[libterralib] 01/24: Imported Upstream version 3.0.3b2
Sebastiaan Couwenberg
sebastic at moszumanska.debian.org
Sat Aug 1 23:04:14 UTC 2015
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch master
in repository libterralib.
commit 3ada99dc384f6b36ebf655001ce1ff70a67b0f91
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Sun Aug 2 00:53:59 2015 +0200
Imported Upstream version 3.0.3b2
---
examples/Debug/ijl15.dll | Bin 0 -> 372736 bytes
examples/Debug/libMySQL.dll | Bin 0 -> 925696 bytes
examples/Debug/libpq.dll | Bin 0 -> 90112 bytes
examples/Debug/oci.dll | Bin 0 -> 97280 bytes
examples/Debug/zlib.dll | Bin 0 -> 65024 bytes
examples/Readme | 96 +
examples/Release/ijl15.dll | Bin 0 -> 372736 bytes
examples/Release/libMySQL.dll | Bin 0 -> 925696 bytes
examples/Release/libpq.dll | Bin 0 -> 90112 bytes
examples/Release/oci.dll | Bin 0 -> 97280 bytes
examples/Release/zlib.dll | Bin 0 -> 65024 bytes
examples/addGeomRepresentation/.cdtproject | 17 +
examples/addGeomRepresentation/.project | 104 +
examples/addGeomRepresentation/Makefile | 23 +
.../addGeomRepresentation.cpp | 96 +
.../addGeomRepresentation.dsp | 114 +
.../addGeomRepresentation.dsw | 89 +
.../addGeomRepresentation.pro | 47 +
examples/convertCoordinates/.cdtproject | 17 +
examples/convertCoordinates/.project | 104 +
examples/convertCoordinates/Makefile | 23 +
examples/convertCoordinates/convertCoordinates.cpp | 68 +
examples/convertCoordinates/convertCoordinates.dsp | 106 +
examples/convertCoordinates/convertCoordinates.dsw | 89 +
examples/convertCoordinates/convertCoordinates.pro | 45 +
examples/copyLayer/.cdtproject | 17 +
examples/copyLayer/.project | 104 +
examples/copyLayer/Makefile | 23 +
examples/copyLayer/copyLayer.cpp | 88 +
examples/copyLayer/copyLayer.dsp | 122 +
examples/copyLayer/copyLayer.dsw | 89 +
examples/copyLayer/copyLayer.pro | 49 +
examples/createDatabase/.cdtproject | 17 +
examples/createDatabase/.project | 104 +
examples/createDatabase/Makefile | 23 +
examples/createDatabase/createDatabase.cpp | 65 +
examples/createDatabase/createDatabase.dsp | 114 +
examples/createDatabase/createDatabase.dsw | 89 +
examples/createDatabase/createDatabase.pro | 47 +
examples/createLayer/.cdtproject | 17 +
examples/createLayer/.project | 104 +
examples/createLayer/Makefile | 23 +
examples/createLayer/createLayer.cpp | 298 +
examples/createLayer/createLayer.dsp | 114 +
examples/createLayer/createLayer.dsw | 89 +
examples/createLayer/createLayer.pro | 47 +
examples/createProximityMatrix/.cdtproject | 17 +
examples/createProximityMatrix/.project | 104 +
examples/createProximityMatrix/Makefile | 23 +
.../createProximityMatrix.cpp | 131 +
.../createProximityMatrix.dsp | 114 +
.../createProximityMatrix.dsw | 89 +
.../createProximityMatrix.pro | 47 +
examples/createSTElementSet/.cdtproject | 17 +
examples/createSTElementSet/.project | 104 +
examples/createSTElementSet/Makefile | 23 +
examples/createSTElementSet/createSTElementSet.cpp | 104 +
examples/createSTElementSet/createSTElementSet.dsp | 114 +
examples/createSTElementSet/createSTElementSet.dsw | 89 +
examples/createSTElementSet/createSTElementSet.pro | 47 +
examples/createSTElementSetFromLayer/.cdtproject | 17 +
examples/createSTElementSetFromLayer/.project | 104 +
examples/createSTElementSetFromLayer/Makefile | 23 +
.../createSTElementSetFromLayer.cpp | 120 +
.../createSTElementSetFromLayer.dsp | 114 +
.../createSTElementSetFromLayer.dsw | 89 +
.../createSTElementSetFromLayer.pro | 47 +
.../createSTElementSetFromShapeFile/.cdtproject | 17 +
examples/createSTElementSetFromShapeFile/.project | 104 +
examples/createSTElementSetFromShapeFile/Makefile | 23 +
.../createSTElementSetFromShapeFile.cpp | 76 +
.../createSTElementSetFromShapeFile.dsp | 130 +
.../createSTElementSetFromShapeFile.dsw | 89 +
.../createSTElementSetFromShapeFile.pro | 51 +
examples/createSTElementSetFromTheme/.cdtproject | 17 +
examples/createSTElementSetFromTheme/.project | 104 +
examples/createSTElementSetFromTheme/Makefile | 23 +
.../createSTElementSetFromTheme.cpp | 147 +
.../createSTElementSetFromTheme.dsp | 114 +
.../createSTElementSetFromTheme.dsw | 89 +
.../createSTElementSetFromTheme.pro | 47 +
examples/createTable/.cdtproject | 17 +
examples/createTable/.project | 104 +
examples/createTable/Makefile | 23 +
examples/createTable/createTable.cpp | 211 +
examples/createTable/createTable.dsp | 114 +
examples/createTable/createTable.dsw | 89 +
examples/createTable/createTable.pro | 47 +
examples/createTheme/.cdtproject | 17 +
examples/createTheme/.project | 104 +
examples/createTheme/Makefile | 23 +
examples/createTheme/createTheme.cpp | 184 +
examples/createTheme/createTheme.dsp | 114 +
examples/createTheme/createTheme.dsw | 89 +
examples/createTheme/createTheme.pro | 47 +
examples/data/BairrosPoA.dbf | Bin 0 -> 17703 bytes
examples/data/BairrosPoA.shp | Bin 0 -> 135372 bytes
examples/data/BairrosPoA.shx | Bin 0 -> 828 bytes
examples/data/BairrosRecife.mid | 94 +
examples/data/BairrosRecife.mif | 13886 +++++++
examples/data/BairrosRecife2.csv | 94 +
examples/data/Cadastro_Escolas.geo | 201 +
examples/data/Cadastro_Escolas.tab | 237 +
examples/data/Distritos.mid | 96 +
examples/data/Distritos.mif | 41096 +++++++++++++++++++
examples/data/EstadosBrasil.dbf | Bin 0 -> 6321 bytes
examples/data/EstadosBrasil.shp | Bin 0 -> 150948 bytes
examples/data/EstadosBrasil.shx | Bin 0 -> 316 bytes
examples/data/OcorrenciasPoA.dbf | Bin 0 -> 1340978 bytes
examples/data/OcorrenciasPoA.shp | Bin 0 -> 89252 bytes
examples/data/OcorrenciasPoA.shx | Bin 0 -> 25572 bytes
examples/data/SOCEC.dbf | Bin 0 -> 24106 bytes
examples/data/cities.dbf | Bin 0 -> 3366 bytes
examples/data/cities.shp | Bin 0 -> 1108 bytes
examples/data/cities.shx | Bin 0 -> 388 bytes
examples/data/elevation.raw | Bin 0 -> 644816 bytes
examples/data/nat1.tif | Bin 0 -> 1219306 bytes
examples/data/nat2.tif | Bin 0 -> 1104932 bytes
examples/data/rivers.dbf | Bin 0 -> 2528 bytes
examples/data/rivers.shp | Bin 0 -> 20208 bytes
examples/data/rivers.shx | Bin 0 -> 340 bytes
examples/data/sampa.jpg | Bin 0 -> 165574 bytes
examples/data/states.dbf | Bin 0 -> 4034 bytes
examples/data/states.shp | Bin 0 -> 51924 bytes
examples/data/states.shx | Bin 0 -> 356 bytes
examples/databaseQuery/.cdtproject | 17 +
examples/databaseQuery/.project | 104 +
examples/databaseQuery/Makefile | 23 +
examples/databaseQuery/databaseQuery.cpp | 141 +
examples/databaseQuery/databaseQuery.dsp | 114 +
examples/databaseQuery/databaseQuery.dsw | 89 +
examples/databaseQuery/databaseQuery.pro | 47 +
examples/databaseSQLQuery/.cdtproject | 17 +
examples/databaseSQLQuery/.project | 104 +
examples/databaseSQLQuery/Makefile | 23 +
examples/databaseSQLQuery/databaseSQLQuery.cpp | 138 +
examples/databaseSQLQuery/databaseSQLQuery.dsp | 114 +
examples/databaseSQLQuery/databaseSQLQuery.dsw | 89 +
examples/databaseSQLQuery/databaseSQLQuery.pro | 47 +
examples/importCSV/.cdtproject | 17 +
examples/importCSV/.project | 104 +
examples/importCSV/Makefile | 23 +
examples/importCSV/importCSV.cpp | 181 +
examples/importCSV/importCSV.dsp | 126 +
examples/importCSV/importCSV.dsw | 89 +
examples/importCSV/importCSV.pro | 50 +
examples/importDBF/.cdtproject | 17 +
examples/importDBF/.project | 104 +
examples/importDBF/Makefile | 23 +
examples/importDBF/importDBF.cpp | 91 +
examples/importDBF/importDBF.dsp | 122 +
examples/importDBF/importDBF.dsw | 89 +
examples/importDBF/importDBF.pro | 49 +
examples/importGeoTab/.cdtproject | 17 +
examples/importGeoTab/.project | 104 +
examples/importGeoTab/Makefile | 23 +
examples/importGeoTab/importGeoTab.cpp | 112 +
examples/importGeoTab/importGeoTab.dsp | 122 +
examples/importGeoTab/importGeoTab.dsw | 89 +
examples/importGeoTab/importGeoTab.pro | 49 +
examples/importGridData/.cdtproject | 17 +
examples/importGridData/.project | 104 +
examples/importGridData/Makefile | 23 +
examples/importGridData/importGridData.cpp | 119 +
examples/importGridData/importGridData.dsp | 114 +
examples/importGridData/importGridData.dsw | 89 +
examples/importGridData/importGridData.pro | 47 +
examples/importJPEG/.cdtproject | 17 +
examples/importJPEG/.project | 104 +
examples/importJPEG/Makefile | 23 +
examples/importJPEG/importJPEG.cpp | 109 +
examples/importJPEG/importJPEG.dsp | 114 +
examples/importJPEG/importJPEG.dsw | 89 +
examples/importJPEG/importJPEG.pro | 47 +
examples/importMIDMIF/.cdtproject | 17 +
examples/importMIDMIF/.project | 104 +
examples/importMIDMIF/Makefile | 23 +
examples/importMIDMIF/importMIDMIF.cpp | 111 +
examples/importMIDMIF/importMIDMIF.dsp | 134 +
examples/importMIDMIF/importMIDMIF.dsw | 89 +
examples/importMIDMIF/importMIDMIF.pro | 52 +
examples/importShape/.cdtproject | 17 +
examples/importShape/.project | 104 +
examples/importShape/Makefile | 23 +
examples/importShape/importShape.cpp | 90 +
examples/importShape/importShape.dsp | 126 +
examples/importShape/importShape.dsw | 89 +
examples/importShape/importShape.pro | 50 +
examples/mosaicTIFFImages/.cdtproject | 17 +
examples/mosaicTIFFImages/.project | 104 +
examples/mosaicTIFFImages/Makefile | 23 +
examples/mosaicTIFFImages/mosaicTIFFImages.cpp | 133 +
examples/mosaicTIFFImages/mosaicTIFFImages.dsp | 114 +
examples/mosaicTIFFImages/mosaicTIFFImages.dsw | 29 +
examples/mosaicTIFFImages/mosaicTIFFImages.pro | 47 +
.../proxMatrixAndSpatialStatistics/.cdtproject | 17 +
examples/proxMatrixAndSpatialStatistics/.project | 104 +
examples/proxMatrixAndSpatialStatistics/Makefile | 23 +
.../proxMatrixAndSpatialStatistics.cpp | 164 +
.../proxMatrixAndSpatialStatistics.dsp | 122 +
.../proxMatrixAndSpatialStatistics.dsw | 89 +
.../proxMatrixAndSpatialStatistics.pro | 47 +
examples/querierFromLayer/.cdtproject | 17 +
examples/querierFromLayer/.project | 104 +
examples/querierFromLayer/Makefile | 23 +
examples/querierFromLayer/querierFromLayer.cpp | 117 +
examples/querierFromLayer/querierFromLayer.dsp | 114 +
examples/querierFromLayer/querierFromLayer.dsw | 89 +
examples/querierFromLayer/querierFromLayer.pro | 47 +
examples/querierFromTheme/.cdtproject | 17 +
examples/querierFromTheme/.project | 104 +
examples/querierFromTheme/Makefile | 23 +
examples/querierFromTheme/querierFromTheme.cpp | 137 +
examples/querierFromTheme/querierFromTheme.dsp | 114 +
examples/querierFromTheme/querierFromTheme.dsw | 89 +
examples/querierFromTheme/querierFromTheme.pro | 47 +
examples/querierGroupChronon/.cdtproject | 17 +
examples/querierGroupChronon/.project | 104 +
examples/querierGroupChronon/Makefile | 23 +
.../querierGroupChronon/querierGroupChronon.cpp | 141 +
.../querierGroupChronon/querierGroupChronon.dsp | 114 +
.../querierGroupChronon/querierGroupChronon.dsw | 89 +
.../querierGroupChronon/querierGroupChronon.pro | 47 +
examples/querierGroupElement/.cdtproject | 17 +
examples/querierGroupElement/.project | 104 +
examples/querierGroupElement/Makefile | 23 +
.../querierGroupElement/querierGroupElement.cpp | 123 +
.../querierGroupElement/querierGroupElement.dsp | 114 +
.../querierGroupElement/querierGroupElement.dsw | 89 +
.../querierGroupElement/querierGroupElement.pro | 47 +
examples/querierGroupSpatialRest/.cdtproject | 17 +
examples/querierGroupSpatialRest/.project | 104 +
examples/querierGroupSpatialRest/Makefile | 23 +
.../querierGroupSpatialRest.cpp | 163 +
.../querierGroupSpatialRest.dsp | 114 +
.../querierGroupSpatialRest.dsw | 89 +
.../querierGroupSpatialRest.pro | 47 +
examples/querierWithSpatialRestBox/.cdtproject | 17 +
examples/querierWithSpatialRestBox/.project | 104 +
examples/querierWithSpatialRestBox/Makefile | 23 +
.../querierWithSpatialRestBox.cpp | 117 +
.../querierWithSpatialRestBox.dsp | 114 +
.../querierWithSpatialRestBox.dsw | 89 +
.../querierWithSpatialRestBox.pro | 47 +
.../querierWithSpatialRestGeometry/.cdtproject | 17 +
examples/querierWithSpatialRestGeometry/.project | 104 +
examples/querierWithSpatialRestGeometry/Makefile | 23 +
.../querierWithSpatialRestGeometry.cpp | 152 +
.../querierWithSpatialRestGeometry.dsp | 114 +
.../querierWithSpatialRestGeometry.dsw | 89 +
.../querierWithSpatialRestGeometry.pro | 47 +
examples/rasterSlicing/.cdtproject | 17 +
examples/rasterSlicing/.project | 104 +
examples/rasterSlicing/Makefile | 23 +
examples/rasterSlicing/rasterSlicing.cpp | 204 +
examples/rasterSlicing/rasterSlicing.dsp | 114 +
examples/rasterSlicing/rasterSlicing.dsw | 29 +
examples/rasterSlicing/rasterSlicing.pro | 47 +
examples/spatialQuery/.cdtproject | 17 +
examples/spatialQuery/.project | 104 +
examples/spatialQuery/Makefile | 23 +
examples/spatialQuery/spatialQuery.cpp | 185 +
examples/spatialQuery/spatialQuery.dsp | 126 +
examples/spatialQuery/spatialQuery.dsw | 89 +
examples/spatialQuery/spatialQuery.pro | 50 +
examples/spatialQueryAndBuffer/.cdtproject | 17 +
examples/spatialQueryAndBuffer/.project | 104 +
examples/spatialQueryAndBuffer/Makefile | 23 +
.../spatialQueryAndBuffer.cpp | 114 +
.../spatialQueryAndBuffer.dsp | 126 +
.../spatialQueryAndBuffer.dsw | 89 +
.../spatialQueryAndBuffer.pro | 50 +
examples/themeGrouping/.cdtproject | 17 +
examples/themeGrouping/.project | 104 +
examples/themeGrouping/Makefile | 23 +
examples/themeGrouping/themeGrouping.cpp | 113 +
examples/themeGrouping/themeGrouping.dsp | 114 +
examples/themeGrouping/themeGrouping.dsw | 89 +
examples/themeGrouping/themeGrouping.pro | 47 +
src/STLport/BC50/README | 8 +
src/STLport/BC50/algorith.h | 21 +
src/STLport/BC50/alloc.h | 31 +
src/STLport/BC50/bak/stddef.h | 21 +
src/STLport/BC50/bak/stdlib.h | 16 +
src/STLport/BC50/bitset.h | 21 +
src/STLport/BC50/cassert.h | 21 +
src/STLport/BC50/cctype.h | 21 +
src/STLport/BC50/cerrno.h | 21 +
src/STLport/BC50/cfloat.h | 21 +
src/STLport/BC50/climits.h | 21 +
src/STLport/BC50/clocale.h | 21 +
src/STLport/BC50/cmath.h | 21 +
src/STLport/BC50/complex.h | 31 +
src/STLport/BC50/csetjmp.h | 21 +
src/STLport/BC50/csignal.h | 21 +
src/STLport/BC50/cstdarg.h | 21 +
src/STLport/BC50/cstddef.h | 21 +
src/STLport/BC50/cstdio.h | 21 +
src/STLport/BC50/cstdlib.h | 16 +
src/STLport/BC50/cstring.h | 19 +
src/STLport/BC50/ctime.h | 21 +
src/STLport/BC50/cwchar.h | 21 +
src/STLport/BC50/cwctype.h | 21 +
src/STLport/BC50/deque.h | 21 +
src/STLport/BC50/exceptio.h | 21 +
src/STLport/BC50/fstream.h | 21 +
src/STLport/BC50/function.h | 21 +
src/STLport/BC50/hash_map.h | 21 +
src/STLport/BC50/hash_set.h | 21 +
src/STLport/BC50/iomanip.h | 21 +
src/STLport/BC50/ios.h | 21 +
src/STLport/BC50/iosfwd.h | 21 +
src/STLport/BC50/iostream.h | 21 +
src/STLport/BC50/istream.h | 21 +
src/STLport/BC50/iterator.h | 21 +
src/STLport/BC50/limits.h | 32 +
src/STLport/BC50/list.h | 21 +
src/STLport/BC50/locale.h | 30 +
src/STLport/BC50/make_bc50.sh | 12 +
src/STLport/BC50/map.h | 21 +
src/STLport/BC50/memory.h | 33 +
src/STLport/BC50/numeric.h | 21 +
src/STLport/BC50/ostream.h | 21 +
src/STLport/BC50/pthread_alloc.h | 21 +
src/STLport/BC50/queue.h | 21 +
src/STLport/BC50/rope.h | 21 +
src/STLport/BC50/set.h | 21 +
src/STLport/BC50/slist.h | 21 +
src/STLport/BC50/sstream.h | 21 +
src/STLport/BC50/stack.h | 21 +
src/STLport/BC50/stdexcep.h | 21 +
src/STLport/BC50/stl_tmpl.h | 21 +
src/STLport/BC50/streambu.h | 21 +
src/STLport/BC50/streambuf.h | 31 +
src/STLport/BC50/string.h | 33 +
src/STLport/BC50/strstrea.h | 21 +
src/STLport/BC50/typeinfo.h | 21 +
src/STLport/BC50/using/cstring.h | 54 +
src/STLport/BC50/using/fstream.h | 19 +
src/STLport/BC50/using/iomanip.h | 6 +
src/STLport/BC50/using/ios.h | 41 +
src/STLport/BC50/using/iosfwd.h | 54 +
src/STLport/BC50/using/iostream.h | 11 +
src/STLport/BC50/using/istream.h | 15 +
src/STLport/BC50/using/locale.h | 62 +
src/STLport/BC50/using/ostream.h | 10 +
src/STLport/BC50/using/sstream.h | 16 +
src/STLport/BC50/using/streambuf.h | 5 +
src/STLport/BC50/using/strstream.h | 4 +
src/STLport/BC50/utility.h | 21 +
src/STLport/BC50/valarray.h | 21 +
src/STLport/BC50/vector.h | 21 +
src/STLport/algorithm | 60 +
src/STLport/bitset | 64 +
src/STLport/cassert | 34 +
src/STLport/cctype | 78 +
src/STLport/cerrno | 49 +
src/STLport/cfloat | 41 +
src/STLport/climits | 46 +
src/STLport/clocale | 49 +
src/STLport/cmath | 93 +
src/STLport/complex | 52 +
src/STLport/config/_epilog.h | 33 +
src/STLport/config/_msvc_warnings_off.h | 20 +
src/STLport/config/_prolog.h | 46 +
src/STLport/config/new_compiler/README | 12 +
src/STLport/config/new_compiler/configure | 3644 ++
src/STLport/config/new_compiler/configure.in | 1424 +
src/STLport/config/new_compiler/stlconf.h.in | 133 +
src/STLport/config/new_compiler/unconfigure | 3 +
src/STLport/config/stl_apcc.h | 32 +
src/STLport/config/stl_apple.h | 112 +
src/STLport/config/stl_as400.h | 60 +
src/STLport/config/stl_bc.h | 204 +
src/STLport/config/stl_como.h | 209 +
src/STLport/config/stl_confix.h | 78 +
src/STLport/config/stl_cray.h | 68 +
src/STLport/config/stl_dec.h | 110 +
src/STLport/config/stl_dec_vms.h | 96 +
src/STLport/config/stl_dm.h | 225 +
src/STLport/config/stl_fujitsu.h | 5 +
src/STLport/config/stl_gcc.h | 376 +
src/STLport/config/stl_hpacc.h | 218 +
src/STLport/config/stl_ibm.h | 139 +
src/STLport/config/stl_icc.h | 49 +
src/STLport/config/stl_intel.h | 14 +
src/STLport/config/stl_kai.h | 58 +
src/STLport/config/stl_mlc.h | 8 +
src/STLport/config/stl_msvc.h | 208 +
src/STLport/config/stl_mwerks.h | 140 +
src/STLport/config/stl_mycomp.h | 268 +
src/STLport/config/stl_sco.h | 35 +
src/STLport/config/stl_select_lib.h | 36 +
src/STLport/config/stl_sgi.h | 94 +
src/STLport/config/stl_solaris.h | 35 +
src/STLport/config/stl_sunpro.h | 175 +
src/STLport/config/stl_symantec.h | 42 +
src/STLport/config/stl_watcom.h | 152 +
src/STLport/config/stl_wince.h | 188 +
src/STLport/config/stlcomp.h | 122 +
src/STLport/config/vc_select_lib.h | 35 +
src/STLport/csetjmp | 54 +
src/STLport/csignal | 49 +
src/STLport/cstdarg | 45 +
src/STLport/cstddef | 58 +
src/STLport/cstdio | 134 +
src/STLport/cstdlib | 114 +
src/STLport/cstring | 45 +
src/STLport/ctime | 58 +
src/STLport/ctype.h | 36 +
src/STLport/cwchar | 250 +
src/STLport/cwctype | 81 +
src/STLport/deque | 55 +
src/STLport/exception | 188 +
src/STLport/exception.h | 46 +
src/STLport/export | 85 +
src/STLport/export.sun | 48 +
src/STLport/fstream | 61 +
src/STLport/fstream.h | 57 +
src/STLport/functional | 48 +
src/STLport/hash_map | 42 +
src/STLport/hash_set | 42 +
src/STLport/iomanip | 194 +
src/STLport/iomanip.h | 69 +
src/STLport/ios | 46 +
src/STLport/ios.h | 57 +
src/STLport/iosfwd | 62 +
src/STLport/iostream | 97 +
src/STLport/iostream.h | 119 +
src/STLport/istream | 53 +
src/STLport/istream.h | 63 +
src/STLport/iterator | 59 +
src/STLport/limits | 44 +
src/STLport/list | 55 +
src/STLport/locale | 168 +
src/STLport/locale.h | 35 +
src/STLport/map | 53 +
src/STLport/math.h | 46 +
src/STLport/mem.h | 51 +
src/STLport/memory | 70 +
src/STLport/mmemory.h | 1 +
src/STLport/new | 54 +
src/STLport/new.h | 48 +
src/STLport/numeric | 50 +
src/STLport/old_hp/algo.h | 146 +
src/STLport/old_hp/algobase.h | 97 +
src/STLport/old_hp/alloc.h | 103 +
src/STLport/old_hp/bvector.h | 68 +
src/STLport/old_hp/defalloc.h | 87 +
src/STLport/old_hp/deque.h | 68 +
src/STLport/old_hp/export | 27 +
src/STLport/old_hp/function.h | 126 +
src/STLport/old_hp/hash_map.h | 62 +
src/STLport/old_hp/hash_set.h | 58 +
src/STLport/old_hp/hashtable.h | 70 +
src/STLport/old_hp/heap.h | 58 +
src/STLport/old_hp/iterator.h | 147 +
src/STLport/old_hp/list.h | 62 +
src/STLport/old_hp/map.h | 60 +
src/STLport/old_hp/multimap.h | 58 +
src/STLport/old_hp/multiset.h | 58 +
src/STLport/old_hp/numeric.h | 25 +
src/STLport/old_hp/pair.h | 59 +
src/STLport/old_hp/pthread_alloc.h | 57 +
src/STLport/old_hp/queue.h | 23 +
src/STLport/old_hp/rope.h | 50 +
src/STLport/old_hp/set.h | 57 +
src/STLport/old_hp/slist.h | 57 +
src/STLport/old_hp/stack.h | 73 +
src/STLport/old_hp/tempbuf.h | 79 +
src/STLport/old_hp/tree.h | 60 +
src/STLport/old_hp/vector.h | 65 +
src/STLport/ostream | 49 +
src/STLport/ostream.h | 53 +
src/STLport/pthread.h | 39 +
src/STLport/pthread_alloc | 49 +
src/STLport/queue | 55 +
src/STLport/rlocks.h | 11 +
src/STLport/rope | 37 +
src/STLport/set | 53 +
src/STLport/setjmp.h | 38 +
src/STLport/signal.h | 35 +
src/STLport/slist | 44 +
src/STLport/sstream | 54 +
src/STLport/stack | 55 +
src/STLport/stdarg.h | 35 +
src/STLport/stddef.h | 37 +
src/STLport/stdexcept | 180 +
src/STLport/stdio.h | 47 +
src/STLport/stdio_streambuf | 121 +
src/STLport/stdiostream.h | 10 +
src/STLport/stdlib.h | 35 +
src/STLport/stl/_abbrevs.h | 70 +
src/STLport/stl/_algo.c | 1765 +
src/STLport/stl/_algo.h | 740 +
src/STLport/stl/_algobase.c | 392 +
src/STLport/stl/_algobase.h | 583 +
src/STLport/stl/_alloc.c | 370 +
src/STLport/stl/_alloc.h | 531 +
src/STLport/stl/_alloc_old.h | 303 +
src/STLport/stl/_auto_ptr.h | 129 +
src/STLport/stl/_bitset.c | 407 +
src/STLport/stl/_bitset.h | 768 +
src/STLport/stl/_bvector.h | 807 +
src/STLport/stl/_check_config.h | 37 +
src/STLport/stl/_cmath.h | 208 +
src/STLport/stl/_codecvt.h | 307 +
src/STLport/stl/_collate.h | 182 +
src/STLport/stl/_complex.c | 169 +
src/STLport/stl/_complex.h | 969 +
src/STLport/stl/_config.h | 1064 +
src/STLport/stl/_config_compat.h | 89 +
src/STLport/stl/_config_compat_post.h | 35 +
src/STLport/stl/_construct.h | 167 +
src/STLport/stl/_ctraits_fns.h | 95 +
src/STLport/stl/_ctype.h | 269 +
src/STLport/stl/_cwchar.h | 112 +
src/STLport/stl/_deque.c | 676 +
src/STLport/stl/_deque.h | 953 +
src/STLport/stl/_epilog.h | 44 +
src/STLport/stl/_exception.h | 0
src/STLport/stl/_fstream.c | 749 +
src/STLport/stl/_fstream.h | 741 +
src/STLport/stl/_function.h | 371 +
src/STLport/stl/_function_adaptors.h | 802 +
src/STLport/stl/_function_base.h | 226 +
src/STLport/stl/_hash_fun.h | 107 +
src/STLport/stl/_hash_map.h | 468 +
src/STLport/stl/_hash_set.h | 470 +
src/STLport/stl/_hashtable.c | 468 +
src/STLport/stl/_hashtable.h | 613 +
src/STLport/stl/_heap.c | 242 +
src/STLport/stl/_heap.h | 129 +
src/STLport/stl/_ios.c | 127 +
src/STLport/stl/_ios.h | 199 +
src/STLport/stl/_ios_base.h | 403 +
src/STLport/stl/_iosfwd.h | 159 +
src/STLport/stl/_istream.c | 1430 +
src/STLport/stl/_istream.h | 344 +
src/STLport/stl/_istreambuf_iterator.h | 167 +
src/STLport/stl/_iterator.h | 269 +
src/STLport/stl/_iterator_base.h | 463 +
src/STLport/stl/_iterator_old.h | 351 +
src/STLport/stl/_limits.c | 293 +
src/STLport/stl/_limits.h | 557 +
src/STLport/stl/_list.c | 210 +
src/STLport/stl/_list.h | 575 +
src/STLport/stl/_locale.h | 233 +
src/STLport/stl/_map.h | 411 +
src/STLport/stl/_messages_facets.h | 168 +
src/STLport/stl/_monetary.c | 527 +
src/STLport/stl/_monetary.h | 463 +
src/STLport/stl/_new.h | 93 +
src/STLport/stl/_null_stream.h | 42 +
src/STLport/stl/_num_get.c | 671 +
src/STLport/stl/_num_get.h | 259 +
src/STLport/stl/_num_put.c | 553 +
src/STLport/stl/_num_put.h | 186 +
src/STLport/stl/_numeric.c | 104 +
src/STLport/stl/_numeric.h | 186 +
src/STLport/stl/_numpunct.h | 170 +
src/STLport/stl/_ostream.c | 382 +
src/STLport/stl/_ostream.h | 356 +
src/STLport/stl/_ostreambuf_iterator.h | 97 +
src/STLport/stl/_pair.h | 161 +
src/STLport/stl/_prolog.h | 17 +
src/STLport/stl/_pthread_alloc.c | 262 +
src/STLport/stl/_pthread_alloc.h | 489 +
src/STLport/stl/_ptrs_specialize.h | 72 +
src/STLport/stl/_queue.h | 212 +
src/STLport/stl/_range_errors.h | 97 +
src/STLport/stl/_raw_storage_iter.h | 82 +
src/STLport/stl/_relops.h | 33 +
src/STLport/stl/_relops_cont.h | 29 +
src/STLport/stl/_relops_hash_cont.h | 32 +
src/STLport/stl/_relops_template.h | 1 +
src/STLport/stl/_rope.c | 1540 +
src/STLport/stl/_rope.h | 2518 ++
src/STLport/stl/_set.h | 372 +
src/STLport/stl/_site_config.h | 194 +
src/STLport/stl/_slist.c | 179 +
src/STLport/stl/_slist.h | 741 +
src/STLport/stl/_slist_base.c | 109 +
src/STLport/stl/_slist_base.h | 87 +
src/STLport/stl/_sparc_atomic.h | 60 +
src/STLport/stl/_sstream.c | 543 +
src/STLport/stl/_sstream.h | 252 +
src/STLport/stl/_stack.h | 105 +
src/STLport/stl/_stdio_file.h | 758 +
src/STLport/stl/_stream_iterator.h | 343 +
src/STLport/stl/_streambuf.c | 216 +
src/STLport/stl/_streambuf.h | 526 +
src/STLport/stl/_streambuf_iterator.h | 83 +
src/STLport/stl/_string.c | 580 +
src/STLport/stl/_string.h | 1501 +
src/STLport/stl/_string_fwd.c | 48 +
src/STLport/stl/_string_fwd.h | 61 +
src/STLport/stl/_string_hash.h | 70 +
src/STLport/stl/_string_io.c | 334 +
src/STLport/stl/_string_io.h | 122 +
src/STLport/stl/_strstream.h | 141 +
src/STLport/stl/_tempbuf.c | 57 +
src/STLport/stl/_tempbuf.h | 165 +
src/STLport/stl/_threads.c | 172 +
src/STLport/stl/_threads.h | 721 +
src/STLport/stl/_time_facets.c | 497 +
src/STLport/stl/_time_facets.h | 315 +
src/STLport/stl/_tree.c | 715 +
src/STLport/stl/_tree.h | 622 +
src/STLport/stl/_uninitialized.h | 287 +
src/STLport/stl/_valarray.c | 197 +
src/STLport/stl/_valarray.h | 1657 +
src/STLport/stl/_vector.c | 137 +
src/STLport/stl/_vector.h | 591 +
src/STLport/stl/c_locale.h | 436 +
src/STLport/stl/char_traits.h | 266 +
src/STLport/stl/concept_checks.h | 810 +
src/STLport/stl/debug/_debug.c | 490 +
src/STLport/stl/debug/_debug.h | 426 +
src/STLport/stl/debug/_deque.h | 281 +
src/STLport/stl/debug/_hashtable.h | 261 +
src/STLport/stl/debug/_iterator.h | 394 +
src/STLport/stl/debug/_list.h | 318 +
src/STLport/stl/debug/_relops_cont.h | 41 +
src/STLport/stl/debug/_relops_hash_cont.h | 34 +
src/STLport/stl/debug/_slist.h | 399 +
src/STLport/stl/debug/_string.h | 772 +
src/STLport/stl/debug/_tree.h | 249 +
src/STLport/stl/debug/_vector.h | 300 +
src/STLport/stl/msl_string.h | 42 +
src/STLport/stl/type_traits.h | 418 +
src/STLport/stl/wrappers/_deque.h | 76 +
src/STLport/stl/wrappers/_hash_map.h | 147 +
src/STLport/stl/wrappers/_hash_set.h | 150 +
src/STLport/stl/wrappers/_list.h | 86 +
src/STLport/stl/wrappers/_map.h | 150 +
src/STLport/stl/wrappers/_mmap.h | 46 +
src/STLport/stl/wrappers/_set.h | 141 +
src/STLport/stl/wrappers/_slist.h | 83 +
src/STLport/stl/wrappers/_vector.h | 89 +
src/STLport/stl_user_config.h | 202 +
src/STLport/streambuf | 45 +
src/STLport/streambuf.h | 63 +
src/STLport/string | 62 +
src/STLport/string.h | 39 +
src/STLport/strstream | 59 +
src/STLport/strstream.h | 75 +
src/STLport/time.h | 35 +
src/STLport/typeinfo | 86 +
src/STLport/typeinfo.h | 62 +
src/STLport/using/cstring | 54 +
src/STLport/using/export | 12 +
src/STLport/using/fstream | 19 +
src/STLport/using/h/fstream.h | 4 +
src/STLport/using/h/iomanip.h | 6 +
src/STLport/using/h/iostream.h | 24 +
src/STLport/using/h/ostream.h | 6 +
src/STLport/using/h/streambuf.h | 1 +
src/STLport/using/h/strstream.h | 4 +
src/STLport/using/iomanip | 6 +
src/STLport/using/ios | 41 +
src/STLport/using/iosfwd | 54 +
src/STLport/using/iostream | 14 +
src/STLport/using/istream | 16 +
src/STLport/using/locale | 65 +
src/STLport/using/ostream | 10 +
src/STLport/using/sstream | 16 +
src/STLport/using/streambuf | 5 +
src/STLport/using/strstream | 4 +
src/STLport/utility | 65 +
src/STLport/valarray | 47 +
src/STLport/vector | 57 +
src/STLport/wchar.h | 50 +
src/STLport/wctype.h | 35 +
src/STLport/wrap_std/complex | 49 +
src/STLport/wrap_std/export | 13 +
src/STLport/wrap_std/fstream | 25 +
src/STLport/wrap_std/h/fstream.h | 7 +
src/STLport/wrap_std/h/iostream.h | 11 +
src/STLport/wrap_std/h/streambuf.h | 9 +
src/STLport/wrap_std/h/strstream.h | 31 +
src/STLport/wrap_std/iomanip | 40 +
src/STLport/wrap_std/ios | 29 +
src/STLport/wrap_std/iosfwd | 94 +
src/STLport/wrap_std/iostream | 35 +
src/STLport/wrap_std/istream | 47 +
src/STLport/wrap_std/locale | 30 +
src/STLport/wrap_std/ostream | 44 +
src/STLport/wrap_std/sstream | 25 +
src/STLport/wrap_std/streambuf | 30 +
src/STLport/wrap_std/strstream | 27 +
src/shapelib/dbfopen.c | 1542 +
src/shapelib/shapefil.h | 496 +
src/shapelib/shpopen.c | 1872 +
src/terralib/PDI/.cvsignore | 1 +
src/terralib/PDI/Doxyfile | 214 +
src/terralib/PDI/PDI.pro | 8 +
src/terralib/PDI/bin/.cvsignore | 0
src/terralib/PDI/bin/dynamic/.cvsignore | 1 +
src/terralib/PDI/bin/static/.cvsignore | 1 +
src/terralib/PDI/docs/.cvsignore | 1 +
src/terralib/PDI/source/.cvsignore | 2 +
src/terralib/PDI/source/TePDIAgnostic.cpp | 13 +
src/terralib/PDI/source/TePDIAgnostic.hpp | 257 +
src/terralib/PDI/source/TePDIAlgorithm.cpp | 42 +
src/terralib/PDI/source/TePDIAlgorithm.hpp | 106 +
src/terralib/PDI/source/TePDIBox.cpp | 37 +
src/terralib/PDI/source/TePDIBox.hpp | 77 +
src/terralib/PDI/source/TePDIContrast.cpp | 879 +
src/terralib/PDI/source/TePDIContrast.hpp | 278 +
src/terralib/PDI/source/TePDIFilter.cpp | 17 +
src/terralib/PDI/source/TePDIFilter.hpp | 85 +
src/terralib/PDI/source/TePDIFilterMask.cpp | 17 +
src/terralib/PDI/source/TePDIFilterMask.hpp | 53 +
src/terralib/PDI/source/TePDILinearFilter.cpp | 90 +
src/terralib/PDI/source/TePDILinearFilter.hpp | 86 +
src/terralib/PDI/source/TePDIParameters.cpp | 313 +
src/terralib/PDI/source/TePDIParameters.hpp | 306 +
src/terralib/PDI/source/TePDIRgbPalette.cpp | 194 +
src/terralib/PDI/source/TePDIRgbPalette.hpp | 238 +
src/terralib/PDI/source/TePDISharedPtr.cpp | 146 +
src/terralib/PDI/source/TePDISharedPtr.hpp | 142 +
src/terralib/PDI/source/TePDITypes.hpp | 84 +
src/terralib/PDI/source/TePDIUtils.cpp | 284 +
src/terralib/PDI/source/TePDIUtils.hpp | 132 +
src/terralib/PDI/source/projects/.cvsignore | 2 +
src/terralib/PDI/source/projects/base/.cvsignore | 4 +
src/terralib/PDI/source/projects/base/base.pro | 52 +
.../PDI/source/projects/dynamic/.cvsignore | 4 +
.../PDI/source/projects/dynamic/dynamic.pro | 17 +
src/terralib/PDI/source/projects/projects.pro | 6 +
src/terralib/PDI/source/projects/static/.cvsignore | 4 +
src/terralib/PDI/source/projects/static/static.pro | 17 +
src/terralib/PDI/source/source.pro | 6 +
src/terralib/PDI/tests/.cvsignore | 1 +
src/terralib/PDI/tests/bin/.cvsignore | 3 +
src/terralib/PDI/tests/resources/.cvsignore | 1 +
src/terralib/PDI/tests/resources/cbers_b2_crop.tif | Bin 0 -> 721734 bytes
src/terralib/PDI/tests/source/.cvsignore | 2 +
.../PDI/tests/source/TePDIContrast/.cvsignore | 3 +
.../tests/source/TePDIContrast/TePDIContrast.pro | 7 +
.../source/TePDIContrast/TePDIContrast_test.cpp | 346 +
.../PDI/tests/source/TePDIParameters/.cvsignore | 3 +
.../source/TePDIParameters/TePDIParameters.pro | 6 +
.../TePDIParameters/TePDIParameters_test.cpp | 103 +
.../PDI/tests/source/TePDISharedPtr/.cvsignore | 3 +
.../tests/source/TePDISharedPtr/TePDISharedPtr.pro | 7 +
.../source/TePDISharedPtr/TePDISharedPtr_test.cpp | 65 +
.../PDI/tests/source/TePDIUtils/.cvsignore | 3 +
.../PDI/tests/source/TePDIUtils/TePDIUtils.pro | 10 +
.../tests/source/TePDIUtils/TePDIUtils_test.cpp | 119 +
src/terralib/PDI/tests/source/base/.cvsignore | 2 +
src/terralib/PDI/tests/source/base/base.pro | 27 +
src/terralib/PDI/tests/source/source.pro | 10 +
src/terralib/PDI/tests/tests.pro | 7 +
src/terralib/application/TeApplicationUtils.cpp | 409 +
src/terralib/application/TeApplicationUtils.h | 102 +
src/terralib/application/TeColorUtils.cpp | 198 +
src/terralib/application/TeColorUtils.h | 58 +
src/terralib/application/TeDatabaseUtils.cpp | 3269 ++
src/terralib/application/TeDatabaseUtils.h | 179 +
src/terralib/application/TeGUIUtils.cpp | 141 +
src/terralib/application/TeGUIUtils.h | 42 +
src/terralib/application/TeMSVFactory.cpp | 163 +
src/terralib/application/TeMSVFactory.h | 192 +
src/terralib/application/TePlotTheme.h | 2155 +
src/terralib/application/TePlotView.h | 41 +
src/terralib/application/TeSemivarModelFactory.cpp | 198 +
src/terralib/application/TeSemivarModelFactory.h | 153 +
src/terralib/application/TeThemeApplication.cpp | 345 +
src/terralib/application/TeThemeApplication.h | 314 +
src/terralib/application/TeUpdateDBVersion.cpp | 545 +
src/terralib/application/TeUpdateDBVersion.h | 46 +
src/terralib/application/qt/TeDecoderQtImage.cpp | 102 +
src/terralib/application/qt/TeDecoderQtImage.h | 61 +
.../application/qt/TeInitRasterQtDecoder.cpp | 11 +
src/terralib/application/qt/TeQtAnimaThread.cpp | 117 +
src/terralib/application/qt/TeQtAnimaThread.h | 48 +
src/terralib/application/qt/TeQtBasicCanvas.cpp | 2428 ++
src/terralib/application/qt/TeQtBasicCanvas.h | 280 +
src/terralib/application/qt/TeQtCanvas.cpp | 625 +
src/terralib/application/qt/TeQtCanvas.h | 118 +
src/terralib/application/qt/TeQtChartItem.cpp | 87 +
src/terralib/application/qt/TeQtChartItem.h | 63 +
src/terralib/application/qt/TeQtCheckListItem.cpp | 95 +
src/terralib/application/qt/TeQtCheckListItem.h | 72 +
src/terralib/application/qt/TeQtDatabaseItem.cpp | 40 +
src/terralib/application/qt/TeQtDatabaseItem.h | 51 +
.../application/qt/TeQtDatabasesListView.cpp | 270 +
.../application/qt/TeQtDatabasesListView.h | 92 +
src/terralib/application/qt/TeQtGraph.cpp | 284 +
src/terralib/application/qt/TeQtGraph.h | 83 +
src/terralib/application/qt/TeQtGrid.cpp | 2765 ++
src/terralib/application/qt/TeQtGrid.h | 251 +
src/terralib/application/qt/TeQtLatEdit.cpp | 131 +
src/terralib/application/qt/TeQtLatEdit.h | 24 +
src/terralib/application/qt/TeQtLayerItem.cpp | 43 +
src/terralib/application/qt/TeQtLayerItem.h | 49 +
src/terralib/application/qt/TeQtLegendItem.cpp | 319 +
src/terralib/application/qt/TeQtLegendItem.h | 71 +
src/terralib/application/qt/TeQtLongEdit.cpp | 130 +
src/terralib/application/qt/TeQtLongEdit.h | 24 +
src/terralib/application/qt/TeQtMethods.cpp | 98 +
src/terralib/application/qt/TeQtMethods.h | 64 +
src/terralib/application/qt/TeQtProgress.h | 138 +
src/terralib/application/qt/TeQtShowMedia.cpp | 1444 +
src/terralib/application/qt/TeQtShowMedia.h | 77 +
src/terralib/application/qt/TeQtTable.cpp | 316 +
src/terralib/application/qt/TeQtTable.h | 67 +
src/terralib/application/qt/TeQtTerraStat.cpp | 1184 +
src/terralib/application/qt/TeQtTerraStat.h | 207 +
src/terralib/application/qt/TeQtTextEdit.cpp | 862 +
src/terralib/application/qt/TeQtTextEdit.h | 150 +
src/terralib/application/qt/TeQtThemeItem.cpp | 187 +
src/terralib/application/qt/TeQtThemeItem.h | 57 +
src/terralib/application/qt/TeQtViewItem.cpp | 49 +
src/terralib/application/qt/TeQtViewItem.h | 54 +
src/terralib/application/qt/TeQtViewsListView.cpp | 767 +
src/terralib/application/qt/TeQtViewsListView.h | 146 +
src/terralib/application/qt/TeWaitCursor.cpp | 59 +
src/terralib/application/qt/TeWaitCursor.h | 36 +
src/terralib/application/qt/resultVisual.h | 37 +
src/terralib/drivers/MrSID/TeDecoderMrSID.cpp | 387 +
src/terralib/drivers/MrSID/TeDecoderMrSID.h | 163 +
src/terralib/drivers/MrSID/TeMrSID.cpp | 465 +
src/terralib/drivers/MrSID/TeMrSID.h | 223 +
src/terralib/drivers/MySQL/TeMySQL.cpp | 1893 +
src/terralib/drivers/MySQL/TeMySQL.h | 218 +
.../drivers/MySQL/include/config-netware.h | 119 +
src/terralib/drivers/MySQL/include/config-os2.h | 835 +
src/terralib/drivers/MySQL/include/config-win.h | 396 +
src/terralib/drivers/MySQL/include/errmsg.h | 92 +
src/terralib/drivers/MySQL/include/libmysql.def | 147 +
src/terralib/drivers/MySQL/include/libmysqld.def | 159 +
src/terralib/drivers/MySQL/include/m_ctype.h | 450 +
src/terralib/drivers/MySQL/include/m_string.h | 264 +
src/terralib/drivers/MySQL/include/my_alloc.h | 52 +
src/terralib/drivers/MySQL/include/my_dbug.h | 94 +
src/terralib/drivers/MySQL/include/my_getopt.h | 77 +
src/terralib/drivers/MySQL/include/my_global.h | 1191 +
src/terralib/drivers/MySQL/include/my_list.h | 46 +
src/terralib/drivers/MySQL/include/my_pthread.h | 700 +
src/terralib/drivers/MySQL/include/my_sys.h | 785 +
src/terralib/drivers/MySQL/include/mysql.h | 742 +
src/terralib/drivers/MySQL/include/mysql_com.h | 402 +
src/terralib/drivers/MySQL/include/mysql_embed.h | 33 +
src/terralib/drivers/MySQL/include/mysql_time.h | 44 +
src/terralib/drivers/MySQL/include/mysql_version.h | 29 +
src/terralib/drivers/MySQL/include/mysqld_error.h | 322 +
src/terralib/drivers/MySQL/include/raid.h | 158 +
src/terralib/drivers/MySQL/include/typelib.h | 33 +
.../drivers/OracleSpatial/OCI/include/cdemodp0.h | 109 +
.../drivers/OracleSpatial/OCI/include/kusapi.h | 775 +
.../drivers/OracleSpatial/OCI/include/kustags.h | 1034 +
.../drivers/OracleSpatial/OCI/include/nzerror.h | 647 +
.../drivers/OracleSpatial/OCI/include/nzt.h | 2750 ++
.../drivers/OracleSpatial/OCI/include/occi.h | 78 +
.../drivers/OracleSpatial/OCI/include/occiAQ.h | 374 +
.../drivers/OracleSpatial/OCI/include/occiCommon.h | 872 +
.../OracleSpatial/OCI/include/occiControl.h | 2060 +
.../drivers/OracleSpatial/OCI/include/occiData.h | 936 +
.../OracleSpatial/OCI/include/occiObjects.h | 990 +
.../drivers/OracleSpatial/OCI/include/oci.h | 2366 ++
.../drivers/OracleSpatial/OCI/include/oci1.h | 183 +
.../drivers/OracleSpatial/OCI/include/oci8dp.h | 315 +
.../drivers/OracleSpatial/OCI/include/ociap.h | 10240 +++++
.../drivers/OracleSpatial/OCI/include/ociapr.h | 157 +
.../drivers/OracleSpatial/OCI/include/ocidef.h | 888 +
.../drivers/OracleSpatial/OCI/include/ocidem.h | 112 +
.../drivers/OracleSpatial/OCI/include/ocidfn.h | 251 +
.../drivers/OracleSpatial/OCI/include/ociextp.h | 281 +
.../drivers/OracleSpatial/OCI/include/ocikp.h | 10223 +++++
.../drivers/OracleSpatial/OCI/include/ocikpr.h | 168 +
.../drivers/OracleSpatial/OCI/include/ocixad.h | 316 +
.../drivers/OracleSpatial/OCI/include/ocixmldb.h | 139 +
.../drivers/OracleSpatial/OCI/include/odci.h | 657 +
.../drivers/OracleSpatial/OCI/include/oratypes.h | 307 +
.../drivers/OracleSpatial/OCI/include/ori.h | 2094 +
.../drivers/OracleSpatial/OCI/include/orid.h | 372 +
.../drivers/OracleSpatial/OCI/include/orl.h | 3628 ++
.../drivers/OracleSpatial/OCI/include/oro.h | 883 +
.../drivers/OracleSpatial/OCI/include/ort.h | 2593 ++
.../drivers/OracleSpatial/TeOracleSpatial.cpp | 6810 +++
.../drivers/OracleSpatial/TeOracleSpatial.h | 392 +
src/terralib/drivers/OracleSpatial/connect.cpp | 425 +
src/terralib/drivers/OracleSpatial/connect.h | 111 +
src/terralib/drivers/OracleSpatial/cursor.cpp | 1172 +
src/terralib/drivers/OracleSpatial/cursor.h | 225 +
src/terralib/drivers/OracleSpatial/ociap.h | 10097 +++++
src/terralib/drivers/OracleSpatial/sdo_oci.cpp | 3097 ++
src/terralib/drivers/OracleSpatial/sdo_oci.h | 1541 +
src/terralib/drivers/PostgreSQL/TePGInterface.cpp | 1581 +
src/terralib/drivers/PostgreSQL/TePGInterface.h | 429 +
src/terralib/drivers/PostgreSQL/TePGUtils.cpp | 470 +
src/terralib/drivers/PostgreSQL/TePGUtils.h | 114 +
src/terralib/drivers/PostgreSQL/TePostGIS.cpp | 1233 +
src/terralib/drivers/PostgreSQL/TePostGIS.h | 213 +
src/terralib/drivers/PostgreSQL/TePostgreSQL.cpp | 3304 ++
src/terralib/drivers/PostgreSQL/TePostgreSQL.h | 396 +
.../drivers/PostgreSQL/includepg/ecpg_informix.h | 90 +
.../drivers/PostgreSQL/includepg/ecpgerrno.h | 77 +
.../drivers/PostgreSQL/includepg/ecpglib.h | 94 +
.../drivers/PostgreSQL/includepg/ecpgtype.h | 93 +
.../drivers/PostgreSQL/includepg/libpq-fe.h | 503 +
.../drivers/PostgreSQL/includepg/pg_config.h | 685 +
.../PostgreSQL/includepg/pg_config_manual.h | 229 +
.../drivers/PostgreSQL/includepg/pg_config_os.h | 244 +
.../drivers/PostgreSQL/includepg/pgtypes_date.h | 27 +
.../drivers/PostgreSQL/includepg/pgtypes_error.h | 15 +
.../PostgreSQL/includepg/pgtypes_interval.h | 30 +
.../drivers/PostgreSQL/includepg/pgtypes_numeric.h | 68 +
.../PostgreSQL/includepg/pgtypes_timestamp.h | 33 +
.../drivers/PostgreSQL/includepg/postgres_ext.h | 69 +
.../drivers/PostgreSQL/includepg/sql3types.h | 48 +
src/terralib/drivers/PostgreSQL/includepg/sqlca.h | 66 +
src/terralib/functions/TeAddressLocator.cpp | 3357 ++
src/terralib/functions/TeAddressLocator.h | 420 +
src/terralib/functions/TeCellAlgorithms.cpp | 1066 +
src/terralib/functions/TeCellAlgorithms.h | 268 +
src/terralib/functions/TeCoordAlgorithms.cpp | 99 +
src/terralib/functions/TeCoordAlgorithms.h | 56 +
src/terralib/functions/TeExportDBF.cpp | 286 +
src/terralib/functions/TeExportMIF.cpp | 534 +
src/terralib/functions/TeExportSHP.cpp | 443 +
src/terralib/functions/TeExportSPR.cpp | 807 +
.../functions/TeGeoProcessingFunctions.cpp | 2097 +
src/terralib/functions/TeGeoProcessingFunctions.h | 51 +
src/terralib/functions/TeImportBNA.cpp | 496 +
src/terralib/functions/TeImportDBF.cpp | 442 +
src/terralib/functions/TeImportExport.h | 274 +
src/terralib/functions/TeImportGeo.cpp | 455 +
src/terralib/functions/TeImportMIF.cpp | 894 +
src/terralib/functions/TeImportSHP.cpp | 882 +
src/terralib/functions/TeImportSPR.cpp | 224 +
src/terralib/functions/TeImportSPR.h | 18 +
src/terralib/functions/TeLayerFunctions.cpp | 660 +
src/terralib/functions/TeLayerFunctions.h | 197 +
src/terralib/functions/TeMIFProjection.cpp | 340 +
src/terralib/functions/TeMIFProjection.h | 39 +
src/terralib/functions/TeSPRFile.cpp | 310 +
src/terralib/functions/TeSPRFile.h | 185 +
src/terralib/functions/TeSTEFunctionsSHP.cpp | 214 +
src/terralib/functions/TeSTEFunctionsSHP.h | 41 +
src/terralib/functions/TeSimilarity.cpp | 73 +
src/terralib/functions/TeThemeFunctions.cpp | 170 +
src/terralib/functions/TeThemeFunctions.h | 43 +
src/terralib/kernel/Gra_algo.h | 195 +
src/terralib/kernel/TeAsciiFile.cpp | 342 +
src/terralib/kernel/TeAsciiFile.h | 129 +
src/terralib/kernel/TeAssertions.h | 36 +
src/terralib/kernel/TeAttribute.h | 155 +
src/terralib/kernel/TeBox.cpp | 187 +
src/terralib/kernel/TeBox.h | 204 +
src/terralib/kernel/TeBufferRegion.cpp | 206 +
src/terralib/kernel/TeBufferRegion.h | 52 +
src/terralib/kernel/TeCentroid.cpp | 411 +
src/terralib/kernel/TeComposite.h | 195 +
.../kernel/TeComputeAttributeStrategies.cpp | 969 +
src/terralib/kernel/TeComputeAttributeStrategies.h | 610 +
src/terralib/kernel/TeConsoleErrorMessage.cpp | 51 +
src/terralib/kernel/TeConsoleErrorMessage.h | 69 +
src/terralib/kernel/TeCoord2D.h | 148 +
src/terralib/kernel/TeCounted.h | 74 +
src/terralib/kernel/TeDataTypes.h | 172 +
src/terralib/kernel/TeDatabase.cpp | 6504 +++
src/terralib/kernel/TeDatabase.h | 1438 +
src/terralib/kernel/TeDatum.cpp | 222 +
src/terralib/kernel/TeDatum.h | 141 +
src/terralib/kernel/TeDecoder.h | 181 +
src/terralib/kernel/TeDecoderASCIIGrid.cpp | 335 +
src/terralib/kernel/TeDecoderASCIIGrid.h | 68 +
src/terralib/kernel/TeDecoderDatabase.cpp | 452 +
src/terralib/kernel/TeDecoderDatabase.h | 141 +
src/terralib/kernel/TeDecoderFile.cpp | 363 +
src/terralib/kernel/TeDecoderFile.h | 73 +
src/terralib/kernel/TeDecoderJPEG.cpp | 184 +
src/terralib/kernel/TeDecoderJPEG.h | 68 +
src/terralib/kernel/TeDecoderMemory.cpp | 339 +
src/terralib/kernel/TeDecoderMemory.h | 90 +
src/terralib/kernel/TeDecoderMemoryMap.cpp | 664 +
src/terralib/kernel/TeDecoderMemoryMap.h | 85 +
src/terralib/kernel/TeDecoderSPR.cpp | 341 +
src/terralib/kernel/TeDecoderSPR.h | 68 +
src/terralib/kernel/TeDecoderTIFF.cpp | 1372 +
src/terralib/kernel/TeDecoderTIFF.h | 205 +
src/terralib/kernel/TeDecoderVirtualMemory.cpp | 442 +
src/terralib/kernel/TeDecoderVirtualMemory.h | 196 +
src/terralib/kernel/TeDefines.h | 85 +
src/terralib/kernel/TeErrorLog.cpp | 171 +
src/terralib/kernel/TeErrorLog.h | 139 +
src/terralib/kernel/TeErrorMessage.cpp | 33 +
src/terralib/kernel/TeErrorMessage.h | 111 +
src/terralib/kernel/TeException.cpp | 51 +
src/terralib/kernel/TeException.h | 72 +
src/terralib/kernel/TeFactory.h | 145 +
src/terralib/kernel/TeFragmentation.cpp | 424 +
src/terralib/kernel/TeFragmentation.h | 52 +
src/terralib/kernel/TeGeneralizedProxMatrix.cpp | 433 +
src/terralib/kernel/TeGeneralizedProxMatrix.h | 169 +
src/terralib/kernel/TeGeometry.cpp | 113 +
src/terralib/kernel/TeGeometry.h | 926 +
src/terralib/kernel/TeGeometryAlgorithms.cpp | 2695 ++
src/terralib/kernel/TeGeometryAlgorithms.h | 1024 +
src/terralib/kernel/TeGraph.cpp | 1557 +
src/terralib/kernel/TeGraph.h | 182 +
src/terralib/kernel/TeGroupingAlgorithms.cpp | 112 +
src/terralib/kernel/TeGroupingAlgorithms.h | 280 +
src/terralib/kernel/TeImportRaster.cpp | 309 +
src/terralib/kernel/TeImportRaster.h | 104 +
src/terralib/kernel/TeInitQuerierStrategy.cpp | 41 +
src/terralib/kernel/TeInitQuerierStrategy.h | 32 +
src/terralib/kernel/TeInitRasterDecoders.cpp | 86 +
src/terralib/kernel/TeInitRasterDecoders.h | 33 +
src/terralib/kernel/TeIntersector.cpp | 202 +
src/terralib/kernel/TeIntersector.h | 442 +
src/terralib/kernel/TeLayer.cpp | 1038 +
src/terralib/kernel/TeLayer.h | 416 +
src/terralib/kernel/TeLegendEntry.h | 202 +
src/terralib/kernel/TeMatrix.cpp | 1516 +
src/terralib/kernel/TeMatrix.h | 161 +
src/terralib/kernel/TeMeasure.h | 57 +
src/terralib/kernel/TeMultiGeometry.cpp | 171 +
src/terralib/kernel/TeMultiGeometry.h | 146 +
src/terralib/kernel/TeNeighbours.cpp | 221 +
src/terralib/kernel/TeNeighbours.h | 200 +
src/terralib/kernel/TeNetwork.cpp | 578 +
src/terralib/kernel/TeNetwork.h | 164 +
src/terralib/kernel/TeOverlay.cpp | 895 +
src/terralib/kernel/TeOverlay.h | 78 +
src/terralib/kernel/TePieBar.h | 289 +
src/terralib/kernel/TePrecision.h | 57 +
src/terralib/kernel/TeProgress.cpp | 31 +
src/terralib/kernel/TeProgress.h | 66 +
src/terralib/kernel/TeProgressBase.h | 73 +
src/terralib/kernel/TeProjection.cpp | 1708 +
src/terralib/kernel/TeProjection.h | 700 +
src/terralib/kernel/TePrototype.h | 79 +
.../kernel/TeProxMatrixConstructionStrategy.cpp | 1009 +
.../kernel/TeProxMatrixConstructionStrategy.h | 284 +
src/terralib/kernel/TeProxMatrixImplementation.cpp | 365 +
src/terralib/kernel/TeProxMatrixImplementation.h | 210 +
src/terralib/kernel/TeProxMatrixSlicingStrategy.h | 89 +
src/terralib/kernel/TeProxMatrixStrategies.cpp | 296 +
src/terralib/kernel/TeProxMatrixWeightsStrategy.h | 154 +
src/terralib/kernel/TeQuerier.cpp | 146 +
src/terralib/kernel/TeQuerier.h | 94 +
src/terralib/kernel/TeQuerierDB.cpp | 362 +
src/terralib/kernel/TeQuerierDB.h | 91 +
src/terralib/kernel/TeQuerierDBStr1.cpp | 1018 +
src/terralib/kernel/TeQuerierDBStr1.h | 94 +
src/terralib/kernel/TeQuerierDBStr2.cpp | 299 +
src/terralib/kernel/TeQuerierDBStr2.h | 78 +
src/terralib/kernel/TeQuerierDBStr3.cpp | 336 +
src/terralib/kernel/TeQuerierDBStr3.h | 79 +
src/terralib/kernel/TeQuerierImpl.cpp | 95 +
src/terralib/kernel/TeQuerierImpl.h | 109 +
src/terralib/kernel/TeQuerierParams.cpp | 252 +
src/terralib/kernel/TeQuerierParams.h | 208 +
src/terralib/kernel/TeQuerierSHP.h | 70 +
src/terralib/kernel/TeRaster.cpp | 632 +
src/terralib/kernel/TeRaster.h | 627 +
src/terralib/kernel/TeRasterParams.cpp | 509 +
src/terralib/kernel/TeRasterParams.h | 366 +
src/terralib/kernel/TeRasterRemap.cpp | 503 +
src/terralib/kernel/TeRasterRemap.h | 116 +
src/terralib/kernel/TeRasterTransform.cpp | 128 +
src/terralib/kernel/TeRasterTransform.h | 307 +
src/terralib/kernel/TeRedBlackTree.h | 765 +
src/terralib/kernel/TeRepresentation.cpp | 34 +
src/terralib/kernel/TeRepresentation.h | 79 +
src/terralib/kernel/TeSTEFunctionsDB.cpp | 623 +
src/terralib/kernel/TeSTEFunctionsDB.h | 81 +
src/terralib/kernel/TeSTElement.cpp | 196 +
src/terralib/kernel/TeSTElement.h | 148 +
src/terralib/kernel/TeSTElementSet.cpp | 606 +
src/terralib/kernel/TeSTElementSet.h | 254 +
src/terralib/kernel/TeSTEvent.cpp | 270 +
src/terralib/kernel/TeSTEvent.h | 298 +
src/terralib/kernel/TeSTInstance.cpp | 490 +
src/terralib/kernel/TeSTInstance.h | 231 +
src/terralib/kernel/TeSingleton.h | 62 +
src/terralib/kernel/TeSlice.h | 63 +
src/terralib/kernel/TeSparseMatrix.h | 272 +
src/terralib/kernel/TeSpatialOperations.cpp | 1658 +
src/terralib/kernel/TeSpatialOperations.h | 206 +
src/terralib/kernel/TeStatistics.h | 664 +
src/terralib/kernel/TeStdFile.cpp | 60 +
src/terralib/kernel/TeStdFile.h | 81 +
src/terralib/kernel/TeStdIOProgress.h | 60 +
src/terralib/kernel/TeTable.cpp | 348 +
src/terralib/kernel/TeTable.h | 393 +
src/terralib/kernel/TeTemporalSeries.cpp | 283 +
src/terralib/kernel/TeTemporalSeries.h | 193 +
src/terralib/kernel/TeTheme.cpp | 1703 +
src/terralib/kernel/TeTheme.h | 765 +
src/terralib/kernel/TeTime.cpp | 612 +
src/terralib/kernel/TeTime.h | 156 +
src/terralib/kernel/TeTimeInterval.cpp | 181 +
src/terralib/kernel/TeTimeInterval.h | 166 +
src/terralib/kernel/TeTin.cpp | 1762 +
src/terralib/kernel/TeTin.h | 353 +
src/terralib/kernel/TeUtils.cpp | 465 +
src/terralib/kernel/TeUtils.h | 169 +
src/terralib/kernel/TeVectorRemap.cpp | 95 +
src/terralib/kernel/TeVectorRemap.h | 52 +
src/terralib/kernel/TeView.h | 189 +
src/terralib/kernel/TeViewNode.h | 337 +
src/terralib/kernel/TeViewTreeIterator.cpp | 140 +
src/terralib/kernel/TeViewTreeIterator.h | 193 +
src/terralib/kernel/TeViewTreeUtils.cpp | 104 +
src/terralib/kernel/TeViewTreeUtils.h | 39 +
src/terralib/kernel/TeVisual.h | 429 +
src/terralib/kernel/checkvec.h | 70 +
src/terralib/kernel/dynpq.h | 175 +
src/terralib/kernel/gra_util.h | 259 +
src/terralib/kernel/graph.h | 365 +
src/terralib/kernel/ijl.h | 1513 +
src/terralib/kernel/jpeg.cpp | 452 +
src/terralib/kernel/jpeg.h | 95 +
src/terralib/kernel/lexTemporal.cpp | 1922 +
src/terralib/kernel/showseq.h | 23 +
src/terralib/kernel/yyTemporal.cpp | 495 +
src/terralib/kernel/yyTemporal.h | 35 +
src/terralib/stat/TeBayesFunctions.cpp | 232 +
src/terralib/stat/TeBayesFunctions.h | 71 +
src/terralib/stat/TeKMeansGrouping.h | 164 +
src/terralib/stat/TeKernelFunctions.cpp | 67 +
src/terralib/stat/TeKernelFunctions.h | 693 +
src/terralib/stat/TeKernelParams.h | 112 +
src/terralib/stat/TeSkaterArvore.cpp | 62 +
src/terralib/stat/TeSkaterArvore.h | 18 +
src/terralib/stat/TeSkaterFunctions.cpp | 414 +
src/terralib/stat/TeSkaterFunctions.h | 32 +
src/terralib/stat/TeSkaterGrafo.cpp | 188 +
src/terralib/stat/TeSkaterGrafo.h | 75 +
src/terralib/stat/TeSpatialStatistics.cpp | 987 +
src/terralib/stat/TeSpatialStatistics.h | 283 +
src/terralib/stat/TeStatDataStructures.cpp | 85 +
src/terralib/stat/TeStatDataStructures.h | 455 +
src/terralib/stat/TeTreeMinimum.cpp | 379 +
src/terralib/stat/TeTreeMinimum.h | 89 +
src/terralib/stat/erro.h | 6 +
src/terralib/stat/filaDouble.cpp | 58 +
src/terralib/stat/filaDouble.h | 27 +
src/terralib/stat/filaInt.cpp | 58 +
src/terralib/stat/filaInt.h | 27 +
src/terralib/stat/filaR.cpp | 79 +
src/terralib/stat/filaR.h | 36 +
src/terralib/stat/hash.cpp | 53 +
src/terralib/stat/hash.h | 26 +
src/terralib/stat/heap.cpp | 124 +
src/terralib/stat/heap.h | 36 +
src/terralib/stat/lista.cpp | 111 +
src/terralib/stat/lista.h | 31 +
src/tiff/cpl_csv.c | 1013 +
src/tiff/cpl_csv.h | 86 +
src/tiff/cpl_serv.c | 599 +
src/tiff/cpl_serv.h | 276 +
src/tiff/csv/README | 38 +
src/tiff/csv/alias.csv | 2001 +
src/tiff/csv/area.csv | 1751 +
src/tiff/csv/codes.csv | 84 +
src/tiff/csv/compd_cs.c | 12 +
src/tiff/csv/compd_cs.csv | 9 +
src/tiff/csv/coordinate_axis.csv | 75 +
src/tiff/csv/coordinate_axis_name.csv | 29 +
src/tiff/csv/coordinate_operation.csv | 2020 +
src/tiff/csv/coordinate_operation_method.csv | 1513 +
src/tiff/csv/coordinate_operation_parameter.csv | 99 +
.../csv/coordinate_operation_parameter_value.csv | 8406 ++++
src/tiff/csv/coordinate_operation_path.csv | 336 +
src/tiff/csv/coordinate_reference_system.csv | 2609 ++
src/tiff/csv/coordinate_system.csv | 38 +
src/tiff/csv/datum.csv | 332 +
src/tiff/csv/deprecation.csv | 276 +
src/tiff/csv/ellips_alias.c | 10 +
src/tiff/csv/ellips_alias.csv | 7 +
src/tiff/csv/ellipsoid.c | 42 +
src/tiff/csv/ellipsoid.csv | 39 +
src/tiff/csv/gcs.csv | 278 +
src/tiff/csv/gdatum_alias.c | 11 +
src/tiff/csv/gdatum_alias.csv | 8 +
src/tiff/csv/geod_datum.c | 213 +
src/tiff/csv/geod_datum.csv | 210 +
src/tiff/csv/geod_trf.c | 492 +
src/tiff/csv/geod_trf.csv | 489 +
src/tiff/csv/horiz_cs.c | 1496 +
src/tiff/csv/horiz_cs.csv | 1493 +
src/tiff/csv/naming_system.csv | 13 +
src/tiff/csv/p_meridian.c | 17 +
src/tiff/csv/p_meridian.csv | 14 +
src/tiff/csv/pcs.csv | 2251 +
src/tiff/csv/prime_meridian.csv | 14 +
src/tiff/csv/projop_wparm.csv | 1083 +
src/tiff/csv/stateplane.csv | 258 +
src/tiff/csv/trf_method.c | 205 +
src/tiff/csv/trf_method.csv | 984 +
src/tiff/csv/trf_nonpolynomial.c | 1082 +
src/tiff/csv/trf_nonpolynomial.csv | 1079 +
src/tiff/csv/trf_path.c | 568 +
src/tiff/csv/trf_path.csv | 565 +
src/tiff/csv/unit_of_measure.csv | 64 +
src/tiff/csv/uom_an_alias.c | 5 +
src/tiff/csv/uom_an_alias.csv | 2 +
src/tiff/csv/uom_angle.c | 18 +
src/tiff/csv/uom_angle.csv | 15 +
src/tiff/csv/uom_le_alias.c | 27 +
src/tiff/csv/uom_le_alias.csv | 24 +
src/tiff/csv/uom_length.c | 39 +
src/tiff/csv/uom_length.csv | 36 +
src/tiff/csv/uom_sc_alias.c | 4 +
src/tiff/csv/uom_sc_alias.csv | 1 +
src/tiff/csv/uom_scale.c | 6 +
src/tiff/csv/uom_scale.csv | 3 +
src/tiff/csv/version_history.csv | 23 +
src/tiff/csv/vert_cs.c | 31 +
src/tiff/csv/vert_cs.csv | 28 +
src/tiff/csv/vert_datum.c | 32 +
src/tiff/csv/vert_datum.csv | 29 +
src/tiff/csv/vert_offset.c | 5 +
src/tiff/csv/vert_offset.csv | 2 +
src/tiff/epsg_datum.inc | 174 +
src/tiff/epsg_ellipse.inc | 48 +
src/tiff/epsg_gcs.inc | 193 +
src/tiff/epsg_pcs.inc | 1003 +
src/tiff/epsg_pm.inc | 22 +
src/tiff/epsg_proj.inc | 443 +
src/tiff/epsg_units.inc | 35 +
src/tiff/epsg_vertcs.inc | 46 +
src/tiff/fax3sm.c | 1046 +
src/tiff/geo_config.h | 20 +
src/tiff/geo_ctrans.inc | 55 +
src/tiff/geo_extra.c | 750 +
src/tiff/geo_free.c | 62 +
src/tiff/geo_get.c | 176 +
src/tiff/geo_keyp.h | 98 +
src/tiff/geo_names.c | 175 +
src/tiff/geo_new.c | 224 +
src/tiff/geo_normalize.c | 2330 ++
src/tiff/geo_normalize.h | 233 +
src/tiff/geo_print.c | 496 +
src/tiff/geo_set.c | 259 +
src/tiff/geo_tiffp.c | 140 +
src/tiff/geo_tiffp.h | 113 +
src/tiff/geo_trans.c | 326 +
src/tiff/geo_write.c | 190 +
src/tiff/geokeys.h | 54 +
src/tiff/geokeys.inc | 76 +
src/tiff/geonames.h | 146 +
src/tiff/geotiff.h | 117 +
src/tiff/geotiff_proj4.c | 679 +
src/tiff/geotiffio.h | 16 +
src/tiff/geovalues.h | 120 +
src/tiff/port.h | 32 +
src/tiff/t4.h | 285 +
src/tiff/tif_aux.c | 218 +
src/tiff/tif_close.c | 80 +
src/tiff/tif_codec.c | 150 +
src/tiff/tif_color.c | 268 +
src/tiff/tif_compress.c | 233 +
src/tiff/tif_dir.c | 1419 +
src/tiff/tif_dir.h | 267 +
src/tiff/tif_dirinfo.c | 480 +
src/tiff/tif_dirread.c | 1485 +
src/tiff/tif_dirwrite.c | 1233 +
src/tiff/tif_dumpmode.c | 118 +
src/tiff/tif_error.c | 49 +
src/tiff/tif_extension.c | 109 +
src/tiff/tif_fax3.c | 1515 +
src/tiff/tif_fax3.h | 525 +
src/tiff/tif_flush.c | 67 +
src/tiff/tif_getimage.c | 2584 ++
src/tiff/tif_jpeg.c | 1667 +
src/tiff/tif_luv.c | 1586 +
src/tiff/tif_lzw.c | 745 +
src/tiff/tif_machdep.c | 186 +
src/tiff/tif_next.c | 142 +
src/tiff/tif_open.c | 495 +
src/tiff/tif_packbits.c | 300 +
src/tiff/tif_pixarlog.c | 1305 +
src/tiff/tif_predict.c | 464 +
src/tiff/tif_predict.h | 61 +
src/tiff/tif_print.c | 613 +
src/tiff/tif_read.c | 637 +
src/tiff/tif_strip.c | 217 +
src/tiff/tif_swab.c | 217 +
src/tiff/tif_thunder.c | 154 +
src/tiff/tif_tile.c | 219 +
src/tiff/tif_unix.c | 228 +
src/tiff/tif_version.c | 33 +
src/tiff/tif_warning.c | 49 +
src/tiff/tif_win32.c | 323 +
src/tiff/tif_write.c | 726 +
src/tiff/tif_zip.c | 368 +
src/tiff/tiff.h | 482 +
src/tiff/tiffcomp.h | 220 +
src/tiff/tiffconf.h | 153 +
src/tiff/tiffio.h | 479 +
src/tiff/tiffiop.h | 289 +
src/tiff/tiffvers.h | 9 +
src/tiff/uvcode.h | 173 +
src/tiff/version.h | 1 +
src/tiff/xtiff.c | 198 +
src/tiff/xtiffio.h | 72 +
src/tiff/xtiffiop.h | 90 +
src/zlib/ChangeLog | 471 +
src/zlib/FAQ | 72 +
src/zlib/Makefile | 99 +
src/zlib/README | 148 +
src/zlib/algorithm.txt | 213 +
src/zlib/zconf.h | 279 +
src/zlib/zlib.h | 893 +
terralibx/PostgreSQL/libpq.a | Bin 0 -> 137152 bytes
terralibx/shapelib/Makefile | 11 +
terralibx/shapelib/shapelib.pro | 18 +
terralibx/stat/Makefile | 11 +
terralibx/stat/stat.pro | 45 +
terralibx/terralib/Makefile | 14 +
terralibx/terralib/terralib.kdevprj | 795 +
terralibx/terralib/terralib.pro | 181 +
terralibx/tiff/Makefile | 13 +
terralibx/tiff/tiff.pro | 61 +
1322 files changed, 430683 insertions(+)
diff --git a/examples/Debug/ijl15.dll b/examples/Debug/ijl15.dll
new file mode 100644
index 0000000..0ea9873
Binary files /dev/null and b/examples/Debug/ijl15.dll differ
diff --git a/examples/Debug/libMySQL.dll b/examples/Debug/libMySQL.dll
new file mode 100644
index 0000000..de2c2d2
Binary files /dev/null and b/examples/Debug/libMySQL.dll differ
diff --git a/examples/Debug/libpq.dll b/examples/Debug/libpq.dll
new file mode 100644
index 0000000..6e95daa
Binary files /dev/null and b/examples/Debug/libpq.dll differ
diff --git a/examples/Debug/oci.dll b/examples/Debug/oci.dll
new file mode 100644
index 0000000..59be9f8
Binary files /dev/null and b/examples/Debug/oci.dll differ
diff --git a/examples/Debug/zlib.dll b/examples/Debug/zlib.dll
new file mode 100644
index 0000000..e93cdb9
Binary files /dev/null and b/examples/Debug/zlib.dll differ
diff --git a/examples/Readme b/examples/Readme
new file mode 100644
index 0000000..ca95af1
--- /dev/null
+++ b/examples/Readme
@@ -0,0 +1,96 @@
+ TerraLib Examples
+
+Each one of the items below corresponds to a directory that contains the files that
+implement the operations described, as well as the project files (*.dsw, *.dsp) for
+the Microsoft Visual C++, and the Makefiles to compile the files in the Linux/Unix
+operational system. The data used in these examples can be found in the "data"
+directory.
+
+1. createDatabase
+It illustrates how to create a TerraLib database, creating all of the tables that
+make up the TerraLib data model.
+
+2. createLayer
+It illustrates how to create a layer with vector data in memory and save it in a
+TerraLib database already created.
+
+3. createTable
+It illustrates how to create an attribute table in memory and save it in a TerraLib
+database already created.
+
+4. importMIDMIF
+It illustrates how to import a vector data file in the MapInfo format(MID/MIF)for a
+TerraLib database already created.
+Source Data: Distritos.mid, Distritos.mif
+
+5. importShape
+It illustrates how to import a vector data file in the Shapefile format for a TerraLib
+database already created.
+Source Data: EstadosBrasil.shp, EstadosBrasil.shx, EstadosBrasil.dbf
+
+6. importDBF
+It illustrates how to import an attribute table in the DBF format as an external table
+for a TerraLib database already created.
+Source Data: SOCEC.dbf
+
+7. importJPEG
+It illustrates how to import an image in the JPEG format for a TerraLib database already
+created.
+Source Data: sampa.jpg
+
+8. copyLayer
+It illustrates how to copy a layer of a TerraLib database changing the projection of its
+geometries.
+It depends on the layer created in the item 4 (importMIDMIF)
+
+9. importGeoTab
+It illustrates how to import a vector data file in the SPRING format for a TerraLib
+database already created.
+Source Data: Cadastro_Escolas.geo, Cadastro_Escolas.tab
+
+10. convertCoordinates
+It illustrates how to use the TeProjection class to make the conversion between two
+different projections.
+
+11. databaseQuery
+It illustrates how to use the TeDatabase class to submit queries on geometries tables
+of a TerraLib database.
+It depends on the layer created in the item 4 (importMIDMIF)
+
+12. databaseSQLQuery
+It illustrates how to query geometries tables through explicit SQL queries on a TerraLib
+database.
+It depends on the layer created in the item 4 (importMIDMIF)
+
+13. spatialQuery
+It illustrates how to make spatial queries on the layers of a TerraLib database.
+Source Data: cities.shp/shx/dbf, rivers.shp/shx/dbf, states.shp/shx/dbf
+
+14. addGeomRepresentation
+It illustrates how to add a point representation (centroids) to a layer with polygon
+representation.
+It depends on the layer created in the item 4 (importMIDMIF)
+
+15. createTheme
+It illustrates how to create views and themes from layers of a Terralib database,
+without restriction and with restriction on its attributes.
+It depends on the layer created in the item 4 (importMIDMIF)
+
+16. themeGrouping
+It illustrates how to create a grouping on a theme created in a TerraLib database.
+It depends on the theme created in the item 15 (createTheme)
+
+17. createSTElementSet
+It illustrates how to create a Spatial Temporal Element Set, out of a theme created
+in a TerraLib database.
+It depends on the theme created in the item 15 (createTheme)
+
+18. mosaicTIFFImages
+It illustrates how to import to TIFF files to the same layer in a TerraLib database,
+generating a mosaic of images.
+It depends on the files nat1.tif and nat2.tif.
+
+19. importCSV
+It illustrates how to import a MIF / MIF file to a new layer in a TerraLib database
+and how to import a second attribute table from a CSV file.
+It depends on the files RecifeBairros.MIF RecifeBairros.MID and RecifeBairros2.csv
diff --git a/examples/Release/ijl15.dll b/examples/Release/ijl15.dll
new file mode 100644
index 0000000..0ea9873
Binary files /dev/null and b/examples/Release/ijl15.dll differ
diff --git a/examples/Release/libMySQL.dll b/examples/Release/libMySQL.dll
new file mode 100644
index 0000000..de2c2d2
Binary files /dev/null and b/examples/Release/libMySQL.dll differ
diff --git a/examples/Release/libpq.dll b/examples/Release/libpq.dll
new file mode 100644
index 0000000..6e95daa
Binary files /dev/null and b/examples/Release/libpq.dll differ
diff --git a/examples/Release/oci.dll b/examples/Release/oci.dll
new file mode 100644
index 0000000..59be9f8
Binary files /dev/null and b/examples/Release/oci.dll differ
diff --git a/examples/Release/zlib.dll b/examples/Release/zlib.dll
new file mode 100644
index 0000000..e93cdb9
Binary files /dev/null and b/examples/Release/zlib.dll differ
diff --git a/examples/addGeomRepresentation/.cdtproject b/examples/addGeomRepresentation/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/addGeomRepresentation/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/addGeomRepresentation/.project b/examples/addGeomRepresentation/.project
new file mode 100644
index 0000000..cb77656
--- /dev/null
+++ b/examples/addGeomRepresentation/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>addGeomRepresentation</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/addGeomRepresentation/Makefile b/examples/addGeomRepresentation/Makefile
new file mode 100644
index 0000000..fb9f796
--- /dev/null
+++ b/examples/addGeomRepresentation/Makefile
@@ -0,0 +1,23 @@
+all: addGeomRepresentation
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+addGeomRepresentation: shapelib tiff terralib stat
+ qmake -o makeAddGeomRepresentation addGeomRepresentation.pro; make -f makeAddGeomRepresentation
+
+clean:
+ if \
+ test -f makeAddGeomRepresentation; \
+ then \
+ make -f makeAddGeomRepresentation distclean; rm -f makeAddGeomRepresentation; \
+ fi
\ No newline at end of file
diff --git a/examples/addGeomRepresentation/addGeomRepresentation.cpp b/examples/addGeomRepresentation/addGeomRepresentation.cpp
new file mode 100644
index 0000000..0ab24da
--- /dev/null
+++ b/examples/addGeomRepresentation/addGeomRepresentation.cpp
@@ -0,0 +1,96 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows an example of how to create a point representation
+ (centroid of polygons) to a layer in a TerraLib database.
+
+ Author: Lubia Vinhas
+*/
+
+#include "TeMySQL.h"
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Open a connection to the TerraTeste MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+ TeLayer* distritos = new TeLayer("Distritos");
+ if (!db->loadLayer(distritos))
+ {
+ cout << "Fail to load layer \"Distritos\": " << db->errorMessage() << endl << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Check whether the table of points to be generated
+ // already exists in the database
+ string pointsTableName = distritos->tableName(TePOINTS);
+ if (pointsTableName.empty() == false)
+ {
+ if (db->tableExist(pointsTableName))
+ {
+ cout << "The table of points \"" << pointsTableName << "\" already exists in the database!\n\n";
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ }
+
+ TeRepresentation* repPol = distritos->getRepresentation(TePOLYGONS);
+ TePointSet centroids; //generate centroids
+ if (db->Centroid(repPol->tableName_, TePOLYGONS, centroids) == false)
+ {
+ cout << "Fail to create centroids: " << db->errorMessage();
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Add new representation to the layer
+ distritos->addPoints(centroids);
+ cout << "Centroids created!\n\n";
+
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 0;
+}
diff --git a/examples/addGeomRepresentation/addGeomRepresentation.dsp b/examples/addGeomRepresentation/addGeomRepresentation.dsp
new file mode 100644
index 0000000..542ab26
--- /dev/null
+++ b/examples/addGeomRepresentation/addGeomRepresentation.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="addGeomRepresentation" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=addGeomRepresentation - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "addGeomRepresentation.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "addGeomRepresentation.mak" CFG="addGeomRepresentation - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "addGeomRepresentation - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "addGeomRepresentation - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "addGeomRepresentation - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "addGeomRepresentation - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "addGeomRepresentation - Win32 Release"
+# Name "addGeomRepresentation - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\addGeomRepresentation.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/addGeomRepresentation/addGeomRepresentation.dsw b/examples/addGeomRepresentation/addGeomRepresentation.dsw
new file mode 100644
index 0000000..c6679e6
--- /dev/null
+++ b/examples/addGeomRepresentation/addGeomRepresentation.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "addGeomRepresentation"=".\addGeomRepresentation.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/addGeomRepresentation/addGeomRepresentation.pro b/examples/addGeomRepresentation/addGeomRepresentation.pro
new file mode 100644
index 0000000..44f3460
--- /dev/null
+++ b/examples/addGeomRepresentation/addGeomRepresentation.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = addGeomRepresentation
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ addGeomRepresentation.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/convertCoordinates/.cdtproject b/examples/convertCoordinates/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/convertCoordinates/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/convertCoordinates/.project b/examples/convertCoordinates/.project
new file mode 100644
index 0000000..13596ff
--- /dev/null
+++ b/examples/convertCoordinates/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>convertCoordinates</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/convertCoordinates/Makefile b/examples/convertCoordinates/Makefile
new file mode 100644
index 0000000..5125abf
--- /dev/null
+++ b/examples/convertCoordinates/Makefile
@@ -0,0 +1,23 @@
+all: convertCoordinates
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+convertCoordinates: shapelib tiff terralib stat
+ qmake -o makeConvertCoordinates convertCoordinates.pro; make -f makeConvertCoordinates
+
+clean:
+ if \
+ test -f makeConvertCoordinates; \
+ then \
+ make -f makeConvertCoordinates distclean; rm -f makeConvertCoordinates; \
+ fi
\ No newline at end of file
diff --git a/examples/convertCoordinates/convertCoordinates.cpp b/examples/convertCoordinates/convertCoordinates.cpp
new file mode 100644
index 0000000..5af38eb
--- /dev/null
+++ b/examples/convertCoordinates/convertCoordinates.cpp
@@ -0,0 +1,68 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This file showns an example of how to create a new TerraLib database
+ in an MySQL SGDB
+
+ Author: Lubia Vinhas
+*/
+#include <TeProjection.h>
+#include <iostream>
+
+int main()
+{
+ TeDatum dSAD69 = TeDatumFactory::make("SAD69"); // SAD69 Spheroid
+
+ TeDatum dWGS84 = TeDatumFactory::make("WGS84"); // WGS84 Spheroid
+
+ TeUtm* pUTM = new TeUtm(dSAD69,-45.0*TeCDR); // Origin latitude of -45.0
+ // TeCDR means "Convert to Degrees from Radians"
+
+ TePolyconic* pPolyconic = new TePolyconic(dWGS84,-45.0*TeCDR); // Origin latitude of -45.0
+ // TeCDR means "Converte Degrees from Radians"
+ TeCoord2D pt1(340033.47, 7391306.21); // Original coordinate in UTM
+
+ // Conversion from the UTM to the Polyconic projection
+ pUTM->setDestinationProjection(pPolyconic);
+
+ TeCoord2D ll = pUTM->PC2LL(pt1); // Convert to Lat Long
+ TeCoord2D pt2 = pPolyconic->LL2PC(ll); // Convert to output projection
+
+ printf("UTM -> Polyconic \n");
+ printf("(%.4f, %.4f) -> ",pt1.x(), pt1.y());
+ printf("(%.4f, %.4f) \n",pt2.x(), pt2.y());
+
+ // Conversion from the Polyconic to the UTM projection
+ pPolyconic->setDestinationProjection(pUTM);
+ ll = pPolyconic->PC2LL(pt2);
+ pt1 = pUTM->LL2PC(ll);
+
+ printf("\nPolyconic -> UTM \n");
+ printf("(%.4f, %.4f) -> ",pt2.x(), pt2.y());
+ printf("(%.4f, %.4f) \n",pt1.x(), pt1.y());
+
+ cout << "\nPress Enter\n" ;
+ cout.flush();
+ getchar();
+ return 0;
+}
diff --git a/examples/convertCoordinates/convertCoordinates.dsp b/examples/convertCoordinates/convertCoordinates.dsp
new file mode 100644
index 0000000..d8501dc
--- /dev/null
+++ b/examples/convertCoordinates/convertCoordinates.dsp
@@ -0,0 +1,106 @@
+# Microsoft Developer Studio Project File - Name="convertCoordinates" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=convertCoordinates - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "convertCoordinates.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "convertCoordinates.mak" CFG="convertCoordinates - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "convertCoordinates - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "convertCoordinates - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "convertCoordinates - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "convertCoordinates - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "convertCoordinates - Win32 Release"
+# Name "convertCoordinates - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\convertCoordinates.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/convertCoordinates/convertCoordinates.dsw b/examples/convertCoordinates/convertCoordinates.dsw
new file mode 100644
index 0000000..124a217
--- /dev/null
+++ b/examples/convertCoordinates/convertCoordinates.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "convertCoordinates"=".\convertCoordinates.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/convertCoordinates/convertCoordinates.pro b/examples/convertCoordinates/convertCoordinates.pro
new file mode 100644
index 0000000..3b58927
--- /dev/null
+++ b/examples/convertCoordinates/convertCoordinates.pro
@@ -0,0 +1,45 @@
+TEMPLATE = app
+TARGET = convertCoordinates
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ convertCoordinates.cpp
+
+HEADERS += \
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/copyLayer/.cdtproject b/examples/copyLayer/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/copyLayer/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/copyLayer/.project b/examples/copyLayer/.project
new file mode 100644
index 0000000..3dc526b
--- /dev/null
+++ b/examples/copyLayer/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>copyLayer</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/copyLayer/Makefile b/examples/copyLayer/Makefile
new file mode 100644
index 0000000..8920e34
--- /dev/null
+++ b/examples/copyLayer/Makefile
@@ -0,0 +1,23 @@
+all: copyLayer
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+copyLayer: shapelib tiff terralib stat
+ qmake -o makeCopyLayer copyLayer.pro; make -f makeCopyLayer
+
+clean:
+ if \
+ test -f makeCopyLayer; \
+ then \
+ make -f makeCopyLayer distclean; rm -f makeCopyLayer; \
+ fi
\ No newline at end of file
diff --git a/examples/copyLayer/copyLayer.cpp b/examples/copyLayer/copyLayer.cpp
new file mode 100644
index 0000000..ef3f7bd
--- /dev/null
+++ b/examples/copyLayer/copyLayer.cpp
@@ -0,0 +1,88 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This file shows an example of how to duplicate a layer changing its projection.
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeMySQL.h>
+#include <TeLayerFunctions.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Open a connection to a MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ cout << "Database \"" << dbname << "\" connected on MySQL \"localhost\" server!" << endl << endl;
+
+ // Load the layer Distritos by its name
+ TeLayer* layer1 = new TeLayer("Distritos");
+ if (!db->loadLayer(layer1))
+ {
+ cout << "The layer \"Distritos\" could not be loaded from the database!\n\n";
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Layer \"" << layer1->name() << "\" retrieved!" << endl;
+
+ // Show the layer projection
+ TeProjection* proj1 = layer1->projection();
+ cout << "Projection/Datum of the layer \"Distritos\": " << proj1->name();
+ cout << "/" << proj1->datum().name() << endl <<endl;
+
+ // Create a different projection
+ TeDatum sad69 = TeDatumFactory::make("SAD69");
+ TeProjection* proj2 = new TeLatLong(sad69);
+
+ // Create a layer with a different projection
+ TeLayer* layer2 = new TeLayer("Distritos_LL", db, proj2);
+
+ // Copy the layer doing a remapping of its geometries
+ bool res = TeCopyLayerToLayer(layer1, layer2);
+
+ if (res)
+ cout << "Layer \"Distritos\" was successfully copied to layer \"Distritos_LL\"\n\n";
+ else
+ cout << "Fail to remap layer!\n\n";
+
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 0;
+}
diff --git a/examples/copyLayer/copyLayer.dsp b/examples/copyLayer/copyLayer.dsp
new file mode 100644
index 0000000..e5fcc87
--- /dev/null
+++ b/examples/copyLayer/copyLayer.dsp
@@ -0,0 +1,122 @@
+# Microsoft Developer Studio Project File - Name="copyLayer" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=copyLayer - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "copyLayer.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "copyLayer.mak" CFG="copyLayer - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "copyLayer - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "copyLayer - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "copyLayer - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "copyLayer - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "copyLayer - Win32 Release"
+# Name "copyLayer - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\copyLayer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeLayerFunctions.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeLayerFunctions.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/copyLayer/copyLayer.dsw b/examples/copyLayer/copyLayer.dsw
new file mode 100644
index 0000000..1907dea
--- /dev/null
+++ b/examples/copyLayer/copyLayer.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "copyLayer"=".\copyLayer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/copyLayer/copyLayer.pro b/examples/copyLayer/copyLayer.pro
new file mode 100644
index 0000000..4d73380
--- /dev/null
+++ b/examples/copyLayer/copyLayer.pro
@@ -0,0 +1,49 @@
+TEMPLATE = app
+TARGET = copyLayer
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ copyLayer.cpp \
+ ../src/terralib/functions/TeLayerFunctions.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/functions/TeLayerFunctions.h \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createDatabase/.cdtproject b/examples/createDatabase/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createDatabase/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createDatabase/.project b/examples/createDatabase/.project
new file mode 100644
index 0000000..c549545
--- /dev/null
+++ b/examples/createDatabase/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>createDatabase</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/createDatabase/Makefile b/examples/createDatabase/Makefile
new file mode 100644
index 0000000..c883e6e
--- /dev/null
+++ b/examples/createDatabase/Makefile
@@ -0,0 +1,23 @@
+all: createDatabase
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+createDatabase: shapelib tiff terralib stat
+ qmake -o makeCreateDatabase createDatabase.pro; make -f makeCreateDatabase
+
+clean:
+ if \
+ test -f makeCreateDatabase; \
+ then \
+ make -f makeCreateDatabase distclean; rm -f makeCreateDatabase; \
+ fi
\ No newline at end of file
diff --git a/examples/createDatabase/createDatabase.cpp b/examples/createDatabase/createDatabase.cpp
new file mode 100644
index 0000000..0c660e2
--- /dev/null
+++ b/examples/createDatabase/createDatabase.cpp
@@ -0,0 +1,65 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This file shows an example of how to create a TerraLib database called "TerraTeste"
+ in an MySQL DBMS Server running in the local machine, supposing there is an
+ user called "root" with no password.
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeMySQL.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Creates a new database
+ TeDatabase* db = new TeMySQL();
+ if (!db->newDatabase(dbname, user, password, host))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ cout.flush();
+ getchar();
+ return 1;
+ }
+ cout << "The database \"" << dbname;
+ cout << "\" was created successfully in the MySQL server located in \"" << host;
+ cout << "\" for the user named \"" << user << "\" !" << endl;
+
+ // Close database
+ db->close();
+ cout << endl << "Press Enter\n";
+ cout.flush();
+ getchar();
+ return 0;
+}
+
+
+
+
diff --git a/examples/createDatabase/createDatabase.dsp b/examples/createDatabase/createDatabase.dsp
new file mode 100644
index 0000000..7fe906f
--- /dev/null
+++ b/examples/createDatabase/createDatabase.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createDatabase" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createDatabase - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "createDatabase.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "createDatabase.mak" CFG="createDatabase - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "createDatabase - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createDatabase - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "createDatabase - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "createDatabase - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "createDatabase - Win32 Release"
+# Name "createDatabase - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createDatabase.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createDatabase/createDatabase.dsw b/examples/createDatabase/createDatabase.dsw
new file mode 100644
index 0000000..93a869b
--- /dev/null
+++ b/examples/createDatabase/createDatabase.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createDatabase"=".\createDatabase.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createDatabase/createDatabase.pro b/examples/createDatabase/createDatabase.pro
new file mode 100644
index 0000000..bc8cadc
--- /dev/null
+++ b/examples/createDatabase/createDatabase.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createDatabase
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ createDatabase.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createLayer/.cdtproject b/examples/createLayer/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createLayer/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createLayer/.project b/examples/createLayer/.project
new file mode 100644
index 0000000..eba638a
--- /dev/null
+++ b/examples/createLayer/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>createLayer</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/createLayer/Makefile b/examples/createLayer/Makefile
new file mode 100644
index 0000000..424dccc
--- /dev/null
+++ b/examples/createLayer/Makefile
@@ -0,0 +1,23 @@
+all: createLayer
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+createLayer: shapelib tiff terralib stat
+ qmake -o makeCreateLayer createLayer.pro; make -f makeCreateLayer
+
+clean:
+ if \
+ test -f makeCreateLayer; \
+ then \
+ make -f makeCreateLayer distclean; rm -f makeCreateLayer; \
+ fi
\ No newline at end of file
diff --git a/examples/createLayer/createLayer.cpp b/examples/createLayer/createLayer.cpp
new file mode 100644
index 0000000..6a6e44f
--- /dev/null
+++ b/examples/createLayer/createLayer.cpp
@@ -0,0 +1,298 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows an example of how to create a layer in a MySQL TerraLib database,
+ and insert some vectorial data in this new layer.
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeMySQL.h>
+
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Opens a connection to a database accessible though ADO
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";
+
+ // Creates a projection
+ TeDatum mDatum = TeDatumFactory::make("SAD69");
+ TeProjection* pUTM = new TeUtm(mDatum,0.0);
+
+ // Create a new layer called "TesteLayer"
+ string layerName = "TesteLayer";
+ if (db->layerExist(layerName))
+ {
+ cout << "There is already a layer named \"TesteLayer\" in the TerraLib database!\n\n";
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ TeLayer* layer = new TeLayer(layerName, db, pUTM);
+ if (layer->id() <= 0) // layer wasn�t created properly
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Add the geometry representation LINES and store it in a table called "TesteLayerLines"
+ if (!layer->addGeometry(TeLINES, "TesteLayerLines"))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Create a set of lines
+ TeLine2D reta;
+ reta.add(TeCoord2D(500,500));
+ reta.add(TeCoord2D(600,500));
+ reta.add(TeCoord2D(700,500));
+ reta.objectId("reta");
+
+ TeLine2D ele;
+ ele.add(TeCoord2D(500,600));
+ ele.add(TeCoord2D(600,600));
+ ele.add(TeCoord2D(700,700));
+ ele.add(TeCoord2D(800,600));
+ ele.add(TeCoord2D(900,600));
+ ele.objectId("ele");
+
+ TeLineSet ls;
+ ls.add(reta);
+ ls.add(ele);
+
+ // Add the line set to the layer
+ if (!layer->addLines(ls))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ else
+ cout << "Lines inserted to the new layer!\n";
+
+ // Creates a set of polygons
+ // A simple polygon
+ TeLine2D line;
+ line.add(TeCoord2D(900,900));
+ line.add(TeCoord2D(900,1000));
+ line.add(TeCoord2D(1000,1000));
+ line.add(TeCoord2D(1000,900));
+ line.add(TeCoord2D(900,900));
+
+ TeLinearRing r1(line);
+ TePolygon poly1;
+ poly1.add(r1);
+ poly1.objectId("spoli");
+
+ // A polygon with a hole
+ TeLine2D line2;
+ line2.add(TeCoord2D(200,200));
+ line2.add(TeCoord2D(200,400));
+ line2.add(TeCoord2D(400,400));
+ line2.add(TeCoord2D(400,200));
+ line2.add(TeCoord2D(200,200));
+
+ TeLinearRing r2(line2);
+
+ TeLine2D line3;
+ line3.add(TeCoord2D(250,250));
+ line3.add(TeCoord2D(250,300));
+ line3.add(TeCoord2D(300,300));
+ line3.add(TeCoord2D(300,250));
+ line3.add(TeCoord2D(250,250));
+
+ TeLinearRing r3(line3);
+
+ TePolygon poly2;
+ poly2.add(r2);
+ poly2.add(r3);
+ poly2.objectId("cpoli");
+
+ TePolygonSet ps;
+ ps.add(poly1);
+ ps.add(poly2);
+
+ // Add the polygon set to the layer
+ // As addGeometry wasn�t called before, the table of polygons will have a default name
+ if (!layer->addPolygons(ps))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ else
+ cout << "Polygons inserted in the new layer!\n";
+
+ // Create a set of points
+ TePoint p1(40,40);
+ p1.objectId("ponto1");
+ TePoint p2(65,65);
+ p2.objectId("ponto2");
+
+ TePointSet pos;
+ pos.add(p1);
+ pos.add(p2);
+
+ // Add the point set to the layer
+ // As addGeometry wasn�t called before, the table of points will have a default name
+ if (!layer->addPoints(pos))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ else
+ cout << "Points inserted in the new layer!\n";
+
+ // Create an attribute table
+ // Define a list of attributes
+ TeAttributeList attList;
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.numChar_ = 16;
+ at.rep_.name_ = "object_id";
+ at.rep_.isPrimaryKey_ = true;
+ attList.push_back(at);
+
+ at.rep_.type_ = TeSTRING; // a string attribute
+ at.rep_.numChar_ = 255;
+ at.rep_.name_ = "nome";
+ at.rep_.isPrimaryKey_ = false;
+ attList.push_back(at);
+
+ at.rep_.type_ = TeREAL; // a float attribute
+ at.rep_.name_ = "val1";
+ at.rep_.isPrimaryKey_ = false;
+ attList.push_back(at);
+
+ at.rep_.type_ = TeINT; // an integer attribute
+ at.rep_.name_ = "val2";
+ at.rep_.isPrimaryKey_ = false;
+ attList.push_back(at);
+
+ // Create an attribute table associated to the new layer, called "TesteLayerAttr"
+ TeTable attTable("TesteLayerAttr", attList, "object_id", "object_id"); // creates a table in memory
+ if (!layer->createAttributeTable(attTable))
+ {
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Each row is related to one of the geometries by its objetc_id
+ TeTableRow row;
+ row.push_back("reta");
+ row.push_back("An straight line");
+ row.push_back("11.1");
+ row.push_back("11");
+ attTable.add(row);
+ row.clear();
+
+ row.push_back("ele");
+ row.push_back("A mountain shaped line");
+ row.push_back("22.2");
+ row.push_back("22");
+ attTable.add(row);
+ row.clear();
+
+ row.push_back("spoli");
+ row.push_back("A simple polygon");
+ row.push_back("33.3");
+ row.push_back("33");
+ attTable.add(row);
+
+ row.clear();
+ row.push_back("ponto1");
+ row.push_back("A point");
+ row.push_back("55.5");
+ row.push_back("55");
+ attTable.add(row);
+ row.clear();
+
+ row.push_back("ponto2");
+ row.push_back("Another point");
+ row.push_back("66.6");
+ row.push_back("66");
+ attTable.add(row);
+ row.clear();
+
+ row.push_back("cpoli");
+ row.push_back("A polygon with hole");
+ row.push_back("44.4");
+ row.push_back("44");
+ attTable.add(row);
+ row.clear();
+
+ // Saves the table in the database
+ if (!layer->saveAttributeTable( attTable ))
+ {
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ else
+ cout << "Objects inserted in the new layer!\n\n";
+
+ // Close database
+ db->close();
+ cout << "Press Enter\n";
+ cout.flush();
+ getchar();
+ return 0;
+}
+
diff --git a/examples/createLayer/createLayer.dsp b/examples/createLayer/createLayer.dsp
new file mode 100644
index 0000000..86ea6b4
--- /dev/null
+++ b/examples/createLayer/createLayer.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createLayer" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createLayer - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "createLayer.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "createLayer.mak" CFG="createLayer - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "createLayer - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createLayer - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "createLayer - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "createLayer - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "createLayer - Win32 Release"
+# Name "createLayer - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createLayer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createLayer/createLayer.dsw b/examples/createLayer/createLayer.dsw
new file mode 100644
index 0000000..74d2e1b
--- /dev/null
+++ b/examples/createLayer/createLayer.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "createLayer"=".\createLayer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createLayer/createLayer.pro b/examples/createLayer/createLayer.pro
new file mode 100644
index 0000000..3b1bb3d
--- /dev/null
+++ b/examples/createLayer/createLayer.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createLayer
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ createLayer.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createProximityMatrix/.cdtproject b/examples/createProximityMatrix/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createProximityMatrix/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createProximityMatrix/.project b/examples/createProximityMatrix/.project
new file mode 100644
index 0000000..ec93901
--- /dev/null
+++ b/examples/createProximityMatrix/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>createProximityMatrix</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/createProximityMatrix/Makefile b/examples/createProximityMatrix/Makefile
new file mode 100644
index 0000000..d969fd8
--- /dev/null
+++ b/examples/createProximityMatrix/Makefile
@@ -0,0 +1,23 @@
+all: createProximityMatrix
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+createProximityMatrix: shapelib tiff terralib stat
+ qmake -o makeCreateProximityMatrix createProximityMatrix.pro; make -f makeCreateProximityMatrix
+
+clean:
+ if \
+ test -f makeCreateProximityMatrix; \
+ then \
+ make -f makeCreateProximityMatrix distclean; rm -f makeCreateProximityMatrix; \
+ fi
\ No newline at end of file
diff --git a/examples/createProximityMatrix/createProximityMatrix.cpp b/examples/createProximityMatrix/createProximityMatrix.cpp
new file mode 100644
index 0000000..49eb34b
--- /dev/null
+++ b/examples/createProximityMatrix/createProximityMatrix.cpp
@@ -0,0 +1,131 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file illustrates an example of how to create a proximity matrix from a
+ Spatial Temporal Element Set (STElementSet).
+ In this example, the distance strategy is used to construct the matrix.
+
+ Author: Karine Reis
+*/
+
+#include <TeSTElementSet.h>
+#include <TeSTEFunctionsDB.h>
+#include <TeInitQuerierStrategy.h>
+#include <TeGeneralizedProxMatrix.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraLib";
+ string user = "root";
+ string password = "ferreira";
+
+ // Open a connection to the TerraTeste MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+
+ // Opens a connection to a TerraLib database
+ // Loads a layer named DistritosSP
+ TeLayer* DistritosSP = new TeLayer("DistritosSP");
+ if (!db->loadLayer(DistritosSP))
+ {
+ cout << "Fail to load the layer!" << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Inits querier strategies
+ TeInitQuerierStrategies();
+
+ // Creates a STElementSet from DistritosSP layer
+ TeSTElementSet steSet(DistritosSP);
+
+ // Builds the STElementSet with geometries
+ if(!TeSTOSetBuildDB(&steSet, true, false))
+ {
+ cout << "Error! " << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Shows how many elements the elementSet has
+ cout << "Number of elements: " << steSet.numElements() << endl;
+
+
+ // Builds the proximity matrix
+ TeGeneralizedProxMatrix proxMat;
+
+ TeProxMatrixLocalDistanceStrategy sc_dist (&steSet, TePOLYGONS, 12000.00);
+ TeProxMatrixNoWeightsStrategy sw_no;
+ TeProxMatrixNoSlicingStrategy ss_no;
+
+ proxMat.setCurrentSlicingStrategy(&ss_no);
+ proxMat.setCurrentWeightsStrategy(&sw_no);
+ proxMat.setCurrentConstructionStrategy(&sc_dist);
+
+ if(!proxMat.ConstructMatrix())
+ {
+ cout << "Error building proximity matrix! " << endl;
+ getchar();
+ db->close ();
+ return 0;
+ }
+
+ // Shows the neighbours of each object from proxMat
+ TeSTElementSet::iterator it = steSet.begin();
+ while ( it != steSet.end())
+ {
+ cout<< " The neighbours of the element "<< (*it).objectId() << " are: " << endl;
+
+ // Gets the neighbours of an element
+ TeNeighboursMap neighbors = proxMat.getMapNeighbours((*it).objectId());
+ TeNeighboursMap::iterator itN = neighbors.begin();
+ while (itN != neighbors.end())
+ {
+ cout<< " "<<(*itN).first << endl;
+ ++itN;
+ }
+ cout << endl;
+ ++it;
+ }
+
+
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 0;
+}
diff --git a/examples/createProximityMatrix/createProximityMatrix.dsp b/examples/createProximityMatrix/createProximityMatrix.dsp
new file mode 100644
index 0000000..cc7ba19
--- /dev/null
+++ b/examples/createProximityMatrix/createProximityMatrix.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createProximityMatrix" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createProximityMatrix - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "createProximityMatrix.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "createProximityMatrix.mak" CFG="createProximityMatrix - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "createProximityMatrix - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createProximityMatrix - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "createProximityMatrix - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "createProximityMatrix - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "createProximityMatrix - Win32 Release"
+# Name "createProximityMatrix - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createProximityMatrix.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createProximityMatrix/createProximityMatrix.dsw b/examples/createProximityMatrix/createProximityMatrix.dsw
new file mode 100644
index 0000000..7f285c2
--- /dev/null
+++ b/examples/createProximityMatrix/createProximityMatrix.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createProximityMatrix"=".\createProximityMatrix.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createProximityMatrix/createProximityMatrix.pro b/examples/createProximityMatrix/createProximityMatrix.pro
new file mode 100644
index 0000000..49a7bba
--- /dev/null
+++ b/examples/createProximityMatrix/createProximityMatrix.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createProximityMatrix
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ createProximityMatrix.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createSTElementSet/.cdtproject b/examples/createSTElementSet/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createSTElementSet/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createSTElementSet/.project b/examples/createSTElementSet/.project
new file mode 100644
index 0000000..6fb5fcc
--- /dev/null
+++ b/examples/createSTElementSet/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>createSTElementSet</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/createSTElementSet/Makefile b/examples/createSTElementSet/Makefile
new file mode 100644
index 0000000..596d1eb
--- /dev/null
+++ b/examples/createSTElementSet/Makefile
@@ -0,0 +1,23 @@
+all: createSTElementSet
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+createSTElementSet: shapelib tiff terralib stat
+ qmake -o makeCreateSTElementSet createSTElementSet.pro; make -f makeCreateSTElementSet
+
+clean:
+ if \
+ test -f makeCreateSTElementSet; \
+ then \
+ make -f makeCreateSTElementSet distclean; rm -f makeCreateSTElementSet; \
+ fi
\ No newline at end of file
diff --git a/examples/createSTElementSet/createSTElementSet.cpp b/examples/createSTElementSet/createSTElementSet.cpp
new file mode 100644
index 0000000..5e865c2
--- /dev/null
+++ b/examples/createSTElementSet/createSTElementSet.cpp
@@ -0,0 +1,104 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file illustrates an example of how to create a new Spatial Temporal Element
+ Set (STElementSet) from a theme. A Spatial Temporal Element Set can be created
+ from a layer or from a theme.
+ In this example the STElementSet is created from a layer and is filled only
+ with attributes.
+
+ Author: Karine Reis
+*/
+
+#include <TeInitQuerierStrategy.h>
+#include <TeQuerierParams.h>
+#include <TeQuerier.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraLib";
+ string user = "root";
+ string password = "ferreira";
+
+ // Open a connection to the TerraTeste MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+ TeTheme* trmsp = new TeTheme("DistritosSP");
+ if (!db->loadTheme(trmsp))
+ {
+ cout << "Fail to load the theme \"T_dist\": " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ TeInitQuerierStrategies();
+
+ // Defines the attributes that will be kept in the STElementSet.
+ // The attribute name must be in the format "table_name.attribute_name"
+ vector<string> attrs;
+ attrs.push_back("DistritosSP.Nome");
+ attrs.push_back("DistritosSP.Populac");
+
+ // Define the parameters of the querier
+ TeQuerierParams qpar(false, attrs);
+ qpar.setParams(trmsp);
+
+ // Define a querier to the database
+ TeQuerier qdb(qpar);
+ qdb.loadInstances();
+
+ // Show how many instances the querier found
+ cout << "Number of instances: " << qdb.numElemInstances() << endl;
+
+ // Loop through all of the instances
+ TeSTInstance steInstance;
+ while (qdb.fetchInstance(steInstance))
+ {
+ string sigla, pop;
+ steInstance.getPropertyValue("DistritosSP.Nome", sigla);
+ steInstance.getPropertyValue("DistritosSP.Populac", pop);
+
+ cout << " Object Identifier : "<< steInstance.objectId() << endl;
+ cout << " Sigla : "<< sigla << endl;
+ cout << " Renda : "<< pop << endl << endl;
+ }
+
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 0;
+}
diff --git a/examples/createSTElementSet/createSTElementSet.dsp b/examples/createSTElementSet/createSTElementSet.dsp
new file mode 100644
index 0000000..4d182a9
--- /dev/null
+++ b/examples/createSTElementSet/createSTElementSet.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createSTElementSet" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createSTElementSet - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "createSTElementSet.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "createSTElementSet.mak" CFG="createSTElementSet - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "createSTElementSet - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createSTElementSet - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "createSTElementSet - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "createSTElementSet - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "createSTElementSet - Win32 Release"
+# Name "createSTElementSet - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createSTElementSet.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createSTElementSet/createSTElementSet.dsw b/examples/createSTElementSet/createSTElementSet.dsw
new file mode 100644
index 0000000..1dffefa
--- /dev/null
+++ b/examples/createSTElementSet/createSTElementSet.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createSTElementSet"=".\createSTElementSet.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createSTElementSet/createSTElementSet.pro b/examples/createSTElementSet/createSTElementSet.pro
new file mode 100644
index 0000000..95e757b
--- /dev/null
+++ b/examples/createSTElementSet/createSTElementSet.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createSTElementSet
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ createSTElementSet.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createSTElementSetFromLayer/.cdtproject b/examples/createSTElementSetFromLayer/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createSTElementSetFromLayer/.project b/examples/createSTElementSetFromLayer/.project
new file mode 100644
index 0000000..04c5800
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>createSTElementSetFromLayer</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/createSTElementSetFromLayer/Makefile b/examples/createSTElementSetFromLayer/Makefile
new file mode 100644
index 0000000..2f7a78d
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/Makefile
@@ -0,0 +1,23 @@
+all: createSTElementSetFromLayer
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+createSTElementSetFromLayer: shapelib tiff terralib stat
+ qmake -o makeCreateSTElementSetFromLayer createSTElementSetFromLayer.pro; make -f makeCreateSTElementSetFromLayer
+
+clean:
+ if \
+ test -f makeCreateSTElementSetFromLayer; \
+ then \
+ make -f makeCreateSTElementSetFromLayer distclean; rm -f makeCreateSTElementSetFromLayer; \
+ fi
\ No newline at end of file
diff --git a/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.cpp b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.cpp
new file mode 100644
index 0000000..810b38b
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.cpp
@@ -0,0 +1,120 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file illustrates an example of how to create a new Spatial Temporal Element
+ Set (STElementSet) from a layer. A Spatial Temporal Element Set can be created
+ from a layer or from a theme.
+ In this example the STElementSet is created from a layer and is filled only
+ with some attributes.
+
+ Author: Karine Reis
+*/
+
+#include <TeSTElementSet.h>
+#include <TeSTEFunctionsDB.h>
+#include <TeInitQuerierStrategy.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraLib";
+ string user = "root";
+ string password = "ferreira";
+
+ // Open a connection to the TerraTeste MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+ // Loads the layer
+ TeLayer* estados = new TeLayer("EstadosBrasil");
+ if (!db->loadLayer(estados))
+ {
+ cout << "Fail to load the layer \"EstadosBrasil\": " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Inits querier strategies
+ TeInitQuerierStrategies();
+
+ // Creates a elementSet from the layer "estados"
+ TeSTElementSet steSet (estados);
+
+ // Defines what attributes will be kept in the elementSet.
+ // The attribute name must be in the format "table_name.attribute_name"
+ vector<string> attrs;
+ attrs.push_back("EstadosBrasil.NOME_UF");
+ attrs.push_back("EstadosBrasil.CAPITAL");
+
+ // Fills the elementSet without geometries and with the
+ // attributes NOME_UF and CAPITAL
+ bool loadGeometries = false;
+ bool loadAllAttributes = false;
+ if(!TeSTOSetBuildDB(&steSet, loadGeometries, loadAllAttributes, attrs))
+ {
+ cout << "Error! " << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Prints the number of elements of the elementSet
+ cout << "Number of elements: " << steSet.numElements() << endl;
+
+
+ TeSTElementSet::iterator it = steSet.begin();
+ while ( it != steSet.end())
+ {
+ TeSTInstance st = (*it);
+
+ string desc;
+ // returns the attributes
+ TePropertyVector vectp = st.getPropertyVector();
+
+ cout << "Id: " << st.objectId() << " ---------------- " << endl;
+ for (unsigned int i=0; i<vectp.size(); i++)
+ {
+ cout << vectp[i].attr_.rep_.name_ << " = ";
+ cout << vectp[i].value_ << endl;
+ }
+ cout << endl;
+ ++it;
+ }
+
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 0;
+}
diff --git a/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.dsp b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.dsp
new file mode 100644
index 0000000..54d6bb3
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createSTElementSetFromLayer" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createSTElementSetFromLayer - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "createSTElementSetFromLayer.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "createSTElementSetFromLayer.mak" CFG="createSTElementSetFromLayer - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "createSTElementSetFromLayer - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createSTElementSetFromLayer - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "createSTElementSetFromLayer - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "createSTElementSetFromLayer - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "createSTElementSetFromLayer - Win32 Release"
+# Name "createSTElementSetFromLayer - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createSTElementSetFromLayer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.dsw b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.dsw
new file mode 100644
index 0000000..4b25b14
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createSTElementSetFromLayer"=".\createSTElementSetFromLayer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.pro b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.pro
new file mode 100644
index 0000000..30cc298
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createSTElementSetFromLayer
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ createSTElementSetFromLayer.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createSTElementSetFromShapeFile/.cdtproject b/examples/createSTElementSetFromShapeFile/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createSTElementSetFromShapeFile/.project b/examples/createSTElementSetFromShapeFile/.project
new file mode 100644
index 0000000..35c9993
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>createSTElementSetFromShapeFile</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/createSTElementSetFromShapeFile/Makefile b/examples/createSTElementSetFromShapeFile/Makefile
new file mode 100644
index 0000000..90879dc
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/Makefile
@@ -0,0 +1,23 @@
+all: createSTElementSetFromShapeFile
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+createSTElementSetFromShapeFile: shapelib tiff terralib stat
+ qmake -o makeCreateSTElementSetFromShapeFile createSTElementSetFromShapeFile.pro; make -f makeCreateSTElementSetFromShapeFile
+
+clean:
+ if \
+ test -f makeCreateSTElementSetFromShapeFile; \
+ then \
+ make -f makeCreateSTElementSetFromShapeFile distclean; rm -f makeCreateSTElementSetFromShapeFile; \
+ fi
\ No newline at end of file
diff --git a/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.cpp b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.cpp
new file mode 100644
index 0000000..6a7ccef
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.cpp
@@ -0,0 +1,76 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This file illustrates an example of how to create a new Spatial Temporal Element
+ Set (STElementSet) from a shapefile.
+
+ Author: Karine Reis Ferreira
+*/
+
+
+#include <TeSTElementSet.h>
+#include <TeSTEFunctionsSHP.h>
+#include <TeMySQL.h>
+
+int
+main()
+{
+
+ // shape file name with its path
+ string filename = "../../examples/data/EstadosBrasil.shp";
+
+ TeSTElementSet steSet;
+
+ // fills the element set from shape file
+ if (!TeSTOSetBuildSHP(steSet,filename))
+ {
+ cout << "Erro\n";
+ return 1;
+ }
+
+ // prints the number of elements of the element set
+ cout << "Number of elements: " << steSet.numElements() << endl;
+
+ TeSTElementSet::iterator it = steSet.begin();
+ while ( it != steSet.end())
+ {
+ TeSTInstance st = (*it);
+
+ string desc;
+ // returns the attributes
+ TePropertyVector vectp = st.getPropertyVector();
+
+ cout << "Id: " << st.objectId() << "\nProperties:\n ";
+ for (unsigned int i=0; i<vectp.size(); i++)
+ {
+ cout << vectp[i].attr_.rep_.name_ << " = ";
+ cout << vectp[i].value_ << endl;
+ }
+ cout << endl;
+ ++it;
+ }
+ cout << "End\n";
+ cout.flush();
+ getchar();
+ return 0;
+}
diff --git a/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.dsp b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.dsp
new file mode 100644
index 0000000..fcefc4e
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.dsp
@@ -0,0 +1,130 @@
+# Microsoft Developer Studio Project File - Name="createSTElementSetFromShapeFile" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createSTElementSetFromShapeFile - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "createSTElementSetFromShapeFile.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "createSTElementSetFromShapeFile.mak" CFG="createSTElementSetFromShapeFile - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "createSTElementSetFromShapeFile - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createSTElementSetFromShapeFile - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "createSTElementSetFromShapeFile - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "createSTElementSetFromShapeFile - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "createSTElementSetFromShapeFile - Win32 Release"
+# Name "createSTElementSetFromShapeFile - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createSTElementSetFromShapeFile.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeSTEFunctionsSHP.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeSTEFunctionsSHP.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.dsw b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.dsw
new file mode 100644
index 0000000..3f4dfc7
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createSTElementSetFromShapeFile"=".\createSTElementSetFromShapeFile.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.pro b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.pro
new file mode 100644
index 0000000..42a59ab
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.pro
@@ -0,0 +1,51 @@
+TEMPLATE = app
+TARGET = createSTElementSetFromShapeFile
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ createSTElementSetFromShapeFile.cpp \
+ ../src/terralib/functions/TeImportDBF.cpp \
+ ../src/terralib/functions/TeSTEFunctionsSHP.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/functions/TeImportExport.h \
+ ../src/terralib/functions/TeSTEFunctionsSHP.h \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createSTElementSetFromTheme/.cdtproject b/examples/createSTElementSetFromTheme/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createSTElementSetFromTheme/.project b/examples/createSTElementSetFromTheme/.project
new file mode 100644
index 0000000..1f4381d
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>createSTElementSetFromTheme</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/createSTElementSetFromTheme/Makefile b/examples/createSTElementSetFromTheme/Makefile
new file mode 100644
index 0000000..ce3c22a
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/Makefile
@@ -0,0 +1,23 @@
+all: createSTElementSetFromTheme
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+createSTElementSetFromTheme: shapelib tiff terralib stat
+ qmake -o makeCreateSTElementSetFromTheme createSTElementSetFromTheme.pro; make -f makeCreateSTElementSetFromTheme
+
+clean:
+ if \
+ test -f makeCreateSTElementSetFromTheme; \
+ then \
+ make -f makeCreateSTElementSetFromTheme distclean; rm -f makeCreateSTElementSetFromTheme; \
+ fi
\ No newline at end of file
diff --git a/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.cpp b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.cpp
new file mode 100644
index 0000000..cae45f4
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.cpp
@@ -0,0 +1,147 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file illustrates an example of how to create a new Spatial Temporal Element
+ Set (STElementSet) from a theme. A Spatial Temporal Element Set can be created
+ from a layer or from a theme.
+ This example creates a theme with spatial and attribute restrictions and fills
+ a STElementSet from this created theme with all attributes and geometries.
+
+ Author: Karine Reis
+*/
+
+#include <TeSTElementSet.h>
+#include <TeSTEFunctionsDB.h>
+#include <TeInitQuerierStrategy.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraLib";
+ string user = "root";
+ string password = "ferreira";
+
+ // Open a connection to the TerraTeste MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+ // Loads the layer
+ TeLayer* bairrosPA = new TeLayer("BairrosPoA");
+ if (!db->loadLayer(bairrosPA))
+ {
+ cout << "Fail to load the layer!" << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Loads the geometry of Santo Antonio district (id = 48)
+ TePolygonSet ps;
+ bairrosPA->loadGeometrySet("48", ps);
+
+ // Loads a layer named OcorrenciaPoA
+ TeLayer* OcorrenciaPoA = new TeLayer("OcorrenciasPoA");
+ if (!db->loadLayer(OcorrenciaPoA))
+ {
+ cout << "Fail to load the layer!" << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Create a theme with retrictions from Ocorrencias layer, in memory
+ TeTheme* Ocorrencias = new TeTheme("Ocorrencias", OcorrenciaPoA);
+ TeAttrTableVector attrTables;
+ OcorrenciaPoA->getAttrTables(attrTables);
+ Ocorrencias->setAttTables(attrTables);
+
+ //spatial restriction: within Santo Antonio district
+ Ocorrencias->setSpatialRest (&ps, TePOINTS, TeWITHIN);
+ //attribute restriction: type "amea�a"
+ Ocorrencias->attributeRest(" EVENTO = 'Amea�a' ");
+
+ // Inits querier strategies
+ TeInitQuerierStrategies();
+
+ // Creates a elementSet from theme
+ TeSTElementSet steSet(Ocorrencias);
+
+ // Builds the elementSet with geometries and all attributes
+ bool loadGeometries = true;
+ bool loadAllAttributes = true;
+ if(!TeSTOSetBuildDB(&steSet, loadGeometries, loadAllAttributes))
+ {
+ cout << "Error! " << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Shows how many elements the elementSet has
+ cout << "Number of elements: " << steSet.numElements() << endl;
+
+ TeSTElementSet::iterator it = steSet.begin();
+ while ( it != steSet.end())
+ {
+ TeSTInstance st = (*it);
+
+ //Gets attribute value
+ string event;
+ st.getPropertyValue("EVENTO", event);
+
+ cout << " Object Identifier : " << st.objectId() << endl;
+ cout << " Event : " << event << endl ;
+
+ //Gets geometry
+ if(st.hasPoints())
+ {
+ TePointSet pset;
+ st.getGeometry (pset);
+ cout<< " point id: "<< pset[0].objectId () << endl;
+ for(unsigned int j=0; j<pset.size (); ++j)
+ {
+ string point = Te2String(pset[j].location().x()) +";"+ Te2String(pset[j].location().y());
+ cout<< " point: " << " ("+ point + ") " <<endl << endl;
+ }
+ }
+ ++it;
+ }
+
+ db->close();
+ delete (Ocorrencias);
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 0;
+}
diff --git a/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.dsp b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.dsp
new file mode 100644
index 0000000..432296a
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createSTElementSetFromTheme" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createSTElementSetFromTheme - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "createSTElementSetFromTheme.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "createSTElementSetFromTheme.mak" CFG="createSTElementSetFromTheme - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "createSTElementSetFromTheme - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createSTElementSetFromTheme - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "createSTElementSetFromTheme - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "createSTElementSetFromTheme - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "createSTElementSetFromTheme - Win32 Release"
+# Name "createSTElementSetFromTheme - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createSTElementSetFromTheme.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.dsw b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.dsw
new file mode 100644
index 0000000..f73c38d
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createSTElementSetFromTheme"=".\createSTElementSetFromTheme.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.pro b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.pro
new file mode 100644
index 0000000..4579446
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createSTElementSetFromTheme
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ createSTElementSetFromTheme.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createTable/.cdtproject b/examples/createTable/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createTable/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createTable/.project b/examples/createTable/.project
new file mode 100644
index 0000000..5c5761f
--- /dev/null
+++ b/examples/createTable/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>createTable</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/createTable/Makefile b/examples/createTable/Makefile
new file mode 100644
index 0000000..580198d
--- /dev/null
+++ b/examples/createTable/Makefile
@@ -0,0 +1,23 @@
+all: createTable
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+createTable: shapelib tiff terralib stat
+ qmake -o makeCreateTable createTable.pro; make -f makeCreateTable
+
+clean:
+ if \
+ test -f makeCreateTable; \
+ then \
+ make -f makeCreateTable distclean; rm -f makeCreateTable; \
+ fi
\ No newline at end of file
diff --git a/examples/createTable/createTable.cpp b/examples/createTable/createTable.cpp
new file mode 100644
index 0000000..e43fa40
--- /dev/null
+++ b/examples/createTable/createTable.cpp
@@ -0,0 +1,211 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This file illustrates how to execute some operations relative to attribute tables
+ in a MySQL TerraLib database:
+ - how to create an attribute table;
+ - how to add some columns;
+ - how to insert same data into it;
+ - how to retrieve some rows using an SQL.
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeTable.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Open a connection to the TerraTeste MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+ // Create a table called "TesteTable"
+ string tableName = "TesteTable";
+ if (db->tableExist(tableName))
+ {
+ cout << "There is already a table named \"TesteTable\" in the TerraLib database!\n";
+ cout << "Some data will be retrieved from the table already created:\n\n";
+ }
+ else
+ {
+ // 1) Create a table
+
+ TeAttributeList attList;
+ TeAttribute at;
+ at.rep_.name_= "IntCol";
+ at.rep_.type_ = TeINT;
+ at.rep_.isPrimaryKey_ = true;
+
+ attList.push_back(at);
+
+ if (!db->createTable(tableName, attList))
+ {
+ cout << "Fail to create the table: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ //2) Add new columns to the table
+
+ TeAttribute atr;
+ atr.rep_.name_= "TimeCol";
+ atr.rep_.type_ = TeDATETIME;
+ atr.dateTimeFormat_ = "DDsMMsYYYYsHHsmmsSS";
+ atr.dateChronon_ = TeSECOND;
+ atr.timeSeparator_ = ":";
+ atr.dateSeparator_ = "/";
+ attList.push_back(atr);
+
+ if (!db->addColumn(tableName, atr.rep_))
+ {
+ cout << "Fail to add the column \"TimeCol\" to the table: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ atr.rep_.name_= "RealCol";
+ atr.rep_.type_ = TeREAL;
+ atr.rep_.numChar_ = 15;
+ atr.rep_.decimals_ = 4;
+ attList.push_back(atr);
+
+ if (!db->addColumn(tableName, atr.rep_))
+ {
+ cout << "Fail to add the column \"RealCol\" to the table: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ atr.rep_.name_= "StringCol";
+ atr.rep_.type_ = TeSTRING;
+ atr.rep_.numChar_ = 10;
+ attList.push_back(atr);
+
+ if (!db->addColumn(tableName, atr.rep_))
+ {
+ cout << "Fail to add the column \"StringCol\" to the table: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ //3) Add two new rows to the table
+
+ TeTable table(tableName, attList, ""); // creates a table in memory
+
+ TeTableRow row1; // fill some rows
+ row1.push_back("1");
+ row1.push_back("25/4/2003 07:14");
+ row1.push_back("15.23");
+ row1.push_back("object1");
+ table.add(row1);
+
+ TeTableRow row2;
+ row2.push_back("2");
+ row2.push_back("01/03/1975 21:30:15");
+ row2.push_back("56.87");
+ row2.push_back("object2");
+ table.add(row2);
+
+ if (!db->insertTable(table)) // save the table into the database
+ {
+ cout << "Fail to save the table: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ }
+
+ // 4) Retrieve some data from the table using a SQL query
+ TeDatabasePortal* portal = db->getPortal();
+ if (!portal)
+ {
+ cout << "Fail to get a portal fom the database: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ string sql = "SELECT * FROM " + tableName;
+
+ if (portal->query(sql) == false)
+ {
+ cout << "Fail to submit the query: " << db->errorMessage() << endl;
+ delete portal;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Retrieve the attributes from the table
+ int count = 1;
+ while (portal->fetchRow())
+ {
+ cout << "Row : " << count << endl;
+ int intAttribute = atoi(portal->getData(0));
+ cout << "Integer attribute: " << intAttribute << endl;
+
+ TeTime t = portal->getDate(1);
+ cout << "Time attribute: " ;
+ cout << t.getDateTime("DDsMMsYYYYsHHsmmsSS") << " or " << t.getDateTime("YYYYsMMsDDsHHsmmsSS") << endl;
+
+ cout << "Double attribute: " ;
+ double d = portal->getDouble(2);
+ cout << d << endl;
+
+ cout << "String attribute: ";
+ string x = portal->getData(3);
+ cout << x << endl << endl;
+ count++;
+ }
+
+ delete portal;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 0;
+}
diff --git a/examples/createTable/createTable.dsp b/examples/createTable/createTable.dsp
new file mode 100644
index 0000000..f2830bd
--- /dev/null
+++ b/examples/createTable/createTable.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createTable" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createTable - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "createTable.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "createTable.mak" CFG="createTable - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "createTable - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createTable - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "createTable - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "createTable - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "createTable - Win32 Release"
+# Name "createTable - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createTable.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createTable/createTable.dsw b/examples/createTable/createTable.dsw
new file mode 100644
index 0000000..d065a6c
--- /dev/null
+++ b/examples/createTable/createTable.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createTable"=".\createTable.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createTable/createTable.pro b/examples/createTable/createTable.pro
new file mode 100644
index 0000000..9222d75
--- /dev/null
+++ b/examples/createTable/createTable.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createTable
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ createTable.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createTheme/.cdtproject b/examples/createTheme/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createTheme/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createTheme/.project b/examples/createTheme/.project
new file mode 100644
index 0000000..a70d613
--- /dev/null
+++ b/examples/createTheme/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>createTheme</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/createTheme/Makefile b/examples/createTheme/Makefile
new file mode 100644
index 0000000..3d8e7f1
--- /dev/null
+++ b/examples/createTheme/Makefile
@@ -0,0 +1,23 @@
+all: createTheme
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+createTheme: shapelib tiff terralib stat
+ qmake -o makeCreateTheme createTheme.pro; make -f makeCreateTheme
+
+clean:
+ if \
+ test -f makeCreateTheme; \
+ then \
+ make -f makeCreateTheme distclean; rm -f makeCreateTheme; \
+ fi
\ No newline at end of file
diff --git a/examples/createTheme/createTheme.cpp b/examples/createTheme/createTheme.cpp
new file mode 100644
index 0000000..bab0582
--- /dev/null
+++ b/examples/createTheme/createTheme.cpp
@@ -0,0 +1,184 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file illustrates how to create themes in a TerraLib database
+
+ Authors: Karine Reis Ferreira and Lubia Vinhas
+*/
+
+#include <TeLegendEntry.h>
+#include <TeMySQL.h>
+
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Open a connection to the TerraTeste MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+ // Load the layer "Distritos" which contains data of the districts of the Sao Paulo city
+ TeLayer* dist = new TeLayer("Distritos");
+ if (!db->loadLayer(dist))
+ {
+ cout << "Fail to load the layer \"Distritos\": " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ TeProjection* proj = dist->projection();
+
+ // Create a view with the same projection of the layer
+ string viewName = "SaoPaulo";
+
+ // Check whether there is a view with this name in the datatabase
+ if (db->viewExist(viewName))
+ {
+ cout << "There is already a view named \"" << viewName << "\" in the TerraLib database!\n";
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ TeView* view = new TeView(viewName, user);
+ view->projection(proj);
+ if (!db->insertView(view)) // save the view in the database
+ {
+ cout << "Fail to insert the view \"SaoPaulo\" into the database: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Create a theme that will contain all of the objects of the layer (no restrictions applied)
+ TeTheme* theme = new TeTheme("T_dist", dist);
+ view->add(theme);
+
+ // Set a default visual for the geometries of the objects of the layer
+ // Polygons will be set with the blue color
+ TeColor color;
+ TeVisual polygonVisual(TePOLYGONS);
+ color.init(0,0,255);
+ polygonVisual.color(color);
+ theme->setVisualDefault(polygonVisual, TePOLYGONS);
+
+ // Polygons will be set with the red color
+ TeVisual pointVisual(TePOINTS);
+ color.init(255,0,0);
+ pointVisual.color(color);
+ pointVisual.style(TePtTypeX);
+ theme->setVisualDefault(pointVisual, TePOINTS);
+
+ // Set all of the geometrical representations to be visible
+ int allRep = dist->geomRep();
+ theme->visibleRep(allRep);
+
+ // Show all of the attribute tables of the layer
+ theme->setAttTables(dist->attrTables());
+
+ // Save the theme in the database
+ if (!theme->save())
+ {
+ cout << "Fail to save the theme \"T_dist\" in the database: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Build the collection of objects associated to the theme
+ if (!theme->buildCollection())
+ {
+ cout << "Fail to build the theme \"T_dist\": " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "The theme \"T_dist\" was created without restrictions!\n";
+
+ // Create a theme with the following attribute restriction:
+ // Districts with population higher than 100,000 people
+
+ TeTheme* themeRest = new TeTheme("T_dist_POP", dist);
+ themeRest->setAttTables (dist->attrTables());
+
+ // Set the attribute restriction
+ string restAttr = " Pop91 > 100000 ";
+ themeRest->attributeRest(restAttr);
+
+ // Set all of the geometrical representations to be visible
+ themeRest->visibleRep(allRep);
+
+ // Set the visual
+ themeRest->setVisualDefault(polygonVisual, TePOLYGONS);
+ themeRest->setVisualDefault(pointVisual, TePOINTS);
+
+ // Insert the theme into the view
+ view->add(themeRest);
+
+ // Save the theme in the database
+ if (!themeRest->save())
+ {
+ cout << "Fail to save the theme \"T_dist_POP\" in the database: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Build the collection of objects associated to the theme
+ if (!themeRest->buildCollection())
+ {
+ cout << "Fail to build the theme \"T_dist_POP\": " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ cout << "The theme \"T_dist_POP\" was created with attribute restrictions!\n\n";
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 0;
+}
+
+
diff --git a/examples/createTheme/createTheme.dsp b/examples/createTheme/createTheme.dsp
new file mode 100644
index 0000000..65444fd
--- /dev/null
+++ b/examples/createTheme/createTheme.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createTheme" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createTheme - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "createTheme.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "createTheme.mak" CFG="createTheme - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "createTheme - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createTheme - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "createTheme - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "createTheme - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "createTheme - Win32 Release"
+# Name "createTheme - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createTheme.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createTheme/createTheme.dsw b/examples/createTheme/createTheme.dsw
new file mode 100644
index 0000000..e178cf7
--- /dev/null
+++ b/examples/createTheme/createTheme.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createTheme"=".\createTheme.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createTheme/createTheme.pro b/examples/createTheme/createTheme.pro
new file mode 100644
index 0000000..d710cdc
--- /dev/null
+++ b/examples/createTheme/createTheme.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createTheme
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ createTheme.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/data/BairrosPoA.dbf b/examples/data/BairrosPoA.dbf
new file mode 100644
index 0000000..9219526
Binary files /dev/null and b/examples/data/BairrosPoA.dbf differ
diff --git a/examples/data/BairrosPoA.shp b/examples/data/BairrosPoA.shp
new file mode 100644
index 0000000..f9b0edb
Binary files /dev/null and b/examples/data/BairrosPoA.shp differ
diff --git a/examples/data/BairrosPoA.shx b/examples/data/BairrosPoA.shx
new file mode 100644
index 0000000..1506a7f
Binary files /dev/null and b/examples/data/BairrosPoA.shx differ
diff --git a/examples/data/BairrosRecife.mid b/examples/data/BairrosRecife.mid
new file mode 100644
index 0000000..838bde2
--- /dev/null
+++ b/examples/data/BairrosRecife.mid
@@ -0,0 +1,94 @@
+261160605001
+261160605002
+261160605003
+261160605004
+261160605005
+261160605006
+261160605007
+261160605008
+261160605009
+261160605010
+261160605011
+261160605012
+261160605013
+261160605014
+261160605015
+261160605016
+261160605017
+261160605018
+261160605019
+261160605020
+261160605021
+261160605022
+261160605023
+261160605024
+261160605025
+261160605026
+261160605027
+261160605028
+261160605029
+261160605030
+261160605031
+261160605032
+261160605033
+261160605034
+261160605035
+261160605036
+261160605037
+261160605038
+261160605039
+261160605040
+261160605041
+261160605042
+261160605043
+261160605044
+261160605045
+261160605046
+261160605047
+261160605048
+261160605049
+261160605050
+261160605051
+261160605052
+261160605053
+261160605054
+261160605055
+261160605056
+261160605057
+261160605058
+261160605059
+261160605060
+261160605061
+261160605062
+261160605063
+261160605064
+261160605065
+261160605066
+261160605067
+261160605068
+261160605069
+261160605070
+261160605071
+261160605072
+261160605073
+261160605074
+261160605075
+261160605076
+261160605077
+261160605078
+261160605079
+261160605080
+261160605081
+261160605082
+261160605083
+261160605084
+261160605085
+261160605086
+261160605087
+261160605088
+261160605089
+261160605090
+261160605091
+261160605092
+261160605093
+261160605094
diff --git a/examples/data/BairrosRecife.mif b/examples/data/BairrosRecife.mif
new file mode 100644
index 0000000..dd89723
--- /dev/null
+++ b/examples/data/BairrosRecife.mif
@@ -0,0 +1,13886 @@
+Version 300
+Charset "WindowsLatin1"
+Delimiter ";"
+CoordSys Earth Projection 8, 92, Meters, -33.000000, 0.000000, 0.999600, 500000.000000, 10000000.000000 Bounds (277712.72411, 9098026.284832) (294927.38349, 9123062.304523)
+Columns 1
+ ID_ Char(16)
+Data
+Region 1
+143
+294927.383494 9110349.192930
+294744.887076 9109866.859191
+294715.645195 9109810.579317
+294528.843923 9109416.636133
+294423.835782 9109195.544709
+294398.772343 9109166.390114
+294368.560093 9109113.122393
+294343.294756 9109056.845831
+294314.726304 9108957.372220
+294283.363436 9108883.008600
+294275.150885 9108847.842938
+294265.010476 9108820.711496
+294259.921583 9108804.634483
+294258.860435 9108795.592887
+294252.822564 9108785.542016
+294250.767570 9108776.499468
+294246.739834 9108769.464047
+294238.684365 9108755.393204
+294231.600320 9108738.309762
+294220.578272 9108726.245087
+294213.539097 9108715.188737
+294209.481470 9108704.135246
+294205.364039 9108685.045622
+294202.277838 9108670.979533
+294196.195149 9108654.901549
+294190.149841 9108643.846145
+294185.105858 9108633.796210
+294182.057045 9108624.752699
+294175.966898 9108607.670192
+294165.878952 9108587.570315
+294160.834983 9108577.520374
+294153.758483 9108561.441422
+294146.674516 9108544.357951
+294142.616929 9108533.304445
+294137.595393 9108526.268049
+294133.537811 9108515.214542
+294130.421763 9108497.130371
+294124.406392 9108490.093016
+294120.341345 9108478.034989
+294116.223993 9108458.945342
+294110.178740 9108447.889916
+294104.126019 9108435.829971
+294100.008682 9108416.740320
+294092.902354 9108396.643279
+294087.836016 9108383.579769
+294077.755650 9108364.484366
+294069.692859 9108349.408944
+294066.659041 9108342.374449
+294068.519719 9108325.299573
+294065.508316 9108321.278629
+294056.548815 9108319.260968
+294055.532564 9108316.246458
+294048.471101 9108302.176504
+294019.223996 9108244.891190
+294014.202519 9108237.854768
+294010.189821 9108232.828340
+294007.156024 9108225.793837
+294002.082272 9108211.725789
+293996.926371 9108186.608045
+293992.876339 9108176.559026
+293985.837330 9108165.502605
+293975.816814 9108154.443299
+293973.791802 9108149.418787
+293970.698279 9108134.348136
+293965.639489 9108122.289114
+293954.572885 9108104.197213
+293945.501428 9108087.111749
+293940.472518 9108079.070793
+293930.392306 9108059.975325
+293923.301074 9108041.887259
+293920.207583 9108026.816598
+293918.122860 9108013.755936
+293911.054040 9107998.681420
+293888.913499 9107961.493041
+293881.889487 9107952.445626
+293866.847639 9107934.349826
+293862.827526 9107928.318856
+293859.786317 9107920.279813
+293852.627974 9107893.151057
+293845.484569 9107868.031334
+293837.407049 9107850.946792
+293824.323070 9107828.834822
+293814.280294 9107814.761895
+293805.246278 9107802.698970
+293798.155157 9107784.610861
+293794.082837 9107771.548247
+293788.934618 9107747.434956
+293786.835042 9107732.365236
+293776.687852 9107704.229026
+293766.570520 9107680.110887
+293751.424388 9107647.951746
+293747.374482 9107637.902679
+293745.289853 9107624.841990
+293742.241238 9107615.798410
+293729.164855 9107594.690903
+293672.755437 9107626.780234
+293521.281374 9107704.984071
+293462.936145 9107744.102902
+293364.208865 9107832.403195
+293339.616406 9107866.532504
+293327.869243 9107890.629294
+293320.097410 9107914.729992
+293300.255215 9108053.333432
+293301.509882 9108088.492658
+293298.637523 9108237.157915
+293296.080829 9108294.412704
+293293.382528 9108332.581588
+293300.764305 9108389.846127
+293317.493299 9108501.363570
+293323.491394 9108639.992344
+293320.972113 9108702.269727
+293320.559857 9108780.621391
+293314.169583 9108856.958177
+293296.345196 9108999.581685
+293290.687789 9109040.761214
+293294.737803 9109050.810311
+293306.858028 9109076.939513
+293337.973511 9109118.154962
+293383.234388 9109190.524081
+293427.531411 9109266.910231
+293430.557774 9109272.940255
+293444.725586 9109307.107480
+293454.850799 9109332.230150
+293530.218275 9109577.404394
+293552.419405 9109622.628964
+293992.155865 9110483.917707
+294014.373032 9110531.150854
+294037.644004 9110586.421057
+294048.853659 9110623.598579
+294056.117705 9110664.790372
+294060.340227 9110697.943191
+294064.772311 9110759.222458
+294065.213877 9110818.488906
+294060.588682 9110864.691915
+294057.666870 9110872.725207
+294050.089921 9110922.943445
+294042.505484 9110972.157169
+294025.960977 9111019.353352
+294001.555051 9111078.596165
+293981.983873 9111119.762415
+293955.530183 9111170.967203
+294251.836018 9110921.125913
+294927.383494 9110349.192930
+Region 1
+84
+294065.213877 9110818.488906
+294064.772311 9110759.222458
+294060.340227 9110697.943191
+294056.117705 9110664.790372
+294048.853659 9110623.598579
+294037.644004 9110586.421057
+294014.373032 9110531.150854
+293992.155865 9110483.917707
+293552.419405 9109622.628964
+293530.218275 9109577.404394
+293454.850799 9109332.230150
+293444.725586 9109307.107480
+293430.557774 9109272.940255
+293427.531411 9109266.910231
+293383.234388 9109190.524081
+293337.973511 9109118.154962
+293306.858028 9109076.939513
+293294.737803 9109050.810311
+293290.687789 9109040.761214
+293275.645665 9109022.665255
+293270.631626 9109016.633266
+293255.604431 9109000.546339
+293235.630320 9108987.468101
+293206.674215 9108969.358479
+293161.756762 9108943.197059
+293122.780144 9108914.027874
+293103.755245 9108894.923404
+293074.657661 9108857.727748
+292854.985020 9108585.287285
+292782.828319 9108638.455178
+292651.255912 9108720.694981
+292481.108432 9108828.009014
+292466.230293 9108832.012252
+292451.344711 9108835.010959
+292313.160993 9108829.850311
+292268.578511 9108848.891541
+292219.086135 9108875.963968
+292079.531088 9108954.176414
+291989.371685 9108992.257477
+291896.341889 9109045.403312
+291823.100119 9109086.514742
+291722.141186 9109142.665864
+291698.741081 9109203.918009
+291678.834731 9109334.485706
+291675.127352 9109505.250677
+291672.347160 9109666.975882
+291672.451108 9109681.039292
+291675.989645 9109756.382000
+291686.448292 9109826.709078
+291698.709107 9109871.924924
+291701.350442 9109960.325484
+291702.485447 9109979.412538
+291686.125497 9110186.327479
+291677.522141 9110232.526801
+291688.521836 9110241.578574
+291703.519400 9110253.647934
+291721.483798 9110263.711229
+291733.469974 9110271.759459
+291772.380487 9110291.889008
+291985.817523 9110392.555007
+291996.794999 9110398.593100
+292058.632262 9110427.785930
+292257.109763 9110521.403789
+292500.469791 9110636.159771
+292594.231573 9110681.455477
+292640.114895 9110703.600001
+292687.993507 9110726.750944
+292903.451486 9110831.431676
+292913.427793 9110836.463999
+293036.110408 9110894.845514
+293154.810204 9110952.218239
+293159.802112 9110955.236627
+293355.301623 9111048.845678
+293490.965711 9111115.274316
+293789.205136 9111258.200908
+293955.530183 9111170.967203
+293981.983873 9111119.762415
+294001.555051 9111078.596165
+294025.960977 9111019.353352
+294042.505484 9110972.157169
+294050.089921 9110922.943445
+294057.666870 9110872.725207
+294060.588682 9110864.691915
+294065.213877 9110818.488906
+Region 1
+101
+292651.255912 9108720.694981
+292782.828319 9108638.455178
+292571.701510 9108311.777175
+292507.344261 9108210.256601
+292503.324267 9108204.225474
+292495.306588 9108195.176795
+292482.126387 9108160.005475
+292463.087224 9108138.891540
+292225.928155 9108054.273903
+291735.740107 9107889.036183
+291728.620015 9108001.535428
+291597.432424 9108001.401703
+291590.556709 9108147.050510
+291625.623208 9108185.258134
+291663.671317 9108223.468753
+291666.689952 9108228.494439
+291592.573826 9108285.676724
+291532.208732 9108186.167351
+291390.265958 9108210.130737
+291304.913254 9108226.115618
+291290.049921 9108232.127510
+291275.134726 9108231.107674
+291091.494049 9108261.054508
+291123.747563 9108456.970162
+291144.113558 9108523.289769
+291168.284704 9108566.509186
+291224.548416 9108648.937974
+291099.545392 9108544.338955
+290942.458182 9108401.534320
+290838.475408 9108317.046513
+290820.738943 9108472.729789
+290803.172679 9108651.517370
+290796.630020 9108707.764099
+290795.249106 9108790.133866
+290798.132341 9108911.684582
+290799.400059 9108948.853380
+290800.889839 9109016.158205
+290802.996015 9109032.232807
+290806.066457 9109044.290299
+290809.181316 9109062.374994
+290812.251764 9109074.432484
+290815.322214 9109086.489973
+290818.370459 9109095.533859
+290828.472063 9109117.643869
+290838.544065 9109135.735738
+290849.617356 9109154.833162
+290966.069682 9109312.663653
+290968.072252 9109314.674763
+290990.159800 9109344.833227
+291077.627587 9109480.533876
+291109.750468 9109523.761346
+291199.073350 9109641.382044
+291238.205580 9109691.648189
+291349.572732 9109833.399452
+291403.762044 9109903.771137
+291481.997875 9110000.284674
+291627.448641 9110181.245714
+291639.479342 9110195.321154
+291652.518800 9110211.406649
+291666.522451 9110223.475023
+291677.522141 9110232.526801
+291686.125497 9110186.327479
+291702.485447 9109979.412538
+291701.350442 9109960.325484
+291698.709107 9109871.924924
+291686.448292 9109826.709078
+291675.989645 9109756.382000
+291672.451108 9109681.039292
+291672.347160 9109666.975882
+291675.127352 9109505.250677
+291678.834731 9109334.485706
+291419.856052 9109391.480679
+291488.351725 9109245.894501
+291520.786026 9109196.705850
+291386.888018 9108964.524630
+291379.812311 9108948.445030
+291358.251622 9108855.002306
+291347.801473 9108785.679481
+291346.763133 9108779.651276
+291339.168630 9108693.254451
+291530.709568 9108656.282630
+291513.858636 9108527.686499
+291658.056978 9108539.887609
+291661.402054 9108589.112605
+291663.590076 9108616.236931
+291668.700331 9108635.328047
+291687.124011 9108707.672357
+291689.378852 9108743.837443
+291683.208365 9108850.310526
+291782.179076 9108794.157613
+292067.222661 9108633.722115
+292093.367519 9108674.933761
+292003.187745 9108844.606885
+292079.531088 9108954.176414
+292219.086135 9108875.963968
+292268.578511 9108848.891541
+292313.160993 9108829.850311
+292451.344711 9108835.010959
+292466.230293 9108832.012252
+292481.108432 9108828.009014
+292651.255912 9108720.694981
+Region 1
+30
+291782.179076 9108794.157613
+291683.208365 9108850.310526
+291689.378852 9108743.837443
+291687.124011 9108707.672357
+291668.700331 9108635.328047
+291663.590076 9108616.236931
+291661.402054 9108589.112605
+291658.056978 9108539.887609
+291513.858636 9108527.686499
+291530.709568 9108656.282630
+291339.168630 9108693.254451
+291346.763133 9108779.651276
+291347.801473 9108785.679481
+291358.251622 9108855.002306
+291379.812311 9108948.445030
+291386.888018 9108964.524630
+291520.786026 9109196.705850
+291488.351725 9109245.894501
+291419.856052 9109391.480679
+291678.834731 9109334.485706
+291698.741081 9109203.918009
+291722.141186 9109142.665864
+291823.100119 9109086.514742
+291896.341889 9109045.403312
+291989.371685 9108992.257477
+292079.531088 9108954.176414
+292003.187745 9108844.606885
+292093.367519 9108674.933761
+292067.222661 9108633.722115
+291782.179076 9108794.157613
+Region 1
+59
+293212.241769 9107844.307819
+293215.178576 9107838.283626
+293222.008777 9107821.213610
+293223.921952 9107811.170350
+293224.781702 9107793.089934
+293220.687189 9107777.013664
+293180.758464 9107619.265447
+293084.595260 9107651.314867
+293033.087291 9107674.367727
+292978.649863 9107704.449246
+292958.907190 9107722.510952
+292934.165566 9107736.549628
+292904.015711 9107691.316462
+292848.100707 9107656.102802
+292799.737703 9107701.257923
+292769.077650 9107721.317726
+292748.288964 9107732.346699
+292683.015701 9107775.475848
+292475.735130 9107833.530608
+292455.367874 9107767.211966
+292420.020774 9107825.438589
+292355.770529 9107872.586469
+292332.096704 9107896.671139
+292267.253560 9107998.062392
+292225.928155 9108054.273903
+292463.087224 9108138.891540
+292482.126387 9108160.005475
+292495.306588 9108195.176795
+292503.324267 9108204.225474
+292507.344261 9108210.256601
+292571.701510 9108311.777175
+292782.828319 9108638.455178
+292854.985020 9108585.287285
+293074.657661 9108857.727748
+293103.755245 9108894.923404
+293122.780144 9108914.027874
+293161.756762 9108943.197059
+293206.674215 9108969.358479
+293235.630320 9108987.468101
+293255.604431 9109000.546339
+293270.631626 9109016.633266
+293275.645665 9109022.665255
+293290.687789 9109040.761214
+293296.345196 9108999.581685
+293314.169583 9108856.958177
+293320.559857 9108780.621391
+293320.972113 9108702.269727
+293323.491394 9108639.992344
+293317.493299 9108501.363570
+293300.764305 9108389.846127
+293293.382528 9108332.581588
+293296.080829 9108294.412704
+293298.637523 9108237.157915
+293301.509882 9108088.492658
+293300.255215 9108053.333432
+293320.097410 9107914.729992
+293327.869243 9107890.629294
+293339.616406 9107866.532504
+293212.241769 9107844.307819
+Region 1
+29
+291144.113558 9108523.289769
+291123.747563 9108456.970162
+291091.494049 9108261.054508
+291133.659600 9108183.749503
+291026.234709 9108171.584401
+290857.190936 9108159.355208
+290867.390892 9108059.917635
+290896.673727 9107987.622070
+290907.978463 9107903.253554
+290921.159918 9107803.819090
+290929.594077 9107734.515504
+290659.512428 9107767.384036
+290546.465248 9107801.419973
+290501.753161 9107937.989123
+290474.372376 9108133.843602
+290485.604233 9108309.647850
+290496.972760 9108368.926899
+290569.443173 9108357.952642
+290582.769978 9108413.215566
+290610.842072 9108446.394207
+290748.236394 9108614.292972
+290803.172679 9108651.517370
+290820.738943 9108472.729789
+290838.475408 9108317.046513
+290942.458182 9108401.534320
+291099.545392 9108544.338955
+291224.548416 9108648.937974
+291168.284704 9108566.509186
+291144.113558 9108523.289769
+Region 1
+28
+291666.689952 9108228.494439
+291663.671317 9108223.468753
+291625.623208 9108185.258134
+291590.556709 9108147.050510
+291500.406112 9108051.528726
+291454.348229 9108005.273510
+291429.390911 9107990.180091
+291338.454543 9107922.783698
+291307.126858 9107852.434800
+291258.644791 9107746.909831
+291205.193800 9107641.379626
+291050.620919 9107704.505071
+290929.594077 9107734.515504
+290921.159918 9107803.819090
+290907.978463 9107903.253554
+290896.673727 9107987.622070
+290867.390892 9108059.917635
+290857.190936 9108159.355208
+291026.234709 9108171.584401
+291133.659600 9108183.749503
+291091.494049 9108261.054508
+291275.134726 9108231.107674
+291290.049921 9108232.127510
+291304.913254 9108226.115618
+291390.265958 9108210.130737
+291532.208732 9108186.167351
+291592.573826 9108285.676724
+291666.689952 9108228.494439
+Region 1
+28
+292225.928155 9108054.273903
+292267.253560 9107998.062392
+292224.198949 9107954.824714
+292139.054116 9107864.332068
+292094.746083 9107785.934725
+292092.728711 9107781.914604
+292034.966615 9107631.178054
+292029.886117 9107616.105094
+291991.393197 9107517.623011
+291906.234932 9107425.120549
+291810.397007 9107366.760706
+291723.933725 9107366.672486
+291623.860617 9107407.755619
+291470.431386 9107490.973835
+291462.510337 9107494.983801
+291223.031091 9107634.366344
+291205.193800 9107641.379626
+291258.644791 9107746.909831
+291307.126858 9107852.434800
+291338.454543 9107922.783698
+291429.390911 9107990.180091
+291454.348229 9108005.273510
+291500.406112 9108051.528726
+291590.556709 9108147.050510
+291597.432424 9108001.401703
+291728.620015 9108001.535428
+291735.740107 9107889.036183
+292225.928155 9108054.273903
+Region 1
+58
+291881.700695 9107198.073673
+291840.783263 9107174.927968
+291805.895548 9107160.829069
+291778.016523 9107153.768953
+291754.135046 9107149.726470
+291729.267155 9107146.687487
+291705.415326 9107146.663097
+291676.594362 9107146.633609
+291622.942546 9107148.587713
+291580.222809 9107150.552967
+291539.490712 9107152.520221
+291510.684534 9107154.499690
+291474.921554 9107156.471991
+291410.359768 9107161.428204
+291340.813996 9107164.370140
+291279.196614 9107164.306580
+291218.536038 9107159.221299
+291179.710101 9107150.140423
+291124.931115 9107134.011308
+291064.181783 9107116.871399
+290748.450488 9107023.121720
+290623.948574 9106985.823922
+290529.335477 9106958.602413
+290423.760814 9106927.351026
+290355.039058 9106907.188048
+290336.112046 9106901.140913
+290298.265411 9106890.051154
+290264.379344 9106876.956481
+290226.495850 9106860.843960
+290185.586638 9106838.701014
+290138.692372 9106813.538088
+290114.421900 9106891.865803
+290104.205128 9106989.294504
+290117.552708 9107047.571445
+290128.809407 9107091.782725
+290181.115820 9107177.223155
+290232.568829 9107281.748650
+290261.788634 9107336.024096
+290288.976555 9107384.270184
+290310.186739 9107430.500892
+290341.497811 9107498.841853
+290385.773258 9107573.223560
+290390.794163 9107580.260537
+290431.013170 9107643.588080
+290469.525328 9107745.085871
+290503.456463 9107764.207437
+290546.465248 9107801.419973
+290659.512428 9107767.384036
+290929.594077 9107734.515504
+291050.620919 9107704.505071
+291205.193800 9107641.379626
+291223.031091 9107634.366344
+291462.510337 9107494.983801
+291470.431386 9107490.973835
+291623.860617 9107407.755619
+291723.933725 9107366.672486
+291810.397007 9107366.760706
+291881.700695 9107198.073673
+Region 1
+27
+291814.312431 9106011.663983
+291857.706269 9105966.504984
+291809.165648 9105987.550155
+291472.385515 9106003.275575
+291295.079142 9106082.449408
+291256.365121 9106088.436380
+291108.458112 9106111.386671
+290970.215508 9106097.179104
+290627.651772 9106002.394234
+290473.301828 9105960.041231
+290466.514862 9105983.138244
+290469.533171 9105988.164082
+290471.660961 9106007.252394
+290446.692504 9106125.760533
+290415.893910 9106262.344063
+290361.942347 9106358.721946
+290328.639464 9106424.985737
+290434.212849 9106456.237646
+290679.312180 9106540.875865
+290899.500167 9106616.445797
+291126.674989 9106696.039832
+291355.845419 9106776.639115
+291458.467987 9106811.903304
+291512.032150 9106663.288902
+291591.752248 9106692.502096
+291787.178349 9106644.485429
+291814.312431 9106011.663983
+Region 1
+255
+293729.164855 9107594.690903
+293727.147367 9107590.670886
+293719.084879 9107575.595338
+293715.020073 9107563.537225
+293710.925436 9107547.461033
+293707.876836 9107538.417447
+293703.841872 9107530.377410
+293698.813085 9107522.336401
+293686.849904 9107517.302155
+293683.801313 9107508.258565
+293680.678147 9107489.169779
+293679.632121 9107482.137170
+293674.603346 9107474.096156
+293666.540903 9107459.020588
+293662.498499 9107449.976024
+293662.468671 9107445.957945
+293661.377910 9107432.898216
+293659.323155 9107423.855594
+293648.241983 9107403.754504
+293640.194478 9107390.687966
+293637.168278 9107384.657928
+293631.078600 9107367.575253
+293620.961458 9107343.457042
+293612.899065 9107328.381454
+293605.845408 9107315.315878
+293600.786851 9107303.256767
+293588.615018 9107270.095911
+293581.539019 9107254.016766
+293572.400852 9107227.890465
+293544.156574 9107171.610012
+293540.084422 9107158.547341
+293527.972312 9107133.422613
+293524.879082 9107118.351874
+293521.852922 9107112.321820
+293517.825495 9107105.286269
+293505.795383 9107091.211256
+293499.772878 9107083.169227
+293497.740540 9107077.140148
+293492.622443 9107057.044844
+293485.472020 9107030.920457
+293479.375025 9107012.833213
+293476.311629 9107001.780548
+293475.302915 9106999.770528
+293469.258081 9106988.714928
+293464.214514 9106978.664825
+293460.202011 9106973.638306
+293447.185595 9106960.566807
+293442.179283 9106955.539306
+293436.186608 9106951.515346
+293432.151764 9106943.475259
+293427.108212 9106933.425149
+293425.023753 9106920.364413
+293423.955455 9106910.318220
+293422.916952 9106904.290113
+293416.909389 9106898.257106
+293410.901828 9106892.224097
+293407.868256 9106885.189507
+293401.823459 9106874.133890
+293394.762511 9106860.063725
+293392.730203 9106854.034635
+293390.615973 9106836.955808
+293386.596047 9106830.924755
+293381.597205 9106826.901764
+293364.337539 9106777.663520
+293353.159910 9106744.503502
+293338.904086 9106698.281745
+293326.881603 9106685.211166
+293314.881461 9106675.154148
+293300.856488 9106660.072548
+293284.762027 9106633.939230
+293263.750658 9106614.832633
+293219.814785 9106586.662650
+293193.700488 9106549.469670
+293150.728760 9106517.282490
+293138.877502 9106527.315865
+293124.897271 9106518.261324
+293089.928119 9106493.113637
+293076.956589 9106486.069112
+293067.915650 9106473.001400
+293060.892077 9106463.953760
+293043.975093 9106460.923356
+293036.017222 9106459.910908
+293028.956471 9106445.840643
+292991.791602 9106392.564208
+292922.840032 9106341.264974
+292885.846348 9106311.092459
+292820.989118 9106275.869390
+292762.094778 9106240.652191
+292759.083656 9106236.631097
+292752.097331 9106232.606011
+292750.102300 9106231.599490
+292747.113469 9106230.591970
+292744.117207 9106228.579925
+292740.127146 9106226.566882
+292735.135855 9106223.548314
+292733.133395 9106221.537266
+292731.138365 9106220.530744
+292728.142105 9106218.518697
+292725.145845 9106216.506651
+292723.143386 9106214.495602
+292718.152097 9106211.477032
+292713.145951 9106206.449410
+292710.157121 9106205.441888
+292708.154663 9106203.430839
+292705.158405 9106201.418790
+292702.169576 9106200.411267
+292700.174547 9106199.404743
+292696.184490 9106197.391694
+292694.189461 9106196.385170
+292691.208061 9106196.382171
+292689.213032 9106195.375646
+292683.227947 9106192.356071
+292680.246546 9106192.353072
+292677.257718 9106191.345547
+292674.276318 9106191.342547
+292671.287490 9106190.335021
+292666.311061 9106189.325495
+292663.322233 9106188.317969
+292661.334633 9106188.315969
+292659.347033 9106188.313968
+292619.491051 9106174.210575
+292573.664861 9106159.096601
+292522.765754 9106129.914185
+292499.871245 9106124.868462
+292480.877705 9106109.781479
+292458.005474 9106107.749312
+292454.045122 9106109.754345
+292450.069924 9106109.750324
+292444.107127 9106109.744291
+292431.002184 9106084.618044
+292411.007460 9106068.525488
+292394.023830 9106056.454050
+292373.176319 9106059.446483
+292366.204887 9106057.430377
+292344.200338 9106038.322185
+292332.200563 9106028.264812
+292309.365457 9106031.255197
+292290.498122 9106033.245080
+292271.519514 9106020.167038
+292251.613874 9106016.128727
+292246.630047 9106014.114619
+292244.612781 9106010.094487
+292239.614120 9106006.071322
+292230.669936 9106006.062226
+292223.720764 9106007.059679
+292213.827280 9106013.076738
+292204.935007 9106020.099335
+292195.011852 9106022.098278
+292185.029367 9106016.060993
+292179.022079 9106010.027752
+292175.009806 9106005.001063
+292170.982702 9105997.965316
+292165.969217 9105991.933085
+292161.956947 9105986.906393
+292161.934701 9105983.892808
+292155.971912 9105983.886733
+292151.025166 9105986.895256
+292148.058601 9105988.901275
+292142.140300 9105994.922371
+292130.214717 9105994.910216
+292123.191396 9105985.862366
+292110.309087 9105990.871837
+292067.627634 9105997.859940
+291992.855527 9105965.638860
+291977.955957 9105966.628144
+291905.527186 9105982.626357
+291879.636535 9105975.568171
+291877.648936 9105975.566133
+291857.706269 9105966.504984
+291814.312431 9106011.663983
+291787.178349 9106644.485429
+291591.752248 9106692.502096
+291512.032150 9106663.288902
+291458.467987 9106811.903304
+291355.845419 9106776.639115
+291126.674989 9106696.039832
+290899.500167 9106616.445797
+290679.312180 9106540.875865
+290434.212849 9106456.237646
+290328.639464 9106424.985737
+290307.100042 9106469.162297
+290265.199323 9106582.629922
+290252.508304 9106613.756944
+290198.467600 9106698.080332
+290145.501665 9106793.454681
+290138.692372 9106813.538088
+290185.586638 9106838.701014
+290226.495850 9106860.843960
+290264.379344 9106876.956481
+290298.265411 9106890.051154
+290336.112046 9106901.140913
+290355.039058 9106907.188048
+290423.760814 9106927.351026
+290529.335477 9106958.602413
+290623.948574 9106985.823922
+290748.450488 9107023.121720
+291064.181783 9107116.871399
+291124.931115 9107134.011308
+291179.710101 9107150.140423
+291218.536038 9107159.221299
+291279.196614 9107164.306580
+291340.813996 9107164.370140
+291410.359768 9107161.428204
+291474.921554 9107156.471991
+291510.684534 9107154.499690
+291539.490712 9107152.520221
+291580.222809 9107150.552967
+291622.942546 9107148.587713
+291676.594362 9107146.633609
+291705.415326 9107146.663097
+291729.267155 9107146.687487
+291754.135046 9107149.726470
+291778.016523 9107153.768953
+291805.895548 9107160.829069
+291840.783263 9107174.927968
+291881.700695 9107198.073673
+291810.397007 9107366.760706
+291906.234932 9107425.120549
+291991.393197 9107517.623011
+292029.886117 9107616.105094
+292034.966615 9107631.178054
+292092.728711 9107781.914604
+292094.746083 9107785.934725
+292139.054116 9107864.332068
+292224.198949 9107954.824714
+292267.253560 9107998.062392
+292332.096704 9107896.671139
+292355.770529 9107872.586469
+292420.020774 9107825.438589
+292455.367874 9107767.211966
+292475.735130 9107833.530608
+292683.015701 9107775.475848
+292748.288964 9107732.346699
+292769.077650 9107721.317726
+292799.737703 9107701.257923
+292848.100707 9107656.102802
+292904.015711 9107691.316462
+292934.165566 9107736.549628
+292958.907190 9107722.510952
+292978.649863 9107704.449246
+293033.087291 9107674.367727
+293084.595260 9107651.314867
+293180.758464 9107619.265447
+293220.687189 9107777.013664
+293224.781702 9107793.089934
+293223.921952 9107811.170350
+293222.008777 9107821.213610
+293215.178576 9107838.283626
+293212.241769 9107844.307819
+293339.616406 9107866.532504
+293364.208865 9107832.403195
+293462.936145 9107744.102902
+293521.281374 9107704.984071
+293672.755437 9107626.780234
+293729.164855 9107594.690903
+Region 1
+60
+290849.617356 9109154.833162
+290838.544065 9109135.735738
+290828.472063 9109117.643869
+290818.370459 9109095.533859
+290815.322214 9109086.489973
+290812.251764 9109074.432484
+290809.181316 9109062.374994
+290806.066457 9109044.290299
+290802.996015 9109032.232807
+290800.889839 9109016.158205
+290799.400059 9108948.853380
+290798.132341 9108911.684582
+290795.249106 9108790.133866
+290796.630020 9108707.764099
+290803.172679 9108651.517370
+290748.236394 9108614.292972
+290610.842072 9108446.394207
+290582.769978 9108413.215566
+290569.443173 9108357.952642
+290496.972760 9108368.926899
+290508.348727 9108429.210473
+290525.255919 9108565.843950
+290517.689452 9108618.071540
+290469.958492 9108749.615035
+290404.976700 9108832.923171
+290316.030885 9108901.138305
+290290.345391 9108922.206584
+290242.942436 9108963.342735
+290215.387340 9109000.481507
+290200.634371 9109021.561194
+290195.783209 9109037.628594
+290179.315837 9109095.874089
+290155.979949 9109166.166757
+290144.637075 9109245.512751
+290140.809321 9109265.599345
+290132.196870 9109310.794181
+290125.527848 9109349.963873
+290218.040259 9109361.110413
+290298.648256 9109375.257931
+290376.222861 9109382.370435
+290462.779382 9109394.514773
+290523.435789 9109398.595850
+290582.141420 9109407.697461
+290613.982642 9109412.753075
+290632.866399 9109412.772621
+290660.732095 9109417.824086
+290682.604896 9109418.851230
+290699.493484 9109417.864158
+290710.389171 9109412.852781
+290735.191792 9109406.851239
+290776.853361 9109395.844448
+290807.611834 9109388.844489
+290841.329719 9109378.833981
+290865.116192 9109369.817749
+290900.806987 9109357.800184
+290928.546727 9109345.774416
+290944.367313 9109334.740904
+290968.072252 9109314.674763
+290966.069682 9109312.663653
+290849.617356 9109154.833162
+Region 1
+158
+291199.073350 9109641.382044
+291109.750468 9109523.761346
+291077.627587 9109480.533876
+290990.159800 9109344.833227
+290968.072252 9109314.674763
+290944.367313 9109334.740904
+290928.546727 9109345.774416
+290900.806987 9109357.800184
+290865.116192 9109369.817749
+290841.329719 9109378.833981
+290807.611834 9109388.844489
+290776.853361 9109395.844448
+290735.191792 9109406.851239
+290710.389171 9109412.852781
+290699.493484 9109417.864158
+290682.604896 9109418.851230
+290660.732095 9109417.824086
+290632.866399 9109412.772621
+290613.982642 9109412.753075
+290582.141420 9109407.697461
+290523.435789 9109398.595850
+290462.779382 9109394.514773
+290376.222861 9109382.370435
+290298.648256 9109375.257931
+290218.040259 9109361.110413
+290125.527848 9109349.963873
+290122.634862 9109362.015206
+290112.086350 9109414.239730
+290101.656048 9109482.536861
+290097.916947 9109514.677912
+290101.327182 9109572.944223
+290101.681879 9109621.162035
+290101.792724 9109636.230102
+290118.130983 9109695.514445
+290126.392520 9109737.713330
+290137.606194 9109775.897172
+290152.751117 9109808.057930
+290164.951345 9109845.238254
+290178.101139 9109876.392382
+290193.320071 9109918.598482
+290199.534825 9109952.758956
+290201.833159 9109994.951582
+290201.149812 9110037.141102
+290200.569997 9110093.394140
+290199.871881 9110133.574585
+290190.302611 9110183.791091
+290183.485801 9110202.870054
+290177.655495 9110220.945514
+290163.101899 9110269.147777
+290141.576164 9110315.333725
+290126.867240 9110342.440709
+290113.144813 9110368.544189
+290098.398891 9110390.628483
+290084.646863 9110412.713811
+290079.736478 9110420.744934
+290057.105805 9110451.861776
+290040.408983 9110478.966680
+290032.783009 9110523.158050
+290023.021346 9110547.256594
+290031.157460 9110572.378324
+290079.910834 9110579.460815
+290099.840808 9110586.513266
+290117.768174 9110591.554565
+290151.716452 9110612.684979
+290171.602065 9110613.710171
+290179.656908 9110627.781946
+290181.844453 9110654.906505
+290183.023297 9110680.020958
+290179.180801 9110698.098493
+290171.510598 9110736.262637
+290161.756395 9110761.365739
+290139.118278 9110791.478108
+290109.604086 9110832.633151
+290080.045468 9110867.760964
+290046.592486 9110913.934544
+290020.022923 9110950.069978
+290042.979204 9110963.152743
+290101.834944 9110992.345260
+290173.663497 9111028.582836
+290238.512500 9111061.799460
+290258.472318 9111072.869929
+290294.401492 9111092.997652
+290369.234282 9111132.251529
+290389.186749 9111142.317389
+290392.183322 9111144.329535
+290412.128393 9111153.390848
+290475.998583 9111188.615092
+290525.879865 9111213.779575
+290552.804664 9111225.861566
+290566.756620 9111230.898530
+290603.516921 9111228.927210
+290634.261809 9111219.918007
+290686.709895 9111188.831445
+290735.211870 9111161.758904
+290794.594993 9111127.665770
+290786.517617 9111110.580573
+290772.424851 9111086.457539
+290752.294474 9111052.283056
+290749.283074 9111048.261869
+290732.171544 9111019.113091
+290707.012370 9110976.897210
+290685.880780 9110941.717120
+290663.747903 9110905.531458
+290639.590196 9110864.321063
+290633.530404 9110851.255991
+290644.381959 9110840.217346
+290660.128986 9110819.138460
+290681.795018 9110792.038491
+290699.470561 9110762.925368
+290718.169633 9110737.831399
+290721.114317 9110732.811789
+290744.619897 9110685.623171
+290766.182082 9110644.459714
+290790.622210 9110589.235843
+290801.362513 9110563.129179
+290802.326777 9110559.112064
+290816.983407 9110524.973207
+290826.663086 9110489.824723
+290837.351482 9110456.686326
+290849.011538 9110420.535348
+290857.808447 9110400.453849
+290870.751412 9110403.480687
+290902.600760 9110409.540457
+290947.444972 9110425.658746
+291004.312424 9110454.848089
+291022.247164 9110460.893550
+291201.104941 9110320.442422
+291195.082205 9110312.400101
+291171.013534 9110283.244399
+291143.963202 9110254.085638
+291112.863162 9110214.877477
+291088.757528 9110180.699044
+291077.683793 9110161.601770
+291075.673758 9110158.586144
+291066.602655 9110141.499959
+291055.514114 9110120.393610
+291039.426458 9110095.264045
+291023.331410 9110069.129938
+291006.272138 9110047.012934
+290980.245607 9110021.873163
+290956.251355 9110002.762604
+290905.333098 9109971.570107
+290905.296051 9109966.547440
+290908.114721 9109944.450768
+290914.894139 9109920.349108
+290917.786901 9109908.297768
+290928.490009 9109877.168455
+290942.130319 9109840.015002
+290951.891383 9109815.916402
+290960.880844 9109821.952775
+290990.875373 9109846.092130
+290996.816478 9109843.084642
+291039.353606 9109816.006028
+291127.416766 9109762.856296
+291184.773043 9109723.738435
+291200.586241 9109711.700287
+291238.205580 9109691.648189
+291199.073350 9109641.382044
+Region 1
+108
+290392.183322 9111144.329535
+290389.186749 9111142.317389
+290369.234282 9111132.251529
+290294.401492 9111092.997652
+290258.472318 9111072.869929
+290238.512500 9111061.799460
+290173.663497 9111028.582836
+290101.834944 9110992.345260
+290042.979204 9110963.152743
+290020.022923 9110950.069978
+290046.592486 9110913.934544
+290080.045468 9110867.760964
+290109.604086 9110832.633151
+290139.118278 9110791.478108
+290161.756395 9110761.365739
+290171.510598 9110736.262637
+290179.180801 9110698.098493
+290183.023297 9110680.020958
+290181.844453 9110654.906505
+290179.656908 9110627.781946
+290171.602065 9110613.710171
+290151.716452 9110612.684979
+290117.768174 9110591.554565
+290099.840808 9110586.513266
+290079.910834 9110579.460815
+290031.157460 9110572.378324
+290032.188337 9110577.402048
+290030.422321 9110607.536107
+290034.664142 9110643.703604
+290035.887268 9110674.845305
+290040.047775 9110699.962885
+290042.213068 9110724.073856
+290041.492754 9110761.240710
+290038.621930 9110776.305669
+290036.752415 9110792.376201
+290024.112509 9110830.535178
+290006.436451 9110859.648144
+290003.499066 9110865.672265
+289992.743439 9110889.769786
+289983.018692 9110918.891030
+289967.278664 9110940.974298
+289950.566883 9110966.070142
+289926.934610 9110996.181424
+289909.214082 9111019.267150
+289885.530008 9111042.346655
+289853.887138 9111064.413317
+289835.106098 9111078.457146
+289808.395834 9111095.506281
+289774.654174 9111102.502747
+289738.917260 9111108.492573
+289690.214981 9111108.441612
+289645.451448 9111103.372067
+289611.576761 9111092.286704
+289585.660865 9111082.214197
+289565.671593 9111067.125234
+289560.672430 9111063.101856
+289526.738702 9111043.980096
+289491.781540 9111020.839097
+289469.774941 9111001.729824
+289462.773181 9110995.695259
+289416.642004 9111075.004786
+289431.720685 9111098.124920
+289450.686484 9111109.194742
+289501.590833 9111138.379719
+289522.551898 9111150.456131
+289544.477356 9111158.515415
+289569.443689 9111174.614133
+289593.349628 9111181.670934
+289610.275925 9111185.706809
+289628.203537 9111190.748258
+289647.132466 9111196.795279
+289661.106544 9111204.846166
+289687.096418 9111224.964002
+289707.078411 9111239.048345
+289733.068322 9111259.166144
+289754.059052 9111275.260576
+289764.064850 9111284.311807
+289784.069065 9111301.409721
+289822.119255 9111339.621590
+289836.152549 9111355.708712
+289849.191925 9111371.794792
+289860.236057 9111386.874256
+289871.258014 9111398.940102
+289878.326441 9111414.015418
+289886.507125 9111445.164376
+289884.696746 9111469.271220
+289947.410551 9111482.395334
+289961.103680 9111452.273665
+289972.882904 9111432.195306
+289997.435254 9111392.039618
+290022.068939 9111362.933836
+290041.740355 9111334.827428
+290067.375309 9111306.727204
+290095.940217 9111271.598306
+290105.931267 9111278.640372
+290125.898575 9111290.715420
+290151.859049 9111306.814780
+290190.799791 9111330.963784
+290231.721021 9111354.110263
+290273.643617 9111378.262258
+290286.646108 9111389.325493
+290296.407689 9111365.226891
+290313.052706 9111331.090111
+290325.707194 9111294.940157
+290341.373057 9111262.811423
+290358.982323 9111224.657525
+290376.524924 9111177.462806
+290392.183322 9111144.329535
+Region 1
+58
+291374.594993 9110798.771553
+291342.552358 9110766.594402
+291298.471542 9110719.337172
+291254.390821 9110672.079876
+291241.336463 9110653.985205
+291227.273370 9110633.880456
+291200.163389 9110596.685539
+291175.019009 9110556.479022
+291153.961564 9110531.344501
+291136.998438 9110522.286519
+291080.160510 9110497.115513
+291018.293797 9110463.903088
+291022.247164 9110460.893550
+291004.312424 9110454.848089
+290947.444972 9110425.658746
+290902.600760 9110409.540457
+290870.751412 9110403.480687
+290857.808447 9110400.453849
+290849.011538 9110420.535348
+290837.351482 9110456.686326
+290826.663086 9110489.824723
+290816.983407 9110524.973207
+290802.326777 9110559.112064
+290801.362513 9110563.129179
+290790.622210 9110589.235843
+290766.182082 9110644.459714
+290744.619897 9110685.623171
+290721.114317 9110732.811789
+290718.169633 9110737.831399
+290699.470561 9110762.925368
+290681.795018 9110792.038491
+290660.128986 9110819.138460
+290644.381959 9110840.217346
+290633.530404 9110851.255991
+290639.590196 9110864.321063
+290663.747903 9110905.531458
+290685.880780 9110941.717120
+290707.012370 9110976.897210
+290732.171544 9111019.113091
+290749.283074 9111048.261869
+290752.294474 9111052.283056
+290772.424851 9111086.457539
+290786.517617 9111110.580573
+290794.594993 9111127.665770
+290833.261438 9111114.646453
+290899.646317 9111086.587517
+290948.199930 9111066.546530
+291008.650811 9111042.499515
+291038.401518 9111033.489073
+291086.005584 9111019.474144
+291206.966290 9110979.415992
+291172.364373 9110869.887792
+291223.921582 9110852.863210
+291274.469985 9110833.828509
+291326.093901 9110825.844604
+291383.658965 9110814.853083
+291389.637268 9110816.868172
+291374.594993 9110798.771553
+Region 1
+85
+292137.748352 9110642.831886
+292257.109763 9110521.403789
+292058.632262 9110427.785930
+291996.794999 9110398.593100
+291985.817523 9110392.555007
+291772.380487 9110291.889008
+291733.469974 9110271.759459
+291721.483798 9110263.711229
+291703.519400 9110253.647934
+291688.521836 9110241.578574
+291677.522141 9110232.526801
+291666.522451 9110223.475023
+291652.518800 9110211.406649
+291639.479342 9110195.321154
+291627.448641 9110181.245714
+291481.997875 9110000.284674
+291403.762044 9109903.771137
+291349.572732 9109833.399452
+291238.205580 9109691.648189
+291200.586241 9109711.700287
+291184.773043 9109723.738435
+291127.416766 9109762.856296
+291039.353606 9109816.006028
+290996.816478 9109843.084642
+290990.875373 9109846.092130
+290960.880844 9109821.952775
+290951.891383 9109815.916402
+290942.130319 9109840.015002
+290928.490009 9109877.168455
+290917.786901 9109908.297768
+290914.894139 9109920.349108
+290908.114721 9109944.450768
+290905.296051 9109966.547440
+290905.333098 9109971.570107
+290956.251355 9110002.762604
+290980.245607 9110021.873163
+291006.272138 9110047.012934
+291023.331410 9110069.129938
+291039.426458 9110095.264045
+291055.514114 9110120.393610
+291066.602655 9110141.499959
+291075.673758 9110158.586144
+291077.683793 9110161.601770
+291088.757528 9110180.699044
+291112.863162 9110214.877477
+291143.963202 9110254.085638
+291171.013534 9110283.244399
+291195.082205 9110312.400101
+291201.104941 9110320.442422
+291022.247164 9110460.893550
+291018.293797 9110463.903088
+291080.160510 9110497.115513
+291136.998438 9110522.286519
+291153.961564 9110531.344501
+291175.019009 9110556.479022
+291200.163389 9110596.685539
+291227.273370 9110633.880456
+291241.336463 9110653.985205
+291254.390821 9110672.079876
+291298.471542 9110719.337172
+291342.552358 9110766.594402
+291374.594993 9110798.771553
+291389.637268 9110816.868172
+291404.560751 9110818.892300
+291414.678053 9110843.011065
+291421.724528 9110855.072453
+291427.918194 9110886.218907
+291445.208281 9110939.476048
+291449.280477 9110952.538948
+291460.235786 9110955.563565
+291505.829432 9110938.532649
+291577.205265 9110913.491469
+291637.759457 9110903.507141
+291684.413743 9110895.517829
+291699.307514 9110893.523736
+291757.881231 9110884.541793
+291814.415050 9110868.526094
+291884.781715 9110841.474441
+291942.197748 9110810.391689
+291988.688175 9110780.302501
+292000.540651 9110770.269129
+292035.126461 9110743.181591
+292055.879413 9110727.129966
+292098.319654 9110686.991474
+292137.748352 9110642.831886
+Region 1
+34
+291134.422110 9111787.984064
+291141.253409 9111770.914071
+291029.635629 9111596.013827
+290979.353052 9111516.605334
+290939.069268 9111445.243115
+290883.498525 9111322.634468
+290819.858155 9111183.945024
+290794.594993 9111127.665770
+290735.211870 9111161.758904
+290686.709895 9111188.831445
+290634.261809 9111219.918007
+290643.481300 9111257.094940
+290651.566079 9111275.184702
+290657.714898 9111300.304162
+290660.867133 9111323.411497
+290642.034457 9111330.423887
+290608.292909 9111337.420986
+290579.498738 9111341.409558
+290751.728623 9111648.970833
+290805.089282 9111741.441601
+290753.775603 9111791.615568
+290777.867348 9111823.784948
+290820.035410 9111881.085843
+290857.211648 9111935.368022
+290883.298849 9111968.543862
+290919.325465 9112001.729767
+290946.302786 9112020.843109
+290992.231755 9112049.016355
+291042.077134 9112069.157312
+291076.968919 9112083.255943
+291108.797221 9112086.301686
+291112.810103 9112091.328359
+291121.599602 9112070.242243
+291134.422110 9111787.984064
+Region 1
+125
+291108.797221 9112086.301686
+291076.968919 9112083.255943
+291042.077134 9112069.157312
+290992.231755 9112049.016355
+290946.302786 9112020.843109
+290919.325465 9112001.729767
+290883.298849 9111968.543862
+290857.211648 9111935.368022
+290820.035410 9111881.085843
+290777.867348 9111823.784948
+290753.775603 9111791.615568
+290805.089282 9111741.441601
+290751.728623 9111648.970833
+290579.498738 9111341.409558
+290608.292909 9111337.420986
+290642.034457 9111330.423887
+290660.867133 9111323.411497
+290657.714898 9111300.304162
+290651.566079 9111275.184702
+290643.481300 9111257.094940
+290634.261809 9111219.918007
+290603.516921 9111228.927210
+290566.756620 9111230.898530
+290552.804664 9111225.861566
+290525.879865 9111213.779575
+290475.998583 9111188.615092
+290412.128393 9111153.390848
+290392.183322 9111144.329535
+290376.524924 9111177.462806
+290358.982323 9111224.657525
+290341.373057 9111262.811423
+290325.707194 9111294.940157
+290313.052706 9111331.090111
+290296.407689 9111365.226891
+290286.646108 9111389.325493
+290273.643617 9111378.262258
+290231.721021 9111354.110263
+290190.799791 9111330.963784
+290151.859049 9111306.814780
+290125.898575 9111290.715420
+290105.931267 9111278.640372
+290095.940217 9111271.598306
+290067.375309 9111306.727204
+290041.740355 9111334.827428
+290022.068939 9111362.933836
+289997.435254 9111392.039618
+289972.882904 9111432.195306
+289961.103680 9111452.273665
+289947.410551 9111482.395334
+289884.696746 9111469.271220
+289874.949705 9111495.378865
+289861.093819 9111503.400685
+289830.392838 9111518.436671
+289812.568598 9111527.458877
+289798.742262 9111539.498837
+289784.901132 9111549.529717
+289779.983218 9111556.556305
+289761.342449 9111589.686388
+289740.765536 9111629.846166
+289704.012099 9111632.821408
+289661.346772 9111642.822165
+289604.747896 9111785.406498
+289639.676216 9111804.529093
+289673.662368 9111830.682388
+289707.596804 9111849.803878
+289745.507026 9111868.929476
+289776.459689 9111888.047793
+289772.587457 9111902.107193
+289756.765739 9111913.140559
+289750.846458 9111919.161581
+289751.892163 9111926.194385
+289759.086397 9111958.346861
+289771.479628 9112021.645194
+289781.855438 9112080.923294
+289791.222555 9112138.191274
+289796.369815 9112162.305355
+289803.608542 9112200.485033
+289816.046370 9112269.810545
+289819.116996 9112281.868097
+289827.275749 9112310.003412
+289840.818624 9112394.397997
+289852.716445 9112390.392211
+289873.530226 9112382.377543
+289893.342645 9112373.357299
+289911.167154 9112364.334990
+289931.951302 9112352.302151
+289954.701133 9112337.257749
+289968.564617 9112330.240384
+289975.514862 9112329.243043
+289986.455708 9112330.258887
+289992.419405 9112330.265053
+290011.289639 9112328.275499
+290022.223081 9112328.286797
+290054.029455 9112328.319648
+290076.860666 9112324.325100
+290107.643460 9112320.338743
+290122.515663 9112315.331435
+290146.325990 9112309.328807
+290175.113455 9112304.335823
+290195.978953 9112303.352780
+290224.788623 9112301.373374
+290247.627193 9112298.383282
+290298.333323 9112300.444454
+290349.039445 9112302.505569
+290385.852534 9112307.565965
+290437.567415 9112311.637066
+290481.308479 9112312.686367
+290538.964783 9112313.749847
+290582.720659 9112316.808117
+290654.284763 9112316.881119
+290696.045314 9112318.932717
+290717.837931 9112308.909649
+290746.521380 9112289.852854
+290785.159083 9112272.815217
+290789.120019 9112270.810194
+290815.874882 9112259.787607
+290829.752990 9112254.779080
+290867.389253 9112236.735846
+290902.036231 9112217.685030
+290949.574726 9112194.629163
+290993.152247 9112173.578295
+291057.520787 9112141.498661
+291114.004543 9112118.451704
+291112.810103 9112091.328359
+291108.797221 9112086.301686
+Region 1
+55
+293560.092616 9113324.260277
+293546.265389 9113202.701369
+293528.522402 9113089.174792
+293520.144199 9113031.909706
+293510.974155 9113001.765648
+293407.813245 9113029.793573
+293396.849900 9113025.765059
+293170.259350 9112895.965968
+292877.785820 9112727.930179
+292846.054315 9112737.944594
+292830.285633 9112756.010576
+292820.413400 9112765.041640
+292786.125627 9112832.310879
+292780.266489 9112846.368403
+292797.223315 9112854.420957
+292808.194063 9112859.454161
+292824.156950 9112867.505739
+292835.172513 9112878.566064
+292843.206241 9112889.623499
+292850.268433 9112903.693534
+292854.333850 9112915.751639
+292861.433398 9112934.844277
+292861.530499 9112947.903056
+292860.656061 9112963.974437
+292859.841381 9112988.081989
+292858.877310 9112992.099113
+292856.941698 9112999.128841
+292854.183938 9113029.261599
+292842.458215 9113056.372143
+292836.681248 9113081.479412
+292835.724645 9113086.501058
+292836.860520 9113105.587927
+292838.908181 9113113.626021
+292839.005289 9113126.684800
+292833.101334 9113134.715205
+292831.143308 9113138.731369
+292843.123027 9113145.774550
+292849.168915 9113156.830050
+292853.271723 9113173.910755
+292857.374535 9113190.991459
+292856.417934 9113196.013105
+292868.509738 9113218.124094
+292871.596196 9113232.190271
+292876.610795 9113238.222196
+292879.622543 9113242.243159
+292910.577100 9113261.358793
+292903.791275 9113284.456065
+292892.132804 9113320.607316
+292888.358726 9113347.725550
+292880.623763 9113376.848991
+292871.820114 9113395.926263
+292866.080528 9113426.056144
+292860.363355 9113459.199589
+293127.267117 9113396.171978
+293560.092616 9113324.260277
+Region 1
+73
+292879.622543 9113242.243159
+292876.610795 9113238.222196
+292871.596196 9113232.190271
+292868.509738 9113218.124094
+292856.417934 9113196.013105
+292857.374535 9113190.991459
+292853.271723 9113173.910755
+292849.168915 9113156.830050
+292843.123027 9113145.774550
+292831.143308 9113138.731369
+292833.101334 9113134.715205
+292839.005289 9113126.684800
+292838.908181 9113113.626021
+292836.860520 9113105.587927
+292835.724645 9113086.501058
+292836.681248 9113081.479412
+292842.458215 9113056.372143
+292854.183938 9113029.261599
+292856.941698 9112999.128841
+292858.877310 9112992.099113
+292859.841381 9112988.081989
+292860.656061 9112963.974437
+292861.530499 9112947.903056
+292861.433398 9112934.844277
+292854.333850 9112915.751639
+292850.268433 9112903.693534
+292843.206241 9112889.623499
+292835.172513 9112878.566064
+292824.156950 9112867.505739
+292808.194063 9112859.454161
+292797.223315 9112854.420957
+292780.266489 9112846.368403
+292786.125627 9112832.310879
+292820.413400 9112765.041640
+292830.285633 9112756.010576
+292846.054315 9112737.944594
+292771.687725 9112761.980849
+292706.236678 9112782.007602
+292673.503661 9112791.016426
+292580.438409 9112840.147119
+292487.380383 9112890.282191
+292455.700842 9112907.328043
+292352.740279 9112962.475818
+292237.911640 9113025.647917
+292192.338896 9113045.693556
+292170.509186 9113050.694713
+292197.614333 9113086.883954
+292203.630249 9113093.921479
+292315.711991 9113330.092764
+292346.023145 9113396.420478
+292219.042250 9113429.445396
+292250.168331 9113471.665575
+292382.520530 9113626.490354
+292397.579270 9113646.595349
+292505.001183 9113790.345583
+292600.317573 9113776.374802
+292608.418682 9113796.472952
+292657.990095 9113779.444181
+292682.569927 9113876.905881
+292734.749473 9113943.254230
+292753.717111 9113954.322185
+292776.615802 9113959.366835
+292787.302863 9113926.228170
+292855.595306 9113486.316866
+292860.363355 9113459.199589
+292866.080528 9113426.056144
+292871.820114 9113395.926263
+292880.623763 9113376.848991
+292888.358726 9113347.725550
+292892.132804 9113320.607316
+292903.791275 9113284.456065
+292910.577100 9113261.358793
+292879.622543 9113242.243159
+Region 1
+76
+292877.785820 9112727.930179
+292873.795111 9112725.917287
+292765.007326 9112665.540948
+292597.435455 9112586.021213
+292469.733554 9112521.607480
+292402.893439 9112488.393001
+292387.932138 9112481.346723
+292296.169081 9112438.062446
+292232.355703 9112410.877735
+292215.391662 9112401.820380
+292164.484669 9112372.639218
+292160.494012 9112370.626249
+292098.549467 9112327.370855
+292036.597584 9112283.110822
+291957.674426 9112228.788670
+291895.782343 9112192.564594
+291840.010253 9112177.441409
+291790.239010 9112167.346718
+291776.309017 9112165.323816
+291724.564792 9112157.236123
+291707.652990 9112155.210227
+291671.834074 9112150.151903
+291365.552680 9112129.754854
+291261.137168 9112122.618184
+291195.507519 9112118.533962
+291148.762696 9112114.468708
+291114.004543 9112118.451704
+291057.520787 9112141.498661
+290993.152247 9112173.578295
+290949.574726 9112194.629163
+290902.036231 9112217.685030
+290867.389253 9112236.735846
+290829.752990 9112254.779080
+290815.874882 9112259.787607
+290789.120019 9112270.810194
+290785.159083 9112272.815217
+290746.521380 9112289.852854
+290717.837931 9112308.909649
+290696.045314 9112318.932717
+290678.369404 9112348.045961
+290666.634903 9112374.151679
+290641.244729 9112435.401890
+290618.695427 9112477.569002
+290631.676109 9112485.618438
+290725.686079 9112564.067115
+290835.398545 9112480.802931
+290874.051186 9112465.774254
+290901.763761 9112584.336234
+291009.288596 9112608.553542
+291257.175953 9112662.042913
+291266.136369 9112664.060955
+291281.298338 9112698.229939
+291353.281502 9112889.161308
+291437.529629 9112857.100860
+291587.184999 9112798.987937
+291737.826390 9112739.871067
+291764.588581 9112729.852438
+291855.801047 9112698.802781
+291989.596633 9112646.700164
+292055.715545 9112850.682689
+292065.684851 9112854.710587
+292068.711409 9112860.740679
+292140.429680 9113015.507039
+292164.493281 9113043.657180
+292170.509186 9113050.694713
+292192.338896 9113045.693556
+292237.911640 9113025.647917
+292352.740279 9112962.475818
+292455.700842 9112907.328043
+292487.380383 9112890.282191
+292580.438409 9112840.147119
+292673.503661 9112791.016426
+292706.236678 9112782.007602
+292771.687725 9112761.980849
+292846.054315 9112737.944594
+292877.785820 9112727.930179
+Region 1
+30
+291790.239010 9112167.346718
+291783.050781 9112136.199442
+291771.871945 9112103.039148
+291743.565614 9112038.721651
+291738.506671 9112026.662364
+291721.208099 9111972.401009
+291715.013911 9111941.254693
+291500.064322 9111905.881448
+291526.001016 9111784.360335
+291441.383228 9111766.194005
+291377.675141 9111753.071158
+291335.878094 9111745.997423
+291301.045986 9111739.935190
+291264.255731 9111737.889045
+291229.490464 9111740.867529
+291181.863497 9111751.869180
+291141.253409 9111770.914071
+291134.422110 9111787.984064
+291121.599602 9112070.242243
+291112.810103 9112091.328359
+291114.004543 9112118.451704
+291148.762696 9112114.468708
+291195.507519 9112118.533962
+291261.137168 9112122.618184
+291365.552680 9112129.754854
+291671.834074 9112150.151903
+291707.652990 9112155.210227
+291724.564792 9112157.236123
+291776.309017 9112165.323816
+291790.239010 9112167.346718
+Region 1
+33
+292210.117051 9111690.616478
+292278.812702 9111572.151208
+292191.909654 9111513.803272
+292144.964597 9111482.616723
+292054.998231 9111413.215695
+291994.034321 9111367.951746
+291946.050969 9111330.736770
+291853.185239 9111272.382028
+291688.088193 9111526.360727
+291686.130089 9111530.376852
+291634.106403 9111618.722631
+291642.102414 9111624.757762
+291658.072138 9111633.814435
+291679.078418 9111651.916826
+291690.160327 9111672.018324
+291697.221921 9111686.088674
+291701.338925 9111705.178683
+291704.491754 9111728.285810
+291707.808209 9111773.492555
+291710.629085 9111886.001684
+291711.883350 9111921.161157
+291715.013911 9111941.254693
+291721.208099 9111972.401009
+291738.506671 9112026.662364
+291743.565614 9112038.721651
+291765.380078 9112031.711746
+291779.354672 9112039.761827
+291853.262978 9112088.052319
+291892.618429 9112033.847362
+291950.586638 9112077.099239
+292011.532978 9111985.748421
+292092.141730 9111865.285999
+292210.117051 9111690.616478
+Region 1
+77
+293355.301623 9111048.845678
+293159.802112 9110955.236627
+293154.810204 9110952.218239
+293036.110408 9110894.845514
+292913.427793 9110836.463999
+292903.451486 9110831.431676
+292687.993507 9110726.750944
+292640.114895 9110703.600001
+292594.231573 9110681.455477
+292570.795211 9110737.685324
+292543.316142 9110784.870536
+292509.910853 9110837.072486
+292445.072984 9110939.469275
+292386.261219 9110916.307297
+292373.270045 9111040.854637
+292346.542876 9111189.496840
+292375.641938 9111226.692718
+292389.653559 9111239.765269
+292424.671471 9111270.939834
+292191.909654 9111513.803272
+292278.812702 9111572.151208
+292210.117051 9111690.616478
+292092.141730 9111865.285999
+292011.532978 9111985.748421
+291950.586638 9112077.099239
+291892.618429 9112033.847362
+291853.262978 9112088.052319
+291779.354672 9112039.761827
+291765.380078 9112031.711746
+291743.565614 9112038.721651
+291771.871945 9112103.039148
+291783.050781 9112136.199442
+291790.239010 9112167.346718
+291840.010253 9112177.441409
+291895.782343 9112192.564594
+291957.674426 9112228.788670
+292036.597584 9112283.110822
+292098.549467 9112327.370855
+292160.494012 9112370.626249
+292164.484669 9112372.639218
+292215.391662 9112401.820380
+292232.355703 9112410.877735
+292296.169081 9112438.062446
+292387.932138 9112481.346723
+292402.893439 9112488.393001
+292469.733554 9112521.607480
+292597.435455 9112586.021213
+292765.007326 9112665.540948
+292873.795111 9112725.917287
+292877.785820 9112727.930179
+293170.259350 9112895.965968
+293396.849900 9113025.765059
+293407.813245 9113029.793573
+293510.974155 9113001.765648
+293499.786304 9112967.601620
+293436.702758 9112771.661761
+293381.750935 9112599.837738
+293324.744510 9112418.970959
+293290.113475 9112306.432340
+293272.827944 9112254.181081
+293265.698517 9112231.070439
+293250.400920 9112178.821070
+293242.113181 9112133.610026
+293234.752141 9112079.359255
+293218.363606 9112014.050134
+293211.174497 9111982.903305
+293208.947554 9111950.756747
+293213.693028 9111920.625940
+293230.148898 9111861.375561
+293245.707953 9111815.182985
+293262.231019 9111764.973289
+293277.857275 9111727.821392
+293278.828779 9111724.808792
+293337.544726 9111734.910497
+293789.205136 9111258.200908
+293490.965711 9111115.274316
+293355.301623 9111048.845678
+Region 1
+75
+292375.641938 9111226.692718
+292346.542876 9111189.496840
+292373.270045 9111040.854637
+292056.139789 9110762.288402
+292035.126461 9110743.181591
+292000.540651 9110770.269129
+291988.688175 9110780.302501
+291942.197748 9110810.391689
+291884.781715 9110841.474441
+291814.415050 9110868.526094
+291757.881231 9110884.541793
+291699.307514 9110893.523736
+291684.413743 9110895.517829
+291637.759457 9110903.507141
+291577.205265 9110913.491469
+291505.829432 9110938.532649
+291460.235786 9110955.563565
+291449.280477 9110952.538948
+291445.208281 9110939.476048
+291427.918194 9110886.218907
+291421.724528 9110855.072453
+291414.678053 9110843.011065
+291404.560751 9110818.892300
+291389.637268 9110816.868172
+291383.658965 9110814.853083
+291326.093901 9110825.844604
+291274.469985 9110833.828509
+291223.921582 9110852.863210
+291172.364373 9110869.887792
+291206.966290 9110979.415992
+291086.005584 9111019.474144
+291038.401518 9111033.489073
+291008.650811 9111042.499515
+290948.199930 9111066.546530
+290899.646317 9111086.587517
+290833.261438 9111114.646453
+290794.594993 9111127.665770
+290819.858155 9111183.945024
+290883.498525 9111322.634468
+290939.069268 9111445.243115
+290979.353052 9111516.605334
+291029.635629 9111596.013827
+291141.253409 9111770.914071
+291181.863497 9111751.869180
+291229.490464 9111740.867529
+291264.255731 9111737.889045
+291301.045986 9111739.935190
+291335.878094 9111745.997423
+291377.675141 9111753.071158
+291441.383228 9111766.194005
+291526.001016 9111784.360335
+291500.064322 9111905.881448
+291715.013911 9111941.254693
+291711.883350 9111921.161157
+291710.629085 9111886.001684
+291707.808209 9111773.492555
+291704.491754 9111728.285810
+291701.338925 9111705.178683
+291697.221921 9111686.088674
+291690.160327 9111672.018324
+291679.078418 9111651.916826
+291658.072138 9111633.814435
+291642.102414 9111624.757762
+291634.106403 9111618.722631
+291686.130089 9111530.376852
+291688.088193 9111526.360727
+291853.185239 9111272.382028
+291946.050969 9111330.736770
+291994.034321 9111367.951746
+292054.998231 9111413.215695
+292144.964597 9111482.616723
+292191.909654 9111513.803272
+292424.671471 9111270.939834
+292389.653559 9111239.765269
+292375.641938 9111226.692718
+Region 1
+15
+292570.795211 9110737.685324
+292594.231573 9110681.455477
+292500.469791 9110636.159771
+292257.109763 9110521.403789
+292137.748352 9110642.831886
+292098.319654 9110686.991474
+292055.879413 9110727.129966
+292035.126461 9110743.181591
+292056.139789 9110762.288402
+292373.270045 9111040.854637
+292386.261219 9110916.307297
+292445.072984 9110939.469275
+292509.910853 9110837.072486
+292543.316142 9110784.870536
+292570.795211 9110737.685324
+Region 1
+261
+289102.061675 9119239.515092
+288888.087294 9117589.854552
+288891.002838 9117580.816761
+288871.039954 9117569.746319
+288993.577296 9117606.035671
+289017.734984 9117242.419830
+288972.742923 9117207.214842
+288944.857348 9117200.154360
+288922.839869 9117180.040987
+288909.783770 9117161.945918
+288898.767641 9117150.884680
+288878.753137 9117132.782410
+288858.783074 9117120.707373
+288848.812854 9117116.678932
+288843.827744 9117114.664710
+288824.910983 9117110.627010
+288807.974941 9117105.586818
+288775.119131 9117098.521066
+288764.214074 9117102.527905
+288754.325281 9117109.549396
+288747.440873 9117119.587600
+288737.537271 9117124.600006
+288729.495965 9117112.537264
+288725.416106 9117098.469560
+288724.377638 9117092.441279
+288724.325831 9117085.409488
+288725.164471 9117064.315145
+288741.945068 9117048.260001
+288752.761300 9117032.198672
+288755.669463 9117022.156349
+288754.549583 9117005.078113
+288750.491936 9116994.024034
+288747.398747 9116978.952819
+288747.309937 9116966.898320
+288732.354668 9116960.855605
+288720.374175 9116953.811437
+288710.344801 9116941.746619
+288709.202747 9116921.654752
+288723.980399 9116903.588478
+288743.757920 9116889.545525
+288772.333911 9116855.421015
+288827.586483 9116799.224405
+288808.381216 9116756.009555
+288785.318190 9116728.863226
+288763.345442 9116714.776950
+288762.158998 9116688.657837
+288764.087904 9116680.623568
+288763.056855 9116675.599828
+288765.987211 9116668.571133
+288690.513298 9116678.538058
+288614.920980 9116672.432186
+288538.319812 9116664.316062
+288490.501795 9116650.202657
+288462.520480 9116630.082716
+288457.483688 9116621.036632
+288477.893025 9116557.772225
+288516.646189 9116555.803639
+288507.507517 9116529.676176
+288500.423492 9116512.591674
+288431.494102 9116466.310956
+288369.523172 9116420.037394
+288341.490339 9116392.885522
+288243.335061 9116292.328772
+288079.130419 9116131.429749
+288002.992783 9116050.986219
+288033.490735 9116007.823346
+288051.154682 9115976.701349
+288054.085141 9115969.672682
+288060.910576 9115951.598217
+288061.845575 9115943.562902
+288062.773194 9115934.523041
+288064.576774 9115909.411500
+288061.461824 9115891.326522
+288060.290677 9115867.216371
+288148.917608 9115618.184726
+288215.079812 9115423.374388
+288223.162559 9115305.852059
+288220.047650 9115287.767092
+288211.940490 9115266.663232
+288214.686418 9115234.520938
+288214.642142 9115228.493666
+288226.230956 9115182.297204
+288170.794476 9115213.379193
+288157.092126 9115242.496277
+288165.214012 9115265.609245
+288175.309200 9115286.715223
+288166.495800 9115304.787572
+288152.668000 9115316.827386
+288126.926647 9115330.863654
+288118.989201 9115332.864321
+288110.050352 9115333.859388
+288098.166312 9115339.874022
+288090.265749 9115346.897414
+288078.389079 9115353.916590
+288071.489913 9115361.945580
+288062.610069 9115370.977007
+288051.727414 9115377.997233
+288046.779411 9115381.005599
+288038.871456 9115387.024440
+288030.963498 9115393.043279
+288024.056941 9115400.067719
+288022.164776 9115413.124711
+288020.250482 9115423.168063
+288018.343563 9115434.215962
+288016.421892 9115443.254769
+288008.536051 9115452.287246
+288000.628079 9115458.306084
+287990.732047 9115464.322811
+287985.813532 9115471.349359
+287973.973689 9115483.391251
+287968.039015 9115487.403104
+287961.154561 9115497.441179
+287952.282045 9115507.477142
+287940.420059 9115516.505390
+287930.531380 9115523.526655
+287917.682729 9115533.558389
+287901.837231 9115541.577857
+287891.963287 9115550.608210
+287877.097061 9115556.619635
+287868.224513 9115566.655589
+287866.310186 9115576.698944
+287864.395858 9115586.742299
+287865.471000 9115597.793373
+287868.622695 9115620.901125
+287869.705215 9115632.956746
+287859.831248 9115641.987098
+287850.973431 9115654.032147
+287845.090339 9115665.075820
+287843.168633 9115674.114629
+287841.210059 9115678.130703
+287839.244112 9115681.142229
+287833.383134 9115695.199544
+287830.415777 9115697.205466
+287820.527043 9115704.226719
+287818.583213 9115710.251887
+287811.735565 9115725.312691
+287806.809626 9115731.334685
+287798.894206 9115736.348958
+287786.052841 9115747.385222
+287779.146198 9115754.409646
+287776.208324 9115760.433755
+287774.271860 9115767.463470
+287773.381041 9115781.526075
+287774.456178 9115792.577155
+287778.528174 9115805.640504
+287775.560807 9115807.646424
+287771.614149 9115811.660381
+287762.682556 9115813.659951
+287755.761155 9115818.675279
+287747.845715 9115823.689547
+287739.937644 9115829.708362
+287730.048867 9115836.729606
+287719.210280 9115849.777076
+287713.282907 9115854.793459
+287705.389569 9115862.821366
+287705.448542 9115870.857747
+287706.472069 9115874.876998
+287712.502651 9115883.924282
+287723.503434 9115892.976860
+287730.572297 9115908.052485
+287732.619357 9115916.090983
+287730.756611 9115933.166175
+287725.941232 9115954.256381
+287726.994255 9115962.293820
+287731.110503 9115981.384457
+287736.161813 9115992.439770
+287743.208584 9116004.501746
+287750.247985 9116015.559172
+287750.373336 9116032.636478
+287741.589169 9116054.727003
+287731.810953 9116076.816470
+287718.056554 9116098.901707
+287693.330786 9116115.952563
+287683.500930 9116131.010194
+287678.626549 9116144.064022
+287672.809728 9116164.148626
+287665.998858 9116184.232172
+287655.174935 9116199.288744
+287641.302515 9116205.301206
+287632.385581 9116209.309866
+287614.573823 9116220.340826
+287602.755826 9116235.396332
+287594.884529 9116246.437883
+287591.931871 9116250.452896
+287576.100811 9116260.481418
+287561.352242 9116282.565576
+287546.625771 9116307.663378
+287529.911187 9116332.759057
+287516.127147 9116350.826077
+287443.068460 9116419.056830
+287392.600180 9116450.143651
+287371.857673 9116468.203206
+287349.311225 9116511.374362
+287294.005084 9116560.537687
+287292.031704 9116562.544657
+287270.250852 9116574.575823
+287269.463047 9116602.702151
+287269.595640 9116620.784047
+287247.925245 9116647.883458
+287231.085173 9116655.901744
+287213.258400 9116664.923509
+287172.472512 9116660.861585
+287076.048736 9116660.757993
+286999.484034 9116657.661962
+286957.711425 9116654.603319
+286926.048672 9116674.660048
+286910.209926 9116683.683855
+286943.300966 9116722.896744
+286982.378524 9116765.129672
+287012.472777 9116802.330167
+287031.625017 9116838.514320
+287051.844986 9116884.745034
+287053.155667 9116927.941787
+287039.525907 9116967.104314
+287019.961176 9117010.278636
+287010.307653 9117049.445438
+287000.705661 9117095.644099
+286996.957638 9117126.780906
+286997.149083 9117152.899232
+287005.388831 9117192.085262
+287014.571126 9117224.240498
+287031.669200 9117251.381511
+287069.804884 9117300.645013
+287137.866041 9117364.004094
+287211.862360 9117423.351200
+287296.778962 9117480.700700
+287302.772909 9117484.725256
+287399.685017 9117551.128156
+287416.658083 9117561.191612
+287504.690175 9117636.625630
+287573.812889 9117709.025768
+287647.854564 9117774.399169
+287650.851570 9117776.411415
+287706.763730 9117809.620260
+287771.578393 9117836.811166
+287775.569489 9117838.824450
+287854.353068 9117873.061702
+287946.074587 9117909.321448
+288001.964892 9117939.516202
+288043.967658 9117973.714477
+288073.054785 9118008.903722
+288104.181878 9118051.126827
+288132.504225 9118117.455846
+288256.519771 9118489.263485
+288286.845737 9118557.603430
+288330.050658 9118619.929483
+288460.630678 9118802.890074
+288576.107680 9118959.716588
+288640.367456 9119046.172636
+288701.548824 9119119.566440
+288771.707008 9119196.987443
+288835.856298 9119268.374939
+288909.924626 9119336.758826
+288973.050548 9119404.126854
+288977.969159 9119397.100146
+289026.064868 9119448.380238
+289068.203442 9119500.658727
+289109.333159 9119550.927067
+289147.643972 9119623.292161
+289200.436938 9119772.016161
+289102.061675 9119239.515092
+Region 1
+305
+290675.442609 9114910.586861
+290635.467007 9114881.415433
+290588.518582 9114850.227882
+290538.513927 9114808.991929
+290516.489921 9114787.874668
+290491.528496 9114772.781578
+290458.563101 9114750.648698
+290433.594286 9114734.551033
+290396.667791 9114714.423140
+290356.766749 9114695.296720
+290333.800837 9114681.210067
+290321.754081 9114665.125424
+290309.581155 9114631.963693
+290299.425935 9114602.822109
+290293.239299 9114572.680024
+290278.218024 9114557.596863
+290252.270216 9114543.507116
+290220.373283 9114531.420353
+290201.442831 9114525.373926
+290167.624690 9114522.325912
+290143.724260 9114516.274396
+290081.065378 9114511.187856
+290009.527250 9114515.132908
+289994.632119 9114517.126738
+289968.684387 9114503.036802
+289952.646985 9114484.938877
+289936.572531 9114461.818261
+289923.502321 9114441.714300
+289902.524630 9114427.629402
+289859.679042 9114413.522061
+289803.013858 9114412.459363
+289705.624432 9114415.372814
+289637.023832 9114413.293091
+289618.167510 9114417.291771
+289561.739202 9114448.373999
+289516.378066 9114497.549166
+289493.612321 9114510.584546
+289446.968344 9114520.581629
+289412.185728 9114521.550167
+289395.250710 9114516.509975
+289357.537888 9114524.507157
+289323.793652 9114531.503896
+289304.870629 9114526.461606
+289277.943806 9114514.379274
+289258.019392 9114508.331391
+289212.332321 9114513.306576
+289200.404303 9114513.294173
+289189.625621 9114534.378148
+289183.713386 9114541.403728
+289174.811746 9114547.421664
+289190.878521 9114569.538093
+289188.942295 9114576.567808
+289178.104422 9114589.615462
+289141.437239 9114604.645305
+289095.897940 9114629.711215
+289047.457906 9114665.823933
+289043.533645 9114672.851575
+289023.934505 9114711.003408
+289008.096941 9114720.027691
+288969.441558 9114735.055360
+288964.508486 9114740.072879
+288956.593388 9114745.087284
+288950.636734 9114746.085598
+288939.732216 9114750.092346
+288929.829097 9114755.104671
+288919.940760 9114762.126078
+288908.020050 9114763.118156
+288898.116923 9114768.130476
+288887.241960 9114776.155380
+288880.335638 9114783.179899
+288868.474049 9114792.208303
+288860.573712 9114799.231780
+288855.692357 9114811.281085
+288848.815588 9114822.323769
+288839.876888 9114823.318952
+288832.926206 9114824.316214
+288823.965333 9114822.297768
+288812.037209 9114822.285282
+288799.100294 9114820.262668
+288787.179558 9114821.254718
+288779.242253 9114823.255473
+288775.317937 9114830.283105
+288775.362274 9114836.310359
+288770.495672 9114850.368747
+288769.582945 9114861.417672
+288764.716340 9114875.476060
+288760.843745 9114889.535489
+288745.042998 9114903.582420
+288735.147207 9114909.599258
+288727.224661 9114913.609093
+288718.322878 9114919.626971
+288712.395743 9114924.643431
+288705.481981 9114930.663391
+288701.542870 9114935.681935
+288692.655855 9114943.708895
+288684.740686 9114948.723268
+288676.825515 9114953.737640
+288664.926898 9114957.743296
+288654.022293 9114961.749992
+288635.180344 9114967.757424
+288625.277134 9114972.769701
+288608.467523 9114984.806471
+288596.561502 9114987.807569
+288581.658661 9114988.796443
+288571.748052 9114992.804168
+288563.840243 9114998.823068
+288554.938416 9115004.840923
+288544.107638 9115018.893034
+288535.213190 9115025.915429
+288526.303968 9115030.928736
+288514.427465 9115037.947992
+288502.558341 9115045.971788
+288483.716325 9115051.979170
+288465.868319 9115057.987592
+288453.019929 9115068.019420
+288441.136018 9115074.034117
+288428.295001 9115085.070485
+288408.481082 9115094.090426
+288390.633044 9115100.098825
+288378.741731 9115105.108965
+288362.881720 9115111.119451
+288351.005163 9115118.138674
+288342.103278 9115124.156499
+288330.219332 9115130.171174
+288317.363506 9115139.198430
+288302.512252 9115147.219040
+288291.607552 9115151.225667
+288271.815707 9115163.259197
+288257.928937 9115167.262666
+288245.036184 9115171.267183
+288233.159587 9115178.286383
+288226.230956 9115182.297204
+288214.642142 9115228.493666
+288214.686418 9115234.520938
+288211.940490 9115266.663232
+288220.047650 9115287.767092
+288223.162559 9115305.852059
+288215.079812 9115423.374388
+288148.917608 9115618.184726
+288060.290677 9115867.216371
+288061.461824 9115891.326522
+288064.576774 9115909.411500
+288062.773194 9115934.523041
+288061.845575 9115943.562902
+288060.910576 9115951.598217
+288054.085141 9115969.672682
+288051.154682 9115976.701349
+288033.490735 9116007.823346
+288002.992783 9116050.986219
+288079.130419 9116131.429749
+288243.335061 9116292.328772
+288341.490339 9116392.885522
+288369.523172 9116420.037394
+288431.494102 9116466.310956
+288500.423492 9116512.591674
+288507.507517 9116529.676176
+288516.646189 9116555.803639
+288477.893025 9116557.772225
+288457.483688 9116621.036632
+288462.520480 9116630.082716
+288490.501795 9116650.202657
+288538.319812 9116664.316062
+288614.920980 9116672.432186
+288690.513298 9116678.538058
+288765.987211 9116668.571133
+288752.923961 9116649.471423
+288731.099238 9116655.475956
+288693.147751 9116631.327685
+288682.087437 9116614.239096
+288693.860689 9116593.156122
+288732.428870 9116566.073802
+288778.978983 9116543.017885
+288800.677851 9116519.936138
+288822.421098 9116502.881634
+288833.148414 9116474.765824
+288849.001354 9116467.750538
+288882.821124 9116470.799210
+288886.789907 9116469.798791
+288919.623031 9116473.850946
+288937.656502 9116492.955750
+288945.571859 9116487.941280
+288948.516985 9116482.921663
+288940.401765 9116460.813534
+288927.227508 9116426.645764
+288929.023152 9116400.529761
+288957.680183 9116377.455182
+288981.463202 9116367.434473
+289003.339557 9116368.461644
+289039.117705 9116367.494111
+289048.976689 9116356.454443
+289052.664102 9116317.281485
+289076.513700 9116316.301600
+289096.416747 9116319.335757
+289120.177474 9116306.301371
+289135.014036 9116296.271363
+289138.953171 9116291.252767
+289146.787004 9116275.188338
+289151.668335 9116263.138990
+289159.620656 9116263.147194
+289166.638186 9116271.190689
+289181.652481 9116285.269620
+289191.637326 9116291.307105
+289210.561131 9116296.349266
+289233.431470 9116297.377357
+289253.171522 9116278.311583
+289269.053935 9116275.314337
+289287.020739 9116285.378138
+289304.994959 9116296.446469
+289331.804398 9116292.455904
+289340.706295 9116286.437865
+289348.540048 9116270.373418
+289351.403602 9116254.303864
+289346.359308 9116244.253370
+289334.230782 9116217.118565
+289335.158134 9116208.078738
+289349.942735 9116191.016907
+289355.936600 9116195.041192
+289363.970412 9116206.099288
+289373.992304 9116217.159424
+289374.764030 9116187.024289
+289364.490208 9116141.809839
+289369.356651 9116127.751407
+289381.403646 9116143.836281
+289388.465645 9116157.906968
+289401.454817 9116166.961086
+289441.965735 9116133.853156
+289459.517437 9116087.662760
+289449.488153 9116075.598102
+289437.404108 9116054.490556
+289441.224614 9116033.399334
+289452.158983 9116033.410559
+289461.216455 9116048.487813
+289475.214457 9116059.552009
+289492.083385 9116055.551188
+289509.820330 9116034.474237
+289539.322567 9115991.309676
+289567.860375 9115952.162240
+289596.383310 9115911.005722
+289645.714077 9115860.829723
+289701.038561 9115814.677939
+289739.612804 9115788.599590
+289761.310809 9115765.517578
+289785.990867 9115742.438604
+289800.693567 9115714.326798
+289827.287452 9115681.204478
+289829.067812 9115653.079489
+289827.962529 9115638.010430
+289817.829460 9115611.882341
+289823.674922 9115595.815845
+289833.615142 9115595.825988
+289847.501779 9115591.822040
+289868.183372 9115565.725387
+289896.883870 9115548.677660
+289924.456786 9115513.547262
+289939.374499 9115514.566985
+289958.149580 9115499.518179
+290003.614747 9115464.405965
+290023.361540 9115446.344547
+290041.335487 9115457.412627
+290050.259383 9115454.408114
+290059.101645 9115440.353712
+290065.948446 9115425.292754
+290083.877859 9115430.333606
+290095.694733 9115415.277694
+290116.465168 9115401.235398
+290130.262633 9115385.176965
+290123.067010 9115353.024786
+290133.830462 9115329.931584
+290160.579779 9115317.904403
+290172.530217 9115320.930107
+290168.769430 9115350.057579
+290179.740709 9115355.091340
+290190.615483 9115347.066149
+290205.340104 9115321.967900
+290218.262286 9115321.980996
+290225.405991 9115347.101405
+290232.683353 9115390.303427
+290246.762921 9115412.417269
+290271.635590 9115415.456017
+290295.410276 9115404.430271
+290305.313296 9115399.417651
+290338.768164 9115353.243254
+290354.501560 9115330.155047
+290350.369540 9115309.055823
+290362.201141 9115296.008936
+290377.029628 9115284.974127
+290368.483370 9115204.603405
+290379.276374 9115185.528315
+290404.972087 9115165.463752
+290432.722644 9115154.441987
+290450.570237 9115148.432844
+290469.448977 9115147.447365
+290506.175292 9115140.452715
+290544.837593 9115126.428312
+290572.439460 9115095.315822
+290591.013493 9115053.144464
+290590.753418 9115017.985825
+290599.617727 9115006.944972
+290614.587250 9115014.996236
+290627.576199 9115024.050027
+290647.456303 9115024.070018
+290674.093765 9114996.974625
+290692.823761 9114975.898428
+290684.485249 9114923.654771
+290675.442609 9114910.586861
+Region 1
+113
+290721.230712 9114113.040333
+290683.385010 9114102.956901
+290607.738191 9114088.817127
+290553.988755 9114078.717493
+290512.181995 9114070.638944
+290501.181350 9114061.587062
+290460.353745 9114051.500399
+290451.407882 9114051.491322
+290337.151527 9114058.406925
+290287.474496 9114061.369946
+290282.497148 9114060.360350
+290205.878632 9114049.232453
+290162.788691 9114001.975669
+290041.137747 9113815.008967
+290026.064152 9113927.500708
+289991.178350 9113914.406072
+289973.190292 9113901.328745
+289960.120291 9113881.224755
+289944.001664 9113852.076867
+289931.955314 9113835.992030
+289918.914990 9113819.906165
+289913.745037 9113792.778565
+289900.593609 9113761.624638
+289883.599622 9113748.548277
+289866.590829 9113733.462833
+289855.531117 9113716.374446
+289842.394573 9113687.229561
+289835.392274 9113681.195170
+289830.400155 9113678.176437
+289805.609902 9113686.187125
+289787.799717 9113697.218590
+289705.824988 9113768.455629
+289700.958731 9113782.514028
+289673.245664 9113798.557886
+289635.644555 9113821.623224
+289614.918937 9113841.692404
+289587.999929 9113830.614715
+289572.081373 9113828.589175
+289538.248891 9113823.531480
+289509.526935 9113837.565150
+289495.625943 9113839.559801
+289480.701365 9113837.535259
+289476.718025 9113836.526596
+289458.767098 9113828.471718
+289419.794528 9113800.304367
+289389.819642 9113779.178049
+289372.892318 9113775.142320
+289343.028406 9113769.084059
+289304.226032 9113764.021000
+289298.306495 9113770.042029
+289294.367531 9113775.060588
+289182.276379 9113806.084205
+289170.370723 9113809.085372
+289141.604254 9113817.091589
+289073.218709 9113844.142489
+289072.261674 9113849.164156
+289116.152348 9113870.305254
+289226.015974 9113941.741767
+289446.308950 9114026.351502
+289446.345949 9114031.374198
+289447.406537 9114040.416081
+289425.950756 9114231.254824
+289415.697666 9114323.661099
+289407.782699 9114328.675555
+289379.060402 9114342.709225
+289359.224861 9114348.715844
+289323.729523 9114387.855760
+289387.263988 9114376.871807
+289398.575403 9114428.114641
+289446.968344 9114520.581629
+289493.612321 9114510.584546
+289516.378066 9114497.549166
+289561.739202 9114448.373999
+289618.167510 9114417.291771
+289637.023832 9114413.293091
+289705.624432 9114415.372814
+289803.013858 9114412.459363
+289859.679042 9114413.522061
+289902.524630 9114427.629402
+289923.502321 9114441.714300
+289936.572531 9114461.818261
+289952.646985 9114484.938877
+289968.684387 9114503.036802
+289994.632119 9114517.126738
+290009.527250 9114515.132908
+290081.065378 9114511.187856
+290143.724260 9114516.274396
+290167.624690 9114522.325912
+290201.442831 9114525.373926
+290220.373283 9114531.420353
+290252.270216 9114543.507116
+290278.218024 9114557.596863
+290293.239299 9114572.680024
+290299.425935 9114602.822109
+290309.581155 9114631.963693
+290321.754081 9114665.125424
+290333.800837 9114681.210067
+290356.766749 9114695.296720
+290396.667791 9114714.423140
+290433.594286 9114734.551033
+290458.563101 9114750.648698
+290491.528496 9114772.781578
+290516.489921 9114787.874668
+290538.513927 9114808.991929
+290647.556782 9114768.920815
+290630.116405 9114695.572930
+290625.999251 9114676.482807
+290609.642121 9114615.190289
+290619.500365 9114604.150452
+290711.464745 9114405.347191
+290802.886053 9114133.213093
+290763.030074 9114120.114139
+290721.230712 9114113.040333
+Region 1
+61
+291530.118940 9114889.338600
+291535.081477 9114888.338975
+291424.036193 9114658.194024
+291396.781386 9114601.913852
+291391.729520 9114590.859113
+291276.043498 9114404.907779
+291262.898390 9114374.759047
+291247.854627 9114356.662678
+291218.909938 9114340.561499
+291186.063718 9114334.501628
+291159.337653 9114349.542808
+291117.701744 9114364.569093
+291094.869766 9114368.564382
+291070.064679 9114374.566735
+290981.614536 9114376.487296
+290979.366313 9114341.326729
+290971.102129 9114299.128468
+290967.993773 9114282.048456
+290957.905209 9114261.947875
+290942.787251 9114233.806057
+290914.702900 9114199.624074
+290880.706709 9114172.467792
+290858.757282 9114161.395970
+290854.766478 9114159.382911
+290826.830859 9114145.291480
+290802.886053 9114133.213093
+290711.464745 9114405.347191
+290619.500365 9114604.150452
+290609.642121 9114615.190289
+290625.999251 9114676.482807
+290630.116405 9114695.572930
+290647.556782 9114768.920815
+290538.513927 9114808.991929
+290588.518582 9114850.227882
+290635.467007 9114881.415433
+290675.442609 9114910.586861
+290684.485249 9114923.654771
+290692.823761 9114975.898428
+290743.674061 9114997.044494
+290771.573083 9115006.113196
+290804.434698 9115014.182327
+290818.499469 9115034.286894
+290833.588003 9115058.410574
+290847.645366 9115077.510595
+290861.501944 9115069.488270
+290880.231856 9115048.412009
+290904.970400 9115033.368892
+290937.541943 9115002.261219
+290941.503079 9115000.256130
+290980.157609 9114985.226884
+291052.563529 9114964.204128
+291104.087895 9114942.155962
+291143.654429 9114916.077765
+291200.163561 9114896.043517
+291222.031548 9114896.065245
+291242.905533 9114896.085976
+291247.853195 9114893.077323
+291284.497146 9114875.032301
+291384.697343 9114849.014053
+291411.587408 9114856.072313
+291530.118940 9114889.338600
+Region 1
+91
+290031.932510 9113779.841031
+290029.892668 9113772.807240
+290011.771276 9113741.648265
+289993.724014 9113720.534639
+289968.726321 9113700.418393
+289931.697177 9113666.226351
+289908.465263 9113615.975995
+289891.086169 9113550.663700
+289890.826929 9113515.504904
+289890.493631 9113470.300738
+289909.706529 9113379.912886
+289919.357404 9113340.746184
+289939.919732 9113298.577135
+290029.319105 9113156.026035
+290004.403253 9113146.959636
+289980.562849 9113148.944148
+289978.804523 9113180.082739
+289961.944095 9113185.088020
+289943.073506 9113187.077637
+289908.358657 9113197.087145
+289887.470498 9113195.056542
+289879.652032 9113213.130008
+289869.845621 9113231.201423
+289853.125837 9113255.292880
+289837.029803 9113229.158490
+289801.796668 9113168.850295
+289766.615452 9113115.573813
+289752.588880 9113100.491343
+289717.474388 9113056.255639
+289637.421777 9113118.453540
+289599.784132 9113136.496032
+289563.110830 9113150.521376
+289525.384356 9113156.509350
+289501.536469 9113157.489077
+289459.774925 9113155.436546
+289422.975834 9113152.384616
+289418.999952 9113152.380472
+289419.229177 9113183.521204
+289438.181183 9113192.581736
+289448.209639 9113204.646563
+289459.298631 9113225.753277
+289466.507893 9113259.914860
+289469.719090 9113291.058684
+289469.785655 9113300.099539
+289466.142594 9113345.299676
+289469.213275 9113357.357250
+289473.292728 9113371.424936
+289468.478182 9113392.515094
+289466.630769 9113411.599275
+289455.963312 9113447.751323
+289449.234772 9113478.884810
+289455.427944 9113510.031732
+289488.658305 9113568.329091
+289490.668458 9113571.344773
+289502.788572 9113597.475174
+289486.149856 9113632.616500
+289469.488925 9113664.744209
+289462.782593 9113698.891318
+289461.943976 9113719.985610
+289474.300902 9113778.261264
+289480.701365 9113837.535259
+289495.625943 9113839.559801
+289509.526935 9113837.565150
+289538.248891 9113823.531480
+289572.081373 9113828.589175
+289587.999929 9113830.614715
+289614.918937 9113841.692404
+289635.644555 9113821.623224
+289673.245664 9113798.557886
+289700.958731 9113782.514028
+289705.824988 9113768.455629
+289787.799717 9113697.218590
+289805.609902 9113686.187125
+289830.400155 9113678.176437
+289835.392274 9113681.195170
+289842.394573 9113687.229561
+289855.531117 9113716.374446
+289866.590829 9113733.462833
+289883.599622 9113748.548277
+289900.593609 9113761.624638
+289913.745037 9113792.778565
+289918.914990 9113819.906165
+289931.955314 9113835.992030
+289944.001664 9113852.076867
+289960.120291 9113881.224755
+289973.190292 9113901.328745
+289991.178350 9113914.406072
+290026.064152 9113927.500708
+290041.137747 9113815.008967
+290038.133567 9113811.992302
+290031.932510 9113779.841031
+Region 1
+47
+292054.178100 9114384.580256
+291874.254493 9114248.793971
+291886.970052 9114087.078951
+291891.775951 9114064.984263
+291885.782269 9114060.960297
+291789.001289 9114011.643609
+291771.820539 9113973.454939
+291675.680429 9114010.527276
+291576.304987 9114013.442551
+291566.484352 9114029.505153
+291562.545671 9114034.523854
+291473.887988 9114008.318425
+291459.231416 9114042.457590
+291451.391244 9114057.517622
+291411.203785 9114133.821323
+291372.877644 9114193.050004
+291343.318644 9114228.178874
+291309.820872 9114268.326426
+291271.427530 9114318.514312
+291223.857551 9114337.552862
+291218.909938 9114340.561499
+291247.854627 9114356.662678
+291262.898390 9114374.759047
+291276.043498 9114404.907779
+291391.729520 9114590.859113
+291396.781386 9114601.913852
+291424.036193 9114658.194024
+291535.081477 9114888.338975
+291586.717178 9114881.358245
+291629.272731 9114856.287167
+291706.454080 9114809.150685
+291747.993123 9114781.064969
+291776.729483 9114769.038961
+291797.580981 9114766.045872
+291803.522574 9114763.038146
+291832.229074 9114746.994005
+291880.673706 9114711.883342
+291897.452243 9114695.827484
+291923.161770 9114677.771331
+291977.756669 9114667.779568
+292044.174956 9114643.736046
+292071.932048 9114633.717968
+292127.528272 9114624.731540
+292150.233290 9114603.658808
+292164.052103 9114590.613549
+292217.085532 9114504.276737
+292054.178100 9114384.580256
+Region 1
+44
+292764.000571 9114000.539757
+292776.615802 9113959.366835
+292753.717111 9113954.322185
+292734.749473 9113943.254230
+292682.569927 9113876.905881
+292657.990095 9113779.444181
+292608.418682 9113796.472952
+292600.317573 9113776.374802
+292505.001183 9113790.345583
+292397.579270 9113646.595349
+292382.520530 9113626.490354
+292250.168331 9113471.665575
+292091.984156 9113586.025627
+292010.948538 9113649.230714
+291972.235961 9113656.224295
+291785.630575 9113691.198614
+291771.752241 9113696.207509
+291773.926419 9113721.322642
+291765.271213 9113760.490357
+291746.862511 9113824.761432
+291749.349593 9113892.066697
+291763.645209 9113943.311295
+291771.820539 9113973.454939
+291789.001289 9114011.643609
+291885.782269 9114060.960297
+291891.775951 9114064.984263
+291886.970052 9114087.078951
+291874.254493 9114248.793971
+292054.178100 9114384.580256
+292217.085532 9114504.276737
+292246.569206 9114459.102178
+292281.015279 9114412.927922
+292315.379171 9114355.703896
+292335.094566 9114333.623698
+292362.784185 9114314.564789
+292374.652224 9114306.540186
+292472.615641 9114247.368782
+292539.944748 9114212.275949
+292577.514199 9114185.190387
+292622.841171 9114131.994914
+292653.482564 9114108.920678
+292687.083431 9114082.835741
+292725.579397 9114046.710365
+292764.000571 9114000.539757
+Region 1
+64
+292186.025248 9113400.282055
+292140.124073 9113376.128630
+292112.211150 9113365.051543
+292085.284744 9113352.970887
+292048.470916 9113347.912118
+292036.528476 9113345.891339
+291968.976368 9113350.847449
+291931.272884 9113359.850969
+291894.253585 9113193.064304
+291892.220973 9113187.035182
+291813.832302 9113205.039062
+291736.169446 9113186.880823
+291655.517301 9113167.714949
+291651.712674 9113190.815140
+291639.911700 9113207.880270
+291592.581193 9113259.063803
+291481.949467 9113352.374205
+291420.811757 9113284.005832
+291320.052245 9113368.285078
+291342.120311 9113395.429211
+291275.911309 9113447.598208
+291239.357605 9113477.697322
+291177.131665 9113530.874734
+291105.077373 9113599.110084
+291068.590326 9113638.249889
+291016.340859 9113696.459798
+290989.793412 9113735.609552
+291034.827056 9113776.840222
+291065.878200 9113809.016105
+291076.878852 9113818.067839
+291100.037721 9113858.271959
+291130.176793 9113901.496610
+291160.345676 9113948.739346
+291199.557147 9114009.049867
+291215.721189 9114044.224282
+291223.948288 9114081.399812
+291223.229568 9114118.566415
+291219.447068 9114144.680219
+291222.562933 9114162.764725
+291227.629569 9114175.828565
+291343.318644 9114228.178874
+291372.877644 9114193.050004
+291411.203785 9114133.821323
+291451.391244 9114057.517622
+291459.231416 9114042.457590
+291473.887988 9114008.318425
+291562.545671 9114034.523854
+291566.484352 9114029.505153
+291576.304987 9114013.442551
+291675.680429 9114010.527276
+291771.820539 9113973.454939
+291763.645209 9113943.311295
+291749.349593 9113892.066697
+291746.862511 9113824.761432
+291765.271213 9113760.490357
+291773.926419 9113721.322642
+291771.752241 9113696.207509
+291785.630575 9113691.198614
+291972.235961 9113656.224295
+292010.948538 9113649.230714
+292091.984156 9113586.025627
+292250.168331 9113471.665575
+292219.042250 9113429.445396
+292186.025248 9113400.282055
+Region 1
+152
+292203.630249 9113093.921479
+292197.614333 9113086.883954
+292170.509186 9113050.694713
+292164.493281 9113043.657180
+292140.429680 9113015.507039
+292068.711409 9112860.740679
+292065.684851 9112854.710587
+292055.715545 9112850.682689
+291989.596633 9112646.700164
+291855.801047 9112698.802781
+291764.588581 9112729.852438
+291737.826390 9112739.871067
+291587.184999 9112798.987937
+291437.529629 9112857.100860
+291353.281502 9112889.161308
+291281.298338 9112698.229939
+291266.136369 9112664.060955
+291257.175953 9112662.042913
+291009.288596 9112608.553542
+290901.763761 9112584.336234
+290929.617634 9112721.984260
+290943.014276 9112786.287354
+290845.940787 9112831.392772
+290829.095500 9112838.407389
+290845.280919 9112876.595715
+290866.443587 9112915.793589
+290840.778871 9112939.876214
+290834.103294 9112978.041397
+290830.313073 9113003.150680
+290834.400285 9113018.222685
+290797.030701 9113072.429207
+290763.154346 9113061.345129
+290739.135963 9113039.221238
+290730.116087 9113029.166842
+290724.159743 9113030.165327
+290632.819196 9113044.135972
+290563.316048 9113054.110566
+290535.448007 9113049.059571
+290525.530637 9113052.063052
+290482.723488 9113042.978702
+290448.951008 9113045.957845
+290418.078832 9113037.890129
+290422.217833 9113059.993944
+290401.745050 9113114.217499
+290377.815747 9113104.147797
+290309.269257 9113109.100375
+290306.391154 9113123.160815
+290217.831874 9113110.011290
+290201.386565 9113171.270637
+290175.023781 9113235.533407
+290156.056860 9113224.464150
+290143.031522 9113210.387395
+290084.209578 9113186.218325
+290060.591430 9113218.338971
+290034.926045 9113242.421278
+289996.368653 9113270.508429
+289966.675469 9113287.554864
+289939.919732 9113298.577135
+289919.357404 9113340.746184
+289909.706529 9113379.912886
+289890.493631 9113470.300738
+289890.826929 9113515.504904
+289891.086169 9113550.663700
+289908.465263 9113615.975995
+289931.697177 9113666.226351
+289968.726321 9113700.418393
+289993.724014 9113720.534639
+290011.771276 9113741.648265
+290029.892668 9113772.807240
+290031.932510 9113779.841031
+290038.133567 9113811.992302
+290041.137747 9113815.008967
+290162.788691 9114001.975669
+290205.878632 9114049.232453
+290282.497148 9114060.360350
+290287.474496 9114061.369946
+290337.151527 9114058.406925
+290451.407882 9114051.491322
+290460.353745 9114051.500399
+290501.181350 9114061.587062
+290512.181995 9114070.638944
+290553.988755 9114078.717493
+290607.738191 9114088.817127
+290683.385010 9114102.956901
+290721.230712 9114113.040333
+290763.030074 9114120.114139
+290802.886053 9114133.213093
+290826.830859 9114145.291480
+290854.766478 9114159.382911
+290858.757282 9114161.395970
+290880.706709 9114172.467792
+290914.702900 9114199.624074
+290942.787251 9114233.806057
+290957.905209 9114261.947875
+290967.993773 9114282.048456
+290971.102129 9114299.128468
+290979.366313 9114341.326729
+290981.614536 9114376.487296
+291070.064679 9114374.566735
+291094.869766 9114368.564382
+291117.701744 9114364.569093
+291159.337653 9114349.542808
+291186.063718 9114334.501628
+291218.909938 9114340.561499
+291223.857551 9114337.552862
+291271.427530 9114318.514312
+291309.820872 9114268.326426
+291343.318644 9114228.178874
+291227.629569 9114175.828565
+291222.562933 9114162.764725
+291219.447068 9114144.680219
+291223.229568 9114118.566415
+291223.948288 9114081.399812
+291215.721189 9114044.224282
+291199.557147 9114009.049867
+291160.345676 9113948.739346
+291130.176793 9113901.496610
+291100.037721 9113858.271959
+291076.878852 9113818.067839
+291065.878200 9113809.016105
+291034.827056 9113776.840222
+290989.793412 9113735.609552
+291016.340859 9113696.459798
+291068.590326 9113638.249889
+291105.077373 9113599.110084
+291177.131665 9113530.874734
+291239.357605 9113477.697322
+291275.911309 9113447.598208
+291342.120311 9113395.429211
+291320.052245 9113368.285078
+291420.811757 9113284.005832
+291481.949467 9113352.374205
+291592.581193 9113259.063803
+291639.911700 9113207.880270
+291651.712674 9113190.815140
+291655.517301 9113167.714949
+291736.169446 9113186.880823
+291813.832302 9113205.039062
+291892.220973 9113187.035182
+291894.253585 9113193.064304
+291931.272884 9113359.850969
+291968.976368 9113350.847449
+292036.528476 9113345.891339
+292048.470916 9113347.912118
+292085.284744 9113352.970887
+292112.211150 9113365.051543
+292140.124073 9113376.128630
+292186.025248 9113400.282055
+292219.042250 9113429.445396
+292346.023145 9113396.420478
+292315.711991 9113330.092764
+292203.630249 9113093.921479
+Region 1
+84
+290901.763761 9112584.336234
+290874.051186 9112465.774254
+290835.398545 9112480.802931
+290725.686079 9112564.067115
+290631.676109 9112485.618438
+290618.695427 9112477.569002
+290580.546962 9112560.905780
+290527.748646 9112679.386035
+290507.098078 9112709.500759
+290448.617841 9112731.540632
+290384.151550 9112750.560738
+290292.966919 9112785.625831
+290066.936927 9112865.755925
+290047.131775 9112875.780821
+290011.475070 9112892.821082
+290002.559037 9112896.830009
+289969.876774 9112912.868781
+289958.972807 9112916.875651
+289927.269663 9112930.906350
+289890.589274 9112943.927361
+289850.919563 9112955.940727
+289792.334892 9112963.916370
+289740.811544 9112985.962685
+289737.844449 9112987.968672
+289712.119749 9113004.014502
+289706.185554 9113008.026473
+289700.251357 9113012.038444
+289693.323193 9113016.049383
+289704.360419 9113030.124254
+289717.474388 9113056.255639
+289752.588880 9113100.491343
+289766.615452 9113115.573813
+289801.796668 9113168.850295
+289837.029803 9113229.158490
+289853.125837 9113255.292880
+289869.845621 9113231.201423
+289879.652032 9113213.130008
+289887.470498 9113195.056542
+289908.358657 9113197.087145
+289943.073506 9113187.077637
+289961.944095 9113185.088020
+289978.804523 9113180.082739
+289980.562849 9113148.944148
+290004.403253 9113146.959636
+290029.319105 9113156.026035
+289939.919732 9113298.577135
+289966.675469 9113287.554864
+289996.368653 9113270.508429
+290034.926045 9113242.421278
+290060.591430 9113218.338971
+290084.209578 9113186.218325
+290143.031522 9113210.387395
+290156.056860 9113224.464150
+290175.023781 9113235.533407
+290201.386565 9113171.270637
+290217.831874 9113110.011290
+290306.391154 9113123.160815
+290309.269257 9113109.100375
+290377.815747 9113104.147797
+290401.745050 9113114.217499
+290422.217833 9113059.993944
+290418.078832 9113037.890129
+290448.951008 9113045.957845
+290482.723488 9113042.978702
+290525.530637 9113052.063052
+290535.448007 9113049.059571
+290563.316048 9113054.110566
+290632.819196 9113044.135972
+290724.159743 9113030.165327
+290730.116087 9113029.166842
+290739.135963 9113039.221238
+290763.154346 9113061.345129
+290797.030701 9113072.429207
+290834.400285 9113018.222685
+290830.313073 9113003.150680
+290834.103294 9112978.041397
+290840.778871 9112939.876214
+290866.443587 9112915.793589
+290845.280919 9112876.595715
+290829.095500 9112838.407389
+290845.940787 9112831.392772
+290943.014276 9112786.287354
+290929.617634 9112721.984260
+290901.763761 9112584.336234
+Region 1
+104
+282859.930695 9118541.597145
+282848.907977 9118529.529603
+282837.834309 9118510.430045
+282831.753102 9118494.349961
+282824.648662 9118474.250430
+282817.529673 9118452.141749
+282811.346588 9118421.997631
+282802.173875 9118390.845476
+282791.861510 9118339.600692
+282823.728609 9118210.048781
+282232.132869 9118058.673124
+282223.265719 9118069.712962
+282220.377793 9118082.768958
+282216.510275 9118097.832941
+282211.670430 9118115.909487
+282209.820199 9118134.994113
+282204.000759 9118155.078647
+282199.168171 9118174.159771
+282184.532388 9118212.316182
+282180.701175 9118232.403052
+282173.880335 9118251.481842
+282171.028713 9118269.560726
+282164.236921 9118292.657825
+282163.315433 9118302.702428
+282159.433369 9118315.757260
+282149.622883 9118333.827971
+282128.906087 9118355.904142
+282111.142592 9118373.965505
+282094.344157 9118388.009723
+282077.589285 9118408.081403
+282061.792215 9118423.131361
+282054.949526 9118439.196418
+282036.199106 9118458.261175
+282015.445895 9118475.314432
+282005.591760 9118487.357666
+281992.784281 9118503.415700
+281989.976160 9118527.522060
+282022.884043 9118541.624754
+282056.749757 9118550.705700
+282074.731217 9118562.781661
+282087.785624 9118580.879239
+282094.947906 9118609.015578
+282105.157967 9118646.196611
+282106.362760 9118675.330517
+282111.587673 9118710.496553
+282117.799467 9118744.659175
+282127.030002 9118783.848176
+282138.190701 9118815.002886
+282158.393091 9118859.227573
+282173.552182 9118893.400651
+282187.789842 9118937.618322
+282205.039023 9118985.857776
+282225.263395 9119033.096124
+282241.394952 9119064.256585
+282256.539665 9119096.420448
+282270.668453 9119125.569412
+282291.741701 9119152.717337
+282315.775581 9119176.854998
+282343.720596 9119191.956094
+282376.592690 9119201.035507
+282398.500149 9119206.083858
+282413.492273 9119217.151549
+282431.459551 9119227.218128
+282446.408038 9119232.258353
+282467.314096 9119236.300935
+282480.274306 9119241.338835
+282488.227432 9119241.348080
+282503.117715 9119238.351687
+282528.914432 9119231.349693
+282552.759244 9119229.368250
+282580.580612 9119227.391410
+282615.331836 9119221.404328
+282649.110744 9119218.429791
+282670.952691 9119214.436837
+282696.778468 9119211.453053
+282719.680068 9119216.502391
+282736.631400 9119223.553962
+282751.565331 9119226.584933
+282753.407975 9119206.495766
+282751.237659 9119181.379131
+282752.115294 9119165.307107
+282751.033781 9119153.251076
+282748.899882 9119133.157306
+282754.726361 9119114.077314
+282756.576293 9119094.992720
+282759.442204 9119078.922997
+282761.284854 9119058.833830
+282763.193034 9119047.785824
+282764.085236 9119033.722947
+282763.018293 9119023.676062
+282761.871263 9119002.578870
+282758.765092 9118985.497669
+282781.477267 9118964.428096
+282803.173445 9118940.343647
+282811.989573 9118922.271681
+282823.729839 9118896.166581
+282835.506503 9118875.084345
+282844.278921 9118850.984941
+282854.981338 9118818.851252
+282862.788740 9118798.768991
+282870.632545 9118783.709594
+282953.156106 9118648.188800
+282877.985091 9118563.718469
+282859.930695 9118541.597145
+Region 1
+1416
+289305.633672 9120285.437156
+289241.828346 9119992.050112
+289200.436938 9119772.016161
+289147.643972 9119623.292161
+289109.333159 9119550.927067
+289068.203442 9119500.658727
+289026.064868 9119448.380238
+288977.969159 9119397.100146
+288973.050548 9119404.126854
+288909.924626 9119336.758826
+288835.856298 9119268.374939
+288771.707008 9119196.987443
+288701.548824 9119119.566440
+288640.367456 9119046.172636
+288576.107680 9118959.716588
+288460.630678 9118802.890074
+288330.050658 9118619.929483
+288286.845737 9118557.603430
+288256.519771 9118489.263485
+288132.504225 9118117.455846
+288104.181878 9118051.126827
+288073.054785 9118008.903722
+288043.967658 9117973.714477
+288001.964892 9117939.516202
+287946.074587 9117909.321448
+287854.353068 9117873.061702
+287775.569489 9117838.824450
+287771.578393 9117836.811166
+287706.763730 9117809.620260
+287650.851570 9117776.411415
+287647.854564 9117774.399169
+287573.812889 9117709.025768
+287504.690175 9117636.625630
+287416.658083 9117561.191612
+287399.685017 9117551.128156
+287302.772909 9117484.725256
+287296.778962 9117480.700700
+287211.862360 9117423.351200
+287137.866041 9117364.004094
+287069.804884 9117300.645013
+287031.669200 9117251.381511
+287014.571126 9117224.240498
+287005.388831 9117192.085262
+286997.149083 9117152.899232
+286996.957638 9117126.780906
+287000.705661 9117095.644099
+287010.307653 9117049.445438
+287019.961176 9117010.278636
+287039.525907 9116967.104314
+287053.155667 9116927.941787
+287051.844986 9116884.745034
+287031.625017 9116838.514320
+287012.472777 9116802.330167
+286982.378524 9116765.129672
+286943.300966 9116722.896744
+286910.209926 9116683.683855
+286904.194048 9116676.645557
+286875.108751 9116641.455125
+286860.065411 9116623.357084
+286837.003395 9116596.209471
+286812.954705 9116570.065317
+286797.904060 9116550.962691
+286771.845236 9116521.802694
+286744.762973 9116488.623386
+286718.726281 9116462.476999
+286690.686801 9116434.319327
+286673.611383 9116410.191713
+286655.497821 9116380.035690
+286635.344720 9116342.845619
+286615.213708 9116308.669191
+286590.974226 9116256.406454
+286572.787311 9116216.204830
+286559.622131 9116183.040482
+286532.268406 9116112.692459
+286507.035120 9116060.428541
+286484.813432 9116012.186068
+286468.688297 9115982.032068
+286466.670821 9115978.011678
+286437.557000 9115938.802548
+286409.466652 9115903.612693
+286386.390636 9115874.455581
+286379.366230 9115865.406968
+286355.303552 9115837.253297
+286336.211131 9115809.105054
+286311.139787 9115778.941145
+286299.336034 9115796.005501
+286285.558863 9115815.076786
+286279.690009 9115828.129463
+286260.957270 9115849.204402
+286244.175910 9115865.258742
+286225.428462 9115884.324562
+286203.662160 9115898.364322
+286181.859152 9115907.381295
+286143.245360 9115928.434351
+286122.436369 9115937.452395
+286103.608130 9115945.468063
+286088.748744 9115952.483546
+286072.917312 9115962.511600
+286055.090436 9115971.532903
+286034.259393 9115977.537245
+286011.469582 9115987.557615
+285982.730121 9115999.580511
+285953.983306 9116010.598836
+285924.242422 9116021.616049
+285895.502905 9116033.638901
+285870.702919 9116040.643344
+285840.983978 9116054.674185
+285810.248969 9116065.690237
+285779.528601 9116078.715388
+285756.723997 9116086.726539
+285733.912053 9116093.733122
+285695.209879 9116102.731180
+285652.480166 9116104.692885
+285619.647033 9116100.638236
+285598.786523 9116102.624170
+285586.865183 9116103.615476
+285560.040332 9116105.594765
+285542.140003 9116104.570311
+285524.239672 9116103.545849
+285508.305479 9116099.509914
+285485.361629 9116088.434307
+285455.386166 9116067.305334
+285442.316988 9116047.199734
+285404.447706 9116034.098332
+285360.643392 9116025.008476
+285333.730702 9116014.932896
+285303.843175 9116005.858523
+285260.009613 9115992.750315
+285220.159603 9115980.651072
+285184.322409 9115973.579053
+285141.512204 9115964.490076
+285093.717102 9115953.386349
+285037.026710 9115949.304447
+284957.334120 9115926.110046
+284872.715161 9115908.937259
+284800.894716 9115874.701315
+284745.987894 9115842.493476
+284727.992633 9115828.409338
+284712.986851 9115815.333131
+284672.939820 9115776.110097
+284646.941057 9115754.984952
+284616.907685 9115725.818758
+284580.895436 9115694.636633
+284544.905136 9115666.468162
+284509.879731 9115634.282521
+284488.887868 9115618.185727
+284474.883569 9115606.115103
+284460.879277 9115594.044472
+284424.867232 9115562.862171
+284388.833344 9115528.666130
+284362.834844 9115507.540754
+284325.806997 9115473.343505
+284300.809898 9115453.223781
+284278.751202 9115427.080047
+284251.744174 9115403.944309
+284225.723928 9115379.805120
+284194.660564 9115345.614542
+284175.635157 9115326.506117
+284159.504421 9115295.346292
+284141.196096 9115238.065417
+284134.940264 9115197.875868
+284131.732179 9115166.730847
+284116.486273 9115120.503608
+284101.349723 9115089.344874
+284085.233731 9115060.194122
+284066.128357 9115030.035360
+284040.130305 9115008.909690
+284013.167377 9114991.801126
+283987.264068 9114983.734804
+283963.377979 9114979.689032
+283933.534936 9114976.640936
+283894.781946 9114978.605337
+283878.891869 9114980.596112
+283845.072657 9114977.543364
+283833.144173 9114977.529580
+283800.362680 9114980.505364
+283769.561979 9114982.478856
+283716.797747 9114971.367592
+283691.873945 9114961.293097
+283667.900529 9114945.192316
+283633.007238 9114931.087972
+283615.034474 9114920.016929
+283600.058389 9114910.958480
+283569.126745 9114894.849551
+283559.135424 9114887.806003
+283540.168651 9114876.733765
+283527.173397 9114866.673026
+283502.176945 9114846.552689
+283504.245028 9114857.605287
+283726.238849 9116136.669639
+283721.501649 9116168.810136
+283721.749359 9116202.965497
+283734.006045 9116248.184854
+283730.510667 9116314.481853
+283724.604537 9116322.511544
+283707.887493 9116347.606327
+283691.141289 9116368.682830
+283668.437923 9116390.757031
+283644.704037 9116407.807232
+283630.889007 9116421.855172
+283624.003344 9116431.892851
+283623.103974 9116444.951113
+283626.202755 9116461.027668
+283626.297461 9116474.087075
+283625.376238 9116484.131628
+283622.496007 9116498.192170
+283608.702803 9116515.253821
+283598.842184 9116526.292633
+283578.097717 9116544.350828
+283552.513963 9116580.485549
+283539.714788 9116597.548337
+283530.921051 9116618.633992
+283532.126364 9116647.767677
+283537.431834 9116693.983640
+283547.664020 9116734.177907
+283560.893046 9116776.384743
+283574.486412 9116868.820065
+283580.735084 9116908.005157
+283597.984293 9116956.243953
+283634.991364 9116987.427903
+283685.959424 9117024.655205
+283700.943612 9117034.718013
+283708.925461 9117038.745415
+283720.934689 9117049.809360
+283728.960287 9117059.864172
+283737.987266 9117070.924690
+283745.011493 9117079.973788
+283749.053462 9117089.019466
+283757.115532 9117104.097113
+283761.230425 9117123.188477
+283766.302951 9117137.258134
+283769.394597 9117152.330081
+283771.477573 9117165.391752
+283776.666791 9117195.534504
+283776.776180 9117210.603034
+283781.848727 9117224.672686
+283781.928949 9117235.722940
+283779.048780 9117249.783487
+283777.169994 9117264.849740
+283773.303025 9117279.913718
+283765.547206 9117307.027968
+283760.642383 9117316.063396
+283746.870950 9117336.138836
+283741.001200 9117349.191401
+283735.138740 9117363.248534
+283732.309606 9117384.341064
+283734.421771 9117401.421010
+283734.516578 9117414.480404
+283735.569016 9117422.518093
+283736.657920 9117435.578625
+283737.768705 9117451.652862
+283737.921864 9117472.748806
+283738.981600 9117481.791062
+283741.079194 9117496.861868
+283741.166717 9117508.916693
+283745.259801 9117524.994341
+283745.391091 9117543.076577
+283746.545655 9117565.178224
+283744.644989 9117577.230774
+283741.786695 9117594.305030
+283735.931517 9117609.366738
+283731.026671 9117618.402171
+283727.108628 9117626.434173
+283719.265245 9117641.493607
+283715.354492 9117650.530177
+283710.500696 9117666.597591
+283705.625015 9117679.651299
+283705.676072 9117686.683281
+283705.778187 9117700.747244
+283707.868504 9117714.813482
+283708.957429 9117727.874013
+283713.006776 9117737.924248
+283719.058918 9117749.985893
+283729.065586 9117759.038376
+283738.056272 9117765.076014
+283748.998687 9117766.093079
+283762.930703 9117768.118116
+283771.906801 9117772.146609
+283780.897493 9117778.184236
+283785.904483 9117783.212753
+283793.937559 9117794.272083
+283800.947350 9117801.312004
+283813.980134 9117816.395273
+283823.994131 9117826.452295
+283834.037323 9117840.527586
+283843.049929 9117849.578899
+283855.059446 9117860.642745
+283863.077957 9117869.692920
+283869.130160 9117881.754530
+283872.185457 9117891.803606
+283874.239354 9117900.846981
+283876.285953 9117908.885788
+283875.364838 9117918.930333
+283872.433617 9117925.958911
+283870.496499 9117932.988621
+283865.613561 9117945.037772
+283855.752796 9117956.076694
+283849.875747 9117968.124713
+283845.014697 9117983.187568
+283840.175541 9118001.264127
+283834.320381 9118016.325850
+283822.544365 9118037.408184
+283731.774132 9117995.113129
+283697.695369 9118093.521121
+283687.768868 9118095.518905
+283671.877709 9118097.509872
+283657.996652 9118102.516813
+283498.246360 9118006.900632
+283453.209956 9118102.282319
+283348.434736 9118047.915629
+283328.494232 9118039.856196
+283301.431601 9118146.308678
+283167.109810 9118130.080944
+283145.217473 9118127.041998
+283079.576878 9118122.947950
+283042.841923 9118266.558119
+282823.728609 9118210.048781
+282791.861510 9118339.600692
+282802.173875 9118390.845476
+282811.346588 9118421.997631
+282817.529673 9118452.141749
+282824.648662 9118474.250430
+282831.753102 9118494.349961
+282837.834309 9118510.430045
+282848.907977 9118529.529603
+282859.930695 9118541.597145
+282877.985091 9118563.718469
+282953.156106 9118648.188800
+282870.632545 9118783.709594
+282862.788740 9118798.768991
+282854.981338 9118818.851252
+282844.278921 9118850.984941
+282835.506503 9118875.084345
+282823.729839 9118896.166581
+282811.989573 9118922.271681
+282803.173445 9118940.343647
+282781.477267 9118964.428096
+282758.765092 9118985.497669
+282761.871263 9119002.578870
+282763.018293 9119023.676062
+282764.085236 9119033.722947
+282763.193034 9119047.785824
+282761.284854 9119058.833830
+282759.442204 9119078.922997
+282756.576293 9119094.992720
+282754.726361 9119114.077314
+282748.899882 9119133.157306
+282751.033781 9119153.251076
+282752.115294 9119165.307107
+282751.237659 9119181.379131
+282753.407975 9119206.495766
+282751.565331 9119226.584933
+282736.631400 9119223.553962
+282719.680068 9119216.502391
+282696.778468 9119211.453053
+282670.952691 9119214.436837
+282649.110744 9119218.429791
+282615.331836 9119221.404328
+282580.580612 9119227.391410
+282552.759244 9119229.368250
+282528.914432 9119231.349693
+282503.117715 9119238.351687
+282488.227432 9119241.348080
+282480.274306 9119241.338835
+282467.314096 9119236.300935
+282446.408038 9119232.258353
+282431.459551 9119227.218128
+282413.492273 9119217.151549
+282398.500149 9119206.083858
+282376.592690 9119201.035507
+282343.720596 9119191.956094
+282315.775581 9119176.854998
+282291.741701 9119152.717337
+282270.668453 9119125.569412
+282256.539665 9119096.420448
+282241.394952 9119064.256585
+282225.263395 9119033.096124
+282205.039023 9118985.857776
+282187.789842 9118937.618322
+282173.552182 9118893.400651
+282158.393091 9118859.227573
+282138.190701 9118815.002886
+282127.030002 9118783.848176
+282117.799467 9118744.659175
+282111.587673 9118710.496553
+282106.362760 9118675.330517
+282105.157967 9118646.196611
+282094.947906 9118609.015578
+282087.785624 9118580.879239
+282074.731217 9118562.781661
+282056.749757 9118550.705700
+282022.884043 9118541.624754
+281989.976160 9118527.522060
+281975.056979 9118526.499926
+281957.155414 9118525.474275
+281940.240716 9118523.445209
+281919.378543 9118525.429763
+281895.497686 9118522.387899
+281892.420938 9118509.324861
+281881.412945 9118499.266177
+281875.433661 9118497.249983
+281863.496867 9118496.231328
+281852.575975 9118498.227580
+281839.724885 9118508.258112
+281830.901105 9118525.325389
+281824.101865 9118547.417908
+281823.180309 9118557.462523
+281818.238691 9118561.474970
+281798.406896 9118568.483543
+281792.507428 9118577.517708
+281786.622472 9118588.561032
+281781.789699 9118607.642162
+281772.965884 9118624.709438
+281757.146861 9118636.745594
+281740.384489 9118655.812627
+281730.566520 9118672.878725
+281726.648038 9118680.910659
+281714.841794 9118697.974406
+281703.971630 9118707.002691
+281676.172167 9118711.992667
+281662.297824 9118718.003678
+281654.431809 9118730.049223
+281654.482592 9118737.081281
+281672.478582 9118751.166568
+281644.686341 9118757.161111
+281650.781737 9118775.250605
+281638.815841 9118770.213589
+281603.012464 9118768.162058
+281590.959531 9118751.070067
+281577.977750 9118743.018114
+281566.991496 9118735.973092
+281540.258639 9118751.009975
+281536.383630 9118765.069384
+281534.504144 9118780.135732
+281534.663697 9118802.236500
+281539.851961 9118832.379803
+281529.867075 9118826.340536
+281514.911506 9118820.295371
+281500.942826 9118813.246799
+281489.963811 9118807.206341
+281479.057311 9118811.211686
+281472.185367 9118823.258395
+281475.247544 9118834.312322
+281481.299387 9118846.374368
+281483.352927 9118855.417953
+281479.441641 9118864.454461
+281470.537907 9118870.471328
+281457.672119 9118878.492636
+281440.735509 9118873.449669
+281419.829598 9118869.406553
+281401.942354 9118870.389876
+281372.103694 9118868.345268
+281354.223693 9118870.333153
+281333.390266 9118876.335810
+281316.540637 9118883.347772
+281293.755155 9118894.370956
+281272.979682 9118908.410243
+281259.105202 9118914.421159
+281245.172742 9118912.395416
+281233.177839 9118903.339963
+281225.195731 9118899.312157
+281215.268821 9118901.309471
+281196.452610 9118911.332772
+281184.559149 9118916.341456
+281171.671544 9118921.348952
+281158.812915 9118930.374774
+281158.878121 9118939.416015
+281158.936081 9118947.452675
+281159.037513 9118961.516828
+281159.109965 9118971.562652
+281158.144804 9118975.579795
+281145.220954 9118975.564376
+281137.325774 9118983.591545
+281125.454019 9118991.613968
+281120.526772 9118997.635530
+281107.617402 9118999.629267
+281101.616323 9118994.599232
+281089.672119 9118992.575819
+281070.805132 9118995.567004
+281066.828559 9118995.562253
+281051.923653 9118996.549016
+281040.015662 9118999.548505
+281031.075613 9119000.542392
+281011.250680 9119008.555281
+280991.461946 9119021.591080
+280984.575354 9119031.628587
+280977.667034 9119038.652344
+280967.790761 9119047.681698
+280961.847616 9119050.688310
+280950.004769 9119062.729032
+280948.088890 9119072.772487
+280947.138192 9119078.798798
+280950.185800 9119087.843620
+280940.244341 9119087.831720
+280929.330459 9119090.832378
+280908.518555 9119099.848630
+280897.698790 9119115.908871
+280892.836660 9119130.971673
+280892.930784 9119144.031263
+280889.977303 9119148.046025
+280882.074805 9119155.068584
+280874.165063 9119161.086559
+280869.201564 9119162.085187
+280849.419959 9119176.125534
+280834.543930 9119181.130577
+280827.606608 9119184.135986
+280810.771230 9119193.156976
+280801.860083 9119198.169165
+280784.045021 9119209.198124
+280776.193161 9119223.252762
+280775.249679 9119230.283660
+280769.436782 9119251.372775
+280763.580453 9119266.434384
+280760.742765 9119286.522494
+280754.908146 9119304.597857
+280750.024247 9119316.646906
+280744.160669 9119330.703931
+280738.246422 9119337.728864
+280729.385905 9119349.773140
+280725.503387 9119362.827967
+280730.604439 9119380.916456
+280736.743081 9119405.033643
+280724.726375 9119392.964312
+280712.760341 9119387.927069
+280703.798482 9119385.907158
+280698.813239 9119383.892020
+280681.890914 9119380.857968
+280665.969981 9119378.829688
+280657.000887 9119375.805182
+280644.040707 9119370.766723
+280636.036825 9119363.725066
+280620.050775 9119352.655502
+280602.163248 9119353.638562
+280585.291576 9119357.636568
+280563.485303 9119366.651512
+280553.594402 9119373.671641
+280537.760273 9119383.698343
+280538.862938 9119398.768325
+280537.941124 9119408.812985
+280536.039623 9119420.865618
+280524.203799 9119433.910866
+280515.292566 9119438.923018
+280506.345163 9119438.912240
+280492.419747 9119437.890884
+280478.508795 9119438.878696
+280458.640138 9119440.863898
+280443.720561 9119439.841329
+280429.838533 9119444.847472
+280407.001858 9119448.838227
+280393.105357 9119451.835187
+280384.150715 9119450.819799
+280369.209439 9119446.783447
+280360.247566 9119444.763467
+280348.310453 9119443.744469
+280336.380570 9119443.730054
+280323.456529 9119443.714434
+280316.504659 9119444.710609
+280301.621219 9119448.710928
+280298.631518 9119447.702735
+280289.669645 9119445.682740
+280282.659943 9119438.642214
+280268.662230 9119427.574917
+280262.653919 9119421.540176
+280246.675131 9119411.475051
+280231.704960 9119403.420297
+280212.787075 9119399.379070
+280206.771547 9119392.339732
+280205.712350 9119383.297239
+280194.661008 9119367.210587
+280186.671628 9119362.178009
+280178.653347 9119353.127078
+280169.669816 9119348.093291
+280155.701057 9119341.044297
+280143.691712 9119329.979359
+280130.680994 9119317.908621
+280098.810228 9119309.833296
+280041.141987 9119308.758650
+280015.272272 9119305.713455
+279994.387779 9119304.683470
+279956.588192 9119301.623724
+279936.640090 9119292.558210
+279908.644894 9119270.423333
+279880.584755 9119239.247127
+279840.638107 9119214.083873
+279815.654331 9119195.970914
+279796.743747 9119192.934073
+279771.882667 9119191.899115
+279735.098945 9119191.854144
+279695.361607 9119195.823855
+279660.573389 9119196.785849
+279631.786161 9119202.778080
+279609.972438 9119210.788006
+279589.188921 9119223.822098
+279575.378911 9119238.873899
+279562.627956 9119262.968239
+279554.790085 9119279.031944
+279545.950840 9119294.089839
+279539.121541 9119312.163947
+279525.318703 9119328.220335
+279514.556025 9119352.317112
+279505.760023 9119373.402554
+279488.873724 9119375.390997
+279470.128891 9119395.459642
+279462.254920 9119406.500386
+279433.575658 9119427.561409
+279413.894294 9119455.665557
+279409.060466 9119474.746697
+279409.240710 9119499.861496
+279391.439493 9119512.899207
+279373.551756 9119513.881807
+279360.649253 9119516.879696
+279346.839086 9119531.931467
+279341.998020 9119550.008017
+279340.225951 9119580.143341
+279333.490264 9119611.277147
+279328.764534 9119645.427175
+279332.878173 9119664.519318
+279330.075900 9119689.630460
+279315.358024 9119716.736123
+279291.001210 9119786.022446
+279271.420567 9119828.190885
+279720.674826 9120919.716068
+279649.006272 9120907.574044
+279606.299319 9120913.549604
+279587.496316 9120925.581707
+279552.894523 9120952.663298
+279513.292830 9120975.720456
+279489.424932 9120974.686796
+279451.732153 9120986.695835
+279420.018960 9121000.721308
+279404.111824 9121000.701899
+279362.276194 9120989.600417
+279338.364970 9120982.539129
+279308.495791 9120976.475125
+279282.610615 9120971.420557
+279247.835395 9120974.391759
+279217.123522 9120989.422913
+279196.353598 9121004.466231
+279171.686217 9121030.555188
+279151.917669 9121046.604304
+279133.172156 9121066.673005
+279118.324086 9121075.696057
+279099.484786 9121082.705042
+279080.573360 9121079.668090
+279070.602518 9121075.637518
+279053.643436 9121067.580027
+279030.762427 9121065.542764
+279019.891127 9121074.570672
+279001.080643 9121085.597994
+278990.504947 9121135.814234
+278979.741775 9121159.911043
+278967.011819 9121187.019189
+278949.202690 9121199.052319
+278927.272553 9121190.988678
+278922.114105 9121164.863123
+278921.011771 9121149.792991
+278905.111748 9121150.778016
+278898.109084 9121144.741888
+278884.197464 9121145.729352
+278869.392549 9121160.779906
+278857.555817 9121173.824942
+278845.661420 9121178.833222
+278805.842852 9121171.752067
+278792.954243 9121176.759109
+278779.971954 9121168.706417
+278753.157290 9121172.691689
+278738.265854 9121175.687075
+278721.422031 9121183.702977
+278707.589630 9121195.740937
+278696.703814 9121202.759601
+278681.884400 9121215.800924
+278667.951127 9121213.774543
+278654.940026 9121201.703431
+278643.946152 9121193.653153
+278629.991276 9121188.612971
+278606.231201 9121202.647807
+278731.220286 9121440.889096
+278718.410863 9121456.946682
+278845.440395 9121702.221921
+278871.311599 9121705.267456
+279570.061479 9123062.304523
+279592.777067 9123041.235707
+279594.678730 9123029.183032
+279608.489554 9123014.130966
+279620.311892 9122999.076502
+279638.135826 9122989.052167
+279653.013217 9122984.047180
+279663.942596 9122983.055758
+279674.871974 9122982.064333
+279703.871306 9123005.204564
+279727.711303 9123002.219492
+279750.491915 9122990.191919
+279762.386573 9122985.183315
+279785.254026 9122985.210787
+279803.077904 9122975.186398
+279806.975223 9122964.140704
+279811.874016 9122954.100792
+279818.761279 9122944.063268
+279829.582048 9122928.002990
+279853.443699 9122928.031628
+279891.202920 9122925.063185
+279902.146747 9122926.080885
+279919.005297 9122920.073621
+279932.859413 9122911.049015
+279939.746641 9122901.011480
+279954.479115 9122875.914665
+279968.246309 9122854.835007
+279979.110454 9122844.802234
+279990.976070 9122835.775238
+280000.874942 9122829.759620
+280012.726064 9122818.723445
+280019.598777 9122806.676732
+280022.509047 9122796.634433
+280032.320994 9122778.563768
+280035.216774 9122766.512296
+280036.116851 9122753.453856
+280034.012509 9122737.378086
+280029.926952 9122722.304521
+280022.858711 9122707.227384
+280022.822500 9122702.204449
+280049.456664 9122673.103568
+280089.008515 9122643.013557
+280105.823467 9122630.978736
+280117.674517 9122619.942552
+280133.495226 9122607.906536
+280150.360862 9122602.903808
+280169.214945 9122597.903452
+280188.076268 9122593.907674
+280214.913131 9122592.935144
+280244.790637 9122600.002844
+280269.689771 9122606.060009
+280303.580428 9122618.155336
+280318.530061 9122623.196034
+280341.404512 9122624.227858
+280357.312129 9122624.246801
+280380.193826 9122626.283190
+280390.121586 9122624.285851
+280403.982749 9122616.265732
+280412.822029 9122601.207604
+280414.759729 9122594.177875
+280412.706030 9122585.134246
+280403.642011 9122569.050242
+280396.595446 9122556.986941
+280393.525781 9122544.928372
+280398.359165 9122525.847174
+280402.270817 9122516.810643
+280409.092643 9122497.731812
+280412.997041 9122487.690697
+280419.876857 9122476.648545
+280430.726309 9122464.606541
+280451.597723 9122463.626794
+280465.538583 9122466.657101
+280476.467774 9122465.665520
+280491.315845 9122456.641987
+280498.217389 9122448.613583
+280508.116096 9122442.597892
+280525.975821 9122437.596232
+280541.897861 9122439.624295
+280554.837238 9122441.648810
+280568.734574 9122438.651582
+280561.637235 9122419.556223
+280559.576273 9122409.508021
+280556.455825 9122390.417381
+280554.213574 9122355.254574
+280554.191819 9122352.240822
+280556.035225 9122332.151500
+280566.841098 9122314.081976
+280580.673128 9122302.043497
+280586.587671 9122295.018492
+280597.437038 9122282.976469
+280604.316784 9122271.934308
+280614.142915 9122255.872767
+280623.947283 9122236.797475
+280631.719698 9122211.692319
+280637.510930 9122187.589388
+280636.407928 9122172.519452
+280636.320900 9122160.464446
+280629.259869 9122146.392011
+280616.204553 9122128.294153
+280608.149321 9122114.220531
+280609.970966 9122091.117462
+280612.837584 9122075.047661
+280611.727351 9122058.973137
+280610.609870 9122041.894028
+280618.447547 9122025.830134
+280629.340366 9122019.815624
+280651.162254 9122012.809515
+280673.978343 9122005.804579
+280693.811791 9121998.796093
+280718.630789 9121993.802664
+280733.551198 9121994.824934
+280753.457165 9121997.862258
+280773.392150 9122004.917905
+280795.308305 9122010.971314
+280811.280968 9122020.031397
+280826.252169 9122028.085714
+280857.043668 9122024.103852
+280874.823345 9122008.051697
+280882.697198 9121997.010696
+280885.600002 9121985.963815
+280893.415796 9121966.886154
+280902.218536 9121946.805085
+280912.051763 9121931.748104
+280922.929992 9121923.724374
+280937.785048 9121915.705342
+280950.673456 9121910.697703
+280957.618391 9121908.696761
+280970.463245 9121897.661626
+280977.299303 9121880.591951
+280977.146883 9121859.495729
+280976.029292 9121842.416660
+280972.908777 9121823.326077
+280969.817297 9121808.253822
+280966.682276 9121787.154073
+280972.509611 9121768.074063
+280972.473324 9121763.051152
+281004.186236 9121749.024594
+281036.973172 9121746.049591
+281061.806474 9121743.065182
+281086.654289 9121742.089922
+281102.641396 9121753.159077
+281128.483413 9121752.184966
+281141.400789 9121751.195614
+281160.297902 9121752.222448
+281178.258907 9121761.284750
+281194.209725 9121767.330961
+281215.138822 9121774.387595
+281228.077986 9121776.411960
+281242.018615 9121779.442070
+281267.889680 9121782.486199
+281281.830311 9121785.516297
+281292.810128 9121791.556627
+281302.861129 9121806.637008
+281308.971648 9121826.735617
+281308.144544 9121849.839794
+281305.263645 9121863.900415
+281310.372709 9121882.993273
+281312.462836 9121897.059729
+281320.467337 9121904.101124
+281333.341141 9121897.084229
+281344.190199 9121885.042099
+281355.031986 9121871.995387
+281365.881033 9121859.953255
+281379.749020 9121852.937517
+281391.635862 9121846.924025
+281406.534379 9121844.932345
+281423.435836 9121844.952149
+281443.341705 9121847.989178
+281464.249047 9121852.031940
+281493.175439 9121865.125211
+281514.126407 9121875.195422
+281537.065789 9121885.267945
+281554.990536 9121889.307174
+281587.617461 9121864.231031
+281597.479501 9121853.192277
+281614.242777 9121834.125018
+281636.956704 9121813.055562
+281658.756408 9121803.035301
+281675.614187 9121797.027546
+281681.521208 9121788.997878
+281686.375841 9121772.930425
+281685.301638 9121761.878907
+281687.064576 9121730.739304
+281705.787080 9121707.656039
+281717.717465 9121707.669950
+281756.440291 9121700.683093
+281776.375179 9121707.738298
+281810.185196 9121708.782228
+281837.108583 9121719.863812
+281854.046336 9121724.906354
+281878.966786 9121733.976441
+281899.939559 9121747.060200
+281915.926793 9121758.129021
+281935.934501 9121775.229911
+281953.961104 9121793.333058
+281973.917884 9121803.401888
+281998.874789 9121817.494775
+282010.834305 9121821.526908
+282030.798386 9121832.600283
+282049.790120 9121846.686224
+282076.699054 9121855.758479
+282095.661678 9121865.826092
+282123.564827 9121874.899465
+282155.386512 9121875.940809
+282174.312733 9121880.985507
+282189.225732 9121881.002728
+282209.058733 9121873.993655
+282222.977528 9121874.009718
+282246.838316 9121874.037245
+282268.710702 9121874.062467
+282288.594687 9121874.085387
+282308.456809 9121871.094574
+282334.233104 9121861.078602
+282348.086292 9121852.053459
+282357.984546 9121846.037458
+282373.745947 9121825.964281
+282394.471032 9121804.892248
+282414.245636 9121789.846510
+282429.049244 9121774.795050
+282449.861757 9121765.777890
+282470.659679 9121754.751574
+282498.467992 9121750.765260
+282522.277641 9121743.760644
+282551.050962 9121735.757149
+282578.837367 9121728.757072
+282607.617953 9121721.758119
+282625.491567 9121718.764911
+282649.359516 9121719.796820
+282663.300112 9121722.826479
+282671.312019 9121730.872167
+282685.340156 9121745.956688
+282698.374108 9121761.040065
+282716.386339 9121777.133694
+282736.423453 9121798.252447
+282751.475016 9121817.356362
+282764.487120 9121829.425993
+282780.408845 9121831.453305
+282788.362410 9121831.462387
+282801.367228 9121842.527432
+282812.420153 9121858.613063
+282831.390162 9121869.684902
+282846.339599 9121874.724768
+282861.252542 9121874.741770
+282874.177091 9121874.756501
+282886.056343 9121867.738097
+282891.919318 9121853.680895
+282894.690206 9121824.551724
+282899.558981 9121810.493390
+282904.427754 9121796.435055
+282910.298019 9121783.382425
+282913.178401 9121769.321826
+282914.106895 9121760.281817
+282936.863835 9121745.239298
+282955.731596 9121742.247096
+282976.587739 9121739.257150
+282991.464119 9121734.251267
+283010.280754 9121724.227049
+283029.090078 9121713.198255
+283035.991001 9121705.169603
+283044.887607 9121698.147782
+283058.777074 9121694.145322
+283082.637659 9121694.172436
+283099.546209 9121695.196204
+283129.364630 9121694.225498
+283149.255748 9121695.252632
+283161.186036 9121695.266167
+283184.132778 9121706.342368
+283197.093786 9121711.379868
+283218.044854 9121721.449224
+283248.959760 9121734.543534
+283272.849572 9121738.588821
+283294.736387 9121740.622706
+283319.671553 9121751.701074
+283331.645698 9121757.741975
+283346.675514 9121773.831930
+283358.708146 9121787.909371
+283368.796263 9121808.011974
+283384.834924 9121826.112169
+283403.826930 9121840.197447
+283474.473080 9121848.313579
+283525.352410 9121872.480306
+283549.366633 9121893.603074
+283564.352675 9121903.665522
+283592.329072 9121922.783596
+283613.302239 9121935.866427
+283623.310021 9121944.918697
+283637.301899 9121954.979996
+283655.321779 9121972.077721
+283664.306112 9121977.110595
+283675.293470 9121984.154831
+283694.270977 9121996.230815
+283708.218971 9122000.264684
+283726.158382 9122006.312137
+283760.019544 9122014.386526
+283785.919837 9122021.447422
+283805.847648 9122027.497064
+283834.715890 9122032.552132
+283852.669962 9122040.608660
+283869.629846 9122048.664069
+283884.564730 9122051.694421
+283900.501134 9122055.730443
+283915.421373 9122056.751653
+283958.208349 9122061.822165
+283979.123052 9122066.868265
+284002.048123 9122074.930264
+284020.981769 9122080.978692
+284032.005822 9122093.045647
+284038.117520 9122113.143584
+284040.186503 9122124.196011
+284043.220376 9122131.231283
+284062.234649 9122148.329899
+284081.256264 9122166.433068
+284089.283111 9122176.487555
+284112.494068 9122223.727492
+284120.579567 9122241.818484
+284125.726457 9122265.933548
+284134.820829 9122286.034766
+284146.890477 9122305.134725
+284170.912515 9122327.261602
+284183.903079 9122336.317008
+284207.807843 9122342.370836
+284227.699154 9122343.397426
+284242.590140 9122340.400250
+284260.500383 9122342.429188
+284273.461631 9122347.466309
+284293.396940 9122354.520251
+284331.249835 9122364.607653
+284350.198290 9122372.665030
+284364.168421 9122379.712345
+284387.071675 9122384.760407
+284398.015199 9122385.777040
+284425.860104 9122386.812316
+284453.682993 9122384.833888
+284474.517136 9122378.829525
+284498.333866 9122372.828439
+284524.153660 9122368.838656
+284547.985051 9122364.846672
+284572.788613 9122357.842084
+284597.584824 9122349.832923
+284622.395704 9122343.832873
+284653.157072 9122335.830241
+284681.988767 9122335.861898
+284704.891993 9122340.909798
+284725.843544 9122350.978309
+284738.819500 9122358.024407
+284763.755193 9122369.101817
+284784.670043 9122374.147492
+284808.560139 9122378.191860
+284837.421219 9122382.241654
+284844.402632 9122385.262948
+284867.386692 9122401.360918
+284885.385088 9122415.444320
+284897.425659 9122430.525755
+284909.502976 9122450.629986
+284915.651857 9122475.750496
+284921.727266 9122490.825406
+284933.819312 9122512.938742
+284943.952369 9122539.068142
+284948.024703 9122552.131755
+284964.100933 9122575.253972
+284990.111834 9122597.382453
+285011.122353 9122615.487263
+285030.195945 9122640.621809
+285044.372071 9122675.796524
+285044.467645 9122688.855791
+285048.488566 9122694.887471
+285054.542005 9122706.948667
+285062.576501 9122718.007465
+285070.611001 9122729.066260
+285088.646360 9122748.172328
+285099.656129 9122758.229797
+285114.613300 9122764.273346
+285135.623947 9122782.378067
+285148.636851 9122794.446794
+285165.655997 9122810.538063
+285182.689868 9122828.638438
+285191.696554 9122836.684603
+285211.713059 9122854.788196
+285222.818518 9122877.904875
+285226.905694 9122892.977551
+285236.980181 9122911.070357
+285260.973563 9122929.178220
+285276.917652 9122934.218214
+285296.875362 9122944.285290
+285310.831045 9122949.323121
+285333.734586 9122954.370613
+285352.639224 9122956.400127
+285371.529141 9122956.420519
+285385.448026 9122956.435540
+285427.256206 9122963.512473
+285446.138756 9122962.528277
+285459.033981 9122958.523977
+285478.837101 9122947.495273
+285484.736065 9122938.460689
+285494.619210 9122930.434943
+285512.433898 9122919.404088
+285523.318602 9122912.383965
+285550.073746 9122900.358172
+285573.912544 9122897.370165
+285589.849263 9122901.405489
+285620.772697 9122915.502386
+285636.775719 9122928.578693
+285649.759304 9122936.629013
+285668.730219 9122947.699394
+285689.674817 9122956.762787
+285697.665291 9122961.794092
+285713.646243 9122971.856697
+285728.632997 9122981.918229
+285754.526533 9122987.973246
+285771.435382 9122988.995895
+285796.275756 9122987.013383
+285817.117196 9122982.012942
+285834.953905 9122973.995640
+285849.785881 9122962.961482
+285858.637887 9122949.911836
+285866.503057 9122937.865683
+285872.320847 9122917.780969
+285873.167623 9122897.690944
+285883.985903 9122881.629760
+285891.851058 9122869.583606
+285904.709330 9122860.556425
+285917.574968 9122852.533795
+285935.448467 9122849.539240
+285953.344079 9122849.558341
+285972.226517 9122848.573942
+285996.035713 9122841.567513
+286001.971419 9122837.555658
+286025.721608 9122822.512788
+286042.549256 9122812.485262
+286061.402169 9122807.482616
+286084.246622 9122804.493304
+286096.221263 9122810.533322
+286123.094140 9122814.580095
+286141.026604 9122819.621891
+286160.984355 9122829.688556
+286181.892046 9122833.728950
+286199.750738 9122828.725193
+286216.556200 9122815.683954
+286237.301550 9122797.624169
+286249.128621 9122783.573095
+286269.881323 9122766.517855
+286290.685666 9122756.494473
+286316.460980 9122746.476353
+286331.359166 9122744.483051
+286346.190923 9122733.448778
+286368.887664 9122710.368302
+286380.699909 9122694.308105
+286385.560164 9122679.245092
+286401.371318 9122666.202758
+286411.261588 9122659.181418
+286422.175577 9122656.179334
+286436.020470 9122646.148543
+286454.836323 9122636.123006
+286480.648432 9122631.127574
+286497.557098 9122632.149983
+286513.471569 9122633.171336
+286530.402385 9122637.207385
+286539.394428 9122643.244136
+286557.393290 9122657.326731
+286570.487662 9122680.445030
+286585.511352 9122695.529014
+286594.569886 9122710.606703
+286613.555599 9122723.685763
+286625.567186 9122734.748383
+286644.493818 9122739.791023
+286658.434704 9122742.819323
+286683.208298 9122731.795421
+286703.010908 9122720.766282
+286713.895319 9122713.745931
+286728.778667 9122709.743407
+286741.636679 9122700.716040
+286750.495746 9122688.670845
+286783.141530 9122666.605212
+286832.718100 9122648.575494
+286842.652625 9122647.581373
+286852.542801 9122640.559955
+286869.421877 9122637.564028
+286879.319438 9122631.547155
+286898.149928 9122623.530558
+286914.977244 9122613.502774
+286931.789767 9122601.465889
+286946.628686 9122591.436015
+286964.391020 9122573.372870
+286981.159151 9122555.308682
+286996.947869 9122539.252548
+287009.813164 9122531.229678
+287025.616651 9122517.182635
+287044.417480 9122505.147802
+287061.252109 9122496.124531
+287076.090962 9122486.094630
+287093.949345 9122481.090579
+287109.856329 9122481.107187
+287124.791315 9122484.136394
+287136.721552 9122484.148842
+287157.577274 9122481.156976
+287167.489547 9122477.149152
+287177.372228 9122469.123137
+287188.212104 9122456.075419
+287200.083147 9122448.051473
+287219.848481 9122431.999433
+287231.667724 9122416.943651
+287251.484823 9122407.923433
+287267.376971 9122405.930897
+287282.274932 9122403.937322
+287294.227337 9122406.963375
+287305.148560 9122404.965656
+287327.035402 9122406.997491
+287345.917491 9122406.012576
+287362.811211 9122405.025588
+287380.684308 9122402.030534
+287409.523024 9122403.065008
+287426.394528 9122399.064359
+287438.258100 9122390.035819
+287447.161327 9122384.017822
+287456.027538 9122372.977094
+287461.933407 9122364.946911
+287466.815480 9122352.897513
+287470.681160 9122337.833446
+287488.420954 9122316.756533
+287495.283975 9122303.704650
+287513.119994 9122295.686826
+287520.079256 9122295.694036
+287539.948052 9122293.705537
+287566.783508 9122292.728778
+287593.633771 9122293.761095
+287640.382437 9122296.823034
+287660.295658 9122300.861754
+287685.202000 9122307.919230
+287710.086123 9122311.963056
+287727.009401 9122314.994122
+287753.881885 9122319.039974
+287764.817860 9122319.051244
+287783.736908 9122323.088880
+287799.680830 9122328.127982
+287814.652807 9122336.179686
+287821.619475 9122337.191392
+287840.590409 9122348.260810
+287849.567672 9122352.288188
+287867.588909 9122369.383831
+287877.597419 9122378.434942
+287892.673199 9122400.550224
+287899.699178 9122409.598264
+287909.744769 9122423.672082
+287917.831658 9122441.762030
+287926.838600 9122449.807560
+287929.843385 9122452.824250
+287937.863563 9122461.873301
+287946.870512 9122469.918825
+287956.849402 9122474.951737
+287965.848942 9122481.992713
+287972.860120 9122489.031649
+287983.803537 9122490.047399
+287998.723683 9122491.067221
+288004.755516 9122500.114218
+288008.828650 9122513.177349
+288013.895970 9122526.241497
+288018.963294 9122539.305643
+288026.953839 9122544.336498
+288030.952820 9122547.354197
+288034.951802 9122550.371895
+288046.956168 9122560.429528
+288052.936102 9122562.444715
+288078.725523 9122554.434806
+288096.531799 9122542.398588
+288107.363953 9122528.346170
+288110.138794 9122500.222031
+288099.128619 9122490.165429
+288091.093574 9122479.107331
+288087.072345 9122473.076010
+288093.007762 9122469.063939
+288107.890805 9122465.061015
+288119.731959 9122453.018699
+288128.508968 9122429.923369
+288130.400894 9122416.866351
+288133.383433 9122416.869399
+288139.355929 9122417.880036
+288159.313707 9122427.945768
+288168.253906 9122426.950363
+288184.027235 9122408.884845
+288187.900084 9122394.825316
+288194.792563 9122385.791541
+288206.663351 9122377.767381
+288212.621002 9122376.768925
+288221.605706 9122381.800763
+288230.620091 9122390.850766
+288240.636080 9122400.906321
+288258.605503 9122410.969979
+288270.550491 9122412.991219
+288277.517164 9122414.002850
+288288.475396 9122417.027614
+288299.411362 9122417.038750
+288310.317641 9122413.031719
+288322.121609 9122395.966660
+288325.029922 9122385.924283
+288333.858768 9122369.860730
+288340.714099 9122355.804235
+288356.799078 9122379.929406
+288363.780590 9122382.950107
+288382.536347 9122364.887576
+288386.431400 9122353.841668
+288394.340275 9122347.822508
+288402.323383 9122351.848755
+288409.379130 9122364.914858
+288423.282760 9122362.919916
+288433.135438 9122350.875526
+288439.041103 9122342.845258
+288447.988691 9122342.854344
+288457.997277 9122351.905302
+288473.941227 9122356.944149
+288484.877168 9122356.955244
+288498.758511 9122351.946660
+288515.600099 9122343.927476
+288522.433087 9122326.857347
+288524.302622 9122310.786720
+288523.152502 9122289.690367
+288520.036314 9122271.605618
+288529.918651 9122263.579377
+288539.875245 9122265.598537
+288557.852072 9122276.666615
+288570.768912 9122275.675170
+288586.579146 9122262.632262
+288591.579725 9122266.655455
+288596.647151 9122279.719507
+288604.697103 9122292.786576
+288614.846831 9122320.923750
+288632.801408 9122328.978170
+288636.852395 9122339.027588
+288636.896967 9122345.054826
+288642.943737 9122356.110793
+288641.074247 9122372.181415
+288641.215398 9122391.267667
+288643.344904 9122410.355928
+288652.389077 9122423.423984
+288666.411573 9122437.501598
+288683.364597 9122444.550441
+288700.302765 9122449.590198
+288710.214815 9122445.582075
+288719.088100 9122435.545711
+288726.959773 9122424.503805
+288739.765168 9122408.444218
+288744.661736 9122398.403841
+288753.572162 9122393.390170
+288765.517136 9122395.411277
+288776.453070 9122395.422300
+288788.427773 9122401.461556
+288794.377963 9122399.458488
+288807.265084 9122394.448814
+288818.104388 9122381.400826
+288830.961768 9122372.372993
+288838.870569 9122366.353769
+288858.694595 9122358.337474
+288868.524834 9122343.279402
+288877.435232 9122338.265712
+288887.391840 9122340.284789
+288904.240756 9122333.270017
+288902.118590 9122315.186331
+288900.011296 9122299.111720
+288902.845131 9122279.023956
+288919.649416 9122265.981955
+288932.566220 9122264.990410
+288940.482423 9122259.975714
+288958.295730 9122248.943778
+288978.179162 9122248.963751
+288994.071035 9122246.970647
+289001.022798 9122245.973095
+289016.907230 9122242.975447
+289035.789045 9122241.989859
+289049.640506 9122232.962981
+289050.471062 9122210.864155
+289054.351062 9122197.809157
+289064.181205 9122182.751065
+289074.093152 9122178.742884
+289085.029016 9122178.753846
+289102.924065 9122178.771778
+289116.849874 9122179.790258
+289126.724621 9122170.759381
+289132.600373 9122158.710910
+289143.372579 9122136.622047
+289166.030154 9122108.517903
+289184.807746 9122093.468754
+289204.646449 9122087.461424
+289213.534432 9122079.434080
+289224.433064 9122074.422331
+289237.334907 9122071.421641
+289259.109835 9122058.384525
+289280.832662 9122038.315647
+289301.546421 9122016.236698
+289320.346250 9122004.201120
+289335.251274 9122003.211465
+289354.177608 9122008.252987
+289376.954070 9121996.221356
+289385.864330 9121991.207596
+289409.642380 9121980.181480
+289416.407990 9121954.070487
+289411.273421 9121931.965752
+289406.101645 9121904.838336
+289393.970749 9121877.703979
+289392.879834 9121864.644024
+289400.795909 9121859.629275
+289413.638127 9121848.592268
+289419.469117 9121830.516572
+289421.293693 9121808.418771
+289427.132121 9121791.347612
+289432.948217 9121771.262847
+289431.812645 9121752.175680
+289417.738137 9121731.066553
+289404.717336 9121717.994696
+289400.651403 9121705.936300
+289401.571142 9121695.891934
+289402.416465 9121675.802211
+289401.251151 9121652.696895
+289394.195319 9121639.630983
+289380.187841 9121627.562654
+289366.187811 9121616.498856
+289363.108618 9121603.436908
+289374.867349 9121580.344500
+289386.618630 9121556.247555
+289396.456001 9121542.193983
+289410.232776 9121523.121702
+289421.064287 9121509.069121
+289430.961170 9121503.051832
+289441.852203 9121497.035533
+289456.719842 9121491.023201
+289468.582694 9121481.994283
+289476.468932 9121472.961397
+289481.395039 9121466.939142
+289479.235566 9121443.832843
+289479.138819 9121430.773882
+289479.064400 9121420.728527
+289489.888427 9121405.671404
+289496.825154 9121402.664739
+289514.734746 9121404.691653
+289528.667736 9121406.714597
+289539.536401 9121397.684678
+289546.465679 9121393.673471
+289305.633672 9120285.437156
+Region 1
+165
+284875.115311 9113367.414495
+284866.089074 9113356.354074
+284844.053326 9113333.224117
+284824.027478 9113313.110110
+284802.978478 9113288.976694
+284783.946666 9113268.863796
+284755.917854 9113241.708691
+284748.901542 9113233.664204
+284739.889947 9113224.612873
+284717.868910 9113203.491953
+284689.891206 9113183.368746
+284664.866356 9113159.230673
+284640.857393 9113138.107418
+284613.851891 9113114.971588
+284589.872123 9113097.866559
+284568.859782 9113078.755808
+284545.866755 9113060.647323
+284522.895602 9113045.552521
+284502.855452 9113023.429171
+284487.814426 9113005.329799
+284471.772135 9112986.224707
+284455.700726 9112963.101338
+284445.636986 9112946.012239
+284436.487138 9112917.874045
+284425.385734 9112894.756388
+284414.160553 9112854.561083
+284403.980359 9112821.398888
+284394.837861 9112794.265239
+284388.713747 9112772.157868
+284376.596589 9112746.025332
+284368.702922 9112754.052681
+284360.867494 9112770.116569
+284350.013692 9112781.154172
+284333.159550 9112787.162039
+284314.295584 9112790.153897
+284295.468008 9112798.168587
+284277.648971 9112808.193558
+284275.733775 9112818.236936
+284277.881885 9112840.339733
+284276.967959 9112851.388830
+284265.032784 9112850.370455
+284243.143140 9112847.331430
+284236.250700 9112856.364485
+284224.439242 9112872.423760
+284211.611951 9112885.468177
+284182.924430 9112904.521569
+284166.113867 9112916.556801
+284149.281466 9112925.578323
+284119.519860 9112933.580278
+284112.649209 9112945.627029
+284096.730750 9112943.599432
+284073.839781 9112939.554610
+284046.029760 9112942.535986
+284017.225736 9112945.516189
+283994.334763 9112941.471326
+283967.475084 9112938.426393
+283940.579047 9112930.358594
+283905.701973 9112918.263232
+283868.851463 9112908.174660
+283835.998749 9112901.104406
+283823.164044 9112913.144171
+283829.295206 9112936.256251
+283818.353985 9112935.238921
+283790.391275 9112917.124160
+283775.452272 9112913.088463
+283757.582158 9112916.081272
+283744.711087 9112923.098166
+283717.967667 9112936.126215
+283695.069423 9112931.076621
+283680.108618 9112924.027179
+283645.326015 9112924.991026
+283633.463443 9112934.018201
+283606.661855 9112939.009620
+283588.900663 9112957.070943
+283549.278767 9112976.111193
+283515.562722 9112987.121838
+283487.650883 9112976.038875
+283455.842935 9112976.001516
+283435.933921 9112971.959866
+283412.056175 9112968.918103
+283391.189464 9112969.898126
+283360.469871 9112982.921318
+283348.599952 9112990.943862
+283353.606244 9112995.972577
+283411.012051 9113099.510212
+283515.899051 9113308.582556
+283618.748309 9113510.620082
+283620.758132 9113513.636118
+283626.787601 9113522.684227
+283623.900058 9113535.740170
+283481.268407 9114017.763773
+283404.419332 9114249.728105
+283405.449696 9114254.752128
+284215.242663 9114620.346581
+284258.262932 9114658.569238
+284300.121575 9114673.685656
+284314.059881 9114676.715318
+284335.899403 9114672.722124
+284310.983019 9114663.652528
+284291.073243 9114659.611454
+284275.132303 9114654.570367
+284264.132364 9114645.516712
+284258.102583 9114636.468759
+284251.832292 9114594.270086
+284241.709799 9114569.144484
+284234.583981 9114546.031440
+284222.517180 9114526.930948
+284215.456964 9114512.859003
+284208.338461 9114490.750516
+284208.251023 9114478.695705
+284211.116520 9114462.626054
+284243.722656 9114435.540453
+284285.238541 9114403.442280
+284319.796193 9114371.336093
+284366.318524 9114344.266414
+284414.879868 9114324.230945
+284439.642949 9114312.204632
+284458.405428 9114295.148645
+284469.179264 9114273.060713
+284475.019442 9114255.989920
+284479.902053 9114243.940819
+284509.525796 9114216.851684
+284523.369156 9114206.821956
+284535.188011 9114191.767120
+284547.014150 9114177.716848
+284576.506540 9114132.545507
+284601.181947 9114108.464353
+284633.736524 9114074.346627
+284729.959090 9114047.333476
+284735.915885 9114046.335716
+284745.834147 9114043.333361
+284774.521945 9114024.279504
+284786.340667 9114009.224633
+284793.233094 9114000.191483
+284803.041888 9113982.120651
+284806.944972 9113972.079537
+284812.763112 9113951.995045
+284815.570025 9113927.888896
+284814.415485 9113905.787344
+284811.214556 9113875.647010
+284810.067323 9113854.550021
+284811.916715 9113835.465562
+284816.726248 9113813.370810
+284821.550372 9113793.285187
+284833.317960 9113771.198369
+284836.168652 9113753.119609
+284840.941693 9113726.002036
+284841.782482 9113704.907317
+284840.598779 9113678.787508
+284838.377301 9113646.639177
+284833.217589 9113620.514830
+284830.118849 9113604.438395
+284829.081073 9113598.409873
+284827.955756 9113580.326576
+284828.789269 9113558.227290
+284837.560221 9113534.127952
+284844.394227 9113517.058296
+284850.168571 9113490.946426
+284848.926541 9113456.790098
+284849.723584 9113429.667991
+284860.511696 9113409.589183
+284872.315685 9113392.525202
+284883.184028 9113383.496601
+284880.129078 9113373.447554
+284875.115311 9113367.414495
+Region 1
+398
+286425.865814 9114066.314045
+286422.773798 9114051.242420
+286419.667120 9114034.161684
+286411.546423 9114011.048126
+286397.417715 9113981.900642
+286382.251035 9113946.724716
+286362.107037 9113910.538727
+286341.941085 9113871.339053
+286312.733876 9113819.070225
+286282.562057 9113770.818485
+286257.367637 9113723.576778
+286232.151298 9113673.321372
+286207.951002 9113626.080713
+286184.788712 9113584.868475
+286158.666455 9113546.666570
+286139.568130 9113517.513398
+286114.432630 9113478.307996
+286089.297179 9113439.102570
+286062.166467 9113398.890344
+286033.040502 9113357.671313
+286008.950433 9113325.498823
+285976.813321 9113280.258168
+285944.705551 9113239.035708
+285913.547931 9113191.786970
+285892.410753 9113155.599478
+285872.267602 9113119.413081
+285862.093627 9113087.256048
+285843.880000 9113043.035380
+285834.604978 9112997.820175
+285830.241403 9112944.574068
+285822.786205 9112876.256216
+285821.324198 9112811.963294
+285816.704784 9112723.557589
+285823.289729 9112672.332873
+285794.369288 9112659.241183
+285770.374890 9112640.127705
+285750.414905 9112629.055167
+285723.635959 9112637.061420
+285707.900410 9112660.148385
+285686.252128 9112690.260548
+285672.577595 9112723.395352
+285668.682068 9112734.441034
+285638.906477 9112740.434773
+285609.225873 9112759.487783
+285615.533239 9112806.708862
+285610.672944 9112821.771665
+285598.818220 9112831.803814
+285578.024941 9112842.830427
+285574.063620 9112844.835061
+285569.035241 9112836.792964
+285561.076061 9112835.779425
+285546.210140 9112841.789954
+285538.324025 9112850.822021
+285529.451229 9112860.857527
+285522.559092 9112869.890716
+285508.716363 9112879.920604
+285493.843112 9112884.926559
+285483.004244 9112897.973496
+285469.095747 9112898.962323
+285454.134822 9112891.913531
+285442.177772 9112887.881791
+285423.343171 9112894.892350
+285417.481513 9112908.949462
+285416.524048 9112913.971145
+285418.599674 9112926.028135
+285409.697618 9112932.045380
+285389.759447 9112923.986379
+285370.837178 9112918.942179
+285363.915785 9112923.957105
+285356.000404 9112928.970905
+285339.109923 9112929.956317
+285337.107343 9112927.944939
+285322.182929 9112925.918911
+285315.290737 9112934.952081
+285311.380505 9112943.988632
+285302.478427 9112950.005859
+285285.529520 9112942.954754
+285269.603809 9112939.923019
+285254.730494 9112944.928907
+285244.892823 9112958.981498
+285231.013486 9112963.988508
+285203.152603 9112959.938640
+285180.268963 9112956.898966
+285170.321776 9112955.883102
+285146.429551 9112950.833154
+285122.522732 9112943.774065
+285105.522756 9112929.690942
+285095.407738 9112905.570101
+285084.342525 9112887.475503
+285070.433993 9112888.464209
+285053.594567 9112896.481457
+285049.676984 9112904.513434
+285054.734480 9112916.573863
+285047.834930 9112924.602441
+285035.958136 9112931.620789
+285014.134150 9112937.623233
+284987.332913 9112942.615433
+284969.433807 9112941.590447
+284957.505932 9112941.576829
+284946.696045 9112958.641934
+284943.779722 9112967.679606
+284934.877573 9112973.696775
+284915.984460 9112972.670635
+284902.989651 9112962.610224
+284893.999979 9112956.572611
+284876.057105 9112949.520201
+284854.116399 9112939.449540
+284850.067519 9112929.399343
+284847.992038 9112917.342291
+284844.915278 9112904.279536
+284835.852712 9112888.196258
+284824.838631 9112877.133525
+284812.764950 9112857.028565
+284789.735542 9112833.897372
+284770.733134 9112817.802678
+284752.680993 9112795.681721
+284735.673877 9112780.593852
+284715.743114 9112773.539074
+284692.837682 9112767.485426
+284675.852454 9112755.411224
+284654.891287 9112743.332442
+284630.970027 9112734.263916
+284613.092835 9112736.252466
+284597.218183 9112740.252430
+284585.334046 9112746.266098
+284567.493265 9112753.277464
+284549.528647 9112743.211193
+284536.563106 9112737.168906
+284523.597569 9112731.126615
+284514.637116 9112729.107170
+284484.817494 9112729.072784
+284470.850692 9112722.024762
+284456.913022 9112718.995003
+284454.983302 9112727.029245
+284453.068146 9112737.072621
+284436.126663 9112731.025713
+284419.214307 9112728.997067
+284400.335818 9112729.979819
+284383.503545 9112739.001401
+284376.596589 9112746.025332
+284388.713747 9112772.157868
+284394.837861 9112794.265239
+284403.980359 9112821.398888
+284414.160553 9112854.561083
+284425.385734 9112894.756388
+284436.487138 9112917.874045
+284445.636986 9112946.012239
+284455.700726 9112963.101338
+284471.772135 9112986.224707
+284487.814426 9113005.329799
+284502.855452 9113023.429171
+284522.895602 9113045.552521
+284545.866755 9113060.647323
+284568.859782 9113078.755808
+284589.872123 9113097.866559
+284613.851891 9113114.971588
+284640.857393 9113138.107418
+284664.866356 9113159.230673
+284689.891206 9113183.368746
+284717.868910 9113203.491953
+284739.889947 9113224.612873
+284748.901542 9113233.664204
+284755.917854 9113241.708691
+284783.946666 9113268.863796
+284802.978478 9113288.976694
+284824.027478 9113313.110110
+284844.053326 9113333.224117
+284866.089074 9113356.354074
+284875.115311 9113367.414495
+284880.129078 9113373.447554
+284883.184028 9113383.496601
+284872.315685 9113392.525202
+284860.511696 9113409.589183
+284849.723584 9113429.667991
+284848.926541 9113456.790098
+284850.168571 9113490.946426
+284844.394227 9113517.058296
+284837.560221 9113534.127952
+284828.789269 9113558.227290
+284827.955756 9113580.326576
+284829.081073 9113598.409873
+284830.118849 9113604.438395
+284833.217589 9113620.514830
+284838.377301 9113646.639177
+284840.598779 9113678.787508
+284841.782482 9113704.907317
+284840.941693 9113726.002036
+284836.168652 9113753.119609
+284833.317960 9113771.198369
+284821.550372 9113793.285187
+284816.726248 9113813.370810
+284811.916715 9113835.465562
+284810.067323 9113854.550021
+284811.214556 9113875.647010
+284814.415485 9113905.787344
+284815.570025 9113927.888896
+284812.763112 9113951.995045
+284806.944972 9113972.079537
+284803.041888 9113982.120651
+284793.233094 9114000.191483
+284786.340667 9114009.224633
+284774.521945 9114024.279504
+284745.834147 9114043.333361
+284735.915885 9114046.335716
+284729.959090 9114047.333476
+284633.736524 9114074.346627
+284601.181947 9114108.464353
+284576.506540 9114132.545507
+284547.014150 9114177.716848
+284535.188011 9114191.767120
+284523.369156 9114206.821956
+284509.525796 9114216.851684
+284479.902053 9114243.940819
+284475.019442 9114255.989920
+284469.179264 9114273.060713
+284458.405428 9114295.148645
+284439.642949 9114312.204632
+284414.879868 9114324.230945
+284366.318524 9114344.266414
+284319.796193 9114371.336093
+284285.238541 9114403.442280
+284243.722656 9114435.540453
+284211.116520 9114462.626054
+284208.251023 9114478.695705
+284208.338461 9114490.750516
+284215.456964 9114512.859003
+284222.517180 9114526.930948
+284234.583981 9114546.031440
+284241.709799 9114569.144484
+284251.832292 9114594.270086
+284258.102583 9114636.468759
+284264.132364 9114645.516712
+284275.132303 9114654.570367
+284291.073243 9114659.611454
+284310.983019 9114663.652528
+284335.899403 9114672.722124
+284314.059881 9114676.715318
+284300.121575 9114673.685656
+284258.262932 9114658.569238
+284215.242663 9114620.346581
+283405.449696 9114254.752128
+283502.176945 9114846.552689
+283527.173397 9114866.673026
+283540.168651 9114876.733765
+283559.135424 9114887.806003
+283569.126745 9114894.849551
+283600.058389 9114910.958480
+283615.034474 9114920.016929
+283633.007238 9114931.087972
+283667.900529 9114945.192316
+283691.873945 9114961.293097
+283716.797747 9114971.367592
+283769.561979 9114982.478856
+283800.362680 9114980.505364
+283833.144173 9114977.529580
+283845.072657 9114977.543364
+283878.891869 9114980.596112
+283894.781946 9114978.605337
+283933.534936 9114976.640936
+283963.377979 9114979.689032
+283987.264068 9114983.734804
+284013.167377 9114991.801126
+284040.130305 9115008.909690
+284066.128357 9115030.035360
+284085.233731 9115060.194122
+284101.349723 9115089.344874
+284116.486273 9115120.503608
+284131.732179 9115166.730847
+284134.940264 9115197.875868
+284141.196096 9115238.065417
+284159.504421 9115295.346292
+284175.635157 9115326.506117
+284194.660564 9115345.614542
+284225.723928 9115379.805120
+284251.744174 9115403.944309
+284278.751202 9115427.080047
+284300.809898 9115453.223781
+284325.806997 9115473.343505
+284362.834844 9115507.540754
+284388.833344 9115528.666130
+284424.867232 9115562.862171
+284460.879277 9115594.044472
+284474.883569 9115606.115103
+284488.887868 9115618.185727
+284509.879731 9115634.282521
+284544.905136 9115666.468162
+284580.895436 9115694.636633
+284616.907685 9115725.818758
+284646.941057 9115754.984952
+284672.939820 9115776.110097
+284712.986851 9115815.333131
+284727.992633 9115828.409338
+284745.987894 9115842.493476
+284800.894716 9115874.701315
+284872.715161 9115908.937259
+284957.334120 9115926.110046
+285037.026710 9115949.304447
+285093.717102 9115953.386349
+285141.512204 9115964.490076
+285184.322409 9115973.579053
+285220.159603 9115980.651072
+285260.009613 9115992.750315
+285303.843175 9116005.858523
+285333.730702 9116014.932896
+285360.643392 9116025.008476
+285404.447706 9116034.098332
+285442.316988 9116047.199734
+285455.386166 9116067.305334
+285485.361629 9116088.434307
+285508.305479 9116099.509914
+285524.239672 9116103.545849
+285542.140003 9116104.570311
+285560.040332 9116105.594765
+285586.865183 9116103.615476
+285598.786523 9116102.624170
+285619.647033 9116100.638236
+285652.480166 9116104.692885
+285695.209879 9116102.731180
+285733.912053 9116093.733122
+285756.723997 9116086.726539
+285779.528601 9116078.715388
+285810.248969 9116065.690237
+285840.983978 9116054.674185
+285870.702919 9116040.643344
+285895.502905 9116033.638901
+285924.242422 9116021.616049
+285953.983306 9116010.598836
+285982.730121 9115999.580511
+286011.469582 9115987.557615
+286034.259393 9115977.537245
+286055.090436 9115971.532903
+286072.917312 9115962.511600
+286088.748744 9115952.483546
+286103.608130 9115945.468063
+286122.436369 9115937.452395
+286143.245360 9115928.434351
+286181.859152 9115907.381295
+286203.662160 9115898.364322
+286225.428462 9115884.324562
+286244.175910 9115865.258742
+286260.957270 9115849.204402
+286279.690009 9115828.129463
+286285.558863 9115815.076786
+286299.336034 9115796.005501
+286311.139787 9115778.941145
+286291.075397 9115753.805446
+286262.933918 9115711.583553
+286253.840753 9115691.482611
+286243.716865 9115666.357795
+286226.561319 9115631.179763
+286221.451697 9115612.087735
+286216.342081 9115592.995705
+286212.219175 9115572.900211
+286211.063721 9115550.798885
+286207.854162 9115519.654366
+286207.729440 9115502.576912
+286209.548778 9115479.474311
+286212.310801 9115449.340911
+286217.090245 9115423.227925
+286218.938930 9115404.143548
+286223.755052 9115383.053343
+286230.522563 9115356.942546
+286233.416636 9115344.891157
+286240.198813 9115320.789474
+286248.011701 9115301.711665
+286256.789274 9115278.616726
+286257.753962 9115274.599597
+286264.572806 9115255.520694
+286275.316423 9115229.414277
+286278.129782 9115206.312775
+286279.971118 9115186.223846
+286281.797783 9115164.125806
+286285.605174 9115141.025399
+286291.407960 9115118.931737
+286301.186862 9115096.842452
+286302.962170 9115067.712523
+286305.731509 9115038.583689
+286310.518248 9115013.475267
+286314.266942 9114982.338417
+286318.958312 9114944.170772
+286325.579047 9114897.968871
+286330.373115 9114873.865007
+286334.092465 9114838.709937
+286338.857188 9114810.587851
+286348.548009 9114776.443907
+286354.292076 9114746.313807
+286359.896769 9114697.097150
+286365.560144 9114655.916940
+286368.388163 9114634.824557
+286377.902913 9114576.571284
+286399.254326 9114369.658032
+286416.952424 9114206.940857
+286417.895097 9114199.910065
+286423.529133 9114154.711644
+286426.320483 9114128.596489
+286428.147161 9114106.498460
+286427.971159 9114082.389127
+286425.865814 9114066.314045
+Region 1
+135
+287443.375587 9115918.795675
+287427.367799 9115904.714946
+287398.341740 9115877.561210
+287353.315338 9115837.331229
+287350.318490 9115835.318928
+287314.297427 9115803.134894
+287281.287979 9115774.972227
+287226.033969 9115831.167141
+287209.179437 9115837.176250
+287194.283541 9115839.169292
+287183.312288 9115834.134760
+287177.311242 9115829.105580
+287167.275157 9115816.035709
+287160.235918 9115804.978151
+287152.180566 9115790.905866
+287141.165175 9115779.844014
+287136.187616 9115778.834102
+287129.199900 9115774.808392
+287115.261264 9115771.779722
+287103.318066 9115769.757745
+287101.329985 9115769.755599
+287088.385390 9115766.727993
+287078.430274 9115764.708155
+287064.447498 9115755.652160
+287051.436698 9115743.583580
+287043.396103 9115731.520368
+287035.311377 9115713.429845
+287028.235408 9115697.349496
+287024.126851 9115679.263268
+287015.143727 9115674.230832
+287007.073736 9115658.149401
+286991.029385 9115639.045703
+286983.990221 9115627.988100
+286979.925819 9115615.929172
+286979.778735 9115595.838136
+286980.618337 9115574.743625
+286981.244679 9115524.517110
+286976.215672 9115516.475310
+286954.251305 9115503.392431
+286936.336614 9115500.359372
+286931.359085 9115499.349428
+286918.421924 9115497.326305
+286891.553565 9115493.278967
+286874.654966 9115493.260618
+286852.771486 9115491.227758
+286833.862761 9115488.193575
+286819.946265 9115488.178447
+286799.999408 9115479.115852
+286796.008567 9115477.102421
+286780.059906 9115471.057799
+286759.126375 9115462.998654
+286751.130003 9115456.962676
+286739.164840 9115451.926920
+286734.150577 9115445.894187
+286673.786255 9115482.996573
+286669.868883 9115491.028665
+286668.992394 9115507.100438
+286668.101212 9115521.163104
+286666.201300 9115533.215579
+286656.429900 9115556.309472
+286649.596528 9115573.379295
+286637.807652 9115592.452805
+286625.032074 9115612.529784
+286607.264249 9115629.587677
+286595.431268 9115642.633860
+286579.680884 9115663.712133
+286563.879068 9115677.758525
+286554.984115 9115684.780634
+286539.145560 9115693.804251
+286528.247826 9115698.815077
+286513.417989 9115709.848881
+286495.620706 9115722.888531
+286477.816068 9115734.923622
+286443.413760 9115788.126963
+286426.713273 9115815.231451
+286386.390636 9115874.455581
+286409.466652 9115903.612693
+286437.557000 9115938.802548
+286466.670821 9115978.011678
+286468.688297 9115982.032068
+286484.813432 9116012.186068
+286507.035120 9116060.428541
+286532.268406 9116112.692459
+286559.622131 9116183.040482
+286572.787311 9116216.204830
+286590.974226 9116256.406454
+286615.213708 9116308.669191
+286635.344720 9116342.845619
+286655.497821 9116380.035690
+286673.611383 9116410.191713
+286690.686801 9116434.319327
+286718.726281 9116462.476999
+286744.762973 9116488.623386
+286771.845236 9116521.802694
+286797.904060 9116550.962691
+286812.954705 9116570.065317
+286837.003395 9116596.209471
+286860.065411 9116623.357084
+286875.108751 9116641.455125
+286904.194048 9116676.645557
+286910.209926 9116683.683855
+286926.048672 9116674.660048
+286957.711425 9116654.603319
+286999.484034 9116657.661962
+287076.048736 9116660.757993
+287172.472512 9116660.861585
+287213.258400 9116664.923509
+287231.085173 9116655.901744
+287247.925245 9116647.883458
+287269.595640 9116620.784047
+287269.463047 9116602.702151
+287270.250852 9116574.575823
+287292.031704 9116562.544657
+287294.005084 9116560.537687
+287266.826732 9116514.299640
+287254.684470 9116485.154905
+287235.532295 9116448.970846
+287210.445289 9116416.798569
+287223.286982 9116405.762391
+287244.957315 9116378.663013
+287267.562758 9116343.528298
+287283.195084 9116306.377016
+287290.904449 9116273.235403
+287293.584644 9116232.052060
+287304.305606 9116202.931848
+287323.958259 9116171.812132
+287339.752544 9116156.760944
+287363.506559 9116142.722827
+287389.138159 9116113.618590
+287409.836332 9116089.531769
+287429.533072 9116064.439330
+287453.117564 9116027.296556
+287477.688698 9115989.150293
+287500.308549 9115956.024642
+287443.375587 9115918.795675
+Region 1
+166
+286878.314280 9114498.765385
+286876.223415 9114484.699475
+286872.115145 9114466.613183
+286863.935345 9114435.463360
+286859.915227 9114429.431701
+286855.895110 9114423.400040
+286847.840191 9114409.327612
+286845.749346 9114395.261697
+286848.621215 9114380.196658
+286849.505061 9114365.129447
+286843.430835 9114350.054634
+286831.333804 9114326.936874
+286825.259592 9114311.862055
+286821.129344 9114290.762088
+286818.752146 9114237.518588
+286763.986251 9114224.399554
+286721.111767 9114206.270754
+286686.093956 9114175.091426
+286658.004886 9114139.901482
+286644.958044 9114122.809869
+286626.889816 9114098.680907
+286575.627030 9114156.888253
+286565.767659 9114167.927424
+286548.972235 9114181.972603
+286544.031539 9114185.985354
+286529.172765 9114193.000832
+286518.282685 9114199.016128
+286506.376585 9114202.016662
+286490.531124 9114210.035590
+286470.650938 9114210.013692
+286449.791410 9114211.999801
+286416.952424 9114206.940857
+286399.254326 9114369.658032
+286377.902913 9114576.571284
+286368.388163 9114634.824557
+286365.560144 9114655.916940
+286359.896769 9114697.097150
+286354.292076 9114746.313807
+286348.548009 9114776.443907
+286338.857188 9114810.587851
+286334.092465 9114838.709937
+286330.373115 9114873.865007
+286325.579047 9114897.968871
+286318.958312 9114944.170772
+286314.266942 9114982.338417
+286310.518248 9115013.475267
+286305.731509 9115038.583689
+286302.962170 9115067.712523
+286301.186862 9115096.842452
+286291.407960 9115118.931737
+286285.605174 9115141.025399
+286281.797783 9115164.125806
+286279.971118 9115186.223846
+286278.129782 9115206.312775
+286275.316423 9115229.414277
+286264.572806 9115255.520694
+286257.753962 9115274.599597
+286256.789274 9115278.616726
+286248.011701 9115301.711665
+286240.198813 9115320.789474
+286233.416636 9115344.891157
+286230.522563 9115356.942546
+286223.755052 9115383.053343
+286218.938930 9115404.143548
+286217.090245 9115423.227925
+286212.310801 9115449.340911
+286209.548778 9115479.474311
+286207.729440 9115502.576912
+286207.854162 9115519.654366
+286211.063721 9115550.798885
+286212.219175 9115572.900211
+286216.342081 9115592.995705
+286221.451697 9115612.087735
+286226.561319 9115631.179763
+286243.716865 9115666.357795
+286253.840753 9115691.482611
+286262.933918 9115711.583553
+286291.075397 9115753.805446
+286311.139787 9115778.941145
+286336.211131 9115809.105054
+286355.303552 9115837.253297
+286379.366230 9115865.406968
+286386.390636 9115874.455581
+286426.713273 9115815.231451
+286443.413760 9115788.126963
+286477.816068 9115734.923622
+286495.620706 9115722.888531
+286513.417989 9115709.848881
+286528.247826 9115698.815077
+286539.145560 9115693.804251
+286554.984115 9115684.780634
+286563.879068 9115677.758525
+286579.680884 9115663.712133
+286595.431268 9115642.633860
+286607.264249 9115629.587677
+286625.032074 9115612.529784
+286637.807652 9115592.452805
+286649.596528 9115573.379295
+286656.429900 9115556.309472
+286666.201300 9115533.215579
+286668.101212 9115521.163104
+286668.992394 9115507.100438
+286669.868883 9115491.028665
+286673.786255 9115482.996573
+286734.150577 9115445.894187
+286681.047961 9115388.577214
+286647.133271 9115372.467475
+286643.164481 9115373.467688
+286631.221383 9115371.445556
+286613.262668 9115362.385028
+286599.280095 9115353.328836
+286589.273660 9115344.276986
+286580.261263 9115335.226219
+286575.173597 9115319.147918
+286571.035909 9115297.043378
+286569.895010 9115276.951207
+286555.787643 9115250.817570
+286546.701849 9115231.721247
+286527.536258 9115193.527500
+286520.438553 9115174.433342
+286517.309633 9115154.338985
+286518.259614 9115148.312746
+286519.165547 9115136.259181
+286520.122870 9115131.237497
+286530.954410 9115117.185714
+286544.760689 9115102.132642
+286566.533867 9115089.097385
+286576.422751 9115082.076388
+286589.286373 9115074.054100
+286603.092618 9115059.001017
+286609.999408 9115051.976752
+286620.816217 9115035.915851
+286631.640362 9115020.859502
+286640.469105 9115004.796424
+286647.331822 9114991.744833
+286651.212460 9114978.689981
+286655.063723 9114961.616913
+286656.013687 9114955.590677
+286656.963652 9114949.564441
+286658.826865 9114932.489199
+286663.701522 9114919.435435
+286668.612895 9114911.404440
+286690.356570 9114894.350937
+286702.211408 9114884.318439
+286724.013811 9114875.301355
+286742.804757 9114862.262792
+286749.733533 9114858.252178
+286762.604404 9114851.234415
+286774.459212 9114841.201905
+286787.263964 9114825.143158
+286809.942800 9114800.054278
+286806.887281 9114790.005493
+286801.792305 9114772.922665
+286793.641823 9114745.791048
+286789.511500 9114724.691089
+286780.389056 9114700.572039
+286789.247085 9114688.527171
+286802.066490 9114674.477537
+286823.765936 9114651.396689
+286840.524660 9114632.328625
+286861.208013 9114606.233025
+286870.066004 9114594.188149
+286874.874469 9114572.093408
+286878.688917 9114549.997582
+286879.513975 9114526.893951
+286878.314280 9114498.765385
+Region 1
+173
+287426.197880 9113030.719098
+287409.167964 9113012.618817
+287389.222265 9113003.556239
+287368.289942 9112995.497120
+287345.406405 9112992.458580
+287327.536842 9112995.452749
+287305.720748 9113002.460783
+287286.857196 9113005.453854
+287264.017724 9113008.442582
+287237.202331 9113011.426961
+287208.362249 9113009.386395
+287187.444623 9113003.336289
+287163.537719 9112996.278362
+287148.606004 9112993.248409
+287128.682366 9112987.199358
+287131.539478 9112970.125232
+287111.615852 9112964.076171
+287101.632014 9112958.037979
+287092.583424 9112943.964454
+287088.534096 9112933.914576
+287085.375971 9112909.802051
+287085.199783 9112885.692790
+287083.978236 9112854.550573
+287085.694578 9112817.384306
+287079.694022 9112812.355009
+287070.696860 9112805.313338
+287062.701017 9112799.277307
+287056.693125 9112793.243453
+287023.037413 9112812.292896
+287004.232601 9112823.322259
+286989.366991 9112829.333215
+286968.537517 9112835.337619
+286916.946112 9112848.340031
+286895.107961 9112852.334206
+286872.305171 9112860.345493
+286846.527773 9112869.358042
+286838.561278 9112867.340182
+286837.537959 9112863.320873
+286823.328866 9112823.123394
+286820.266252 9112812.070015
+286815.186348 9112796.996231
+286813.139718 9112788.957608
+286813.022367 9112772.884743
+286811.896372 9112754.801675
+286813.825649 9112746.767432
+286685.764070 9112768.726167
+286550.583206 9112768.576642
+286453.334588 9112790.568879
+286351.152553 9112817.578187
+286339.742718 9112752.269847
+286361.134166 9112686.997990
+286403.355101 9112615.722005
+286397.989721 9112561.470433
+286315.971330 9112491.060736
+286197.015230 9112398.509485
+286083.102592 9112316.008953
+285985.101147 9112234.530451
+285922.364130 9112218.387142
+285877.555124 9112207.286673
+285851.711940 9112207.257580
+285823.238546 9112665.300957
+285823.289729 9112672.332873
+285816.704784 9112723.557589
+285821.324198 9112811.963294
+285822.786205 9112876.256216
+285830.241403 9112944.574068
+285834.604978 9112997.820175
+285843.880000 9113043.035380
+285862.093627 9113087.256048
+285872.267602 9113119.413081
+285892.410753 9113155.599478
+285913.547931 9113191.786970
+285944.705551 9113239.035708
+285976.813321 9113280.258168
+286008.950433 9113325.498823
+286033.040502 9113357.671313
+286062.166467 9113398.890344
+286089.297179 9113439.102570
+286114.432630 9113478.307996
+286139.568130 9113517.513398
+286158.666455 9113546.666570
+286184.788712 9113584.868475
+286207.951002 9113626.080713
+286232.151298 9113673.321372
+286257.367637 9113723.576778
+286282.562057 9113770.818485
+286312.733876 9113819.070225
+286341.941085 9113871.339053
+286362.107037 9113910.538727
+286382.251035 9113946.724716
+286397.417715 9113981.900642
+286411.546423 9114011.048126
+286419.667120 9114034.161684
+286422.773798 9114051.242420
+286425.865814 9114066.314045
+286427.971159 9114082.389127
+286428.147161 9114106.498460
+286426.320483 9114128.596489
+286423.529133 9114154.711644
+286417.895097 9114199.910065
+286416.952424 9114206.940857
+286449.791410 9114211.999801
+286470.650938 9114210.013692
+286490.531124 9114210.035590
+286506.376585 9114202.016662
+286518.282685 9114199.016128
+286529.172765 9114193.000832
+286544.031539 9114185.985354
+286548.972235 9114181.972603
+286565.767659 9114167.927424
+286575.627030 9114156.888253
+286626.889816 9114098.680907
+286701.803088 9114012.372208
+286738.258279 9113968.212191
+286789.711509 9113936.123153
+286861.965252 9113894.011395
+286779.958095 9113825.612437
+286772.981300 9113686.977468
+286760.906576 9113666.873293
+286743.810522 9113639.731774
+286730.639109 9113605.562734
+286714.515087 9113575.408624
+286708.367707 9113550.288208
+286705.253671 9113532.202951
+286707.080258 9113510.104943
+286705.932206 9113489.008209
+286698.842213 9113470.918574
+286688.784924 9113454.834763
+286673.750351 9113437.740919
+286664.657732 9113417.639974
+286657.479759 9113387.495670
+286656.280406 9113359.367045
+286661.980309 9113323.209651
+286671.714836 9113295.093078
+286687.471956 9113275.019513
+286708.191664 9113253.946866
+286723.956089 9113234.877850
+286752.612979 9113211.804840
+286776.336592 9113193.749120
+286803.130177 9113187.751320
+286847.844829 9113185.791384
+286881.691680 9113192.860381
+286912.607954 9113206.957952
+286931.596422 9113221.042416
+286949.590915 9113235.125779
+287056.659568 9113332.683847
+287128.623233 9113387.007856
+287131.597851 9113386.006559
+287141.471622 9113376.976439
+287157.301968 9113366.948273
+287180.016755 9113346.882175
+287198.755577 9113326.811734
+287216.434280 9113297.699242
+287230.070906 9113259.541450
+287237.706884 9113216.354401
+287245.284087 9113165.130942
+287253.074326 9113143.039477
+287265.849158 9113122.962533
+287272.851107 9113128.997424
+287280.898467 9113142.065256
+287286.950521 9113154.126369
+287360.732976 9113185.347510
+287371.703525 9113190.382153
+287378.514415 9113170.298702
+287383.315291 9113147.199437
+287391.120154 9113127.117067
+287399.977788 9113115.072183
+287406.847456 9113103.025137
+287418.687021 9113090.983493
+287430.511880 9113076.932746
+287435.371528 9113061.869887
+287435.253931 9113045.797079
+287426.197880 9113030.719098
+Region 1
+213
+287788.717658 9114349.068663
+287770.729822 9114335.990356
+287762.748323 9114331.963635
+287756.769563 9114329.948141
+287663.391953 9114337.884203
+287658.399838 9114334.865216
+287647.392157 9114324.807974
+287629.345469 9114303.693207
+287617.226024 9114277.562102
+287604.016909 9114238.370782
+287597.699607 9114190.146004
+287602.544504 9114173.074022
+287605.467632 9114165.040840
+287606.432195 9114161.023715
+287596.102120 9114107.771904
+287591.934778 9114081.649341
+287590.668496 9114044.479949
+287583.511815 9114017.349618
+287575.316999 9113984.190916
+287581.207408 9113974.151855
+287590.020941 9113956.079615
+287630.428971 9113908.909739
+287647.209164 9113892.855163
+287661.979275 9113873.784796
+287672.766034 9113853.705596
+287681.542717 9113830.610607
+287685.342063 9113806.505718
+287685.202232 9113787.419290
+287682.109861 9113772.347845
+287681.064352 9113765.314932
+287675.954564 9113746.223148
+287665.889536 9113729.135104
+287653.836534 9113712.044912
+287641.812973 9113698.972910
+287626.748583 9113677.861293
+287613.672191 9113656.751814
+287600.610526 9113637.651426
+287589.485360 9113611.521333
+287583.396363 9113594.437549
+287578.242515 9113569.318441
+287576.203045 9113562.284446
+287572.109397 9113546.207356
+287570.983009 9113528.124389
+287574.753009 9113500.001299
+287579.516996 9113471.879285
+287582.241522 9113436.723274
+287580.018187 9113404.575538
+287572.876417 9113379.454272
+287563.746689 9113354.330851
+287559.711916 9113346.290151
+287554.668452 9113336.239274
+287542.659748 9113325.176314
+287533.655061 9113317.130228
+287529.620298 9113309.089522
+287524.510668 9113289.997690
+287524.356254 9113268.902141
+287523.222566 9113249.814615
+287520.034742 9113221.683984
+287515.897059 9113199.579574
+287520.859615 9113198.580411
+287527.788075 9113194.569752
+287543.706483 9113196.596085
+287551.650981 9113195.600150
+287572.458406 9113186.581808
+287555.237192 9113142.363315
+287540.327489 9113142.347159
+287519.490664 9113147.347283
+287498.668535 9113154.356498
+287479.782900 9113154.336010
+287475.829031 9113157.345347
+287456.081727 9113175.405678
+287434.346444 9113193.463845
+287421.512882 9113205.504419
+287416.587073 9113211.526324
+287412.596443 9113209.512905
+287408.605813 9113207.499484
+287371.703525 9113190.382153
+287360.732976 9113185.347510
+287286.950521 9113154.126369
+287280.898467 9113142.065256
+287272.851107 9113128.997424
+287265.849158 9113122.962533
+287253.074326 9113143.039477
+287245.284087 9113165.130942
+287237.706884 9113216.354401
+287230.070906 9113259.541450
+287216.434280 9113297.699242
+287198.755577 9113326.811734
+287180.016755 9113346.882175
+287157.301968 9113366.948273
+287141.471622 9113376.976439
+287131.597851 9113386.006559
+287128.623233 9113387.007856
+287056.659568 9113332.683847
+286949.590915 9113235.125779
+286931.596422 9113221.042416
+286912.607954 9113206.957952
+286881.691680 9113192.860381
+286847.844829 9113185.791384
+286803.130177 9113187.751320
+286776.336592 9113193.749120
+286752.612979 9113211.804840
+286723.956089 9113234.877850
+286708.191664 9113253.946866
+286687.471956 9113275.019513
+286671.714836 9113295.093078
+286661.980309 9113323.209651
+286656.280406 9113359.367045
+286657.479759 9113387.495670
+286664.657732 9113417.639974
+286673.750351 9113437.740919
+286688.784924 9113454.834763
+286698.842213 9113470.918574
+286705.932206 9113489.008209
+286707.080258 9113510.104943
+286705.253671 9113532.202951
+286708.367707 9113550.288208
+286714.515087 9113575.408624
+286730.639109 9113605.562734
+286743.810522 9113639.731774
+286760.906576 9113666.873293
+286772.981300 9113686.977468
+286779.958095 9113825.612437
+286861.965252 9113894.011395
+286789.711509 9113936.123153
+286738.258279 9113968.212191
+286701.803088 9114012.372208
+286626.889816 9114098.680907
+286644.958044 9114122.809869
+286658.004886 9114139.901482
+286686.093956 9114175.091426
+286721.111767 9114206.270754
+286763.986251 9114224.399554
+286818.752146 9114237.518588
+286821.129344 9114290.762088
+286825.259592 9114311.862055
+286831.333804 9114326.936874
+286843.430835 9114350.054634
+286849.505061 9114365.129447
+286848.621215 9114380.196658
+286845.749346 9114395.261697
+286847.840191 9114409.327612
+286855.895110 9114423.400040
+286859.915227 9114429.431701
+286863.935345 9114435.463360
+286872.115145 9114466.613183
+286876.223415 9114484.699475
+286878.314280 9114498.765385
+286879.513975 9114526.893951
+286878.688917 9114549.997582
+286874.874469 9114572.093408
+286870.066004 9114594.188149
+286861.208013 9114606.233025
+286840.524660 9114632.328625
+286823.765936 9114651.396689
+286802.066490 9114674.477537
+286789.247085 9114688.527171
+286780.389056 9114700.572039
+286789.511500 9114724.691089
+286793.641823 9114745.791048
+286801.792305 9114772.922665
+286806.887281 9114790.005493
+286809.942800 9114800.054278
+286819.934428 9114807.096995
+286830.986196 9114823.181769
+286839.983811 9114830.223395
+286850.962123 9114836.262632
+286877.712519 9114824.237245
+286895.546107 9114816.220314
+286908.424283 9114810.207071
+286927.251878 9114802.191212
+286942.118083 9114796.180126
+286952.021535 9114791.168180
+286965.886364 9114784.151453
+286990.685396 9114777.146612
+287001.568156 9114770.126635
+287004.491413 9114762.093460
+287004.462013 9114758.075251
+286996.142385 9114707.839000
+287004.065126 9114703.829438
+287015.971284 9114700.828751
+287022.900004 9114696.818106
+287041.683423 9114682.774904
+287048.612138 9114678.764257
+287051.579487 9114676.758393
+287088.313986 9114670.771026
+287121.992901 9114654.734881
+287148.779854 9114647.732133
+287171.539264 9114633.693203
+287191.382795 9114628.691994
+287207.228200 9114620.672817
+287210.202890 9114619.671496
+287236.923609 9114603.627747
+287250.788322 9114596.610956
+287271.640543 9114593.619895
+287288.494641 9114587.610873
+287304.413564 9114589.637174
+287328.291948 9114592.676615
+287347.244407 9114601.737976
+287361.226805 9114610.793959
+287374.229909 9114621.857964
+287388.175529 9114625.891186
+287599.951842 9114633.151045
+287612.815105 9114625.128539
+287629.580782 9114607.064813
+287719.358299 9114514.743435
+287723.245964 9114502.693120
+287728.142365 9114492.652968
+287741.859643 9114465.545090
+287757.807963 9114471.589430
+287831.828187 9114399.341847
+287810.725720 9114368.178509
+287788.717658 9114349.068663
+Region 1
+372
+288121.262096 9114559.372407
+288113.236297 9114549.318488
+288104.128019 9114527.208955
+288099.069507 9114515.149112
+288092.987502 9114499.070024
+288082.929475 9114482.986701
+288082.892614 9114477.963970
+288082.841009 9114470.932145
+288075.750268 9114452.842901
+288068.689022 9114438.771840
+288066.568322 9114420.687886
+288070.441143 9114406.628471
+288075.315338 9114393.574663
+288083.075714 9114367.464928
+288093.891813 9114351.403833
+288101.674292 9114328.307738
+288109.434650 9114302.198004
+288107.254982 9114276.077683
+288101.121427 9114252.966763
+288097.042224 9114238.898877
+288096.003996 9114232.870540
+288083.980161 9114219.798722
+288065.948107 9114200.693259
+288050.964397 9114190.631888
+288023.993735 9114172.521402
+287993.061829 9114156.415741
+287997.015035 9114017.793566
+287997.345963 9113927.385395
+287998.258919 9113916.336440
+287991.175717 9113899.251697
+287987.052405 9113879.156500
+287984.902352 9113857.054335
+287984.732924 9113833.949750
+287992.485974 9113806.835488
+288006.202969 9113779.727608
+288012.041687 9113762.656690
+288011.018229 9113758.637438
+288009.972673 9113751.604545
+287999.937001 9113738.534793
+287988.826320 9113714.413954
+287986.705757 9113696.329975
+287988.649543 9113690.304821
+287976.154547 9113612.941902
+287979.048132 9113600.890530
+287980.955094 9113589.842639
+287976.868671 9113574.770168
+287969.748740 9113552.662667
+287965.581321 9113526.540171
+287966.479572 9113513.482121
+287963.394517 9113499.415258
+287956.355614 9113488.357773
+287942.336727 9113474.279176
+287932.315878 9113463.218484
+287921.197970 9113438.093054
+287916.051346 9113413.978571
+287908.946211 9113393.880141
+287901.863170 9113376.795353
+287891.754017 9113353.680069
+287886.747294 9113348.651987
+287884.744605 9113346.640754
+287879.737884 9113341.612670
+287870.703706 9113329.548474
+287863.679581 9113320.500058
+287860.646108 9113313.465013
+287859.630044 9113310.450300
+287860.535699 9113298.396792
+287864.445381 9113289.360136
+287873.317608 9113279.324279
+287879.222610 9113271.294310
+287882.160388 9113265.270229
+287883.066039 9113253.216722
+287869.459781 9113159.779848
+287859.313920 9113131.641798
+287821.579535 9113136.623853
+287819.444403 9113116.530743
+287813.340723 9113097.437894
+287807.251766 9113080.354140
+287800.220344 9113070.301152
+287790.236424 9113064.263141
+287779.251172 9113057.219505
+287771.233140 9113048.169986
+287763.185684 9113035.102270
+287760.071330 9113017.017173
+287759.894769 9112992.908002
+287765.755630 9112978.850758
+287759.806490 9112980.853416
+287754.851325 9112982.857148
+287722.108974 9112990.858107
+287673.573306 9113013.910086
+287609.133938 9113036.944807
+287598.288425 9113048.987562
+287563.712424 9113078.081818
+287532.118315 9113107.179291
+287502.504774 9113135.274357
+287479.782900 9113154.336010
+287498.668535 9113154.356498
+287519.490664 9113147.347283
+287540.327489 9113142.347159
+287555.237192 9113142.363315
+287572.458406 9113186.581808
+287551.650981 9113195.600150
+287543.706483 9113196.596085
+287527.788075 9113194.569752
+287520.859615 9113198.580411
+287515.897059 9113199.579574
+287520.034742 9113221.683984
+287523.222566 9113249.814615
+287524.356254 9113268.902141
+287524.510668 9113289.997690
+287529.620298 9113309.089522
+287533.655061 9113317.130228
+287542.659748 9113325.176314
+287554.668452 9113336.239274
+287559.711916 9113346.290151
+287563.746689 9113354.330851
+287572.876417 9113379.454272
+287580.018187 9113404.575538
+287582.241522 9113436.723274
+287579.516996 9113471.879285
+287574.753009 9113500.001299
+287570.983009 9113528.124389
+287572.109397 9113546.207356
+287576.203045 9113562.284446
+287578.242515 9113569.318441
+287583.396363 9113594.437549
+287589.485360 9113611.521333
+287600.610526 9113637.651426
+287613.672191 9113656.751814
+287626.748583 9113677.861293
+287641.812973 9113698.972910
+287653.836534 9113712.044912
+287665.889536 9113729.135104
+287675.954564 9113746.223148
+287681.064352 9113765.314932
+287682.109861 9113772.347845
+287685.202232 9113787.419290
+287685.342063 9113806.505718
+287681.542717 9113830.610607
+287672.766034 9113853.705596
+287661.979275 9113873.784796
+287647.209164 9113892.855163
+287630.428971 9113908.909739
+287590.020941 9113956.079615
+287581.207408 9113974.151855
+287575.316999 9113984.190916
+287583.511815 9114017.349618
+287590.668496 9114044.479949
+287591.934778 9114081.649341
+287596.102120 9114107.771904
+287606.432195 9114161.023715
+287605.467632 9114165.040840
+287602.544504 9114173.074022
+287597.699607 9114190.146004
+287604.016909 9114238.370782
+287617.226024 9114277.562102
+287629.345469 9114303.693207
+287647.392157 9114324.807974
+287658.399838 9114334.865216
+287663.391953 9114337.884203
+287756.769563 9114329.948141
+287762.748323 9114331.963635
+287770.729822 9114335.990356
+287788.717658 9114349.068663
+287810.725720 9114368.178509
+287831.828187 9114399.341847
+287757.807963 9114471.589430
+287741.859643 9114465.545090
+287728.142365 9114492.652968
+287723.245964 9114502.693120
+287719.358299 9114514.743435
+287629.580782 9114607.064813
+287612.815105 9114625.128539
+287599.951842 9114633.151045
+287388.175529 9114625.891186
+287374.229909 9114621.857964
+287361.226805 9114610.793959
+287347.244407 9114601.737976
+287328.291948 9114592.676615
+287304.413564 9114589.637174
+287288.494641 9114587.610873
+287271.640543 9114593.619895
+287250.788322 9114596.610956
+287236.923609 9114603.627747
+287210.202890 9114619.671496
+287207.228200 9114620.672817
+287191.382795 9114628.691994
+287171.539264 9114633.693203
+287148.779854 9114647.732133
+287121.992901 9114654.734881
+287088.313986 9114670.771026
+287051.579487 9114676.758393
+287048.612138 9114678.764257
+287041.683423 9114682.774904
+287022.900004 9114696.818106
+287015.971284 9114700.828751
+287004.065126 9114703.829438
+286996.142385 9114707.839000
+287004.462013 9114758.075251
+287004.491413 9114762.093460
+287001.568156 9114770.126635
+286990.685396 9114777.146612
+286965.886364 9114784.151453
+286952.021535 9114791.168180
+286942.118083 9114796.180126
+286927.251878 9114802.191212
+286908.424283 9114810.207071
+286895.546107 9114816.220314
+286877.712519 9114824.237245
+286850.962123 9114836.262632
+286839.983811 9114830.223395
+286830.986196 9114823.181769
+286819.934428 9114807.096995
+286809.942800 9114800.054278
+286787.263964 9114825.143158
+286774.459212 9114841.201905
+286762.604404 9114851.234415
+286749.733533 9114858.252178
+286742.804757 9114862.262792
+286724.013811 9114875.301355
+286702.211408 9114884.318439
+286690.356570 9114894.350937
+286668.612895 9114911.404440
+286663.701522 9114919.435435
+286658.826865 9114932.489199
+286656.963652 9114949.564441
+286656.013687 9114955.590677
+286655.063723 9114961.616913
+286651.212460 9114978.689981
+286647.331822 9114991.744833
+286640.469105 9115004.796424
+286631.640362 9115020.859502
+286620.816217 9115035.915851
+286609.999408 9115051.976752
+286603.092618 9115059.001017
+286589.286373 9115074.054100
+286576.422751 9115082.076388
+286566.533867 9115089.097385
+286544.760689 9115102.132642
+286530.954410 9115117.185714
+286520.122870 9115131.237497
+286519.165547 9115136.259181
+286518.259614 9115148.312746
+286517.309633 9115154.338985
+286520.438553 9115174.433342
+286527.536258 9115193.527500
+286546.701849 9115231.721247
+286555.787643 9115250.817570
+286569.895010 9115276.951207
+286571.035909 9115297.043378
+286575.173597 9115319.147918
+286580.261263 9115335.226219
+286589.273660 9115344.276986
+286599.280095 9115353.328836
+286613.262668 9115362.385028
+286631.221383 9115371.445556
+286643.164481 9115373.467688
+286647.133271 9115372.467475
+286681.047961 9115388.577214
+286734.150577 9115445.894187
+286739.164840 9115451.926920
+286751.130003 9115456.962676
+286759.126375 9115462.998654
+286780.059906 9115471.057799
+286796.008567 9115477.102421
+286799.999408 9115479.115852
+286819.946265 9115488.178447
+286833.862761 9115488.193575
+286852.771486 9115491.227758
+286874.654966 9115493.260618
+286891.553565 9115493.278967
+286918.421924 9115497.326305
+286931.359085 9115499.349428
+286936.336614 9115500.359372
+286954.251305 9115503.392431
+286976.215672 9115516.475310
+286981.244679 9115524.517110
+286980.618337 9115574.743625
+286979.778735 9115595.838136
+286979.925819 9115615.929172
+286983.990221 9115627.988100
+286991.029385 9115639.045703
+287007.073736 9115658.149401
+287015.143727 9115674.230832
+287024.126851 9115679.263268
+287028.235408 9115697.349496
+287035.311377 9115713.429845
+287043.396103 9115731.520368
+287051.436698 9115743.583580
+287064.447498 9115755.652160
+287078.430274 9115764.708155
+287088.385390 9115766.727993
+287101.329985 9115769.755599
+287103.318066 9115769.757745
+287115.261264 9115771.779722
+287129.199900 9115774.808392
+287136.187616 9115778.834102
+287141.165175 9115779.844014
+287152.180566 9115790.905866
+287160.235918 9115804.978151
+287167.275157 9115816.035709
+287177.311242 9115829.105580
+287183.312288 9115834.134760
+287194.283541 9115839.169292
+287209.179437 9115837.176250
+287226.033969 9115831.167141
+287281.287979 9115774.972227
+287301.014159 9115753.898056
+287328.685264 9115731.827878
+287332.617241 9115725.804853
+287341.526768 9115720.791717
+287349.501160 9115723.813911
+287354.522891 9115730.851098
+287356.555146 9115736.880532
+287359.632984 9115749.942881
+287364.632630 9115753.966417
+287371.568808 9115750.960239
+287378.490257 9115745.944962
+287388.327543 9115731.891940
+287431.719059 9115684.725051
+287470.118215 9115634.539166
+287478.983514 9115623.498717
+287499.652008 9115595.393719
+287536.998062 9115537.170355
+287582.281548 9115476.946399
+287607.883239 9115443.823960
+287804.095696 9115226.048416
+287822.856861 9115208.991258
+287850.608451 9115197.970916
+287868.559848 9115206.026365
+287893.521022 9115221.121045
+287937.479268 9115251.304007
+287952.293777 9115238.260760
+287967.115650 9115226.222057
+287987.850035 9115207.157866
+288001.648368 9115191.099914
+288011.441104 9115171.019549
+288018.214895 9115145.913284
+288011.227245 9115141.887704
+287997.259325 9115134.841085
+287975.250754 9115115.731444
+287961.150132 9115090.602971
+287944.936156 9115048.395077
+287947.910843 9115047.393705
+288031.275757 9115029.400696
+288039.139418 9115017.354592
+288040.876733 9114983.202130
+288044.705322 9114963.115431
+288056.419679 9114933.996268
+288083.971910 9114895.853090
+288095.745230 9114874.770295
+288108.586304 9114863.734015
+288123.437526 9114855.713482
+288143.288317 9114851.716405
+288171.076465 9114845.718665
+288160.009542 9114827.625240
+288146.880847 9114799.484242
+288133.796421 9114777.370511
+288129.724496 9114764.307191
+288118.650240 9114745.209201
+288116.617969 9114739.179812
+288106.626228 9114732.137426
+288102.591187 9114724.096831
+288107.494880 9114715.061199
+288133.095824 9114681.938646
+288146.805485 9114653.826146
+288159.609620 9114637.767139
+288176.360284 9114617.694170
+288187.183757 9114602.637594
+288196.078208 9114595.615273
+288197.042716 9114591.598145
+288204.832524 9114569.506583
+288121.262096 9114559.372407
+Region 1
+326
+289398.575403 9114428.114641
+289387.263988 9114376.871807
+289323.729523 9114387.855760
+289279.169759 9114410.913732
+289246.493552 9114427.956829
+289224.640357 9114429.943176
+289197.883729 9114440.965204
+289191.927125 9114441.963540
+289164.265229 9114465.039004
+289148.449966 9114477.076932
+289127.783013 9114505.182331
+289109.044880 9114525.253471
+289084.364898 9114548.332014
+289070.508012 9114556.353835
+289040.732277 9114562.349983
+289027.832413 9114565.350125
+289019.880384 9114565.341826
+289014.910366 9114565.336639
+288983.146601 9114571.330677
+288858.448924 9114645.535811
+288841.676446 9114662.595336
+288825.868404 9114675.637730
+288810.045573 9114686.671036
+288798.213544 9114699.717589
+288777.442823 9114713.759306
+288752.666501 9114723.778678
+288733.905934 9114740.836094
+288726.977422 9114744.846965
+288706.250980 9114764.915917
+288699.352012 9114772.944957
+288682.527714 9114782.972647
+288661.779074 9114800.027957
+288642.988893 9114813.067178
+288614.295516 9114831.118663
+288600.475366 9114844.163096
+288573.747819 9114859.203022
+288544.119443 9114885.289779
+288529.283088 9114895.319521
+288500.641292 9114920.402763
+288467.979103 9114939.454540
+288450.160666 9114949.481123
+288437.297531 9114957.503852
+288175.096780 9114851.750156
+288171.076465 9114845.718665
+288143.288317 9114851.716405
+288123.437526 9114855.713482
+288108.586304 9114863.734015
+288095.745230 9114874.770295
+288083.971910 9114895.853090
+288056.419679 9114933.996268
+288044.705322 9114963.115431
+288040.876733 9114983.202130
+288039.139418 9115017.354592
+288031.275757 9115029.400696
+287947.910843 9115047.393705
+287944.936156 9115048.395077
+287961.150132 9115090.602971
+287975.250754 9115115.731444
+287997.259325 9115134.841085
+288011.227245 9115141.887704
+288018.214895 9115145.913284
+288011.441104 9115171.019549
+288001.648368 9115191.099914
+287987.850035 9115207.157866
+287967.115650 9115226.222057
+287952.293777 9115238.260760
+287937.479268 9115251.304007
+287893.521022 9115221.121045
+287868.559848 9115206.026365
+287850.608451 9115197.970916
+287822.856861 9115208.991258
+287804.095696 9115226.048416
+287607.883239 9115443.823960
+287582.281548 9115476.946399
+287536.998062 9115537.170355
+287499.652008 9115595.393719
+287478.983514 9115623.498717
+287470.118215 9115634.539166
+287431.719059 9115684.725051
+287388.327543 9115731.891940
+287378.490257 9115745.944962
+287371.568808 9115750.960239
+287364.632630 9115753.966417
+287359.632984 9115749.942881
+287356.555146 9115736.880532
+287354.522891 9115730.851098
+287349.501160 9115723.813911
+287341.526768 9115720.791717
+287332.617241 9115725.804853
+287328.685264 9115731.827878
+287301.014159 9115753.898056
+287281.287979 9115774.972227
+287314.297427 9115803.134894
+287350.318490 9115835.318928
+287353.315338 9115837.331229
+287398.341740 9115877.561210
+287427.367799 9115904.714946
+287443.375587 9115918.795675
+287500.308549 9115956.024642
+287477.688698 9115989.150293
+287453.117564 9116027.296556
+287429.533072 9116064.439330
+287409.836332 9116089.531769
+287389.138159 9116113.618590
+287363.506559 9116142.722827
+287339.752544 9116156.760944
+287323.958259 9116171.812132
+287304.305606 9116202.931848
+287293.584644 9116232.052060
+287290.904449 9116273.235403
+287283.195084 9116306.377016
+287267.562758 9116343.528298
+287244.957315 9116378.663013
+287223.286982 9116405.762391
+287210.445289 9116416.798569
+287235.532295 9116448.970846
+287254.684470 9116485.154905
+287266.826732 9116514.299640
+287294.005084 9116560.537687
+287349.311225 9116511.374362
+287371.857673 9116468.203206
+287392.600180 9116450.143651
+287443.068460 9116419.056830
+287516.127147 9116350.826077
+287529.911187 9116332.759057
+287546.625771 9116307.663378
+287561.352242 9116282.565576
+287576.100811 9116260.481418
+287591.931871 9116250.452896
+287594.884529 9116246.437883
+287602.755826 9116235.396332
+287614.573823 9116220.340826
+287632.385581 9116209.309866
+287641.302515 9116205.301206
+287655.174935 9116199.288744
+287665.998858 9116184.232172
+287672.809728 9116164.148626
+287678.626549 9116144.064022
+287683.500930 9116131.010194
+287693.330786 9116115.952563
+287718.056554 9116098.901707
+287731.810953 9116076.816470
+287741.589169 9116054.727003
+287750.373336 9116032.636478
+287750.247985 9116015.559172
+287743.208584 9116004.501746
+287736.161813 9115992.439770
+287731.110503 9115981.384457
+287726.994255 9115962.293820
+287725.941232 9115954.256381
+287730.756611 9115933.166175
+287732.619357 9115916.090983
+287730.572297 9115908.052485
+287723.503434 9115892.976860
+287712.502651 9115883.924282
+287706.472069 9115874.876998
+287705.448542 9115870.857747
+287705.389569 9115862.821366
+287713.282907 9115854.793459
+287719.210280 9115849.777076
+287730.048867 9115836.729606
+287739.937644 9115829.708362
+287747.845715 9115823.689547
+287755.761155 9115818.675279
+287762.682556 9115813.659951
+287771.614149 9115811.660381
+287775.560807 9115807.646424
+287778.528174 9115805.640504
+287774.456178 9115792.577155
+287773.381041 9115781.526075
+287774.271860 9115767.463470
+287776.208324 9115760.433755
+287779.146198 9115754.409646
+287786.052841 9115747.385222
+287798.894206 9115736.348958
+287806.809626 9115731.334685
+287811.735565 9115725.312691
+287818.583213 9115710.251887
+287820.527043 9115704.226719
+287830.415777 9115697.205466
+287833.383134 9115695.199544
+287839.244112 9115681.142229
+287841.210059 9115678.130703
+287843.168633 9115674.114629
+287845.090339 9115665.075820
+287850.973431 9115654.032147
+287859.831248 9115641.987098
+287869.705215 9115632.956746
+287868.622695 9115620.901125
+287865.471000 9115597.793373
+287864.395858 9115586.742299
+287866.310186 9115576.698944
+287868.224513 9115566.655589
+287877.097061 9115556.619635
+287891.963287 9115550.608210
+287901.837231 9115541.577857
+287917.682729 9115533.558389
+287930.531380 9115523.526655
+287940.420059 9115516.505390
+287952.282045 9115507.477142
+287961.154561 9115497.441179
+287968.039015 9115487.403104
+287973.973689 9115483.391251
+287985.813532 9115471.349359
+287990.732047 9115464.322811
+288000.628079 9115458.306084
+288008.536051 9115452.287246
+288016.421892 9115443.254769
+288018.343563 9115434.215962
+288020.250482 9115423.168063
+288022.164776 9115413.124711
+288024.056941 9115400.067719
+288030.963498 9115393.043279
+288038.871456 9115387.024440
+288046.779411 9115381.005599
+288051.727414 9115377.997233
+288062.610069 9115370.977007
+288071.489913 9115361.945580
+288078.389079 9115353.916590
+288090.265749 9115346.897414
+288098.166312 9115339.874022
+288110.050352 9115333.859388
+288118.989201 9115332.864321
+288126.926647 9115330.863654
+288152.668000 9115316.827386
+288166.495800 9115304.787572
+288175.309200 9115286.715223
+288165.214012 9115265.609245
+288157.092126 9115242.496277
+288170.794476 9115213.379193
+288226.230956 9115182.297204
+288233.159587 9115178.286383
+288245.036184 9115171.267183
+288257.928937 9115167.262666
+288271.815707 9115163.259197
+288291.607552 9115151.225667
+288302.512252 9115147.219040
+288317.363506 9115139.198430
+288330.219332 9115130.171174
+288342.103278 9115124.156499
+288351.005163 9115118.138674
+288362.881720 9115111.119451
+288378.741731 9115105.108965
+288390.633044 9115100.098825
+288408.481082 9115094.090426
+288428.295001 9115085.070485
+288441.136018 9115074.034117
+288453.019929 9115068.019420
+288465.868319 9115057.987592
+288483.716325 9115051.979170
+288502.558341 9115045.971788
+288514.427465 9115037.947992
+288526.303968 9115030.928736
+288535.213190 9115025.915429
+288544.107638 9115018.893034
+288554.938416 9115004.840923
+288563.840243 9114998.823068
+288571.748052 9114992.804168
+288581.658661 9114988.796443
+288596.561502 9114987.807569
+288608.467523 9114984.806471
+288625.277134 9114972.769701
+288635.180344 9114967.757424
+288654.022293 9114961.749992
+288664.926898 9114957.743296
+288676.825515 9114953.737640
+288684.740686 9114948.723268
+288692.655855 9114943.708895
+288701.542870 9114935.681935
+288705.481981 9114930.663391
+288712.395743 9114924.643431
+288718.322878 9114919.626971
+288727.224661 9114913.609093
+288735.147207 9114909.599258
+288745.042998 9114903.582420
+288760.843745 9114889.535489
+288764.716340 9114875.476060
+288769.582945 9114861.417672
+288770.495672 9114850.368747
+288775.362274 9114836.310359
+288775.317937 9114830.283105
+288779.242253 9114823.255473
+288787.179558 9114821.254718
+288799.100294 9114820.262668
+288812.037209 9114822.285282
+288823.965333 9114822.297768
+288832.926206 9114824.316214
+288839.876888 9114823.318952
+288848.815588 9114822.323769
+288855.692357 9114811.281085
+288860.573712 9114799.231780
+288868.474049 9114792.208303
+288880.335638 9114783.179899
+288887.241960 9114776.155380
+288898.116923 9114768.130476
+288908.020050 9114763.118156
+288919.940760 9114762.126078
+288929.829097 9114755.104671
+288939.732216 9114750.092346
+288950.636734 9114746.085598
+288956.593388 9114745.087284
+288964.508486 9114740.072879
+288969.441558 9114735.055360
+289008.096941 9114720.027691
+289023.934505 9114711.003408
+289043.533645 9114672.851575
+289047.457906 9114665.823933
+289095.897940 9114629.711215
+289141.437239 9114604.645305
+289178.104422 9114589.615462
+289188.942295 9114576.567808
+289190.878521 9114569.538093
+289174.811746 9114547.421664
+289183.713386 9114541.403728
+289189.625621 9114534.378148
+289200.404303 9114513.294173
+289212.332321 9114513.306576
+289258.019392 9114508.331391
+289277.943806 9114514.379274
+289304.870629 9114526.461606
+289323.793652 9114531.503896
+289357.537888 9114524.507157
+289395.250710 9114516.509975
+289412.185728 9114521.550167
+289446.968344 9114520.581629
+289398.575403 9114428.114641
+Region 1
+136
+287715.683944 9112656.338954
+287715.632468 9112649.307109
+287717.443916 9112625.200080
+287719.255366 9112601.093051
+287717.215956 9112594.059054
+287715.169195 9112586.020508
+287709.102448 9112571.950360
+287704.007613 9112554.867639
+287694.922214 9112535.771509
+287684.842858 9112516.674299
+287673.843066 9112507.621501
+287662.850631 9112499.573250
+287655.863466 9112495.547505
+287642.868403 9112485.487992
+287637.913279 9112487.491699
+287620.007200 9112485.463182
+287601.107156 9112483.433579
+287586.175624 9112480.403736
+287561.289739 9112475.353987
+287546.358210 9112472.324130
+287523.430866 9112463.258317
+287509.434521 9112452.193124
+287505.436616 9112449.175146
+287495.438182 9112441.127925
+287484.423745 9112430.065966
+287478.371789 9112418.004865
+287472.349225 9112409.961966
+287468.343979 9112405.939433
+287463.359463 9112403.924918
+287453.441858 9112406.927741
+287449.495386 9112410.941612
+287446.564917 9112417.970218
+287448.604272 9112425.004240
+287453.698991 9112442.087017
+287458.771674 9112456.156140
+287461.878471 9112473.236750
+287466.936467 9112485.296769
+287464.977924 9112489.312807
+287460.044828 9112494.330149
+287446.217460 9112506.369602
+287437.359921 9112518.414467
+287432.426819 9112523.431807
+287422.582651 9112536.480139
+287414.821919 9112562.589798
+287408.975654 9112578.656114
+287400.147479 9112594.719181
+287388.300659 9112605.756242
+287376.453833 9112616.793302
+287369.525429 9112620.803920
+287350.713459 9112630.828838
+287344.779021 9112634.840538
+287337.835920 9112636.842051
+287330.907509 9112640.852665
+287328.970984 9112647.882355
+287324.103963 9112661.940652
+287320.223565 9112674.995481
+287318.353145 9112691.066134
+287314.538851 9112713.161926
+287311.689149 9112731.240597
+287309.782001 9112742.288493
+287307.838127 9112748.313633
+287306.924952 9112759.362613
+287306.070540 9112778.448005
+287305.157366 9112789.496986
+287306.239485 9112801.552687
+287306.305595 9112810.593649
+287307.328952 9112814.612939
+287144.552045 9112846.580529
+287123.634501 9112840.530373
+287105.662182 9112829.460710
+287092.681770 9112821.410138
+287085.694578 9112817.384306
+287083.978236 9112854.550573
+287085.199783 9112885.692790
+287085.375971 9112909.802051
+287088.534096 9112933.914576
+287092.583424 9112943.964454
+287101.632014 9112958.037979
+287111.615852 9112964.076171
+287131.539478 9112970.125232
+287128.682366 9112987.199358
+287148.606004 9112993.248409
+287163.537719 9112996.278362
+287187.444623 9113003.336289
+287208.362249 9113009.386395
+287237.202331 9113011.426961
+287264.017724 9113008.442582
+287286.857196 9113005.453854
+287305.720748 9113002.460783
+287327.536842 9112995.452749
+287345.406405 9112992.458580
+287368.289942 9112995.497120
+287389.222265 9113003.556239
+287409.167964 9113012.618817
+287426.197880 9113030.719098
+287435.253931 9113045.797079
+287435.371528 9113061.869887
+287430.511880 9113076.932746
+287418.687021 9113090.983493
+287406.847456 9113103.025137
+287399.977788 9113115.072183
+287391.120154 9113127.117067
+287383.315291 9113147.199437
+287378.514415 9113170.298702
+287371.703525 9113190.382153
+287408.605813 9113207.499484
+287412.596443 9113209.512905
+287416.587073 9113211.526324
+287421.512882 9113205.504419
+287434.346444 9113193.463845
+287456.081727 9113175.405678
+287475.829031 9113157.345347
+287479.782900 9113154.336010
+287502.504774 9113135.274357
+287532.118315 9113107.179291
+287563.712424 9113078.081818
+287598.288425 9113048.987562
+287609.133938 9113036.944807
+287595.063835 9113015.834193
+287599.974895 9113007.803179
+287611.829084 9112997.770601
+287626.650490 9112985.732151
+287646.375581 9112964.658132
+287657.169585 9112945.583526
+287660.114740 9112940.564007
+287670.901381 9112920.484851
+287684.633163 9112895.386175
+287696.428468 9112877.317192
+287707.185663 9112853.219838
+287714.018443 9112836.150028
+287718.870629 9112820.082617
+287717.707499 9112796.976913
+287716.426703 9112757.798421
+287718.098412 9112714.604958
+287718.879113 9112685.474108
+287715.683944 9112656.338954
+Region 1
+185
+289827.275749 9112310.003412
+289819.116996 9112281.868097
+289816.046370 9112269.810545
+289803.608542 9112200.485033
+289796.369815 9112162.305355
+289791.222555 9112138.191274
+289781.855438 9112080.923294
+289771.479628 9112021.645194
+289759.086397 9111958.346861
+289751.892163 9111926.194385
+289750.846458 9111919.161581
+289756.765739 9111913.140559
+289772.587457 9111902.107193
+289776.459689 9111888.047793
+289745.507026 9111868.929476
+289707.596804 9111849.803878
+289673.662368 9111830.682388
+289639.676216 9111804.529093
+289604.747896 9111785.406498
+289562.126728 9111801.434438
+289547.328470 9111816.486934
+289522.627739 9111836.551722
+289503.868467 9111853.609128
+289486.051403 9111863.635790
+289343.529339 9111945.857980
+289335.577783 9111945.849629
+289329.577189 9111940.820660
+289323.561825 9111933.782609
+289310.515004 9111916.691835
+289298.528599 9111908.642969
+289283.560367 9111900.590962
+289257.577538 9111881.477491
+289241.607993 9111872.419880
+289231.579965 9111860.354917
+289216.523167 9111840.248384
+289110.985782 9111680.416121
+288861.080570 9111757.500586
+288856.118230 9111758.499852
+288450.508456 9111882.629966
+288302.748859 9111928.680349
+288245.254368 9111949.713917
+288224.440299 9111957.727859
+288166.953073 9111979.765891
+287901.199028 9112064.865093
+287924.516007 9112127.171808
+287853.318866 9112177.321851
+287829.493302 9112181.314230
+287808.627544 9112182.296180
+287767.889977 9112184.261129
+287729.140314 9112186.228199
+287701.338885 9112190.216202
+287677.542682 9112198.226705
+287653.739119 9112205.232647
+287625.893565 9112203.193308
+287596.965868 9112189.098271
+287552.737350 9112257.359025
+287572.734138 9112273.453455
+287590.706273 9112284.522962
+287614.656881 9112297.608039
+287618.647426 9112299.621459
+287627.659226 9112308.672126
+287631.664471 9112312.694644
+287638.681003 9112320.738599
+287641.684939 9112323.755486
+287642.708301 9112327.774764
+287646.720900 9112332.801830
+287644.799130 9112341.840619
+287644.821181 9112344.854268
+287639.873421 9112347.862522
+287636.898885 9112348.863834
+287627.010712 9112355.884889
+287615.112561 9112359.890134
+287600.276616 9112369.919436
+287602.352738 9112381.976195
+287612.395269 9112396.050691
+287615.421260 9112402.081229
+287624.550692 9112427.204688
+287632.517105 9112429.222420
+287642.471448 9112431.242308
+287650.437862 9112433.260036
+287659.405593 9112436.283391
+287666.407450 9112442.318236
+287663.477017 9112449.346849
+287656.614834 9112462.398446
+287651.718523 9112472.438551
+287642.868403 9112485.487992
+287655.863466 9112495.547505
+287662.850631 9112499.573250
+287673.843066 9112507.621501
+287684.842858 9112516.674299
+287694.922214 9112535.771509
+287704.007613 9112554.867639
+287709.102448 9112571.950360
+287715.169195 9112586.020508
+287717.215956 9112594.059054
+287719.255366 9112601.093051
+287717.443916 9112625.200080
+287715.632468 9112649.307109
+287715.683944 9112656.338954
+287718.879113 9112685.474108
+287718.098412 9112714.604958
+287716.426703 9112757.798421
+287717.707499 9112796.976913
+287718.870629 9112820.082617
+287714.018443 9112836.150028
+287707.185663 9112853.219838
+287696.428468 9112877.317192
+287684.633163 9112895.386175
+287670.901381 9112920.484851
+287660.114740 9112940.564007
+287657.169585 9112945.583526
+287646.375581 9112964.658132
+287626.650490 9112985.732151
+287611.829084 9112997.770601
+287599.974895 9113007.803179
+287595.063835 9113015.834193
+287609.133938 9113036.944807
+287673.573306 9113013.910086
+287722.108974 9112990.858107
+287754.851325 9112982.857148
+287759.806490 9112980.853416
+287765.755630 9112978.850758
+287817.368768 9112968.861047
+287889.855333 9112958.893768
+287956.436882 9112956.956349
+288021.994979 9112950.999575
+288025.963511 9112949.999298
+288032.921325 9112950.006771
+288087.567764 9112947.051805
+288137.229586 9112942.082356
+288146.167975 9112941.087395
+288191.839149 9112934.104536
+288251.425902 9112927.136515
+288315.003241 9112922.181757
+288377.571833 9112915.216762
+288450.080089 9112908.262271
+288512.663343 9112903.306188
+288575.231813 9112896.340933
+288601.052891 9112893.354744
+288626.248762 9112940.594693
+288650.413842 9112982.810841
+288682.102875 9112966.771847
+288727.692704 9112948.738481
+288767.348187 9112934.716944
+288804.006973 9112918.683139
+288830.740806 9112904.647897
+288840.658347 9112901.644768
+288849.677863 9112911.699646
+288874.556591 9112915.744052
+288909.286422 9112907.744417
+288930.085925 9112897.721004
+288945.937728 9112890.705972
+288952.880734 9112888.704221
+288955.810958 9112881.675567
+288956.708953 9112868.617563
+288956.561305 9112848.526716
+288952.437796 9112828.431677
+288947.342473 9112811.349216
+288937.255185 9112791.247884
+288931.165910 9112774.164369
+288927.094095 9112761.101121
+288926.041081 9112753.063732
+289030.921362 9112687.879553
+289130.890584 9112630.726308
+289156.630160 9112616.689890
+289183.356293 9112601.649964
+289232.928691 9112584.624938
+289239.871630 9112582.623157
+289289.466137 9112568.611701
+289295.415111 9112566.608870
+289353.955190 9112552.606726
+289404.550949 9112539.600741
+289460.079491 9112521.577198
+289516.631501 9112507.572792
+289542.429991 9112501.572514
+289574.177416 9112493.569361
+289602.957748 9112487.572159
+289640.668869 9112479.575176
+289697.205927 9112463.561493
+289733.937835 9112457.572483
+289777.568214 9112443.554363
+289827.110476 9112422.510627
+289829.053985 9112416.485461
+289840.818624 9112394.397997
+289827.275749 9112310.003412
+Region 1
+240
+289161.766920 9114395.723639
+289147.717818 9114377.627413
+289117.609469 9114338.419246
+289090.520136 9114304.236863
+289060.500604 9114277.083127
+289033.470488 9114250.937020
+289011.417776 9114225.800628
+288996.360014 9114205.694205
+288967.245918 9114166.486918
+288953.145246 9114141.358803
+288933.971175 9114102.161885
+288922.808196 9114071.009624
+288911.623074 9114036.843730
+288901.535393 9114016.742462
+288895.460627 9114001.668072
+288863.061960 9113921.271296
+288855.124810 9113923.272027
+288829.354913 9113933.290293
+288829.295828 9113925.253952
+288826.217845 9113912.191764
+288826.099679 9113896.119083
+288822.005556 9113880.042220
+288814.922084 9113862.957678
+288807.786927 9113838.841333
+288796.712747 9113819.743515
+288787.597019 9113796.629614
+288771.479090 9113767.481123
+288760.382799 9113745.369659
+288756.333022 9113735.320039
+288753.277234 9113725.271466
+288746.142146 9113701.155097
+288741.031952 9113682.063538
+288731.916294 9113658.949611
+288725.775222 9113634.834282
+288716.600536 9113603.684000
+288718.566361 9113600.672468
+288729.478041 9113597.670376
+288743.371670 9113594.671427
+288761.211702 9113587.658495
+288777.056379 9113579.638918
+288780.030946 9113578.637518
+288791.870152 9113566.595574
+288805.653019 9113548.528467
+288802.656305 9113546.516239
+288796.648115 9113540.482696
+288785.655249 9113532.434828
+288775.671134 9113526.397090
+288763.684293 9113518.348166
+288753.678038 9113509.296792
+288742.670425 9113499.239823
+288736.677010 9113495.215355
+288730.654072 9113487.172714
+288728.584920 9113476.120638
+288730.499074 9113466.077304
+288734.438094 9113461.058785
+288726.427201 9113453.014043
+288695.444057 9113429.876995
+288670.476477 9113413.778030
+288661.508518 9113410.754938
+288647.607552 9113412.749307
+288622.706395 9113405.691204
+288603.783881 9113400.648490
+288591.848739 9113399.631314
+288584.876123 9113397.614855
+288596.875727 9113272.060530
+288603.457355 9113220.836154
+288605.216634 9113189.697393
+288605.128117 9113177.642864
+288604.980590 9113157.551981
+288598.817587 9113130.422965
+288593.685447 9113108.317722
+288589.606292 9113094.249885
+288589.473533 9113076.168088
+288590.445379 9113073.155510
+288594.354892 9113064.118830
+288601.194692 9113048.053504
+288613.041229 9113037.016170
+288627.884427 9113027.991084
+288641.726271 9113017.960397
+288653.565412 9113005.918513
+288650.413842 9112982.810841
+288626.248762 9112940.594693
+288601.052891 9112893.354744
+288575.231813 9112896.340933
+288512.663343 9112903.306188
+288450.080089 9112908.262271
+288377.571833 9112915.216762
+288315.003241 9112922.181757
+288251.425902 9112927.136515
+288191.839149 9112934.104536
+288146.167975 9112941.087395
+288137.229586 9112942.082356
+288087.567764 9112947.051805
+288032.921325 9112950.006771
+288025.963511 9112949.999298
+288021.994979 9112950.999575
+287956.436882 9112956.956349
+287889.855333 9112958.893768
+287817.368768 9112968.861047
+287765.755630 9112978.850758
+287759.894769 9112992.908002
+287760.071330 9113017.017173
+287763.185684 9113035.102270
+287771.233140 9113048.169986
+287779.251172 9113057.219505
+287790.236424 9113064.263141
+287800.220344 9113070.301152
+287807.251766 9113080.354140
+287813.340723 9113097.437894
+287819.444403 9113116.530743
+287821.579535 9113136.623853
+287859.313920 9113131.641798
+287869.459781 9113159.779848
+287883.066039 9113253.216722
+287882.160388 9113265.270229
+287879.222610 9113271.294310
+287873.317608 9113279.324279
+287864.445381 9113289.360136
+287860.535699 9113298.396792
+287859.630044 9113310.450300
+287860.646108 9113313.465013
+287863.679581 9113320.500058
+287870.703706 9113329.548474
+287879.737884 9113341.612670
+287884.744605 9113346.640754
+287886.747294 9113348.651987
+287891.754017 9113353.680069
+287901.863170 9113376.795353
+287908.946211 9113393.880141
+287916.051346 9113413.978571
+287921.197970 9113438.093054
+287932.315878 9113463.218484
+287942.336727 9113474.279176
+287956.355614 9113488.357773
+287963.394517 9113499.415258
+287966.479572 9113513.482121
+287965.581321 9113526.540171
+287969.748740 9113552.662667
+287976.868671 9113574.770168
+287980.955094 9113589.842639
+287979.048132 9113600.890530
+287976.154547 9113612.941902
+287988.649543 9113690.304821
+287986.705757 9113696.329975
+287988.826320 9113714.413954
+287999.937001 9113738.534793
+288009.972673 9113751.604545
+288011.018229 9113758.637438
+288012.041687 9113762.656690
+288006.202969 9113779.727608
+287992.485974 9113806.835488
+287984.732924 9113833.949750
+287984.902352 9113857.054335
+287987.052405 9113879.156500
+287991.175717 9113899.251697
+287998.258919 9113916.336440
+287997.345963 9113927.385395
+287997.015035 9114017.793566
+287993.061829 9114156.415741
+288023.993735 9114172.521402
+288050.964397 9114190.631888
+288065.948107 9114200.693259
+288083.980161 9114219.798722
+288096.003996 9114232.870540
+288097.042224 9114238.898877
+288101.121427 9114252.966763
+288107.254982 9114276.077683
+288109.434650 9114302.198004
+288101.674292 9114328.307738
+288093.891813 9114351.403833
+288083.075714 9114367.464928
+288075.315338 9114393.574663
+288070.441143 9114406.628471
+288066.568322 9114420.687886
+288068.689022 9114438.771840
+288075.750268 9114452.842901
+288082.841009 9114470.932145
+288082.892614 9114477.963970
+288082.929475 9114482.986701
+288092.987502 9114499.070024
+288099.069507 9114515.149112
+288104.128019 9114527.208955
+288113.236297 9114549.318488
+288121.262096 9114559.372407
+288204.832524 9114569.506583
+288197.042716 9114591.598145
+288196.078208 9114595.615273
+288187.183757 9114602.637594
+288176.360284 9114617.694170
+288159.609620 9114637.767139
+288146.805485 9114653.826146
+288133.095824 9114681.938646
+288107.494880 9114715.061199
+288102.591187 9114724.096831
+288106.626228 9114732.137426
+288116.617969 9114739.179812
+288118.650240 9114745.209201
+288129.724496 9114764.307191
+288133.796421 9114777.370511
+288146.880847 9114799.484242
+288160.009542 9114827.625240
+288171.076465 9114845.718665
+288175.096780 9114851.750156
+288437.297531 9114957.503852
+288450.160666 9114949.481123
+288467.979103 9114939.454540
+288500.641292 9114920.402763
+288529.283088 9114895.319521
+288544.119443 9114885.289779
+288573.747819 9114859.203022
+288600.475366 9114844.163096
+288614.295516 9114831.118663
+288642.988893 9114813.067178
+288661.779074 9114800.027957
+288682.527714 9114782.972647
+288699.352012 9114772.944957
+288706.250980 9114764.915917
+288726.977422 9114744.846965
+288733.905934 9114740.836094
+288752.666501 9114723.778678
+288777.442823 9114713.759306
+288798.213544 9114699.717589
+288810.045573 9114686.671036
+288825.868404 9114675.637730
+288841.676446 9114662.595336
+288858.448924 9114645.535811
+288983.146601 9114571.330677
+289014.910366 9114565.336639
+289019.880384 9114565.341826
+289027.832413 9114565.350125
+289040.732277 9114562.349983
+289070.508012 9114556.353835
+289084.364898 9114548.332014
+289109.044880 9114525.253471
+289127.783013 9114505.182331
+289148.449966 9114477.076932
+289164.265229 9114465.039004
+289191.927125 9114441.963540
+289177.804034 9114413.821926
+289161.766920 9114395.723639
+Region 1
+152
+289488.658305 9113568.329091
+289455.427944 9113510.031732
+289449.234772 9113478.884810
+289455.963312 9113447.751323
+289466.630769 9113411.599275
+289468.478182 9113392.515094
+289473.292728 9113371.424936
+289469.213275 9113357.357250
+289466.142594 9113345.299676
+289469.785655 9113300.099539
+289469.719090 9113291.058684
+289466.507893 9113259.914860
+289459.298631 9113225.753277
+289448.209639 9113204.646563
+289438.181183 9113192.581736
+289419.229177 9113183.521204
+289418.999952 9113152.380472
+289404.995636 9113140.311489
+289361.342259 9113151.315811
+289358.367739 9113152.317239
+289344.511288 9113160.339037
+289329.727391 9113177.400655
+289307.080413 9113206.508450
+289290.293759 9113221.558905
+289282.356761 9113223.559678
+289261.490721 9113224.542403
+289242.620016 9113226.531739
+289215.804911 9113229.517289
+289195.969783 9113235.523730
+289178.122595 9113241.532245
+289159.318372 9113252.562419
+289143.503451 9113264.600252
+289137.591325 9113271.625792
+289127.725464 9113281.660788
+289112.948828 9113299.726905
+289103.134673 9113316.793688
+289089.359382 9113335.865385
+289080.472698 9113343.892336
+289075.547142 9113349.914373
+289060.748304 9113364.966857
+289048.879677 9113372.990676
+289035.000929 9113377.998782
+289019.126834 9113382.000255
+289000.196940 9113375.953172
+288964.384199 9113371.897407
+288942.509303 9113370.869874
+288919.647811 9113370.845827
+288890.829831 9113371.820033
+288869.993206 9113376.820767
+288853.176787 9113387.852937
+288831.427377 9113403.902580
+288813.683398 9113423.974578
+288799.878414 9113439.028051
+288784.078078 9113453.074882
+288765.244118 9113460.086762
+288748.368589 9113463.082561
+288734.438094 9113461.058785
+288730.499074 9113466.077304
+288728.584920 9113476.120638
+288730.654072 9113487.172714
+288736.677010 9113495.215355
+288742.670425 9113499.239823
+288753.678038 9113509.296792
+288763.684293 9113518.348166
+288775.671134 9113526.397090
+288785.655249 9113532.434828
+288796.648115 9113540.482696
+288802.656305 9113546.516239
+288805.653019 9113548.528467
+288791.870152 9113566.595574
+288780.030946 9113578.637518
+288777.056379 9113579.638918
+288761.211702 9113587.658495
+288743.371670 9113594.671427
+288729.478041 9113597.670376
+288718.566361 9113600.672468
+288716.600536 9113603.684000
+288725.775222 9113634.834282
+288731.916294 9113658.949611
+288741.031952 9113682.063538
+288746.142146 9113701.155097
+288753.277234 9113725.271466
+288756.333022 9113735.320039
+288760.382799 9113745.369659
+288771.479090 9113767.481123
+288787.597019 9113796.629614
+288796.712747 9113819.743515
+288807.786927 9113838.841333
+288814.922084 9113862.957678
+288822.005556 9113880.042220
+288826.099679 9113896.119083
+288826.217845 9113912.191764
+288829.295828 9113925.253952
+288829.354913 9113933.290293
+288829.377070 9113936.303920
+288855.124810 9113923.272027
+288863.061960 9113921.271296
+288895.460627 9114001.668072
+288901.535393 9114016.742462
+288911.623074 9114036.843730
+288922.808196 9114071.009624
+288933.971175 9114102.161885
+288953.145246 9114141.358803
+288967.245918 9114166.486918
+288996.360014 9114205.694205
+289011.417776 9114225.800628
+289033.470488 9114250.937020
+289060.500604 9114277.083127
+289090.520136 9114304.236863
+289117.609469 9114338.419246
+289147.717818 9114377.627413
+289161.766920 9114395.723639
+289177.804034 9114413.821926
+289191.927125 9114441.963540
+289197.883729 9114440.965204
+289224.640357 9114429.943176
+289246.493552 9114427.956829
+289279.169759 9114410.913732
+289323.729523 9114387.855760
+289359.224861 9114348.715844
+289379.060402 9114342.709225
+289407.782699 9114328.675555
+289415.697666 9114323.661099
+289425.950756 9114231.254824
+289447.406537 9114040.416081
+289446.345949 9114031.374198
+289446.308950 9114026.351502
+289226.015974 9113941.741767
+289116.152348 9113870.305254
+289072.261674 9113849.164156
+289073.218709 9113844.142489
+289141.604254 9113817.091589
+289170.370723 9113809.085372
+289182.276379 9113806.084205
+289294.367531 9113775.060588
+289298.306495 9113770.042029
+289304.226032 9113764.021000
+289343.028406 9113769.084059
+289372.892318 9113775.142320
+289389.819642 9113779.178049
+289419.794528 9113800.304367
+289458.767098 9113828.471718
+289476.718025 9113836.526596
+289480.701365 9113837.535259
+289474.300902 9113778.261264
+289461.943976 9113719.985610
+289462.782593 9113698.891318
+289469.488925 9113664.744209
+289486.149856 9113632.616500
+289502.788572 9113597.475174
+289490.668458 9113571.344773
+289488.658305 9113568.329091
+Region 1
+105
+289336.286000 9113123.162748
+289331.271796 9113117.130317
+289312.149828 9113084.965299
+289289.022453 9113048.777948
+289270.901910 9113017.618478
+289260.733139 9112986.467317
+289260.422770 9112944.276608
+289266.419919 9112813.693601
+289266.390363 9112809.675438
+289268.067957 9112767.486810
+289266.830168 9112734.335924
+289265.717990 9112718.262230
+289264.672309 9112711.229403
+289232.928691 9112584.624938
+289183.356293 9112601.649964
+289156.630160 9112616.689890
+289130.890584 9112630.726308
+289030.921362 9112687.879553
+288926.041081 9112753.063732
+288927.094095 9112761.101121
+288931.165910 9112774.164369
+288937.255185 9112791.247884
+288947.342473 9112811.349216
+288952.437796 9112828.431677
+288956.561305 9112848.526716
+288956.708953 9112868.617563
+288955.810958 9112881.675567
+288952.880734 9112888.704221
+288945.937728 9112890.705972
+288930.085925 9112897.721004
+288909.286422 9112907.744417
+288874.556591 9112915.744052
+288849.677863 9112911.699646
+288840.658347 9112901.644768
+288830.740806 9112904.647897
+288804.006973 9112918.683139
+288767.348187 9112934.716944
+288727.692704 9112948.738481
+288682.102875 9112966.771847
+288650.413842 9112982.810841
+288653.565412 9113005.918513
+288641.726271 9113017.960397
+288627.884427 9113027.991084
+288613.041229 9113037.016170
+288601.194692 9113048.053504
+288594.354892 9113064.118830
+288590.445379 9113073.155510
+288589.473533 9113076.168088
+288589.606292 9113094.249885
+288593.685447 9113108.317722
+288598.817587 9113130.422965
+288604.980590 9113157.551981
+288605.128117 9113177.642864
+288605.216634 9113189.697393
+288603.457355 9113220.836154
+288596.875727 9113272.060530
+288584.876123 9113397.614855
+288591.848739 9113399.631314
+288603.783881 9113400.648490
+288622.706395 9113405.691204
+288647.607552 9113412.749307
+288661.508518 9113410.754938
+288670.476477 9113413.778030
+288695.444057 9113429.876995
+288726.427201 9113453.014043
+288734.438094 9113461.058785
+288748.368589 9113463.082561
+288765.244118 9113460.086762
+288784.078078 9113453.074882
+288799.878414 9113439.028051
+288813.683398 9113423.974578
+288831.427377 9113403.902580
+288853.176787 9113387.852937
+288869.993206 9113376.820767
+288890.829831 9113371.820033
+288919.647811 9113370.845827
+288942.509303 9113370.869874
+288964.384199 9113371.897407
+289000.196940 9113375.953172
+289019.126834 9113382.000255
+289035.000929 9113377.998782
+289048.879677 9113372.990676
+289060.748304 9113364.966857
+289075.547142 9113349.914373
+289080.472698 9113343.892336
+289089.359382 9113335.865385
+289103.134673 9113316.793688
+289112.948828 9113299.726905
+289127.725464 9113281.660788
+289137.591325 9113271.625792
+289143.503451 9113264.600252
+289159.318372 9113252.562419
+289178.122595 9113241.532245
+289195.969783 9113235.523730
+289215.804911 9113229.517289
+289242.620016 9113226.531739
+289261.490721 9113224.542403
+289282.356761 9113223.559678
+289290.293759 9113221.558905
+289307.080413 9113206.508450
+289329.727391 9113177.400655
+289344.511288 9113160.339037
+289358.367739 9113152.317239
+289361.342259 9113151.315811
+289336.286000 9113123.162748
+Region 1
+113
+290148.265132 9112707.124089
+290144.296712 9112708.124536
+290131.404902 9112712.129389
+290129.387357 9112708.109199
+290124.350905 9112699.063260
+290119.299641 9112688.008248
+290114.337265 9112689.007669
+290102.439412 9112693.013536
+290077.634926 9112699.015165
+290065.759283 9112706.034633
+290039.003894 9112717.056878
+290016.202106 9112725.069601
+289991.442009 9112737.098410
+289975.597908 9112745.118295
+289960.710739 9112748.116516
+289957.647420 9112737.063530
+289950.519425 9112713.951993
+289943.324811 9112681.799619
+289929.017058 9112628.544767
+289921.866901 9112602.419605
+289919.812369 9112593.376714
+289913.782016 9112584.329710
+289899.770417 9112571.256330
+289892.746117 9112562.208293
+289884.742667 9112555.168301
+289882.725152 9112551.148093
+289876.709616 9112544.110157
+289871.710238 9112540.086861
+289867.727018 9112539.078207
+289864.737754 9112538.070581
+289855.792161 9112538.061316
+289847.840523 9112538.053079
+289835.913065 9112538.040721
+289824.000406 9112540.037436
+289812.080346 9112541.029610
+289801.117242 9112537.000121
+289795.116517 9112531.971246
+289796.036480 9112521.926897
+289800.932262 9112511.886672
+289811.717774 9112491.807251
+289818.564461 9112476.746397
+289824.431990 9112463.693589
+289823.341845 9112450.633565
+289822.236903 9112435.564466
+289827.110476 9112422.510627
+289777.568214 9112443.554363
+289733.937835 9112457.572483
+289697.205927 9112463.561493
+289640.668869 9112479.575176
+289602.957748 9112487.572159
+289574.177416 9112493.569361
+289542.429991 9112501.572514
+289516.631501 9112507.572792
+289460.079491 9112521.577198
+289404.550949 9112539.600741
+289353.955190 9112552.606726
+289295.415111 9112566.608870
+289289.466137 9112568.611701
+289239.871630 9112582.623157
+289232.928691 9112584.624938
+289264.672309 9112711.229403
+289265.717990 9112718.262230
+289266.830168 9112734.335924
+289268.067957 9112767.486810
+289266.390363 9112809.675438
+289266.419919 9112813.693601
+289260.422770 9112944.276608
+289260.733139 9112986.467317
+289270.901910 9113017.618478
+289289.022453 9113048.777948
+289312.149828 9113084.965299
+289331.271796 9113117.130317
+289336.286000 9113123.162748
+289361.342259 9113151.315811
+289404.995636 9113140.311489
+289418.999952 9113152.380472
+289422.975834 9113152.384616
+289459.774925 9113155.436546
+289501.536469 9113157.489077
+289525.384356 9113156.509350
+289563.110830 9113150.521376
+289599.784132 9113136.496032
+289637.421777 9113118.453540
+289717.474388 9113056.255639
+289704.360419 9113030.124254
+289693.323193 9113016.049383
+289700.251357 9113012.038444
+289706.185554 9113008.026473
+289712.119749 9113004.014502
+289737.844449 9112987.968672
+289740.811544 9112985.962685
+289792.334892 9112963.916370
+289850.919563 9112955.940727
+289890.589274 9112943.927361
+289927.269663 9112930.906350
+289958.972807 9112916.875651
+289969.876774 9112912.868781
+290002.559037 9112896.830009
+289998.509133 9112886.780544
+290011.393605 9112881.771178
+290021.311001 9112878.767811
+290033.194099 9112872.752879
+290043.074458 9112864.726825
+290061.900460 9112856.709981
+290077.722351 9112845.676452
+290089.605431 9112839.661509
+290104.448163 9112830.636023
+290121.256584 9112818.598970
+290143.057017 9112809.580630
+290157.936770 9112805.577812
+290177.778904 9112800.575558
+290193.667425 9112798.582822
+290148.265132 9112707.124089
+Region 1
+106
+290678.369404 9112348.045961
+290696.045314 9112318.932717
+290654.284763 9112316.881119
+290582.720659 9112316.808117
+290538.964783 9112313.749847
+290481.308479 9112312.686367
+290437.567415 9112311.637066
+290385.852534 9112307.565965
+290349.039445 9112302.505569
+290298.333323 9112300.444454
+290247.627193 9112298.383282
+290224.788623 9112301.373374
+290195.978953 9112303.352780
+290175.113455 9112304.335823
+290146.325990 9112309.328807
+290122.515663 9112315.331435
+290107.643460 9112320.338743
+290076.860666 9112324.325100
+290054.029455 9112328.319648
+290022.223081 9112328.286797
+290011.289639 9112328.275499
+289992.419405 9112330.265053
+289986.455708 9112330.258887
+289975.514862 9112329.243043
+289968.564617 9112330.240384
+289954.701133 9112337.257749
+289931.951302 9112352.302151
+289911.167154 9112364.334990
+289893.342645 9112373.357299
+289873.530226 9112382.377543
+289852.716445 9112390.392211
+289840.818624 9112394.397997
+289829.053985 9112416.485461
+289827.110476 9112422.510627
+289822.236903 9112435.564466
+289823.341845 9112450.633565
+289824.431990 9112463.693589
+289818.564461 9112476.746397
+289811.717774 9112491.807251
+289800.932262 9112511.886672
+289796.036480 9112521.926897
+289795.116517 9112531.971246
+289801.117242 9112537.000121
+289812.080346 9112541.029610
+289824.000406 9112540.037436
+289835.913065 9112538.040721
+289847.840523 9112538.053079
+289855.792161 9112538.061316
+289864.737754 9112538.070581
+289867.727018 9112539.078207
+289871.710238 9112540.086861
+289876.709616 9112544.110157
+289882.725152 9112551.148093
+289884.742667 9112555.168301
+289892.746117 9112562.208293
+289899.770417 9112571.256330
+289913.782016 9112584.329710
+289919.812369 9112593.376714
+289921.866901 9112602.419605
+289929.017058 9112628.544767
+289943.324811 9112681.799619
+289950.519425 9112713.951993
+289957.647420 9112737.063530
+289960.710739 9112748.116516
+289975.597908 9112745.118295
+289991.442009 9112737.098410
+290016.202106 9112725.069601
+290039.003894 9112717.056878
+290065.759283 9112706.034633
+290077.634926 9112699.015165
+290102.439412 9112693.013536
+290114.337265 9112689.007669
+290119.299641 9112688.008248
+290124.350905 9112699.063260
+290129.387357 9112708.109199
+290131.404902 9112712.129389
+290144.296712 9112708.124536
+290148.265132 9112707.124089
+290193.667425 9112798.582822
+290177.778904 9112800.575558
+290157.936770 9112805.577812
+290143.057017 9112809.580630
+290121.256584 9112818.598970
+290104.448163 9112830.636023
+290089.605431 9112839.661509
+290077.722351 9112845.676452
+290061.900460 9112856.709981
+290043.074458 9112864.726825
+290033.194099 9112872.752879
+290021.311001 9112878.767811
+290011.393605 9112881.771178
+289998.509133 9112886.780544
+290002.559037 9112896.830009
+290011.475070 9112892.821082
+290047.131775 9112875.780821
+290066.936927 9112865.755925
+290292.966919 9112785.625831
+290384.151550 9112750.560738
+290448.617841 9112731.540632
+290507.098078 9112709.500759
+290527.748646 9112679.386035
+290580.546962 9112560.905780
+290618.695427 9112477.569002
+290641.244729 9112435.401890
+290666.634903 9112374.151679
+290678.369404 9112348.045961
+Region 1
+96
+289884.696746 9111469.271220
+289886.507125 9111445.164376
+289878.326441 9111414.015418
+289871.258014 9111398.940102
+289860.236057 9111386.874256
+289849.191925 9111371.794792
+289836.152549 9111355.708712
+289822.119255 9111339.621590
+289784.069065 9111301.409721
+289764.064850 9111284.311807
+289754.059052 9111275.260576
+289733.068322 9111259.166144
+289707.078411 9111239.048345
+289687.096418 9111224.964002
+289661.106544 9111204.846166
+289647.132466 9111196.795279
+289628.203537 9111190.748258
+289610.275925 9111185.706809
+289593.349628 9111181.670934
+289569.443689 9111174.614133
+289544.477356 9111158.515415
+289522.551898 9111150.456131
+289501.590833 9111138.379719
+289450.686484 9111109.194742
+289431.720685 9111098.124920
+289416.642004 9111075.004786
+289366.805506 9111055.866142
+289328.057199 9111057.834338
+289268.480724 9111065.807704
+289197.993158 9111076.783056
+289121.571475 9111091.770156
+289054.080310 9111104.757546
+288999.473281 9111112.735855
+288935.942977 9111123.718220
+288925.031879 9111126.720220
+288999.150366 9111204.148209
+289001.234089 9111217.209377
+288969.031656 9111298.542535
+288945.597574 9111355.776159
+288940.701643 9111365.816312
+288938.765390 9111372.846003
+288931.874214 9111381.879501
+288925.954849 9111387.900425
+288919.026802 9111391.911206
+288907.151199 9111398.930336
+288765.423839 9111454.028989
+288791.634739 9111504.283715
+288729.628366 9111587.594172
+288731.630986 9111589.605379
+288740.650149 9111599.660352
+288749.639833 9111605.697146
+288759.652944 9111615.753172
+288770.682113 9111628.823885
+288781.681803 9111637.876417
+288790.693615 9111646.926831
+288801.693312 9111655.979357
+288806.707251 9111662.011906
+288809.718564 9111666.033252
+288815.763309 9111677.089575
+288826.814629 9111693.173897
+288832.888876 9111708.248390
+288837.954438 9111721.312738
+288843.005258 9111732.367997
+288848.078201 9111746.436885
+288856.118230 9111758.499852
+288861.080570 9111757.500586
+289110.985782 9111680.416121
+289216.523167 9111840.248384
+289231.579965 9111860.354917
+289241.607993 9111872.419880
+289257.577538 9111881.477491
+289283.560367 9111900.590962
+289298.528599 9111908.642969
+289310.515004 9111916.691835
+289323.561825 9111933.782609
+289329.577189 9111940.820660
+289335.577783 9111945.849629
+289343.529339 9111945.857980
+289486.051403 9111863.635790
+289503.868467 9111853.609128
+289522.627739 9111836.551722
+289547.328470 9111816.486934
+289562.126728 9111801.434438
+289604.747896 9111785.406498
+289661.346772 9111642.822165
+289704.012099 9111632.821408
+289740.765536 9111629.846166
+289761.342449 9111589.686388
+289779.983218 9111556.556305
+289784.901132 9111549.529717
+289798.742262 9111539.498837
+289812.568598 9111527.458877
+289830.392838 9111518.436671
+289861.093819 9111503.400685
+289874.949705 9111495.378865
+289884.696746 9111469.271220
+Region 1
+102
+288925.031879 9111126.720220
+288908.996333 9111108.621518
+288905.985062 9111104.600171
+288880.945214 9111078.455584
+288840.098364 9111065.353096
+288804.250642 9111056.274044
+288791.314845 9111054.251169
+288764.456690 9111051.208892
+288720.731229 9111052.166721
+288681.968031 9111052.125279
+288631.270318 9111051.066491
+288595.452067 9111046.005441
+288533.828485 9111045.939371
+288516.909606 9111042.907603
+288490.088246 9111044.887885
+288482.158898 9111047.892983
+288470.253832 9111050.893810
+288457.384278 9111057.911750
+288440.583165 9111070.952690
+288412.973936 9111101.059155
+288389.318316 9111128.156250
+288374.556539 9111148.231138
+288371.589463 9111150.237023
+288355.811661 9111167.297200
+288341.020420 9111183.353898
+288332.310518 9111215.489758
+288338.531704 9111250.655304
+288332.722648 9111271.744363
+288321.855598 9111280.773516
+288314.964286 9111289.806946
+288305.113241 9111301.850806
+288288.378228 9111323.932641
+288282.502916 9111335.980780
+288278.586040 9111344.012873
+288261.851001 9111366.094704
+288232.305124 9111403.230814
+288212.617658 9111429.327612
+288185.000725 9111458.429474
+288169.185972 9111470.466889
+288145.390260 9111478.477531
+288112.678492 9111490.496694
+288093.837748 9111496.503584
+288083.927757 9111500.511037
+288058.166186 9111511.533136
+288045.369973 9111528.596483
+288032.588460 9111547.668924
+288012.922878 9111576.779320
+288002.107166 9111592.840264
+287990.297502 9111608.900132
+287977.523302 9111628.977116
+287965.728329 9111647.046078
+287960.810078 9111654.072538
+287952.961463 9111668.127608
+287942.160419 9111686.197644
+287936.277627 9111697.241221
+288039.139554 9111763.652102
+288067.095138 9111780.759462
+288085.089191 9111794.842435
+288099.166323 9111816.957491
+288108.236939 9111834.044444
+288117.336995 9111855.149583
+288129.485136 9111885.298857
+288143.635916 9111917.459358
+288155.725224 9111939.572239
+288161.791962 9111953.642318
+288166.901553 9111972.734062
+288166.953073 9111979.765891
+288224.440299 9111957.727859
+288245.254368 9111949.713917
+288302.748859 9111928.680349
+288450.508456 9111882.629966
+288856.118230 9111758.499852
+288848.078201 9111746.436885
+288843.005258 9111732.367997
+288837.954438 9111721.312738
+288832.888876 9111708.248390
+288826.814629 9111693.173897
+288815.763309 9111677.089575
+288809.718564 9111666.033252
+288806.707251 9111662.011906
+288801.693312 9111655.979357
+288790.693615 9111646.926831
+288781.681803 9111637.876417
+288770.682113 9111628.823885
+288759.652944 9111615.753172
+288749.639833 9111605.697146
+288740.650149 9111599.660352
+288731.630986 9111589.605379
+288729.628366 9111587.594172
+288791.634739 9111504.283715
+288765.423839 9111454.028989
+288907.151199 9111398.930336
+288919.026802 9111391.911206
+288925.954849 9111387.900425
+288931.874214 9111381.879501
+288938.765390 9111372.846003
+288940.701643 9111365.816312
+288945.597574 9111355.776159
+288969.031656 9111298.542535
+289001.234089 9111217.209377
+288999.150366 9111204.148209
+288925.031879 9111126.720220
+Region 1
+69
+289462.773181 9110995.695259
+289443.755757 9110977.593647
+289419.717062 9110952.455001
+289396.694460 9110930.331007
+289369.651911 9110902.175554
+289336.653251 9110875.018322
+289305.620333 9110844.849532
+289276.575296 9110814.682813
+289239.490419 9110772.453147
+289197.391768 9110724.190914
+289155.315333 9110678.942247
+289119.268846 9110642.740737
+289108.239907 9110629.670071
+289084.179471 9110601.517527
+289032.119887 9110550.230862
+288975.135067 9110504.966071
+288934.141398 9110471.772677
+288893.184624 9110443.601949
+288854.252554 9110420.456018
+288811.403790 9110405.342144
+288778.553095 9110398.275224
+288741.741478 9110393.213106
+288702.029114 9110399.197752
+288629.620621 9110419.210783
+288594.921935 9110431.227953
+288589.967081 9110433.231703
+288553.287896 9110446.251256
+288516.638120 9110463.288968
+288480.996944 9110482.336819
+288425.550959 9110511.408686
+288357.286932 9110554.530211
+288340.493290 9110568.575626
+288330.612940 9110576.601269
+288324.671489 9110579.608470
+288341.796160 9110610.767664
+288349.857868 9110625.844447
+288378.070214 9110678.110892
+288404.419881 9110747.452450
+288423.642923 9110793.681918
+288436.769995 9110821.823120
+288458.857131 9110851.983027
+288480.900136 9110876.115642
+288500.012915 9110907.276856
+288516.129221 9110936.425763
+288538.253289 9110971.608333
+288559.354014 9111002.771635
+288581.426609 9111030.922350
+288595.452067 9111046.005441
+288631.270318 9111051.066491
+288681.968031 9111052.125279
+288720.731229 9111052.166721
+288764.456690 9111051.208892
+288791.314845 9111054.251169
+288804.250642 9111056.274044
+288840.098364 9111065.353096
+288880.945214 9111078.455584
+288905.985062 9111104.600171
+288908.996333 9111108.621518
+288925.031879 9111126.720220
+288935.942977 9111123.718220
+288999.473281 9111112.735855
+289054.080310 9111104.757546
+289121.571475 9111091.770156
+289197.993158 9111076.783056
+289268.480724 9111065.807704
+289328.057199 9111057.834338
+289366.805506 9111055.866142
+289416.642004 9111075.004786
+289462.773181 9110995.695259
+Region 1
+115
+288559.354014 9111002.771635
+288538.253289 9110971.608333
+288516.129221 9110936.425763
+288500.012915 9110907.276856
+288480.900136 9110876.115642
+288458.857131 9110851.983027
+288436.769995 9110821.823120
+288423.642923 9110793.681918
+288404.419881 9110747.452450
+288378.070214 9110678.110892
+288349.857868 9110625.844447
+288341.796160 9110610.767664
+288324.671489 9110579.608470
+288301.906949 9110592.642888
+288247.528140 9110631.761141
+288202.043057 9110663.857198
+288178.335978 9110683.922330
+288144.711700 9110706.990331
+288121.961735 9110722.033781
+288087.350821 9110746.105225
+288049.669885 9110758.118835
+288029.879582 9110770.151842
+288016.038122 9110780.182221
+287985.329308 9110794.212439
+287941.670030 9110804.210399
+287903.024444 9110820.241023
+287863.399590 9110838.279637
+287831.652664 9110846.281392
+287808.873115 9110857.306526
+287747.535965 9110896.416767
+287740.637211 9110904.445575
+287706.180128 9110949.612357
+287668.777901 9110999.798623
+287656.334090 9111065.080278
+287629.598084 9111214.727884
+287628.736333 9111232.808705
+287627.216036 9111432.710964
+287616.693980 9111488.953854
+287611.907886 9111514.062190
+287568.142512 9111645.609499
+287497.415461 9111760.050160
+287373.117412 9111888.495813
+287359.319527 9111904.553411
+287380.633094 9111964.849330
+287427.917027 9111906.637511
+287461.439730 9111869.506043
+287496.891528 9111824.340326
+287526.504417 9111796.245451
+287564.076214 9111769.163787
+287705.781116 9111982.280921
+287765.572713 9112003.441196
+287789.486422 9112011.503460
+287797.445406 9112012.516630
+287869.820202 9111987.481512
+287887.011560 9112027.681744
+287894.108967 9112046.775694
+287901.199028 9112064.865093
+288166.953073 9111979.765891
+288166.901553 9111972.734062
+288161.791962 9111953.642318
+288155.725224 9111939.572239
+288143.635916 9111917.459358
+288129.485136 9111885.298857
+288117.336995 9111855.149583
+288108.236939 9111834.044444
+288099.166323 9111816.957491
+288085.089191 9111794.842435
+288067.095138 9111780.759462
+288039.139554 9111763.652102
+287936.277627 9111697.241221
+287942.160419 9111686.197644
+287952.961463 9111668.127608
+287960.810078 9111654.072538
+287965.728329 9111647.046078
+287977.523302 9111628.977116
+287990.297502 9111608.900132
+288002.107166 9111592.840264
+288012.922878 9111576.779320
+288032.588460 9111547.668924
+288045.369973 9111528.596483
+288058.166186 9111511.533136
+288083.927757 9111500.511037
+288093.837748 9111496.503584
+288112.678492 9111490.496694
+288145.390260 9111478.477531
+288169.185972 9111470.466889
+288185.000725 9111458.429474
+288212.617658 9111429.327612
+288232.305124 9111403.230814
+288261.851001 9111366.094704
+288278.586040 9111344.012873
+288282.502916 9111335.980780
+288288.378228 9111323.932641
+288305.113241 9111301.850806
+288314.964286 9111289.806946
+288321.855598 9111280.773516
+288332.722648 9111271.744363
+288338.531704 9111250.655304
+288332.310518 9111215.489758
+288341.020420 9111183.353898
+288355.811661 9111167.297200
+288371.589463 9111150.237023
+288374.556539 9111148.231138
+288389.318316 9111128.156250
+288412.973936 9111101.059155
+288440.583165 9111070.952690
+288457.384278 9111057.911750
+288470.253832 9111050.893810
+288482.158898 9111047.892983
+288490.088246 9111044.887885
+288516.909606 9111042.907603
+288533.828485 9111045.939371
+288595.452067 9111046.005441
+288581.426609 9111030.922350
+288559.354014 9111002.771635
+Region 1
+151
+287894.108967 9112046.775694
+287887.011560 9112027.681744
+287869.820202 9111987.481512
+287797.445406 9112012.516630
+287789.486422 9112011.503460
+287765.572713 9112003.441196
+287705.781116 9111982.280921
+287564.076214 9111769.163787
+287526.504417 9111796.245451
+287496.891528 9111824.340326
+287461.439730 9111869.506043
+287427.917027 9111906.637511
+287380.633094 9111964.849330
+287359.319527 9111904.553411
+287334.683568 9111933.658209
+287279.491863 9111997.888565
+287191.969079 9112126.374262
+287188.037275 9112132.397215
+287151.730416 9112196.648221
+287144.860748 9112208.695216
+287118.654864 9112295.057284
+287070.390883 9112355.276975
+286993.382435 9112426.515040
+286947.098760 9112485.732300
+286926.621526 9112539.955221
+286927.061673 9112600.228434
+286932.625773 9112681.602733
+286873.390809 9112736.787571
+286813.825649 9112746.767432
+286811.896372 9112754.801675
+286813.022367 9112772.884743
+286813.139718 9112788.957608
+286815.186348 9112796.996231
+286820.266252 9112812.070015
+286823.328866 9112823.123394
+286837.537959 9112863.320873
+286838.561278 9112867.340182
+286846.527773 9112869.358042
+286872.305171 9112860.345493
+286895.107961 9112852.334206
+286916.946112 9112848.340031
+286968.537517 9112835.337619
+286989.366991 9112829.333215
+287004.232601 9112823.322259
+287023.037413 9112812.292896
+287056.693125 9112793.243453
+287062.701017 9112799.277307
+287070.696860 9112805.313338
+287079.694022 9112812.355009
+287085.694578 9112817.384306
+287092.681770 9112821.410138
+287105.662182 9112829.460710
+287123.634501 9112840.530373
+287144.552045 9112846.580529
+287307.328952 9112814.612939
+287306.305595 9112810.593649
+287306.239485 9112801.552687
+287305.157366 9112789.496986
+287306.070540 9112778.448005
+287306.924952 9112759.362613
+287307.838127 9112748.313633
+287309.782001 9112742.288493
+287311.689149 9112731.240597
+287314.538851 9112713.161926
+287318.353145 9112691.066134
+287320.223565 9112674.995481
+287324.103963 9112661.940652
+287328.970984 9112647.882355
+287330.907509 9112640.852665
+287337.835920 9112636.842051
+287344.779021 9112634.840538
+287350.713459 9112630.828838
+287369.525429 9112620.803920
+287376.453833 9112616.793302
+287388.300659 9112605.756242
+287400.147479 9112594.719181
+287408.975654 9112578.656114
+287414.821919 9112562.589798
+287422.582651 9112536.480139
+287432.426819 9112523.431807
+287437.359921 9112518.414467
+287446.217460 9112506.369602
+287460.044828 9112494.330149
+287464.977924 9112489.312807
+287466.936467 9112485.296769
+287461.878471 9112473.236750
+287458.771674 9112456.156140
+287453.698991 9112442.087017
+287448.604272 9112425.004240
+287446.564917 9112417.970218
+287449.495386 9112410.941612
+287453.441858 9112406.927741
+287463.359463 9112403.924918
+287468.343979 9112405.939433
+287472.349225 9112409.961966
+287478.371789 9112418.004865
+287484.423745 9112430.065966
+287495.438182 9112441.127925
+287505.436616 9112449.175146
+287509.434521 9112452.193124
+287523.430866 9112463.258317
+287546.358210 9112472.324130
+287561.289739 9112475.353987
+287586.175624 9112480.403736
+287601.107156 9112483.433579
+287620.007200 9112485.463182
+287637.913279 9112487.491699
+287642.868403 9112485.487992
+287651.718523 9112472.438551
+287656.614834 9112462.398446
+287663.477017 9112449.346849
+287666.407450 9112442.318236
+287659.405593 9112436.283391
+287650.437862 9112433.260036
+287642.471448 9112431.242308
+287632.517105 9112429.222420
+287624.550692 9112427.204688
+287615.421260 9112402.081229
+287612.395269 9112396.050691
+287602.352738 9112381.976195
+287600.276616 9112369.919436
+287615.112561 9112359.890134
+287627.010712 9112355.884889
+287636.898885 9112348.863834
+287639.873421 9112347.862522
+287644.821181 9112344.854268
+287644.799130 9112341.840619
+287646.720900 9112332.801830
+287642.708301 9112327.774764
+287641.684939 9112323.755486
+287638.681003 9112320.738599
+287631.664471 9112312.694644
+287627.659226 9112308.672126
+287618.647426 9112299.621459
+287614.656881 9112297.608039
+287590.706273 9112284.522962
+287572.734138 9112273.453455
+287552.737350 9112257.359025
+287596.965868 9112189.098271
+287625.893565 9112203.193308
+287653.739119 9112205.232647
+287677.542682 9112198.226705
+287701.338885 9112190.216202
+287729.140314 9112186.228199
+287767.889977 9112184.261129
+287808.627544 9112182.296180
+287829.493302 9112181.314230
+287853.318866 9112177.321851
+287924.516007 9112127.171808
+287901.199028 9112064.865093
+287894.108967 9112046.775694
+Region 1
+115
+290127.731185 9110189.753109
+290074.950899 9110175.634661
+290077.747800 9110150.524331
+290080.448606 9110112.355012
+290080.396862 9110105.323249
+290086.895867 9110043.049176
+290031.148850 9110030.936596
+289829.187895 9110003.602752
+289709.801833 9109987.404774
+289560.561892 9109966.152288
+289555.592393 9109966.147041
+289398.386523 9109942.876506
+289203.382984 9109915.547047
+289064.096870 9109896.312468
+289008.394216 9109890.225778
+288983.524592 9109887.185593
+288957.668432 9109885.148874
+288939.697193 9109874.079753
+288930.693164 9109866.033829
+288923.713764 9109863.012751
+288904.800190 9109858.974357
+288885.916074 9109858.954130
+288845.173495 9109859.915002
+288784.560239 9109861.859047
+288712.027496 9109864.794736
+288654.388532 9109865.737268
+288620.603210 9109866.705428
+288640.893346 9109922.981383
+288647.946339 9109936.047962
+288651.995547 9109946.097694
+288663.090401 9109968.209455
+288684.315685 9110016.450071
+288694.578611 9110060.660741
+288696.610589 9110066.690147
+288704.738509 9110090.807771
+288713.911879 9110121.958273
+288718.115725 9110153.103436
+288716.385576 9110188.260375
+288717.629799 9110222.415970
+288720.795588 9110247.532793
+288726.957843 9110274.661902
+288734.143472 9110305.810253
+288734.268646 9110322.887515
+288735.402460 9110341.974931
+288740.681291 9110384.171138
+288741.741478 9110393.213106
+288778.553095 9110398.275224
+288811.403790 9110405.342144
+288854.252554 9110420.456018
+288893.184624 9110443.601949
+288934.141398 9110471.772677
+288975.135067 9110504.966071
+289032.119887 9110550.230862
+289084.179471 9110601.517527
+289108.239907 9110629.670071
+289119.268846 9110642.740737
+289155.315333 9110678.942247
+289197.391768 9110724.190914
+289239.490419 9110772.453147
+289276.575296 9110814.682813
+289305.620333 9110844.849532
+289336.653251 9110875.018322
+289369.651911 9110902.175554
+289396.694460 9110930.331007
+289419.717062 9110952.455001
+289443.755757 9110977.593647
+289462.773181 9110995.695259
+289469.774941 9111001.729824
+289491.781540 9111020.839097
+289526.738702 9111043.980096
+289560.672430 9111063.101856
+289565.671593 9111067.125234
+289585.660865 9111082.214197
+289611.576761 9111092.286704
+289645.451448 9111103.372067
+289690.214981 9111108.441612
+289738.917260 9111108.492573
+289774.654174 9111102.502747
+289808.395834 9111095.506281
+289835.106098 9111078.457146
+289853.887138 9111064.413317
+289885.530008 9111042.346655
+289909.214082 9111019.267150
+289926.934610 9110996.181424
+289950.566883 9110966.070142
+289967.278664 9110940.974298
+289983.018692 9110918.891030
+289992.743439 9110889.769786
+290003.499066 9110865.672265
+290006.436451 9110859.648144
+290024.112509 9110830.535178
+290036.752415 9110792.376201
+290038.621930 9110776.305669
+290041.492754 9110761.240710
+290042.213068 9110724.073856
+290040.047775 9110699.962885
+290035.887268 9110674.845305
+290034.664142 9110643.703604
+290030.422321 9110607.536107
+290032.188337 9110577.402048
+290031.157460 9110572.378324
+290023.021346 9110547.256594
+290032.783009 9110523.158050
+290040.408983 9110478.966680
+290057.105805 9110451.861776
+290079.736478 9110420.744934
+290084.646863 9110412.713811
+290098.398891 9110390.628483
+290113.144813 9110368.544189
+290126.867240 9110342.440709
+290141.576164 9110315.333725
+290163.101899 9110269.147777
+290177.655495 9110220.945514
+290183.485801 9110202.870054
+290127.731185 9110189.753109
+Region 1
+145
+288741.741478 9110393.213106
+288740.681291 9110384.171138
+288735.402460 9110341.974931
+288734.268646 9110322.887515
+288734.143472 9110305.810253
+288726.957843 9110274.661902
+288720.795588 9110247.532793
+288717.629799 9110222.415970
+288716.385576 9110188.260375
+288718.115725 9110153.103436
+288713.911879 9110121.958273
+288704.738509 9110090.807771
+288696.610589 9110066.690147
+288694.578611 9110060.660741
+288684.315685 9110016.450071
+288663.090401 9109968.209455
+288651.995547 9109946.097694
+288647.946339 9109936.047962
+288640.893346 9109922.981383
+288620.603210 9109866.705428
+288612.453328 9109839.574129
+288589.152157 9109779.276744
+288568.847476 9109720.991640
+288546.569778 9109664.713458
+288518.159616 9109585.324242
+288507.955907 9109549.149828
+288487.776501 9109507.941923
+288397.120396 9109343.099337
+288388.057768 9109327.016879
+288362.872407 9109280.780734
+288290.320390 9109145.089026
+288210.708864 9108995.325826
+288168.067246 9109008.338319
+288111.525869 9109023.344670
+288070.864608 9109035.354707
+288016.332933 9109053.376777
+288008.403850 9109056.381719
+287931.042024 9109078.396862
+287905.615137 9108999.010167
+287877.214051 9108920.624707
+287847.863220 9108848.265413
+287840.751997 9108827.162205
+287827.516126 9108783.952323
+287802.951583 9108686.484660
+287786.506870 9108612.130386
+287771.224750 9108560.881858
+287754.860826 9108497.577607
+287709.223116 9108508.577196
+287692.341860 9108510.567634
+287673.458186 9108510.546767
+287640.638237 9108507.496849
+287618.750942 9108504.459005
+287589.862538 9108495.386137
+287522.095696 9108470.197451
+287429.394092 9108432.926412
+287343.671705 9108398.676551
+287269.905212 9108368.458009
+287025.732410 9108275.766790
+287047.671723 9108422.455196
+287048.687547 9108425.469974
+287080.924464 9108621.392614
+287154.458645 9108756.083916
+287149.540450 9108763.110252
+287090.573231 9108854.458143
+287055.107911 9108897.614033
+286986.157543 9108982.923442
+286982.218560 9108987.941772
+286948.623769 9109015.026965
+286950.713981 9109029.092961
+286896.474147 9109087.295995
+286892.564407 9109096.332543
+286878.759607 9109111.385295
+286870.779187 9109107.358169
+286840.881878 9109096.274654
+286808.185731 9109110.301669
+286734.951873 9109153.415057
+286800.447451 9109276.043354
+286803.480349 9109283.078586
+286734.711156 9109256.883231
+286591.187624 9109201.471766
+286545.607223 9109357.125527
+286466.935476 9109335.941352
+286442.621321 9109409.246039
+286413.746959 9109402.181617
+286393.203749 9109447.363167
+286326.699756 9109459.342654
+286307.822851 9109460.325867
+286225.268907 9109725.433804
+286148.539081 9109971.461915
+286151.579265 9109979.501760
+286164.595155 9109992.575642
+286189.516158 9110002.649323
+286194.500360 9110004.664057
+286197.467505 9110002.658310
+286274.028429 9110006.762967
+286611.097992 9110025.223921
+286866.636873 9110039.573267
+286953.122153 9110041.678715
+286989.904334 9110042.724190
+287039.761206 9110064.879632
+287082.704659 9110093.054607
+287115.899481 9110147.336902
+287147.099230 9110200.612396
+287168.345220 9110251.867739
+287170.377026 9110257.897260
+287296.091520 9110187.718156
+287301.053772 9110186.719093
+287404.813162 9110376.692401
+287477.336408 9110508.367416
+287494.460533 9110539.527078
+287513.579870 9110571.693461
+287585.051200 9110695.330644
+287656.442215 9110807.917560
+287727.613304 9110890.367774
+287740.637211 9110904.445575
+287747.535965 9110896.416767
+287808.873115 9110857.306526
+287831.652664 9110846.281392
+287863.399590 9110838.279637
+287903.024444 9110820.241023
+287941.670030 9110804.210399
+287985.329308 9110794.212439
+288016.038122 9110780.182221
+288029.879582 9110770.151842
+288049.669885 9110758.118835
+288087.350821 9110746.105225
+288121.961735 9110722.033781
+288144.711700 9110706.990331
+288178.335978 9110683.922330
+288202.043057 9110663.857198
+288247.528140 9110631.761141
+288301.906949 9110592.642888
+288324.671489 9110579.608470
+288330.612940 9110576.601269
+288340.493290 9110568.575626
+288357.286932 9110554.530211
+288425.550959 9110511.408686
+288480.996944 9110482.336819
+288516.638120 9110463.288968
+288553.287896 9110446.251256
+288589.967081 9110433.231703
+288594.921935 9110431.227953
+288629.620621 9110419.210783
+288702.029114 9110399.197752
+288741.741478 9110393.213106
+Region 1
+52
+289008.394216 9109890.225778
+289002.283477 9109870.128535
+288968.748197 9109769.639096
+288956.482629 9109723.417316
+288953.419925 9109712.364142
+288936.111281 9109656.091586
+288924.920697 9109620.920830
+288916.763363 9109592.785072
+288891.363811 9109517.417605
+288888.286424 9109504.355330
+288873.915506 9109442.058640
+288855.517561 9109372.725852
+288835.212876 9109314.440895
+288833.195659 9109310.420579
+288813.951168 9109261.177570
+288784.414677 9109163.705677
+288754.922501 9109072.261002
+288753.899190 9109068.241750
+288726.446434 9108983.830986
+288710.095661 9108922.536537
+288688.716721 9108853.200334
+288651.030170 9108864.209500
+288598.472144 9108880.225229
+288556.817357 9108892.234568
+288487.399995 9108913.254606
+288373.353321 9108947.285052
+288242.447092 9108986.319573
+288210.708864 9108995.325826
+288290.320390 9109145.089026
+288362.872407 9109280.780734
+288388.057768 9109327.016879
+288397.120396 9109343.099337
+288487.776501 9109507.941923
+288507.955907 9109549.149828
+288518.159616 9109585.324242
+288546.569778 9109664.713458
+288568.847476 9109720.991640
+288589.152157 9109779.276744
+288612.453328 9109839.574129
+288620.603210 9109866.705428
+288654.388532 9109865.737268
+288712.027496 9109864.794736
+288784.560239 9109861.859047
+288845.173495 9109859.915002
+288885.916074 9109858.954130
+288904.800190 9109858.974357
+288923.713764 9109863.012751
+288930.693164 9109866.033829
+288939.697193 9109874.079753
+288957.668432 9109885.148874
+288983.524592 9109887.185593
+289008.394216 9109890.225778
+Region 1
+109
+290508.348727 9108429.210473
+290496.972760 9108368.926899
+290295.499866 9108406.888370
+290076.122119 9108442.821119
+290062.244941 9108447.829168
+290054.389999 9108460.879800
+290043.523933 9108469.909138
+290033.592672 9108470.903212
+290019.604759 9108460.843169
+290013.530856 9108445.768805
+290014.502577 9108442.756236
+289926.872828 9108419.559595
+289831.306976 9108398.363431
+289827.324144 9108397.354686
+289592.388852 9108344.869771
+289510.751986 9108325.696733
+289483.050029 9108478.356349
+289478.441799 9108527.573596
+289488.844797 9108590.870299
+289491.951703 9108607.950679
+289499.174138 9108644.121577
+289495.397665 9108671.239966
+289484.583008 9108687.300997
+289476.713109 9108698.342493
+289440.234628 9108738.485012
+289408.703348 9108775.619184
+289349.594038 9108846.878110
+289327.883492 9108867.950178
+289295.269747 9108893.028743
+289263.605638 9108912.081098
+289231.904667 9108926.110723
+289215.038196 9108930.110838
+289199.143502 9108931.098381
+289169.349230 9108934.080121
+289088.992279 9108954.084793
+288986.836097 9108983.106764
+288946.204736 9108999.135704
+288910.528029 9109013.160869
+288813.363001 9109045.201481
+288753.899190 9109068.241750
+288754.922501 9109072.261002
+288784.414677 9109163.705677
+288813.951168 9109261.177570
+288833.195659 9109310.420579
+288835.212876 9109314.440895
+288855.517561 9109372.725852
+288873.915506 9109442.058640
+288888.286424 9109504.355330
+288891.363811 9109517.417605
+288916.763363 9109592.785072
+288924.920697 9109620.920830
+288936.111281 9109656.091586
+288953.419925 9109712.364142
+288956.482629 9109723.417316
+288968.748197 9109769.639096
+289002.283477 9109870.128535
+289008.394216 9109890.225778
+289064.096870 9109896.312468
+289203.382984 9109915.547047
+289398.386523 9109942.876506
+289555.592393 9109966.147041
+289560.561892 9109966.152288
+289709.801833 9109987.404774
+289829.187895 9110003.602752
+290031.148850 9110030.936596
+290086.895867 9110043.049176
+290080.396862 9110105.323249
+290080.448606 9110112.355012
+290077.747800 9110150.524331
+290074.950899 9110175.634661
+290127.731185 9110189.753109
+290183.485801 9110202.870054
+290190.302611 9110183.791091
+290199.871881 9110133.574585
+290200.569997 9110093.394140
+290201.149812 9110037.141102
+290201.833159 9109994.951582
+290199.534825 9109952.758956
+290193.320071 9109918.598482
+290178.101139 9109876.392382
+290164.951345 9109845.238254
+290152.751117 9109808.057930
+290137.606194 9109775.897172
+290126.392520 9109737.713330
+290118.130983 9109695.514445
+290101.792724 9109636.230102
+290101.681879 9109621.162035
+290101.327182 9109572.944223
+290097.916947 9109514.677912
+290101.656048 9109482.536861
+290112.086350 9109414.239730
+290122.634862 9109362.015206
+290125.527848 9109349.963873
+290132.196870 9109310.794181
+290140.809321 9109265.599345
+290144.637075 9109245.512751
+290155.979949 9109166.166757
+290179.315837 9109095.874089
+290195.783209 9109037.628594
+290200.634371 9109021.561194
+290215.387340 9109000.481507
+290242.942436 9108963.342735
+290290.345391 9108922.206584
+290316.030885 9108901.138305
+290404.976700 9108832.923171
+290469.958492 9108749.615035
+290517.689452 9108618.071540
+290525.255919 9108565.843950
+290508.348727 9108429.210473
+Region 1
+88
+289551.137326 9108005.293537
+289349.156358 9108109.549331
+289245.920059 9108126.515831
+289239.971619 9108128.518522
+289182.511702 9108153.570247
+289137.935119 9108173.613081
+289103.260322 9108188.643847
+289019.593308 9107892.215567
+288962.177599 9107923.294240
+288954.263510 9107928.308378
+288926.516379 9107939.328312
+288900.756949 9107950.350381
+288800.715358 9107996.450858
+288752.163209 9108016.489009
+288713.527574 9108033.524261
+288661.021925 9108056.571660
+288622.584606 9108100.729604
+288567.413153 9108166.969193
+288497.311501 9108230.178885
+288458.697590 9108250.227624
+288419.163216 9108280.320730
+288418.323587 9108301.415144
+288391.481777 9108300.381344
+288350.703765 9108296.318700
+288316.868152 9108290.254520
+288310.079941 9108313.351527
+288294.361577 9108338.447860
+288260.863641 9108378.592866
+288224.156458 9108387.593597
+288200.347572 9108393.594794
+288065.408366 9108424.587723
+287914.603554 9108460.585549
+287854.079821 9108474.582515
+287778.677211 9108492.581169
+287754.860826 9108497.577607
+287771.224750 9108560.881858
+287786.506870 9108612.130386
+287802.951583 9108686.484660
+287827.516126 9108783.952323
+287840.751997 9108827.162205
+287847.863220 9108848.265413
+287877.214051 9108920.624707
+287905.615137 9108999.010167
+287931.042024 9109078.396862
+288008.403850 9109056.381719
+288016.332933 9109053.376777
+288070.864608 9109035.354707
+288111.525869 9109023.344670
+288168.067246 9109008.338319
+288210.708864 9108995.325826
+288242.447092 9108986.319573
+288373.353321 9108947.285052
+288487.399995 9108913.254606
+288556.817357 9108892.234568
+288598.472144 9108880.225229
+288651.030170 9108864.209500
+288688.716721 9108853.200334
+288710.095661 9108922.536537
+288726.446434 9108983.830986
+288753.899190 9109068.241750
+288813.363001 9109045.201481
+288910.528029 9109013.160869
+288946.204736 9108999.135704
+288986.836097 9108983.106764
+289088.992279 9108954.084793
+289169.349230 9108934.080121
+289199.143502 9108931.098381
+289215.038196 9108930.110838
+289231.904667 9108926.110723
+289263.605638 9108912.081098
+289295.269747 9108893.028743
+289327.883492 9108867.950178
+289349.594038 9108846.878110
+289408.703348 9108775.619184
+289440.234628 9108738.485012
+289476.713109 9108698.342493
+289484.583008 9108687.300997
+289495.397665 9108671.239966
+289499.174138 9108644.121577
+289491.951703 9108607.950679
+289488.844797 9108590.870299
+289478.441799 9108527.573596
+289483.050029 9108478.356349
+289510.751986 9108325.696733
+289541.324923 9108157.972188
+289556.651891 9108079.634902
+289571.927255 9107994.265830
+289551.137326 9108005.293537
+Region 1
+46
+290469.525328 9107745.085871
+290451.569618 9107736.026303
+290412.853942 9107742.012902
+290378.386896 9107785.171516
+290324.574522 9107900.635945
+290263.273303 9107943.766349
+290228.429436 9107935.693483
+290200.365359 9107903.518995
+290008.997871 9107693.370157
+289918.941249 9107745.510471
+289885.297873 9107765.565456
+289844.749128 9107792.644823
+289822.023289 9107810.702290
+289803.294954 9107831.777592
+289777.690738 9107863.895445
+289756.106132 9107902.044758
+289731.606282 9107949.231765
+289721.763573 9107962.280232
+289701.960193 9107972.304512
+289679.131011 9107976.298369
+289665.231779 9107978.292651
+289576.881798 9107992.262043
+289571.927255 9107994.265830
+289556.651891 9108079.634902
+289541.324923 9108157.972188
+289510.751986 9108325.696733
+289592.388852 9108344.869771
+289827.324144 9108397.354686
+289831.306976 9108398.363431
+289926.872828 9108419.559595
+290014.502577 9108442.756236
+290013.530856 9108445.768805
+290019.604759 9108460.843169
+290033.592672 9108470.903212
+290043.523933 9108469.909138
+290054.389999 9108460.879800
+290062.244941 9108447.829168
+290076.122119 9108442.821119
+290295.499866 9108406.888370
+290496.972760 9108368.926899
+290485.604233 9108309.647850
+290474.372376 9108133.843602
+290501.753161 9107937.989123
+290546.465248 9107801.419973
+290503.456463 9107764.207437
+290469.525328 9107745.085871
+Region 1
+65
+289182.511702 9108153.570247
+289239.971619 9108128.518522
+289147.440224 9107843.131029
+289141.359361 9107827.051912
+289086.786327 9107703.435193
+289085.623282 9107680.329606
+289080.639311 9107678.315159
+289049.741639 9107666.227391
+289012.041462 9107675.227521
+288938.643453 9107695.238936
+288893.014438 9107707.244014
+288837.527709 9107730.288283
+288810.340835 9107682.041009
+288791.200389 9107646.861427
+288751.911054 9107574.492044
+288735.737570 9107537.306562
+288732.711934 9107531.276045
+288710.472537 9107480.020415
+288643.133163 9107513.096897
+288634.203199 9107515.096249
+288627.260935 9107517.097764
+288590.525181 9107522.080427
+288546.883855 9107534.087302
+288361.407858 9107585.116108
+288298.927163 9107603.129384
+288240.414481 9107620.142399
+288212.784625 9107647.234674
+288185.074040 9107663.276899
+288066.302609 9107730.450574
+287950.417044 9107784.568153
+287989.940176 9107889.084090
+288044.606220 9108025.761930
+288082.105485 9108125.252742
+288159.428963 9108098.214989
+288188.830834 9108177.605943
+288195.875976 9108189.668149
+288201.366421 9108260.996549
+288206.842230 9108330.315845
+288210.971862 9108351.415716
+288215.064796 9108367.492842
+288224.156458 9108387.593597
+288260.863641 9108378.592866
+288294.361577 9108338.447860
+288310.079941 9108313.351527
+288316.868152 9108290.254520
+288350.703765 9108296.318700
+288391.481777 9108300.381344
+288418.323587 9108301.415144
+288419.163216 9108280.320730
+288458.697590 9108250.227624
+288497.311501 9108230.178885
+288567.413153 9108166.969193
+288622.584606 9108100.729604
+288661.021925 9108056.571660
+288713.527574 9108033.524261
+288752.163209 9108016.489009
+288800.715358 9107996.450858
+288900.756949 9107950.350381
+288926.516379 9107939.328312
+288954.263510 9107928.308378
+288962.177599 9107923.294240
+289019.593308 9107892.215567
+289103.260322 9108188.643847
+289137.935119 9108173.613081
+289182.511702 9108153.570247
+Region 1
+89
+288210.971862 9108351.415716
+288206.842230 9108330.315845
+288201.366421 9108260.996549
+288195.875976 9108189.668149
+288188.830834 9108177.605943
+288159.428963 9108098.214989
+288082.105485 9108125.252742
+288044.606220 9108025.761930
+287989.940176 9107889.084090
+287950.417044 9107784.568153
+288066.302609 9107730.450574
+288062.209838 9107714.373404
+288024.403234 9107572.691368
+287999.876250 9107480.246456
+287995.812869 9107468.187467
+287977.425071 9107399.858301
+287948.820360 9107293.345209
+287917.168355 9107177.787806
+287912.001289 9107150.659434
+287914.858268 9107133.585372
+287921.734591 9107122.543016
+287947.457334 9107106.498806
+287946.038501 9107048.233770
+287946.929765 9107034.171161
+287948.807545 9107019.105102
+287964.152166 9106942.776859
+287977.589682 9106877.496475
+287991.999039 9106809.203544
+288013.028200 9106694.708999
+287879.189909 9106739.765037
+287767.157149 9106776.808650
+287716.566532 9106789.811418
+287645.134509 9106806.809081
+287563.785951 9106826.809206
+287488.393021 9106845.811315
+287301.784648 9106877.747740
+287242.249066 9106890.739995
+287215.444514 9106894.728060
+287140.986567 9106905.694325
+287092.449000 9106791.121290
+286803.987277 9106620.021904
+286773.046847 9106601.904907
+286770.109117 9106607.928866
+286751.452392 9106639.048700
+286727.833733 9106671.167444
+286710.112420 9106694.251942
+286677.665870 9106742.433434
+286636.362210 9106802.659439
+286586.215970 9106876.939066
+286576.386933 9106891.996127
+286560.638574 9106913.073748
+286551.796076 9106927.127381
+286456.421148 9107068.660304
+286360.051826 9107210.192025
+286319.785006 9107276.446421
+286313.996873 9107300.549038
+286310.145408 9107317.622008
+286308.259783 9107331.683571
+286308.376460 9107347.756522
+286307.455525 9107357.800981
+286507.928982 9107455.470770
+286757.299553 9107580.317579
+286798.932180 9107565.296401
+286888.145875 9107533.251564
+286962.458828 9107502.194345
+287031.539773 9107708.204266
+287127.982590 9107986.571926
+287190.831565 9108155.406024
+287191.847387 9108158.420797
+287231.354824 9108260.928614
+287269.905212 9108368.458009
+287343.671705 9108398.676551
+287429.394092 9108432.926412
+287522.095696 9108470.197451
+287589.862538 9108495.386137
+287618.750942 9108504.459005
+287640.638237 9108507.496849
+287673.458186 9108510.546767
+287692.341860 9108510.567634
+287709.223116 9108508.577196
+287754.860826 9108497.577607
+287778.677211 9108492.581169
+287854.079821 9108474.582515
+287914.603554 9108460.585549
+288065.408366 9108424.587723
+288200.347572 9108393.594794
+288224.156458 9108387.593597
+288215.064796 9108367.492842
+288210.971862 9108351.415716
+Region 1
+67
+289012.041462 9107675.227521
+288991.664358 9107606.897012
+288975.387736 9107555.648039
+288957.020536 9107490.333270
+288951.882197 9107467.223357
+288948.783024 9107451.147410
+288931.056941 9107337.615518
+288919.588071 9107264.271868
+288910.356837 9107225.084903
+288909.311547 9107218.052008
+288904.187995 9107196.951165
+288856.542357 9107204.935753
+288843.284398 9107158.712619
+288830.939498 9107101.440551
+288827.766953 9107075.319118
+288817.174714 9106985.903725
+288804.254821 9106985.889667
+288690.993981 9106990.788971
+288671.552990 9106914.422819
+288660.283039 9106868.201730
+288628.524330 9106874.194273
+288556.069678 9106887.174058
+288550.113995 9106888.172080
+288452.776634 9106896.101774
+288371.325932 9106902.039635
+288298.893066 9106918.032680
+288256.267981 9106933.053896
+288215.601209 9106944.059071
+288184.850819 9106952.061520
+288082.690458 9106980.075982
+288064.889262 9106992.110825
+288057.004490 9107001.142992
+288014.650358 9107053.332377
+287993.955522 9107077.418511
+287969.219333 9107092.459289
+287947.457334 9107106.498806
+287921.734591 9107122.543016
+287914.858268 9107133.585372
+287912.001289 9107150.659434
+287917.168355 9107177.787806
+287948.820360 9107293.345209
+287977.425071 9107399.858301
+287995.812869 9107468.187467
+287999.876250 9107480.246456
+288024.403234 9107572.691368
+288062.209838 9107714.373404
+288066.302609 9107730.450574
+288185.074040 9107663.276899
+288212.784625 9107647.234674
+288240.414481 9107620.142399
+288298.927163 9107603.129384
+288361.407858 9107585.116108
+288546.883855 9107534.087302
+288590.525181 9107522.080427
+288627.260935 9107517.097764
+288634.203199 9107515.096249
+288643.133163 9107513.096897
+288710.472537 9107480.020415
+288732.711934 9107531.276045
+288735.737570 9107537.306562
+288751.911054 9107574.492044
+288791.200389 9107646.861427
+288810.340835 9107682.041009
+288837.527709 9107730.288283
+288893.014438 9107707.244014
+288938.643453 9107695.238936
+289012.041462 9107675.227521
+Region 1
+40
+288654.286036 9106727.559736
+288646.085781 9106693.396448
+288641.934276 9106669.282973
+288645.454493 9106607.005403
+288651.831427 9106527.653794
+288585.112807 9106509.499048
+288352.102134 9106446.961650
+288285.390987 9106429.810950
+288267.465421 9106424.768476
+288231.614297 9106414.683502
+288197.765497 9106406.609791
+288074.288975 9106373.323325
+288048.576503 9106526.989803
+288027.642658 9106654.543489
+288013.028200 9106694.708999
+287991.999039 9106809.203544
+287977.589682 9106877.496475
+287964.152166 9106942.776859
+287948.807545 9107019.105102
+287946.929765 9107034.171161
+287946.038501 9107048.233770
+287947.457334 9107106.498806
+287969.219333 9107092.459289
+287993.955522 9107077.418511
+288014.650358 9107053.332377
+288057.004490 9107001.142992
+288064.889262 9106992.110825
+288082.690458 9106980.075982
+288184.850819 9106952.061520
+288215.601209 9106944.059071
+288256.267981 9106933.053896
+288298.893066 9106918.032680
+288371.325932 9106902.039635
+288452.776634 9106896.101774
+288550.113995 9106888.172080
+288556.069678 9106887.174058
+288628.524330 9106874.194273
+288660.283039 9106868.201730
+288685.099569 9106864.210668
+288654.286036 9106727.559736
+Region 1
+488
+285905.680824 9110744.691470
+285836.873918 9110576.853278
+285826.759389 9110552.732543
+285778.138314 9110427.108247
+285772.057967 9110411.028491
+285643.407217 9110077.370270
+285618.508094 9110070.309954
+285407.759875 9110065.045893
+285279.580068 9110069.921431
+285205.057548 9110072.849329
+284965.499588 9110069.559118
+284847.222307 9110069.422110
+284832.313401 9110069.404818
+284698.118647 9110067.239836
+284646.448936 9110069.188833
+284626.989948 9109989.806022
+284626.742770 9109955.650730
+284606.289990 9109876.266728
+284579.692084 9109771.761544
+284558.223824 9109689.362609
+284483.619086 9109405.989510
+284463.203346 9109331.628146
+284449.962941 9109287.411977
+284418.309385 9109170.845841
+284353.044197 9108941.729307
+284292.553868 9108960.744752
+284225.330999 9108873.268663
+284154.865345 9108887.249335
+284108.217088 9108896.235263
+284109.174732 9108891.213584
+284137.330736 9108798.827154
+284143.098339 9108771.710796
+284150.817480 9108739.573936
+284162.512219 9108707.441777
+284177.195898 9108676.317713
+284194.817742 9108639.169750
+284216.371638 9108595.999062
+284239.942307 9108556.849002
+284264.543104 9108522.722962
+284325.526238 9108434.393547
+283987.023492 9108216.002645
+283354.863807 9107932.963540
+281808.395172 9107240.931431
+281758.550116 9107219.773389
+281748.645655 9107363.415399
+281738.669333 9107497.011567
+281724.638380 9107619.552371
+281720.179556 9107690.871708
+281608.166309 9107593.288558
+281438.148767 9107445.403718
+281136.250457 9107200.912782
+281130.308682 9107203.919047
+281122.386314 9107207.927399
+281118.518417 9107222.991222
+281120.556418 9107230.025840
+281128.586434 9107241.086309
+281140.613524 9107255.165538
+281141.664822 9107263.203492
+281132.770091 9107270.224363
+281117.890514 9107274.223971
+281104.991530 9107277.221486
+281095.110079 9107285.245690
+281090.212406 9107295.285322
+281082.261316 9107295.275319
+281084.141455 9107280.208994
+281083.090165 9107272.171036
+281072.128721 9107268.138925
+281065.157171 9107266.120991
+281063.298550 9107284.201082
+281066.330435 9107291.236954
+281049.412844 9107288.201920
+281041.425880 9107283.168966
+281037.479034 9107287.182315
+281031.587460 9107297.220692
+281018.724328 9107305.241129
+281004.845782 9107310.246545
+280993.934546 9107313.246537
+280978.025178 9107312.221907
+280965.075952 9107308.187264
+280960.084998 9107305.167231
+280953.170824 9107311.185993
+280959.184359 9107318.225636
+280956.267253 9107327.263178
+280947.365301 9107333.279434
+280939.421371 9107334.273996
+280927.444510 9107327.226828
+280924.405468 9107319.186353
+280920.401229 9107315.162980
+280913.444016 9107315.154202
+280908.445891 9107311.129573
+280911.391694 9107306.110389
+280912.335379 9107299.079518
+280903.368878 9107296.054461
+280889.504656 9107303.069023
+280873.616798 9107305.058123
+280862.684034 9107305.044316
+280852.759498 9107307.040942
+280846.846365 9107314.065536
+280838.952623 9107322.092208
+280828.055704 9107327.101343
+280817.165951 9107333.115065
+280807.241405 9107335.111682
+280791.310509 9107331.073218
+280779.362338 9107328.044365
+280769.409114 9107326.022613
+280762.480568 9107330.032173
+280751.626645 9107341.068832
+280746.771894 9107357.135988
+280744.848632 9107366.174785
+280735.010091 9107380.226473
+280726.151099 9107392.270236
+280718.285993 9107404.315257
+280710.428052 9107417.364868
+280700.610995 9107434.430324
+280688.834820 9107455.511626
+280667.141213 9107479.594112
+280656.351739 9107499.672079
+280642.580576 9107519.746268
+280624.855326 9107542.829192
+280616.032112 9107559.895902
+280609.175182 9107573.951359
+280590.441669 9107595.023836
+280578.608082 9107608.068401
+280566.810319 9107626.135921
+280550.057394 9107646.206320
+280542.242366 9107665.283470
+280528.449616 9107682.343874
+280522.600875 9107698.409771
+280513.834925 9107723.513208
+280503.989085 9107736.560288
+280491.161541 9107749.603584
+280468.366332 9107758.615897
+280450.461806 9107756.584001
+280443.497343 9107755.570575
+280437.555435 9107758.576777
+280424.656225 9107761.574142
+280407.810065 9107768.584819
+280390.906595 9107767.558756
+280375.998088 9107767.539805
+280357.113977 9107767.515793
+280348.247653 9107778.554931
+280335.441529 9107794.611973
+280331.630647 9107817.712540
+280329.857702 9107847.847782
+280335.034920 9107876.987279
+280335.271280 9107910.138825
+280334.485092 9107939.270738
+280329.680310 9107962.370042
+280317.925349 9107986.465095
+280315.108372 9108009.566928
+280303.224471 9108015.579318
+280285.291183 9108009.529010
+280256.510864 9108015.519893
+280247.673122 9108030.577399
+280247.852157 9108055.692217
+280251.055889 9108086.838385
+280260.201599 9108114.978358
+280257.391762 9108139.084788
+280247.595907 9108159.163999
+280232.801846 9108175.218516
+280198.072270 9108183.210987
+280183.149288 9108181.182820
+280165.244573 9108179.150850
+280133.317713 9108162.032241
+280119.388646 9108160.005317
+280101.498254 9108159.982505
+280093.554127 9108160.976958
+280079.782543 9108181.051080
+280071.995894 9108204.146590
+280070.093971 9108216.199178
+280053.218938 9108219.191402
+280035.307043 9108216.154788
+280022.429127 9108222.165857
+280017.559767 9108236.223827
+280014.771278 9108263.344056
+280009.987804 9108289.457154
+279999.233682 9108314.558045
+279993.441970 9108338.660687
+279988.579755 9108353.723253
+279973.749748 9108364.754751
+279954.808091 9108356.693878
+279927.800617 9108332.549324
+279895.859371 9108313.421363
+279882.881234 9108305.368079
+279871.833696 9108289.280575
+279849.803029 9108266.146907
+279839.785196 9108255.083637
+279825.748792 9108237.987702
+279805.713155 9108215.861141
+279793.721821 9108206.804498
+279779.699755 9108191.717731
+279756.725330 9108175.614886
+279750.726097 9108170.584258
+279747.722906 9108167.566646
+279747.637095 9108155.511501
+279747.536983 9108141.447164
+279741.523455 9108134.407342
+279722.646274 9108135.387698
+279707.816239 9108146.419108
+279698.034408 9108168.507451
+279685.206482 9108181.550602
+279675.260198 9108180.533239
+279660.280004 9108170.468125
+279649.268320 9108159.403518
+279634.216656 9108139.292431
+279623.176395 9108124.209430
+279609.111520 9108103.095010
+279600.059101 9108088.014556
+279588.990279 9108068.913155
+279554.060453 9108048.776433
+279536.120031 9108041.721209
+279513.238637 9108038.677958
+279483.392719 9108034.621126
+279463.485916 9108030.577096
+279442.642350 9108034.568552
+279419.796668 9108036.548238
+279395.949927 9108037.522032
+279369.071454 9108031.459777
+279349.171791 9108028.420292
+279328.256795 9108022.365718
+279307.398924 9108024.347917
+279293.526994 9108030.357503
+279272.797628 9108050.422455
+279252.096800 9108074.505796
+279230.444871 9108104.615435
+279207.806140 9108135.728382
+279191.030936 9108152.784670
+279162.307313 9108166.811702
+279141.542138 9108181.853628
+279117.730963 9108187.850290
+279099.819051 9108184.813286
+279074.899770 9108174.735049
+279055.049977 9108178.727640
+279029.336568 9108196.776871
+279013.576586 9108216.848204
+278999.854370 9108243.954316
+278977.151195 9108266.025803
+278959.446133 9108292.122145
+278948.620023 9108307.176930
+278924.901471 9108326.233313
+278905.137184 9108342.281059
+278884.400358 9108361.341307
+278874.625192 9108384.434180
+278861.896780 9108411.541574
+278852.114464 9108433.629847
+278832.414296 9108458.718983
+278822.567771 9108471.765850
+278796.839834 9108487.805808
+278748.208803 9108497.788360
+278705.519904 9108504.764839
+278696.574570 9108504.753170
+278691.512258 9108491.686870
+278685.448894 9108477.614671
+278669.546085 9108477.593915
+278648.666518 9108476.562064
+278625.763459 9108470.504597
+278604.848255 9108464.449715
+278584.955487 9108462.414529
+278561.030005 9108452.337318
+278549.060142 9108446.294105
+278529.252884 9108456.314119
+278518.469331 9108477.396458
+278510.617673 9108491.450484
+278489.930458 9108517.542824
+278474.191486 9108540.627861
+278456.429020 9108558.687279
+278439.610599 9108569.715777
+278424.737284 9108574.719259
+278408.827295 9108573.693817
+278393.896987 9108570.660466
+278376.950331 9108563.606092
+278359.960944 9108550.524090
+278339.996903 9108538.442771
+278323.057384 9108532.392974
+278300.182780 9108530.353752
+278265.494951 9108544.372506
+278253.646118 9108555.407474
+278240.803349 9108566.441134
+278225.901519 9108567.426140
+278216.970387 9108569.423587
+278212.057690 9108577.453884
+278215.146270 9108592.526863
+278216.232753 9108605.588021
+278210.404435 9108624.667655
+278201.558722 9108638.720350
+278194.985643 9108692.959817
+278191.166539 9108715.055879
+278189.335302 9108737.154553
+278179.474276 9108748.192131
+278164.586618 9108751.186340
+278128.804975 9108751.139272
+278111.013803 9108765.180190
+278099.228939 9108785.256580
+278083.496792 9108809.346155
+278061.900653 9108847.492340
+278057.059080 9108865.568680
+278030.265465 9108871.560964
+278012.331885 9108865.509762
+277993.397253 9108858.452637
+277976.486080 9108856.421150
+277961.577012 9108856.401488
+277953.675315 9108863.423237
+277946.845818 9108881.496954
+277937.999980 9108895.549628
+277928.217117 9108917.637833
+277915.402624 9108932.689866
+277903.518032 9108938.701759
+277887.622105 9108939.685373
+277867.750415 9108940.663732
+277851.847370 9108940.642728
+277830.939058 9108935.592123
+277814.993337 9108929.543469
+277798.039455 9108921.484283
+277784.074509 9108914.433638
+277754.256303 9108914.394192
+277739.389861 9108920.402100
+277715.670381 9108939.458047
+277712.724109 9108944.477133
+279837.810353 9109930.729523
+279985.911282 9110070.554778
+280022.795080 9110085.670267
+280064.619989 9110096.773639
+280100.674783 9110134.993424
+280131.881777 9110190.284955
+280163.045826 9110239.548891
+280161.481088 9110298.817317
+280182.684164 9110345.054890
+280209.779306 9110381.254043
+280232.062546 9110439.547923
+280236.440202 9110495.810062
+280238.643393 9110525.950313
+280279.962803 9110605.364328
+280263.395554 9110651.554273
+280243.031839 9110722.854003
+280223.518517 9110774.063157
+280154.866423 9110903.567910
+280157.062473 9110932.703577
+280128.517150 9110971.846368
+280068.422918 9111047.114396
+280021.214321 9111117.375722
+279972.846622 9111164.530145
+279934.275154 9111191.605229
+279921.012177 9111283.005625
+279942.072280 9111309.151381
+279942.179886 9111324.220274
+279949.209494 9111334.274979
+279946.363855 9111353.358482
+279944.691552 9111397.558058
+279954.832268 9111425.699188
+279950.106287 9111459.849077
+279928.367770 9111477.904177
+279953.389587 9111502.045730
+279935.006106 9111572.343420
+279975.074145 9111615.590991
+280034.742098 9111619.684416
+280045.776447 9111633.762458
+280077.526618 9111625.765709
+280092.623077 9111651.903834
+280134.456716 9111664.011365
+280173.136063 9111652.004917
+280188.053052 9111653.028211
+280209.935133 9111655.064816
+280193.274335 9111688.195139
+280193.468237 9111715.319103
+280193.590325 9111732.397155
+280268.053278 9111720.435465
+280314.856932 9111732.549023
+280335.996529 9111769.744978
+280361.948025 9111784.846138
+280381.806248 9111781.857207
+280414.536013 9111771.852273
+280426.011099 9111708.577999
+280448.750619 9111691.528513
+280475.494815 9111678.502340
+280508.281980 9111676.534077
+280531.699129 9111615.283867
+280553.451763 9111599.237699
+280561.324555 9111588.197128
+280570.097869 9111564.098136
+280578.849609 9111536.985377
+280597.634622 9111522.944662
+280607.466598 9111507.888210
+280617.370466 9111502.877646
+281032.191995 9111410.971279
+281177.074965 9111377.999211
+281294.176760 9111352.024563
+281387.430193 9111327.024904
+281433.203415 9111334.113188
+281452.233055 9111354.228072
+281460.379452 9111381.361612
+281482.419885 9111405.498471
+281521.329079 9111425.637697
+281569.277816 9111458.847426
+281672.162169 9111529.293516
+281712.123219 9111557.470407
+281699.446804 9111591.610445
+281691.790767 9111632.788633
+281693.109399 9111677.996077
+281699.369087 9111719.191253
+281718.528905 9111757.388441
+281857.883404 9111923.312776
+281969.180691 9111919.429670
+281984.140997 9111926.479827
+282000.088069 9111932.526603
+282024.037575 9111945.615077
+282041.987071 9111953.673405
+282069.869184 9111960.739182
+282102.685093 9111962.788053
+282122.557537 9111961.807527
+282146.391459 9111958.822640
+282168.194047 9111949.807858
+282185.984559 9111935.765363
+282202.730486 9111914.689603
+282209.551038 9111895.610992
+282218.366776 9111877.539363
+282228.176489 9111859.468934
+282244.022354 9111851.451505
+282258.903146 9111847.451191
+282274.835742 9111851.488708
+282278.818891 9111852.498087
+282293.757509 9111856.534397
+282306.729856 9111863.582041
+282322.763675 9111881.683649
+282343.789102 9111902.804976
+282375.835118 9111935.994405
+282959.854159 9112564.548310
+283049.008197 9112660.087936
+283065.913340 9112661.112541
+283091.757173 9112661.143162
+283105.680334 9112662.164220
+283124.616974 9112669.218603
+283151.520072 9112678.291534
+283174.519736 9112697.405487
+283196.481901 9112710.490804
+283215.505621 9112729.600027
+283229.617423 9112756.739960
+283238.752012 9112782.869441
+283253.879614 9112813.024252
+283275.921678 9112837.159820
+283285.963235 9112851.235572
+283386.044739 9112808.157218
+283438.530461 9112781.095748
+283471.237884 9112768.074878
+283502.958551 9112756.057394
+283539.641899 9112743.041156
+283604.983948 9112706.953561
+283631.560238 9112670.820456
+283638.242165 9112632.654894
+283642.957899 9112597.500717
+283652.636311 9112561.347797
+283665.376573 9112536.248662
+283686.155884 9112523.213706
+283712.848254 9112503.153732
+283743.487483 9112479.080120
+283763.236430 9112461.021121
+283800.593728 9112403.804794
+283846.765993 9112328.516651
+283852.642690 9112316.468780
+283859.513367 9112304.422071
+283904.669679 9112226.119040
+283947.932379 9112160.873088
+283955.796991 9112148.827537
+283999.988122 9112074.541602
+284042.198449 9112001.257905
+284083.523724 9111943.041582
+284128.933835 9111899.898420
+284168.525450 9111876.839664
+284200.201619 9111858.794469
+284203.176257 9111857.793372
+284280.422245 9111818.705409
+284346.770805 9111784.627486
+284364.604023 9111776.611720
+284487.455678 9111721.503471
+284593.365917 9111660.348015
+284630.983650 9111639.295793
+284649.788862 9111628.267390
+284695.336386 9111604.210619
+284756.721689 9111571.131068
+284842.861186 9111525.020734
+285019.115392 9111432.804266
+285295.378790 9111288.464849
+285424.103672 9111221.306705
+285433.999395 9111215.290668
+285458.753280 9111202.259693
+285570.616988 9111140.104781
+285963.620781 9110921.558100
+285947.213732 9110852.225501
+285905.680824 9110744.691470
+Region 1
+223
+285851.711940 9112207.257580
+285666.731389 9112192.985175
+285672.347870 9111461.677304
+285673.027855 9111418.482310
+285674.752910 9111382.320370
+285671.573925 9111355.193841
+285665.354691 9111320.027438
+285653.179076 9111285.858822
+285636.004543 9111247.666309
+285620.839839 9111212.489724
+285613.685132 9111185.358659
+285570.616988 9111140.104781
+285458.753280 9111202.259693
+285433.999395 9111215.290668
+285424.103672 9111221.306705
+285295.378790 9111288.464849
+285019.115392 9111432.804266
+284842.861186 9111525.020734
+284756.721689 9111571.131068
+284695.336386 9111604.210619
+284649.788862 9111628.267390
+284630.983650 9111639.295793
+284593.365917 9111660.348015
+284487.455678 9111721.503471
+284364.604023 9111776.611720
+284346.770805 9111784.627486
+284280.422245 9111818.705409
+284203.176257 9111857.793372
+284200.201619 9111858.794469
+284168.525450 9111876.839664
+284128.933835 9111899.898420
+284083.523724 9111943.041582
+284042.198449 9112001.257905
+283999.988122 9112074.541602
+283955.796991 9112148.827537
+283947.932379 9112160.873088
+283904.669679 9112226.119040
+283859.513367 9112304.422071
+283852.642690 9112316.468780
+283846.765993 9112328.516651
+283800.593728 9112403.804794
+283763.236430 9112461.021121
+283743.487483 9112479.080120
+283712.848254 9112503.153732
+283686.155884 9112523.213706
+283665.376573 9112536.248662
+283652.636311 9112561.347797
+283642.957899 9112597.500717
+283638.242165 9112632.654894
+283631.560238 9112670.820456
+283604.983948 9112706.953561
+283539.641899 9112743.041156
+283502.958551 9112756.057394
+283471.237884 9112768.074878
+283438.530461 9112781.095748
+283386.044739 9112808.157218
+283285.963235 9112851.235572
+283290.984017 9112858.273446
+283347.460776 9112970.851231
+283343.550108 9112979.887708
+283344.594919 9112986.920889
+283348.599952 9112990.943862
+283360.469871 9112982.921318
+283391.189464 9112969.898126
+283412.056175 9112968.918103
+283435.933921 9112971.959866
+283455.842935 9112976.001516
+283487.650883 9112976.038875
+283515.562722 9112987.121838
+283549.278767 9112976.111193
+283588.900663 9112957.070943
+283606.661855 9112939.009620
+283633.463443 9112934.018201
+283645.326015 9112924.991026
+283680.108618 9112924.027179
+283695.069423 9112931.076621
+283717.967667 9112936.126215
+283744.711087 9112923.098166
+283757.582158 9112916.081272
+283775.452272 9112913.088463
+283790.391275 9112917.124160
+283818.353985 9112935.238921
+283829.295206 9112936.256251
+283823.164044 9112913.144171
+283835.998749 9112901.104406
+283868.851463 9112908.174660
+283905.701973 9112918.263232
+283940.579047 9112930.358594
+283967.475084 9112938.426393
+283994.334763 9112941.471326
+284017.225736 9112945.516189
+284046.029760 9112942.535986
+284073.839781 9112939.554610
+284096.730750 9112943.599432
+284112.649209 9112945.627029
+284119.519860 9112933.580278
+284149.281466 9112925.578323
+284166.113867 9112916.556801
+284182.924430 9112904.521569
+284211.611951 9112885.468177
+284224.439242 9112872.423760
+284236.250700 9112856.364485
+284243.143140 9112847.331430
+284265.032784 9112850.370455
+284276.967959 9112851.388830
+284277.881885 9112840.339733
+284275.733775 9112818.236936
+284277.648971 9112808.193558
+284295.468008 9112798.168587
+284314.295584 9112790.153897
+284333.159550 9112787.162039
+284350.013692 9112781.154172
+284360.867494 9112770.116569
+284368.702922 9112754.052681
+284376.596589 9112746.025332
+284383.503545 9112739.001401
+284400.335818 9112729.979819
+284419.214307 9112728.997067
+284436.126663 9112731.025713
+284453.068146 9112737.072621
+284454.983302 9112727.029245
+284456.913022 9112718.995003
+284470.850692 9112722.024762
+284484.817494 9112729.072784
+284514.637116 9112729.107170
+284523.597569 9112731.126615
+284536.563106 9112737.168906
+284549.528647 9112743.211193
+284567.493265 9112753.277464
+284585.334046 9112746.266098
+284597.218183 9112740.252430
+284613.092835 9112736.252466
+284630.970027 9112734.263916
+284654.891287 9112743.332442
+284675.852454 9112755.411224
+284692.837682 9112767.485426
+284715.743114 9112773.539074
+284735.673877 9112780.593852
+284752.680993 9112795.681721
+284770.733134 9112817.802678
+284789.735542 9112833.897372
+284812.764950 9112857.028565
+284824.838631 9112877.133525
+284835.852712 9112888.196258
+284844.915278 9112904.279536
+284847.992038 9112917.342291
+284850.067519 9112929.399343
+284854.116399 9112939.449540
+284876.057105 9112949.520201
+284893.999979 9112956.572611
+284902.989651 9112962.610224
+284915.984460 9112972.670635
+284934.877573 9112973.696775
+284943.779722 9112967.679606
+284946.696045 9112958.641934
+284957.505932 9112941.576829
+284969.433807 9112941.590447
+284987.332913 9112942.615433
+285014.134150 9112937.623233
+285035.958136 9112931.620789
+285047.834930 9112924.602441
+285054.734480 9112916.573863
+285049.676984 9112904.513434
+285053.594567 9112896.481457
+285070.433993 9112888.464209
+285084.342525 9112887.475503
+285095.407738 9112905.570101
+285105.522756 9112929.690942
+285122.522732 9112943.774065
+285146.429551 9112950.833154
+285170.321776 9112955.883102
+285180.268963 9112956.898966
+285203.152603 9112959.938640
+285231.013486 9112963.988508
+285244.892823 9112958.981498
+285254.730494 9112944.928907
+285269.603809 9112939.923019
+285285.529520 9112942.954754
+285302.478427 9112950.005859
+285311.380505 9112943.988632
+285315.290737 9112934.952081
+285322.182929 9112925.918911
+285337.107343 9112927.944939
+285339.109923 9112929.956317
+285356.000404 9112928.970905
+285363.915785 9112923.957105
+285370.837178 9112918.942179
+285389.759447 9112923.986379
+285409.697618 9112932.045380
+285418.599674 9112926.028135
+285416.524048 9112913.971145
+285417.481513 9112908.949462
+285423.343171 9112894.892350
+285442.177772 9112887.881791
+285454.134822 9112891.913531
+285469.095747 9112898.962323
+285483.004244 9112897.973496
+285493.843112 9112884.926559
+285508.716363 9112879.920604
+285522.559092 9112869.890716
+285529.451229 9112860.857527
+285538.324025 9112850.822021
+285546.210140 9112841.789954
+285561.076061 9112835.779425
+285569.035241 9112836.792964
+285574.063620 9112844.835061
+285578.024941 9112842.830427
+285598.818220 9112831.803814
+285610.672944 9112821.771665
+285615.533239 9112806.708862
+285609.225873 9112759.487783
+285638.906477 9112740.434773
+285668.682068 9112734.441034
+285672.577595 9112723.395352
+285686.252128 9112690.260548
+285707.900410 9112660.148385
+285723.635959 9112637.061420
+285750.414905 9112629.055167
+285770.374890 9112640.127705
+285794.369288 9112659.241183
+285823.289729 9112672.332873
+285823.238546 9112665.300957
+285851.711940 9112207.257580
+Region 1
+97
+287656.442215 9110807.917560
+287585.051200 9110695.330644
+287513.579870 9110571.693461
+287494.460533 9110539.527078
+287477.336408 9110508.367416
+287404.813162 9110376.692401
+287301.053772 9110186.719093
+287296.091520 9110187.718156
+287170.377026 9110257.897260
+287168.345220 9110251.867739
+287147.099230 9110200.612396
+287115.899481 9110147.336902
+287082.704659 9110093.054607
+287039.761206 9110064.879632
+286989.904334 9110042.724190
+286953.122153 9110041.678715
+286866.636873 9110039.573267
+286611.097992 9110025.223921
+286274.028429 9110006.762967
+286197.467505 9110002.658310
+286194.500360 9110004.664057
+286189.516158 9110002.649323
+286164.595155 9109992.575642
+286151.579265 9109979.501760
+286148.539081 9109971.461915
+286225.268907 9109725.433804
+286182.479561 9109718.353536
+286092.976338 9109711.220275
+286074.077399 9109709.189738
+285711.021860 9109670.603403
+285740.257215 9110001.134745
+285743.837180 9110083.512165
+285743.866362 9110087.530410
+285643.407217 9110077.370270
+285772.057967 9110411.028491
+285778.138314 9110427.108247
+285826.759389 9110552.732543
+285836.873918 9110576.853278
+285905.680824 9110744.691470
+285947.213732 9110852.225501
+285963.620781 9110921.558100
+285570.616988 9111140.104781
+285613.685132 9111185.358659
+285620.839839 9111212.489724
+285636.004543 9111247.666309
+285653.179076 9111285.858822
+285665.354691 9111320.027438
+285671.573925 9111355.193841
+285674.752910 9111382.320370
+285673.027855 9111418.482310
+285672.347870 9111461.677304
+285666.731389 9112192.985175
+285851.711940 9112207.257580
+285877.555124 9112207.286673
+285922.364130 9112218.387142
+285985.101147 9112234.530451
+286083.102592 9112316.008953
+286197.015230 9112398.509485
+286315.971330 9112491.060736
+286397.989721 9112561.470433
+286403.355101 9112615.722005
+286361.134166 9112686.997990
+286339.742718 9112752.269847
+286351.152553 9112817.578187
+286453.334588 9112790.568879
+286550.583206 9112768.576642
+286685.764070 9112768.726167
+286813.825649 9112746.767432
+286873.390809 9112736.787571
+286932.625773 9112681.602733
+286927.061673 9112600.228434
+286926.621526 9112539.955221
+286947.098760 9112485.732300
+286993.382435 9112426.515040
+287070.390883 9112355.276975
+287118.654864 9112295.057284
+287144.860748 9112208.695216
+287151.730416 9112196.648221
+287188.037275 9112132.397215
+287191.969079 9112126.374262
+287279.491863 9111997.888565
+287334.683568 9111933.658209
+287359.319527 9111904.553411
+287373.117412 9111888.495813
+287497.415461 9111760.050160
+287568.142512 9111645.609499
+287611.907886 9111514.062190
+287616.693980 9111488.953854
+287627.216036 9111432.710964
+287628.736333 9111232.808705
+287629.598084 9111214.727884
+287656.334090 9111065.080278
+287668.777901 9110999.798623
+287706.180128 9110949.612357
+287740.637211 9110904.445575
+287727.613304 9110890.367774
+287656.442215 9110807.917560
+Region 1
+85
+287191.847387 9108158.420797
+287190.831565 9108155.406024
+287127.982590 9107986.571926
+287031.539773 9107708.204266
+286962.458828 9107502.194345
+286888.145875 9107533.251564
+286798.932180 9107565.296401
+286757.299553 9107580.317579
+286713.679166 9107595.336476
+286630.406429 9107624.374110
+286543.136196 9107650.393430
+286503.469190 9107662.402993
+286324.894355 9107706.400061
+286242.571115 9107729.410860
+285940.894065 9107792.352410
+285930.969928 9107794.350127
+285649.314710 9108151.647318
+285618.333389 9108265.126261
+285598.980030 9108337.431880
+285589.274209 9108369.566439
+285603.210454 9108372.596159
+285620.830929 9108335.447943
+285634.519544 9108304.322525
+285645.226494 9108273.193673
+285659.952662 9108248.096775
+285672.698336 9108224.002150
+285688.418358 9108198.906393
+285705.175948 9108179.839153
+285721.955376 9108163.785597
+285749.645617 9108144.730923
+285778.351567 9108128.691066
+285810.060986 9108115.668307
+285846.754347 9108104.660357
+285865.616174 9108101.668347
+285984.317729 9108161.073006
+286025.363422 9108338.925711
+286040.774826 9108408.257412
+286061.272423 9108493.667731
+286076.654815 9108558.981150
+286108.479349 9108698.650105
+286108.501235 9108701.663784
+286149.438951 9108864.447705
+286154.561669 9108885.549107
+286188.433100 9109033.256605
+286226.265866 9109178.959406
+286230.358284 9109195.036857
+286262.140390 9109328.678092
+286276.040428 9109326.684727
+286293.053632 9109342.776787
+286304.066908 9109353.839299
+286317.141038 9109374.949640
+286323.316287 9109404.088576
+286337.369740 9109423.190911
+286360.324519 9109436.275995
+286393.203749 9109447.363167
+286413.746959 9109402.181617
+286442.621321 9109409.246039
+286466.935476 9109335.941352
+286545.607223 9109357.125527
+286591.187624 9109201.471766
+286734.711156 9109256.883231
+286803.480349 9109283.078586
+286800.447451 9109276.043354
+286734.951873 9109153.415057
+286808.185731 9109110.301669
+286840.881878 9109096.274654
+286870.779187 9109107.358169
+286878.759607 9109111.385295
+286892.564407 9109096.332543
+286896.474147 9109087.295995
+286950.713981 9109029.092961
+286948.623769 9109015.026965
+286982.218560 9108987.941772
+286986.157543 9108982.923442
+287055.107911 9108897.614033
+287090.573231 9108854.458143
+287149.540450 9108763.110252
+287154.458645 9108756.083916
+287080.924464 9108621.392614
+287048.687547 9108425.469974
+287047.671723 9108422.455196
+287025.732410 9108275.766790
+287269.905212 9108368.458009
+287231.354824 9108260.928614
+287191.847387 9108158.420797
+Region 1
+72
+286393.203749 9109447.363167
+286360.324519 9109436.275995
+286337.369740 9109423.190911
+286323.316287 9109404.088576
+286317.141038 9109374.949640
+286304.066908 9109353.839299
+286293.053632 9109342.776787
+286276.040428 9109326.684727
+286262.140390 9109328.678092
+286230.358284 9109195.036857
+286226.265866 9109178.959406
+286188.433100 9109033.256605
+286154.561669 9108885.549107
+286149.438951 9108864.447705
+286108.501235 9108701.663784
+286108.479349 9108698.650105
+286076.654815 9108558.981150
+286061.272423 9108493.667731
+286040.774826 9108408.257412
+286025.363422 9108338.925711
+285984.317729 9108161.073006
+285865.616174 9108101.668347
+285846.754347 9108104.660357
+285810.060986 9108115.668307
+285778.351567 9108128.691066
+285749.645617 9108144.730923
+285721.955376 9108163.785597
+285705.175948 9108179.839153
+285688.418358 9108198.906393
+285672.698336 9108224.002150
+285659.952662 9108248.096775
+285645.226494 9108273.193673
+285634.519544 9108304.322525
+285620.830929 9108335.447943
+285603.210454 9108372.596159
+285589.274209 9108369.566439
+285573.692445 9108413.748882
+285558.249020 9108477.018024
+285534.970967 9108556.351014
+285530.132592 9108574.427423
+285525.279652 9108590.494705
+285485.476720 9108721.040953
+285472.847368 9108761.208590
+285471.172700 9108804.402522
+285468.489579 9108845.586182
+285468.627942 9108864.672885
+285468.904675 9108902.846290
+285472.359752 9108968.146336
+285469.815040 9109028.416696
+285470.048109 9109060.562719
+285471.165830 9109077.641437
+285473.466836 9109120.839942
+285473.911165 9109182.118293
+285474.319093 9109238.373827
+285476.598294 9109278.558636
+285481.793662 9109309.705805
+285492.879633 9109330.814195
+285498.915933 9109340.866677
+285507.897530 9109345.899769
+285541.610231 9109334.888392
+285627.905207 9109310.878100
+285826.314402 9109259.872929
+285852.474851 9109440.722280
+285693.755747 9109482.732187
+285711.021860 9109670.603403
+286074.077399 9109709.189738
+286092.976338 9109711.220275
+286182.479561 9109718.353536
+286225.268907 9109725.433804
+286307.822851 9109460.325867
+286326.699756 9109459.342654
+286393.203749 9109447.363167
+Region 1
+77
+285627.905207 9109310.878100
+285541.610231 9109334.888392
+285507.897530 9109345.899769
+285498.915933 9109340.866677
+285492.879633 9109330.814195
+285481.793662 9109309.705805
+285476.598294 9109278.558636
+285474.319093 9109238.373827
+285473.911165 9109182.118293
+285473.466836 9109120.839942
+285471.165830 9109077.641437
+285470.048109 9109060.562719
+285469.815040 9109028.416696
+285472.359752 9108968.146336
+285468.904675 9108902.846290
+285468.627942 9108864.672885
+285468.489579 9108845.586182
+285471.172700 9108804.402522
+285472.847368 9108761.208590
+285485.476720 9108721.040953
+285525.279652 9108590.494705
+285496.500505 9108596.488856
+285415.161571 9108618.495205
+284843.907101 9108787.602242
+284608.883132 9108860.660297
+284574.161932 9108869.660648
+284555.886813 9108816.397552
+284532.576904 9108754.087489
+284518.451753 9108724.938666
+284470.229190 9108653.558235
+284430.995409 9108588.215655
+284386.770512 9108519.853450
+284367.581759 9108477.639276
+284331.518619 9108438.418862
+284325.526238 9108434.393547
+284264.543104 9108522.722962
+284239.942307 9108556.849002
+284216.371638 9108595.999062
+284194.817742 9108639.169750
+284177.195898 9108676.317713
+284162.512219 9108707.441777
+284150.817480 9108739.573936
+284143.098339 9108771.710796
+284137.330736 9108798.827154
+284109.174732 9108891.213584
+284108.217088 9108896.235263
+284154.865345 9108887.249335
+284225.330999 9108873.268663
+284292.553868 9108960.744752
+284353.044197 9108941.729307
+284418.309385 9109170.845841
+284449.962941 9109287.411977
+284463.203346 9109331.628146
+284483.619086 9109405.989510
+284558.223824 9109689.362609
+284579.692084 9109771.761544
+284606.289990 9109876.266728
+284626.742770 9109955.650730
+284626.989948 9109989.806022
+284646.448936 9110069.188833
+284698.118647 9110067.239836
+284832.313401 9110069.404818
+284847.222307 9110069.422110
+284965.499588 9110069.559118
+285205.057548 9110072.849329
+285279.580068 9110069.921431
+285407.759875 9110065.045893
+285618.508094 9110070.309954
+285643.407217 9110077.370270
+285743.866362 9110087.530410
+285743.837180 9110083.512165
+285740.257215 9110001.134745
+285711.021860 9109670.603403
+285693.755747 9109482.732187
+285852.474851 9109440.722280
+285826.314402 9109259.872929
+285627.905207 9109310.878100
+Region 1
+203
+290466.514862 9105983.138244
+290473.301828 9105960.041231
+290225.607957 9105927.633892
+290219.637743 9105926.623019
+290089.286864 9105904.384670
+290001.780240 9105897.259644
+289940.237814 9105907.239248
+289933.288522 9105908.236354
+289858.833895 9105919.206586
+289818.212895 9105936.240155
+289806.323995 9105941.250085
+289783.532632 9105950.266462
+289764.731221 9105961.296175
+289723.999719 9105963.261552
+289568.273065 9106004.280090
+289493.884254 9106024.290659
+289471.939456 9106013.217116
+289446.004706 9106000.130184
+289429.993386 9105985.044876
+289413.982077 9105969.959561
+289395.990507 9105955.876632
+289376.961020 9105935.765359
+289361.862680 9105909.631112
+289347.692004 9105874.457037
+289338.541866 9105846.320137
+289324.407993 9105816.168764
+289322.390971 9105812.148437
+289308.293877 9105787.019773
+289297.266428 9105773.948859
+289263.109471 9105723.685027
+289259.082798 9105716.648906
+289254.062318 9105709.611706
+289249.027143 9105700.565417
+289231.934019 9105673.424386
+289215.842071 9105647.288967
+289207.781411 9105632.212165
+289198.719604 9105616.129735
+289183.599467 9105586.981741
+289170.511038 9105563.863166
+289168.494045 9105559.842826
+289157.400588 9105537.730950
+289141.294055 9105509.586392
+289125.246303 9105489.478182
+289105.201322 9105466.351998
+289087.217404 9105453.273418
+289066.259432 9105441.196122
+289047.347815 9105437.157347
+289015.480058 9105428.081733
+288983.641674 9105423.024276
+288959.768393 9105419.984578
+288934.798549 9105402.880134
+288900.994592 9105400.834077
+288877.158012 9105402.817063
+288862.199605 9105395.768914
+288847.292568 9105395.752585
+288832.385529 9105395.736251
+288815.461535 9105391.699546
+288791.588261 9105388.659751
+288780.663768 9105389.652306
+288742.943274 9105395.638142
+288720.056462 9105391.594853
+288712.084032 9105388.572477
+288709.278661 9105412.678337
+288689.703310 9105453.842940
+288686.014149 9105493.015920
+288686.608299 9105574.384256
+288674.018889 9105619.574698
+288644.622724 9105676.801154
+288598.449055 9105750.081800
+288581.715606 9105772.163277
+288573.838448 9105782.200014
+288535.255754 9105806.266530
+288431.227903 9105850.351725
+288259.693557 9105904.407526
+288216.068185 9105918.422839
+288157.733299 9105959.544450
+288124.097289 9105980.602554
+288108.159556 9105975.562172
+288056.319829 9105953.404719
+288035.398367 9105946.349689
+288022.515333 9105951.358090
+288017.560883 9105953.361671
+288011.656547 9105961.391451
+288008.740991 9105970.429096
+288012.789496 9105980.479021
+288018.796352 9105986.512950
+288038.899774 9106017.676096
+288043.080118 9106045.807927
+288037.190427 9106055.846814
+288024.322011 9106062.864324
+288008.442834 9106065.860317
+287996.487681 9106061.828866
+287969.427507 9106030.657965
+287933.357098 9105990.436126
+287920.203173 9105958.276106
+287903.125234 9105933.143510
+287869.232903 9105919.042141
+287844.416694 9105923.032648
+287808.683096 9105929.020049
+287785.883777 9105937.030953
+287763.128349 9105951.069160
+287784.166881 9105974.197160
+287809.217311 9106002.352338
+287837.190688 9106022.474405
+287893.144830 9106063.723019
+287974.010543 9106114.040114
+288051.880296 9106162.344612
+288109.785795 9106198.572320
+288099.220027 9106248.787719
+288082.867114 9106323.105720
+288080.024830 9106342.188872
+288074.288975 9106373.323325
+288197.765497 9106406.609791
+288231.614297 9106414.683502
+288267.465421 9106424.768476
+288285.390987 9106429.810950
+288352.102134 9106446.961650
+288585.112807 9106509.499048
+288651.831427 9106527.653794
+288645.454493 9106607.005403
+288641.934276 9106669.282973
+288646.085781 9106693.396448
+288654.286036 9106727.559736
+288685.099569 9106864.210668
+288660.283039 9106868.201730
+288671.552990 9106914.422819
+288690.993981 9106990.788971
+288804.254821 9106985.889667
+288817.174714 9106985.903725
+288827.766953 9107075.319118
+288830.939498 9107101.440551
+288843.284398 9107158.712619
+288856.542357 9107204.935753
+288904.187995 9107196.951165
+288909.311547 9107218.052008
+288910.356837 9107225.084903
+288919.588071 9107264.271868
+288931.056941 9107337.615518
+288948.783024 9107451.147410
+288951.882197 9107467.223357
+288957.020536 9107490.333270
+288975.387736 9107555.648039
+288991.664358 9107606.897012
+289012.041462 9107675.227521
+289049.741639 9107666.227391
+289080.639311 9107678.315159
+289085.623282 9107680.329606
+289086.786327 9107703.435193
+289141.359361 9107827.051912
+289147.440224 9107843.131029
+289239.971619 9108128.518522
+289245.920059 9108126.515831
+289349.156358 9108109.549331
+289551.137326 9108005.293537
+289571.927255 9107994.265830
+289576.881798 9107992.262043
+289665.231779 9107978.292651
+289679.131011 9107976.298369
+289701.960193 9107972.304512
+289721.763573 9107962.280232
+289731.606282 9107949.231765
+289756.106132 9107902.044758
+289777.690738 9107863.895445
+289803.294954 9107831.777592
+289822.023289 9107810.702290
+289844.749128 9107792.644823
+289885.297873 9107765.565456
+289918.941249 9107745.510471
+290008.997871 9107693.370157
+290200.365359 9107903.518995
+290228.429436 9107935.693483
+290263.273303 9107943.766349
+290324.574522 9107900.635945
+290378.386896 9107785.171516
+290412.853942 9107742.012902
+290451.569618 9107736.026303
+290469.525328 9107745.085871
+290431.013170 9107643.588080
+290390.794163 9107580.260537
+290385.773258 9107573.223560
+290341.497811 9107498.841853
+290310.186739 9107430.500892
+290288.976555 9107384.270184
+290261.788634 9107336.024096
+290232.568829 9107281.748650
+290181.115820 9107177.223155
+290128.809407 9107091.782725
+290117.552708 9107047.571445
+290104.205128 9106989.294504
+290114.421900 9106891.865803
+290138.692372 9106813.538088
+290145.501665 9106793.454681
+290198.467600 9106698.080332
+290252.508304 9106613.756944
+290265.199323 9106582.629922
+290307.100042 9106469.162297
+290328.639464 9106424.985737
+290361.942347 9106358.721946
+290415.893910 9106262.344063
+290446.692504 9106125.760533
+290471.660961 9106007.252394
+290469.533171 9105988.164082
+290466.514862 9105983.138244
+Region 1
+152
+288687.165610 9105378.499701
+288664.315474 9105379.479117
+288629.554361 9105382.454495
+288591.716507 9105372.367441
+288568.866360 9105373.346808
+288538.949620 9105359.250272
+288494.738505 9105292.901835
+288450.520207 9105225.548774
+288439.383218 9105197.409322
+288429.108154 9105151.189082
+288427.564827 9105075.846811
+288433.073353 9105013.571374
+288430.594896 9104946.264391
+288430.506982 9104934.209802
+288411.302562 9104889.988729
+288401.196148 9104866.873085
+288383.994033 9104824.663286
+288383.217677 9104718.181054
+288378.986190 9104683.017414
+288064.832768 9104803.212836
+287858.847572 9104902.432314
+287746.950591 9104957.556778
+287773.951319 9104980.691596
+287715.427297 9105132.312155
+287652.774238 9105262.832643
+287627.812523 9105383.350006
+287592.832218 9105492.806135
+287538.362957 9105655.481280
+287524.756565 9105697.656899
+287522.798173 9105701.672881
+287483.900739 9105819.160995
+287473.202642 9105851.294430
+287429.372238 9105837.181513
+287393.360965 9105941.613774
+287452.120741 9105958.757120
+287581.588186 9105996.070575
+287589.553392 9105998.088589
+287650.308220 9106016.238420
+287634.553348 9106036.311681
+287612.791635 9106050.350947
+287571.219246 9106073.408917
+287549.428240 9106083.429947
+287515.769820 9106101.474023
+287460.495781 9106153.648367
+287426.961545 9106188.769812
+287417.213345 9106214.877052
+287408.510140 9106248.017286
+287406.880710 9106297.238197
+287407.998827 9106314.316730
+287398.250605 9106340.423974
+287372.615689 9106368.522467
+287364.745448 9106379.563631
+287352.994908 9106403.659532
+287347.163496 9106421.734808
+287336.326362 9106434.781729
+287318.525075 9106446.816275
+287303.676042 9106454.835951
+287293.788866 9106461.856657
+287276.075263 9106485.945846
+287271.179178 9106495.985803
+287248.394052 9106506.005632
+287219.580127 9106506.977745
+287181.850901 9106511.957982
+287170.940624 9106514.959328
+287138.129416 9106512.913244
+287109.242412 9106503.839733
+287087.378013 9106503.815056
+287066.595103 9106515.846158
+287044.862168 9106533.903466
+287004.246296 9106551.939424
+286993.350594 9106556.949844
+286980.430700 9106556.935234
+286966.516966 9106556.919495
+286951.543672 9106547.861621
+286938.594570 9106543.828772
+286910.876622 9106558.865610
+286895.033613 9106566.884052
+286882.128310 9106568.878527
+286873.183760 9106568.868391
+286855.323858 9106572.866340
+286840.467370 9106579.881335
+286830.572774 9106585.897406
+286822.695053 9106595.933957
+286816.812309 9106606.977320
+286811.886905 9106612.999025
+286803.987277 9106620.021904
+287092.449000 9106791.121290
+287140.986567 9106905.694325
+287215.444514 9106894.728060
+287242.249066 9106890.739995
+287301.784648 9106877.747740
+287488.393021 9106845.811315
+287563.785951 9106826.809206
+287645.134509 9106806.809081
+287716.566532 9106789.811418
+287767.157149 9106776.808650
+287879.189909 9106739.765037
+288013.028200 9106694.708999
+288027.642658 9106654.543489
+288048.576503 9106526.989803
+288074.288975 9106373.323325
+288080.024830 9106342.188872
+288082.867114 9106323.105720
+288099.220027 9106248.787719
+288109.785795 9106198.572320
+288051.880296 9106162.344612
+287974.010543 9106114.040114
+287893.144830 9106063.723019
+287837.190688 9106022.474405
+287809.217311 9106002.352338
+287784.166881 9105974.197160
+287763.128349 9105951.069160
+287785.883777 9105937.030953
+287808.683096 9105929.020049
+287844.416694 9105923.032648
+287869.232903 9105919.042141
+287903.125234 9105933.143510
+287920.203173 9105958.276106
+287933.357098 9105990.436126
+287969.427507 9106030.657965
+287996.487681 9106061.828866
+288008.442834 9106065.860317
+288024.322011 9106062.864324
+288037.190427 9106055.846814
+288043.080118 9106045.807927
+288038.899774 9106017.676096
+288018.796352 9105986.512950
+288012.789496 9105980.479021
+288008.740991 9105970.429096
+288011.656547 9105961.391451
+288017.560883 9105953.361671
+288022.515333 9105951.358090
+288035.398367 9105946.349689
+288056.319829 9105953.404719
+288108.159556 9105975.562172
+288124.097289 9105980.602554
+288157.733299 9105959.544450
+288216.068185 9105918.422839
+288259.693557 9105904.407526
+288431.227903 9105850.351725
+288535.255754 9105806.266530
+288573.838448 9105782.200014
+288581.715606 9105772.163277
+288598.449055 9105750.081800
+288644.622724 9105676.801154
+288674.018889 9105619.574698
+288686.608299 9105574.384256
+288686.014149 9105493.015920
+288689.703310 9105453.842940
+288709.278661 9105412.678337
+288712.084032 9105388.572477
+288687.165610 9105378.499701
+Region 1
+111
+287725.167435 9104968.582315
+287567.708676 9105044.750696
+287406.295978 9105123.927823
+287301.325116 9105175.041064
+287296.728502 9105226.267752
+287291.123478 9105275.484206
+287283.574652 9105330.725744
+287276.939304 9105374.918301
+287275.002803 9105381.947940
+287261.447283 9105431.155409
+287255.645072 9105453.248880
+287247.877141 9105478.353769
+287244.946821 9105485.382285
+287234.146323 9105503.451916
+287229.257583 9105514.496404
+287217.455958 9105531.560356
+287207.663860 9105551.640221
+287196.899846 9105574.732628
+287169.357781 9105613.878803
+287156.562295 9105630.941625
+287153.588147 9105631.942805
+287142.707272 9105638.962318
+287112.081461 9105664.041321
+287091.386498 9105688.127018
+287067.037444 9105756.408670
+287031.858499 9105838.741719
+286931.270825 9105809.495669
+286793.831588 9105769.157351
+286783.227785 9105814.349986
+286774.626208 9105861.554002
+286759.359625 9105948.932400
+286755.566683 9105974.041812
+286754.915706 9106021.254889
+286744.479648 9106089.552359
+286734.145714 9106171.913639
+286721.940842 9106270.345583
+286714.486271 9106338.646457
+286710.656845 9106358.733086
+286787.386468 9106386.947715
+286853.169369 9106413.140673
+286843.457284 9106444.270661
+286826.934312 9106495.483896
+286802.482502 9106549.701780
+286777.964958 9106594.878648
+286773.046847 9106601.904907
+286803.987277 9106620.021904
+286811.886905 9106612.999025
+286816.812309 9106606.977320
+286822.695053 9106595.933957
+286830.572774 9106585.897406
+286840.467370 9106579.881335
+286855.323858 9106572.866340
+286873.183760 9106568.868391
+286882.128310 9106568.878527
+286895.033613 9106566.884052
+286910.876622 9106558.865610
+286938.594570 9106543.828772
+286951.543672 9106547.861621
+286966.516966 9106556.919495
+286980.430700 9106556.935234
+286993.350594 9106556.949844
+287004.246296 9106551.939424
+287044.862168 9106533.903466
+287066.595103 9106515.846158
+287087.378013 9106503.815056
+287109.242412 9106503.839733
+287138.129416 9106512.913244
+287170.940624 9106514.959328
+287181.850901 9106511.957982
+287219.580127 9106506.977745
+287248.394052 9106506.005632
+287271.179178 9106495.985803
+287276.075263 9106485.945846
+287293.788866 9106461.856657
+287303.676042 9106454.835951
+287318.525075 9106446.816275
+287336.326362 9106434.781729
+287347.163496 9106421.734808
+287352.994908 9106403.659532
+287364.745448 9106379.563631
+287372.615689 9106368.522467
+287398.250605 9106340.423974
+287407.998827 9106314.316730
+287406.880710 9106297.238197
+287408.510140 9106248.017286
+287417.213345 9106214.877052
+287426.961545 9106188.769812
+287460.495781 9106153.648367
+287515.769820 9106101.474023
+287549.428240 9106083.429947
+287571.219246 9106073.408917
+287612.791635 9106050.350947
+287634.553348 9106036.311681
+287650.308220 9106016.238420
+287589.553392 9105998.088589
+287581.588186 9105996.070575
+287452.120741 9105958.757120
+287393.360965 9105941.613774
+287429.372238 9105837.181513
+287473.202642 9105851.294430
+287483.900739 9105819.160995
+287522.798173 9105701.672881
+287524.756565 9105697.656899
+287538.362957 9105655.481280
+287592.832218 9105492.806135
+287627.812523 9105383.350006
+287652.774238 9105262.832643
+287715.427297 9105132.312155
+287773.951319 9104980.691596
+287746.950591 9104957.556778
+287725.167435 9104968.582315
+Region 1
+166
+288378.986190 9104683.017414
+288374.747394 9104646.849222
+288364.465335 9104599.624362
+288355.286930 9104567.468841
+288355.264963 9104564.455192
+288342.162687 9104539.327096
+288316.133892 9104513.180078
+288277.207878 9104490.032310
+288212.487394 9104472.883008
+288160.649563 9104450.725266
+288148.665604 9104442.675551
+288117.704622 9104421.545585
+288091.610172 9104386.357428
+288042.080948 9104271.784112
+287976.498020 9104136.097257
+287956.359243 9104099.911088
+287922.146799 9104041.609129
+287880.992640 9103985.308404
+287834.898944 9103933.020232
+287824.902734 9103924.972620
+287782.937685 9103893.784455
+287715.229508 9103875.626271
+287655.610312 9103876.563478
+287637.773475 9103883.575136
+287585.117974 9103885.524670
+287550.335821 9103885.485295
+287491.703033 9103885.418859
+287449.964427 9103885.371519
+287445.302071 9103927.557185
+287435.933569 9104005.901191
+287434.983582 9104011.927393
+287431.271215 9104048.086860
+287430.372318 9104061.144947
+287422.881899 9104124.422888
+287421.011118 9104140.493513
+287410.714529 9104227.877394
+287401.367930 9104309.235076
+287390.143254 9104405.658833
+287389.251664 9104419.721476
+287379.839369 9104492.038171
+287368.592795 9104585.448272
+287366.743917 9104604.532565
+287282.710627 9104528.091715
+287158.670680 9104416.445945
+287143.661713 9104402.365185
+287109.170822 9104442.507820
+287073.146399 9104408.312119
+286915.012321 9104254.435487
+286894.295830 9104275.507305
+286822.346792 9104357.797943
+286798.670698 9104381.879995
+286797.786205 9104396.947228
+286751.078010 9104396.893653
+286751.558866 9104463.194508
+286754.726848 9104625.935238
+286728.895422 9104626.910171
+286727.748615 9104605.813304
+286725.887810 9104486.269704
+286719.065423 9104367.724948
+286717.328635 9104265.258825
+286718.162177 9104243.159676
+286717.608618 9104166.813214
+286714.936432 9104072.382407
+286711.481711 9104007.082655
+286708.034304 9103942.787458
+286704.317519 9103841.323575
+286701.543620 9103732.828915
+286699.301249 9103697.667059
+286695.941353 9103645.426551
+286681.056565 9103648.423042
+286608.525512 9103650.348451
+286543.981017 9103657.305736
+286494.277649 9103655.239143
+286462.462252 9103653.193210
+286423.719510 9103655.157436
+286409.843003 9103660.164115
+286383.120119 9103675.201418
+286340.802209 9103732.411823
+286312.440758 9103795.665727
+286295.822825 9103833.819443
+286241.935584 9103940.239483
+286233.144226 9103961.324886
+286224.367404 9103984.419412
+286205.587279 9103998.461339
+286190.709578 9104002.462264
+286187.735491 9104003.463361
+286167.309481 9104064.717371
+286165.569107 9104098.870161
+286164.924319 9104147.087971
+286169.401191 9104216.407348
+286168.242590 9104330.925070
+286165.515734 9104366.081267
+286155.795957 9104396.206580
+286147.004518 9104417.291993
+286136.218209 9104437.370536
+286139.425032 9104468.515412
+286148.594647 9104499.667206
+286167.673163 9104526.812276
+286185.779727 9104556.969864
+286189.885849 9104575.056578
+286201.021312 9104603.196965
+286210.169193 9104631.335044
+286219.280714 9104654.450312
+286232.440204 9104687.615788
+286286.607544 9104756.992574
+286309.676043 9104786.151250
+286337.815489 9104829.379492
+286379.992012 9104889.701274
+286435.109974 9104953.051548
+286437.447110 9105001.272710
+286438.477327 9105006.296654
+286467.334131 9105011.352624
+286493.209518 9105016.405145
+286505.171614 9105021.441655
+286544.090328 9105043.586503
+286581.021460 9105065.729027
+286592.033483 9105076.791722
+286544.986371 9105167.147287
+286536.129505 9105179.191728
+286532.212546 9105187.223637
+286502.497154 9105337.872157
+286500.677089 9105360.974740
+286478.562448 9105463.413555
+286457.361439 9105554.803364
+286440.969208 9105624.098575
+286443.219134 9105660.264999
+286507.955954 9105679.425717
+286525.866599 9105682.459894
+286546.758707 9105685.497478
+286618.488773 9105709.688776
+286635.405605 9105712.721768
+286647.346041 9105714.744517
+286736.979543 9105740.965155
+286796.740110 9105759.115173
+286793.831588 9105769.157351
+286931.270825 9105809.495669
+287031.858499 9105838.741719
+287067.037444 9105756.408670
+287091.386498 9105688.127018
+287112.081461 9105664.041321
+287142.707272 9105638.962318
+287153.588147 9105631.942805
+287156.562295 9105630.941625
+287169.357781 9105613.878803
+287196.899846 9105574.732628
+287207.663860 9105551.640221
+287217.455958 9105531.560356
+287229.257583 9105514.496404
+287234.146323 9105503.451916
+287244.946821 9105485.382285
+287247.877141 9105478.353769
+287255.645072 9105453.248880
+287261.447283 9105431.155409
+287275.002803 9105381.947940
+287276.939304 9105374.918301
+287283.574652 9105330.725744
+287291.123478 9105275.484206
+287296.728502 9105226.267752
+287301.325116 9105175.041064
+287406.295978 9105123.927823
+287567.708676 9105044.750696
+287725.167435 9104968.582315
+287746.950591 9104957.556778
+287858.847572 9104902.432314
+288064.832768 9104803.212836
+288378.986190 9104683.017414
+Region 1
+68
+287422.138685 9103885.339937
+287399.311010 9103889.332203
+287361.532896 9103887.280185
+287340.641691 9103884.242793
+287281.695183 9103840.980183
+287249.784936 9103825.875622
+287232.817810 9103815.810808
+287215.865275 9103807.755098
+287204.889986 9103801.715294
+287189.895844 9103789.643613
+287172.899576 9103775.560544
+287126.967190 9103745.371641
+287106.975053 9103729.276018
+287073.011774 9103705.128012
+287043.067354 9103687.011865
+287005.158189 9103666.877470
+286973.262698 9103653.781775
+286953.321648 9103644.717963
+286934.396234 9103638.668954
+286912.511357 9103635.630188
+286839.965859 9103635.546848
+286801.230510 9103638.515951
+286765.432784 9103635.461102
+286728.684964 9103638.432432
+286707.852094 9103643.431179
+286695.941353 9103645.426551
+286699.301249 9103697.667059
+286701.543620 9103732.828915
+286704.317519 9103841.323575
+286708.034304 9103942.787458
+286711.481711 9104007.082655
+286714.936432 9104072.382407
+286717.608618 9104166.813214
+286718.162177 9104243.159676
+286717.328635 9104265.258825
+286719.065423 9104367.724948
+286725.887810 9104486.269704
+286727.748615 9104605.813304
+286728.895422 9104626.910171
+286754.726848 9104625.935238
+286751.558866 9104463.194508
+286751.078010 9104396.893653
+286797.786205 9104396.947228
+286798.670698 9104381.879995
+286822.346792 9104357.797943
+286894.295830 9104275.507305
+286915.012321 9104254.435487
+287073.146399 9104408.312119
+287109.170822 9104442.507820
+287143.661713 9104402.365185
+287158.670680 9104416.445945
+287282.710627 9104528.091715
+287366.743917 9104604.532565
+287368.592795 9104585.448272
+287379.839369 9104492.038171
+287389.251664 9104419.721476
+287390.143254 9104405.658833
+287401.367930 9104309.235076
+287410.714529 9104227.877394
+287421.011118 9104140.493513
+287422.881899 9104124.422888
+287430.372318 9104061.144947
+287431.271215 9104048.086860
+287434.983582 9104011.927393
+287435.933569 9104005.901191
+287445.302071 9103927.557185
+287449.964427 9103885.371519
+287422.138685 9103885.339937
+Region 1
+296
+286507.928982 9107455.470770
+286307.455525 9107357.800981
+286308.376460 9107347.756522
+286308.259783 9107331.683571
+286310.145408 9107317.622008
+286313.996873 9107300.549038
+286319.785006 9107276.446421
+286360.051826 9107210.192025
+286456.421148 9107068.660304
+286551.796076 9106927.127381
+286560.638574 9106913.073748
+286537.838424 9106921.084186
+286518.977186 9106924.076352
+286493.159000 9106927.060580
+286461.348540 9106926.019758
+286435.493878 9106923.981160
+286413.600027 9106919.937967
+286359.822799 9106904.808273
+286315.991373 9106890.694436
+286267.154277 9106871.552061
+286202.422919 9106853.395950
+286153.687890 9106848.317277
+286113.926643 9106847.267067
+286083.102748 9106845.222543
+286048.339871 9106848.196230
+285926.125465 9106852.073708
+285885.392160 9106854.035835
+285814.857875 9106857.972615
+285666.817672 9106863.828664
+285642.921576 9106857.773643
+285622.993617 9106850.718654
+285607.055617 9106845.677394
+285595.107574 9106842.649867
+285578.153907 9106834.593750
+285568.179024 9106829.559395
+285557.210292 9106824.523882
+285548.236538 9106820.495239
+285486.632272 9106822.432758
+285483.279902 9106771.196516
+285436.350820 9106741.005224
+285385.431858 9106708.800104
+285377.871683 9106625.413111
+285375.687767 9106598.287541
+285310.130144 9106603.233805
+285251.522158 9106607.183546
+285175.996923 9106608.099736
+285145.136770 9106601.031689
+285131.179314 9106594.987987
+285115.205118 9106584.923686
+285094.196337 9106565.812450
+285069.284783 9106556.742201
+285054.369798 9106555.720138
+285040.477699 9106558.717503
+285006.715882 9106562.696082
+285001.724862 9106559.676543
+284962.725250 9106526.480265
+284903.725384 9106476.182889
+284902.412275 9106431.980746
+284896.391151 9106423.937180
+284874.279860 9106389.756113
+284857.079797 9106347.544344
+284853.945925 9106326.444902
+284856.767867 9106304.347925
+284846.655338 9106280.226569
+284824.478900 9106237.004337
+284791.181704 9106167.650389
+284787.133822 9106157.600007
+284769.027148 9106127.441806
+284682.897201 9106035.924881
+284664.863137 9106015.812298
+284659.763481 9105997.724163
+284663.622866 9105981.655771
+284665.538063 9105971.612436
+284667.446011 9105960.564532
+284673.895525 9105890.252944
+284675.716502 9105867.150212
+284668.643699 9105851.068854
+284658.545917 9105828.956542
+284638.444590 9105797.791303
+284598.242030 9105735.460777
+284527.976883 9105776.564235
+284422.114558 9105842.739247
+284396.412403 9105861.795287
+284337.093522 9105904.920707
+284265.935314 9105960.086685
+284222.423514 9105990.171572
+284178.933363 9106023.270146
+284107.535962 9106045.285081
+284099.606932 9106048.289275
+284039.163403 9106073.330930
+284008.412133 9106081.330560
+283893.241952 9106097.265279
+283797.941296 9106112.219089
+283780.073766 9106115.211265
+283742.336546 9106119.184054
+283492.067806 9106143.995853
+283488.092415 9106143.991039
+283358.957146 9106152.875588
+283250.685357 9106160.780588
+283101.817103 9106189.731798
+283067.097243 9106198.730573
+283034.365066 9106207.731751
+282993.689267 9106217.727775
+282960.928204 9106222.710592
+282903.342442 9106230.676732
+282892.460530 9106237.695407
+282881.607452 9106248.732395
+282873.735930 9106259.773032
+282784.742389 9106184.321225
+282786.614780 9106168.250392
+282790.539738 9106161.223212
+282780.565185 9106156.188125
+282772.585543 9106152.160054
+282770.583427 9106150.148457
+282766.550368 9106142.106943
+282758.649999 9106149.129244
+282745.823605 9106162.172923
+282747.948227 9106181.262375
+282751.102739 9106205.375945
+282741.365986 9106233.491979
+282725.615655 9106254.568638
+282713.833524 9106274.645595
+282700.078084 9106296.729271
+282687.316489 9106318.814166
+282671.551697 9106337.881659
+282654.785830 9106355.943348
+282640.987112 9106371.999537
+282637.134167 9106389.072516
+282646.179760 9106403.147625
+282670.089997 9106411.213556
+282695.995162 9106420.286490
+282715.022605 9106440.401251
+282720.200907 9106469.540156
+282704.457717 9106491.621407
+282676.658471 9106495.605587
+282653.814104 9106497.586692
+282626.029254 9106503.580003
+282608.161382 9106506.571769
+282581.298329 9106502.520472
+282552.425945 9106495.452972
+282526.556756 9106491.402862
+282499.679303 9106485.342351
+282473.802916 9106480.287627
+282459.766440 9106463.192609
+282452.636588 9106439.074089
+282438.607336 9106422.983640
+282422.604777 9106408.899899
+282399.688413 9106400.835049
+282374.870726 9106404.822714
+282352.040751 9106408.812821
+282327.201454 9106409.786716
+282305.271757 9106400.718462
+282293.194294 9106379.607498
+282279.165112 9106363.516981
+282268.095926 9106344.416398
+282253.008142 9106319.283397
+282242.932839 9106300.184032
+282231.849298 9106279.074267
+282218.799641 9106260.975782
+282198.872135 9106253.919081
+282175.041144 9106256.903269
+282166.211529 9106272.965506
+282169.322593 9106291.051692
+282183.344521 9106306.137677
+282193.391025 9106321.218731
+282175.623873 9106338.274473
+282164.691422 9106338.260925
+282157.856707 9106355.330211
+282146.067076 9106374.402503
+282125.282336 9106386.431623
+282105.397932 9106385.402389
+282101.379332 9106379.369959
+282099.377225 9106377.358327
+282097.375119 9106375.346695
+282089.409850 9106373.327664
+282087.429322 9106374.329781
+282084.469319 9106377.339831
+282077.634568 9106394.409113
+282074.768066 9106410.478745
+282073.817360 9106416.505011
+282075.977708 9106440.617476
+282077.129813 9106462.719540
+282076.322969 9106488.837471
+282072.469799 9106505.910454
+282047.666368 9106511.907126
+282029.798398 9106514.898673
+282009.899545 9106511.860242
+282003.929170 9106510.848253
+281980.112391 9106515.841541
+281962.244409 9106518.833062
+281956.216508 9106509.784395
+281936.332035 9106508.755099
+281910.534701 9106514.750464
+281886.804166 9106531.798717
+281881.928299 9106544.852128
+281876.108887 9106564.936393
+281890.181174 9106587.054560
+281895.315868 9106610.166178
+281894.516126 9106637.288714
+281892.708139 9106662.400846
+281891.929973 9106692.537135
+281886.160895 9106719.653492
+281868.429426 9106741.732098
+281849.668123 9106758.786542
+281826.873809 9106767.799359
+281804.093861 9106778.821335
+281779.304592 9106786.827073
+281755.487620 9106791.820283
+281731.749700 9106807.863917
+281682.056097 9106807.801951
+281650.137218 9106791.688896
+281629.215611 9106784.630739
+281607.314505 9106779.580499
+281584.455448 9106779.551935
+281560.580967 9106776.508358
+281538.665499 9106769.448911
+281513.775601 9106763.390305
+281485.932817 9106761.346297
+281462.043977 9106756.293491
+281441.187020 9106758.276514
+281426.379456 9106772.322044
+281411.593422 9106789.381331
+281400.797232 9106808.454774
+281386.054257 9106831.541579
+281366.341893 9106854.622151
+281343.497125 9106856.602647
+281320.602105 9106851.551022
+281300.681534 9106845.498541
+281277.793696 9106841.451479
+281262.986047 9106855.496973
+281252.196953 9106875.574987
+281231.390144 9106884.590043
+281221.487262 9106889.600486
+281231.569559 9106909.704736
+281241.630336 9106926.795219
+281246.815038 9106956.939092
+281231.035001 9106973.997102
+281205.179809 9106971.955446
+281185.273536 9106967.912099
+281174.513092 9106992.008460
+281183.615879 9107014.120646
+281198.681956 9107036.240323
+281226.725912 9107066.412926
+281197.960793 9107074.413412
+281176.095416 9107074.385926
+281163.268255 9107087.429323
+281153.494492 9107110.522350
+281148.797775 9107148.690448
+281155.884129 9107166.781781
+281180.724025 9107165.808425
+281170.878496 9107178.855577
+281151.094125 9107191.890234
+281136.250457 9107200.912782
+281438.148767 9107445.403718
+281608.166309 9107593.288558
+281720.179556 9107690.871708
+281724.638380 9107619.552371
+281738.669333 9107497.011567
+281748.645655 9107363.415399
+281758.550116 9107219.773389
+281808.395172 9107240.931431
+283354.863807 9107932.963540
+283987.023492 9108216.002645
+284325.526238 9108434.393547
+284331.518619 9108438.418862
+284367.581759 9108477.639276
+284386.770512 9108519.853450
+284430.995409 9108588.215655
+284470.229190 9108653.558235
+284518.451753 9108724.938666
+284532.576904 9108754.087489
+284555.886813 9108816.397552
+284574.161932 9108869.660648
+284608.883132 9108860.660297
+284843.907101 9108787.602242
+285415.161571 9108618.495205
+285496.500505 9108596.488856
+285525.279652 9108590.494705
+285530.132592 9108574.427423
+285534.970967 9108556.351014
+285558.249020 9108477.018024
+285573.692445 9108413.748882
+285589.274209 9108369.566439
+285598.980030 9108337.431880
+285618.333389 9108265.126261
+285649.314710 9108151.647318
+285930.969928 9107794.350127
+285940.894065 9107792.352410
+286242.571115 9107729.410860
+286324.894355 9107706.400061
+286503.469190 9107662.402993
+286543.136196 9107650.393430
+286630.406429 9107624.374110
+286713.679166 9107595.336476
+286757.299553 9107580.317579
+286507.928982 9107455.470770
+Region 1
+79
+283358.957146 9106152.875588
+283353.843512 9106132.778031
+283349.774267 9106119.713713
+283341.700758 9106102.626261
+283323.645472 9106079.499273
+283317.639079 9106073.464569
+283310.595531 9106061.401197
+283305.539681 9106049.340238
+283302.449873 9106034.267965
+283296.176441 9105991.063919
+283292.071148 9105972.976704
+283284.933808 9105947.853823
+283262.506365 9105869.470221
+283247.245163 9105820.227796
+283240.136752 9105799.123203
+283236.045948 9105783.045126
+283230.975736 9105768.974991
+283203.523331 9105821.179089
+283174.903895 9105849.272114
+283160.053960 9105857.290552
+283146.190649 9105864.305622
+283134.516990 9105899.451287
+283129.742526 9105926.568820
+283120.754644 9105920.530440
+283081.785543 9105891.350365
+283033.527046 9105952.570130
+283006.909529 9105982.674678
+282997.035957 9105991.703732
+282982.193146 9106000.726708
+282942.547395 9106015.746753
+282900.899497 9106028.755177
+282886.020605 9106032.755234
+282873.223115 9106049.817249
+282874.418800 9106077.946678
+282872.582480 9106099.040402
+282855.679820 9106098.015125
+282832.770812 9106090.955058
+282815.810495 9106081.893131
+282807.809246 9106074.851325
+282786.729411 9106045.692919
+282782.674745 9106034.637666
+282781.457506 9106003.494481
+282779.253633 9105973.354655
+282777.107413 9105951.251464
+282774.946787 9105927.139113
+282773.859270 9105914.078358
+282770.805679 9105904.028900
+282766.808678 9105901.010278
+282760.838396 9105899.998374
+282756.863011 9105899.993490
+282754.918547 9105906.018527
+282744.087102 9105920.069212
+282745.217839 9105939.157448
+282747.400067 9105966.283543
+282748.602864 9105995.417576
+282753.781063 9106024.556490
+282758.916039 9106047.667923
+282774.947342 9106065.769874
+282791.986921 9106085.882194
+282792.167091 9106110.996679
+282775.451792 9106136.090440
+282766.550368 9106142.106943
+282770.583427 9106150.148457
+282772.585543 9106152.160054
+282780.565185 9106156.188125
+282790.539738 9106161.223212
+282786.614780 9106168.250392
+282784.742389 9106184.321225
+282873.735930 9106259.773032
+282881.607452 9106248.732395
+282892.460530 9106237.695407
+282903.342442 9106230.676732
+282960.928204 9106222.710592
+282993.689267 9106217.727775
+283034.365066 9106207.731751
+283067.097243 9106198.730573
+283101.817103 9106189.731798
+283250.685357 9106160.780588
+283358.957146 9106152.875588
+Region 1
+123
+283447.272387 9105304.123410
+283456.813751 9105248.883810
+283443.971371 9105121.288118
+283434.875418 9105100.181126
+283429.805281 9105086.111005
+283409.979291 9105093.118828
+283357.414771 9105108.123277
+283337.545474 9105109.103611
+283280.846922 9105102.002433
+283191.316063 9105089.838187
+283145.535184 9105080.741042
+283127.322894 9105174.143677
+283123.441297 9105187.198325
+283111.868586 9105236.408049
+282968.166762 9105292.487821
+282978.429367 9105337.706059
+282979.452026 9105341.725594
+282962.672170 9105357.778129
+282942.896389 9105371.817843
+282940.095037 9105396.928658
+282953.144596 9105415.026930
+282962.182792 9105428.097427
+282942.406986 9105442.137148
+282918.482883 9105432.062089
+282897.619552 9105433.041046
+282891.692567 9105438.056619
+282890.850041 9105459.151562
+282881.062991 9105480.235521
+282852.335396 9105493.259651
+282830.499804 9105497.251101
+282812.524293 9105485.174156
+282803.514930 9105476.121941
+282777.581539 9105463.030619
+282759.663672 9105458.990285
+282750.704740 9105456.970115
+282747.644007 9105445.916064
+282747.593593 9105438.884004
+282733.528654 9105417.770690
+282722.596460 9105417.757224
+282711.707473 9105423.771237
+282701.769113 9105423.758991
+282691.845154 9105425.755903
+282674.978741 9105429.753398
+282668.108289 9105441.799785
+282655.253212 9105450.825078
+282639.409419 9105458.842110
+282617.616993 9105468.860942
+282596.775200 9105472.853507
+282563.035103 9105479.843851
+282545.210797 9105488.862982
+282527.400878 9105499.891271
+282524.556113 9105518.974629
+282529.683656 9105541.081555
+282521.884089 9105562.167936
+282506.105003 9105579.226167
+282498.283829 9105597.298804
+282497.441133 9105618.393783
+282505.571807 9105643.518139
+282516.669624 9105666.637012
+282531.728428 9105687.751624
+282550.705028 9105700.834487
+282568.666196 9105710.902371
+282576.645740 9105714.930502
+282590.617144 9105722.984309
+282612.568102 9105735.066234
+282632.545785 9105749.154857
+282650.535792 9105763.241020
+282667.582381 9105784.358011
+282685.608425 9105803.467054
+282704.657144 9105826.595629
+282718.715045 9105846.704341
+282734.746243 9105864.806329
+282757.755989 9105885.930595
+282756.863011 9105899.993490
+282760.838396 9105899.998374
+282766.808678 9105901.010278
+282770.805679 9105904.028900
+282773.859270 9105914.078358
+282774.946787 9105927.139113
+282777.107413 9105951.251464
+282779.253633 9105973.354655
+282781.457506 9106003.494481
+282782.674745 9106034.637666
+282786.729411 9106045.692919
+282807.809246 9106074.851325
+282815.810495 9106081.893131
+282832.770812 9106090.955058
+282855.679820 9106098.015125
+282872.582480 9106099.040402
+282874.418800 9106077.946678
+282873.223115 9106049.817249
+282886.020605 9106032.755234
+282900.899497 9106028.755177
+282942.547395 9106015.746753
+282982.193146 9106000.726708
+282997.035957 9105991.703732
+283006.909529 9105982.674678
+283033.527046 9105952.570130
+283081.785543 9105891.350365
+283120.754644 9105920.530440
+283129.742526 9105926.568820
+283134.516990 9105899.451287
+283146.190649 9105864.305622
+283160.053960 9105857.290552
+283174.903895 9105849.272114
+283203.523331 9105821.179089
+283230.975736 9105768.974991
+283243.794657 9105754.926655
+283287.184490 9105707.764804
+283315.746043 9105671.635130
+283330.451559 9105643.525128
+283341.210578 9105619.428595
+283346.071518 9105604.365993
+283359.869763 9105588.309700
+283379.551628 9105561.210317
+283386.335270 9105537.108946
+283389.251823 9105528.071386
+283401.897426 9105489.913200
+283421.478193 9105448.749747
+283436.133076 9105413.607708
+283437.047519 9105402.558579
+283440.799113 9105371.421552
+283447.272387 9105304.123410
+Region 1
+59
+284396.412403 9105861.795287
+284392.221700 9105694.028424
+284396.090407 9105541.339596
+284213.647954 9105461.760910
+284141.026113 9105451.628183
+284086.379983 9105453.571696
+284076.441690 9105453.559756
+284050.602128 9105453.528702
+283987.040416 9105459.479635
+283943.340812 9105463.445280
+283778.596137 9105495.392649
+283615.838751 9105527.341876
+283503.701595 9105550.310934
+283478.855731 9105550.280770
+283462.939940 9105548.252306
+283434.075425 9105542.189832
+283412.146104 9105533.122067
+283389.251823 9105528.071386
+283386.335270 9105537.108946
+283379.551628 9105561.210317
+283359.869763 9105588.309700
+283346.071518 9105604.365993
+283341.210578 9105619.428595
+283330.451559 9105643.525128
+283315.746043 9105671.635130
+283287.184490 9105707.764804
+283243.794657 9105754.926655
+283230.975736 9105768.974991
+283236.045948 9105783.045126
+283240.136752 9105799.123203
+283247.245163 9105820.227796
+283262.506365 9105869.470221
+283284.933808 9105947.853823
+283292.071148 9105972.976704
+283296.176441 9105991.063919
+283302.449873 9106034.267965
+283305.539681 9106049.340238
+283310.595531 9106061.401197
+283317.639079 9106073.464569
+283323.645472 9106079.499273
+283341.700758 9106102.626261
+283349.774267 9106119.713713
+283353.843512 9106132.778031
+283358.957146 9106152.875588
+283488.092415 9106143.991039
+283492.067806 9106143.995853
+283742.336546 9106119.184054
+283780.073766 9106115.211265
+283797.941296 9106112.219089
+283893.241952 9106097.265279
+284008.412133 9106081.330560
+284039.163403 9106073.330930
+284099.606932 9106048.289275
+284107.535962 9106045.285081
+284178.933363 9106023.270146
+284222.423514 9105990.171572
+284265.935314 9105960.086685
+284337.093522 9105904.920707
+284396.412403 9105861.795287
+Region 1
+153
+285443.486256 9105116.645893
+285441.375203 9105099.565952
+285438.263079 9105081.480280
+285425.988852 9105033.247150
+285408.687534 9104976.971649
+285297.678123 9105018.028003
+285015.275008 9105133.219113
+284814.102510 9105212.341056
+284766.558556 9105234.384951
+284751.694719 9105240.394663
+284730.867950 9105246.397287
+284720.929739 9105246.385478
+284709.997705 9105246.372487
+284660.205227 9105232.249427
+284413.288661 9105169.672129
+284264.898181 9105126.298265
+284270.694721 9105103.200265
+284269.635794 9105094.157928
+284272.537681 9105083.111214
+284276.418918 9105070.056549
+284282.323963 9105062.027126
+284286.248601 9105054.999891
+284289.186654 9105048.976036
+284293.096822 9105039.939657
+284293.982128 9105024.872274
+284291.929384 9105015.828746
+284289.912812 9105011.808076
+284287.896239 9105007.787406
+284283.877563 9105001.755209
+284280.867174 9104997.733346
+284273.932148 9105000.738717
+284266.989888 9105002.739515
+284264.015667 9105003.740510
+284256.065120 9105003.730970
+284252.097080 9105004.730772
+284250.189007 9105015.778677
+284252.234510 9105023.817637
+284244.312892 9105027.826384
+284236.376806 9105029.825986
+284227.367341 9105020.774101
+284218.350647 9105010.717642
+284168.471696 9104984.539068
+284153.528267 9104979.498285
+284144.547749 9104974.464668
+284118.592794 9104958.360424
+284094.632720 9104943.263127
+284077.651070 9104931.187910
+284079.530274 9104916.121711
+284080.451804 9104906.077180
+284081.402249 9104900.050939
+284078.384655 9104895.024484
+284068.374203 9104884.966783
+284061.330749 9104872.903526
+284050.348172 9104865.858340
+284029.470800 9104864.828608
+284008.593427 9104863.798866
+283998.662488 9104864.791451
+283987.766637 9104869.801128
+283972.960550 9104883.847166
+283956.145141 9104894.877081
+283934.295605 9104896.859829
+283909.515185 9104905.870981
+283897.647166 9104913.893161
+283877.850266 9104924.919452
+283855.035780 9104930.919260
+283811.213848 9104917.806893
+283803.219963 9104911.769823
+283798.207535 9104905.736361
+283787.203308 9104895.677380
+283780.224913 9104892.655232
+283771.280547 9104892.644398
+283760.370208 9104895.644878
+283747.450566 9104895.629223
+283732.557728 9104897.620304
+283722.612319 9104896.603682
+283709.671013 9104893.574291
+283695.699789 9104885.520816
+283693.704931 9104884.513830
+283688.721398 9104882.498651
+283684.753343 9104883.498403
+283679.791469 9104884.496949
+283671.855358 9104886.496451
+283660.887254 9104881.460307
+283653.843894 9104869.396959
+283659.698520 9104854.335570
+283667.591312 9104846.308620
+283670.543890 9104842.293939
+283671.494393 9104836.267694
+283670.435603 9104827.225311
+283666.481990 9104830.234211
+283652.676823 9104845.285946
+283637.885048 9104861.341048
+283624.087081 9104877.397355
+283617.094257 9104872.366027
+283584.659111 9104922.554951
+283563.018803 9104953.670220
+283551.186775 9104966.715206
+283531.497986 9104992.810007
+283510.880303 9105027.944779
+283486.366677 9105074.125049
+283466.533491 9105080.128318
+283452.605519 9105078.102228
+283429.805281 9105086.111005
+283434.875418 9105100.181126
+283443.971371 9105121.288118
+283456.813751 9105248.883810
+283447.272387 9105304.123410
+283440.799113 9105371.421552
+283437.047519 9105402.558579
+283436.133076 9105413.607708
+283421.478193 9105448.749747
+283401.897426 9105489.913200
+283389.251823 9105528.071386
+283412.146104 9105533.122067
+283434.075425 9105542.189832
+283462.939940 9105548.252306
+283478.855731 9105550.280770
+283503.701595 9105550.310934
+283615.838751 9105527.341876
+283778.596137 9105495.392649
+283943.340812 9105463.445280
+283987.040416 9105459.479635
+284050.602128 9105453.528702
+284076.441690 9105453.559756
+284086.379983 9105453.571696
+284141.026113 9105451.628183
+284213.647954 9105461.760910
+284396.090407 9105541.339596
+284392.221700 9105694.028424
+284396.412403 9105861.795287
+284422.114558 9105842.739247
+284527.976883 9105776.564235
+284598.242030 9105735.460777
+284672.366413 9105678.288851
+284689.116606 9105658.217521
+284714.767772 9105632.129386
+284756.218703 9105591.996134
+284769.037004 9105577.947489
+284810.458842 9105533.795936
+284894.267103 9105441.475675
+284919.968781 9105422.419454
+284957.429542 9105380.272264
+285015.608198 9105317.053799
+285067.221614 9105308.073715
+285134.685336 9105292.080354
+285230.998770 9105280.139094
+285248.873001 9105278.151008
+285346.245465 9105275.251776
+285424.880543 9105292.421505
+285446.817161 9105302.492783
+285448.274721 9105229.161857
+285447.737415 9105154.824033
+285443.486256 9105116.645893
+Region 1
+150
+286787.386468 9106386.947715
+286710.656845 9106358.733086
+286714.486271 9106338.646457
+286721.940842 9106270.345583
+286734.145714 9106171.913639
+286744.479648 9106089.552359
+286754.915706 9106021.254889
+286755.566683 9105974.041812
+286759.359625 9105948.932400
+286774.626208 9105861.554002
+286783.227785 9105814.349986
+286793.831588 9105769.157351
+286796.740110 9105759.115173
+286736.979543 9105740.965155
+286647.346041 9105714.744517
+286635.405605 9105712.721768
+286618.488773 9105709.688776
+286546.758707 9105685.497478
+286525.866599 9105682.459894
+286507.955954 9105679.425717
+286443.219134 9105660.264999
+286440.969208 9105624.098575
+286429.021508 9105621.071205
+286391.227194 9105617.009586
+286358.401982 9105612.953648
+286315.653129 9105610.895369
+286299.759279 9105611.881627
+286273.934499 9105613.860996
+286232.237697 9105619.840266
+286193.566021 9105631.850306
+286133.980374 9105637.808855
+286102.170780 9105636.767560
+286068.344428 9105631.705697
+286033.480597 9105620.615287
+285989.650549 9105606.500802
+285954.743096 9105589.382948
+285932.798993 9105578.307417
+285869.948204 9105545.084206
+285849.999052 9105535.015495
+285840.017207 9105528.976573
+285766.169074 9105486.699409
+285671.363624 9105432.342994
+285617.464814 9105400.134328
+285601.469246 9105387.056425
+285565.517388 9105362.905079
+285544.560015 9105350.825905
+285533.584423 9105344.785733
+285477.719942 9105315.588219
+285446.817161 9105302.492783
+285424.880543 9105292.421505
+285346.245465 9105275.251776
+285248.873001 9105278.151008
+285230.998770 9105280.139094
+285134.685336 9105292.080354
+285067.221614 9105308.073715
+285015.608198 9105317.053799
+284957.429542 9105380.272264
+284919.968781 9105422.419454
+284894.267103 9105441.475675
+284810.458842 9105533.795936
+284769.037004 9105577.947489
+284756.218703 9105591.996134
+284714.767772 9105632.129386
+284689.116606 9105658.217521
+284672.366413 9105678.288851
+284598.242030 9105735.460777
+284638.444590 9105797.791303
+284658.545917 9105828.956542
+284668.643699 9105851.068854
+284675.716502 9105867.150212
+284673.895525 9105890.252944
+284667.446011 9105960.564532
+284665.538063 9105971.612436
+284663.622866 9105981.655771
+284659.763481 9105997.724163
+284664.863137 9106015.812298
+284682.897201 9106035.924881
+284769.027148 9106127.441806
+284787.133822 9106157.600007
+284791.181704 9106167.650389
+284824.478900 9106237.004337
+284846.655338 9106280.226569
+284856.767867 9106304.347925
+284853.945925 9106326.444902
+284857.079797 9106347.544344
+284874.279860 9106389.756113
+284896.391151 9106423.937180
+284902.412275 9106431.980746
+284903.725384 9106476.182889
+284962.725250 9106526.480265
+285001.724862 9106559.676543
+285006.715882 9106562.696082
+285040.477699 9106558.717503
+285054.369798 9106555.720138
+285069.284783 9106556.742201
+285094.196337 9106565.812450
+285115.205118 9106584.923686
+285131.179314 9106594.987987
+285145.136770 9106601.031689
+285175.996923 9106608.099736
+285251.522158 9106607.183546
+285310.130144 9106603.233805
+285375.687767 9106598.287541
+285377.871683 9106625.413111
+285385.431858 9106708.800104
+285436.350820 9106741.005224
+285483.279902 9106771.196516
+285486.632272 9106822.432758
+285548.236538 9106820.495239
+285557.210292 9106824.523882
+285568.179024 9106829.559395
+285578.153907 9106834.593750
+285595.107574 9106842.649867
+285607.055617 9106845.677394
+285622.993617 9106850.718654
+285642.921576 9106857.773643
+285666.817672 9106863.828664
+285814.857875 9106857.972615
+285885.392160 9106854.035835
+285926.125465 9106852.073708
+286048.339871 9106848.196230
+286083.102748 9106845.222543
+286113.926643 9106847.267067
+286153.687890 9106848.317277
+286202.422919 9106853.395950
+286267.154277 9106871.552061
+286315.991373 9106890.694436
+286359.822799 9106904.808273
+286413.600027 9106919.937967
+286435.493878 9106923.981160
+286461.348540 9106926.019758
+286493.159000 9106927.060580
+286518.977186 9106924.076352
+286537.838424 9106921.084186
+286560.638574 9106913.073748
+286576.386933 9106891.996127
+286586.215970 9106876.939066
+286636.362210 9106802.659439
+286677.665870 9106742.433434
+286710.112420 9106694.251942
+286727.833733 9106671.167444
+286751.452392 9106639.048700
+286770.109117 9106607.928866
+286773.046847 9106601.904907
+286777.964958 9106594.878648
+286802.482502 9106549.701780
+286826.934312 9106495.483896
+286843.457284 9106444.270661
+286853.169369 9106413.140673
+286787.386468 9106386.947715
+Region 1
+360
+286544.090328 9105043.586503
+286505.171614 9105021.441655
+286493.209518 9105016.405145
+286467.334131 9105011.352624
+286438.477327 9105006.296654
+286437.447110 9105001.272710
+286435.109974 9104953.051548
+286379.992012 9104889.701274
+286337.815489 9104829.379492
+286309.676043 9104786.151250
+286286.607544 9104756.992574
+286232.440204 9104687.615788
+286219.280714 9104654.450312
+286210.169193 9104631.335044
+286201.021312 9104603.196965
+286189.885849 9104575.056578
+286185.779727 9104556.969864
+286167.673163 9104526.812276
+286148.594647 9104499.667206
+286139.425032 9104468.515412
+286136.218209 9104437.370536
+286147.004518 9104417.291993
+286155.795957 9104396.206580
+286165.515734 9104366.081267
+286168.242590 9104330.925070
+286169.401191 9104216.407348
+286164.924319 9104147.087971
+286165.569107 9104098.870161
+286167.309481 9104064.717371
+286187.735491 9104003.463361
+286176.847470 9104009.478025
+286168.933534 9104014.491592
+286149.304988 9104048.623585
+286138.467839 9104061.670177
+286122.683554 9104077.724674
+286065.283713 9104110.808143
+286008.819425 9104135.856216
+285953.392449 9104166.932769
+285920.771731 9104191.004013
+285899.068157 9104213.078880
+285875.376977 9104235.151419
+285871.430866 9104239.165029
+285817.266205 9104307.411479
+285791.710828 9104346.559254
+285766.068251 9104373.652259
+285738.539730 9104414.806826
+285721.783165 9104433.873773
+285702.052454 9104453.941790
+285672.550759 9104497.103143
+285633.154575 9104546.280233
+285606.648691 9104591.454193
+285561.108039 9104615.510146
+285540.288998 9104622.517617
+285525.381953 9104622.500123
+285508.429229 9104614.443770
+285476.504143 9104597.328810
+285456.599056 9104593.287191
+285439.711665 9104594.271896
+285418.914372 9104604.293010
+285374.367365 9104628.349969
+285322.080262 9104681.529947
+285309.226085 9104690.555823
+285286.448351 9104701.579117
+285276.611850 9104715.631332
+285261.820818 9104731.686821
+285217.607364 9104664.329278
+285167.373222 9104588.928075
+285139.147930 9104533.643984
+285115.949726 9104486.402278
+285096.654299 9104429.119581
+285083.314488 9104370.839360
+285080.115652 9104340.698799
+285079.992440 9104323.621149
+285086.601141 9104275.410149
+285110.089887 9104225.210040
+285146.396452 9104160.961292
+285182.673933 9104092.694269
+285200.279499 9104053.537332
+285218.944074 9104023.422674
+285279.834113 9103923.038897
+285302.408495 9103883.887832
+285326.897912 9103834.693448
+285328.791229 9103821.636434
+285329.553005 9103789.491481
+285323.307542 9103750.306334
+285318.193624 9103730.209124
+285288.634509 9103627.709207
+285284.557904 9103613.640564
+285278.276302 9103569.432558
+285278.015384 9103533.268149
+285279.843498 9103511.170032
+285280.786545 9103504.139242
+285287.525574 9103474.010479
+285301.184808 9103438.867126
+285333.602574 9103386.668510
+285382.653500 9103298.325496
+285416.035872 9103242.109774
+285428.766441 9103216.006340
+285468.923865 9103134.684688
+285489.524793 9103097.540428
+285497.322698 9103076.453945
+285359.986877 9103049.168258
+285293.317399 9103037.034452
+285191.808065 9103016.822631
+284933.080524 9102968.295174
+284919.138805 9102964.260259
+284928.729153 9102916.052827
+284933.509851 9102889.939973
+284702.492808 9102825.371095
+284699.569350 9102833.404076
+284637.587052 9102782.096883
+284483.643729 9102656.341002
+284478.703803 9102660.353289
+284426.395427 9102710.518258
+284424.436789 9102714.534144
+284419.540193 9102724.573860
+284410.762435 9102747.668208
+284395.179987 9102791.850163
+284367.607275 9102826.976551
+284353.745063 9102833.991733
+284339.882845 9102841.006911
+284321.058994 9102849.020647
+284297.287948 9102860.042079
+284244.820281 9102888.106332
+284205.170498 9102902.122178
+284144.680334 9102920.130966
+284045.432936 9102938.092583
+283930.270584 9102954.025481
+283924.315150 9102955.022792
+283911.461003 9102964.048223
+283894.675029 9102979.096255
+283880.870372 9102994.147918
+283867.051279 9103007.190429
+283851.251838 9103021.235088
+283831.470067 9103034.270320
+283811.681071 9103046.300970
+283790.855015 9103052.302949
+283791.906486 9103060.340765
+283788.053972 9103077.413694
+283771.397718 9103110.544057
+283763.577290 9103128.616708
+283756.700158 9103139.658544
+283743.867554 9103151.697673
+283713.269476 9103180.792733
+283704.404762 9103191.832137
+283692.558701 9103202.867897
+283685.717592 9103218.932608
+283682.808348 9103228.974723
+283680.885675 9103238.013476
+283686.085318 9103270.165976
+283691.270553 9103300.309322
+283693.330228 9103310.357507
+283697.435161 9103328.444727
+283693.524923 9103337.481053
+283680.699466 9103350.524757
+283673.793447 9103357.548289
+283725.737099 9103394.780692
+283715.093936 9103434.950373
+283706.330156 9103460.053847
+283693.692186 9103499.216529
+283682.148957 9103552.444485
+283670.648989 9103611.699898
+283661.107744 9103666.939436
+283688.905063 9103662.955084
+283689.236857 9103709.165562
+283685.708902 9103771.444402
+283686.069577 9103821.673180
+283684.204618 9103838.748542
+283681.374719 9103859.840995
+283674.576847 9103881.933178
+283668.729486 9103897.999119
+283664.833648 9103909.044605
+283663.991338 9103930.139482
+283677.962218 9103938.193044
+283677.991075 9103942.211346
+283675.081822 9103952.253468
+283673.173581 9103963.301377
+283672.251925 9103973.345922
+283677.293061 9103983.397732
+283684.307369 9103991.442811
+283685.423817 9104008.521804
+283685.524824 9104022.585861
+283683.623801 9104034.638346
+283678.726949 9104044.678049
+283673.801236 9104050.699450
+283669.912610 9104062.749514
+283662.214716 9104097.899974
+283657.476578 9104130.040340
+283655.618840 9104148.120279
+283650.707545 9104156.150832
+283642.822054 9104165.182328
+283655.820858 9104176.248395
+283745.270342 9104177.361801
+283755.554803 9104225.593482
+283760.646522 9104242.677295
+283768.762968 9104265.792177
+283777.822702 9104281.876239
+283777.945415 9104298.954011
+283778.060910 9104315.027208
+283775.194990 9104331.096785
+283769.390961 9104353.190190
+283760.648818 9104381.307425
+283757.847860 9104406.418177
+283761.024190 9104433.545318
+283764.121118 9104449.622135
+283761.247976 9104464.687138
+283760.326358 9104474.731680
+283754.464567 9104488.788490
+283746.680125 9104511.884061
+283741.855452 9104531.969527
+283742.979206 9104550.053082
+283746.105024 9104570.148198
+283752.118428 9104577.187458
+283816.235056 9104648.589381
+283830.285647 9104667.693150
+283832.316604 9104673.723003
+283833.375414 9104682.765376
+283832.461041 9104693.814490
+283824.893293 9104747.047302
+283819.060399 9104765.122420
+283814.235761 9104785.207890
+283811.348200 9104798.263747
+283807.466822 9104811.318400
+283796.542062 9104812.309735
+283777.673989 9104814.296009
+283753.807945 9104812.257954
+283740.873886 9104810.233142
+283730.906836 9104806.202792
+283716.942861 9104799.153892
+283710.007804 9104802.159178
+283686.257270 9104816.194286
+283670.435603 9104827.225311
+283671.494393 9104836.267694
+283670.543890 9104842.293939
+283667.591312 9104846.308620
+283659.698520 9104854.335570
+283653.843894 9104869.396959
+283660.887254 9104881.460307
+283671.855358 9104886.496451
+283679.791469 9104884.496949
+283684.753343 9104883.498403
+283688.721398 9104882.498651
+283693.704931 9104884.513830
+283695.699789 9104885.520816
+283709.671013 9104893.574291
+283722.612319 9104896.603682
+283732.557728 9104897.620304
+283747.450566 9104895.629223
+283760.370208 9104895.644878
+283771.280547 9104892.644398
+283780.224913 9104892.655232
+283787.203308 9104895.677380
+283798.207535 9104905.736361
+283803.219963 9104911.769823
+283811.213848 9104917.806893
+283855.035780 9104930.919260
+283877.850266 9104924.919452
+283897.647166 9104913.893161
+283909.515185 9104905.870981
+283934.295605 9104896.859829
+283956.145141 9104894.877081
+283972.960550 9104883.847166
+283987.766637 9104869.801128
+283998.662488 9104864.791451
+284008.593427 9104863.798866
+284029.470800 9104864.828608
+284050.348172 9104865.858340
+284061.330749 9104872.903526
+284068.374203 9104884.966783
+284078.384655 9104895.024484
+284081.402249 9104900.050939
+284080.451804 9104906.077180
+284079.530274 9104916.121711
+284077.651070 9104931.187910
+284094.632720 9104943.263127
+284118.592794 9104958.360424
+284144.547749 9104974.464668
+284153.528267 9104979.498285
+284168.471696 9104984.539068
+284218.350647 9105010.717642
+284227.367341 9105020.774101
+284236.376806 9105029.825986
+284244.312892 9105027.826384
+284252.234510 9105023.817637
+284250.189007 9105015.778677
+284252.097080 9105004.730772
+284256.065120 9105003.730970
+284264.015667 9105003.740510
+284266.989888 9105002.739515
+284273.932148 9105000.738717
+284280.867174 9104997.733346
+284283.877563 9105001.755209
+284287.896239 9105007.787406
+284289.912812 9105011.808076
+284291.929384 9105015.828746
+284293.982128 9105024.872274
+284293.096822 9105039.939657
+284289.186654 9105048.976036
+284286.248601 9105054.999891
+284282.323963 9105062.027126
+284276.418918 9105070.056549
+284272.537681 9105083.111214
+284269.635794 9105094.157928
+284270.694721 9105103.200265
+284264.898181 9105126.298265
+284413.288661 9105169.672129
+284660.205227 9105232.249427
+284709.997705 9105246.372487
+284720.929739 9105246.385478
+284730.867950 9105246.397287
+284751.694719 9105240.394663
+284766.558556 9105234.384951
+284814.102510 9105212.341056
+285015.275008 9105133.219113
+285297.678123 9105018.028003
+285408.687534 9104976.971649
+285425.988852 9105033.247150
+285438.263079 9105081.480280
+285441.375203 9105099.565952
+285443.486256 9105116.645893
+285447.737415 9105154.824033
+285448.274721 9105229.161857
+285446.817161 9105302.492783
+285477.719942 9105315.588219
+285533.584423 9105344.785733
+285544.560015 9105350.825905
+285565.517388 9105362.905079
+285601.469246 9105387.056425
+285617.464814 9105400.134328
+285671.363624 9105432.342994
+285766.169074 9105486.699409
+285840.017207 9105528.976573
+285849.999052 9105535.015495
+285869.948204 9105545.084206
+285932.798993 9105578.307417
+285954.743096 9105589.382948
+285989.650549 9105606.500802
+286033.480597 9105620.615287
+286068.344428 9105631.705697
+286102.170780 9105636.767560
+286133.980374 9105637.808855
+286193.566021 9105631.850306
+286232.237697 9105619.840266
+286273.934499 9105613.860996
+286299.759279 9105611.881627
+286315.653129 9105610.895369
+286358.401982 9105612.953648
+286391.227194 9105617.009586
+286429.021508 9105621.071205
+286440.969208 9105624.098575
+286457.361439 9105554.803364
+286478.562448 9105463.413555
+286500.677089 9105360.974740
+286502.497154 9105337.872157
+286532.212546 9105187.223637
+286536.129505 9105179.191728
+286544.986371 9105167.147287
+286592.033483 9105076.791722
+286581.021460 9105065.729027
+286544.090328 9105043.586503
+Region 1
+262
+285913.629115 9101827.277387
+285903.401655 9101787.083088
+285889.032499 9101723.779107
+285854.201476 9101579.081880
+285847.027867 9101548.936712
+285831.694207 9101489.649751
+285823.447182 9101448.453180
+285819.044646 9101389.179141
+285816.738304 9101344.975927
+285811.044983 9101244.513534
+285806.620811 9101182.225784
+285805.496659 9101164.142433
+285804.437721 9101155.100168
+285797.989926 9101087.787227
+285795.727164 9101049.611389
+285791.245144 9100979.287100
+285783.919643 9100928.046007
+285769.616414 9100873.782947
+285736.345695 9100807.442634
+285716.275822 9100780.295715
+285666.148316 9100718.958033
+285653.106935 9100701.865015
+285599.955041 9100634.496261
+285558.829189 9100581.205586
+285528.735580 9100541.991855
+285474.575907 9100472.612535
+285443.373008 9100417.324439
+285428.199733 9100380.137579
+285416.885605 9100326.882390
+285414.847562 9100319.848033
+285410.540054 9100273.633150
+285408.982275 9100195.275671
+285410.289950 9100100.848680
+285412.743210 9100027.518806
+285412.641983 9100013.454856
+285413.433231 9099985.328148
+285395.409251 9099966.219872
+285361.276449 9099917.959995
+285340.307565 9099903.870941
+285308.509189 9099903.832676
+285064.087877 9099907.556037
+285040.210171 9099903.508913
+285020.300049 9099898.462016
+284994.463828 9099898.430741
+284961.751112 9099909.441300
+284939.076463 9099934.527869
+284930.320846 9099960.635865
+284896.498860 9099955.572053
+284866.694995 9099956.540463
+284833.982185 9099967.550945
+284881.980709 9099871.171230
+284897.641728 9099838.039684
+284865.843322 9099838.001093
+284840.957514 9099831.943500
+284797.126464 9099816.821804
+284767.236094 9099805.735267
+284754.274705 9099799.692123
+284734.371848 9099795.649651
+284704.604125 9099801.640787
+284680.877935 9099818.689462
+284634.549018 9099870.870297
+284576.410930 9099939.109723
+284541.905288 9099977.241043
+284527.071816 9099987.268575
+284512.195074 9099991.268668
+284500.277817 9099992.258678
+284485.314555 9099984.203887
+284465.375562 9099975.138443
+284436.486018 9099965.057480
+284398.494574 9099932.864933
+284377.576323 9099925.807371
+284360.697753 9099927.795831
+284391.128727 9100014.225657
+284401.282030 9100044.375019
+284385.721476 9100091.570522
+284368.360883 9100164.882506
+284353.981398 9100238.198142
+284347.270485 9100272.345136
+284329.981910 9100355.702868
+284349.071539 9100384.858593
+284364.200751 9100416.018592
+284381.245323 9100437.135275
+284439.183723 9100479.397714
+284556.076190 9100566.937214
+284700.944810 9100675.606064
+284715.922793 9100685.669859
+284724.916805 9100692.712704
+284804.984848 9100772.170129
+284853.022922 9100819.442653
+284892.030906 9100854.649454
+284904.150627 9100881.787254
+284909.343195 9100912.934931
+284907.456888 9100926.996514
+284906.520959 9100935.031876
+284892.905009 9100976.202461
+284867.479909 9101033.431773
+284814.685441 9101153.915419
+284811.834276 9101171.994089
+284810.092421 9101206.147089
+284799.305852 9101226.225297
+284777.660455 9101256.336004
+284771.799187 9101270.392790
+284775.925810 9101291.493580
+284785.086123 9101321.641506
+284788.240701 9101345.754803
+284785.331739 9101355.796909
+284781.472386 9101371.865240
+284770.714676 9101395.961735
+284744.172758 9101436.112156
+284727.445374 9101459.196875
+284710.078176 9101531.504370
+284703.122005 9101531.495963
+284698.073856 9101520.439676
+284694.984295 9101505.367506
+284693.853323 9101486.279454
+284688.740181 9101466.182023
+284649.829975 9101306.409490
+284643.730379 9101287.315411
+284617.409577 9101219.977809
+284591.045564 9101146.612739
+284520.199861 9100967.714431
+284504.998117 9100926.508839
+284401.859719 9100955.515640
+284366.711423 9100904.240017
+284342.602368 9100868.046287
+284315.533812 9100834.862614
+284291.590671 9100821.774031
+284287.615769 9100821.769175
+284271.716164 9100821.749748
+284231.081550 9100836.768550
+284206.353731 9100852.811349
+284190.511771 9100860.828490
+284182.569165 9100861.823335
+284166.655122 9100859.794726
+284164.710913 9100865.819739
+284149.977978 9100889.911275
+284140.213671 9100914.008893
+284126.481648 9100939.106219
+284114.686624 9100957.173956
+284099.910401 9100975.238040
+284087.136041 9100995.313707
+284074.361670 9101015.389372
+284062.566609 9101033.457105
+284046.803818 9101052.524539
+284034.987120 9101067.578544
+284022.234326 9101090.667929
+284008.430146 9101105.719495
+283995.648510 9101124.790577
+283987.813920 9101140.854028
+283984.875947 9101146.877822
+283979.115279 9101174.998614
+283976.299789 9101198.100187
+283976.487122 9101224.219143
+283978.683549 9101253.354261
+283980.843954 9101277.466502
+283982.910691 9101288.519265
+283984.991841 9101301.581179
+283988.153203 9101326.699210
+283994.288582 9101350.816319
+283998.342807 9101361.871515
+284003.397981 9101373.932503
+284015.459782 9101393.034033
+284023.553843 9101413.135266
+284034.650757 9101436.253869
+284053.726444 9101463.400493
+284058.788858 9101476.466042
+284070.865136 9101497.576693
+284081.926057 9101515.672400
+284091.006714 9101534.770248
+284103.090237 9101556.885457
+284104.120030 9101561.909543
+284110.183429 9101575.980868
+284119.278536 9101597.087852
+284125.392422 9101618.191191
+284128.496239 9101635.272592
+284129.648627 9101657.374437
+284131.787552 9101678.472920
+284129.886597 9101690.525384
+284128.936119 9101696.551616
+284123.117871 9101716.635821
+284115.297704 9101734.708452
+284105.518882 9101756.796955
+284095.747264 9101779.890031
+284089.943420 9101801.983386
+284085.126111 9101823.073381
+284079.300628 9101842.153014
+284068.520816 9101863.235729
+284061.715996 9101884.323298
+284057.906846 9101907.423656
+284050.129901 9101931.523736
+284043.346702 9101955.625029
+284043.548609 9101983.753114
+284045.745239 9102012.888200
+284059.866920 9102042.037837
+284073.952562 9102066.164594
+284085.013683 9102084.260262
+284101.065226 9102105.375704
+284117.123999 9102127.495711
+284128.170728 9102143.582212
+284141.226620 9102162.684850
+284147.290157 9102176.756144
+284151.315684 9102183.793000
+284162.384087 9102202.893207
+284176.491495 9102230.033625
+284182.562273 9102245.109483
+284183.714778 9102267.211310
+284181.871579 9102287.300364
+284178.055295 9102309.396148
+284173.245250 9102331.490724
+284171.301027 9102337.515748
+284166.454899 9102354.587457
+284164.561186 9102367.644497
+284148.899140 9102400.776089
+284108.019781 9102520.269596
+284090.543304 9102577.508545
+284122.013946 9102669.966798
+284159.642267 9102789.555718
+284181.996091 9102857.893238
+284193.079183 9102879.002535
+284205.170498 9102902.122178
+284244.820281 9102888.106332
+284297.287948 9102860.042079
+284321.058994 9102849.020647
+284339.882845 9102841.006911
+284353.745063 9102833.991733
+284367.607275 9102826.976551
+284395.179987 9102791.850163
+284410.762435 9102747.668208
+284419.540193 9102724.573860
+284424.436789 9102714.534144
+284426.395427 9102710.518258
+284478.703803 9102660.353289
+284483.643729 9102656.341002
+284637.587052 9102782.096883
+284699.569350 9102833.404076
+284702.492808 9102825.371095
+284933.509851 9102889.939973
+284928.729153 9102916.052827
+284919.138805 9102964.260259
+284933.080524 9102968.295174
+285191.808065 9103016.822631
+285293.317399 9103037.034452
+285359.986877 9103049.168258
+285497.322698 9103076.453945
+285541.266479 9102969.018275
+285572.472436 9102886.681479
+285590.026656 9102840.492603
+285596.859736 9102823.423209
+285646.584438 9102690.880456
+285652.438228 9102675.819020
+285704.121201 9102539.260361
+285728.471972 9102470.979275
+285737.241717 9102446.880275
+285770.398397 9102359.523017
+285817.315173 9102251.086320
+285837.792253 9102196.864455
+285895.429628 9102059.308285
+285903.067699 9102016.121397
+285917.495142 9101949.837737
+285919.178007 9101907.648386
+285919.018449 9101885.547974
+285913.629115 9101827.277387
+Region 1
+156
+288609.815460 9099397.376816
+288485.043414 9099456.503396
+288374.138650 9099509.618211
+288286.015193 9099552.713318
+288232.444195 9099564.706810
+288082.464618 9099573.576494
+287759.686707 9099596.310879
+287633.554880 9099605.206528
+287624.604479 9099604.191658
+287528.173809 9099598.053043
+287461.495352 9099583.912263
+287438.604326 9099578.863026
+287411.731306 9099572.804615
+287381.891792 9099568.751846
+287355.047865 9099566.711627
+287331.170437 9099562.665735
+287304.304697 9099557.611812
+287274.450647 9099551.549850
+287250.573224 9099547.503911
+287226.695803 9099543.457959
+287204.791210 9099537.405188
+287199.815536 9099536.394850
+287181.922009 9099535.369482
+287160.046488 9099533.334920
+287140.151063 9099530.298103
+287116.280914 9099527.256646
+287089.415189 9099522.202582
+287064.558625 9099520.164496
+287039.716587 9099520.135513
+287012.908975 9099523.117875
+286990.105135 9099530.123102
+286964.349290 9099541.143074
+286946.550153 9099553.176886
+286919.815120 9099566.204796
+286902.052266 9099583.261396
+286876.448842 9099615.377090
+286864.626280 9099629.426977
+286819.301553 9099682.615159
+286788.736842 9099715.729572
+286764.097918 9099743.828158
+286742.381959 9099763.893747
+286729.551112 9099775.933331
+286716.727517 9099788.977473
+286701.046236 9099819.095652
+286667.558339 9099860.243015
+286634.998759 9099892.350482
+286613.333470 9099919.447967
+286594.627466 9099943.535265
+286574.913236 9099965.612269
+286563.119519 9099983.680365
+286549.425475 9100013.800863
+286539.749737 9100049.953404
+286532.989776 9100077.068394
+286493.292692 9100084.053592
+286441.591423 9100079.974536
+286392.842230 9100071.880682
+286382.890752 9100069.859845
+286299.376655 9100063.733998
+286092.542518 9100043.398208
+286081.604591 9100042.380685
+286046.803412 9100039.325742
+285879.760628 9100025.063448
+285869.816397 9100024.047054
+285758.471406 9100016.882458
+285657.063382 9100009.729455
+285639.075486 9099995.644138
+285478.045455 9099988.419373
+285413.433231 9099985.328148
+285412.641983 9100013.454856
+285412.743210 9100027.518806
+285410.289950 9100100.848680
+285408.982275 9100195.275671
+285410.540054 9100273.633150
+285414.847562 9100319.848033
+285416.885605 9100326.882390
+285428.199733 9100380.137579
+285443.373008 9100417.324439
+285474.575907 9100472.612535
+285528.735580 9100541.991855
+285558.829189 9100581.205586
+285599.955041 9100634.496261
+285653.106935 9100701.865015
+285666.148316 9100718.958033
+285705.679704 9100688.868392
+285717.705658 9100702.946510
+285773.889652 9100777.350563
+285883.641491 9100701.134600
+285926.161059 9100672.052905
+285931.100641 9100668.040537
+285934.089026 9100669.048636
+286112.398584 9100729.532996
+286131.337144 9100737.591804
+286167.509674 9100792.885018
+286189.610725 9100826.061391
+286208.694400 9100854.211415
+286251.300850 9100837.184182
+286276.063925 9100826.163241
+286295.822139 9100810.113628
+286305.708496 9100803.093383
+286332.517006 9100800.111256
+286349.410140 9100800.131119
+286410.113758 9100812.257084
+286419.078954 9100815.281270
+286469.845453 9100827.395479
+286605.186542 9100854.676915
+286608.022441 9100834.589183
+286615.674400 9100793.411484
+286697.238682 9100804.556887
+286709.851848 9100762.380434
+286828.270550 9100785.623240
+286839.795405 9100730.386347
+286841.753757 9100726.370424
+286858.348873 9100685.203156
+286865.028692 9100647.037994
+286864.745293 9100607.860168
+286862.605285 9100586.762100
+286873.861255 9100494.356509
+286873.548819 9100451.160444
+286871.132742 9100391.889106
+286875.883287 9100361.758109
+286880.750077 9100347.700067
+286918.467107 9100341.716728
+286931.341615 9100335.704423
+286968.964144 9100316.661776
+286979.829433 9100307.633469
+286996.569701 9100286.557390
+287008.334194 9100264.470969
+287018.140353 9100246.400470
+287031.797738 9100211.257094
+287048.501610 9100185.158215
+287079.131740 9100161.084629
+287144.446644 9100123.992174
+287224.615921 9100079.885034
+287281.001868 9100044.791174
+287307.715178 9100028.749335
+287340.390611 9100012.714387
+287361.236297 9100009.724867
+287477.189295 9099830.044759
+287568.619613 9099694.536358
+287711.666175 9099688.673945
+287927.236708 9099680.885174
+287984.862878 9099679.946642
+288013.745183 9099689.020609
+288070.538000 9099710.181005
+288163.263749 9099753.482298
+288200.124728 9099766.583402
+288217.039178 9099769.616307
+288277.135876 9099698.362102
+288354.139488 9099629.136170
+288406.549019 9099594.036703
+288471.941903 9099567.992814
+288517.563376 9099555.990037
+288591.979460 9099541.006197
+288634.780431 9099551.100050
+288622.221263 9099463.690660
+288609.815460 9099397.376816
+Region 1
+274
+288986.709479 9101621.853507
+288981.631093 9101606.779766
+288963.925484 9101495.256167
+288930.772869 9101309.379367
+288921.449008 9101257.132890
+288891.343931 9101080.300223
+288871.688226 9100973.796982
+288861.297762 9100911.503855
+288858.185020 9100893.418644
+288853.968890 9100860.264089
+288824.909594 9100690.464177
+288821.767660 9100668.360759
+288791.568906 9100478.468654
+288748.036145 9100231.302602
+288702.414563 9099970.070428
+288657.882476 9099721.898330
+288634.780431 9099551.100050
+288591.979460 9099541.006197
+288517.563376 9099555.990037
+288471.941903 9099567.992814
+288406.549019 9099594.036703
+288354.139488 9099629.136170
+288277.135876 9099698.362102
+288217.039178 9099769.616307
+288200.124728 9099766.583402
+288163.263749 9099753.482298
+288070.538000 9099710.181005
+288013.745183 9099689.020609
+287984.862878 9099679.946642
+287927.236708 9099680.885174
+287711.666175 9099688.673945
+287568.619613 9099694.536358
+287477.189295 9099830.044759
+287361.236297 9100009.724867
+287340.390611 9100012.714387
+287307.715178 9100028.749335
+287281.001868 9100044.791174
+287224.615921 9100079.885034
+287144.446644 9100123.992174
+287079.131740 9100161.084629
+287048.501610 9100185.158215
+287031.797738 9100211.257094
+287018.140353 9100246.400470
+287008.334194 9100264.470969
+286996.569701 9100286.557390
+286979.829433 9100307.633469
+286968.964144 9100316.661776
+286931.341615 9100335.704423
+286918.467107 9100341.716728
+286880.750077 9100347.700067
+286875.883287 9100361.758109
+286871.132742 9100391.889106
+286873.548819 9100451.160444
+286873.861255 9100494.356509
+286862.605285 9100586.762100
+286864.745293 9100607.860168
+286865.028692 9100647.037994
+286858.348873 9100685.203156
+286841.753757 9100726.370424
+286839.795405 9100730.386347
+286828.270550 9100785.623240
+286709.851848 9100762.380434
+286697.238682 9100804.556887
+286615.674400 9100793.411484
+286608.022441 9100834.589183
+286605.186542 9100854.676915
+286469.845453 9100827.395479
+286419.078954 9100815.281270
+286410.113758 9100812.257084
+286349.410140 9100800.131119
+286332.517006 9100800.111256
+286305.708496 9100803.093383
+286295.822139 9100810.113628
+286276.063925 9100826.163241
+286251.300850 9100837.184182
+286208.694400 9100854.211415
+286189.610725 9100826.061391
+286167.509674 9100792.885018
+286131.337144 9100737.591804
+286112.398584 9100729.532996
+285934.089026 9100669.048636
+285931.100641 9100668.040537
+285926.161059 9100672.052905
+285883.641491 9100701.134600
+285773.889652 9100777.350563
+285717.705658 9100702.946510
+285705.679704 9100688.868392
+285666.148316 9100718.958033
+285716.275822 9100780.295715
+285736.345695 9100807.442634
+285769.616414 9100873.782947
+285783.919643 9100928.046007
+285791.245144 9100979.287100
+285795.727164 9101049.611389
+285797.989926 9101087.787227
+285804.437721 9101155.100168
+285805.496659 9101164.142433
+285806.620811 9101182.225784
+285811.044983 9101244.513534
+285816.738304 9101344.975927
+285819.044646 9101389.179141
+285823.447182 9101448.453180
+285831.694207 9101489.649751
+285847.027867 9101548.936712
+285854.201476 9101579.081880
+285889.032499 9101723.779107
+285903.401655 9101787.083088
+285913.629115 9101827.277387
+285919.018449 9101885.547974
+285919.178007 9101907.648386
+285917.495142 9101949.837737
+285903.067699 9102016.121397
+285895.429628 9102059.308285
+285837.792253 9102196.864455
+285817.315173 9102251.086320
+285770.398397 9102359.523017
+285737.241717 9102446.880275
+285728.471972 9102470.979275
+285704.121201 9102539.260361
+285652.438228 9102675.819020
+285646.584438 9102690.880456
+285596.859736 9102823.423209
+285590.026656 9102840.492603
+285572.472436 9102886.681479
+285541.266479 9102969.018275
+285497.322698 9103076.453945
+285489.524793 9103097.540428
+285468.923865 9103134.684688
+285428.766441 9103216.006340
+285416.035872 9103242.109774
+285382.653500 9103298.325496
+285333.602574 9103386.668510
+285301.184808 9103438.867126
+285287.525574 9103474.010479
+285280.786545 9103504.139242
+285279.843498 9103511.170032
+285278.015384 9103533.268149
+285278.276302 9103569.432558
+285284.557904 9103613.640564
+285288.634509 9103627.709207
+285318.193624 9103730.209124
+285323.307542 9103750.306334
+285329.553005 9103789.491481
+285328.791229 9103821.636434
+285326.897912 9103834.693448
+285302.408495 9103883.887832
+285279.834113 9103923.038897
+285218.944074 9104023.422674
+285200.279499 9104053.537332
+285182.673933 9104092.694269
+285146.396452 9104160.961292
+285110.089887 9104225.210040
+285086.601141 9104275.410149
+285079.992440 9104323.621149
+285080.115652 9104340.698799
+285083.314488 9104370.839360
+285096.654299 9104429.119581
+285115.949726 9104486.402278
+285139.147930 9104533.643984
+285167.373222 9104588.928075
+285217.607364 9104664.329278
+285261.820818 9104731.686821
+285276.611850 9104715.631332
+285286.448351 9104701.579117
+285309.226085 9104690.555823
+285322.080262 9104681.529947
+285374.367365 9104628.349969
+285418.914372 9104604.293010
+285439.711665 9104594.271896
+285456.599056 9104593.287191
+285476.504143 9104597.328810
+285508.429229 9104614.443770
+285525.381953 9104622.500123
+285540.288998 9104622.517617
+285561.108039 9104615.510146
+285606.648691 9104591.454193
+285633.154575 9104546.280233
+285672.550759 9104497.103143
+285702.052454 9104453.941790
+285721.783165 9104433.873773
+285738.539730 9104414.806826
+285766.068251 9104373.652259
+285791.710828 9104346.559254
+285817.266205 9104307.411479
+285871.430866 9104239.165029
+285875.376977 9104235.151419
+285899.068157 9104213.078880
+285920.771731 9104191.004013
+285953.392449 9104166.932769
+286008.819425 9104135.856216
+286065.283713 9104110.808143
+286122.683554 9104077.724674
+286138.467839 9104061.670177
+286149.304988 9104048.623585
+286168.933534 9104014.491592
+286176.847470 9104009.478025
+286187.735491 9104003.463361
+286190.709578 9104002.462264
+286205.587279 9103998.461339
+286224.367404 9103984.419412
+286233.144226 9103961.324886
+286241.935584 9103940.239483
+286295.822825 9103833.819443
+286312.440758 9103795.665727
+286340.802209 9103732.411823
+286383.120119 9103675.201418
+286409.843003 9103660.164115
+286423.719510 9103655.157436
+286462.462252 9103653.193210
+286494.277649 9103655.239143
+286543.981017 9103657.305736
+286608.525512 9103650.348451
+286681.056565 9103648.423042
+286695.941353 9103645.426551
+286707.852094 9103643.431179
+286728.684964 9103638.432432
+286765.432784 9103635.461102
+286801.230510 9103638.515951
+286839.965859 9103635.546848
+286912.511357 9103635.630188
+286934.396234 9103638.668954
+286953.321648 9103644.717963
+286973.262698 9103653.781775
+287005.158189 9103666.877470
+287043.067354 9103687.011865
+287073.011774 9103705.128012
+287106.975053 9103729.276018
+287126.967190 9103745.371641
+287172.899576 9103775.560544
+287189.895844 9103789.643613
+287204.889986 9103801.715294
+287215.865275 9103807.755098
+287232.817810 9103815.810808
+287249.784936 9103825.875622
+287281.695183 9103840.980183
+287340.641691 9103884.242793
+287361.532896 9103887.280185
+287399.311010 9103889.332203
+287422.138685 9103885.339937
+287449.964427 9103885.371519
+287583.937314 9103449.550384
+287619.340618 9103398.358677
+287635.329508 9103273.813112
+287656.046333 9103116.122905
+287657.010898 9103112.105816
+287676.682869 9102947.382618
+287691.714476 9102827.858726
+287700.286058 9102776.636620
+287704.034836 9102745.499956
+287710.764861 9102714.366677
+287718.517820 9102687.252743
+287732.240557 9102661.150130
+287751.911168 9102633.045173
+287791.354501 9102590.899002
+287817.981264 9102562.801920
+287877.102254 9102493.555291
+287917.517193 9102448.396528
+288030.862742 9102319.943016
+288124.515553 9102216.580738
+288176.708726 9102151.344275
+288228.930977 9102090.125992
+288272.289881 9102039.947673
+288287.100863 9102026.905290
+288309.854371 9102012.867299
+288455.304015 9101926.640120
+288476.077262 9101913.604388
+288479.043824 9101911.598633
+288521.445094 9101866.441809
+288558.848410 9101817.261197
+288620.049822 9101761.075435
+288659.586656 9101731.987995
+288733.910994 9101703.943960
+288804.304230 9101681.922679
+288986.709479 9101621.853507
+Region 1
+81
+288851.902593 9103304.307533
+288848.635605 9103265.126880
+288854.642094 9103271.160763
+288857.432879 9103245.045827
+288851.563050 9103121.480974
+288851.533749 9103117.462784
+288835.658341 9102848.228573
+288834.400957 9102812.063748
+288823.956163 9102606.121492
+288818.130865 9102488.583848
+288814.981270 9102465.475928
+288810.947754 9102457.435123
+288802.895368 9102443.362609
+288744.892650 9102393.071050
+288665.882592 9102323.669677
+288648.879347 9102308.582588
+288578.871698 9102247.227370
+288505.875723 9102184.864106
+288351.868741 9102051.087180
+288341.865661 9102042.035049
+288309.854371 9102012.867299
+288287.100863 9102026.905290
+288272.289881 9102039.947673
+288228.930977 9102090.125992
+288176.708726 9102151.344275
+288124.515553 9102216.580738
+288030.862742 9102319.943016
+287917.517193 9102448.396528
+287877.102254 9102493.555291
+287817.981264 9102562.801920
+287791.354501 9102590.899002
+287751.911168 9102633.045173
+287732.240557 9102661.150130
+287718.517820 9102687.252743
+287710.764861 9102714.366677
+287704.034836 9102745.499956
+287700.286058 9102776.636620
+287691.714476 9102827.858726
+287676.682869 9102947.382618
+287657.010898 9103112.105816
+287656.046333 9103116.122905
+287635.329508 9103273.813112
+287619.340618 9103398.358677
+287583.937314 9103449.550384
+287449.964427 9103885.371519
+287491.703033 9103885.418859
+287550.335821 9103885.485295
+287585.117974 9103885.524670
+287637.773475 9103883.575136
+287655.610312 9103876.563478
+287715.229508 9103875.626271
+287782.937685 9103893.784455
+287824.902734 9103924.972620
+287834.898944 9103933.020232
+287880.992640 9103985.308404
+287922.146799 9104041.609129
+287956.359243 9104099.911088
+288042.232956 9104019.643908
+288098.556406 9103975.507101
+288124.167829 9103944.394939
+288134.887244 9103915.275191
+288133.798393 9103902.214914
+288131.123396 9103807.784879
+288147.666467 9103759.585342
+288183.105747 9103713.416045
+288208.724308 9103683.308431
+288211.676355 9103679.293563
+288246.326559 9103661.250551
+288294.969937 9103654.273116
+288564.368420 9103666.627722
+288645.886483 9103670.736372
+288681.603436 9103662.739650
+288690.503372 9103656.722273
+288734.016576 9103627.638816
+288775.424972 9103582.480365
+288827.596141 9103514.229389
+288842.282738 9103484.109447
+288851.094688 9103466.037481
+288857.875151 9103441.936033
+288857.391566 9103375.635902
+288851.902593 9103304.307533
+Region 1
+235
+290515.118603 9102855.082557
+290484.997347 9102812.859963
+290441.214057 9102804.776733
+290413.227542 9102782.646987
+290399.131283 9102757.518553
+290359.823818 9102682.136408
+290296.402148 9102570.565054
+290257.227435 9102513.264461
+290216.109484 9102461.988904
+290140.999030 9102382.549584
+290132.975700 9102372.495567
+290048.775054 9102272.955501
+289984.669665 9102203.573053
+289937.729530 9102171.376914
+289829.996035 9102115.005610
+289799.073118 9102098.899309
+289760.156387 9102076.757037
+289712.156742 9102035.518614
+289672.070279 9101989.266106
+289633.919991 9101935.983912
+289619.831829 9101911.859603
+289595.476406 9101842.519894
+289574.465258 9101686.793701
+289562.903745 9101600.390864
+289531.064837 9101458.716179
+289500.920469 9101276.861807
+289496.784393 9101254.757434
+289491.478722 9101208.542881
+289489.352062 9101189.454332
+289489.322747 9101185.436151
+289457.206246 9101005.588542
+289453.055595 9100981.475060
+289432.280475 9100857.893990
+289414.618481 9100752.398000
+289404.139528 9100678.050608
+289270.830634 9100656.807416
+289275.317893 9100727.130086
+289199.679822 9100710.973408
+289223.376689 9100826.521698
+289176.753342 9100837.519797
+289127.126906 9100845.500892
+289106.332386 9100855.523131
+289082.564072 9100866.546588
+289052.914025 9100888.613414
+289051.065651 9100907.697604
+289021.481413 9100938.805348
+288871.688226 9100973.796982
+288891.343931 9101080.300223
+288921.449008 9101257.132890
+288930.772869 9101309.379367
+288963.925484 9101495.256167
+288981.631093 9101606.779766
+288986.709479 9101621.853507
+288804.304230 9101681.922679
+288733.910994 9101703.943960
+288659.586656 9101731.987995
+288620.049822 9101761.075435
+288558.848410 9101817.261197
+288521.445094 9101866.441809
+288479.043824 9101911.598633
+288476.077262 9101913.604388
+288455.304015 9101926.640120
+288309.854371 9102012.867299
+288341.865661 9102042.035049
+288351.868741 9102051.087180
+288505.875723 9102184.864106
+288578.871698 9102247.227370
+288648.879347 9102308.582588
+288665.882592 9102323.669677
+288744.892650 9102393.071050
+288802.895368 9102443.362609
+288810.947754 9102457.435123
+288814.981270 9102465.475928
+288818.130865 9102488.583848
+288823.956163 9102606.121492
+288834.400957 9102812.063748
+288835.658341 9102848.228573
+288851.533749 9103117.462784
+288851.563050 9103121.480974
+288857.432879 9103245.045827
+288854.642094 9103271.160763
+288848.635605 9103265.126880
+288851.902593 9103304.307533
+288857.391566 9103375.635902
+288857.875151 9103441.936033
+288851.094688 9103466.037481
+288842.282738 9103484.109447
+288827.596141 9103514.229389
+288775.424972 9103582.480365
+288734.016576 9103627.638816
+288690.503372 9103656.722273
+288681.603436 9103662.739650
+288645.886483 9103670.736372
+288564.368420 9103666.627722
+288294.969937 9103654.273116
+288246.326559 9103661.250551
+288211.676355 9103679.293563
+288208.724308 9103683.308431
+288183.105747 9103713.416045
+288147.666467 9103759.585342
+288131.123396 9103807.784879
+288133.798393 9103902.214914
+288134.887244 9103915.275191
+288124.167829 9103944.394939
+288098.556406 9103975.507101
+288042.232956 9104019.643908
+287956.359243 9104099.911088
+287976.498020 9104136.097257
+288042.080948 9104271.784112
+288091.610172 9104386.357428
+288117.704622 9104421.545585
+288148.665604 9104442.675551
+288160.649563 9104450.725266
+288212.487394 9104472.883008
+288277.207878 9104490.032310
+288316.133892 9104513.180078
+288342.162687 9104539.327096
+288355.264963 9104564.455192
+288355.286930 9104567.468841
+288364.465335 9104599.624362
+288374.747394 9104646.849222
+288378.986190 9104683.017414
+288383.217677 9104718.181054
+288383.994033 9104824.663286
+288401.196148 9104866.873085
+288411.302562 9104889.988729
+288430.506982 9104934.209802
+288430.594896 9104946.264391
+288433.073353 9105013.571374
+288427.564827 9105075.846811
+288429.108154 9105151.189082
+288439.383218 9105197.409322
+288450.520207 9105225.548774
+288494.738505 9105292.901835
+288538.949620 9105359.250272
+288568.866360 9105373.346808
+288591.716507 9105372.367441
+288629.554361 9105382.454495
+288664.315474 9105379.479117
+288687.165610 9105378.499701
+288712.084032 9105388.572477
+288720.056462 9105391.594853
+288742.943274 9105395.638142
+288780.663768 9105389.652306
+288791.588261 9105388.659751
+288815.461535 9105391.699546
+288832.385529 9105395.736251
+288847.292568 9105395.752585
+288862.199605 9105395.768914
+288877.158012 9105402.817063
+288900.994592 9105400.834077
+288934.798549 9105402.880134
+288959.768393 9105419.984578
+288983.641674 9105423.024276
+289015.480058 9105428.081733
+289047.347815 9105437.157347
+289066.259432 9105441.196122
+289087.217404 9105453.273418
+289105.201322 9105466.351998
+289125.246303 9105489.478182
+289141.294055 9105509.586392
+289157.400588 9105537.730950
+289168.494045 9105559.842826
+289170.511038 9105563.863166
+289183.599467 9105586.981741
+289198.719604 9105616.129735
+289207.781411 9105632.212165
+289215.842071 9105647.288967
+289231.934019 9105673.424386
+289249.027143 9105700.565417
+289254.062318 9105709.611706
+289259.082798 9105716.648906
+289263.109471 9105723.685027
+289297.266428 9105773.948859
+289308.293877 9105787.019773
+289322.390971 9105812.148437
+289324.407993 9105816.168764
+289338.541866 9105846.320137
+289347.692004 9105874.457037
+289361.862680 9105909.631112
+289376.961020 9105935.765359
+289395.990507 9105955.876632
+289413.982077 9105969.959561
+289429.993386 9105985.044876
+289446.004706 9106000.130184
+289471.939456 9106013.217116
+289493.884254 9106024.290659
+289568.273065 9106004.280090
+289723.999719 9105963.261552
+289764.731221 9105961.296175
+289783.532632 9105950.266462
+289806.323995 9105941.250085
+289818.212895 9105936.240155
+289858.833895 9105919.206586
+289933.288522 9105908.236354
+289940.237814 9105907.239248
+290001.780240 9105897.259644
+290089.286864 9105904.384670
+290219.637743 9105926.623019
+290225.607957 9105927.633892
+290196.276674 9105587.066634
+290163.016235 9105388.133968
+290145.812304 9105345.925289
+290102.298393 9105239.398456
+290049.163466 9105176.056121
+289972.104115 9105102.642718
+289866.247209 9105032.211781
+289832.141989 9104988.980172
+289827.128902 9104982.947578
+289787.841490 9104910.578861
+289763.210927 9104804.071727
+289751.404105 9104684.519443
+289764.552214 9104580.062091
+289791.429354 9104450.506216
+289876.806671 9104302.931865
+289897.396401 9104264.781790
+290000.396109 9104081.063175
+290127.871260 9103847.144197
+290140.407539 9103794.921987
+290145.229180 9103774.836523
+290109.697186 9103672.335980
+290088.386919 9103612.041070
+290090.912140 9103549.762758
+290114.232644 9103477.461525
+290158.627856 9103433.309903
+290298.224347 9103362.138216
+290370.458926 9103320.025406
+290398.114579 9103296.950836
+290416.649811 9103249.757734
+290437.040042 9103048.873350
+290448.670525 9103008.704574
+290499.999071 9102961.546632
+290523.443933 9102906.322551
+290517.223856 9102871.157307
+290515.118603 9102855.082557
+Region 1
+379
+292413.648094 9104137.840727
+292406.580644 9104122.765692
+292393.469157 9104096.634745
+292380.350279 9104069.499263
+292370.271956 9104050.403051
+292358.176499 9104027.286686
+292338.093988 9103999.139524
+292320.970540 9103967.981819
+292309.854076 9103942.857391
+292298.670965 9103908.692199
+292284.588094 9103885.573755
+292275.481399 9103863.464935
+292241.279185 9103807.176592
+292234.197056 9103790.092444
+292224.074452 9103764.968993
+292213.988883 9103744.868184
+292207.863508 9103722.762403
+292197.755748 9103699.647997
+292196.732387 9103695.628857
+292185.653105 9103675.527010
+292172.593743 9103656.427640
+292160.550347 9103640.342877
+292148.484754 9103621.244519
+292138.354853 9103595.116498
+292130.256863 9103575.017701
+292119.170249 9103553.911294
+292109.106993 9103536.824027
+292104.005064 9103518.737357
+292100.861028 9103496.634619
+292098.769940 9103482.569146
+292092.629886 9103458.454265
+292078.510307 9103430.313044
+292069.374254 9103404.186013
+292057.249594 9103377.051363
+292045.206331 9103360.966540
+292042.195517 9103356.945333
+292032.124950 9103338.853500
+292018.035050 9103314.730363
+292008.936054 9103293.625957
+291993.808067 9103263.474593
+291986.696574 9103242.372237
+291977.538448 9103213.231572
+291969.396261 9103187.105524
+291962.218243 9103156.962381
+291956.107924 9103136.865575
+291955.084609 9103132.846419
+291945.985697 9103111.741984
+291939.875396 9103091.645172
+291931.748057 9103067.528169
+291916.612835 9103036.372214
+291902.471371 9103005.217282
+291882.404496 9102979.078795
+291864.362070 9102957.965019
+291845.318538 9102935.845665
+291827.246586 9102910.713739
+291811.199069 9102890.606532
+291799.148661 9102873.517057
+291783.108562 9102854.414365
+291771.036009 9102834.311281
+291760.973095 9102817.223863
+291754.914663 9102804.158720
+291752.882872 9102798.129451
+291740.795576 9102776.017287
+291725.601519 9102736.824952
+291713.469936 9102708.685579
+291703.311053 9102678.539212
+291692.173233 9102650.400865
+291682.051316 9102625.277150
+291671.922027 9102599.148897
+291659.820073 9102575.027622
+291650.728848 9102554.927596
+291635.660517 9102532.812251
+291618.575219 9102506.676680
+291596.536093 9102482.544950
+291572.502162 9102457.406584
+291545.464945 9102429.251465
+291529.447282 9102413.162218
+291527.437693 9102410.146528
+291503.389080 9102382.999038
+291478.309876 9102350.827813
+291462.255369 9102329.715859
+291450.146243 9102304.589948
+291435.998045 9102272.430196
+291428.901820 9102253.336714
+291420.774995 9102229.219511
+291419.759143 9102226.204860
+291401.599244 9102189.018221
+291392.500866 9102167.913559
+291379.435006 9102147.809231
+291352.316985 9102108.604040
+291332.243526 9102081.460593
+291315.188112 9102059.342960
+291304.154001 9102045.267906
+291297.124253 9102035.215195
+291282.071053 9102015.108715
+291272.001186 9101997.016559
+291253.893143 9101966.861553
+291233.782957 9101934.695356
+291217.684512 9101907.556037
+291195.631187 9101881.414914
+291181.601286 9101865.327573
+291168.550368 9101847.232210
+291153.497299 9101827.125657
+291139.386372 9101799.988400
+291126.291281 9101775.865800
+291115.154152 9101747.727162
+291102.059094 9101723.604547
+291096.008426 9101711.543766
+291086.939798 9101694.457128
+291067.867794 9101668.319072
+291048.788447 9101641.176467
+291036.657709 9101613.036730
+291025.513331 9101583.893508
+291015.311123 9101547.719584
+291006.154195 9101518.578472
+290995.009873 9101489.435232
+290985.889798 9101465.316794
+290975.753941 9101438.183678
+290969.644454 9101418.086565
+290963.505522 9101393.971301
+290952.339189 9101361.814424
+290948.261308 9101347.746652
+290944.190792 9101334.683416
+290936.086579 9101313.579627
+290924.986552 9101290.463569
+290913.864455 9101264.333892
+290906.746615 9101242.226618
+290897.626665 9101218.108136
+290893.512022 9101199.017664
+290891.443663 9101187.965620
+290887.277508 9101161.843382
+290885.135555 9101140.745961
+290876.928393 9101105.578618
+290869.810614 9101083.471326
+290859.601377 9101046.292765
+290842.509882 9101019.152107
+290823.453094 9100995.022916
+290808.349033 9100967.884370
+290796.240786 9100942.758096
+290789.123089 9100920.650775
+290779.981237 9100893.518621
+290771.847802 9100868.396608
+290767.674434 9100841.269794
+290754.587279 9100818.151501
+290737.525377 9100795.028919
+290728.442431 9100775.933049
+290724.379421 9100763.874301
+290718.292266 9100746.790717
+290712.138934 9100720.666282
+290699.000382 9100690.516185
+290682.910199 9100664.381018
+290674.806296 9100643.277119
+290665.664605 9100616.144909
+290659.540746 9100594.038610
+290654.410581 9100571.933382
+290645.268926 9100544.801161
+290633.197686 9100524.697487
+290616.077183 9100493.538500
+290597.006089 9100467.400048
+290577.920320 9100439.252502
+290566.835481 9100418.145332
+290556.773729 9100401.057392
+290548.662611 9100378.948903
+290539.579864 9100359.852953
+290535.546356 9100351.812325
+290525.433206 9100327.692592
+290514.289654 9100298.549075
+290503.131428 9100267.396472
+290492.930172 9100231.222240
+290482.817085 9100207.102484
+290480.785655 9100201.073084
+290471.629538 9100171.931700
+290461.413656 9100133.748368
+290452.286952 9100108.625135
+290445.154957 9100084.508599
+290436.020935 9100058.380817
+290428.955053 9100043.305140
+290418.856751 9100021.194431
+290407.742758 9099996.069013
+290395.583711 9099963.910722
+290387.399378 9099931.756753
+290375.247714 9099900.602988
+290366.055064 9099866.438844
+290360.939889 9099846.342604
+290352.807005 9099821.220405
+290346.705515 9099802.127617
+290339.529622 9099771.983790
+290332.353744 9099741.839959
+290324.184212 9099711.695038
+290318.024048 9099684.565909
+290306.858866 9099652.408639
+290292.705368 9099619.243562
+290282.511883 9099584.073739
+290273.407470 9099561.964039
+290263.236034 9099529.807830
+290250.083626 9099497.648350
+290237.924904 9099465.489951
+290227.768202 9099435.342805
+290215.668204 9099411.220727
+290204.532544 9099383.081563
+290191.431583 9099357.953840
+290189.407589 9099352.928949
+290177.248972 9099320.770511
+290160.122078 9099288.606610
+290144.982532 9099256.444879
+290129.857676 9099226.292223
+290112.745528 9099196.137371
+290100.623687 9099169.001602
+290085.542885 9099144.876173
+290082.525261 9099139.850177
+290073.435741 9099119.749474
+290053.335387 9099088.586754
+290032.226750 9099055.413836
+290019.104029 9099027.272384
+290003.986691 9098998.124188
+289993.852300 9098970.990552
+289980.722310 9098941.844532
+289970.587953 9098914.710884
+289954.440416 9098880.538837
+289946.322703 9098857.425547
+289942.260187 9098845.366628
+289935.165443 9098826.272606
+289925.980854 9098793.112769
+289920.858780 9098772.011851
+289913.742090 9098749.904188
+289906.640058 9098729.805610
+289895.446258 9098693.629924
+289884.274453 9098660.467862
+289874.191516 9098640.365970
+289857.079838 9098610.210920
+289845.024281 9098592.115901
+289828.920936 9098563.971021
+289819.802413 9098539.852029
+289809.646333 9098509.704661
+289798.481987 9098477.547095
+289790.342511 9098451.420102
+289772.186106 9098414.232068
+289763.082300 9098392.122138
+289750.982943 9098367.999799
+289740.878202 9098344.884210
+289725.732092 9098311.717633
+289716.621022 9098288.603138
+289708.510921 9098266.494290
+289698.428187 9098246.392315
+289689.273252 9098217.250534
+289677.108156 9098184.087242
+289667.997151 9098160.972724
+289655.839410 9098128.813964
+289644.777736 9098110.719946
+289631.655655 9098082.578247
+289619.600370 9098064.483108
+289610.533314 9098047.395839
+289596.468840 9098026.284832
+289332.885287 9098125.438904
+289365.339520 9098215.883845
+289284.080234 9098245.928812
+289261.591736 9098159.513143
+289156.506968 9098192.544702
+289169.694575 9098229.727537
+289250.895809 9098464.881147
+289321.810732 9098651.804990
+289048.330110 9098756.974515
+289066.588471 9098808.226626
+289078.753435 9098841.390140
+288997.492793 9098871.434886
+289043.135206 9098999.062905
+289065.499900 9099068.401330
+289082.728291 9099114.629534
+289108.899692 9099160.867761
+289043.522556 9099188.921460
+288960.266663 9099217.959504
+288941.474699 9099229.992840
+288928.666631 9099245.046532
+288910.744128 9099240.003642
+288879.925890 9099237.959834
+288866.021876 9099238.948701
+288847.193352 9099245.959258
+288805.598128 9099264.998613
+288765.018434 9099287.052711
+288736.464927 9099323.183957
+288715.700106 9099337.224077
+288643.490759 9099382.346802
+288609.815460 9099397.376816
+288622.221263 9099463.690660
+288634.780431 9099551.100050
+288657.882476 9099721.898330
+288702.414563 9099970.070428
+288748.036145 9100231.302602
+288791.568906 9100478.468654
+288821.767660 9100668.360759
+288824.909594 9100690.464177
+288853.968890 9100860.264089
+288858.185020 9100893.418644
+288861.297762 9100911.503855
+288871.688226 9100973.796982
+289021.481413 9100938.805348
+289051.065651 9100907.697604
+289052.914025 9100888.613414
+289082.564072 9100866.546588
+289106.332386 9100855.523131
+289127.126906 9100845.500892
+289176.753342 9100837.519797
+289223.376689 9100826.521698
+289199.679822 9100710.973408
+289275.317893 9100727.130086
+289270.830634 9100656.807416
+289404.139528 9100678.050608
+289414.618481 9100752.398000
+289432.280475 9100857.893990
+289453.055595 9100981.475060
+289457.206246 9101005.588542
+289489.322747 9101185.436151
+289489.352062 9101189.454332
+289491.478722 9101208.542881
+289496.784393 9101254.757434
+289500.920469 9101276.861807
+289531.064837 9101458.716179
+289562.903745 9101600.390864
+289574.465258 9101686.793701
+289595.476406 9101842.519894
+289619.831829 9101911.859603
+289633.919991 9101935.983912
+289672.070279 9101989.266106
+289712.156742 9102035.518614
+289760.156387 9102076.757037
+289799.073118 9102098.899309
+289829.996035 9102115.005610
+289937.729530 9102171.376914
+289984.669665 9102203.573053
+290048.775054 9102272.955501
+290132.975700 9102372.495567
+290140.999030 9102382.549584
+290216.109484 9102461.988904
+290257.227435 9102513.264461
+290296.402148 9102570.565054
+290359.823818 9102682.136408
+290399.131283 9102757.518553
+290413.227542 9102782.646987
+290441.214057 9102804.776733
+290484.997347 9102812.859963
+290515.118603 9102855.082557
+290517.223856 9102871.157307
+290549.119167 9102884.250371
+290582.876802 9102880.268381
+290615.751139 9102891.353378
+290640.933333 9102937.588685
+290655.184453 9102983.812294
+290663.664671 9103056.147511
+290688.987004 9103121.468972
+290694.309318 9103169.692079
+290678.954557 9103244.010919
+290673.463571 9103308.294977
+290689.584544 9103338.448048
+290714.524010 9103351.533493
+290748.252467 9103343.533152
+290818.572638 9103311.462978
+290842.422539 9103311.488312
+290904.012654 9103308.540089
+290968.760948 9103329.703808
+291015.636609 9103352.857572
+291033.560911 9103357.899169
+291053.376820 9103349.883896
+291079.979281 9103318.771649
+291099.640252 9103289.661117
+291121.443602 9103281.647923
+291160.074180 9103264.611730
+291170.983220 9103261.609657
+291206.898164 9103280.733543
+291219.875860 9103288.783436
+291368.955032 9103426.560353
+291487.014703 9103535.172871
+291684.076363 9103711.170420
+291720.050979 9103738.330012
+291781.441687 9103708.258108
+291889.548218 9103949.455882
+291947.161563 9104081.107990
+292043.197062 9104302.202033
+292253.192882 9104210.001888
+292413.648094 9104137.840727
+Region 1
+174
+292732.113989 9105142.683814
+292714.018168 9105114.539012
+292690.115585 9105107.483213
+292680.096182 9105096.423374
+292674.934337 9105070.300666
+292676.714081 9105042.175945
+292682.483766 9105016.064299
+292682.275964 9104987.937566
+292676.090688 9104957.795744
+292669.920266 9104929.662971
+292664.795571 9104908.562886
+292662.555733 9104874.406978
+292653.404031 9104846.271176
+292644.289444 9104823.158001
+292637.192084 9104804.064944
+292629.034192 9104775.930137
+292623.820525 9104742.775718
+292617.583430 9104705.602182
+292610.463857 9104683.495532
+292602.343109 9104660.383344
+292594.207537 9104635.262098
+292583.061012 9104606.119711
+292572.930520 9104579.991909
+292563.778975 9104551.856058
+292550.615311 9104518.693522
+292540.470037 9104490.556648
+292533.291238 9104460.413750
+292529.130812 9104435.296521
+292521.010179 9104412.184296
+292512.882141 9104388.067539
+292502.774008 9104364.953280
+292490.670954 9104340.832462
+292488.631540 9104333.798742
+292481.534368 9104314.705623
+292471.396624 9104287.573238
+292460.242900 9104257.426250
+292447.064620 9104222.254587
+292436.867637 9104187.085960
+292420.722960 9104153.920288
+292413.648094 9104137.840727
+292253.192882 9104210.001888
+292043.197062 9104302.202033
+291947.161563 9104081.107990
+291889.548218 9103949.455882
+291781.441687 9103708.258108
+291720.050979 9103738.330012
+291684.076363 9103711.170420
+291487.014703 9103535.172871
+291368.955032 9103426.560353
+291219.875860 9103288.783436
+291206.898164 9103280.733543
+291170.983220 9103261.609657
+291160.074180 9103264.611730
+291121.443602 9103281.647923
+291099.640252 9103289.661117
+291079.979281 9103318.771649
+291053.376820 9103349.883896
+291033.560911 9103357.899169
+291015.636609 9103352.857572
+290968.760948 9103329.703808
+290904.012654 9103308.540089
+290842.422539 9103311.488312
+290818.572638 9103311.462978
+290748.252467 9103343.533152
+290714.524010 9103351.533493
+290689.584544 9103338.448048
+290673.463571 9103308.294977
+290678.954557 9103244.010919
+290694.309318 9103169.692079
+290688.987004 9103121.468972
+290663.664671 9103056.147511
+290655.184453 9102983.812294
+290640.933333 9102937.588685
+290615.751139 9102891.353378
+290582.876802 9102880.268381
+290549.119167 9102884.250371
+290517.223856 9102871.157307
+290523.443933 9102906.322551
+290499.999071 9102961.546632
+290448.670525 9103008.704574
+290437.040042 9103048.873350
+290416.649811 9103249.757734
+290398.114579 9103296.950836
+290370.458926 9103320.025406
+290298.224347 9103362.138216
+290158.627856 9103433.309903
+290114.232644 9103477.461525
+290090.912140 9103549.762758
+290088.386919 9103612.041070
+290109.697186 9103672.335980
+290145.229180 9103774.836523
+290140.407539 9103794.921987
+290127.871260 9103847.144197
+290000.396109 9104081.063175
+289897.396401 9104264.781790
+289876.806671 9104302.931865
+289791.429354 9104450.506216
+289764.552214 9104580.062091
+289751.404105 9104684.519443
+289763.210927 9104804.071727
+289787.841490 9104910.578861
+289827.128902 9104982.947578
+289832.141989 9104988.980172
+289866.247209 9105032.211781
+289972.104115 9105102.642718
+290049.163466 9105176.056121
+290102.298393 9105239.398456
+290145.812304 9105345.925289
+290163.016235 9105388.133968
+290196.276674 9105587.066634
+290225.607957 9105927.633892
+290473.301828 9105960.041231
+290627.651772 9106002.394234
+290970.215508 9106097.179104
+291108.458112 9106111.386671
+291256.365121 9106088.436380
+291295.079142 9106082.449408
+291472.385515 9106003.275575
+291809.165648 9105987.550155
+291857.706269 9105966.504984
+291877.648936 9105975.566133
+291879.636535 9105975.568171
+291905.527186 9105982.626357
+291977.955957 9105966.628144
+291992.855527 9105965.638860
+292067.627634 9105997.859940
+292110.309087 9105990.871837
+292123.191396 9105985.862366
+292130.214717 9105994.910216
+292142.140300 9105994.922371
+292148.058601 9105988.901275
+292151.025166 9105986.895256
+292155.971912 9105983.886733
+292161.934701 9105983.892808
+292161.956947 9105986.906393
+292165.969217 9105991.933085
+292170.982702 9105997.965316
+292175.009806 9106005.001063
+292179.022079 9106010.027752
+292185.029367 9106016.060993
+292195.011852 9106022.098278
+292204.935007 9106020.099335
+292213.827280 9106013.076738
+292223.720764 9106007.059679
+292230.669936 9106006.062226
+292239.614120 9106006.071322
+292244.612781 9106010.094487
+292246.630047 9106014.114619
+292251.613874 9106016.128727
+292271.519514 9106020.167038
+292290.498122 9106033.245080
+292309.365457 9106031.255197
+292332.200563 9106028.264812
+292344.200338 9106038.322185
+292369.616152 9105981.090329
+292383.336386 9105954.986726
+292396.099912 9105933.904751
+292415.656744 9105890.730228
+292460.317509 9105748.133711
+292462.853650 9105687.865112
+292502.983091 9105604.530664
+292503.947196 9105600.513564
+292511.645189 9105566.367706
+292517.444653 9105544.274157
+292528.109151 9105508.122268
+292592.808364 9105387.645490
+292606.402185 9105344.464936
+292604.206817 9105316.336184
+292581.631242 9105219.879497
+292589.551793 9105215.869446
+292614.344317 9105208.862924
+292727.419771 9105179.846250
+292726.344336 9105168.795462
+292732.113989 9105142.683814
+Region 1
+188
+293475.302915 9106999.770528
+293490.023860 9106974.672175
+293474.855912 9106939.499268
+293424.040580 9106787.767597
+293420.932539 9106770.687792
+293411.772281 9106741.547845
+293398.644254 9106713.408489
+293390.537410 9106692.305685
+293369.429177 9106660.140373
+293351.369405 9106637.018688
+293338.315908 9106618.924516
+293321.257421 9106596.808316
+293312.171727 9106577.713544
+293309.011652 9106553.602062
+293306.867719 9106532.505130
+293303.700212 9106507.389124
+293302.535206 9106484.284130
+293298.373908 9106459.167137
+293291.238655 9106435.051709
+293285.052557 9106404.910130
+293277.947096 9106384.812785
+293275.922281 9106379.788202
+293260.836656 9106355.664876
+293244.772131 9106333.549599
+293228.707624 9106311.434312
+293215.624532 9106289.321979
+293206.494330 9106264.200021
+293192.372830 9106236.059550
+293183.294734 9106217.969242
+293175.180688 9106195.861828
+293165.093935 9106175.761477
+293164.893091 9106148.639355
+293155.755524 9106122.512850
+293139.735780 9106106.424641
+293137.681249 9106097.381952
+293134.618048 9106086.329226
+293124.531348 9106066.228856
+293115.416142 9106043.115902
+293113.198012 9106011.973695
+293101.108885 9105989.862283
+293088.997464 9105964.737295
+293088.915670 9105953.687536
+293089.768182 9105934.602581
+293081.646827 9105911.490601
+293084.434882 9105885.375964
+293069.357009 9105862.257030
+293055.324984 9105846.170747
+293043.243381 9105825.063825
+293033.164236 9105805.967933
+293021.075224 9105783.856476
+293014.919225 9105757.732885
+293004.832681 9105737.632456
+292999.670492 9105711.509853
+292990.473706 9105677.347073
+292989.442759 9105672.323456
+292981.314099 9105648.206909
+292969.247464 9105629.108993
+292962.127475 9105607.002482
+292957.914544 9105574.853715
+292951.773499 9105550.739146
+292946.611387 9105524.616524
+292934.440791 9105491.455243
+292915.380604 9105467.327689
+292892.323023 9105440.182551
+292875.317299 9105425.097692
+292860.306577 9105411.019348
+292842.307093 9105395.933470
+292823.343546 9105384.864683
+292806.352718 9105371.788838
+292797.267591 9105352.693844
+292791.134112 9105329.583749
+292788.983187 9105307.482186
+292786.824842 9105284.376097
+292780.661685 9105257.247895
+292769.499949 9105226.096574
+292741.473708 9105198.946293
+292727.494006 9105189.891509
+292727.419771 9105179.846250
+292614.344317 9105208.862924
+292589.551793 9105215.869446
+292581.631242 9105219.879497
+292604.206817 9105316.336184
+292606.402185 9105344.464936
+292592.808364 9105387.645490
+292528.109151 9105508.122268
+292517.444653 9105544.274157
+292511.645189 9105566.367706
+292503.947196 9105600.513564
+292502.983091 9105604.530664
+292462.853650 9105687.865112
+292460.317509 9105748.133711
+292415.656744 9105890.730228
+292396.099912 9105933.904751
+292383.336386 9105954.986726
+292369.616152 9105981.090329
+292344.200338 9106038.322185
+292366.204887 9106057.430377
+292373.176319 9106059.446483
+292394.023830 9106056.454050
+292411.007460 9106068.525488
+292431.002184 9106084.618044
+292444.107127 9106109.744291
+292450.069924 9106109.750324
+292454.045122 9106109.754345
+292458.005474 9106107.749312
+292480.877705 9106109.781479
+292499.871245 9106124.868462
+292522.765754 9106129.914185
+292573.664861 9106159.096601
+292619.491051 9106174.210575
+292659.347033 9106188.313968
+292661.334633 9106188.315969
+292663.322233 9106188.317969
+292666.311061 9106189.325495
+292671.287490 9106190.335021
+292674.276318 9106191.342547
+292677.257718 9106191.345547
+292680.246546 9106192.353072
+292683.227947 9106192.356071
+292689.213032 9106195.375646
+292691.208061 9106196.382171
+292694.189461 9106196.385170
+292696.184490 9106197.391694
+292700.174547 9106199.404743
+292702.169576 9106200.411267
+292705.158405 9106201.418790
+292708.154663 9106203.430839
+292710.157121 9106205.441888
+292713.145951 9106206.449410
+292718.152097 9106211.477032
+292723.143386 9106214.495602
+292725.145845 9106216.506651
+292728.142105 9106218.518697
+292731.138365 9106220.530744
+292733.133395 9106221.537266
+292735.135855 9106223.548314
+292740.127146 9106226.566882
+292744.117207 9106228.579925
+292747.113469 9106230.591970
+292750.102300 9106231.599490
+292752.097331 9106232.606011
+292759.083656 9106236.631097
+292762.094778 9106240.652191
+292820.989118 9106275.869390
+292885.846348 9106311.092459
+292922.840032 9106341.264974
+292991.791602 9106392.564208
+293028.956471 9106445.840643
+293036.017222 9106459.910908
+293043.975093 9106460.923356
+293060.892077 9106463.953760
+293067.915650 9106473.001400
+293076.956589 9106486.069112
+293089.928119 9106493.113637
+293124.897271 9106518.261324
+293138.877502 9106527.315865
+293150.728760 9106517.282490
+293193.700488 9106549.469670
+293219.814785 9106586.662650
+293263.750658 9106614.832633
+293284.762027 9106633.939230
+293300.856488 9106660.072548
+293314.881461 9106675.154148
+293326.881603 9106685.211166
+293338.904086 9106698.281745
+293353.159910 9106744.503502
+293364.337539 9106777.663520
+293381.597205 9106826.901764
+293386.596047 9106830.924755
+293390.615973 9106836.955808
+293392.730203 9106854.034635
+293394.762511 9106860.063725
+293401.823459 9106874.133890
+293407.868256 9106885.189507
+293410.901828 9106892.224097
+293416.909389 9106898.257106
+293422.916952 9106904.290113
+293423.955455 9106910.318220
+293425.023753 9106920.364413
+293427.108212 9106933.425149
+293432.151764 9106943.475259
+293436.186608 9106951.515346
+293442.179283 9106955.539306
+293447.185595 9106960.566807
+293460.202011 9106973.638306
+293464.214514 9106978.664825
+293469.258081 9106988.714928
+293475.302915 9106999.770528
diff --git a/examples/data/BairrosRecife2.csv b/examples/data/BairrosRecife2.csv
new file mode 100644
index 0000000..ca41f68
--- /dev/null
+++ b/examples/data/BairrosRecife2.csv
@@ -0,0 +1,94 @@
+261160605001;1;Recife;RECIFE
+261160605002;2;Santo Amaro;SANTO AMARO
+261160605003;3;Boa Vista;BOA VISTA
+261160605004;4;Soledade;SOLEDADE
+261160605005;5;Santo Antonio;SANTO ANTONIO
+261160605006;6;Paissandu;PAISSANDU
+261160605007;7;Ilha do Leite;ILHA DO LEITE
+261160605008;8;Coelhos;COELHOS
+261160605009;9;Ilha Joana Bezerra;ILHA JOANA BEZERRA
+261160605010;10;Cabanga;CABANGA
+261160605011;11;Sao Jose;SAO JOSE
+261160605012;12;Derby;DERBY
+261160605013;13;Gra�as;GRACAS
+261160605014;14;Jaqueira;JAQUEIRA
+261160605015;15;Aflitos;AFLITOS
+261160605016;16;Espinheiro;ESPINHEIRO
+261160605017;17;Rosarinho;ROSARINHO
+261160605018;18;Tamarineira;TAMARINEIRA
+261160605019;19;Peixinhos;PEIXINHOS
+261160605020;20;Campina do Barreto;CAMPINA DO BARRETO
+261160605021;21;Arruda;ARRUDA
+261160605022;22;Ponto de Parada;PONTO DE PARADA
+261160605023;23;Hipodromo;HIPODROMO
+261160605024;24;Campo Grande;CAMPO GRANDE
+261160605025;25;Encruzilhada;ENCRUZILHADA
+261160605026;26;Torreao;TORREAO
+261160605027;27;Passarinho;PASSARINHO
+261160605028;28;Dois Unidos;DOIS UNIDOS
+261160605029;29;Linha do Tiro;LINHA DO TIRO
+261160605030;30;Beberibe;BEBERIBE
+261160605031;31;Alto Santa Teresinha;ALTO SANTA TERESINHA
+261160605032;32;Porto da Madeira;PORTO DA MADEIRA
+261160605033;33;Cajueiro;CAJUEIRO
+261160605034;34;Fundao;FUNDAO
+261160605035;35;Agua Fria;AGUA FRIA
+261160605036;36;Bomba do Hemeterio;BOMBA DO HEMETERIO
+261160605037;37;Pau-Ferro;PAU-FERRO
+261160605038;38;Guabiraba;GUABIRABA
+261160605039;39;Sitio dos Pintos;SITIO DOS PINTOS
+261160605040;40;Dois Irmaos;DOIS IRMAOS
+261160605041;41;Brejo da Guabiraba;BREJO DA GUABIRABA
+261160605042;42;Corrego do Jenipa;CORREGO DO JENIPAPO
+261160605043;43;Apipucos;APIPUCOS
+261160605044;44;Macaxeira;MACAXEIRA
+261160605045;45;Nova Descoberta;NOVA DESCOBERTA
+261160605046;46;Brejo de Beberibe;BREJO DE BEBERIBE
+261160605047;47;Alto do Mandu;ALTO DO MANDU
+261160605048;48;Casa Amarela;CASA AMARELA
+261160605049;49;Vasco da Gama;VASCO DA GAMA
+261160605050;50;Alto Jose Bonifacio;ALTO JOSE BONIFACIO
+261160605051;51;Morro da Conceicao;MORRO DA CONCEICAO
+261160605052;52;Alto Jose do Pinho;ALTO JOSE DO PINHO
+261160605053;53;Mangabeira;MANGABEIRA
+261160605054;54;Parnamirim;PARNAMIRIM
+261160605055;55;Casa Forte;CASA FORTE
+261160605056;56;Santana;SANTANA
+261160605057;57;Po�o;POCO
+261160605058;58;Monteiro;MONTEIRO
+261160605059;59;Torre;TORRE
+261160605060;60;Cordeiro;CORDEIRO
+261160605061;61;Zumbi;ZUMBI
+261160605062;62;Madalena;MADALENA
+261160605063;63;Prado;PRADO
+261160605064;64;Ilha do Retiro;ILHA DO RETIRO
+261160605065;65;Bongi;BONGI
+261160605066;66;San Martin;SAN MARTIN
+261160605067;67;Mustardinha;MUSTARDINHA
+261160605068;68;Mangueira;MANGUEIRA
+261160605069;69;Varzea;VARZEA
+261160605070;70;Caxanga�;CAXANGA
+261160605071;71;Iputinga;IPUTINGA
+261160605072;72;Torroes;TORROES
+261160605073;73;Engenho do Meio;ENGENHO DO MEIO
+261160605074;74;Cidade Universitaria�;CIDADE UNIVERSITARIA
+261160605075;75;Afogados;AFOGADOS
+261160605076;76;Jiquia�;JIQUIA
+261160605077;77;Estancia;ESTANCIA
+261160605078;78;Areias;AREIAS
+261160605079;79;Ca�ote;CACOTE
+261160605080;80;Curado;CURADO
+261160605081;81;Toto;TOTO
+261160605082;82;Coqueiral;COQUEIRAL
+261160605083;83;Sancho;SANCHO
+261160605084;84;Tejipio;TEJIPIO
+261160605085;85;Jardim Sao Paulo;JARDIM SAO PAULO
+261160605086;86;Barro;BARRO
+261160605087;87;Cohab;COHAB
+261160605088;88;Jordao;JORDAO
+261160605089;89;Ibura;IBURA
+261160605090;90;Ipsep;IPSEP
+261160605091;91;Imbiribeira;IMBIRIBEIRA
+261160605092;92;Boa Viagem;BOA VIAGEM
+261160605093;93;Pina;PINA
+261160605094;94;Brasilia Teimosa;BRASILIA TEIMOSA
diff --git a/examples/data/Cadastro_Escolas.geo b/examples/data/Cadastro_Escolas.geo
new file mode 100644
index 0000000..d5b83d4
--- /dev/null
+++ b/examples/data/Cadastro_Escolas.geo
@@ -0,0 +1,201 @@
+PONTOS
+1 184880.000000 8252050.000000 -47.941111 -15.790318
+2 185860.000000 8252050.000000 -47.931973 -15.790441
+3 185685.000000 8252275.000000 -47.933575 -15.788388
+4 185140.000000 8250300.000000 -47.938915 -15.806151
+21 191400.000000 8246450.000000 -47.881030 -15.841695
+22 189700.000000 8246360.000000 -47.896898 -15.842296
+29 193120.000000 8258910.000000 -47.863406 -15.729404
+30 194600.000000 8257320.000000 -47.849809 -15.743941
+31 190285.000000 8250745.000000 -47.890878 -15.802777
+32 189930.000000 8257645.000000 -47.893305 -15.740433
+33 190770.000000 8253110.000000 -47.886053 -15.781484
+34 188420.000000 8247530.000000 -47.908685 -15.831572
+35 191095.000000 8250010.000000 -47.883419 -15.809514
+36 186220.000000 8254440.000000 -47.928306 -15.768908
+37 187300.000000 8249355.000000 -47.918894 -15.814955
+38 188495.000000 8247600.000000 -47.907977 -15.830950
+39 189520.000000 8249645.000000 -47.898154 -15.812614
+40 194720.000000 8251690.000000 -47.849400 -15.794791
+41 189100.000000 8249355.000000 -47.902108 -15.815180
+42 190150.000000 8250500.000000 -47.892169 -15.804972
+43 187400.000000 8248050.000000 -47.918131 -15.826750
+44 189295.000000 8248535.000000 -47.900395 -15.822608
+45 192035.000000 8253650.000000 -47.874189 -15.776764
+46 186790.000000 8248895.000000 -47.923710 -15.819044
+47 191470.000000 8256050.000000 -47.879151 -15.755025
+48 191850.000000 8254850.000000 -47.875761 -15.765906
+49 188230.000000 8250150.000000 -47.910119 -15.807893
+50 189700.000000 8254500.000000 -47.895852 -15.768801
+51 188620.000000 8247680.000000 -47.906801 -15.830243
+52 187125.000000 8249330.000000 -47.920530 -15.815158
+53 187975.000000 8249825.000000 -47.912539 -15.810796
+54 189940.000000 8253200.000000 -47.893781 -15.780568
+55 183835.000000 8255140.000000 -47.950451 -15.762288
+56 191025.000000 8253160.000000 -47.883669 -15.781064
+57 190950.000000 8253890.000000 -47.884275 -15.774463
+58 190900.000000 8254540.000000 -47.884658 -15.768588
+59 188950.000000 8249220.000000 -47.903524 -15.816380
+60 187955.000000 8248490.000000 -47.912898 -15.822847
+61 190150.000000 8256960.000000 -47.891341 -15.746645
+62 187145.000000 8247940.000000 -47.920524 -15.827711
+63 190145.000000 8249800.000000 -47.892305 -15.811292
+64 189600.000000 8249295.000000 -47.897453 -15.815784
+65 188940.000000 8248700.000000 -47.903685 -15.821074
+66 187360.000000 8247480.000000 -47.918578 -15.831891
+67 190670.000000 8253750.000000 -47.886904 -15.775693
+68 189645.000000 8250470.000000 -47.896882 -15.805180
+69 189400.000000 8250225.000000 -47.899198 -15.807362
+70 190560.000000 8254320.000000 -47.887856 -15.770532
+71 188710.000000 8249570.000000 -47.905717 -15.813190
+72 189920.000000 8256400.000000 -47.893557 -15.751673
+73 186950.000000 8248060.000000 -47.922327 -15.826603
+74 186670.000000 8247930.000000 -47.924955 -15.827741
+75 189510.000000 8257890.000000 -47.897189 -15.738169
+76 186350.000000 8247660.000000 -47.927974 -15.830139
+77 191750.000000 8253610.000000 -47.876851 -15.777090
+78 191650.000000 8254350.000000 -47.877689 -15.770396
+79 190075.000000 8249285.000000 -47.893024 -15.815933
+80 191480.000000 8255280.000000 -47.879156 -15.761978
+81 191130.000000 8256100.000000 -47.882315 -15.754531
+82 188750.000000 8248090.000000 -47.905535 -15.826558
+83 191070.000000 8256360.000000 -47.882841 -15.752176
+84 187900.000000 8247600.000000 -47.913526 -15.830875
+85 190605.000000 8257745.000000 -47.886999 -15.739614
+86 186970.000000 8246890.000000 -47.922292 -15.837169
+87 190080.000000 8254620.000000 -47.892293 -15.767764
+88 189680.000000 8255940.000000 -47.895854 -15.755796
+89 185860.000000 8253820.000000 -47.931743 -15.774461
+91 188350.000000 8250345.000000 -47.908975 -15.806148
+92 187800.000000 8250050.000000 -47.914142 -15.808742
+93 187130.000000 8246640.000000 -47.920832 -15.839446
+94 186530.000000 8249880.000000 -47.926007 -15.810118
+95 188580.000000 8249900.000000 -47.906887 -15.810194
+96 190350.000000 8250670.000000 -47.890282 -15.803462
+97 190970.000000 8254450.000000 -47.884017 -15.769409
+98 188790.000000 8249145.000000 -47.905026 -15.817037
+99 187040.000000 8247885.000000 -47.921510 -15.828194
+100 189055.000000 8248800.000000 -47.902599 -15.820185
+101 190710.000000 8253080.000000 -47.886616 -15.781747
+102 189900.000000 8250755.000000 -47.894467 -15.802639
+103 190725.000000 8253740.000000 -47.886392 -15.775790
+104 189380.000000 8250140.000000 -47.899396 -15.808127
+105 188585.000000 8249490.000000 -47.906893 -15.813897
+106 189980.000000 8256450.000000 -47.892992 -15.751229
+107 186875.000000 8248160.000000 -47.923013 -15.825690
+108 186390.000000 8247840.000000 -47.927578 -15.828519
+109 191720.000000 8253840.000000 -47.877102 -15.775010
+463 185300.000000 8252710.000000 -47.937109 -15.784412
+464 184780.000000 8251740.000000 -47.942084 -15.793104
+465 185045.000000 8252880.000000 -47.939464 -15.782845
+466 185100.000000 8251460.000000 -47.939136 -15.795672
+467 184785.000000 8251470.000000 -47.942072 -15.795542
+468 184540.000000 8251175.000000 -47.944395 -15.798175
+469 185150.000000 8251660.000000 -47.938644 -15.793873
+470 184370.000000 8250550.000000 -47.946062 -15.803796
+471 185375.000000 8252750.000000 -47.936404 -15.784060
+528 191820.000000 8246735.000000 -47.877076 -15.839174
+540 192010.000000 8258485.000000 -47.873807 -15.733105
+546 189350.000000 8256240.000000 -47.898892 -15.753047
+547 187570.000000 8248430.000000 -47.916496 -15.823340
+548 190280.000000 8249710.000000 -47.891058 -15.812121
+549 188560.000000 8250500.000000 -47.906996 -15.804774
+550 190800.000000 8256780.000000 -47.885305 -15.748351
+551 187030.000000 8248900.000000 -47.921471 -15.819029
+552 191600.000000 8253950.000000 -47.878206 -15.774002
+553 190250.000000 8254300.000000 -47.890749 -15.770675
+554 190720.000000 8249520.000000 -47.886979 -15.813891
+555 189980.000000 8254760.000000 -47.893208 -15.766488
+556 187460.000000 8249930.000000 -47.917328 -15.809783
+557 190570.000000 8253100.000000 -47.887919 -15.781549
+558 188870.000000 8257600.000000 -47.903193 -15.740708
+559 191450.000000 8250470.000000 -47.880049 -15.805404
+560 189820.000000 8254750.000000 -47.894701 -15.766558
+561 189250.000000 8256450.000000 -47.899797 -15.751138
+562 188660.000000 8250270.000000 -47.906093 -15.806863
+563 189090.000000 8250560.000000 -47.902046 -15.804299
+564 189470.000000 8251060.000000 -47.898438 -15.799832
+565 189040.000000 8257000.000000 -47.901685 -15.746146
+566 189800.000000 8251140.000000 -47.895350 -15.799150
+567 188100.000000 8249990.000000 -47.911352 -15.809321
+568 186850.000000 8249120.000000 -47.923122 -15.817020
+569 186440.000000 8248600.000000 -47.927013 -15.821663
+570 188400.000000 8250050.000000 -47.908546 -15.808817
+571 189870.000000 8254110.000000 -47.894317 -15.772343
+572 188650.000000 8250600.000000 -47.906144 -15.803883
+573 188900.000000 8250370.000000 -47.903842 -15.805990
+574 189900.000000 8254230.000000 -47.894022 -15.771263
+575 187290.000000 8249570.000000 -47.918960 -15.813012
+576 188820.000000 8250630.000000 -47.904555 -15.803633
+577 187350.000000 8246820.000000 -47.918757 -15.837849
+578 189670.000000 8251110.000000 -47.896567 -15.799405
+579 190100.000000 8248830.000000 -47.892849 -15.820044
+580 192020.000000 8253930.000000 -47.874293 -15.774234
+581 189290.000000 8248230.000000 -47.900481 -15.825361
+582 187520.000000 8246910.000000 -47.917160 -15.837057
+583 186560.000000 8248700.000000 -47.925881 -15.820775
+584 189150.000000 8248100.000000 -47.901803 -15.826517
+585 190300.000000 8253100.000000 -47.890437 -15.781516
+586 191380.000000 8250300.000000 -47.880724 -15.806931
+587 189180.000000 8255700.000000 -47.900546 -15.757901
+588 191700.000000 8255320.000000 -47.877100 -15.761644
+589 189340.000000 8250950.000000 -47.899664 -15.800809
+590 191620.000000 8255700.000000 -47.877797 -15.758203
+591 188820.000000 8247800.000000 -47.904920 -15.829185
+592 190380.000000 8249150.000000 -47.890197 -15.817190
+593 189180.000000 8256470.000000 -47.900447 -15.750949
+594 188820.000000 8250400.000000 -47.904584 -15.805710
+595 188020.000000 8247840.000000 -47.912376 -15.828723
+596 191700.000000 8255480.000000 -47.877079 -15.760200
+597 190240.000000 8249000.000000 -47.891522 -15.818527
+598 189270.000000 8250810.000000 -47.900335 -15.802064
+599 189530.000000 8254860.000000 -47.897391 -15.765529
+600 189630.000000 8257890.000000 -47.896070 -15.738184
+601 190310.000000 8253690.000000 -47.890268 -15.776190
+602 188930.000000 8250380.000000 -47.903561 -15.805904
+603 186850.000000 8249440.000000 -47.923080 -15.814131
+604 189460.000000 8256590.000000 -47.897822 -15.749900
+605 188560.000000 8250380.000000 -47.907012 -15.805858
+606 187460.000000 8249630.000000 -47.917367 -15.812492
+607 190530.000000 8255180.000000 -47.888026 -15.762764
+608 189990.000000 8253920.000000 -47.893222 -15.774073
+609 189020.000000 8256900.000000 -47.901884 -15.747047
+610 188950.000000 8250820.000000 -47.903318 -15.801934
+611 188820.000000 8247790.000000 -47.904921 -15.829275
+612 191910.000000 8254500.000000 -47.875246 -15.769074
+613 189550.000000 8256160.000000 -47.897038 -15.753794
+614 188800.000000 8247700.000000 -47.905119 -15.830085
+615 186970.000000 8249260.000000 -47.921984 -15.815771
+616 188280.000000 8249990.000000 -47.909673 -15.809344
+617 186880.000000 8246950.000000 -47.923124 -15.836616
+618 189860.000000 8254370.000000 -47.894377 -15.769994
+619 189000.000000 8247930.000000 -47.903224 -15.828033
+620 188990.000000 8257180.000000 -47.902128 -15.744515
+621 186410.000000 8247550.000000 -47.927429 -15.831139
+622 189300.000000 8257330.000000 -47.899219 -15.743199
+623 189870.000000 8256970.000000 -47.893951 -15.746520
+624 186510.000000 8248820.000000 -47.926331 -15.819686
+625 188925.000000 8256730.000000 -47.902791 -15.748570
+626 189715.000000 8250215.000000 -47.896262 -15.807491
+627 189920.000000 8255210.000000 -47.893710 -15.762417
+628 188460.000000 8249560.000000 -47.908050 -15.813249
+629 189470.000000 8255940.000000 -47.897812 -15.755770
+630 194100.000000 8250250.000000 -47.855364 -15.807717
+631 189580.000000 8255120.000000 -47.896891 -15.763188
+632 189110.000000 8256700.000000 -47.901071 -15.748864
+634 188900.000000 8257280.000000 -47.902954 -15.743601
+635 191020.000000 8249860.000000 -47.884137 -15.810859
+636 189105.000000 8255680.000000 -47.901248 -15.758073
+637 188220.000000 8250115.000000 -47.910217 -15.808208
+638 190900.000000 8256180.000000 -47.884449 -15.753780
+639 188480.000000 8248280.000000 -47.908029 -15.824808
+640 190660.000000 8253590.000000 -47.887017 -15.777136
+641 188790.000000 8249625.000000 -47.904964 -15.812703
+642 187060.000000 8248325.000000 -47.921266 -15.824224
+643 191305.000000 8250150.000000 -47.881442 -15.808276
+644 190610.000000 8252810.000000 -47.887583 -15.784172
+645 187830.000000 8251650.000000 -47.913655 -15.794300
+646 188630.000000 8247690.000000 -47.906706 -15.830154
+830 184740.000000 8251050.000000 -47.942547 -15.799329
+831 184950.000000 8251040.000000 -47.940590 -15.799445
+END
diff --git a/examples/data/Cadastro_Escolas.tab b/examples/data/Cadastro_Escolas.tab
new file mode 100644
index 0000000..ef759f6
--- /dev/null
+++ b/examples/data/Cadastro_Escolas.tab
@@ -0,0 +1,237 @@
+TABLE
+CADASTRAL ROTULO
+SEPARATOR ,
+ROTULO,TEXT,32,0
+NOME,TEXT,32,0
+CODIGO,REAL,17,8
+NOME_ESC,TEXT,60,0
+ENDERECO,TEXT,55,0
+TELEFONE,TEXT,13,0
+NOME_RA,TEXT,28,0
+TIPO,TEXT,11,0
+ENSINO,TEXT,15,0
+NO_SALAS,REAL,17,8
+TURNO,TEXT,11,0
+CRE_MAT_AL,REAL,17,8
+CRE_MAT_PF,REAL,17,8
+JARDIM_AL,REAL,17,8
+JARDIM_PF,REAL,17,8
+PG_1A4S_AL,REAL,17,8
+PG_1A4S_PF,REAL,17,8
+PG_5A8S_AL,REAL,17,8
+PG_5A8S_PF,REAL,17,8
+SEGRAU_AL,REAL,17,8
+SEGRAU_PF,REAL,17,8
+ESPECIA_AL,REAL,17,8
+ESP_CLS_CO,REAL,17,8
+ESPECIA_PF,REAL,17,8
+SUPLET_AL,REAL,17,8
+SUPLET_PF,REAL,17,8
+EXTR_AL,REAL,17,8
+EXTR_PF,REAL,17,8
+MUSIC_AL,REAL,17,8
+MUSIC_PF,REAL,17,8
+PROFISS_AL,REAL,17,8
+PROFISS_PF,REAL,17,8
+COORD_X,REAL,17,8
+COORD_Y,REAL,17,8
+INFO_END
+1,1,53008871.000000,Escola Recanto Cultural,Q 02 - Bloco K - Casa 26,233-2255,RA XI - CRUZEIRO,Particular,Infantil,4.000000,M V,31.000000,2.000000,46.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184880.000000,8252050.000000
+2,2,53008901.000000,Maternal e Jardim de Infancia Barquinho Amarelo,Q 10 - Bloco X - Casa 4,234-1149,RA XI - CRUZEIRO,Particular,Infantil,8.000000,M V,36.000000,2.000000,98.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185860.000000,8252050.000000
+3,3,0.000000,Maternal e Jardim de Infancia Matita Pere,Qd 6 - Bloco X - Casa 5,233-3786,RA XI - CRUZEIRO,Particular,Infantil,4.000000,M V,0.000000,0.000000,72.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185685.000000,8252275.000000
+4,4,0.000000,Escola Batista Sementinha do Saber,AOS 1/2 - Lote 7,233-3697,RA XI - CRUZEIRO,Particular,Infantil,4.000000,M V,33.000000,2.000000,26.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185140.000000,8250300.000000
+21,21,53009576.000000,INEI Centro de Ensino de 1o Grau,SHIS QI 7 - Conj 17 - Lote F,248-2450,RA XVI - LAGO SUL,Particular,Inf/Reg,17.000000,M,27.000000,2.000000,76.000000,3.000000,131.000000,6.000000,149.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191400.000000,8246450.000000
+22,22,53009592.000000,Instituto Nossa Senhora do Perpetuo Socorro,SHIS EQL 6/8 - Conj A,248-0043,RA XVI - LAGO SUL,Particular,Inf/Reg,15.000000,M V,39.000000,3.000000,115.000000,7.000000,216.000000,12.000000,181.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189700.000000,8246360.000000
+29,29,53009452.000000,Escola de 1o Grau Tia Bibia - INDI,SHIN QI 03 - Conj D - Area Especial,577-3935,RA XVIII - LAGO NORTE,Particular,Inf/Reg,21.000000,M V,98.000000,5.000000,96.000000,4.000000,201.000000,10.000000,104.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,193120.000000,8258910.000000
+30,30,0.000000,Sempre Maternal e Jardim de Infancia,SHIN QI 9 - Conj 1 - Casa 28,368-5090,RA XVIII - LAGO NORTE,Particular,Infantil,2.000000,M V,8.000000,1.000000,8.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,194600.000000,8257320.000000
+31,31,53001451.000000,Escola Classe 102 Sul,SQS 102,226-8224,RA I - BRASILIA,Publica,Regular,8.000000,M V,0.000000,0.000000,0.000000,0.000000,378.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190285.000000,8250745.000000
+32,32,53001524.000000,Escola Classe 115 Norte,SQN 115,274-4960,RA I - BRASILIA,Publica,Inf/Reg/Supl,9.000000,M V N,0.000000,0.000000,50.000000,4.000000,394.000000,22.000000,0.000000,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,265.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189930.000000,8257645.000000
+33,33,53001575.000000,Escola Classe 302 Norte,SQN 302,224-8286,RA I - BRASILIA,Publica,Regular,8.000000,M V,0.000000,0.000000,0.000000,0.000000,397.000000,13.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190770.000000,8253110.000000
+34,34,53000200.000000,CEE 02 de Brasilia,SGAS 612,242-4400,RA I - BRASILIA,Publica,Especial,32.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,221.000000,0.000000,100.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188420.000000,8247530.000000
+35,35,53000234.000000,CES da Asa Sul - CESAS,SGAS 602 Projecao D,225-3122,RA I - BRASILIA,Publica,Supletivo,31.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,7241.000000,78.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191095.000000,8250010.000000
+36,36,53000242.000000,CES Verde Oliva - CESVO,Batalhao de Policia do Exercito,225-5110,RA I - BRASILIA,Publica,Supletivo,14.000000,N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1119.000000,26.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186220.000000,8254440.000000
+37,37,53000439.000000,Centro Integrado de Ensino Especial-CIEE,SGAS 912 Conjunto E Lotes 42/49,346-6161,RA I - BRASILIA,Publica,Especial,63.000000,M V I,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,244.000000,0.000000,122.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187300.000000,8249355.000000
+38,38,53000714.000000,CEE de Deficientes Visuais,SGAS 612 Lote 12,242-1447,RA I - BRASILIA,Publica,Especial,45.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,130.000000,0.000000,59.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188495.000000,8247600.000000
+39,39,53000846.000000,CE de 1o Grau 01 de Brasilia,SQS 106,243-3843,RA I - BRASILIA,Publica,Regular,9.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,552.000000,35.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189520.000000,8249645.000000
+40,40,53000854.000000,CE de 1o Grau 01 do Planalto,Rua 03 Acampamento Tamboril,225-1408,RA I - BRASILIA,Publica,Inf/Reg/Supl,18.000000,M V N,0.000000,0.000000,67.000000,2.000000,389.000000,16.000000,425.000000,24.000000,0.000000,0.000000,0.000000,0.000000,0.000000,117.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,194720.000000,8251690.000000
+41,41,53000862.000000,CE de 1o Grau 02 de Brasilia,SQS 107,243-9892,RA I - BRASILIA,Publica,Regular,8.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,509.000000,35.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189100.000000,8249355.000000
+42,42,53000870.000000,CE de 1o Grau 03 de Brasilia,SQS 103,223-4083,RA I - BRASILIA,Publica,Regular,10.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,826.000000,52.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190150.000000,8250500.000000
+43,43,53000889.000000,CE de 1o Grau 04 de Brasilia,SQS 113,242-4182,RA I - BRASILIA,Publica,Reg/Supl,10.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,897.000000,52.000000,0.000000,0.000000,0.000000,10.000000,0.000000,165.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187400.000000,8248050.000000
+44,44,53000897.000000,CE de 1o Grau 05 de Brasilia,SQS 408,242-0931,RA I - BRASILIA,Publica,Regular,10.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,763.000000,40.000000,0.000000,0.000000,0.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189295.000000,8248535.000000
+45,45,53000919.000000,CE de 1o Grau GAN,SGAN 603/604 Conjunto H,223-4863,RA I - BRASILIA,Publica,Regular,9.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,883.000000,55.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,192035.000000,8253650.000000
+46,46,53000927.000000,CE de 1o Grau POLIVALENTE,SGAS 913 Modulos 57/58,245-1178,RA I - BRASILIA,Publica,Regular,15.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,640.000000,48.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186790.000000,8248895.000000
+47,47,53000986.000000,CED CAN,SGAN 610 Modulo A,273-8001,RA I - BRASILIA,Publica,Regular,16.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,329.000000,37.000000,1003.000000,77.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191470.000000,8256050.000000
+48,48,53001010.000000,CED da Asa Norte - CEAN,SGAN 606 Modulos G/H,272-2338,RA I - BRASILIA,Publica,Regular,10.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,182.000000,11.000000,948.000000,65.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191850.000000,8254850.000000
+49,49,53001036.000000,CED ELEFANTE BRANCO,SGAS 908 Modulos 25/26,243-4588,RA I - BRASILIA,Publica,Regular,30.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,3670.000000,251.000000,0.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188230.000000,8250150.000000
+50,50,53001044.000000,CED GISNO,SGAN 908 Conjunto B,272-4103,RA I - BRASILIA,Publica,Reg/Supl,22.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,746.000000,38.000000,1094.000000,47.000000,0.000000,1.000000,0.000000,494.000000,17.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189700.000000,8254500.000000
+51,51,53001206.000000,CED SETOR LESTE,SGAS 611/612 Conjunto E,243-8263,RA I - BRASILIA,Publica,Regular,26.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,84.000000,9.000000,1913.000000,192.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188620.000000,8247680.000000
+52,52,53001214.000000,CED SETOR OESTE,SGAS 912/913,346-4224,RA I - BRASILIA,Publica,Regular,16.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1385.000000,70.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187125.000000,8249330.000000
+53,53,53001265.000000,CIE CASEB,SGAS 909 Conjunto A,242-2266,RA I - BRASILIA,Publica,Regular,37.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1796.000000,107.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187975.000000,8249825.000000
+54,54,53001354.000000,Colegio Militar de Brasilia,SGAN 902/904,321-6664,RA I - BRASILIA,Publica,Regular,92.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1583.000000,90.000000,1602.000000,97.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189940.000000,8253200.000000
+55,55,53001435.000000,Escola Classe 07 do Cruzeiro,Area Especial RCG - SMC,234-4309,RA I - BRASILIA,Publica,Inf/Reg,4.000000,M V,0.000000,0.000000,55.000000,5.000000,61.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,183835.000000,8255140.000000
+56,56,53001443.000000,Escola Classe 102 Norte,SQN 102,224-7507,RA I - BRASILIA,Publica,Reg/Supl,9.000000,M V N,0.000000,0.000000,0.000000,0.000000,126.000000,6.000000,364.000000,23.000000,0.000000,0.000000,0.000000,0.000000,0.000000,141.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191025.000000,8253160.000000
+57,57,53001460.000000,Escola Classe 104 Norte,SQN 104,225-5789,RA I - BRASILIA,Publica,Regular,9.000000,M V,0.000000,0.000000,0.000000,0.000000,32.000000,1.000000,574.000000,34.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190950.000000,8253890.000000
+58,58,53001478.000000,Escola Classe 106 Norte,SQN 106,273-7543,RA I - BRASILIA,Publica,Regular,8.000000,M V,0.000000,0.000000,0.000000,0.000000,441.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190900.000000,8254540.000000
+59,59,53001486.000000,Escola Classe 108 Sul,SQS 108,242-4516,RA I - BRASILIA,Publica,Regular,8.000000,M V,0.000000,0.000000,0.000000,0.000000,480.000000,13.000000,0.000000,0.000000,0.000000,0.000000,7.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188950.000000,8249220.000000
+60,60,53001494.000000,Escola Classe 111 Sul,SQS 111,242-2915,RA I - BRASILIA,Publica,Regular,10.000000,M V,0.000000,0.000000,0.000000,0.000000,356.000000,10.000000,340.000000,17.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187955.000000,8248490.000000
+61,61,53001508.000000,Escola Classe 113 Norte,SQN 113,273-7589,RA I - BRASILIA,Publica,Reg/Supl,9.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,593.000000,29.000000,0.000000,0.000000,0.000000,1.000000,0.000000,430.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190150.000000,8256960.000000
+62,62,53001516.000000,Escola Classe 114 Sul,SQS 114,242-3114,RA I - BRASILIA,Publica,Regular,7.000000,M V,0.000000,0.000000,0.000000,0.000000,333.000000,7.000000,0.000000,0.000000,0.000000,0.000000,16.000000,2.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187145.000000,8247940.000000
+63,63,53001532.000000,Escola Classe 204 Sul,SQS 204,223-4071,RA I - BRASILIA,Publica,Reg/Supl,11.000000,M V N,0.000000,0.000000,0.000000,0.000000,399.000000,13.000000,269.000000,13.000000,0.000000,0.000000,0.000000,0.000000,0.000000,198.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190145.000000,8249800.000000
+64,64,53001540.000000,Escola Classe 206 Sul,SQS 206,242-0002,RA I - BRASILIA,Publica,Inf/Reg,8.000000,M V,0.000000,0.000000,38.000000,2.000000,443.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189600.000000,8249295.000000
+65,65,53001559.000000,Escola Classe 209 Sul,SQS 209,244-7058,RA I - BRASILIA,Publica,Regular,8.000000,M V,0.000000,0.000000,0.000000,0.000000,372.000000,10.000000,0.000000,0.000000,0.000000,0.000000,11.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188940.000000,8248700.000000
+66,66,53001567.000000,Escola Classe 214 Sul,SQS 214,346-5464,RA I - BRASILIA,Publica,Regular,10.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,588.000000,35.000000,0.000000,0.000000,6.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187360.000000,8247480.000000
+67,67,53001583.000000,Escola Classe 304 Norte,SQN 304,226-4364,RA I - BRASILIA,Publica,Regular,7.000000,M V,0.000000,0.000000,0.000000,0.000000,433.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190670.000000,8253750.000000
+68,68,53001591.000000,Escola Classe 304 Sul,SQS 304,224-4003,RA I - BRASILIA,Publica,Regular,8.000000,M V,0.000000,0.000000,0.000000,0.000000,334.000000,16.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189645.000000,8250470.000000
+69,69,53001605.000000,Escola Classe 305 Sul,SQS 305,243-3083,RA I - BRASILIA,Publica,Reg/Supl,8.000000,M V N,0.000000,0.000000,0.000000,0.000000,566.000000,18.000000,0.000000,0.000000,0.000000,0.000000,8.000000,4.000000,1.000000,267.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189400.000000,8250225.000000
+70,70,53001613.000000,Escola Classe 306 Norte,SQN 306,272-4414,RA I - BRASILIA,Publica,Reg/Supl,8.000000,M V N,0.000000,0.000000,0.000000,0.000000,322.000000,9.000000,156.000000,9.000000,0.000000,0.000000,0.000000,14.000000,1.000000,431.000000,15.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190560.000000,8254320.000000
+71,71,53001621.000000,Escola Classe 308 Sul,SQS 308,242-6194,RA I - BRASILIA,Publica,Regular,8.000000,M V,0.000000,0.000000,0.000000,0.000000,505.000000,15.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188710.000000,8249570.000000
+72,72,53001630.000000,Escola Classe 312 Norte,SQN 312,340-1840,RA I - BRASILIA,Publica,Regular,6.000000,M V,0.000000,0.000000,0.000000,0.000000,395.000000,16.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189920.000000,8256400.000000
+73,73,53001648.000000,Escola Classe 314 Sul,SQS 314,346-4395,RA I - BRASILIA,Publica,Regular,9.000000,M V,0.000000,0.000000,0.000000,0.000000,517.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186950.000000,8248060.000000
+74,74,53001656.000000,Escola Classe 315 Sul,SQS 315,245-1399,RA I - BRASILIA,Publica,Regular,8.000000,M V,0.000000,0.000000,0.000000,0.000000,180.000000,6.000000,343.000000,27.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186670.000000,8247930.000000
+75,75,53001664.000000,Escola Classe 316 Norte,SQN 316,274-9055,RA I - BRASILIA,Publica,Inf/Reg,10.000000,M V,0.000000,0.000000,49.000000,2.000000,516.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,13.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189510.000000,8257890.000000
+76,76,53001672.000000,Escola Classe 316 Sul,SQS 316,245-2158,RA I - BRASILIA,Publica,Regular,11.000000,M V,0.000000,0.000000,0.000000,0.000000,663.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186350.000000,8247660.000000
+77,77,53001680.000000,Escola Classe 403 Norte,SQN 403,224-7501,RA I - BRASILIA,Publica,Regular,8.000000,M V,0.000000,0.000000,0.000000,0.000000,265.000000,12.000000,0.000000,0.000000,0.000000,0.000000,14.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191750.000000,8253610.000000
+78,78,53001699.000000,Escola Classe 405 Norte,SQN 405,272-2303,RA I - BRASILIA,Publica,Reg/Supl,7.000000,M V N,0.000000,0.000000,0.000000,0.000000,148.000000,8.000000,88.000000,8.000000,0.000000,0.000000,3.000000,0.000000,2.000000,250.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191650.000000,8254350.000000
+79,79,53001702.000000,Escola Classe 405 Sul,SQS 405,242-0735,RA I - BRASILIA,Publica,Regular,11.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,538.000000,37.000000,0.000000,0.000000,10.000000,3.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190075.000000,8249285.000000
+80,80,53001710.000000,Escola Classe 407 Norte,SQN 407,272-2053,RA I - BRASILIA,Publica,Inf/Reg/Supl,9.000000,M V N,0.000000,0.000000,24.000000,2.000000,229.000000,8.000000,0.000000,0.000000,0.000000,0.000000,1.000000,1.000000,2.000000,320.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191480.000000,8255280.000000
+81,81,53001729.000000,Escola Classe 409 Norte,SQN 410,272-4533,RA I - BRASILIA,Publica,Reg/Supl,8.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,431.000000,24.000000,0.000000,0.000000,0.000000,0.000000,2.000000,206.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191130.000000,8256100.000000
+82,82,53001737.000000,Escola Classe 410 Sul,SQS 410,242-6092,RA I - BRASILIA,Publica,Reg/Supl,8.000000,M V N,0.000000,0.000000,0.000000,0.000000,351.000000,15.000000,0.000000,0.000000,0.000000,0.000000,27.000000,8.000000,3.000000,180.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188750.000000,8248090.000000
+83,83,53001745.000000,Escola Classe 411 Norte,SQN 411,273-4240,RA I - BRASILIA,Publica,Inf/Reg,13.000000,M V,0.000000,0.000000,28.000000,1.000000,374.000000,10.000000,0.000000,0.000000,0.000000,0.000000,3.000000,3.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191070.000000,8256360.000000
+84,84,53001753.000000,Escola Classe 413 Sul,SQS 413,242-9686,RA I - BRASILIA,Publica,Reg/Supl,8.000000,M V N,0.000000,0.000000,0.000000,0.000000,183.000000,5.000000,315.000000,27.000000,0.000000,0.000000,0.000000,1.000000,0.000000,161.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187900.000000,8247600.000000
+85,85,53001761.000000,Escola Classe 415 Norte,SQN 415,273-5860,RA I - BRASILIA,Publica,Inf/Reg,7.000000,M V,0.000000,0.000000,146.000000,5.000000,180.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190605.000000,8257745.000000
+86,86,53001770.000000,Escola Classe 416 Sul,SQS 416,346-7277,RA I - BRASILIA,Publica,Inf/Reg,10.000000,M V,0.000000,0.000000,96.000000,4.000000,286.000000,11.000000,0.000000,0.000000,0.000000,0.000000,12.000000,0.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186970.000000,8246890.000000
+87,87,53001788.000000,Escola Classe 708 Norte,SHCGN 707/708,274-5781,RA I - BRASILIA,Publica,Reg/Supl,9.000000,M V N,0.000000,0.000000,0.000000,0.000000,341.000000,18.000000,0.000000,0.000000,0.000000,0.000000,10.000000,10.000000,6.000000,238.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190080.000000,8254620.000000
+88,88,53001796.000000,Escola Classe 711 Norte,SHCGN 711,273-0262,RA I - BRASILIA,Publica,Regular,10.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,392.000000,31.000000,0.000000,0.000000,36.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189680.000000,8255940.000000
+89,89,53001800.000000,Escola Classe do Setor Militar Urbano,Area Especial da QRO SMU,233-8362,RA I - BRASILIA,Publica,Inf/Reg,9.000000,M V,0.000000,0.000000,26.000000,1.000000,176.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185860.000000,8253820.000000
+91,91,53001834.000000,Escola Normal de Brasilia,SGAS 907 Conjunto A,244-1893,RA I - BRASILIA,Publica,Inf/Reg/Supl,41.000000,M V N I,0.000000,0.000000,331.000000,13.000000,669.000000,25.000000,0.000000,0.000000,549.000000,53.000000,23.000000,0.000000,5.000000,579.000000,28.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188350.000000,8250345.000000
+92,92,53001893.000000,Escola do Parque da Cidade,SGAS Q 909 Conjunto A Fundos,243-1225,RA I - BRASILIA,Publica,Regular,14.000000,M V I,0.000000,0.000000,0.000000,0.000000,93.000000,14.000000,92.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187800.000000,8250050.000000
+93,93,53001966.000000,Escola da Acao Social do Planalto,SGAS Q 616 Modulos 116/117,346-7334,RA I - BRASILIA,Publica,Regular,5.000000,M V,0.000000,0.000000,0.000000,0.000000,182.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,16.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187130.000000,8246640.000000
+94,94,53002148.000000,Escola Meninos e Meninas do Parque,Parque da Cidade - Estacionamento 06,322-7631,RA I - BRASILIA,Publica,Regular,5.000000,I,0.000000,0.000000,0.000000,0.000000,40.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186530.000000,8249880.000000
+95,95,53002210.000000,Jardim de Infancia 21 de Abril,Praca 21 de Abril EQS 707/708,242-0390,RA I - BRASILIA,Publica,Infantil,5.000000,M V,0.000000,0.000000,191.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188580.000000,8249900.000000
+96,96,53002237.000000,Jardim de Infancia da 102 Sul,SQS 102,225-2838,RA I - BRASILIA,Publica,Infantil,4.000000,M V,0.000000,0.000000,160.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190350.000000,8250670.000000
+97,97,53002245.000000,Jardim de Infancia da 106 Norte,SQN 106,274-4760,RA I - BRASILIA,Publica,Infantil,5.000000,M V,0.000000,0.000000,302.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190970.000000,8254450.000000
+98,98,53002253.000000,Jardim de Infancia da 108 Sul,SQS 108,242-7933,RA I - BRASILIA,Publica,Infantil,4.000000,M V,0.000000,0.000000,221.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188790.000000,8249145.000000
+99,99,53002261.000000,Jardim de Infancia da 114 Sul,SQS 114,242-3242,RA I - BRASILIA,Publica,Infantil,4.000000,M V,0.000000,0.000000,235.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187040.000000,8247885.000000
+100,100,53002270.000000,Jardim de Infancia da 208 Sul,SQS 208,242-4551,RA I - BRASILIA,Publica,Infantil,5.000000,M V,0.000000,0.000000,264.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,5.000000,4.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189055.000000,8248800.000000
+101,101,53002288.000000,Jardim de Infancia da 302 Norte,SQN 302,226-5736,RA I - BRASILIA,Publica,Infantil,5.000000,M V,0.000000,0.000000,255.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190710.000000,8253080.000000
+102,102,53002296.000000,Jardim de Infancia da 303 Sul,SQS 303,226-7198,RA I - BRASILIA,Publica,Infantil,5.000000,M V,0.000000,0.000000,204.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189900.000000,8250755.000000
+103,103,53002300.000000,Jardim de Infancia da 304 Norte,SQN 304,224-5783,RA I - BRASILIA,Publica,Infantil,5.000000,M V,0.000000,0.000000,242.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190725.000000,8253740.000000
+104,104,53002318.000000,Jardim de Infancia da 305 Sul,SQS 305,243-0228,RA I - BRASILIA,Publica,Infantil,4.000000,M V,0.000000,0.000000,233.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189380.000000,8250140.000000
+105,105,53002326.000000,Jardim de Infancia da 308 Sul,SQS 308,243-2214,RA I - BRASILIA,Publica,Infantil,4.000000,M V,0.000000,0.000000,217.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188585.000000,8249490.000000
+106,106,53002334.000000,Jardim de Infancia da 312 Norte,SQN 312,273-6992,RA I - BRASILIA,Publica,Infantil,5.000000,M V,0.000000,0.000000,266.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189980.000000,8256450.000000
+107,107,53002342.000000,Jardim de Infancia da 314 Sul,SQS 314,245-5119,RA I - BRASILIA,Publica,Infantil,4.000000,M V,0.000000,0.000000,150.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186875.000000,8248160.000000
+108,108,53002350.000000,Jardim de Infancia da 316 Sul,SQS 316,245-1969,RA I - BRASILIA,Publica,Infantil,4.000000,M V,0.000000,0.000000,243.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186390.000000,8247840.000000
+109,109,53002369.000000,Jardim de Infancia da 404 Norte,SQN 404,223-1803,RA I - BRASILIA,Publica,Infantil,5.000000,M V,0.000000,0.000000,271.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191720.000000,8253840.000000
+463,463,53008774.000000,Centro de Ensino de 1o Grau 01 do Cruzeiro,SRES Lote 06,234-2463,RA XI - CRUZEIRO,Publica,Reg/Supl,35.000000,M V N,0.000000,0.000000,0.000000,0.000000,418.000000,16.000000,577.000000,33.000000,0.000000,0.000000,0.000000,1.000000,0.000000,224.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185300.000000,8252710.000000
+464,464,53008782.000000,Centro de Ensino de 1o Grau 02 do Cruzeiro,SHCES Q 309 Lote 01,234-1464,RA XI - CRUZEIRO,Publica,Reg/Supl,25.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,724.000000,35.000000,0.000000,0.000000,8.000000,0.000000,1.000000,850.000000,27.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184780.000000,8251740.000000
+465,465,53008790.000000,Centro Educacional 01 do Cruzeiro,SRES Area Especial F Lote G,234-4492,RA XI - CRUZEIRO,Publica,Regular,15.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,333.000000,14.000000,775.000000,48.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185045.000000,8252880.000000
+466,466,53008804.000000,Centro Educacional 02 do Cruzeiro,SHCES Q 805 Lote 02,234-4939,RA XI - CRUZEIRO,Publica,Reg/Supl,20.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,816.000000,41.000000,763.000000,33.000000,0.000000,1.000000,0.000000,336.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185100.000000,8251460.000000
+467,467,53008820.000000,Escola Classe 04 do Cruzeiro,SHCE-EQ 405/407 Lote 01,233-8885,RA XI - CRUZEIRO,Publica,Inf/Reg,8.000000,M V,0.000000,0.000000,17.000000,1.000000,274.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184785.000000,8251470.000000
+468,468,53008839.000000,Escola Classe 05 do Cruzeiro,SHCES-EQ 201/203 Lote 01,233-8891,RA XI - CRUZEIRO,Publica,Inf/Reg,16.000000,M V,0.000000,0.000000,65.000000,2.000000,440.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184540.000000,8251175.000000
+469,469,53008847.000000,Escola Classe 06 do Cruzeiro,SHCES Q 807,233-8680,RA XI - CRUZEIRO,Publica,Inf/Reg,15.000000,M V,0.000000,0.000000,29.000000,1.000000,333.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185150.000000,8251660.000000
+470,470,53008855.000000,Escola Classe 08 do Cruzeiro,AOS 06/08 Lote 03,234-1656,RA XI - CRUZEIRO,Publica,Inf/Reg/Supl,20.000000,M V N,0.000000,0.000000,343.000000,12.000000,365.000000,13.000000,0.000000,0.000000,0.000000,0.000000,9.000000,0.000000,1.000000,285.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184370.000000,8250550.000000
+471,471,53008898.000000,Jardim de Infancia 01 do Cruzeiro,SRES Lote 05 Setor Educacional,233-1072,RA XI - CRUZEIRO,Publica,Infantil,18.000000,M V,0.000000,0.000000,411.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185375.000000,8252750.000000
+528,528,53009479.000000,Centro Educacional do Lago - CEL,SHIS QI 09 Conjunto 10 Lote H,248-0491,RA XVI - LAGO SUL,Publica,Reg/Supl,8.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,547.000000,27.000000,514.000000,28.000000,0.000000,0.000000,0.000000,444.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191820.000000,8246735.000000
+540,540,53009410.000000,Centro de Ensino de 1o Grau 01 do Lago Norte,SHIN QI 04/06 Area Especial,577-2528,RA XVIII - LAGO NORTE,Publica,Inf/Reg/Supl,20.000000,M V N,0.000000,0.000000,28.000000,1.000000,342.000000,15.000000,809.000000,37.000000,0.000000,0.000000,0.000000,0.000000,0.000000,360.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,192010.000000,8258485.000000
+546,546,53000781.000000,Colegio Arvense - Centro de Ensino de 1o Grau,EQN 712/912 - Conj C,273-0958,RA I - BRASILIA,Particular,Inf/Reg,23.000000,M V,119.000000,6.000000,160.000000,8.000000,177.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189350.000000,8256240.000000
+547,547,53000790.000000,Centro de Artes e Recreacoes Ursinho Feliz,EQS 112/312 - Lote C,244-2539,RA I - BRASILIA,Particular,Infantil,6.000000,M V,111.000000,5.000000,62.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187570.000000,8248430.000000
+548,548,53000803.000000,Centro Infantil Reino Encantado,EQS 204/404 - Lote C,223-7122,RA I - BRASILIA,Particular,Infantil,9.000000,M V,187.000000,10.000000,157.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190280.000000,8249710.000000
+549,549,53000811.000000,Casa da Crianca Pao de Santo Antonio,SGAS 906 - Modulo 10,242-2337,RA I - BRASILIA,Particular,Infantil,8.000000,I V,79.000000,0.000000,53.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188560.000000,8250500.000000
+550,550,53000838.000000,Centro de Ensino Compacto Junior,EQN 212/412 - Area Especial,273-5091,RA I - BRASILIA,Particular,Inf/Reg,12.000000,M V,24.000000,2.000000,86.000000,6.000000,168.000000,8.000000,197.000000,13.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190800.000000,8256780.000000
+551,551,53000900.000000,Centro de Ensino de 1o Grau Candanguinho,SEPS EQ 713/913 - Conj D,245-2004,RA I - BRASILIA,Particular,Inf/Reg,23.000000,M V,218.000000,11.000000,350.000000,16.000000,396.000000,19.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187030.000000,8248900.000000
+552,552,53000935.000000,Centro de Ensino de 1o Grau Popeye,EQN 204/404 - Conj C,226-4750,RA I - BRASILIA,Particular,Inf/Reg,9.000000,M V,53.000000,4.000000,92.000000,6.000000,64.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191600.000000,8253950.000000
+553,553,53000943.000000,Viver Centro de Ensino,SHGCN 706 - Conj A - Blocos A/B,349-3434,RA I - BRASILIA,Particular,Inf/Reg,17.000000,M V,36.000000,4.000000,101.000000,8.000000,143.000000,9.000000,90.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190250.000000,8254300.000000
+554,554,53000951.000000,INEI Centro Educacional,SGAS 604 - Conj C - Lotes 25 e 26,226-9877,RA I - BRASILIA,Particular,Inf/Reg,38.000000,M V,95.000000,6.000000,286.000000,13.000000,535.000000,19.000000,488.000000,22.000000,143.000000,16.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190720.000000,8249520.000000
+555,555,53000960.000000,Centro de Ensino Mauricio Salles de Mello,SHCGN 708 - Bloco C,272-1208,RA I - BRASILIA,Particular,Inf/Reg,22.000000,M V,50.000000,4.000000,145.000000,8.000000,284.000000,16.000000,286.000000,25.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189980.000000,8254760.000000
+556,556,53000226.000000,Centro de Ensino Tecnologico de Brasilia - CETEB,SGAS 910 - Conj D,243-8011,RA I - BRASILIA,Particular,Supletivo,19.000000,N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2684.000000,29.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187460.000000,8249930.000000
+557,557,53000293.000000,Centro Educacional Alfa,CRN 502 - Bloco B - No 68,321-4481,RA I - BRASILIA,Particular,Supletivo,4.000000,V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,168.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190570.000000,8253100.000000
+558,558,53000978.000000,Centro Educacional Alvorada,SGAN 916 - Modulo C/D,273-6181,RA I - BRASILIA,Particular,Regular,23.000000,M V,0.000000,0.000000,25.000000,3.000000,88.000000,11.000000,138.000000,16.000000,242.000000,27.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188870.000000,8257600.000000
+559,559,53001001.000000,Centro Educacional Compacto Integral,SGAS 601 - Conj A,224-0528,RA I - BRASILIA,Particular,Reg/Supl,14.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,163.000000,13.000000,269.000000,16.000000,0.000000,0.000000,0.000000,652.000000,37.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191450.000000,8250470.000000
+560,560,53001028.000000,Centro Educacional do CEUB,SEPN 707/907 - Lote C - Bloco 6,340-1835,RA I - BRASILIA,Particular,Regular,42.000000,M V,0.000000,0.000000,82.000000,6.000000,265.000000,12.000000,658.000000,31.000000,373.000000,20.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189820.000000,8254750.000000
+561,561,53001052.000000,Centro Educacional Juscelino Kubitschek,SGAN 913 - Bloco A,347-6557,RA I - BRASILIA,Particular,Reg/Supl,16.000000,M V N,0.000000,0.000000,36.000000,3.000000,91.000000,10.000000,249.000000,17.000000,437.000000,14.000000,0.000000,0.000000,0.000000,321.000000,20.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189250.000000,8256450.000000
+562,562,53001060.000000,Centro Educacional La Salle,SGAS 906 - Conj D,242-7878,RA I - BRASILIA,Particular,Inf/Reg,32.000000,M V N,0.000000,0.000000,0.000000,0.000000,304.000000,17.000000,615.000000,33.000000,778.000000,45.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188660.000000,8250270.000000
+563,563,53001079.000000,Centro Educacional La Salle - Creche,EQS 705/905 - Lote A,244-7043,RA I - BRASILIA,Particular,Infantil,10.000000,M V,38.000000,4.000000,85.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189090.000000,8250560.000000
+564,564,53001087.000000,Centro Educacional Leonardo da Vinci,SEUPS 703 - Bloco 1 - Lote B,226-6703,RA I - BRASILIA,Particular,Regular,42.000000,M,0.000000,0.000000,0.000000,0.000000,89.000000,8.000000,355.000000,18.000000,711.000000,38.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189470.000000,8251060.000000
+565,565,53001095.000000,Centro Educacional Leonardo da Vinci,SGAN 914 - Conj I,340-1616,RA I - BRASILIA,Particular,Regular,58.000000,M,0.000000,0.000000,0.000000,0.000000,286.000000,14.000000,905.000000,29.000000,1083.000000,48.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189040.000000,8257000.000000
+566,566,53001109.000000,Centro Educacional Maria Auxiliadora,SEPS 702 - Bloco C,224-5315,RA I - BRASILIA,Particular,Inf/Reg,29.000000,M V N,17.000000,1.000000,103.000000,6.000000,268.000000,8.000000,513.000000,47.000000,125.000000,16.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189800.000000,8251140.000000
+567,567,53001117.000000,Centro Educacional Nossa Senhora do Rosario,SGAS 908 - Lotes 23 e 24,243-7758,RA I - BRASILIA,Particular,Inf/Reg,16.000000,M V,16.000000,1.000000,74.000000,6.000000,158.000000,13.000000,202.000000,17.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188100.000000,8249990.000000
+568,568,53001125.000000,Colegio Integrado Objetivo,SGAS 913 - Lotes 54/55,245-4544,RA I - BRASILIA,Particular,Regular,33.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1627.000000,46.000000,4087.000000,116.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186850.000000,8249120.000000
+569,569,53001141.000000,Colegio Integrado Objetivo,SGAS 914 - Lotes 67/68,245-2445,RA I - BRASILIA,Particular,Inf/Reg,37.000000,M V,77.000000,3.000000,324.000000,14.000000,813.000000,29.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186440.000000,8248600.000000
+570,570,53001150.000000,Centro Educacional Planalto,SEUPS EQ 708/907 - Conjunto B,243-2769,RA I - BRASILIA,Particular,Inf/Reg,28.000000,M V,0.000000,0.000000,18.000000,1.000000,59.000000,4.000000,334.000000,18.000000,494.000000,29.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188400.000000,8250050.000000
+571,571,53001168.000000,Centro Educacional Projecao,SGAN 906 - Conj A,340-3106,RA I - BRASILIA,Particular,Inf/Reg,19.000000,M V,34.000000,3.000000,85.000000,4.000000,110.000000,10.000000,100.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189870.000000,8254110.000000
+572,572,53000064.000000,Centro Educacional Projecao,SGAS 906 - Modulo A,244-6161,RA I - BRASILIA,Particular,Regular,6.000000,M,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,146.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188650.000000,8250600.000000
+573,573,53001184.000000,Centro Educacional Rodolpho de Moraes Rego,SEUPS EQ 706/906 - Conjunto A,242-9087,RA I - BRASILIA,Particular,Regular,13.000000,M V,0.000000,0.000000,0.000000,0.000000,125.000000,14.000000,133.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188900.000000,8250370.000000
+574,574,53001192.000000,Centro Educacional Sagrada Familia,SGAN 906 - Modulo C/D,272-1727,RA I - BRASILIA,Particular,Inf/Reg,28.000000,M V,28.000000,4.000000,117.000000,13.000000,335.000000,17.000000,402.000000,12.000000,128.000000,15.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189900.000000,8254230.000000
+575,575,53001222.000000,Centro Educacional Sigma,SGAS 912 - Conjunto A,346-3232,RA I - BRASILIA,Particular,Regular,70.000000,M V,0.000000,0.000000,0.000000,0.000000,244.000000,9.000000,1429.000000,38.000000,2240.000000,48.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187290.000000,8249570.000000
+576,576,53001281.000000,Colegio Batista de Brasilia,SGAS 905 - Modulo 04,242-1898,RA I - BRASILIA,Particular,Inf/Reg,21.000000,M V,58.000000,4.000000,198.000000,7.000000,322.000000,21.000000,174.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188820.000000,8250630.000000
+577,577,53001290.000000,Colegio Cor Jesu,SGAS 615 - Conjunto G,346-5566,RA I - BRASILIA,Particular,Inf/Reg,20.000000,M V,18.000000,2.000000,136.000000,7.000000,274.000000,12.000000,341.000000,23.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187350.000000,8246820.000000
+578,578,53001303.000000,Colegio Dom Bosco,SEPS 702 - Bloco A,223-2650,RA I - BRASILIA,Particular,Inf/Reg,30.000000,M V,0.000000,0.000000,31.000000,2.000000,294.000000,16.000000,697.000000,34.000000,300.000000,21.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189670.000000,8251110.000000
+579,579,53001311.000000,Colegio Imaculada Conceicao,SGAS 606 - Conjunto C,243-5259,RA I - BRASILIA,Particular,Inf/Reg,14.000000,M V,24.000000,4.000000,90.000000,8.000000,190.000000,13.000000,314.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190100.000000,8248830.000000
+580,580,53001320.000000,Colegio Madre Carmen Salles,SGAN 604 - Conjunto D,223-2863,RA I - BRASILIA,Particular,Inf/Reg,29.000000,M V,28.000000,2.000000,178.000000,10.000000,383.000000,15.000000,395.000000,13.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,192020.000000,8253930.000000
+581,581,53001338.000000,Colegio Marista de Brasilia-1o Grau,SGAS 609 - Conjunto A,242-1243,RA I - BRASILIA,Particular,Inf/Reg,38.000000,M V,0.000000,0.000000,521.000000,18.000000,1059.000000,29.000000,1273.000000,46.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189290.000000,8248230.000000
+582,582,53001346.000000,Colegio Marista de Brasilia-2o Grau,SGAS 615 - Conjunto C,346-2288,RA I - BRASILIA,Particular,Regular,33.000000,M,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1477.000000,61.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187520.000000,8246910.000000
+583,583,53001362.000000,Colegio Notre Dame,SGAS 914 - Lotes 63/64,245-2836,RA I - BRASILIA,Particular,Inf/Reg,22.000000,M V,6.000000,0.000000,50.000000,6.000000,152.000000,12.000000,131.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186560.000000,8248700.000000
+584,584,53001370.000000,Colegio Pio XII,SGAS 609 - Conjunto C,242-1335,RA I - BRASILIA,Particular,Inf/Reg,24.000000,M V,56.000000,4.000000,124.000000,7.000000,256.000000,10.000000,349.000000,23.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189150.000000,8248100.000000
+585,585,53001389.000000,Colegio Sagrado Coracao de Maria,SHCGN 702 - Conjunto C,321-8588,RA I - BRASILIA,Particular,Inf/Reg,23.000000,M V,27.000000,3.000000,105.000000,7.000000,247.000000,13.000000,284.000000,15.000000,31.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190300.000000,8253100.000000
+586,586,53001397.000000,Colegio Santa Rosa,SGAS 601 - Conjunto C - Lote 3,224-2966,RA I - BRASILIA,Particular,Inf/Reg,23.000000,M V,26.000000,1.000000,233.000000,10.000000,531.000000,22.000000,507.000000,28.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191380.000000,8250300.000000
+587,587,53001400.000000,Colegio Santa Doroteia,SGAN 911 - Conjunto B,274-5110,RA I - BRASILIA,Particular,Inf/Reg,25.000000,M V,33.000000,3.000000,104.000000,9.000000,250.000000,15.000000,283.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189180.000000,8255700.000000
+588,588,53001419.000000,Creche Fundacao Cabo Frio,SGAN 608 - Modulo A,274-5176,RA I - BRASILIA,Particular,Infantil,10.000000,I,186.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191700.000000,8255320.000000
+589,589,53001427.000000,Cresca Centro de Realizacao Criadora,SEUPS EQ 703/903 - Bloco C,224-1640,RA I - BRASILIA,Particular,Inf/Reg,15.000000,M V,28.000000,2.000000,104.000000,6.000000,159.000000,8.000000,110.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189340.000000,8250950.000000
+590,590,53001826.000000,Educandario Espirito Santo,SGAN 609 - Conjunto A/B,273-5089,RA I - BRASILIA,Particular,Infantil,6.000000,M V,104.000000,4.000000,172.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191620.000000,8255700.000000
+591,591,53001907.000000,Escola Adventista de Brasilia,SGAS 611 - Modulo 75,242-3847,RA I - BRASILIA,Particular,Inf/Reg,16.000000,M,0.000000,0.000000,54.000000,3.000000,131.000000,9.000000,215.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188820.000000,8247800.000000
+592,592,53001915.000000,Escola Americana de Brasilia,SGAS 605 - Bloco E - Lote 34,243-3237,RA I - BRASILIA,Particular,Inf/Reg,40.000000,I,0.000000,0.000000,157.000000,8.000000,183.000000,14.000000,225.000000,25.000000,170.000000,21.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190380.000000,8249150.000000
+593,593,53001923.000000,Escola Anjo da Guarda,SGAN 913 - Lote A,272-4851,RA I - BRASILIA,Particular,Infantil,5.000000,M V,78.000000,4.000000,153.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189180.000000,8256470.000000
+594,594,53001931.000000,Centro Educacional Canarinho,SGAS 906 - Modulo 9,244-3950,RA I - BRASILIA,Particular,Inf/Reg,8.000000,M V,42.000000,2.000000,102.000000,6.000000,95.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188820.000000,8250400.000000
+595,595,53001940.000000,Centro Educacional Canarinho,EQS 212/412 - Bloco C,243-2891,RA I - BRASILIA,Particular,Infantil,6.000000,M V,81.000000,4.000000,138.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188020.000000,8247840.000000
+596,596,53001958.000000,Escola Cenecista Alzira Sodre,SGAN 608 - Modulo D,272-3233,RA I - BRASILIA,Particular,Infantil,12.000000,M V,154.000000,6.000000,113.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191700.000000,8255480.000000
+597,597,53001974.000000,Escola de 1o Grau Vicenta Maria,SGAS 606 - Conjunto A,243-2884,RA I - BRASILIA,Particular,Regular,4.000000,N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,99.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190240.000000,8249000.000000
+598,598,53001982.000000,Escola de 2o Grau Objetivo,SGAS 904 - Lotes A/C,225-7990,RA I - BRASILIA,Particular,Supletiv,18.000000,M,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,781.000000,61.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189270.000000,8250810.000000
+599,599,53002008.000000,Escola Fundamental Alvacir Vite Rossi,SGAN 908 - Conjunto B,347-8486,RA I - BRASILIA,Particular,Regular,12.000000,M V,0.000000,0.000000,0.000000,0.000000,341.000000,17.000000,92.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189530.000000,8254860.000000
+600,600,53002016.000000,Escola Golfinho Dourado,EQN 116/316 - Bloco C,274-0635,RA I - BRASILIA,Particular,Infantil,11.000000,M V,95.000000,5.000000,116.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189630.000000,8257890.000000
+601,601,53002024.000000,Escola Logosofica Gonzalez Pecotche,SHCGN 704 - Area Especial,224-9205,RA I - BRASILIA,Particular,Inf/Reg,10.000000,M V,50.000000,4.000000,73.000000,5.000000,88.000000,6.000000,81.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190310.000000,8253690.000000
+602,602,53002032.000000,Escola Maternal e Jardim de Infancia Branca de Neve,SEUPS EQ 706/906 - Conjunto A,242-9087,RA I - BRASILIA,Particular,Infantil,6.000000,M V,82.000000,5.000000,122.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188930.000000,8250380.000000
+603,603,53002040.000000,Escola Moderna Maria Montessori,SGAS 912 - Lotes 50/52,346-2733,RA I - BRASILIA,Particular,Infantil,19.000000,M V,157.000000,7.000000,213.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186850.000000,8249440.000000
+604,604,53002059.000000,Escola Monteiro Lobato de 1o Grau,SHCGN 713 - Area Especial,273-1270,RA I - BRASILIA,Particular,Inf/Reg,20.000000,M V,20.000000,2.000000,60.000000,6.000000,99.000000,7.000000,100.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189460.000000,8256590.000000
+605,605,53002067.000000,Escola Nossa Senhora de Fatima,SGAS 906 - Conjunto F,243-8646,RA I - BRASILIA,Particular,Inf/Reg,18.000000,M,9.000000,1.000000,18.000000,2.000000,42.000000,4.000000,119.000000,10.000000,210.000000,17.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188560.000000,8250380.000000
+606,606,53002075.000000,Escola Paroquial Santo Antonio,SGAS 911 - Conjunto B,242-7299,RA I - BRASILIA,Particular,Inf/Reg,33.000000,M V,60.000000,2.000000,425.000000,17.000000,823.000000,35.000000,803.000000,40.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187460.000000,8249630.000000
+607,607,53002083.000000,Escola Pedacinho do Ceu,EQN 108/308 - Lote C,274-1311,RA I - BRASILIA,Particular,Infantil,9.000000,M V,149.000000,7.000000,95.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190530.000000,8255180.000000
+608,608,53002091.000000,Escola Positiva de Brasilia,SGAN 905 - Modulo A,274-8261,RA I - BRASILIA,Particular,Inf/Reg,9.000000,M V,23.000000,2.000000,25.000000,3.000000,16.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189990.000000,8253920.000000
+609,609,53002105.000000,Escola Sao Camilo,SGAN 914 - Conjunto G,349-4308,RA I - BRASILIA,Particular,Inf/Reg,9.000000,M V I,120.000000,4.000000,158.000000,8.000000,145.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189020.000000,8256900.000000
+610,610,53002113.000000,Escola Sao Carlos,SGAS 905 - Lotes 1/2,242-9088,RA I - BRASILIA,Particular,Inf/Reg,16.000000,M V,28.000000,2.000000,147.000000,6.000000,268.000000,10.000000,315.000000,24.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188950.000000,8250820.000000
+611,611,53002130.000000,Escola Tecnica de Saude Golden Garden,SGAS 611 - Conjunto D,244-9664,RA I - BRASILIA,Particular,Regular,2.000000,M,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,22.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188820.000000,8247790.000000
+612,612,53002164.000000,INEI Centro Educacional,SGAN 605 - Modulo A,349-1088,RA I - BRASILIA,Particular,Inf/Reg,38.000000,M V,85.000000,3.000000,313.000000,12.000000,523.000000,20.000000,515.000000,21.000000,161.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191910.000000,8254500.000000
+613,613,53002172.000000,Instituto de Educacao de Brasilia - IEB,SHCGN 712 - Conj B - Area Especial,274-6575,RA I - BRASILIA,Particular,Inf/Reg,8.000000,V,19.000000,1.000000,42.000000,3.000000,43.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189550.000000,8256160.000000
+614,614,53002180.000000,Escola Educacional Filantropica,SGAS 611 - Modulo 77,244-4087,RA I - BRASILIA,Particular,Infantil,5.000000,M V,72.000000,5.000000,41.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188800.000000,8247700.000000
+615,615,53002199.000000,Instituto Nossa Senhora do Carmo,SGAS 913 - Bloco C,346-6700,RA I - BRASILIA,Particular,Inf/Reg,15.000000,M V,35.000000,3.000000,56.000000,7.000000,140.000000,13.000000,171.000000,15.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186970.000000,8249260.000000
+616,616,53002202.000000,Sociedade Educacional Saci Perere,SEUPS EQ 708/907 - Modulo D,243-4741,RA I - BRASILIA,Particular,Inf/Reg,15.000000,M,15.000000,2.000000,36.000000,3.000000,79.000000,4.000000,86.000000,10.000000,18.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188280.000000,8249990.000000
+617,617,53002377.000000,Escola Meu Pequeno Mundo,EQS 216/416 - Bloco C,245-5333,RA I - BRASILIA,Particular,Infantil,7.000000,M V,81.000000,2.000000,58.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186880.000000,8246950.000000
+618,618,53002385.000000,Centro de Ensino Juscelino Kubitschek,SGAN 906 - Bloco F,273-5544,RA I - BRASILIA,Particular,Inf/Reg/Esp,25.000000,M V,108.000000,4.000000,85.000000,4.000000,68.000000,7.000000,81.000000,9.000000,0.000000,0.000000,5.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189860.000000,8254370.000000
+619,619,53002393.000000,Associacao Educacional Sol Nascente,SGAS 610 - Bloco D - Modulo 71,244-3634,RA I - BRASILIA,Particular,Infantil,6.000000,M V,52.000000,3.000000,70.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189000.000000,8247930.000000
+620,620,53002407.000000,Pre-Escola Menino de Deus,SGAN 915 - Conjunto C,273-7202,RA I - BRASILIA,Particular,Infantil,4.000000,M V,9.000000,1.000000,39.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188990.000000,8257180.000000
+621,621,53002415.000000,Renascer Creche Maternal e Jardim de Infancia,EQS 116/316 - Bloco C - Area Especial,245-1820,RA I - BRASILIA,Particular,Inf/Esp,9.000000,M V,110.000000,0.000000,20.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,15.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186410.000000,8247550.000000
+622,622,53002423.000000,Sociedade Sibipiruna,SHCGN 715 - Area Especial - Bloco A,273-1144,RA I - BRASILIA,Particular,Infantil,5.000000,M V,55.000000,4.000000,75.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189300.000000,8257330.000000
+623,623,0.000000,Escola Batista IBAN,EQN 313/314 - Area Especial - Lote A,349-2428,RA I - BRASILIA,Particular,Infantil,6.000000,M V,27.000000,4.000000,27.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189870.000000,8256970.000000
+624,624,0.000000,Creche Maternal e Pre-Escola Marly Sarney,SGAS 914 - Conjunto 63 - Lote A,245-3225,RA I - BRASILIA,Particular,Infantil,2.000000,M V,3.000000,1.000000,5.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186510.000000,8248820.000000
+625,625,0.000000,Centro de Ensino de 1o Grau Renascenca,SGAN 914 - Conjunto B,273-6284,RA I - BRASILIA,Particular,Inf/Reg,8.000000,M V,33.000000,2.000000,44.000000,4.000000,18.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188925.000000,8256730.000000
+626,626,0.000000,Pimentinhas Escola de Educacao Infantil,EQS 104/304 - Lote C,225-7215,RA I - BRASILIA,Particular,Infantil,6.000000,M V,50.000000,3.000000,27.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189715.000000,8250215.000000
+627,627,53000013.000000,Assoc Maes Pais Amigos e Reabilitad Excepcionais - AMPARE,SHCGN 709 - Area Especial C,274-9561,RA I - BRASILIA,Conveniada,Especial,15.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,120.000000,0.000000,17.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189920.000000,8255210.000000
+628,628,53000030.000000,Assistencia de Pais e Amigos dos Excepcionais - APAE/DF,CRS 508 - Bloco C - Salas 10 a 16,244-1083,RA I - BRASILIA,Conveniada,Especial,7.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,68.000000,0.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188460.000000,8249560.000000
+629,629,0.000000,Associacao de Pais e Amigos do Excepcionais - APAE/DF,EQN 711/911 - Lote E,347-0460,RA I - BRASILIA,Conveniada,Especial,4.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,30.000000,0.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189470.000000,8255940.000000
+630,630,53000102.000000,Sociedade Pestalozi de Brasilia,Avenida das Nacoes - Trecho 03 - Lote 04,226-0101,RA I - BRASILIA,Conveniada,Especial,10.000000,I,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,108.000000,0.000000,19.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,194100.000000,8250250.000000
+631,631,53000331.000000,Centro Educacional de Audicao e Linguagem - CEAL,SGAN 909 - Conjunto B,272-2602,RA I - BRASILIA,Conveniada,Especial,40.000000,M V I,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,283.000000,0.000000,51.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189580.000000,8255120.000000
+632,632,53000820.000000,Casa de Ismael - Lar Primeira Luz,SGAN 914 - Conjunto C,273-2268,RA I - BRASILIA,Conveniada,Infantil,2.000000,M,20.000000,1.000000,53.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189110.000000,8256700.000000
+634,634,53002158.000000,Grupo da Fraternidade Cicero Pereira - CAMEGE,SGAN 915 - Modulo E,273-6803,RA I - BRASILIA,Conveniada,Infantil,2.000000,M V I,96.000000,0.000000,61.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188900.000000,8257280.000000
+635,635,53002229.000000,Jardim de Infancia Casa do Candango,SGAS 603 - Conjunto A,223-3516,RA I - BRASILIA,Conveniada,Infantil,12.000000,M I,350.000000,5.000000,130.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191020.000000,8249860.000000
+636,636,0.000000,Creche Acao Social Paula Frassinetti,SGAN 911 - Conjunto B-1,274-0823,RA I - BRASILIA,ENG,Inf/Reg,7.000000,I V,30.000000,4.000000,65.000000,6.000000,45.000000,6.000000,10.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189105.000000,8255680.000000
+637,637,53001257.000000,Centro de Linguas - CIL,SGAS 908 Modulo 25/26,244-8881,RA I - BRASILIA,Publica,Linguas,26.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,6073.000000,53.000000,0.000000,0.000000,0.000000,0.000000,188220.000000,8250115.000000
+638,638,53001842.000000,Escola Parque 210/211 Norte,EQN 210/211,273-2371,RA I - BRASILIA,Publica,Esc Parque,15.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1247.000000,51.000000,0.000000,0.000000,0.000000,0.000000,190900.000000,8256180.000000
+639,639,53001850.000000,Escola Parque 210/211 Sul,EQS 210/211,244-3659,RA I - BRASILIA,Publica,Esc Parque,19.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1275.000000,44.000000,0.000000,0.000000,0.000000,0.000000,188480.000000,8248280.000000
+640,640,53001869.000000,Escola Parque 303/304 Norte,EQN 303/304,224-2179,RA I - BRASILIA,Publica,Esc Parque,27.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2211.000000,67.000000,0.000000,0.000000,0.000000,0.000000,190660.000000,8253590.000000
+641,641,53001877.000000,Escola Parque 308 Sul,EQS 307/308,242-0273,RA I - BRASILIA,Publica,Esc Parque,21.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2493.000000,58.000000,0.000000,0.000000,0.000000,0.000000,188790.000000,8249625.000000
+642,642,53001885.000000,Escola Parque 313/314 Sul,EQS 313/314,245-4582,RA I - BRASILIA,Publica,Esc Parque,29.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2695.000000,64.000000,0.000000,0.000000,0.000000,0.000000,187060.000000,8248325.000000
+643,643,53001990.000000,Escola de Musica de Brasilia,SGAS 602 Conjunto D,225-5075,RA I - BRASILIA,Publica,Musica,74.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2049.000000,150.000000,0.000000,0.000000,191305.000000,8250150.000000
+644,644,53002121.000000,Escola Tecnica de Saude de Brasilia,SHN 501 Bloco A,325-4944,RA I - BRASILIA,Publica,Tecnica,7.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,137.000000,15.000000,190610.000000,8252810.000000
+645,645,0.000000,SENAI - Centro de Treinamento/CETRES,SIG Qd 06 Lote 1100,344-2106,RA I - BRASILIA,Particular,Profissionaliza,16.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,12230.000000,0.000000,187830.000000,8251650.000000
+646,646,53001206.000000,Centro Educ Setor Leste - Setorial de Linguas - SEL,SGAS 611/612 Conjunto E,243-8263,RA I - BRASILIA,Publica,Linguas,26.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2408.000000,32.000000,0.000000,0.000000,0.000000,0.000000,188630.000000,8247690.000000
+830,830,53008812.000000,Centro Educacional Ciman,Q 501 - Conj D - Lote 2,233-8897,RA XI - CRUZEIRO,Particular,Regular,16.000000,M V,0.000000,0.000000,0.000000,0.000000,438.000000,20.000000,532.000000,21.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184740.000000,8251050.000000
+831,831,53008863.000000,Escola Mundo Magico,Q 801 - Lote 1 - Bloco F,233-3938,RA XI - CRUZEIRO,Particular,Inf/Reg,11.000000,M V,38.000000,2.000000,230.000000,7.000000,211.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184950.000000,8251040.000000
\ No newline at end of file
diff --git a/examples/data/Distritos.mid b/examples/data/Distritos.mid
new file mode 100644
index 0000000..7b7d1d4
--- /dev/null
+++ b/examples/data/Distritos.mid
@@ -0,0 +1,96 @@
+�GUA RASA;1;ARA;6.9;LESTE;95099;85896;45905;39991;0
+ALTO DE PINHEIROS;2;API;7.7;OESTE;50351;44454;24579;19875;1
+ANHANGUERA;3;ANH;33.3;NORTE;12408;38427;19267;19160;2
+ARICANDUVA;4;ARI;6.6;LESTE;193024;94813;49498;45315;3
+ARTUR ALVIM;5;AAL;6.6;LESTE;117321;111210;58607;52603;4
+BARRA FUNDA;6;BFU;5.6;NORTE;15977;12965;7244;5721;5
+BELA VISTA;7;BVI;2.6;SUDESTE;71825;63190;34809;28381;6
+BELEM;8;BEL;6.0;LESTE;48389;39622;21551;18071;7
+BOM RETIRO;9;BRE;5.0;CENTRO;36136;26598;13961;12637;8
+BR�S;10;BRS;3.5;CENTRO;33536;25158;12829;12329;9
+BRASIL�NDIA;11;BRL;21.0;NORTE;201307;247328;127603;119725;10
+BUTANT�;12;BUT;12.5;OESTE;58019;52649;28198;24451;11
+CACHOEIRINHA;13;CAC;13.3;NORTE;125852;147649;76447;71202;12
+CAMBUCI;14;CMB;3.9;SUDESTE;37069;28717;15674;13043;13
+CAMPO BELO;15;CBE;8.9;SUL;77952;66646;36101;30545;14
+CAMPO GRANDE;16;CGR;13.1;SUL;82052;91373;48339;43034;15
+CAMPO LIMPO;17;CLM;12.0;OESTE;159471;191527;99047;92480;16
+CANGA�BA;18;CNG;16.0;LESTE;115070;137442;71699;65743;17
+CAP�O REDONDO;19;CRE;13.6;OESTE;192489;240793;124539;116254;18
+CARR�O;20;CAR;7.5;LESTE;87336;78175;41590;36585;19
+CASA VERDE;21;CVE;7.1;NORTE;96396;83629;44798;38831;20
+CIDADE ADEMAR;22;CAD;12.0;SUL;230794;243372;126923;116449;21
+CIDADE DUTRA;23;CDU;29.3;SUL;169379;191389;99375;92014;22
+CIDADE L�DER;24;CLD;10.2;LESTE;97370;116841;59902;56939;23
+CIDADE TIRADENTES;25;CTI;15.0;LESTE;192562;190657;99131;91526;24
+CONSOLA��O;26;CON;3.7;CENTRO;65570;54522;30892;23630;25
+CURSINO;27;CUR;12.8;SUDESTE;110435;102089;54699;47390;26
+FREGUESIA DO �;29;FRE;10.5;NORTE;152672;144923;76020;68903;27
+GUAIANAZES;31;GUA;9.9;LESTE;81373;98546;50354;48192;28
+IGUATEMI;33;IGU;19.6;LESTE;59820;101780;51373;50407;29
+ITAIM BIBI;35;IBI;9.9;SUL;107497;81456;45560;35896;30
+ITAIM PAULISTA;36;IPA;12.0;LESTE;163269;212733;109106;103627;31
+ITAQUERA;37;ITQ;14.8;LESTE;175126;201512;104214;97298;32
+JABAQUARA;38;JAB;14.1;SUDESTE;214350;214095;113456;100639;33
+JACAN�;39;JAC;7.8;NORTE;86830;91809;48032;43777;34
+JAGUARA;40;JAG;4.6;NORTE;29798;25713;13400;12313;35
+JARAGU�;42;JAR;27.6;NORTE;93185;145900;74751;71149;36
+JARDIM �NGELA;43;JDA;37.4;SUL;177913;245805;125254;120551;37
+JARDIM PAULISTA;45;JDP;6.1;SUL;103138;83667;48148;35519;38
+JARDIM S�O LUIS;46;JDS;24.7;SUL;204284;239161;123372;115789;39
+JOSE BONIF�CIO;47;JBO;14.1;LESTE;103712;107082;56312;50770;40
+LAGEADO;96;LAJ;9.2;LESTE;112807;107082;50770;56312;41
+LAPA;48;LAP;10.0;OESTE;70319;60184;33030;27154;42
+LIBERDADE;49;LIB;3.7;SUDESTE;76245;61875;34043;27832;43
+LIM�O;50;LIM;6.3;NORTE;89478;82045;43375;38670;44
+MANDAQUI;51;MAN;13.1;NORTE;104022;103113;54385;48728;45
+MOEMA;32;MOE;9.0;SUL;77340;71276;39556;31720;46
+MO�CA;53;MOO;7.7;LESTE;71999;63280;34474;28806;47
+MORUMBI;54;MOR;11.4;OESTE;78892;34588;18560;16028;48
+PARI;56;PRI;2.9;CENTRO;21299;14824;7939;6885;49
+PARQUE DO CARMO;57;PQC;15.4;LESTE;54743;64067;32664;31403;50
+PENHA;59;PEN;11.3;LESTE;133006;124292;66160;58132;51
+PERDIZES;60;PRD;6.1;NORTE;108840;102445;56415;46030;52
+PINHEIROS;62;PIN;8.0;OESTE;78644;62997;35570;27427;53
+PIRITUBA;63;PIR;17.1;NORTE;151464;161796;84539;77257;54
+PONTE RASA;64;PRA;6.4;LESTE;102702;98113;51263;46850;55
+REP�BLICA;66;REP;2.3;CENTRO;57797;47718;24353;23365;56
+SANTA CEC�LIA;69;SCE;3.9;CENTRO;85829;71179;39425;31754;57
+SANTANA;70;STN;12.6;NORTE;137679;124654;63170;61484;58
+SANTO AMARO;71;SAM;15.6;SUL;75556;60539;32692;27847;59
+S�O DOMINGOS;95;SDO;10.0;NORTE;70386;82834;42850;39984;60
+S�O LUCAS;72;SLU;9.9;LESTE;152036;139333;72733;66600;61
+S�O MATEUS;73;SMT;13.0;LESTE;150764;154850;79361;75489;62
+S�O MIGUEL;74;SMI;7.6;LESTE;102964;97373;50677;46696;63
+S�O RAFAEL;75;SRA;13.2;LESTE;89862;125088;63274;61814;64
+SA�DE;77;SAU;8.9;SUDESTE;126596;118077;65008;53069;65
+S�;78;SEE;2.1;CENTRO;27186;20115;10566;9549;66
+SOCORRO;79;SOC;12.5;SUL;43194;39097;20836;18261;67
+TATUAP�;80;TAT;8.2;LESTE;81840;79381;42860;36521;68
+TREMEMB�;81;TRE;18.3;NORTE;125075;163803;84384;79419;69
+TUCURUVI;82;TUC;9.0;NORTE;223768;99368;53627;45741;70
+VILA ANDRADE;83;VAN;10.3;OESTE;42576;73649;37694;35955;71
+VILA CURU��;84;VCR;9.7;LESTE;122367;146482;75121;71361;72
+VILA FORMOSA;85;VFO;7.4;LESTE;97940;93850;49468;44382;73
+VILA GUILHERME;86;VGL;6.9;NORTE;62648;49984;26729;23255;74
+VILA JACU�;87;VJA;7.7;LESTE;100589;141959;72844;69115;75
+VILA LEOPOLDINA;88;VLE;8.0;OESTE;26827;26870;14266;12604;76
+VILA MARIA;89;VMR;11.8;LESTE;122662;113845;59702;54143;77
+VILA MARIANA;90;VMN;8.6;SUDESTE;132822;123683;69168;54515;78
+VILA MATILDE;91;VMT;8.9;LESTE;109023;102935;54454;48481;79
+VILA MEDEIROS;92;VMD;7.7;NORTE;156140;140564;74109;66455;80
+VILA S�NIA;94;VSO;9.9;OESTE;83006;87379;45461;41918;81
+PARELHEIROS;55;PLH;153.5;SUL;55594;102836;51611;51225;82
+GRAJA�;30;GRA;92.0;SUL;192838;333436;170271;163165;83
+PEDREIRA;58;PDR;16.7;SUL;86001;127425;65405;62020;84
+SACOM�;68;SAC;14.2;SUDESTE;207834;228283;118795;109488;85
+IPIRANGA;34;IPI;10.5;SUDESTE;101396;98863;53194;45669;86
+VILA PRUDENTE;93;VPR;9.9;LESTE;114297;102104;53998;48106;87
+SAPOPEMBA;76;SAP;13.5;LESTE;256081;282239;145198;137041;88
+JARDIM HELENA;44;JDH;9.1;LESTE;118381;139106;70891;68215;89
+ERMELINO MATARAZZO;28;ERM;8.7;LESTE;95609;106838;54926;51912;90
+PERUS;61;PRS;23.9;NORTE;46301;70689;35791;34898;91
+JAGUAR�;41;JRE;6.6;OESTE;44361;42479;22105;20374;92
+RIO PEQUENO;67;RPE;9.7;OESTE;102843;111756;58200;53556;93
+RAPOSO TAVARES;65;RTA;12.6;OESTE;82890;91204;47329;43875;94
+MARSILAC;52;MAR;200.0;SUL;5992;8404;4124;4280;95
diff --git a/examples/data/Distritos.mif b/examples/data/Distritos.mif
new file mode 100644
index 0000000..4e046b8
--- /dev/null
+++ b/examples/data/Distritos.mif
@@ -0,0 +1,41096 @@
+Version 300
+Charset "WindowsLatin1"
+Delimiter ";"
+CoordSys Earth Projection 8, 92, Meters, -45.000000, 0.000000, 0.999600, 500000.000000, 10000000.000000
+Columns 10
+ Nome_Distrito Char(45)
+ Numero_Distrito Integer
+ Sigla Char(3)
+ area_km2 Float
+ Zona Char(10)
+ Pop91 Integer
+ Pop2000 Integer
+ Pop_2000_Fem Integer
+ Pop_2000_Masc Integer
+ object_id_ Char(16)
+Data
+Region 1
+206
+340033.474470 7391306.215632
+340012.347627 7391313.834327
+339993.645176 7391324.162558
+339911.718874 7391363.115885
+339895.242905 7391373.284144
+339879.138017 7391377.113488
+339857.681325 7391387.121773
+339823.781070 7391399.099722
+339810.092328 7391401.609292
+339778.418556 7391409.417954
+339765.274064 7391416.036820
+339692.797943 7391432.763955
+339637.490474 7391445.661746
+339619.711601 7391449.231135
+339601.338999 7391454.250275
+339569.401347 7391463.448699
+339484.621850 7391505.761451
+339435.969090 7391532.706836
+339292.426953 7391612.743126
+339206.097164 7391660.874882
+339194.783335 7391653.956067
+339180.204000 7391649.636807
+339168.708754 7391647.037252
+339159.530699 7391645.927442
+339148.101424 7391647.127237
+339135.657862 7391649.116896
+339127.048797 7391651.286524
+339117.112089 7391650.696625
+339101.576190 7391694.589107
+339069.333429 7391757.288367
+339035.828993 7391822.027278
+339008.591694 7391850.402418
+338959.435913 7391833.135375
+338859.796708 7391855.181599
+338844.450473 7391879.787384
+338850.453729 7391938.547319
+338869.156180 7391987.728895
+338866.781265 7391999.996793
+338828.098197 7392039.789977
+338804.027450 7392059.256643
+338782.950084 7392069.554879
+338762.573649 7392072.234420
+338742.691986 7392073.124267
+338725.680013 7392087.161863
+338679.402166 7392129.174666
+338636.868109 7392167.808049
+338611.337778 7392195.423319
+338590.631493 7392219.939119
+338588.446242 7392233.416811
+338591.406639 7392251.953635
+338608.542306 7392270.010542
+338625.686220 7392297.625812
+338645.774038 7392319.961986
+338647.472761 7392340.268508
+338651.101103 7392378.112026
+338650.721776 7392394.879154
+338648.429324 7392425.653882
+338642.970319 7392475.225391
+338640.636636 7392502.430731
+338638.302953 7392527.856376
+338630.328848 7392550.272536
+338614.157989 7392569.429255
+338596.461578 7392587.576146
+338571.887811 7392607.052810
+338549.342616 7392625.749608
+338527.531336 7392640.367104
+338509.002056 7392650.145429
+338454.939768 7392650.485371
+338366.498944 7392656.654314
+338266.851493 7392663.903072
+338213.061331 7392665.772752
+338185.807538 7392671.281808
+338172.918680 7392684.829488
+338059.780395 7392788.461736
+338033.169809 7392808.448313
+337956.562326 7392880.925898
+337952.950477 7392884.175342
+337924.591690 7392908.251218
+337872.277603 7392965.751368
+337794.969191 7393053.906268
+337870.941714 7393206.140192
+337913.327339 7393305.983090
+337963.357220 7393405.266083
+338013.337624 7393505.148974
+338032.147277 7393552.460870
+338055.014074 7393603.382148
+338068.744048 7393629.967594
+338096.740001 7393684.928180
+338118.048261 7393733.839802
+338133.946994 7393769.363717
+338145.565933 7393793.629560
+338164.425062 7393824.564261
+338173.025881 7393846.050581
+338195.068055 7393889.113205
+338228.861109 7393967.659750
+338244.372268 7393992.205546
+338255.941730 7394018.121107
+338291.515969 7394089.498881
+338299.762200 7394106.375990
+338341.290217 7394195.380744
+338375.371889 7394264.068978
+338379.956793 7394260.299624
+338450.890869 7394334.326944
+338477.682872 7394362.092188
+338524.076166 7394411.433736
+338581.041127 7394473.103173
+338732.722294 7394630.786163
+338703.233773 7394679.957740
+338878.911470 7394746.326372
+338898.372575 7394704.243580
+338914.988730 7394670.809307
+338945.392582 7394607.430164
+338966.346254 7394570.906420
+338992.222926 7394521.914812
+339009.193668 7394491.919949
+339072.796845 7394480.731866
+339092.612538 7394476.732551
+339121.993858 7394465.194527
+339143.351595 7394457.755801
+339194.436994 7394442.618394
+339223.389510 7394437.569259
+339266.410095 7394431.900230
+339307.138228 7394428.490814
+339339.867517 7394425.761282
+339380.166847 7394428.840754
+339414.372211 7394432.620107
+339455.421947 7394436.859381
+339502.153337 7394444.198124
+339538.997495 7394449.917144
+339652.523352 7394477.022501
+339656.077478 7394459.105570
+339660.357272 7394446.937655
+339665.370980 7394438.969019
+339671.118603 7394432.540121
+339678.391778 7394428.030893
+339686.398868 7394425.061402
+339775.491144 7394413.353407
+339778.327847 7394391.237196
+339827.318703 7394352.403847
+339856.749501 7394334.366937
+339885.767986 7394319.769437
+339882.527218 7394296.453431
+339836.397803 7394115.384447
+339825.323116 7394072.121857
+339808.203941 7393973.528745
+339809.416137 7393955.591818
+339829.306045 7393935.785210
+339901.798659 7393848.930088
+339915.330723 7393820.904888
+340000.003019 7393776.762449
+340020.832998 7393761.385083
+340045.489228 7393738.718966
+340075.414799 7393698.095924
+340111.582766 7393633.656962
+340173.503712 7393536.723566
+340234.418618 7393440.999963
+340270.809234 7393407.775654
+340517.618917 7393270.919096
+340560.969352 7393251.682391
+340739.904310 7393151.469556
+340793.702719 7393122.994434
+340909.191179 7393058.125545
+340970.106085 7393032.809882
+340997.805174 7393027.290827
+341148.851381 7392950.893913
+341193.183117 7392919.689258
+341232.938195 7392879.106210
+341288.905362 7392823.975653
+341372.761281 7392736.960558
+341418.643309 7392686.329231
+341395.710541 7392635.917866
+341367.912498 7392566.179811
+341279.966448 7392352.756369
+341216.915768 7392201.412293
+341160.470320 7392061.576245
+341128.862518 7392071.784497
+341119.618493 7391981.869898
+341114.876910 7391946.275995
+341113.219418 7391926.309415
+341092.612088 7391744.560547
+341093.214062 7391743.520725
+341085.932641 7391678.021945
+341078.148199 7391636.499057
+341072.103712 7391551.963537
+341067.032280 7391500.942277
+341059.379778 7391432.014084
+341046.804276 7391322.802791
+340930.705595 7391331.491302
+340843.542937 7391339.929857
+340804.777407 7391332.021212
+340725.349713 7391314.904144
+340691.870017 7391304.655899
+340626.164051 7391286.219057
+340596.609560 7391278.570367
+340568.176557 7391268.302126
+340506.552476 7391251.325034
+340460.282875 7391247.605671
+340414.392602 7391248.615498
+340392.836955 7391248.555508
+340355.910334 7391249.165404
+340330.248064 7391250.525171
+340254.992963 7391252.514830
+340175.441576 7391262.863058
+340113.042349 7391276.630699
+340084.815502 7391280.939961
+340033.474470 7391306.215632
+Region 1
+182
+327045.149934 7394665.260258
+327016.642715 7394577.715254
+326971.403894 7394423.951592
+326964.427583 7394388.167721
+326953.509573 7394311.250896
+326935.969841 7394231.564546
+326927.418499 7394217.376976
+326904.246591 7394172.224710
+326882.756914 7394133.421357
+326868.161086 7394100.696962
+326846.176635 7394067.232695
+326833.122852 7394039.837387
+326814.906929 7394014.861665
+326810.552919 7394000.004210
+326805.357793 7393990.285875
+326784.610277 7393958.321350
+326780.891227 7393937.194969
+326779.349182 7393876.285402
+326706.427764 7393787.630588
+326666.540747 7393736.559336
+326632.112734 7393667.511163
+326618.539438 7393624.818476
+326595.854058 7393602.352324
+326524.260283 7393533.014201
+326480.926341 7393492.151201
+326461.143634 7393476.623860
+326398.282618 7393417.953910
+326332.131355 7393354.704744
+326265.213194 7393290.935667
+326194.237886 7393224.866984
+326105.557922 7393133.352660
+326011.122089 7393067.323970
+325992.543331 7393100.888221
+325962.436343 7393151.369574
+325908.184392 7393223.127282
+325824.015115 7393303.113581
+325739.614945 7393385.629447
+325557.678358 7393478.933465
+325401.313332 7393585.165268
+325328.342437 7393628.687813
+325304.519077 7393642.815393
+325259.024623 7393666.531331
+325104.440783 7393743.658120
+324955.085053 7393817.965392
+324801.466023 7393898.641573
+324528.853884 7394033.938398
+324464.236420 7394066.272859
+324355.410914 7394115.694393
+324226.274943 7394180.713256
+324082.064861 7394268.028300
+323920.364524 7394341.185769
+323764.774644 7394415.293075
+323620.498593 7394507.697247
+323473.608486 7394605.060570
+323287.581769 7394707.702988
+323196.576368 7394782.140237
+323055.293698 7394922.096264
+322960.626970 7395008.331493
+323084.823450 7395133.610034
+323192.997504 7395247.840467
+323241.848174 7395300.011531
+323352.092032 7395420.640868
+323437.819845 7395510.365499
+323488.360993 7395525.942831
+323508.143700 7395536.990938
+323539.067065 7395554.967859
+323557.546868 7395571.345054
+323573.470340 7395590.511771
+323592.667565 7395614.757618
+323604.773031 7395633.144468
+323623.129141 7395670.348095
+323639.761788 7395698.913202
+323662.397691 7395744.275432
+323675.583414 7395753.253894
+323709.450683 7395792.597155
+323797.446210 7395885.901173
+323808.306496 7395899.178899
+323838.207328 7395920.455254
+323879.512698 7395948.920378
+323903.146395 7395958.178793
+323928.759187 7395969.336881
+323965.578607 7395981.524794
+323999.998374 7395984.374306
+324016.053785 7395986.313973
+324043.027205 7395988.033679
+324073.810384 7395987.203821
+324096.446287 7395984.604266
+324138.048521 7395979.415155
+324190.799658 7395969.906784
+324254.889363 7395961.888157
+324323.563972 7395953.349620
+324357.653889 7395951.499937
+324382.582244 7395951.689904
+324404.467741 7395955.709216
+324423.062991 7395959.468572
+324440.643954 7395967.297231
+324456.221084 7395977.665455
+324477.908671 7395999.971634
+324506.127272 7396048.483324
+324527.163406 7396064.370603
+324536.201275 7396070.179608
+324548.026370 7396080.117906
+324560.593625 7396088.456477
+324572.047640 7396095.685239
+324585.711644 7396105.553549
+324700.672345 7396127.629767
+324953.048234 7396172.572069
+325022.333064 7396184.749983
+325123.580284 7396187.819457
+325167.343030 7396184.410041
+325219.863273 7396180.630689
+325247.653070 7396178.361077
+325288.372957 7396174.191792
+325324.953237 7396168.152826
+325351.910165 7396159.004393
+325393.009378 7396146.086606
+325432.962366 7396133.938687
+325467.200715 7396120.640964
+325485.853689 7396111.912459
+325501.818391 7396102.034151
+325516.661607 7396090.246171
+325525.402611 7396077.708318
+325531.859410 7396068.589880
+325534.506450 7396050.343006
+325532.222244 7396044.643982
+325534.110631 7396033.985808
+325530.680199 7396021.447955
+325516.686345 7395993.502742
+325561.850951 7395949.470284
+325628.249600 7395862.975100
+325645.236835 7395843.648411
+325662.751829 7395829.130897
+325671.138245 7395824.801639
+325688.933611 7395819.172603
+325709.771836 7395810.994004
+325769.029249 7395805.274984
+325796.497444 7395800.885735
+325817.352161 7395798.296179
+325828.542296 7395794.716792
+325844.292596 7395787.318060
+325876.246740 7395755.763465
+325895.237809 7395723.718953
+325916.546069 7395703.612398
+325977.271312 7395674.527380
+326016.160536 7395659.709918
+326060.409809 7395655.290675
+326076.432235 7395651.951247
+326241.439311 7395612.967924
+326293.308101 7395601.169945
+326434.763942 7395579.483660
+326499.307189 7395571.235073
+326616.073815 7395566.145944
+326616.082061 7395566.125948
+326675.628093 7395581.013398
+326722.252281 7395592.821375
+326767.820952 7395600.580046
+326814.403908 7395523.283286
+326850.101841 7395465.563173
+326868.317764 7395432.758792
+326887.597452 7395414.181974
+326913.762742 7395398.384680
+326942.707011 7395379.517912
+327001.131555 7395345.363762
+327063.530783 7395282.754487
+327080.781897 7395264.677583
+327148.986471 7395187.330832
+327179.175921 7395159.325629
+327218.279547 7395130.290602
+327212.812296 7395090.437429
+327217.322984 7395065.801649
+327229.469682 7395045.205177
+327242.135892 7395027.908140
+327276.349503 7394981.356113
+327230.822064 7394900.210013
+327185.393579 7394852.068259
+327165.412962 7394817.694147
+327147.023868 7394801.086992
+327138.398311 7394788.249191
+327110.253925 7394746.186396
+327061.576426 7394678.627968
+327045.191166 7394665.310249
+327045.149934 7394665.260258
+Region 1
+1655
+314875.997705 7407081.823413
+314889.496785 7407054.698059
+314897.256488 7407041.890253
+314909.691804 7407020.303951
+314920.560336 7407001.477176
+314926.522361 7406990.679025
+314932.261737 7406976.851394
+314940.095656 7406957.484711
+314943.311686 7406941.867386
+314942.544787 7406917.871496
+314937.597048 7406905.703581
+314930.365104 7406892.495843
+314927.379969 7406886.156929
+314923.924798 7406877.028493
+314921.022125 7406863.110876
+314924.963823 7406851.032945
+314932.632818 7406846.313754
+314940.590430 7406838.815038
+314942.726204 7406829.746591
+314944.911455 7406815.129095
+314946.907043 7406794.692596
+314946.973013 7406788.893589
+314940.409013 7406760.288489
+314938.462903 7406752.449832
+314943.187993 7406738.602204
+314945.373244 7406724.234665
+314942.973591 7406710.826961
+314939.782300 7406699.938826
+314938.347455 7406691.850212
+314929.713652 7406667.264423
+314926.011094 7406656.876203
+314925.615275 7406646.018063
+314926.060572 7406628.601046
+314927.775788 7406610.694113
+314934.595420 7406590.557562
+314943.130269 7406576.250013
+314943.723998 7406568.681310
+314945.134103 7406555.063642
+314944.441420 7406548.994682
+314946.140143 7406532.347533
+314950.353967 7406518.499905
+314957.577665 7406508.221666
+314967.547358 7406503.272514
+314992.582914 7406490.644677
+315015.812546 7406481.536237
+315045.193866 7406467.188694
+315077.634537 7406451.351407
+315100.658013 7406437.443789
+315127.557218 7406417.517203
+315135.564308 7406404.969352
+315155.437723 7406376.634206
+315164.162235 7406345.159597
+315160.311246 7406324.923063
+315158.760954 7406302.686872
+315160.707065 7406287.309506
+315163.848879 7406254.765081
+315164.261190 7406216.141696
+315159.651547 7406195.385252
+315156.790105 7406177.938240
+315153.879186 7406164.780494
+315135.984865 7406120.888013
+315146.317392 7406084.384265
+315166.289763 7406042.371462
+315210.374112 7405977.632551
+315215.882594 7405945.268095
+315216.575277 7405918.402696
+315208.996991 7405871.570718
+315203.488509 7405827.488269
+315197.287344 7405780.656291
+315195.217540 7405741.403015
+315202.795826 7405701.449858
+315212.435670 7405678.723751
+315234.477844 7405649.108824
+315243.433251 7405626.382717
+315240.679010 7405605.026375
+315237.232085 7405587.809324
+315232.416287 7405568.522628
+315227.592242 7405540.287464
+315227.592242 7405511.362419
+315231.030920 7405478.298082
+315235.170528 7405452.132564
+315243.433251 7405410.809643
+315258.581576 7405350.200024
+315275.799706 7405316.445806
+315294.403202 7405276.502648
+315301.288805 7405253.776541
+315304.727483 7405237.249372
+315309.551528 7405221.402086
+315321.945613 7405206.254681
+315341.926230 7405195.916452
+315353.627631 7405184.898339
+315359.144359 7405172.500463
+315362.253188 7405164.211882
+315366.862831 7405137.246501
+315375.958423 7405118.399730
+315395.988518 7405098.403155
+315409.083532 7405085.905296
+315426.804682 7405068.408293
+315443.049756 7405047.111941
+315458.536177 7405024.285851
+315468.373930 7405007.218774
+315477.972543 7404989.381829
+315488.643165 7404965.755876
+315492.584863 7404953.427988
+315499.808561 7404943.149748
+315507.527033 7404934.891163
+315519.789178 7404928.702223
+315530.558756 7404919.713763
+315538.285474 7404910.205391
+315543.010564 7404895.607892
+315545.179322 7404883.000052
+315546.622413 7404866.602860
+315547.306850 7404850.455626
+315552.642161 7404827.019640
+315555.338679 7404812.152187
+315560.904884 7404790.245939
+315565.959824 7404769.079565
+315568.375969 7404757.491550
+315569.307793 7404741.594273
+315572.795949 7404724.207251
+315577.892119 7404698.501654
+315577.554024 7404682.844336
+315576.449029 7404667.436976
+315572.325914 7404648.450228
+315569.967492 7404631.513129
+315571.187934 7404612.086457
+315576.449029 7404595.979216
+315580.225803 7404575.052800
+315582.765642 7404551.596818
+315592.108621 7404517.932584
+315586.591893 7404499.225789
+315582.872843 7404473.970115
+315582.163667 7404460.842363
+315582.798627 7404427.778027
+315583.400602 7404401.522524
+315580.638114 7404327.305237
+315581.759602 7404298.780123
+315585.923948 7404271.284833
+315589.791430 7404255.647511
+315593.939284 7404232.941401
+315598.309787 7404219.073776
+315606.020012 7404195.627792
+315626.223277 7404158.344179
+315628.598192 7404134.628241
+315633.735593 7404119.250875
+315649.799251 7404101.893848
+315666.605069 7404089.595954
+315684.449912 7404072.238928
+315702.797775 7404054.142027
+315718.111025 7404034.505391
+315730.356678 7404018.648107
+315743.657848 7403993.962336
+315760.241018 7403974.085740
+315778.357986 7403950.179835
+315791.873559 7403936.092248
+315807.162070 7403923.024487
+315835.166269 7403902.937927
+315859.632836 7403880.821716
+315882.837729 7403855.156112
+315894.563869 7403843.088179
+315910.388385 7403821.691844
+315923.664817 7403804.074862
+315933.609771 7403793.006758
+315949.195147 7403766.811245
+315964.269256 7403744.405083
+315971.418738 7403734.336807
+316003.018294 7403705.171803
+316025.423303 7403688.344685
+316061.088250 7403658.949720
+316077.943546 7403635.543730
+316089.422299 7403621.196187
+316101.948323 7403599.789854
+316116.263780 7403575.104082
+316128.542417 7403550.918225
+316144.177270 7403511.345004
+316153.693421 7403481.340143
+316155.779717 7403465.702822
+316158.385526 7403448.795718
+316155.656024 7403431.878615
+316150.906195 7403412.421948
+316145.612115 7403400.284027
+316141.109673 7403383.606884
+316135.856824 7403361.370693
+316113.088981 7403271.166144
+316144.127793 7403256.138718
+316172.635012 7403237.821856
+316190.991122 7403220.474827
+316212.942588 7403190.769915
+316229.294863 7403162.564747
+316235.364089 7403170.663359
+316250.537153 7403187.380496
+316260.638786 7403202.317937
+316278.054825 7403230.403126
+316290.185030 7403247.110265
+316305.621974 7403261.047877
+316324.637782 7403268.196653
+316341.385876 7403273.055820
+316356.088906 7403278.414902
+316373.307035 7403292.362513
+316387.267904 7403294.942071
+316404.263385 7403299.551282
+316422.281399 7403302.900708
+316444.859579 7403309.049655
+316460.576894 7403317.438218
+316475.255185 7403330.366004
+316481.019300 7403350.582541
+316487.525576 7403377.117995
+316487.921395 7403405.383154
+316486.577259 7403424.569867
+316490.288063 7403452.855022
+316497.816872 7403475.601126
+316510.944871 7403497.107442
+316515.917348 7403525.142640
+316516.354398 7403543.579482
+316522.852428 7403571.364723
+316530.389483 7403593.101000
+316535.650578 7403612.307710
+316539.402613 7403627.215156
+316543.624683 7403651.720958
+316545.306914 7403676.966634
+316545.480085 7403698.422959
+316541.596110 7403719.869285
+316533.407603 7403735.736567
+316522.679257 7403752.863634
+316517.038835 7403765.971388
+316514.919554 7403790.447196
+316514.325826 7403812.403435
+316512.453931 7403838.149025
+316512.363223 7403860.355221
+316519.133378 7403884.871022
+316533.242679 7403914.205997
+316544.597738 7403933.182747
+316553.668592 7403952.399455
+316558.929687 7403971.106251
+316563.407390 7403996.871837
+316564.306229 7404026.656735
+316564.974174 7404052.912238
+316566.161631 7404073.618691
+316574.457339 7404097.374622
+316587.370937 7404107.022969
+316604.366418 7404112.132094
+316629.500929 7404114.251731
+316650.306169 7404118.620983
+316683.315830 7404118.750960
+316707.699934 7404118.081075
+316728.010400 7404120.180716
+316752.097640 7404128.859229
+316773.405900 7404135.248135
+316788.108929 7404144.146610
+316806.827873 7404163.143356
+316821.258776 7404175.061315
+316839.755072 7404186.749313
+316861.797246 7404198.447309
+316876.252889 7404203.546436
+316892.728857 7404212.194954
+316912.486826 7404225.652649
+316926.167323 7404235.290998
+316939.567448 7404249.988481
+316951.969778 7404262.656311
+316966.928441 7404268.265350
+316988.244947 7404272.134687
+317009.363544 7404260.606662
+317019.828010 7404248.028816
+317037.969718 7404218.303908
+317052.004802 7404199.687097
+317071.136057 7404177.540890
+317096.600418 7404159.713944
+317121.792652 7404145.176434
+317153.573625 7404134.948186
+317179.541006 7404119.140894
+317205.236260 7404107.632865
+317225.835344 7404099.884192
+317253.303539 7404088.126206
+317271.387523 7404073.808659
+317294.072903 7404050.672622
+317309.122274 7404033.315595
+317329.787328 7404009.659647
+317349.916377 7403992.072659
+317377.664943 7403973.495841
+317398.569138 7403951.869546
+317423.060443 7403922.174632
+317439.379733 7403904.317691
+317456.960697 7403889.490231
+317476.091952 7403866.594153
+317493.466760 7403838.139027
+317504.953759 7403822.781657
+317517.702432 7403809.953855
+317539.587928 7403796.406175
+317567.031384 7403791.716978
+317604.675427 7403777.729374
+317631.376721 7403768.241000
+317675.593010 7403759.822442
+317706.590591 7403755.653156
+317731.477715 7403755.753139
+317766.994231 7403764.471645
+317828.906930 7403779.099140
+317849.712170 7403784.228261
+317871.515204 7403793.646648
+317887.479907 7403802.045209
+317897.837172 7403818.492392
+317905.357735 7403842.498280
+317914.675975 7403863.734642
+317920.481322 7403874.362822
+317936.182145 7403885.780866
+317951.635581 7403894.429385
+317960.244646 7403901.778126
+317968.268228 7403929.073451
+317967.888902 7403961.637873
+317968.086811 7403976.775280
+317980.225263 7403990.202980
+317997.204252 7403999.861325
+318020.021572 7404009.799623
+318050.722288 7404018.998047
+318070.010222 7404020.837732
+318097.453678 7404016.658448
+318117.269370 7404015.218695
+318136.334655 7404008.979763
+318146.065207 7403988.323302
+318150.988207 7403962.337753
+318153.602262 7403942.411166
+318158.772649 7403918.695228
+318167.455930 7403905.097557
+318178.662557 7403896.559020
+318199.781154 7403886.040822
+318213.263741 7403879.781894
+318228.758408 7403878.832056
+318245.019975 7403877.632262
+318257.199658 7403879.441952
+318273.444732 7403882.031508
+318292.254384 7403878.062188
+318302.166353 7403875.582613
+318322.485066 7403873.642945
+318334.640010 7403883.531251
+318343.224336 7403896.439040
+318356.154425 7403902.547994
+318372.655133 7403904.877595
+318382.575348 7403900.378366
+318397.566996 7403897.908789
+318417.019854 7403895.219249
+318412.674090 7403906.477321
+318558.962222 7404213.984648
+318781.668173 7404524.191512
+318996.424758 7404953.697942
+319230.955804 7405274.163049
+319235.746864 7405301.738325
+319240.653371 7405318.195506
+319248.107963 7405334.682682
+319252.981486 7405354.169344
+319257.162325 7405367.597044
+319259.067204 7405379.235051
+319260.947344 7405393.892540
+319261.021561 7405410.809643
+319251.934214 7405428.396630
+319244.636300 7405445.743659
+319239.317481 7405467.659905
+319236.084959 7405485.296884
+319235.161381 7405499.934376
+319235.986004 7405518.121261
+319243.490074 7405529.309345
+319249.460345 7405541.737216
+319256.717028 7405552.415387
+319264.897289 7405571.692085
+319270.001706 7405593.958271
+319271.923077 7405604.326495
+319270.512972 7405617.444248
+319266.802168 7405631.551831
+319260.749435 7405651.438425
+319261.895661 7405663.066433
+319267.115525 7405673.464652
+319275.130861 7405684.652736
+319288.184644 7405700.440031
+319299.531458 7405708.378672
+319317.532979 7405712.347992
+319342.939616 7405713.617774
+319352.826846 7405715.477456
+319370.308855 7405720.456603
+319378.860196 7405728.875161
+319390.932678 7405741.113065
+319401.438376 7405757.120323
+319411.498777 7405766.818661
+319433.780093 7405774.617326
+319446.924584 7405781.566135
+319459.038297 7405789.514774
+319466.055839 7405798.673205
+319473.048643 7405809.851290
+319485.286049 7405830.427766
+319501.811495 7405853.573801
+319512.366671 7405865.041837
+319523.993856 7405870.460908
+319545.343347 7405870.670872
+319566.156833 7405872.900491
+319578.534425 7405880.599172
+319597.706912 7405893.416976
+319623.699031 7405911.353904
+319644.075467 7405930.740583
+319642.154095 7405944.108293
+319640.900668 7405966.064532
+319637.651653 7405984.971294
+319628.539568 7406005.327807
+319620.755126 7406020.145269
+319609.630961 7406039.222001
+319603.883338 7406053.309588
+319600.988911 7406063.127906
+319600.840479 7406077.005529
+319603.438042 7406095.472366
+319606.043851 7406112.919377
+319614.974519 7406133.455860
+319627.945839 7406156.561902
+319639.911120 7406178.648119
+319655.405787 7406203.293897
+319667.659686 7406222.110674
+319676.911957 7406236.088280
+319688.135077 7406256.654757
+319693.569343 7406270.842327
+319701.980498 7406292.898549
+319707.975508 7406302.296939
+319727.758215 7406309.145766
+319738.173204 7406330.622087
+319741.133601 7406338.990654
+319746.007124 7406358.727273
+319750.278671 7406387.052421
+319755.416073 7406406.299124
+319759.720605 7406431.084879
+319760.281349 7406450.021635
+319758.500163 7406474.497442
+319755.795399 7406490.124766
+319747.912003 7406514.290626
+319738.478315 7406540.456144
+319730.660888 7406559.312914
+319725.399793 7406575.420155
+319723.255773 7406586.248301
+319722.859954 7406599.636007
+319722.793984 7406629.170948
+319724.080396 7406651.907054
+319726.158446 7406671.873634
+319725.383301 7406696.359439
+319719.784110 7406704.688013
+319718.374005 7406717.115884
+319722.513612 7406727.134168
+319723.206296 7406757.698933
+319726.339863 7406797.872051
+319729.168321 7406818.858457
+319736.804330 7406841.664550
+319743.607470 7406870.769565
+319751.532098 7406890.536179
+319755.110962 7406912.292452
+319762.177982 7406940.637597
+319769.277986 7406965.963259
+319771.652901 7406982.140488
+319771.982750 7406998.807633
+319769.327464 7407009.645776
+319763.992153 7407033.321721
+319748.827334 7407049.079022
+319743.648702 7407058.117474
+319741.512928 7407067.685835
+319739.863682 7407079.283848
+319743.599224 7407086.902543
+319752.439183 7407091.531750
+319766.746394 7407099.850325
+319779.767192 7407109.968592
+319790.850126 7407125.675901
+319792.639558 7407132.544725
+319791.056282 7407140.653336
+319793.291010 7407145.972425
+319798.857216 7407148.052069
+319806.443748 7407151.661450
+319814.244682 7407159.060183
+319822.985687 7407173.037789
+319833.425415 7407195.363965
+319842.009741 7407224.738933
+319849.843660 7407252.844119
+319857.751795 7407273.880515
+319866.220674 7407290.117734
+319871.160166 7407303.305475
+319877.608718 7407318.512870
+319885.887934 7407328.441170
+319892.625104 7407340.379125
+319903.073079 7407361.445516
+319908.598053 7407367.804427
+319923.028957 7407372.493624
+319937.971127 7407377.702732
+319954.166724 7407384.421581
+319969.562436 7407394.679824
+319987.267094 7407402.688452
+320007.660022 7407420.305434
+320018.759448 7407428.504030
+320031.780247 7407446.560937
+320041.213934 7407467.857289
+320043.753774 7407491.623218
+320043.852728 7407506.270709
+320044.363995 7407530.256600
+320045.015447 7407540.114912
+320049.600351 7407562.881012
+320052.494778 7407577.808455
+320047.860396 7407588.506623
+320043.687804 7407593.625746
+320041.568522 7407601.434408
+320042.830196 7407614.362194
+320045.765854 7407630.589416
+320051.736125 7407649.256217
+320053.467833 7407653.315522
+320058.522773 7407662.493949
+320067.750305 7407672.392254
+320077.390148 7407674.511891
+320081.356585 7407683.640327
+320084.490153 7407699.577597
+320067.511164 7407719.354210
+320054.168763 7407731.342156
+320043.118814 7407742.590230
+320037.725779 7407747.589373
+320033.058412 7407756.377868
+320032.200804 7407765.206356
+320037.907196 7407778.144140
+320045.271080 7407802.959889
+320047.324391 7407825.206078
+320051.488738 7407839.633607
+320051.818587 7407856.300752
+320047.802673 7407875.197515
+320041.881879 7407882.466270
+320026.535644 7407891.394741
+320015.807298 7407897.103763
+320004.542947 7407904.812442
+319995.364892 7407906.992069
+319990.417154 7407918.560088
+319991.085098 7407926.898659
+319994.532023 7407937.786794
+319997.236786 7407946.405318
+319996.074068 7407960.022985
+319994.960827 7407969.101430
+319996.882199 7407979.219697
+320003.413213 7407987.118344
+320015.840283 7407989.257978
+320031.895694 7407984.878728
+320043.630080 7407980.699444
+320061.656340 7407982.899067
+320076.441832 7408002.235755
+320079.097118 7408015.643458
+320083.277957 7408028.311288
+320087.953570 7408043.008771
+320092.835338 7408062.245476
+320088.027786 7408083.661807
+320079.583646 7408112.866805
+320078.107570 7408132.543434
+320075.608963 7408152.460023
+320074.207103 7408164.567949
+320066.884450 7408184.194587
+320056.824049 7408197.972227
+320046.846110 7408204.441119
+320037.857719 7408212.939663
+320026.337734 7408220.398385
+320017.357589 7408228.387017
+320012.121233 7408242.974518
+320005.895329 7408255.292408
+320000.708450 7408264.830775
+319994.202174 7408279.408278
+319985.716802 7408288.416734
+319975.953265 7408298.415022
+319966.997859 7408303.884085
+319954.719221 7408311.332809
+319952.863819 7408318.381602
+319953.474040 7408333.289048
+319957.968236 7408340.907743
+319965.208427 7408352.845698
+319971.978582 7408360.994303
+319980.752571 7408372.952254
+319987.992762 7408384.890209
+319990.425400 7408395.518389
+319992.058154 7408408.666137
+319991.200546 7408417.494625
+319991.348978 7408427.842852
+319993.253857 7408439.990771
+320002.761761 7408453.718420
+320010.084414 7408458.587586
+320021.183840 7408466.526226
+320034.534488 7408477.514344
+320036.958879 7408488.402479
+320035.540528 7408502.520061
+320031.862709 7408513.348206
+320031.978156 7408526.725914
+320031.524613 7408544.902801
+320030.172232 7408553.221376
+320024.713227 7408564.279482
+320017.415313 7408581.626510
+320007.091032 7408596.673933
+319990.079058 7408618.970114
+319978.996124 7408632.997711
+319972.489848 7408647.325257
+319967.773004 7408660.912929
+319951.000171 7408684.478893
+319929.271353 7408720.372744
+319910.107113 7408754.516896
+319894.546476 7408783.401948
+319884.403613 7408805.268203
+319867.606041 7408831.103777
+319856.465383 7408851.190336
+319848.153183 7408868.277410
+319836.740399 7408890.133666
+319819.060481 7408903.331405
+319805.495431 7408912.289871
+319795.476261 7408922.288158
+319789.802855 7408929.806870
+319782.133860 7408934.026147
+319773.697966 7408938.735341
+319757.197259 7408936.805671
+319746.031862 7408935.175950
+319727.741723 7408934.736026
+319717.326733 7408934.636043
+319704.091533 7408936.525719
+319686.477585 7408943.164582
+319675.485359 7408949.613477
+319666.967003 7408961.651415
+319658.613571 7408982.277882
+319654.655380 7408996.375468
+319646.920416 7409006.393752
+319638.979296 7409012.882640
+319629.009603 7409018.081749
+319617.819468 7409018.981595
+319611.453378 7409019.931433
+319603.330841 7409018.831621
+319597.162660 7409001.354615
+319588.594827 7408994.955711
+319574.180416 7408988.246860
+319563.048004 7408983.587658
+319540.931614 7408983.367696
+319527.201640 7408984.237547
+319507.328224 7408988.836759
+319488.015552 7408989.146706
+319473.032150 7408987.736947
+319463.144920 7408985.117396
+319450.528187 7408977.158759
+319442.933409 7408974.309247
+319435.858143 7408969.939996
+319421.386008 7408969.040150
+319393.142668 7408972.289593
+319381.424774 7408974.449223
+319372.032317 7408973.599369
+319361.196770 7408965.150816
+319349.066565 7408958.212005
+319339.740078 7408951.303188
+319332.392687 7408948.703633
+319324.286642 7408946.603993
+319305.460497 7408948.693635
+319301.007533 7408960.761568
+319293.297307 7408968.770196
+319285.603574 7408975.758999
+319270.834575 7408978.138591
+319260.394847 7408979.798307
+319244.867195 7408982.417858
+319237.725959 7408984.617482
+319222.643603 7408992.546123
+319205.623383 7408992.376153
+319188.339284 7408992.206182
+319166.998039 7408991.736262
+319142.094422 7408991.496303
+319120.481052 7408992.286168
+319103.188706 7408993.375981
+319090.679174 7408998.805051
+319078.128411 7409007.763517
+319071.688105 7409015.782143
+319056.012020 7409032.289316
+319041.152313 7409043.757351
+319032.180414 7409050.486199
+319016.974365 7409070.532765
+319006.163556 7409083.550535
+319002.395029 7409103.207168
+318996.820577 7409125.373371
+318995.591888 7409145.559914
+318994.066336 7409169.275851
+318990.099899 7409184.133306
+318987.947633 7409195.221407
+318980.938337 7409209.558951
+318976.741005 7409215.257975
+318969.484322 7409221.636882
+318963.876885 7409223.016646
+318958.022062 7409223.636540
+318945.999057 7409217.557581
+318937.653872 7409216.347788
+318927.807873 7409214.608086
+318914.886029 7409214.058180
+318906.738753 7409215.377954
+318898.533754 7409218.957341
+318891.763598 7409226.366072
+318887.087986 7409241.373502
+318883.236996 7409253.621404
+318882.445358 7409265.199420
+318882.948378 7409276.047562
+318881.530026 7409292.644719
+318876.392624 7409305.622496
+318873.514690 7409319.920047
+318870.504816 7409328.918506
+318871.774735 7409339.276732
+318879.138619 7409359.863205
+318884.078111 7409375.850467
+318888.753724 7409392.087686
+318893.165458 7409409.064778
+318895.515633 7409427.011703
+318897.428759 7409442.179105
+318901.898216 7409456.646627
+318907.217035 7409467.604750
+318910.721683 7409479.782664
+318912.074064 7409486.871450
+318913.022381 7409499.989203
+318907.588115 7409514.976636
+318896.348503 7409528.574307
+318884.572885 7409533.333492
+318868.913293 7409540.782216
+318852.833144 7409545.191460
+318826.857517 7409549.370744
+318798.094664 7409553.729998
+318774.403244 7409557.969272
+318758.826114 7409562.388515
+318747.545271 7409567.157698
+318739.513442 7409574.276478
+318735.530513 7409581.745199
+318732.875226 7409586.724346
+318730.277664 7409609.840387
+318731.374412 7409627.507360
+318735.167678 7409649.013677
+318742.333653 7409667.070584
+318748.064783 7409681.818057
+318757.877798 7409695.655687
+318763.188370 7409706.613810
+318770.585239 7409715.352313
+318773.355973 7409726.500404
+318771.574787 7409737.298554
+318766.833204 7409744.747278
+318755.486391 7409752.285987
+318733.881266 7409764.633872
+318718.518539 7409770.822812
+318699.494485 7409781.211032
+318674.153818 7409801.277595
+318666.534301 7409812.185727
+318661.504100 7409820.884237
+318660.968095 7409842.790484
+318661.462869 7409853.888583
+318661.924658 7409876.574697
+318656.374945 7409896.351310
+318645.828016 7409912.988460
+318640.220579 7409924.446497
+318629.269584 7409936.784384
+318613.387344 7409953.801469
+318597.480365 7409971.568426
+318575.932965 7409992.224888
+318557.362453 7410004.892718
+318545.809484 7410010.671728
+318529.984967 7410016.670700
+318516.452903 7410018.550378
+318494.229311 7410025.079260
+318475.815478 7410031.198212
+318458.399439 7410038.346987
+318446.788746 7410046.395609
+318438.707440 7410055.274088
+318429.059351 7410066.132228
+318422.816954 7410093.447549
+318410.678502 7410113.074187
+318398.449342 7410125.632036
+318385.395559 7410140.949412
+318378.345032 7410159.686203
+318368.985560 7410179.622788
+318362.388576 7410200.629190
+318347.702039 7410220.695753
+318332.256849 7410240.492362
+318324.777518 7410255.939716
+318318.625830 7410269.147453
+318310.387845 7410284.574811
+318301.259268 7410305.521223
+318295.519891 7410311.940123
+318289.442419 7410322.128378
+318278.870752 7410329.437126
+318258.865396 7410338.295609
+318246.388849 7410340.515229
+318231.059106 7410344.944470
+318219.778263 7410349.973608
+318211.144459 7410360.861743
+318205.545269 7410372.059825
+318199.583244 7410387.797130
+318196.952697 7410402.354636
+318192.178129 7410431.969563
+318193.670697 7410443.347614
+318198.544219 7410451.776171
+318203.656882 7410460.454684
+318205.611239 7410463.524158
+318209.223088 7410471.672762
+318209.536445 7410479.491423
+318204.530983 7410487.190105
+318200.943872 7410499.198048
+318201.809726 7410505.267008
+318206.526570 7410509.406299
+318211.342369 7410520.104467
+318220.751318 7410529.642833
+318228.115202 7410539.651118
+318230.572579 7410542.730591
+318231.990931 7410547.039853
+318233.516483 7410557.408077
+318228.478036 7410566.616499
+318219.102072 7410576.724768
+318211.004274 7410586.363117
+318205.809148 7410591.282274
+318200.671747 7410593.931821
+318186.372783 7410597.881144
+318174.432241 7410598.860976
+318157.420267 7410599.720829
+318146.502257 7410599.970786
+318136.326409 7410601.490526
+318128.698645 7410602.070427
+318121.013159 7410605.159897
+318120.172043 7410608.419339
+318120.081334 7410612.198692
+318123.495274 7410618.067686
+318126.414440 7410623.176811
+318133.638138 7410628.635876
+318138.643600 7410631.275424
+318141.059745 7410636.374551
+318141.307132 7410646.962737
+318139.575424 7410655.491276
+318137.464389 7410658.970680
+318133.151610 7410669.448885
+318128.723384 7410674.128084
+318122.777852 7410679.027245
+318111.348576 7410679.517161
+318098.220577 7410676.937602
+318083.707211 7410668.788998
+318065.590242 7410663.069978
+318057.335765 7410658.340788
+318044.735525 7410655.021357
+318037.586043 7410656.871040
+318029.447013 7410668.269087
+318019.980341 7410682.156708
+318010.241542 7410696.544244
+317996.618769 7410714.621148
+317984.364870 7410728.438781
+317967.122002 7410749.205224
+317954.274375 7410766.282299
+317940.165074 7410783.339377
+317929.453221 7410796.187176
+317915.706754 7410808.974986
+317901.630438 7410813.934136
+317884.280369 7410818.313386
+317868.307420 7410818.183408
+317856.944115 7410815.903799
+317831.694156 7410804.575739
+317835.998689 7410790.058226
+317850.322391 7410755.864083
+317857.974893 7410744.376051
+317860.325069 7410736.567388
+317861.644466 7410721.270009
+317860.366300 7410703.323083
+317857.521351 7410690.205330
+317846.059090 7410675.127912
+317832.065237 7410652.911718
+317818.714589 7410638.924114
+317810.550821 7410630.975475
+317795.212832 7410625.556404
+317782.472406 7410622.786878
+317770.828728 7410622.646902
+317748.646367 7410624.236630
+317707.225551 7410632.315246
+317669.226920 7410637.074431
+317647.069298 7410636.804477
+317624.590074 7410632.035294
+317608.905743 7410624.746542
+317594.779950 7410612.618620
+317584.785518 7410600.910625
+317566.346947 7410573.045398
+317557.515233 7410557.987977
+317546.457038 7410540.670944
+317529.750175 7410525.143603
+317520.786522 7410520.924326
+317507.666769 7410518.894674
+317490.696027 7410523.913814
+317463.491712 7410536.651632
+317450.611099 7410545.830060
+317419.836167 7410573.845261
+317395.534525 7410594.831666
+317363.629859 7410622.826871
+317341.274327 7410638.614167
+317333.333207 7410642.623480
+317326.183725 7410643.663302
+317319.430062 7410643.203381
+317316.477912 7410638.684155
+317313.204158 7410630.425570
+317310.689058 7410621.057174
+317306.722621 7410606.429680
+317298.542360 7410599.610848
+317286.519356 7410599.460874
+317272.187407 7410603.760137
+317251.646046 7410624.426597
+317237.165665 7410640.683812
+317228.111304 7410643.563319
+317204.799210 7410645.512985
+317180.662493 7410652.691756
+317170.041348 7410660.770372
+317169.175494 7410670.478709
+317172.094659 7410677.237551
+317177.982468 7410687.025874
+317187.688281 7410692.374958
+317206.456702 7410693.354790
+317267.305638 7410694.854533
+317278.512266 7410699.473742
+317285.191713 7410706.282576
+317291.071275 7410716.820771
+317289.397290 7410730.988344
+317284.771155 7410740.646690
+317271.816326 7410754.684285
+317262.728980 7410760.543282
+317252.924212 7410763.412790
+317240.942439 7410760.273328
+317227.459852 7410757.123867
+317216.211993 7410754.734277
+317204.156004 7410757.573790
+317195.786080 7410766.442271
+317175.186996 7410791.587964
+317162.298137 7410800.396455
+317142.713339 7410804.635729
+317111.946653 7410801.256308
+317068.472525 7410792.507806
+317040.732205 7410787.678634
+317014.484453 7410783.609331
+316998.709414 7410783.419363
+316975.372581 7410786.868772
+316957.280351 7410791.118044
+316935.477317 7410792.347834
+316920.436192 7410793.467642
+316909.881017 7410796.327152
+316904.529213 7410803.725885
+316904.050932 7410811.944477
+316903.894254 7410824.262367
+316908.561620 7410842.259284
+316914.375213 7410857.646649
+316919.520861 7410867.424974
+316924.732479 7410870.844388
+316932.228302 7410872.434116
+316936.755483 7410870.994362
+316947.384874 7410861.795938
+316954.262231 7410852.907460
+316959.935637 7410849.618024
+316965.584305 7410848.568204
+316973.830536 7410850.167930
+316977.904174 7410855.077089
+316980.072932 7410861.825933
+316979.891515 7410876.393438
+316977.063058 7410892.420692
+316972.049350 7410903.188848
+316965.955386 7410909.467772
+316955.367225 7410914.936835
+316938.734578 7410923.325398
+316918.366389 7410929.794290
+316911.538510 7410934.943408
+316903.547912 7410943.431954
+316898.558942 7410951.590557
+316892.300053 7410971.307180
+316879.369964 7411014.479785
+316872.789472 7411030.087111
+316864.683427 7411047.174184
+316847.531267 7411066.760829
+316833.075625 7411081.148365
+316819.865163 7411086.217497
+316799.917531 7411089.326964
+316776.588945 7411091.656565
+316756.245494 7411096.635712
+316744.544093 7411100.974969
+316734.376490 7411102.334736
+316723.128632 7411100.705015
+316714.560798 7411094.995993
+316704.121070 7411088.137168
+316668.802464 7411058.562234
+316655.031259 7411047.934054
+316642.340310 7411041.425169
+316618.368518 7411035.516181
+316599.624835 7411031.926796
+316577.079641 7411032.016781
+316565.064883 7411031.866806
+316554.955004 7411029.127276
+316546.395416 7411022.298445
+316536.780312 7411010.220514
+316527.602257 7410992.553540
+316519.100393 7410981.615414
+316510.549052 7410974.036712
+316500.109324 7410967.927759
+316479.163898 7410960.189084
+316464.551577 7410957.399562
+316452.965623 7410952.400418
+316445.519277 7410947.071331
+316442.591865 7410940.312489
+316442.641342 7410936.203193
+316444.603945 7410929.874277
+316447.292217 7410925.055102
+316455.975497 7410921.425724
+316464.634040 7410920.415897
+316476.632305 7410922.055616
+316507.374253 7410927.674653
+316531.750111 7410931.334027
+316542.264055 7410931.843939
+316550.576255 7410927.834626
+316553.643853 7410922.645515
+316556.398094 7410912.967173
+316556.158954 7410902.129029
+316552.909939 7410891.630827
+316542.866030 7410883.282258
+316529.432920 7410875.643566
+316515.216418 7410870.984364
+316506.986680 7410867.894893
+316499.515595 7410864.815421
+316498.064259 7410860.316191
+316499.631042 7410855.477020
+316507.456715 7410830.171355
+316510.252188 7410817.133588
+316509.237901 7410807.775191
+316504.446841 7410800.616417
+316495.854269 7410796.407138
+316485.719651 7410795.907224
+316476.690029 7410797.286988
+316472.888517 7410800.596421
+316470.200245 7410805.045659
+316466.679105 7410816.213746
+316463.520798 7410828.871578
+316459.620331 7410840.409601
+316451.143206 7410857.116739
+316439.334604 7410870.044525
+316431.022404 7410873.673903
+316423.872922 7410875.073664
+316417.877912 7410873.513931
+316412.649802 7410871.204326
+316410.439812 7410867.434972
+316409.037953 7410859.206381
+316408.411239 7410849.478048
+316410.019254 7410840.909516
+316414.670128 7410829.391489
+316422.025766 7410812.294417
+316429.356665 7410796.327152
+316433.619966 7410785.918935
+316435.599062 7410777.720339
+316434.230187 7410767.242134
+316428.688720 7410759.703425
+316419.749806 7410753.244532
+316410.019254 7410750.135064
+316395.357456 7410751.444840
+316379.895773 7410756.104042
+316350.423745 7410769.561737
+316342.095052 7410774.310923
+316336.050565 7410777.230423
+316329.659736 7410777.520374
+316324.431626 7410774.840833
+316316.581215 7410771.751362
+316308.706064 7410770.161634
+316303.799557 7410771.971324
+316300.715467 7410778.280243
+316299.107452 7410787.228711
+316297.095372 7410797.666923
+316292.848563 7410806.575397
+316290.152045 7410812.524378
+316279.934966 7410817.993441
+316266.691519 7410825.302189
+316256.870258 7410830.031379
+316241.045742 7410833.570773
+316229.377325 7410834.920541
+316219.630281 7410833.310817
+316211.425281 7410828.351667
+316202.865694 7410821.892773
+316191.741529 7410810.544717
+316185.861966 7410799.636585
+316179.652555 7410785.369029
+316178.275434 7410775.260761
+316176.997268 7410757.683771
+316174.869741 7410747.205566
+316170.812595 7410741.176599
+316164.091917 7410738.097126
+316156.950682 7410738.017140
+316148.267401 7410741.636520
+316137.984351 7410752.344686
+316126.167503 7410766.392280
+316113.484800 7410789.398339
+316107.349604 7410799.036688
+316095.565741 7410810.094794
+316065.244351 7410831.381148
+316045.873955 7410848.328245
+316038.229699 7410858.316534
+316032.440845 7410870.944371
+316029.966976 7410888.101432
+316029.777313 7410903.408810
+316034.131322 7410916.166625
+316042.583709 7410931.214047
+316051.093819 7410941.412300
+316059.298818 7410946.371451
+316074.645054 7410951.040651
+316082.116139 7410954.500059
+316089.562485 7410960.189084
+316093.545414 7410972.197027
+316097.915917 7410983.085162
+316103.053318 7410992.493551
+316110.854252 7411000.062254
+316118.308845 7411005.011406
+316128.781558 7411008.500809
+316149.751722 7411014.369803
+316162.112822 7411016.759394
+316181.606911 7411020.368776
+316195.831659 7411024.658041
+316202.511106 7411031.456877
+316204.663372 7411039.705464
+316204.300538 7411068.840473
+316203.673825 7411088.627084
+316204.597402 7411105.084265
+316207.376382 7411123.421124
+316208.671040 7411139.878305
+316208.868950 7411154.075873
+316206.461051 7411166.743703
+316197.217026 7411184.560651
+316186.092861 7411203.097476
+316168.907716 7411225.303672
+316148.679712 7411250.449365
+316119.380855 7411280.344244
+316085.917651 7411312.048814
+316041.519945 7411347.362765
+316000.833043 7411386.456068
+315988.991456 7411401.993407
+315977.092145 7411422.019977
+315964.326980 7411451.374948
+315953.367740 7411486.348958
+315943.686665 7411509.764947
+315936.718600 7411526.112147
+315921.834154 7411544.608978
+315913.101395 7411551.967718
+315903.280135 7411556.326971
+315893.096040 7411559.196480
+315883.703583 7411559.446437
+315872.101136 7411555.937038
+315861.249097 7411552.447636
+315852.986374 7411551.597781
+315843.981490 7411551.107865
+315836.427943 7411553.997370
+315830.325732 7411561.026166
+315824.932697 7411571.794322
+315820.685888 7411581.072732
+315815.152668 7411602.669033
+315812.381934 7411613.847118
+315807.054869 7411619.386170
+315802.131869 7411622.685604
+315797.208870 7411625.615103
+315787.437086 7411625.865060
+315778.836268 7411622.765591
+315774.746137 7411618.976240
+315771.793987 7411614.836949
+315771.117796 7411608.847975
+315773.443233 7411602.898994
+315776.255198 7411588.361484
+315775.974826 7411580.892763
+315774.539982 7411575.273726
+315771.216751 7411570.744501
+315767.093635 7411569.944638
+315758.839159 7411569.464721
+315748.292230 7411571.574359
+315732.071894 7411576.233561
+315715.076413 7411583.862255
+315701.123790 7411587.801580
+315686.849565 7411587.621611
+315675.230626 7411585.232020
+315666.671039 7411578.403190
+315651.803085 7411565.885334
+315644.793789 7411555.337141
+315641.544774 7411544.469002
+315642.468352 7411531.031304
+315647.828402 7411522.882700
+315656.528175 7411518.133513
+315683.971631 7411516.983710
+315700.884650 7411516.443803
+315711.439825 7411513.964227
+315737.901979 7411500.846474
+315744.729858 7411495.327420
+315766.005133 7411476.910574
+315781.277152 7411457.673869
+315786.356830 7411442.046546
+315783.454157 7411433.418024
+315771.950665 7411422.069968
+315746.106978 7411415.401110
+315705.601493 7411409.662093
+315691.368499 7411406.122700
+315629.200167 7411390.405392
+315606.704449 7411386.386080
+315589.115239 7411380.937014
+315575.649145 7411376.287810
+315557.622885 7411375.307978
+315540.322293 7411376.957695
+315522.230063 7411381.586902
+315504.137833 7411386.226108
+315493.986723 7411386.846002
+315484.231432 7411385.226279
+315473.395885 7411380.607070
+315460.028745 7411368.109211
+315435.957998 7411339.794061
+315413.025230 7411311.108975
+315397.093513 7411293.352016
+315385.573528 7411282.753832
+315371.752846 7411276.604885
+315350.378616 7411272.975507
+315328.196255 7411274.565234
+315313.130392 7411277.364755
+315302.616448 7411277.224779
+315297.767664 7411274.175301
+315292.918881 7411271.135822
+315290.387288 7411263.627108
+315292.374630 7411255.058576
+315298.105760 7411246.909971
+315310.194734 7411241.830841
+315336.549687 7411237.311615
+315348.226350 7411235.211975
+315355.796389 7411230.822727
+315358.138319 7411223.384001
+315355.606726 7411215.885286
+315344.828903 7411206.406909
+315331.775120 7411198.768218
+315297.701695 7411189.749762
+315278.224098 7411184.650636
+315269.994360 7411181.561165
+315266.300048 7411176.652006
+315267.512244 7411170.323090
+315272.468229 7411164.034167
+315284.590188 7411156.715421
+315294.427941 7411150.856424
+315302.369061 7411146.477175
+315305.815986 7411141.288063
+315307.778588 7411134.589211
+315306.368483 7411127.470430
+315294.098092 7411117.232184
+315278.092158 7411105.454201
+315263.174727 7411096.295770
+315250.063220 7411093.146310
+315225.308036 7411089.846875
+315202.787580 7411088.067180
+315189.313239 7411084.167848
+315179.566194 7411082.548125
+315153.227734 7411085.577606
+315134.797408 7411087.217325
+315122.774404 7411087.067351
+315111.155465 7411085.057695
+315099.181938 7411081.168361
+315077.840693 7411074.919432
+315058.338358 7411072.059922
+315048.929408 7411073.439685
+315032.709073 7411078.468824
+315008.514632 7411090.866700
+314983.198704 7411102.124772
+314959.350605 7411116.022391
+314936.228174 7411132.539562
+314913.880889 7411146.837113
+314894.997021 7411154.435811
+314879.527092 7411159.844885
+314855.060526 7411163.274297
+314831.377351 7411164.474092
+314823.477463 7411165.123981
+314812.988257 7411162.754386
+314802.944348 7411154.775753
+314787.688822 7411143.007769
+314775.047350 7411132.389588
+314768.887416 7411119.261836
+314762.224461 7411101.114945
+314750.687985 7411072.329875
+314742.078920 7411060.391920
+314731.540237 7411051.543436
+314719.723389 7411045.174527
+314695.364023 7411040.505327
+314676.620341 7411037.155900
+314649.762368 7411031.836811
+314615.994053 7411027.677524
+314583.479166 7411024.158127
+314562.187398 7411024.508067
+314539.592726 7411028.587368
+314515.084929 7411035.126248
+314495.557855 7411044.844583
+314477.902675 7411053.963021
+314459.035299 7411060.571889
+314437.685808 7411065.281083
+314417.614483 7411068.140593
+314403.150594 7411072.939771
+314389.940132 7411077.758945
+314369.703882 7411093.686217
+314355.149285 7411105.964114
+314343.167512 7411112.652968
+314333.123603 7411114.402669
+314322.502458 7411112.393013
+314315.047866 7411107.943775
+314308.920916 7411097.285601
+314299.116148 7411079.728608
+314297.343209 7411071.609999
+314292.395470 7411066.560864
+314284.891400 7411065.850985
+314278.055275 7411062.021641
+314274.369210 7411056.372609
+314271.318105 7411049.483789
+314266.419844 7411040.705292
+314259.591965 7411036.266053
+314242.736669 7411032.316729
+314230.210645 7411032.156757
+314222.648851 7411035.796133
+314207.517018 7411044.324672
+314193.663351 7411050.373636
+314183.602949 7411053.983018
+314175.430935 7411056.372609
+314170.417226 7411056.312619
+314164.818036 7411053.753057
+314154.271107 7411045.524467
+314135.725334 7411026.607707
+314123.924978 7411018.989012
+314113.312079 7411016.369461
+314099.573859 7411013.699918
+314083.939006 7411012.260165
+314065.830283 7411007.670951
+314047.762792 7411000.592163
+314034.709009 7410992.953472
+314019.882286 7410977.206169
+314015.025256 7410964.688313
+314012.642095 7410955.319918
+314016.575547 7410941.672256
+314025.514462 7410927.464689
+314033.166964 7410916.976486
+314035.797511 7410907.048187
+314036.605642 7410892.110745
+314032.317602 7410884.592033
+314025.497969 7410879.522901
+314014.835593 7410880.632711
+313979.088183 7410885.161936
+313962.801877 7410885.581864
+313945.921843 7410883.502220
+313938.442512 7410880.912663
+313933.470035 7410877.733208
+313929.759231 7410873.953855
+313927.953307 7410868.324820
+313929.924156 7410860.886094
+313938.813592 7410851.027782
+313955.273069 7410836.920199
+313959.107566 7410831.361151
+313959.800249 7410825.772108
+313956.147169 7410817.623504
+313948.676084 7410814.424052
+313933.041231 7410812.354407
+313917.950629 7410817.763480
+313899.066761 7410825.002240
+313885.831561 7410832.300990
+313872.538637 7410843.349098
+313857.258371 7410863.695613
+313841.986352 7410882.812338
+313833.022700 7410898.259692
+313821.626409 7410908.078010
+313811.549515 7410912.937178
+313796.458913 7410917.726358
+313782.671215 7410918.796174
+313759.524046 7410916.636544
+313740.128911 7410915.766693
+313735.106957 7410916.326597
+313735.717178 7410910.757551
+313734.859570 7410887.261576
+313730.324143 7410871.024357
+313725.120771 7410863.615626
+313716.445737 7410852.097599
+313704.859783 7410846.838500
+313698.130859 7410839.909687
+313689.670226 7410830.411314
+313688.598216 7410819.283220
+313685.002859 7410807.105306
+313678.587292 7410796.897055
+313675.585664 7410794.317496
+313663.941986 7410792.847748
+313647.754636 7410790.028231
+313638.230239 7410783.039428
+313633.562873 7410774.380911
+313630.462290 7410748.325374
+313636.704686 7410739.596870
+313641.083435 7410735.887505
+313648.768922 7410731.228303
+313656.264746 7410723.289663
+313659.744655 7410713.001425
+313660.165213 7410703.163110
+313643.276932 7410682.416664
+313637.817928 7410675.497849
+313629.093416 7410666.259432
+313614.827437 7410655.151334
+313604.288754 7410648.642449
+313592.513136 7410640.103912
+313574.379675 7410632.205265
+313566.958068 7410621.467104
+313559.289073 7410609.979072
+313555.240174 7410594.751680
+313547.884536 7410580.234167
+313543.035753 7410567.026429
+313535.407989 7410539.121209
+313532.596025 7410510.796061
+313531.136442 7410492.599178
+313531.787894 7410469.883069
+313534.649336 7410451.006302
+313540.504160 7410435.209008
+313551.339707 7410410.163299
+313563.527636 7410394.725943
+313572.623228 7410382.518034
+313584.539031 7410368.350461
+313601.419066 7410272.726840
+313598.079342 7410260.548926
+313596.248679 7410248.650964
+313596.405357 7410240.072434
+313592.653322 7410222.085515
+313587.705584 7410214.676784
+313575.921720 7410206.888118
+313567.650751 7410201.189094
+313553.821822 7410193.870348
+313541.287552 7410185.321812
+313537.081974 7410179.182863
+313522.321221 7410167.054941
+313515.831438 7410161.135955
+313503.025041 7410153.327292
+313494.259298 7410146.608443
+313488.585892 7410137.420017
+313475.581586 7410126.831831
+313468.102255 7410118.873194
+313462.635004 7410112.464292
+313453.729075 7410099.186566
+313451.345914 7410090.308087
+313445.672507 7410081.369618
+313435.933709 7410072.101205
+313428.660534 7410067.432005
+313421.205941 7410058.213584
+313417.066333 7410048.545240
+313416.052047 7410033.887751
+313421.271911 7410025.139250
+313426.458790 7410018.920315
+313431.678654 7410010.431769
+313442.720357 7410002.553118
+313449.218387 7409993.834612
+313464.391451 7409981.996640
+313479.745932 7409974.187977
+313491.826660 7409965.069539
+313499.594610 7409955.871115
+313512.368021 7409921.766956
+313514.891367 7409907.929327
+313517.802287 7409900.910529
+313523.112859 7409887.122891
+313529.124361 7409877.134601
+313543.035753 7409864.766720
+313554.432043 7409851.089063
+313564.154349 7409831.822363
+313570.668871 7409807.456537
+313578.733685 7409795.728546
+313584.423584 7409789.529607
+313593.634624 7409785.150358
+313605.319533 7409784.350495
+313610.390965 7409784.180524
+313626.166004 7409781.690950
+313634.313280 7409779.821270
+313646.575425 7409775.242055
+313656.297731 7409770.112933
+313666.044775 7409764.233940
+313679.115051 7409756.385285
+313695.797175 7409745.577136
+313710.368265 7409739.028258
+313727.009158 7409730.239763
+313735.197665 7409726.350429
+313741.283384 7409726.460411
+313754.897910 7409731.499547
+313760.678518 7409734.379054
+313772.297457 7409737.618499
+313778.185266 7409734.189087
+313787.148918 7409729.549881
+313799.707928 7409722.201140
+313804.218616 7409710.923072
+313806.362636 7409704.144233
+313806.065772 7409692.026309
+313805.315365 7409676.868905
+313802.932204 7409667.990426
+313802.041611 7409660.651683
+313798.405023 7409650.743380
+313795.040561 7409640.335163
+313792.937772 7409629.696985
+313792.847064 7409620.348587
+313794.397355 7409603.971392
+313796.269250 7409584.064802
+313799.122445 7409580.075485
+313810.873324 7409575.486271
+313822.335585 7409573.166668
+313832.808298 7409568.817413
+313840.864865 7409557.599335
+313844.905518 7409544.041657
+313852.838392 7409525.504832
+313858.495306 7409506.418102
+313864.836657 7409491.890590
+313870.905883 7409478.372906
+313879.432486 7409469.434437
+313888.758972 7409458.496310
+313905.779193 7409442.399068
+313923.170493 7409434.120486
+313941.130783 7409422.582462
+313954.959712 7409415.263716
+313969.357631 7409404.405576
+313977.628600 7409395.467107
+313985.495504 7409380.719633
+313990.855554 7409364.152471
+313995.597137 7409353.894228
+314001.328267 7409330.768189
+314006.127573 7409317.480465
+314012.238030 7409301.433214
+314017.680542 7409280.326829
+314020.508999 7409263.459718
+314022.669512 7409241.283517
+314027.171954 7409215.367956
+314028.557321 7409194.191583
+314033.851401 7409167.026237
+314039.887642 7409134.261849
+314044.587993 7409122.963784
+314051.283932 7409114.215283
+314059.761057 7409105.736735
+314073.350845 7409092.778955
+314084.186393 7409077.771525
+314090.412297 7409065.993543
+314098.773975 7409045.407069
+314098.402894 7409034.558927
+314097.586517 7409017.901780
+314093.438663 7409004.744034
+314084.573965 7408982.947768
+314063.282198 7408961.511439
+314049.568716 7408942.444705
+314041.569873 7408933.266278
+314036.407732 7408919.338663
+314034.832702 7408903.181431
+314036.778813 7408889.333803
+314042.064646 7408871.486860
+314044.472546 7408861.168627
+314043.351058 7408849.050703
+314038.683692 7408836.642828
+314030.660109 7408828.984140
+314018.612366 7408819.255807
+314006.515146 7408813.066867
+313994.690051 7408805.358187
+313975.764952 7408797.829477
+313948.486421 7408789.440914
+313931.045643 7408785.201640
+313906.546092 7408777.352984
+313877.486375 7408769.194382
+313856.252331 7408764.155245
+313833.533966 7408755.826671
+313820.191565 7408747.598081
+313806.387375 7408736.589966
+313794.083998 7408726.111761
+313785.631612 7408712.894025
+313782.275396 7408696.466839
+313785.194562 7408685.908648
+313790.463903 7408669.821403
+313792.154380 7408655.973775
+313790.290732 7408642.336111
+313785.384225 7408628.658454
+313780.700366 7408617.760321
+313772.734507 7408605.312453
+313767.308487 7408592.884582
+313757.140885 7408574.107798
+313749.983157 7408557.880578
+313741.407077 7408554.251199
+313738.388957 7408531.765051
+313738.776529 7408499.740537
+313743.460388 7408468.525883
+313748.037046 7408446.889590
+313750.618117 7408422.203818
+313754.246458 7408395.008476
+313761.593850 7408374.661961
+313772.305703 7408348.306476
+313784.270984 7408323.470730
+313793.762395 7408293.315895
+313798.941028 7408263.870939
+313798.033943 7408233.846082
+313802.907465 7408208.680393
+313814.336741 7408185.864301
+313824.421881 7408169.837046
+313843.907724 7408152.160074
+313860.103321 7408133.683239
+313874.583702 7408110.397228
+313888.833189 7408085.341519
+313904.839122 7408061.315635
+313919.261780 7408042.818803
+313940.512316 7408026.171655
+313958.654023 7408014.783605
+313971.476912 7408002.565698
+313981.248695 7407991.587579
+313987.029303 7407974.500505
+313991.820363 7407955.643735
+313995.638368 7407933.997443
+314007.166598 7407924.039149
+314017.993899 7407909.291675
+314032.870099 7407895.334066
+314048.241073 7407882.146325
+314065.376740 7407869.988407
+314085.307880 7407857.110613
+314098.048306 7407852.211452
+314115.357144 7407846.612412
+314133.391651 7407843.542937
+314148.135911 7407840.683427
+314159.062167 7407838.793751
+314170.343010 7407828.335542
+314181.665085 7407814.587897
+314194.727114 7407803.649771
+314209.289958 7407794.231384
+314227.687298 7407782.593377
+314247.610192 7407770.465455
+314265.034477 7407755.787969
+314274.501150 7407748.579204
+314289.278395 7407742.700211
+314301.977590 7407740.580574
+314321.760297 7407740.550579
+314332.397935 7407741.180471
+314344.577618 7407740.820533
+314359.297139 7407739.220807
+314374.090877 7407732.082030
+314387.210630 7407716.594682
+314395.555816 7407697.277991
+314401.097283 7407679.681005
+314415.767327 7407661.694086
+314432.004155 7407639.937813
+314448.249229 7407617.681625
+314460.371188 7407600.424581
+314485.802564 7407572.979282
+314502.154839 7407563.080978
+314519.241029 7407554.952370
+314529.227214 7407546.743776
+314533.399807 7407536.955453
+314535.131515 7407520.078344
+314532.698877 7407511.219861
+314527.528491 7407498.552031
+314519.941959 7407476.015891
+314519.142074 7407458.858830
+314524.122798 7407445.051195
+314533.721410 7407427.254244
+314544.878560 7407405.947893
+314552.918635 7407391.160426
+314560.975202 7407375.113175
+314565.510629 7407356.746321
+314575.422598 7407333.660276
+314584.996472 7407317.882978
+314595.361984 7407299.596111
+314605.174999 7407284.578683
+314619.564671 7407268.601420
+314639.833906 7407248.914792
+314656.516031 7407232.707568
+314674.228934 7407214.500687
+314690.135913 7407199.303290
+314700.691088 7407186.315514
+314707.881801 7407178.576840
+314717.348474 7407171.118118
+314725.743137 7407169.198446
+314735.877754 7407169.828339
+314740.891463 7407174.677508
+314752.164060 7407185.645629
+314760.105180 7407200.113151
+314770.165581 7407206.282094
+314781.050606 7407207.671856
+314792.479882 7407206.542050
+314802.993826 7407196.833713
+314816.336227 7407183.366020
+314825.835884 7407173.637686
+314838.312431 7407160.229983
+314853.031953 7407138.153764
+314866.984575 7407116.327503
+314875.997705 7407081.823413
+Region 1
+252
+343920.788828 7392520.207686
+343850.374264 7392483.813920
+343742.785693 7392426.073810
+343715.886489 7392402.337876
+343693.737113 7392377.812077
+343620.799203 7392248.074300
+343571.387789 7392211.550556
+343577.737387 7392200.642425
+343655.136507 7392134.113820
+343671.604230 7392129.404627
+343693.737113 7392125.465302
+343725.386146 7392115.187062
+343788.494549 7392080.562993
+343868.565449 7392040.829799
+343941.346681 7391992.568066
+344002.269833 7391947.455793
+344015.719435 7391938.367350
+344018.094349 7391923.339924
+344012.561129 7391886.156293
+344066.351291 7391871.918732
+344154.157155 7391847.392933
+344230.888331 7391821.287405
+344260.162450 7391803.090522
+344316.327527 7391766.706754
+344362.209554 7391735.852039
+344411.258134 7391720.824613
+344419.957907 7391650.416673
+344417.582993 7391623.521280
+344394.641979 7391528.597540
+344339.268541 7391424.175426
+344338.691304 7391418.866336
+344321.316496 7391388.441547
+344306.836115 7391360.096402
+344291.803237 7391330.831415
+344272.638997 7391296.097365
+344251.454430 7391256.474152
+344228.513417 7391212.961605
+344214.280423 7391182.106890
+344207.155679 7391172.618516
+344202.537790 7391164.879841
+344184.214666 7391137.814477
+344174.368666 7391120.917372
+344162.551818 7391099.740999
+344145.003839 7391069.996094
+344120.141454 7391033.392364
+344116.974901 7391026.273583
+344080.584285 7390971.682934
+344047.360222 7390980.391443
+344080.576039 7390971.682934
+344080.584285 7390971.682934
+344090.867335 7390965.364017
+344208.738956 7390876.759194
+344291.011599 7390883.088110
+344333.727074 7390886.257567
+344357.731851 7390887.677324
+344410.466496 7390894.166212
+344457.140161 7390897.325671
+344506.972133 7390902.864722
+344552.070769 7390909.193638
+344596.369520 7390914.732689
+344613.043398 7390915.402575
+344646.201491 7390918.682013
+344697.616740 7390926.600656
+344761.706444 7390934.509302
+344786.222488 7390936.878896
+344807.910074 7390937.458796
+344817.739581 7390934.599286
+344827.882445 7390928.310364
+344840.812535 7390925.810792
+344929.410037 7390874.389600
+344983.991837 7390852.233395
+345006.701957 7390837.985835
+345043.323467 7390825.338002
+345056.146356 7390819.509000
+345070.107224 7390813.909959
+345089.213741 7390804.771525
+345106.580302 7390793.013539
+345130.156276 7390774.256752
+345141.395888 7390765.658224
+345149.328762 7390756.519790
+345188.003584 7390719.026212
+345229.531601 7390684.702091
+345238.899319 7390678.043232
+345250.757399 7390674.673809
+345284.599929 7390662.295929
+345303.607491 7390662.315926
+345319.613425 7390663.535717
+345391.949360 7390687.321643
+345467.377632 7390713.707123
+345506.308087 7390720.585945
+345538.542602 7390722.505616
+345566.381877 7390720.206010
+345600.447056 7390712.697296
+345633.860782 7390701.719177
+345677.722483 7390675.953590
+345689.225975 7390667.705003
+345772.290256 7390589.388418
+345820.126640 7390549.035330
+345848.238040 7390525.309394
+345864.903673 7390511.921687
+345922.990121 7390469.149014
+345960.568194 7390446.992809
+345991.499805 7390433.065195
+346028.929446 7390421.347202
+346068.940157 7390415.348229
+346121.518124 7390407.269613
+346124.049717 7390406.149805
+346162.262750 7390396.271497
+346216.077651 7390380.554189
+346251.132377 7390365.706732
+346258.694171 7390382.663828
+346263.221351 7390398.441125
+346271.583029 7390408.939327
+346278.460386 7390424.736621
+346283.251446 7390435.194830
+346280.752838 7390449.572367
+346282.088727 7390458.440848
+346287.539486 7390464.369832
+346295.348666 7390468.769079
+346300.156219 7390477.457591
+346301.607555 7390485.336241
+346306.052273 7390489.705493
+346313.490374 7390500.523640
+346320.293514 7390513.551408
+346322.833353 7390524.209582
+346330.279699 7390534.477823
+346343.721055 7390547.135655
+346352.709446 7390556.424064
+346362.266828 7390569.481828
+346366.587853 7390586.028993
+346366.892963 7390595.557361
+346369.036983 7390615.064020
+346378.363470 7390628.701684
+346390.246288 7390646.078707
+346401.106574 7390661.696032
+346406.730503 7390670.394542
+346416.205422 7390691.090997
+346424.113558 7390715.986733
+346429.028311 7390734.083633
+346443.986974 7390747.751292
+346455.902777 7390760.389127
+346460.718575 7390777.606178
+346464.388148 7390797.692737
+346463.951098 7390829.247332
+346455.399757 7390866.151011
+346454.789536 7390877.289103
+346450.410787 7390923.691155
+346450.146908 7390948.156964
+346452.084772 7390967.893583
+346459.819736 7390994.369048
+346468.445294 7391023.883993
+346482.843212 7391052.159149
+346491.658433 7391089.102821
+346510.097005 7391121.967192
+346558.287977 7391169.429062
+346582.919467 7391235.027826
+346607.130401 7391291.318184
+346622.872455 7391338.000187
+346633.765726 7391359.706469
+346723.748594 7391468.767788
+346736.406558 7391460.999119
+346748.330608 7391451.690713
+346765.499260 7391457.399735
+346771.040727 7391491.413909
+346777.373832 7391532.546863
+346778.157224 7391546.784425
+346767.865928 7391591.876701
+346755.216211 7391653.586130
+346704.996666 7391885.286442
+346684.867617 7391909.972214
+346624.348530 7391987.368956
+346565.338504 7392082.332690
+346516.306416 7392184.595173
+346486.232413 7392292.756646
+346477.549132 7392398.968453
+346479.924047 7392470.166258
+346480.723931 7392523.957044
+346476.757494 7392577.747830
+346463.307892 7392630.748751
+346455.399757 7392652.105093
+346442.741793 7392679.790351
+346422.183940 7392720.143439
+346403.176378 7392745.449104
+346376.293666 7392773.934225
+346263.163628 7392865.698506
+346228.356288 7392901.292410
+346100.993256 7393158.388371
+346063.019364 7393227.996448
+346022.678804 7393283.376962
+345984.787374 7393324.199969
+345923.583850 7393378.540661
+345873.141657 7393416.724121
+345795.346717 7393465.515763
+345769.626724 7393483.962603
+345741.853419 7393512.777668
+345679.157327 7393578.416424
+345617.863095 7393643.945200
+345566.085013 7393697.206077
+345398.183510 7393875.395555
+345355.921578 7393919.937925
+345279.173910 7394006.163155
+345236.326495 7394060.013931
+345212.552612 7394097.157569
+345208.652145 7394101.936750
+345185.076172 7394137.180713
+345149.056636 7394192.841179
+345116.962307 7394154.687714
+345079.705837 7394106.685937
+345076.539284 7394101.146885
+345052.641708 7394071.002049
+345039.357030 7394058.424203
+344991.108335 7394021.250571
+344940.303308 7393987.516349
+344905.570184 7393968.749564
+344885.911170 7393956.171718
+344810.755024 7393910.289577
+344767.610745 7393877.295229
+344762.489836 7393871.536216
+344722.817220 7393825.514099
+344739.012817 7393811.626478
+344767.132464 7393789.920196
+344787.022372 7393771.853290
+344757.756500 7393710.943724
+344742.723621 7393680.099007
+344714.241141 7393624.718493
+344688.933459 7393556.690146
+344666.775837 7393483.302716
+344654.909511 7393420.023556
+344634.541321 7393360.423765
+344629.750261 7393350.075537
+344616.176966 7393302.153746
+344585.294832 7393250.942518
+344548.904216 7393201.890920
+344507.763771 7393158.378373
+344457.931800 7393116.255588
+344402.550115 7393079.071958
+344347.176676 7393044.467885
+344293.386513 7393008.863984
+344268.070585 7392984.938082
+344226.938387 7392941.625501
+344190.547771 7392893.173800
+344174.723254 7392863.108950
+344159.690376 7392829.884641
+344147.172598 7392791.691183
+344131.216141 7392754.737513
+344117.774785 7392723.292899
+344098.255957 7392689.438698
+344081.186260 7392664.362993
+344054.402503 7392628.809083
+344025.639650 7392597.804394
+343967.462493 7392552.642130
+343920.788828 7392520.207686
+Region 1
+248
+349181.216036 7394936.783748
+349134.921697 7394844.179611
+349102.332593 7394770.442241
+349036.890507 7394673.808794
+349082.723057 7394652.302477
+349075.507605 7394634.605509
+349056.030008 7394581.804553
+349021.733935 7394496.059240
+349013.157855 7394477.192472
+348996.013942 7394454.896291
+348966.863516 7394436.039521
+348934.266167 7394420.602166
+348908.150354 7394405.054829
+348885.943255 7394393.146868
+348860.660312 7394382.698658
+348851.605951 7394378.309410
+348828.087701 7394373.620213
+348802.046104 7394379.539199
+348775.130408 7394393.146868
+348751.133876 7394403.435106
+348733.289033 7394408.244282
+348711.337567 7394404.124988
+348682.533484 7394389.037572
+348653.028470 7394369.830862
+348629.741115 7394349.954267
+348615.301965 7394336.216620
+348596.780931 7394317.009910
+348575.629349 7394300.402755
+348564.043395 7394285.045385
+348539.576829 7394277.136740
+348520.156956 7394276.726810
+348498.048812 7394277.016760
+348471.718597 7394278.736466
+348456.388854 7394282.605803
+348428.359916 7394291.924207
+348391.086954 7394305.601864
+348368.756161 7394315.800117
+348324.671812 7394327.808060
+348284.751810 7394340.295921
+348223.878135 7394353.103727
+348101.322655 7394364.211825
+347921.010576 7394383.298555
+347829.056858 7394393.236853
+347815.269160 7394394.876572
+347780.503052 7394397.376144
+347752.136018 7394404.394942
+347713.791046 7394415.393058
+347685.753862 7394425.081398
+347661.180094 7394433.319987
+347626.141860 7394449.337244
+347609.913278 7394459.275541
+347548.396398 7394499.508650
+347318.458502 7394656.561748
+347294.041414 7394675.868441
+347218.505941 7394729.509253
+347186.799184 7394750.175713
+347176.351210 7394757.204509
+347140.620292 7394769.772356
+347066.610372 7394790.678775
+347018.477124 7394806.536059
+346962.971745 7394807.515891
+346860.133003 7394806.746023
+346822.472468 7394809.665523
+346782.593696 7394816.694319
+346686.409662 7394868.085516
+346699.438706 7394919.356733
+346704.221520 7394932.394500
+346713.242897 7394970.258014
+346724.771127 7395020.579395
+346738.641287 7395065.541693
+346741.857317 7395074.060234
+346746.598900 7395097.636196
+346756.453145 7395130.210616
+346763.338748 7395156.226160
+346770.941772 7395186.081046
+346784.152234 7395234.612733
+346850.303496 7395310.679703
+346862.268777 7395324.447345
+346881.787605 7395351.112778
+346907.367412 7395406.183344
+346914.599357 7395423.100447
+346934.175908 7395449.815871
+346950.767324 7395474.181697
+346964.530283 7395488.949167
+346981.987553 7395508.755775
+346996.146331 7395522.783372
+347014.890014 7395536.141084
+347045.697931 7395555.087838
+347084.884019 7395573.624663
+347101.129094 7395580.663458
+347124.927715 7395589.561933
+347162.093477 7395597.210623
+347177.184079 7395604.819320
+347205.922193 7395630.164978
+347213.269584 7395625.355802
+347231.411292 7395615.077563
+347254.038949 7395608.698655
+347290.066730 7395599.180286
+347318.062683 7395591.771555
+347326.259437 7395590.031853
+347416.737079 7395575.204393
+347449.680771 7395572.064930
+347569.737643 7395549.508794
+347523.360842 7395610.978265
+347457.910509 7395688.844927
+347404.367733 7395763.672110
+347334.076863 7395844.648239
+347280.517595 7395911.086859
+347310.641076 7395928.273915
+347269.236752 7396004.040937
+347234.421166 7396063.240796
+347202.697917 7396121.100886
+347183.987219 7396159.784259
+347170.743773 7396193.348510
+347157.467342 7396220.433871
+347127.871620 7396265.856090
+347122.561047 7396275.024520
+347113.448962 7396289.142102
+347102.811325 7396304.029552
+347082.690522 7396333.044581
+347075.087497 7396342.972881
+347035.456113 7396393.084297
+347007.460160 7396427.338430
+346934.175908 7396511.733974
+346913.123281 7396540.808993
+346870.003741 7396595.929552
+346849.998386 7396653.999605
+346767.000074 7396758.541698
+346753.583457 7396787.756693
+346743.242684 7396808.623119
+346729.083906 7396834.408702
+346713.003756 7396857.004832
+346682.146361 7396882.460472
+346606.000667 7396934.001643
+346663.650065 7397002.509908
+346678.658205 7396992.001708
+346706.852068 7396972.755005
+346732.027810 7396958.037526
+346751.439437 7396947.169387
+346776.516224 7396935.491388
+346811.076177 7396920.004041
+346833.621372 7396904.226743
+346866.771219 7396881.600619
+346876.039982 7396876.561482
+346969.593469 7396800.504510
+347090.244069 7396673.536258
+347142.912744 7396617.095926
+347183.212074 7396579.642342
+347230.331036 7396529.600913
+347266.078445 7396501.295762
+347291.567544 7396481.419166
+347312.884051 7396469.931134
+347347.138893 7396453.453956
+347369.601625 7396443.085732
+347395.874116 7396433.877310
+347446.530711 7396421.159488
+347491.860240 7396412.650946
+347535.169444 7396407.641804
+347549.080835 7396444.745448
+347559.776196 7396471.230911
+347602.846259 7396526.611425
+347651.647452 7396591.260351
+347795.181342 7396749.863184
+347881.189528 7396843.797094
+347954.886091 7396922.083684
+347954.935569 7396922.053690
+348032.392413 7397015.107750
+348016.922484 7397058.280355
+347984.885878 7397148.324931
+347963.124076 7397175.420290
+347931.029746 7397267.334546
+347919.732410 7397285.871371
+347963.445679 7397278.942558
+348020.179746 7397333.523209
+348135.057985 7397497.035200
+348145.316296 7397485.957098
+348149.117808 7397480.238078
+348151.773094 7397476.418732
+348156.712586 7397471.069648
+348164.686691 7397461.521284
+348186.011444 7397452.322859
+348205.571503 7397446.363880
+348224.867683 7397445.733988
+348249.227048 7397449.543335
+348287.390603 7397450.503171
+348309.498748 7397454.252529
+348370.636302 7397482.077763
+348438.090469 7397519.371374
+348523.001906 7397564.603627
+348534.109578 7397567.783082
+348545.217251 7397565.393491
+348599.180584 7397529.689607
+348671.302117 7397490.556310
+348691.851724 7397480.208083
+348733.297279 7397481.267901
+348828.516505 7397492.375999
+348865.063799 7397504.653895
+348920.577424 7397528.089881
+348977.723802 7397551.105939
+349034.853688 7397575.701726
+349094.366735 7397598.717783
+349152.296505 7397622.523705
+349207.843115 7397644.739900
+349359.408834 7397700.300383
+349420.562880 7397726.975814
+349439.883799 7397734.424538
+349485.666871 7397479.588189
+349504.542493 7397377.255718
+349508.665609 7397350.580287
+349528.473055 7397227.991285
+349557.796651 7397071.808038
+349564.772962 7397028.975375
+349576.053805 7396970.225438
+349585.578202 7396896.428079
+349593.519322 7396861.504061
+349599.811196 7396825.810175
+349607.570899 7396790.106291
+349608.593431 7396721.048120
+349605.418633 7396657.558995
+349598.269151 7396621.065246
+349595.102598 7396588.520821
+349581.801428 7396531.910518
+349572.499680 7396487.558115
+349562.628942 7396463.452244
+349552.469586 7396442.385852
+349542.837988 7396422.829202
+349533.396054 7396403.672484
+349505.416594 7396377.436977
+349486.549218 7396329.155248
+349468.506465 7396313.287966
+349449.432934 7396287.542376
+349450.117371 7396152.125571
+349463.616450 7396129.989363
+349485.716349 7396101.494244
+349508.616131 7396063.180807
+349625.061154 7396003.940954
+349602.639653 7395981.724759
+349531.689084 7395906.387664
+349487.307871 7395863.325040
+349443.800758 7395807.954525
+349418.996096 7395688.824930
+349399.081449 7395620.606616
+349374.870516 7395552.828225
+349340.978508 7395393.055593
+349290.899150 7395200.498576
+349202.549034 7395015.310297
+349200.124643 7394986.265273
+349181.216036 7394936.783748
+Region 1
+115
+331139.568375 7398194.775684
+331145.637601 7398238.988111
+331157.124600 7398323.783586
+330389.755115 7398425.616143
+330238.948049 7398440.953516
+329851.350470 7398485.715848
+329395.482347 7398538.076879
+329263.649858 7398549.594906
+329181.162813 7398557.763507
+328821.404508 7398601.735975
+328705.478998 7398637.709813
+328615.537360 7398687.691252
+328421.668478 7398807.610711
+328317.708248 7398902.424470
+328241.785202 7398973.502295
+328141.857379 7399021.464080
+327890.619470 7399056.238123
+327687.193206 7399107.099411
+327604.978287 7399124.166488
+327502.287977 7399141.383538
+327116.537553 7399213.321216
+327105.050554 7399145.072906
+327095.823022 7399102.290235
+327092.532776 7399019.634393
+327088.129289 7398984.530406
+327088.467384 7398979.811214
+327157.414118 7398854.862617
+327190.613443 7398800.841870
+327199.230754 7398784.624648
+327204.425879 7398767.957503
+327206.668854 7398746.291214
+327205.967925 7398717.346172
+327205.877216 7398702.978633
+327210.058055 7398677.463004
+327215.879894 7398668.454547
+327222.641803 7398649.817739
+327330.015972 7398465.119376
+327336.217138 7398453.081438
+327353.798101 7398428.965569
+327363.141081 7398397.071032
+327395.276641 7398353.138558
+327460.891899 7398241.927607
+327509.792046 7398139.425165
+327559.186968 7398037.662596
+327587.842620 7397981.352241
+327733.759671 7397726.455903
+327815.685972 7397640.850566
+327930.646674 7397541.787535
+327964.901516 7397503.874029
+328048.526541 7397469.529912
+328093.880809 7397458.611782
+328131.838209 7397442.654515
+328168.261810 7397423.387816
+328199.861366 7397404.161109
+328246.568016 7397365.287768
+328257.139684 7397305.528004
+328268.140155 7397230.790806
+328283.511129 7397211.914039
+328399.362424 7397107.361948
+328485.263408 7397045.412559
+328559.520715 7396989.872073
+328632.038068 7396939.930627
+328663.142850 7396920.453964
+328690.437873 7396904.796646
+328737.762991 7396883.450302
+328796.146304 7396846.536625
+329060.553443 7396679.945161
+329161.693462 7396621.455179
+329188.073154 7396600.328798
+329240.280040 7396568.444260
+329359.866877 7396543.888466
+329486.289839 7396515.243372
+329616.027786 7396489.867719
+329680.397862 7396480.359348
+329730.073156 7396471.450874
+329838.478104 7396443.395679
+329954.766448 7396418.369966
+330026.467424 7396402.212734
+330118.973639 7396340.983222
+330211.751980 7396284.582883
+330162.926049 7396173.591894
+330199.902147 7396071.269421
+330213.722829 7396052.872572
+330222.059769 7396074.118933
+330293.109292 7396239.940529
+330363.523855 7396390.924667
+330429.559670 7396542.708668
+330466.247150 7396616.925955
+330460.450050 7396713.489415
+330456.722754 7396819.181311
+330458.767819 7396868.192915
+330457.456669 7396919.554118
+330458.149352 7396984.532987
+330459.213116 7397083.336063
+330476.084904 7397134.487302
+330480.999657 7397149.084801
+330498.926963 7397245.178341
+330510.001650 7397294.999807
+330551.719331 7397477.308579
+330567.073813 7397547.076629
+330578.197978 7397586.129939
+330587.466741 7397611.735553
+330607.991609 7397652.518568
+330635.162939 7397701.900109
+330657.411269 7397734.804473
+330692.136147 7397777.527155
+330734.769159 7397825.039016
+330793.482321 7397889.997889
+330871.334985 7397986.731320
+330942.928759 7398062.308374
+330981.331455 7398110.820065
+331057.691551 7398153.602736
+331066.622219 7398158.281935
+331110.789030 7398177.908573
+331139.568375 7398194.775684
+Region 1
+104
+332883.440001 7393972.568910
+332834.737763 7393981.237425
+332776.849224 7393992.055572
+332680.590974 7394004.803388
+332622.026244 7394018.381062
+332506.513045 7394035.928057
+332485.246016 7394039.187498
+332451.288038 7394042.966851
+332422.838542 7394046.116312
+332403.558855 7394053.924974
+332383.363836 7394063.463340
+332320.016292 7394088.599035
+332237.306599 7394120.463577
+332216.303449 7394128.482203
+332195.193099 7394138.010571
+332174.998080 7394148.418788
+332140.116525 7394177.893739
+332124.506410 7394190.031660
+332110.743451 7394207.368691
+332094.218005 7394242.042751
+332083.201041 7394265.448742
+332074.946564 7394302.732356
+332069.438082 7394323.538792
+332046.257927 7394412.353578
+332039.141430 7394433.629934
+332010.592980 7394503.887899
+331988.954871 7394549.330116
+331983.256725 7394559.408389
+331968.462987 7394541.271496
+331937.061341 7394526.514024
+331922.267603 7394514.856021
+331908.991172 7394498.378843
+331900.044012 7394481.391753
+331892.861545 7394460.065406
+331885.687324 7394444.848012
+331838.997166 7394483.041470
+331682.137367 7394428.010897
+331567.300359 7394386.358031
+331478.100882 7394329.657744
+331400.899671 7394285.885241
+331372.862486 7394267.158449
+331244.163565 7394191.021491
+331112.702156 7394113.314801
+331065.302822 7394085.219614
+331030.149141 7394067.272688
+331017.128343 7394053.065121
+330989.627163 7394009.142645
+330931.911795 7393929.406303
+330870.048573 7393837.811992
+330806.181516 7393749.777072
+330699.302121 7393599.372835
+330801.538889 7393511.227933
+330894.861481 7393420.303508
+330953.483934 7393366.462730
+331028.846236 7393298.264412
+331103.087051 7393230.246063
+331168.628092 7393169.086539
+331240.576454 7393109.116811
+331390.410465 7392972.170269
+331536.789305 7392841.392670
+331650.760459 7392741.629758
+331671.359543 7392723.602846
+331692.156537 7392705.036027
+331727.186525 7392674.131320
+331896.687796 7392539.074454
+331984.056610 7392468.866480
+332000.029558 7392457.088498
+332079.572699 7392394.139280
+332219.989515 7392274.429785
+332337.028266 7392179.646021
+332461.076314 7392090.601274
+332497.986442 7392078.373368
+332541.609002 7392058.756728
+332559.536308 7392053.557619
+332555.619348 7392250.453892
+332557.515981 7392291.436872
+332555.710057 7392351.046662
+332577.702754 7392584.276711
+332580.803337 7392653.954776
+332583.293698 7392701.066706
+332584.753281 7392746.688892
+332582.634000 7392791.091286
+332575.220638 7392839.113060
+332573.876503 7392885.275153
+332572.837478 7392917.239678
+332578.560362 7392958.982528
+332583.170005 7392994.156503
+332591.572914 7393028.010704
+332603.538194 7393079.041963
+332610.011485 7393103.287810
+332616.913581 7393138.681747
+332625.151565 7393236.764946
+332635.187228 7393320.950526
+332641.388393 7393377.150899
+332653.543337 7393423.622939
+332669.153452 7393463.186162
+332691.071933 7393516.607012
+332714.639660 7393561.139384
+332749.430507 7393607.281480
+332766.764084 7393643.535270
+332783.710088 7393687.697705
+332806.510916 7393761.085135
+332838.316627 7393850.359843
+332883.440001 7393972.568910
+Region 1
+120
+336981.824879 7397158.343215
+336633.685514 7397505.313782
+336447.469133 7397638.350994
+336366.697304 7397670.655461
+336275.823842 7397702.969926
+336197.072340 7397711.048542
+336150.819232 7397710.118701
+335944.655219 7397680.753731
+335969.196002 7397597.128055
+335989.118895 7397520.771135
+336000.003920 7397482.547682
+336009.132497 7397449.823287
+336038.802435 7397323.244969
+336046.026133 7397286.361287
+336088.180864 7397241.199023
+336000.003920 7397141.376122
+335983.371272 7397124.139074
+335961.964058 7397100.653097
+335895.689102 7397028.375478
+335841.511366 7396969.895495
+335788.347918 7396911.155556
+335708.483174 7396822.300776
+335608.951170 7396714.019324
+335504.867247 7396602.918355
+335403.067529 7396491.327469
+335420.648493 7396474.910281
+335488.391278 7396414.320660
+335504.191056 7396397.133604
+335574.721066 7396336.044068
+335582.629202 7396325.665845
+335644.756303 7396271.635100
+335654.709504 7396257.977440
+335678.640065 7396238.040855
+335711.509540 7396204.936525
+335778.229792 7396145.606688
+335806.778243 7396115.031925
+335815.816112 7396082.297532
+335844.158407 7395989.423441
+335876.409415 7395877.872548
+335922.143010 7395706.351928
+335942.206089 7395626.815552
+335977.013428 7395504.076576
+335995.394277 7395473.701779
+336038.472585 7395441.887229
+336070.138111 7395416.821522
+336086.556356 7395389.496203
+336117.743601 7395337.635086
+336138.713765 7395302.301139
+336158.339794 7395270.136648
+336216.475720 7395186.211024
+336276.516526 7395188.630609
+336572.729377 7395262.567944
+336685.513073 7395293.952569
+336808.687020 7395371.189339
+336984.925462 7395475.271510
+337132.285603 7395575.474346
+337206.922237 7395491.548722
+337262.378138 7395428.069596
+337327.836717 7395353.772322
+337376.464739 7395297.102029
+337475.097904 7395180.921930
+337506.590259 7395143.058415
+337605.990323 7395029.127931
+337663.573752 7394962.509342
+337698.108965 7394922.766149
+337759.139318 7394852.738145
+337815.568275 7394785.729623
+337848.759353 7394747.916100
+337904.611073 7394684.296997
+337958.211573 7394639.784622
+337995.360842 7394607.700117
+338025.616262 7394580.524772
+338061.644044 7394546.900532
+338115.640362 7394499.328680
+338169.257353 7394451.756829
+338217.926607 7394405.674722
+338279.212593 7394351.314034
+338333.967564 7394304.512051
+338375.371889 7394264.068978
+338379.956793 7394260.299624
+338450.890869 7394334.326944
+338477.682872 7394362.092188
+338524.076166 7394411.433736
+338581.041127 7394473.103173
+338732.722294 7394630.786163
+338703.233773 7394679.957740
+338878.911470 7394746.326372
+338862.287070 7394795.138011
+338847.847920 7394841.570058
+338834.942569 7394888.032099
+338807.952656 7395002.742450
+338793.752647 7395086.168160
+338758.153669 7395250.370034
+338740.226363 7395335.935377
+338708.173265 7395486.209637
+338688.613206 7395604.439385
+338661.013072 7395771.280807
+338652.527701 7395805.604927
+338637.321651 7395857.096107
+338626.502597 7395885.361266
+338616.763798 7395905.987732
+338604.782025 7395930.833477
+338588.990493 7395956.839022
+338573.561796 7395979.415155
+338558.528917 7396005.050764
+338542.003471 7396033.725852
+338526.269663 7396066.970158
+338462.196451 7396344.182674
+338383.337747 7396580.802143
+338340.927383 7396755.842160
+338321.961053 7396813.082355
+338306.367430 7396863.453727
+338283.632573 7396926.053005
+338252.948348 7396994.811227
+338206.431361 7397106.442105
+337821.777686 7396988.232354
+337576.386355 7396931.912001
+337391.332693 7396931.912001
+337194.214796 7397000.300287
+336981.824879 7397158.343215
+Region 1
+74
+333821.052918 7396075.218745
+333729.676437 7396099.864523
+333632.989382 7396125.490134
+333556.340668 7396145.636683
+333432.737917 7396179.760838
+333355.322304 7396201.427126
+333314.742603 7396207.546078
+333263.723174 7396222.513514
+333226.928493 7396231.451983
+333185.812787 7396242.400108
+333078.718989 7396269.485469
+332929.998220 7396307.788908
+332916.062090 7396308.218834
+332896.856619 7396295.920940
+332818.270040 7396299.800276
+332794.694067 7396302.709778
+332685.670652 7396309.468620
+332492.832548 7396624.534652
+332439.479436 7396805.113720
+332399.608911 7396868.092933
+332328.617111 7396927.462763
+332281.968184 7396961.047010
+332224.120876 7396972.245092
+332169.167995 7396976.304397
+332016.959070 7397003.399756
+331995.799242 7397004.029648
+331968.693882 7397002.339937
+331765.383065 7396968.455741
+331762.670055 7397072.437930
+331759.816860 7397168.441486
+331704.319727 7397269.404192
+331651.486128 7397365.547723
+331604.202241 7397438.875163
+331573.072720 7397497.215170
+331509.568498 7397617.484569
+331436.457417 7397744.902743
+331363.659693 7397880.439527
+331328.110193 7397965.235002
+331299.471034 7397999.999047
+331296.741531 7398008.977509
+331274.542678 7398041.781890
+331254.331167 7398071.996715
+331236.445093 7398106.750762
+331198.372246 7398138.695290
+331139.568375 7398194.775684
+331145.637601 7398238.988111
+331157.124600 7398323.783586
+331542.536928 7398255.255324
+331752.411744 7398227.770032
+332221.201710 7398166.210577
+333145.323794 7398119.288614
+333595.650450 7398089.513714
+334098.390147 7398060.788635
+334095.207102 7397991.890436
+334091.413836 7397801.832991
+334088.750304 7397633.881760
+334085.303379 7397567.043209
+334084.058199 7397468.200140
+334082.491415 7397382.074892
+334080.743214 7397329.973817
+334080.767953 7397276.622955
+334079.011505 7397178.539756
+334077.147857 7397051.241561
+334074.154476 7396897.007980
+334073.725672 7396874.941759
+334056.185939 7396718.558546
+334029.426921 7396691.163239
+334057.480597 7396642.061650
+334104.838700 7396536.829675
+334118.865538 7396494.736885
+334115.360890 7396408.791607
+334076.776777 7396249.198943
+333982.068818 7396026.457097
+333821.052918 7396075.218745
+Region 1
+103
+335324.555167 7394205.758966
+335270.806236 7394210.308187
+335245.176951 7394213.087711
+335209.413049 7394215.857237
+334973.941933 7394238.813304
+334784.418814 7394253.730749
+334636.819531 7394264.608886
+334542.111572 7394267.818336
+334486.037204 7394270.827821
+334405.347837 7394276.366872
+334284.911638 7394282.485824
+334135.778557 7394293.573924
+334091.554022 7394278.196558
+334052.235994 7394368.041169
+334017.263730 7394444.888006
+334196.338875 7394497.159052
+334182.361514 7394504.187848
+334166.273118 7394523.774493
+334144.428853 7394584.504091
+334138.928617 7394618.258309
+334133.733492 7394643.394003
+334124.720362 7394669.499532
+334117.496664 7394693.085492
+334107.741373 7394718.181193
+334093.153791 7394745.276552
+334071.540420 7394782.070249
+334043.222864 7394834.061344
+334027.752936 7394904.139340
+334015.630977 7394957.900131
+334016.867911 7394984.985492
+334014.888816 7395049.254483
+334017.123544 7395134.299916
+334020.372559 7395193.259816
+334021.172444 7395236.302443
+334012.283007 7395278.225262
+333992.211682 7395349.133117
+333971.892969 7395423.830322
+333957.676468 7395454.315100
+333947.517112 7395476.431312
+333933.053223 7395502.336874
+333919.339741 7395520.383783
+333899.293155 7395541.460173
+333879.246568 7395560.216960
+333830.552576 7395600.850000
+333884.870497 7395785.938296
+333907.324983 7395848.817525
+333982.068818 7396026.457097
+334076.776777 7396249.198943
+334113.934292 7396408.831600
+334184.876614 7396381.876217
+334205.417975 7396378.426808
+334306.178667 7396351.301454
+334411.252138 7396323.436227
+334507.873223 7396312.538094
+334605.500347 7396302.929740
+334756.373383 7396289.032120
+334874.756270 7396281.063485
+334979.969927 7396274.794559
+335045.651154 7396268.285674
+335107.877211 7396336.993905
+335176.411634 7396413.840742
+335272.397758 7396520.072545
+335317.249007 7396569.614059
+335403.067529 7396491.327469
+335420.648493 7396474.910281
+335488.391278 7396414.320660
+335504.191056 7396397.133604
+335574.721066 7396336.044068
+335582.629202 7396325.665845
+335644.756303 7396271.635100
+335654.709504 7396257.977440
+335678.640065 7396238.040855
+335711.509540 7396204.936525
+335778.229792 7396145.606688
+335806.778243 7396115.031925
+335815.816112 7396082.297532
+335844.158407 7395989.423441
+335876.409415 7395877.872548
+335922.143010 7395706.351928
+335942.206089 7395626.815552
+335977.013428 7395504.076576
+335995.394277 7395473.701779
+336038.472585 7395441.887229
+336070.138111 7395416.821522
+336086.556356 7395389.496203
+336117.743601 7395337.635086
+336138.713765 7395302.301139
+336158.339794 7395270.136648
+336216.475720 7395186.211024
+336182.369310 7395177.112582
+335857.632747 7395110.094062
+335656.894755 7395017.779874
+335587.263583 7395004.422162
+335344.659478 7394957.800148
+335168.849840 7394911.948002
+335228.503073 7394820.743625
+335289.929245 7394724.460117
+335280.042014 7394715.811599
+335500.150403 7394362.392136
+335608.637813 7394186.182320
+335438.781954 7394195.670694
+335375.846722 7394200.969787
+335324.555167 7394205.758966
+Region 1
+481
+325664.887603 7405456.271855
+325545.927479 7405414.878945
+325375.214012 7405273.403179
+325324.532679 7405286.450944
+325274.675968 7405281.921720
+325238.417292 7405261.515215
+325199.882656 7405207.124532
+325145.243132 7405147.694712
+325118.352174 7405098.673109
+325087.041236 7405059.099887
+325051.656660 7405018.696808
+324976.995288 7404947.249046
+324957.864033 7404905.696164
+324947.539752 7404883.210016
+324921.943452 7404833.278568
+324903.348202 7404798.954448
+324879.293947 7404768.209714
+324859.799858 7404732.095900
+324850.968145 7404701.531136
+324843.010533 7404640.351615
+324839.712040 7404625.194211
+324820.011795 7404582.021606
+324810.833741 7404562.534944
+324805.209811 7404539.278928
+324801.762887 7404516.492831
+324803.717244 7404490.837225
+324809.827701 7404463.391927
+324815.550585 7404443.565323
+324825.091473 7404417.259829
+324850.506356 7404373.817270
+324890.673746 7404322.176116
+324922.949493 7404278.263637
+324965.161947 7404294.360880
+324996.951166 7404312.427785
+325036.656767 7404316.237133
+325061.378966 7404327.725165
+325099.088979 7404353.840692
+325135.916645 7404382.235828
+325160.333734 7404397.323244
+325197.598450 7404415.070204
+325223.367921 7404405.861781
+325248.403477 7404390.224460
+325269.703491 7404354.720541
+325290.112912 7404344.962213
+325317.177041 7404353.840692
+325351.786471 7404357.830008
+325371.082651 7404360.049628
+325391.063268 7404354.720541
+325497.678784 7404348.431618
+325543.692751 7404341.852745
+325568.538644 7404344.962213
+325614.799998 7404361.549371
+325643.076322 7404363.599020
+325777.217756 7404381.405970
+325882.621077 7404389.244627
+325923.060592 7404374.857092
+325962.947609 7404341.522802
+325983.794080 7404366.528518
+325993.903959 7404364.148926
+326013.546481 7404352.830865
+326056.410387 7404326.045453
+326108.262686 7404297.770296
+326158.119396 7404269.645114
+326202.640795 7404244.569409
+326249.446401 7404221.783312
+326259.778928 7404141.317095
+326495.480938 7403846.597578
+326524.153082 7403809.313964
+326560.032432 7403765.221517
+326608.223404 7403691.404161
+326633.860935 7403661.669254
+326663.596842 7403623.725754
+326655.070240 7403576.513841
+326626.678468 7403523.252964
+326660.496260 7403486.349285
+326717.189095 7403430.558842
+326736.369828 7403293.582304
+326732.271451 7403262.817574
+326743.593526 7403111.643469
+326763.920484 7402997.782972
+326765.083203 7402981.755717
+326762.419670 7402968.408004
+326819.821682 7402834.111008
+326927.063912 7402571.326020
+326978.792516 7402586.603403
+327006.549329 7402593.992138
+327032.797081 7402587.183304
+327051.746919 7402583.373957
+327064.058541 7402573.695614
+327064.932642 7402554.358927
+327196.806362 7402561.387723
+327325.158942 7402571.935916
+327323.039661 7402595.761835
+327378.198698 7402591.292600
+327582.127982 7402568.406520
+327570.129716 7402507.167010
+327650.258339 7402500.298187
+327739.639233 7402491.329723
+327748.380238 7402488.600191
+327763.949121 7402483.900995
+327773.778628 7402476.202314
+327788.456919 7402462.054738
+327764.716021 7402423.371364
+327821.862399 7402406.664225
+327851.746739 7402411.943321
+327833.291675 7402383.808140
+327787.582818 7402253.700427
+327870.218296 7402230.844342
+327923.843533 7402213.257354
+327942.306844 7402219.416299
+327958.090129 7402207.998255
+327984.552283 7402199.229757
+328007.353111 7402197.390072
+328032.652547 7402200.789490
+328094.812633 7402214.357166
+328163.784107 7402243.342201
+328182.296894 7402228.564732
+328183.377151 7402216.366822
+328181.653688 7402197.370076
+328201.007592 7402206.728473
+328213.343953 7402224.055505
+328223.808419 7402237.933128
+328232.293791 7402257.869713
+328238.057906 7402282.325524
+328236.029333 7402320.778937
+328228.401570 7402351.143736
+328210.152662 7402387.717471
+328210.762883 7402396.156025
+328199.919089 7402417.172425
+328192.052185 7402434.799406
+328185.760311 7402448.567048
+328181.332085 7402460.035083
+328178.000608 7402474.172662
+328175.493754 7402487.880314
+328174.809317 7402502.707774
+328183.088533 7402528.173412
+328193.503522 7402542.600941
+328210.787621 7402556.938485
+328301.496158 7402640.044250
+328319.522419 7402651.332316
+328333.672950 7402656.931357
+328348.598628 7402664.820006
+328354.882256 7402667.359571
+328361.982260 7402669.659177
+328382.193772 7402671.788812
+328409.736182 7402675.238221
+328485.552026 7402682.776930
+328513.737643 7402683.316837
+328552.330002 7402676.837947
+328613.376848 7402664.620040
+328660.883382 7402651.672258
+328689.778175 7402646.493145
+328700.828124 7402646.403160
+328723.431042 7402648.982718
+328748.631523 7402648.982718
+328811.805896 7402658.481091
+328841.640758 7402670.049110
+328854.727526 7402672.848630
+328892.190152 7402697.084479
+328910.620478 7402711.801958
+328929.001326 7402719.270679
+328951.546520 7402745.796135
+328968.789389 7402756.414316
+328999.457120 7402798.337135
+329033.777932 7402837.310460
+329065.608383 7402877.103643
+329106.724089 7402922.195920
+329134.678811 7402953.100626
+329153.488463 7402968.188041
+329160.423543 7402975.756745
+329184.947833 7402990.424233
+329194.150626 7402996.063267
+329200.261083 7402997.922948
+329218.188388 7403000.442517
+329231.390604 7403008.411152
+329258.916521 7402986.344931
+329295.702956 7402978.486277
+329312.640714 7402975.006873
+329374.627630 7402976.576605
+329426.356235 7402999.122743
+329451.070188 7403010.790744
+329449.239525 7403049.304147
+329434.396310 7403139.588682
+329419.569587 7403225.204017
+329409.154598 7403320.267733
+329404.528462 7403363.310361
+329402.673060 7403380.957338
+329399.803372 7403401.103887
+329398.145880 7403488.278955
+329400.809412 7403520.773389
+329404.726372 7403545.869090
+329421.218833 7403619.036557
+329426.166571 7403645.502024
+329421.383758 7403669.727874
+329415.091884 7403718.499520
+329406.383864 7403796.496160
+329388.258649 7403840.078695
+329353.640973 7403921.024829
+329322.330035 7403989.513098
+329279.466128 7404061.120832
+329233.320222 7404134.288299
+329200.360038 7404176.311101
+329172.339346 7404293.061103
+329160.802869 7404359.999637
+329155.022262 7404393.733858
+329142.669408 7404451.843905
+329122.886701 7404542.128440
+329112.999470 7404601.278308
+329003.299864 7404667.796914
+328932.761607 7404801.993927
+328943.061149 7404891.598579
+328928.399351 7404957.547282
+328926.428502 7405021.656301
+328946.433857 7405155.573362
+328962.654193 7405198.186063
+328997.964553 7405284.421292
+329039.443093 7405364.537569
+328976.582077 7405462.050865
+328963.816912 7405575.761388
+329009.657708 7405675.744262
+329140.245016 7405808.731482
+329196.203937 7405935.089838
+329298.448951 7406044.821042
+329319.814935 7406176.418501
+329273.009330 7406255.844896
+329193.894993 7406292.578603
+329236.445543 7406403.389623
+329214.873404 7406536.046900
+329383.137740 7406646.318011
+329454.244987 7406779.715161
+329407.686769 7406899.454651
+329388.398835 7406985.509911
+329450.682615 7407025.213110
+329552.152483 7407114.557806
+329655.683909 7407211.001286
+329701.986494 7407396.059587
+329711.552122 7407558.751719
+329734.105562 7407746.859498
+329755.694194 7407912.351151
+329861.534565 7408022.562273
+329887.584407 7408032.160629
+330076.678722 7408047.857940
+330203.481011 7408095.399797
+330240.828189 7408224.747640
+330392.426894 7408356.785024
+330381.475899 7408366.823304
+330350.585519 7408387.029843
+330313.576436 7408410.475827
+330277.614624 7408428.872676
+330234.247697 7408452.768582
+330184.588896 7408467.496060
+330143.085618 7408479.274042
+330105.911610 7408489.572278
+330067.401713 7408510.218742
+330025.535600 7408537.414083
+329996.657300 7408560.160187
+329964.084689 7408602.352960
+329936.632987 7408639.026678
+329903.293477 7408682.979150
+329875.800544 7408725.461873
+329854.236651 7408756.626534
+329830.627692 7408789.030984
+329808.354623 7408812.856903
+329777.150886 7408841.152056
+329760.180144 7408869.317231
+329747.555165 7408929.626901
+329732.909859 7408952.502983
+329715.782438 7408967.020496
+329695.645143 7408975.689011
+329662.470557 7408995.885551
+329621.602238 7409025.100547
+329592.690953 7409053.165740
+329563.738437 7409087.299893
+329539.923323 7409112.625555
+329516.132948 7409135.171693
+329490.833512 7409154.918311
+329464.313634 7409168.086055
+329440.886093 7409175.724747
+329420.526150 7409179.344127
+329394.839141 7409182.403603
+329372.236223 7409180.943853
+329350.960948 7409171.155529
+329333.520170 7409158.357721
+329315.328985 7409143.280304
+329299.174619 7409127.213056
+329286.772289 7409120.034286
+329265.513506 7409108.216310
+329247.511984 7409103.007203
+329231.769930 7409100.847572
+329211.195585 7409098.897906
+329187.042375 7409101.467466
+329157.487884 7409111.825692
+329112.933500 7409124.083592
+329085.894110 7409138.511121
+329056.018016 7409159.237571
+329030.454701 7409181.253800
+329011.991391 7409204.099886
+328998.096492 7409229.265576
+328985.471513 7409253.171481
+328974.198916 7409266.469203
+328955.793329 7409281.736588
+328940.504817 7409287.415615
+328913.185055 7409305.882452
+328904.740915 7409314.151035
+328895.125810 7409325.009176
+328882.517324 7409338.446874
+328871.104540 7409355.943877
+328856.665390 7409373.140931
+328847.297672 7409389.908059
+328823.820654 7409418.083233
+328805.068725 7409434.960342
+328784.799490 7409452.077410
+328760.769974 7409474.473574
+328738.307242 7409494.030224
+328709.074354 7409516.816321
+328683.774919 7409531.083877
+328655.968629 7409542.781873
+328633.415188 7409542.451930
+328609.179516 7409535.023202
+328592.860226 7409523.935101
+328579.031297 7409515.906477
+328563.767524 7409501.798893
+328553.088655 7409486.251556
+328534.856239 7409467.314800
+328527.484109 7409451.047586
+328514.801407 7409433.960513
+328497.368875 7409411.744319
+328484.158413 7409396.156989
+328469.917173 7409381.819444
+328448.641898 7409362.572741
+328429.799261 7409350.694776
+328405.415157 7409335.947302
+328378.788078 7409318.900222
+328355.121396 7409310.641637
+328338.925799 7409300.893306
+328329.813714 7409295.254272
+328315.902323 7409286.285809
+328305.528565 7409280.626778
+328293.876641 7409275.477660
+328278.637607 7409273.567987
+328260.330975 7409275.437667
+328238.437233 7409280.806747
+328219.355455 7409284.686083
+328192.662406 7409285.715906
+328161.161805 7409283.926213
+328136.076772 7409274.607809
+328118.603009 7409266.109265
+328098.168849 7409245.202846
+328076.481263 7409221.506905
+328061.605063 7409204.189871
+328043.496340 7409177.484445
+328028.397492 7409157.127932
+328016.283779 7409145.139986
+327997.845207 7409129.052741
+327974.788746 7409120.254248
+327954.766898 7409112.495577
+327937.004518 7409108.046339
+327911.853514 7409107.326463
+327895.600194 7409106.426617
+327879.874632 7409102.497290
+327867.777411 7409088.489689
+327856.735708 7409067.913214
+327851.293196 7409047.136773
+327843.789126 7409029.879729
+327832.038248 7409002.724380
+327824.270298 7408987.237033
+327816.213731 7408977.308734
+327807.142877 7408966.100653
+327805.411169 7408959.771737
+327807.810822 7408943.864462
+327823.412690 7408929.336951
+327836.746845 7408912.009919
+327855.234894 7408884.364654
+327865.031417 7408864.977975
+327876.180320 7408833.223414
+327881.424923 7408810.267346
+327883.931777 7408778.932714
+327882.315516 7408756.166613
+327875.124803 7408731.080910
+327864.074854 7408713.034001
+327846.939186 7408691.647665
+327838.890865 7408680.459581
+327829.869489 7408662.432669
+327824.954736 7408638.616748
+327822.571575 7408616.610518
+327818.539168 7408575.867497
+327824.121866 7408541.033464
+327828.673786 7408507.699173
+327830.413740 7408477.374368
+327831.164147 7408443.260211
+327826.546258 7408413.385328
+327821.944861 7408381.240835
+327813.500721 7408353.865524
+327803.258903 7408328.489870
+327797.296878 7408308.723256
+327781.546577 7408272.429473
+327768.946337 7408257.152090
+327755.818338 7408245.154145
+327738.913565 7408228.077070
+327717.151762 7408215.239269
+327694.565337 7408210.240125
+327674.997031 7408211.079982
+327623.581783 7408223.027935
+327591.908011 7408245.894018
+327570.063746 7408265.870596
+327550.503687 7408281.797868
+327530.943628 7408301.014577
+327504.522705 7408321.241112
+327484.451380 7408333.379033
+327452.942532 7408357.904832
+327428.566675 7408384.190329
+327406.978043 7408407.196389
+327379.806713 7408439.290891
+327357.459428 7408464.066647
+327331.558017 7408497.680889
+327306.926526 7408524.726257
+327275.178538 7408557.340670
+327241.649365 7408585.655820
+327213.694643 7408603.102832
+327178.367791 7408621.819626
+327161.339324 7408627.388672
+327129.813984 7408632.207846
+327109.470533 7408632.217844
+327076.658782 7408629.968230
+327047.153768 7408627.968572
+327025.284765 7408622.919437
+327003.143636 7408610.301599
+326983.286712 7408592.384668
+326962.399010 7408566.369124
+326939.482735 7408542.383232
+326900.049260 7408529.015522
+326867.229262 7408517.667466
+326848.147484 7408514.907939
+326808.474869 7408508.109103
+326764.472982 7408504.599704
+326731.916863 7408502.850004
+326699.368991 7408501.860174
+326673.681982 7408502.630042
+326618.250820 7408503.929819
+326575.774486 7408503.699858
+326519.848550 7408517.377516
+326498.499059 7408525.476128
+326471.550377 7408535.094481
+326442.581369 7408548.492186
+326418.436405 7408561.899889
+326393.532789 7408578.846986
+326202.047067 7408619.639999
+326065.728628 7408633.267665
+326011.196305 7408599.193501
+326018.007691 7408435.601523
+326127.072338 7408203.841222
+326147.522990 7408026.621578
+326208.866700 7407863.029599
+326236.128738 7407760.787113
+326195.235680 7407651.725794
+326202.055313 7407542.664475
+326072.540015 7407113.238032
+325997.565286 7407092.791534
+325874.869620 7407079.163869
+325727.361046 7407039.950585
+325543.206223 7406979.400957
+325466.326615 7406904.283824
+325385.101243 7406884.707177
+325254.794306 7406833.875884
+325171.969166 7406768.877018
+325162.848835 7406678.852438
+325166.073111 7406627.001320
+325178.087869 7406573.330513
+325171.301221 7406602.245560
+325166.073111 7406627.001320
+325156.680654 7406585.758384
+325183.876723 7406489.574860
+325284.183872 7406381.113438
+325516.340004 7406266.063145
+325601.259687 7406208.622984
+325711.148956 7406058.758655
+325721.143388 7405941.368763
+325679.755556 7405771.437870
+325652.246131 7405634.771280
+325614.082576 7405535.638261
+325664.887603 7405456.271855
+Region 1
+290
+326424.423169 7392114.857119
+326316.323331 7392102.299270
+326277.293922 7392098.559910
+326211.192137 7392088.081705
+326121.621579 7392074.324062
+326071.138155 7392074.154091
+326040.256022 7392044.599153
+325976.306503 7391999.996793
+325910.518075 7391963.663017
+325857.791676 7391863.610155
+325833.217909 7391818.697848
+325768.270596 7391657.715423
+325707.380429 7391507.831097
+325673.076110 7391447.831374
+325622.386530 7391411.807545
+325530.078224 7391341.749545
+325473.632775 7391300.336639
+325452.110113 7391284.489353
+325437.811149 7391267.512261
+325320.937322 7391062.417392
+325256.682693 7391003.107551
+325182.771728 7390957.115429
+325162.387046 7390943.447771
+325078.588850 7390903.014696
+325052.877103 7390894.176210
+325023.569999 7390879.608706
+324976.459283 7390855.002920
+324934.692125 7390836.296125
+324856.270472 7390805.751357
+324826.740720 7390794.393302
+324759.443231 7390743.262061
+324730.647394 7390727.324791
+324674.630749 7390703.828815
+324604.001784 7390689.501269
+324555.043912 7390684.282163
+324472.581606 7390663.375744
+324440.998542 7390650.747907
+324379.390953 7390628.291754
+324334.053177 7390604.775782
+324227.858219 7390559.063612
+324117.342236 7390513.591401
+324062.075998 7390490.355381
+324000.600348 7390773.936806
+323991.463525 7390811.100441
+323962.675934 7390954.815823
+323902.519681 7390902.244828
+323730.767189 7390749.990908
+323671.996303 7390695.700208
+323611.370016 7390644.968897
+323541.103884 7390603.466006
+323508.366349 7390590.078300
+323452.580598 7390565.532504
+323398.287416 7390543.216327
+323356.017237 7390510.101999
+323314.390265 7390462.990069
+323285.462488 7390416.727993
+323273.348775 7390363.457118
+323259.107535 7390325.693586
+323243.332496 7390290.459622
+323220.878010 7390263.594223
+323201.458136 7390240.298214
+323185.757313 7390232.039628
+323123.960061 7390196.745674
+323090.249470 7390181.758241
+323059.070472 7390168.820457
+322995.706436 7390139.865417
+322925.267133 7390105.031384
+322856.872896 7390260.554744
+322798.572046 7390389.432668
+322755.221611 7390487.355895
+322739.999069 7390519.570377
+322711.079539 7390588.078642
+322690.678364 7390635.530514
+322670.310174 7390679.932908
+322641.646277 7390670.614504
+322530.198469 7390646.888569
+322444.652073 7390633.340889
+322363.896736 7390635.120584
+322317.660121 7390639.379855
+322264.521410 7390640.439673
+322148.266051 7390644.878913
+322026.708365 7390650.198002
+321933.525958 7390643.989065
+321842.132984 7390623.582561
+321789.340616 7390583.729387
+321619.608450 7390494.244715
+321555.386806 7390480.057145
+321373.722345 7390466.579454
+321220.573349 7390471.788562
+321087.479187 7390466.119533
+320954.822074 7390460.620475
+320891.309606 7390458.760793
+320707.633064 7390460.790445
+320736.816474 7390489.175583
+320761.200579 7390516.360927
+320776.398382 7390531.958255
+320793.410355 7390535.337676
+320878.437240 7390555.024304
+320898.450841 7390566.862276
+320914.242373 7390600.816460
+320924.467699 7390629.651521
+320936.968985 7390660.776190
+320951.927647 7390682.132532
+321029.780311 7390696.800019
+321064.793806 7390702.978961
+321093.548412 7390702.069117
+321154.793167 7390664.825496
+321187.712120 7390647.498464
+321202.753245 7390642.259361
+321218.750932 7390643.389168
+321227.640369 7390645.238851
+321239.036660 7390650.397967
+321251.158619 7390662.955816
+321258.398809 7390684.132189
+321263.593934 7390714.377008
+321266.686271 7390736.613200
+321272.656542 7390757.269661
+321281.240868 7390766.488082
+321293.346335 7390780.055758
+321330.042061 7390805.251442
+321344.505950 7390808.660858
+321359.769722 7390807.751014
+321380.921304 7390800.012340
+321401.042107 7390794.293319
+321427.792879 7390785.574813
+321449.109385 7390790.304003
+321469.840409 7390808.510884
+321479.067941 7390834.276471
+321477.666082 7390855.142896
+321474.466545 7390877.509065
+321474.326359 7390898.115536
+321482.547851 7390924.141078
+321492.261910 7390953.975967
+321492.187694 7390965.434005
+321483.636353 7390987.410240
+321476.536348 7390998.948264
+321453.776752 7391046.600102
+321437.366753 7391066.846634
+321431.676854 7391082.583938
+321433.589979 7391099.900972
+321439.354094 7391113.428654
+321459.549113 7391134.954967
+321485.557725 7391161.340448
+321495.082121 7391182.266863
+321498.017779 7391198.074155
+321494.109066 7391213.061588
+321477.253770 7391235.417759
+321469.337389 7391267.862201
+321466.121359 7391293.547802
+321479.496745 7391308.125305
+321510.700482 7391357.716810
+321521.280396 7391371.794399
+321537.673902 7391392.260893
+321559.443951 7391405.388644
+321591.934100 7391413.507254
+321610.479873 7391414.147144
+321628.547364 7391410.957690
+321684.077481 7391393.790631
+321748.546513 7391367.525130
+321795.014022 7391341.369610
+321817.996267 7391324.482503
+321839.955979 7391310.384918
+321869.526962 7391297.097194
+321894.447071 7391295.997382
+321907.888427 7391301.936365
+321924.850924 7391312.244599
+321926.326999 7391319.383376
+321931.818989 7391335.190669
+321933.773345 7391347.678530
+321936.412139 7391370.604603
+321937.360456 7391376.423606
+321948.121787 7391407.328312
+321976.249679 7391420.496057
+322011.279667 7391428.634663
+322040.232183 7391431.894104
+322059.759257 7391431.684140
+322075.047769 7391433.403846
+322106.507139 7391443.292152
+322127.708198 7391466.588161
+322135.740026 7391481.915536
+322139.920865 7391502.821955
+322141.363956 7391517.079513
+322150.377086 7391536.476190
+322164.189522 7391562.791683
+322169.219723 7391570.200414
+322226.712443 7391602.414896
+322368.531118 7391684.830778
+322422.972732 7391717.525178
+322482.436301 7391757.128395
+322548.703011 7391847.932841
+322556.776071 7391855.881479
+322567.908482 7391864.609984
+322581.102451 7391869.279184
+322662.278346 7391893.764990
+322692.723429 7391904.153210
+322706.420418 7391907.812584
+322718.097081 7391909.932221
+322733.360854 7391909.022376
+322766.197344 7391902.633471
+322799.091558 7391887.836005
+322866.661172 7391863.280212
+322906.746099 7391867.469494
+322776.703042 7391931.958448
+322650.156387 7391999.996793
+322563.909060 7392044.009254
+322555.448428 7392051.328001
+322549.882222 7392055.577273
+322537.908695 7392066.175458
+322529.175937 7392079.143236
+322489.643507 7392130.264480
+322473.381940 7392157.059890
+322449.302947 7392184.045268
+322409.201527 7392233.856735
+322367.079781 7392291.606843
+322301.893328 7392374.662616
+322394.119171 7392445.280520
+322405.647402 7392453.929039
+322421.793521 7392481.394334
+322426.188762 7392503.430560
+322424.720933 7392522.537287
+322415.913959 7392544.573512
+322402.678759 7392556.331498
+322419.501069 7392592.515300
+322361.060033 7392681.410073
+322272.322345 7392799.509844
+322163.966874 7392944.624987
+322253.578662 7393013.393208
+322182.619848 7393104.547594
+322113.953485 7393197.501672
+322046.054022 7393285.626577
+322094.401672 7393384.509639
+322023.187224 7393575.926851
+322053.442644 7393586.944963
+322078.090628 7393600.462648
+322102.466486 7393618.809505
+322121.762665 7393638.156191
+322145.858151 7393666.661309
+322171.487436 7393692.626861
+322189.521943 7393709.693938
+322216.957152 7393724.751359
+322267.292144 7393743.938072
+322325.782658 7393760.095304
+322370.271072 7393773.443018
+322410.224060 7393772.543172
+322433.618616 7393774.642813
+322461.342443 7393780.821754
+322483.970100 7393790.020179
+322499.473014 7393798.698692
+322826.287627 7394000.014208
+323037.861167 7394125.962635
+323080.222053 7394152.618069
+323100.408826 7394172.134726
+323124.116739 7394203.979271
+323146.868090 7394239.923114
+323165.661249 7394282.015904
+323167.590867 7394443.338271
+323163.756370 7394483.771345
+323177.948133 7394563.257730
+323222.428301 7394645.443652
+323287.581769 7394707.702988
+323473.608486 7394605.060570
+323620.498593 7394507.697247
+323764.774644 7394415.293075
+323920.364524 7394341.185769
+324082.064861 7394268.028300
+324226.274943 7394180.713256
+324355.410914 7394115.694393
+324464.236420 7394066.272859
+324528.853884 7394033.938398
+324801.466023 7393898.641573
+324955.085053 7393817.965392
+325104.440783 7393743.658120
+325259.024623 7393666.531331
+325304.519077 7393642.815393
+325328.342437 7393628.687813
+325401.313332 7393585.165268
+325557.678358 7393478.933465
+325739.614945 7393385.629447
+325824.015115 7393303.113581
+325908.184392 7393223.127282
+325962.436343 7393151.369574
+326011.122089 7393067.323970
+326027.631042 7393017.592488
+326043.702946 7392961.322127
+326078.831889 7392865.948464
+326131.203699 7392705.355972
+326219.850679 7392496.851687
+326270.564997 7392345.047689
+326339.742626 7392211.080637
+326424.423169 7392114.857119
+Region 1
+333
+330962.266170 7402191.131144
+331061.377616 7402270.787500
+331095.888091 7402291.134015
+331090.090991 7402315.249884
+331091.006323 7402346.734491
+331188.270613 7402388.417351
+331261.381694 7402416.782492
+331310.537475 7402445.847514
+331327.211354 7402452.326404
+331429.093533 7402492.159581
+331448.752547 7402630.965805
+331478.801812 7402691.455443
+331466.143848 7402754.274683
+331458.730486 7402813.554529
+331474.480787 7402871.914532
+331498.246423 7402921.656012
+331524.485929 7402976.576605
+331532.460034 7403055.783037
+331522.647020 7403107.174234
+331485.712153 7403184.620968
+331479.073937 7403196.368956
+331460.973461 7403232.442777
+331410.712685 7403265.637091
+331377.958657 7403299.421304
+331343.126579 7403364.150217
+331376.400119 7403369.349326
+331399.283409 7403374.538437
+331475.173470 7403403.653450
+331483.493917 7403408.852560
+331583.289800 7403464.992943
+331590.562976 7403467.072587
+331638.391113 7403506.575821
+331665.422257 7403518.013861
+331709.753993 7403522.123157
+331767.898166 7403538.960273
+331807.001791 7403550.838239
+331857.947004 7403562.876177
+331796.809450 7403685.145233
+331602.618965 7404094.265155
+331583.471217 7404163.593279
+331659.171615 7404302.239531
+331665.562443 7404318.656718
+331660.086946 7404335.983750
+331631.810621 7404376.116876
+331604.499105 7404415.940055
+331588.031383 7404438.146251
+331615.392376 7404483.748440
+331687.447939 7404555.806097
+331704.781516 7404578.612190
+331708.426350 7404603.237972
+331701.128436 7404621.484847
+331644.584033 7404697.181880
+331647.313535 7404731.845943
+331654.611449 7404750.092817
+331623.787039 7404819.110995
+331613.858577 7404874.261548
+331623.597376 7404951.668289
+331559.763304 7404992.721257
+331531.478733 7405046.532040
+331514.153402 7405076.636883
+331466.712837 7405114.030478
+331448.472175 7405128.627978
+331415.643931 7405155.983292
+331381.892109 7405176.049855
+331368.203366 7405189.737510
+331359.083035 7405196.126416
+331260.573564 7405250.847043
+331273.346975 7405361.218137
+331288.849889 7405477.058295
+331300.188456 7405584.699857
+331252.442780 7405661.566690
+331196.310688 7405779.746447
+331181.038669 7405828.428108
+331213.504079 7405848.474674
+331243.083309 7405875.200097
+331261.216770 7405910.524046
+331253.580760 7405949.657343
+331222.475978 7406007.887369
+331211.953788 7406017.065796
+331205.686653 7406036.152527
+331209.496411 7406069.536809
+331212.588748 7406103.351016
+331204.993969 7406133.715815
+331190.406387 7406148.723245
+331165.230645 7406151.762724
+331147.361063 7406150.782892
+331116.536653 7406155.742042
+331087.377981 7406159.841340
+331052.397471 7406171.289379
+331024.088161 7406189.456267
+331002.516022 7406224.980182
+330988.654108 7406249.076055
+330984.036219 7406268.522724
+330982.857008 7406300.067321
+330983.846556 7406320.233866
+330987.211018 7406358.497312
+331011.149825 7406398.860398
+331031.666447 7406428.215370
+331050.979119 7406454.580854
+331069.211535 7406477.496929
+331092.383443 7406506.441971
+331104.439433 7406524.968797
+331110.838508 7406554.503738
+331109.387171 7406583.388790
+331102.353136 7406599.376052
+331092.498891 7406638.689318
+331034.536135 7406679.752284
+331028.466910 7406701.088629
+331022.397684 7406716.845930
+331016.336704 7406727.014189
+331011.537398 7406737.422406
+331000.429726 7406754.699446
+330970.899974 7406803.481091
+330967.098461 7406817.958611
+330965.333768 7406827.616956
+330965.061642 7406839.814867
+330963.033070 7406854.292387
+330967.543758 7406866.740255
+330971.312285 7406876.398600
+331001.460504 7406943.467112
+331032.128236 7406991.228931
+331065.591440 7407031.632010
+331074.654048 7407037.980923
+331084.970082 7407043.569965
+331090.758936 7407046.369486
+331123.240839 7407056.777703
+331160.258168 7407066.945961
+331174.367469 7407070.755309
+331181.673629 7407072.794959
+331194.257377 7407080.673610
+331200.796638 7407086.002697
+331210.362265 7407097.690695
+331245.070650 7407142.403036
+331255.122805 7407163.239467
+331261.142554 7407180.256552
+331265.653242 7407199.823201
+331269.149644 7407218.110068
+331274.402493 7407256.993408
+331285.452442 7407284.928623
+331298.778350 7407299.416141
+331333.750615 7407338.289483
+331342.301956 7407351.497220
+331347.068277 7407362.165393
+331350.828558 7407376.142999
+331352.815900 7407393.929952
+331349.278267 7407606.333569
+331345.979775 7407626.140176
+331339.663162 7407646.466695
+331330.311936 7407667.813038
+331330.584062 7407693.118704
+331306.571038 7407711.755511
+331290.919693 7407735.391463
+331268.729086 7407758.257546
+331169.947489 7407845.912531
+331158.006947 7407856.830661
+331150.436907 7407862.169747
+331142.380340 7407864.449356
+331135.082426 7407864.199399
+331126.770225 7407861.409877
+331069.112581 7407837.523968
+331057.774013 7407834.224533
+331045.932426 7407833.464664
+331030.314065 7407833.464664
+331015.198725 7407836.004229
+331104.323985 7407868.428675
+331189.021020 7407898.183578
+331282.211673 7408020.722588
+331248.822685 7407998.686363
+331218.946591 7407983.259005
+331180.444941 7407965.991963
+331128.040145 7407938.736632
+331097.908418 7407923.049319
+331066.275877 7407904.072569
+331040.201296 7407890.444903
+331019.734151 7407874.337662
+331003.274675 7407866.109072
+330991.119731 7407860.190086
+330974.882903 7407855.500889
+330960.402522 7407855.870826
+330945.650015 7407857.010630
+330927.640248 7407852.561393
+330921.331881 7407846.432442
+330908.195636 7407835.704280
+330896.048938 7407828.015597
+330874.996311 7407822.776494
+330859.254257 7407821.116779
+330836.841002 7407827.755642
+330781.772674 7407853.821177
+330739.914807 7407879.236823
+330701.347186 7407907.721944
+330660.940656 7407944.285681
+330635.303125 7407976.420177
+330606.548519 7408017.883074
+330583.665229 7408055.606613
+330561.746748 7408100.158981
+330552.692386 7408123.085054
+330546.606668 7408157.919088
+330555.809462 7408185.564352
+330567.345938 7408206.900697
+330580.910988 7408229.766781
+330588.431550 7408243.984345
+330589.322143 7408261.441355
+330584.638284 7408277.078677
+330571.840134 7408290.866315
+330548.923859 7408296.735310
+330526.551835 7408299.064911
+330504.204550 7408295.845462
+330486.417431 7408296.195402
+330461.983849 7408301.284530
+330437.236911 7408315.992011
+330409.867672 7408341.027723
+330392.097044 7408356.515070
+330240.828189 7408224.747640
+330203.481011 7408095.399797
+330076.678722 7408047.857940
+329887.584407 7408032.160629
+329861.534565 7408022.562273
+329755.694194 7407912.351151
+329734.105562 7407746.859498
+329711.552122 7407558.751719
+329701.986494 7407396.059587
+329655.683909 7407211.001286
+329552.152483 7407114.557806
+329450.682615 7407025.213110
+329388.398835 7406985.509911
+329407.686769 7406899.454651
+329454.244987 7406779.715161
+329383.137740 7406646.318011
+329214.873404 7406536.046900
+329236.445543 7406403.389623
+329193.894993 7406292.578603
+329273.009330 7406255.844896
+329319.814935 7406176.418501
+329298.448951 7406044.821042
+329196.203937 7405935.089838
+329140.245016 7405808.731482
+329009.657708 7405675.744262
+328963.816912 7405575.761388
+328976.582077 7405462.050865
+329039.443093 7405364.537569
+328997.964553 7405284.421292
+328962.654193 7405198.186063
+328946.433857 7405155.573362
+328926.428502 7405021.656301
+328928.399351 7404957.547282
+328943.061149 7404891.598579
+328932.761607 7404801.993927
+329003.299864 7404667.796914
+329112.999470 7404601.278308
+329122.886701 7404542.128440
+329142.669408 7404451.843905
+329155.022262 7404393.733858
+329160.802869 7404359.999637
+329172.339346 7404293.061103
+329200.360038 7404176.311101
+329233.320222 7404134.288299
+329279.466128 7404061.120832
+329322.330035 7403989.513098
+329353.640973 7403921.024829
+329388.258649 7403840.078695
+329406.383864 7403796.496160
+329415.091884 7403718.499520
+329421.383758 7403669.727874
+329426.166571 7403645.502024
+329421.218833 7403619.036557
+329404.726372 7403545.869090
+329400.809412 7403520.773389
+329398.145880 7403488.278955
+329399.803372 7403401.103887
+329404.528462 7403363.310361
+329409.154598 7403320.267733
+329419.569587 7403225.204017
+329434.396310 7403139.588682
+329449.239525 7403049.304147
+329451.070188 7403010.790744
+329454.187263 7402979.256146
+329445.941033 7402943.452279
+329421.218833 7402899.869744
+329376.722172 7402867.175344
+329335.524004 7402848.498543
+329299.248836 7402832.931210
+329264.639406 7402812.694676
+329230.029975 7402780.000276
+329223.853549 7402773.411405
+329206.948776 7402745.756142
+329192.113807 7402686.606274
+329180.577330 7402650.802407
+329160.802869 7402600.990939
+329083.337779 7402507.586938
+329084.987025 7402448.437070
+329086.603286 7402389.157224
+329117.930716 7402376.709356
+329126.160454 7402362.741749
+329135.792052 7402360.532127
+329156.226211 7402247.051566
+329156.217965 7402247.021571
+329156.993111 7402153.997505
+329155.492297 7402107.145530
+329155.541774 7402107.125534
+329189.590460 7402107.985386
+329351.340275 7402129.261742
+329430.512335 7402142.879409
+329653.548135 7402175.233867
+329742.937275 7402188.001680
+329759.108134 7402184.592264
+329766.768882 7402176.933576
+329799.118845 7402159.056638
+329825.506783 7402146.288825
+329845.091581 7402142.029555
+329873.178242 7402139.479992
+329902.122512 7402135.220721
+329940.426253 7402113.084513
+330000.879370 7402067.122386
+330065.571050 7402024.559676
+330100.477344 7402014.341427
+330136.233000 7402010.932011
+330175.386103 7402007.532593
+330210.251166 7402002.603437
+330245.413094 7402048.075648
+330311.721034 7402142.179529
+330356.531052 7402131.481362
+330393.309240 7402119.443424
+330422.072093 7402102.726287
+330476.241582 7402053.904650
+330495.636716 7402025.819461
+330573.868707 7401959.580807
+330672.856459 7402025.149575
+330738.397500 7402065.942588
+330778.523659 7402094.027777
+330810.626235 7402116.773881
+330885.526748 7402164.925633
+330924.127353 7402187.021848
+330962.266170 7402191.131144
+Region 1
+127
+334118.939754 7394231.104625
+334111.889227 7394211.348009
+334096.361575 7394194.420908
+334017.346193 7394184.542600
+333978.968235 7394169.455185
+333964.380653 7394155.307608
+333961.288317 7394149.568591
+333956.423041 7394117.764039
+333992.211682 7393973.488752
+334002.890550 7393905.390417
+334024.149333 7393748.137353
+334141.328270 7393692.396901
+334231.410094 7393644.665077
+334198.021106 7393539.693057
+334176.102625 7393464.365960
+334149.797149 7393365.672865
+334209.607060 7393348.105874
+334240.538671 7393340.567166
+334277.960066 7393343.586649
+334294.394804 7393193.372379
+334304.578899 7393170.236342
+334333.853017 7393138.121843
+334342.288911 7393124.054252
+334345.405986 7393111.826347
+334356.241534 7393021.411834
+334358.921558 7392996.776054
+334409.743078 7392986.947738
+334358.781373 7392719.923476
+334329.218636 7392548.722802
+334302.781220 7392415.995537
+334278.537302 7392277.169316
+334242.493028 7392080.962925
+334230.239129 7391999.996793
+334222.240286 7391954.644562
+334214.373381 7391904.213200
+334190.368604 7391790.992594
+334185.717730 7391763.807250
+334171.220856 7391678.751820
+334144.321652 7391529.517382
+334217.572919 7391529.127449
+334304.100617 7391534.196581
+334386.538185 7391537.016098
+334443.264006 7391537.536009
+334499.981580 7391540.285538
+334563.617742 7391541.795279
+334698.187980 7391544.164873
+334778.341342 7391546.504472
+334822.499907 7391510.330669
+334894.209128 7391456.909819
+334903.997404 7391469.507661
+334905.861052 7391477.356317
+334905.960007 7391487.764534
+334902.026555 7391501.762136
+334890.811681 7391525.448079
+334847.098413 7391607.554015
+334865.289598 7391646.467350
+334874.360451 7391663.644407
+334885.171260 7391677.002119
+334901.540028 7391686.240537
+334921.998926 7391696.968699
+334934.788829 7391704.217458
+334945.830532 7391715.535519
+334957.688612 7391731.682753
+334975.203606 7391752.839129
+334998.062157 7391775.465254
+335051.027697 7391808.749552
+335095.936669 7391848.702709
+335131.799526 7391900.913765
+335124.600567 7391919.510580
+335123.462587 7391929.908799
+335125.375712 7391941.556804
+335128.715436 7391953.004843
+335133.490003 7391964.352899
+335140.713701 7391975.401006
+335150.172128 7391988.018845
+335163.267142 7391999.996793
+335195.567627 7392012.104719
+335214.830822 7392024.232642
+335229.756500 7392036.180595
+335243.783338 7392054.467463
+335252.499604 7392076.163747
+335256.556749 7392092.071022
+335259.409945 7392112.057598
+335258.939910 7392131.334296
+335254.198327 7392154.470333
+335246.397393 7392176.896492
+335307.592671 7392254.153259
+335402.069735 7392293.756475
+335448.933064 7392484.923730
+335459.991259 7392506.380054
+335471.016470 7392580.877294
+335479.048298 7392610.312252
+335492.431931 7392630.838736
+335515.620331 7392649.565528
+335540.639395 7392658.573985
+335572.511077 7392680.160287
+335750.646151 7392752.307929
+335792.231892 7392676.400931
+335876.599078 7392587.426172
+335911.480634 7392640.397099
+335951.697500 7392658.344024
+336000.003920 7392682.359911
+336050.833685 7392702.986378
+336198.878264 7392779.573259
+336232.209528 7392797.680157
+336250.375974 7392774.524124
+336259.067502 7392764.955763
+336272.104792 7392762.346210
+336290.370193 7392770.174869
+336313.838965 7392782.352783
+335608.637813 7394186.182320
+335438.781954 7394195.670694
+335375.846722 7394200.969787
+335324.555167 7394205.758966
+335270.806236 7394210.308187
+335245.176951 7394213.087711
+335209.413049 7394215.857237
+334973.941933 7394238.813304
+334784.418814 7394253.730749
+334636.819531 7394264.608886
+334542.111572 7394267.818336
+334486.037204 7394270.827821
+334405.347837 7394276.366872
+334284.911638 7394282.485824
+334135.778557 7394293.573924
+334091.554022 7394278.196558
+334118.939754 7394231.104625
+Region 1
+215
+331327.862806 7384686.289565
+331319.187771 7384674.861523
+331315.105887 7384666.223002
+331312.293922 7384658.094395
+331311.007510 7384651.225571
+331309.960239 7384636.988010
+331303.058144 7384620.990750
+331291.595883 7384608.292925
+331279.366723 7384600.934186
+331264.102950 7384595.865054
+331246.546725 7384589.776097
+331238.152063 7384588.776268
+331226.871219 7384589.316176
+331173.559338 7384590.615953
+331133.119823 7384587.996402
+331110.673583 7384591.295837
+331079.643017 7384582.057419
+331049.931848 7384570.169455
+331023.527418 7384556.961718
+331008.667710 7384541.744324
+330981.554104 7384515.108887
+330926.329097 7384461.768024
+330852.599549 7384391.310092
+330808.572923 7384437.992096
+330766.442931 7384484.554121
+330734.257893 7384542.284232
+330714.483432 7384580.217734
+330709.007934 7384634.318467
+330708.381221 7384657.404513
+330698.221865 7384683.809990
+330675.157158 7384710.995333
+330663.686651 7384736.620944
+330647.441576 7384758.967116
+330612.906363 7384789.441896
+330570.256858 7384819.246791
+330425.832374 7384829.315066
+330392.863944 7384795.100927
+330310.863426 7384688.119252
+330249.181621 7384620.310867
+330175.551028 7384554.312172
+330143.192819 7384521.797741
+330124.597569 7384506.320392
+330057.093924 7384449.200176
+330057.069186 7384440.811613
+330059.328653 7384425.564225
+329971.028015 7384398.708825
+329906.138426 7384377.682427
+329922.787566 7384308.784228
+329743.159924 7384265.761598
+329707.280574 7384257.922940
+329689.732595 7384253.363721
+329671.912491 7384245.495069
+329654.587160 7384233.317155
+329634.210724 7384217.579851
+329618.930459 7384204.892024
+329603.641947 7384188.894764
+329591.643682 7384166.528596
+329579.769110 7384127.995196
+329502.007155 7384108.668506
+329479.610392 7384100.059981
+329437.092827 7384158.389990
+329418.192466 7384185.275384
+329325.240955 7384299.225866
+329294.177404 7384337.399327
+329237.336136 7384404.307866
+329207.138439 7384433.322896
+329185.698240 7384455.779050
+329163.969422 7384467.667013
+329141.663368 7384482.744431
+329115.720726 7384500.771343
+329067.719418 7384537.415066
+329045.223700 7384559.041362
+329029.423923 7384586.256700
+328985.356066 7384745.199474
+328971.403444 7384809.698426
+328955.578927 7384871.227887
+328935.524094 7384944.955258
+328879.532188 7385055.116388
+328846.736929 7385106.097656
+328806.643755 7385165.677450
+328750.503417 7385241.284500
+328667.909171 7385322.490590
+328566.142439 7385405.706336
+328512.203844 7385445.219567
+328429.551874 7385503.209634
+328387.248711 7385548.991792
+328337.119875 7385595.063900
+328313.519163 7385621.769326
+328175.370061 7385781.361989
+328138.723812 7385865.967497
+328098.490452 7385935.395605
+328019.277161 7386040.087672
+327884.583229 7386123.873320
+327894.701354 7386139.360667
+327991.000836 7386281.996235
+328025.865899 7386341.556033
+328128.993260 7386509.677235
+328178.379935 7386588.683702
+328211.430827 7386641.564644
+328241.199720 7386687.776729
+328296.738083 7386789.989220
+328306.880947 7386804.066809
+328330.729046 7386841.340424
+328374.046496 7386909.598732
+328382.738023 7386930.095222
+328389.293776 7386938.503781
+328421.676724 7386987.615369
+328439.076271 7387008.751748
+328457.770475 7387042.865905
+328513.836598 7387125.711714
+328526.074004 7387145.348351
+328577.736639 7387228.914037
+328638.033077 7387326.757277
+328666.828915 7387377.298620
+328702.716511 7387423.980623
+328760.959638 7387523.133639
+328788.295892 7387567.316071
+328803.435972 7387598.610711
+328813.446896 7387623.056524
+328817.396840 7387632.704871
+328849.491170 7387736.157150
+328887.242414 7387852.937147
+328910.711186 7387936.482836
+328923.113517 7387969.287217
+328929.636285 7387999.342069
+328960.468942 7388116.581987
+328983.261523 7388096.585412
+329006.243768 7388077.138743
+329034.149013 7388047.893753
+329066.350543 7387999.981960
+329136.212609 7387890.930639
+329174.508105 7387845.418435
+329225.700704 7387805.805220
+329274.023616 7387773.140816
+329328.267321 7387745.315582
+329406.383864 7387707.422073
+329432.969712 7387693.814403
+329464.725946 7387678.197079
+329557.446563 7387656.030875
+329605.571565 7387620.936887
+329652.805975 7387578.354181
+329740.587100 7387502.307207
+329829.761838 7387433.409008
+329924.271887 7387362.961076
+329956.506403 7387349.743340
+329998.760089 7387334.725912
+330042.836192 7387321.478181
+330169.918852 7387293.382994
+330213.376488 7387275.576044
+330273.763635 7387267.907357
+330296.300583 7387258.418983
+330329.516400 7387242.991625
+330386.456623 7387212.146909
+330400.697863 7387206.217924
+330438.663509 7387188.420973
+330461.398367 7387176.463021
+330497.970400 7387158.766052
+330537.898649 7387136.099935
+330579.360696 7387112.563966
+330604.651886 7387098.216424
+330661.105581 7387069.981260
+330713.328959 7387041.756095
+330829.064806 7386983.886008
+330867.178885 7386966.948909
+330923.632580 7386938.713745
+331030.907794 7386882.263415
+331124.057215 7386818.744295
+331217.528240 7386677.328518
+331248.616529 7386628.186936
+331281.733392 7386579.725237
+331296.337466 7386507.677578
+331401.534630 7386315.070570
+331420.063911 7386283.825922
+331425.654855 7386259.310121
+331437.958231 7386236.634005
+331477.391706 7386135.751286
+331520.890573 7386027.819773
+331532.583728 7386000.004538
+331574.952861 7385925.147360
+331633.352666 7385827.404103
+331652.566384 7385819.065531
+331678.756412 7385816.755927
+331707.486280 7385817.225846
+331739.778519 7385812.116721
+331764.690382 7385802.938293
+331796.702249 7385789.180650
+331839.137352 7385769.574008
+331875.989757 7385756.566236
+331915.142860 7385752.456940
+331944.647873 7385754.706555
+331959.268440 7385691.917310
+331875.239350 7385635.317005
+331795.292144 7385585.325568
+331762.966920 7385558.640139
+331778.214200 7385532.784568
+331747.678408 7385525.655789
+331744.511855 7385501.759882
+331743.893388 7385443.299896
+331745.888976 7385424.493118
+331750.680036 7385406.686168
+331756.510121 7385393.208476
+331761.573307 7385382.030391
+331765.869593 7385372.871960
+331778.750205 7385263.280732
+331758.992237 7385236.125383
+331803.101324 7385161.358190
+331709.770486 7385139.571922
+331677.387538 7385122.604828
+331693.220301 7385024.471638
+331657.398675 7384938.176419
+331594.347995 7384798.100413
+331582.094097 7384771.934895
+331544.103712 7384721.903465
+331394.616043 7384702.736748
+331327.862806 7384686.289565
+Region 1
+286
+325879.528740 7381254.317431
+325957.455620 7381110.702031
+326015.063787 7381010.379215
+326026.781681 7380969.316249
+326080.019346 7380893.309268
+326145.007889 7380773.469796
+326208.272971 7380669.007689
+326278.835967 7380552.007730
+326364.720459 7380407.382503
+326385.385513 7380376.507792
+326428.035018 7380327.926113
+326445.434564 7380311.208977
+326561.021979 7380179.021619
+326675.685817 7380053.003205
+326748.689696 7379969.697475
+326793.458483 7379907.108196
+326813.216451 7379879.312957
+326880.777819 7379773.461088
+326932.621871 7379685.686123
+326984.548385 7379590.942352
+326999.944098 7379561.767349
+326999.952344 7379561.767349
+327025.037378 7379514.225493
+327068.429044 7379424.920790
+327118.442432 7379338.095662
+327157.546058 7379281.435368
+327203.477563 7379218.856087
+327252.311741 7379143.678964
+327404.899993 7378894.401663
+327454.839165 7378812.035772
+327465.369602 7378792.669089
+327530.655010 7378682.148020
+327583.430886 7378590.603701
+327727.129701 7378367.911846
+327782.272246 7378289.275316
+327831.972278 7378213.318327
+327931.957824 7378116.364934
+328011.014438 7378053.305735
+328064.953032 7378021.691151
+328171.106759 7377971.119813
+328187.252879 7378037.428455
+328188.184703 7378053.835644
+328195.507356 7378089.689503
+328196.736044 7378124.263581
+328230.710515 7378149.259299
+328258.830161 7378151.468921
+328286.982792 7378151.248958
+328300.580827 7378156.838001
+328307.416952 7378165.116583
+328324.173293 7378179.934045
+328332.724634 7378198.860803
+328346.718487 7378222.726715
+328355.764602 7378234.354723
+328383.133842 7378282.746434
+328416.209473 7378349.924927
+328417.710287 7378369.661546
+328414.312840 7378389.548140
+328409.505287 7378398.796556
+328398.422353 7378413.404054
+328390.712128 7378427.481642
+328385.698420 7378446.148445
+328385.046967 7378466.624937
+328390.621419 7378477.992990
+328403.716434 7378492.210555
+328413.818066 7378500.419149
+328442.943753 7378512.947003
+328472.316826 7378521.705503
+328488.825780 7378522.565355
+328509.655759 7378520.925636
+328526.445084 7378515.476570
+328546.376224 7378512.057155
+328572.285880 7378511.257292
+328591.755231 7378512.377100
+328610.045371 7378518.236097
+328626.034812 7378520.635686
+328645.594871 7378522.535360
+328665.699181 7378521.665509
+328679.214753 7378517.166280
+328690.396642 7378511.427263
+328728.040685 7378501.908894
+328749.959166 7378503.048698
+328761.561612 7378505.068352
+328773.254767 7378508.197816
+328783.348154 7378517.396241
+328800.525052 7378530.893929
+328818.765714 7378540.852223
+328834.647955 7378552.010312
+328870.923123 7378589.313922
+328900.725001 7378613.589764
+328964.707504 7378690.456597
+329001.518678 7378733.069298
+329024.212305 7378754.705592
+329041.653083 7378763.444095
+329060.998740 7378766.773525
+329094.552652 7378767.053477
+329130.844313 7378768.253271
+329156.011809 7378770.432898
+329180.371175 7378771.832658
+329197.844937 7378778.011600
+329217.050408 7378792.529113
+329239.323477 7378806.856659
+329248.955075 7378811.955785
+329260.574014 7378820.844263
+329270.164380 7378829.482783
+329275.912003 7378835.311785
+329282.401786 7378847.239742
+329296.321424 7378860.467476
+329317.217372 7378876.654703
+329332.406929 7378888.252716
+329343.770235 7378901.890380
+329345.526682 7378908.999163
+329349.756998 7378921.896953
+329351.983481 7378932.005222
+329359.809153 7378938.174165
+329365.828902 7378942.913354
+329377.728213 7378946.262780
+329385.809519 7378952.891644
+329396.933684 7378961.110237
+329425.746014 7378982.936498
+329443.681565 7378992.674830
+329467.562649 7379000.703455
+329481.193669 7379008.162177
+329507.993918 7379022.659694
+329528.254907 7379034.637642
+329548.235524 7379052.934508
+329626.954041 7379150.877731
+329661.192391 7379206.098272
+329689.740842 7379269.147473
+329721.101257 7379307.260944
+329733.487095 7379341.785030
+329779.665987 7379409.203482
+329742.797090 7379405.704082
+329694.820520 7379402.474635
+329696.733645 7379593.821859
+329733.231462 7379677.157584
+329742.764105 7379707.312419
+329744.339135 7379733.497934
+329737.197899 7379777.150456
+329718.940744 7379843.019174
+329713.927036 7379883.322270
+329718.083136 7379921.505730
+329737.049467 7379963.918465
+329753.863531 7380006.511169
+329760.600702 7380050.693601
+329761.870621 7380082.318184
+329758.852501 7380112.962935
+329754.292335 7380135.069148
+329696.923308 7380173.192618
+329683.721093 7380175.482226
+329676.357209 7380182.341051
+329659.271019 7380257.218225
+329658.133040 7380306.869720
+329664.779501 7380404.852937
+329661.489255 7380461.653207
+329662.767421 7380489.858376
+329679.103204 7380580.032930
+329686.821676 7380620.795947
+329697.112972 7380660.899078
+329732.217176 7380843.877736
+329710.142016 7380875.142380
+329687.547344 7380892.679376
+329650.488784 7380917.065199
+329620.794107 7380932.072629
+329614.964022 7380936.901801
+329607.847525 7380941.221062
+329602.767847 7380946.040236
+329600.236254 7380952.649104
+329601.003154 7380959.008015
+329642.671357 7381039.574214
+329646.992382 7381044.913300
+329655.106673 7381055.841428
+329670.856973 7381068.289296
+329693.971158 7381077.947641
+329726.222166 7381088.115900
+329775.081083 7381096.814410
+329824.731637 7381105.662894
+329874.118313 7381130.918568
+329902.592547 7381164.902747
+329837.521541 7381215.983997
+329802.120473 7381234.770779
+329767.659475 7381263.465864
+329744.660738 7381286.411933
+329687.522606 7381362.958822
+329568.009985 7381399.402579
+329550.725885 7381403.341904
+329542.347715 7381403.531872
+329530.662806 7381406.751320
+329513.601355 7381414.489995
+329438.206068 7381454.573129
+329408.412437 7381469.850512
+329391.837513 7381480.388707
+329366.092781 7381497.975694
+329359.883369 7381514.702829
+329357.541440 7381523.071396
+329356.147827 7381539.818527
+329352.222621 7381556.555660
+329344.768029 7381569.973362
+329325.842929 7381590.649820
+329308.261966 7381601.697928
+329261.398637 7381625.233896
+329247.182135 7381627.153567
+329239.306985 7381627.353533
+329230.417548 7381629.313198
+329222.278519 7381631.292858
+329083.642889 7381717.128156
+329049.239615 7381736.944761
+328991.911819 7381769.789135
+328883.399670 7381828.159137
+328829.213689 7381990.991245
+328826.179076 7381999.999702
+328820.992197 7382012.417575
+328781.410290 7382150.953845
+328751.567181 7382256.175822
+328741.119207 7382316.055565
+328737.020830 7382404.470420
+328732.996669 7382451.392383
+328728.857062 7382520.550537
+328726.721288 7382559.933791
+328721.237545 7382631.551523
+328718.722444 7382658.206957
+328716.998982 7382680.053215
+328707.870405 7382793.563772
+328704.299787 7382847.684502
+328692.433461 7383035.912260
+328691.707793 7383059.538213
+328689.101984 7383095.602036
+328691.946933 7383172.638840
+328699.376787 7383193.295302
+328723.958801 7383228.089342
+328673.046573 7383210.022436
+328636.491032 7383208.842638
+328582.552438 7383233.858353
+328576.499704 7383239.557377
+328545.056827 7383269.132311
+328488.908242 7383300.047016
+328432.767904 7383315.324399
+328402.867072 7383323.223046
+328346.932889 7383334.361138
+328248.423418 7383356.857285
+328155.051348 7383375.564081
+328109.260030 7383384.292585
+328069.216334 7383385.992294
+328042.449069 7383379.913336
+328011.806076 7383355.327547
+327999.997474 7383347.198939
+327927.282212 7383286.069410
+327811.620581 7383190.605762
+327745.650735 7383142.234048
+327693.617020 7383109.169712
+327666.833263 7383082.854219
+327554.593818 7383012.766225
+327458.129411 7382945.517744
+327405.493721 7382905.344625
+327378.330637 7382888.947434
+327277.800840 7382820.989074
+327180.528303 7382767.468242
+326932.926982 7382626.382409
+326804.425969 7382556.034459
+326755.286681 7382529.538997
+326669.756777 7382480.637373
+326665.419259 7382478.457747
+326647.788818 7382470.839052
+326564.427673 7382431.355815
+326508.947033 7382405.470249
+326423.458360 7382375.945306
+326316.141914 7382347.000264
+326243.286466 7382331.292955
+326198.039399 7382307.826974
+326137.462588 7382245.847591
+326083.862089 7382197.585858
+326039.142780 7382157.762679
+325970.863991 7382108.621096
+325902.032703 7382037.573266
+325874.432569 7382009.048152
+325833.869361 7381960.826412
+325819.331256 7381952.747796
+325775.716942 7381892.528111
+325723.848152 7381832.018476
+325675.096436 7381885.109382
+325574.863503 7381821.520274
+325612.095234 7381743.983556
+325652.963553 7381670.716106
+325703.438731 7381579.161788
+325759.694516 7381481.598500
+325804.496287 7381395.073321
+325879.528740 7381254.317431
+Region 1
+578
+321543.207123 7387086.988347
+321457.932852 7387072.140890
+321409.791358 7387175.963107
+321404.431308 7387191.660418
+321405.429102 7387203.348416
+321378.373219 7387312.749676
+321346.419075 7387518.064508
+321356.900034 7387580.773766
+321356.908280 7387580.773766
+321356.900034 7387580.793763
+321356.908280 7387580.823758
+321356.891788 7387580.823758
+321345.033708 7387624.826220
+321252.956297 7387801.076030
+321227.549660 7387861.845621
+321226.189032 7387856.726498
+321225.801459 7387846.208300
+321224.548032 7387832.230694
+321224.943851 7387816.623367
+321223.352329 7387804.855383
+321220.944430 7387801.176013
+321214.891696 7387795.456993
+321203.932456 7387790.667813
+321192.123853 7387787.638332
+321183.110723 7387782.099281
+321174.584121 7387778.119963
+321161.406644 7387770.651242
+321149.482595 7387761.422823
+321125.675727 7387738.206799
+321114.972119 7387728.768416
+321104.763286 7387721.109728
+321091.618794 7387710.651519
+321078.680458 7387700.743217
+321057.199028 7387687.525481
+321040.871491 7387679.236900
+321039.873697 7387679.106923
+321028.650577 7387677.427210
+321006.979483 7387679.596839
+320987.031851 7387683.776123
+320970.019877 7387689.105210
+320947.252034 7387697.913701
+320936.903015 7387701.663059
+320929.728794 7387704.012657
+320924.096619 7387705.382422
+320914.176403 7387707.032139
+320907.562926 7387705.732362
+320899.003339 7387704.192626
+320884.621913 7387694.924213
+320872.706109 7387684.815945
+320861.854070 7387670.948320
+320846.878915 7387651.711615
+320835.218745 7387637.394068
+320822.321640 7387623.826392
+320807.948460 7387614.128053
+320791.126150 7387604.399719
+320768.176890 7387594.591399
+320740.749926 7387583.953222
+320715.203104 7387570.455534
+320685.854769 7387557.917681
+320661.924208 7387545.319839
+320648.276696 7387534.971612
+320634.134410 7387522.833691
+320620.552869 7387506.716452
+320599.401287 7387475.661771
+320581.210102 7387452.735698
+320567.133786 7387435.728611
+320555.028320 7387424.060610
+320543.607290 7387414.942172
+320532.697527 7387405.723751
+320521.713548 7387394.625652
+320504.734559 7387380.908001
+320481.777053 7387363.341010
+320467.016300 7387352.422881
+320457.747537 7387342.224628
+320441.518955 7387325.967412
+320426.890142 7387312.269759
+320413.531248 7387303.131324
+320405.235540 7387296.942384
+320400.914515 7387291.463322
+320398.951912 7387285.124408
+320397.170727 7387272.366594
+320395.711144 7387249.860449
+320394.589656 7387233.453259
+320394.070144 7387225.914550
+320391.340642 7387190.660589
+320388.685355 7387179.542494
+320387.539129 7387175.553177
+320380.381401 7387160.065830
+320371.508457 7387143.348693
+320364.820764 7387123.172149
+320358.743292 7387102.315722
+320352.970930 7387073.670628
+320345.714247 7387041.566128
+320337.459770 7387015.550584
+320334.581836 7387009.201671
+320329.683575 7387002.942743
+320326.145942 7386998.353530
+320311.533621 7386982.996160
+320290.439763 7386963.469505
+320271.943468 7386949.281935
+320260.910011 7386942.053173
+320244.582475 7386933.324668
+320238.018475 7386927.595650
+320222.969104 7386915.227768
+320203.433784 7386901.590104
+320179.198112 7386881.013629
+320154.517144 7386862.876735
+320138.024682 7386851.158743
+320125.803768 7386841.260438
+320113.690056 7386830.372303
+320103.720363 7386819.164223
+320098.426283 7386810.135770
+320092.497243 7386794.438458
+320086.263093 7386778.641164
+320078.412681 7386761.044178
+320070.743686 7386745.766795
+320060.345190 7386728.029834
+320048.833452 7386710.272875
+320038.401970 7386695.525401
+320022.956780 7386673.079246
+320010.208107 7386655.862195
+320000.254907 7386644.214190
+319989.040033 7386634.995769
+319969.348034 7386617.918695
+319957.226075 7386608.020390
+319934.359278 7386591.573207
+319930.516534 7386587.963826
+319920.942661 7386578.995362
+319914.428138 7386569.387008
+319908.705254 7386553.149789
+319901.629988 7386531.573485
+319894.315582 7386511.986840
+319887.941245 7386490.870457
+319883.562497 7386482.061966
+319877.039729 7386473.123497
+319871.209643 7386466.184685
+319858.411494 7386452.617009
+319845.316479 7386438.499427
+319825.649219 7386419.762637
+319808.101240 7386403.155482
+319790.643970 7386386.768289
+319775.792509 7386374.840332
+319768.049298 7386365.551923
+319762.746972 7386356.623452
+319758.120836 7386351.034409
+319749.635465 7386344.285565
+319729.242537 7386325.978701
+319713.228357 7386309.381544
+319703.778176 7386297.523575
+319697.791413 7386286.485466
+319688.860745 7386274.417533
+319677.777811 7386254.230991
+319667.032973 7386231.834827
+319657.871410 7386213.887901
+319647.819255 7386193.051471
+319639.267914 7386174.554639
+319631.269070 7386161.496876
+319626.708905 7386150.478763
+319621.480795 7386136.011241
+319617.019584 7386125.553032
+319608.394027 7386113.145158
+319605.103780 7386104.366661
+319599.405635 7386088.999294
+319590.408997 7386074.051854
+319586.492038 7386065.673289
+319583.943953 7386060.014259
+319572.382737 7386037.498115
+319562.907818 7386019.881133
+319556.500497 7386001.854221
+319547.083302 7385979.478054
+319534.598508 7385957.501818
+319521.198384 7385943.264257
+319507.352962 7385924.377492
+319493.532280 7385903.161126
+319481.698939 7385894.262650
+319466.377442 7385887.543801
+319409.082632 7385866.227452
+319382.340106 7385858.038855
+319368.766810 7385850.440157
+319346.864822 7385838.432214
+319316.337276 7385823.544764
+319285.199509 7385807.877447
+319262.456405 7385798.399071
+319223.930015 7385786.511107
+319211.651378 7385781.152025
+319206.382036 7385777.982568
+319199.422218 7385771.363702
+319193.410715 7385762.545212
+319179.260184 7385734.450025
+319170.634626 7385722.492073
+319159.213597 7385713.603596
+319143.488035 7385705.984901
+319118.609157 7385696.486528
+319092.311928 7385685.638386
+319080.066275 7385677.619759
+319066.064176 7385670.470984
+319037.227107 7385659.142924
+319010.492827 7385650.504404
+318997.274120 7385646.905020
+318980.270392 7385635.736933
+318952.488841 7385604.372306
+318937.711596 7385589.764808
+318923.420878 7385576.157139
+318892.810870 7385560.509819
+318839.746375 7385519.006928
+318816.087940 7385502.549747
+318798.539961 7385494.471131
+318778.889193 7385482.373203
+318774.180596 7385475.334409
+318769.513229 7385464.756221
+318756.063627 7385414.304863
+318748.411125 7385389.289148
+318737.402407 7385355.474940
+318729.411809 7385325.250117
+318723.532247 7385305.903431
+318714.552102 7385277.788247
+318703.881479 7385244.403965
+318695.338384 7385217.498574
+318685.995405 7385189.753326
+318673.263225 7385163.277861
+318668.595858 7385144.501078
+318667.474371 7385128.093888
+318669.214326 7385111.286767
+318677.691451 7385094.439653
+318683.208179 7385077.562544
+318688.469274 7385064.674751
+318689.871133 7385050.067253
+318688.395058 7385037.749363
+318683.208179 7385028.270987
+318669.049401 7385017.572819
+318651.229297 7385006.274755
+318638.571333 7384998.586072
+318620.644027 7384988.067873
+318606.105923 7384975.260067
+318573.261186 7384957.793059
+318562.978136 7384947.804770
+318543.154198 7384933.487222
+318515.364401 7384919.849558
+318495.235352 7384905.761972
+318484.589468 7384899.862982
+318472.492247 7384888.414943
+318449.303847 7384857.560228
+318434.955405 7384845.862232
+318422.231472 7384843.152696
+318408.072694 7384841.313011
+318387.119021 7384836.073908
+318372.910766 7384829.355059
+318365.637591 7384823.726024
+318359.114822 7384814.567592
+318348.073119 7384800.250045
+318337.773577 7384791.371566
+318320.440000 7384773.764581
+318298.191670 7384765.735957
+318287.339631 7384760.836796
+318273.527194 7384755.567698
+318259.772482 7384753.957974
+318244.879789 7384752.998139
+318226.597896 7384754.427894
+318211.870128 7384757.457375
+318195.831209 7384758.917125
+318172.271728 7384757.847308
+318153.000287 7384756.167596
+318137.307710 7384754.757837
+318098.146361 7384744.299629
+318073.861212 7384736.460971
+318056.420434 7384727.162564
+318043.366651 7384718.694015
+318034.485460 7384710.825362
+318016.121105 7384693.988246
+317990.730961 7384676.501242
+317978.881127 7384669.042519
+317962.471128 7384659.094223
+317949.417345 7384650.395713
+317936.610949 7384638.607733
+317928.043115 7384629.969212
+317925.833125 7384619.091076
+317920.761693 7384600.304294
+317916.737533 7384587.406503
+317912.614418 7384574.288750
+317908.400594 7384560.611093
+317903.254946 7384547.363362
+317900.723353 7384538.024962
+317893.648087 7384528.336621
+317891.990595 7384526.067010
+317873.923103 7384510.229723
+317858.461421 7384506.600344
+317838.670467 7384506.130425
+317815.086248 7384507.380211
+317802.114927 7384508.000105
+317785.375079 7384508.560009
+317770.705034 7384506.720324
+317754.822794 7384495.662218
+317739.723946 7384486.943711
+317725.095133 7384473.695981
+317714.325555 7384461.488072
+317697.800109 7384445.110877
+317685.158638 7384435.872459
+317670.933890 7384414.536114
+317660.419946 7384398.568849
+317646.896127 7384378.792237
+317636.093565 7384369.013912
+317628.094722 7384364.374706
+317617.704471 7384362.804975
+317608.881004 7384358.705677
+317601.088316 7384345.207989
+317596.132332 7384333.519991
+317591.201086 7384320.162279
+317583.268212 7384301.345503
+317574.782840 7384286.178101
+317569.365067 7384270.930712
+317561.646595 7384251.893973
+317551.083174 7384223.518834
+317549.137063 7384207.651552
+317550.967726 7384183.865626
+317554.596068 7384171.057820
+317554.431143 7384159.649774
+317551.850073 7384137.683536
+317548.493857 7384120.476484
+317543.801752 7384103.799340
+317538.342747 7384091.881382
+317528.645180 7384075.924115
+317522.641924 7384066.435741
+317512.936111 7384051.248342
+317497.614614 7384036.210918
+317478.747238 7384018.803899
+317479.868726 7384010.735282
+317483.002293 7383997.147609
+317486.902760 7383986.569421
+317490.300207 7383976.311178
+317491.124831 7383967.232733
+317490.258976 7383955.374764
+317486.490449 7383946.686253
+317477.081500 7383931.728815
+317468.505420 7383923.870161
+317447.881597 7383908.982711
+317428.634895 7383897.894610
+317412.645453 7383878.857871
+317385.680279 7383856.371723
+317350.155518 7383833.775593
+317323.256313 7383813.829010
+317300.158621 7383792.602646
+317273.696467 7383770.896364
+317251.283212 7383751.789637
+317226.099224 7383734.082670
+317173.496518 7383697.978854
+317164.219509 7383680.471853
+317156.905102 7383653.576460
+317154.777575 7383636.379405
+317156.047494 7383616.452819
+317157.902896 7383598.865831
+317161.910564 7383580.418991
+317168.713705 7383558.352771
+317177.025905 7383538.746129
+317188.298503 7383502.002423
+317193.081316 7383478.576435
+317194.450191 7383467.408348
+317193.930678 7383443.702409
+317192.652512 7383423.525865
+317190.648678 7383412.087824
+317221.110254 7383420.606365
+317238.122228 7383429.594826
+317262.333161 7383442.092685
+317280.309944 7383465.178730
+317294.922265 7383484.015504
+317304.100319 7383511.180851
+317309.913912 7383533.716990
+317316.873731 7383555.513257
+317326.142494 7383575.049910
+317336.120433 7383599.165780
+317349.941116 7383619.912226
+317366.062497 7383639.918799
+317388.673661 7383658.105684
+317412.826871 7383674.042954
+317440.097155 7383684.681132
+317463.986485 7383691.839905
+317489.038534 7383697.498936
+317511.591975 7383689.800255
+317546.028234 7383675.022786
+317598.482507 7383650.576973
+317655.216574 7383617.812586
+317678.174080 7383608.974100
+317699.630772 7383597.066139
+317713.319515 7383597.626043
+317780.468571 7383493.423892
+317803.079736 7383480.766060
+317830.383006 7383458.659847
+317874.129259 7383429.914771
+318064.023459 7383350.338402
+318091.763778 7383349.308578
+318114.869717 7383352.717994
+318153.758940 7383347.518884
+318181.548738 7383347.118953
+318220.998705 7383326.242529
+318242.546106 7383315.654343
+318266.996180 7383303.666396
+318315.112935 7383290.968571
+318344.354069 7383275.421234
+318351.091240 7383263.373298
+318359.609596 7383257.084375
+318372.251068 7383253.944913
+318427.838908 7383254.834760
+318451.043801 7383255.764601
+318474.792946 7383250.185557
+318490.510261 7383245.586345
+318504.363929 7383239.417401
+318527.403897 7383231.178812
+318560.792885 7383202.573712
+318611.721606 7383154.102015
+318650.280980 7383117.658258
+318638.406408 7383137.614839
+318631.133233 7383156.891537
+318619.440078 7383203.153613
+318645.910478 7383228.929198
+318660.761939 7383246.046266
+318688.551737 7383281.010277
+318683.488551 7383320.183567
+318672.380878 7383391.631328
+318734.763613 7383361.396507
+318776.308123 7383342.899676
+318883.072071 7383280.820309
+318902.821794 7383271.801854
+318961.386524 7383258.654106
+319005.973893 7383257.764259
+319035.379951 7383254.244861
+319056.119221 7383246.706153
+319065.602387 7383231.288794
+319096.773139 7383199.964159
+319115.558052 7383194.285132
+319137.047729 7383169.989294
+319161.778175 7383137.004944
+319171.739621 7383117.008369
+319182.261812 7383089.413096
+319252.132124 7383064.687331
+319310.498944 7383043.151020
+319350.039620 7383029.563347
+319418.318410 7383007.857065
+319466.369196 7382988.360405
+319527.011976 7382967.633955
+319590.029671 7382942.368283
+319632.184402 7382928.940583
+319663.083028 7382888.377531
+319759.440233 7382766.218456
+319834.546902 7382684.862392
+319892.963200 7382645.219182
+319903.378189 7382649.358473
+319936.989825 7382703.859138
+319955.733508 7382731.344430
+319988.751415 7382775.836808
+320020.153061 7382810.670842
+320075.336837 7382869.280802
+320109.278322 7382905.144659
+320122.818633 7382940.868540
+320137.348491 7382962.194887
+320163.670460 7382986.670694
+320214.236346 7383026.993788
+320234.002561 7383053.659220
+320266.913267 7383119.857881
+320289.268799 7383135.205252
+320345.714247 7383150.632609
+320386.739245 7383174.838463
+320423.888514 7383215.791448
+320452.923492 7383285.199559
+320477.901325 7383319.733644
+320507.513539 7383343.419587
+320534.486959 7383364.735935
+320549.371406 7383373.664406
+320616.033934 7383404.389143
+320645.728611 7383420.486386
+320655.863228 7383426.485358
+320665.857660 7383435.133877
+320674.400755 7383445.542094
+320676.618991 7383455.650363
+320675.876830 7383465.178730
+320658.378329 7383503.932092
+320642.116762 7383548.734418
+320635.849626 7383562.911990
+320638.224541 7383590.747222
+320646.347078 7383619.092366
+320657.281580 7383642.378378
+320664.925836 7383667.943999
+320676.635483 7383686.250863
+320687.132935 7383703.987825
+320700.632014 7383718.005423
+320717.248169 7383736.372277
+320730.813219 7383744.510883
+320749.441454 7383756.378850
+320760.293493 7383761.717936
+320778.971206 7383770.026513
+320797.846827 7383786.323721
+320808.426741 7383797.301841
+320820.952766 7383807.760049
+320842.401212 7383822.647499
+320865.935954 7383830.506153
+320866.900763 7383841.424283
+320896.191374 7383846.343440
+320918.637614 7383854.372065
+320949.008481 7383865.490161
+320976.806525 7383870.599286
+321018.862301 7383877.318135
+321049.439325 7383888.656193
+321116.423456 7383877.238148
+321181.494462 7383864.760286
+321192.907245 7383863.060577
+321200.815381 7383858.611339
+321215.262777 7383854.032123
+321225.636535 7383856.811647
+321244.388463 7383890.785828
+321257.310307 7383911.702245
+321281.455270 7383931.048931
+321298.879555 7383941.117206
+321320.212554 7383942.956891
+321345.479005 7383943.796747
+321371.908174 7383943.786749
+321388.103771 7383945.976374
+321409.098674 7383948.225989
+321424.073829 7383950.405615
+321441.407406 7383959.364081
+321458.056546 7383966.332887
+321484.032172 7383986.469438
+321503.567492 7383999.227253
+321516.431612 7384007.255877
+321533.113737 7384019.523776
+321547.305500 7384027.342437
+321560.433499 7384038.360550
+321575.590071 7384050.838412
+321584.108427 7384063.126307
+321600.765813 7384077.953768
+321620.029008 7384088.272000
+321649.204172 7384096.930517
+321689.676672 7384124.675765
+321715.751253 7384145.592182
+321732.367408 7384163.739073
+321761.146753 7384188.014915
+321778.942119 7384218.029774
+321789.068490 7384249.274422
+321797.677555 7384296.126397
+321817.715895 7384401.698313
+321833.012653 7384506.790312
+321851.096637 7384497.921831
+321867.737530 7384529.656395
+321898.446493 7384550.382845
+321941.747450 7384561.300975
+321954.042580 7384565.580242
+321976.859900 7384633.218656
+322034.385605 7384701.326989
+322125.201344 7384858.750024
+322220.560755 7385007.084616
+322371.928565 7385215.968836
+322408.022316 7385220.378081
+322088.893190 7385746.477965
+322097.964044 7385784.491453
+322104.338380 7385809.067244
+322109.747907 7385838.232248
+322109.046978 7385866.187459
+322097.048712 7385906.460561
+322062.323835 7385914.719146
+322027.970038 7386004.003853
+321844.450175 7386404.245295
+321822.226583 7386502.288501
+321813.032036 7386538.512296
+321808.950152 7386551.170128
+321801.800670 7386578.775399
+321797.463153 7386594.482709
+321790.833183 7386610.429977
+321750.566839 7386691.686059
+321746.237568 7386700.044627
+321737.323393 7386713.962243
+321728.673097 7386722.050858
+321711.356012 7386736.198434
+321698.368199 7386748.836270
+321690.987823 7386758.204665
+321685.380386 7386768.832844
+321677.233110 7386786.299852
+321670.586648 7386806.806340
+321667.791176 7386817.204559
+321626.221927 7386921.266734
+321565.908996 7386955.840812
+321543.207123 7387086.988347
+Region 1
+710
+344711.082834 7398740.002291
+344699.521619 7398749.370687
+344675.154007 7398767.177637
+344652.979893 7398780.615335
+344634.541321 7398790.923569
+344539.132433 7398820.058579
+344507.648324 7398832.396465
+344469.410553 7398849.453543
+344406.829908 7398855.422521
+344349.543344 7398858.022076
+344305.582688 7398853.902781
+344287.680122 7398852.972941
+344241.427014 7398836.045840
+344193.747308 7398807.740688
+344128.057835 7398779.385545
+344058.146292 7398746.641154
+344040.268464 7398737.702685
+344017.987148 7398732.753533
+344000.043350 7398728.764216
+343924.037843 7398706.408046
+343900.197990 7398703.428556
+343776.776656 7398684.621778
+343715.977197 7398692.660401
+343696.046058 7398695.239959
+343640.812805 7398699.719192
+343640.713850 7398699.619209
+343600.967018 7398702.488717
+343566.613221 7398708.417702
+343506.193089 7398710.787296
+343425.643909 7398697.749529
+343367.837832 7398680.862422
+343324.553367 7398669.794317
+343276.246948 7398659.726042
+343202.773033 7398657.716386
+343178.059080 7398660.265950
+343144.513413 7398662.995482
+343119.106777 7398666.524877
+343095.893637 7398670.854136
+343063.147856 7398678.512824
+343015.542366 7398691.340627
+342935.281803 7398717.186200
+342862.080014 7398740.742165
+342862.063521 7398740.742165
+342793.421897 7398764.678065
+342768.204924 7398769.087309
+342733.430569 7398779.655499
+342673.125885 7398790.763596
+342613.959180 7398772.106792
+342584.965433 7398767.987498
+342562.717102 7398764.678065
+342541.161456 7398759.678921
+342521.799306 7398752.500151
+342492.574665 7398739.952300
+342468.380224 7398728.444271
+342444.317723 7398719.375825
+342419.331644 7398712.507001
+342395.895856 7398705.008286
+342366.151703 7398703.788495
+342327.130539 7398701.078959
+342279.508557 7398694.730046
+342169.973875 7398679.362678
+342170.831483 7398728.284299
+342169.363654 7398743.261733
+342169.998614 7398793.143189
+342177.139850 7398817.748974
+342189.039161 7398833.616256
+342186.656000 7398856.632314
+342188.198045 7398878.498568
+342200.138587 7398900.304833
+342190.630683 7398928.050081
+342173.956805 7398970.112876
+342138.250626 7399028.042953
+342128.726230 7399070.895612
+342106.510884 7399119.307320
+342093.811689 7399138.354057
+342072.866263 7399177.477356
+342046.989592 7399247.865299
+341967.751561 7399255.064066
+341887.713647 7399259.963227
+341881.916546 7399258.973396
+341827.021389 7399255.743950
+341800.468526 7399248.495191
+341780.355970 7399240.116626
+341764.036679 7399233.257801
+341746.587655 7399222.979562
+341724.966039 7399208.132105
+341704.762774 7399202.033150
+341679.356137 7399230.608255
+341680.955906 7399273.460915
+341661.857635 7399330.811091
+341657.503626 7399363.895424
+341647.138114 7399411.967190
+341641.942988 7399436.522984
+341635.189326 7399466.237894
+341564.848978 7399726.383333
+341571.800551 7399727.123207
+341608.586985 7399727.123207
+341635.461451 7399726.293349
+341661.082490 7399720.504340
+341689.193890 7399712.245755
+341711.104125 7399701.497596
+341735.075917 7399683.720641
+341751.197298 7399663.884039
+341764.424252 7399638.248430
+341775.581402 7399612.622819
+341790.465849 7399586.587279
+341804.929737 7399569.640182
+341821.463430 7399555.992520
+341835.523253 7399549.383652
+341858.670422 7399548.553794
+341895.827938 7399550.573448
+341931.047589 7399553.083018
+341962.416250 7399564.261103
+341987.633223 7399570.460042
+342009.131147 7399582.857918
+342020.288297 7399602.294589
+342027.726397 7399623.370978
+342033.515251 7399651.896092
+342039.716416 7399668.843189
+342049.224320 7399683.310711
+342063.275897 7399699.018021
+342085.598443 7399715.965118
+342126.524486 7399743.660374
+342152.557836 7399764.326834
+342195.553683 7399809.789047
+342218.288541 7399840.793736
+342224.481460 7399849.472249
+342236.059168 7399878.817223
+342250.943614 7399912.301487
+342258.381714 7399934.627663
+342259.206337 7399958.603556
+342255.487287 7399977.610300
+342244.742449 7399992.497750
+342229.858002 7400004.895627
+342211.675064 7400025.152157
+342180.256925 7400063.175644
+342166.617660 7400077.233236
+342158.759002 7400086.321679
+342144.295113 7400114.436863
+342129.410667 7400140.062474
+342113.289286 7400163.618439
+342110.815417 7400170.647235
+342111.227728 7400178.915819
+342114.122155 7400186.764474
+342123.217748 7400193.793270
+342133.137963 7400202.061854
+342139.330882 7400210.330438
+342141.812998 7400223.558172
+342139.842149 7400249.223775
+342137.442496 7400277.458939
+342139.842149 7400302.094719
+342142.843777 7400328.520193
+342147.049354 7400361.564532
+342151.254932 7400403.017432
+342159.064112 7400425.843522
+342167.475268 7400434.262080
+342192.106759 7400447.469818
+342228.159279 7400455.888376
+342257.598322 7400456.488273
+342276.218311 7400452.878891
+342290.038994 7400440.860950
+342309.260957 7400420.444447
+342322.479665 7400415.635271
+342333.892448 7400414.435476
+342344.109528 7400419.834551
+342362.127542 7400439.061258
+342372.344622 7400449.879405
+342387.361008 7400460.687554
+342407.786921 7400471.505701
+342418.004001 7400479.314363
+342424.007257 7400488.922717
+342431.222709 7400511.758806
+342437.225964 7400529.775719
+342450.444672 7400553.811602
+342466.665008 7400572.428413
+342495.502076 7400591.055223
+342514.130311 7400598.863885
+342526.747044 7400602.473267
+342557.381791 7400601.873370
+342586.218860 7400598.863885
+342602.439195 7400598.263988
+342621.669405 7400600.063680
+342633.684163 7400604.872856
+342639.093691 7400616.890797
+342641.493344 7400636.107506
+342639.687419 7400677.560405
+342637.889741 7400708.205156
+342639.687419 7400762.275894
+342635.481842 7400779.692911
+342627.070686 7400812.137353
+342612.054300 7400845.771592
+342602.439195 7400875.216549
+342598.835593 7400895.043152
+342599.437568 7400915.459655
+342607.246748 7400963.521423
+342618.659531 7401009.183601
+342628.274636 7401030.210000
+342639.687419 7401045.227427
+342658.315654 7401062.654442
+342700.371431 7401092.089400
+342738.221629 7401114.915490
+342784.474737 7401149.159625
+342824.130860 7401185.803348
+342848.160376 7401211.638922
+342878.803369 7401233.865115
+342908.836141 7401250.082337
+342949.696214 7401264.499868
+342993.549669 7401280.127191
+343028.991968 7401298.144105
+343056.633333 7401317.970709
+343073.455644 7401332.388239
+343088.472030 7401357.024019
+343090.871683 7401387.658772
+343087.870055 7401407.485376
+343078.856925 7401428.511774
+343056.633333 7401447.138583
+343025.388365 7401466.355292
+343015.781507 7401478.973131
+343007.964080 7401493.390661
+343002.562799 7401512.017470
+343000.756874 7401543.252120
+343007.370351 7401577.496254
+343020.580813 7401619.549051
+343034.401495 7401659.802156
+343047.620203 7401707.863924
+343060.236936 7401730.090116
+343076.457272 7401741.508161
+343097.485160 7401748.716926
+343122.718626 7401751.116515
+343143.144539 7401748.716926
+343158.762900 7401742.707955
+343174.983236 7401728.890322
+343193.611471 7401705.464335
+343205.024254 7401685.637731
+343218.844936 7401661.001951
+343239.872824 7401629.767301
+343263.300366 7401597.922756
+343289.135806 7401576.896357
+343308.959745 7401566.688106
+343361.224355 7401558.879443
+343423.104069 7401559.479341
+343449.541485 7401566.688106
+343468.161474 7401581.705533
+343481.380181 7401607.541108
+343490.393312 7401633.366684
+343493.394940 7401656.802670
+343493.996914 7401704.864437
+343500.008416 7401801.577871
+343503.010044 7401848.439844
+343509.021547 7401880.284390
+343515.626777 7401913.928627
+343518.026430 7401946.363071
+343515.024802 7401987.216073
+343507.817597 7402021.460207
+343504.815969 7402055.704342
+343508.419572 7402085.139300
+343518.026430 7402106.165698
+343536.052691 7402118.183640
+343567.891387 7402124.792508
+343595.532752 7402125.992302
+343611.753088 7402121.783023
+343624.369821 7402113.374463
+343632.179001 7402100.756625
+343635.180629 7402083.939505
+343638.784232 7402049.695371
+343640.590157 7402001.633604
+343644.795734 7401971.598748
+343654.402593 7401950.572350
+343667.621301 7401930.745746
+343689.853138 7401911.519039
+343707.879399 7401900.110993
+343727.703337 7401895.301817
+343741.515773 7401893.502125
+343753.538778 7401895.301817
+343764.349586 7401906.719861
+343831.638828 7401976.407924
+343939.177922 7402086.938991
+344066.540954 7402214.907072
+344112.802308 7402264.768531
+344141.037402 7402295.403283
+344162.667265 7402320.039064
+344173.478073 7402335.056491
+344183.093178 7402353.073405
+344187.900731 7402372.300112
+344192.708283 7402394.526305
+344196.913861 7402411.953319
+344202.315142 7402431.180026
+344204.121067 7402457.005602
+344204.723041 7402483.441074
+344202.315142 7402511.076341
+344199.915489 7402533.902431
+344198.109564 7402551.329446
+344199.313514 7402561.537697
+344200.517464 7402568.146565
+344205.918745 7402577.764917
+344216.135825 7402590.382756
+344231.754185 7402606.000081
+344247.974521 7402630.025966
+344258.191601 7402643.243702
+344262.999153 7402658.261129
+344263.592882 7402679.887425
+344269.604384 7402697.314440
+344284.620770 7402706.322897
+344303.850980 7402710.532176
+344328.482471 7402716.541146
+344360.321167 7402728.549089
+344393.363814 7402731.558574
+344411.992049 7402732.758368
+344437.819243 7402735.757855
+344481.680944 7402739.367236
+344515.927540 7402742.966620
+344572.397727 7402745.376207
+344617.455131 7402742.366723
+344651.701727 7402736.357752
+344685.346348 7402733.958163
+344728.597828 7402730.358779
+344746.624088 7402732.158471
+344782.668362 7402738.767339
+344797.091020 7402741.766825
+344850.559579 7402736.967647
+344865.295594 7402724.359807
+344873.014065 7402716.391172
+344888.244853 7402695.914679
+345233.275390 7402956.939968
+345193.058523 7402947.101653
+345178.116353 7402944.642075
+345160.922962 7402939.882890
+345137.322250 7402940.592768
+345115.131643 7402949.131306
+345104.139418 7402955.800163
+345094.598529 7402967.528155
+345094.474836 7402974.866897
+345094.474836 7402983.275457
+345097.476464 7403000.092577
+345101.080066 7403013.310312
+345112.501096 7403037.346195
+345135.928637 7403067.980948
+345157.558500 7403087.807552
+345176.780464 7403095.016317
+345206.821482 7403100.425390
+345236.260525 7403111.833436
+345254.880514 7403122.651583
+345266.895272 7403140.068600
+345271.702825 7403166.504072
+345277.112352 7403210.356560
+345286.125482 7403233.792546
+345292.730713 7403244.600695
+345301.141868 7403248.809973
+345316.760229 7403251.809460
+345344.401594 7403251.809460
+345384.049471 7403254.818944
+345417.694092 7403259.618122
+345432.710478 7403264.427298
+345456.739994 7403272.235961
+345471.764626 7403275.245445
+345489.782640 7403280.644521
+345513.820403 7403288.463181
+345524.029236 7403294.462154
+345542.055496 7403314.288758
+345556.469908 7403329.306185
+345573.292218 7403350.932481
+345591.318478 7403371.968877
+345624.963099 7403398.394351
+345648.992616 7403417.021160
+345682.035262 7403430.238896
+345708.472677 7403440.447148
+345733.104168 7403457.274265
+345748.120554 7403462.683339
+345767.342518 7403465.082928
+345790.176330 7403465.682825
+345813.603872 7403466.282722
+345831.630132 7403462.073443
+345855.057673 7403456.074471
+345878.493461 7403454.264781
+345896.511475 7403454.264781
+345919.947262 7403457.274265
+345933.157724 7403459.673854
+345943.374803 7403461.473546
+345955.991536 7403459.073957
+345968.006294 7403454.264781
+345984.828605 7403441.646942
+346001.650915 7403421.830337
+346017.269276 7403402.003733
+346037.093215 7403367.159701
+346052.719822 7403319.097934
+346056.925399 7403302.880712
+346056.925399 7403284.853800
+346048.415289 7403270.736218
+346040.028873 7403251.209562
+346018.473226 7403218.775118
+345989.636157 7403189.930059
+345962.003038 7403173.712837
+345932.563995 7403162.904688
+345896.511475 7403159.295307
+345847.248493 7403159.295307
+345834.631760 7403158.695409
+345811.204219 7403153.286336
+345784.164828 7403139.468703
+345771.548095 7403131.660040
+345758.337634 7403123.251481
+345751.724157 7403116.042715
+345746.916604 7403105.824466
+345742.117298 7403084.198170
+345742.117298 7403061.372080
+345748.722529 7403042.745271
+345759.533337 7403025.328254
+345779.365522 7403015.709901
+345793.779933 7403011.510621
+345819.013399 7403010.910723
+345847.248493 7403022.918667
+345864.672778 7403034.936608
+345881.495089 7403050.553933
+345891.703922 7403058.372594
+345905.524605 7403060.172285
+345919.345287 7403052.363623
+345927.154468 7403040.345682
+345940.975150 7403013.910210
+345954.787587 7402990.484222
+345968.006294 7402964.048751
+345977.019424 7402943.022352
+345982.428952 7402926.205233
+345983.624655 7402916.586880
+345980.021052 7402902.769247
+345984.226630 7402879.343260
+345988.432208 7402858.916759
+345997.445338 7402825.872419
+346009.460096 7402801.246637
+346023.882753 7402782.019930
+346071.339811 7402732.158471
+346115.201511 7402689.505777
+346140.426731 7402669.679173
+346172.273674 7402657.661232
+346207.113998 7402655.261643
+346259.988829 7402660.670716
+346293.031475 7402678.687630
+346324.870172 7402709.332381
+346357.310843 7402754.384664
+346397.560695 7402789.228696
+346445.627973 7402815.664167
+346543.551962 7402860.116553
+346582.004136 7402882.342746
+346630.665143 7402915.387086
+346673.924869 7402955.640191
+346710.571118 7403003.102061
+346740.010161 7403042.745271
+346752.626894 7403071.580331
+346760.436075 7403090.207141
+346776.656410 7403110.033745
+346795.878374 7403124.451275
+346812.247142 7403130.840181
+346841.826371 7403136.389230
+346854.772953 7403133.299759
+346871.405600 7403125.911025
+346905.297608 7403108.044085
+346944.739330 7403088.317464
+346973.700092 7403070.450525
+346989.013342 7403062.161945
+346935.882878 7402984.025329
+346861.947174 7402859.056735
+346762.027597 7402689.865716
+347215.157971 7402074.291158
+347188.506154 7402012.081814
+347156.741673 7401983.296744
+347122.132243 7401962.220355
+347087.267180 7401945.363242
+347034.812907 7401930.305821
+346994.736226 7401923.017070
+346958.197178 7401920.647476
+346934.217139 7401918.737803
+346887.452765 7401916.918115
+346817.640177 7401919.517669
+346754.177186 7401918.497844
+346715.048821 7401916.208236
+346686.566340 7401913.638676
+346667.971090 7401910.409229
+346629.288022 7401900.130990
+346597.078245 7401889.152870
+346570.566614 7401878.234741
+346544.450801 7401865.396940
+346519.868788 7401850.309524
+346501.339508 7401836.801838
+346490.017433 7401825.613754
+346476.872941 7401812.186054
+346458.393138 7401792.169483
+346440.366878 7401767.683677
+346429.127266 7401748.117029
+346417.912392 7401726.730692
+346404.141187 7401695.696008
+346388.506334 7401652.203458
+346368.888551 7401589.584184
+346354.911190 7401543.482081
+346372.335475 7401526.514987
+346384.119339 7401517.086602
+346395.342459 7401511.677529
+346412.115292 7401509.367924
+346433.769894 7401501.559262
+346452.315666 7401499.019697
+346469.946108 7401488.401516
+346487.535318 7401480.802817
+346509.371336 7401479.303074
+346535.577857 7401472.064314
+346593.787999 7401461.686092
+346615.879651 7401459.436477
+346634.755273 7401450.597991
+346661.324628 7401435.290613
+346686.896190 7401417.963581
+346705.268792 7401408.865139
+346742.121196 7401381.849767
+346746.912256 7401378.450349
+346775.633878 7401358.573754
+346793.206595 7401352.984711
+346821.779784 7401345.316025
+346843.211738 7401329.328763
+346872.749736 7401313.901406
+346911.507020 7401287.935853
+346938.035144 7401268.709147
+346982.902885 7401240.274018
+346995.412417 7401229.005948
+347011.476074 7401218.777700
+347019.969692 7401202.700454
+347028.488048 7401182.073987
+347031.176319 7401161.407527
+347032.850304 7401140.991024
+347032.701872 7401127.653308
+347033.559480 7401112.485906
+347031.926726 7401093.309191
+347031.836018 7401070.853038
+347033.551234 7401043.877658
+347035.043801 7401013.112928
+347038.086660 7400978.328886
+347043.438464 7400940.275405
+347051.783650 7400917.669277
+347064.787955 7400874.576658
+347069.661478 7400855.069999
+347077.792261 7400830.684177
+347093.237451 7400790.041138
+347110.307148 7400760.776151
+347133.066745 7400731.511164
+347145.262920 7400712.804368
+347167.206140 7400684.359241
+347225.746131 7400607.942330
+347254.203873 7400570.548735
+347272.271365 7400600.053681
+347283.766610 7400583.896449
+347317.988467 7400524.996538
+347336.501255 7400493.521929
+347352.111370 7400475.295051
+347365.536233 7400460.267626
+347379.686765 7400445.910085
+347393.598156 7400434.202090
+347407.171452 7400425.593565
+347423.309325 7400415.795243
+347426.286214 7400412.705772
+347448.361374 7400394.018973
+347459.279383 7400385.050510
+347468.160574 7400375.392164
+347481.123648 7400353.485916
+347485.337472 7400334.759124
+347485.881723 7400294.965940
+347467.987403 7400231.886745
+347468.276021 7400207.520919
+347468.309006 7400173.246790
+347470.939553 7400144.341741
+347471.236418 7400109.617689
+347475.829568 7400054.527125
+347481.948271 7399989.488266
+347490.788231 7399982.369485
+347492.371507 7399914.221158
+347475.252332 7399819.187437
+347456.558127 7399727.183196
+347424.521521 7399637.278596
+347438.474143 7399605.913969
+347363.408706 7399595.775705
+347318.780105 7399595.775705
+347288.343268 7399585.627443
+347236.746603 7399566.990636
+347211.249258 7399527.797349
+347186.898139 7399507.510824
+347166.612411 7399501.421867
+347142.261292 7399501.421867
+347114.801344 7399510.090382
+347083.432683 7399501.421867
+347040.824409 7399491.273605
+346998.216135 7399485.184648
+346949.522143 7399491.273605
+346921.122125 7399497.362562
+346905.660443 7399484.014849
+346897.405966 7399486.764378
+346887.337318 7399482.185162
+346841.364582 7399443.821734
+346832.128804 7399436.403004
+346812.181172 7399411.907200
+346795.680464 7399395.020093
+346779.641546 7399380.922508
+346756.972658 7399370.254335
+346736.761146 7399364.675291
+346715.164268 7399363.775445
+346687.844506 7399362.975582
+346651.800232 7399365.235195
+346617.504159 7399369.794414
+346599.815994 7399376.633242
+346554.255570 7399394.880117
+346526.267863 7399401.009067
+346518.186557 7399402.728772
+346503.813377 7399405.388317
+346491.163659 7399406.008211
+346473.203369 7399404.288505
+346452.579546 7399400.859093
+346431.650612 7399398.509495
+346412.123538 7399395.390029
+346377.876942 7399388.391228
+346345.114668 7399380.862518
+346327.616167 7399375.233482
+346321.217092 7399371.484124
+346311.684449 7399363.365515
+346300.279912 7399354.926960
+346284.661551 7399343.678887
+346274.823798 7399338.989690
+346267.171296 7399337.739904
+346259.980583 7399337.120011
+346249.870704 7399338.449783
+346234.054434 7399340.089502
+346225.461861 7399340.089502
+346217.025967 7399338.209824
+346209.686822 7399335.870225
+346186.721070 7399321.022768
+346175.629890 7399311.804347
+346154.387599 7399293.847423
+346150.017097 7399290.557986
+346144.079811 7399288.848279
+346122.054129 7399283.849135
+346107.210914 7399281.659510
+346082.686624 7399277.440233
+346043.954079 7399270.411437
+346026.768934 7399268.531759
+346014.894362 7399267.911865
+346005.840001 7399270.251465
+345993.495393 7399274.630714
+345975.221746 7399280.559699
+345965.540671 7399282.279404
+345959.446707 7399281.969457
+345935.392452 7399278.060127
+345916.178735 7399274.160795
+345900.708806 7399269.781545
+345888.372445 7399264.782401
+345884.463732 7399259.943230
+345879.301591 7399251.854616
+345868.688692 7399234.787539
+345859.939442 7399229.948368
+345839.480543 7399223.079545
+345828.702720 7399219.790108
+345809.332324 7399216.830615
+345746.380599 7399205.582542
+345728.890344 7399201.833184
+345714.987199 7399197.923854
+345708.579878 7399194.644415
+345687.650945 7399178.397198
+345660.628047 7399157.310810
+345649.380188 7399150.431989
+345624.855898 7399136.684343
+345612.667970 7399130.275441
+345594.394322 7399124.496431
+345571.898605 7399116.687769
+345548.471064 7399107.939267
+345527.698809 7399102.470204
+345517.391021 7399100.750499
+345504.576378 7399101.540363
+345495.522017 7399102.630177
+345488.958017 7399105.129748
+345478.336872 7399109.658973
+345472.712943 7399110.438839
+345465.687154 7399108.719134
+345449.442080 7399101.850310
+345434.285508 7399094.821514
+345417.257042 7399088.572584
+345388.988963 7399079.044217
+345383.810330 7399077.164539
+345316.042807 7399048.729409
+345302.923054 7399043.580291
+345292.607019 7399039.830933
+345222.002793 7399013.425457
+345199.977111 7399003.897089
+345159.991138 7398989.839497
+345134.840135 7398972.812413
+345105.945343 7398954.845491
+345071.269943 7398928.909933
+345037.526367 7398901.414643
+345028.158649 7398895.485659
+345019.096041 7398891.576328
+345000.195681 7398886.577184
+344991.603108 7398883.607693
+344986.135857 7398880.798174
+344963.483462 7398867.670423
+344937.870669 7398855.332536
+344912.406309 7398841.894838
+344901.001772 7398834.396123
+344893.819305 7398827.057380
+344880.229517 7398811.590029
+344860.083976 7398790.973561
+344852.109871 7398781.755140
+344843.368866 7398774.566371
+344825.086973 7398764.568084
+344809.938647 7398758.479127
+344792.283467 7398753.789930
+344756.832922 7398747.381028
+344745.428385 7398745.821295
+344739.449868 7398744.001606
+344729.801778 7398741.132098
+344723.559381 7398740.512204
+344711.082834 7398740.002291
+Region 1
+606
+319663.083028 7382888.377531
+319759.440233 7382766.218456
+319834.546902 7382684.862392
+319892.963200 7382645.219182
+319903.378189 7382649.358473
+319936.989825 7382703.859138
+319955.733508 7382731.344430
+319988.751415 7382775.836808
+320020.153061 7382810.670842
+320075.336837 7382869.280802
+320109.278322 7382905.144659
+320122.818633 7382940.868540
+320137.348491 7382962.194887
+320163.670460 7382986.670694
+320214.236346 7383026.993788
+320234.002561 7383053.659220
+320266.913267 7383119.857881
+320289.268799 7383135.205252
+320345.714247 7383150.632609
+320386.739245 7383174.838463
+320423.888514 7383215.791448
+320452.923492 7383285.199559
+320477.901325 7383319.733644
+320507.513539 7383343.419587
+320534.486959 7383364.735935
+320549.371406 7383373.664406
+320616.033934 7383404.389143
+320645.728611 7383420.486386
+320655.863228 7383426.485358
+320665.857660 7383435.133877
+320674.400755 7383445.542094
+320676.618991 7383455.650363
+320675.876830 7383465.178730
+320658.378329 7383503.932092
+320642.116762 7383548.734418
+320635.849626 7383562.911990
+320638.224541 7383590.747222
+320687.718417 7383585.908051
+320748.649815 7383586.048027
+320869.811682 7383587.047855
+321023.843025 7383594.726540
+321065.065932 7383592.166978
+321131.044023 7383583.028544
+321225.537580 7383548.284495
+321241.790901 7383541.465663
+321241.840378 7383525.508396
+321235.193916 7383501.942433
+321229.141183 7383471.627626
+321223.830610 7383447.091829
+321207.123747 7383386.852147
+321193.228848 7383354.447698
+321162.288991 7383272.211784
+321147.503499 7383233.668386
+321024.337798 7382972.973041
+321031.734667 7382962.804783
+321018.656146 7382946.517572
+321010.294468 7382930.870253
+320994.082378 7382905.194651
+320986.669017 7382885.158083
+320971.957741 7382853.743464
+320961.575737 7382835.016671
+320946.757261 7382812.120593
+320937.537975 7382798.382946
+320926.050975 7382778.636329
+320915.932850 7382755.370314
+320903.415072 7382735.833661
+320890.179872 7382717.276839
+320878.231084 7382693.430924
+320862.018994 7382667.315397
+320853.822241 7382645.279172
+320845.757428 7382620.703381
+320843.844302 7382602.516497
+320847.810739 7382586.619220
+320850.564980 7382561.723484
+320854.127352 7382537.287670
+320850.457779 7382521.080446
+320844.479262 7382509.372451
+320839.102719 7382498.234359
+320826.189122 7382486.776322
+320814.669138 7382477.767865
+320797.797350 7382464.050215
+320785.254833 7382455.031759
+320767.014171 7382445.283429
+320752.789423 7382432.265659
+320737.476173 7382416.008444
+320731.745043 7382400.881035
+320724.587314 7382385.393688
+320715.640154 7382366.566913
+320721.544455 7382351.019576
+320734.886857 7382336.232109
+320740.123213 7382325.223994
+320744.980243 7382312.096243
+320747.701499 7382298.068646
+320745.293600 7382286.410643
+320742.407419 7382272.742984
+320737.261771 7382251.306656
+320725.947942 7382217.052523
+320720.291028 7382196.386063
+320717.660481 7382177.849238
+320712.547818 7382153.643385
+320704.656175 7382132.167063
+320692.963020 7382111.870540
+320680.742106 7382093.993602
+320675.085192 7382086.444895
+320656.407479 7382064.788605
+320644.640108 7382051.350906
+320630.860657 7382035.233667
+320611.539738 7382013.397407
+320597.479915 7381995.050550
+320583.733449 7381976.503727
+320573.277228 7381955.987241
+320564.577455 7381941.479726
+320554.434591 7381920.203371
+320537.315416 7381901.936500
+320525.300658 7381891.488289
+320503.085313 7381881.360024
+320447.307809 7381853.864734
+320433.503619 7381839.847135
+320413.193153 7381816.231180
+320400.444480 7381799.124110
+320396.412073 7381787.226148
+320386.063054 7381765.499870
+320373.009271 7381749.162668
+320360.458508 7381732.615503
+320353.473950 7381727.986296
+320343.372318 7381719.887683
+320341.970459 7381709.239507
+320344.493805 7381703.180545
+320349.688931 7381695.711824
+320352.855483 7381687.443240
+320350.843403 7381676.565104
+320345.689509 7381664.427183
+320338.531780 7381641.081182
+320337.402047 7381625.003936
+320339.166740 7381606.307138
+320341.088112 7381591.159733
+320344.774177 7381573.262798
+320345.301936 7381546.787333
+320355.131443 7381519.442017
+320356.929121 7381505.844347
+320361.316116 7381481.088587
+320363.509613 7381452.533478
+320363.625060 7381409.780801
+320359.906010 7381389.024357
+320357.176508 7381370.047607
+320343.718660 7381336.433365
+320337.987529 7381313.107361
+320327.918882 7381285.842031
+320316.266958 7381254.357424
+320309.018521 7381230.011594
+320308.235129 7381218.973485
+320305.381933 7381169.691927
+320293.606316 7381090.475496
+320281.154508 7381058.091043
+320276.346955 7381033.995170
+320266.905021 7381005.310084
+320262.674705 7380968.036468
+320260.885273 7380948.079887
+320251.187705 7380907.196890
+320242.388977 7380884.050854
+320224.898722 7380863.344401
+320205.882914 7380849.926699
+320189.547131 7380834.659315
+320170.020057 7380805.064384
+320159.365927 7380783.888011
+320151.927827 7380758.322390
+320144.118647 7380721.458705
+320128.104467 7380678.496064
+320104.668679 7380672.737050
+320024.432855 7380552.557636
+319971.022019 7380462.803010
+319958.710397 7380438.387192
+319938.259745 7380406.492656
+319899.378767 7380344.283312
+319779.478574 7380165.683904
+319723.057864 7380051.013546
+319708.173417 7380017.819232
+319704.619292 7379991.523736
+319698.591297 7379975.496481
+319690.567715 7379940.472481
+319608.319810 7379939.422660
+319603.479273 7379969.427521
+319609.408313 7379986.604579
+319602.522710 7379990.733871
+319596.643148 7380008.940753
+319590.087394 7380018.009199
+319574.436049 7380022.068504
+319552.352643 7380021.508600
+319534.351122 7380033.156605
+319526.987238 7380047.174204
+319519.499660 7380074.879458
+319510.049480 7380109.043606
+319501.052842 7380134.839187
+319488.716481 7380151.086404
+319476.017286 7380165.453943
+319461.470935 7380173.702530
+319324.031009 7380253.598845
+319283.426569 7380280.284274
+319232.200984 7380316.818016
+319202.225936 7380330.965593
+319169.612094 7380358.100945
+319144.213703 7380387.935834
+319118.312293 7380429.578701
+319119.376057 7380437.947268
+319122.880705 7380471.841462
+319125.230880 7380506.095595
+319120.711946 7380542.199410
+319056.176945 7380519.233344
+319045.539307 7380517.623620
+319022.029304 7380506.385545
+318988.252743 7380494.317612
+318968.601976 7380477.810440
+318932.071174 7380432.998115
+318901.378703 7380374.158194
+318877.802730 7380329.455851
+318864.790178 7380293.971929
+318852.907360 7380261.157550
+318866.587856 7380222.474176
+318872.797268 7380209.586384
+318880.911559 7380197.098523
+318884.160574 7380175.062298
+318882.082524 7380152.596146
+318867.577404 7380113.682811
+318840.669953 7380058.302297
+318796.198031 7379966.248066
+318778.072816 7379928.554522
+318745.524944 7379864.425507
+318643.906644 7379645.762962
+318626.952394 7379609.929100
+318543.797404 7379457.085281
+318495.350799 7379342.184962
+318443.061450 7379223.315323
+318425.934029 7379187.131521
+318416.401387 7379175.703479
+318381.627032 7379134.010620
+318365.167556 7379183.482146
+318186.075918 7379135.680334
+318156.282287 7379128.661537
+318125.985636 7379120.312967
+318102.731265 7379111.604458
+318082.346583 7379102.376039
+318047.959801 7379098.726664
+318037.948877 7379132.490881
+318000.981025 7379136.660166
+317973.281936 7379139.919608
+317978.171951 7379179.022910
+317977.297851 7379250.690634
+317925.363090 7379280.295563
+317887.818002 7379301.441941
+317862.757707 7379310.710353
+317757.675990 7379363.011395
+317601.360442 7379432.439502
+317587.152186 7379473.382489
+317571.203976 7379464.174066
+317549.961686 7379448.466757
+317535.959587 7379426.710483
+317524.233447 7379407.633751
+317518.576532 7379392.756299
+317515.962477 7379381.328257
+317509.926236 7379364.171196
+317499.371061 7379338.615573
+317485.690565 7379373.269637
+317452.466501 7379475.502126
+317443.956391 7379516.115169
+317428.808066 7379497.398375
+317399.352530 7379435.598961
+317379.206988 7379430.179889
+317407.524544 7379312.799995
+317438.060336 7379192.110668
+317458.659420 7379128.481567
+317461.191013 7379087.388606
+317535.036009 7378971.768411
+317516.968517 7378868.506099
+317513.991628 7378855.548318
+317369.558898 7378659.011983
+317400.053459 7378659.581886
+317426.367181 7378588.953984
+317426.400166 7378588.943985
+317456.919466 7378513.396926
+317355.078517 7378530.104064
+317384.031033 7378464.975220
+317331.749931 7378477.603057
+317294.386260 7378479.272771
+317259.348026 7378476.383266
+317105.926905 7378447.628191
+317033.351829 7378478.392922
+317012.093046 7378398.316638
+317000.070042 7378368.941670
+316984.591867 7378342.956121
+316945.752120 7378338.146945
+316925.903443 7378344.495857
+316903.770560 7378348.545163
+316884.383672 7378340.046619
+316800.049471 7378229.135617
+316784.892899 7378214.578111
+316759.799619 7378203.769962
+316700.377281 7378205.439676
+316724.959295 7378221.256967
+316744.577078 7378234.684667
+316758.092650 7378246.592627
+316773.958397 7378266.839159
+316781.000678 7378290.415121
+316791.217758 7378321.439806
+316793.089653 7378343.176083
+316791.357944 7378358.883393
+316787.333784 7378378.769986
+316776.358051 7378400.346290
+316762.644569 7378419.553000
+316742.457796 7378443.558888
+316728.826777 7378456.456679
+316712.548718 7378477.733035
+316703.420140 7378497.999563
+316687.496669 7378523.055271
+316666.575982 7378588.474066
+316649.902104 7378632.686493
+316643.263888 7378657.632220
+316630.820326 7378690.036669
+316623.975954 7378723.071011
+316613.239362 7378748.966575
+316599.674313 7378789.449640
+316596.474775 7378816.654980
+316593.481393 7378851.948935
+316591.032263 7378875.954823
+316581.854208 7378900.100687
+316568.792179 7378925.186390
+316547.467426 7378957.920783
+316528.369156 7378983.936327
+316511.728263 7379009.201999
+316493.858681 7379034.787616
+316480.161692 7379053.444421
+316460.642864 7379088.858354
+316421.745394 7379147.628288
+316388.595547 7379196.169973
+316361.580895 7379234.923335
+316342.226992 7379257.389487
+316318.180983 7379311.580204
+316313.439401 7379339.875358
+316314.305255 7379367.690593
+316319.220008 7379390.456693
+316320.852762 7379422.821150
+316315.138124 7379447.556913
+316309.835798 7379463.664154
+316304.211869 7379480.761225
+316291.364241 7379496.438540
+316320.407466 7379554.848535
+316345.525484 7379617.637779
+316391.539451 7379698.303962
+316413.977445 7379738.567065
+316421.234128 7379761.703102
+316429.315434 7379784.619177
+316437.776066 7379808.985003
+316451.926598 7379835.520458
+316468.278874 7379857.776646
+316485.208385 7379881.802530
+316491.434289 7379905.918399
+316491.607460 7379924.415231
+316489.702581 7379938.232864
+316485.760883 7379959.449230
+316483.006642 7379975.586466
+316476.154024 7380009.620636
+316470.703265 7380037.015944
+316467.767607 7380067.550713
+316459.612085 7380099.795190
+316457.294894 7380170.323109
+316460.007904 7380197.938379
+316463.751693 7380215.925298
+316471.511396 7380239.841202
+316482.544853 7380263.237194
+316498.154967 7380287.033118
+316513.872283 7380310.709062
+316529.688553 7380334.724949
+316543.624683 7380353.951655
+316555.523994 7380372.818424
+316569.616802 7380395.814485
+316575.380917 7380410.491971
+316580.122500 7380420.540249
+316591.799162 7380457.123983
+316596.854102 7380493.077824
+316601.950272 7380525.822216
+316606.576408 7380555.667103
+316613.824844 7380579.573009
+316628.074331 7380606.338424
+316651.221500 7380639.532738
+316665.190615 7380656.429844
+316689.228378 7380675.346603
+316702.183206 7380691.893769
+316711.707602 7380713.060143
+316722.130838 7380744.094827
+316736.982299 7380775.219496
+316743.125741 7380786.337592
+316759.238876 7380810.693420
+316775.863277 7380835.709135
+316791.597085 7380866.033940
+316800.404059 7380887.640239
+316818.595244 7380925.853694
+316828.985495 7380959.657903
+316846.921046 7381001.640712
+316876.549753 7381087.526001
+316884.845461 7381109.122302
+316899.812370 7381143.756369
+316905.271374 7381172.401462
+316908.883223 7381201.026559
+316910.029449 7381223.632687
+316909.765570 7381244.569101
+316910.788103 7381260.526367
+316911.117952 7381275.373824
+316921.120630 7381298.869800
+316928.781378 7381314.367145
+316943.863734 7381339.922768
+316947.615769 7381357.909687
+316947.450844 7381371.307392
+316943.121573 7381391.193985
+316942.808216 7381407.691159
+316948.176512 7381427.147827
+316950.559673 7381448.444179
+316955.482673 7381462.681740
+316957.247366 7381500.695229
+316952.852125 7381509.503720
+316932.574644 7381515.892625
+316924.856172 7381521.111731
+316920.502162 7381526.820754
+316915.950243 7381556.005754
+316916.131660 7381590.119911
+316912.330148 7381608.786714
+316909.716093 7381621.384556
+316905.007495 7381638.941548
+316902.261500 7381654.848824
+316902.170792 7381669.696280
+316904.042686 7381683.563905
+316905.766148 7381692.442384
+316917.096469 7381699.901106
+316931.659312 7381710.159349
+316937.909955 7381716.218311
+316949.091844 7381743.613619
+316952.233658 7381753.511923
+316953.701487 7381766.819644
+316958.385346 7381775.518154
+316965.213225 7381783.906717
+316973.508933 7381789.995674
+316985.812309 7381801.003789
+316995.006856 7381816.401151
+317001.249253 7381831.108632
+317002.642866 7381842.196733
+317004.028232 7381853.624775
+317010.674694 7381876.640833
+317012.521850 7381891.838229
+317016.447056 7381912.484693
+317018.788985 7381929.241822
+317023.208965 7381943.139442
+317024.017096 7381976.113794
+317012.290956 7382000.049694
+317004.135433 7382031.734266
+317002.642866 7382045.121973
+316999.261911 7382062.239041
+316999.591760 7382076.316630
+317001.306976 7382086.194938
+317005.355876 7382105.181686
+317009.355297 7382119.859171
+317013.222780 7382136.296356
+317022.417327 7382152.033660
+317029.302929 7382172.280192
+317049.440225 7382213.373153
+317050.842084 7382228.260603
+317046.455089 7382236.289228
+317028.098980 7382243.707957
+317016.051237 7382260.945005
+317009.883056 7382272.273064
+317007.400941 7382291.179826
+317007.244262 7382303.697682
+317013.264011 7382336.122128
+317019.003387 7382350.259706
+317030.218261 7382367.016836
+317038.472738 7382376.415226
+317051.312119 7382385.663642
+317060.671591 7382395.641932
+317084.569167 7382434.705241
+317097.688920 7382445.943316
+317106.718543 7382458.131229
+317112.960939 7382465.190019
+317114.123658 7382478.167796
+317113.076387 7382504.623265
+317113.125864 7382525.009773
+317110.948859 7382544.136497
+317109.728417 7382559.523861
+317107.312271 7382573.451475
+317105.094035 7382595.567687
+317105.753734 7382608.425484
+317106.603095 7382621.843186
+317115.146190 7382632.251403
+317121.693698 7382638.870270
+317128.142250 7382645.479138
+317136.685345 7382655.447430
+317143.488485 7382666.615517
+317144.379078 7382676.703789
+317142.696847 7382689.081669
+317139.291154 7382700.119778
+317138.920073 7382713.297521
+317144.403817 7382723.445783
+317146.836455 7382733.004145
+317143.768857 7382741.822635
+317138.598470 7382747.071736
+317136.965717 7382755.140354
+317138.400561 7382762.689061
+317142.375244 7382771.267591
+317150.588490 7382791.314157
+317157.342153 7382822.408831
+317168.820906 7382875.049814
+317187.770744 7382934.439641
+317220.417571 7383040.301508
+317246.450921 7383128.566389
+317248.834082 7383142.004087
+317253.056152 7383155.341803
+317252.157313 7383169.739336
+317249.287624 7383178.997751
+317242.740117 7383196.534747
+317233.990867 7383210.822299
+317227.814440 7383223.370150
+317222.545098 7383236.487903
+317217.646837 7383268.992335
+317214.966812 7383287.669136
+317211.519888 7383326.282522
+317201.492472 7383345.099299
+317187.993392 7383372.184659
+317188.562382 7383391.901282
+317190.648678 7383412.087824
+317221.110254 7383420.606365
+317238.122228 7383429.594826
+317262.333161 7383442.092685
+317280.309944 7383465.178730
+317294.922265 7383484.015504
+317304.100319 7383511.180851
+317309.913912 7383533.716990
+317316.873731 7383555.513257
+317326.142494 7383575.049910
+317336.120433 7383599.165780
+317349.941116 7383619.912226
+317366.062497 7383639.918799
+317388.673661 7383658.105684
+317412.826871 7383674.042954
+317440.097155 7383684.681132
+317463.986485 7383691.839905
+317489.038534 7383697.498936
+317511.591975 7383689.800255
+317546.028234 7383675.022786
+317598.482507 7383650.576973
+317655.216574 7383617.812586
+317678.174080 7383608.974100
+317699.630772 7383597.066139
+317713.319515 7383597.626043
+317780.468571 7383493.423892
+317803.079736 7383480.766060
+317830.383006 7383458.659847
+317874.129259 7383429.914771
+318064.023459 7383350.338402
+318091.763778 7383349.308578
+318114.869717 7383352.717994
+318153.758940 7383347.518884
+318181.556984 7383347.128951
+318220.990459 7383326.282522
+318242.546106 7383315.654343
+318266.996180 7383303.666396
+318315.079951 7383290.988568
+318344.354069 7383275.421234
+318351.091240 7383263.373298
+318359.609596 7383257.084375
+318372.251068 7383253.944913
+318427.838908 7383254.834760
+318451.043801 7383255.764601
+318474.792946 7383250.185557
+318490.510261 7383245.586345
+318504.363929 7383239.417401
+318527.403897 7383231.178812
+318560.792885 7383202.573712
+318611.721606 7383154.102015
+318638.406408 7383137.614839
+318631.133233 7383156.891537
+318619.440078 7383203.153613
+318645.910478 7383228.929198
+318660.761939 7383246.046266
+318688.551737 7383281.010277
+318683.488551 7383320.183567
+318672.380878 7383391.631328
+318734.763613 7383361.396507
+318776.308123 7383342.899676
+318883.072071 7383280.820309
+318902.821794 7383271.801854
+318961.386524 7383258.654106
+319005.973893 7383257.764259
+319035.379951 7383254.244861
+319056.119221 7383246.706153
+319065.602387 7383231.288794
+319096.773139 7383199.964159
+319115.558052 7383194.285132
+319137.047729 7383169.989294
+319161.778175 7383137.004944
+319171.739621 7383117.008369
+319182.261812 7383089.413096
+319252.132124 7383064.687331
+319310.498944 7383043.151020
+319350.039620 7383029.563347
+319418.318410 7383007.857065
+319466.369196 7382988.360405
+319527.011976 7382967.633955
+319590.029671 7382942.368283
+319632.184402 7382928.940583
+319663.083028 7382888.377531
+Region 1
+226
+341952.751668 7394121.943323
+341895.737229 7394110.985200
+341883.714225 7394163.186259
+341872.738492 7394214.627447
+341855.602824 7394234.823988
+341841.138936 7394243.202553
+341823.640435 7394250.061378
+341807.667486 7394252.350985
+341789.047497 7394253.490790
+341765.108689 7394251.201182
+341752.186846 7394247.391835
+341741.178128 7394242.822618
+341736.106696 7394240.962936
+341678.952072 7394186.422278
+341629.631366 7394138.400504
+341577.276048 7394084.289773
+341527.188443 7394041.217151
+341458.992115 7394131.151746
+341405.218445 7394141.509972
+341415.188138 7394283.505649
+341418.791741 7394311.310886
+341426.106147 7394433.319987
+341402.851777 7394523.584526
+341386.499502 7394581.344632
+341370.872895 7394645.573630
+341342.011087 7394756.914558
+341324.438370 7394826.842580
+341313.520360 7394868.255487
+341284.237995 7394985.305437
+341268.685604 7395044.875233
+341254.601042 7395098.546040
+341225.648527 7395221.704944
+341192.506926 7395331.356162
+341158.384023 7395439.277676
+341127.600844 7395514.954713
+341116.336493 7395550.278662
+341101.930328 7395603.099614
+341093.667605 7395664.189150
+341068.689773 7395778.099639
+341029.322267 7395925.344417
+341003.247686 7396032.006147
+340966.189126 7396176.621375
+341041.147362 7396191.898758
+341243.691279 7396236.431130
+341302.989924 7396267.655782
+341311.937084 7396274.514607
+341400.814958 7396298.330528
+341472.746828 7396314.617738
+341519.173107 7396325.405890
+341612.372005 7396347.742064
+341643.196415 7396353.031158
+341780.158060 7396384.215816
+341854.332905 7396402.922612
+341881.759868 7396405.132234
+341899.283108 7396406.841941
+341980.417772 7396412.301006
+342000.010816 7396350.091661
+342015.653915 7396258.917279
+342048.292496 7396186.579670
+342073.690886 7396157.934576
+342102.750603 7396104.963650
+342191.628477 7396049.993066
+342234.879957 7396029.906506
+342314.917872 7395985.324143
+342384.639752 7395945.910894
+342423.364051 7395920.065321
+342544.995953 7395870.413826
+342584.396443 7395854.086623
+342647.117273 7395830.040741
+342723.617555 7395798.906075
+342827.783940 7395759.482827
+342882.736821 7395734.797056
+343006.339573 7395722.839104
+343090.541834 7395728.968054
+343259.927657 7395711.531041
+343297.093419 7395688.724948
+343318.179031 7395674.867321
+343350.240375 7395644.822468
+343405.696277 7395597.970493
+343445.360646 7395570.445208
+343492.207482 7395542.170051
+343552.363735 7395509.005732
+343636.450549 7395469.902430
+343738.406944 7395422.220597
+343807.328940 7395384.187112
+343846.012008 7395366.440152
+343874.304826 7395346.583553
+343898.210648 7395326.357018
+343918.537607 7395306.080491
+343936.316480 7395286.113911
+343964.601051 7395247.540519
+343997.709667 7395210.626841
+344050.535021 7395155.316316
+344090.867335 7395118.082693
+344168.159255 7395047.824728
+344203.749986 7395025.048629
+344250.209250 7394992.104272
+344282.097423 7394964.748958
+344301.418342 7394942.802717
+344319.494079 7394923.616004
+344341.165174 7394892.611315
+344358.284348 7394866.545779
+344373.366704 7394840.910171
+344384.985643 7394823.093222
+344404.133391 7394799.657237
+344422.332822 7394771.961981
+344451.598694 7394744.276723
+344520.751585 7394701.714014
+344622.270930 7394640.994414
+344735.615370 7394572.756103
+344775.766267 7394550.809862
+344813.905084 7394528.313716
+344885.894678 7394485.601032
+344961.125040 7394440.808704
+344974.211808 7394429.100710
+344990.374420 7394416.422881
+345002.661304 7394403.925022
+345015.789303 7394388.557654
+345035.382347 7394369.720881
+345088.512811 7394289.214671
+345149.056636 7394192.841179
+345116.962307 7394154.687714
+345079.705837 7394106.685937
+345076.539284 7394101.146885
+345052.641708 7394071.002049
+345039.357030 7394058.424203
+344991.108335 7394021.250571
+344940.303308 7393987.516349
+344905.570184 7393968.749564
+344885.911170 7393956.171718
+344810.755024 7393910.289577
+344767.610745 7393877.295229
+344762.489836 7393871.536216
+344722.817220 7393825.514099
+344739.012817 7393811.626478
+344767.132464 7393789.920196
+344787.022372 7393771.853290
+344757.756500 7393710.943724
+344742.723621 7393680.099007
+344714.241141 7393624.718493
+344688.933459 7393556.690146
+344666.775837 7393483.302716
+344654.909511 7393420.023556
+344634.541321 7393360.423765
+344629.750261 7393350.075537
+344616.176966 7393302.153746
+344585.294832 7393250.942518
+344548.904216 7393201.890920
+344507.763771 7393158.378373
+344457.931800 7393116.255588
+344402.550115 7393079.071958
+344347.176676 7393044.467885
+344293.386513 7393008.863984
+344268.070585 7392984.938082
+344226.938387 7392941.625501
+344190.547771 7392893.173800
+344174.723254 7392863.108950
+344159.690376 7392829.884641
+344147.172598 7392791.691183
+344131.216141 7392754.737513
+344117.774785 7392723.292899
+344098.255957 7392689.438698
+344081.186260 7392664.362993
+344054.402503 7392628.809083
+344025.639650 7392597.804394
+343967.462493 7392552.642130
+343920.788828 7392520.207686
+343840.033491 7392630.668765
+343705.603439 7392558.971046
+343746.430527 7392701.876568
+343628.410474 7392913.500318
+343616.214299 7392971.110450
+343632.038815 7393007.504216
+343632.830454 7393024.111372
+343713.082770 7393162.907597
+343724.297644 7393181.744371
+343728.000201 7393187.533379
+343730.927613 7393194.822131
+343731.059553 7393210.439455
+343726.697297 7393221.797510
+343753.860381 7393270.919096
+343658.929774 7393324.719880
+343562.424136 7393379.300531
+343464.335223 7393433.881182
+343365.446425 7393486.092239
+343302.956489 7393520.106412
+343294.256716 7393489.251697
+343295.303987 7393460.636599
+343295.839992 7393447.718812
+343232.550172 7393460.776575
+343172.426904 7393467.895356
+343160.412146 7393443.479538
+343144.859755 7393423.672931
+343123.386570 7393410.945111
+343094.112452 7393398.287279
+343074.618362 7393384.029721
+343065.638217 7393406.985789
+343047.438786 7393418.063891
+343026.081049 7393439.420233
+343005.514950 7393452.078065
+342979.407383 7393461.566440
+342946.183320 7393460.776575
+342912.959257 7393456.827251
+342876.568641 7393457.617116
+342843.344578 7393459.986710
+342774.917356 7393462.576267
+342786.387863 7393484.512509
+342783.237802 7393517.736818
+342783.221310 7393521.686142
+342743.688880 7393640.745748
+342730.940208 7393625.968279
+342511.095699 7393540.672889
+342496.071066 7393593.673811
+342495.163981 7393605.641761
+342479.240510 7393657.312910
+342447.022486 7393739.228879
+342418.548252 7393825.454109
+342354.466794 7393989.206060
+342317.004168 7394110.825228
+342254.308076 7394137.810605
+342172.571438 7394157.647207
+342159.080605 7394160.026800
+342117.816467 7394156.067478
+342085.276840 7394149.718565
+342018.622558 7394134.641148
+341952.751668 7394121.943323
+Region 1
+147
+330573.868707 7401959.580807
+330672.856459 7402025.149575
+330738.397500 7402065.942588
+330778.523659 7402094.027777
+330810.626235 7402116.773881
+330885.526748 7402164.925633
+330924.127353 7402187.021848
+330962.266170 7402191.131144
+330997.931118 7402164.765660
+331025.250880 7402135.560663
+331089.711665 7402052.364914
+331113.469055 7402011.481917
+331165.346092 7401924.006900
+331193.441000 7401881.944105
+331192.921488 7401863.527260
+331218.723943 7401784.370819
+331227.613380 7401707.873922
+331234.721631 7401641.165348
+331239.166349 7401619.029140
+331257.852308 7401563.778604
+331279.836759 7401534.623598
+331311.592993 7401502.479104
+331338.797308 7401473.794018
+331377.546345 7401436.040484
+331390.558897 7401423.512630
+331419.940217 7401353.414638
+331445.140698 7401291.545235
+331461.525958 7401252.471928
+331482.479630 7401230.405708
+331499.837946 7401204.040224
+331509.271634 7401188.382906
+331585.549267 7401091.649476
+331665.240840 7400988.817090
+331689.047708 7400963.191479
+331709.869441 7400950.923581
+331654.636188 7400835.513349
+331703.668275 7400807.538141
+331750.267724 7400781.452609
+331800.940812 7400753.797347
+331844.728297 7400724.142426
+331865.459320 7400710.894695
+331887.658173 7400696.707126
+331932.913487 7400666.042378
+331996.623865 7400626.879087
+332030.219009 7400601.613414
+332051.683947 7400531.615404
+332094.259236 7400400.557853
+332099.413130 7400382.880881
+332109.729165 7400346.787064
+332122.989103 7400304.054383
+332147.298991 7400223.768136
+332182.642336 7400104.008649
+332204.733988 7400048.868095
+332227.097765 7399999.996466
+332230.420996 7399994.147468
+332242.889297 7399974.100902
+332268.337165 7399932.238072
+332290.239153 7399894.174592
+332323.570418 7399841.403631
+332437.838436 7399655.405491
+332408.448870 7399636.028810
+332393.003680 7399623.540949
+332375.777304 7399606.983785
+332356.299707 7399582.028060
+332344.911663 7399567.770502
+332322.119081 7399546.374167
+332286.149023 7399519.348796
+332261.583502 7399501.241898
+332237.760142 7399486.194475
+332216.987887 7399478.235839
+332203.546531 7399473.656623
+331999.996573 7399428.104426
+331940.846361 7399415.636561
+331868.493933 7399398.089567
+331653.852796 7399351.307580
+331630.260330 7399256.933746
+331561.841354 7399202.673040
+331571.275042 7399153.131526
+331658.569640 7399122.466779
+331490.833062 7399082.843566
+331595.857056 7398431.905066
+331543.237858 7398430.295341
+331451.028507 7398392.191868
+331325.083826 7398366.016352
+331190.513588 7398378.574201
+331166.014037 7398379.634019
+331157.124600 7398323.783586
+330389.755115 7398425.616143
+330238.948049 7398440.953516
+329851.350470 7398485.715848
+329395.482347 7398538.076879
+329435.657983 7399061.717185
+329451.301082 7399191.105022
+329458.986569 7399344.238791
+329465.608293 7399378.612903
+329488.079271 7399409.027693
+329515.836083 7399431.503843
+329573.328804 7399496.512708
+329601.456696 7399528.847169
+329633.196438 7399562.451413
+329650.208412 7399584.597620
+329805.979709 7399801.140528
+329890.602528 7399920.420097
+329905.915778 7399944.905902
+329935.247620 7399999.116617
+330000.607245 7400055.746916
+330049.103327 7400141.592212
+330098.036460 7400238.035692
+330129.677247 7400322.161282
+330108.006152 7400339.758268
+330060.656296 7400395.078792
+330016.423515 7400429.032976
+329971.498050 7400459.587742
+329922.935998 7400489.322649
+329889.893352 7400509.579179
+329860.586248 7400527.626088
+329851.292746 7400535.624718
+329847.557204 7400539.644029
+329842.832114 7400552.141888
+329841.760104 7400575.737847
+329843.937108 7400640.916682
+329818.852075 7400759.126434
+329773.069002 7400988.187198
+329755.669456 7401073.362608
+329824.962532 7401089.719806
+329875.660358 7401164.427009
+329910.055386 7401220.687373
+329936.138213 7401257.821012
+329915.687561 7401359.213644
+329975.266578 7401452.597648
+330017.973806 7401536.203328
+330012.292153 7401579.055987
+330010.857309 7401601.132206
+330001.069033 7401699.865294
+330020.381706 7401744.507647
+330091.389998 7401907.479731
+330094.474088 7401909.779337
+330193.189715 7401980.037303
+330210.251166 7402002.603437
+330245.413094 7402048.075648
+330311.721034 7402142.179529
+330356.531052 7402131.481362
+330393.309240 7402119.443424
+330422.072093 7402102.726287
+330476.241582 7402053.904650
+330495.636716 7402025.819461
+330573.868707 7401959.580807
+Region 1
+430
+333690.209977 7381015.128402
+333674.583370 7380991.662421
+333665.042481 7380978.374697
+333653.976039 7380963.737205
+333644.088809 7380955.318647
+333637.269176 7380953.468964
+333631.150473 7380953.398976
+333597.307942 7380960.327789
+333575.158567 7380961.177643
+333553.091653 7380955.388635
+333542.940544 7380951.059376
+333537.902097 7380945.690296
+333534.611851 7380939.231402
+333535.708599 7380932.152615
+333538.570041 7380922.774221
+333542.148905 7380913.395828
+333543.270393 7380904.437362
+333541.579915 7380891.679548
+333535.840539 7380876.442158
+333527.206735 7380863.384394
+333516.107309 7380853.176143
+333495.252592 7380842.647946
+333474.637015 7380823.851166
+333465.021910 7380815.932522
+333425.819330 7380787.127456
+333413.318044 7380803.004737
+333392.042769 7380815.182651
+333371.229283 7380826.010796
+333355.569691 7380835.229217
+333342.012888 7380846.577273
+333321.290110 7380869.283384
+333305.102759 7380890.079822
+333289.674062 7380910.906254
+333279.679630 7380926.713547
+333271.350937 7380941.700979
+333265.529098 7380955.848556
+333260.309234 7380970.146107
+333231.241271 7380982.164048
+333214.913735 7380990.692587
+333193.976555 7381002.760520
+333153.866889 7381030.965689
+333139.576171 7381040.254098
+333139.567925 7381040.284093
+333042.419082 7381080.557194
+332999.060401 7381099.593934
+332950.110776 7381118.580681
+332921.587064 7381125.249539
+332898.679036 7381129.918739
+332870.996439 7381139.787049
+332832.717437 7381149.775338
+332789.639128 7381160.703466
+332779.463279 7381161.903261
+332739.196935 7381174.591087
+332656.289332 7381197.897095
+332645.486770 7381199.696787
+332635.022303 7381202.096376
+332627.897560 7381202.046384
+332620.797555 7381200.476653
+332613.441917 7381197.117229
+332603.307300 7381192.468025
+332555.437931 7381164.662788
+332533.857545 7381159.933598
+332521.413983 7381159.333701
+332514.033607 7381160.553492
+332503.338246 7381161.753286
+332499.511995 7381163.253029
+332486.647875 7381192.158078
+332464.589208 7381221.922980
+332434.803823 7381255.517225
+332347.847321 7381181.229950
+332297.619530 7381276.573619
+332239.533081 7381367.488046
+332210.992877 7381413.840106
+332206.473943 7381431.357106
+332140.149509 7381473.629865
+332120.721390 7381489.017229
+332099.033803 7381500.305295
+332058.421118 7381526.740767
+332038.489978 7381541.858178
+332009.413769 7381558.655301
+331999.996573 7381564.084371
+331991.766835 7381571.353126
+331957.173898 7381595.908919
+331918.507322 7381618.155109
+331901.371655 7381627.243552
+331885.712063 7381632.502651
+331871.512054 7381632.912581
+331860.569306 7381629.973085
+331845.528181 7381624.044100
+331832.721785 7381613.245950
+331825.489840 7381601.627940
+331758.126382 7381622.614345
+331726.823691 7381635.412153
+331617.280763 7381631.142884
+331599.048347 7381650.869505
+331588.806528 7381664.197222
+331578.861574 7381681.084330
+331566.401520 7381700.031084
+331553.628108 7381713.888711
+331520.610201 7381731.535688
+331414.349273 7381775.648132
+331355.223799 7381834.088121
+331320.490676 7381860.553588
+331271.079262 7381908.605357
+331210.015924 7381972.024494
+331194.463533 7381977.583542
+331085.539072 7382035.363645
+330891.059968 7382115.399935
+330875.078773 7382113.470266
+330857.539041 7382115.339946
+330840.494082 7382119.499233
+330792.121693 7382104.821747
+330792.946316 7382068.737928
+330792.195909 7382039.752893
+330789.853980 7382019.146423
+330786.596719 7381993.210865
+330756.563947 7381940.919822
+330660.577822 7382020.486193
+330644.423456 7382037.883213
+330621.103116 7382060.789290
+330547.266367 7382166.091252
+330456.706262 7382294.869194
+330428.413444 7382335.022316
+330418.278827 7382360.337980
+330410.750018 7382377.814986
+330403.114009 7382408.749687
+330394.208080 7382465.849906
+330393.358718 7382503.463464
+330389.499482 7382513.221792
+330385.681477 7382537.697600
+330378.383563 7382558.983953
+330365.206086 7382583.509752
+330350.569027 7382601.166728
+330320.536255 7382636.980593
+330291.328106 7382672.564498
+330255.762113 7382709.548163
+330228.961864 7382738.563193
+330193.536057 7382778.896284
+330169.168445 7382806.631534
+330154.787019 7382823.518641
+330126.832297 7382855.033243
+330115.798840 7382867.131171
+330076.818908 7382909.213962
+330067.311004 7382921.581844
+330039.562438 7382957.155750
+330029.526775 7382971.303327
+329970.211638 7383043.950883
+329878.892880 7383116.548448
+329863.794032 7383129.626208
+329853.527475 7383140.214394
+329834.561144 7383160.370941
+329817.029658 7383189.176007
+329800.759845 7383219.020895
+329788.844042 7383245.586345
+329755.372591 7383351.518199
+329738.121477 7383405.748910
+329696.197640 7383547.194682
+329674.947104 7383622.991698
+329621.940333 7383811.589393
+329616.728715 7383825.766965
+329609.422555 7383847.563231
+329600.079576 7383869.589459
+329588.947164 7383892.355559
+329479.610392 7384100.059981
+329437.092827 7384158.389990
+329418.192466 7384185.275384
+329389.660508 7384135.743869
+329337.247466 7384055.727575
+329282.137907 7383981.070363
+329208.111494 7383884.246948
+329177.740627 7383845.093654
+329148.903558 7383805.420450
+329073.392824 7383703.307941
+329064.107569 7383690.260176
+329014.687908 7383623.311644
+328969.457333 7383568.301066
+328926.609919 7383502.902269
+328885.988987 7383449.441426
+328863.691179 7383416.697035
+328844.370261 7383390.861460
+328772.372421 7383294.108033
+328723.958801 7383228.089342
+328699.376787 7383193.295302
+328691.946933 7383172.638840
+328689.101984 7383095.602036
+328691.707793 7383059.538213
+328692.433461 7383035.912260
+328704.299787 7382847.684502
+328707.853912 7382793.563772
+328716.998982 7382680.053215
+328718.722444 7382658.206957
+328721.237545 7382631.551523
+328726.721288 7382559.933791
+328728.857062 7382520.550537
+328732.996669 7382451.392383
+328737.020830 7382404.470420
+328741.119207 7382316.055565
+328751.567181 7382256.175822
+328781.410290 7382150.953845
+328820.992197 7382012.417575
+328829.213689 7381990.991245
+328883.399670 7381828.159137
+328991.911819 7381769.789135
+329049.239615 7381736.944761
+329083.642889 7381717.128156
+329222.278519 7381631.292858
+329230.417548 7381629.313198
+329239.306985 7381627.353533
+329247.182135 7381627.153567
+329261.398637 7381625.233896
+329308.261966 7381601.697928
+329325.842929 7381590.649820
+329344.768029 7381569.973362
+329352.222621 7381556.555660
+329356.147827 7381539.818527
+329357.541440 7381523.071396
+329359.883369 7381514.702829
+329366.092781 7381497.975694
+329391.837513 7381480.388707
+329408.412437 7381469.850512
+329438.206068 7381454.573129
+329513.601355 7381414.489995
+329530.662806 7381406.751320
+329542.347715 7381403.531872
+329550.725885 7381403.341904
+329568.009985 7381399.402579
+329687.522606 7381362.958822
+329744.660738 7381286.411933
+329767.659475 7381263.465864
+329802.120473 7381234.770779
+329837.521541 7381215.983997
+329902.592547 7381164.902747
+329874.118313 7381130.918568
+329824.731637 7381105.662894
+329775.081083 7381096.814410
+329726.222166 7381088.115900
+329693.971158 7381077.947641
+329670.856973 7381068.289296
+329655.106673 7381055.841428
+329646.992382 7381044.913300
+329642.671357 7381039.574214
+329601.003154 7380959.008015
+329600.236254 7380952.649104
+329602.767847 7380946.040236
+329607.847525 7380941.221062
+329614.964022 7380936.901801
+329620.794107 7380932.072629
+329650.488784 7380917.065199
+329687.547344 7380892.679376
+329710.142016 7380875.142380
+329732.217176 7380843.877736
+329697.112972 7380660.899078
+329686.821676 7380620.795947
+329679.103204 7380580.032930
+329662.767421 7380489.858376
+329661.489255 7380461.653207
+329664.779501 7380404.852937
+329658.133040 7380306.869720
+329659.271019 7380257.218225
+329676.357209 7380182.341051
+329683.721093 7380175.482226
+329696.923308 7380173.192618
+329754.292335 7380135.069148
+329758.852501 7380112.962935
+329761.870621 7380082.318184
+329760.600702 7380050.693601
+329753.863531 7380006.511169
+329737.049467 7379963.918465
+329718.083136 7379921.505730
+329713.927036 7379883.322270
+329718.940744 7379843.019174
+329737.197899 7379777.150456
+329744.339135 7379733.497934
+329742.764105 7379707.312419
+329733.231462 7379677.157584
+329696.733645 7379593.821859
+329694.820520 7379402.474635
+329742.797090 7379405.704082
+329779.665987 7379409.203482
+329733.487095 7379341.785030
+329721.101257 7379307.260944
+329738.921361 7379301.042009
+329760.584209 7379288.894090
+329789.479001 7379269.077485
+329849.684731 7379240.982297
+329900.654683 7379251.880430
+329911.877803 7379251.900427
+329934.926017 7379251.840437
+329950.940197 7379251.910425
+329976.651944 7379251.110562
+329998.207591 7379248.481013
+330018.806676 7379248.610990
+330051.371040 7379246.551343
+330065.059783 7379244.611675
+330077.552823 7379240.322410
+330090.367465 7379234.823352
+330109.193610 7379221.315666
+330122.255639 7379211.607329
+330136.810236 7379205.688343
+330158.695732 7379200.959153
+330179.525711 7379198.539567
+330205.377644 7379202.398906
+330223.197748 7379206.138265
+330240.679757 7379211.547339
+330264.016590 7379213.267044
+330284.294071 7379215.156721
+330301.132874 7379214.536827
+330318.375742 7379213.896936
+330336.649390 7379212.447185
+330367.143951 7379209.247733
+330388.312025 7379207.957954
+330409.331667 7379215.736621
+330475.078863 7379219.156036
+330524.242891 7379194.360283
+330587.483233 7379154.867048
+330609.203805 7379142.299201
+330688.260418 7379193.260471
+330768.842584 7379246.821297
+330874.748924 7379314.849644
+330907.527691 7379332.186675
+330931.606685 7379346.214272
+331073.623269 7379439.518290
+331105.412488 7379458.115104
+331155.739234 7379501.247716
+331424.887956 7379643.283386
+331459.249999 7379662.190148
+331466.762315 7379602.090442
+331489.299263 7379573.545332
+331523.859216 7379502.927428
+331607.781105 7379390.656659
+331647.461967 7379361.291689
+331670.782307 7379346.354248
+331743.489323 7379296.212837
+331779.426396 7379271.817015
+331783.351602 7379258.149356
+331797.452656 7379193.040509
+331803.843485 7379173.823801
+331814.118288 7379145.428664
+331841.899839 7379042.256337
+331882.372339 7379052.574570
+331938.718833 7379060.513210
+331962.641149 7379060.843153
+332011.895884 7379048.615248
+332081.848659 7379036.437334
+332108.558200 7379031.718142
+332168.351618 7379022.489723
+332172.557196 7378975.767726
+332179.236643 7378958.000769
+332195.085898 7378932.625116
+332213.491485 7378906.509589
+332251.828211 7378848.689493
+332271.058421 7378852.268880
+332304.637072 7378865.676583
+332327.817227 7378882.843643
+332360.051742 7378862.427140
+332382.621675 7378836.631559
+332396.590790 7378801.167633
+332419.160723 7378758.184996
+332439.578390 7378678.668616
+332498.349276 7378707.203728
+332529.445812 7378718.301827
+332559.923881 7378742.567671
+332591.943994 7378742.567671
+332645.486770 7378750.066386
+332771.555144 7378760.504598
+332844.509546 7378799.247962
+332946.416465 7378820.684290
+333003.554597 7378827.413138
+333055.637790 7378832.452275
+333156.464452 7378808.926304
+333201.835213 7378820.684290
+333263.418063 7378877.494559
+333277.444902 7378918.147596
+333275.762671 7378968.568959
+333270.245942 7379020.010148
+333247.519331 7379027.388884
+333228.734417 7379028.828637
+333157.940527 7379020.820009
+333147.484307 7379087.818533
+333226.895508 7379100.466366
+333242.439652 7379133.440718
+333278.657098 7379167.924811
+333310.693704 7379230.904023
+333329.833205 7379295.802907
+333350.547736 7379322.318365
+333372.383755 7379331.816738
+333372.375509 7379331.856731
+333390.921282 7379335.446116
+333429.216777 7379360.271864
+333444.661967 7379379.158629
+333454.466735 7379407.683743
+333462.218192 7379442.797728
+333464.650830 7379474.352323
+333461.772895 7379496.208579
+333457.855936 7379522.894008
+333464.782769 7379577.604637
+333505.972692 7379786.038934
+333490.576979 7379795.387332
+333441.511907 7379825.452183
+333503.490576 7379968.087750
+333528.196283 7380021.878537
+333554.510005 7380078.288874
+333593.539415 7380170.653053
+333625.881131 7380236.751731
+333523.025896 7380219.514683
+333580.757757 7380291.902284
+333630.111448 7380348.182644
+333717.282352 7380442.436499
+333750.333244 7380480.320010
+333791.218056 7380524.112508
+333824.277194 7380559.696413
+333859.587554 7380587.091721
+333871.816714 7380596.920037
+333907.786772 7380617.256554
+333936.211529 7380625.595125
+333985.961039 7380638.162973
+333928.699213 7380682.275417
+333882.751216 7380708.410940
+333844.216580 7380728.747456
+333830.428883 7380737.555947
+333817.861627 7380746.574403
+333800.033276 7380757.952454
+333789.799704 7380767.550810
+333775.467755 7380777.529100
+333756.633364 7380795.016105
+333747.537772 7380811.773235
+333733.527426 7380853.126151
+333719.970623 7380901.627843
+333707.700232 7380948.349840
+333690.209977 7381015.128402
+Region 1
+292
+326888.372597 7378966.659286
+326899.570979 7379005.862571
+326911.560998 7379047.825383
+326936.068795 7379133.590692
+326955.142327 7379191.620752
+326990.906229 7379253.620132
+327010.787891 7379267.137817
+327047.763990 7379293.593285
+327118.442432 7379338.095662
+327157.546058 7379281.435368
+327203.477563 7379218.856087
+327252.311741 7379143.678964
+327404.899993 7378894.401663
+327454.839165 7378812.035772
+327465.369602 7378792.669089
+327530.655010 7378682.148020
+327583.430886 7378590.603701
+327727.129701 7378367.911846
+327782.272246 7378289.275316
+327831.972278 7378213.318327
+327931.957824 7378116.364934
+328011.014438 7378053.305735
+328064.953032 7378021.691151
+328171.106759 7377971.119813
+328426.319352 7377864.928003
+328532.489571 7377825.134819
+328734.926287 7377762.125612
+328936.010622 7377704.465488
+329087.287723 7377676.120344
+329205.530424 7377655.693843
+329290.639771 7377651.264601
+329315.345478 7377648.785026
+329328.960005 7377646.825362
+329364.963048 7377635.747259
+329448.060314 7377568.498778
+329523.727726 7377438.361070
+329625.543936 7377174.836209
+329651.247437 7377095.949722
+329682.426435 7377011.584173
+329721.117749 7376895.304090
+329833.423164 7376649.296229
+329930.068988 7376486.844056
+330072.497883 7376332.340521
+330184.976469 7376193.664275
+330462.791980 7375946.156671
+330220.690894 7375624.781719
+330030.260690 7375341.120308
+329979.950437 7375266.433101
+329918.738667 7375173.019102
+329881.383242 7375097.821983
+329829.506205 7374999.848765
+329784.325107 7374878.929477
+329749.987803 7374789.584781
+329642.061136 7374776.137085
+329554.700569 7374765.808854
+329498.873587 7374761.389611
+329409.476201 7374758.570094
+329299.941519 7374725.825702
+329205.373746 7374695.030977
+329118.408997 7374642.170032
+329049.973529 7374600.607151
+328977.835504 7374560.873957
+328901.887719 7374524.760143
+328857.473521 7374503.853724
+328808.103338 7374480.017807
+328785.302510 7374467.889885
+328733.343011 7374446.903479
+328698.139853 7374431.646093
+328674.110336 7374420.288038
+328616.782541 7374378.845137
+328582.519453 7374344.770974
+328545.485631 7374303.468048
+328500.436473 7374232.820150
+328476.209047 7374162.982112
+328466.956776 7374149.564411
+328455.453285 7374086.315245
+328428.628296 7374028.825092
+328381.649520 7373968.065500
+328369.865657 7373926.812566
+328369.873903 7373926.812566
+328341.383176 7373903.246603
+328306.031585 7373871.811987
+328236.293213 7373820.740735
+328205.848129 7373799.134436
+328131.549591 7373738.874758
+328094.573493 7373760.781006
+328041.360566 7373783.177170
+327990.877142 7373839.217570
+327966.352852 7373858.204318
+327960.019747 7373870.072285
+327948.153421 7373904.876324
+327914.137720 7374004.559249
+327889.613430 7374124.598687
+327888.186832 7374153.543729
+327885.605762 7374190.457406
+327886.974636 7374246.407822
+327893.588113 7374292.899859
+327899.863495 7374337.832162
+327917.518675 7374391.852909
+327935.231578 7374442.034313
+327950.586059 7374495.325185
+327960.176426 7374520.060948
+327965.701400 7374564.233382
+327947.081411 7374599.537335
+327914.912866 7374660.676862
+327893.315988 7374705.899116
+327890.001003 7374710.238372
+327830.059152 7374861.742421
+327826.983308 7374876.919821
+327802.879576 7374907.264624
+327705.986366 7374988.900640
+327649.854274 7375039.961894
+327636.940677 7375047.500602
+327574.681635 7375076.065710
+327572.405676 7374941.458766
+327562.485460 7374789.494797
+327544.063381 7374666.105932
+327497.348484 7374570.662281
+327473.046843 7374515.401746
+327372.104733 7374380.064928
+327282.163096 7374258.605733
+326939.218856 7373812.612128
+326840.923786 7373671.666270
+326746.067395 7373527.950888
+326700.935775 7373459.772566
+326575.411652 7373293.091117
+326532.052971 7373234.011237
+326437.848032 7373096.694758
+326338.217074 7372955.578930
+326299.707176 7372903.227897
+326286.925519 7372889.080322
+326165.969808 7372680.406064
+326077.867080 7372527.082327
+325983.068412 7372347.063163
+325896.829332 7372167.483923
+325821.879342 7371982.275648
+325770.241445 7371841.869698
+325606.792908 7371411.253459
+325562.403448 7371152.427793
+325552.730619 7370778.031924
+325574.055372 7370336.627532
+325529.971023 7370347.375691
+325513.626994 7370358.253828
+325504.820019 7370378.640336
+325502.766708 7370396.777229
+325501.645221 7370430.881388
+325495.188422 7370441.659541
+325484.938357 7370454.717305
+325472.577258 7370468.045022
+325449.166209 7370488.291554
+325436.961787 7370494.230536
+325421.813462 7370508.118158
+325415.637035 7370521.005950
+325405.073614 7370534.943563
+325389.075926 7370542.832211
+325350.524798 7370569.837586
+325338.246160 7370581.875524
+325313.862056 7370592.103772
+325297.377841 7370597.772801
+325242.614624 7370608.630941
+325218.296489 7370613.100175
+325198.241656 7370619.169136
+325153.629549 7370625.927978
+325096.301753 7370635.996253
+325062.632393 7370638.245868
+325054.344932 7370639.515650
+325004.958256 7370644.524792
+324981.901795 7370646.024535
+324897.039836 7370649.983857
+324853.606939 7370650.673739
+324806.751856 7370656.092811
+324748.269589 7370662.021795
+324720.158188 7370659.912157
+324703.278154 7370655.942837
+324664.496132 7370634.656483
+324644.408314 7370626.547872
+324622.374385 7370627.827652
+324606.863226 7370637.945919
+324592.151950 7370640.315513
+324574.628710 7370639.325683
+324545.832873 7370635.096407
+324509.532965 7370627.017791
+324482.056525 7370623.138456
+324462.999486 7370622.908495
+324434.244879 7370623.558384
+324410.908047 7370623.158452
+324368.209064 7370621.648711
+324332.791504 7370617.119487
+324312.629470 7370615.329793
+324284.394376 7370606.341333
+324264.133387 7370604.101716
+324241.711886 7370595.193242
+324215.381672 7370581.135650
+324182.833800 7370575.426628
+324161.302891 7370576.606426
+324149.799400 7370583.775198
+324115.882653 7370606.401323
+324098.153257 7370631.437034
+324095.407262 7370647.464289
+324093.659061 7370673.809776
+324105.005875 7370696.205940
+324113.953035 7370706.614157
+324124.763843 7370715.162693
+324148.818098 7370740.488355
+324165.549700 7370755.865721
+324181.308247 7370768.243600
+324186.016845 7370782.921086
+324191.682005 7370795.398949
+324203.201989 7370803.837504
+324218.358561 7370806.577034
+324234.504681 7370811.646166
+324251.359976 7370817.165221
+324258.031177 7370829.873044
+324263.440704 7370846.110263
+324262.846975 7370878.224762
+324257.940468 7370888.243046
+324249.826177 7370909.849345
+324237.959851 7370929.865916
+324194.848558 7370979.627392
+324167.207192 7371072.891417
+324161.640987 7371120.113328
+324188.556684 7371170.284734
+324217.872034 7371232.884012
+324234.496435 7371307.851171
+324233.952183 7371352.593507
+324228.237545 7371412.333274
+324210.005129 7371469.373503
+324164.197318 7371531.072935
+324072.911545 7371627.096487
+324012.136825 7371678.637658
+323971.441677 7371730.428787
+323955.881040 7371777.640700
+323974.888601 7371857.507019
+323997.120439 7371882.702704
+324011.839961 7371912.787550
+324033.494562 7371985.265136
+324022.073533 7372094.666396
+323985.946797 7372181.401539
+323940.015292 7372253.059265
+323922.500298 7372360.170918
+323933.838865 7372669.108000
+323911.755459 7372833.209890
+323880.823848 7372912.476313
+323798.996502 7373050.932596
+323746.905063 7373209.685404
+323699.307819 7373418.219684
+323823.100234 7373534.359790
+323906.172761 7373704.610627
+323913.907726 7373898.987332
+323887.074491 7374043.092648
+323820.238792 7374181.728901
+323766.976388 7374445.023801
+323784.664553 7374692.451419
+323801.594064 7374893.696948
+323830.991877 7375319.813958
+323848.416162 7375581.529128
+323918.509122 7375990.759031
+324051.281682 7376201.592917
+324248.828383 7376428.054126
+324408.862982 7376720.733993
+325318.084126 7376989.218004
+325444.540073 7377051.717298
+325444.531827 7377051.727297
+325491.881684 7377070.224128
+325496.046030 7377071.953832
+325580.883251 7377107.177798
+325636.932881 7377130.673774
+325778.520661 7377197.552318
+325903.582995 7377263.111088
+325958.230765 7377304.893931
+326007.642179 7377362.494065
+326243.797733 7377371.212572
+326251.747099 7377371.212572
+326390.910487 7377377.701460
+326430.896460 7377373.062255
+326464.780222 7377452.288684
+326514.059696 7377633.527639
+326554.507457 7377794.999981
+326564.427673 7377879.465513
+326614.993559 7378107.236497
+326618.052911 7378115.675052
+326659.589174 7378294.304454
+326664.042139 7378309.671822
+326693.596629 7378420.962759
+326703.887925 7378443.088969
+326782.647674 7378615.319467
+326802.554075 7378668.590343
+326823.499501 7378724.120831
+326830.343872 7378752.036049
+326843.579073 7378801.657549
+326873.966432 7378913.928318
+326888.372597 7378966.659286
+Region 1
+267
+348002.318410 7391343.469251
+348043.970121 7391376.063667
+348068.469672 7391394.030590
+348086.751566 7391407.228329
+348103.821263 7391417.796519
+348127.421975 7391430.094412
+348152.449285 7391439.292837
+348196.781021 7391457.089788
+348210.337824 7391478.036200
+348222.278366 7391495.993125
+348235.472335 7391517.339468
+348246.027511 7391540.275539
+348257.423801 7391565.481222
+348263.987801 7391582.058382
+348270.848665 7391608.923781
+348271.673288 7391650.796608
+348285.477478 7391693.839235
+348295.826497 7391722.884260
+348313.976451 7391757.798280
+348345.501791 7391794.252036
+348361.153137 7391808.279633
+348393.560823 7391835.564959
+348425.556198 7391862.090415
+348442.353770 7391876.098016
+348456.496055 7391891.315409
+348470.011627 7391910.752080
+348479.676210 7391929.138931
+348481.341948 7391946.995872
+348482.851008 7391973.241376
+348486.512335 7392070.054793
+348491.460073 7392164.818561
+348496.811877 7392234.846566
+348510.286218 7392281.578561
+348521.377398 7392314.862860
+348558.609129 7392370.333358
+348657.646360 7392517.698116
+348741.188922 7392623.859931
+348786.790578 7392714.184459
+348878.686572 7392666.642603
+349016.044036 7392602.833533
+349051.412119 7392638.127487
+349103.709714 7392666.642603
+349165.218348 7392675.981003
+349303.367450 7392714.184459
+349382.597234 7392728.442017
+349407.146263 7392735.580794
+349441.219688 7392751.418082
+349461.818772 7392763.306045
+349477.668027 7392775.983874
+349498.267112 7392805.298852
+349518.066311 7392851.250981
+349521.241110 7392867.098267
+349535.507089 7392970.090625
+349548.198038 7393063.314657
+349545.971556 7393238.614629
+349545.996295 7393279.367649
+349547.678526 7393351.705258
+349548.231023 7393407.275739
+349547.332184 7393429.751889
+349544.223355 7393530.244676
+349543.522425 7393629.737633
+349640.902163 7393620.389235
+349676.558864 7393610.480932
+349712.100119 7393622.288909
+349788.526184 7393646.024844
+349904.418710 7393709.853910
+349930.361351 7393725.271269
+350035.847134 7393861.008019
+350092.102919 7393925.996887
+350129.936625 7393973.598733
+350144.087157 7393988.036260
+350252.953894 7393966.969869
+350323.450920 7393954.512003
+350362.933872 7393945.803494
+350369.506118 7394021.390547
+350379.368610 7394083.839850
+350392.513102 7394156.137466
+350405.657593 7394185.712400
+350454.953560 7394221.866207
+350491.105035 7394261.309451
+350530.546756 7394343.465378
+350530.546756 7394373.050311
+350523.974511 7394405.914681
+350563.407986 7394455.206238
+350599.559461 7394497.928920
+350606.131707 7394537.372164
+350619.276198 7394576.805409
+350639.001182 7394603.100905
+350658.717919 7394635.965276
+350685.006903 7394668.829646
+350681.724903 7394698.404581
+350664.143939 7394740.557360
+350571.200674 7395067.051435
+350538.487877 7395033.177237
+350503.020839 7395003.812267
+350459.076675 7394978.806550
+350434.997682 7394967.208537
+350413.128678 7394959.079929
+350086.066678 7394873.004673
+350034.956541 7394863.116367
+349986.988217 7394873.104656
+349957.013169 7394893.091232
+349929.033708 7394919.076781
+349909.053091 7394943.062673
+349897.054826 7394979.026513
+349181.216036 7394936.783748
+349134.921697 7394844.179611
+349102.332593 7394770.442241
+349036.890507 7394673.808794
+349082.723057 7394652.302477
+349075.507605 7394634.605509
+349056.030008 7394581.804553
+349021.733935 7394496.059240
+349013.157855 7394477.192472
+348996.013942 7394454.896291
+348966.863516 7394436.039521
+348934.266167 7394420.602166
+348908.150354 7394405.054829
+348885.943255 7394393.146868
+348860.660312 7394382.698658
+348851.605951 7394378.309410
+348828.087701 7394373.620213
+348802.046104 7394379.539199
+348775.130408 7394393.146868
+348751.133876 7394403.435106
+348733.289033 7394408.244282
+348711.337567 7394404.124988
+348682.533484 7394389.037572
+348653.028470 7394369.830862
+348629.741115 7394349.954267
+348615.301965 7394336.216620
+348596.780931 7394317.009910
+348575.629349 7394300.402755
+348564.043395 7394285.045385
+348539.576829 7394277.136740
+348520.156956 7394276.726810
+348498.048812 7394277.016760
+348471.718597 7394278.736466
+348456.388854 7394282.605803
+348428.359916 7394291.924207
+348391.086954 7394305.601864
+348368.756161 7394315.800117
+348324.671812 7394327.808060
+348284.751810 7394340.295921
+348223.878135 7394353.103727
+348101.322655 7394364.211825
+347921.010576 7394383.298555
+347829.056858 7394393.236853
+347815.269160 7394394.876572
+347780.503052 7394397.376144
+347752.136018 7394404.394942
+347713.791046 7394415.393058
+347685.753862 7394425.081398
+347661.180094 7394433.319987
+347626.141860 7394449.337244
+347609.913278 7394459.275541
+347548.396398 7394499.508650
+347318.458502 7394656.561748
+347294.041414 7394675.868441
+347218.505941 7394729.509253
+347186.799184 7394750.175713
+347176.351210 7394757.204509
+347140.620292 7394769.772356
+347066.610372 7394790.678775
+347018.477124 7394806.536059
+346962.971745 7394807.515891
+346860.133003 7394806.746023
+346822.472468 7394809.665523
+346782.593696 7394816.694319
+346686.409662 7394868.085516
+346617.850500 7394882.603029
+346565.899247 7394898.500306
+346430.289984 7394925.275720
+346387.327123 7394929.964916
+346341.610020 7394930.954747
+346285.783039 7394920.986454
+346235.522263 7394903.979367
+346174.071352 7394867.085687
+346126.630787 7394827.792418
+346115.176773 7394818.963930
+346097.628794 7394806.816011
+346083.338076 7394794.798069
+346058.467445 7394776.921131
+346033.456627 7394772.161947
+345972.533475 7394769.042481
+345899.875937 7394769.042481
+345838.952785 7394765.913017
+345779.596417 7394747.176226
+345755.286529 7394735.108294
+345743.189308 7394728.849366
+345734.192671 7394719.580953
+345694.008789 7394678.358014
+345604.397000 7394584.384111
+345585.076082 7394559.308406
+345568.666083 7394536.652287
+345543.663511 7394488.240580
+345517.118895 7394416.352893
+345500.717142 7394389.017576
+345475.722817 7394361.672260
+345423.383991 7394329.647745
+345376.817527 7394306.041789
+345355.731915 7394296.593407
+345311.812491 7394276.566838
+345249.974007 7394251.931057
+345175.988826 7394226.315445
+345149.056636 7394192.841179
+345185.076172 7394137.180713
+345208.652145 7394101.936750
+345212.552612 7394097.157569
+345236.326495 7394060.013931
+345279.173910 7394006.163155
+345355.921578 7393919.937925
+345398.183510 7393875.395555
+345566.085013 7393697.206077
+345617.863095 7393643.945200
+345679.157327 7393578.416424
+345741.853419 7393512.777668
+345769.626724 7393483.962603
+345795.346717 7393465.515763
+345873.141657 7393416.724121
+345923.583850 7393378.540661
+345984.787374 7393324.199969
+346022.678804 7393283.376962
+346063.019364 7393227.996448
+346100.993256 7393158.388371
+346228.356288 7392901.292410
+346263.163628 7392865.698506
+346376.293666 7392773.934225
+346403.176378 7392745.449104
+346422.183940 7392720.143439
+346442.741793 7392679.790351
+346455.399757 7392652.105093
+346463.307892 7392630.748751
+346476.757494 7392577.747830
+346480.723931 7392523.957044
+346479.924047 7392470.166258
+346477.549132 7392398.968453
+346486.232413 7392292.756646
+346516.306416 7392184.595173
+346565.338504 7392082.332690
+346624.348530 7391987.368956
+346684.867617 7391909.972214
+346704.996666 7391885.286442
+346889.671001 7391780.154450
+346952.960821 7391734.272310
+347015.195124 7391701.957845
+347066.107352 7391680.481523
+347096.173109 7391670.193286
+347142.063383 7391658.325319
+347192.678746 7391650.416673
+347247.268793 7391647.257214
+347272.576475 7391648.047079
+347341.407762 7391649.626809
+347405.480974 7391649.626809
+347508.286732 7391628.270467
+347541.510795 7391615.612635
+347574.726612 7391601.375074
+347628.533267 7391566.571035
+347672.823772 7391530.177269
+347707.631112 7391496.952960
+347719.654116 7391482.305469
+347750.651697 7391439.652775
+347799.609568 7391371.704414
+347814.601216 7391351.257916
+347907.783622 7391271.701544
+347914.586762 7391276.450730
+348002.318410 7391343.469251
+Region 1
+921
+359001.924239 7391495.483212
+358973.210864 7391519.799047
+358956.240121 7391533.146761
+358936.836740 7391544.584801
+358920.756590 7391550.853727
+358896.257039 7391561.131967
+358881.718935 7391565.751176
+358869.052724 7391566.850987
+358853.492087 7391571.910121
+358834.459787 7391587.007535
+358824.275692 7391606.064270
+358816.012969 7391637.768840
+358808.739793 7391660.954868
+358802.027362 7391690.119872
+358796.238508 7391718.854950
+358793.517252 7391736.441938
+358789.996111 7391763.207353
+358789.864171 7391776.825021
+358791.084614 7391798.101376
+358799.256628 7391808.479599
+358813.860703 7391817.588038
+358830.724244 7391826.166569
+358864.673976 7391841.004027
+358893.766678 7391851.582215
+358916.625229 7391861.990433
+358939.450795 7391876.937872
+358961.055920 7391890.875485
+358978.909009 7391902.233539
+358994.395430 7391905.482983
+359017.633308 7391908.592450
+359046.824965 7391908.982383
+359074.878641 7391910.912053
+359100.771806 7391913.821554
+359134.960678 7391914.371460
+359159.550938 7391915.161325
+359184.363846 7391914.741397
+359205.663859 7391917.600907
+359225.248657 7391930.298732
+359252.288047 7391952.154988
+359266.652981 7391976.110885
+359284.085513 7391999.306912
+359293.247075 7392013.014564
+359312.403069 7392037.790320
+359326.100058 7392056.967035
+359342.971846 7392085.252190
+359357.039915 7392108.198259
+359361.839222 7392129.174666
+359369.104151 7392148.741315
+359371.792422 7392177.336417
+359369.029935 7392188.164562
+359357.303795 7392208.651053
+359334.247334 7392228.027734
+359307.422346 7392236.736242
+359278.667739 7392244.434923
+359247.200123 7392247.564387
+359227.681295 7392249.484058
+359204.294985 7392251.253755
+359183.778363 7392250.943808
+359161.422832 7392251.393731
+359137.088205 7392255.583014
+359122.005849 7392263.191710
+359100.417218 7392279.258958
+359084.345314 7392305.134526
+359074.350883 7392325.411053
+359066.731365 7392342.498126
+359054.832055 7392359.665185
+359041.209282 7392374.702610
+359023.009851 7392388.590231
+358994.057335 7392405.807282
+358966.514924 7392414.735752
+358941.495861 7392426.783689
+358910.110707 7392442.321027
+358889.866210 7392456.408614
+358870.619508 7392473.055763
+358854.085816 7392493.492262
+358839.316817 7392511.509176
+358830.320179 7392523.167179
+358825.479642 7392538.844494
+358822.981034 7392554.211861
+358821.323541 7392567.259626
+358819.393923 7392576.877979
+358812.137240 7392588.326018
+358806.422603 7392598.344302
+358799.058719 7392610.682188
+358803.148849 7392630.878729
+358695.700464 7392606.132968
+358683.141454 7392596.164675
+358672.429601 7392584.316705
+358662.212521 7392575.358239
+358650.667798 7392565.389947
+358637.614015 7392553.751940
+358620.272192 7392541.733999
+358609.329444 7392533.655382
+358600.497731 7392528.476270
+358588.408757 7392522.817239
+358571.182381 7392520.327665
+358560.264372 7392519.337835
+358547.919764 7392519.217855
+358532.218941 7392517.408165
+358514.151450 7392516.678290
+358505.418691 7392512.049083
+358490.468275 7392507.029943
+358479.731683 7392497.741534
+358458.745026 7392493.662233
+358434.880435 7392492.102500
+358412.129084 7392490.772728
+358391.299106 7392491.452611
+358379.127669 7392493.552252
+358336.206039 7392499.231279
+358317.371648 7392504.030457
+358294.636790 7392512.339034
+358279.876037 7392517.948073
+358258.452330 7392527.486439
+358247.855923 7392535.914995
+358231.742789 7392544.943449
+358221.105151 7392547.393029
+358203.012921 7392549.872605
+358192.523716 7392557.521294
+358181.737646 7392564.950022
+358160.792220 7392577.587857
+358146.542734 7392583.656818
+358130.965604 7392590.255687
+358131.270715 7392589.875752
+358098.302284 7392600.683901
+358070.009467 7392581.587172
+358060.666488 7392576.618023
+358046.037675 7392568.839356
+358008.674004 7392558.951050
+357988.182120 7392556.651443
+357968.696277 7392554.911741
+357956.277454 7392552.132218
+357926.780687 7392541.104107
+357909.587296 7392535.395084
+357890.142684 7392530.006008
+357867.399580 7392527.896369
+357849.348581 7392526.176663
+357827.298160 7392526.066682
+357801.949247 7392529.256136
+357785.374324 7392533.855348
+357774.901611 7392539.514379
+357765.410199 7392549.942593
+357756.479532 7392565.799876
+357749.734115 7392576.807991
+357740.597291 7392592.775256
+357729.192754 7392611.052125
+357723.296700 7392619.080750
+357708.585424 7392630.778746
+357699.151736 7392635.457945
+357687.005038 7392635.227984
+357678.643361 7392634.368131
+357668.888070 7392629.618945
+357661.557171 7392627.779260
+357646.235674 7392628.629114
+357632.002680 7392633.468285
+357621.876309 7392635.807885
+357605.326124 7392637.087665
+357594.243190 7392632.658424
+357577.025060 7392628.839078
+357552.459539 7392625.719613
+357550.736077 7392660.253697
+357480.420468 7392694.647806
+357302.714198 7392777.373636
+357234.921936 7392824.855503
+357159.782282 7392875.006912
+357071.885710 7392930.567395
+356986.990765 7392986.037893
+356949.016873 7393013.473194
+356898.698374 7393073.692879
+356860.303924 7393114.835832
+356756.756005 7393224.587032
+356710.626591 7393275.248354
+356673.353629 7393314.431643
+356626.193436 7393350.595448
+356562.227424 7393415.704295
+356220.206762 7393530.774585
+356153.709158 7393544.252276
+356091.796459 7393545.162121
+355994.408475 7393532.714253
+355972.877566 7393520.766299
+355945.780452 7393504.769039
+355918.543153 7393492.761096
+355895.709340 7393479.253410
+355885.005733 7393477.153770
+355872.677618 7393474.704189
+355861.289573 7393470.494910
+355852.086780 7393461.986368
+355844.599202 7393454.827594
+355836.460173 7393452.198044
+355822.301395 7393448.958599
+355807.474672 7393441.169933
+355792.928321 7393435.930831
+355785.531452 7393430.431773
+355784.162578 7393424.222836
+355782.117513 7393414.344528
+355776.889403 7393405.985960
+355768.585448 7393399.477075
+355751.581721 7393394.547919
+355738.932003 7393394.207978
+355719.693547 7393398.997157
+355702.780528 7393405.476047
+355691.474946 7393413.004758
+355670.694444 7393429.961853
+355657.418013 7393440.360072
+355647.769923 7393446.019103
+355635.260391 7393451.318195
+355627.789306 7393452.907923
+355621.266538 7393452.178048
+355611.041212 7393443.999449
+355603.759790 7393436.500733
+355596.049565 7393431.441600
+355590.170002 7393427.732235
+355581.297058 7393426.532441
+355570.271848 7393426.652420
+355558.496230 7393430.081833
+355546.885537 7393437.820507
+355533.848247 7393445.779144
+355520.390398 7393453.837764
+355497.474123 7393459.046871
+355478.763426 7393461.736411
+355458.147849 7393461.316483
+355448.120433 7393460.056698
+355435.924258 7393458.656938
+355419.819369 7393455.947402
+355408.604496 7393454.177705
+355395.641421 7393454.717613
+355382.455698 7393455.797428
+355368.569046 7393456.547299
+355360.916544 7393455.807426
+355352.794007 7393451.408180
+355345.388892 7393446.579007
+355337.802359 7393440.080120
+355330.578661 7393436.900665
+355323.956938 7393435.620884
+355316.906411 7393436.550725
+355309.938346 7393439.580206
+355295.260055 7393451.808111
+355287.343674 7393461.046529
+355278.990242 7393465.445775
+355265.796273 7393470.724871
+355253.921701 7393474.234270
+355256.436802 7393459.456801
+355250.986043 7393432.611399
+355249.048179 7393415.574318
+355247.357702 7393401.996643
+355240.290682 7393381.950077
+355228.844914 7393365.882829
+355213.358493 7393348.995722
+355199.892398 7393332.648522
+355184.034896 7393323.340117
+355165.992144 7393307.942754
+355141.641025 7393289.935838
+355124.224986 7393265.450033
+355109.835313 7393260.710844
+355103.526947 7393258.091293
+355091.462711 7393250.602576
+355083.439129 7393243.933718
+355077.707999 7393236.524987
+355072.479888 7393229.636167
+355067.639351 7393212.649077
+355065.272683 7393201.001072
+355064.695447 7393188.113280
+355063.837839 7393176.735229
+355063.087432 7393158.288388
+355063.252356 7393146.670379
+355061.405201 7393133.512632
+355056.012166 7393102.367967
+355047.089744 7393087.600497
+355034.110177 7393072.773036
+355016.108656 7393054.086237
+354999.830596 7393038.968827
+354988.590984 7393026.440973
+354977.343125 7393014.922946
+354967.381679 7393001.905176
+354963.489458 7392989.977219
+354955.169011 7392968.400914
+354950.064594 7392952.413653
+354943.005821 7392931.607217
+354929.803606 7392878.386333
+354928.022420 7392843.002394
+354925.713475 7392809.378154
+354921.491405 7392767.135389
+354910.276531 7392734.660952
+354901.675713 7392697.407333
+354889.834126 7392655.824456
+354878.866639 7392623.849933
+354864.806816 7392596.134680
+354848.908083 7392572.178784
+354831.046747 7392543.643672
+354812.954517 7392513.598818
+354785.354383 7392474.065590
+354762.627772 7392394.719181
+354781.214776 7392295.576163
+354843.127475 7392234.066699
+354857.385208 7392217.039616
+354876.161875 7392196.853074
+354899.556432 7392174.716865
+354936.483052 7392145.951793
+354968.297010 7392118.366518
+355011.391812 7392085.682116
+355034.233871 7392067.855170
+355052.721920 7392056.187168
+355068.018677 7392047.368679
+355087.191164 7392038.480201
+355107.600585 7392028.941835
+355126.410237 7392025.912354
+355148.097823 7392021.473115
+355163.345104 7392017.083866
+355193.072765 7391994.347761
+355206.629568 7391986.179160
+355223.072552 7391974.271200
+355240.406129 7391965.912632
+355261.302078 7391958.703866
+355283.913242 7391953.384778
+355303.588748 7391945.826072
+355323.734290 7391941.596797
+355337.439525 7391939.297191
+355363.266720 7391939.107223
+355353.264042 7391928.599023
+355347.483434 7391924.559715
+355339.393882 7391906.762763
+355347.293771 7391891.885312
+355349.916072 7391884.936502
+355355.828620 7391875.688086
+355364.759287 7391870.688943
+355379.132467 7391861.860455
+355394.825044 7391843.833543
+355405.429697 7391834.875077
+355413.849098 7391829.975916
+355419.473028 7391829.036077
+355430.605439 7391827.926267
+355438.480589 7391826.346538
+355445.869212 7391822.317228
+355462.567829 7391796.131714
+355469.272015 7391788.662993
+355474.607326 7391786.173419
+355485.055300 7391782.064123
+355491.924410 7391779.584548
+355496.872149 7391774.655392
+355502.059028 7391765.846901
+355506.949042 7391756.808449
+355511.773087 7391743.790679
+355515.937434 7391735.192152
+355521.190283 7391719.854779
+355524.183664 7391706.597050
+355529.197373 7391695.019033
+355535.753126 7391682.011261
+355543.026301 7391669.233450
+355551.660105 7391652.936242
+355556.451165 7391633.269610
+355556.409934 7391606.464202
+355555.709004 7391583.978054
+355550.777758 7391556.692727
+355549.136758 7391525.778023
+355545.599125 7391511.900400
+355542.251156 7391500.242397
+355534.202835 7391477.346319
+355530.063227 7391462.688829
+355528.100624 7391444.951868
+355528.587152 7391426.565017
+355530.879604 7391411.417612
+355533.543136 7391399.599636
+355539.158819 7391379.503078
+355550.200522 7391356.577005
+355557.242803 7391329.411659
+355581.173364 7391343.589230
+355603.792775 7391364.085719
+355644.100350 7390990.169768
+355650.878752 7390846.134440
+355633.932748 7390737.683016
+355635.631472 7390690.231144
+355622.066422 7390639.399851
+355606.819142 7390600.426527
+355584.793460 7390575.010881
+355559.370331 7390561.453203
+355527.177046 7390542.806397
+355493.293284 7390512.311620
+355471.259356 7390476.727716
+355456.003829 7390427.586133
+355449.233674 7390371.665712
+355439.057825 7390324.213840
+355400.086139 7390256.435450
+355366.185885 7390205.594158
+355337.348817 7390159.572041
+355358.104579 7390140.385328
+355372.230372 7390125.457885
+355381.705291 7390116.919347
+355392.755240 7390103.741605
+355408.216923 7390089.054121
+355420.792425 7390076.326301
+355427.175007 7390070.307332
+355450.841689 7390051.380574
+355458.568407 7390043.701889
+355466.220909 7390034.143526
+355471.416035 7390024.675148
+355482.078411 7390009.047825
+355492.064596 7390000.399306
+355509.736268 7389988.951267
+355517.149630 7389982.272411
+355522.600388 7389978.003143
+355527.828498 7389964.985372
+355530.459046 7389956.926753
+355532.792729 7389948.648171
+355534.392498 7389941.019478
+355541.187392 7389925.252178
+355544.114804 7389917.643482
+355548.963588 7389912.704328
+355557.176833 7389908.025129
+355562.817255 7389905.305595
+355578.559309 7389902.476080
+355584.397641 7389900.206468
+355596.898926 7389895.347301
+355602.357931 7389890.088202
+355613.581051 7389880.119909
+355620.285236 7389873.211092
+355629.570492 7389862.672898
+355635.293376 7389851.654785
+355636.959115 7389838.717001
+355638.682577 7389828.988667
+355638.154818 7389810.481837
+355633.635884 7389803.133096
+355628.919040 7389794.774528
+355623.138432 7389790.845201
+355604.501951 7389777.037566
+355599.884062 7389758.280779
+355598.754328 7389748.632432
+355596.099042 7389738.754124
+355595.777439 7389719.587407
+355613.350156 7389697.061265
+355621.827282 7389686.293110
+355636.390125 7389658.747828
+355643.514868 7389640.101022
+355651.860054 7389621.474213
+355656.725330 7389594.278871
+355659.628003 7389569.053192
+355664.344847 7389535.328969
+355672.228243 7389512.372901
+355678.017097 7389494.815908
+355698.038945 7389461.241659
+355710.993773 7389441.874976
+355726.199823 7389421.208516
+355740.218415 7389396.542741
+355747.211218 7389380.995405
+355761.452459 7389343.821772
+355763.695434 7389323.355278
+355770.119247 7389293.630369
+355775.504036 7389275.073548
+355788.153754 7389234.560488
+355809.874325 7389225.692007
+355817.279440 7389219.783019
+355819.852264 7389217.483413
+355825.014405 7389211.994353
+355829.879681 7389204.515634
+355838.076434 7389180.559737
+355852.292936 7389157.333716
+355851.443574 7389150.244930
+355860.605136 7389142.026338
+355865.783769 7389134.437638
+355873.832090 7389125.439179
+355880.561014 7389115.980799
+355894.670315 7389102.493109
+355905.901681 7389091.534987
+355914.436530 7389085.086091
+355932.858609 7389069.868698
+355945.401126 7389060.250345
+355956.137718 7389057.810763
+355961.745155 7389058.860583
+355963.938652 7389063.759744
+355963.072798 7389068.728893
+355962.009034 7389073.478080
+355961.448291 7389078.567208
+355965.192079 7389081.376727
+355971.492200 7389084.536185
+355980.480591 7389083.626341
+355986.846681 7389079.926975
+355997.781183 7389078.047297
+356013.820102 7389076.647537
+356020.153207 7389076.047639
+356032.110241 7389074.617884
+356051.612577 7389072.818193
+356058.762059 7389072.218295
+356070.752078 7389067.799052
+356080.490876 7389062.909890
+356085.644770 7389057.650791
+356086.444655 7389048.792308
+356087.343494 7389040.723690
+356087.384725 7389036.734373
+356088.869047 7389020.797103
+356093.519921 7389014.758138
+356098.871724 7389010.048944
+356105.015166 7389008.339237
+356116.469181 7389005.459730
+356123.090904 7389006.519549
+356127.057341 7389007.889314
+356134.874767 7389012.288561
+356138.907174 7389017.307701
+356148.274892 7389019.287362
+356153.387555 7389018.337525
+356165.369328 7389014.138244
+356176.345061 7389008.929136
+356183.222418 7389004.229941
+356199.500477 7388999.630729
+356211.589451 7388994.771561
+356229.953807 7388984.873257
+356247.551263 7388979.844118
+356263.342795 7388972.135439
+356274.326774 7388966.256446
+356286.630150 7388959.847543
+356296.616335 7388951.089044
+356298.710878 7388946.119895
+356303.584400 7388938.311232
+356309.513440 7388936.591527
+356315.830053 7388937.651345
+356320.596374 7388940.800806
+356326.203811 7388941.850626
+356331.481399 7388944.230218
+356337.097082 7388944.510171
+356343.636342 7388943.910273
+356347.742965 7388940.630835
+356348.625312 7388934.541878
+356348.666543 7388930.002656
+356348.732513 7388923.693736
+356350.860041 7388914.855250
+356355.296513 7388909.916096
+356364.911618 7388907.466516
+356373.611391 7388905.106920
+356386.797114 7388902.917295
+356398.770641 7388899.597864
+356409.358801 7388891.399268
+356421.373559 7388884.210499
+356428.085991 7388876.191873
+356449.031416 7388863.324077
+356458.250702 7388859.104800
+356472.458958 7388857.025156
+356487.170233 7388855.175473
+356505.270709 7388851.586088
+356521.829141 7388849.316476
+356546.493616 7388842.027725
+356565.822781 7388837.238545
+356575.569826 7388832.009441
+356590.660428 7388823.410914
+356601.479482 7388812.892715
+356619.753129 7388791.476384
+356626.160451 7388782.897853
+356642.323063 7388768.990236
+356672.743408 7388736.735760
+356684.947829 7388709.610407
+356695.832853 7388692.113404
+356698.974667 7388684.274747
+356703.938898 7388677.795856
+356711.640878 7388672.886697
+356715.450636 7388668.827393
+356723.713359 7388659.159049
+356716.530892 7388641.812020
+356711.814048 7388634.013356
+356708.325893 7388625.784765
+356709.397903 7388620.265711
+356715.087802 7388612.237086
+356736.156921 7388597.599593
+356750.744503 7388587.441333
+356761.233709 7388579.462700
+356772.720708 7388573.043799
+356785.815722 7388559.326149
+356792.825018 7388552.637295
+356805.895294 7388541.469208
+356815.147565 7388534.700367
+356825.669755 7388522.512455
+356833.891247 7388516.723447
+356845.609141 7388508.534849
+356851.752582 7388506.155257
+356863.742602 7388501.176110
+356873.456662 7388498.836510
+356883.904636 7388494.947177
+356893.173399 7388486.408639
+356900.100233 7388477.170222
+356907.530087 7388469.381556
+356925.993397 7388459.263289
+356934.404552 7388454.584090
+356947.928371 7388449.734921
+356958.730933 7388440.756459
+356967.166827 7388433.527697
+356973.854520 7388427.618709
+356984.871484 7388418.090341
+356993.340363 7388407.652129
+356997.282061 7388401.043261
+356999.393096 7388393.754510
+357000.704247 7388385.465930
+357000.918649 7388374.057884
+357000.968126 7388368.858774
+357001.528870 7388363.219740
+357009.511221 7388351.001833
+357022.804145 7388348.142323
+357040.904621 7388343.773071
+357049.497193 7388342.093359
+357057.166188 7388340.173688
+357065.577343 7388335.714452
+357073.271076 7388331.805121
+357086.514523 7388323.846485
+357098.850884 7388314.668057
+357109.150426 7388305.239672
+357115.013496 7388300.210533
+357125.255314 7388296.541162
+357138.498761 7388287.922638
+357144.139183 7388285.763008
+357152.855448 7388280.973828
+357161.448021 7388279.394099
+357167.104935 7388274.364960
+357172.580432 7388267.326166
+357181.024572 7388259.877442
+357183.663366 7388250.818994
+357188.371964 7388239.240977
+357190.507737 7388229.402662
+357194.663838 7388221.693982
+357197.096476 7388212.635534
+357201.755596 7388206.366608
+357204.361405 7388200.637589
+357215.106243 7388197.418141
+357226.065484 7388192.988899
+357236.999986 7388191.429166
+357247.151096 7388186.440021
+357254.341809 7388181.530862
+357261.029502 7388176.051800
+357272.029974 7388168.303128
+357280.234973 7388163.393969
+357289.223365 7388152.635811
+357313.483775 7388124.190684
+357330.405040 7388104.644032
+357342.832110 7388086.377161
+357350.880431 7388077.158740
+357356.578576 7388068.350249
+357364.206340 7388060.671564
+357376.872550 7388049.173534
+357394.643177 7388026.867354
+357400.885574 7388014.079545
+357409.840980 7388005.860953
+357418.986050 7387989.113821
+357426.457135 7387977.005895
+357429.095929 7387967.957445
+357431.512074 7387960.448731
+357436.575260 7387943.771588
+357440.516958 7387926.424559
+357443.172244 7387916.156318
+357448.284907 7387894.280065
+357454.461334 7387868.094551
+357462.740550 7387855.546700
+357474.598629 7387843.258805
+357479.999911 7387833.790427
+357486.225815 7387823.222237
+357486.671111 7387808.604741
+357485.698056 7387803.495616
+357483.941609 7387785.318730
+357482.836614 7387772.910855
+357479.686554 7387761.472814
+357476.726157 7387750.584679
+357471.052750 7387735.917192
+357462.418947 7387721.659634
+357456.885726 7387713.301066
+357450.206279 7387697.063847
+357441.325089 7387676.927296
+357435.709406 7387603.789824
+357462.319992 7387627.305796
+357482.457287 7387644.662823
+357504.021180 7387662.149827
+357528.520732 7387671.808173
+357545.681138 7387680.606666
+357566.181267 7387692.214677
+357582.962346 7387707.991975
+357602.786285 7387725.688944
+357614.265038 7387741.526231
+357622.470037 7387758.543316
+357633.256107 7387782.349238
+357638.360524 7387803.105683
+357643.258785 7387834.830249
+357646.755187 7387863.325368
+357646.788172 7387880.492427
+357646.351121 7387893.880134
+357647.950890 7387907.847741
+357653.080046 7387926.064621
+357662.060191 7387937.002747
+357670.850673 7387945.951215
+357683.244757 7387951.390283
+357692.785646 7387956.799356
+357704.198429 7387958.009149
+357712.823987 7387963.408224
+357717.252212 7387968.997267
+357718.827243 7387985.734400
+357703.786118 7388011.280024
+357682.378903 7388040.085090
+357664.105256 7388061.501422
+357649.047639 7388079.038418
+357639.638690 7388090.496455
+357617.406852 7388120.291352
+357604.427285 7388143.857315
+357594.028788 7388163.693917
+357586.994753 7388193.968731
+357576.117975 7388231.402319
+357572.819483 7388255.848132
+357571.277438 7388278.314284
+357566.337945 7388302.960062
+357566.865704 7388321.896819
+357565.381383 7388338.383994
+357563.014714 7388350.651893
+357554.949901 7388361.210085
+357535.719691 7388376.637442
+357518.567531 7388387.545574
+357498.380759 7388396.863977
+357472.133007 7388409.461819
+357453.166676 7388418.240316
+357425.426356 7388426.498901
+357397.900438 7388434.537524
+357379.585560 7388439.556665
+357358.211330 7388444.665789
+357338.041050 7388451.004704
+357318.612931 7388465.322251
+357300.908273 7388481.539473
+357295.012218 7388499.976315
+357293.758791 7388523.662258
+357295.333821 7388540.069448
+357302.145208 7388562.945529
+357302.639982 7388586.091564
+357297.593289 7388601.218973
+357291.829173 7388616.336384
+357281.941943 7388636.392948
+357269.613828 7388644.571547
+357260.650175 7388653.240062
+357245.262709 7388661.388667
+357233.783956 7388666.817737
+357220.276630 7388670.007190
+357206.027144 7388676.846019
+357199.520868 7388684.864645
+357194.317496 7388694.892928
+357191.472546 7388703.941378
+357192.288923 7388714.809516
+357203.042008 7388732.076558
+357220.342600 7388747.193969
+357256.139487 7388769.910078
+357288.835792 7388797.035432
+357326.727222 7388825.530551
+357352.290537 7388851.586088
+357385.456876 7388883.030701
+357417.279080 7388915.785091
+357447.146928 7388941.520683
+357449.159008 7388943.230390
+357486.629880 7388972.945300
+357523.243144 7389006.739511
+357576.835397 7389046.802649
+357616.862601 7389075.987650
+357648.082830 7389097.883899
+357680.828612 7389120.240070
+357707.538153 7389133.237843
+357729.761744 7389146.625550
+357764.354682 7389157.373709
+357802.312082 7389167.931900
+357831.652170 7389173.310979
+357853.785053 7389174.300809
+357879.760680 7389169.131695
+357896.368588 7389161.213051
+357920.365120 7389149.145118
+357936.758626 7389132.477973
+357949.152711 7389117.430551
+357959.790348 7389103.682906
+357973.479091 7389081.666677
+357983.333337 7389065.379467
+357993.146351 7389053.071575
+358004.674582 7389043.323245
+358021.249505 7389038.504070
+358041.081690 7389035.484587
+358057.128855 7389032.875034
+358075.864291 7389029.015696
+358085.339210 7389027.945879
+358094.195662 7389030.575428
+358106.985565 7389047.422543
+358124.838655 7389079.926975
+358143.194764 7389112.781347
+358162.639376 7389138.216990
+358182.966335 7389157.683656
+358204.629182 7389175.830547
+358229.062764 7389192.797641
+358255.483687 7389204.455644
+358285.310303 7389222.022635
+358322.096738 7389238.659785
+358359.031605 7389249.427941
+358397.706427 7389260.985961
+358415.386345 7389268.354699
+358441.774283 7389272.933915
+358466.644915 7389276.273343
+358487.689296 7389274.043724
+358509.071772 7389268.934600
+358527.510343 7389261.575860
+358539.475624 7389258.486389
+358556.594799 7389251.337614
+358583.444526 7389249.937854
+358603.169510 7389257.656531
+358622.894493 7389264.825303
+358643.089512 7389277.093202
+358659.944808 7389285.451770
+358680.156319 7389295.500049
+358703.196287 7389298.269575
+358718.196181 7389298.529530
+358738.506647 7389297.949630
+358752.714902 7389295.869986
+358764.902831 7389301.638998
+358781.370554 7389318.966030
+358796.881714 7389340.152401
+358815.345024 7389362.258614
+358834.154676 7389380.155548
+358851.026464 7389397.822522
+358865.111026 7389407.810811
+358877.397910 7389414.799614
+358887.689206 7389426.527605
+358895.894205 7389443.544690
+358901.839737 7389472.179786
+358900.883175 7389508.043642
+358898.203150 7389542.347766
+358897.535205 7389569.143177
+358894.277944 7389589.489691
+358879.566668 7389612.825694
+358863.791629 7389629.502837
+358842.483369 7389648.229630
+358826.147586 7389659.147760
+358807.906924 7389677.354641
+358793.253372 7389694.051781
+358780.982981 7389717.627742
+358772.794474 7389741.023735
+358770.741163 7389763.709849
+358772.918167 7389792.074990
+358784.471137 7389821.200002
+358797.368241 7389848.905256
+358825.603335 7389884.839101
+358839.564204 7389907.785170
+358855.768047 7389931.191161
+358878.230779 7389962.305831
+358892.917316 7389983.932127
+358910.415817 7390021.755648
+358916.089224 7390057.469531
+358919.833013 7390102.911747
+358919.412455 7390136.016076
+358918.356937 7390182.188168
+358920.880284 7390226.950500
+358925.745560 7390262.094482
+358933.266122 7390287.200180
+358946.138488 7390316.895093
+358958.260447 7390340.711014
+358967.174623 7390358.507966
+358983.147572 7390384.463520
+359000.068837 7390408.109469
+359018.878489 7390426.116385
+359031.891041 7390441.863687
+359046.660040 7390455.731312
+359062.839145 7390481.356923
+359072.973762 7390510.581917
+359078.309073 7390528.018930
+359087.825223 7390558.013792
+359095.650896 7390582.559588
+359103.723956 7390602.346198
+359118.031166 7390621.202968
+359135.554406 7390635.770473
+359150.455345 7390646.098704
+359172.109947 7390654.397282
+359186.153278 7390657.036830
+359202.579769 7390659.896340
+359230.559230 7390658.166637
+359254.011510 7390655.387113
+359271.270870 7390649.038200
+359284.299915 7390641.629469
+359299.918276 7390631.041283
+359317.606440 7390617.373624
+359323.296340 7390608.785095
+359328.582173 7390589.898330
+359333.059877 7390580.639916
+359341.058720 7390566.542331
+359358.491252 7390557.963801
+359372.221226 7390551.784859
+359390.816476 7390550.075152
+359409.123108 7390546.155823
+359424.411620 7390538.107202
+359442.594558 7390525.659334
+359457.017216 7390511.401776
+359481.962063 7390486.286078
+359505.002032 7390467.129360
+359491.247319 7390517.930658
+359482.794933 7390558.273747
+359479.141853 7390587.698707
+359479.537672 7390620.813035
+359478.795511 7390655.907024
+359480.147893 7390674.633816
+359479.653119 7390693.790535
+359477.319436 7390713.917087
+359461.618612 7390733.703698
+359442.380156 7390749.351018
+359419.224741 7390769.287603
+359382.586738 7390800.712220
+359350.978936 7390828.757416
+359325.522822 7390854.542999
+359297.493884 7390882.398228
+359269.951473 7390913.142962
+359250.284213 7390941.748062
+359233.676305 7390969.823253
+359222.675833 7390999.508168
+359214.454341 7391026.333573
+359213.299869 7391048.449785
+359219.707190 7391074.665294
+359231.392099 7391111.878920
+359232.967129 7391128.396091
+359238.063300 7391150.922232
+359230.320089 7391181.087065
+359217.150859 7391192.145171
+359192.255488 7391212.051761
+359170.444208 7391229.898704
+359145.532345 7391252.244876
+359127.431869 7391276.550713
+359114.658458 7391299.346808
+359104.647534 7391321.403030
+359099.064836 7391339.729891
+359093.952173 7391361.386182
+359091.098977 7391382.062640
+359085.516279 7391400.389501
+359076.461918 7391428.544678
+359061.692918 7391446.561592
+359045.513814 7391462.688829
+359027.009272 7391476.576451
+359001.924239 7391495.483212
+Region 1
+139
+331270.823628 7395558.717217
+331370.034029 7395558.257296
+331500.002871 7395553.918039
+331590.546483 7395552.708246
+331713.918340 7395552.948205
+331806.003997 7395552.498282
+331841.883347 7395554.207989
+331836.449081 7395438.667780
+331825.168237 7395322.887612
+331823.362313 7395226.394141
+331821.102846 7395148.427496
+331827.798785 7395101.795483
+331833.068126 7395065.111767
+331835.855352 7395053.303789
+331841.132940 7395038.176381
+331842.831663 7394977.996689
+331833.059880 7394948.131805
+331819.131997 7394908.448602
+331882.858867 7394780.830462
+331947.773195 7394622.227629
+331988.954871 7394549.330116
+331968.462987 7394541.271496
+331937.061341 7394526.514024
+331922.267603 7394514.856021
+331908.991172 7394498.378843
+331900.044012 7394481.391753
+331892.861545 7394460.065406
+331885.687324 7394444.848012
+331838.997166 7394483.041470
+331682.137367 7394428.010897
+331567.300359 7394386.358031
+331478.100882 7394329.657744
+331400.899671 7394285.885241
+331372.862486 7394267.158449
+331244.163565 7394191.021491
+331112.702156 7394113.314801
+331065.302822 7394085.219614
+331030.149141 7394067.272688
+331017.128343 7394053.065121
+330989.627163 7394009.142645
+330931.911795 7393929.406303
+330870.048573 7393837.811992
+330806.181516 7393749.777072
+330699.302121 7393599.372835
+330672.040082 7393625.528355
+330568.887983 7393716.152831
+330482.170622 7393807.187238
+330396.962321 7393901.111150
+330311.589095 7394000.004210
+330299.277472 7393989.116075
+330242.337250 7393938.754702
+330202.763589 7393915.788636
+330174.610957 7393904.330598
+330108.591635 7393887.363505
+330047.627252 7393895.972030
+330016.943027 7393904.840511
+329987.553461 7393916.498514
+329950.049604 7393932.015856
+329891.443643 7393959.711112
+329852.232816 7393979.317754
+329809.632789 7394000.004210
+329804.668558 7394009.682552
+329669.281943 7394074.731410
+329569.453075 7394122.433239
+329429.481556 7394185.712400
+329165.090909 7394296.363447
+328967.098911 7394382.238737
+328981.076272 7394414.463217
+329003.423557 7394465.914404
+329014.976526 7394492.299884
+329034.742741 7394537.362166
+329045.718474 7394562.377881
+329093.060084 7394661.820847
+329146.602860 7394788.429160
+329185.780702 7394792.408479
+329213.009755 7394795.148009
+329243.042527 7394801.426934
+329267.987375 7394808.995637
+329290.656263 7394818.094079
+329314.347684 7394829.722087
+329339.581150 7394844.399573
+329362.019143 7394864.156189
+329383.954117 7394882.143108
+329428.071451 7394921.916295
+329462.243831 7394950.541392
+329500.481602 7394979.156490
+329550.668162 7395006.991722
+329557.050744 7395012.560768
+329583.339728 7395027.828153
+329593.490837 7395034.067085
+329637.632910 7395059.422741
+329652.088552 7395067.971277
+329683.943741 7395085.938200
+329700.749560 7395091.737206
+329710.166755 7395097.306252
+329735.136341 7395108.684303
+329764.171319 7395120.302313
+329812.040688 7395135.949633
+329859.901811 7395149.047389
+329873.376152 7395151.307002
+329891.451889 7395154.056531
+329904.687090 7395157.585927
+329912.083959 7395161.125321
+329919.983847 7395167.724190
+329928.403249 7395175.062933
+329953.917087 7395208.067280
+329956.498157 7395216.895768
+329962.138579 7395232.643070
+329972.413382 7395265.377463
+329980.618381 7395289.233377
+329995.989355 7395332.865903
+330012.358123 7395354.942122
+330024.933625 7395392.745646
+330087.489531 7395560.216960
+330108.319509 7395615.587475
+330124.152272 7395657.660269
+330144.908035 7395710.191271
+330155.232315 7395751.824139
+330163.181682 7395788.127921
+330167.477968 7395849.317440
+330173.703872 7395902.888263
+330182.543831 7395950.830051
+330190.336519 7395999.991630
+330213.722829 7396052.872572
+330285.110448 7395986.443951
+330362.567293 7395907.877409
+330423.861525 7395852.816840
+330470.469221 7395823.501862
+330517.810831 7395795.986575
+330600.330861 7395744.005479
+330654.788968 7395703.852356
+330729.062767 7395661.199662
+330781.112975 7395641.623016
+330853.061338 7395616.997234
+330952.156291 7395579.213706
+331010.110800 7395563.586383
+331082.100394 7395564.196278
+331134.488697 7395563.576384
+331270.823628 7395558.717217
+Region 1
+549
+335159.308951 7382708.718305
+335206.831979 7382725.045509
+335219.242556 7382731.934329
+335235.965911 7382743.132410
+335248.120855 7382756.100189
+335290.127154 7382820.169215
+335346.053091 7382912.973318
+335370.841260 7382956.435873
+335435.871035 7383066.267060
+335439.153035 7383080.244666
+335438.872663 7383099.031448
+335435.532939 7383128.746358
+335427.352678 7383173.178747
+335408.996569 7383235.878008
+335373.603747 7383344.789352
+335360.607688 7383385.402395
+335357.012331 7383419.176610
+335356.748452 7383425.265567
+335357.243226 7383433.404173
+335361.028245 7383446.871866
+335366.841838 7383465.418689
+335390.599228 7383523.108808
+335409.549067 7383571.910448
+335423.922247 7383633.139960
+335444.875919 7383699.718556
+335461.285918 7383754.099241
+335459.207867 7383809.319782
+335458.399737 7383821.907626
+335449.452577 7383855.151932
+335442.583466 7383885.426746
+335427.847452 7383934.318371
+335421.200990 7383953.625064
+335417.086121 7383974.511486
+335417.292277 7383992.788356
+335418.430257 7384000.007119
+335424.953025 7384027.982327
+335433.199256 7384056.767397
+335441.222838 7384078.123738
+335454.268375 7384106.728839
+335472.698701 7384136.953661
+335481.348997 7384150.691308
+335495.202664 7384183.705653
+335509.311965 7384216.729996
+335521.112321 7384247.474730
+335536.466802 7384275.149990
+335542.618490 7384287.587859
+335545.240792 7384309.204156
+335546.337540 7384329.260721
+335552.299565 7384359.035621
+335551.136847 7384389.060478
+335545.883998 7384408.157207
+335409.177986 7384671.312131
+335416.748026 7384693.818276
+335473.020304 7384709.575576
+335616.570687 7384741.780060
+335624.808671 7384753.278091
+335633.665123 7384772.534792
+335636.138992 7384797.820461
+335637.392419 7384813.227822
+335642.340158 7384826.905479
+335650.149338 7384849.471614
+335657.158634 7384867.748483
+335658.964559 7384872.607651
+335665.322402 7384906.241889
+335667.004634 7384928.738036
+335668.488955 7384951.464143
+335672.669794 7384978.309545
+335674.698367 7384998.046164
+335680.223341 7385023.581790
+335685.072125 7385036.599560
+335687.430547 7385053.796615
+335691.298029 7385063.694919
+335691.652617 7385077.982472
+335692.048436 7385087.620821
+335695.577823 7385100.838557
+335700.517315 7385114.966137
+335715.154374 7385138.392124
+335726.352755 7385158.778632
+335730.508856 7385169.906726
+335736.841961 7385187.473717
+335742.037086 7385197.052076
+335746.696207 7385209.289980
+335757.185412 7385220.268099
+335761.201326 7385225.847144
+335766.915964 7385234.775614
+335777.396923 7385247.073508
+335783.136300 7385253.232453
+335792.908083 7385264.410538
+335802.242816 7385287.226630
+335809.656177 7385299.714491
+335814.554438 7385308.852926
+335837.371759 7385330.429230
+335850.384311 7385343.916920
+335864.229732 7385373.421866
+335877.819520 7385435.491234
+335882.940429 7385470.095306
+335883.575389 7385494.801074
+335884.523706 7385519.846784
+335884.334042 7385536.233977
+335884.969002 7385562.049555
+335882.965168 7385576.647055
+335875.576545 7385598.043390
+335864.625551 7385619.079787
+335865.936702 7385637.856570
+335866.274797 7385645.125325
+335860.090124 7385668.531316
+335849.848306 7385690.347579
+335839.276638 7385722.412087
+335834.741211 7385736.359698
+335824.062342 7385766.224582
+335820.203106 7385776.512820
+335812.253740 7385802.668340
+335795.884972 7385833.823003
+335786.913073 7385851.559965
+335781.668471 7385864.127812
+335777.034089 7385885.784103
+335776.267190 7385900.001667
+335776.283682 7385907.260424
+335768.301331 7385936.735375
+335762.421768 7385950.962938
+335755.890754 7385968.829878
+335747.842433 7385994.985397
+335739.967282 7386051.495718
+335730.682027 7386078.631070
+335725.330223 7386096.388028
+335723.582022 7386101.697119
+335721.314309 7386131.022096
+335720.671103 7386142.650104
+335720.275284 7386168.885610
+335713.290726 7386181.883383
+335705.720686 7386192.651539
+335699.437059 7386224.586069
+335696.773526 7386234.634348
+335685.393728 7386248.461979
+335667.994181 7386262.329604
+335659.714966 7386272.867799
+335655.624835 7386291.764562
+335658.271875 7386300.873002
+335667.169558 7386317.360178
+335666.880940 7386333.867350
+335657.224604 7386359.882894
+335609.206803 7386351.254372
+335604.118879 7386408.534560
+335575.966247 7386627.277092
+335555.482610 7386625.667367
+335545.661350 7386649.693252
+335586.818287 7386810.195759
+335612.175446 7386842.040305
+335658.750157 7386901.710084
+335706.627772 7386981.436427
+335725.008620 7387016.980339
+335743.834764 7387057.723360
+335771.937919 7387135.460044
+335775.005516 7387143.828611
+335785.544199 7387169.384234
+335819.576393 7387280.885134
+335852.569562 7387388.436712
+335905.188760 7387546.629615
+335980.353152 7387768.871547
+335990.487769 7387793.347354
+335946.642561 7387855.336736
+335928.954396 7387876.073184
+335912.321749 7387912.326974
+335908.899563 7387952.930019
+335910.433362 7387999.682011
+335908.668669 7388029.606885
+335909.460307 7388044.114400
+335906.087599 7388055.782402
+335897.651705 7388066.900497
+335892.266916 7388074.989112
+335882.989907 7388084.797432
+335789.889963 7388108.613352
+335744.403754 7388125.840401
+335647.782670 7388131.539425
+335630.539802 7388132.189314
+335610.270567 7388130.019685
+335570.787614 7388119.851427
+335549.256706 7388117.671800
+335537.852169 7388118.111725
+335522.621381 7388120.801264
+335506.623694 7388125.770413
+335489.331348 7388133.029170
+335473.548063 7388142.827492
+335440.942467 7388167.263306
+335414.711207 7388185.630160
+335385.156716 7388207.276452
+335375.483888 7388215.085114
+335365.489456 7388230.522470
+335363.625808 7388233.891893
+335356.253678 7388247.229608
+335348.832070 7388267.336164
+335344.832648 7388287.552701
+335334.739262 7388357.100788
+335328.942162 7388391.364919
+335318.073630 7388462.682703
+335314.841108 7388491.107834
+335307.477224 7388530.951009
+335296.377797 7388600.239141
+335295.833546 7388606.838011
+335276.817738 7388721.038449
+335254.948734 7388848.176672
+335241.548610 7388918.724587
+335235.578339 7388940.790808
+335227.802143 7388966.386423
+335210.006777 7389011.748653
+335208.472978 7389015.048088
+335186.562744 7389070.288626
+335151.293615 7389151.614695
+335139.682922 7389182.779357
+335124.501612 7389217.233456
+335117.178959 7389249.697895
+335117.393361 7389256.816675
+335119.619843 7389264.445369
+335123.619265 7389273.123882
+335140.449822 7389296.099946
+335152.200700 7389321.835538
+335157.808137 7389354.389962
+335156.958776 7389368.107612
+335155.078635 7389383.854915
+335150.361791 7389408.210743
+335144.119394 7389431.786704
+335133.259109 7389465.001015
+335120.906255 7389492.356329
+335109.848060 7389515.402382
+335102.187312 7389524.750781
+335092.530976 7389528.500138
+335081.093454 7389533.509280
+335054.153018 7389543.737528
+335045.486230 7389550.286407
+335038.600627 7389557.095240
+335032.960205 7389566.473634
+335030.098763 7389577.881680
+335022.759618 7389614.665379
+335012.278659 7389627.303214
+335007.429875 7389631.592480
+334998.029172 7389635.091880
+334988.653208 7389636.041717
+334978.007324 7389634.441991
+334957.243316 7389631.262536
+334929.610197 7389631.832438
+334912.870348 7389632.992240
+334892.263018 7389645.050174
+334861.949874 7389665.936597
+334832.626278 7389691.402235
+334773.509050 7389737.764293
+334746.733540 7389763.489887
+334738.297646 7389773.338200
+334730.612159 7389786.245989
+334725.466511 7389796.124297
+334722.613315 7389807.792298
+334722.761747 7389823.289644
+334723.891481 7389844.126074
+334729.251531 7389876.430541
+334733.902405 7389902.376097
+334733.547817 7389917.113572
+334731.172902 7389931.581094
+334724.996476 7389944.998796
+334712.297280 7389948.478200
+334703.416090 7389949.178080
+334665.928725 7389945.118775
+334640.332426 7389940.829510
+334627.385843 7389842.956275
+334623.526607 7389823.189661
+334619.535432 7389797.564050
+334610.423347 7389763.679854
+334594.582338 7389711.338820
+334586.096967 7389686.103142
+334582.872690 7389672.885406
+334578.139354 7389658.437881
+334572.185575 7389643.190493
+334562.331330 7389621.594192
+334519.632348 7389534.169167
+334476.933365 7389447.074086
+334459.542065 7389411.040258
+334434.844604 7389360.768869
+334398.330295 7389286.481594
+334355.656051 7389198.566653
+334336.434088 7389160.143235
+334321.162068 7389125.239213
+334306.846612 7389091.514990
+334241.948777 7388936.761498
+334209.730754 7388862.374240
+334183.895313 7388800.274877
+334172.614469 7388778.218655
+334140.272753 7388705.641087
+334131.960552 7388682.285087
+334124.415251 7388663.598288
+334120.349860 7388653.030098
+334115.600031 7388636.822875
+334112.186091 7388626.134705
+334106.001418 7388605.018322
+334100.468198 7388588.451160
+334095.833816 7388574.553541
+334089.673882 7388559.426132
+334082.631601 7388541.519199
+334075.003837 7388525.261984
+334066.683391 7388508.434866
+334060.647150 7388493.507423
+334042.761075 7388448.475137
+334019.531444 7388391.394914
+334013.082891 7388374.927735
+334006.626093 7388359.460384
+334003.121445 7388349.782042
+333988.970913 7388313.158315
+333985.045707 7388301.070386
+333982.456391 7388294.831455
+333974.069974 7388278.574239
+333947.682036 7388212.255599
+333936.392946 7388179.841151
+333934.430343 7388174.342093
+333925.375982 7388154.085563
+333919.826269 7388139.728022
+333915.002224 7388124.170687
+333909.056692 7388108.263412
+333904.991300 7388098.255126
+333900.554828 7388084.027563
+333896.085371 7388064.590893
+333891.896286 7388046.823936
+333888.672010 7388025.297623
+333887.517537 7388010.000244
+333886.973286 7387995.712691
+333888.020557 7387975.346180
+333889.142045 7387957.189290
+333892.778632 7387933.313379
+333899.721959 7387906.148033
+333907.019873 7387883.741871
+333913.575626 7387863.995253
+333919.026385 7387842.458942
+333925.425460 7387817.833160
+333929.614545 7387799.386320
+333936.805258 7387777.540062
+333956.505503 7387719.919932
+333973.946281 7387670.868334
+333981.508074 7387652.231526
+333987.791702 7387629.045498
+333995.633867 7387603.549865
+334000.870224 7387582.683439
+334003.542003 7387562.996811
+334008.621681 7387538.241052
+334011.821218 7387517.014688
+334011.227489 7387497.408046
+334010.773947 7387456.974972
+334011.441891 7387433.948916
+334011.524354 7387417.781685
+334001.018656 7387359.001754
+333997.431546 7387328.796928
+333995.139093 7387296.872396
+333987.486591 7387270.316945
+333982.563592 7387245.001281
+333974.935828 7387215.896266
+333967.085417 7387180.522326
+333961.923276 7387157.716232
+333958.410382 7387116.813238
+333953.602830 7387082.089186
+333949.471468 7387059.113122
+333944.556715 7387034.247381
+333941.934413 7387013.071009
+333939.543006 7386990.554865
+333938.306072 7386955.650844
+333937.448464 7386932.164867
+333935.469369 7386854.838112
+333934.191203 7386797.008018
+333935.510600 7386753.055547
+333932.624419 7386728.549744
+333931.849273 7386697.745021
+333930.364952 7386666.830316
+333926.687133 7386643.394331
+333919.158324 7386602.571323
+333905.749953 7386552.249943
+333879.032166 7386461.355512
+333864.823911 7386418.552844
+333856.734358 7386385.448515
+333847.836675 7386350.684469
+333844.917510 7386338.856495
+333839.442013 7386317.810100
+333837.784520 7386301.612875
+333831.476154 7386282.946072
+333844.538183 7386279.336691
+333833.603681 7386231.474889
+333813.087059 7386172.664963
+333784.249991 7386092.808641
+333748.246948 7385963.870727
+333751.726857 7385884.884257
+333752.889576 7385791.950176
+333734.929285 7385645.395279
+333734.376788 7385523.246202
+333744.651591 7385434.501403
+333741.798396 7385371.712158
+333734.665406 7385106.297622
+333730.385612 7385050.647154
+333763.617922 7385030.410620
+333826.149089 7385014.233391
+333980.939084 7384979.709305
+334051.798944 7384965.491740
+334042.769322 7384935.816823
+334037.277332 7384918.939714
+334032.642950 7384898.003301
+334029.558860 7384875.067229
+334021.329122 7384770.225188
+334018.228539 7384723.923119
+334018.937715 7384677.451079
+334020.603454 7384634.298471
+334022.632026 7384609.702684
+334023.341202 7384587.856426
+334024.347242 7384575.688510
+334026.573725 7384566.590069
+334052.640060 7384508.979937
+334080.570043 7384447.590452
+334087.183520 7384422.334778
+334089.789329 7384406.637467
+334091.554022 7384370.853596
+334094.530911 7384337.379330
+334096.023479 7384326.741153
+334100.121856 7384312.613572
+334119.063448 7384268.301163
+334156.872415 7384171.047821
+334159.082405 7384159.969719
+334162.793209 7384142.732672
+334163.090073 7384128.245153
+334166.668937 7384114.607489
+334174.074052 7384100.549897
+334187.457685 7384079.243547
+334207.091960 7384050.698436
+334229.562938 7384019.943704
+334271.049725 7383966.832802
+334311.984014 7383892.985451
+334346.313072 7383835.115364
+334444.336016 7383748.180255
+334289.991316 7383703.437919
+334164.698088 7383499.832794
+333835.805425 7383567.701169
+333720.951924 7383270.122142
+333543.451810 7383270.122142
+333538.231946 7383056.078806
+333359.684560 7383039.821590
+333376.440901 7382903.784892
+333406.490165 7382644.369328
+333415.470310 7382573.531462
+333417.911194 7382495.554818
+333450.162202 7382459.840936
+333442.583917 7382494.724960
+333505.181053 7382494.724960
+333536.500237 7382349.849776
+333567.530803 7382312.716137
+333642.373593 7382217.122511
+333673.742254 7382172.180209
+333670.732380 7382150.333951
+333699.206614 7382091.204080
+333727.936482 7382041.472598
+333657.414717 7381971.174640
+333718.593503 7381890.078531
+333679.893942 7381850.975229
+333504.744003 7381735.794958
+333306.958161 7381434.986484
+333365.160057 7381438.185936
+333397.947070 7381439.945634
+333429.422932 7381447.294376
+333458.457911 7381439.355736
+333489.406014 7381413.370187
+333496.118446 7381398.412749
+333502.072224 7381383.185357
+333522.036349 7381326.845008
+333546.387468 7381261.136263
+333611.928509 7381120.920281
+333627.596347 7381097.624271
+333641.689155 7381083.216739
+333663.211817 7381059.210851
+333674.748294 7381044.793321
+333682.705907 7381033.385275
+333693.574439 7381067.169488
+333709.044367 7381088.055910
+333722.799080 7381107.372601
+333742.565295 7381127.099222
+333767.015369 7381148.085627
+333790.055337 7381167.062377
+333823.625742 7381184.279428
+333866.959684 7381212.914523
+333894.065044 7381224.292574
+333910.128702 7381237.660284
+333923.462857 7381249.438267
+333935.955896 7381262.985946
+333951.739182 7381283.322463
+333956.686920 7381296.560195
+333961.725367 7381319.766220
+333964.166251 7381347.371492
+333969.542794 7381359.279452
+333975.158477 7381376.286539
+333986.793908 7381402.452057
+334000.045601 7381421.208844
+334015.020756 7381440.875475
+334034.399398 7381459.592269
+334052.137040 7381477.959123
+334067.235888 7381496.066022
+334082.878988 7381520.171892
+334094.027891 7381544.107792
+334098.357162 7381585.250745
+334104.195494 7381690.202768
+334110.108041 7381726.596534
+334112.598403 7381758.191122
+334114.123955 7381785.896376
+334110.619307 7381887.528968
+334110.025579 7381948.098592
+334112.087137 7382053.780490
+334116.399915 7382118.779356
+334118.411995 7382161.512037
+334118.049161 7382202.155075
+334125.413045 7382227.710697
+334133.593306 7382252.726413
+334137.427803 7382275.472516
+334137.427803 7382325.453955
+334263.257037 7382324.084190
+334388.863622 7382313.336031
+334444.336016 7382306.207252
+334490.663339 7382296.438925
+334572.012405 7382274.772636
+334575.368620 7382284.990886
+334582.617057 7382311.326375
+334588.125539 7382338.191773
+334599.076534 7382370.656212
+334609.433799 7382393.482302
+334620.747628 7382420.847615
+334641.676561 7382446.453229
+334660.972741 7382463.620288
+334680.763694 7382481.007310
+334706.071376 7382489.715818
+334729.820521 7382500.284008
+334773.113231 7382506.202994
+334798.462144 7382511.032167
+334842.249629 7382517.731020
+334873.708999 7382523.400049
+334902.265696 7382533.578305
+334941.740402 7382543.226652
+334970.585717 7382545.436274
+334994.285384 7382560.323724
+335008.369946 7382569.342179
+335016.583191 7382582.389944
+335026.445683 7382603.436339
+335031.550100 7382621.433256
+335039.021185 7382646.219011
+335047.217938 7382679.203361
+335056.635134 7382730.254616
+335061.154068 7382754.560453
+335071.115515 7382766.638384
+335084.903212 7382765.248622
+335094.345146 7382760.369458
+335114.977215 7382758.049855
+335123.627511 7382733.454068
+335133.630189 7382723.705738
+335159.308951 7382708.718305
+Region 1
+318
+329451.070188 7403010.790744
+329454.187263 7402979.256146
+329445.941033 7402943.452279
+329421.218833 7402899.869744
+329376.722172 7402867.175344
+329335.524004 7402848.498543
+329299.248836 7402832.931210
+329264.639406 7402812.694676
+329230.029975 7402780.000276
+329223.853549 7402773.411405
+329206.948776 7402745.756142
+329192.113807 7402686.606274
+329180.577330 7402650.802407
+329160.802869 7402600.990939
+329083.337779 7402507.586938
+329084.987025 7402448.437070
+329086.603286 7402389.157224
+329078.794105 7402335.956337
+329044.176429 7402293.933535
+328991.441784 7402247.231535
+328876.068771 7402181.852734
+328774.293793 7402116.863866
+328710.319535 7402074.781074
+328675.413241 7402053.494720
+328629.440505 7402030.508657
+328577.513991 7401998.164198
+328548.107932 7401973.788373
+328521.513838 7401947.792826
+328474.328907 7401889.732771
+328413.249076 7401818.374994
+328373.823847 7401768.183591
+328263.901593 7401657.802499
+328195.499110 7401557.499680
+328172.393171 7401536.823221
+328116.838316 7401463.745739
+328065.893103 7401410.154918
+328018.642201 7401351.424978
+327958.708597 7401268.679152
+327942.290351 7401226.466383
+327926.449342 7401186.993144
+327917.518675 7401143.050671
+327913.073956 7401127.793284
+327904.201012 7401085.320560
+327901.116922 7401059.754939
+327898.107048 7401043.577710
+327901.042706 7401007.563879
+327904.407168 7400986.917415
+327908.101479 7400963.101495
+327916.289986 7400940.275405
+327931.529020 7400859.829184
+327956.251220 7400744.768893
+327975.201058 7400663.912743
+327983.892585 7400597.324149
+327993.862278 7400518.667622
+327992.633590 7400467.596370
+327988.617675 7400446.999898
+327983.678183 7400425.183635
+327974.228003 7400391.519401
+327951.526130 7400352.696052
+327918.706132 7400303.074551
+327857.337683 7400201.801898
+327828.179012 7400148.161087
+327801.354023 7400085.171876
+327774.529035 7400016.363662
+327739.078490 7399947.095527
+327707.833522 7399873.848074
+327705.541070 7399867.899093
+327677.677056 7399805.989697
+327630.285969 7399704.737041
+327582.886635 7399576.558997
+327557.026456 7399446.221322
+327535.421331 7399299.876390
+327502.287977 7399141.383538
+327116.537553 7399213.321216
+326901.277948 7399224.829245
+326675.413691 7399212.761312
+326431.391234 7399199.933509
+325865.040113 7399134.584703
+325848.283772 7399287.228557
+325848.663099 7399360.046084
+325841.117798 7399467.767632
+325818.366447 7399623.241001
+325807.506162 7399784.473383
+325796.983971 7399896.474198
+325791.747615 7399940.596640
+325777.316711 7400062.595743
+325753.847939 7400268.760429
+325734.518774 7400359.634863
+325730.222488 7400377.501803
+325722.710172 7400408.436504
+325712.410630 7400435.801816
+325700.008299 7400460.837528
+325687.292611 7400489.502618
+325672.210255 7400513.638484
+325653.746945 7400559.130691
+325600.402079 7400624.149554
+325531.298666 7400737.030219
+325504.382969 7400777.403303
+325490.001543 7400798.359713
+325469.559137 7400839.192719
+325459.812093 7400866.548033
+325452.266792 7400885.674757
+325445.513129 7400911.960255
+325440.260280 7400930.137141
+325437.101973 7400963.271466
+325429.960738 7401012.543026
+325404.686041 7401165.676795
+325396.901599 7401218.937672
+325378.025977 7401290.855353
+325334.692035 7401351.804913
+325319.939528 7401454.757278
+325295.332776 7401559.709301
+325317.770770 7401615.439755
+325334.428156 7401639.375655
+325358.853491 7401669.910425
+325400.628895 7401715.752572
+325422.060849 7401743.917748
+325461.618017 7401805.247243
+325492.153809 7401853.069051
+325522.755571 7401904.430254
+325547.931313 7401941.353929
+325562.485910 7401978.527561
+325571.276392 7402011.051990
+325574.797533 7402035.667774
+325572.166985 7402067.322352
+325568.654091 7402092.817984
+325559.863609 7402146.438800
+325576.562226 7402223.805547
+325615.253540 7402327.537779
+325643.373187 7402360.072206
+325670.626979 7402426.880763
+325689.222229 7402507.526949
+325661.531387 7402516.755368
+325607.172234 7402544.450624
+325584.602301 7402560.857813
+325568.192302 7402578.294827
+325554.858147 7402587.533244
+325532.469631 7402616.238327
+325498.981688 7402642.113895
+325476.518956 7402659.600900
+325452.918244 7402678.627641
+325435.419742 7402683.926733
+325340.621075 7402744.286394
+325327.690985 7402759.463794
+325303.496544 7402856.757129
+325308.213388 7402891.541170
+325303.240911 7402919.366404
+325303.983072 7402945.681897
+325312.328257 7402968.198040
+325322.586568 7402987.674704
+325332.836633 7403010.960715
+325343.103190 7403031.187250
+325327.872402 7403108.054084
+325278.329048 7403244.890645
+325279.079455 7403282.244247
+325281.487355 7403335.245168
+325292.413610 7403389.865812
+325309.005026 7403476.091042
+325292.487827 7403542.149727
+325216.993585 7403598.770029
+325016.461748 7403899.578503
+324981.077172 7403970.356379
+324973.696796 7404063.260465
+324986.239313 7404087.686282
+324952.124657 7404184.599681
+324934.766341 7404234.041212
+324930.197929 7404250.428405
+324926.759251 7404265.295859
+324922.949493 7404278.263637
+324965.161947 7404294.360880
+324996.951166 7404312.427785
+325036.656767 7404316.237133
+325061.378966 7404327.725165
+325099.088979 7404353.840692
+325135.916645 7404382.235828
+325160.333734 7404397.323244
+325197.598450 7404415.070204
+325223.367921 7404405.861781
+325248.403477 7404390.224460
+325269.703491 7404354.720541
+325290.112912 7404344.962213
+325317.177041 7404353.840692
+325351.786471 7404357.830008
+325371.082651 7404360.049628
+325391.063268 7404354.720541
+325497.678784 7404348.431618
+325543.692751 7404341.852745
+325568.538644 7404344.962213
+325614.799998 7404361.549371
+325643.076322 7404363.599020
+325777.217756 7404381.405970
+325882.621077 7404389.244627
+325923.060592 7404374.857092
+325962.947609 7404341.522802
+325983.794080 7404366.528518
+325993.903959 7404364.148926
+326013.546481 7404352.830865
+326056.410387 7404326.045453
+326108.262686 7404297.770296
+326158.119396 7404269.645114
+326202.640795 7404244.569409
+326249.446401 7404221.783312
+326259.778928 7404141.317095
+326495.480938 7403846.597578
+326524.153082 7403809.313964
+326560.032432 7403765.221517
+326608.223404 7403691.404161
+326633.860935 7403661.669254
+326663.596842 7403623.725754
+326655.070240 7403576.513841
+326626.678468 7403523.252964
+326660.496260 7403486.349285
+326717.189095 7403430.558842
+326736.369828 7403293.582304
+326732.271451 7403262.817574
+326743.593526 7403111.643469
+326763.920484 7402997.782972
+326765.083203 7402981.755717
+326762.419670 7402968.408004
+326819.821682 7402834.111008
+326927.063912 7402571.326020
+326978.792516 7402586.603403
+327006.549329 7402593.992138
+327032.797081 7402587.183304
+327051.746919 7402583.373957
+327064.058541 7402573.695614
+327064.932642 7402554.358927
+327196.806362 7402561.387723
+327325.158942 7402571.935916
+327323.039661 7402595.761835
+327378.198698 7402591.292600
+327582.127982 7402568.406520
+327570.129716 7402507.167010
+327650.258339 7402500.298187
+327739.639233 7402491.329723
+327748.380238 7402488.600191
+327763.949121 7402483.900995
+327773.778628 7402476.202314
+327788.456919 7402462.054738
+327764.716021 7402423.371364
+327821.862399 7402406.664225
+327851.746739 7402411.943321
+327833.291675 7402383.808140
+327787.582818 7402253.700427
+327870.218296 7402230.844342
+327923.843533 7402213.257354
+327942.306844 7402219.416299
+327958.090129 7402207.998255
+327984.552283 7402199.229757
+328007.353111 7402197.390072
+328032.652547 7402200.789490
+328094.812633 7402214.357166
+328163.784107 7402243.342201
+328182.296894 7402228.564732
+328183.377151 7402216.366822
+328181.653688 7402197.370076
+328201.007592 7402206.728473
+328213.343953 7402224.055505
+328223.808419 7402237.933128
+328232.293791 7402257.869713
+328238.057906 7402282.325524
+328236.029333 7402320.778937
+328228.401570 7402351.143736
+328210.152662 7402387.717471
+328210.762883 7402396.156025
+328199.919089 7402417.172425
+328192.052185 7402434.799406
+328185.760311 7402448.567048
+328181.332085 7402460.035083
+328178.000608 7402474.172662
+328175.493754 7402487.880314
+328174.809317 7402502.707774
+328183.088533 7402528.173412
+328193.503522 7402542.600941
+328210.787621 7402556.938485
+328301.496158 7402640.044250
+328319.522419 7402651.332316
+328333.672950 7402656.931357
+328348.598628 7402664.820006
+328354.882256 7402667.359571
+328361.982260 7402669.659177
+328382.193772 7402671.788812
+328409.736182 7402675.238221
+328485.552026 7402682.776930
+328513.737643 7402683.316837
+328552.330002 7402676.837947
+328613.376848 7402664.620040
+328660.883382 7402651.672258
+328689.778175 7402646.493145
+328700.828124 7402646.403160
+328723.431042 7402648.982718
+328748.631523 7402648.982718
+328811.805896 7402658.481091
+328841.640758 7402670.049110
+328854.727526 7402672.848630
+328892.190152 7402697.084479
+328910.620478 7402711.801958
+328929.001326 7402719.270679
+328951.546520 7402745.796135
+328968.789389 7402756.414316
+328999.457120 7402798.337135
+329033.777932 7402837.310460
+329065.608383 7402877.103643
+329106.724089 7402922.195920
+329134.678811 7402953.100626
+329153.488463 7402968.188041
+329160.423543 7402975.756745
+329184.947833 7402990.424233
+329194.150626 7402996.063267
+329200.261083 7402997.922948
+329218.188388 7403000.442517
+329231.390604 7403008.411152
+329258.916521 7402986.344931
+329295.702956 7402978.486277
+329312.640714 7402975.006873
+329374.627630 7402976.576605
+329426.356235 7402999.122743
+329451.070188 7403010.790744
+Region 1
+526
+354751.882933 7396032.606044
+354559.861206 7395710.631195
+354581.408607 7395691.084543
+354551.953071 7395633.974326
+354544.490232 7395619.976724
+354526.529942 7395587.632264
+354522.563505 7395555.887701
+354523.363389 7395517.804225
+354532.970248 7395469.552490
+354513.838993 7395420.990808
+354488.712728 7395367.290007
+354466.373689 7395330.736268
+354453.451846 7395304.170818
+354442.418389 7395257.528808
+354434.493762 7395215.226054
+354430.510832 7395194.039683
+354431.516873 7395169.923814
+354430.510832 7395158.335798
+354437.017108 7395132.460231
+354442.352420 7395084.338474
+354442.418389 7395072.630479
+354458.275891 7395015.500265
+354465.433619 7394985.345430
+354474.158131 7394967.888420
+354494.699492 7394904.699244
+354509.856064 7394841.720032
+354536.318218 7394744.396702
+354581.276667 7394600.481354
+354616.207700 7394514.786033
+354636.147086 7394477.262460
+354629.921182 7394474.212983
+354623.753001 7394471.743406
+354619.563916 7394470.013702
+354611.177500 7394466.074377
+354602.799329 7394462.375010
+354595.155074 7394461.145221
+354587.510818 7394460.405348
+354581.095250 7394458.925601
+354562.112427 7394426.001241
+354549.429725 7394408.144299
+354543.245052 7394396.946218
+354534.842143 7394381.178918
+354526.150615 7394367.921189
+354511.546541 7394360.402477
+354499.144210 7394358.212852
+354488.077769 7394351.494003
+354486.948035 7394341.885649
+354487.582995 7394332.547249
+354492.011221 7394324.778579
+354499.770924 7394314.270379
+354510.837365 7394302.802344
+354521.169892 7394289.804570
+354527.247364 7394272.467540
+354530.809736 7394254.070691
+354529.886158 7394247.751773
+354526.356771 7394227.995157
+354521.532726 7394210.758110
+354516.700435 7394193.521062
+354515.917043 7394177.343834
+354519.429937 7394161.976466
+354524.847711 7394155.487577
+354529.787203 7394146.969036
+354528.921349 7394136.350855
+354526.587666 7394122.423241
+354518.918671 7394108.675596
+354513.467913 7394099.007252
+354504.149672 7394076.401124
+354493.619236 7394049.735692
+354485.983226 7394033.718435
+354478.652327 7394014.171783
+354479.815045 7394003.333640
+354481.794141 7393988.956103
+354477.901920 7393977.288101
+354474.248840 7393966.879884
+354469.078453 7393955.701799
+354459.331409 7393945.213595
+354454.466132 7393930.746073
+354449.073098 7393917.538336
+354444.479947 7393901.061158
+354442.476113 7393881.584494
+354437.602591 7393867.626885
+354432.151832 7393858.208499
+354418.652753 7393844.390865
+354404.576437 7393834.852499
+354399.117432 7393826.443939
+354389.609528 7393816.715606
+354384.752499 7393801.748170
+354381.668408 7393786.800730
+354384.265971 7393764.614530
+354385.898725 7393738.618983
+354387.399539 7393722.471749
+354391.390714 7393709.393989
+354391.885488 7393691.966974
+354389.815684 7393676.789574
+354529.811942 7393517.606840
+354668.934099 7393361.813526
+354818.058934 7393317.371139
+354851.695309 7393306.463008
+354866.489047 7393300.853968
+354888.572452 7393299.884134
+354902.294180 7393298.304405
+354929.457264 7393297.154602
+354949.264710 7393295.914814
+354976.254623 7393288.696051
+355001.182978 7393283.736900
+355022.268590 7393281.747241
+355053.744452 7393280.407471
+355090.522641 7393280.907385
+355112.045303 7393283.976859
+355141.641025 7393289.935838
+355165.992144 7393307.942754
+355184.034896 7393323.340117
+355199.892398 7393332.648522
+355213.358493 7393348.995722
+355228.844914 7393365.882829
+355240.290682 7393381.950077
+355247.357702 7393401.996643
+355249.048179 7393415.574318
+355250.986043 7393432.611399
+355256.436802 7393459.456801
+355253.921701 7393474.234270
+355265.796273 7393470.724871
+355278.990242 7393465.445775
+355287.343674 7393461.046529
+355295.260055 7393451.808111
+355309.938346 7393439.580206
+355316.906411 7393436.550725
+355323.956938 7393435.620884
+355330.578661 7393436.900665
+355337.802359 7393440.080120
+355345.388892 7393446.579007
+355352.794007 7393451.408180
+355360.916544 7393455.807426
+355368.569046 7393456.547299
+355382.455698 7393455.797428
+355395.641421 7393454.717613
+355408.604496 7393454.177705
+355419.819369 7393455.947402
+355435.924258 7393458.656938
+355448.120433 7393460.056698
+355458.147849 7393461.316483
+355478.763426 7393461.736411
+355497.474123 7393459.046871
+355520.390398 7393453.837764
+355533.848247 7393445.779144
+355546.885537 7393437.820507
+355558.496230 7393430.081833
+355570.271848 7393426.652420
+355581.297058 7393426.532441
+355590.170002 7393427.732235
+355596.049565 7393431.441600
+355603.759790 7393436.500733
+355611.041212 7393443.999449
+355621.266538 7393452.178048
+355627.789306 7393452.907923
+355635.260391 7393451.318195
+355647.769923 7393446.019103
+355657.418013 7393440.360072
+355670.694444 7393429.961853
+355691.474946 7393413.004758
+355702.780528 7393405.476047
+355719.693547 7393398.997157
+355738.932003 7393394.207978
+355751.581721 7393394.547919
+355768.585448 7393399.477075
+355776.889403 7393405.985960
+355782.117513 7393414.344528
+355784.162578 7393424.222836
+355785.531452 7393430.431773
+355792.928321 7393435.930831
+355807.474672 7393441.169933
+355822.301395 7393448.958599
+355836.460173 7393452.198044
+355844.599202 7393454.827594
+355852.086780 7393461.986368
+355861.289573 7393470.494910
+355872.677618 7393474.704189
+355885.005733 7393477.153770
+355895.709340 7393479.253410
+355918.543153 7393492.761096
+355945.780452 7393504.769039
+355972.877566 7393520.766299
+355994.408475 7393532.714253
+356091.796459 7393545.162121
+356153.709158 7393544.252276
+356220.206762 7393530.774585
+356562.227424 7393415.704295
+356626.193436 7393350.595448
+356673.353629 7393314.431643
+356710.626591 7393275.248354
+356756.756005 7393224.587032
+356860.303924 7393114.835832
+356898.698374 7393073.692879
+356949.016873 7393013.473194
+356986.990765 7392986.037893
+357071.885710 7392930.567395
+357159.782282 7392875.006912
+357234.921936 7392824.855503
+357302.705952 7392777.373636
+357480.420468 7392694.647806
+357550.736077 7392660.253697
+357552.459539 7392625.719613
+357577.025060 7392628.839078
+357594.243190 7392632.658424
+357605.326124 7392637.087665
+357621.876309 7392635.807885
+357632.002680 7392633.468285
+357646.235674 7392628.629114
+357661.557171 7392627.779260
+357668.888070 7392629.618945
+357678.643361 7392634.368131
+357687.005038 7392635.227984
+357699.151736 7392635.457945
+357708.585424 7392630.778746
+357723.296700 7392619.080750
+357729.192754 7392611.052125
+357740.597291 7392592.775256
+357749.734115 7392576.807991
+357756.479532 7392565.799876
+357765.410199 7392549.942593
+357774.901611 7392539.514379
+357785.374324 7392533.855348
+357801.949247 7392529.256136
+357827.298160 7392526.066682
+357849.348581 7392526.176663
+357867.399580 7392527.896369
+357890.142684 7392530.006008
+357909.587296 7392535.395084
+357926.780687 7392541.104107
+357956.277454 7392552.132218
+357968.696277 7392554.911741
+357988.182120 7392556.651443
+358008.674004 7392558.951050
+358046.037675 7392568.839356
+358060.666488 7392576.618023
+358070.009467 7392581.587172
+358098.302284 7392600.683901
+358131.270715 7392589.875752
+358146.542734 7392583.656818
+358160.792220 7392577.587857
+358181.737646 7392564.950022
+358192.523716 7392557.521294
+358203.012921 7392549.872605
+358221.105151 7392547.393029
+358231.742789 7392544.943449
+358247.855923 7392535.914995
+358258.452330 7392527.486439
+358279.876037 7392517.948073
+358294.636790 7392512.339034
+358317.371648 7392504.030457
+358336.206039 7392499.231279
+358379.127669 7392493.552252
+358391.299106 7392491.452611
+358412.129084 7392490.772728
+358434.880435 7392492.102500
+358458.745026 7392493.662233
+358479.731683 7392497.741534
+358490.468275 7392507.029943
+358505.418691 7392512.049083
+358514.151450 7392516.678290
+358532.218941 7392517.408165
+358547.919764 7392519.217855
+358560.264372 7392519.337835
+358571.182381 7392520.327665
+358588.408757 7392522.817239
+358600.497731 7392528.476270
+358609.329444 7392533.655382
+358620.272192 7392541.733999
+358637.614015 7392553.751940
+358650.667798 7392565.389947
+358662.212521 7392575.358239
+358672.429601 7392584.316705
+358683.141454 7392596.164675
+358695.700464 7392606.132968
+358803.148849 7392630.878729
+358809.044904 7392644.106463
+358815.122376 7392659.343853
+358820.449441 7392678.440582
+358820.152577 7392699.147035
+358812.648507 7392725.312553
+358807.255472 7392744.869203
+358804.286829 7392756.247254
+358805.086713 7392768.545148
+358814.495662 7392787.681870
+358829.437832 7392804.768943
+358842.466877 7392819.176475
+358857.458524 7392831.174420
+358878.041116 7392845.661939
+358899.167959 7392856.830026
+358910.226154 7392864.018794
+358922.315128 7392869.787806
+358935.937901 7392875.566816
+358945.660207 7392883.515455
+358954.401212 7392898.002973
+358957.757427 7392910.210882
+358954.854754 7392935.876486
+358949.263810 7392954.313328
+358943.813051 7392980.178897
+358941.685524 7392999.645563
+358946.113750 7393027.260832
+358948.043368 7393049.766977
+358951.770664 7393075.492571
+358956.974035 7393096.798921
+358968.205402 7393128.803439
+358976.492863 7393147.600219
+358993.405882 7393172.126018
+359005.923661 7393186.423569
+359024.997192 7393199.341356
+359045.612769 7393210.499445
+359064.570853 7393213.228978
+359085.343108 7393218.638051
+359119.144407 7393228.156421
+359130.219095 7393233.355530
+359146.901220 7393239.714441
+359160.837350 7393254.801857
+359169.240259 7393273.158712
+359173.586022 7393298.664343
+359175.408439 7393331.798668
+359177.568952 7393394.157986
+359182.632137 7393429.871869
+359191.084524 7393453.207871
+359201.491267 7393475.344080
+359208.500563 7393499.439952
+359213.250392 7393515.657174
+359218.758874 7393536.973523
+359223.566426 7393556.950101
+359228.258531 7393567.958216
+359233.865968 7393579.636215
+359236.001742 7393591.284220
+359225.891863 7393591.414198
+359200.872799 7393581.985813
+359183.283589 7393574.057171
+359167.112731 7393567.588279
+359150.908888 7393565.108704
+359130.441743 7393559.489666
+359116.810724 7393554.930447
+359103.286906 7393549.701343
+359090.925806 7393539.723052
+359077.632882 7393530.964552
+359063.779215 7393528.165032
+359051.665502 7393524.505659
+359040.788724 7393520.306378
+359031.981749 7393512.357740
+359024.832267 7393502.099497
+359009.675696 7393496.640432
+358978.504944 7393479.283405
+358967.430256 7393473.314427
+358958.375895 7393470.674880
+358939.450795 7393463.846049
+358922.743932 7393460.476626
+358918.142535 7393461.206501
+358908.247059 7393460.776575
+358895.020105 7393466.965515
+358885.066904 7393471.634715
+358875.361091 7393472.754523
+358860.839479 7393475.823998
+358850.020424 7393475.614033
+358836.216234 7393477.253753
+358824.580802 7393477.803658
+358807.849200 7393476.093951
+358797.236302 7393475.873989
+358782.244654 7393474.734184
+358768.019906 7393478.033619
+358754.463103 7393486.872105
+358739.710597 7393492.261182
+358732.214773 7393496.950379
+358718.971327 7393504.359110
+358707.591528 7393519.636493
+358702.091292 7393529.334832
+358697.720790 7393537.593417
+358692.566896 7393542.862514
+358681.261314 7393551.061110
+358667.424139 7393556.900110
+358652.168612 7393561.189375
+358642.042241 7393563.638956
+358623.422252 7393567.438305
+358615.555348 7393568.248166
+358598.799007 7393569.857890
+358570.069140 7393574.237140
+358542.147403 7393580.386087
+358527.122771 7393582.235770
+358510.341691 7393585.945135
+358493.585351 7393587.784820
+358481.793241 7393592.873948
+358468.599272 7393595.513496
+358460.394272 7393599.642788
+358448.742348 7393601.302504
+358438.112957 7393602.632276
+358432.992048 7393604.022038
+358424.424214 7393614.020326
+358404.814678 7393635.756602
+358396.354045 7393645.754890
+358388.915945 7393654.203443
+358380.884116 7393661.662165
+358369.397117 7393667.091235
+358351.601751 7393670.570639
+358340.131244 7393674.220014
+358330.227521 7393674.899898
+358324.916949 7393674.739925
+358318.080824 7393674.669937
+358309.191387 7393675.579781
+358299.732960 7393682.248639
+358294.240971 7393690.277264
+358288.542825 7393699.305717
+358283.347700 7393708.224189
+358278.177314 7393715.812890
+358272.998681 7393723.291609
+358260.151053 7393731.700168
+358248.161034 7393736.569334
+358235.486578 7393738.658976
+358227.034191 7393746.657606
+358210.277850 7393759.235452
+358203.177846 7393764.704515
+358190.338465 7393773.103076
+358182.933350 7393778.342179
+358168.386999 7393783.961216
+358136.564795 7393791.629903
+358104.618897 7393790.540089
+358093.156637 7393793.979500
+358085.982416 7393796.899000
+358082.898326 7393799.078627
+358078.527823 7393807.127248
+358075.922014 7393812.966248
+358069.753834 7393817.115537
+358058.308066 7393818.775253
+358055.380654 7393826.054006
+358054.753940 7393837.572033
+358052.222348 7393867.106974
+358046.309800 7393877.135257
+358044.817232 7393894.062357
+358043.885408 7393905.460405
+358039.935464 7393913.169084
+358033.882731 7393926.506800
+358021.274244 7393942.444070
+358014.380395 7393958.321350
+358007.461808 7393966.559939
+358003.495371 7393975.828351
+357999.998969 7393988.636157
+357995.966562 7394004.773393
+357992.503145 7394014.261768
+357980.133799 7394026.759627
+357965.884313 7394032.828588
+357956.104283 7394040.817219
+357941.871289 7394045.886351
+357926.285913 7394052.705183
+357912.704371 7394063.203385
+357900.005176 7394078.360788
+357892.352674 7394098.447348
+357892.946403 7394111.075185
+357895.576950 7394124.502885
+357897.572538 7394139.250359
+357902.561508 7394151.368283
+357904.557095 7394166.555681
+357905.200301 7394174.204371
+357904.293216 7394183.502779
+357903.188221 7394192.131301
+357900.565920 7394199.080110
+357897.968357 7394203.929280
+357881.286233 7394218.496784
+357870.648595 7394231.564546
+357864.571123 7394247.341843
+357862.905384 7394260.949513
+357862.707475 7394270.807824
+357865.371007 7394280.686132
+357869.758002 7394291.584265
+357875.142791 7394304.372075
+357877.822816 7394312.700648
+357880.140006 7394326.338312
+357878.499007 7394337.736360
+357878.960795 7394352.913760
+357879.546278 7394365.981522
+357881.368695 7394378.619357
+357886.200986 7394395.946389
+357887.627584 7394406.254623
+357890.010745 7394413.143443
+357889.738619 7394431.310331
+357883.471484 7394445.417915
+357875.917936 7394456.086087
+357863.639299 7394469.033870
+357854.741616 7394481.801683
+357843.353572 7394498.078894
+357834.521859 7394513.826197
+357822.795719 7394533.642803
+357817.551116 7394547.770383
+357812.702332 7394563.777641
+357813.221845 7394578.515117
+357813.658895 7394590.813010
+357827.108497 7394635.795305
+357811.927187 7394653.252315
+357802.988273 7394659.701210
+357785.539248 7394669.499532
+357767.653174 7394681.947399
+357748.777552 7394691.175819
+357733.678704 7394700.554212
+357718.439670 7394713.472000
+357703.101681 7394726.719730
+357698.318867 7394704.413551
+357634.476549 7394756.894562
+357579.259789 7394818.504009
+357560.219242 7394835.961018
+357392.243524 7395038.926252
+357333.266482 7395104.974939
+357303.118263 7395131.150455
+357277.719873 7395148.607465
+357179.317602 7395214.476182
+357053.150274 7395295.412319
+357022.581497 7395314.389068
+356973.137098 7395338.714901
+356839.482191 7395377.988174
+356760.590503 7395401.434158
+356526.595462 7395463.833469
+356474.602978 7395476.831243
+356425.199810 7395492.428571
+356201.611512 7395549.628774
+356032.868894 7395597.570562
+355772.626101 7395656.220515
+355426.696726 7395723.299025
+355197.237112 7395785.968291
+355105.217424 7395804.365139
+355031.611569 7395825.071593
+354978.703753 7395859.575682
+354925.795938 7395887.180954
+354877.489518 7395937.782286
+354860.007509 7395950.550099
+354822.635592 7395978.975230
+354751.882933 7396032.606044
+Region 1
+1464
+352640.699455 7390122.748349
+352645.828611 7390119.808853
+352686.061970 7390107.810908
+352697.120166 7390104.491476
+352730.302998 7390092.863468
+352759.065850 7390084.954823
+352767.155402 7390082.155302
+352774.725442 7390080.685554
+352782.880964 7390081.095484
+352792.240436 7390084.184955
+352798.021044 7390087.564376
+352801.459722 7390091.473706
+352805.170526 7390097.492675
+352809.343118 7390108.500789
+352809.994571 7390115.479594
+352810.126510 7390122.018474
+352810.274942 7390128.107431
+352810.225465 7390132.536672
+352809.260656 7390137.405838
+352808.996777 7390143.044872
+352805.797239 7390177.009055
+352804.972616 7390188.407102
+352803.752174 7390197.475549
+352800.775285 7390209.853429
+352800.272265 7390219.371798
+352801.121626 7390226.130641
+352802.927551 7390229.030144
+352807.792827 7390232.069623
+352819.090163 7390235.179091
+352824.903756 7390236.228911
+352830.090635 7390237.948616
+352836.390755 7390240.108246
+352854.804588 7390246.717114
+352873.292637 7390254.875717
+352892.943405 7390259.954847
+352902.525525 7390261.264622
+352920.576524 7390261.894515
+352938.644015 7390262.294446
+352952.909994 7390264.324098
+352962.690023 7390266.303759
+352975.834515 7390268.533377
+352982.654148 7390269.933138
+352986.637077 7390269.753168
+352998.387956 7390268.543376
+353004.234533 7390265.723859
+353009.693538 7390260.684722
+353014.459859 7390253.755909
+353015.977166 7390244.907424
+353016.084367 7390233.949301
+353015.457653 7390225.300783
+353015.985412 7390213.902735
+353017.477980 7390206.943927
+353019.687970 7390200.205081
+353022.805045 7390195.475891
+353026.301447 7390192.526397
+353032.238733 7390190.476748
+353042.027009 7390191.796522
+353053.728410 7390195.565876
+353061.653037 7390199.185256
+353069.569419 7390203.474521
+353081.468730 7390207.583817
+353089.401604 7390210.433329
+353095.107995 7390211.373168
+353107.452602 7390211.723108
+353122.939024 7390213.982721
+353132.521144 7390215.742420
+353137.411158 7390216.232336
+353141.913600 7390215.392480
+353145.220339 7390211.213196
+353146.490258 7390206.573990
+353145.566681 7390197.265585
+353143.117550 7390186.497429
+353143.463892 7390183.177998
+353143.909188 7390178.978717
+353146.284103 7390176.009226
+353149.368193 7390174.379505
+353154.060298 7390174.649459
+353157.301067 7390176.789092
+353161.984926 7390177.828914
+353167.592363 7390178.768753
+353170.462051 7390177.688938
+353174.494458 7390172.529822
+353178.040337 7390164.921125
+353180.233834 7390159.742012
+353180.266819 7390156.082639
+353178.164030 7390152.303287
+353174.923262 7390149.943691
+353170.025001 7390149.443776
+353156.443459 7390150.643571
+353149.401178 7390150.353620
+353142.383636 7390147.954032
+353139.151113 7390144.934549
+353137.460636 7390140.035388
+353137.823470 7390135.056241
+353140.404540 7390131.876785
+353145.327540 7390129.157251
+353156.699092 7390124.837991
+353165.102001 7390121.598546
+353171.064026 7390117.449257
+353173.381217 7390113.969853
+353176.564262 7390108.430801
+353180.365774 7390096.172901
+353186.138135 7390079.625736
+353188.842899 7390074.776566
+353191.935235 7390072.256998
+353202.721305 7390064.618306
+353220.467194 7390055.709832
+353225.423178 7390050.670695
+353230.016329 7390040.412452
+353237.800770 7390027.204715
+353248.504378 7390018.226253
+353258.358623 7390012.907164
+353272.698818 7390007.728051
+353284.276526 7390002.758902
+353302.179093 7389998.729592
+353313.113595 7389997.729764
+353332.805594 7389999.089531
+353347.071573 7390000.169346
+353355.515713 7390002.918875
+353363.910376 7390010.307609
+353374.828385 7390020.825807
+353382.513872 7390029.434333
+353386.232922 7390033.563626
+353392.170208 7390042.492096
+353400.490655 7390057.189579
+353409.239905 7390070.237344
+353416.282186 7390080.155645
+353424.297523 7390084.784852
+353435.998924 7390088.994131
+353445.465597 7390090.753829
+353454.148878 7390090.503872
+353462.131229 7390088.044293
+353467.177922 7390083.885006
+353471.012419 7390077.606081
+353473.181178 7390075.526438
+353477.691866 7390072.916885
+353487.339956 7390068.137703
+353496.254131 7390064.238371
+353503.667493 7390057.559515
+353508.516276 7390053.070284
+353514.585502 7390047.701204
+353529.626627 7390023.485352
+353540.338480 7390014.076963
+353549.120716 7390004.458611
+353598.218773 7389995.020228
+353645.263519 7390001.399135
+353691.912446 7390011.767359
+353703.415938 7390025.564996
+353713.814434 7390026.774788
+353729.878092 7390022.945444
+353762.203316 7390015.746677
+353771.653496 7390009.747705
+353792.401012 7389996.439984
+353804.382786 7389992.020741
+353827.134136 7389983.172257
+353837.606849 7389976.293435
+353839.899301 7389971.784208
+353844.871778 7389964.745413
+353849.794778 7389952.387530
+353852.210923 7389944.878816
+353862.980501 7389939.669709
+353879.266806 7389934.080666
+353895.487142 7389935.020505
+353904.368332 7389934.110661
+353919.887738 7389933.600748
+353926.509462 7389935.210473
+353934.343381 7389937.290116
+353938.590189 7389941.429407
+353940.717717 7389952.967431
+353941.872189 7389960.616121
+353944.560460 7389967.174997
+353945.492284 7389976.273439
+353951.041998 7389981.972463
+353953.260234 7389985.201909
+353962.825861 7389987.631493
+353966.190323 7389988.441355
+353974.733418 7389991.070904
+353979.994513 7389995.660118
+353982.814724 7389999.789411
+353988.784995 7390004.608585
+353993.386392 7390003.878710
+354000.032854 7390002.728907
+354006.365959 7390001.799067
+354012.707310 7390000.859228
+354017.514863 7389999.139522
+354018.883737 7389995.160204
+354018.933215 7389990.620981
+354019.023923 7389981.212593
+354020.293843 7389966.385133
+354022.124506 7389956.766780
+354024.598375 7389943.948976
+354028.762722 7389935.680392
+354032.102445 7389928.411637
+354043.234856 7389917.883441
+354053.905479 7389912.454370
+354064.361699 7389907.575206
+354085.546266 7389901.806194
+354099.012360 7389902.386095
+354112.981475 7389903.635881
+354119.545475 7389900.156477
+354141.397986 7389898.936686
+354152.629352 7389898.276799
+354163.547361 7389899.156648
+354180.748999 7389903.645879
+354186.240988 7389905.475566
+354198.610334 7389914.014103
+354205.726831 7389916.413692
+354212.496987 7389922.792600
+354218.252856 7389929.381471
+354226.012559 7389939.319769
+354230.176905 7389951.757638
+354238.085040 7389966.785064
+354255.360893 7389963.975545
+354269.330008 7389965.105352
+354289.244655 7389974.493744
+354315.772779 7389985.501858
+354323.103678 7389987.131579
+354332.240502 7389991.760786
+354337.831446 7389994.580303
+354340.552702 7389997.379823
+354344.486154 7390002.179001
+354347.025993 7390003.758731
+354349.557586 7390005.888366
+354356.888485 7390007.178145
+354359.444817 7390007.198142
+354361.522867 7390002.908876
+354362.867002 7390001.699084
+354365.637736 7390000.179344
+354378.773981 7390002.858885
+354381.808594 7390005.208483
+354384.002092 7390010.767530
+354389.386880 7390013.367085
+354391.069111 7390018.926133
+354394.120217 7390019.286071
+354399.406050 7390022.105588
+354408.979924 7390023.975268
+354419.700024 7390023.305383
+354423.122210 7390027.994579
+354426.948461 7390033.013720
+354429.174943 7390035.583280
+354436.002822 7390036.203173
+354441.313395 7390036.263163
+354449.658580 7390037.892884
+354452.998303 7390040.912367
+354458.251152 7390046.501409
+354460.403419 7390056.159755
+354462.390760 7390061.718803
+354465.293433 7390067.397830
+354466.744770 7390075.156501
+354469.457780 7390079.725718
+354475.527006 7390084.664872
+354478.784267 7390085.244773
+354487.467547 7390085.004814
+354490.741301 7390083.815018
+354500.999612 7390079.155816
+354506.862682 7390073.896717
+354512.024822 7390068.637618
+354519.908219 7390065.498155
+354528.632731 7390061.048918
+354538.058173 7390056.939621
+354546.007539 7390048.371089
+354546.370373 7390042.292130
+354551.037740 7390035.363317
+354556.356558 7390033.643612
+354561.963995 7390034.473470
+354562.623694 7390040.012521
+354564.099769 7390045.121646
+354568.363070 7390047.381259
+354575.999080 7390049.230942
+354584.542175 7390052.410397
+354587.378878 7390054.660012
+354589.893978 7390058.229401
+354593.101762 7390064.128390
+354595.823018 7390067.697779
+354601.380978 7390072.846897
+354609.734409 7390075.146503
+354619.275298 7390080.335614
+354634.266945 7390081.035494
+354645.184955 7390081.145475
+354655.591698 7390082.025324
+354669.593798 7390079.945681
+354680.792179 7390071.977046
+354688.700314 7390067.067887
+354695.874535 7390064.598310
+354701.020183 7390060.439022
+354711.938192 7390060.549003
+354716.011830 7390061.588825
+354721.437850 7390069.497470
+354726.517528 7390072.316987
+354731.951794 7390079.465763
+354740.577351 7390084.644876
+354752.707556 7390086.314590
+354762.899897 7390087.414401
+354772.284108 7390088.284252
+354791.745212 7390091.573689
+354805.219553 7390091.263742
+354813.911080 7390089.803992
+354825.546512 7390089.913973
+354835.977993 7390087.254429
+354842.830611 7390085.654703
+354850.483113 7390086.514556
+354855.232942 7390091.323732
+354856.906927 7390097.092744
+354863.487419 7390102.811764
+354866.225167 7390103.831589
+354872.855137 7390104.891408
+354876.120644 7390104.931401
+354881.035398 7390102.981735
+354883.501021 7390101.571976
+354889.941327 7390100.082232
+354899.993482 7390105.271343
+354905.048421 7390110.420461
+354910.482687 7390117.999162
+354915.727290 7390124.368072
+354922.472707 7390134.066410
+354935.707907 7390136.745951
+354947.293861 7390141.955059
+354966.177729 7390152.223300
+354979.759271 7390161.991627
+354994.338607 7390173.099724
+355008.711787 7390185.087671
+355021.988218 7390194.855998
+355032.650594 7390200.285068
+355040.632946 7390208.773614
+355050.660362 7390216.402307
+355060.019834 7390219.381797
+355068.851547 7390224.011004
+355074.640401 7390226.610558
+355086.036691 7390230.269932
+355099.502786 7390230.959813
+355114.494433 7390232.429562
+355121.322312 7390232.939474
+355131.935211 7390233.049455
+355153.119778 7390227.280444
+355170.387385 7390225.230795
+355187.811670 7390217.652093
+355202.044664 7390213.252846
+355215.741653 7390210.843259
+355234.163733 7390206.044081
+355257.599520 7390199.525198
+355266.010675 7390195.395905
+355269.639017 7390189.566904
+355281.150755 7390181.148346
+355290.262840 7390178.688767
+355297.437060 7390175.769267
+355308.891075 7390173.339683
+355320.130687 7390172.009911
+355337.348817 7390159.572041
+355358.104579 7390140.385328
+355372.230372 7390125.457885
+355381.705291 7390116.919347
+355392.755240 7390103.741605
+355408.216923 7390089.054121
+355420.792425 7390076.326301
+355427.175007 7390070.307332
+355450.841689 7390051.380574
+355458.568407 7390043.701889
+355466.220909 7390034.143526
+355471.416035 7390024.675148
+355482.078411 7390009.047825
+355492.064596 7390000.399306
+355509.736268 7389988.951267
+355517.149630 7389982.272411
+355522.600388 7389978.003143
+355527.828498 7389964.985372
+355530.459046 7389956.926753
+355532.792729 7389948.648171
+355534.392498 7389941.019478
+355541.187392 7389925.252178
+355544.114804 7389917.643482
+355548.963588 7389912.704328
+355557.176833 7389908.025129
+355562.817255 7389905.305595
+355578.559309 7389902.476080
+355584.397641 7389900.206468
+355596.898926 7389895.347301
+355602.357931 7389890.088202
+355613.581051 7389880.119909
+355620.285236 7389873.211092
+355629.570492 7389862.672898
+355635.293376 7389851.654785
+355636.959115 7389838.717001
+355638.682577 7389828.988667
+355638.154818 7389810.481837
+355633.635884 7389803.133096
+355628.919040 7389794.774528
+355623.138432 7389790.845201
+355604.501951 7389777.037566
+355599.884062 7389758.280779
+355598.754328 7389748.632432
+355596.099042 7389738.754124
+355595.777439 7389719.587407
+355613.350156 7389697.061265
+355621.827282 7389686.293110
+355636.390125 7389658.747828
+355643.514868 7389640.101022
+355651.860054 7389621.474213
+355656.725330 7389594.278871
+355659.628003 7389569.053192
+355664.344847 7389535.328969
+355672.228243 7389512.372901
+355678.017097 7389494.815908
+355698.038945 7389461.241659
+355710.993773 7389441.874976
+355726.199823 7389421.208516
+355740.218415 7389396.542741
+355747.211218 7389380.995405
+355761.452459 7389343.821772
+355763.695434 7389323.355278
+355770.119247 7389293.630369
+355775.504036 7389275.073548
+355788.153754 7389234.560488
+355809.874325 7389225.692007
+355817.279440 7389219.783019
+355819.852264 7389217.483413
+355825.014405 7389211.994353
+355829.879681 7389204.515634
+355838.076434 7389180.559737
+355852.292936 7389157.333716
+355851.443574 7389150.244930
+355860.605136 7389142.026338
+355865.783769 7389134.437638
+355873.832090 7389125.439179
+355880.561014 7389115.980799
+355894.670315 7389102.493109
+355905.901681 7389091.534987
+355914.436530 7389085.086091
+355932.858609 7389069.868698
+355945.401126 7389060.250345
+355956.137718 7389057.810763
+355961.745155 7389058.860583
+355963.938652 7389063.759744
+355963.072798 7389068.728893
+355962.009034 7389073.478080
+355961.448291 7389078.567208
+355965.192079 7389081.376727
+355971.492200 7389084.536185
+355980.480591 7389083.626341
+355986.846681 7389079.926975
+355997.781183 7389078.047297
+356013.820102 7389076.647537
+356020.153207 7389076.047639
+356032.110241 7389074.617884
+356051.612577 7389072.818193
+356058.762059 7389072.218295
+356070.752078 7389067.799052
+356080.490876 7389062.909890
+356085.644770 7389057.650791
+356086.444655 7389048.792308
+356087.343494 7389040.723690
+356087.384725 7389036.734373
+356088.869047 7389020.797103
+356093.519921 7389014.758138
+356098.871724 7389010.048944
+356105.015166 7389008.339237
+356116.469181 7389005.459730
+356123.090904 7389006.519549
+356127.057341 7389007.889314
+356134.874767 7389012.288561
+356138.907174 7389017.307701
+356148.274892 7389019.287362
+356153.387555 7389018.337525
+356165.369328 7389014.138244
+356176.345061 7389008.929136
+356183.222418 7389004.229941
+356199.500477 7388999.630729
+356211.589451 7388994.771561
+356229.953807 7388984.873257
+356247.551263 7388979.844118
+356263.342795 7388972.135439
+356274.326774 7388966.256446
+356286.630150 7388959.847543
+356296.616335 7388951.089044
+356298.710878 7388946.119895
+356303.584400 7388938.311232
+356309.513440 7388936.591527
+356315.830053 7388937.651345
+356320.596374 7388940.800806
+356326.203811 7388941.850626
+356331.481399 7388944.230218
+356337.097082 7388944.510171
+356343.636342 7388943.910273
+356347.742965 7388940.630835
+356348.625312 7388934.541878
+356348.666543 7388930.002656
+356348.732513 7388923.693736
+356350.860041 7388914.855250
+356355.296513 7388909.916096
+356364.911618 7388907.466516
+356373.611391 7388905.106920
+356386.797114 7388902.917295
+356398.770641 7388899.597864
+356409.358801 7388891.399268
+356421.373559 7388884.210499
+356428.085991 7388876.191873
+356449.031416 7388863.324077
+356458.250702 7388859.104800
+356472.458958 7388857.025156
+356487.170233 7388855.175473
+356505.270709 7388851.586088
+356521.829141 7388849.316476
+356546.493616 7388842.027725
+356565.822781 7388837.238545
+356575.569826 7388832.009441
+356590.660428 7388823.410914
+356601.479482 7388812.892715
+356619.753129 7388791.476384
+356626.160451 7388782.897853
+356642.323063 7388768.990236
+356672.743408 7388736.735760
+356684.947829 7388709.610407
+356695.832853 7388692.113404
+356698.974667 7388684.274747
+356703.938898 7388677.795856
+356711.640878 7388672.886697
+356715.450636 7388668.827393
+356723.713359 7388659.159049
+356716.530892 7388641.812020
+356711.814048 7388634.013356
+356708.325893 7388625.784765
+356709.397903 7388620.265711
+356715.087802 7388612.237086
+356736.156921 7388597.599593
+356750.744503 7388587.441333
+356761.233709 7388579.462700
+356772.720708 7388573.043799
+356785.815722 7388559.326149
+356792.825018 7388552.637295
+356805.895294 7388541.469208
+356815.147565 7388534.700367
+356825.669755 7388522.512455
+356833.891247 7388516.723447
+356845.609141 7388508.534849
+356851.752582 7388506.155257
+356863.742602 7388501.176110
+356873.456662 7388498.836510
+356883.904636 7388494.947177
+356893.173399 7388486.408639
+356900.100233 7388477.170222
+356907.530087 7388469.381556
+356925.993397 7388459.263289
+356934.404552 7388454.584090
+356947.928371 7388449.734921
+356958.730933 7388440.756459
+356967.166827 7388433.527697
+356973.854520 7388427.618709
+356984.871484 7388418.090341
+356993.340363 7388407.652129
+356997.282061 7388401.043261
+356999.393096 7388393.754510
+357000.704247 7388385.465930
+357000.918649 7388374.057884
+357000.968126 7388368.858774
+357001.528870 7388363.219740
+357009.511221 7388351.001833
+357022.804145 7388348.142323
+357040.904621 7388343.773071
+357049.497193 7388342.093359
+357057.166188 7388340.173688
+357065.577343 7388335.714452
+357073.271076 7388331.805121
+357086.514523 7388323.846485
+357098.850884 7388314.668057
+357109.150426 7388305.239672
+357115.013496 7388300.210533
+357125.255314 7388296.541162
+357138.498761 7388287.922638
+357144.139183 7388285.763008
+357152.855448 7388280.973828
+357161.448021 7388279.394099
+357167.104935 7388274.364960
+357172.580432 7388267.326166
+357181.024572 7388259.877442
+357183.663366 7388250.818994
+357188.371964 7388239.240977
+357190.507737 7388229.402662
+357194.663838 7388221.693982
+357197.096476 7388212.635534
+357201.755596 7388206.366608
+357204.361405 7388200.637589
+357215.106243 7388197.418141
+357226.065484 7388192.988899
+357236.999986 7388191.429166
+357247.151096 7388186.440021
+357254.341809 7388181.530862
+357261.029502 7388176.051800
+357272.029974 7388168.303128
+357280.234973 7388163.393969
+357289.223365 7388152.635811
+357313.483775 7388124.190684
+357330.405040 7388104.644032
+357342.832110 7388086.377161
+357350.880431 7388077.158740
+357356.578576 7388068.350249
+357364.206340 7388060.671564
+357376.872550 7388049.173534
+357394.643177 7388026.867354
+357400.885574 7388014.079545
+357409.840980 7388005.860953
+357418.986050 7387989.113821
+357426.457135 7387977.005895
+357429.095929 7387967.957445
+357431.512074 7387960.448731
+357436.575260 7387943.771588
+357440.516958 7387926.424559
+357443.172244 7387916.156318
+357448.284907 7387894.280065
+357454.461334 7387868.094551
+357462.740550 7387855.546700
+357474.598629 7387843.258805
+357479.999911 7387833.790427
+357486.225815 7387823.222237
+357486.671111 7387808.604741
+357485.698056 7387803.495616
+357483.941609 7387785.318730
+357482.836614 7387772.910855
+357479.686554 7387761.472814
+357476.726157 7387750.584679
+357471.052750 7387735.917192
+357462.418947 7387721.659634
+357456.885726 7387713.301066
+357450.206279 7387697.063847
+357441.325089 7387676.927296
+357435.709406 7387603.789824
+357414.871181 7387585.532951
+357397.809730 7387566.876147
+357391.715765 7387553.408454
+357389.959318 7387524.163463
+357392.251770 7387509.006059
+357395.814142 7387489.109468
+357403.004855 7387463.493855
+357411.952015 7387435.558640
+357416.215317 7387416.661877
+357418.928326 7387399.964737
+357417.691392 7387380.358096
+357410.657357 7387358.471845
+357402.996609 7387324.467669
+357402.658513 7387321.298212
+357391.146775 7387288.073903
+357378.967093 7387271.226789
+357362.375677 7387255.899414
+357344.753482 7387242.761665
+357325.218161 7387226.404466
+357308.131971 7387210.297226
+357292.027083 7387198.509245
+357263.907436 7387172.433711
+357243.077458 7387153.177010
+357214.438299 7387128.871173
+357194.597868 7387113.163864
+357178.534211 7387096.616698
+357160.565674 7387076.730104
+357141.343710 7387049.744727
+357129.584585 7387031.357876
+357120.744626 7387006.242178
+357109.348335 7386982.106313
+357101.646356 7386956.000784
+357087.932874 7386928.845436
+357077.237513 7386916.887484
+357060.670836 7386899.790413
+357048.317982 7386890.032084
+357028.733185 7386878.654033
+357019.596361 7386873.694882
+356998.716905 7386859.537308
+356986.891810 7386848.339226
+356971.149756 7386830.472286
+356958.128958 7386815.944775
+356934.280859 7386792.118856
+356924.822432 7386778.851128
+356914.143564 7386764.903517
+356903.538911 7386753.615451
+356868.657355 7386741.867463
+356853.937834 7386744.157071
+356840.422262 7386748.786278
+356828.102393 7386756.304990
+356818.462549 7386761.644076
+356799.281817 7386771.862325
+356782.649170 7386782.220551
+356764.037427 7386786.799767
+356744.708262 7386790.819078
+356728.463188 7386793.208669
+356699.675597 7386794.808395
+356673.724709 7386798.317794
+356650.495077 7386794.538441
+356631.941058 7386792.478794
+356607.911542 7386787.919575
+356585.588996 7386785.160048
+356562.606751 7386777.291395
+356545.446345 7386768.482904
+356533.786175 7386761.504100
+356515.768161 7386746.156729
+356507.200327 7386735.988470
+356498.071750 7386719.621274
+356490.897529 7386702.604189
+356479.501239 7386678.798266
+356468.418305 7386653.662572
+356457.343617 7386627.966973
+356449.872532 7386609.730097
+356444.116663 7386582.874697
+356443.852784 7386537.362493
+356436.884719 7386519.015636
+356427.063458 7386500.978725
+356421.357066 7386490.180575
+356411.519313 7386474.143322
+356397.269827 7386449.197595
+356388.833933 7386425.521650
+356386.854837 7386409.114461
+356393.435329 7386393.337163
+356399.760188 7386383.108915
+356408.039404 7386371.110971
+356434.839653 7386333.167470
+356446.541055 7386316.010409
+356460.914235 7386296.773704
+356466.496933 7386278.776787
+356464.723993 7386251.181513
+356459.735024 7386219.576927
+356456.964290 7386189.762034
+356458.555813 7386173.604802
+356464.435375 7386156.277770
+356479.361053 7386143.130022
+356496.851308 7386128.572515
+356513.096382 7386115.784706
+356526.463522 7386105.166524
+356539.871893 7386091.018948
+356546.237983 7386076.241479
+356547.309993 7386061.074077
+356547.730551 7386038.597927
+356533.167708 7385973.229124
+356525.614160 7385943.034296
+356523.849467 7385914.999098
+356520.847839 7385867.237280
+356515.529020 7385837.172429
+356499.457117 7385801.248583
+356483.723309 7385772.193560
+356466.364993 7385753.526757
+356439.300864 7385735.539838
+356422.107473 7385730.280739
+356402.143349 7385726.871323
+356374.345305 7385721.052320
+356358.199186 7385712.923712
+356347.297669 7385701.635646
+356329.007529 7385672.770590
+356316.423781 7385655.483551
+356299.246883 7385638.476464
+356276.586241 7385629.288038
+356256.374730 7385619.999629
+356226.144048 7385612.950836
+356206.410818 7385607.111837
+356191.757266 7385602.532621
+356170.968519 7385590.034762
+356150.872455 7385579.536560
+356130.792883 7385566.828737
+356110.053613 7385549.121770
+356096.686473 7385528.615282
+356081.694826 7385506.988987
+356067.626757 7385485.252710
+356044.545557 7385456.557625
+356026.247171 7385439.880482
+356014.826142 7385428.252474
+356000.551916 7385417.144376
+355982.138083 7385411.755299
+355958.586849 7385410.085585
+355931.464996 7385408.375878
+355897.828621 7385405.276409
+355874.277387 7385403.826658
+355848.244036 7385394.818201
+355829.681771 7385384.120033
+355817.279440 7385368.822653
+355811.168983 7385357.574580
+355809.412536 7385339.397694
+355810.525777 7385319.471107
+355809.222873 7385296.754998
+355805.256436 7385263.830638
+355796.903004 7385231.636152
+355762.293574 7385110.576889
+355750.889037 7385067.274306
+355738.206335 7385028.720910
+355724.014572 7384999.345941
+355707.390171 7384977.699649
+355684.655313 7384955.543444
+355660.840199 7384929.397923
+355644.900235 7384910.631137
+355614.949925 7384886.195323
+355592.165590 7384868.358378
+355559.320853 7384847.321982
+355535.629433 7384839.123386
+355515.698293 7384832.714484
+355491.033817 7384820.186630
+355473.123004 7384815.017515
+355447.906031 7384806.468980
+355430.374545 7384794.880964
+355412.513209 7384784.962663
+355396.004255 7384773.284664
+355371.826307 7384762.516508
+355343.492258 7384759.467031
+355315.496305 7384763.846280
+355292.077010 7384769.925239
+355270.043082 7384779.893532
+355252.742490 7384785.372593
+355221.126442 7384794.910959
+355192.792393 7384802.489661
+355168.383551 7384804.359341
+355148.213271 7384801.499831
+355129.024292 7384792.111439
+355112.812202 7384780.653402
+355097.078394 7384763.006424
+355081.979546 7384742.030017
+355072.644813 7384726.772631
+355065.396376 7384706.426116
+355059.657000 7384688.659159
+355049.745030 7384659.434165
+355045.028186 7384641.667209
+355045.168372 7384616.971439
+355047.460824 7384591.525797
+355051.171628 7384567.859851
+355054.024824 7384547.183393
+355054.461874 7384523.487452
+355050.206819 7384511.039584
+355034.225624 7384496.592059
+355017.428052 7384482.694439
+355002.947671 7384472.136248
+354985.424431 7384459.118478
+354960.083765 7384442.591308
+354950.584107 7384433.852805
+354921.788269 7384416.185831
+354905.304054 7384400.958440
+354886.832498 7384380.951867
+354876.458740 7384367.894103
+354860.197173 7384351.446921
+354850.441882 7384347.807544
+354839.507380 7384349.577241
+354831.483798 7384356.036135
+354828.869743 7384361.985116
+354820.788436 7384374.752929
+354800.040920 7384399.128753
+354790.747418 7384409.786928
+354776.357746 7384430.793329
+354764.136832 7384449.720087
+354743.430547 7384469.776652
+354729.865497 7384489.243317
+354720.497779 7384508.090089
+354715.005790 7384526.856875
+354713.793594 7384556.081869
+354713.859564 7384580.337714
+354717.199287 7384603.843687
+354717.232272 7384630.869058
+354718.296036 7384667.532778
+354722.460382 7384690.278882
+354723.548885 7384703.916546
+354723.062357 7384731.701786
+354722.229488 7384764.476173
+354720.101960 7384793.801149
+354717.520890 7384826.995464
+354712.507182 7384849.211658
+354701.770590 7384882.545948
+354689.491952 7384906.011929
+354684.173133 7384918.029870
+354675.572315 7384931.007647
+354658.807728 7384944.355361
+354645.770437 7384952.533960
+354621.699690 7384962.372275
+354604.770178 7384971.940636
+354586.793396 7384984.278522
+354571.661562 7385007.714508
+354558.789196 7385019.662461
+354542.667815 7385040.758848
+354528.063741 7385062.215173
+354510.639456 7385090.500328
+354494.188225 7385113.926315
+354465.532574 7385143.201300
+354448.231982 7385159.308541
+354428.333828 7385179.375104
+354404.840316 7385202.951066
+354386.319282 7385218.268442
+354366.825193 7385229.596502
+354345.434471 7385236.025400
+354323.276849 7385238.355001
+354303.271494 7385238.814923
+354248.401075 7385257.531717
+354261.751722 7385360.444089
+354284.973108 7385405.856310
+354291.792740 7385437.710854
+354299.362780 7385466.685890
+354308.672775 7385484.722801
+354323.227372 7385538.683558
+354185.911139 7385956.691957
+354099.284486 7386476.442928
+354056.404087 7386585.144309
+354048.025916 7386591.873156
+354042.575158 7386616.288974
+354036.835781 7386629.086782
+354029.043093 7386642.844425
+354012.360969 7386658.631721
+353999.134015 7386684.967210
+353987.251196 7386699.684689
+353978.675117 7386711.002750
+353967.443750 7386721.410967
+353957.647228 7386732.169125
+353937.328516 7386753.895403
+353915.715146 7386772.062291
+353909.002714 7386780.300880
+353901.061594 7386788.519472
+353898.579478 7386801.897181
+353893.722448 7386807.936146
+353889.417916 7386810.335735
+353864.745194 7386808.096119
+353841.870150 7386809.855818
+353829.731699 7386809.405895
+353811.458052 7386809.885812
+353795.757228 7386809.285915
+353787.082194 7386809.415893
+353772.049315 7386812.255406
+353755.993904 7386816.304713
+353738.091337 7386830.742240
+353731.049056 7386841.530392
+353713.633017 7386837.581068
+353699.350546 7386837.881017
+353687.665637 7386842.970145
+353680.145075 7386850.208905
+353677.844376 7386855.827943
+353670.620678 7386863.506628
+353657.154584 7386883.313235
+353653.773629 7386895.121212
+353644.669790 7386907.879027
+353638.913921 7386921.666665
+353626.297189 7386938.263822
+353621.646314 7386944.752711
+353611.173602 7386951.181610
+353591.621789 7386967.368837
+353582.484965 7386973.037866
+353573.933624 7386981.036496
+353569.109579 7386983.975992
+353561.300399 7386999.073406
+353549.813399 7387005.272344
+353546.259274 7387003.682617
+353543.752420 7386998.783456
+353543.628726 7386991.474708
+353539.068561 7386987.665360
+353534.285747 7386987.065463
+353528.958682 7386988.555208
+353523.516170 7386992.264573
+353513.035211 7386999.253375
+353505.836251 7387004.942401
+353490.259122 7387011.541271
+353482.177816 7387014.000849
+353462.848651 7387017.800199
+353456.408345 7387019.279945
+353451.551315 7387025.208929
+353444.294632 7387036.546987
+353441.383713 7387042.056044
+353434.250723 7387051.284463
+353426.062216 7387053.414098
+353415.581257 7387081.109354
+353412.942463 7387090.167803
+353411.540604 7387097.676516
+353407.400996 7387103.175574
+353399.517600 7387106.195057
+353384.674384 7387110.474324
+353369.369380 7387120.402624
+353355.020939 7387126.791529
+353333.011749 7387133.990296
+353316.890368 7387144.348522
+353308.536937 7387153.017037
+353301.346224 7387157.926196
+353285.752602 7387165.744857
+353262.374538 7387177.132906
+353246.954086 7387188.270998
+353232.094379 7387194.549923
+353221.506219 7387202.188614
+353208.831762 7387215.136397
+353199.373336 7387232.313454
+353194.029778 7387246.101093
+353188.496557 7387258.119034
+353044.863712 7387317.848803
+352742.012645 7387441.097691
+352657.686691 7387489.209450
+352637.755551 7387492.878822
+352617.750196 7387493.228762
+352587.230896 7387493.698681
+352573.608123 7387489.129464
+352554.732501 7387478.751242
+352527.445724 7387472.602295
+352510.532705 7387470.002740
+352494.996806 7387472.832256
+352479.625832 7387479.321144
+352474.364737 7387484.810204
+352466.291677 7387496.018284
+352460.098758 7387502.487176
+352450.516638 7387511.695599
+352442.781674 7387520.364114
+352435.302342 7387522.953670
+352422.619640 7387526.253105
+352396.165732 7387538.720970
+352383.647954 7387545.239853
+352367.732729 7387554.828210
+352358.653629 7387565.036462
+352350.094041 7387573.475016
+352334.508665 7387591.361953
+352323.582410 7387601.780168
+352315.360918 7387607.449197
+352308.137220 7387615.907748
+352291.397371 7387625.926032
+352286.441387 7387631.415092
+352278.681684 7387642.413208
+352272.340332 7387644.002936
+352263.327202 7387647.122401
+352255.122203 7387651.251694
+352253.357509 7387663.859534
+352250.380620 7387676.227416
+352247.618133 7387687.055561
+352235.290018 7387694.684254
+352226.606737 7387695.484117
+352218.921250 7387699.173485
+352212.950979 7387704.092643
+352210.658527 7387708.831831
+352193.357935 7387734.347460
+352181.887428 7387748.515034
+352171.266283 7387759.703117
+352163.844676 7387767.161840
+352158.707274 7387770.101336
+352157.025043 7387775.290447
+352156.662209 7387780.379576
+352155.351058 7387799.306334
+352153.644088 7387806.595085
+352148.704596 7387811.084316
+352138.075205 7387812.084145
+352124.452432 7387817.703182
+352120.617935 7387822.872297
+352119.224322 7387829.721124
+352117.979141 7387842.109002
+352117.814216 7387848.427920
+352116.082508 7387858.156253
+352113.295282 7387870.744097
+352108.116649 7387879.002682
+352102.616413 7387887.471232
+352094.394921 7387893.150259
+352088.111294 7387899.399189
+352085.653917 7387909.667430
+352082.932661 7387917.176144
+352080.821626 7387924.014972
+352076.352169 7387931.503689
+352067.437993 7387935.403021
+352051.225904 7387944.211513
+352026.759338 7387962.118445
+352006.885922 7387979.525464
+351994.566053 7387987.044176
+351983.755245 7387996.232602
+351972.482647 7388000.551862
+351950.852784 7388000.661843
+351933.915027 7388010.460165
+351917.810138 7388018.268827
+351905.721164 7388023.127995
+351891.842758 7388033.396236
+351884.140778 7388038.085433
+351858.090936 7388070.709845
+351846.241102 7388082.107892
+351829.328083 7388089.136688
+351812.918084 7388097.385275
+351760.818399 7388113.352540
+351729.375522 7388123.890735
+351722.506412 7388126.940213
+351708.157970 7388133.419103
+351688.705112 7388139.867998
+351679.980600 7388144.987122
+351659.670134 7388154.965412
+351650.261185 7388157.305012
+351639.475115 7388163.733910
+351622.529111 7388174.302100
+351611.462670 7388179.171266
+351606.795303 7388186.879946
+351611.710057 7388194.788591
+351613.062438 7388202.107337
+351598.697505 7388210.495901
+351592.026304 7388213.855325
+351585.693199 7388214.235260
+351581.108295 7388213.415400
+351576.119325 7388212.585543
+351570.478903 7388215.525039
+351565.729075 7388220.674157
+351557.507583 7388226.133222
+351552.559844 7388231.622282
+351550.242653 7388238.131167
+351549.516985 7388249.749177
+351553.912226 7388259.207557
+351558.373437 7388261.467170
+351568.227682 7388265.776431
+351564.137552 7388276.584580
+351558.431160 7388286.492883
+351552.262980 7388290.972116
+351544.783649 7388293.111749
+351535.325222 7388300.220532
+351531.367031 7388308.259155
+351525.372022 7388315.727875
+351517.018590 7388323.946467
+351514.932294 7388328.465693
+351514.091178 7388331.225221
+351515.369344 7388336.004402
+351517.587580 7388338.573962
+351521.001519 7388343.703083
+351520.976781 7388346.252647
+351517.554595 7388351.971667
+351516.218706 7388352.961497
+351516.177475 7388356.720854
+351517.653550 7388362.609845
+351522.114761 7388365.419364
+351523.796992 7388370.308526
+351522.065283 7388380.146841
+351520.300590 7388382.566426
+351515.361098 7388387.275620
+351508.689897 7388390.974986
+351501.845526 7388391.574883
+351495.702084 7388393.724515
+351488.511371 7388398.193750
+351483.868743 7388403.122905
+351482.656547 7388411.421484
+351486.375597 7388417.550434
+351487.909396 7388426.758857
+351494.193024 7388431.588029
+351500.682807 7388435.747317
+351503.189661 7388439.646649
+351504.830661 7388449.304995
+351498.967591 7388473.380871
+351497.013235 7388484.988882
+351492.716948 7388496.016993
+351489.962707 7388505.845310
+351482.367929 7388520.062875
+351470.402648 7388532.560734
+351465.034352 7388534.570390
+351438.910293 7388549.077905
+351438.555705 7388553.387166
+351437.656866 7388561.685745
+351437.483696 7388568.324608
+351442.076846 7388578.782816
+351446.950368 7388581.052428
+351448.310996 7388587.491325
+351447.610067 7388596.229828
+351441.466625 7388598.709403
+351437.458957 7388610.967303
+351435.776726 7388616.266396
+351433.162671 7388622.545320
+351431.562902 7388629.064204
+351427.250123 7388641.312106
+351420.752094 7388648.340902
+351413.058360 7388652.470194
+351410.831878 7388650.670503
+351406.568577 7388648.300909
+351406.824210 7388643.541724
+351407.690064 7388638.012671
+351407.351969 7388631.363810
+351402.577401 7388629.544121
+351399.196447 7388630.513955
+351380.197131 7388632.423628
+351361.461695 7388638.102655
+351354.774002 7388643.791681
+351349.578877 7388653.040097
+351345.101174 7388661.628626
+351342.017083 7388673.896524
+351336.121028 7388691.443519
+351331.626833 7388702.031705
+351328.839607 7388715.069472
+351320.939718 7388729.387019
+351315.299296 7388742.174829
+351304.810091 7388759.341888
+351295.854684 7388767.330520
+351284.400670 7388779.508434
+351275.610188 7388790.716514
+351269.483239 7388801.724628
+351269.903796 7388810.263166
+351272.262218 7388818.921683
+351277.028540 7388831.929455
+351281.918554 7388842.607626
+351282.751424 7388851.696069
+351283.196720 7388868.093260
+351284.326454 7388877.181703
+351288.523785 7388896.058470
+351292.729363 7388903.957117
+351295.054800 7388916.055045
+351297.792548 7388927.273123
+351301.660031 7388938.941124
+351303.911251 7388968.306095
+351306.772694 7388977.974438
+351306.739709 7388990.822238
+351305.824377 7389000.660552
+351301.338428 7389010.478871
+351294.502302 7389020.147215
+351289.117514 7389028.175839
+351275.799851 7389042.553377
+351271.478826 7389046.492702
+351254.351405 7389064.149677
+351243.928170 7389076.117627
+351237.900175 7389086.355874
+351231.699010 7389093.824594
+351228.961261 7389102.103176
+351225.283442 7389112.581381
+351222.710618 7389124.739299
+351214.447895 7389134.397645
+351205.904800 7389141.846369
+351195.968092 7389155.254072
+351194.747650 7389164.652462
+351177.282134 7389206.225341
+351169.761571 7389223.312414
+351159.767140 7389243.039035
+351156.270738 7389255.626879
+351145.929965 7389278.442971
+351139.547382 7389294.210270
+351133.824498 7389315.086694
+351132.826704 7389322.605406
+351134.632629 7389335.803146
+351134.212071 7389357.059505
+351129.363287 7389361.998659
+351123.384770 7389367.697682
+351115.839469 7389377.146064
+351110.372218 7389382.845088
+351102.637254 7389391.073678
+351097.879179 7389397.002663
+351092.684053 7389405.811154
+351088.387767 7389416.619303
+351083.035964 7389421.328496
+351073.338396 7389421.118532
+351064.630377 7389425.017864
+351061.010282 7389429.517093
+351055.031764 7389435.216117
+351051.411669 7389440.165269
+351051.048835 7389445.254398
+351045.226996 7389446.304218
+351040.320489 7389446.474189
+351038.094007 7389445.234401
+351034.366710 7389439.875319
+351032.173213 7389435.206119
+351026.681223 7389433.376432
+351024.133138 7389432.796532
+351017.000149 7389431.726715
+351014.089229 7389427.377460
+351009.298169 7389426.777563
+351004.721511 7389425.177837
+351002.692938 7389423.388143
+351000.977722 7389421.488468
+350998.775979 7389417.699118
+350994.694095 7389417.659124
+350991.931607 7389418.069054
+350990.034974 7389423.808071
+350989.878296 7389428.907198
+350988.806286 7389433.986328
+350980.782704 7389440.665184
+350966.879559 7389452.483159
+350955.606961 7389457.352325
+350943.485002 7389465.200981
+350929.656074 7389470.260114
+350912.330743 7389477.278912
+350898.716216 7389481.348215
+350890.338046 7389482.927944
+350881.630026 7389486.047410
+350877.836760 7389487.227208
+350872.559173 7389494.705927
+350868.600982 7389502.754548
+350864.040816 7389522.891099
+350855.852309 7389577.441755
+350885.678926 7389595.798611
+350887.971378 7389614.145468
+350878.793323 7389639.391144
+350899.450131 7389639.391144
+350959.103363 7389602.677432
+350968.165971 7389604.647095
+350975.719518 7389606.286814
+350973.163186 7389596.958412
+350970.689317 7389589.069763
+350971.703604 7389579.881337
+350971.761327 7389574.122324
+350974.482583 7389568.063362
+350979.850880 7389561.584471
+350981.821729 7389559.054905
+350984.427538 7389553.435867
+350989.705125 7389546.067129
+350996.780391 7389542.597724
+351004.243230 7389541.567900
+351014.757174 7389541.447921
+351025.584475 7389540.568071
+351034.482158 7389538.778378
+351046.554639 7389535.688907
+351065.809588 7389528.910068
+351075.416446 7389528.010222
+351082.623652 7389532.069527
+351087.563144 7389537.768551
+351090.581265 7389542.007825
+351098.200782 7389545.517223
+351106.133656 7389547.916812
+351112.738886 7389551.316230
+351118.519494 7389555.025595
+351122.964212 7389559.274867
+351124.547489 7389564.274011
+351125.001031 7389569.373137
+351122.725072 7389582.200940
+351121.702539 7389586.310236
+351119.756429 7389593.578991
+351118.783373 7389599.108044
+351118.907067 7389606.416792
+351121.479891 7389614.525403
+351125.767931 7389624.203745
+351133.041106 7389632.142385
+351140.198834 7389640.191007
+351156.188276 7389653.858666
+351174.395953 7389670.105883
+351193.890042 7389689.462567
+351208.024082 7389704.559981
+351219.626528 7389717.737724
+351248.999602 7389750.492113
+351262.919239 7389766.249414
+351273.837248 7389776.767612
+351292.234589 7389793.784698
+351310.326819 7389811.691630
+351317.459808 7389822.729739
+351332.088622 7389838.936963
+351348.069817 7389853.604451
+351358.798163 7389862.572915
+351367.176333 7389871.071459
+351380.395041 7389886.158875
+351386.357065 7389891.977878
+351395.287733 7389896.717066
+351401.563115 7389902.546068
+351407.846743 7389906.485393
+351413.198546 7389912.294398
+351418.063822 7389915.673819
+351427.225385 7389918.083406
+351440.773942 7389920.113059
+351456.870584 7389923.042557
+351467.161880 7389925.032216
+351473.791849 7389925.092206
+351481.559798 7389923.732439
+351491.389305 7389921.062896
+351511.642048 7389916.623656
+351521.257153 7389914.614001
+351529.008609 7389914.913949
+351534.294443 7389916.853617
+351542.515935 7389921.802769
+351565.242547 7389944.848822
+351572.928034 7389952.237556
+351584.522234 7389965.865222
+351598.491349 7389977.413244
+351611.470916 7389985.961779
+351617.053614 7389988.571332
+351622.446649 7389990.281039
+351627.138754 7389990.331031
+351634.708794 7389988.751301
+351651.382672 7389984.931956
+351665.698129 7389982.532367
+351679.263178 7389983.332230
+351687.212544 7389984.412045
+351693.314755 7389986.571675
+351700.835317 7389989.861111
+351705.906749 7389992.790610
+351709.650538 7389995.600128
+351713.113955 7389996.519971
+351718.836839 7389996.140036
+351723.941256 7389995.750103
+351726.299678 7389994.330346
+351728.880748 7389992.030740
+351732.500843 7389986.971606
+351738.916411 7389978.403074
+351745.472164 7389975.693538
+351753.454515 7389973.893846
+351759.383555 7389973.183968
+351764.487972 7389973.233959
+351773.130022 7389975.753528
+351778.729212 7389977.583214
+351785.705523 7389984.192082
+351792.978699 7389991.570819
+351799.641653 7389998.399649
+351805.727371 7390002.668918
+351815.779526 7390007.418104
+351827.843762 7390015.626698
+351837.656776 7390023.695316
+351842.010786 7390027.504663
+351850.248771 7390030.364174
+351862.156328 7390034.023547
+351869.874799 7390037.532946
+351885.006633 7390045.221629
+351895.075280 7390048.531062
+351902.505134 7390050.710688
+351910.965767 7390051.690521
+351925.751258 7390053.050288
+351928.794117 7390054.520036
+351930.806198 7390057.539519
+351933.403760 7390062.658642
+351936.817700 7390068.777594
+351940.330594 7390074.136676
+351944.461956 7390079.825701
+351948.914920 7390083.185126
+351953.293669 7390084.344927
+351959.404126 7390085.844670
+351966.438160 7390086.574545
+351973.892753 7390086.434569
+351983.087300 7390085.084800
+351991.580918 7390083.065146
+352001.600088 7390081.615395
+352010.052474 7390083.035152
+352014.925997 7390085.854669
+352019.585117 7390089.444054
+352025.637850 7390096.042923
+352028.878619 7390098.622482
+352033.150166 7390099.882266
+352039.672935 7390101.052065
+352050.871316 7390103.711610
+352064.716737 7390107.400978
+352076.649033 7390108.180844
+352086.429062 7390109.940543
+352094.658801 7390113.349959
+352100.447655 7390116.399437
+352104.686217 7390121.088633
+352106.467403 7390126.977625
+352109.980297 7390132.326708
+352114.350799 7390134.476340
+352119.760327 7390134.316368
+352126.093432 7390133.936433
+352132.640939 7390132.336707
+352144.202154 7390129.907123
+352164.141540 7390126.127770
+352179.834117 7390128.167421
+352188.105086 7390128.247407
+352195.155614 7390126.877642
+352198.858171 7390124.148109
+352200.334246 7390119.508904
+352196.705905 7390105.191356
+352195.452478 7390097.982591
+352196.846091 7390091.233747
+352199.039588 7390085.944653
+352201.224839 7390082.205294
+352204.721241 7390079.245801
+352211.309979 7390073.446794
+352213.280829 7390070.477303
+352214.765150 7390065.058231
+352216.909170 7390055.119933
+352218.583155 7390051.150613
+352220.949823 7390048.841009
+352225.254355 7390047.451247
+352230.152616 7390047.051315
+352236.477475 7390047.781190
+352254.025454 7390047.961159
+352267.722443 7390045.991497
+352277.774598 7390041.442276
+352285.789935 7390035.663266
+352291.529311 7390033.613617
+352298.052080 7390034.233511
+352305.778798 7390037.083023
+352314.396109 7390043.481927
+352319.945822 7390049.290932
+352326.946872 7390053.350236
+352335.811570 7390055.099937
+352351.726795 7390055.479871
+352370.693125 7390057.339553
+352401.880370 7390061.418854
+352449.708507 7390065.558145
+352473.729777 7390071.887061
+352498.031419 7390080.775539
+352521.599146 7390092.193583
+352537.003105 7390102.651791
+352547.954099 7390109.960539
+352558.418566 7390114.489764
+352576.725198 7390120.548726
+352589.317192 7390127.207585
+352600.499081 7390131.416864
+352608.951467 7390133.606489
+352615.680392 7390134.006421
+352622.524763 7390133.746465
+352627.950783 7390132.026760
+352640.699455 7390122.748349
+Region 1
+198
+328374.697948 7391220.110381
+328479.062243 7391217.660800
+328563.718047 7391213.771467
+328586.873462 7391215.191223
+328609.220747 7391216.231045
+328632.689520 7391217.620807
+328669.344015 7391225.689425
+328695.096993 7391231.858369
+328708.323947 7391235.887678
+328727.727328 7391243.876310
+328762.509929 7391263.442958
+328836.091045 7391317.683667
+328856.286064 7391328.221862
+328952.181480 7391391.311056
+329044.786650 7391455.140122
+329121.385887 7391503.891772
+329192.476641 7391554.113169
+329212.440766 7391567.450885
+329255.156240 7391597.045815
+329276.538716 7391602.834824
+329302.448373 7391606.634173
+329321.596121 7391607.574012
+329340.677898 7391609.233728
+329370.933319 7391606.264236
+329404.709879 7391607.214073
+329417.235904 7391609.463688
+329439.418264 7391615.922582
+329470.308644 7391628.130491
+329472.856729 7391593.276461
+329474.926533 7391573.469854
+329485.481708 7391517.889374
+329503.978004 7391411.327627
+329521.756877 7391313.744342
+329527.215882 7391291.428165
+329543.898006 7391183.196704
+329547.419147 7391152.122027
+329558.535066 7391100.580855
+329558.765960 7391099.081112
+329586.671205 7390947.337104
+329588.922426 7390912.033152
+329591.313833 7390864.321324
+329583.422190 7390823.248360
+329532.287314 7390699.719519
+329530.547359 7390695.370264
+329511.952109 7390647.118529
+329493.447567 7390599.246729
+329474.662654 7390546.525760
+329468.123393 7390520.980136
+329462.548941 7390502.603283
+329460.850218 7390496.864266
+329446.889349 7390442.423592
+329436.779470 7390407.749531
+329424.756466 7390370.725873
+329404.033688 7390283.320844
+329372.277454 7390162.451548
+329365.482560 7390131.796799
+329360.493591 7390113.799882
+329357.467224 7390103.261687
+329353.459556 7390068.967561
+329344.891722 7389999.999375
+329343.951652 7389978.463064
+329337.321682 7389930.331308
+329330.823653 7389873.611024
+329328.992989 7389856.913884
+329321.340487 7389748.372476
+329315.873237 7389695.391551
+329308.962895 7389631.062570
+329304.221313 7389600.217854
+329279.738254 7389518.331880
+329255.345904 7389427.987355
+329238.474116 7389374.726478
+329234.128352 7389362.398590
+329226.236709 7389313.546958
+329224.958544 7389292.110630
+329223.804071 7389267.674815
+329226.640775 7389247.018354
+329226.682006 7389231.930938
+329229.452739 7389149.984975
+329228.430207 7389063.709753
+329224.603956 7389003.320097
+329216.481419 7388942.070588
+329207.212655 7388865.033784
+329198.026354 7388826.670355
+329173.427848 7388746.374109
+329163.746774 7388720.938466
+329134.142806 7388619.945765
+329130.357786 7388609.337583
+329111.119330 7388543.218908
+329097.075999 7388502.625861
+329088.912230 7388478.939919
+329055.539735 7388390.215116
+329012.906723 7388275.254808
+328986.312629 7388192.758939
+328960.468942 7388116.581987
+328929.636285 7387999.342069
+328923.113517 7387969.287217
+328910.711186 7387936.482836
+328887.242414 7387852.937147
+328849.491170 7387736.157150
+328817.396840 7387632.704871
+328813.446896 7387623.056524
+328803.435972 7387598.610711
+328788.295892 7387567.316071
+328760.959638 7387523.133639
+328702.716511 7387423.980623
+328666.828915 7387377.298620
+328638.033077 7387326.757277
+328577.736639 7387228.914037
+328526.074004 7387145.348351
+328513.836598 7387125.711714
+328457.770475 7387042.865905
+328439.076271 7387008.751748
+328421.676724 7386987.615369
+328389.293776 7386938.503781
+328382.738023 7386930.095222
+328374.046496 7386909.598732
+328330.729046 7386841.340424
+328306.880947 7386804.066809
+328296.738083 7386789.989220
+328241.199720 7386687.776729
+328211.430827 7386641.564644
+328178.379935 7386588.683702
+328128.993260 7386509.677235
+328025.865899 7386341.556033
+327991.000836 7386281.996235
+327884.583229 7386123.873320
+327838.288891 7386174.204699
+327814.317098 7386188.692217
+327793.099547 7386197.130772
+327770.298719 7386203.059756
+327742.583138 7386202.979770
+327718.924702 7386193.261435
+327699.026547 7386200.110261
+327615.162382 7386198.190590
+327550.627381 7386191.981654
+327490.759746 7386188.902181
+327460.586788 7386194.431234
+327449.850196 7386192.871501
+327415.257258 7386206.799116
+327376.351542 7386222.096495
+327327.335947 7386242.383020
+327253.977479 7386281.536314
+327176.561866 7386321.019551
+327127.026759 7386347.694981
+327067.678637 7386380.759318
+327000.702751 7386416.073269
+326979.559416 7386434.350138
+326962.836060 7386453.616838
+326924.392133 7386496.289529
+326854.233202 7386589.153622
+326763.062876 7386705.723654
+326706.543212 7386745.806789
+326616.106800 7386772.642192
+326560.436497 7386791.488964
+326475.186965 7386824.303343
+326512.962947 7387026.518705
+326538.542755 7387161.385604
+326584.243365 7387461.304230
+326617.929217 7387624.406292
+326633.341422 7387701.123151
+326682.670374 7387922.005316
+326705.322769 7388085.307344
+326728.527663 7388202.547262
+326765.190404 7388338.873911
+326817.735386 7388511.764296
+326844.172801 7388598.099508
+326938.171584 7388890.539415
+327007.431675 7389127.458833
+327107.623378 7389441.205091
+327122.384131 7389496.095689
+327144.277873 7389577.651719
+327186.704730 7389699.290883
+327212.903004 7389782.366653
+327244.354128 7389902.246119
+327270.643111 7389992.270699
+327326.197967 7390145.214501
+327376.128894 7390317.035069
+327394.386049 7390396.111524
+327404.850515 7390434.334977
+327406.870842 7390496.824273
+327403.588842 7390517.900663
+327509.437459 7390521.899978
+327534.918311 7390520.920146
+327587.364338 7390541.876556
+327606.404885 7390557.643855
+327652.039525 7390618.353456
+327684.678106 7390648.008377
+327697.426779 7390658.606561
+327867.389838 7390845.074621
+327944.912653 7390923.891121
+328000.046951 7390984.240783
+328016.572397 7391002.267695
+328038.861959 7391025.233761
+328140.397796 7391133.435227
+328228.096459 7391227.759071
+328304.390585 7391222.739930
+328311.861670 7391223.599783
+328374.697948 7391220.110381
+Region 1
+511
+360200.142783 7400752.597552
+360204.232913 7400745.178823
+360215.348832 7400730.441347
+360229.977645 7400717.523560
+360244.895077 7400702.586119
+360253.718543 7400687.818648
+360263.886146 7400668.022039
+360270.582085 7400660.293363
+360282.984416 7400643.556230
+360292.813923 7400629.818583
+360307.912771 7400601.253476
+360325.031946 7400573.978148
+360337.970282 7400554.981402
+360345.680508 7400547.772637
+360366.320823 7400540.493884
+360418.956513 7400475.105084
+360424.555704 7400454.988530
+360441.320291 7400429.092965
+360447.793582 7400414.265505
+360451.949682 7400403.447358
+360454.398812 7400384.540597
+360459.923787 7400362.134435
+360469.035872 7400335.958919
+360483.013233 7400303.784430
+360500.800352 7400272.139850
+360520.319180 7400244.304618
+360554.953349 7400199.682261
+360583.213181 7400158.799264
+360599.326316 7400143.551876
+360607.894150 7400121.665625
+360615.719823 7400096.999850
+360623.825867 7400069.814507
+360631.057812 7400026.221974
+360634.554213 7400003.535860
+360634.273842 7399978.300182
+360634.232610 7399954.574246
+360634.463505 7399928.328742
+360633.135862 7399907.122374
+360628.245847 7399886.125971
+360623.355832 7399866.149393
+360621.772556 7399844.933027
+360616.198104 7399815.108136
+360618.366863 7399800.230684
+360608.644557 7399752.698826
+360599.977768 7399700.887700
+360592.844779 7399647.066919
+360589.018528 7399621.041377
+360583.650232 7399597.275448
+360578.578800 7399569.210256
+360574.299006 7399559.731879
+360569.854288 7399550.283498
+360567.627805 7399540.275212
+360564.024203 7399523.148146
+360562.754283 7399512.599952
+360557.418972 7399467.317709
+360557.633374 7399442.841901
+360556.751027 7399428.694325
+360560.197952 7399411.317301
+360561.311193 7399400.729115
+360562.003876 7399379.532746
+360563.298534 7399347.998147
+360561.187499 7399328.801435
+360561.500856 7399293.977401
+360560.189705 7399270.241466
+360559.167173 7399258.323508
+360557.905500 7399241.696356
+360556.272746 7399226.288995
+360553.328842 7399214.910944
+360551.184822 7399199.493585
+360552.248585 7399193.954534
+360557.179831 7399181.126731
+360561.278208 7399176.367546
+360562.111077 7399168.548885
+360562.927454 7399162.499921
+360555.951143 7399148.052396
+360543.590043 7399141.133581
+360533.768782 7399133.214938
+360521.110818 7399130.585388
+360494.500232 7399128.835688
+360476.960499 7399133.474893
+360457.919953 7399135.324576
+360437.089974 7399138.674003
+360420.341880 7399140.033770
+360401.540474 7399144.163062
+360357.035567 7399158.150666
+360324.998961 7399167.209115
+360305.702781 7399170.058627
+360290.199868 7399172.958130
+360270.631562 7399177.577339
+360249.282071 7399182.936421
+360228.179967 7399188.555458
+360210.401094 7399192.184837
+360199.450100 7399197.383946
+360179.098402 7399204.022809
+360169.681207 7399207.722175
+360153.419640 7399211.871465
+360126.256556 7399214.151074
+360102.862000 7399221.519812
+360094.137488 7399220.979904
+360074.222841 7399219.750115
+360058.249892 7399218.850269
+360042.796456 7399217.200552
+360022.040693 7399212.221405
+360006.603750 7399208.801990
+359989.913379 7399203.612879
+359968.143330 7399199.373605
+359950.653075 7399197.963847
+359933.426699 7399196.044176
+359913.899625 7399195.864206
+359899.204842 7399194.224487
+359891.107043 7399192.134845
+359873.600296 7399193.494612
+359862.929673 7399195.664241
+359848.680186 7399200.593396
+359839.988659 7399208.592026
+359824.221866 7399213.501185
+359812.363787 7399207.102281
+359795.087934 7399209.201922
+359782.825789 7399191.424967
+359774.851684 7399175.707659
+359766.415790 7399154.691259
+359752.421936 7399131.095301
+359741.611128 7399120.147176
+359725.984521 7399109.658973
+359707.042929 7399100.150601
+359691.886357 7399093.451749
+359667.370313 7399084.913211
+359651.182963 7399079.974057
+359634.236959 7399074.774948
+359614.841824 7399059.457572
+359605.820448 7399047.519616
+359602.159121 7399031.332389
+359604.542282 7399020.504244
+359621.430562 7399003.497157
+359632.637190 7398997.538178
+359652.584822 7398979.541261
+359678.395524 7398956.805155
+359694.022131 7398939.778072
+359708.395311 7398920.471379
+359718.975225 7398900.124864
+359724.467214 7398880.998140
+359726.998807 7398853.502850
+359722.199501 7398822.428173
+359712.295778 7398796.092684
+359703.076492 7398776.825984
+359687.359176 7398748.170892
+359675.105278 7398728.884196
+359652.964148 7398708.747645
+359635.581094 7398695.469919
+359614.751116 7398692.730389
+359598.885368 7398703.408560
+359586.581992 7398714.626638
+359573.000450 7398725.834718
+359542.547120 7398747.201058
+359528.231664 7398755.629615
+359513.973931 7398757.999209
+359501.538615 7398757.109361
+359486.060440 7398754.419822
+359472.132556 7398749.480668
+359455.186552 7398741.482038
+359439.518714 7398732.993492
+359420.321489 7398721.695427
+359402.369445 7398712.926929
+359363.686377 7398693.350282
+359350.055358 7398684.121863
+359341.231891 7398676.963089
+359325.300174 7398668.724501
+359321.028626 7398664.645199
+359303.521878 7398661.935664
+359294.879829 7398662.095636
+359278.601769 7398662.935492
+359260.039504 7398664.755181
+359238.426134 7398666.034961
+359210.974432 7398666.754838
+359186.103800 7398663.215444
+359156.673003 7398658.616232
+359139.141517 7398658.426265
+359126.458814 7398643.298856
+359101.810831 7398629.211269
+359088.600369 7398618.653077
+359072.544958 7398609.544638
+359052.531356 7398604.035581
+359030.497428 7398574.630618
+359011.127032 7398560.543031
+358997.924817 7398544.695746
+358975.033281 7398527.968611
+358963.117477 7398524.639181
+358942.749288 7398502.992889
+358931.930233 7398492.024768
+358926.149625 7398485.655859
+358915.858329 7398473.187994
+358903.530215 7398460.700133
+358895.267492 7398448.502223
+358888.019055 7398436.574266
+358872.524387 7398410.428744
+358861.284775 7398390.892091
+358852.312876 7398372.885175
+358843.093590 7398355.128217
+358834.641204 7398335.871515
+358829.676973 7398323.963555
+358826.526913 7398309.046110
+358832.348752 7398285.650118
+358834.954561 7398271.782493
+358828.571978 7398269.252927
+358819.105305 7398267.603209
+358809.094381 7398268.263096
+358793.137925 7398266.063473
+358785.757549 7398261.104322
+358781.246860 7398254.175509
+358775.845579 7398244.437177
+358764.267872 7398232.719184
+358757.720364 7398227.100147
+358752.681917 7398222.750892
+358746.851832 7398221.181161
+358727.555653 7398219.971368
+358716.645890 7398218.081692
+358708.028578 7398215.472139
+358700.450293 7398211.352844
+358691.610333 7398205.963767
+358686.093605 7398198.595030
+358682.143660 7398186.697068
+358676.618686 7398180.578116
+358659.425295 7398171.419684
+358654.584758 7398168.120250
+358646.882778 7398159.641702
+358644.458386 7398157.332098
+358642.372090 7398153.372776
+358639.180799 7398147.423795
+358638.521100 7398143.464473
+358638.298452 7398135.105905
+358637.531553 7398130.586679
+358635.989508 7398126.847319
+358631.990086 7398120.328436
+358626.456865 7398114.719397
+358622.193564 7398108.870399
+358614.400876 7398100.211882
+358606.113414 7398090.543538
+358591.517586 7398076.265983
+358577.927798 7398062.748299
+358567.372622 7398051.540219
+358555.283648 7398040.822055
+358539.549840 7398038.132515
+358524.244836 7398044.271464
+358513.029962 7398047.680880
+358488.967461 7398065.087898
+358477.216583 7398071.266840
+358469.860945 7398070.177026
+358464.302985 7398066.847597
+358446.524112 7398120.768361
+358281.723193 7398090.663517
+358267.473706 7398092.253245
+358194.733706 7398165.740657
+358179.519410 7398174.649131
+358154.953889 7398171.479674
+358147.029261 7398159.601709
+358141.487794 7398144.544288
+358134.346559 7398124.737681
+358128.013453 7398111.269988
+358115.338997 7398097.792296
+358099.168139 7398089.283754
+358012.970290 7398058.219075
+357992.527884 7398054.219760
+357957.662821 7398052.630032
+357872.099932 7398051.050303
+357819.010699 7398051.840167
+357768.296380 7398052.630032
+357708.090650 7398055.009624
+357620.136354 7398057.389217
+357587.646205 7398055.799489
+357560.714016 7398044.711388
+357512.382858 7398018.565867
+357478.779468 7398013.126799
+357448.309646 7397975.643219
+357442.059003 7397952.217232
+357440.500466 7397927.211515
+357443.634033 7397905.345261
+357482.679936 7397756.920684
+357491.552880 7397728.695519
+357413.832156 7397706.869258
+357362.779742 7397676.664432
+357215.262922 7398052.630032
+357200.213551 7398185.747230
+357201.582425 7398233.219099
+357191.909597 7398268.283093
+357182.277999 7398292.278982
+357171.920734 7398312.845460
+357158.133036 7398332.642069
+357144.741157 7398350.529005
+357120.983767 7398376.694523
+357017.782190 7398499.293523
+356968.576932 7398531.178061
+356926.150075 7398576.070371
+356901.287690 7398607.265028
+356885.603359 7398627.821507
+356872.557822 7398650.667594
+356861.812984 7398671.614006
+356853.319366 7398695.999829
+356849.839457 7398708.187741
+356852.148402 7398724.534941
+356855.323200 7398746.371200
+356871.197194 7398797.612423
+356879.179546 7398827.447313
+356883.335646 7398843.384583
+356893.503248 7398868.720243
+356906.243675 7398890.796462
+356919.256227 7398910.353112
+356927.024176 7398921.791153
+356932.433703 7398939.508118
+356937.109316 7398954.435561
+356937.942185 7398972.862405
+356935.476562 7398990.989300
+356933.761346 7399009.636106
+356935.872381 7399027.573033
+356941.051014 7399043.010389
+356943.648577 7399063.216928
+356947.004793 7399083.183508
+356945.602933 7399096.031307
+356942.180748 7399108.609152
+356930.108266 7399131.805179
+356927.147869 7399137.704169
+356910.177127 7399157.200829
+356892.002434 7399170.628529
+356872.285697 7399185.805929
+356850.796020 7399199.953506
+356831.318423 7399216.900603
+356814.388911 7399232.617911
+356802.588555 7399243.845988
+356788.198883 7399259.833249
+356765.678427 7399275.740524
+356746.951237 7399293.447491
+356729.444490 7399315.713677
+356718.312078 7399336.780069
+356706.635416 7399360.875941
+356697.160497 7399393.560343
+356691.899401 7399411.417284
+356684.700442 7399444.631595
+356679.365131 7399470.057240
+356670.953976 7399498.212417
+356669.189282 7399520.128663
+356668.917157 7399523.668057
+356664.126097 7399545.814263
+356653.381258 7399578.238709
+356646.982183 7399600.624875
+356626.803657 7399644.047437
+356610.195748 7399678.431547
+356599.516879 7399704.297116
+356586.520820 7399745.580045
+356581.589574 7399769.685916
+356575.305946 7399788.282730
+356570.185037 7399817.487728
+356562.342872 7399839.104025
+356554.253319 7399860.460367
+356543.863069 7399882.796541
+356537.760858 7399908.202189
+356528.624035 7399932.578014
+356522.579548 7399952.944525
+356514.127161 7399984.889054
+356506.045855 7400005.485526
+356485.677665 7400034.530550
+356467.667898 7400056.536781
+356450.202381 7400077.003275
+356433.470779 7400097.039843
+356425.719322 7400109.317740
+356412.451137 7400140.702364
+356408.410484 7400168.917531
+356404.798635 7400194.093219
+356403.347299 7400212.240110
+356397.979002 7400240.435281
+356392.421043 7400263.081402
+356379.235320 7400286.917319
+356370.659240 7400304.724269
+356348.509865 7400337.868591
+356337.855735 7400358.105125
+356327.778841 7400374.392335
+356313.067565 7400414.495466
+356311.698691 7400440.491013
+356308.763033 7400476.574832
+356308.622847 7400511.908780
+356314.065359 7400547.272722
+356321.536444 7400585.156233
+356330.021816 7400621.530003
+356340.791393 7400657.663813
+356349.771538 7400698.586804
+356358.281648 7400728.901611
+356369.092456 7400755.437066
+356376.629511 7400775.663601
+356403.033942 7400810.757590
+356416.244403 7400834.603505
+356426.816071 7400857.349609
+356438.129899 7400884.904889
+356447.662542 7400913.709955
+356465.441415 7400975.609352
+356471.378701 7400998.455439
+356477.447927 7401019.821779
+356484.267560 7401027.920392
+356492.093233 7401039.558398
+356497.337836 7401061.534634
+356501.015654 7401093.349184
+357046.808922 7401127.353360
+357338.387392 7401144.500423
+357401.693704 7401161.747468
+357445.456450 7401181.944009
+357516.844069 7401226.606359
+357576.678719 7401300.513699
+357707.249535 7401412.134579
+358069.176598 7401832.972494
+358127.353755 7401904.070315
+358186.165872 7401945.723180
+358248.276481 7401982.366904
+358283.496132 7402010.452093
+358351.981078 7402049.375426
+358393.641035 7402072.261506
+358439.778696 7402095.147585
+358480.811939 7402119.133477
+358523.576891 7402143.569291
+358564.799798 7402164.825650
+358591.929897 7402179.033217
+358646.899271 7402210.497827
+358692.121600 7402234.173771
+358734.268084 7402258.919533
+358780.216082 7402284.505150
+358828.778134 7402312.430367
+358872.491403 7402335.306448
+358917.656008 7402361.651936
+358962.523749 7402388.397354
+359009.898344 7402414.352908
+359057.602788 7402437.518940
+359087.957163 7402451.566534
+359131.703417 7402472.173004
+359176.727836 7402484.800841
+359242.161676 7402503.897570
+359253.566213 7402508.076854
+359268.186780 7402470.003376
+359279.682026 7402451.106613
+359290.146492 7402435.489288
+359302.185989 7402406.754210
+359311.042441 7402385.007935
+359327.023636 7402350.793796
+359340.357791 7402315.749798
+359353.708438 7402277.176406
+359368.823779 7402241.122581
+359376.006246 7402220.696080
+359391.377220 7402185.412124
+359401.363405 7402169.844790
+359414.202786 7402149.858214
+359417.427062 7402144.599115
+359434.513252 7402122.692867
+359441.926614 7402109.335155
+359458.501537 7402088.438735
+359469.477270 7402073.071367
+359478.927451 7402057.204085
+359481.492028 7402051.155121
+359490.191802 7402034.268014
+359501.390183 7402024.459694
+359508.275785 7402017.920814
+359517.956860 7402007.092668
+359532.041422 7401976.087979
+359538.951763 7401960.710613
+359548.410190 7401942.823677
+359557.357350 7401927.196354
+359562.742139 7401912.578858
+359585.509982 7401880.634330
+359595.644599 7401862.857375
+359617.645542 7401830.602900
+359628.274934 7401814.095727
+359641.402933 7401800.148116
+359662.579253 7401772.422865
+359675.781469 7401752.676248
+359685.676945 7401734.129425
+359695.869286 7401712.313161
+359701.410753 7401696.745828
+359715.264421 7401666.650983
+359726.941083 7401647.124328
+359748.257590 7401609.310805
+359762.103011 7401580.225787
+359779.683975 7401555.739981
+359798.213255 7401536.313309
+359820.139982 7401509.617881
+359839.980413 7401486.421855
+359857.849995 7401459.416480
+359870.178110 7401438.220111
+359885.615054 7401414.124239
+359900.194389 7401386.818916
+359913.338881 7401371.601522
+359925.172222 7401359.153655
+359940.097899 7401343.206386
+359953.563994 7401323.209811
+359966.856918 7401296.894319
+359973.231254 7401276.277850
+359983.712213 7401252.201974
+359986.664364 7401240.374000
+360005.119428 7401207.819577
+360024.250683 7401180.834199
+360042.549069 7401160.137744
+360063.997515 7401130.662793
+360091.069890 7401094.129051
+360101.996146 7401078.441738
+360113.944934 7401057.915254
+360132.334028 7401030.409965
+360144.530203 7401010.133439
+360153.180499 7400989.806920
+360159.134278 7400962.631575
+360164.873654 7400932.926663
+360165.351936 7400898.352586
+360166.910473 7400877.176213
+360168.972031 7400856.499755
+360173.862046 7400832.843807
+360177.498634 7400808.407992
+360180.475523 7400794.820320
+360186.528256 7400779.003029
+360200.142783 7400752.597552
+Region 1
+309
+352533.638643 7397733.664668
+352562.261310 7397751.121678
+352590.273755 7397768.678670
+352651.881344 7397811.391354
+352673.610162 7397878.929785
+352672.538152 7397904.285442
+352667.590414 7397961.275680
+352636.807235 7398005.008189
+352612.200482 7398043.091666
+352594.743212 7398072.456636
+352592.368298 7398093.093101
+352589.828459 7398100.141894
+352590.933453 7398105.111043
+352587.750408 7398121.518232
+352588.179212 7398148.033690
+352595.213247 7398195.295595
+352595.823468 7398215.932060
+352604.119176 7398285.270183
+352623.926622 7398489.635177
+352629.987602 7398546.215485
+352634.580752 7398595.906974
+352631.249275 7398647.788087
+352612.010819 7398748.190889
+352611.582015 7398754.679777
+352610.262618 7398777.205919
+352611.301643 7398792.113365
+352613.000367 7398823.168046
+352615.383527 7398847.763833
+352618.179000 7398891.476345
+352623.101999 7398898.765097
+352619.539628 7398913.272612
+352559.540053 7398911.352941
+352481.646159 7398899.764926
+352458.936040 7398897.365337
+352425.110001 7398895.185710
+352364.739347 7398891.356366
+352345.731785 7398890.296547
+352303.511084 7398886.657171
+352289.129658 7398884.987457
+352253.753329 7398881.448063
+352184.443760 7398874.529248
+352154.699606 7398872.609577
+352044.010452 7398860.461658
+351960.377181 7398859.131886
+351852.739132 7398841.814852
+351843.346675 7398840.795027
+351816.233069 7398838.645395
+351789.276141 7398836.265802
+351690.849132 7398794.203007
+351639.747241 7398770.517065
+351580.300164 7398746.451187
+351546.218493 7398729.334119
+351521.628233 7398720.465638
+351473.989759 7398701.448895
+351465.578603 7398699.569217
+351459.476393 7398699.429241
+351452.137247 7398699.269269
+351441.161514 7398695.499914
+351380.782614 7398693.580243
+351314.268517 7398692.770382
+351210.539182 7398692.970348
+351202.853695 7398693.040336
+351138.038322 7398693.530252
+351111.089640 7398692.180483
+351076.678120 7398691.450608
+351018.030927 7398690.840712
+350954.592675 7398689.290978
+350923.586848 7398688.651087
+350892.572774 7398688.271153
+350826.157633 7398688.451122
+350774.536229 7398689.640918
+350713.398675 7398686.571444
+350651.189111 7398681.572300
+350583.141216 7398677.273036
+350521.203777 7398664.465230
+350397.271177 7398641.129227
+350314.866594 7398627.171618
+350217.800213 7398611.154362
+350183.858728 7398600.996102
+350151.079961 7398588.558232
+350062.169102 7398430.395324
+350026.817511 7398374.024980
+350010.861055 7398344.300072
+350004.066161 7398328.832721
+349997.048619 7398316.354858
+349982.997042 7398298.447926
+349965.556264 7398280.710964
+349950.770772 7398268.373077
+349935.869833 7398261.124319
+349915.823247 7398250.956061
+349891.216494 7398239.967943
+349860.961074 7398228.009991
+349850.950150 7398223.160822
+349836.453277 7398223.350789
+349820.397866 7398224.400609
+349799.823520 7398231.979311
+349786.208993 7398232.249265
+349775.662064 7398234.688847
+349745.992127 7398240.137914
+349725.186887 7398247.676622
+349706.187571 7398250.226186
+349681.011829 7398252.985713
+349661.088936 7398256.055187
+349648.686605 7398258.074841
+349630.008892 7398259.754554
+349588.736508 7398262.134146
+349566.183067 7398264.023822
+349544.314064 7398266.893331
+349526.543437 7398269.342911
+349515.971769 7398273.662171
+349504.666187 7398280.301034
+349496.015891 7398288.069703
+349490.812519 7398296.988176
+349479.003917 7398313.485350
+349455.782531 7398357.317842
+349432.750809 7398440.303627
+349419.078559 7398461.789947
+349410.296323 7398471.548275
+349395.651017 7398483.266268
+349382.960069 7398489.125264
+349369.287818 7398494.984261
+349358.551226 7398498.883593
+349348.787689 7398502.792923
+349336.096740 7398505.722421
+349296.572556 7398517.010488
+349400.978082 7397946.868148
+349420.513403 7397840.196420
+349439.883799 7397734.424538
+349485.666871 7397479.588189
+349504.542493 7397377.255718
+349508.665609 7397350.580287
+349528.473055 7397227.991285
+349557.796651 7397071.808038
+349564.772962 7397028.975375
+349576.053805 7396970.225438
+349585.578202 7396896.428079
+349593.519322 7396861.504061
+349599.811196 7396825.810175
+349607.570899 7396790.106291
+349608.593431 7396721.048120
+349605.418633 7396657.558995
+349598.269151 7396621.065246
+349595.102598 7396588.520821
+349581.801428 7396531.910518
+349572.499680 7396487.558115
+349562.628942 7396463.452244
+349552.469586 7396442.385852
+349542.837988 7396422.829202
+349533.396054 7396403.672484
+349505.416594 7396377.436977
+349486.549218 7396329.155248
+349468.506465 7396313.287966
+349449.432934 7396287.542376
+349450.117371 7396152.125571
+349463.616450 7396129.989363
+349485.716349 7396101.494244
+349508.616131 7396063.180807
+349625.061154 7396003.940954
+349602.639653 7395981.724759
+349531.689084 7395906.387664
+349487.307871 7395863.325040
+349443.800758 7395807.954525
+349418.996096 7395688.824930
+349399.081449 7395620.606616
+349374.870516 7395552.828225
+349340.978508 7395393.055593
+349290.899150 7395200.498576
+349202.549034 7395015.310297
+349200.124643 7394986.265273
+349181.216036 7394936.783748
+349897.054826 7394979.026513
+349909.053091 7394943.062673
+349929.033708 7394919.076781
+349957.013169 7394893.091232
+349986.988217 7394873.104656
+350034.956541 7394863.116367
+350086.066678 7394873.004673
+350413.128678 7394959.079929
+350434.997682 7394967.208537
+350459.076675 7394978.806550
+350503.020839 7395003.812267
+350538.487877 7395033.177237
+350571.200674 7395067.051435
+350664.143939 7394740.557360
+350674.938255 7394750.695624
+350684.701792 7394756.644605
+350700.163475 7394762.333630
+350722.090202 7394768.172630
+350748.156537 7394776.021285
+350759.437381 7394781.610328
+350770.009048 7394785.279700
+350801.254016 7394766.242960
+350898.427598 7394706.903125
+350913.823311 7394699.274432
+350994.388984 7394651.342642
+351014.262400 7394681.097545
+351105.721344 7394622.767536
+351203.266006 7394563.817634
+351302.377453 7394503.767920
+351395.361949 7394445.477905
+351493.285938 7394386.538000
+351588.579380 7394327.158172
+351686.066318 7394266.578548
+351779.487865 7394209.928252
+351823.473260 7394182.432962
+351880.537176 7394148.018857
+352001.971168 7394143.659603
+352091.789112 7394141.210023
+352140.516089 7394138.940412
+352299.585878 7394135.081073
+352416.072133 7394130.981775
+352474.719325 7394112.015024
+352491.871485 7394100.646971
+352515.678353 7394088.659024
+352523.635965 7394119.763696
+352532.426447 7394185.662409
+352543.410426 7394286.695103
+352545.603924 7394383.338548
+352541.637487 7394470.333647
+352539.196602 7394523.054616
+352541.208683 7394567.836946
+352532.426447 7394613.959045
+352530.216457 7394644.703779
+352528.031206 7394682.047382
+352526.489161 7394816.824296
+352533.242824 7394989.314750
+352532.418201 7395009.071366
+352530.892648 7395026.148441
+352524.642005 7395050.354295
+352501.956625 7395160.085499
+352497.792278 7395178.542337
+352487.913294 7395221.814925
+352484.177752 7395241.891486
+352475.997491 7395280.534867
+352562.516943 7395343.414096
+352659.946158 7395408.482951
+352755.462247 7395473.881748
+352845.676011 7395537.630829
+352883.443747 7395552.628260
+352951.788507 7395602.569705
+353006.997021 7395627.545427
+353118.609753 7395648.621817
+353119.788964 7395682.825958
+353119.640531 7395715.340389
+353103.601613 7395774.780207
+353081.476976 7395874.893059
+353071.960826 7395914.566263
+353069.577665 7395943.921235
+353071.160941 7395971.696477
+353104.203588 7396048.293357
+353111.419039 7396064.790531
+353163.980514 7396149.426034
+353185.692839 7396185.509853
+353215.618410 7396238.110843
+353233.149896 7396281.443420
+353231.088339 7396386.675395
+353237.842001 7396353.970997
+353338.421277 7396381.096351
+353367.101667 7396390.294775
+353416.026553 7396409.871422
+353470.666078 7396430.257930
+353522.056587 7396449.014717
+353547.438485 7396456.913364
+353567.410856 7396472.320725
+353745.521191 7396570.533902
+354058.902695 7396693.012922
+354118.226078 7396716.718862
+354108.891345 7396752.192785
+354030.296520 7397007.519050
+354012.839250 7397055.130895
+353989.032382 7397102.742739
+353967.608675 7397149.564719
+353944.593445 7397196.386699
+353922.369854 7397245.588271
+353900.146262 7397303.518348
+353879.522439 7397352.719920
+353853.398381 7397407.650511
+353825.509629 7397460.771412
+353802.873725 7397500.124671
+353814.476172 7397519.731313
+353739.353011 7397594.438516
+353673.671784 7397658.727504
+353619.922852 7397678.844058
+353572.045237 7397686.542740
+353513.076442 7397673.125038
+353501.671905 7397664.976434
+353469.049816 7397651.108809
+353459.261541 7397647.029508
+353445.737722 7397636.421325
+353406.271262 7397620.304086
+353298.427058 7397580.860842
+353261.253050 7397564.003729
+353195.406899 7397545.846839
+353135.168184 7397547.926483
+353078.030052 7397559.034581
+353013.750684 7397582.050638
+352959.787350 7397609.825880
+352879.609250 7397623.223586
+352768.895357 7397608.996023
+352686.284618 7397603.606946
+352625.221280 7397596.428175
+352576.733444 7397573.082174
+352536.087773 7397523.120732
+352505.073700 7397528.879746
+352447.572734 7397559.484503
+352475.675888 7397628.102750
+352494.617480 7397673.584959
+352510.582182 7397701.210227
+352533.638643 7397733.664668
+Region 1
+387
+333751.726857 7385884.884257
+333622.252790 7385861.908192
+333598.668570 7385860.378454
+333557.973422 7385852.389823
+333516.536113 7385842.861455
+333483.163618 7385836.552536
+333459.587644 7385835.032796
+333420.838606 7385830.643548
+333387.457865 7385824.844541
+333334.047029 7385817.585784
+333267.772073 7385819.205507
+333229.361131 7385823.214820
+333195.782479 7385826.554248
+333156.126356 7385828.993830
+333081.621662 7385835.772669
+333025.266922 7385835.572703
+332993.180839 7385840.721821
+332952.947479 7385846.720794
+332914.231427 7385853.499633
+332878.879836 7385856.799067
+332835.158321 7385859.928531
+332793.152022 7385865.877512
+332748.630623 7385870.756677
+332711.530831 7385872.756334
+332677.020356 7385872.266418
+332633.373057 7385871.576536
+332582.634000 7385858.038855
+332559.940373 7385850.940071
+332538.656852 7385848.710453
+332525.660792 7385842.311549
+332499.841844 7385835.932642
+332480.743574 7385826.904188
+332480.727081 7385826.884192
+332431.925888 7385806.777636
+332397.555599 7385792.620061
+332355.104004 7385764.324907
+332318.713388 7385742.078718
+332294.452977 7385729.950795
+332256.042035 7385717.822873
+332227.740971 7385721.862181
+332213.590440 7385725.911487
+332200.932476 7385732.690326
+332191.861622 7385717.252970
+332177.727583 7385700.935765
+332164.146041 7385682.608905
+332137.972505 7385647.504918
+332110.215692 7385618.609867
+332094.663301 7385594.234043
+332068.201147 7385572.567754
+332045.053978 7385621.619352
+332036.453159 7385666.581650
+331999.510046 7385720.092484
+331944.647873 7385754.706555
+331959.268440 7385691.917310
+331875.239350 7385635.317005
+331795.292144 7385585.325568
+331762.966920 7385558.640139
+331778.214200 7385532.784568
+331747.678408 7385525.655789
+331744.511855 7385501.759882
+331743.893388 7385443.299896
+331745.888976 7385424.493118
+331750.680036 7385406.686168
+331756.510121 7385393.208476
+331761.573307 7385382.030391
+331765.869593 7385372.871960
+331778.750205 7385263.280732
+331758.992237 7385236.125383
+331803.101324 7385161.358190
+331709.770486 7385139.571922
+331677.387538 7385122.604828
+331693.220301 7385024.471638
+331657.398675 7384938.176419
+331594.347995 7384798.100413
+331582.094097 7384771.934895
+331544.103712 7384721.903465
+331394.616043 7384702.736748
+331327.862806 7384686.289565
+331319.187771 7384674.861523
+331315.105887 7384666.223002
+331312.293922 7384658.094395
+331311.007510 7384651.225571
+331309.960239 7384636.988010
+331303.058144 7384620.990750
+331291.595883 7384608.292925
+331279.366723 7384600.934186
+331264.102950 7384595.865054
+331246.546725 7384589.776097
+331238.152063 7384588.776268
+331226.871219 7384589.316176
+331173.559338 7384590.615953
+331133.119823 7384587.996402
+331110.673583 7384591.295837
+331079.643017 7384582.057419
+331049.931848 7384570.169455
+331023.527418 7384556.961718
+331008.667710 7384541.744324
+330981.554104 7384515.108887
+330926.329097 7384461.768024
+330852.599549 7384391.310092
+330808.572923 7384437.992096
+330766.442931 7384484.554121
+330734.257893 7384542.284232
+330714.483432 7384580.217734
+330709.007934 7384634.318467
+330708.381221 7384657.404513
+330698.221865 7384683.809990
+330675.157158 7384710.995333
+330663.686651 7384736.620944
+330647.441576 7384758.967116
+330612.906363 7384789.441896
+330570.256858 7384819.246791
+330425.832374 7384829.315066
+330392.863944 7384795.100927
+330310.863426 7384688.119252
+330249.181621 7384620.310867
+330175.551028 7384554.312172
+330143.192819 7384521.797741
+330124.597569 7384506.320392
+330057.093924 7384449.200176
+330057.069186 7384440.811613
+330059.328653 7384425.564225
+329971.028015 7384398.708825
+329906.138426 7384377.682427
+329922.787566 7384308.784228
+329743.159924 7384265.761598
+329707.280574 7384257.922940
+329689.732595 7384253.363721
+329671.912491 7384245.495069
+329654.587160 7384233.317155
+329634.210724 7384217.579851
+329618.930459 7384204.892024
+329603.641947 7384188.894764
+329591.643682 7384166.528596
+329579.769110 7384127.995196
+329502.007155 7384108.668506
+329479.610392 7384100.059981
+329588.947164 7383892.355559
+329600.079576 7383869.589459
+329609.422555 7383847.563231
+329616.728715 7383825.766965
+329621.940333 7383811.589393
+329674.947104 7383622.991698
+329696.197640 7383547.194682
+329738.121477 7383405.748910
+329755.372591 7383351.518199
+329788.844042 7383245.586345
+329800.759845 7383219.020895
+329817.029658 7383189.176007
+329834.561144 7383160.370941
+329853.527475 7383140.214394
+329863.794032 7383129.626208
+329878.892880 7383116.548448
+329970.211638 7383043.950883
+330029.526775 7382971.303327
+330039.562438 7382957.155750
+330067.311004 7382921.581844
+330076.818908 7382909.213962
+330115.798840 7382867.131171
+330126.832297 7382855.033243
+330154.787019 7382823.518641
+330169.168445 7382806.631534
+330193.536057 7382778.896284
+330228.961864 7382738.563193
+330255.762113 7382709.548163
+330291.328106 7382672.564498
+330320.536255 7382636.980593
+330350.569027 7382601.166728
+330365.206086 7382583.509752
+330378.383563 7382558.983953
+330385.681477 7382537.697600
+330389.499482 7382513.221792
+330393.358718 7382503.463464
+330394.208080 7382465.849906
+330403.114009 7382408.749687
+330410.750018 7382377.814986
+330418.278827 7382360.337980
+330428.413444 7382335.022316
+330456.706262 7382294.869194
+330547.266367 7382166.091252
+330621.103116 7382060.789290
+330644.423456 7382037.883213
+330660.577822 7382020.486193
+330756.563947 7381940.919822
+330786.596719 7381993.210865
+330789.853980 7382019.146423
+330792.195909 7382039.752893
+330792.946316 7382068.737928
+330792.121693 7382104.821747
+330840.494082 7382119.499233
+330857.539041 7382115.339946
+330875.078773 7382113.470266
+330891.059968 7382115.399935
+331085.539072 7382035.363645
+331194.463533 7381977.583542
+331210.015924 7381972.024494
+331271.079262 7381908.605357
+331320.490676 7381860.553588
+331355.223799 7381834.088121
+331414.349273 7381775.648132
+331520.610201 7381731.535688
+331553.628108 7381713.888711
+331566.401520 7381700.031084
+331578.861574 7381681.084330
+331588.806528 7381664.197222
+331599.048347 7381650.869505
+331617.280763 7381631.142884
+331726.823691 7381635.412153
+331758.126382 7381622.614345
+331825.489840 7381601.627940
+331832.721785 7381613.245950
+331845.528181 7381624.044100
+331860.569306 7381629.973085
+331871.512054 7381632.912581
+331885.712063 7381632.502651
+331901.371655 7381627.243552
+331918.507322 7381618.155109
+331957.173898 7381595.908919
+331991.766835 7381571.353126
+331999.996573 7381564.084371
+332009.413769 7381558.655301
+332038.489978 7381541.858178
+332058.421118 7381526.740767
+332099.033803 7381500.305295
+332120.721390 7381489.017229
+332140.149509 7381473.629865
+332206.473943 7381431.357106
+332210.992877 7381413.840106
+332239.533081 7381367.488046
+332297.619530 7381276.573619
+332347.847321 7381181.229950
+332434.803823 7381255.517225
+332464.589208 7381221.922980
+332486.647875 7381192.158078
+332499.511995 7381163.253029
+332503.338246 7381161.753286
+332514.033607 7381160.553492
+332521.413983 7381159.333701
+332533.857545 7381159.933598
+332555.437931 7381164.662788
+332603.307300 7381192.468025
+332613.441917 7381197.117229
+332620.797555 7381200.476653
+332627.897560 7381202.046384
+332635.022303 7381202.096376
+332645.486770 7381199.696787
+332656.289332 7381197.897095
+332739.196935 7381174.591087
+332779.463279 7381161.903261
+332789.639128 7381160.703466
+332832.717437 7381149.775338
+332870.996439 7381139.787049
+332898.679036 7381129.918739
+332921.587064 7381125.249539
+332950.110776 7381118.580681
+332999.060401 7381099.593934
+333042.419082 7381080.557194
+333139.567925 7381040.284093
+333139.576171 7381040.254098
+333153.866889 7381030.965689
+333193.976555 7381002.760520
+333214.913735 7380990.692587
+333231.241271 7380982.164048
+333260.309234 7380970.146107
+333265.529098 7380955.848556
+333271.350937 7380941.700979
+333279.679630 7380926.713547
+333289.674062 7380910.906254
+333305.102759 7380890.079822
+333321.290110 7380869.283384
+333342.012888 7380846.577273
+333355.569691 7380835.229217
+333371.229283 7380826.010796
+333392.042769 7380815.182651
+333413.318044 7380803.004737
+333425.819330 7380787.127456
+333465.021910 7380815.932522
+333474.637015 7380823.851166
+333495.252592 7380842.647946
+333516.107309 7380853.176143
+333527.206735 7380863.384394
+333535.840539 7380876.442158
+333541.579915 7380891.679548
+333543.270393 7380904.437362
+333542.148905 7380913.395828
+333538.570041 7380922.774221
+333535.708599 7380932.152615
+333534.611851 7380939.231402
+333537.902097 7380945.690296
+333542.940544 7380951.059376
+333553.091653 7380955.388635
+333575.158567 7380961.177643
+333597.307942 7380960.327789
+333631.150473 7380953.398976
+333637.269176 7380953.468964
+333644.088809 7380955.318647
+333653.976039 7380963.737205
+333665.042481 7380978.374697
+333674.583370 7380991.662421
+333690.209977 7381015.128402
+333682.705907 7381033.385275
+333674.748294 7381044.793321
+333663.211817 7381059.210851
+333641.689155 7381083.216739
+333627.596347 7381097.624271
+333611.928509 7381120.920281
+333546.387468 7381261.136263
+333522.036349 7381326.845008
+333502.072224 7381383.185357
+333496.118446 7381398.412749
+333489.406014 7381413.370187
+333458.457911 7381439.355736
+333429.422932 7381447.294376
+333397.947070 7381439.945634
+333365.160057 7381438.185936
+333306.958161 7381434.986484
+333504.744003 7381735.794958
+333679.893942 7381850.975229
+333718.593503 7381890.078531
+333657.414717 7381971.174640
+333727.936482 7382041.472598
+333699.206614 7382091.204080
+333670.732380 7382150.333951
+333673.742254 7382172.180209
+333642.373593 7382217.122511
+333567.530803 7382312.716137
+333536.500237 7382349.849776
+333505.181053 7382494.724960
+333442.583917 7382494.724960
+333450.162202 7382459.840936
+333417.911194 7382495.554818
+333415.470310 7382573.531462
+333406.490165 7382644.369328
+333376.440901 7382903.784892
+333359.684560 7383039.821590
+333538.231946 7383056.078806
+333543.451810 7383270.122142
+333720.951924 7383270.122142
+333835.805425 7383567.701169
+334164.698088 7383499.832794
+334289.991316 7383703.437919
+334444.336016 7383748.180255
+334346.313072 7383835.115364
+334311.984014 7383892.985451
+334271.049725 7383966.832802
+334229.562938 7384019.943704
+334207.091960 7384050.698436
+334187.457685 7384079.243547
+334174.074052 7384100.549897
+334166.668937 7384114.607489
+334163.090073 7384128.245153
+334162.793209 7384142.732672
+334159.082405 7384159.969719
+334156.872415 7384171.047821
+334119.063448 7384268.301163
+334100.121856 7384312.613572
+334096.023479 7384326.741153
+334094.530911 7384337.379330
+334091.554022 7384370.853596
+334089.789329 7384406.637467
+334087.183520 7384422.334778
+334080.570043 7384447.590452
+334052.640060 7384508.979937
+334026.573725 7384566.590069
+334024.347242 7384575.688510
+334023.341202 7384587.856426
+334022.632026 7384609.702684
+334020.603454 7384634.298471
+334018.937715 7384677.451079
+334018.228539 7384723.923119
+334021.329122 7384770.225188
+334029.558860 7384875.067229
+334032.642950 7384898.003301
+334037.277332 7384918.939714
+334042.769322 7384935.816823
+334051.798944 7384965.491740
+333980.939084 7384979.709305
+333826.149089 7385014.233391
+333763.617922 7385030.410620
+333730.385612 7385050.647154
+333734.665406 7385106.297622
+333741.798396 7385371.712158
+333744.651591 7385434.501403
+333734.376788 7385523.246202
+333734.929285 7385645.395279
+333752.889576 7385791.950176
+333751.726857 7385884.884257
+Region 1
+871
+337213.882056 7403806.924374
+337193.118047 7403823.161592
+337146.798969 7403860.325226
+337131.436242 7403869.833598
+337122.686991 7403878.582099
+337113.566660 7403886.580729
+337061.120633 7403917.935358
+337102.533203 7403993.292450
+337123.940418 7404027.326621
+337130.760051 7404023.077349
+337143.269583 7404017.648278
+337164.973662 7404012.229207
+337184.080178 7404008.919774
+337208.612714 7404007.270056
+337230.085899 7404008.689813
+337250.371626 7404015.758602
+337264.522158 7404025.436944
+337277.262584 7404039.584521
+337289.772116 7404056.571611
+337320.670743 7404094.085186
+337357.242775 7404132.768559
+337381.536171 7404158.244196
+337402.061039 7404180.660356
+337417.638169 7404197.637448
+337484.399652 7404259.676821
+337491.474918 7404263.926093
+337497.140078 7404268.175365
+337522.851826 7404281.153142
+337529.457056 7404283.502740
+337534.883076 7404285.162456
+337539.369026 7404285.392416
+337551.631170 7404282.802860
+337564.140702 7404279.973345
+337570.506792 7404277.613749
+337587.254887 7404269.585124
+337605.660474 7404257.557184
+337620.281041 7404248.598719
+337641.284190 7404240.100174
+337660.629847 7404233.021387
+337673.131133 7404229.481993
+337698.133704 7404224.062921
+337710.164955 7404222.413204
+337733.996561 7404221.463367
+337758.999133 7404224.772800
+337777.404719 7404230.191872
+337785.659196 7404235.151022
+337792.734462 7404242.699729
+337799.817974 7404251.898154
+337805.243994 7404263.216215
+337812.080119 7404276.433951
+337823.171299 7404294.590841
+337839.210218 7404321.726193
+337855.727418 7404347.911707
+337870.826266 7404372.677465
+337884.976798 7404396.743343
+337902.912350 7404428.347929
+337939.946172 7404488.267666
+337965.897060 7404529.310635
+337974.390677 7404544.408049
+337988.310314 7404566.584251
+337999.632389 7404589.470331
+338010.014393 7404607.397260
+338030.539262 7404642.311279
+338044.458899 7404666.367159
+338054.370868 7404682.644371
+338066.633013 7404703.400815
+338070.830344 7404712.589241
+338076.305842 7404723.927299
+338084.799459 7404742.804066
+338090.695514 7404757.661521
+338102.017589 7404777.238168
+338130.096004 7404814.041863
+338136.519818 7404828.789337
+338143.710531 7404841.017243
+338149.326214 7404848.355986
+338158.207404 7404854.934859
+338168.729595 7404859.904008
+338182.542031 7404862.483566
+338215.840310 7404869.322394
+338242.591083 7404879.330680
+338281.447321 7404898.377418
+338308.948501 7404914.054732
+338334.000549 7404930.521911
+338354.162583 7404947.738962
+338366.259804 7404957.587275
+338401.842289 7404979.013605
+338409.098972 7404985.572482
+338416.899906 7404993.711088
+338410.039042 7404995.270821
+338396.911043 7404999.980014
+338388.879214 7405002.129646
+338357.527045 7405008.988471
+338334.800434 7405012.717832
+338309.327827 7405019.966590
+338268.764619 7405027.605282
+338243.292012 7405033.684241
+338226.634626 7405037.603569
+338197.245060 7405043.472564
+338180.785584 7405046.612026
+338161.192540 7405047.791824
+338147.528536 7405050.341387
+338139.447230 7405051.711153
+338110.445237 7405054.650649
+338085.170540 7405058.170046
+338067.342189 7405059.939743
+338047.938808 7405064.049039
+338032.073060 7405067.968368
+338000.325072 7405079.536387
+337984.261415 7405086.385213
+337977.887079 7405091.164395
+337970.399501 7405103.442292
+337966.688698 7405117.529879
+337968.865703 7405126.638318
+337973.038295 7405138.806234
+337975.487426 7405146.144977
+337981.218556 7405154.793496
+337985.720998 7405160.402535
+337994.544465 7405164.541826
+338001.900103 7405164.371855
+338013.057253 7405164.751790
+338024.643207 7405171.190687
+338031.207206 7405173.540285
+338049.596301 7405184.098476
+338064.233360 7405190.067454
+338077.872625 7405194.516692
+338087.768102 7405193.616846
+338093.367293 7405191.917137
+338108.103307 7405189.057627
+338121.775557 7405190.727341
+338128.834331 7405194.346721
+338134.821094 7405202.995239
+338141.764421 7405216.442936
+338151.429003 7405236.499500
+338166.371173 7405259.885494
+338177.025303 7405281.711756
+338190.219272 7405303.058099
+338197.673864 7405312.686450
+338205.713939 7405322.414784
+338218.000823 7405334.922641
+338231.499902 7405351.479805
+338243.984696 7405368.526885
+338258.432092 7405390.903052
+338270.149985 7405408.200090
+338273.720603 7405409.839809
+338283.607834 7405428.546604
+338309.814355 7405465.440285
+338326.174876 7405475.718524
+338341.051077 7405482.957284
+338356.677684 7405490.955914
+338366.284542 7405493.595462
+338375.355396 7405498.494623
+338389.629621 7405514.051958
+338402.312324 7405535.898216
+338406.996183 7405547.306262
+338413.733353 7405556.974606
+338426.003745 7405570.492290
+338442.017925 7405588.589190
+338470.822008 7405619.453904
+338474.293671 7405626.312729
+338479.035254 7405632.921597
+338484.741646 7405643.839727
+338501.794851 7405660.186926
+338510.362684 7405665.336044
+338522.954678 7405672.794767
+338536.857823 7405675.984221
+338559.337048 7405683.812880
+338570.180841 7405688.732037
+338577.214876 7405694.621028
+338592.016860 7405708.158709
+338597.665528 7405724.375931
+338602.860653 7405735.793976
+338610.785281 7405751.781237
+338616.706075 7405766.238761
+338627.426174 7405782.256017
+338635.672405 7405792.704227
+338647.208882 7405804.192260
+338651.472183 7405808.271561
+338657.970213 7405816.170208
+338658.852559 7405828.048173
+338657.953720 7405839.646187
+338658.102152 7405849.484501
+338660.534791 7405858.093027
+338666.801926 7405864.731890
+338674.190548 7405883.238720
+338679.105302 7405897.166334
+338679.954664 7405911.313911
+338682.486256 7405934.050016
+338678.156985 7405958.225875
+338715.652596 7405981.371910
+338762.804543 7405998.838918
+338809.964736 7406026.784132
+338869.337597 7406045.990842
+338970.634294 7406070.436654
+339036.999958 7406045.990842
+339094.740065 7405998.958898
+339101.757608 7405997.679117
+339110.696522 7405997.679117
+339124.096646 7406000.868571
+339147.078891 7406032.783104
+339155.894112 7406071.906403
+339160.949051 7406100.221553
+339171.900045 7406147.763409
+339177.441512 7406177.338343
+339184.013758 7406205.663491
+339188.054411 7406233.208773
+339188.895527 7406251.635617
+339191.385888 7406281.940426
+339197.059295 7406298.147650
+339200.027938 7406306.246262
+339209.981139 7406325.273003
+339220.610530 7406354.388016
+339230.712162 7406384.262899
+339236.517509 7406413.587876
+339237.655489 7406426.725625
+339240.434468 7406453.501039
+339240.244805 7406473.177668
+339241.564202 7406494.384036
+339246.718096 7406511.591089
+339251.929714 7406523.759004
+339270.500225 7406543.875559
+339282.069687 7406553.833853
+339299.914530 7406570.411013
+339329.576222 7406596.946468
+339357.745345 7406647.437819
+339369.174621 7406672.023608
+339386.904017 7406699.958823
+339397.879750 7406718.985564
+339413.786729 7406752.699789
+339422.164899 7406777.265581
+339432.464441 7406813.949297
+339435.573270 7406833.405965
+339476.524052 7406873.179152
+339478.931951 7406885.567030
+339487.499785 7406891.206064
+339503.645904 7406900.194524
+339512.197245 7406910.302793
+339519.693069 7406919.281255
+339527.889822 7406936.518302
+339541.405394 7406955.325081
+339562.804363 7406971.432322
+339579.181377 7406982.190479
+339598.848637 7406993.998457
+339618.985932 7407010.085701
+339635.329962 7407023.873339
+339650.676197 7407037.151065
+339660.983985 7407046.079536
+339671.225804 7407062.086794
+339678.672150 7407079.313843
+339699.889701 7407087.852380
+339714.007248 7407096.570887
+339733.402383 7407109.888606
+339748.468246 7407125.425944
+339763.303215 7407138.443714
+339776.975465 7407141.103259
+339789.410781 7407140.463368
+339805.911489 7407138.103773
+339820.127990 7407136.734007
+339847.348798 7407144.512675
+339844.495602 7407178.736813
+339831.565512 7407299.006212
+339816.540880 7407379.502423
+339785.889641 7407525.957337
+339751.824462 7407634.948668
+339717.767529 7407742.240290
+339683.702350 7407825.685996
+339646.239725 7407912.531120
+339600.258743 7408019.822742
+339554.277760 7408104.978156
+339562.672423 7408107.887657
+339579.758613 7408108.677522
+339610.236682 7408099.919022
+339739.290191 7408048.657803
+339783.506480 7408042.338885
+339830.914060 7408023.382133
+339864.072153 7407998.106462
+339880.523384 7408001.065955
+339911.042683 7407934.997272
+339904.305513 7407922.409428
+339895.086227 7407910.001554
+339879.476112 7407886.945503
+339855.891893 7407853.081303
+339843.481315 7407833.394676
+339836.505004 7407824.506198
+339819.006503 7407802.190021
+339813.514513 7407793.321540
+339806.422755 7407776.834364
+339798.976409 7407760.337190
+339789.039701 7407745.089801
+339778.938068 7407734.101684
+339775.392189 7407728.952566
+339772.901827 7407722.753627
+339772.901827 7407719.554175
+339774.501596 7407706.256453
+339776.101365 7407700.047517
+339779.111239 7407695.618275
+339783.547711 7407692.248853
+339789.748877 7407690.479156
+339815.106036 7407686.929764
+339851.282250 7407682.140584
+339862.629063 7407679.301070
+339871.856595 7407675.931648
+339875.575645 7407670.262619
+339878.412349 7407658.384653
+339880.012117 7407647.206568
+339881.958228 7407634.438755
+339886.567871 7407623.090699
+339890.822926 7407616.001913
+339897.386925 7407608.913127
+339920.797974 7407588.696590
+339926.999139 7407582.137714
+339930.726436 7407575.568839
+339939.055129 7407558.551754
+339945.800545 7407546.133881
+339953.246892 7407534.255915
+339965.838886 7407517.588770
+339973.458403 7407509.430168
+339978.604051 7407503.401201
+339992.078392 7407475.036059
+339996.333447 7407463.857974
+340000.415331 7407455.349431
+340005.198145 7407449.500433
+340011.234386 7407444.891223
+340023.290375 7407439.212196
+340030.027545 7407434.423016
+340034.101183 7407429.633836
+340036.591545 7407422.365081
+340038.364484 7407410.487116
+340042.792710 7407393.460032
+340046.338589 7407384.951490
+340050.775061 7407379.452432
+340058.039991 7407376.792887
+340065.139995 7407376.262978
+340073.823276 7407377.152826
+340086.951275 7407379.282461
+340099.716440 7407381.762036
+340105.389847 7407383.891671
+340108.407967 7407389.030791
+340111.244671 7407394.879789
+340113.190781 7407400.028907
+340116.736660 7407403.218361
+340120.282540 7407403.928239
+340133.410539 7407404.278179
+340151.313106 7407402.508483
+340162.841336 7407400.028907
+340168.514743 7407396.659484
+340172.415210 7407392.220245
+340174.188149 7407385.311428
+340174.724154 7407379.282461
+340172.951215 7407366.864588
+340169.759924 7407356.586349
+340164.086517 7407343.988506
+340157.703934 7407325.731634
+340145.285111 7407288.138073
+340138.547941 7407259.233024
+340135.356649 7407232.637580
+340135.356649 7407222.349342
+340135.538066 7407201.782865
+340134.474303 7407192.734415
+340130.037830 7407170.928150
+340128.438062 7407153.731096
+340126.846539 7407133.694528
+340126.310534 7407112.768112
+340125.782775 7407100.000299
+340123.828419 7407091.841697
+340118.864188 7407084.213004
+340108.762555 7407076.064399
+340099.889611 7407068.255737
+340095.815973 7407060.986982
+340094.216205 7407055.487924
+340094.397622 7407046.799412
+340095.279968 7407040.600474
+340097.762084 7407032.441872
+340103.616907 7407022.153634
+340111.772430 7407010.275668
+340117.272665 7407002.117066
+340125.428188 7406987.399587
+340127.910303 7406979.600923
+340127.728886 7406971.262351
+340125.782775 7406959.204417
+340122.410067 7406946.436604
+340113.190781 7406921.970794
+340109.999490 7406907.603255
+340107.871962 7406897.145047
+340107.698792 7406890.046263
+340108.935726 7406881.187780
+340110.180907 7406871.959361
+340117.800424 7406844.124129
+340118.864188 7406838.275131
+340118.864188 7406830.116528
+340117.800424 7406818.948441
+340116.563490 7406799.621752
+340114.790550 7406763.797888
+340113.545369 7406755.109376
+340109.644902 7406747.840621
+340103.790078 7406740.041957
+340091.560918 7406725.674418
+340076.305392 7406708.297395
+340068.859045 7406702.268427
+340059.994347 7406694.819703
+340049.711298 7406685.951222
+340040.846600 7406682.051890
+340029.672957 7406680.102224
+340013.007325 7406677.802618
+339998.996979 7406675.313045
+339988.887100 7406670.353894
+339979.667815 7406663.435079
+339975.058172 7406656.696233
+339973.103815 7406651.197175
+339969.557936 7406637.549513
+339968.675589 7406625.661549
+339969.557936 7406612.193856
+339968.675589 7406598.186256
+339965.838886 7406591.087472
+339960.693238 7406585.588414
+339954.838414 7406581.339141
+339947.392068 7406575.480145
+339943.673018 7406569.281207
+339939.591134 7406560.592695
+339938.527370 7406554.913668
+339939.945722 7406544.455459
+339941.718661 7406534.877100
+339954.129238 7406489.834815
+339970.267112 7406430.255021
+339974.167579 7406421.566509
+339978.604051 7406415.007632
+339985.159804 7406410.218453
+339992.968985 7406408.268787
+340010.879798 7406404.369455
+340019.035320 7406401.889879
+340023.644963 7406396.920731
+340026.127078 7406391.421673
+340026.481666 7406383.443039
+340025.591073 7406375.284437
+340022.935787 7406362.526622
+340017.616968 7406349.578840
+340012.652737 7406342.839994
+340006.616496 7406338.230784
+339991.905221 7406332.201816
+339975.231343 7406323.863245
+339968.139584 7406315.884611
+339963.711358 7406306.666190
+339963.884529 7406296.557922
+339966.193474 7406286.629622
+339970.093941 7406278.830958
+339975.058172 7406275.101597
+339981.086166 7406271.912143
+339990.305452 7406270.312417
+340005.734150 7406269.072630
+340011.762144 7406267.652873
+340018.680732 7406264.643389
+340022.045194 7406260.914027
+340023.290375 7406256.484786
+340022.754370 7406251.875576
+340020.626842 7406246.376517
+340013.889672 7406238.397884
+340001.833683 7406228.819525
+339994.032748 7406218.891225
+339986.932744 7406204.353716
+339981.613925 7406193.355599
+339976.831111 7406185.906875
+339964.593705 7406176.158545
+339950.055600 7406165.870307
+339936.399842 7406155.232130
+339924.162436 7406138.564985
+339919.198205 7406130.946290
+339907.496804 7406109.489965
+339894.022463 7406083.774370
+339868.657058 7406043.701234
+339859.083184 7406031.463330
+339847.917788 7406012.666550
+339824.861327 7405972.413445
+339816.524388 7405960.535479
+339811.205569 7405947.587697
+339806.595926 7405928.800915
+339802.522288 7405908.934318
+339798.267233 7405884.998418
+339795.603700 7405865.671729
+339792.230992 7405842.445707
+339787.266761 7405825.948533
+339781.593354 7405812.650811
+339775.746777 7405803.072451
+339767.409838 7405793.324121
+339758.899728 7405781.616127
+339755.708436 7405773.637493
+339753.226321 7405764.239103
+339749.499025 7405751.471290
+339745.243970 7405741.193051
+339738.679970 7405732.144601
+339732.478805 7405725.585724
+339728.578338 7405718.496938
+339728.042333 7405711.758093
+339728.932926 7405705.369187
+339731.769629 7405698.810311
+339736.552443 7405693.491222
+339752.335728 7405684.622741
+339767.055250 7405676.294167
+339773.083244 7405672.744775
+339787.448178 7405660.506872
+339801.277107 7405649.158815
+339807.486519 7405643.309817
+339815.460624 7405633.381518
+339817.942739 7405628.592338
+339817.942739 7405624.693006
+339816.878975 7405617.774191
+339812.096162 7405608.735740
+339807.131931 7405601.636956
+339801.458524 7405595.787957
+339791.703233 7405587.809324
+339778.756651 7405574.151664
+339768.193230 7405563.533482
+339764.746305 7405561.213880
+339758.718311 7405551.275582
+339753.399492 7405539.047677
+339749.672196 7405529.649286
+339745.953146 7405513.512051
+339742.935025 7405503.223813
+339739.570563 7405497.024875
+339722.896685 7405476.098459
+339710.667525 7405463.330646
+339704.103525 7405458.361497
+339699.988656 7405456.231862
+339697.366355 7405455.172044
+339674.136723 7405450.202895
+339660.307794 7405445.773654
+339643.279328 7405437.974989
+339631.396509 7405431.236144
+339625.013927 7405425.557116
+339618.812762 7405415.808786
+339615.085465 7405405.520548
+339613.667114 7405399.311612
+339614.376289 7405393.292643
+339615.794641 7405383.714284
+339622.886399 7405353.569447
+339624.659339 7405344.171057
+339625.549932 7405331.403244
+339625.549932 7405321.474945
+339626.613696 7405313.496311
+339630.332746 7405300.368560
+339632.105685 7405289.020504
+339632.823107 7405279.272174
+339631.932514 7405263.844816
+339632.287102 7405245.937884
+339633.886871 7405236.359524
+339636.542157 7405224.831499
+339639.560278 7405215.613078
+339642.751569 7405204.794931
+339646.825207 7405179.439274
+339645.761443 7405174.650095
+339643.106157 7405166.491492
+339636.896745 7405155.503374
+339631.751097 7405142.555592
+339628.559806 7405131.557476
+339625.195344 7405116.140117
+339615.794641 7405092.734126
+339605.866179 7405076.056983
+339595.228542 7405063.999048
+339584.228070 7405055.490505
+339578.554664 7405049.821477
+339575.717960 7405045.212266
+339576.253965 7405038.113482
+339578.381493 7405033.854212
+339581.036779 7405029.784909
+339593.455602 7405022.506155
+339599.656768 7405015.767310
+339603.384064 7405009.738342
+339607.812290 7404999.810043
+339615.085465 7404978.713657
+339623.422404 7404954.947728
+339627.141454 7404940.060278
+339627.496042 7404931.541737
+339626.259108 7404921.973376
+339622.358641 7404909.025594
+339615.440053 7404890.938692
+339613.667114 7404877.640969
+339613.312526 7404860.443915
+339611.184998 7404848.735921
+339607.812290 7404832.248745
+339609.040978 7404820.470762
+339611.399400 7404813.391975
+339618.004631 7404802.543833
+339618.936455 7404800.454191
+339624.139827 7404788.386258
+339629.796741 7404779.887714
+339646.313941 7404758.661350
+339663.771211 7404736.015229
+339687.833712 7404707.700079
+339705.290982 7404685.053958
+339714.254635 7404669.006707
+339733.130257 7404640.231636
+339748.699140 7404611.916486
+339755.535266 7404599.208662
+339756.252688 7404589.740284
+339762.379637 7404568.503922
+339766.362566 7404552.236708
+339770.873255 7404519.432327
+339776.068380 7404501.505398
+339792.577334 7404432.617198
+339801.070951 7404394.393745
+339807.206147 7404371.277705
+339814.281413 7404357.590050
+339820.886644 7404350.041343
+339835.985492 7404337.773444
+339843.539039 7404329.754817
+339851.084340 7404312.767727
+339858.167852 7404289.651687
+339864.773083 7404265.585809
+339874.206771 7404227.842274
+339878.923615 7404208.025669
+339885.528846 7404198.117366
+339892.134076 7404189.618821
+339904.404468 7404181.130275
+339939.319008 7404163.193348
+339957.716349 7404152.345206
+339986.503940 7404136.777873
+339995.937628 7404130.638924
+340004.431245 7404123.090217
+340013.394898 7404113.181914
+340018.111742 7404101.853855
+340022.358551 7404087.226360
+340028.963781 7404065.050159
+340033.688872 7404033.915492
+340036.987364 7404012.209210
+340042.174243 7403997.111796
+340052.086212 7403981.534464
+340067.185060 7403963.607535
+340082.283909 7403948.510121
+340090.777526 7403931.992950
+340097.382757 7403917.365456
+340099.271144 7403906.517314
+340097.382757 7403892.829659
+340088.419104 7403874.432810
+340082.753944 7403852.726528
+340073.790291 7403831.970083
+340070.483553 7403816.392752
+340070.483553 7403805.544610
+340072.371940 7403793.746631
+340078.037100 7403781.008813
+340087.949069 7403760.722288
+340103.987988 7403739.016006
+340113.891711 7403723.918592
+340121.915293 7403718.719482
+340135.125755 7403713.060452
+340154.471412 7403706.451584
+340171.928682 7403699.852714
+340187.027530 7403691.354170
+340195.991183 7403685.225220
+340203.074695 7403678.616352
+340215.336840 7403666.818372
+340239.877623 7403647.471686
+340259.693315 7403636.153625
+340271.015390 7403628.604918
+340281.867429 7403619.166535
+340289.891012 7403607.368556
+340297.906348 7403593.690899
+340307.348282 7403581.423000
+340315.841899 7403566.795505
+340346.509631 7403528.572053
+340358.301741 7403514.414478
+340372.930554 7403494.127953
+340381.894207 7403474.311347
+340390.857860 7403459.213933
+340398.411407 7403446.946035
+340409.914899 7403432.108576
+340424.337556 7403417.091148
+340443.262655 7403394.864956
+340465.486247 7403358.211234
+340485.013321 7403317.058283
+340497.630054 7403282.214252
+340514.749229 7403228.743411
+340521.659570 7403212.526189
+340548.995825 7403173.172929
+340570.625688 7403144.337869
+340581.436496 7403128.120646
+340589.641496 7403112.993238
+340604.567173 7403085.457954
+340633.709352 7403030.487370
+340648.123763 7403003.152052
+340653.228180 7402984.525243
+340656.238054 7402968.607970
+340655.330969 7402962.299050
+340653.533291 7402955.690182
+340643.918186 7402947.581571
+340625.298197 7402933.164041
+340620.490644 7402929.854608
+340617.489016 7402926.255224
+340613.580303 7402916.336923
+340611.477514 7402900.119701
+340611.477514 7402886.302068
+340612.978328 7402870.684743
+340615.798539 7402854.617495
+340620.787509 7402830.131689
+340624.391112 7402813.304572
+340627.095875 7402792.278173
+340631.301453 7402767.352443
+340632.208538 7402733.708206
+340631.301453 7402708.772477
+340627.095875 7402686.846233
+340617.785881 7402652.902047
+340608.170776 7402625.566729
+340599.759621 7402595.221927
+340585.345209 7402563.087432
+340580.834521 7402548.659903
+340580.834521 7402533.042578
+340582.038471 7402522.834327
+340584.141260 7402512.316128
+340597.961942 7402477.472097
+340610.578675 7402449.236933
+340615.081117 7402438.118838
+340617.183906 7402428.810432
+340618.684720 7402414.992799
+340618.684720 7402389.157224
+340617.785881 7402359.722266
+340613.283439 7402326.377978
+340609.077861 7402299.342609
+340601.565545 7402278.616159
+340591.348465 7402261.789041
+340578.731732 7402242.562335
+340573.627316 7402229.344599
+340570.625688 7402214.927068
+340569.726849 7402202.319228
+340572.423366 7402187.891699
+340576.934054 7402169.874785
+340580.537657 7402153.947514
+340580.834521 7402141.939570
+340580.537657 7402127.212093
+340577.536029 7402110.694922
+340567.318949 7402068.942074
+340561.612558 7402044.306294
+340558.008955 7402025.689483
+340556.805005 7402009.162314
+340558.305819 7401993.544989
+340563.113372 7401975.518077
+340573.932426 7401954.191730
+340587.447998 7401927.156361
+340594.053229 7401910.039293
+340599.165892 7401893.512124
+340600.666706 7401878.494696
+340601.507821 7401841.551024
+340601.862409 7401803.397560
+340599.759621 7401741.218210
+340600.963570 7401707.274025
+340602.769495 7401679.038861
+340583.539285 7401682.738227
+340488.089165 7401747.507133
+340416.808747 7401793.609236
+340316.600553 7401865.966842
+340262.076476 7401908.179611
+340230.707814 7401962.430319
+340196.947746 7402027.809120
+340168.943547 7402079.690233
+340137.756302 7402141.949569
+340110.123183 7402193.430750
+340085.458708 7402242.172401
+340067.284015 7402276.226568
+340029.079229 7402346.694498
+339935.212385 7402517.325270
+339928.269059 7402528.333385
+339914.093789 7402563.397378
+339872.318384 7402636.234902
+339814.504061 7402751.015241
+339750.249432 7402870.034854
+339698.034299 7402967.818105
+339677.336260 7403003.162051
+339671.596884 7403017.569583
+339638.653192 7403075.629638
+339622.523565 7403109.943760
+339603.722159 7403142.748141
+339592.837135 7403166.014156
+339575.066508 7403198.608573
+339571.809247 7403207.327079
+339551.086469 7403241.141287
+339528.730938 7403287.493347
+339501.501884 7403339.634416
+339490.534398 7403326.176721
+339484.044614 7403316.518376
+339475.295363 7403304.070508
+339467.288273 7403293.142380
+339454.193259 7403283.923959
+339430.592547 7403282.934128
+339379.103083 7403279.384736
+339347.891100 7403278.574875
+339329.394805 7403275.105469
+339317.775866 7403269.696396
+339309.768776 7403259.268182
+339304.466449 7403250.679653
+339294.537988 7403236.152142
+339269.543662 7403223.534303
+339257.166070 7403218.365188
+339235.346544 7403216.885442
+339211.770571 7403214.375872
+339189.967537 7403211.886298
+339165.336046 7403212.656166
+339137.645203 7403214.395868
+339116.040079 7403216.955430
+339097.197442 7403222.314512
+339072.994755 7403217.515334
+339054.638646 7403213.815968
+339035.210526 7403203.027816
+339022.618532 7403194.569264
+339011.576829 7403182.851272
+339004.493317 7403180.261715
+338993.550569 7403182.921260
+338977.025123 7403185.530813
+338959.543114 7403182.081403
+338949.177602 7403177.942113
+338931.547161 7403165.394262
+338912.869448 7403155.625935
+338895.725535 7403145.107737
+338888.732731 7403145.747627
+338869.312858 7403146.607480
+338845.934794 7403148.137218
+338834.051976 7403144.237886
+338807.697023 7403139.938622
+338766.086543 7403137.998954
+338739.014168 7403130.160297
+338725.407887 7403120.441962
+338714.357938 7403109.733796
+338694.649447 7403101.205257
+338653.632695 7403072.300208
+338631.153471 7403058.432583
+338613.424075 7403032.267065
+338605.639633 7403024.108463
+338572.531017 7402987.954656
+338553.358531 7402976.906548
+338528.141557 7402961.519184
+338509.043287 7402944.422112
+338494.266042 7402926.355207
+338483.570681 7402906.058684
+338469.642797 7402880.443071
+338460.159632 7402865.575618
+338450.684713 7402849.968291
+338431.165885 7402824.292689
+338411.333700 7402804.156139
+338393.967139 7402790.868415
+338389.852270 7402785.999249
+338377.936466 7402771.271771
+338371.644592 7402766.412604
+338363.365377 7402757.254173
+338358.706256 7402742.816646
+338356.141679 7402722.100194
+338350.996031 7402705.143099
+338338.189635 7402692.405281
+338310.688455 7402677.237879
+338304.421320 7402672.208740
+338222.758898 7402744.796306
+338163.740625 7402794.227839
+338168.383253 7402805.975827
+338180.562936 7402861.376337
+338193.633211 7402916.906825
+338191.068634 7402980.745890
+338173.743303 7403053.073501
+338172.390921 7403057.542736
+338160.763736 7403082.698427
+338150.620872 7403101.005291
+338135.051989 7403129.120475
+338038.290718 7403234.742383
+337909.657766 7403366.019896
+337799.669542 7403482.999859
+337771.657097 7403509.505319
+337706.660307 7403575.983932
+337664.563299 7403561.206463
+337649.200572 7403615.967083
+337630.580583 7403667.568244
+337601.042585 7403775.399773
+337475.980251 7403715.200085
+337433.718318 7403712.450556
+337360.582499 7403736.176492
+337299.700578 7403755.933108
+337271.696379 7403768.960876
+337264.241786 7403772.430282
+337213.882056 7403806.924374
+Region 1
+354
+323728.713878 7398532.747792
+323748.999605 7398458.030591
+323509.298173 7398295.668402
+323369.285423 7398217.451800
+323213.489387 7398119.318609
+323021.822248 7398089.763671
+322810.331171 7398086.984148
+322637.292267 7398096.632495
+322401.062497 7398103.231365
+322107.109114 7398101.221709
+321962.148625 7398073.036537
+321839.329266 7397988.471022
+321728.590634 7397885.788610
+321664.162834 7397793.174474
+321647.785820 7397771.298222
+321429.648281 7397747.092368
+321325.490142 7397735.444363
+321300.165967 7397733.434707
+321275.559215 7397736.734142
+321249.674297 7397741.273365
+321228.110404 7397744.082883
+321214.652556 7397747.492299
+321193.797838 7397756.610737
+321165.587483 7397766.429056
+321135.604189 7397776.477335
+321108.366889 7397790.075005
+321081.632609 7397805.202414
+321062.765233 7397819.389984
+321039.799481 7397837.816828
+321024.379030 7397863.132491
+321020.099236 7397889.058050
+321020.173452 7397909.984466
+321022.226763 7397936.979842
+321025.162422 7397978.602712
+321026.044768 7397984.841644
+321029.170090 7398013.936660
+321030.555456 7398059.078927
+321032.344888 7398086.574218
+321029.854527 7398111.509946
+321018.532452 7398131.316554
+320996.910835 7398141.444819
+320984.186901 7398147.623761
+320961.559245 7398156.482243
+320948.818818 7398164.930796
+320937.579206 7398175.159044
+320928.838201 7398189.946511
+320914.283604 7398203.164247
+320901.312283 7398208.333361
+320881.793455 7398209.153221
+320869.646758 7398207.523500
+320856.988794 7398205.893779
+320843.819563 7398205.763802
+320824.556369 7398206.333704
+320800.452636 7398209.633139
+320781.181195 7398211.712783
+320760.128569 7398213.532471
+320739.364560 7398212.072721
+320720.884757 7398209.873098
+320695.560583 7398208.623312
+320679.818528 7398212.252690
+320670.104469 7398217.021873
+320667.350228 7398218.181675
+320650.519671 7398230.369587
+320637.276224 7398238.568183
+320625.541838 7398247.776605
+320592.194081 7398265.353594
+320578.703248 7398272.792320
+320562.136571 7398284.230361
+320551.820536 7398305.556708
+320544.481391 7398333.471926
+320542.287894 7398353.368518
+320542.304386 7398380.593855
+320543.046547 7398412.108457
+320544.192773 7398425.986080
+320548.860139 7398443.683048
+320555.102536 7398454.081267
+320563.629138 7398464.239527
+320565.814390 7398475.357623
+320565.501033 7398482.916328
+320557.329018 7398490.655002
+320550.962928 7398493.614495
+320542.345617 7398494.294379
+320521.004372 7398501.143206
+320512.032473 7398512.401277
+320509.880207 7398527.258732
+320511.273820 7398542.146182
+320512.964297 7398552.244453
+320517.656403 7398565.902113
+320515.223765 7398583.529094
+320510.350242 7398590.787851
+320498.368469 7398598.736489
+320477.266365 7398607.864925
+320466.571004 7398613.563949
+320442.442533 7398620.642737
+320423.641127 7398625.751861
+320390.351094 7398637.279887
+320372.283603 7398646.688275
+320361.151191 7398656.546587
+320349.812624 7398666.634859
+320333.138746 7398690.170827
+320325.370796 7398709.767470
+320308.334084 7398746.151238
+320299.024089 7398767.747539
+320289.202829 7398790.593626
+320277.072623 7398815.939284
+320262.963323 7398836.475766
+320241.745771 7398857.702131
+320227.999305 7398865.380815
+320211.712999 7398874.049330
+320200.300216 7398878.118633
+320181.721458 7398884.597524
+320159.118540 7398889.926611
+320144.399019 7398892.556160
+320130.924678 7398897.975232
+320115.875307 7398910.183141
+320110.688428 7398923.240904
+320111.133724 7398931.059565
+320113.335468 7398940.407964
+320115.834076 7398944.217311
+320123.874150 7398952.365915
+320133.481009 7398954.975468
+320141.850933 7398954.045628
+320154.261510 7398954.165607
+320170.737479 7398953.825665
+320181.878137 7398955.185433
+320189.456423 7398957.535030
+320198.016010 7398963.663980
+320203.013226 7398972.282504
+320202.939010 7398980.351122
+320199.294176 7398992.419055
+320190.594403 7399001.657472
+320183.444921 7399008.396318
+320168.898570 7399020.104312
+320154.640837 7399028.792824
+320141.422129 7399033.452026
+320128.475547 7399036.351529
+320116.229895 7399045.819908
+320108.750563 7399060.617373
+320104.577971 7399074.445004
+320099.432323 7399083.973372
+320094.064027 7399089.212475
+320088.473082 7399090.932180
+320073.761807 7399092.801860
+320058.786652 7399096.441237
+320045.353542 7399099.550704
+320031.706031 7399110.278866
+320022.272343 7399119.437298
+320002.102063 7399148.392338
+319993.072440 7399162.419935
+319980.645370 7399187.535633
+319970.370567 7399208.032122
+319965.109472 7399218.860267
+319940.139885 7399259.353331
+319915.129068 7399302.615921
+319905.357285 7399320.572845
+319902.957631 7399326.111896
+319896.674004 7399344.348772
+319895.676210 7399349.667861
+319895.280391 7399362.865601
+319895.898858 7399368.904566
+319901.291893 7399385.891656
+319907.592013 7399403.818586
+319917.198872 7399418.995986
+319923.837087 7399428.584344
+319939.430710 7399449.630738
+319947.949066 7399462.038613
+319956.830256 7399475.116373
+319968.045130 7399492.173451
+319982.212154 7399515.519452
+319990.450139 7399527.907330
+319995.010304 7399536.075931
+320009.144344 7399562.211454
+320029.248654 7399595.605734
+320042.285944 7399615.932253
+320056.906511 7399639.978134
+320066.933928 7399658.644936
+320075.806872 7399676.601860
+320086.040444 7399696.888386
+320095.803981 7399718.104751
+320106.260202 7399740.250958
+320119.445925 7399767.536284
+320125.119331 7399780.114130
+320130.075316 7399793.621816
+320139.393557 7399813.438422
+320146.402853 7399830.905430
+320150.509475 7399838.374150
+320153.939907 7399843.983189
+320161.509947 7399853.571547
+320168.412042 7399861.310222
+320176.023313 7399867.659134
+320188.747247 7399875.467796
+320201.735060 7399880.956856
+320209.610211 7399884.996164
+320232.534732 7399897.793972
+320253.372957 7399908.942063
+320258.460881 7399912.241497
+320267.408041 7399923.949492
+320277.188071 7399943.766098
+320282.647075 7399955.194140
+320284.205613 7399960.773184
+320289.953236 7399986.108845
+320292.921879 7399996.567053
+320301.852547 7400015.553801
+320315.318641 7400033.130790
+320320.282872 7400038.089941
+320335.018886 7400048.158216
+320351.041312 7400056.516784
+320357.415649 7400058.506444
+320377.404512 7400061.475935
+320392.288958 7400062.895692
+320396.882109 7400062.865697
+320403.907897 7400062.755716
+320421.480615 7400060.776055
+320439.482136 7400057.796565
+320455.075758 7400056.376808
+320474.355445 7400053.687269
+320484.135475 7400052.837415
+320514.184739 7400050.987731
+320519.140724 7400051.837586
+320533.035623 7400056.096856
+320547.210893 7400062.045837
+320561.386164 7400067.574890
+320573.433907 7400072.674017
+320580.237047 7400079.902779
+320584.483856 7400091.250835
+320584.772474 7400101.169136
+320584.203484 7400114.066927
+320580.517419 7400129.804231
+320575.413002 7400142.412071
+320569.888027 7400152.900275
+320566.630766 7400163.108526
+320565.212415 7400170.907190
+320563.934249 7400190.603817
+320561.806721 7400241.915027
+320562.515897 7400250.283594
+320566.911138 7400262.191554
+320572.584545 7400276.359127
+320583.213936 7400292.516360
+320590.866438 7400305.704101
+320598.238568 7400316.192304
+320603.763543 7400322.281261
+320611.704663 7400328.660169
+320623.892592 7400336.888759
+320631.545094 7400344.257497
+320644.161827 7400357.015312
+320664.290876 7400382.101015
+320669.106675 7400387.200141
+320675.909815 7400391.459412
+320717.586265 7400415.125358
+320731.332731 7400422.784046
+320738.985233 7400427.743197
+320743.660846 7400432.702347
+320746.497549 7400438.801303
+320750.183614 7400451.129191
+320750.612418 7400458.078001
+320749.474439 7400466.576545
+320746.497549 7400475.085087
+320740.832389 7400486.843073
+320735.158982 7400498.471082
+320732.470711 7400506.829650
+320732.610897 7400512.078751
+320733.320073 7400516.897925
+320732.891269 7400524.976541
+320731.332731 7400530.505594
+320726.657118 7400536.884502
+320719.713792 7400547.512681
+320707.097059 7400562.680083
+320698.306577 7400570.618723
+320689.804714 7400580.826975
+320668.117127 7400596.274329
+320643.172279 7400613.561368
+320612.265407 7400632.418138
+320606.880618 7400635.247653
+320571.166193 7400649.855151
+320554.294405 7400654.954277
+320545.512170 7400657.083913
+320512.626202 7400661.043235
+320484.135475 7400663.742772
+320463.866240 7400665.442481
+320439.910940 7400667.282166
+320430.419529 7400671.601426
+320519.247925 7400668.371979
+320599.071438 7400661.123221
+320651.492726 7400648.615363
+320693.886598 7400620.600162
+320754.413931 7400594.194685
+320771.063070 7400550.142231
+320790.466451 7400507.589520
+320811.123259 7400473.505358
+320829.141273 7400428.203118
+320836.678328 7400380.111356
+320848.124096 7400288.097117
+320862.893095 7399944.915901
+320866.076140 7399938.087070
+320857.203196 7399889.555383
+320873.505994 7399825.656329
+320901.411238 7399755.218394
+320963.241476 7399650.296366
+321044.796697 7399541.534996
+321113.496044 7399453.210125
+321202.720260 7399351.847488
+321260.963387 7399303.635746
+321339.813844 7399265.572266
+321436.335974 7399243.815993
+321568.201448 7399228.868553
+321670.273291 7399221.439826
+321759.951050 7399215.590827
+321879.859489 7399206.542377
+321908.779020 7399203.722860
+321966.222263 7399200.423425
+322094.170778 7399192.034862
+322193.109053 7399181.566655
+322392.972945 7399167.499065
+322464.888323 7399161.410108
+322580.162381 7399152.961555
+322758.734505 7399139.843802
+322869.143288 7399131.745189
+322955.530800 7399123.646577
+323033.202046 7399119.787238
+323082.283611 7399112.658459
+323118.797920 7399107.119408
+323152.656943 7399100.450550
+323196.007378 7399089.912355
+323224.506351 7399080.224015
+323253.409390 7399072.815284
+323290.649367 7399060.407409
+323336.251023 7399042.230522
+323386.371612 7399017.544751
+323417.863967 7398998.288049
+323458.855980 7398976.321812
+323489.952516 7398952.495893
+323512.679127 7398932.529313
+323539.199005 7398909.883192
+323563.830496 7398887.996941
+323600.880810 7398842.014818
+323619.022518 7398818.258887
+323633.370959 7398796.822559
+323655.990370 7398757.779246
+323671.773655 7398722.585275
+323683.351363 7398683.611951
+323697.386448 7398645.258520
+323705.071935 7398620.162819
+323738.634093 7398607.974907
+323760.173248 7398607.634965
+323778.727267 7398615.593602
+323790.659562 7398636.480024
+323786.676633 7398674.933437
+323806.566541 7398658.686220
+323818.836933 7398640.789286
+323818.498837 7398619.242976
+323806.566541 7398597.366724
+323786.709618 7398579.659757
+323743.070565 7398541.736253
+323728.713878 7398532.747792
+Region 1
+524
+325145.243132 7405147.694712
+325199.882656 7405207.124532
+325238.417292 7405261.515215
+325274.675968 7405281.921720
+325324.532679 7405286.450944
+325375.214012 7405273.403179
+325545.927479 7405414.878945
+325664.887603 7405456.271855
+325614.082576 7405535.638261
+325652.246131 7405634.771280
+325679.755556 7405771.437870
+325721.143388 7405941.368763
+325711.148956 7406058.758655
+325601.259687 7406208.622984
+325516.340004 7406266.063145
+325284.183872 7406381.113438
+325183.876723 7406489.574860
+325156.680654 7406585.758384
+325166.073111 7406627.001320
+325171.301221 7406602.245560
+325178.087869 7406573.330513
+325166.073111 7406627.001320
+325162.848835 7406678.852438
+325171.969166 7406768.877018
+325254.794306 7406833.875884
+325385.101243 7406884.707177
+325466.326615 7406904.283824
+325543.206223 7406979.400957
+325727.361046 7407039.950585
+325874.869620 7407079.163869
+325997.565286 7407092.791534
+326072.540015 7407113.238032
+326202.055313 7407542.664475
+326195.235680 7407651.725794
+326236.128738 7407760.787113
+326208.866700 7407863.029599
+326147.522990 7408026.621578
+326127.072338 7408203.841222
+326018.007691 7408435.601523
+326011.196305 7408599.193501
+326065.728628 7408633.267665
+326202.047067 7408619.639999
+326393.532789 7408578.846986
+326364.069007 7408604.372614
+326342.991641 7408631.927894
+326325.724034 7408650.884647
+326304.399282 7408679.699711
+326291.708333 7408702.445815
+326287.931559 7408731.250881
+326290.248750 7408751.457420
+326295.353167 7408770.654132
+326303.005669 7408784.291796
+326307.862699 7408809.297512
+326308.662583 7408833.553358
+326310.212874 7408858.559074
+326306.939121 7408880.795265
+326304.407528 7408894.692885
+326294.775930 7408920.718427
+326285.136087 7408936.895656
+326268.379746 7408962.171326
+326267.381952 7408977.828644
+326268.173590 7408999.304966
+326268.956982 7409012.952628
+326273.550133 7409029.619773
+326280.180102 7409043.507394
+326293.687428 7409063.713933
+326302.865483 7409085.690169
+326307.722513 7409104.886881
+326306.502070 7409147.329610
+326302.725297 7409177.904373
+326299.971056 7409210.238835
+326294.413096 7409240.563640
+326287.568725 7409259.260438
+326276.403329 7409275.177711
+326265.468827 7409280.746757
+326259.622249 7409280.496800
+326242.329904 7409278.987059
+326231.395402 7409277.737273
+326213.591790 7409275.217704
+326180.780038 7409270.688480
+326164.749366 7409268.678824
+326152.792331 7409259.850337
+326143.886402 7409254.801202
+326125.555031 7409242.433320
+326102.663495 7409237.394183
+326082.320044 7409239.173878
+326066.050231 7409242.463315
+326051.050337 7409247.532447
+326005.547637 7409261.200105
+325984.453779 7409269.038763
+325958.775017 7409272.088240
+325930.803802 7409276.907415
+325919.671391 7409290.685055
+325909.668713 7409300.173430
+325895.114116 7409308.082075
+325878.860795 7409310.171717
+325846.832436 7409315.610785
+325788.449123 7409319.240164
+325758.927617 7409327.498749
+325721.102157 7409330.098304
+325689.090289 7409334.277588
+325654.761231 7409341.206401
+325627.565163 7409346.205545
+325603.914973 7409350.984726
+325583.084995 7409353.524291
+325567.615066 7409353.344322
+325541.730148 7409353.814242
+325426.431351 7408741.909055
+325270.173526 7408757.036464
+325209.695671 7408787.281284
+325164.324910 7408757.036464
+324947.589230 7408767.114738
+324786.292958 7408782.232148
+324674.861644 7408739.399485
+324605.832447 7408468.165945
+324473.785555 7408232.826257
+324388.098973 7408147.140934
+324226.802701 7408091.700430
+323987.381641 7408069.404249
+323962.189406 7408173.676388
+323932.321559 7408300.704630
+323909.265098 7408387.819708
+323919.341992 7408488.632439
+323944.542473 7408521.396827
+324000.311730 7408553.851268
+323981.502078 7408563.689583
+323929.468363 7408602.053011
+323902.181586 7408619.340050
+323865.461121 7408626.088894
+323816.610450 7408629.438321
+323803.399989 7408644.275779
+323792.391271 7408651.764496
+323778.042830 7408652.944294
+323762.630624 7408649.064959
+323744.876490 7408637.856879
+323694.623960 7408599.153508
+323662.950188 7408582.016444
+323625.256668 7408566.999016
+323595.751655 7408563.279653
+323560.243386 7408565.459280
+323531.612473 7408575.157618
+323499.311987 7408595.554125
+323471.142864 7408626.788774
+323433.168971 7408686.008631
+323412.033882 7408714.133813
+323356.272871 7408680.809521
+323340.761711 7408665.532138
+323332.771113 7408647.615207
+323338.073440 7408622.979427
+323349.016188 7408583.066264
+323369.186468 7408506.809326
+323378.001688 7408480.363856
+323381.753723 7408451.678769
+323376.789492 7408433.241927
+323369.953367 7408430.022479
+323310.407336 7408525.216173
+323285.949016 7408575.167617
+323266.083846 7408604.292628
+323240.083481 7408624.859105
+323189.567072 7408664.212364
+323171.128500 7408685.708682
+323156.079129 7408692.207569
+323121.346006 7408697.166719
+323084.922405 7408707.474954
+323012.512254 7408723.502208
+322973.557060 7408733.830439
+322892.216241 7408763.895289
+322856.287414 7408773.943568
+322797.541267 7408796.149764
+322746.307436 7408812.696930
+322706.362695 7408824.314940
+322646.717708 7408831.833652
+322618.490861 7408831.143770
+322552.166428 7408825.304770
+322542.592554 7408824.914837
+322415.180044 7408807.857759
+322404.113603 7408809.247521
+322380.933448 7408809.517475
+322358.701611 7408803.438516
+322329.963497 7408801.988764
+322313.132940 7408807.247863
+322284.716429 7408813.396810
+322253.496200 7408815.526445
+322238.108734 7408813.926719
+322203.441580 7408824.214957
+322179.230647 7408821.955344
+322153.997181 7408817.926034
+322122.339902 7408827.174450
+321973.693348 7408865.477889
+321996.263281 7408563.349641
+321935.925612 7408473.505031
+321799.829821 7408443.270209
+321704.066344 7408372.702297
+321598.217728 7408216.449062
+321497.407558 7408145.881150
+321436.921456 7408110.597193
+321426.836316 7408060.195827
+321371.396908 7408024.911870
+321361.311768 7407984.588777
+321401.635835 7407868.658635
+321446.998350 7407808.168997
+321537.731626 7407782.963314
+321517.569592 7407682.160581
+321361.352999 7407680.190918
+321364.602014 7407675.361745
+321356.331044 7407684.780132
+321300.413354 7407685.050086
+321039.337692 7407658.644609
+320752.566775 7407630.059505
+320617.988291 7407611.932610
+320597.818011 7407607.713333
+320325.016208 7407570.939632
+320309.117476 7407583.667452
+320298.603532 7407592.395957
+320286.786683 7407604.903814
+320275.497593 7407614.382190
+320260.679117 7407622.060875
+320245.769932 7407628.669743
+320242.957967 7407619.801262
+320236.369229 7407610.192908
+320231.817310 7407606.663513
+320223.241230 7407602.644201
+320214.920783 7407601.164455
+320172.576389 7407596.285290
+320118.679025 7407597.045160
+320071.279691 7407586.107034
+320059.438104 7407587.936720
+320047.860396 7407588.506623
+320052.494778 7407577.808455
+320049.600351 7407562.881012
+320045.015447 7407540.114912
+320044.363995 7407530.256600
+320043.852728 7407506.270709
+320043.753774 7407491.623218
+320041.213934 7407467.857289
+320031.780247 7407446.560937
+320018.759448 7407428.504030
+320007.660022 7407420.305434
+319987.267094 7407402.688452
+319969.562436 7407394.679824
+319954.166724 7407384.421581
+319937.971127 7407377.702732
+319923.028957 7407372.493624
+319908.598053 7407367.804427
+319903.073079 7407361.445516
+319892.625104 7407340.379125
+319885.887934 7407328.441170
+319877.608718 7407318.512870
+319871.160166 7407303.305475
+319866.220674 7407290.117734
+319857.751795 7407273.880515
+319849.843660 7407252.844119
+319842.009741 7407224.738933
+319833.425415 7407195.363965
+319822.985687 7407173.037789
+319814.244682 7407159.060183
+319806.443748 7407151.661450
+319798.857216 7407148.052069
+319793.291010 7407145.972425
+319791.056282 7407140.653336
+319792.639558 7407132.544725
+319790.850126 7407125.675901
+319779.767192 7407109.968592
+319766.746394 7407099.850325
+319752.439183 7407091.531750
+319743.599224 7407086.902543
+319739.863682 7407079.283848
+319741.512928 7407067.685835
+319743.648702 7407058.117474
+319748.827334 7407049.079022
+319763.992153 7407033.321721
+319769.327464 7407009.645776
+319771.982750 7406998.807633
+319771.652901 7406982.140488
+319769.277986 7406965.963259
+319762.177982 7406940.637597
+319755.110962 7406912.292452
+319751.532098 7406890.536179
+319743.607470 7406870.769565
+319736.804330 7406841.664550
+319729.168321 7406818.858457
+319726.339863 7406797.872051
+319723.206296 7406757.698933
+319722.513612 7406727.134168
+319718.374005 7406717.115884
+319719.784110 7406704.688013
+319725.383301 7406696.359439
+319726.158446 7406671.873634
+319724.080396 7406651.907054
+319722.793984 7406629.170948
+319722.859954 7406599.636007
+319723.255773 7406586.248301
+319725.399793 7406575.420155
+319730.660888 7406559.312914
+319738.478315 7406540.456144
+319747.912003 7406514.290626
+319755.795399 7406490.124766
+319758.500163 7406474.497442
+319760.281349 7406450.021635
+319759.720605 7406431.084879
+319755.416073 7406406.299124
+319750.278671 7406387.052421
+319746.007124 7406358.727273
+319741.133601 7406338.990654
+319738.173204 7406330.622087
+319727.758215 7406309.145766
+319707.975508 7406302.296939
+319701.980498 7406292.898549
+319693.569343 7406270.842327
+319688.135077 7406256.654757
+319676.911957 7406236.088280
+319667.659686 7406222.110674
+319655.405787 7406203.293897
+319639.911120 7406178.648119
+319627.945839 7406156.561902
+319614.974519 7406133.455860
+319606.043851 7406112.919377
+319603.438042 7406095.472366
+319600.840479 7406077.005529
+319600.988911 7406063.127906
+319603.883338 7406053.309588
+319609.630961 7406039.222001
+319620.755126 7406020.145269
+319628.539568 7406005.327807
+319637.651653 7405984.971294
+319640.900668 7405966.064532
+319642.154095 7405944.108293
+319644.075467 7405930.740583
+319623.699031 7405911.353904
+319597.706912 7405893.416976
+319578.534425 7405880.599172
+319566.156833 7405872.900491
+319545.343347 7405870.670872
+319523.993856 7405870.460908
+319512.366671 7405865.041837
+319501.811495 7405853.573801
+319485.286049 7405830.427766
+319473.048643 7405809.851290
+319466.055839 7405798.673205
+319459.038297 7405789.514774
+319446.924584 7405781.566135
+319433.780093 7405774.617326
+319411.498777 7405766.818661
+319401.438376 7405757.120323
+319390.932678 7405741.113065
+319378.860196 7405728.875161
+319370.308855 7405720.456603
+319352.826846 7405715.477456
+319342.939616 7405713.617774
+319317.532979 7405712.347992
+319299.531458 7405708.378672
+319288.184644 7405700.440031
+319275.130861 7405684.652736
+319267.115525 7405673.464652
+319261.895661 7405663.066433
+319260.749435 7405651.438425
+319266.802168 7405631.551831
+319270.512972 7405617.444248
+319271.923077 7405604.326495
+319270.001706 7405593.958271
+319264.897289 7405571.692085
+319256.717028 7405552.415387
+319249.460345 7405541.737216
+319243.490074 7405529.309345
+319235.986004 7405518.121261
+319235.161381 7405499.934376
+319236.084959 7405485.296884
+319239.317481 7405467.659905
+319244.636300 7405445.743659
+319251.934214 7405428.396630
+319261.021561 7405410.809643
+319260.947344 7405393.892540
+319259.067204 7405379.235051
+319257.162325 7405367.597044
+319252.981486 7405354.169344
+319248.107963 7405334.682682
+319240.653371 7405318.195506
+319235.746864 7405301.738325
+319230.955804 7405274.163049
+318996.424758 7404953.697942
+318781.668173 7404524.191512
+318558.962222 7404213.984648
+318412.674090 7403906.477321
+318417.019854 7403895.219249
+318439.664003 7403836.619287
+318442.533691 7403795.776283
+318440.447395 7403736.216485
+318411.000105 7403666.298461
+318372.613902 7403568.545206
+318335.060567 7403493.997975
+318320.893543 7403420.200616
+318333.699939 7403343.133817
+318350.514004 7403275.185456
+318373.743635 7403232.032847
+318419.889542 7403183.551152
+318473.069484 7403146.237543
+318634.266800 7403082.758417
+318878.751046 7402970.657618
+318936.779771 7402963.668816
+318994.973421 7402936.003554
+319053.686583 7402905.808726
+319076.940954 7402940.782736
+319089.722611 7402957.949795
+319251.868245 7402978.646250
+319392.161367 7402959.099598
+319553.160774 7403009.700931
+319801.990783 7403122.831552
+320024.746212 7403086.307809
+320154.047108 7403020.469086
+320162.441771 7402998.272888
+320167.793575 7402987.434745
+320179.701132 7402972.937228
+320191.625181 7402969.117882
+320205.957130 7402973.797081
+320228.700234 7402978.326305
+320255.508730 7402983.415433
+320273.749393 7402984.805195
+320298.504577 7402985.275115
+320315.302149 7402983.895351
+320337.608203 7402978.886209
+320436.727895 7402942.572429
+320477.307596 7402925.625332
+320500.182640 7402922.055943
+320515.182533 7402910.117988
+320551.746320 7402899.129871
+320563.282797 7402896.090391
+320583.428338 7402897.310182
+320591.023117 7402898.150038
+320613.700251 7402903.089192
+320633.854039 7402904.129014
+320663.136404 7402905.098848
+320684.469402 7402905.048857
+320702.058612 7402904.139013
+320734.392083 7402893.740794
+320783.655065 7402888.311724
+320830.163805 7402903.879057
+320970.762038 7402996.433203
+320991.410599 7403092.356773
+320946.930431 7403487.869025
+321002.658458 7403453.704877
+321028.238266 7403437.807600
+321090.332382 7403422.910152
+321099.073387 7403445.296317
+321119.260159 7403477.970720
+321142.918595 7403512.094875
+321155.279695 7403532.961301
+321207.090762 7403600.209782
+321214.561847 7403620.636283
+321219.319922 7403644.732156
+321210.348023 7403660.849395
+321191.043597 7403684.125408
+321169.050900 7403699.072848
+321245.361518 7403734.656752
+321336.927664 7403766.711262
+321382.710736 7403782.728518
+321421.624699 7403798.755773
+321455.962003 7403828.510676
+321478.738092 7403839.368816
+321524.059376 7403861.585011
+321608.946074 7403877.032365
+321698.615586 7403892.609696
+321692.966918 7403783.368408
+321691.746476 7403764.421654
+321698.615586 7403711.770673
+321714.638012 7403643.092436
+321723.799574 7403581.283024
+321753.560221 7403527.492238
+322389.946578 7403916.655578
+322511.900084 7404001.031125
+322804.212468 7404268.035389
+323137.508618 7404495.796376
+323487.478646 7404590.230200
+323840.186424 7404582.341552
+324445.839080 7404704.830570
+324434.236633 7404756.791670
+324405.193409 7404825.569889
+324397.697585 7404837.227892
+324379.423938 7404843.986734
+324362.659351 7404844.446655
+324342.522056 7404845.316506
+324328.346786 7404843.046895
+324308.242475 7404849.335818
+324299.872551 7404856.994506
+324293.036426 7404864.993136
+324288.162904 7404879.110718
+324285.944668 7404893.598236
+324285.656049 7404909.655486
+324288.014471 7404942.909790
+324292.789039 7404979.843463
+324324.248409 7405126.198394
+324334.185117 7405149.464409
+324345.680362 7405162.782127
+324361.348201 7405176.489779
+324375.853320 7405185.968156
+324391.183063 7405193.896798
+324408.673318 7405202.195376
+324428.175654 7405211.283819
+324444.231065 7405227.321072
+324463.395305 7405317.145686
+324508.345508 7405326.324114
+324537.240300 7405336.972290
+324558.053786 7405349.740103
+324569.796419 7405364.567563
+324585.109669 7405384.724111
+324604.950100 7405400.021490
+324644.086711 7405409.219915
+324677.450960 7405421.937736
+324700.548652 7405433.955678
+324711.969681 7405440.624536
+324735.496177 7405472.879011
+324746.702805 7405493.085549
+324746.777021 7405498.524618
+324746.875976 7405521.450691
+324741.202569 7405560.254044
+324762.552060 7405557.054592
+324820.217951 7405549.615866
+324853.573954 7405549.125950
+324907.801167 7405533.498627
+324930.783412 7405516.951461
+325043.863973 7405356.458952
+325043.855726 7405356.408961
+325149.547664 7405210.373975
+325157.142443 7405185.238281
+325145.243132 7405147.694712
+Region 1
+718
+323801.594064 7374893.696948
+323341.363686 7374955.656335
+323049.917156 7375031.743302
+322777.700836 7375177.838277
+322504.519707 7375393.701301
+322310.749779 7375670.223936
+321932.519918 7376293.277212
+321597.722954 7376956.403625
+321575.021081 7377366.123443
+321575.021081 7377366.143440
+321514.757627 7377376.651640
+321604.047813 7377768.444529
+321611.758039 7377807.797789
+321425.846769 7377844.301536
+321247.093227 7377890.583608
+321055.417842 7377960.361656
+320997.356132 7378016.532034
+320978.026967 7378042.977504
+320950.113476 7378116.554901
+320938.700693 7378147.009685
+320932.359342 7378199.020776
+320940.382924 7378246.772596
+320973.483294 7378326.508938
+320987.130806 7378405.445417
+320999.590860 7378490.820793
+321110.378969 7378603.311524
+321224.712957 7378714.632456
+321370.019787 7378825.723427
+321405.272423 7378864.896717
+321423.298683 7378924.666479
+321415.687412 7378996.984092
+321340.547759 7379131.341078
+321308.956449 7379220.105873
+321262.324015 7379298.332473
+321233.726087 7379338.945517
+321213.333159 7379366.700763
+321245.592413 7379419.461725
+321278.676290 7379466.353693
+321305.319862 7379480.311302
+321323.082242 7379512.025870
+321364.948355 7379545.010220
+321382.702490 7379556.428264
+321411.885900 7379570.375875
+321418.227252 7379575.455005
+321451.212174 7379591.942181
+321488.872709 7379634.864828
+321509.570748 7379661.720228
+321551.189474 7379698.044006
+321578.146402 7379727.798910
+321631.235635 7379786.138917
+321653.417996 7379810.524740
+321656.716488 7379836.780242
+321668.285950 7379867.355005
+321678.626723 7379918.226291
+321683.401290 7379946.841390
+321678.230904 7379973.766778
+321662.282694 7380001.392046
+321647.357016 7380037.795810
+321622.469892 7380086.707432
+321593.286482 7380120.951566
+321538.745912 7380162.824394
+321540.708515 7380182.531018
+321548.657882 7380268.376314
+321573.858363 7380307.589597
+321593.443160 7380349.462424
+321606.282541 7380393.574868
+321610.949908 7380432.868138
+321613.836089 7380465.512546
+321613.662918 7380485.939047
+321622.890450 7380534.900661
+321596.321095 7380535.280595
+321579.688448 7380539.779825
+321565.298775 7380541.949453
+321549.416535 7380548.378352
+321524.636612 7380555.717095
+321484.147619 7380563.855701
+321357.708165 7380566.955170
+321333.777603 7380568.084976
+321301.732751 7380569.174790
+321242.269182 7380571.744350
+321165.505021 7380576.803483
+321107.781406 7380582.422520
+321054.222138 7380595.880215
+320992.985630 7380612.847309
+320944.134959 7380613.757153
+320928.227980 7380616.146744
+320770.048784 7380593.890556
+320665.923630 7380576.403551
+320659.557540 7380643.961979
+320654.049057 7380685.994779
+320638.892486 7380733.796591
+320617.122437 7380787.107460
+320571.067238 7380889.969840
+320561.781983 7380930.922825
+320556.463164 7380947.679955
+320556.652827 7380982.254033
+320553.717169 7380997.491423
+320543.500089 7381046.982945
+320543.500089 7381055.721449
+320518.060468 7381092.295184
+320506.936303 7381112.161781
+320488.646163 7381141.576742
+320488.654409 7381141.596739
+320468.912933 7381152.014954
+320449.303397 7381174.281140
+320433.602574 7381182.149793
+320363.550844 7381219.963315
+320351.280453 7381230.551502
+320308.235129 7381218.973485
+320305.381933 7381169.691927
+320293.606316 7381090.475496
+320281.154508 7381058.091043
+320276.346955 7381033.995170
+320266.905021 7381005.310084
+320262.674705 7380968.036468
+320260.885273 7380948.079887
+320251.187705 7380907.196890
+320242.388977 7380884.050854
+320224.898722 7380863.344401
+320205.882914 7380849.926699
+320189.547131 7380834.659315
+320170.020057 7380805.064384
+320159.365927 7380783.888011
+320151.927827 7380758.322390
+320144.118647 7380721.458705
+320128.104467 7380678.496064
+320104.668679 7380672.737050
+320024.432855 7380552.557636
+319971.022019 7380462.803010
+319958.710397 7380438.387192
+319938.259745 7380406.492656
+319899.378767 7380344.283312
+319779.478574 7380165.683904
+319723.057864 7380051.013546
+319708.173417 7380017.819232
+319704.619292 7379991.523736
+319698.591297 7379975.496481
+319690.567715 7379940.472481
+319608.319810 7379939.422660
+319603.479273 7379969.427521
+319609.408313 7379986.604579
+319602.522710 7379990.733871
+319596.643148 7380008.940753
+319590.087394 7380018.009199
+319574.436049 7380022.068504
+319552.352643 7380021.508600
+319534.351122 7380033.156605
+319526.987238 7380047.174204
+319519.499660 7380074.879458
+319510.049480 7380109.043606
+319501.052842 7380134.839187
+319488.716481 7380151.086404
+319476.017286 7380165.453943
+319461.470935 7380173.702530
+319324.031009 7380253.598845
+319283.426569 7380280.284274
+319232.200984 7380316.818016
+319202.225936 7380330.965593
+319169.612094 7380358.100945
+319144.213703 7380387.935834
+319118.312293 7380429.578701
+319119.376057 7380437.947268
+319122.880705 7380471.841462
+319125.230880 7380506.095595
+319120.711946 7380542.199410
+319056.176945 7380519.233344
+319045.539307 7380517.623620
+319022.029304 7380506.385545
+318988.252743 7380494.317612
+318968.601976 7380477.810440
+318932.071174 7380432.998115
+318901.378703 7380374.158194
+318877.802730 7380329.455851
+318864.790178 7380293.971929
+318852.907360 7380261.157550
+318866.587856 7380222.474176
+318872.797268 7380209.586384
+318880.911559 7380197.098523
+318884.160574 7380175.062298
+318882.082524 7380152.596146
+318867.577404 7380113.682811
+318840.669953 7380058.302297
+318796.198031 7379966.248066
+318778.072816 7379928.554522
+318745.524944 7379864.425507
+318643.906644 7379645.762962
+318626.952394 7379609.929100
+318543.797404 7379457.085281
+318495.350799 7379342.184962
+318443.061450 7379223.315323
+318425.934029 7379187.131521
+318416.401387 7379175.703479
+318381.627032 7379134.010620
+318365.167556 7379183.482146
+318186.075918 7379135.680334
+318156.282287 7379128.661537
+318125.985636 7379120.312967
+318102.731265 7379111.604458
+318082.346583 7379102.376039
+318047.959801 7379098.726664
+318037.948877 7379132.490881
+318000.981025 7379136.660166
+317973.281936 7379139.919608
+317978.171951 7379179.022910
+317977.297851 7379250.690634
+317925.363090 7379280.295563
+317887.818002 7379301.441941
+317862.757707 7379310.710353
+317757.675990 7379363.011395
+317601.360442 7379432.439502
+317587.152186 7379473.382489
+317571.203976 7379464.174066
+317549.961686 7379448.466757
+317535.959587 7379426.710483
+317524.233447 7379407.633751
+317518.576532 7379392.756299
+317515.962477 7379381.328257
+317509.926236 7379364.171196
+317499.371061 7379338.615573
+317485.690565 7379373.269637
+317452.466501 7379475.502126
+317443.956391 7379516.115169
+317428.808066 7379497.398375
+317399.352530 7379435.598961
+317379.206988 7379430.179889
+317407.524544 7379312.799995
+317438.060336 7379192.110668
+317458.659420 7379128.481567
+317461.191013 7379087.388606
+317535.036009 7378971.768411
+317516.968517 7378868.506099
+317513.991628 7378855.548318
+317369.558898 7378659.011983
+317400.053459 7378659.581886
+317426.367181 7378588.953984
+317426.400166 7378588.943985
+317456.919466 7378513.396926
+317355.078517 7378530.104064
+317384.031033 7378464.975220
+317331.749931 7378477.603057
+317294.386260 7378479.272771
+317259.348026 7378476.383266
+317105.926905 7378447.628191
+317033.351829 7378478.392922
+317012.093046 7378398.316638
+317000.070042 7378368.941670
+316984.591867 7378342.956121
+316945.752120 7378338.146945
+316925.903443 7378344.495857
+316903.770560 7378348.545163
+316884.383672 7378340.046619
+316800.049471 7378229.135617
+316784.892899 7378214.578111
+316759.799619 7378203.769962
+316700.377281 7378205.439676
+316679.654504 7378198.530860
+316659.228590 7378192.401909
+316631.628456 7378189.172463
+316593.934936 7378185.593076
+316544.325613 7378180.203999
+316519.809569 7378175.024886
+316494.971922 7378171.165547
+316469.029281 7378157.547880
+316447.415910 7378148.859368
+316424.037846 7378134.161885
+316392.215642 7378109.836052
+316376.869407 7378097.458172
+316345.055449 7378056.295223
+316369.093211 7378043.307448
+316387.457567 7378034.448965
+316430.296735 7378018.711661
+316477.160064 7378007.003666
+316555.746642 7377986.507177
+316578.003219 7377977.268760
+316599.657820 7377966.240649
+316621.732980 7377946.584016
+316668.085042 7377918.808773
+316693.335000 7377906.060957
+316714.577291 7377896.252637
+316745.080098 7377887.884070
+316775.162347 7377880.285372
+316796.008818 7377876.785971
+316818.751922 7377877.185903
+316840.076675 7377876.236066
+316863.495970 7377871.546869
+316889.191224 7377864.338104
+316908.512143 7377860.588746
+316929.111227 7377860.958683
+316938.841779 7377866.177789
+316953.783949 7377870.137110
+316966.738777 7377869.857158
+316984.699068 7377868.857330
+316999.616499 7377858.969023
+317008.258549 7377853.319991
+317013.445428 7377846.071233
+317020.248568 7377832.533552
+317026.614658 7377813.116877
+317039.701426 7377802.538689
+317061.199350 7377803.808472
+317073.890299 7377808.847609
+317085.162896 7377812.526978
+317101.119352 7377817.156186
+317116.638758 7377815.806417
+317147.125073 7377808.767622
+317194.310005 7377787.211315
+317260.139664 7377743.728763
+317279.064763 7377730.680998
+317300.348285 7377717.103324
+317322.233781 7377696.216901
+317338.247961 7377671.941060
+317339.138553 7377649.684872
+317336.211142 7377623.399374
+317334.801036 7377597.353836
+317334.289770 7377564.889397
+317337.547031 7377533.364796
+317342.874096 7377499.100666
+317351.227528 7377450.908920
+317357.494663 7377439.130938
+317379.841948 7377365.423563
+317379.330682 7377332.739162
+317377.079461 7377309.453150
+317368.528120 7377275.229013
+317355.210457 7377247.703728
+317344.902669 7377223.757829
+317330.414041 7377191.683323
+317314.333892 7377164.897911
+317306.681390 7377148.630698
+317301.370817 7377133.383310
+317299.952465 7377108.337600
+317300.315300 7377087.621148
+317298.055832 7377064.005193
+317289.224119 7377044.948458
+317282.569411 7377030.470938
+317270.051633 7377004.175442
+317264.328749 7376980.839439
+317262.201222 7376955.553770
+317262.514578 7376930.528057
+317265.186357 7376904.752472
+317274.438628 7376865.879131
+317270.604131 7376838.583806
+317268.946638 7376824.716182
+317266.761387 7376811.728406
+317262.217714 7376800.160388
+317252.948951 7376791.181926
+317243.160675 7376782.303446
+317237.462530 7376765.066399
+317233.240460 7376752.608533
+317231.079947 7376729.652465
+317223.147073 7376711.605556
+317218.149857 7376695.148375
+317215.733712 7376676.401586
+317223.658340 7376662.763922
+317238.229429 7376639.357932
+317256.164981 7376608.453225
+317254.466257 7376597.355126
+317253.765328 7376588.156702
+317249.798891 7376579.358209
+317244.776936 7376564.890687
+317236.291565 7376550.383172
+317227.995857 7376536.995465
+317214.645209 7376528.296955
+317196.148914 7376506.910619
+317194.532653 7376480.855082
+317200.107105 7376467.747327
+317205.722788 7376459.398757
+317208.130687 7376445.801086
+317207.710129 7376431.063611
+317205.013612 7376417.965854
+317197.262155 7376402.028584
+317192.388633 7376384.241631
+317187.333694 7376372.323672
+317184.925794 7376361.445536
+317182.427186 7376349.007666
+317182.575618 7376337.149697
+317190.219874 7376321.742336
+317196.066452 7376310.744220
+317202.993286 7376303.405477
+317217.655084 7376297.166546
+317230.642897 7376294.227050
+317243.713172 7376293.067248
+317262.506332 7376282.888992
+317272.500764 7376266.731759
+317278.685437 7376244.875503
+317280.070803 7376224.069067
+317278.710175 7376202.562751
+317280.079050 7376183.196068
+317282.759075 7376164.179325
+317285.414361 7376148.042090
+317284.762909 7376134.854349
+317286.939914 7376099.550396
+317285.867904 7376079.593814
+317280.870688 7376063.366594
+317274.991125 7376044.129889
+317272.599718 7376023.823367
+317272.492517 7375999.347560
+317275.749779 7375967.712978
+317275.815748 7375945.996698
+317276.755819 7375920.421079
+317276.137351 7375896.715140
+317275.791010 7375874.998859
+317277.407271 7375852.202764
+317286.486371 7375827.506994
+317292.390672 7375812.179620
+317304.042596 7375801.921377
+317321.318449 7375790.613314
+317333.316715 7375785.454198
+317346.675608 7375777.425573
+317352.349015 7375764.307820
+317358.253316 7375756.739116
+317370.193858 7375740.391916
+317369.039386 7375726.304330
+317358.294547 7375713.326552
+317347.706387 7375703.558226
+317329.127629 7375680.942100
+317316.337726 7375659.855712
+317306.145385 7375643.108580
+317299.630862 7375625.861534
+317290.724933 7375604.585179
+317288.053155 7375581.849073
+317286.403909 7375566.651677
+317285.422607 7375555.783538
+317287.113084 7375534.987100
+317286.923421 7375525.458733
+317288.811808 7375521.159469
+317293.289511 7375514.350635
+317293.371973 7375507.481812
+317294.815064 7375498.193403
+317293.017385 7375486.985323
+317293.132833 7375477.686915
+317296.571511 7375472.297839
+317289.174642 7375451.941325
+317277.242346 7375411.798202
+317268.361156 7375388.322223
+317262.852674 7375363.986391
+317256.758709 7375337.660901
+317243.210152 7375320.323870
+317231.937555 7375300.577253
+317218.380752 7375283.460185
+317199.142296 7375256.524799
+317181.107789 7375231.149145
+317169.793961 7375214.392015
+317159.585127 7375190.786059
+317148.551671 7375168.159935
+317136.891501 7375146.413660
+317131.209848 7375120.308131
+317125.256069 7375098.971786
+317113.125864 7375066.367371
+317108.466744 7375039.501973
+317108.079171 7375021.555047
+317099.643277 7374986.880986
+317091.050704 7374948.337588
+317085.500991 7374919.472533
+317074.253133 7374897.626275
+317058.882159 7374879.589364
+317046.875647 7374861.052539
+317022.260648 7374839.926158
+317003.154132 7374826.608439
+316979.174093 7374812.020938
+316955.977446 7374799.763038
+316935.601011 7374790.204675
+316902.022359 7374775.827138
+316854.078774 7374753.171018
+316817.622189 7374733.224435
+316786.921472 7374709.238544
+316770.585689 7374686.552430
+316763.155835 7374669.395368
+316746.556173 7374643.489806
+316727.763013 7374621.763527
+316711.748833 7374597.637660
+316699.808291 7374566.033073
+316693.120598 7374538.367812
+316684.008514 7374508.782880
+316685.674252 7374482.447391
+316686.812232 7374456.431847
+316693.689588 7374421.067905
+316702.191452 7374393.372649
+316712.458009 7374371.906326
+316723.219340 7374351.549813
+316747.034454 7374306.987446
+316770.090915 7374257.545915
+316778.394870 7374221.542082
+316832.679806 7374073.027521
+316851.415242 7374034.944044
+316871.321643 7374009.388422
+316890.378682 7373994.121037
+316914.490660 7373973.824513
+316935.188699 7373949.598663
+316956.595914 7373917.974080
+316980.105917 7373881.270367
+316986.818349 7373857.984356
+316989.267480 7373841.847120
+316984.501158 7373823.620242
+316978.069098 7373800.274241
+316964.132969 7373773.188881
+316956.109386 7373754.362105
+316951.244110 7373728.056611
+316948.407407 7373702.211038
+316944.861528 7373682.124479
+316940.655950 7373653.929309
+316937.728538 7373635.722427
+316935.675227 7373604.127839
+316934.924820 7373590.940098
+316940.705427 7373569.193823
+316941.802176 7373555.026250
+316936.854438 7373534.809713
+316934.660940 7373523.151710
+316942.099040 7373499.425774
+316955.350733 7373491.177187
+316965.971878 7373490.097372
+316985.482460 7373487.677786
+317002.939730 7373486.018070
+317055.509450 7373481.368867
+317082.153022 7373470.400745
+317105.786719 7373456.193179
+317124.777788 7373446.244883
+317144.304862 7373442.055603
+317186.072020 7373436.826496
+317223.501661 7373436.076625
+317248.067182 7373428.637899
+317270.653608 7373416.959899
+317285.331899 7373409.271216
+317300.810073 7373402.492377
+317319.355846 7373387.554936
+317333.646564 7373378.206537
+317352.901512 7373363.269096
+317395.377847 7373334.234070
+317409.808750 7373321.676221
+317423.258352 7373314.207500
+317444.360457 7373306.498820
+317460.844672 7373301.389695
+317477.254671 7373293.840988
+317501.135755 7373292.031298
+317528.480255 7373282.632908
+317542.663772 7373281.263143
+317559.881902 7373274.274340
+317571.080283 7373267.775453
+317582.509559 7373258.717005
+317584.307237 7373245.669240
+317582.930116 7373233.471329
+317579.953227 7373219.033802
+317569.661931 7373202.066709
+317561.473424 7373188.569021
+317551.388284 7373171.601927
+317540.363074 7373156.284551
+317527.342276 7373138.067671
+317514.313231 7373119.960773
+317510.635412 7373104.073494
+317508.004865 7373078.007959
+317506.231925 7373048.862951
+317510.371533 7373027.976529
+317516.547960 7373006.790158
+317529.948084 7372979.484835
+317543.884214 7372965.487232
+317559.675746 7372950.399817
+317580.184122 7372941.241386
+317597.451729 7372930.273264
+317611.445582 7372920.474943
+317622.215159 7372906.877272
+317628.292631 7372894.329421
+317635.293681 7372872.153220
+317639.004485 7372852.706551
+317645.370575 7372833.509839
+317651.852112 7372820.632045
+317666.604619 7372806.864403
+317682.734246 7372804.964729
+317698.962828 7372804.054884
+317725.276550 7372803.055056
+317749.273081 7372800.145554
+317773.187150 7372787.707685
+317790.677405 7372775.749733
+317807.928520 7372765.441499
+317820.908087 7372755.193254
+317833.871161 7372745.934840
+317862.337149 7372720.379217
+317874.079782 7372710.560899
+317891.619514 7372694.053727
+317909.390141 7372675.226951
+317920.374121 7372661.629281
+317936.446024 7372640.232946
+317963.493661 7372613.427537
+317978.221429 7372601.649555
+317997.814473 7372584.062567
+318025.002295 7372562.586246
+318059.446801 7372547.958751
+318075.741352 7372541.179912
+318092.126613 7372535.290921
+318134.817349 7372513.564643
+318161.089839 7372507.695648
+318185.729577 7372502.356563
+318210.740394 7372499.677022
+318243.947965 7372494.447917
+318267.474461 7372488.318967
+318289.318726 7372477.840762
+318297.202123 7372467.312565
+318297.795851 7372452.365126
+318290.646369 7372420.710548
+318285.896540 7372409.572456
+318284.263787 7372393.375230
+318285.657400 7372379.437617
+318289.970178 7372368.859429
+318298.150439 7372359.101101
+318305.060780 7372353.102129
+318318.279488 7372339.534453
+318330.261261 7372327.166571
+318344.510748 7372312.949006
+318359.494149 7372305.160341
+318381.528077 7372296.021906
+318396.965021 7372292.782461
+318415.956090 7372290.132915
+318470.892479 7372283.514048
+318487.500387 7372284.383899
+318508.437567 7372297.721615
+318514.960335 7372306.550102
+318526.298902 7372320.867650
+318535.303786 7372334.275353
+318540.968947 7372346.193312
+318555.564775 7372361.440700
+318569.443181 7372368.149551
+318584.335874 7372368.229537
+318607.441812 7372363.090418
+318704.508193 7372330.186054
+318723.796126 7372320.237758
+318737.484869 7372309.999512
+318750.266527 7372290.882786
+318775.269098 7372272.705900
+318794.054011 7372254.219066
+318812.533814 7372244.370753
+318828.416055 7372245.900491
+318848.380179 7372247.250260
+318867.371248 7372245.050637
+318879.006680 7372244.090801
+318898.278121 7372236.242146
+318923.041551 7372228.693439
+318935.748993 7372215.445708
+318948.068861 7372192.449647
+318951.021012 7372176.432390
+318951.392092 7372154.726109
+318950.913811 7372119.492144
+318946.831927 7372095.406269
+318951.499293 7372064.231609
+318962.475026 7372042.765286
+318975.462839 7372031.517213
+318999.747989 7372013.550291
+319017.914435 7372003.691979
+319036.847780 7371997.952962
+319056.135714 7371996.643187
+319083.999727 7372002.302217
+319108.392077 7372008.591140
+319125.131926 7372015.339984
+319151.082814 7372027.067975
+319173.240435 7372040.855614
+319192.025349 7372047.184529
+319227.533618 7372060.812195
+319248.899601 7372064.281601
+319269.185329 7372072.960114
+319295.515543 7372079.049071
+319317.161899 7372084.628116
+319346.411279 7372093.856535
+319371.496313 7372101.705191
+319400.984833 7372107.834141
+319418.928631 7372107.834141
+319431.611334 7372104.664684
+319450.940499 7372091.836881
+319466.468151 7372080.958744
+319493.474556 7372065.781344
+319519.260519 7372057.912692
+319544.914543 7372052.913548
+319578.089129 7372042.025413
+319595.670093 7372029.837501
+319625.612156 7372008.171212
+319641.667567 7371995.853322
+319659.306255 7371979.126187
+319670.249003 7371960.429390
+319678.668404 7371939.273014
+319688.629851 7371908.708249
+319695.672132 7371867.485310
+319702.590719 7371827.142221
+319709.253674 7371791.448335
+319717.524643 7371757.884084
+319720.996306 7371724.579789
+319851.616599 7371796.877405
+319961.283221 7371840.549924
+320018.198705 7371895.970431
+320067.008144 7371996.263252
+320110.432795 7372128.840542
+320136.631069 7372243.690870
+320124.162769 7372345.213480
+320092.150901 7372509.195391
+320090.666580 7372628.684924
+320115.883553 7373012.569168
+320192.961071 7373267.615481
+320316.052556 7373438.506209
+320515.083579 7373545.527877
+320820.070419 7373594.159547
+321080.857463 7373572.453265
+321527.168205 7373538.189134
+321630.056424 7373487.617796
+321696.018023 7373413.670463
+321843.188502 7373261.076601
+322020.573169 7373089.026071
+322101.674848 7373010.269562
+322202.212892 7372976.615326
+322287.462424 7372967.796837
+322487.012959 7373033.715546
+322895.605442 7373204.296327
+323066.417863 7373296.880468
+323129.781900 7373306.728781
+323274.527986 7373343.382502
+323479.669466 7373360.829514
+323699.307819 7373418.219684
+323823.100234 7373534.359790
+323906.172761 7373704.610627
+323913.907726 7373898.987332
+323887.074491 7374043.092648
+323820.238792 7374181.728901
+323766.976388 7374445.023801
+323784.664553 7374692.451419
+323801.594064 7374893.696948
+Region 1
+147
+331727.186525 7392674.131320
+331692.156537 7392705.036027
+331671.359543 7392723.602846
+331650.760459 7392741.629758
+331536.789305 7392841.392670
+331390.410465 7392972.170269
+331240.576454 7393109.116811
+331168.628092 7393169.086539
+331103.087051 7393230.246063
+331028.846236 7393298.264412
+330953.483934 7393366.462730
+330894.861481 7393420.303508
+330801.538889 7393511.227933
+330699.302121 7393599.372835
+330672.040082 7393625.528355
+330568.887983 7393716.152831
+330482.170622 7393807.187238
+330396.962321 7393901.111150
+330311.589095 7394000.004210
+330299.277472 7393989.116075
+330242.337250 7393938.754702
+330202.763589 7393915.788636
+330174.610957 7393904.330598
+330108.591635 7393887.363505
+330047.627252 7393895.972030
+330016.943027 7393904.840511
+329987.553461 7393916.498514
+329950.049604 7393932.015856
+329891.443643 7393959.711112
+329852.232816 7393979.317754
+329809.632789 7394000.004210
+329804.668558 7394009.682552
+329669.281943 7394074.731410
+329569.453075 7394122.433239
+329429.481556 7394185.712400
+329165.090909 7394296.363447
+328967.098911 7394382.238737
+328917.778206 7394394.776589
+328883.787243 7394426.091225
+328792.913781 7394490.280230
+328776.767662 7394451.716836
+328758.881587 7394420.012267
+328741.506779 7394402.505265
+328700.630214 7394335.056819
+328681.210341 7394304.881987
+328660.767935 7394274.697158
+328640.086389 7394247.831760
+328585.743729 7394189.281789
+328547.687374 7394140.350170
+328519.881085 7394109.675424
+328502.786649 7394094.478028
+328460.178375 7394050.885495
+328433.402864 7394028.089399
+328415.277649 7394010.902343
+328407.922011 7394004.773393
+328324.610343 7393952.092417
+328314.813821 7393925.137034
+328303.780364 7393911.659343
+328292.763400 7393893.282491
+328287.856893 7393876.125429
+328282.950386 7393863.877527
+328277.969662 7393848.600144
+328278.052125 7393832.432914
+328279.173612 7393807.517181
+328335.577830 7393715.922871
+328367.169139 7393642.865385
+328381.616535 7393612.350612
+328401.423981 7393577.916510
+328442.556180 7393518.476691
+328572.013755 7393325.659719
+328692.293275 7393143.760877
+328775.011215 7393020.531985
+328795.173249 7392990.087200
+328810.478253 7392973.320072
+328853.136004 7392939.925792
+328907.462171 7392895.823346
+328794.431088 7392739.210173
+328715.795032 7392628.209186
+328715.803279 7392628.199188
+328800.821917 7392551.442336
+328852.567014 7392483.274012
+328945.617480 7392365.734146
+329031.353541 7392255.433039
+329106.567410 7392160.949224
+329195.585470 7392048.128549
+329195.593716 7392048.128549
+329234.936483 7391999.966798
+329270.551953 7391949.105511
+329351.966988 7391848.712707
+329393.998026 7391790.282715
+329453.948122 7391717.875118
+329473.912247 7391695.848891
+329514.549671 7391660.544938
+329486.627935 7391638.178769
+329470.308644 7391628.130491
+329472.856729 7391593.276461
+329474.926533 7391573.469854
+329485.481708 7391517.889374
+329503.978004 7391411.327627
+329521.756877 7391313.744342
+329527.215882 7391291.428165
+329543.898006 7391183.196704
+329547.419147 7391152.122027
+329558.535066 7391100.580855
+329558.765960 7391099.081112
+329586.671205 7390947.337104
+329588.922426 7390912.033152
+329591.313833 7390864.321324
+329583.422190 7390823.248360
+329684.768365 7390895.316015
+329742.887798 7390927.450511
+329789.462509 7390960.114916
+329836.202144 7390988.010137
+329893.736095 7391025.903647
+330043.256749 7391125.106654
+330125.809764 7391177.297714
+330205.006564 7391226.889220
+330282.422177 7391276.850662
+330364.488664 7391331.081372
+330388.782060 7391339.559920
+330454.281870 7391387.281746
+330490.524053 7391405.308658
+330537.601784 7391447.391450
+330564.690652 7391470.517488
+330605.517740 7391515.519780
+330653.477817 7391561.041982
+330672.823474 7391582.798256
+330735.577290 7391647.837115
+330804.053989 7391714.025778
+330840.279680 7391748.169929
+330879.259612 7391793.582150
+330950.474060 7391859.860797
+330984.069204 7391894.364887
+331016.509875 7391928.729001
+331075.998183 7391991.998163
+331142.306124 7392053.467634
+331175.521941 7392089.601445
+331228.330802 7392143.752169
+331268.399237 7392184.845130
+331314.891485 7392231.127203
+331393.346123 7392309.223826
+331477.012380 7392393.809337
+331512.965945 7392428.223442
+331552.696284 7392470.546192
+331642.151394 7392566.939681
+331708.401611 7392647.115948
+331727.186525 7392674.131320
+Region 1
+383
+320638.224541 7383590.747222
+320687.718417 7383585.908051
+320748.649815 7383586.048027
+320869.811682 7383587.047855
+321023.843025 7383594.726540
+321065.065932 7383592.166978
+321131.044023 7383583.028544
+321225.537580 7383548.284495
+321241.790901 7383541.465663
+321241.840378 7383525.508396
+321235.193916 7383501.942433
+321229.141183 7383471.627626
+321223.830610 7383447.091829
+321207.123747 7383386.852147
+321193.228848 7383354.447698
+321162.288991 7383272.211784
+321147.503499 7383233.668386
+321024.337798 7382972.973041
+321031.734667 7382962.804783
+321018.656146 7382946.517572
+321010.294468 7382930.870253
+320994.082378 7382905.194651
+320986.669017 7382885.158083
+320971.957741 7382853.743464
+320961.575737 7382835.016671
+320946.757261 7382812.120593
+320937.537975 7382798.382946
+320926.050975 7382778.636329
+320915.932850 7382755.370314
+320903.415072 7382735.833661
+320890.179872 7382717.276839
+320878.231084 7382693.430924
+320862.018994 7382667.315397
+320853.822241 7382645.279172
+320845.757428 7382620.703381
+320843.844302 7382602.516497
+320847.810739 7382586.619220
+320850.564980 7382561.723484
+320854.127352 7382537.287670
+320850.457779 7382521.080446
+320844.479262 7382509.372451
+320839.102719 7382498.234359
+320826.189122 7382486.776322
+320814.669138 7382477.767865
+320797.797350 7382464.050215
+320785.254833 7382455.031759
+320767.014171 7382445.283429
+320752.789423 7382432.265659
+320737.476173 7382416.008444
+320731.745043 7382400.881035
+320724.587314 7382385.393688
+320715.640154 7382366.566913
+320721.544455 7382351.019576
+320734.886857 7382336.232109
+320740.123213 7382325.223994
+320744.980243 7382312.096243
+320747.701499 7382298.068646
+320745.293600 7382286.410643
+320742.407419 7382272.742984
+320737.261771 7382251.306656
+320725.947942 7382217.052523
+320720.291028 7382196.386063
+320717.660481 7382177.849238
+320712.547818 7382153.643385
+320704.656175 7382132.167063
+320692.963020 7382111.870540
+320680.742106 7382093.993602
+320675.085192 7382086.444895
+320656.407479 7382064.788605
+320644.640108 7382051.350906
+320630.860657 7382035.233667
+320611.539738 7382013.397407
+320597.479915 7381995.050550
+320583.733449 7381976.503727
+320573.277228 7381955.987241
+320564.577455 7381941.479726
+320554.434591 7381920.203371
+320537.315416 7381901.936500
+320525.300658 7381891.488289
+320503.085313 7381881.360024
+320447.307809 7381853.864734
+320433.503619 7381839.847135
+320413.193153 7381816.231180
+320400.444480 7381799.124110
+320396.412073 7381787.226148
+320386.063054 7381765.499870
+320373.009271 7381749.162668
+320360.458508 7381732.615503
+320353.473950 7381727.986296
+320343.372318 7381719.887683
+320341.970459 7381709.239507
+320344.493805 7381703.180545
+320349.688931 7381695.711824
+320352.855483 7381687.443240
+320350.843403 7381676.565104
+320345.689509 7381664.427183
+320338.531780 7381641.081182
+320337.402047 7381625.003936
+320339.166740 7381606.307138
+320341.088112 7381591.159733
+320344.774177 7381573.262798
+320345.301936 7381546.787333
+320355.131443 7381519.442017
+320361.316116 7381481.088587
+320363.509613 7381452.533478
+320363.625060 7381409.780801
+320359.906010 7381389.024357
+320357.176508 7381370.047607
+320343.718660 7381336.433365
+320337.987529 7381313.107361
+320327.918882 7381285.842031
+320316.266958 7381254.357424
+320309.018521 7381230.011594
+320308.235129 7381218.973485
+320351.280453 7381230.551502
+320363.550844 7381219.963315
+320433.602574 7381182.149793
+320449.303397 7381174.281140
+320468.912933 7381152.014954
+320488.654409 7381141.596739
+320488.646163 7381141.576742
+320506.936303 7381112.161781
+320518.060468 7381092.295184
+320543.500089 7381055.721449
+320543.500089 7381046.982945
+320553.717169 7380997.491423
+320556.652827 7380982.254033
+320556.463164 7380947.679955
+320561.781983 7380930.922825
+320571.067238 7380889.969840
+320617.122437 7380787.107460
+320638.892486 7380733.796591
+320654.049057 7380685.994779
+320659.557540 7380643.961979
+320665.923630 7380576.403551
+320770.048784 7380593.890556
+320928.227980 7380616.146744
+320944.134959 7380613.757153
+320992.985630 7380612.847309
+321054.222138 7380595.880215
+321107.781406 7380582.422520
+321165.505021 7380576.803483
+321242.269182 7380571.744350
+321301.732751 7380569.174790
+321333.777603 7380568.084976
+321357.708165 7380566.955170
+321484.147619 7380563.855701
+321524.636612 7380555.717095
+321549.416535 7380548.378352
+321565.298775 7380541.949453
+321579.688448 7380539.779825
+321596.321095 7380535.280595
+321622.890450 7380534.900661
+321613.662918 7380485.939047
+321613.836089 7380465.512546
+321610.949908 7380432.868138
+321606.282541 7380393.574868
+321593.443160 7380349.462424
+321573.858363 7380307.589597
+321548.657882 7380268.376314
+321540.708515 7380182.531018
+321538.745912 7380162.824394
+321593.286482 7380120.951566
+321622.469892 7380086.707432
+321647.357016 7380037.795810
+321662.282694 7380001.392046
+321678.230904 7379973.766778
+321683.401290 7379946.841390
+321678.626723 7379918.226291
+321668.285950 7379867.355005
+321656.716488 7379836.780242
+321653.417996 7379810.524740
+321631.235635 7379786.138917
+321578.146402 7379727.798910
+321551.189474 7379698.044006
+321509.570748 7379661.720228
+321488.872709 7379634.864828
+321451.212174 7379591.942181
+321418.227252 7379575.455005
+321411.885900 7379570.375875
+321382.702490 7379556.428264
+321364.948355 7379545.010220
+321323.082242 7379512.025870
+321305.319862 7379480.311302
+321278.676290 7379466.353693
+321245.592413 7379419.461725
+321213.333159 7379366.700763
+321233.726087 7379338.945517
+321262.324015 7379298.332473
+321308.956449 7379220.105873
+321340.547759 7379131.341078
+321415.687412 7378996.984092
+321423.298683 7378924.666479
+321405.272423 7378864.896717
+321370.019787 7378825.723427
+321224.712957 7378714.632456
+321110.378969 7378603.311524
+320999.590860 7378490.820793
+320987.130806 7378405.445417
+320973.483294 7378326.508938
+320940.382924 7378246.772596
+320932.359342 7378199.020776
+320938.700693 7378147.009685
+320950.113476 7378116.554901
+320978.026967 7378042.977504
+320997.356132 7378016.532034
+321055.417842 7377960.361656
+321247.093227 7377890.583608
+321425.846769 7377844.301536
+321611.758039 7377807.797789
+321604.047813 7377768.444529
+321514.757627 7377376.651640
+321575.021081 7377366.143440
+321575.021081 7377366.123443
+321597.722954 7376956.403625
+321932.519918 7376293.277212
+322310.749779 7375670.223936
+322504.519707 7375393.701301
+322777.700836 7375177.838277
+323049.917156 7375031.743302
+323341.363686 7374955.656335
+323801.594064 7374893.696948
+323830.991877 7375319.813958
+323848.416162 7375581.529128
+323918.509122 7375990.759031
+324051.281682 7376201.592917
+324248.828383 7376428.054126
+324408.862982 7376720.733993
+324487.457806 7376976.990098
+324472.144556 7377282.387787
+324406.422097 7377564.029544
+324238.100037 7377972.139638
+324026.510005 7378414.503865
+323973.354802 7378626.637529
+323963.170708 7378827.653097
+324022.238458 7379087.548579
+324080.943374 7379378.448750
+324081.124791 7379691.785079
+324026.839854 7379996.832827
+324011.930669 7380259.707799
+324000.625087 7380553.637451
+323946.892648 7380812.163168
+323874.573205 7380996.921521
+323826.827530 7381081.517030
+323818.704993 7381111.991810
+323818.366897 7381140.116992
+323825.788505 7381167.232348
+323844.119876 7381186.838989
+323868.734874 7381209.735067
+323890.100858 7381222.952803
+323963.822160 7381251.417928
+323977.057360 7381261.886134
+323983.934716 7381275.593786
+323989.781294 7381281.202826
+324002.249595 7381287.661719
+324036.941487 7381303.918935
+324056.394345 7381315.226998
+324075.047319 7381333.063942
+324101.624920 7381371.377380
+324109.557794 7381390.304138
+324118.537939 7381415.449830
+324122.776502 7381436.096294
+324135.541667 7381511.013461
+324155.843887 7381595.289026
+324175.758534 7381669.226361
+324199.994205 7381780.527296
+324223.982490 7381849.565470
+324232.286445 7381896.847371
+324248.927338 7381988.431684
+324271.241638 7382109.540939
+324291.131547 7382177.559288
+324314.237485 7382260.205131
+324327.876750 7382319.554965
+324344.624845 7382411.139278
+324364.555984 7382476.168139
+324387.332073 7382550.215455
+324410.421519 7382606.425827
+324445.385537 7382651.038185
+324498.243876 7382692.990999
+324560.181314 7382717.326831
+324599.796206 7382757.349975
+324485.470464 7382897.405985
+324348.484081 7383072.525988
+324269.394483 7383182.247194
+324125.341079 7383355.677487
+324019.278061 7383516.219987
+323953.341201 7383679.621998
+323921.807615 7383874.558607
+323928.148966 7384066.155788
+323728.169627 7384084.122711
+323699.472744 7384089.841731
+323606.249106 7384104.849161
+323589.789630 7384105.998964
+323441.052368 7384131.334624
+323322.793174 7384149.761468
+323161.859737 7384177.386736
+323078.960380 7384203.872199
+322988.796094 7384222.379029
+322931.303374 7384234.286989
+322910.539365 7384221.019262
+322840.990656 7384241.535747
+322787.480866 7384251.524037
+322738.811612 7384262.722118
+322708.836564 7384281.078974
+322610.731158 7384319.912322
+322522.686153 7384344.338138
+322460.493082 7384351.596895
+322367.632278 7384363.044934
+322328.660592 7384359.775494
+322295.956042 7384351.596895
+322274.491103 7384349.557244
+322237.696422 7384352.616720
+322189.530189 7384367.514169
+322155.596950 7384379.062190
+322111.306445 7384395.289411
+322071.551367 7384407.907250
+322030.023349 7384421.074994
+321989.361186 7384430.293415
+321947.701229 7384445.590795
+321889.136499 7384481.294679
+321851.096637 7384497.921831
+321833.012653 7384506.790312
+321817.715895 7384401.698313
+321797.677555 7384296.126397
+321789.068490 7384249.274422
+321778.942119 7384218.029774
+321761.146753 7384188.014915
+321732.367408 7384163.739073
+321715.751253 7384145.592182
+321689.676672 7384124.675765
+321649.204172 7384096.930517
+321620.029008 7384088.272000
+321600.765813 7384077.953768
+321584.108427 7384063.126307
+321575.590071 7384050.838412
+321560.433499 7384038.360550
+321547.305500 7384027.342437
+321533.113737 7384019.523776
+321516.431612 7384007.255877
+321503.567492 7383999.227253
+321484.032172 7383986.469438
+321458.056546 7383966.332887
+321441.407406 7383959.364081
+321424.073829 7383950.405615
+321409.098674 7383948.225989
+321388.103771 7383945.976374
+321371.908174 7383943.786749
+321345.479005 7383943.796747
+321320.212554 7383942.956891
+321298.879555 7383941.117206
+321281.455270 7383931.048931
+321257.310307 7383911.702245
+321244.388463 7383890.785828
+321225.636535 7383856.811647
+321215.262777 7383854.032123
+321200.815381 7383858.611339
+321192.907245 7383863.060577
+321181.494462 7383864.760286
+321116.423456 7383877.238148
+321049.439325 7383888.656193
+321018.862301 7383877.318135
+320976.806525 7383870.599286
+320949.008481 7383865.490161
+320918.637614 7383854.372065
+320896.191374 7383846.343440
+320866.900763 7383841.424283
+320865.935954 7383830.506153
+320842.401212 7383822.647499
+320820.952766 7383807.760049
+320808.426741 7383797.301841
+320797.846827 7383786.323721
+320778.971206 7383770.026513
+320760.293493 7383761.717936
+320749.441454 7383756.378850
+320730.813219 7383744.510883
+320717.248169 7383736.372277
+320700.632014 7383718.005423
+320687.132935 7383703.987825
+320676.635483 7383686.250863
+320664.925836 7383667.943999
+320657.281580 7383642.378378
+320646.347078 7383619.092366
+320638.224541 7383590.747222
+Region 1
+697
+354118.226078 7396716.718862
+354125.688917 7396694.322698
+354139.691016 7396662.578135
+354159.292306 7396625.244530
+354180.757245 7396600.978687
+354219.687700 7396565.964684
+354256.366934 7396534.700040
+354421.027667 7396421.199481
+354519.479415 7396289.981958
+354563.341116 7396234.481464
+354612.463912 7396189.679139
+354659.756044 7396137.478080
+354708.689177 7396083.657299
+354751.882933 7396032.606044
+354559.861206 7395710.631195
+354581.408607 7395691.084543
+354551.953071 7395633.974326
+354544.490232 7395619.976724
+354526.529942 7395587.632264
+354522.563505 7395555.887701
+354523.363389 7395517.804225
+354532.970248 7395469.552490
+354513.838993 7395420.990808
+354488.712728 7395367.290007
+354466.373689 7395330.736268
+354453.451846 7395304.170818
+354442.418389 7395257.528808
+354434.493762 7395215.226054
+354430.510832 7395194.039683
+354431.516873 7395169.923814
+354430.510832 7395158.335798
+354437.017108 7395132.460231
+354442.352420 7395084.338474
+354442.418389 7395072.630479
+354458.275891 7395015.500265
+354465.433619 7394985.345430
+354474.158131 7394967.888420
+354494.699492 7394904.699244
+354509.856064 7394841.720032
+354536.318218 7394744.396702
+354581.276667 7394600.481354
+354616.207700 7394514.786033
+354636.147086 7394477.262460
+354629.921182 7394474.212983
+354623.753001 7394471.743406
+354619.563916 7394470.013702
+354611.177500 7394466.074377
+354602.799329 7394462.375010
+354595.155074 7394461.145221
+354587.510818 7394460.405348
+354581.095250 7394458.925601
+354562.112427 7394426.001241
+354549.429725 7394408.144299
+354543.245052 7394396.946218
+354534.842143 7394381.178918
+354526.150615 7394367.921189
+354511.546541 7394360.402477
+354499.144210 7394358.212852
+354488.077769 7394351.494003
+354486.948035 7394341.885649
+354487.582995 7394332.547249
+354492.011221 7394324.778579
+354499.770924 7394314.270379
+354510.837365 7394302.802344
+354521.169892 7394289.804570
+354527.247364 7394272.467540
+354530.809736 7394254.070691
+354529.886158 7394247.751773
+354526.356771 7394227.995157
+354521.532726 7394210.758110
+354516.700435 7394193.521062
+354515.917043 7394177.343834
+354519.429937 7394161.976466
+354524.847711 7394155.487577
+354529.787203 7394146.969036
+354528.921349 7394136.350855
+354526.587666 7394122.423241
+354518.918671 7394108.675596
+354513.467913 7394099.007252
+354504.149672 7394076.401124
+354493.619236 7394049.735692
+354485.983226 7394033.718435
+354478.652327 7394014.171783
+354479.815045 7394003.333640
+354481.794141 7393988.956103
+354477.901920 7393977.288101
+354474.248840 7393966.879884
+354469.078453 7393955.701799
+354459.331409 7393945.213595
+354454.466132 7393930.746073
+354449.073098 7393917.538336
+354444.479947 7393901.061158
+354442.476113 7393881.584494
+354437.602591 7393867.626885
+354432.151832 7393858.208499
+354418.652753 7393844.390865
+354404.576437 7393834.852499
+354399.117432 7393826.443939
+354389.609528 7393816.715606
+354384.752499 7393801.748170
+354381.668408 7393786.800730
+354384.265971 7393764.614530
+354385.898725 7393738.618983
+354387.399539 7393722.471749
+354391.390714 7393709.393989
+354391.885488 7393691.966974
+354389.815684 7393676.789574
+354529.811942 7393517.606840
+354668.934099 7393361.813526
+354818.058934 7393317.371139
+354851.695309 7393306.463008
+354866.489047 7393300.853968
+354888.572452 7393299.884134
+354902.294180 7393298.304405
+354929.457264 7393297.154602
+354949.264710 7393295.914814
+354976.254623 7393288.696051
+355001.182978 7393283.736900
+355022.268590 7393281.747241
+355053.744452 7393280.407471
+355090.522641 7393280.907385
+355112.045303 7393283.976859
+355141.641025 7393289.935838
+355124.224986 7393265.450033
+355109.835313 7393260.710844
+355103.526947 7393258.091293
+355091.462711 7393250.602576
+355083.439129 7393243.933718
+355077.707999 7393236.524987
+355072.479888 7393229.636167
+355067.639351 7393212.649077
+355065.272683 7393201.001072
+355064.695447 7393188.113280
+355063.837839 7393176.735229
+355063.087432 7393158.288388
+355063.252356 7393146.670379
+355061.405201 7393133.512632
+355056.012166 7393102.367967
+355047.089744 7393087.600497
+355034.110177 7393072.773036
+355016.108656 7393054.086237
+354999.830596 7393038.968827
+354988.590984 7393026.440973
+354977.343125 7393014.922946
+354967.381679 7393001.905176
+354963.489458 7392989.977219
+354955.169011 7392968.400914
+354950.064594 7392952.413653
+354943.005821 7392931.607217
+354929.803606 7392878.386333
+354928.022420 7392843.002394
+354925.713475 7392809.378154
+354921.491405 7392767.135389
+354910.276531 7392734.660952
+354901.675713 7392697.407333
+354889.834126 7392655.824456
+354878.866639 7392623.849933
+354864.806816 7392596.134680
+354848.908083 7392572.178784
+354831.046747 7392543.643672
+354812.954517 7392513.598818
+354785.354383 7392474.065590
+354762.627772 7392394.719181
+354781.214776 7392295.576163
+354843.127475 7392234.066699
+354857.385208 7392217.039616
+354876.161875 7392196.853074
+354899.556432 7392174.716865
+354936.483052 7392145.951793
+354968.297010 7392118.366518
+355011.391812 7392085.682116
+355034.233871 7392067.855170
+355052.721920 7392056.187168
+355068.018677 7392047.368679
+355087.191164 7392038.480201
+355107.600585 7392028.941835
+355126.410237 7392025.912354
+355148.097823 7392021.473115
+355163.345104 7392017.083866
+355193.072765 7391994.347761
+355206.629568 7391986.179160
+355223.072552 7391974.271200
+355240.406129 7391965.912632
+355261.302078 7391958.703866
+355283.913242 7391953.384778
+355303.588748 7391945.826072
+355323.734290 7391941.596797
+355337.439525 7391939.297191
+355363.266720 7391939.107223
+355353.264042 7391928.599023
+355347.483434 7391924.559715
+355339.393882 7391906.762763
+355347.293771 7391891.885312
+355349.916072 7391884.936502
+355355.828620 7391875.688086
+355364.759287 7391870.688943
+355379.132467 7391861.860455
+355394.825044 7391843.833543
+355405.429697 7391834.875077
+355413.849098 7391829.975916
+355419.473028 7391829.036077
+355430.605439 7391827.926267
+355438.480589 7391826.346538
+355445.869212 7391822.317228
+355462.567829 7391796.131714
+355469.272015 7391788.662993
+355474.607326 7391786.173419
+355485.055300 7391782.064123
+355491.924410 7391779.584548
+355496.872149 7391774.655392
+355502.059028 7391765.846901
+355506.949042 7391756.808449
+355511.773087 7391743.790679
+355515.937434 7391735.192152
+355521.190283 7391719.854779
+355524.183664 7391706.597050
+355529.197373 7391695.019033
+355535.753126 7391682.011261
+355543.026301 7391669.233450
+355551.660105 7391652.936242
+355556.451165 7391633.269610
+355556.409934 7391606.464202
+355555.709004 7391583.978054
+355550.777758 7391556.692727
+355549.136758 7391525.778023
+355545.599125 7391511.900400
+355542.251156 7391500.242397
+355534.202835 7391477.346319
+355530.063227 7391462.688829
+355528.100624 7391444.951868
+355528.587152 7391426.565017
+355530.879604 7391411.417612
+355533.543136 7391399.599636
+355539.158819 7391379.503078
+355550.200522 7391356.577005
+355557.242803 7391329.411659
+355581.173364 7391343.589230
+355603.792775 7391364.085719
+355644.100350 7390990.169768
+355650.878752 7390846.134440
+355633.932748 7390737.683016
+355635.631472 7390690.231144
+355622.066422 7390639.399851
+355606.819142 7390600.426527
+355584.793460 7390575.010881
+355559.370331 7390561.453203
+355527.177046 7390542.806397
+355493.293284 7390512.311620
+355471.259356 7390476.727716
+355456.003829 7390427.586133
+355449.233674 7390371.665712
+355439.057825 7390324.213840
+355400.086139 7390256.435450
+355366.185885 7390205.594158
+355337.348817 7390159.572041
+355320.130687 7390172.009911
+355308.891075 7390173.339683
+355297.437060 7390175.769267
+355290.262840 7390178.688767
+355281.150755 7390181.148346
+355269.639017 7390189.566904
+355266.010675 7390195.395905
+355257.599520 7390199.525198
+355234.163733 7390206.044081
+355215.741653 7390210.843259
+355202.044664 7390213.252846
+355187.811670 7390217.652093
+355170.387385 7390225.230795
+355153.119778 7390227.280444
+355131.935211 7390233.049455
+355121.322312 7390232.939474
+355114.494433 7390232.429562
+355099.502786 7390230.959813
+355086.036691 7390230.269932
+355074.640401 7390226.610558
+355068.851547 7390224.011004
+355060.019834 7390219.381797
+355050.660362 7390216.402307
+355040.632946 7390208.773614
+355032.650594 7390200.285068
+355021.988218 7390194.855998
+355008.711787 7390185.087671
+354994.338607 7390173.099724
+354979.759271 7390161.991627
+354966.177729 7390152.223300
+354947.293861 7390141.955059
+354935.707907 7390136.745951
+354922.472707 7390134.066410
+354915.727290 7390124.368072
+354910.482687 7390117.999162
+354905.048421 7390110.420461
+354899.993482 7390105.271343
+354889.941327 7390100.082232
+354883.501021 7390101.571976
+354881.035398 7390102.981735
+354876.120644 7390104.931401
+354872.855137 7390104.891408
+354866.225167 7390103.831589
+354863.487419 7390102.811764
+354856.906927 7390097.092744
+354855.232942 7390091.323732
+354850.483113 7390086.514556
+354842.830611 7390085.654703
+354835.977993 7390087.254429
+354825.546512 7390089.913973
+354813.911080 7390089.803992
+354805.219553 7390091.263742
+354791.745212 7390091.573689
+354772.284108 7390088.284252
+354762.899897 7390087.414401
+354752.707556 7390086.314590
+354740.577351 7390084.644876
+354731.951794 7390079.465763
+354726.517528 7390072.316987
+354721.437850 7390069.497470
+354716.011830 7390061.588825
+354711.938192 7390060.549003
+354701.020183 7390060.439022
+354695.874535 7390064.598310
+354688.700314 7390067.067887
+354680.792179 7390071.977046
+354669.593798 7390079.945681
+354655.591698 7390082.025324
+354645.184955 7390081.145475
+354634.266945 7390081.035494
+354619.275298 7390080.335614
+354609.734409 7390075.146503
+354601.380978 7390072.846897
+354595.823018 7390067.697779
+354593.101762 7390064.128390
+354589.893978 7390058.229401
+354587.378878 7390054.660012
+354584.542175 7390052.410397
+354575.999080 7390049.230942
+354568.363070 7390047.381259
+354564.099769 7390045.121646
+354562.623694 7390040.012521
+354561.963995 7390034.473470
+354556.356558 7390033.643612
+354551.037740 7390035.363317
+354546.370373 7390042.292130
+354546.007539 7390048.371089
+354538.058173 7390056.939621
+354528.632731 7390061.048918
+354519.908219 7390065.498155
+354512.024822 7390068.637618
+354506.862682 7390073.896717
+354500.999612 7390079.155816
+354490.741301 7390083.815018
+354487.467547 7390085.004814
+354478.784267 7390085.244773
+354475.527006 7390084.664872
+354469.457780 7390079.725718
+354466.744770 7390075.156501
+354465.293433 7390067.397830
+354462.390760 7390061.718803
+354460.403419 7390056.159755
+354458.251152 7390046.501409
+354452.998303 7390040.912367
+354449.658580 7390037.892884
+354441.313395 7390036.263163
+354436.002822 7390036.203173
+354429.174943 7390035.583280
+354426.948461 7390033.013720
+354423.122210 7390027.994579
+354419.700024 7390023.305383
+354408.979924 7390023.975268
+354399.406050 7390022.105588
+354394.120217 7390019.286071
+354391.069111 7390018.926133
+354389.386880 7390013.367085
+354384.002092 7390010.767530
+354381.808594 7390005.208483
+354378.773981 7390002.858885
+354365.637736 7390000.179344
+354362.867002 7390001.699084
+354361.522867 7390002.908876
+354359.444817 7390007.198142
+354356.888485 7390007.178145
+354349.557586 7390005.888366
+354347.025993 7390003.758731
+354344.486154 7390002.179001
+354340.552702 7389997.379823
+354337.831446 7389994.580303
+354332.240502 7389991.760786
+354323.103678 7389987.131579
+354315.772779 7389985.501858
+354289.244655 7389974.493744
+354269.330008 7389965.105352
+354255.360893 7389963.975545
+354238.085040 7389966.785064
+354230.176905 7389951.757638
+354226.012559 7389939.319769
+354218.252856 7389929.381471
+354212.496987 7389922.792600
+354205.726831 7389916.413692
+354198.610334 7389914.014103
+354186.240988 7389905.475566
+354180.748999 7389903.645879
+354163.547361 7389899.156648
+354152.629352 7389898.276799
+354141.397986 7389898.936686
+354119.545475 7389900.156477
+354112.981475 7389903.635881
+354099.012360 7389902.386095
+354085.546266 7389901.806194
+354064.361699 7389907.575206
+354053.905479 7389912.454370
+354043.234856 7389917.883441
+354032.102445 7389928.411637
+354028.762722 7389935.680392
+354024.598375 7389943.948976
+354022.124506 7389956.766780
+354020.293843 7389966.385133
+354019.023923 7389981.212593
+354018.933215 7389990.620981
+354018.883737 7389995.160204
+354017.514863 7389999.139522
+354012.707310 7390000.859228
+354006.365959 7390001.799067
+354000.032854 7390002.728907
+353993.386392 7390003.878710
+353988.784995 7390004.608585
+353982.814724 7389999.789411
+353979.994513 7389995.660118
+353974.733418 7389991.070904
+353966.190323 7389988.441355
+353962.825861 7389987.631493
+353953.260234 7389985.201909
+353951.041998 7389981.972463
+353945.492284 7389976.273439
+353944.560460 7389967.174997
+353941.872189 7389960.616121
+353940.717717 7389952.967431
+353938.590189 7389941.429407
+353934.343381 7389937.290116
+353926.509462 7389935.210473
+353919.887738 7389933.600748
+353904.368332 7389934.110661
+353895.487142 7389935.020505
+353879.266806 7389934.080666
+353862.980501 7389939.669709
+353852.210923 7389944.878816
+353849.794778 7389952.387530
+353844.871778 7389964.745413
+353839.899301 7389971.784208
+353837.606849 7389976.293435
+353827.134136 7389983.172257
+353804.382786 7389992.020741
+353792.401012 7389996.439984
+353771.653496 7390009.747705
+353762.203316 7390015.746677
+353729.878092 7390022.945444
+353713.814434 7390026.774788
+353703.415938 7390025.564996
+353691.912446 7390011.767359
+353645.263519 7390001.399135
+353598.218773 7389995.020228
+353549.120716 7390004.458611
+353540.338480 7390014.076963
+353529.626627 7390023.485352
+353514.585502 7390047.701204
+353508.516276 7390053.070284
+353503.667493 7390057.559515
+353496.254131 7390064.238371
+353487.339956 7390068.137703
+353477.691866 7390072.916885
+353473.181178 7390075.526438
+353471.012419 7390077.606081
+353467.177922 7390083.885006
+353462.131229 7390088.044293
+353454.148878 7390090.503872
+353445.465597 7390090.753829
+353435.998924 7390088.994131
+353424.297523 7390084.784852
+353416.282186 7390080.155645
+353409.239905 7390070.237344
+353400.490655 7390057.189579
+353392.170208 7390042.492096
+353386.232922 7390033.563626
+353382.513872 7390029.434333
+353374.828385 7390020.825807
+353363.910376 7390010.307609
+353355.515713 7390002.918875
+353347.071573 7390000.169346
+353332.805594 7389999.089531
+353313.113595 7389997.729764
+353302.179093 7389998.729592
+353284.276526 7390002.758902
+353272.698818 7390007.728051
+353258.358623 7390012.907164
+353248.504378 7390018.226253
+353237.800770 7390027.204715
+353230.016329 7390040.412452
+353225.423178 7390050.670695
+353220.467194 7390055.709832
+353202.721305 7390064.618306
+353191.935235 7390072.256998
+353188.842899 7390074.776566
+353186.138135 7390079.625736
+353180.365774 7390096.172901
+353176.564262 7390108.430801
+353173.381217 7390113.969853
+353171.064026 7390117.449257
+353165.102001 7390121.598546
+353156.699092 7390124.837991
+353145.327540 7390129.157251
+353140.404540 7390131.876785
+353137.823470 7390135.056241
+353137.460636 7390140.035388
+353139.151113 7390144.934549
+353142.383636 7390147.954032
+353149.401178 7390150.353620
+353156.443459 7390150.643571
+353170.025001 7390149.443776
+353174.923262 7390149.943691
+353178.164030 7390152.303287
+353180.266819 7390156.082639
+353180.233834 7390159.742012
+353178.040337 7390164.921125
+353174.494458 7390172.529822
+353170.462051 7390177.688938
+353167.592363 7390178.768753
+353161.984926 7390177.828914
+353157.301067 7390176.789092
+353154.060298 7390174.649459
+353149.368193 7390174.379505
+353146.284103 7390176.009226
+353143.909188 7390178.978717
+353143.463892 7390183.177998
+353143.117550 7390186.497429
+353145.566681 7390197.265585
+353146.490258 7390206.573990
+353145.220339 7390211.213196
+353141.913600 7390215.392480
+353137.411158 7390216.232336
+353132.521144 7390215.742420
+353122.939024 7390213.982721
+353107.452602 7390211.723108
+353095.107995 7390211.373168
+353089.401604 7390210.433329
+353081.468730 7390207.583817
+353069.569419 7390203.474521
+353061.653037 7390199.185256
+353053.728410 7390195.565876
+353042.027009 7390191.796522
+353032.238733 7390190.476748
+353026.301447 7390192.526397
+353022.805045 7390195.475891
+353019.687970 7390200.205081
+353017.477980 7390206.943927
+353015.985412 7390213.902735
+353015.457653 7390225.300783
+353016.084367 7390233.949301
+353015.977166 7390244.907424
+353014.459859 7390253.755909
+353009.693538 7390260.684722
+353004.234533 7390265.723859
+352998.387956 7390268.543376
+352986.637077 7390269.753168
+352982.654148 7390269.933138
+352975.834515 7390268.533377
+352962.690023 7390266.303759
+352952.909994 7390264.324098
+352938.644015 7390262.294446
+352920.576524 7390261.894515
+352902.525525 7390261.264622
+352892.943405 7390259.954847
+352873.292637 7390254.875717
+352854.804588 7390246.717114
+352836.390755 7390240.108246
+352830.090635 7390237.948616
+352824.903756 7390236.228911
+352819.090163 7390235.179091
+352807.792827 7390232.069623
+352802.927551 7390229.030144
+352801.121626 7390226.130641
+352800.272265 7390219.371798
+352800.775285 7390209.853429
+352803.752174 7390197.475549
+352804.972616 7390188.407102
+352805.797239 7390177.009055
+352808.996777 7390143.044872
+352809.260656 7390137.405838
+352810.225465 7390132.536672
+352810.274942 7390128.107431
+352810.126510 7390122.018474
+352809.994571 7390115.479594
+352809.343118 7390108.500789
+352805.170526 7390097.492675
+352801.459722 7390091.473706
+352798.021044 7390087.564376
+352792.240436 7390084.184955
+352782.880964 7390081.095484
+352774.725442 7390080.685554
+352767.155402 7390082.155302
+352759.065850 7390084.954823
+352730.302998 7390092.863468
+352697.120166 7390104.491476
+352686.061970 7390107.810908
+352645.828611 7390119.808853
+352640.699455 7390122.748349
+352649.333259 7390150.433607
+352672.983448 7390192.076474
+352690.968477 7390237.858632
+352715.063963 7390294.368952
+352739.703701 7390341.310911
+352796.553215 7390445.123129
+352829.348474 7390538.947058
+352803.669712 7390674.973758
+352766.042161 7390831.606928
+352768.070734 7390878.388915
+352790.451004 7390917.042294
+352816.896666 7390944.497591
+352849.436292 7390975.012364
+352886.808209 7391057.138296
+352880.046300 7391191.995197
+352887.583355 7391221.150203
+352831.888313 7391411.077670
+352804.692244 7391547.624281
+352775.203724 7391649.326860
+352760.945991 7391709.336581
+352739.596500 7391762.227521
+352531.948166 7392153.540493
+352478.718747 7392281.288611
+352447.473779 7392356.295763
+352318.626425 7392632.968371
+352303.849180 7392698.447155
+352312.301566 7392749.128474
+352350.316689 7392831.504364
+352377.768391 7392941.325552
+352409.450409 7393192.652502
+352420.013831 7393427.092345
+352439.021392 7393564.368831
+352449.576568 7393627.727978
+352455.917919 7393701.655315
+352413.301399 7393899.621405
+352417.902796 7393927.646604
+352420.450881 7394021.210578
+352421.242519 7394091.828482
+352416.072133 7394130.981775
+352474.719325 7394112.015024
+352491.871485 7394100.646971
+352515.678353 7394088.659024
+352523.635965 7394119.763696
+352532.426447 7394185.662409
+352543.410426 7394286.695103
+352545.603924 7394383.338548
+352541.637487 7394470.333647
+352539.196602 7394523.054616
+352541.208683 7394567.836946
+352532.426447 7394613.959045
+352530.216457 7394644.703779
+352528.031206 7394682.047382
+352526.489161 7394816.824296
+352533.242824 7394989.314750
+352532.418201 7395009.071366
+352530.892648 7395026.148441
+352524.642005 7395050.354295
+352501.956625 7395160.085499
+352497.792278 7395178.542337
+352487.913294 7395221.814925
+352484.177752 7395241.891486
+352475.997491 7395280.534867
+352562.516943 7395343.414096
+352659.946158 7395408.482951
+352755.462247 7395473.881748
+352845.676011 7395537.630829
+352883.443747 7395552.628260
+352951.788507 7395602.569705
+353006.997021 7395627.545427
+353118.609753 7395648.621817
+353119.788964 7395682.825958
+353119.640531 7395715.340389
+353103.601613 7395774.780207
+353081.476976 7395874.893059
+353071.960826 7395914.566263
+353069.577665 7395943.921235
+353071.160941 7395971.696477
+353104.203588 7396048.293357
+353111.419039 7396064.790531
+353163.980514 7396149.426034
+353185.692839 7396185.509853
+353215.618410 7396238.110843
+353233.149896 7396281.443420
+353231.088339 7396386.675395
+353237.842001 7396353.970997
+353338.421277 7396381.096351
+353367.101667 7396390.294775
+353416.026553 7396409.871422
+353470.666078 7396430.257930
+353522.056587 7396449.014717
+353547.438485 7396456.913364
+353567.410856 7396472.320725
+353745.521191 7396570.533902
+354058.902695 7396693.012922
+354118.226078 7396716.718862
+Region 1
+494
+353976.399157 7397735.564343
+353977.454674 7397728.715516
+353994.507879 7397725.326096
+354007.066889 7397762.509727
+354010.456089 7397823.299314
+354010.983848 7397898.856372
+354015.197672 7398017.726011
+354023.913938 7398117.698886
+354050.846127 7398162.911142
+354069.070297 7398198.265086
+354098.542325 7398240.707816
+354132.673474 7398258.164826
+354153.998226 7398259.334625
+354219.110464 7398259.074670
+354277.889596 7398258.964689
+354359.230415 7398260.214475
+354425.901189 7398257.304973
+354465.169740 7398233.569039
+354496.917728 7398216.112029
+354554.847498 7398182.777739
+354620.710142 7398146.273992
+354698.472097 7398109.760246
+354783.746368 7398077.855711
+354813.193658 7398066.067730
+354832.176481 7398056.959291
+354862.737012 7398040.722072
+354935.740892 7398084.374595
+354998.420491 7398116.919020
+355125.478413 7398187.816876
+355231.425984 7397925.551799
+355228.383125 7397828.158482
+355227.731673 7397804.282572
+355227.756411 7397804.252577
+355301.032417 7397795.654050
+355366.903307 7397781.376495
+355417.526917 7397773.327874
+355449.266659 7397767.728833
+355527.803760 7397759.070316
+355527.770775 7397759.050320
+355587.506470 7397746.452478
+355652.313596 7397737.593995
+355714.333497 7397724.756194
+355746.922600 7397714.497951
+355776.930634 7397700.740308
+355790.396728 7397690.772015
+355834.843912 7397658.237588
+355893.557074 7397613.795201
+355951.750723 7397570.282654
+356036.662160 7397487.656807
+356046.104095 7397479.008288
+356070.488199 7397455.892248
+356089.116434 7397438.235272
+356165.031233 7397405.880814
+356089.116434 7397438.235272
+356165.031233 7397405.880814
+356232.073088 7397377.295711
+356300.813667 7397335.902801
+356357.052960 7397300.748823
+356399.240676 7397271.063907
+356419.551142 7397249.977519
+356446.854411 7397225.311744
+356496.628660 7397264.055108
+356504.512056 7397263.635180
+356511.158518 7397259.415902
+356514.795106 7397251.387278
+356519.990231 7397240.599126
+356525.375020 7397235.100068
+356533.538788 7397232.410528
+356549.058194 7397230.560845
+356565.055882 7397231.490686
+356584.088182 7397233.960263
+356603.565779 7397242.488802
+356619.777868 7397248.207822
+356631.891581 7397255.906504
+356647.848037 7397261.875481
+356658.724816 7397266.534683
+356692.748763 7397269.414190
+356710.742038 7397273.893423
+356727.696289 7397280.882225
+356741.607680 7397287.591076
+356751.701066 7397294.759848
+356779.037321 7397305.138071
+356789.683204 7397308.027576
+356801.838148 7397312.696776
+356814.776484 7397314.846408
+356827.970453 7397316.246168
+356835.573478 7397318.855721
+356845.691603 7397323.244969
+356854.317160 7397324.604736
+356868.022396 7397326.004496
+356881.191626 7397330.943650
+356888.209168 7397340.601996
+356892.926012 7397351.750086
+356897.956213 7397356.589258
+356903.745067 7397362.708209
+356913.846699 7397368.367240
+356921.622895 7397378.535498
+356929.159950 7397387.443972
+356934.932311 7397394.312796
+356940.440793 7397402.951316
+356954.566586 7397412.939605
+356966.457651 7397418.108720
+356977.845695 7397423.017879
+356991.006679 7397428.206990
+356999.055001 7397436.365593
+357006.913658 7397438.215276
+357021.905306 7397438.375248
+357034.662224 7397433.206134
+357046.173962 7397426.017365
+357059.648303 7397424.897557
+357067.473976 7397430.526593
+357072.710333 7397440.174940
+357083.273754 7397451.383020
+357089.334734 7397454.722448
+357103.501758 7397460.931385
+357116.407109 7397467.120325
+357126.995269 7397475.558879
+357139.851143 7397485.277214
+357157.275428 7397496.815238
+357172.712372 7397502.774217
+357188.413195 7397507.983325
+357202.596712 7397513.182435
+357218.800555 7397519.151412
+357235.507418 7397525.640301
+357250.193955 7397530.839410
+357258.242276 7397538.488100
+357269.374687 7397543.907172
+357276.944727 7397548.776338
+357287.598857 7397550.905973
+357300.768087 7397555.585171
+357305.179821 7397559.634478
+357358.483456 7397489.766446
+357393.389750 7397609.405952
+357360.041993 7397645.209819
+357353.609933 7397659.317403
+357355.696230 7397668.885764
+357362.779742 7397676.664432
+357413.832156 7397706.869258
+357491.552880 7397728.695519
+357482.679936 7397756.920684
+357443.634033 7397905.345261
+357440.500466 7397927.211515
+357442.059003 7397952.217232
+357448.309646 7397975.643219
+357478.779468 7398013.126799
+357512.382858 7398018.565867
+357560.714016 7398044.711388
+357587.646205 7398055.799489
+357620.136354 7398057.389217
+357708.090650 7398055.009624
+357768.296380 7398052.630032
+357819.010699 7398051.840167
+357872.099932 7398051.050303
+357957.662821 7398052.630032
+357992.527884 7398054.219760
+358012.970290 7398058.219075
+358099.168139 7398089.283754
+358115.338997 7398097.792296
+358128.013453 7398111.269988
+358134.346559 7398124.737681
+358141.487794 7398144.544288
+358147.029261 7398159.601709
+358154.953889 7398171.479674
+358168.683863 7398176.118880
+358179.519410 7398174.649131
+358194.733706 7398165.740657
+358267.473706 7398092.253245
+358281.723193 7398090.663517
+358446.524112 7398120.768361
+358464.302985 7398066.847597
+358459.561403 7398058.219075
+358458.464654 7398041.052015
+358462.249674 7398018.395896
+358466.001709 7397998.509302
+358472.821342 7397977.392920
+358478.816351 7397962.315502
+358490.245627 7397937.469758
+358499.365958 7397915.113587
+358515.652264 7397887.038396
+358528.137057 7397878.489861
+358537.908840 7397872.140948
+358555.662975 7397875.860311
+358566.053225 7397877.989946
+358576.443476 7397880.869453
+358591.913405 7397884.058907
+358603.837454 7397886.458496
+358628.452453 7397889.238020
+358645.241778 7397887.398335
+358664.603928 7397882.559164
+358684.032047 7397871.161116
+358692.022645 7397859.643089
+358694.166665 7397849.074899
+358692.030891 7397833.417581
+358686.827519 7397820.239838
+358678.300917 7397809.051755
+358662.723787 7397791.484764
+358649.900899 7397777.977078
+358635.535965 7397765.969134
+358607.292625 7397744.232858
+358592.680304 7397731.465045
+358570.745331 7397714.078023
+358543.244151 7397668.885764
+358523.882002 7397648.759211
+358511.133329 7397627.432864
+358491.276406 7397605.536615
+358483.277562 7397592.838790
+358475.789985 7397579.391094
+358465.960478 7397571.212495
+358452.618077 7397558.204723
+358441.238278 7397553.045606
+358428.868932 7397544.587055
+358419.748601 7397541.967504
+358408.640929 7397534.538776
+358398.011537 7397530.129532
+358387.571809 7397532.549117
+358366.040901 7397524.880431
+358352.401636 7397517.541688
+358335.917421 7397513.842322
+358316.192437 7397504.293957
+358303.047945 7397497.595105
+358294.958393 7397492.975896
+358283.372439 7397483.267559
+358272.553384 7397472.049480
+358247.649768 7397446.813803
+358234.521769 7397438.355252
+358218.375649 7397426.327312
+358198.172384 7397413.749467
+358183.287938 7397403.251265
+358169.162144 7397392.763061
+358152.273864 7397379.465339
+358134.255850 7397351.530124
+358120.740278 7397330.453734
+358107.686495 7397314.416481
+358102.474877 7397302.758478
+358099.060938 7397287.841034
+358096.669531 7397272.933587
+358084.926898 7397252.637064
+358074.660341 7397237.639633
+358061.400402 7397217.323113
+358049.847433 7397203.835423
+358040.537439 7397194.147082
+358027.714550 7397180.899352
+358007.849380 7397159.243061
+357994.317316 7397140.946195
+357978.492799 7397121.859465
+357964.152604 7397107.831867
+357947.478726 7397097.813583
+357929.007169 7397090.554827
+357910.024346 7397082.786158
+357886.258710 7397070.938187
+357859.722339 7397081.246421
+357843.386556 7397088.645154
+357826.028241 7397096.533803
+357808.933805 7397103.912539
+357793.637047 7397108.291789
+357785.473279 7397111.741198
+357763.027039 7397120.579684
+357742.287769 7397136.256998
+357725.415981 7397145.655389
+357713.434208 7397150.074632
+357696.867530 7397154.693840
+357688.712008 7397157.123424
+357673.695622 7397159.493018
+357656.675402 7397158.803137
+357641.428122 7397159.403034
+357634.814645 7397159.333046
+357624.655289 7397158.973107
+357610.141923 7397162.342530
+357600.667004 7397169.561294
+357593.418567 7397131.647788
+357590.004627 7397117.740170
+357585.089874 7397101.043030
+357579.235050 7397076.257276
+357574.798578 7397063.099530
+357570.362106 7397049.171915
+357561.901473 7397031.424955
+357564.614483 7397014.307887
+357569.075694 7396999.970343
+357574.320297 7396983.633142
+357582.071754 7396970.605373
+357585.963974 7396962.566750
+357596.502657 7396950.318848
+357608.806033 7396940.110597
+357621.810339 7396935.201437
+357631.268766 7396930.262284
+357644.306056 7396922.573601
+357655.050895 7396915.124876
+357663.016754 7396905.876461
+357669.448813 7396898.127788
+357676.466356 7396882.560454
+357684.481692 7396868.772816
+357689.718048 7396853.445442
+357692.125948 7396841.357512
+357700.231992 7396818.241472
+357703.736640 7396798.344880
+357714.118645 7396776.518618
+357722.538046 7396747.593573
+357728.533056 7396732.776111
+357736.053618 7396717.468733
+357743.417502 7396636.862540
+357746.031557 7396609.367250
+357744.918316 7396593.719930
+357745.091487 7396576.312912
+357745.998573 7396561.695416
+357748.200316 7396544.568349
+357749.396020 7396526.671415
+357753.692306 7396504.015296
+357755.085919 7396491.417454
+357758.301949 7396475.310213
+357760.594401 7396448.844746
+357761.303577 7396428.928158
+357761.196376 7396414.550620
+357759.662577 7396390.064814
+357757.229939 7396378.686763
+357754.376743 7396359.490052
+357753.304733 7396339.803424
+357754.426220 7396329.215237
+357758.417396 7396311.098341
+357763.934124 7396292.741485
+357769.426114 7396277.164153
+357777.499174 7396257.827465
+357782.768515 7396239.470610
+357785.036228 7396215.784667
+357786.454580 7396200.917214
+357791.468288 7396182.560358
+357798.972358 7396169.262636
+357810.813945 7396153.505335
+357818.260292 7396145.756662
+357826.481784 7396136.768202
+357831.709894 7396122.440656
+357833.870406 7396109.852812
+357838.084230 7396095.015354
+357841.077612 7396075.378717
+357846.305722 7396060.301300
+357851.269953 7396046.723626
+357857.034068 7396029.886510
+357857.570073 7396029.116642
+357865.783319 7396018.378481
+357875.348946 7396002.341228
+357882.828278 7395991.063160
+357893.812257 7395985.384133
+357908.127713 7395977.205533
+357917.107858 7395968.477029
+357926.368375 7395957.478912
+357933.064315 7395947.960543
+357956.013575 7395914.906205
+357971.120669 7395903.468164
+357985.683513 7395895.799478
+358005.293049 7395891.210264
+358019.064254 7395886.321101
+358039.209796 7395878.962362
+358047.431288 7395870.723773
+358057.450458 7395859.485698
+358069.753834 7395848.767534
+358081.323296 7395835.009890
+358097.700310 7395824.341718
+358113.813444 7395813.413590
+358123.511012 7395809.484263
+358141.553764 7395797.156374
+358157.914286 7395780.849168
+358171.124747 7395766.351651
+358184.417671 7395753.413867
+358203.639635 7395740.316111
+358213.262986 7395727.008390
+358221.253583 7395713.240748
+358227.660905 7395695.363810
+358241.630019 7395675.677183
+358255.285777 7395647.012093
+358270.030038 7395611.168232
+358279.224585 7395586.602440
+358284.279524 7395573.214733
+358297.143644 7395541.330195
+358302.627387 7395512.815079
+358305.356890 7395484.159988
+358305.216704 7395456.584711
+358307.880236 7395434.678463
+358314.122633 7395421.900652
+358329.468868 7395408.642923
+358342.159817 7395394.705311
+358354.586887 7395376.778381
+358356.252625 7395352.542533
+358351.115224 7395334.775576
+358350.711158 7395312.509390
+358352.170741 7395298.901721
+358347.940425 7395261.758083
+358337.616144 7395252.689637
+358318.847723 7395240.331753
+358288.402640 7395220.985067
+358254.535370 7395197.179145
+358220.173327 7395171.493545
+358198.403278 7395152.786749
+358167.949949 7395134.659854
+358141.883613 7395116.802913
+358099.860822 7395092.257117
+358068.203543 7395072.120566
+358017.901536 7395047.604766
+357967.937624 7395031.057600
+357924.455250 7395019.009664
+357878.218635 7395007.711599
+357835.544391 7394996.553510
+357776.262239 7394993.654007
+357738.131668 7394998.153236
+357701.732806 7395004.222197
+357679.096903 7395011.530945
+357652.370870 7395019.689547
+357630.452389 7395027.448218
+357605.012767 7395028.648013
+357600.048536 7395025.268592
+357592.742376 7395020.109475
+357590.911713 7395009.461299
+357589.996381 7394998.373199
+357591.653874 7394975.137179
+357593.344351 7394947.911842
+357593.723677 7394919.346735
+357596.634597 7394893.351188
+357601.557597 7394855.647646
+357611.939601 7394820.853606
+357621.315565 7394801.786872
+357628.885605 7394789.229023
+357636.859710 7394777.790982
+357655.743578 7394756.824574
+357667.972738 7394748.416014
+357679.806079 7394739.227588
+357703.101681 7394726.719730
+357698.318867 7394704.413551
+357634.476549 7394756.894562
+357579.259789 7394818.504009
+357560.219242 7394835.961018
+357392.243524 7395038.926252
+357333.266482 7395104.974939
+357303.118263 7395131.150455
+357277.719873 7395148.607465
+357179.317602 7395214.476182
+357053.150274 7395295.412319
+357022.581497 7395314.389068
+356973.137098 7395338.714901
+356839.482191 7395377.988174
+356760.590503 7395401.434158
+356526.595462 7395463.833469
+356474.602978 7395476.831243
+356425.199810 7395492.428571
+356348.048076 7395511.965225
+356201.611512 7395549.628774
+356032.868894 7395597.570562
+355772.626101 7395656.220515
+355426.696726 7395723.299025
+355197.237112 7395785.968291
+355105.217424 7395804.365139
+355031.611569 7395825.071593
+354978.703753 7395859.575682
+354925.795938 7395887.180954
+354877.489518 7395937.782286
+354860.007509 7395950.550099
+354822.635592 7395978.975230
+354751.882933 7396032.606044
+354708.689177 7396083.657299
+354659.756044 7396137.478080
+354612.463912 7396189.679139
+354563.341116 7396234.481464
+354519.479415 7396289.981958
+354421.027667 7396421.199481
+354256.366934 7396534.700040
+354219.687700 7396565.964684
+354180.757245 7396600.978687
+354159.292306 7396625.244530
+354139.691016 7396662.578135
+354125.688917 7396694.322698
+354118.226078 7396716.718862
+354108.891345 7396752.192785
+354030.296520 7397007.519050
+354012.839250 7397055.130895
+353989.032382 7397102.742739
+353967.608675 7397149.564719
+353944.593445 7397196.386699
+353922.369854 7397245.588271
+353900.146262 7397303.518348
+353879.522439 7397352.719920
+353853.398381 7397407.650511
+353825.509629 7397460.771412
+353802.873725 7397500.124671
+353814.476172 7397519.731313
+353834.382573 7397548.216434
+353838.118115 7397555.125250
+353842.208246 7397564.733604
+353845.877818 7397578.131309
+353848.277471 7397599.737608
+353854.231250 7397617.554557
+353857.950300 7397625.993111
+353868.670400 7397652.748528
+353886.605951 7397715.537773
+353894.547072 7397732.944791
+353902.108865 7397740.003582
+353919.236286 7397738.373861
+353976.399157 7397735.564343
+Region 1
+189
+324677.920995 7399197.423939
+324782.458461 7399206.932311
+325016.857567 7399181.586652
+325682.056255 7399140.403706
+325865.040113 7399134.584703
+326431.391234 7399199.933509
+326675.413691 7399212.761312
+326901.277948 7399224.829245
+327116.537553 7399213.321216
+327105.050554 7399145.072906
+327095.823022 7399102.290235
+327092.532776 7399019.634393
+327088.129289 7398984.530406
+327088.467384 7398979.811214
+327157.414118 7398854.862617
+327190.613443 7398800.841870
+327199.230754 7398784.624648
+327204.425879 7398767.957503
+327206.668854 7398746.291214
+327205.967925 7398717.346172
+327205.877216 7398702.978633
+327210.058055 7398677.463004
+327215.879894 7398668.454547
+327222.641803 7398649.817739
+327330.015972 7398465.119376
+327336.217138 7398453.081438
+327353.798101 7398428.965569
+327363.141081 7398397.071032
+327395.276641 7398353.138558
+327460.891899 7398241.927607
+327509.792046 7398139.425165
+327559.186968 7398037.662596
+327587.842620 7397981.352241
+327733.759671 7397726.455903
+327815.685972 7397640.850566
+327930.646674 7397541.787535
+327964.901516 7397503.874029
+327960.011501 7397358.338958
+327960.011501 7397237.259698
+327879.503551 7397240.909073
+327872.279853 7397239.849254
+327813.451244 7397240.089213
+327743.209851 7397239.319345
+327670.469851 7397120.919626
+327538.018894 7396913.845096
+327444.688056 7396776.748579
+327355.587533 7396637.912360
+327319.056732 7396569.494080
+327271.220348 7396497.516409
+327197.350613 7396547.047925
+327121.732678 7396569.494080
+327124.041623 7396529.520927
+327119.704106 7396502.895488
+327113.816297 7396474.000437
+327102.617916 7396445.515316
+327091.081439 7396423.889021
+327077.656576 7396405.692138
+327059.663300 7396387.525249
+327040.169211 7396372.797772
+327027.940051 7396363.729325
+326976.689728 7396320.636707
+326956.791573 7396302.099882
+326937.256253 7396280.523578
+326918.883651 7396261.206887
+326829.296601 7396237.370970
+326814.469878 7396240.130497
+326781.196338 7396251.608531
+326758.684128 7396264.146383
+326723.340783 7396296.880776
+326695.229383 7396282.143300
+326707.293619 7396238.470781
+326708.926372 7396217.124438
+326738.052059 7396121.050894
+326737.969597 7396105.443567
+326732.922903 7396089.096368
+326723.711864 7396056.182006
+326724.849844 7396000.001629
+326739.033360 7395842.888541
+326753.917807 7395717.929945
+326767.820952 7395600.580046
+326722.252281 7395592.821375
+326675.628093 7395581.013398
+326616.082061 7395566.125948
+326616.073815 7395566.145944
+326499.307189 7395571.235073
+326434.763942 7395579.483660
+326293.308101 7395601.169945
+326241.439311 7395612.967924
+326076.432235 7395651.951247
+326060.409809 7395655.290675
+326016.160536 7395659.709918
+325977.271312 7395674.527380
+325916.546069 7395703.612398
+325895.237809 7395723.718953
+325876.246740 7395755.763465
+325844.292596 7395787.318060
+325828.542296 7395794.716792
+325817.352161 7395798.296179
+325796.497444 7395800.885735
+325769.029249 7395805.274984
+325709.771836 7395810.994004
+325688.933611 7395819.172603
+325671.138245 7395824.801639
+325662.751829 7395829.130897
+325645.236835 7395843.648411
+325628.249600 7395862.975100
+325561.850951 7395949.470284
+325516.686345 7395993.502742
+325530.680199 7396021.447955
+325534.110631 7396033.985808
+325532.222244 7396044.643982
+325534.506450 7396050.343006
+325531.859410 7396068.589880
+325525.402611 7396077.708318
+325516.661607 7396090.246171
+325501.818391 7396102.034151
+325485.853689 7396111.912459
+325467.200715 7396120.640964
+325432.962366 7396133.938687
+325393.009378 7396146.086606
+325351.910165 7396159.004393
+325324.953237 7396168.152826
+325288.372957 7396174.191792
+325247.653070 7396178.361077
+325219.863273 7396180.630689
+325167.343030 7396184.410041
+325123.580284 7396187.819457
+325022.333064 7396184.749983
+324953.048234 7396172.572069
+324700.672345 7396127.629767
+324585.711644 7396105.553549
+324572.047640 7396095.685239
+324560.593625 7396088.456477
+324548.026370 7396080.117906
+324536.201275 7396070.179608
+324527.163406 7396064.370603
+324506.127272 7396048.483324
+324523.881407 7396080.807787
+324527.163406 7396103.803848
+324522.232160 7396177.701190
+324515.668161 7396220.403876
+324489.387424 7396323.866154
+324482.823424 7396419.119838
+324489.387424 7396451.964212
+324494.318670 7396474.950274
+324500.882669 7396499.586054
+324509.095915 7396522.582115
+324519.601613 7396545.958111
+324479.871274 7396681.244938
+324472.812500 7396704.111021
+324446.012251 7396786.426921
+324419.632559 7396874.811782
+324429.569267 7396885.939876
+324435.127226 7396893.498581
+324439.538960 7396902.627017
+324443.076592 7396912.535320
+324443.043608 7396924.063345
+324440.322351 7396937.980961
+324429.965086 7396949.928915
+324406.768439 7397044.902647
+324370.707672 7397107.931850
+324352.236116 7397131.617793
+324331.727740 7397182.789028
+324285.746758 7397343.731460
+324230.719661 7397533.278992
+324188.853548 7397690.242106
+324194.263075 7397698.160749
+324176.978976 7397731.405055
+324092.018061 7397845.835454
+324040.990386 7397911.364230
+324057.120013 7397934.540260
+323980.817641 7397992.200383
+323924.256745 7398036.192848
+323894.867179 7398063.488172
+323867.563909 7398098.142236
+323847.566800 7398138.115389
+323830.909414 7398192.076146
+323823.578515 7398208.733293
+323794.527045 7398290.029368
+323748.999605 7398458.030591
+323878.712813 7398544.435790
+323992.576766 7398611.404319
+324101.971262 7398696.249786
+324166.712419 7398772.156784
+324280.576371 7398954.105617
+324343.082800 7399027.772999
+324392.205596 7399056.798027
+324541.718003 7399165.749365
+324677.920995 7399197.423939
+Region 1
+124
+333956.423041 7394117.764039
+333947.632559 7394151.748218
+333937.423725 7394115.114493
+333926.142882 7394090.908639
+333914.862038 7394064.673133
+333910.087471 7394056.264573
+333899.787929 7394038.417630
+333892.993034 7394028.729290
+333886.453774 7394018.780994
+333877.630307 7394007.812873
+333870.942614 7394000.004210
+333844.810309 7393981.247423
+333802.688563 7393971.229139
+333747.339863 7393961.650780
+333719.137754 7393959.301182
+333662.684059 7393954.741963
+333456.750941 7393939.814520
+333348.296515 7393932.705738
+333236.312703 7393924.627122
+333191.717088 7393921.957579
+333146.082447 7393928.026539
+333080.392974 7393935.765214
+333041.759383 7393939.624553
+333017.243340 7393944.773671
+332915.641532 7393966.190002
+332883.440001 7393972.568910
+332838.316627 7393850.359843
+332806.510916 7393761.085135
+332783.710088 7393687.697705
+332766.764084 7393643.535270
+332749.430507 7393607.281480
+332714.639660 7393561.139384
+332691.071933 7393516.607012
+332669.153452 7393463.186162
+332653.543337 7393423.622939
+332641.388393 7393377.150899
+332635.187228 7393320.950526
+332625.151565 7393236.764946
+332616.913581 7393138.681747
+332610.011485 7393103.287810
+332603.538194 7393079.041963
+332591.572914 7393028.010704
+332583.170005 7392994.156503
+332578.560362 7392958.982528
+332572.837478 7392917.239678
+332573.876503 7392885.275153
+332575.220638 7392839.113060
+332582.634000 7392791.091286
+332584.753281 7392746.688892
+332583.293698 7392701.066706
+332580.803337 7392653.954776
+332577.702754 7392584.276711
+332555.710057 7392351.046662
+332557.515981 7392291.436872
+332555.619348 7392250.453892
+332559.536308 7392053.557619
+332626.710103 7392026.792204
+332727.652212 7391998.537043
+332872.571469 7391951.855040
+332932.142239 7391927.989128
+333028.037656 7391902.023575
+333133.292544 7391870.638951
+333289.797755 7391879.407449
+333239.347316 7391844.073502
+333250.108647 7391826.466518
+333253.638034 7391822.627175
+333259.707259 7391819.777663
+333264.786938 7391818.467888
+333269.619229 7391818.427894
+333277.263485 7391819.377732
+333283.876961 7391819.817656
+333289.220519 7391820.027620
+333295.833996 7391819.717674
+333302.678367 7391817.877989
+333309.011473 7391814.528562
+333313.299512 7391811.189134
+333321.578728 7391799.701102
+333378.246825 7391690.329836
+333384.497468 7391539.305706
+333398.606768 7391516.789562
+333418.191566 7391488.814354
+333436.481706 7391488.064483
+333513.386053 7391491.213943
+333580.106305 7391482.015519
+333632.337930 7391481.265647
+333714.173523 7391474.746764
+333781.553474 7391471.317351
+333826.083119 7391473.466983
+333859.810202 7391489.414252
+333890.156331 7391524.158300
+334025.790333 7391529.297420
+334080.363887 7391531.637019
+334144.321652 7391529.517382
+334171.220856 7391678.751820
+334185.717730 7391763.807250
+334190.368604 7391790.992594
+334214.373381 7391904.213200
+334222.240286 7391954.644562
+334230.239129 7391999.996793
+334242.493028 7392080.962925
+334278.537302 7392277.169316
+334302.781220 7392415.995537
+334329.218636 7392548.722802
+334358.781373 7392719.923476
+334409.743078 7392986.947738
+334358.921558 7392996.776054
+334356.241534 7393021.411834
+334345.405986 7393111.826347
+334342.288911 7393124.054252
+334333.853017 7393138.121843
+334304.578899 7393170.236342
+334294.394804 7393193.372379
+334277.960066 7393343.586649
+334240.538671 7393340.567166
+334209.607060 7393348.105874
+334149.797149 7393365.672865
+334176.102625 7393464.365960
+334198.021106 7393539.693057
+334231.410094 7393644.665077
+334141.328270 7393692.396901
+334024.149333 7393748.137353
+334002.890550 7393905.390417
+333992.211682 7393973.488752
+333956.423041 7394117.764039
+Region 1
+145
+329086.603286 7402389.157224
+329078.794105 7402335.956337
+329044.176429 7402293.933535
+328991.441784 7402247.231535
+328876.068771 7402181.852734
+328774.293793 7402116.863866
+328710.319535 7402074.781074
+328675.413241 7402053.494720
+328629.440505 7402030.508657
+328577.513991 7401998.164198
+328548.107932 7401973.788373
+328521.513838 7401947.792826
+328474.328907 7401889.732771
+328413.249076 7401818.374994
+328373.823847 7401768.183591
+328263.901593 7401657.802499
+328195.499110 7401557.499680
+328172.393171 7401536.823221
+328116.838316 7401463.745739
+328065.893103 7401410.154918
+328018.642201 7401351.424978
+327958.708597 7401268.679152
+327942.290351 7401226.466383
+327926.449342 7401186.993144
+327917.518675 7401143.050671
+327913.073956 7401127.793284
+327904.201012 7401085.320560
+327901.116922 7401059.754939
+327898.107048 7401043.577710
+327901.042706 7401007.563879
+327904.407168 7400986.917415
+327908.101479 7400963.101495
+327916.289986 7400940.275405
+327931.529020 7400859.829184
+327956.251220 7400744.768893
+327975.201058 7400663.912743
+327983.892585 7400597.324149
+327993.862278 7400518.667622
+327992.633590 7400467.596370
+327988.617675 7400446.999898
+327983.678183 7400425.183635
+327974.228003 7400391.519401
+327951.526130 7400352.696052
+327918.706132 7400303.074551
+327857.337683 7400201.801898
+327828.179012 7400148.161087
+327801.354023 7400085.171876
+327774.529035 7400016.363662
+327739.078490 7399947.095527
+327707.833522 7399873.848074
+327705.541070 7399867.899093
+327677.677056 7399805.989697
+327630.285969 7399704.737041
+327582.886635 7399576.558997
+327557.026456 7399446.221322
+327535.421331 7399299.876390
+327502.287977 7399141.383538
+327604.978287 7399124.166488
+327687.193206 7399107.099411
+327890.619470 7399056.238123
+328141.857379 7399021.464080
+328241.785202 7398973.502295
+328317.708248 7398902.424470
+328421.668478 7398807.610711
+328615.537360 7398687.691252
+328705.478998 7398637.709813
+328821.404508 7398601.735975
+329181.162813 7398557.763507
+329263.649858 7398549.594906
+329395.482347 7398538.076879
+329435.657983 7399061.717185
+329451.301082 7399191.105022
+329458.986569 7399344.238791
+329465.608293 7399378.612903
+329488.079271 7399409.027693
+329515.836083 7399431.503843
+329573.328804 7399496.512708
+329601.456696 7399528.847169
+329633.196438 7399562.451413
+329650.208412 7399584.597620
+329805.979709 7399801.140528
+329890.602528 7399920.420097
+329905.915778 7399944.905902
+329935.247620 7399999.116617
+330000.607245 7400055.746916
+330049.103327 7400141.592212
+330098.036460 7400238.035692
+330129.677247 7400322.161282
+330108.006152 7400339.758268
+330060.656296 7400395.078792
+330016.423515 7400429.032976
+329971.498050 7400459.587742
+329922.935998 7400489.322649
+329889.893352 7400509.579179
+329860.586248 7400527.626088
+329851.292746 7400535.624718
+329847.557204 7400539.644029
+329842.832114 7400552.141888
+329841.760104 7400575.737847
+329843.937108 7400640.916682
+329818.852075 7400759.126434
+329773.069002 7400988.187198
+329755.669456 7401073.362608
+329824.962532 7401089.719806
+329875.660358 7401164.427009
+329910.055386 7401220.687373
+329936.138213 7401257.821012
+329915.687561 7401359.213644
+329975.266578 7401452.597648
+330017.973806 7401536.203328
+330012.292153 7401579.055987
+330010.857309 7401601.132206
+330001.069033 7401699.865294
+330020.381706 7401744.507647
+330091.389998 7401907.479731
+330094.474088 7401909.779337
+330193.189715 7401980.037303
+330210.251166 7402002.603437
+330175.386103 7402007.532593
+330136.233000 7402010.932011
+330100.477344 7402014.341427
+330065.571050 7402024.559676
+330000.879370 7402067.122386
+329940.426253 7402113.084513
+329902.122512 7402135.220721
+329873.178242 7402139.479992
+329845.091581 7402142.029555
+329825.506783 7402146.288825
+329799.118845 7402159.056638
+329766.768882 7402176.933576
+329759.108134 7402184.592264
+329742.937275 7402188.001680
+329653.548135 7402175.233867
+329430.512335 7402142.879409
+329351.340275 7402129.261742
+329189.590460 7402107.985386
+329155.541774 7402107.125534
+329155.492297 7402107.145530
+329156.993111 7402153.997505
+329156.217965 7402247.021571
+329156.226211 7402247.051566
+329135.792052 7402360.532127
+329126.160454 7402362.741749
+329117.930716 7402376.709356
+329086.603286 7402389.157224
+Region 1
+514
+334379.256763 7402229.984489
+334383.891145 7402300.952333
+334381.227612 7402411.963318
+334383.891145 7402451.776498
+334377.640502 7402474.472610
+334416.752374 7402546.400290
+334440.996292 7402584.113830
+334457.727894 7402613.128860
+334505.440585 7402703.143441
+334573.636912 7402794.947716
+334605.285945 7402826.602294
+334622.429859 7402862.286182
+334648.372500 7402926.965103
+334672.665896 7402986.454913
+334674.710961 7402993.943630
+334691.120960 7403041.125548
+334701.049422 7403070.810463
+334719.133406 7403109.983753
+334745.364665 7403167.883835
+334585.313575 7403210.856475
+334545.772899 7403205.097461
+334497.928268 7403171.743174
+334445.977015 7403218.635142
+334395.229712 7403230.473114
+334370.425050 7403207.896982
+334267.660524 7403234.542417
+334100.022901 7403279.534711
+334031.348292 7403215.435690
+333944.358805 7403279.524712
+333845.354560 7403296.121869
+333788.125719 7403323.597163
+333795.926654 7403394.704983
+333870.200453 7403447.825884
+333862.820077 7403475.371166
+333850.516700 7403498.977122
+333832.333762 7403504.396194
+333800.849653 7403543.249539
+333766.413394 7403570.304904
+333725.503844 7403592.701068
+333702.422644 7403599.919832
+333685.361193 7403602.849330
+333655.847934 7403612.067751
+333614.690996 7403629.464771
+333610.551389 7403631.814368
+333602.280419 7403637.273433
+333597.786224 7403641.912639
+333585.590048 7403662.269152
+333592.879716 7403577.303705
+333496.176170 7403582.502815
+333488.507175 7403626.375300
+333475.717271 7403686.375023
+333461.946066 7403760.152385
+333454.079162 7403829.020589
+333464.898217 7403873.283007
+333484.136673 7403893.249587
+333523.965967 7403929.193430
+333544.383634 7403961.247939
+333553.751352 7404001.810991
+333555.887126 7404015.478650
+333559.771100 7404042.434033
+333563.432427 7404056.451632
+333566.590733 7404072.278921
+333580.238245 7404082.817116
+333592.154048 7404090.245843
+333607.236404 7404104.853341
+333617.667886 7404114.581675
+333629.311563 7404127.709426
+333635.182880 7404137.507748
+333635.100417 7404155.404682
+333631.876141 7404167.242654
+333626.779970 7404180.260424
+333624.231885 7404186.389375
+333616.958710 7404206.285967
+333607.079725 7404221.293396
+333606.890062 7404240.320137
+333603.649294 7404273.094523
+333599.361254 7404311.207994
+333597.530590 7404337.503490
+333593.357998 7404360.389570
+333578.795154 7404397.883148
+333578.745677 7404397.913143
+333535.560167 7404430.987477
+333524.510218 7404448.624456
+333518.812073 7404471.160596
+333517.360736 7404497.816030
+333518.383269 7404535.099644
+333518.449238 7404561.345148
+333518.276068 7404573.912995
+333517.121595 7404576.492553
+333518.309053 7404573.883000
+333512.759339 7404586.110906
+333505.156315 7404598.878719
+333491.888130 7404614.486046
+333477.407749 7404630.463309
+333470.307744 7404640.001675
+333459.447458 7404646.430574
+333443.647680 7404657.278716
+333427.443837 7404666.997051
+333407.364265 7404671.526275
+333392.587020 7404673.685905
+333338.673164 7404679.114975
+333310.908106 7404680.294773
+333290.828534 7404683.684193
+333278.360233 7404685.353907
+333236.906432 7404700.611293
+333208.044624 7404708.110009
+333201.035328 7404709.949693
+333149.488141 7404759.311238
+333141.612990 7404787.026491
+333145.389764 7404799.144415
+333136.013800 7404859.624056
+333127.916001 7404895.957832
+333120.131560 7404924.772896
+333104.595661 7404961.036685
+333080.656853 7404999.310129
+333061.632799 7405028.335157
+332996.718472 7405116.959976
+332916.029105 7405227.241086
+332897.235945 7405313.646286
+332879.176700 7405392.412794
+332832.964823 7405467.419946
+332836.543688 7405511.762350
+332861.241148 7405568.852571
+332864.284007 7405633.351523
+332854.578194 7405705.229211
+332877.700625 7405756.990345
+332918.849316 7405822.249167
+332887.761026 7405869.301107
+332809.256910 7405952.576843
+332749.026442 7406010.396939
+332738.900071 7406031.033404
+332735.593332 7406050.510068
+332737.283809 7406073.086201
+332744.491015 7406097.032099
+332754.807049 7406115.188989
+332800.598368 7406153.892359
+332830.532185 7406174.618809
+332852.120817 7406197.254932
+332854.396777 7406213.512147
+332846.810245 7406250.155870
+332846.892707 7406261.823871
+332852.467159 7406276.861296
+332875.317464 7406299.007502
+332890.531760 7406310.125598
+332901.400292 7406325.253007
+332913.852100 7406352.558329
+332925.240144 7406382.903132
+332937.403335 7406407.478922
+332956.031570 7406431.534802
+332973.917644 7406448.531890
+332997.782235 7406470.938052
+333031.426856 7406495.783796
+333063.933498 7406512.990849
+333150.518919 7406570.311030
+333186.868304 7406600.255901
+333238.456723 7406725.004533
+333247.956381 7406747.200731
+333259.047561 7406764.087838
+333277.659304 7406783.894446
+333289.962680 7406804.610897
+333307.626106 7406836.815381
+333332.537969 7406873.189150
+333358.340424 7406917.941484
+333364.096293 7406937.538128
+333353.310224 7406969.332682
+333340.140993 7406990.928982
+333337.246566 7407016.244646
+333337.048657 7407047.169349
+333322.840401 7407071.285218
+333301.416694 7407088.972188
+333279.836308 7407100.060289
+333246.158703 7407111.978248
+333225.798759 7407126.125824
+333214.179820 7407145.222553
+333222.137433 7407169.678364
+333228.792141 7407180.166568
+333229.229191 7407201.732874
+333220.067629 7407259.392997
+333225.642081 7407291.437508
+333233.583201 7407300.405972
+333238.869035 7407317.483047
+333238.613401 7407335.729921
+333231.026869 7407354.116772
+333222.483774 7407369.964057
+333209.603162 7407389.800659
+333195.386660 7407407.247671
+333184.707792 7407420.355426
+333171.686994 7407432.333374
+333158.187914 7407442.271671
+333135.296378 7407456.889168
+333126.448172 7407476.015891
+333122.432258 7407492.703033
+333117.839107 7407513.669442
+333112.553274 7407530.576546
+333103.762792 7407546.423831
+333083.105984 7407579.828109
+333078.471602 7407604.353908
+333078.900406 7407626.670086
+333089.892632 7407667.903023
+333104.257566 7407718.824301
+333109.172319 7407744.999817
+333108.322957 7407768.815737
+333104.801817 7407785.252922
+333094.988802 7407801.330168
+333083.971838 7407813.838026
+333077.242914 7407826.405873
+333075.016432 7407840.583444
+333081.118642 7407854.361084
+333088.210401 7407868.658635
+333099.301581 7407886.055655
+333105.073942 7407904.662468
+333107.531319 7407925.988815
+333107.382887 7407953.624081
+333103.193802 7407999.186277
+332938.953626 7408038.109610
+332946.498927 7408125.794590
+332952.411474 7408178.075635
+332929.379752 7408201.131686
+332898.810975 7408211.739869
+332882.805042 7408210.840023
+332866.642429 7408197.042386
+332855.782144 7408187.604003
+332846.933938 7408180.195272
+332827.184216 7408170.666904
+332811.714287 7408166.487620
+332794.941454 7408166.337646
+332770.243993 7408173.706383
+332738.108432 7408190.113573
+332698.064736 7408210.999995
+332672.608622 7408217.358906
+332642.320217 7408224.427695
+332608.980707 7408231.716447
+332579.220060 7408235.255840
+332549.492399 7408234.995885
+332514.223270 7408227.607151
+332483.539046 7408218.748668
+332446.818581 7408199.971884
+332426.046326 7408190.943431
+332390.538057 7408181.535042
+332362.888445 7408174.466253
+332325.516528 7408177.175789
+332293.702570 7408184.734494
+332261.080482 7408198.362160
+332239.162001 7408207.520591
+332218.043404 7408210.370103
+332197.238164 7408205.890870
+332176.004120 7408191.043414
+332155.042202 7408172.656563
+332132.546485 7408155.269541
+332103.915572 7408142.641704
+332089.707317 7408139.982160
+332058.973615 7408138.452422
+332019.820512 7408141.151960
+331972.050098 7408139.972162
+331925.632065 7408127.944222
+331887.897314 7408110.167267
+331853.213668 7408091.670435
+331824.376599 7408073.723509
+331782.848582 7408052.127209
+331740.050645 7408032.030651
+331703.280702 7408020.592610
+331673.091252 7408013.753782
+331636.007953 7408010.904270
+331595.593176 7408012.823941
+331569.642288 7408017.153199
+331540.665034 7408018.412984
+331503.837368 7408016.073384
+331472.345013 7408012.763951
+331444.629432 7408015.563472
+331423.411880 7408033.830343
+331402.491193 7408044.768469
+331385.396757 7408054.736762
+331370.627758 7408059.665917
+331352.304633 7408063.295296
+331324.399389 7408055.976549
+331301.400652 7408039.089442
+331282.211673 7408020.722588
+331189.021020 7407898.183578
+331104.323985 7407868.428675
+331015.198725 7407836.004229
+331030.314065 7407833.464664
+331045.932426 7407833.464664
+331057.774013 7407834.224533
+331069.112581 7407837.523968
+331126.770225 7407861.409877
+331135.082426 7407864.199399
+331142.380340 7407864.449356
+331150.436907 7407862.169747
+331158.006947 7407856.830661
+331169.947489 7407845.912531
+331268.729086 7407758.257546
+331290.919693 7407735.391463
+331306.571038 7407711.755511
+331330.584062 7407693.118704
+331330.311936 7407667.813038
+331339.663162 7407646.466695
+331345.979775 7407626.140176
+331349.278267 7407606.333569
+331352.815900 7407393.929952
+331350.828558 7407376.142999
+331347.068277 7407362.165393
+331342.301956 7407351.497220
+331333.750615 7407338.289483
+331298.778350 7407299.416141
+331285.452442 7407284.928623
+331274.402493 7407256.993408
+331269.149644 7407218.110068
+331265.653242 7407199.823201
+331261.142554 7407180.256552
+331255.122805 7407163.239467
+331245.070650 7407142.403036
+331210.362265 7407097.690695
+331200.796638 7407086.002697
+331194.257377 7407080.673610
+331181.673629 7407072.794959
+331174.367469 7407070.755309
+331160.258168 7407066.945961
+331123.240839 7407056.777703
+331090.758936 7407046.369486
+331084.970082 7407043.569965
+331074.654048 7407037.980923
+331065.591440 7407031.632010
+331032.128236 7406991.228931
+331001.460504 7406943.467112
+330971.312285 7406876.398600
+330967.543758 7406866.740255
+330963.033070 7406854.292387
+330965.061642 7406839.814867
+330965.333768 7406827.616956
+330967.098461 7406817.958611
+330970.899974 7406803.481091
+331000.429726 7406754.699446
+331011.537398 7406737.422406
+331016.336704 7406727.014189
+331022.397684 7406716.845930
+331028.466910 7406701.088629
+331034.536135 7406679.752284
+331092.498891 7406638.689318
+331102.353136 7406599.376052
+331109.387171 7406583.388790
+331110.838508 7406554.503738
+331104.439433 7406524.968797
+331092.383443 7406506.441971
+331069.211535 7406477.496929
+331050.979119 7406454.580854
+331031.666447 7406428.215370
+331011.149825 7406398.860398
+330987.211018 7406358.497312
+330983.846556 7406320.233866
+330982.857008 7406300.067321
+330984.036219 7406268.522724
+330988.654108 7406249.076055
+331002.516022 7406224.980182
+331024.088161 7406189.456267
+331052.397471 7406171.289379
+331087.377981 7406159.841340
+331116.536653 7406155.742042
+331147.361063 7406150.782892
+331165.230645 7406151.762724
+331190.406387 7406148.723245
+331204.993969 7406133.715815
+331212.588748 7406103.351016
+331209.496411 7406069.536809
+331205.686653 7406036.152527
+331211.953788 7406017.065796
+331222.475978 7406007.887369
+331253.580760 7405949.657343
+331261.216770 7405910.524046
+331243.083309 7405875.200097
+331213.504079 7405848.474674
+331181.038669 7405828.428108
+331196.310688 7405779.746447
+331252.442780 7405661.566690
+331300.188456 7405584.699857
+331288.849889 7405477.058295
+331273.346975 7405361.218137
+331260.573564 7405250.847043
+331359.083035 7405196.126416
+331368.203366 7405189.737510
+331381.892109 7405176.049855
+331415.643931 7405155.983292
+331448.472175 7405128.627978
+331466.712837 7405114.030478
+331514.153402 7405076.636883
+331531.478733 7405046.532040
+331559.763304 7404992.721257
+331623.597376 7404951.668289
+331613.858577 7404874.261548
+331623.787039 7404819.110995
+331654.611449 7404750.092817
+331647.313535 7404731.845943
+331644.584033 7404697.181880
+331701.128436 7404621.484847
+331708.426350 7404603.237972
+331704.781516 7404578.612190
+331687.447939 7404555.806097
+331615.392376 7404483.748440
+331588.031383 7404438.146251
+331604.499105 7404415.940055
+331631.810621 7404376.116876
+331660.086946 7404335.983750
+331665.562443 7404318.656718
+331659.171615 7404302.239531
+331583.471217 7404163.593279
+331602.618965 7404094.265155
+331796.809450 7403685.145233
+331857.947004 7403562.876177
+331807.001791 7403550.838239
+331767.898166 7403538.960273
+331709.753993 7403522.123157
+331665.422257 7403518.013861
+331638.391113 7403506.575821
+331590.562976 7403467.072587
+331583.289800 7403464.992943
+331483.493917 7403408.852560
+331475.173470 7403403.653450
+331399.283409 7403374.538437
+331376.400119 7403369.349326
+331343.126579 7403364.150217
+331377.958657 7403299.421304
+331410.712685 7403265.637091
+331460.973461 7403232.442777
+331479.073937 7403196.368956
+331485.712153 7403184.620968
+331522.647020 7403107.174234
+331532.460034 7403055.783037
+331524.485929 7402976.576605
+331498.246423 7402921.656012
+331474.480787 7402871.914532
+331458.730486 7402813.554529
+331466.143848 7402754.274683
+331478.801812 7402691.455443
+331448.752547 7402630.965805
+331429.093533 7402492.159581
+331327.211354 7402452.326404
+331310.537475 7402445.847514
+331261.381694 7402416.782492
+331188.270613 7402388.417351
+331091.006323 7402346.734491
+331090.090991 7402315.249884
+331095.888091 7402291.134015
+331061.377616 7402270.787500
+330962.266170 7402191.131144
+330997.931118 7402164.765660
+331025.250880 7402135.560663
+331089.711665 7402052.364914
+331113.469055 7402011.481917
+331165.346092 7401924.006900
+331193.441000 7401881.944105
+331192.921488 7401863.527260
+331218.723943 7401784.370819
+331227.613380 7401707.873922
+331234.721631 7401641.165348
+331239.166349 7401619.029140
+331257.852308 7401563.778604
+331279.836759 7401534.623598
+331311.592993 7401502.479104
+331338.797308 7401473.794018
+331377.546345 7401436.040484
+331390.558897 7401423.512630
+331558.476892 7401457.046886
+331626.961838 7401471.274449
+331715.023335 7401484.622163
+331754.151699 7401495.290336
+331783.508280 7401512.197439
+331848.043281 7401567.807914
+331877.944114 7401587.154600
+331904.117650 7401602.991887
+331925.302216 7401611.560420
+331951.780863 7401620.538882
+332001.621081 7401630.527171
+332096.526949 7401640.395480
+332210.308440 7401645.144667
+332273.260165 7401648.704057
+332322.193297 7401649.483924
+332390.439102 7401654.613045
+332497.706070 7401666.161067
+332547.999831 7401686.017666
+332584.637834 7401705.004413
+332686.585983 7401761.494737
+332747.360703 7401798.968318
+332769.576049 7401817.455152
+332791.766655 7401840.901136
+332837.417788 7401915.998272
+332850.916868 7401934.405119
+332871.548937 7401962.030387
+332893.351971 7401985.846308
+332919.327597 7402009.322287
+332944.618786 7402024.779639
+332971.080941 7402036.667603
+333019.280159 7402056.344232
+333080.269281 7402069.132042
+333169.303833 7402072.081536
+333242.818979 7402071.341663
+333376.861458 7402093.727829
+333449.147916 7402093.737827
+333512.107887 7402089.308586
+333563.259256 7402105.045890
+333701.466081 7402224.075501
+333742.952868 7402258.219653
+333765.003289 7402271.497378
+333798.136643 7402290.464129
+333867.231810 7402319.499156
+333895.763768 7402354.423174
+333935.106534 7402371.140310
+334022.656765 7402375.569552
+334081.683284 7402366.711069
+334108.318609 7402360.422146
+334132.339879 7402341.135450
+334197.270699 7402308.181095
+334249.403369 7402244.242047
+334277.110704 7402221.205993
+334359.581257 7402151.287969
+334379.256763 7402229.984489
+Region 1
+204
+330950.853387 7387691.874736
+330876.662050 7387602.300079
+330805.068275 7387510.095873
+330727.677401 7387424.140596
+330650.500928 7387338.625244
+330572.837928 7387253.559815
+330555.512597 7387229.943860
+330497.970400 7387158.766052
+330461.398367 7387176.463021
+330438.663509 7387188.420973
+330400.697863 7387206.217924
+330386.456623 7387212.146909
+330329.516400 7387242.991625
+330296.300583 7387258.418983
+330273.763635 7387267.907357
+330213.376488 7387275.576044
+330169.918852 7387293.382994
+330042.836192 7387321.478181
+329998.760089 7387334.725912
+329956.506403 7387349.743340
+329924.271887 7387362.961076
+329829.761838 7387433.409008
+329740.587100 7387502.307207
+329652.805975 7387578.354181
+329605.571565 7387620.936887
+329557.446563 7387656.030875
+329464.725946 7387678.197079
+329432.969712 7387693.814403
+329406.383864 7387707.422073
+329328.267321 7387745.315582
+329274.023616 7387773.140816
+329225.700704 7387805.805220
+329174.508105 7387845.418435
+329136.212609 7387890.930639
+329066.350543 7387999.981960
+329034.149013 7388047.893753
+329006.243768 7388077.138743
+328983.261523 7388096.585412
+328960.468942 7388116.581987
+328986.312629 7388192.758939
+329012.906723 7388275.254808
+329055.539735 7388390.215116
+329088.912230 7388478.939919
+329097.075999 7388502.625861
+329111.119330 7388543.218908
+329130.357786 7388609.337583
+329134.142806 7388619.945765
+329163.746774 7388720.938466
+329173.427848 7388746.374109
+329198.026354 7388826.670355
+329207.212655 7388865.033784
+329216.481419 7388942.070588
+329224.603956 7389003.320097
+329228.430207 7389063.709753
+329229.452739 7389149.984975
+329226.682006 7389231.930938
+329226.640775 7389247.018354
+329223.804071 7389267.674815
+329224.958544 7389292.110630
+329226.236709 7389313.546958
+329234.128352 7389362.398590
+329238.474116 7389374.726478
+329255.345904 7389427.987355
+329279.738254 7389518.331880
+329304.221313 7389600.217854
+329308.962895 7389631.062570
+329315.873237 7389695.391551
+329321.340487 7389748.372476
+329328.992989 7389856.913884
+329330.823653 7389873.611024
+329337.321682 7389930.331308
+329343.951652 7389978.463064
+329344.891722 7389999.999375
+329353.459556 7390068.967561
+329357.467224 7390103.261687
+329360.493591 7390113.799882
+329365.482560 7390131.796799
+329372.277454 7390162.451548
+329404.033688 7390283.320844
+329424.756466 7390370.725873
+329436.779470 7390407.749531
+329446.889349 7390442.423592
+329460.850218 7390496.864266
+329462.548941 7390502.603283
+329468.123393 7390520.980136
+329474.662654 7390546.525760
+329493.447567 7390599.246729
+329511.952109 7390647.118529
+329532.287314 7390699.719519
+329583.422190 7390823.248360
+329684.768365 7390895.316015
+329742.887798 7390927.450511
+329789.462509 7390960.114916
+329836.202144 7390988.010137
+329893.736095 7391025.903647
+330043.256749 7391125.106654
+330125.809764 7391177.297714
+330205.006564 7391226.889220
+330282.422177 7391276.850662
+330364.488664 7391331.081372
+330388.782060 7391339.559920
+330454.281870 7391387.281746
+330490.524053 7391405.308658
+330537.601784 7391447.391450
+330564.690652 7391470.517488
+330605.517740 7391515.519780
+330653.477817 7391561.041982
+330672.823474 7391582.798256
+330735.577290 7391647.837115
+330804.053989 7391714.025778
+330840.279680 7391748.169929
+330879.259612 7391793.582150
+330950.474060 7391859.860797
+330984.069204 7391894.364887
+331016.509875 7391928.729001
+331075.998183 7391991.998163
+331142.306124 7392053.467634
+331175.521941 7392089.601445
+331228.330802 7392143.752169
+331268.399237 7392184.845130
+331356.386518 7392080.083075
+331372.780024 7392078.383366
+331457.023516 7392028.971830
+331476.921671 7392021.553101
+331503.029237 7392006.015762
+331513.609151 7392000.046785
+331547.410451 7391976.780770
+331571.753323 7391955.614396
+331580.213956 7391937.117564
+331567.753902 7391862.920273
+331566.418012 7391788.333049
+331562.459821 7391723.314187
+331560.373525 7391612.173224
+331552.712777 7391549.134022
+331529.359452 7391440.092700
+331530.579894 7391396.140229
+331532.938316 7391370.984537
+331538.380828 7391348.338417
+331546.602320 7391322.142904
+331564.241007 7391298.396971
+331618.971240 7391230.768555
+331663.690549 7391190.525448
+331671.474991 7391181.546986
+331706.711134 7391153.281828
+331723.253073 7391033.212395
+331796.190983 7390927.970422
+331796.182737 7390927.970422
+331839.458955 7390873.599735
+331877.581279 7390814.959779
+331878.562581 7390809.360739
+331879.543882 7390803.001828
+331883.601028 7390765.178307
+331883.601028 7390765.138313
+331888.837384 7390642.429332
+331872.179998 7390625.002317
+331824.459062 7390497.804105
+331824.607494 7390483.056631
+331847.127950 7390357.198190
+331728.703831 7390216.982208
+331712.623682 7390192.006486
+331686.120296 7390140.935234
+331683.753628 7390117.869185
+331690.259904 7390088.884150
+331696.757934 7390068.057717
+331725.850636 7390000.039368
+331798.821531 7389936.790202
+331619.870079 7389999.569448
+331573.757157 7390028.264533
+331581.788986 7390000.029370
+331590.562976 7389974.213792
+331596.401307 7389945.818655
+331600.343005 7389909.554867
+331608.127447 7389827.828866
+331608.127447 7389775.287866
+331601.621171 7389634.431993
+331591.973081 7389489.226866
+331578.226614 7389343.421841
+331578.127660 7389255.396918
+331576.395951 7389246.048520
+331565.123354 7389145.125807
+331560.076661 7389059.460481
+331547.740300 7388943.680313
+331545.851913 7388925.883361
+331541.926707 7388871.402693
+331540.986637 7388852.895863
+331538.438552 7388785.307441
+331532.732160 7388713.909670
+331520.626693 7388586.401511
+331521.179191 7388538.669687
+331517.476633 7388496.326940
+331513.642136 7388457.623570
+331510.797186 7388430.008300
+331498.073253 7388382.796387
+331463.323637 7388306.159514
+331455.530949 7388292.701819
+331443.376005 7388275.174822
+331405.228942 7388230.022556
+331323.137716 7388135.448755
+331245.985982 7388045.284200
+331219.391888 7388014.299507
+331175.282800 7387955.529574
+331101.470790 7387869.504309
+331026.273412 7387779.479730
+330950.853387 7387691.874736
+Region 1
+153
+337781.107277 7391268.692059
+337798.399623 7391265.962527
+337819.782099 7391265.722568
+337833.281178 7391265.822551
+337862.093508 7391269.311953
+337869.498623 7391271.001664
+337886.353919 7391275.130956
+337913.698420 7391284.479355
+337933.167770 7391295.177523
+337948.546990 7391305.165812
+337968.321451 7391320.183239
+337985.556073 7391335.990532
+338007.746680 7391362.915920
+338038.653553 7391418.696365
+338082.746148 7391495.333238
+338162.973726 7391634.719362
+338198.754121 7391692.359489
+338219.509883 7391732.442623
+338230.172259 7391750.289566
+338242.368434 7391771.745891
+338248.858218 7391782.853988
+338255.611881 7391794.961914
+338265.573327 7391813.228785
+338268.179136 7391826.566500
+338272.632101 7391838.464462
+338280.061955 7391857.291238
+338284.696336 7391876.407963
+338288.835944 7391901.013748
+338289.132808 7391927.169268
+338289.561612 7391943.666442
+338286.287859 7391970.381866
+338283.080075 7392002.116430
+338318.233756 7392011.954745
+338393.637289 7392050.198194
+338450.701205 7392073.724165
+338487.108314 7392093.220825
+338586.755765 7392144.961962
+338636.868109 7392167.808049
+338611.337778 7392195.423319
+338590.631493 7392219.939119
+338588.446242 7392233.416811
+338591.406639 7392251.953635
+338608.542306 7392270.010542
+338625.686220 7392297.625812
+338645.774038 7392319.961986
+338647.472761 7392340.268508
+338651.101103 7392378.112026
+338650.721776 7392394.879154
+338648.429324 7392425.653882
+338642.970319 7392475.225391
+338640.636636 7392502.430731
+338638.302953 7392527.856376
+338630.328848 7392550.272536
+338614.157989 7392569.429255
+338596.461578 7392587.576146
+338571.887811 7392607.052810
+338549.342616 7392625.749608
+338527.531336 7392640.367104
+338509.002056 7392650.145429
+338454.939768 7392650.485371
+338366.498944 7392656.654314
+338266.851493 7392663.903072
+338213.061331 7392665.772752
+338185.807538 7392671.281808
+338172.918680 7392684.829488
+338059.780395 7392788.461736
+338033.169809 7392808.448313
+337956.562326 7392880.925898
+337952.950477 7392884.175342
+337924.591690 7392908.251218
+337872.277603 7392965.751368
+337794.969191 7393053.906268
+337870.941714 7393206.140192
+337913.327339 7393305.983090
+337963.357220 7393405.266083
+338013.337624 7393505.148974
+338032.147277 7393552.460870
+338055.014074 7393603.382148
+338068.744048 7393629.967594
+338096.740001 7393684.928180
+338118.048261 7393733.839802
+338133.946994 7393769.363717
+338145.565933 7393793.629560
+338164.425062 7393824.564261
+338173.025881 7393846.050581
+338195.068055 7393889.113205
+338228.861109 7393967.659750
+338244.372268 7393992.205546
+338255.941730 7394018.121107
+338291.515969 7394089.498881
+338299.762200 7394106.375990
+338341.290217 7394195.380744
+338375.371889 7394264.068978
+338333.967564 7394304.512051
+338279.212593 7394351.314034
+338217.926607 7394405.674722
+338169.257353 7394451.756829
+338115.640362 7394499.328680
+338061.644044 7394546.900532
+338025.616262 7394580.524772
+337995.360842 7394607.700117
+337958.211573 7394639.784622
+337904.611073 7394684.296997
+337848.759353 7394747.916100
+337815.568275 7394785.729623
+337759.139318 7394852.738145
+337698.108965 7394922.766149
+337663.573752 7394962.509342
+337605.990323 7395029.127931
+337506.590259 7395143.058415
+337475.097904 7395180.921930
+337376.464739 7395297.102029
+337327.836717 7395353.772322
+337262.378138 7395428.069596
+337206.922237 7395491.548722
+337132.285603 7395575.474346
+336984.925462 7395475.271510
+336808.687020 7395371.189339
+336685.513073 7395293.952569
+336572.729377 7395262.567944
+336276.516526 7395188.630609
+336216.475720 7395186.211024
+336182.369310 7395177.112582
+335857.632747 7395110.094062
+335656.894755 7395017.779874
+335587.263583 7395004.422162
+335344.659478 7394957.800148
+335168.849840 7394911.948002
+335228.503073 7394820.743625
+335289.929245 7394724.460117
+335280.042014 7394715.811599
+335500.150403 7394362.392136
+335608.637813 7394186.182320
+336313.838965 7392782.352783
+336383.791740 7392813.077520
+336673.597270 7392212.990309
+336820.619316 7391918.950676
+336900.426336 7391738.321616
+336999.084240 7391512.680266
+337127.222418 7391202.363421
+337197.422579 7391194.214817
+337243.238637 7391190.465459
+337454.812176 7391172.668507
+337651.880596 7391163.470083
+337661.050405 7391163.620057
+337663.417073 7391164.229953
+337670.500585 7391166.049641
+337755.280083 7391164.089977
+337722.056019 7391295.257509
+337734.969616 7391287.748795
+337757.003545 7391275.820838
+337767.138162 7391272.401424
+337781.107277 7391268.692059
+Region 1
+188
+324062.075998 7390490.355381
+324117.342236 7390513.591401
+324227.858219 7390559.063612
+324334.053177 7390604.775782
+324379.390953 7390628.291754
+324440.998542 7390650.747907
+324472.581606 7390663.375744
+324555.043912 7390684.282163
+324604.001784 7390689.501269
+324674.630749 7390703.828815
+324730.647394 7390727.324791
+324759.443231 7390743.262061
+324826.740720 7390794.393302
+324856.270472 7390805.751357
+324934.692125 7390836.296125
+324976.459283 7390855.002920
+325023.569999 7390879.608706
+325052.877103 7390894.176210
+325078.588850 7390903.014696
+325162.387046 7390943.447771
+325182.771728 7390957.115429
+325256.682693 7391003.107551
+325320.937322 7391062.417392
+325437.811149 7391267.512261
+325452.110113 7391284.489353
+325473.632775 7391300.336639
+325530.078224 7391341.749545
+325622.386530 7391411.807545
+325673.076110 7391447.831374
+325707.380429 7391507.831097
+325768.270596 7391657.715423
+325833.217909 7391818.697848
+325857.791676 7391863.610155
+325910.518075 7391963.663017
+325976.306503 7391999.996793
+326040.256022 7392044.599153
+326071.138155 7392074.154091
+326121.621579 7392074.324062
+326211.192137 7392088.081705
+326277.293922 7392098.559910
+326316.323331 7392102.299270
+326424.423169 7392114.857119
+326651.664547 7391907.422650
+326759.541736 7391794.821938
+326860.442614 7391683.840948
+327092.664715 7391254.324520
+327328.061615 7390841.665205
+327345.634333 7390811.380393
+327372.566522 7390717.226520
+327377.555492 7390662.395912
+327395.078732 7390570.111720
+327403.588842 7390517.900663
+327406.870842 7390496.824273
+327404.850515 7390434.334977
+327394.386049 7390396.111524
+327376.128894 7390317.035069
+327326.197967 7390145.214501
+327270.643111 7389992.270699
+327244.354128 7389902.246119
+327212.903004 7389782.366653
+327186.704730 7389699.290883
+327144.277873 7389577.651719
+327122.384131 7389496.095689
+327107.623378 7389441.205091
+327007.431675 7389127.458833
+326938.171584 7388890.539415
+326844.172801 7388598.099508
+326817.735386 7388511.764296
+326765.190404 7388338.873911
+326728.527663 7388202.547262
+326705.322769 7388085.307344
+326682.670374 7387922.005316
+326633.341422 7387701.123151
+326617.929217 7387624.406292
+326584.243365 7387461.304230
+326538.542755 7387161.385604
+326512.962947 7387026.518705
+326481.528316 7387032.777633
+326401.952190 7387046.335311
+326390.176573 7387049.974687
+326310.542723 7387062.332571
+326235.411316 7387071.391019
+326155.010567 7387087.268299
+326117.036675 7387087.368282
+326041.146614 7387092.547395
+325963.376413 7387100.136095
+325835.089803 7387112.014061
+325757.336094 7387115.973382
+325703.752088 7387125.411766
+325629.651459 7387134.710173
+325534.992977 7387147.537976
+325409.666764 7387155.786563
+325319.403523 7387180.682298
+325286.888636 7387223.424977
+325252.526593 7387271.306775
+325210.190445 7387338.915194
+325195.693571 7387356.132245
+325181.609009 7387381.217948
+325173.123638 7387399.614797
+325165.965910 7387417.691701
+325155.691106 7387457.444891
+325144.253584 7387500.617496
+325108.811285 7387483.740387
+325082.208945 7387475.031879
+325064.108469 7387473.022223
+325042.602299 7387479.691081
+325033.292305 7387486.429926
+324986.643378 7387526.703028
+324898.639605 7387604.879637
+324813.150931 7387695.954037
+324783.736627 7387717.190399
+324767.631738 7387727.578620
+324742.381780 7387739.126642
+324708.992792 7387750.804641
+324678.069427 7387757.873431
+324644.779394 7387760.163038
+324616.519562 7387759.333181
+324583.922212 7387757.043573
+324557.542520 7387746.535373
+324516.740171 7387725.878911
+324455.041873 7387687.525481
+324410.850323 7387676.807317
+324362.684090 7387672.218103
+324319.729474 7387674.917640
+324226.992365 7387682.176397
+324142.649918 7387689.815088
+323934.168714 7387709.631694
+323727.130602 7387729.138353
+323789.076286 7387832.960569
+323851.747639 7387938.522487
+323889.441159 7388000.001956
+323911.887399 7388042.034756
+323924.570102 7388067.140456
+323946.406121 7388106.273753
+323967.640165 7388153.025745
+323975.070018 7388183.310557
+323979.580707 7388206.286622
+323984.577922 7388256.897952
+323989.204058 7388297.161056
+323999.957142 7388360.750163
+324000.781766 7388368.738795
+324002.620675 7388431.478048
+324007.741584 7388477.370187
+324009.481539 7388510.394531
+324009.110458 7388541.409218
+324004.137981 7388572.803840
+324002.299072 7388589.840922
+323999.998374 7388600.319127
+323992.906615 7388612.277079
+323989.979203 7388620.055747
+323987.126008 7388654.889780
+323986.763173 7388677.915836
+323988.808239 7388705.261152
+324010.891644 7388749.303608
+324026.081201 7388763.101244
+324034.360417 7388773.669434
+324099.217021 7388830.589684
+324228.369485 7388940.110924
+324317.453515 7389019.857264
+324419.129539 7389110.401755
+324497.691378 7389175.600587
+324544.043441 7389206.235339
+324506.333428 7389206.895226
+324496.660599 7389224.092281
+324498.103690 7389238.299847
+324502.630870 7389253.997158
+324522.792904 7389258.336415
+324489.370931 7389478.298737
+324470.833405 7389604.827064
+324468.268827 7389624.423708
+324458.191933 7389653.008811
+324440.907834 7389675.584944
+324430.377397 7389688.912661
+324419.343941 7389702.010418
+324405.778891 7389717.417778
+324388.478299 7389754.021509
+324383.489330 7389767.489202
+324366.510341 7389831.678207
+324359.723693 7389871.741344
+324326.977911 7389999.999375
+324327.299514 7390003.518772
+324321.518907 7390025.105074
+324313.487078 7390058.119419
+324307.203450 7390079.445766
+324291.791245 7390110.190500
+324257.124091 7390165.591010
+324170.340760 7390305.107113
+324062.075998 7390490.355381
+Region 1
+65
+336038.802435 7397323.244969
+336046.026133 7397286.361287
+336088.180864 7397241.199023
+336000.003920 7397141.376122
+335983.371272 7397124.139074
+335961.964058 7397100.653097
+335895.689102 7397028.375478
+335841.511366 7396969.895495
+335788.347918 7396911.155556
+335708.483174 7396822.300776
+335608.951170 7396714.019324
+335504.867247 7396602.918355
+335403.067529 7396491.327469
+335317.249007 7396569.614059
+335272.397758 7396520.072545
+335176.411634 7396413.840742
+335107.877211 7396336.993905
+335045.651154 7396268.285674
+334979.969927 7396274.794559
+334874.756270 7396281.063485
+334756.373383 7396289.032120
+334605.500347 7396302.929740
+334507.873223 7396312.538094
+334411.252138 7396323.436227
+334306.178667 7396351.301454
+334205.417975 7396378.426808
+334184.876614 7396381.876217
+334113.934292 7396408.831600
+334118.865538 7396494.736885
+334104.838700 7396536.829675
+334057.480597 7396642.061650
+334029.426921 7396691.163239
+334056.185939 7396718.558546
+334073.725672 7396874.941759
+334074.154476 7396897.007980
+334077.147857 7397051.241561
+334079.011505 7397178.539756
+334080.767953 7397276.622955
+334080.743214 7397329.973817
+334082.491415 7397382.074892
+334084.058199 7397468.200140
+334085.303379 7397567.043209
+334088.750304 7397633.881760
+334091.413836 7397801.832991
+334095.207102 7397991.890436
+334098.390147 7398060.788635
+334304.290280 7398055.099609
+334441.524051 7398082.554906
+334606.209523 7398132.456359
+334733.465354 7398142.434649
+334783.082924 7398135.865775
+334848.244639 7398117.488922
+334992.965987 7398055.099609
+335127.709395 7397964.025209
+335354.777603 7397761.919828
+335499.498950 7397689.552224
+335611.779627 7397659.617352
+335763.988552 7397654.628206
+335901.040906 7397676.464466
+335944.655219 7397680.753731
+335969.196002 7397597.128055
+335989.118895 7397520.771135
+336000.003920 7397482.547682
+336009.132497 7397449.823287
+336038.802435 7397323.244969
+Region 1
+763
+348625.263412 7390704.878635
+348657.308264 7390703.318903
+348670.098168 7390690.301132
+348686.433951 7390682.262509
+348708.443140 7390667.345065
+348721.703079 7390653.607418
+348756.188816 7390604.435840
+348788.629487 7390555.384242
+348828.598967 7390503.513127
+348834.123942 7390491.945109
+348840.358092 7390481.266938
+348852.216172 7390467.849236
+348858.639985 7390460.410511
+348875.470542 7390441.533744
+348889.505627 7390427.176203
+348896.094365 7390421.707140
+348902.452209 7390418.667661
+348912.792982 7390415.118269
+348928.765931 7390410.079132
+348949.727849 7390406.639721
+348964.744235 7390405.359940
+348995.436705 7390408.219450
+349006.931951 7390411.668860
+349014.460760 7390414.508373
+349022.072030 7390418.357714
+349029.609085 7390420.207397
+349033.789924 7390420.247390
+349040.634296 7390419.877453
+349048.212582 7390417.407876
+349054.595164 7390412.378738
+349065.925485 7390402.420444
+349081.098549 7390386.073244
+349085.122710 7390381.683996
+349088.709820 7390380.284235
+349091.257906 7390380.314230
+349094.003900 7390381.444037
+349097.055006 7390382.473860
+349101.532709 7390383.963605
+349104.072548 7390385.093412
+349106.694849 7390387.662972
+349113.671161 7390394.271839
+349117.109839 7390397.081358
+349120.367100 7390398.551106
+349125.570471 7390398.161173
+349132.629245 7390397.241331
+349142.953526 7390395.571617
+349154.729143 7390391.932240
+349162.703248 7390390.572473
+349170.454705 7390390.872422
+349182.890021 7390392.442153
+349190.657970 7390391.852254
+349193.939970 7390390.012569
+349196.009774 7390387.263040
+349196.760181 7390383.503684
+349197.848683 7390377.204763
+349197.230216 7390367.896357
+349195.432537 7390354.358676
+349197.551819 7390336.661708
+349200.380276 7390329.382954
+349205.855773 7390323.134025
+349212.230109 7390318.544811
+349221.457641 7390314.765458
+349234.165083 7390310.136251
+349256.776247 7390304.607198
+349273.458372 7390300.347928
+349285.613316 7390298.818190
+349294.799617 7390299.348099
+349302.336671 7390300.427914
+349310.690103 7390302.067633
+349317.320073 7390302.907489
+349322.424489 7390302.187613
+349328.370022 7390299.918001
+349335.915323 7390290.699580
+349344.326478 7390276.831956
+349350.535890 7390268.693350
+349353.512779 7390266.623704
+349359.862376 7390265.023978
+349365.073994 7390263.974158
+349369.799084 7390260.924681
+349373.460411 7390252.656097
+349378.886431 7390241.188061
+349383.463089 7390232.599532
+349390.348691 7390227.800355
+349398.339289 7390225.330778
+349406.082499 7390226.410593
+349414.741041 7390228.270274
+349426.863000 7390230.499892
+349438.894251 7390231.839663
+349448.666034 7390234.269246
+349451.477999 7390238.508520
+349452.558255 7390242.727798
+349452.112959 7390246.377173
+349450.851285 7390250.346493
+349449.185547 7390253.106020
+349443.949190 7390256.365462
+349431.233503 7390262.104479
+349425.164277 7390266.253768
+349422.451267 7390272.432709
+349421.684368 7390277.851781
+349423.729433 7390287.390147
+349428.339076 7390295.638734
+349435.092739 7390303.567376
+349441.384613 7390307.176758
+349447.181713 7390308.896464
+349452.591240 7390308.956453
+349460.878702 7390307.376724
+349474.913786 7390302.207609
+349486.112168 7390294.568918
+349499.578262 7390285.400488
+349509.457247 7390277.751798
+349514.940990 7390270.393059
+349518.297206 7390262.004496
+349519.789774 7390255.495611
+349518.445638 7390247.396998
+349515.963523 7390240.278217
+349511.757945 7390232.819495
+349507.873970 7390223.031171
+349506.628790 7390215.712425
+349506.735991 7390204.964266
+349508.459453 7390196.345742
+349510.372578 7390188.947010
+349510.636458 7390182.858053
+349509.968513 7390178.868736
+349506.735991 7390175.179368
+349502.579890 7390172.809774
+349495.380931 7390168.300546
+349485.543178 7390161.891644
+349482.327148 7390157.202447
+349482.360133 7390153.443091
+349483.316695 7390149.903698
+349486.227615 7390145.284489
+349490.639348 7390142.564955
+349495.859212 7390141.505136
+349500.749227 7390142.444975
+349504.996036 7390146.474285
+349510.553995 7390151.623403
+349515.386286 7390158.212274
+349518.923919 7390161.571699
+349522.585246 7390162.491541
+349525.240532 7390162.521536
+349529.437864 7390161.121776
+349534.665974 7390158.852165
+349551.125450 7390146.174336
+349562.529987 7390139.095549
+349568.896077 7390135.726126
+349571.056590 7390133.316539
+349571.089574 7390130.766975
+349568.962047 7390128.857303
+349565.407922 7390126.827650
+349560.542646 7390123.898152
+349555.693862 7390119.418919
+349550.375043 7390110.510445
+349549.731837 7390103.301680
+349550.713139 7390097.442684
+349553.607566 7390093.483362
+349556.691656 7390091.193754
+349563.049500 7390088.714179
+349571.732780 7390088.134278
+349582.032323 7390088.684184
+349597.188894 7390093.493360
+349616.204702 7390100.442170
+349624.854998 7390103.191699
+349637.282068 7390105.091373
+349648.496942 7390106.201183
+349659.299504 7390107.640937
+349670.497885 7390110.860385
+349681.267462 7390115.619570
+349695.863290 7390125.517875
+349701.924270 7390131.666821
+349703.309637 7390135.676135
+349706.303018 7390142.674936
+349709.106737 7390147.364133
+349712.347505 7390150.493596
+349719.760867 7390153.343108
+349738.075745 7390158.842166
+349753.042654 7390162.541533
+349758.856246 7390163.481372
+349766.805613 7390164.561187
+349776.198069 7390164.221245
+349785.598772 7390163.101437
+349797.168234 7390159.672024
+349825.147694 7390148.333966
+349834.870000 7390145.884386
+349841.392769 7390146.614261
+349848.402065 7390149.783718
+349851.816004 7390154.922838
+349853.869316 7390163.581355
+349854.339351 7390167.790634
+349855.955612 7390169.690308
+349861.571295 7390169.190394
+349867.714737 7390167.710647
+349877.321596 7390166.360879
+349896.650760 7390162.351565
+349910.702337 7390155.962660
+349924.465296 7390147.244153
+349952.411772 7390139.335508
+349984.613303 7390133.686475
+350008.634573 7390130.836963
+350036.292430 7390130.457029
+350065.170730 7390131.196902
+350075.503257 7390129.197244
+350084.928699 7390125.637854
+350091.682361 7390123.608202
+350099.483296 7390119.698871
+350106.863672 7390116.449428
+350125.368214 7390112.990021
+350136.426409 7390110.000533
+350142.380187 7390106.071206
+350151.846860 7390098.752459
+350162.657669 7390089.564033
+350171.909939 7390082.895175
+350182.052803 7390079.455765
+350193.061521 7390081.015497
+350202.198345 7390085.534723
+350208.861299 7390092.363554
+350216.332384 7390101.072062
+350220.455499 7390106.651106
+350225.815549 7390111.140337
+350235.875951 7390115.669562
+350244.534493 7390117.419262
+350252.698261 7390117.499248
+350260.268301 7390115.479594
+350268.976320 7390112.580091
+350279.853099 7390107.041040
+350289.509435 7390100.822105
+350306.241037 7390091.473706
+350325.669156 7390077.946023
+350332.975316 7390071.927054
+350337.535482 7390065.218203
+350338.541522 7390057.029606
+350340.083567 7390045.861519
+350341.807029 7390037.242995
+350343.299597 7390031.164037
+350344.017019 7390020.765818
+350345.550818 7390010.037655
+350347.043386 7390003.958697
+350352.568360 7389993.270527
+350358.027365 7389987.791466
+350364.607857 7389983.212250
+350367.502284 7389979.912815
+350368.467093 7389975.493572
+350367.988812 7389971.724218
+350364.137822 7389959.396330
+350359.247807 7389938.299943
+350356.444089 7389913.354216
+350354.596933 7389884.659132
+350355.281370 7389867.832014
+350357.441883 7389855.784078
+350360.196124 7389846.175723
+350365.185093 7389836.927308
+350370.470927 7389829.118645
+350377.241083 7389826.079166
+350390.938072 7389824.339464
+350406.127628 7389825.489267
+350421.102783 7389828.858690
+350430.651918 7389832.498066
+350436.729390 7389836.987297
+350443.887119 7389845.705804
+350446.913485 7389849.715117
+350448.109189 7389852.274679
+350451.358204 7389853.644444
+350458.590148 7389855.594110
+350469.384464 7389857.373805
+350477.325584 7389859.553432
+350486.149051 7389865.182468
+350496.893889 7389872.601197
+350503.655798 7389879.649990
+350510.805280 7389889.468308
+350515.225260 7389895.827219
+350519.158712 7389900.516415
+350521.492395 7389901.976165
+350524.559993 7389901.786198
+350525.483571 7389901.136309
+350527.635837 7389899.936515
+350532.781485 7389896.227150
+350536.780907 7389893.717580
+350539.658841 7389892.087859
+350542.215173 7389891.887893
+350547.113434 7389891.937885
+350553.025981 7389892.007873
+350555.788469 7389891.367982
+350557.239805 7389889.498303
+350557.792303 7389885.738947
+350557.833534 7389881.089743
+350557.874765 7389877.100426
+350558.839574 7389873.011127
+350560.694976 7389871.371408
+350563.762574 7389870.411572
+350568.446433 7389871.891319
+350577.096728 7389874.310904
+350584.592552 7389879.809962
+350589.936110 7389886.068890
+350594.809632 7389888.778426
+350599.674908 7389891.597943
+350606.296631 7389892.767743
+350613.330666 7389893.837559
+350619.333922 7389895.787225
+350625.436133 7389897.396950
+350632.247519 7389900.566407
+350646.241372 7389908.794997
+350657.604678 7389915.773802
+350672.332446 7389922.902581
+350679.135587 7389925.962057
+350691.537917 7389931.181163
+350701.804475 7389934.830538
+350716.062207 7389937.750038
+350729.157222 7389944.858820
+350736.158271 7389949.138087
+350742.219251 7389954.847109
+350746.185688 7389956.766780
+350754.794753 7389962.945722
+350760.369205 7389966.665085
+350769.423566 7389969.524595
+350778.395465 7389970.384448
+350785.858304 7389969.464605
+350797.617428 7389967.045020
+350813.202804 7389960.446150
+350836.811763 7389947.178423
+350844.109677 7389941.939320
+350851.217928 7389935.690390
+350855.951264 7389931.311140
+350859.991917 7389925.932062
+350860.931987 7389923.832422
+350861.253590 7389922.282687
+350859.645575 7389919.613144
+350855.695631 7389916.803625
+350848.364732 7389914.843961
+350825.217562 7389913.284228
+350809.203383 7389911.894466
+350797.287579 7389909.454884
+350791.696635 7389907.285256
+350789.923695 7389900.956340
+350791.102906 7389895.657248
+350792.991293 7389890.248174
+350797.139147 7389883.759286
+350800.190252 7389875.480704
+350801.715805 7389865.422427
+350802.350765 7389853.794418
+350803.340313 7389846.275706
+350805.039036 7389840.316727
+350808.337528 7389836.807328
+350812.633814 7389835.627530
+350818.051588 7389835.247595
+350826.908040 7389836.997296
+350833.199914 7389841.046602
+350841.833717 7389844.565999
+350849.379018 7389845.635816
+350855.192611 7389845.695806
+350862.259630 7389843.226229
+350871.899474 7389838.896970
+350880.945589 7389832.448075
+350888.062086 7389824.999351
+350892.836654 7389817.840577
+350894.222020 7389811.991579
+350894.065342 7389807.112415
+350891.335840 7389795.014487
+350889.035141 7389789.785383
+350889.101111 7389783.256501
+350890.585433 7389777.957409
+350891.550242 7389773.538166
+350894.642578 7389770.468691
+350898.229689 7389769.168914
+350905.379171 7389768.908958
+350917.517622 7389769.038936
+350926.002993 7389767.909130
+350931.429013 7389766.519368
+350936.558169 7389764.029794
+350939.155731 7389759.400587
+350939.724721 7389753.091668
+350936.995219 7389740.773778
+350936.657123 7389734.014936
+350934.579073 7389727.456059
+350932.764903 7389725.116460
+350929.004621 7389724.076638
+350925.236094 7389723.376758
+350919.834813 7389722.546900
+350916.800200 7389719.747379
+350915.051999 7389711.088863
+350916.396135 7389699.260889
+350918.111351 7389690.852329
+350922.927149 7389679.274312
+350926.992541 7389670.685783
+350930.291033 7389667.616309
+350933.779189 7389665.876607
+350945.546560 7389662.677155
+350951.178736 7389661.067431
+350957.149007 7389656.038292
+350963.267710 7389646.799875
+350969.336935 7389632.132387
+350973.633222 7389621.214257
+350975.348438 7389612.595734
+350975.719518 7389606.286814
+350973.163186 7389596.958412
+350970.689317 7389589.069763
+350971.703604 7389579.881337
+350971.761327 7389574.122324
+350974.482583 7389568.063362
+350979.850880 7389561.584471
+350981.821729 7389559.054905
+350984.427538 7389553.435867
+350989.705125 7389546.067129
+350996.780391 7389542.597724
+351004.243230 7389541.567900
+351014.757174 7389541.447921
+351025.584475 7389540.568071
+351034.482158 7389538.778378
+351046.554639 7389535.688907
+351065.809588 7389528.910068
+351075.416446 7389528.010222
+351082.623652 7389532.069527
+351087.563144 7389537.768551
+351090.581265 7389542.007825
+351098.200782 7389545.517223
+351106.133656 7389547.916812
+351112.738886 7389551.316230
+351118.519494 7389555.025595
+351122.964212 7389559.274867
+351124.547489 7389564.274011
+351125.001031 7389569.373137
+351122.725072 7389582.200940
+351121.702539 7389586.310236
+351119.756429 7389593.578991
+351118.783373 7389599.108044
+351118.907067 7389606.416792
+351121.479891 7389614.525403
+351125.767931 7389624.203745
+351133.041106 7389632.142385
+351140.198834 7389640.191007
+351156.188276 7389653.858666
+351174.395953 7389670.105883
+351193.890042 7389689.462567
+351208.024082 7389704.559981
+351219.626528 7389717.737724
+351248.999602 7389750.492113
+351262.919239 7389766.249414
+351273.837248 7389776.767612
+351292.234589 7389793.784698
+351310.326819 7389811.691630
+351317.459808 7389822.729739
+351332.088622 7389838.936963
+351348.069817 7389853.604451
+351358.798163 7389862.572915
+351367.176333 7389871.071459
+351380.395041 7389886.158875
+351386.357065 7389891.977878
+351395.287733 7389896.717066
+351401.563115 7389902.546068
+351407.846743 7389906.485393
+351413.198546 7389912.294398
+351418.063822 7389915.673819
+351427.225385 7389918.083406
+351440.773942 7389920.113059
+351456.870584 7389923.042557
+351467.161880 7389925.032216
+351473.791849 7389925.092206
+351481.559798 7389923.732439
+351491.389305 7389921.062896
+351511.642048 7389916.623656
+351521.257153 7389914.614001
+351529.008609 7389914.913949
+351534.294443 7389916.853617
+351542.515935 7389921.802769
+351565.242547 7389944.848822
+351572.928034 7389952.237556
+351584.522234 7389965.865222
+351598.491349 7389977.413244
+351611.470916 7389985.961779
+351617.053614 7389988.571332
+351622.446649 7389990.281039
+351627.138754 7389990.331031
+351634.708794 7389988.751301
+351651.382672 7389984.931956
+351665.698129 7389982.532367
+351679.263178 7389983.332230
+351687.212544 7389984.412045
+351693.314755 7389986.571675
+351700.835317 7389989.861111
+351705.906749 7389992.790610
+351709.650538 7389995.600128
+351713.113955 7389996.519971
+351718.836839 7389996.140036
+351723.941256 7389995.750103
+351726.299678 7389994.330346
+351728.880748 7389992.030740
+351732.500843 7389986.971606
+351738.916411 7389978.403074
+351745.472164 7389975.693538
+351753.454515 7389973.893846
+351759.383555 7389973.183968
+351764.487972 7389973.233959
+351773.130022 7389975.753528
+351778.729212 7389977.583214
+351785.705523 7389984.192082
+351792.978699 7389991.570819
+351799.641653 7389998.399649
+351805.727371 7390002.668918
+351815.779526 7390007.418104
+351827.843762 7390015.626698
+351837.656776 7390023.695316
+351842.010786 7390027.504663
+351850.248771 7390030.364174
+351862.156328 7390034.023547
+351869.874799 7390037.532946
+351885.006633 7390045.221629
+351895.075280 7390048.531062
+351902.505134 7390050.710688
+351910.965767 7390051.690521
+351925.751258 7390053.050288
+351928.794117 7390054.520036
+351930.806198 7390057.539519
+351933.403760 7390062.658642
+351936.817700 7390068.777594
+351940.330594 7390074.136676
+351944.461956 7390079.825701
+351948.914920 7390083.185126
+351953.293669 7390084.344927
+351959.404126 7390085.844670
+351966.438160 7390086.574545
+351973.892753 7390086.434569
+351983.087300 7390085.084800
+351991.580918 7390083.065146
+352001.600088 7390081.615395
+352010.052474 7390083.035152
+352014.925997 7390085.854669
+352019.585117 7390089.444054
+352025.637850 7390096.042923
+352028.878619 7390098.622482
+352033.150166 7390099.882266
+352039.672935 7390101.052065
+352050.871316 7390103.711610
+352064.716737 7390107.400978
+352076.649033 7390108.180844
+352086.429062 7390109.940543
+352094.658801 7390113.349959
+352100.447655 7390116.399437
+352104.686217 7390121.088633
+352106.467403 7390126.977625
+352109.980297 7390132.326708
+352114.350799 7390134.476340
+352119.760327 7390134.316368
+352126.093432 7390133.936433
+352132.640939 7390132.336707
+352144.202154 7390129.907123
+352164.141540 7390126.127770
+352179.834117 7390128.167421
+352188.105086 7390128.247407
+352195.155614 7390126.877642
+352198.858171 7390124.148109
+352200.334246 7390119.508904
+352196.705905 7390105.191356
+352195.452478 7390097.982591
+352196.846091 7390091.233747
+352199.039588 7390085.944653
+352201.224839 7390082.205294
+352204.721241 7390079.245801
+352211.309979 7390073.446794
+352213.280829 7390070.477303
+352214.765150 7390065.058231
+352216.909170 7390055.119933
+352218.583155 7390051.150613
+352220.949823 7390048.841009
+352225.254355 7390047.451247
+352230.152616 7390047.051315
+352236.477475 7390047.781190
+352254.025454 7390047.961159
+352267.722443 7390045.991497
+352277.774598 7390041.442276
+352285.789935 7390035.663266
+352291.529311 7390033.613617
+352298.052080 7390034.233511
+352305.778798 7390037.083023
+352314.396109 7390043.481927
+352319.945822 7390049.290932
+352326.946872 7390053.350236
+352335.811570 7390055.099937
+352351.726795 7390055.479871
+352370.693125 7390057.339553
+352401.880370 7390061.418854
+352449.708507 7390065.558145
+352473.729777 7390071.887061
+352498.031419 7390080.775539
+352521.599146 7390092.193583
+352537.003105 7390102.651791
+352547.954099 7390109.960539
+352558.418566 7390114.489764
+352576.725198 7390120.548726
+352589.317192 7390127.207585
+352600.499081 7390131.416864
+352608.951467 7390133.606489
+352615.680392 7390134.006421
+352622.524763 7390133.746465
+352627.950783 7390132.026760
+352640.699455 7390122.748349
+352649.333259 7390150.433607
+352672.983448 7390192.076474
+352690.968477 7390237.858632
+352715.063963 7390294.368952
+352739.703701 7390341.310911
+352796.553215 7390445.123129
+352829.348474 7390538.947058
+352803.669712 7390674.973758
+352766.042161 7390831.606928
+352768.070734 7390878.388915
+352790.451004 7390917.042294
+352816.896666 7390944.497591
+352849.436292 7390975.012364
+352886.808209 7391057.138296
+352880.046300 7391191.995197
+352887.583355 7391221.150203
+352831.888313 7391411.077670
+352804.692244 7391547.624281
+352775.203724 7391649.326860
+352760.945991 7391709.336581
+352739.596500 7391762.227521
+352531.948166 7392153.540493
+352478.718747 7392281.288611
+352447.473779 7392356.295763
+352318.626425 7392632.968371
+352303.849180 7392698.447155
+352312.301566 7392749.128474
+352350.316689 7392831.504364
+352377.768391 7392941.325552
+352409.450409 7393192.652502
+352420.013831 7393427.092345
+352439.021392 7393564.368831
+352449.576568 7393627.727978
+352455.917919 7393701.655315
+352413.301399 7393899.621405
+352417.902796 7393927.646604
+352420.450881 7394021.210578
+352421.242519 7394091.828482
+352416.072133 7394130.981775
+352299.585878 7394135.081073
+352140.516089 7394138.940412
+352091.789112 7394141.210023
+352001.971168 7394143.659603
+351880.537176 7394148.018857
+351823.473260 7394182.432962
+351779.487865 7394209.928252
+351686.066318 7394266.578548
+351588.579380 7394327.158172
+351493.285938 7394386.538000
+351395.361949 7394445.477905
+351302.377453 7394503.767920
+351203.266006 7394563.817634
+351105.721344 7394622.767536
+351014.262400 7394681.097545
+350994.388984 7394651.342642
+350913.823311 7394699.274432
+350898.427598 7394706.903125
+350801.254016 7394766.242960
+350770.009048 7394785.279700
+350759.437381 7394781.610328
+350748.156537 7394776.021285
+350722.090202 7394768.172630
+350700.163475 7394762.333630
+350684.701792 7394756.644605
+350674.938255 7394750.695624
+350664.143939 7394740.557360
+350681.724903 7394698.404581
+350685.006903 7394668.829646
+350658.717919 7394635.965276
+350639.001182 7394603.100905
+350619.276198 7394576.805409
+350606.131707 7394537.372164
+350599.559461 7394497.928920
+350563.407986 7394455.206238
+350523.974511 7394405.914681
+350530.546756 7394373.050311
+350530.546756 7394343.465378
+350491.105035 7394261.309451
+350454.953560 7394221.866207
+350405.657593 7394185.712400
+350392.513102 7394156.137466
+350379.368610 7394083.839850
+350369.506118 7394021.390547
+350362.933872 7393945.803494
+350323.450920 7393954.512003
+350252.953894 7393966.969869
+350144.087157 7393988.036260
+350129.936625 7393973.598733
+350092.102919 7393925.996887
+350035.847134 7393861.028016
+350035.847134 7393861.008019
+349930.361351 7393725.271269
+349904.418710 7393709.853910
+349788.526184 7393646.024844
+349712.100119 7393622.288909
+349676.558864 7393610.480932
+349640.902163 7393620.389235
+349543.522425 7393629.737633
+349544.223355 7393530.244676
+349547.332184 7393429.751889
+349548.231023 7393407.275739
+349547.678526 7393351.705258
+349545.996295 7393279.367649
+349545.971556 7393238.614629
+349548.198038 7393063.314657
+349535.507089 7392970.090625
+349521.241110 7392867.098267
+349518.066311 7392851.250981
+349498.267112 7392805.298852
+349477.668027 7392775.983874
+349461.818772 7392763.306045
+349441.219688 7392751.418082
+349407.146263 7392735.580794
+349382.597234 7392728.442017
+349303.367450 7392714.184459
+349165.218348 7392675.981003
+349103.709714 7392666.642603
+349051.412119 7392638.127487
+349016.044036 7392602.833533
+348878.686572 7392666.642603
+348786.790578 7392714.184459
+348741.188922 7392623.859931
+348657.646360 7392517.698116
+348558.609129 7392370.333358
+348521.377398 7392314.862860
+348510.286218 7392281.578561
+348496.811877 7392234.846566
+348491.460073 7392164.818561
+348486.512335 7392070.054793
+348482.851008 7391973.241376
+348481.341948 7391946.995872
+348479.676210 7391929.138931
+348470.011627 7391910.752080
+348456.496055 7391891.315409
+348442.353770 7391876.098016
+348425.556198 7391862.090415
+348393.560823 7391835.564959
+348361.153137 7391808.279633
+348345.501791 7391794.252036
+348313.976451 7391757.798280
+348295.826497 7391722.884260
+348285.477478 7391693.839235
+348271.673288 7391650.796608
+348270.848665 7391608.923781
+348263.987801 7391582.058382
+348257.423801 7391565.481222
+348246.027511 7391540.275539
+348235.472335 7391517.339468
+348221.956763 7391496.293073
+348210.271854 7391478.096190
+348196.781021 7391457.089788
+348152.449285 7391439.292837
+348127.421975 7391430.094412
+348103.821263 7391417.796519
+348086.751566 7391407.228329
+348068.469672 7391394.030590
+348043.970121 7391376.063667
+348002.318410 7391343.469251
+347914.586762 7391276.450730
+347907.783622 7391271.701544
+347898.283964 7391254.294525
+348044.835975 7390954.235923
+348142.891904 7390829.807236
+348203.163604 7390771.377245
+348238.036913 7390750.780773
+348260.186289 7390741.292398
+348320.309556 7390714.397005
+348368.566498 7390704.898632
+348441.347730 7390696.989987
+348625.263412 7390704.878635
+Region 1
+371
+346663.650065 7397002.509908
+346583.043161 7397058.800266
+346487.411624 7397125.588826
+346441.018330 7397158.073262
+346369.696682 7397206.344993
+346323.369358 7397234.600153
+346297.352500 7397248.917701
+346272.976642 7397262.855313
+346245.566172 7397276.782928
+346217.042460 7397288.410936
+346173.287960 7397304.518177
+346145.143575 7397312.726771
+346113.972823 7397317.875889
+346090.619498 7397324.224801
+346064.569655 7397326.884346
+346034.149310 7397329.993813
+346008.701443 7397329.653871
+345985.158454 7397329.333926
+345965.788058 7397327.324270
+345941.873989 7397324.144815
+345903.916590 7397316.696091
+345889.873259 7397315.856235
+345752.128222 7397293.090134
+345663.629675 7397279.592446
+345579.773755 7397272.023743
+345466.074727 7397268.564335
+345370.385467 7397240.309175
+345309.091234 7397184.348761
+345281.631286 7397156.473536
+345130.815974 7397068.498605
+345013.999871 7397017.267380
+344861.749714 7396923.823386
+344839.377691 7396909.745798
+344760.865329 7396880.800756
+344574.838611 7396839.177885
+344332.424169 7396819.001341
+344237.699718 7396816.201821
+344099.501138 7396799.834625
+344081.079059 7396798.284890
+344064.190779 7396796.955118
+344042.552669 7396793.795659
+344009.518269 7396790.946147
+343977.555879 7396790.336252
+343879.203087 7396797.055101
+343791.397223 7396820.211134
+343715.721564 7396839.557820
+343674.910969 7396845.776755
+343602.377124 7396858.284613
+343575.296502 7396859.494405
+343550.895906 7396861.134125
+343524.986249 7396859.324435
+343504.040823 7396857.194799
+343477.413745 7396851.565764
+343369.849912 7396814.232158
+343335.207497 7396803.933922
+343279.974244 7396792.585866
+343205.758168 7396771.759434
+343095.093753 7396735.055721
+342987.562905 7396704.640930
+342948.500511 7396691.743140
+342822.902172 7396659.348689
+342649.475695 7396620.115409
+342571.590047 7396602.818372
+342332.168986 7396537.609541
+342174.129976 7396493.967017
+342122.162230 7396481.249195
+341969.887335 7396445.495320
+341950.648879 7396506.364893
+341935.451076 7396546.158077
+341913.845952 7396575.233097
+341880.448717 7396603.788206
+341816.111626 7396642.631552
+341808.723003 7396660.198543
+341816.078641 7396642.671545
+341744.963148 7396668.397139
+341652.646596 7396708.240314
+341530.759061 7396799.784633
+341419.987444 7397005.619376
+341385.831557 7397053.271213
+341238.537385 7397260.875652
+341261.156796 7397259.645863
+341238.529139 7397260.905647
+341194.543745 7397338.842297
+341167.817711 7397387.274002
+341150.418164 7397416.389014
+341128.153342 7397444.334228
+341071.460506 7397510.272933
+341056.460613 7397528.399828
+341034.426684 7397563.933741
+340958.503639 7397685.492919
+340931.777605 7397728.135615
+340976.158818 7397756.260797
+341015.427369 7397786.855557
+341050.976869 7397821.989539
+341089.420796 7397865.392104
+341113.804900 7397899.696228
+341167.957897 7398039.822226
+341184.079278 7398108.030542
+341189.859886 7398155.562401
+341192.168830 7398186.007186
+341187.608665 7398241.597664
+341182.009474 7398277.091584
+341165.475782 7398349.009265
+341125.662980 7398510.671574
+341114.217212 7398564.362377
+341107.191423 7398796.252656
+341111.322785 7398835.935859
+341124.970297 7398907.033680
+341134.478201 7398975.241997
+341148.942089 7399050.469111
+341168.370209 7399113.708279
+341182.834097 7399155.461127
+341191.929690 7399184.806101
+341210.533186 7399215.810790
+341226.654567 7399241.846330
+341258.064459 7399288.558329
+341277.904890 7399313.774010
+341295.271452 7399335.680257
+341302.709552 7399361.305868
+341301.884929 7399377.843035
+341298.990502 7399391.890629
+341297.333010 7399405.538291
+341304.779356 7399417.106310
+341328.751148 7399439.012557
+341364.300649 7399460.098945
+341392.816114 7399481.595263
+341425.471188 7399513.009882
+341459.783753 7399547.314006
+341482.106300 7399575.009262
+341500.289238 7399606.833811
+341508.972519 7399638.668358
+341511.866946 7399665.533756
+341515.173685 7399687.030074
+341522.611785 7399703.557243
+341533.356623 7399715.135260
+341550.310873 7399722.573986
+341564.848978 7399726.383333
+341635.189326 7399466.237894
+341641.942988 7399436.522984
+341647.138114 7399411.967190
+341657.503626 7399363.895424
+341661.857635 7399330.811091
+341680.955906 7399273.460915
+341679.356137 7399230.608255
+341704.762774 7399202.033150
+341724.966039 7399208.132105
+341746.587655 7399222.979562
+341764.036679 7399233.257801
+341780.355970 7399240.116626
+341800.468526 7399248.495191
+341827.021389 7399255.743950
+341881.916546 7399258.973396
+341887.713647 7399259.963227
+341967.751561 7399255.064066
+342046.989592 7399247.865299
+342072.866263 7399177.477356
+342093.811689 7399138.354057
+342106.510884 7399119.307320
+342128.726230 7399070.895612
+342138.250626 7399028.042953
+342173.956805 7398970.112876
+342190.630683 7398928.050081
+342200.138587 7398900.304833
+342188.198045 7398878.498568
+342186.656000 7398856.632314
+342189.039161 7398833.616256
+342177.139850 7398817.748974
+342169.998614 7398793.143189
+342169.363654 7398743.261733
+342170.831483 7398728.284299
+342169.973875 7398679.362678
+342279.508557 7398694.730046
+342327.130539 7398701.078959
+342366.151703 7398703.788495
+342395.895856 7398705.008286
+342419.331644 7398712.507001
+342444.317723 7398719.375825
+342468.380224 7398728.444271
+342492.574665 7398739.952300
+342521.799306 7398752.500151
+342541.161456 7398759.678921
+342562.717102 7398764.678065
+342584.965433 7398767.987498
+342613.959180 7398772.106792
+342673.125885 7398790.763596
+342733.430569 7398779.655499
+342768.204924 7398769.087309
+342793.421897 7398764.678065
+342862.063521 7398740.742165
+342862.080014 7398740.742165
+342935.281803 7398717.186200
+343015.542366 7398691.340627
+343063.147856 7398678.512824
+343095.893637 7398670.854136
+343119.106777 7398666.524877
+343144.513413 7398662.995482
+343178.059080 7398660.265950
+343202.773033 7398657.716386
+343276.246948 7398659.726042
+343324.553367 7398669.794317
+343367.837832 7398680.862422
+343425.643909 7398697.749529
+343506.193089 7398710.787296
+343566.613221 7398708.417702
+343600.967018 7398702.488717
+343640.713850 7398699.619209
+343640.812805 7398699.719192
+343696.046058 7398695.239959
+343715.977197 7398692.660401
+343776.776656 7398684.621778
+343900.197990 7398703.428556
+343924.037843 7398706.408046
+344000.043350 7398728.764216
+344017.987148 7398732.753533
+344040.268464 7398737.702685
+344058.146292 7398746.641154
+344128.057835 7398779.385545
+344193.747308 7398807.740688
+344241.427014 7398836.045840
+344287.680122 7398852.972941
+344305.582688 7398853.902781
+344349.543344 7398858.022076
+344406.829908 7398855.422521
+344469.410553 7398849.453543
+344507.648324 7398832.396465
+344539.132433 7398820.058579
+344634.541321 7398790.923569
+344652.979893 7398780.615335
+344675.154007 7398767.177637
+344699.521619 7398749.370687
+344711.082834 7398740.002291
+344715.766693 7398735.623042
+344724.829301 7398729.694057
+344734.197019 7398723.445128
+344743.259626 7398717.196198
+344758.877987 7398706.877965
+344787.616101 7398689.071015
+344832.178731 7398660.065984
+344847.285826 7398651.587436
+344867.909649 7398639.399524
+344890.710476 7398630.031128
+344908.514088 7398620.342788
+344932.881700 7398606.285196
+344959.747919 7398589.408087
+345011.921821 7398562.232742
+345053.779687 7398535.987237
+345090.021871 7398519.120127
+345108.765553 7398507.562106
+345134.691703 7398492.254728
+345165.309957 7398478.187138
+345192.802890 7398464.759438
+345214.045180 7398452.261579
+345241.224756 7398436.324309
+345270.787493 7398418.117427
+345346.809493 7398367.596081
+345363.367925 7398357.907741
+345388.675606 7398339.480897
+345407.105932 7398325.733252
+345416.787007 7398320.104216
+345427.408152 7398315.105072
+345461.151728 7398291.989032
+345474.898194 7398281.680798
+345487.704590 7398269.812831
+345501.451057 7398253.245668
+345516.129347 7398237.008450
+345528.317276 7398226.380270
+345538.311708 7398218.261661
+345561.120782 7398205.453855
+345575.799072 7398199.824819
+345580.606625 7398198.695012
+345588.918825 7398196.385408
+345602.665292 7398193.885836
+345622.662401 7398194.205781
+345640.152656 7398196.705353
+345658.582982 7398200.134766
+345683.890664 7398206.383695
+345706.386381 7398210.452998
+345726.688601 7398210.133053
+345749.802785 7398209.203213
+345766.674573 7398204.204069
+345783.859718 7398196.385408
+345825.090871 7398165.150758
+345847.586588 7398147.343808
+345865.390200 7398134.845949
+345880.703450 7398125.467556
+345896.008455 7398118.598732
+345911.940172 7398115.159321
+345936.621140 7398114.539428
+345956.304893 7398112.659750
+345974.421862 7398108.290498
+346000.348011 7398099.851943
+346026.282406 7398091.413389
+346039.154772 7398085.684370
+346051.581842 7398080.165316
+346076.749338 7398071.136862
+346085.630528 7398068.297348
+346095.946563 7398064.857938
+346104.687567 7398063.298205
+346115.308712 7398062.048419
+346131.553787 7398060.798633
+346169.981222 7398063.298205
+346193.722120 7398057.989114
+346212.779159 7398055.489542
+346231.522841 7398055.179595
+346270.890346 7398056.739328
+346335.227438 7398055.199592
+346350.862291 7398054.859650
+346420.782080 7398057.189251
+346432.260834 7398056.989285
+346526.424541 7398057.049275
+346565.049886 7398053.809830
+346602.652697 7398053.299917
+346635.456203 7398051.430238
+346661.382352 7398048.300774
+346678.880853 7398049.870505
+346688.248571 7398052.989970
+346715.741504 7398067.357509
+346735.111900 7398082.664887
+346741.981010 7398085.794351
+346751.670331 7398088.293923
+346780.095088 7398092.663175
+346813.525307 7398093.603014
+346849.759245 7398096.412533
+346951.336314 7398076.225990
+347155.290337 7398035.712930
+347272.370319 7398001.268830
+347366.360856 7397948.757824
+347422.393994 7397805.272402
+347523.006254 7397756.680726
+347622.612474 7397686.872683
+347795.280297 7397462.411131
+347845.161746 7397372.246576
+347902.712190 7397296.459557
+347919.732410 7397285.871371
+347931.029746 7397267.334546
+347963.124076 7397175.420290
+347984.885878 7397148.324931
+348016.922484 7397058.280355
+348032.392413 7397015.107750
+347954.935569 7396922.053690
+347954.886091 7396922.083684
+347881.189528 7396843.797094
+347795.181342 7396749.863184
+347651.647452 7396591.260351
+347602.846259 7396526.611425
+347559.776196 7396471.230911
+347549.080835 7396444.745448
+347535.169444 7396407.641804
+347491.860240 7396412.650946
+347446.530711 7396421.159488
+347395.874116 7396433.877310
+347369.601625 7396443.085732
+347347.138893 7396453.453956
+347312.884051 7396469.931134
+347291.567544 7396481.419166
+347266.078445 7396501.295762
+347230.331036 7396529.600913
+347183.212074 7396579.642342
+347142.912744 7396617.095926
+347090.244069 7396673.536258
+346969.593469 7396800.504510
+346876.039982 7396876.561482
+346866.771219 7396881.600619
+346833.621372 7396904.226743
+346811.076177 7396920.004041
+346776.516224 7396935.491388
+346751.439437 7396947.169387
+346732.027810 7396958.037526
+346706.852068 7396972.755005
+346678.658205 7396992.001708
+346663.650065 7397002.509908
+Region 1
+184
+326732.922903 7396089.096368
+326723.711864 7396056.182006
+326724.849844 7396000.001629
+326739.033360 7395842.888541
+326753.917807 7395717.929945
+326767.820952 7395600.580046
+326814.403908 7395523.283286
+326850.101841 7395465.563173
+326868.317764 7395432.758792
+326887.597452 7395414.181974
+326913.762742 7395398.384680
+326942.707011 7395379.517912
+327001.131555 7395345.363762
+327063.530783 7395282.754487
+327080.781897 7395264.677583
+327148.986471 7395187.330832
+327179.175921 7395159.325629
+327218.279547 7395130.290602
+327281.412689 7395092.237121
+327329.240826 7395057.673041
+327399.581174 7395011.290986
+327462.541145 7394962.899275
+327524.222950 7394914.007650
+327560.267224 7394890.561666
+327574.500218 7394881.393236
+327600.921141 7394869.135336
+327648.716294 7394859.377007
+327672.613871 7394849.928626
+327717.127024 7394848.298905
+327750.219147 7394852.288222
+327790.947280 7394860.316846
+327830.347770 7394847.029122
+327896.927837 7394821.483498
+327914.327383 7394813.954788
+327951.039602 7394793.418306
+327999.997474 7394757.714421
+328037.089019 7394723.240326
+328085.519132 7394670.059436
+328097.698814 7394658.861354
+328138.097098 7394642.524152
+328159.446589 7394639.684639
+328189.965889 7394638.104909
+328242.881951 7394636.705149
+328286.883838 7394635.855295
+328427.275914 7394630.986129
+328497.970850 7394620.927852
+328554.441037 7394620.307958
+328618.720405 7394593.502549
+328684.014059 7394567.966923
+328716.759841 7394544.280980
+328756.877753 7394519.055301
+328792.913781 7394490.280230
+328883.787243 7394426.091225
+328917.778206 7394394.776589
+328967.098911 7394382.238737
+328981.076272 7394414.463217
+329003.423557 7394465.914404
+329014.976526 7394492.299884
+329034.742741 7394537.362166
+329045.718474 7394562.377881
+329093.060084 7394661.820847
+329146.602860 7394788.429160
+329185.780702 7394792.408479
+329213.009755 7394795.148009
+329243.042527 7394801.426934
+329267.987375 7394808.995637
+329290.656263 7394818.094079
+329314.347684 7394829.722087
+329339.581150 7394844.399573
+329362.019143 7394864.156189
+329383.954117 7394882.143108
+329428.071451 7394921.916295
+329462.243831 7394950.541392
+329500.481602 7394979.156490
+329550.668162 7395006.991722
+329557.050744 7395012.560768
+329583.339728 7395027.828153
+329593.490837 7395034.067085
+329637.632910 7395059.422741
+329652.088552 7395067.971277
+329683.943741 7395085.938200
+329700.749560 7395091.737206
+329710.166755 7395097.306252
+329735.136341 7395108.684303
+329764.171319 7395120.302313
+329812.040688 7395135.949633
+329859.901811 7395149.047389
+329873.376152 7395151.307002
+329891.451889 7395154.056531
+329904.687090 7395157.585927
+329912.083959 7395161.125321
+329919.983847 7395167.724190
+329928.403249 7395175.062933
+329953.917087 7395208.067280
+329956.498157 7395216.895768
+329962.138579 7395232.643070
+329972.413382 7395265.377463
+329980.618381 7395289.233377
+329995.989355 7395332.865903
+330012.358123 7395354.942122
+330024.933625 7395392.745646
+330087.489531 7395560.216960
+330108.319509 7395615.587475
+330124.152272 7395657.660269
+330144.908035 7395710.191271
+330155.232315 7395751.824139
+330163.181682 7395788.127921
+330167.477968 7395849.317440
+330173.703872 7395902.888263
+330182.543831 7395950.830051
+330190.336519 7395999.991630
+330213.722829 7396052.872572
+330199.902147 7396071.269421
+330162.926049 7396173.591894
+330211.751980 7396284.582883
+330118.973639 7396340.983222
+330026.467424 7396402.212734
+329954.766448 7396418.369966
+329838.478104 7396443.395679
+329730.073156 7396471.450874
+329680.397862 7396480.359348
+329616.027786 7396489.867719
+329486.289839 7396515.243372
+329359.866877 7396543.888466
+329240.280040 7396568.444260
+329188.073154 7396600.328798
+329161.693462 7396621.455179
+329060.553443 7396679.945161
+328796.146304 7396846.536625
+328737.762991 7396883.450302
+328690.437873 7396904.796646
+328663.142850 7396920.453964
+328632.038068 7396939.930627
+328559.520715 7396989.872073
+328485.263408 7397045.412559
+328399.362424 7397107.361948
+328283.511129 7397211.914039
+328268.140155 7397230.790806
+328257.139684 7397305.528004
+328246.568016 7397365.287768
+328199.861366 7397404.161109
+328168.261810 7397423.387816
+328131.838209 7397442.654515
+328093.880809 7397458.611782
+328048.526541 7397469.529912
+327964.901516 7397503.874029
+327960.011501 7397358.338958
+327960.011501 7397237.259698
+327879.503551 7397240.909073
+327872.279853 7397239.849254
+327813.451244 7397240.089213
+327743.209851 7397239.319345
+327670.469851 7397120.919626
+327538.018894 7396913.845096
+327444.688056 7396776.748579
+327355.587533 7396637.912360
+327319.056732 7396569.494080
+327271.220348 7396497.516409
+327197.350613 7396547.047925
+327121.732678 7396569.494080
+327124.041623 7396529.520927
+327119.704106 7396502.895488
+327113.816297 7396474.000437
+327102.617916 7396445.515316
+327091.081439 7396423.889021
+327077.656576 7396405.692138
+327059.663300 7396387.525249
+327040.169211 7396372.797772
+327027.940051 7396363.729325
+326976.689728 7396320.636707
+326956.791573 7396302.099882
+326937.256253 7396280.523578
+326918.883651 7396261.206887
+326829.296601 7396237.370970
+326814.469878 7396240.130497
+326781.196338 7396251.608531
+326758.684128 7396264.146383
+326723.340783 7396296.880776
+326695.229383 7396282.143300
+326707.293619 7396238.470781
+326708.926372 7396217.124438
+326738.052059 7396121.050894
+326737.969597 7396105.443567
+326732.922903 7396089.096368
+Region 1
+200
+329470.308644 7391628.130491
+329439.418264 7391615.922582
+329417.235904 7391609.463688
+329404.709879 7391607.214073
+329370.933319 7391606.264236
+329340.677898 7391609.233728
+329321.596121 7391607.574012
+329302.448373 7391606.634173
+329276.538716 7391602.834824
+329255.156240 7391597.045815
+329212.440766 7391567.450885
+329192.476641 7391554.113169
+329121.385887 7391503.891772
+329044.786650 7391455.140122
+328952.181480 7391391.311056
+328856.286064 7391328.221862
+328836.091045 7391317.683667
+328762.509929 7391263.442958
+328727.727328 7391243.876310
+328708.323947 7391235.887678
+328695.096993 7391231.858369
+328669.344015 7391225.689425
+328632.689520 7391217.620807
+328609.220747 7391216.231045
+328586.873462 7391215.191223
+328563.718047 7391213.771467
+328479.062243 7391217.660800
+328374.697948 7391220.110381
+328311.861670 7391223.599783
+328304.390585 7391222.739930
+328228.096459 7391227.759071
+328140.397796 7391133.435227
+328038.861959 7391025.233761
+328016.572397 7391002.267695
+328000.046951 7390984.240783
+327944.912653 7390923.891121
+327867.389838 7390845.074621
+327697.426779 7390658.606561
+327684.678106 7390648.008377
+327652.039525 7390618.353456
+327606.404885 7390557.643855
+327587.364338 7390541.876556
+327534.918311 7390520.920146
+327509.437459 7390521.899978
+327403.588842 7390517.900663
+327395.078732 7390570.111720
+327377.555492 7390662.395912
+327372.566522 7390717.226520
+327345.634333 7390811.380393
+327328.061615 7390841.665205
+327092.664715 7391254.324520
+326860.442614 7391683.840948
+326759.541736 7391794.821938
+326651.664547 7391907.422650
+326424.423169 7392114.857119
+326339.742626 7392211.080637
+326270.564997 7392345.047689
+326219.850679 7392496.851687
+326131.203699 7392705.355972
+326078.831889 7392865.948464
+326043.702946 7392961.322127
+326027.631042 7393017.592488
+326011.122089 7393067.323970
+325962.436343 7393151.369574
+325992.543331 7393100.888221
+326011.122089 7393067.323970
+326105.557922 7393133.352660
+326194.237886 7393224.866984
+326265.213194 7393290.935667
+326332.131355 7393354.704744
+326398.282618 7393417.953910
+326461.143634 7393476.623860
+326480.926341 7393492.151201
+326524.260283 7393533.014201
+326595.854058 7393602.352324
+326618.539438 7393624.818476
+326632.112734 7393667.511163
+326666.540747 7393736.559336
+326706.427764 7393787.630588
+326779.349182 7393876.285402
+326780.891227 7393937.194969
+326784.610277 7393958.321350
+326805.357793 7393990.285875
+326810.552919 7394000.004210
+326814.906929 7394014.861665
+326833.122852 7394039.837387
+326846.176635 7394067.232695
+326868.161086 7394100.696962
+326882.756914 7394133.421357
+326904.246591 7394172.224710
+326927.418499 7394217.376976
+326935.969841 7394231.564546
+326953.509573 7394311.250896
+326964.427583 7394388.167721
+326971.403894 7394423.951592
+327016.642715 7394577.715254
+327045.149934 7394665.260258
+327045.191166 7394665.310249
+327061.576426 7394678.627968
+327110.253925 7394746.186396
+327138.398311 7394788.249191
+327147.023868 7394801.086992
+327165.412962 7394817.694147
+327185.393579 7394852.068259
+327230.822064 7394900.210013
+327276.349503 7394981.356113
+327242.135892 7395027.908140
+327229.469682 7395045.205177
+327217.322984 7395065.801649
+327212.812296 7395090.437429
+327218.279547 7395130.290602
+327281.412689 7395092.237121
+327329.240826 7395057.673041
+327399.581174 7395011.290986
+327462.541145 7394962.899275
+327524.222950 7394914.007650
+327560.267224 7394890.561666
+327574.500218 7394881.393236
+327600.921141 7394869.135336
+327648.716294 7394859.377007
+327672.613871 7394849.928626
+327717.127024 7394848.298905
+327750.219147 7394852.288222
+327790.947280 7394860.316846
+327830.347770 7394847.029122
+327896.927837 7394821.483498
+327914.327383 7394813.954788
+327951.039602 7394793.418306
+327999.997474 7394757.714421
+328037.089019 7394723.240326
+328085.519132 7394670.059436
+328097.698814 7394658.861354
+328138.097098 7394642.524152
+328159.446589 7394639.684639
+328189.965889 7394638.104909
+328242.881951 7394636.705149
+328286.883838 7394635.855295
+328427.275914 7394630.986129
+328497.970850 7394620.927852
+328554.441037 7394620.307958
+328618.720405 7394593.502549
+328684.014059 7394567.966923
+328716.759841 7394544.280980
+328756.877753 7394519.055301
+328792.913781 7394490.280230
+328776.767662 7394451.716836
+328758.881587 7394420.012267
+328741.506779 7394402.505265
+328700.630214 7394335.056819
+328681.210341 7394304.881987
+328660.767935 7394274.697158
+328640.086389 7394247.831760
+328585.743729 7394189.281789
+328547.687374 7394140.350170
+328519.881085 7394109.675424
+328502.786649 7394094.478028
+328460.178375 7394050.885495
+328433.402864 7394028.089399
+328415.277649 7394010.902343
+328407.922011 7394004.773393
+328324.610343 7393952.092417
+328314.813821 7393925.137034
+328303.780364 7393911.659343
+328292.763400 7393893.282491
+328287.856893 7393876.125429
+328282.950386 7393863.877527
+328277.969662 7393848.600144
+328278.052125 7393832.432914
+328279.173612 7393807.517181
+328335.577830 7393715.922871
+328367.169139 7393642.865385
+328381.616535 7393612.350612
+328401.423981 7393577.916510
+328442.556180 7393518.476691
+328572.013755 7393325.659719
+328692.293275 7393143.760877
+328775.011215 7393020.531985
+328795.173249 7392990.087200
+328810.478253 7392973.320072
+328853.136004 7392939.925792
+328907.462171 7392895.823346
+328794.431088 7392739.210173
+328715.795032 7392628.209186
+328715.803279 7392628.199188
+328800.821917 7392551.442336
+328852.567014 7392483.274012
+328945.617480 7392365.734146
+329031.353541 7392255.433039
+329106.567410 7392160.949224
+329195.585470 7392048.128549
+329195.593716 7392048.128549
+329234.936483 7391999.966798
+329270.551953 7391949.105511
+329351.966988 7391848.712707
+329393.998026 7391790.282715
+329453.948122 7391717.875118
+329473.912247 7391695.848891
+329514.549671 7391660.544938
+329486.627935 7391638.178769
+329470.308644 7391628.130491
+Region 1
+297
+323487.478646 7404590.230200
+323137.508618 7404495.796376
+322804.212468 7404268.035389
+322511.900084 7404001.031125
+322389.946578 7403916.655578
+321753.560221 7403527.492238
+321723.799574 7403581.283024
+321714.638012 7403643.092436
+321698.615586 7403711.770673
+321691.746476 7403764.421654
+321692.966918 7403783.368408
+321698.615586 7403892.609696
+321608.946074 7403877.032365
+321524.059376 7403861.585011
+321478.738092 7403839.368816
+321455.962003 7403828.510676
+321421.624699 7403798.755773
+321382.710736 7403782.728518
+321336.927664 7403766.711262
+321245.361518 7403734.656752
+321169.050900 7403699.072848
+321191.043597 7403684.125408
+321210.348023 7403660.849395
+321219.319922 7403644.732156
+321214.561847 7403620.636283
+321207.090762 7403600.209782
+321155.279695 7403532.961301
+321142.918595 7403512.094875
+321119.260159 7403477.970720
+321099.073387 7403445.296317
+321090.332382 7403422.910152
+321028.238266 7403437.807600
+321002.658458 7403453.704877
+320946.930431 7403487.869025
+320991.410599 7403092.356773
+320970.762038 7402996.433203
+320965.764822 7402952.980646
+320955.374572 7402859.886593
+320943.780371 7402760.803565
+320967.983058 7402641.923928
+320956.413597 7402398.905554
+320935.740296 7402369.620571
+320911.653057 7402335.736375
+320906.845504 7402318.099396
+320935.740296 7402205.548675
+320921.136222 7402173.344191
+320849.410508 7402100.326698
+320797.805596 7402084.789360
+320773.751342 7402068.752107
+320765.736005 7402062.343205
+320751.305102 7402033.478149
+320746.497549 7402003.013367
+320749.705333 7401972.548586
+320780.166909 7401932.455453
+320828.522806 7401898.461276
+320872.607155 7401918.327873
+320932.227402 7401834.502232
+320995.566700 7401836.361913
+321014.186689 7401843.190743
+321025.368577 7401847.539998
+321039.032581 7401850.019574
+321050.832938 7401846.920105
+321054.560234 7401836.981807
+321104.853994 7401830.772870
+321150.373188 7401833.722365
+321168.820006 7401818.354997
+321208.550345 7401796.478745
+321237.758494 7401781.761266
+321267.626341 7401764.254264
+321278.956662 7401756.015676
+321302.648083 7401743.657792
+321368.568451 7401720.991675
+321436.550376 7401702.454850
+321473.633675 7401691.126791
+321494.216267 7401690.096967
+321517.899441 7401704.144561
+321533.369370 7401728.200440
+321559.122348 7401735.409205
+321583.836302 7401740.558323
+321594.144090 7401735.409205
+321620.919601 7401710.693439
+321677.571205 7401693.186438
+321744.514106 7401672.579967
+321788.796364 7401708.633792
+321834.125894 7401746.747263
+321863.573184 7401754.785886
+321884.164022 7401759.805027
+321908.276000 7401775.582324
+321916.942789 7401784.310829
+321930.276944 7401797.318601
+321947.437350 7401803.467548
+321976.043524 7401805.457207
+322011.122989 7401806.327058
+322045.245891 7401815.905417
+322073.266583 7401813.385849
+322102.252084 7401807.756813
+322136.193569 7401797.948493
+322176.608345 7401773.282718
+322202.930314 7401755.055840
+322219.711393 7401743.287856
+322250.610019 7401711.743259
+322282.267299 7401682.098337
+322351.296495 7401634.646465
+322414.017326 7401595.343197
+322459.338609 7401582.975316
+322530.396379 7401561.349020
+322599.417329 7401539.722725
+322642.322467 7401394.177655
+322685.450254 7401282.586770
+322778.550198 7401112.815850
+322839.209470 7401034.459272
+322907.884079 7400952.313343
+323098.223575 7400754.237271
+323148.566813 7400696.057237
+323211.130965 7400618.090592
+323236.306707 7400586.136065
+323267.601152 7400543.913298
+323362.210157 7400397.778329
+323442.495458 7400303.044556
+323610.446438 7400065.355270
+323889.193772 7399748.599528
+324152.108344 7399463.518360
+324347.552257 7399235.407433
+324392.205596 7399056.798027
+324541.718003 7399165.749365
+324677.920995 7399197.423939
+324782.458461 7399206.932311
+325016.857567 7399181.586652
+325682.056255 7399140.403706
+325865.040113 7399134.584703
+325848.283772 7399287.228557
+325848.663099 7399360.046084
+325841.117798 7399467.767632
+325818.366447 7399623.241001
+325807.506162 7399784.473383
+325796.983971 7399896.474198
+325791.747615 7399940.596640
+325777.316711 7400062.595743
+325753.847939 7400268.760429
+325734.518774 7400359.634863
+325730.222488 7400377.501803
+325722.710172 7400408.436504
+325712.410630 7400435.801816
+325700.008299 7400460.837528
+325687.292611 7400489.502618
+325672.210255 7400513.638484
+325653.746945 7400559.130691
+325600.402079 7400624.149554
+325531.298666 7400737.030219
+325504.382969 7400777.403303
+325490.001543 7400798.359713
+325469.559137 7400839.192719
+325459.812093 7400866.548033
+325452.266792 7400885.674757
+325445.513129 7400911.960255
+325440.260280 7400930.137141
+325437.101973 7400963.271466
+325429.960738 7401012.543026
+325404.686041 7401165.676795
+325396.901599 7401218.937672
+325378.025977 7401290.855353
+325334.692035 7401351.804913
+325319.939528 7401454.757278
+325295.332776 7401559.709301
+325317.770770 7401615.439755
+325334.428156 7401639.375655
+325358.853491 7401669.910425
+325400.628895 7401715.752572
+325422.060849 7401743.917748
+325461.618017 7401805.247243
+325492.153809 7401853.069051
+325522.755571 7401904.430254
+325547.931313 7401941.353929
+325562.485910 7401978.527561
+325571.276392 7402011.051990
+325574.797533 7402035.667774
+325572.166985 7402067.322352
+325568.654091 7402092.817984
+325559.863609 7402146.438800
+325576.562226 7402223.805547
+325615.253540 7402327.537779
+325643.373187 7402360.072206
+325670.626979 7402426.880763
+325689.222229 7402507.526949
+325661.531387 7402516.755368
+325607.172234 7402544.450624
+325584.602301 7402560.857813
+325568.192302 7402578.294827
+325554.858147 7402587.533244
+325532.469631 7402616.238327
+325498.981688 7402642.113895
+325476.518956 7402659.600900
+325452.918244 7402678.627641
+325435.419742 7402683.926733
+325340.621075 7402744.286394
+325327.690985 7402759.463794
+325303.496544 7402856.757129
+325308.213388 7402891.541170
+325303.240911 7402919.366404
+325303.983072 7402945.681897
+325312.328257 7402968.198040
+325322.586568 7402987.674704
+325332.836633 7403010.960715
+325343.103190 7403031.187250
+325327.872402 7403108.054084
+325278.329048 7403244.890645
+325279.079455 7403282.244247
+325281.487355 7403335.245168
+325292.413610 7403389.865812
+325309.005026 7403476.091042
+325292.487827 7403542.149727
+325216.993585 7403598.770029
+325016.461748 7403899.578503
+324981.077172 7403970.356379
+324973.696796 7404063.260465
+324986.239313 7404087.686282
+324952.124657 7404184.599681
+324934.766341 7404234.041212
+324930.197929 7404250.428405
+324926.759251 7404265.295859
+324922.949493 7404278.263637
+324890.673746 7404322.176116
+324850.506356 7404373.817270
+324825.091473 7404417.259829
+324809.827701 7404463.391927
+324803.717244 7404490.837225
+324801.762887 7404516.492831
+324805.209811 7404539.278928
+324810.833741 7404562.534944
+324820.011795 7404582.021606
+324839.712040 7404625.194211
+324842.029231 7404635.462452
+324843.010533 7404640.351615
+324850.968145 7404701.531136
+324859.799858 7404732.095900
+324879.293947 7404768.209714
+324903.348202 7404798.954448
+324921.943452 7404833.278568
+324947.539752 7404883.210016
+324957.864033 7404905.696164
+324976.987042 7404947.219051
+325051.656660 7405018.696808
+325087.041236 7405059.099887
+325118.352174 7405098.673109
+325145.243132 7405147.694712
+325157.142443 7405185.238281
+325149.547664 7405210.373975
+325043.855726 7405356.408961
+325043.863973 7405356.458952
+324930.783412 7405516.951461
+324907.801167 7405533.498627
+324853.573954 7405549.125950
+324820.217951 7405549.615866
+324762.552060 7405557.054592
+324741.202569 7405560.254044
+324746.875976 7405521.450691
+324746.777021 7405498.524618
+324746.702805 7405493.085549
+324735.496177 7405472.879011
+324711.969681 7405440.624536
+324700.548652 7405433.955678
+324677.450960 7405421.937736
+324644.086711 7405409.219915
+324604.950100 7405400.021490
+324585.109669 7405384.724111
+324569.796419 7405364.567563
+324558.053786 7405349.740103
+324537.240300 7405336.972290
+324508.345508 7405326.324114
+324463.395305 7405317.145686
+324444.231065 7405227.321072
+324428.175654 7405211.283819
+324408.673318 7405202.195376
+324391.183063 7405193.896798
+324375.853320 7405185.968156
+324361.348201 7405176.489779
+324345.680362 7405162.782127
+324334.185117 7405149.464409
+324324.248409 7405126.198394
+324292.789039 7404979.843463
+324288.014471 7404942.909790
+324285.656049 7404909.655486
+324285.944668 7404893.598236
+324288.162904 7404879.110718
+324293.036426 7404864.993136
+324299.872551 7404856.994506
+324308.242475 7404849.335818
+324328.346786 7404843.046895
+324342.522056 7404845.316506
+324362.659351 7404844.446655
+324379.423938 7404843.986734
+324397.697585 7404837.227892
+324405.193409 7404825.569889
+324434.236633 7404756.791670
+324445.839080 7404704.830570
+323840.186424 7404582.341552
+323487.478646 7404590.230200
+Region 1
+332
+349296.572556 7398517.010488
+349400.978082 7397946.868148
+349420.513403 7397840.196420
+349439.883799 7397734.424538
+349420.562880 7397726.975814
+349359.408834 7397700.300383
+349207.843115 7397644.739900
+349152.296505 7397622.523705
+349094.366735 7397598.717783
+349034.853688 7397575.701726
+348977.723802 7397551.105939
+348920.577424 7397528.089881
+348865.063799 7397504.653895
+348828.516505 7397492.375999
+348733.297279 7397481.267901
+348691.851724 7397480.208083
+348671.302117 7397490.556310
+348599.180584 7397529.689607
+348545.217251 7397565.393491
+348534.109578 7397567.783082
+348523.001906 7397564.603627
+348438.090469 7397519.371374
+348370.636302 7397482.077763
+348309.498748 7397454.252529
+348287.390603 7397450.503171
+348249.227048 7397449.543335
+348224.867683 7397445.733988
+348205.571503 7397446.363880
+348186.011444 7397452.322859
+348164.686691 7397461.521284
+348156.712586 7397471.069648
+348151.773094 7397476.418732
+348149.117808 7397480.238078
+348145.316296 7397485.957098
+348135.057985 7397497.035200
+348020.179746 7397333.523209
+347963.445679 7397278.942558
+347919.732410 7397285.871371
+347902.712190 7397296.459557
+347845.161746 7397372.246576
+347795.280297 7397462.411131
+347622.612474 7397686.872683
+347523.006254 7397756.680726
+347422.393994 7397805.272402
+347366.360856 7397948.757824
+347272.370319 7398001.268830
+347155.290337 7398035.712930
+346951.336314 7398076.225990
+346849.759245 7398096.412533
+346813.525307 7398093.603014
+346780.095088 7398092.663175
+346751.670331 7398088.293923
+346741.981010 7398085.794351
+346735.111900 7398082.664887
+346715.741504 7398067.357509
+346688.248571 7398052.989970
+346678.880853 7398049.870505
+346661.382352 7398048.300774
+346635.456203 7398051.430238
+346602.652697 7398053.299917
+346565.049886 7398053.809830
+346526.424541 7398057.049275
+346432.260834 7398056.989285
+346420.782080 7398057.189251
+346350.862291 7398054.859650
+346335.227438 7398055.199592
+346270.890346 7398056.739328
+346231.522841 7398055.179595
+346212.779159 7398055.489542
+346193.722120 7398057.989114
+346169.981222 7398063.298205
+346131.553787 7398060.798633
+346115.308712 7398062.048419
+346104.687567 7398063.298205
+346095.946563 7398064.857938
+346085.630528 7398068.297348
+346076.749338 7398071.136862
+346051.581842 7398080.165316
+346039.154772 7398085.684370
+346026.282406 7398091.413389
+346000.348011 7398099.851943
+345974.421862 7398108.290498
+345956.304893 7398112.659750
+345936.621140 7398114.539428
+345911.940172 7398115.159321
+345896.008455 7398118.598732
+345880.703450 7398125.467556
+345865.390200 7398134.845949
+345847.586588 7398147.343808
+345825.090871 7398165.150758
+345783.859718 7398196.385408
+345766.674573 7398204.204069
+345749.802785 7398209.203213
+345726.688601 7398210.133053
+345706.386381 7398210.452998
+345683.890664 7398206.383695
+345658.582982 7398200.134766
+345640.152656 7398196.705353
+345622.662401 7398194.205781
+345602.665292 7398193.885836
+345588.918825 7398196.385408
+345580.606625 7398198.695012
+345575.799072 7398199.824819
+345561.120782 7398205.453855
+345538.311708 7398218.261661
+345528.317276 7398226.380270
+345516.129347 7398237.008450
+345501.451057 7398253.245668
+345487.704590 7398269.812831
+345474.898194 7398281.680798
+345461.151728 7398291.989032
+345427.408152 7398315.105072
+345416.787007 7398320.104216
+345407.105932 7398325.733252
+345388.675606 7398339.480897
+345363.367925 7398357.907741
+345346.809493 7398367.596081
+345270.787493 7398418.117427
+345241.224756 7398436.324309
+345214.045180 7398452.261579
+345192.802890 7398464.759438
+345165.309957 7398478.187138
+345134.691703 7398492.254728
+345108.765553 7398507.562106
+345090.021871 7398519.120127
+345053.779687 7398535.987237
+345011.921821 7398562.232742
+344959.747919 7398589.408087
+344932.881700 7398606.285196
+344908.514088 7398620.342788
+344890.710476 7398630.031128
+344867.909649 7398639.399524
+344847.285826 7398651.587436
+344832.178731 7398660.065984
+344787.616101 7398689.071015
+344758.877987 7398706.877965
+344743.259626 7398717.196198
+344734.197019 7398723.445128
+344724.829301 7398729.694057
+344715.766693 7398735.623042
+344711.082834 7398740.002291
+344723.559381 7398740.512204
+344729.801778 7398741.132098
+344739.449868 7398744.001606
+344745.428385 7398745.821295
+344756.832922 7398747.381028
+344792.283467 7398753.789930
+344809.938647 7398758.479127
+344825.086973 7398764.568084
+344843.368866 7398774.566371
+344852.109871 7398781.755140
+344860.083976 7398790.973561
+344880.229517 7398811.590029
+344893.819305 7398827.057380
+344901.001772 7398834.396123
+344912.406309 7398841.894838
+344937.870669 7398855.332536
+344963.483462 7398867.670423
+344986.135857 7398880.798174
+344991.603108 7398883.607693
+345000.195681 7398886.577184
+345019.096041 7398891.576328
+345028.158649 7398895.485659
+345037.526367 7398901.414643
+345071.269943 7398928.909933
+345105.945343 7398954.845491
+345134.840135 7398972.812413
+345159.991138 7398989.839497
+345199.977111 7399003.897089
+345222.002793 7399013.425457
+345292.607019 7399039.830933
+345302.923054 7399043.580291
+345316.042807 7399048.729409
+345383.810330 7399077.164539
+345388.988963 7399079.044217
+345417.257042 7399088.572584
+345434.285508 7399094.821514
+345449.442080 7399101.850310
+345465.687154 7399108.719134
+345472.712943 7399110.438839
+345478.336872 7399109.658973
+345488.958017 7399105.129748
+345495.522017 7399102.630177
+345504.576378 7399101.540363
+345517.391021 7399100.750499
+345527.698809 7399102.470204
+345548.471064 7399107.939267
+345571.898605 7399116.687769
+345594.394322 7399124.496431
+345612.667970 7399130.275441
+345624.855898 7399136.684343
+345649.380188 7399150.431989
+345660.628047 7399157.310810
+345687.650945 7399178.397198
+345708.579878 7399194.644415
+345714.987199 7399197.923854
+345728.890344 7399201.833184
+345746.380599 7399205.582542
+345809.332324 7399216.830615
+345828.702720 7399219.790108
+345839.480543 7399223.079545
+345859.939442 7399229.948368
+345868.688692 7399234.787539
+345879.301591 7399251.854616
+345884.463732 7399259.943230
+345888.372445 7399264.782401
+345900.708806 7399269.781545
+345916.178735 7399274.160795
+345935.392452 7399278.060127
+345959.446707 7399281.969457
+345965.540671 7399282.279404
+345975.221746 7399280.559699
+345993.495393 7399274.630714
+346005.840001 7399270.251465
+346014.894362 7399267.911865
+346026.768934 7399268.531759
+346043.954079 7399270.411437
+346082.686624 7399277.440233
+346107.210914 7399281.659510
+346122.054129 7399283.849135
+346144.079811 7399288.848279
+346150.017097 7399290.557986
+346154.387599 7399293.847423
+346175.629890 7399311.804347
+346186.721070 7399321.022768
+346209.686822 7399335.870225
+346217.025967 7399338.209824
+346225.461861 7399340.089502
+346234.054434 7399340.089502
+346249.870704 7399338.449783
+346259.980583 7399337.120011
+346267.171296 7399337.739904
+346274.823798 7399338.989690
+346284.661551 7399343.678887
+346300.279912 7399354.926960
+346311.684449 7399363.365515
+346321.217092 7399371.484124
+346327.616167 7399375.233482
+346345.114668 7399380.862518
+346377.876942 7399388.391228
+346412.123538 7399395.390029
+346431.650612 7399398.509495
+346452.579546 7399400.859093
+346473.203369 7399404.288505
+346491.163659 7399406.008211
+346503.813377 7399405.388317
+346518.186557 7399402.728772
+346526.267863 7399401.009067
+346554.255570 7399394.880117
+346599.815994 7399376.633242
+346617.504159 7399369.794414
+346651.800232 7399365.235195
+346687.844506 7399362.975582
+346715.164268 7399363.775445
+346736.761146 7399364.675291
+346756.972658 7399370.254335
+346779.641546 7399380.922508
+346795.680464 7399395.020093
+346812.181172 7399411.907200
+346832.128804 7399436.403004
+346841.364582 7399443.821734
+346887.337318 7399482.185162
+346897.405966 7399486.764378
+346905.660443 7399484.014849
+346921.122125 7399497.362562
+346949.522143 7399491.273605
+346998.216135 7399485.184648
+347040.824409 7399491.273605
+347083.432683 7399501.421867
+347114.801344 7399510.090382
+347142.261292 7399501.421867
+347166.612411 7399501.421867
+347186.898139 7399507.510824
+347211.249258 7399527.797349
+347236.746603 7399566.990636
+347288.343268 7399585.627443
+347318.780105 7399595.775705
+347363.408706 7399595.775705
+347438.474143 7399605.913969
+347464.853835 7399616.062230
+347477.025272 7399624.180840
+347495.282426 7399624.180840
+347519.633545 7399595.775705
+347539.919273 7399579.538486
+347568.327537 7399579.538486
+347606.870419 7399591.716401
+347643.392975 7399589.686748
+347708.315549 7399563.311266
+347779.323841 7399543.024741
+347828.553838 7399522.288293
+347841.673591 7399504.181394
+347855.840615 7399508.140716
+347879.771176 7399510.090382
+347913.457029 7399511.750098
+347980.672055 7399518.628920
+348028.689856 7399523.388105
+348055.490105 7399524.997829
+348115.431956 7399530.476890
+348250.018686 7399540.155232
+348291.983754 7399545.144378
+348318.866466 7399545.764272
+348364.179503 7399543.104727
+348381.306924 7399541.674972
+348399.168260 7399538.705481
+348421.556776 7399533.376394
+348456.248668 7399533.176428
+348479.931843 7399535.835972
+348588.806826 7399545.144378
+348642.151692 7399548.753760
+348666.618258 7399552.543111
+348699.388779 7399551.993205
+348724.877878 7399549.663604
+348759.140966 7399547.184029
+348878.900974 7399529.557048
+348896.028395 7399528.517226
+348909.750123 7399527.907330
+348920.016680 7399526.967491
+348948.251774 7399528.027310
+348963.540285 7399530.436897
+348982.622063 7399533.356397
+349003.468534 7399539.705310
+349027.935100 7399550.583446
+349102.291362 7399586.977212
+349116.582080 7399594.905854
+349174.503604 7399305.255469
+349215.289461 7399090.702220
+349227.749515 7399021.554064
+349249.148484 7398872.559586
+349259.868584 7398795.392804
+349269.879508 7398718.975893
+349285.407160 7398596.836814
+349296.572556 7398517.010488
+Region 1
+99
+331947.773195 7394622.227629
+331988.954871 7394549.330116
+332010.592980 7394503.887899
+332039.141430 7394433.629934
+332046.257927 7394412.353578
+332069.438082 7394323.538792
+332074.946564 7394302.732356
+332083.201041 7394265.448742
+332094.218005 7394242.042751
+332110.743451 7394207.368691
+332124.506410 7394190.031660
+332140.116525 7394177.893739
+332174.998080 7394148.418788
+332195.193099 7394138.010571
+332216.303449 7394128.482203
+332237.306599 7394120.463577
+332320.016292 7394088.599035
+332383.363836 7394063.463340
+332403.558855 7394053.924974
+332422.838542 7394046.116312
+332451.288038 7394042.966851
+332485.246016 7394039.187498
+332506.513045 7394035.928057
+332622.026244 7394018.381062
+332680.590974 7394004.803388
+332776.849224 7393992.055572
+332834.737763 7393981.237425
+332883.440001 7393972.568910
+332893.986930 7393999.964217
+332939.159782 7394131.901617
+332953.747364 7394225.305618
+332962.933665 7394266.918490
+332960.171177 7394312.870619
+332953.747364 7394354.483491
+332940.017390 7394392.426992
+332928.043863 7394424.711462
+332915.196236 7394446.377750
+332903.865915 7394463.394836
+332868.382384 7394516.605721
+332787.783726 7394657.381607
+332744.119935 7394737.757840
+332726.613187 7394771.852000
+332731.049659 7394775.561364
+332743.922025 7394787.569307
+332759.020873 7394808.995637
+332780.147716 7394841.380090
+332812.101860 7394889.331876
+333003.983401 7395244.701005
+333055.472865 7395340.264636
+333089.109240 7395412.862200
+333099.087179 7395434.388513
+333153.619502 7395514.324821
+333200.021042 7395602.029798
+333213.718031 7395626.335634
+333219.548116 7395644.492524
+333223.860895 7395658.210175
+333227.151141 7395675.497213
+333239.281346 7395834.849918
+333244.831059 7395918.725551
+333252.038265 7396000.001629
+333260.902963 7396133.828705
+333263.723174 7396222.513514
+333226.928493 7396231.451983
+333185.812787 7396242.400108
+333078.718989 7396269.485469
+332929.998220 7396307.788908
+332916.062090 7396308.218834
+332896.856619 7396295.920940
+332818.270040 7396299.800276
+332794.694067 7396302.709778
+332685.670652 7396309.468620
+332629.662253 7396310.678413
+332556.006921 7396291.221745
+332484.833704 7396236.451127
+332453.027993 7396212.135292
+332359.392044 7396139.707698
+332277.358541 7396076.498526
+332198.120511 7396013.299351
+332181.141522 7396000.001629
+332132.233128 7395962.258094
+332053.440394 7395902.098399
+331999.996573 7395867.714288
+331982.126992 7395846.967842
+331942.611054 7395642.872802
+331874.051893 7395596.040824
+331841.883347 7395554.207989
+331836.449081 7395438.667780
+331825.168237 7395322.887612
+331823.362313 7395226.394141
+331821.102846 7395148.427496
+331827.798785 7395101.795483
+331833.068126 7395065.111767
+331835.855352 7395053.303789
+331841.132940 7395038.176381
+331842.831663 7394977.996689
+331833.059880 7394948.131805
+331819.131997 7394908.448602
+331882.858867 7394780.830462
+331947.773195 7394622.227629
+Region 1
+97
+331982.126992 7395846.967842
+331999.996573 7395867.714288
+332053.440394 7395902.098399
+332132.233128 7395962.258094
+332181.141522 7396000.001629
+332198.120511 7396013.299351
+332277.358541 7396076.498526
+332359.392044 7396139.707698
+332453.027993 7396212.135292
+332484.833704 7396236.451127
+332556.006921 7396291.221745
+332629.662253 7396310.678413
+332685.670652 7396309.468620
+332492.832548 7396624.534652
+332439.479436 7396805.113720
+332399.608911 7396868.092933
+332328.617111 7396927.462763
+332281.968184 7396961.047010
+332224.120876 7396972.245092
+332169.167995 7396976.304397
+332016.959070 7397003.399756
+331995.799242 7397004.029648
+331968.693882 7397002.339937
+331765.383065 7396968.455741
+331762.670055 7397072.437930
+331759.816860 7397168.441486
+331704.319727 7397269.404192
+331651.486128 7397365.547723
+331604.202241 7397438.875163
+331573.072720 7397497.215170
+331509.568498 7397617.484569
+331436.457417 7397744.902743
+331363.659693 7397880.439527
+331328.110193 7397965.235002
+331299.471034 7397999.999047
+331296.741531 7398008.977509
+331274.542678 7398041.781890
+331254.331167 7398071.996715
+331236.445093 7398106.750762
+331198.372246 7398138.695290
+331139.568375 7398194.775684
+331110.789030 7398177.908573
+331066.622219 7398158.281935
+331057.691551 7398153.602736
+330981.331455 7398110.820065
+330942.928759 7398062.308374
+330871.334985 7397986.731320
+330793.482321 7397889.997889
+330734.769159 7397825.039016
+330692.136147 7397777.527155
+330657.411269 7397734.804473
+330635.162939 7397701.900109
+330607.991609 7397652.518568
+330587.466741 7397611.735553
+330578.197978 7397586.129939
+330567.073813 7397547.076629
+330551.719331 7397477.308579
+330510.001650 7397294.999807
+330498.926963 7397245.178341
+330480.999657 7397149.084801
+330476.084904 7397134.487302
+330459.213116 7397083.336063
+330458.149352 7396984.532987
+330457.456669 7396919.554118
+330458.767819 7396868.192915
+330456.722754 7396819.181311
+330460.450050 7396713.489415
+330466.247150 7396616.925955
+330429.559670 7396542.708668
+330363.523855 7396390.924667
+330293.109292 7396239.940529
+330222.059769 7396074.118933
+330213.722829 7396052.872572
+330285.110448 7395986.443951
+330362.567293 7395907.877409
+330423.861525 7395852.816840
+330470.469221 7395823.501862
+330517.810831 7395795.986575
+330600.330861 7395744.005479
+330654.788968 7395703.852356
+330729.062767 7395661.199662
+330781.112975 7395641.623016
+330853.061338 7395616.997234
+330952.156291 7395579.213706
+331010.110800 7395563.586383
+331082.100394 7395564.196278
+331134.488697 7395563.576384
+331270.823628 7395558.717217
+331370.034029 7395558.257296
+331500.002871 7395553.918039
+331590.546483 7395552.708246
+331713.918340 7395552.948205
+331806.003997 7395552.498282
+331841.883347 7395554.207989
+331874.051893 7395596.040824
+331942.611054 7395642.872802
+331982.126992 7395846.967842
+Region 1
+219
+335156.216615 7400192.113558
+335258.593568 7400348.396788
+335292.353637 7400398.358230
+335373.463561 7400535.854678
+335400.956494 7400621.100076
+335410.588092 7400678.850184
+335425.711679 7400823.225454
+335446.723074 7400938.995624
+335449.089742 7400984.777782
+335470.290801 7401032.279645
+335482.891042 7401078.571716
+335499.639136 7401130.622800
+335525.449838 7401190.002629
+335555.342424 7401264.669839
+335593.266839 7401358.003851
+335603.088100 7401380.769952
+335672.521362 7401553.330394
+335623.283119 7401573.077011
+335496.522061 7401625.518029
+335479.336916 7401617.959323
+335466.967570 7401608.330973
+335345.962382 7401691.516724
+335334.961910 7401700.455193
+335242.158831 7401759.575066
+335176.156001 7401802.197765
+335121.079426 7401837.441728
+335046.220144 7401888.822927
+335172.626614 7402004.713076
+335221.320606 7402042.096673
+335299.527857 7402188.171651
+335333.469343 7402249.651120
+335363.930919 7402293.653583
+335314.783384 7402304.251768
+335191.320819 7402326.877892
+335135.246450 7402341.135450
+335075.733404 7402353.433343
+335019.659035 7402365.731237
+335001.459604 7402367.700899
+334969.002440 7402374.089805
+334891.776490 7402389.337193
+334793.704069 7402411.423410
+334665.211303 7402435.339314
+334607.965970 7402447.867168
+334482.046028 7402473.942701
+334377.640502 7402474.472610
+334383.891145 7402451.776498
+334381.227612 7402411.963318
+334383.891145 7402300.952333
+334379.256763 7402229.984489
+334359.581257 7402151.287969
+334277.110704 7402221.205993
+334249.403369 7402244.242047
+334197.270699 7402308.181095
+334132.339879 7402341.135450
+334108.318609 7402360.422146
+334081.683284 7402366.711069
+334022.656765 7402375.569552
+333935.106534 7402371.140310
+333895.763768 7402354.423174
+333867.231810 7402319.499156
+333798.136643 7402290.464129
+333765.003289 7402271.497378
+333742.952868 7402258.219653
+333701.466081 7402224.075501
+333563.259256 7402105.045890
+333512.107887 7402089.308586
+333449.147916 7402093.737827
+333376.861458 7402093.727829
+333242.818979 7402071.341663
+333169.303833 7402072.081536
+333080.269281 7402069.132042
+333019.280159 7402056.344232
+332971.080941 7402036.667603
+332944.618786 7402024.779639
+332919.327597 7402009.322287
+332893.351971 7401985.846308
+332871.548937 7401962.030387
+332850.916868 7401934.405119
+332837.417788 7401915.998272
+332791.766655 7401840.901136
+332769.576049 7401817.455152
+332747.360703 7401798.968318
+332686.585983 7401761.494737
+332584.637834 7401705.004413
+332547.999831 7401686.017666
+332497.706070 7401666.161067
+332390.439102 7401654.613045
+332322.193297 7401649.483924
+332273.260165 7401648.704057
+332210.308440 7401645.144667
+332096.526949 7401640.395480
+332001.621081 7401630.527171
+331951.780863 7401620.538882
+331925.302216 7401611.560420
+331904.117650 7401602.991887
+331877.944114 7401587.154600
+331848.043281 7401567.807914
+331783.508280 7401512.197439
+331754.151699 7401495.290336
+331715.023335 7401484.622163
+331626.961838 7401471.274449
+331558.476892 7401457.046886
+331390.558897 7401423.512630
+331419.940217 7401353.414638
+331445.140698 7401291.545235
+331461.525958 7401252.471928
+331482.479630 7401230.405708
+331499.837946 7401204.040224
+331509.271634 7401188.382906
+331585.549267 7401091.649476
+331665.240840 7400988.817090
+331689.047708 7400963.191479
+331709.869441 7400950.923581
+331654.636188 7400835.513349
+331703.668275 7400807.538141
+331750.267724 7400781.452609
+331800.940812 7400753.797347
+331844.728297 7400724.142426
+331865.459320 7400710.894695
+331887.658173 7400696.707126
+331932.913487 7400666.042378
+331996.623865 7400626.879087
+332030.219009 7400601.613414
+332036.057340 7400580.637007
+332051.683947 7400531.615404
+332094.259236 7400400.557853
+332099.413130 7400382.880881
+332109.729165 7400346.787064
+332122.989103 7400304.054383
+332147.298991 7400223.768136
+332182.642336 7400104.008649
+332204.733988 7400048.868095
+332227.097765 7399999.996466
+332230.420996 7399994.147468
+332242.889297 7399974.100902
+332268.337165 7399932.238072
+332290.239153 7399894.174592
+332323.570418 7399841.403631
+332437.838436 7399655.405491
+332408.448870 7399636.028810
+332393.003680 7399623.540949
+332375.777304 7399606.983785
+332356.299707 7399582.028060
+332344.911663 7399567.770502
+332322.119081 7399546.374167
+332286.149023 7399519.348796
+332261.583502 7399501.241898
+332237.760142 7399486.194475
+332216.987887 7399478.235839
+332203.546531 7399473.656623
+331999.996573 7399428.104426
+331940.846361 7399415.636561
+331868.493933 7399398.089567
+331653.852796 7399351.307580
+331630.260330 7399256.933746
+331561.841354 7399202.673040
+331571.275042 7399153.131526
+331658.569640 7399122.466779
+331490.833062 7399082.843566
+331595.857056 7398431.905066
+331543.237858 7398430.295341
+331451.028507 7398392.191868
+331325.083826 7398366.016352
+331190.513588 7398378.574201
+331166.014037 7398379.634019
+331157.124600 7398323.783586
+331542.536928 7398255.255324
+331752.411744 7398227.770032
+332221.201710 7398166.210577
+333145.323794 7398119.288614
+333595.650450 7398089.513714
+334098.390147 7398060.788635
+334304.290280 7398055.099609
+334441.524051 7398082.554906
+334606.209523 7398132.456359
+334733.465354 7398142.434649
+334783.082924 7398135.865775
+334771.043428 7398197.235263
+334762.492086 7398231.399410
+334753.948991 7398257.025021
+334748.259092 7398281.220877
+334739.715997 7398302.577218
+334726.901355 7398323.933560
+334711.241763 7398343.860147
+334645.131732 7398434.794571
+334548.955944 7398558.803329
+334534.731196 7398587.278452
+334523.343151 7398614.323819
+334517.653252 7398629.981137
+334516.226654 7398647.068210
+334513.381705 7398668.414554
+334519.071604 7398691.190652
+334519.071604 7398723.935044
+334510.528509 7398968.773105
+334514.668117 7398970.572797
+334573.150384 7398996.638332
+334697.421080 7399062.287087
+334782.728336 7399107.689310
+334796.845883 7399114.848084
+334934.590920 7399186.895743
+334971.534033 7399206.242429
+335001.937886 7399222.069718
+335015.882262 7399230.488276
+335036.143250 7399247.815308
+335047.778682 7399261.822908
+335057.896807 7399278.110118
+335069.260113 7399302.785892
+335078.339213 7399332.290838
+335083.072549 7399376.013348
+335083.806463 7399388.971129
+335087.286373 7399424.545035
+335109.806829 7399709.466231
+335110.293356 7399724.213705
+335110.021231 7399736.661573
+335100.002060 7399800.920566
+335075.782881 7400000.986296
+335064.856625 7400045.458679
+335131.469677 7400128.174510
+335156.216615 7400192.113558
+Region 1
+169
+329337.247466 7384055.727575
+329389.660508 7384135.743869
+329418.192466 7384185.275384
+329325.240955 7384299.225866
+329294.177404 7384337.399327
+329237.336136 7384404.307866
+329207.138439 7384433.322896
+329185.698240 7384455.779050
+329163.969422 7384467.667013
+329115.728972 7384500.821334
+329067.719418 7384537.415066
+329045.223700 7384559.041362
+329029.423923 7384586.256700
+328985.356066 7384745.199474
+328971.403444 7384809.698426
+328955.578927 7384871.227887
+328935.524094 7384944.955258
+328879.532188 7385055.116388
+328846.736929 7385106.097656
+328806.643755 7385165.677450
+328750.503417 7385241.284500
+328667.909171 7385322.490590
+328566.142439 7385405.706336
+328512.203844 7385445.219567
+328429.551874 7385503.209634
+328387.248711 7385548.991792
+328337.119875 7385595.063900
+328319.720328 7385617.080129
+328313.519163 7385621.769326
+328175.370061 7385781.361989
+328138.723812 7385865.967497
+328098.490452 7385935.395605
+328019.277161 7386040.087672
+327884.583229 7386123.873320
+327838.288891 7386174.204699
+327814.317098 7386188.692217
+327793.099547 7386197.130772
+327770.298719 7386203.059756
+327742.583138 7386202.979770
+327718.924702 7386193.261435
+327699.026547 7386200.110261
+327615.162382 7386198.190590
+327550.627381 7386191.981654
+327490.759746 7386188.902181
+327460.586788 7386194.431234
+327449.850196 7386192.871501
+327415.257258 7386206.799116
+327376.351542 7386222.096495
+327327.335947 7386242.383020
+327253.977479 7386281.536314
+327176.561866 7386321.019551
+327127.026759 7386347.694981
+327067.678637 7386380.759318
+327000.702751 7386416.073269
+326979.559416 7386434.350138
+326962.836060 7386453.616838
+326924.392133 7386496.289529
+326854.233202 7386589.153622
+326763.062876 7386705.723654
+326706.543212 7386745.806789
+326616.106800 7386772.642192
+326560.436497 7386791.488964
+326475.186965 7386824.303343
+326410.421069 7386736.738342
+326342.389666 7386633.066100
+326212.808398 7386526.164411
+326054.076704 7386441.938838
+325862.953816 7386380.389381
+325644.890493 7386305.162267
+325597.309742 7386279.966583
+325450.724746 7386158.887323
+325168.885075 7385841.411703
+324995.252443 7385632.497488
+324553.378174 7385115.766000
+324455.866496 7385012.963609
+324316.892771 7384827.445386
+324180.838212 7384658.984242
+324045.080517 7384462.247941
+323987.744475 7384344.708075
+323928.148966 7384066.155788
+323921.807615 7383874.558607
+323953.341201 7383679.621998
+324019.278061 7383516.219987
+324125.341079 7383355.677487
+324269.394483 7383182.247194
+324348.484081 7383072.525988
+324485.470464 7382897.405985
+324599.796206 7382757.349975
+324623.660797 7382735.833661
+324650.749665 7382703.469204
+324700.227049 7382661.306426
+324745.061805 7382623.522898
+324804.228510 7382580.330297
+324864.640396 7382538.017545
+324964.658927 7382475.868190
+325076.791171 7382399.131335
+325111.738697 7382373.155784
+325185.905295 7382317.925245
+325277.240546 7382239.388697
+325337.413291 7382165.011437
+325414.235176 7382062.818942
+325464.166102 7381997.030211
+325543.808198 7381883.059733
+325574.863503 7381821.520274
+325675.096436 7381885.109382
+325723.848152 7381832.018476
+325775.716942 7381892.528111
+325819.331256 7381952.747796
+325833.869361 7381960.826412
+325874.432569 7382009.048152
+325902.032703 7382037.573266
+325970.863991 7382108.621096
+326039.142780 7382157.762679
+326083.862089 7382197.585858
+326137.462588 7382245.847591
+326198.039399 7382307.826974
+326243.286466 7382331.292955
+326316.141914 7382347.000264
+326423.458360 7382375.945306
+326508.947033 7382405.470249
+326564.427673 7382431.355815
+326647.788818 7382470.839052
+326665.419259 7382478.457747
+326669.756777 7382480.637373
+326755.286681 7382529.538997
+326804.425969 7382556.034459
+326932.926982 7382626.382409
+327180.528303 7382767.468242
+327277.800840 7382820.989074
+327378.330637 7382888.947434
+327405.493721 7382905.344625
+327458.129411 7382945.517744
+327554.593818 7383012.766225
+327666.833263 7383082.854219
+327693.617020 7383109.169712
+327745.650735 7383142.234048
+327811.620581 7383190.605762
+327927.282212 7383286.069410
+327999.997474 7383347.198939
+328011.806076 7383355.327547
+328042.449069 7383379.913336
+328069.216334 7383385.992294
+328109.260030 7383384.292585
+328155.051348 7383375.564081
+328248.423418 7383356.857285
+328346.932889 7383334.361138
+328402.867072 7383323.223046
+328432.767904 7383315.324399
+328488.908242 7383300.047016
+328545.056827 7383269.132311
+328576.499704 7383239.557377
+328582.552438 7383233.858353
+328636.491032 7383208.842638
+328673.046573 7383210.022436
+328723.958801 7383228.089342
+328772.372421 7383294.108033
+328844.370261 7383390.861460
+328863.691179 7383416.697035
+328885.988987 7383449.441426
+328926.609919 7383502.902269
+328969.457333 7383568.301066
+329014.687908 7383623.311644
+329064.107569 7383690.260176
+329073.392824 7383703.307941
+329148.903558 7383805.420450
+329177.740627 7383845.093654
+329208.111494 7383884.246948
+329282.137907 7383981.070363
+329337.247466 7384055.727575
+Region 1
+239
+322073.266583 7401813.385849
+322102.252084 7401807.756813
+322136.193569 7401797.948493
+322176.608345 7401773.282718
+322202.930314 7401755.055840
+322219.711393 7401743.287856
+322250.610019 7401711.743259
+322282.267299 7401682.098337
+322351.296495 7401634.646465
+322414.017326 7401595.343197
+322459.338609 7401582.975316
+322530.396379 7401561.349020
+322599.417329 7401539.722725
+322642.322467 7401394.177655
+322685.450254 7401282.586770
+322778.550198 7401112.815850
+322839.209470 7401034.459272
+322907.884079 7400952.313343
+323098.223575 7400754.237271
+323148.566813 7400696.057237
+323211.130965 7400618.090592
+323236.306707 7400586.136065
+323267.601152 7400543.913298
+323362.210157 7400397.778329
+323442.495458 7400303.044556
+323610.446438 7400065.355270
+323889.193772 7399748.599528
+324152.108344 7399463.518360
+324347.552257 7399235.407433
+324392.205596 7399056.798027
+324343.082800 7399027.772999
+324280.576371 7398954.105617
+324166.712419 7398772.156784
+324101.971262 7398696.249786
+323992.576766 7398611.404319
+323878.712813 7398544.435790
+323748.999605 7398458.030591
+323728.713878 7398532.747792
+323743.070565 7398541.736253
+323786.709618 7398579.659757
+323806.566541 7398597.366724
+323818.498837 7398619.242976
+323818.836933 7398640.789286
+323806.566541 7398658.686220
+323786.676633 7398674.933437
+323790.659562 7398636.480024
+323778.727267 7398615.593602
+323760.173248 7398607.634965
+323738.634093 7398607.974907
+323705.071935 7398620.162819
+323683.351363 7398683.611951
+323671.773655 7398722.585275
+323655.990370 7398757.779246
+323633.370959 7398796.822559
+323619.022518 7398818.258887
+323600.880810 7398842.014818
+323563.830496 7398887.996941
+323539.199005 7398909.883192
+323512.679127 7398932.529313
+323489.952516 7398952.495893
+323458.855980 7398976.321812
+323417.863967 7398998.288049
+323386.371612 7399017.544751
+323336.251023 7399042.230522
+323290.649367 7399060.407409
+323253.409390 7399072.815284
+323224.506351 7399080.224015
+323196.007378 7399089.912355
+323152.656943 7399100.450550
+323118.797920 7399107.119408
+323082.283611 7399112.658459
+323033.202046 7399119.787238
+322955.530800 7399123.646577
+322869.143288 7399131.745189
+322758.734505 7399139.843802
+322580.162381 7399152.961555
+322464.888323 7399161.410108
+322392.972945 7399167.499065
+322193.109053 7399181.566655
+322094.170778 7399192.034862
+321966.222263 7399200.423425
+321908.779020 7399203.722860
+321879.859489 7399206.542377
+321759.951050 7399215.590827
+321670.273291 7399221.439826
+321568.201448 7399228.868553
+321436.335974 7399243.815993
+321339.813844 7399265.572266
+321260.963387 7399303.635746
+321202.720260 7399351.847488
+321113.496044 7399453.210125
+321044.796697 7399541.534996
+320963.241476 7399650.296366
+320901.411238 7399755.218394
+320873.505994 7399825.656329
+320857.203196 7399889.555383
+320866.076140 7399938.087070
+320862.893095 7399944.915901
+320848.124096 7400288.097117
+320836.678328 7400380.111356
+320829.141273 7400428.203118
+320811.123259 7400473.505358
+320790.466451 7400507.589520
+320771.063070 7400550.142231
+320754.413931 7400594.194685
+320693.886598 7400620.600162
+320651.492726 7400648.615363
+320599.071438 7400661.123221
+320519.247925 7400668.371979
+320401.681415 7400673.761056
+320114.737327 7400659.133562
+320064.121963 7400654.034435
+319955.618060 7400676.660559
+319878.598266 7400706.155507
+319793.307503 7400752.737528
+319724.171105 7400814.606930
+319686.659002 7400863.178611
+319632.967794 7400964.561245
+319619.592408 7401009.053623
+319504.029731 7401386.588955
+319411.309114 7401537.023187
+319367.051594 7401603.181855
+319310.070140 7401670.730284
+319248.462551 7401745.287513
+319220.928387 7401818.165030
+319183.886319 7401872.285760
+319161.522542 7401936.154819
+319144.263181 7401997.034391
+319141.649126 7402069.651953
+319147.693613 7402142.369497
+319168.309189 7402235.913473
+319193.682841 7402307.811158
+319206.448006 7402364.951370
+319210.150564 7402411.413412
+319223.410503 7402471.583105
+319235.128396 7402533.752456
+319236.200406 7402590.782688
+319235.318060 7402638.194566
+319218.281347 7402670.319064
+319198.556363 7402721.580283
+319185.972615 7402769.392093
+319151.569341 7402810.924979
+319112.993474 7402867.045366
+319053.686583 7402905.808726
+319076.940954 7402940.782736
+319089.722611 7402957.949795
+319251.868245 7402978.646250
+319392.161367 7402959.099598
+319553.160774 7403009.700931
+319801.990783 7403122.831552
+320024.746212 7403086.307809
+320154.047108 7403020.469086
+320162.441771 7402998.272888
+320167.793575 7402987.434745
+320179.701132 7402972.937228
+320191.625181 7402969.117882
+320205.957130 7402973.797081
+320228.700234 7402978.326305
+320255.508730 7402983.415433
+320273.749393 7402984.805195
+320298.504577 7402985.275115
+320315.302149 7402983.895351
+320337.608203 7402978.886209
+320436.727895 7402942.572429
+320477.307596 7402925.625332
+320500.182640 7402922.055943
+320515.182533 7402910.117988
+320551.746320 7402899.129871
+320563.282797 7402896.090391
+320583.428338 7402897.310182
+320591.023117 7402898.150038
+320613.700251 7402903.089192
+320633.854039 7402904.129014
+320663.136404 7402905.098848
+320684.469402 7402905.048857
+320702.058612 7402904.139013
+320734.392083 7402893.740794
+320783.655065 7402888.311724
+320830.163805 7402903.879057
+320970.762038 7402996.433203
+320965.764822 7402952.980646
+320955.374572 7402859.886593
+320943.780371 7402760.803565
+320967.983058 7402641.923928
+320956.413597 7402398.905554
+320935.740296 7402369.620571
+320911.653057 7402335.736375
+320906.845504 7402318.099396
+320935.740296 7402205.548675
+320921.136222 7402173.344191
+320849.410508 7402100.326698
+320797.805596 7402084.789360
+320773.751342 7402068.752107
+320765.736005 7402062.343205
+320751.305102 7402033.478149
+320746.497549 7402003.013367
+320749.705333 7401972.548586
+320780.166909 7401932.455453
+320828.522806 7401898.461276
+320872.607155 7401918.327873
+320932.227402 7401834.502232
+320995.566700 7401836.361913
+321014.186689 7401843.190743
+321025.368577 7401847.539998
+321039.032581 7401850.019574
+321050.832938 7401846.920105
+321054.560234 7401836.981807
+321104.853994 7401830.772870
+321150.373188 7401833.722365
+321168.820006 7401818.354997
+321208.550345 7401796.478745
+321237.758494 7401781.761266
+321267.626341 7401764.254264
+321278.956662 7401756.015676
+321302.648083 7401743.657792
+321368.568451 7401720.991675
+321436.550376 7401702.454850
+321473.633675 7401691.126791
+321494.216267 7401690.096967
+321517.899441 7401704.144561
+321533.369370 7401728.200440
+321559.122348 7401735.409205
+321583.836302 7401740.558323
+321594.144090 7401735.409205
+321620.919601 7401710.693439
+321677.571205 7401693.186438
+321744.514106 7401672.579967
+321788.796364 7401708.633792
+321834.125894 7401746.747263
+321863.573184 7401754.785886
+321884.164022 7401759.805027
+321908.276000 7401775.582324
+321916.942789 7401784.310829
+321930.276944 7401797.318601
+321947.437350 7401803.467548
+321976.043524 7401805.457207
+322011.122989 7401806.327058
+322045.245891 7401815.905417
+322073.266583 7401813.385849
+Region 1
+355
+343659.482271 7390595.647346
+343657.057879 7390606.285523
+343648.292136 7390625.042311
+343623.965756 7390672.784133
+343581.283266 7390750.190874
+343537.767907 7390829.067363
+343523.873008 7390860.571967
+343496.000748 7390918.891977
+343475.591328 7390947.437087
+343437.444265 7390999.768123
+343408.961784 7391033.782297
+343373.362806 7391080.464301
+343339.635723 7391127.716207
+343317.519332 7391155.361472
+343282.769716 7391190.905383
+343256.827075 7391203.183280
+343211.687208 7391219.330514
+343161.929452 7391237.497403
+343064.780609 7391314.114279
+342971.581710 7391382.822510
+342888.649369 7391443.642092
+342883.916032 7391447.591415
+342864.166310 7391465.758304
+342828.699272 7391490.654039
+342812.223303 7391514.969874
+342768.221416 7391525.878006
+342747.102820 7391532.316903
+342627.400536 7391563.001647
+342477.888128 7391601.765007
+342316.039359 7391641.988117
+342167.532991 7391680.431532
+342024.733015 7391717.365206
+341884.794481 7391742.980818
+341733.146299 7391770.296139
+341619.298839 7391797.421493
+341566.572440 7391810.609234
+341513.582162 7391822.747155
+341459.742522 7391838.884390
+341392.337833 7391855.461551
+341213.452352 7391901.733625
+341113.219418 7391926.309415
+341092.612088 7391744.560547
+341093.214062 7391743.520725
+341085.932641 7391678.021945
+341078.148199 7391636.499057
+341072.103712 7391551.963537
+341067.032280 7391500.942277
+341059.379778 7391432.014084
+341046.804276 7391322.802791
+340930.705595 7391331.491302
+340843.542937 7391339.929857
+340804.777407 7391332.021212
+340725.349713 7391314.904144
+340691.870017 7391304.655899
+340626.164051 7391286.219057
+340596.609560 7391278.570367
+340568.176557 7391268.302126
+340506.552476 7391251.325034
+340511.310551 7391223.279838
+340529.221364 7391147.782770
+340410.277733 7391129.335930
+340349.915324 7391121.197324
+340314.423548 7391117.457964
+340232.505492 7391111.129048
+340266.917013 7391014.555590
+340275.567309 7390995.018937
+340324.607643 7390861.331836
+340338.057245 7390822.568476
+340382.355996 7390706.278396
+340561.925914 7390371.665712
+340624.424096 7390291.769397
+340644.198558 7390268.033463
+340682.172450 7390220.571593
+340717.771427 7390174.689452
+340743.087355 7390150.953518
+340808.743844 7390075.806390
+340813.378225 7390063.258539
+340841.967907 7390023.595333
+340878.589417 7389978.523053
+340921.238922 7389933.500765
+340952.962172 7389897.946855
+341001.012958 7389875.840642
+341145.124084 7389816.100875
+341187.410755 7389796.864170
+341263.968761 7389722.146968
+341284.089563 7389697.291226
+341296.895959 7389736.724471
+341350.117132 7389721.037158
+341339.322816 7389695.031613
+341336.510852 7389677.084687
+341370.650246 7389672.065547
+341391.974999 7389670.485817
+341413.299751 7389658.637847
+341517.556845 7389562.274353
+341544.414819 7389541.737871
+341564.947933 7389529.889900
+341673.154971 7389469.080316
+341763.195564 7389422.478299
+341766.139468 7389367.297751
+341765.141674 7389326.894672
+341764.267574 7389305.918265
+341762.791499 7389276.763259
+341758.998232 7389243.728917
+341755.460600 7389222.722515
+341750.760248 7389203.965728
+341835.127434 7389156.403875
+341819.459596 7389102.823053
+341806.372828 7389056.141049
+341797.623577 7389026.666098
+341787.670376 7388999.930678
+341756.870705 7388954.908389
+341726.071033 7388909.896100
+341707.904587 7388880.671106
+341695.263116 7388849.866382
+341669.839987 7388842.297679
+341672.363333 7388794.575853
+341674.730001 7388702.171681
+341673.938363 7388533.150633
+341681.294001 7388514.493828
+341691.321418 7388493.227471
+341712.456507 7388464.112458
+341738.316686 7388451.324649
+341795.595004 7388523.822231
+341822.057158 7388549.687800
+341833.577142 7388560.225995
+341850.613855 7388570.484238
+341856.905729 7388573.763676
+341878.791225 7388578.432876
+341897.749309 7388580.742481
+341939.269081 7388582.522176
+341980.203370 7388581.972270
+341993.595248 7388579.682662
+342013.262508 7388572.913822
+342034.735693 7388559.856058
+342061.898777 7388539.109612
+342073.773349 7388526.611753
+342080.790891 7388519.372993
+342097.448277 7388526.531766
+342109.124940 7388531.980833
+342119.853286 7388540.289410
+342125.831803 7388544.448697
+342134.366652 7388548.308036
+342147.535882 7388557.306495
+342165.520911 7388564.485265
+342189.830799 7388571.724025
+342203.503049 7388572.423906
+342216.911420 7388568.804526
+342231.581465 7388561.435788
+342245.921660 7388547.408191
+342275.204025 7388510.514510
+342300.717862 7388472.251064
+342332.853423 7388426.528896
+342354.136944 7388393.084625
+342377.399561 7388355.461069
+342398.641851 7388325.676171
+342416.585649 7388308.929040
+342448.762441 7388296.651143
+342459.028998 7388290.452205
+342470.573721 7388280.493911
+342509.809287 7388256.887954
+342544.245546 7388233.671931
+342613.629330 7388188.009752
+342652.271167 7388162.624101
+342677.174784 7388143.957298
+342706.283978 7388122.450982
+342800.109590 7388062.331280
+342837.498000 7388039.365214
+342878.993033 7388014.559463
+342908.737187 7387991.843354
+342949.053008 7387962.928307
+342968.472881 7387950.290471
+343020.283949 7387915.526426
+343068.829508 7387880.052502
+343142.633273 7387830.670961
+343178.446652 7387803.035695
+343199.202415 7387789.637990
+343211.909856 7387784.458877
+343224.905916 7387781.499384
+343237.390709 7387778.419911
+343263.935326 7387757.883429
+343295.320479 7387724.229194
+343313.536403 7387710.131608
+343334.300412 7387696.513941
+343358.156757 7387688.575301
+343377.584876 7387685.015911
+343385.888831 7387681.896445
+343391.949810 7387677.857137
+343400.938201 7387667.548902
+343411.534608 7387650.051900
+343426.031481 7387630.605231
+343439.843918 7387617.907406
+343451.330917 7387612.268371
+343463.403399 7387609.968765
+343479.829890 7387610.358699
+343509.862662 7387616.447656
+343632.310941 7387646.112574
+343655.128261 7387650.121888
+343680.089601 7387653.601292
+343700.103203 7387652.811427
+343721.378478 7387648.062240
+343747.848879 7387634.724525
+343761.265496 7387630.435260
+343781.938796 7387625.006190
+343790.580846 7387618.127368
+343799.247634 7387599.940483
+343806.759950 7387584.633105
+343812.227201 7387579.264025
+343819.772502 7387580.003898
+343825.454155 7387582.943395
+343832.727331 7387589.892204
+343843.298998 7387602.959966
+343853.392385 7387613.808108
+343871.327936 7387625.296140
+343889.296473 7387634.354588
+343916.055491 7387651.031732
+343928.325883 7387658.470457
+343940.423103 7387662.699733
+343955.612660 7387664.409440
+343977.753789 7387664.979343
+343989.166572 7387666.319113
+344002.789345 7387671.228272
+344014.160897 7387676.327399
+344024.806781 7387683.086241
+344034.652780 7387687.955407
+344040.952901 7387690.904902
+344047.871488 7387692.524624
+344062.442578 7387694.234331
+344076.758034 7387692.174684
+344105.380701 7387687.495486
+344121.823685 7387685.675797
+344151.040080 7387682.886275
+344210.041860 7387681.306546
+344234.747567 7387680.566673
+344257.251531 7387685.575815
+344280.044112 7387691.244844
+344298.400221 7387692.654602
+344315.552381 7387691.844741
+344328.251576 7387687.885419
+344340.035440 7387683.356195
+344349.535098 7387682.126405
+344356.577379 7387682.206392
+344363.487720 7387684.825943
+344372.591559 7387692.454636
+344377.324895 7387698.593585
+344383.921880 7387701.763042
+344390.815728 7387705.932328
+344400.636989 7387713.351057
+344410.367541 7387719.769957
+344418.589033 7387723.619298
+344427.132128 7387726.478808
+344438.256293 7387726.268844
+344447.475579 7387722.929416
+344452.860368 7387716.010601
+344461.263277 7387703.252787
+344470.243422 7387693.274496
+344479.479200 7387688.605296
+344491.963993 7387685.305861
+344504.935314 7387684.116065
+344531.867504 7387684.735958
+344557.249401 7387687.555475
+344581.617013 7387689.695109
+344618.065353 7387687.865422
+344628.884407 7387688.315345
+344640.882673 7387692.214677
+344663.510330 7387698.673571
+344654.117873 7387748.874972
+344643.826577 7387769.441449
+344625.643638 7387801.086029
+344607.435961 7387817.693184
+344584.503194 7387839.849389
+344582.919917 7387844.588577
+344545.745910 7387891.260583
+344527.546479 7387923.695027
+344507.772018 7387941.102045
+344482.621014 7387943.091704
+344469.798125 7387959.298928
+344455.342483 7387976.805930
+344449.512398 7387993.163128
+344443.632836 7388015.229348
+344447.186961 7388048.063724
+344452.373840 7388067.560384
+344458.278141 7388091.256325
+344464.957588 7388113.822460
+344472.057593 7388130.669574
+344479.190582 7388143.687344
+344488.550054 7388164.373801
+344512.521846 7388204.886861
+344534.168202 7388220.074260
+344561.751843 7388247.759518
+344582.078802 7388276.164652
+344586.548259 7388288.412554
+344592.889610 7388305.999542
+344609.002745 7388338.943899
+344613.488695 7388350.041998
+344621.330860 7388369.948588
+344635.588593 7388396.004125
+344655.511486 7388429.358411
+344678.468992 7388462.742693
+344742.723621 7388539.519542
+344707.908035 7388601.258966
+344673.249128 7388648.450883
+344664.409169 7388659.439001
+344647.784768 7388685.894469
+344617.999383 7388724.997771
+344611.699262 7388735.276010
+344588.453138 7388761.841460
+344573.989250 7388775.309153
+344560.407708 7388785.597391
+344548.112578 7388790.206601
+344534.308388 7388794.015949
+344514.509188 7388794.235911
+344493.769918 7388786.457244
+344471.562819 7388776.338977
+344431.436661 7388767.270530
+344403.572647 7388770.320008
+344380.408985 7388786.367259
+344317.910803 7388845.687098
+344291.803237 7388866.263573
+344247.487993 7388878.311510
+344275.343761 7388937.651345
+344297.361196 7388985.803097
+344315.057607 7389024.316500
+344326.618823 7389052.931599
+344277.578489 7389086.155908
+344232.479854 7389121.769808
+344188.189349 7389145.835685
+344160.490260 7389157.373709
+344091.667219 7389207.995038
+343954.177816 7389319.795887
+343933.636455 7389312.687105
+343899.678477 7389324.535076
+343849.920722 7389339.542505
+343759.088491 7389370.347229
+343684.847676 7389396.412764
+343647.723146 7389408.260734
+343556.280694 7389407.100933
+343424.959471 7389450.123564
+343346.801697 7389492.776258
+343297.827333 7389533.839224
+343254.386190 7389578.071647
+343272.931963 7389623.483868
+343300.194002 7389686.283112
+343359.500892 7389827.928849
+343368.093465 7389852.134703
+343425.091411 7389976.823345
+343456.517796 7390055.299902
+343478.238368 7390108.400807
+343542.657921 7390260.874689
+343554.285107 7390292.379293
+343578.949582 7390359.227842
+343591.219974 7390388.512826
+343627.915700 7390476.117820
+343666.491567 7390554.604376
+343664.232100 7390573.751096
+343659.482271 7390595.647346
+Region 1
+938
+350975.719518 7389606.286814
+350975.348438 7389612.595734
+350973.633222 7389621.214257
+350969.336935 7389632.132387
+350963.267710 7389646.799875
+350957.149007 7389656.038292
+350951.178736 7389661.067431
+350945.546560 7389662.677155
+350933.779189 7389665.876607
+350930.291033 7389667.616309
+350926.992541 7389670.685783
+350922.927149 7389679.274312
+350918.111351 7389690.852329
+350916.396135 7389699.260889
+350915.051999 7389711.088863
+350916.800200 7389719.747379
+350919.834813 7389722.546900
+350925.236094 7389723.376758
+350929.004621 7389724.076638
+350932.764903 7389725.116460
+350934.579073 7389727.456059
+350936.657123 7389734.014936
+350936.995219 7389740.773778
+350939.724721 7389753.091668
+350939.155731 7389759.400587
+350936.558169 7389764.029794
+350931.429013 7389766.519368
+350926.002993 7389767.909130
+350917.517622 7389769.038936
+350905.379171 7389768.908958
+350898.229689 7389769.168914
+350894.642578 7389770.468691
+350891.550242 7389773.538166
+350890.585433 7389777.957409
+350889.101111 7389783.256501
+350889.035141 7389789.785383
+350891.335840 7389795.014487
+350894.065342 7389807.112415
+350894.222020 7389811.991579
+350892.836654 7389817.840577
+350888.062086 7389824.999351
+350880.945589 7389832.448075
+350871.899474 7389838.896970
+350862.259630 7389843.226229
+350855.192611 7389845.695806
+350849.379018 7389845.635816
+350841.833717 7389844.565999
+350833.199914 7389841.046602
+350826.908040 7389836.997296
+350818.051588 7389835.247595
+350812.633814 7389835.627530
+350808.337528 7389836.807328
+350805.039036 7389840.316727
+350803.340313 7389846.275706
+350802.350765 7389853.794418
+350801.715805 7389865.422427
+350800.190252 7389875.480704
+350797.139147 7389883.759286
+350792.991293 7389890.248174
+350791.102906 7389895.657248
+350789.923695 7389900.956340
+350791.696635 7389907.285256
+350797.287579 7389909.454884
+350809.203383 7389911.894466
+350825.217562 7389913.284228
+350848.364732 7389914.843961
+350855.695631 7389916.803625
+350859.645575 7389919.613144
+350861.253590 7389922.282687
+350860.931987 7389923.832422
+350859.991917 7389925.932062
+350855.951264 7389931.311140
+350851.217928 7389935.690390
+350844.109677 7389941.939320
+350836.811763 7389947.178423
+350813.202804 7389960.446150
+350797.617428 7389967.045020
+350785.858304 7389969.464605
+350778.395465 7389970.384448
+350769.423566 7389969.524595
+350760.369205 7389966.665085
+350754.794753 7389962.945722
+350746.185688 7389956.766780
+350742.219251 7389954.847109
+350736.158271 7389949.138087
+350729.157222 7389944.858820
+350716.062207 7389937.750038
+350701.804475 7389934.830538
+350691.537917 7389931.181163
+350679.135587 7389925.962057
+350672.332446 7389922.902581
+350657.604678 7389915.773802
+350646.241372 7389908.794997
+350632.247519 7389900.566407
+350625.436133 7389897.396950
+350619.333922 7389895.787225
+350613.330666 7389893.837559
+350606.296631 7389892.767743
+350599.674908 7389891.597943
+350594.809632 7389888.778426
+350589.936110 7389886.068890
+350584.592552 7389879.809962
+350577.096728 7389874.310904
+350568.446433 7389871.891319
+350563.762574 7389870.411572
+350560.694976 7389871.371408
+350558.839574 7389873.011127
+350557.874765 7389877.100426
+350557.833534 7389881.089743
+350557.792303 7389885.738947
+350557.239805 7389889.498303
+350555.788469 7389891.367982
+350553.025981 7389892.007873
+350547.113434 7389891.937885
+350542.215173 7389891.887893
+350539.658841 7389892.087859
+350536.780907 7389893.717580
+350532.781485 7389896.227150
+350527.635837 7389899.936515
+350525.483571 7389901.136309
+350524.559993 7389901.786198
+350521.492395 7389901.976165
+350519.158712 7389900.516415
+350515.225260 7389895.827219
+350510.805280 7389889.468308
+350503.655798 7389879.649990
+350496.893889 7389872.601197
+350486.149051 7389865.182468
+350477.325584 7389859.553432
+350469.384464 7389857.373805
+350458.590148 7389855.594110
+350451.358204 7389853.644444
+350448.109189 7389852.274679
+350446.913485 7389849.715117
+350443.887119 7389845.705804
+350436.729390 7389836.987297
+350430.651918 7389832.498066
+350421.102783 7389828.858690
+350406.127628 7389825.489267
+350390.938072 7389824.339464
+350377.241083 7389826.079166
+350370.470927 7389829.118645
+350365.185093 7389836.927308
+350360.196124 7389846.175723
+350357.441883 7389855.784078
+350355.281370 7389867.832014
+350354.596933 7389884.659132
+350356.444089 7389913.354216
+350359.247807 7389938.299943
+350364.137822 7389959.396330
+350367.988812 7389971.724218
+350368.467093 7389975.493572
+350367.502284 7389979.912815
+350364.607857 7389983.212250
+350358.027365 7389987.791466
+350352.568360 7389993.270527
+350347.043386 7390003.958697
+350345.550818 7390010.037655
+350344.017019 7390020.765818
+350343.299597 7390031.164037
+350341.807029 7390037.242995
+350340.083567 7390045.861519
+350338.541522 7390057.029606
+350337.535482 7390065.218203
+350332.975316 7390071.927054
+350325.669156 7390077.946023
+350306.241037 7390091.473706
+350289.509435 7390100.822105
+350279.853099 7390107.041040
+350268.976320 7390112.580091
+350260.268301 7390115.479594
+350252.698261 7390117.499248
+350244.534493 7390117.419262
+350235.875951 7390115.669562
+350225.815549 7390111.140337
+350220.455499 7390106.651106
+350216.332384 7390101.072062
+350208.861299 7390092.363554
+350202.198345 7390085.534723
+350193.061521 7390081.015497
+350182.052803 7390079.455765
+350171.909939 7390082.895175
+350162.657669 7390089.564033
+350151.846860 7390098.752459
+350142.380187 7390106.071206
+350136.426409 7390110.000533
+350125.368214 7390112.990021
+350106.863672 7390116.449428
+350099.483296 7390119.698871
+350091.682361 7390123.608202
+350084.928699 7390125.637854
+350075.503257 7390129.197244
+350065.170730 7390131.196902
+350036.292430 7390130.457029
+350008.634573 7390130.836963
+349984.613303 7390133.686475
+349952.411772 7390139.335508
+349924.465296 7390147.244153
+349910.702337 7390155.962660
+349896.650760 7390162.351565
+349877.321596 7390166.360879
+349867.714737 7390167.710647
+349861.571295 7390169.190394
+349855.955612 7390169.690308
+349854.339351 7390167.790634
+349853.869316 7390163.581355
+349851.816004 7390154.922838
+349848.402065 7390149.783718
+349841.392769 7390146.614261
+349834.870000 7390145.884386
+349825.147694 7390148.333966
+349797.168234 7390159.672024
+349785.598772 7390163.101437
+349776.198069 7390164.221245
+349766.805613 7390164.561187
+349758.856246 7390163.481372
+349753.042654 7390162.541533
+349738.075745 7390158.842166
+349719.760867 7390153.343108
+349712.347505 7390150.493596
+349709.106737 7390147.364133
+349706.303018 7390142.674936
+349703.309637 7390135.676135
+349701.924270 7390131.666821
+349695.863290 7390125.517875
+349681.267462 7390115.619570
+349670.497885 7390110.860385
+349659.299504 7390107.640937
+349648.496942 7390106.201183
+349637.282068 7390105.091373
+349624.854998 7390103.191699
+349616.204702 7390100.442170
+349597.188894 7390093.493360
+349582.032323 7390088.684184
+349571.732780 7390088.134278
+349563.049500 7390088.714179
+349556.691656 7390091.193754
+349553.607566 7390093.483362
+349550.713139 7390097.442684
+349549.731837 7390103.301680
+349550.375043 7390110.510445
+349555.693862 7390119.418919
+349560.542646 7390123.898152
+349565.407922 7390126.827650
+349568.962047 7390128.857303
+349571.089574 7390130.766975
+349571.056590 7390133.316539
+349568.896077 7390135.726126
+349562.529987 7390139.095549
+349551.125450 7390146.174336
+349534.665974 7390158.852165
+349529.437864 7390161.121776
+349525.240532 7390162.521536
+349522.585246 7390162.491541
+349518.923919 7390161.571699
+349515.386286 7390158.212274
+349510.553995 7390151.623403
+349504.996036 7390146.474285
+349500.749227 7390142.444975
+349495.859212 7390141.505136
+349490.639348 7390142.564955
+349486.227615 7390145.284489
+349483.316695 7390149.903698
+349482.360133 7390153.443091
+349482.327148 7390157.202447
+349485.543178 7390161.891644
+349495.380931 7390168.300546
+349502.579890 7390172.809774
+349506.735991 7390175.179368
+349509.968513 7390178.868736
+349510.636458 7390182.858053
+349510.372578 7390188.947010
+349508.459453 7390196.345742
+349506.735991 7390204.964266
+349506.628790 7390215.712425
+349507.873970 7390223.031171
+349511.757945 7390232.819495
+349515.963523 7390240.278217
+349518.445638 7390247.396998
+349519.789774 7390255.495611
+349518.297206 7390262.004496
+349514.940990 7390270.393059
+349509.457247 7390277.751798
+349499.578262 7390285.400488
+349486.112168 7390294.568918
+349474.913786 7390302.207609
+349460.878702 7390307.376724
+349452.591240 7390308.956453
+349447.181713 7390308.896464
+349441.384613 7390307.176758
+349435.092739 7390303.567376
+349428.339076 7390295.638734
+349423.729433 7390287.390147
+349421.684368 7390277.851781
+349422.451267 7390272.432709
+349425.164277 7390266.253768
+349431.233503 7390262.104479
+349443.949190 7390256.365462
+349449.185547 7390253.106020
+349450.851285 7390250.346493
+349452.112959 7390246.377173
+349452.558255 7390242.727798
+349451.477999 7390238.508520
+349448.666034 7390234.269246
+349438.894251 7390231.839663
+349426.863000 7390230.499892
+349414.741041 7390228.270274
+349406.082499 7390226.410593
+349398.339289 7390225.330778
+349390.348691 7390227.800355
+349383.463089 7390232.599532
+349378.886431 7390241.188061
+349373.460411 7390252.656097
+349369.799084 7390260.924681
+349365.073994 7390263.974158
+349359.862376 7390265.023978
+349353.512779 7390266.623704
+349350.535890 7390268.693350
+349344.326478 7390276.831956
+349335.915323 7390290.699580
+349328.370022 7390299.918001
+349322.424489 7390302.187613
+349317.320073 7390302.907489
+349310.690103 7390302.067633
+349302.336671 7390300.427914
+349294.799617 7390299.348099
+349285.613316 7390298.818190
+349273.458372 7390300.347928
+349256.776247 7390304.607198
+349234.165083 7390310.136251
+349221.457641 7390314.765458
+349212.230109 7390318.544811
+349205.855773 7390323.134025
+349200.380276 7390329.382954
+349197.551819 7390336.661708
+349195.432537 7390354.358676
+349197.230216 7390367.896357
+349197.848683 7390377.204763
+349196.760181 7390383.503684
+349196.009774 7390387.263040
+349193.939970 7390390.012569
+349190.657970 7390391.852254
+349182.890021 7390392.442153
+349170.454705 7390390.872422
+349162.703248 7390390.572473
+349154.729143 7390391.932240
+349142.953526 7390395.571617
+349132.629245 7390397.241331
+349125.570471 7390398.161173
+349120.367100 7390398.551106
+349117.109839 7390397.081358
+349113.671161 7390394.271839
+349106.694849 7390387.662972
+349104.072548 7390385.093412
+349101.532709 7390383.963605
+349097.055006 7390382.473860
+349094.003900 7390381.444037
+349091.257906 7390380.314230
+349088.709820 7390380.284235
+349085.122710 7390381.683996
+349081.098549 7390386.073244
+349065.925485 7390402.420444
+349054.595164 7390412.378738
+349048.212582 7390417.407876
+349040.634296 7390419.877453
+349033.789924 7390420.247390
+349029.609085 7390420.207397
+349022.072030 7390418.357714
+349014.460760 7390414.508373
+349006.931951 7390411.668860
+348995.436705 7390408.219450
+348964.744235 7390405.359940
+348949.727849 7390406.639721
+348928.765931 7390410.079132
+348912.792982 7390415.118269
+348902.452209 7390418.667661
+348896.094365 7390421.707140
+348889.505627 7390427.176203
+348875.470542 7390441.533744
+348858.639985 7390460.410511
+348852.216172 7390467.849236
+348840.358092 7390481.266938
+348834.123942 7390491.945109
+348828.598967 7390503.513127
+348788.629487 7390555.384242
+348756.188816 7390604.435840
+348721.703079 7390653.607418
+348708.443140 7390667.345065
+348686.433951 7390682.262509
+348670.098168 7390690.301132
+348657.308264 7390703.318903
+348625.263412 7390704.878635
+348441.347730 7390696.989987
+348368.566498 7390704.898632
+348320.309556 7390714.397005
+348260.186289 7390741.292398
+348238.036913 7390750.780773
+348203.163604 7390771.377245
+348142.891904 7390829.807236
+348044.835975 7390954.235923
+347898.283964 7391254.294525
+347907.783622 7391271.701544
+347814.601216 7391351.257916
+347799.609568 7391371.704414
+347750.651697 7391439.652775
+347719.654116 7391482.305469
+347707.631112 7391496.952960
+347672.823772 7391530.177269
+347628.533267 7391566.571035
+347574.726612 7391601.375074
+347541.510795 7391615.612635
+347508.286732 7391628.270467
+347405.480974 7391649.626809
+347341.407762 7391649.626809
+347272.576475 7391648.047079
+347247.268793 7391647.257214
+347192.678746 7391650.416673
+347142.063383 7391658.325319
+347096.173109 7391670.193286
+347066.107352 7391680.481523
+347015.195124 7391701.957845
+346952.960821 7391734.272310
+346889.671001 7391780.154450
+346704.996666 7391885.286442
+346755.216211 7391653.586130
+346767.865928 7391591.876701
+346778.157224 7391546.784425
+346777.373832 7391532.546863
+346771.040727 7391491.413909
+346765.499260 7391457.399735
+346748.330608 7391451.690713
+346736.406558 7391460.999119
+346723.748594 7391468.767788
+346633.765726 7391359.706469
+346622.872455 7391338.000187
+346607.130401 7391291.318184
+346582.919467 7391235.027826
+346558.287977 7391169.429062
+346510.097005 7391121.967192
+346491.658433 7391089.102821
+346482.843212 7391052.159149
+346468.445294 7391023.883993
+346459.819736 7390994.369048
+346452.084772 7390967.893583
+346450.146908 7390948.156964
+346450.410787 7390923.691155
+346454.789536 7390877.289103
+346455.399757 7390866.151011
+346463.951098 7390829.247332
+346464.388148 7390797.692737
+346460.718575 7390777.606178
+346455.902777 7390760.389127
+346443.986974 7390747.751292
+346429.028311 7390734.083633
+346424.113558 7390715.986733
+346416.205422 7390691.090997
+346406.730503 7390670.394542
+346401.106574 7390661.696032
+346390.246288 7390646.078707
+346378.363470 7390628.701684
+346369.036983 7390615.064020
+346366.892963 7390595.557361
+346366.587853 7390586.028993
+346362.266828 7390569.481828
+346352.709446 7390556.424064
+346343.721055 7390547.135655
+346330.279699 7390534.477823
+346322.833353 7390524.209582
+346320.293514 7390513.551408
+346313.490374 7390500.523640
+346306.052273 7390489.705493
+346301.607555 7390485.336241
+346300.156219 7390477.457591
+346295.348666 7390468.769079
+346287.539486 7390464.369832
+346282.088727 7390458.440848
+346280.752838 7390449.572367
+346283.251446 7390435.194830
+346278.460386 7390424.736621
+346271.583029 7390408.939327
+346263.221351 7390398.441125
+346258.694171 7390382.663828
+346251.132377 7390365.706732
+346259.733196 7390332.622399
+346258.619955 7390312.675816
+346260.425879 7390295.528753
+346260.211477 7390267.953477
+346257.721116 7390242.447846
+346257.539699 7390211.333175
+346257.366528 7390178.988716
+346260.549573 7390148.014021
+346266.519844 7390104.881409
+346272.160266 7390073.496785
+346274.139361 7390050.030805
+346272.152019 7390025.764961
+346266.412643 7390008.197970
+346261.753522 7389985.341885
+346290.829732 7389970.594412
+346353.327914 7389942.909154
+346446.666998 7389901.756203
+346482.265976 7389883.559320
+346533.689470 7389855.884060
+346555.838846 7389846.395686
+346596.971044 7389825.029346
+346613.529476 7389818.170520
+346642.853072 7389803.673004
+346682.088637 7389785.596100
+346689.526737 7389776.777611
+346727.500629 7389688.172788
+346744.900176 7389680.264143
+346789.207173 7389664.446852
+346824.006267 7389647.039834
+346862.763551 7389631.212545
+346901.537327 7389614.605389
+346914.986929 7389609.066338
+346937.136305 7389666.816446
+346942.661279 7389666.016583
+346945.036194 7389651.779022
+346998.826356 7389631.212545
+347092.247903 7389602.337491
+347103.372068 7389624.803642
+347111.766731 7389630.872603
+347120.920047 7389635.421824
+347132.506001 7389637.541461
+347155.463507 7389628.053086
+347179.979551 7389628.842951
+347198.962374 7389644.390287
+347263.843717 7389716.647910
+347274.910158 7389735.634658
+347278.076711 7389752.251812
+347277.293319 7389756.211134
+347325.542015 7389768.079101
+347351.806259 7389759.660543
+347365.882575 7389756.201135
+347384.873644 7389768.069102
+347414.931155 7389775.977748
+347456.863238 7389777.567475
+347455.032574 7389732.195247
+347452.072178 7389660.187581
+347444.642324 7389611.815867
+347434.227335 7389576.031997
+347427.663335 7389551.276237
+347422.270300 7389537.198648
+347408.606296 7389490.406663
+347349.266420 7389358.289294
+347304.398679 7389191.807811
+347311.721332 7389112.731356
+347320.503568 7389014.618162
+347283.568701 7388977.594503
+347309.140262 7388908.016422
+347324.527728 7388857.994990
+347337.993823 7388809.903227
+347336.072451 7388756.032455
+347328.378718 7388709.860364
+347314.912623 7388659.848930
+347282.208073 7388498.246611
+347270.663350 7388452.074520
+347243.731160 7388357.810667
+347211.026610 7388311.638576
+347161.013221 7388255.848132
+347116.763947 7388211.605710
+347070.593302 7388194.288677
+347005.175954 7388171.202631
+346951.484746 7388056.922206
+347316.833995 7388213.535380
+347382.243097 7388246.239778
+347477.115980 7388277.604405
+347543.613584 7388296.081241
+347815.467070 7388387.875517
+347900.848542 7388413.761083
+348155.195280 7388475.740467
+348188.287404 7388482.649283
+348226.178833 7388490.307971
+348332.382038 7388519.662943
+348377.777538 7388513.813945
+348449.536237 7388462.552725
+348518.004690 7388356.880826
+348540.327236 7388321.976805
+348566.542003 7388145.996949
+348543.642221 7388151.625984
+348523.826529 7388153.885597
+348486.248456 7388152.355859
+348451.103020 7388143.267416
+348414.456772 7388120.881251
+348437.397785 7388051.263176
+348474.967612 7387896.399702
+348505.833253 7387775.370434
+348543.180432 7387642.613174
+348546.173814 7387621.106858
+348569.057104 7387545.669779
+348579.216460 7387531.412221
+348599.180584 7387515.814893
+348644.246235 7387422.550868
+348664.367037 7387377.438596
+348666.403856 7387355.312386
+348664.647409 7387325.667464
+348657.588636 7387298.502117
+348654.554023 7387279.775325
+348655.287938 7387242.481713
+348665.612218 7387218.465826
+348677.346605 7387184.311677
+348680.290509 7387132.590536
+348680.331740 7387092.227450
+348681.082147 7387054.943836
+348683.440569 7387031.767806
+348686.590629 7387007.461969
+348691.802247 7386993.864299
+348696.881925 7386968.078715
+348700.708176 7386947.602223
+348698.852774 7386921.416708
+348686.186564 7386870.785381
+348679.869951 7386843.889988
+348670.378540 7386813.835136
+348667.211987 7386750.545977
+348643.759707 7386622.447919
+348680.405956 7386633.626004
+348694.226639 7386639.195050
+348706.934080 7386643.754269
+348719.245702 7386647.093697
+348734.624923 7386649.693252
+348746.441771 7386651.812889
+348759.602755 7386651.722904
+348780.243071 7386649.063360
+348795.894416 7386645.234016
+348817.812897 7386637.485343
+348834.742409 7386628.806830
+348850.212338 7386622.317941
+348871.924663 7386614.789231
+348896.671601 7386599.991765
+348914.491705 7386611.989710
+348971.572114 7386645.513968
+349021.832890 7386677.758445
+349059.575887 7386725.230313
+349111.791020 7386763.203809
+349136.298817 7386800.777373
+349194.847055 7386884.263072
+349213.821632 7386947.922168
+349217.854039 7387020.969656
+349218.068441 7387048.005025
+349220.946375 7387085.198654
+349221.441149 7387107.854773
+349232.812701 7387162.725374
+349242.312359 7387180.922257
+349263.999945 7387221.015390
+349309.626339 7387295.052708
+349335.049468 7387335.155838
+349366.484100 7387397.475164
+349377.031029 7387420.541213
+349385.392707 7387439.357989
+349397.011646 7387466.633317
+349403.493183 7387484.660230
+349408.078087 7387501.877280
+349411.937323 7387517.954527
+349421.626644 7387565.356407
+349448.699019 7387674.407728
+349449.878230 7387691.574787
+349462.330038 7387752.734311
+349483.572329 7387830.740949
+349504.938312 7387834.700271
+349548.453671 7387849.727697
+349568.219886 7387860.805799
+349585.627679 7387862.385529
+349667.100438 7387820.462710
+349754.122910 7387774.580569
+349832.437362 7387731.857887
+349898.893735 7387697.053849
+349967.708530 7387664.619404
+349982.403313 7387680.346710
+350001.361397 7387662.849707
+350067.859001 7387673.237928
+350088.218945 7387668.018822
+350100.316165 7387663.159654
+350110.747647 7387660.830053
+350116.932320 7387654.911067
+350126.992721 7387648.592150
+350134.711193 7387642.363217
+350146.552780 7387631.964998
+350152.490066 7387630.365272
+350166.145824 7387632.054982
+350176.733984 7387634.594547
+350190.381496 7387637.284087
+350202.783827 7387641.843306
+350225.329022 7387642.733153
+350236.032629 7387643.183076
+350247.461905 7387643.403038
+350256.351341 7387642.063268
+350270.378180 7387637.774003
+350284.231847 7387630.495249
+350294.795269 7387625.396123
+350305.259735 7387619.967053
+350318.882508 7387614.907919
+350327.598774 7387610.338702
+350348.272074 7387604.569690
+350371.427490 7387585.872893
+350383.574188 7387575.694636
+350400.025418 7387563.576712
+350414.398598 7387555.088166
+350435.401747 7387546.329666
+350446.196063 7387538.690975
+350463.397700 7387532.991951
+350476.641147 7387515.524943
+350487.963221 7387496.038281
+350493.150101 7387478.151345
+350498.369965 7387466.683309
+350504.158818 7387459.214588
+350516.173576 7387451.585895
+350535.807852 7387447.356619
+350568.924714 7387430.419521
+350595.823918 7387429.319709
+350657.522216 7387426.150252
+350707.279972 7387415.062151
+350746.441321 7387408.923203
+350782.963877 7387406.593602
+350818.109312 7387407.963367
+350833.142190 7387412.702555
+350851.333375 7387422.990793
+350932.022742 7387482.320630
+350961.288614 7387506.846429
+350985.021266 7387521.873855
+351010.337194 7387533.741822
+351036.436514 7387543.240195
+351132.167006 7387583.533294
+351149.566552 7387596.191125
+351197.823494 7387642.073266
+351216.022925 7387657.110690
+351246.872074 7387672.927981
+351264.288113 7387679.046933
+351325.186527 7387698.243645
+351417.478340 7387723.089389
+351447.560589 7387733.707570
+351443.849786 7387752.824296
+351445.416569 7387778.929824
+351445.416569 7387803.455623
+351452.549559 7387826.391694
+351462.040970 7387850.917493
+351484.190346 7387884.931667
+351596.165912 7388052.063039
+351618.323534 7388087.656942
+351643.631215 7388155.685289
+351650.261185 7388157.305012
+351639.475115 7388163.733910
+351622.529111 7388174.302100
+351611.462670 7388179.171266
+351606.795303 7388186.879946
+351611.710057 7388194.788591
+351613.062438 7388202.107337
+351598.697505 7388210.495901
+351592.026304 7388213.855325
+351585.693199 7388214.235260
+351581.108295 7388213.415400
+351576.119325 7388212.585543
+351570.478903 7388215.525039
+351565.729075 7388220.674157
+351557.507583 7388226.133222
+351552.559844 7388231.622282
+351550.242653 7388238.131167
+351549.516985 7388249.749177
+351553.912226 7388259.207557
+351558.373437 7388261.467170
+351568.227682 7388265.776431
+351564.137552 7388276.584580
+351558.431160 7388286.492883
+351552.262980 7388290.972116
+351544.783649 7388293.111749
+351535.325222 7388300.220532
+351531.367031 7388308.259155
+351525.372022 7388315.727875
+351517.018590 7388323.946467
+351514.932294 7388328.465693
+351514.091178 7388331.225221
+351515.369344 7388336.004402
+351517.587580 7388338.573962
+351521.001519 7388343.703083
+351520.976781 7388346.252647
+351517.554595 7388351.971667
+351516.218706 7388352.961497
+351516.177475 7388356.720854
+351517.653550 7388362.609845
+351522.114761 7388365.419364
+351523.796992 7388370.308526
+351522.065283 7388380.146841
+351520.300590 7388382.566426
+351515.361098 7388387.275620
+351508.689897 7388390.974986
+351501.845526 7388391.574883
+351495.702084 7388393.724515
+351488.511371 7388398.193750
+351483.868743 7388403.122905
+351482.656547 7388411.421484
+351486.375597 7388417.550434
+351487.909396 7388426.758857
+351494.193024 7388431.588029
+351500.682807 7388435.747317
+351503.189661 7388439.646649
+351504.830661 7388449.304995
+351498.967591 7388473.380871
+351497.013235 7388484.988882
+351492.716948 7388496.016993
+351489.962707 7388505.845310
+351482.367929 7388520.062875
+351470.402648 7388532.560734
+351465.034352 7388534.570390
+351438.910293 7388549.077905
+351438.555705 7388553.387166
+351437.656866 7388561.685745
+351437.483696 7388568.324608
+351442.076846 7388578.782816
+351446.950368 7388581.052428
+351448.310996 7388587.491325
+351447.610067 7388596.229828
+351441.466625 7388598.709403
+351437.458957 7388610.967303
+351435.776726 7388616.266396
+351433.162671 7388622.545320
+351431.562902 7388629.064204
+351427.250123 7388641.312106
+351420.752094 7388648.340902
+351413.058360 7388652.470194
+351410.831878 7388650.670503
+351406.568577 7388648.300909
+351406.824210 7388643.541724
+351407.690064 7388638.012671
+351407.351969 7388631.363810
+351402.577401 7388629.544121
+351399.196447 7388630.513955
+351380.197131 7388632.423628
+351361.461695 7388638.102655
+351354.774002 7388643.791681
+351349.578877 7388653.040097
+351345.101174 7388661.628626
+351342.017083 7388673.896524
+351336.121028 7388691.443519
+351331.626833 7388702.031705
+351328.839607 7388715.069472
+351320.939718 7388729.387019
+351315.299296 7388742.174829
+351304.810091 7388759.341888
+351295.854684 7388767.330520
+351284.400670 7388779.508434
+351275.610188 7388790.716514
+351269.483239 7388801.724628
+351269.903796 7388810.263166
+351272.262218 7388818.921683
+351277.028540 7388831.929455
+351281.918554 7388842.607626
+351282.751424 7388851.696069
+351283.196720 7388868.093260
+351284.326454 7388877.181703
+351288.523785 7388896.058470
+351292.729363 7388903.957117
+351295.054800 7388916.055045
+351297.792548 7388927.273123
+351301.660031 7388938.941124
+351303.911251 7388968.306095
+351306.772694 7388977.974438
+351306.739709 7388990.822238
+351305.824377 7389000.660552
+351301.338428 7389010.478871
+351294.502302 7389020.147215
+351289.117514 7389028.175839
+351275.799851 7389042.553377
+351271.478826 7389046.492702
+351254.351405 7389064.149677
+351243.928170 7389076.117627
+351237.900175 7389086.355874
+351231.699010 7389093.824594
+351228.961261 7389102.103176
+351225.283442 7389112.581381
+351222.710618 7389124.739299
+351214.447895 7389134.397645
+351205.904800 7389141.846369
+351195.968092 7389155.254072
+351194.747650 7389164.652462
+351177.282134 7389206.225341
+351169.761571 7389223.312414
+351159.767140 7389243.039035
+351156.270738 7389255.626879
+351145.929965 7389278.442971
+351139.547382 7389294.210270
+351133.824498 7389315.086694
+351132.826704 7389322.605406
+351134.632629 7389335.803146
+351134.212071 7389357.059505
+351129.363287 7389361.998659
+351123.384770 7389367.697682
+351115.839469 7389377.146064
+351110.372218 7389382.845088
+351102.637254 7389391.073678
+351097.879179 7389397.002663
+351092.684053 7389405.811154
+351088.387767 7389416.619303
+351083.035964 7389421.328496
+351073.338396 7389421.118532
+351064.630377 7389425.017864
+351061.010282 7389429.517093
+351055.031764 7389435.216117
+351051.411669 7389440.165269
+351051.048835 7389445.254398
+351045.226996 7389446.304218
+351040.320489 7389446.474189
+351038.094007 7389445.234401
+351034.366710 7389439.875319
+351032.173213 7389435.206119
+351026.681223 7389433.376432
+351024.133138 7389432.796532
+351017.000149 7389431.726715
+351014.089229 7389427.377460
+351009.298169 7389426.777563
+351004.721511 7389425.177837
+351002.692938 7389423.388143
+351000.977722 7389421.488468
+350998.775979 7389417.699118
+350994.694095 7389417.659124
+350991.931607 7389418.069054
+350990.034974 7389423.808071
+350989.878296 7389428.907198
+350988.806286 7389433.986328
+350980.782704 7389440.665184
+350966.879559 7389452.483159
+350955.606961 7389457.352325
+350943.485002 7389465.200981
+350929.656074 7389470.260114
+350912.330743 7389477.278912
+350898.716216 7389481.348215
+350890.338046 7389482.927944
+350881.630026 7389486.047410
+350877.836760 7389487.227208
+350872.559173 7389494.705927
+350868.600982 7389502.754548
+350864.040816 7389522.891099
+350855.852309 7389577.441755
+350885.678926 7389595.798611
+350887.971378 7389614.145468
+350878.793323 7389639.391144
+350899.450131 7389639.391144
+350959.103363 7389602.677432
+350968.165971 7389604.647095
+350975.719518 7389606.286814
+Region 1
+624
+353400.210283 7401391.408130
+353398.668238 7401399.726705
+353396.821082 7401405.275756
+353394.355459 7401408.355227
+353391.889836 7401410.824804
+353386.035012 7401411.434699
+353372.478209 7401411.434699
+353353.990160 7401410.204910
+353344.127668 7401412.364540
+353339.814890 7401416.063906
+353336.120578 7401423.142694
+353334.578533 7401429.921533
+353333.654955 7401441.019632
+353333.341599 7401450.258049
+353335.502111 7401459.506465
+353343.204090 7401486.931767
+353350.906070 7401509.727863
+353359.226517 7401530.064379
+353372.783320 7401552.560526
+353381.103767 7401567.957888
+353388.500635 7401581.825513
+353395.279037 7401596.922927
+353408.835840 7401619.419073
+353423.316221 7401646.834377
+353433.277668 7401664.651326
+353443.651426 7401681.038519
+353447.964205 7401690.586883
+353456.903119 7401729.410233
+353459.368742 7401752.216326
+353460.292319 7401775.322369
+353459.781053 7401781.101379
+353457.826696 7401796.888674
+353450.124717 7401854.198858
+353437.796602 7401932.765400
+353434.712512 7401953.721810
+353427.818663 7401980.027304
+353420.850598 7402007.642574
+353411.301463 7402029.828774
+353404.044780 7402037.947383
+353404.646755 7402038.407305
+353372.593656 7402079.750223
+353339.179930 7402122.042978
+353300.966897 7402157.266945
+353263.817628 7402182.392641
+353236.596821 7402205.138745
+353224.887173 7402214.697108
+353213.795993 7402221.785893
+353199.315612 7402229.484575
+353167.757287 7402239.842800
+353154.002575 7402244.761958
+353134.343561 7402256.060023
+353108.796738 7402265.888339
+353075.877785 7402277.676320
+353027.719798 7402292.913710
+352992.838243 7402303.231942
+352946.824276 7402314.340040
+352926.489071 7402307.561201
+352904.925178 7402302.622047
+352880.887415 7402299.542574
+352856.857899 7402301.392258
+352830.972981 7402305.091624
+352808.790621 7402313.100252
+352790.921039 7402322.958563
+352773.051457 7402335.286452
+352753.944941 7402348.224236
+352737.922515 7402359.322335
+352720.052933 7402366.711069
+352700.336195 7402374.729696
+352681.229679 7402377.809168
+352627.002466 7402375.959485
+352559.218450 7402374.109802
+352532.715065 7402369.800540
+352509.914237 7402361.781913
+352496.975901 7402353.773285
+352488.968812 7402341.445397
+352485.266254 7402327.887719
+352484.656033 7402311.870463
+352487.121656 7402300.162468
+352492.044656 7402287.834580
+352510.532705 7402266.268274
+352517.311106 7402260.719224
+352525.936664 7402258.259646
+352545.661647 7402257.639752
+352571.538319 7402253.940386
+352594.957614 7402249.011230
+352620.842532 7402240.382708
+352643.643360 7402228.064818
+352666.444188 7402214.507140
+352688.008081 7402204.028935
+352710.808908 7402192.320940
+352765.654588 7402174.454001
+352818.653113 7402160.276429
+352850.079498 7402151.038012
+352872.261858 7402142.409490
+352882.734571 7402133.161074
+352891.978596 7402118.993501
+352899.375465 7402102.966246
+352904.306711 7402074.001208
+352903.069776 7402051.205112
+352896.291374 7402032.718279
+352880.268948 7402005.602924
+352872.880326 7401985.886301
+352863.636301 7401959.390839
+352856.857899 7401934.735063
+352855.010744 7401910.709178
+352855.010744 7401888.522978
+352854.392276 7401871.885828
+352851.926653 7401862.637412
+352840.835473 7401850.929418
+352822.965891 7401836.751846
+352814.332088 7401831.822691
+352802.012219 7401828.743218
+352788.455416 7401827.513429
+352779.211392 7401829.983006
+352767.501744 7401836.751846
+352754.563408 7401855.858573
+352742.853761 7401876.195090
+352732.991269 7401895.301817
+352729.296957 7401912.548863
+352720.052933 7401932.885379
+352705.877662 7401962.470312
+352684.313769 7401986.496196
+352668.901564 7402006.222817
+352656.581696 7402013.001656
+352643.024892 7402016.691024
+352631.315245 7402016.691024
+352620.224065 7402010.532079
+352605.430327 7401996.364506
+352594.339147 7401982.806828
+352587.560745 7401968.629257
+352587.560745 7401940.284112
+352591.263303 7401918.717806
+352603.583171 7401884.203718
+352630.086557 7401847.230051
+352654.734540 7401824.433956
+352671.367187 7401799.778180
+352677.535368 7401778.211874
+352676.298433 7401757.265462
+352674.451277 7401741.238207
+352671.367187 7401730.150106
+352662.741630 7401720.901690
+352627.002466 7401696.255912
+352580.172122 7401669.140557
+352538.883246 7401653.733196
+352517.929574 7401649.423934
+352497.594369 7401649.423934
+352479.106320 7401654.353090
+352458.193879 7401661.551856
+352441.520000 7401667.290873
+352419.947861 7401678.388972
+352395.918345 7401694.406229
+352379.895919 7401706.734117
+352363.255025 7401718.442112
+352341.072665 7401726.450740
+352329.981485 7401727.680529
+352306.562190 7401724.601057
+352281.295739 7401719.671901
+352251.716510 7401714.742745
+352225.221371 7401712.283167
+352183.314026 7401712.283167
+352158.666043 7401717.822218
+352134.018060 7401728.300423
+352113.064387 7401741.238207
+352085.950781 7401764.044300
+352064.386888 7401785.610606
+352053.287462 7401798.548390
+352032.952257 7401810.876279
+352020.632388 7401816.425328
+351991.053159 7401820.114696
+351968.870798 7401820.734590
+351931.276233 7401812.106068
+351897.384225 7401799.168284
+351872.736242 7401781.291346
+351857.332283 7401767.123773
+351844.385701 7401749.866729
+351832.684299 7401730.150106
+351819.737717 7401711.663273
+351800.639447 7401688.247284
+351783.380086 7401665.441190
+351767.976127 7401654.972983
+351750.106546 7401651.883513
+351731.618496 7401658.662351
+351716.833005 7401670.990240
+351699.507674 7401699.715319
+351698.344956 7401699.955278
+351670.612882 7401733.229579
+351620.079981 7401778.831767
+351585.569505 7401808.406702
+351558.455899 7401830.592901
+351542.433473 7401847.230051
+351526.411047 7401855.858573
+351511.625555 7401862.017518
+351498.687219 7401862.017518
+351486.359105 7401857.088363
+351470.336678 7401846.000262
+351451.848629 7401830.592901
+351433.979047 7401811.496172
+351405.636753 7401780.061557
+351386.530236 7401760.344934
+351387.049749 7401744.757604
+351385.911769 7401716.282482
+351385.293302 7401697.175754
+351374.202122 7401673.139872
+351362.385273 7401649.943845
+351344.012671 7401630.937100
+351339.081425 7401611.220478
+351329.837401 7401590.883961
+351324.906155 7401565.618289
+351324.287687 7401539.112829
+351327.371778 7401512.007472
+351336.615802 7401478.113278
+351344.012671 7401451.617816
+351348.943917 7401434.360772
+351350.172605 7401417.723622
+351351.401294 7401406.015627
+351348.325450 7401399.846684
+351343.394204 7401394.917528
+351329.218933 7401388.138690
+351365.485856 7401396.067332
+351385.631397 7401401.226448
+351414.864285 7401410.804807
+351445.325861 7401416.463838
+351470.633543 7401420.633124
+351493.731235 7401422.352829
+351518.296756 7401422.112870
+351536.232307 7401419.163375
+351552.691784 7401413.024427
+351571.113863 7401403.196110
+351581.677285 7401394.837542
+351587.573340 7401386.488972
+351602.070213 7401359.213644
+351610.176258 7401334.157936
+351616.072313 7401306.892606
+351621.481840 7401281.097025
+351623.197056 7401265.619676
+351622.463141 7401257.751024
+351620.005765 7401250.872202
+351614.357097 7401242.763591
+351598.384148 7401223.356915
+351557.359150 7401180.364280
+351519.278057 7401141.550928
+351475.053522 7401096.348671
+351464.490101 7401086.760313
+351448.525398 7401074.722375
+351443.363258 7401070.553089
+351438.943278 7401062.934394
+351418.797737 7401018.961926
+351414.130370 7401008.143779
+351398.907829 7400963.931353
+351393.737442 7400948.204046
+351362.533705 7400842.812099
+351334.529506 7400747.728386
+351306.277920 7400650.934966
+351282.198926 7400573.058306
+351271.536550 7400560.490458
+351292.646900 7400556.381162
+351313.476879 7400556.161200
+351323.438326 7400554.021566
+351396.367989 7400578.147434
+351475.540050 7400620.890112
+351523.566097 7400659.093568
+351534.319182 7400666.642275
+351575.500858 7400698.876754
+351616.847458 7400744.408955
+351648.562461 7400773.334000
+351678.768404 7400733.370845
+351691.261444 7400711.214641
+351705.601639 7400691.398035
+351719.216166 7400658.703635
+351738.256712 7400580.147091
+351759.952545 7400544.823142
+351776.659408 7400522.017048
+351953.376131 7400587.255874
+351995.423661 7400588.655634
+352089.851248 7400575.907817
+352134.380894 7400568.489088
+352147.879973 7400563.929869
+352159.226787 7400554.731445
+352168.272902 7400546.222902
+352176.618087 7400535.014822
+352181.936906 7400522.946889
+352184.666408 7400508.129427
+352186.991845 7400494.061837
+352188.138071 7400481.114055
+352187.742252 7400468.486218
+352186.546549 7400456.988187
+352168.990324 7400346.717076
+352167.844098 7400337.238699
+352160.991480 7400293.186245
+352150.691938 7400189.983923
+352152.868943 7400155.229876
+352158.410410 7400130.054188
+352167.011228 7400104.888499
+352170.985912 7400096.030016
+352182.530634 7400075.963453
+352194.471176 7400063.805536
+352239.990370 7400009.864775
+352277.741613 7399971.521343
+352293.590869 7399948.315318
+352302.472059 7399937.687139
+352314.956852 7399903.772948
+352319.822128 7399868.269030
+352324.926545 7399846.862696
+352328.901228 7399827.815959
+352336.834102 7399794.491667
+352344.783469 7399765.916562
+352359.049448 7399718.334712
+352359.041201 7399718.334712
+352379.689763 7399666.723552
+352409.722535 7399608.703491
+352423.337062 7399584.197688
+352443.969131 7399553.242991
+352477.300395 7399498.492369
+352510.631659 7399428.654332
+352541.579763 7399349.297925
+352570.136460 7399288.988255
+352585.639373 7399248.065265
+352636.007350 7399109.648974
+352633.962285 7399077.244525
+352632.040913 7399055.678219
+352628.866114 7399028.672845
+352628.866114 7398997.748142
+352624.800723 7398949.186460
+352619.539628 7398913.272612
+352623.101999 7398898.765097
+352618.179000 7398891.476345
+352615.383527 7398847.763833
+352613.000367 7398823.168046
+352611.301643 7398792.113365
+352610.262618 7398777.205919
+352611.582015 7398754.679777
+352612.010819 7398748.190889
+352631.249275 7398647.788087
+352634.580752 7398595.906974
+352629.987602 7398546.215485
+352623.926622 7398489.635177
+352604.119176 7398285.270183
+352595.823468 7398215.932060
+352595.213247 7398195.295595
+352588.179212 7398148.033690
+352587.750408 7398121.518232
+352590.933453 7398105.111043
+352589.828459 7398100.141894
+352592.368298 7398093.093101
+352594.743212 7398072.456636
+352612.200482 7398043.091666
+352636.807235 7398005.008189
+352667.590414 7397961.275680
+352672.513413 7397904.235451
+352673.610162 7397878.929785
+352651.881344 7397811.391354
+352590.273755 7397768.678670
+352562.261310 7397751.121678
+352533.638643 7397733.664668
+352510.582182 7397701.210227
+352494.617480 7397673.584959
+352475.675888 7397628.102750
+352447.572734 7397559.484503
+352505.073700 7397528.879746
+352536.087773 7397523.120732
+352576.733444 7397573.082174
+352625.221280 7397596.428175
+352686.284618 7397603.606946
+352768.895357 7397608.996023
+352879.609250 7397623.223586
+352959.787350 7397609.825880
+353013.750684 7397582.050638
+353078.030052 7397559.034581
+353135.168184 7397547.926483
+353195.406899 7397545.846839
+353261.253050 7397564.003729
+353298.427058 7397580.860842
+353406.271262 7397620.304086
+353445.737722 7397636.421325
+353459.261541 7397647.029508
+353469.049816 7397651.108809
+353501.671905 7397664.976434
+353513.076442 7397673.125038
+353572.045237 7397686.542740
+353619.922852 7397678.844058
+353673.671784 7397658.727504
+353739.353011 7397594.438516
+353814.476172 7397519.731313
+353834.382573 7397548.216434
+353838.118115 7397555.125250
+353842.208246 7397564.733604
+353845.877818 7397578.131309
+353848.277471 7397599.737608
+353854.231250 7397617.554557
+353857.950300 7397625.993111
+353868.670400 7397652.748528
+353886.605951 7397715.537773
+353894.547072 7397732.944791
+353902.108865 7397740.003582
+353919.236286 7397738.373861
+353976.399157 7397735.564343
+353977.396951 7397769.558520
+353975.896137 7397797.303767
+353972.647122 7397826.548758
+353964.153504 7397862.542592
+353956.154661 7397901.785870
+353954.901234 7397917.783130
+353956.649435 7397925.781760
+353959.403676 7397936.279962
+353966.899499 7397951.277393
+353974.403569 7397969.024353
+353979.648172 7397987.271227
+353980.901599 7398003.768402
+353978.402991 7398017.016132
+353973.653162 7398031.013735
+353970.898921 7398044.011508
+353968.152926 7398065.007912
+353967.897293 7398082.754872
+353969.901127 7398101.501661
+353972.152348 7398113.749563
+353979.895559 7398134.745966
+353986.896609 7398150.493269
+353989.395216 7398159.241770
+353991.893824 7398181.487960
+353992.644231 7398207.233550
+353985.395795 7398232.479226
+353975.401363 7398253.975543
+353963.155710 7398279.721133
+353954.150827 7398303.217109
+353948.114586 7398321.703942
+353946.407616 7398339.460901
+353947.900184 7398350.708974
+353951.899606 7398364.956533
+353960.401469 7398382.953451
+353980.645966 7398409.448912
+354005.648537 7398433.194845
+354018.891983 7398446.442576
+354022.891405 7398454.441205
+354026.396053 7398464.439493
+354028.894661 7398478.687052
+354027.888621 7398493.434526
+354024.392219 7398512.681229
+354021.390591 7398533.427676
+354020.145410 7398554.174122
+354021.390591 7398577.920055
+354021.646224 7398599.666330
+354019.395004 7398611.164360
+354013.144361 7398625.911834
+354004.898130 7398637.159907
+354001.393482 7398645.908409
+353999.397894 7398656.406611
+353999.307186 7398669.034448
+354001.146095 7398692.400445
+354001.896502 7398712.147063
+354001.146095 7398736.392910
+353997.146673 7398773.636530
+353993.394638 7398790.883576
+353989.395216 7398804.131307
+353982.897187 7398817.379037
+353966.149092 7398840.875013
+353958.900655 7398851.873129
+353955.651641 7398859.871759
+353954.917726 7398865.230841
+353953.153033 7398872.869532
+353951.157445 7398898.115208
+353949.656631 7398926.610327
+353947.652797 7398944.107330
+353944.906802 7398957.355061
+353936.050350 7398991.429224
+353920.654638 7399035.841617
+353910.660206 7399050.589091
+353896.814785 7399070.935606
+353882.161233 7399094.331598
+353868.167380 7399119.827231
+353852.664466 7399150.072050
+353848.063069 7399159.250478
+353840.921834 7399173.318068
+353835.916372 7399189.565285
+353827.670141 7399216.810618
+353818.920890 7399244.305909
+353811.177680 7399269.801542
+353806.675238 7399291.047902
+353804.176630 7399318.543193
+353802.172796 7399344.288783
+353797.175580 7399376.283302
+353793.176158 7399404.028550
+353792.788585 7399412.987015
+353792.178364 7399436.023069
+353793.679178 7399457.269430
+353799.921575 7399484.014849
+353808.670826 7399499.512194
+353821.675131 7399516.259326
+353835.322643 7399529.377079
+353843.420442 7399537.755643
+353860.168536 7399547.503974
+353882.416866 7399557.002347
+353892.658685 7399564.251105
+353899.907121 7399573.249564
+353907.163804 7399589.496781
+353911.410613 7399612.742799
+353915.657422 7399635.488903
+353919.904231 7399657.485135
+353923.408879 7399665.733722
+353929.156502 7399675.732009
+353947.652797 7399689.979569
+353968.400313 7399708.226443
+353981.899393 7399718.224731
+354005.392904 7399735.471777
+354020.640184 7399748.219593
+354034.889671 7399765.466639
+354045.139736 7399783.963470
+354051.637765 7399798.211030
+354057.385388 7399811.958675
+354064.386438 7399823.956620
+354072.632669 7399832.955079
+354075.881683 7399840.703751
+354078.611186 7399853.731520
+354079.138945 7399864.699641
+354076.887724 7399879.947029
+354072.632669 7399901.693304
+354069.383654 7399927.688851
+354069.886674 7399947.935383
+354072.888302 7399965.182429
+354078.883311 7399982.179518
+354087.137788 7399995.677206
+354097.379607 7400007.925108
+354109.880892 7400020.922881
+354115.438852 7400026.181980
+354120.881364 7400033.170783
+354131.873590 7400061.665902
+354138.627252 7400082.412349
+354145.125282 7400104.158624
+354156.373141 7400138.152801
+354163.126804 7400158.149376
+354166.870592 7400172.396935
+354171.125647 7400202.391797
+354176.617637 7400243.884690
+354181.367466 7400285.127625
+354184.121707 7400304.124371
+354189.366310 7400337.118720
+354195.616952 7400360.114781
+354199.368987 7400369.863111
+354211.490946 7400382.330975
+354217.955991 7400390.349602
+354221.963659 7400398.358230
+354225.047750 7400408.526488
+354225.971327 7400414.685433
+354225.352860 7400420.234483
+354222.582127 7400427.933166
+354219.498036 7400434.712003
+354217.650881 7400443.340525
+354214.880147 7400457.828043
+354214.880147 7400467.686355
+354214.880147 7400481.543981
+354216.727303 7400492.952027
+354216.727303 7400503.730181
+354214.880147 7400514.208386
+354209.948901 7400526.836223
+354201.933565 7400543.483371
+354198.857721 7400552.721789
+354197.315676 7400559.190681
+354196.392098 7400569.358939
+354194.544942 7400595.244505
+354193.613118 7400604.482923
+354191.056787 7400612.751506
+354185.606028 7400630.368489
+354182.835295 7400637.767221
+354179.132737 7400643.616220
+354169.888713 7400656.863950
+354167.117979 7400664.262683
+354163.728779 7400675.350784
+354160.034467 7400696.617141
+354155.721689 7400722.802656
+354150.171975 7400745.298802
+354141.233061 7400785.661888
+354137.538750 7400804.448670
+354131.989037 7400823.245451
+354124.905525 7400846.351493
+354111.653832 7400875.316531
+354100.257541 7400899.352414
+354090.708406 7400918.759090
+354084.622688 7400935.226269
+354082.693070 7400939.715500
+354075.914668 7400960.361964
+354073.143935 7400969.600381
+354070.983422 7400980.698480
+354066.670644 7401007.803838
+354063.586554 7401027.530459
+354061.739398 7401035.539087
+354055.719650 7401051.656326
+354050.648218 7401063.574285
+354037.709882 7401092.229376
+354027.542279 7401111.026157
+354019.840300 7401120.884468
+353999.505095 7401141.840878
+353985.016468 7401156.008451
+353973.620177 7401163.407184
+353958.826439 7401168.336340
+353944.040948 7401169.566129
+353908.912005 7401169.256182
+353891.660891 7401171.725759
+353880.874821 7401176.654915
+353849.135079 7401192.062276
+353831.883965 7401201.300693
+353821.097895 7401205.929900
+353797.678600 7401212.088845
+353783.198219 7401216.398107
+353767.489150 7401224.106787
+353753.289141 7401231.935446
+353731.436629 7401243.203516
+353720.963916 7401247.212829
+353679.675040 7401250.292301
+353667.965392 7401252.761878
+353658.408011 7401256.151298
+353647.316830 7401263.240084
+353605.722843 7401296.824331
+353580.151282 7401319.620426
+353567.823167 7401328.868842
+353557.037097 7401333.488051
+353543.480294 7401337.187417
+353524.992245 7401338.727153
+353443.956537 7401341.496679
+353423.621332 7401345.196045
+353414.072197 7401349.195360
+353409.140951 7401353.204674
+353405.133283 7401357.823882
+353402.362549 7401361.523249
+353400.820504 7401364.912668
+353400.210283 7401391.408130
+Region 1
+800
+349021.832890 7386677.758445
+348971.572114 7386645.513968
+348914.491705 7386611.989710
+348896.671601 7386599.991765
+348907.020621 7386595.442545
+348926.267323 7386589.773516
+348939.362337 7386586.254118
+348951.261648 7386580.725066
+348961.552944 7386572.086545
+348972.858526 7386563.787967
+348988.806736 7386550.880178
+349009.752162 7386539.142188
+349032.783884 7386522.215088
+349052.822225 7386508.027518
+349062.692963 7386500.818753
+349072.233852 7386492.660150
+349076.909464 7386488.120928
+349086.565800 7386481.462068
+349098.258955 7386475.603072
+349117.761291 7386464.724935
+349131.012984 7386456.116410
+349145.138777 7386451.387220
+349159.561434 7386448.547706
+349166.397559 7386448.067789
+349192.933929 7386448.117780
+349215.404908 7386445.588213
+349231.361364 7386441.868850
+349240.374494 7386438.309460
+349254.525026 7386431.810573
+349283.065230 7386415.053444
+349292.498918 7386410.614204
+349310.145852 7386401.375786
+349323.240866 7386395.556783
+349342.339136 7386386.758290
+349348.177468 7386384.048754
+349349.505111 7386374.320421
+349350.082347 7386367.901520
+349350.247272 7386361.372639
+349349.018583 7386352.164216
+349347.352845 7386345.615338
+349344.969684 7386339.056461
+349342.677232 7386334.267282
+349339.758066 7386330.028008
+349336.756438 7386324.019037
+349334.381524 7386316.800273
+349332.550861 7386296.623730
+349330.984077 7386280.436502
+349330.316132 7386266.478893
+349329.714157 7386245.092556
+349331.619037 7386228.835341
+349337.284197 7386214.057872
+349341.745408 7386206.899099
+349348.985598 7386187.712385
+349354.065276 7386170.265374
+349355.895940 7386160.537040
+349363.573180 7386118.534235
+349370.508260 7386079.730881
+349372.149260 7386068.452813
+349374.351004 7386062.823777
+349382.399325 7386044.306949
+349385.120581 7386038.237989
+349386.192591 7386033.158859
+349386.448224 7386028.179712
+349387.421279 7386022.760640
+349388.823139 7386015.021965
+349392.014430 7386002.764065
+349395.477847 7385993.385671
+349406.395856 7385973.679047
+349409.644871 7385965.740407
+349411.508519 7385962.320993
+349419.647549 7385954.982250
+349424.521071 7385947.283568
+349428.141166 7385942.674358
+349431.019101 7385940.484733
+349441.376366 7385936.165473
+349449.993677 7385931.046350
+349459.864416 7385923.837584
+349466.750018 7385919.038406
+349475.507515 7385911.269737
+349481.791143 7385905.130789
+349496.238539 7385889.443476
+349504.476523 7385882.434676
+349510.042729 7385876.515690
+349517.835417 7385863.197971
+349518.940412 7385855.119355
+349513.737040 7385844.771128
+349507.948186 7385842.161575
+349498.085695 7385839.292066
+349491.274308 7385836.892477
+349487.744921 7385832.323260
+349484.256766 7385824.754556
+349486.565710 7385818.685596
+349488.717977 7385807.637488
+349493.904856 7385799.378903
+349498.827855 7385786.811056
+349504.328091 7385777.782602
+349506.059800 7385758.865843
+349506.933900 7385743.038554
+349507.074086 7385729.190926
+349511.304402 7385714.613423
+349511.477573 7385698.226230
+349510.364332 7385687.368089
+349509.160382 7385675.500122
+349508.253297 7385664.641982
+349507.717292 7385647.464925
+349509.894297 7385634.317177
+349512.574322 7385621.719335
+349517.464337 7385612.680883
+349519.113583 7385600.632946
+349521.026708 7385593.894101
+349517.340643 7385575.357276
+349513.135066 7385567.568610
+349512.500106 7385559.699958
+349513.835995 7385548.861814
+349518.874442 7385534.844215
+349523.492331 7385522.486332
+349526.164110 7385511.218262
+349534.789667 7385495.920883
+349542.829742 7385478.053943
+349547.200244 7385469.795358
+349553.953907 7385457.797413
+349568.302349 7385442.220081
+349570.198982 7385436.031141
+349570.281444 7385428.392450
+349564.929640 7385422.583445
+349561.177605 7385419.993888
+349556.139158 7385414.624808
+349552.741711 7385407.066103
+349552.510817 7385400.197279
+349553.426148 7385390.678910
+349561.070404 7385381.120547
+349567.040675 7385375.871446
+349580.490277 7385368.472713
+349600.305970 7385365.913152
+349619.767074 7385358.584407
+349632.482762 7385352.175505
+349645.256173 7385340.687473
+349659.151072 7385329.199441
+349666.803574 7385319.201153
+349668.205433 7385311.462479
+349676.179538 7385300.694323
+349689.365261 7385278.128189
+349701.775838 7385262.300900
+349706.204064 7385248.063338
+349707.869802 7385234.675632
+349711.275495 7385221.097957
+349716.280957 7385211.069675
+349717.592108 7385202.221191
+349718.730088 7385190.933124
+349716.346927 7385174.965859
+349713.238098 7385159.538502
+349712.347505 7385147.130627
+349712.446460 7385137.602259
+349716.124279 7385127.014073
+349722.374922 7385114.446228
+349734.422665 7385104.277968
+349740.079579 7385099.348812
+349743.971800 7385088.540663
+349747.624880 7385080.492042
+349755.079473 7385069.713888
+349762.294925 7385062.255166
+349767.646728 7385057.995895
+349775.554863 7385053.316697
+349783.528968 7385041.208771
+349786.464627 7385033.930018
+349791.824676 7385028.670918
+349796.434319 7385027.061194
+349804.367193 7385019.502489
+349809.488103 7385017.562821
+349815.070801 7385010.304064
+349821.041072 7385005.054964
+349825.089971 7384998.786037
+349830.581960 7384990.537450
+349836.626448 7384987.827914
+349842.035975 7384987.437981
+349851.626341 7384987.757926
+349858.437728 7384989.827572
+349878.212189 7384991.577272
+349893.533685 7384990.517454
+349908.418132 7384991.667257
+349926.229990 7384995.616580
+349936.826396 7384997.276296
+349956.073098 7385000.245787
+349970.759635 7385005.724849
+349981.586936 7385010.024112
+350000.347111 7385010.773984
+350019.148517 7385008.424386
+350038.782792 7385004.085130
+350058.078972 7385002.845342
+350075.363071 7384998.256128
+350088.853904 7384995.846541
+350108.216054 7384988.187853
+350124.774485 7384985.918241
+350144.070665 7384984.348510
+350159.062312 7384984.948408
+350180.057215 7384987.268010
+350188.410647 7384988.347825
+350222.187208 7384987.917899
+350242.275026 7384988.677769
+350261.257848 7384988.097868
+350279.515003 7384989.277666
+350295.529183 7384989.227675
+350308.302594 7384987.367993
+350324.209573 7384988.747757
+350336.628397 7384990.867394
+350355.668943 7384994.936697
+350367.263143 7384998.266126
+350372.837595 7385001.865510
+350377.867796 7385009.234248
+350380.011816 7385018.882595
+350390.484529 7385032.620242
+350399.588368 7385039.799012
+350417.326010 7385041.198772
+350433.389667 7385036.599560
+350445.082822 7385030.960526
+350455.918369 7385019.222537
+350464.082137 7385008.674344
+350470.250318 7385004.195111
+350477.135921 7384999.725876
+350485.514091 7384998.266126
+350496.910382 7385001.255614
+350508.257195 7385009.124267
+350520.560571 7385022.871912
+350530.373586 7385031.610415
+350536.129455 7385037.209456
+350542.916102 7385042.038629
+350548.803911 7385044.868144
+350557.363499 7385045.737995
+350562.987428 7385044.578194
+350571.645970 7385036.029658
+350582.877336 7385035.139810
+350587.998245 7385032.980180
+350599.138903 7385031.540427
+350604.251566 7385030.050682
+350608.910686 7385023.891737
+350613.025555 7385020.062393
+350625.411394 7385016.203054
+350633.063896 7385016.053080
+350643.957167 7385018.932586
+350659.138477 7385020.862256
+350672.909682 7385021.222194
+350679.448943 7385020.292354
+350686.606671 7385018.602643
+350692.494480 7385011.123924
+350697.170093 7385003.095299
+350702.332233 7384997.606239
+350718.956634 7384987.477974
+350748.939929 7384979.149401
+350777.381178 7384951.754094
+350812.708031 7384929.407921
+350835.632552 7384922.559094
+350869.895640 7384894.223948
+350905.362678 7384878.196693
+350919.867798 7384876.357008
+350951.533323 7384882.435967
+350974.589784 7384882.675926
+350999.584109 7384872.627647
+351017.470184 7384859.959817
+351028.784012 7384850.551429
+351037.219906 7384843.772590
+351038.984599 7384841.243023
+351039.025831 7384837.263705
+351035.100625 7384831.684660
+351031.760901 7384829.105102
+351031.092957 7384824.555881
+351031.851610 7384820.016659
+351040.336981 7384818.336947
+351045.358936 7384816.397279
+351052.054875 7384809.928387
+351058.734322 7384805.679115
+351069.660577 7384804.239361
+351077.040954 7384801.319862
+351086.441657 7384799.650148
+351096.889631 7384795.770812
+351106.826339 7384791.771497
+351119.039007 7384784.592727
+351125.710207 7384780.893360
+351131.688724 7384765.116063
+351133.618342 7384756.057615
+351134.913001 7384748.758865
+351136.339599 7384738.690589
+351138.434141 7384733.621458
+351154.052502 7384722.703328
+351174.956697 7384714.064808
+351202.853695 7384709.585575
+351214.604574 7384707.935857
+351230.519799 7384707.655905
+351251.885782 7384704.106513
+351262.696591 7384694.358183
+351268.873017 7384688.659159
+351278.471630 7384688.209236
+351284.788243 7384688.489188
+351298.526463 7384692.508500
+351308.982683 7384687.739317
+351315.357020 7384682.600197
+351322.531240 7384679.350754
+351332.937983 7384679.240773
+351343.855993 7384679.130791
+351355.829520 7384675.701379
+351364.306645 7384684.319903
+351373.674363 7384686.189582
+351379.941498 7384692.118567
+351387.206427 7384700.497132
+351394.578557 7384707.335960
+351409.652667 7384719.883811
+351421.535485 7384725.322879
+351431.933982 7384726.432689
+351446.579288 7384730.342019
+351459.121805 7384741.100177
+351470.320186 7384743.539759
+351481.452597 7384742.879872
+351493.896159 7384742.789887
+351501.540415 7384743.859704
+351508.318817 7384749.468743
+351516.350645 7384751.768349
+351529.585846 7384754.447890
+351540.000835 7384753.778005
+351550.077729 7384756.427551
+351556.344864 7384761.806630
+351565.193070 7384764.446178
+351572.367290 7384761.746640
+351578.197375 7384759.816971
+351585.891108 7384756.347565
+351590.649184 7384759.387044
+351597.773927 7384761.006767
+351603.917369 7384759.077097
+351612.542926 7384754.067955
+351618.867785 7384753.698019
+351624.219589 7384759.507024
+351629.480684 7384763.876275
+351639.005080 7384770.065215
+351650.937376 7384770.415155
+351657.575591 7384770.255183
+351661.649229 7384770.745099
+351680.549590 7384778.243814
+351684.977816 7384774.304489
+351692.053082 7384770.825085
+351693.957961 7384763.536334
+351696.258659 7384758.467202
+351704.513136 7384749.248781
+351713.971563 7384742.040016
+351725.178190 7384733.841420
+351741.794345 7384724.712984
+351787.222830 7384702.466794
+351794.702161 7384689.479019
+351803.451412 7384681.260427
+351828.585923 7384657.484499
+351847.882102 7384636.308127
+351852.937042 7384631.268990
+351861.480137 7384623.270360
+351866.345413 7384616.561509
+351879.061100 7384610.382567
+351893.904316 7384605.543396
+351905.556239 7384603.113812
+351916.466003 7384603.783698
+351946.152433 7384604.083646
+351959.618528 7384604.443585
+351978.180793 7384604.633552
+351992.553973 7384605.773357
+352002.977208 7384604.103643
+352018.834710 7384600.284297
+352040.464573 7384590.206023
+352057.781657 7384582.297378
+352069.812908 7384573.558875
+352083.336726 7384567.939837
+352092.737429 7384566.480087
+352101.659850 7384561.590925
+352124.411201 7384551.742612
+352165.823771 7384542.084266
+352187.041323 7384532.995823
+352211.194532 7384525.377128
+352230.870039 7384516.498649
+352253.489449 7384509.419861
+352284.074719 7384501.421231
+352309.019566 7384496.692042
+352335.184856 7384491.972850
+352363.939462 7384483.404318
+352386.839245 7384478.315189
+352407.726947 7384470.996443
+352427.138574 7384458.348609
+352439.697583 7384447.620447
+352457.666120 7384435.732483
+352472.410380 7384430.573367
+352485.917706 7384426.724026
+352508.248499 7384428.163780
+352520.824001 7384435.602506
+352530.133995 7384443.111219
+352540.887080 7384458.838525
+352552.242139 7384466.037292
+352568.421244 7384470.416542
+352588.715217 7384471.396374
+352615.367035 7384468.446880
+352632.247069 7384463.857666
+352658.131987 7384456.588911
+352682.351166 7384453.289476
+352703.882075 7384452.959532
+352722.625757 7384455.249140
+352739.827394 7384459.408428
+352760.632634 7384460.398258
+352781.767723 7384458.618563
+352805.327204 7384458.858522
+352826.429308 7384460.838183
+352842.072408 7384467.527037
+352867.314120 7384483.294336
+352879.848390 7384495.492247
+352889.042938 7384513.739122
+352901.016464 7384530.476255
+352915.859680 7384546.353535
+352930.966774 7384555.252011
+352949.446577 7384563.850538
+352978.151706 7384580.317717
+352996.540800 7384598.324633
+353009.050332 7384612.412220
+353020.858934 7384624.820094
+353037.664753 7384637.947846
+353056.631083 7384649.215916
+353077.312629 7384661.823756
+353099.577452 7384669.912370
+353123.054471 7384679.230774
+353138.202797 7384684.139933
+353162.743579 7384688.489188
+353192.627919 7384689.898947
+353209.994481 7384687.639334
+353224.722249 7384683.580029
+353240.629227 7384674.651559
+353269.936331 7384661.883746
+353285.694878 7384657.164554
+353308.536937 7384658.504325
+353325.012906 7384662.993556
+353342.395960 7384669.482444
+353363.399109 7384680.990473
+353377.063113 7384691.978591
+353389.349997 7384697.747603
+353396.334555 7384702.916717
+353410.608780 7384704.386465
+353433.162221 7384703.616597
+353448.508456 7384709.635566
+353464.324726 7384718.993963
+353483.909524 7384729.482167
+353499.255759 7384735.291172
+353515.962623 7384738.330651
+353546.976696 7384738.420636
+353558.653359 7384733.561468
+353580.382176 7384713.174960
+353596.041768 7384698.827418
+353617.424244 7384682.540207
+353635.079424 7384671.982016
+353655.241458 7384665.313158
+353685.818481 7384658.534319
+353708.165766 7384657.434508
+353726.068333 7384663.033549
+353754.872417 7384669.862379
+353788.112973 7384682.040293
+353814.806021 7384696.147877
+353840.171427 7384709.695556
+353863.813370 7384722.783314
+353883.909434 7384732.951572
+353898.216644 7384740.950202
+353919.549643 7384750.248610
+353964.846188 7384770.965061
+353980.439810 7384782.533080
+353996.115894 7384796.200738
+354011.049818 7384812.627925
+354023.237747 7384828.475210
+354030.519169 7384844.832408
+354035.895711 7384857.950161
+354038.724168 7384870.937937
+354042.105123 7384889.904688
+354042.022660 7384898.543208
+354037.396525 7384912.340845
+354029.100817 7384925.548582
+354018.438441 7384940.725983
+354007.009165 7384951.354162
+353994.953176 7384963.302115
+353975.797182 7384980.939094
+353964.293690 7384989.017711
+353951.454309 7384997.636234
+353942.202038 7385004.305092
+353937.740828 7385011.563849
+353933.238386 7385022.811922
+353932.520964 7385033.880026
+353937.559411 7385049.877286
+353942.944199 7385062.335152
+353954.142580 7385085.041263
+353959.082073 7385091.400173
+353964.961635 7385105.637735
+353966.594389 7385125.814279
+353971.434926 7385141.801540
+353973.611931 7385158.328709
+353980.695443 7385174.785890
+354006.844240 7385202.291179
+354030.321259 7385221.577875
+354048.809308 7385239.594789
+354064.312222 7385249.933018
+354080.582035 7385266.160239
+354093.545109 7385275.698605
+354110.342681 7385289.376262
+354121.590540 7385297.464876
+354135.353499 7385308.013070
+354154.138412 7385317.391463
+354174.127275 7385307.733118
+354193.984199 7385291.655871
+354206.353545 7385278.488127
+354222.054368 7385270.119560
+354248.401075 7385257.531717
+354261.751722 7385360.444089
+354284.973108 7385405.856310
+354291.792740 7385437.710854
+354299.362780 7385466.685890
+354308.672775 7385484.722801
+354323.227372 7385538.683558
+354185.911139 7385956.691957
+354099.284486 7386476.442928
+354056.404087 7386585.144309
+354048.025916 7386591.873156
+354042.575158 7386616.288974
+354036.835781 7386629.086782
+354029.043093 7386642.844425
+354012.360969 7386658.631721
+353999.134015 7386684.967210
+353987.251196 7386699.684689
+353978.675117 7386711.002750
+353967.443750 7386721.410967
+353957.647228 7386732.169125
+353937.328516 7386753.895403
+353915.715146 7386772.062291
+353909.002714 7386780.300880
+353901.061594 7386788.519472
+353898.579478 7386801.897181
+353893.722448 7386807.936146
+353889.417916 7386810.335735
+353864.745194 7386808.096119
+353841.870150 7386809.855818
+353829.731699 7386809.405895
+353811.458052 7386809.885812
+353795.757228 7386809.285915
+353787.082194 7386809.415893
+353772.049315 7386812.255406
+353755.993904 7386816.304713
+353738.091337 7386830.742240
+353731.049056 7386841.530392
+353713.633017 7386837.581068
+353699.350546 7386837.881017
+353687.665637 7386842.970145
+353680.145075 7386850.208905
+353677.844376 7386855.827943
+353670.620678 7386863.506628
+353657.154584 7386883.313235
+353653.773629 7386895.121212
+353644.669790 7386907.879027
+353638.913921 7386921.666665
+353626.297189 7386938.263822
+353621.646314 7386944.752711
+353611.173602 7386951.181610
+353591.621789 7386967.368837
+353582.484965 7386973.037866
+353573.933624 7386981.036496
+353569.109579 7386983.975992
+353561.300399 7386999.073406
+353549.813399 7387005.272344
+353546.259274 7387003.682617
+353543.752420 7386998.783456
+353543.628726 7386991.474708
+353539.068561 7386987.665360
+353534.285747 7386987.065463
+353528.958682 7386988.555208
+353523.516170 7386992.264573
+353513.035211 7386999.253375
+353505.836251 7387004.942401
+353490.259122 7387011.541271
+353482.177816 7387014.000849
+353462.848651 7387017.800199
+353456.408345 7387019.279945
+353451.551315 7387025.208929
+353444.294632 7387036.546987
+353441.383713 7387042.056044
+353434.250723 7387051.284463
+353426.062216 7387053.414098
+353415.581257 7387081.109354
+353412.942463 7387090.167803
+353411.540604 7387097.676516
+353407.400996 7387103.175574
+353399.517600 7387106.195057
+353384.674384 7387110.474324
+353369.369380 7387120.402624
+353355.020939 7387126.791529
+353333.011749 7387133.990296
+353316.890368 7387144.348522
+353308.536937 7387153.017037
+353301.346224 7387157.926196
+353285.752602 7387165.744857
+353262.374538 7387177.132906
+353246.954086 7387188.270998
+353232.094379 7387194.549923
+353221.506219 7387202.188614
+353208.831762 7387215.136397
+353199.373336 7387232.313454
+353194.029778 7387246.101093
+353188.496557 7387258.119034
+353044.863712 7387317.848803
+352742.012645 7387441.097691
+352657.686691 7387489.209450
+352637.755551 7387492.878822
+352617.750196 7387493.228762
+352587.230896 7387493.698681
+352573.608123 7387489.129464
+352554.732501 7387478.751242
+352527.445724 7387472.602295
+352510.532705 7387470.002740
+352494.996806 7387472.832256
+352479.625832 7387479.321144
+352474.364737 7387484.810204
+352466.291677 7387496.018284
+352460.098758 7387502.487176
+352450.516638 7387511.695599
+352442.781674 7387520.364114
+352435.302342 7387522.953670
+352422.619640 7387526.253105
+352396.165732 7387538.720970
+352383.647954 7387545.239853
+352367.732729 7387554.828210
+352358.653629 7387565.036462
+352350.094041 7387573.475016
+352334.508665 7387591.361953
+352323.582410 7387601.780168
+352315.360918 7387607.449197
+352308.137220 7387615.907748
+352291.397371 7387625.926032
+352286.441387 7387631.415092
+352278.681684 7387642.413208
+352272.340332 7387644.002936
+352263.327202 7387647.122401
+352255.122203 7387651.251694
+352253.357509 7387663.859534
+352250.380620 7387676.227416
+352247.618133 7387687.055561
+352235.290018 7387694.684254
+352226.606737 7387695.484117
+352218.921250 7387699.173485
+352212.950979 7387704.092643
+352210.658527 7387708.831831
+352193.357935 7387734.347460
+352181.887428 7387748.515034
+352171.266283 7387759.703117
+352163.844676 7387767.161840
+352158.707274 7387770.101336
+352157.025043 7387775.290447
+352156.662209 7387780.379576
+352155.351058 7387799.306334
+352153.644088 7387806.595085
+352148.704596 7387811.084316
+352138.075205 7387812.084145
+352124.452432 7387817.703182
+352120.617935 7387822.872297
+352119.224322 7387829.721124
+352117.979141 7387842.109002
+352117.814216 7387848.427920
+352116.082508 7387858.156253
+352113.295282 7387870.744097
+352108.116649 7387879.002682
+352102.616413 7387887.471232
+352094.394921 7387893.150259
+352088.111294 7387899.399189
+352085.653917 7387909.667430
+352082.932661 7387917.176144
+352080.821626 7387924.014972
+352076.352169 7387931.503689
+352067.437993 7387935.403021
+352051.225904 7387944.211513
+352026.759338 7387962.118445
+352006.885922 7387979.525464
+351994.566053 7387987.044176
+351983.755245 7387996.232602
+351972.482647 7388000.551862
+351950.852784 7388000.661843
+351933.915027 7388010.460165
+351917.810138 7388018.268827
+351905.721164 7388023.127995
+351891.842758 7388033.396236
+351884.140778 7388038.085433
+351858.090936 7388070.709845
+351846.241102 7388082.107892
+351829.328083 7388089.136688
+351812.918084 7388097.385275
+351760.818399 7388113.352540
+351729.375522 7388123.890735
+351722.506412 7388126.940213
+351708.157970 7388133.419103
+351688.705112 7388139.867998
+351679.980600 7388144.987122
+351659.670134 7388154.965412
+351650.261185 7388157.305012
+351643.631215 7388155.685289
+351618.323534 7388087.656942
+351596.165912 7388052.063039
+351484.190346 7387884.931667
+351462.040970 7387850.917493
+351452.549559 7387826.391694
+351445.416569 7387803.455623
+351445.416569 7387778.929824
+351443.849786 7387752.824296
+351447.560589 7387733.707570
+351417.478340 7387723.089389
+351325.186527 7387698.243645
+351264.288113 7387679.046933
+351246.872074 7387672.927981
+351216.022925 7387657.110690
+351197.823494 7387642.073266
+351149.566552 7387596.191125
+351132.167006 7387583.533294
+351036.436514 7387543.240195
+351010.337194 7387533.741822
+350985.021266 7387521.873855
+350961.288614 7387506.846429
+350932.022742 7387482.320630
+350851.333375 7387422.990793
+350833.142190 7387412.702555
+350818.109312 7387407.963367
+350782.963877 7387406.593602
+350746.441321 7387408.923203
+350707.279972 7387415.062151
+350657.522216 7387426.150252
+350595.823918 7387429.319709
+350568.924714 7387430.419521
+350535.807852 7387447.356619
+350516.173576 7387451.585895
+350504.158818 7387459.214588
+350498.369965 7387466.683309
+350493.150101 7387478.151345
+350487.963221 7387496.038281
+350476.641147 7387515.524943
+350463.397700 7387532.991951
+350446.196063 7387538.690975
+350435.401747 7387546.329666
+350414.398598 7387555.088166
+350400.025418 7387563.576712
+350383.574188 7387575.694636
+350371.427490 7387585.872893
+350348.272074 7387604.569690
+350327.598774 7387610.338702
+350318.882508 7387614.907919
+350305.259735 7387619.967053
+350294.795269 7387625.396123
+350284.231847 7387630.495249
+350270.378180 7387637.774003
+350256.351341 7387642.063268
+350247.461905 7387643.403038
+350236.032629 7387643.183076
+350225.329022 7387642.733153
+350202.783827 7387641.843306
+350190.381496 7387637.284087
+350176.733984 7387634.594547
+350166.145824 7387632.054982
+350152.490066 7387630.365272
+350146.552780 7387631.964998
+350134.711193 7387642.363217
+350126.992721 7387648.592150
+350116.932320 7387654.911067
+350110.747647 7387660.830053
+350100.316165 7387663.159654
+350088.218945 7387668.018822
+350067.859001 7387673.237928
+350001.361397 7387662.849707
+349982.403313 7387680.346710
+349967.708530 7387664.619404
+349898.893735 7387697.053849
+349832.437362 7387731.857887
+349754.122910 7387774.580569
+349667.100438 7387820.462710
+349585.627679 7387862.385529
+349568.219886 7387860.805799
+349548.453671 7387849.727697
+349504.938312 7387834.700271
+349483.572329 7387830.740949
+349462.330038 7387752.734311
+349449.878230 7387691.574787
+349448.699019 7387674.407728
+349421.626644 7387565.356407
+349411.937323 7387517.954527
+349408.078087 7387501.877280
+349403.493183 7387484.660230
+349397.011646 7387466.633317
+349385.392707 7387439.357989
+349377.031029 7387420.541213
+349366.484100 7387397.475164
+349335.049468 7387335.155838
+349309.626339 7387295.052708
+349263.999945 7387221.015390
+349242.312359 7387180.922257
+349232.812701 7387162.725374
+349221.441149 7387107.854773
+349220.946375 7387085.198654
+349218.068441 7387048.005025
+349217.854039 7387020.969656
+349213.821632 7386947.922168
+349194.847055 7386884.263072
+349136.298817 7386800.777373
+349111.791020 7386763.203809
+349059.575887 7386725.230313
+349021.832890 7386677.758445
+Region 1
+259
+330497.970400 7387158.766052
+330555.512597 7387229.943860
+330572.837928 7387253.559815
+330650.500928 7387338.625244
+330727.677401 7387424.140596
+330805.068275 7387510.095873
+330876.662050 7387602.300079
+330950.853387 7387691.874736
+331026.273412 7387779.479730
+331101.470790 7387869.504309
+331175.282800 7387955.529574
+331219.391888 7388014.299507
+331245.985982 7388045.284200
+331323.137716 7388135.448755
+331405.228942 7388230.022556
+331443.376005 7388275.174822
+331455.530949 7388292.701819
+331463.323637 7388306.159514
+331498.073253 7388382.796387
+331510.797186 7388430.008300
+331513.642136 7388457.623570
+331517.476633 7388496.326940
+331521.179191 7388538.669687
+331520.626693 7388586.401511
+331532.732160 7388713.909670
+331538.438552 7388785.307441
+331540.986637 7388852.895863
+331541.926707 7388871.402693
+331545.851913 7388925.883361
+331547.740300 7388943.680313
+331560.076661 7389059.460481
+331565.123354 7389145.125807
+331576.395951 7389246.048520
+331578.127660 7389255.396918
+331603.262171 7389247.928198
+331730.006736 7389215.003837
+331758.918020 7389207.865060
+331859.901361 7389182.949328
+331993.976825 7389168.841745
+332122.123249 7389164.182543
+332262.152492 7389149.874993
+332395.551765 7389140.086670
+332485.031614 7389141.446437
+332546.367077 7389142.616237
+332643.697338 7389145.295778
+332704.529781 7389146.205622
+332778.284068 7389149.245101
+332853.572154 7389149.485060
+332929.091134 7389152.794493
+333027.452173 7389152.694510
+333212.002815 7389152.654517
+333340.272933 7389152.234589
+333412.518160 7389151.704680
+333453.600881 7389150.704851
+333502.022747 7389150.774839
+333541.563423 7389151.544707
+333623.951513 7389150.314918
+333697.211026 7389151.054791
+333774.032911 7389149.785009
+333847.787198 7389151.804663
+333915.208380 7389153.024454
+333951.186684 7389155.294065
+334049.803356 7389156.203909
+334125.817111 7389160.013257
+334232.539828 7389161.483005
+334285.761000 7389163.872596
+334309.048356 7389163.042738
+334325.870666 7389161.403019
+334336.434088 7389160.143235
+334321.162068 7389125.239213
+334306.846612 7389091.514990
+334241.948777 7388936.761498
+334209.730754 7388862.374240
+334183.895313 7388800.274877
+334172.614469 7388778.218655
+334140.272753 7388705.641087
+334131.960552 7388682.285087
+334124.415251 7388663.598288
+334120.349860 7388653.030098
+334115.600031 7388636.822875
+334112.186091 7388626.134705
+334106.001418 7388605.018322
+334100.468198 7388588.451160
+334095.833816 7388574.553541
+334089.673882 7388559.426132
+334082.631601 7388541.519199
+334075.003837 7388525.261984
+334066.683391 7388508.434866
+334060.647150 7388493.507423
+334042.761075 7388448.475137
+334019.531444 7388391.394914
+334013.082891 7388374.927735
+334006.626093 7388359.460384
+334003.121445 7388349.782042
+333988.970913 7388313.158315
+333985.045707 7388301.070386
+333982.456391 7388294.831455
+333974.069974 7388278.574239
+333947.682036 7388212.255599
+333936.392946 7388179.841151
+333934.430343 7388174.342093
+333925.375982 7388154.085563
+333919.826269 7388139.728022
+333915.002224 7388124.170687
+333909.056692 7388108.263412
+333904.991300 7388098.255126
+333900.554828 7388084.027563
+333896.085371 7388064.590893
+333891.896286 7388046.823936
+333888.672010 7388025.297623
+333887.517537 7388010.000244
+333886.973286 7387995.712691
+333888.020557 7387975.346180
+333889.142045 7387957.189290
+333892.778632 7387933.313379
+333899.721959 7387906.148033
+333907.019873 7387883.741871
+333913.575626 7387863.995253
+333919.026385 7387842.458942
+333925.425460 7387817.833160
+333929.614545 7387799.386320
+333936.805258 7387777.540062
+333956.505503 7387719.919932
+333973.946281 7387670.868334
+333981.508074 7387652.231526
+333987.791702 7387629.045498
+333995.633867 7387603.549865
+334000.870224 7387582.683439
+334003.542003 7387562.996811
+334008.621681 7387538.241052
+334011.821218 7387517.014688
+334011.227489 7387497.408046
+334010.773947 7387456.974972
+334011.441891 7387433.948916
+334011.524354 7387417.781685
+334001.018656 7387359.001754
+333997.431546 7387328.796928
+333995.139093 7387296.872396
+333987.486591 7387270.316945
+333982.563592 7387245.001281
+333974.935828 7387215.896266
+333967.085417 7387180.522326
+333961.923276 7387157.716232
+333958.410382 7387116.813238
+333953.602830 7387082.089186
+333949.471468 7387059.113122
+333944.556715 7387034.247381
+333941.934413 7387013.071009
+333939.543006 7386990.554865
+333938.306072 7386955.650844
+333937.448464 7386932.164867
+333935.469369 7386854.838112
+333934.191203 7386797.008018
+333935.510600 7386753.055547
+333932.624419 7386728.549744
+333931.849273 7386697.745021
+333930.364952 7386666.830316
+333926.687133 7386643.394331
+333919.158324 7386602.571323
+333905.749953 7386552.249943
+333879.032166 7386461.355512
+333864.823911 7386418.552844
+333856.734358 7386385.448515
+333847.836675 7386350.684469
+333844.917510 7386338.856495
+333839.442013 7386317.810100
+333837.784520 7386301.612875
+333831.476154 7386282.946072
+333844.538183 7386279.336691
+333833.603681 7386231.474889
+333813.087059 7386172.664963
+333784.249991 7386092.808641
+333748.246948 7385963.870727
+333751.726857 7385884.884257
+333622.252790 7385861.908192
+333598.668570 7385860.378454
+333557.973422 7385852.389823
+333516.536113 7385842.861455
+333483.163618 7385836.552536
+333459.587644 7385835.032796
+333420.838606 7385830.643548
+333387.457865 7385824.844541
+333334.047029 7385817.585784
+333267.772073 7385819.205507
+333229.361131 7385823.214820
+333195.782479 7385826.554248
+333156.126356 7385828.993830
+333081.621662 7385835.772669
+333025.266922 7385835.572703
+332993.180839 7385840.721821
+332952.947479 7385846.720794
+332914.231427 7385853.499633
+332878.879836 7385856.799067
+332835.158321 7385859.928531
+332793.152022 7385865.877512
+332748.630623 7385870.756677
+332711.530831 7385872.756334
+332677.020356 7385872.266418
+332633.373057 7385871.576536
+332582.634000 7385858.038855
+332559.940373 7385850.940071
+332538.656852 7385848.710453
+332525.660792 7385842.311549
+332499.841844 7385835.932642
+332480.743574 7385826.904188
+332480.727081 7385826.884192
+332431.925888 7385806.777636
+332397.555599 7385792.620061
+332355.104004 7385764.324907
+332318.713388 7385742.078718
+332294.452977 7385729.950795
+332256.042035 7385717.822873
+332227.740971 7385721.862181
+332213.590440 7385725.911487
+332200.932476 7385732.690326
+332191.861622 7385717.252970
+332177.727583 7385700.935765
+332164.146041 7385682.608905
+332137.972505 7385647.504918
+332110.215692 7385618.609867
+332094.663301 7385594.234043
+332068.201147 7385572.567754
+332045.053978 7385621.619352
+332036.453159 7385666.581650
+331999.510046 7385720.092484
+331944.647873 7385754.706555
+331915.142860 7385752.456940
+331875.989757 7385756.566236
+331839.137352 7385769.574008
+331796.702249 7385789.180650
+331764.690382 7385802.938293
+331739.778519 7385812.116721
+331707.486280 7385817.225846
+331678.756412 7385816.755927
+331652.566384 7385819.065531
+331633.352666 7385827.404103
+331574.952861 7385925.147360
+331532.583728 7386000.004538
+331520.890573 7386027.819773
+331477.391706 7386135.751286
+331437.958231 7386236.634005
+331425.654855 7386259.310121
+331420.063911 7386283.825922
+331401.534630 7386315.070570
+331296.337466 7386507.677578
+331281.733392 7386579.725237
+331248.616529 7386628.186936
+331217.528240 7386677.328518
+331124.057215 7386818.744295
+331030.907794 7386882.263415
+330923.632580 7386938.713745
+330867.178885 7386966.948909
+330829.064806 7386983.886008
+330713.328959 7387041.756095
+330661.105581 7387069.981260
+330604.651886 7387098.216424
+330579.360696 7387112.563966
+330537.898649 7387136.099935
+330497.970400 7387158.766052
+Region 1
+112
+333907.324983 7395848.817525
+333982.068818 7396026.457097
+333821.052918 7396075.218745
+333729.676437 7396099.864523
+333632.989382 7396125.490134
+333556.340668 7396145.636683
+333468.848161 7396169.792545
+333432.737917 7396179.760838
+333355.322304 7396201.427126
+333314.742603 7396207.546078
+333263.723174 7396222.513514
+333260.902963 7396133.828705
+333252.038265 7396000.001629
+333244.831059 7395918.725551
+333239.281346 7395834.849918
+333227.151141 7395675.497213
+333223.860895 7395658.210175
+333219.548116 7395644.492524
+333213.718031 7395626.335634
+333200.021042 7395602.029798
+333153.619502 7395514.324821
+333099.087179 7395434.388513
+333089.109240 7395412.862200
+333055.472865 7395340.264636
+333003.983401 7395244.701005
+332812.101860 7394889.331876
+332780.147716 7394841.380090
+332759.020873 7394808.995637
+332743.922025 7394787.569307
+332731.049659 7394775.561364
+332726.613187 7394771.852000
+332731.288800 7394762.743560
+332744.119935 7394737.757840
+332787.783726 7394657.381607
+332868.382384 7394516.605721
+332903.865915 7394463.394836
+332915.196236 7394446.377750
+332928.043863 7394424.711462
+332940.017390 7394392.426992
+332953.747364 7394354.483491
+332960.171177 7394312.870619
+332962.933665 7394266.918490
+332953.747364 7394225.305618
+332939.159782 7394131.901617
+332893.986930 7393999.964217
+332883.440001 7393972.568910
+332915.641532 7393966.190002
+333017.243340 7393944.773671
+333041.759383 7393939.624553
+333080.392974 7393935.765214
+333146.082447 7393928.026539
+333191.717088 7393921.957579
+333236.312703 7393924.627122
+333348.296515 7393932.705738
+333456.750941 7393939.814520
+333662.684059 7393954.741963
+333719.137754 7393959.301182
+333747.339863 7393961.650780
+333802.688563 7393971.229139
+333844.810309 7393981.247423
+333870.942614 7394000.004210
+333877.630307 7394007.812873
+333886.453774 7394018.780994
+333892.993034 7394028.729290
+333899.787929 7394038.417630
+333910.087471 7394056.264573
+333914.862038 7394064.673133
+333926.142882 7394090.908639
+333937.423725 7394115.114493
+333947.632559 7394151.748218
+333956.423041 7394117.764039
+333961.288317 7394149.568591
+333964.380653 7394155.307608
+333978.968235 7394169.455185
+334017.346193 7394184.542600
+334096.361575 7394194.420908
+334111.889227 7394211.348009
+334118.939754 7394231.104625
+334091.554022 7394278.196558
+334052.235994 7394368.041169
+334017.263730 7394444.888006
+334196.338875 7394497.159052
+334182.361514 7394504.187848
+334166.273118 7394523.774493
+334144.428853 7394584.504091
+334138.928617 7394618.258309
+334133.733492 7394643.394003
+334124.720362 7394669.499532
+334117.496664 7394693.085492
+334107.741373 7394718.181193
+334093.153791 7394745.276552
+334071.540420 7394782.070249
+334043.222864 7394834.061344
+334027.752936 7394904.139340
+334015.630977 7394957.900131
+334016.867911 7394984.985492
+334014.888816 7395049.254483
+334017.123544 7395134.299916
+334020.372559 7395193.259816
+334021.172444 7395236.302443
+334012.283007 7395278.225262
+333992.211682 7395349.133117
+333971.892969 7395423.830322
+333957.676468 7395454.315100
+333947.517112 7395476.431312
+333933.053223 7395502.336874
+333919.339741 7395520.383783
+333899.293155 7395541.460173
+333879.246568 7395560.216960
+333830.552576 7395600.850000
+333884.870497 7395785.938296
+333907.324983 7395848.817525
+Region 1
+140
+325444.531827 7377051.727297
+325444.540073 7377051.717298
+325318.084126 7376989.218004
+324408.862982 7376720.733993
+324487.457806 7376976.990098
+324472.144556 7377282.387787
+324406.422097 7377564.029544
+324238.100037 7377972.139638
+324026.510005 7378414.503865
+323973.354802 7378626.637529
+323963.170708 7378827.653097
+324022.238458 7379087.548579
+324080.943374 7379378.448750
+324081.124791 7379691.785079
+324026.839854 7379996.832827
+324011.930669 7380259.707799
+324000.625087 7380553.637451
+323946.892648 7380812.163168
+323874.573205 7380996.921521
+323826.827530 7381081.517030
+323818.704993 7381111.991810
+323818.366897 7381140.116992
+323825.788505 7381167.232348
+323844.119876 7381186.838989
+323868.734874 7381209.735067
+323890.100858 7381222.952803
+323963.822160 7381251.417928
+323977.057360 7381261.886134
+323983.934716 7381275.593786
+323989.781294 7381281.202826
+324002.249595 7381287.661719
+324036.941487 7381303.918935
+324056.394345 7381315.226998
+324075.047319 7381333.063942
+324101.624920 7381371.377380
+324109.005297 7381390.614085
+324118.537939 7381415.449830
+324122.776502 7381436.096294
+324135.541667 7381511.013461
+324149.329364 7381568.663586
+324155.843887 7381595.289026
+324175.758534 7381669.226361
+324199.994205 7381780.527296
+324223.982490 7381849.565470
+324232.286445 7381896.847371
+324248.927338 7381988.431684
+324271.241638 7382109.540939
+324291.131547 7382177.559288
+324314.237485 7382260.205131
+324327.876750 7382319.554965
+324344.624845 7382411.139278
+324364.555984 7382476.168139
+324387.332073 7382550.215455
+324410.421519 7382606.425827
+324445.385537 7382651.038185
+324498.243876 7382692.990999
+324560.181314 7382717.326831
+324599.796206 7382757.349975
+324623.660797 7382735.833661
+324650.749665 7382703.469204
+324700.227049 7382661.306426
+324745.061805 7382623.522898
+324804.228510 7382580.330297
+324864.640396 7382538.017545
+324964.658927 7382475.868190
+325076.791171 7382399.131335
+325111.738697 7382373.155784
+325185.905295 7382317.925245
+325277.240546 7382239.388697
+325337.413291 7382165.011437
+325414.235176 7382062.818942
+325464.166102 7381997.030211
+325481.936729 7381972.254455
+325543.808198 7381883.059733
+325574.863503 7381821.520274
+325612.095234 7381743.983556
+325652.963553 7381670.716106
+325703.438731 7381579.161788
+325759.694516 7381481.598500
+325804.496287 7381395.073321
+325879.528740 7381254.317431
+325957.455620 7381110.702031
+326015.063787 7381010.379215
+326026.781681 7380969.316249
+326080.019346 7380893.309268
+326145.007889 7380773.469796
+326208.272971 7380669.007689
+326278.835967 7380552.007730
+326364.720459 7380407.382503
+326385.385513 7380376.507792
+326428.035018 7380327.926113
+326445.434564 7380311.208977
+326561.021979 7380179.021619
+326675.685817 7380053.003205
+326748.689696 7379969.697475
+326793.458483 7379907.108196
+326813.216451 7379879.312957
+326880.777819 7379773.461088
+326932.621871 7379685.686123
+326984.548385 7379590.942352
+327025.037378 7379514.225493
+327068.429044 7379424.920790
+327118.442432 7379338.095662
+327047.763990 7379293.593285
+327010.787891 7379267.137817
+326990.906229 7379253.620132
+326955.142327 7379191.620752
+326936.068795 7379133.590692
+326911.560998 7379047.825383
+326899.570979 7379005.862571
+326888.372597 7378966.659286
+326873.966432 7378913.928318
+326843.579073 7378801.657549
+326830.343872 7378752.036049
+326823.499501 7378724.120831
+326802.554075 7378668.590343
+326782.647674 7378615.319467
+326703.887925 7378443.088969
+326693.596629 7378420.962759
+326664.042139 7378309.671822
+326659.589174 7378294.304454
+326618.052911 7378115.675052
+326614.993559 7378107.236497
+326564.427673 7377879.465513
+326554.507457 7377794.999981
+326514.059696 7377633.527639
+326464.780222 7377452.288684
+326430.896460 7377373.062255
+326390.910487 7377377.701460
+326251.747099 7377371.212572
+326243.797733 7377371.212572
+326007.642179 7377362.494065
+325958.230765 7377304.893931
+325903.582995 7377263.111088
+325778.520661 7377197.552318
+325636.932881 7377130.673774
+325580.883251 7377107.177798
+325496.046030 7377071.953832
+325491.881684 7377070.224128
+325444.531827 7377051.727297
+Region 1
+177
+340932.074469 7397727.665696
+340958.503639 7397685.492919
+341034.426684 7397563.933741
+341056.460613 7397528.399828
+341071.460506 7397510.272933
+341128.153342 7397444.334228
+341150.418164 7397416.389014
+341167.817711 7397387.274002
+341194.543745 7397338.842297
+341238.529139 7397260.905647
+341261.156796 7397259.645863
+341238.537385 7397260.875652
+341385.831557 7397053.271213
+341419.987444 7397005.619376
+341530.759061 7396799.784633
+341652.646596 7396708.240314
+341744.963148 7396668.397139
+341816.078641 7396642.671545
+341808.723003 7396660.198543
+341816.111626 7396642.631552
+341880.448717 7396603.788206
+341913.845952 7396575.233097
+341935.451076 7396546.158077
+341950.648879 7396506.364893
+341969.887335 7396445.495320
+341969.912074 7396445.505318
+341980.417772 7396412.301006
+341899.283108 7396406.841941
+341881.759868 7396405.132234
+341854.332905 7396402.922612
+341780.158060 7396384.215816
+341643.196415 7396353.031158
+341612.372005 7396347.742064
+341519.173107 7396325.405890
+341472.746828 7396314.617738
+341400.814958 7396298.330528
+341311.937084 7396274.514607
+341302.989924 7396267.655782
+341243.691279 7396236.431130
+341041.147362 7396191.898758
+340966.189126 7396176.621375
+341003.247686 7396032.006147
+341029.322267 7395925.344417
+341068.689773 7395778.099639
+341093.667605 7395664.189150
+341101.930328 7395603.099614
+341116.336493 7395550.278662
+341127.600844 7395514.954713
+341158.384023 7395439.277676
+341192.506926 7395331.356162
+341225.648527 7395221.704944
+341254.601042 7395098.546040
+341268.685604 7395044.875233
+341284.237995 7394985.305437
+341313.520360 7394868.255487
+341324.438370 7394826.842580
+341342.011087 7394756.914558
+341370.872895 7394645.573630
+341386.499502 7394581.344632
+341402.851777 7394523.584526
+341426.106147 7394433.319987
+341418.791741 7394311.310886
+341415.188138 7394283.505649
+341405.218445 7394141.509972
+341398.192657 7394063.833277
+341376.166975 7394068.282515
+341353.382639 7394073.481624
+341313.116295 7394081.630228
+341278.943915 7394088.289088
+341218.169195 7394102.026735
+340924.471445 7394179.943388
+340894.809753 7394191.191462
+340867.811594 7394201.689663
+340818.301225 7394231.484560
+340750.500717 7394272.967454
+340736.778989 7394281.645967
+340683.813450 7394318.649629
+340642.541065 7394347.144748
+340619.369157 7394367.001347
+340552.154131 7394378.809324
+340510.419958 7394382.378713
+340479.010065 7394386.847947
+340399.838005 7394393.676778
+340333.967114 7394401.795387
+340285.256630 7394404.754880
+340239.193186 7394411.163782
+340193.896641 7394414.143272
+340146.703463 7394418.242570
+340102.157325 7394422.371862
+340054.972393 7394426.481159
+340062.748588 7394404.414938
+340052.506770 7394400.105676
+339957.370007 7394357.912904
+339916.419226 7394340.695853
+339888.002715 7394326.288321
+339885.767986 7394319.769437
+339856.749501 7394334.366937
+339827.318703 7394352.403847
+339778.327847 7394391.237196
+339775.491144 7394413.353407
+339686.398868 7394425.061402
+339678.391778 7394428.030893
+339671.118603 7394432.540121
+339665.370980 7394438.969019
+339660.357272 7394446.937655
+339656.077478 7394459.105570
+339652.523352 7394477.022501
+339538.997495 7394449.917144
+339502.153337 7394444.198124
+339455.421947 7394436.859381
+339414.372211 7394432.620107
+339380.166847 7394428.840754
+339339.867517 7394425.761282
+339307.138228 7394428.490814
+339266.410095 7394431.900230
+339223.389510 7394437.569259
+339194.436994 7394442.618394
+339143.351595 7394457.755801
+339121.993858 7394465.194527
+339092.612538 7394476.732551
+339072.796845 7394480.731866
+339009.193668 7394491.919949
+338992.222926 7394521.914812
+338966.346254 7394570.906420
+338945.392582 7394607.430164
+338914.988730 7394670.809307
+338898.372575 7394704.243580
+338878.911470 7394746.326372
+338862.287070 7394795.138011
+338847.847920 7394841.570058
+338834.942569 7394888.032099
+338807.952656 7395002.742450
+338793.752647 7395086.168160
+338758.153669 7395250.370034
+338740.226363 7395335.935377
+338708.173265 7395486.209637
+338688.613206 7395604.439385
+338661.013072 7395771.280807
+338652.527701 7395805.604927
+338637.321651 7395857.096107
+338626.502597 7395885.361266
+338616.763798 7395905.987732
+338604.782025 7395930.833477
+338588.990493 7395956.839022
+338573.561796 7395979.415155
+338558.528917 7396005.050764
+338542.003471 7396033.725852
+338526.269663 7396066.970158
+338462.196451 7396344.182674
+338383.337747 7396580.802143
+338340.927383 7396755.842160
+338321.961053 7396813.082355
+338306.367430 7396863.453727
+338283.632573 7396926.053005
+338252.948348 7396994.811227
+338206.431361 7397106.442105
+338535.431225 7397199.266206
+338585.906403 7397212.193991
+338837.853488 7397289.180804
+338911.335649 7397309.607305
+339021.373351 7397338.952279
+339154.731393 7397356.979191
+339360.862421 7397336.002784
+339523.214210 7397336.002784
+339593.026798 7397346.071059
+339654.560171 7397352.419972
+339841.040431 7397414.219386
+340016.116154 7397512.502551
+340178.896747 7397598.507819
+340221.570991 7397617.284603
+340301.757337 7397650.718876
+340424.617928 7397669.145719
+340657.879054 7397676.074533
+340771.685283 7397678.364140
+340824.461159 7397685.172974
+340880.675714 7397701.700143
+340932.074469 7397727.665696
+Region 1
+1604
+333674.377214 7404344.182346
+333578.795154 7404397.883148
+333578.745677 7404397.913143
+333535.560167 7404430.987477
+333524.510218 7404448.624456
+333518.861550 7404471.110604
+333517.360736 7404497.816030
+333518.383269 7404535.099644
+333518.449238 7404561.345148
+333518.309053 7404573.883000
+333512.759339 7404586.110906
+333505.156315 7404598.878719
+333491.888130 7404614.486046
+333477.407749 7404630.463309
+333470.307744 7404640.001675
+333459.447458 7404646.430574
+333443.647680 7404657.278716
+333427.443837 7404666.997051
+333407.364265 7404671.526275
+333392.587020 7404673.685905
+333338.673164 7404679.114975
+333310.908106 7404680.294773
+333290.828534 7404683.684193
+333278.360233 7404685.353907
+333236.906432 7404700.611293
+333208.044624 7404708.110009
+333201.035328 7404709.949693
+333149.488141 7404759.311238
+333141.612990 7404787.026491
+333145.389764 7404799.144415
+333136.013800 7404859.624056
+333127.916001 7404895.957832
+333120.131560 7404924.772896
+333104.595661 7404961.036685
+333080.656853 7404999.310129
+333061.632799 7405028.335157
+332996.718472 7405116.959976
+332916.029105 7405227.241086
+332897.235945 7405313.646286
+332879.176700 7405392.412794
+332832.964823 7405467.419946
+332836.543688 7405511.762350
+332861.241148 7405568.852571
+332864.284007 7405633.351523
+332854.578194 7405705.229211
+332877.700625 7405756.990345
+332918.849316 7405822.249167
+332887.761026 7405869.301107
+332809.256910 7405952.576843
+332749.026442 7406010.396939
+332738.900071 7406031.033404
+332735.593332 7406050.510068
+332737.283809 7406073.086201
+332744.491015 7406097.032099
+332754.807049 7406115.188989
+332800.598368 7406153.892359
+332830.532185 7406174.618809
+332852.120817 7406197.254932
+332854.396777 7406213.512147
+332846.810245 7406250.155870
+332846.892707 7406261.823871
+332852.467159 7406276.861296
+332875.317464 7406299.007502
+332890.531760 7406310.125598
+332901.400292 7406325.253007
+332913.852100 7406352.558329
+332925.240144 7406382.903132
+332937.403335 7406407.478922
+332956.031570 7406431.534802
+332973.917644 7406448.531890
+332997.782235 7406470.938052
+333031.426856 7406495.783796
+333063.933498 7406512.990849
+333150.518919 7406570.311030
+333186.868304 7406600.255901
+333238.456723 7406725.004533
+333247.956381 7406747.200731
+333259.047561 7406764.087838
+333277.659304 7406783.894446
+333289.962680 7406804.610897
+333307.626106 7406836.815381
+333332.537969 7406873.189150
+333358.340424 7406917.941484
+333364.096293 7406937.538128
+333353.310224 7406969.332682
+333340.140993 7406990.928982
+333337.246566 7407016.244646
+333337.048657 7407047.169349
+333322.840401 7407071.285218
+333301.416694 7407088.972188
+333279.836308 7407100.060289
+333246.158703 7407111.978248
+333225.798759 7407126.125824
+333214.179820 7407145.222553
+333222.137433 7407169.678364
+333228.792141 7407180.166568
+333229.229191 7407201.732874
+333220.067629 7407259.392997
+333225.642081 7407291.437508
+333233.583201 7407300.405972
+333238.869035 7407317.483047
+333238.613401 7407335.729921
+333231.026869 7407354.116772
+333222.483774 7407369.964057
+333209.603162 7407389.800659
+333195.386660 7407407.247671
+333184.707792 7407420.355426
+333171.686994 7407432.333374
+333158.187914 7407442.271671
+333135.296378 7407456.889168
+333126.448172 7407476.015891
+333122.432258 7407492.703033
+333117.839107 7407513.669442
+333112.553274 7407530.576546
+333103.762792 7407546.423831
+333083.105984 7407579.828109
+333078.471602 7407604.353908
+333078.900406 7407626.670086
+333089.892632 7407667.903023
+333104.257566 7407718.824301
+333109.172319 7407744.999817
+333108.322957 7407768.815737
+333104.801817 7407785.252922
+333094.988802 7407801.330168
+333083.971838 7407813.838026
+333077.242914 7407826.405873
+333075.016432 7407840.583444
+333081.118642 7407854.361084
+333088.210401 7407868.658635
+333099.301581 7407886.055655
+333105.073942 7407904.662468
+333107.531319 7407925.988815
+333107.382887 7407953.624081
+333103.193802 7407999.186277
+332938.953626 7408038.109610
+332946.498927 7408125.794590
+332952.411474 7408178.075635
+332961.630760 7408167.287483
+332972.466307 7408144.621365
+332988.637166 7408121.255368
+333004.008140 7408104.198289
+333018.034978 7408096.479612
+333042.179941 7408095.929706
+333058.688895 7408097.089507
+333077.465562 7408101.798700
+333099.029455 7408106.037974
+333139.947252 7408105.628045
+333168.652381 7408106.637872
+333203.938002 7408111.996954
+333221.436503 7408117.206061
+333243.726064 7408127.764253
+333263.954068 7408141.341927
+333282.705997 7408149.600512
+333312.103809 7408160.978563
+333336.941456 7408169.277142
+333352.881420 7408179.535385
+333361.911042 7408196.292515
+333363.807675 7408216.279091
+333361.647163 7408233.706106
+333360.492690 7408253.412730
+333358.488856 7408284.997320
+333358.777474 7408316.101992
+333364.657037 7408347.496615
+333373.167147 7408365.773484
+333381.429870 7408382.780571
+333400.866236 7408402.167250
+333420.121184 7408409.915923
+333441.932464 7408415.414981
+333474.933879 7408421.014022
+333504.372923 7408426.323112
+333535.048901 7408436.701335
+333563.671567 7408448.829257
+333588.426752 7408469.775669
+333606.098424 7408486.362828
+333624.256624 7408506.499379
+333637.862904 7408522.036717
+333660.276159 7408551.811617
+333674.632847 7408569.878523
+333687.999987 7408583.906120
+333707.675493 7408604.802540
+333724.811160 7408624.169223
+333735.349843 7408643.975830
+333744.099094 7408663.772439
+333752.592711 7408684.578875
+333764.153927 7408703.635611
+333778.007594 7408720.952645
+333794.194945 7408730.690977
+333807.858949 7408739.159526
+333828.688928 7408740.599280
+333844.183595 7408741.749083
+333869.837619 7408742.478958
+333895.508135 7408742.698920
+333933.613967 7408743.788733
+333967.720377 7408743.098852
+333999.146762 7408744.668583
+334025.501715 7408746.948192
+334058.923688 7408752.327271
+334092.609540 7408756.956478
+334116.944166 7408758.206264
+334143.851617 7408755.946651
+334174.313193 7408752.977159
+334195.885332 7408751.677382
+334224.037964 7408751.197464
+334247.820093 7408756.476560
+334272.863895 7408763.285394
+334301.626748 7408778.462794
+334318.490290 7408791.500561
+334336.805168 7408811.867072
+334345.158600 7408839.702304
+334351.747338 7408892.253303
+334354.617026 7408936.435735
+334355.367433 7408989.676615
+334353.041996 7409019.931433
+334347.079971 7409059.234700
+334333.960218 7409104.276985
+334321.854752 7409149.319270
+334311.349054 7409186.552892
+334298.625120 7409217.207641
+334273.548333 7409266.669169
+334250.491872 7409289.905189
+334232.877923 7409301.843144
+334218.793361 7409315.580791
+334200.503222 7409345.425678
+334192.924936 7409367.801846
+334186.146534 7409386.908573
+334177.636424 7409405.875324
+334169.967429 7409416.673474
+334165.827822 7409430.771060
+334164.961967 7409450.177735
+334166.198902 7409456.496653
+334170.701344 7409468.624576
+334185.602283 7409479.302746
+334200.297066 7409483.162085
+334217.045160 7409481.752327
+334239.433676 7409468.524593
+334266.143217 7409454.556985
+334287.748342 7409446.868302
+334314.960903 7409433.660565
+334342.627007 7409429.791227
+334371.051764 7409426.431803
+334393.638189 7409424.542126
+334410.897550 7409423.632282
+334430.449363 7409419.213039
+334443.651578 7409417.023414
+334470.385858 7409393.017526
+334489.616068 7409371.011296
+334501.812243 7409342.866117
+334510.907836 7409320.000034
+334512.919916 7409295.794180
+334512.383911 7409272.578157
+334509.060680 7409249.582096
+334508.442213 7409234.684647
+334510.074966 7409223.346589
+334515.204122 7409217.597574
+334525.899483 7409212.908377
+334548.197291 7409215.147994
+334568.606711 7409228.975625
+334598.276649 7409255.011166
+334617.704769 7409265.049446
+334634.848682 7409275.807603
+334660.634645 7409283.886220
+334702.451281 7409286.825716
+334739.790213 7409281.396646
+334760.867579 7409278.077215
+334795.097682 7409278.917071
+334832.238705 7409292.914673
+334859.500744 7409306.302380
+334887.768822 7409320.209998
+334917.100665 7409328.828521
+334940.651899 7409332.347919
+334980.522425 7409326.938845
+335007.454614 7409322.159664
+335040.258119 7409313.151207
+335064.658716 7409307.592159
+335099.416578 7409305.662489
+335131.090350 7409308.502003
+335163.506283 7409313.621126
+335189.811758 7409320.939873
+335217.337676 7409333.077794
+335241.532117 7409348.205202
+335256.111453 7409361.212974
+335278.203105 7409384.648960
+335289.706597 7409401.416088
+335287.265712 7409420.452827
+335287.216235 7409430.031186
+335277.691838 7409454.936920
+335264.918427 7409472.013995
+335250.124689 7409487.561332
+335242.942223 7409501.378965
+335234.209464 7409522.255389
+335225.740585 7409540.112330
+335217.288199 7409555.189748
+335213.428963 7409564.998068
+335182.571568 7409595.832786
+335172.090609 7409611.150162
+335158.558544 7409626.457540
+335150.864811 7409642.294827
+335142.082575 7409671.739784
+335134.091978 7409695.905644
+335131.172812 7409719.841544
+335125.952948 7409745.527145
+335119.743537 7409768.183264
+335110.730407 7409793.338955
+335102.253281 7409813.965422
+335087.624468 7409845.150080
+335075.271615 7409877.354564
+335069.053957 7409901.770382
+335065.392630 7409922.426843
+335065.235952 7409950.662007
+335069.416791 7409974.637900
+335077.704253 7409990.075256
+335090.535388 7410008.802048
+335108.437954 7410028.578660
+335118.267461 7410040.986535
+335138.239832 7410052.954485
+335159.721263 7410066.952087
+335180.971799 7410076.910382
+335205.784707 7410086.128803
+335231.100635 7410095.107265
+335253.159302 7410096.996941
+335279.778135 7410098.666655
+335299.049576 7410099.786463
+335329.733800 7410100.726302
+335358.372959 7410105.435496
+335374.337662 7410108.295006
+335390.277625 7410116.213649
+335398.111545 7410121.552735
+335406.671132 7410132.950782
+335409.145001 7410145.058709
+335409.516082 7410169.274561
+335404.840469 7410189.411111
+335389.436510 7410223.365295
+335378.337084 7410259.859044
+335369.233245 7410300.902014
+335359.453215 7410326.567618
+335345.541824 7410366.570766
+335329.131825 7410398.755253
+335316.564570 7410425.150731
+335311.130304 7410444.787368
+335302.884073 7410468.693273
+335297.928088 7410492.869132
+335297.045742 7410516.065158
+335301.968741 7410543.070533
+335323.573866 7410581.773903
+335341.435201 7410609.359178
+335359.296537 7410635.684669
+335379.186445 7410663.289940
+335393.279253 7410683.546470
+335403.314916 7410704.532876
+335410.810740 7410725.499284
+335431.607733 7410772.521230
+335445.923190 7410799.586594
+335459.224360 7410824.372348
+335483.864097 7410864.605457
+335500.744131 7410886.141768
+335519.900125 7410907.938034
+335540.293053 7410936.043220
+335562.384705 7410978.785899
+335569.616650 7411002.021918
+335583.577518 7411046.484302
+335592.277291 7411080.068550
+335606.568009 7411110.403354
+335624.940611 7411135.978973
+335652.186157 7411164.384107
+335671.614276 7411183.400850
+335694.827416 7411206.236938
+335718.296188 7411227.553287
+335738.738594 7411247.339898
+335761.646623 7411279.494390
+335775.706446 7411305.289971
+335792.792636 7411334.894900
+335805.005303 7411375.557935
+335822.751192 7411422.819840
+335838.014965 7411461.983131
+335846.450859 7411496.327248
+335857.443084 7411527.911838
+335870.002093 7411550.427981
+335883.855761 7411568.914815
+335909.905603 7411582.932414
+335945.611782 7411592.720737
+335962.071259 7411598.619727
+335990.413553 7411610.637668
+336010.888944 7411623.105532
+336030.869561 7411633.313784
+336039.973399 7411639.162782
+336054.115685 7411650.090910
+336067.194207 7411671.347269
+336072.183176 7411686.504673
+336085.022557 7411703.471766
+336104.764034 7411711.410407
+336123.515962 7411715.799655
+336152.171614 7411716.979453
+336170.469999 7411709.520730
+336189.576516 7411695.013215
+336203.595108 7411682.485361
+336219.114514 7411674.006814
+336227.748318 7411671.787194
+336244.257271 7411667.597911
+336259.718954 7411670.207464
+336277.415365 7411681.155589
+336294.080997 7411695.113198
+336309.946745 7411715.889639
+336319.759759 7411730.817082
+336328.509010 7411753.813143
+336335.782185 7411769.740415
+336340.795893 7411780.108639
+336349.371973 7411788.477206
+336362.302063 7411790.066934
+336394.792212 7411785.217764
+336418.928929 7411778.048992
+336441.548340 7411770.620265
+336463.128725 7411765.951064
+336482.919679 7411764.551304
+336498.645241 7411765.911071
+336524.991947 7411771.360138
+336542.968730 7411777.769040
+336565.695342 7411796.055908
+336582.080602 7411814.552739
+336597.632993 7411846.167324
+336608.666450 7411870.433167
+336614.884108 7411892.409403
+336624.169363 7411910.616284
+336626.643233 7411923.494079
+336626.857635 7411929.293085
+336626.824650 7411936.601833
+336628.308971 7411942.410838
+336634.872971 7411948.249838
+336641.164845 7411957.108321
+336646.186799 7411966.466718
+336649.666709 7411979.854425
+336651.464387 7412023.486951
+336652.569382 7412052.991897
+336648.809101 7412091.795250
+336646.376463 7412118.760631
+336646.516648 7412139.687047
+336648.190633 7412159.113719
+336646.549633 7412180.030136
+336634.749277 7412204.425958
+336613.548218 7412232.281186
+336595.423003 7412253.357576
+336581.132286 7412269.664783
+336565.588141 7412282.932510
+336546.745504 7412295.940282
+336530.467445 7412303.908917
+336497.441291 7412314.557093
+336482.449644 7412319.006331
+336471.012122 7412322.975651
+336457.018268 7412331.464197
+336440.162973 7412351.540758
+336429.904662 7412372.657141
+336420.355527 7412403.621837
+336413.346231 7412433.576706
+336409.618934 7412464.571397
+336404.349593 7412501.855011
+336400.383156 7412531.339960
+336405.603020 7412551.036586
+336421.955295 7412575.582382
+336439.379581 7412589.559988
+336466.402479 7412611.396247
+336497.762894 7412628.223365
+336529.609837 7412649.339748
+336556.665719 7412665.127044
+336579.911844 7412682.164125
+336596.090948 7412691.582512
+336616.599324 7412699.011240
+336632.968092 7412706.899888
+336649.988312 7412715.098484
+336670.744074 7412723.287081
+336682.635139 7412729.406033
+336695.491012 7412744.363471
+336715.554091 7412786.586239
+336726.620533 7412803.793291
+336743.772693 7412820.790380
+336759.193144 7412830.208767
+336785.762499 7412842.966581
+336808.307694 7412847.645780
+336831.850682 7412855.844375
+336846.792852 7412860.723540
+336860.217716 7412863.583050
+336877.971850 7412864.442903
+336896.954673 7412871.361717
+336926.550395 7412885.909226
+336950.093383 7412894.617734
+336968.309307 7412903.046290
+336992.643934 7412905.955792
+337015.964274 7412909.125249
+337049.955237 7412908.565345
+337075.073255 7412907.455535
+337104.751439 7412907.625506
+337131.378518 7412908.285393
+337155.441019 7412915.234203
+337177.911998 7412933.771027
+337217.032116 7412969.304941
+337252.861988 7413004.308945
+337279.884886 7413026.905074
+337320.077014 7413051.850801
+337341.607922 7413056.520002
+337369.678091 7413072.567253
+337391.909929 7413088.834466
+337416.656867 7413109.650901
+337428.498454 7413124.348383
+337449.897423 7413153.723352
+337463.767583 7413168.170877
+337494.591993 7413191.546873
+337520.353218 7413211.113521
+337543.079829 7413229.660344
+337564.528275 7413251.466609
+337593.752917 7413286.940533
+337623.950613 7413331.742858
+337655.203827 7413368.996477
+337681.690720 7413395.122002
+337702.141372 7413412.379046
+337723.128029 7413424.107037
+337749.466490 7413432.575587
+337787.976387 7413440.624208
+337828.226239 7413455.481663
+337856.840659 7413464.730079
+337891.516059 7413477.537885
+337914.786922 7413490.535659
+337951.936191 7413515.211432
+337975.190561 7413530.468818
+338005.272811 7413549.305592
+338029.755870 7413570.381982
+338050.965175 7413588.658851
+338064.868320 7413597.057412
+338091.940695 7413610.325140
+338116.728864 7413623.332912
+338139.719355 7413639.350168
+338160.145269 7413662.166260
+338172.704278 7413684.432446
+338177.404629 7413705.888771
+338181.527745 7413740.702807
+338185.436458 7413768.718008
+338192.932282 7413789.434460
+338209.309296 7413810.960773
+338233.050194 7413829.767551
+338254.811996 7413838.466061
+338296.331768 7413852.573645
+338325.218314 7413859.042537
+338360.437965 7413864.801550
+338376.913934 7413866.911189
+338397.191415 7413870.310607
+338414.417791 7413874.189942
+338428.576569 7413882.348545
+338440.649050 7413901.835207
+338451.905155 7413930.390315
+338456.877632 7413949.327072
+338462.023280 7413981.631538
+338465.956732 7414004.597604
+338467.391576 7414020.994796
+338465.231064 7414045.950521
+338468.043029 7414068.926585
+338468.463586 7414086.623554
+338468.694481 7414110.889398
+338466.591692 7414130.126103
+338461.487275 7414155.201807
+338459.318516 7414167.099769
+338456.671476 7414183.057036
+338456.564275 7414197.974481
+338457.661024 7414207.322879
+338461.808878 7414215.621458
+338466.929787 7414220.370644
+338478.647681 7414223.290144
+338507.897061 7414227.299458
+338521.371402 7414229.189134
+338536.429019 7414236.877817
+338555.321134 7414246.806116
+338573.182469 7414254.974717
+338589.229634 7414259.863880
+338601.945322 7414261.263640
+338612.838592 7414258.624092
+338628.720833 7414245.576327
+338642.120957 7414238.617519
+338660.584268 7414230.598892
+338682.890322 7414225.319797
+338714.852712 7414221.210501
+338735.187917 7414222.780232
+338756.273528 7414222.820225
+338794.173204 7414228.519249
+338819.851967 7414230.788860
+338846.800648 7414233.308428
+338866.154552 7414238.167596
+338887.495797 7414238.977457
+338911.393373 7414240.757152
+338930.227764 7414244.616491
+338955.106642 7414243.616663
+338979.482499 7414242.356878
+338995.752313 7414243.716646
+339012.772533 7414243.806630
+339025.719115 7414242.916783
+339037.832828 7414234.958146
+339050.911349 7414221.180506
+339060.204851 7414209.962427
+339095.506965 7414182.057207
+339108.865858 7414171.559005
+339128.046591 7414157.971333
+339149.750670 7414143.343838
+339163.637322 7414133.855464
+339175.973683 7414122.357433
+339184.549763 7414116.208487
+339201.974049 7414105.160379
+339213.625972 7414101.760961
+339237.193700 7414095.711997
+339250.651548 7414095.072107
+339269.922989 7414092.352573
+339285.648551 7414089.673032
+339303.839736 7414079.384794
+339319.243695 7414069.116553
+339329.081448 7414058.828315
+339351.758582 7414040.811401
+339368.300521 7414030.313200
+339392.445484 7414021.124773
+339415.567915 7414013.696046
+339438.426466 7414009.296800
+339466.587344 7414007.697074
+339489.404664 7414009.846705
+339510.935572 7414014.255950
+339537.554405 7414017.435405
+339564.428870 7414019.864989
+339591.542477 7414025.064099
+339612.059099 7414030.483170
+339632.023223 7414044.470775
+339646.421142 7414054.389076
+339656.019754 7414061.497858
+339669.856929 7414077.535111
+339684.617682 7414107.469983
+339694.043124 7414137.214888
+339699.098063 7414161.180783
+339701.390515 7414188.966024
+339703.320133 7414205.383212
+339703.938600 7414216.501307
+339711.162299 7414229.069155
+339720.876358 7414235.548045
+339740.263246 7414244.206562
+339766.247119 7414252.035221
+339791.480585 7414261.393618
+339803.487097 7414268.102468
+339826.452849 7414279.250559
+339853.319069 7414299.717053
+339874.091324 7414321.003407
+339905.905281 7414354.307702
+339928.038165 7414385.182414
+339947.647701 7414417.356903
+339964.783368 7414456.370220
+339973.903699 7414481.305949
+339992.688613 7414506.151693
+340014.013365 7414531.977269
+340027.603153 7414545.494954
+340060.917925 7414576.519639
+340088.056270 7414599.505702
+340117.734454 7414621.461941
+340146.653985 7414644.438006
+340187.769691 7414667.794005
+340217.637539 7414683.431326
+340261.540471 7414705.997461
+340290.822836 7414717.215539
+340307.727608 7414724.234337
+340334.692783 7414738.691861
+340359.901510 7414750.859776
+340388.689101 7414761.297989
+340426.448591 7414784.963935
+340457.165800 7414803.250802
+340493.927496 7414825.147052
+340515.598591 7414837.015019
+340543.479096 7414859.311200
+340574.798280 7414890.725819
+340593.261591 7414916.191457
+340624.391112 7414963.503353
+340646.779628 7414999.107254
+340665.737712 7415025.082805
+340684.728781 7415049.028703
+340700.561544 7415061.086637
+340724.723000 7415076.264038
+340740.052743 7415088.062017
+340751.795375 7415102.079616
+340764.230691 7415122.926045
+340778.653348 7415146.571995
+340793.809920 7415172.497554
+340808.966492 7415198.423113
+340825.483692 7415216.290053
+340851.846891 7415238.306281
+340879.001729 7415257.812940
+340910.312667 7415269.550929
+340935.348223 7415275.149970
+340966.939533 7415284.358393
+340986.862426 7415293.436838
+341003.445596 7415306.754557
+341017.958962 7415323.081760
+341023.879755 7415336.279499
+341028.373951 7415363.084908
+341030.320061 7415390.870149
+341037.568498 7415420.994988
+341045.155030 7415443.291169
+341062.645285 7415464.957458
+341080.473636 7415479.804915
+341100.074926 7415494.682366
+341120.690503 7415509.569816
+341148.917351 7415524.537253
+341177.276138 7415549.113043
+341197.141307 7415563.230625
+341214.878949 7415585.396828
+341222.968502 7415608.212920
+341225.161999 7415636.758030
+341230.860144 7415668.882528
+341237.951903 7415690.418839
+341249.595580 7415713.274923
+341263.416263 7415744.479578
+341275.447514 7415777.693889
+341279.991187 7415800.459989
+341291.478186 7415835.933913
+341301.629296 7415856.240435
+341309.529185 7415874.257349
+341321.247079 7415911.500969
+341333.294822 7415942.685628
+341346.431067 7415967.831320
+341366.329222 7416000.125789
+341382.821683 7416020.512297
+341400.617049 7416037.889320
+341420.201846 7416054.526470
+341447.101051 7416074.033129
+341468.516512 7416085.901096
+341484.679124 7416091.140199
+341508.964273 7416096.729241
+341525.819568 7416108.037304
+341539.912377 7416116.785806
+341554.227833 7416128.823744
+341570.035857 7416142.891334
+341590.766881 7416148.190426
+341607.275835 7416145.860825
+341618.243322 7416140.691711
+341625.706160 7416131.953208
+341638.570280 7416116.705819
+341656.695495 7416107.587381
+341672.470534 7416103.228128
+341692.310965 7416098.678907
+341715.021084 7416087.080894
+341727.085320 7416075.112944
+341746.777319 7416040.778825
+341764.556192 7416017.512810
+341796.089778 7415989.877544
+341819.352395 7415974.760133
+341853.458805 7415965.071793
+341882.188672 7415958.602901
+341905.723414 7415963.432074
+341931.550609 7415966.511546
+341948.950155 7415974.800127
+341969.376069 7415984.388484
+341989.546349 7415994.466758
+342015.456006 7416012.193721
+342031.066120 7416021.212177
+342058.286928 7416035.679698
+342078.053142 7416036.669529
+342108.308563 7416030.720548
+342127.893360 7416025.911372
+342154.908012 7416015.133218
+342174.558780 7416005.524864
+342201.326044 7415993.726885
+342236.479726 7415981.279017
+342275.401934 7415971.400709
+342311.000912 7415963.742021
+342331.632981 7415956.423274
+342350.096291 7415939.986090
+342365.013723 7415922.749042
+342370.555190 7415904.642144
+342375.906993 7415881.746066
+342384.351134 7415854.580719
+342395.104218 7415825.435711
+342406.261368 7415805.129190
+342428.146865 7415778.133814
+342454.559541 7415754.217910
+342484.328434 7415725.042908
+342510.980251 7415702.396787
+342538.869003 7415682.540188
+342550.652867 7415672.841849
+342574.204102 7415654.954913
+342595.974151 7415637.287939
+342624.679280 7415612.902116
+342649.516926 7415593.265480
+342675.665724 7415569.849491
+342704.857380 7415546.983408
+342737.100142 7415523.137492
+342766.910266 7415511.889419
+342797.446058 7415503.670827
+342818.350253 7415495.092296
+342840.615075 7415478.445148
+342854.732622 7415464.477540
+342867.613234 7415448.480280
+342894.091881 7415418.515413
+342919.341839 7415406.957393
+342948.352079 7415398.968761
+342970.179851 7415397.469018
+342989.970805 7415396.949107
+342978.170449 7415387.210775
+342972.447565 7415377.812385
+342960.020495 7415356.965956
+342958.437219 7415341.548597
+342953.885299 7415319.282411
+342948.286109 7415300.035708
+342935.644637 7415276.159797
+342927.480869 7415258.902753
+342914.080744 7415234.256975
+342888.352504 7415181.196064
+342876.725319 7415156.830237
+342865.048657 7415115.807264
+342857.726004 7415092.501256
+342855.045979 7415062.686363
+342849.694175 7415022.743205
+342852.036105 7414997.027610
+342857.313692 7414958.984127
+342863.201501 7414934.068395
+342873.212425 7414903.143692
+342881.846229 7414860.091066
+342884.534500 7414826.806767
+342884.872595 7414799.301479
+342880.452616 7414765.927196
+342871.744596 7414752.449504
+342859.985471 7414739.181777
+342841.291266 7414733.152810
+342819.092413 7414723.044541
+342801.165108 7414716.265702
+342778.949762 7414707.677173
+342759.571120 7414695.329288
+342741.050086 7414675.162743
+342733.150197 7414657.405784
+342731.599906 7414638.708987
+342731.212333 7414607.914262
+342728.837419 7414574.060061
+342721.432304 7414556.813015
+342711.998616 7414540.545801
+342696.899768 7414530.527517
+342677.504633 7414519.439417
+342659.140277 7414507.101530
+342645.591720 7414495.333546
+342620.778812 7414470.547791
+342566.617570 7414419.426548
+342528.544723 7414380.103284
+342448.069758 7414302.916505
+342399.911771 7414258.924041
+342369.598627 7414227.769377
+342339.268991 7414198.134453
+342315.965143 7414174.628480
+342290.385335 7414151.102509
+342267.947342 7414139.734457
+342243.703424 7414131.365890
+342225.751380 7414126.856663
+342207.527210 7414123.867175
+342194.390964 7414119.667894
+342186.350890 7414113.258992
+342173.560986 7414101.501006
+342167.986534 7414087.293439
+342157.612776 7414072.146034
+342143.684892 7414055.988802
+342126.969783 7414035.782263
+342114.311819 7414019.625030
+342102.156875 7414003.967712
+342095.592875 7413988.830305
+342090.290549 7413969.653590
+342085.260348 7413947.207435
+342084.023413 7413927.790761
+342085.845830 7413900.555426
+342087.173474 7413869.280783
+342084.938745 7413840.785664
+342082.951403 7413815.060071
+342082.984388 7413797.153138
+342087.594031 7413772.447370
+342095.238287 7413751.530952
+342103.905076 7413730.604537
+342111.301944 7413706.918594
+342120.496492 7413676.413819
+342123.852707 7413642.629606
+342128.981863 7413612.374789
+342134.358405 7413582.879841
+342142.019154 7413554.134765
+342150.438555 7413527.669298
+342156.062484 7413502.963530
+342163.467599 7413478.257762
+342166.287810 7413460.870740
+342167.095941 7413431.615751
+342162.832640 7413406.640029
+342154.240067 7413387.213357
+342149.465500 7413357.198498
+342146.216485 7413331.972819
+342146.249470 7413310.786448
+342148.566661 7413291.879687
+342150.380831 7413272.213055
+342154.858535 7413246.207510
+342158.330198 7413222.541564
+342157.868409 7413194.046445
+342157.926132 7413164.031586
+342156.705690 7413137.046208
+342156.235655 7413113.590226
+342148.418229 7413085.844978
+342143.115902 7413069.947702
+342121.840627 7413048.731336
+342102.593925 7413029.284667
+342081.054770 7413012.857481
+342063.820148 7412998.709904
+342051.920838 7412985.582153
+342044.078672 7412969.934833
+342039.526753 7412962.366129
+342035.989120 7412955.297340
+342034.480060 7412948.238549
+342041.093537 7412938.160276
+342051.252893 7412932.871181
+342066.236294 7412926.342300
+342077.409936 7412920.303334
+342083.767780 7412911.994757
+342087.354891 7412891.068342
+342085.095423 7412875.431020
+342069.650233 7412859.263790
+342052.415611 7412845.116213
+342030.373437 7412829.198940
+342007.061343 7412812.011884
+341983.741003 7412796.344567
+341956.371763 7412777.637772
+341931.525870 7412764.739981
+341915.058147 7412753.121971
+341884.646049 7412731.385694
+341867.930939 7412712.448938
+341854.514322 7412692.252397
+341845.418730 7412673.575596
+341833.791544 7412645.820351
+341825.710238 7412622.864283
+341807.989089 7412600.138176
+341792.304758 7412575.402413
+341772.563282 7412544.607688
+341754.833886 7412525.920888
+341728.503672 7412493.346468
+341703.690764 7412464.811356
+341679.372629 7412439.305725
+341648.721390 7412409.250873
+341563.842938 7412339.272860
+341468.846361 7412251.367917
+341439.448549 7412229.631640
+341412.087555 7412208.665231
+341386.491255 7412188.958607
+341363.179161 7412172.281464
+341340.625721 7412153.834623
+341319.853466 7412133.878042
+341308.721054 7412114.441371
+341292.286317 7412080.627163
+341282.679458 7412062.710232
+341273.592112 7412035.964813
+341261.973173 7412005.430044
+341245.274556 7411976.405015
+341234.397777 7411956.718388
+341218.977326 7411927.693359
+341196.704257 7411894.878980
+341179.741761 7411870.143217
+341168.370209 7411845.657411
+341154.186692 7411831.519833
+341135.690397 7411814.342775
+341107.826383 7411787.067447
+341087.054128 7411769.890390
+341062.488607 7411741.605235
+341044.767457 7411719.139083
+340989.798084 7411664.578429
+340954.611418 7411621.405824
+340937.896308 7411598.679716
+340922.459364 7411576.973434
+340904.993848 7411550.977887
+340891.832864 7411534.310742
+340866.756076 7411508.045241
+340837.613897 7411485.809050
+340803.655920 7411464.572688
+340777.037087 7411447.895544
+340750.937767 7411430.448533
+340728.631713 7411414.781217
+340706.845172 7411397.604159
+340687.087203 7411379.667231
+340671.130747 7411363.250043
+340658.720170 7411350.122292
+340654.184743 7411330.945577
+340650.919236 7411308.999336
+340656.279285 7411293.372013
+340661.375456 7411278.754517
+340680.193354 7411257.858096
+340693.906836 7411249.549519
+340717.021020 7411235.971845
+340736.564587 7411230.702748
+340758.911872 7411224.173866
+340777.366936 7411217.674979
+340786.264619 7411206.336921
+340796.935242 7411194.498949
+340799.475081 7411188.449985
+340813.699828 7411176.112098
+340825.129104 7411162.754386
+340842.149324 7411147.896931
+340858.905665 7411133.039476
+340875.670252 7411117.932064
+340887.355161 7411107.353876
+340901.068642 7411092.486423
+340914.015224 7411085.697586
+340928.487359 7411074.109571
+340951.865423 7411046.144361
+340961.274372 7411031.276907
+340967.632216 7411018.419110
+340972.728387 7411001.272047
+340974.773452 7410990.433903
+340981.139542 7410973.286841
+340985.955340 7410959.729163
+340992.667772 7410948.551078
+340995.867310 7410941.602268
+341000.600646 7410851.987618
+340996.320852 7410832.051033
+340991.018526 7410815.643843
+340980.636522 7410800.746395
+340974.831175 7410786.868772
+340972.307829 7410773.751019
+340969.800975 7410755.834088
+340969.817467 7410745.235904
+340977.964743 7410723.559617
+340992.709003 7410701.383415
+341003.140485 7410682.726611
+341008.995309 7410663.819849
+341011.056867 7410645.413002
+341010.067319 7410626.236287
+341005.531892 7410611.098880
+340995.405521 7410596.701346
+340985.287396 7410578.524460
+340974.658004 7410563.627012
+340969.611311 7410549.499431
+340967.079719 7410543.190512
+340963.294699 7410532.842285
+340963.129774 7410519.884504
+340961.488774 7410508.746412
+340967.038487 7410501.037733
+340978.904813 7410487.190105
+341001.845827 7410459.484850
+341010.619816 7410442.497760
+341010.858957 7410419.981617
+341006.430731 7410396.635616
+341001.936535 7410382.757993
+340997.285661 7410361.361658
+340991.727702 7410344.704511
+340986.425376 7410327.797407
+340981.139542 7410304.841339
+340978.880075 7410287.934235
+340964.704804 7410271.517047
+340948.484468 7410264.428262
+340930.738580 7410256.589604
+340912.497918 7410245.461510
+340897.803135 7410232.073804
+340890.480482 7410213.397003
+340885.169910 7410204.558517
+340878.605910 7410183.112190
+340875.579543 7410168.724655
+340872.808810 7410159.896167
+340863.952358 7410142.479150
+340853.578600 7410128.591529
+340848.762801 7410126.571875
+340838.619938 7410123.522397
+340838.619938 7410123.522397
+340804.109462 7410135.840288
+340783.048589 7410143.378996
+340767.059148 7410149.158006
+340752.083993 7410158.976325
+340737.620105 7410163.745508
+340721.375030 7410171.284216
+340699.563750 7410174.033745
+340691.952479 7410175.783446
+340680.036676 7410173.503836
+340658.744908 7410162.875657
+340628.085423 7410143.658948
+340611.625946 7410126.991803
+340596.436390 7410109.064874
+340586.062631 7410093.407556
+340573.149034 7410077.250323
+340562.519643 7410066.642141
+340551.370739 7410057.033786
+340542.761674 7410049.705042
+340532.627057 7410042.886210
+340528.569911 7410038.846902
+340510.065370 7410032.507987
+340490.546542 7410025.929114
+340479.397638 7410023.139592
+340473.567553 7410019.600198
+340465.197629 7410018.570375
+340460.126197 7410016.550721
+340455.813418 7410017.800507
+340452.506680 7410026.379037
+340450.717248 7410032.927916
+340448.177409 7410037.467138
+340438.529319 7410044.515931
+340417.006657 7410020.020126
+340398.518608 7410003.852896
+340385.101991 7409989.205405
+340373.194434 7409976.827525
+340364.841002 7409967.479126
+340352.430425 7409956.111074
+340341.133089 7409948.062452
+340328.986391 7409943.453242
+340319.132145 7409936.834375
+340299.671041 7409922.856770
+340282.725037 7409913.678342
+340275.385892 7409911.618695
+340264.228742 7409911.048792
+340253.830245 7409910.488888
+340243.233839 7409900.090669
+340238.690165 7409895.521452
+340236.455437 7409886.682966
+340226.865071 7409878.554358
+340223.104790 7409870.465744
+340214.256584 7409864.366789
+340210.001529 7409854.248522
+340208.286313 7409842.900465
+340206.587590 7409828.013016
+340202.629399 7409810.586001
+340192.280379 7409801.447566
+340183.959933 7409792.329128
+340174.089195 7409787.479959
+340167.508703 7409785.170354
+340156.895804 7409777.041746
+340148.303231 7409772.452533
+340140.741438 7409762.574225
+340136.238996 7409751.196174
+340130.986147 7409738.058424
+340125.716806 7409727.180287
+340115.343047 7409722.081161
+340094.323406 7409715.902219
+340081.640703 7409715.832231
+340068.958000 7409717.022027
+340055.252765 7409717.691913
+340041.794916 7409720.891365
+340026.819761 7409722.071162
+340009.576893 7409721.461267
+339995.409869 7409714.322490
+339984.343427 7409697.105439
+339976.822865 7409681.428124
+339971.297891 7409671.059900
+339966.300675 7409656.912324
+339964.354564 7409642.024874
+339953.048982 7409621.788340
+339947.779641 7409610.660246
+339942.774179 7409598.272368
+339940.547696 7409587.674183
+339935.022722 7409578.315786
+339929.489501 7409569.457304
+339922.430728 7409561.598650
+339919.684733 7409553.510035
+339918.200411 7409546.691203
+339919.824919 7409527.794440
+339922.653376 7409520.495691
+339926.248733 7409512.707025
+339925.572542 7409497.319660
+339919.824919 7409487.751299
+339915.009120 7409479.612693
+339909.261497 7409464.445291
+339905.921774 7409448.068097
+339898.491920 7409429.821222
+339893.338026 7409412.364212
+339885.479368 7409386.048720
+339877.084705 7409363.002668
+339866.183188 7409336.147268
+339858.002928 7409316.630611
+339852.420230 7409290.845028
+339848.643456 7409262.039962
+339868.953922 7409259.720359
+339885.767986 7409252.571583
+339899.530945 7409245.132858
+339919.231190 7409227.165935
+339937.735732 7409202.620140
+339948.604264 7409179.774053
+339957.172097 7409159.917454
+339962.515655 7409131.462328
+339967.916936 7409098.208025
+339972.114267 7409083.370566
+339975.082910 7409065.483630
+339980.005910 7409028.689932
+339979.206026 7409006.733693
+339978.356664 7408989.316677
+339970.992780 7408964.011011
+339964.610197 7408942.244740
+339956.974188 7408919.458643
+339952.108912 7408897.962325
+339952.282083 7408880.055392
+339960.379881 7408856.419441
+339968.411710 7408838.582496
+339971.182443 7408814.636598
+339972.188483 7408788.911004
+339971.941097 7408762.165586
+339973.771760 7408730.640985
+339984.632045 7408709.554597
+340007.655521 7408688.838146
+340025.244731 7408679.429757
+340039.428248 7408675.310463
+340041.019771 7408668.751587
+340045.101655 7408660.772953
+340048.647534 7408655.273895
+340051.657408 7408648.365079
+340050.775061 7408640.736385
+340046.874594 7408635.067356
+340042.083534 7408631.337995
+340038.009896 7408626.728785
+340035.700952 7408619.100091
+340030.027545 7408608.111974
+340026.654837 7408604.382612
+340021.336018 7408603.142825
+340011.588973 7408600.663249
+340006.261908 7408595.874070
+340003.070617 7408589.845103
+340002.188271 7408582.576348
+340000.415331 7408574.237776
+339996.688035 7408568.748716
+339989.777693 7408558.990388
+339987.650166 7408555.450994
+339986.759573 7408546.582513
+339987.650166 7408539.663698
+339990.305452 7408530.975186
+340005.734150 7408506.679348
+340015.662611 7408481.503660
+340023.108958 7408461.107154
+340025.945661 7408455.618094
+340030.200716 7408451.888733
+340044.565650 7408443.560160
+340053.611765 7408436.821314
+340058.930584 7408428.132802
+340060.348935 7408420.864047
+340059.639759 7408399.577694
+340057.330815 7408376.351672
+340057.512232 7408368.722979
+340060.348935 7408363.403890
+340067.440694 7408355.785195
+340069.922809 7408350.636077
+340071.167990 7408347.806562
+340070.458814 7408344.077200
+340068.331287 7408341.597625
+340063.721644 7408332.379204
+340062.121875 7408327.769994
+340061.412699 7408320.671210
+340060.348935 7408303.294186
+340058.221408 7408294.255734
+340055.557875 7408285.037313
+340053.430348 7408280.958012
+340044.747067 7408266.240533
+340032.864249 7408245.494087
+340027.190842 7408236.975546
+340022.754370 7408230.236700
+340020.453671 7408225.097580
+340012.652737 7408201.511621
+340008.389436 7408189.103746
+340002.716029 7408169.237149
+339997.578628 7408158.778940
+339993.323573 7408152.749973
+339985.341221 7408146.900975
+339954.310655 7408128.634104
+339947.573485 7408122.425167
+339942.963842 7408114.986442
+339940.836315 7408108.597536
+339934.272315 7408083.591819
+339929.662672 7408067.994491
+339920.971145 7408031.820687
+339919.025034 7408022.062359
+339917.252095 7408013.913754
+339916.006914 7408004.515364
+339915.652326 7407995.466914
+339915.825497 7407962.662533
+339914.588562 7407949.894720
+339911.042683 7407934.997272
+339880.523384 7408001.065955
+339864.072153 7407998.106462
+339830.914060 7408023.382133
+339783.506480 7408042.338885
+339739.290191 7408048.657803
+339610.236682 7408099.919022
+339579.758613 7408108.677522
+339562.672423 7408107.887657
+339554.277760 7408104.978156
+339600.258743 7408019.822742
+339646.239725 7407912.531120
+339683.702350 7407825.685996
+339717.767529 7407742.240290
+339751.824462 7407634.948668
+339785.889641 7407525.957337
+339816.540880 7407379.502423
+339831.565512 7407299.006212
+339844.495602 7407178.736813
+339847.348798 7407144.512675
+339820.127990 7407136.734007
+339805.911489 7407138.103773
+339789.410781 7407140.463368
+339776.975465 7407141.103259
+339763.303215 7407138.443714
+339748.468246 7407125.425944
+339733.402383 7407109.888606
+339714.007248 7407096.570887
+339699.889701 7407087.852380
+339678.672150 7407079.313843
+339671.225804 7407062.086794
+339660.983985 7407046.079536
+339650.676197 7407037.151065
+339635.329962 7407023.873339
+339618.985932 7407010.085701
+339598.848637 7406993.998457
+339579.181377 7406982.190479
+339562.804363 7406971.432322
+339541.405394 7406955.325081
+339527.889822 7406936.518302
+339519.693069 7406919.281255
+339512.197245 7406910.302793
+339503.645904 7406900.194524
+339487.499785 7406891.206064
+339478.931951 7406885.567030
+339476.524052 7406873.179152
+339435.573270 7406833.405965
+339432.464441 7406813.949297
+339422.164899 7406777.265581
+339413.786729 7406752.699789
+339397.879750 7406718.985564
+339386.904017 7406699.958823
+339369.174621 7406672.023608
+339357.745345 7406647.437819
+339329.576222 7406596.946468
+339299.914530 7406570.411013
+339282.069687 7406553.833853
+339270.500225 7406543.875559
+339251.929714 7406523.759004
+339246.718096 7406511.591089
+339241.564202 7406494.384036
+339240.244805 7406473.177668
+339240.434468 7406453.501039
+339237.655489 7406426.725625
+339236.517509 7406413.587876
+339230.712162 7406384.262899
+339220.610530 7406354.388016
+339209.981139 7406325.273003
+339200.027938 7406306.246262
+339197.059295 7406298.147650
+339191.385888 7406281.940426
+339188.895527 7406251.635617
+339188.054411 7406233.208773
+339184.013758 7406205.663491
+339177.441512 7406177.338343
+339171.900045 7406147.763409
+339160.949051 7406100.221553
+339155.894112 7406071.906403
+339147.078891 7406032.783104
+339124.096646 7406000.868571
+339110.696522 7405997.679117
+339101.757608 7405997.679117
+339094.740065 7405998.958898
+339036.999958 7406045.990842
+338970.634294 7406070.436654
+338869.337597 7406045.990842
+338809.964736 7406026.784132
+338762.804543 7405998.838918
+338715.652596 7405981.371910
+338678.156985 7405958.225875
+338682.486256 7405934.050016
+338679.954664 7405911.313911
+338679.105302 7405897.166334
+338674.190548 7405883.238720
+338666.801926 7405864.731890
+338660.534791 7405858.093027
+338658.102152 7405849.484501
+338657.953720 7405839.646187
+338658.852559 7405828.048173
+338657.970213 7405816.170208
+338651.472183 7405808.271561
+338647.208882 7405804.192260
+338635.672405 7405792.704227
+338627.426174 7405782.256017
+338616.706075 7405766.238761
+338610.785281 7405751.781237
+338602.860653 7405735.793976
+338597.665528 7405724.375931
+338592.016860 7405708.158709
+338577.214876 7405694.621028
+338570.180841 7405688.732037
+338559.337048 7405683.812880
+338536.857823 7405675.984221
+338522.954678 7405672.794767
+338510.362684 7405665.336044
+338501.794851 7405660.186926
+338484.741646 7405643.839727
+338479.035254 7405632.921597
+338474.293671 7405626.312729
+338470.822008 7405619.453904
+338442.017925 7405588.589190
+338426.003745 7405570.492290
+338413.733353 7405556.974606
+338406.996183 7405547.306262
+338402.312324 7405535.898216
+338389.629621 7405514.051958
+338375.355396 7405498.494623
+338366.284542 7405493.595462
+338356.677684 7405490.955914
+338341.051077 7405482.957284
+338326.174876 7405475.718524
+338309.814355 7405465.440285
+338283.607834 7405428.546604
+338273.720603 7405409.839809
+338270.149985 7405408.200090
+338258.432092 7405390.903052
+338243.984696 7405368.526885
+338231.499902 7405351.479805
+338218.000823 7405334.922641
+338205.713939 7405322.414784
+338197.673864 7405312.686450
+338190.219272 7405303.058099
+338177.025303 7405281.711756
+338166.371173 7405259.885494
+338151.429003 7405236.499500
+338141.764421 7405216.442936
+338134.821094 7405202.995239
+338128.834331 7405194.346721
+338121.775557 7405190.727341
+338108.103307 7405189.057627
+338093.367293 7405191.917137
+338087.768102 7405193.616846
+338077.872625 7405194.516692
+338064.233360 7405190.067454
+338049.596301 7405184.098476
+338031.207206 7405173.540285
+338024.643207 7405171.190687
+338013.057253 7405164.751790
+338001.900103 7405164.371855
+337994.544465 7405164.541826
+337985.720998 7405160.402535
+337981.218556 7405154.793496
+337975.487426 7405146.144977
+337973.038295 7405138.806234
+337968.865703 7405126.638318
+337966.688698 7405117.529879
+337970.399501 7405103.442292
+337977.887079 7405091.164395
+337984.261415 7405086.385213
+338000.325072 7405079.536387
+338032.073060 7405067.968368
+338047.938808 7405064.049039
+338067.342189 7405059.939743
+338085.170540 7405058.170046
+338110.445237 7405054.650649
+338139.447230 7405051.711153
+338147.528536 7405050.341387
+338161.192540 7405047.791824
+338180.785584 7405046.612026
+338197.245060 7405043.472564
+338226.634626 7405037.603569
+338243.292012 7405033.684241
+338268.764619 7405027.605282
+338309.327827 7405019.966590
+338334.800434 7405012.717832
+338357.527045 7405008.988471
+338388.879214 7405002.129646
+338396.911043 7404999.980014
+338410.039042 7404995.270821
+338416.899906 7404993.711088
+338409.098972 7404985.572482
+338401.842289 7404979.013605
+338366.259804 7404957.587275
+338354.162583 7404947.738962
+338334.000549 7404930.521911
+338308.948501 7404914.054732
+338281.447321 7404898.377418
+338242.591083 7404879.330680
+338215.840310 7404869.322394
+338182.542031 7404862.483566
+338168.729595 7404859.904008
+338158.207404 7404854.934859
+338149.326214 7404848.355986
+338143.710531 7404841.017243
+338136.519818 7404828.789337
+338130.096004 7404814.041863
+338102.017589 7404777.238168
+338090.695514 7404757.661521
+338084.799459 7404742.804066
+338076.305842 7404723.927299
+338070.830344 7404712.589241
+338066.633013 7404703.400815
+338054.370868 7404682.644371
+338044.458899 7404666.367159
+338030.539262 7404642.311279
+338010.014393 7404607.397260
+337999.632389 7404589.470331
+337988.310314 7404566.584251
+337974.390677 7404544.408049
+337965.897060 7404529.310635
+337939.946172 7404488.267666
+337902.912350 7404428.347929
+337884.976798 7404396.743343
+337870.826266 7404372.677465
+337855.727418 7404347.911707
+337839.210218 7404321.726193
+337823.171299 7404294.590841
+337812.080119 7404276.433951
+337805.243994 7404263.216215
+337799.817974 7404251.898154
+337792.734462 7404242.699729
+337785.659196 7404235.151022
+337777.404719 7404230.191872
+337758.999133 7404224.772800
+337733.996561 7404221.463367
+337710.164955 7404222.413204
+337698.133704 7404224.062921
+337673.131133 7404229.481993
+337660.629847 7404233.021387
+337641.284190 7404240.100174
+337620.281041 7404248.598719
+337605.660474 7404257.557184
+337587.254887 7404269.585124
+337570.506792 7404277.613749
+337564.140702 7404279.973345
+337551.631170 7404282.802860
+337539.369026 7404285.392416
+337534.883076 7404285.162456
+337529.457056 7404283.502740
+337522.851826 7404281.153142
+337497.140078 7404268.175365
+337491.474918 7404263.926093
+337484.399652 7404259.676821
+337417.638169 7404197.637448
+337402.061039 7404180.660356
+337381.536171 7404158.244196
+337357.242775 7404132.768559
+337320.670743 7404094.085186
+337289.772116 7404056.571611
+337277.262584 7404039.584521
+337264.522158 7404025.436944
+337250.371626 7404015.758602
+337230.085899 7404008.689813
+337208.612714 7404007.270056
+337184.080178 7404008.919774
+337164.973662 7404012.229207
+337143.269583 7404017.648278
+337130.760051 7404023.077349
+337123.940418 7404027.326621
+337102.533203 7403993.292450
+337061.120633 7403917.935358
+337003.479481 7403951.209659
+336890.291719 7404014.188871
+336863.631655 7404032.395752
+336790.636021 7404073.218760
+336764.338792 7404078.897787
+336735.435754 7404085.016739
+336700.785092 7404086.176540
+336678.709933 7404089.965891
+336655.084482 7404097.964521
+336630.403514 7404116.621325
+336614.108962 7404137.047826
+336593.147044 7404177.150957
+336571.492442 7404204.936198
+336561.217639 7404216.744175
+336547.223785 7404230.821764
+336521.610993 7404238.800397
+336494.266492 7404244.919349
+336464.192489 7404244.559411
+336432.609425 7404239.580264
+336399.104990 7404239.200329
+336375.083720 7404240.380127
+336364.083249 7404242.689731
+336343.533642 7404249.168621
+336317.681709 7404265.545816
+336297.313519 7404295.350711
+336283.228957 7404315.197311
+336270.422561 7404345.922048
+336262.102114 7404312.637749
+336208.443892 7404340.522973
+336151.388222 7404372.117561
+336137.930373 7404343.362487
+336082.886784 7404315.837201
+336019.506255 7404306.238845
+335888.176786 7404290.321572
+335817.514835 7404277.353793
+335730.088298 7404262.496338
+335639.544685 7404248.888669
+335605.891818 7404243.089662
+335572.807941 7404232.081548
+335548.761932 7404217.304079
+335548.745440 7404217.314078
+335468.344691 7404202.616595
+335423.303779 7404295.690652
+335317.356208 7404380.446134
+335218.475656 7404389.864521
+335129.004054 7404375.736941
+335010.522212 7404275.864048
+334987.746123 7404213.284768
+334903.980912 7404223.842959
+334903.972666 7404223.812964
+334903.947927 7404223.842959
+334900.476264 7404177.790847
+334903.857218 7404130.598931
+334784.311613 7404192.278366
+334720.881606 7404220.653505
+334627.460059 7404254.037787
+334525.602619 7404265.715787
+334448.690025 7404241.949858
+334417.156439 7404228.962082
+334360.356403 7404239.010361
+334313.682737 7404235.660935
+334206.844573 7404269.015222
+334101.630916 7404320.766357
+334079.959822 7404329.144922
+334047.560382 7404315.467265
+334047.535643 7404315.507258
+333976.106793 7404294.530851
+333919.768545 7404284.042648
+333908.075390 7404279.043504
+333899.688974 7404270.744925
+333888.053542 7404260.756636
+333879.700111 7404249.038643
+333837.941199 7404223.982935
+333784.530363 7404203.956366
+333674.377214 7404344.182346
+Region 1
+309
+336731.683719 7401133.962228
+336700.438751 7401143.370616
+336636.266584 7401131.822594
+336560.112644 7401115.985307
+336526.311344 7401109.146478
+336449.769831 7401085.420543
+336430.382943 7401079.671527
+336325.977417 7401053.615990
+336219.312424 7401025.530801
+336018.673386 7400980.858453
+335984.896825 7400976.219248
+335954.459988 7400971.630034
+335903.333358 7400983.537994
+335855.595928 7400990.176857
+335831.723091 7400994.146177
+335803.916801 7400998.205482
+335700.022541 7401017.782128
+335561.840454 7401046.657182
+335495.837624 7401037.718713
+335470.290801 7401032.279645
+335482.891042 7401078.571716
+335499.639136 7401130.622800
+335525.449838 7401190.002629
+335555.342424 7401264.669839
+335593.266839 7401358.003851
+335603.088100 7401380.769952
+335672.521362 7401553.330394
+335623.283119 7401573.077011
+335496.522061 7401625.518029
+335479.336916 7401617.959323
+335466.967570 7401608.330973
+335345.962382 7401691.516724
+335334.961910 7401700.455193
+335242.158831 7401759.575066
+335176.156001 7401802.197765
+335121.079426 7401837.441728
+335046.220144 7401888.822927
+335172.626614 7402004.713076
+335221.320606 7402042.096673
+335299.527857 7402188.171651
+335333.469343 7402249.651120
+335363.930919 7402293.653583
+335314.783384 7402304.251768
+335191.320819 7402326.877892
+335135.246450 7402341.135450
+335075.733404 7402353.433343
+335019.659035 7402365.731237
+335001.459604 7402367.700899
+334969.002440 7402374.089805
+334891.776490 7402389.337193
+334793.704069 7402411.423410
+334665.211303 7402435.339314
+334607.965970 7402447.867168
+334482.046028 7402473.942701
+334377.640502 7402474.472610
+334416.752374 7402546.400290
+334440.996292 7402584.113830
+334457.727894 7402613.128860
+334505.440585 7402703.143441
+334573.636912 7402794.947716
+334605.285945 7402826.602294
+334622.429859 7402862.286182
+334648.372500 7402926.965103
+334672.665896 7402986.454913
+334674.710961 7402993.943630
+334691.120960 7403041.125548
+334701.049422 7403070.810463
+334719.133406 7403109.983753
+334745.364665 7403167.883835
+334585.313575 7403210.856475
+334545.772899 7403205.097461
+334497.928268 7403171.743174
+334445.977015 7403218.635142
+334395.229712 7403230.473114
+334370.425050 7403207.896982
+334267.660524 7403234.542417
+334100.022901 7403279.534711
+334031.348292 7403215.435690
+333944.358805 7403279.524712
+333845.354560 7403296.121869
+333788.125719 7403323.597163
+333795.926654 7403394.704983
+333870.200453 7403447.825884
+333862.820077 7403475.371166
+333850.516700 7403498.977122
+333832.333762 7403504.396194
+333800.849653 7403543.249539
+333766.413394 7403570.304904
+333725.503844 7403592.701068
+333702.422644 7403599.919832
+333685.361193 7403602.849330
+333655.847934 7403612.067751
+333614.690996 7403629.464771
+333610.551389 7403631.814368
+333602.280419 7403637.273433
+333597.786224 7403641.912639
+333585.590048 7403662.269152
+333592.879716 7403577.303705
+333496.176170 7403582.502815
+333488.507175 7403626.375300
+333475.717271 7403686.375023
+333461.946066 7403760.152385
+333454.079162 7403829.020589
+333464.898217 7403873.283007
+333484.136673 7403893.249587
+333523.965967 7403929.193430
+333544.383634 7403961.247939
+333553.751352 7404001.810991
+333555.887126 7404015.478650
+333559.771100 7404042.434033
+333563.432427 7404056.451632
+333566.590733 7404072.278921
+333580.238245 7404082.817116
+333592.154048 7404090.245843
+333607.236404 7404104.853341
+333617.667886 7404114.581675
+333629.311563 7404127.709426
+333635.182880 7404137.507748
+333635.100417 7404155.404682
+333631.876141 7404167.242654
+333626.779970 7404180.260424
+333624.231885 7404186.389375
+333616.958710 7404206.285967
+333607.079725 7404221.293396
+333606.890062 7404240.320137
+333603.649294 7404273.094523
+333599.361254 7404311.207994
+333597.530590 7404337.503490
+333593.357998 7404360.389570
+333578.795154 7404397.883148
+333674.377214 7404344.182346
+333784.530363 7404203.956366
+333837.941199 7404223.982935
+333879.700111 7404249.038643
+333888.053542 7404260.756636
+333899.688974 7404270.744925
+333908.075390 7404279.043504
+333919.768545 7404284.042648
+333976.106793 7404294.530851
+334047.535643 7404315.507258
+334047.560382 7404315.467265
+334079.959822 7404329.144922
+334101.630916 7404320.766357
+334206.844573 7404269.015222
+334313.682737 7404235.660935
+334360.356403 7404239.010361
+334417.156439 7404228.962082
+334448.690025 7404241.949858
+334525.602619 7404265.715787
+334627.460059 7404254.037787
+334720.881606 7404220.653505
+334784.311613 7404192.278366
+334903.857218 7404130.598931
+334900.476264 7404177.790847
+334903.947927 7404223.842959
+334903.972666 7404223.812964
+334903.980912 7404223.842959
+334987.746123 7404213.284768
+335010.522212 7404275.864048
+335129.004054 7404375.736941
+335218.475656 7404389.864521
+335317.356208 7404380.446134
+335423.303779 7404295.690652
+335468.344691 7404202.616595
+335548.745440 7404217.314078
+335548.761932 7404217.304079
+335572.807941 7404232.081548
+335605.891818 7404243.089662
+335639.544685 7404248.888669
+335730.088298 7404262.496338
+335817.514835 7404277.353793
+335888.176786 7404290.321572
+336019.506255 7404306.238845
+336082.886784 7404315.837201
+336137.930373 7404343.362487
+336151.388222 7404372.117561
+336208.443892 7404340.522973
+336262.102114 7404312.637749
+336270.422561 7404345.922048
+336283.228957 7404315.197311
+336297.313519 7404295.350711
+336317.681709 7404265.545816
+336343.533642 7404249.168621
+336364.083249 7404242.689731
+336375.083720 7404240.380127
+336399.104990 7404239.200329
+336432.609425 7404239.580264
+336464.192489 7404244.559411
+336494.266492 7404244.919349
+336521.610993 7404238.800397
+336547.223785 7404230.821764
+336561.217639 7404216.744175
+336571.492442 7404204.936198
+336593.147044 7404177.150957
+336614.108962 7404137.047826
+336630.403514 7404116.621325
+336655.084482 7404097.964521
+336678.709933 7404089.965891
+336700.785092 7404086.176540
+336735.435754 7404085.016739
+336764.338792 7404078.897787
+336790.636021 7404073.218760
+336863.631655 7404032.395752
+336890.291719 7404014.188871
+337003.479481 7403951.209659
+337061.120633 7403917.935358
+337113.566660 7403886.580729
+337122.686991 7403878.582099
+337131.436242 7403869.833598
+337146.798969 7403860.325226
+337193.118047 7403823.161592
+337213.882056 7403806.924374
+337264.241786 7403772.430282
+337271.696379 7403768.960876
+337299.700578 7403755.933108
+337360.582499 7403736.176492
+337433.718318 7403712.450556
+337475.980251 7403715.200085
+337601.042585 7403775.399773
+337630.580583 7403667.568244
+337649.200572 7403615.967083
+337664.563299 7403561.206463
+337706.660307 7403575.983932
+337771.657097 7403509.505319
+337799.669542 7403482.999859
+337909.657766 7403366.019896
+338038.290718 7403234.742383
+338135.051989 7403129.120475
+338150.620872 7403101.005291
+338160.763736 7403082.698427
+338172.390921 7403057.542736
+338173.743303 7403053.073501
+338191.068634 7402980.745890
+338193.633211 7402916.906825
+338180.562936 7402861.376337
+338168.383253 7402805.975827
+338163.740625 7402794.227839
+338222.758898 7402744.796306
+338304.421320 7402672.208740
+338291.301567 7402662.410418
+338275.716191 7402648.882736
+338265.919669 7402639.444352
+338249.254037 7402631.455721
+338236.332194 7402629.316087
+338219.633577 7402624.346938
+338204.749130 7402615.368476
+338184.389187 7402597.251580
+338139.537938 7402567.276714
+338115.813533 7402554.678872
+338108.218754 7402548.929857
+337976.122386 7402452.076447
+337867.255649 7402373.799855
+337823.154807 7402345.094772
+337775.301931 7402310.550689
+337738.276355 7402284.445160
+337708.309553 7402276.966441
+337644.096155 7402261.299125
+337615.811584 7402248.141379
+337600.110760 7402221.335970
+337590.635841 7402205.748640
+337570.045004 7402185.612090
+337548.134769 7402170.004763
+337518.407107 7402149.008360
+337502.599083 7402132.201238
+337485.092335 7402106.805589
+337477.390356 7402093.597851
+337459.759915 7402057.594018
+337452.313569 7402042.376625
+337442.385107 7402022.340057
+337428.135620 7402002.513453
+337397.954416 7401954.021759
+337366.552770 7401901.220803
+337358.883775 7401892.032377
+337350.019077 7401880.874288
+337335.612912 7401852.469154
+337322.385959 7401831.392764
+337313.323351 7401801.777837
+337306.008944 7401774.712473
+337300.871543 7401757.245465
+337292.031584 7401729.910147
+337286.605564 7401715.472620
+337279.695222 7401700.025268
+337270.055379 7401674.179693
+337250.586028 7401620.738847
+337227.991356 7401575.346623
+337202.856845 7401529.424489
+337182.200038 7401492.130877
+337167.043466 7401462.455960
+337158.178768 7401437.640210
+337146.477366 7401416.833774
+337133.943096 7401402.826174
+337100.941681 7401379.280207
+337078.297531 7401361.143314
+337053.171267 7401337.677333
+337034.518293 7401323.849702
+337017.382626 7401314.611284
+336977.668779 7401301.343557
+336945.104414 7401285.116336
+336905.052472 7401256.961159
+336883.678242 7401238.324351
+336859.970329 7401224.466725
+336838.225019 7401216.678059
+336816.957990 7401211.668917
+336802.733242 7401189.822659
+336797.364946 7401170.096038
+336782.051695 7401154.298744
+336764.652149 7401143.780546
+336756.884199 7401134.612116
+336731.683719 7401133.962228
+Region 1
+218
+323727.130602 7387729.138353
+323701.732211 7387697.403789
+323676.828595 7387671.488228
+323660.064008 7387657.000709
+323620.416131 7387628.505590
+323495.898048 7387530.882312
+323455.747151 7387495.798322
+323437.209624 7387476.241672
+323429.590107 7387467.353194
+323421.970590 7387457.964802
+323401.660124 7387422.420891
+323393.793220 7387405.933715
+323387.946643 7387392.725977
+323382.883457 7387380.048149
+323382.520623 7387378.798363
+323380.343618 7387373.199322
+323374.257900 7387350.123275
+323314.992240 7387360.871434
+323272.507660 7387370.139846
+323251.397309 7387370.599767
+323237.667335 7387370.309817
+323221.339799 7387369.259997
+323198.250353 7387366.920397
+323178.673801 7387362.561144
+323159.352883 7387357.951934
+323132.907221 7387346.743853
+323115.639614 7387322.617986
+323054.683477 7387247.190906
+322960.948573 7387136.449875
+322954.598976 7387130.860832
+322943.161454 7387124.241966
+322931.979565 7387118.133012
+322921.036817 7387113.543798
+322907.570722 7387108.194715
+322894.863281 7387105.615157
+322871.971745 7387103.535513
+322855.190665 7387102.725652
+322837.131420 7387105.215225
+322818.808296 7387109.494492
+322776.323715 7387130.930820
+322653.669281 7387188.161017
+322503.043632 7387263.818058
+322434.583425 7387305.980836
+322415.229522 7387327.217198
+322403.033347 7387325.667464
+322363.096852 7387324.557654
+322338.432376 7387323.737794
+322323.943748 7387317.358887
+322315.812965 7387312.019801
+322301.827358 7387303.371283
+322277.690641 7387284.304549
+322246.429180 7387262.428296
+322251.236733 7387283.734646
+322250.956361 7387306.540740
+322195.508706 7387309.190286
+321962.033178 7387323.567823
+321931.761265 7387326.027402
+321880.642881 7387329.946731
+321872.000832 7387328.666950
+321865.131721 7387325.857431
+321857.512204 7387321.528173
+321854.972365 7387317.978781
+321852.176893 7387310.110128
+321850.659587 7387298.962038
+321849.397913 7387286.794122
+321847.888853 7387276.135948
+321846.371547 7387266.757554
+321844.845994 7387261.178510
+321840.533215 7387255.339510
+321834.942271 7387249.240555
+321828.337040 7387244.411382
+321820.973156 7387238.822339
+321813.848413 7387232.973341
+321809.527388 7387230.933691
+321801.907871 7387225.344648
+321678.387582 7387137.839637
+321598.580562 7387098.356400
+321543.207123 7387086.988347
+321565.908996 7386955.840812
+321626.221927 7386921.266734
+321667.791176 7386817.204559
+321670.586648 7386806.806340
+321677.233110 7386786.299852
+321685.380386 7386768.832844
+321690.987823 7386758.204665
+321698.368199 7386748.836270
+321711.356012 7386736.198434
+321728.673097 7386722.050858
+321737.323393 7386713.962243
+321746.237568 7386700.044627
+321750.566839 7386691.686059
+321790.833183 7386610.429977
+321797.463153 7386594.482709
+321801.800670 7386578.775399
+321808.950152 7386551.170128
+321813.032036 7386538.512296
+321822.226583 7386502.288501
+321844.450175 7386404.245295
+322027.970038 7386004.003853
+322062.323835 7385914.719146
+322097.048712 7385906.460561
+322109.046978 7385866.187459
+322109.747907 7385838.232248
+322104.338380 7385809.067244
+322097.964044 7385784.491453
+322088.893190 7385746.477965
+322408.022316 7385220.378081
+322371.928565 7385215.968836
+322220.560755 7385007.084616
+322125.201344 7384858.750024
+322034.385605 7384701.326989
+321976.859900 7384633.218656
+321954.042580 7384565.580242
+321941.747450 7384561.300975
+321898.446493 7384550.382845
+321867.737530 7384529.656395
+321851.096637 7384497.921831
+321889.136499 7384481.294679
+321947.701229 7384445.590795
+321989.361186 7384430.293415
+322030.023349 7384421.074994
+322071.551367 7384407.907250
+322111.306445 7384395.289411
+322155.596950 7384379.062190
+322189.530189 7384367.514169
+322237.696422 7384352.616720
+322274.491103 7384349.557244
+322295.956042 7384351.596895
+322328.660592 7384359.775494
+322367.632278 7384363.044934
+322460.493082 7384351.596895
+322522.686153 7384344.338138
+322610.731158 7384319.912322
+322708.836564 7384281.078974
+322738.811612 7384262.722118
+322787.480866 7384251.524037
+322840.990656 7384241.535747
+322910.539365 7384221.019262
+322931.303374 7384234.286989
+322988.796094 7384222.379029
+323078.960380 7384203.872199
+323161.859737 7384177.386736
+323322.793174 7384149.761468
+323441.052368 7384131.334624
+323589.789630 7384105.998964
+323606.249106 7384104.849161
+323699.472744 7384089.841731
+323728.169627 7384084.122711
+323928.148966 7384066.155788
+323987.744475 7384344.708075
+324045.080517 7384462.247941
+324180.838212 7384658.984242
+324316.892771 7384827.445386
+324455.866496 7385012.963609
+324553.378174 7385115.766000
+324995.252443 7385632.497488
+325168.885075 7385841.411703
+325450.724746 7386158.887323
+325597.309742 7386279.966583
+325644.890493 7386305.162267
+325862.953816 7386380.389381
+326054.076704 7386441.938838
+326212.808398 7386526.164411
+326342.389666 7386633.066100
+326410.421069 7386736.738342
+326475.186965 7386824.303343
+326512.962947 7387026.518705
+326481.528316 7387032.777633
+326401.952190 7387046.335311
+326390.176573 7387049.974687
+326310.542723 7387062.332571
+326235.411316 7387071.391019
+326155.010567 7387087.268299
+326117.036675 7387087.368282
+326041.146614 7387092.547395
+325963.376413 7387100.136095
+325835.089803 7387112.014061
+325757.336094 7387115.973382
+325703.752088 7387125.411766
+325629.651459 7387134.710173
+325534.992977 7387147.537976
+325409.666764 7387155.786563
+325319.403523 7387180.682298
+325286.888636 7387223.424977
+325252.526593 7387271.306775
+325210.190445 7387338.915194
+325195.693571 7387356.132245
+325181.609009 7387381.217948
+325173.123638 7387399.614797
+325165.965910 7387417.691701
+325155.691106 7387457.444891
+325144.253584 7387500.617496
+325108.811285 7387483.740387
+325082.208945 7387475.031879
+325064.108469 7387473.022223
+325042.602299 7387479.691081
+325033.292305 7387486.429926
+324986.643378 7387526.703028
+324898.639605 7387604.879637
+324813.150931 7387695.954037
+324783.736627 7387717.190399
+324767.631738 7387727.578620
+324742.381780 7387739.126642
+324708.992792 7387750.804641
+324678.069427 7387757.873431
+324644.779394 7387760.163038
+324616.519562 7387759.333181
+324583.922212 7387757.043573
+324557.542520 7387746.535373
+324516.740171 7387725.878911
+324455.041873 7387687.525481
+324410.850323 7387676.807317
+324362.684090 7387672.218103
+324319.729474 7387674.917640
+324226.992365 7387682.176397
+324142.649918 7387689.815088
+323934.168714 7387709.631694
+323727.130602 7387729.138353
+Region 1
+515
+353400.210283 7401391.408130
+353400.820504 7401364.912668
+353402.362549 7401361.523249
+353405.133283 7401357.823882
+353409.140951 7401353.204674
+353414.072197 7401349.195360
+353423.621332 7401345.196045
+353443.956537 7401341.496679
+353524.992245 7401338.727153
+353543.480294 7401337.187417
+353557.037097 7401333.488051
+353567.823167 7401328.868842
+353580.151282 7401319.620426
+353605.722843 7401296.824331
+353647.316830 7401263.240084
+353658.408011 7401256.151298
+353667.965392 7401252.761878
+353679.675040 7401250.292301
+353720.963916 7401247.212829
+353731.436629 7401243.203516
+353753.289141 7401231.935446
+353767.489150 7401224.106787
+353783.198219 7401216.398107
+353797.678600 7401212.088845
+353821.097895 7401205.929900
+353831.883965 7401201.300693
+353849.135079 7401192.062276
+353880.874821 7401176.654915
+353891.660891 7401171.725759
+353908.912005 7401169.256182
+353944.040948 7401169.566129
+353958.826439 7401168.336340
+353973.620177 7401163.407184
+353985.016468 7401156.008451
+353999.505095 7401141.840878
+354019.840300 7401120.884468
+354027.542279 7401111.026157
+354037.709882 7401092.229376
+354050.648218 7401063.574285
+354055.719650 7401051.656326
+354061.739398 7401035.539087
+354063.586554 7401027.530459
+354066.670644 7401007.803838
+354070.983422 7400980.698480
+354073.143935 7400969.600381
+354075.914668 7400960.361964
+354082.693070 7400939.715500
+354084.622688 7400935.226269
+354090.708406 7400918.759090
+354100.257541 7400899.352414
+354111.653832 7400875.316531
+354124.905525 7400846.351493
+354131.989037 7400823.245451
+354137.538750 7400804.448670
+354141.233061 7400785.661888
+354150.171975 7400745.298802
+354155.721689 7400722.802656
+354160.034467 7400696.617141
+354163.728779 7400675.350784
+354167.117979 7400664.262683
+354169.888713 7400656.863950
+354179.132737 7400643.616220
+354182.835295 7400637.767221
+354185.606028 7400630.368489
+354191.056787 7400612.751506
+354193.613118 7400604.482923
+354194.544942 7400595.244505
+354196.392098 7400569.358939
+354197.315676 7400559.190681
+354198.857721 7400552.721789
+354201.933565 7400543.483371
+354209.948901 7400526.836223
+354214.880147 7400514.208386
+354216.727303 7400503.730181
+354216.727303 7400492.952027
+354214.880147 7400481.543981
+354214.880147 7400467.686355
+354214.880147 7400457.828043
+354217.650881 7400443.340525
+354219.498036 7400434.712003
+354222.582127 7400427.933166
+354225.352860 7400420.234483
+354225.971327 7400414.685433
+354225.047750 7400408.526488
+354221.963659 7400398.358230
+354217.955991 7400390.349602
+354211.490946 7400382.330975
+354199.368987 7400369.863111
+354195.616952 7400360.114781
+354189.366310 7400337.118720
+354184.121707 7400304.124371
+354181.367466 7400285.127625
+354176.617637 7400243.884690
+354171.125647 7400202.391797
+354166.870592 7400172.396935
+354163.126804 7400158.149376
+354156.373141 7400138.152801
+354145.125282 7400104.158624
+354138.627252 7400082.412349
+354131.873590 7400061.665902
+354120.881364 7400033.170783
+354115.438852 7400026.181980
+354109.880892 7400020.922881
+354097.379607 7400007.925108
+354087.137788 7399995.677206
+354078.883311 7399982.179518
+354072.888302 7399965.182429
+354069.886674 7399947.935383
+354069.383654 7399927.688851
+354072.632669 7399901.693304
+354076.887724 7399879.947029
+354079.138945 7399864.699641
+354078.611186 7399853.731520
+354075.881683 7399840.703751
+354072.632669 7399832.955079
+354064.386438 7399823.956620
+354057.385388 7399811.958675
+354051.637765 7399798.211030
+354045.139736 7399783.963470
+354034.889671 7399765.466639
+354020.640184 7399748.219593
+354005.392904 7399735.471777
+353981.899393 7399718.224731
+353968.400313 7399708.226443
+353947.652797 7399689.979569
+353929.156502 7399675.732009
+353923.408879 7399665.733722
+353919.904231 7399657.485135
+353915.657422 7399635.488903
+353911.410613 7399612.742799
+353907.163804 7399589.496781
+353899.907121 7399573.249564
+353892.658685 7399564.251105
+353882.416866 7399557.002347
+353860.168536 7399547.503974
+353843.420442 7399537.755643
+353835.322643 7399529.377079
+353821.675131 7399516.259326
+353808.670826 7399499.512194
+353799.921575 7399484.014849
+353793.679178 7399457.269430
+353792.178364 7399436.023069
+353792.788585 7399412.987015
+353793.176158 7399404.028550
+353797.175580 7399376.283302
+353802.172796 7399344.288783
+353804.176630 7399318.543193
+353806.675238 7399291.047902
+353811.177680 7399269.801542
+353818.920890 7399244.305909
+353827.670141 7399216.810618
+353835.916372 7399189.565285
+353840.921834 7399173.318068
+353848.063069 7399159.250478
+353852.664466 7399150.072050
+353868.167380 7399119.827231
+353882.161233 7399094.331598
+353896.814785 7399070.935606
+353910.660206 7399050.589091
+353920.654638 7399035.841617
+353936.050350 7398991.429224
+353944.906802 7398957.355061
+353947.652797 7398944.107330
+353949.656631 7398926.610327
+353951.157445 7398898.115208
+353953.153033 7398872.869532
+353954.917726 7398865.230841
+353955.651641 7398859.871759
+353958.900655 7398851.873129
+353966.149092 7398840.875013
+353982.897187 7398817.379037
+353989.395216 7398804.131307
+353993.394638 7398790.883576
+353997.146673 7398773.636530
+354001.146095 7398736.392910
+354001.896502 7398712.147063
+354001.146095 7398692.400445
+353999.307186 7398669.034448
+353999.397894 7398656.406611
+354001.393482 7398645.908409
+354004.898130 7398637.159907
+354013.144361 7398625.911834
+354019.395004 7398611.164360
+354021.646224 7398599.666330
+354021.390591 7398577.920055
+354020.145410 7398554.174122
+354021.390591 7398533.427676
+354024.392219 7398512.681229
+354027.888621 7398493.434526
+354028.894661 7398478.687052
+354026.396053 7398464.439493
+354022.891405 7398454.441205
+354018.891983 7398446.442576
+354005.648537 7398433.194845
+353980.645966 7398409.448912
+353960.401469 7398382.953451
+353951.899606 7398364.956533
+353947.900184 7398350.708974
+353946.407616 7398339.460901
+353948.114586 7398321.703942
+353954.150827 7398303.217109
+353963.155710 7398279.721133
+353975.401363 7398253.975543
+353985.395795 7398232.479226
+353992.644231 7398207.233550
+353991.893824 7398181.487960
+353989.395216 7398159.241770
+353986.896609 7398150.493269
+353979.895559 7398134.745966
+353972.152348 7398113.749563
+353969.901127 7398101.501661
+353967.897293 7398082.754872
+353968.152926 7398065.007912
+353970.898921 7398044.011508
+353973.653162 7398031.013735
+353978.402991 7398017.016132
+353980.901599 7398003.768402
+353979.648172 7397987.271227
+353974.403569 7397969.024353
+353966.899499 7397951.277393
+353959.403676 7397936.279962
+353956.649435 7397925.781760
+353954.901234 7397917.783130
+353956.154661 7397901.785870
+353964.153504 7397862.542592
+353972.647122 7397826.548758
+353975.896137 7397797.303767
+353977.396951 7397769.558520
+353976.399157 7397735.564343
+353977.454674 7397728.715516
+353994.507879 7397725.326096
+354007.066889 7397762.509727
+354010.456089 7397823.299314
+354010.983848 7397898.856372
+354015.197672 7398017.726011
+354023.913938 7398117.698886
+354050.846127 7398162.911142
+354069.070297 7398198.265086
+354098.542325 7398240.707816
+354132.673474 7398258.164826
+354153.998226 7398259.334625
+354219.110464 7398259.074670
+354277.889596 7398258.964689
+354359.230415 7398260.214475
+354425.901189 7398257.304973
+354465.169740 7398233.569039
+354496.917728 7398216.112029
+354554.847498 7398182.777739
+354620.710142 7398146.273992
+354698.472097 7398109.760246
+354783.746368 7398077.855711
+354813.193658 7398066.067730
+354832.176481 7398056.959291
+354862.737012 7398040.722072
+354935.740892 7398084.374595
+354998.420491 7398116.919020
+355125.478413 7398187.816876
+355231.425984 7397925.551799
+355228.383125 7397828.158482
+355227.731673 7397804.282572
+355227.756411 7397804.252577
+355301.032417 7397795.654050
+355366.903307 7397781.376495
+355417.526917 7397773.327874
+355449.266659 7397767.728833
+355527.803760 7397759.070316
+355527.770775 7397759.050320
+355587.506470 7397746.452478
+355652.313596 7397737.593995
+355714.333497 7397724.756194
+355746.922600 7397714.497951
+355776.930634 7397700.740308
+355790.396728 7397690.772015
+355834.843912 7397658.237588
+355893.557074 7397613.795201
+355951.750723 7397570.282654
+356036.662160 7397487.656807
+356046.104095 7397479.008288
+356070.488199 7397455.892248
+356089.116434 7397438.235272
+356165.031233 7397405.880814
+356089.116434 7397438.235272
+356165.031233 7397405.880814
+356232.073088 7397377.295711
+356300.813667 7397335.902801
+356357.052960 7397300.748823
+356399.240676 7397271.063907
+356419.551142 7397249.977519
+356446.854411 7397225.311744
+356496.628660 7397264.055108
+356504.512056 7397263.635180
+356511.158518 7397259.415902
+356514.795106 7397251.387278
+356519.990231 7397240.599126
+356525.375020 7397235.100068
+356533.538788 7397232.410528
+356549.058194 7397230.560845
+356565.055882 7397231.490686
+356584.088182 7397233.960263
+356603.565779 7397242.488802
+356619.777868 7397248.207822
+356631.891581 7397255.906504
+356647.848037 7397261.875481
+356658.724816 7397266.534683
+356692.748763 7397269.414190
+356710.742038 7397273.893423
+356727.696289 7397280.882225
+356741.607680 7397287.591076
+356751.701066 7397294.759848
+356779.037321 7397305.138071
+356789.683204 7397308.027576
+356801.838148 7397312.696776
+356814.776484 7397314.846408
+356827.970453 7397316.246168
+356835.573478 7397318.855721
+356845.691603 7397323.244969
+356854.317160 7397324.604736
+356868.022396 7397326.004496
+356881.191626 7397330.943650
+356888.209168 7397340.601996
+356892.926012 7397351.750086
+356897.956213 7397356.589258
+356903.745067 7397362.708209
+356913.846699 7397368.367240
+356921.622895 7397378.535498
+356929.159950 7397387.443972
+356934.932311 7397394.312796
+356940.440793 7397402.951316
+356954.566586 7397412.939605
+356966.457651 7397418.108720
+356977.845695 7397423.017879
+356991.006679 7397428.206990
+356999.055001 7397436.365593
+357006.913658 7397438.215276
+357021.905306 7397438.375248
+357034.662224 7397433.206134
+357046.173962 7397426.017365
+357059.648303 7397424.897557
+357067.473976 7397430.526593
+357072.710333 7397440.174940
+357083.273754 7397451.383020
+357089.334734 7397454.722448
+357103.501758 7397460.931385
+357116.407109 7397467.120325
+357126.995269 7397475.558879
+357139.851143 7397485.277214
+357157.275428 7397496.815238
+357172.712372 7397502.774217
+357188.413195 7397507.983325
+357202.596712 7397513.182435
+357218.800555 7397519.151412
+357235.507418 7397525.640301
+357250.193955 7397530.839410
+357258.242276 7397538.488100
+357269.374687 7397543.907172
+357276.944727 7397548.776338
+357287.598857 7397550.905973
+357300.768087 7397555.585171
+357305.179821 7397559.634478
+357358.483456 7397489.766446
+357393.389750 7397609.405952
+357360.041993 7397645.209819
+357353.609933 7397659.317403
+357355.696230 7397668.885764
+357362.779742 7397676.664432
+357215.262922 7398052.630032
+357200.213551 7398185.747230
+357201.582425 7398233.219099
+357191.909597 7398268.283093
+357182.277999 7398292.278982
+357171.920734 7398312.845460
+357158.133036 7398332.642069
+357144.741157 7398350.529005
+357120.983767 7398376.694523
+357017.782190 7398499.293523
+356968.576932 7398531.178061
+356926.150075 7398576.070371
+356901.287690 7398607.265028
+356885.603359 7398627.821507
+356872.557822 7398650.667594
+356861.812984 7398671.614006
+356853.319366 7398695.999829
+356849.839457 7398708.187741
+356852.148402 7398724.534941
+356855.323200 7398746.371200
+356871.197194 7398797.612423
+356879.179546 7398827.447313
+356883.335646 7398843.384583
+356893.503248 7398868.720243
+356906.243675 7398890.796462
+356919.256227 7398910.353112
+356927.024176 7398921.791153
+356932.433703 7398939.508118
+356937.109316 7398954.435561
+356937.942185 7398972.862405
+356935.476562 7398990.989300
+356933.761346 7399009.636106
+356935.872381 7399027.573033
+356941.051014 7399043.010389
+356943.648577 7399063.216928
+356947.004793 7399083.183508
+356945.602933 7399096.031307
+356942.180748 7399108.609152
+356930.108266 7399131.805179
+356927.147869 7399137.704169
+356910.177127 7399157.200829
+356892.002434 7399170.628529
+356872.285697 7399185.805929
+356850.796020 7399199.953506
+356831.318423 7399216.900603
+356814.388911 7399232.617911
+356802.588555 7399243.845988
+356788.198883 7399259.833249
+356765.678427 7399275.740524
+356746.951237 7399293.447491
+356729.444490 7399315.713677
+356718.312078 7399336.780069
+356706.635416 7399360.875941
+356697.160497 7399393.560343
+356691.899401 7399411.417284
+356684.700442 7399444.631595
+356679.365131 7399470.057240
+356670.953976 7399498.212417
+356669.189282 7399520.128663
+356668.917157 7399523.668057
+356664.126097 7399545.814263
+356653.381258 7399578.238709
+356646.982183 7399600.624875
+356626.803657 7399644.047437
+356610.195748 7399678.431547
+356599.516879 7399704.297116
+356586.520820 7399745.580045
+356581.589574 7399769.685916
+356575.305946 7399788.282730
+356570.185037 7399817.487728
+356562.342872 7399839.104025
+356554.253319 7399860.460367
+356543.863069 7399882.796541
+356537.760858 7399908.202189
+356528.624035 7399932.578014
+356522.579548 7399952.944525
+356514.127161 7399984.889054
+356506.045855 7400005.485526
+356485.677665 7400034.530550
+356467.667898 7400056.536781
+356450.202381 7400077.003275
+356433.470779 7400097.039843
+356425.719322 7400109.317740
+356412.451137 7400140.702364
+356408.410484 7400168.917531
+356404.798635 7400194.093219
+356403.347299 7400212.240110
+356397.979002 7400240.435281
+356392.421043 7400263.081402
+356379.235320 7400286.917319
+356370.659240 7400304.724269
+356348.509865 7400337.868591
+356337.855735 7400358.105125
+356327.778841 7400374.392335
+356313.067565 7400414.495466
+356311.698691 7400440.491013
+356308.763033 7400476.574832
+356308.622847 7400511.908780
+356314.065359 7400547.272722
+356321.536444 7400585.156233
+356330.021816 7400621.530003
+356340.791393 7400657.663813
+356349.771538 7400698.586804
+356358.281648 7400728.901611
+356369.092456 7400755.437066
+356376.629511 7400775.663601
+356403.033942 7400810.757590
+356416.244403 7400834.603505
+356426.816071 7400857.349609
+356438.129899 7400884.904889
+356447.662542 7400913.709955
+356465.441415 7400975.609352
+356471.378701 7400998.455439
+356477.447927 7401019.821779
+356484.267560 7401027.920392
+356492.093233 7401039.558398
+356497.337836 7401061.534634
+356501.015654 7401093.349184
+356471.057098 7401095.528811
+356449.493205 7401093.189212
+356422.594001 7401092.089400
+356392.643691 7401093.759114
+356374.576200 7401092.499330
+356142.675702 7401107.746718
+355914.807610 7401134.702101
+355875.423613 7401138.321481
+355763.497524 7401149.569554
+355718.778215 7401154.298744
+355552.657899 7401170.745927
+355478.656225 7401173.895388
+355353.692846 7401188.592870
+355169.933842 7401203.300351
+355061.875236 7401219.677546
+354955.639046 7401235.564824
+354839.787752 7401250.642242
+354723.985935 7401267.009438
+354654.033160 7401277.627619
+354578.646120 7401280.797076
+354543.731579 7401283.976532
+354495.317959 7401288.735716
+354447.687731 7401293.524896
+354415.980974 7401296.844328
+354406.440085 7401297.464221
+354399.298849 7401303.813134
+354264.209099 7401307.322533
+354118.786821 7401318.460625
+354002.506723 7401333.967969
+353786.529696 7401356.164167
+353556.097027 7401378.870277
+353400.210283 7401391.408130
+Region 1
+245
+344339.268541 7391424.175426
+344338.691304 7391418.866336
+344321.316496 7391388.441547
+344306.836115 7391360.096402
+344291.803237 7391330.831415
+344272.638997 7391296.097365
+344251.454430 7391256.474152
+344228.513417 7391212.961605
+344214.280423 7391182.106890
+344207.155679 7391172.618516
+344202.537790 7391164.879841
+344184.214666 7391137.814477
+344174.368666 7391120.917372
+344162.551818 7391099.740999
+344145.003839 7391069.996094
+344120.141454 7391033.392364
+344116.974901 7391026.273583
+344080.584285 7390971.682934
+344047.360222 7390980.391443
+344028.377399 7390987.510223
+344004.661240 7390992.659341
+343968.328347 7391005.297176
+343928.837149 7391016.355282
+343826.427210 7391048.609757
+343794.374112 7391057.928161
+343768.060390 7391064.677005
+343741.655959 7391073.215543
+343710.848042 7391075.585137
+343684.781707 7391066.896625
+343671.595984 7391056.728367
+343654.773673 7391049.489607
+343619.380851 7391029.043109
+343576.450975 7391006.806918
+343566.588483 7391003.997399
+343557.682554 7390998.978259
+343526.899375 7390982.851021
+343499.142562 7390983.950833
+343437.444265 7390999.768123
+343408.961784 7391033.782297
+343373.362806 7391080.464301
+343339.635723 7391127.716207
+343317.519332 7391155.361472
+343282.769716 7391190.905383
+343256.827075 7391203.183280
+343211.687208 7391219.330514
+343161.929452 7391237.497403
+343064.780609 7391314.114279
+342971.581710 7391382.822510
+342888.649369 7391443.642092
+342883.916032 7391447.591415
+342864.166310 7391465.758304
+342828.699272 7391490.654039
+342812.223303 7391514.969874
+342768.221416 7391525.878006
+342747.102820 7391532.316903
+342627.400536 7391563.001647
+342477.888128 7391601.765007
+342316.039359 7391641.988117
+342167.532991 7391680.431532
+342024.733015 7391717.365206
+341884.794481 7391742.980818
+341733.146299 7391770.296139
+341619.298839 7391797.421493
+341566.572440 7391810.609234
+341513.582162 7391822.747155
+341459.742522 7391838.884390
+341392.337833 7391855.461551
+341213.452352 7391901.733625
+341113.219418 7391926.309415
+341114.876910 7391946.275995
+341119.618493 7391981.869898
+341128.862518 7392071.784497
+341160.470320 7392061.576245
+341216.915768 7392201.412293
+341279.966448 7392352.756369
+341367.912498 7392566.179811
+341395.710541 7392635.917866
+341418.643309 7392686.329231
+341372.761281 7392736.960558
+341288.905362 7392823.975653
+341232.938195 7392879.106210
+341193.183117 7392919.689258
+341148.851381 7392950.893913
+340997.805174 7393027.290827
+340970.106085 7393032.809882
+340909.191179 7393058.125545
+340793.702719 7393122.994434
+340739.904310 7393151.469556
+340560.969352 7393251.682391
+340517.618917 7393270.919096
+340270.809234 7393407.775654
+340234.418618 7393440.999963
+340173.503712 7393536.723566
+340111.582766 7393633.656962
+340075.414799 7393698.095924
+340045.489228 7393738.718966
+340020.832998 7393761.385083
+340000.003019 7393776.762449
+339915.330723 7393820.904888
+339901.798659 7393848.930088
+339829.306045 7393935.785210
+339809.416137 7393955.591818
+339808.203941 7393973.528745
+339825.323116 7394072.121857
+339836.397803 7394115.384447
+339882.527218 7394296.453431
+339885.767986 7394319.769437
+339888.002715 7394326.288321
+339916.419226 7394340.695853
+339957.370007 7394357.912904
+340052.506770 7394400.105676
+340062.748588 7394404.414938
+340054.972393 7394426.481159
+340102.157325 7394422.371862
+340146.703463 7394418.242570
+340193.896641 7394414.143272
+340239.193186 7394411.163782
+340285.256630 7394404.754880
+340333.967114 7394401.795387
+340399.838005 7394393.676778
+340479.010065 7394386.847947
+340510.419958 7394382.378713
+340552.154131 7394378.809324
+340619.369157 7394367.001347
+340642.541065 7394347.144748
+340683.813450 7394318.649629
+340736.778989 7394281.645967
+340750.500717 7394272.967454
+340818.301225 7394231.484560
+340867.811594 7394201.689663
+340894.809753 7394191.191462
+340924.471445 7394179.943388
+341218.169195 7394102.026735
+341278.943915 7394088.289088
+341313.116295 7394081.630228
+341353.382639 7394073.481624
+341376.166975 7394068.282515
+341398.192657 7394063.833277
+341405.218445 7394141.509972
+341458.992115 7394131.151746
+341527.188443 7394041.217151
+341577.276048 7394084.289773
+341629.631366 7394138.400504
+341678.952072 7394186.422278
+341736.106696 7394240.962936
+341741.178128 7394242.822618
+341752.186846 7394247.391835
+341765.108689 7394251.201182
+341789.047497 7394253.490790
+341807.667486 7394252.350985
+341823.640435 7394250.061378
+341841.138936 7394243.202553
+341855.602824 7394234.823988
+341872.738492 7394214.627447
+341883.714225 7394163.186259
+341895.737229 7394110.985200
+341952.751668 7394121.943323
+342018.622558 7394134.641148
+342085.276840 7394149.718565
+342117.816467 7394156.067478
+342159.080605 7394160.026800
+342172.571438 7394157.647207
+342254.308076 7394137.810605
+342317.004168 7394110.825228
+342354.466794 7393989.206060
+342418.548252 7393825.454109
+342447.022486 7393739.228879
+342479.240510 7393657.312910
+342495.163981 7393605.641761
+342496.071066 7393593.673811
+342511.095699 7393540.672889
+342730.940208 7393625.968279
+342743.688880 7393640.745748
+342783.221310 7393521.686142
+342783.237802 7393517.736818
+342786.387863 7393484.512509
+342774.917356 7393462.576267
+342843.344578 7393459.986710
+342876.568641 7393457.617116
+342912.959257 7393456.827251
+342946.183320 7393460.776575
+342979.407383 7393461.566440
+343005.514950 7393452.078065
+343026.081049 7393439.420233
+343047.438786 7393418.063891
+343065.638217 7393406.985789
+343074.618362 7393384.029721
+343094.112452 7393398.287279
+343123.386570 7393410.945111
+343144.859755 7393423.672931
+343160.412146 7393443.479538
+343172.426904 7393467.895356
+343232.550172 7393460.776575
+343295.839992 7393447.718812
+343295.303987 7393460.636599
+343294.256716 7393489.251697
+343302.956489 7393520.106412
+343365.446425 7393486.092239
+343464.335223 7393433.881182
+343562.424136 7393379.300531
+343658.929774 7393324.719880
+343753.860381 7393270.919096
+343726.697297 7393221.797510
+343731.059553 7393210.439455
+343730.927613 7393194.822131
+343728.000201 7393187.533379
+343724.297644 7393181.744371
+343713.082770 7393162.907597
+343632.830454 7393024.111372
+343632.038815 7393007.504216
+343616.214299 7392971.110450
+343628.410474 7392913.500318
+343746.430527 7392701.876568
+343705.603439 7392558.971046
+343840.033491 7392630.668765
+343920.788828 7392520.207686
+343850.374264 7392483.813920
+343742.785693 7392426.073810
+343715.886489 7392402.337876
+343693.737113 7392377.812077
+343620.799203 7392248.074300
+343571.387789 7392211.550556
+343577.737387 7392200.642425
+343655.136507 7392134.113820
+343671.604230 7392129.404627
+343693.737113 7392125.465302
+343725.386146 7392115.187062
+343788.494549 7392080.562993
+343868.565449 7392040.829799
+343941.346681 7391992.568066
+344002.269833 7391947.455793
+344015.719435 7391938.367350
+344018.094349 7391923.339924
+344012.561129 7391886.156293
+344066.351291 7391871.918732
+344154.157155 7391847.392933
+344230.888331 7391821.287405
+344260.162450 7391803.090522
+344316.327527 7391766.706754
+344362.209554 7391735.852039
+344411.258134 7391720.824613
+344419.957907 7391650.416673
+344417.582993 7391623.521280
+344394.641979 7391528.597540
+344339.268541 7391424.175426
+Region 1
+160
+337085.117164 7397800.003305
+337064.278939 7397738.833783
+337023.344650 7397666.586158
+337016.120952 7397601.577293
+337030.568348 7397531.739256
+337111.777228 7397341.601825
+337074.751652 7397287.131155
+337050.144900 7397256.326432
+337016.063229 7397203.965401
+336981.824879 7397158.343215
+336633.685514 7397505.313782
+336447.469133 7397638.350994
+336366.697304 7397670.655461
+336275.823842 7397702.969926
+336197.072340 7397711.048542
+336150.819232 7397710.118701
+335944.655219 7397680.753731
+335901.040906 7397676.464466
+335763.988552 7397654.628206
+335611.779627 7397659.617352
+335499.498950 7397689.552224
+335354.777603 7397761.919828
+335127.709395 7397964.025209
+334992.965987 7398055.099609
+334848.244639 7398117.488922
+334783.082924 7398135.865775
+334771.043428 7398197.235263
+334762.492086 7398231.399410
+334753.948991 7398257.025021
+334748.259092 7398281.220877
+334739.715997 7398302.577218
+334726.901355 7398323.933560
+334711.241763 7398343.860147
+334645.131732 7398434.794571
+334548.955944 7398558.803329
+334534.731196 7398587.278452
+334523.343151 7398614.323819
+334517.653252 7398629.981137
+334516.226654 7398647.068210
+334513.381705 7398668.414554
+334519.071604 7398691.190652
+334519.071604 7398723.935044
+334510.528509 7398968.773105
+334573.150384 7398996.638332
+334697.421080 7399062.287087
+334782.728336 7399107.689310
+334796.845883 7399114.848084
+334934.590920 7399186.895743
+334971.534033 7399206.242429
+335001.937886 7399222.069718
+335015.882262 7399230.488276
+335036.143250 7399247.815308
+335047.778682 7399261.822908
+335057.896807 7399278.110118
+335069.260113 7399302.785892
+335078.339213 7399332.290838
+335083.072549 7399376.013348
+335083.806463 7399388.971129
+335087.286373 7399424.545035
+335109.806829 7399709.466231
+335110.293356 7399724.213705
+335110.021231 7399736.661573
+335100.002060 7399800.920566
+335075.782881 7400000.986296
+335064.856625 7400045.458679
+335131.469677 7400128.174510
+335156.216615 7400192.113558
+335258.593568 7400348.396788
+335292.353637 7400398.358230
+335373.463561 7400535.854678
+335400.956494 7400621.100076
+335410.588092 7400678.850184
+335425.711679 7400823.225454
+335446.723074 7400938.995624
+335449.089742 7400984.777782
+335470.290801 7401032.279645
+335495.837624 7401037.718713
+335561.840454 7401046.657182
+335700.022541 7401017.782128
+335803.916801 7400998.205482
+335831.723091 7400994.146177
+335855.595928 7400990.176857
+335903.333358 7400983.537994
+335954.459988 7400971.630034
+335984.896825 7400976.219248
+336018.673386 7400980.858453
+336219.312424 7401025.530801
+336325.977417 7401053.615990
+336430.382943 7401079.671527
+336449.769831 7401085.420543
+336526.311344 7401109.146478
+336560.112644 7401115.985307
+336636.266584 7401131.822594
+336700.438751 7401143.370616
+336731.683719 7401133.962228
+336794.140670 7401093.309191
+336880.569413 7401039.408424
+336865.173700 7400930.737038
+336851.047907 7400819.936018
+336838.637330 7400751.907670
+336827.513165 7400669.761741
+336871.581022 7400643.666211
+336956.723353 7400588.905591
+336961.431951 7400532.855192
+336966.132302 7400431.462560
+337034.881127 7400436.881631
+337058.828181 7400437.671496
+337089.240279 7400428.922995
+337104.446329 7400418.634757
+337141.711045 7400383.940700
+337173.648696 7400351.536250
+337221.551050 7400314.952517
+337250.000546 7400310.003364
+337340.832776 7400233.286505
+337318.600939 7400187.734308
+337318.089672 7400177.836004
+337316.300240 7400158.459323
+337317.471205 7400132.563758
+337321.858200 7400092.160679
+337327.556345 7400064.295452
+337320.233692 7400027.491756
+337313.537753 7400008.574996
+337301.778628 7399982.419477
+337287.809513 7399961.773013
+337258.189053 7399938.876935
+337190.586454 7399887.675705
+337185.028495 7399879.717069
+337091.070943 7399813.628389
+337058.424116 7399793.721799
+337016.228153 7399683.040757
+336970.016277 7399568.890310
+337007.652073 7399506.690965
+337033.726655 7399465.088091
+337054.589618 7399429.514184
+337075.073255 7399391.360720
+337092.942837 7399344.448755
+337127.568759 7399337.749903
+337148.390492 7399271.011334
+337161.939049 7399228.858555
+337169.723491 7399208.232088
+337175.149510 7399188.695434
+337178.596435 7399163.479754
+337179.454043 7399134.534712
+337181.193997 7399038.371184
+337178.307817 7398931.559479
+337177.837782 7398826.127539
+337176.716294 7398724.474951
+337175.932902 7398630.621027
+337173.021983 7398484.346083
+337172.997244 7398413.518215
+337172.288068 7398366.076342
+337172.263330 7398316.744792
+337170.960425 7398213.692444
+337170.803747 7398157.902000
+337170.836732 7398113.799554
+337176.493646 7397969.644247
+337151.771446 7397930.240996
+337117.928916 7397883.069076
+337096.398008 7397846.145401
+337085.117164 7397800.003305
+Region 1
+430
+351616.072313 7401306.892606
+351610.176258 7401334.157936
+351602.070213 7401359.213644
+351587.573340 7401386.488972
+351581.677285 7401394.837542
+351571.113863 7401403.196110
+351552.691784 7401413.024427
+351536.232307 7401419.163375
+351518.296756 7401422.112870
+351493.731235 7401422.352829
+351470.633543 7401420.633124
+351445.325861 7401416.463838
+351414.864285 7401410.804807
+351385.631397 7401401.226448
+351365.485856 7401396.067332
+351329.218933 7401388.138690
+351310.120663 7401383.209534
+351300.876639 7401383.209534
+351278.686032 7401386.908900
+351266.984631 7401389.378477
+351251.572426 7401391.838056
+351233.702844 7401390.608267
+351225.077287 7401386.908900
+351208.551840 7401386.918899
+351190.566811 7401390.288321
+351178.857164 7401387.208849
+351156.674803 7401379.200221
+351120.317172 7401368.722016
+351101.829123 7401365.342594
+351085.806697 7401367.192278
+351059.311558 7401367.192278
+351035.282042 7401368.422067
+351017.404214 7401371.501539
+350994.603386 7401379.510168
+350976.733804 7401384.439323
+350961.329845 7401390.608267
+350942.841796 7401391.838056
+350929.284993 7401390.608267
+350913.262567 7401390.608267
+350902.171387 7401394.307633
+350886.767428 7401402.926157
+350875.676248 7401410.944783
+350865.813756 7401419.573305
+350857.188199 7401429.431617
+350855.341043 7401446.678662
+350855.341043 7401478.113278
+350859.653822 7401495.370322
+350874.439313 7401519.396206
+350896.011453 7401531.104201
+350930.521928 7401544.661879
+350947.154575 7401555.140084
+350957.017067 7401571.157340
+350963.177001 7401589.034278
+350961.948313 7401604.441639
+350954.551444 7401619.839001
+350945.307419 7401627.857628
+350934.216239 7401632.786784
+350917.575346 7401635.246362
+350894.774518 7401632.786784
+350864.585068 7401619.229106
+350850.409797 7401609.980690
+350836.852994 7401601.352168
+350823.914658 7401600.742273
+350807.273765 7401600.742273
+350791.869806 7401606.291322
+350782.007314 7401615.529740
+350775.228912 7401631.556994
+350775.228912 7401647.574251
+350780.778625 7401670.990240
+350798.029740 7401715.972535
+350806.655297 7401736.309051
+350807.892232 7401752.946201
+350807.273765 7401767.743667
+350802.342519 7401778.211874
+350790.022650 7401782.531134
+350777.076068 7401783.760923
+350759.824953 7401782.531134
+350749.962462 7401774.522506
+350727.780101 7401752.336306
+350682.796913 7401699.335384
+350663.690397 7401687.017494
+350652.599216 7401682.698234
+350639.042413 7401682.698234
+350631.645544 7401687.627390
+350625.485610 7401695.026123
+350621.172831 7401706.734117
+350618.707208 7401725.830846
+350622.401520 7401758.495251
+350629.798389 7401791.159656
+350631.645544 7401836.141951
+350632.264012 7401859.557940
+350637.813725 7401876.195090
+350653.217684 7401890.372662
+350681.559978 7401906.389918
+350703.750585 7401925.496645
+350725.314478 7401954.461684
+350737.642593 7401977.257779
+350743.802527 7401994.514823
+350754.893707 7402030.248702
+350769.679199 7402054.284585
+350792.480027 7402082.019834
+350836.234527 7402122.682869
+350875.057780 7402151.038012
+350907.102633 7402182.462629
+350932.369083 7402224.985345
+350940.376173 7402256.409963
+350940.376173 7402294.613419
+350934.216239 7402322.958563
+350920.659436 7402351.313706
+350887.996116 7402403.074840
+350859.653822 7402432.039879
+350816.517789 7402472.702914
+350802.960986 7402485.650696
+350790.632871 7402495.509007
+350777.744013 7402501.817926
+350765.366420 7402507.217002
+350739.489749 7402518.924996
+350706.826429 7402521.384575
+350677.865667 7402519.534892
+350655.683307 7402511.526264
+350631.645544 7402496.738796
+350612.547274 7402486.880485
+350590.356667 7402479.481752
+350547.220635 7402474.552597
+350504.703070 7402469.013546
+350478.826398 7402465.924075
+350458.482947 7402460.994919
+350423.362251 7402444.977663
+350367.287882 7402424.021252
+350334.624563 7402414.162941
+350314.907825 7402411.083468
+350297.038243 7402411.083468
+350277.313260 7402414.162941
+350251.436588 7402424.641146
+350226.170137 7402436.969034
+350203.369309 7402452.986291
+350172.553145 7402467.773758
+350142.363695 7402483.181119
+350116.478777 7402491.189747
+350094.914884 7402495.509007
+350054.854695 7402497.968586
+350011.100196 7402501.048058
+349997.543392 7402504.747425
+349976.597967 7402515.225630
+349946.400270 7402528.783308
+349918.049729 7402539.261513
+349884.157721 7402545.420458
+349849.647246 7402544.190668
+349823.152107 7402538.021725
+349800.557435 7402389.777118
+349792.599822 7402332.077002
+349786.299702 7402264.388596
+349800.573927 7402204.168911
+349811.656861 7402191.501081
+349817.998213 7402177.233525
+349887.720093 7402121.773025
+350002.326206 7402014.921327
+350040.069204 7401915.668329
+350093.496532 7401769.383386
+350139.263112 7401657.762506
+350125.186797 7401641.805239
+350109.106647 7401604.601611
+350047.226932 7401579.985828
+350024.203456 7401578.416097
+350007.620286 7401574.906698
+349969.390761 7401565.118375
+349942.029768 7401545.431747
+349940.702125 7401493.290678
+349947.241385 7401461.756080
+349951.999461 7401404.615867
+349947.241385 7401339.547013
+349936.133713 7401283.996528
+349917.818835 7401240.533973
+349915.501644 7401217.337946
+349898.036127 7401120.524530
+349893.278052 7401088.789965
+349885.328686 7401064.834069
+349886.367711 7401059.095052
+349887.349012 7401050.326554
+349890.226947 7401041.518063
+349893.838796 7401030.799899
+349899.751343 7401021.171548
+349937.733482 7400991.646605
+349972.573806 7400968.110637
+349982.296112 7400961.371791
+350000.256402 7400948.583981
+350010.646653 7400931.306941
+350039.236335 7400901.472051
+350052.809630 7400883.455137
+350068.617654 7400863.728516
+350083.221729 7400836.253223
+350091.393743 7400817.066509
+350094.626266 7400798.379710
+350098.889567 7400782.482433
+350109.048923 7400737.730099
+350112.009320 7400727.901782
+350115.406767 7400688.638508
+350123.463334 7400636.547430
+350157.322357 7400470.995788
+350103.548687 7400438.161412
+350030.371637 7400374.432328
+349940.091903 7400291.226581
+349904.962961 7400255.502700
+349891.010339 7400242.404943
+349875.829028 7400225.117905
+349863.797778 7400212.750023
+349855.609271 7400202.221826
+349842.728658 7400185.294726
+349834.086609 7400171.327118
+349823.803559 7400149.780809
+349803.897158 7400102.478912
+349794.413993 7400083.592147
+349787.281003 7400068.084803
+349778.919325 7400048.028238
+349771.077160 7400035.970304
+349762.121754 7400025.062172
+349744.557282 7400002.486039
+349729.458434 7399989.408279
+349715.926370 7399978.580134
+349691.492788 7399954.604241
+349645.429344 7399915.360963
+349636.490430 7399905.222700
+349617.524099 7399889.145454
+349606.696798 7399880.566923
+349592.735930 7399867.089232
+349579.937780 7399855.111283
+349564.459605 7399841.653589
+349549.030908 7399831.225375
+349530.460396 7399816.297932
+349507.700800 7399800.680607
+349487.208916 7399784.633356
+349439.619919 7399758.397849
+349410.230353 7399743.290437
+349383.322903 7399729.972718
+349294.882079 7399686.480168
+349267.133513 7399672.842504
+349176.012664 7399625.210663
+349116.582080 7399594.905854
+349174.503604 7399305.255469
+349215.289461 7399090.702220
+349227.749515 7399021.554064
+349249.148484 7398872.559586
+349259.868584 7398795.392804
+349269.879508 7398718.975893
+349285.407160 7398596.836814
+349296.572556 7398517.010488
+349336.096740 7398505.722421
+349348.787689 7398502.792923
+349358.551226 7398498.883593
+349369.287818 7398494.984261
+349382.960069 7398489.125264
+349395.651017 7398483.266268
+349410.296323 7398471.548275
+349419.078559 7398461.789947
+349432.750809 7398440.303627
+349455.782531 7398357.317842
+349479.003917 7398313.485350
+349490.812519 7398296.988176
+349496.015891 7398288.069703
+349504.666187 7398280.301034
+349515.971769 7398273.662171
+349526.543437 7398269.342911
+349544.314064 7398266.893331
+349566.183067 7398264.023822
+349588.736508 7398262.134146
+349630.008892 7398259.754554
+349648.686605 7398258.074841
+349661.088936 7398256.055187
+349681.011829 7398252.985713
+349706.187571 7398250.226186
+349725.186887 7398247.676622
+349745.992127 7398240.137914
+349775.662064 7398234.688847
+349786.208993 7398232.249265
+349799.823520 7398231.979311
+349820.397866 7398224.400609
+349836.453277 7398223.350789
+349850.950150 7398223.160822
+349860.961074 7398228.009991
+349891.216494 7398239.967943
+349915.823247 7398250.956061
+349935.869833 7398261.124319
+349950.770772 7398268.373077
+349965.556264 7398280.710964
+349982.997042 7398298.447926
+349997.048619 7398316.354858
+350004.066161 7398328.832721
+350010.861055 7398344.300072
+350026.817511 7398374.024980
+350062.169102 7398430.395324
+350151.079961 7398588.558232
+350183.858728 7398600.996102
+350217.800213 7398611.154362
+350314.866594 7398627.171618
+350397.271177 7398641.129227
+350521.203777 7398664.465230
+350583.141216 7398677.273036
+350651.189111 7398681.572300
+350713.398675 7398686.571444
+350774.536229 7398689.640918
+350826.157633 7398688.451122
+350892.572774 7398688.271153
+350923.586848 7398688.651087
+350954.592675 7398689.290978
+351018.030927 7398690.840712
+351076.678120 7398691.450608
+351111.089640 7398692.180483
+351138.038322 7398693.530252
+351202.853695 7398693.040336
+351210.539182 7398692.970348
+351314.268517 7398692.770382
+351380.782614 7398693.580243
+351441.161514 7398695.499914
+351452.137247 7398699.269269
+351459.476393 7398699.429241
+351465.578603 7398699.569217
+351473.989759 7398701.448895
+351521.628233 7398720.465638
+351546.218493 7398729.334119
+351580.300164 7398746.451187
+351639.747241 7398770.517065
+351690.849132 7398794.203007
+351789.276141 7398836.265802
+351816.233069 7398838.645395
+351843.387907 7398840.765032
+351852.739132 7398841.814852
+351960.377181 7398859.131886
+352044.010452 7398860.461658
+352154.699606 7398872.609577
+352184.443760 7398874.529248
+352253.753329 7398881.448063
+352289.129658 7398884.987457
+352303.511084 7398886.657171
+352345.731785 7398890.296547
+352364.706362 7398891.346368
+352425.110001 7398895.185710
+352458.936040 7398897.365337
+352481.646159 7398899.764926
+352559.540053 7398911.352941
+352619.539628 7398913.272612
+352624.800723 7398949.186460
+352628.866114 7398997.748142
+352628.866114 7399028.672845
+352632.040913 7399055.678219
+352633.962285 7399077.244525
+352636.007350 7399109.648974
+352585.639373 7399248.065265
+352570.136460 7399288.988255
+352541.579763 7399349.297925
+352510.631659 7399428.654332
+352477.300395 7399498.492369
+352443.969131 7399553.242991
+352423.337062 7399584.197688
+352409.722535 7399608.703491
+352379.689763 7399666.723552
+352359.057694 7399718.304717
+352344.783469 7399765.916562
+352336.834102 7399794.491667
+352328.901228 7399827.815959
+352324.926545 7399846.862696
+352319.822128 7399868.269030
+352314.956852 7399903.772948
+352302.472059 7399937.687139
+352293.590869 7399948.315318
+352277.741613 7399971.521343
+352239.990370 7400009.864775
+352194.471176 7400063.805536
+352182.530634 7400075.963453
+352170.985912 7400096.030016
+352167.011228 7400104.888499
+352158.410410 7400130.054188
+352152.868943 7400155.229876
+352150.691938 7400189.983923
+352160.991480 7400293.186245
+352167.844098 7400337.238699
+352168.990324 7400346.717076
+352186.546549 7400456.988187
+352187.742252 7400468.486218
+352188.138071 7400481.114055
+352186.991845 7400494.061837
+352184.666408 7400508.129427
+352181.936906 7400522.946889
+352176.618087 7400535.014822
+352168.272902 7400546.222902
+352159.226787 7400554.731445
+352147.879973 7400563.929869
+352134.380894 7400568.489088
+352089.851248 7400575.907817
+351995.423661 7400588.655634
+351953.376131 7400587.255874
+351776.659408 7400522.017048
+351759.952545 7400544.823142
+351738.256712 7400580.147091
+351719.216166 7400658.703635
+351705.601639 7400691.398035
+351691.261444 7400711.214641
+351678.768404 7400733.370845
+351648.562461 7400773.334000
+351616.847458 7400744.408955
+351575.500858 7400698.876754
+351534.319182 7400666.642275
+351523.566097 7400659.093568
+351475.540050 7400620.890112
+351396.367989 7400578.147434
+351323.438326 7400554.021566
+351313.476879 7400556.161200
+351292.646900 7400556.381162
+351271.536550 7400560.490458
+351282.198926 7400573.058306
+351306.277920 7400650.934966
+351334.529506 7400747.728386
+351362.533705 7400842.812099
+351393.737442 7400948.204046
+351398.907829 7400963.931353
+351414.130370 7401008.143779
+351418.797737 7401018.961926
+351438.943278 7401062.934394
+351443.363258 7401070.553089
+351448.525398 7401074.722375
+351464.490101 7401086.760313
+351475.053522 7401096.348671
+351519.278057 7401141.550928
+351557.359150 7401180.364280
+351598.384148 7401223.356915
+351614.357097 7401242.763591
+351620.005765 7401250.872202
+351622.463141 7401257.751024
+351623.197056 7401265.619676
+351621.481840 7401281.097025
+351616.072313 7401306.892606
+Region 1
+126
+323980.817641 7397992.200383
+324057.120013 7397934.540260
+324040.990386 7397911.364230
+324092.018061 7397845.835454
+324176.978976 7397731.405055
+324194.263075 7397698.160749
+324188.853548 7397690.242106
+324230.719661 7397533.278992
+324285.746758 7397343.731460
+324331.727740 7397182.789028
+324352.236116 7397131.617793
+324370.707672 7397107.931850
+324406.768439 7397044.902647
+324429.965086 7396949.928915
+324440.322351 7396937.980961
+324443.043608 7396924.063345
+324443.076592 7396912.535320
+324439.538960 7396902.627017
+324435.127226 7396893.498581
+324429.569267 7396885.939876
+324419.632559 7396874.811782
+324446.012251 7396786.426921
+324472.812500 7396704.111021
+324479.871274 7396681.244938
+324519.601613 7396545.958111
+324509.095915 7396522.582115
+324500.882669 7396499.586054
+324494.318670 7396474.950274
+324489.387424 7396451.964212
+324482.823424 7396419.119838
+324489.387424 7396323.866154
+324515.668161 7396220.403876
+324522.232160 7396177.701190
+324527.163406 7396103.803848
+324523.881407 7396080.807787
+324506.127272 7396048.483324
+324477.908671 7395999.971634
+324456.221084 7395977.665455
+324440.643954 7395967.297231
+324423.062991 7395959.468572
+324404.467741 7395955.709216
+324382.582244 7395951.689904
+324357.653889 7395951.499937
+324323.563972 7395953.349620
+324254.889363 7395961.888157
+324190.799658 7395969.906784
+324138.048521 7395979.415155
+324096.446287 7395984.604266
+324073.810384 7395987.203821
+324043.027205 7395988.033679
+324016.053785 7395986.313973
+323999.998374 7395984.374306
+323965.578607 7395981.524794
+323928.759187 7395969.336881
+323903.146395 7395958.178793
+323879.512698 7395948.920378
+323833.770856 7395916.805879
+323808.306496 7395899.178899
+323797.446210 7395885.901173
+323709.483668 7395792.587157
+323675.583414 7395753.253894
+323662.397691 7395744.275432
+323639.761788 7395698.913202
+323623.129141 7395670.348095
+323604.773031 7395633.144468
+323592.667565 7395614.757618
+323573.470340 7395590.511771
+323557.546868 7395571.345054
+323539.067065 7395554.967859
+323508.143700 7395536.990938
+323488.360993 7395525.942831
+323437.819845 7395510.365499
+323352.092032 7395420.640868
+323241.848174 7395300.011531
+323193.046981 7395247.870462
+323084.806958 7395133.560042
+322960.626970 7395008.331493
+322908.486054 7395063.202094
+322778.038931 7395159.315631
+322679.249088 7395255.479159
+322541.866886 7395376.308462
+322440.265078 7395484.729890
+322323.325281 7395595.220964
+322149.478247 7395741.825852
+321998.324839 7395885.191295
+321851.319285 7396032.046140
+321734.049639 7396143.926976
+321538.275877 7396361.519704
+321460.010902 7396574.223270
+321439.766406 7396810.552789
+321435.824708 7396919.844068
+321439.873607 7397044.702681
+321155.156001 7397230.310888
+321196.172753 7397248.547764
+321232.637585 7397269.054252
+321266.818211 7397280.452299
+321310.119168 7397294.119958
+321344.299794 7397298.679177
+321387.600751 7397314.626445
+321435.453627 7397344.251371
+321481.690243 7397401.231611
+321535.628837 7397502.714228
+321583.440483 7397617.474570
+321628.324716 7397727.745682
+321647.785820 7397771.298222
+321664.162834 7397793.174474
+321728.590634 7397885.788610
+321839.329266 7397988.471022
+321962.148625 7398073.036537
+322107.109114 7398101.221709
+322401.062497 7398103.231365
+322637.292267 7398096.632495
+322810.331171 7398086.984148
+323021.822248 7398089.763671
+323213.489387 7398119.318609
+323369.285423 7398217.451800
+323509.298173 7398295.668402
+323748.999605 7398458.030591
+323794.527045 7398290.029368
+323823.578515 7398208.733293
+323830.909414 7398192.076146
+323847.566800 7398138.115389
+323867.563909 7398098.142236
+323894.867179 7398063.488172
+323924.256745 7398036.192848
+323980.817641 7397992.200383
+Region 1
+221
+340976.158818 7397756.260797
+341015.427369 7397786.855557
+341050.976869 7397821.989539
+341089.420796 7397865.392104
+341113.804900 7397899.696228
+341167.957897 7398039.822226
+341184.079278 7398108.030542
+341189.859886 7398155.562401
+341192.168830 7398186.007186
+341187.608665 7398241.597664
+341182.009474 7398277.091584
+341165.475782 7398349.009265
+341125.662980 7398510.671574
+341114.217212 7398564.362377
+341107.191423 7398796.252656
+341111.322785 7398835.935859
+341124.970297 7398907.033680
+341134.478201 7398975.241997
+341148.942089 7399050.469111
+341168.370209 7399113.708279
+341191.929690 7399184.806101
+341162.169043 7399198.763710
+341149.354401 7399204.542720
+341144.192260 7399208.881977
+341139.854743 7399215.710807
+341137.166472 7399220.250029
+341130.965306 7399223.969392
+341120.838935 7399230.798223
+341107.818137 7399240.096630
+341092.315223 7399249.395037
+341079.500581 7399258.693444
+341066.892094 7399269.231639
+341056.353412 7399278.740011
+341045.608573 7399286.388700
+341030.732373 7399298.996541
+341004.896932 7399322.972434
+340983.399009 7399341.989177
+340960.457995 7399360.376027
+340942.893524 7399374.023689
+340925.329053 7399385.391742
+340914.782124 7399392.000610
+340893.086291 7399408.737743
+340881.508583 7399417.006327
+340872.833548 7399422.795335
+340847.204264 7399447.601086
+340836.253269 7399460.408892
+340819.925733 7399486.454431
+340812.067075 7399500.711989
+340808.966492 7399508.570643
+340803.185884 7399530.476890
+340797.603186 7399554.862713
+340794.708759 7399569.330235
+340788.919905 7399611.493013
+340787.270659 7399622.651102
+340785.200855 7399650.346358
+340784.788544 7399670.802854
+340784.582388 7399695.608605
+340786.033725 7399718.344710
+340787.889127 7399741.280781
+340788.919905 7399766.086532
+340787.064503 7399788.192746
+340784.170077 7399802.870232
+340781.687961 7399810.728886
+340778.999690 7399816.507896
+340774.868328 7399823.126762
+340769.994806 7399829.835613
+340764.741957 7399837.184354
+340759.365415 7399846.482761
+340751.721159 7399861.770143
+340745.519994 7399872.728266
+340725.473407 7399904.142885
+340709.352026 7399934.937610
+340687.862349 7399972.141237
+340668.021918 7400004.375716
+340651.092406 7400031.351095
+340634.954533 7400057.286653
+340616.920027 7400088.041385
+340608.294469 7400102.348934
+340596.098294 7400128.174510
+340558.487236 7400204.851376
+340552.492227 7400220.358720
+340547.791875 7400229.657127
+340529.773861 7400252.483217
+340521.362706 7400269.300337
+340503.336446 7400308.053698
+340500.334818 7400317.062155
+340499.130868 7400333.889273
+340447.278570 7400269.590287
+340233.973322 7400103.468742
+340131.101594 7400024.922196
+340053.933368 7399963.952640
+339973.656312 7399907.072383
+339966.242951 7399899.663652
+339947.952812 7399866.169389
+339900.165905 7399823.966618
+339882.659157 7399807.249482
+339836.579220 7399829.265710
+339793.970947 7399849.642220
+339751.370919 7399881.136825
+339718.946740 7399907.992225
+339697.960083 7399933.077928
+339672.099904 7399958.183628
+339641.341464 7399987.518603
+339604.060255 7400067.194955
+339615.283375 7400110.037617
+339507.571110 7400212.490068
+339423.443065 7400304.864245
+339275.654119 7400465.586714
+339213.947575 7400525.076524
+339071.700097 7400670.651589
+339012.582869 7400722.742666
+338984.619901 7400747.098494
+338974.147188 7400753.987314
+338951.197928 7400765.485345
+338922.121719 7400770.444495
+338892.501259 7400775.503628
+338766.523593 7400795.240248
+338729.819620 7400803.018915
+338658.250585 7400808.088047
+338629.058928 7400804.838604
+338601.277377 7400809.587790
+338560.689430 7400814.047026
+338380.806155 7400829.324409
+338318.002862 7400819.716055
+338252.973087 7400809.017888
+338198.061437 7400790.511058
+338081.913278 7400670.821560
+338037.936130 7400625.009407
+338025.146227 7400605.682717
+337974.019597 7400554.811431
+337903.077274 7400482.393836
+337834.716022 7400379.311493
+337790.376040 7400367.853455
+337671.786997 7400344.207506
+337573.500174 7400280.288454
+337503.671093 7400238.175668
+337441.948057 7400193.393339
+337340.832776 7400233.286505
+337318.600939 7400187.734308
+337318.089672 7400177.836004
+337316.300240 7400158.459323
+337317.471205 7400132.563758
+337321.858200 7400092.160679
+337327.556345 7400064.295452
+337320.233692 7400027.491756
+337313.537753 7400008.574996
+337301.778628 7399982.419477
+337287.809513 7399961.773013
+337258.189053 7399938.876935
+337190.586454 7399887.675705
+337185.028495 7399879.717069
+337091.070943 7399813.628389
+337058.424116 7399793.721799
+337016.228153 7399683.040757
+336970.016277 7399568.890310
+337007.652073 7399506.690965
+337033.726655 7399465.088091
+337054.589618 7399429.514184
+337075.073255 7399391.360720
+337092.942837 7399344.448755
+337127.568759 7399337.749903
+337148.390492 7399271.011334
+337161.939049 7399228.858555
+337169.723491 7399208.232088
+337175.149510 7399188.695434
+337178.596435 7399163.479754
+337179.454043 7399134.534712
+337181.193997 7399038.371184
+337178.307817 7398931.559479
+337177.837782 7398826.127539
+337176.716294 7398724.474951
+337175.932902 7398630.621027
+337173.021983 7398484.346083
+337172.997244 7398413.518215
+337172.288068 7398366.076342
+337172.263330 7398316.744792
+337170.960425 7398213.692444
+337170.803747 7398157.902000
+337170.836732 7398113.799554
+337176.493646 7397969.644247
+337151.771446 7397930.240996
+337117.928916 7397883.069076
+337096.398008 7397846.145401
+337085.117164 7397800.003305
+337064.278939 7397738.833783
+337023.344650 7397666.586158
+337016.120952 7397601.577293
+337030.568348 7397531.739256
+337111.777228 7397341.601825
+337074.751652 7397287.131155
+337050.144900 7397256.326432
+337016.063229 7397203.965401
+336981.824879 7397158.343215
+337194.214796 7397000.300287
+337391.332693 7396931.912001
+337576.386355 7396931.912001
+337821.777686 7396988.232354
+338206.431361 7397106.442105
+338535.431225 7397199.266206
+338585.906403 7397212.193991
+338837.853488 7397289.180804
+338911.335649 7397309.607305
+339021.373351 7397338.952279
+339154.731393 7397356.979191
+339360.862421 7397336.002784
+339523.214210 7397336.002784
+339593.026798 7397346.071059
+339654.560171 7397352.419972
+339841.040431 7397414.219386
+340016.116154 7397512.502551
+340178.896747 7397598.507819
+340221.570991 7397617.284603
+340301.757337 7397650.718876
+340424.617928 7397669.145719
+340657.879054 7397676.074533
+340771.685283 7397678.364140
+340824.461159 7397685.172974
+340880.675714 7397701.700143
+340932.074469 7397727.665696
+340931.777605 7397728.135615
+340976.158818 7397756.260797
+Region 1
+234
+331712.623682 7390192.006486
+331686.120296 7390140.935234
+331683.753628 7390117.869185
+331690.259904 7390088.884150
+331696.757934 7390068.057717
+331725.850636 7390000.039368
+331798.821531 7389936.790202
+331619.870079 7389999.569448
+331573.757157 7390028.264533
+331581.788986 7390000.029370
+331590.562976 7389974.213792
+331596.401307 7389945.818655
+331600.343005 7389909.554867
+331608.127447 7389827.828866
+331608.127447 7389775.287866
+331601.621171 7389634.431993
+331591.973081 7389489.226866
+331578.226614 7389343.421841
+331578.127660 7389255.396918
+331603.262171 7389247.928198
+331730.006736 7389215.003837
+331758.918020 7389207.865060
+331859.901361 7389182.949328
+331993.976825 7389168.841745
+332122.123249 7389164.182543
+332262.152492 7389149.874993
+332395.551765 7389140.086670
+332485.031614 7389141.446437
+332546.367077 7389142.616237
+332643.697338 7389145.295778
+332704.529781 7389146.205622
+332778.284068 7389149.245101
+332853.572154 7389149.485060
+332929.091134 7389152.794493
+333027.452173 7389152.694510
+333212.002815 7389152.654517
+333340.272933 7389152.234589
+333412.518160 7389151.704680
+333453.600881 7389150.704851
+333502.022747 7389150.774839
+333541.563423 7389151.544707
+333623.951513 7389150.314918
+333697.211026 7389151.054791
+333774.032911 7389149.785009
+333847.787198 7389151.804663
+333847.828429 7389151.794665
+333915.208380 7389153.024454
+333951.186684 7389155.294065
+334049.803356 7389156.203909
+334125.817111 7389160.013257
+334232.539828 7389161.483005
+334285.761000 7389163.872596
+334309.048356 7389163.042738
+334325.870666 7389161.403019
+334336.434088 7389160.143235
+334355.656051 7389198.566653
+334398.330295 7389286.481594
+334434.844604 7389360.768869
+334459.542065 7389411.040258
+334476.933365 7389447.074086
+334519.632348 7389534.169167
+334562.331330 7389621.594192
+334572.185575 7389643.190493
+334578.139354 7389658.437881
+334582.872690 7389672.885406
+334586.096967 7389686.103142
+334594.582338 7389711.338820
+334610.423347 7389763.679854
+334619.535432 7389797.564050
+334623.526607 7389823.189661
+334627.385843 7389842.956275
+334640.332426 7389940.829510
+334640.818953 7389946.328568
+334645.758445 7389969.414614
+334648.801304 7389997.919731
+334651.901887 7390022.095590
+334653.056359 7390036.953045
+334654.441726 7390058.669325
+334656.511530 7390074.536607
+334662.844635 7390110.490449
+334665.928725 7390135.556155
+334669.037554 7390158.292261
+334676.038604 7390198.245417
+334685.092965 7390236.778817
+334694.196804 7390280.181382
+334700.727819 7390307.506702
+334715.199954 7390372.165626
+334729.729812 7390426.156378
+334751.541092 7390497.804105
+334775.413930 7390544.526102
+334821.106294 7390644.199029
+334851.122573 7390700.939310
+334864.836055 7390724.575262
+334875.209813 7390746.171562
+334883.959064 7390766.178135
+334886.358717 7390771.667195
+334892.749546 7390783.805116
+334904.450947 7390805.421413
+334927.861996 7390847.114272
+334941.361075 7390872.179978
+334954.208703 7390891.596652
+334971.979330 7390909.193638
+334980.984214 7390915.602540
+334987.828585 7390924.650990
+334994.046243 7390932.429658
+335005.228132 7390941.618084
+335015.486443 7390948.506904
+335024.977854 7390952.946144
+335037.536863 7390956.615515
+335079.493685 7390965.963914
+335100.315417 7390970.403153
+335122.209160 7390974.532446
+335146.865389 7390981.121317
+335159.267720 7390984.790689
+335169.963081 7390988.909983
+335175.042759 7390990.459718
+335190.199331 7390998.418355
+335201.686331 7391006.686938
+335214.698883 7391018.934840
+335225.113872 7391029.802979
+335234.300173 7391042.670775
+335251.295654 7391067.466527
+335295.891269 7391144.893265
+335221.567993 7391197.974173
+335162.541474 7391247.205740
+335076.450826 7391312.944479
+335060.840711 7391329.821588
+334992.396997 7391379.663051
+334894.209128 7391456.909819
+334822.499907 7391510.330669
+334778.341342 7391546.504472
+334698.187980 7391544.164873
+334563.617742 7391541.795279
+334499.981580 7391540.285538
+334443.264006 7391537.536009
+334386.538185 7391537.016098
+334304.100617 7391534.196581
+334217.572919 7391529.127449
+334144.321652 7391529.517382
+334080.363887 7391531.637019
+334025.790333 7391529.297420
+333890.156331 7391524.158300
+333859.810202 7391489.414252
+333826.083119 7391473.466983
+333781.553474 7391471.317351
+333714.173523 7391474.746764
+333632.337930 7391481.265647
+333580.106305 7391482.015519
+333513.386053 7391491.213943
+333436.481706 7391488.064483
+333418.191566 7391488.814354
+333398.606768 7391516.789562
+333384.497468 7391539.305706
+333378.246825 7391690.329836
+333321.578728 7391799.701102
+333313.299512 7391811.189134
+333309.011473 7391814.528562
+333302.678367 7391817.877989
+333295.833996 7391819.717674
+333289.220519 7391820.027620
+333283.876961 7391819.817656
+333277.263485 7391819.377732
+333269.619229 7391818.427894
+333264.786938 7391818.467888
+333259.707259 7391819.777663
+333253.638034 7391822.627175
+333250.108647 7391826.466518
+333239.347316 7391844.073502
+333289.797755 7391879.407449
+333133.292544 7391870.638951
+333028.037656 7391902.023575
+332932.142239 7391927.989128
+332872.571469 7391951.855040
+332727.652212 7391998.537043
+332626.710103 7392026.792204
+332559.536308 7392053.557619
+332541.609002 7392058.756728
+332497.986442 7392078.373368
+332461.076314 7392090.601274
+332337.028266 7392179.646021
+332219.989515 7392274.429785
+332079.572699 7392394.139280
+332000.029558 7392457.088498
+331984.056610 7392468.866480
+331896.687796 7392539.074454
+331727.186525 7392674.131320
+331708.401611 7392647.115948
+331642.151394 7392566.939681
+331552.696284 7392470.546192
+331512.965945 7392428.223442
+331477.012380 7392393.809337
+331393.346123 7392309.223826
+331314.891485 7392231.127203
+331268.399237 7392184.845130
+331356.386518 7392080.083075
+331372.780024 7392078.383366
+331457.023516 7392028.971830
+331476.921671 7392021.553101
+331503.029237 7392006.015762
+331513.609151 7392000.046785
+331547.410451 7391976.780770
+331571.753323 7391955.614396
+331580.213956 7391937.117564
+331567.753902 7391862.920273
+331566.418012 7391788.333049
+331562.459821 7391723.314187
+331560.373525 7391612.173224
+331552.712777 7391549.134022
+331529.359452 7391440.092700
+331530.579894 7391396.140229
+331532.938316 7391370.984537
+331538.380828 7391348.338417
+331546.602320 7391322.142904
+331564.241007 7391298.396971
+331618.971240 7391230.768555
+331663.690549 7391190.525448
+331671.474991 7391181.546986
+331706.711134 7391153.281828
+331723.253073 7391033.212395
+331796.190983 7390927.970422
+331796.182737 7390927.970422
+331839.458955 7390873.599735
+331877.581279 7390814.959779
+331878.562581 7390809.360739
+331879.543882 7390803.001828
+331883.601028 7390765.178307
+331883.601028 7390765.138313
+331888.837384 7390642.429332
+331872.179998 7390625.002317
+331824.459062 7390497.804105
+331824.607494 7390483.056631
+331847.127950 7390357.198190
+331728.703831 7390216.982208
+331712.623682 7390192.006486
+Region 1
+241
+347127.871620 7396265.856090
+347122.561047 7396275.024520
+347113.448962 7396289.142102
+347102.811325 7396304.029552
+347082.690522 7396333.044581
+347075.087497 7396342.972881
+347035.456113 7396393.084297
+347007.460160 7396427.338430
+346934.175908 7396511.733974
+346913.123281 7396540.808993
+346870.003741 7396595.929552
+346849.998386 7396653.999605
+346767.000074 7396758.541698
+346753.583457 7396787.756693
+346743.242684 7396808.623119
+346729.083906 7396834.408702
+346713.003756 7396857.004832
+346682.146361 7396882.460472
+346606.000667 7396934.001643
+346663.650065 7397002.509908
+346583.043161 7397058.800266
+346487.411624 7397125.588826
+346441.018330 7397158.073262
+346369.696682 7397206.344993
+346323.369358 7397234.600153
+346297.352500 7397248.917701
+346272.976642 7397262.855313
+346245.566172 7397276.782928
+346217.042460 7397288.410936
+346173.287960 7397304.518177
+346145.143575 7397312.726771
+346113.972823 7397317.875889
+346090.619498 7397324.224801
+346064.569655 7397326.884346
+346034.149310 7397329.993813
+346008.701443 7397329.653871
+345985.158454 7397329.333926
+345965.788058 7397327.324270
+345941.873989 7397324.144815
+345903.916590 7397316.696091
+345889.873259 7397315.856235
+345752.128222 7397293.090134
+345663.629675 7397279.592446
+345579.773755 7397272.023743
+345466.074727 7397268.564335
+345370.385467 7397240.309175
+345309.091234 7397184.348761
+345281.631286 7397156.473536
+345130.815974 7397068.498605
+345013.999871 7397017.267380
+344861.749714 7396923.823386
+344839.377691 7396909.745798
+344760.865329 7396880.800756
+344574.838611 7396839.177885
+344332.424169 7396819.001341
+344237.699718 7396816.201821
+344099.501138 7396799.834625
+344081.079059 7396798.284890
+344064.190779 7396796.955118
+344042.552669 7396793.795659
+344009.518269 7396790.946147
+343977.555879 7396790.336252
+343879.203087 7396797.055101
+343791.397223 7396820.211134
+343715.721564 7396839.557820
+343674.910969 7396845.776755
+343602.377124 7396858.284613
+343575.296502 7396859.494405
+343550.895906 7396861.134125
+343524.986249 7396859.324435
+343504.040823 7396857.194799
+343477.413745 7396851.565764
+343369.849912 7396814.232158
+343335.207497 7396803.933922
+343279.974244 7396792.585866
+343205.758168 7396771.759434
+343095.093753 7396735.055721
+342987.562905 7396704.640930
+342948.500511 7396691.743140
+342822.902172 7396659.348689
+342649.475695 7396620.115409
+342571.590047 7396602.818372
+342332.168986 7396537.609541
+342174.129976 7396493.967017
+342122.162230 7396481.249195
+341969.887335 7396445.495320
+341980.417772 7396412.301006
+341984.499656 7396398.213419
+342000.010816 7396350.091661
+342015.653915 7396258.917279
+342048.292496 7396186.579670
+342073.690886 7396157.934576
+342102.750603 7396104.963650
+342191.628477 7396049.993066
+342234.879957 7396029.906506
+342384.639752 7395945.910894
+342423.364051 7395920.065321
+342544.995953 7395870.413826
+342584.396443 7395854.086623
+342647.117273 7395830.040741
+342723.617555 7395798.906075
+342827.783940 7395759.482827
+342828.064312 7395758.792946
+342882.736821 7395734.797056
+343006.339573 7395722.839104
+343090.541834 7395728.968054
+343259.927657 7395711.531041
+343297.093419 7395688.724948
+343318.179031 7395674.867321
+343350.240375 7395644.822468
+343405.696277 7395597.970493
+343445.360646 7395570.445208
+343492.207482 7395542.170051
+343552.363735 7395509.005732
+343636.450549 7395469.902430
+343738.406944 7395422.220597
+343807.328940 7395384.187112
+343846.012008 7395366.440152
+343874.304826 7395346.583553
+343898.210648 7395326.357018
+343918.537607 7395306.080491
+343936.316480 7395286.113911
+343964.601051 7395247.540519
+343997.709667 7395210.626841
+344050.535021 7395155.316316
+344090.867335 7395118.082693
+344147.873527 7395066.001614
+344168.159255 7395047.824728
+344203.749986 7395025.048629
+344250.209250 7394992.104272
+344282.097423 7394964.748958
+344301.418342 7394942.802717
+344319.494079 7394923.616004
+344341.165174 7394892.611315
+344358.284348 7394866.545779
+344373.366704 7394840.910171
+344384.985643 7394823.093222
+344404.133391 7394799.657237
+344422.332822 7394771.961981
+344451.598694 7394744.276723
+344520.751585 7394701.714014
+344622.270930 7394640.994414
+344735.615370 7394572.756103
+344775.766267 7394550.809862
+344813.905084 7394528.313716
+344885.894678 7394485.601032
+344940.163122 7394452.206752
+344961.125040 7394440.808704
+344974.211808 7394429.100710
+344990.374420 7394416.422881
+345002.661304 7394403.925022
+345015.789303 7394388.557654
+345035.382347 7394369.720881
+345088.512811 7394289.214671
+345149.056636 7394192.841179
+345175.988826 7394226.315445
+345249.974007 7394251.931057
+345311.812491 7394276.566838
+345355.731915 7394296.593407
+345376.817527 7394306.041789
+345423.383991 7394329.647745
+345475.722817 7394361.672260
+345500.717142 7394389.017576
+345517.118895 7394416.352893
+345543.663511 7394488.240580
+345568.666083 7394536.652287
+345585.076082 7394559.308406
+345604.397000 7394584.384111
+345734.192671 7394719.580953
+345743.189308 7394728.849366
+345755.286529 7394735.108294
+345779.596417 7394747.176226
+345838.952785 7394765.913017
+345899.875937 7394769.042481
+345972.533475 7394769.042481
+346033.456627 7394772.161947
+346058.467445 7394776.921131
+346083.338076 7394794.798069
+346097.628794 7394806.816011
+346115.176773 7394818.963930
+346126.630787 7394827.792418
+346174.071352 7394867.085687
+346235.522263 7394903.979367
+346285.783039 7394920.986454
+346341.610020 7394930.954747
+346387.327123 7394929.964916
+346430.289984 7394925.275720
+346565.899247 7394898.500306
+346617.850500 7394882.603029
+346686.409662 7394868.085516
+346699.438706 7394919.356733
+346704.221520 7394932.394500
+346713.242897 7394970.258014
+346724.771127 7395020.579395
+346738.641287 7395065.541693
+346741.857317 7395074.060234
+346746.598900 7395097.636196
+346756.453145 7395130.210616
+346763.338748 7395156.226160
+346770.941772 7395186.081046
+346784.152234 7395234.612733
+346850.303496 7395310.679703
+346862.268777 7395324.447345
+346881.787605 7395351.112778
+346907.367412 7395406.183344
+346914.599357 7395423.100447
+346934.175908 7395449.815871
+346950.767324 7395474.181697
+346964.530283 7395488.949167
+346981.987553 7395508.755775
+346996.146331 7395522.783372
+347014.890014 7395536.141084
+347045.697931 7395555.087838
+347084.884019 7395573.624663
+347101.129094 7395580.663458
+347124.927715 7395589.561933
+347162.093477 7395597.210623
+347177.184079 7395604.819320
+347205.922193 7395630.164978
+347213.269584 7395625.355802
+347231.411292 7395615.077563
+347254.038949 7395608.698655
+347290.066730 7395599.180286
+347318.062683 7395591.771555
+347326.259437 7395590.031853
+347416.737079 7395575.204393
+347449.680771 7395572.064930
+347569.737643 7395549.508794
+347523.360842 7395610.978265
+347457.910509 7395688.844927
+347404.367733 7395763.672110
+347334.076863 7395844.648239
+347280.517595 7395911.086859
+347310.641076 7395928.273915
+347269.236752 7396004.040937
+347234.421166 7396063.240796
+347202.697917 7396121.100886
+347183.987219 7396159.784259
+347170.743773 7396193.348510
+347157.467342 7396220.433871
+347127.871620 7396265.856090
+Region 1
+295
+340685.973962 7401513.817162
+340707.298714 7401477.173439
+340730.429391 7401434.220796
+340739.145657 7401412.884451
+340743.351235 7401399.066818
+340746.352863 7401382.849596
+340746.055998 7401364.522735
+340743.351235 7401342.896439
+340735.838919 7401319.770401
+340723.222186 7401296.334415
+340711.809403 7401276.807760
+340706.704986 7401265.099765
+340704.602197 7401256.381258
+340703.695112 7401247.972699
+340704.602197 7401238.964242
+340707.298714 7401230.855631
+340717.218930 7401211.628924
+340721.119397 7401203.220364
+340724.228226 7401190.922471
+340725.630085 7401185.493401
+340732.235316 7401132.322509
+340730.734502 7401098.078374
+340729.530552 7401061.434651
+340724.121025 7401013.072935
+340714.514166 7400970.110294
+340700.396619 7400930.467085
+340684.176284 7400901.322077
+340664.047235 7400881.795422
+340633.107377 7400859.869177
+340614.784253 7400847.551287
+340599.462756 7400832.833808
+340587.142888 7400814.216997
+340578.434868 7400793.790496
+340575.433240 7400777.263327
+340574.526155 7400763.745643
+340575.433240 7400742.719244
+340576.934054 7400667.922056
+340575.433240 7400640.286790
+340573.025341 7400591.325177
+340572.423366 7400555.271352
+340568.217788 7400527.636086
+340561.612558 7400483.483649
+340551.997453 7400444.130390
+340545.689086 7400417.694918
+340535.777117 7400391.859343
+340522.261545 7400365.433870
+340510.543651 7400345.307317
+340499.130868 7400333.889273
+340447.278570 7400269.590287
+340233.973322 7400103.468742
+340131.101594 7400024.922196
+340053.933368 7399963.952640
+339973.656312 7399907.072383
+339966.242951 7399899.663652
+339947.952812 7399866.169389
+339900.165905 7399823.966618
+339882.659157 7399807.249482
+339836.579220 7399829.265710
+339793.970947 7399849.642220
+339751.370919 7399881.136825
+339718.946740 7399907.992225
+339697.960083 7399933.077928
+339672.099904 7399958.183628
+339641.341464 7399987.518603
+339604.060255 7400067.194955
+339615.283375 7400110.037617
+339507.571110 7400212.490068
+339423.443065 7400304.864245
+339275.654119 7400465.586714
+339213.947575 7400525.076524
+339071.700097 7400670.651589
+339012.582869 7400722.742666
+338984.619901 7400747.098494
+338974.147188 7400753.987314
+338951.197928 7400765.485345
+338922.121719 7400770.444495
+338892.501259 7400775.503628
+338766.523593 7400795.240248
+338729.819620 7400803.018915
+338658.250585 7400808.088047
+338629.058928 7400804.838604
+338601.277377 7400809.587790
+338560.689430 7400814.047026
+338380.806155 7400829.324409
+338318.002862 7400819.716055
+338252.973087 7400809.017888
+338198.061437 7400790.511058
+338081.913278 7400670.821560
+338037.936130 7400625.009407
+338025.146227 7400605.682717
+337974.019597 7400554.811431
+337903.077274 7400482.393836
+337834.716022 7400379.311493
+337790.376040 7400367.853455
+337671.786997 7400344.207506
+337573.500174 7400280.288454
+337503.671093 7400238.175668
+337441.948057 7400193.393339
+337340.832776 7400233.286505
+337250.000546 7400310.003364
+337221.551050 7400314.952517
+337173.648696 7400351.536250
+337141.711045 7400383.940700
+337104.446329 7400418.634757
+337089.240279 7400428.922995
+337058.828181 7400437.671496
+337034.881127 7400436.881631
+336966.132302 7400431.462560
+336961.431951 7400532.855192
+336956.723353 7400588.905591
+336871.581022 7400643.666211
+336827.513165 7400669.761741
+336838.637330 7400751.907670
+336851.047907 7400819.936018
+336865.173700 7400930.737038
+336880.569413 7401039.408424
+336794.140670 7401093.309191
+336731.683719 7401133.962228
+336756.884199 7401134.612116
+336764.652149 7401143.780546
+336782.051695 7401154.298744
+336797.364946 7401170.096038
+336802.733242 7401189.822659
+336816.957990 7401211.668917
+336838.225019 7401216.678059
+336859.970329 7401224.466725
+336883.678242 7401238.324351
+336905.052472 7401256.961159
+336945.104414 7401285.116336
+336977.668779 7401301.343557
+337017.382626 7401314.611284
+337034.518293 7401323.849702
+337053.171267 7401337.677333
+337078.297531 7401361.143314
+337100.941681 7401379.280207
+337133.943096 7401402.826174
+337146.477366 7401416.833774
+337158.178768 7401437.640210
+337167.043466 7401462.455960
+337182.200038 7401492.130877
+337202.856845 7401529.424489
+337227.991356 7401575.346623
+337250.586028 7401620.738847
+337270.055379 7401674.179693
+337279.695222 7401700.025268
+337286.605564 7401715.472620
+337292.031584 7401729.910147
+337300.871543 7401757.245465
+337306.008944 7401774.712473
+337313.323351 7401801.777837
+337322.385959 7401831.392764
+337335.612912 7401852.469154
+337350.019077 7401880.874288
+337358.883775 7401892.032377
+337366.552770 7401901.220803
+337397.954416 7401954.021759
+337428.135620 7402002.513453
+337442.385107 7402022.340057
+337452.313569 7402042.376625
+337459.759915 7402057.594018
+337477.390356 7402093.597851
+337485.092335 7402106.805589
+337502.599083 7402132.201238
+337518.407107 7402149.008360
+337548.134769 7402170.004763
+337570.045004 7402185.612090
+337590.635841 7402205.748640
+337600.110760 7402221.335970
+337615.811584 7402248.141379
+337644.096155 7402261.299125
+337708.309553 7402276.966441
+337738.276355 7402284.445160
+337775.301931 7402310.550689
+337823.154807 7402345.094772
+337867.255649 7402373.799855
+337976.122386 7402452.076447
+338108.218754 7402548.929857
+338115.813533 7402554.678872
+338139.537938 7402567.276714
+338184.389187 7402597.251580
+338204.749130 7402615.368476
+338219.633577 7402624.346938
+338236.332194 7402629.316087
+338249.254037 7402631.455721
+338265.919669 7402639.444352
+338275.716191 7402648.882736
+338291.301567 7402662.410418
+338304.421320 7402672.208740
+338310.688455 7402677.237879
+338338.189635 7402692.405281
+338350.996031 7402705.143099
+338356.141679 7402722.100194
+338358.706256 7402742.816646
+338363.365377 7402757.254173
+338371.644592 7402766.412604
+338377.936466 7402771.271771
+338389.852270 7402785.999249
+338393.967139 7402790.868415
+338411.333700 7402804.156139
+338431.165885 7402824.292689
+338450.684713 7402849.968291
+338460.159632 7402865.575618
+338469.642797 7402880.443071
+338483.570681 7402906.058684
+338494.266042 7402926.355207
+338509.043287 7402944.422112
+338528.141557 7402961.519184
+338553.358531 7402976.906548
+338572.531017 7402987.954656
+338605.639633 7403024.108463
+338613.424075 7403032.267065
+338631.153471 7403058.432583
+338653.632695 7403072.300208
+338694.649447 7403101.205257
+338714.357938 7403109.733796
+338725.407887 7403120.441962
+338739.014168 7403130.160297
+338766.086543 7403137.998954
+338807.697023 7403139.938622
+338834.051976 7403144.237886
+338845.934794 7403148.137218
+338869.312858 7403146.607480
+338888.732731 7403145.747627
+338895.725535 7403145.107737
+338912.869448 7403155.625935
+338931.547161 7403165.394262
+338949.177602 7403177.942113
+338959.543114 7403182.081403
+338977.025123 7403185.530813
+338993.550569 7403182.921260
+339004.493317 7403180.261715
+339011.576829 7403182.851272
+339022.618532 7403194.569264
+339035.210526 7403203.027816
+339054.638646 7403213.815968
+339072.994755 7403217.515334
+339097.197442 7403222.314512
+339116.040079 7403216.955430
+339137.645203 7403214.395868
+339165.336046 7403212.656166
+339189.967537 7403211.886298
+339211.770571 7403214.375872
+339235.346544 7403216.885442
+339257.166070 7403218.365188
+339269.543662 7403223.534303
+339294.537988 7403236.152142
+339304.466449 7403250.679653
+339309.768776 7403259.268182
+339317.775866 7403269.696396
+339329.394805 7403275.105469
+339347.891100 7403278.574875
+339379.103083 7403279.384736
+339430.592547 7403282.934128
+339454.193259 7403283.923959
+339467.288273 7403293.142380
+339475.295363 7403304.070508
+339484.044614 7403316.518376
+339490.534398 7403326.176721
+339501.501884 7403339.634416
+339528.730938 7403287.493347
+339551.086469 7403241.141287
+339571.809247 7403207.327079
+339575.066508 7403198.608573
+339592.837135 7403166.014156
+339603.722159 7403142.748141
+339622.523565 7403109.943760
+339638.653192 7403075.629638
+339671.596884 7403017.569583
+339677.336260 7403003.162051
+339698.034299 7402967.818105
+339750.249432 7402870.034854
+339814.504061 7402751.015241
+339872.318384 7402636.234902
+339914.093789 7402563.397378
+339928.269059 7402528.333385
+339935.212385 7402517.325270
+340029.079229 7402346.694498
+340067.284015 7402276.226568
+340085.458708 7402242.172401
+340110.123183 7402193.430750
+340137.756302 7402141.949569
+340168.943547 7402079.690233
+340196.947746 7402027.809120
+340230.707814 7401962.430319
+340262.076476 7401908.179611
+340316.600553 7401865.966842
+340416.808747 7401793.609236
+340488.089165 7401747.507133
+340583.539285 7401682.738227
+340602.769495 7401679.038861
+340605.474258 7401656.202773
+340611.180650 7401637.276015
+340622.890298 7401612.350284
+340639.110633 7401588.914299
+340685.973962 7401513.817162
+Region 1
+372
+320402.027756 7389574.232305
+320376.390225 7389522.751123
+320358.149563 7389505.934004
+320367.327618 7389498.405293
+320378.451783 7389490.126711
+320386.162009 7389477.258916
+320391.555044 7389462.151503
+320408.979329 7389439.995298
+320420.087002 7389416.319354
+320434.377719 7389399.432247
+320449.723955 7389380.575476
+320467.024546 7389359.409102
+320484.226184 7389339.012596
+320501.856625 7389316.306485
+320506.713655 7389307.907924
+320510.300765 7389301.678991
+320515.792754 7389278.482964
+320519.214940 7389257.266598
+320518.349086 7389236.760111
+320515.891709 7389220.562885
+320510.886247 7389204.105704
+320506.697162 7389188.108444
+320508.181484 7389167.082046
+320512.246875 7389151.954637
+320518.959307 7389137.087184
+320526.949905 7389126.768951
+320544.778255 7389112.921323
+320563.076641 7389094.094548
+320576.476766 7389074.657877
+320590.536589 7389052.231719
+320606.138457 7389036.694380
+320622.424763 7389023.826584
+320641.968330 7389011.888629
+320663.606439 7389003.620046
+320693.276377 7388997.781046
+320716.357576 7388996.631243
+320734.095218 7388998.290958
+320757.201157 7388995.361460
+320776.456105 7388989.942388
+320791.249843 7388982.263704
+320809.515244 7388974.515031
+320830.708057 7388961.257302
+320847.802493 7388948.619467
+320868.129451 7388930.812517
+320885.743400 7388918.074699
+320907.703112 7388900.177764
+320923.502890 7388885.200330
+320943.508246 7388876.911750
+320961.839616 7388871.712640
+320984.698168 7388864.243919
+321008.307126 7388853.005844
+321026.168462 7388844.807249
+321043.444315 7388834.279052
+321063.598103 7388822.781022
+321091.569317 7388805.294017
+321123.614169 7388789.296757
+321136.898847 7388779.708400
+321149.927891 7388773.959384
+321168.407694 7388765.810780
+321189.212934 7388758.312065
+321236.166971 7388750.023484
+321253.211930 7388750.123467
+321274.775823 7388748.283782
+321294.327636 7388743.534596
+321310.820097 7388738.645433
+321323.016272 7388726.277552
+321336.366920 7388710.940179
+321345.528482 7388696.312685
+321357.559733 7388681.175277
+321365.253466 7388669.417291
+321373.532681 7388643.601713
+321381.729435 7388623.985074
+321389.579846 7388599.939192
+321397.496228 7388578.212914
+321405.635257 7388547.418189
+321408.274051 7388531.720878
+321416.190433 7388510.554503
+321431.520175 7388491.907697
+321456.407299 7388485.008879
+321471.440178 7388482.759264
+321483.941464 7388478.589978
+321500.780267 7388479.019905
+321513.735095 7388479.619802
+321528.438124 7388479.469828
+321538.935576 7388480.819597
+321558.223509 7388481.049557
+321558.264740 7388477.290201
+321556.829896 7388469.511534
+321552.335701 7388461.592890
+321545.095510 7388452.314479
+321537.187375 7388448.235178
+321523.177029 7388442.416175
+321508.053442 7388435.467365
+321499.634040 7388430.718178
+321495.197568 7388426.228947
+321489.878750 7388419.190153
+321479.958534 7388403.782792
+321469.757947 7388386.825697
+321462.855852 7388358.940473
+321461.684887 7388345.632753
+321459.780008 7388334.864597
+321456.382561 7388320.427070
+321454.469435 7388310.208821
+321452.490340 7388305.089697
+321447.253983 7388299.270694
+321440.566290 7388295.201391
+321428.485562 7388289.402385
+321416.009015 7388283.603378
+321405.552795 7388278.594236
+321393.562776 7388274.135000
+321377.903184 7388269.735753
+321361.212813 7388265.426491
+321351.135919 7388263.306854
+321342.065065 7388262.427005
+321327.559946 7388263.026902
+321310.127414 7388261.587149
+321300.891636 7388257.047927
+321293.338088 7388248.649365
+321282.527280 7388231.462309
+321274.314034 7388218.624508
+321269.349803 7388207.596397
+321266.488361 7388199.477788
+321262.958975 7388187.909769
+321259.833653 7388176.461730
+321259.042015 7388165.493609
+321260.740739 7388143.917305
+321262.084874 7388134.178973
+321265.902879 7388122.041052
+321269.531220 7388109.573188
+321272.557587 7388103.744186
+321281.735642 7388096.095496
+321292.422757 7388081.827940
+321297.551912 7388071.589694
+321298.599184 7388060.861532
+321296.100576 7388048.093719
+321293.783385 7388037.875469
+321292.208355 7388024.347786
+321289.544822 7388000.391889
+321284.877456 7387981.505125
+321279.006140 7387960.938647
+321272.054567 7387945.231338
+321255.702292 7387913.246817
+321246.103679 7387897.069588
+321240.487996 7387889.140946
+321236.389620 7387882.222131
+321230.914122 7387870.414153
+321227.549660 7387861.845621
+321252.956297 7387801.076030
+321345.033708 7387624.826220
+321356.891788 7387580.823758
+321356.908280 7387580.823758
+321356.900034 7387580.793763
+321356.908280 7387580.773766
+321356.900034 7387580.773766
+321346.419075 7387518.064508
+321378.373219 7387312.749676
+321405.429102 7387203.348416
+321404.431308 7387191.660418
+321409.791358 7387175.963107
+321457.932852 7387072.140890
+321543.207123 7387086.988347
+321598.580562 7387098.356400
+321678.387582 7387137.839637
+321801.907871 7387225.344648
+321809.527388 7387230.933691
+321813.848413 7387232.973341
+321820.973156 7387238.822339
+321828.337040 7387244.411382
+321834.942271 7387249.240555
+321840.533215 7387255.339510
+321844.845994 7387261.178510
+321846.371547 7387266.757554
+321847.888853 7387276.135948
+321849.397913 7387286.794122
+321850.659587 7387298.962038
+321852.176893 7387310.110128
+321854.972365 7387317.978781
+321857.512204 7387321.528173
+321865.131721 7387325.857431
+321872.000832 7387328.666950
+321880.642881 7387329.946731
+321931.761265 7387326.027402
+321962.033178 7387323.567823
+322195.508706 7387309.190286
+322250.956361 7387306.540740
+322251.236733 7387283.734646
+322246.429180 7387262.428296
+322277.690641 7387284.304549
+322301.827358 7387303.371283
+322315.812965 7387312.019801
+322323.943748 7387317.358887
+322338.432376 7387323.737794
+322363.096852 7387324.557654
+322403.033347 7387325.667464
+322415.229522 7387327.217198
+322434.583425 7387305.980836
+322503.043632 7387263.818058
+322653.669281 7387188.161017
+322776.323715 7387130.930820
+322818.808296 7387109.494492
+322837.131420 7387105.215225
+322855.190665 7387102.725652
+322871.971745 7387103.535513
+322894.863281 7387105.615157
+322907.570722 7387108.194715
+322921.036817 7387113.543798
+322931.979565 7387118.133012
+322943.161454 7387124.241966
+322954.598976 7387130.860832
+322960.948573 7387136.449875
+323054.683477 7387247.190906
+323115.639614 7387322.617986
+323132.907221 7387346.743853
+323159.352883 7387357.951934
+323178.673801 7387362.561144
+323198.250353 7387366.920397
+323221.339799 7387369.259997
+323237.667335 7387370.309817
+323251.397309 7387370.599767
+323272.507660 7387370.139846
+323314.992240 7387360.871434
+323374.257900 7387350.123275
+323380.343618 7387373.199322
+323382.520623 7387378.798363
+323382.883457 7387380.048149
+323387.946643 7387392.725977
+323393.793220 7387405.933715
+323401.660124 7387422.420891
+323421.970590 7387457.964802
+323429.590107 7387467.353194
+323437.209624 7387476.241672
+323455.747151 7387495.798322
+323495.898048 7387530.882312
+323620.416131 7387628.505590
+323660.064008 7387657.000709
+323676.828595 7387671.488228
+323701.732211 7387697.403789
+323727.130602 7387729.138353
+323789.076286 7387832.960569
+323851.747639 7387938.522487
+323889.441159 7388000.001956
+323911.887399 7388042.034756
+323924.570102 7388067.140456
+323946.406121 7388106.273753
+323967.640165 7388153.025745
+323975.070018 7388183.310557
+323979.580707 7388206.286622
+323984.577922 7388256.897952
+323989.204058 7388297.161056
+323999.957142 7388360.750163
+324000.781766 7388368.738795
+324002.620675 7388431.478048
+324007.741584 7388477.370187
+324009.481539 7388510.394531
+324009.110458 7388541.409218
+324004.137981 7388572.803840
+324002.299072 7388589.840922
+323999.998374 7388600.319127
+323992.906615 7388612.277079
+323989.979203 7388620.055747
+323987.126008 7388654.889780
+323986.763173 7388677.915836
+323988.808239 7388705.261152
+324010.891644 7388749.303608
+324026.081201 7388763.101244
+324034.360417 7388773.669434
+324099.217021 7388830.589684
+324228.369485 7388940.110924
+324317.453515 7389019.857264
+324419.129539 7389110.401755
+324497.691378 7389175.600587
+324544.043441 7389206.235339
+324506.333428 7389206.895226
+324496.660599 7389224.092281
+324498.103690 7389238.299847
+324502.630870 7389253.997158
+324522.792904 7389258.336415
+324489.370931 7389478.298737
+324470.833405 7389604.827064
+324468.268827 7389624.423708
+324458.191933 7389653.008811
+324440.907834 7389675.584944
+324430.377397 7389688.912661
+324419.343941 7389702.010418
+324405.778891 7389717.417778
+324388.478299 7389754.021509
+324383.489330 7389767.489202
+324366.510341 7389831.678207
+324359.723693 7389871.741344
+324326.977911 7389999.999375
+324327.299514 7390003.518772
+324321.518907 7390025.105074
+324313.487078 7390058.119419
+324307.203450 7390079.445766
+324291.791245 7390110.190500
+324257.124091 7390165.591010
+324170.340760 7390305.107113
+324062.075998 7390490.355381
+324000.600348 7390773.936806
+323991.463525 7390811.100441
+323962.675934 7390954.815823
+323902.519681 7390902.244828
+323730.767189 7390749.990908
+323671.996303 7390695.700208
+323611.370016 7390644.968897
+323541.103884 7390603.466006
+323508.366349 7390590.078300
+323452.580598 7390565.532504
+323398.287416 7390543.216327
+323356.017237 7390510.101999
+323314.390265 7390462.990069
+323285.462488 7390416.727993
+323273.348775 7390363.457118
+323259.107535 7390325.693586
+323243.332496 7390290.459622
+323220.878010 7390263.594223
+323201.458136 7390240.298214
+323185.757313 7390232.039628
+323123.960061 7390196.745674
+323090.249470 7390181.758241
+323059.070472 7390168.820457
+322995.706436 7390139.865417
+322925.267133 7390105.031384
+322856.872896 7390260.554744
+322798.572046 7390389.432668
+322755.221611 7390487.355895
+322739.999069 7390519.570377
+322711.079539 7390588.078642
+322690.678364 7390635.530514
+322670.310174 7390679.932908
+322641.646277 7390670.614504
+322530.198469 7390646.888569
+322444.652073 7390633.340889
+322363.896736 7390635.120584
+322317.660121 7390639.379855
+322264.521410 7390640.439673
+322148.266051 7390644.878913
+322026.708365 7390650.198002
+321933.525958 7390643.989065
+321842.132984 7390623.582561
+321789.340616 7390583.729387
+321619.608450 7390494.244715
+321555.386806 7390480.057145
+321373.722345 7390466.579454
+321220.573349 7390471.788562
+321087.479187 7390466.119533
+320954.822074 7390460.620475
+320891.309606 7390458.760793
+320876.697285 7390395.441639
+320866.422482 7390373.225445
+320858.143266 7390356.628287
+320820.251836 7390282.311017
+320813.028138 7390259.114991
+320848.330252 7390142.754922
+320917.648066 7390122.468397
+320970.052862 7390110.630425
+321044.640018 7390024.795128
+321074.120293 7390026.544828
+321070.929002 7390008.537912
+321069.106585 7389989.461180
+321068.207745 7389969.464605
+321061.841655 7389951.297717
+321040.071607 7389930.811226
+321023.843025 7389921.752778
+321002.823383 7389913.524187
+320895.968726 7389869.121793
+320769.413824 7389817.840577
+320625.327436 7389754.821372
+320564.288837 7389725.306427
+320531.073020 7389702.870270
+320419.567489 7389627.903112
+320402.027756 7389574.232305
+Region 1
+1343
+336095.858105 7355254.410980
+336145.822016 7355302.272781
+336158.793337 7355316.480348
+336178.658506 7355333.317464
+336189.749687 7355343.195771
+336198.927741 7355359.912908
+336211.412535 7355381.429222
+336223.031474 7355389.647815
+336244.735553 7355396.656614
+336262.234054 7355398.406314
+336271.577033 7355400.505955
+336283.888656 7355409.944338
+336285.587379 7355422.262228
+336281.175646 7355434.060207
+336267.165300 7355439.109342
+336249.592583 7355444.218467
+336234.543212 7355451.357244
+336212.220665 7355453.546869
+336190.780466 7355458.396039
+336168.730045 7355463.345191
+336152.353031 7355470.693932
+336140.585660 7355475.543102
+336128.669856 7355484.711531
+336110.239531 7355494.139916
+336092.930693 7355502.688452
+336076.825804 7355512.586756
+336059.022192 7355520.355426
+336026.358873 7355536.372682
+336002.362341 7355551.170147
+335980.922142 7355564.657837
+335960.224103 7355576.045886
+335944.449064 7355584.394456
+335920.155668 7355598.632018
+335904.743463 7355619.608424
+335876.582585 7355642.654477
+335858.655280 7355660.951343
+335844.009974 7355676.618659
+335828.919372 7355687.526791
+335802.902515 7355700.854508
+335781.569516 7355705.373734
+335757.383321 7355710.072929
+335730.154268 7355713.532336
+335723.013032 7355723.750586
+335720.374238 7355731.699224
+335719.813495 7355763.363800
+335718.757977 7355783.950274
+335721.710128 7355793.288675
+335725.618841 7355807.736200
+335725.453916 7355822.023753
+335722.930570 7355829.302506
+335713.711284 7355833.961708
+335703.791068 7355837.831045
+335692.493732 7355845.789682
+335683.843437 7355854.218238
+335674.327286 7355867.405979
+335650.883253 7355896.261036
+335637.037831 7355913.718046
+335623.901586 7355931.395018
+335613.305180 7355950.101814
+335603.318994 7355977.347147
+335594.371834 7356011.691264
+335591.922703 7356029.828158
+335591.452668 7356044.325674
+335591.213528 7356065.482050
+335591.592854 7356076.780115
+335590.322935 7356107.444863
+335589.622005 7356124.501941
+335589.861146 7356147.647976
+335589.110739 7356169.014316
+335587.115151 7356192.580280
+335581.788086 7356212.676837
+335573.657303 7356238.392432
+335562.780524 7356263.188185
+335563.448469 7356293.882927
+335569.361016 7356310.999995
+335574.820021 7356323.357879
+335582.530247 7356335.515796
+335590.842447 7356347.243787
+335599.022708 7356362.401191
+335598.387748 7356373.689257
+335599.253603 7356386.767017
+335599.946286 7356397.525174
+335598.420733 7356414.892200
+335593.283332 7356428.119934
+335587.692387 7356444.897060
+335579.710036 7356457.434912
+335571.150448 7356475.941742
+335559.869605 7356491.649052
+335548.786671 7356508.026247
+335535.279345 7356531.022308
+335528.179341 7356555.528110
+335523.965517 7356576.854457
+335517.104653 7356597.930847
+335511.530201 7356622.456646
+335503.547850 7356652.271539
+335493.586403 7356686.375697
+335483.657941 7356717.390384
+335475.048877 7356740.106493
+335474.883952 7356754.723989
+335479.683258 7356780.469579
+335481.967464 7356803.095704
+335479.163746 7356825.881801
+335471.362811 7356840.189350
+335468.971405 7356853.447079
+335459.694395 7356871.953909
+335454.070466 7356891.930487
+335443.894617 7356917.956029
+335437.429572 7356930.733841
+335425.596231 7356950.420468
+335415.148257 7356973.666487
+335403.974615 7357007.210741
+335397.534308 7357035.825839
+335394.392495 7357043.104592
+335386.608053 7357065.270796
+335380.481103 7357084.367525
+335374.766466 7357103.124312
+335369.224999 7357124.880585
+335363.881441 7357146.976800
+335358.851240 7357167.733245
+335350.481316 7357187.579845
+335346.069583 7357225.963270
+335342.672136 7357256.268080
+335341.806282 7357269.105881
+335343.092694 7357290.502216
+335344.981081 7357303.589974
+335350.275161 7357330.565353
+335352.600598 7357349.422123
+335355.437301 7357395.414245
+335348.675392 7357407.962096
+335341.245538 7357416.190686
+335335.803026 7357429.418420
+335330.541931 7357444.195889
+335328.084554 7357462.772707
+335328.092800 7357479.829785
+335331.440770 7357498.916516
+335333.221956 7357521.642623
+335327.424855 7357547.718157
+335323.277001 7357554.207045
+335317.529379 7357566.654913
+335313.571188 7357583.442038
+335316.960389 7357598.329487
+335318.906499 7357606.428100
+335324.381996 7357617.456211
+335334.063071 7357634.733252
+335344.552277 7357652.910138
+335354.695140 7357673.956533
+335362.867155 7357698.422342
+335372.820355 7357736.965740
+335378.840104 7357771.699791
+335383.746611 7357805.204052
+335384.826867 7357826.590388
+335387.086334 7357852.206001
+335392.198997 7357876.631817
+335396.709685 7357901.047635
+335401.822348 7357925.803394
+335404.057077 7357953.188703
+335410.019102 7357984.493341
+335414.909116 7358001.600411
+335419.230141 7358024.796438
+335421.291699 7358049.412221
+335422.767774 7358071.798387
+335422.891468 7358087.865634
+335422.157553 7358107.462278
+335421.522593 7358118.080459
+335419.980548 7358146.195643
+335415.403890 7358172.731098
+335414.241172 7358184.789032
+335413.070207 7358198.616664
+335410.373690 7358211.874393
+335405.244534 7358223.672372
+335400.535936 7358234.910447
+335394.252309 7358249.907878
+335388.719088 7358252.607416
+335380.514088 7358258.056482
+335375.285978 7358261.095962
+335370.519657 7358267.684833
+335371.674129 7358273.573824
+335376.712576 7358278.832923
+335388.356254 7358284.281990
+335401.236866 7358289.411111
+335405.986695 7358292.570570
+335407.677172 7358305.108423
+335405.813524 7358307.627991
+335404.189017 7358315.916571
+335404.741514 7358321.125679
+335412.517710 7358326.754715
+335417.077875 7358329.354270
+335424.614930 7358329.224292
+335433.248733 7358331.093972
+335445.618079 7358335.993132
+335453.872556 7358344.841617
+335456.841199 7358352.400322
+335459.075928 7358361.288799
+335455.769189 7358366.017989
+335452.792300 7358377.056099
+335456.577320 7358383.854934
+335459.809842 7358386.444491
+335464.304038 7358394.023192
+335463.232028 7358399.212304
+335460.626219 7358404.501398
+335463.034118 7358416.379363
+335472.649223 7358421.478490
+335477.687670 7358426.297664
+335482.181866 7358434.436270
+335480.516127 7358445.934300
+335478.034012 7358458.532143
+335480.507881 7358465.091019
+335488.358293 7358472.939675
+335499.672121 7358481.148269
+335506.392799 7358490.526662
+335511.414754 7358496.565628
+335519.042517 7358497.655441
+335534.190843 7358499.375147
+335535.427777 7358507.143816
+335533.415697 7358522.961106
+335528.327773 7358531.209694
+335520.551577 7358543.407604
+335515.331713 7358554.425717
+335512.618703 7358569.013218
+335510.260281 7358579.731382
+335510.928226 7358592.589180
+335519.190949 7358600.547817
+335517.343794 7358610.826056
+335508.833683 7358615.495256
+335501.972820 7358618.624720
+335487.104866 7358627.643175
+335483.460032 7358643.220507
+335482.453992 7358651.189142
+335473.432615 7358664.926789
+335461.228194 7358672.435503
+335451.984169 7358679.084364
+335443.853386 7358695.821497
+335453.353044 7358710.998897
+335452.182079 7358733.135106
+335450.475109 7358748.842415
+335447.852808 7358773.288228
+335448.520753 7358786.365988
+335447.036431 7358827.438952
+335449.065004 7358863.902706
+335451.687305 7358883.979267
+335453.864310 7358907.375260
+335451.703798 7358926.731944
+335452.511928 7358954.317219
+335454.449792 7358972.174160
+335453.427260 7358999.069553
+335448.982541 7359022.395558
+335443.474059 7359049.910845
+335438.476844 7359077.316150
+335424.854071 7359110.830410
+335416.583101 7359130.347067
+335405.458936 7359159.342100
+335396.627223 7359192.466426
+335383.655902 7359230.979829
+335364.128828 7359255.565618
+335363.601069 7359283.360857
+335379.334877 7359314.885457
+335384.233138 7359350.269396
+335388.479947 7359397.281343
+335392.462877 7359441.073842
+335397.163228 7359493.514859
+335397.897143 7359544.576113
+335405.219795 7359617.433633
+335414.092740 7359696.610071
+335415.008071 7359794.533298
+335422.619342 7359868.710592
+335435.747341 7359914.492750
+335456.478365 7359962.914455
+335476.153871 7359988.720035
+335488.572695 7360024.973825
+335481.497429 7360064.757011
+335450.747235 7360108.709482
+335408.345117 7360146.333038
+335365.555426 7360173.858323
+335326.567248 7360207.642536
+335296.633430 7360242.296600
+335228.313409 7360284.159429
+335182.332427 7360296.587300
+335109.303809 7360340.499779
+334898.909480 7360469.787633
+334843.280408 7360506.031424
+334798.107556 7360518.909219
+334770.053880 7360531.327092
+334739.905661 7360566.651041
+334702.657437 7360608.083944
+334643.952521 7360664.564269
+334584.686861 7360715.605526
+334503.898539 7360769.946218
+334296.703748 7360867.809455
+334172.696932 7360915.001372
+334088.387470 7360946.925903
+333997.250129 7360979.440334
+333920.123133 7361025.072517
+333837.570118 7361116.826801
+333794.599010 7361212.350438
+333775.814097 7361286.897669
+333748.939631 7361391.369774
+333732.595602 7361457.188500
+333712.623232 7361555.091730
+333714.157030 7361642.826702
+333717.199890 7361714.414439
+333708.706272 7361779.553282
+333685.435409 7361836.433539
+333663.838531 7361907.401382
+333654.825401 7361990.807096
+333656.680803 7362086.410720
+333659.583476 7362170.616296
+333661.471863 7362253.822044
+333659.971049 7362322.250323
+333657.497180 7362351.795262
+333639.594613 7362534.783918
+333632.585317 7362630.397540
+333620.084031 7362750.976886
+333610.205047 7362856.968730
+333598.899465 7362954.302058
+333586.802244 7363048.635899
+333584.666471 7363128.472224
+333576.007928 7363216.757102
+333575.339984 7363336.146651
+333566.450547 7363479.692063
+333575.950205 7363610.609638
+333607.475545 7363695.365120
+333710.273056 7363899.570142
+333601.917585 7363797.637602
+333411.734768 7363634.625525
+333271.870450 7363482.161640
+333102.674289 7363259.029861
+333023.180626 7363137.490679
+332933.840963 7362995.794951
+332834.185266 7362873.915827
+332754.468954 7362772.533193
+332624.574329 7362640.335837
+332484.949152 7362477.903661
+332314.854152 7362325.069840
+331887.839590 7361882.835590
+331818.612484 7361843.812275
+331736.818122 7361798.670007
+331646.249771 7361746.658916
+331565.609882 7361690.678505
+331482.858957 7361632.228517
+331383.937174 7361553.541995
+331291.818532 7361477.255063
+331213.438109 7361437.461879
+331156.605088 7361418.855066
+331100.835830 7361414.105880
+331034.816507 7361414.885746
+330979.319375 7361421.434624
+330797.795100 7361446.660303
+330725.525134 7361458.768229
+330643.203014 7361468.326592
+330588.695429 7361476.995107
+330528.704101 7361484.703787
+330482.954014 7361494.132172
+330437.269896 7361506.999968
+330381.063588 7361521.627462
+330343.807118 7361545.663345
+330296.482000 7361575.788185
+330265.896731 7361604.003352
+330230.487416 7361634.938053
+330204.544775 7361657.664160
+330154.737542 7361691.528360
+330113.737283 7361721.503225
+330067.962456 7361750.318289
+330003.724320 7361764.175916
+329949.216735 7361773.064393
+329863.645600 7361781.352973
+329782.296534 7361785.712227
+329695.917268 7361784.692401
+329624.636851 7361781.862886
+329538.059675 7361771.974580
+329492.812608 7361764.575847
+329443.335224 7361753.247788
+329393.593960 7361738.150374
+329332.769763 7361729.901787
+329279.466128 7361722.842996
+329220.398378 7361721.593210
+329163.219015 7361723.792833
+329088.260778 7361730.101752
+328997.642950 7361734.790949
+328915.461015 7361706.015878
+328879.086892 7361689.188760
+328840.923336 7361660.273713
+328809.076393 7361631.428654
+328773.856742 7361602.773562
+328752.531990 7361580.257419
+328728.007700 7361552.052251
+328697.084335 7361513.468860
+328625.696716 7361442.840957
+328592.629331 7361413.216032
+328572.953825 7361397.808671
+328546.986445 7361379.331836
+328515.642522 7361359.575220
+328484.273861 7361350.226821
+328459.394983 7361343.957895
+328441.591371 7361341.638293
+328378.812817 7361335.239389
+328335.297458 7361319.552076
+328301.578621 7361302.095066
+328273.186849 7361282.148483
+328249.825277 7361259.272401
+328239.789614 7361246.754545
+328219.347209 7361226.677984
+328200.026290 7361215.489901
+328171.766458 7361201.642273
+328163.008961 7361184.475213
+328162.901760 7361184.365232
+328163.008961 7361184.475213
+328154.457620 7361175.066825
+328151.200359 7361157.639810
+328149.328464 7361152.640666
+328140.521490 7361139.352942
+328132.918465 7361135.823547
+328084.579061 7361140.682714
+328075.623655 7361139.462923
+328055.585314 7361137.013343
+328045.434204 7361134.013857
+328026.410150 7361123.595641
+328013.166704 7361123.655631
+327997.696775 7361122.145890
+327985.022319 7361117.116751
+327982.515465 7361113.877306
+327977.963545 7361102.409270
+327972.306631 7361090.051387
+327967.062028 7361085.782118
+327957.347969 7361088.321683
+327952.746572 7361098.679909
+327941.119387 7361108.068301
+327931.891855 7361113.047448
+327922.012870 7361121.466006
+327911.845268 7361128.764756
+327902.172439 7361136.283468
+327888.689852 7361156.510003
+327865.542683 7361158.339690
+327853.635126 7361157.419848
+327838.132212 7361159.229538
+327825.680404 7361161.289185
+327803.580506 7361168.897881
+327787.351924 7361171.687404
+327769.292679 7361182.105619
+327759.133323 7361188.414538
+327745.716705 7361203.311987
+327731.153862 7361228.167729
+327721.472787 7361245.334788
+327707.215054 7361262.001934
+327691.275091 7361274.659765
+327682.072297 7361286.177792
+327656.410027 7361311.233501
+327642.910948 7361323.811346
+327628.372843 7361338.698796
+327616.250884 7361355.395936
+327609.307558 7361365.164263
+327595.857956 7361382.281331
+327587.718926 7361398.688520
+327578.070836 7361413.086054
+327561.784531 7361420.864722
+327552.647707 7361426.513754
+327534.827603 7361434.052463
+327520.586362 7361441.191240
+327458.896311 7361402.907798
+327448.266920 7361405.777306
+327397.107305 7361397.838666
+327268.103272 7361731.551504
+327265.208845 7361739.080214
+327124.453935 7362465.335813
+326951.258352 7363243.712484
+326775.687856 7363903.469474
+326611.827006 7364519.253996
+326607.192625 7364555.987704
+326627.874171 7364820.742354
+326635.304025 7364897.279243
+326703.426136 7365162.193866
+326789.137458 7365381.496301
+326879.565623 7365668.287177
+326773.007831 7366250.047527
+326661.279652 7366570.552627
+326246.098431 7367155.122495
+326169.334270 7368025.373429
+325671.896899 7369380.911238
+325613.488847 7369526.546292
+325608.021596 7369615.920983
+325585.748527 7369832.083956
+325581.237839 7370033.769409
+325573.651307 7370287.315979
+325573.469890 7370334.217945
+325574.055372 7370336.627532
+325529.971023 7370347.375691
+325513.626994 7370358.253828
+325504.820019 7370378.640336
+325502.766708 7370396.777229
+325501.645221 7370430.881388
+325495.188422 7370441.659541
+325484.938357 7370454.717305
+325472.577258 7370468.045022
+325449.166209 7370488.291554
+325436.961787 7370494.230536
+325421.813462 7370508.118158
+325415.637035 7370521.005950
+325405.073614 7370534.943563
+325389.075926 7370542.832211
+325350.524798 7370569.837586
+325338.246160 7370581.875524
+325313.862056 7370592.103772
+325297.377841 7370597.772801
+325242.614624 7370608.630941
+325218.296489 7370613.100175
+325198.241656 7370619.169136
+325153.629549 7370625.927978
+325096.301753 7370635.996253
+325062.632393 7370638.245868
+325054.344932 7370639.515650
+325004.958256 7370644.524792
+324981.901795 7370646.024535
+324897.039836 7370649.983857
+324853.606939 7370650.673739
+324806.751856 7370656.092811
+324748.269589 7370662.021795
+324720.158188 7370659.912157
+324703.278154 7370655.942837
+324664.496132 7370634.656483
+324644.408314 7370626.547872
+324622.374385 7370627.827652
+324606.863226 7370637.945919
+324592.151950 7370640.315513
+324574.628710 7370639.325683
+324545.832873 7370635.096407
+324509.532965 7370627.017791
+324482.056525 7370623.138456
+324462.999486 7370622.908495
+324434.244879 7370623.558384
+324410.908047 7370623.158452
+324368.209064 7370621.648711
+324332.791504 7370617.119487
+324312.629470 7370615.329793
+324284.394376 7370606.341333
+324264.133387 7370604.101716
+324241.711886 7370595.193242
+324215.381672 7370581.135650
+324182.833800 7370575.426628
+324161.302891 7370576.606426
+324149.799400 7370583.775198
+324115.882653 7370606.401323
+324098.153257 7370631.437034
+324095.407262 7370647.464289
+324093.659061 7370673.809776
+324105.005875 7370696.205940
+324113.953035 7370706.614157
+324124.763843 7370715.162693
+324148.818098 7370740.488355
+324165.549700 7370755.865721
+324181.308247 7370768.243600
+324186.016845 7370782.921086
+324191.682005 7370795.398949
+324203.201989 7370803.837504
+324218.358561 7370806.577034
+324234.504681 7370811.646166
+324251.359976 7370817.165221
+324258.031177 7370829.873044
+324263.440704 7370846.110263
+324262.846975 7370878.224762
+324257.940468 7370888.243046
+324249.826177 7370909.849345
+324237.959851 7370929.865916
+324194.848558 7370979.627392
+324167.207192 7371072.891417
+324161.640987 7371120.113328
+324188.556684 7371170.284734
+324217.872034 7371232.884012
+324234.496435 7371307.851171
+324233.952183 7371352.593507
+324228.237545 7371412.333274
+324210.005129 7371469.373503
+324164.197318 7371531.072935
+324072.911545 7371627.096487
+324012.136825 7371678.637658
+323971.441677 7371730.428787
+323955.881040 7371777.640700
+323974.888601 7371857.507019
+323997.120439 7371882.702704
+324011.839961 7371912.787550
+324033.494562 7371985.265136
+324022.073533 7372094.666396
+323985.946797 7372181.401539
+323940.015292 7372253.059265
+323922.500298 7372360.170918
+323933.838865 7372669.108000
+323911.755459 7372833.209890
+323880.823848 7372912.476313
+323798.996502 7373050.932596
+323746.905063 7373209.685404
+323699.307819 7373418.219684
+323479.669466 7373360.829514
+323274.527986 7373343.382502
+323129.781900 7373306.728781
+323066.417863 7373296.880468
+322895.605442 7373204.296327
+322487.012959 7373033.715546
+322287.462424 7372967.796837
+322202.212892 7372976.615326
+322101.674848 7373010.269562
+322020.573169 7373089.026071
+321843.188502 7373261.076601
+321696.018023 7373413.670463
+321630.056424 7373487.617796
+321527.168205 7373538.189134
+321080.857463 7373572.453265
+320820.070419 7373594.159547
+320515.083579 7373545.527877
+320316.052556 7373438.506209
+320192.961071 7373267.615481
+320115.883553 7373012.569168
+320090.666580 7372628.684924
+320092.150901 7372509.195391
+320124.162769 7372345.213480
+320136.631069 7372243.690870
+320110.432795 7372128.840542
+320067.008144 7371996.263252
+320018.198705 7371895.970431
+319961.283221 7371840.549924
+319851.616599 7371796.877405
+319720.996306 7371724.579789
+319698.277941 7371633.035469
+319684.259348 7371555.658723
+319697.939845 7371463.674479
+319742.271581 7371317.239562
+319756.141741 7371210.297881
+319734.643818 7371127.852003
+319682.725550 7371072.481487
+319628.415875 7371004.573119
+319545.161930 7370854.008910
+319501.135305 7370771.273082
+319436.996123 7370690.836860
+319372.609554 7370630.217243
+319305.369789 7370602.022073
+319222.866251 7370588.474393
+319107.781856 7370579.615911
+319000.572612 7370535.963388
+318926.100903 7370482.752502
+318859.735239 7370384.779284
+318763.839822 7370244.023395
+318655.459613 7370090.809639
+318572.032498 7369955.292852
+318522.926194 7369879.915763
+318418.553653 7369813.807087
+318293.573781 7369789.861188
+318188.607511 7369771.154393
+317951.561365 7369700.836438
+317804.440364 7369654.234420
+317734.850424 7369610.931837
+317633.685666 7369485.163380
+317606.794708 7369434.971978
+317565.225459 7369352.266145
+317519.285708 7369219.768840
+317485.517394 7369117.216406
+317484.560831 7368998.796691
+317479.167796 7368925.289282
+317481.699389 7368821.976978
+317471.597756 7368733.462140
+317445.325266 7368634.769045
+317433.772296 7368556.202503
+317439.569397 7368492.803363
+317457.966737 7368424.475067
+317487.578951 7368355.176937
+317514.502894 7368305.665418
+317542.531832 7368273.680896
+317656.164891 7368194.144520
+317686.725421 7368154.761266
+317702.170611 7368126.266147
+317705.040300 7368092.741890
+317705.592797 7368049.109364
+317687.484075 7367997.818149
+317675.337377 7367966.543506
+317640.892872 7367917.591891
+317527.952497 7367837.745568
+317462.296008 7367782.085102
+317433.846512 7367750.600495
+317429.121422 7367729.384130
+317433.063121 7367715.696474
+317437.013065 7367702.128798
+317440.888793 7367693.420290
+317452.285084 7367678.612826
+317457.537933 7367666.274940
+317458.840838 7367660.086000
+317452.680903 7367647.278194
+317449.646290 7367637.599851
+317439.569397 7367628.501410
+317426.837216 7367620.032860
+317417.378790 7367610.054570
+317412.719670 7367599.806325
+317411.210609 7367589.708055
+317410.501434 7367581.609442
+317405.825821 7367572.251045
+317398.033133 7367560.073131
+317381.763320 7367540.706448
+317368.660059 7367529.138430
+317357.140075 7367521.679707
+317335.864800 7367511.331480
+317303.349912 7367495.084263
+317287.071853 7367484.796025
+317268.385895 7367471.048380
+317259.958247 7367460.970106
+317250.549298 7367455.421057
+317243.638956 7367453.561375
+317233.347661 7367453.541379
+317219.263099 7367454.471220
+317203.347873 7367455.711007
+317191.761919 7367453.241430
+317186.212206 7367448.852182
+317181.825211 7367441.373463
+317178.988508 7367431.925082
+317177.413478 7367419.167267
+317177.405232 7367387.932617
+317178.708136 7367373.545082
+317174.914870 7367358.877594
+317169.645529 7367340.090812
+317158.628565 7367325.113377
+317144.007998 7367304.096977
+317128.323667 7367287.289856
+317120.217622 7367275.661848
+317117.067562 7367266.983335
+317117.446889 7367261.004359
+317119.648632 7367256.055207
+317121.174185 7367248.206551
+317118.403452 7367241.967620
+317109.637708 7367233.769024
+317098.002277 7367226.650243
+317089.302504 7367221.661098
+317082.144775 7367215.702119
+317073.939776 7367203.194261
+317063.318631 7367180.688116
+317042.785517 7367136.005770
+317019.951704 7367096.062612
+317003.038685 7367071.926746
+316993.060746 7367054.409747
+316988.632520 7367041.941882
+316986.488500 7367034.723119
+316987.395585 7367026.974446
+316990.545645 7367019.815672
+316996.482931 7367009.817385
+317011.754951 7366994.719971
+317024.025342 7366983.801841
+317035.908160 7366970.994035
+317043.403984 7366958.236220
+317046.751953 7366943.548736
+317047.106541 7366931.920728
+317046.133486 7366919.722817
+317043.717341 7366909.504567
+317033.722909 7366886.008592
+317026.227085 7366865.972024
+317015.902805 7366836.597056
+317006.155760 7366816.980416
+316997.398263 7366808.561858
+316979.594651 7366797.923680
+316960.554104 7366788.495295
+316948.052819 7366786.005722
+316936.854438 7366784.755936
+316923.718192 7366783.816097
+316912.132238 7366781.346520
+316896.159289 7366771.278244
+316880.903763 7366760.340118
+316865.252417 7366756.600759
+316852.454267 7366753.781241
+316843.342182 7366748.572134
+316823.328580 7366735.694340
+316813.375380 7366732.574874
+316802.704757 7366730.115295
+316794.301848 7366726.015997
+316787.473969 7366717.627434
+316783.416824 7366708.489000
+316779.895683 7366696.591038
+316774.337724 7366676.694446
+316766.833654 7366665.746321
+316755.552811 7366655.078148
+316731.490310 7366639.820762
+316714.024793 7366626.972963
+316703.370663 7366615.094997
+316695.907824 7366600.717460
+316690.589006 7366594.438535
+316681.493413 7366588.239597
+316661.512796 7366580.120988
+316649.019757 7366577.301471
+316631.793381 7366576.971527
+316603.995338 7366575.401796
+316588.038881 7366571.982382
+316578.423776 7366566.653295
+316573.706932 7366560.394367
+316572.107164 7366550.076134
+316571.810299 7366541.317635
+316574.012043 7366528.829774
+316578.712394 7366503.194165
+316578.069188 7366489.786461
+316573.434807 7366477.868503
+316565.287531 7366461.041385
+316557.742230 7366445.434059
+316555.540486 7366433.896035
+316557.132009 7366421.288195
+316559.919235 7366410.350068
+316564.611340 7366401.661556
+316571.843284 7366394.442793
+316592.763971 7366375.985954
+316597.431338 7366369.517062
+316599.666066 7366362.008349
+316599.657820 7366354.479638
+316598.660026 7366345.051253
+316591.461067 7366333.883166
+316579.602987 7366320.995374
+316563.036310 7366301.288749
+316555.936305 7366290.670568
+316549.941296 7366273.213558
+316550.922597 7366260.035816
+316552.464642 7366250.977367
+316557.791707 7366240.739121
+316566.161631 7366231.660676
+316571.859777 7366223.862012
+316583.058158 7366201.295877
+316588.706826 7366189.737857
+316591.180695 7366179.139672
+316588.962459 7366169.141385
+316583.742595 7366163.202402
+316576.510651 7366162.562512
+316570.276500 7366164.472185
+316563.687762 7366169.151383
+316555.837351 7366177.909883
+316544.614231 7366186.968331
+316537.431764 7366190.417741
+316531.214106 7366190.447735
+316523.726528 7366186.038491
+316518.119092 7366178.539775
+316513.097137 7366164.522176
+316512.453931 7366151.004492
+316510.524313 7366134.477323
+316505.856947 7366117.020313
+316497.173666 7366102.622779
+316483.089104 7366087.935295
+316465.532879 7366073.867705
+316455.893035 7366062.889585
+316451.497794 7366047.882156
+316451.225669 7366029.155363
+316453.377935 7366011.678357
+316451.539025 7365987.952421
+316446.517071 7365974.484728
+316436.473162 7365954.758107
+316428.416595 7365938.810839
+316422.099982 7365930.982180
+316417.127505 7365929.472438
+316420.665138 7365899.617552
+316428.127977 7365889.409301
+316436.250514 7365884.190195
+316449.122880 7365873.502025
+316466.390487 7365869.842652
+316478.611401 7365862.913839
+316487.096772 7365852.495624
+316496.522214 7365848.516305
+316511.225243 7365846.156709
+316520.774378 7365840.517675
+316534.149764 7365822.740720
+316544.078226 7365819.551267
+316558.797747 7365815.741919
+316568.816918 7365805.243717
+316580.716228 7365791.216120
+316593.976167 7365782.077686
+316598.767227 7365766.410369
+316601.719378 7365750.053171
+316613.099176 7365736.795442
+316627.587803 7365727.896966
+316636.823582 7365722.247934
+316649.662963 7365706.460638
+316656.449611 7365693.702823
+316669.000374 7365684.774353
+316678.013504 7365672.926382
+316683.785865 7365659.928609
+316693.359739 7365644.431263
+316706.578447 7365638.182333
+316726.897159 7365635.222840
+316739.942696 7365627.304197
+316755.503333 7365621.635168
+316765.637951 7365617.995791
+316779.318447 7365616.176103
+316801.443084 7365615.676189
+316809.046109 7365610.457083
+316822.429741 7365599.768913
+316832.341710 7365597.569290
+316845.288293 7365597.179357
+316868.369492 7365593.489989
+316887.245114 7365583.531695
+316900.983334 7365577.392746
+316917.838630 7365565.974702
+316933.267327 7365555.096565
+316952.629477 7365546.698004
+316971.645285 7365542.178778
+316992.541233 7365533.580251
+317017.881900 7365536.449759
+317029.278191 7365537.589564
+317046.100501 7365545.558199
+317057.735933 7365551.797130
+317073.040937 7365558.745940
+317089.467428 7365564.824899
+317112.194040 7365572.873520
+317128.768963 7365584.151588
+317146.094294 7365592.240203
+317169.422881 7365592.980076
+317216.459380 7365580.172270
+317267.618995 7365556.226372
+317315.076052 7365542.538716
+317387.593405 7365530.050855
+317487.611936 7365526.221511
+317636.316214 7365532.530431
+317710.021023 7365522.492150
+317797.604239 7365495.016856
+317856.309155 7365462.532421
+317902.545770 7365432.537559
+317950.027566 7365408.771629
+317993.773820 7365390.044837
+318037.520073 7365380.076545
+318105.007225 7365386.245488
+318137.563343 7365382.556120
+318165.089261 7365365.069115
+318190.025863 7365343.782761
+318210.031218 7365324.975983
+318223.744700 7365320.056826
+318266.847748 7365320.816695
+318321.841860 7365315.417620
+318359.733290 7365308.808752
+318393.765483 7365301.150064
+318432.382582 7365292.991462
+318480.235458 7365280.523597
+318515.141752 7365268.335685
+318558.830282 7365253.928153
+318601.125199 7365237.960888
+318609.824973 7365234.851420
+318634.481202 7365210.905522
+318648.095729 7365197.457826
+318666.295160 7365176.971335
+318681.476471 7365160.984073
+318700.203660 7365146.266594
+318732.866980 7365125.970071
+318755.370943 7365111.072623
+318782.501042 7365092.695770
+318804.683403 7365078.908132
+318834.856361 7365062.560932
+318857.310847 7365050.992914
+318874.380544 7365038.795003
+318896.653613 7365026.447118
+318916.667215 7365006.980453
+318953.989655 7364980.425001
+318972.180840 7364968.247087
+318994.371446 7364953.899545
+319016.166234 7364938.562172
+319035.734539 7364929.943648
+319054.915272 7364919.995352
+319074.211451 7364917.245823
+319095.033184 7364914.516291
+319109.480580 7364908.267361
+319126.665725 7364895.189601
+319134.623337 7364885.881196
+319148.015216 7364874.743104
+319161.819406 7364862.515198
+319218.594704 7364820.802343
+319232.200984 7364832.820285
+319249.493330 7364843.338483
+319262.365696 7364848.817545
+319275.906007 7364858.295921
+319287.830056 7364858.215935
+319301.832156 7364854.626549
+319313.055276 7364845.358137
+319328.508712 7364832.140401
+319334.198611 7364817.372931
+319344.061103 7364802.875414
+319349.305706 7364790.757490
+319358.566223 7364775.700069
+319369.063674 7364766.971564
+319388.953583 7364757.363210
+319407.903421 7364749.514554
+319418.656506 7364737.346638
+319425.995651 7364721.049430
+319433.400766 7364699.103189
+319436.262208 7364674.207454
+319442.933409 7364661.889564
+319464.769427 7364643.002799
+319494.241456 7364633.514424
+319518.823469 7364615.097579
+319526.203846 7364611.868132
+319537.501182 7364604.369416
+319545.623719 7364590.621771
+319556.879824 7364578.803795
+319571.854979 7364571.235092
+319584.315033 7364568.735520
+319599.974625 7364563.166474
+319629.924935 7364547.259199
+319648.412984 7364535.861151
+319663.190229 7364527.622562
+319673.728912 7364515.904570
+319678.074675 7364510.425508
+319687.821720 7364505.556342
+319705.419176 7364491.598733
+319720.559256 7364478.390995
+319747.153350 7364462.323747
+319761.947087 7364452.655404
+319779.280664 7364444.226847
+319794.206342 7364431.788978
+319813.345843 7364417.181480
+319827.446897 7364405.953403
+319835.231339 7364394.415380
+319843.370369 7364387.096633
+319851.204288 7364379.997849
+319861.248197 7364367.489992
+319873.691759 7364350.032982
+319888.716391 7364330.066402
+319901.102230 7364316.928652
+319918.922334 7364293.892598
+319930.005268 7364279.405080
+319941.607715 7364264.377654
+319949.548835 7364256.169060
+319962.371723 7364241.481576
+319970.197396 7364226.634119
+319977.990084 7364214.656171
+319986.533179 7364199.588752
+319992.998224 7364188.030731
+320002.605083 7364169.433917
+320017.225650 7364156.986049
+320036.150749 7364143.158418
+320052.973059 7364133.730033
+320077.489103 7364121.192180
+320103.563684 7364105.784819
+320115.265086 7364098.846008
+320137.299014 7364080.179205
+320163.233409 7364055.183487
+320184.846780 7364034.577017
+320210.162708 7364014.180510
+320229.129038 7363997.023449
+320254.197580 7363980.616260
+320279.381568 7363954.450741
+320299.337446 7363939.193355
+320311.154295 7363931.814619
+320326.401575 7363926.245573
+320341.525162 7363914.797534
+320353.012161 7363908.628590
+320376.827276 7363886.442391
+320397.088264 7363863.316352
+320401.219626 7363858.827121
+320418.742866 7363842.539911
+320427.879690 7363820.833629
+320450.045558 7363791.318685
+320455.941612 7363768.462600
+320461.342893 7363743.716838
+320464.105381 7363726.359811
+320468.657300 7363704.263596
+320470.727104 7363685.016893
+320472.178441 7363667.199945
+320469.308752 7363652.212512
+320464.608401 7363628.676544
+320457.005376 7363608.639976
+320454.910834 7363596.762010
+320454.820125 7363579.814913
+320452.239055 7363566.157253
+320447.637658 7363551.039842
+320442.665181 7363541.341503
+320435.969242 7363514.226148
+320436.769126 7363490.760167
+320439.053332 7363470.853577
+320440.916980 7363460.235396
+320442.384809 7363448.957328
+320442.079699 7363432.780099
+320439.490382 7363419.352399
+320436.092935 7363405.684740
+320431.136951 7363394.766610
+320423.237062 7363382.818657
+320416.607092 7363366.561442
+320407.099188 7363353.373701
+320395.216370 7363333.727066
+320386.071300 7363315.450196
+320381.115316 7363304.092142
+320379.466069 7363280.816129
+320376.101607 7363264.598907
+320364.309497 7363237.983466
+320349.548745 7363220.626439
+320339.513082 7363208.098585
+320329.337233 7363198.890162
+320317.710048 7363191.981346
+320274.664724 7363170.954947
+320253.372957 7363154.297800
+320234.975616 7363142.219869
+320214.261085 7363120.253632
+320198.271643 7363103.436512
+320187.271172 7363086.689381
+320176.584057 7363061.303729
+320181.210192 7363033.218540
+320200.745513 7362994.585158
+320208.538201 7362974.308631
+320228.840420 7362963.920410
+320242.430209 7362968.969545
+320261.116167 7362982.267268
+320289.120366 7362991.925613
+320328.801228 7362996.514827
+320367.607990 7362997.324688
+320396.758415 7362988.166257
+320414.223932 7362976.638232
+320436.109428 7362962.070727
+320451.364954 7362948.303085
+320469.209798 7362930.476139
+320476.936516 7362915.508703
+320485.603304 7362890.243031
+320491.367419 7362869.276622
+320494.294831 7362838.851833
+320495.185424 7362808.067107
+320487.755570 7362774.632834
+320477.703415 7362747.487483
+320474.108059 7362733.039958
+320464.732094 7362700.355557
+320457.236271 7362680.988874
+320454.135688 7362659.572542
+320453.533713 7362642.625445
+320452.882261 7362621.239109
+320445.460653 7362603.202198
+320440.438699 7362589.514543
+320433.264478 7362568.598125
+320426.766448 7362550.131289
+320429.759830 7362530.784603
+320439.811985 7362508.868357
+320448.280864 7362491.581318
+320457.112577 7362469.655074
+320460.138944 7362447.318899
+320455.438592 7362415.694317
+320440.183066 7362380.830288
+320421.563077 7362337.397728
+320408.921605 7362314.091720
+320391.728214 7362287.076348
+320373.726693 7362260.270939
+320363.196256 7362246.623277
+320350.092996 7362226.966644
+320339.504836 7362202.020917
+320338.168946 7362170.216365
+320331.390545 7362141.441294
+320320.159179 7362118.925150
+320304.804697 7362100.018389
+320291.553004 7362092.429689
+320266.979237 7362077.502246
+320245.728701 7362066.494131
+320226.193380 7362064.034553
+320203.549231 7362066.304164
+320184.615885 7362064.964393
+320041.007779 7362028.610620
+320022.692900 7362018.302386
+320016.582444 7362009.703859
+320000.873374 7361994.996378
+319972.448617 7361986.777786
+319946.555453 7361996.306154
+319886.737296 7362021.701804
+319859.302086 7362024.131388
+319841.267580 7362023.791446
+319827.883948 7362018.752309
+319812.793346 7362011.803499
+319796.416332 7362009.503893
+319773.252670 7362012.203431
+319753.676118 7362013.843150
+319727.634522 7362010.303756
+319708.965055 7362004.304784
+319692.332408 7361990.147209
+319676.747032 7361981.418704
+319662.316129 7361970.830518
+319630.683588 7361966.331288
+319599.314927 7361973.470066
+319578.806551 7361983.848288
+319557.151949 7361988.237536
+319539.554493 7361994.106531
+319526.302800 7361995.046370
+319502.141345 7361987.987579
+319490.967702 7361985.298039
+319471.976633 7361971.990319
+319453.818433 7361957.812747
+319433.639907 7361950.024082
+319413.939662 7361944.794977
+319394.214678 7361941.885476
+319378.192252 7361943.575186
+319355.267731 7361951.923756
+319340.135897 7361956.612953
+319320.452145 7361966.001345
+319300.826116 7361971.400420
+319272.863148 7361975.039797
+319248.858370 7361979.609014
+319226.502839 7361983.648322
+319202.976343 7361990.887082
+319186.236495 7362001.645239
+319169.043104 7362023.691463
+319156.789205 7362042.368264
+319152.616612 7362049.737002
+319145.417653 7362063.824589
+319141.038905 7362079.281941
+319129.716830 7362097.188874
+319116.522861 7362108.986853
+319106.429475 7362117.835337
+319074.318652 7362127.293717
+319036.509685 7362127.923609
+319013.337777 7362131.732957
+318981.655759 7362131.113063
+318960.726825 7362134.952405
+318941.768741 7362143.350966
+318916.815647 7362150.789692
+318896.208317 7362152.639375
+318875.642217 7362151.719533
+318847.547310 7362149.589898
+318823.501301 7362149.619893
+318801.690021 7362150.119807
+318775.673163 7362153.339256
+318755.709039 7362152.869336
+318733.386493 7362153.699194
+318720.654312 7362153.199280
+318720.242001 7362137.252011
+318719.483348 7362124.724157
+318715.690082 7362102.627942
+318712.605991 7362080.441742
+318714.016097 7362057.085743
+318714.642810 7362031.840067
+318717.207388 7362005.734539
+318719.837936 7361975.299752
+318725.766975 7361948.904273
+318730.854900 7361933.456919
+318736.099502 7361913.150398
+318743.949914 7361880.565979
+318746.737140 7361853.130679
+318750.794285 7361830.584541
+318757.869551 7361818.826555
+318778.897440 7361798.929963
+318791.588388 7361786.572079
+318797.665860 7361773.134381
+318806.678991 7361753.087815
+318814.471679 7361732.581328
+318821.909779 7361716.394100
+318833.165883 7361688.178933
+318842.393416 7361659.613826
+318839.482496 7361631.658615
+318827.393522 7361604.153326
+318810.546473 7361582.896967
+318795.373408 7361557.891250
+318790.854474 7361520.177710
+318786.624158 7361492.432463
+318779.276766 7361452.459310
+318771.624264 7361421.014696
+318764.400566 7361388.140327
+318768.837038 7361359.285270
+318785.106851 7361345.537625
+318802.390951 7361331.799978
+318809.960990 7361321.591726
+318812.838925 7361294.926294
+318807.825217 7361280.468770
+318800.156222 7361258.662506
+318795.892921 7361241.105513
+318791.703836 7361225.438197
+318787.069454 7361205.221660
+318782.039253 7361192.193891
+318781.148660 7361173.797042
+318781.198138 7361145.331918
+318784.191520 7361125.985232
+318794.070504 7361102.299289
+318806.514066 7361076.313740
+318816.508498 7361059.376641
+318826.173080 7361044.549181
+318846.128958 7361013.224547
+318859.133264 7360999.656871
+318871.824213 7360986.749082
+318884.572885 7360969.622016
+318896.925739 7360951.285157
+318907.777778 7360930.598700
+318913.863497 7360916.601098
+318923.709496 7360895.124776
+318938.140400 7360873.598464
+318958.755976 7360854.361759
+318977.408950 7360837.654620
+318986.669467 7360830.015929
+318998.849150 7360817.648047
+319012.875988 7360804.090370
+319035.610846 7360786.213432
+319050.379845 7360770.336151
+319064.769517 7360760.327866
+319080.371386 7360742.800868
+319097.721455 7360723.744132
+319108.524017 7360707.376936
+319113.578957 7360693.929239
+319119.771876 7360687.690308
+319119.615197 7360686.810459
+319119.615197 7360583.948078
+319126.946096 7359466.359511
+319136.082920 7359463.729961
+319180.274470 7359446.332941
+319248.041993 7359416.508050
+319283.269891 7359412.488738
+319292.332498 7359411.298942
+319298.376985 7359408.559411
+319350.262269 7359362.377322
+319386.562176 7359347.979788
+319389.918392 7359336.111821
+319398.882044 7359313.885628
+319407.293200 7359298.008348
+319414.937456 7359284.140723
+319423.290887 7359276.612013
+319433.656399 7359267.833517
+319454.568840 7359261.414616
+319465.387895 7359260.494774
+319484.238778 7359260.644748
+319498.529496 7359266.573732
+319511.047274 7359272.502717
+319518.839962 7359273.322576
+319529.659016 7359271.632866
+319548.048111 7359266.213794
+319573.232099 7359261.354626
+319593.352902 7359260.244816
+319614.958026 7359261.434613
+319662.893365 7359272.192770
+319680.226942 7359273.342573
+319698.071785 7359275.002289
+319711.900714 7359274.102443
+319724.748341 7359269.903162
+319743.409561 7359262.204481
+319770.399474 7359250.506485
+319806.419009 7359239.908300
+319834.109852 7359235.069129
+319864.324041 7359229.230129
+319902.957631 7359239.408386
+319925.552303 7359244.147574
+319943.867182 7359248.856767
+319955.708769 7359252.936068
+319974.386481 7359269.613212
+319987.803099 7359291.999377
+319998.490214 7359307.786673
+320181.952353 7359475.527940
+320357.102292 7359526.609191
+320430.089679 7359519.310441
+321650.193720 7359181.658278
+323030.785901 7358765.929488
+323692.084121 7358570.502963
+323836.187002 7358520.431540
+324813.216901 7358187.338596
+325088.517311 7358098.433824
+326572.937783 7357617.596187
+328059.098209 7357476.850296
+330702.765538 7357474.340726
+332084.108126 7357442.346206
+332089.286759 7357391.804863
+332097.062954 7357342.563298
+331836.811915 7355681.047900
+332066.601378 7355329.898049
+332270.225552 7355060.754151
+332502.777502 7354836.182618
+332741.101814 7354236.195391
+336095.858105 7355254.410980
+Region 1
+350
+331851.094387 7373867.232772
+331905.890589 7373687.333587
+332003.872302 7373405.931788
+332079.778855 7373207.995693
+332124.366224 7373029.096337
+332115.254139 7372873.592973
+332107.296527 7372653.760628
+332128.563555 7372428.399231
+332141.485399 7372386.906338
+332157.680996 7372352.532226
+332206.350249 7372226.063889
+332234.263740 7372166.244136
+332272.072707 7372061.682046
+332304.876213 7371966.588335
+332331.659970 7371880.733041
+332360.076481 7371786.359206
+332401.645730 7371674.088437
+332456.466671 7371543.700772
+332511.114441 7371446.097490
+332565.514825 7371369.970530
+332623.527058 7371298.422786
+332689.406194 7371208.478192
+332749.620170 7371131.641354
+332820.983050 7371042.646598
+332890.647207 7370959.930766
+332966.405328 7370870.096154
+333112.487304 7370718.722083
+333143.146789 7370676.429327
+333208.869248 7370599.432516
+333269.561505 7370525.155239
+333343.967244 7370445.818829
+333418.010149 7370362.613081
+333531.461790 7370238.534335
+333617.560685 7370134.972074
+333694.902082 7370039.508426
+333777.331403 7369944.974619
+333864.617755 7369844.081901
+333942.750790 7369759.476393
+334054.916019 7369613.571385
+334146.704813 7369502.090481
+334237.528797 7369403.227415
+334316.016420 7369305.114221
+334407.046561 7369197.282692
+334511.064514 7369005.205593
+334580.951319 7368847.952529
+334622.611276 7368743.210470
+334653.138822 7368640.448073
+334672.187615 7368507.430857
+334694.394714 7368320.612857
+334699.441407 7368244.695861
+334697.165447 7368171.658372
+334691.698196 7368119.897238
+334685.793895 7368048.059543
+334683.905508 7367980.801064
+334686.651503 7367919.141626
+334686.766950 7367837.635587
+334681.456378 7367678.082917
+334668.212931 7367454.761170
+334662.366354 7367208.153412
+334666.852303 7366949.367739
+334665.392720 7366676.114545
+334659.447188 7366286.961204
+334655.587952 7366009.688698
+334653.097591 7365906.766327
+334652.586324 7365799.884635
+334658.655550 7365714.779213
+334661.071696 7365548.007780
+334647.490154 7365390.254801
+334610.604764 7365194.238377
+334588.760499 7365090.976065
+334564.524827 7364965.107625
+334545.228647 7364878.942384
+334510.949067 7364811.643912
+334461.859256 7364756.153417
+334384.336441 7364692.794270
+334286.387714 7364597.310625
+334200.800086 7364508.715801
+334084.676666 7364363.290711
+333966.895754 7364212.526535
+333846.179183 7364068.701171
+333710.273056 7363899.570142
+333601.917585 7363797.637602
+333411.734768 7363634.625525
+333271.870450 7363482.161640
+333102.674289 7363259.029861
+333023.180626 7363137.490679
+332933.840963 7362995.794951
+332834.185266 7362873.915827
+332754.468954 7362772.533193
+332624.574329 7362640.335837
+332484.949152 7362477.903661
+332314.854152 7362325.069840
+331887.839590 7361882.835590
+331818.612484 7361843.812275
+331736.818122 7361798.670007
+331646.249771 7361746.658916
+331565.609882 7361690.678505
+331482.858957 7361632.228517
+331383.937174 7361553.541995
+331291.818532 7361477.255063
+331213.438109 7361437.461879
+331156.605088 7361418.855066
+331100.835830 7361414.105880
+331034.816507 7361414.885746
+330979.319375 7361421.434624
+330797.795100 7361446.660303
+330725.525134 7361458.768229
+330643.203014 7361468.326592
+330588.695429 7361476.995107
+330528.704101 7361484.703787
+330482.954014 7361494.132172
+330437.269896 7361506.999968
+330381.063588 7361521.627462
+330343.807118 7361545.663345
+330296.482000 7361575.788185
+330265.896731 7361604.003352
+330230.487416 7361634.938053
+330204.544775 7361657.664160
+330154.737542 7361691.528360
+330113.737283 7361721.503225
+330067.962456 7361750.318289
+330003.724320 7361764.175916
+329949.216735 7361773.064393
+329863.645600 7361781.352973
+329782.296534 7361785.712227
+329695.917268 7361784.692401
+329624.636851 7361781.862886
+329538.059675 7361771.974580
+329492.812608 7361764.575847
+329443.335224 7361753.247788
+329393.593960 7361738.150374
+329332.769763 7361729.901787
+329279.466128 7361722.842996
+329220.398378 7361721.593210
+329163.219015 7361723.792833
+329088.260778 7361730.101752
+328997.642950 7361734.790949
+328915.461015 7361706.015878
+328879.086892 7361689.188760
+328840.923336 7361660.273713
+328809.076393 7361631.428654
+328773.856742 7361602.773562
+328752.531990 7361580.257419
+328728.007700 7361552.052251
+328697.084335 7361513.468860
+328625.696716 7361442.840957
+328592.629331 7361413.216032
+328572.953825 7361397.808671
+328546.986445 7361379.331836
+328515.642522 7361359.575220
+328484.273861 7361350.226821
+328459.394983 7361343.957895
+328441.591371 7361341.638293
+328378.812817 7361335.239389
+328335.297458 7361319.552076
+328301.578621 7361302.095066
+328273.186849 7361282.148483
+328249.825277 7361259.272401
+328239.789614 7361246.754545
+328219.347209 7361226.677984
+328200.026290 7361215.489901
+328171.766458 7361201.642273
+328163.008961 7361184.475213
+328154.457620 7361175.066825
+328151.200359 7361157.639810
+328149.328464 7361152.640666
+328140.521490 7361139.352942
+328132.918465 7361135.823547
+328084.579061 7361140.682714
+328075.623655 7361139.462923
+328055.585314 7361137.013343
+328045.434204 7361134.013857
+328026.410150 7361123.595641
+328013.166704 7361123.655631
+327997.696775 7361122.145890
+327985.022319 7361117.116751
+327982.515465 7361113.877306
+327977.963545 7361102.409270
+327972.306631 7361090.051387
+327967.062028 7361085.782118
+327957.347969 7361088.321683
+327952.746572 7361098.679909
+327941.119387 7361108.068301
+327931.891855 7361113.047448
+327922.012870 7361121.466006
+327911.845268 7361128.764756
+327902.172439 7361136.283468
+327888.689852 7361156.510003
+327865.542683 7361158.339690
+327853.635126 7361157.419848
+327838.132212 7361159.229538
+327825.680404 7361161.289185
+327803.580506 7361168.897881
+327787.351924 7361171.687404
+327769.292679 7361182.105619
+327759.133323 7361188.414538
+327745.716705 7361203.311987
+327731.153862 7361228.167729
+327721.472787 7361245.334788
+327707.215054 7361262.001934
+327691.275091 7361274.659765
+327682.072297 7361286.177792
+327656.410027 7361311.233501
+327642.910948 7361323.811346
+327628.372843 7361338.698796
+327616.250884 7361355.395936
+327609.307558 7361365.164263
+327595.857956 7361382.281331
+327587.718926 7361398.688520
+327578.070836 7361413.086054
+327561.784531 7361420.864722
+327552.647707 7361426.513754
+327534.827603 7361434.052463
+327520.586362 7361441.191240
+327458.896311 7361402.907798
+327448.266920 7361405.777306
+327397.107305 7361397.838666
+327268.103272 7361731.551504
+327265.208845 7361739.080214
+327124.453935 7362465.335813
+326951.258352 7363243.712484
+326775.687856 7363903.469474
+326611.827006 7364519.253996
+326607.192625 7364555.987704
+326627.874171 7364820.742354
+326635.304025 7364897.279243
+326703.426136 7365162.193866
+326789.137458 7365381.496301
+326879.565623 7365668.287177
+326773.007831 7366250.047527
+326661.279652 7366570.552627
+326246.098431 7367155.122495
+326169.334270 7368025.373429
+325671.896899 7369380.911238
+325613.488847 7369526.546292
+325608.021596 7369615.920983
+325585.748527 7369832.083956
+325581.237839 7370033.769409
+325573.651307 7370287.315979
+325573.469890 7370334.217945
+325574.055372 7370336.627532
+325552.730619 7370778.031924
+325562.403448 7371152.427793
+325606.792908 7371411.253459
+325770.241445 7371841.869698
+325821.879342 7371982.275648
+325896.829332 7372167.483923
+325983.068412 7372347.063163
+326077.867080 7372527.082327
+326165.969808 7372680.406064
+326286.925519 7372889.080322
+326299.707176 7372903.227897
+326338.217074 7372955.578930
+326437.848032 7373096.694758
+326532.052971 7373234.011237
+326575.411652 7373293.091117
+326700.935775 7373459.772566
+326746.067395 7373527.950888
+326840.923786 7373671.666270
+326939.218856 7373812.612128
+327282.163096 7374258.605733
+327372.104733 7374380.064928
+327473.046843 7374515.401746
+327497.348484 7374570.662281
+327544.063381 7374666.105932
+327562.485460 7374789.494797
+327572.405676 7374941.458766
+327574.681635 7375076.065710
+327636.940677 7375047.500602
+327649.854274 7375039.961894
+327705.986366 7374988.900640
+327802.879576 7374907.264624
+327826.983308 7374876.919821
+327830.059152 7374861.742421
+327890.001003 7374710.238372
+327893.315988 7374705.899116
+327914.912866 7374660.676862
+327947.081411 7374599.537335
+327965.701400 7374564.233382
+327960.176426 7374520.060948
+327950.586059 7374495.325185
+327935.231578 7374442.034313
+327917.518675 7374391.852909
+327899.863495 7374337.832162
+327893.588113 7374292.899859
+327886.974636 7374246.407822
+327885.605762 7374190.457406
+327888.186832 7374153.543729
+327889.613430 7374124.598687
+327914.137720 7374004.559249
+327948.153421 7373904.876324
+327960.019747 7373870.072285
+327966.352852 7373858.204318
+327990.877142 7373839.217570
+328041.360566 7373783.177170
+328094.573493 7373760.781006
+328131.549591 7373738.874758
+328205.848129 7373799.134436
+328236.293213 7373820.740735
+328306.031585 7373871.811987
+328341.383176 7373903.246603
+328369.873903 7373926.812566
+328369.865657 7373926.812566
+328381.649520 7373968.065500
+328428.628296 7374028.825092
+328455.453285 7374086.315245
+328466.956776 7374149.564411
+328476.209047 7374162.982112
+328500.436473 7374232.820150
+328545.485631 7374303.468048
+328582.519453 7374344.770974
+328616.782541 7374378.845137
+328674.110336 7374420.288038
+328698.139853 7374431.646093
+328733.343011 7374446.903479
+328785.302510 7374467.889885
+328808.103338 7374480.017807
+328857.473521 7374503.853724
+328901.887719 7374524.760143
+328977.835504 7374560.873957
+329049.973529 7374600.607151
+329118.408997 7374642.170032
+329205.373746 7374695.030977
+329299.941519 7374725.825702
+329409.476201 7374758.570094
+329498.873587 7374761.389611
+329554.700569 7374765.808854
+329642.061136 7374776.137085
+329749.987803 7374789.584781
+329784.325107 7374878.929477
+329829.506205 7374999.848765
+329881.383242 7375097.821983
+329918.738667 7375173.019102
+329979.950437 7375266.433101
+330030.260690 7375341.120308
+330220.690894 7375624.781719
+330462.791980 7375946.156671
+330939.391126 7375502.262706
+331209.339733 7375201.484226
+331372.046110 7375002.798260
+331443.450221 7374903.835211
+331530.711834 7374774.047443
+331634.944189 7374569.692447
+331652.731308 7374513.082143
+331688.000437 7374417.678485
+331719.162942 7374324.344473
+331752.683870 7374211.873738
+331786.534647 7374106.711751
+331813.574037 7374016.647178
+331851.094387 7373867.232772
+Region 1
+514
+333270.245942 7379020.010148
+333285.014941 7379012.751391
+333306.669543 7379001.043396
+333315.905321 7378996.054251
+333335.778737 7378988.855484
+333354.365741 7378986.635864
+333381.504086 7378986.065962
+333404.370884 7378984.216279
+333425.192616 7378982.576560
+333448.628404 7378975.867709
+333462.490317 7378967.939067
+333486.693004 7378947.612549
+333492.704506 7378929.965571
+333494.576401 7378917.917635
+333493.628084 7378903.170161
+333491.434587 7378889.302537
+333480.673256 7378867.586256
+333474.002055 7378853.548661
+333462.919121 7378841.680694
+333444.711444 7378827.963043
+333427.179958 7378818.684633
+333416.319672 7378813.575508
+333404.148235 7378808.006462
+333396.619427 7378797.618241
+333390.863558 7378783.600642
+333376.795488 7378764.603896
+333356.781887 7378758.394960
+333334.492325 7378754.045705
+333291.587187 7378750.676282
+333308.689870 7378736.358734
+333319.137844 7378732.379416
+333330.938200 7378717.341992
+333338.912305 7378706.583835
+333344.618696 7378689.366784
+333353.079329 7378671.519841
+333358.290947 7378653.422941
+333364.294203 7378636.765794
+333372.062152 7378617.139156
+333385.957051 7378597.472524
+333393.947648 7378585.494576
+333408.320828 7378559.079101
+333414.546732 7378541.422125
+333432.540008 7378510.957344
+333446.764755 7378479.992648
+333456.421092 7378446.988301
+333461.946066 7378419.033089
+333472.377548 7378389.798097
+333483.072909 7378346.175569
+333479.502291 7378343.745985
+333496.794637 7378354.994059
+333560.034980 7378351.344684
+333583.718154 7378349.954922
+333711.963533 7378342.746157
+333788.076242 7378338.436895
+333808.213537 7378334.927496
+333902.393737 7378308.392041
+333933.011992 7378313.891099
+333951.013513 7378327.608750
+333971.192040 7378338.136946
+334000.070339 7378354.194196
+334029.484644 7378333.157799
+334042.464211 7378321.899728
+334050.537271 7378302.493052
+334050.652718 7378283.336333
+334046.529603 7378260.580231
+334038.736915 7378246.432654
+334024.198810 7378223.886516
+334011.878942 7378204.369859
+334000.870224 7378186.302954
+333989.803782 7378163.576847
+333984.666381 7378140.480803
+333982.217250 7378122.623862
+333983.445938 7378095.608489
+333984.633396 7378072.142509
+333989.193561 7378047.386749
+334009.726676 7378000.004865
+334014.996017 7377984.887455
+334021.576509 7377971.449756
+334030.771056 7377961.031541
+334045.490578 7377949.683485
+334063.038557 7377940.245102
+334087.488631 7377933.436268
+334112.334523 7377927.627263
+334123.483427 7377924.657771
+334132.108985 7377919.878590
+334136.528964 7377916.499169
+334142.111662 7377910.250239
+334146.680074 7377903.321426
+334151.776245 7377894.522933
+334157.391928 7377884.844591
+334159.907028 7377870.357073
+334160.962546 7377848.770770
+334165.506219 7377834.983132
+334168.334676 7377828.704207
+334170.660113 7377821.305475
+334175.434680 7377814.166698
+334182.559424 7377806.268051
+334191.184981 7377801.498867
+334202.638995 7377798.749338
+334213.326110 7377800.529034
+334224.697662 7377805.088253
+334239.194536 7377812.347009
+334252.891525 7377818.705920
+334267.091534 7377825.614737
+334283.171684 7377828.464249
+334302.459617 7377827.464420
+334324.510038 7377825.944680
+334346.684152 7377821.655415
+334373.525633 7377811.107222
+334380.955487 7377803.218573
+334385.548637 7377794.300101
+334387.354562 7377788.231140
+334388.368848 7377779.602618
+334387.338069 7377771.394024
+334382.497532 7377757.936329
+334371.661985 7377741.859083
+334364.570226 7377719.962834
+334334.850811 7377678.759892
+334324.435822 7377662.022758
+334317.690405 7377645.665560
+334314.853702 7377634.997388
+334314.853702 7377626.358867
+334318.399581 7377619.310075
+334328.822817 7377608.131989
+334341.324102 7377603.292818
+334355.820976 7377601.573113
+334372.758734 7377601.103193
+334382.472793 7377599.113534
+334390.875702 7377595.004238
+334408.877224 7377581.916480
+334420.801273 7377573.517919
+334428.437283 7377565.409307
+334430.548318 7377559.570308
+334431.257494 7377551.161748
+334429.814403 7377543.053137
+334427.505459 7377539.933671
+334414.781525 7377528.705595
+334398.330295 7377523.096555
+334381.260597 7377517.247557
+334369.600427 7377511.358566
+334361.510875 7377505.509568
+334356.381719 7377499.360621
+334353.182182 7377493.561614
+334351.137117 7377484.683135
+334352.662669 7377476.054613
+334355.928177 7377467.566067
+334361.321212 7377459.207499
+334365.881377 7377452.948571
+334385.202296 7377431.132308
+334399.229134 7377417.444652
+334415.185590 7377404.006954
+334424.627524 7377398.687865
+334435.314639 7377391.499097
+334470.311642 7377372.072424
+334489.401666 7377361.654209
+334501.622580 7377354.265475
+334515.113413 7377343.117384
+334520.894021 7377336.758473
+334527.029216 7377326.420244
+334531.127593 7377315.942039
+334531.853261 7377305.543820
+334531.696583 7377292.586040
+334529.865920 7377282.927694
+334525.116091 7377261.381385
+334522.782408 7377251.723039
+334517.463589 7377235.165875
+334514.206328 7377225.267571
+334511.691227 7377213.499586
+334511.979846 7377205.860895
+334515.237107 7377197.482330
+334519.071604 7377191.983272
+334523.837925 7377185.724344
+334534.104482 7377179.755367
+334550.580451 7377183.594709
+334565.308219 7377188.963789
+334578.221816 7377192.543176
+334587.688489 7377193.652986
+334595.745056 7377193.852952
+334605.970382 7377191.093424
+334616.888392 7377181.695034
+334626.305587 7377169.727084
+334631.830562 7377159.378857
+334644.843114 7377145.131297
+334665.656600 7377144.261446
+334687.756498 7377146.831006
+334710.664527 7377150.200429
+334733.539571 7377156.329379
+334751.788479 7377157.089249
+334773.137970 7377153.789814
+334806.353787 7377147.520888
+334835.372273 7377142.311780
+334967.435657 7377115.566362
+334980.926490 7377112.066961
+334980.918244 7377112.066961
+334991.316741 7377105.758042
+334992.199087 7377104.768211
+334997.179811 7377099.159172
+335001.253448 7377092.160371
+335001.756469 7377091.290520
+335002.226504 7377088.540991
+335003.521162 7377080.872304
+335004.824066 7377065.384957
+335003.892242 7377059.625944
+335001.822438 7377047.058096
+334997.006640 7377032.050667
+334995.266685 7377029.091174
+334991.135323 7377022.142364
+334985.074344 7377017.313191
+334976.250877 7377013.223892
+334949.030070 7377003.275596
+334931.506830 7376997.406601
+334928.538187 7376996.416771
+334908.763726 7376990.877720
+334900.063952 7376985.338668
+334893.450475 7376979.979586
+334893.450475 7376979.969588
+334893.409244 7376979.939593
+334893.244319 7376979.309701
+334891.677536 7376974.130588
+334891.388918 7376972.080939
+334891.355933 7376971.940963
+334891.364179 7376971.930965
+334891.355933 7376971.890972
+334899.750595 7376959.803042
+334910.338756 7376949.744765
+334920.588820 7376942.665978
+334927.754795 7376940.956271
+334931.490337 7376940.056425
+334936.223674 7376939.866457
+334946.580939 7376939.416534
+334946.704633 7376939.446529
+335006.902116 7376936.047112
+335037.437909 7376932.407735
+335060.321199 7376928.788355
+335077.935147 7376922.119497
+335090.865237 7376915.070705
+335098.583709 7376908.621809
+335107.060834 7376898.413558
+335110.466527 7376886.495599
+335110.202648 7376873.647800
+335102.525407 7376812.858213
+335097.313789 7376796.081086
+335089.562332 7376778.604080
+335073.028640 7376752.828495
+335064.122711 7376737.561110
+335053.031531 7376726.353030
+335018.504563 7376704.916702
+335008.369946 7376698.827745
+334966.907898 7376677.421412
+334939.794291 7376658.504652
+334917.752117 7376641.977483
+334902.793455 7376629.729581
+334888.783109 7376615.172075
+334848.747659 7376566.870348
+334811.416973 7376531.896339
+334762.516825 7376491.463265
+334732.813902 7376467.427382
+334677.861021 7376429.753835
+334677.729082 7376429.733838
+334677.712589 7376429.663850
+334609.211151 7376387.381093
+334537.130849 7376350.347437
+334482.004797 7376319.262761
+334443.156805 7376301.425816
+334379.974185 7376279.439582
+334325.887159 7376265.531965
+334287.608156 7376260.112893
+334256.833223 7376257.993256
+334258.375268 7376230.098034
+334256.157032 7376209.691530
+334205.203573 7376198.253489
+334174.181253 7376191.254688
+334145.929667 7376182.516185
+334120.531277 7376174.257599
+334091.850887 7376158.420312
+334059.542155 7376139.553544
+334038.769900 7376127.905539
+334009.941077 7376089.152177
+333943.979479 7376043.430009
+333904.405818 7376008.525988
+333857.014730 7375961.694009
+333820.549898 7375922.620702
+333745.781325 7375835.155684
+333672.983601 7375754.579486
+333601.150686 7375669.354085
+333522.638324 7375579.849416
+333462.341885 7375511.491125
+333394.269251 7375428.195393
+333272.381716 7375297.987696
+333205.240906 7375230.539250
+333106.162445 7375156.521928
+333009.277481 7375104.910769
+332916.284738 7375060.418390
+332833.014301 7375030.663487
+332694.823968 7374980.122144
+332582.477321 7374942.938513
+332483.291659 7374913.883490
+332372.866385 7374879.519376
+332265.450984 7374847.014944
+332150.374835 7374807.811659
+331944.796305 7374730.004987
+331819.206213 7374674.724456
+331712.277340 7374601.267038
+331634.944189 7374569.692447
+331530.711834 7374774.047443
+331443.450221 7374903.835211
+331372.046110 7375002.798260
+331209.339733 7375201.484226
+330939.391126 7375502.262706
+330462.791980 7375946.156671
+330184.976469 7376193.664275
+330072.497883 7376332.340521
+329930.068988 7376486.844056
+329833.423164 7376649.296229
+329721.117749 7376895.304090
+329682.426435 7377011.584173
+329651.247437 7377095.949722
+329625.543936 7377174.836209
+329523.727726 7377438.361070
+329448.060314 7377568.498778
+329364.963048 7377635.747259
+329328.960005 7377646.825362
+329315.345478 7377648.785026
+329290.639771 7377651.264601
+329205.530424 7377655.693843
+329087.287723 7377676.120344
+328936.010622 7377704.465488
+328734.926287 7377762.125612
+328532.489571 7377825.134819
+328426.319352 7377864.928003
+328171.106759 7377971.119813
+328187.252879 7378037.428455
+328188.184703 7378053.835644
+328195.507356 7378089.689503
+328196.736044 7378124.263581
+328230.710515 7378149.259299
+328258.830161 7378151.468921
+328286.982792 7378151.248958
+328300.580827 7378156.838001
+328307.416952 7378165.116583
+328324.173293 7378179.934045
+328332.724634 7378198.860803
+328346.718487 7378222.726715
+328355.764602 7378234.354723
+328383.133842 7378282.746434
+328416.209473 7378349.924927
+328417.710287 7378369.661546
+328414.312840 7378389.548140
+328409.505287 7378398.796556
+328398.422353 7378413.404054
+328390.712128 7378427.481642
+328385.698420 7378446.148445
+328385.046967 7378466.624937
+328390.621419 7378477.992990
+328403.716434 7378492.210555
+328413.818066 7378500.419149
+328442.943753 7378512.947003
+328472.316826 7378521.705503
+328488.825780 7378522.565355
+328509.655759 7378520.925636
+328526.445084 7378515.476570
+328546.376224 7378512.057155
+328572.285880 7378511.257292
+328591.755231 7378512.377100
+328610.045371 7378518.236097
+328626.034812 7378520.635686
+328645.594871 7378522.535360
+328665.699181 7378521.665509
+328679.214753 7378517.166280
+328690.396642 7378511.427263
+328728.040685 7378501.908894
+328749.959166 7378503.048698
+328761.561612 7378505.068352
+328773.254767 7378508.197816
+328783.348154 7378517.396241
+328800.525052 7378530.893929
+328818.765714 7378540.852223
+328834.647955 7378552.010312
+328870.923123 7378589.313922
+328900.725001 7378613.589764
+328964.707504 7378690.456597
+329001.518678 7378733.069298
+329024.212305 7378754.705592
+329041.653083 7378763.444095
+329060.998740 7378766.773525
+329094.552652 7378767.053477
+329130.844313 7378768.253271
+329156.011809 7378770.432898
+329180.371175 7378771.832658
+329197.844937 7378778.011600
+329217.050408 7378792.529113
+329239.323477 7378806.856659
+329248.955075 7378811.955785
+329260.574014 7378820.844263
+329270.164380 7378829.482783
+329275.912003 7378835.311785
+329282.401786 7378847.239742
+329296.321424 7378860.467476
+329317.217372 7378876.654703
+329332.406929 7378888.252716
+329343.770235 7378901.890380
+329345.526682 7378908.999163
+329349.756998 7378921.896953
+329351.983481 7378932.005222
+329359.809153 7378938.174165
+329365.828902 7378942.913354
+329377.728213 7378946.262780
+329385.809519 7378952.891644
+329396.933684 7378961.110237
+329425.746014 7378982.936498
+329443.681565 7378992.674830
+329467.562649 7379000.703455
+329481.193669 7379008.162177
+329507.993918 7379022.659694
+329528.254907 7379034.637642
+329548.235524 7379052.934508
+329626.954041 7379150.877731
+329661.192391 7379206.098272
+329689.740842 7379269.147473
+329721.101257 7379307.260944
+329738.921361 7379301.042009
+329760.584209 7379288.894090
+329789.479001 7379269.077485
+329849.684731 7379240.982297
+329900.654683 7379251.880430
+329911.877803 7379251.900427
+329934.926017 7379251.840437
+329950.940197 7379251.910425
+329976.651944 7379251.110562
+329998.207591 7379248.481013
+330018.806676 7379248.610990
+330051.371040 7379246.551343
+330065.059783 7379244.611675
+330077.552823 7379240.322410
+330090.367465 7379234.823352
+330109.193610 7379221.315666
+330122.255639 7379211.607329
+330136.810236 7379205.688343
+330158.695732 7379200.959153
+330179.525711 7379198.539567
+330205.377644 7379202.398906
+330223.197748 7379206.138265
+330240.679757 7379211.547339
+330264.016590 7379213.267044
+330284.294071 7379215.156721
+330301.132874 7379214.536827
+330318.375742 7379213.896936
+330336.649390 7379212.447185
+330367.143951 7379209.247733
+330388.312025 7379207.957954
+330409.331667 7379215.736621
+330475.078863 7379219.156036
+330524.242891 7379194.360283
+330587.483233 7379154.867048
+330609.203805 7379142.299201
+330688.260418 7379193.260471
+330768.842584 7379246.821297
+330874.748924 7379314.849644
+330907.527691 7379332.186675
+330931.606685 7379346.214272
+331073.623269 7379439.518290
+331105.412488 7379458.115104
+331155.739234 7379501.247716
+331424.887956 7379643.283386
+331459.249999 7379662.190148
+331466.762315 7379602.090442
+331489.299263 7379573.545332
+331523.859216 7379502.927428
+331607.781105 7379390.656659
+331647.461967 7379361.291689
+331670.782307 7379346.354248
+331743.489323 7379296.212837
+331779.426396 7379271.817015
+331783.351602 7379258.149356
+331797.452656 7379193.040509
+331803.843485 7379173.823801
+331814.118288 7379145.428664
+331841.899839 7379042.256337
+331882.372339 7379052.574570
+331938.718833 7379060.513210
+331962.641149 7379060.843153
+332011.895884 7379048.615248
+332081.848659 7379036.437334
+332108.558200 7379031.718142
+332168.351618 7379022.489723
+332172.557196 7378975.767726
+332179.236643 7378958.000769
+332195.085898 7378932.625116
+332213.491485 7378906.509589
+332251.828211 7378848.689493
+332271.058421 7378852.268880
+332304.637072 7378865.676583
+332327.817227 7378882.843643
+332360.051742 7378862.427140
+332382.621675 7378836.631559
+332396.590790 7378801.167633
+332419.160723 7378758.184996
+332439.578390 7378678.668616
+332498.349276 7378707.203728
+332529.445812 7378718.301827
+332559.923881 7378742.567671
+332591.943994 7378742.567671
+332645.486770 7378750.066386
+332771.555144 7378760.504598
+332844.509546 7378799.247962
+332946.416465 7378820.684290
+333003.554597 7378827.413138
+333055.637790 7378832.452275
+333156.464452 7378808.926304
+333201.835213 7378820.684290
+333263.418063 7378877.494559
+333277.444902 7378918.147596
+333275.762671 7378968.568959
+333270.245942 7379020.010148
+Region 1
+596
+338743.500117 7387764.332324
+338720.080822 7387611.578490
+338700.190914 7387481.440781
+338678.486835 7387340.214972
+338665.993795 7387260.778579
+338655.413881 7387193.770056
+338635.969269 7387059.992971
+338614.199221 7386925.186062
+338591.225222 7386778.851128
+338586.854720 7386746.856609
+338585.675509 7386735.818499
+338584.941594 7386719.201346
+338585.155996 7386700.264589
+338581.849258 7386684.007374
+338570.560168 7386626.117290
+338561.439837 7386574.626110
+338552.096858 7386533.883089
+338547.347029 7386501.488638
+338543.124959 7386459.355855
+338540.214039 7386426.981400
+338535.002421 7386400.565925
+338527.415889 7386366.701726
+338525.659442 7386359.263000
+338525.189407 7386355.603627
+338520.678719 7386348.244887
+338503.336896 7386329.668069
+338496.195660 7386319.949734
+338492.517841 7386311.161239
+338490.332590 7386287.215341
+338491.693218 7386275.377369
+338494.340258 7386266.108956
+338500.434222 7386250.231676
+338509.760709 7386228.845339
+338523.119603 7386210.718444
+338532.619261 7386200.860133
+338547.495461 7386184.522931
+338565.859816 7386166.336047
+338584.265403 7386144.389806
+338603.545091 7386126.552861
+338616.532904 7386114.624904
+338628.910496 7386102.906911
+338639.020375 7386093.058598
+338652.024680 7386079.130984
+338664.633167 7386064.983407
+338675.221327 7386048.606213
+338682.898568 7386027.869765
+338689.396598 7386012.322428
+338692.356995 7385994.305514
+338694.187658 7385975.938660
+338693.470236 7385957.871755
+338688.085447 7385927.916886
+338680.754548 7385889.623445
+338676.581955 7385870.526716
+338670.809594 7385847.760616
+338666.620509 7385830.323603
+338664.278579 7385820.665257
+338661.903665 7385804.138088
+338658.333047 7385785.711244
+338654.127469 7385769.494022
+338651.249535 7385753.186815
+338645.254525 7385723.321931
+338639.078098 7385691.137444
+338632.118280 7385664.921934
+338626.469612 7385640.936043
+338620.474602 7385619.939639
+338615.996899 7385611.541078
+338607.890854 7385595.213875
+338596.131729 7385579.576553
+338581.898735 7385565.358989
+338568.869691 7385553.361044
+338552.781295 7385540.783198
+338531.563743 7385531.464794
+338504.194504 7385515.327558
+338477.748842 7385498.530436
+338461.553245 7385486.832439
+338443.650678 7385472.014978
+338427.512805 7385455.327836
+338411.943921 7385442.420047
+338399.013832 7385430.102157
+338387.873174 7385413.804948
+338369.104753 7385385.239841
+338358.425885 7385363.643541
+338349.231337 7385337.398036
+338342.296257 7385318.381294
+338340.647011 7385309.062890
+338338.750378 7385297.744828
+338336.853745 7385275.908569
+338338.098926 7385246.353631
+338341.100554 7385224.347401
+338346.773961 7385199.821602
+338352.002071 7385179.605065
+338357.799171 7385162.837937
+338363.579779 7385147.400581
+338367.834834 7385132.163191
+338375.042039 7385107.987332
+338381.861672 7385081.591853
+338392.301400 7385042.168606
+338397.513018 7385022.961896
+338403.433811 7385004.305092
+338409.247404 7384985.658286
+338414.170404 7384965.551730
+338418.450197 7384947.544815
+338422.738237 7384928.548068
+338428.221981 7384912.770771
+338433.779940 7384889.794707
+338439.255437 7384874.567315
+338445.464849 7384848.501780
+338451.377396 7384830.184917
+338456.267411 7384812.517943
+338461.173918 7384793.521197
+338468.958360 7384762.816457
+338472.949536 7384743.259807
+338476.025380 7384723.693158
+338478.680666 7384705.006359
+338481.360691 7384693.848270
+338485.896118 7384679.940653
+338488.823530 7384664.363321
+338492.526087 7384643.916823
+338489.540952 7384636.678063
+338488.023645 7384626.699772
+338488.460696 7384614.521858
+338488.617374 7384600.234306
+338486.366153 7384582.487346
+338482.762550 7384566.830028
+338478.853837 7384551.612634
+338474.038038 7384534.725527
+338470.706561 7384522.177676
+338466.435014 7384511.939430
+338463.103536 7384500.051466
+338459.277285 7384485.613939
+338453.727572 7384471.266397
+338446.207010 7384450.359978
+338440.987146 7384432.802985
+338433.788186 7384410.346832
+338427.941609 7384394.779498
+338420.734403 7384373.213192
+338414.294097 7384355.976145
+338410.063781 7384341.978543
+338408.051701 7384329.770634
+338406.649841 7384318.232610
+338404.530560 7384307.024530
+338399.978641 7384294.796624
+338392.911621 7384278.209466
+338385.333335 7384262.292192
+338379.429034 7384252.593853
+338372.065150 7384244.425253
+338366.853532 7384236.506609
+338361.551206 7384226.478327
+338354.822282 7384217.429877
+338350.517749 7384209.631212
+338350.286855 7384203.092332
+338351.581513 7384196.463468
+338354.195568 7384190.624468
+338358.335176 7384185.355371
+338365.558874 7384178.016628
+338375.973863 7384168.158316
+338352.381397 7384142.532706
+338295.103079 7384100.149966
+338229.273420 7384065.745859
+338211.502793 7384049.048719
+338198.185131 7384035.501039
+338179.391971 7384018.903882
+338159.378369 7384001.736823
+338143.792993 7383990.598731
+338122.979507 7383971.981920
+338105.076940 7383958.044307
+338086.077625 7383942.217018
+338062.905717 7383924.240097
+338045.613371 7383910.872387
+338019.893378 7383892.865472
+338008.167238 7383883.097145
+337989.571988 7383867.719779
+337974.299969 7383855.591856
+337958.747578 7383840.794391
+337939.830724 7383826.626818
+337918.002952 7383807.670065
+337900.537435 7383791.082906
+337885.479818 7383777.955155
+337869.119297 7383763.377652
+337850.631248 7383747.000457
+337825.422520 7383729.223502
+337804.872914 7383714.266064
+337778.897287 7383701.568239
+337746.835942 7383685.490993
+337736.495169 7383680.051925
+337715.953809 7383664.434600
+337693.235443 7383652.216692
+337675.415339 7383640.608681
+337655.409983 7383631.530236
+337637.746557 7383624.021522
+337620.932493 7383613.203375
+337601.990901 7383600.585536
+337575.660687 7383583.238508
+337554.970894 7383572.150407
+337527.007926 7383554.673401
+337504.116390 7383539.915929
+337487.491989 7383529.867650
+337456.453176 7383513.570441
+337435.590213 7383499.942776
+337408.930149 7383484.695387
+337396.585542 7383475.356987
+337378.468573 7383462.089260
+337361.151489 7383450.931171
+337338.960882 7383437.503471
+337316.836245 7383427.175240
+337291.347146 7383415.927167
+337266.913565 7383402.479470
+337247.980219 7383389.641669
+337227.925386 7383376.453928
+337216.100292 7383366.465639
+337201.240584 7383354.227735
+337180.938364 7383335.730904
+337165.179817 7383321.933267
+337138.907327 7383308.455576
+337120.501740 7383303.156483
+337097.700912 7383298.357305
+337066.084864 7383288.039073
+337046.640252 7383284.059754
+337019.048364 7383279.650510
+336999.999571 7383276.781001
+336987.061235 7383275.191274
+336967.270282 7383274.721354
+336951.280841 7383272.691702
+336912.935868 7383271.151965
+336892.625402 7383271.921834
+336878.425393 7383273.761518
+336861.388680 7383273.011647
+336852.045701 7383269.362272
+336840.682395 7383264.143166
+336836.254169 7383258.554123
+336827.142085 7383252.135223
+336818.541266 7383237.087800
+336811.284583 7383228.929198
+336801.479815 7383220.730602
+336791.130795 7383215.741457
+336779.973645 7383209.742484
+336773.475616 7383207.012952
+336758.533446 7383201.973815
+336747.467004 7383196.974671
+336742.189416 7383194.485098
+336731.535286 7383189.485954
+336721.524362 7383181.517319
+336714.036785 7383175.888283
+336708.726212 7383167.189773
+336704.009369 7383160.610900
+336693.495424 7383151.632438
+336679.889144 7383146.163375
+336667.495059 7383141.144235
+336654.573216 7383138.234733
+336638.583775 7383136.065105
+336616.566339 7383133.935469
+336594.730320 7383134.465379
+336569.966889 7383068.506677
+336566.313809 7383057.608543
+336559.403468 7383045.900549
+336552.204509 7383033.202724
+336544.246896 7383023.694353
+336532.974299 7383010.386632
+336527.276153 7382999.688465
+336521.602747 7382987.340580
+336513.669873 7382975.622587
+336505.934908 7382965.124385
+336495.437457 7382954.926132
+336481.385880 7382943.358114
+336456.416293 7382931.890078
+336434.349380 7382925.551164
+336412.018588 7382924.971263
+336383.263981 7382932.180028
+336366.202530 7382934.309663
+336348.060823 7382942.078333
+336334.363834 7382944.257959
+336321.392513 7382945.547738
+336307.390413 7382948.377254
+336293.916072 7382948.677202
+336281.489003 7382947.317435
+336271.403863 7382945.647721
+336262.242300 7382944.217966
+336251.316045 7382944.867855
+336241.882357 7382949.307095
+336234.889553 7382953.986293
+336227.814287 7382956.895795
+336219.114514 7382959.575336
+336210.752836 7382959.475353
+336202.440636 7382954.396223
+336193.996495 7382943.338117
+336189.469315 7382937.749074
+336182.921808 7382930.150376
+336169.645376 7382922.581672
+336159.469528 7382919.912130
+336152.130382 7382919.832143
+336138.952906 7382921.231904
+336126.171248 7382923.301549
+336117.809571 7382923.211564
+336102.331396 7382920.931955
+336087.908738 7382915.012969
+336076.685618 7382906.024508
+336065.182127 7382894.926409
+336052.062374 7382881.938634
+336039.602319 7382865.401467
+336029.409978 7382854.883268
+336018.129134 7382842.125454
+336003.599276 7382827.787910
+335982.686835 7382800.972503
+335963.135022 7382779.046259
+335950.444073 7382764.498751
+335941.678330 7382754.770417
+335934.314446 7382738.513202
+335929.300738 7382731.144464
+335921.186447 7382726.955181
+335911.612573 7382725.295466
+335898.476328 7382723.155832
+335882.371439 7382713.117552
+335876.516616 7382707.408530
+335867.338561 7382698.220103
+335855.134140 7382694.320771
+335841.816477 7382690.291462
+335832.069432 7382677.333681
+335828.061764 7382670.974770
+335822.107986 7382664.815825
+335809.722147 7382659.586721
+335801.409947 7382654.507591
+335795.365460 7382647.788742
+335788.100531 7382640.949913
+335779.277064 7382636.200727
+335762.380537 7382633.241234
+335747.916649 7382630.751660
+335731.407695 7382629.021956
+335718.502344 7382625.102628
+335696.757034 7382617.213979
+335687.743904 7382611.025039
+335677.452608 7382601.386690
+335665.116247 7382591.278422
+335652.903579 7382579.510437
+335638.035625 7382568.492325
+335619.357913 7382560.193746
+335603.681828 7382556.694346
+335588.706674 7382554.974640
+335576.279604 7382553.504892
+335562.162057 7382548.025830
+335555.688766 7382542.636753
+335545.067621 7382534.438158
+335529.251351 7382526.169574
+335515.183281 7382516.151290
+335499.251563 7382508.332629
+335482.602424 7382501.383820
+335461.879646 7382493.515168
+335443.474059 7382488.206077
+335432.316909 7382482.767009
+335424.590191 7382478.787690
+335422.784267 7382477.567899
+335402.061489 7382469.689249
+335387.935696 7382464.990054
+335374.684003 7382463.840251
+335361.498281 7382466.129858
+335352.237764 7382472.888701
+335343.801870 7382479.327598
+335334.005348 7382488.296062
+335323.870730 7382500.813917
+335315.170957 7382512.011999
+335306.899987 7382521.550365
+335293.623556 7382541.007033
+335290.077677 7382556.584364
+335289.904506 7382572.081710
+335289.384994 7382590.908485
+335286.655491 7382606.825758
+335278.846311 7382620.913345
+335270.080568 7382629.121939
+335260.086136 7382637.540497
+335245.506800 7382646.229009
+335225.856033 7382669.375044
+335159.308951 7382708.718305
+335206.831979 7382725.045509
+335219.242556 7382731.934329
+335235.965911 7382743.132410
+335248.120855 7382756.100189
+335290.127154 7382820.169215
+335346.053091 7382912.973318
+335370.841260 7382956.435873
+335435.871035 7383066.267060
+335439.153035 7383080.244666
+335438.872663 7383099.031448
+335435.532939 7383128.746358
+335427.352678 7383173.178747
+335408.996569 7383235.878008
+335373.603747 7383344.789352
+335360.607688 7383385.402395
+335357.012331 7383419.176610
+335356.748452 7383425.265567
+335357.243226 7383433.404173
+335361.028245 7383446.871866
+335366.841838 7383465.418689
+335390.599228 7383523.108808
+335409.549067 7383571.910448
+335423.922247 7383633.139960
+335444.875919 7383699.718556
+335461.285918 7383754.099241
+335459.207867 7383809.319782
+335458.399737 7383821.907626
+335449.452577 7383855.151932
+335442.583466 7383885.426746
+335427.847452 7383934.318371
+335421.200990 7383953.625064
+335417.086121 7383974.511486
+335417.292277 7383992.788356
+335418.430257 7384000.007119
+335424.953025 7384027.982327
+335433.199256 7384056.767397
+335441.222838 7384078.123738
+335454.268375 7384106.728839
+335472.698701 7384136.953661
+335481.348997 7384150.691308
+335495.202664 7384183.705653
+335509.311965 7384216.729996
+335521.112321 7384247.474730
+335536.466802 7384275.149990
+335542.618490 7384287.587859
+335545.240792 7384309.204156
+335546.337540 7384329.260721
+335552.299565 7384359.035621
+335551.136847 7384389.060478
+335545.883998 7384408.157207
+335409.177986 7384671.312131
+335416.748026 7384693.818276
+335473.020304 7384709.575576
+335616.570687 7384741.780060
+335624.808671 7384753.278091
+335633.665123 7384772.534792
+335636.138992 7384797.820461
+335637.392419 7384813.227822
+335642.340158 7384826.905479
+335650.149338 7384849.471614
+335657.158634 7384867.748483
+335658.964559 7384872.607651
+335665.322402 7384906.241889
+335667.004634 7384928.738036
+335668.488955 7384951.464143
+335672.669794 7384978.309545
+335674.698367 7384998.046164
+335680.223341 7385023.581790
+335685.072125 7385036.599560
+335687.430547 7385053.796615
+335691.298029 7385063.694919
+335691.652617 7385077.982472
+335692.048436 7385087.620821
+335695.577823 7385100.838557
+335700.517315 7385114.966137
+335715.154374 7385138.392124
+335726.352755 7385158.778632
+335730.508856 7385169.906726
+335736.841961 7385187.473717
+335742.037086 7385197.052076
+335746.696207 7385209.289980
+335757.185412 7385220.268099
+335761.201326 7385225.847144
+335766.915964 7385234.775614
+335777.396923 7385247.073508
+335783.136300 7385253.232453
+335792.908083 7385264.410538
+335802.242816 7385287.226630
+335809.656177 7385299.714491
+335814.554438 7385308.852926
+335837.371759 7385330.429230
+335850.384311 7385343.916920
+335864.229732 7385373.421866
+335877.819520 7385435.491234
+335882.940429 7385470.095306
+335883.575389 7385494.801074
+335884.523706 7385519.846784
+335884.334042 7385536.233977
+335884.969002 7385562.049555
+335882.965168 7385576.647055
+335875.576545 7385598.043390
+335864.625551 7385619.079787
+335865.936702 7385637.856570
+335866.274797 7385645.125325
+335860.090124 7385668.531316
+335849.848306 7385690.347579
+335839.276638 7385722.412087
+335834.741211 7385736.359698
+335824.062342 7385766.224582
+335820.203106 7385776.512820
+335812.253740 7385802.668340
+335795.884972 7385833.823003
+335786.913073 7385851.559965
+335781.668471 7385864.127812
+335777.034089 7385885.784103
+335776.267190 7385900.001667
+335776.283682 7385907.260424
+335768.301331 7385936.735375
+335762.421768 7385950.962938
+335755.890754 7385968.829878
+335747.842433 7385994.985397
+335739.967282 7386051.495718
+335730.682027 7386078.631070
+335725.330223 7386096.388028
+335723.582022 7386101.697119
+335721.314309 7386131.022096
+335720.671103 7386142.650104
+335720.275284 7386168.885610
+335713.290726 7386181.883383
+335705.720686 7386192.651539
+335699.437059 7386224.586069
+335696.773526 7386234.634348
+335685.393728 7386248.461979
+335667.994181 7386262.329604
+335659.714966 7386272.867799
+335655.624835 7386291.764562
+335658.271875 7386300.873002
+335667.169558 7386317.360178
+335666.880940 7386333.867350
+335657.224604 7386359.882894
+335609.206803 7386351.254372
+335604.118879 7386408.534560
+335575.966247 7386627.277092
+335555.482610 7386625.667367
+335545.661350 7386649.693252
+335586.818287 7386810.195759
+335612.175446 7386842.040305
+335658.750157 7386901.710084
+335706.627772 7386981.436427
+335725.008620 7387016.980339
+335743.834764 7387057.723360
+335771.937919 7387135.460044
+335775.005516 7387143.828611
+335785.544199 7387169.384234
+335819.576393 7387280.885134
+335852.569562 7387388.436712
+335905.188760 7387546.629615
+335980.353152 7387768.871547
+335990.487769 7387793.347354
+336023.934481 7387843.478767
+336048.689665 7387909.117524
+336111.567174 7388102.904330
+336144.799483 7388227.602970
+336166.058266 7388292.981771
+336167.888929 7388302.700107
+336183.342365 7388330.265385
+336207.751208 7388379.416966
+336235.079217 7388434.747488
+336242.987352 7388445.865584
+336259.562275 7388469.141597
+336281.818852 7388499.656370
+336304.652665 7388527.641576
+336328.541995 7388554.127040
+336479.134659 7388718.998799
+336530.228304 7388709.440436
+336563.048302 7388711.410098
+336619.947293 7388718.488886
+336642.706890 7388726.357538
+336662.407135 7388734.166201
+336692.077073 7388751.873168
+336723.668382 7388775.199172
+336745.092090 7388798.065255
+336799.591428 7388845.577117
+336827.686336 7388877.241693
+336846.702144 7388893.438919
+336864.109937 7388912.895586
+336887.603448 7388945.490003
+336918.906139 7388994.161666
+336931.959922 7388979.284214
+336946.893846 7388960.257473
+336964.507795 7388934.411900
+336986.813849 7388892.879014
+337025.299007 7388832.599340
+337043.490192 7388804.224200
+337060.939216 7388774.299326
+337065.177778 7388766.760617
+337089.190802 7388740.275154
+337109.196158 7388721.868307
+337137.233342 7388697.532476
+337171.207812 7388669.227324
+337199.723278 7388646.421230
+337289.813347 7388567.654722
+337429.991022 7388450.814736
+337437.536323 7388438.426858
+337450.301488 7388425.209122
+337462.778035 7388413.511126
+337478.808708 7388396.254082
+337492.118124 7388387.915510
+337654.758531 7388252.148766
+337687.949609 7388225.113397
+337714.040683 7388204.017010
+337778.468483 7388149.656322
+337823.278500 7388113.222563
+337858.770277 7388088.256839
+337892.019079 7388071.899641
+337926.834665 7388061.651396
+337959.052688 7388055.032530
+337980.336209 7388050.393325
+338050.585848 7388041.094917
+338298.294371 7387999.981960
+338495.634916 7387957.429249
+338523.878256 7387950.760391
+338547.561431 7387941.062052
+338757.485724 7387858.036274
+338743.500117 7387764.332324
+Region 1
+327
+338766.894673 7387919.095815
+338757.485724 7387858.036274
+338547.561431 7387941.062052
+338523.878256 7387950.760391
+338495.634916 7387957.429249
+338298.294371 7387999.981960
+338050.585848 7388041.094917
+337980.336209 7388050.393325
+337959.052688 7388055.032530
+337926.834665 7388061.651396
+337892.019079 7388071.899641
+337858.770277 7388088.256839
+337823.278500 7388113.222563
+337778.468483 7388149.656322
+337714.040683 7388204.017010
+337687.949609 7388225.113397
+337654.758531 7388252.148766
+337492.118124 7388387.915510
+337478.808708 7388396.254082
+337462.778035 7388413.511126
+337450.301488 7388425.209122
+337437.536323 7388438.426858
+337429.991022 7388450.814736
+337289.813347 7388567.654722
+337199.723278 7388646.421230
+337171.207812 7388669.227324
+337137.233342 7388697.532476
+337109.196158 7388721.868307
+337089.190802 7388740.275154
+337065.177778 7388766.760617
+337060.939216 7388774.299326
+337043.490192 7388804.224200
+337025.299007 7388832.599340
+336986.813849 7388892.879014
+336964.507795 7388934.411900
+336946.893846 7388960.257473
+336931.959922 7388979.284214
+336918.906139 7388994.161666
+336887.603448 7388945.490003
+336864.109937 7388912.895586
+336846.702144 7388893.438919
+336827.686336 7388877.241693
+336799.591428 7388845.577117
+336745.092090 7388798.065255
+336723.668382 7388775.199172
+336692.077073 7388751.873168
+336662.407135 7388734.166201
+336642.706890 7388726.357538
+336619.947293 7388718.488886
+336563.048302 7388711.410098
+336530.228304 7388709.440436
+336479.134659 7388718.998799
+336328.541995 7388554.127040
+336304.652665 7388527.641576
+336281.818852 7388499.656370
+336259.562275 7388469.141597
+336242.987352 7388445.865584
+336235.079217 7388434.747488
+336207.751208 7388379.416966
+336183.342365 7388330.265385
+336167.888929 7388302.700107
+336166.058266 7388292.981771
+336144.799483 7388227.602970
+336111.567174 7388102.904330
+336048.689665 7387909.117524
+336023.934481 7387843.478767
+335990.487769 7387793.347354
+335946.642561 7387855.336736
+335928.954396 7387876.073184
+335912.321749 7387912.326974
+335908.899563 7387952.930019
+335910.433362 7387999.682011
+335908.668669 7388029.606885
+335909.460307 7388044.114400
+335906.087599 7388055.782402
+335897.651705 7388066.900497
+335892.266916 7388074.989112
+335882.989907 7388084.797432
+335789.889963 7388108.613352
+335744.403754 7388125.840401
+335647.782670 7388131.539425
+335630.539802 7388132.189314
+335610.270567 7388130.019685
+335570.787614 7388119.851427
+335549.256706 7388117.671800
+335537.852169 7388118.111725
+335522.621381 7388120.801264
+335506.623694 7388125.770413
+335489.331348 7388133.029170
+335473.548063 7388142.827492
+335440.942467 7388167.263306
+335414.711207 7388185.630160
+335385.156716 7388207.276452
+335375.483888 7388215.085114
+335365.489456 7388230.522470
+335356.253678 7388247.229608
+335348.832070 7388267.336164
+335344.832648 7388287.552701
+335334.739262 7388357.100788
+335328.942162 7388391.364919
+335318.073630 7388462.682703
+335314.841108 7388491.107834
+335307.477224 7388530.951009
+335296.377797 7388600.239141
+335295.833546 7388606.838011
+335276.817738 7388721.038449
+335254.948734 7388848.176672
+335241.548610 7388918.724587
+335235.578339 7388940.790808
+335227.802143 7388966.386423
+335210.006777 7389011.748653
+335208.472978 7389015.048088
+335186.562744 7389070.288626
+335151.293615 7389151.614695
+335139.682922 7389182.779357
+335124.501612 7389217.233456
+335117.178959 7389249.697895
+335117.393361 7389256.816675
+335119.619843 7389264.445369
+335123.619265 7389273.123882
+335140.449822 7389296.099946
+335152.200700 7389321.835538
+335157.808137 7389354.389962
+335156.958776 7389368.107612
+335155.078635 7389383.854915
+335150.361791 7389408.210743
+335144.119394 7389431.786704
+335133.259109 7389465.001015
+335120.906255 7389492.356329
+335109.848060 7389515.402382
+335102.187312 7389524.750781
+335092.530976 7389528.500138
+335081.093454 7389533.509280
+335054.153018 7389543.737528
+335045.486230 7389550.286407
+335038.600627 7389557.095240
+335032.960205 7389566.473634
+335030.098763 7389577.881680
+335022.759618 7389614.665379
+335012.278659 7389627.303214
+335007.429875 7389631.592480
+334998.029172 7389635.091880
+334988.653208 7389636.041717
+334978.007324 7389634.441991
+334957.243316 7389631.262536
+334929.610197 7389631.832438
+334912.870348 7389632.992240
+334892.263018 7389645.050174
+334861.949874 7389665.936597
+334832.626278 7389691.402235
+334773.509050 7389737.764293
+334746.733540 7389763.489887
+334738.297646 7389773.338200
+334730.612159 7389786.245989
+334725.466511 7389796.124297
+334722.613315 7389807.792298
+334722.761747 7389823.289644
+334723.891481 7389844.126074
+334729.251531 7389876.430541
+334733.902405 7389902.376097
+334733.547817 7389917.113572
+334731.172902 7389931.581094
+334724.996476 7389944.998796
+334712.297280 7389948.478200
+334703.416090 7389949.178080
+334665.928725 7389945.118775
+334640.332426 7389940.829510
+334640.818953 7389946.328568
+334645.758445 7389969.414614
+334648.801304 7389997.919731
+334651.901887 7390022.095590
+334653.056359 7390036.953045
+334654.441726 7390058.669325
+334656.511530 7390074.536607
+334662.844635 7390110.490449
+334665.928725 7390135.556155
+334669.037554 7390158.292261
+334676.038604 7390198.245417
+334685.092965 7390236.778817
+334694.196804 7390280.181382
+334700.727819 7390307.506702
+334715.199954 7390372.165626
+334729.729812 7390426.156378
+334751.541092 7390497.804105
+334775.413930 7390544.526102
+334821.106294 7390644.199029
+334851.122573 7390700.939310
+334864.836055 7390724.575262
+334875.209813 7390746.171562
+334883.959064 7390766.178135
+334886.358717 7390771.667195
+334892.749546 7390783.805116
+334904.450947 7390805.421413
+334927.861996 7390847.114272
+334941.361075 7390872.179978
+334954.208703 7390891.596652
+334971.979330 7390909.193638
+334980.984214 7390915.602540
+334987.828585 7390924.650990
+334994.046243 7390932.429658
+335005.228132 7390941.618084
+335015.486443 7390948.506904
+335024.977854 7390952.946144
+335037.536863 7390956.615515
+335079.493685 7390965.963914
+335100.315417 7390970.403153
+335122.209160 7390974.532446
+335146.865389 7390981.121317
+335159.267720 7390984.790689
+335169.963081 7390988.909983
+335175.042759 7390990.459718
+335190.199331 7390998.418355
+335201.686331 7391006.686938
+335214.698883 7391018.934840
+335225.113872 7391029.802979
+335234.300173 7391042.670775
+335251.295654 7391067.466527
+335295.891269 7391144.893265
+335221.567993 7391197.974173
+335162.541474 7391247.205740
+335076.450826 7391312.944479
+335060.840711 7391329.821588
+334992.396997 7391379.663051
+334894.209128 7391456.909819
+334903.997404 7391469.507661
+334905.861052 7391477.356317
+334905.960007 7391487.764534
+334902.026555 7391501.762136
+334890.811681 7391525.448079
+334847.098413 7391607.554015
+334865.289598 7391646.467350
+334874.360451 7391663.644407
+334885.171260 7391677.002119
+334901.540028 7391686.240537
+334921.998926 7391696.968699
+334934.788829 7391704.217458
+334945.830532 7391715.535519
+334957.688612 7391731.682753
+334975.203606 7391752.839129
+334998.062157 7391775.465254
+335051.027697 7391808.749552
+335095.936669 7391848.702709
+335131.799526 7391900.913765
+335124.600567 7391919.510580
+335123.462587 7391929.908799
+335125.375712 7391941.556804
+335128.715436 7391953.004843
+335133.490003 7391964.352899
+335140.713701 7391975.401006
+335150.172128 7391988.018845
+335163.267142 7391999.996793
+335195.567627 7392012.104719
+335214.830822 7392024.232642
+335229.756500 7392036.180595
+335243.783338 7392054.467463
+335252.499604 7392076.163747
+335256.556749 7392092.071022
+335259.409945 7392112.057598
+335258.939910 7392131.334296
+335254.198327 7392154.470333
+335246.397393 7392176.896492
+335307.592671 7392254.153259
+335402.069735 7392293.756475
+335448.933064 7392484.923730
+335459.991259 7392506.380054
+335471.016470 7392580.877294
+335479.048298 7392610.312252
+335492.431931 7392630.838736
+335515.620331 7392649.565528
+335540.639395 7392658.573985
+335572.511077 7392680.160287
+335750.646151 7392752.307929
+335792.231892 7392676.400931
+335876.599078 7392587.426172
+335911.480634 7392640.397099
+335951.697500 7392658.344024
+336000.003920 7392682.359911
+336050.833685 7392702.986378
+336198.878264 7392779.573259
+336232.209528 7392797.680157
+336250.375974 7392774.524124
+336259.067502 7392764.955763
+336272.104792 7392762.346210
+336290.370193 7392770.174869
+336313.838965 7392782.352783
+336383.791740 7392813.077520
+336673.597270 7392212.990309
+336820.619316 7391918.950676
+336900.426336 7391738.321616
+336999.084240 7391512.680266
+337127.222418 7391202.363421
+337085.983018 7391203.593210
+337171.125350 7390942.437944
+337199.005856 7390867.120845
+337232.749431 7390801.572073
+337291.446101 7390698.369750
+337338.894912 7390622.562735
+337403.949426 7390530.118570
+337512.049263 7390389.742615
+337620.157347 7390252.036203
+337773.735147 7390060.299046
+337862.761453 7389946.828482
+338041.778874 7389723.796686
+338270.685990 7389432.756538
+338773.508150 7388794.945790
+338806.039530 7388753.692856
+338802.378204 7388725.967605
+338799.854857 7388713.869677
+338796.457410 7388697.882416
+338811.556259 7388680.555384
+338822.837102 7388665.837905
+338828.947559 7388658.039240
+338843.551633 7388638.822532
+338862.014944 7388611.667184
+338871.506355 7388593.280333
+338874.483245 7388582.682148
+338875.472792 7388575.823323
+338872.768029 7388561.955699
+338862.691135 7388513.663971
+338860.868718 7388503.345738
+338852.119467 7388454.404121
+338845.555468 7388420.109996
+338835.791930 7388380.246824
+338829.879383 7388360.800155
+338817.040002 7388266.846248
+338791.064375 7388087.147029
+338766.894673 7387919.095815
+Region 1
+308
+341738.258962 7388451.264659
+341720.257441 7388431.857983
+341697.069040 7388405.472503
+341675.406192 7388379.646926
+341649.389335 7388351.011831
+341620.263648 7388317.257613
+341594.997197 7388285.193106
+341570.489400 7388257.797798
+341550.805647 7388228.562806
+341538.700181 7388206.616565
+341527.798664 7388185.680151
+341515.800398 7388153.765618
+341505.368916 7388127.730078
+341498.202942 7388110.373051
+341494.582847 7388096.385447
+341485.916058 7388076.798802
+341469.976095 7388050.373328
+341455.009186 7388028.507074
+341446.218704 7388020.218493
+341434.575026 7388011.559976
+341410.364093 7387994.912828
+341381.073482 7387976.316013
+341351.518991 7387954.179805
+341295.164251 7387918.565906
+341264.851107 7387900.299034
+341232.690808 7387882.222131
+341211.267100 7387872.243840
+341202.732252 7387869.274349
+341178.430610 7387860.815798
+341138.757994 7387858.836137
+341125.778427 7387860.245895
+341104.189795 7387865.764950
+341080.605576 7387875.923210
+341042.021463 7387894.989944
+341014.891364 7387912.746902
+340980.974617 7387934.413191
+340942.901770 7387963.018291
+340915.722194 7387985.094510
+340899.468873 7387996.542549
+340872.338775 7388014.299507
+340848.424706 7388026.337445
+340820.321552 7388039.205241
+340799.268925 7388051.603117
+340741.075275 7388090.726416
+340706.647262 7388113.052592
+340661.622843 7388142.907478
+340627.978222 7388167.683234
+340569.265060 7388208.346269
+340537.921137 7388227.942912
+340508.407877 7388248.439401
+340481.302517 7388263.316853
+340461.544549 7388277.944347
+340435.857540 7388293.831626
+340416.643823 7388305.689595
+340392.309196 7388319.267269
+340360.965274 7388339.193856
+340323.428432 7388365.139412
+340291.556750 7388386.615733
+340263.503073 7388404.242713
+340250.853356 7388412.971218
+340229.751251 7388429.788338
+340180.933566 7388470.011448
+340139.661182 7388501.905985
+340102.165571 7388533.830516
+340057.528724 7388573.983638
+340034.983530 7388591.790588
+340000.720441 7388617.336212
+339950.632837 7388652.780141
+339915.982175 7388675.986166
+339876.647655 7388698.702275
+339836.826607 7388727.837285
+339789.946786 7388759.211910
+339750.166969 7388785.137470
+339717.412941 7388802.834438
+339703.847892 7388811.432965
+339675.654029 7388832.389376
+339635.453655 7388859.294767
+339597.413793 7388884.240494
+339559.464640 7388910.625975
+339512.650788 7388944.780124
+339469.077705 7388971.655521
+339422.214377 7389001.150469
+339390.862208 7389021.626961
+339343.091794 7389050.232061
+339313.652750 7389063.749746
+339284.254938 7389073.168133
+339247.427272 7389081.076778
+339211.135611 7389086.655822
+339153.337780 7389098.533788
+339114.126953 7389109.621888
+339076.812760 7389124.489342
+339039.350134 7389143.456093
+338992.626991 7389169.301666
+338965.364953 7389188.498378
+338926.121141 7389212.094336
+338876.025290 7389237.899916
+338842.347684 7389256.026811
+338833.037689 7389248.948023
+338795.484355 7389220.512894
+338768.378995 7389189.418220
+338747.598494 7389167.042053
+338737.430891 7389154.084272
+338731.139017 7389141.496429
+338728.962012 7389126.189051
+338728.599178 7389113.231270
+338733.456208 7389097.993880
+338739.113122 7389085.216069
+338746.666670 7389075.997648
+338753.816152 7389065.879381
+338759.423588 7389057.200868
+338766.556578 7389048.972277
+338778.373426 7389032.485101
+338788.730692 7389019.087396
+338797.348003 7388996.591250
+338801.578319 7388973.605187
+338805.561249 7388955.258329
+338808.117580 7388935.911643
+338811.457304 7388901.617518
+338812.298419 7388871.612657
+338812.595284 7388844.697268
+338811.152193 7388809.023378
+338809.725595 7388781.538086
+338806.039530 7388753.692856
+338773.508150 7388794.945790
+338270.685990 7389432.756538
+338041.778874 7389723.796686
+337862.761453 7389946.828482
+337773.735147 7390060.299046
+337620.157347 7390252.036203
+337512.049263 7390389.742615
+337403.949426 7390530.118570
+337338.894912 7390622.562735
+337291.446101 7390698.369750
+337232.749431 7390801.572073
+337199.005856 7390867.120845
+337171.125350 7390942.437944
+337085.983018 7391203.593210
+337127.222418 7391202.363421
+337197.422579 7391194.214817
+337243.238637 7391190.465459
+337454.812176 7391172.668507
+337651.880596 7391163.470083
+337661.050405 7391163.620057
+337663.417073 7391164.229953
+337670.500585 7391166.049641
+337755.280083 7391164.089977
+337722.056019 7391295.257509
+337734.969616 7391287.748795
+337757.003545 7391275.820838
+337767.138162 7391272.401424
+337781.107277 7391268.692059
+337798.399623 7391265.962527
+337819.782099 7391265.722568
+337833.281178 7391265.822551
+337862.093508 7391269.311953
+337869.498623 7391271.001664
+337886.353919 7391275.130956
+337913.698420 7391284.479355
+337933.167770 7391295.177523
+337948.546990 7391305.165812
+337968.321451 7391320.183239
+337985.556073 7391335.990532
+338007.746680 7391362.915920
+338038.653553 7391418.696365
+338082.746148 7391495.333238
+338162.973726 7391634.719362
+338198.754121 7391692.359489
+338219.509883 7391732.442623
+338230.172259 7391750.289566
+338242.368434 7391771.745891
+338248.858218 7391782.853988
+338255.611881 7391794.961914
+338265.573327 7391813.228785
+338268.179136 7391826.566500
+338272.632101 7391838.464462
+338280.061955 7391857.291238
+338284.696336 7391876.407963
+338288.835944 7391901.013748
+338289.132808 7391927.169268
+338289.561612 7391943.666442
+338286.287859 7391970.381866
+338283.080075 7392002.116430
+338318.233756 7392011.954745
+338393.637289 7392050.198194
+338450.701205 7392073.724165
+338487.108314 7392093.220825
+338586.755765 7392144.961962
+338636.868109 7392167.808049
+338679.402166 7392129.174666
+338725.680013 7392087.161863
+338742.691986 7392073.124267
+338762.573649 7392072.234420
+338782.950084 7392069.554879
+338804.027450 7392059.256643
+338828.098197 7392039.789977
+338866.781265 7391999.996793
+338869.156180 7391987.728895
+338850.453729 7391938.547319
+338844.450473 7391879.787384
+338859.796708 7391855.181599
+338959.435913 7391833.135375
+339008.591694 7391850.402418
+339035.828993 7391822.027278
+339069.333429 7391757.288367
+339101.576190 7391694.589107
+339117.112089 7391650.696625
+339127.048797 7391651.286524
+339135.657862 7391649.116896
+339148.101424 7391647.127237
+339159.530699 7391645.927442
+339168.708754 7391647.037252
+339180.204000 7391649.636807
+339194.783335 7391653.956067
+339206.097164 7391660.874882
+339292.426953 7391612.743126
+339435.969090 7391532.706836
+339484.621850 7391505.761451
+339569.401347 7391463.448699
+339601.338999 7391454.250275
+339619.711601 7391449.231135
+339637.490474 7391445.661746
+339692.797943 7391432.763955
+339765.274064 7391416.036820
+339778.418556 7391409.417954
+339810.092328 7391401.609292
+339823.781070 7391399.099722
+339857.681325 7391387.121773
+339879.138017 7391377.113488
+339895.242905 7391373.284144
+339911.718874 7391363.115885
+339993.645176 7391324.162558
+340012.347627 7391313.834327
+340033.474470 7391306.215632
+340084.815502 7391280.939961
+340113.042349 7391276.630699
+340175.441576 7391262.863058
+340254.992963 7391252.514830
+340330.248064 7391250.525171
+340355.910334 7391249.165404
+340392.836955 7391248.555508
+340414.392602 7391248.615498
+340460.282875 7391247.605671
+340506.552476 7391251.325034
+340511.310551 7391223.279838
+340529.221364 7391147.782770
+340410.277733 7391129.335930
+340349.915324 7391121.197324
+340314.423548 7391117.457964
+340232.505492 7391111.129048
+340266.917013 7391014.555590
+340275.567309 7390995.018937
+340324.607643 7390861.331836
+340338.057245 7390822.568476
+340382.355996 7390706.278396
+340561.925914 7390371.665712
+340624.424096 7390291.769397
+340644.198558 7390268.033463
+340682.172450 7390220.571593
+340717.771427 7390174.689452
+340743.087355 7390150.953518
+340808.743844 7390075.806390
+340813.378225 7390063.258539
+340841.967907 7390023.595333
+340878.589417 7389978.523053
+340921.238922 7389933.500765
+340952.962172 7389897.946855
+341001.012958 7389875.840642
+341145.124084 7389816.100875
+341187.410755 7389796.864170
+341263.968761 7389722.146968
+341284.089563 7389697.291226
+341296.895959 7389736.724471
+341350.117132 7389721.037158
+341339.322816 7389695.031613
+341336.510852 7389677.084687
+341370.650246 7389672.065547
+341391.974999 7389670.485817
+341413.299751 7389658.637847
+341517.556845 7389562.274353
+341544.414819 7389541.737871
+341564.947933 7389529.889900
+341673.154971 7389469.080316
+341763.195564 7389422.478299
+341766.139468 7389367.297751
+341765.141674 7389326.894672
+341764.267574 7389305.918265
+341762.791499 7389276.763259
+341758.998232 7389243.728917
+341755.460600 7389222.722515
+341750.760248 7389203.965728
+341835.127434 7389156.403875
+341819.459596 7389102.823053
+341806.372828 7389056.141049
+341797.623577 7389026.666098
+341787.670376 7388999.930678
+341756.870705 7388954.908389
+341726.071033 7388909.896100
+341707.904587 7388880.671106
+341695.263116 7388849.866382
+341669.839987 7388842.297679
+341672.363333 7388794.575853
+341674.730001 7388702.171681
+341673.938363 7388533.150633
+341681.294001 7388514.493828
+341691.321418 7388493.227471
+341712.456507 7388464.112458
+341738.308440 7388451.324649
+341738.258962 7388451.264659
+Region 1
+628
+348624.950055 7386618.428607
+348618.419040 7386618.698561
+348602.149227 7386623.067813
+348592.921695 7386627.407069
+348585.161992 7386637.395358
+348572.784400 7386650.783065
+348565.239099 7386659.671543
+348562.732245 7386665.630522
+348561.816913 7386674.918931
+348563.639330 7386685.797068
+348563.556868 7386694.205627
+348562.633290 7386704.613844
+348559.409014 7386710.002921
+348554.890079 7386712.832437
+348545.481130 7386715.282017
+348526.028272 7386721.400969
+348514.326871 7386727.699890
+348507.358806 7386730.619390
+348503.285168 7386730.349436
+348500.036153 7386728.319784
+348495.591435 7386723.960531
+348494.502932 7386720.961044
+348491.822907 7386713.622301
+348488.524415 7386707.383370
+348486.396888 7386705.703658
+348481.721275 7386703.993951
+348474.563547 7386705.023774
+348468.016040 7386707.063425
+348463.249718 7386713.882257
+348454.780839 7386733.608878
+348450.723694 7386740.877633
+348445.693493 7386743.817129
+348439.253187 7386744.966932
+348431.608931 7386744.557003
+348413.063159 7386741.707491
+348383.384974 7386739.957790
+348372.871030 7386740.957619
+348360.979966 7386745.706806
+348349.509459 7386750.016068
+348339.498535 7386751.245857
+348332.151143 7386750.615965
+348326.362290 7386748.666299
+348323.632787 7386745.906771
+348323.179244 7386744.936938
+348322.832903 7386744.537006
+348319.740566 7386737.638188
+348319.303516 7386730.649385
+348320.334295 7386719.921222
+348318.915943 7386708.833122
+348313.959959 7386694.385597
+348308.921512 7386678.828261
+348305.037537 7386670.039767
+348300.403155 7386663.790837
+348288.396644 7386651.153002
+348268.778861 7386633.446035
+348260.780017 7386627.387073
+348247.181983 7386620.818198
+348236.107295 7386616.049015
+348232.973727 7386612.919551
+348229.246431 7386608.780260
+348223.902874 7386602.301370
+348219.045844 7386598.492022
+348214.568141 7386597.222240
+348206.297171 7386597.692159
+348195.337931 7386602.001421
+348189.458368 7386608.150368
+348186.580434 7386619.638400
+348184.345705 7386628.026963
+348180.956505 7386630.876475
+348176.256153 7386630.826484
+348170.887857 7386626.997140
+348166.665787 7386621.308114
+348163.862068 7386616.079010
+348157.900044 7386610.250008
+348149.290979 7386603.961085
+348139.222331 7386601.421520
+348131.775985 7386600.791628
+348126.053101 7386602.061411
+348117.427544 7386606.950573
+348106.600243 7386617.578753
+348093.967017 7386625.757352
+348089.777932 7386626.487227
+348086.619626 7386625.567384
+348084.401390 7386622.887843
+348081.424501 7386615.219157
+348076.171652 7386600.431690
+348072.048536 7386584.664391
+348069.154109 7386568.577146
+348064.049693 7386558.998787
+348058.821582 7386551.300106
+348051.012402 7386546.900859
+348040.836553 7386544.251313
+348009.335952 7386541.591769
+347986.988667 7386541.251827
+347973.102015 7386542.321644
+347966.529769 7386546.021010
+347963.107583 7386551.740030
+347959.908046 7386564.997759
+347957.087835 7386571.176701
+347950.128016 7386573.536297
+347943.498047 7386573.026384
+347928.316736 7386570.876752
+347911.502672 7386568.257201
+347894.564914 7386568.417174
+347874.831684 7386572.196526
+347855.436550 7386573.106371
+347837.797862 7386571.816591
+347799.304458 7386560.428542
+347797.242900 7386559.548693
+347797.209915 7386559.538695
+347774.351364 7386549.780366
+347756.498274 7386540.062031
+347743.460984 7386528.194064
+347732.674914 7386515.226285
+347723.406151 7386503.508292
+347713.972463 7386488.340890
+347703.062700 7386478.482579
+347690.586153 7386470.823891
+347669.434571 7386464.295009
+347652.942110 7386460.355684
+347630.001096 7386458.895934
+347613.137555 7386461.705453
+347600.413621 7386467.884394
+347583.063551 7386478.122640
+347553.121488 7386502.278503
+347535.524032 7386516.156126
+347521.051897 7386524.754653
+347513.844691 7386530.663641
+347498.828305 7386541.691752
+347485.955939 7386553.189782
+347477.313890 7386559.958623
+347468.407961 7386562.308220
+347448.913871 7386563.428028
+347434.458229 7386560.068604
+347414.428135 7386553.099797
+347394.579458 7386548.130649
+347362.237741 7386537.712433
+347330.794864 7386529.523836
+347301.611453 7386520.355406
+347272.188902 7386513.516578
+347259.456722 7386511.166980
+347241.405723 7386510.867032
+347232.409086 7386511.996838
+347225.539976 7386515.356263
+347220.996302 7386520.175437
+347216.823710 7386528.883945
+347211.175042 7386542.441623
+347201.296057 7386560.288566
+347189.850289 7386571.686614
+347183.475953 7386575.935886
+347153.789523 7386594.892639
+347140.133765 7386602.391354
+347111.181249 7386610.170022
+347082.245226 7386615.629087
+347055.717102 7386615.679078
+347031.349490 7386613.429464
+347010.783391 7386609.230183
+346997.251326 7386605.430834
+346978.730292 7386600.481681
+346970.104735 7386596.292399
+346949.975686 7386579.245319
+346943.997169 7386575.415975
+346936.476606 7386572.016557
+346927.958250 7386567.497331
+346920.874738 7386561.768313
+346906.270664 7386552.649875
+346891.369725 7386543.521438
+346877.177962 7386534.403000
+346869.377028 7386529.443850
+346844.720798 7386516.116132
+346813.657247 7386500.508806
+346793.157118 7386490.220568
+346762.497632 7386474.943185
+346745.667075 7386464.694940
+346730.362071 7386454.896619
+346708.097249 7386437.829542
+346700.988998 7386434.210162
+346694.276566 7386432.590440
+346684.381089 7386432.260496
+346677.957276 7386431.860565
+346671.640663 7386430.800746
+346655.642976 7386428.411156
+346645.574328 7386425.651628
+346636.511720 7386423.891930
+346622.633314 7386423.531991
+346605.398692 7386422.792118
+346591.841889 7386421.322370
+346573.980553 7386422.132231
+346562.757434 7386422.012252
+346536.237556 7386420.512508
+346518.499914 7386419.112748
+346506.064598 7386417.433036
+346494.775508 7386414.543531
+346482.768996 7386411.094122
+346469.335887 7386407.184791
+346461.732862 7386402.785545
+346449.553179 7386396.786573
+346435.938652 7386391.217526
+346425.449447 7386388.897924
+346411.686488 7386388.308025
+346399.630499 7386389.177876
+346390.840017 7386391.077550
+346374.050691 7386395.656766
+346360.122808 7386401.165822
+346341.857407 7386410.824168
+346324.515584 7386419.832625
+346312.212208 7386425.571642
+346290.804993 7386432.990371
+346266.627045 7386442.588727
+346252.872332 7386449.977461
+346242.704730 7386455.856454
+346211.385546 7386475.123154
+346174.087844 7386498.989066
+346160.300147 7386510.467100
+346142.677952 7386526.784305
+346119.910109 7386547.360781
+346106.518231 7386558.848813
+346091.501845 7386569.986905
+346072.997303 7386583.084661
+346055.127721 7386594.302740
+346047.417495 7386599.871786
+346043.599491 7386603.921092
+346039.608315 7386614.629258
+346035.336768 7386632.186251
+346028.434673 7386658.251786
+346023.841522 7386668.060106
+346009.773453 7386685.517116
+345992.151258 7386702.054283
+345975.180515 7386715.172036
+345948.602914 7386738.807987
+345939.037286 7386746.016753
+345924.680599 7386752.735602
+345912.583378 7386758.034694
+345899.892429 7386761.334129
+345878.542938 7386763.653732
+345863.295658 7386767.923000
+345845.409583 7386780.020928
+345826.542208 7386798.427775
+345815.921063 7386809.055955
+345812.375183 7386816.224727
+345800.022330 7386845.109779
+345783.818487 7386882.143435
+345767.293040 7386910.318609
+345761.759820 7386922.006607
+345757.257378 7386932.924737
+345747.914398 7386947.992156
+345743.329494 7386957.470532
+345737.482917 7386969.698438
+345729.393364 7386991.984620
+345722.062465 7387019.039986
+345714.814029 7387048.314972
+345708.827265 7387074.050563
+345707.095557 7387083.448953
+345704.885567 7387089.737876
+345701.265472 7387094.467066
+345693.637708 7387101.915790
+345685.267784 7387111.344175
+345679.215051 7387114.163692
+345670.911097 7387118.392968
+345662.574157 7387124.621901
+345655.292736 7387128.421250
+345636.557300 7387134.420223
+345625.993878 7387138.739483
+345611.332080 7387145.898256
+345586.783052 7387160.805703
+345556.799757 7387178.432684
+345538.212753 7387189.310820
+345515.040845 7387200.028984
+345494.334560 7387208.337561
+345483.795877 7387211.437030
+345466.330360 7387212.466854
+345455.602014 7387213.906607
+345429.205830 7387220.275516
+345371.317291 7387232.943346
+345320.471033 7387244.921295
+345285.762648 7387256.289347
+345268.561011 7387261.758411
+345246.007570 7387271.266782
+345236.359480 7387276.255927
+345228.113250 7387284.034595
+345211.703251 7387301.251646
+345204.974326 7387310.260103
+345186.849111 7387345.394085
+345173.226338 7387369.279993
+345162.366053 7387383.337585
+345136.604828 7387415.852016
+345124.713763 7387430.559497
+345114.496684 7387441.747580
+345087.655203 7387461.404213
+345066.190265 7387473.802090
+345041.979331 7387486.389933
+345016.853067 7387498.187912
+344968.315753 7387516.554766
+344944.929443 7387524.563395
+344919.778439 7387529.612530
+344902.263446 7387535.071595
+344891.782486 7387542.270362
+344880.542874 7387552.888543
+344867.728232 7387568.485871
+344847.417765 7387596.950995
+344833.226003 7387617.287512
+344822.266762 7387630.795198
+344820.040280 7387638.303912
+344807.077205 7387657.990540
+344798.064075 7387670.178452
+344781.192287 7387683.296205
+344770.604127 7387690.714934
+344753.979726 7387699.063504
+344734.634069 7387704.612554
+344717.770527 7387707.202110
+344703.809659 7387705.172458
+344688.364469 7387703.762699
+344681.907670 7387702.442925
+344671.204063 7387700.733218
+344663.493837 7387698.773554
+344654.117873 7387748.874972
+344643.826577 7387769.441449
+344625.643638 7387801.086029
+344607.435961 7387817.693184
+344584.503194 7387839.849389
+344582.919917 7387844.588577
+344545.745910 7387891.260583
+344527.546479 7387923.695027
+344507.772018 7387941.102045
+344482.621014 7387943.091704
+344469.798125 7387959.298928
+344455.342483 7387976.805930
+344449.512398 7387993.163128
+344443.632836 7388015.229348
+344447.186961 7388048.063724
+344452.373840 7388067.560384
+344458.278141 7388091.256325
+344464.957588 7388113.822460
+344472.057593 7388130.669574
+344479.190582 7388143.687344
+344488.550054 7388164.373801
+344512.521846 7388204.886861
+344534.168202 7388220.074260
+344561.751843 7388247.759518
+344582.078802 7388276.164652
+344586.548259 7388288.412554
+344592.889610 7388305.999542
+344609.002745 7388338.943899
+344613.488695 7388350.041998
+344621.330860 7388369.948588
+344635.588593 7388396.004125
+344655.511486 7388429.358411
+344678.468992 7388462.742693
+344742.723621 7388539.519542
+344707.908035 7388601.258966
+344673.249128 7388648.450883
+344664.409169 7388659.439001
+344647.784768 7388685.894469
+344617.999383 7388724.997771
+344611.699262 7388735.276010
+344588.453138 7388761.841460
+344573.989250 7388775.309153
+344560.407708 7388785.597391
+344548.112578 7388790.206601
+344534.308388 7388794.015949
+344514.509188 7388794.235911
+344493.769918 7388786.457244
+344471.562819 7388776.338977
+344431.436661 7388767.270530
+344403.572647 7388770.320008
+344380.408985 7388786.367259
+344317.910803 7388845.687098
+344291.803237 7388866.263573
+344247.487993 7388878.311510
+344275.343761 7388937.651345
+344297.361196 7388985.803097
+344315.057607 7389024.316500
+344326.618823 7389052.931599
+344277.578489 7389086.155908
+344232.479854 7389121.769808
+344188.189349 7389145.835685
+344160.490260 7389157.373709
+344091.667219 7389207.995038
+343954.177816 7389319.795887
+343933.636455 7389312.687105
+343899.678477 7389324.535076
+343849.920722 7389339.542505
+343759.088491 7389370.347229
+343684.847676 7389396.412764
+343647.723146 7389408.260734
+343556.280694 7389407.100933
+343424.959471 7389450.123564
+343346.801697 7389492.776258
+343297.827333 7389533.839224
+343254.386190 7389578.071647
+343272.931963 7389623.483868
+343300.194002 7389686.283112
+343359.500892 7389827.928849
+343368.093465 7389852.134703
+343425.091411 7389976.823345
+343456.517796 7390055.299902
+343478.238368 7390108.400807
+343542.657921 7390260.874689
+343554.285107 7390292.379293
+343578.949582 7390359.227842
+343591.219974 7390388.512826
+343627.915700 7390476.117820
+343666.491567 7390554.604376
+343664.232100 7390573.751096
+343659.482271 7390595.647346
+343657.057879 7390606.285523
+343648.292136 7390625.042311
+343623.965756 7390672.784133
+343581.283266 7390750.190874
+343537.767907 7390829.067363
+343523.873008 7390860.571967
+343496.000748 7390918.891977
+343475.591328 7390947.437087
+343437.444265 7390999.768123
+343499.142562 7390983.950833
+343526.899375 7390982.851021
+343557.682554 7390998.978259
+343566.588483 7391003.997399
+343576.450975 7391006.806918
+343619.380851 7391029.043109
+343654.773673 7391049.489607
+343671.595984 7391056.728367
+343684.781707 7391066.896625
+343710.848042 7391075.585137
+343741.655959 7391073.215543
+343768.060390 7391064.677005
+343794.374112 7391057.928161
+343826.427210 7391048.609757
+343928.837149 7391016.355282
+343968.328347 7391005.297176
+344004.661240 7390992.659341
+344028.377399 7390987.510223
+344047.360222 7390980.391443
+344080.576039 7390971.682934
+344080.584285 7390971.682934
+344090.867335 7390965.364017
+344208.738956 7390876.759194
+344291.011599 7390883.088110
+344333.727074 7390886.257567
+344357.731851 7390887.677324
+344410.466496 7390894.166212
+344457.140161 7390897.325671
+344506.972133 7390902.864722
+344552.070769 7390909.193638
+344596.369520 7390914.732689
+344613.043398 7390915.402575
+344646.201491 7390918.682013
+344697.616740 7390926.600656
+344761.706444 7390934.509302
+344786.222488 7390936.878896
+344807.910074 7390937.458796
+344817.739581 7390934.599286
+344827.882445 7390928.310364
+344840.812535 7390925.810792
+344929.410037 7390874.389600
+344983.991837 7390852.233395
+345006.701957 7390837.985835
+345043.323467 7390825.338002
+345056.146356 7390819.509000
+345070.107224 7390813.909959
+345089.213741 7390804.771525
+345106.580302 7390793.013539
+345130.156276 7390774.256752
+345141.395888 7390765.658224
+345149.328762 7390756.519790
+345188.003584 7390719.026212
+345229.531601 7390684.702091
+345238.899319 7390678.043232
+345250.757399 7390674.673809
+345284.599929 7390662.295929
+345303.607491 7390662.315926
+345319.613425 7390663.535717
+345391.949360 7390687.321643
+345467.377632 7390713.707123
+345506.308087 7390720.585945
+345538.542602 7390722.505616
+345566.381877 7390720.206010
+345600.447056 7390712.697296
+345633.860782 7390701.719177
+345677.722483 7390675.953590
+345689.225975 7390667.705003
+345772.290256 7390589.388418
+345820.126640 7390549.035330
+345848.238040 7390525.309394
+345864.903673 7390511.921687
+345922.990121 7390469.149014
+345960.568194 7390446.992809
+345991.499805 7390433.065195
+346028.929446 7390421.347202
+346068.940157 7390415.348229
+346121.518124 7390407.269613
+346124.049717 7390406.149805
+346162.262750 7390396.271497
+346216.077651 7390380.554189
+346251.132377 7390365.706732
+346259.733196 7390332.622399
+346258.619955 7390312.675816
+346260.425879 7390295.528753
+346260.211477 7390267.953477
+346257.721116 7390242.447846
+346257.539699 7390211.333175
+346257.366528 7390178.988716
+346260.549573 7390148.014021
+346266.519844 7390104.881409
+346272.160266 7390073.496785
+346274.139361 7390050.030805
+346272.152019 7390025.764961
+346266.412643 7390008.197970
+346261.753522 7389985.341885
+346290.829732 7389970.594412
+346353.327914 7389942.909154
+346446.666998 7389901.756203
+346482.265976 7389883.559320
+346533.689470 7389855.884060
+346555.838846 7389846.395686
+346596.971044 7389825.029346
+346613.529476 7389818.170520
+346642.853072 7389803.673004
+346682.088637 7389785.596100
+346689.526737 7389776.777611
+346727.500629 7389688.172788
+346744.900176 7389680.264143
+346789.207173 7389664.446852
+346824.006267 7389647.039834
+346862.763551 7389631.212545
+346901.537327 7389614.605389
+346914.986929 7389609.066338
+346937.136305 7389666.816446
+346942.661279 7389666.016583
+346945.036194 7389651.779022
+346998.826356 7389631.212545
+347092.247903 7389602.337491
+347103.372068 7389624.803642
+347111.766731 7389630.872603
+347120.920047 7389635.421824
+347132.506001 7389637.541461
+347155.463507 7389628.053086
+347179.979551 7389628.842951
+347198.962374 7389644.390287
+347263.843717 7389716.647910
+347274.910158 7389735.634658
+347278.076711 7389752.251812
+347277.293319 7389756.211134
+347325.542015 7389768.079101
+347351.806259 7389759.660543
+347365.882575 7389756.201135
+347384.873644 7389768.069102
+347414.931155 7389775.977748
+347456.863238 7389777.567475
+347455.032574 7389732.195247
+347452.072178 7389660.187581
+347444.642324 7389611.815867
+347434.227335 7389576.031997
+347427.663335 7389551.276237
+347422.270300 7389537.198648
+347408.606296 7389490.406663
+347349.266420 7389358.289294
+347304.398679 7389191.807811
+347311.721332 7389112.731356
+347320.503568 7389014.618162
+347283.568701 7388977.594503
+347309.140262 7388908.016422
+347324.527728 7388857.994990
+347337.993823 7388809.903227
+347336.072451 7388756.032455
+347328.378718 7388709.860364
+347314.912623 7388659.848930
+347282.208073 7388498.246611
+347270.663350 7388452.074520
+347243.731160 7388357.810667
+347211.026610 7388311.638576
+347161.013221 7388255.848132
+347116.763947 7388211.605710
+347070.593302 7388194.288677
+347005.175954 7388171.202631
+346951.484746 7388056.922206
+347316.833995 7388213.535380
+347382.243097 7388246.239778
+347477.115980 7388277.604405
+347543.613584 7388296.081241
+347815.467070 7388387.875517
+347900.848542 7388413.761083
+348155.195280 7388475.740467
+348188.287404 7388482.649283
+348226.178833 7388490.307971
+348332.382038 7388519.662943
+348377.777538 7388513.813945
+348449.536237 7388462.552725
+348518.004690 7388356.880826
+348540.327236 7388321.976805
+348566.542003 7388145.996949
+348543.642221 7388151.625984
+348523.826529 7388153.885597
+348486.248456 7388152.355859
+348451.103020 7388143.267416
+348414.456772 7388120.881251
+348437.397785 7388051.263176
+348474.967612 7387896.399702
+348505.833253 7387775.370434
+348543.180432 7387642.613174
+348546.173814 7387621.106858
+348569.057104 7387545.669779
+348579.216460 7387531.412221
+348599.180584 7387515.814893
+348644.246235 7387422.550868
+348664.367037 7387377.438596
+348666.403856 7387355.312386
+348664.647409 7387325.667464
+348657.588636 7387298.502117
+348654.554023 7387279.775325
+348655.287938 7387242.481713
+348665.612218 7387218.465826
+348677.346605 7387184.311677
+348680.290509 7387132.590536
+348680.331740 7387092.227450
+348681.082147 7387054.943836
+348683.440569 7387031.767806
+348686.590629 7387007.461969
+348691.802247 7386993.864299
+348696.881925 7386968.078715
+348700.708176 7386947.602223
+348698.852774 7386921.416708
+348686.186564 7386870.785381
+348679.869951 7386843.889988
+348670.378540 7386813.835136
+348667.211987 7386750.545977
+348643.759707 7386622.447919
+348624.950055 7386618.428607
+Region 1
+693
+358421.125722 7403268.426613
+358437.626429 7403275.425415
+358452.123303 7403278.924815
+358470.116578 7403276.425243
+358483.615658 7403268.426613
+358494.616129 7403256.928583
+358510.605571 7403229.433293
+358530.107906 7403202.437917
+358547.103387 7403189.440143
+358575.594114 7403176.442369
+358600.093666 7403166.943996
+358619.587755 7403161.944853
+358656.580345 7403157.945538
+358684.073278 7403158.945366
+358709.570624 7403166.943996
+358727.572145 7403180.441684
+358742.563792 7403199.438430
+358756.062872 7403226.433806
+358757.563686 7403244.930638
+358754.067284 7403254.928925
+358742.069019 7403264.427298
+358706.074222 7403277.924986
+358681.079897 7403286.923445
+358669.081631 7403289.922931
+358658.584180 7403294.422161
+358651.080110 7403301.920876
+358646.082894 7403309.919506
+358645.085100 7403320.417708
+358649.579296 7403333.915396
+358659.078953 7403350.412570
+358674.581867 7403366.409830
+358692.575142 7403381.907175
+358705.076428 7403391.905463
+358733.567155 7403409.402465
+358744.567626 7403418.900838
+358769.058932 7403453.894844
+358783.555805 7403474.391333
+358796.057091 7403485.889364
+358815.056406 7403496.387566
+358827.046425 7403499.886966
+358844.050153 7403498.387223
+358861.540408 7403494.387908
+358876.540302 7403487.889021
+358886.542980 7403478.890563
+358893.041009 7403464.892960
+358901.534627 7403449.395615
+358912.032078 7403440.397156
+358918.084812 7403406.143024
+358924.310716 7403371.828901
+358926.949510 7403346.343267
+358931.872509 7403320.617673
+358934.494811 7403297.401650
+358941.256720 7403256.018739
+358948.975192 7403230.303144
+358955.176357 7403201.548069
+358964.403889 7403178.352042
+358974.653954 7403154.406144
+358990.989737 7403129.460417
+359007.317274 7403109.323866
+359018.029127 7403094.466411
+359030.802538 7403074.559821
+359043.303824 7403056.422928
+359056.835889 7403036.276379
+359071.662611 7403010.320825
+359077.055646 7402993.933632
+359085.005013 7402972.757259
+359087.602575 7402956.859982
+359093.020349 7402935.673611
+359102.750901 7402911.727713
+359118.336277 7402885.772159
+359131.084949 7402870.674745
+359147.890767 7402857.347028
+359191.645267 7402831.231501
+359197.755724 7402826.962232
+359218.626934 7402810.615032
+359230.097441 7402798.787058
+359241.856566 7402777.880639
+359246.235314 7402761.483448
+359246.334269 7402735.737858
+359246.424977 7402713.021749
+359246.540425 7402683.486808
+359245.864234 7402660.260787
+359245.699309 7402638.294549
+359245.105581 7402596.391727
+359245.740540 7402563.077433
+359247.092922 7402542.380978
+359250.960404 7402525.233916
+359253.566213 7402508.076854
+359242.161676 7402503.897570
+359176.727836 7402484.800841
+359131.703417 7402472.173004
+359087.957163 7402451.566534
+359057.602788 7402437.518940
+359009.898344 7402414.352908
+358962.523749 7402388.397354
+358917.656008 7402361.651936
+358872.491403 7402335.306448
+358828.778134 7402312.430367
+358780.216082 7402284.505150
+358734.268084 7402258.919533
+358692.121600 7402234.173771
+358646.899271 7402210.497827
+358591.929897 7402179.033217
+358564.799798 7402164.825650
+358523.576891 7402143.569291
+358480.811939 7402119.133477
+358439.778696 7402095.147585
+358393.641035 7402072.261506
+358351.981078 7402049.375426
+358283.496132 7402010.452093
+358248.276481 7401982.366904
+358186.165872 7401945.723180
+358127.353755 7401904.070315
+358069.176598 7401832.972494
+357707.249535 7401412.134579
+357576.678719 7401300.513699
+357516.844069 7401226.606359
+357445.456450 7401181.944009
+357401.693704 7401161.747468
+357338.387392 7401144.500423
+357046.808922 7401127.353360
+356501.015654 7401093.349184
+356471.057098 7401095.528811
+356449.493205 7401093.189212
+356422.594001 7401092.089400
+356392.643691 7401093.759114
+356374.576200 7401092.499330
+356142.675702 7401107.746718
+355914.807610 7401134.702101
+355875.423613 7401138.321481
+355763.497524 7401149.569554
+355718.778215 7401154.298744
+355552.657899 7401170.745927
+355478.656225 7401173.895388
+355353.692846 7401188.592870
+355169.933842 7401203.300351
+355061.875236 7401219.677546
+354955.639046 7401235.564824
+354839.787752 7401250.642242
+354723.985935 7401267.009438
+354654.033160 7401277.627619
+354578.646120 7401280.797076
+354543.731579 7401283.976532
+354495.317959 7401288.735716
+354447.687731 7401293.524896
+354415.980974 7401296.844328
+354406.440085 7401297.464221
+354399.298849 7401303.813134
+354264.209099 7401307.322533
+354118.786821 7401318.460625
+354002.506723 7401333.967969
+353786.529696 7401356.164167
+353556.097027 7401378.870277
+353400.210283 7401391.408130
+353398.668238 7401399.726705
+353396.821082 7401405.275756
+353394.355459 7401408.355227
+353391.889836 7401410.824804
+353386.035012 7401411.434699
+353372.478209 7401411.434699
+353353.990160 7401410.204910
+353344.127668 7401412.364540
+353339.814890 7401416.063906
+353336.120578 7401423.142694
+353334.578533 7401429.921533
+353333.654955 7401441.019632
+353333.341599 7401450.258049
+353335.502111 7401459.506465
+353343.204090 7401486.931767
+353350.906070 7401509.727863
+353359.226517 7401530.064379
+353372.783320 7401552.560526
+353381.103767 7401567.957888
+353388.500635 7401581.825513
+353395.279037 7401596.922927
+353408.835840 7401619.419073
+353423.316221 7401646.834377
+353433.277668 7401664.651326
+353443.651426 7401681.038519
+353447.964205 7401690.586883
+353456.903119 7401729.410233
+353459.368742 7401752.216326
+353460.292319 7401775.322369
+353459.781053 7401781.101379
+353457.826696 7401796.888674
+353450.124717 7401854.198858
+353437.796602 7401932.765400
+353434.712512 7401953.721810
+353427.818663 7401980.027304
+353420.850598 7402007.642574
+353411.301463 7402029.828774
+353404.044780 7402037.947383
+353404.646755 7402038.407305
+353372.593656 7402079.750223
+353339.179930 7402122.042978
+353300.966897 7402157.266945
+353263.817628 7402182.392641
+353236.596821 7402205.138745
+353224.887173 7402214.697108
+353213.795993 7402221.785893
+353199.315612 7402229.484575
+353167.757287 7402239.842800
+353154.002575 7402244.761958
+353134.343561 7402256.060023
+353108.796738 7402265.888339
+353075.877785 7402277.676320
+353027.719798 7402292.913710
+352992.838243 7402303.231942
+352946.824276 7402314.340040
+352962.228235 7402319.269195
+352981.334751 7402330.977190
+352998.585865 7402351.313706
+353007.829890 7402367.330963
+353012.142669 7402383.968113
+353014.608292 7402398.755580
+353014.608292 7402422.791463
+353013.379603 7402450.526712
+353013.379603 7402473.942701
+353017.692382 7402501.667952
+353024.470783 7402520.154786
+353031.249185 7402540.491302
+353036.180431 7402559.598029
+353034.333275 7402576.235179
+353020.776472 7402597.801485
+352996.738710 7402623.687051
+352982.563439 7402639.704308
+352974.556349 7402663.740191
+352976.403505 7402684.076707
+352988.113153 7402700.093964
+353013.379603 7402711.192063
+353030.020497 7402714.881431
+353056.515636 7402714.881431
+353079.934931 7402709.952275
+353108.895693 7402701.323753
+353139.093389 7402692.705229
+353178.526864 7402695.164808
+353211.091229 7402710.022263
+353258.086498 7402749.015584
+353274.578959 7402767.512415
+353284.078617 7402771.011816
+353301.577118 7402772.011645
+353314.078404 7402769.012159
+353330.570865 7402761.013529
+353348.069367 7402756.514299
+353363.069260 7402752.514984
+353381.565555 7402756.014385
+353401.059645 7402762.013357
+353416.554312 7402771.511730
+353436.551421 7402789.008733
+353451.551315 7402805.005993
+353470.542384 7402829.501797
+353474.541806 7402842.499571
+353475.547846 7402861.996231
+353473.544012 7402874.994005
+353468.546796 7402888.991607
+353457.051551 7402900.489638
+353436.551421 7402909.488096
+353395.559409 7402923.985613
+353368.066476 7402935.983558
+353347.071573 7402949.481246
+353327.074463 7402973.977050
+353316.073992 7402997.473025
+353314.078404 7403017.469600
+353319.075620 7403037.966089
+353334.067267 7403075.959581
+353346.065532 7403087.957526
+353359.564612 7403093.456584
+353381.062535 7403095.456242
+353408.555468 7403093.456584
+353470.542384 7403079.458982
+353525.454034 7403064.011628
+353591.522834 7403037.966089
+353616.022385 7403022.968658
+353626.519837 7403014.970028
+353631.517053 7403004.471826
+353634.015660 7402989.974310
+353640.513690 7402949.981160
+353645.510906 7402936.983387
+353656.008358 7402923.985613
+353670.010457 7402917.486726
+353732.500393 7402898.489980
+353793.984289 7402885.992121
+353828.478272 7402869.494947
+353849.976195 7402856.997087
+353867.474696 7402852.497858
+353885.467972 7402855.997259
+353897.466237 7402861.496317
+353905.465081 7402874.494090
+353906.965895 7402888.991607
+353905.465081 7402906.988524
+353898.967051 7402917.986641
+353887.471806 7402926.985099
+353863.970048 7402936.483472
+353845.473753 7402944.982016
+353827.975252 7402955.980133
+353817.980820 7402972.477307
+353814.979192 7402992.973796
+353817.477800 7403012.970371
+353822.483262 7403024.468401
+353830.482106 7403031.467202
+353840.476537 7403035.466517
+353851.971783 7403036.966260
+353877.469128 7403037.966089
+353905.465081 7403034.466689
+353934.458828 7403034.466689
+353962.454781 7403039.465832
+353986.946086 7403048.464291
+353998.449578 7403062.461893
+354003.949814 7403079.458982
+354005.945401 7403096.456070
+354004.444587 7403114.452988
+353996.948764 7403139.948620
+353975.953860 7403194.939201
+353964.953389 7403237.431922
+353964.953389 7403265.427127
+353968.449791 7403291.422674
+353980.951076 7403323.917108
+353992.949342 7403342.913854
+354015.948079 7403366.909744
+354028.944139 7403377.907860
+354060.436493 7403395.904777
+354103.143722 7403415.361445
+354117.426193 7403421.400410
+354136.425509 7403430.398869
+354152.917970 7403437.397670
+354230.902573 7403486.889193
+354257.900733 7403500.886795
+354282.895058 7403508.885425
+354303.889961 7403511.884911
+354328.389512 7403509.885254
+354351.883023 7403502.886452
+354391.877242 7403487.389107
+354452.866364 7403455.894502
+354509.353044 7403437.897584
+354567.843558 7403425.399725
+354581.837411 7403422.900153
+354620.833836 7403421.900325
+354635.330709 7403419.900667
+354669.321672 7403414.901524
+354689.821801 7403411.402123
+354724.315784 7403410.402294
+354767.303384 7403405.903065
+354801.797367 7403399.904092
+354838.789958 7403397.404521
+354867.288931 7403396.404692
+354879.781971 7403392.405377
+354891.285462 7403383.406918
+354899.779080 7403369.409316
+354908.280944 7403352.912142
+354926.274219 7403336.414968
+354940.276319 7403326.916595
+354960.265182 7403322.417365
+354981.763105 7403312.918992
+354997.266019 7403302.920705
+355015.259294 7403297.421647
+355040.756639 7403287.923274
+355057.562457 7403281.674344
+355079.744817 7403273.425757
+355106.742977 7403260.927898
+355121.239850 7403256.428668
+355139.233125 7403254.429011
+355158.232441 7403255.928754
+355166.231284 7403261.427812
+355168.729892 7403272.925843
+355171.228500 7403287.423359
+355169.232912 7403300.921047
+355164.227450 7403314.918650
+355156.228607 7403342.413940
+355153.235225 7403362.910429
+355155.230813 7403387.406233
+355163.229657 7403408.402637
+355177.726530 7403428.399211
+355207.223297 7403444.896386
+355243.218094 7403461.393560
+355274.207429 7403475.391162
+355302.706402 7403475.391162
+355321.705717 7403472.391676
+355347.697836 7403456.394416
+355366.194131 7403439.397328
+355381.004362 7403420.690532
+355394.684858 7403403.403493
+355412.686380 7403374.408460
+355417.180576 7403358.911114
+355424.181625 7403332.415653
+355431.182675 7403312.419078
+355439.181519 7403296.921732
+355442.677921 7403286.923445
+355444.178735 7403280.924473
+355451.179784 7403275.925329
+355459.673402 7403272.925843
+355476.668883 7403266.926870
+355503.164022 7403266.926870
+355531.662996 7403269.926356
+355552.154879 7403280.924473
+355571.154194 7403292.922417
+355591.151303 7403306.920020
+355601.648755 7403321.417536
+355604.147363 7403339.414454
+355602.151775 7403360.910772
+355594.647705 7403384.406747
+355584.150254 7403397.404521
+355560.153722 7403412.401952
+355524.661946 7403420.900496
+355493.672611 7403427.399383
+355487.174581 7403436.897756
+355486.671561 7403455.394587
+355490.167963 7403466.392704
+355501.671455 7403476.890905
+355513.166700 7403484.389621
+355534.161603 7403498.387223
+355550.159291 7403511.884911
+355567.154772 7403532.381400
+355586.648862 7403551.878061
+355625.142266 7403585.372323
+355656.642867 7403608.368384
+355690.130810 7403632.864188
+355726.125607 7403654.860421
+355738.379505 7403661.749241
+355758.120982 7403672.857338
+355781.614493 7403688.854598
+355796.614386 7403699.352800
+355809.107426 7403705.351772
+355829.104535 7403705.851686
+355855.104900 7403700.852543
+355871.102588 7403697.853056
+355896.096913 7403701.352457
+355925.585434 7403705.851686
+355954.084407 7403705.351772
+355973.578496 7403701.352457
+355989.081410 7403691.354170
+355997.575027 7403681.355882
+356001.071429 7403667.858194
+355998.572821 7403651.860935
+355989.576183 7403633.864017
+355986.079782 7403622.865901
+355983.078154 7403610.867956
+355985.081988 7403596.370440
+355990.573977 7403588.871724
+356006.571665 7403579.873265
+356054.061707 7403562.376262
+356131.551536 7403540.879945
+356199.038688 7403527.382257
+356229.030229 7403517.883884
+356245.027916 7403506.885767
+356252.028966 7403494.387908
+356256.531408 7403477.390820
+356259.524790 7403459.393902
+356254.527574 7403438.397499
+356246.528730 7403423.899982
+356233.029651 7403406.402979
+356198.040894 7403378.407775
+356156.545862 7403356.911457
+356074.058816 7403317.418222
+356046.071110 7403302.420790
+356026.074000 7403283.424044
+356016.574343 7403268.426613
+356009.573293 7403241.931152
+356010.571087 7403222.434491
+356015.073529 7403203.937660
+356028.069588 7403189.940057
+356045.065069 7403180.941599
+356067.560787 7403180.441684
+356124.550487 7403189.440143
+356213.032542 7403206.437232
+356263.524212 7403212.936118
+356287.025969 7403210.936461
+356308.020872 7403202.437917
+356326.014148 7403187.940400
+356339.513227 7403169.443568
+356341.508815 7403150.946737
+356339.513227 7403137.948963
+356331.011363 7403131.949991
+356321.016932 7403127.450761
+356308.020872 7403127.450761
+356273.023869 7403125.951018
+356254.527574 7403122.951532
+356230.531043 7403116.452645
+356208.538346 7403107.454186
+356196.540080 7403090.457098
+356190.536824 7403063.461722
+356191.039844 7403041.965404
+356195.039266 7403021.968829
+356210.533934 7402995.473368
+356236.534299 7402969.477821
+356254.024554 7402954.980304
+356270.022242 7402941.982530
+356285.022135 7402927.485014
+356303.015410 7402916.986812
+356321.932263 7402910.227970
+356333.015197 7402905.988696
+356354.513121 7402901.989381
+356377.503612 7402905.488781
+356390.499671 7402919.986298
+356398.003741 7402941.482616
+356419.501664 7403007.471313
+356426.494468 7403026.967973
+356437.997960 7403043.965062
+356455.991235 7403058.462578
+356469.985088 7403062.961808
+356486.485796 7403061.462064
+356498.978835 7403056.962835
+356509.484533 7403048.964205
+356512.477915 7403040.965575
+356512.477915 7403030.967288
+356510.977101 7403017.469600
+356502.978257 7402987.474738
+356502.978257 7402968.477992
+356503.984297 7402952.480732
+356507.983719 7402939.482958
+356517.978151 7402925.985270
+356533.472818 7402906.988524
+356579.965067 7402868.995032
+356593.464146 7402856.997087
+356597.463568 7402842.499571
+356597.463568 7402829.001883
+356591.963332 7402817.003938
+356574.464831 7402809.505222
+356547.969692 7402806.005822
+356515.479543 7402801.506593
+356492.480806 7402790.508476
+356475.485324 7402774.511217
+356470.488109 7402759.513785
+356470.991129 7402740.517039
+356475.988344 7402721.020379
+356489.487424 7402703.523376
+356533.472818 7402666.529713
+356563.967379 7402638.534508
+356593.464146 7402613.538790
+356617.963697 7402592.542386
+356634.456159 7402577.544955
+356639.956395 7402564.047267
+356640.459415 7402547.550093
+356636.954767 7402529.053261
+356623.958707 7402510.556430
+356605.965432 7402498.558485
+356586.463096 7402494.059255
+356560.817319 7402483.131127
+356541.405692 7402477.952014
+356519.808814 7402476.712227
+356501.304272 7402476.092333
+356477.860239 7402476.712227
+356455.026426 7402478.561910
+356439.605975 7402470.543284
+356425.653353 7402453.926130
+356418.495624 7402423.071415
+356422.495046 7402391.576810
+356416.994810 7402357.582633
+356404.996545 7402326.587942
+356391.002691 7402300.092480
+356379.507446 7402265.598389
+356376.002798 7402233.103955
+356379.004426 7402206.608493
+356383.003848 7402167.115258
+356384.001642 7402134.120910
+356386.005476 7402104.126047
+356388.001063 7402083.129644
+356395.999907 7402060.633497
+356409.498987 7402029.638806
+356420.499458 7402014.141461
+356435.491106 7402000.143859
+356451.488793 7401990.145571
+356474.990550 7401981.147113
+356494.987660 7401977.147798
+356527.980829 7401977.647712
+356553.972948 7401980.647198
+356572.972263 7401988.145914
+356587.963910 7401996.644458
+356607.466246 7402014.141461
+356637.457787 7402053.634696
+356649.950826 7402069.132042
+356660.951298 7402077.130672
+356672.949563 7402083.629558
+356684.444809 7402087.628873
+356693.944467 7402087.628873
+356704.441918 7402086.129130
+356717.940998 7402078.630415
+356727.440655 7402067.132384
+356739.941941 7402046.635895
+356756.434402 7402029.638806
+356768.432668 7402021.640177
+356783.432562 7402012.141804
+356798.927229 7401997.144372
+356829.421790 7401972.148654
+356844.421683 7401958.151052
+356851.917507 7401943.153621
+356860.914145 7401917.158073
+356867.412174 7401898.161327
+356886.411490 7401882.164068
+356906.408599 7401876.665010
+356926.405709 7401877.164924
+356939.047180 7401877.574854
+356946.402818 7401879.664496
+356955.894229 7401885.663468
+356963.398299 7401894.162012
+356968.395515 7401909.659358
+356969.393309 7401933.655248
+356965.393887 7401955.651480
+356956.900269 7401983.146770
+356952.397828 7402001.643602
+356954.896435 7402019.140605
+356961.394465 7402037.637436
+356970.399349 7402064.632812
+356994.387634 7402120.623222
+357021.888813 7402182.112689
+357032.881039 7402215.107037
+357048.878726 7402256.599930
+357061.380012 7402289.094364
+357069.873629 7402298.592737
+357079.373287 7402308.591024
+357104.870632 7402324.588284
+357122.369134 7402330.587257
+357139.364615 7402331.587085
+357159.361724 7402329.587428
+357172.357784 7402322.588627
+357192.857913 7402304.591710
+357215.848404 7402272.597190
+357235.845514 7402249.101215
+357247.843779 7402242.602328
+357258.844251 7402236.103441
+357275.336712 7402218.606438
+357293.338234 7402199.609692
+357312.329303 7402185.612090
+357332.326412 7402182.112689
+357366.325621 7402185.612090
+357394.816348 7402197.610035
+357424.807889 7402224.105496
+357442.306390 7402244.601985
+357458.807098 7402265.598389
+357547.289153 7402361.082033
+357579.779301 7402397.075868
+357628.770158 7402435.069360
+357670.265190 7402464.564308
+357710.754183 7402499.558314
+357739.253156 7402530.553004
+357764.247481 7402548.549922
+357793.241228 7402564.547182
+357811.737523 7402573.045726
+357842.735104 7402588.043157
+357871.728851 7402594.542044
+357897.720970 7402594.042129
+357922.220521 7402588.543071
+357948.715661 7402577.045041
+357978.204181 7402553.049151
+358014.701998 7402515.555573
+358036.199921 7402490.059941
+358060.691226 7402469.563451
+358109.187309 7402434.069531
+358137.175016 7402419.572014
+358163.175381 7402409.573727
+358183.172490 7402403.574755
+358206.666001 7402403.074840
+358228.163925 7402409.073813
+358250.659642 7402424.571158
+358279.653389 7402441.068332
+358296.648870 7402452.566363
+358313.644352 7402462.064736
+358323.647029 7402471.563109
+358331.645873 7402489.060112
+358339.644717 7402512.556087
+358366.634630 7402571.046068
+358390.128141 7402636.534851
+358402.629426 7402657.531254
+358413.629898 7402670.529028
+358430.122359 7402681.027230
+358443.118419 7402696.024661
+358448.618655 7402716.021235
+358452.618077 7402742.016783
+358452.618077 7402767.012501
+358447.620861 7402790.008562
+358440.125037 7402813.504537
+358429.627586 7402832.501283
+358414.627692 7402854.497516
+358400.130819 7402876.993662
+358388.635573 7402903.489124
+358381.634523 7402933.983900
+358371.631845 7402993.473710
+358368.135444 7403023.968487
+358371.137072 7403048.964205
+358375.136494 7403067.960951
+358382.632317 7403080.458811
+358403.132447 7403097.455899
+358417.629320 7403113.453159
+358428.621545 7403121.451789
+358437.123409 7403129.450419
+358438.624223 7403145.447679
+358436.620389 7403163.944510
+358432.126194 7403181.941427
+358427.623752 7403192.439629
+358412.623858 7403206.937146
+358404.130240 7403224.434149
+358404.130240 7403241.431237
+358410.628270 7403254.429011
+358421.125722 7403268.426613
+Region 1
+420
+349823.152107 7402538.021725
+349788.641631 7402520.774679
+349760.299337 7402503.517635
+349730.101640 7402490.579851
+349707.300812 7402486.260591
+349680.805673 7402488.730168
+349661.080690 7402493.039430
+349648.142354 7402500.438163
+349631.501460 7402512.766051
+349612.403190 7402536.791936
+349596.999231 7402563.287397
+349585.908051 7402596.571696
+349579.739870 7402631.075786
+349577.274247 7402664.350086
+349574.808625 7402698.244280
+349574.808625 7402713.651641
+349577.892715 7402730.288791
+349580.976805 7402742.616680
+349580.976805 7402750.005414
+349577.892715 7402756.174358
+349571.732780 7402762.333303
+349565.572846 7402763.563092
+349559.404666 7402766.652563
+349544.000707 7402775.890980
+349521.199879 7402795.607603
+349499.635986 7402814.094436
+349483.613560 7402824.572642
+349469.438289 7402833.201164
+349455.881486 7402838.750213
+349447.866150 7402838.750213
+349426.302257 7402833.201164
+349412.745454 7402824.572642
+349390.563093 7402809.165281
+349378.853446 7402791.298341
+349372.685265 7402777.120770
+349369.609421 7402760.483619
+349361.594085 7402716.731114
+349351.121372 7402680.987236
+349341.258880 7402658.811035
+349322.160610 7402635.395046
+349295.047004 7402619.367791
+349271.009241 7402612.588952
+349251.910971 7402612.588952
+349229.110143 7402622.447264
+349210.622094 7402636.624835
+349197.065291 7402652.032196
+349188.439734 7402671.128925
+349185.355644 7402689.615758
+349186.584332 7402702.563541
+349189.668422 7402720.430480
+349203.225225 7402760.483619
+349209.385160 7402780.820136
+349218.010717 7402799.306969
+349224.178897 7402809.165281
+349232.804455 7402811.634858
+349241.430012 7402814.714330
+349259.918061 7402829.501797
+349274.711799 7402836.900530
+349292.581381 7402841.829686
+349335.717413 7402849.838314
+349365.906864 7402854.767469
+349389.944626 7402867.705253
+349406.577273 7402878.803352
+349414.592609 7402891.741136
+349417.676700 7402904.678920
+349413.363921 7402916.386915
+349403.501429 7402920.086281
+349388.707691 7402920.086281
+349378.853446 7402923.165753
+349365.906864 7402933.643959
+349351.121372 7402941.652587
+349330.786167 7402955.210264
+349307.366872 7402966.308363
+349284.566044 7402971.237519
+349258.689373 7402971.237519
+349241.430012 7402966.308363
+349227.873209 7402953.360581
+349193.362733 7402918.236598
+349167.486062 7402900.369658
+349116.953160 7402879.413248
+349062.107480 7402859.086730
+349020.208382 7402852.917786
+348978.919506 7402855.997259
+348926.539448 7402863.395991
+348875.388080 7402873.254303
+348824.244957 7402873.874197
+348752.148163 7402864.015885
+348703.462417 7402843.679369
+348639.372712 7402809.785174
+348596.236680 7402766.032669
+348562.344672 7402720.430480
+348511.811771 7402668.669346
+348491.476566 7402645.863253
+348479.156697 7402627.376419
+348467.447050 7402612.588952
+348458.821492 7402587.323280
+348448.959001 7402562.057608
+348431.707886 7402541.111196
+348403.357345 7402525.083941
+348366.381247 7402518.305102
+348322.016526 7402513.995840
+348291.818829 7402512.766051
+348262.239600 7402507.826897
+348245.606953 7402500.438163
+348223.416346 7402485.030802
+348201.852453 7402459.765130
+348187.677182 7402432.649774
+348175.967535 7402390.746952
+348169.189133 7402374.729696
+348161.182043 7402357.472652
+348153.166707 7402351.313706
+348143.922683 7402348.844129
+348132.831502 7402348.844129
+348122.358790 7402352.543496
+348110.649142 7402366.101174
+348102.633806 7402388.287373
+348081.069913 7402429.570302
+348065.047487 7402453.606185
+348047.796372 7402470.853230
+348035.468257 7402483.181119
+348021.292987 7402489.340064
+347993.560913 7402493.659324
+347967.535809 7402493.659324
+347957.203282 7402493.659324
+347926.395364 7402496.738796
+347890.037734 7402512.146157
+347860.458504 7402520.774679
+347838.276144 7402529.403201
+347788.980177 7402547.270141
+347713.180825 7402580.544441
+347652.785432 7402604.580324
+347605.336620 7402625.526736
+347569.597457 7402634.775152
+347525.842957 7402644.013570
+347501.194974 7402651.412302
+347476.546990 7402664.969980
+347437.723736 7402696.394597
+347408.762974 7402716.731114
+347385.962147 7402727.209319
+347365.008474 7402732.138475
+347342.826114 7402733.368264
+347290.446057 7402734.608052
+347231.906066 7402734.608052
+347196.777123 7402738.297420
+347150.565246 7402745.076259
+347096.948255 7402753.704781
+347061.827558 7402760.483619
+347036.561108 7402772.191614
+347018.073059 7402784.519502
+347002.669100 7402800.536759
+346993.425075 7402820.873275
+346992.806608 7402835.050847
+346995.272231 7402847.988631
+347006.981878 7402862.166202
+347047.652288 7402888.041770
+347074.765894 7402900.369658
+347100.032345 7402908.378286
+347123.443394 7402918.856492
+347135.771509 7402933.034063
+347137.618664 7402947.821530
+347134.542820 7402973.087202
+347124.680328 7403002.662136
+347105.573812 7403024.848336
+347082.162763 7403037.786120
+347058.743468 7403042.105380
+347035.942640 7403047.034536
+347016.225903 7403049.494114
+346996.500919 7403058.122637
+346989.021588 7403062.161945
+346989.013342 7403062.161945
+346958.312625 7403017.009679
+346935.882878 7402984.025329
+346861.947174 7402859.056735
+346762.027597 7402689.865716
+347215.157971 7402074.291158
+347188.506154 7402012.081814
+347156.741673 7401983.296744
+347122.132243 7401962.220355
+347087.267180 7401945.363242
+347034.812907 7401930.305821
+346994.736226 7401923.017070
+346958.197178 7401920.647476
+346934.217139 7401918.737803
+346887.452765 7401916.918115
+346817.640177 7401919.517669
+346754.177186 7401918.497844
+346715.048821 7401916.208236
+346686.566340 7401913.638676
+346667.971090 7401910.409229
+346629.288022 7401900.130990
+346597.078245 7401889.152870
+346570.566614 7401878.234741
+346544.450801 7401865.396940
+346519.868788 7401850.309524
+346501.339508 7401836.801838
+346490.017433 7401825.613754
+346476.872941 7401812.186054
+346458.393138 7401792.169483
+346440.366878 7401767.683677
+346429.127266 7401748.117029
+346417.912392 7401726.730692
+346404.141187 7401695.696008
+346388.506334 7401652.203458
+346368.888551 7401589.584184
+346354.911190 7401543.482081
+346372.335475 7401526.514987
+346384.119339 7401517.086602
+346395.342459 7401511.677529
+346412.115292 7401509.367924
+346433.769894 7401501.559262
+346452.315666 7401499.019697
+346469.946108 7401488.401516
+346487.535318 7401480.802817
+346509.371336 7401479.303074
+346535.577857 7401472.064314
+346593.787999 7401461.686092
+346615.879651 7401459.436477
+346634.755273 7401450.597991
+346661.324628 7401435.290613
+346686.896190 7401417.963581
+346705.268792 7401408.865139
+346742.121196 7401381.849767
+346746.912256 7401378.450349
+346775.633878 7401358.573754
+346793.206595 7401352.984711
+346821.779784 7401345.316025
+346843.211738 7401329.328763
+346872.749736 7401313.901406
+346911.507020 7401287.935853
+346938.035144 7401268.709147
+346982.902885 7401240.274018
+346995.412417 7401229.005948
+347011.476074 7401218.777700
+347019.969692 7401202.700454
+347028.488048 7401182.073987
+347031.176319 7401161.407527
+347032.850304 7401140.991024
+347032.701872 7401127.653308
+347033.559480 7401112.485906
+347031.926726 7401093.309191
+347031.836018 7401070.853038
+347033.551234 7401043.877658
+347035.043801 7401013.112928
+347038.086660 7400978.328886
+347043.438464 7400940.275405
+347051.783650 7400917.669277
+347064.787955 7400874.576658
+347069.661478 7400855.069999
+347077.792261 7400830.684177
+347093.237451 7400790.041138
+347110.307148 7400760.776151
+347133.066745 7400731.511164
+347145.262920 7400712.804368
+347167.206140 7400684.359241
+347225.746131 7400607.942330
+347254.203873 7400570.548735
+347272.271365 7400600.053681
+347283.766610 7400583.896449
+347317.988467 7400524.996538
+347336.501255 7400493.521929
+347352.111370 7400475.295051
+347365.536233 7400460.267626
+347379.686765 7400445.910085
+347393.598156 7400434.202090
+347407.171452 7400425.593565
+347423.309325 7400415.795243
+347426.286214 7400412.705772
+347448.361374 7400394.018973
+347459.279383 7400385.050510
+347468.160574 7400375.392164
+347481.123648 7400353.485916
+347485.337472 7400334.759124
+347485.881723 7400294.965940
+347467.987403 7400231.886745
+347468.276021 7400207.520919
+347468.309006 7400173.246790
+347470.939553 7400144.341741
+347471.236418 7400109.617689
+347475.829568 7400054.527125
+347481.948271 7399989.488266
+347490.788231 7399982.369485
+347492.371507 7399914.221158
+347475.252332 7399819.187437
+347456.558127 7399727.183196
+347424.521521 7399637.278596
+347438.474143 7399605.913969
+347464.853835 7399616.062230
+347477.025272 7399624.180840
+347495.282426 7399624.180840
+347519.633545 7399595.775705
+347539.919273 7399579.538486
+347568.327537 7399579.538486
+347606.870419 7399591.716401
+347643.392975 7399589.686748
+347708.315549 7399563.311266
+347779.323841 7399543.024741
+347828.553838 7399522.288293
+347841.673591 7399504.181394
+347855.840615 7399508.140716
+347879.771176 7399510.090382
+347913.457029 7399511.750098
+347980.672055 7399518.628920
+348028.689856 7399523.388105
+348055.490105 7399524.997829
+348115.431956 7399530.476890
+348250.018686 7399540.155232
+348291.983754 7399545.144378
+348318.866466 7399545.764272
+348364.179503 7399543.104727
+348381.306924 7399541.674972
+348399.168260 7399538.705481
+348421.556776 7399533.376394
+348456.248668 7399533.176428
+348479.931843 7399535.835972
+348588.806826 7399545.144378
+348642.151692 7399548.753760
+348666.618258 7399552.543111
+348699.388779 7399551.993205
+348724.877878 7399549.663604
+348759.140966 7399547.184029
+348878.900974 7399529.557048
+348896.028395 7399528.517226
+348909.750123 7399527.907330
+348920.016680 7399526.967491
+348948.251774 7399528.027310
+348963.540285 7399530.436897
+348982.622063 7399533.356397
+349003.468534 7399539.705310
+349027.935100 7399550.583446
+349102.291362 7399586.977212
+349116.582080 7399594.905854
+349176.012664 7399625.210663
+349267.133513 7399672.842504
+349294.882079 7399686.480168
+349383.322903 7399729.972718
+349410.230353 7399743.290437
+349439.619919 7399758.397849
+349487.208916 7399784.633356
+349507.700800 7399800.680607
+349530.460396 7399816.297932
+349549.030908 7399831.225375
+349564.459605 7399841.653589
+349579.937780 7399855.111283
+349592.735930 7399867.089232
+349606.696798 7399880.566923
+349617.524099 7399889.145454
+349636.490430 7399905.222700
+349645.429344 7399915.360963
+349691.492788 7399954.604241
+349715.926370 7399978.580134
+349729.458434 7399989.408279
+349744.557282 7400002.486039
+349762.121754 7400025.062172
+349771.077160 7400035.970304
+349778.919325 7400048.028238
+349787.281003 7400068.084803
+349794.413993 7400083.592147
+349803.897158 7400102.478912
+349823.803559 7400149.780809
+349834.086609 7400171.327118
+349842.728658 7400185.294726
+349855.609271 7400202.221826
+349863.797778 7400212.750023
+349875.829028 7400225.117905
+349891.010339 7400242.404943
+349904.962961 7400255.502700
+349940.091903 7400291.226581
+350030.371637 7400374.432328
+350103.548687 7400438.161412
+350157.322357 7400470.995788
+350123.463334 7400636.547430
+350115.406767 7400688.638508
+350112.009320 7400727.901782
+350109.048923 7400737.730099
+350098.889567 7400782.482433
+350094.626266 7400798.379710
+350091.393743 7400817.066509
+350083.221729 7400836.253223
+350068.617654 7400863.728516
+350052.809630 7400883.455137
+350039.236335 7400901.472051
+350010.646653 7400931.306941
+350000.256402 7400948.583981
+349982.296112 7400961.371791
+349972.573806 7400968.110637
+349937.733482 7400991.646605
+349899.751343 7401021.171548
+349893.838796 7401030.799899
+349890.226947 7401041.518063
+349887.349012 7401050.326554
+349886.367711 7401059.095052
+349885.328686 7401064.834069
+349893.278052 7401088.789965
+349898.036127 7401120.524530
+349915.501644 7401217.337946
+349917.818835 7401240.533973
+349936.133713 7401283.996528
+349947.241385 7401339.547013
+349951.999461 7401404.615867
+349947.241385 7401461.756080
+349940.702125 7401493.290678
+349942.029768 7401545.431747
+349969.390761 7401565.118375
+350007.620286 7401574.906698
+350024.203456 7401578.416097
+350047.226932 7401579.985828
+350109.106647 7401604.601611
+350125.186797 7401641.805239
+350139.263112 7401657.762506
+350093.496532 7401769.383386
+350040.069204 7401915.668329
+350002.326206 7402014.921327
+349887.720093 7402121.773025
+349817.998213 7402177.233525
+349811.656861 7402191.501081
+349800.573927 7402204.168911
+349786.299702 7402264.388596
+349792.599822 7402332.077002
+349800.557435 7402389.777118
+349823.152107 7402538.021725
+Region 1
+1191
+325541.730148 7409353.814242
+325498.635346 7409351.804586
+325482.918031 7409351.124702
+325473.987363 7409355.563942
+325453.784098 7409369.481558
+325438.866667 7409386.978561
+325420.040522 7409413.534012
+325405.815774 7409437.109974
+325390.749911 7409467.234814
+325375.700540 7409495.849912
+325362.143737 7409527.004576
+325355.530260 7409550.670522
+325349.180662 7409573.326641
+325342.138381 7409611.620082
+325338.699703 7409645.414293
+325337.174150 7409667.370532
+325344.661728 7409699.774982
+325352.982175 7409725.370597
+325358.746290 7409753.465785
+325363.248732 7409780.791104
+325363.809475 7409819.174530
+325362.053028 7409861.067354
+325358.416441 7409890.572300
+325353.765566 7409919.307378
+325350.648491 7409947.552540
+325348.834321 7409972.278304
+325349.139431 7409989.955276
+325350.359873 7410015.220949
+325357.781481 7410031.458167
+325367.231661 7410069.701617
+325368.303671 7410086.118804
+325360.197626 7410107.245186
+325346.921195 7410136.380195
+325335.665090 7410166.305069
+325328.408407 7410200.809159
+325321.959855 7410231.793852
+325320.393071 7410257.529443
+325316.575066 7410280.465515
+325314.727911 7410308.220760
+325309.780172 7410341.245104
+325300.898982 7410363.111358
+325291.762158 7410384.977613
+325277.784797 7410409.053489
+325265.374220 7410428.860096
+325250.992794 7410444.607399
+325238.400800 7410457.845131
+325226.625182 7410467.053554
+325218.568615 7410483.630714
+325213.431213 7410489.379729
+325204.475807 7410495.838623
+325195.553385 7410500.037904
+325182.095537 7410500.637801
+325164.992854 7410488.579866
+325152.928619 7410478.841535
+325131.051369 7410462.184388
+325108.300019 7410455.865470
+325084.798261 7410447.766857
+325061.049117 7410439.928200
+325038.842018 7410429.819932
+325012.775683 7410424.730803
+324998.633397 7410419.521695
+324979.988670 7410408.703549
+324954.804682 7410393.016236
+324938.947180 7410382.228084
+324916.319523 7410364.551111
+324893.576419 7410357.222367
+324857.837255 7410354.792783
+324831.498795 7410351.463353
+324798.538611 7410349.823634
+324766.304095 7410351.733307
+324741.441710 7410352.213225
+324708.192908 7410353.343031
+324663.201473 7410361.171690
+324636.986706 7410368.950358
+324602.014442 7410387.747138
+324574.917328 7410405.614078
+324533.983039 7410435.448967
+324500.866177 7410468.913235
+324449.813763 7410518.074814
+324424.118508 7410546.309978
+324396.633821 7410575.794927
+324378.615808 7410598.061113
+324361.348201 7410621.347125
+324343.569327 7410645.133050
+324330.177449 7410662.160134
+324312.481038 7410679.377185
+324296.722491 7410703.183107
+324285.078813 7410722.749755
+324277.731422 7410743.876137
+324273.204241 7410762.512944
+324270.169628 7410783.179404
+324263.358242 7410801.786217
+324253.932800 7410848.648190
+324248.638720 7410867.774914
+324247.212122 7410881.652537
+324243.690982 7410900.299343
+324240.697600 7410917.936322
+324233.630580 7410936.293177
+324223.001189 7410978.086018
+324226.621284 7410993.783330
+324231.733947 7411012.020206
+324235.395274 7411024.428081
+324239.196786 7411046.194352
+324244.004338 7411068.970451
+324248.869615 7411086.957370
+324253.982278 7411105.194246
+324261.329669 7411127.750382
+324266.178453 7411147.497000
+324273.492859 7411172.832660
+324276.024452 7411194.578935
+324281.376256 7411214.335551
+324284.072773 7411244.410400
+324285.342693 7411265.636764
+324287.198095 7411302.020531
+324269.724332 7411321.257236
+324254.806901 7411339.024193
+324247.294584 7411352.321915
+324237.638248 7411375.687913
+324227.190274 7411401.323522
+324216.816516 7411420.900168
+324204.191537 7411437.927252
+324195.706166 7411447.685580
+324178.554006 7411460.873321
+324159.134133 7411473.021241
+324141.215073 7411487.208810
+324119.445025 7411504.635825
+324107.034447 7411524.952345
+324104.205990 7411549.918069
+324100.989960 7411565.035479
+324094.203313 7411581.112725
+324085.462308 7411591.370968
+324069.382158 7411599.269615
+324052.081566 7411604.118785
+324032.777140 7411605.918476
+324012.697569 7411609.987779
+323981.732973 7411610.897624
+323961.892542 7411615.466841
+323942.035618 7411621.805755
+323921.881831 7411631.424108
+323908.547676 7411643.642015
+323889.424667 7411652.520494
+323875.892602 7411660.189180
+323853.017559 7411663.968533
+323840.029745 7411668.367779
+323820.469686 7411670.417428
+323796.275245 7411678.726005
+323785.522161 7411687.444512
+323767.586609 7411702.641909
+323760.668022 7411708.630883
+323748.364645 7411719.349047
+323735.294370 7411730.807084
+323719.774964 7411734.676421
+323707.092261 7411735.036360
+323690.624538 7411733.076695
+323679.483881 7411730.937062
+323665.852862 7411725.727954
+323651.661099 7411724.048242
+323636.166431 7411726.147882
+323626.980130 7411730.587122
+323611.765835 7411730.167194
+323599.891263 7411726.497822
+323591.546077 7411723.878271
+323574.600073 7411719.898953
+323560.350587 7411723.768290
+323539.240236 7411728.077552
+323517.626866 7411732.886728
+323495.988756 7411739.455603
+323475.851461 7411748.064128
+323443.014971 7411757.282549
+323420.857349 7411765.371164
+323402.534225 7411769.960378
+323384.524457 7411770.000371
+323368.048488 7411769.310489
+323346.245454 7411768.310660
+323323.403395 7411768.800576
+323304.874115 7411769.860395
+323290.847277 7411776.769211
+323285.198609 7411782.258271
+323277.999649 7411790.756815
+323265.688027 7411802.234849
+323259.717756 7411813.782871
+323251.405555 7411830.609989
+323245.377561 7411846.947190
+323239.382551 7411861.024779
+323231.886728 7411872.802762
+323219.830738 7411884.280796
+323211.675216 7411887.980162
+323197.978227 7411887.320275
+323174.938259 7411884.030838
+323156.145099 7411885.580573
+323135.546015 7411890.139792
+323117.701172 7411898.018442
+323101.612776 7411906.926916
+323082.217641 7411917.065180
+323065.832381 7411929.753007
+323049.463613 7411941.431006
+323035.346066 7411955.668567
+323019.942107 7411971.395874
+323007.350113 7411985.143519
+322990.635004 7412004.650177
+322979.832442 7412017.148037
+322967.735221 7412032.415421
+322951.011865 7412052.931907
+322937.941590 7412064.399943
+322912.320551 7412086.076230
+322895.110668 7412104.563063
+322876.325755 7412127.079206
+322861.804142 7412154.184563
+322852.370454 7412180.340083
+322841.675093 7412205.715737
+322827.351391 7412237.370314
+322803.082734 7412264.025749
+322793.690277 7412285.392089
+322780.116982 7412309.178014
+322771.681088 7412319.806194
+322756.491531 7412339.442830
+322743.668642 7412369.847622
+322740.419627 7412383.335312
+322723.828211 7412391.733873
+322706.189524 7412403.651832
+322690.092882 7412413.070219
+322675.851641 7412416.439642
+322667.448732 7412419.119183
+322655.021663 7412418.979207
+322641.844186 7412417.819405
+322631.948709 7412418.219337
+322617.996087 7412418.059364
+322605.140213 7412411.090558
+322597.594912 7412405.961436
+322588.515812 7412401.052277
+322578.166793 7412396.643033
+322559.695236 7412392.903673
+322524.038535 7412383.655257
+322504.593923 7412375.606636
+322477.554533 7412366.968116
+322452.791102 7412358.859504
+322438.871465 7412356.179963
+322415.089336 7412351.110832
+322397.063076 7412352.420607
+322383.654705 7412348.981197
+322363.410208 7412345.221840
+322341.673144 7412337.903094
+322330.120175 7412328.424718
+322319.820633 7412319.976165
+322311.541418 7412312.057521
+322298.248494 7412299.029753
+322280.329435 7412291.001128
+322268.900159 7412291.880977
+322262.022802 7412294.830472
+322255.598989 7412301.579316
+322248.177381 7412307.298336
+322234.183528 7412310.927715
+322217.179800 7412311.747574
+322207.028690 7412312.137508
+322189.488958 7412315.466937
+322177.540169 7412317.606571
+322159.184060 7412324.975309
+322145.445840 7412328.854644
+322132.746645 7412330.474367
+322116.757203 7412331.054267
+322103.571481 7412330.404379
+322087.862411 7412328.954627
+322074.948814 7412327.044954
+322062.802116 7412324.385410
+322050.688403 7412319.196298
+322041.122776 7412312.777398
+322029.083279 7412301.019412
+322019.278511 7412293.330729
+322005.861894 7412290.911143
+321993.640980 7412295.060433
+321980.389287 7412299.959594
+321965.339916 7412307.118367
+321942.687521 7412314.177158
+321927.967999 7412314.267143
+321912.737211 7412315.097001
+321899.040222 7412314.947026
+321889.400378 7412315.596915
+321872.693515 7412312.627424
+321856.209300 7412312.187499
+321844.046110 7412310.787739
+321830.134719 7412307.598285
+321814.928669 7412306.158532
+321800.745153 7412304.738775
+321787.848048 7412301.309362
+321775.206576 7412297.130078
+321761.031306 7412294.690496
+321750.179266 7412290.281251
+321736.985297 7412290.131277
+321726.562062 7412292.530866
+321720.698992 7412294.990445
+321710.696314 7412303.968907
+321695.110938 7412313.887208
+321682.156110 7412315.007016
+321674.561331 7412313.657247
+321663.156794 7412312.767400
+321655.908357 7412304.098884
+321643.877107 7412291.591027
+321635.317520 7412285.692037
+321625.001485 7412278.503269
+321613.168144 7412270.794589
+321600.048391 7412265.085567
+321584.570216 7412265.665468
+321569.322936 7412268.025064
+321555.584715 7412270.894572
+321541.376460 7412271.744427
+321525.626159 7412273.084197
+321517.008848 7412272.984214
+321507.088633 7412274.893887
+321487.990363 7412281.492757
+321480.065735 7412286.451907
+321468.116947 7412288.591541
+321452.143998 7412287.901659
+321439.238647 7412285.482073
+321427.075457 7412284.082313
+321406.261971 7412285.612051
+321394.807956 7412289.011469
+321382.545812 7412296.200237
+321373.804807 7412306.448482
+321365.129772 7412310.897720
+321359.299687 7412310.327818
+321351.704909 7412309.228006
+321343.912221 7412302.829102
+321332.598392 7412294.370551
+321323.041011 7412286.941823
+321307.084555 7412284.992157
+321288.563521 7412285.032150
+321269.193125 7412293.140762
+321258.736905 7412298.079915
+321235.581489 7412304.128879
+321216.293555 7412305.168701
+321198.325019 7412301.179385
+321183.671467 7412296.460193
+321168.754036 7412292.000957
+321148.031258 7412285.202121
+321142.712439 7412281.562745
+321133.963189 7412275.293819
+321125.205692 7412269.274850
+321115.417416 7412263.995754
+321106.437271 7412256.457045
+321099.774316 7412247.718542
+321091.668272 7412235.400652
+321086.802996 7412225.442358
+321081.467684 7412214.204283
+321076.833303 7412205.505773
+321070.252811 7412204.335973
+321067.688233 7412205.795723
+321061.833409 7412206.155661
+321056.250711 7412206.025684
+321048.928058 7412203.826060
+321043.691702 7412199.666773
+321037.408074 7412196.737275
+321031.099708 7412194.817603
+321022.960678 7412195.377507
+321017.336749 7412197.017227
+321012.207593 7412199.166858
+321007.004222 7412204.845886
+321001.297830 7412210.015000
+321000.258805 7412222.362885
+320998.865192 7412228.131897
+320996.176921 7412234.890739
+320991.064258 7412236.280501
+320982.644856 7412238.100189
+320970.943455 7412238.830064
+320955.803376 7412245.788872
+320944.984321 7412252.597706
+320929.176297 7412266.615305
+320918.761307 7412278.233315
+320910.680001 7412287.631705
+320900.265012 7412299.249715
+320892.035274 7412303.848927
+320874.866622 7412310.757744
+320854.984960 7412313.817220
+320848.800287 7412317.716552
+320841.428156 7412318.036497
+320832.307825 7412317.066663
+320824.968680 7412315.876867
+320816.178198 7412311.377638
+320807.024882 7412311.667588
+320797.830335 7412313.967194
+320791.909541 7412317.616569
+320786.227889 7412322.025814
+320780.694668 7412330.984279
+320776.950879 7412350.840878
+320776.365397 7412365.968287
+320774.312085 7412378.296175
+320772.761794 7412390.884019
+320777.313713 7412403.361882
+320781.915110 7412413.320176
+320783.539617 7412420.428958
+320785.419758 7412427.287783
+320783.226261 7412434.306581
+320779.292809 7412440.015603
+320771.508367 7412447.664293
+320762.767362 7412452.253507
+320758.017533 7412460.472099
+320758.025780 7412471.320241
+320759.831704 7412485.777765
+320752.154463 7412499.375435
+320743.965956 7412503.634706
+320730.153520 7412506.584201
+320716.316345 7412512.013271
+320701.209251 7412518.682128
+320667.276011 7412528.850387
+320644.648355 7412536.049154
+320637.721521 7412539.078635
+320630.110250 7412547.077264
+320625.698517 7412549.516847
+320604.909769 7412560.464971
+320590.289202 7412567.553757
+320580.030891 7412583.461032
+320568.090349 7412595.299005
+320556.537380 7412600.828057
+320537.826683 7412608.466749
+320528.978477 7412611.696196
+320521.128066 7412608.606725
+320504.635604 7412605.417271
+320485.891922 7412602.197823
+320461.474833 7412601.527938
+320424.226609 7412606.677056
+320351.964890 7412617.005286
+320303.411084 7412624.633980
+320279.340337 7412626.583646
+320263.210710 7412624.893935
+320258.328941 7412624.084074
+320229.203255 7412609.536566
+320219.489195 7412605.307290
+320212.018110 7412601.857881
+320202.271065 7412600.238159
+320195.129830 7412600.158172
+320186.083714 7412603.037679
+320175.512047 7412607.016997
+320164.495083 7412616.965293
+320156.083927 7412629.193199
+320141.150004 7412652.169263
+320135.064285 7412658.448188
+320128.269391 7412660.977754
+320121.136402 7412660.517833
+320115.528965 7412658.208229
+320109.946267 7412654.028945
+320087.739168 7412626.863598
+320072.986661 7412603.897532
+320053.451341 7412573.022820
+320044.603135 7412559.465143
+320031.961664 7412548.487023
+320024.869905 7412545.037614
+320015.122861 7412543.047955
+320004.979997 7412542.927975
+319993.657922 7412547.267232
+319967.220507 7412558.895240
+319948.311900 7412569.123488
+319900.178652 7412603.657573
+319888.056693 7412611.346256
+319874.475151 7412616.415387
+319855.574790 7412625.893764
+319830.283601 7412635.672089
+319816.330979 7412639.981351
+319803.169994 7412640.571250
+319790.421322 7412638.921532
+319757.477630 7412629.183200
+319739.880174 7412624.484005
+319728.624069 7412622.854285
+319715.454839 7412624.933928
+319710.902920 7412628.233363
+319707.818829 7412634.552281
+319707.373533 7412640.521258
+319711.331724 7412654.768818
+319719.454261 7412666.076881
+319735.418963 7412681.954161
+319742.428259 7412692.502354
+319752.727802 7412710.189325
+319764.082861 7412734.235206
+319766.622700 7412741.363985
+319766.548484 7412748.082834
+319763.777751 7412759.260919
+319759.555681 7412766.679649
+319753.849289 7412772.208702
+319747.070887 7412773.998395
+319737.299104 7412774.248352
+319728.318959 7412770.778946
+319694.311504 7412756.541385
+319681.975143 7412751.162307
+319668.236922 7412738.294511
+319656.378843 7412724.696840
+319647.134818 7412712.258970
+319631.351533 7412682.174124
+319620.293337 7412664.487153
+319606.612841 7412646.760190
+319579.903300 7412618.794980
+319569.430587 7412609.156631
+319537.921739 7412580.171596
+319520.744841 7412572.122974
+319502.743319 7412569.283461
+319467.399975 7412571.463087
+319440.731665 7412571.143142
+319422.359063 7412568.303629
+319404.035939 7412561.354819
+319395.468105 7412555.265862
+319388.813397 7412546.227410
+319379.923960 7412536.029157
+319371.084001 7412521.721608
+319355.152283 7412503.594713
+319347.763661 7412493.046519
+319341.900591 7412481.398515
+319338.272249 7412470.520378
+319339.533923 7412459.702231
+319343.112787 7412443.684975
+319351.556927 7412428.847516
+319361.567851 7412409.170887
+319368.906996 7412392.443752
+319370.110946 7412386.484773
+319372.139518 7412374.176881
+319368.775056 7412342.012390
+319364.594217 7412315.436942
+319360.957630 7412305.678614
+319353.527776 7412298.489845
+319339.336013 7412291.601025
+319331.848436 7412290.011298
+319322.076652 7412290.261255
+319310.375251 7412294.600511
+319301.658985 7412300.469506
+319295.193940 7412307.118367
+319286.032378 7412318.956340
+319276.062685 7412335.643481
+319264.550947 7412354.930178
+319254.985320 7412369.007766
+319240.595647 7412378.546132
+319231.128974 7412384.405129
+319222.849759 7412385.804889
+319213.424317 7412388.304461
+319206.645916 7412390.084156
+319192.363444 7412390.284122
+319179.614772 7412388.634404
+319171.747868 7412386.664742
+319159.807326 7412380.175853
+319138.565035 7412365.718330
+319128.521126 7412357.749695
+319118.889529 7412346.421635
+319113.001720 7412336.633312
+319106.404736 7412323.105629
+319102.421806 7412311.107684
+319094.860013 7412284.492243
+319091.701707 7412265.775449
+319089.392762 7412239.969869
+319088.617616 7412211.194798
+319090.407048 7412157.054072
+319090.670928 7412135.757720
+319089.623657 7412129.028872
+319087.520868 7412116.670989
+319085.302632 7412083.396689
+319083.100888 7412048.252709
+319083.595662 7412038.924306
+319084.387300 7412035.194945
+319086.325164 7412030.365772
+319091.627491 7412027.066338
+319099.172792 7412024.916706
+319109.332148 7412023.177004
+319114.997308 7412021.007375
+319121.074780 7412015.098388
+319126.855388 7412003.220422
+319132.248423 7411992.452267
+319132.322639 7411986.853226
+319130.920780 7411978.614637
+319128.743775 7411971.865793
+319120.992318 7411960.557730
+319114.304625 7411954.498768
+319103.873143 7411947.649941
+319091.206933 7411938.901440
+319080.387878 7411932.792486
+319072.215864 7411925.593719
+319065.940482 7411916.555267
+319060.794834 7411907.146879
+319057.587050 7411892.919316
+319056.943844 7411883.940854
+319057.784960 7411876.852068
+319060.489724 7411870.533150
+319066.575442 7411864.634161
+319085.112968 7411854.025978
+319096.459782 7411847.447105
+319104.087545 7411838.568626
+319110.239233 7411827.070595
+319109.637258 7411814.732708
+319103.889636 7411793.366368
+319097.284405 7411780.588557
+319090.266863 7411770.410301
+319088.477430 7411763.671455
+319087.520868 7411749.833825
+319088.782541 7411738.645741
+319091.198687 7411725.228040
+319091.685214 7411716.639511
+319092.559315 7411706.561237
+319093.763264 7411700.232321
+319096.476274 7411693.533469
+319100.335510 7411684.614996
+319100.830284 7411675.286594
+319098.694510 7411665.548262
+319092.765470 7411659.129362
+319083.076149 7411652.650472
+319070.393447 7411645.031777
+319062.229678 7411636.713202
+319054.832809 7411627.284817
+319051.220960 7411616.026745
+319047.724559 7411594.320463
+319049.274850 7411560.346283
+319052.556850 7411537.600179
+319053.802031 7411527.531903
+319053.843262 7411524.162481
+319052.845468 7411513.694274
+319054.907026 7411498.776829
+319057.463357 7411474.530982
+319058.906447 7411448.765395
+319057.158246 7411407.652438
+319054.725608 7411391.185258
+319052.177523 7411384.436414
+319047.749297 7411378.397449
+319041.391453 7411376.077846
+319035.759278 7411376.017856
+319029.731283 7411377.437613
+319015.003515 7411383.226622
+318999.888175 7411390.885310
+318964.008825 7411406.142696
+318925.886501 7411420.990153
+318907.398452 7411427.479042
+318892.307850 7411432.528177
+318879.889026 7411434.617819
+318864.122233 7411433.677980
+318842.014089 7411429.298730
+318811.288634 7411422.569882
+318773.446681 7411414.631242
+318753.218677 7411410.271989
+318727.754317 7411403.603131
+318714.634564 7411401.203542
+318696.962892 7411402.113386
+318684.527576 7411405.312838
+318672.455094 7411409.652095
+318661.091789 7411416.980840
+318647.081443 7411426.519206
+318631.562037 7411436.047574
+318622.491183 7411440.416825
+318611.193847 7411442.516466
+318595.039481 7411442.696435
+318572.956075 7411436.067570
+318546.065117 7411423.039802
+318528.179043 7411411.241823
+318512.263818 7411391.995120
+318494.056141 7411375.707909
+318483.245332 7411369.219021
+318463.784228 7411363.000086
+318433.058772 7411357.021110
+318417.333211 7411352.341912
+318409.491045 7411348.512568
+318404.683493 7411342.853537
+318400.997428 7411337.204505
+318399.595568 7411328.965916
+318402.028206 7411314.048471
+318409.713693 7411300.330821
+318429.430431 7411285.623340
+318458.168545 7411269.916031
+318469.136032 7411264.446967
+318482.775297 7411254.908601
+318491.128729 7411247.539863
+318494.221065 7411240.481073
+318495.053934 7411233.762223
+318492.126523 7411227.373318
+318482.090860 7411218.664810
+318466.027203 7411211.735996
+318450.293394 7411207.806669
+318435.648089 7411207.626700
+318422.833446 7411211.206087
+318400.947950 7411219.154726
+318383.589635 7411225.293674
+318365.522143 7411228.433136
+318344.090190 7411230.032862
+318310.264152 7411231.482614
+318274.549727 7411233.662241
+318232.056900 7411237.241627
+318216.248876 7411239.291276
+318187.255129 7411244.910314
+318159.036528 7411248.669670
+318133.803062 7411253.968762
+318104.042416 7411260.697610
+318090.840201 7411265.016870
+318077.225674 7411271.945683
+318063.602901 7411280.364241
+318044.323213 7411290.212554
+318029.991265 7411294.521816
+318014.207979 7411295.451657
+317998.457679 7411292.642138
+317986.154303 7411285.393380
+317974.659057 7411273.295452
+317961.745460 7411254.078743
+317947.347541 7411233.732229
+317934.755547 7411219.384686
+317919.838116 7411210.226255
+317901.135665 7411203.647382
+317885.789429 7411199.348118
+317871.894531 7411199.178147
+317862.477335 7411201.307783
+317840.987658 7411207.386741
+317816.867434 7411213.815640
+317799.154530 7411218.454845
+317781.499350 7411218.234883
+317770.647311 7411214.735483
+317753.099332 7411206.306926
+317739.715700 7411194.558939
+317725.284796 7411177.191913
+317711.653777 7411155.355654
+317705.073285 7411140.708163
+317703.762134 7411125.000853
+317707.316259 7411111.223213
+317720.419520 7411084.487793
+317731.197343 7411063.701353
+317739.344619 7411042.135047
+317743.492473 7411010.810413
+317744.102694 7410991.763676
+317746.881674 7410979.475780
+317752.324186 7410964.968265
+317764.470884 7410955.039966
+317786.513059 7410934.013568
+317803.945590 7410921.525707
+317818.434217 7410904.528618
+317824.709599 7410883.312252
+317828.478126 7410851.977620
+317829.278011 7410817.243569
+317831.694156 7410804.575739
+317856.944115 7410815.903799
+317868.307420 7410818.183408
+317884.280369 7410818.313386
+317901.630438 7410813.934136
+317915.706754 7410808.974986
+317929.453221 7410796.187176
+317940.165074 7410783.339377
+317954.274375 7410766.282299
+317967.122002 7410749.205224
+317984.364870 7410728.438781
+317996.618769 7410714.621148
+318010.241542 7410696.544244
+318019.980341 7410682.156708
+318029.447013 7410668.269087
+318037.586043 7410656.871040
+318044.735525 7410655.021357
+318057.335765 7410658.340788
+318065.590242 7410663.069978
+318083.707211 7410668.788998
+318098.220577 7410676.937602
+318111.348576 7410679.517161
+318122.777852 7410679.027245
+318128.723384 7410674.128084
+318133.151610 7410669.448885
+318137.464389 7410658.970680
+318139.575424 7410655.491276
+318141.307132 7410646.962737
+318141.059745 7410636.374551
+318138.643600 7410631.275424
+318133.638138 7410628.635876
+318126.414440 7410623.176811
+318123.495274 7410618.067686
+318120.081334 7410612.198692
+318120.172043 7410608.419339
+318121.013159 7410605.159897
+318128.698645 7410602.070427
+318136.326409 7410601.490526
+318146.502257 7410599.970786
+318157.420267 7410599.720829
+318174.432241 7410598.860976
+318186.372783 7410597.881144
+318200.671747 7410593.931821
+318205.809148 7410591.282274
+318211.004274 7410586.363117
+318219.102072 7410576.724768
+318228.478036 7410566.616499
+318233.516483 7410557.408077
+318231.990931 7410547.039853
+318230.572579 7410542.730591
+318228.115202 7410539.651118
+318220.751318 7410529.642833
+318211.342369 7410520.104467
+318206.526570 7410509.406299
+318201.809726 7410505.267008
+318200.943872 7410499.198048
+318204.530983 7410487.190105
+318209.536445 7410479.491423
+318209.223088 7410471.672762
+318205.611239 7410463.524158
+318203.656882 7410460.454684
+318198.544219 7410451.776171
+318193.670697 7410443.347614
+318192.178129 7410431.969563
+318196.952697 7410402.354636
+318199.583244 7410387.797130
+318205.545269 7410372.059825
+318211.144459 7410360.861743
+318219.778263 7410349.973608
+318231.059106 7410344.944470
+318246.388849 7410340.515229
+318258.865396 7410338.295609
+318278.870752 7410329.437126
+318289.442419 7410322.128378
+318295.519891 7410311.940123
+318301.259268 7410305.521223
+318310.387845 7410284.574811
+318318.625830 7410269.147453
+318324.777518 7410255.939716
+318332.256849 7410240.492362
+318347.702039 7410220.695753
+318362.388576 7410200.629190
+318368.985560 7410179.622788
+318378.345032 7410159.686203
+318385.395559 7410140.949412
+318398.449342 7410125.632036
+318410.678502 7410113.074187
+318422.816954 7410093.447549
+318429.059351 7410066.132228
+318438.707440 7410055.274088
+318446.788746 7410046.395609
+318458.399439 7410038.346987
+318475.815478 7410031.198212
+318494.229311 7410025.079260
+318516.452903 7410018.550378
+318529.984967 7410016.670700
+318545.809484 7410010.671728
+318557.362453 7410004.892718
+318575.932965 7409992.224888
+318597.480365 7409971.568426
+318613.387344 7409953.801469
+318629.269584 7409936.784384
+318640.220579 7409924.446497
+318645.828016 7409912.988460
+318656.374945 7409896.351310
+318661.924658 7409876.574697
+318661.462869 7409853.888583
+318660.968095 7409842.790484
+318661.504100 7409820.884237
+318666.534301 7409812.185727
+318674.153818 7409801.277595
+318699.494485 7409781.211032
+318718.518539 7409770.822812
+318733.881266 7409764.633872
+318755.486391 7409752.285987
+318766.833204 7409744.747278
+318771.574787 7409737.298554
+318773.355973 7409726.500404
+318770.585239 7409715.352313
+318763.188370 7409706.613810
+318757.877798 7409695.655687
+318748.064783 7409681.818057
+318742.333653 7409667.070584
+318735.167678 7409649.013677
+318731.374412 7409627.507360
+318730.277664 7409609.840387
+318732.875226 7409586.724346
+318735.530513 7409581.745199
+318739.513442 7409574.276478
+318747.545271 7409567.157698
+318758.826114 7409562.388515
+318774.403244 7409557.969272
+318798.094664 7409553.729998
+318826.857517 7409549.370744
+318852.833144 7409545.191460
+318868.913293 7409540.782216
+318884.572885 7409533.333492
+318896.348503 7409528.574307
+318907.588115 7409514.976636
+318913.022381 7409499.989203
+318912.074064 7409486.871450
+318910.721683 7409479.782664
+318907.217035 7409467.604750
+318901.898216 7409456.646627
+318897.428759 7409442.179105
+318895.515633 7409427.011703
+318893.165458 7409409.064778
+318888.753724 7409392.087686
+318884.078111 7409375.850467
+318879.138619 7409359.863205
+318871.774735 7409339.276732
+318870.504816 7409328.918506
+318873.514690 7409319.920047
+318876.392624 7409305.622496
+318881.530026 7409292.644719
+318882.948378 7409276.047562
+318882.445358 7409265.199420
+318883.236996 7409253.621404
+318887.087986 7409241.373502
+318891.763598 7409226.366072
+318898.533754 7409218.957341
+318906.738753 7409215.377954
+318914.886029 7409214.058180
+318927.807873 7409214.608086
+318937.653872 7409216.347788
+318945.999057 7409217.557581
+318958.022062 7409223.636540
+318963.876885 7409223.016646
+318969.484322 7409221.636882
+318976.741005 7409215.257975
+318980.938337 7409209.558951
+318987.947633 7409195.221407
+318990.099899 7409184.133306
+318994.066336 7409169.275851
+318995.591888 7409145.559914
+318996.820577 7409125.373371
+319002.395029 7409103.207168
+319006.163556 7409083.550535
+319016.974365 7409070.532765
+319032.180414 7409050.486199
+319041.152313 7409043.757351
+319056.012020 7409032.289316
+319071.688105 7409015.782143
+319078.128411 7409007.763517
+319090.679174 7408998.805051
+319103.188706 7408993.375981
+319120.481052 7408992.286168
+319142.094422 7408991.496303
+319166.998039 7408991.736262
+319188.339284 7408992.206182
+319205.623383 7408992.376153
+319222.643603 7408992.546123
+319237.725959 7408984.617482
+319244.867195 7408982.417858
+319260.394847 7408979.798307
+319270.834575 7408978.138591
+319285.603574 7408975.758999
+319293.297307 7408968.770196
+319301.007533 7408960.761568
+319305.460497 7408948.693635
+319324.286642 7408946.603993
+319332.392687 7408948.703633
+319339.740078 7408951.303188
+319349.066565 7408958.212005
+319361.196770 7408965.150816
+319372.032317 7408973.599369
+319381.424774 7408974.449223
+319393.142668 7408972.289593
+319421.386008 7408969.040150
+319435.858143 7408969.939996
+319442.933409 7408974.309247
+319450.528187 7408977.158759
+319463.144920 7408985.117396
+319473.032150 7408987.736947
+319488.015552 7408989.146706
+319507.328224 7408988.836759
+319527.201640 7408984.237547
+319540.931614 7408983.367696
+319563.048004 7408983.587658
+319574.180416 7408988.246860
+319588.594827 7408994.955711
+319597.162660 7409001.354615
+319603.330841 7409018.831621
+319611.453378 7409019.931433
+319617.819468 7409018.981595
+319629.009603 7409018.081749
+319638.979296 7409012.882640
+319646.920416 7409006.393752
+319654.655380 7408996.375468
+319658.613571 7408982.277882
+319666.967003 7408961.651415
+319675.485359 7408949.613477
+319686.477585 7408943.164582
+319704.091533 7408936.525719
+319717.326733 7408934.636043
+319727.741723 7408934.736026
+319746.031862 7408935.175950
+319757.197259 7408936.805671
+319773.697966 7408938.735341
+319782.133860 7408934.026147
+319789.802855 7408929.806870
+319795.476261 7408922.288158
+319805.495431 7408912.289871
+319819.060481 7408903.331405
+319836.740399 7408890.133666
+319848.153183 7408868.277410
+319856.465383 7408851.190336
+319867.606041 7408831.103777
+319884.403613 7408805.268203
+319894.546476 7408783.401948
+319910.107113 7408754.516896
+319929.271353 7408720.372744
+319951.000171 7408684.478893
+319967.773004 7408660.912929
+319972.489848 7408647.325257
+319978.996124 7408632.997711
+319990.079058 7408618.970114
+320007.091032 7408596.673933
+320017.415313 7408581.626510
+320024.713227 7408564.279482
+320030.172232 7408553.221376
+320031.524613 7408544.902801
+320031.978156 7408526.725914
+320031.862709 7408513.348206
+320035.540528 7408502.520061
+320036.958879 7408488.402479
+320034.534488 7408477.514344
+320021.183840 7408466.526226
+320010.084414 7408458.587586
+320002.761761 7408453.718420
+319993.253857 7408439.990771
+319991.348978 7408427.842852
+319991.200546 7408417.494625
+319992.058154 7408408.666137
+319990.425400 7408395.518389
+319987.992762 7408384.890209
+319980.752571 7408372.952254
+319971.978582 7408360.994303
+319965.208427 7408352.845698
+319957.968236 7408340.907743
+319953.474040 7408333.289048
+319952.863819 7408318.381602
+319954.719221 7408311.332809
+319966.997859 7408303.884085
+319975.953265 7408298.415022
+319985.716802 7408288.416734
+319994.202174 7408279.408278
+320000.708450 7408264.830775
+320005.895329 7408255.292408
+320012.121233 7408242.974518
+320017.357589 7408228.387017
+320026.337734 7408220.398385
+320037.857719 7408212.939663
+320046.846110 7408204.441119
+320056.824049 7408197.972227
+320066.884450 7408184.194587
+320074.207103 7408164.567949
+320075.608963 7408152.460023
+320078.107570 7408132.543434
+320079.583646 7408112.866805
+320088.027786 7408083.661807
+320092.835338 7408062.245476
+320087.953570 7408043.008771
+320083.277957 7408028.311288
+320079.097118 7408015.643458
+320076.441832 7408002.235755
+320061.656340 7407982.899067
+320043.630080 7407980.699444
+320031.895694 7407984.878728
+320015.840283 7407989.257978
+320003.413213 7407987.118344
+319996.882199 7407979.219697
+319994.960827 7407969.101430
+319996.074068 7407960.022985
+319997.236786 7407946.405318
+319994.532023 7407937.786794
+319991.085098 7407926.898659
+319990.417154 7407918.560088
+319995.364892 7407906.992069
+320004.542947 7407904.812442
+320015.807298 7407897.103763
+320026.535644 7407891.394741
+320041.881879 7407882.466270
+320047.802673 7407875.197515
+320051.818587 7407856.300752
+320051.488738 7407839.633607
+320047.324391 7407825.206078
+320045.271080 7407802.959889
+320037.907196 7407778.144140
+320032.200804 7407765.206356
+320033.058412 7407756.377868
+320037.725779 7407747.589373
+320043.118814 7407742.590230
+320054.168763 7407731.342156
+320067.511164 7407719.354210
+320084.490153 7407699.577597
+320081.356585 7407683.640327
+320077.390148 7407674.511891
+320067.750305 7407672.392254
+320058.522773 7407662.493949
+320053.467833 7407653.315522
+320051.736125 7407649.256217
+320045.765854 7407630.589416
+320042.830196 7407614.362194
+320041.568522 7407601.434408
+320043.687804 7407593.625746
+320047.860396 7407588.506623
+320059.438104 7407587.936720
+320071.279691 7407586.107034
+320118.679025 7407597.045160
+320172.576389 7407596.285290
+320214.920783 7407601.164455
+320223.241230 7407602.644201
+320231.817310 7407606.663513
+320236.369229 7407610.192908
+320242.957967 7407619.801262
+320245.769932 7407628.669743
+320260.679117 7407622.060875
+320275.497593 7407614.382190
+320286.786683 7407604.903814
+320298.603532 7407592.395957
+320309.117476 7407583.667452
+320325.016208 7407570.939632
+320597.818011 7407607.713333
+320617.988291 7407611.932610
+320752.566775 7407630.059505
+321039.337692 7407658.644609
+321300.413354 7407685.050086
+321356.331044 7407684.780132
+321364.602014 7407675.361745
+321361.352999 7407680.190918
+321517.569592 7407682.160581
+321537.731626 7407782.963314
+321446.998350 7407808.168997
+321401.635835 7407868.658635
+321361.311768 7407984.588777
+321371.396908 7408024.911870
+321426.836316 7408060.195827
+321436.921456 7408110.597193
+321497.407558 7408145.881150
+321598.217728 7408216.449062
+321704.066344 7408372.702297
+321799.829821 7408443.270209
+321935.925612 7408473.505031
+321996.263281 7408563.349641
+321973.693348 7408865.477889
+322122.339902 7408827.174450
+322153.997181 7408817.926034
+322179.230647 7408821.955344
+322203.441580 7408824.214957
+322238.108734 7408813.926719
+322253.496200 7408815.526445
+322284.716429 7408813.396810
+322313.132940 7408807.247863
+322329.963497 7408801.988764
+322358.701611 7408803.438516
+322380.933448 7408809.517475
+322404.113603 7408809.247521
+322415.180044 7408807.857759
+322542.592554 7408824.914837
+322552.166428 7408825.304770
+322618.490861 7408831.143770
+322646.717708 7408831.833652
+322706.362695 7408824.314940
+322746.307436 7408812.696930
+322797.541267 7408796.149764
+322856.287414 7408773.943568
+322892.216241 7408763.895289
+322973.557060 7408733.830439
+323012.512254 7408723.502208
+323084.922405 7408707.474954
+323121.346006 7408697.166719
+323156.079129 7408692.207569
+323171.128500 7408685.708682
+323189.567072 7408664.212364
+323240.083481 7408624.859105
+323266.083846 7408604.292628
+323285.949016 7408575.167617
+323310.407336 7408525.216173
+323369.953367 7408430.022479
+323376.789492 7408433.241927
+323381.753723 7408451.678769
+323378.001688 7408480.363856
+323369.186468 7408506.809326
+323349.016188 7408583.066264
+323338.073440 7408622.979427
+323332.771113 7408647.615207
+323340.761711 7408665.532138
+323356.272871 7408680.809521
+323412.033882 7408714.133813
+323433.168971 7408686.008631
+323471.142864 7408626.788774
+323499.311987 7408595.554125
+323531.612473 7408575.157618
+323560.243386 7408565.459280
+323595.751655 7408563.279653
+323625.256668 7408566.999016
+323662.950188 7408582.016444
+323694.623960 7408599.153508
+323744.876490 7408637.856879
+323762.630624 7408649.064959
+323778.042830 7408652.944294
+323792.391271 7408651.764496
+323803.399989 7408644.275779
+323816.610450 7408629.438321
+323865.461121 7408626.088894
+323902.181586 7408619.340050
+323929.468363 7408602.053011
+323981.502078 7408563.689583
+324000.311730 7408553.851268
+323944.542473 7408521.396827
+323919.341992 7408488.632439
+323909.265098 7408387.819708
+323932.321559 7408300.704630
+323962.189406 7408173.676388
+323987.381641 7408069.404249
+324226.802701 7408091.700430
+324388.098973 7408147.140934
+324473.785555 7408232.826257
+324605.832447 7408468.165945
+324674.861644 7408739.399485
+324786.292958 7408782.232148
+324947.589230 7408767.114738
+325164.324910 7408757.036464
+325209.695671 7408787.281284
+325270.173526 7408757.036464
+325426.431351 7408741.909055
+325541.730148 7409353.814242
+Region 1
+171
+320590.668529 7394417.702662
+320570.011721 7394476.472595
+320568.543892 7394484.331249
+320549.453868 7394530.903272
+320537.991607 7394560.358227
+320525.820171 7394599.411537
+320479.657772 7394708.622830
+320405.985947 7394870.235148
+320381.700798 7394935.883902
+320372.349572 7394970.877908
+320365.571171 7395000.312866
+320356.698227 7395038.366348
+320352.756528 7395105.674819
+320351.461870 7395155.456292
+320350.060011 7395177.552507
+320353.531674 7395239.561885
+320358.553628 7395296.252175
+320366.404040 7395347.883331
+320377.330296 7395439.667609
+320387.250511 7395528.912322
+320407.123927 7395687.585143
+320383.778848 7395733.017361
+320392.660038 7395796.126551
+320390.804637 7395835.439817
+320377.305557 7395872.873405
+320334.886947 7395944.311168
+320267.944046 7396038.704999
+320230.844254 7396050.452987
+320282.383196 7396157.084722
+320290.316070 7396178.331083
+320297.745924 7396227.812607
+320295.115376 7396267.875744
+320296.665667 7396294.611165
+320309.612250 7396320.956652
+320315.293903 7396337.903749
+320320.695184 7396358.880156
+320322.509354 7396382.846051
+320329.972193 7396399.303232
+320337.888574 7396422.069332
+320344.320634 7396470.031117
+320340.510876 7396529.990846
+320329.164062 7396582.821797
+320323.012374 7396620.585328
+320312.721079 7396667.877228
+320308.449531 7396692.792960
+320307.484722 7396717.488730
+320306.231295 7396745.463938
+320321.915626 7396777.378471
+320432.208961 7396888.099506
+320457.615597 7396909.775793
+320584.657027 7397045.872481
+320602.031835 7397059.150206
+320621.393984 7397076.227281
+320632.691320 7397088.945103
+320646.742897 7397104.962359
+320661.569620 7397119.469874
+320672.083564 7397133.687439
+320681.377066 7397143.615738
+320687.149427 7397149.714693
+320695.445135 7397158.113255
+320697.943743 7397171.510960
+320700.013547 7397186.898324
+320696.706809 7397217.623061
+320702.874989 7397270.414019
+320706.478592 7397280.662263
+320708.424702 7397312.206860
+320758.627755 7397294.119958
+320872.565923 7397259.935813
+320954.607672 7397239.429326
+321025.253130 7397232.590497
+321089.062463 7397223.472059
+321155.156001 7397230.310888
+321439.873607 7397044.702681
+321435.824708 7396919.844068
+321439.766406 7396810.552789
+321460.010902 7396574.223270
+321538.275877 7396361.519704
+321734.049639 7396143.926976
+321851.319285 7396032.046140
+321998.324839 7395885.191295
+322149.478247 7395741.825852
+322323.325281 7395595.220964
+322440.265078 7395484.729890
+322541.866886 7395376.308462
+322679.249088 7395255.479159
+322778.038931 7395159.315631
+322908.486054 7395063.202094
+322960.626970 7395008.331493
+323055.293698 7394922.096264
+323196.576368 7394782.140237
+323287.581769 7394707.702988
+323222.428301 7394645.443652
+323177.948133 7394563.257730
+323163.756370 7394483.771345
+323167.590867 7394443.338271
+323165.661249 7394282.015904
+323146.868090 7394239.923114
+323124.116739 7394203.979271
+323100.408826 7394172.134726
+323080.222053 7394152.618069
+323037.861167 7394125.962635
+322826.287627 7394000.014208
+322499.473014 7393798.698692
+322483.970100 7393790.020179
+322461.342443 7393780.821754
+322433.618616 7393774.642813
+322410.224060 7393772.543172
+322370.271072 7393773.443018
+322325.782658 7393760.095304
+322267.292144 7393743.938072
+322216.957152 7393724.751359
+322189.521943 7393709.693938
+322171.487436 7393692.626861
+322145.858151 7393666.661309
+322121.762665 7393638.156191
+322102.466486 7393618.809505
+322078.090628 7393600.462648
+322053.442644 7393586.944963
+322023.187224 7393575.926851
+322000.048301 7393570.017863
+321977.148519 7393570.717743
+321931.068582 7393580.216116
+321820.602076 7393594.613650
+321795.921108 7393597.333184
+321770.992752 7393593.703806
+321743.021538 7393586.764994
+321701.056470 7393575.976842
+321647.876529 7393577.586566
+321632.299399 7393601.152530
+321610.117039 7393620.119281
+321570.609348 7393647.164648
+321457.446324 7393720.942011
+321396.284032 7393764.414565
+321374.109918 7393778.562141
+321350.121633 7393807.667156
+321335.558789 7393830.223292
+321293.321596 7393931.615924
+321281.306838 7393952.402364
+321273.143070 7393963.540456
+321264.476281 7393969.349461
+321253.789166 7393974.908509
+321237.733755 7393980.437562
+321218.643731 7393983.177093
+321193.204110 7393980.307584
+321166.758448 7393971.599076
+321150.769007 7393966.229995
+321121.767014 7393954.462011
+321074.227494 7393937.314948
+321027.446627 7393920.407844
+321018.515960 7393917.648317
+320963.406400 7393897.361792
+320927.296156 7393881.784460
+320884.333295 7393867.696873
+320871.873240 7393865.367272
+320856.856854 7393865.837192
+320833.181926 7393869.826508
+320814.339289 7393877.375215
+320801.838003 7393888.513308
+320795.463667 7393897.891701
+320782.426376 7393918.408187
+320775.507789 7393938.444755
+320752.146217 7394000.004210
+320741.500333 7394022.800305
+320727.094169 7394061.873613
+320706.561054 7394115.714390
+320681.830609 7394182.982868
+320666.599821 7394221.756226
+320639.230581 7394292.724070
+320620.866225 7394345.954952
+320601.792694 7394391.277189
+320590.668529 7394417.702662
+Region 1
+367
+318137.109801 7391777.094974
+318157.115156 7391774.235464
+318196.969189 7391732.072686
+318223.695223 7391681.961270
+318227.034946 7391625.160999
+318223.695223 7391571.710155
+318214.137841 7391495.123274
+318218.656776 7391494.383400
+318301.754042 7391488.984325
+318315.739649 7391480.505777
+318345.689959 7391473.866915
+318363.872897 7391466.138238
+318401.483955 7391421.005969
+318416.706497 7391401.979228
+318436.703606 7391384.842164
+318459.537419 7391372.474282
+318492.843945 7391351.537868
+318529.960229 7391318.223575
+318537.876610 7391297.777077
+318537.571500 7391283.019605
+318537.571500 7391264.932703
+318538.528062 7391239.237105
+318545.191017 7391202.123462
+318555.474066 7391179.767291
+318567.076513 7391161.200472
+318590.866888 7391132.645363
+318610.863998 7391112.658786
+318629.888052 7391096.481557
+318646.792825 7391084.673580
+318682.226878 7391045.090360
+318700.310861 7391022.254272
+318733.617387 7391000.368021
+318753.606250 7390978.471771
+318762.174084 7390959.445030
+318769.793601 7390943.267801
+318778.369681 7390925.270884
+318782.146454 7390912.813018
+318790.722534 7390902.344811
+318937.299284 7390809.060790
+318937.282792 7390809.070788
+318987.271442 7390814.669829
+319066.641412 7390823.018399
+319134.516136 7390826.917731
+319184.323369 7390825.817920
+319230.625954 7390827.097700
+319257.846762 7390828.927387
+319269.333761 7390824.218194
+319273.869188 7390822.668459
+319311.801849 7390817.509343
+319347.417319 7390807.781009
+319391.575884 7390795.883047
+319422.441525 7390783.725130
+319451.781614 7390766.388099
+319471.993125 7390752.570466
+319478.821004 7390744.891781
+319552.113502 7390704.138762
+319596.387515 7390685.212004
+319685.826132 7390644.648952
+319734.948928 7390627.411905
+319806.550949 7390607.835258
+319851.113579 7390596.317231
+319968.152331 7390592.297919
+319999.999274 7390582.759553
+320113.203528 7390565.742468
+320132.029673 7390564.162739
+320158.302163 7390560.743324
+320194.626809 7390557.223927
+320220.313818 7390552.494737
+320311.682053 7390535.307681
+320451.686557 7390505.742746
+320557.296033 7390478.787363
+320638.051370 7390469.119019
+320688.007035 7390463.140043
+320707.633064 7390460.790445
+320736.816474 7390489.175583
+320761.200579 7390516.360927
+320776.398382 7390531.958255
+320793.410355 7390535.337676
+320878.437240 7390555.024304
+320898.450841 7390566.862276
+320914.242373 7390600.816460
+320924.467699 7390629.651521
+320936.968985 7390660.776190
+320951.927647 7390682.132532
+321029.780311 7390696.800019
+321064.793806 7390702.978961
+321093.548412 7390702.069117
+321154.793167 7390664.825496
+321187.712120 7390647.498464
+321202.753245 7390642.259361
+321218.750932 7390643.389168
+321227.640369 7390645.238851
+321239.036660 7390650.397967
+321251.158619 7390662.955816
+321258.398809 7390684.132189
+321263.593934 7390714.377008
+321266.686271 7390736.613200
+321272.656542 7390757.269661
+321281.240868 7390766.488082
+321293.346335 7390780.055758
+321330.042061 7390805.251442
+321344.505950 7390808.660858
+321359.769722 7390807.751014
+321380.921304 7390800.012340
+321401.042107 7390794.293319
+321427.792879 7390785.574813
+321449.109385 7390790.304003
+321469.840409 7390808.510884
+321479.067941 7390834.276471
+321477.666082 7390855.142896
+321474.466545 7390877.509065
+321474.326359 7390898.115536
+321482.547851 7390924.141078
+321492.261910 7390953.975967
+321492.187694 7390965.434005
+321483.636353 7390987.410240
+321476.536348 7390998.948264
+321453.776752 7391046.600102
+321437.366753 7391066.846634
+321431.676854 7391082.583938
+321433.589979 7391099.900972
+321439.354094 7391113.428654
+321459.549113 7391134.954967
+321485.557725 7391161.340448
+321495.082121 7391182.266863
+321498.017779 7391198.074155
+321494.109066 7391213.061588
+321477.253770 7391235.417759
+321469.337389 7391267.862201
+321466.121359 7391293.547802
+321479.496745 7391308.125305
+321510.700482 7391357.716810
+321521.280396 7391371.794399
+321537.673902 7391392.260893
+321559.443951 7391405.388644
+321591.934100 7391413.507254
+321610.479873 7391414.147144
+321628.547364 7391410.957690
+321684.077481 7391393.790631
+321748.546513 7391367.525130
+321795.014022 7391341.369610
+321817.996267 7391324.482503
+321839.955979 7391310.384918
+321869.526962 7391297.097194
+321894.447071 7391295.997382
+321907.888427 7391301.936365
+321924.850924 7391312.244599
+321926.326999 7391319.383376
+321931.818989 7391335.190669
+321933.773345 7391347.678530
+321936.412139 7391370.604603
+321937.360456 7391376.423606
+321948.121787 7391407.328312
+321976.249679 7391420.496057
+322011.279667 7391428.634663
+322040.232183 7391431.894104
+322059.759257 7391431.684140
+322075.047769 7391433.403846
+322106.507139 7391443.292152
+322127.708198 7391466.588161
+322135.740026 7391481.915536
+322139.920865 7391502.821955
+322141.363956 7391517.079513
+322150.377086 7391536.476190
+322164.189522 7391562.791683
+322169.219723 7391570.200414
+322226.712443 7391602.414896
+322368.531118 7391684.830778
+322422.972732 7391717.525178
+322482.436301 7391757.128395
+322548.703011 7391847.932841
+322556.776071 7391855.881479
+322567.908482 7391864.609984
+322581.102451 7391869.279184
+322662.278346 7391893.764990
+322692.723429 7391904.153210
+322706.420418 7391907.812584
+322718.097081 7391909.932221
+322733.360854 7391909.022376
+322766.197344 7391902.633471
+322799.091558 7391887.836005
+322866.661172 7391863.280212
+322906.746099 7391867.469494
+322776.703042 7391931.958448
+322650.156387 7391999.996793
+322563.909060 7392044.009254
+322555.448428 7392051.328001
+322549.882222 7392055.577273
+322537.908695 7392066.175458
+322529.175937 7392079.143236
+322489.643507 7392130.264480
+322473.381940 7392157.059890
+322449.302947 7392184.045268
+322409.201527 7392233.856735
+322367.079781 7392291.606843
+322301.893328 7392374.662616
+322394.119171 7392445.280520
+322405.647402 7392453.929039
+322421.793521 7392481.394334
+322426.188762 7392503.430560
+322424.720933 7392522.537287
+322415.913959 7392544.573512
+322402.678759 7392556.331498
+322419.501069 7392592.515300
+322361.060033 7392681.410073
+322272.322345 7392799.509844
+322163.966874 7392944.624987
+322253.578662 7393013.393208
+322182.619848 7393104.547594
+322113.953485 7393197.501672
+322046.054022 7393285.626577
+322094.401672 7393384.509639
+322023.187224 7393575.926851
+322000.048301 7393570.017863
+321977.148519 7393570.717743
+321931.068582 7393580.216116
+321820.602076 7393594.613650
+321795.921108 7393597.333184
+321770.992752 7393593.703806
+321743.021538 7393586.764994
+321701.056470 7393575.976842
+321647.876529 7393577.586566
+321632.299399 7393601.152530
+321610.117039 7393620.119281
+321570.609348 7393647.164648
+321457.446324 7393720.942011
+321396.284032 7393764.414565
+321374.109918 7393778.562141
+321350.121633 7393807.667156
+321335.558789 7393830.223292
+321293.321596 7393931.615924
+321281.306838 7393952.402364
+321273.143070 7393963.540456
+321264.476281 7393969.349461
+321253.789166 7393974.908509
+321237.733755 7393980.437562
+321218.643731 7393983.177093
+321193.204110 7393980.307584
+321166.758448 7393971.599076
+321150.769007 7393966.229995
+321121.767014 7393954.462011
+321074.227494 7393937.314948
+321027.446627 7393920.407844
+321018.515960 7393917.648317
+320963.406400 7393897.361792
+320927.296156 7393881.784460
+320884.333295 7393867.696873
+320871.873240 7393865.367272
+320856.856854 7393865.837192
+320833.181926 7393869.826508
+320814.339289 7393877.375215
+320801.838003 7393888.513308
+320795.463667 7393897.891701
+320782.426376 7393918.408187
+320775.507789 7393938.444755
+320752.146217 7394000.004210
+320741.500333 7394022.800305
+320727.094169 7394061.873613
+320706.561054 7394115.714390
+320681.830609 7394182.982868
+320666.599821 7394221.756226
+320639.230581 7394292.724070
+320620.866225 7394345.954952
+320601.792694 7394391.277189
+320590.668529 7394417.702662
+320555.721003 7394311.490855
+320515.982418 7394179.643440
+320499.193092 7394133.031424
+320452.016407 7393999.974215
+320430.963780 7393935.585245
+320424.886308 7393921.887591
+320416.079333 7393907.939980
+320407.420791 7393898.191650
+320388.141104 7393888.103378
+320376.151085 7393875.325567
+320299.147783 7393842.591174
+320254.230565 7393816.785594
+320219.942738 7393798.638702
+320201.083608 7393788.440449
+320185.110659 7393774.952759
+320172.213555 7393761.175119
+320163.266394 7393749.317151
+320156.908550 7393735.069591
+320151.391822 7393718.492431
+320147.326430 7393699.725645
+320143.343501 7393683.948348
+320149.750822 7393662.422035
+320153.610058 7393647.204642
+320158.986601 7393628.947769
+320139.401803 7393628.377866
+320126.422236 7393629.857613
+320107.332212 7393631.337359
+319947.099704 7393498.110180
+319934.408755 7393475.274092
+319944.559865 7393454.977568
+320017.868856 7393370.632016
+319972.860929 7393270.229214
+319955.766493 7393280.517452
+319942.836403 7393284.136832
+319933.526408 7393281.547275
+319927.663338 7393273.868591
+319912.737661 7393190.252913
+319898.306757 7393106.667231
+319887.858783 7393049.167080
+319874.829739 7393026.740921
+319861.066780 7393009.263915
+319836.286857 7392990.347155
+319794.000186 7392960.032348
+319730.100145 7393005.004645
+319463.590216 7392947.154554
+319397.224552 7392932.737023
+319321.598371 7392916.339832
+319274.866982 7392900.972464
+319263.314013 7392893.533739
+319249.757209 7392880.026052
+319238.723753 7392866.528364
+319138.185709 7392698.427159
+319115.607529 7392510.169405
+319084.799612 7392285.237934
+318991.584220 7392249.454064
+318954.401966 7392234.186679
+318931.287782 7392228.897585
+318910.672205 7392229.957403
+318884.779041 7392231.207189
+318859.133264 7392230.687278
+318841.544054 7392227.987741
+318806.613021 7392220.059099
+318783.490590 7392213.260263
+318759.122978 7392202.412121
+318734.499734 7392195.343332
+318696.558827 7392185.614999
+318663.639874 7392176.446569
+318627.422429 7392173.527069
+318588.178617 7392146.651673
+318574.836216 7392137.953163
+318561.139227 7392130.404456
+318541.348273 7392120.576139
+318523.462199 7392111.137756
+318505.592617 7392106.278588
+318488.547658 7392113.227398
+318475.056825 7392077.453526
+318454.416510 7392119.136386
+318445.757968 7392132.164154
+318438.963074 7392137.533235
+318430.642627 7392142.922311
+318420.021482 7392144.122106
+318410.909397 7392144.172097
+318395.711594 7392140.052803
+318378.617158 7392139.382918
+318364.994385 7392174.656876
+318311.451609 7392168.307963
+318311.484594 7392148.871292
+318314.535699 7392129.214659
+318322.625252 7392098.509919
+318330.945698 7392082.192714
+318333.757663 7392054.207508
+318327.507020 7392035.460719
+318314.956257 7392021.203161
+318302.908514 7392009.725127
+318278.813028 7391988.778715
+318265.256225 7391975.520986
+318245.679673 7391958.153961
+318228.362589 7391939.557146
+318218.079539 7391921.020321
+318214.343997 7391898.774132
+318149.404931 7391793.632142
+318137.109801 7391777.094974
+Region 1
+691
+315576.902572 7387892.880305
+315576.877833 7387892.920298
+315585.132310 7387913.956695
+315592.141606 7387931.943614
+315595.464837 7387937.512660
+315600.082726 7387945.351317
+315604.280058 7387956.599391
+315607.339409 7387964.917966
+315604.733600 7387985.594424
+315596.874942 7388017.508957
+315583.153215 7388061.421436
+315583.177953 7388061.501422
+315571.039502 7388094.955692
+315563.807558 7388118.011742
+315552.444252 7388144.677175
+315547.059463 7388168.353119
+315546.993493 7388168.403111
+315541.773629 7388185.620162
+315538.854464 7388207.066488
+315547.348081 7388229.222693
+315558.760864 7388254.838305
+315570.783869 7388281.243782
+315575.822316 7388294.151571
+315581.759602 7388309.408958
+315590.797470 7388329.125580
+315595.209204 7388343.133181
+315595.687485 7388353.771359
+315592.562164 7388358.720511
+315585.165295 7388362.719826
+315573.529863 7388362.469869
+315568.491417 7388365.509348
+315565.324864 7388373.997894
+315567.526608 7388385.205974
+315569.934507 7388404.732630
+315570.066447 7388426.448910
+315560.022538 7388445.815592
+315545.245292 7388468.331736
+315525.561540 7388491.677737
+315509.473144 7388504.435551
+315493.228069 7388513.533993
+315471.837347 7388526.221820
+315457.843494 7388535.570218
+315445.045344 7388546.818292
+315434.036626 7388561.735736
+315426.450094 7388572.273931
+315422.285747 7388586.621474
+315427.530350 7388599.869204
+315443.569268 7388614.586683
+315456.194248 7388625.594798
+315456.218986 7388625.604796
+315456.235479 7388625.624793
+315473.412377 7388635.783053
+315473.461855 7388635.813048
+315493.665120 7388644.041638
+315517.999746 7388649.330732
+315538.689539 7388651.700326
+315553.442046 7388655.319706
+315563.321030 7388657.439343
+315573.208260 7388658.229208
+315581.974004 7388663.848245
+315576.778878 7388678.955658
+315568.408954 7388687.274233
+315553.870850 7388698.832253
+315546.424503 7388706.600922
+315537.535067 7388714.909499
+315530.088720 7388731.096726
+315527.903469 7388742.144834
+315527.680821 7388751.553222
+315525.949113 7388776.119014
+315520.300445 7388794.545858
+315512.062460 7388808.183522
+315491.875688 7388830.519696
+315482.136889 7388842.137706
+315471.895071 7388861.064464
+315460.845122 7388879.191359
+315452.640122 7388898.807999
+315447.428504 7388915.025221
+315444.608294 7388928.392931
+315445.746273 7388951.448982
+315448.352082 7388979.504176
+315445.886459 7388996.751222
+315440.732565 7389016.957761
+315439.058580 7389028.005868
+315438.943133 7389053.371524
+315440.872751 7389070.568578
+315451.304233 7389092.854760
+315462.337689 7389116.250753
+315476.669638 7389137.367136
+315491.463376 7389162.032911
+315505.737601 7389187.908479
+315519.253173 7389216.763536
+315529.775364 7389232.070914
+315539.538901 7389259.446225
+315554.810920 7389287.111486
+315570.478758 7389323.195305
+315580.209310 7389352.780238
+315586.319767 7389378.445841
+315588.942069 7389405.061282
+315589.370873 7389427.767393
+315587.655657 7389450.343526
+315582.650195 7389474.759344
+315579.236255 7389494.765917
+315580.926732 7389514.282574
+315586.319767 7389531.739583
+315597.147068 7389547.716847
+315612.798414 7389561.314518
+315612.847891 7389561.354511
+315625.002835 7389568.263327
+315639.367769 7389578.971493
+315652.141180 7389585.890308
+315661.632592 7389602.397480
+315666.860702 7389616.865002
+315664.197169 7389633.562142
+315662.721094 7389639.291161
+315660.395657 7389648.089654
+315659.637004 7389654.498556
+315658.969059 7389659.747657
+315660.585320 7389669.126050
+315661.772778 7389676.244831
+315663.116913 7389683.223636
+315664.881607 7389692.712010
+315664.428064 7389698.591003
+315663.859074 7389705.289856
+315659.373124 7389720.957172
+315659.529803 7389740.673795
+315661.129572 7389752.631747
+315663.116913 7389767.899131
+315669.540727 7389792.684886
+315677.234460 7389822.139841
+315686.396022 7389845.975758
+315690.923203 7389857.823728
+315695.458630 7389868.191952
+315704.859333 7389889.828246
+315722.935070 7389921.842762
+315746.230672 7389960.466146
+315762.310822 7389989.131236
+315774.977032 7390020.865801
+315782.448117 7390051.750510
+315789.168795 7390069.007554
+315804.712940 7390091.353727
+315815.944306 7390115.529586
+315820.430255 7390131.756806
+315819.531416 7390154.452918
+315803.558467 7390191.026654
+315798.280880 7390212.562965
+315787.527795 7390231.479724
+315777.896198 7390242.317868
+315771.942419 7390261.184636
+315767.398746 7390281.731117
+315764.322902 7390298.628222
+315763.160183 7390299.558063
+315751.846355 7390308.556522
+315735.337401 7390322.954056
+315734.240653 7390323.903893
+315724.378161 7390331.292627
+315709.873041 7390342.150767
+315709.831810 7390342.200759
+315709.823564 7390342.200759
+315700.093011 7390352.269034
+315690.321228 7390362.387301
+315668.410993 7390386.223218
+315646.030723 7390405.529911
+315626.404694 7390423.896765
+315598.812807 7390450.792158
+315591.885973 7390457.351035
+315586.905250 7390463.649956
+315581.875049 7390469.908884
+315579.739275 7390477.407599
+315577.554024 7390484.866321
+315586.072380 7390505.352812
+315601.814435 7390528.028928
+315610.398761 7390543.536272
+315619.815956 7390557.613860
+315629.183674 7390571.741441
+315635.335362 7390581.729730
+315641.437573 7390591.778008
+315645.552442 7390601.026424
+315649.626080 7390610.324832
+315654.243969 7390622.022828
+315656.206572 7390627.081961
+315661.137818 7390640.759618
+315668.460471 7390659.246452
+315669.054199 7390659.986325
+315674.133877 7390666.455217
+315682.676972 7390668.724828
+315691.178836 7390671.044433
+315700.653755 7390670.484527
+315711.250161 7390669.914624
+315721.557950 7390670.314556
+315732.731592 7390670.794474
+315751.714415 7390670.924451
+315770.771454 7390665.735340
+315795.675071 7390658.076652
+315805.298422 7390657.626729
+315814.113643 7390657.256793
+315824.602848 7390659.356433
+315831.876023 7390660.856176
+315835.875445 7390662.665866
+315844.723651 7390666.725171
+315857.925866 7390674.483842
+315862.502524 7390677.193378
+315879.926809 7390679.852922
+315889.715085 7390680.402828
+315900.492909 7390681.052717
+315923.203028 7390684.992042
+315935.506404 7390689.871206
+315941.732308 7390692.370778
+315956.138473 7390699.309589
+315966.602940 7390704.548692
+315979.335120 7390710.957594
+316023.089620 7390730.564236
+316046.195558 7390742.162249
+316069.309742 7390750.220869
+316085.035304 7390754.380156
+316091.170500 7390756.009877
+316124.905829 7390760.639084
+316144.944170 7390760.009192
+316180.163821 7390758.919379
+316199.773357 7390757.859560
+316213.124005 7390759.339307
+316224.949100 7390760.679077
+316243.981400 7390765.688219
+316264.687685 7390770.917324
+316265.611263 7390771.157282
+316269.709640 7390772.057128
+316317.174943 7390782.555330
+316373.010171 7390793.163513
+316380.209130 7390794.533278
+316388.678009 7390795.703078
+316437.289539 7390802.451922
+316618.442734 7390839.395594
+316694.885292 7390849.543856
+316729.676139 7390854.463013
+316748.147695 7390857.102561
+316765.769890 7390858.652295
+316787.135874 7390860.561968
+316820.557847 7390858.102390
+316853.353106 7390847.654179
+316865.912115 7390839.285613
+316866.753231 7390838.665719
+316906.013535 7390809.730675
+316933.127141 7390927.270542
+316940.655950 7390959.964941
+316968.132390 7391031.482691
+316968.148883 7391031.522684
+316974.481988 7391043.380653
+316995.963419 7391083.603763
+317017.939624 7391137.224578
+317017.972608 7391137.264572
+317132.603461 7391276.700687
+317133.172451 7391277.440561
+317171.492684 7391327.372008
+317196.594211 7391352.607685
+317214.735918 7391364.455656
+317223.204797 7391370.004705
+317299.746310 7391407.608264
+317461.388923 7391487.064654
+317501.127508 7391507.301188
+317505.291855 7391509.420825
+317510.033437 7391512.470302
+317537.213014 7391529.987302
+317575.590971 7391563.921489
+317603.191105 7391593.726384
+317632.019927 7391631.859852
+317650.194620 7391655.715766
+317680.219146 7391695.199002
+317709.814867 7391735.372121
+317732.409539 7391757.308364
+317752.736498 7391776.954998
+317773.088195 7391786.243407
+317802.733394 7391794.372015
+317802.741640 7391794.372015
+317842.199854 7391795.531816
+317877.147380 7391795.891755
+317907.312091 7391794.182048
+317954.843365 7391785.333563
+318076.788624 7391771.685901
+318093.355301 7391769.886209
+318100.158441 7391769.166333
+318100.174934 7391769.166333
+318100.174934 7391769.146336
+318107.819189 7391768.676416
+318124.814671 7391767.636595
+318137.109801 7391777.094974
+318157.115156 7391774.235464
+318196.969189 7391732.072686
+318223.695223 7391681.961270
+318227.034946 7391625.160999
+318223.695223 7391571.710155
+318214.137841 7391495.123274
+318218.656776 7391494.383400
+318301.754042 7391488.984325
+318315.739649 7391480.505777
+318345.689959 7391473.866915
+318363.872897 7391466.138238
+318401.483955 7391421.005969
+318416.706497 7391401.979228
+318436.703606 7391384.842164
+318459.537419 7391372.474282
+318492.843945 7391351.537868
+318529.960229 7391318.223575
+318537.876610 7391297.777077
+318537.571500 7391283.019605
+318537.571500 7391264.932703
+318538.528062 7391239.237105
+318545.191017 7391202.123462
+318555.474066 7391179.767291
+318567.076513 7391161.200472
+318590.866888 7391132.645363
+318610.863998 7391112.658786
+318629.888052 7391096.481557
+318646.792825 7391084.673580
+318682.226878 7391045.090360
+318700.310861 7391022.254272
+318733.617387 7391000.368021
+318753.606250 7390978.471771
+318762.174084 7390959.445030
+318769.793601 7390943.267801
+318778.369681 7390925.270884
+318782.146454 7390912.813018
+318790.722534 7390902.344811
+318937.282792 7390809.070788
+318937.299284 7390809.060790
+318937.282792 7390809.070788
+318987.271442 7390814.669829
+319066.641412 7390823.018399
+319134.516136 7390826.917731
+319184.323369 7390825.817920
+319230.625954 7390827.097700
+319257.846762 7390828.927387
+319269.333761 7390824.218194
+319273.869188 7390822.668459
+319311.801849 7390817.509343
+319347.417319 7390807.781009
+319391.575884 7390795.883047
+319422.441525 7390783.725130
+319451.781614 7390766.388099
+319471.993125 7390752.570466
+319478.821004 7390744.891781
+319552.113502 7390704.138762
+319596.387515 7390685.212004
+319685.826132 7390644.648952
+319734.948928 7390627.411905
+319806.550949 7390607.835258
+319851.113579 7390596.317231
+319968.152331 7390592.297919
+319999.999274 7390582.759553
+320113.203528 7390565.742468
+320132.029673 7390564.162739
+320158.302163 7390560.743324
+320194.626809 7390557.223927
+320220.313818 7390552.494737
+320311.682053 7390535.307681
+320451.686557 7390505.742746
+320557.296033 7390478.787363
+320638.051370 7390469.119019
+320688.007035 7390463.140043
+320707.633064 7390460.790445
+320891.309606 7390458.760793
+320876.697285 7390395.441639
+320866.422482 7390373.225445
+320858.143266 7390356.628287
+320820.251836 7390282.311017
+320813.028138 7390259.114991
+320848.330252 7390142.754922
+320917.648066 7390122.468397
+320970.052862 7390110.630425
+321044.640018 7390024.795128
+321074.120293 7390026.544828
+321070.929002 7390008.537912
+321069.106585 7389989.461180
+321068.207745 7389969.464605
+321061.841655 7389951.297717
+321040.071607 7389930.811226
+321023.843025 7389921.752778
+321002.823383 7389913.524187
+320895.968726 7389869.121793
+320769.413824 7389817.840577
+320625.327436 7389754.821372
+320564.288837 7389725.306427
+320531.073020 7389702.870270
+320419.567489 7389627.903112
+320402.027756 7389574.232305
+320376.390225 7389522.751123
+320358.149563 7389505.934004
+320341.863258 7389510.383242
+320329.394957 7389511.563040
+320305.794245 7389513.482711
+320301.184602 7389489.616799
+320292.938371 7389463.261313
+320290.283085 7389446.834127
+320283.603638 7389425.487783
+320275.876920 7389406.231082
+320270.343699 7389391.323635
+320265.445438 7389374.756473
+320252.622550 7389355.219820
+320238.076199 7389334.663341
+320223.175260 7389317.306314
+320212.620085 7389304.328537
+320195.756543 7389289.611058
+320175.586263 7389277.843074
+320155.605646 7389267.524841
+320140.160456 7389261.685841
+320121.655914 7389255.696867
+320099.737433 7389245.678583
+320079.229058 7389236.230202
+320065.845425 7389229.311387
+320047.992336 7389211.704403
+320029.891860 7389181.239621
+320016.871062 7389161.363026
+320004.279067 7389147.365423
+319987.093923 7389134.077699
+319963.880783 7389120.610006
+319949.532342 7389109.141971
+319926.360434 7389092.794771
+319902.067039 7389076.437573
+319890.777949 7389064.219665
+319876.429507 7389052.751630
+319859.714398 7389042.243430
+319848.367585 7389035.344611
+319831.883370 7389031.375291
+319810.657572 7389030.775394
+319791.336653 7389025.116363
+319784.360342 7389020.897086
+319767.628740 7389010.758823
+319754.228616 7389004.829838
+319736.779591 7388995.861375
+319721.400371 7388985.153209
+319705.303729 7388965.786526
+319693.049830 7388949.579302
+319683.937745 7388943.710308
+319670.595344 7388933.242101
+319656.156194 7388928.522909
+319637.635160 7388924.413613
+319621.942583 7388922.233986
+319600.947680 7388919.314486
+319589.625606 7388910.426009
+319578.699350 7388902.757322
+319567.830818 7388898.628030
+319553.721517 7388892.259121
+319540.799674 7388888.329794
+319521.965283 7388892.749037
+319493.779667 7388902.477370
+319471.473613 7388906.416696
+319442.595313 7388906.166738
+319419.555345 7388903.777148
+319390.149286 7388904.297059
+319366.573313 7388904.117090
+319346.229862 7388906.526677
+319289.924599 7388944.930099
+319275.708097 7388955.158347
+319264.798334 7388963.007002
+319246.730843 7388970.975637
+319226.659517 7388975.934788
+319204.064845 7388979.534171
+319176.439973 7388976.304724
+319142.539719 7388969.245934
+319105.530635 7388956.928043
+319080.800190 7388943.330373
+319052.812483 7388927.923012
+319040.443137 7388921.794062
+319016.966118 7388905.216901
+319002.312566 7388893.518905
+318985.671673 7388877.141710
+318975.941121 7388862.954140
+318967.744368 7388832.499357
+318962.813122 7388810.733085
+318958.648775 7388784.427591
+318954.987449 7388766.660635
+318953.074323 7388748.363769
+318951.458062 7388730.176884
+318943.714851 7388712.909842
+318932.681395 7388697.162539
+318919.817275 7388681.155281
+318907.695316 7388670.487108
+318895.589849 7388658.929088
+318889.627825 7388646.341244
+318884.861503 7388635.423114
+318882.709237 7388619.665813
+318881.068237 7388603.698548
+318882.379388 7388588.541145
+318882.931885 7388577.143097
+318876.763705 7388563.775387
+318868.187625 7388556.356658
+318852.008520 7388551.947413
+318832.926743 7388551.817435
+318818.685502 7388555.956726
+318808.278759 7388563.475438
+318800.065514 7388575.663351
+318794.713710 7388587.781275
+318780.711610 7388597.029691
+318767.492903 7388601.508924
+318752.270361 7388602.878689
+318733.938990 7388607.297932
+318717.479514 7388609.757511
+318706.883107 7388608.407742
+318694.967304 7388606.038148
+318679.472637 7388604.188465
+318657.405723 7388613.876805
+318633.673072 7388626.874579
+318603.409405 7388638.902518
+318575.190804 7388650.850472
+318558.698343 7388655.739634
+318542.667670 7388664.288170
+318523.346752 7388674.796370
+318511.958707 7388679.745522
+318498.253472 7388681.685190
+318485.768679 7388684.184762
+318477.662634 7388679.325594
+318469.432896 7388668.587434
+318463.907921 7388653.120083
+318459.009660 7388636.112996
+318451.027309 7388613.636846
+318442.311043 7388592.050544
+318434.551340 7388575.553369
+318425.777351 7388558.836233
+318416.755974 7388537.679857
+318411.799990 7388525.541936
+318406.497664 7388516.943409
+318398.474081 7388505.775322
+318384.554444 7388500.836168
+318365.118078 7388495.937007
+318348.130843 7388491.187821
+318337.278803 7388485.628773
+318315.541739 7388477.380186
+318297.795851 7388475.940432
+318283.546365 7388480.969571
+318264.975853 7388488.708245
+318239.833096 7388491.277805
+318222.854107 7388494.167310
+318202.139576 7388493.357449
+318187.650948 7388493.177480
+318166.606568 7388494.357278
+318150.328508 7388498.586553
+318127.981223 7388506.505197
+318110.218843 7388514.693794
+318092.332768 7388524.992030
+318074.017890 7388536.510057
+318063.083388 7388545.788468
+318052.338550 7388556.066707
+318032.085807 7388559.796069
+318015.370698 7388557.596445
+318000.981025 7388549.217881
+317974.642565 7388533.050650
+317959.246852 7388523.342313
+317936.800612 7388506.555188
+317915.690262 7388488.678250
+317889.912545 7388468.971626
+317870.467933 7388456.213811
+317852.359210 7388443.695955
+317840.987658 7388438.346872
+317811.886710 7388431.558035
+317782.719792 7388429.428399
+317750.988297 7388428.138620
+317722.843912 7388425.909002
+317703.160159 7388424.779196
+317676.038307 7388422.889519
+317659.306705 7388421.789708
+317644.611922 7388413.851068
+317635.071033 7388401.333212
+317627.847335 7388390.934993
+317608.913989 7388370.768447
+317583.499106 7388346.302638
+317571.418378 7388332.415017
+317553.524058 7388310.478774
+317541.501054 7388292.721816
+317528.983275 7388273.625087
+317514.923452 7388255.058267
+317502.521121 7388242.830362
+317486.696605 7388226.793109
+317478.607052 7388220.714150
+317464.720400 7388212.785508
+317449.753491 7388210.385919
+317432.799241 7388211.275767
+317408.901665 7388211.865666
+317391.427902 7388213.535380
+317370.853557 7388218.474534
+317355.342397 7388234.571777
+317350.196749 7388245.909834
+317345.265503 7388256.478024
+317338.289192 7388275.444775
+317337.481061 7388291.382045
+317336.631699 7388302.010225
+317330.414041 7388317.657545
+317318.160143 7388326.146091
+317300.645149 7388331.135236
+317275.296236 7388334.244703
+317248.949529 7388335.024570
+317222.099802 7388335.464495
+317196.165407 7388336.244361
+317167.567479 7388337.884080
+317131.506712 7388340.093702
+317110.454085 7388342.043368
+317083.818760 7388341.593445
+317067.953012 7388329.325546
+317055.361018 7388315.877850
+317034.019773 7388291.901956
+317020.380508 7388272.575267
+317008.860524 7388255.588177
+317002.576896 7388243.660220
+316991.559932 7388227.133051
+316982.010797 7388215.155102
+316971.686516 7388208.056318
+316960.859215 7388200.607594
+316947.442598 7388196.228344
+316935.007282 7388195.188523
+316909.798555 7388203.067173
+316887.162652 7388217.404717
+316870.661944 7388230.932400
+316859.884121 7388243.530242
+316842.534051 7388260.037415
+316831.517087 7388275.404782
+316820.021842 7388296.641145
+316810.695355 7388316.347769
+316796.899411 7388333.904762
+316782.616940 7388349.232136
+316757.935971 7388364.309554
+316737.625505 7388372.478154
+316729.948264 7388374.327838
+316717.042913 7388377.427307
+316688.139875 7388378.727084
+316664.572148 7388377.877230
+316631.620210 7388376.907396
+316607.227860 7388376.487468
+316570.309485 7388373.697946
+316543.171140 7388372.808098
+316520.370313 7388367.868944
+316499.680520 7388357.520717
+316483.369476 7388331.625152
+316466.365748 7388295.631318
+316458.655522 7388275.824710
+316447.704528 7388245.669876
+316440.736463 7388223.313705
+316424.672806 7388193.868749
+316421.250620 7388174.332095
+316415.890570 7388145.687002
+316416.533776 7388118.891592
+316416.195681 7388096.955349
+316416.294636 7388081.008081
+316414.711359 7388061.271461
+316406.316696 7388055.072523
+316392.858848 7388053.802741
+316371.097045 7388055.402467
+316350.761841 7388057.482110
+316329.750445 7388056.322309
+316310.792361 7388053.982710
+316286.424749 7388052.013047
+316257.299062 7388054.422634
+316234.679652 7388059.561754
+316213.618779 7388062.511249
+316200.647458 7388063.121144
+316190.059298 7388060.991509
+316183.206680 7388053.932718
+316178.250695 7388042.014760
+316171.257892 7388030.296767
+316160.686224 7388018.638764
+316136.186673 7388002.721490
+316115.191770 7387992.263282
+316081.151330 7387971.786789
+316062.630296 7387967.337551
+316028.194036 7387962.808327
+316003.636762 7387959.398911
+315982.336748 7387956.469413
+315958.859729 7387948.750735
+315946.201765 7387940.512146
+315930.517434 7387930.343888
+315916.490596 7387917.536082
+315902.381295 7387903.068560
+315892.955854 7387897.639490
+315872.999976 7387893.730160
+315862.552001 7387896.699651
+315847.824233 7387899.389190
+315832.651169 7387896.539678
+315814.435246 7387892.100439
+315791.123152 7387886.941323
+315773.434987 7387881.732215
+315762.574701 7387876.603093
+315744.408255 7387868.844422
+315729.944366 7387866.224871
+315716.519503 7387862.185563
+315698.278841 7387859.735983
+315686.074419 7387864.675137
+315674.892531 7387869.404326
+315654.821205 7387874.143515
+315642.171487 7387881.622234
+315627.592152 7387888.641031
+315610.398761 7387892.080442
+315599.678661 7387892.720333
+315576.910818 7387892.870307
+315576.910818 7387892.880305
+315576.902572 7387892.880305
+Region 1
+2805
+319142.053191 7356557.657745
+319143.191171 7356532.931980
+319149.672708 7356527.922838
+319142.267593 7356517.524620
+319134.375950 7356505.246723
+319122.831227 7356491.589062
+319111.896726 7356478.711268
+319100.591143 7356470.702640
+319090.555481 7356466.703325
+319076.940954 7356463.873809
+319063.516090 7356462.704010
+319048.565674 7356461.184270
+319035.239765 7356459.694525
+319021.311882 7356457.744859
+319002.931034 7356453.745544
+318985.778874 7356449.096341
+318968.503021 7356446.006870
+318952.637273 7356443.807247
+318943.088138 7356442.027552
+318930.298234 7356438.658129
+318913.434693 7356435.228716
+318887.953840 7356429.149757
+318870.166720 7356425.830326
+318853.616535 7356422.180951
+318840.513275 7356419.361434
+318826.288527 7356416.851864
+318804.848327 7356412.932535
+318794.581770 7356411.142842
+318759.535290 7356404.274018
+318749.672798 7356402.824267
+318732.380452 7356400.724626
+318714.073820 7356399.274875
+318684.049295 7356397.235224
+318668.076346 7356396.035430
+318651.600377 7356394.275731
+318626.894670 7356391.086277
+318599.748079 7356387.526887
+318580.006603 7356386.177118
+318565.155141 7356384.767360
+318547.945258 7356384.217454
+318533.910173 7356383.047654
+318517.442451 7356380.728052
+318500.158351 7356377.968524
+318483.096900 7356374.209168
+318462.266921 7356370.179858
+318445.007561 7356365.970579
+318423.484899 7356360.941441
+318408.674668 7356356.322232
+318390.417514 7356350.333258
+318381.684755 7356348.003657
+318354.422717 7356345.334114
+318317.397141 7356341.984688
+318283.711289 7356339.795063
+318262.666909 7356337.315488
+318240.393840 7356334.256012
+318225.443423 7356332.746270
+318211.499047 7356332.566301
+318200.201711 7356331.866421
+318186.479984 7356329.476830
+318173.681834 7356326.887274
+318155.729790 7356321.118262
+318142.750222 7356316.519050
+318131.197253 7356311.609891
+318120.460661 7356307.050672
+318106.293637 7356300.111860
+318087.079919 7356289.343705
+318075.419749 7356285.104431
+318061.219740 7356280.265260
+318052.899293 7356278.165620
+318048.429836 7356277.005818
+318036.629480 7356276.085976
+318018.306356 7356275.186130
+317994.672659 7356276.105972
+317973.949881 7356279.715354
+317947.941270 7356282.714840
+317920.984342 7356288.023931
+317900.673876 7356291.753292
+317871.787330 7356296.812426
+317848.631914 7356299.841907
+317825.987765 7356302.221499
+317805.594836 7356304.401126
+317783.362998 7356306.990682
+317769.682502 7356309.150312
+317747.359955 7356310.970001
+317729.094555 7356313.399584
+317705.732983 7356316.539047
+317686.956316 7356319.728500
+317664.204966 7356322.767980
+317649.312273 7356324.907613
+317624.524104 7356328.027079
+317605.846391 7356330.886589
+317590.739297 7356333.796091
+317576.737197 7356337.605438
+317558.364595 7356340.584928
+317534.598959 7356343.834371
+317488.881856 7356350.453237
+317433.178568 7356358.161917
+317404.712580 7356362.121239
+317376.147637 7356366.080561
+317348.407317 7356369.489977
+317325.655966 7356372.199512
+317307.398812 7356374.619098
+317290.452808 7356377.838547
+317267.973583 7356383.317608
+317252.132574 7356387.766846
+317241.280534 7356391.946130
+317230.717113 7356397.795128
+317207.875054 7356407.923393
+317190.351814 7356416.891857
+317181.734503 7356421.321098
+317164.409172 7356430.519523
+317153.334485 7356436.468504
+317145.047023 7356439.248028
+317133.906365 7356442.317502
+317119.409492 7356445.117022
+317104.533292 7356446.036865
+317092.221669 7356445.217005
+317081.237690 7356443.417313
+317053.596325 7356438.858094
+317039.198406 7356433.798961
+317020.331030 7356427.690007
+317004.432298 7356420.731199
+316988.640766 7356412.892542
+316970.721707 7356404.683948
+316954.311708 7356397.945102
+316931.725282 7356387.686860
+316918.547806 7356383.197629
+316902.121314 7356377.118670
+316893.083445 7356375.119012
+316876.706431 7356373.359314
+316855.109553 7356373.859228
+316832.399434 7356373.679259
+316821.201053 7356373.869226
+316811.808596 7356375.308980
+316801.599763 7356377.388624
+316791.275482 7356380.138153
+316780.448181 7356382.877683
+316765.332840 7356386.237108
+316750.382424 7356392.136097
+316740.132359 7356397.435190
+316731.003782 7356402.634299
+316717.224331 7356413.202489
+316702.513055 7356424.870490
+316692.823734 7356433.938937
+316686.869956 7356445.047034
+316681.650092 7356455.065318
+316674.764489 7356475.911747
+316671.762861 7356487.719725
+316670.682605 7356500.887469
+316668.967389 7356523.463602
+316670.847529 7356551.848740
+316671.870062 7356567.256101
+316672.364836 7356600.940331
+316673.478077 7356624.986212
+316674.813966 7356648.152244
+316675.275755 7356667.768884
+316674.442886 7356685.365870
+316674.220238 7356718.700160
+316673.708971 7356735.207332
+316672.224650 7356747.815173
+316669.256007 7356773.030854
+316665.998746 7356796.686802
+316661.100485 7356821.772505
+316657.818485 7356839.569456
+316652.367727 7356859.216091
+316647.923008 7356872.553806
+316638.926371 7356891.050638
+316632.255170 7356903.258547
+316626.021020 7356912.596947
+316609.149232 7356933.873303
+316589.952007 7356953.789891
+316568.115988 7356973.006600
+316547.253024 7356987.694084
+316529.053593 7357001.081791
+316509.435811 7357014.129556
+316484.408501 7357027.767220
+316466.893507 7357035.515892
+316451.019513 7357042.514694
+316434.444589 7357048.613649
+316420.318796 7357054.312673
+316399.777436 7357059.801732
+316377.314703 7357063.841041
+316357.317594 7357066.690552
+316344.173102 7357067.180469
+316328.917576 7357065.110823
+316305.737421 7357061.931368
+316287.133925 7357059.141845
+316269.940534 7357057.602109
+316251.897781 7357059.141845
+316235.570245 7357061.371464
+316222.887542 7357065.750713
+316210.914015 7357070.139962
+316200.045483 7357075.868980
+316189.564524 7357082.827788
+316176.840590 7357090.196526
+316160.521300 7357099.954855
+316143.698989 7357109.593204
+316125.046015 7357118.551669
+316113.765172 7357124.830594
+316101.577243 7357129.659766
+316088.688384 7357133.929035
+316079.889656 7357137.468429
+316068.196501 7357143.417410
+316051.085573 7357151.616005
+316039.309955 7357156.445178
+316029.802051 7357159.654629
+316018.966504 7357162.174197
+316011.726314 7357162.854080
+316005.830259 7357162.554132
+316002.292626 7357160.184538
+315998.870440 7357156.925096
+315999.719802 7357154.055588
+315998.581822 7357147.846651
+315995.192621 7357142.147627
+315991.498310 7357135.898698
+315986.633034 7357126.200359
+315982.114100 7357113.072608
+315981.940929 7357103.104315
+315986.731989 7357094.415803
+315994.994712 7357085.877266
+315998.787978 7357083.377694
+316003.793440 7357082.227891
+316011.940716 7357082.327874
+316027.047810 7357079.968278
+316048.974538 7357077.818646
+316060.313105 7357074.859153
+316070.991973 7357068.460249
+316079.205219 7357063.251142
+316085.002319 7357056.122363
+316091.046806 7357045.014265
+316094.963766 7357033.876173
+316096.299655 7357024.587764
+316098.089087 7357011.869943
+316097.454128 7357006.210912
+316093.784555 7356998.082304
+316089.199651 7356990.273642
+316081.118345 7356985.514457
+316072.377340 7356983.744760
+316062.984884 7356985.284497
+316057.971175 7356987.654091
+316053.823321 7356992.923188
+316046.739809 7357005.231080
+316042.897066 7357011.170063
+316036.027956 7357014.739451
+316032.564539 7357015.019403
+316027.633293 7357010.310210
+316025.472780 7357004.081277
+316024.054429 7356995.312779
+316023.881258 7356985.334488
+316024.862559 7356979.815433
+316028.490901 7356967.337571
+316034.551880 7356955.009682
+316039.120292 7356940.452176
+316040.983940 7356921.755379
+316038.988352 7356903.008590
+316035.013669 7356895.199927
+316026.058263 7356886.671388
+316021.143509 7356880.732405
+316017.746062 7356875.043380
+316016.896700 7356870.384178
+316017.894494 7356863.855296
+316019.469524 7356859.895974
+316028.260006 7356857.456392
+316036.085679 7356858.556204
+316042.954789 7356863.295392
+316050.161995 7356865.265055
+316054.854100 7356864.335214
+316058.960723 7356862.275567
+316061.789180 7356855.996642
+316063.842491 7356846.718232
+316065.631924 7356826.251737
+316065.838079 7356810.304469
+316064.741331 7356800.326178
+316060.461537 7356792.517516
+316057.360954 7356787.818321
+316045.931679 7356773.610754
+316040.151071 7356763.902417
+316038.732719 7356755.243900
+316038.823428 7356748.045133
+316041.396252 7356738.106836
+316044.018553 7356732.487798
+316049.964085 7356729.238355
+316055.967341 7356729.318341
+316062.481863 7356729.628288
+316070.612647 7356731.278006
+316076.632395 7356730.138201
+316080.021596 7356728.298516
+316083.212887 7356725.568983
+316084.210681 7356719.380044
+316081.522410 7356714.360903
+316078.100224 7356711.211443
+316073.465843 7356707.052155
+316064.865024 7356694.544298
+316060.189411 7356686.395693
+316060.981049 7356680.206754
+316063.174547 7356675.797509
+316068.938662 7356671.218293
+316075.741802 7356672.308107
+316079.180480 7356674.787682
+316081.357485 7356679.136937
+316084.672470 7356683.276228
+316091.549826 7356686.795625
+316097.454128 7356686.875611
+316103.218243 7356682.516358
+316105.758082 7356674.787682
+316110.334740 7356659.560290
+316116.527659 7356644.802818
+316122.654608 7356627.705747
+316131.741955 7356602.350090
+316144.993647 7356569.505716
+316154.072747 7356551.898732
+316162.615842 7356544.809946
+316171.101214 7356542.370364
+316179.858710 7356542.820287
+316183.899363 7356545.079900
+316185.952675 7356551.978718
+316185.259992 7356558.167658
+316181.400756 7356565.326432
+316176.972530 7356569.585702
+316172.214455 7356575.064763
+316168.685068 7356580.003917
+316167.101792 7356584.743106
+316165.411314 7356589.372313
+316166.672988 7356594.041513
+316168.767530 7356597.840862
+316171.274384 7356600.970326
+316178.440359 7356606.049456
+316187.131886 7356611.138584
+316199.633172 7356613.188233
+316206.452804 7356613.828124
+316216.554437 7356612.068425
+316223.134929 7356607.169264
+316231.059557 7356601.070309
+316240.509737 7356594.321465
+316264.935072 7356572.255245
+316294.110236 7356544.609980
+316312.796195 7356524.903356
+316325.899455 7356511.115717
+316333.205616 7356497.807997
+316341.245690 7356481.740749
+316344.230826 7356471.812450
+316344.313288 7356465.273570
+316341.295168 7356454.265455
+316335.745455 7356450.206151
+316326.303521 7356447.546606
+316292.221849 7356444.667099
+316279.135081 7356440.737772
+316271.383624 7356433.768966
+316267.400695 7356426.630189
+316264.827871 7356412.532604
+316262.725082 7356377.948528
+316263.030193 7356354.022626
+316266.048313 7356341.324801
+316270.921835 7356326.097409
+316281.773875 7356305.970857
+316293.615462 7356287.843962
+316302.274004 7356271.996676
+316305.341602 7356254.649648
+316303.915004 7356238.792364
+316302.224527 7356227.584284
+316301.507105 7356211.956961
+316298.860065 7356196.299643
+316291.751814 7356186.351347
+316280.611157 7356181.452186
+316272.480373 7356180.462355
+316254.998364 7356177.132926
+316250.652601 7356174.533371
+316248.186978 7356168.634381
+316247.675711 7356160.865712
+316248.706490 7356151.797265
+316254.750977 7356140.689168
+316259.228680 7356133.320430
+316264.448544 7356123.422126
+316266.691519 7356115.033563
+316265.891635 7356106.275063
+316264.159926 7356097.826510
+316260.490354 7356090.367788
+316253.332626 7356084.618772
+316246.743887 7356082.099204
+316237.400908 7356079.769603
+316233.063391 7356076.940088
+316231.298697 7356071.271059
+316229.171170 7356062.602544
+316229.253632 7356056.073662
+316230.861647 7356049.774741
+316232.560371 7356044.595628
+316232.609848 7356040.496330
+316232.362461 7356036.167072
+316231.109034 7356030.508041
+316223.868843 7356015.130675
+316222.021688 7356008.571799
+316223.283361 7356004.932422
+316226.482899 7356001.872946
+316231.537838 7355996.943790
+316238.217285 7355992.274590
+316241.713687 7355989.215114
+316243.907184 7355985.255792
+316243.066068 7355979.036858
+316239.701606 7355971.798098
+316232.684064 7355962.959612
+316227.109612 7355952.921331
+316225.064547 7355945.472607
+316224.528542 7355939.813576
+316225.204733 7355934.284523
+316223.357577 7355927.395703
+316219.366401 7355920.806832
+316207.854664 7355913.458091
+316201.735960 7355906.289319
+316198.635378 7355901.600122
+316196.565574 7355896.261036
+316196.029569 7355890.272062
+316193.588684 7355881.823509
+316189.267660 7355877.774203
+316182.390303 7355873.924862
+316170.820842 7355870.675419
+316162.129315 7355865.246349
+316159.408058 7355863.106715
+316157.824782 7355859.647308
+316158.154631 7355857.777628
+316158.921531 7355853.458368
+316162.368455 7355846.969480
+316166.532802 7355839.820704
+316171.694942 7355834.021697
+316173.937917 7355825.633134
+316172.544304 7355815.314902
+316163.926993 7355804.346780
+316154.600506 7355793.258680
+316138.289462 7355770.672549
+316123.536955 7355753.315522
+316101.313364 7355723.460636
+316092.720791 7355710.062930
+316080.450400 7355689.966373
+316075.585124 7355680.268034
+316072.270139 7355668.700016
+316071.247607 7355653.072692
+316071.090928 7355641.884609
+316072.154692 7355630.046637
+316076.417993 7355615.479132
+316086.651565 7355571.406681
+316090.362369 7355552.179974
+316091.104530 7355541.561793
+316090.263414 7355536.012744
+316088.185364 7355531.003602
+316083.856093 7355527.514199
+316075.733556 7355525.194597
+316064.139356 7355523.824831
+316059.166879 7355522.545051
+316054.837608 7355518.725705
+316052.347246 7355514.366451
+316051.802995 7355509.047363
+316051.868965 7355504.398159
+316051.943181 7355498.409185
+316050.079533 7355492.850137
+316044.834930 7355489.020793
+316035.203332 7355485.131459
+316021.069293 7355483.401755
+316009.582294 7355482.031990
+315999.241521 7355478.462601
+315992.784722 7355473.733412
+315989.115149 7355466.154710
+315986.377401 7355457.146253
+315983.120140 7355440.929031
+315975.846964 7355420.232576
+315968.573789 7355408.064660
+315953.656358 7355395.696779
+315934.154022 7355375.840180
+315928.035319 7355368.561427
+315924.679103 7355360.432819
+315924.802797 7355350.464526
+315925.289324 7355336.516915
+315927.251927 7355326.238676
+315926.130440 7355318.470007
+315923.038103 7355313.440868
+315916.911154 7355306.502057
+315906.628104 7355298.613408
+315899.610562 7355289.774922
+315896.806844 7355286.085554
+315896.914045 7355277.886958
+315895.858527 7355264.799200
+315895.091628 7355253.051212
+315892.370371 7355242.712983
+315889.624377 7355234.264430
+315888.230764 7355224.276141
+315888.964678 7355214.317847
+315891.009743 7355198.170613
+315893.359919 7355189.452106
+315893.434135 7355183.573113
+315892.263170 7355179.793761
+315889.137849 7355177.324184
+315886.004281 7355175.064571
+315882.235754 7355175.014579
+315876.636563 7355174.944591
+315873.766875 7355176.454333
+315865.561876 7355181.333497
+315861.447006 7355184.382975
+315854.924238 7355184.632932
+315848.640610 7355182.113363
+315843.107390 7355176.734285
+315837.615400 7355168.245739
+315832.700646 7355154.778046
+315826.713883 7355136.981094
+315823.638039 7355130.402221
+315818.698547 7355126.902820
+315812.101562 7355124.933158
+315800.919674 7355123.573391
+315795.229774 7355122.283612
+315791.197368 7355119.134151
+315788.797714 7355115.884708
+315788.871931 7355110.015713
+315785.862056 7355098.127749
+315785.334298 7355091.918813
+315782.547072 7355087.229616
+315779.100147 7355085.639888
+315771.991896 7355084.330113
+315766.293751 7355083.920183
+315762.549962 7355081.660570
+315759.548334 7355077.851223
+315757.363083 7355073.172024
+315755.911747 7355067.283033
+315751.937064 7355059.474370
+315746.288396 7355055.305085
+315739.180145 7355053.995309
+315721.277578 7355052.215614
+315707.267232 7355048.936175
+315700.356891 7355047.516419
+315695.755494 7355041.587434
+315694.287665 7355036.588291
+315694.427851 7355025.400207
+315695.409152 7355020.431058
+315696.984182 7355016.681700
+315698.649921 7355013.932171
+315699.631223 7355008.963023
+315699.680700 7355004.863725
+315698.534474 7354999.314675
+315696.349223 7354995.185383
+315691.088128 7354992.015925
+315683.905661 7354988.486530
+315671.148742 7354982.457563
+315664.733174 7354974.948849
+315657.649662 7354963.340837
+315656.833285 7354955.132243
+315657.872311 7354945.843834
+315659.818421 7354937.115329
+315663.991014 7354929.416648
+315669.078938 7354921.727965
+315675.189395 7354913.389393
+315679.716575 7354901.931356
+315681.035972 7354894.522625
+315680.244334 7354884.544334
+315677.523078 7354874.536049
+315671.709486 7354867.267294
+315660.774984 7354862.468116
+315649.931190 7354858.568784
+315638.699824 7354852.549815
+315630.033036 7354845.241067
+315624.128735 7354837.412408
+315621.448710 7354831.733380
+315620.558117 7354821.855072
+315620.863227 7354798.489075
+315623.782393 7354769.284077
+315624.301906 7354752.456960
+315625.225483 7354727.881169
+315625.406900 7354713.813579
+315624.598770 7354705.165060
+315621.226062 7354698.586187
+315614.802248 7354691.297436
+315607.957876 7354685.008513
+315598.342771 7354679.899388
+315591.432430 7354679.149517
+315583.342878 7354674.720275
+315581.545200 7354671.930753
+315580.027893 7354662.832312
+315580.473190 7354652.314113
+315583.120230 7354644.255494
+315587.647410 7354632.797456
+315595.687485 7354617.280114
+315603.067862 7354605.192185
+315607.867168 7354596.283711
+315612.996323 7354585.715521
+315614.282735 7354580.526410
+315610.621409 7354572.617765
+315605.393299 7354567.008727
+315594.186671 7354559.659984
+315579.623828 7354551.391400
+315566.611276 7354541.923022
+315563.205583 7354537.443789
+315561.333688 7354532.544629
+315563.411738 7354521.606502
+315571.055994 7354513.287927
+315575.822316 7354506.809037
+315581.479230 7354501.899878
+315583.796421 7354496.390821
+315584.497350 7354489.202053
+315584.307687 7354480.453551
+315582.171913 7354472.114980
+315576.086195 7354462.066701
+315569.274808 7354453.228215
+315567.270974 7354442.570041
+315564.607442 7354428.242495
+315563.551924 7354415.164735
+315564.533226 7354410.185588
+315568.054366 7354405.586375
+315574.305009 7354402.226951
+315577.471562 7354401.607057
+315583.351124 7354403.896665
+315586.476446 7354406.486221
+315589.238933 7354413.055096
+315591.877727 7354421.723611
+315600.082726 7354440.880330
+315602.869952 7354446.129431
+315607.512580 7354449.618833
+315612.163454 7354451.898443
+315617.861599 7354452.628318
+315623.790639 7354450.828626
+315626.693312 7354446.769321
+315632.407950 7354437.860847
+315634.692156 7354434.131486
+315639.730603 7354430.762063
+315644.727819 7354429.602262
+315650.038391 7354429.012363
+315655.431426 7354428.742409
+315661.047109 7354427.602604
+315666.085556 7354424.233181
+315669.268601 7354421.833592
+315670.538521 7354418.084235
+315669.070692 7354413.415034
+315665.054777 7354409.045783
+315657.608431 7354402.076977
+315644.900990 7354392.278655
+315633.158357 7354379.280881
+315626.363463 7354369.002642
+315620.574609 7354360.174154
+315611.281107 7354354.185180
+315594.763907 7354347.436336
+315582.963551 7354338.537860
+315578.700250 7354330.059313
+315578.502341 7354321.310811
+315580.423712 7354314.581964
+315582.180159 7354304.853630
+315585.066340 7354294.035483
+315588.059722 7354282.887393
+315590.492360 7354267.630006
+315593.461003 7354250.612921
+315594.920586 7354239.994740
+315594.706184 7354225.037302
+315593.370294 7354209.849903
+315593.568204 7354194.562522
+315596.305953 7354179.975021
+315599.505490 7354168.496987
+315606.597248 7354155.189266
+315615.833027 7354141.571599
+315624.821418 7354123.964615
+315631.269970 7354113.186461
+315635.475548 7354103.278158
+315637.100056 7354095.209540
+315638.609116 7354080.941984
+315640.596457 7354068.784067
+315642.567306 7354057.945923
+315646.781130 7354047.037792
+315650.986708 7354036.899528
+315657.608431 7354012.613688
+315663.034451 7354002.715384
+315666.011340 7353992.787084
+315667.949204 7353984.498504
+315666.497868 7353978.499532
+315661.055356 7353966.361611
+315656.115863 7353954.773596
+315650.162085 7353934.427081
+315645.989492 7353918.199860
+315642.682754 7353905.971955
+315638.130834 7353895.953671
+315632.531644 7353887.795068
+315620.500393 7353881.106214
+315611.371816 7353878.546653
+315599.208626 7353873.957439
+315594.895847 7353868.698340
+315592.562164 7353860.249787
+315594.516520 7353850.861395
+315600.379590 7353838.193565
+315606.407585 7353828.305259
+315612.155208 7353816.857219
+315614.843479 7353806.039072
+315616.550449 7353791.771516
+315615.330007 7353775.914233
+315619.873680 7353762.906461
+315631.838960 7353759.287081
+315649.518879 7353753.977990
+315662.531431 7353747.719062
+315681.299852 7353729.572171
+315704.884071 7353716.474414
+315729.565040 7353705.606276
+315754.592350 7353691.298726
+315772.156821 7353679.670718
+315765.279465 7353668.282669
+315757.701179 7353663.763443
+315742.940426 7353663.233534
+315725.730543 7353663.013571
+315710.796619 7353660.504001
+315694.749454 7353649.655860
+315693.529012 7353633.248670
+315694.774193 7353607.793030
+315697.594404 7353578.468053
+315700.373383 7353552.032582
+315702.871991 7353532.125991
+315706.920890 7353502.381086
+315701.602072 7353480.384854
+315697.025414 7353448.090386
+315696.827504 7353423.944522
+315697.091383 7353379.522131
+315696.275007 7353371.653479
+315700.596031 7353344.458137
+315708.215549 7353321.512068
+315729.762949 7353300.855606
+315748.564355 7353279.719226
+315747.038803 7353255.993290
+315744.457732 7353227.158230
+315740.961331 7353189.674650
+315749.801290 7353159.659791
+315766.821510 7353110.698178
+315782.324423 7353068.585392
+315801.307246 7353025.732732
+315807.673336 7352989.928865
+315819.820034 7352939.797452
+315835.537350 7352896.904799
+315855.839570 7352846.433444
+315879.407297 7352795.012252
+315895.652371 7352750.909807
+315903.073979 7352695.949221
+315910.924390 7352655.296184
+315919.797335 7352606.884477
+315929.676319 7352574.669995
+315951.017564 7352546.364843
+315972.564964 7352517.179842
+315986.237215 7352482.905713
+315997.394365 7352438.513317
+315991.811667 7352389.481716
+315971.014673 7352256.404511
+315971.781573 7352212.442041
+315976.556140 7352165.540075
+315988.463697 7352134.565381
+316009.343153 7352110.129566
+316038.782197 7352084.923884
+316063.372456 7352056.878688
+316074.249235 7352026.443901
+316074.265727 7351993.659517
+316078.058993 7351951.726699
+316083.608706 7351907.594259
+316099.383746 7351860.502325
+316111.250071 7351824.428504
+316126.216980 7351784.635321
+316128.517678 7351748.001596
+316120.370403 7351716.437002
+316110.277016 7351693.270971
+316102.632760 7351646.099051
+316105.172599 7351614.894396
+316107.003263 7351583.569761
+316104.413946 7351554.844682
+316103.638801 7351503.883411
+316106.945539 7351460.280880
+316115.620574 7351419.187918
+316126.769478 7351375.245445
+316147.319084 7351344.490713
+316174.704816 7351321.024733
+316205.397287 7351309.236752
+316235.273380 7351313.496023
+316262.222062 7351324.144199
+316296.988171 7351336.322113
+316319.821983 7351349.689823
+316342.053821 7351362.817574
+316370.775442 7351385.783640
+316401.171049 7351413.538886
+316415.700907 7351423.577167
+316435.698016 7351436.015036
+316455.736357 7351453.442051
+316488.440908 7351459.511012
+316516.354398 7351450.452563
+316534.578568 7351442.373947
+316561.048968 7351426.436677
+316579.784404 7351418.368059
+316609.157478 7351406.110159
+316642.439265 7351399.001376
+316664.967967 7351396.741763
+316682.293298 7351395.521972
+316706.083673 7351390.292868
+316720.522823 7351367.766726
+316723.351280 7351345.320571
+316739.043857 7351320.374844
+316757.853509 7351306.547213
+316788.059452 7351301.278115
+316819.007555 7351309.316738
+316832.679806 7351314.915779
+316850.640096 7351327.223671
+316871.742200 7351341.451234
+316896.043842 7351351.729474
+316923.017263 7351352.069415
+316942.461874 7351344.450720
+316968.668395 7351332.932693
+316993.703952 7351317.745295
+317018.327196 7351302.887840
+317041.738245 7351287.570463
+317067.573686 7351273.162931
+317111.451879 7351257.545606
+317144.428555 7351249.996899
+317194.112095 7351250.296848
+317242.121650 7351245.807617
+317263.405171 7351237.439050
+317271.775095 7351219.382143
+317274.512844 7351204.464699
+317281.101582 7351182.728422
+317295.054204 7351150.443952
+317307.538998 7351113.390299
+317318.457007 7351079.406120
+317330.826353 7351050.881006
+317346.865272 7351014.637214
+317369.113602 7350970.724736
+317381.837536 7350946.298920
+317404.885750 7350911.694847
+317435.314342 7350888.048898
+317467.804490 7350871.181787
+317494.464554 7350856.014385
+317527.960743 7350848.245716
+317557.119414 7350860.573604
+317592.924548 7350879.310395
+317628.853375 7350904.016163
+317674.570478 7350935.610751
+317704.256908 7350955.047422
+317732.351816 7350979.213282
+317758.756246 7350992.181061
+317777.590637 7351008.588250
+317799.896691 7351031.804274
+317825.509483 7351059.039609
+317853.414728 7351090.304253
+317879.307892 7351112.010535
+317900.030670 7351131.657170
+317916.819995 7351140.065730
+317943.174948 7351149.144175
+317972.391344 7351149.184168
+318009.087070 7351146.104695
+318047.893831 7351136.296375
+318103.522903 7351116.949689
+318175.256864 7351088.284599
+318218.623791 7351064.358698
+318231.298247 7351052.220777
+318257.199658 7351032.834097
+318278.722320 7351021.476043
+318307.889237 7351001.349490
+318316.028267 7350985.722167
+318327.671945 7350958.736790
+318342.391466 7350921.593152
+318355.090662 7350891.398324
+318378.699620 7350859.913717
+318400.972689 7350829.398944
+318416.269447 7350811.422023
+318436.827300 7350796.064654
+318465.697353 7350783.026887
+318493.124316 7350771.858800
+318522.563360 7350754.061849
+318544.844675 7350731.305746
+318547.095896 7350706.410011
+318540.993685 7350681.184332
+318535.180093 7350658.408233
+318524.839320 7350638.781595
+318511.851506 7350611.256310
+318506.293547 7350583.271103
+318506.301793 7350550.486719
+318512.387511 7350520.211905
+318518.695878 7350504.564585
+318536.515982 7350480.088778
+318555.985333 7350461.721924
+318574.036332 7350451.433686
+318591.510094 7350453.983249
+318607.466551 7350464.261489
+318622.474690 7350476.629370
+318638.695026 7350482.488367
+318652.878543 7350471.370271
+318659.747653 7350459.822249
+318665.379828 7350432.756885
+318670.203873 7350413.880119
+318679.835471 7350392.733741
+318702.661037 7350375.076765
+318716.555936 7350362.738879
+318728.479985 7350337.743160
+318736.652000 7350318.906387
+318746.753632 7350292.890843
+318768.870023 7350267.135255
+318783.787454 7350254.367442
+318806.926377 7350244.249175
+318831.722793 7350247.548610
+318852.074490 7350256.337104
+318872.269509 7350269.214898
+318896.950477 7350282.152682
+318918.489632 7350285.202160
+318946.650510 7350280.342992
+318974.242397 7350271.834450
+319008.324069 7350257.526901
+319027.306892 7350245.588945
+319046.100051 7350232.751144
+319069.205989 7350216.653902
+319092.501591 7350201.986414
+319117.339238 7350177.600591
+319125.750393 7350164.192888
+319137.361086 7350140.077019
+319149.326366 7350119.410559
+319159.411506 7350102.923383
+319175.475164 7350095.924582
+319202.580524 7350102.243499
+319216.772287 7350115.161286
+319239.309235 7350136.267671
+319244.891933 7350145.426102
+319261.409133 7350167.562311
+319281.983479 7350191.078283
+319299.432503 7350195.847466
+319319.982110 7350188.788675
+319340.069928 7350178.190490
+319362.112102 7350165.842605
+319386.174603 7350154.844489
+319410.525722 7350153.044797
+319434.118188 7350146.805866
+319461.767799 7350134.198026
+319472.199281 7350113.721533
+319479.579658 7350085.456375
+319478.021120 7350055.751463
+319475.506020 7350021.167387
+319467.350498 7349989.712775
+319456.020177 7349967.746537
+319441.028529 7349945.960269
+319424.519576 7349914.515655
+319412.620265 7349889.229986
+319407.037567 7349864.014306
+319409.841285 7349843.107887
+319418.978109 7349828.940314
+319432.106108 7349813.153018
+319450.124122 7349797.205749
+319473.477447 7349777.779077
+319491.478968 7349762.941618
+319519.169811 7349738.485808
+319521.907560 7349723.118440
+319510.296867 7349707.471120
+319501.143551 7349698.162715
+319487.924843 7349689.024280
+319471.201487 7349675.406612
+319457.273604 7349657.729640
+319455.484172 7349629.794425
+319458.048749 7349604.238803
+319451.435272 7349579.563030
+319435.932359 7349557.656782
+319416.933043 7349546.458700
+319393.810613 7349531.651236
+319378.357176 7349522.262845
+319355.787243 7349503.596042
+319347.153440 7349485.649116
+319351.523942 7349470.531706
+319355.506871 7349460.943348
+319384.203754 7349437.827308
+319406.518054 7349419.940371
+319419.233742 7349404.043095
+319425.847219 7349380.307160
+319425.286475 7349368.229229
+319427.282063 7349354.851521
+319430.135259 7349338.934247
+319444.310529 7349328.586020
+319465.346663 7349331.185574
+319483.595572 7349336.944588
+319495.066079 7349339.534144
+319521.726142 7349340.753935
+319536.932192 7349337.284530
+319557.976572 7349323.376912
+319568.053466 7349306.999717
+319573.174375 7349296.421529
+319585.650922 7349276.204992
+319599.314927 7349257.548188
+319620.870573 7349243.520591
+319647.967687 7349233.892240
+319664.963169 7349225.913607
+319671.584892 7349217.575035
+319667.676179 7349212.765859
+319657.714732 7349195.578803
+319635.977668 7349175.482245
+319614.603438 7349151.176408
+319609.466037 7349130.509948
+319619.782071 7349103.284612
+319641.560366 7349071.650030
+319676.112073 7349059.792062
+319708.602221 7349050.123718
+319739.871928 7349040.545358
+319752.975188 7349018.669106
+319756.702485 7348988.914202
+319769.723283 7348933.253737
+319791.979859 7348911.717425
+319816.545381 7348909.137867
+319849.447841 7348923.175463
+319883.776899 7348945.431651
+319914.106535 7348969.847468
+319932.000856 7348987.794394
+319959.320618 7349001.102115
+319984.751993 7348986.134678
+319993.460013 7348965.748171
+320003.685339 7348929.544372
+320023.929835 7348898.119755
+320057.228114 7348872.174199
+320093.115710 7348859.996285
+320108.890749 7348860.086269
+320137.150582 7348878.933041
+320153.395656 7348906.608301
+320171.842474 7348929.434391
+320194.898935 7348958.079484
+320224.263762 7348978.386006
+320246.759480 7348978.555977
+320276.107814 7348959.319272
+320295.775075 7348941.292360
+320305.810737 7348920.255963
+320316.530837 7348901.339203
+320332.041997 7348865.865280
+320358.578367 7348868.634805
+320381.370949 7348877.343313
+320405.680837 7348878.753072
+320428.399202 7348860.986115
+320444.734985 7348848.448263
+320474.536863 7348834.090722
+320500.759876 7348820.902981
+320515.693800 7348815.223954
+320530.611231 7348794.807451
+320539.343989 7348771.651418
+320556.207531 7348750.155100
+320588.854358 7348727.628958
+320623.439049 7348713.221426
+320643.469144 7348715.131099
+320668.257313 7348719.100419
+320685.244548 7348719.640327
+320699.238401 7348716.270904
+320705.505537 7348694.864570
+320700.211457 7348686.715966
+320695.535844 7348661.950208
+320690.876724 7348643.843310
+320693.581487 7348615.078237
+320691.956980 7348589.802567
+320684.048845 7348555.248485
+320663.746625 7348525.863519
+320643.345450 7348505.007091
+320619.085040 7348483.660748
+320590.635544 7348454.945666
+320569.978736 7348430.429866
+320560.825420 7348405.064211
+320573.854464 7348380.528413
+320584.154007 7348363.151390
+320596.036825 7348324.428023
+320600.531021 7348298.672435
+320603.285262 7348274.006660
+320615.456698 7348236.273123
+320632.880983 7348202.268948
+320650.140344 7348173.123940
+320671.539313 7348147.038408
+320691.956980 7348133.890660
+320717.322385 7348131.990986
+320735.307414 7348134.650530
+320755.865267 7348135.240429
+320779.515457 7348131.881004
+320804.889108 7348121.232828
+320831.376001 7348103.505865
+320848.973458 7348087.998521
+320861.285080 7348072.201227
+320885.603214 7348040.046735
+320903.786153 7348018.450434
+320928.038317 7347991.615031
+320942.155864 7347961.450198
+320941.281763 7347950.362097
+320933.489075 7347930.435510
+320924.014156 7347906.829554
+320940.152030 7347877.464584
+320950.501049 7347855.878281
+320949.791873 7347839.481090
+320942.625899 7347809.926152
+320931.782106 7347773.792342
+320918.068624 7347738.618367
+320916.938890 7347715.342354
+320925.218106 7347687.977041
+320943.153658 7347661.831520
+320955.745652 7347639.725306
+320963.431139 7347618.888875
+320971.182596 7347601.481857
+320988.953223 7347596.282748
+321003.062523 7347607.530821
+321015.200975 7347621.748385
+321033.449883 7347627.627378
+321051.674053 7347635.056106
+321062.971389 7347651.813236
+321067.787188 7347681.888084
+321077.600202 7347702.614534
+321100.335060 7347716.082227
+321119.598255 7347705.903970
+321132.726254 7347689.786731
+321146.497459 7347679.328523
+321159.171916 7347666.300754
+321176.225121 7347661.861514
+321186.219552 7347652.133181
+321207.560797 7347638.885450
+321225.562319 7347648.083874
+321237.832710 7347667.620528
+321253.418086 7347691.626416
+321275.765371 7347719.261682
+321301.708012 7347753.035897
+321323.205936 7347751.426173
+321340.588990 7347736.908660
+321356.141381 7347722.151187
+321381.449063 7347700.084967
+321398.221896 7347694.095993
+321423.356407 7347694.295959
+321454.065370 7347688.147012
+321478.968986 7347674.939274
+321497.184910 7347650.683429
+321497.052970 7347627.977319
+321490.167368 7347601.201905
+321485.285599 7347567.797627
+321489.466438 7347550.680559
+321492.616498 7347526.794650
+321481.368640 7347506.268166
+321471.860736 7347485.331752
+321472.000922 7347466.055054
+321475.992097 7347439.859541
+321478.012424 7347400.116349
+321472.594650 7347377.120288
+321452.655264 7347360.253177
+321428.609256 7347362.172848
+321390.223052 7347363.472626
+321359.621290 7347360.653109
+321339.096422 7347350.204898
+321333.587940 7347334.737548
+321332.252051 7347310.791650
+321324.310931 7347286.545803
+321313.623816 7347253.961384
+321310.696404 7347235.984463
+321305.690942 7347196.601209
+321308.280258 7347176.244696
+321319.140544 7347146.029872
+321319.750765 7347130.202583
+321314.794781 7347119.504415
+321300.009289 7347121.654047
+321287.120430 7347126.693184
+321272.730758 7347146.229838
+321259.726452 7347160.467399
+321238.525393 7347179.814085
+321219.468354 7347181.673766
+321192.898999 7347173.705131
+321175.614900 7347148.119514
+321166.321398 7347126.073290
+321150.991655 7347106.276681
+321131.802676 7347102.937253
+321114.048542 7347098.068087
+321093.771060 7347091.609194
+321075.588122 7347081.080997
+321065.634922 7347063.124073
+321070.335273 7347036.708598
+321075.241780 7347019.041626
+321088.938769 7346989.646659
+321089.829362 7346958.861932
+321089.400558 7346944.454400
+321093.713337 7346917.259058
+321111.417994 7346884.584655
+321122.987456 7346863.018349
+321134.507440 7346836.582877
+321139.347977 7346799.529224
+321136.263887 7346777.892930
+321126.055053 7346747.748094
+321114.724733 7346725.781856
+321100.895804 7346716.863384
+321044.013305 7346691.677698
+321018.449990 7346676.400315
+321003.565543 7346661.922795
+320981.968665 7346631.308039
+320968.527309 7346599.123552
+320960.866561 7346569.128690
+320952.612084 7346545.322767
+320944.703949 7346518.527357
+320931.048191 7346503.839873
+320906.565132 7346491.801935
+320878.725858 7346479.823987
+320858.110281 7346460.177352
+320850.606211 7346442.030460
+320847.480890 7346414.965097
+320849.311553 7346398.817862
+320860.105869 7346381.780781
+320873.910059 7346368.773009
+320896.512977 7346359.864535
+320916.922398 7346346.826768
+320916.262700 7346326.650224
+320907.043414 7346306.933601
+320896.257344 7346282.427799
+320886.032018 7346253.832697
+320876.623069 7346224.477725
+320873.934798 7346212.149837
+320867.420275 7346195.672659
+320843.423744 7346185.734362
+320822.898876 7346183.264785
+320797.995260 7346180.845199
+320773.446231 7346174.666258
+320760.408940 7346158.888960
+320756.285825 7346130.593807
+320756.648659 7346109.437431
+320760.359463 7346081.242260
+320767.987226 7346041.129131
+320768.251106 7346012.224082
+320760.969684 7345992.197513
+320753.424383 7345984.788782
+320735.975359 7345980.909446
+320719.177787 7345981.369368
+320699.131200 7345988.758102
+320670.195177 7345999.916191
+320648.334420 7346006.625042
+320636.369139 7346002.925675
+320630.374129 7345986.018571
+320628.296079 7345964.832200
+320613.683758 7345945.605494
+320596.762493 7345939.626518
+320571.388841 7345934.217444
+320546.790335 7345931.807857
+320522.216568 7345927.288631
+320513.269408 7345910.121572
+320515.957679 7345890.434944
+320527.931206 7345869.318561
+320535.963035 7345853.241315
+320551.028898 7345828.845494
+320560.091505 7345811.788415
+320558.945279 7345781.973522
+320548.810662 7345754.158287
+320533.728306 7345730.932265
+320513.764182 7345716.394755
+320497.857203 7345702.457143
+320473.959626 7345684.880153
+320447.167623 7345670.812563
+320410.092570 7345665.473478
+320380.950391 7345660.004414
+320366.659673 7345647.316588
+320361.415071 7345627.090052
+320361.612980 7345595.075536
+320356.681734 7345574.639037
+320340.288228 7345558.811748
+320325.948032 7345550.213221
+320323.268008 7345528.466946
+320321.684731 7345509.070268
+320329.098093 7345485.894238
+320332.165690 7345451.820075
+320336.981489 7345408.797444
+320334.680791 7345372.983579
+320327.217952 7345351.407274
+320318.823289 7345322.942150
+320296.682160 7345262.522500
+320276.132553 7345213.410912
+320262.748921 7345168.718567
+320248.540665 7345141.293265
+320223.703019 7345125.805918
+320198.857126 7345126.925726
+320168.172902 7345131.194995
+320146.567777 7345134.134491
+320113.558116 7345136.934012
+320084.688062 7345134.694395
+320062.934506 7345124.666113
+320049.616844 7345115.527678
+320027.624146 7345099.970343
+320013.465368 7345084.832936
+320014.875474 7345070.125455
+320020.763282 7345062.886695
+320035.054000 7345051.438656
+320046.524507 7345037.621023
+320055.051110 7345023.223489
+320068.170862 7344991.368946
+320074.380274 7344974.721797
+320088.102002 7344959.944328
+320105.476810 7344945.646777
+320124.847206 7344926.839999
+320140.729446 7344901.564328
+320142.213767 7344880.867874
+320143.071375 7344869.469826
+320154.286249 7344851.442914
+320166.869997 7344838.095200
+320172.823776 7344817.788678
+320168.535736 7344802.331326
+320163.678706 7344784.104448
+320152.884390 7344760.378512
+320144.300064 7344747.420732
+320134.247909 7344737.552422
+320119.536633 7344733.933042
+320104.883081 7344733.743075
+320087.945324 7344729.103869
+320082.849153 7344722.065075
+320071.807450 7344709.407243
+320053.591527 7344709.727188
+320041.601507 7344708.137461
+320027.962242 7344700.768723
+320020.177800 7344688.600807
+320017.547253 7344671.173792
+320012.277911 7344652.936916
+319998.762339 7344627.181328
+319993.509490 7344616.043236
+319982.245139 7344597.516409
+319967.838974 7344569.421222
+319959.262894 7344555.463612
+319951.734086 7344547.614957
+319930.458811 7344540.146236
+319905.299561 7344541.605986
+319883.100708 7344551.294326
+319855.995348 7344554.053854
+319826.473842 7344555.123671
+319798.115055 7344552.444130
+319775.536876 7344543.515659
+319759.044414 7344535.886966
+319744.357877 7344530.277926
+319725.828597 7344523.069161
+319704.536830 7344516.930213
+319684.275841 7344509.471490
+319664.270485 7344506.122064
+319643.663155 7344510.401331
+319623.863955 7344515.130521
+319605.986127 7344520.779553
+319592.602495 7344516.510285
+319589.427696 7344494.214104
+319587.465093 7344464.059269
+319587.423862 7344435.034241
+319603.009238 7344401.669956
+319611.494609 7344382.503239
+319609.119695 7344360.986924
+319603.619459 7344336.771072
+319589.716314 7344317.654347
+319569.991330 7344300.117351
+319545.937076 7344287.189565
+319536.866222 7344272.232127
+319533.485267 7344249.705986
+319554.067859 7344231.359128
+319566.362989 7344208.583030
+319572.135350 7344186.386832
+319567.129888 7344171.709346
+319562.190396 7344144.064081
+319564.829190 7344120.388137
+319583.193546 7344100.461550
+319605.845941 7344079.035220
+319626.527488 7344060.908325
+319646.450381 7344046.650767
+319680.804178 7344033.573007
+319707.018945 7344020.275285
+319722.777492 7344005.407832
+319732.070994 7343986.811017
+319738.470069 7343963.075083
+319750.542550 7343933.760105
+319758.145575 7343895.866595
+319765.888786 7343870.370962
+319777.903544 7343845.935148
+319789.481252 7343823.149051
+319801.999030 7343807.021814
+319831.001023 7343790.774597
+319855.995348 7343777.686838
+319880.371206 7343765.148986
+319898.933471 7343761.719573
+319924.067982 7343761.489613
+319943.067297 7343771.697864
+319961.810980 7343777.906801
+319983.251179 7343772.417741
+319997.508912 7343763.629246
+320023.146443 7343755.420652
+320042.426130 7343751.671295
+320060.757501 7343758.330154
+320079.682600 7343774.847325
+320094.764956 7343797.413459
+320106.400388 7343827.248349
+320111.265664 7343852.564013
+320112.708754 7343867.751411
+320115.430010 7343885.508370
+320113.327221 7343899.106040
+320116.353588 7343917.872826
+320133.027467 7343927.051254
+320162.227369 7343935.059882
+320172.493926 7343952.466900
+320174.151419 7343974.203177
+320178.348750 7343996.299392
+320191.047945 7344006.197697
+320213.642617 7344014.126338
+320240.434621 7344027.644023
+320252.086545 7344048.170507
+320256.052982 7344072.476344
+320260.497700 7344091.473090
+320261.008966 7344123.607585
+320263.746715 7344148.893254
+320272.957754 7344176.698491
+320296.764622 7344193.285650
+320324.900761 7344197.624907
+320363.773492 7344197.114994
+320391.752953 7344189.606280
+320420.243680 7344189.736258
+320457.318733 7344178.458190
+320492.431183 7344170.039632
+320530.767909 7344163.650726
+320558.466998 7344153.922393
+320584.145760 7344151.472812
+320612.562271 7344157.141841
+320642.966123 7344175.468702
+320667.053363 7344185.966904
+320691.643623 7344188.596453
+320708.465934 7344177.838296
+320721.750611 7344165.270449
+320741.360148 7344150.892912
+320782.459361 7344159.941362
+320791.200366 7344176.878461
+320799.438350 7344210.102770
+320808.237078 7344238.907835
+320815.163912 7344270.562413
+320823.946147 7344300.687253
+320831.672866 7344317.624352
+320858.250467 7344332.681773
+320880.111224 7344333.511631
+320910.762464 7344348.069137
+320928.162010 7344364.576310
+320951.787461 7344371.515121
+320969.780736 7344372.844893
+320998.708514 7344386.942478
+321017.707829 7344388.952134
+321041.877531 7344385.042804
+321066.245143 7344381.143472
+321091.783719 7344397.630648
+321111.970492 7344426.795652
+321139.422193 7344436.773943
+321166.560538 7344439.663448
+321195.521300 7344434.814278
+321258.440040 7344432.054751
+321301.914168 7344430.385037
+321333.381784 7344436.094059
+321368.123154 7344441.063208
+321411.564297 7344433.964424
+321447.864204 7344436.084061
+321481.550057 7344451.901352
+321504.078759 7344481.306315
+321512.522899 7344506.112066
+321522.253451 7344541.905935
+321524.224300 7344620.682441
+321529.114315 7344636.139793
+321534.416641 7344643.958454
+321556.376354 7344661.955371
+321569.982634 7344672.423578
+321581.271724 7344697.489285
+321591.208432 7344716.226075
+321600.741074 7344735.722736
+321611.296250 7344754.129583
+321624.160369 7344767.137355
+321646.400454 7344778.825352
+321663.808246 7344786.354063
+321674.726256 7344791.923109
+321690.105476 7344799.091881
+321703.546832 7344806.450621
+321715.553344 7344823.217748
+321716.815017 7344860.781314
+321724.632444 7344878.498279
+321740.176588 7344896.745154
+321752.570673 7344906.973402
+321767.463366 7344920.671056
+321783.040495 7344935.928442
+321787.419244 7344960.134296
+321785.341194 7344972.292213
+321777.853616 7344993.358605
+321764.387522 7345028.302619
+321756.743266 7345045.929600
+321751.201799 7345065.796197
+321750.121543 7345087.492481
+321756.891698 7345099.430436
+321772.023531 7345109.808658
+321787.765586 7345112.438208
+321802.864434 7345117.397358
+321818.309624 7345119.467004
+321831.264452 7345116.857451
+321843.023577 7345112.578184
+321856.555642 7345096.021020
+321868.603385 7345076.454371
+321879.059605 7345062.186815
+321896.252996 7345046.669473
+321914.238025 7345040.690497
+321930.177989 7345043.540009
+321932.412717 7345051.658619
+321937.113069 7345066.336104
+321942.102038 7345082.793286
+321947.536304 7345104.239612
+321967.327258 7345132.724733
+321992.230874 7345135.034337
+322011.535300 7345137.593899
+322035.795711 7345142.663030
+322055.050659 7345148.662003
+322068.442538 7345160.459982
+322076.565075 7345178.056968
+322074.726166 7345203.512607
+322066.677845 7345220.689665
+322059.882951 7345243.315789
+322057.639976 7345260.232892
+322067.263327 7345280.069494
+322084.794813 7345302.335680
+322103.876591 7345323.062130
+322116.212952 7345337.609638
+322124.673585 7345352.557077
+322139.558031 7345358.616040
+322151.218201 7345361.975464
+322157.996603 7345348.987689
+322165.805783 7345334.350196
+322180.855154 7345327.451378
+322195.640646 7345324.861821
+322207.003952 7345327.991285
+322219.414529 7345336.459835
+322245.249969 7345337.329686
+322266.855094 7345335.050076
+322286.547092 7345346.928042
+322304.152795 7345363.535197
+322329.328537 7345384.561595
+322354.298123 7345381.552111
+322379.061554 7345370.783955
+322396.683749 7345361.135608
+322439.201314 7345354.466750
+322475.501221 7345356.906332
+322500.874873 7345362.315406
+322526.298002 7345380.362315
+322540.250624 7345404.008264
+322553.188960 7345427.654214
+322568.345532 7345436.152758
+322585.151350 7345435.362894
+322606.970877 7345431.533549
+322634.463810 7345430.653700
+322655.772070 7345435.242914
+322677.162792 7345450.120366
+322684.064887 7345467.927316
+322680.551993 7345488.823736
+322671.217260 7345502.881328
+322657.841874 7345522.987884
+322657.371838 7345544.474204
+322665.865456 7345557.202024
+322684.971972 7345575.608871
+322703.295097 7345591.786100
+322728.272929 7345604.723884
+322768.448565 7345606.433591
+322797.912347 7345601.704401
+322829.792275 7345591.686117
+322870.157574 7345577.788497
+322899.011135 7345565.520599
+322931.641470 7345551.742959
+322964.535684 7345541.514711
+323010.895992 7345528.906870
+323046.750603 7345526.247326
+323073.171526 7345529.116834
+323091.898716 7345536.885504
+323113.033805 7345556.082215
+323127.769819 7345574.209110
+323149.210019 7345585.327206
+323172.621068 7345584.397365
+323187.860102 7345562.321147
+323212.574055 7345538.815173
+323227.244100 7345520.828254
+323238.879531 7345501.151625
+323265.160268 7345466.137622
+323298.780151 7345413.936564
+323327.386325 7345379.842404
+323345.808404 7345363.125267
+323373.515739 7345344.748415
+323400.810762 7345334.670141
+323425.005203 7345328.431210
+323445.117760 7345322.812172
+323479.026260 7345312.593923
+323502.000259 7345306.564955
+323538.745462 7345313.773721
+323567.846410 7345322.442236
+323591.694509 7345327.831313
+323619.706955 7345317.763037
+323636.174677 7345302.565641
+323650.745767 7345276.380126
+323665.737414 7345248.764856
+323676.647177 7345230.408000
+323692.100614 7345206.562085
+323714.414914 7345188.115245
+323745.849545 7345171.888024
+323774.496950 7345159.500146
+323796.382446 7345150.681657
+323821.352033 7345147.452210
+323837.094087 7345150.191741
+323853.182483 7345166.228994
+323868.660658 7345190.004921
+323884.749054 7345205.602249
+323902.404234 7345217.890145
+323921.560228 7345232.857581
+323950.727145 7345252.604198
+323978.022169 7345266.891751
+323996.765851 7345273.660592
+324022.972372 7345269.111371
+324039.481326 7345251.144448
+324061.350330 7345226.598653
+324078.222118 7345212.191121
+324100.025151 7345193.184377
+324111.256517 7345190.334865
+324132.441084 7345180.626528
+324148.768621 7345176.617214
+324157.567349 7345189.574995
+324168.089539 7345219.049946
+324174.232981 7345241.056177
+324186.874453 7345272.560780
+324199.548909 7345292.987281
+324215.596074 7345311.904041
+324224.815360 7345331.730645
+324233.828490 7345360.415731
+324235.692138 7345374.063394
+324246.535931 7345386.381284
+324265.931066 7345398.139270
+324290.018305 7345400.758821
+324325.336911 7345399.868973
+324341.483031 7345394.299927
+324361.471894 7345399.089107
+324372.752738 7345408.757451
+324393.327083 7345415.656269
+324429.132216 7345416.536118
+324455.478923 7345417.855892
+324481.743168 7345416.956046
+324508.164091 7345411.406997
+324530.758763 7345394.739852
+324556.858083 7345374.013402
+324576.912916 7345357.086302
+324593.504332 7345347.877879
+324617.434893 7345346.958036
+324635.386937 7345351.937184
+324659.787534 7345370.404020
+324694.124838 7345391.310439
+324723.489666 7345420.245483
+324740.930443 7345450.260342
+324752.310242 7345485.064380
+324768.984120 7345511.519849
+324792.535355 7345524.437636
+324825.701695 7345533.256125
+324847.471743 7345534.185966
+324873.876174 7345538.055303
+324895.530776 7345532.006339
+324918.232649 7345522.977886
+324952.528722 7345505.680849
+324981.308067 7345498.942003
+325003.952216 7345469.866983
+325012.586020 7345445.931083
+325020.189044 7345432.073457
+325038.982204 7345409.817269
+325058.286630 7345387.231138
+325070.474559 7345364.125096
+325074.276071 7345344.668429
+325072.313468 7345338.339513
+325052.687439 7345320.932494
+325046.354334 7345314.313628
+325040.722159 7345300.286031
+325052.753409 7345290.137769
+325078.465156 7345284.798684
+325099.385843 7345280.069494
+325119.506646 7345273.670590
+325134.951836 7345258.683157
+325151.708177 7345236.846898
+325163.986814 7345222.599338
+325182.672773 7345209.201633
+325205.259199 7345192.754450
+325235.151785 7345178.496892
+325262.422070 7345170.408278
+325286.764942 7345176.467240
+325299.851710 7345188.255221
+325323.658578 7345197.403654
+325343.903075 7345197.873573
+325361.220159 7345196.093878
+325374.521329 7345206.892029
+325378.718660 7345221.339554
+325379.790670 7345242.395947
+325380.689510 7345268.881410
+325390.131444 7345295.356875
+325393.512398 7345310.024363
+325406.310548 7345320.252611
+325426.794185 7345309.874389
+325453.041937 7345302.325682
+325469.806524 7345304.305343
+325490.578779 7345303.335509
+325504.308753 7345286.778345
+325518.145928 7345270.561123
+325532.560339 7345256.993447
+325545.845017 7345252.174272
+325564.959780 7345270.021215
+325576.463271 7345286.888326
+325593.194873 7345308.024705
+325613.348661 7345324.441893
+325630.583283 7345329.521023
+325647.273654 7345313.003853
+325655.041603 7345301.685791
+325676.465310 7345289.097947
+325690.739536 7345286.948316
+325717.787172 7345280.409436
+325718.718996 7345262.252546
+325709.474972 7345244.195639
+325702.457429 7345218.520037
+325707.702032 7345205.962188
+325728.523764 7345200.673094
+325763.825878 7345201.552943
+325800.134031 7345202.762736
+325831.642879 7345205.692234
+325861.106661 7345210.041489
+325901.603899 7345218.400057
+325931.042943 7345224.519009
+325972.562714 7345232.667613
+326000.179341 7345246.065318
+326028.142309 7345264.902092
+326053.953011 7345293.017276
+326067.897387 7345317.673053
+326082.847803 7345343.878564
+326097.484862 7345378.722596
+326116.154328 7345416.616105
+326121.695795 7345437.722489
+326124.136680 7345471.866641
+326121.819489 7345494.772717
+326117.044921 7345510.659996
+326114.521575 7345534.665884
+326141.346563 7345546.403873
+326158.539954 7345554.692453
+326173.168767 7345565.170659
+326188.704666 7345584.637324
+326193.223600 7345606.403596
+326198.278539 7345634.598766
+326198.402233 7345666.383322
+326203.877730 7345701.337335
+326223.388312 7345728.932608
+326244.259522 7345744.809888
+326273.822258 7345766.206223
+326298.305317 7345777.804236
+326337.252265 7345788.352430
+326351.757384 7345792.631697
+326369.899092 7345807.249193
+326381.922096 7345822.566569
+326399.775185 7345835.964274
+326422.460566 7345827.825668
+326440.965107 7345812.878229
+326474.395326 7345799.650494
+326504.304405 7345784.063164
+326522.627529 7345774.874738
+326555.628945 7345755.778009
+326588.349988 7345742.770237
+326613.113418 7345731.662140
+326636.920286 7345715.334937
+326659.960255 7345695.128398
+326673.871646 7345680.560893
+326696.944599 7345665.883407
+326719.250653 7345664.713608
+326746.652877 7345670.582603
+326780.849996 7345678.531241
+326824.084983 7345696.778115
+326864.244127 7345716.424750
+326898.465984 7345730.792289
+326921.184349 7345737.381161
+326962.852553 7345742.090354
+327011.257926 7345753.308432
+327042.956437 7345774.184856
+327062.607205 7345790.592046
+327085.119414 7345805.259534
+327114.401779 7345816.027689
+327137.697381 7345825.056143
+327153.604360 7345831.125103
+327163.367897 7345848.182181
+327165.586133 7345875.237547
+327165.149083 7345894.944171
+327166.633404 7345915.240695
+327181.954901 7345935.577211
+327196.723900 7345951.704449
+327215.756200 7345959.583099
+327239.546576 7345961.302805
+327253.326027 7345958.483288
+327277.932779 7345959.993029
+327301.030471 7345968.581558
+327325.274390 7345975.190426
+327335.458484 7345974.650518
+327349.435845 7345954.763925
+327367.569306 7345944.355708
+327389.685697 7345941.626175
+327407.390354 7345950.144716
+327427.923469 7345952.164370
+327442.486312 7345943.255896
+327456.249271 7345940.876304
+327470.259617 7345960.762897
+327479.718043 7345978.269898
+327498.643143 7346012.164093
+327514.715046 7346029.861061
+327525.525855 7346044.828498
+327542.331673 7346060.205864
+327566.229249 7346078.662702
+327591.174097 7346102.998534
+327605.357613 7346125.434690
+327608.392226 7346152.270094
+327602.949714 7346181.335115
+327609.579684 7346205.670947
+327628.463552 7346217.978839
+327640.923606 7346239.395170
+327638.589923 7346264.390889
+327633.345320 7346285.817218
+327627.424527 7346313.102545
+327621.338808 7346336.518534
+327626.921507 7346354.745412
+327636.981908 7346389.869395
+327644.321053 7346413.885282
+327660.302248 7346439.110961
+327673.859051 7346454.218373
+327699.447105 7346459.297503
+327731.384756 7346460.677266
+327752.684770 7346466.796218
+327765.837508 7346473.275109
+327776.656563 7346504.529755
+327773.828106 7346527.755777
+327770.076071 7346552.181593
+327780.367366 7346559.950262
+327791.747165 7346561.090067
+327809.121973 7346555.201075
+327827.271926 7346543.573067
+327843.071704 7346516.177760
+327856.174965 7346492.851755
+327866.161150 7346474.694865
+327885.737702 7346454.668296
+327906.378017 7346447.599507
+327925.542257 7346436.641384
+327946.232050 7346425.263333
+327970.937757 7346418.804439
+327985.822203 7346433.821867
+328006.973785 7346451.798787
+328025.733959 7346449.479185
+328053.004244 7346440.720685
+328084.842941 7346442.320411
+328111.387557 7346452.058743
+328143.580842 7346457.977729
+328164.674700 7346455.688121
+328185.356246 7346444.849978
+328203.324783 7346431.892197
+328223.478570 7346422.713769
+328236.722017 7346421.873913
+328257.205654 7346428.212827
+328277.103808 7346440.300757
+328290.677104 7346454.428337
+328307.623108 7346466.926196
+328314.137630 7346475.524723
+328324.964931 7346480.423884
+328343.461226 7346490.832101
+328363.268672 7346494.501473
+328391.000746 7346489.632307
+328416.893910 7346486.502843
+328445.566054 7346488.622480
+328472.481751 7346484.293221
+328484.727403 7346472.915170
+328498.853196 7346449.269221
+328509.614527 7346426.033201
+328512.764588 7346409.126097
+328525.034979 7346379.141233
+328539.383420 7346353.505624
+328554.003987 7346330.529560
+328571.609689 7346304.933944
+328594.022944 7346286.257143
+328614.440611 7346280.418143
+328638.791731 7346269.629991
+328657.147840 7346258.331926
+328665.954814 7346227.867145
+328663.505684 7346211.439959
+328653.940056 7346194.382880
+328644.102303 7346174.656259
+328641.628434 7346160.228731
+328643.805439 7346140.102178
+328658.426006 7346116.906151
+328671.652960 7346100.338989
+328689.250416 7346083.931800
+328708.117792 7346072.193810
+328716.784580 7346070.744058
+328751.641397 7346057.756283
+328779.035375 7346055.876605
+328814.098348 7346051.307388
+328846.860622 7346051.917283
+328876.291419 7346041.309100
+328905.136734 7346020.492666
+328934.905627 7345999.366285
+328957.079741 7345983.119068
+328984.350026 7345965.842027
+329010.276175 7345951.084555
+329034.017073 7345939.846480
+329080.748462 7345938.516708
+329121.278686 7345952.624291
+329162.823196 7345968.071645
+329198.817992 7345978.919787
+329246.002924 7345990.447813
+329273.644289 7345993.207340
+329302.819453 7346004.415420
+329338.979175 7346019.022918
+329371.964097 7346026.281675
+329406.474573 7346034.110334
+329427.551938 7346041.789018
+329439.937777 7346044.148614
+329453.189469 7346033.340465
+329469.319096 7346012.484038
+329489.918181 7345991.797581
+329517.691485 7345975.070447
+329543.930991 7345967.631721
+329573.386527 7345955.683767
+329594.084566 7345943.635831
+329623.845212 7345931.137972
+329657.036291 7345929.878188
+329684.611686 7345946.705305
+329710.455373 7345973.370738
+329722.222744 7345993.557280
+329743.968054 7346022.062397
+329765.408254 7346041.809015
+329800.157870 7346054.626819
+329842.749651 7346058.456163
+329860.074982 7346056.226545
+329899.986738 7346046.068285
+329924.329611 7346036.169981
+329963.969242 7346031.100849
+329997.333491 7346023.962072
+330047.569528 7346018.133070
+330074.988245 7346014.473697
+330122.032991 7346011.934132
+330160.592365 7346012.713999
+330204.767423 7346020.552656
+330261.526228 7346031.410796
+330311.729281 7346046.078284
+330341.951716 7346054.846782
+330381.261497 7346060.855752
+330417.586143 7346061.065716
+330455.386865 7346056.966418
+330492.973184 7346054.426853
+330530.031745 7346052.867121
+330586.856520 7346057.966247
+330626.471412 7346063.975218
+330680.748102 7346069.604254
+330719.604341 7346071.054005
+330753.908660 7346070.464106
+330792.764899 7346063.615280
+330826.574445 7346061.355667
+330858.033815 7346059.735944
+330888.676808 7346067.734574
+330921.925610 7346078.982647
+330953.863261 7346088.770971
+330975.954913 7346096.789597
+330997.757947 7346085.751488
+331014.126715 7346069.654245
+331028.170045 7346043.688693
+331039.525105 7346021.552485
+331052.867506 7345994.797068
+331060.099450 7345968.081644
+331071.083430 7345943.175910
+331083.518746 7345906.552183
+331101.421312 7345872.538009
+331109.494372 7345834.974444
+331115.151286 7345812.778246
+331127.025858 7345772.595129
+331135.816340 7345742.910213
+331146.420993 7345715.454916
+331158.204856 7345690.999105
+331186.481181 7345674.941856
+331229.452289 7345664.043723
+331256.062876 7345659.704466
+331290.680552 7345649.256256
+331316.301590 7345642.797362
+331347.365141 7345623.560657
+331380.547973 7345596.705257
+331402.796304 7345573.819177
+331424.731277 7345542.624521
+331444.357306 7345526.567271
+331464.989375 7345520.608292
+331500.811001 7345511.169908
+331520.907065 7345507.200588
+331550.197677 7345491.043356
+331572.330560 7345469.597030
+331597.390855 7345432.673354
+331617.074607 7345402.888456
+331639.413646 7345363.385223
+331656.260695 7345332.680482
+331670.938986 7345304.725271
+331686.532608 7345285.518561
+331715.592325 7345245.545408
+331744.825212 7345200.033203
+331770.380281 7345164.229336
+331793.370772 7345130.045192
+331814.299705 7345106.929151
+331838.296237 7345081.953429
+331859.926100 7345068.695700
+331900.464569 7345047.679300
+331937.605592 7345030.282280
+331963.812113 7345008.665983
+331981.219906 7344981.510634
+331998.685423 7344941.397505
+332011.335141 7344895.695334
+332019.078351 7344868.759947
+332026.937009 7344831.636306
+332036.543868 7344793.752796
+332042.472907 7344774.106161
+332049.729590 7344745.391079
+332035.249209 7344721.745130
+332035.735737 7344697.719245
+332038.580687 7344680.582181
+332043.363500 7344654.496649
+332045.144686 7344641.118940
+332044.600435 7344618.182869
+332043.412978 7344598.126305
+332051.197419 7344584.808586
+332064.655268 7344582.978899
+332074.097202 7344593.167154
+332084.487453 7344609.794306
+332092.370849 7344622.732090
+332102.183864 7344627.501273
+332121.793400 7344630.270799
+332146.960896 7344635.999817
+332165.069618 7344644.848302
+332181.677527 7344660.435632
+332189.297044 7344670.273946
+332199.909943 7344676.042958
+332215.750952 7344687.750953
+332237.001488 7344706.387760
+332259.579668 7344724.924585
+332270.538908 7344735.802722
+332281.646581 7344743.571391
+332298.716279 7344753.959612
+332318.985514 7344769.486952
+332333.358694 7344776.515748
+332350.370667 7344783.034631
+332362.006099 7344788.813642
+332374.020857 7344797.372176
+332388.616685 7344810.729888
+332404.342247 7344823.427712
+332418.385578 7344831.676300
+332441.169913 7344840.914717
+332466.279685 7344851.622883
+332495.858915 7344863.150908
+332517.859858 7344869.939745
+332543.390188 7344879.988024
+332568.681377 7344892.575868
+332592.694401 7344900.944435
+332625.365967 7344909.193022
+332665.558095 7344917.631576
+332688.697018 7344923.330600
+332708.463233 7344929.879478
+332730.027126 7344939.317862
+332750.980798 7344948.316320
+332775.793706 7344958.684544
+332793.424148 7344964.873484
+332806.271775 7344971.002434
+332820.917081 7344980.810754
+332854.050435 7345001.247254
+332873.536278 7345014.654957
+332891.735709 7345024.393289
+332908.434326 7345040.750487
+332920.935612 7345050.758773
+332937.601244 7345061.366956
+332950.152007 7345067.265945
+332964.871529 7345070.095461
+332985.017070 7345070.335419
+332998.895477 7345067.505904
+333013.705707 7345062.246805
+333024.961812 7345057.067692
+333039.062866 7345051.798595
+333059.059975 7345047.609312
+333077.976828 7345048.379180
+333096.258722 7345051.028727
+333119.389399 7345056.947713
+333137.902187 7345066.466082
+333158.839366 7345077.124257
+333177.319169 7345089.302171
+333191.007912 7345102.309942
+333205.282137 7345117.097410
+333217.437081 7345131.075015
+333234.341854 7345155.750789
+333244.633150 7345172.047997
+333249.358240 7345186.165579
+333258.956852 7345208.981671
+333262.090420 7345228.398345
+333268.365802 7345257.823304
+333279.935263 7345295.286887
+333290.284283 7345332.840455
+333296.213323 7345348.417786
+333303.016463 7345357.806178
+333322.271411 7345382.501948
+333337.477461 7345395.859660
+333354.720329 7345409.797273
+333370.528353 7345423.824870
+333383.524413 7345444.241373
+333392.916869 7345458.758886
+333399.159266 7345464.477906
+333407.842547 7345470.226922
+333419.205853 7345473.346387
+333433.018289 7345475.615999
+333448.686127 7345476.125911
+333461.022488 7345474.166247
+333487.039346 7345468.157276
+333503.267928 7345463.578061
+333523.512424 7345455.179499
+333555.986080 7345436.942623
+333589.259621 7345419.385630
+333610.741052 7345409.557314
+333623.415508 7345404.838122
+333636.667201 7345402.998437
+333655.262451 7345404.978098
+333668.159556 7345407.457673
+333683.448067 7345414.276505
+333697.474906 7345423.964846
+333710.569920 7345435.532864
+333734.121155 7345457.959023
+333742.631265 7345470.236920
+333752.724651 7345485.634283
+333763.279826 7345506.030789
+333768.920248 7345519.608463
+333774.428730 7345535.845682
+333786.707368 7345565.560592
+333793.395061 7345585.347203
+333799.761151 7345606.353604
+333807.727010 7345622.070912
+333817.135959 7345635.028693
+333830.230973 7345646.476732
+333843.441435 7345656.814961
+333858.952594 7345662.424000
+333888.061789 7345670.182671
+333916.263897 7345678.041325
+333932.715127 7345680.890837
+333943.583659 7345682.230607
+333967.604929 7345681.850672
+333991.700415 7345684.010302
+334012.118082 7345686.899808
+334030.086619 7345690.989107
+334054.412999 7345698.687788
+334075.383164 7345706.796399
+334095.454489 7345713.895183
+334113.051946 7345723.293574
+334134.269497 7345736.501311
+334149.211667 7345746.199650
+334167.971842 7345760.697167
+334191.918895 7345775.374653
+334200.767101 7345784.453098
+334220.764210 7345798.190744
+334235.986752 7345810.558626
+334246.426480 7345822.966501
+334257.336243 7345838.603822
+334264.419755 7345850.421798
+334271.659946 7345875.867439
+334273.358669 7345887.295482
+334272.113488 7345915.970570
+334243.053772 7345921.059698
+334213.804392 7345915.630628
+334182.732594 7345927.568583
+334160.319340 7345938.376732
+334133.403643 7345951.804432
+334101.993750 7345975.470378
+334077.807556 7345989.707939
+334057.967125 7346007.304925
+334032.717167 7346034.700232
+334017.626564 7346055.016752
+334001.026902 7346073.653560
+333982.126542 7346088.720979
+333958.921648 7346106.727895
+333927.363324 7346125.304713
+333907.259013 7346129.943918
+333876.838669 7346138.452461
+333857.938308 7346144.661397
+333849.758047 7346165.607809
+333849.411705 7346178.225648
+333858.457821 7346196.392536
+333872.344473 7346209.950214
+333880.862829 7346230.426706
+333878.463176 7346252.662897
+333870.208699 7346279.818246
+333863.323097 7346303.544182
+333848.603575 7346335.608690
+333844.703108 7346364.583726
+333845.098927 7346392.169001
+333851.440278 7346432.892026
+333858.993826 7346457.457818
+333860.857474 7346489.812276
+333858.853640 7346530.995222
+333855.167574 7346559.530334
+333849.634354 7346588.705336
+333844.538183 7346607.472122
+333844.389751 7346629.178404
+333834.081963 7346666.282048
+333826.008903 7346695.976962
+333813.466386 7346724.522072
+333803.711095 7346749.437804
+333784.983905 7346784.661771
+333772.441389 7346804.118438
+333749.690038 7346835.313095
+333723.310346 7346872.776678
+333705.424272 7346896.942538
+333697.252258 7346916.669159
+333692.271534 7346933.776229
+333678.219957 7346960.751608
+333666.122737 7347003.584271
+333663.376742 7347029.919760
+333663.269541 7347056.715171
+333664.712631 7347072.572454
+333666.831913 7347100.617650
+333669.264551 7347118.594571
+333669.165596 7347153.478596
+333669.528430 7347183.833396
+333662.543873 7347206.789464
+333645.094849 7347237.264244
+333629.022945 7347254.361316
+333616.026886 7347269.378743
+333607.236404 7347280.906769
+333595.765897 7347295.834212
+333592.904455 7347314.521011
+333601.233148 7347324.919230
+333619.539780 7347334.877524
+333633.657327 7347337.257116
+333660.078250 7347349.744977
+333679.827972 7347357.953571
+333708.467131 7347371.691218
+333729.956808 7347387.778462
+333754.439867 7347409.324772
+333772.086801 7347431.680942
+333791.803538 7347442.869026
+333822.438285 7347460.506005
+333840.753163 7347469.694431
+333875.445056 7347479.732711
+333905.106747 7347493.360377
+333935.502353 7347505.128361
+333958.014563 7347511.807217
+333982.101803 7347523.275253
+334003.179168 7347531.493845
+334026.450031 7347542.951883
+334045.482332 7347551.920346
+334065.380486 7347565.218069
+334076.051109 7347575.306341
+334090.688168 7347594.643028
+334102.488524 7347612.170026
+334116.655548 7347628.167286
+334123.903985 7347643.864597
+334134.525130 7347658.282128
+334152.419451 7347677.648810
+334172.771148 7347686.527289
+334189.197639 7347691.476442
+334205.929241 7347696.875517
+334219.114964 7347709.763309
+334221.267230 7347725.960535
+334221.176522 7347742.907632
+334221.654803 7347753.985734
+334235.508471 7347770.312938
+334251.225786 7347775.921977
+334274.339971 7347774.532215
+334285.018839 7347766.793541
+334293.974246 7347749.176558
+334299.152879 7347740.817990
+334306.821873 7347729.269968
+334317.286340 7347722.191181
+334326.637565 7347723.300990
+334348.910634 7347741.837815
+334356.777539 7347748.236719
+334375.191372 7347757.865070
+334390.933426 7347760.484621
+334412.489073 7347761.954369
+334430.754474 7347775.672020
+334446.133694 7347800.997682
+334451.304080 7347820.764296
+334453.942874 7347847.489718
+334462.510708 7347872.625413
+334477.477616 7347880.993979
+334502.636866 7347870.315808
+334529.395885 7347853.458696
+334558.282431 7347845.590043
+334579.120655 7347847.939641
+334600.148544 7347851.389050
+334627.055994 7347856.798124
+334651.926626 7347862.737106
+334671.684594 7347861.187372
+334688.589367 7347869.026029
+334704.735487 7347881.393911
+334716.676029 7347895.931420
+334721.838169 7347916.257939
+334730.529696 7347939.064032
+334735.823776 7347956.401063
+334741.653861 7347971.428488
+334756.068273 7347983.886355
+334776.469447 7347988.655538
+334804.391184 7347985.766033
+334830.960539 7347985.296113
+334856.218744 7347992.344906
+334879.506099 7348003.133058
+334911.204610 7348016.240813
+334938.268739 7348026.189108
+334967.295471 7348032.837970
+334990.970399 7348036.537336
+335034.634190 7348036.487344
+335053.245933 7348037.697137
+335078.685554 7348038.107067
+335101.898694 7348046.125694
+335117.648994 7348066.132267
+335138.470726 7348096.277103
+335152.530550 7348121.572770
+335168.701408 7348148.568146
+335176.527081 7348167.374925
+335195.353225 7348185.861758
+335220.619676 7348191.800741
+335231.529439 7348190.600946
+335264.423653 7348197.729725
+335283.315768 7348209.797658
+335289.525179 7348245.311575
+335287.776979 7348264.678257
+335287.834702 7348286.164577
+335300.987440 7348319.318898
+335345.533578 7348357.712322
+335373.570762 7348380.078490
+335389.543711 7348398.205385
+335406.951504 7348424.760837
+335422.726543 7348442.447807
+335453.245843 7348443.457634
+335475.263279 7348423.221100
+335500.678161 7348408.003707
+335531.065521 7348402.594634
+335555.746490 7348407.303827
+335566.928378 7348426.490540
+335578.588549 7348456.855339
+335596.722010 7348482.101015
+335613.898908 7348492.929160
+335641.919600 7348498.898138
+335667.746794 7348492.209283
+335698.026953 7348478.711595
+335722.411057 7348464.703995
+335748.576347 7348445.957206
+335779.318295 7348428.140258
+335803.116917 7348411.363132
+335824.614840 7348400.754949
+335855.200109 7348396.555668
+335880.260404 7348385.327591
+335902.310825 7348370.410147
+335913.014432 7348351.363409
+335915.290392 7348321.488526
+335912.931970 7348296.102875
+335908.446021 7348270.457268
+335907.514197 7348244.981631
+335908.553222 7348225.494969
+335922.769723 7348210.487540
+335944.737682 7348202.538901
+335979.157448 7348210.127601
+335995.831327 7348220.515822
+336018.755848 7348244.921642
+336024.049928 7348271.337117
+336013.511245 7348303.011691
+336009.231452 7348338.845553
+336010.344693 7348375.189328
+336031.619968 7348419.511736
+336036.856324 7348451.246300
+336035.586405 7348464.414045
+336035.809053 7348480.251332
+336033.475370 7348497.728338
+336050.569806 7348515.645269
+336062.238222 7348536.601679
+336063.087584 7348569.616024
+336072.001759 7348590.762402
+336087.075869 7348598.571065
+336112.391797 7348609.829136
+336122.039887 7348612.158737
+336143.174976 7348614.718299
+336162.405186 7348624.246667
+336183.688707 7348640.883817
+336186.896491 7348663.289979
+336170.478246 7348674.838001
+336155.659769 7348680.317062
+336133.015620 7348693.794754
+336122.724324 7348703.763046
+336126.501098 7348720.300214
+336136.742916 7348741.356607
+336148.716443 7348762.203036
+336174.040617 7348773.121166
+336190.302184 7348775.410774
+336217.638439 7348787.688670
+336242.418362 7348792.847787
+336266.785973 7348797.556980
+336291.046384 7348803.256004
+336310.012714 7348818.203444
+336332.450708 7348840.609606
+336353.387888 7348861.675997
+336378.027625 7348878.233161
+336398.024734 7348892.090787
+336413.065859 7348912.087362
+336412.834964 7348931.793987
+336400.144015 7348947.041375
+336395.361202 7348965.048290
+336395.534372 7348994.283283
+336391.452488 7349012.960084
+336386.686167 7349029.737210
+336377.244233 7349045.474514
+336370.498816 7349056.472630
+336373.698354 7349079.318717
+336377.343188 7349089.886907
+336385.853298 7349111.243249
+336398.865850 7349130.889883
+336400.968638 7349151.626331
+336384.756549 7349172.262796
+336370.803927 7349172.992671
+336343.055361 7349169.243314
+336319.256739 7349176.941995
+336310.919800 7349193.679128
+336298.558700 7349215.355415
+336289.141505 7349229.433004
+336264.897587 7349239.781231
+336247.151698 7349243.020676
+336226.346458 7349246.550072
+336219.304177 7349248.459745
+336208.963404 7349253.878816
+336207.676992 7349268.266352
+336221.439951 7349275.395131
+336238.798267 7349278.914528
+336260.724994 7349284.703536
+336266.827205 7349302.720450
+336269.903049 7349318.817693
+336278.050324 7349336.184718
+336293.281112 7349339.234196
+336318.638272 7349338.084393
+336331.601346 7349334.694973
+336364.676977 7349326.096446
+336394.107775 7349324.996634
+336405.413357 7349332.875285
+336399.970845 7349355.631387
+336381.037499 7349382.106852
+336368.767108 7349395.924485
+336358.558274 7349407.872439
+336336.697517 7349414.711267
+336341.925627 7349429.508733
+336358.533536 7349436.677505
+336384.525655 7349451.255008
+336416.273643 7349470.111778
+336439.585737 7349487.548791
+336460.819781 7349508.395220
+336473.799348 7349531.241307
+336486.383096 7349551.767791
+336505.712260 7349570.924509
+336525.577430 7349578.353237
+336549.400790 7349595.680269
+336567.031231 7349611.387578
+336575.153768 7349631.634110
+336574.370377 7349655.330051
+336556.245162 7349673.956861
+336536.305776 7349681.925496
+336511.839210 7349693.933439
+336498.966843 7349707.631093
+336490.638151 7349732.236878
+336486.135709 7349761.201916
+336495.412718 7349796.085941
+336503.980552 7349821.221636
+336515.772662 7349849.046869
+336516.844672 7349880.181536
+336505.481366 7349912.835943
+336501.704592 7349940.481208
+336511.954657 7349970.386085
+336512.985436 7349995.761739
+336494.406678 7350018.147904
+336460.506424 7350027.726263
+336428.807913 7350031.575604
+336406.130779 7350047.152936
+336384.360730 7350073.048500
+336366.969430 7350089.795631
+336340.119703 7350114.741358
+336318.943382 7350132.328346
+336286.948007 7350153.234765
+336260.906411 7350169.661951
+336234.477242 7350193.277906
+336205.590696 7350218.533580
+336185.247245 7350234.810792
+336151.676840 7350259.786513
+336124.464279 7350280.412980
+336100.533717 7350299.079783
+336087.339748 7350323.075673
+336085.393638 7350350.301009
+336092.246256 7350374.626842
+336094.819079 7350398.582739
+336114.387385 7350423.288507
+336142.853373 7350435.126479
+336169.554668 7350432.776882
+336201.261425 7350428.487616
+336224.021021 7350449.893950
+336232.968182 7350477.799170
+336245.510698 7350511.613378
+336267.833245 7350535.569274
+336292.159625 7350553.676173
+336308.000634 7350557.075591
+336354.253742 7350562.694628
+336391.040177 7350567.653779
+336417.304421 7350576.482266
+336437.268546 7350593.659324
+336431.718833 7350616.075484
+336428.214185 7350646.600256
+336442.183299 7350671.356017
+336459.789002 7350698.351391
+336463.178202 7350713.898728
+336464.736740 7350737.614666
+336465.091328 7350769.519201
+336452.218962 7350800.163952
+336435.503852 7350828.439108
+336429.863431 7350849.975419
+336427.653441 7350883.729638
+336441.169013 7350912.454717
+336459.442660 7350934.480944
+336483.818518 7350957.137064
+336497.490768 7350972.354457
+336499.511095 7351000.839578
+336487.034548 7351023.845637
+336467.820830 7351048.221462
+336453.810484 7351071.427487
+336445.432314 7351092.483880
+336431.760064 7351122.018821
+336411.804186 7351158.222619
+336396.119855 7351185.297982
+336379.907765 7351214.682948
+336363.019485 7351249.047062
+336351.977782 7351280.591659
+336344.993225 7351295.029186
+336338.981723 7351330.843051
+336328.838859 7351354.319030
+336325.556859 7351383.304065
+336347.153737 7351399.711255
+336373.673615 7351413.088963
+336398.750402 7351436.744911
+336417.378637 7351464.310189
+336426.820572 7351492.885295
+336424.676552 7351529.189076
+336430.523129 7351561.043620
+336443.403741 7351574.481318
+336485.137915 7351610.835091
+336491.471020 7351626.642383
+336495.280778 7351658.136989
+336490.250578 7351679.793279
+336470.987383 7351708.918290
+336455.352530 7351723.135855
+336433.788636 7351748.371532
+336429.484104 7351768.478088
+336431.232305 7351794.413646
+336412.463884 7351815.020116
+336390.718574 7351829.287672
+336370.259676 7351838.026175
+336331.733286 7351842.235454
+336300.315147 7351847.524548
+336261.104320 7351858.492670
+336236.736709 7351861.422168
+336211.882570 7351863.021894
+336190.186737 7351854.913283
+336158.752106 7351834.836722
+336137.006795 7351813.320407
+336108.260435 7351790.514314
+336082.680628 7351774.607038
+336059.657152 7351758.499797
+336027.529837 7351745.622003
+336004.968150 7351742.812485
+335960.009701 7351739.313084
+335925.680643 7351740.912810
+335890.617670 7351736.193618
+335866.324274 7351741.672680
+335840.983608 7351768.078157
+335828.309151 7351798.722908
+335823.699508 7351819.609330
+335819.089865 7351839.825867
+335804.642469 7351865.571457
+335774.881823 7351877.529409
+335748.180528 7351880.208950
+335708.532651 7351875.109823
+335683.909406 7351874.379948
+335658.271875 7351872.870207
+335636.180223 7351873.060174
+335620.809249 7351890.277225
+335616.504717 7351910.713725
+335614.311220 7351942.258321
+335602.156276 7351963.384703
+335575.405504 7351988.110467
+335553.693178 7351999.488518
+335538.033586 7352024.564223
+335537.415119 7352043.161038
+335547.953802 7352056.348779
+335561.988886 7352083.984045
+335554.773434 7352100.841157
+335532.953908 7352121.417633
+335509.419166 7352158.471286
+335495.573745 7352194.535109
+335491.162011 7352233.138496
+335493.404986 7352268.382459
+335500.686408 7352308.335616
+335508.462603 7352348.968655
+335512.412548 7352386.222274
+335515.702794 7352410.408131
+335514.498844 7352444.622271
+335509.303719 7352479.886230
+335505.378513 7352511.630793
+335504.520905 7352533.107114
+335519.017778 7352556.863045
+335536.376094 7352561.162309
+335564.668911 7352552.623771
+335601.059527 7352540.415862
+335632.626098 7352521.729063
+335658.642956 7352507.961421
+335689.005577 7352497.013297
+335710.643686 7352483.305645
+335737.757292 7352471.427679
+335766.066602 7352461.559370
+335793.031777 7352463.089108
+335820.813328 7352481.675924
+335838.394291 7352511.010899
+335848.957713 7352549.344333
+335855.942270 7352579.329197
+335869.441350 7352609.823973
+335887.550072 7352619.562305
+335913.014432 7352627.600928
+335939.229200 7352632.330118
+335966.788102 7352643.948128
+335993.827493 7352656.545970
+336013.115426 7352678.692177
+336018.261074 7352710.096797
+336010.575587 7352750.219925
+336003.805432 7352781.044645
+336003.500321 7352798.871591
+336006.213331 7352820.277924
+336019.506255 7352850.552739
+336039.956907 7352869.279531
+336066.847865 7352886.426594
+336105.151606 7352902.143902
+336128.760565 7352902.863778
+336155.832940 7352894.635188
+336180.291260 7352884.066998
+336207.429605 7352878.497952
+336233.314523 7352876.248337
+336248.941130 7352889.716030
+336248.429864 7352917.071345
+336237.058312 7352940.867269
+336230.906624 7352962.613544
+336223.460278 7352999.967145
+336218.726941 7353030.701881
+336213.944127 7353057.897222
+336200.197661 7353084.432677
+336170.676155 7353119.976589
+336146.720855 7353140.413088
+336127.127811 7353162.459312
+336110.874491 7353185.975284
+336104.310491 7353207.711561
+336102.521059 7353231.397503
+336113.480299 7353261.202398
+336137.056273 7353282.628728
+336178.485336 7353310.014037
+336207.116248 7353326.291249
+336238.831252 7353348.357469
+336259.471567 7353377.612458
+336269.614431 7353425.904186
+336263.949270 7353467.267101
+336261.772265 7353497.921850
+336268.212571 7353530.886204
+336273.176802 7353569.049667
+336262.934984 7353592.405666
+336256.939974 7353618.041275
+336262.852521 7353653.545193
+336268.006416 7353683.180117
+336262.753567 7353715.684549
+336250.549145 7353741.240172
+336230.296403 7353767.585659
+336200.148184 7353795.040956
+336176.432024 7353812.497966
+336165.579985 7353844.052561
+336164.862563 7353871.507858
+336165.579985 7353907.181748
+336175.805311 7353965.771712
+336184.183481 7353989.797596
+336192.000908 7354009.934147
+336204.329022 7354026.681278
+336215.791283 7354057.715963
+336219.015559 7354069.383964
+336223.864343 7354090.480350
+336231.013825 7354106.737566
+336236.497568 7354117.095791
+336244.974693 7354132.253195
+336253.493050 7354144.201148
+336265.812918 7354153.089626
+336277.085515 7354164.847612
+336286.873791 7354172.936226
+336294.163459 7354184.874181
+336296.637328 7354191.433058
+336301.329434 7354199.791626
+336302.962187 7354216.868701
+336302.822001 7354229.716500
+336303.151851 7354245.333825
+336304.545464 7354257.311774
+336303.613639 7354276.468492
+336302.178795 7354285.976863
+336293.487268 7354298.504718
+336276.120706 7354303.503861
+336257.830567 7354308.612986
+336242.847166 7354310.442673
+336225.513589 7354312.232366
+336211.305334 7354317.061539
+336196.948646 7354325.980011
+336179.961411 7354334.088622
+336166.115990 7354342.907112
+336154.439327 7354348.526149
+336137.567539 7354354.875062
+336116.465435 7354357.174668
+336104.821757 7354360.034178
+336088.807577 7354362.623735
+336073.865407 7354360.464105
+336062.180499 7354358.334469
+336051.592338 7354358.104509
+336037.804641 7354362.043834
+336024.552948 7354363.663556
+336011.639351 7354362.183810
+335990.677433 7354360.734058
+335983.536197 7354362.083827
+335974.547806 7354373.061947
+335969.327942 7354384.849927
+335967.381831 7354403.876668
+335973.805645 7354438.180792
+335981.697287 7354461.086869
+335989.382774 7354483.103098
+335994.215066 7354505.969181
+336000.795558 7354527.205543
+336005.702065 7354543.542745
+336006.543180 7354559.170068
+336001.232608 7354578.266797
+335994.314020 7354586.385406
+335978.951293 7354603.592459
+335969.130032 7354616.330277
+335963.852444 7354632.557497
+335962.681480 7354654.913668
+335962.219691 7354668.971260
+335966.854072 7354691.177456
+335969.426896 7354706.274870
+335978.192639 7354723.201971
+335987.420172 7354735.599847
+335994.569654 7354751.527119
+335999.245266 7354769.963961
+335994.957226 7354788.960707
+335986.958383 7354802.938313
+335968.445595 7354827.874041
+335951.458360 7354844.731154
+335933.869150 7354860.148513
+335920.798874 7354872.076470
+335906.870991 7354888.523653
+335898.822669 7354906.270613
+335892.819414 7354923.807609
+335887.401640 7354952.322724
+335881.827188 7354977.398429
+335877.671088 7354993.195723
+335880.029510 7355009.832874
+335888.152047 7355029.749462
+335900.917212 7355043.967027
+335914.770880 7355052.425578
+335934.256723 7355057.964629
+335950.963586 7355066.683136
+335973.846876 7355078.241156
+335986.801704 7355084.480087
+335999.748286 7355101.247215
+336011.771291 7355118.214309
+336019.423793 7355135.361372
+336028.758526 7355164.596364
+336041.754585 7355185.892716
+336058.980961 7355211.458337
+336077.551473 7355234.594374
+336095.858105 7355254.410980
+332741.101814 7354236.195391
+332502.777502 7354836.182618
+332270.225552 7355060.754151
+332066.601378 7355329.898049
+331836.811915 7355681.047900
+332097.062954 7357342.563298
+332089.286759 7357391.804863
+332084.108126 7357442.346206
+330702.765538 7357474.340726
+328059.098209 7357476.850296
+326572.937783 7357617.596187
+325088.517311 7358098.433824
+324813.216901 7358187.338596
+323836.187002 7358520.431540
+323692.084121 7358570.502963
+323030.785901 7358765.929488
+321650.193720 7359181.658278
+320430.089679 7359519.310441
+320357.102292 7359526.609191
+320181.952353 7359475.527940
+319998.490214 7359307.786673
+319987.803099 7359291.999377
+319974.386481 7359269.613212
+319955.708769 7359252.936068
+319943.867182 7359248.856767
+319925.552303 7359244.147574
+319902.957631 7359239.408386
+319864.324041 7359229.230129
+319834.109852 7359235.069129
+319806.419009 7359239.908300
+319770.399474 7359250.506485
+319743.409561 7359262.204481
+319724.748341 7359269.903162
+319711.900714 7359274.102443
+319698.071785 7359275.002289
+319680.226942 7359273.342573
+319662.893365 7359272.192770
+319614.958026 7359261.434613
+319593.352902 7359260.244816
+319573.232099 7359261.354626
+319548.048111 7359266.213794
+319529.659016 7359271.632866
+319518.839962 7359273.322576
+319511.047274 7359272.502717
+319498.529496 7359266.573732
+319484.238778 7359260.644748
+319465.387895 7359260.494774
+319454.568840 7359261.414616
+319433.656399 7359267.833517
+319423.290887 7359276.612013
+319414.937456 7359284.140723
+319407.293200 7359298.008348
+319398.882044 7359313.885628
+319389.918392 7359336.111821
+319386.562176 7359347.979788
+319350.262269 7359362.377322
+319298.376985 7359408.559411
+319292.332498 7359411.298942
+319283.269891 7359412.488738
+319248.041993 7359416.508050
+319180.274470 7359446.332941
+319136.082920 7359463.729961
+319126.352368 7359468.629122
+319142.053191 7356557.657745
diff --git a/examples/data/EstadosBrasil.dbf b/examples/data/EstadosBrasil.dbf
new file mode 100644
index 0000000..e056083
Binary files /dev/null and b/examples/data/EstadosBrasil.dbf differ
diff --git a/examples/data/EstadosBrasil.shp b/examples/data/EstadosBrasil.shp
new file mode 100644
index 0000000..ca7a3a8
Binary files /dev/null and b/examples/data/EstadosBrasil.shp differ
diff --git a/examples/data/EstadosBrasil.shx b/examples/data/EstadosBrasil.shx
new file mode 100644
index 0000000..ff58121
Binary files /dev/null and b/examples/data/EstadosBrasil.shx differ
diff --git a/examples/data/OcorrenciasPoA.dbf b/examples/data/OcorrenciasPoA.dbf
new file mode 100644
index 0000000..4fc17ca
Binary files /dev/null and b/examples/data/OcorrenciasPoA.dbf differ
diff --git a/examples/data/OcorrenciasPoA.shp b/examples/data/OcorrenciasPoA.shp
new file mode 100644
index 0000000..20fb31f
Binary files /dev/null and b/examples/data/OcorrenciasPoA.shp differ
diff --git a/examples/data/OcorrenciasPoA.shx b/examples/data/OcorrenciasPoA.shx
new file mode 100644
index 0000000..df08bb4
Binary files /dev/null and b/examples/data/OcorrenciasPoA.shx differ
diff --git a/examples/data/SOCEC.dbf b/examples/data/SOCEC.dbf
new file mode 100644
index 0000000..45d9d83
Binary files /dev/null and b/examples/data/SOCEC.dbf differ
diff --git a/examples/data/cities.dbf b/examples/data/cities.dbf
new file mode 100644
index 0000000..d85d10e
Binary files /dev/null and b/examples/data/cities.dbf differ
diff --git a/examples/data/cities.shp b/examples/data/cities.shp
new file mode 100644
index 0000000..e5a4a1d
Binary files /dev/null and b/examples/data/cities.shp differ
diff --git a/examples/data/cities.shx b/examples/data/cities.shx
new file mode 100644
index 0000000..6e1886c
Binary files /dev/null and b/examples/data/cities.shx differ
diff --git a/examples/data/elevation.raw b/examples/data/elevation.raw
new file mode 100644
index 0000000..bf7d3d0
Binary files /dev/null and b/examples/data/elevation.raw differ
diff --git a/examples/data/nat1.tif b/examples/data/nat1.tif
new file mode 100644
index 0000000..dac0523
Binary files /dev/null and b/examples/data/nat1.tif differ
diff --git a/examples/data/nat2.tif b/examples/data/nat2.tif
new file mode 100644
index 0000000..7bf86a4
Binary files /dev/null and b/examples/data/nat2.tif differ
diff --git a/examples/data/rivers.dbf b/examples/data/rivers.dbf
new file mode 100644
index 0000000..4aa1d8b
Binary files /dev/null and b/examples/data/rivers.dbf differ
diff --git a/examples/data/rivers.shp b/examples/data/rivers.shp
new file mode 100644
index 0000000..877dd1e
Binary files /dev/null and b/examples/data/rivers.shp differ
diff --git a/examples/data/rivers.shx b/examples/data/rivers.shx
new file mode 100644
index 0000000..c3b4cd1
Binary files /dev/null and b/examples/data/rivers.shx differ
diff --git a/examples/data/sampa.jpg b/examples/data/sampa.jpg
new file mode 100644
index 0000000..b2ab515
Binary files /dev/null and b/examples/data/sampa.jpg differ
diff --git a/examples/data/states.dbf b/examples/data/states.dbf
new file mode 100644
index 0000000..fea8e75
Binary files /dev/null and b/examples/data/states.dbf differ
diff --git a/examples/data/states.shp b/examples/data/states.shp
new file mode 100644
index 0000000..aa19d09
Binary files /dev/null and b/examples/data/states.shp differ
diff --git a/examples/data/states.shx b/examples/data/states.shx
new file mode 100644
index 0000000..8555f79
Binary files /dev/null and b/examples/data/states.shx differ
diff --git a/examples/databaseQuery/.cdtproject b/examples/databaseQuery/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/databaseQuery/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/databaseQuery/.project b/examples/databaseQuery/.project
new file mode 100644
index 0000000..64a8d5c
--- /dev/null
+++ b/examples/databaseQuery/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>databaseQuery</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/databaseQuery/Makefile b/examples/databaseQuery/Makefile
new file mode 100644
index 0000000..04b108b
--- /dev/null
+++ b/examples/databaseQuery/Makefile
@@ -0,0 +1,23 @@
+all: databaseQuery
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+databaseQuery: shapelib tiff terralib stat
+ qmake -o makeDatabaseQuery databaseQuery.pro; make -f makeDatabaseQuery
+
+clean:
+ if \
+ test -f makeDatabaseQuery; \
+ then \
+ make -f makeDatabaseQuery distclean; rm -f makeDatabaseQuery; \
+ fi
\ No newline at end of file
diff --git a/examples/databaseQuery/databaseQuery.cpp b/examples/databaseQuery/databaseQuery.cpp
new file mode 100644
index 0000000..48347ad
--- /dev/null
+++ b/examples/databaseQuery/databaseQuery.cpp
@@ -0,0 +1,141 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This file shows an example of how to retrieve an existing layer from a
+ TerraLib database, and execute some queries on its polygon geometry table.
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeMySQL.h>
+
+int main()
+{
+ unsigned int i, j;
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Open a connection to a MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ cout.flush();
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\"!";
+ cout << endl << endl;
+
+ // Load a layer by its name
+ TeLayer *layer = new TeLayer("Distritos");
+ if (!db->loadLayer(layer))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ cout.flush();
+ getchar();
+ return 1;
+ }
+
+ // Retrieve the information about the polygons representation
+ TeRepresentation* rep = layer->getRepresentation(TePOLYGONS);
+ if (!rep)
+ {
+ cout << "Layer has no polygons representation!" << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ cout.flush();
+ getchar();
+ return 0;
+ }
+
+ string polyTableName = rep->tableName_;
+ TePolygonSet ps;
+ // Retrieve all polygons related to the object with id "33"
+ if (db->loadPolygonSet(polyTableName, "33", ps) && ps.size() > 0)
+ {
+ cout << "Polygon identifiers related to the object id \'33\': " << endl;
+ for (i = 0; i < ps.size(); ++i)
+ {
+ TePolygon pol = ps[i];
+ cout << "Parent id: " << pol[0].geomId() << endl;
+ for (j = 1; j < pol.size(); ++j)
+ cout << "\t Child id: " << pol[j].geomId() << endl;
+ }
+ }
+ else
+ {
+ cout << "No polygons related to the object \'33\' were found!" << endl << endl;
+ }
+ ps.clear();
+
+ // Retrieve all polygons that intersect a certain bounding box
+ // given in the same projection coordinates of the data
+ TeBox box(320000,7390000,338000,7400000);
+ if (db->loadPolygonSet(polyTableName, box, ps) && ps.size() > 0)
+ {
+ cout << "\nPolygons that intersect the bounding box: (320000,7390000,338000,7400000)" << endl;
+ cout << "Number of polygons found: " << ps.size() << endl;
+ for (i = 0; i < ps.size(); ++i)
+ {
+ TePolygon pol = ps[i];
+ cout << "Parent id: " << pol[0].geomId() << ", object id: " << pol.objectId() << endl;
+ for (j = 1; j < pol.size(); ++j)
+ cout << "\t Child id: " << pol[j].geomId() << endl;
+ }
+ }
+ else
+ cout << "No polygons intersect the bounding box (320000,7390000,338000,7400000)!" << endl << endl;
+
+ //! Retrieving polygons that contain a certain point
+ TePolygon poly;
+ cout << endl << "Polygons that contain the point (350000,7395000):" << endl;
+ TeCoord2D pt(350000,7395000);
+ if (db->locatePolygon(polyTableName, pt,poly,0))
+ cout << "Polygon id: " << poly.geomId() << ", object id: " << poly.objectId() << endl;
+ else
+ {
+ cout << "\nNo polygons found!\n\n";
+ db->close();
+ cout << endl << "Press Enter\n";
+ cout.flush();
+ getchar();
+ return 0;
+ }
+
+ db->close();
+ cout << endl << "Press Enter\n";
+ cout.flush();
+ getchar();
+ return 0;
+}
+
+
+
+
diff --git a/examples/databaseQuery/databaseQuery.dsp b/examples/databaseQuery/databaseQuery.dsp
new file mode 100644
index 0000000..32198e4
--- /dev/null
+++ b/examples/databaseQuery/databaseQuery.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="databaseQuery" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=databaseQuery - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "databaseQuery.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "databaseQuery.mak" CFG="databaseQuery - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "databaseQuery - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "databaseQuery - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "databaseQuery - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "databaseQuery - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "databaseQuery - Win32 Release"
+# Name "databaseQuery - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\databaseQuery.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/databaseQuery/databaseQuery.dsw b/examples/databaseQuery/databaseQuery.dsw
new file mode 100644
index 0000000..c87d2c5
--- /dev/null
+++ b/examples/databaseQuery/databaseQuery.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "databaseQuery"=".\databaseQuery.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/databaseQuery/databaseQuery.pro b/examples/databaseQuery/databaseQuery.pro
new file mode 100644
index 0000000..96e9016
--- /dev/null
+++ b/examples/databaseQuery/databaseQuery.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = databaseQuery
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ databaseQuery.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/databaseSQLQuery/.cdtproject b/examples/databaseSQLQuery/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/databaseSQLQuery/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/databaseSQLQuery/.project b/examples/databaseSQLQuery/.project
new file mode 100644
index 0000000..650dd21
--- /dev/null
+++ b/examples/databaseSQLQuery/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>databaseSQLQuery</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/databaseSQLQuery/Makefile b/examples/databaseSQLQuery/Makefile
new file mode 100644
index 0000000..2311248
--- /dev/null
+++ b/examples/databaseSQLQuery/Makefile
@@ -0,0 +1,23 @@
+all: databaseSQLQuery
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+databaseSQLQuery: shapelib tiff terralib stat
+ qmake -o makeDatabaseSQLQuery databaseSQLQuery.pro; make -f makeDatabaseSQLQuery
+
+clean:
+ if \
+ test -f makeDatabaseSQLQuery; \
+ then \
+ make -f makeDatabaseSQLQuery distclean; rm -f makeDatabaseSQLQuery; \
+ fi
\ No newline at end of file
diff --git a/examples/databaseSQLQuery/databaseSQLQuery.cpp b/examples/databaseSQLQuery/databaseSQLQuery.cpp
new file mode 100644
index 0000000..56554da
--- /dev/null
+++ b/examples/databaseSQLQuery/databaseSQLQuery.cpp
@@ -0,0 +1,138 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows an example of how retrieve geometries (polygons) using an SQL query
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeMySQL.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Open a connection to a MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !";
+ cout << endl << endl;
+
+ // Load a layer by its name
+ TeLayer *layer = new TeLayer("Distritos");
+ if (!db->loadLayer(layer))
+ {
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Retrieve the information about the polygons representation
+ TeRepresentation* rep = layer->getRepresentation(TePOLYGONS);
+ if (!rep)
+ {
+ cout << "Layer has no polygons representation!" << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ string geomTableName = rep->tableName_;
+
+ // Build the SQL to get the polygons that are inside a given box
+ TeBox bb(320100,7390100,337900,7599000);
+ string q;
+ q = "SELECT * FROM " + geomTableName + " WHERE ";
+ q += db->getSQLBoxWhere (bb, TePOLYGONS);
+
+ // Get a portal to the database
+ TeDatabasePortal *portal = db->getPortal();
+ if (!portal)
+ {
+ cout << "Fail to get a database portal!\n\n";
+ cout << "Press Enter\n";
+ db->close();
+ getchar();
+ return 1;
+ }
+
+ // Submit the query and go to the first position of the portal
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ cout << "Fail to submit the query or no records returned\n";
+ delete portal;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Process the polygons found
+ TePolygonSet ps;
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ ps.add(poly);
+ }
+ while (flag); // while there is a record to be read
+
+ delete portal;
+
+ // Show the result
+ unsigned int i, j;
+
+ cout << "Number of polygons found: " << ps.size() << endl;
+ for (i=0; i < ps.size(); ++i)
+ {
+ TePolygon pol = ps[i];
+ cout << "Geometry id: " << pol[0].geomId() << ", object id: " << pol.objectId() << endl;
+ for (j = 1; j < pol.size(); ++j)
+ cout << "\t Child id: " << pol[j].geomId() << endl;
+ }
+
+
+ db->close();
+ cout << endl << "Press Enter\n";
+ cout.flush();
+ getchar();
+ return 0;
+}
+
+
+
diff --git a/examples/databaseSQLQuery/databaseSQLQuery.dsp b/examples/databaseSQLQuery/databaseSQLQuery.dsp
new file mode 100644
index 0000000..a5e8388
--- /dev/null
+++ b/examples/databaseSQLQuery/databaseSQLQuery.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="databaseSQLQuery" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=databaseSQLQuery - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "databaseSQLQuery.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "databaseSQLQuery.mak" CFG="databaseSQLQuery - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "databaseSQLQuery - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "databaseSQLQuery - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "databaseSQLQuery - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "databaseSQLQuery - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "databaseSQLQuery - Win32 Release"
+# Name "databaseSQLQuery - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\databaseSQLQuery.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/databaseSQLQuery/databaseSQLQuery.dsw b/examples/databaseSQLQuery/databaseSQLQuery.dsw
new file mode 100644
index 0000000..4b44c1e
--- /dev/null
+++ b/examples/databaseSQLQuery/databaseSQLQuery.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "databaseSQLQuery"=".\databaseSQLQuery.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/databaseSQLQuery/databaseSQLQuery.pro b/examples/databaseSQLQuery/databaseSQLQuery.pro
new file mode 100644
index 0000000..e11c675
--- /dev/null
+++ b/examples/databaseSQLQuery/databaseSQLQuery.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = databaseSQLQuery
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ databaseSQLQuery.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importCSV/.cdtproject b/examples/importCSV/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importCSV/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importCSV/.project b/examples/importCSV/.project
new file mode 100644
index 0000000..cf757eb
--- /dev/null
+++ b/examples/importCSV/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>importCSV</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/importCSV/Makefile b/examples/importCSV/Makefile
new file mode 100644
index 0000000..4276005
--- /dev/null
+++ b/examples/importCSV/Makefile
@@ -0,0 +1,23 @@
+all: importCSV
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+importCSV: shapelib tiff terralib stat
+ qmake -o makeImportCSV importCSV.pro; make -f makeImportCSV
+
+clean:
+ if \
+ test -f makeImportCSV; \
+ then \
+ make -f makeImportCSV distclean; rm -f makeImportCSV; \
+ fi
\ No newline at end of file
diff --git a/examples/importCSV/importCSV.cpp b/examples/importCSV/importCSV.cpp
new file mode 100644
index 0000000..406be61
--- /dev/null
+++ b/examples/importCSV/importCSV.cpp
@@ -0,0 +1,181 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows how to import a MID/MIF data file into a new layer
+ and a CSV file as a second attribute table of the layer
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeDatabase.h>
+#include <TeAsciiFile.h>
+#include <TeImportExport.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ // Database server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Connect to the database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ cout << "Press Enter\n";
+ return 1;
+ }
+
+ string filename = "../data/BairrosRecife.MIF";
+ if (db->layerExist("BairrosRecife"))
+ {
+ cout << "Error: layer \"BairrosRecife\" already exists in the database!\n" << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Import the MID/MIF file
+ TeLayer* newLayer = new TeLayer("BairrosRecife", db, 0);
+ // Select the filed ID_ to be the identifier of each neighbourhood
+ if (TeImportMIF(newLayer, filename,"BairrosRecife", "ID_"))
+ cout << "MID/MIF file imported to the TerraLib database successfully!\n" << endl;
+ else
+ {
+ cout << "Fail to import the MID/MIF file!\n";
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Import the csv file
+ filename = "../data/BairrosRecife2.csv";
+ if (db->tableExist("BairrosRecife2"))
+ {
+ cout << "There is already a table named \"BairrosRecife2\" in the TerraLib database!\n\n";
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ cout << "Importing a second attribute table from a CSV file...\n";
+
+ // Creates a definition of the columns contained in the CSV file
+ TeAttributeList attList;
+ TeAttribute column1;
+ column1.rep_.name_ = "BAIRRO_ID";
+ column1.rep_.type_ = TeSTRING;
+ column1.rep_.isPrimaryKey_ = true;
+ column1.rep_.numChar_ = 32;
+ attList.push_back(column1);
+
+ TeAttribute column2;
+ column2.rep_.name_ = "ORDEM";
+ column2.rep_.type_ = TeINT;
+ attList.push_back(column2);
+
+
+ TeAttribute column3;
+ column3.rep_.name_ = "NOME";
+ column3.rep_.type_ = TeSTRING;
+ column3.rep_.numChar_ = 32;
+ attList.push_back(column3);
+
+ TeAttribute column4;
+ column4.rep_.name_ = "NOME_PADRAO";
+ column4.rep_.type_ = TeSTRING;
+ column4.rep_.numChar_ = 32;
+ attList.push_back(column4);
+
+ TeTable attTable2("BairrosRecife2",attList, "BAIRRO_ID","BAIRRO_ID", TeAttrStatic);
+ if (!newLayer->createAttributeTable(attTable2))
+ {
+ cout << "Error creating table \"BairrosRecife2\" in the TerraLib database!\n\n";
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ TeAsciiFile csvFile(filename);
+ while (csvFile.isNotAtEOF())
+ {
+ TeTableRow trow;
+ csvFile.readNStringCSV (trow, 4, ';');
+ if (trow.empty())
+ break;
+
+ csvFile.findNewLine();
+ attTable2.add(trow);
+ }
+ if (attTable2.size() > 0)
+ {
+ if (!newLayer->saveAttributeTable(attTable2))
+ {
+ cout << "Error saving table \"BairrosRecife2\" in the TerraLib database!\n\n";
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ attTable2.clear();
+ }
+ cout << "Table successfully imported...\n";
+
+
+/* TeLayer* recife = new TeLayer("BairrosRecife",db);
+ TeTable attTable2;
+ recife->getAttrTablesByName("BairrosRecife2",attTable2);
+
+ TeView* viewrec = new TeView("Recife",user);
+ viewrec->projection(recife->projection());
+ if (!db->insertView(viewrec)) // save the view in the database
+ {
+ cout << "Fail to insert the view \"Recide\" into the database: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ TeTheme* themerec = new TeTheme("Recife", recife);
+ viewrec->add(themerec);
+ themerec ->addThemeTable(attTable2);
+ themerec->visibleRep(recife->geomRep());
+ if (!themerec ->save() || !themerec ->buildCollection())
+ {
+ cout << "Error saving theme \' Recife \': ";
+ cout << db->errorMessage() << endl;
+ db->close();
+ return 0;
+ }
+ cout << "Theme created ..\n";
+*/
+ db->close();
+ getchar();
+ return 0;
+}
+
diff --git a/examples/importCSV/importCSV.dsp b/examples/importCSV/importCSV.dsp
new file mode 100644
index 0000000..283ab2c
--- /dev/null
+++ b/examples/importCSV/importCSV.dsp
@@ -0,0 +1,126 @@
+# Microsoft Developer Studio Project File - Name="importCSV" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importCSV - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "importCSV.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "importCSV.mak" CFG="importCSV - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "importCSV - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importCSV - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "importCSV - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "importCSV - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "importCSV - Win32 Release"
+# Name "importCSV - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importCSV.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportMIF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeMIFProjection.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importCSV/importCSV.dsw b/examples/importCSV/importCSV.dsw
new file mode 100644
index 0000000..7dc5853
--- /dev/null
+++ b/examples/importCSV/importCSV.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importCSV"=".\importCSV.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importCSV/importCSV.pro b/examples/importCSV/importCSV.pro
new file mode 100644
index 0000000..2b5ff7a
--- /dev/null
+++ b/examples/importCSV/importCSV.pro
@@ -0,0 +1,50 @@
+TEMPLATE = app
+TARGET = importCSV
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ importCSV.cpp \
+ ../src/terralib/functions/TeImportMIF.cpp \
+ ../src/terralib/functions/TeMIFProjection.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/functions/TeImportExport.h \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importDBF/.cdtproject b/examples/importDBF/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importDBF/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importDBF/.project b/examples/importDBF/.project
new file mode 100644
index 0000000..ba4835c
--- /dev/null
+++ b/examples/importDBF/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>importDBF</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/importDBF/Makefile b/examples/importDBF/Makefile
new file mode 100644
index 0000000..f162a62
--- /dev/null
+++ b/examples/importDBF/Makefile
@@ -0,0 +1,23 @@
+all: importDBF
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+importDBF: shapelib tiff terralib stat
+ qmake -o makeImportDBF importDBF.pro; make -f makeImportDBF
+
+clean:
+ if \
+ test -f makeImportDBF; \
+ then \
+ make -f makeImportDBF distclean; rm -f makeImportDBF; \
+ fi
\ No newline at end of file
diff --git a/examples/importDBF/importDBF.cpp b/examples/importDBF/importDBF.cpp
new file mode 100644
index 0000000..bc66813
--- /dev/null
+++ b/examples/importDBF/importDBF.cpp
@@ -0,0 +1,91 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows an example of how to import a DBF table as
+ an attribute table in a TerraLib database. This attribute
+ table will be registered in the database as an external table.
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeDatabase.h>
+#include <TeImportExport.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ // Database server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Connect to the database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ cout << "Press Enter\n";
+ return 1;
+ }
+
+ // Import the dbf file
+ string filename = "../data/SOCEC.dbf";
+ if (db->tableExist("SOCEC"))
+ {
+ cout << "There is already a table named \"SOCEC\" in the TerraLib database!\n\n";
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ if (TeImportDBFTable(filename,db))
+ cout << "The dbf file \"SOCEC.dbf\" was imported successfully as an external table in the TerraLib database!\n\n";
+ else
+ {
+ db->close();
+ cout << "Fail to import the dbf file!\n";
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ TeAttrTableVector tableVec;
+ if (db->getAttrTables(tableVec, TeAttrExternal))
+ {
+ cout << "External tables in the database: " << tableVec.size() << endl;
+ TeAttrTableVector::iterator it = tableVec.begin();
+ while (it != tableVec.end())
+ {
+ cout << (*it).name() << " primary key column: " << (*it).uniqueName() << endl << endl;
+ ++it;
+ }
+ }
+
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 0;
+}
+
diff --git a/examples/importDBF/importDBF.dsp b/examples/importDBF/importDBF.dsp
new file mode 100644
index 0000000..08486a4
--- /dev/null
+++ b/examples/importDBF/importDBF.dsp
@@ -0,0 +1,122 @@
+# Microsoft Developer Studio Project File - Name="importDBF" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importDBF - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "importDBF.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "importDBF.mak" CFG="importDBF - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "importDBF - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importDBF - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "importDBF - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "importDBF - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "importDBF - Win32 Release"
+# Name "importDBF - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importDBF/importDBF.dsw b/examples/importDBF/importDBF.dsw
new file mode 100644
index 0000000..a11bf9a
--- /dev/null
+++ b/examples/importDBF/importDBF.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importDBF"=".\importDBF.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importDBF/importDBF.pro b/examples/importDBF/importDBF.pro
new file mode 100644
index 0000000..afdf158
--- /dev/null
+++ b/examples/importDBF/importDBF.pro
@@ -0,0 +1,49 @@
+TEMPLATE = app
+TARGET = importDBF
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ importDBF.cpp \
+ ../src/terralib/functions/TeImportDBF.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/functions/TeImportExport.h \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importGeoTab/.cdtproject b/examples/importGeoTab/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importGeoTab/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importGeoTab/.project b/examples/importGeoTab/.project
new file mode 100644
index 0000000..d7dfca9
--- /dev/null
+++ b/examples/importGeoTab/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>importGeoTab</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/importGeoTab/Makefile b/examples/importGeoTab/Makefile
new file mode 100644
index 0000000..4815ebf
--- /dev/null
+++ b/examples/importGeoTab/Makefile
@@ -0,0 +1,23 @@
+all: importGeoTab
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+importGeoTab: shapelib tiff terralib stat
+ qmake -o makeImportGeoTab importGeoTab.pro; make -f makeImportGeoTab
+
+clean:
+ if \
+ test -f makeImportGeoTab; \
+ then \
+ make -f makeImportGeoTab distclean; rm -f makeImportGeoTab; \
+ fi
\ No newline at end of file
diff --git a/examples/importGeoTab/importGeoTab.cpp b/examples/importGeoTab/importGeoTab.cpp
new file mode 100644
index 0000000..912c89a
--- /dev/null
+++ b/examples/importGeoTab/importGeoTab.cpp
@@ -0,0 +1,112 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows an example of how to import some geographical data in
+ the SPRING Geo/Tab format to a TerraLib database.
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeDatabase.h>
+#include <TeImportExport.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Connect to the database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Import the SPRING geo file
+ string filename = "../data/Cadastro_Escolas.geo";
+ string layerName = "Cadastro_Escolas";
+ if (db->layerExist(layerName))
+ {
+ cout << "There is already a layer named \"Cadastro_Escolas\" in the TerraLib database!\n\n";
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ TeLayer* newLayer = new TeLayer(layerName, db);
+ if (TeImportGEO(newLayer, filename, layerName))
+ cout << "The SPRING GEO/TAB file was imported successfully to the TerraLib database!\n\n";
+ else
+ {
+ cout << "Fail to import the SPRING GEO/TAB file!\n\n";
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Show some information about the new layer created
+ cout << "Layer created: " << newLayer->name() << ", id: " << newLayer->id() << endl;
+
+ // Geometries information
+ cout << "Projection: " << newLayer->projection()->name();
+ cout << "/" << newLayer->projection()->datum().name();
+
+ TeBox bb = newLayer->box();
+ char message[255];
+ sprintf(message, "[%.15f,%.15f,%.15f,%.15f]\n",bb.x1_, bb.y1_, bb.x2_, bb.y2_);
+ cout << "\nBounding box: " << message;
+ cout << "Number of polygons: " << newLayer->nGeometries(TePOLYGONS) << endl;
+ cout << "Number of lines: " << newLayer->nGeometries(TeLINES) << endl;
+ cout << "Number of points: " << newLayer->nGeometries(TePOINTS) << endl;
+
+ // Attributes information
+ TeAttrTableVector tableVec;
+ newLayer->getAttrTables(tableVec);
+ cout << "Attribute tables: " << tableVec.size() << endl;
+ if (tableVec.size() > 0)
+ {
+ TeAttrTableVector::iterator it = tableVec.begin();
+ while (it != tableVec.end())
+ {
+ cout << (*it).name() << ": ";
+ cout << newLayer->nObjects((*it).name()) << " objects\n" << endl;
+ ++it;
+ }
+ }
+
+ db->close();
+ cout << "\nPress Enter";
+ getchar();
+ return 0;
+}
+
diff --git a/examples/importGeoTab/importGeoTab.dsp b/examples/importGeoTab/importGeoTab.dsp
new file mode 100644
index 0000000..6b70154
--- /dev/null
+++ b/examples/importGeoTab/importGeoTab.dsp
@@ -0,0 +1,122 @@
+# Microsoft Developer Studio Project File - Name="importGeoTab" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importGeoTab - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "importGeoTab.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "importGeoTab.mak" CFG="importGeoTab - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "importGeoTab - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importGeoTab - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "importGeoTab - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "importGeoTab - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "importGeoTab - Win32 Release"
+# Name "importGeoTab - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importGeoTab.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportGeo.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importGeoTab/importGeoTab.dsw b/examples/importGeoTab/importGeoTab.dsw
new file mode 100644
index 0000000..455b992
--- /dev/null
+++ b/examples/importGeoTab/importGeoTab.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importGeoTab"=".\importGeoTab.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importGeoTab/importGeoTab.pro b/examples/importGeoTab/importGeoTab.pro
new file mode 100644
index 0000000..32f31f5
--- /dev/null
+++ b/examples/importGeoTab/importGeoTab.pro
@@ -0,0 +1,49 @@
+TEMPLATE = app
+TARGET = importGeoTab
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ importGeoTab.cpp \
+ ../src/terralib/functions/TeImportGeo.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/functions/TeImportExport.h \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importGridData/.cdtproject b/examples/importGridData/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importGridData/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importGridData/.project b/examples/importGridData/.project
new file mode 100644
index 0000000..741d1e9
--- /dev/null
+++ b/examples/importGridData/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>importGridData</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/importGridData/Makefile b/examples/importGridData/Makefile
new file mode 100644
index 0000000..5ae7cbe
--- /dev/null
+++ b/examples/importGridData/Makefile
@@ -0,0 +1,23 @@
+all: importGridData
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+importGridData: shapelib tiff terralib stat
+ qmake -o makeImportGridData importGridData.pro; make -f makeImportGridData
+
+clean:
+ if \
+ test -f makeImportGridData; \
+ then \
+ make -f makeImportGridData distclean; rm -f makeImportGridData; \
+ fi
\ No newline at end of file
diff --git a/examples/importGridData/importGridData.cpp b/examples/importGridData/importGridData.cpp
new file mode 100644
index 0000000..f9d6245
--- /dev/null
+++ b/examples/importGridData/importGridData.cpp
@@ -0,0 +1,119 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows an example of how to import, to a TerraLib database, a raster data:
+ a binary raw grid data. Each point of the grid is a float value that represents the
+ elevation over an area
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeDatabase.h>
+#include <TeMySQL.h>
+#include <TeInitRasterDecoders.h>
+#include <TeImportRaster.h>
+
+int main()
+{
+ // Initialize the raster decoder tool
+ TeInitRasterDecoders();
+
+ TeRasterParams parRaw;
+ parRaw.nBands(1);
+ parRaw.setDataType(TeFLOAT);
+ parRaw.fileName_ = "../data/elevation.raw";
+ parRaw.mode_ = 'r';
+ TeProjection* proj = new TeNoProjection();
+ parRaw.projection(proj);
+ parRaw.lowerLeftResolutionSize(183557.0,8246277.0,30,30,382,422,false);
+
+ // Acess input image
+ TeRaster elev(parRaw);
+ if (!elev.init())
+ {
+ cout << "Cannot access input grid!" << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ elev.clear();
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ string layerName = "Elevation";
+
+ // Check whether there is a layer with this name in the database
+ if (db->layerExist(layerName))
+ {
+ cout << "The database already has an infolayer with the name \"";
+ cout << layerName << "\"!" << endl << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Create a layer to receive the raster geometry (same projection as raster data)
+ TeLayer* layer = new TeLayer(layerName, db, elev.projection());
+ if (layer->id() <= 0)
+ {
+ elev.clear();
+ db->close();
+ cout << "The destination layer could not be created!\n" << db->errorMessage() << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Import raster to the layer
+ if (!TeImportRaster(layer, &elev, parRaw.ncols_, 2))
+ {
+ elev.clear();
+ db->close();
+ cout << "Fail to import grid!\n" << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Close database
+ db->close();
+ cout << "The GRID data was imported successfully into the TerraLib database!\n\n";
+ cout << "Press Enter\n";
+ getchar();
+ return 0;
+}
+
diff --git a/examples/importGridData/importGridData.dsp b/examples/importGridData/importGridData.dsp
new file mode 100644
index 0000000..1562c1e
--- /dev/null
+++ b/examples/importGridData/importGridData.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="importGridData" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importGridData - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "importGridData.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "importGridData.mak" CFG="importGridData - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "importGridData - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importGridData - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "importGridData - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "importGridData - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "importGridData - Win32 Release"
+# Name "importGridData - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importGridData.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importGridData/importGridData.dsw b/examples/importGridData/importGridData.dsw
new file mode 100644
index 0000000..3ec0c83
--- /dev/null
+++ b/examples/importGridData/importGridData.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importGridData"=".\importGridData.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importGridData/importGridData.pro b/examples/importGridData/importGridData.pro
new file mode 100644
index 0000000..ddaf9eb
--- /dev/null
+++ b/examples/importGridData/importGridData.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = importGridData
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ importGridData.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importJPEG/.cdtproject b/examples/importJPEG/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importJPEG/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importJPEG/.project b/examples/importJPEG/.project
new file mode 100644
index 0000000..631421d
--- /dev/null
+++ b/examples/importJPEG/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>importJPEG</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/importJPEG/Makefile b/examples/importJPEG/Makefile
new file mode 100644
index 0000000..8b69fdc
--- /dev/null
+++ b/examples/importJPEG/Makefile
@@ -0,0 +1,23 @@
+all: importJPEG
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+importJPEG: shapelib tiff terralib stat
+ qmake -o makeImportJPEG importJPEG.pro; make -f makeImportJPEG
+
+clean:
+ if \
+ test -f makeImportJPEG; \
+ then \
+ make -f makeImportJPEG distclean; rm -f makeImportJPEG; \
+ fi
\ No newline at end of file
diff --git a/examples/importJPEG/importJPEG.cpp b/examples/importJPEG/importJPEG.cpp
new file mode 100644
index 0000000..c0a1411
--- /dev/null
+++ b/examples/importJPEG/importJPEG.cpp
@@ -0,0 +1,109 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows an example of how to import a raster data (an image in JPEG
+ format) to a TerraLib database.
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeDatabase.h>
+#include <TeMySQL.h>
+#include <TeInitRasterDecoders.h>
+#include <TeImportRaster.h>
+
+int main()
+{
+ // Initialize the raster decoder tool
+ TeInitRasterDecoders();
+
+ // Acess input image
+ TeRaster image("../data/sampa.jpg");
+ if (!image.init())
+ {
+ cout << "Cannot access input image!" << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ image.clear();
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ string layerName = "SampaJPEG";
+
+ // Check whether there is a layer with this name in the database
+ if (db->layerExist(layerName))
+ {
+ cout << "The database already has an infolayer with the name \"";
+ cout << layerName << "\"!" << endl << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Create a layer to receive the raster geometry (same projection as raster data)
+ TeLayer* layer = new TeLayer(layerName, db, image.projection());
+ if (layer->id() <= 0)
+ {
+ image.clear();
+ db->close();
+ cout << "The destination layer could not be created!\n" << db->errorMessage() << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Import raster to the layer
+ if (!TeImportRaster(layer, &image, 128, 128))
+ {
+ image.clear();
+ db->close();
+ cout << "Fail to import image!\n" << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Close database
+ db->close();
+ cout << "The JPEG image was imported successfully into the TerraLib database!\n\n";
+ cout << "Press Enter\n";
+ getchar();
+ return 0;
+}
+
diff --git a/examples/importJPEG/importJPEG.dsp b/examples/importJPEG/importJPEG.dsp
new file mode 100644
index 0000000..437b0a8
--- /dev/null
+++ b/examples/importJPEG/importJPEG.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="importJPEG" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importJPEG - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "importJPEG.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "importJPEG.mak" CFG="importJPEG - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "importJPEG - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importJPEG - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "importJPEG - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "importJPEG - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "importJPEG - Win32 Release"
+# Name "importJPEG - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importJPEG.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importJPEG/importJPEG.dsw b/examples/importJPEG/importJPEG.dsw
new file mode 100644
index 0000000..491946a
--- /dev/null
+++ b/examples/importJPEG/importJPEG.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importJPEG"=".\importJPEG.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importJPEG/importJPEG.pro b/examples/importJPEG/importJPEG.pro
new file mode 100644
index 0000000..1d4bf3b
--- /dev/null
+++ b/examples/importJPEG/importJPEG.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = importJPEG
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ importJPEG.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importMIDMIF/.cdtproject b/examples/importMIDMIF/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importMIDMIF/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importMIDMIF/.project b/examples/importMIDMIF/.project
new file mode 100644
index 0000000..c594722
--- /dev/null
+++ b/examples/importMIDMIF/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>importMIDMIF</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/importMIDMIF/Makefile b/examples/importMIDMIF/Makefile
new file mode 100644
index 0000000..f528c94
--- /dev/null
+++ b/examples/importMIDMIF/Makefile
@@ -0,0 +1,23 @@
+all: importMIDMIF
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+importMIDMIF: shapelib tiff terralib stat
+ qmake -o makeImportMIDMIF importMIDMIF.pro; make -f makeImportMIDMIF
+
+clean:
+ if \
+ test -f makeImportMIDMIF; \
+ then \
+ make -f makeImportMIDMIF distclean; rm -f makeImportMIDMIF; \
+ fi
\ No newline at end of file
diff --git a/examples/importMIDMIF/importMIDMIF.cpp b/examples/importMIDMIF/importMIDMIF.cpp
new file mode 100644
index 0000000..c75c9af
--- /dev/null
+++ b/examples/importMIDMIF/importMIDMIF.cpp
@@ -0,0 +1,111 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows an example of how to import some geographical data
+ in MID/MIF format into a TerraLib database.
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeDatabase.h>
+#include <TeImportExport.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Connects to database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user,password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ string filename = "../data/Distritos.mif";
+ if (db->layerExist("Distritos"))
+ {
+ cout << "Error: layer \"Distritos\" already exists in the database!\n" << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Import the MID/MIF file
+ TeLayer* newLayer = TeImportMIF(filename, db);
+ if (newLayer)
+ cout << "MID/MIF file imported to the TerraLib database successfully!\n" << endl;
+ else
+ {
+ cout << "Fail to import the MID/MIF file!\n";
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Show some information about the new layer created
+ cout << "Layer created: " << newLayer->name() << ", id: " << newLayer->id() << endl;
+
+ // Geometries information
+ cout << "Projection: " << newLayer->projection()->name();
+ cout << "/" << newLayer->projection()->datum().name();
+ TeBox bb = newLayer->box();
+ char message[255];
+ sprintf(message,"[%.15f,%.15f,%.15f,%.15f]\n",bb.x1_, bb.y1_, bb.x2_, bb.y2_);
+ cout << "\nBounding box: " << message;
+ cout << "Number of polygons: " << newLayer->nGeometries(TePOLYGONS) << endl;
+ cout << "Number of lines: " << newLayer->nGeometries(TeLINES) << endl;
+ cout << "Number of points: " << newLayer->nGeometries(TePOINTS) << endl;
+
+ // Attributes information
+ TeAttrTableVector tableVec;
+ newLayer->getAttrTables(tableVec);
+ cout << "Number of Attribute Tables: " << tableVec.size() << endl;
+ if (tableVec.size() > 0)
+ {
+ TeAttrTableVector::iterator it = tableVec.begin();
+ while (it != tableVec.end())
+ {
+ cout << (*it).name() << ": ";
+ cout << newLayer->nObjects((*it).name()) << " objects" << endl << endl;
+ ++it;
+ }
+ }
+ db->close();
+ cout << "Press Enter\n";
+ cout.flush();
+ getchar();
+ return 1;
+}
+
+
diff --git a/examples/importMIDMIF/importMIDMIF.dsp b/examples/importMIDMIF/importMIDMIF.dsp
new file mode 100644
index 0000000..212e9bc
--- /dev/null
+++ b/examples/importMIDMIF/importMIDMIF.dsp
@@ -0,0 +1,134 @@
+# Microsoft Developer Studio Project File - Name="importMIDMIF" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importMIDMIF - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "importMIDMIF.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "importMIDMIF.mak" CFG="importMIDMIF - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "importMIDMIF - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importMIDMIF - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "importMIDMIF - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "importMIDMIF - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "importMIDMIF - Win32 Release"
+# Name "importMIDMIF - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importMIDMIF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportMIF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeMIFProjection.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeMIFProjection.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importMIDMIF/importMIDMIF.dsw b/examples/importMIDMIF/importMIDMIF.dsw
new file mode 100644
index 0000000..1a6bbbe
--- /dev/null
+++ b/examples/importMIDMIF/importMIDMIF.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importMIDMIF"=".\importMIDMIF.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importMIDMIF/importMIDMIF.pro b/examples/importMIDMIF/importMIDMIF.pro
new file mode 100644
index 0000000..e6ae3ba
--- /dev/null
+++ b/examples/importMIDMIF/importMIDMIF.pro
@@ -0,0 +1,52 @@
+TEMPLATE = app
+TARGET = importMIDMIF
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ importMIDMIF.cpp \
+ ../src/terralib/functions/TeImportMIF.cpp \
+ ../src/terralib/functions/TeImportDBF.cpp \
+ ../src/terralib/functions/TeMIFProjection.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h \
+ ../src/terralib/drivers/MySQL/TeImportExport.h \
+ ../src/terralib/functions/TeMIFProjection.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importShape/.cdtproject b/examples/importShape/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importShape/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importShape/.project b/examples/importShape/.project
new file mode 100644
index 0000000..d85b49a
--- /dev/null
+++ b/examples/importShape/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>importShape</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/importShape/Makefile b/examples/importShape/Makefile
new file mode 100644
index 0000000..f6fb303
--- /dev/null
+++ b/examples/importShape/Makefile
@@ -0,0 +1,23 @@
+all: importShape
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+importShape: shapelib tiff terralib stat
+ qmake -o makeImportShape importShape.pro; make -f makeImportShape
+
+clean:
+ if \
+ test -f makeImportShape; \
+ then \
+ make -f makeImportShape distclean; rm -f makeImportShape; \
+ fi
\ No newline at end of file
diff --git a/examples/importShape/importShape.cpp b/examples/importShape/importShape.cpp
new file mode 100644
index 0000000..f5cebf8
--- /dev/null
+++ b/examples/importShape/importShape.cpp
@@ -0,0 +1,90 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This file shows an example of importing a shapefile that will create
+ an attribute and a geometry table in a TerraLib database.
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeImportExport.h>
+#include <TeMySQL.h>
+
+using namespace std;
+#include <string>
+
+int main()
+{
+ // Open a connection to the "TerraTeste" TerraLib database
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ TeMySQL* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Define a projection. It cannot be decoded from a shapefile
+ TeDatum sad69 = TeDatumFactory::make("SAD69");
+ TePolyconic* proj = new TePolyconic(sad69, -54.0*TeCDR);
+
+ string layerName = "Brasil";
+
+ // Check whether there is a layer with this name in the database
+ if (db->layerExist(layerName))
+ {
+ cout << "The database already has an infolayer with the name \"";
+ cout << layerName << "\" !" << endl << endl;
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Create a new layer in the database
+ TeLayer* layer = new TeLayer(layerName, db, proj);
+
+ string filename = "../data/EstadosBrasil.shp"; // Shapefile path
+ string tablename = "BrasilIBGE"; // Name of the attribute table
+ string linkcolumn = "SPRROTULO"; // Column that will link the attributes and geometry tables
+
+ if (TeImportShape(layer, filename, tablename, linkcolumn))
+ cout << "The shapefile was imported successfully into the TerraLib database!\n" << endl;
+ else
+ cout << "Error: Fail to import the shapefile!\n" << endl;
+
+ cout.flush();
+ db->close();
+ cout << "Press Enter\n";
+ getchar();
+ return 0;
+}
+
+
diff --git a/examples/importShape/importShape.dsp b/examples/importShape/importShape.dsp
new file mode 100644
index 0000000..0257b7e
--- /dev/null
+++ b/examples/importShape/importShape.dsp
@@ -0,0 +1,126 @@
+# Microsoft Developer Studio Project File - Name="importShape" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importShape - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "importShape.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "importShape.mak" CFG="importShape - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "importShape - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importShape - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "importShape - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "importShape - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "importShape - Win32 Release"
+# Name "importShape - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importShape.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportSHP.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importShape/importShape.dsw b/examples/importShape/importShape.dsw
new file mode 100644
index 0000000..5c270a2
--- /dev/null
+++ b/examples/importShape/importShape.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importShape"=".\importShape.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importShape/importShape.pro b/examples/importShape/importShape.pro
new file mode 100644
index 0000000..0a8612f
--- /dev/null
+++ b/examples/importShape/importShape.pro
@@ -0,0 +1,50 @@
+TEMPLATE = app
+TARGET = importShape
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ importShape.cpp \
+ ../src/terralib/functions/TeImportDBF.cpp \
+ ../src/terralib/functions/TeImportSHP.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeImportExport.h \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/mosaicTIFFImages/.cdtproject b/examples/mosaicTIFFImages/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/mosaicTIFFImages/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/mosaicTIFFImages/.project b/examples/mosaicTIFFImages/.project
new file mode 100644
index 0000000..edf9336
--- /dev/null
+++ b/examples/mosaicTIFFImages/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>mosaicTIFFImages</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/mosaicTIFFImages/Makefile b/examples/mosaicTIFFImages/Makefile
new file mode 100644
index 0000000..2bf9070
--- /dev/null
+++ b/examples/mosaicTIFFImages/Makefile
@@ -0,0 +1,23 @@
+all: mosaicTIFFImages
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+mosaicTIFFImages: shapelib tiff terralib stat
+ qmake -o makeMosaicTIFFImages mosaicTIFFImages.pro; make -f makeMosaicTIFFImages
+
+clean:
+ if \
+ test -f makeMosaicTIFFImages; \
+ then \
+ make -f makeMosaicTIFFImages distclean; rm -f makeMosaicTIFFImages; \
+ fi
\ No newline at end of file
diff --git a/examples/mosaicTIFFImages/mosaicTIFFImages.cpp b/examples/mosaicTIFFImages/mosaicTIFFImages.cpp
new file mode 100644
index 0000000..ebbcfed
--- /dev/null
+++ b/examples/mosaicTIFFImages/mosaicTIFFImages.cpp
@@ -0,0 +1,133 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows an example of how to build a mosaic of two images
+ in GeoTiff format in a layer of a TerraLib database.
+
+ Author: Lubia Vinhas
+*/
+
+#include <TeDatabase.h>
+#include <TeMySQL.h>
+#include <TeInitRasterDecoders.h>
+#include <TeImportRaster.h>
+
+int main()
+{
+ // Initialize the raster decoder tool
+ TeInitRasterDecoders();
+
+ // Access the input images
+ TeRaster img1("../data/nat1.tif");
+ if (!img1.init())
+ {
+ cout << "Cannot access the first input image!" << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ TeRaster img2("../data/nat2.tif");
+ if (!img2.init())
+ {
+ cout << "Cannot access the second input image!" << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Database server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Connect to the database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ cout << "Press Enter\n";
+ return 1;
+ }
+
+ // Creates a layer to receive the raster geometry (same projection as raster data)
+ string layerName = "NatividadeMosaic";
+
+ // Check whether there is a layer with this name in the database
+ if (db->layerExist(layerName))
+ {
+ db->close();
+ cout << "The database already has an infolayer with the name \"";
+ cout << layerName << "\"!" << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ TeLayer* layer = new TeLayer(layerName, db, img1.projection());
+ if (layer->id() <= 0)
+ {
+ db->close();
+ cout << "The destination layer could not be created!\n" << db->errorMessage() << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Import the first image to the layer
+ if (!TeImportRaster(layer,&img1,256,256,TeNoCompression,"",255,true,TeExpansible))
+ {
+ db->close();
+ cout << "Fail to import the first image\n\n!";
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ else
+ cout << "The first image was imported successfully!\n\n";
+
+ delete layer;
+ layer = 0;
+
+ layer = new TeLayer(layerName, db);
+
+ // Mosaic the second raster to the same layer
+ if (!TeImportRaster(layer, &img2, 256, 256, TeNoCompression, "", 255, true, TeExpansible))
+ {
+ db->close();
+ cout << "Fail to import the second image\n\n!";
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ else
+ cout << "The second image was added successfully!" << endl << endl;
+
+ // Close the database
+ db->close();
+ getchar();
+ return 0;
+}
+
diff --git a/examples/mosaicTIFFImages/mosaicTIFFImages.dsp b/examples/mosaicTIFFImages/mosaicTIFFImages.dsp
new file mode 100644
index 0000000..15cc9d3
--- /dev/null
+++ b/examples/mosaicTIFFImages/mosaicTIFFImages.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="mosaicTIFFImages" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=mosaicTIFFImages - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "mosaicTIFFImages.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "mosaicTIFFImages.mak" CFG="mosaicTIFFImages - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "mosaicTIFFImages - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "mosaicTIFFImages - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "mosaicTIFFImages - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "mosaicTIFFImages - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "mosaicTIFFImages - Win32 Release"
+# Name "mosaicTIFFImages - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\mosaicTIFFImages.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/mosaicTIFFImages/mosaicTIFFImages.dsw b/examples/mosaicTIFFImages/mosaicTIFFImages.dsw
new file mode 100644
index 0000000..c19b27b
--- /dev/null
+++ b/examples/mosaicTIFFImages/mosaicTIFFImages.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "mosaicTIFFImages"=".\mosaicTIFFImages.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/mosaicTIFFImages/mosaicTIFFImages.pro b/examples/mosaicTIFFImages/mosaicTIFFImages.pro
new file mode 100644
index 0000000..faa14d5
--- /dev/null
+++ b/examples/mosaicTIFFImages/mosaicTIFFImages.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = mosaicTIFFImages
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ mosaicTIFFImages.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/proxMatrixAndSpatialStatistics/.cdtproject b/examples/proxMatrixAndSpatialStatistics/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/proxMatrixAndSpatialStatistics/.project b/examples/proxMatrixAndSpatialStatistics/.project
new file mode 100644
index 0000000..4183b49
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>proxMatrixAndSpatialStatistics</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/proxMatrixAndSpatialStatistics/Makefile b/examples/proxMatrixAndSpatialStatistics/Makefile
new file mode 100644
index 0000000..5a09343
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/Makefile
@@ -0,0 +1,23 @@
+all: proxMatrixAndSpatialStatistics
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+proxMatrixAndSpatialStatistics: shapelib tiff terralib stat
+ qmake -o makeProxMatrixAndSpatialStatistics proxMatrixAndSpatialStatistics.pro; make -f makeProxMatrixAndSpatialStatistics
+
+clean:
+ if \
+ test -f makeProxMatrixAndSpatialStatistics; \
+ then \
+ make -f makeProxMatrixAndSpatialStatistics distclean; rm -f makeProxMatrixAndSpatialStatistics; \
+ fi
\ No newline at end of file
diff --git a/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.cpp b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.cpp
new file mode 100644
index 0000000..b0e5169
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.cpp
@@ -0,0 +1,164 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file illustrates an example of how to create a proximity matrix from a
+ Spatial Temporal Element Set (STElementSet) and calculate spatial statistics.
+ In this example, the adjacency strategy is used to construct the matrix.
+
+ Author: Karine Reis
+*/
+
+#include <TeSTElementSet.h>
+#include <TeSTEFunctionsDB.h>
+#include <TeInitQuerierStrategy.h>
+#include <TeGeneralizedProxMatrix.h>
+#include <TeSpatialStatistics.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "Terralib";
+ string user = "root";
+ string password = "ferreira";
+
+ // Open a connection to the TerraTeste MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+
+ // Opens a connection to a TerraLib database
+ // Loads a layer named DistritosSP
+ TeLayer* DistritosSP = new TeLayer("DistritosSP");
+ if (!db->loadLayer(DistritosSP))
+ {
+ cout << "Fail to load the layer!" << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Inits querier strategies
+ TeInitQuerierStrategies();
+
+ // Creates a STElementSet from DistritosSP layer
+ TeSTElementSet steSet(DistritosSP);
+
+ // Fills the STElementSet only with the attribute "Populac" to calculate statistics
+ //and without geometries
+ vector<string> attrs;
+ attrs.push_back ("DistritosSP.Populac");
+
+ if(!TeSTOSetBuildDB(&steSet, false, false, attrs))
+ {
+ cout << "Error! " << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Shows how many elements the elementSet has
+ cout << "Number of elements: " << steSet.numElements() << endl;
+
+ // Constructs the proximity matrix
+ TeGeneralizedProxMatrix proxMat;
+
+ TeProxMatrixLocalAdjacencyStrategy sc_adj (&steSet, TePOLYGONS);
+ TeProxMatrixNoWeightsStrategy sw_no;
+ TeProxMatrixNoSlicingStrategy ss_no;
+
+ proxMat.setCurrentSlicingStrategy(&ss_no);
+ proxMat.setCurrentWeightsStrategy(&sw_no);
+ proxMat.setCurrentConstructionStrategy(&sc_adj);
+
+ if(!proxMat.ConstructMatrix())
+ {
+ cout << "Error building proximity matrix! " << endl;
+ return 1;
+ }
+
+ // Calculates the global mean
+ double mean = TeFirstMoment (steSet.begin(), steSet.end(), 0);
+ cout << "Global mean " << mean << endl << endl;
+
+ // Calculates the desviations (Z) to each object and keeps them
+ // in the STElementSet
+ if(!TeDeviation (steSet.begin(), steSet.end(), mean))
+ {
+ cout << "Error calculating Z! " << endl;
+ return 1;
+ }
+
+ // Index of the Z (desviations) attribute in the STElementSet
+ int indexZ = 1;
+
+ // Calculates the local mean (WZ) to each object and keeps them
+ // in the STElementSet
+ if(!TeLocalMean (&steSet, &proxMat, indexZ))
+ {
+ cout << "Error calculating Local Mean! " << endl;
+ return 1;
+ }
+
+ // Index of the WZ (local mean) attribute in the STElementSet
+ int indexWZ = 2;
+
+ // Shows the Z and WZ generated for each object
+ TeSTElementSet::iterator it = steSet.begin();
+ while ( it != steSet.end())
+ {
+ TeSTInstance obj = (*it);
+
+ //Gets attribute value
+ string valZ, valWZ;
+ obj.getPropertyValue(valZ, indexZ);
+ obj.getPropertyValue(valWZ, indexWZ);
+ cout << " Object Identifier : " << obj.objectId() << endl;
+ cout << " Z : " << valZ << endl;
+ cout << " WZ : " << valWZ << endl << endl;
+ ++it;
+ }
+
+ // Inserts the generated attributes (Z and WZ) in the DistritosSP
+ // table
+ if(!TeUpdateDBFromSet (&steSet, "DistritosSP"))
+ {
+ cout << "Error updating database! " << endl;
+ return 1;
+ }
+
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 0;
+}
diff --git a/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.dsp b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.dsp
new file mode 100644
index 0000000..890aab9
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.dsp
@@ -0,0 +1,122 @@
+# Microsoft Developer Studio Project File - Name="proxMatrixAndSpatialStatistics" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=proxMatrixAndSpatialStatistics - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "proxMatrixAndSpatialStatistics.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "proxMatrixAndSpatialStatistics.mak" CFG="proxMatrixAndSpatialStatistics - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "proxMatrixAndSpatialStatistics - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "proxMatrixAndSpatialStatistics - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "proxMatrixAndSpatialStatistics - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "proxMatrixAndSpatialStatistics - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "proxMatrixAndSpatialStatistics - Win32 Release"
+# Name "proxMatrixAndSpatialStatistics - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\proxMatrixAndSpatialStatistics.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeSpatialStatistics.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeSpatialStatistics.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.dsw b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.dsw
new file mode 100644
index 0000000..e828c1b
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "proxMatrixAndSpatialStatistics"=".\proxMatrixAndSpatialStatistics.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.pro b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.pro
new file mode 100644
index 0000000..4998f7f
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = proxMatrixAndSpatialStatistics
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ proxMatrixAndSpatialStatistics.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierFromLayer/.cdtproject b/examples/querierFromLayer/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierFromLayer/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierFromLayer/.project b/examples/querierFromLayer/.project
new file mode 100644
index 0000000..627ab9e
--- /dev/null
+++ b/examples/querierFromLayer/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>querierFromLayer</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/querierFromLayer/Makefile b/examples/querierFromLayer/Makefile
new file mode 100644
index 0000000..e129ab1
--- /dev/null
+++ b/examples/querierFromLayer/Makefile
@@ -0,0 +1,23 @@
+all: querierFromLayer
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+querierFromLayer: shapelib tiff terralib stat
+ qmake -o makeQuerierFromLayer querierFromLayer.pro; make -f makeQuerierFromLayer
+
+clean:
+ if \
+ test -f makeQuerierFromLayer; \
+ then \
+ make -f makeQuerierFromLayer distclean; rm -f makeQuerierFromLayer; \
+ fi
\ No newline at end of file
diff --git a/examples/querierFromLayer/querierFromLayer.cpp b/examples/querierFromLayer/querierFromLayer.cpp
new file mode 100644
index 0000000..5916836
--- /dev/null
+++ b/examples/querierFromLayer/querierFromLayer.cpp
@@ -0,0 +1,117 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This example shows how to use a querier from layer.
+
+ Author: Karine Reis
+*/
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int
+main()
+{
+
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "terralib";
+ string user = "root";
+ string pass = "ferreira";
+
+ // Connects to database
+ TeDatabase* db_ = new TeMySQL();
+ if (!db_->connect(host,user,pass,dbname))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ return 1;
+ }
+
+ // Load the layer
+ TeLayer* ocorrencias = new TeLayer("OcorrenciasPoA");
+ if (!db_->loadLayer(ocorrencias))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ db_->close();
+ return 1;
+ }
+
+ bool loadAllAttributes = true;
+ bool loadGeometries = false;
+
+ // Init querier strategies
+ TeInitQuerierStrategies();
+
+ // Set querier parameters - load all attributes and no geometries of the layer "armadilhas"
+ TeQuerierParams querierParams(loadGeometries, loadAllAttributes);
+ querierParams.setParams(ocorrencias);
+
+ TeQuerier querier(querierParams);
+
+ // Load instances from layer based in the querier parameters
+ querier.loadInstances();
+
+ // Return a list of the loaded attributes
+ TeAttributeList attrList = querier.getAttrList();
+
+ cout << " Loaded Attributes ------------------- " << endl;
+
+ // Plot the attribute names
+ for(unsigned int i=0; i<attrList.size(); ++i)
+ cout << attrList[i].rep_.name_ << endl;
+
+ cout << endl;
+
+ // Traverse all the instances
+ TeSTInstance sti;
+ while(querier.fetchInstance(sti))
+ {
+ cout << " Object: " << sti.objectId() << " --------------------------- " << endl << endl;
+
+ // Plot each attribute, its name and value
+ TePropertyVector vec = sti.getPropertyVector();
+ for(unsigned int i=0; i<vec.size(); ++i)
+ {
+ string attrName = vec[i].attr_.rep_.name_;
+ string attrValue = vec[i].value_;
+ cout << attrName << " : " << attrValue << endl;
+
+ }
+ }
+
+ cout << " End " << endl;
+ getchar();
+ db_->close ();
+ return 0;
+}
+
+
+
+
diff --git a/examples/querierFromLayer/querierFromLayer.dsp b/examples/querierFromLayer/querierFromLayer.dsp
new file mode 100644
index 0000000..c5a4cbf
--- /dev/null
+++ b/examples/querierFromLayer/querierFromLayer.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierFromLayer" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierFromLayer - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "querierFromLayer.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "querierFromLayer.mak" CFG="querierFromLayer - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "querierFromLayer - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierFromLayer - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "querierFromLayer - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "querierFromLayer - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "querierFromLayer - Win32 Release"
+# Name "querierFromLayer - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierFromLayer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierFromLayer/querierFromLayer.dsw b/examples/querierFromLayer/querierFromLayer.dsw
new file mode 100644
index 0000000..cd9ca09
--- /dev/null
+++ b/examples/querierFromLayer/querierFromLayer.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierFromLayer"=".\querierFromLayer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierFromLayer/querierFromLayer.pro b/examples/querierFromLayer/querierFromLayer.pro
new file mode 100644
index 0000000..34282ef
--- /dev/null
+++ b/examples/querierFromLayer/querierFromLayer.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierFromLayer
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ querierFromLayer.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierFromTheme/.cdtproject b/examples/querierFromTheme/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierFromTheme/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierFromTheme/.project b/examples/querierFromTheme/.project
new file mode 100644
index 0000000..a018667
--- /dev/null
+++ b/examples/querierFromTheme/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>querierFromTheme</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/querierFromTheme/Makefile b/examples/querierFromTheme/Makefile
new file mode 100644
index 0000000..275b031
--- /dev/null
+++ b/examples/querierFromTheme/Makefile
@@ -0,0 +1,23 @@
+all: querierFromTheme
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+querierFromTheme: shapelib tiff terralib stat
+ qmake -o makeQuerierFromTheme querierFromTheme.pro; make -f makeQuerierFromTheme
+
+clean:
+ if \
+ test -f makeQuerierFromTheme; \
+ then \
+ make -f makeQuerierFromTheme distclean; rm -f makeQuerierFromTheme; \
+ fi
\ No newline at end of file
diff --git a/examples/querierFromTheme/querierFromTheme.cpp b/examples/querierFromTheme/querierFromTheme.cpp
new file mode 100644
index 0000000..924e8b6
--- /dev/null
+++ b/examples/querierFromTheme/querierFromTheme.cpp
@@ -0,0 +1,137 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This example shows how to use a querier from theme.
+
+ Author: Karine Reis
+*/
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int
+main()
+{
+
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste303";
+ string user = "";
+ string password = "";
+
+ // Connects to database
+ TeDatabase* db_ = new TeMySQL();
+ if (!db_->connect(host,user,password,dbname))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ return 1;
+ }
+
+ // Load the layer
+ TeTheme* bairros = new TeTheme("T_dist");
+ if (!db_->loadTheme(bairros))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ db_->close();
+ return 1;
+ }
+
+ //Init querier strategies
+ TeInitQuerierStrategies();
+
+ //All attributes and geometries
+ bool loadGeometries = true;
+ bool loadAllAttributes = true;
+
+ // Set querier parameters - load all attributes and geometries
+ TeQuerierParams querierParams(loadGeometries, loadAllAttributes);
+ querierParams.setParams(bairros);
+
+ TeQuerier querier(querierParams);
+
+ // Load instances from layer based in the querier parameters
+ querier.loadInstances();
+
+ // Traverse all the instances
+ TeSTInstance sti;
+ while(querier.fetchInstance(sti))
+ {
+ cout << " Object: " << sti.objectId() << " --------------------------- " << endl << endl;
+
+ // Plot each attribute, its name and value
+ TePropertyVector vec = sti.getPropertyVector();
+ for(unsigned int i=0; i<vec.size(); ++i)
+ {
+ string attrName = vec[i].attr_.rep_.name_;
+ string attrValue = vec[i].value_;
+
+ cout << attrName << " : " << attrValue << endl;
+
+ }
+
+ //Get geometries
+ if(sti.hasPolygons())
+ {
+ TePolygonSet polSet;
+ sti.getGeometry(polSet);
+
+ for(unsigned int i=0; i<polSet.size(); ++i)
+ {
+ TeCoord2D centroid = TeFindCentroid(polSet[i]);
+ string p = "( "+ Te2String(centroid.x()) +", "+ Te2String(centroid.y()) +")";
+ cout << " Centroid of the Polygon : " << p << endl;
+ }
+ }
+
+ if(sti.hasPoints())
+ {
+ TePointSet ponSet;
+ sti.getGeometry(ponSet);
+
+ for(unsigned int i=0; i<ponSet.size(); ++i)
+ {
+ string p = "( "+ Te2String(ponSet[i].location().x()) +", "+ Te2String(ponSet[i].location().y()) +")";
+ cout << " Point : " << p << endl;
+ }
+ }
+
+ cout << endl << endl;
+ }
+
+ cout << " End " << endl;
+ getchar();
+ db_->close ();
+ delete(bairros);
+ return 0;
+}
+
+
+
+
diff --git a/examples/querierFromTheme/querierFromTheme.dsp b/examples/querierFromTheme/querierFromTheme.dsp
new file mode 100644
index 0000000..2e9348c
--- /dev/null
+++ b/examples/querierFromTheme/querierFromTheme.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierFromTheme" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierFromTheme - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "querierFromTheme.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "querierFromTheme.mak" CFG="querierFromTheme - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "querierFromTheme - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierFromTheme - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "querierFromTheme - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "querierFromTheme - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "querierFromTheme - Win32 Release"
+# Name "querierFromTheme - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierFromTheme.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierFromTheme/querierFromTheme.dsw b/examples/querierFromTheme/querierFromTheme.dsw
new file mode 100644
index 0000000..2de6ba7
--- /dev/null
+++ b/examples/querierFromTheme/querierFromTheme.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierFromTheme"=".\querierFromTheme.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierFromTheme/querierFromTheme.pro b/examples/querierFromTheme/querierFromTheme.pro
new file mode 100644
index 0000000..9e0e2f9
--- /dev/null
+++ b/examples/querierFromTheme/querierFromTheme.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierFromTheme
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ querierFromTheme.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierGroupChronon/.cdtproject b/examples/querierGroupChronon/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierGroupChronon/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierGroupChronon/.project b/examples/querierGroupChronon/.project
new file mode 100644
index 0000000..046d95b
--- /dev/null
+++ b/examples/querierGroupChronon/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>querierGroupChronon</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/querierGroupChronon/Makefile b/examples/querierGroupChronon/Makefile
new file mode 100644
index 0000000..1f0a32c
--- /dev/null
+++ b/examples/querierGroupChronon/Makefile
@@ -0,0 +1,23 @@
+all: querierGroupChronon
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+querierGroupChronon: shapelib tiff terralib stat
+ qmake -o makeQuerierGroupChronon querierGroupChronon.pro; make -f makeQuerierGroupChronon
+
+clean:
+ if \
+ test -f makeQuerierGroupChronon; \
+ then \
+ make -f makeQuerierGroupChronon distclean; rm -f makeQuerierGroupChronon; \
+ fi
\ No newline at end of file
diff --git a/examples/querierGroupChronon/querierGroupChronon.cpp b/examples/querierGroupChronon/querierGroupChronon.cpp
new file mode 100644
index 0000000..4b704a2
--- /dev/null
+++ b/examples/querierGroupChronon/querierGroupChronon.cpp
@@ -0,0 +1,141 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This example shows how to use a querier from theme, grouping
+ spatiotemporal instances by a chronon.
+
+ Author: Karine Reis
+*/
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int
+main()
+{
+
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "saudavel";
+ string user = "root";
+ string pass = "karine";
+
+ // Connects to database
+ TeDatabase* db_ = new TeMySQL();
+ if (!db_->connect(host,user,pass,dbname))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ return 1;
+ }
+
+ // Load the layer
+ TeTheme* coletas = new TeTheme("Coletas");
+ if (!db_->loadTheme(coletas))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ db_->close();
+ return 1;
+ }
+
+ //Init querier strategies
+ TeInitQuerierStrategies();
+
+ //Attributes to group
+ bool loadGeometries = false;
+ TeGroupingAttr attributes;
+
+ pair<TeAttributeRep, TeStatisticType> attr1(TeAttributeRep("Coletas.NRO_OVOS_PAL1"), TeSUM);
+ attributes.insert(attr1);
+
+ pair<TeAttributeRep, TeStatisticType> attr2(TeAttributeRep("Coletas.NRO_OVOS_PAL2"), TeSUM);
+ attributes.insert(attr2);
+
+ pair<TeAttributeRep, TeStatisticType> attr3(TeAttributeRep("Coletas.NRO_OVOS_PAL3"), TeSUM);
+ attributes.insert(attr3);
+
+ pair<TeAttributeRep, TeStatisticType> attr4(TeAttributeRep("Coletas.NRO_OVOS"), TeSUM);
+ attributes.insert(attr4);
+
+ // Set querier parameters - load only the grouped attributes
+ TeQuerierParams querierParams(loadGeometries, attributes);
+ querierParams.setParams(coletas, TeMONTH);
+
+ TeQuerier querier(querierParams);
+
+ // number of time frames generated by chronon TeMONTH
+ int numTimeFrames = querier.getNumTimeFrames();
+
+ // Load instances from theme for each time frame or month
+ for(int frame=0; frame < numTimeFrames; ++frame)
+ {
+ TeTSEntry ts;
+ querier.getTSEntry(ts, frame);
+
+ cout << " Time frame: " << Te2String(frame) << " --------------------------- " << endl << endl;
+
+ string initialDate = ts.time_.getInitialDateTime("DDsMMsYYYY");
+ string finalDate = ts.time_.getFinalDateTime("DDsMMsYYYY");
+
+ cout << " Time Interval: " << initialDate << " to " << finalDate << endl << endl;
+
+
+ if(!querier.loadInstances(frame))
+ continue;
+
+ // Traverse all the elements
+ TeSTInstance sti;
+ while(querier.fetchInstance(sti))
+ {
+ cout << " Object: " << sti.objectId() << endl;
+
+ // Plot each attribute, its name and value
+ TePropertyVector vec = sti.getPropertyVector();
+ for(unsigned int i=0; i<vec.size(); ++i)
+ {
+ string attrName = vec[i].attr_.rep_.name_;
+ string attrValue = vec[i].value_;
+
+ cout << attrName << " : " << attrValue << endl;
+
+ }
+ }
+
+ cout << endl << endl;
+ }
+
+ cout << " End " << endl;
+ getchar();
+ db_->close ();
+ return 0;
+}
+
+
+
+
diff --git a/examples/querierGroupChronon/querierGroupChronon.dsp b/examples/querierGroupChronon/querierGroupChronon.dsp
new file mode 100644
index 0000000..1feb58e
--- /dev/null
+++ b/examples/querierGroupChronon/querierGroupChronon.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierGroupChronon" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierGroupChronon - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "querierGroupChronon.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "querierGroupChronon.mak" CFG="querierGroupChronon - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "querierGroupChronon - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierGroupChronon - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "querierGroupChronon - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "querierGroupChronon - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "querierGroupChronon - Win32 Release"
+# Name "querierGroupChronon - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierGroupChronon.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierGroupChronon/querierGroupChronon.dsw b/examples/querierGroupChronon/querierGroupChronon.dsw
new file mode 100644
index 0000000..78bd97e
--- /dev/null
+++ b/examples/querierGroupChronon/querierGroupChronon.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierGroupChronon"=".\querierGroupChronon.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierGroupChronon/querierGroupChronon.pro b/examples/querierGroupChronon/querierGroupChronon.pro
new file mode 100644
index 0000000..f56820c
--- /dev/null
+++ b/examples/querierGroupChronon/querierGroupChronon.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierGroupChronon
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ querierGroupChronon.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierGroupElement/.cdtproject b/examples/querierGroupElement/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierGroupElement/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierGroupElement/.project b/examples/querierGroupElement/.project
new file mode 100644
index 0000000..5478a17
--- /dev/null
+++ b/examples/querierGroupElement/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>querierGroupElement</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/querierGroupElement/Makefile b/examples/querierGroupElement/Makefile
new file mode 100644
index 0000000..008922d
--- /dev/null
+++ b/examples/querierGroupElement/Makefile
@@ -0,0 +1,23 @@
+all: querierGroupElement
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+querierGroupElement: shapelib tiff terralib stat
+ qmake -o makeQuerierGroupElement querierGroupElement.pro; make -f makeQuerierGroupElement
+
+clean:
+ if \
+ test -f makeQuerierGroupElement; \
+ then \
+ make -f makeQuerierGroupElement distclean; rm -f makeQuerierGroupElement; \
+ fi
\ No newline at end of file
diff --git a/examples/querierGroupElement/querierGroupElement.cpp b/examples/querierGroupElement/querierGroupElement.cpp
new file mode 100644
index 0000000..ccbfda9
--- /dev/null
+++ b/examples/querierGroupElement/querierGroupElement.cpp
@@ -0,0 +1,123 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This example shows how to use a querier from theme, grouping
+ spatiotemporal instances by a element.
+
+ Author: Karine Reis
+*/
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int
+main()
+{
+
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "saudavel";
+ string user = "root";
+ string pass = "karine";
+
+ // Connects to database
+ TeDatabase* db_ = new TeMySQL();
+ if (!db_->connect(host,user,pass,dbname))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ return 1;
+ }
+
+ // Load the layer
+ TeTheme* coletas = new TeTheme("Coletas");
+ if (!db_->loadTheme(coletas))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ db_->close();
+ return 1;
+ }
+
+ //Init querier strategies
+ TeInitQuerierStrategies();
+
+ //Attributes to group
+ bool loadGeometries = false;
+ TeGroupingAttr attributes;
+
+ pair<TeAttributeRep, TeStatisticType> attr1(TeAttributeRep("Coletas.NRO_OVOS_PAL1"), TeSUM);
+ attributes.insert(attr1);
+
+ pair<TeAttributeRep, TeStatisticType> attr2(TeAttributeRep("Coletas.NRO_OVOS_PAL2"), TeSUM);
+ attributes.insert(attr2);
+
+ pair<TeAttributeRep, TeStatisticType> attr3(TeAttributeRep("Coletas.NRO_OVOS_PAL3"), TeSUM);
+ attributes.insert(attr3);
+
+ pair<TeAttributeRep, TeStatisticType> attr4(TeAttributeRep("Coletas.NRO_OVOS"), TeSUM);
+ attributes.insert(attr4);
+
+ // Set querier parameters - load only the grouped attributes
+ TeQuerierParams querierParams(loadGeometries, attributes);
+ querierParams.setParams(coletas);
+
+ TeQuerier querier(querierParams);
+
+ // Load instances from layer based in the querier parameters
+ querier.loadInstances();
+
+ // Traverse all the instances
+ TeSTInstance sti;
+ while(querier.fetchInstance(sti))
+ {
+ cout << " Object: " << sti.objectId() << " --------------------------- " << endl << endl;
+
+ // Plot each attribute, its name and value
+ TePropertyVector vec = sti.getPropertyVector();
+ for(unsigned int i=0; i<vec.size(); ++i)
+ {
+ string attrName = vec[i].attr_.rep_.name_;
+ string attrValue = vec[i].value_;
+
+ cout << attrName << " : " << attrValue << endl;
+
+ }
+
+ cout << endl << endl;
+ }
+
+ cout << " End " << endl;
+ getchar();
+ db_->close ();
+ return 0;
+}
+
+
+
+
diff --git a/examples/querierGroupElement/querierGroupElement.dsp b/examples/querierGroupElement/querierGroupElement.dsp
new file mode 100644
index 0000000..20a6e20
--- /dev/null
+++ b/examples/querierGroupElement/querierGroupElement.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierGroupElement" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierGroupElement - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "querierGroupElement.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "querierGroupElement.mak" CFG="querierGroupElement - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "querierGroupElement - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierGroupElement - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "querierGroupElement - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "querierGroupElement - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "querierGroupElement - Win32 Release"
+# Name "querierGroupElement - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierGroupElement.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierGroupElement/querierGroupElement.dsw b/examples/querierGroupElement/querierGroupElement.dsw
new file mode 100644
index 0000000..7fdcd89
--- /dev/null
+++ b/examples/querierGroupElement/querierGroupElement.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierGroupElement"=".\querierGroupElement.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierGroupElement/querierGroupElement.pro b/examples/querierGroupElement/querierGroupElement.pro
new file mode 100644
index 0000000..506fbee
--- /dev/null
+++ b/examples/querierGroupElement/querierGroupElement.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierGroupElement
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ querierGroupElement.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierGroupSpatialRest/.cdtproject b/examples/querierGroupSpatialRest/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierGroupSpatialRest/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierGroupSpatialRest/.project b/examples/querierGroupSpatialRest/.project
new file mode 100644
index 0000000..b84c70f
--- /dev/null
+++ b/examples/querierGroupSpatialRest/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>querierGroupSpatialRest</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/querierGroupSpatialRest/Makefile b/examples/querierGroupSpatialRest/Makefile
new file mode 100644
index 0000000..dc7e981
--- /dev/null
+++ b/examples/querierGroupSpatialRest/Makefile
@@ -0,0 +1,23 @@
+all: querierGroupSpatialRest
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+querierGroupSpatialRest: shapelib tiff terralib stat
+ qmake -o makeQuerierGroupSpatialRest querierGroupSpatialRest.pro; make -f makeQuerierGroupSpatialRest
+
+clean:
+ if \
+ test -f makeQuerierGroupSpatialRest; \
+ then \
+ make -f makeQuerierGroupSpatialRest distclean; rm -f makeQuerierGroupSpatialRest; \
+ fi
\ No newline at end of file
diff --git a/examples/querierGroupSpatialRest/querierGroupSpatialRest.cpp b/examples/querierGroupSpatialRest/querierGroupSpatialRest.cpp
new file mode 100644
index 0000000..be7988f
--- /dev/null
+++ b/examples/querierGroupSpatialRest/querierGroupSpatialRest.cpp
@@ -0,0 +1,163 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This example shows how to use a querier from theme, grouping all
+ spatiotemporal instances that satisfy a spatial restriction.
+
+ Author: Karine Reis
+*/
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int
+main()
+{
+
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "saudavel";
+ string user = "root";
+ string pass = "karine";
+
+ // Connects to database
+ TeDatabase* db_ = new TeMySQL();
+ if (!db_->connect(host,user,pass,dbname))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ return 1;
+ }
+
+ // Load the themes
+ TeTheme* coletas = new TeTheme("Coletas");
+ if (!db_->loadTheme(coletas))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ db_->close();
+ return 1;
+ }
+
+ TeTheme* bairros = new TeTheme("ibge_bairro");
+ if (!db_->loadTheme(bairros))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ db_->close();
+ return 1;
+ }
+
+ //Init querier strategies
+ TeInitQuerierStrategies();
+
+ //statistics from coletas
+ TeGroupingAttr attributes;
+
+ pair<TeAttributeRep, TeStatisticType> attr1(TeAttributeRep("Coletas.NRO_OVOS_PAL1"), TeSUM);
+ attributes.insert(attr1);
+
+ pair<TeAttributeRep, TeStatisticType> attr2(TeAttributeRep("Coletas.NRO_OVOS_PAL2"), TeSUM);
+ attributes.insert(attr2);
+
+ pair<TeAttributeRep, TeStatisticType> attr3(TeAttributeRep("Coletas.NRO_OVOS_PAL3"), TeSUM);
+ attributes.insert(attr3);
+
+ pair<TeAttributeRep, TeStatisticType> attr4(TeAttributeRep("Coletas.NRO_OVOS"), TeSUM);
+ attributes.insert(attr4);
+
+
+ // ------------ querier to theme "bairros"
+ bool loadGeometries = true;
+ vector<string> attrs;
+ attrs.push_back ("BAIRRO2000_REC.NOME");
+
+ TeQuerierParams querParamsBair(loadGeometries, attrs);
+ querParamsBair.setParams(bairros);
+
+ TeQuerier querBairros(querParamsBair);
+
+ if(!querBairros.loadInstances())
+ {
+ cout << " No data!!! " << endl;
+ return 1;
+ }
+
+ //Load each element and pass as spatial restriction
+ TeSTInstance bairro;
+ while(querBairros.fetchInstance (bairro))
+ {
+ string name;
+ bairro.getPropertyValue(name, 0);
+
+ cout << " Bairro: " << name << endl;
+
+ TePolygonSet setP;
+ if(!bairro.getGeometry (setP)) //get the polygon
+ continue;
+
+ // ------------ querier to theme coletas
+ loadGeometries = false;
+
+ TeQuerierParams querParamsCol(loadGeometries, attributes);
+ querParamsCol.setParams(coletas);
+
+ //spatial restriction
+ querParamsCol.setSpatialRest(&setP);
+
+ TeQuerier querColetas(querParamsCol);
+
+ if(!querColetas.loadInstances())
+ {
+ cout << " No data!!! " << endl;
+ continue;
+ }
+
+ TeSTInstance coleta;
+ while(querColetas.fetchInstance(coleta))
+ {
+ // Plot each attribute, its name and value
+ TePropertyVector vec = coleta.getPropertyVector();
+ for(unsigned int i=0; i<vec.size(); ++i)
+ {
+ string attrName = vec[i].attr_.rep_.name_;
+ string attrValue = vec[i].value_;
+
+ cout << attrName << " : " << attrValue << endl;
+ }
+ }
+ }
+
+ cout << " End " << endl;
+ getchar();
+ db_->close ();
+ return 0;
+}
+
+
+
+
diff --git a/examples/querierGroupSpatialRest/querierGroupSpatialRest.dsp b/examples/querierGroupSpatialRest/querierGroupSpatialRest.dsp
new file mode 100644
index 0000000..ce71950
--- /dev/null
+++ b/examples/querierGroupSpatialRest/querierGroupSpatialRest.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierGroupSpatialRest" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierGroupSpatialRest - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "querierGroupSpatialRest.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "querierGroupSpatialRest.mak" CFG="querierGroupSpatialRest - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "querierGroupSpatialRest - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierGroupSpatialRest - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "querierGroupSpatialRest - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "querierGroupSpatialRest - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "querierGroupSpatialRest - Win32 Release"
+# Name "querierGroupSpatialRest - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierGroupSpatialRest.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierGroupSpatialRest/querierGroupSpatialRest.dsw b/examples/querierGroupSpatialRest/querierGroupSpatialRest.dsw
new file mode 100644
index 0000000..6047b28
--- /dev/null
+++ b/examples/querierGroupSpatialRest/querierGroupSpatialRest.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierGroupSpatialRest"=".\querierGroupSpatialRest.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierGroupSpatialRest/querierGroupSpatialRest.pro b/examples/querierGroupSpatialRest/querierGroupSpatialRest.pro
new file mode 100644
index 0000000..751896f
--- /dev/null
+++ b/examples/querierGroupSpatialRest/querierGroupSpatialRest.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierGroupSpatialRest
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ querierGroupSpatialRest.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierWithSpatialRestBox/.cdtproject b/examples/querierWithSpatialRestBox/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierWithSpatialRestBox/.project b/examples/querierWithSpatialRestBox/.project
new file mode 100644
index 0000000..94f291d
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>querierWithSpatialRestBox</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/querierWithSpatialRestBox/Makefile b/examples/querierWithSpatialRestBox/Makefile
new file mode 100644
index 0000000..d8f0d73
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/Makefile
@@ -0,0 +1,23 @@
+all: querierWithSpatialRestBox
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+querierWithSpatialRestBox: shapelib tiff terralib stat
+ qmake -o makeQuerierWithSpatialRestBox querierWithSpatialRestBox.pro; make -f makeQuerierWithSpatialRestBox
+
+clean:
+ if \
+ test -f makeQuerierWithSpatialRestBox; \
+ then \
+ make -f makeQuerierWithSpatialRestBox distclean; rm -f makeQuerierWithSpatialRestBox; \
+ fi
\ No newline at end of file
diff --git a/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.cpp b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.cpp
new file mode 100644
index 0000000..57bac6d
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.cpp
@@ -0,0 +1,117 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This example shows how to use a querier from theme, using a spatial restriction
+ defined by a rectangle (TeBOX). This spatial restriction is associated to querier.
+
+ Author: Karine Reis
+*/
+
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int
+main()
+{
+
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "saudavel";
+ string user = "root";
+ string pass = "karine";
+
+ // Connects to database
+ TeDatabase* db_ = new TeMySQL();
+ if (!db_->connect(host,user,pass,dbname))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ return 1;
+ }
+
+ // Load the theme
+ TeTheme* armadilhas = new TeTheme("Armadilhas");
+ if (!db_->loadTheme(armadilhas))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ db_->close();
+ return 1;
+ }
+
+ //Init querier strategies
+ TeInitQuerierStrategies();
+
+ //All attributes and geometries
+ bool loadGeometries = false;
+ bool loadAllAttributes = true;
+
+ // Set querier parameters - load all attributes and geometries
+ TeQuerierParams querierParams(loadGeometries, loadAllAttributes);
+ querierParams.setParams(armadilhas);
+
+ //Set spatial restriction
+ TeBox box(291174.0, 9104633.0, 294304.0, 9107663.0);
+ querierParams.setSpatialRest(box, TeWITHIN);
+
+ TeQuerier querier(querierParams);
+
+ // Load instances from layer based in the querier parameters
+ querier.loadInstances();
+
+ // Traverse all the instances
+ TeSTInstance sti;
+ while(querier.fetchInstance(sti))
+ {
+ cout << " Object: " << sti.objectId() << " --------------------------- " << endl << endl;
+
+ // Plot each attribute, its name and value
+ TePropertyVector vec = sti.getPropertyVector();
+ for(unsigned int i=0; i<vec.size(); ++i)
+ {
+ string attrName = vec[i].attr_.rep_.name_;
+ string attrValue = vec[i].value_;
+
+ cout << attrName << " : " << attrValue << endl;
+
+ }
+
+ cout << endl << endl;
+ }
+
+ cout << " End " << endl;
+ getchar();
+ db_->close ();
+ delete(armadilhas);
+ return 0;
+}
+
+
+
+
diff --git a/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.dsp b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.dsp
new file mode 100644
index 0000000..bf96a85
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierWithSpatialRestBox" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierWithSpatialRestBox - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "querierWithSpatialRestBox.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "querierWithSpatialRestBox.mak" CFG="querierWithSpatialRestBox - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "querierWithSpatialRestBox - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierWithSpatialRestBox - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "querierWithSpatialRestBox - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "querierWithSpatialRestBox - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "querierWithSpatialRestBox - Win32 Release"
+# Name "querierWithSpatialRestBox - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierWithSpatialRestBox.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.dsw b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.dsw
new file mode 100644
index 0000000..c3aa45e
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierWithSpatialRestBox"=".\querierWithSpatialRestBox.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.pro b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.pro
new file mode 100644
index 0000000..8a9d1ed
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierWithSpatialRestBox
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ querierWithSpatialRestBox.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierWithSpatialRestGeometry/.cdtproject b/examples/querierWithSpatialRestGeometry/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierWithSpatialRestGeometry/.project b/examples/querierWithSpatialRestGeometry/.project
new file mode 100644
index 0000000..9380ec7
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>querierWithSpatialRestGeometry</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/querierWithSpatialRestGeometry/Makefile b/examples/querierWithSpatialRestGeometry/Makefile
new file mode 100644
index 0000000..3f334c2
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/Makefile
@@ -0,0 +1,23 @@
+all: querierWithSpatialRestGeometry
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+querierWithSpatialRestGeometry: shapelib tiff terralib stat
+ qmake -o makeQuerierWithSpatialRestGeometry querierWithSpatialRestGeometry.pro; make -f makeQuerierWithSpatialRestGeometry
+
+clean:
+ if \
+ test -f makeQuerierWithSpatialRestGeometry; \
+ then \
+ make -f makeQuerierWithSpatialRestGeometry distclean; rm -f makeQuerierWithSpatialRestGeometry; \
+ fi
\ No newline at end of file
diff --git a/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.cpp b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.cpp
new file mode 100644
index 0000000..17afae9
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.cpp
@@ -0,0 +1,152 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*
+ This example shows how to use a querier from theme, using a spatial restriction
+ defined by a geometry (polygons, lines, cells and points) from another theme.
+ This spatial restriction is associated to querier.
+
+ Author: Karine Reis
+*/
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int
+main()
+{
+
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "saudavel";
+ string user = "root";
+ string pass = "karine";
+
+ // Connects to database
+ TeDatabase* db_ = new TeMySQL();
+ if (!db_->connect(host,user,pass,dbname))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ return 1;
+ }
+
+ // Load the themes
+ TeTheme* coletas = new TeTheme("Coletas");
+ if (!db_->loadTheme(coletas))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ db_->close();
+ return 1;
+ }
+
+ TeTheme* bairros = new TeTheme("ibge_bairro");
+ if (!db_->loadTheme(bairros))
+ {
+ cout << "Error: " << db_->errorMessage() << endl;
+ db_->close();
+ return 1;
+ }
+
+ //Init querier strategies
+ TeInitQuerierStrategies();
+
+
+ // ------------ querier to theme "bairros"
+ bool loadGeometries = true;
+ vector<string> attrs;
+ attrs.push_back ("BAIRRO2000_REC.NOME");
+
+ TeQuerierParams querParamsBair(loadGeometries, attrs);
+ querParamsBair.setParams(bairros);
+
+ TeQuerier querBairros(querParamsBair);
+
+ if(!querBairros.loadInstances())
+ {
+ cout << " No data!!! " << endl;
+ return 1;
+ }
+
+ //Load each element and pass to querier as spatial restriction
+ TeSTInstance bairro;
+ while(querBairros.fetchInstance (bairro))
+ {
+ string name;
+ bairro.getPropertyValue(name, 0);
+
+ cout << " Bairro: " << name << endl;
+
+ TePolygonSet setP;
+
+ if(!bairro.getGeometry (setP)) //get the polygon set
+ continue;
+
+ // ------------ querier to theme coletas
+ loadGeometries = false;
+ vector<string> attributes;
+ attributes.push_back ("COLETAS.COD_ARMADILHA");
+
+ TeQuerierParams querParamsCol(loadGeometries, attributes);
+ querParamsCol.setParams(coletas);
+
+ //spatial restriction
+ querParamsCol.setSpatialRest(&setP);
+
+ TeQuerier querColetas(querParamsCol);
+
+ if(!querColetas.loadInstances())
+ {
+ cout << " No data!!! " << endl;
+ continue;
+ }
+
+ TeSTInstance coleta;
+ while(querColetas.fetchInstance(coleta))
+ {
+ // Plot each attribute, its name and value
+ TePropertyVector vec = coleta.getPropertyVector();
+ for(unsigned int i=0; i<vec.size(); ++i)
+ {
+ string attrName = vec[i].attr_.rep_.name_;
+ string attrValue = vec[i].value_;
+
+ cout << attrName << " : " << attrValue << endl;
+ }
+ }
+ }
+
+ cout << " End " << endl;
+ getchar();
+ db_->close ();
+ return 0;
+}
+
+
+
+
diff --git a/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.dsp b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.dsp
new file mode 100644
index 0000000..a9f4f3a
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierWithSpatialRestGeometry" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierWithSpatialRestGeometry - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "querierWithSpatialRestGeometry.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "querierWithSpatialRestGeometry.mak" CFG="querierWithSpatialRestGeometry - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "querierWithSpatialRestGeometry - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierWithSpatialRestGeometry - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "querierWithSpatialRestGeometry - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "querierWithSpatialRestGeometry - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "querierWithSpatialRestGeometry - Win32 Release"
+# Name "querierWithSpatialRestGeometry - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierWithSpatialRestGeometry.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.dsw b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.dsw
new file mode 100644
index 0000000..e5d3234
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierWithSpatialRestGeometry"=".\querierWithSpatialRestGeometry.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.pro b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.pro
new file mode 100644
index 0000000..ff5fa95
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierWithSpatialRestGeometry
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ querierWithSpatialRestGeometry.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/rasterSlicing/.cdtproject b/examples/rasterSlicing/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/rasterSlicing/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/rasterSlicing/.project b/examples/rasterSlicing/.project
new file mode 100644
index 0000000..8961c75
--- /dev/null
+++ b/examples/rasterSlicing/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>rasterSlicing</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/rasterSlicing/Makefile b/examples/rasterSlicing/Makefile
new file mode 100644
index 0000000..7904703
--- /dev/null
+++ b/examples/rasterSlicing/Makefile
@@ -0,0 +1,23 @@
+all: rasterSlicing
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+rasterSlicing: shapelib tiff terralib stat
+ qmake -o makeRasterSlicing rasterSlicing.pro; make -f makeRasterSlicing
+
+clean:
+ if \
+ test -f makeRasterSlicing; \
+ then \
+ make -f makeRasterSlicing distclean; rm -f makeRasterSlicing; \
+ fi
\ No newline at end of file
diff --git a/examples/rasterSlicing/rasterSlicing.cpp b/examples/rasterSlicing/rasterSlicing.cpp
new file mode 100644
index 0000000..83020f8
--- /dev/null
+++ b/examples/rasterSlicing/rasterSlicing.cpp
@@ -0,0 +1,204 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows an example of how to create a legend over a raster data,
+ stored in a layer TerraLib.
+
+ Author: Lubia Vinhas
+*/
+
+#include "TeRaster.h"
+#include "TeInitRasterDecoders.h"
+#include "TeMySQL.h"
+
+int main()
+{
+ TeInitRasterDecoders();
+
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl << endl;
+ cout << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+
+ // Retrieve a layer with a raster representation
+ TeLayer* layer = new TeLayer("Elevation",db);
+ if (layer->id() < 1)
+ {
+ cout << "Cannot access layer Elevation " << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Create a new view with the same projection as the layer
+ TeView* view = new TeView("ViewElevation", user);
+ view->projection(layer->projection());
+ if (!db->insertView(view))
+ {
+ cout << "Couldn�t insert view into the database: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Create a new theme and a legend over it
+ TeTheme* rstTheme = new TeTheme("Elevation", layer);
+
+ rstTheme->visibleRep(TeRASTER | 0x40000000); // make visible: the raster representation
+ // and the legend (0x4000000)
+ view->add(rstTheme); // add theme to the view
+ if (!rstTheme->save()) // save theme definition to the database
+ {
+ cout << "Error saving theme: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Define red, green and blue components to build a 10 color pallete
+ short red[10] = { 0, 45, 99, 160, 230, 232, 235, 237, 240, 242 };
+ short green[10] = { 166, 182, 198, 214, 230, 195, 178, 180, 201, 242 };
+ short blue[10] = { 0, 0, 0, 0, 0, 46, 94, 142, 192, 242 };
+
+ // Define a slicing mode: 10 slices
+ TeGrouping* group1 = new TeGrouping();
+ group1->groupMode_ = TeRasterSlicing;
+ group1->groupNumSlices_ = 10;
+ group1->groupPrecision_ = 8;
+
+
+ // Default way of slicing a raster representation: slices of equal size
+ if (!rstTheme->buildGrouping(group1))
+ {
+ cout << "Error grouping theme: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Assign to each slice one color of the pallete
+ int ng;
+ for (ng=0; ng<rstTheme->grouping()->groupNumSlices_; ng++)
+ {
+ TeColor color(red[ng],green[ng],blue[ng]);
+ TeVisual visual(TePOLYGONS);
+ visual.color(color);
+ visual.transparency(rstTheme->defaultLegend().visual(TePOLYGONS).transparency());
+ visual.contourStyle(rstTheme->defaultLegend().visual(TePOLYGONS).contourStyle());
+ visual.contourWidth(rstTheme->defaultLegend().visual(TePOLYGONS).contourWidth());
+ visual.contourColor(rstTheme->defaultLegend().visual(TePOLYGONS).contourColor());
+ rstTheme->setGroupingVisual(ng+1,visual,TePOLYGONS);
+ }
+
+ // Saves the theme legend to the database
+ if (!rstTheme->saveGrouping())
+ {
+ cout << "Error saving theme slicing: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Created first theme...\n";
+ delete rstTheme;
+
+ // Generates a new theme with slices arbitrarily defined
+
+ rstTheme = new TeTheme("Elevation4Slices", layer);
+ rstTheme->visibleRep(TeRASTER | 0x40000000); // make visible: the raster representation
+ // and the legend (0x4000000)
+ view->add(rstTheme); // add theme to the view
+ if (!rstTheme->save()) // save theme definition to the database
+ {
+ cout << "Error saving theme: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ vector<TeSlice> mySlices;
+ TeSlice sl1("980","1000");
+ mySlices.push_back(sl1);
+ TeSlice sl2("1000","1020");
+ mySlices.push_back(sl2);
+ TeSlice sl3("1020","1100");
+ mySlices.push_back(sl3);
+ TeSlice sl4("1100","1200");
+ mySlices.push_back(sl4);
+
+ TeGrouping* group2 = new TeGrouping();
+ group2->groupMode_ = TeRasterSlicing;
+ group2->groupNumSlices_ = 4;
+ group2->groupPrecision_ = 8;
+
+ if (!rstTheme->buildGrouping(group2,mySlices))
+ {
+ cout << "Error grouping theme: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ for (ng=0; ng<rstTheme->grouping()->groupNumSlices_; ng++)
+ {
+ TeColor color(red[ng*2],green[ng*2],blue[ng*2]);
+ TeVisual visual(TePOLYGONS);
+ visual.color(color);
+ visual.transparency(rstTheme->defaultLegend().visual(TePOLYGONS).transparency());
+ visual.contourStyle(rstTheme->defaultLegend().visual(TePOLYGONS).contourStyle());
+ visual.contourWidth(rstTheme->defaultLegend().visual(TePOLYGONS).contourWidth());
+ visual.contourColor(rstTheme->defaultLegend().visual(TePOLYGONS).contourColor());
+ rstTheme->setGroupingVisual(ng+1,visual,TePOLYGONS);
+ }
+
+ if (!rstTheme->saveGrouping())
+ {
+ cout << "Error saving theme slicing: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ db->close();
+ cout << "Created second theme...\n";
+ cout << "Sucess. Press enter...\n";
+ getchar();
+ return 0;
+}
diff --git a/examples/rasterSlicing/rasterSlicing.dsp b/examples/rasterSlicing/rasterSlicing.dsp
new file mode 100644
index 0000000..e01f848
--- /dev/null
+++ b/examples/rasterSlicing/rasterSlicing.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="rasterSlicing" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=rasterSlicing - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "rasterSlicing.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "rasterSlicing.mak" CFG="rasterSlicing - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "rasterSlicing - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "rasterSlicing - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "rasterSlicing - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "rasterSlicing - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "rasterSlicing - Win32 Release"
+# Name "rasterSlicing - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\rasterSlicing.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/rasterSlicing/rasterSlicing.dsw b/examples/rasterSlicing/rasterSlicing.dsw
new file mode 100644
index 0000000..47b4320
--- /dev/null
+++ b/examples/rasterSlicing/rasterSlicing.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "rasterSlicing"=.\rasterSlicing.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/rasterSlicing/rasterSlicing.pro b/examples/rasterSlicing/rasterSlicing.pro
new file mode 100644
index 0000000..c099927
--- /dev/null
+++ b/examples/rasterSlicing/rasterSlicing.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = rasterSlicing
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ rasterSlicing.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/spatialQuery/.cdtproject b/examples/spatialQuery/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/spatialQuery/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/spatialQuery/.project b/examples/spatialQuery/.project
new file mode 100644
index 0000000..39aa224
--- /dev/null
+++ b/examples/spatialQuery/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>spatialQuery</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/spatialQuery/Makefile b/examples/spatialQuery/Makefile
new file mode 100644
index 0000000..ef42ba2
--- /dev/null
+++ b/examples/spatialQuery/Makefile
@@ -0,0 +1,23 @@
+all: spatialQuery
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+spatialQuery: shapelib tiff terralib stat
+ qmake -o makeSpatialQuery spatialQuery.pro; make -f makeSpatialQuery
+
+clean:
+ if \
+ test -f makeSpatialQuery; \
+ then \
+ make -f makeSpatialQuery distclean; rm -f makeSpatialQuery; \
+ fi
\ No newline at end of file
diff --git a/examples/spatialQuery/spatialQuery.cpp b/examples/spatialQuery/spatialQuery.cpp
new file mode 100644
index 0000000..2ee275b
--- /dev/null
+++ b/examples/spatialQuery/spatialQuery.cpp
@@ -0,0 +1,185 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows an example of how to use the database interface to do some
+ spatial queries involving objects with points, lines and polygon geometries.
+
+ Authors:
+ Karine Reis Ferreira
+ Lubia Vinhas
+*/
+
+#include <TeMySQL.h>
+#include <TeImportExport.h>
+
+
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Open a connection to the TerraTeste MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+ // Check whether there is a layer of polygons called "states".
+ // In negative case, import it from the states.shp file
+ string layerName = "states";
+
+ TeDatum wgs84 = TeDatumFactory::make("WGS84");
+ TeLatLong* proj = new TeLatLong(wgs84);
+
+ if (db->layerExist(layerName) == false)
+ {
+ // Create a new layer in the database
+ TeLayer* layer = new TeLayer(layerName, db, proj);
+ string filename = "../data/states.shp"; // Shapefile path
+ string tablename = "States"; // Name of the attribute table
+
+ if (TeImportShape(layer, filename, tablename))
+ cout << "The shapefile \"states.shp\" was imported successfully into the TerraLib database!\n" << endl;
+ else
+ cout << "Error: Fail to import the shapefile \"rivers.shp\"!\n" << endl;
+ }
+
+ // Check whether there is a layer of lines called "rivers".
+ // In negative case, import it from the states.shp file
+ layerName = "rivers";
+
+ if (db->layerExist(layerName) == false)
+ {
+ // Create a new layer in the database
+ TeLayer* layer = new TeLayer(layerName, db, proj);
+ string filename = "../data/rivers.shp"; // Shapefile path
+ string tablename = "Rivers"; // Name of the attribute table
+
+ if (TeImportShape(layer, filename, tablename))
+ cout << "The shapefile \"rivers.shp\" was imported successfully into the TerraLib database!\n" << endl;
+ else
+ cout << "Error: Fail to import the shapefile \"rivers.shp\"!\n" << endl;
+ }
+
+ // Check whether there is a layer of points called "cities".
+ // In negative case, import it from the states.shp file
+ layerName = "cities";
+
+ if (db->layerExist(layerName) == false)
+ {
+ // Create a new layer in the database
+ TeLayer* layer = new TeLayer(layerName, db, proj);
+ string filename = "../data/cities.shp"; // Shapefile path
+ string tablename = "Cities"; // Name of the attribute table
+
+ if (TeImportShape(layer, filename, tablename))
+ cout << "The shapefile \"cities.shp\" was imported successfully into the TerraLib database!\n" << endl;
+ else
+ cout << "Error: Fail to import the shapefile \"cities.shp\"!\n" << endl;
+ }
+
+ // Retrieve from the database a layer of polygons, a layer of lines and a layer of points
+ TeLayer* states = new TeLayer("states"); // states have polygons
+ if (!db->loadLayer(states))
+ {
+ cout << "Fail to load layer \"states\": " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ TeLayer* rivers = new TeLayer("rivers"); // rivers have lines
+ if (!db->loadLayer(rivers))
+ {
+ cout << "Fail to load layer \"rivers\": " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ TeLayer* cities = new TeLayer("cities"); // cities have points
+ if (!db->loadLayer(cities))
+ {
+ cout << "Fail to load layer \"cities\": " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ vector<string> objsOut; // holds the identification of the resulting objects
+
+ vector<string> objsIn; // objects to be queried
+ objsIn.push_back("23");
+
+ // Retrieve the states that touches state 23
+ bool res = db->spatialRelation(states->tableName(TePOLYGONS), TePOLYGONS, objsIn,
+ objsOut, TeTOUCHES);
+ if (res)
+ {
+ cout << "States that touch state \"23\": \n";
+ unsigned int i;
+ for (i=0; i<objsOut.size(); i++)
+ cout << "State: " << objsOut[i] << endl;
+
+ }
+
+ // Retrieve the rivers that crosses state 23
+ res = db->spatialRelation(states->tableName(TePOLYGONS), TePOLYGONS, objsIn,
+ rivers->tableName(TeLINES), TeLINES, objsOut, TeCROSSES);
+ if (res)
+ {
+ cout << "\nRivers that cross state \"23\": \n";
+ unsigned int i;
+ for (i=0; i<objsOut.size(); i++)
+ cout << "River: " << objsOut[i] << endl;
+ }
+
+ // Retrieve the cities that are within state 23
+ res = db->spatialRelation(states->tableName(TePOLYGONS), TePOLYGONS, objsIn,
+ cities->tableName(TePOINTS), TePOINTS, objsOut, TeWITHIN);
+ if (res)
+ {
+ cout << "\nCities that are within state \"23\": \n";
+ unsigned int i;
+ for (i=0; i<objsOut.size(); i++)
+ cout << "City: " << objsOut[i] << endl;
+
+ }
+
+ db->close();
+ cout << endl << "Press Enter\n";
+ cout.flush();
+ getchar();
+ return 0;
+}
+
diff --git a/examples/spatialQuery/spatialQuery.dsp b/examples/spatialQuery/spatialQuery.dsp
new file mode 100644
index 0000000..7d0b65a
--- /dev/null
+++ b/examples/spatialQuery/spatialQuery.dsp
@@ -0,0 +1,126 @@
+# Microsoft Developer Studio Project File - Name="spatialQuery" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=spatialQuery - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "spatialQuery.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "spatialQuery.mak" CFG="spatialQuery - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "spatialQuery - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "spatialQuery - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "spatialQuery - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "spatialQuery - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "spatialQuery - Win32 Release"
+# Name "spatialQuery - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\spatialQuery.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportSHP.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/spatialQuery/spatialQuery.dsw b/examples/spatialQuery/spatialQuery.dsw
new file mode 100644
index 0000000..a8c7731
--- /dev/null
+++ b/examples/spatialQuery/spatialQuery.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "spatialQuery"=".\spatialQuery.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/spatialQuery/spatialQuery.pro b/examples/spatialQuery/spatialQuery.pro
new file mode 100644
index 0000000..b99ec1c
--- /dev/null
+++ b/examples/spatialQuery/spatialQuery.pro
@@ -0,0 +1,50 @@
+TEMPLATE = app
+TARGET = spatialQuery
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ spatialQuery.cpp \
+ ../src/terralib/functions/TeImportDBF.cpp \
+ ../src/terralib/functions/TeImportSHP.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/functions/TeImportExport.h \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/spatialQueryAndBuffer/.cdtproject b/examples/spatialQueryAndBuffer/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/spatialQueryAndBuffer/.project b/examples/spatialQueryAndBuffer/.project
new file mode 100644
index 0000000..3714cb2
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>spatialQueryAndBuffer</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/spatialQueryAndBuffer/Makefile b/examples/spatialQueryAndBuffer/Makefile
new file mode 100644
index 0000000..994aff0
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/Makefile
@@ -0,0 +1,23 @@
+all: spatialQueryAndBuffer
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+spatialQueryAndBuffer: shapelib tiff terralib stat
+ qmake -o makeSpatialQueryAndBuffer spatialQueryAndBuffer.pro; make -f makeSpatialQueryAndBuffer
+
+clean:
+ if \
+ test -f makeSpatialQueryAndBuffer; \
+ then \
+ make -f makeSpatialQueryAndBuffer distclean; rm -f makeSpatialQueryAndBuffer; \
+ fi
\ No newline at end of file
diff --git a/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.cpp b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.cpp
new file mode 100644
index 0000000..af0cdd4
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.cpp
@@ -0,0 +1,114 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file shows an example of how to use the database interface to do some
+ spatial queries involving objects with points, lines and polygon geometries.
+
+ Esse exemplo requer que os arquivos BairrosPoa.shp e OcorrenciasPoA.shp tenham
+ sido importados. Usar o TerraView para importa-los.
+ Ambos os shapefiles est�o em proje��o UTM - Zona 22 , Datum SAD69
+
+ Author: Karine Reis
+*/
+
+#include <TeMySQL.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste303";
+ string user = "root";
+ string password = "";
+
+ // Open a connection to the TerraTeste MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+
+ // Retrieve from the database the layer "BairrosPoA"
+ TeLayer* bairros = new TeLayer("BairrosPoA");
+ if (!db->loadLayer(bairros))
+ {
+ cout << "Fail to load layer \"bairros\": " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Retrieve from the database the layer "OcorrenciasPoA"
+ TeLayer* events = new TeLayer("OcorrenciasPoA");
+ if (!db->loadLayer(events))
+ {
+ cout << "Fail to load layer \"events\": " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ TePrecision::instance().setPrecision(TeGetPrecision(bairros->projection()));
+
+ // holds the identification of the resulting objects
+ vector<string> objsOut;
+ vector<string> objsIn; // objects to be queried
+ objsIn.push_back("60");
+
+ // Generate a buffer (polygon) around 500 meters distance from the element "60"
+ TePolygonSet bufferPol;
+ if (!db->Buffer(bairros->tableName(TePOLYGONS), TePOLYGONS,
+ objsIn, bufferPol, 500))
+ {
+ cout << "Fail to generate buffer!" << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Retrieve the events that are within buffer
+ if(!db->spatialRelation(events->tableName(TePOINTS), TePOINTS, &bufferPol, objsOut, TeWITHIN))
+ {
+ cout << "Fail to retrieve events!" << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ //Shows the result
+ cout << " Retrieved events:" << endl << endl;
+ for(unsigned int i=0; i<objsOut.size(); i++)
+ cout << " " << objsOut[i] << endl;
+
+
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 0;
+};
diff --git a/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.dsp b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.dsp
new file mode 100644
index 0000000..94f4f9b
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.dsp
@@ -0,0 +1,126 @@
+# Microsoft Developer Studio Project File - Name="spatialQueryAndBuffer" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=spatialQueryAndBuffer - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "spatialQueryAndBuffer.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "spatialQueryAndBuffer.mak" CFG="spatialQueryAndBuffer - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "spatialQueryAndBuffer - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "spatialQueryAndBuffer - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "spatialQueryAndBuffer - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "spatialQueryAndBuffer - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "spatialQueryAndBuffer - Win32 Release"
+# Name "spatialQueryAndBuffer - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\spatialQueryAndBuffer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportSHP.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.dsw b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.dsw
new file mode 100644
index 0000000..730b568
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "spatialQueryAndBuffer"=".\spatialQueryAndBuffer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.pro b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.pro
new file mode 100644
index 0000000..e0c631c
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.pro
@@ -0,0 +1,50 @@
+TEMPLATE = app
+TARGET = spatialQueryAndBuffer
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ spatialQueryAndBuffer.cpp \
+ ../src/terralib/functions/TeImportDBF.cpp \
+ ../src/terralib/functions/TeImportSHP.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/functions/TeImportExport.h \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/themeGrouping/.cdtproject b/examples/themeGrouping/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/themeGrouping/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/themeGrouping/.project b/examples/themeGrouping/.project
new file mode 100644
index 0000000..36ddddb
--- /dev/null
+++ b/examples/themeGrouping/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>themeGrouping</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>clean all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>false</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+ <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/themeGrouping/Makefile b/examples/themeGrouping/Makefile
new file mode 100644
index 0000000..3f33e69
--- /dev/null
+++ b/examples/themeGrouping/Makefile
@@ -0,0 +1,23 @@
+all: themeGrouping
+
+shapelib:
+ cd ../terralibx/shapelib; make
+
+tiff:
+ cd ../terralibx/tiff; make
+
+terralib:
+ cd ../terralibx/terralib; make
+
+stat:
+ cd ../terralibx/stat; make
+
+themeGrouping: shapelib tiff terralib stat
+ qmake -o makeThemeGrouping themeGrouping.pro; make -f makeThemeGrouping
+
+clean:
+ if \
+ test -f makeThemeGrouping; \
+ then \
+ make -f makeThemeGrouping distclean; rm -f makeThemeGrouping; \
+ fi
\ No newline at end of file
diff --git a/examples/themeGrouping/themeGrouping.cpp b/examples/themeGrouping/themeGrouping.cpp
new file mode 100644
index 0000000..2af6400
--- /dev/null
+++ b/examples/themeGrouping/themeGrouping.cpp
@@ -0,0 +1,113 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ This file illustrates how to group objects of a theme. Each group of objects
+ is associated to a legend.
+
+ Authors: Karine Reis Ferreira and Lubia Vinhas
+*/
+
+#include <TeLegendEntry.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ // Datatabase server parameters
+ string host = "localhost";
+ string dbname = "TerraTeste";
+ string user = "root";
+ string password = "";
+
+ // Open a connection to the TerraTeste MySQL database
+ TeDatabase* db = new TeMySQL();
+ if (!db->connect(host, user, password, dbname))
+ {
+ cout << "Error: " << db->errorMessage() << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+ // Load a previously created theme named T_dist.
+ // This theme was created on a layer of the metropolitan districts of Sao Paulo city
+ TeTheme* trmsp = new TeTheme("T_dist");
+ if (!db->loadTheme(trmsp))
+ {
+ cout << "Fail to load the theme \"T_dist\": " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+ trmsp->resetGrouping(); // clear any grouping previously created
+
+ TeAttributeRep rep; // grouping will be based on the attribute named "area_km2"
+ rep.name_ = " area_km2 "; // that contains the area of each metropolitan district
+ rep.type_ = TeREAL;
+
+ TeGrouping equalstep3; // define a particular way of grouping objects
+ equalstep3.groupAttribute_ = rep;
+ equalstep3.groupMode_ = TeEqualSteps; // equal steps in 3 groups
+ equalstep3.groupNumSlices_ = 3;
+ if (!trmsp->buildGrouping(&equalstep3)) // generate groups based on the grouping definition
+ {
+ cout << "Fail to generate the groups: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ // Associate a different visual to each group
+
+ TeVisual visual(TePOLYGONS); // group 1: dark green
+ TeColor color(0,200,0);
+ visual.color(color);
+ trmsp->setGroupingVisual(1,visual,TePOLYGONS);
+
+ color.init(0,150,0);
+ visual.color(color); // group 2: medium green
+ trmsp->setGroupingVisual(2,visual,TePOLYGONS);
+
+ color.init(0,100,0);
+ visual.color(color); // group 3: light red
+ trmsp->setGroupingVisual(3,visual,TePOLYGONS);
+
+ if (!trmsp->saveGrouping()) // save grouping definition
+ {
+ cout << "Fail to save the grouping: " << db->errorMessage() << endl;
+ db->close();
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 1;
+ }
+
+ db->close();
+ cout << "Theme was successfully grouped! " << endl;
+ cout << endl << "Press Enter\n";
+ getchar();
+ return 0;
+}
+
diff --git a/examples/themeGrouping/themeGrouping.dsp b/examples/themeGrouping/themeGrouping.dsp
new file mode 100644
index 0000000..d4d17fc
--- /dev/null
+++ b/examples/themeGrouping/themeGrouping.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="themeGrouping" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=themeGrouping - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "themeGrouping.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "themeGrouping.mak" CFG="themeGrouping - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "themeGrouping - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "themeGrouping - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "themeGrouping - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\PostgreSQL\libpqdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\ [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "themeGrouping - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\PostgreSQL\libpq.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMy [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "themeGrouping - Win32 Release"
+# Name "themeGrouping - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\themeGrouping.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/themeGrouping/themeGrouping.dsw b/examples/themeGrouping/themeGrouping.dsw
new file mode 100644
index 0000000..a643b69
--- /dev/null
+++ b/examples/themeGrouping/themeGrouping.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "themeGrouping"=".\themeGrouping.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name terralib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shapelib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tiff
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/themeGrouping/themeGrouping.pro b/examples/themeGrouping/themeGrouping.pro
new file mode 100644
index 0000000..0ce8715
--- /dev/null
+++ b/examples/themeGrouping/themeGrouping.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = themeGrouping
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ themeGrouping.cpp \
+ ../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS += \
+ ../src/terralib/drivers/MySQL/TeMySQL.h
+
+INCLUDEPATH += \
+ . \
+ .. \
+ ../src/terralib/kernel \
+ ../src/terralib/application \
+ ../src/terralib/functions \
+ ../src/terralib/stat \
+ ../src/shapelib \
+ ../src/zlib \
+ ../src/terralib/application/qt \
+ ../src/terralib/drivers/MySQL \
+ ../src/terralib/drivers/MySQL/include \
+ ../src/terralib/drivers/OracleSpatial \
+ ../src/terralib/drivers/OracleSpatial/OCI/include \
+ ../src/terralib/drivers/PostgreSQL \
+ ../src/terralib/drivers/PostgreSQL/includepg
+
+LIBS += \
+ -L../terralibx/shapelib \
+ -L../terralibx/stat \
+ -L../terralibx/terralib \
+ -L../terralibx/tiff \
+ -L../terralibx/PostgreSQL \
+ -L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+ -L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+ -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/src/STLport/BC50/README b/src/STLport/BC50/README
new file mode 100644
index 0000000..a132ff1
--- /dev/null
+++ b/src/STLport/BC50/README
@@ -0,0 +1,8 @@
+
+This directory should be included in search path when compiling
+with Borland C++ 5.0x compiler (maybe later ones, too).
+
+It provides wrappers that force inclusion of STLport files without extensions.
+If you want to preserve old-style HP semantics, include ../old_hp BEFORE this directory
+to include HP-style STL headers (with "using" directives). If namespaces are disabled,
+this one should be enough.
diff --git a/src/STLport/BC50/algorith.h b/src/STLport/BC50/algorith.h
new file mode 100644
index 0000000..0644036
--- /dev/null
+++ b/src/STLport/BC50/algorith.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_algorithm_H
+# define __STLPORT_BC_algorithm_H
+
+# include <..\algorithm.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/alloc.h b/src/STLport/BC50/alloc.h
new file mode 100644
index 0000000..f25a7c6
--- /dev/null
+++ b/src/STLport/BC50/alloc.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_memory_H
+# define __STLPORT_BC_memory_H
+
+# include <..\memory.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/bak/stddef.h b/src/STLport/BC50/bak/stddef.h
new file mode 100644
index 0000000..c50fc97
--- /dev/null
+++ b/src/STLport/BC50/bak/stddef.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_cstddef_H
+# define __STLPORT_BC_cstddef_H
+
+# include <..\cstddef.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/bak/stdlib.h b/src/STLport/BC50/bak/stdlib.h
new file mode 100644
index 0000000..ad90a34
--- /dev/null
+++ b/src/STLport/BC50/bak/stdlib.h
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+# include <..\stdlib.h>
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/bitset.h b/src/STLport/BC50/bitset.h
new file mode 100644
index 0000000..b516504
--- /dev/null
+++ b/src/STLport/BC50/bitset.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_bitset_H
+# define __STLPORT_BC_bitset_H
+
+# include <..\bitset.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cassert.h b/src/STLport/BC50/cassert.h
new file mode 100644
index 0000000..3f883e2
--- /dev/null
+++ b/src/STLport/BC50/cassert.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_cassert_H
+# define __STLPORT_BC_cassert_H
+
+# include <..\cassert.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cctype.h b/src/STLport/BC50/cctype.h
new file mode 100644
index 0000000..42279ad
--- /dev/null
+++ b/src/STLport/BC50/cctype.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_cctype_H
+# define __STLPORT_BC_cctype_H
+
+# include <..\cctype.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cerrno.h b/src/STLport/BC50/cerrno.h
new file mode 100644
index 0000000..4c0d5db
--- /dev/null
+++ b/src/STLport/BC50/cerrno.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_cerrno_H
+# define __STLPORT_BC_cerrno_H
+
+# include <..\cerrno.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cfloat.h b/src/STLport/BC50/cfloat.h
new file mode 100644
index 0000000..c1ee3f3
--- /dev/null
+++ b/src/STLport/BC50/cfloat.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_cfloat_H
+# define __STLPORT_BC_cfloat_H
+
+# include <..\cfloat.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/climits.h b/src/STLport/BC50/climits.h
new file mode 100644
index 0000000..28068c7
--- /dev/null
+++ b/src/STLport/BC50/climits.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_climits_H
+# define __STLPORT_BC_climits_H
+
+# include <..\climits.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/clocale.h b/src/STLport/BC50/clocale.h
new file mode 100644
index 0000000..a05c53d
--- /dev/null
+++ b/src/STLport/BC50/clocale.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_clocale_H
+# define __STLPORT_BC_clocale_H
+
+# include <..\clocale.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cmath.h b/src/STLport/BC50/cmath.h
new file mode 100644
index 0000000..3bb3072
--- /dev/null
+++ b/src/STLport/BC50/cmath.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_cmath_H
+# define __STLPORT_BC_cmath_H
+
+# include <..\cmath.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/complex.h b/src/STLport/BC50/complex.h
new file mode 100644
index 0000000..5f5bd67
--- /dev/null
+++ b/src/STLport/BC50/complex.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_complex_H
+# define __STLPORT_BC_complex_H
+
+# include <..\complex.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/csetjmp.h b/src/STLport/BC50/csetjmp.h
new file mode 100644
index 0000000..3249254
--- /dev/null
+++ b/src/STLport/BC50/csetjmp.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_csetjmp_H
+# define __STLPORT_BC_csetjmp_H
+
+# include <..\csetjmp.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/csignal.h b/src/STLport/BC50/csignal.h
new file mode 100644
index 0000000..ae8d5fe
--- /dev/null
+++ b/src/STLport/BC50/csignal.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_csignal_H
+# define __STLPORT_BC_csignal_H
+
+# include <..\csignal.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cstdarg.h b/src/STLport/BC50/cstdarg.h
new file mode 100644
index 0000000..e5f566e
--- /dev/null
+++ b/src/STLport/BC50/cstdarg.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_cstdarg_H
+# define __STLPORT_BC_cstdarg_H
+
+# include <..\cstdarg.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cstddef.h b/src/STLport/BC50/cstddef.h
new file mode 100644
index 0000000..c50fc97
--- /dev/null
+++ b/src/STLport/BC50/cstddef.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_cstddef_H
+# define __STLPORT_BC_cstddef_H
+
+# include <..\cstddef.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cstdio.h b/src/STLport/BC50/cstdio.h
new file mode 100644
index 0000000..6aefb42
--- /dev/null
+++ b/src/STLport/BC50/cstdio.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_cstdio_H
+# define __STLPORT_BC_cstdio_H
+
+# include <..\cstdio.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cstdlib.h b/src/STLport/BC50/cstdlib.h
new file mode 100644
index 0000000..461eebb
--- /dev/null
+++ b/src/STLport/BC50/cstdlib.h
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+# include <..\cstdlib.>
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cstring.h b/src/STLport/BC50/cstring.h
new file mode 100644
index 0000000..f41dbd7
--- /dev/null
+++ b/src/STLport/BC50/cstring.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+#ifndef __STLPORT_BC_cstring_H
+# define __STLPORT_BC_cstring_H
+
+# include <..\cstring.>
+
+#endif
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/ctime.h b/src/STLport/BC50/ctime.h
new file mode 100644
index 0000000..01ad304
--- /dev/null
+++ b/src/STLport/BC50/ctime.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_ctime_H
+# define __STLPORT_BC_ctime_H
+
+# include <..\ctime.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cwchar.h b/src/STLport/BC50/cwchar.h
new file mode 100644
index 0000000..6d6a039
--- /dev/null
+++ b/src/STLport/BC50/cwchar.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_cwchar_H
+# define __STLPORT_BC_cwchar_H
+
+# include <..\cwchar.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cwctype.h b/src/STLport/BC50/cwctype.h
new file mode 100644
index 0000000..0fda315
--- /dev/null
+++ b/src/STLport/BC50/cwctype.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_cwctype_H
+# define __STLPORT_BC_cwctype_H
+
+# include <..\cwctype.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/deque.h b/src/STLport/BC50/deque.h
new file mode 100644
index 0000000..cd7166c
--- /dev/null
+++ b/src/STLport/BC50/deque.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_deque_H
+# define __STLPORT_BC_deque_H
+
+# include <..\deque.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/exceptio.h b/src/STLport/BC50/exceptio.h
new file mode 100644
index 0000000..78a6ae4
--- /dev/null
+++ b/src/STLport/BC50/exceptio.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_exceptio_H
+# define __STLPORT_BC_exceptio_H
+
+# include <..\exception.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/fstream.h b/src/STLport/BC50/fstream.h
new file mode 100644
index 0000000..511303f
--- /dev/null
+++ b/src/STLport/BC50/fstream.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_fstream_H
+# define __STLPORT_BC_fstream_H
+
+# include <..\fstream.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/function.h b/src/STLport/BC50/function.h
new file mode 100644
index 0000000..615ac45
--- /dev/null
+++ b/src/STLport/BC50/function.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_functional_H
+# define __STLPORT_BC_functional_H
+
+# include <..\functional.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/hash_map.h b/src/STLport/BC50/hash_map.h
new file mode 100644
index 0000000..9b307cf
--- /dev/null
+++ b/src/STLport/BC50/hash_map.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_hash_map_H
+# define __STLPORT_BC_hash_map_H
+
+# include <..\hash_map.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/hash_set.h b/src/STLport/BC50/hash_set.h
new file mode 100644
index 0000000..7b49c28
--- /dev/null
+++ b/src/STLport/BC50/hash_set.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_hash_set_H
+# define __STLPORT_BC_hash_set_H
+
+# include <..\hash_set.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/iomanip.h b/src/STLport/BC50/iomanip.h
new file mode 100644
index 0000000..4120153
--- /dev/null
+++ b/src/STLport/BC50/iomanip.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_iomanip_H
+# define __STLPORT_BC_iomanip_H
+
+# include <..\iomanip.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/ios.h b/src/STLport/BC50/ios.h
new file mode 100644
index 0000000..0f1d41c
--- /dev/null
+++ b/src/STLport/BC50/ios.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_ios_H
+# define __STLPORT_BC_ios_H
+
+# include <..\ios.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/iosfwd.h b/src/STLport/BC50/iosfwd.h
new file mode 100644
index 0000000..5570c04
--- /dev/null
+++ b/src/STLport/BC50/iosfwd.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_iosfwd_H
+# define __STLPORT_BC_iosfwd_H
+
+# include <..\iosfwd.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/iostream.h b/src/STLport/BC50/iostream.h
new file mode 100644
index 0000000..326258e
--- /dev/null
+++ b/src/STLport/BC50/iostream.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_iostream_H
+# define __STLPORT_BC_iostream_H
+
+# include <..\iostream.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/istream.h b/src/STLport/BC50/istream.h
new file mode 100644
index 0000000..d0ff092
--- /dev/null
+++ b/src/STLport/BC50/istream.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_istream_H
+# define __STLPORT_BC_istream_H
+
+# include <..\istream.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/iterator.h b/src/STLport/BC50/iterator.h
new file mode 100644
index 0000000..be12a82
--- /dev/null
+++ b/src/STLport/BC50/iterator.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_iterator_H
+# define __STLPORT_BC_iterator_H
+
+# include <..\iterator.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/limits.h b/src/STLport/BC50/limits.h
new file mode 100644
index 0000000..6d92905
--- /dev/null
+++ b/src/STLport/BC50/limits.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+// include BC native <limits.h>
+
+#include <..\climits.>
+
+#ifndef __IN_STLPORT_CLIMITS
+# include <..\limits.>
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/list.h b/src/STLport/BC50/list.h
new file mode 100644
index 0000000..91b3bdb
--- /dev/null
+++ b/src/STLport/BC50/list.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_list_H
+# define __STLPORT_BC_list_H
+
+# include <..\list.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/locale.h b/src/STLport/BC50/locale.h
new file mode 100644
index 0000000..ae44bad
--- /dev/null
+++ b/src/STLport/BC50/locale.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+# include <..\clocale.>
+
+# ifndef __IN_STLPORT_CLOCALE
+# include <..\locale.>
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/make_bc50.sh b/src/STLport/BC50/make_bc50.sh
new file mode 100644
index 0000000..959c5b7
--- /dev/null
+++ b/src/STLport/BC50/make_bc50.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+for file in `cat ../export_names`
+do
+rm -fr $file.h
+cat stl_tmpl.h | sed -e "s/REPLACEME/$file/g" > $file.h
+done
+
+mv algorithm.h algorith.h
+mv functional.h function.h
+mv stdexcept.h stdexcep.h
+mv streambuf.h streambu.h
+mv strstream.h strstrea.h
diff --git a/src/STLport/BC50/map.h b/src/STLport/BC50/map.h
new file mode 100644
index 0000000..28650f6
--- /dev/null
+++ b/src/STLport/BC50/map.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_map_H
+# define __STLPORT_BC_map_H
+
+# include <..\map.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/memory.h b/src/STLport/BC50/memory.h
new file mode 100644
index 0000000..9b97663
--- /dev/null
+++ b/src/STLport/BC50/memory.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_memory_H
+# define __STLPORT_BC_memory_H
+
+# include <..\include\memory.h>
+
+# include <..\memory.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/numeric.h b/src/STLport/BC50/numeric.h
new file mode 100644
index 0000000..e5e7ed1
--- /dev/null
+++ b/src/STLport/BC50/numeric.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_numeric_H
+# define __STLPORT_BC_numeric_H
+
+# include <..\numeric.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/ostream.h b/src/STLport/BC50/ostream.h
new file mode 100644
index 0000000..8ee2157
--- /dev/null
+++ b/src/STLport/BC50/ostream.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_ostream_H
+# define __STLPORT_BC_ostream_H
+
+# include <..\ostream.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/pthread_alloc.h b/src/STLport/BC50/pthread_alloc.h
new file mode 100644
index 0000000..07fb6ab
--- /dev/null
+++ b/src/STLport/BC50/pthread_alloc.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_pthread_alloc_H
+# define __STLPORT_BC_pthread_alloc_H
+
+# include <..\pthread_alloc.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/queue.h b/src/STLport/BC50/queue.h
new file mode 100644
index 0000000..dde1a75
--- /dev/null
+++ b/src/STLport/BC50/queue.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_queue_H
+# define __STLPORT_BC_queue_H
+
+# include <..\queue.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/rope.h b/src/STLport/BC50/rope.h
new file mode 100644
index 0000000..db2ab6d
--- /dev/null
+++ b/src/STLport/BC50/rope.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_rope_H
+# define __STLPORT_BC_rope_H
+
+# include <..\rope.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/set.h b/src/STLport/BC50/set.h
new file mode 100644
index 0000000..2172ae7
--- /dev/null
+++ b/src/STLport/BC50/set.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_set_H
+# define __STLPORT_BC_set_H
+
+# include <..\set.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/slist.h b/src/STLport/BC50/slist.h
new file mode 100644
index 0000000..fe3babf
--- /dev/null
+++ b/src/STLport/BC50/slist.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_slist_H
+# define __STLPORT_BC_slist_H
+
+# include <..\slist.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/sstream.h b/src/STLport/BC50/sstream.h
new file mode 100644
index 0000000..b4a4561
--- /dev/null
+++ b/src/STLport/BC50/sstream.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_sstream_H
+# define __STLPORT_BC_sstream_H
+
+# include <..\sstream.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/stack.h b/src/STLport/BC50/stack.h
new file mode 100644
index 0000000..fdfba64
--- /dev/null
+++ b/src/STLport/BC50/stack.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_stack_H
+# define __STLPORT_BC_stack_H
+
+# include <..\stack.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/stdexcep.h b/src/STLport/BC50/stdexcep.h
new file mode 100644
index 0000000..98173e2
--- /dev/null
+++ b/src/STLport/BC50/stdexcep.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_stdexcept_H
+# define __STLPORT_BC_stdexcept_H
+
+# include <..\stdexcept.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/stl_tmpl.h b/src/STLport/BC50/stl_tmpl.h
new file mode 100644
index 0000000..8e60093
--- /dev/null
+++ b/src/STLport/BC50/stl_tmpl.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_REPLACEME_H
+# define __STLPORT_BC_REPLACEME_H
+
+# include <..\REPLACEME.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/streambu.h b/src/STLport/BC50/streambu.h
new file mode 100644
index 0000000..5c314ea
--- /dev/null
+++ b/src/STLport/BC50/streambu.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_streambuf_H
+# define __STLPORT_BC_streambuf_H
+
+# include <..\streambuf.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/streambuf.h b/src/STLport/BC50/streambuf.h
new file mode 100644
index 0000000..1daf096
--- /dev/null
+++ b/src/STLport/BC50/streambuf.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_streambuf_H
+# define __STLPORT_BC_streambuf_H
+
+# include <..\streambuf.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/string.h b/src/STLport/BC50/string.h
new file mode 100644
index 0000000..eaaf2a7
--- /dev/null
+++ b/src/STLport/BC50/string.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+
+# include <..\string.h>
+
+# ifndef __IN_STLPORT_CSTRING
+// okay, include STLPort header
+# include <..\string.>
+# endif /* __IN_STLPORT_CSTRING */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/strstrea.h b/src/STLport/BC50/strstrea.h
new file mode 100644
index 0000000..64b66fb
--- /dev/null
+++ b/src/STLport/BC50/strstrea.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_strstream_H
+# define __STLPORT_BC_strstream_H
+
+# include <..\strstream.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/typeinfo.h b/src/STLport/BC50/typeinfo.h
new file mode 100644
index 0000000..b29354f
--- /dev/null
+++ b/src/STLport/BC50/typeinfo.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_typeinfo_H
+# define __STLPORT_BC_typeinfo_H
+
+# include <..\typeinfo.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/using/cstring.h b/src/STLport/BC50/using/cstring.h
new file mode 100644
index 0000000..5142dda
--- /dev/null
+++ b/src/STLport/BC50/using/cstring.h
@@ -0,0 +1,54 @@
+using _STLP_VENDOR_CSTD::size_t;
+
+# ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+# if defined(__MSL__) && __MC68K__ && !_No_BlockMove && __dest_os == __mac_os
+# undef memcpy
+# undef memmove
+inline void* memcpy(void* dst, const void* src, size_t len)
+{
+ return _STLP_VENDOR_CSTD::__memcpy(dst, src, len);
+}
+inline void* memmove(void* dst, const void* src, size_t len)
+{
+ return _STLP_VENDOR_CSTD::__memmove(dst, src, len);
+}
+# else
+
+ using _STLP_VENDOR_CSTD::memmove;
+ using _STLP_VENDOR_CSTD::memcpy;
+
+# endif
+
+# if ! defined (__BORLANDC__)
+using _STLP_VENDOR_CSTD::memchr;
+using _STLP_VENDOR_CSTD::strchr;
+using _STLP_VENDOR_CSTD::strpbrk;
+using _STLP_VENDOR_CSTD::strrchr;
+using _STLP_VENDOR_CSTD::strstr;
+# endif
+
+using _STLP_VENDOR_CSTD::memcmp;
+using _STLP_VENDOR_CSTD::memset;
+
+using _STLP_VENDOR_CSTD::strcat;
+
+# if !defined (strcmp)
+using _STLP_VENDOR_CSTD::strcmp;
+# endif
+
+using _STLP_VENDOR_CSTD::strcoll;
+# if !defined (strcpy)
+using _STLP_VENDOR_CSTD::strcpy;
+# endif
+using _STLP_VENDOR_CSTD::strcspn;
+using _STLP_VENDOR_CSTD::strerror;
+using _STLP_VENDOR_CSTD::strlen;
+using _STLP_VENDOR_CSTD::strncat;
+using _STLP_VENDOR_CSTD::strncmp;
+
+using _STLP_VENDOR_CSTD::strncpy;
+using _STLP_VENDOR_CSTD::strspn;
+
+using _STLP_VENDOR_CSTD::strtok;
+using _STLP_VENDOR_CSTD::strxfrm;
+# endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
diff --git a/src/STLport/BC50/using/fstream.h b/src/STLport/BC50/using/fstream.h
new file mode 100644
index 0000000..e79e048
--- /dev/null
+++ b/src/STLport/BC50/using/fstream.h
@@ -0,0 +1,19 @@
+#ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_STD;
+#else
+using _STLP_NEW_IO_NAMESPACE::basic_filebuf;
+using _STLP_NEW_IO_NAMESPACE::filebuf;
+using _STLP_NEW_IO_NAMESPACE::basic_ifstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ofstream;
+using _STLP_NEW_IO_NAMESPACE::ifstream;
+using _STLP_NEW_IO_NAMESPACE::ofstream;
+using _STLP_NEW_IO_NAMESPACE::basic_fstream;
+using _STLP_NEW_IO_NAMESPACE::fstream;
+
+# ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wofstream;
+using _STLP_NEW_IO_NAMESPACE::wfilebuf;
+using _STLP_NEW_IO_NAMESPACE::wifstream;
+using _STLP_NEW_IO_NAMESPACE::wfstream;
+# endif
+#endif
diff --git a/src/STLport/BC50/using/iomanip.h b/src/STLport/BC50/using/iomanip.h
new file mode 100644
index 0000000..8a7c792
--- /dev/null
+++ b/src/STLport/BC50/using/iomanip.h
@@ -0,0 +1,6 @@
+using _STLP_NEW_IO_NAMESPACE::setiosflags;
+using _STLP_NEW_IO_NAMESPACE::resetiosflags;
+using _STLP_NEW_IO_NAMESPACE::setbase;
+using _STLP_NEW_IO_NAMESPACE::setfill;
+using _STLP_NEW_IO_NAMESPACE::setprecision;
+using _STLP_NEW_IO_NAMESPACE::setw;
diff --git a/src/STLport/BC50/using/ios.h b/src/STLport/BC50/using/ios.h
new file mode 100644
index 0000000..22f23ae
--- /dev/null
+++ b/src/STLport/BC50/using/ios.h
@@ -0,0 +1,41 @@
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_NEW_IO_NAMESPACE;
+# else
+
+using _STLP_NEW_IO_NAMESPACE::ios;
+using _STLP_NEW_IO_NAMESPACE::streamoff;
+using _STLP_NEW_IO_NAMESPACE::streamsize;
+
+using _STLP_NEW_IO_NAMESPACE::ios_base;
+using _STLP_NEW_IO_NAMESPACE::basic_ios;
+
+// _lib.std.ios.manip_, manipulators:
+using _STLP_NEW_IO_NAMESPACE::boolalpha;
+using _STLP_NEW_IO_NAMESPACE::noboolalpha;
+using _STLP_NEW_IO_NAMESPACE::showbase;
+using _STLP_NEW_IO_NAMESPACE::noshowbase;
+using _STLP_NEW_IO_NAMESPACE::showpoint;
+using _STLP_NEW_IO_NAMESPACE::noshowpoint;
+using _STLP_NEW_IO_NAMESPACE::showpos;
+using _STLP_NEW_IO_NAMESPACE::noshowpos;
+using _STLP_NEW_IO_NAMESPACE::skipws;
+using _STLP_NEW_IO_NAMESPACE::noskipws;
+using _STLP_NEW_IO_NAMESPACE::uppercase;
+using _STLP_NEW_IO_NAMESPACE::nouppercase;
+
+// _lib.adjustfield.manip_ adjustfield:
+using _STLP_NEW_IO_NAMESPACE::internal;
+using _STLP_NEW_IO_NAMESPACE::left;
+using _STLP_NEW_IO_NAMESPACE::right;
+
+// _lib.basefield.manip_ basefield:
+using _STLP_NEW_IO_NAMESPACE::dec;
+using _STLP_NEW_IO_NAMESPACE::hex;
+using _STLP_NEW_IO_NAMESPACE::oct;
+
+// _lib.floatfield.manip_ floatfield:
+using _STLP_NEW_IO_NAMESPACE::fixed;
+using _STLP_NEW_IO_NAMESPACE::scientific;
+
+# endif /* _STLP_BROKEN_USING_DIRECTIVE */
+
diff --git a/src/STLport/BC50/using/iosfwd.h b/src/STLport/BC50/using/iosfwd.h
new file mode 100644
index 0000000..b564e81
--- /dev/null
+++ b/src/STLport/BC50/using/iosfwd.h
@@ -0,0 +1,54 @@
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+using _STLP_NEW_IO_NAMESPACE::char_traits;
+using _STLP_NEW_IO_NAMESPACE::basic_ios;
+using _STLP_NEW_IO_NAMESPACE::basic_streambuf;
+using _STLP_NEW_IO_NAMESPACE::basic_istream;
+using _STLP_NEW_IO_NAMESPACE::basic_ostream;
+using _STLP_NEW_IO_NAMESPACE::basic_iostream;
+using _STLP_NEW_IO_NAMESPACE::basic_stringbuf;
+using _STLP_NEW_IO_NAMESPACE::basic_istringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ostringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_stringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_filebuf;
+using _STLP_NEW_IO_NAMESPACE::basic_ifstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ofstream;
+using _STLP_NEW_IO_NAMESPACE::basic_fstream;
+using _STLP_NEW_IO_NAMESPACE::fpos;
+using _STLP_NEW_IO_NAMESPACE::istreambuf_iterator;
+using _STLP_NEW_IO_NAMESPACE::ostreambuf_iterator;
+using _STLP_NEW_IO_NAMESPACE::stringbuf;
+using _STLP_NEW_IO_NAMESPACE::istringstream;
+using _STLP_NEW_IO_NAMESPACE::ostringstream;
+using _STLP_NEW_IO_NAMESPACE::stringstream;
+# endif
+
+using _STLP_NEW_IO_NAMESPACE::ios;
+using _STLP_NEW_IO_NAMESPACE::streambuf;
+using _STLP_NEW_IO_NAMESPACE::istream;
+using _STLP_NEW_IO_NAMESPACE::ostream;
+using _STLP_NEW_IO_NAMESPACE::iostream;
+
+using _STLP_NEW_IO_NAMESPACE::filebuf;
+using _STLP_NEW_IO_NAMESPACE::ifstream;
+using _STLP_NEW_IO_NAMESPACE::ofstream;
+using _STLP_NEW_IO_NAMESPACE::fstream;
+
+using _STLP_NEW_IO_NAMESPACE::streampos;
+using _STLP_NEW_IO_NAMESPACE::streamoff;
+
+# if !defined (_STLP_NO_WIDE_STREAMS)
+using _STLP_NEW_IO_NAMESPACE::wios;
+using _STLP_NEW_IO_NAMESPACE::wstreambuf;
+using _STLP_NEW_IO_NAMESPACE::wistream;
+using _STLP_NEW_IO_NAMESPACE::wostream;
+using _STLP_NEW_IO_NAMESPACE::wiostream;
+using _STLP_NEW_IO_NAMESPACE::wstringbuf;
+using _STLP_NEW_IO_NAMESPACE::wistringstream;
+using _STLP_NEW_IO_NAMESPACE::wostringstream;
+using _STLP_NEW_IO_NAMESPACE::wstringstream;
+using _STLP_NEW_IO_NAMESPACE::wfilebuf;
+using _STLP_NEW_IO_NAMESPACE::wifstream;
+using _STLP_NEW_IO_NAMESPACE::wofstream;
+using _STLP_NEW_IO_NAMESPACE::wfstream;
+using _STLP_NEW_IO_NAMESPACE::wstreampos;
+# endif
diff --git a/src/STLport/BC50/using/iostream.h b/src/STLport/BC50/using/iostream.h
new file mode 100644
index 0000000..3704c4d
--- /dev/null
+++ b/src/STLport/BC50/using/iostream.h
@@ -0,0 +1,11 @@
+using _STLP_VENDOR_STD::cin;
+using _STLP_VENDOR_STD::cout;
+using _STLP_VENDOR_STD::cerr;
+using _STLP_VENDOR_STD::clog;
+
+# if ! defined (_STLP_NO_WIDE_STREAMS)
+using _STLP_VENDOR_STD::wcin;
+using _STLP_VENDOR_STD::wcout;
+using _STLP_VENDOR_STD::wcerr;
+using _STLP_VENDOR_STD::wclog;
+# endif
diff --git a/src/STLport/BC50/using/istream.h b/src/STLport/BC50/using/istream.h
new file mode 100644
index 0000000..4d5b912
--- /dev/null
+++ b/src/STLport/BC50/using/istream.h
@@ -0,0 +1,15 @@
+
+using _STLP_NEW_IO_NAMESPACE::basic_istream;
+using _STLP_NEW_IO_NAMESPACE::basic_iostream;
+
+using _STLP_NEW_IO_NAMESPACE::istream;
+using _STLP_NEW_IO_NAMESPACE::iostream;
+
+# if !defined (_STLP_NO_NATIVE_WIDE_STREAMS)
+using _STLP_NEW_IO_NAMESPACE::wistream;
+using _STLP_NEW_IO_NAMESPACE::wiostream;
+# endif
+
+#if !(defined (_STLP_MSVC) && (_STLP_MSVC < 1200))
+using _STLP_NEW_IO_NAMESPACE::ws;
+#endif
diff --git a/src/STLport/BC50/using/locale.h b/src/STLport/BC50/using/locale.h
new file mode 100644
index 0000000..f061cd6
--- /dev/null
+++ b/src/STLport/BC50/using/locale.h
@@ -0,0 +1,62 @@
+// from <cwchar>
+#if !defined (_STLP_NO_MBSTATE_T)
+using _STLP_VENDOR_MB_NAMESPACE::mbstate_t;
+#endif
+
+// _lib.locale_, locale:
+using _STLP_NEW_IO_NAMESPACE::locale;
+using _STLP_NEW_IO_NAMESPACE::use_facet;
+using _STLP_NEW_IO_NAMESPACE::has_facet;
+
+// _lib.locale.convenience_, convenience interfaces:
+using _STLP_NEW_IO_NAMESPACE::isspace;
+using _STLP_NEW_IO_NAMESPACE::isprint;
+using _STLP_NEW_IO_NAMESPACE::iscntrl;
+using _STLP_NEW_IO_NAMESPACE::isupper;
+using _STLP_NEW_IO_NAMESPACE::islower;
+using _STLP_NEW_IO_NAMESPACE::isalpha;
+using _STLP_NEW_IO_NAMESPACE::isdigit;
+using _STLP_NEW_IO_NAMESPACE::ispunct;
+using _STLP_NEW_IO_NAMESPACE::isxdigit;
+using _STLP_NEW_IO_NAMESPACE::isalnum;
+using _STLP_NEW_IO_NAMESPACE::isgraph;
+using _STLP_NEW_IO_NAMESPACE::toupper;
+using _STLP_NEW_IO_NAMESPACE::tolower;
+
+// _lib.category.ctype_ and _lib.facet.ctype.special_, ctype:
+using _STLP_NEW_IO_NAMESPACE::ctype_base;
+using _STLP_NEW_IO_NAMESPACE::ctype;
+using _STLP_NEW_IO_NAMESPACE::ctype_byname;
+using _STLP_NEW_IO_NAMESPACE::codecvt_base;
+using _STLP_NEW_IO_NAMESPACE::codecvt;
+using _STLP_NEW_IO_NAMESPACE::codecvt_byname;
+
+// _lib.category.numeric_ and _lib.facet.numpunct_, numeric:
+using _STLP_NEW_IO_NAMESPACE::num_get;
+using _STLP_NEW_IO_NAMESPACE::num_put;
+using _STLP_NEW_IO_NAMESPACE::numpunct;
+using _STLP_NEW_IO_NAMESPACE::numpunct_byname;
+
+// _lib.category.collate_, collation:
+using _STLP_NEW_IO_NAMESPACE::collate;
+using _STLP_NEW_IO_NAMESPACE::collate_byname;
+
+// _lib.category.time_, date and time:
+using _STLP_NEW_IO_NAMESPACE::time_base;
+using _STLP_NEW_IO_NAMESPACE::time_get;
+using _STLP_NEW_IO_NAMESPACE::time_get_byname;
+using _STLP_NEW_IO_NAMESPACE::time_put;
+using _STLP_NEW_IO_NAMESPACE::time_put_byname;
+
+// _lib.category.monetary_, money:
+using _STLP_NEW_IO_NAMESPACE::money_base;
+using _STLP_NEW_IO_NAMESPACE::money_get;
+using _STLP_NEW_IO_NAMESPACE::money_put;
+using _STLP_NEW_IO_NAMESPACE::moneypunct;
+using _STLP_NEW_IO_NAMESPACE::moneypunct_byname;
+
+#if !defined (_STLP_OWN_IOSTREAMS) && !defined (_STLP_NO_NATIVE_MESSAGE_FACET)
+using _STLP_NEW_IO_NAMESPACE::messages_base;
+using _STLP_NEW_IO_NAMESPACE::messages;
+using _STLP_NEW_IO_NAMESPACE::messages_byname;
+#endif // _MSL_NO_MESSAGE_FACET
diff --git a/src/STLport/BC50/using/ostream.h b/src/STLport/BC50/using/ostream.h
new file mode 100644
index 0000000..162b32d
--- /dev/null
+++ b/src/STLport/BC50/using/ostream.h
@@ -0,0 +1,10 @@
+using _STLP_NEW_IO_NAMESPACE::basic_ostream;
+using _STLP_NEW_IO_NAMESPACE::ostream;
+
+# ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wostream;
+# endif
+
+using _STLP_NEW_IO_NAMESPACE::endl;
+using _STLP_NEW_IO_NAMESPACE::ends;
+using _STLP_NEW_IO_NAMESPACE::flush;
diff --git a/src/STLport/BC50/using/sstream.h b/src/STLport/BC50/using/sstream.h
new file mode 100644
index 0000000..925c37e
--- /dev/null
+++ b/src/STLport/BC50/using/sstream.h
@@ -0,0 +1,16 @@
+using _STLP_NEW_IO_NAMESPACE::basic_stringbuf;
+using _STLP_NEW_IO_NAMESPACE::stringbuf;
+
+using _STLP_NEW_IO_NAMESPACE::basic_istringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ostringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_stringstream;
+using _STLP_NEW_IO_NAMESPACE::istringstream;
+using _STLP_NEW_IO_NAMESPACE::ostringstream;
+using _STLP_NEW_IO_NAMESPACE::stringstream;
+
+#ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wstringbuf;
+using _STLP_NEW_IO_NAMESPACE::wistringstream;
+using _STLP_NEW_IO_NAMESPACE::wostringstream;
+using _STLP_NEW_IO_NAMESPACE::wstringstream;
+#endif
diff --git a/src/STLport/BC50/using/streambuf.h b/src/STLport/BC50/using/streambuf.h
new file mode 100644
index 0000000..308241d
--- /dev/null
+++ b/src/STLport/BC50/using/streambuf.h
@@ -0,0 +1,5 @@
+using _STLP_NEW_IO_NAMESPACE::basic_streambuf;
+using _STLP_NEW_IO_NAMESPACE::streambuf;
+#ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wstreambuf;
+# endif
diff --git a/src/STLport/BC50/using/strstream.h b/src/STLport/BC50/using/strstream.h
new file mode 100644
index 0000000..eb26ac1
--- /dev/null
+++ b/src/STLport/BC50/using/strstream.h
@@ -0,0 +1,4 @@
+using _STLP_NEW_IO_NAMESPACE::strstreambuf;
+using _STLP_NEW_IO_NAMESPACE::istrstream;
+using _STLP_NEW_IO_NAMESPACE::ostrstream;
+using _STLP_NEW_IO_NAMESPACE::strstream;
diff --git a/src/STLport/BC50/utility.h b/src/STLport/BC50/utility.h
new file mode 100644
index 0000000..b6ed123
--- /dev/null
+++ b/src/STLport/BC50/utility.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_utility_H
+# define __STLPORT_BC_utility_H
+
+# include <..\utility.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/valarray.h b/src/STLport/BC50/valarray.h
new file mode 100644
index 0000000..0ebc7f8
--- /dev/null
+++ b/src/STLport/BC50/valarray.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_valarray_H
+# define __STLPORT_BC_valarray_H
+
+# include <..\valarray.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/vector.h b/src/STLport/BC50/vector.h
new file mode 100644
index 0000000..0492e6b
--- /dev/null
+++ b/src/STLport/BC50/vector.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ * This wrapper is needed for Borland C++ 5.0 to get STLport
+ * header properly included
+ */
+
+#ifndef __STLPORT_BC_vector_H
+# define __STLPORT_BC_vector_H
+
+# include <..\vector.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/algorithm b/src/STLport/algorithm
new file mode 100644
index 0000000..131348d
--- /dev/null
+++ b/src/STLport/algorithm
@@ -0,0 +1,60 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ALGORITHM
+#define _STLP_ALGORITHM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1
+# include <stl/_prolog.h>
+# endif
+
+#ifdef _STLP_PRAGMA_ONCE
+# pragma once
+#endif
+
+# if ! defined (_STLP_USE_NAMESPACES)
+// remove() conflicts, <cstdio> should always go first
+# include <cstdio>
+# endif
+
+# ifndef _STLP_INTERNAL_ALGO_H
+# include <stl/_algo.h>
+# endif
+
+#if defined (_STLP_IMPORT_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(algorithm)
+#endif /* _STLP_IMPORT_VENDOR_STD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ALGORITHM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/bitset b/src/STLport/bitset
new file mode 100644
index 0000000..5ac41a8
--- /dev/null
+++ b/src/STLport/bitset
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_BITSET
+#define _STLP_BITSET
+
+// This implementation of bitset<> has a second template parameter,
+// _WordT, which defaults to unsigned long. *YOU SHOULD NOT USE
+// THIS FEATURE*. It is experimental, and it may be removed in
+// future releases.
+
+// A bitset of size N, using words of type _WordT, will have
+// N % (sizeof(_WordT) * CHAR_BIT) unused bits. (They are the high-
+// order bits in the highest word.) It is a class invariant
+// of class bitset<> that those unused bits are always zero.
+
+// Most of the actual code isn't contained in bitset<> itself, but in the
+// base class _Base_bitset. The base class works with whole words, not with
+// individual bits. This allows us to specialize _Base_bitset for the
+// important special case where the bitset is only a single word.
+
+// The C++ standard does not define the precise semantics of operator[].
+// In this implementation the const version of operator[] is equivalent
+// to test(), except that it does no range checking. The non-const version
+// returns a reference to a bit, again without doing any range checking.
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x2
+# include <stl/_prolog.h>
+# endif
+
+#ifdef _STLP_PRAGMA_ONCE
+# pragma once
+#endif
+
+# include <stl/_bitset.h>
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_BITSET */
+
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/cassert b/src/STLport/cassert
new file mode 100644
index 0000000..763fa79
--- /dev/null
+++ b/src/STLport/cassert
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x103
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS) || defined (__IN_STLPORT_CASSERT)
+# include _STLP_NATIVE_CPP_C_HEADER(cassert)
+# else
+# include <assert.h>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x103 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cctype b/src/STLport/cctype
new file mode 100644
index 0000000..a71bab5
--- /dev/null
+++ b/src/STLport/cctype
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CCTYPE
+# define _STLP_CCTYPE
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x104
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+
+# include _STLP_NATIVE_CPP_C_HEADER(cctype)
+
+# else
+
+# include <ctype.h>
+
+// Undef convenience interfaces
+#undef isspace
+#undef isprint
+#undef iscntrl
+#undef isupper
+#undef islower
+#undef isalpha
+#undef isdigit
+#undef ispunct
+#undef isxdigit
+#undef isalnum
+#undef isgraph
+#undef toupper
+#undef tolower
+
+# endif /* _STLP_USE_NEW_C_HEADERS */
+
+# if ! defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
+# if defined ( _STLP_IMPORT_VENDOR_CSTD )
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::isalnum;
+using _STLP_VENDOR_CSTD::isalpha;
+using _STLP_VENDOR_CSTD::iscntrl;
+using _STLP_VENDOR_CSTD::isdigit;
+using _STLP_VENDOR_CSTD::isgraph;
+using _STLP_VENDOR_CSTD::islower;
+using _STLP_VENDOR_CSTD::isprint;
+using _STLP_VENDOR_CSTD::ispunct;
+using _STLP_VENDOR_CSTD::isspace;
+using _STLP_VENDOR_CSTD::isupper;
+using _STLP_VENDOR_CSTD::isxdigit;
+using _STLP_VENDOR_CSTD::tolower;
+using _STLP_VENDOR_CSTD::toupper;
+_STLP_END_NAMESPACE
+# endif /* _STLP_IMPORT_VENDOR_CSTD*/
+# endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x104 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CCTYPE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cerrno b/src/STLport/cerrno
new file mode 100644
index 0000000..e714f87
--- /dev/null
+++ b/src/STLport/cerrno
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CERRNO
+# define _STLP_CERRNO
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x105
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(cerrno)
+# else
+# include <errno.h>
+# endif
+
+#ifndef errno
+
+# if defined (_STLP_IMPORT_VENDOR_CSTD) && ! defined (__IBMCPP__) && ! defined(__hpux)
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::errno;
+_STLP_END_NAMESPACE
+# endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x105 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CERRNO */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cfloat b/src/STLport/cfloat
new file mode 100644
index 0000000..00734a6
--- /dev/null
+++ b/src/STLport/cfloat
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CFLOAT
+# define _STLP_CFLOAT
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x106
+# include <stl/_prolog.h>
+# endif
+
+// Borland defines some implementation constants in std:: namespace,
+// we do not want to import them.
+# if defined (_STLP_USE_NEW_C_HEADERS) && ! defined (__BORLANDC__)
+# include _STLP_NATIVE_CPP_C_HEADER(cfloat)
+# else
+# include _STLP_NATIVE_C_HEADER(float.h)
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x106 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CFLOAT */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/climits b/src/STLport/climits
new file mode 100644
index 0000000..3e2ee84
--- /dev/null
+++ b/src/STLport/climits
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CLIMITS
+# define _STLP_CLIMITS
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x107
+# include <stl/_prolog.h>
+# endif
+
+# if defined (__SUNPRO_CC) && ((__SUNPRO_CC == 0x500) && (__SUNPRO_CC_COMPAT > 4))
+# include </usr/include/limits.h>
+# elif defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(climits)
+# else
+# ifdef __BORLANDC__
+# include _STLP_NATIVE_C_HEADER(limits.h)
+# else
+# include <limits.h>
+# endif
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x107 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CLIMITS */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/clocale b/src/STLport/clocale
new file mode 100644
index 0000000..1cae50d
--- /dev/null
+++ b/src/STLport/clocale
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CLOCALE
+# define _STLP_CLOCALE
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x108
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(clocale)
+# else
+# include _STLP_NATIVE_C_HEADER(locale.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::lconv;
+# if ! defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
+using _STLP_VENDOR_CSTD::localeconv;
+using _STLP_VENDOR_CSTD::setlocale;
+# endif
+_STLP_END_NAMESPACE
+# endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x108 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CLOCALE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cmath b/src/STLport/cmath
new file mode 100644
index 0000000..8867483
--- /dev/null
+++ b/src/STLport/cmath
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CMATH
+# define _STLP_CMATH
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x109
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# if defined (_STLP_HAS_NO_NAMESPACES) && ! defined (exception)
+# define exception __math_exception
+# endif
+# include _STLP_NATIVE_CPP_C_HEADER(cmath)
+# if defined (_STLP_HAS_NO_NAMESPACES)
+# undef exception
+# endif
+# else
+# include <math.h>
+# endif
+
+# if (defined (__SUNPRO_CC) && (__SUNPRO_CC > 0x500)) || \
+ !( defined (__IBMCPP__) && (__IBMCPP__ >= 500) || ! ( defined (__HP_aCC) && (__HP_aCC >= 30000) ))
+# ifndef _STLP_HAS_NO_NAMESPACES
+namespace std {
+# endif
+ extern "C" double hypot(double x, double y);
+# ifndef _STLP_HAS_NO_NAMESPACES
+}
+# endif
+
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+# if ! defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
+# ifdef _STLP_HAS_NATIVE_FLOAT_ABS
+using _STLP_VENDOR_CSTD::abs;
+# endif
+using _STLP_VENDOR_CSTD::acos;
+using _STLP_VENDOR_CSTD::asin;
+using _STLP_VENDOR_CSTD::atan2;
+using _STLP_VENDOR_CSTD::atan;
+using _STLP_VENDOR_CSTD::ceil;
+using _STLP_VENDOR_CSTD::cos;
+using _STLP_VENDOR_CSTD::cosh;
+using _STLP_VENDOR_CSTD::exp;
+using _STLP_VENDOR_CSTD::fabs;
+using _STLP_VENDOR_CSTD::floor;
+using _STLP_VENDOR_CSTD::fmod;
+using _STLP_VENDOR_CSTD::frexp;
+using _STLP_VENDOR_CSTD::ldexp;
+using _STLP_VENDOR_CSTD::log10;
+using _STLP_VENDOR_CSTD::log;
+using _STLP_VENDOR_CSTD::modf;
+using _STLP_VENDOR_CSTD::pow;
+using _STLP_VENDOR_CSTD::sin;
+using _STLP_VENDOR_CSTD::sinh;
+using _STLP_VENDOR_CSTD::sqrt;
+using _STLP_VENDOR_CSTD::tan;
+using _STLP_VENDOR_CSTD::tanh;
+# endif /* BUG */
+_STLP_END_NAMESPACE
+# endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+#ifndef _STLP_CMATH_H_HEADER
+# include <stl/_cmath.h>
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x109 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CMATH */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/complex b/src/STLport/complex
new file mode 100644
index 0000000..905fe93
--- /dev/null
+++ b/src/STLport/complex
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_template_complex
+# define _STLP_template_complex
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x10
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_OWN_IOSTREAMS
+// This header declares the template class complex, as described in
+// in the draft C++ standard. Single-precision complex numbers
+// are complex<float>, double-precision are complex<double>, and
+// quad precision are complex<long double>.
+
+// Note that the template class complex is declared within namespace
+// std, as called for by the draft C++ standard
+
+# define _STLP_COMPLEX_NAMESPACE _STLP_STD
+# include <stl/_complex.h>
+# else
+# define _STLP_COMPLEX_NAMESPACE _STLP_VENDOR_STD
+# include <wrap_std/complex>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x10 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_template_complex */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/config/_epilog.h b/src/STLport/config/_epilog.h
new file mode 100644
index 0000000..3671284
--- /dev/null
+++ b/src/STLport/config/_epilog.h
@@ -0,0 +1,33 @@
+#if defined (_STLP_MSVC) || defined (__ICL) || defined (__BORLANDC__)
+
+# if defined (__BORLANDC__)
+# pragma option pop
+# pragma option -w-8062
+# else
+# if !(defined (_STLP_MSVC) && (_STLP_MSVC < 1200))
+# pragma warning (pop)
+# endif
+# pragma pack (pop)
+# endif
+
+
+#elif defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+
+# pragma reset woff 1174
+# pragma reset woff 1375
+# pragma reset woff 1209
+// from iterator_base.h
+# pragma reset woff 1183
+
+#elif defined(__DECCXX)
+
+# ifdef __PRAGMA_ENVIRONMENT
+# pragma __environment __restore
+# endif
+
+#elif defined(__IBMCPP__)
+
+#pragma info(restore)
+
+#endif
+
diff --git a/src/STLport/config/_msvc_warnings_off.h b/src/STLport/config/_msvc_warnings_off.h
new file mode 100644
index 0000000..b4ea8b1
--- /dev/null
+++ b/src/STLport/config/_msvc_warnings_off.h
@@ -0,0 +1,20 @@
+# if (_MSC_VER > 1000)
+// #pragma warning ( disable : 4251 ) // ignore template classes being exported in .dll's
+/*
+ * "this used in base member initializer list"
+ * arrow operator warning
+ * copy constr & assignment cannot be generated
+ * "forcing value to bool 'true' or 'false'
+ * typedef used instaead of full type
+ * 4018 : signed/unsigned mismatch, 4146 - result still unsigned
+ * 4100: unreferenced formal parameter
+ * 4663: C++ language change: to explicitly specialize class template 'identifier' use the following syntax
+ */
+# pragma warning ( disable : 4355 4284 4231 4511 4512 4097 4786 4800 4018 4146 4244 4514 4127 4100 4663)
+# pragma warning ( disable : 4245 4514 4660) // conversion from enum to unsigned int signed/unsigned mismatch
+# if (_MSC_VER > 1200)
+// multiple copy constructors/assignment operators specified,
+// with member templates are bogus...
+# pragma warning ( disable : 4521 4522)
+# endif
+# endif
diff --git a/src/STLport/config/_prolog.h b/src/STLport/config/_prolog.h
new file mode 100644
index 0000000..be32caa
--- /dev/null
+++ b/src/STLport/config/_prolog.h
@@ -0,0 +1,46 @@
+
+#if defined (_STLP_MSVC) || defined (__ICL) || defined (__BORLANDC__)
+
+# if defined (__BORLANDC__)
+# if (__BORLANDC__ >= 0x510)
+# pragma option push -Vx- -Ve- -a8 -b -pc -w-inl -w-aus -w-sig -w-8062 -w-8041 -w-8008 -w-8012 -w-8027 -w-8057 -w-8091 -w-8092 -w-8066 /* P_O_1 */
+# endif
+# else
+# if !(defined (_STLP_MSVC) && (_STLP_MSVC < 1200))
+# pragma warning(push)
+# endif
+# pragma pack(push,8)
+# include <config/_msvc_warnings_off.h>
+# endif
+
+
+#elif defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+
+#pragma set woff 1209
+#pragma set woff 1174
+#pragma set woff 1375
+// from iterator_base.h
+#pragma set woff 1183
+
+#elif defined(__DECCXX)
+
+# ifdef __PRAGMA_ENVIRONMENT
+# pragma __environment __save
+# pragma __environment __header_defaults
+# endif
+
+#elif defined(__IBMCPP__)
+// supress EDC3130: A constant is being used as a conditional expression
+#pragma info(nocnd)
+
+#elif defined (__HP_aCC)
+/* _REENTRANT selects Posix 1c threads unless draft4 selected.
+ * * This usage is obsolescent, "-D_POSIX_C_SOURCE=199506" is preferred */
+# if 0 /* defined (_REENTRANT) && ! defined (_POSIX_C_SOURCE) */
+# define _POSIX_C_SOURCE 199506
+# endif
+#elif defined (__WATCOMCPLUSPLUS__)
+# pragma warning 604 10 // must lookahead to determine...
+# pragma warning 594 10 // resolved as declaration/type
+# pragma warning 595 10 // resolved as an expression
+#endif
diff --git a/src/STLport/config/new_compiler/README b/src/STLport/config/new_compiler/README
new file mode 100644
index 0000000..fc7d92c
--- /dev/null
+++ b/src/STLport/config/new_compiler/README
@@ -0,0 +1,12 @@
+
+README file for "stlport/config/new_compiler"
+
+
+This directory contains "configure" script which will help you to
+create config file for a new compiler. Please refer to HTML documentation
+at www.stlport.org/doc for details.
+NOTE : stlconf.h produced by "configure" is NOT suitable for immediate use
+as platform-specific configuration file as it does not set several important
+macros. However, it is a good starting point.
+
+Boris Fomitchev.
\ No newline at end of file
diff --git a/src/STLport/config/new_compiler/configure b/src/STLport/config/new_compiler/configure
new file mode 100644
index 0000000..657e3fa
--- /dev/null
+++ b/src/STLport/config/new_compiler/configure
@@ -0,0 +1,3644 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.12
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+--enable-extension=<ext>"
+ac_help="$ac_help
+--enable-namespaces Use namespaces (default if posssible)
+--disable-namespaces Don't use namespaces support"
+ac_help="$ac_help
+--enable-exceptions Use exceptions support (default if posssible)
+ --disable-exceptions Don't use exceptions support"
+ac_help="$ac_help
+--enable-relops Separate rel_ops namespace for relational operators (default if posssible)
+--disable-relops No separate rel_ops namespace for relational operators"
+ac_help="$ac_help
+--enable-new-style-headers Use new-style headers (default)
+--disable-new-style-headers Don't use new-style headers"
+ac_help="$ac_help
+--enable-new-iostreams Use new iostreams (default)
+--disable-new-iostreams Don't use new iostreams"
+ac_help="$ac_help
+--enable-sgi-allocators : set default parameter to SGI-style default alloc, not allocator<T>
+ --disable-sgi-allocators : use allocator<T> if possible"
+ac_help="$ac_help
+--enable-malloc : set default alloc to malloc-based allocator ( malloc_alloc_template<instance_no>, alloc.h )
+--disable-malloc : choose (default) sgi node allocator (__alloc<threads,no> alloc.h )"
+ac_help="$ac_help
+--enable-newalloc : set default alloc to new-based allocator ( new_alloc, alloc.h )
+--disable-newalloc : choose (default) sgi allocator (__alloc<threads,no> alloc.h )"
+ac_help="$ac_help
+--enable-defalloc : make HP-style defalloc.h included in alloc.h )
+--disable-defalloc : leave defalloc.h alone"
+ac_help="$ac_help
+--enable-debugalloc : use debug versions of allocators
+--disable-debugalloc : not using debug allocators"
+ac_help="$ac_help
+--enable-abbrevs : use abbreviated class names internally for linker benefit (don't affect interface)
+--disable-abbrevs : don't use abbreviated names"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.12"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=stlconf.h.in
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi at caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+echo "$ac_t""*** $0: STLport configuration utility ***" 1>&6
+if test "${CXXFLAGS}" = ""; then
+echo "$ac_t""* Note: for best reliability - try \"CXXFLAGS=-treat_warnings_as_errors\" $0 " 1>&6
+echo "$ac_t""* Please don't forget specifying typical CXXFLAGS you'll be using - " 1>&6
+echo "$ac_t""* such as that enabling exceptions handling" 1>&6
+fi
+echo "$ac_t""Please stand by while exploring compiler capabilities..." 1>&6
+echo "$ac_t""Be patient - that may take a while..." 1>&6
+echo "$ac_t""***" 1>&6
+
+# utility function
+check_warning () {
+ warn_str=`tail -1 config.log | egrep -i "arning|\(W\)"`
+ if test "$warn_str" = ""; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+
+# Check whether --enable-extension or --disable-extension was given.
+if test "${enable_extension+set}" = set; then
+ enableval="$enable_extension"
+
+case "$enableval" in
+ no) echo "$ac_t""Info :.cpp used as extension for tests" 1>&6
+ ac_ext=cpp
+ ;;
+ *) echo "$ac_t""Argument : .$enableval used as extension" 1>&6
+ ac_ext=$enableval
+esac
+
+else
+ echo "$ac_t""Info : .cpp used as extension for tests" 1>&6
+ ac_ext=cpp
+
+
+fi
+
+
+# Save that, as it is being redefined several times
+use_ac_ext=$ac_ext
+
+for ac_prog in $CCC c++ g++ gcc CC cxx cc++
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:601: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CXX="$ac_prog"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CXX="$ac_cv_prog_CXX"
+if test -n "$CXX"; then
+ echo "$ac_t""$CXX" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+test -n "$CXX" && break
+done
+test -n "$CXX" || CXX="gcc"
+
+
+echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:632: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5
+
+ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+cat > conftest.$ac_ext <<EOF
+#line 642 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+if { (eval echo configure:646: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ ac_cv_prog_cxx_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cxx_cross=no
+ else
+ ac_cv_prog_cxx_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cxx_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6
+if test $ac_cv_prog_cxx_works = no; then
+ { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:672: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
+cross_compiling=$ac_cv_prog_cxx_cross
+
+echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
+echo "configure:677: checking whether we are using GNU C++" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.C <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:686: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gxx=yes
+else
+ ac_cv_prog_gxx=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gxx" 1>&6
+
+if test $ac_cv_prog_gxx = yes; then
+ GXX=yes
+ ac_test_CXXFLAGS="${CXXFLAGS+set}"
+ ac_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS=
+ echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
+echo "configure:701: checking whether ${CXX-g++} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.cc
+if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
+ ac_cv_prog_cxx_g=yes
+else
+ ac_cv_prog_cxx_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
+ if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS="$ac_save_CXXFLAGS"
+ elif test $ac_cv_prog_cxx_g = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-O2"
+ fi
+else
+ GXX=
+ test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
+fi
+
+ac_ext=$use_ac_ext
+
+ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+ac_ext=$use_ac_ext
+
+echo $ac_n "checking size of int""... $ac_c" 1>&6
+echo "configure:740: checking size of int" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_sizeof_int=4
+else
+ cat > conftest.$ac_ext <<EOF
+#line 748 "configure"
+#include "confdefs.h"
+#ifdef __cplusplus
+extern "C" void exit(int);
+#endif
+#include <stdio.h>
+main()
+{
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof(int));
+ exit(0);
+}
+EOF
+if { (eval echo configure:762: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_sizeof_int=`cat conftestval`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_sizeof_int=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_int" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+EOF
+
+
+ac_ext=$use_ac_ext
+
+if test "$ac_cv_sizeof_int" = "4"; then
+ cat >> confdefs.h <<EOF
+#define _STLP_UINT32_T unsigned int
+EOF
+
+else
+ echo $ac_n "checking size of long""... $ac_c" 1>&6
+echo "configure:790: checking size of long" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_sizeof_long=4
+else
+ cat > conftest.$ac_ext <<EOF
+#line 798 "configure"
+#include "confdefs.h"
+#ifdef __cplusplus
+extern "C" void exit(int);
+#endif
+#include <stdio.h>
+main()
+{
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof(long));
+ exit(0);
+}
+EOF
+if { (eval echo configure:812: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_sizeof_long=`cat conftestval`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_sizeof_long=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_long" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+EOF
+
+
+ ac_ext=$use_ac_ext
+ if test "$ac_cv_sizeof_long" = "4"; then
+ cat >> confdefs.h <<EOF
+#define _STLP_UINT32_T unsigned long
+EOF
+
+ else
+ echo $ac_n "checking size of short""... $ac_c" 1>&6
+echo "configure:839: checking size of short" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_sizeof_short=4
+else
+ cat > conftest.$ac_ext <<EOF
+#line 847 "configure"
+#include "confdefs.h"
+#ifdef __cplusplus
+extern "C" void exit(int);
+#endif
+#include <stdio.h>
+main()
+{
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof(short));
+ exit(0);
+}
+EOF
+if { (eval echo configure:861: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_sizeof_short=`cat conftestval`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_sizeof_short=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_short" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+EOF
+
+
+ if test "$ac_cv_sizeof_short" = "4"; then
+ cat >> confdefs.h <<EOF
+#define _STLP_UINT32_T unsigned short
+EOF
+
+ else
+ { echo "configure: error: Cannot find any 32-bit integer type for your compiler" 1>&2; exit 1; }
+ fi
+ ac_ext=$use_ac_ext
+ fi
+fi
+ac_ext=$use_ac_ext
+
+
+if test "$ac_cv_c_cross" = "yes"; then
+ CXXFLAGS="${CXXFLAGS} -c"
+fi
+
+ac_ext=$use_ac_ext
+
+echo $ac_n "checking for basic STL compatibility""... $ac_c" 1>&6
+echo "configure:901: checking for basic STL compatibility" >&5
+cat > conftest.$ac_ext <<EOF
+#line 903 "configure"
+#include "confdefs.h"
+
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+ typedef Arg1 first_argument_type;
+ typedef Arg2 second_argument_type;
+ typedef Result result_type;
+};
+template <class T>
+struct plus : public binary_function<T, T, T> {
+ T operator()(const T& x, const T& y) const;
+};
+
+template <class T>
+T plus<T>::operator()(const T& x, const T& y) const { return x + y; }
+plus<int> p;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_compat="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ { echo "configure: error: Your compiler won't be able to compile this implementation. Sorry." 1>&2; exit 1; }
+ ac_cv_compat="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_compat" 1>&6
+
+echo $ac_n "checking for partial specialization syntax""... $ac_c" 1>&6
+echo "configure:940: checking for partial specialization syntax" >&5
+cat > conftest.$ac_ext <<EOF
+#line 942 "configure"
+#include "confdefs.h"
+
+ template <class T> class fs_foo {};
+ template <> class fs_foo<int> {};
+int main() {
+ fs_foo<int> i;
+; return 0; }
+EOF
+if { (eval echo configure:951: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ _FULL_SPEC="template <>" ac_cv_spec_syntax="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+EOF
+ ac_cv_spec_syntax="no" _FULL_SPEC=""
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_spec_syntax" 1>&6
+
+echo $ac_n "checking for bool keyword""... $ac_c" 1>&6
+echo "configure:967: checking for bool keyword" >&5
+cat > conftest.$ac_ext <<EOF
+#line 969 "configure"
+#include "confdefs.h"
+bool b_foo() { return true; }
+int main() {
+(void)b_foo();
+; return 0; }
+EOF
+if { (eval echo configure:976: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_bool="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_BOOL 1
+EOF
+ ac_cv_bool="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_bool" 1>&6
+if test "$ac_cv_bool" = "no"; then
+ echo $ac_n "checking for yvals.h header""... $ac_c" 1>&6
+echo "configure:992: checking for yvals.h header" >&5
+ cat > conftest.$ac_ext <<EOF
+#line 994 "configure"
+#include "confdefs.h"
+#include <yvals.h>
+ extern bool aaa=true;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1003: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_YVALS_H 1
+EOF
+ echo "$ac_t""yes" 1>&6
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+
+ echo "$ac_t""no" 1>&6
+ echo $ac_n "checking whether bool is reserved word""... $ac_c" 1>&6
+echo "configure:1016: checking whether bool is reserved word" >&5
+ cat > conftest.$ac_ext <<EOF
+#line 1018 "configure"
+#include "confdefs.h"
+typedef int bool;
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1025: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_bool_reserved="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_DONT_USE_BOOL_TYPEDEF 1
+EOF
+ ac_cv_bool_reserved="yes"
+fi
+rm -f conftest*
+ echo "$ac_t""$ac_cv_bool_reserved" 1>&6
+
+fi
+rm -f conftest*
+fi
+
+echo $ac_n "checking for wchar_t type""... $ac_c" 1>&6
+echo "configure:1045: checking for wchar_t type" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1047 "configure"
+#include "confdefs.h"
+ #include <wchar.h>
+ wchar_t wc_foo() { return 'a'; }
+int main() {
+(void)wc_foo();
+; return 0; }
+EOF
+if { (eval echo configure:1055: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_wchar="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_WCHAR_T 1
+EOF
+ ac_cv_wchar="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_wchar" 1>&6
+
+echo $ac_n "checking if wchar_t is unsigned short""... $ac_c" 1>&6
+echo "configure:1071: checking if wchar_t is unsigned short" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1073 "configure"
+#include "confdefs.h"
+
+ # include <wchar.h>
+ template <class T> struct foo {};
+ $_FULL_SPEC struct foo <wchar_t> {};
+ typedef unsigned short u__short;
+ $_FULL_SPEC struct foo <u__short> {};
+ foo<wchar_t> f1;
+ foo<u__short> f2;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1088: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_wchar_short="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_WCHAR_T_IS_USHORT 1
+EOF
+ ac_cv_wchar_short="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_wchar_short" 1>&6
+
+echo $ac_n "checking for long long type""... $ac_c" 1>&6
+echo "configure:1104: checking for long long type" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1106 "configure"
+#include "confdefs.h"
+long long ll_foo() { return 0; }
+int main() {
+(void)ll_foo();
+; return 0; }
+EOF
+if { (eval echo configure:1113: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_LONG_LONG 1
+EOF
+ ac_cv_long_long="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_long_long="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_long_long" 1>&6
+
+echo $ac_n "checking for long double type""... $ac_c" 1>&6
+echo "configure:1129: checking for long double type" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1131 "configure"
+#include "confdefs.h"
+long double ld_foo() { return 0; }
+int main() {
+(void)ld_foo();
+; return 0; }
+EOF
+if { (eval echo configure:1138: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_long_double="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_LONG_DOUBLE 1
+EOF
+ ac_cv_long_double="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_long_double" 1>&6
+
+echo $ac_n "checking for typename keyword""... $ac_c" 1>&6
+echo "configure:1154: checking for typename keyword" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1156 "configure"
+#include "confdefs.h"
+
+template <class T1, class T2>
+struct pair {
+ typedef T1 first_type;
+ typedef T2 second_type;
+};
+
+template <class Arg, class Result>
+struct unary_function {
+ typedef Arg argument_type;
+ typedef Result result_type;
+};
+
+template <class Pair>
+struct select2nd : public unary_function<Pair, typename Pair::second_type> {
+ typedef typename Pair::first_type ignored_type;
+ const typename Pair::second_type& operator()(const typename Pair::second_type& x,
+ const ignored_type& ) const
+ {
+ return x;
+ }
+
+};
+
+int main() {
+
+ typedef pair<int,int> tn_p;
+ select2nd< tn_p > tn_s;
+ (void)tn_s(1,5);
+
+; return 0; }
+EOF
+if { (eval echo configure:1190: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ __TYPENAME="typename"
+ ac_cv_typename="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ __TYPENAME=""
+ cat >> confdefs.h <<\EOF
+#define _STLP_NEED_TYPENAME 1
+EOF
+
+ ac_cv_typename="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_typename" 1>&6
+
+echo $ac_n "checking for explicit keyword""... $ac_c" 1>&6
+echo "configure:1209: checking for explicit keyword" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1211 "configure"
+#include "confdefs.h"
+struct expl_Class { int a; explicit expl_Class(int t): a(t) {} };
+ expl_Class c(1);
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1220: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_explicit="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_EXPLICIT 1
+EOF
+ ac_cv_explicit="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_explicit" 1>&6
+
+echo $ac_n "checking for mutable keyword""... $ac_c" 1>&6
+echo "configure:1236: checking for mutable keyword" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1238 "configure"
+#include "confdefs.h"
+struct mut_Class { mutable int a; void update() const { a=0; } };
+ mut_Class c;
+
+int main() {
+c.update()
+; return 0; }
+EOF
+if { (eval echo configure:1247: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_mutable="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NEED_MUTABLE 1
+EOF
+ ac_cv_mutable="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_mutable" 1>&6
+
+echo $ac_n "checking for new style casts""... $ac_c" 1>&6
+echo "configure:1263: checking for new style casts" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1265 "configure"
+#include "confdefs.h"
+struct ncast_Class {
+ int a; void update(int* i) { *i=a; } };
+ ncast_Class c;
+
+int main() {
+
+ const int a(5);
+ c.update(const_cast<int*>(&a))
+
+; return 0; }
+EOF
+if { (eval echo configure:1278: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_new_cast="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_NEW_STYLE_CASTS 1
+EOF
+ ac_cv_new_cast="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_new_cast" 1>&6
+
+echo $ac_n "checking for new-style C library headers""... $ac_c" 1>&6
+echo "configure:1294: checking for new-style C library headers" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1296 "configure"
+#include "confdefs.h"
+
+ #include <cctype>
+ #include <cstddef>
+ #include <cstdio>
+ #include <cstdlib>
+ #include <cstring>
+ #include <cassert>
+ #include <climits>
+ #ifndef _STLP_NO_WCHAR_T
+ #include <cwchar>
+ #endif
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1314: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_newheaders="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_HAS_NO_NEW_C_HEADERS 1
+EOF
+ ac_cv_newheaders="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_newheaders" 1>&6
+
+echo $ac_n "checking for new-style <new> header""... $ac_c" 1>&6
+echo "configure:1330: checking for new-style <new> header" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1332 "configure"
+#include "confdefs.h"
+
+ #include <new>
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1341: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_new_new="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_NEW_NEW_HEADER 1
+EOF
+ ac_cv_new_new="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_new_new" 1>&6
+
+
+echo $ac_n "checking for member template methods""... $ac_c" 1>&6
+echo "configure:1358: checking for member template methods" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1360 "configure"
+#include "confdefs.h"
+
+template <class Result>
+struct mt_foo {
+ typedef Result result_type;
+ template <class Arg> result_type operate(const Arg&) { return Result(); }
+};
+mt_foo<int> p;
+
+int main() {
+
+(void)p.operate((char*)"aaa");
+
+; return 0; }
+EOF
+if { (eval echo configure:1376: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_member_templates="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_MEMBER_TEMPLATES 1
+EOF
+ ac_cv_member_templates="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_member_templates" 1>&6
+
+echo $ac_n "checking for friend templates""... $ac_c" 1>&6
+echo "configure:1393: checking for friend templates" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1395 "configure"
+#include "confdefs.h"
+
+
+template <class Result2> class foo;
+
+template <class Result>
+struct ft_foo {
+ typedef Result result_type;
+ template <class Result2> friend class foo;
+};
+ft_foo<int> p;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1412: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_friend_templates="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_FRIEND_TEMPLATES 1
+EOF
+ ac_cv_friend_templates="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_friend_templates" 1>&6
+
+echo $ac_n "checking for qualified friend templates""... $ac_c" 1>&6
+echo "configure:1429: checking for qualified friend templates" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1431 "configure"
+#include "confdefs.h"
+
+
+${_TEST_STD_BEGIN}
+
+template <class Result2> class foo;
+
+template <class Result>
+struct ft_foo {
+ typedef Result result_type;
+ template <class Result2> friend class $_TEST_STD::foo;
+};
+ft_foo<int> p;
+${_TEST_STD_END}
+
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1452: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_qual_friend_templates="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_QUALIFIED_FRIENDS 1
+EOF
+ ac_cv_qual_friend_templates="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_qual_friend_templates" 1>&6
+
+echo $ac_n "checking for member template keyword""... $ac_c" 1>&6
+echo "configure:1469: checking for member template keyword" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1471 "configure"
+#include "confdefs.h"
+
+template <class Result>
+struct nt_foo {
+ typedef Result result_type;
+ template <class Arg> struct rebind { typedef nt_foo<Arg> other; };
+};
+
+template <class _Tp, class _Allocator>
+struct _Traits
+{
+ typedef typename _Allocator:: template rebind<_Tp> my_rebind;
+ typedef typename my_rebind::other allocator_type;
+};
+
+nt_foo<char> p;
+_Traits< int, nt_foo<short> > pp;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1494: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_member_template_keyword="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+EOF
+ ac_cv_member_template_keyword="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_member_template_keyword" 1>&6
+
+if test "$ac_cv_member_template_keyword" = "no"; then
+echo $ac_n "checking for member template classes""... $ac_c" 1>&6
+echo "configure:1512: checking for member template classes" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1514 "configure"
+#include "confdefs.h"
+
+template <class Result>
+struct nt_foo {
+ typedef Result result_type;
+ template <class Arg> struct rebind { typedef nt_foo<Arg> other; };
+};
+
+template <class _Tp, class _Allocator>
+struct _Traits
+{
+ typedef typename _Allocator::rebind<_Tp> my_rebind;
+ typedef typename my_rebind::other allocator_type;
+};
+
+nt_foo<char> p;
+_Traits< int, nt_foo<short> > pp;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1537: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_member_template_classes="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+EOF
+ ac_cv_member_template_classes="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_member_template_classes" 1>&6
+fi
+
+echo $ac_n "checking for partial class specialization""... $ac_c" 1>&6
+echo "configure:1555: checking for partial class specialization" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1557 "configure"
+#include "confdefs.h"
+
+template <class Arg,class Result>
+struct ps_foo {
+ typedef Arg argument_type;
+ typedef Result result_type;
+};
+
+template<class Result>
+struct ps_foo<Result*,Result*> {
+ void bar() {}
+};
+
+template<class Result>
+struct ps_foo<int*,Result> {
+ void foo() {}
+};
+
+ps_foo<char*, char*> p;
+ps_foo<int*, int> p1;
+
+int main() {
+p.bar();
+ p1.foo();
+; return 0; }
+EOF
+if { (eval echo configure:1584: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_partial_spec="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+EOF
+ ac_cv_partial_spec="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_partial_spec" 1>&6
+
+if test "$ac_cv_partial_spec" = yes; then
+
+echo $ac_n "checking if explicit args accepted on constructors of partial specialized classes""... $ac_c" 1>&6
+echo "configure:1603: checking if explicit args accepted on constructors of partial specialized classes" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1605 "configure"
+#include "confdefs.h"
+
+template <class Arg,class Result>
+struct ps_foo {
+ typedef Arg argument_type;
+ typedef Result result_type;
+};
+
+template<class Result>
+struct ps_foo<Result*,Result*> {
+ ps_foo<Result*,Result*>() {}
+ void bar() {}
+};
+
+template<class Result>
+struct ps_foo<int*,Result> {
+ ps_foo<int*,Result*>() {}
+ void bar() {}
+
+};
+
+ps_foo<char*, char*> p;
+ps_foo<int*, int> p1;
+
+int main() {
+p.bar();
+ p1.foo();
+; return 0; }
+EOF
+if { (eval echo configure:1635: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS 1
+EOF
+ ac_cv_partial_spec_needs_args="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_partial_spec_needs_args="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_partial_spec_needs_args" 1>&6
+
+fi
+
+if test ac_cv_partial_spec_needs_args=="no"; then
+
+echo $ac_n "checking if explicit args accepted on constructors of explicitly specialized classes""... $ac_c" 1>&6
+echo "configure:1656: checking if explicit args accepted on constructors of explicitly specialized classes" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1658 "configure"
+#include "confdefs.h"
+
+template <class Arg,class Result>
+struct ps_foo {
+ typedef Arg argument_type;
+ typedef Result result_type;
+ void bar() {}
+};
+
+template<class Result>
+struct ps_foo<int*,int> {
+ ps_foo<Result*,Result*>() {}
+ void foo() {}
+};
+
+ps_foo<char*, char*> p;
+ps_foo<int*, int> p1;
+
+int main() {
+p.bar();
+ p1.foo();
+; return 0; }
+EOF
+if { (eval echo configure:1682: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS 1
+EOF
+ ac_cv_partial_spec_needs_args="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_partial_spec_needs_args="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_partial_spec_needs_args" 1>&6
+
+fi
+
+echo $ac_n "checking for partial template function ordering""... $ac_c" 1>&6
+echo "configure:1701: checking for partial template function ordering" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1703 "configure"
+#include "confdefs.h"
+
+
+template <class Arg,class Result>
+Result po_foo (const Arg& a,const Result&){ return (Result)a.nothing; }
+
+template <class T>
+struct A {
+ T a;
+ A(int _a) : a(_a) {}
+};
+
+template<class T>
+T po_foo (const A<T>& a, const A<T>& b){ return a.a; }
+
+int main() {
+
+ A<int> po_a(0); A<int> po_b(1); (void)po_foo(po_b, po_a)
+
+; return 0; }
+EOF
+if { (eval echo configure:1725: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_partial_ord="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+EOF
+ ac_cv_partial_ord="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_partial_ord" 1>&6
+
+echo $ac_n "checking for method specialization""... $ac_c" 1>&6
+echo "configure:1742: checking for method specialization" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1744 "configure"
+#include "confdefs.h"
+
+template <class Arg,class Result>
+struct ms_foo {
+ typedef Arg argument_type;
+ typedef Result result_type;
+ inline void bar();
+};
+
+template <class Arg,class Result>
+inline void ms_foo<Arg,Result>::bar() {}
+
+inline void ms_foo<int*,int>::bar() {}
+
+ms_foo<char*, char*> p;
+ms_foo<int*, int> p1;
+
+int main() {
+p.bar();
+ p1.bar();
+; return 0; }
+EOF
+if { (eval echo configure:1767: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_method_spec="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_METHOD_SPECIALIZATION 1
+EOF
+ ac_cv_method_spec="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_method_spec" 1>&6
+
+echo $ac_n "checking for lrand48 function""... $ac_c" 1>&6
+echo "configure:1784: checking for lrand48 function" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1786 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+int main() {
+long i = lrand48();
+; return 0; }
+EOF
+if { (eval echo configure:1793: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_RAND48 1
+EOF
+ ac_cv_func_lrand48="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_func_lrand48="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_func_lrand48" 1>&6
+
+
+echo $ac_n "checking for default template parameters""... $ac_c" 1>&6
+echo "configure:1810: checking for default template parameters" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1812 "configure"
+#include "confdefs.h"
+template <class T> struct less {};
+ template <class T, class T1=less<T> > struct Class { T1 t1; };
+ Class<int> cl;
+ Class<int,less<short> > cl2;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1823: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_default_template_param="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+EOF
+ ac_cv_default_template_param="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_default_template_param" 1>&6
+if test "$ac_cv_default_template_param" = "no"; then
+ echo $ac_n "checking for default type parameters""... $ac_c" 1>&6
+echo "configure:1839: checking for default type parameters" >&5
+ cat > conftest.$ac_ext <<EOF
+#line 1841 "configure"
+#include "confdefs.h"
+
+template <class T> struct less {
+ typedef int int_t;
+ };
+
+template <class T, class T1=less<int> >
+struct Class {
+private:
+ int a;
+public:
+ typedef Class<T,T1> self;
+ typedef $__TYPENAME T1::int_t int_t;
+ self foo (const Class<T,T1>& t) {
+ if ( t.a==a ) return *this;
+ else return t;
+ }
+};
+
+Class<int> cl;
+Class<int,less<short> > cl2;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_DEFAULT_TYPE_PARAM 1
+EOF
+ ac_cv_default_type_param="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_default_type_param="no"
+fi
+rm -f conftest*
+ echo "$ac_t""$ac_cv_default_type_param" 1>&6
+
+fi
+
+
+echo $ac_n "checking for default non-type parameters""... $ac_c" 1>&6
+echo "configure:1887: checking for default non-type parameters" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1889 "configure"
+#include "confdefs.h"
+
+template <class T, int N=0 >
+struct Class {
+private:
+ T* t;
+ enum { t1=N };
+public:
+ int get_n() { return N; }
+};
+
+Class<int> cl;
+Class<int, 2> cl2;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1908: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_default_nontype_param="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+EOF
+ ac_cv_default_nontype_param="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_default_nontype_param" 1>&6
+
+echo $ac_n "checking for non-type parameter bug""... $ac_c" 1>&6
+echo "configure:1925: checking for non-type parameter bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1927 "configure"
+#include "confdefs.h"
+
+template <class T, int N>
+struct Class {
+private:
+ T* t;
+ enum { t1=N };
+public:
+ int get_n() { return N; }
+};
+
+template <class T, int N>
+int operator==(const Class<T,N>& , const Class<T,N>& ) { return 0; }
+
+Class<int, 1> cl;
+Class<int, 1> cl2;
+int i(cl==cl2);
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1950: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_nontype_param_bug="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+EOF
+ ac_cv_nontype_param_bug="yes"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_nontype_param_bug" 1>&6
+
+echo $ac_n "checking for static data member templates""... $ac_c" 1>&6
+echo "configure:1967: checking for static data member templates" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1969 "configure"
+#include "confdefs.h"
+template <class T> struct Class { static int a; };
+ template <class T> int Class<T>::a;
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1977: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_static_templates="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_STATIC_TEMPLATE_DATA 1
+EOF
+ ac_cv_static_templates="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_static_templates" 1>&6
+
+if test "$ac_cv_static_templates" = no; then
+ echo $ac_n "checking for weak attribute""... $ac_c" 1>&6
+echo "configure:1994: checking for weak attribute" >&5
+ cat > conftest.$ac_ext <<EOF
+#line 1996 "configure"
+#include "confdefs.h"
+int a_w __attribute__((weak));
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2003: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_WEAK_ATTRIBUTE 1
+EOF
+ ac_cv_weak_attribute="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_weak_attribute="no"
+fi
+rm -f conftest*
+ echo "$ac_t""$ac_cv_weak_attribute" 1>&6
+fi
+
+if test "$ac_cv_static_templates" = yes; then
+echo $ac_n "checking for static array member size bug""... $ac_c" 1>&6
+echo "configure:2021: checking for static array member size bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2023 "configure"
+#include "confdefs.h"
+template <class T> struct Class { enum { sz=5 }; static int a[sz]; };
+ template <class T> int Class<T>::a[Class<T>::sz];
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2031: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_static_array_bug="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_STATIC_ARRAY_BUG 1
+EOF
+ ac_cv_static_array_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_static_array_bug" 1>&6
+fi
+
+echo $ac_n "checking for static data member const initializer bug""... $ac_c" 1>&6
+echo "configure:2048: checking for static data member const initializer bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2050 "configure"
+#include "confdefs.h"
+template <class T> struct Class { static const int a = 1; };
+ template <class T> const int Class<T>::a;
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2058: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_static_init_bug="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_STATIC_CONST_INIT_BUG 1
+EOF
+ ac_cv_static_init_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_static_init_bug" 1>&6
+
+echo $ac_n "checking for namespaces support""... $ac_c" 1>&6
+echo "configure:2074: checking for namespaces support" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2076 "configure"
+#include "confdefs.h"
+class test_class {};
+ namespace std {
+ using ::test_class;
+ template <class T> struct Class { typedef T my_type; };
+ typedef Class<int>::my_type int_type;
+ };
+ inline int ns_foo (std::int_type t) {
+ using namespace std;
+ int_type i =2;
+ return i+t;
+ }
+
+int main() {
+(void)ns_foo(1);
+; return 0; }
+EOF
+if { (eval echo configure:2094: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ _TEST_STD="std" _TEST_STD_BEGIN="namespace $_TEST_STD" _TEST_STD_END="namespace $_TEST_STD" ac_cv_namespaces="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_HAS_NO_NAMESPACES 1
+EOF
+ _TEST_STD="" _TEST_STD_BEGIN="" _TEST_STD_END="" ac_cv_namespaces="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_namespaces" 1>&6
+
+echo $ac_n "checking for broken "using" directive""... $ac_c" 1>&6
+echo "configure:2110: checking for broken "using" directive" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2112 "configure"
+#include "confdefs.h"
+namespace std {
+ template <class T> struct Class { typedef T my_type; };
+ typedef Class<int>::my_type int_type;
+ template <class T> void foo(T,int) {}
+ template <class T> void foo(T,int,int) {}
+ };
+ using std::Class;
+ using std::foo;
+
+int main() {
+(void)foo(1,1);
+; return 0; }
+EOF
+if { (eval echo configure:2127: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_broken_using="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_broken_using="yes"
+fi
+rm -f conftest*
+if test "$ac_cv_broken_using" = no; then
+# check if no warnings have been issued
+ if `check_warning` ; then
+ ac_cv_broken_using=no
+ else
+ cat >> confdefs.h <<\EOF
+#define _STLP_BROKEN_USING_DIRECTIVE 1
+EOF
+
+ fi
+else
+ cat >> confdefs.h <<\EOF
+#define _STLP_BROKEN_USING_DIRECTIVE 1
+EOF
+
+fi
+echo "$ac_t""$ac_cv_broken_using" 1>&6
+
+
+if test "$ac_cv_namespaces" = yes; then
+# Check whether --enable-namespaces or --disable-namespaces was given.
+if test "${enable_namespaces+set}" = set; then
+ enableval="$enable_namespaces"
+
+case "$enableval" in
+ no) cat >> confdefs.h <<\EOF
+#define _STLP_NO_NAMESPACES 1
+EOF
+
+ _TEST_STD=""
+ _TEST_STD_BEGIN=""
+ _TEST_STD_END=""
+ echo "$ac_t""Config arg --disable-namespaces : code not put into namespace by user request" 1>&6;;
+ *) echo "$ac_t""Config default: code put into namespace" 1>&6
+esac
+
+else
+ echo "$ac_t""Config default: code put into namespace" 1>&6
+
+fi
+
+else
+ echo "$ac_t""Compiler restriction : no namespaces support used" 1>&6
+fi
+
+
+echo $ac_n "checking for exceptions support""... $ac_c" 1>&6
+echo "configure:2184: checking for exceptions support" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2186 "configure"
+#include "confdefs.h"
+int ex_foo() {
+ try {
+ try { throw(1); }
+ catch (int a) { throw; }
+ } catch (...) {;}
+ return 0;
+ }
+int main() {
+(void)ex_foo();
+; return 0; }
+EOF
+if { (eval echo configure:2199: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_exceptions="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_HAS_NO_EXCEPTIONS 1
+EOF
+ ac_cv_exceptions="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_exceptions" 1>&6
+
+if test "$ac_cv_exceptions" = yes; then
+
+echo $ac_n "checking if exceptions specification works""... $ac_c" 1>&6
+echo "configure:2217: checking if exceptions specification works" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2219 "configure"
+#include "confdefs.h"
+template <class T> inline int ex_spec_foo(const T&) throw () { return 0;}
+int main() {
+(void)ex_spec_foo(5);
+; return 0; }
+EOF
+if { (eval echo configure:2226: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_exception_spec="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_EXCEPTION_SPEC 1
+EOF
+ ac_cv_exception_spec="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_exception_spec" 1>&6
+
+echo $ac_n "checking if return is required after throw""... $ac_c" 1>&6
+echo "configure:2242: checking if return is required after throw" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2244 "configure"
+#include "confdefs.h"
+int ex_foo() {
+ try {
+ try { throw(1); }
+ catch (int a) { throw; }
+ } catch (...) {;}
+ return 0;
+ }
+int main() {
+(void)ex_foo();
+; return 0; }
+EOF
+if { (eval echo configure:2257: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_throw_return_bug="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_THROW_RETURN_BUG 1
+EOF
+ ac_cv_throw_return_bug="yes"
+fi
+rm -f conftest*
+
+ if test "$ac_cv_throw_return_bug" = no; then
+ # check if no warnings have been issued
+ if `check_warning` ; then
+ ac_cv_throw_return_bug="no"
+ else
+ cat >> confdefs.h <<\EOF
+#define _STLP_THROW_RETURN_BUG 1
+EOF
+
+ ac_cv_throw_return_bug="yes"
+ fi
+ fi
+echo "$ac_t""$ac_cv_throw_return_bug" 1>&6
+
+fi
+
+echo $ac_n "checking for native <string> header with basic_string defined ""... $ac_c" 1>&6
+echo "configure:2288: checking for native <string> header with basic_string defined " >&5
+cat > conftest.$ac_ext <<EOF
+#line 2290 "configure"
+#include "confdefs.h"
+
+ #include <string>
+ # if !defined (_STLP_HAS_NO_NAMESPACES)
+ using namespace $_TEST_STD;
+ # endif
+ basic_string<char, char_traits<char>, allocator<char> > bs;
+ string bd = bs;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2304: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_string_header="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_STRING_HEADER 1
+EOF
+ ac_cv_string_header="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_string_header" 1>&6
+
+if test "$ac_cv_string_header" = yes; then
+echo $ac_n "checking for native <stdexcept> header""... $ac_c" 1>&6
+echo "configure:2322: checking for native <stdexcept> header" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2324 "configure"
+#include "confdefs.h"
+
+ #include <stdexcept>
+ # if !defined (_STLP_HAS_NO_NAMESPACES)
+ using namespace $_TEST_STD;
+ # endif
+ string s;
+ logic_error le(s);
+ runtime_error re(s);
+ domain_error de(s);
+ invalid_argument ia(s);
+ length_error lne(s);
+ out_of_range or(s);
+ range_error rne(s);
+ overflow_error ove(s);
+ underflow_error ue(s);
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2346: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_stdexcept_header="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_STDEXCEPT_HEADER 1
+EOF
+ ac_cv_stdexcept_header="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_stdexcept_header" 1>&6
+
+echo $ac_n "checking for new iostreams""... $ac_c" 1>&6
+echo "configure:2363: checking for new iostreams" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2365 "configure"
+#include "confdefs.h"
+
+ #include <iosfwd>
+ #include <iostream>
+ # if !defined (_STLP_HAS_NO_NAMESPACES)
+ using namespace $_TEST_STD;
+ # endif
+
+ template <class _Tp, class _Traits>
+ void outp(basic_ostream<_Tp,_Traits>& o, char* str) {
+ o<<str;
+ }
+
+int main() {
+
+ outp(cout, "Hello World\n")
+
+; return 0; }
+EOF
+if { (eval echo configure:2385: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_newstreams="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_HAS_NO_NEW_IOSTREAMS 1
+EOF
+ ac_cv_newstreams="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_newstreams" 1>&6
+
+
+fi
+
+echo $ac_n "checking for <exception> header with class "exception" defined""... $ac_c" 1>&6
+echo "configure:2404: checking for <exception> header with class "exception" defined" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2406 "configure"
+#include "confdefs.h"
+
+ #include <exception>
+ # if !defined (_STLP_HAS_NO_NAMESPACES)
+ using namespace $_TEST_STD;
+ # endif
+ class my_exception: public $_TEST_STD::exception {};
+ my_exception mm;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2420: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_exception_header="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_EXCEPTION_HEADER 1
+EOF
+ ac_cv_exception_header="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_exception_header" 1>&6
+
+echo $ac_n "checking builtin constructor bug""... $ac_c" 1>&6
+echo "configure:2437: checking builtin constructor bug" >&5
+if test "$cross_compiling" = yes; then
+ cat >> confdefs.h <<\EOF
+#define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+EOF
+ ac_cv_builtin_c_bug="yes"
+
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2446 "configure"
+#include "confdefs.h"
+#ifdef __cplusplus
+extern "C" void exit(int);
+#endif
+
+# ifdef _STLP_USE_NEW_STYLE_HEADERS
+# include <cassert>
+# include <cstdio>
+# include <cstring>
+# include <new>
+# else
+# include <assert.h>
+# include <stdio.h>
+# include <string.h>
+# include <new.h>
+# endif
+int main(int, char**) {
+ int i;
+ double buf[1000];
+ char* pc = (char*)buf;
+ short* ps = (short*)buf;
+ int* pi = (int*)buf;
+ long* pl = (long*)buf;
+ double* pd = (double*)buf;
+ float* pf = (float*)buf;
+ for (i=0; i<100; i++) {
+ new(pc) char();
+ assert(char()==0 && *pc==0);
+ sprintf(pc,"lalala\n");
+ new (ps) short();
+ assert(short()==0 && *ps ==0);
+ sprintf(pc,"lalala\n");
+ new (pi) int();
+ assert(int()==0 && *pi == 0);
+ sprintf(pc,"lalala\n");
+ new (pl) long();
+ assert(long()==0 && *pl == 0);
+ sprintf(pc,"lalala\n");
+ new (pf) float();
+ assert(float()==0.0 && *pf == 0.0);
+ sprintf(pc,"lalala\n");
+ new (pd) double();
+ assert(double()==0.0 && *pd == 0.0);
+ sprintf(pc,"lalala\n");
+ }
+ return 0;
+}
+
+EOF
+if { (eval echo configure:2496: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_builtin_c_bug="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+EOF
+ ac_cv_builtin_c_bug="yes"
+fi
+rm -fr conftest*
+fi
+
+echo "$ac_t""$ac_cv_builtin_c_bug" 1>&6
+
+echo $ac_n "checking for trivial constructor bug""... $ac_c" 1>&6
+echo "configure:2514: checking for trivial constructor bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2516 "configure"
+#include "confdefs.h"
+struct output_iterator_tag {};
+ void tc_bug_foo(output_iterator_tag) {}
+ inline void tc_test_foo() { tc_bug_foo(output_iterator_tag()); }
+int main() {
+tc_test_foo();
+; return 0; }
+EOF
+if { (eval echo configure:2525: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_tc_bug="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_TRIVIAL_CONSTRUCTOR_BUG 1
+EOF
+ ac_cv_tc_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_tc_bug" 1>&6
+
+echo $ac_n "checking for trivial destructor bug""... $ac_c" 1>&6
+echo "configure:2541: checking for trivial destructor bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2543 "configure"
+#include "confdefs.h"
+struct output_iterator_tag {output_iterator_tag() {} };
+ output_iterator_tag* td_bug_bar ;
+
+int main() {
+ td_bug_bar->~output_iterator_tag();
+
+; return 0; }
+EOF
+if { (eval echo configure:2553: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_td_bug="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_TRIVIAL_DESTRUCTOR_BUG 1
+EOF
+ ac_cv_td_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_td_bug" 1>&6
+
+echo $ac_n "checking for explicit function template arguments""... $ac_c" 1>&6
+echo "configure:2569: checking for explicit function template arguments" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2571 "configure"
+#include "confdefs.h"
+ template <class T> class foo;
+ template<class T> bool operator==(const foo<T>& lhs,const foo<T>& rhs);
+ template <class T> class foo {
+ private:
+ T bar;
+ friend bool operator== <> (const foo<T>&,const foo<T>&);
+ };
+ template<class T> bool operator==(const foo<T>& lhs,const foo<T>& rhs) {
+ return lhs.bar==rhs.bar;
+ }
+int main() {
+ foo<int> f1, f2;
+ int ret= (f1==f2)
+; return 0; }
+EOF
+if { (eval echo configure:2588: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ _NULLARGS="<>" ac_cv_expl_fun_args="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+EOF
+ ac_cv_expl_fun_args="no" _NULLARGS=""
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_expl_fun_args" 1>&6
+
+echo $ac_n "checking for template parameter baseclass matching""... $ac_c" 1>&6
+echo "configure:2604: checking for template parameter baseclass matching" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2606 "configure"
+#include "confdefs.h"
+struct output_iterator_tag {};
+ struct derived1_tag : public output_iterator_tag {};
+ struct derived2_tag : public derived1_tag {};
+ template<class T> struct output_iterator {
+ public:
+ output_iterator() {}
+ ~output_iterator() {}
+ friend inline int operator== $_NULLARGS (const output_iterator<T>&,
+ const output_iterator<T>&);
+ };
+ template<class T> inline int operator==(const output_iterator<T>&,
+ const output_iterator<T>&) {
+ return 0;
+ }
+ template<class T> inline output_iterator_tag
+ iterator_category(const output_iterator<T>&) {return output_iterator_tag();}
+ template <class T>
+ struct derived_iterator : public output_iterator<T> {
+ public:
+ derived_iterator() {}
+ ~derived_iterator() {}
+ };
+ template<class T> inline T select_foo(T t, output_iterator_tag) { return t;}
+ template<class T> inline int select_foo_2(T, T,
+ output_iterator_tag) { return 0;}
+ template<class T> inline T tbase_foo(T pm ) {
+ derived_iterator<T> di1, di2; int i( di1==di2 && pm);
+ return select_foo((int)1,iterator_category(derived_iterator<T>()));
+ }
+
+int main() {
+ (void)tbase_foo((int)1);
+; return 0; }
+EOF
+if { (eval echo configure:2642: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_base_match="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_BASE_MATCH_BUG 1
+EOF
+ ac_cv_base_match="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_base_match" 1>&6
+
+echo $ac_n "checking for non-template parameter baseclass matching ""... $ac_c" 1>&6
+echo "configure:2658: checking for non-template parameter baseclass matching " >&5
+cat > conftest.$ac_ext <<EOF
+#line 2660 "configure"
+#include "confdefs.h"
+struct output_iterator_tag {};
+ struct derived1_tag : public output_iterator_tag {};
+ struct derived2_tag : public derived1_tag {};
+ struct derived3_tag : public derived2_tag {};
+ template<class T> struct output_iterator {
+ public:
+ output_iterator() {}
+ ~output_iterator() {}
+ };
+ template<class T> inline output_iterator_tag
+ iterator_category(const output_iterator<T>&) {return output_iterator_tag();}
+ template <class T>
+ struct derived_iterator : public output_iterator<T> {
+ public:
+ derived_iterator() {}
+ ~derived_iterator() {}
+ };
+ template<class T> inline int select_foo_2(T, T,
+ output_iterator_tag) { return 0;}
+ template<class T> inline int select_foo_2(T, T,
+ derived1_tag) { return 0;}
+ template<class T> inline void nont_base_foo(T pm ) {
+ derived_iterator<T> di1, di2;
+ (void)select_foo_2(di1, (const derived_iterator<T>&)di2, derived3_tag());
+ }
+
+int main() {
+ nont_base_foo((int)1);
+; return 0; }
+EOF
+if { (eval echo configure:2692: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_nont_base_match="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+EOF
+ ac_cv_nont_base_match="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_nont_base_match" 1>&6
+
+echo $ac_n "checking for nested type parameters bug""... $ac_c" 1>&6
+echo "configure:2708: checking for nested type parameters bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2710 "configure"
+#include "confdefs.h"
+template<class T> struct nt_o { typedef int ii; inline ii foo(ii);};
+ template <class T> inline nt_o<T>::ii nt_o<T>::foo(ii) { return 0; }
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2718: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_nested_type_param_bug="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NESTED_TYPE_PARAM_BUG 1
+EOF
+ ac_cv_nested_type_param_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_nested_type_param_bug" 1>&6
+
+
+echo $ac_n "checking if inherited template typedefs broken completely""... $ac_c" 1>&6
+echo "configure:2735: checking if inherited template typedefs broken completely" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2737 "configure"
+#include "confdefs.h"
+
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+ typedef Arg1 first_argument_type;
+ typedef Arg2 second_argument_type;
+ typedef Result result_type;
+};
+
+template <class T>
+struct equal_to : public binary_function<T, T, int> {
+ int operator()(const T& x, const T& y) const { return x == y; }
+};
+
+template <class Predicate>
+class binary_negate
+ : public binary_function<$__TYPENAME Predicate::first_argument_type,
+ $__TYPENAME Predicate::second_argument_type,
+ int> {
+protected:
+ Predicate pred;
+public:
+ binary_negate(const Predicate& x = Predicate()) : pred(x) {}
+ int operator() (const $__TYPENAME Predicate::first_argument_type& x,
+ const $__TYPENAME Predicate::second_argument_type& y) const {
+ return !pred(x, y);
+ }
+};
+ typedef equal_to<int> eq_int;
+ typedef binary_negate<equal_to<int> > int_negate;
+ int_negate n;
+
+int main() {
+
+ (void)n(1,2);
+
+; return 0; }
+EOF
+if { (eval echo configure:2776: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_typebug="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_BASE_TYPEDEF_BUG 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+EOF
+ ac_cv_typebug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_typebug" 1>&6
+
+echo $ac_n "checking if inherited typedefs visible from outside""... $ac_c" 1>&6
+echo "configure:2796: checking if inherited typedefs visible from outside" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2798 "configure"
+#include "confdefs.h"
+
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+ typedef Arg1 first_argument_type;
+ typedef Arg1 second_argument_type;
+ typedef Result result_type;
+};
+
+
+template <class T>
+class plus : public binary_function<T, T, T> {
+public:
+ plus() {}
+ plus(const T&) {}
+ T operator()(const T& x, const T& y) const { return x + y; };
+};
+
+plus<int> p;
+plus<int>::first_argument_type a;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2824: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_outside_typedef="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+EOF
+ ac_cv_outside_typedef="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_outside_typedef" 1>&6
+
+# fi
+
+echo $ac_n "checking if private type static members initializable""... $ac_c" 1>&6
+echo "configure:2842: checking if private type static members initializable" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2844 "configure"
+#include "confdefs.h"
+struct p_Class { private: struct str_ {
+ int a; str_(int i) : a(i) {}}; static str_ my_int;
+ };
+ p_Class::str_ p_Class::my_int(0);
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2855: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_private="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_UNINITIALIZABLE_PRIVATE 1
+EOF
+ ac_cv_private="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_private" 1>&6
+
+
+echo $ac_n "checking for const member constructor bug""... $ac_c" 1>&6
+echo "configure:2872: checking for const member constructor bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2874 "configure"
+#include "confdefs.h"
+
+template <class T1, class T2>
+struct pair {
+ T1 first;
+ T2 second;
+ pair(): first(T1()), second(T2()) {}
+ pair(const pair<T1,T2>& o) : first(o.first), second(o.second) {}
+};
+pair< const int, const int > p;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2890: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_const_constructor_bug="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_CONST_CONSTRUCTOR_BUG 1
+EOF
+ ac_cv_const_constructor_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_const_constructor_bug" 1>&6
+
+echo $ac_n "checking for loop inline problems""... $ac_c" 1>&6
+echo "configure:2906: checking for loop inline problems" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2908 "configure"
+#include "confdefs.h"
+inline int il_foo (int a) {
+ int i; for (i=0; i<a; i++) a+=a; while (i>0) a-=3; return a; }
+int main() {
+(void)il_foo(2);
+; return 0; }
+EOF
+if { (eval echo configure:2916: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_inline_problems="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_LOOP_INLINE_PROBLEMS 1
+EOF
+ ac_cv_inline_problems="yes"
+fi
+rm -f conftest*
+if test "$ac_cv_inline_problems" = no; then
+# check if no warnings have been issued
+ if `check_warning` ; then
+ ac_cv_inline_problems="no"
+ else
+ cat >> confdefs.h <<\EOF
+#define _STLP_LOOP_INLINE_PROBLEMS 1
+EOF
+
+ ac_cv_inline_problems="yes"
+ fi
+fi
+echo "$ac_t""$ac_cv_inline_problems" 1>&6
+
+
+echo $ac_n "checking if arrow operator always get instantiated""... $ac_c" 1>&6
+echo "configure:2945: checking if arrow operator always get instantiated" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2947 "configure"
+#include "confdefs.h"
+
+ template <class T> struct um_foo { T* ptr;
+ T* operator ->() { return &(operator*());}
+ T operator *() { return *ptr; }
+ };
+ template <class T>
+ int operator == ( const um_foo<T>& x, const um_foo<T>& y)
+ {
+ return *x == *y;
+ }
+ struct um_tag { int a ; };
+ um_foo<um_tag> f;
+ um_foo<int> a;
+
+int main() {
+
+ int b(5); a.ptr=&b;
+; return 0; }
+EOF
+if { (eval echo configure:2968: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_cv_unused_required="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_ARROW_OPERATOR 1
+EOF
+ ac_cv_unused_required="yes"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_unused_required" 1>&6
+
+echo $ac_n "checking for pointer-to-member parameter bug""... $ac_c" 1>&6
+echo "configure:2985: checking for pointer-to-member parameter bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2987 "configure"
+#include "confdefs.h"
+
+struct pmf_foo {
+ int bar() { return 0; };
+};
+
+template <class Class, class Result>
+class mem_fun_t {
+protected:
+ typedef Result (Class::*fun_type)(void);
+ fun_type ptr;
+public:
+ mem_fun_t() {}
+ mem_fun_t(fun_type p) : ptr(p) {}
+ Result operator()(Class* x) const { return (x->*ptr)();}
+};
+
+template <class Class, class Result>
+inline mem_fun_t <Class, Result>
+mem_fun(Result (Class::*ptr)(void)) {
+ return mem_fun_t<Class, Result>(ptr);
+}
+
+int main() {
+pmf_foo pmf; (void)mem_fun(&pmf_foo::bar)(&pmf)
+; return 0; }
+EOF
+if { (eval echo configure:3015: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_pmf_bug="no"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_MEMBER_POINTER_PARAM_BUG 1
+EOF
+ ac_cv_pmf_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_pmf_bug" 1>&6
+
+echo $ac_n "checking if bad_alloc defined in <new>""... $ac_c" 1>&6
+echo "configure:3031: checking if bad_alloc defined in <new>" >&5
+cat > conftest.$ac_ext <<EOF
+#line 3033 "configure"
+#include "confdefs.h"
+
+ #if !defined (_STLP_NO_NEW_STYLE_HEADERS)
+ #include <new>
+ #else
+ #include <new.h>
+ #endif
+
+ # if !defined (_STLP_HAS_NO_NAMESPACES)
+ using namespace $_TEST_STD;
+ # endif
+
+ bad_alloc badalloc_foo() { bad_alloc err; return err;}
+int main() {
+(void)badalloc_foo()
+; return 0; }
+EOF
+if { (eval echo configure:3051: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_bad_alloc="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_BAD_ALLOC 1
+EOF
+ ac_cv_bad_alloc="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_bad_alloc" 1>&6
+
+echo $ac_n "checking for __type_traits automatic specialization""... $ac_c" 1>&6
+echo "configure:3067: checking for __type_traits automatic specialization" >&5
+cat > conftest.$ac_ext <<EOF
+#line 3069 "configure"
+#include "confdefs.h"
+template <class T> int tt_foo(const T&) {
+ typedef __type_traits<T> traits;
+ return 0;
+ }
+int main() {
+(void)tt_foo(5)
+; return 0; }
+EOF
+if { (eval echo configure:3079: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define _STLP_AUTOMATIC_TYPE_TRAITS 1
+EOF
+ ac_cv_type_traits="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_type_traits="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_type_traits" 1>&6
+
+
+# package options - exceptions
+echo "$ac_t""***" 1>&6
+echo "$ac_t""$0: Setting implementation options..." 1>&6
+echo "$ac_t""***" 1>&6
+
+if test "$ac_cv_exceptions" = yes; then
+# Check whether --enable-exceptions or --disable-exceptions was given.
+if test "${enable_exceptions+set}" = set; then
+ enableval="$enable_exceptions"
+
+case "$enableval" in
+ no) cat >> confdefs.h <<\EOF
+#define _STLP_NO_EXCEPTIONS 1
+EOF
+
+ echo "$ac_t""Config arg --disable-exceptions : disabling exceptions by user request" 1>&6;;
+ *) echo "$ac_t""Config default: exceptions enabled" 1>&6
+esac
+
+else
+ echo "$ac_t""Config default: exceptions enabled" 1>&6
+
+fi
+
+else
+ echo "$ac_t""Compiler restriction : no exceptions support used" 1>&6
+fi
+
+if test "$ac_cv_namespaces" = yes; then
+# Check whether --enable-relops or --disable-relops was given.
+if test "${enable_relops+set}" = set; then
+ enableval="$enable_relops"
+
+case "$enableval" in
+ no) cat >> confdefs.h <<\EOF
+#define _STLP_NO_RELOPS_NAMESPACE 1
+EOF
+
+ echo "$ac_t""Config arg --disable-relops : no std::rel_ops namespace by user request" 1>&6;;
+ *) echo "$ac_t""Config default: Separate std::rel_ops namespace for relational operators" 1>&6
+esac
+
+else
+ echo "$ac_t""Config default: Separate std::rel_ops namespace for relational operators" 1>&6
+
+fi
+
+else
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_RELOPS_NAMESPACE 1
+EOF
+
+fi
+
+if test "$ac_cv_newheaders" = yes; then
+# Check whether --enable-new-style-headers or --disable-new-style-headers was given.
+if test "${enable_new_style_headers+set}" = set; then
+ enableval="$enable_new_style_headers"
+
+case "$enableval" in
+ no) cat >> confdefs.h <<\EOF
+#define _STLP_NO_NEW_STYLE_HEADERS 1
+EOF
+
+ echo "$ac_t""Config arg --disable-new-style-headers : not using new-style headers" 1>&6;;
+ *) echo "$ac_t""Config default: using new-style headers" 1>&6
+esac
+
+else
+ echo "$ac_t""Config default: using new-style headers" 1>&6
+
+fi
+
+else
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_NEW_STYLE_HEADERS 1
+EOF
+
+fi
+
+if test "$ac_cv_newstreams" = yes; then
+# Check whether --enable-new-iostreams or --disable-new-iostreams was given.
+if test "${enable_new_iostreams+set}" = set; then
+ enableval="$enable_new_iostreams"
+
+case "$enableval" in
+ no) cat >> confdefs.h <<\EOF
+#define _STLP_NO_NEW_IOSTREAMS 1
+EOF
+
+ echo "$ac_t""Config arg --disable-new-iostreams : not using new iostreams" 1>&6;;
+ *) echo "$ac_t""Config default: using new iostreams" 1>&6
+esac
+
+else
+ echo "$ac_t""Config default: using new iostreams" 1>&6
+
+fi
+
+else
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_NEW_IOSTREAMS 1
+EOF
+
+fi
+
+# Check whether --enable-sgi-allocators or --disable-sgi-allocators was given.
+if test "${enable_sgi_allocators+set}" = set; then
+ enableval="$enable_sgi_allocators"
+
+case "$enableval" in
+ yes ) echo "$ac_t""Config arg --enable-sgi-allocators : SGI-style alloc as default allocator" 1>&6
+ cat >> confdefs.h <<\EOF
+#define _STLP_USE_RAW_SGI_ALLOCATORS 1
+EOF
+;;
+ * ) echo "$ac_t""Config default: using allocator<T> as default allocator if possible " 1>&6
+esac
+
+else
+
+ echo "$ac_t""Config default: using allocator<T> as default allocator if possible" 1>&6
+
+
+fi
+
+
+# Check whether --enable-malloc or --disable-malloc was given.
+if test "${enable_malloc+set}" = set; then
+ enableval="$enable_malloc"
+
+case "$enableval" in
+ yes ) echo "$ac_t""Config arg --enable-malloc : setting malloc_alloc as default alloc" 1>&6
+ cat >> confdefs.h <<\EOF
+#define _STLP_USE_MALLOC 1
+EOF
+;;
+ * ) echo "$ac_t""Config default: not using malloc_alloc as default alloc" 1>&6
+esac
+
+else
+
+ echo "$ac_t""Config default: not using malloc_alloc as default alloc" 1>&6
+
+
+fi
+
+
+# Check whether --enable-newalloc or --disable-newalloc was given.
+if test "${enable_newalloc+set}" = set; then
+ enableval="$enable_newalloc"
+
+case "$enableval" in
+ yes ) echo "$ac_t""Config arg --enable-newalloc : setting new_alloc as default alloc" 1>&6
+ cat >> confdefs.h <<\EOF
+#define _STLP_USE_NEWALLOC 1
+EOF
+;;
+ * )
+ echo "$ac_t""Config default: not using new_alloc as default alloc" 1>&6
+esac
+
+else
+
+ echo "$ac_t""Config default: not using new_alloc as default alloc" 1>&6
+
+
+fi
+
+
+# Check whether --enable-defalloc or --disable-defalloc was given.
+if test "${enable_defalloc+set}" = set; then
+ enableval="$enable_defalloc"
+
+case "$enableval" in
+ no ) echo "$ac_t""Config arg --disable-defalloc : not including HP-style defalloc.h into alloc.h" 1>&6;;
+
+ * ) echo "$ac_t""Config default : including HP-style defalloc.h into alloc.h" 1>&6
+ cat >> confdefs.h <<\EOF
+#define _STLP_USE_DEFALLOC 1
+EOF
+
+esac
+
+else
+
+ echo "$ac_t""Config default : not including HP-style defalloc.h into alloc.h" 1>&6
+
+
+fi
+
+
+
+# Check whether --enable-debugalloc or --disable-debugalloc was given.
+if test "${enable_debugalloc+set}" = set; then
+ enableval="$enable_debugalloc"
+
+case "$enableval" in
+ yes ) echo "$ac_t""Config arg --enable-debugalloc : use debug versions of allocators " 1>&6
+ cat >> confdefs.h <<\EOF
+#define _STLP_DEBUG_ALLOC 1
+EOF
+;;
+ * )
+ echo "$ac_t""Config default : not using debug allocators" 1>&6
+esac
+
+else
+
+ echo "$ac_t""Config default : not using debug allocators" 1>&6
+
+
+fi
+
+
+
+# Check whether --enable-abbrevs or --disable-abbrevs was given.
+if test "${enable_abbrevs+set}" = set; then
+ enableval="$enable_abbrevs"
+
+case "$enableval" in
+ yes ) echo "$ac_t""Config arg --enable-abbrevs : using abbreviated class names internally" 1>&6
+ cat >> confdefs.h <<\EOF
+#define _STLP_USE_ABBREVS 1
+EOF
+;;
+ * )
+ echo "$ac_t""Config default : not using abbreviated class names internally" 1>&6
+esac
+
+else
+
+ echo "$ac_t""Config default : not using abbreviated class names internally" 1>&6
+
+
+fi
+
+
+
+cat >> confdefs.h <<\EOF
+#define __AUTO_CONFIGURED 1
+EOF
+
+
+echo "$ac_t""***" 1>&6
+echo "$ac_t""$0: setting up headers..." 1>&6
+echo "$ac_t""***" 1>&6
+trap '' 1 2 15
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.12"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+
+trap 'rm -fr `echo "stlconf.h stlconf.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@CXX@%$CXX%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"stlconf.h"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="stlconf.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+echo "$ac_t""***" 1>&6
+echo "$ac_t""$0: STLport configured for use with \"${CXX}\" compiler" 1>&6
+echo "$ac_t""$0: To restore original settings - run \"./unconfigure\" or copy stlconf.h.in to stlconf.h." 1>&6
+echo "$ac_t""***" 1>&6
+
diff --git a/src/STLport/config/new_compiler/configure.in b/src/STLport/config/new_compiler/configure.in
new file mode 100644
index 0000000..3b7a5ef
--- /dev/null
+++ b/src/STLport/config/new_compiler/configure.in
@@ -0,0 +1,1424 @@
+dnl Disable any caching here
+define([AC_CACHE_LOAD], )dnl
+define([AC_CACHE_SAVE], )dnl
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(stlconf.h.in)
+AC_CONFIG_HEADER(stlconf.h)
+
+AC_MSG_RESULT(*** $0: STLport configuration utility ***)
+if test "${CXXFLAGS}" = ""; then
+AC_MSG_RESULT(* Note: for best reliability - try \"CXXFLAGS=-treat_warnings_as_errors\" $0 )
+AC_MSG_RESULT(* Please don't forget specifying typical CXXFLAGS you'll be using - )
+AC_MSG_RESULT(* such as that enabling exceptions handling, etc. )
+dnl AC_MSG_RESULT(* Add option forcing instantiation of all templates to CXXFLAGS if possible. )
+fi
+AC_MSG_RESULT(Please stand by while exploring compiler capabilities...)
+AC_MSG_RESULT(Be patient - that may take a while...)
+AC_MSG_RESULT(***)
+
+# utility function
+check_warning () {
+ warn_str=`tail -1 config.log | egrep -i "arning|\(W\)"`
+ if test "$warn_str" = ""; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+dnl Checks for systems
+dnl AC_AIX
+dnl Checks for programs.
+dnl sets CXX
+
+AC_ARG_ENABLE(extension,[--enable-extension=<ext>],
+[
+case "$enableval" in
+ no) AC_MSG_RESULT(Info :.cpp used as extension for tests)
+ ac_ext=cpp
+ ;;
+ *) AC_MSG_RESULT(Argument : .$enableval used as extension)
+ ac_ext=$enableval
+esac
+],
+[AC_MSG_RESULT(Info : .cpp used as extension for tests)
+ ac_ext=cpp
+]
+)
+
+# Save that, as it is being redefined several times
+use_ac_ext=$ac_ext
+
+AC_PROG_CXX
+ac_ext=$use_ac_ext
+
+AC_LANG_CPLUSPLUS
+ac_ext=$use_ac_ext
+
+AC_CHECK_SIZEOF(int,4)
+ac_ext=$use_ac_ext
+
+if test "$ac_cv_sizeof_int" = "4"; then
+ AC_DEFINE_UNQUOTED(_STLP_UINT32_T,unsigned int)
+else
+ AC_CHECK_SIZEOF(long,4)
+ ac_ext=$use_ac_ext
+ if test "$ac_cv_sizeof_long" = "4"; then
+ AC_DEFINE_UNQUOTED(_STLP_UINT32_T,unsigned long)
+ else
+ dnl ELBRUS ??? ;)
+ AC_CHECK_SIZEOF(short,4)
+ if test "$ac_cv_sizeof_short" = "4"; then
+ AC_DEFINE_UNQUOTED(_STLP_UINT32_T,unsigned short)
+ else
+ AC_MSG_ERROR(Cannot find any 32-bit integer type for your compiler)
+ fi
+ ac_ext=$use_ac_ext
+ fi
+fi
+ac_ext=$use_ac_ext
+
+
+dnl Exclude link stage for cross-compilation
+if test "$ac_cv_c_cross" = "yes"; then
+ CXXFLAGS="${CXXFLAGS} -c"
+fi
+
+ac_ext=$use_ac_ext
+
+dnl checking for compiler capabilities
+AC_MSG_CHECKING(for basic STL compatibility)
+AC_TRY_LINK( [
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+ typedef Arg1 first_argument_type;
+ typedef Arg2 second_argument_type;
+ typedef Result result_type;
+};
+template <class T>
+struct plus : public binary_function<T, T, T> {
+ T operator()(const T& x, const T& y) const;
+};
+
+template <class T>
+T plus<T>::operator()(const T& x, const T& y) const { return x + y; }
+plus<int> p;
+],
+[],
+[ac_cv_compat="yes"],
+[AC_MSG_ERROR(Your compiler won't be able to compile this implementation. Sorry.)
+ ac_cv_compat="no"]
+)
+AC_MSG_RESULT($ac_cv_compat)
+
+AC_MSG_CHECKING(for partial specialization syntax)
+AC_TRY_LINK(
+ [
+ template <class T> class fs_foo {};
+ template <> class fs_foo<int> {};],
+ [ fs_foo<int> i;],
+ [ _FULL_SPEC="template <>" ac_cv_spec_syntax="yes"],
+ [ AC_DEFINE(_STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX) ac_cv_spec_syntax="no" _FULL_SPEC=""])
+AC_MSG_RESULT($ac_cv_spec_syntax)
+
+AC_MSG_CHECKING(for bool keyword)
+AC_TRY_COMPILE(
+ [bool b_foo() { return true; }],
+ [(void)b_foo();],
+ [ac_cv_bool="yes"],
+ [AC_DEFINE(_STLP_NO_BOOL) ac_cv_bool="no"])
+AC_MSG_RESULT($ac_cv_bool)
+if test "$ac_cv_bool" = "no"; then
+ AC_MSG_CHECKING(for yvals.h header)
+ AC_TRY_COMPILE([#include <yvals.h>
+ extern bool aaa=true;
+ ], [],
+ [AC_DEFINE(_STLP_YVALS_H) AC_MSG_RESULT(yes) ],
+ [
+ AC_MSG_RESULT(no)
+ AC_MSG_CHECKING(whether bool is reserved word)
+ AC_TRY_COMPILE(
+ [typedef int bool;],
+ [],
+ [ac_cv_bool_reserved="no"],
+ [AC_DEFINE(_STLP_DONT_USE_BOOL_TYPEDEF) ac_cv_bool_reserved="yes"])
+ AC_MSG_RESULT($ac_cv_bool_reserved)
+ ])
+fi
+
+AC_MSG_CHECKING(for wchar_t type)
+AC_TRY_COMPILE(
+ [ #include <wchar.h>
+ wchar_t wc_foo() { return 'a'; }],
+ [(void)wc_foo();],
+ [ac_cv_wchar="yes"],
+ [AC_DEFINE(_STLP_NO_WCHAR_T) ac_cv_wchar="no"])
+AC_MSG_RESULT($ac_cv_wchar)
+
+AC_MSG_CHECKING(if wchar_t is unsigned short)
+AC_TRY_COMPILE(
+ [
+ # include <wchar.h>
+ template <class T> struct foo {};
+ $_FULL_SPEC struct foo <wchar_t> {};
+ typedef unsigned short u__short;
+ $_FULL_SPEC struct foo <u__short> {};
+ foo<wchar_t> f1;
+ foo<u__short> f2;
+ ],
+ [],
+ [ac_cv_wchar_short="no"],
+ [AC_DEFINE(_STLP_WCHAR_T_IS_USHORT) ac_cv_wchar_short="yes"])
+AC_MSG_RESULT($ac_cv_wchar_short)
+
+AC_MSG_CHECKING(for long long type)
+AC_TRY_COMPILE(
+ [long long ll_foo() { return 0; }],
+ [(void)ll_foo();],
+ [AC_DEFINE(_STLP_LONG_LONG) ac_cv_long_long="yes"],
+ [ac_cv_long_long="no"])
+AC_MSG_RESULT($ac_cv_long_long)
+
+AC_MSG_CHECKING(for long double type)
+AC_TRY_COMPILE(
+ [long double ld_foo() { return 0; }],
+ [(void)ld_foo();],
+ [ac_cv_long_double="yes"],
+ [AC_DEFINE(_STLP_NO_LONG_DOUBLE) ac_cv_long_double="no"])
+AC_MSG_RESULT($ac_cv_long_double)
+
+AC_MSG_CHECKING(for typename keyword)
+AC_TRY_LINK(
+ [
+template <class T1, class T2>
+struct pair {
+ typedef T1 first_type;
+ typedef T2 second_type;
+};
+
+template <class Arg, class Result>
+struct unary_function {
+ typedef Arg argument_type;
+ typedef Result result_type;
+};
+
+template <class Pair>
+struct select2nd : public unary_function<Pair, typename Pair::second_type> {
+ typedef typename Pair::first_type ignored_type;
+ const typename Pair::second_type& operator()(const typename Pair::second_type& x,
+ const ignored_type& ) const
+ {
+ return x;
+ }
+
+};
+ ],
+ [
+ typedef pair<int,int> tn_p;
+ select2nd< tn_p > tn_s;
+ (void)tn_s(1,5);
+ ],
+ [__TYPENAME="typename"
+ ac_cv_typename="yes"],
+ [__TYPENAME=""
+ AC_DEFINE(_STLP_NEED_TYPENAME)
+ ac_cv_typename="no"])
+AC_MSG_RESULT($ac_cv_typename)
+
+AC_MSG_CHECKING(for explicit keyword)
+AC_TRY_COMPILE(
+ [struct expl_Class { int a; explicit expl_Class(int t): a(t) {} };
+ expl_Class c(1);
+ ],
+ [],
+ [ac_cv_explicit="yes"],
+ [AC_DEFINE(_STLP_NO_EXPLICIT) ac_cv_explicit="no"])
+AC_MSG_RESULT($ac_cv_explicit)
+
+AC_MSG_CHECKING(for mutable keyword)
+AC_TRY_COMPILE(
+ [struct mut_Class { mutable int a; void update() const { a=0; } };
+ mut_Class c;
+ ],
+ [c.update()],
+ [ac_cv_mutable="yes"],
+ [AC_DEFINE(_STLP_NEED_MUTABLE) ac_cv_mutable="no"])
+AC_MSG_RESULT($ac_cv_mutable)
+
+AC_MSG_CHECKING(for new style casts)
+AC_TRY_COMPILE(
+ [struct ncast_Class {
+ int a; void update(int* i) { *i=a; } };
+ ncast_Class c;
+ ],
+ [
+ const int a(5);
+ c.update(const_cast<int*>(&a))
+ ],
+ [ac_cv_new_cast="yes"],
+ [AC_DEFINE(_STLP_NO_NEW_STYLE_CASTS) ac_cv_new_cast="no"])
+AC_MSG_RESULT($ac_cv_new_cast)
+
+AC_MSG_CHECKING(for new-style C library headers)
+AC_TRY_COMPILE(
+ [
+ #include <cctype>
+ #include <cstddef>
+ #include <cstdio>
+ #include <cstdlib>
+ #include <cstring>
+ #include <cassert>
+ #include <climits>
+ #ifndef _STLP_NO_WCHAR_T
+ #include <cwchar>
+ #endif
+ ],
+ [],
+ [ac_cv_newheaders="yes"],
+ [AC_DEFINE(_STLP_HAS_NO_NEW_C_HEADERS) ac_cv_newheaders="no"])
+AC_MSG_RESULT($ac_cv_newheaders)
+
+AC_MSG_CHECKING(for new-style <new> header)
+AC_TRY_COMPILE(
+ [
+ #include <new>
+ ],
+ [],
+ [ac_cv_new_new="yes"],
+ [AC_DEFINE(_STLP_NO_NEW_NEW_HEADER) ac_cv_new_new="no"])
+AC_MSG_RESULT($ac_cv_new_new)
+
+
+AC_MSG_CHECKING(for member template methods)
+AC_TRY_LINK( [
+template <class Result>
+struct mt_foo {
+ typedef Result result_type;
+ template <class Arg> result_type operate(const Arg&) { return Result(); }
+};
+mt_foo<int> p;
+],
+[
+(void)p.operate((char*)"aaa");
+],
+[ac_cv_member_templates="yes"],
+[AC_DEFINE(_STLP_NO_MEMBER_TEMPLATES) ac_cv_member_templates="no"]
+)
+AC_MSG_RESULT($ac_cv_member_templates)
+
+AC_MSG_CHECKING(for friend templates)
+AC_TRY_LINK( [
+
+template <class Result2> class foo;
+
+template <class Result>
+struct ft_foo {
+ typedef Result result_type;
+ template <class Result2> friend class foo;
+};
+ft_foo<int> p;
+],
+[],
+[ac_cv_friend_templates="yes"],
+[AC_DEFINE(_STLP_NO_FRIEND_TEMPLATES) ac_cv_friend_templates="no"]
+)
+AC_MSG_RESULT($ac_cv_friend_templates)
+
+AC_MSG_CHECKING(for qualified friend templates)
+AC_TRY_LINK( [
+
+${_TEST_STD_BEGIN}
+
+template <class Result2> class foo;
+
+template <class Result>
+struct ft_foo {
+ typedef Result result_type;
+ template <class Result2> friend class $_TEST_STD::foo;
+};
+ft_foo<int> p;
+${_TEST_STD_END}
+
+],
+[],
+[ac_cv_qual_friend_templates="yes"],
+[AC_DEFINE(_STLP_NO_QUALIFIED_FRIENDS) ac_cv_qual_friend_templates="no"]
+)
+AC_MSG_RESULT($ac_cv_qual_friend_templates)
+
+AC_MSG_CHECKING(for member template keyword)
+AC_TRY_LINK( [
+template <class Result>
+struct nt_foo {
+ typedef Result result_type;
+ template <class Arg> struct rebind { typedef nt_foo<Arg> other; };
+};
+
+template <class _Tp, class _Allocator>
+struct _Traits
+{
+ typedef typename _Allocator:: template rebind<_Tp> my_rebind;
+ typedef typename my_rebind::other allocator_type;
+};
+
+nt_foo<char> p;
+_Traits< int, nt_foo<short> > pp;
+],
+[],
+[ac_cv_member_template_keyword="yes"],
+[AC_DEFINE(_STLP_NO_MEMBER_TEMPLATE_KEYWORD) ac_cv_member_template_keyword="no"]
+)
+AC_MSG_RESULT($ac_cv_member_template_keyword)
+
+if test "$ac_cv_member_template_keyword" = "no"; then
+AC_MSG_CHECKING(for member template classes)
+AC_TRY_LINK( [
+template <class Result>
+struct nt_foo {
+ typedef Result result_type;
+ template <class Arg> struct rebind { typedef nt_foo<Arg> other; };
+};
+
+template <class _Tp, class _Allocator>
+struct _Traits
+{
+ typedef typename _Allocator::rebind<_Tp> my_rebind;
+ typedef typename my_rebind::other allocator_type;
+};
+
+nt_foo<char> p;
+_Traits< int, nt_foo<short> > pp;
+],
+[],
+[ac_cv_member_template_classes="yes"],
+[AC_DEFINE(_STLP_NO_MEMBER_TEMPLATE_CLASSES) ac_cv_member_template_classes="no"]
+)
+AC_MSG_RESULT($ac_cv_member_template_classes)
+fi
+
+AC_MSG_CHECKING(for partial class specialization)
+AC_TRY_LINK( [
+template <class Arg,class Result>
+struct ps_foo {
+ typedef Arg argument_type;
+ typedef Result result_type;
+};
+
+template<class Result>
+struct ps_foo<Result*,Result*> {
+ void bar() {}
+};
+
+template<class Result>
+struct ps_foo<int*,Result> {
+ void foo() {}
+};
+
+ps_foo<char*, char*> p;
+ps_foo<int*, int> p1;
+],
+[p.bar();
+ p1.foo();],
+[ac_cv_partial_spec="yes"],
+[AC_DEFINE(_STLP_NO_CLASS_PARTIAL_SPECIALIZATION) ac_cv_partial_spec="no"]
+)
+AC_MSG_RESULT($ac_cv_partial_spec)
+
+if test "$ac_cv_partial_spec" = yes; then
+
+AC_MSG_CHECKING(if explicit args accepted on constructors of partial specialized classes)
+AC_TRY_LINK( [
+template <class Arg,class Result>
+struct ps_foo {
+ typedef Arg argument_type;
+ typedef Result result_type;
+};
+
+template<class Result>
+struct ps_foo<Result*,Result*> {
+ ps_foo<Result*,Result*>() {}
+ void bar() {}
+};
+
+template<class Result>
+struct ps_foo<int*,Result> {
+ ps_foo<int*,Result*>() {}
+ void bar() {}
+
+};
+
+ps_foo<char*, char*> p;
+ps_foo<int*, int> p1;
+],
+[p.bar();
+ p1.foo();],
+[AC_DEFINE(_STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS) ac_cv_partial_spec_needs_args="yes"],
+[ac_cv_partial_spec_needs_args="no"]
+)
+AC_MSG_RESULT($ac_cv_partial_spec_needs_args)
+
+fi
+
+if test ac_cv_partial_spec_needs_args=="no"; then
+
+AC_MSG_CHECKING(if explicit args accepted on constructors of explicitly specialized classes)
+AC_TRY_LINK( [
+template <class Arg,class Result>
+struct ps_foo {
+ typedef Arg argument_type;
+ typedef Result result_type;
+ void bar() {}
+};
+
+template<class Result>
+struct ps_foo<int*,int> {
+ ps_foo<Result*,Result*>() {}
+ void foo() {}
+};
+
+ps_foo<char*, char*> p;
+ps_foo<int*, int> p1;
+],
+[p.bar();
+ p1.foo();],
+[AC_DEFINE(_STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS) ac_cv_partial_spec_needs_args="yes"],
+[ac_cv_partial_spec_needs_args="no"]
+)
+AC_MSG_RESULT($ac_cv_partial_spec_needs_args)
+
+fi
+
+AC_MSG_CHECKING(for partial template function ordering)
+AC_TRY_LINK( [
+
+template <class Arg,class Result>
+Result po_foo (const Arg& a,const Result&){ return (Result)a.nothing; }
+
+template <class T>
+struct A {
+ T a;
+ A(int _a) : a(_a) {}
+};
+
+template<class T>
+T po_foo (const A<T>& a, const A<T>& b){ return a.a; }
+],
+[
+ A<int> po_a(0); A<int> po_b(1); (void)po_foo(po_b, po_a)
+],
+[ac_cv_partial_ord="yes"],
+[AC_DEFINE(_STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER) ac_cv_partial_ord="no"]
+)
+AC_MSG_RESULT($ac_cv_partial_ord)
+
+AC_MSG_CHECKING(for method specialization)
+AC_TRY_LINK( [
+template <class Arg,class Result>
+struct ms_foo {
+ typedef Arg argument_type;
+ typedef Result result_type;
+ inline void bar();
+};
+
+template <class Arg,class Result>
+inline void ms_foo<Arg,Result>::bar() {}
+
+inline void ms_foo<int*,int>::bar() {}
+
+ms_foo<char*, char*> p;
+ms_foo<int*, int> p1;
+],
+[p.bar();
+ p1.bar();],
+[ac_cv_method_spec="yes"],
+[AC_DEFINE(_STLP_NO_METHOD_SPECIALIZATION) ac_cv_method_spec="no"]
+)
+AC_MSG_RESULT($ac_cv_method_spec)
+
+AC_MSG_CHECKING(for lrand48 function)
+AC_TRY_LINK(
+ [#include <stdlib.h>],
+ [long i = lrand48();],
+ [AC_DEFINE(_STLP_RAND48) ac_cv_func_lrand48="yes"],
+ [ac_cv_func_lrand48="no"])
+AC_MSG_RESULT($ac_cv_func_lrand48)
+
+
+AC_MSG_CHECKING(for default template parameters)
+AC_TRY_LINK(
+ [template <class T> struct less {};
+ template <class T, class T1=less<T> > struct Class { T1 t1; };
+ Class<int> cl;
+ Class<int,less<short> > cl2;
+ ],
+ [],
+ [ac_cv_default_template_param="yes"],
+ [AC_DEFINE(_STLP_LIMITED_DEFAULT_TEMPLATES) ac_cv_default_template_param="no"])
+AC_MSG_RESULT($ac_cv_default_template_param)
+if test "$ac_cv_default_template_param" = "no"; then
+ AC_MSG_CHECKING(for default type parameters)
+ AC_TRY_LINK(
+ [
+template <class T> struct less {
+ typedef int int_t;
+ };
+
+template <class T, class T1=less<int> >
+struct Class {
+private:
+ int a;
+public:
+ typedef Class<T,T1> self;
+ typedef $__TYPENAME T1::int_t int_t;
+ self foo (const Class<T,T1>& t) {
+ if ( t.a==a ) return *this;
+ else return t;
+ }
+};
+
+Class<int> cl;
+Class<int,less<short> > cl2;
+ ],
+ [],
+ [AC_DEFINE(_STLP_DEFAULT_TYPE_PARAM) ac_cv_default_type_param="yes"],
+ [ac_cv_default_type_param="no"])
+ AC_MSG_RESULT($ac_cv_default_type_param)
+
+fi
+
+dnl let's check if non-type cannot be default
+
+AC_MSG_CHECKING(for default non-type parameters)
+AC_TRY_LINK(
+ [
+template <class T, int N=0 >
+struct Class {
+private:
+ T* t;
+ enum { t1=N };
+public:
+ int get_n() { return N; }
+};
+
+Class<int> cl;
+Class<int, 2> cl2;
+ ],
+ [],
+ [ac_cv_default_nontype_param="yes"],
+ [AC_DEFINE(_STLP_NO_DEFAULT_NON_TYPE_PARAM) ac_cv_default_nontype_param="no"]
+ )
+AC_MSG_RESULT($ac_cv_default_nontype_param)
+
+AC_MSG_CHECKING(for non-type parameter bug)
+AC_TRY_LINK(
+ [
+template <class T, int N>
+struct Class {
+private:
+ T* t;
+ enum { t1=N };
+public:
+ int get_n() { return N; }
+};
+
+template <class T, int N>
+int operator==(const Class<T,N>& , const Class<T,N>& ) { return 0; }
+
+Class<int, 1> cl;
+Class<int, 1> cl2;
+int i(cl==cl2);
+ ],
+ [],
+ [ac_cv_nontype_param_bug="no"],
+ [AC_DEFINE(_STLP_NON_TYPE_TMPL_PARAM_BUG) ac_cv_nontype_param_bug="yes"]
+ )
+AC_MSG_RESULT($ac_cv_nontype_param_bug)
+
+AC_MSG_CHECKING(for static data member templates)
+AC_TRY_LINK(
+ [template <class T> struct Class { static int a; };
+ template <class T> int Class<T>::a;],
+ [],
+ [ac_cv_static_templates="yes"],
+ [AC_DEFINE(_STLP_NO_STATIC_TEMPLATE_DATA) ac_cv_static_templates="no"])
+AC_MSG_RESULT($ac_cv_static_templates)
+
+if test "$ac_cv_static_templates" = no; then
+ AC_MSG_CHECKING(for weak attribute)
+ AC_TRY_COMPILE(
+ [int a_w __attribute__((weak));],
+ [],
+ [AC_DEFINE(_STLP_WEAK_ATTRIBUTE) ac_cv_weak_attribute="yes"],
+ [ac_cv_weak_attribute="no"])
+ AC_MSG_RESULT($ac_cv_weak_attribute)
+fi
+
+if test "$ac_cv_static_templates" = yes; then
+AC_MSG_CHECKING(for static array member size bug)
+AC_TRY_LINK(
+ [template <class T> struct Class { enum { sz=5 }; static int a[sz]; };
+ template <class T> int Class<T>::a[Class<T>::sz];],
+ [],
+ [ac_cv_static_array_bug="no"],
+ [AC_DEFINE(_STLP_STATIC_ARRAY_BUG) ac_cv_static_array_bug="yes"])
+AC_MSG_RESULT($ac_cv_static_array_bug)
+fi
+
+AC_MSG_CHECKING(for static data member const initializer bug)
+AC_TRY_LINK(
+ [template <class T> struct Class { static const int a = 1; };
+ template <class T> const int Class<T>::a;],
+ [],
+ [ac_cv_static_init_bug="no"],
+ [AC_DEFINE(_STLP_STATIC_CONST_INIT_BUG) ac_cv_static_init_bug="yes"])
+AC_MSG_RESULT($ac_cv_static_init_bug)
+
+AC_MSG_CHECKING(for namespaces support)
+AC_TRY_COMPILE(
+ [class test_class {};
+ namespace std {
+ using ::test_class;
+ template <class T> struct Class { typedef T my_type; };
+ typedef Class<int>::my_type int_type;
+ };
+ inline int ns_foo (std::int_type t) {
+ using namespace std;
+ int_type i =2;
+ return i+t;
+ }
+ ],
+ [(void)ns_foo(1);],
+ [_TEST_STD="std" _TEST_STD_BEGIN="namespace $_TEST_STD" _TEST_STD_END="namespace $_TEST_STD" ac_cv_namespaces="yes"],
+ [AC_DEFINE(_STLP_HAS_NO_NAMESPACES) _TEST_STD="" _TEST_STD_BEGIN="" _TEST_STD_END="" ac_cv_namespaces="no"])
+AC_MSG_RESULT($ac_cv_namespaces)
+
+AC_MSG_CHECKING(for broken "using" directive)
+AC_TRY_COMPILE(
+ [namespace std {
+ template <class T> struct Class { typedef T my_type; };
+ typedef Class<int>::my_type int_type;
+ template <class T> void foo(T,int) {}
+ template <class T> void foo(T,int,int) {}
+ };
+ using std::Class;
+ using std::foo;
+ ],
+ [(void)foo(1,1);],
+ [ac_cv_broken_using="no"],
+ [ac_cv_broken_using="yes"])
+if test "$ac_cv_broken_using" = no; then
+# check if no warnings have been issued
+ if `check_warning` ; then
+ ac_cv_broken_using=no
+ else
+ AC_DEFINE(_STLP_BROKEN_USING_DIRECTIVE)
+ fi
+else
+ AC_DEFINE(_STLP_BROKEN_USING_DIRECTIVE)
+fi
+AC_MSG_RESULT($ac_cv_broken_using)
+
+
+if test "$ac_cv_namespaces" = yes; then
+AC_ARG_ENABLE(namespaces,[--enable-namespaces Use namespaces (default if posssible)
+--disable-namespaces Don't use namespaces support],
+[
+case "$enableval" in
+ no) AC_DEFINE(_STLP_NO_NAMESPACES)
+ _TEST_STD=""
+ _TEST_STD_BEGIN=""
+ _TEST_STD_END=""
+ AC_MSG_RESULT(Config arg --disable-namespaces : code not put into namespace by user request);;
+ *) AC_MSG_RESULT(Config default: code put into namespace)
+esac
+],
+[AC_MSG_RESULT(Config default: code put into namespace)]
+)
+else
+ AC_MSG_RESULT(Compiler restriction : no namespaces support used)
+fi
+
+
+AC_MSG_CHECKING(for exceptions support)
+AC_TRY_COMPILE(
+ [int ex_foo() {
+ try {
+ try { throw(1); }
+ catch (int a) { throw; }
+ } catch (...) {;}
+ return 0;
+ }],
+ [(void)ex_foo();],
+ [ac_cv_exceptions="yes"],
+ [AC_DEFINE(_STLP_HAS_NO_EXCEPTIONS) ac_cv_exceptions="no"])
+AC_MSG_RESULT($ac_cv_exceptions)
+
+if test "$ac_cv_exceptions" = yes; then
+
+AC_MSG_CHECKING(if exceptions specification works)
+AC_TRY_COMPILE(
+ [template <class T> inline int ex_spec_foo(const T&) throw () { return 0;} ],
+ [(void)ex_spec_foo(5);],
+ [ac_cv_exception_spec="yes"],
+ [AC_DEFINE(_STLP_NO_EXCEPTION_SPEC) ac_cv_exception_spec="no"])
+dnl if test "$ac_cv_exception_spec" = yes; then
+dnl # check if no warnings have been issued
+dnl if `check_warning` ; then
+dnl AC_DEFINE(_STLP_EXCEPTION_SPEC)
+dnl else
+dnl ac_cv_exception_spec=no
+dnl fi
+dnl fi
+AC_MSG_RESULT($ac_cv_exception_spec)
+
+AC_MSG_CHECKING(if return is required after throw)
+AC_TRY_COMPILE(
+ [int ex_foo() {
+ try {
+ try { throw(1); }
+ catch (int a) { throw; }
+ } catch (...) {;}
+ return 0;
+ }],
+ [(void)ex_foo();],
+ [ac_cv_throw_return_bug="no"],
+ [AC_DEFINE(_STLP_THROW_RETURN_BUG) ac_cv_throw_return_bug="yes"])
+
+ if test "$ac_cv_throw_return_bug" = no; then
+ # check if no warnings have been issued
+ if `check_warning` ; then
+ ac_cv_throw_return_bug="no"
+ else
+ AC_DEFINE(_STLP_THROW_RETURN_BUG)
+ ac_cv_throw_return_bug="yes"
+ fi
+ fi
+AC_MSG_RESULT($ac_cv_throw_return_bug)
+
+fi
+
+AC_MSG_CHECKING(for native <string> header with basic_string defined )
+AC_TRY_COMPILE(
+ [
+ #include <string>
+ # if !defined (_STLP_HAS_NO_NAMESPACES)
+ using namespace $_TEST_STD;
+ # endif
+ basic_string<char, char_traits<char>, allocator<char> > bs;
+ string bd = bs;
+ ],
+ [],
+ [ ac_cv_string_header="yes"],
+ [ AC_DEFINE(_STLP_NO_STRING_HEADER) ac_cv_string_header="no"]
+)
+AC_MSG_RESULT($ac_cv_string_header)
+
+dnl there could be no correct stdexcept/iostream without string
+if test "$ac_cv_string_header" = yes; then
+AC_MSG_CHECKING(for native <stdexcept> header)
+AC_TRY_COMPILE(
+ [
+ #include <stdexcept>
+ # if !defined (_STLP_HAS_NO_NAMESPACES)
+ using namespace $_TEST_STD;
+ # endif
+ string s;
+ logic_error le(s);
+ runtime_error re(s);
+ domain_error de(s);
+ invalid_argument ia(s);
+ length_error lne(s);
+ out_of_range or(s);
+ range_error rne(s);
+ overflow_error ove(s);
+ underflow_error ue(s);
+ ],
+ [],
+ [ac_cv_stdexcept_header="yes"],
+ [AC_DEFINE(_STLP_NO_STDEXCEPT_HEADER) ac_cv_stdexcept_header="no"]
+)
+AC_MSG_RESULT($ac_cv_stdexcept_header)
+
+AC_MSG_CHECKING(for new iostreams)
+AC_TRY_COMPILE(
+ [
+ #include <iosfwd>
+ #include <iostream>
+ # if !defined (_STLP_HAS_NO_NAMESPACES)
+ using namespace $_TEST_STD;
+ # endif
+
+ template <class _Tp, class _Traits>
+ void outp(basic_ostream<_Tp,_Traits>& o, char* str) {
+ o<<str;
+ }
+ ],
+ [
+ outp(cout, "Hello World\n")
+ ],
+ [ac_cv_newstreams="yes"],
+ [AC_DEFINE(_STLP_HAS_NO_NEW_IOSTREAMS) ac_cv_newstreams="no"])
+AC_MSG_RESULT($ac_cv_newstreams)
+
+dnl end namespace-related tests
+
+fi
+
+AC_MSG_CHECKING(for <exception> header with class "exception" defined)
+AC_TRY_COMPILE(
+ [
+ #include <exception>
+ # if !defined (_STLP_HAS_NO_NAMESPACES)
+ using namespace $_TEST_STD;
+ # endif
+ class my_exception: public $_TEST_STD::exception {};
+ my_exception mm;
+ ],
+ [],
+ [ac_cv_exception_header="yes"],
+ [AC_DEFINE(_STLP_NO_EXCEPTION_HEADER) ac_cv_exception_header="no"]
+)
+AC_MSG_RESULT($ac_cv_exception_header)
+
+AC_MSG_CHECKING(builtin constructor bug)
+AC_TRY_RUN( [
+# ifdef _STLP_USE_NEW_STYLE_HEADERS
+# include <cassert>
+# include <cstdio>
+# include <cstring>
+# include <new>
+# else
+# include <assert.h>
+# include <stdio.h>
+# include <string.h>
+# include <new.h>
+# endif
+int main(int, char**) {
+ int i;
+ double buf[1000];
+ char* pc = (char*)buf;
+ short* ps = (short*)buf;
+ int* pi = (int*)buf;
+ long* pl = (long*)buf;
+ double* pd = (double*)buf;
+ float* pf = (float*)buf;
+ for (i=0; i<100; i++) {
+ new(pc) char();
+ assert(char()==0 && *pc==0);
+ sprintf(pc,"lalala\n");
+ new (ps) short();
+ assert(short()==0 && *ps ==0);
+ sprintf(pc,"lalala\n");
+ new (pi) int();
+ assert(int()==0 && *pi == 0);
+ sprintf(pc,"lalala\n");
+ new (pl) long();
+ assert(long()==0 && *pl == 0);
+ sprintf(pc,"lalala\n");
+ new (pf) float();
+ assert(float()==0.0 && *pf == 0.0);
+ sprintf(pc,"lalala\n");
+ new (pd) double();
+ assert(double()==0.0 && *pd == 0.0);
+ sprintf(pc,"lalala\n");
+ }
+ return 0;
+}
+],
+[ ac_cv_builtin_c_bug="no"],
+[ AC_DEFINE(_STLP_DEFAULT_CONSTRUCTOR_BUG) ac_cv_builtin_c_bug="yes"],
+[ AC_DEFINE(_STLP_DEFAULT_CONSTRUCTOR_BUG) ac_cv_builtin_c_bug="yes"]
+)
+AC_MSG_RESULT($ac_cv_builtin_c_bug)
+
+AC_MSG_CHECKING(for trivial constructor bug)
+AC_TRY_LINK(
+ [struct output_iterator_tag {};
+ void tc_bug_foo(output_iterator_tag) {}
+ inline void tc_test_foo() { tc_bug_foo(output_iterator_tag()); }],
+ [tc_test_foo();],
+ [ac_cv_tc_bug="no"],
+ [AC_DEFINE(_STLP_TRIVIAL_CONSTRUCTOR_BUG) ac_cv_tc_bug="yes"])
+AC_MSG_RESULT($ac_cv_tc_bug)
+
+AC_MSG_CHECKING(for trivial destructor bug)
+AC_TRY_LINK(
+ [struct output_iterator_tag {output_iterator_tag() {} };
+ output_iterator_tag* td_bug_bar ;
+ ],
+ [ td_bug_bar->~output_iterator_tag();
+ ],
+ [ac_cv_td_bug="no"],
+ [AC_DEFINE(_STLP_TRIVIAL_DESTRUCTOR_BUG) ac_cv_td_bug="yes"])
+AC_MSG_RESULT($ac_cv_td_bug)
+
+AC_MSG_CHECKING(for explicit function template arguments)
+AC_TRY_LINK(
+ [ template <class T> class foo;
+ template<class T> bool operator==(const foo<T>& lhs,const foo<T>& rhs);
+ template <class T> class foo {
+ private:
+ T bar;
+ friend bool operator== <> (const foo<T>&,const foo<T>&);
+ };
+ template<class T> bool operator==(const foo<T>& lhs,const foo<T>& rhs) {
+ return lhs.bar==rhs.bar;
+ }],
+ [ foo<int> f1, f2;
+ int ret= (f1==f2) ],
+ [ _NULLARGS="<>" ac_cv_expl_fun_args="yes"],
+ [ AC_DEFINE(_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS) ac_cv_expl_fun_args="no" _NULLARGS=""])
+AC_MSG_RESULT($ac_cv_expl_fun_args)
+
+AC_MSG_CHECKING(for template parameter baseclass matching)
+AC_TRY_LINK(
+ [struct output_iterator_tag {};
+ struct derived1_tag : public output_iterator_tag {};
+ struct derived2_tag : public derived1_tag {};
+ template<class T> struct output_iterator {
+ public:
+ output_iterator() {}
+ ~output_iterator() {}
+ friend inline int operator== $_NULLARGS (const output_iterator<T>&,
+ const output_iterator<T>&);
+ };
+ template<class T> inline int operator==(const output_iterator<T>&,
+ const output_iterator<T>&) {
+ return 0;
+ }
+ template<class T> inline output_iterator_tag
+ iterator_category(const output_iterator<T>&) {return output_iterator_tag();}
+ template <class T>
+ struct derived_iterator : public output_iterator<T> {
+ public:
+ derived_iterator() {}
+ ~derived_iterator() {}
+ };
+ template<class T> inline T select_foo(T t, output_iterator_tag) { return t;}
+ template<class T> inline int select_foo_2(T, T,
+ output_iterator_tag) { return 0;}
+ template<class T> inline T tbase_foo(T pm ) {
+ derived_iterator<T> di1, di2; int i( di1==di2 && pm);
+ return select_foo((int)1,iterator_category(derived_iterator<T>()));
+ }
+ ],
+ [ (void)tbase_foo((int)1); ],
+ [ac_cv_base_match="yes"],
+ [AC_DEFINE(_STLP_BASE_MATCH_BUG) ac_cv_base_match="no"])
+AC_MSG_RESULT($ac_cv_base_match)
+
+AC_MSG_CHECKING(for non-template parameter baseclass matching )
+AC_TRY_LINK(
+ [struct output_iterator_tag {};
+ struct derived1_tag : public output_iterator_tag {};
+ struct derived2_tag : public derived1_tag {};
+ struct derived3_tag : public derived2_tag {};
+ template<class T> struct output_iterator {
+ public:
+ output_iterator() {}
+ ~output_iterator() {}
+ };
+ template<class T> inline output_iterator_tag
+ iterator_category(const output_iterator<T>&) {return output_iterator_tag();}
+ template <class T>
+ struct derived_iterator : public output_iterator<T> {
+ public:
+ derived_iterator() {}
+ ~derived_iterator() {}
+ };
+ template<class T> inline int select_foo_2(T, T,
+ output_iterator_tag) { return 0;}
+ template<class T> inline int select_foo_2(T, T,
+ derived1_tag) { return 0;}
+ template<class T> inline void nont_base_foo(T pm ) {
+ derived_iterator<T> di1, di2;
+ (void)select_foo_2(di1, (const derived_iterator<T>&)di2, derived3_tag());
+ }
+ ],
+ [ nont_base_foo((int)1); ],
+ [ac_cv_nont_base_match="yes"],
+ [AC_DEFINE(_STLP_NONTEMPL_BASE_MATCH_BUG) ac_cv_nont_base_match="no"])
+AC_MSG_RESULT($ac_cv_nont_base_match)
+
+AC_MSG_CHECKING(for nested type parameters bug)
+AC_TRY_LINK(
+ [template<class T> struct nt_o { typedef int ii; inline ii foo(ii);};
+ template <class T> inline nt_o<T>::ii nt_o<T>::foo(ii) { return 0; }],
+ [],
+ [ac_cv_nested_type_param_bug="no"],
+ [AC_DEFINE(_STLP_NESTED_TYPE_PARAM_BUG) ac_cv_nested_type_param_bug="yes"])
+AC_MSG_RESULT($ac_cv_nested_type_param_bug)
+
+
+AC_MSG_CHECKING(if inherited template typedefs broken completely)
+AC_TRY_LINK(
+ [
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+ typedef Arg1 first_argument_type;
+ typedef Arg2 second_argument_type;
+ typedef Result result_type;
+};
+
+template <class T>
+struct equal_to : public binary_function<T, T, int> {
+ int operator()(const T& x, const T& y) const { return x == y; }
+};
+
+template <class Predicate>
+class binary_negate
+ : public binary_function<$__TYPENAME Predicate::first_argument_type,
+ $__TYPENAME Predicate::second_argument_type,
+ int> {
+protected:
+ Predicate pred;
+public:
+ binary_negate(const Predicate& x = Predicate()) : pred(x) {}
+ int operator() (const $__TYPENAME Predicate::first_argument_type& x,
+ const $__TYPENAME Predicate::second_argument_type& y) const {
+ return !pred(x, y);
+ }
+};
+ typedef equal_to<int> eq_int;
+ typedef binary_negate<equal_to<int> > int_negate;
+ int_negate n;
+ ],
+ [
+ (void)n(1,2);
+ ],
+ [ac_cv_typebug="no"],
+ [AC_DEFINE(_STLP_BASE_TYPEDEF_BUG)
+ AC_DEFINE(_STLP_BASE_TYPEDEF_OUTSIDE_BUG) ac_cv_typebug="yes"])
+AC_MSG_RESULT($ac_cv_typebug)
+
+AC_MSG_CHECKING(if inherited typedefs visible from outside)
+AC_TRY_COMPILE(
+ [
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+ typedef Arg1 first_argument_type;
+ typedef Arg1 second_argument_type;
+ typedef Result result_type;
+};
+
+
+template <class T>
+class plus : public binary_function<T, T, T> {
+public:
+ plus() {}
+ plus(const T&) {}
+ T operator()(const T& x, const T& y) const { return x + y; };
+};
+
+plus<int> p;
+plus<int>::first_argument_type a;
+],
+ [],
+ [ac_cv_outside_typedef="yes"],
+ [AC_DEFINE(_STLP_BASE_TYPEDEF_OUTSIDE_BUG) ac_cv_outside_typedef="no"])
+AC_MSG_RESULT($ac_cv_outside_typedef)
+
+# fi
+
+AC_MSG_CHECKING(if private type static members initializable)
+AC_TRY_COMPILE(
+ [struct p_Class { private: struct str_ {
+ int a; str_(int i) : a(i) {}}; static str_ my_int;
+ };
+ p_Class::str_ p_Class::my_int(0);
+ ],
+ [],
+ [ac_cv_private="yes"],
+ [AC_DEFINE(_STLP_UNINITIALIZABLE_PRIVATE) ac_cv_private="no"])
+AC_MSG_RESULT($ac_cv_private)
+
+
+AC_MSG_CHECKING(for const member constructor bug)
+AC_TRY_LINK([
+template <class T1, class T2>
+struct pair {
+ T1 first;
+ T2 second;
+ pair(): first(T1()), second(T2()) {}
+ pair(const pair<T1,T2>& o) : first(o.first), second(o.second) {}
+};
+pair< const int, const int > p;
+ ],
+ [],
+ [ac_cv_const_constructor_bug="no"],
+ [AC_DEFINE(_STLP_CONST_CONSTRUCTOR_BUG) ac_cv_const_constructor_bug="yes"])
+AC_MSG_RESULT($ac_cv_const_constructor_bug)
+
+AC_MSG_CHECKING(for loop inline problems)
+AC_TRY_COMPILE(
+ [inline int il_foo (int a) {
+ int i; for (i=0; i<a; i++) a+=a; while (i>0) a-=3; return a; }],
+ [(void)il_foo(2);],
+ [ac_cv_inline_problems="no"],
+ [AC_DEFINE(_STLP_LOOP_INLINE_PROBLEMS) ac_cv_inline_problems="yes"])
+if test "$ac_cv_inline_problems" = no; then
+# check if no warnings have been issued
+ if `check_warning` ; then
+ ac_cv_inline_problems="no"
+ else
+ AC_DEFINE(_STLP_LOOP_INLINE_PROBLEMS)
+ ac_cv_inline_problems="yes"
+ fi
+fi
+AC_MSG_RESULT($ac_cv_inline_problems)
+
+
+AC_MSG_CHECKING(if arrow operator always get instantiated)
+AC_TRY_LINK(
+ [
+ template <class T> struct um_foo { T* ptr;
+ T* operator ->() { return &(operator*());}
+ T operator *() { return *ptr; }
+ };
+ template <class T>
+ int operator == ( const um_foo<T>& x, const um_foo<T>& y)
+ {
+ return *x == *y;
+ }
+ struct um_tag { int a ; };
+ um_foo<um_tag> f;
+ um_foo<int> a;
+ ],
+ [
+ int b(5); a.ptr=&b;],
+ [ac_cv_unused_required="no"],
+ [AC_DEFINE(_STPL_NO_ARROW_OPERATOR) ac_cv_unused_required="yes"]
+ )
+AC_MSG_RESULT($ac_cv_unused_required)
+
+AC_MSG_CHECKING(for pointer-to-member parameter bug)
+AC_TRY_COMPILE(
+ [
+struct pmf_foo {
+ int bar() { return 0; };
+};
+
+template <class Class, class Result>
+class mem_fun_t {
+protected:
+ typedef Result (Class::*fun_type)(void);
+ fun_type ptr;
+public:
+ mem_fun_t() {}
+ mem_fun_t(fun_type p) : ptr(p) {}
+ Result operator()(Class* x) const { return (x->*ptr)();}
+};
+
+template <class Class, class Result>
+inline mem_fun_t <Class, Result>
+mem_fun(Result (Class::*ptr)(void)) {
+ return mem_fun_t<Class, Result>(ptr);
+}
+],
+ [pmf_foo pmf; (void)mem_fun(&pmf_foo::bar)(&pmf)],
+ [ac_cv_pmf_bug="no"],
+ [AC_DEFINE( _STLP_MEMBER_POINTER_PARAM_BUG) ac_cv_pmf_bug="yes"])
+AC_MSG_RESULT($ac_cv_pmf_bug)
+
+AC_MSG_CHECKING(if bad_alloc defined in <new>)
+AC_TRY_COMPILE(
+ [
+ #if !defined (_STLP_NO_NEW_STYLE_HEADERS)
+ #include <new>
+ #else
+ #include <new.h>
+ #endif
+
+ # if !defined (_STLP_HAS_NO_NAMESPACES)
+ using namespace $_TEST_STD;
+ # endif
+
+ bad_alloc badalloc_foo() { bad_alloc err; return err;}],
+ [(void)badalloc_foo()],
+ [ac_cv_bad_alloc="yes"],
+ [AC_DEFINE(_STLP_NO_BAD_ALLOC) ac_cv_bad_alloc="no"])
+AC_MSG_RESULT($ac_cv_bad_alloc)
+
+AC_MSG_CHECKING(for __type_traits automatic specialization)
+AC_TRY_LINK(
+ [template <class T> int tt_foo(const T&) {
+ typedef __type_traits<T> traits;
+ return 0;
+ }],
+ [(void)tt_foo(5)],
+ [AC_DEFINE(_STLP_AUTOMATIC_TYPE_TRAITS) ac_cv_type_traits="yes"],
+ [ac_cv_type_traits="no"])
+AC_MSG_RESULT($ac_cv_type_traits)
+
+
+# package options - exceptions
+AC_MSG_RESULT(***)
+AC_MSG_RESULT($0: Setting implementation options...)
+AC_MSG_RESULT(***)
+
+if test "$ac_cv_exceptions" = yes; then
+AC_ARG_ENABLE(exceptions,[--enable-exceptions Use exceptions support (default if posssible)
+ --disable-exceptions Don't use exceptions support],
+[
+case "$enableval" in
+ no) AC_DEFINE(_STLP_NO_EXCEPTIONS)
+ AC_MSG_RESULT(Config arg --disable-exceptions : disabling exceptions by user request);;
+ *) AC_MSG_RESULT(Config default: exceptions enabled)
+esac
+],
+[AC_MSG_RESULT(Config default: exceptions enabled) ]
+)
+else
+ AC_MSG_RESULT(Compiler restriction : no exceptions support used)
+fi
+
+if test "$ac_cv_namespaces" = yes; then
+AC_ARG_ENABLE(relops,[--enable-relops Separate rel_ops namespace for relational operators (default if posssible)
+--disable-relops No separate rel_ops namespace for relational operators],
+[
+case "$enableval" in
+ no) AC_DEFINE(_STLP_NO_RELOPS_NAMESPACE)
+ AC_MSG_RESULT(Config arg --disable-relops : no std::rel_ops namespace by user request);;
+ *) AC_MSG_RESULT(Config default: Separate std::rel_ops namespace for relational operators)
+esac
+],
+[AC_MSG_RESULT(Config default: Separate std::rel_ops namespace for relational operators)]
+)
+else
+ AC_DEFINE(_STLP_NO_RELOPS_NAMESPACE)
+fi
+
+if test "$ac_cv_newheaders" = yes; then
+AC_ARG_ENABLE(new-style-headers,[--enable-new-style-headers Use new-style headers (default)
+--disable-new-style-headers Don't use new-style headers],
+[
+case "$enableval" in
+ no) AC_DEFINE(_STLP_NO_NEW_STYLE_HEADERS)
+ AC_MSG_RESULT(Config arg --disable-new-style-headers : not using new-style headers);;
+ *) AC_MSG_RESULT(Config default: using new-style headers)
+esac
+],
+[AC_MSG_RESULT(Config default: using new-style headers)]
+)
+else
+ AC_DEFINE(_STLP_NO_NEW_STYLE_HEADERS)
+fi
+
+if test "$ac_cv_newstreams" = yes; then
+AC_ARG_ENABLE(new-iostreams,[--enable-new-iostreams Use new iostreams (default)
+--disable-new-iostreams Don't use new iostreams],
+[
+case "$enableval" in
+ no) AC_DEFINE(_STLP_NO_NEW_IOSTREAMS)
+ AC_MSG_RESULT(Config arg --disable-new-iostreams : not using new iostreams);;
+ *) AC_MSG_RESULT(Config default: using new iostreams)
+esac
+],
+[AC_MSG_RESULT(Config default: using new iostreams)]
+)
+else
+ AC_DEFINE(_STLP_NO_NEW_IOSTREAMS)
+fi
+
+AC_ARG_ENABLE(sgi-allocators,[--enable-sgi-allocators : set default parameter to SGI-style default alloc, not allocator<T>
+ --disable-sgi-allocators : use allocator<T> if possible],
+[
+case "$enableval" in
+ yes ) AC_MSG_RESULT(Config arg --enable-sgi-allocators : SGI-style alloc as default allocator)
+ AC_DEFINE(_STLP_USE_RAW_SGI_ALLOCATORS);;
+ * ) AC_MSG_RESULT(Config default: using allocator<T> as default allocator if possible )
+esac
+],
+[
+ AC_MSG_RESULT(Config default: using allocator<T> as default allocator if possible)
+]
+)
+
+AC_ARG_ENABLE(malloc,[--enable-malloc : set default alloc to malloc-based allocator ( malloc_alloc_template<instance_no>, alloc.h )
+--disable-malloc : choose (default) sgi node allocator (__alloc<threads,no> alloc.h )],
+[
+case "$enableval" in
+ yes ) AC_MSG_RESULT(Config arg --enable-malloc : setting malloc_alloc as default alloc)
+ AC_DEFINE(_STLP_USE_MALLOC);;
+ * ) AC_MSG_RESULT(Config default: not using malloc_alloc as default alloc)
+esac
+],
+[
+ AC_MSG_RESULT(Config default: not using malloc_alloc as default alloc)
+]
+)
+
+AC_ARG_ENABLE(newalloc,[--enable-newalloc : set default alloc to new-based allocator ( new_alloc, alloc.h )
+--disable-newalloc : choose (default) sgi allocator (__alloc<threads,no> alloc.h )],
+[
+case "$enableval" in
+ yes ) AC_MSG_RESULT(Config arg --enable-newalloc : setting new_alloc as default alloc)
+ AC_DEFINE(_STLP_USE_NEWALLOC);;
+ * )
+ AC_MSG_RESULT(Config default: not using new_alloc as default alloc)
+esac
+],
+[
+ AC_MSG_RESULT(Config default: not using new_alloc as default alloc)
+]
+)
+
+AC_ARG_ENABLE(defalloc,[--enable-defalloc : make HP-style defalloc.h included in alloc.h )
+--disable-defalloc : leave defalloc.h alone],
+[
+case "$enableval" in
+ no ) AC_MSG_RESULT(Config arg --disable-defalloc : not including HP-style defalloc.h into alloc.h);;
+
+ * ) AC_MSG_RESULT(Config default : including HP-style defalloc.h into alloc.h)
+ AC_DEFINE(_STLP_USE_DEFALLOC)
+esac
+],
+[
+ AC_MSG_RESULT(Config default : not including HP-style defalloc.h into alloc.h)
+]
+)
+
+
+AC_ARG_ENABLE(debugalloc,[--enable-debugalloc : use debug versions of allocators
+--disable-debugalloc : not using debug allocators],
+[
+case "$enableval" in
+ yes ) AC_MSG_RESULT(Config arg --enable-debugalloc : use debug versions of allocators )
+ AC_DEFINE(_STLP_DEBUG_ALLOC);;
+ * )
+ AC_MSG_RESULT(Config default : not using debug allocators)
+esac
+],
+[
+ AC_MSG_RESULT(Config default : not using debug allocators)
+]
+)
+
+
+AC_ARG_ENABLE(abbrevs,[--enable-abbrevs : use abbreviated class names internally for linker benefit (don't affect interface)
+--disable-abbrevs : don't use abbreviated names],
+[
+case "$enableval" in
+ yes ) AC_MSG_RESULT(Config arg --enable-abbrevs : using abbreviated class names internally)
+ AC_DEFINE(_STLP_USE_ABBREVS);;
+ * )
+ AC_MSG_RESULT(Config default : not using abbreviated class names internally)
+esac
+],
+[
+ AC_MSG_RESULT(Config default : not using abbreviated class names internally)
+]
+)
+
+
+AC_DEFINE(__AUTO_CONFIGURED)
+
+AC_MSG_RESULT(***)
+AC_MSG_RESULT($0: setting up headers...)
+AC_MSG_RESULT(***)
+AC_OUTPUT(stlconf.h)
+AC_MSG_RESULT(***)
+AC_MSG_RESULT($0: STLport configured for use with \"${CXX}\" compiler, CXXFLAGS used: \"${CXXFLAGS}\".)
+AC_MSG_RESULT($0: To restore original settings - run \"./unconfigure\" or copy stlconf.h.in to stlconf.h.)
+AC_MSG_RESULT(***)
+
diff --git a/src/STLport/config/new_compiler/stlconf.h.in b/src/STLport/config/new_compiler/stlconf.h.in
new file mode 100644
index 0000000..de7e9ed
--- /dev/null
+++ b/src/STLport/config/new_compiler/stlconf.h.in
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STLCONF_H
+# define _STLP_STLCONF_H
+
+# undef __AUTO_CONFIGURED
+
+//==========================================================
+// Getting proper values of autoconf flags
+// if you ran 'configure', __AUTO_CONFIGURED is set to 1 and
+// specific compiler features will be used.
+// Otherwise, the <stlcomp.h> header will be included for per-version
+// features recognition.
+//==========================================================
+# if defined (__AUTO_CONFIGURED)
+// auto-configured section
+
+# undef _STLP_NO_EXCEPTIONS
+# undef _STLP_NO_NAMESPACES
+# undef _STLP_NO_RELOPS_NAMESPACE
+# undef _STLP_NO_NEW_NEW_HEADER
+
+# undef _STLP_NO_NEW_IOSTREAMS
+
+// select threads strategy
+# undef _PTHREADS
+# undef _NOTHREADS
+
+// select SGI-style alloc instead of allocator<T>
+# undef _STLP_USE_SGI_ALLOCATORS
+
+// select allocation method you like
+# undef _STLP_USE_MALLOC
+# undef _STLP_USE_NEWALLOC
+
+// this one is not mandatory, just enabled
+# undef _STLP_USE_DEFALLOC
+
+// define _STLP_USE_ABBREVS if your linker has trouble with long
+// external symbols
+# undef _STLP_USE_ABBREVS
+
+
+// unsigned 32-bit integer type
+# define _STLP_UINT32_T unsigned
+# undef _STLP_NO_BOOL
+# undef _STLP_DONT_USE_BOOL_TYPEDEF
+# undef _STLP_YVALS_H
+# undef _STLP_LIMITED_DEFAULT_TEMPLATES
+# undef _STLP_DEFAULT_TYPE_PARAM
+# undef _STLP_NO_STATIC_TEMPLATE_DATA
+# undef _STLP_RAND48
+# undef _STLP_LOOP_INLINE_PROBLEMS
+
+# undef _STLP_HAS_NO_NAMESPACES
+
+# undef _STLP_NEED_TYPENAME
+# undef _STLP_NEED_EXPLICIT
+# undef _STLP_HAS_NO_EXCEPTIONS
+# undef _STLP_NO_EXCEPTION_SPEC
+# undef _STLP_WEAK_ATTRIBUTE
+# undef _STLP_BASE_MATCH_BUG
+# undef _STLP_NONTEMPL_BASE_MATCH_BUG
+# undef _STLP_NESTED_TYPE_PARAM_BUG
+# undef _STLP_NO_ARROW_OPERATOR
+# undef _STLP_UNINITIALIZABLE_PRIVATE
+# undef _STLP_BASE_TYPEDEF_BUG
+# undef _STLP_BASE_TYPEDEF_OUTSIDE_BUG
+# undef _STLP_CONST_CONSTRUCTOR_BUG
+
+# undef _STLP_NO_NEW_STYLE_CASTS
+# undef _STLP_NO_WCHAR_T
+# undef _STLP_WCHAR_T_IS_USHORT
+# undef _STLP_LONG_LONG
+# undef _STLP_NO_LONG_DOUBLE
+# undef _STLP_NEED_MUTABLE
+# undef _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX
+# undef _STLP_NO_BAD_ALLOC
+# undef _STLP_DEBUG_ALLOC
+# undef _STLP_NO_MEMBER_TEMPLATES
+# undef _STLP_NO_MEMBER_TEMPLATE_CLASSES
+# undef _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+# undef _STLP_NO_FRIEND_TEMPLATES
+# undef _STLP_NO_QUALIFIED_FRIENDS
+# undef _STLP_NO_CLASS_PARTIAL_SPECIALIZATION
+# undef _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
+# undef _STLP_AUTOMATIC_TYPE_TRAITS
+# undef _STLP_MEMBER_POINTER_PARAM_BUG
+# undef _STLP_NON_TYPE_TMPL_PARAM_BUG
+# undef _STLP_NO_DEFAULT_NON_TYPE_PARAM
+# undef _STLP_NO_METHOD_SPECIALIZATION
+# undef _STLP_STATIC_ARRAY_BUG
+# undef _STLP_STATIC_CONST_INIT_BUG
+# undef _STLP_TRIVIAL_CONSTRUCTOR_BUG
+# undef _STLP_TRIVIAL_DESTRUCTOR_BUG
+# undef _STLP_BROKEN_USING_DIRECTIVE
+# undef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+# undef _STLP_NO_EXCEPTION_HEADER
+# undef _STLP_DEFAULT_CONSTRUCTOR_BUG
+
+# undef _STLP_HAS_NO_NEW_IOSTREAMS
+# undef _STLP_HAS_NO_NEW_C_HEADERS
+# undef _STLP_STATIC_CONST_INIT_BUG
+// new ones
+# undef _STLP_THROW_RETURN_BUG
+// unimp
+# undef _STLP_LINK_TIME_INSTANTIATION
+# undef _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS
+// unimp
+# undef _STLP_NO_TEMPLATE_CONVERSIONS
+# endif /* AUTO_CONFIGURED */
+
+//==========================================================
+
+
+#endif /* __STLCONF_H */
+
diff --git a/src/STLport/config/new_compiler/unconfigure b/src/STLport/config/new_compiler/unconfigure
new file mode 100644
index 0000000..c91da28
--- /dev/null
+++ b/src/STLport/config/new_compiler/unconfigure
@@ -0,0 +1,3 @@
+#!/bin/sh
+cp stlconf.h.in stlconf.h
+echo "STLport unconfigured."
diff --git a/src/STLport/config/stl_apcc.h b/src/STLport/config/stl_apcc.h
new file mode 100644
index 0000000..b979092
--- /dev/null
+++ b/src/STLport/config/stl_apcc.h
@@ -0,0 +1,32 @@
+// STLport config file for Apogee 4.x
+
+# define _STLP_NO_NEW_NEW_HEADER 1
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+// # define _STLP_RAND48 1
+# define _STLP_LONG_LONG long long
+# define _STLP_NO_BAD_ALLOC 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+// # define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+# define _STLP_NO_EXCEPTION_HEADER 1
+
+# undef _STLP_LINK_TIME_INSTANTIATION
+# define _STLP_LINK_TIME_INSTANTIATION 1
+
+# ifdef __STDLIB
+# undef _STLP_HAS_NO_NEW_IOSTREAMS
+# undef _STLP_NO_NEW_C_HEADERS
+# undef _STLP_NO_NEW_NEW_HEADER
+# undef _STLP_NO_BAD_ALLOC
+# undef _STLP_LONG_LONG
+# else
+# undef _STLP_NO_EXCEPTION_SPEC
+# define _STLP_NO_EXCEPTION_SPEC 1
+# endif
+
+
diff --git a/src/STLport/config/stl_apple.h b/src/STLport/config/stl_apple.h
new file mode 100644
index 0000000..eb7da79
--- /dev/null
+++ b/src/STLport/config/stl_apple.h
@@ -0,0 +1,112 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+// common configuration settings for Apple MPW MrCpp / SCpp
+
+#if defined(__MRC__) && __MRC__ < 0x500
+# error Apple's MPW MrCpp v.5.0.0 or better compiler required
+#endif
+#if defined(__SC__) && __SC__ < 0x890
+# error Apple's MPW SCpp v.8.9.0 or better compiler required
+#endif
+
+#ifdef qMacApp
+# ifndef __CONDITIONALMACROS__ // skip including ConditionalMacros_AC.h if ConditionalMacros.h is already included
+# include <CoreSwitches_AC.h>
+# include <ConditionalMacros_AC.h>
+# include <Types_AC.h>
+# define _STLP_FILE__ _FILE_AC
+# define _STLP_DEBUG_MESSAGE
+# define __stl_debug_message ProgramBreak_AC
+# include <ConditionalMacros.h>
+# endif
+# include <Types.h>
+#else
+# include <ConditionalMacros.h>
+# include <Types.h>
+#endif
+
+#define _STLP_UINT32_T UInt32
+typedef int wint_t;
+
+#ifndef TYPE_BOOL
+# error <ConditionalMacros.h> must be included. (TYPE_BOOL)
+#endif
+#if !TYPE_BOOL
+# define _STLP_NO_BOOL
+# define _STLP_DONT_USE_BOOL_TYPEDEF
+#endif
+
+#ifndef TYPE_LONGLONG
+# error <ConditionalMacros.h> must be included. (TYPE_LONGLONG)
+#endif
+#if TYPE_LONGLONG
+# define _STLP_LONG_LONG long long
+#endif
+
+#if !__option(exceptions)
+# define _STLP_HAS_NO_EXCEPTIONS
+#endif
+
+#define _STLP_DEBUG_MESSAGE_POST DebugStr("\pSTL diagnosis issued. See 'stderr' for detail.");
+#define _STLP_ASSERT_MSG_TRAILER " "
+
+#ifdef _STLP_DEBUG
+# define _STLP_THROW(x) (DebugStr("\pSTL is about to throw exception: "#x),throw x)
+#endif
+
+#if defined(__MRC__)
+# ifndef __spillargs
+# define __spillargs 1 // MrCpp requires this symbol to be defined as 1 to properly handle va_start; ref.[ file stdarg.h; line 26 ]
+# endif
+#endif
+
+#if defined(__SC__)
+#define _STLP_VENDOR_LONG_DOUBLE_MATH //*TY 12/03/2000 - SCpp's native math type is long double
+#endif
+
+#ifndef _STLP_NATIVE_INCLUDE_PATH
+# if __option(unix_includes)
+# define _STLP_NATIVE_INCLUDE_PATH ../CIncludes // expects the alias to {CIncludes} under the same folder as {STL}
+# else
+# define _STLP_NATIVE_INCLUDE_PATH ::CIncludes // expects the alias to {CIncludes} under the same folder as {STL}
+# endif
+#endif
+#if !defined(_STLP_MAKE_HEADER)
+# if !__option(unix_includes)
+# define _STLP_MAKE_HEADER(path, header) <path:header> // Mac uses ":" for directory delimiter
+# endif
+#endif
+
+# define _STLD _DBG // to keep the length of generated symbols within the compiler limitation
+
+#define _STLP_OWN_IOSTREAMS
+#define _STLP_USE_STDIO_IO 1 //*TY 02/24/2000 - see also ; ref.[ file _fstream.h; line 36 ]
+#define _STLP_NO_THREADS //*TY 12/17/2000 - multi-thread capability not explored, yet.
+#undef _REENTRANT //*ty 11/24/2001 - to make sure no thread facility is activated
+#define _NOTHREADS //*ty 12/07/2001 -
+
+// native library limitations
+#define _STLP_VENDOR_GLOBAL_STD // mpw's c++ libs do not utilize namespace std yet
+#define _STLP_NO_BAD_ALLOC // known limitation
+#define _STLP_HAS_NO_NEW_C_HEADERS // known limitation
+#define _STLP_NO_NEW_NEW_HEADER // known limitation
+#define _STLP_HAS_NO_NEW_IOSTREAMS // known limitation
+#define _STLP_NO_NATIVE_MBSTATE_T // known limitation
+#define _STLP_NO_NATIVE_WIDE_FUNCTIONS // known limitation
+#define _STLP_NO_NATIVE_WIDE_STREAMS // known limitation
+#define _STLP_INCOMPLETE_EXCEPTION_HEADER // known limitation
+#define _STLP_BROKEN_EXCEPTION_CLASS // known limitation
+
+// compiler limitations
+# define _STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+
+# define _STLP_MPWFIX_TRY try{ //*TY 06/01/2000 - exception handling bug workaround
+# define _STLP_MPWFIX_CATCH }catch(...){throw;} //*TY 06/01/2000 - exception handling bug workaround
+# define _STLP_MPWFIX_CATCH_ACTION(action) }catch(...){action;throw;} //*TY 06/01/2000 - exception handling bug workaround
+# define _STLP_THROW_RETURN_BUG // known limitation
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION // known limitation
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX // known limitation
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER // known limitation
+# define _STLP_NO_RELOPS_NAMESPACE // known limitation
+// end of stl_apple.h
diff --git a/src/STLport/config/stl_as400.h b/src/STLport/config/stl_as400.h
new file mode 100644
index 0000000..c9595c2
--- /dev/null
+++ b/src/STLport/config/stl_as400.h
@@ -0,0 +1,60 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+// AS/400 C++ config
+
+# ifdef _REENTRANT
+# define _PTHREADS
+# endif
+
+# define _STLP_NO_NEW_NEW_HEADER 1
+
+# define _STLP_NO_BOOL
+# define _STLP_LIMITED_DEFAULT_TEMPLATES
+
+# define _STLP_HAS_NO_NAMESPACES
+# define _STLP_NEED_TYPENAME
+# define _STLP_NEED_EXPLICIT
+# define _STLP_HAS_NO_EXCEPTIONS
+# define _STLP_NO_EXCEPTION_SPEC
+# define _STLP_NO_ARROW_OPERATOR
+# define _STLP_NO_NEW_STYLE_CASTS
+
+# define _STLP_NEED_MUTABLE
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX
+# define _STLP_NO_BAD_ALLOC
+# define _STLP_NO_MEMBER_TEMPLATES
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+# define _STLP_NO_FRIEND_TEMPLATES
+# define _STLP_NO_QUALIFIED_FRIENDS
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
+
+# define _STLP_NO_METHOD_SPECIALIZATION
+# define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+
+// # define _STLP_NO_EXCEPTION_HEADER
+
+# define _STLP_HAS_NO_NEW_IOSTREAMS
+# define _STLP_HAS_NO_NEW_C_HEADERS
+
+# define _STLP_STATIC_CONST_INIT_BUG
+# define _STLP_THROW_RETURN_BUG
+# define _STLP_LINK_TIME_INSTANTIATION
+# define _STLP_NO_TEMPLATE_CONVERSIONS
+
+# define _STLP_UNINITIALIZABLE_PRIVATE 1
+# define _STLP_STATIC_ARRAY_BUG 1
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+# define _STLP_TRIVIAL_DESTRUCTOR_BUG 1
+
+# if defined(_LONG_LONG)
+# define _STLP_LONG_LONG long long
+# endif
+// # define _STLP_LONG_DOUBLE 1
+# if defined(_PTHREADS)
+# define _MULTI_THREADED
+# endif
+// fbp : to fix __partition() problem
+# define _STLP_NONTEMPL_BASE_MATCH_BUG 1
diff --git a/src/STLport/config/stl_bc.h b/src/STLport/config/stl_bc.h
new file mode 100644
index 0000000..95e7a00
--- /dev/null
+++ b/src/STLport/config/stl_bc.h
@@ -0,0 +1,204 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+
+// versions ?
+# if defined(_STLP_DESIGNATED_DLL)
+# define _STLP_CALL __cdecl __export
+# elif defined(_RTLDLL)
+# define _STLP_CALL __cdecl __import
+# else
+# define _STLP_CALL __cdecl
+# endif
+
+# define _USE_STLP
+# define _STLP_USE_OWN_MBSTATE_T
+// # define _STLP_USE_OWN_NAMESPACE
+# define _STLP_DLLEXPORT_NEEDS_PREDECLARATION
+# define _STLP_OPERATOR_SPEC_NEEDS_TEMPLATE_ARGS
+
+// most of <exception> contents is still in global namespace
+// # define _STLP_VENDOR_UNEXPECTED_STD
+
+// <limits> problem
+# define _STLP_STATIC_CONST_INIT_BUG
+
+// <bitset> problems
+# define _STLP_MEMBER_SPECIALIZATION_BUG
+# define _STLP_HAS_SPECIFIC_PROLOG_EPILOG 1
+
+#if ( __BORLANDC__ < 0x540 )
+// Borland C++ Builder 3 (?)
+// those are assumptions, if some of them actually work, please let me know
+// # define _STLP_STATIC_CONST_INIT_BUG 1
+// # define _STLP_THROW_RETURN_BUG 1
+# define _STLP_NO_TEMPLATE_CONVERSIONS 1
+# define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+# define _STLP_NO_TYPENAME_ON_RETURN_TYPE
+#else
+# define _STLP_LONG_LONG __int64
+#endif
+
+// BCB 2 or less (Borland 5.02)
+#if ( __BORLANDC__ < 0x530 )
+
+# define _STLP_NO_OWN_IOSTREAMS
+# undef _STLP_OWN_IOSTREAMS
+
+# define _STLP_GLOBAL_VENDOR_CSTD 1
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# define _STLP_NO_FRIEND_TEMPLATES 1
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+# define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+
+# define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+# define _STLP_MEMBER_SPECIALIZATION_BUG
+# define _STLP_NO_EXCEPTION_HEADER 1
+# define _STLP_NO_EXCEPTION_SPEC 1
+
+# define _STLP_NO_BAD_ALLOC 1
+# define _STLP_NO_ARROW_OPERATOR 1
+
+typedef char mbstate_t;
+
+# define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+# define _STLP_NO_TYPEINFO
+# define _STLP_NO_METHOD_SPECIALIZATION
+
+#endif
+
+// Borland 5.0x
+#if ( __BORLANDC__ < 0x520 )
+
+# define _STLP_BROKEN_USING_DIRECTIVE 1
+# define _STLP_EXPORT_KEYWORD _export
+# define _STLP_IMPORT_KEYWORD _import
+# define _STLP_EXPORT_TEMPLATE_KEYWORD _export
+# define _STLP_IMPORT_TEMPLATE_KEYWORD _import
+#endif
+
+#if ( __BORLANDC__ < 0x501 )
+# define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+# define _STLP_NO_WCHAR_T 1
+#endif
+
+// 4.x
+#if ( __BORLANDC__ < 0x500 )
+# define _STLP_NESTED_TYPE_PARAM_BUG 1
+# define _STLP_STATIC_ARRAY_BUG 1
+# define _STLP_NO_BOOL 1
+# define _STLP_HAS_NO_NAMESPACES 1
+# define _STLP_NEED_TYPENAME 1
+# define _STLP_NEED_EXPLICIT 1
+# define _STLP_NEED_MUTABLE 1
+# define _STLP_NO_WCHAR_T 1
+#endif
+
+// auto enable thread safety and exceptions:
+# ifndef _CPPUNWIND
+# define _STLP_HAS_NO_EXCEPTIONS
+# endif
+
+# if defined ( __MT__ ) && !defined (_NOTHREADS) && !defined (_REENTRANT)
+# define _REENTRANT 1
+# endif
+
+# if defined ( __DEBUG ) && ( __DEBUG > 1 )
+# define _STLP_DEBUG
+# endif
+
+# define _STLP_LIB_BASENAME "stlp"
+
+# if (__BORLANDC__ < 0x540)
+
+# define _STLP_EXPORT_DECLSPEC __declspec(dllexport)
+# define _STLP_IMPORT_DECLSPEC __declspec(dllimport)
+# define _STLP_IMPORT_TEMPLATE_KEYWORD extern
+# define _STLP_EXPORT_TEMPLATE_KEYWORD
+
+# define _STLP_CLASS_EXPORT_DECLSPEC __declspec(dllexport)
+# define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)
+
+# if !defined (_STLP_NO_OWN_IOSTREAMS)
+
+# if ( defined (__DLL) || defined (_DLL) || defined (_WINDLL) || defined (_RTLDLL) \
+ || defined (_STLP_USE_DYNAMIC_LIB) ) \
+ && ! defined (_STLP_USE_STATIC_LIB)
+# undef _STLP_USE_DECLSPEC
+# define _STLP_USE_DECLSPEC
+# endif
+# endif
+
+# else
+
+# define _STLP_EXPORT_DECLSPEC __declspec(dllexport)
+# define _STLP_IMPORT_DECLSPEC __declspec(dllimport)
+
+# define _STLP_CLASS_EXPORT_DECLSPEC __declspec(dllexport)
+# define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)
+
+# if !defined (_STLP_NO_OWN_IOSTREAMS)
+
+# if ( defined (__DLL) || defined (_DLL) || defined (_WINDLL) || defined (_RTLDLL) \
+ || defined(_AFXDLL) || defined (_STLP_USE_DYNAMIC_LIB) )
+# undef _STLP_USE_DECLSPEC
+# define _STLP_USE_DECLSPEC 1
+# endif
+
+# ifndef _STLP_IMPORT_TEMPLATE_KEYWORD
+# define _STLP_IMPORT_TEMPLATE_KEYWORD __declspec(dllimport)
+# endif
+# define _STLP_EXPORT_TEMPLATE_KEYWORD __declspec(dllexport)
+
+# if (__BORLANDC__ >= 0x560) && ! defined (_STLP_OWN_IOSTREAMS)
+// # define _STLP_IS_NATIVE_LIB
+# define _STLP_NATIVE_INCLUDE_PATH ../include/oldstl
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include/oldstl
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include/oldstl
+# define _STLP_NATIVE_CPP_RUNTIME_PATH ../include/oldstl
+# endif
+
+# ifndef __BUILDING_STLPORT
+# ifdef _STLP_DEBUG
+# ifdef _MT
+# ifdef _RTLDLL
+# pragma comment(lib,"stlpmt_stldebug45.lib")
+# else
+# pragma comment(lib,"stlpmt_stldebugst.lib")
+# endif
+# else
+# ifdef _RTLDLL
+# pragma comment(lib,"stlp_stldebug45.lib")
+# else
+# pragma comment(lib,"stlp_stldebugst.lib")
+# endif
+# endif
+# else
+# ifdef _MT
+# ifdef _RTLDLL
+# pragma comment(lib,"stlpmt45.lib")
+# else
+# pragma comment(lib,"stlpmtst.lib")
+# endif
+# else
+# ifdef _RTLDLL
+# pragma comment(lib,"stlp45.lib")
+# else
+# pragma comment(lib,"stlpst.lib")
+# endif
+# endif
+# endif
+# endif
+
+# endif /* _STLP_OWN_IOSTREAMS */
+# endif
diff --git a/src/STLport/config/stl_como.h b/src/STLport/config/stl_como.h
new file mode 100644
index 0000000..f2d7d83
--- /dev/null
+++ b/src/STLport/config/stl_como.h
@@ -0,0 +1,209 @@
+
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+
+# define _STLP_UINT32_T unsigned int
+
+# define _STLP_HAS_NO_NEW_C_HEADERS
+// # define _STLP_VENDOR_GLOBAL_EXCEPT_STD
+// # define _STLP_LONG_LONG
+
+
+//
+// ADDITIONS FOR COMEAU C++, made by Comeau Computing.
+// We can be reached through comeau at comeaucomputing.com
+// You shouldn't need to change anything below here for Comeau C++.
+// If you do, please tell us at comeau at comeaucomputing.com
+//
+// Changes made here, AND THROUGH ALL FILES, based upon the __COMO__ macro
+// (and SIMILAR NAMES INVOLVING COMO).... no doubt some of this will
+// change as SGI integrates the changes into their code base since
+// some changes are not really Comeau C++ specific, but required to
+// make the SGI code compliant with Standard C++).
+//
+// Testing was done with Comeau C++ 4.2.44 and 4.2.45.2. Changes were made for
+// both Comeau relaxed mode and Comeau strict mode, especially for end user code
+// (that is, some of the .cxx files cannot compile in strict mode, because they
+// contain extensions to Standard C++, however their object code forms can
+// be used once compiled in relaxed mode, even if the end user code uses
+// strict mode).
+//
+// These changes may also work for some earlier versions of Comeau C++,
+// though we have not tested them.
+//
+// Actual mods made under RedHat 6.1 LINUX, should be ok with SuSE too and
+// other LINUX's, and older Caldera LINUX, Solaris/SPARC, SunOS, SCO UNIX,
+// and NetBSD. Other platforms may be added. Comeau will also perform
+// custom ports for you.
+//
+// Check libcomo details at http://www.comeaucomputing.com/libcomo and
+// http://www.comeaucomputing.com
+//
+// History of Comeau changes (this is rough, as work was often going on in parallel):
+// BETA1 July 14, 2000, Initial port for RedHat 6.1 INTEL/ELF
+// BETA2 Aug 4, 2000, Stronger RedHat support
+// Support for Comeau strict mode for end user code
+// BETA3 Aug 22, 2000, Support for other LINUX/INTEL/ELF's, including older ones
+// BETA4 Sept 2, 2000, Initial support for SCO UNIX + other UNIX x86 SVR3's
+// Stronger support for end user Comeau strict mode
+// BETA5 Oct 5, 2000, Initial support for Solaris/SPARC
+// More SCO support (though still incomplete)
+// BETA6 Feb 5, 2001, Minor mods to accomodate Comeau C++ 4.2.45.1
+// BETA7 Mar 13, 2001, Verified with Comeau C++ 4.2.45.2
+// Minor NetBSD support
+// BETA8 Apr 1. 2001, Initial support for SunOS/SPARC
+// BETA9 Apr 7, 2001, Stronger SCO support + other UNIX x86 SVR3's
+// Mods for an fpos_t problem for some LINUXes
+// Mods since Destroy did not work in strict mode
+// BETA10 Apr 12. 2001, Stronger NetBSD support
+//
+// PLANNED:
+// BETAx TBA TBA, 2001, NetBSD, UNIXWARE, and Windows support expected
+//
+
+
+#ifdef __linux__
+
+# define _STLP_NO_NATIVE_MBSTATE_T 1
+# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+# define _STLP_NO_NATIVE_WIDE_STREAMS 1
+# define _STLP_NO_LONG_DOUBLE 1
+
+// Comeau C++ under LINUX/INTEL/ELF
+// Preprocess away "long long" routines for now, even in relaxed mode
+# define __wcstoull_internal_defined 1
+# define __wcstoll_internal_defined 1
+
+#endif /* __COMO__ under __linux__ */
+
+#ifdef __USING_x86SVR3x_WITH_COMO /* SCO et al */
+/* UNIX 386+ SVR3 mods made with __USING_x86SVR3x_WITH_COMO
+ in other sources, not here */
+# define atan2l atan2
+# define cosl cos
+# define sinl sin
+# define sqrtl sqrt
+# include <math.h>
+ inline long double expl(long double arg) { return exp(arg); }
+ inline long double logl(long double arg) { return log(arg); }
+# define log10l log10
+
+# define sinhl sinh
+# define coshl cosh
+# define fabsl fabs
+namespace std {
+ inline int min(int a, int b) { return a>b ? b : a; }
+}
+#endif
+
+#ifdef sun
+// Comeau C++ under Solaris/SPARC or SunOS
+
+#ifdef solarissparc
+#define __USING_SOLARIS_SPARC_WITH_COMO /* show this in the source when grep'ing for COMO */
+// Note comowchar.h for Solaris/SPARC wchar stuff
+
+#include <math.h>
+# define sinf sin
+# define sinl sin
+# define sinhf sinh
+# define sinhl sinh
+# define cosf cos
+# define cosl cos
+# define coshf cosh
+# define coshl cosh
+# define atan2l atan2
+# define atan2f atan2
+ inline float logf(float arg) { return log(arg); }
+ inline long double logl(long double arg) { return log(arg); }
+# define log10f log10
+# define log10l log10
+# define expf exp
+ inline long double expl(long double arg) { return exp(arg); }
+# define sqrtf sqrt
+# define sqrtl sqrt
+# define fabsf fabs
+# define fabsl fabs
+#else
+#define __USING_SUNOS_WITH_COMO
+
+#define __unix 1
+#define __EXTENSIONS__ /* This might create undue noise somewhere */
+#endif
+#endif /* sun */
+
+#if defined(__NetBSD__)
+// From non-como #ifdef __GNUC__ above
+#undef _STLP_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE
+#define __unix 1
+
+#include <sys/cdefs.h>
+// Some joker #define'd __END_DECLS as };
+#undef __END_DECLS
+#define __END_DECLS }
+
+// <sys/stat.h> prob
+#include <sys/cdefs.h>
+#undef __RENAME
+#define __RENAME(x)
+
+#define wchar_t __COMO_WCHAR_T
+#include <stddef.h>
+#undef wchar_t
+
+#include <math.h>
+# ifdef BORIS_DISABLED
+# define atan2l atan2
+# define cosl cos
+# define sinl sin
+# define sqrtl sqrt
+ inline long double expl(long double arg) { return exp(arg); }
+ inline long double logl(long double arg) { return log(arg); }
+# define log10l log10
+# define sinhl sinh
+# define coshl cosh
+# define fabsl fabs
+# endif
+#endif /* __NetBSD__ under __COMO__ */
+
+// Shouldn't need to change anything below here for Comeau C++
+// If so, tell us at comeau at comeaucomputing.com
+
+#define _STLP_NO_DRAND48
+
+#define _STLP_PARTIAL_SPECIALIZATION_SYNTAX
+#define _STLP_NO_USING_CLAUSE_IN_CLASS
+
+
+#if __COMO_VERSION__ >= 4245
+#define _STLP_NO_EXCEPTION_HEADER /**/
+#endif
+#define _STLP_NO_BAD_ALLOC /**/
+#define _STLP_USE_AUTO_PTR_CONVERSIONS /**/
+
+#if __COMO_VERSION__ >= 4245
+// Is this needed?
+#include <stdexcept.stdh>
+//
+// ALSO: SEE THE END OF THIS FILE FOR #INCLUDE <IOSTREAM>
+//
+#endif
+
+// this one is true only with MS
+# if defined (_MSC_VER)
+# define _STLP_WCHAR_T_IS_USHORT 1
+# if _MSC_VER <= 1200
+# define _STLP_VENDOR_GLOBAL_CSTD
+# endif
+# if _MSC_VER < 1100
+# define _STLP_NO_BAD_ALLOC 1
+# define _STLP_NO_EXCEPTION_HEADER 1
+# define _STLP_NO_NEW_NEW_HEADER 1
+# define _STLP_NO_NEW_IOSTREAMS 1
+# endif
+# endif
+
+// # define __EDG_SWITCHES
+
+
diff --git a/src/STLport/config/stl_confix.h b/src/STLport/config/stl_confix.h
new file mode 100644
index 0000000..14ca839
--- /dev/null
+++ b/src/STLport/config/stl_confix.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ * STLport configuration file
+ * It is internal STLport header - DO NOT include it directly
+ * Purpose of this file : to define STLport settings that depend on
+ * compiler flags or can be otherwise missed
+ *
+ */
+
+#ifndef _STLP_CONFIX_H
+# define _STLP_CONFIX_H
+
+/* If, by any chance, C compiler gets there, try to help it to pass smoothly */
+# if ! defined (__cplusplus) && ! defined (_STLP_HAS_NO_NAMESPACES)
+# define _STLP_HAS_NO_NAMESPACES
+# endif
+
+# if defined(__MINGW32__)
+# define _STLP_NO_DRAND48
+# endif
+
+/* Modena C++ library */
+#if defined (__MWERKS__) && __MWERKS__ <= 0x2303 || (defined (__KCC) && __KCC_VERSION < 3400)
+# include <mcompile.h>
+# define _STLP_USE_MSIPL 1
+# if defined (__KCC) || (defined(__MSL_CPP__) && \
+ ( (__MSL_CPP__ >= 0x5000 && defined( _MSL_NO_MESSAGE_FACET )) || \
+ (__MSL_CPP__ < 0x5000 && defined( MSIPL_NL_TYPES ))) \
+ )
+# define _STLP_NO_NATIVE_MESSAGE_FACET 1
+# endif
+#endif
+
+/* common switches for EDG front-end */
+# if defined (__EDG_SWITCHES)
+# if !(defined(_TYPENAME) || defined (_TYPENAME_IS_KEYWORD))
+# undef _STLP_NEED_TYPENAME
+# define _STLP_NEED_TYPENAME 1
+# endif
+# if !defined(_WCHAR_T_IS_KEYWORD)
+# undef _STLP_NO_WCHAR_T
+# define _STLP_NO_WCHAR_T 1
+# endif
+# ifndef _PARTIAL_SPECIALIZATION_OF_CLASS_TEMPLATES
+# undef _STLP_NO_CLASS_PARTIAL_SPECIALIZATION
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# endif
+# ifndef _MEMBER_TEMPLATES
+# undef _STLP_NO_MEMBER_TEMPLATES
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# undef _STLP_NO_MEMBER_TEMPLATE_CLASSES
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# endif
+# if !defined(_MEMBER_TEMPLATE_KEYWORD)
+# undef _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# endif
+# if !defined (__EXCEPTIONS) && ! defined (_EXCEPTIONS)
+# undef _STLP_HAS_NO_EXCEPTIONS
+# define _STLP_HAS_NO_EXCEPTIONS
+# endif
+# undef __EDG_SWITCHES
+# endif /* EDG */
+#endif
diff --git a/src/STLport/config/stl_cray.h b/src/STLport/config/stl_cray.h
new file mode 100644
index 0000000..3611261
--- /dev/null
+++ b/src/STLport/config/stl_cray.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+// Mostly correct guess, change it for Alpha (and other environments
+// that has 64-bit "long")
+# define _STLP_UINT32_T unsigned long
+
+// Uncomment if long long is available
+# define _STLP_LONG_LONG long long
+
+// Uncomment this if your compiler can't inline while(), for()
+# define _STLP_LOOP_INLINE_PROBLEMS 1
+
+// Uncomment if native new-style iostreams are not available
+#define _STLP_HAS_NO_NEW_IOSTREAMS 1
+
+// Uncomment this if your compiler does not support exceptions
+// Cray C++ supports exceptions when '-h exceptions' option is user;
+// therefore '-D_STLP_HAS_NO_EXCEPTIONS' must be used when '-h exceptions'
+// is NOT used.
+//# define _STLP_HAS_NO_EXCEPTIONS 1
+
+// Delete?
+// Define this if compiler lacks <exception> header
+//# define _STLP_NO_EXCEPTION_HEADER 1
+
+// Uncomment this if your C library has lrand48() function
+# define _STLP_RAND48 1
+
+// Uncomment if native new-style C library headers lile <cstddef>, etc are not available.
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+
+// uncomment if new-style headers <new> is available
+# define _STLP_NO_NEW_NEW_HEADER 1
+
+// uncomment this if <iostream> and other STD headers put their stuff in ::namespace,
+// not std::
+# define _STLP_VENDOR_GLOBAL_STD
+
+// uncomment this if <cstdio> and the like put stuff in ::namespace,
+// not std::
+# define _STLP_VENDOR_GLOBAL_CSTD
+
+# define _STLP_NATIVE_C_HEADER(__x) </usr/include/##__x>
+// WARNING: Following is hardcoded to the system default C++ include files
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(__x) </opt/ctl/CC/CC/include/##__x>
+
+
+# define _STLP_NO_NATIVE_MBSTATE_T
+# define _STLP_NO_CSTD_FUNCTION_IMPORTS
+//# define _STLP_VENDOR_GLOBAL_EXCEPT_STD
+
+
diff --git a/src/STLport/config/stl_dec.h b/src/STLport/config/stl_dec.h
new file mode 100644
index 0000000..8c265d2
--- /dev/null
+++ b/src/STLport/config/stl_dec.h
@@ -0,0 +1,110 @@
+# define _STLP_HAS_SPECIFIC_PROLOG_EPILOG
+
+# define _STLP_NATIVE_HEADER(header) <../cxx/##header>
+# define _STLP_NATIVE_C_HEADER(x) <../include/##x>
+
+#if (__DECCXX_VER < 60300000)
+# define _STLP_NATIVE_CPP_C_HEADER(header) <../cxx/##header>
+#else
+# define _STLP_NATIVE_CPP_C_HEADER(header) </usr/include/cxx_cname/##header>
+#endif
+
+# define _STLP_NATIVE_OLD_STREAMS_HEADER(header) <../cxx/##header>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../cxx/##header>
+
+// Alpha is little-endian
+# define _STLP_LITTLE_ENDIAN
+
+// collisions
+# define _STLP_DONT_PUT_STLPORT_IN_STD
+
+#if (__DECCXX_VER < 60000000)
+
+// automatic template instantiation does not
+// work with namespaces ;(
+# define _STLP_HAS_NO_NAMESPACES 1
+
+# define _STLP_NO_NEW_NEW_HEADER 1
+
+# define _STLP_NO_WCHAR_T 1
+# define _STLP_NEED_EXPLICIT 1
+
+# define _STLP_NO_BOOL 1
+# define _STLP_NEED_TYPENAME 1
+# define _STLP_NO_NEW_STYLE_CASTS 1
+# define _STLP_NEED_MUTABLE 1
+# define _STLP_NO_BAD_ALLOC 1
+
+
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# define _STLP_NO_FRIEND_TEMPLATES 1
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+# define _STLP_BROKEN_USING_DIRECTIVE 1
+# define _STLP_NO_EXCEPTION_HEADER 1
+# define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+
+#endif
+
+
+#ifdef __NO_USE_STD_IOSTREAM
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# else
+// default is to use new iostreams, anyway
+# ifndef __USE_STD_IOSTREAM
+# define __USE_STD_IOSTREAM
+# endif
+#endif
+
+// # if !defined (_STLP_NEW_IOSTREAMS) && ! defined (_STLP_DONT_REDEFINE_STD) \
+// && ! defined (_STLP_REDEFINE_STD)
+// # undef __PRAGMA_ENVIRONMENT
+// # define _STLP_DONT_REDEFINE_STD
+// # endif
+
+//# ifndef __STD_STRICT_ANSI_ERRORS
+//# endif
+
+#ifndef __EXCEPTIONS
+# define _STLP_HAS_NO_EXCEPTIONS 1
+#endif
+
+# ifdef __IMPLICIT_INCLUDE_ENABLED
+
+// but, works with ours ;).
+# define _STLP_LINK_TIME_INSTANTIATION 1
+# else
+# undef _STLP_LINK_TIME_INSTANTIATION
+# endif
+
+# if defined (__IMPLICIT_USING_STD) && !defined (__NO_USE_STD_IOSTREAM)
+// we should ban that !
+// # error "STLport won't work with new iostreams and std:: being implicitly included. Please use -std strict_ansi[_errors] or specify __NO_USE_STD_IOSTREAM"
+# endif
+
+# if (defined (__STD_STRICT_ANSI) || defined (__STD_STRICT_ANSI_ERRORS))
+# define _STLP_STRICT_ANSI 1
+# else
+// we want to enforce it
+# define _STLP_LONG_LONG long long
+# endif
+
+// unsigned 32-bit integer type
+# define _STLP_UINT32_T unsigned int
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+// # define _STLP_RAND48 1
+
+# define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+
+# if (__DECCXX_VER <= 60400000)
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+# endif
+
diff --git a/src/STLport/config/stl_dec_vms.h b/src/STLport/config/stl_dec_vms.h
new file mode 100644
index 0000000..c4bd6dd
--- /dev/null
+++ b/src/STLport/config/stl_dec_vms.h
@@ -0,0 +1,96 @@
+// OpenVMS version
+
+# define _STLP_NATIVE_HEADER(header) <sys$library:##header>
+# define _STLP_NATIVE_C_HEADER(x) <sys$library:##x>
+# define _STLP_NATIVE_CPP_C_HEADER(header) <sys$library:##header>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <sys$library:##header>
+
+#if (__DECCXX_VER < 60000000)
+
+// automatic template instantiation does not
+// work with namespaces ;(
+# define _STLP_HAS_NO_NAMESPACES 1
+
+# define _STLP_NO_WCHAR_T 1
+# define _STLP_NEED_EXPLICIT 1
+
+# define _STLP_NO_BOOL 1
+# define _STLP_NEED_TYPENAME 1
+# define _STLP_NO_NEW_STYLE_CASTS 1
+# define _STLP_NEED_MUTABLE 1
+# define _STLP_NO_BAD_ALLOC 1
+
+# define _STLP_NO_NEW_NEW_HEADER 1
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# define _STLP_NO_FRIEND_TEMPLATES 1
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+# define _STLP_BROKEN_USING_DIRECTIVE 1
+# define _STLP_NO_EXCEPTION_HEADER 1
+# define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+
+#endif
+
+
+#ifdef __NO_USE_STD_IOSTREAM
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# else
+// default is to use new iostreams, anyway
+# ifndef __USE_STD_IOSTREAM
+# define __USE_STD_IOSTREAM
+# endif
+#endif
+
+// # if !defined (_STLP_NEW_IOSTREAMS) && ! defined (_STLP_DONT_REDEFINE_STD) \
+// && ! defined (_STLP_REDEFINE_STD)
+// # undef __PRAGMA_ENVIRONMENT
+// # define _STLP_DONT_REDEFINE_STD
+// # endif
+
+//# ifndef __STD_STRICT_ANSI_ERRORS
+//# endif
+
+#ifndef __EXCEPTIONS
+# define _STLP_HAS_NO_EXCEPTIONS 1
+#endif
+
+# ifdef __IMPLICIT_INCLUDE_ENABLED
+
+#ifndef _STLP_IOSTREAMS
+// implicit include introduces conflicts
+// between stlport and native lib.
+# undef __IMPLICIT_INCLUDE_ENABLED
+#endif
+
+// but, works with ours ;).
+# define _STLP_LINK_TIME_INSTANTIATION 1
+
+# endif
+
+# if defined (__IMPLICIT_USING_STD) && !defined (__NO_USE_STD_IOSTREAM)
+// we should ban that !
+# error "STLport won't work with new iostreams and std:: being implicitly included. Please use -std strict_ansi[_errors] or specify __NO_USE_STD_IOSTREAM"
+# endif
+
+# if !(defined (__STD_STRICT_ANSI) || defined (__STD_STRICT_ANSI_ERRORS))
+// we want to enforce it
+# define _STLP_LONG_LONG long long
+# endif
+
+// unsigned 32-bit integer type
+# define _STLP_UINT32_T unsigned int
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+// # define _STLP_RAND48 1
+
+# define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+
+#define _STLP_HAS_NO_NEW_C_HEADERS 1
+
diff --git a/src/STLport/config/stl_dm.h b/src/STLport/config/stl_dm.h
new file mode 100644
index 0000000..5866cc6
--- /dev/null
+++ b/src/STLport/config/stl_dm.h
@@ -0,0 +1,225 @@
+// STLport configuration file for Digital Mars C++
+
+#ifndef _STLP_DMC_H
+# define _STLP_DMC_H
+
+#if __DMC__ < 0x832
+#error "Digital Mars C++ versions prior to 8.32 are not supported!"
+#endif
+
+
+#ifndef _CPPUNWIND
+# define _STLP_NO_EXCEPTIONS
+#endif
+# undef _STLP_NO_NAMESPACES
+# define _STLP_NO_RELOPS_NAMESPACE
+# define _STLP_VENDOR_GLOBAL_CSTD
+# define _STLP_VENDOR_GLOBAL_STD
+# define _STLP_VENDOR_EXCEPT_STD std
+
+# if !defined(_WIN32)
+// it's not fully supported on non-Win32 platforms
+# define _STLP_NO_NEW_IOSTREAMS
+# define _STLP_NO_NATIVE_WIDE_FUNCTIONS
+# endif
+
+# if defined(_STLP_NO_NEW_IOSTREAMS) || defined(_STLP_NO_OWN_IOSTREAMS)
+# define _STLP_OWN_NAMESPACE
+# else
+# define _STLP_NO_OWN_NAMESPACE
+# endif
+
+
+// select threads strategy
+# if defined (_MT) && !defined (_NOTHREADS)
+# define _REENTRANT
+# else
+# define _NOTHREADS
+# endif
+
+// select SGI-style alloc instead of allocator<T>
+# define _STLP_USE_SGI_ALLOCATORS
+
+// select allocation method you like
+# undef _STLP_USE_MALLOC
+# define _STLP_USE_NEWALLOC
+
+// this one is not mandatory, just enabled
+# undef _STLP_USE_DEFALLOC
+
+// define _STLP_USE_ABBREVS if your linker has trouble with long
+// external symbols
+# undef _STLP_USE_ABBREVS
+
+
+// unsigned 32-bit integer type
+# define _STLP_UINT32_T unsigned
+
+# ifndef _BOOL_DEFINED
+# define _STLP_NO_BOOL
+# else
+# define _STLP_DONT_USE_BOOL_TYPEDEF
+# endif
+
+# undef _STLP_YVALS_H
+# undef _STLP_LIMITED_DEFAULT_TEMPLATES
+# define _STLP_DEFAULT_TYPE_PARAM
+# undef _STLP_NO_STATIC_TEMPLATE_DATA
+# undef _STLP_RAND48
+# undef _STLP_LOOP_INLINE_PROBLEMS
+
+# undef _STLP_HAS_NO_NAMESPACES
+
+# undef _STLP_NEED_TYPENAME
+# undef _STLP_NEED_EXPLICIT
+# undef _STLP_HAS_NO_EXCEPTIONS
+# undef _STLP_NO_EXCEPTION_SPEC
+# undef _STLP_WEAK_ATTRIBUTE
+# undef _STLP_BASE_MATCH_BUG
+# undef _STLP_NONTEMPL_BASE_MATCH_BUG
+# undef _STLP_NESTED_TYPE_PARAM_BUG
+# undef _STLP_NO_ARROW_OPERATOR
+# undef _STLP_UNINITIALIZABLE_PRIVATE
+# undef _STLP_BASE_TYPEDEF_BUG
+# undef _STLP_BASE_TYPEDEF_OUTSIDE_BUG
+# undef _STLP_CONST_CONSTRUCTOR_BUG
+
+# undef _STLP_NO_NEW_STYLE_CASTS
+
+# ifndef _WCHAR_T_DEFINED
+# define _STLP_NO_WCHAR_T
+# endif
+# define _STLP_HAS_NO_UNIX98_WCHAR_EXTENSIONS
+
+# undef _STLP_WCHAR_T_IS_USHORT
+
+# if _INTEGRAL_MAX_BITS >= 64
+# define _STLP_LONG_LONG long long
+# endif
+
+# undef _STLP_NO_LONG_DOUBLE
+# undef _STLP_NEED_MUTABLE
+# undef _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX
+# undef _STLP_NO_BAD_ALLOC
+# undef _STLP_DEBUG_ALLOC
+# undef _STLP_NO_MEMBER_TEMPLATES
+# undef _STLP_NO_MEMBER_TEMPLATE_CLASSES
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+# undef _STLP_NO_FRIEND_TEMPLATES
+# undef _STLP_NO_QUALIFIED_FRIENDS
+# undef _STLP_NO_CLASS_PARTIAL_SPECIALIZATION
+# undef _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
+# undef _STLP_AUTOMATIC_TYPE_TRAITS
+# undef _STLP_MEMBER_POINTER_PARAM_BUG
+# undef _STLP_NON_TYPE_TMPL_PARAM_BUG
+# undef _STLP_NO_DEFAULT_NON_TYPE_PARAM
+# undef _STLP_NO_METHOD_SPECIALIZATION
+# undef _STLP_STATIC_ARRAY_BUG
+# undef _STLP_STATIC_CONST_INIT_BUG
+# undef _STLP_TRIVIAL_CONSTRUCTOR_BUG
+# undef _STLP_TRIVIAL_DESTRUCTOR_BUG
+# undef _STLP_BROKEN_USING_DIRECTIVE
+# undef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+# undef _STLP_NO_EXCEPTION_HEADER
+# undef _STLP_DEFAULT_CONSTRUCTOR_BUG
+
+# define _STLP_HAS_NO_NEW_IOSTREAMS
+# define _STLP_HAS_NO_NEW_C_HEADERS
+# define _STLP_THROW_RETURN_BUG
+# undef _STLP_LINK_TIME_INSTANTIATION
+# undef _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS
+# undef _STLP_NO_TEMPLATE_CONVERSIONS
+# undef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+
+
+# define _STLP_NO_NATIVE_MBSTATE_T
+
+
+# define _STLP_EXPORT_DECLSPEC __declspec(dllexport)
+# define _STLP_IMPORT_DECLSPEC __declspec(dllimport)
+
+# define _STLP_CLASS_EXPORT_DECLSPEC __declspec(dllexport)
+# define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)
+
+# define _STLP_IMPORT_TEMPLATE_KEYWORD __declspec(dllimport)
+# define _STLP_EXPORT_TEMPLATE_KEYWORD __declspec(dllexport)
+
+#define _STLP_NATIVE_HEADER(header) <../include/##header>
+#define _STLP_NATIVE_C_HEADER(header) <../include/##header>
+#define _STLP_NATIVE_CPP_C_HEADER(header) <../include/##header>
+#define _STLP_NATIVE_OLD_STREAMS_HEADER(header) <../include/##header>
+#define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../include/##header>
+
+
+# if defined(__BUILDING_STLPORT) && defined(_WINDLL)
+# define _STLP_CALL __export
+
+# undef _STLP_USE_DECLSPEC
+# define _STLP_USE_DECLSPEC 1
+# endif
+
+# if !defined (__BUILDING_STLPORT) && !defined (_STLP_NO_OWN_IOSTREAMS)
+# if (defined (_DLL) && !defined (_STLP_DONT_USE_DLL)) || defined (_STLP_USE_DLL)
+# undef _STLP_USE_DECLSPEC
+# define _STLP_USE_DECLSPEC 1
+# endif
+
+# if defined (_STLP_DEBUG)
+# if defined (_DLL)
+# if !defined (_STLP_DONT_USE_DLL)
+# pragma comment(lib,"stlp45dm_stldebug.lib")
+# else
+# pragma comment(lib,"stlp45dm_stldebug_staticx.lib")
+# endif
+# else
+# if defined (_STLP_USE_DLL)
+# pragma comment(lib,"stlp45dms_stldebug.lib")
+# else
+# pragma comment(lib,"stlp45dm_stldebug_static.lib")
+# endif
+# endif
+# elif defined (DEBUG)
+# if defined (_DLL)
+# if !defined (_STLP_DONT_USE_DLL)
+# pragma comment(lib,"stlp45dm_debug.lib")
+# else
+# pragma comment(lib,"stlp45dm_debug_staticx.lib")
+# endif
+# else
+# if defined (_STLP_USE_DLL)
+# pragma comment(lib,"stlp45dms_debug.lib")
+# else
+# pragma comment(lib,"stlp45dm_debug_static.lib")
+# endif
+# endif
+# else
+# if defined (_DLL)
+# if !defined (_STLP_DONT_USE_DLL)
+# pragma comment(lib,"stlp45dm.lib")
+# else
+# pragma comment(lib,"stlp45dm_staticx.lib")
+# endif
+# else
+# if defined (_STLP_USE_DLL)
+# pragma comment(lib,"stlp45dms.lib")
+# else
+# pragma comment(lib,"stlp45dm_static.lib")
+# endif
+# endif
+# endif
+# endif
+
+
+#ifdef __BUILDING_STLPORT
+// still needed for building STLport itself, but isn't needed for
+// compiling applications anymore
+# undef __SC__
+#endif
+
+#undef __STLP_NO_KEYWORDS_WORKAROUND
+#if !defined (__STLP_NO_KEYWORDS_WORKAROUND)
+# define __in __stl_in
+# define __out __stl_out
+#endif
+
+#endif
diff --git a/src/STLport/config/stl_fujitsu.h b/src/STLport/config/stl_fujitsu.h
new file mode 100644
index 0000000..cc77540
--- /dev/null
+++ b/src/STLport/config/stl_fujitsu.h
@@ -0,0 +1,5 @@
+/* STLport configuration for Fujitsu compiler : looks like a perfect one ! */
+# define _STLP_NATIVE_INCLUDE_PATH ../std
+# define _STLP_UINT32_T unsigned int
+# define _STLP_LONG_LONG long long
+# define _STLP_WCHAR_SUNPRO_EXCLUDE 1
diff --git a/src/STLport/config/stl_gcc.h b/src/STLport/config/stl_gcc.h
new file mode 100644
index 0000000..56d0359
--- /dev/null
+++ b/src/STLport/config/stl_gcc.h
@@ -0,0 +1,376 @@
+/* STLport configuration file
+ * It is internal STLport header - DO NOT include it directly
+ */
+
+/* Systems having GLIBC installed have different traits */
+#if ! defined (_STLP_USE_GLIBC) && ( defined (__linux__) || defined (__CYGWIN__) )
+# define _STLP_USE_GLIBC
+#endif
+
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+
+# if defined(__FreeBSD__) || defined (__hpux) || defined(__amigaos__) || ( defined(__OS2__) && defined(__EMX__) )
+# define _STLP_NO_WCHAR_T
+# endif
+
+#ifdef __USLC__
+# include <config/stl_sco.h>
+#endif
+
+# if defined (__sun)
+
+// gcc does not support ELF64 yet ; however; it supports ultrasparc + v8plus.
+// limits.h contains invalid values for this combination
+# if (defined (__sparc_v9__) || defined (__sparcv9)) && ! defined ( __WORD64 )
+# define __LONG_MAX__ 2147483647L
+# endif
+
+# include <config/stl_solaris.h>
+# endif
+
+// no thread support on AmigaOS
+#if defined (__amigaos__)
+# define _NOTHREADS
+# define _STLP_NO_THREADS
+#endif
+
+// azov: gcc on lynx have a bug that causes internal
+// compiler errors when compiling STLport with namespaces turned on.
+// When the compiler gets better - comment out _STLP_HAS_NO_NAMESPACES
+# if defined (__Lynx__) && (__GNUC__ < 3)
+# define _STLP_HAS_NO_NAMESPACES 1
+# define _STLP_NO_STATIC_TEMPLATE_DATA 1
+// turn off useless warning about including system headers
+# define __NO_INCLUDE_WARN__ 1
+# endif
+
+
+/* Tru64 Unix, AIX, HP : gcc there by default uses uses native ld and hence cannot auto-instantiate
+ static template data. If you are using GNU ld, please say so in stl_user_config.h header */
+# if (__GNUC__ < 3) && ! (_STLP_GCC_USES_GNU_LD) && \
+ ((defined (__osf__) && defined (__alpha__)) || defined (_AIX) || defined (__hpux) || defined(__amigaos__) )
+# define _STLP_NO_STATIC_TEMPLATE_DATA
+# endif
+
+# if defined(__DJGPP)
+# define _STLP_RAND48 1
+# define _NOTHREADS 1
+# undef _PTHREADS
+# define _STLP_LITTLE_ENDIAN
+# endif
+
+# if defined(__MINGW32__)
+/* Mingw32, egcs compiler using the Microsoft C runtime */
+# undef _STLP_NO_DRAND48
+# define _STLP_NO_DRAND48
+# ifdef _MT
+# define _REENTRANT
+# endif
+# define _STLP_IMPORT_DECLSPEC __attribute__((dllimport))
+# define _STLP_EXPORT_DECLSPEC __attribute__((dllexport))
+# define _STLP_CLASS_IMPORT_DECLSPEC __attribute__((dllimport))
+# define _STLP_CLASS_EXPORT_DECLSPEC __attribute__((dllexport))
+# define _STLP_CALL
+
+# if defined (_STLP_USE_DYNAMIC_LIB)
+# define _STLP_USE_DECLSPEC 1
+// # define _STLP_USE_TEMPLATE_EXPORT 1
+/* Using dynamic library in MinGW requires _STLP_NO_CUSTOM_IO */
+# define _STLP_NO_CUSTOM_IO
+# endif
+
+# endif
+
+#if defined (__CYGWIN__) || defined (__MINGW32__) || !(defined (_STLP_USE_GLIBC) || defined (__sun))
+#ifndef __MINGW32__
+# define _STLP_NO_NATIVE_MBSTATE_T 1
+#endif
+# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+# define _STLP_NO_NATIVE_WIDE_STREAMS 1
+# elif defined(__linux__)
+# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+# define _STLP_NO_NATIVE_WIDE_STREAMS 1
+# elif defined (__sun)
+# define _STLP_WCHAR_BORLAND_EXCLUDE
+# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+#endif
+
+/* Mac OS X is a little different with namespaces and cannot instantiate
+ * static data members in template classes */
+# if defined (__APPLE__)
+/* Mac OS X is missing a required typedef and standard macro */
+typedef unsigned int wint_t;
+
+# define __unix
+
+# if (__GNUC__ < 3)
+
+ /* Mac OS X needs one and only one source file to initialize all static data
+ * members in template classes. Only one source file in an executable or
+ * library can declare instances for such data members, otherwise duplicate
+ * symbols will be generated. */
+
+# define _STLP_NO_STATIC_TEMPLATE_DATA
+# define _STLP_STATIC_CONST_INIT_BUG 1
+# define _STLP_STATIC_TEMPLATE_DATA 0
+# define _STLP_WEAK_ATTRIBUTE 1
+ /* Workaround for the broken Mac OS X C++ preprocessor which cannot handle
+ * parameterized macros in #include statements */
+# define _STLP_NATIVE_HEADER(header) <../g++/##header##>
+# define _STLP_NATIVE_C_HEADER(header) <../include/##header##>
+# define _STLP_NATIVE_CPP_C_HEADER(header) <../g++/##header##>
+# define _STLP_NATIVE_OLD_STREAMS_HEADER(header) <../g++/##header##>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../g++/##header##>
+# endif /* __GNUC__ < 3 */
+
+# define _STLP_NO_LONG_DOUBLE
+
+/* Mac OS X needs all "::" scope references to be "std::" */
+#define _STLP_USE_NEW_C_HEADERS
+# endif
+
+
+# if defined(__BEOS__) && defined(__INTEL__)
+# define _STLP_NATIVE_HEADER(header) <../stlport/beos/##header##>
+# define _STLP_NATIVE_C_HEADER(header) <../stlport/beos/##header##>
+# define _STLP_NATIVE_CPP_C_HEADER(header) <../stlport/beos/##header##>
+# define _STLP_NATIVE_OLD_STREAMS_HEADER(header) <../stlport/beos/##header##>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../stlport/beos/##header##>
+# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+# define _STLP_NO_NATIVE_WIDE_STREAMS 1
+//# define _NOTHREADS 1
+# ifdef _PTHREADS
+# undef _PTHREADS
+# endif
+# ifdef _STLP_PTHREADS
+# undef _STLP_PTHREADS
+# endif
+# define _STLP_USE_STDIO_IO 1
+# define _STLP_USE_GLIBC 1
+# endif
+
+
+/* g++ 2.7.x and above */
+# define _STLP_LONG_LONG long long
+
+# if (__GNUC__ >= 3)
+# ifndef _STLP_HAS_NO_NEW_C_HEADERS
+# define _STLP_HAS_NATIVE_FLOAT_ABS
+# else
+# ifdef _STLP_USE_GLIBC
+# define _STLP_VENDOR_LONG_DOUBLE_MATH 1 // - ptr: with new c headers no needs
+// # define _STLP_REAL_LOCALE_IMPLEMENTED
+# endif
+# endif
+# endif
+
+# if (__GNUC__ < 3)
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+# define _STLP_VENDOR_GLOBAL_CSTD 1
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# ifndef __HONOR_STD
+# define _STLP_VENDOR_GLOBAL_EXCEPT_STD 1
+# endif
+# endif
+
+# if (__GNUC_MINOR__ < 95) && (__GNUC__ < 3)
+/* egcs fails to initialize builtin types in expr. like this : new(p) char(); */
+# define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+# define _STLP_INCOMPLETE_EXCEPTION_HEADER
+# endif
+
+# if (__GNUC_MINOR__ < 9) && (__GNUC__ < 3) /* gcc 2.8 */
+# define _STLP_NO_TEMPLATE_CONVERSIONS
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+# define _STLP_NO_FRIEND_TEMPLATES 1
+# define _STLP_HAS_NO_NAMESPACES 1
+# define _STLP_NO_METHOD_SPECIALIZATION 1
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+/* DJGPP doesn't seem to implement it in 2.8.x */
+# ifdef DJGPP
+# define _STLP_NO_STATIC_TEMPLATE_DATA 1
+# endif
+# endif
+
+# if __GNUC__ <= 2 && __GNUC_MINOR__ <= 7 && ! defined (__CYGWIN32__)
+/* Will it work with 2.6 ? I doubt it. */
+# if ( __GNUC_MINOR__ < 6 )
+ __GIVE_UP_WITH_STL(GCC_272);
+# endif
+
+# define _STLP_NO_RELOPS_NAMESPACE
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG
+# define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+# define _STLP_DEFAULT_TYPE_PARAM 1
+# define _STLP_NO_BAD_ALLOC
+# define _STLP_NO_ARROW_OPERATOR 1
+# ifndef _STLP_NO_STATIC_TEMPLATE_DATA
+# define _STLP_NO_STATIC_TEMPLATE_DATA
+# endif
+# define _STLP_STATIC_CONST_INIT_BUG 1
+# define _STLP_NO_METHOD_SPECIALIZATION 1
+
+# if !defined (__CYGWIN32__)
+# define _STLP_NESTED_TYPE_PARAM_BUG 1
+# define _STLP_BASE_MATCH_BUG 1
+/* unused operators are required (forward) */
+# define _STLP_CONST_CONSTRUCTOR_BUG
+# define _STLP_NO_DEFAULT_NON_TYPE_PARAM
+# endif
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+# define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+# define _STLP_NO_EXCEPTION_HEADER 1
+# else /* ! <= 2.7.* */
+# endif /* ! <= 2.7.* */
+
+/* static template data members workaround strategy for gcc tries
+ * to use weak symbols.
+ * if you don't want to use that, #define _STLP_WEAK_ATTRIBUTE=0 ( you'll
+ * have to put "#define __PUT_STATIC_DATA_MEMBERS_HERE" line in one of your
+ * compilation unit ( or CFLAGS for it ) _before_ including any STL header ).
+ */
+# if defined (_STLP_NO_STATIC_TEMPLATE_DATA) && ! defined (_STLP_WEAK_ATTRIBUTE )
+/* systems using GNU ld or format that supports weak symbols
+ may use "weak" attribute
+ Linux & Solaris ( x86 & SPARC ) are being auto-recognized here */
+# if defined(_STLP_GNU_LD) || defined(__ELF__) || defined (__CYGWIN__) || \
+ (( defined (__SVR4) || defined ( __svr4__ )) && \
+ ( defined (sun) || defined ( __sun__ )))
+# define _STLP_WEAK_ATTRIBUTE 1
+# endif
+# endif /* _STLP_WEAK_ATTRIBUTE */
+
+
+/* strict ANSI prohibits "long long" ( gcc) */
+# if defined ( __STRICT_ANSI__ )
+# undef _STLP_LONG_LONG
+// # define _STLP_STRICT_ANSI 1
+# endif
+
+//# if !defined (__STRICT_ANSI__) || defined (__BUILDING_STLPORT)
+//# define _STLP_USE_TEMPLATE_EXPORT
+//# define _STLP_EXPORT_TEMPLATE_KEYWORD extern
+//# define _STLP_IMPORT_TEMPLATE_KEYWORD extern
+//# endif
+
+# ifndef __EXCEPTIONS
+# undef _STLP_HAS_NO_EXCEPTIONS
+# define _STLP_HAS_NO_EXCEPTIONS 1
+# endif
+
+# if (__GNUC__ >= 3)
+
+# if ((__GNUC_MINOR__ == 0) || (__APPLE__))
+# define _STLP_NATIVE_INCLUDE_PATH ../g++-v3
+# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../g++-v3/backward
+# else
+# if defined(__GNUC_PATCHLEVEL__) && (__GNUC_PATCHLEVEL__ > 0)
+# define _STLP_NATIVE_INCLUDE_PATH ../__GNUC__.__GNUC_MINOR__.__GNUC_PATCHLEVEL__
+# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../__GNUC__.__GNUC_MINOR__.__GNUC_PATCHLEVEL__/backward
+# else
+# define _STLP_NATIVE_INCLUDE_PATH ../__GNUC__.__GNUC_MINOR__
+# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../__GNUC__.__GNUC_MINOR__/backward
+# endif
+# endif
+
+# elif (__GNUC_MINOR__ < 8)
+
+# define _STLP_NO_OWN_IOSTREAMS 1
+# undef _STLP_OWN_IOSTREAMS
+# define _STLP_NATIVE_INCLUDE_PATH ../g++-include
+
+/* tuning of static template data members workaround */
+# if ( _STLP_STATIC_TEMPLATE_DATA < 1 )
+# if ( _STLP_WEAK_ATTRIBUTE > 0 )
+# define _STLP_WEAK __attribute__ (( weak ))
+# else
+# define _STLP_WEAK
+# endif /* _STLP_WEAK_ATTRIBUTE */
+
+# ifdef __PUT_STATIC_DATA_MEMBERS_HERE
+# define __DECLARE_INSTANCE(type,item,init) type item _STLP_WEAK init
+# else
+# define __DECLARE_INSTANCE(type,item,init)
+# endif /* __PUT_STATIC_DATA_MEMBERS_HERE */
+# endif /* _STLP_STATIC_TEMPLATE_DATA */
+
+# else
+
+// gcc-2.95.0 used to use "g++-3" directory which has been changed to "g++" in
+// system-dependent "include" for 2.95.2 except for Cygwin and Mingw packages.
+// I expect "g++-3" not being used in later releases.
+// If your installation use "g++-3" include directory for any reason (pre-2.95.2 or Win binary kit),
+// please change the macro below to point to your directory.
+
+# if defined(__DJGPP)
+# define _STLP_NATIVE_INCLUDE_PATH ../lang/cxx
+# elif (__GNUC__ >= 3) || (__GNUC_MINOR__ >= 97)
+# define _STLP_NATIVE_INCLUDE_PATH ../include/g++-v3
+# elif ((__GNUC_MINOR__ >= 95 && __GNUC_MINOR__ < 97) && !( defined (__FreeBSD__) || defined (__NetBSD__) || defined(__sgi) || defined (__OS2__) ) )
+# define _STLP_NATIVE_INCLUDE_PATH ../g++-3
+# elif (__GNUC_MINOR__ > 8) && (__GNUC_MINOR__ < 95) && (__GNUC__ < 3) && !defined( __Lynx__ )
+// this really sucks, as GNUpro does not really identifies itself, so we have to guess
+// depending on a platform
+# ifdef __hpux
+# define _STLP_NATIVE_INCLUDE_PATH ../g++-3
+# else
+# define _STLP_NATIVE_INCLUDE_PATH ../g++-2
+# endif
+# else
+# define _STLP_NATIVE_INCLUDE_PATH g++
+# endif
+
+// <exception> et al
+# ifdef __FreeBSD__
+# if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ > 95)
+# define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH ../include
+# endif
+# else
+// azov
+# ifdef __Lynx__
+# define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH
+# else
+# if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)
+// # define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH ../g++-v3
+# else
+# define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH ../include
+# endif
+# endif
+# endif
+
+#endif /* GNUC_MINOR < 8 */
+
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include
+
+
+#ifdef _SCO_ELF
+# define _STLP_SCO_OPENSERVER
+# if defined(_REENTRANT)
+# define _UITHREADS /* if UnixWare < 7.0.1 */
+# define _STLP_UITHREADS
+# endif /* _REENTRANT */
+#endif
+
+// Tune settings for the case where static template data members are not
+// instaniated by default
+# if defined ( _STLP_NO_STATIC_TEMPLATE_DATA )
+# define _STLP_STATIC_TEMPLATE_DATA 0
+# if !defined ( _STLP_WEAK_ATTRIBUTE )
+# define _STLP_WEAK_ATTRIBUTE 0
+# endif
+# ifdef __PUT_STATIC_DATA_MEMBERS_HERE
+# define __DECLARE_INSTANCE(type,item,init) type item init
+# else
+# define __DECLARE_INSTANCE(type,item,init)
+# endif
+# else
+# define _STLP_STATIC_TEMPLATE_DATA 1
+# endif
+
+
+
+
diff --git a/src/STLport/config/stl_hpacc.h b/src/STLport/config/stl_hpacc.h
new file mode 100644
index 0000000..e25f101
--- /dev/null
+++ b/src/STLport/config/stl_hpacc.h
@@ -0,0 +1,218 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+// system C-library dependent
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+// # define _STLP_RAND48 1
+# define _STLP_NO_NATIVE_MBSTATE_T 1
+# define _STLP_HPACC_BROKEN_BUFEND 1
+# define _STLP_WCHAR_HPACC_EXCLUDE 1
+
+// this was reported to help, just as with SUN CC 4.2
+# define _STLP_INLINE_STRING_LITERAL_BUG
+
+
+// specific prolog is needed to select correct threads impl
+# define _STLP_HAS_SPECIFIC_PROLOG_EPILOG
+
+// HP aCC with +noeh
+# ifdef __HPACC_NOEH
+# define _STLP_HAS_NO_EXCEPTIONS 1
+# endif
+
+// HP compilers
+// At that point, we only know we are on HP (and _not_ using gcc,
+// according to "stlcomp.h"
+
+// __HP_aCC indicate HP ANSI C++, but not always (03.xx does not
+// define it before 3.13, for example).
+//
+# if defined(__HP_aCC)
+
+# if __HP_aCC < 33100
+# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../iostream
+# else
+# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../include/iostream
+# endif
+
+# define _STLP_LONG_LONG long long
+
+#if (__HP_aCC <= 30000 && __HP_aCC >= 12100)
+
+//Special kludge to workaround bug in aCC A.01.23, CR JAGac40634
+#ifdef _STLP_DEBUG
+static void _STLP_dummy_literal() { const char *p = "x";}
+static void _STLP_dummy_literal_2() { const char *p = "123456789"; }
+static void _STLP_dummy_literal_3() { const char *p = "123456700000000000000089";}
+#endif
+
+# define _STLP_HP_ACC 0123
+# define _STLP_NATIVE_INCLUDE_PATH ../include
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include
+# define _STLP_VENDOR_GLOBAL_STD 1
+# define _STLP_VENDOR_GLOBAL_CSTD 1
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# define _STLP_DONT_THROW_RANGE_ERRORS 1
+# define _STLP_STATIC_CONST_INIT_BUG 1
+#if (__HP_aCC < 12700)
+//new flag: on most HP compilers cwchar is missing
+# define _STLP_NO_CWCHAR
+#endif
+
+# define _STLP_FORCE_ALLOCATORS(t,a) \
+ typedef typename _Alloc_traits<t,a>::_Orig _STLP_dummy_type1;\
+ typedef typename _STLP_dummy_type1:: _STLP_TEMPLATE rebind<t>::other _STLP_dummy_type2;
+
+# endif /* 123 */
+
+// latest version and up
+# if (__HP_aCC >= 32500 )
+# define _STLP_HP_ACC 0325
+
+# define _STLP_FORCE_ALLOCATORS(t,a) \
+ typedef typename _Alloc_traits<t,a>::_Orig _STLP_dummy_type1;\
+ typedef typename _STLP_dummy_type1:: _STLP_TEMPLATE rebind<t>::other _STLP_dummy_type2;
+
+# if !defined( _INCLUDE__STDC_A1_SOURCE ) // HP-UX 11i only
+# define _STLP_HAS_NO_UNIX98_WCHAR_EXTENSIONS
+# endif
+
+# if defined(_HP_NAMESPACE_STD) // option -AA
+// from now, we have a full standard lib in namespace std
+//
+// -AA indicates that we are compiling against Rogue Wave 2.2.1
+// STL shipped with the HP aCC compiler. -AA tells the compiler
+// to use the STL defined in the include_std directory.
+//
+# define _STLP_NATIVE_INCLUDE_PATH ../include_std
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include_std
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include_std
+
+// # define _STLP_HPACC_ONLY_NATIVE_STRING 1 // STLPort _string.c includes <locale>
+# define _STLP_HP_ACC_COMPAT -1
+# else // option -Aa
+# define _STLP_NATIVE_INCLUDE_PATH ../include
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include
+# define _STLP_VENDOR_GLOBAL_STD 1
+# define _STLP_VENDOR_GLOBAL_CSTD 1
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+// Add the following in _site_config.h if "-Wc,-koenig_lookup,on" not used
+//# define _STLP_NO_KOENIG_LOOKUP 1
+# define _STLP_DONT_THROW_RANGE_ERRORS 1
+# endif /* _NAMESPACE_STD */
+# endif
+
+# if (__HP_aCC >= 31400 && __HP_aCC < 32500)
+# define _STLP_HP_ACC 0314
+
+# define _STLP_FORCE_ALLOCATORS(t,a) \
+typedef typename _Alloc_traits<t,a>::_Orig _STLP_dummy_type1;\
+typedef typename _STLP_dummy_type1:: _STLP_TEMPLATE rebind<t>::other _STLP_dummy_type2;
+# define _STLP_NO_CWCHAR
+# if defined(_NAMESPACE_STD) // option -AA
+// from now, we have a full standard lib in namespace std
+# define _STLP_NATIVE_INCLUDE_PATH ../include_std
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include_std
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include_std
+// # define _STLP_HPACC_ONLY_NATIVE_STRING 1 // STLPort _string.c includes <locale>
+# define _STLP_HP_ACC_COMPAT -1
+# else // kind of compatibility mode
+# define _STLP_NATIVE_INCLUDE_PATH ../include
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include
+# define _STLP_VENDOR_GLOBAL_STD 1
+# define _STLP_VENDOR_GLOBAL_CSTD 1
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+// comment if "-Wc,-koenig_lookup,on" id used
+# define _STLP_NO_KOENIG_LOOKUP 1
+# define _STLP_DONT_THROW_RANGE_ERRORS 1
+# define _STLP_NO_ROPE 1
+# endif /* _NAMESPACE_STD */
+# endif /* 314 */
+
+# if ((__HP_aCC >= 30000 && __HP_aCC < 31400) || (__HP_aCC == 1)) // A.03.13: __HP_aCC == 1
+
+#if (__HP_aCC != 1)
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+#endif
+
+# define _STLP_HAS_NO_NEW_IOSTREAMS
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+// aCC bug ? need explicit args on constructors of partial specialized
+// classes
+# define _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS 1
+// ?? fbp: really needed ?
+# define _STLP_STATIC_ARRAY_BUG 1
+// ?? fbp : maybe present in some versions ?
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+// <exception> and stuff is in global namespace
+# define _STLP_VENDOR_GLOBAL_EXCEPT_STD
+// fbp : moved here
+# define _STLP_VENDOR_GLOBAL_CSTD 1
+// # define _INCLUDE_HPUX_SOURCE
+# define _XPG4
+# define _INCLUDE_XOPEN_SOURCE
+# define _INCLUDE_AES_SOURCE
+# endif /* < 314 */
+# if __HP_aCC == 1
+# define _STLP_BROKEN_USING_IN_CLASS
+# define _STLP_USING_BASE_MEMBER
+# define _STLP_NO_CWCHAR
+// # define _STLP_NO_WCHAR_T 1
+# endif
+# endif /* HP_ACC */
+
+//
+# ifndef __HP_aCC
+# define _STLP_NATIVE_INCLUDE_PATH ../CC
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include
+// it is HP's old cfront-based compiler.
+# define _STLP_NO_BOOL 1
+// # define _STLP_DONT_USE_BOOL_TYPEDEF 1
+# define _STLP_NO_NEW_NEW_HEADER 1
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+# define _STLP_NO_SIGNED_BUILTINS
+# define _STLP_HAS_NO_NAMESPACES 1
+# define _STLP_NEED_TYPENAME 1
+# define _STLP_NEED_EXPLICIT 1
+# define _STLP_NO_EXCEPTION_SPEC 1
+# define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+# define _STLP_NO_ARROW_OPERATOR 1
+# define _STLP_BASE_MATCH_BUG
+# define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+# define _STLP_NO_NEW_STYLE_CASTS 1
+// # define _STLP_NO_WCHAR_T 1
+// # define _STLP_LONG_LONG long long
+# define _STLP_NEED_MUTABLE 1
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+# define _STLP_NO_BAD_ALLOC 1
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# define _STLP_NO_FRIEND_TEMPLATES 1
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+# define _STLP_MEMBER_POINTER_PARAM_BUG 1
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+# define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+// # define _STLP_NO_METHOD_SPECIALIZATION 1
+# define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+# define _STLP_NO_EXCEPTION_HEADER 1
+# define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+// # define _STLP_STATIC_CONST_INIT_BUG 1
+// # define _STLP_THROW_RETURN_BUG 1
+// # define _STLP_LINK_TIME_INSTANTIATION 1
+// # define _STLP_NO_TEMPLATE_CONVERSIONS 1
+# define _STLP_NO_TYPEINFO 1
+# define _STLP_WCHAR_T_IS_USHORT 1
+
+# endif /* cfront */
+
diff --git a/src/STLport/config/stl_ibm.h b/src/STLport/config/stl_ibm.h
new file mode 100644
index 0000000..7b00820
--- /dev/null
+++ b/src/STLport/config/stl_ibm.h
@@ -0,0 +1,139 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+#if !defined(__IBMCPP__) || (__IBMCPP__ < 500)
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+#endif
+
+// string literal problem, same as with SUN and aCC
+# define _STLP_INLINE_STRING_LITERAL_BUG 1
+# define _STLP_HAS_NATIVE_FLOAT_ABS
+
+# define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+
+
+# ifdef __IBMCPP__
+# define _STLP_HAS_SPECIFIC_PROLOG_EPILOG
+# endif
+
+// # if ( defined (__MULTI__) && defined (__WINDOWS__))
+// # define _STLP_WIN32THREADS 1 // Only Visual Age 3.5 for Windows
+// # endif
+
+# if ( defined (__MULTI__) && defined (__OS2__))
+# define _STLP_OS2THREADS 1
+# endif
+
+// __TEMPINC__ is set when /Ft+ option is used
+# ifdef __TEMPINC__
+# define _STLP_LINK_TIME_INSTANTIATION 1
+# endif
+
+# if defined (__MVS__)
+// long long support is buggy - reported by Tinny Ng
+// # if __EXTENDED__ && __COMPILER_VER__ >= 0x22060000
+// # define _STLP_LONG_LONG long long
+// # endif
+// boris : hstash reported it can be treated like UNIX
+# define _STLP_UNIX 1
+# define _STLP_NO_TYPEINFO 1
+# undef _STLP_NATIVE_INCLUDE_PATH
+# define _STLP_NATIVE_INCLUDE_PATH /usr/lpp/ioclib/include
+// same for C headers like <string.h>
+# undef _STLP_NATIVE_C_INCLUDE_PATH
+# define _STLP_NATIVE_C_INCLUDE_PATH /usr/include
+# define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH /usr/include
+
+# elif (defined (__WINDOWS__) || defined (_AIX) || defined (__OS2__) ) && (__IBMCPP__ >= 350)
+
+# define _STLP_LONG_LONG long long
+
+#endif
+
+#if !( defined( __xlC__ ) && __xlC__ >= 0x500 )
+
+// AIX xlC 3.1 , 3.0.1 ==0x301
+// Visual Age C++ 3.x
+// OS-390 C++
+// fbp : should be more version-specific!
+
+# define _STLP_NO_BOOL 1
+# define _STLP_DONT_USE_BOOL_TYPEDEF 1
+# define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+# define _STLP_HAS_NO_NAMESPACES 1
+# define _STLP_NEED_TYPENAME 1
+# define _STLP_NEED_EXPLICIT 1
+# define _STLP_NO_ARROW_OPERATOR 1
+# define _STLP_NO_NEW_STYLE_CASTS 1
+# define _STLP_NO_WCHAR_T 1
+# define _STLP_NEED_MUTABLE 1
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+# define _STLP_NO_BAD_ALLOC 1
+
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# define _STLP_NO_FRIEND_TEMPLATES 1
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+
+# define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+# define _STLP_NO_METHOD_SPECIALIZATION 1
+# define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+# define _STLP_NO_EXCEPTION_HEADER 1
+
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# define _STLP_NO_NEW_NEW_HEADER 1
+
+# if defined (__OS2__) && (__IBMCPP__ <= 350)
+# define _STLP_NO_TYPEINFO 1
+# endif
+# define _STLP_NO_NEW_NEW_HEADER 1
+
+# define _STLP_STATIC_CONST_INIT_BUG 1
+// # define _STLP_THROW_RETURN_BUG 1
+
+
+# define _STLP_NO_TEMPLATE_CONVERSIONS 1
+# define _STLP_UNINITIALIZABLE_PRIVATE 1
+# define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+# define _STLP_STATIC_ARRAY_BUG 1
+
+// AIX xlC, Visual Age 3.0 for OS/2 and MS
+# define _STLP_TRIVIAL_DESTRUCTOR_BUG
+
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+# define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+
+#if __IBMCPP__ <= 350
+# define _STLP_NEED_UNREACHABLE_RETURN 1
+#endif
+
+#if __IBMCPP__ < 350
+# define _STLP_NO_LONG_DOUBLE 1
+#endif
+
+#if __IBMCPP__ >= 365
+// does not have new C headers, but has div()
+# define _STLP_LDIV
+#endif
+
+#endif /* xlC 5 */
+
+/* detect xlC5 by: */
+#if defined(__IBMCPP__) && (500 <= __IBMCPP__) && (__IBMCPP__ < 700)
+// #define _STLP_USE_EXCEPTIONS 1
+# define _STLP_STATIC_CONST_INIT_BUG 1
+//#pragma report(disable,CPPC1500029)
+// unsigned 32-bit integer type
+# define _STLP_UINT32_T unsigned int
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+// # define _STLP_RAND48 1
+# endif /* __IBMCPP__ == 500 */
+
+
+
+
diff --git a/src/STLport/config/stl_icc.h b/src/STLport/config/stl_icc.h
new file mode 100644
index 0000000..bf0faff
--- /dev/null
+++ b/src/STLport/config/stl_icc.h
@@ -0,0 +1,49 @@
+ /* stl_icc.h
+ * *
+ * * A list of Intel compiler for Linux portion of STLport settings.
+ * * This file is being included by stlcomp.h
+ * */
+# ifndef _STLP_ICC_H
+# define _STLP_ICC_H
+
+# define _STLP_UINT32_T unsigned long
+# define _STLP_LONG_LONG long long
+# define _STLP_TYPENAME_ON_RETURN_TYPE typename
+
+// Edit relative path below (or put full path) to get native
+// compiler headers included. Default is "../include".
+// C headers may reside in different directory, so separate macro is provided.
+# if (__INTEL_COMPILER < 800)
+# define _STLP_NATIVE_INCLUDE_PATH ../include
+# else
+// The header of files have moved to a new location on Linux Intel C++ compiler
+// starting with version 8, which has GCC 3.2 compatability.
+# define _STLP_NATIVE_INCLUDE_PATH ../include/c++
+# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH/backward
+# ifndef __GNUC__
+// If GCC compatability is diabled (-no-gcc is specified) STD needs to be redefined.
+# define _STLP_REDEFINE_STD 1
+# endif
+# endif
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include
+
+// This macro constructs header path from directory and name.
+# define _STLP_MAKE_HEADER(path, header) <path/header>
+// This macro constructs native include header path from include path and name.
+# define _STLP_NATIVE_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_INCLUDE_PATH,header)
+
+# define _STLP_NATIVE_CPP_C_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_INCLUDE_PATH,header)
+
+// Same for C headers
+# define _STLP_NATIVE_C_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_C_INCLUDE_PATH,header)
+
+# undef _STLP_WINCE
+
+# ifndef __GNUC__
+# define __GNUC__ 1
+# endif
+
+# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+# endif
+
diff --git a/src/STLport/config/stl_intel.h b/src/STLport/config/stl_intel.h
new file mode 100644
index 0000000..9ef13ca
--- /dev/null
+++ b/src/STLport/config/stl_intel.h
@@ -0,0 +1,14 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+# if (__ICL >= 450)
+# define _STLP_DLLEXPORT_NEEDS_PREDECLARATION 1
+# endif
+
+# define _STLP_IMPORT_TEMPLATE_KEYWORD extern
+
+# include <config/stl_msvc.h>
+
+# undef _STLP_LONG_LONG
+# define _STLP_LONG_LONG long long
+
diff --git a/src/STLport/config/stl_kai.h b/src/STLport/config/stl_kai.h
new file mode 100644
index 0000000..cb883c0
--- /dev/null
+++ b/src/STLport/config/stl_kai.h
@@ -0,0 +1,58 @@
+// STLport config file for KAI C++ compiler
+
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+
+# ifndef __KAI_STRICT /* _NO_LONGLONG */
+# define _STLP_LONG_LONG long long
+# endif
+
+# if !defined (__EXCEPTIONS) && ! defined (_EXCEPTIONS)
+# define _STLP_HAS_NO_EXCEPTIONS
+# endif
+
+# ifndef __BUILDING_STLPORT
+# define _STLP_LINK_TIME_INSTANTIATION 1
+# endif
+
+// two levels of macros do not work good with kcc.
+# define _STLP_NATIVE_HEADER(header) <../include/##header>
+# define _STLP_NATIVE_C_HEADER(header) <../include/##header>
+# define _STLP_NATIVE_CPP_C_HEADER(header) <../include/##header>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../include/##header>
+
+# ifdef _WIN32
+# define _STLP_MINIMUM_IMPORT_STD
+# endif
+
+// KAI C++ uses EDG front-end, but apparently different switches
+// # define __EDG_SWITCHES 1
+
+
+# define _STLP_VENDOR_GLOBAL_CSTD 1
+# define _STLP_VENDOR_MB_NAMESPACE std
+
+// boris : some of those may also apply to KCC 3.4
+# if __KCC_VERSION < 4000
+# define _STLP_VENDOR_GLOBAL_EXCEPT_STD 1
+
+# endif
+
+// this is multiplatform compiler, so here should go system-dependant section
+// This really should be in platform-specific files, like stl_solaris.h
+# ifdef __linux__
+# define _STLP_NO_NATIVE_WIDE_STREAMS 1
+# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+# elif defined (__sun) || defined (sun)
+// # define _STLP_VENDOR_MB_NAMESPACE
+# include <config/stl_solaris.h>
+# elif defined (__hpux)
+# define _STLP_NO_NATIVE_WIDE_FUNCTIONS
+# elif defined (__sgi)
+// this requires some discrimination on whether we are actually on
+// a system officially supported by KAI.
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+# include <standards.h>
+# endif
+
diff --git a/src/STLport/config/stl_mlc.h b/src/STLport/config/stl_mlc.h
new file mode 100644
index 0000000..be6a5f7
--- /dev/null
+++ b/src/STLport/config/stl_mlc.h
@@ -0,0 +1,8 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+#define _STLP_NO_MEMBER_TEMPLATES // Compiler does not support member templates
+#define _STLP_NO_MEMBER_TEMPLATE_CLASSES // Compiler does not support member template classes
+
+#define _STLP_HAS_NEW_NEW_HEADER
+#define _STLP_HAS_NO_NEW_IOSTREAMS // Native C++ library does not provide new-style templatized iostreams
diff --git a/src/STLport/config/stl_msvc.h b/src/STLport/config/stl_msvc.h
new file mode 100644
index 0000000..ebdfc1e
--- /dev/null
+++ b/src/STLport/config/stl_msvc.h
@@ -0,0 +1,208 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+// Microsoft Visual C++ 4.0, 4.1, 4.2, 5.0, 6.0, 7.0, 7.1, ICL
+
+
+// Common features for VC++ 4.0 and higher
+# ifdef _M_IA64
+# define _STLP_NATIVE_HEADER(x) <../crt/##x>
+# define _STLP_NATIVE_C_HEADER(x) <../crt/##x>
+# define _STLP_NATIVE_CPP_C_HEADER(x) <../crt/##x>
+# define _STLP_NATIVE_OLD_STREAMS_HEADER(x) <../crt/##x>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../crt/##header>
+# define _STLP_GLOBAL_NEW_HANDLER
+# else
+# define _STLP_NATIVE_HEADER(x) <../include/##x>
+# define _STLP_NATIVE_C_HEADER(x) <../include/##x>
+# define _STLP_NATIVE_CPP_C_HEADER(x) <../include/##x>
+# define _STLP_NATIVE_OLD_STREAMS_HEADER(x) <../include/##x>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../include/##header>
+# endif
+
+# define _STLP_CALL __cdecl
+
+# ifndef _STLP_LONG_LONG
+# define _STLP_LONG_LONG __int64
+# endif
+
+# define _STLP_PRAGMA_ONCE
+
+// these switches depend on compiler flags
+# ifndef _CPPUNWIND
+# define _STLP_HAS_NO_EXCEPTIONS 1
+# endif
+
+# define _STLP_VENDOR_UNEXPECTED_STD
+
+# if defined ( _MT ) && !defined (_STLP_NO_THREADS) && !defined (_REENTRANT)
+# define _REENTRANT 1
+# endif
+
+# if !defined (_NATIVE_WCHAR_T_DEFINED)
+# define _STLP_WCHAR_T_IS_USHORT 1
+# endif
+
+# define _STLP_MINIMUM_IMPORT_STD
+
+# ifdef _STLP_MSVC
+
+# ifndef _STLP_MSVC50_COMPATIBILITY
+# define _STLP_MSVC50_COMPATIBILITY 1
+# endif
+
+# define _STLP_DLLEXPORT_NEEDS_PREDECLARATION 1
+# define _STLP_HAS_SPECIFIC_PROLOG_EPILOG
+
+// # ifndef __BUILDING_STLPORT
+// # define _STLP_USE_TEMPLATE_EXPORT 1
+// # endif
+
+# if (_STLP_MSVC >= 1310)
+# define _STLP_NO_METHOD_SPECIALIZATION 1
+# endif // (_STLP_MSVC >= 1310)
+
+# if (_STLP_MSVC > 1100)
+ typedef char __stl_char;
+# define _STLP_DEFAULTCHAR __stl_char
+# endif /* (_STLP_MSVC < 1100 ) */
+
+# if (_STLP_MSVC <= 1310)
+# define _STLP_STATIC_CONST_INIT_BUG 1
+# endif // (_STLP_MSVC <= 1310)
+
+# if (_STLP_MSVC <= 1300)
+# define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+
+# define _STLP_NO_TYPENAME_IN_TEMPLATE_HEADER
+// fails to properly resolve call to sin() from within sin()
+# define _STLP_SAME_FUNCTION_NAME_RESOLUTION_BUG
+# define _STLP_NO_TYPENAME_ON_RETURN_TYPE 1
+// boris : not defining this macro for SP5 causes other problems
+// # if !defined (_MSC_FULL_VER) || (_MSC_FULL_VER < 12008804 )
+# define _STLP_NO_USING_FOR_GLOBAL_FUNCTIONS 1
+//# endif
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_NO_FRIEND_TEMPLATES
+// VC++ cannot handle default allocator argument in template constructors
+# define _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+// there is no partial spec, and MSVC breaks on simulating it for iterator_traits queries
+# define _STLP_USE_OLD_HP_ITERATOR_QUERIES
+// # define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+# define _STLP_DONT_USE_BOOL_TYPEDEF 1
+# endif /* _STLP_MSVC <= 1300 */
+
+# endif /* _STLP_MSVC */
+
+# if (_MSC_VER <= 1310)
+# define _STLP_VENDOR_GLOBAL_CSTD
+// They included the necessary coding,
+// but the beta still has an issue with template classes
+// ok: class a { static const int v = 2; };
+// error: template <class _Tp> class a { static const int v = 2; };
+# if !defined (_STLP_WHOLE_NATIVE_STD) && ! defined (_STLP_REDEFINE_STD)
+# define _STLP_REDEFINE_STD
+# endif
+# endif /* (_MSC_VER <= 1310) */
+
+# if (_MSC_VER <= 1200) // including MSVC 6.0
+// these work, as long they are inline
+# define _STLP_INLINE_MEMBER_TEMPLATES 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# define _STLP_GLOBAL_NEW_HANDLER
+# define _STLP_DONT_RETURN_VOID 1
+# define _STLP_DONT_USE_NESTED_TCLASS_THROUGHT_TPARAM 1
+# endif /* (_MSC_VER <= 1200) */
+
+# if ( _MSC_VER<=1010 )
+// "bool" is reserved in MSVC 4.1 while <yvals.h> absent, so :
+// # define _STLP_USE_ABBREVS 1
+# define _STLP_NO_BAD_ALLOC
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+# define _STLP_NO_NEW_NEW_HEADER 1
+# elif (_MSC_VER < 1100)
+// VC++ 4.2 and higher
+# define _STLP_YVALS_H 1
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# endif /* 1010 */
+
+# if defined (_STLP_MSVC) && ( _STLP_MSVC < 1200 ) /* VC++ 6.0 */
+// # define _STLP_NO_MEMBER_TEMPLATES 1
+// # define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+# define _STLP_THROW_RETURN_BUG 1
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# endif
+
+# if defined (_STLP_MSVC) && ( _STLP_MSVC < 1100 )
+# ifndef _STLP_NO_OWN_IOSTREAMS
+# define _STLP_NO_OWN_IOSTREAMS
+# undef _STLP_OWN_IOSTREAMS
+# endif
+// # define _STLP_NESTED_TYPE_PARAM_BUG 1
+// Debug mode does not work for 4.2
+# ifdef _STLP_DEBUG
+# pragma message ("STLport debug mode does not work for VC++ 4.2, turning _STLP_DEBUG off ...")
+# undef _STLP_DEBUG
+# endif
+# define _STLP_NO_BOOL 1
+# define _STLP_NEED_TYPENAME 1
+# define _STLP_NEED_EXPLICIT 1
+# define _STLP_NEED_MUTABLE 1
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX
+# define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+
+// up to 4.2, library is in global namespace
+# define _STLP_VENDOR_GLOBAL_STD
+# define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+# define _STLP_BROKEN_USING_DIRECTIVE 1
+# define _STLP_NO_ARROW_OPERATOR
+# define _STLP_NO_SIGNED_BUILTINS 1
+# define _STLP_NO_EXCEPTION_SPEC 1
+# undef _STLP_DEFAULT_TYPE_PARAM
+# undef _STLP_HAS_NO_NAMESPACES
+# undef _STLP_NO_AT_MEMBER_FUNCTION
+# undef _STLP_NO_MEMBER_TEMPLATES
+# undef _STLP_NO_MEMBER_TEMPLATE_CLASSES
+# define _STLP_HAS_NO_NAMESPACES 1
+# define _STLP_NO_AT_MEMBER_FUNCTION 1
+# define _STLP_NO_MEMBER_TEMPLATES
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES
+# endif /* 1100 */
+
+// If we are under Windows CE, include appropriate config
+
+# ifdef UNDER_CE
+# include <config/stl_wince.h>
+# endif
+
+# ifdef __ICL
+# define _STLP_LIB_BASENAME "stlport_icl"
+# else
+# if (_MSC_VER >= 1310)
+# define _STLP_LIB_BASENAME "stlport_vc71"
+# elif (_MSC_VER >= 1300)
+# define _STLP_LIB_BASENAME "stlport_vc7"
+# elif (_MSC_VER >= 1200)
+# define _STLP_LIB_BASENAME "stlport_vc6"
+//# endif
+# elif (_MSC_VER >= 1100)
+//# ifdef _UNICODE
+//# define _STLP_LIB_BASENAME "stlport_vc5_unicode"
+//# else
+# define _STLP_LIB_BASENAME "stlport_vc5"
+//# endif
+# endif /* (_MSC_VER >= 1200) */
+# endif /* __ICL */
+
+
+# if (defined (__ICL) && (__ICL < 450)) || (_MSC_VER < 1200)
+// only static STLport lib now works for ICL and VC 5.0
+# undef _STLP_USE_STATIC_LIB
+# define _STLP_USE_STATIC_LIB
+// disable hook which makes template symbols to be searched for in the library
+# undef _STLP_NO_CUSTOM_IO
+# endif
+
+# include <config/vc_select_lib.h>
diff --git a/src/STLport/config/stl_mwerks.h b/src/STLport/config/stl_mwerks.h
new file mode 100644
index 0000000..5c9d5aa
--- /dev/null
+++ b/src/STLport/config/stl_mwerks.h
@@ -0,0 +1,140 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+// Bring in definition of __MSL__ and related items
+#include <mslGlobals.h>
+#include <ansi_parms.h>
+
+//
+// Compiler features
+//
+
+
+// *** CodeWarrior Compiler Common Features ***
+# if __option(longlong)
+# define _STLP_LONG_LONG long long
+# endif
+
+# define _STLP_USE_UNIX_EMULATION_IO 1
+# define _STLP_USE_AUTO_PTR_CONVERSIONS 1
+
+# ifdef __INTEL__
+# define _STLP_LITTLE_ENDIAN
+# else
+# define _STLP_BIG_ENDIAN
+# endif
+
+#if defined(_MSL_NO_LOCALE)
+#define _STLP_NO_IMPORT_LOCALE
+#endif
+#if !__option( wchar_type )
+# define _STLP_WCHAR_T_IS_USHORT
+#endif
+
+// *** CodeWarrior Compiler Common Bugs ***
+# define __MSL_FIX_ITERATORS__(myType) // Some MSL headers rely on this
+# define _STLP_NO_FRIEND_TEMPLATES 1 // Bug mysteriously reintroduced in this version.
+# define _STLP_THROW_RETURN_BUG 1
+
+// *** Version-specific settings ***
+
+# if __MWERKS__ >= 0x2405
+# define _STLP_HAS_NATIVE_FLOAT_ABS
+# endif
+
+# if __MWERKS__ < 0x2405
+# define _STLP_STATIC_CONST_INIT_BUG
+# endif
+
+# if __MWERKS__ <= 0x2303
+# define _STLP_NO_TEMPLATE_CONVERSIONS 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# endif
+
+# if __MWERKS__ < 0x2301
+# define _STLP_MEMBER_SPECIALIZATION_BUG 1
+# endif
+
+# if __MWERKS__ < 0x2300 // CW Pro5 features
+# define _STLP_INLINE_MEMBER_TEMPLATES 1
+# define _STLP_RELOPS_IN_STD_BUG 1
+# define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+# define _STLP_NO_TYPENAME_ON_RETURN_TYPE
+# endif
+
+# if __MWERKS__ < 0x2200 // CW Pro4 features
+# define _STLP_BROKEN_USING_DIRECTIVE 1
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# define _STLP_NO_FRIEND_TEMPLATES 1
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+# endif
+
+# if __MWERKS__ < 0x2100 // CW Pro3 features
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_HAS_NO_NAMESPACES 1
+# define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+
+# define _STLP_NEED_TYPENAME 1
+# define _STLP_NO_ARROW_OPERATOR 1
+# define _STLP_TEMPLATE_PARAM_SUBTYPE_BUG 1
+# define _STLP_FORCED_INLINE_INSTANTIATION_BUG 1
+# define _STLP_MULTI_CONST_TEMPLATE_ARG_BUG 1
+# define _STLP_INLINE_NAME_RESOLUTION_BUG 1
+// *** Metrowerks Standard Library Bug ***
+# define _STLP_MSVC50_COMPATIBILITY 1
+# endif
+
+# if __MWERKS__ < 0x2000 // v. 2.0 features
+# define _STLP_NO_WCHAR_T 1
+# define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1 // dwa 8/21/97 - this bug fixed for CWPro2
+# define _STLP_UNINITIALIZABLE_PRIVATE 1 // dwa 10/23/97 - this bug fixed for CWPro2
+# endif
+
+# if __MWERKS__ < 0x1900 // dwa 8/19/97 - 1.9 Compiler feature defines
+# define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+# define _STLP_BASE_TYPEDEF_BUG 1
+# define _STLP_BASE_MATCH_BUG 1
+# define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+# define _STLP_DEFAULT_TYPE_PARAM 1 // More limited template parameters
+
+# if __MWERKS__ < 0x1800
+ __GIVE_UP_WITH_STL(CW_18)
+# endif
+
+# endif
+
+
+// fixes to native inclusion wrappers.
+# if __MWERKS__ >= 0x2300 // CWPro5 changes paths - dwa 2/28/99
+
+# define _STLP_NATIVE_INCLUDE_PATH ../include
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include
+# define _STLP_NATIVE_HEADER(header) <../include/##header>
+# define _STLP_NATIVE_CPP_C_HEADER(header) <../include/##header>
+# define _STLP_NATIVE_C_HEADER(header) <../include/##header>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../include/##header>
+
+# else
+
+# define _STLP_NATIVE_INCLUDE_PATH Macintosh HD:Codewarrior Pro 4:Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C++:Include
+# define _STLP_NATIVE_C_INCLUDE_PATH Macintosh HD:Codewarrior Pro 4:Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C:MSL Common:Public Includes
+# define _STLP_NATIVE_HEADER(header) <Macintosh HD:Codewarrior Pro 4:Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C++:Include:##header>
+# define _STLP_NATIVE_CPP_C_HEADER(header) <Macintosh HD:Codewarrior Pro 4:Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C++:Include:##header>
+# define _STLP_NATIVE_C_HEADER(header) <Macintosh HD:Codewarrior Pro 4:Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C:MSL Common:Public Includes:##header>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <Macintosh HD:Codewarrior Pro 4:Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C:MSL Common:Public Includes:##header>
+
+# endif
+
+ // fbp
+# if !defined( __MSL_CPP__ ) || __MSL_CPP__ <= 0x4105
+# define _STLP_NO_NATIVE_WIDE_STREAMS 1
+# endif
+
+# define _STLP_LIB_BASENAME stlport_mwerks_x86
+# define _STLP_DLLEXPORT_NEEDS_PREDECLARATION 1
+
+// # include <config/vc_select_lib.h>
diff --git a/src/STLport/config/stl_mycomp.h b/src/STLport/config/stl_mycomp.h
new file mode 100644
index 0000000..d887f5d
--- /dev/null
+++ b/src/STLport/config/stl_mycomp.h
@@ -0,0 +1,268 @@
+/*
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ * Purpose of this file :
+ *
+ * A list of COMPILER-SPECIFIC portion of STLport settings.
+ * This file is provided to help in manual configuration
+ * of STLport. This file is being included by stlcomp.h
+ * when STLport is unable to identify your compiler.
+ * Please remove the error diagnostic below before adjusting
+ * macros.
+ *
+ */
+# ifndef _STLP_MYCOMP_H
+# define _STLP_MYCOMP_H
+
+# error "Your compiler version is not recognized by STLport. Please edit <config/stl_mycomp.h>"
+
+//==========================================================
+
+// the values choosen here as defaults try to give
+// maximum functionality on the most conservative settings
+
+// Mostly correct guess, change it for Alpha (and other environments
+// that has 64-bit "long")
+// # define _STLP_UINT32_T unsigned long
+
+// Disables wchar_t functionality
+// # define _STLP_NO_WCHAR_T 1
+
+// Define if wchar_t is not a unique type, and is actually a typedef to unsigned short.
+// # define _STLP_WCHAR_T_IS_USHORT 1
+
+// Uncomment if long long is available
+// # define _STLP_LONG_LONG long long
+
+// Uncomment if long double is not available
+// # define _STLP_NO_LONG_DOUBLE 1
+
+// Uncomment this if your compiler does not support "typename" keyword
+// # define _STLP_NEED_TYPENAME 1
+
+// Uncomment this if your compiler does not support "mutable" keyword
+// # define _STLP_NEED_MUTABLE 1
+
+// Uncomment this if your compiler does not support "explicit" keyword
+// # define _STLP_NEED_EXPLICIT 1
+
+// Uncomment if new-style-casts like const_cast<> are not available
+// # define _STLP_NO_NEW_STYLE_CASTS 1
+
+// Uncomment this if your compiler does not have "bool" type
+// # define _STLP_NO_BOOL 1
+
+// Uncomment this if your compiler does not have "bool" type, but has "bool" keyword reserved
+// # define _STLP_DONT_USE_BOOL_TYPEDEF 1
+
+// Uncomment this if your compiler does not have "bool" type, but defines "bool" in <yvals.h>
+// # define _STLP_YVALS_H 1
+
+// Uncomment this if your compiler has limited or no default template arguments for classes
+// # define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+
+// Uncomment this if your compiler support only complete (not dependent on other parameters)
+// types as default parameters for class templates
+// # define _STLP_DEFAULT_TYPE_PARAM 1
+
+// Uncomment this if your compiler has problem with not-type
+// default template parameters
+// # define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+
+// Define if compiler has
+// trouble with functions getting non-type-parameterized classes as parameters
+// # define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+
+// Uncomment this if your compiler lacks static data members.
+// Uncomment next line if your compiler supports __attribute__((weak))
+// # define _STLP_NO_STATIC_TEMPLATE_DATA 1
+// # define _STLP_WEAK_ATTRIBUTE 1
+
+// Uncomment this if your compiler does not support namespaces
+// # define _STLP_HAS_NO_NAMESPACES 1
+
+// Uncomment if "using" keyword does not work with template types
+// # define _STLP_BROKEN_USING_DIRECTIVE 1
+
+// Uncomment this if your compiler does not support exceptions
+// # define _STLP_HAS_NO_EXCEPTIONS 1
+
+// Uncomment this if your compiler does not support exception specifications
+// # define _STLP_NO_EXCEPTION_SPEC
+
+// Define this if your compiler requires return statement after throw()
+// # define _STLP_THROW_RETURN_BUG 1
+
+// Define this if your compiler do not support return of void
+// # define _STLP_DONT_RETURN_VOID 1
+
+// Header <new> that comes with the compiler
+// does not define bad_alloc exception
+// # define _STLP_NO_BAD_ALLOC 1
+
+// Define this if your compiler do not throw bad_alloc from the new operator
+// # define _STLP_NEW_DONT_THROW 1
+
+// Uncomment if member template methods are not available
+// # define _STLP_NO_MEMBER_TEMPLATES 1
+
+// Uncomment if member template classes are not available
+// # define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+
+// Uncomment if you cannot access member template classe throught a class template parameter
+// # define _STLP_DONT_USE_NESTED_TCLASS_THROUGHT_TPARAM 1
+
+// Uncomment if no "template" keyword should be used with member template classes
+// # define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+
+// Uncomment if friend member templates are not available
+// # define _STLP_NO_FRIEND_TEMPLATES 1
+
+// Compiler does not accept friend declaration qualified with namespace name.
+// # define _STLP_NO_QUALIFIED_FRIENDS 1
+
+// Uncomment if partial specialization is not available
+// # define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+
+// Define if class being partially specialized require full name (template parameters)
+// of itself for method declarations
+// # define _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS
+
+// Compiler has problems specializing members of partially
+// specialized class
+// # define _STLP_MEMBER_SPECIALIZATION_BUG
+
+// Uncomment if partial order of template functions is not available
+// # define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+
+// Uncomment if specialization of methods is not allowed
+// # define _STLP_NO_METHOD_SPECIALIZATION 1
+
+// Uncomment if full specialization does not use partial spec. syntax : template <> struct ....
+// # define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+
+// Uncomment if compiler does not support explicit template arguments for functions
+// # define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+
+// Uncomment if "__typetraits is being instaniated automatically by the compiler (SGI only ?)
+// # define _STLP_AUTOMATIC_TYPE_TRAITS 1
+
+// Uncomment this if your compiler can't inline while(), for()
+// # define _STLP_LOOP_INLINE_PROBLEMS 1
+
+// Define if the compiler fails to match a template function argument of base
+// # define _STLP_BASE_MATCH_BUG 1
+
+// Define if the compiler fails to match a template function argument of base
+// (non-template)
+//# define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+
+// Define if the compiler rejects outline method definition
+// explicitly taking nested types/typedefs
+// # define _STLP_NESTED_TYPE_PARAM_BUG 1
+
+// Compiler requires typename keyword on outline method definition
+// explicitly taking nested types/typedefs
+// #define _STLP_TYPENAME_ON_RETURN_TYPE
+
+// Define if the baseclass typedefs not visible from outside
+// # define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+
+// if your compiler have serious problems with typedefs, try this one
+// # define _STLP_BASE_TYPEDEF_BUG 1
+
+// Uncomment if getting errors compiling mem_fun* adaptors
+// # define _STLP_MEMBER_POINTER_PARAM_BUG 1
+
+// # define _STLP_UNINITIALIZABLE_PRIVATE 1
+
+// Defined if the compiler
+// has trouble instantiating static array members with dimension defined as enum
+// # define _STLP_STATIC_ARRAY_BUG
+
+// * _STLP_STATIC_CONST_INIT_BUG: defined if the compiler can't handle a
+// constant-initializer in the declaration of a static const data member
+// of integer type. (See section 9.4.2, paragraph 4, of the C++ standard.)
+// # define _STLP_STATIC_CONST_INIT_BUG
+
+// Define if default constructor for builtin integer type fails to initialize it to 0
+// # define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+
+// Defined if constructor
+// required to explicitly call member's default constructors for const objects
+// # define _STLP_CONST_CONSTRUCTOR_BUG 1
+
+// Defined if the compiler has trouble calling POD-types constructors/destructors
+// # define _STLP_TRIVIAL_CONSTRUCTOR_BUG 1
+// # define _STLP_TRIVIAL_DESTRUCTOR_BUG 1
+
+// Define if having problems specializing maps/sets with
+// key type being const
+// # define _STLP_MULTI_CONST_TEMPLATE_ARG_BUG
+
+// Uncomment this to disable -> operators on all iterators
+// # define _STLP_NO_ARROW_OPERATOR 1
+
+// Uncomment this to disble at() member functions for containers
+// # define _STLP_NO_AT_MEMBER_FUNCTION 1
+
+// Uncomment if native new-style iostreams are not available
+// #define _STLP_HAS_NO_NEW_IOSTREAMS 1
+
+// Define this if compiler lacks <exception> header
+// # define _STLP_NO_EXCEPTION_HEADER 1
+
+// Uncomment this if your C library has lrand48() function
+// # define _STLP_RAND48 1
+
+// Uncomment if native new-style C library headers lile <cstddef>, etc are not available.
+// # define _STLP_HAS_NO_NEW_C_HEADERS 1
+
+// uncomment if new-style headers <new> is available
+// # define _STLP_HAS_NEW_NEW_HEADER 1
+
+// uncomment this if <iostream> and other STD headers put their stuff in ::namespace,
+// not std::
+// # define _STLP_VENDOR_GLOBAL_STD
+
+// uncomment this if <cstdio> and the like put stuff in ::namespace,
+// not std::
+// # define _STLP_VENDOR_GLOBAL_CSTD
+
+// Edit relative path below (or put full path) to get native
+// compiler headers included. Default is "../include".
+// C headers may reside in different directory, so separate macro is provided.
+// Hint : never install STLport in the directory that ends with "include"
+// # define _STLP_NATIVE_INCLUDE_PATH ../include
+// # define _STLP_NATIVE_C_INCLUDE_PATH ../include
+// # define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include
+
+// This macro constructs header path from directory and name.
+// You may change it if your compiler does not understand "/".
+// # define _STLP_MAKE_HEADER(path, header) <path/header>
+
+// This macro constructs native include header path from include path and name.
+// You may have do define it if experirncing problems with preprocessor
+// # define _STLP_NATIVE_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_INCLUDE_PATH,header)
+
+// Same for C headers
+// #define _STLP_NATIVE_C_HEADER(header)
+
+//==========================================================
+# endif
diff --git a/src/STLport/config/stl_sco.h b/src/STLport/config/stl_sco.h
new file mode 100644
index 0000000..05287ac
--- /dev/null
+++ b/src/STLport/config/stl_sco.h
@@ -0,0 +1,35 @@
+// SCO UDK 7 compiler (UnixWare 7x, OSR 5, UnixWare 2x)
+
+
+# define _STLP_NO_BAD_ALLOC 1
+
+// allocator::rebind used not to work properly
+// # define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+// # define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+
+# define _STLP_NO_FRIEND_TEMPLATES 1
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+
+
+// # define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+
+//# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+//# define _STLP_HAS_NO_NEW_C_HEADERS 1
+
+// ???
+//# define _STLP_STATIC_CONST_INIT_BUG 1
+
+// ???
+//# define _STLP_LINK_TIME_INSTANTIATION 1
+
+// ???
+# define _STLP_NO_TEMPLATE_CONVERSIONS 1
+
+# define _STLP_LONG_LONG long long
+
+# if defined(_REENTRANT)
+# define _UITHREADS /* if UnixWare < 7.0.1 */
+# define _STLP_UITHREADS
+# endif /* _REENTRANT */
+
+# define _STLP_SCO_OPENSERVER
diff --git a/src/STLport/config/stl_select_lib.h b/src/STLport/config/stl_select_lib.h
new file mode 100644
index 0000000..4a6426b
--- /dev/null
+++ b/src/STLport/config/stl_select_lib.h
@@ -0,0 +1,36 @@
+# if !defined (_STLP_NO_OWN_IOSTREAMS)
+
+# if ! defined (_STLP_LIB_STATIC_SUFFIX)
+# define _STLP_LIB_STATIC_SUFFIX ""
+# endif
+
+// Note : the code below is intended to make use of compiled
+// STLport iostreams easier. If you are with to change names used for
+// STLport libraries , please also change RELEASE_NAME and DEBUG_NAME
+// macros in makefile ../../src/vc6.mak (or whatever .mak you are using to build
+// STLport). If you are using binaries, you may just rename the binaries.
+# if ! defined (__BUILDING_STLPORT) && ! defined (_STLP_DONT_FORCE_MSVC_LIB_NAME)
+# if defined (_STLP_USE_DECLSPEC)
+# ifdef _STLP_DEBUG
+# pragma comment(lib, _STLP_LIB_BASENAME"_stldebug.lib")
+# elif (defined (_DEBUG) || defined (__DEBUG)) && defined (_STLP_USE_DEBUG_LIB)
+# pragma comment(lib, _STLP_LIB_BASENAME"_debug.lib")
+# else
+# pragma comment(lib, _STLP_LIB_BASENAME".lib")
+# endif
+# else /* _STLP_USE_DECLSPEC */
+// fbp : for static linking, debug setting _MUST_ correspond to what
+// has been compiled into binary lib
+# ifdef _STLP_DEBUG
+# if (! defined (_DEBUG))
+# error "For static link with STLport library, _DEBUG setting MUST be on when _STLP_DEBUG is on. (/MTd forces _DEBUG)"
+# endif
+# pragma comment(lib, _STLP_LIB_BASENAME"_stldebug"_STLP_LIB_STATIC_SUFFIX".lib")
+# elif (defined (_DEBUG) || defined (__DEBUG)) && defined (_STLP_USE_DEBUG_LIB)
+# pragma comment(lib, _STLP_LIB_BASENAME"_debug"_STLP_LIB_STATIC_SUFFIX".lib")
+# else
+# pragma comment(lib, _STLP_LIB_BASENAME""_STLP_LIB_STATIC_SUFFIX".lib")
+# endif
+# endif /* _STLP_USE_DECLSPEC */
+# endif /* __BUILDING_STLPORT */
+# endif /* _STLP_OWN_IOSTREAMS */
diff --git a/src/STLport/config/stl_sgi.h b/src/STLport/config/stl_sgi.h
new file mode 100644
index 0000000..b086981
--- /dev/null
+++ b/src/STLport/config/stl_sgi.h
@@ -0,0 +1,94 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+# define _STLP_HAS_SPECIFIC_PROLOG_EPILOG
+
+// define native include path before trying to include anything
+
+# define _STLP_NATIVE_HEADER(__x) </usr/include/CC/##__x>
+# define _STLP_NATIVE_C_HEADER(__x) </usr/include/##__x>
+# define _STLP_NATIVE_OLD_STREAMS_HEADER(__x) </usr/include/CC/##__x>
+# define _STLP_NATIVE_CPP_C_HEADER(__x) </usr/include/CC/##__x>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(__x) </usr/include/CC/##__x>
+
+# define _STLP_NO_NATIVE_MBSTATE_T
+
+#define _STLP_NO_CSTD_FUNCTION_IMPORTS
+#define _STLP_NO_NATIVE_WIDE_FUNCTIONS
+#define _STLP_NO_MEMBER_TEMPLATE_CLASSES
+
+// #define _STLP_NO_BAD_ALLOC
+
+#define _STL_HAS_NAMESPACES
+
+#if ! defined (__EXCEPTIONS) && ! defined (_STLP_NO_EXCEPTIONS)
+# define _STLP_NO_EXCEPTIONS
+#endif
+
+// #define _STLP_NOTHROW throw()
+
+# define __EDG_SWITCHES
+
+// any version ???
+# define _STLP_AUTOMATIC_TYPE_TRAITS 1
+
+# define _STLP_USE_SGI_STRING 1
+
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+// # define _STLP_VENDOR_GLOBAL_EXCEPT_STD
+
+// # if ! defined (_STLP_NO_OWN_IOSTREAMS) && ! defined (_STLP_NO_NEW_IOSTREAMS)
+# define _STLP_NO_POST_COMPATIBLE_SECTION
+// # endif
+
+# include <standards.h>
+
+# if !(_COMPILER_VERSION >= 730)
+# define _STLP_NO_NEW_NEW_HEADER 1
+# endif
+
+# if (_COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS))
+# define _STLP_EXTERN_RANGE_ERRORS
+# endif
+
+# if !defined(_BOOL)
+# define _STLP_NO_BOOL
+# endif
+# if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32
+# define _STLP_STATIC_CONST_INIT_BUG
+# endif
+
+# if (_COMPILER_VERSION < 720) || (defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32)
+# define _STLP_DEFAULT_CONSTRUCTOR_BUG
+# endif
+# if !((_COMPILER_VERSION >= 730) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32)
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+# endif
+# if !defined(_STANDARD_C_PLUS_PLUS)
+# define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+# endif
+# if !((_COMPILER_VERSION >= 721) && defined(_NAMESPACES))
+# define _STLP_HAS_NO_NAMESPACES
+# endif
+# if (_COMPILER_VERSION < 721) || !defined(_STL_HAS_NAMESPACES) || defined(_STLP_NO_NAMESPACES)
+# define _STLP_NO_EXCEPTION_HEADER
+# endif
+# if _COMPILER_VERSION < 730 || !defined(_STANDARD_C_PLUS_PLUS) || !defined(_NAMESPACES)
+# define _STLP_NO_BAD_ALLOC
+# endif
+# if defined(_LONGLONG) && defined(_SGIAPI) && _SGIAPI
+# define _STLP_LONG_LONG long long
+# endif
+# if !(_COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS))
+# define _STLP_HAS_NO_NEW_IOSTREAMS
+# endif
+# if !(_COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS))
+# define _STLP_NO_AT_MEMBER_FUNCTION
+# endif
+// # if !(_COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS))
+# if !(_COMPILER_VERSION >= 721 && defined(_STANDARD_C_PLUS_PLUS))
+# define _STLP_NO_TEMPLATE_CONVERSIONS
+# endif
+# if !((_COMPILER_VERSION >= 730) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32)
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
+# endif
diff --git a/src/STLport/config/stl_solaris.h b/src/STLport/config/stl_solaris.h
new file mode 100644
index 0000000..8ae18f7
--- /dev/null
+++ b/src/STLport/config/stl_solaris.h
@@ -0,0 +1,35 @@
+
+// include system features file
+# include <sys/feature_tests.h>
+
+// system-dependent defines
+
+# if defined (__SunOS_5_8) && ! defined (_STLP_HAS_NO_NEW_C_HEADERS) && ( __cplusplus >= 199711L)
+# define _STLP_HAS_NATIVE_FLOAT_ABS
+# endif
+
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+
+#if (defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 == 4)) || defined (__SunOS_5_6)
+# define _STLP_WCHAR_SUNPRO_EXCLUDE 1
+# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+#endif
+
+// boris : this should always be defined for Solaris 5 & 6. Any ideas how to do it ?
+# if !(defined ( __KCC ) && __KCC_VERSION > 3400 ) && \
+ ((defined(__SunOS_5_5_1) || defined(__SunOS_5_6) ))
+# ifndef _STLP_NO_NATIVE_MBSTATE_T
+# define _STLP_NO_NATIVE_MBSTATE_T 1
+# endif
+# endif /* KCC */
+
+// For SPARC we use lightweight synchronization
+# if defined (__sparc) /* && (defined (_REENTRANT) || defined (_PTHREADS)) */ && ((defined (__GNUC__) && defined (__sparc_v9__)) || \
+(defined (__sparcv9) && ! defined (_STLP_NO_OWN_IOSTREAMS)) ) \
+&& !defined(_NOTHREADS) && ! defined (_STLP_NO_SPARC_SOLARIS_THREADS)
+# define _STLP_SPARC_SOLARIS_THREADS
+# define _STLP_THREADS_DEFINED
+# endif
+
diff --git a/src/STLport/config/stl_sunpro.h b/src/STLport/config/stl_sunpro.h
new file mode 100644
index 0000000..3ff133f
--- /dev/null
+++ b/src/STLport/config/stl_sunpro.h
@@ -0,0 +1,175 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+# define _STLP_LONG_LONG long long
+# define _STLP_LINK_TIME_INSTANTIATION 1
+
+# if ! defined(_BOOL)
+# define _STLP_NO_BOOL 1
+# endif
+
+# if (__SUNPRO_CC >= 0x500 ) && (!defined (__SUNPRO_CC_COMPAT) || (__SUNPRO_CC_COMPAT == 5 )) \
+ && defined (_STLP_NO_OWN_IOSTREAMS) && ! defined (_STLP_HAS_NO_NEW_IOSTREAMS)
+# error "The wrapper (_STLP_NO_OWN_IOSTREAMS) mode does not work well without _STLP_HAS_NO_NEW_IOSTREAMS. Please set this flag. You will also have to use -liostream option on link phase."
+// # define _STLP_HAS_NO_NEW_IOSTREAMS
+# endif
+
+// compatibility mode stuff
+# if (__SUNPRO_CC >= 0x510) && (!defined (__SUNPRO_CC_COMPAT) || (__SUNPRO_CC_COMPAT == 5 ))
+# define _STLP_NATIVE_INCLUDE_PATH ../CC/Cstd
+# define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH ../CC
+# elif (__SUNPRO_CC >= 0x500) && (!defined (__SUNPRO_CC_COMPAT) || (__SUNPRO_CC_COMPAT == 5 ))
+# define _STLP_NATIVE_INCLUDE_PATH ../CC
+# elif (defined (__SUNPRO_CC_COMPAT) && __SUNPRO_CC_COMPAT == 4)
+# define _STLP_NATIVE_INCLUDE_PATH ../CC4
+# else
+# define _STLP_NATIVE_INCLUDE_PATH ../CC
+# endif
+
+# if (__SUNPRO_CC >= 0x500 ) && ( defined (_STLP_NO_NEW_IOSTREAMS) || defined (_STLP_HAS_NO_NEW_IOSTREAMS) )
+// if the project is set up to use libiostream (_STLP_NO_NEW_IOSTREAMS should be defined then),
+// use classic iostreams
+# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../CCios
+# endif
+
+# define _STLP_STATIC_CONST_INIT_BUG 1
+
+# if (__SUNPRO_CC < 0x530)
+// those are tested and proved not to work...
+# define _STLP_STATIC_ARRAY_BUG 1
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# define _STLP_USE_OLD_HP_ITERATOR_QUERIES
+# endif
+
+
+# if defined (_STLP_OWN_IOSTREAMS)
+//# if ! defined (_STLP_NO_OWN_NAMESPACE)
+//# define _STLP_NO_OWN_NAMESPACE
+//# endif
+# else
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+# endif
+
+// those do not depend on compatibility
+# if (__SUNPRO_CC < 0x510)
+# define _STLP_NO_TYPENAME_ON_RETURN_TYPE 1
+# define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+# endif
+
+# if (__SUNPRO_CC < 0x510) || (defined (__SUNPRO_CC_COMPAT) && (__SUNPRO_CC_COMPAT < 5))
+
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+
+// no partial , just for explicit one
+# define _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# define _STLP_NO_FRIEND_TEMPLATES 1
+
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+# define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# endif
+
+// Features that depend on compatibility switch
+# if ( __SUNPRO_CC < 0x500 ) || (defined (__SUNPRO_CC_COMPAT) && (__SUNPRO_CC_COMPAT < 5))
+
+# ifndef _STLP_HAS_NO_NEW_IOSTREAMS
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# endif
+# define _STLP_NO_NEW_NEW_HEADER 1
+// # define _STLP_NO_RELOPS_NAMESPACE
+# define _STLP_HAS_NO_NAMESPACES 1
+# define _STLP_NEED_MUTABLE 1
+# define _STLP_NO_BAD_ALLOC 1
+# define _STLP_NO_EXCEPTION_HEADER 1
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include
+# elif (__SUNPRO_CC < 0x510)
+// # define _STLP_NATIVE_C_HEADER(header) <../CC/##header##.SUNWCCh>
+# define _STLP_NATIVE_CPP_C_HEADER(header) <../CC/##header##.SUNWCCh>
+# define _STLP_NATIVE_C_INCLUDE_PATH /usr/include
+# elif defined( __SunOS_5_5_1 ) || defined( __SunOS_5_6 ) || defined( __SunOS_5_7 )
+# define _STLP_NATIVE_C_INCLUDE_PATH ../CC/std
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../CC/std
+# else
+# define _STLP_NATIVE_C_INCLUDE_PATH /usr/include
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../CC/std
+# endif
+
+
+
+# if ( __SUNPRO_CC < 0x500 )
+
+# undef _STLP_NATIVE_C_HEADER
+# undef _STLP_NATIVE_CPP_C_HEADER
+
+# define wint_t __wint_t
+// famous CC 4.2 bug
+# define _STLP_INLINE_STRING_LITERAL_BUG 1
+// /usr/include
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include
+
+// 4.2 cannot handle iterator_traits<_Tp>::iterator_category as a return type ;(
+# define _STLP_USE_OLD_HP_ITERATOR_QUERIES
+
+// 4.2 does not like it
+# undef _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS
+
+# define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+
+# define _STLP_NEED_TYPENAME 1
+# define _STLP_NEED_EXPLICIT 1
+# define _STLP_UNINITIALIZABLE_PRIVATE 1
+# define _STLP_NO_BAD_ALLOC 1
+# define _STLP_NO_ARROW_OPERATOR 1
+
+# define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+# define _STLP_GLOBAL_NESTED_RETURN_TYPE_PARAM_BUG 1
+# undef _STLP_HAS_NO_NEW_C_HEADERS
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+// # define _STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+
+# if ( __SUNPRO_CC < 0x420 )
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+# define _STLP_NO_NEW_STYLE_CASTS 1
+# define _STLP_NO_METHOD_SPECIALIZATION 1
+# if ( __SUNPRO_CC > 0x401 )
+# if (__SUNPRO_CC==0x410)
+# define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+# endif
+# else
+ // SUNPro C++ 4.0.1
+# define _STLP_BASE_MATCH_BUG 1
+# define _STLP_BASE_TYPEDEF_BUG 1
+# if ( __SUNPRO_CC < 0x401 )
+ __GIVE_UP_WITH_STL(SUNPRO_401)
+# endif
+# endif /* 4.0.1 */
+# endif /* 4.2 */
+
+# endif /* < 5.0 */
+
+# include <config/stl_solaris.h>
+
+#ifndef _MBSTATET_H
+# define _MBSTATET_H
+# undef _MBSTATE_T
+# define _MBSTATE_T
+ typedef struct __mbstate_t {
+ #if defined(_LP64)
+ long __filler[4];
+ #else
+ int __filler[6];
+ #endif
+ } __mbstate_t;
+# ifndef _STLP_HAS_NO_NAMESPACES
+ namespace std {
+ typedef __mbstate_t mbstate_t;
+ }
+ using std::mbstate_t;
+#else
+typedef __mbstate_t mbstate_t;
+# endif
+#endif /* __MBSTATET_H */
diff --git a/src/STLport/config/stl_symantec.h b/src/STLport/config/stl_symantec.h
new file mode 100644
index 0000000..de6d83b
--- /dev/null
+++ b/src/STLport/config/stl_symantec.h
@@ -0,0 +1,42 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+// if not using maximum ANSI compatibility ( -A -Ab -Aw),
+// uncomment the following two lines:
+//# define _STLP_NO_BOOL 1
+//# define _STLP_NO_WCHAR_T 1
+
+
+# define _STLP_HAS_NO_NAMESPACES 1
+
+# define _STLP_NEED_TYPENAME 1
+# define _STLP_NEED_EXPLICIT 1
+# define _STLP_NO_NEW_STYLE_CASTS 1
+# define _STLP_NEED_MUTABLE 1
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+// # define _STLP_NO_BAD_ALLOC 1
+
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# define _STLP_NO_FRIEND_TEMPLATES 1
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+
+// # define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+# define _STLP_NO_METHOD_SPECIALIZATION 1
+# define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+// # define _STLP_NO_EXCEPTION_HEADER 1
+
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+
+# define _STLP_STATIC_CONST_INIT_BUG 1
+# define _STLP_THROW_RETURN_BUG 1
+// # define _STLP_LINK_TIME_INSTANTIATION 1
+# define _STLP_NO_TEMPLATE_CONVERSIONS 1
+
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+# define _STLP_UNINITIALIZABLE_PRIVATE 1
+
diff --git a/src/STLport/config/stl_watcom.h b/src/STLport/config/stl_watcom.h
new file mode 100644
index 0000000..c615ebe
--- /dev/null
+++ b/src/STLport/config/stl_watcom.h
@@ -0,0 +1,152 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+# ifndef _STLP_NO_OWN_IOSTREAMS
+# define _STLP_NO_OWN_IOSTREAMS
+# endif
+
+# define _STLP_NO_RELOPS_NAMESPACE
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX
+
+# define _STLP_HAS_SPECIFIC_PROLOG_EPILOG
+# define _STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+# define _STLP_USE_OLD_HP_ITERATOR_QUERIES
+
+// On QNX, headers are supposed to be found in /usr/include,
+// so default "../include" should work.
+# ifndef __QNX__
+# define _STLP_NATIVE_INCLUDE_PATH ../h
+# endif
+
+// Inline replacements for locking calls under Watcom
+// Define _STLP_NO_WATCOM_INLINE_INTERLOCK to keep using
+// standard WIN32 calls
+// Define _STL_MULTIPROCESSOR to enable lock
+#if !defined(_STLP_NO_WATCOM_INLINE_INTERLOCK)
+
+long __stl_InterlockedIncrement( long *var );
+long __stl_InterlockedDecrement( long *var );
+
+#ifdef _STL_MULTIPROCESSOR
+// Multiple Processors, add lock prefix
+#pragma aux __stl_InterlockedIncrement parm [ ecx ] = \
+ ".586" \
+ "mov eax, 1" \
+ "lock xadd [ecx], eax" \
+ "inc eax" \
+ value [eax];
+
+
+#pragma aux __stl_InterlockedDecrement parm [ ecx ] = \
+ ".586" \
+ "mov eax, 0FFFFFFFFh" \
+ "lock xadd [ecx], eax" \
+ "dec eax" \
+ value [eax];
+#else
+// Single Processor, lock prefix not needed
+#pragma aux __stl_InterlockedIncrement parm [ ecx ] = \
+ ".586" \
+ "mov eax, 1" \
+ "xadd [ecx], eax" \
+ "inc eax" \
+ value [eax];
+
+#pragma aux __stl_InterlockedDecrement parm [ ecx ] = \
+ ".586" \
+ "mov eax, 0FFFFFFFFh" \
+ "xadd [ecx], eax" \
+ "dec eax" \
+ value [eax];
+#endif // _STL_MULTIPROCESSOR
+
+long __stl_InterlockedExchange( long *Destination, long Value );
+
+// xchg has auto-lock
+#pragma aux __stl_InterlockedExchange parm [ecx] [eax] = \
+ ".586" \
+ "xchg eax, [ecx]" \
+ value [eax];
+#else
+
+#define __stl_InterlockedIncrement InterlockedIncrement
+#define __stl_InterlockedDecrement InterlockedDecrement
+#define __stl_InterlockedExchange InterlockedExchange
+#endif /* INLINE INTERLOCK */
+
+#define _STLP_ATOMIC_INCREMENT(__x) __stl_InterlockedIncrement((long*)__x)
+#define _STLP_ATOMIC_DECREMENT(__x) __stl_InterlockedDecrement((long*)__x)
+#define _STLP_ATOMIC_EXCHANGE(__x, __y) __stl_InterlockedExchange((long*)__x, (long)__y)
+
+// boris : is this true or just the header is not in /usr/include ?
+# ifdef __QNX__
+# define _STLP_NO_TYPEINFO 1
+# endif
+
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# define _STLP_NO_FRIEND_TEMPLATES 1
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+
+
+# define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+# define _STLP_HAS_NO_NAMESPACES 1
+# define _STLP_NEED_TYPENAME 1
+
+# if __WATCOMC__ < 1100
+# define _STLP_NO_WCHAR_T 1
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+# endif
+
+# define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+
+# define _STLP_STATIC_CONST_INIT_BUG 1
+// # define _STLP_THROW_RETURN_BUG 1
+# define _STLP_NO_TEMPLATE_CONVERSIONS 1
+
+# define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+
+# define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+# define _STLP_NO_NEW_NEW_HEADER 1
+# define _STLP_VENDOR_GLOBAL_STD
+
+# define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+# define _STLP_NONTEMPL_BASE_MATCH_BUG
+# define _STLP_NO_EXCEPTION_HEADER 1
+# define _STLP_NO_BAD_ALLOC 1
+
+# define _STLP_NESTED_TYPE_PARAM_BUG 1
+
+# define _STLP_NO_CSTD_FUNCTION_IMPORTS 1
+
+# if (__WATCOM_CPLUSPLUS__ < 1100 )
+# define _STLP_NO_BOOL 1
+# define _STLP_NEED_EXPLICIT 1
+# define _STLP_NEED_MUTABLE 1
+# define _STLP_NO_ARROW_OPERATOR 1
+# endif
+// This one is present in 11, but apparently has bugs (with auto_ptr).
+# define _STLP_NO_NEW_STYLE_CASTS 1
+
+// Get rid of Watcom's min and max macros
+#undef min
+#undef max
+
+// for switches (-xs, -xss, -xst)
+//
+#if !(defined (__SW_XS) || defined (__SW_XSS) || defined(__SW_XST))
+# define _STLP_HAS_NO_EXCEPTIONS 1
+# endif
+
+# if defined ( _MT ) && !defined (_NOTHREADS) && !defined (_REENTRANT)
+# define _REENTRANT 1
+# endif
+
+
+
+
+
diff --git a/src/STLport/config/stl_wince.h b/src/STLport/config/stl_wince.h
new file mode 100644
index 0000000..bcd628b
--- /dev/null
+++ b/src/STLport/config/stl_wince.h
@@ -0,0 +1,188 @@
+/*
+ * File to have Windows CE Toolkit for VC++ 5.0 working with STLport
+ * 09 - 03 - 1999
+ * Origin : Giuseppe Govi - g.govi at iol.it
+ */
+
+#ifndef _STLP_WINCE_H
+#define _STLP_WINCE_H
+
+// this flag is being used by STLport
+# define _STLP_WINCE
+
+#ifndef _MT // Always threaded in CE
+ #define _MT
+#endif
+
+#define _STLP_NO_NATIVE_MBSTATE_T
+#define _STLP_NO_TYPEINFO
+#define _STLP_NO_BAD_ALLOC
+#define _STLP_NO_NEW_NEW_HEADER
+#define _STLP_OWN_IOSTREAMS
+
+// tell other parts no threads are there
+# define _STLP_NO_THREADS 1
+
+// not all new-style headers are available...
+# define _STLP_HAS_NO_NEW_C_HEADERS
+
+# undef _STLP_HAS_NO_EXCEPTIONS
+# define _STLP_HAS_NO_EXCEPTIONS
+# undef _STLP_NO_EXCEPTION_HEADER
+# define _STLP_NO_EXCEPTION_HEADER
+
+// we have to use malloc instead of new
+# undef _STLP_USE_NEWALLOC
+# define _STLP_USE_MALLOC
+
+//# ifdef _STLP_MSVC
+//# pragma warning (disable: 4786)
+//# endif
+
+#ifdef _STLP_WINCE_USE_OUTPUTDEBUGSTRING
+#define _STLP_WINCE_TRACE(msg) OutputDebugString(msg)
+#else
+#define _STLP_WINCE_TRACE(msg) MessageBox(NULL,(msg),NULL,MB_OK)
+#endif
+
+#ifndef __THROW_BAD_ALLOC
+#define __THROW_BAD_ALLOC _STLP_WINCE_TRACE(L"out of memory"); ExitThread(1)
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+#ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#define _WCHAR_T_DEFINED
+#endif
+
+#ifndef _TIME_T_DEFINED
+typedef unsigned long time_t;
+#define _TIME_T_DEFINED
+#endif
+
+//ptrdiff_t is not defined in Windows CE SDK
+#ifndef _PTRDIFF_T_DEFINED
+typedef int ptrdiff_t;
+#define _PTRDIFF_T_DEFINED
+#endif
+
+//clock_t is not defined in Windows CE SDK
+#ifndef _CLOCK_T_DEFINED
+typedef long clock_t;
+#define _CLOCK_T_DEFINED
+#endif
+
+//struct tm is not defined in Windows CE SDK
+#ifndef _TM_DEFINED
+struct tm {
+ int tm_sec; /* seconds after the minute - [0,59] */
+ int tm_min; /* minutes after the hour - [0,59] */
+ int tm_hour; /* hours since midnight - [0,23] */
+ int tm_mday; /* day of the month - [1,31] */
+ int tm_mon; /* months since January - [0,11] */
+ int tm_year; /* years since 1900 */
+ int tm_wday; /* days since Sunday - [0,6] */
+ int tm_yday; /* days since January 1 - [0,365] */
+ int tm_isdst; /* daylight savings time flag */
+ };
+#define _TM_DEFINED
+#endif
+
+// Some useful routines that are missing in Windows CE SDK
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+ char * __cdecl getenv(const char *);
+ struct tm * __cdecl gmtime(const time_t *);
+ int __cdecl remove(const char *);
+ int __cdecl rename(const char *, const char *);
+ time_t __cdecl time(time_t *);
+
+ #if (_WIN32_WCE < 300)
+ char * __cdecl strrchr(const char *, int);
+ #endif
+
+#ifdef __cplusplus
+}
+
+#ifndef __PLACEMENT_NEW_INLINE
+inline void *__cdecl operator new(size_t, void *_P) { return (_P); }
+#define __PLACEMENT_NEW_INLINE
+#endif
+
+// Only defined as macros in Windows CE SDK
+#include _STLP_NATIVE_C_HEADER(ctype.h)
+
+#if (_WIN32_WCE < 300) // Only wide chars for older versions
+#define _isctype iswctype
+#endif
+
+inline int (isalpha)(int c) { return _isctype(c, _ALPHA); }
+inline int (isupper)(int c) { return _isctype(c, _UPPER); }
+inline int (islower)(int c) { return _isctype(c, _LOWER); }
+inline int (isdigit)(int c) { return _isctype(c, _DIGIT); }
+inline int (isxdigit)(int c) { return _isctype(c, _HEX); }
+inline int (isspace)(int c) { return _isctype(c, _SPACE); }
+inline int (ispunct)(int c) { return _isctype(c, _PUNCT); }
+inline int (isalnum)(int c) { return _isctype(c, _ALPHA|_DIGIT); }
+inline int (isprint)(int c) { return _isctype(c, _BLANK|_PUNCT|_ALPHA|_DIGIT); }
+inline int (isgraph)(int c) { return _isctype(c, _PUNCT|_ALPHA|_DIGIT); }
+inline int (iscntrl)(int c) { return _isctype(c, _CONTROL); }
+inline int (isascii)(int c) { return ((unsigned)(c) < 0x80); }
+
+#undef _isctype
+
+inline int (iswalpha)(int c) { return iswctype(c, _ALPHA); }
+inline int (iswupper)(int c) { return iswctype(c, _UPPER); }
+inline int (iswlower)(int c) { return iswctype(c, _LOWER); }
+inline int (iswdigit)(int c) { return iswctype(c, _DIGIT); }
+inline int (iswxdigit)(int c) { return iswctype(c, _HEX); }
+inline int (iswspace)(int c) { return iswctype(c, _SPACE); }
+inline int (iswpunct)(int c) { return iswctype(c, _PUNCT); }
+inline int (iswalnum)(int c) { return iswctype(c, _ALPHA|_DIGIT); }
+inline int (iswprint)(int c) { return iswctype(c, _BLANK|_PUNCT|_ALPHA|_DIGIT); }
+inline int (iswgraph)(int c) { return iswctype(c, _PUNCT|_ALPHA|_DIGIT); }
+inline int (iswcntrl)(int c) { return iswctype(c, _CONTROL); }
+inline int (iswascii)(int c) { return ((unsigned)(c) < 0x80); }
+
+#endif /* __cplusplus */
+
+#if !defined(WIN32_LEAN_AND_MEAN) // Minimise windows includes
+ #define WIN32_LEAN_AND_MEAN
+#endif
+#if !defined(VC_EXTRALEAN)
+ #define VC_EXTRALEAN
+#endif
+#if !defined(STRICT)
+ #define STRICT
+#endif
+#if !defined(NOMINMAX)
+ #define NOMINMAX
+#endif
+
+#ifndef __WINDOWS__
+#include <windows.h>
+#endif
+
+#ifndef _ABORT_DEFINED
+# define _STLP_ABORT() TerminateProcess(GetCurrentProcess(), 0)
+# define _ABORT_DEFINED
+#endif
+
+#ifndef _ASSERT_DEFINED
+# define assert(expr) _STLP_ASSERT(expr)
+# define _ASSERT_DEFINED
+#endif
+
+// they say it's needed
+# include <windows.h>
+
+#endif /* _STLP_WCE_H */
+
+
diff --git a/src/STLport/config/stlcomp.h b/src/STLport/config/stlcomp.h
new file mode 100644
index 0000000..cde65ce
--- /dev/null
+++ b/src/STLport/config/stlcomp.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ * Purpose of this file :
+ *
+ * To hold COMPILER-SPECIFIC portion of STLport settings.
+ * In general, user should not edit this file unless
+ * using the compiler not recognized below.
+ *
+ * If your compiler is not being recognized yet,
+ * please look for definitions of macros in stl_mycomp.h,
+ * copy stl_mycomp.h to stl_YOUR_COMPILER_NAME,
+ * adjust flags for your compiler, and add <include config/stl_YOUR_COMPILER_NAME>
+ * to the secton controlled by unique macro defined internaly by your compiler.
+ *
+ * To change user-definable settings, please edit <../stl_user_config.h>
+ *
+ */
+
+#ifndef _STLP_COMP_H
+# define _STLP_COMP_H
+
+# define __GIVE_UP_WITH_STL(message) void give_up() \
+ { upgrade_the_compiler_to_use_STL;}
+
+/* distinguish real MSC from Metrowerks and Intel */
+# if defined(_MSC_VER) && !defined(__MWERKS__) && !defined (__ICL) && !defined (__COMO__)
+# define _STLP_MSVC _MSC_VER
+# endif
+
+# if defined (__xlC__) || defined (__IBMC__) || defined ( __IBMCPP__ )
+/* AIX xlC, Visual Age C++ , OS-390 C++ */
+# include <config/stl_ibm.h>
+# elif defined (__INTEL_COMPILER) && defined(__unix__)
+/* Check intel before gcc, since newer versions define GNUC */
+# include <config/stl_icc.h>
+# elif defined (__GNUC__ )
+# include <config/stl_gcc.h>
+# elif defined (__KCC)
+# include <config/stl_kai.h>
+# elif defined(__sgi)
+# include <config/stl_sgi.h>
+# elif (defined(__OS400__))
+/* AS/400 C++ */
+# include <config/stl_as400.h>
+# elif defined(_STLP_MSVC)
+/* Microsoft Visual C++ 4.0, 4.1, 4.2, 5.0 */
+# include <config/stl_msvc.h>
+# elif defined ( __BORLANDC__ )
+/* Borland C++ ( 4.x - 5.x ) */
+# include <config/stl_bc.h>
+# elif defined(__SUNPRO_CC) || defined (__SUNPRO_C)
+/* SUN CC 4.0.1-5.0 */
+# include <config/stl_sunpro.h>
+# elif defined (__WATCOM_CPLUSPLUS__) || defined (__WATCOMC__)
+/* Watcom C++ */
+# include <config/stl_watcom.h>
+# elif defined(__COMO__) || defined (__COMO_VERSION_)
+# include <config/stl_como.h>
+# elif defined (__DMC__)
+/* Digital Mars C++ */
+# include <config/stl_dm.h>
+# elif defined (__SC__) && (__SC__ < 0x800)
+/* Symantec 7.5 */
+# include <config/stl_symantec.h>
+# elif defined (__MRC__) || (defined (__SC__) && (__SC__ >= 0x882))
+/* Apple MPW SCpp 8.8.2
+ * Apple MPW MrCpp 4.1.0 */
+# include <config/stl_apple.h>
+# elif defined (__MWERKS__)
+/* Metrowerks CodeWarrior */
+# include <config/stl_mwerks.h>
+# elif defined(__hpux)
+/* HP compilers */
+# include <config/stl_hpacc.h>
+# elif defined(__ICL)
+/* Intel reference compiler for Win */
+# include <config/stl_intel.h>
+/* SCO UDK 7 compiler (UnixWare 7x, OSR 5, UnixWare 2x) */
+# elif defined(__USLC__)
+# include <config/stl_sco.h>
+/* Apogee 4.x */
+# elif defined (__APOGEE__)
+# include <config/stl_apcc.h>
+# elif defined (__DECCXX) || defined (__DECC)
+# ifdef __vms
+# include <config/stl_dec_vms.h>
+# else
+# include <config/stl_dec.h>
+# endif
+# elif defined (__ISCPP__)
+# include <config/stl_is.h>
+# elif defined (__FCC_VERSION)
+/* Fujutsu Compiler, v4.0 assumed */
+# include <config/stl_fujitsu.h>
+# elif defined(_CRAY)
+/* Cray C++ 3.4 or 3.5 */
+# include <config/stl_cray.h>
+# else
+/* Unable to identify the compiler, issue error diagnostic.
+ * Edit <config/stl_mycomp.h> to set STLport up for your compiler. */
+# include <config/stl_mycomp.h>
+# endif /* end of compiler choice */
+# undef __GIVE_UP_WITH_STL
+#endif
+
diff --git a/src/STLport/config/vc_select_lib.h b/src/STLport/config/vc_select_lib.h
new file mode 100644
index 0000000..35d8155
--- /dev/null
+++ b/src/STLport/config/vc_select_lib.h
@@ -0,0 +1,35 @@
+# if !( defined(_STLP_WINCE) )
+# define _STLP_EXPORT_DECLSPEC __declspec(dllexport)
+# define _STLP_IMPORT_DECLSPEC __declspec(dllimport)
+# endif
+
+# if !( defined(_STLP_MSVC) && _STLP_MSVC < 1100)
+# define _STLP_CLASS_EXPORT_DECLSPEC __declspec(dllexport)
+# define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)
+# endif
+
+# if !defined (_STLP_NO_OWN_IOSTREAMS)
+
+# if ( defined (__DLL) || defined (_DLL) || defined (_WINDLL) || defined (_RTLDLL) \
+ || defined(_AFXDLL) || defined (_STLP_USE_DYNAMIC_LIB) ) \
+ && ! defined (_STLP_USE_STATIC_LIB)
+# undef _STLP_USE_DECLSPEC
+# define _STLP_USE_DECLSPEC 1
+# endif
+
+# ifndef _STLP_IMPORT_TEMPLATE_KEYWORD
+# define _STLP_IMPORT_TEMPLATE_KEYWORD extern
+# endif
+# define _STLP_EXPORT_TEMPLATE_KEYWORD
+
+# if defined (_RTLDLL) && defined (_STLP_USE_STATIC_LIB)
+# define _STLP_LIB_STATIC_SUFFIX "_staticx"
+# else
+# define _STLP_LIB_STATIC_SUFFIX "_static"
+# endif
+
+# include <config/stl_select_lib.h>
+
+# endif /* _STLP_OWN_IOSTREAMS */
+
+
diff --git a/src/STLport/csetjmp b/src/STLport/csetjmp
new file mode 100644
index 0000000..25a9388
--- /dev/null
+++ b/src/STLport/csetjmp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSETJMP
+# define _STLP_CSETJMP
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x111
+# include <stl/_prolog.h>
+# endif
+
+// if the macro is on, the header is already there
+# ifndef setjmp
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(csetjmp)
+# else
+# include _STLP_NATIVE_C_HEADER(setjmp.h)
+# endif
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::jmp_buf;
+# ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+# ifndef setjmp
+using _STLP_VENDOR_CSTD::setjmp;
+# endif
+using _STLP_VENDOR_CSTD::longjmp;
+# endif
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x111 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CSETJMP */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/csignal b/src/STLport/csignal
new file mode 100644
index 0000000..e3fe609
--- /dev/null
+++ b/src/STLport/csignal
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSIGNAL
+# define _STLP_CSIGNAL
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x112
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(csignal)
+# else
+# include _STLP_NATIVE_C_HEADER(signal.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+# ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+using _STLP_VENDOR_CSTD::signal;
+using _STLP_VENDOR_CSTD::raise;
+# endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
+using _STLP_VENDOR_CSTD::sig_atomic_t;
+_STLP_END_NAMESPACE
+# endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x112 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CSIGNAL */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cstdarg b/src/STLport/cstdarg
new file mode 100644
index 0000000..5b6196e
--- /dev/null
+++ b/src/STLport/cstdarg
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSTDARG
+# define _STLP_CSTDARG
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x113
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(cstdarg)
+# else
+# include _STLP_NATIVE_C_HEADER(stdarg.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::va_list;
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x113 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CSTDARG */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cstddef b/src/STLport/cstddef
new file mode 100644
index 0000000..845b317
--- /dev/null
+++ b/src/STLport/cstddef
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSTDDEF
+# define _STLP_CSTDDEF
+
+# if ! defined (_STLP_WINCE)
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x114
+# include <stl/_prolog.h>
+# endif
+
+# if (__GNUC__ >= 3) && defined(__CYGWIN__) // this total HACK is the only expedient way I could cygwin to work with GCC 3.0
+# define __need_wint_t // mostly because wint_t didn't seem to get defined otherwise :(
+# define __need_wchar_t
+# define __need_size_t
+# define __need_ptrdiff_t
+# define __need_NULL
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(cstddef)
+# else
+# include _STLP_NATIVE_C_HEADER(stddef.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::ptrdiff_t;
+using _STLP_VENDOR_CSTD::size_t;
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x114 )
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_WINCE */
+
+#endif /* _STLP_CSTDDEF */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cstdio b/src/STLport/cstdio
new file mode 100644
index 0000000..43f7248
--- /dev/null
+++ b/src/STLport/cstdio
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSTDIO
+# define _STLP_CSTDIO
+
+# if ! defined (_STLP_WINCE)
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 15
+# include <stl/_prolog.h>
+# endif
+
+#ifdef __Lynx__
+# include _STLP_NATIVE_C_HEADER(stdarg.h)
+#endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(cstdio)
+# else
+# include _STLP_NATIVE_C_HEADER(stdio.h)
+# endif
+
+# ifdef __MWERKS__
+# undef stdin
+# undef stdout
+# undef stderr
+# define stdin (&_STLP_VENDOR_CSTD::__files[0])
+# define stdout (&_STLP_VENDOR_CSTD::__files[1])
+# define stderr (&_STLP_VENDOR_CSTD::__files[2])
+# endif
+
+# if defined (_STLP_MSVC) || defined (__ICL)
+namespace _STLP_VENDOR_CSTD {
+inline
+int vsnprintf(char *s1, size_t n, const char *s2, va_list v)
+{
+return ::_vsnprintf(s1, n, s2, v);
+}
+}
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::FILE;
+using _STLP_VENDOR_CSTD::fpos_t;
+using _STLP_VENDOR_CSTD::size_t;
+
+// undef obsolete macros
+# undef putc
+# undef getc
+# undef getchar
+# undef putchar
+# undef feof
+# undef ferror
+
+# ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+using _STLP_VENDOR_CSTD::clearerr;
+using _STLP_VENDOR_CSTD::fclose;
+using _STLP_VENDOR_CSTD::feof;
+using _STLP_VENDOR_CSTD::ferror;
+using _STLP_VENDOR_CSTD::fflush;
+using _STLP_VENDOR_CSTD::fgetc;
+using _STLP_VENDOR_CSTD::fgetpos;
+using _STLP_VENDOR_CSTD::fgets;
+using _STLP_VENDOR_CSTD::fopen;
+using _STLP_VENDOR_CSTD::fprintf;
+using _STLP_VENDOR_CSTD::fputc;
+using _STLP_VENDOR_CSTD::fputs;
+using _STLP_VENDOR_CSTD::fread;
+using _STLP_VENDOR_CSTD::freopen;
+using _STLP_VENDOR_CSTD::fscanf;
+using _STLP_VENDOR_CSTD::fseek;
+using _STLP_VENDOR_CSTD::fsetpos;
+using _STLP_VENDOR_CSTD::ftell;
+using _STLP_VENDOR_CSTD::fwrite;
+
+# if ( !( defined (__IBMCPP__) && (__IBMCPP__ >= 500) ) )
+ using _STLP_VENDOR_CSTD::getc;
+ using _STLP_VENDOR_CSTD::getchar;
+ using _STLP_VENDOR_CSTD::putc;
+ using _STLP_VENDOR_CSTD::putchar;
+# endif
+
+using _STLP_VENDOR_CSTD::gets;
+using _STLP_VENDOR_CSTD::perror;
+using _STLP_VENDOR_CSTD::printf;
+using _STLP_VENDOR_CSTD::puts;
+using _STLP_VENDOR_CSTD::remove;
+using _STLP_VENDOR_CSTD::rename;
+using _STLP_VENDOR_CSTD::rewind;
+using _STLP_VENDOR_CSTD::scanf;
+using _STLP_VENDOR_CSTD::setbuf;
+using _STLP_VENDOR_CSTD::setvbuf;
+using _STLP_VENDOR_CSTD::sprintf;
+using _STLP_VENDOR_CSTD::sscanf;
+using _STLP_VENDOR_CSTD::tmpfile;
+using _STLP_VENDOR_CSTD::tmpnam;
+using _STLP_VENDOR_CSTD::ungetc;
+using _STLP_VENDOR_CSTD::vfprintf;
+using _STLP_VENDOR_CSTD::vprintf;
+using _STLP_VENDOR_CSTD::vsprintf;
+# if (defined (__MWERKS__) || defined (_STLP_MSVC) || defined (__ICL) || \
+( defined (__BORLANDC__) && __BORLANDC__ > 0x530))
+using _STLP_VENDOR_CSTD::vsnprintf;
+# endif
+# endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
+_STLP_END_NAMESPACE
+# endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 15)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+# endif /* ! defined (_STLP_WINCE) */
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cstdlib b/src/STLport/cstdlib
new file mode 100644
index 0000000..1908261
--- /dev/null
+++ b/src/STLport/cstdlib
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSTDLIB
+# define _STLP_CSTDLIB
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x116
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(cstdlib)
+# else
+# include _STLP_NATIVE_C_HEADER(stdlib.h)
+# endif
+
+# if defined( __MSL__ ) && __MSL__ <= 0x5003
+namespace std {
+ typedef ::div_t div_t;
+ typedef ::ldiv_t ldiv_t;
+# ifdef __MSL_LONGLONG_SUPPORT__
+ typedef ::lldiv_t lldiv_t;
+# endif
+}
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::div_t;
+using _STLP_VENDOR_CSTD::ldiv_t;
+using _STLP_VENDOR_CSTD::size_t;
+
+# ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+using _STLP_VENDOR_CSTD::abort;
+using _STLP_VENDOR_CSTD::atexit;
+using _STLP_VENDOR_CSTD::exit;
+using _STLP_VENDOR_CSTD::getenv;
+using _STLP_VENDOR_CSTD::calloc;
+using _STLP_VENDOR_CSTD::free;
+using _STLP_VENDOR_CSTD::malloc;
+using _STLP_VENDOR_CSTD::realloc;
+using _STLP_VENDOR_CSTD::atof;
+using _STLP_VENDOR_CSTD::atoi;
+using _STLP_VENDOR_CSTD::atol;
+using _STLP_VENDOR_CSTD::mblen;
+using _STLP_VENDOR_CSTD::mbstowcs;
+using _STLP_VENDOR_CSTD::mbtowc;
+using _STLP_VENDOR_CSTD::strtod;
+using _STLP_VENDOR_CSTD::strtol;
+using _STLP_VENDOR_CSTD::strtoul;
+using _STLP_VENDOR_CSTD::system;
+
+#if ! (defined (_STLP_NO_NATIVE_WIDE_STREAMS) || defined (_STLP_NO_MBSTATE_T) )
+using _STLP_VENDOR_CSTD::wcstombs;
+using _STLP_VENDOR_CSTD::wctomb;
+#endif
+using _STLP_VENDOR_CSTD::bsearch;
+using _STLP_VENDOR_CSTD::qsort;
+// boris : if we do not have native float abs, we define ours; then we cannot do "using" for "other" abs
+# ifdef _STLP_HAS_NATIVE_FLOAT_ABS
+using _STLP_VENDOR_CSTD::abs;
+# endif
+using _STLP_VENDOR_CSTD::div;
+using _STLP_VENDOR_CSTD::labs;
+using _STLP_VENDOR_CSTD::ldiv;
+using _STLP_VENDOR_CSTD::rand;
+using _STLP_VENDOR_CSTD::srand;
+# endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined(_STLP_HAS_NO_NEW_C_HEADERS) && defined(__cplusplus)
+# if !defined ( _STLP_LABS )
+inline long abs(long __x) { return _STLP_VENDOR_CSTD::labs(__x); }
+# endif
+# if !defined ( _STLP_LDIV )
+inline ldiv_t div(long __x, long __y) { return _STLP_VENDOR_CSTD::ldiv(__x, __y); }
+# endif
+# endif
+
+# if defined ( _STLP_LLABS )
+_STLP_LONG_LONG abs(_STLP_LONG_LONG __x) { return _STLP_VENDOR_CSTD::_STLP_LLABS(__x); }
+# endif
+# if defined ( _STLP_LLDIV )
+_STLP_LLDIV_T div(_STLP_LONG_LONG __x, _STLP_LONG_LONG __y) { return _STLP_VENDOR_CSTD::_STLP_LLDIV(__x, __y); }
+# endif
+
+_STLP_END_NAMESPACE
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x116)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CSTDLIB */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cstring b/src/STLport/cstring
new file mode 100644
index 0000000..55c65ce
--- /dev/null
+++ b/src/STLport/cstring
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSTRING
+# define _STLP_CSTRING
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x117
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(cstring)
+# else
+# include _STLP_NATIVE_C_HEADER(string.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+# include <using/cstring>
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x117)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CSTRING */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/ctime b/src/STLport/ctime
new file mode 100644
index 0000000..3c63fc5
--- /dev/null
+++ b/src/STLport/ctime
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CTIME
+# define _STLP_CTIME
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x118
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(ctime)
+# else
+# include _STLP_NATIVE_C_HEADER(time.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::size_t;
+using _STLP_VENDOR_CSTD::clock_t;
+using _STLP_VENDOR_CSTD::time_t;
+using _STLP_VENDOR_CSTD::tm;
+# ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+using _STLP_VENDOR_CSTD::clock;
+using _STLP_VENDOR_CSTD::asctime;
+using _STLP_VENDOR_CSTD::ctime;
+using _STLP_VENDOR_CSTD::gmtime;
+using _STLP_VENDOR_CSTD::difftime;
+using _STLP_VENDOR_CSTD::mktime;
+using _STLP_VENDOR_CSTD::localtime;
+using _STLP_VENDOR_CSTD::strftime;
+using _STLP_VENDOR_CSTD::time;
+# endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x118)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CTIME */
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/ctype.h b/src/STLport/ctype.h
new file mode 100644
index 0000000..fda6925
--- /dev/null
+++ b/src/STLport/ctype.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x219
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x219) && ! defined (_STLP_DONT_POP_0x219)
+# define _STLP_DONT_POP_0x219
+# endif
+
+# include _STLP_NATIVE_C_HEADER(ctype.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x219)
+# if ! defined (_STLP_DONT_POP_0x219)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x219
+# endif
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cwchar b/src/STLport/cwchar
new file mode 100644
index 0000000..46943d9
--- /dev/null
+++ b/src/STLport/cwchar
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CWCHAR
+# define _STLP_CWCHAR
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x120
+# include <stl/_prolog.h>
+# endif
+
+# ifdef __GNUC__
+# include <cstddef>
+# endif
+
+# if ! defined (_STLP_WINCE)
+
+# if defined (__BORLANDC__) && (__BORLANDC__ >= 0x530 ) && ! defined (_STLP_OWN_IOSTREAMS)
+/* Borland defines this stuff here */
+# include <iosfwd>
+# endif
+
+# if ! defined (_STLP_NO_CWCHAR) && defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(cwchar)
+
+# elif defined (__MRC__) || (defined (__SC__) && !defined (__DMC__)) || defined (__BORLANDC__) || defined(__FreeBSD__) || (defined (__GNUC__) && defined (__APPLE__) || defined( __Lynx__ )) || defined (_STLP_NO_WCHAR_T)
+
+# include _STLP_NATIVE_C_HEADER(stddef.h)
+# if defined (__FreeBSD__) || defined (__Lynx__)
+# ifndef _WINT_T
+typedef long int wint_t;
+# define _WINT_T
+# endif /* _WINT_T */
+# endif
+
+# else
+# include _STLP_NATIVE_C_HEADER(wchar.h)
+
+# if defined(__sun) && (defined(_XOPEN_SOURCE) || (_XOPEN_VERSION - 0 == 4))
+extern wint_t btowc();
+extern int fwprintf();
+extern int fwscanf();
+extern int fwide();
+extern int mbsinit();
+extern size_t mbrlen();
+extern size_t mbrtowc();
+extern size_t mbsrtowcs();
+extern int swprintf();
+extern int swscanf();
+extern int vfwprintf();
+extern int vwprintf();
+extern int vswprintf();
+extern size_t wcrtomb();
+extern size_t wcsrtombs();
+extern wchar_t *wcsstr();
+extern int wctob();
+extern wchar_t *wmemchr();
+extern int wmemcmp();
+extern wchar_t *wmemcpy();
+extern wchar_t *wmemmove();
+extern wchar_t *wmemset();
+extern int wprintf();
+extern int wscanf();
+# endif
+# endif
+
+#if defined(__MSL__) && __MSL__ <= 0x51FF /* dwa 2/28/99 - not yet implemented by MSL */
+# define _STLP_WCHAR_MSL_EXCLUDE 1
+namespace std
+{
+ extern "C" size_t wcsftime(wchar_t * str, size_t max_size, const wchar_t * format_str, const struct tm * timeptr);
+}
+# define _STLP_NO_MBSTATE_T 1
+#elif defined (__BORLANDC__)
+# ifdef _STLP_OWN_IOSTREAMS
+# define _STLP_NO_NATIVE_MBSTATE_T
+# endif
+# define _STLP_WCHAR_BORLAND_EXCLUDE 1
+# if (__BORLANDC__ < 0x540 )
+# define _STLP_NO_MBSTATE_T 1
+# define _STLP_WCHAR_SUNPRO_EXCLUDE
+# endif
+#endif
+
+#ifndef _STLP_CWCHAR_H
+# include <stl/_cwchar.h>
+#endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+
+#if defined (__SUNPRO_CC) && defined (_STLP_NO_OWN_IOSTREAMS) && !defined (_STLP_HAS_NO_NEW_C_HEADERS)
+using _STLP_VENDOR_CSTD::wint_t;
+#endif
+
+_STLP_BEGIN_NAMESPACE
+# ifdef _STLP_NO_WCHAR_T
+typedef int wint_t;
+# else
+// gcc 3.0 has a glitch : wint_t only sucked into the global namespace if _GLIBCPP_USE_WCHAR_T is defined
+# if defined (__GNUC__) && ! defined (_GLIBCPP_USE_WCHAR_T)
+using ::wint_t;
+# else
+using _STLP_VENDOR_CSTD::wint_t;
+# endif
+# endif
+
+
+using _STLP_VENDOR_CSTD::size_t;
+
+# if !defined (_STLP_NO_NATIVE_MBSTATE_T) && ! defined (_STLP_USE_OWN_MBSTATE_T)
+using _STLP_VENDOR_MB_NAMESPACE::mbstate_t;
+
+# if !defined (_STLP_NO_CSTD_FUNCTION_IMPORTS) && !defined(_STLP_WCHAR_BORLAND_EXCLUDE) \
+ && (!defined(__MSL__) || __MSL__ > 0x6001)
+# if ! (defined (__KCC) || defined (__GNUC__))
+using _STLP_VENDOR_MB_NAMESPACE::btowc;
+# if (!defined(__MSL__) || __MSL__ > 0x7001)
+using _STLP_VENDOR_MB_NAMESPACE::mbsinit;
+# endif
+# endif
+# if ! defined (__GNUC__)
+using _STLP_VENDOR_MB_NAMESPACE::mbrlen;
+using _STLP_VENDOR_MB_NAMESPACE::mbrtowc;
+using _STLP_VENDOR_MB_NAMESPACE::mbsrtowcs;
+using _STLP_VENDOR_MB_NAMESPACE::wcrtomb;
+using _STLP_VENDOR_MB_NAMESPACE::wcsrtombs;
+# endif
+# endif /* BORLAND && !__MSL__ || __MSL__ > 0x6001 */
+
+# endif /* _STLP_NO_NATIVE_MBSTATE_T */
+
+# if !defined (_STLP_NO_NATIVE_WIDE_FUNCTIONS) && ! defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
+
+# if !defined (_STLP_WCHAR_BORLAND_EXCLUDE) && ! defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
+using _STLP_VENDOR_CSTD::fgetwc;
+using _STLP_VENDOR_CSTD::fgetws;
+using _STLP_VENDOR_CSTD::fputwc;
+using _STLP_VENDOR_CSTD::fputws;
+# endif
+
+# if !( defined (_STLP_WCHAR_SUNPRO_EXCLUDE) || defined (_STLP_WCHAR_BORLAND_EXCLUDE) \
+ || defined(_STLP_WCHAR_HPACC_EXCLUDE) )
+# ifndef __DECCXX
+using _STLP_VENDOR_CSTD::fwide;
+# endif
+using _STLP_VENDOR_CSTD::fwprintf;
+using _STLP_VENDOR_CSTD::fwscanf;
+using _STLP_VENDOR_CSTD::getwchar;
+# endif
+
+# ifndef _STLP_WCHAR_BORLAND_EXCLUDE
+using _STLP_VENDOR_CSTD::getwc;
+using _STLP_VENDOR_CSTD::ungetwc;
+
+using _STLP_VENDOR_CSTD::putwc;
+using _STLP_VENDOR_CSTD::putwchar;
+# endif
+
+# if !( defined (_STLP_WCHAR_SUNPRO_EXCLUDE) || defined (_STLP_WCHAR_BORLAND_EXCLUDE)\
+ || defined(_STLP_WCHAR_HPACC_EXCLUDE) )
+using _STLP_VENDOR_CSTD::swprintf;
+using _STLP_VENDOR_CSTD::swscanf;
+using _STLP_VENDOR_CSTD::vfwprintf;
+using _STLP_VENDOR_CSTD::vwprintf;
+using _STLP_VENDOR_CSTD::vswprintf;
+
+# if !defined(__MSL__) || __MSL__ > 0x7001
+using _STLP_VENDOR_CSTD::wcsftime;
+# endif
+using _STLP_VENDOR_CSTD::wcstok;
+
+# endif
+
+# if !(defined (__BORLANDC__) && (__BORLANDC__ < 0x540))
+using _STLP_VENDOR_CSTD::wcscat;
+using _STLP_VENDOR_CSTD::wcsrchr;
+using _STLP_VENDOR_CSTD::wcscmp;
+using _STLP_VENDOR_CSTD::wcscoll;
+
+using _STLP_VENDOR_CSTD::wcscpy;
+using _STLP_VENDOR_CSTD::wcscspn;
+
+using _STLP_VENDOR_CSTD::wcslen;
+using _STLP_VENDOR_CSTD::wcsncat;
+using _STLP_VENDOR_CSTD::wcsncmp;
+using _STLP_VENDOR_CSTD::wcsncpy;
+using _STLP_VENDOR_CSTD::wcspbrk;
+using _STLP_VENDOR_CSTD::wcschr;
+
+using _STLP_VENDOR_CSTD::wcsspn;
+using _STLP_VENDOR_CSTD::wcsxfrm;
+
+# endif
+
+# if !defined (_STLP_WCHAR_BORLAND_EXCLUDE)
+
+using _STLP_VENDOR_CSTD::wcstod;
+using _STLP_VENDOR_CSTD::wcstol;
+
+# endif
+
+# if !( defined (_STLP_WCHAR_SUNPRO_EXCLUDE) || defined(_STLP_WCHAR_HPACC_EXCLUDE) )
+
+using _STLP_VENDOR_CSTD::wcsstr;
+using _STLP_VENDOR_CSTD::wmemchr;
+
+# if !defined (_STLP_WCHAR_BORLAND_EXCLUDE)
+
+#ifndef __DMC__
+using _STLP_VENDOR_CSTD::wctob;
+using _STLP_VENDOR_CSTD::wmemcmp;
+#endif
+using _STLP_VENDOR_CSTD::wmemmove;
+using _STLP_VENDOR_CSTD::wprintf;
+using _STLP_VENDOR_CSTD::wscanf;
+
+# endif
+
+using _STLP_VENDOR_CSTD::wmemcpy;
+using _STLP_VENDOR_CSTD::wmemset;
+# endif
+
+# endif /* _STLP_NO_NATIVE_WIDE_FUNCTIONS */
+_STLP_END_NAMESPACE
+# endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# undef _STLP_WCHAR_SUNPRO_EXCLUDE
+# undef _STLP_WCHAR_MSL_EXCLUDE
+
+# endif /* WINCE */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x120)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CWCHAR */
+
diff --git a/src/STLport/cwctype b/src/STLport/cwctype
new file mode 100644
index 0000000..a24de63
--- /dev/null
+++ b/src/STLport/cwctype
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CWCTYPE
+# define _STLP_CWCTYPE
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x121
+# include <stl/_prolog.h>
+# endif
+
+#ifdef __BORLANDC__
+# include <cctype>
+#endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# include _STLP_NATIVE_CPP_C_HEADER(cwctype)
+# if defined (__MSL__)
+namespace std {
+ typedef wchar_t wctrans_t;
+ wint_t towctrans(wint_t c, wctrans_t value);
+ wctrans_t wctrans(const char *name);
+}
+# endif
+# else
+# include _STLP_NATIVE_C_HEADER(wctype.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::wctype_t;
+using _STLP_VENDOR_CSTD::wint_t;
+# ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+# if ! defined (__BORLANDC__)
+using _STLP_VENDOR_CSTD::wctrans_t;
+using _STLP_VENDOR_CSTD::towctrans;
+using _STLP_VENDOR_CSTD::wctrans;
+using _STLP_VENDOR_CSTD::wctype;
+using _STLP_VENDOR_CSTD::iswctype;
+# endif
+using _STLP_VENDOR_CSTD::iswalnum;
+using _STLP_VENDOR_CSTD::iswalpha;
+using _STLP_VENDOR_CSTD::iswcntrl;
+
+using _STLP_VENDOR_CSTD::iswdigit;
+using _STLP_VENDOR_CSTD::iswgraph;
+using _STLP_VENDOR_CSTD::iswlower;
+using _STLP_VENDOR_CSTD::iswprint;
+using _STLP_VENDOR_CSTD::iswpunct;
+using _STLP_VENDOR_CSTD::iswspace;
+using _STLP_VENDOR_CSTD::iswupper;
+using _STLP_VENDOR_CSTD::iswxdigit;
+
+using _STLP_VENDOR_CSTD::towlower;
+using _STLP_VENDOR_CSTD::towupper;
+# endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x121)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CWCTYPE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/deque b/src/STLport/deque
new file mode 100644
index 0000000..23c5c58
--- /dev/null
+++ b/src/STLport/deque
@@ -0,0 +1,55 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_DEQUE
+#define _STLP_DEQUE
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x22
+# include <stl/_prolog.h>
+# endif
+
+#ifdef _STLP_PRAGMA_ONCE
+# pragma once
+#endif
+
+#ifndef _STLP_INTERNAL_DEQUE_H
+# include <stl/_deque.h>
+#endif
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(deque)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x22)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_DEQUE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/exception b/src/STLport/exception
new file mode 100644
index 0000000..8254e18
--- /dev/null
+++ b/src/STLport/exception
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+// This header exists solely for portability. Normally it just includes
+// the native header <exception>.
+
+// The header <exception> contains low-level functions that interact
+// with a compiler's exception-handling mechanism. It is assumed to
+// be supplied with the compiler, rather than with the library, because
+// it is inherently tied very closely to the compiler itself.
+
+// On platforms where <exception> does not exist, this header defines
+// an exception base class. This is *not* a substitute for everything
+// in <exception>, but it suffices to support a bare minimum of STL
+// functionality.
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x423
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x423) && ! defined (_STLP_DONT_POP_0x423)
+# define _STLP_DONT_POP_0x423
+# endif
+
+# if ! defined (_STLP_NO_EXCEPTION_HEADER)
+
+# if defined ( _UNCAUGHT_EXCEPTION )
+# undef _STLP_INCOMPLETE_EXCEPTION_HEADER
+# endif
+
+# if defined(_STLP_BROKEN_EXCEPTION_CLASS)
+# define exception _STLP_NULLIFIED_BROKEN_EXCEPTION_CLASS
+# define bad_exception _STLP_NULLIFIED_BROKEN_BAD_EXCEPTION_CLASS
+# if defined (_STLP_NO_NEW_NEW_HEADER)
+# include _STLP_NATIVE_CPP_RUNTIME_HEADER(Exception.h)
+# else
+# include _STLP_NATIVE_CPP_RUNTIME_HEADER(Exception)
+# endif
+# undef exception
+# undef bad_exception
+# else
+
+# if defined (_STLP_NO_NEW_NEW_HEADER)
+# include _STLP_NATIVE_CPP_RUNTIME_HEADER(exception.h)
+# else
+# include _STLP_NATIVE_CPP_RUNTIME_HEADER(exception)
+# endif
+
+# endif
+
+# if defined (_STLP_MSVC) || defined (__ICL)
+// dwa 02/04/00 - here I'm assuming that __ICL uses the same library headers as vc6.
+// the header <yvals.h> which ships with vc6 and is included by its native <exception>
+// actually turns on warnings, so we have to turn them back off.
+# include <config/_msvc_warnings_off.h>
+# endif
+
+
+# ifdef _STLP_USE_OWN_NAMESPACE
+
+_STLP_BEGIN_NAMESPACE
+
+#if !defined(_STLP_BROKEN_EXCEPTION_CLASS)
+using _STLP_VENDOR_EXCEPT_STD::exception;
+using _STLP_VENDOR_EXCEPT_STD::bad_exception;
+#endif
+
+# if ! defined (_STLP_NO_USING_FOR_GLOBAL_FUNCTIONS)
+
+// fbp : many platforms present strange mix of
+// those in various namespaces
+# if !defined(_STLP_VENDOR_UNEXPECTED_STD)
+# define _STLP_VENDOR_UNEXPECTED_STD _STLP_VENDOR_EXCEPT_STD
+# endif
+
+// weird errors
+# if (! defined (__BORLANDC__)) || (defined (__STD_EXCEPTION) && defined (__RWSTD_EXCEPTION_SEEN) && defined ( _STLP_DONT_POP_0x423))
+using _STLP_VENDOR_UNEXPECTED_STD::unexpected;
+using _STLP_VENDOR_UNEXPECTED_STD::unexpected_handler;
+using _STLP_VENDOR_UNEXPECTED_STD::set_unexpected;
+using _STLP_VENDOR_UNEXPECTED_STD::terminate;
+using _STLP_VENDOR_UNEXPECTED_STD::terminate_handler;
+using _STLP_VENDOR_UNEXPECTED_STD::set_terminate;
+# endif
+
+# if !defined (_STLP_INCOMPLETE_EXCEPTION_HEADER)
+using _STLP_VENDOR_UNEXPECTED_STD::uncaught_exception;
+# endif
+
+# endif
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_OWN_NAMESPACE */
+
+#else /* _STLP_NO_EXCEPTION_HEADER */
+
+// fbp : absence of <exception> usually means that those
+// functions are not going to be called by compiler.
+// Still, define them for the user.
+typedef void (*unexpected_handler)();
+unexpected_handler set_unexpected(unexpected_handler f) _STLP_NOTHROW_INHERENTLY;
+void unexpected();
+
+typedef void (*terminate_handler)();
+terminate_handler set_terminate(terminate_handler f) _STLP_NOTHROW_INHERENTLY;
+void terminate();
+
+bool uncaught_exception(); // not implemented under mpw as of Jan/1999
+
+#endif /* _STLP_NO_EXCEPTION_HEADER */
+
+# if defined (_STLP_NO_EXCEPTION_HEADER) || defined(_STLP_BROKEN_EXCEPTION_CLASS)
+# ifndef _STLP_EXCEPTION_H
+# define _STLP_EXCEPTION_H
+
+_STLP_BEGIN_NAMESPACE
+
+// section 18.6.1
+ class _STLP_CLASS_DECLSPEC exception
+ {
+ public:
+# ifdef _STLP_OWN_IOSTREAMS
+ exception() _STLP_NOTHROW;
+ virtual ~exception() _STLP_NOTHROW;
+ virtual const char* what() const _STLP_NOTHROW;
+# else
+ exception() _STLP_NOTHROW {}
+ virtual ~exception() _STLP_NOTHROW {}
+ virtual const char* what() const _STLP_NOTHROW {return "class exception";}
+# endif
+ };
+
+
+
+// section 18.6.2.1
+ class _STLP_CLASS_DECLSPEC bad_exception : public exception
+ {
+ public:
+# ifdef _STLP_OWN_IOSTREAMS
+ bad_exception() _STLP_NOTHROW;
+ ~bad_exception() _STLP_NOTHROW;
+ const char* what() const _STLP_NOTHROW;
+# else
+ bad_exception() _STLP_NOTHROW {}
+ ~bad_exception() _STLP_NOTHROW {}
+ const char* what() const _STLP_NOTHROW {return "class bad_exception";}
+# endif
+ };
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_NO_EXCEPTION_HEADER */
+
+_STLP_BEGIN_NAMESPACE
+// forward declaration
+class __Named_exception;
+_STLP_END_NAMESPACE
+#endif /* _STLP_EXCEPTION_H */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x423)
+# if ! defined (_STLP_DONT_POP_0x423)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x423
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
+
+
+
diff --git a/src/STLport/exception.h b/src/STLport/exception.h
new file mode 100644
index 0000000..7dbb34c
--- /dev/null
+++ b/src/STLport/exception.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_OLDSTD_exception
+# define _STLP_OLDSTD_exception
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x824
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x824) && ! defined (_STLP_DONT_POP_0x824)
+# define _STLP_DONT_POP_0x824
+# endif
+
+# if defined (__BORLANDC__)
+# include <exception.>
+# elif defined (_MSC_VER)
+# include <exception>
+# else
+# include _STLP_NATIVE_CPP_RUNTIME_HEADER(exception.h)
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x824)
+# if ! defined (_STLP_DONT_POP_0x824)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x824
+# endif
+
+#endif /* _STLP_OLDSTD_exception */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/export b/src/STLport/export
new file mode 100644
index 0000000..964628e
--- /dev/null
+++ b/src/STLport/export
@@ -0,0 +1,85 @@
+./algorithm
+./bitset
+./cassert
+./cctype
+./cerrno
+./cfloat
+./climits
+./clocale
+./cmath
+./complex
+./csetjmp
+./csignal
+./cstdarg
+./cstddef
+./cstdio
+./cstdlib
+./cstring
+./ctime
+./ctype.h
+./cwchar
+./cwctype
+./deque
+./exception
+./exception.h
+./export
+./fstream
+./fstream.h
+./functional
+./hash_map
+./hash_set
+./iomanip
+./iomanip.h
+./ios
+./ios.h
+./iosfwd
+./iostream
+./iostream.h
+./istream
+./istream.h
+./iterator
+./limits
+./list
+./locale
+./locale.h
+./map
+./math.h
+./mem.h
+./memory
+./mmemory.h
+./new
+./new.h
+./numeric
+./ostream
+./ostream.h
+./pthread.h
+./pthread_alloc
+./queue
+./rope
+./set
+./setjmp.h
+./signal.h
+./slist
+./sstream
+./stack
+./stdarg.h
+./stddef.h
+./stdexcept
+./stdio.h
+./stdio_streambuf
+./stdlib.h
+./stl_user_config.h
+./streambuf
+./streambuf.h
+./string
+./string.h
+./strstream
+./strstream.h
+./time.h
+./typeinfo
+./typeinfo.h
+./utility
+./valarray
+./vector
+./wchar.h
+./wctype.h
diff --git a/src/STLport/export.sun b/src/STLport/export.sun
new file mode 100644
index 0000000..1b310a2
--- /dev/null
+++ b/src/STLport/export.sun
@@ -0,0 +1,48 @@
+./algorithm.SUNWCCh
+./bitset.SUNWCCh
+./complex.SUNWCCh
+./deque.SUNWCCh
+./exception.SUNWCCh
+./fstream.SUNWCCh
+./fstream.h.SUNWCCh
+./functional.SUNWCCh
+./hash_map.SUNWCCh
+./hash_set.SUNWCCh
+./iomanip.SUNWCCh
+./iomanip.h.SUNWCCh
+./ios.SUNWCCh
+./ios.h.SUNWCCh
+./iosfwd.SUNWCCh
+./iostream.SUNWCCh
+./iostream.h.SUNWCCh
+./istream.SUNWCCh
+./istream.h.SUNWCCh
+./iterator.SUNWCCh
+./limits.SUNWCCh
+./list.SUNWCCh
+./locale.SUNWCCh
+./map.SUNWCCh
+./memory.SUNWCCh
+./new.SUNWCCh
+./numeric.SUNWCCh
+./ostream.SUNWCCh
+./ostream.h.SUNWCCh
+./pthread_alloc.SUNWCCh
+./queue.SUNWCCh
+./set.SUNWCCh
+./slist.SUNWCCh
+./sstream.SUNWCCh
+./stack.SUNWCCh
+./stdexcept.SUNWCCh
+./streambuf.SUNWCCh
+./streambuf.h.SUNWCCh
+./string.SUNWCCh
+./strstream.SUNWCCh
+./strstream.h.SUNWCCh
+./typeinfo.SUNWCCh
+./utility.SUNWCCh
+./valarray.SUNWCCh
+./vector.SUNWCCh
+
+
+
diff --git a/src/STLport/fstream b/src/STLport/fstream
new file mode 100644
index 0000000..5a3b486
--- /dev/null
+++ b/src/STLport/fstream
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+
+// This header defines classes basic_filebuf, basic_ifstream,
+// basic_ofstream, and basic_fstream. These classes represent
+// streambufs and streams whose sources or destinations are files.
+
+#ifndef _STLP_FSTREAM
+#define _STLP_FSTREAM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1025
+# include <stl/_prolog.h>
+# endif
+
+#ifdef _STLP_PRAGMA_ONCE
+# pragma once
+#endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+# include <stl/_fstream.h>
+
+# ifndef __LOCALE_INITIALIZED
+# define __LOCALE_INITIALIZED
+_STLP_BEGIN_NAMESPACE
+// Global initializer object, to ensure construction of static objects.
+static ios_base::_Loc_init _LocInit;
+_STLP_END_NAMESPACE
+# endif
+
+# elif !defined(_STLP_USE_NO_IOSTREAMS)
+# include <wrap_std/fstream>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1025)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_FSTREAM */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/fstream.h b/src/STLport/fstream.h
new file mode 100644
index 0000000..e2ce711
--- /dev/null
+++ b/src/STLport/fstream.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_FSTREAM_H
+# define _STLP_FSTREAM_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x2026
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+#ifdef __BORLANDC__
+# include <fstream.>
+#else
+# include <fstream>
+#endif
+// get desired pollution
+# include <iostream.h>
+
+# ifndef __LOCALE_INITIALIZED
+# define __LOCALE_INITIALIZED
+// Global initializer object, to ensure initialization of locale subsystem.
+static ios_base::_Loc_init _LocInit;
+# endif
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+# include <using/fstream>
+# endif
+
+# elif ! defined (_STLP_USE_NO_IOSTREAMS)
+# include <wrap_std/h/fstream.h>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2026)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_FSTREAM_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/functional b/src/STLport/functional
new file mode 100644
index 0000000..80cd905
--- /dev/null
+++ b/src/STLport/functional
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_FUNCTIONAL
+#define _STLP_FUNCTIONAL
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x27
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# if defined (_STLP_IMPORT_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(functional)
+# endif
+
+# ifndef _STLP_INTERNAL_FUNCTION_H
+# include <stl/_function.h>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x27)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_FUNCTIONAL */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/hash_map b/src/STLport/hash_map
new file mode 100644
index 0000000..88964eb
--- /dev/null
+++ b/src/STLport/hash_map
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_HASH_MAP
+#define _STLP_HASH_MAP
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x4028
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+#include <stl/_hash_map.h>
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x4028)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_HASH_MAP */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/hash_set b/src/STLport/hash_set
new file mode 100644
index 0000000..3e4ac56
--- /dev/null
+++ b/src/STLport/hash_set
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_HASH_SET
+#define _STLP_HASH_SET
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x4029
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+#include <stl/_hash_set.h>
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x4029)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_HASH_SET */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/iomanip b/src/STLport/iomanip
new file mode 100644
index 0000000..39bf3fe
--- /dev/null
+++ b/src/STLport/iomanip
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_IOMANIP
+#define _STLP_IOMANIP
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1030
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# if defined ( _STLP_OWN_IOSTREAMS )
+
+# include <stl/_istream.h> // Includes <ostream> and <ios>
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// Machinery for defining manipulators.
+
+// Class that calls one of ios_base's single-argument member functions.
+template <class _Arg>
+struct _Ios_Manip_1 {
+ typedef _Arg (ios_base::*__f_ptr_type)(_Arg);
+
+ _Ios_Manip_1(__f_ptr_type __f, const _Arg& __arg)
+ : _M_f(__f), _M_arg(__arg)
+ {}
+
+ void operator()(ios_base& __ios) const {
+ (__ios.*_M_f)(_M_arg);
+ }
+
+ __f_ptr_type _M_f;
+ _Arg _M_arg;
+};
+
+// Class that calls one of ios_base's two-argument member functions.
+struct _Ios_Setf_Manip {
+ ios_base::fmtflags _M_flag;
+ ios_base::fmtflags _M_mask;
+ bool _M_two_args;
+
+ _Ios_Setf_Manip(ios_base::fmtflags __f)
+ : _M_flag(__f), _M_mask(0), _M_two_args(false)
+ {}
+
+ _Ios_Setf_Manip(ios_base::fmtflags __f, ios_base::fmtflags __m)
+ : _M_flag(__f), _M_mask(__m), _M_two_args(true)
+ {}
+
+ void operator()(ios_base& __ios) const {
+ if (_M_two_args)
+ __ios.setf(_M_flag, _M_mask);
+ else
+ __ios.setf(_M_flag);
+ }
+};
+
+
+template <class _CharT, class _Traits, class _Arg>
+inline basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __in,
+ const _Ios_Manip_1<_Arg>& __f)
+{
+ __f(__in);
+ return __in;
+}
+
+template <class _CharT, class _Traits, class _Arg>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const _Ios_Manip_1<_Arg>& __f)
+{
+ __f(__os);
+ return __os;
+}
+
+template <class _CharT, class _Traits>
+inline basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __in, const _Ios_Setf_Manip& __f)
+{
+ __f(__in);
+ return __in;
+}
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, const _Ios_Setf_Manip& __f)
+
+{
+ __f(__os);
+ return __os;
+}
+
+//----------------------------------------------------------------------
+// The ios_base manipulators.
+
+inline _Ios_Setf_Manip _STLP_CALL resetiosflags(ios_base::fmtflags __mask) {
+ return _Ios_Setf_Manip(0, __mask);
+}
+
+inline _Ios_Setf_Manip _STLP_CALL setiosflags(ios_base::fmtflags __flag) {
+ return _Ios_Setf_Manip(__flag);
+}
+
+inline _Ios_Setf_Manip _STLP_CALL setbase(int __n) {
+ ios_base::fmtflags __base = __n == 8 ? ios_base::oct :
+ __n == 10 ? ios_base::dec :
+ __n == 16 ? ios_base::hex :
+ ios_base::fmtflags(0);
+ return _Ios_Setf_Manip(__base, ios_base::basefield);
+}
+
+inline _Ios_Manip_1<streamsize> _STLP_CALL
+setprecision(int __n) {
+ _Ios_Manip_1<streamsize>::__f_ptr_type __f = &ios_base::precision;
+ return _Ios_Manip_1<streamsize>(__f, __n);
+}
+
+inline _Ios_Manip_1<streamsize> _STLP_CALL
+setw(int __n) {
+ _Ios_Manip_1<streamsize>::__f_ptr_type __f = &ios_base::width;
+ return _Ios_Manip_1<streamsize>(__f, __n);
+}
+
+//----------------------------------------------------------------------
+// setfill, a manipulator that operates on basic_ios<> instead of ios_base.
+
+template <class _CharT>
+struct _Setfill_Manip {
+ _Setfill_Manip(_CharT __c) : _M_c(__c) {}
+ _CharT _M_c;
+};
+
+template <class _CharT, class _CharT2, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const _Setfill_Manip<_CharT2>& __m)
+{
+ __os.fill(__m._M_c);
+ return __os;
+}
+
+template <class _CharT, class _CharT2, class _Traits>
+inline basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is,
+ const _Setfill_Manip<_CharT2>& __m)
+{
+ __is.fill(__m._M_c);
+ return __is;
+}
+
+template <class _CharT>
+inline _Setfill_Manip<_CharT> _STLP_CALL
+setfill(_CharT __c) {
+ return _Setfill_Manip<_CharT>(__c);
+}
+
+_STLP_END_NAMESPACE
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+# include <wrap_std/iomanip>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1030)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOMANIP */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/iomanip.h b/src/STLport/iomanip.h
new file mode 100644
index 0000000..4052ec5
--- /dev/null
+++ b/src/STLport/iomanip.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_IOMANIP_H
+# define _STLP_IOMANIP_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x2031
+# include <stl/_prolog.h>
+# endif
+
+# if defined ( _STLP_OWN_IOSTREAMS )
+
+#ifdef __BORLANDC__
+# include <iomanip.>
+#else
+# include <iomanip>
+#endif
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_STD;
+# else
+using _STLP_STD::setiosflags;
+using _STLP_STD::resetiosflags;
+using _STLP_STD::setbase;
+using _STLP_STD::setfill;
+using _STLP_STD::setprecision;
+using _STLP_STD::setw;
+# endif
+# endif /* _STLP_HAS_NO_NAMESPACES */
+
+// get all the pollution we want
+# include <iostream.h>
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(iomanip.h)
+
+# if defined (_STLP_USE_NAMESPACES) && ! defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+# include <using/h/iomanip.h>
+_STLP_END_NAMESPACE
+# endif /* _STLP_USE_NAMESPACES */
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2031)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOMANIP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/ios b/src/STLport/ios
new file mode 100644
index 0000000..a10d7a9
--- /dev/null
+++ b/src/STLport/ios
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_IOS
+#define _STLP_IOS
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1032
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# if defined ( _STLP_OWN_IOSTREAMS )
+# include <stl/_ios.h>
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+# include <wrap_std/ios>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1032)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOS */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/ios.h b/src/STLport/ios.h
new file mode 100644
index 0000000..7c92cec
--- /dev/null
+++ b/src/STLport/ios.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_IOS_H
+# define _STLP_IOS_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1033
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+#ifdef __BORLANDC__
+# include <ios.>
+#else
+# include <ios>
+#endif
+
+# if defined (_STLP_USE_NAMESPACES)
+# include <using/ios>
+# endif
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(ios.h)
+# if defined (_STLP_USE_NAMESPACES) && !defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+using _STLP_OLD_IO_NAMESPACE::ios;
+_STLP_END_NAMESPACE
+# endif /* _STLP_USE_OWN_NAMESPACE */
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1033)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/iosfwd b/src/STLport/iosfwd
new file mode 100644
index 0000000..cd958c8
--- /dev/null
+++ b/src/STLport/iosfwd
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_IOSFWD
+#define _STLP_IOSFWD
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1034
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+# if defined (_STLP_HAS_WCHAR_T) && !defined (_STLP_CWCHAR)
+# include <cwchar>
+# endif
+
+# include <stl/_iosfwd.h>
+
+# elif defined (_STLP_USE_NO_IOSTREAMS)
+
+# include <stl/char_traits.h>
+
+# else
+
+_STLP_BEGIN_NAMESPACE
+template <class _Tp> class allocator;
+_STLP_END_NAMESPACE
+
+# include <wrap_std/iosfwd>
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1034)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOSFWD */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/iostream b/src/STLport/iostream
new file mode 100644
index 0000000..2e3259b
--- /dev/null
+++ b/src/STLport/iostream
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_IOSTREAM
+#define _STLP_IOSTREAM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1037
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+#include <stl/_iosfwd.h>
+#include <stl/_istream.h>
+
+_STLP_BEGIN_NAMESPACE
+
+#ifndef _STLP_USE_NAMESPACES
+// in case of SGI iostreams, we have to rename our streams not to clash with those
+// provided in native lib
+# define cin _STLP_cin
+# define cout _STLP_cout
+# define cerr _STLP_cerr
+# define clog _STLP_clog
+#endif
+
+// Note: cin and wcin are both associated with stdio. The C standard
+// (Amendment 1, section 4.6.2.1) says that it is an error to mix
+// wide- and narrow-oriented I/O on the same stream. This implies
+// that it is an error to use both cin and wcin in the same C++
+// program; the same applies to cout and wcout, and cerr/clog and
+// wcerr/wclog.
+
+extern _STLP_DECLSPEC istream cin;
+extern _STLP_DECLSPEC ostream cout;
+extern _STLP_DECLSPEC ostream cerr;
+extern _STLP_DECLSPEC ostream clog;
+
+# ifndef _STLP_NO_WCHAR_T
+extern _STLP_DECLSPEC wistream wcin;
+extern _STLP_DECLSPEC wostream wcout;
+extern _STLP_DECLSPEC wostream wcerr;
+extern _STLP_DECLSPEC wostream wclog;
+# endif
+
+# ifndef __LOCALE_INITIALIZED
+# define __LOCALE_INITIALIZED
+// Global initializer object, to ensure initialization of locale subsystem.
+static ios_base::_Loc_init _LocInit;
+# endif
+
+# ifndef __IOS_BASE_INITIALIZED
+# define __IOS_BASE_INITIALIZED
+// Global initializer object, to ensure construction of static objects.
+static ios_base::Init _IosInit;
+# endif
+
+_STLP_END_NAMESPACE
+
+# elif defined ( _STLP_USE_NO_IOSTREAMS )
+# include <stl/_null_stream.h>
+# else
+
+# include <wrap_std/iostream>
+
+# endif /* STL_USE_NO_IOSTREAMS */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1037)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOSTREAM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/iostream.h b/src/STLport/iostream.h
new file mode 100644
index 0000000..439a0b1
--- /dev/null
+++ b/src/STLport/iostream.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_IOSTREAM_H
+# define _STLP_IOSTREAM_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x2035
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_OWN_IOSTREAMS
+
+#ifdef __BORLANDC__
+# include <iostream.>
+#else
+# include <iostream>
+#endif
+
+// Those should be included all separately, as they do contain using declarations
+# include <streambuf.h>
+# include <ostream.h>
+# include <istream.h>
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_STD;
+# else
+using _STLP_STD::cin;
+using _STLP_STD::cout;
+using _STLP_STD::clog;
+using _STLP_STD::cerr;
+using _STLP_STD::iostream;
+
+# ifndef _STLP_NO_WCHAR_T
+using _STLP_STD::wcin;
+using _STLP_STD::wcout;
+using _STLP_STD::wclog;
+using _STLP_STD::wcerr;
+# endif
+
+# endif
+
+# endif /* _STLP_HAS_NO_NAMESPACES */
+
+// Obsolete classes for old-style backwards compatibility
+
+
+class istream_withassign : public istream {
+ public:
+ istream_withassign() : istream((streambuf*)0) {}
+ ~istream_withassign() {}
+
+ istream_withassign& operator=(istream& __s) {
+ ios::init(__s.rdbuf());
+ return *this;
+ }
+ istream_withassign& operator=(streambuf* __s) {
+ ios::init(__s);
+ return *this;
+ }
+};
+
+class ostream_withassign : public ostream {
+ public:
+ ostream_withassign() : ostream((streambuf*)0) {}
+ ~ostream_withassign() {}
+
+ ostream_withassign& operator=(ostream& __s) {
+ ios::init(__s.rdbuf());
+ return *this;
+ }
+ ostream_withassign& operator=(streambuf* __s) {
+ ios::init(__s);
+ return *this;
+ }
+};
+
+class iostream_withassign : public iostream {
+ public:
+ iostream_withassign() : iostream((streambuf*)0) {}
+ ~iostream_withassign() {}
+ iostream_withassign & operator=(ios& __i) {
+ ios::init(__i.rdbuf());
+ return *this;
+ }
+ iostream_withassign & operator=(streambuf* __s) {
+ ios::init(__s);
+ return *this;
+ }
+} ;
+
+# elif ! defined (_STLP_USE_NO_IOSTREAMS)
+# include <wrap_std/h/iostream.h>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2035)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOSTREAM_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/istream b/src/STLport/istream
new file mode 100644
index 0000000..fec47d7
--- /dev/null
+++ b/src/STLport/istream
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ISTREAM
+#define _STLP_ISTREAM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1036
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+// boris : apparently, needed to resolve some
+// circular dependancies
+// # include <iterator>
+# include <stl/_istream.h>
+
+# elif !defined(_STLP_USE_NO_IOSTREAMS)
+
+# include <wrap_std/istream>
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1036)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ISTREAM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/istream.h b/src/STLport/istream.h
new file mode 100644
index 0000000..342aae8
--- /dev/null
+++ b/src/STLport/istream.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ISTREAM_H
+# define _STLP_ISTREAM_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x2037
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+# include <istream>
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_STD;
+# else
+using _STLP_STD::basic_istream;
+using _STLP_STD::basic_iostream;
+using _STLP_STD::istream;
+using _STLP_STD::iostream;
+using _STLP_STD::ios;
+# ifndef _STLP_NO_WCHAR_T
+using _STLP_STD::wistream;
+using _STLP_STD::wiostream;
+# endif
+using _STLP_STD::ws;
+# endif
+# endif
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(istream.h)
+
+# if defined (_STLP_USE_NAMESPACES) && !defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+using _STLP_OLD_IO_NAMESPACE::istream;
+_STLP_END_NAMESPACE
+# endif /* _STLP_USE_OWN_NAMESPACE */
+
+# endif /* _STLP_OWN_IOSTREAMS */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2037)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ISTREAM_H */
+
diff --git a/src/STLport/iterator b/src/STLport/iterator
new file mode 100644
index 0000000..ee3cbd6
--- /dev/null
+++ b/src/STLport/iterator
@@ -0,0 +1,59 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ITERATOR
+#define _STLP_ITERATOR
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x38
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+#if defined (_STLP_IMPORT_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(iterator)
+#endif /* IMPORT */
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_STREAM_ITERATOR_H
+# include <stl/_stream_iterator.h>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x38)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ITERATOR */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/limits b/src/STLport/limits
new file mode 100644
index 0000000..2cd16b5
--- /dev/null
+++ b/src/STLport/limits
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_LIMITS
+#define _STLP_LIMITS
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x39
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# ifndef _STLP_LIMITS_H
+# include <stl/_limits.h>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x39)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_LIMITS */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/list b/src/STLport/list
new file mode 100644
index 0000000..7cdc087
--- /dev/null
+++ b/src/STLport/list
@@ -0,0 +1,55 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_LIST
+#define _STLP_LIST
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x40
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+#ifndef _STLP_INTERNAL_LIST_H
+# include <stl/_list.h>
+#endif
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(list)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x40)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_LIST */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/locale b/src/STLport/locale
new file mode 100644
index 0000000..cd7ae9e
--- /dev/null
+++ b/src/STLport/locale
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_LOCALE
+#define _STLP_LOCALE
+
+// Basic framework: class locale and class locale::facet
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1041
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+// Individual facets
+#ifndef _STLP_INTERNAL_CTYPE_H
+#include <stl/_ctype.h>
+#endif
+#ifndef _STLP_INTERNAL_CODECVT_H
+#include <stl/_codecvt.h>
+#endif
+#ifndef _STLP_INTERNAL_COLLATE_H
+#include <stl/_collate.h>
+#endif
+#ifndef _STLP_INTERNAL_NUM_PUT_H
+# include <stl/_num_put.h>
+#endif
+
+#ifndef _STLP_INTERNAL_NUM_GET_H
+# include <stl/_num_get.h>
+#endif
+
+// those never included separately anyway
+#include <stl/_monetary.h>
+#include <stl/_time_facets.h>
+#include <stl/_messages_facets.h>
+
+// some stuff for streambuf iterators ended up defined there
+// Strictly speaking, _istream.h portion is only required for <iterator>, but it may break too many
+// programs if we omit it
+#ifndef _STLP_ISTREAM_H
+# include <stl/_istream.h>
+#endif
+
+// Convenience interfaces
+#undef isspace
+#undef isprint
+#undef iscntrl
+#undef isupper
+#undef islower
+#undef isalpha
+#undef isdigit
+#undef ispunct
+#undef isxdigit
+#undef isalnum
+#undef isgraph
+#undef toupper
+#undef tolower
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT>
+inline bool isspace (_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::space, c);
+}
+
+template <class _CharT>
+inline bool isprint (_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::print, c);
+}
+
+template <class _CharT>
+inline bool iscntrl (_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::cntrl, c);
+}
+
+template <class _CharT>
+inline bool isupper (_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::upper, c);
+}
+
+template <class _CharT>
+inline bool islower (_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::lower, c);
+}
+
+template <class _CharT>
+inline bool isalpha (_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::alpha, c);
+}
+
+template <class _CharT>
+inline bool isdigit (_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::digit, c);
+}
+
+template <class _CharT>
+inline bool ispunct (_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::punct, c);
+}
+
+template <class _CharT>
+inline bool isxdigit (_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::xdigit, c);
+}
+
+template <class _CharT>
+inline bool isalnum (_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::alnum, c);
+}
+
+template <class _CharT>
+inline bool isgraph (_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::graph, c);
+}
+
+template <class _CharT>
+inline _CharT toupper(_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).toupper(c);
+}
+
+template <class _CharT>
+inline _CharT tolower(_CharT c, const locale& loc) {
+ return (use_facet<ctype<_CharT> >(loc)).tolower(c);
+}
+
+# ifndef __LOCALE_INITIALIZED
+# define __LOCALE_INITIALIZED
+// Global initializer object, to ensure initialization of locale subsystem.
+static ios_base::_Loc_init _LocInit;
+# endif
+
+_STLP_END_NAMESPACE
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+# include <wrap_std/locale>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1041)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_LOCALE */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/locale.h b/src/STLport/locale.h
new file mode 100644
index 0000000..0656975
--- /dev/null
+++ b/src/STLport/locale.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x242
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x242) && ! defined (_STLP_DONT_POP_0x242)
+# define _STLP_DONT_POP_0x242
+# endif
+
+# include _STLP_NATIVE_C_HEADER(locale.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x242)
+# if ! defined (_STLP_DONT_POP_0x242)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x242
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/map b/src/STLport/map
new file mode 100644
index 0000000..f0cf7b1
--- /dev/null
+++ b/src/STLport/map
@@ -0,0 +1,53 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_MAP
+#define _STLP_MAP
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x43
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+#include <stl/_map.h>
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(map)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x43)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_MAP */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/math.h b/src/STLport/math.h
new file mode 100644
index 0000000..7b02ff8
--- /dev/null
+++ b/src/STLport/math.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x244
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x244) && ! defined (_STLP_DONT_POP_0x244)
+# define _STLP_DONT_POP_0x244
+# endif
+
+# if ! defined (exception) && (! defined (__KCC) || (__KCC_VERSION < 4000)) && \
+ ! (defined(__IBMCPP__) && (500 <= __IBMCPP__))
+# define __EXCEPTION_WAS_REDEFINED 1
+# define exception __math_exception
+# endif
+
+# include _STLP_NATIVE_C_HEADER(math.h)
+
+# if defined (__EXCEPTION_WAS_REDEFINED)
+# undef exception
+# undef __EXCEPTION_WAS_REDEFINED
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x244)
+# if ! defined (_STLP_DONT_POP_0x244)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x244
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/mem.h b/src/STLport/mem.h
new file mode 100644
index 0000000..e80f14d
--- /dev/null
+++ b/src/STLport/mem.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+// Boris : highly questionable header for BC++
+
+#ifndef _STLP_mem_h
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x245
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x245) && ! defined (_STLP_DONT_POP_0x245)
+# define _STLP_DONT_POP_0x245
+# endif
+
+# if (__BORLANDC__ > 0x530) && !defined(__linux__)
+# include <rw/stddefs.h>
+# endif
+
+# undef __USING_CNAME__
+
+# include _STLP_NATIVE_C_HEADER(mem.h)
+
+# define _STLP_mem_h 1
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x245)
+# if ! defined (_STLP_DONT_POP_0x245)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x245
+# endif
+
+#endif /* _STLP_mem_h */
+
+// #endif /* NATIVE */
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/memory b/src/STLport/memory
new file mode 100644
index 0000000..28f24e3
--- /dev/null
+++ b/src/STLport/memory
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_MEMORY
+# define _STLP_MEMORY
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x46
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+# include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_TEMPBUF_H
+# include <stl/_tempbuf.h>
+# endif
+
+# ifndef _STLP_INTERNAL_RAW_STORAGE_ITER_H
+# include <stl/_raw_storage_iter.h>
+# endif
+
+# include <stl/_auto_ptr.h>
+
+# if defined (_STLP_IMPORT_VENDOR_STD)
+
+# if defined (__MSL__)
+# include _STLP_NATIVE_HEADER(limits)
+# endif
+
+# include _STLP_NATIVE_HEADER(memory)
+
+# if defined (__MSL__) && (__MSL__ >= 0x2405 && __MSL__ < 0x5201)
+/* 980401 vss MSL 2.4 Pro 3 Release */
+# include <new_mem.h>
+# endif
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x46)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_MEMORY */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/mmemory.h b/src/STLport/mmemory.h
new file mode 100644
index 0000000..835dad5
--- /dev/null
+++ b/src/STLport/mmemory.h
@@ -0,0 +1 @@
+CAUUSE A SYNTAX ERROR
diff --git a/src/STLport/new b/src/STLport/new
new file mode 100644
index 0000000..fcb3810
--- /dev/null
+++ b/src/STLport/new
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_NEW_HEADER
+# define _STLP_NEW_HEADER
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x447
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_CSTDDEF
+// size_t
+# include <cstddef>
+#endif
+
+#if defined (__BORLANDC__) && (__BORLANDC__ > 0x520)
+// new.h uses ::malloc ;(
+# include <cstdlib>
+using _STLP_VENDOR_CSTD::malloc;
+#endif
+
+# if !defined (_STLP_NO_NEW_NEW_HEADER)
+# include _STLP_NATIVE_CPP_RUNTIME_HEADER(new)
+# else
+# include <new.h>
+# endif
+
+#ifndef _STLP_NEW_H_HEADER
+# include <stl/_new.h>
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x447)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_NEW */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/new.h b/src/STLport/new.h
new file mode 100644
index 0000000..b1bf7a4
--- /dev/null
+++ b/src/STLport/new.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x848
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x848) && ! defined (_STLP_DONT_POP_0x848)
+# define _STLP_DONT_POP_0x848
+# endif
+
+# ifndef _STLP_WINCE
+# if defined (__BORLANDC__)
+# include <new.>
+# elif (__INTEL_COMPILER >= 800)
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(new.h)
+# else
+# if defined (__GNUC__) && (__GNUC__ >=3)
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(new.h)
+# else
+# include _STLP_NATIVE_CPP_RUNTIME_HEADER(new.h)
+# endif
+# endif
+# endif /* STL_WINCE */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x848)
+# if ! defined (_STLP_DONT_POP_0x848)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x848
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/numeric b/src/STLport/numeric
new file mode 100644
index 0000000..c39f0e8
--- /dev/null
+++ b/src/STLport/numeric
@@ -0,0 +1,50 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_NUMERIC
+#define _STLP_NUMERIC
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x49
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+#ifndef _STLP_INTERNAL_FUNCTION_H
+# include <stl/_function.h>
+#endif
+
+#include <stl/_numeric.h>
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x49)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_NUMERIC */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/algo.h b/src/STLport/old_hp/algo.h
new file mode 100644
index 0000000..9e62c34
--- /dev/null
+++ b/src/STLport/old_hp/algo.h
@@ -0,0 +1,146 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ALGO_H
+#define _STLP_ALGO_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa001
+# include <stl/_prolog.h>
+# endif
+
+# ifndef _STLP_ALGOBASE_H
+# include <algobase.h>
+# endif
+
+# ifndef _STLP_TEMPBUF_H
+# include <tempbuf.h>
+# endif
+
+# ifndef _STLP_INTERNAL_HEAP_H
+# include <stl/_heap.h>
+# endif
+
+# ifndef _STLP_ITERATOR_H
+# include <iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALGO_H
+# include <stl/_algo.h>
+# endif
+
+# ifndef _STLP_NUMERIC_H
+# include <stl/_numeric.h>
+# endif
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+// Names from <stl/_algo.h>
+using STLPORT::for_each;
+using STLPORT::find;
+using STLPORT::find_if;
+using STLPORT::adjacent_find;
+using STLPORT::count;
+using STLPORT::count_if;
+using STLPORT::search;
+using STLPORT::search_n;
+using STLPORT::swap_ranges;
+using STLPORT::transform;
+using STLPORT::replace;
+using STLPORT::replace_if;
+using STLPORT::replace_copy;
+using STLPORT::replace_copy_if;
+using STLPORT::generate;
+using STLPORT::generate_n;
+// using STLPORT::remove;
+using STLPORT::remove_if;
+using STLPORT::remove_copy;
+using STLPORT::remove_copy_if;
+using STLPORT::unique;
+using STLPORT::unique_copy;
+using STLPORT::reverse;
+using STLPORT::reverse_copy;
+using STLPORT::rotate;
+using STLPORT::rotate_copy;
+using STLPORT::random_shuffle;
+using STLPORT::random_sample;
+using STLPORT::random_sample_n;
+using STLPORT::partition;
+using STLPORT::stable_partition;
+using STLPORT::sort;
+using STLPORT::stable_sort;
+using STLPORT::partial_sort;
+using STLPORT::partial_sort_copy;
+using STLPORT::nth_element;
+using STLPORT::lower_bound;
+using STLPORT::upper_bound;
+using STLPORT::equal_range;
+using STLPORT::binary_search;
+using STLPORT::merge;
+using STLPORT::inplace_merge;
+using STLPORT::includes;
+using STLPORT::set_union;
+using STLPORT::set_intersection;
+using STLPORT::set_difference;
+using STLPORT::set_symmetric_difference;
+using STLPORT::min_element;
+using STLPORT::max_element;
+using STLPORT::next_permutation;
+using STLPORT::prev_permutation;
+using STLPORT::find_first_of;
+using STLPORT::find_end;
+using STLPORT::is_sorted;
+using STLPORT::is_heap;
+
+// Names from stl_heap.h
+using STLPORT::push_heap;
+using STLPORT::pop_heap;
+using STLPORT::make_heap;
+using STLPORT::sort_heap;
+
+// Names from <stl/_numeric.h>
+using STLPORT::accumulate;
+using STLPORT::inner_product;
+using STLPORT::partial_sum;
+using STLPORT::adjacent_difference;
+using STLPORT::power;
+using STLPORT::iota;
+
+# endif /* _STLP_BROKEN_USING_DIRECTIVE */
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa001)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ALGO_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/algobase.h b/src/STLport/old_hp/algobase.h
new file mode 100644
index 0000000..536c8d9
--- /dev/null
+++ b/src/STLport/old_hp/algobase.h
@@ -0,0 +1,97 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ALGOBASE_H
+#define _STLP_ALGOBASE_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa002
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_PAIR_H
+#include <pair.h>
+#endif
+
+// memmove
+#ifndef _STLP_CSTRING
+# include <cstring>
+#endif
+
+// CHAR_MAX
+#ifndef _STLP_CLIMITS
+# include <climits>
+#endif
+
+#ifndef _STLP_ITERATOR_H
+#include <iterator.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ALGOBASE_H
+#include <stl/_algobase.h>
+#endif
+
+#ifndef _STLP_INTERNAL_UNINITIALIZED_H
+#include <stl/_uninitialized.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+// Names from stl_algobase.h
+using STLPORT::iter_swap;
+using STLPORT::swap;
+using STLPORT::min;
+using STLPORT::max;
+using STLPORT::copy;
+using STLPORT::copy_backward;
+using STLPORT::copy_n;
+using STLPORT::fill;
+using STLPORT::fill_n;
+using STLPORT::mismatch;
+using STLPORT::equal;
+using STLPORT::lexicographical_compare;
+using STLPORT::lexicographical_compare_3way;
+
+// Names from stl_uninitialized.h
+using STLPORT::uninitialized_copy;
+using STLPORT::uninitialized_copy_n;
+using STLPORT::uninitialized_fill;
+using STLPORT::uninitialized_fill_n;
+# endif /* _STLP_BROKEN_USING_DIRECTIVE */
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa002)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ALGOBASE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/alloc.h b/src/STLport/old_hp/alloc.h
new file mode 100644
index 0000000..33be2f8
--- /dev/null
+++ b/src/STLport/old_hp/alloc.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ALLOC_H
+#define _STLP_ALLOC_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa003
+# include <stl/_prolog.h>
+# endif
+
+#if defined (_STLP_DEBUG) || defined (_STLP_ASSERTIONS) && !defined (_STLP_DEBUG_H)
+# include <stl/debug/_debug.h>
+#endif
+
+# ifndef _STLP_CSTDDEF
+# include <cstddef>
+# endif
+# ifndef _STLP_CLIMITS
+# include <climits>
+# endif
+# ifndef _STLP_CSTDLIB
+# include <cstdlib>
+# endif
+# ifndef _STLP_CSTRING
+# include <cstring>
+# endif
+# ifndef _STLP_CASSERT
+# include <cassert>
+# endif
+
+#ifndef _STLP_INTERNAL_ALLOC_H
+#include <stl/_alloc.h>
+#endif
+
+// Old SGI names
+_STLP_BEGIN_NAMESPACE
+
+typedef __sgi_alloc alloc;
+typedef __malloc_alloc<0> malloc_alloc;
+#ifdef _STLP_USE_NEWALLOC
+typedef __new_alloc new_alloc;
+#endif
+
+#define simple_alloc __simple_alloc
+typedef __single_client_alloc single_client_alloc;
+typedef __multithreaded_alloc multithreaded_alloc;
+
+_STLP_END_NAMESPACE
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+
+using namespace STLPORT;
+
+# else
+
+# ifdef _STLP_USE_RAW_SGI_ALLOCATORS
+using _STLP_STD::simple_alloc;
+using _STLP_STD::alloc;
+# endif
+
+using _STLP_STD::malloc_alloc;
+# ifdef _STLP_DEBUG_ALLOC
+using _STLP_STD::__debug_alloc;
+# endif
+#ifdef _STLP_USE_NEWALLOC
+using _STLP_STD::new_alloc;
+#endif
+
+using _STLP_STD::single_client_alloc;
+using _STLP_STD::multithreaded_alloc;
+using _STLP_STD::allocator;
+
+# endif /* _STLP_BROKEN_USING_DIRECTIVE */
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa003)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ALLOC_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/old_hp/bvector.h b/src/STLport/old_hp/bvector.h
new file mode 100644
index 0000000..c0e7b7b
--- /dev/null
+++ b/src/STLport/old_hp/bvector.h
@@ -0,0 +1,68 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_BVECTOR_H
+#define _STLP_BVECTOR_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa004
+# include <stl/_prolog.h>
+# endif
+
+#include <algobase.h>
+
+#include <stl/_range_errors.h>
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+#include <vector.h>
+#else
+#include <alloc.h>
+#endif
+
+#include <stl/_vector.h>
+#include <stl/_bvector.h>
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::bit_vector;
+# endif
+
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa004)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_BVECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
+
diff --git a/src/STLport/old_hp/defalloc.h b/src/STLport/old_hp/defalloc.h
new file mode 100644
index 0000000..1eee36f
--- /dev/null
+++ b/src/STLport/old_hp/defalloc.h
@@ -0,0 +1,87 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ */
+
+// Inclusion of this file is DEPRECATED. This is the original HP
+// default allocator. It is provided only for backward compatibility.
+// This file WILL BE REMOVED in a future release.
+//
+// DO NOT USE THIS FILE unless you have an old container implementation
+// that requires an allocator with the HP-style interface.
+//
+// Standard-conforming allocators have a very different interface. The
+// standard default allocator is declared in the header <memory>.
+
+// Adaptation note: THIS version of allocator<T> is fully compatible with
+// SGI containers and works OK standalone. It is also as close to CD2 version
+// as possible w/o member templates.
+// However, explicit use of allocator<T> is not recommended
+// unless you have to do so ( for example, compiling third-party code).
+
+#ifndef _STLP_DEFALLOC_H
+#define _STLP_DEFALLOC_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa005
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_DEBUG) && ! defined ( _STLP_DEBUG_H )
+# include <stl/debug/_debug.h>
+# endif
+
+#if defined (_STLP_USE_NEW_STYLE_HEADERS)
+# include <cstddef>
+# include <cstdlib>
+# include <cstring>
+# include <cassert>
+#else
+# include <stddef.h>
+# include <stdlib.h>
+# include <string.h>
+# include <assert.h>
+#endif
+
+# include <new>
+
+#ifdef _STLP_THREADS
+# include <stl/_threads.h>
+#endif
+
+# if !defined (__THROW_BAD_ALLOC) && !defined(_STLP_USE_EXCEPTIONS)
+# if defined (_STLP_USE_NEW_STYLE_HEADERS)
+# include <cstdio>
+# else
+# include <stdio.h>
+# endif
+# endif
+# include <stl/_alloc.h>
+
+// fbp: just for backwards compatibility,
+// hope this doesn't break anything.
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::allocator;
+# endif /* _STLP_BROKEN_USING_DIRECTIVE */
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa005)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_DEFALLOC_H */
+
diff --git a/src/STLport/old_hp/deque.h b/src/STLport/old_hp/deque.h
new file mode 100644
index 0000000..4171074
--- /dev/null
+++ b/src/STLport/old_hp/deque.h
@@ -0,0 +1,68 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_DEQUE_H
+#define _STLP_DEQUE_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa006
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_ALGOBASE_H
+# include <algobase.h>
+#endif
+
+#ifndef _STLP_RANGE_ERRORS_H
+# include <stl/_range_errors.h>
+#endif
+
+#ifndef _STLP_ALLOC_H
+# include <alloc.h>
+#endif
+
+#ifndef _STLP_INTERNAL_DEQUE_H
+# include <stl/_deque.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::deque;
+using STLPORT::__deque__;
+# endif /* _STLP_BROKEN_USING_DIRECTIVE */
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa006)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_DEQUE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/export b/src/STLport/old_hp/export
new file mode 100644
index 0000000..0c0e780
--- /dev/null
+++ b/src/STLport/old_hp/export
@@ -0,0 +1,27 @@
+./algo.h
+./algobase.h
+./alloc.h
+./bvector.h
+./defalloc.h
+./deque.h
+./function.h
+./hash_map.h
+./hash_set.h
+./hashtable.h
+./heap.h
+./iterator.h
+./list.h
+./map.h
+./multimap.h
+./multiset.h
+./numeric.h
+./pair.h
+./pthread_alloc.h
+./queue.h
+./rope.h
+./set.h
+./slist.h
+./stack.h
+./tempbuf.h
+./tree.h
+./vector.h
diff --git a/src/STLport/old_hp/function.h b/src/STLport/old_hp/function.h
new file mode 100644
index 0000000..e707e36
--- /dev/null
+++ b/src/STLport/old_hp/function.h
@@ -0,0 +1,126 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_FUNCTION_H
+#define _STLP_FUNCTION_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa008
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_CSTDDEF
+# include <cstddef>
+#endif
+
+#ifndef _STLP_INTERNAL_ALGOBASE_H
+#include <stl/_algobase.h>
+#endif
+
+#ifndef _STLP_INTERNAL_FUNCTION_H
+#include <stl/_function.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+#ifndef _STLP_NO_RELOPS_NAMESPACE
+using namespace STLPORT_RELOPS;
+#endif /* _STLP_USE_NAMESPACE_FOR_RELOPS */
+
+# else /* _STLP_BROKEN_USING_DIRECTIVE */
+
+// Names from stl_function.h
+using _STLP_STD::unary_function;
+using _STLP_STD::binary_function;
+using _STLP_STD::plus;
+using _STLP_STD::minus;
+using _STLP_STD::multiplies;
+using _STLP_STD::divides;
+using _STLP_STD::identity_element;
+using _STLP_STD::modulus;
+using _STLP_STD::negate;
+using _STLP_STD::equal_to;
+using _STLP_STD::not_equal_to;
+using _STLP_STD::greater;
+using _STLP_STD::less;
+using _STLP_STD::greater_equal;
+using _STLP_STD::less_equal;
+using _STLP_STD::logical_and;
+using _STLP_STD::logical_or;
+using _STLP_STD::logical_not;
+using _STLP_STD::unary_negate;
+using _STLP_STD::binary_negate;
+using _STLP_STD::not1;
+using _STLP_STD::not2;
+using _STLP_STD::binder1st;
+using _STLP_STD::binder2nd;
+using _STLP_STD::bind1st;
+using _STLP_STD::bind2nd;
+using _STLP_STD::unary_compose;
+using _STLP_STD::binary_compose;
+using _STLP_STD::compose1;
+using _STLP_STD::compose2;
+using _STLP_STD::pointer_to_unary_function;
+using _STLP_STD::pointer_to_binary_function;
+using _STLP_STD::ptr_fun;
+using _STLP_STD::identity;
+using _STLP_STD::select1st;
+using _STLP_STD::select2nd;
+using _STLP_STD::project1st;
+using _STLP_STD::project2nd;
+using _STLP_STD::constant_void_fun;
+using _STLP_STD::constant_unary_fun;
+using _STLP_STD::constant_binary_fun;
+using _STLP_STD::constant0;
+using _STLP_STD::constant1;
+using _STLP_STD::constant2;
+using _STLP_STD::subtractive_rng;
+using _STLP_STD::mem_fun_t;
+using _STLP_STD::const_mem_fun_t;
+using _STLP_STD::mem_fun_ref_t;
+using _STLP_STD::const_mem_fun_ref_t;
+using _STLP_STD::mem_fun1_t;
+using _STLP_STD::const_mem_fun1_t;
+using _STLP_STD::mem_fun1_ref_t;
+using _STLP_STD::const_mem_fun1_ref_t;
+using _STLP_STD::mem_fun;
+using _STLP_STD::mem_fun_ref;
+using _STLP_STD::mem_fun1;
+using _STLP_STD::mem_fun1_ref;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa008)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_FUNCTION_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/hash_map.h b/src/STLport/old_hp/hash_map.h
new file mode 100644
index 0000000..a0e8aec
--- /dev/null
+++ b/src/STLport/old_hp/hash_map.h
@@ -0,0 +1,62 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_HASH_MAP_H
+#define _STLP_HASH_MAP_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa009
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_HASHTABLE_H
+#include <hashtable.h>
+#endif
+
+#include <stl/_hash_map.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::hash;
+using STLPORT::hashtable;
+using STLPORT::hash_map;
+using STLPORT::hash_multimap;
+using STLPORT::__hash_map__;
+using STLPORT::__hash_multimap__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa009)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_HASH_MAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/hash_set.h b/src/STLport/old_hp/hash_set.h
new file mode 100644
index 0000000..a30bbad
--- /dev/null
+++ b/src/STLport/old_hp/hash_set.h
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_HASH_SET_H
+#define _STLP_HASH_SET_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa010
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_HASHTABLE_H
+#include <hashtable.h>
+#endif
+
+#include <stl/_hash_set.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::hash;
+using STLPORT::hashtable;
+using STLPORT::hash_set;
+using STLPORT::hash_multiset;
+using STLPORT::__hash_set__;
+using STLPORT::__hash_multiset__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa010)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_HASH_SET_H */
diff --git a/src/STLport/old_hp/hashtable.h b/src/STLport/old_hp/hashtable.h
new file mode 100644
index 0000000..831c2ac
--- /dev/null
+++ b/src/STLport/old_hp/hashtable.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_HASHTABLE_H
+#define _STLP_HASHTABLE_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa011
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_ALGO_H
+#include <algo.h>
+#endif
+#ifndef _STLP_ALLOC_H
+#include <alloc.h>
+#endif
+#ifndef _STLP_VECTOR_H
+#include <vector.h>
+#endif
+#ifndef _STLP_HASH_FUN_H
+#include <stl/_hash_fun.h>
+#endif
+#ifndef _STLP_INTERNAL_HASHTABLE_H
+#include <stl/_hashtable.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::hash;
+using STLPORT::hashtable;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa011)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+#endif /* _STLP_HASHTABLE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/heap.h b/src/STLport/old_hp/heap.h
new file mode 100644
index 0000000..e82f95c
--- /dev/null
+++ b/src/STLport/old_hp/heap.h
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_HEAP_H
+#define _STLP_HEAP_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x12
+# include <stl/_prolog.h>
+# endif
+
+#include <stl/_heap.h>
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace std;
+# else
+using STLPORT::push_heap;
+using STLPORT::pop_heap;
+using STLPORT::make_heap;
+using STLPORT::sort_heap;
+# endif
+
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x12)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_HEAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/iterator.h b/src/STLport/old_hp/iterator.h
new file mode 100644
index 0000000..a4d91d3
--- /dev/null
+++ b/src/STLport/old_hp/iterator.h
@@ -0,0 +1,147 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ITERATOR_H
+#define _STLP_ITERATOR_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa013
+# include <stl/_prolog.h>
+# endif
+
+#if defined (_STLP_DEBUG) || defined (_STLP_ASSERTIONS) && !defined (_STLP_DEBUG_H)
+# include <stl/debug/_debug.h>
+#endif
+
+#if defined (_STLP_USE_NEW_STYLE_HEADERS)
+# include <cstddef>
+#else
+# include <stddef.h>
+#endif
+
+# ifndef _STLP_NEW
+# include <new>
+# endif
+
+# ifndef __TYPE_TRAITS_H
+# include <stl/type_traits.h>
+# endif
+
+#ifndef _STLP_FUNCTION_H
+#include <function.h>
+#endif
+
+# ifndef _STLP_IOSFWD
+# include <iosfwd>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h>
+# endif
+
+#ifndef _STLP_INTERNAL_CONSTRUCT_H
+#include <stl/_construct.h>
+#endif
+
+#ifndef _STLP_INTERNAL_RAW_STORAGE_ITERATOR_H
+#include <stl/_raw_storage_iter.h>
+#endif
+
+# ifndef _STLP_INTERNAL_STREAM_ITERATOR_H
+# include <stl/_stream_iterator.h>
+# endif
+
+#ifdef _STLP_USE_NAMESPACES
+
+// Names from stl_iterator.h
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+
+using STLPORT::input_iterator_tag;
+using STLPORT::output_iterator_tag;
+using STLPORT::forward_iterator_tag;
+using STLPORT::bidirectional_iterator_tag;
+using STLPORT::random_access_iterator_tag;
+
+using STLPORT::input_iterator;
+using STLPORT::output_iterator;
+using STLPORT::forward_iterator;
+using STLPORT::bidirectional_iterator;
+using STLPORT::random_access_iterator;
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+using STLPORT::iterator_traits;
+#endif
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+using STLPORT::iterator_category;
+using STLPORT::distance_type;
+using STLPORT::value_type;
+# endif
+
+using STLPORT::distance;
+using STLPORT::advance;
+
+using STLPORT::insert_iterator;
+using STLPORT::front_insert_iterator;
+using STLPORT::back_insert_iterator;
+using STLPORT::inserter;
+using STLPORT::front_inserter;
+using STLPORT::back_inserter;
+
+using STLPORT::reverse_iterator;
+# if ! defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION ) || defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
+using STLPORT::reverse_bidirectional_iterator;
+# endif
+using STLPORT::istream_iterator;
+using STLPORT::ostream_iterator;
+
+// Names from stl_construct.h
+using STLPORT::construct;
+using STLPORT::destroy;
+
+// Names from stl_raw_storage_iter.h
+using STLPORT::raw_storage_iterator;
+# endif
+
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa013)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/old_hp/list.h b/src/STLport/old_hp/list.h
new file mode 100644
index 0000000..6f42e3f
--- /dev/null
+++ b/src/STLport/old_hp/list.h
@@ -0,0 +1,62 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_LIST_H
+#define _STLP_LIST_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa014
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_ALGOBASE_H
+# include <algobase.h>
+#endif
+
+#ifndef _STLP_ALLOC_H
+# include <alloc.h>
+#endif
+
+#include <stl/_list.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::list;
+using STLPORT::__list__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa014)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_LIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/map.h b/src/STLport/old_hp/map.h
new file mode 100644
index 0000000..ac4a0b3
--- /dev/null
+++ b/src/STLport/old_hp/map.h
@@ -0,0 +1,60 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_MAP_H
+# define _STLP_MAP_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa015
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_TREE_H
+# include <tree.h>
+#endif
+
+# include <stl/_map.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::map;
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+using STLPORT::__map;
+# endif
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa015)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_MAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/multimap.h b/src/STLport/old_hp/multimap.h
new file mode 100644
index 0000000..cd00f43
--- /dev/null
+++ b/src/STLport/old_hp/multimap.h
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_MULTIMAP_H
+#define _STLP_MULTIMAP_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa016
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_TREE_H
+# include <tree.h>
+#endif
+
+#include <stl/_map.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::multimap;
+using STLPORT::__multimap__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa016)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_MULTIMAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/multiset.h b/src/STLport/old_hp/multiset.h
new file mode 100644
index 0000000..7c32f25
--- /dev/null
+++ b/src/STLport/old_hp/multiset.h
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_MULTISET_H
+#define _STLP_MULTISET_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa017
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_TREE_H
+# include <tree.h>
+#endif
+
+#include <stl/_set.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::multiset;
+using STLPORT::__multiset__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa017)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_MULTISET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/numeric.h b/src/STLport/old_hp/numeric.h
new file mode 100644
index 0000000..8945a01
--- /dev/null
+++ b/src/STLport/old_hp/numeric.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1997
+ * Mark of the Unicorn, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Mark of the Unicorn, Inc. makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef _STLP_NUMERIC_H
+# define _STLP_NUMERIC_H
+
+#ifndef __MWERKS__
+# error This file should be removed from installations not using the Metrowerks Standard Library
+#else
+# include <numeric>
+//# include <algo.h>
+#endif
+
+# endif // _STLP_NUMERIC_H
diff --git a/src/STLport/old_hp/pair.h b/src/STLport/old_hp/pair.h
new file mode 100644
index 0000000..df30a65
--- /dev/null
+++ b/src/STLport/old_hp/pair.h
@@ -0,0 +1,59 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_PAIR_H
+#define _STLP_PAIR_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa020
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::pair;
+using _STLP_STD::make_pair;
+# endif
+
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa020)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_PAIR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/old_hp/pthread_alloc.h b/src/STLport/old_hp/pthread_alloc.h
new file mode 100644
index 0000000..4a66d1e
--- /dev/null
+++ b/src/STLport/old_hp/pthread_alloc.h
@@ -0,0 +1,57 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_PTHREAD_ALLOC_H
+#define _STLP_PTHREAD_ALLOC_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa021
+# include <stl/_prolog.h>
+# endif
+
+#if defined (_STLP_DEBUG) || defined (_STLP_ASSERTIONS)
+# include <stl/debug/_debug.h>
+#endif
+
+#include <pthread_alloc>
+
+#ifdef _STLP_USE_NAMESPACES
+
+using STLPORT::_Pthread_alloc_template;
+using STLPORT::pthread_alloc;
+
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa021)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_PTHREAD_ALLOC_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/old_hp/queue.h b/src/STLport/old_hp/queue.h
new file mode 100644
index 0000000..36b6e93
--- /dev/null
+++ b/src/STLport/old_hp/queue.h
@@ -0,0 +1,23 @@
+/*
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef __QUEUE__
+# define __QUEUE__
+# include <queue>
+#endif
diff --git a/src/STLport/old_hp/rope.h b/src/STLport/old_hp/rope.h
new file mode 100644
index 0000000..851a6bc
--- /dev/null
+++ b/src/STLport/old_hp/rope.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ROPE_H
+#define _STLP_ROPE_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa022
+# include <stl/_prolog.h>
+# endif
+
+#include <stl/_rope.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::char_producer;
+using STLPORT::sequence_buffer;
+using STLPORT::rope;
+using STLPORT::crope;
+using STLPORT::wrope;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa022)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ROPE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/set.h b/src/STLport/old_hp/set.h
new file mode 100644
index 0000000..81d4949
--- /dev/null
+++ b/src/STLport/old_hp/set.h
@@ -0,0 +1,57 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_SET_H
+#define _STLP_SET_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa023
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_TREE_H
+# include <tree.h>
+#endif
+
+#include <stl/_set.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::set;
+using STLPORT::__set__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa023)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/slist.h b/src/STLport/old_hp/slist.h
new file mode 100644
index 0000000..bcd5d15
--- /dev/null
+++ b/src/STLport/old_hp/slist.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_SLIST_H
+#define _STLP_SLIST_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa024
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_ALGOBASE_H
+# include <algobase.h>
+#endif
+
+#ifndef _STLP_ALLOC_H
+# include <alloc.h>
+#endif
+
+#include <stl/_slist.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::slist;
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+using STLPORT::__slist;
+# endif
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa024)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_SLIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/stack.h b/src/STLport/old_hp/stack.h
new file mode 100644
index 0000000..2898e06
--- /dev/null
+++ b/src/STLport/old_hp/stack.h
@@ -0,0 +1,73 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STACK_H
+#define _STLP_STACK_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa027
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_VECTOR_H
+#include <vector.h>
+#endif
+
+#ifndef _STLP_DEQUE_H
+#include <deque.h>
+#endif
+
+#ifndef _STLP_HEAP_H
+#include <heap.h>
+#endif
+
+#ifndef _STLP_INTERNAL_STACK_H
+#include <stl/_stack.h>
+#endif
+
+#ifndef _STLP_INTERNAL_QUEUE_H
+#include <stl/_queue.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::stack;
+using _STLP_STD::queue;
+using _STLP_STD::priority_queue;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa027)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STACK_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/tempbuf.h b/src/STLport/old_hp/tempbuf.h
new file mode 100644
index 0000000..a78d8f4
--- /dev/null
+++ b/src/STLport/old_hp/tempbuf.h
@@ -0,0 +1,79 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_TEMPBUF_H
+#define _STLP_TEMPBUF_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa028
+# include <stl/_prolog.h>
+# endif
+
+# ifndef _STLP_CLIMITS
+# include <climits>
+# endif
+
+#ifndef _STLP_CSTDDEF
+# include <cstddef>
+#endif
+
+#ifndef _STLP_CSTDLIB
+# include <cstdlib>
+#endif
+
+#if !defined (_STLP_NEW)
+# include <new>
+#endif
+
+#ifndef __TYPE_TRAITS_H
+#include <stl/type_traits.h>
+#endif
+
+#ifndef _STLP_PAIR_H
+#include <pair.h>
+#endif
+
+#ifndef _STLP_INTERNAL_TEMPBUF_H
+#include <stl/_tempbuf.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::get_temporary_buffer;
+using _STLP_STD::return_temporary_buffer;
+using _STLP_STD::temporary_buffer;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa028)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_TEMPBUF_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/tree.h b/src/STLport/old_hp/tree.h
new file mode 100644
index 0000000..8b6b813
--- /dev/null
+++ b/src/STLport/old_hp/tree.h
@@ -0,0 +1,60 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_TREE_H
+#define _STLP_TREE_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa030
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_ALGOBASE_H
+#include <algobase.h>
+#endif
+
+#ifndef _STLP_ALLOC_H
+#include <alloc.h>
+#endif
+
+#ifndef _STLP_INTERNAL_TREE_H
+#include <stl/_tree.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::rb_tree;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa030)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_TREE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/vector.h b/src/STLport/old_hp/vector.h
new file mode 100644
index 0000000..add0b6d
--- /dev/null
+++ b/src/STLport/old_hp/vector.h
@@ -0,0 +1,65 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_VECTOR_H
+#define _STLP_VECTOR_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0xa031
+# include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_ALGOBASE_H
+# include <algobase.h>
+#endif
+
+#ifndef _STLP_ALLOC_H
+# include <alloc.h>
+#endif
+
+# ifndef _STLP_RANGE_ERRORS_H
+# include <stl/_range_errors.h>
+# endif
+
+#ifndef _STLP_INTERNAL_VECTOR_H
+# include <stl/_vector.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::vector;
+using STLPORT::__vector__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa031)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_VECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/ostream b/src/STLport/ostream
new file mode 100644
index 0000000..627acbb
--- /dev/null
+++ b/src/STLport/ostream
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_OSTREAM
+#define _STLP_OSTREAM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1050
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+# include <stl/_ostream.h>
+
+# elif !defined(_STLP_USE_NO_IOSTREAMS)
+
+# include <wrap_std/ostream>
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1050)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_OSTREAM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/ostream.h b/src/STLport/ostream.h
new file mode 100644
index 0000000..6b3ca2b
--- /dev/null
+++ b/src/STLport/ostream.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_OSTREAM_H
+# define _STLP_OSTREAM_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x2051
+# include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+#ifdef __BORLANDC__
+# include <ostream.>
+#else
+# include <ostream>
+#endif
+
+# ifdef _STLP_USE_NAMESPACES
+# include <using/ostream>
+# endif
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(ostream.h)
+# if defined (_STLP_USE_NAMESPACES) && !defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+# include <using/h/ostream.h>
+_STLP_END_NAMESPACE
+# endif /* _STLP_USE_NAMESPACES */
+
+# endif /* _STLP_USE_NO_IOSTREAMS */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2051)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_OSTREAM_H */
+
diff --git a/src/STLport/pthread.h b/src/STLport/pthread.h
new file mode 100644
index 0000000..86a0695
--- /dev/null
+++ b/src/STLport/pthread.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x280
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x280) && ! defined (_STLP_DONT_POP_0x280)
+# define _STLP_DONT_POP_0x280
+# endif
+
+# if defined (__SUNPRO_CC) || defined (__HP_aCC)
+# include "/usr/include/pthread.h"
+# else
+# include _STLP_NATIVE_C_HEADER(pthread.h)
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x280)
+# if ! defined (_STLP_DONT_POP_0x280)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x280
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/pthread_alloc b/src/STLport/pthread_alloc
new file mode 100644
index 0000000..e9218f5
--- /dev/null
+++ b/src/STLport/pthread_alloc
@@ -0,0 +1,49 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_PTHREAD_ALLOC
+#define _STLP_PTHREAD_ALLOC
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x52
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# include <stl/_pthread_alloc.h>
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x52)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_PTHREAD_ALLOC */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/queue b/src/STLport/queue
new file mode 100644
index 0000000..45a8cc8
--- /dev/null
+++ b/src/STLport/queue
@@ -0,0 +1,55 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_QUEUE
+#define _STLP_QUEUE
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x53
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+#ifndef _STLP_INTERNAL_QUEUE_H
+# include <stl/_queue.h>
+#endif
+
+#ifndef _STLP_INTERNAL_FUNCTION_H
+# include <functional>
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x53)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_QUEUE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/rlocks.h b/src/STLport/rlocks.h
new file mode 100644
index 0000000..8f1fb5e
--- /dev/null
+++ b/src/STLport/rlocks.h
@@ -0,0 +1,11 @@
+#ifndef _STLP_misc_rlocks_h
+# define _STLP_misc_rlocks_h
+# if (__SUNPRO_CC >= 0x500 )
+# include <../CCios/rlocks.h>
+# elif defined (__SUNPRO_CC)
+# include <../CC/rlocks.h>
+# else
+# error "This file is for SUN CC only. Please remove it if it causes any harm for other compilers."
+# endif
+#endif
+
diff --git a/src/STLport/rope b/src/STLport/rope
new file mode 100644
index 0000000..c0bf103
--- /dev/null
+++ b/src/STLport/rope
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef _STLP_ROPE
+#define _STLP_ROPE
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x54
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# include <stl/_rope.h>
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x54)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ROPE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/set b/src/STLport/set
new file mode 100644
index 0000000..deef6fb
--- /dev/null
+++ b/src/STLport/set
@@ -0,0 +1,53 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_SET
+#define _STLP_SET
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x55
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+#include <stl/_set.h>
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(set)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x55)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_SET */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/setjmp.h b/src/STLport/setjmp.h
new file mode 100644
index 0000000..0e0f0a5
--- /dev/null
+++ b/src/STLport/setjmp.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x256
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x256) && ! defined (_STLP_DONT_POP_0x256)
+# define _STLP_DONT_POP_0x256
+# endif
+
+
+# ifndef setjmp
+# include _STLP_NATIVE_C_HEADER(setjmp.h)
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x256)
+# if ! defined (_STLP_DONT_POP_0x256)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x256
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/signal.h b/src/STLport/signal.h
new file mode 100644
index 0000000..14148a5
--- /dev/null
+++ b/src/STLport/signal.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x257
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x257) && ! defined (_STLP_DONT_POP_0x257)
+# define _STLP_DONT_POP_0x257
+# endif
+
+# include _STLP_NATIVE_C_HEADER(signal.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x257)
+# if ! defined (_STLP_DONT_POP_0x257)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x257
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/slist b/src/STLport/slist
new file mode 100644
index 0000000..b55be37
--- /dev/null
+++ b/src/STLport/slist
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef _STLP_SLIST
+#define _STLP_SLIST
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x58
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+#ifndef _STLP_INTERNAL_SLIST_H
+# include <stl/_slist.h>
+#endif
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(slist)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x58)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_SLIST */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/sstream b/src/STLport/sstream
new file mode 100644
index 0000000..b3df768
--- /dev/null
+++ b/src/STLport/sstream
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// This header defines classes basic_stringbuf, basic_istringstream,
+// basic_ostringstream, and basic_stringstream. These classes
+// represent streamsbufs and streams whose sources or destinations are
+// C++ strings.
+
+#ifndef _STLP_SSTREAM
+#define _STLP_SSTREAM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1059
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+# include <stl/_sstream.h>
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+# include <wrap_std/sstream>
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1059)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_SSTREAM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stack b/src/STLport/stack
new file mode 100644
index 0000000..8b6128d
--- /dev/null
+++ b/src/STLport/stack
@@ -0,0 +1,55 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STACK
+#define _STLP_STACK
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x60
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+#ifndef _STLP_INTERNAL_STACK_H
+#include <stl/_stack.h>
+#endif
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(stack)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x60)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STACK */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stdarg.h b/src/STLport/stdarg.h
new file mode 100644
index 0000000..b96922f
--- /dev/null
+++ b/src/STLport/stdarg.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x261
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x261) && ! defined (_STLP_DONT_POP_0x261)
+# define _STLP_DONT_POP_0x261
+# endif
+
+# include _STLP_NATIVE_C_HEADER(stdarg.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x261)
+# if ! defined (_STLP_DONT_POP_0x261)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x261
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stddef.h b/src/STLport/stddef.h
new file mode 100644
index 0000000..13773cd
--- /dev/null
+++ b/src/STLport/stddef.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x262
+# include <stl/_prolog.h>
+# endif
+
+# ifndef _STLP_WINCE
+
+# include _STLP_NATIVE_C_HEADER(stddef.h)
+
+# endif /* WINCE */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x262)
+# if ! defined (_STLP_DONT_POP_0x262)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x262
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stdexcept b/src/STLport/stdexcept
new file mode 100644
index 0000000..1829a9c
--- /dev/null
+++ b/src/STLport/stdexcept
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STDEXCEPT
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x63
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x63) && ! defined (_STLP_DONT_POP_0x63)
+# define _STLP_DONT_POP_0x63
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# if !defined(_STLP_STDEXCEPT_SEEN) && \
+ (!defined (_STLP_USE_NATIVE_STDEXCEPT) || defined (_STLP_USE_OWN_NAMESPACE))
+
+# define _STLP_STDEXCEPT_SEEN 1
+
+# include <exception>
+
+#if defined(_STLP_USE_EXCEPTIONS) || \
+ !(defined(_MIPS_SIM) && defined(_ABIO32) && _MIPS_SIM == _ABIO32)
+
+# include <cstring>
+
+#ifndef _STLP_INTERNAL_ALLOC_H
+# include <stl/_alloc.h>
+#endif
+
+#ifndef _STLP_STRING_FWD_H
+# include <stl/_string_fwd.h>
+#endif
+
+# define _STLP_OWN_STDEXCEPT 1
+
+_STLP_BEGIN_NAMESPACE
+
+# if ! defined (_STLP_NO_EXCEPTION_HEADER)
+# if !defined(_STLP_EXCEPTION_BASE) && !defined(_STLP_BROKEN_EXCEPTION_CLASS) && defined (_STLP_USE_NAMESPACES) && defined (_STLP_USE_OWN_NAMESPACE)
+using _STLP_VENDOR_EXCEPT_STD::exception;
+# endif
+# endif
+# define _STLP_EXCEPTION_BASE exception
+
+class _STLP_CLASS_DECLSPEC __Named_exception : public _STLP_EXCEPTION_BASE {
+public:
+ __Named_exception(const string& __str)
+# ifdef _STLP_OWN_IOSTREAMS
+ ;
+ const char* what() const _STLP_NOTHROW_INHERENTLY;
+ ~__Named_exception() _STLP_NOTHROW_INHERENTLY;
+# else
+ {
+ strncpy(_M_name, __get_c_string(__str), _S_bufsize);
+ _M_name[_S_bufsize - 1] = '\0';
+ }
+ const char* what() const _STLP_NOTHROW_INHERENTLY { return _M_name; }
+# endif
+
+private:
+ enum { _S_bufsize = 256 };
+ char _M_name[_S_bufsize];
+};
+
+class _STLP_CLASS_DECLSPEC logic_error : public __Named_exception {
+public:
+ logic_error(const string& __s) : __Named_exception(__s) {}
+# ifdef _STLP_OWN_IOSTREAMS
+ ~logic_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC runtime_error : public __Named_exception {
+public:
+ runtime_error(const string& __s) : __Named_exception(__s) {}
+# ifdef _STLP_OWN_IOSTREAMS
+ ~runtime_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC domain_error : public logic_error {
+public:
+ domain_error(const string& __arg) : logic_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+ ~domain_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC invalid_argument : public logic_error {
+public:
+ invalid_argument(const string& __arg) : logic_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+ ~invalid_argument() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC length_error : public logic_error {
+public:
+ length_error(const string& __arg) : logic_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+ ~length_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC out_of_range : public logic_error {
+public:
+ out_of_range(const string& __arg) : logic_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+ ~out_of_range() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC range_error : public runtime_error {
+public:
+ range_error(const string& __arg) : runtime_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+ ~range_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC overflow_error : public runtime_error {
+public:
+ overflow_error(const string& __arg) : runtime_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+ ~overflow_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC underflow_error : public runtime_error {
+public:
+ underflow_error(const string& __arg) : runtime_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+ ~underflow_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+_STLP_END_NAMESPACE
+
+#endif /* Not o32, and no exceptions */
+# endif /* _STLP_STDEXCEPT_SEEN */
+
+
+#if defined (_STLP_USE_NATIVE_STDEXCEPT)
+# include _STLP_NATIVE_HEADER(stdexcept)
+# endif
+
+# define _STLP_STDEXCEPT 1
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x63)
+# if ! defined (_STLP_DONT_POP_0x63)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x63
+# endif
+
+#endif /* _STLP_STDEXCEPT */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stdio.h b/src/STLport/stdio.h
new file mode 100644
index 0000000..4e8faba
--- /dev/null
+++ b/src/STLport/stdio.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x264
+# include <stl/_prolog.h>
+# endif
+
+# if ! defined (_STLP_WINCE)
+# include _STLP_NATIVE_C_HEADER(stdio.h)
+
+#if defined (__SUNPRO_CC) && !defined (_STRUCT_FILE)
+# define _STRUCT_FILE
+#endif
+
+# ifdef __MWERKS__
+# undef stdin
+# undef stdout
+# undef stderr
+
+# define stdin (&_STLP_VENDOR_CSTD::__files[0])
+# define stdout (&_STLP_VENDOR_CSTD::__files[1])
+# define stderr (&_STLP_VENDOR_CSTD::__files[2])
+# endif
+
+# endif /* WINCE */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x264)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stdio_streambuf b/src/STLport/stdio_streambuf
new file mode 100644
index 0000000..bd49264
--- /dev/null
+++ b/src/STLport/stdio_streambuf
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// This header is an extension. It defines two streambufs:
+// stdio_istreambuf, a read-only streambuf synchronized with a C stdio
+// FILE object, and stdio_ostreambuf, a write-only streambuf
+// synchronized with a C stdio FILE object. Note that neither
+// stdio_istreambuf nor stdio_ostreambuf is a template; both classes
+// are derived from basic_streambuf<char, char_traits<char> >.
+
+// Note: the imbue() member function is a no-op. In particular, these
+// classes assume that codecvt<char, char, mbstate_t> is always an identity
+// transformation. This is true of the default locale, and of all locales
+// defined for the C I/O library. If you need to use a locale where
+// the codecvt<char, char, mbstate_t> facet performs a nontrivial
+// conversion, then you should use basic_filebuf<> instead of stdio_istreambuf
+// or stdio_ostreambuf. (If you don't understand what any of this means,
+// then it's not a feature you need to worry about. Locales where
+// codecvt<char, char, mbstate_t> does something nontrivial are a rare
+// corner case.)
+
+
+#ifndef _STLP_STDIO_STREAMBUF
+#define _STLP_STDIO_STREAMBUF
+
+#if !defined(STLP_WINCE)
+
+#include <streambuf> // For basic_streambuf<>
+#include <cstdio> // For FILE.
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+// This is an extension. It is in namespace SGI, not namespace std
+namespace _SgI {
+
+# ifdef _STLP_USE_NAMESPACES
+using namespace _STLP_STD;
+ // MSVC needs this
+using _STLP_STD::streamsize;
+using _STLP_STD::streambuf;
+using _STLP_STD::basic_streambuf;
+using _STLP_STD::ios_base;
+ // using _STLP_STD::ios_base::openmode;
+# endif
+# endif
+
+// Base class for features common to stdio_istreambuf and stdio_ostreambuf
+class stdio_streambuf_base : public basic_streambuf<char, _STLP_STD::char_traits<char> >
+{
+public: // Constructor, destructor.
+ // The argument may not be null. It must be an open file pointer.
+ stdio_streambuf_base(FILE*);
+
+ // The destructor flushes the stream, but does not close it.
+ ~stdio_streambuf_base();
+
+protected: // Virtual functions from basic_streambuf.
+ streambuf* setbuf(char*, streamsize);
+
+ pos_type seekoff(off_type, ios_base::seekdir,
+ ios_base::openmode
+ = ios_base::in | ios_base::out);
+ pos_type seekpos(pos_type,
+ ios_base::openmode
+ = ios_base::in | ios_base::out);
+ int sync();
+
+protected:
+ FILE* _M_file;
+};
+
+class stdio_istreambuf : public stdio_streambuf_base
+{
+public: // Constructor, destructor.
+ stdio_istreambuf(FILE* __f) : stdio_streambuf_base(__f) {}
+
+ ~stdio_istreambuf();
+
+protected: // Virtual functions from basic_streambuf.
+ streamsize showmanyc();
+ int_type underflow();
+ int_type uflow();
+ virtual int_type pbackfail(int_type c = traits_type::eof());
+};
+
+class stdio_ostreambuf : public stdio_streambuf_base
+{
+public: // Constructor, destructor.
+ stdio_ostreambuf(FILE* __f) : stdio_streambuf_base(__f) {}
+ ~stdio_ostreambuf();
+
+protected: // Virtual functions from basic_streambuf.
+ streamsize showmanyc();
+ int_type overflow(int_type c = traits_type::eof());
+};
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+} // Close namespace _SgI.
+# endif
+
+#endif /* _STLP_STDIO_STREAMBUF */
+
+#endif /* _STLP_WINCE */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stdiostream.h b/src/STLport/stdiostream.h
new file mode 100644
index 0000000..80a5c67
--- /dev/null
+++ b/src/STLport/stdiostream.h
@@ -0,0 +1,10 @@
+#ifndef _STLP_misc_stdiostream_h
+# define _STLP_misc_stdiostream_h
+# if (__SUNPRO_CC >= 0x500 )
+# include <../CCios/stdiostream.h>
+# else if defined (__SUNPRO_CC)
+# include <../CC/stdiostream.h>
+# else
+# error "This file is for SUN CC only. Please remove it if it causes any harm for other compilers."
+# endif
+#endif
diff --git a/src/STLport/stdlib.h b/src/STLport/stdlib.h
new file mode 100644
index 0000000..537df7d
--- /dev/null
+++ b/src/STLport/stdlib.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x265
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x265) && ! defined (_STLP_DONT_POP_0x265)
+# define _STLP_DONT_POP_0x265
+# endif
+
+# include _STLP_NATIVE_C_HEADER(stdlib.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x265)
+# if ! defined (_STLP_DONT_POP_0x265)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x265
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_abbrevs.h b/src/STLport/stl/_abbrevs.h
new file mode 100644
index 0000000..57901ef
--- /dev/null
+++ b/src/STLport/stl/_abbrevs.h
@@ -0,0 +1,70 @@
+/*
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_ABBREVS_H
+# define _STLP_INTERNAL_ABBREVS_H
+
+// ugliness is intentional - to reduce conflicts
+# define input_iterator_tag _In__ItT
+# define output_iterator_tag _Ou__ItT
+# define bidirectional_iterator_tag _Bd__ItT
+# define random_access_iterator_tag _Ra__ItT
+# define input_iterator _In__It
+# define output_iterator _Ou__It
+# define bidirectional_iterator _Bd__It
+# define random_access_iterator _Ra__It
+# define reverse_bidirectional_iterator _rBd__It
+# define reverse_iterator _r__It
+# define back_insert_iterator _bI__It
+# define front_insert_iterator _fI__It
+# define raw_storage_iterator _rS__It
+# define _Const_traits _C_Tr
+# define _Nonconst_traits _N_Tr
+
+// ugliness is intentional - to reduce conflicts probability
+# define __malloc_alloc M__A
+# define __node_alloc D__A
+# define __new_alloc N__A
+# define __debug_alloc G__A
+
+# define __deque_iterator _dQ__It
+# define _Buf_traits _dQ__BTr
+# define _Deque_iterator _Dq__It
+
+# define _Select1st _S1st
+# define _Select2nd _S2nd
+
+# define _Hashtable_iterator _hT__It
+# define _Hashtable_const_iterator _hT__cIt
+# define _Hashtable_node _hT__N
+# define _Hashtable_base _hT__B
+# define _Ht_iterator _Ht_It
+
+# define __list_iterator _L__It
+# define __slist_iterator _SL__It
+
+# define _Rb_tree_node_base _rbT__NB
+# define _Rb_tree_node _rbT__N
+# define _Rb_base_iterator _rbTB__It
+# define _Rb_tree_base_iterator _rbT__It
+# define _Rb_tree_base _rbT__B
+
+#endif
+
diff --git a/src/STLport/stl/_algo.c b/src/STLport/stl/_algo.c
new file mode 100644
index 0000000..4e9aaf8
--- /dev/null
+++ b/src/STLport/stl/_algo.c
@@ -0,0 +1,1765 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ALGO_C
+# define _STLP_ALGO_C
+
+# if !defined (_STLP_INTERNAL_ALGO_H)
+# include <stl/_algo.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _BidirectionalIter, class _Distance, class _Compare>
+void __merge_without_buffer(_BidirectionalIter __first,
+ _BidirectionalIter __middle,
+ _BidirectionalIter __last,
+ _Distance __len1, _Distance __len2,
+ _Compare __comp);
+
+
+template <class _BidirectionalIter1, class _BidirectionalIter2,
+ class _BidirectionalIter3, class _Compare>
+_BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
+ _BidirectionalIter1 __last1,
+ _BidirectionalIter2 __first2,
+ _BidirectionalIter2 __last2,
+ _BidirectionalIter3 __result,
+ _Compare __comp);
+
+template <class _Tp>
+# if !(defined (__SUNPRO_CC) && (__SUNPRO_CC < 0x420 ))
+inline
+# endif
+const _Tp& __median(const _Tp& __a, const _Tp& __b, const _Tp& __c) {
+ if (__a < __b)
+ if (__b < __c)
+ return __b;
+ else if (__a < __c)
+ return __c;
+ else
+ return __a;
+ else if (__a < __c)
+ return __a;
+ else if (__b < __c)
+ return __c;
+ else
+ return __b;
+}
+
+template <class _Tp, class _Compare>
+# if !(defined (__SUNPRO_CC) && (__SUNPRO_CC < 0x420 ))
+inline
+# endif
+const _Tp&
+__median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp) {
+ if (__comp(__a, __b))
+ if (__comp(__b, __c))
+ return __b;
+ else if (__comp(__a, __c))
+ return __c;
+ else
+ return __a;
+ else if (__comp(__a, __c))
+ return __a;
+ else if (__comp(__b, __c))
+ return __c;
+ else
+ return __b;
+}
+
+template <class _ForwardIter1, class _ForwardIter2>
+_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
+ _ForwardIter2 __first2, _ForwardIter2 __last2)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ // Test for empty ranges
+ if (__first1 == __last1 || __first2 == __last2)
+ return __first1;
+
+ // Test for a pattern of length 1.
+ _ForwardIter2 __tmp(__first2);
+ ++__tmp;
+ if (__tmp == __last2)
+ return find(__first1, __last1, *__first2);
+
+ // General case.
+ _ForwardIter2 __p1 = __first2;
+ ++__p1;
+
+ _ForwardIter1 __current = __first1;
+
+ while (__first1 != __last1) {
+ __first1 = find(__first1, __last1, *__first2);
+ if (__first1 == __last1)
+ return __last1;
+
+ _ForwardIter2 __p = __p1;
+ __current = __first1;
+ if (++__current == __last1)
+ return __last1;
+
+ while (*__current == *__p) {
+ if (++__p == __last2)
+ return __first1;
+ if (++__current == __last1)
+ return __last1;
+ }
+
+ ++__first1;
+ }
+ return __first1;
+}
+
+// search_n. Search for __count consecutive copies of __val.
+
+template <class _ForwardIter, class _Integer, class _Tp>
+_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
+ _Integer __count, const _Tp& __val) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__count <= 0)
+ return __first;
+ else {
+ __first = find(__first, __last, __val);
+ while (__first != __last) {
+ _Integer __n = __count - 1;
+ _ForwardIter __i = __first;
+ ++__i;
+ while (__i != __last && __n != 0 && *__i == __val) {
+ ++__i;
+ --__n;
+ }
+ if (__n == 0)
+ return __first;
+ else
+ __first = find(__i, __last, __val);
+ }
+ return __last;
+ }
+}
+
+template <class _ForwardIter, class _Integer, class _Tp, class _BinaryPred>
+_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
+ _Integer __count, const _Tp& __val,
+ _BinaryPred __binary_pred) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__count <= 0)
+ return __first;
+ else {
+ while (__first != __last) {
+ if (__binary_pred(*__first, __val))
+ break;
+ ++__first;
+ }
+ while (__first != __last) {
+ _Integer __n = __count - 1;
+ _ForwardIter __i = __first;
+ ++__i;
+ while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {
+ ++__i;
+ --__n;
+ }
+ if (__n == 0)
+ return __first;
+ else {
+ while (__i != __last) {
+ if (__binary_pred(*__i, __val))
+ break;
+ ++__i;
+ }
+ __first = __i;
+ }
+ }
+ return __last;
+ }
+}
+
+template <class _ForwardIter1, class _ForwardIter2>
+_ForwardIter1
+find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
+ _ForwardIter2 __first2, _ForwardIter2 __last2)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ return __find_end(__first1, __last1, __first2, __last2,
+# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+ _STLP_ITERATOR_CATEGORY(__first1, _ForwardIter1),
+ _STLP_ITERATOR_CATEGORY(__first2, _ForwardIter2),
+# else
+ forward_iterator_tag(),
+ forward_iterator_tag(),
+# endif
+ __equal_to(_STLP_VALUE_TYPE(__first1, _ForwardIter1))
+ );
+}
+
+// unique and unique_copy
+template <class _InputIterator, class _OutputIterator, class _BinaryPredicate,
+ class _Tp>
+_STLP_INLINE_LOOP _OutputIterator
+__unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ _BinaryPredicate __binary_pred, _Tp*) {
+ _Tp __val = *__first;
+ *__result = __val;
+ while (++__first != __last)
+ if (!__binary_pred(__val, *__first)) {
+ __val = *__first;
+ *++__result = __val;
+ }
+ return ++__result;
+}
+
+template <class _InputIter, class _OutputIter, class _BinaryPredicate>
+inline _OutputIter
+__unique_copy(_InputIter __first, _InputIter __last,_OutputIter __result,
+ _BinaryPredicate __binary_pred, const output_iterator_tag &) {
+ return __unique_copy(__first, __last, __result, __binary_pred, _STLP_VALUE_TYPE(__first, _InputIter));
+}
+
+template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
+_STLP_INLINE_LOOP _ForwardIter
+__unique_copy(_InputIter __first, _InputIter __last, _ForwardIter __result,
+ _BinaryPredicate __binary_pred, const forward_iterator_tag &) {
+ *__result = *__first;
+ while (++__first != __last)
+ if (!__binary_pred(*__result, *__first)) *++__result = *__first;
+ return ++__result;
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
+template <class _InputIterator, class _BidirectionalIterator, class _BinaryPredicate>
+inline _BidirectionalIterator
+__unique_copy(_InputIterator __first, _InputIterator __last,
+ _BidirectionalIterator __result, _BinaryPredicate __binary_pred,
+ const bidirectional_iterator_tag &) {
+ return __unique_copy(__first, __last, __result, __binary_pred, forward_iterator_tag());
+}
+
+template <class _InputIterator, class _RandomAccessIterator, class _BinaryPredicate>
+inline _RandomAccessIterator
+__unique_copy(_InputIterator __first, _InputIterator __last,
+ _RandomAccessIterator __result, _BinaryPredicate __binary_pred,
+ const random_access_iterator_tag &) {
+ return __unique_copy(__first, __last, __result, __binary_pred, forward_iterator_tag());
+}
+# endif /* _STLP_NONTEMPL_BASE_MATCH_BUG */
+
+
+template <class _InputIter, class _OutputIter>
+_OutputIter
+unique_copy(_InputIter __first, _InputIter __last, _OutputIter __result) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last) return __result;
+ return __unique_copy(__first, __last, __result, __equal_to(_STLP_VALUE_TYPE(__first, _InputIter)),
+ _STLP_ITERATOR_CATEGORY(__result, _OutputIter));
+}
+
+template <class _InputIter, class _OutputIter, class _BinaryPredicate>
+_OutputIter
+unique_copy(_InputIter __first, _InputIter __last,_OutputIter __result,
+ _BinaryPredicate __binary_pred) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last) return __result;
+ return __unique_copy(__first, __last, __result, __binary_pred,
+ _STLP_ITERATOR_CATEGORY(__result, _OutputIter));
+}
+
+// rotate and rotate_copy, and their auxiliary functions
+
+template <class _ForwardIter, class _Distance>
+_ForwardIter __rotate(_ForwardIter __first,
+ _ForwardIter __middle,
+ _ForwardIter __last,
+ _Distance*,
+ const forward_iterator_tag &) {
+ if (__first == __middle)
+ return __last;
+ if (__last == __middle)
+ return __first;
+
+ _ForwardIter __first2 = __middle;
+ do {
+ swap(*__first++, *__first2++);
+ if (__first == __middle)
+ __middle = __first2;
+ } while (__first2 != __last);
+
+ _ForwardIter __new_middle = __first;
+
+ __first2 = __middle;
+
+ while (__first2 != __last) {
+ swap (*__first++, *__first2++);
+ if (__first == __middle)
+ __middle = __first2;
+ else if (__first2 == __last)
+ __first2 = __middle;
+ }
+
+ return __new_middle;
+}
+
+template <class _BidirectionalIter, class _Distance>
+_BidirectionalIter __rotate(_BidirectionalIter __first,
+ _BidirectionalIter __middle,
+ _BidirectionalIter __last,
+ _Distance*,
+ const bidirectional_iterator_tag &) {
+ if (__first == __middle)
+ return __last;
+ if (__last == __middle)
+ return __first;
+
+ __reverse(__first, __middle, bidirectional_iterator_tag());
+ __reverse(__middle, __last, bidirectional_iterator_tag());
+
+ while (__first != __middle && __middle != __last)
+ swap (*__first++, *--__last);
+
+ if (__first == __middle) {
+ __reverse(__middle, __last, bidirectional_iterator_tag());
+ return __last;
+ }
+ else {
+ __reverse(__first, __middle, bidirectional_iterator_tag());
+ return __first;
+ }
+}
+
+template <class _RandomAccessIter, class _Distance, class _Tp>
+_RandomAccessIter __rotate(_RandomAccessIter __first,
+ _RandomAccessIter __middle,
+ _RandomAccessIter __last,
+ _Distance *, _Tp *) {
+
+ _Distance __n = __last - __first;
+ _Distance __k = __middle - __first;
+ _Distance __l = __n - __k;
+ _RandomAccessIter __result = __first + (__last - __middle);
+
+ if (__k==0) /* __first == middle */
+ return __last;
+
+ if (__k == __l) {
+ swap_ranges(__first, __middle, __middle);
+ return __result;
+ }
+
+ _Distance __d = __gcd(__n, __k);
+
+ for (_Distance __i = 0; __i < __d; __i++) {
+ _Tp __tmp = *__first;
+ _RandomAccessIter __p = __first;
+
+ if (__k < __l) {
+ for (_Distance __j = 0; __j < __l/__d; __j++) {
+ if (__p > __first + __l) {
+ *__p = *(__p - __l);
+ __p -= __l;
+ }
+
+ *__p = *(__p + __k);
+ __p += __k;
+ }
+ }
+
+ else {
+ for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
+ if (__p < __last - __k) {
+ *__p = *(__p + __k);
+ __p += __k;
+ }
+
+ *__p = * (__p - __l);
+ __p -= __l;
+ }
+ }
+
+ *__p = __tmp;
+ ++__first;
+ }
+
+ return __result;
+}
+
+template <class _RandomAccessIter, class _Distance>
+inline _RandomAccessIter
+__rotate(_RandomAccessIter __first, _RandomAccessIter __middle, _RandomAccessIter __last,
+ _Distance * __dis, const random_access_iterator_tag &) {
+ return __rotate(__first, __middle, __last,
+ __dis, _STLP_VALUE_TYPE(__first, _RandomAccessIter));
+}
+
+template <class _ForwardIter>
+_ForwardIter
+rotate(_ForwardIter __first, _ForwardIter __middle, _ForwardIter __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __middle))
+ _STLP_DEBUG_CHECK(__check_range(__middle, __last))
+ return __rotate(__first, __middle, __last,
+ _STLP_DISTANCE_TYPE(__first, _ForwardIter),
+ _STLP_ITERATOR_CATEGORY(__first, _ForwardIter));
+}
+
+// Return a random number in the range [0, __n). This function encapsulates
+// whether we're using rand (part of the standard C library) or lrand48
+// (not standard, but a much better choice whenever it's available).
+
+template <class _Distance>
+inline _Distance __random_number(_Distance __n) {
+#ifdef _STLP_NO_DRAND48
+ return rand() % __n;
+#else
+ return lrand48() % __n;
+#endif
+}
+
+template <class _RandomAccessIter>
+void random_shuffle(_RandomAccessIter __first,
+ _RandomAccessIter __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last) return;
+ for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
+ iter_swap(__i, __first + __random_number((__i - __first) + 1));
+}
+
+template <class _RandomAccessIter, class _RandomNumberGenerator>
+void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
+ _RandomNumberGenerator& __rand) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last) return;
+ for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
+ iter_swap(__i, __first + __rand((__i - __first) + 1));
+}
+
+# ifndef _STLP_NO_EXTENSIONS
+
+// random_sample and random_sample_n (extensions, not part of the standard).
+
+template <class _ForwardIter, class _OutputIter, class _Distance>
+_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
+ _OutputIter __out, const _Distance __n)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ _Distance __remaining = distance(__first, __last);
+ _Distance __m = (min) (__n, __remaining);
+
+ while (__m > 0) {
+ if (__random_number(__remaining) < __m) {
+ *__out = *__first;
+ ++__out;
+ --__m;
+ }
+
+ --__remaining;
+ ++__first;
+ }
+ return __out;
+}
+
+
+template <class _ForwardIter, class _OutputIter, class _Distance,
+ class _RandomNumberGenerator>
+_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
+ _OutputIter __out, const _Distance __n,
+ _RandomNumberGenerator& __rand)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ _Distance __remaining = distance(__first, __last);
+ _Distance __m = (min) (__n, __remaining);
+
+ while (__m > 0) {
+ if (__rand(__remaining) < __m) {
+ *__out = *__first;
+ ++__out;
+ --__m;
+ }
+
+ --__remaining;
+ ++__first;
+ }
+ return __out;
+}
+
+template <class _InputIter, class _RandomAccessIter, class _Distance>
+_RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
+ _RandomAccessIter __out,
+ const _Distance __n)
+{
+ _Distance __m = 0;
+ _Distance __t = __n;
+ for ( ; __first != __last && __m < __n; ++__m, ++__first)
+ __out[__m] = *__first;
+
+ while (__first != __last) {
+ ++__t;
+ _Distance __M = __random_number(__t);
+ if (__M < __n)
+ __out[__M] = *__first;
+ ++__first;
+ }
+
+ return __out + __m;
+}
+
+template <class _InputIter, class _RandomAccessIter,
+ class _RandomNumberGenerator, class _Distance>
+_RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
+ _RandomAccessIter __out,
+ _RandomNumberGenerator& __rand,
+ const _Distance __n)
+{
+ _Distance __m = 0;
+ _Distance __t = __n;
+ for ( ; __first != __last && __m < __n; ++__m, ++__first)
+ __out[__m] = *__first;
+
+ while (__first != __last) {
+ ++__t;
+ _Distance __M = __rand(__t);
+ if (__M < __n)
+ __out[__M] = *__first;
+ ++__first;
+ }
+
+ return __out + __m;
+}
+
+template <class _InputIter, class _RandomAccessIter>
+_RandomAccessIter
+random_sample(_InputIter __first, _InputIter __last,
+ _RandomAccessIter __out_first, _RandomAccessIter __out_last)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ _STLP_DEBUG_CHECK(__check_range(__out_first, __out_last))
+ return __random_sample(__first, __last,
+ __out_first, __out_last - __out_first);
+}
+
+template <class _InputIter, class _RandomAccessIter, class _RandomNumberGenerator>
+_RandomAccessIter
+random_sample(_InputIter __first, _InputIter __last,
+ _RandomAccessIter __out_first, _RandomAccessIter __out_last,
+ _RandomNumberGenerator& __rand)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ _STLP_DEBUG_CHECK(__check_range(__out_first, __out_last))
+ return __random_sample(__first, __last,
+ __out_first, __rand,
+ __out_last - __out_first);
+}
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+// partition, stable_partition, and their auxiliary functions
+
+template <class _ForwardIter, class _Predicate>
+_STLP_INLINE_LOOP _ForwardIter __partition(_ForwardIter __first,
+ _ForwardIter __last,
+ _Predicate __pred,
+ const forward_iterator_tag &) {
+ if (__first == __last) return __first;
+
+ while (__pred(*__first))
+ if (++__first == __last) return __first;
+
+ _ForwardIter __next = __first;
+
+ while (++__next != __last)
+ if (__pred(*__next)) {
+ swap(*__first, *__next);
+ ++__first;
+ }
+ return __first;
+}
+
+template <class _BidirectionalIter, class _Predicate>
+_STLP_INLINE_LOOP _BidirectionalIter __partition(_BidirectionalIter __first,
+ _BidirectionalIter __last,
+ _Predicate __pred,
+ const bidirectional_iterator_tag &) {
+ while (true) {
+ while (true)
+ if (__first == __last)
+ return __first;
+ else if (__pred(*__first))
+ ++__first;
+ else
+ break;
+ --__last;
+ while (true)
+ if (__first == __last)
+ return __first;
+ else if (!__pred(*__last))
+ --__last;
+ else
+ break;
+ iter_swap(__first, __last);
+ ++__first;
+ }
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
+template <class _BidirectionalIter, class _Predicate>
+inline
+_BidirectionalIter __partition(_BidirectionalIter __first,
+ _BidirectionalIter __last,
+ _Predicate __pred,
+ const random_access_iterator_tag &) {
+ return __partition(__first, __last, __pred, bidirectional_iterator_tag());
+}
+# endif
+
+template <class _ForwardIter, class _Predicate>
+_ForwardIter partition(_ForwardIter __first, _ForwardIter __last, _Predicate __pred) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __partition(__first, __last, __pred, _STLP_ITERATOR_CATEGORY(__first, _ForwardIter));
+}
+
+
+template <class _ForwardIter, class _Predicate, class _Distance>
+_ForwardIter __inplace_stable_partition(_ForwardIter __first,
+ _ForwardIter __last,
+ _Predicate __pred, _Distance __len) {
+ if (__len == 1)
+ return __pred(*__first) ? __last : __first;
+ _ForwardIter __middle = __first;
+ advance(__middle, __len / 2);
+ return rotate(__inplace_stable_partition(__first, __middle, __pred,
+ __len / 2),
+ __middle,
+ __inplace_stable_partition(__middle, __last, __pred,
+ __len - __len / 2));
+}
+
+template <class _ForwardIter, class _Pointer, class _Predicate,
+ class _Distance>
+_ForwardIter __stable_partition_adaptive(_ForwardIter __first,
+ _ForwardIter __last,
+ _Predicate __pred, _Distance __len,
+ _Pointer __buffer,
+ _Distance __buffer_size)
+{
+ if (__len <= __buffer_size) {
+ _ForwardIter __result1 = __first;
+ _Pointer __result2 = __buffer;
+ for ( ; __first != __last ; ++__first)
+ if (__pred(*__first)) {
+ *__result1 = *__first;
+ ++__result1;
+ }
+ else {
+ *__result2 = *__first;
+ ++__result2;
+ }
+ copy(__buffer, __result2, __result1);
+ return __result1;
+ }
+ else {
+ _ForwardIter __middle = __first;
+ advance(__middle, __len / 2);
+ return rotate(__stable_partition_adaptive(
+ __first, __middle, __pred,
+ __len / 2, __buffer, __buffer_size),
+ __middle,
+ __stable_partition_adaptive(
+ __middle, __last, __pred,
+ __len - __len / 2, __buffer, __buffer_size));
+ }
+}
+
+template <class _ForwardIter, class _Predicate, class _Tp, class _Distance>
+inline _ForwardIter
+__stable_partition_aux(_ForwardIter __first, _ForwardIter __last,
+ _Predicate __pred, _Tp*, _Distance*)
+{
+ _Temporary_buffer<_ForwardIter, _Tp> __buf(__first, __last);
+ _STLP_MPWFIX_TRY //*TY 06/01/2000 - they forget to call dtor for _Temporary_buffer if no try/catch block is present
+ return (__buf.size() > 0) ?
+ __stable_partition_adaptive(__first, __last, __pred,
+ _Distance(__buf.requested_size()),
+ __buf.begin(), __buf.size()) :
+ __inplace_stable_partition(__first, __last, __pred,
+ _Distance(__buf.requested_size()));
+ _STLP_MPWFIX_CATCH //*TY 06/01/2000 - they forget to call dtor for _Temporary_buffer if no try/catch block is present
+}
+
+template <class _ForwardIter, class _Predicate>
+_ForwardIter
+stable_partition(_ForwardIter __first, _ForwardIter __last, _Predicate __pred) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last)
+ return __first;
+ else
+ return __stable_partition_aux(__first, __last, __pred,
+ _STLP_VALUE_TYPE(__first, _ForwardIter),
+ _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _RandomAccessIter, class _Tp, class _Compare>
+_RandomAccessIter __unguarded_partition(_RandomAccessIter __first,
+ _RandomAccessIter __last,
+ _Tp __pivot, _Compare __comp)
+{
+ while (true) {
+ while (__comp(*__first, __pivot))
+ ++__first;
+ --__last;
+ while (__comp(__pivot, *__last))
+ --__last;
+ if (!(__first < __last))
+ return __first;
+ iter_swap(__first, __last);
+ ++__first;
+ }
+}
+
+// sort() and its auxiliary functions.
+
+# define __stl_threshold 16
+
+template <class _RandomAccessIter, class _Tp, class _Compare>
+void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val,
+ _Compare __comp) {
+ _RandomAccessIter __next = __last;
+ --__next;
+ while (__comp(__val, *__next)) {
+ *__last = *__next;
+ __last = __next;
+ --__next;
+ }
+ *__last = __val;
+}
+
+template <class _RandomAccessIter, class _Tp, class _Compare>
+inline void __linear_insert(_RandomAccessIter __first,
+ _RandomAccessIter __last, _Tp __val, _Compare __comp) {
+ //*TY 12/26/1998 - added __val as a paramter
+ // _Tp __val = *__last; //*TY 12/26/1998 - __val supplied by caller
+ if (__comp(__val, *__first)) {
+ copy_backward(__first, __last, __last + 1);
+ *__first = __val;
+ }
+ else
+ __unguarded_linear_insert(__last, __val, __comp);
+}
+
+template <class _RandomAccessIter, class _Compare>
+void __insertion_sort(_RandomAccessIter __first,
+ _RandomAccessIter __last, _Compare __comp) {
+ if (__first == __last) return;
+ for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
+ __linear_insert(__first, __i, *__i, __comp); //*TY 12/26/1998 - supply *__i as __val
+}
+
+template <class _RandomAccessIter, class _Tp, class _Compare>
+void __unguarded_insertion_sort_aux(_RandomAccessIter __first,
+ _RandomAccessIter __last,
+ _Tp*, _Compare __comp) {
+ for (_RandomAccessIter __i = __first; __i != __last; ++__i)
+ __unguarded_linear_insert(__i, _Tp(*__i), __comp);
+}
+
+template <class _RandomAccessIter, class _Compare>
+inline void __unguarded_insertion_sort(_RandomAccessIter __first,
+ _RandomAccessIter __last,
+ _Compare __comp) {
+ __unguarded_insertion_sort_aux(__first, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter), __comp);
+}
+
+template <class _RandomAccessIter, class _Compare>
+void __final_insertion_sort(_RandomAccessIter __first,
+ _RandomAccessIter __last, _Compare __comp) {
+ if (__last - __first > __stl_threshold) {
+ __insertion_sort(__first, __first + __stl_threshold, __comp);
+ __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
+ }
+ else
+ __insertion_sort(__first, __last, __comp);
+}
+
+template <class _RandomAccessIter, class _Tp, class _Size, class _Compare>
+void __introsort_loop(_RandomAccessIter __first,
+ _RandomAccessIter __last, _Tp*,
+ _Size __depth_limit, _Compare __comp)
+{
+ while (__last - __first > __stl_threshold) {
+ if (__depth_limit == 0) {
+ partial_sort(__first, __last, __last, __comp);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIter __cut =
+ __unguarded_partition(__first, __last,
+ _Tp(__median(*__first,
+ *(__first + (__last - __first)/2),
+ *(__last - 1), __comp)),
+ __comp);
+ __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit, __comp);
+ __last = __cut;
+ }
+}
+
+template <class _RandomAccessIter>
+void sort(_RandomAccessIter __first, _RandomAccessIter __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first != __last) {
+ __introsort_loop(__first, __last,
+ _STLP_VALUE_TYPE(__first, _RandomAccessIter),
+ __lg(__last - __first) * 2, __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)) );
+ __final_insertion_sort(__first, __last, __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)));
+ }
+}
+
+template <class _RandomAccessIter, class _Compare>
+void sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first != __last) {
+ __introsort_loop(__first, __last,
+ _STLP_VALUE_TYPE(__first, _RandomAccessIter),
+ __lg(__last - __first) * 2,
+ __comp);
+ __final_insertion_sort(__first, __last, __comp);
+ }
+}
+
+// stable_sort() and its auxiliary functions.
+
+template <class _RandomAccessIter, class _Compare>
+void __inplace_stable_sort(_RandomAccessIter __first,
+ _RandomAccessIter __last, _Compare __comp) {
+ if (__last - __first < 15) {
+ __insertion_sort(__first, __last, __comp);
+ return;
+ }
+ _RandomAccessIter __middle = __first + (__last - __first) / 2;
+ __inplace_stable_sort(__first, __middle, __comp);
+ __inplace_stable_sort(__middle, __last, __comp);
+ __merge_without_buffer(__first, __middle, __last,
+ __middle - __first,
+ __last - __middle,
+ __comp);
+}
+
+template <class _RandomAccessIter1, class _RandomAccessIter2,
+ class _Distance, class _Compare>
+void __merge_sort_loop(_RandomAccessIter1 __first,
+ _RandomAccessIter1 __last,
+ _RandomAccessIter2 __result, _Distance __step_size,
+ _Compare __comp) {
+ _Distance __two_step = 2 * __step_size;
+
+ while (__last - __first >= __two_step) {
+ __result = merge(__first, __first + __step_size,
+ __first + __step_size, __first + __two_step,
+ __result,
+ __comp);
+ __first += __two_step;
+ }
+ __step_size = (min) (_Distance(__last - __first), __step_size);
+
+ merge(__first, __first + __step_size,
+ __first + __step_size, __last,
+ __result,
+ __comp);
+}
+
+const int __stl_chunk_size = 7;
+
+template <class _RandomAccessIter, class _Distance, class _Compare>
+void __chunk_insertion_sort(_RandomAccessIter __first,
+ _RandomAccessIter __last,
+ _Distance __chunk_size, _Compare __comp)
+{
+ while (__last - __first >= __chunk_size) {
+ __insertion_sort(__first, __first + __chunk_size, __comp);
+ __first += __chunk_size;
+ }
+ __insertion_sort(__first, __last, __comp);
+}
+
+template <class _RandomAccessIter, class _Pointer, class _Distance,
+ class _Compare>
+void __merge_sort_with_buffer(_RandomAccessIter __first,
+ _RandomAccessIter __last, _Pointer __buffer,
+ _Distance*, _Compare __comp) {
+ _Distance __len = __last - __first;
+ _Pointer __buffer_last = __buffer + __len;
+
+ _Distance __step_size = __stl_chunk_size;
+ __chunk_insertion_sort(__first, __last, __step_size, __comp);
+
+ while (__step_size < __len) {
+ __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);
+ __step_size *= 2;
+ __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);
+ __step_size *= 2;
+ }
+}
+
+template <class _BidirectionalIter1, class _BidirectionalIter2,
+ class _Distance>
+_BidirectionalIter1 __rotate_adaptive(_BidirectionalIter1 __first,
+ _BidirectionalIter1 __middle,
+ _BidirectionalIter1 __last,
+ _Distance __len1, _Distance __len2,
+ _BidirectionalIter2 __buffer,
+ _Distance __buffer_size) {
+ if (__len1 > __len2 && __len2 <= __buffer_size) {
+ _BidirectionalIter2 __buffer_end = copy(__middle, __last, __buffer);
+ copy_backward(__first, __middle, __last);
+ return copy(__buffer, __buffer_end, __first);
+ }
+ else if (__len1 <= __buffer_size) {
+ _BidirectionalIter2 __buffer_end = copy(__first, __middle, __buffer);
+ copy(__middle, __last, __first);
+ return copy_backward(__buffer, __buffer_end, __last);
+ }
+ else
+ return rotate(__first, __middle, __last);
+}
+
+template <class _BidirectionalIter, class _Distance, class _Pointer,
+ class _Compare>
+void __merge_adaptive(_BidirectionalIter __first,
+ _BidirectionalIter __middle,
+ _BidirectionalIter __last,
+ _Distance __len1, _Distance __len2,
+ _Pointer __buffer, _Distance __buffer_size,
+ _Compare __comp) {
+ if (__len1 <= __len2 && __len1 <= __buffer_size) {
+ _Pointer __buffer_end = copy(__first, __middle, __buffer);
+ merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
+ }
+ else if (__len2 <= __buffer_size) {
+ _Pointer __buffer_end = copy(__middle, __last, __buffer);
+ __merge_backward(__first, __middle, __buffer, __buffer_end, __last,
+ __comp);
+ }
+ else {
+ _BidirectionalIter __first_cut = __first;
+ _BidirectionalIter __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2) {
+ __len11 = __len1 / 2;
+ advance(__first_cut, __len11);
+ __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
+ __len22 += distance(__middle, __second_cut);
+ }
+ else {
+ __len22 = __len2 / 2;
+ advance(__second_cut, __len22);
+ __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
+ __len11 += distance(__first, __first_cut);
+ }
+ _BidirectionalIter __new_middle =
+ __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
+ __len22, __buffer, __buffer_size);
+ __merge_adaptive(__first, __first_cut, __new_middle, __len11,
+ __len22, __buffer, __buffer_size, __comp);
+ __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
+ __len2 - __len22, __buffer, __buffer_size, __comp);
+ }
+}
+
+template <class _RandomAccessIter, class _Pointer, class _Distance,
+ class _Compare>
+void __stable_sort_adaptive(_RandomAccessIter __first,
+ _RandomAccessIter __last, _Pointer __buffer,
+ _Distance __buffer_size, _Compare __comp) {
+ _Distance __len = (__last - __first + 1) / 2;
+ _RandomAccessIter __middle = __first + __len;
+ if (__len > __buffer_size) {
+ __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size,
+ __comp);
+ __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size,
+ __comp);
+ }
+ else {
+ __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0,
+ __comp);
+ __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0,
+ __comp);
+ }
+ __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
+ _Distance(__last - __middle), __buffer, __buffer_size,
+ __comp);
+}
+
+template <class _RandomAccessIter, class _Tp, class _Distance, class _Compare>
+void __stable_sort_aux(_RandomAccessIter __first,
+ _RandomAccessIter __last, _Tp*, _Distance*,
+ _Compare __comp) {
+ _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
+ if (buf.begin() == 0)
+ __inplace_stable_sort(__first, __last, __comp);
+ else
+ __stable_sort_adaptive(__first, __last, buf.begin(),
+ _Distance(buf.size()),
+ __comp);
+}
+
+template <class _RandomAccessIter>
+void stable_sort(_RandomAccessIter __first,
+ _RandomAccessIter __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ __stable_sort_aux(__first, __last,
+ _STLP_VALUE_TYPE(__first, _RandomAccessIter),
+ _STLP_DISTANCE_TYPE(__first, _RandomAccessIter),
+ __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)));
+}
+
+template <class _RandomAccessIter, class _Compare>
+void stable_sort(_RandomAccessIter __first,
+ _RandomAccessIter __last, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ __stable_sort_aux(__first, __last,
+ _STLP_VALUE_TYPE(__first, _RandomAccessIter),
+ _STLP_DISTANCE_TYPE(__first, _RandomAccessIter),
+ __comp);
+}
+
+// partial_sort, partial_sort_copy, and auxiliary functions.
+
+template <class _RandomAccessIter, class _Tp, class _Compare>
+void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
+ _RandomAccessIter __last, _Tp*, _Compare __comp) {
+ make_heap(__first, __middle, __comp);
+ for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
+ if (__comp(*__i, *__first))
+ __pop_heap(__first, __middle, __i, _Tp(*__i), __comp,
+ _STLP_DISTANCE_TYPE(__first, _RandomAccessIter));
+ sort_heap(__first, __middle, __comp);
+}
+
+
+template <class _RandomAccessIter>
+void
+partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle, _RandomAccessIter __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __middle))
+ _STLP_DEBUG_CHECK(__check_range(__middle, __last))
+ __partial_sort(__first, __middle, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter),
+ __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)));
+}
+
+template <class _RandomAccessIter, class _Compare>
+void partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle,
+ _RandomAccessIter __last, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __middle))
+ _STLP_DEBUG_CHECK(__check_range(__middle, __last))
+ __partial_sort(__first, __middle, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter), __comp);
+}
+
+template <class _InputIter, class _RandomAccessIter, class _Compare,
+ class _Distance, class _Tp>
+_RandomAccessIter __partial_sort_copy(_InputIter __first,
+ _InputIter __last,
+ _RandomAccessIter __result_first,
+ _RandomAccessIter __result_last,
+ _Compare __comp, _Distance*, _Tp*) {
+ if (__result_first == __result_last) return __result_last;
+ _RandomAccessIter __result_real_last = __result_first;
+ while(__first != __last && __result_real_last != __result_last) {
+ *__result_real_last = *__first;
+ ++__result_real_last;
+ ++__first;
+ }
+ make_heap(__result_first, __result_real_last, __comp);
+ while (__first != __last) {
+ if (__comp(*__first, *__result_first))
+ __adjust_heap(__result_first, _Distance(0),
+ _Distance(__result_real_last - __result_first),
+ _Tp(*__first),
+ __comp);
+ ++__first;
+ }
+ sort_heap(__result_first, __result_real_last, __comp);
+ return __result_real_last;
+}
+
+template <class _InputIter, class _RandomAccessIter>
+_RandomAccessIter
+partial_sort_copy(_InputIter __first, _InputIter __last,
+ _RandomAccessIter __result_first, _RandomAccessIter __result_last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ _STLP_DEBUG_CHECK(__check_range(__result_first, __result_last))
+ return __partial_sort_copy(__first, __last, __result_first, __result_last,
+ __less(_STLP_VALUE_TYPE(__first, _InputIter)),
+ _STLP_DISTANCE_TYPE(__result_first, _RandomAccessIter),
+ _STLP_VALUE_TYPE(__first, _InputIter));
+}
+
+template <class _InputIter, class _RandomAccessIter, class _Compare>
+_RandomAccessIter
+partial_sort_copy(_InputIter __first, _InputIter __last,
+ _RandomAccessIter __result_first,
+ _RandomAccessIter __result_last, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ _STLP_DEBUG_CHECK(__check_range(__result_first, __result_last))
+ return __partial_sort_copy(__first, __last, __result_first, __result_last,
+ __comp,
+ _STLP_DISTANCE_TYPE(__result_first, _RandomAccessIter),
+ _STLP_VALUE_TYPE(__first, _InputIter));
+}
+
+// nth_element() and its auxiliary functions.
+
+template <class _RandomAccessIter, class _Tp, class _Compare>
+void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
+ _RandomAccessIter __last, _Tp*, _Compare __comp) {
+ while (__last - __first > 3) {
+ _RandomAccessIter __cut =
+ __unguarded_partition(__first, __last,
+ _Tp(__median(*__first,
+ *(__first + (__last - __first)/2),
+ *(__last - 1),
+ __comp)),
+ __comp);
+ if (__cut <= __nth)
+ __first = __cut;
+ else
+ __last = __cut;
+ }
+ __insertion_sort(__first, __last, __comp);
+}
+
+
+template <class _RandomAccessIter>
+void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
+ _RandomAccessIter __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __nth))
+ _STLP_DEBUG_CHECK(__check_range(__nth, __last))
+ __nth_element(__first, __nth, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter),
+ __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)));
+}
+
+template <class _RandomAccessIter, class _Compare>
+void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
+ _RandomAccessIter __last, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __nth))
+ _STLP_DEBUG_CHECK(__check_range(__nth, __last))
+ __nth_element(__first, __nth, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter), __comp);
+}
+
+// Binary search (lower_bound, upper_bound, equal_range, binary_search).
+
+template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
+_ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __val, _Compare __comp, _Distance*)
+{
+ _Distance __len = distance(__first, __last);
+ _Distance __half;
+
+ while (__len > 0) {
+ __half = __len >> 1;
+ _ForwardIter __middle = __first;
+ advance(__middle, __half);
+ if (__comp(__val, *__middle))
+ __len = __half;
+ else {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ }
+ return __first;
+}
+
+template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
+pair<_ForwardIter, _ForwardIter>
+__equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
+ _Compare __comp, _Distance*)
+{
+ _Distance __len = distance(__first, __last);
+ _Distance __half;
+
+ while (__len > 0) {
+ __half = __len >> 1;
+ _ForwardIter __middle = __first;
+ advance(__middle, __half);
+ if (__comp(*__middle, __val)) {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else if (__comp(__val, *__middle))
+ __len = __half;
+ else {
+ _ForwardIter __left = lower_bound(__first, __middle, __val, __comp);
+ advance(__first, __len);
+ _ForwardIter __right = upper_bound(++__middle, __first, __val, __comp);
+ return pair<_ForwardIter, _ForwardIter>(__left, __right);
+ }
+ }
+ return pair<_ForwardIter, _ForwardIter>(__first, __first);
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ while (__first1 != __last1 && __first2 != __last2) {
+ if (*__first2 < *__first1) {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else {
+ *__result = *__first1;
+ ++__first1;
+ }
+ ++__result;
+ }
+ return copy(__first2, __last2, copy(__first1, __last1, __result));
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+ class _Compare>
+_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ while (__first1 != __last1 && __first2 != __last2) {
+ if (__comp(*__first2, *__first1)) {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else {
+ *__result = *__first1;
+ ++__first1;
+ }
+ ++__result;
+ }
+ return copy(__first2, __last2, copy(__first1, __last1, __result));
+}
+
+template <class _BidirectionalIter, class _Distance, class _Compare>
+void __merge_without_buffer(_BidirectionalIter __first,
+ _BidirectionalIter __middle,
+ _BidirectionalIter __last,
+ _Distance __len1, _Distance __len2,
+ _Compare __comp) {
+ if (__len1 == 0 || __len2 == 0)
+ return;
+ if (__len1 + __len2 == 2) {
+ if (__comp(*__middle, *__first))
+ iter_swap(__first, __middle);
+ return;
+ }
+ _BidirectionalIter __first_cut = __first;
+ _BidirectionalIter __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2) {
+ __len11 = __len1 / 2;
+ advance(__first_cut, __len11);
+ __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
+ __len22 += distance(__middle, __second_cut);
+ }
+ else {
+ __len22 = __len2 / 2;
+ advance(__second_cut, __len22);
+ __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
+ __len11 +=distance(__first, __first_cut);
+ }
+ _BidirectionalIter __new_middle
+ = rotate(__first_cut, __middle, __second_cut);
+ __merge_without_buffer(__first, __first_cut, __new_middle, __len11, __len22,
+ __comp);
+ __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
+ __len2 - __len22, __comp);
+}
+
+template <class _BidirectionalIter1, class _BidirectionalIter2,
+ class _BidirectionalIter3, class _Compare>
+_BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
+ _BidirectionalIter1 __last1,
+ _BidirectionalIter2 __first2,
+ _BidirectionalIter2 __last2,
+ _BidirectionalIter3 __result,
+ _Compare __comp) {
+ if (__first1 == __last1)
+ return copy_backward(__first2, __last2, __result);
+ if (__first2 == __last2)
+ return copy_backward(__first1, __last1, __result);
+ --__last1;
+ --__last2;
+ while (true) {
+ if (__comp(*__last2, *__last1)) {
+ *--__result = *__last1;
+ if (__first1 == __last1)
+ return copy_backward(__first2, ++__last2, __result);
+ --__last1;
+ }
+ else {
+ *--__result = *__last2;
+ if (__first2 == __last2)
+ return copy_backward(__first1, ++__last1, __result);
+ --__last2;
+ }
+ }
+}
+
+template <class _BidirectionalIter, class _Tp,
+ class _Distance, class _Compare>
+inline void __inplace_merge_aux(_BidirectionalIter __first,
+ _BidirectionalIter __middle,
+ _BidirectionalIter __last, _Tp*, _Distance*,
+ _Compare __comp) {
+ _Distance __len1 = distance(__first, __middle);
+ _Distance __len2 = distance(__middle, __last);
+
+ _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);
+ if (__buf.begin() == 0)
+ __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);
+ else
+ __merge_adaptive(__first, __middle, __last, __len1, __len2,
+ __buf.begin(), _Distance(__buf.size()),
+ __comp);
+}
+
+template <class _BidirectionalIter>
+void inplace_merge(_BidirectionalIter __first,
+ _BidirectionalIter __middle,
+ _BidirectionalIter __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __middle))
+ _STLP_DEBUG_CHECK(__check_range(__middle, __last))
+ if (__first == __middle || __middle == __last)
+ return;
+ __inplace_merge_aux(__first, __middle, __last,
+ _STLP_VALUE_TYPE(__first, _BidirectionalIter), _STLP_DISTANCE_TYPE(__first, _BidirectionalIter),
+ __less(_STLP_VALUE_TYPE(__first, _BidirectionalIter)));
+}
+
+template <class _BidirectionalIter, class _Compare>
+void inplace_merge(_BidirectionalIter __first,
+ _BidirectionalIter __middle,
+ _BidirectionalIter __last, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __middle))
+ _STLP_DEBUG_CHECK(__check_range(__middle, __last))
+ if (__first == __middle || __middle == __last)
+ return;
+ __inplace_merge_aux(__first, __middle, __last,
+ _STLP_VALUE_TYPE(__first, _BidirectionalIter), _STLP_DISTANCE_TYPE(__first, _BidirectionalIter),
+ __comp);
+}
+
+
+template <class _InputIter1, class _InputIter2, class _Compare>
+bool __includes(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first2, *__first1))
+ return false;
+ else if(__comp(*__first1, *__first2))
+ ++__first1;
+ else
+ ++__first1, ++__first2;
+
+ return __first2 == __last2;
+}
+
+template <class _InputIter1, class _InputIter2, class _Compare>
+bool includes(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2, _Compare __comp) {
+ return __includes(__first1, __last1, __first2, __last2, __comp);
+}
+
+template <class _InputIter1, class _InputIter2>
+bool includes(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2) {
+ return __includes(__first1, __last1, __first2, __last2, __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+ class _Compare>
+_OutputIter __set_union(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ while (__first1 != __last1 && __first2 != __last2) {
+ if (__comp(*__first1, *__first2)) {
+ *__result = *__first1;
+ ++__first1;
+ }
+ else if (__comp(*__first2, *__first1)) {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ }
+ ++__result;
+ }
+ return copy(__first2, __last2, copy(__first1, __last1, __result));
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result) {
+ return __set_union(__first1, __last1, __first2, __last2, __result, __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+ class _Compare>
+_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result, _Compare __comp) {
+ return __set_union(__first1, __last1, __first2, __last2, __result, __comp);
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+ class _Compare>
+_OutputIter __set_intersection(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first1, *__first2))
+ ++__first1;
+ else if (__comp(*__first2, *__first1))
+ ++__first2;
+ else {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ ++__result;
+ }
+ return __result;
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result) {
+ return __set_intersection(__first1, __last1, __first2, __last2, __result, __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+ class _Compare>
+_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result, _Compare __comp) {
+ return __set_intersection(__first1, __last1, __first2, __last2, __result, __comp);
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+ class _Compare>
+_OutputIter __set_difference(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first1, *__first2)) {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (__comp(*__first2, *__first1))
+ ++__first2;
+ else {
+ ++__first1;
+ ++__first2;
+ }
+ return copy(__first1, __last1, __result);
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result) {
+ return __set_difference(__first1, __last1, __first2, __last2, __result,
+ __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+ class _Compare>
+_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result, _Compare __comp) {
+ return __set_difference(__first1, __last1, __first2, __last2, __result, __comp);
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter, class _Compare>
+_OutputIter
+__set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first1, *__first2)) {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (__comp(*__first2, *__first1)) {
+ *__result = *__first2;
+ ++__first2;
+ ++__result;
+ }
+ else {
+ ++__first1;
+ ++__first2;
+ }
+ return copy(__first2, __last2, copy(__first1, __last1, __result));
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter
+set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result) {
+ return __set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
+ __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter, class _Compare>
+_OutputIter
+set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result,
+ _Compare __comp) {
+ return __set_symmetric_difference(__first1, __last1, __first2, __last2, __result, __comp);
+}
+
+// min_element and max_element, with and without an explicitly supplied
+// comparison function.
+
+template <class _ForwardIter, class _Compare>
+_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
+ _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last) return __first;
+ _ForwardIter __result = __first;
+ while (++__first != __last)
+ if (__comp(*__result, *__first)) __result = __first;
+ return __result;
+}
+
+template <class _ForwardIter>
+_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last) return __first;
+ _ForwardIter __result = __first;
+ while (++__first != __last)
+ if (*__result < *__first)
+ __result = __first;
+ return __result;
+}
+
+template <class _ForwardIter>
+_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last) return __first;
+ _ForwardIter __result = __first;
+ while (++__first != __last)
+ if (*__first < *__result)
+ __result = __first;
+ return __result;
+}
+
+template <class _ForwardIter, class _Compare>
+_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
+ _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last) return __first;
+ _ForwardIter __result = __first;
+ while (++__first != __last)
+ if (__comp(*__first, *__result)) __result = __first;
+ return __result;
+}
+
+// next_permutation and prev_permutation, with and without an explicitly
+// supplied comparison function.
+template <class _BidirectionalIter, class _Compare>
+bool __next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
+ _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last)
+ return false;
+ _BidirectionalIter __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+
+ for(;;) {
+ _BidirectionalIter __ii = __i;
+ --__i;
+ if (__comp(*__i, *__ii)) {
+ _BidirectionalIter __j = __last;
+ while (!__comp(*__i, *--__j))
+ {}
+ iter_swap(__i, __j);
+ reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first) {
+ reverse(__first, __last);
+ return false;
+ }
+ }
+#if defined(_STLP_NEED_UNREACHABLE_RETURN)
+ return 0;
+#endif
+}
+
+template <class _BidirectionalIter>
+bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __next_permutation(__first, __last, __less(_STLP_VALUE_TYPE(__first, _BidirectionalIter)));
+}
+
+template <class _BidirectionalIter, class _Compare>
+bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
+ _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __next_permutation(__first, __last, __comp);
+}
+
+template <class _BidirectionalIter, class _Compare>
+bool __prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
+ _Compare __comp) {
+ if (__first == __last)
+ return false;
+ _BidirectionalIter __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+
+ for(;;) {
+ _BidirectionalIter __ii = __i;
+ --__i;
+ if (__comp(*__ii, *__i)) {
+ _BidirectionalIter __j = __last;
+ while (!__comp(*--__j, *__i))
+ {}
+ iter_swap(__i, __j);
+ reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first) {
+ reverse(__first, __last);
+ return false;
+ }
+ }
+#if defined(_STLP_NEED_UNREACHABLE_RETURN)
+ return 0;
+#endif
+}
+
+template <class _BidirectionalIter>
+bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __prev_permutation(__first, __last, __less(_STLP_VALUE_TYPE(__first, _BidirectionalIter)));
+}
+
+template <class _BidirectionalIter, class _Compare>
+bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
+ _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __prev_permutation(__first, __last, __comp);
+}
+
+# ifndef _STLP_NO_EXTENSIONS
+
+// is_heap, a predicate testing whether or not a range is
+// a heap. This function is an extension, not part of the C++
+// standard.
+
+
+template <class _RandomAccessIter, class _Distance, class _StrictWeakOrdering>
+bool __is_heap(_RandomAccessIter __first, _StrictWeakOrdering __comp,
+ _Distance __n)
+{
+ _Distance __parent = 0;
+ for (_Distance __child = 1; __child < __n; ++__child) {
+ if (__comp(__first[__parent], __first[__child]))
+ return false;
+ if ((__child & 1) == 0)
+ ++__parent;
+ }
+ return true;
+}
+
+template <class _RandomAccessIter>
+bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __is_heap(__first, __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)), __last - __first);
+}
+
+template <class _RandomAccessIter, class _StrictWeakOrdering>
+bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
+ _StrictWeakOrdering __comp)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __is_heap(__first, __comp, __last - __first);
+}
+
+
+template <class _ForwardIter, class _StrictWeakOrdering>
+bool __is_sorted(_ForwardIter __first, _ForwardIter __last,
+ _StrictWeakOrdering __comp)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last)
+ return true;
+
+ _ForwardIter __next = __first;
+ for (++__next; __next != __last; __first = __next, ++__next) {
+ if (__comp(*__next, *__first))
+ return false;
+ }
+
+ return true;
+}
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+_STLP_END_NAMESPACE
+
+# undef __stl_threshold
+
+#endif /* _STLP_ALGO_C */
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_algo.h b/src/STLport/stl/_algo.h
new file mode 100644
index 0000000..c6e07cf
--- /dev/null
+++ b/src/STLport/stl/_algo.h
@@ -0,0 +1,740 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_ALGO_H
+#define _STLP_INTERNAL_ALGO_H
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_TEMPBUF_H
+# include <stl/_tempbuf.h>
+# endif
+
+# ifndef _STLP_INTERNAL_HEAP_H
+# include <stl/_heap.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_FUNCTION_BASE_H
+# include <stl/_function_base.h>
+# endif
+
+# ifdef __SUNPRO_CC
+// remove() conflict
+# include <cstdio>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+// for_each. Apply a function to every element of a range.
+template <class _InputIter, class _Function>
+_STLP_INLINE_LOOP _Function
+for_each(_InputIter __first, _InputIter __last, _Function __f) {
+ for ( ; __first != __last; ++__first)
+ __f(*__first);
+ return __f;
+}
+
+// count_if
+template <class _InputIter, class _Predicate>
+_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_InputIter)
+count_if(_InputIter __first, _InputIter __last, _Predicate __pred) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+_STLP_DIFFERENCE_TYPE(_InputIter) __n = 0;
+ for ( ; __first != __last; ++__first)
+ if (__pred(*__first))
+ ++__n;
+ return __n;
+}
+
+// adjacent_find.
+
+template <class _ForwardIter, class _BinaryPredicate>
+_STLP_INLINE_LOOP _ForwardIter
+adjacent_find(_ForwardIter __first, _ForwardIter __last,
+ _BinaryPredicate __binary_pred) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last)
+ return __last;
+ _ForwardIter __next = __first;
+ while(++__next != __last) {
+ if (__binary_pred(*__first, *__next))
+ return __first;
+ __first = __next;
+ }
+ return __last;
+}
+
+template <class _ForwardIter>
+_STLP_INLINE_LOOP _ForwardIter
+adjacent_find(_ForwardIter __first, _ForwardIter __last) {
+ return adjacent_find(__first, __last,
+ __equal_to(_STLP_VALUE_TYPE(__first, _ForwardIter)));
+}
+
+# ifndef _STLP_NO_ANACHRONISMS
+template <class _InputIter, class _Tp, class _Size>
+_STLP_INLINE_LOOP void
+count(_InputIter __first, _InputIter __last, const _Tp& __val, _Size& __n) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first)
+ if (*__first == __val)
+ ++__n;
+}
+
+template <class _InputIter, class _Predicate, class _Size>
+_STLP_INLINE_LOOP void
+count_if(_InputIter __first, _InputIter __last, _Predicate __pred, _Size& __n) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first)
+ if (__pred(*__first))
+ ++__n;
+}
+# endif
+
+template <class _ForwardIter1, class _ForwardIter2>
+_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
+ _ForwardIter2 __first2, _ForwardIter2 __last2);
+
+// search_n. Search for __count consecutive copies of __val.
+template <class _ForwardIter, class _Integer, class _Tp>
+_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
+ _Integer __count, const _Tp& __val);
+template <class _ForwardIter, class _Integer, class _Tp, class _BinaryPred>
+_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
+ _Integer __count, const _Tp& __val, _BinaryPred __binary_pred);
+
+template <class _InputIter, class _ForwardIter>
+inline _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
+ _ForwardIter __first2, _ForwardIter __last2) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ return __find_first_of(__first1, __last1, __first2, __last2,__equal_to(_STLP_VALUE_TYPE(__first1, _InputIter)));
+}
+
+template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
+inline _InputIter
+find_first_of(_InputIter __first1, _InputIter __last1,
+ _ForwardIter __first2, _ForwardIter __last2,_BinaryPredicate __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ return __find_first_of(__first1, __last1, __first2, __last2,__comp);
+}
+
+template <class _ForwardIter1, class _ForwardIter2>
+_ForwardIter1
+find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
+ _ForwardIter2 __first2, _ForwardIter2 __last2);
+
+// swap_ranges
+template <class _ForwardIter1, class _ForwardIter2>
+_STLP_INLINE_LOOP _ForwardIter2
+swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1, _ForwardIter2 __first2) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ for ( ; __first1 != __last1; ++__first1, ++__first2)
+ iter_swap(__first1, __first2);
+ return __first2;
+}
+
+// transform
+template <class _InputIter, class _OutputIter, class _UnaryOperation>
+_STLP_INLINE_LOOP _OutputIter
+transform(_InputIter __first, _InputIter __last, _OutputIter __result, _UnaryOperation __opr) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first, ++__result)
+ *__result = __opr(*__first);
+ return __result;
+}
+template <class _InputIter1, class _InputIter2, class _OutputIter, class _BinaryOperation>
+_STLP_INLINE_LOOP _OutputIter
+transform(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _OutputIter __result,_BinaryOperation __binary_op) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
+ *__result = __binary_op(*__first1, *__first2);
+ return __result;
+}
+
+// replace_if, replace_copy, replace_copy_if
+
+template <class _ForwardIter, class _Predicate, class _Tp>
+_STLP_INLINE_LOOP void
+replace_if(_ForwardIter __first, _ForwardIter __last, _Predicate __pred, const _Tp& __new_value) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first)
+ if (__pred(*__first))
+ *__first = __new_value;
+}
+
+template <class _InputIter, class _OutputIter, class _Tp>
+_STLP_INLINE_LOOP _OutputIter
+replace_copy(_InputIter __first, _InputIter __last,_OutputIter __result,
+ const _Tp& __old_value, const _Tp& __new_value) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first, ++__result)
+ *__result = *__first == __old_value ? __new_value : *__first;
+ return __result;
+}
+
+template <class _Iterator, class _OutputIter, class _Predicate, class _Tp>
+_STLP_INLINE_LOOP _OutputIter
+replace_copy_if(_Iterator __first, _Iterator __last,
+ _OutputIter __result,
+ _Predicate __pred, const _Tp& __new_value) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first, ++__result)
+ *__result = __pred(*__first) ? __new_value : *__first;
+ return __result;
+}
+
+// generate and generate_n
+
+template <class _ForwardIter, class _Generator>
+_STLP_INLINE_LOOP void
+generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first)
+ *__first = __gen();
+}
+
+template <class _OutputIter, class _Size, class _Generator>
+_STLP_INLINE_LOOP _OutputIter
+generate_n(_OutputIter __first, _Size __n, _Generator __gen) {
+ for ( ; __n > 0; --__n, ++__first)
+ *__first = __gen();
+ return __first;
+}
+
+// remove, remove_if, remove_copy, remove_copy_if
+
+template <class _InputIter, class _OutputIter, class _Tp>
+_STLP_INLINE_LOOP _OutputIter
+remove_copy(_InputIter __first, _InputIter __last,_OutputIter __result, const _Tp& __val) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first)
+ if (!(*__first == __val)) {
+ *__result = *__first;
+ ++__result;
+ }
+ return __result;
+}
+
+template <class _InputIter, class _OutputIter, class _Predicate>
+_STLP_INLINE_LOOP _OutputIter
+remove_copy_if(_InputIter __first, _InputIter __last, _OutputIter __result, _Predicate __pred) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first)
+ if (!__pred(*__first)) {
+ *__result = *__first;
+ ++__result;
+ }
+ return __result;
+}
+
+template <class _ForwardIter, class _Tp>
+_STLP_INLINE_LOOP _ForwardIter
+remove(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ __first = find(__first, __last, __val);
+ if (__first == __last)
+ return __first;
+ else {
+ _ForwardIter __next = __first;
+ return remove_copy(++__next, __last, __first, __val);
+ }
+}
+
+template <class _ForwardIter, class _Predicate>
+_STLP_INLINE_LOOP _ForwardIter
+remove_if(_ForwardIter __first, _ForwardIter __last, _Predicate __pred) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ __first = find_if(__first, __last, __pred);
+ if ( __first == __last )
+ return __first;
+ else {
+ _ForwardIter __next = __first;
+ return remove_copy_if(++__next, __last, __first, __pred);
+ }
+}
+
+// unique and unique_copy
+template <class _InputIter, class _OutputIter>
+_OutputIter unique_copy(_InputIter __first, _InputIter __last, _OutputIter __result);
+
+template <class _InputIter, class _OutputIter, class _BinaryPredicate>
+_OutputIter unique_copy(_InputIter __first, _InputIter __last,_OutputIter __result,
+ _BinaryPredicate __binary_pred);
+
+template <class _ForwardIter>
+inline _ForwardIter unique(_ForwardIter __first, _ForwardIter __last) {
+ __first = adjacent_find(__first, __last);
+ return unique_copy(__first, __last, __first);
+}
+
+template <class _ForwardIter, class _BinaryPredicate>
+inline _ForwardIter unique(_ForwardIter __first, _ForwardIter __last,
+ _BinaryPredicate __binary_pred) {
+ __first = adjacent_find(__first, __last, __binary_pred);
+ return unique_copy(__first, __last, __first, __binary_pred);
+}
+
+// reverse and reverse_copy, and their auxiliary functions
+
+template <class _BidirectionalIter>
+_STLP_INLINE_LOOP void
+__reverse(_BidirectionalIter __first, _BidirectionalIter __last, const bidirectional_iterator_tag &) {
+ for(; __first != __last && __first != --__last; ++__first)
+ iter_swap(__first,__last);
+}
+
+
+template <class _RandomAccessIter>
+_STLP_INLINE_LOOP void
+__reverse(_RandomAccessIter __first, _RandomAccessIter __last, const random_access_iterator_tag &) {
+ for (; __first < __last; ++__first) iter_swap(__first, --__last);
+}
+
+template <class _BidirectionalIter>
+inline void
+reverse(_BidirectionalIter __first, _BidirectionalIter __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ __reverse(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _BidirectionalIter));
+}
+
+template <class _BidirectionalIter, class _OutputIter>
+_STLP_INLINE_LOOP
+_OutputIter reverse_copy(_BidirectionalIter __first,
+ _BidirectionalIter __last,
+ _OutputIter __result) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ while (__first != __last) {
+ --__last;
+ *__result = *__last;
+ ++__result;
+ }
+ return __result;
+}
+
+// rotate and rotate_copy, and their auxiliary functions
+
+template <class _EuclideanRingElement>
+_STLP_INLINE_LOOP
+_EuclideanRingElement __gcd(_EuclideanRingElement __m,
+ _EuclideanRingElement __n)
+{
+ while (__n != 0) {
+ _EuclideanRingElement __t = __m % __n;
+ __m = __n;
+ __n = __t;
+ }
+ return __m;
+}
+
+template <class _ForwardIter>
+_ForwardIter
+rotate(_ForwardIter __first, _ForwardIter __middle, _ForwardIter __last);
+
+template <class _ForwardIter, class _OutputIter>
+inline _OutputIter rotate_copy(_ForwardIter __first, _ForwardIter __middle,
+ _ForwardIter __last, _OutputIter __result) {
+ return copy(__first, __middle, copy(__middle, __last, __result));
+}
+
+// random_shuffle
+
+template <class _RandomAccessIter>
+void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last);
+
+template <class _RandomAccessIter, class _RandomNumberGenerator>
+void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
+ _RandomNumberGenerator& __rand);
+
+# ifndef _STLP_NO_EXTENSIONS
+// random_sample and random_sample_n (extensions, not part of the standard).
+
+template <class _ForwardIter, class _OutputIter, class _Distance>
+_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
+ _OutputIter __out, const _Distance __n);
+
+template <class _ForwardIter, class _OutputIter, class _Distance,
+ class _RandomNumberGenerator>
+_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
+ _OutputIter __out, const _Distance __n,
+ _RandomNumberGenerator& __rand);
+
+template <class _InputIter, class _RandomAccessIter>
+_RandomAccessIter
+random_sample(_InputIter __first, _InputIter __last,
+ _RandomAccessIter __out_first, _RandomAccessIter __out_last);
+
+template <class _InputIter, class _RandomAccessIter,
+ class _RandomNumberGenerator>
+_RandomAccessIter
+random_sample(_InputIter __first, _InputIter __last,
+ _RandomAccessIter __out_first, _RandomAccessIter __out_last,
+ _RandomNumberGenerator& __rand);
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+// partition, stable_partition, and their auxiliary functions
+
+template <class _ForwardIter, class _Predicate>
+_ForwardIter partition(_ForwardIter __first, _ForwardIter __last, _Predicate __pred);
+
+
+template <class _ForwardIter, class _Predicate>
+_ForwardIter
+stable_partition(_ForwardIter __first, _ForwardIter __last, _Predicate __pred);
+
+// sort() and its auxiliary functions.
+
+template <class _Size>
+inline _Size __lg(_Size __n) {
+ _Size __k;
+ for (__k = 0; __n != 1; __n >>= 1) ++__k;
+ return __k;
+}
+
+template <class _RandomAccessIter>
+void sort(_RandomAccessIter __first, _RandomAccessIter __last);
+template <class _RandomAccessIter, class _Compare>
+void sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp);
+
+// stable_sort() and its auxiliary functions.
+template <class _RandomAccessIter>
+void stable_sort(_RandomAccessIter __first,
+ _RandomAccessIter __last);
+
+template <class _RandomAccessIter, class _Compare>
+void stable_sort(_RandomAccessIter __first,
+ _RandomAccessIter __last, _Compare __comp);
+
+// partial_sort, partial_sort_copy, and auxiliary functions.
+
+template <class _RandomAccessIter>
+void
+partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle, _RandomAccessIter __last);
+
+template <class _RandomAccessIter, class _Compare>
+void
+partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle,
+ _RandomAccessIter __last, _Compare __comp);
+
+template <class _InputIter, class _RandomAccessIter>
+_RandomAccessIter
+partial_sort_copy(_InputIter __first, _InputIter __last,
+ _RandomAccessIter __result_first, _RandomAccessIter __result_last);
+
+template <class _InputIter, class _RandomAccessIter, class _Compare>
+_RandomAccessIter
+partial_sort_copy(_InputIter __first, _InputIter __last,
+ _RandomAccessIter __result_first,
+ _RandomAccessIter __result_last, _Compare __comp);
+
+// nth_element() and its auxiliary functions.
+
+template <class _RandomAccessIter>
+void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
+ _RandomAccessIter __last);
+
+template <class _RandomAccessIter, class _Compare>
+void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
+ _RandomAccessIter __last, _Compare __comp);
+
+// auxiliary class for lower_bound, etc.
+template <class _T1, class _T2>
+struct __less_2 {
+ bool operator() (const _T1& __x, const _T2 __y) const { return __x < __y ; }
+};
+
+template <class _T1, class _T2>
+__less_2<_T1,_T2> __less2(_T1*, _T2* ) { return __less_2<_T1, _T2>(); }
+
+#ifdef _STLP_FUNCTION_PARTIAL_ORDER
+template <class _Tp>
+less<_Tp> __less2(_Tp*, _Tp* ) { return less<_Tp>(); }
+#endif
+
+// Binary search (lower_bound, upper_bound, equal_range, binary_search).
+
+template <class _ForwardIter, class _Tp>
+inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __val) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __lower_bound(__first, __last, __val,
+ __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0),
+ _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _ForwardIter, class _Tp, class _Compare>
+inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __val, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __lower_bound(__first, __last, __val, __comp, _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
+_ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __val, _Compare __comp, _Distance*);
+
+template <class _ForwardIter, class _Tp>
+inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __val) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __upper_bound(__first, __last, __val,
+ __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0),
+ _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _ForwardIter, class _Tp, class _Compare>
+inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __val, _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __upper_bound(__first, __last, __val, __comp,
+ _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
+pair<_ForwardIter, _ForwardIter>
+__equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
+ _Compare __comp, _Distance*);
+
+template <class _ForwardIter, class _Tp>
+inline pair<_ForwardIter, _ForwardIter>
+equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __equal_range(__first, __last, __val,
+ __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0),
+ _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _ForwardIter, class _Tp, class _Compare>
+inline pair<_ForwardIter, _ForwardIter>
+equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
+ _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __equal_range(__first, __last, __val, __comp,
+ _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _ForwardIter, class _Tp>
+inline bool binary_search(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __val) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ _ForwardIter __i = __lower_bound(__first, __last, __val,
+ __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0),
+ _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+ return __i != __last && !(__val < *__i);
+}
+
+template <class _ForwardIter, class _Tp, class _Compare>
+inline bool binary_search(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __val,
+ _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ _ForwardIter __i = __lower_bound(__first, __last, __val, __comp, _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+ return __i != __last && !__comp(__val, *__i);
+}
+
+// merge, with and without an explicitly supplied comparison function.
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result);
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+ class _Compare>
+_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result, _Compare __comp);
+
+
+// inplace_merge and its auxiliary functions.
+
+
+template <class _BidirectionalIter>
+void inplace_merge(_BidirectionalIter __first,
+ _BidirectionalIter __middle,
+ _BidirectionalIter __last) ;
+
+template <class _BidirectionalIter, class _Compare>
+void inplace_merge(_BidirectionalIter __first,
+ _BidirectionalIter __middle,
+ _BidirectionalIter __last, _Compare __comp);
+
+// Set algorithms: includes, set_union, set_intersection, set_difference,
+// set_symmetric_difference. All of these algorithms have the precondition
+// that their input ranges are sorted and the postcondition that their output
+// ranges are sorted.
+
+template <class _InputIter1, class _InputIter2>
+bool includes(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2);
+
+template <class _InputIter1, class _InputIter2, class _Compare>
+bool includes(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2, _Compare __comp);
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result);
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+ class _Compare>
+_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result, _Compare __comp);
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result);
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+ class _Compare>
+_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result, _Compare __comp);
+
+
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result);
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+ class _Compare>
+_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result, _Compare __comp);
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter
+set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result);
+
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+ class _Compare>
+_OutputIter
+set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _OutputIter __result,
+ _Compare __comp);
+
+
+// min_element and max_element, with and without an explicitly supplied
+// comparison function.
+
+template <class _ForwardIter>
+_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last);
+template <class _ForwardIter, class _Compare>
+_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
+ _Compare __comp);
+
+template <class _ForwardIter>
+_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last);
+
+template <class _ForwardIter, class _Compare>
+_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
+ _Compare __comp);
+
+// next_permutation and prev_permutation, with and without an explicitly
+// supplied comparison function.
+
+template <class _BidirectionalIter>
+bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last);
+
+template <class _BidirectionalIter, class _Compare>
+bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
+ _Compare __comp);
+
+
+template <class _BidirectionalIter>
+bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last);
+
+
+template <class _BidirectionalIter, class _Compare>
+bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
+ _Compare __comp);
+
+# ifndef _STLP_NO_EXTENSIONS
+
+// is_heap, a predicate testing whether or not a range is
+// a heap. This function is an extension, not part of the C++
+// standard.
+
+template <class _RandomAccessIter>
+bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last);
+
+template <class _RandomAccessIter, class _StrictWeakOrdering>
+bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
+ _StrictWeakOrdering __comp);
+
+
+// is_sorted, a predicated testing whether a range is sorted in
+// nondescending order. This is an extension, not part of the C++
+// standard.
+template <class _ForwardIter, class _StrictWeakOrdering>
+bool __is_sorted(_ForwardIter __first, _ForwardIter __last,
+ _StrictWeakOrdering __comp);
+
+template <class _ForwardIter>
+inline bool is_sorted(_ForwardIter __first, _ForwardIter __last) {
+ return __is_sorted(__first, __last, __less(_STLP_VALUE_TYPE(__first, _ForwardIter)));
+}
+
+template <class _ForwardIter, class _StrictWeakOrdering>
+inline bool is_sorted(_ForwardIter __first, _ForwardIter __last,
+ _StrictWeakOrdering __comp) {
+ return __is_sorted(__first, __last, __comp);
+}
+# endif
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_algo.c>
+# endif
+
+#endif /* _STLP_INTERNAL_ALGO_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_algobase.c b/src/STLport/stl/_algobase.c
new file mode 100644
index 0000000..d5b51a1
--- /dev/null
+++ b/src/STLport/stl/_algobase.c
@@ -0,0 +1,392 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_ALGOBASE_C
+#define _STLP_ALGOBASE_C
+
+# if !defined (_STLP_INTERNAL_ALGOBASE_H)
+# include <stl/_algobase.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _InputIter1, class _InputIter2>
+bool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ for ( ; __first1 != __last1 && __first2 != __last2
+ ; ++__first1, ++__first2) {
+ if (*__first1 < *__first2)
+ return true;
+ if (*__first2 < *__first1)
+ return false;
+ }
+ return __first1 == __last1 && __first2 != __last2;
+}
+
+template <class _InputIter1, class _InputIter2, class _Compare>
+bool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _Compare __comp) {
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ for ( ; __first1 != __last1 && __first2 != __last2
+ ; ++__first1, ++__first2) {
+ if (__comp(*__first1, *__first2))
+ return true;
+ if (__comp(*__first2, *__first1))
+ return false;
+ }
+ return __first1 == __last1 && __first2 != __last2;
+}
+
+# ifndef _STLP_NO_EXTENSIONS
+
+template <class _InputIter1, class _InputIter2>
+int __lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2)
+{
+ while (__first1 != __last1 && __first2 != __last2) {
+ if (*__first1 < *__first2)
+ return -1;
+ if (*__first2 < *__first1)
+ return 1;
+ ++__first1;
+ ++__first2;
+ }
+ if (__first2 == __last2) {
+ return !(__first1 == __last1);
+ }
+ else {
+ return -1;
+ }
+}
+
+
+template <class _InputIter1, class _InputIter2>
+int lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ return __lexicographical_compare_3way(__first1, __last1, __first2, __last2);
+}
+# endif
+
+template <class _RandomAccessIter, class _Tp>
+_STLP_INLINE_LOOP _RandomAccessIter __find(_RandomAccessIter __first, _RandomAccessIter __last,
+ const _Tp& __val,
+ const random_access_iterator_tag &)
+{
+ _STLP_DIFFERENCE_TYPE(_RandomAccessIter) __trip_count = (__last - __first) >> 2;
+
+ for ( ; __trip_count > 0 ; --__trip_count) {
+ if (*__first == __val) return __first;
+ ++__first;
+
+ if (*__first == __val) return __first;
+ ++__first;
+
+ if (*__first == __val) return __first;
+ ++__first;
+
+ if (*__first == __val) return __first;
+ ++__first;
+ }
+
+ switch(__last - __first) {
+ case 3:
+ if (*__first == __val) return __first;
+ ++__first;
+ case 2:
+ if (*__first == __val) return __first;
+ ++__first;
+ case 1:
+ if (*__first == __val) return __first;
+ ++__first;
+ case 0:
+ default:
+ return __last;
+ }
+}
+
+template <class _RandomAccessIter, class _Predicate>
+_STLP_INLINE_LOOP _RandomAccessIter __find_if(_RandomAccessIter __first, _RandomAccessIter __last,
+ _Predicate __pred,
+ const random_access_iterator_tag &)
+{
+ _STLP_DIFFERENCE_TYPE(_RandomAccessIter) __trip_count = (__last - __first) >> 2;
+
+ for ( ; __trip_count > 0 ; --__trip_count) {
+ if (__pred(*__first)) return __first;
+ ++__first;
+
+ if (__pred(*__first)) return __first;
+ ++__first;
+
+ if (__pred(*__first)) return __first;
+ ++__first;
+
+ if (__pred(*__first)) return __first;
+ ++__first;
+ }
+
+ switch(__last - __first) {
+ case 3:
+ if (__pred(*__first)) return __first;
+ ++__first;
+ case 2:
+ if (__pred(*__first)) return __first;
+ ++__first;
+ case 1:
+ if (__pred(*__first)) return __first;
+ // ++__first;
+ case 0:
+ default:
+ return __last;
+ }
+}
+
+template <class _InputIter, class _Tp>
+inline _InputIter __find(_InputIter __first, _InputIter __last,
+ const _Tp& __val,
+ const input_iterator_tag &)
+{
+ while (__first != __last && !(*__first == __val))
+ ++__first;
+ return __first;
+}
+
+template <class _InputIter, class _Predicate>
+inline _InputIter __find_if(_InputIter __first, _STLP_MPW_EXTRA_CONST _InputIter __last,
+ _Predicate __pred,
+ const input_iterator_tag &)
+{
+ while (__first != __last && !__pred(*__first))
+ ++__first;
+ return __first;
+}
+
+template <class _InputIter, class _Predicate>
+_InputIter find_if(_InputIter __first, _InputIter __last,
+ _Predicate __pred) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __find_if(__first, __last, __pred, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+}
+
+template <class _InputIter, class _Tp>
+_InputIter find(_InputIter __first, _InputIter __last, const _Tp& __val)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __find(__first, __last, __val, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+}
+
+template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
+_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
+ _ForwardIter2 __first2, _ForwardIter2 __last2,
+ _BinaryPred __predicate)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ // Test for empty ranges
+ if (__first1 == __last1 || __first2 == __last2)
+ return __first1;
+
+ // Test for a pattern of length 1.
+ _ForwardIter2 __tmp(__first2);
+ ++__tmp;
+ if (__tmp == __last2) {
+ while (__first1 != __last1 && !__predicate(*__first1, *__first2))
+ ++__first1;
+ return __first1;
+ }
+
+ // General case.
+
+ _ForwardIter2 __p1, __p;
+
+ __p1 = __first2; ++__p1;
+
+ // _ForwardIter1 __current = __first1;
+
+ while (__first1 != __last1) {
+ while (__first1 != __last1) {
+ if (__predicate(*__first1, *__first2))
+ break;
+ ++__first1;
+ }
+ while (__first1 != __last1 && !__predicate(*__first1, *__first2))
+ ++__first1;
+ if (__first1 == __last1)
+ return __last1;
+
+ __p = __p1;
+ _ForwardIter1 __current = __first1;
+ if (++__current == __last1) return __last1;
+
+ while (__predicate(*__current, *__p)) {
+ if (++__p == __last2)
+ return __first1;
+ if (++__current == __last1)
+ return __last1;
+ }
+
+ ++__first1;
+ }
+ return __first1;
+}
+
+// find_first_of, with and without an explicitly supplied comparison function.
+
+template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
+_InputIter __find_first_of(_InputIter __first1, _InputIter __last1,
+ _ForwardIter __first2, _ForwardIter __last2,
+ _BinaryPredicate __comp) {
+ for ( ; __first1 != __last1; ++__first1)
+ for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
+ if (__comp(*__first1, *__iter))
+ return __first1;
+ return __last1;
+}
+
+
+// find_end, with and without an explicitly supplied comparison function.
+// Search [first2, last2) as a subsequence in [first1, last1), and return
+// the *last* possible match. Note that find_end for bidirectional iterators
+// is much faster than for forward iterators.
+
+// find_end for forward iterators.
+
+template <class _ForwardIter1, class _ForwardIter2,
+ class _BinaryPredicate>
+_ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
+ _ForwardIter2 __first2, _ForwardIter2 __last2,
+ const forward_iterator_tag &, const forward_iterator_tag &,
+ _BinaryPredicate __comp)
+{
+ if (__first2 == __last2)
+ return __last1;
+ else {
+ _ForwardIter1 __result = __last1;
+ while (1) {
+ _ForwardIter1 __new_result
+ = search(__first1, __last1, __first2, __last2, __comp);
+ if (__new_result == __last1)
+ return __result;
+ else {
+ __result = __new_result;
+ __first1 = __new_result;
+ ++__first1;
+ }
+ }
+ }
+}
+
+// find_end for bidirectional iterators. Requires partial specialization.
+#if defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION )
+
+#if ! defined (_STLP_INTERNAL_ITERATOR_H)
+_STLP_END_NAMESPACE
+# include <stl/_iterator.h>
+_STLP_BEGIN_NAMESPACE
+#endif
+
+template <class _BidirectionalIter1, class _BidirectionalIter2,
+ class _BinaryPredicate>
+_BidirectionalIter1
+__find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
+ _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
+ const bidirectional_iterator_tag &, const bidirectional_iterator_tag &,
+ _BinaryPredicate __comp)
+{
+ typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
+ typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
+
+ _RevIter1 __rlast1(__first1);
+ _RevIter2 __rlast2(__first2);
+ _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
+ _RevIter2(__last2), __rlast2,
+ __comp);
+
+ if (__rresult == __rlast1)
+ return __last1;
+ else {
+ _BidirectionalIter1 __result = __rresult.base();
+ advance(__result, -distance(__first2, __last2));
+ return __result;
+ }
+}
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class _ForwardIter1, class _ForwardIter2,
+ class _BinaryPredicate>
+_ForwardIter1
+find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
+ _ForwardIter2 __first2, _ForwardIter2 __last2,
+ _BinaryPredicate __comp)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+ return __find_end(__first1, __last1, __first2, __last2,
+# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+ _STLP_ITERATOR_CATEGORY(__first1, _ForwardIter1),
+ _STLP_ITERATOR_CATEGORY(__first2, _ForwardIter2),
+# else
+ forward_iterator_tag(),
+ forward_iterator_tag(),
+# endif
+ __comp);
+}
+
+template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
+_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __val, _Compare __comp, _Distance*)
+{
+ _Distance __len = distance(__first, __last);
+ _Distance __half;
+ _ForwardIter __middle;
+
+ while (__len > 0) {
+ __half = __len >> 1;
+ __middle = __first;
+ advance(__middle, __half);
+ if (__comp(*__middle, __val)) {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else
+ __len = __half;
+ }
+ return __first;
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_ALGOBASE_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_algobase.h b/src/STLport/stl/_algobase.h
new file mode 100644
index 0000000..822c0df
--- /dev/null
+++ b/src/STLport/stl/_algobase.h
@@ -0,0 +1,583 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+
+#ifndef _STLP_INTERNAL_ALGOBASE_H
+#define _STLP_INTERNAL_ALGOBASE_H
+
+# if ! defined (_STLP_CSTDDEF)
+# include <cstddef>
+# endif
+
+#ifndef _STLP_CSTRING
+# include <cstring>
+#endif
+
+#ifndef _STLP_CLIMITS
+# include <climits>
+#endif
+
+# if ! defined (_STLP_CSTDLIB)
+# include <cstdlib>
+# endif
+
+# ifndef _STLP_INTERNAL_PAIR_H
+# include <stl/_pair.h>
+# endif
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+// swap and iter_swap
+template <class _Tp>
+inline void swap(_Tp& __a, _Tp& __b) {
+ _Tp __tmp = __a;
+ __a = __b;
+ __b = __tmp;
+}
+
+template <class _ForwardIter1, class _ForwardIter2>
+inline void iter_swap(_ForwardIter1 __i1, _ForwardIter2 __i2) {
+ swap(*__i1, *__i2);
+}
+
+//--------------------------------------------------
+// min and max
+
+# if !defined (__BORLANDC__) || defined (_STLP_USE_OWN_NAMESPACE)
+template <class _Tp>
+inline const _Tp& (min)(const _Tp& __a, const _Tp& __b) { return __b < __a ? __b : __a; }
+template <class _Tp>
+inline const _Tp& (max)(const _Tp& __a, const _Tp& __b) { return __a < __b ? __b : __a; }
+#endif /* __BORLANDC__ */
+
+# if defined (__BORLANDC__) && ( __BORLANDC__ < 0x530 || defined (_STLP_USE_OWN_NAMESPACE))
+inline unsigned long (min) (unsigned long __a, unsigned long __b) { return __b < __a ? __b : __a; }
+inline unsigned long (max) (unsigned long __a, unsigned long __b) { return __a < __b ? __b : __a; }
+# endif
+
+template <class _Tp, class _Compare>
+inline const _Tp& (min)(const _Tp& __a, const _Tp& __b, _Compare __comp) {
+ return __comp(__b, __a) ? __b : __a;
+}
+
+template <class _Tp, class _Compare>
+inline const _Tp& (max)(const _Tp& __a, const _Tp& __b, _Compare __comp) {
+ return __comp(__a, __b) ? __b : __a;
+}
+
+//--------------------------------------------------
+// copy
+
+// All of these auxiliary functions serve two purposes. (1) Replace
+// calls to copy with memmove whenever possible. (Memmove, not memcpy,
+// because the input and output ranges are permitted to overlap.)
+// (2) If we're using random access iterators, then write the loop as
+// a for loop with an explicit count.
+
+template <class _InputIter, class _OutputIter, class _Distance>
+inline _OutputIter __copy(_InputIter __first, _InputIter __last,
+ _OutputIter __result,
+ const input_iterator_tag &, _Distance*) {
+ for ( ; __first != __last; ++__result, ++__first)
+ *__result = *__first;
+ return __result;
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
+template <class _InputIter, class _OutputIter, class _Distance>
+inline _OutputIter __copy(_InputIter __first, _InputIter __last,
+ _OutputIter __result, const forward_iterator_tag &, _Distance* ) {
+ for ( ; __first != __last; ++__result, ++__first)
+ *__result = *__first;
+ return __result;
+}
+
+
+template <class _InputIter, class _OutputIter, class _Distance>
+inline _OutputIter __copy(_InputIter __first, _InputIter __last,
+ _OutputIter __result, const bidirectional_iterator_tag &, _Distance* __dis) {
+ for ( ; __first != __last; ++__result, ++__first)
+ *__result = *__first;
+ return __result;
+}
+# endif
+
+template <class _RandomAccessIter, class _OutputIter, class _Distance>
+inline _OutputIter
+__copy(_RandomAccessIter __first, _RandomAccessIter __last,
+ _OutputIter __result, const random_access_iterator_tag &, _Distance*) {
+ for (_Distance __n = __last - __first; __n > 0; --__n) {
+ *__result = *__first;
+ ++__first;
+ ++__result;
+ }
+ return __result;
+}
+
+inline void*
+__copy_trivial(const void* __first, const void* __last, void* __result) {
+ return (__last == __first) ? __result :
+ ((char*)memmove(__result, __first, ((const char*)__last - (const char*)__first))) +
+ ((const char*)__last - (const char*)__first);
+}
+
+//--------------------------------------------------
+// copy_backward auxiliary functions
+
+template <class _BidirectionalIter1, class _BidirectionalIter2,
+ class _Distance>
+inline _BidirectionalIter2 __copy_backward(_BidirectionalIter1 __first,
+ _BidirectionalIter1 __last,
+ _BidirectionalIter2 __result,
+ const bidirectional_iterator_tag &,
+ _Distance*)
+{
+ while (__first != __last)
+ *--__result = *--__last;
+ return __result;
+}
+
+template <class _RandomAccessIter, class _BidirectionalIter, class _Distance>
+inline _BidirectionalIter __copy_backward(_RandomAccessIter __first,
+ _RandomAccessIter __last,
+ _BidirectionalIter __result,
+ const random_access_iterator_tag &,
+ _Distance*)
+{
+ for (_Distance __n = __last - __first; __n > 0; --__n)
+ *--__result = *--__last;
+ return __result;
+}
+
+inline void*
+__copy_trivial_backward(const void* __first, const void* __last, void* __result) {
+ const ptrdiff_t _Num = (const char*)__last - (const char*)__first;
+ return (_Num > 0) ? memmove((char*)__result - _Num, __first, _Num) : __result ;
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result, const __false_type&) {
+ return __copy(__first, __last, __result,
+ _STLP_ITERATOR_CATEGORY(__first, _InputIter),
+ _STLP_DISTANCE_TYPE(__first, _InputIter));
+}
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result, const __true_type&) {
+// we know they all pointers, so this cast is OK
+ // return (_OutputIter)__copy_trivial(&(*__first), &(*__last), &(*__result));
+ return (_OutputIter)__copy_trivial(__first, __last, __result);
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_aux(_InputIter __first, _InputIter __last, _OutputIter __result, const __true_type&) {
+ return __copy_ptrs(__first, __last, __result,
+ _IsOKToMemCpy(_STLP_VALUE_TYPE(__first, _InputIter),
+ _STLP_VALUE_TYPE(__result, _OutputIter))._Ret());
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_aux(_InputIter __first, _InputIter __last, _OutputIter __result, const __false_type&) {
+ return __copy(__first, __last, __result,
+ _STLP_ITERATOR_CATEGORY(__first, _InputIter), _STLP_DISTANCE_TYPE(__first, _InputIter));
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter copy(_InputIter __first, _InputIter __last, _OutputIter __result) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __copy_aux(__first, __last, __result, _BothPtrType< _InputIter, _OutputIter> :: _Ret());
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_backward_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result, const __false_type&) {
+ return __copy_backward(__first, __last, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter), _STLP_DISTANCE_TYPE(__first, _InputIter));
+}
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_backward_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result, const __true_type&) {
+ return (_OutputIter)__copy_trivial_backward(__first, __last, __result);
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_backward_aux(_InputIter __first, _InputIter __last, _OutputIter __result, const __false_type&) {
+ return __copy_backward(__first, __last, __result, _STLP_ITERATOR_CATEGORY(__first,_InputIter), _STLP_DISTANCE_TYPE(__first, _InputIter));
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_backward_aux(_InputIter __first, _InputIter __last, _OutputIter __result, const __true_type&) {
+ return __copy_backward_ptrs(__first, __last, __result,
+ _IsOKToMemCpy(_STLP_VALUE_TYPE(__first, _InputIter),
+ _STLP_VALUE_TYPE(__result, _OutputIter))._Ret());
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter copy_backward(_InputIter __first, _InputIter __last, _OutputIter __result) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ return __copy_backward_aux(__first, __last, __result, _BothPtrType< _InputIter, _OutputIter> :: _Ret() );
+}
+
+#if ! defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && ! defined ( _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS )
+#define _STLP_DECLARE_COPY_TRIVIAL(_Tp) \
+inline _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result) \
+{ return (_Tp*)__copy_trivial(__first, __last, __result); } \
+inline _Tp* copy_backward(const _Tp* __first, const _Tp* __last, _Tp* __result) \
+{ return (_Tp*)__copy_trivial_backward(__first, __last, __result); }
+
+_STLP_DECLARE_COPY_TRIVIAL(char)
+# ifndef _STLP_NO_SIGNED_BUILTINS
+_STLP_DECLARE_COPY_TRIVIAL(signed char)
+# endif
+_STLP_DECLARE_COPY_TRIVIAL(unsigned char)
+_STLP_DECLARE_COPY_TRIVIAL(short)
+_STLP_DECLARE_COPY_TRIVIAL(unsigned short)
+_STLP_DECLARE_COPY_TRIVIAL(int)
+_STLP_DECLARE_COPY_TRIVIAL(unsigned int)
+_STLP_DECLARE_COPY_TRIVIAL(long)
+_STLP_DECLARE_COPY_TRIVIAL(unsigned long)
+#if !defined(_STLP_NO_WCHAR_T) && !defined (_STLP_WCHAR_T_IS_USHORT)
+_STLP_DECLARE_COPY_TRIVIAL(wchar_t)
+#endif
+#ifdef _STLP_LONG_LONG
+_STLP_DECLARE_COPY_TRIVIAL(long long)
+_STLP_DECLARE_COPY_TRIVIAL(unsigned long long)
+#endif
+_STLP_DECLARE_COPY_TRIVIAL(float)
+_STLP_DECLARE_COPY_TRIVIAL(double)
+# ifndef _STLP_NO_LONG_DOUBLE
+_STLP_DECLARE_COPY_TRIVIAL(long double)
+# endif
+#undef _STLP_DECLARE_COPY_TRIVIAL
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+//--------------------------------------------------
+// copy_n (not part of the C++ standard)
+
+template <class _InputIter, class _Size, class _OutputIter>
+_STLP_INLINE_LOOP
+pair<_InputIter, _OutputIter> __copy_n(_InputIter __first, _Size __count,
+ _OutputIter __result,
+ const input_iterator_tag &) {
+ for ( ; __count > 0; --__count) {
+ *__result = *__first;
+ ++__first;
+ ++__result;
+ }
+ return pair<_InputIter, _OutputIter>(__first, __result);
+}
+
+template <class _RAIter, class _Size, class _OutputIter>
+inline pair<_RAIter, _OutputIter>
+__copy_n(_RAIter __first, _Size __count,
+ _OutputIter __result,
+ const random_access_iterator_tag &) {
+ _RAIter __last = __first + __count;
+ return pair<_RAIter, _OutputIter>(__last, copy(__first, __last, __result));
+}
+
+template <class _InputIter, class _Size, class _OutputIter>
+inline pair<_InputIter, _OutputIter>
+__copy_n(_InputIter __first, _Size __count, _OutputIter __result) {
+ _STLP_FIX_LITERAL_BUG(__first)
+ return __copy_n(__first, __count, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+}
+
+template <class _InputIter, class _Size, class _OutputIter>
+inline pair<_InputIter, _OutputIter>
+copy_n(_InputIter __first, _Size __count, _OutputIter __result) {
+ _STLP_FIX_LITERAL_BUG(__first)
+ return __copy_n(__first, __count, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+}
+
+//--------------------------------------------------
+// fill and fill_n
+
+
+template <class _ForwardIter, class _Tp>
+_STLP_INLINE_LOOP
+void fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first)
+ *__first = __val;
+}
+
+template <class _OutputIter, class _Size, class _Tp>
+_STLP_INLINE_LOOP
+_OutputIter fill_n(_OutputIter __first, _Size __n, const _Tp& __val) {
+ _STLP_FIX_LITERAL_BUG(__first)
+ for ( ; __n > 0; --__n, ++__first)
+ *__first = __val;
+ return __first;
+}
+
+
+// Specialization: for one-byte types we can use memset.
+
+inline void fill(unsigned char* __first, unsigned char* __last,
+ const unsigned char& __val) {
+ unsigned char __tmp = __val;
+ memset(__first, __tmp, __last - __first);
+}
+# ifndef _STLP_NO_SIGNED_BUILTINS
+inline void fill(signed char* __first, signed char* __last,
+ const signed char& __val) {
+ signed char __tmp = __val;
+ memset(__first, __STATIC_CAST(unsigned char,__tmp), __last - __first);
+}
+# endif
+inline void fill(char* __first, char* __last, const char& __val) {
+ char __tmp = __val;
+ memset(__first, __STATIC_CAST(unsigned char,__tmp), __last - __first);
+}
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class _Size>
+inline unsigned char* fill_n(unsigned char* __first, _Size __n,
+ const unsigned char& __val) {
+ fill(__first, __first + __n, __val);
+ return __first + __n;
+}
+
+template <class _Size>
+inline signed char* fill_n(char* __first, _Size __n,
+ const signed char& __val) {
+ fill(__first, __first + __n, __val);
+ return __first + __n;
+}
+
+template <class _Size>
+inline char* fill_n(char* __first, _Size __n, const char& __val) {
+ fill(__first, __first + __n, __val);
+ return __first + __n;
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+
+//--------------------------------------------------
+// equal and mismatch
+
+template <class _InputIter1, class _InputIter2>
+_STLP_INLINE_LOOP
+pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1,
+ _InputIter1 __last1,
+ _InputIter2 __first2) {
+ _STLP_FIX_LITERAL_BUG(__first2)
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ while (__first1 != __last1 && *__first1 == *__first2) {
+ ++__first1;
+ ++__first2;
+ }
+ return pair<_InputIter1, _InputIter2>(__first1, __first2);
+}
+
+template <class _InputIter1, class _InputIter2, class _BinaryPredicate>
+_STLP_INLINE_LOOP
+pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1,
+ _InputIter1 __last1,
+ _InputIter2 __first2,
+ _BinaryPredicate __binary_pred) {
+ _STLP_FIX_LITERAL_BUG(__first2)
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ while (__first1 != __last1 && __binary_pred(*__first1, *__first2)) {
+ ++__first1;
+ ++__first2;
+ }
+ return pair<_InputIter1, _InputIter2>(__first1, __first2);
+}
+
+template <class _InputIter1, class _InputIter2>
+_STLP_INLINE_LOOP
+bool equal(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2) {
+ _STLP_FIX_LITERAL_BUG(__first1) _STLP_FIX_LITERAL_BUG(__last1) _STLP_FIX_LITERAL_BUG(__first2)
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ for ( ; __first1 != __last1; ++__first1, ++__first2)
+ if (!(*__first1 == *__first2))
+ return false;
+ return true;
+}
+
+template <class _InputIter1, class _InputIter2, class _BinaryPredicate>
+_STLP_INLINE_LOOP
+bool equal(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _BinaryPredicate __binary_pred) {
+ _STLP_FIX_LITERAL_BUG(__first2)
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ for ( ; __first1 != __last1; ++__first1, ++__first2)
+ if (!__binary_pred(*__first1, *__first2))
+ return false;
+ return true;
+}
+
+//--------------------------------------------------
+// lexicographical_compare and lexicographical_compare_3way.
+// (the latter is not part of the C++ standard.)
+
+template <class _InputIter1, class _InputIter2>
+bool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2);
+
+template <class _InputIter1, class _InputIter2, class _Compare>
+bool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _Compare __comp);
+
+inline bool
+lexicographical_compare(const unsigned char* __first1,
+ const unsigned char* __last1,
+ const unsigned char* __first2,
+ const unsigned char* __last2)
+{
+ const size_t __len1 = __last1 - __first1;
+ const size_t __len2 = __last2 - __first2;
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+
+ const int __result = memcmp(__first1, __first2, (min) (__len1, __len2));
+ return __result != 0 ? (__result < 0) : (__len1 < __len2);
+}
+
+
+# if !(CHAR_MAX == SCHAR_MAX)
+inline bool lexicographical_compare(const char* __first1, const char* __last1,
+ const char* __first2, const char* __last2)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+
+ return lexicographical_compare((const unsigned char*) __first1,
+ (const unsigned char*) __last1,
+ (const unsigned char*) __first2,
+ (const unsigned char*) __last2);
+}
+#endif /* CHAR_MAX == SCHAR_MAX */
+
+template <class _InputIter1, class _InputIter2>
+int __lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2);
+
+inline int
+__lexicographical_compare_3way(const unsigned char* __first1,
+ const unsigned char* __last1,
+ const unsigned char* __first2,
+ const unsigned char* __last2)
+{
+ const ptrdiff_t __len1 = __last1 - __first1;
+ const ptrdiff_t __len2 = __last2 - __first2;
+ const int __result = memcmp(__first1, __first2, (min) (__len1, __len2));
+ return __result != 0 ? __result
+ : (__len1 == __len2 ? 0 : (__len1 < __len2 ? -1 : 1));
+}
+
+
+# if !(CHAR_MAX == SCHAR_MAX)
+inline int
+__lexicographical_compare_3way(const char* __first1, const char* __last1,
+ const char* __first2, const char* __last2)
+{
+ return __lexicographical_compare_3way((const unsigned char*) __first1,
+ (const unsigned char*) __last1,
+ (const unsigned char*) __first2,
+ (const unsigned char*) __last2);
+}
+# endif
+
+# ifndef _STLP_NO_EXTENSIONS
+
+template <class _InputIter1, class _InputIter2>
+int lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2);
+
+# endif /* EXTENSIONS */
+
+// count
+template <class _InputIter, class _Tp>
+_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_InputIter)
+count(_InputIter __first, _InputIter __last, const _Tp& __val) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ _STLP_DIFFERENCE_TYPE(_InputIter) __n = 0;
+ for ( ; __first != __last; ++__first)
+ if (*__first == __val)
+ ++__n;
+ return __n;
+}
+
+// find and find_if. Note find may be expressed in terms of find_if if appropriate binder was available.
+template <class _InputIter, class _Tp>
+_InputIter find(_InputIter __first, _InputIter __last, const _Tp& __val);
+template <class _InputIter, class _Predicate>
+_InputIter find_if(_InputIter __first, _InputIter __last, _Predicate __pred);
+
+// search.
+template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
+_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
+ _ForwardIter2 __first2, _ForwardIter2 __last2, _BinaryPred __predicate);
+
+// find_first_of
+template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
+_InputIter __find_first_of(_InputIter __first1, _InputIter __last1,
+ _ForwardIter __first2, _ForwardIter __last2,
+ _BinaryPredicate __comp);
+
+template <class _ForwardIter1, class _ForwardIter2,
+ class _BinaryPredicate>
+_ForwardIter1
+find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
+ _ForwardIter2 __first2, _ForwardIter2 __last2,
+ _BinaryPredicate __comp);
+
+// replace
+template <class _ForwardIter, class _Tp>
+_STLP_INLINE_LOOP void
+replace(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __old_value, const _Tp& __new_value) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first)
+ if (*__first == __old_value)
+ *__first = __new_value;
+}
+
+template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
+_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __val, _Compare __comp, _Distance*);
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_algobase.c>
+# endif
+
+#endif /* _STLP_INTERNAL_ALGOBASE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_alloc.c b/src/STLport/stl/_alloc.c
new file mode 100644
index 0000000..c444034
--- /dev/null
+++ b/src/STLport/stl/_alloc.c
@@ -0,0 +1,370 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_ALLOC_C
+#define _STLP_ALLOC_C
+
+#ifdef __WATCOMC__
+#pragma warning 13 9
+#pragma warning 367 9
+#pragma warning 368 9
+#endif
+
+#ifndef _STLP_INTERNAL_ALLOC_H
+# include <stl/_alloc.h>
+#endif
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+# ifdef _STLP_SGI_THREADS
+ // We test whether threads are in use before locking.
+ // Perhaps this should be moved into stl_threads.h, but that
+ // probably makes it harder to avoid the procedure call when
+ // it isn't needed.
+ extern "C" {
+ extern int __us_rsthread_malloc;
+ }
+# endif
+
+
+// Specialised debug form of malloc which does not provide "false"
+// memory leaks when run with debug CRT libraries.
+#if defined(_STLP_MSVC) && (_STLP_MSVC>=1020 && defined(_STLP_DEBUG_ALLOC)) && ! defined (_STLP_WINCE)
+# include <crtdbg.h>
+inline void* __stlp_chunk_malloc(size_t __bytes) { _STLP_CHECK_NULL_ALLOC(_malloc_dbg(__bytes, _CRT_BLOCK, __FILE__, __LINE__)); }
+#else // !_DEBUG
+# ifdef _STLP_NODE_ALLOC_USE_MALLOC
+# include <cstdlib>
+inline void* __stlp_chunk_malloc(size_t __bytes) { _STLP_CHECK_NULL_ALLOC(_STLP_VENDOR_CSTD::malloc(__bytes)); }
+# else
+inline void* __stlp_chunk_malloc(size_t __bytes) { return _STLP_STD::__stl_new(__bytes); }
+# endif
+#endif // !_DEBUG
+
+
+#define _S_FREELIST_INDEX(__bytes) ((__bytes-size_t(1))>>(int)_ALIGN_SHIFT)
+
+_STLP_BEGIN_NAMESPACE
+
+template <int __inst>
+void * _STLP_CALL __malloc_alloc<__inst>::_S_oom_malloc(size_t __n)
+{
+ __oom_handler_type __my_malloc_handler;
+ void * __result;
+
+ for (;;) {
+ __my_malloc_handler = __oom_handler;
+ if (0 == __my_malloc_handler) { __THROW_BAD_ALLOC; }
+ (*__my_malloc_handler)();
+ __result = malloc(__n);
+ if (__result) return(__result);
+ }
+#if defined(_STLP_NEED_UNREACHABLE_RETURN)
+ return 0;
+#endif
+
+}
+
+template <class _Alloc>
+void * _STLP_CALL __debug_alloc<_Alloc>::allocate(size_t __n) {
+ size_t __real_n = __n + __extra_before_chunk() + __extra_after_chunk();
+ __alloc_header *__result = (__alloc_header *)__allocator_type::allocate(__real_n);
+ memset((char*)__result, __shred_byte, __real_n*sizeof(value_type));
+ __result->__magic = __magic;
+ __result->__type_size = sizeof(value_type);
+ __result->_M_size = (_STLP_UINT32_T)__n;
+ return ((char*)__result) + (long)__extra_before;
+}
+
+template <class _Alloc>
+void _STLP_CALL
+__debug_alloc<_Alloc>::deallocate(void *__p, size_t __n) {
+ __alloc_header * __real_p = (__alloc_header*)((char *)__p -(long)__extra_before);
+ // check integrity
+ _STLP_VERBOSE_ASSERT(__real_p->__magic != __deleted_magic, _StlMsg_DBA_DELETED_TWICE)
+ _STLP_VERBOSE_ASSERT(__real_p->__magic == __magic, _StlMsg_DBA_NEVER_ALLOCATED)
+ _STLP_VERBOSE_ASSERT(__real_p->__type_size == 1,_StlMsg_DBA_TYPE_MISMATCH)
+ _STLP_VERBOSE_ASSERT(__real_p->_M_size == __n, _StlMsg_DBA_SIZE_MISMATCH)
+ // check pads on both sides
+ unsigned char* __tmp;
+ for (__tmp= (unsigned char*)(__real_p+1); __tmp < (unsigned char*)__p; __tmp++) {
+ _STLP_VERBOSE_ASSERT(*__tmp==__shred_byte, _StlMsg_DBA_UNDERRUN)
+ }
+
+ size_t __real_n= __n + __extra_before_chunk() + __extra_after_chunk();
+
+ for (__tmp= ((unsigned char*)__p)+__n*sizeof(value_type);
+ __tmp < ((unsigned char*)__real_p)+__real_n ; __tmp++) {
+ _STLP_VERBOSE_ASSERT(*__tmp==__shred_byte, _StlMsg_DBA_OVERRUN)
+ }
+
+ // that may be unfortunate, just in case
+ __real_p->__magic=__deleted_magic;
+ memset((char*)__p, __shred_byte, __n*sizeof(value_type));
+ __allocator_type::deallocate(__real_p, __real_n);
+}
+
+// # ifdef _STLP_THREADS
+
+template <bool __threads, int __inst>
+class _Node_Alloc_Lock {
+public:
+ _Node_Alloc_Lock() {
+
+# ifdef _STLP_SGI_THREADS
+ if (__threads && __us_rsthread_malloc)
+# else /* !_STLP_SGI_THREADS */
+ if (__threads)
+# endif
+ _S_lock._M_acquire_lock();
+ }
+
+ ~_Node_Alloc_Lock() {
+# ifdef _STLP_SGI_THREADS
+ if (__threads && __us_rsthread_malloc)
+# else /* !_STLP_SGI_THREADS */
+ if (__threads)
+# endif
+ _S_lock._M_release_lock();
+ }
+
+ static _STLP_STATIC_MUTEX _S_lock;
+};
+
+// # endif /* _STLP_THREADS */
+
+
+template <bool __threads, int __inst>
+void* _STLP_CALL
+__node_alloc<__threads, __inst>::_M_allocate(size_t __n) {
+ void* __r;
+ _Obj * _STLP_VOLATILE * __my_free_list = _S_free_list + _S_FREELIST_INDEX(__n);
+ // # ifdef _STLP_THREADS
+ /*REFERENCED*/
+ _Node_Alloc_Lock<__threads, __inst> __lock_instance;
+ // # endif
+ // Acquire the lock here with a constructor call.
+ // This ensures that it is released in exit or during stack
+ // unwinding.
+ if ( (__r = *__my_free_list) != 0 ) {
+ *__my_free_list = ((_Obj*)__r) -> _M_free_list_link;
+ } else {
+ __r = _S_refill(__n);
+ }
+ // lock is released here
+ return __r;
+}
+
+template <bool __threads, int __inst>
+void _STLP_CALL
+__node_alloc<__threads, __inst>::_M_deallocate(void *__p, size_t __n) {
+ _Obj * _STLP_VOLATILE * __my_free_list = _S_free_list + _S_FREELIST_INDEX(__n);
+ // # ifdef _STLP_THREADS
+ /*REFERENCED*/
+ _Node_Alloc_Lock<__threads, __inst> __lock_instance;
+ // # endif /* _STLP_THREADS */
+ // acquire lock
+ ((_Obj *)__p) -> _M_free_list_link = *__my_free_list;
+ *__my_free_list = (_Obj *)__p;
+ // lock is released here
+}
+
+/* We allocate memory in large chunks in order to avoid fragmenting */
+/* the malloc heap too much. */
+/* We assume that size is properly aligned. */
+/* We hold the allocation lock. */
+template <bool __threads, int __inst>
+char* _STLP_CALL
+__node_alloc<__threads, __inst>::_S_chunk_alloc(size_t _p_size,
+ int& __nobjs)
+{
+ char* __result;
+ size_t __total_bytes = _p_size * __nobjs;
+ size_t __bytes_left = _S_end_free - _S_start_free;
+
+ if (__bytes_left >= __total_bytes) {
+ __result = _S_start_free;
+ _S_start_free += __total_bytes;
+ return(__result);
+ } else if (__bytes_left >= _p_size) {
+ __nobjs = (int)(__bytes_left/_p_size);
+ __total_bytes = _p_size * __nobjs;
+ __result = _S_start_free;
+ _S_start_free += __total_bytes;
+ return(__result);
+ } else {
+ size_t __bytes_to_get =
+ 2 * __total_bytes + _S_round_up(_S_heap_size >> 4);
+ // Try to make use of the left-over piece.
+ if (__bytes_left > 0) {
+ _Obj* _STLP_VOLATILE* __my_free_list =
+ _S_free_list + _S_FREELIST_INDEX(__bytes_left);
+
+ ((_Obj*)_S_start_free) -> _M_free_list_link = *__my_free_list;
+ *__my_free_list = (_Obj*)_S_start_free;
+ }
+ _S_start_free = (char*)__stlp_chunk_malloc(__bytes_to_get);
+ if (0 == _S_start_free) {
+ size_t __i;
+ _Obj* _STLP_VOLATILE* __my_free_list;
+ _Obj* __p;
+ // Try to make do with what we have. That can't
+ // hurt. We do not try smaller requests, since that tends
+ // to result in disaster on multi-process machines.
+ for (__i = _p_size; __i <= (size_t)_MAX_BYTES; __i += (size_t)_ALIGN) {
+ __my_free_list = _S_free_list + _S_FREELIST_INDEX(__i);
+ __p = *__my_free_list;
+ if (0 != __p) {
+ *__my_free_list = __p -> _M_free_list_link;
+ _S_start_free = (char*)__p;
+ _S_end_free = _S_start_free + __i;
+ return(_S_chunk_alloc(_p_size, __nobjs));
+ // Any leftover piece will eventually make it to the
+ // right free list.
+ }
+ }
+ _S_end_free = 0; // In case of exception.
+ _S_start_free = (char*)__stlp_chunk_malloc(__bytes_to_get);
+ /*
+ (char*)malloc_alloc::allocate(__bytes_to_get);
+ */
+
+ // This should either throw an
+ // exception or remedy the situation. Thus we assume it
+ // succeeded.
+ }
+ _S_heap_size += __bytes_to_get;
+ _S_end_free = _S_start_free + __bytes_to_get;
+ return(_S_chunk_alloc(_p_size, __nobjs));
+ }
+}
+
+
+/* Returns an object of size __n, and optionally adds to size __n free list.*/
+/* We assume that __n is properly aligned. */
+/* We hold the allocation lock. */
+template <bool __threads, int __inst>
+void* _STLP_CALL
+__node_alloc<__threads, __inst>::_S_refill(size_t __n)
+{
+ int __nobjs = 20;
+ __n = _S_round_up(__n);
+ char* __chunk = _S_chunk_alloc(__n, __nobjs);
+ _Obj* _STLP_VOLATILE* __my_free_list;
+ _Obj* __result;
+ _Obj* __current_obj;
+ _Obj* __next_obj;
+ int __i;
+
+ if (1 == __nobjs) return(__chunk);
+ __my_free_list = _S_free_list + _S_FREELIST_INDEX(__n);
+
+ /* Build free list in chunk */
+ __result = (_Obj*)__chunk;
+ *__my_free_list = __next_obj = (_Obj*)(__chunk + __n);
+ for (__i = 1; ; __i++) {
+ __current_obj = __next_obj;
+ __next_obj = (_Obj*)((char*)__next_obj + __n);
+ if (__nobjs - 1 == __i) {
+ __current_obj -> _M_free_list_link = 0;
+ break;
+ } else {
+ __current_obj -> _M_free_list_link = __next_obj;
+ }
+ }
+ return(__result);
+}
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+// malloc_alloc out-of-memory handling
+template <int __inst>
+__oom_handler_type __malloc_alloc<__inst>::__oom_handler=(__oom_handler_type)0 ;
+
+// #ifdef _STLP_THREADS
+ template <bool __threads, int __inst>
+ _STLP_STATIC_MUTEX
+ _Node_Alloc_Lock<__threads, __inst>::_S_lock _STLP_MUTEX_INITIALIZER;
+// #endif
+
+template <bool __threads, int __inst>
+_Node_alloc_obj * _STLP_VOLATILE
+__node_alloc<__threads, __inst>::_S_free_list[_STLP_NFREELISTS]
+= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+// The 16 zeros are necessary to make version 4.1 of the SunPro
+// compiler happy. Otherwise it appears to allocate too little
+// space for the array.
+
+template <bool __threads, int __inst>
+char *__node_alloc<__threads, __inst>::_S_start_free = 0;
+
+template <bool __threads, int __inst>
+char *__node_alloc<__threads, __inst>::_S_end_free = 0;
+
+template <bool __threads, int __inst>
+size_t __node_alloc<__threads, __inst>::_S_heap_size = 0;
+
+
+# else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+__DECLARE_INSTANCE(__oom_handler_type, __malloc_alloc<0>::__oom_handler, =0);
+
+# define _STLP_ALLOC_NOTHREADS __node_alloc<false, 0>
+# define _STLP_ALLOC_THREADS __node_alloc<true, 0>
+# define _STLP_ALLOC_NOTHREADS_LOCK _Node_Alloc_Lock<false, 0>
+# define _STLP_ALLOC_THREADS_LOCK _Node_Alloc_Lock<true, 0>
+
+__DECLARE_INSTANCE(char *, _STLP_ALLOC_NOTHREADS::_S_start_free,=0);
+__DECLARE_INSTANCE(char *, _STLP_ALLOC_NOTHREADS::_S_end_free,=0);
+__DECLARE_INSTANCE(size_t, _STLP_ALLOC_NOTHREADS::_S_heap_size,=0);
+__DECLARE_INSTANCE(_Node_alloc_obj * _STLP_VOLATILE,
+ _STLP_ALLOC_NOTHREADS::_S_free_list[_STLP_NFREELISTS],
+ ={0});
+__DECLARE_INSTANCE(char *, _STLP_ALLOC_THREADS::_S_start_free,=0);
+__DECLARE_INSTANCE(char *, _STLP_ALLOC_THREADS::_S_end_free,=0);
+__DECLARE_INSTANCE(size_t, _STLP_ALLOC_THREADS::_S_heap_size,=0);
+__DECLARE_INSTANCE(_Node_alloc_obj * _STLP_VOLATILE,
+ _STLP_ALLOC_THREADS::_S_free_list[_STLP_NFREELISTS],
+ ={0});
+// # ifdef _STLP_THREADS
+__DECLARE_INSTANCE(_STLP_STATIC_MUTEX,
+ _STLP_ALLOC_NOTHREADS_LOCK::_S_lock,
+ _STLP_MUTEX_INITIALIZER);
+__DECLARE_INSTANCE(_STLP_STATIC_MUTEX,
+ _STLP_ALLOC_THREADS_LOCK::_S_lock,
+ _STLP_MUTEX_INITIALIZER);
+// # endif
+
+# undef _STLP_ALLOC_THREADS
+# undef _STLP_ALLOC_NOTHREADS
+
+# endif /* _STLP_STATIC_TEMPLATE_DATA */
+
+_STLP_END_NAMESPACE
+
+# undef _S_FREELIST_INDEX
+
+# endif /* _STLP_EXPOSE_GLOBALS_IMPLEMENTATION */
+
+#endif /* _STLP_ALLOC_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_alloc.h b/src/STLport/stl/_alloc.h
new file mode 100644
index 0000000..5018754
--- /dev/null
+++ b/src/STLport/stl/_alloc.h
@@ -0,0 +1,531 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_ALLOC_H
+#define _STLP_INTERNAL_ALLOC_H
+
+# ifndef _STLP_CSTDDEF
+# include <cstddef>
+# endif
+
+#if !defined (_STLP_DEBUG_H) && (defined (_STLP_DEBUG) || defined (_STLP_ASSERTIONS))
+# include <stl/debug/_debug.h>
+#endif
+
+# ifndef _STLP_CSTDLIB
+# include <cstdlib>
+# endif
+# ifndef _STLP_CSTRING
+# include <cstring>
+# endif
+
+# ifndef __THROW_BAD_ALLOC
+# if !defined(_STLP_USE_EXCEPTIONS)
+# if !defined (_STLP_CSTDIO)
+# include <cstdio>
+# endif
+# if !defined (_STLP_CSTDLIB)
+# include <cstdlib>
+# endif
+# define __THROW_BAD_ALLOC puts("out of memory\n"); exit(1)
+# else /* !defined(_STLP_USE_EXCEPTIONS) */
+# define __THROW_BAD_ALLOC throw _STLP_STD::bad_alloc()
+# endif /* !defined(_STLP_USE_EXCEPTIONS) */
+# endif /* __THROW_BAD_ALLOC */
+
+# ifndef _STLP_INTERNAL_NEW_HEADER
+# include <stl/_new.h>
+# endif
+
+#if /* defined (_STLP_THREADS) && */ ! defined (_STLP_INTERNAL_THREADS_H)
+# include <stl/_threads.h>
+#endif
+
+#ifndef _STLP_INTERNAL_CONSTRUCT_H
+# include <stl/_construct.h>
+#endif
+
+#ifndef __ALLOC
+# define __ALLOC __sgi_alloc
+#endif
+
+# ifndef __RESTRICT
+# define __RESTRICT
+# endif
+
+#if defined (_STLP_THREADS) || (defined(_STLP_OWN_IOSTREAMS) && ! defined (_STLP_NO_THREADS) && ! defined (_NOTHREADS) )
+# define _STLP_NODE_ALLOCATOR_THREADS true
+#else
+# define _STLP_NODE_ALLOCATOR_THREADS false
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_USE_RAW_SGI_ALLOCATORS)
+template <class _Tp, class _Alloc> struct __allocator;
+# endif
+
+// Malloc-based allocator. Typically slower than default alloc below.
+// Typically thread-safe and more storage efficient.
+
+typedef void (* __oom_handler_type)();
+
+template <int __inst>
+class __malloc_alloc {
+private:
+ static void* _STLP_CALL _S_oom_malloc(size_t);
+ static __oom_handler_type __oom_handler;
+public:
+ // this one is needed for proper simple_alloc wrapping
+ typedef char value_type;
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) && defined (_STLP_USE_RAW_SGI_ALLOCATORS)
+ template <class _Tp1> struct rebind {
+ typedef __allocator<_Tp1, __malloc_alloc<__inst> > other;
+ };
+# endif
+ static void* _STLP_CALL allocate(size_t __n) {
+ void* __result = malloc(__n);
+ if (0 == __result) __result = _S_oom_malloc(__n);
+ return __result;
+ }
+ static void _STLP_CALL deallocate(void* __p, size_t /* __n */) { free((char*)__p); }
+ static __oom_handler_type _STLP_CALL set_malloc_handler(__oom_handler_type __f) {
+ __oom_handler_type __old = __oom_handler;
+ __oom_handler = __f;
+ return(__old);
+ }
+};
+
+
+// New-based allocator. Typically slower than default alloc below.
+// Typically thread-safe and more storage efficient.
+class _STLP_CLASS_DECLSPEC __new_alloc {
+public:
+ // this one is needed for proper simple_alloc wrapping
+ typedef char value_type;
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) && defined(_STLP_USE_RAW_SGI_ALLOCATORS)
+ template <class _Tp1> struct rebind {
+ typedef __allocator<_Tp1, __new_alloc > other;
+ };
+# endif
+ static void* _STLP_CALL allocate(size_t __n) { return __stl_new(__n); }
+ static void _STLP_CALL deallocate(void* __p, size_t) { __stl_delete(__p); }
+};
+
+
+// Allocator adaptor to check size arguments for debugging.
+// Reports errors using assert. Checking can be disabled with
+// NDEBUG, but it's far better to just use the underlying allocator
+// instead when no checking is desired.
+// There is some evidence that this can confuse Purify.
+// This adaptor can only be applied to raw allocators
+
+template <class _Alloc>
+class __debug_alloc : public _Alloc {
+public:
+ typedef _Alloc __allocator_type;
+ typedef typename _Alloc::value_type value_type;
+private:
+ struct __alloc_header {
+ size_t __magic: 16;
+ size_t __type_size:16;
+ _STLP_UINT32_T _M_size;
+ }; // that is 8 bytes for sure
+ // Sunpro CC has bug on enums, so extra_before/after set explicitly
+ enum { __pad=8, __magic=0xdeba, __deleted_magic = 0xdebd,
+ __shred_byte= _STLP_SHRED_BYTE
+ };
+
+ enum { __extra_before = 16, __extra_after = 8 };
+ // Size of space used to store size. Note
+ // that this must be large enough to preserve
+ // alignment.
+ static size_t _STLP_CALL __extra_before_chunk() {
+ return (long)__extra_before/sizeof(value_type)+
+ (size_t)((long)__extra_before%sizeof(value_type)>0);
+ }
+ static size_t _STLP_CALL __extra_after_chunk() {
+ return (long)__extra_after/sizeof(value_type)+
+ (size_t)((long)__extra_after%sizeof(value_type)>0);
+ }
+public:
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) && defined (_STLP_USE_RAW_SGI_ALLOCATORS)
+ template <class _Tp1> struct rebind {
+ typedef __allocator< _Tp1, __debug_alloc<_Alloc> > other;
+ };
+# endif
+ __debug_alloc() {}
+ ~__debug_alloc() {}
+ static void * _STLP_CALL allocate(size_t);
+ static void _STLP_CALL deallocate(void *, size_t);
+};
+
+
+// Default node allocator.
+// With a reasonable compiler, this should be roughly as fast as the
+// original STL class-specific allocators, but with less fragmentation.
+// Default_alloc_template parameters are experimental and MAY
+// DISAPPEAR in the future. Clients should just use alloc for now.
+//
+// Important implementation properties:
+// 1. If the client request an object of size > _MAX_BYTES, the resulting
+// object will be obtained directly from malloc.
+// 2. In all other cases, we allocate an object of size exactly
+// _S_round_up(requested_size). Thus the client has enough size
+// information that we can return the object to the proper free list
+// without permanently losing part of the object.
+//
+
+// The first template parameter specifies whether more than one thread
+// may use this allocator. It is safe to allocate an object from
+// one instance of a default_alloc and deallocate it with another
+// one. This effectively transfers its ownership to the second one.
+// This may have undesirable effects on reference locality.
+// The second parameter is unreferenced and serves only to allow the
+// creation of multiple default_alloc instances.
+
+# if defined(__OS400__)
+enum {_ALIGN = 16, _ALIGN_SHIFT=4, _MAX_BYTES = 256};
+# define _STLP_NFREELISTS 16
+# else
+enum {_ALIGN = 8, _ALIGN_SHIFT=3, _MAX_BYTES = 128};
+# define _STLP_NFREELISTS 16
+# endif /* __OS400__ */
+
+class _STLP_CLASS_DECLSPEC _Node_alloc_obj {
+public:
+ _Node_alloc_obj * _M_free_list_link;
+};
+
+template <bool __threads, int __inst>
+class __node_alloc {
+ _STLP_PRIVATE:
+ static inline size_t _STLP_CALL _S_round_up(size_t __bytes) { return (((__bytes) + (size_t)_ALIGN-1) & ~((size_t)_ALIGN - 1)); }
+ typedef _Node_alloc_obj _Obj;
+private:
+ // Returns an object of size __n, and optionally adds to size __n free list.
+ static void* _STLP_CALL _S_refill(size_t __n);
+ // Allocates a chunk for nobjs of size size. nobjs may be reduced
+ // if it is inconvenient to allocate the requested number.
+ static char* _STLP_CALL _S_chunk_alloc(size_t __p_size, int& __nobjs);
+ // Chunk allocation state.
+ static _Node_alloc_obj * _STLP_VOLATILE _S_free_list[_STLP_NFREELISTS];
+ static char* _S_start_free;
+ static char* _S_end_free;
+ static size_t _S_heap_size;
+ static void * _STLP_CALL _M_allocate(size_t __n);
+ /* __p may not be 0 */
+ static void _STLP_CALL _M_deallocate(void *__p, size_t __n);
+public:
+ // this one is needed for proper simple_alloc wrapping
+ typedef char value_type;
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) && defined (_STLP_USE_RAW_SGI_ALLOCATORS)
+ template <class _Tp1> struct rebind {
+ typedef __allocator<_Tp1, __node_alloc<__threads, __inst> > other;
+ };
+# endif
+ /* __n must be > 0 */
+ static void * _STLP_CALL allocate(size_t __n) { return (__n > (size_t)_MAX_BYTES) ? __stl_new(__n) : _M_allocate(__n); }
+ /* __p may not be 0 */
+ static void _STLP_CALL deallocate(void *__p, size_t __n) { if (__n > (size_t)_MAX_BYTES) __stl_delete(__p); else _M_deallocate(__p, __n); }
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS __malloc_alloc<0>;
+_STLP_EXPORT_TEMPLATE_CLASS __node_alloc<_STLP_NODE_ALLOCATOR_THREADS, 0>;
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+typedef __node_alloc<_STLP_NODE_ALLOCATOR_THREADS, 0> _Node_alloc;
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS __debug_alloc<_Node_alloc>;
+_STLP_EXPORT_TEMPLATE_CLASS __debug_alloc<__new_alloc>;
+_STLP_EXPORT_TEMPLATE_CLASS __debug_alloc<__malloc_alloc<0> >;
+# endif
+
+# if defined (_STLP_USE_PERTHREAD_ALLOC)
+
+_STLP_END_NAMESPACE
+// include additional header here
+# include <stl/_pthread_alloc.h>
+_STLP_BEGIN_NAMESPACE
+
+# if defined ( _STLP_DEBUG_ALLOC )
+typedef __debug_alloc<__pthread_alloc> __sgi_alloc;
+# else
+typedef __pthread_alloc __sgi_alloc;
+# endif /* _STLP_DEBUG_ALLOC */
+
+typedef __pthread_alloc __single_client_alloc;
+typedef __pthread_alloc __multithreaded_alloc;
+
+# else
+
+# if defined ( _STLP_USE_NEWALLOC )
+
+# if defined ( _STLP_DEBUG_ALLOC )
+typedef __debug_alloc<__new_alloc> __sgi_alloc;
+# else
+typedef __new_alloc __sgi_alloc;
+# endif /* _STLP_DEBUG_ALLOC */
+
+typedef __new_alloc __single_client_alloc;
+typedef __new_alloc __multithreaded_alloc;
+
+# elif defined (_STLP_USE_MALLOC)
+
+# if defined ( _STLP_DEBUG_ALLOC )
+typedef __debug_alloc<__malloc_alloc<0> > __sgi_alloc;
+# else
+typedef __malloc_alloc<0> __sgi_alloc;
+# endif /* _STLP_DEBUG_ALLOC */
+
+typedef __malloc_alloc<0> __single_client_alloc;
+typedef __malloc_alloc<0> __multithreaded_alloc;
+
+# else
+
+# if defined ( _STLP_DEBUG_ALLOC )
+typedef __debug_alloc<_Node_alloc> __sgi_alloc;
+# else
+typedef _Node_alloc __sgi_alloc;
+# endif
+
+typedef __node_alloc<false, 0> __single_client_alloc;
+typedef __node_alloc<true, 0> __multithreaded_alloc;
+
+# endif /* _STLP_USE_NEWALLOC */
+# endif /* PTHREAD_ALLOC */
+
+// This implements allocators as specified in the C++ standard.
+//
+// Note that standard-conforming allocators use many language features
+// that are not yet widely implemented. In particular, they rely on
+// member templates, partial specialization, partial ordering of function
+// templates, the typename keyword, and the use of the template keyword
+// to refer to a template member of a dependent type.
+
+template <class _Tp>
+class allocator {
+public:
+
+ typedef _Tp value_type;
+ typedef value_type * pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+ template <class _Tp1> struct rebind {
+ typedef allocator<_Tp1> other;
+ };
+# endif
+ allocator() _STLP_NOTHROW {}
+ # if defined (_STLP_MEMBER_TEMPLATES)
+ template <class _Tp1> allocator(const allocator<_Tp1>&) _STLP_NOTHROW {}
+ # endif
+ allocator(const allocator<_Tp>&) _STLP_NOTHROW {}
+ ~allocator() _STLP_NOTHROW {}
+ pointer address(reference __x) const { return &__x; }
+ const_pointer address(const_reference __x) const { return &__x; }
+ // __n is permitted to be 0. The C++ standard says nothing about what the return value is when __n == 0.
+ _Tp* allocate(size_type __n, const void* = 0) {
+ return __n != 0 ? __REINTERPRET_CAST(value_type*,__sgi_alloc::allocate(__n * sizeof(value_type))) : 0;
+ }
+ // __p is permitted to be a null pointer, only if n==0.
+ void deallocate(pointer __p, size_type __n) {
+ _STLP_ASSERT( (__p == 0) == (__n == 0) )
+ if (__p != 0) __sgi_alloc::deallocate((void*)__p, __n * sizeof(value_type));
+ }
+ // backwards compatibility
+ void deallocate(pointer __p) const { if (__p != 0) __sgi_alloc::deallocate((void*)__p, sizeof(value_type)); }
+ size_type max_size() const _STLP_NOTHROW { return size_t(-1) / sizeof(value_type); }
+ void construct(pointer __p, const _Tp& __val) { _STLP_STD::_Construct(__p, __val); }
+ void destroy(pointer __p) { _STLP_STD::_Destroy(__p); }
+# if defined(__MRC__)||(defined(__SC__) && !defined(__DMC__))
+ template <class _T2> bool operator==(const allocator<_T2>&) const _STLP_NOTHROW { return true; }
+ template <class _T2> bool operator!=(const allocator<_T2>&) const _STLP_NOTHROW { return false; }
+# endif
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC allocator<void> {
+public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+ typedef void value_type;
+# endif
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+ template <class _Tp1> struct rebind {
+ typedef allocator<_Tp1> other;
+ };
+# endif
+# if defined(__MRC__)||(defined(__SC__)&&!defined(__DMC__)) //*ty 03/24/2001 - MPW compilers get confused on these operator definitions
+ template <class _T2> bool operator==(const allocator<_T2>&) const _STLP_NOTHROW { return true; }
+ template <class _T2> bool operator!=(const allocator<_T2>&) const _STLP_NOTHROW { return false; }
+# endif
+};
+
+#if !(defined(__MRC__)||(defined(__SC__)&&!defined(__DMC__))) //*ty 03/24/2001 - MPW compilers get confused on these operator definitions
+template <class _T1, class _T2> inline bool _STLP_CALL operator==(const allocator<_T1>&, const allocator<_T2>&) _STLP_NOTHROW { return true; }
+template <class _T1, class _T2> inline bool _STLP_CALL operator!=(const allocator<_T1>&, const allocator<_T2>&) _STLP_NOTHROW { return false; }
+#endif
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS allocator<char>;
+# if defined (_STLP_HAS_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS allocator<wchar_t>;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+// Another allocator adaptor: _Alloc_traits. This serves two
+// purposes. First, make it possible to write containers that can use
+// either SGI-style allocators or standard-conforming allocator.
+
+// The fully general version.
+template <class _Tp, class _Allocator>
+struct _Alloc_traits
+{
+ typedef _Allocator _Orig;
+# if defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM)
+ typedef typename _Allocator::_STLP_TEMPLATE rebind<_Tp> _Rebind_type;
+ typedef typename _Rebind_type::other allocator_type;
+ static allocator_type create_allocator(const _Orig& __a) { return allocator_type(__a); }
+# else
+ // this is not actually true, used only to pass this type through
+ // to dynamic overload selection in _STLP_alloc_proxy methods
+ typedef _Allocator allocator_type;
+# endif /* _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM */
+};
+
+#ifndef _STLP_FORCE_ALLOCATORS
+#define _STLP_FORCE_ALLOCATORS(a,y)
+#endif
+
+#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && ! defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+// The version for the default allocator, for rare occasion when we have partial spec w/o member template classes
+template <class _Tp, class _Tp1>
+struct _Alloc_traits<_Tp, allocator<_Tp1> > {
+ typedef allocator<_Tp1> _Orig;
+ typedef allocator<_Tp> allocator_type;
+ static allocator_type create_allocator(const allocator<_Tp1 >& __a) { return allocator_type(__a); }
+};
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+/* macro to convert the allocator for initialization
+ * not using MEMBER_TEMPLATE_CLASSES as it should work given template constructor */
+#if defined (_STLP_MEMBER_TEMPLATES) || ! defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+/* if _STLP_NO_TEMPLATE_CONVERSIONS is set, the member template constructor is
+ * not used implicitly to convert allocator parameter, so let us do it explicitly */
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) && defined (_STLP_NO_TEMPLATE_CONVERSIONS)
+# define _STLP_CONVERT_ALLOCATOR(__a, _Tp) __stl_alloc_create(__a,(_Tp*)0)
+# else
+# define _STLP_CONVERT_ALLOCATOR(__a, _Tp) __a
+# endif
+/* else convert, but only if partial specialization works, since else
+ * Container::allocator_type won't be different */
+#else
+# define _STLP_CONVERT_ALLOCATOR(__a, _Tp) __stl_alloc_create(__a,(_Tp*)0)
+#endif
+
+# if defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM)
+template <class _Tp, class _Alloc>
+inline _STLP_TYPENAME_ON_RETURN_TYPE _Alloc_traits<_Tp, _Alloc>::allocator_type _STLP_CALL
+__stl_alloc_create(const _Alloc& __a, const _Tp*) {
+ typedef typename _Alloc::_STLP_TEMPLATE rebind<_Tp>::other _Rebound_type;
+ return _Rebound_type(__a);
+}
+#else
+// If custom allocators are being used without member template classes support :
+// user (on purpose) is forced to define rebind/get operations !!!
+template <class _Tp1, class _Tp2>
+inline allocator<_Tp2>& _STLP_CALL
+__stl_alloc_rebind(allocator<_Tp1>& __a, const _Tp2*) { return (allocator<_Tp2>&)(__a); }
+template <class _Tp1, class _Tp2>
+inline allocator<_Tp2> _STLP_CALL
+__stl_alloc_create(const allocator<_Tp1>&, const _Tp2*) { return allocator<_Tp2>(); }
+#endif /* _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM */
+
+# ifdef _STLP_USE_RAW_SGI_ALLOCATORS
+// move obsolete stuff out of the way
+# include <stl/_alloc_old.h>
+# endif
+
+// inheritance is being used for EBO optimization
+template <class _Value, class _Tp, class _MaybeReboundAlloc>
+class _STLP_alloc_proxy : public _MaybeReboundAlloc {
+private:
+ typedef _MaybeReboundAlloc _Base;
+ typedef _STLP_alloc_proxy<_Value, _Tp, _MaybeReboundAlloc> _Self;
+public:
+ _Value _M_data;
+ inline _STLP_alloc_proxy(const _MaybeReboundAlloc& __a, _Value __p) : _MaybeReboundAlloc(__a), _M_data(__p) {}
+
+# if 0
+ inline _STLP_alloc_proxy(const _Self& __x) : _MaybeReboundAlloc(__x), _M_data(__x._M_data) {}
+ // construction/destruction
+ inline _Self& operator = (const _Self& __x) {
+ *(_MaybeReboundAlloc*)this = *(_MaybeReboundAlloc*)__x;
+ _M_data = __x._M_data; return *this;
+ }
+ inline _Self& operator = (const _Base& __x) { ((_Base&)*this) = __x; return *this; }
+# endif
+ // Unified interface to perform allocate()/deallocate() with limited
+ // language support
+#if ! defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM)
+ // else it is rebound already, and allocate() member is accessible
+ inline _Tp* allocate(size_t __n) {
+ return __stl_alloc_rebind(__STATIC_CAST(_Base&,*this),(_Tp*)0).allocate(__n,0);
+ }
+ inline void deallocate(_Tp* __p, size_t __n) {
+ __stl_alloc_rebind(__STATIC_CAST(_Base&, *this),(_Tp*)0).deallocate(__p, __n);
+ }
+#endif /* !_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM */
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<char *,char,allocator<char> >;
+# if defined (_STLP_HAS_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<wchar_t *,wchar_t,allocator<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+# undef _STLP_NODE_ALLOCATOR_THREADS
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_alloc.c>
+# endif
+
+#endif /* _STLP_INTERNAL_ALLOC_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_alloc_old.h b/src/STLport/stl/_alloc_old.h
new file mode 100644
index 0000000..da8c84c
--- /dev/null
+++ b/src/STLport/stl/_alloc_old.h
@@ -0,0 +1,303 @@
+template<class _Tp, class _Alloc>
+class __simple_alloc {
+ typedef _Alloc __alloc_type;
+public:
+ typedef typename _Alloc::value_type __alloc_value_type;
+ typedef _Tp value_type;
+ static size_t _STLP_CALL __chunk(size_t __n) {
+ return (sizeof(__alloc_value_type)==sizeof(value_type)) ? __n :
+ ((__n*sizeof(value_type)+sizeof(__alloc_value_type)-1)/sizeof(__alloc_value_type));
+ }
+ static _Tp* _STLP_CALL allocate(size_t __n) { return 0 == __n ? 0 : (_Tp*) __alloc_type::allocate(__chunk(__n)); }
+ static void _STLP_CALL deallocate(_Tp * __p, size_t __n) {
+ __alloc_type::deallocate((__alloc_value_type*)__p, __chunk(__n)); }
+};
+
+// Allocator adaptor to turn an SGI-style allocator (e.g. alloc, malloc_alloc)
+// into a standard-conforming allocator. Note that this adaptor does
+// *not* assume that all objects of the underlying alloc class are
+// identical, nor does it assume that all of the underlying alloc's
+// member functions are static member functions. Note, also, that
+// __allocator<_Tp, alloc> is essentially the same thing as allocator<_Tp>.
+
+template <class _Tp, class _Alloc>
+struct __allocator : public _Alloc {
+ typedef _Alloc __underlying_alloc;
+
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+ template <class _Tp1> struct rebind {
+ typedef __allocator<_Tp1, _Alloc> other;
+ };
+# endif
+ __allocator() _STLP_NOTHROW {}
+ __allocator(const _Alloc& ) _STLP_NOTHROW {}
+ __allocator(const __allocator<_Tp, _Alloc>& __a) _STLP_NOTHROW
+ : _Alloc(__a) {}
+# if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
+ template <class _Tp1>
+ __allocator(const __allocator<_Tp1, _Alloc>& __a) _STLP_NOTHROW
+ : _Alloc(__a) {}
+# endif
+# ifdef _STLP_TRIVIAL_DESTRUCTOR_BUG
+ ~__allocator() _STLP_NOTHROW {}
+# endif
+ pointer address(reference __x) const { return &__x; }
+
+# if !defined (__WATCOM_CPLUSPLUS__)
+ const_pointer address(const_reference __x) const { return &__x; }
+# endif
+
+ // __n is permitted to be 0.
+ _Tp* allocate(size_type __n, const void* = 0) {
+ return __n != 0
+ ? __STATIC_CAST(_Tp*,__underlying_alloc::allocate(__n * sizeof(_Tp)))
+ : 0;
+ }
+
+ // __p is not permitted to be a null pointer.
+ void deallocate(pointer __p, size_type __n)
+ { if (__p) __underlying_alloc::deallocate(__p, __n * sizeof(_Tp)); }
+
+ size_type max_size() const _STLP_NOTHROW
+ { return size_t(-1) / sizeof(_Tp); }
+
+ void construct(pointer __p, const _Tp& __val) { _STLP_STD::_Construct(__p, __val); }
+ void destroy(pointer __p) { _STLP_STD::_Destroy(__p); }
+
+ const __underlying_alloc& __get_underlying_alloc() const { return *this; }
+};
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+template <class _Alloc>
+class __allocator<void, _Alloc> {
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+ typedef void value_type;
+#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
+ template <class _Tp1> struct rebind {
+ typedef __allocator<_Tp1, _Alloc> other;
+ };
+#endif
+};
+#endif
+
+template <class _Tp, class _Alloc>
+inline bool _STLP_CALL operator==(const __allocator<_Tp, _Alloc>& __a1,
+ const __allocator<_Tp, _Alloc>& __a2)
+{
+ return __a1.__get_underlying_alloc() == __a2.__get_underlying_alloc();
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+template <class _Tp, class _Alloc>
+inline bool _STLP_CALL operator!=(const __allocator<_Tp, _Alloc>& __a1,
+ const __allocator<_Tp, _Alloc>& __a2)
+{
+ return __a1.__get_underlying_alloc() != __a2.__get_underlying_alloc();
+}
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+
+// Comparison operators for all of the predifined SGI-style allocators.
+// This ensures that __allocator<malloc_alloc> (for example) will
+// work correctly.
+
+#ifndef _STLP_NON_TYPE_TMPL_PARAM_BUG
+template <int inst>
+inline bool _STLP_CALL operator==(const __malloc_alloc<inst>&,
+ const __malloc_alloc<inst>&)
+{
+ return true;
+}
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+template <int __inst>
+inline bool _STLP_CALL operator!=(const __malloc_alloc<__inst>&,
+ const __malloc_alloc<__inst>&)
+{
+ return false;
+}
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+inline bool _STLP_CALL operator==(const __new_alloc&, const __new_alloc&) { return true; }
+
+# ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+inline bool _STLP_CALL operator!=(const __new_alloc&, const __new_alloc&) { return false; }
+# endif
+
+
+template <bool __threads, int __inst>
+inline bool _STLP_CALL operator==(const __node_alloc<__threads, __inst>&,
+ const __node_alloc<__threads, __inst>&)
+{
+ return true;
+}
+
+#if defined( _STLP_FUNCTION_TMPL_PARTIAL_ORDER )
+
+template <bool __threads, int __inst>
+inline bool _STLP_CALL operator!=(const __node_alloc<__threads, __inst>&,
+ const __node_alloc<__threads, __inst>&)
+{
+ return false;
+}
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+#endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+
+template <class _Alloc>
+inline bool _STLP_CALL operator==(const __debug_alloc<_Alloc>&, const __debug_alloc<_Alloc>&) { return true; }
+# ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+template <class _Alloc>
+inline bool _STLP_CALL operator!=(const __debug_alloc<_Alloc>&, const __debug_alloc<_Alloc>&) { return false; }
+# endif
+
+#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+
+// Versions for the predefined SGI-style allocators.
+template <class _Tp, int __inst>
+struct _Alloc_traits<_Tp, __malloc_alloc<__inst> > {
+ typedef __allocator<_Tp, __malloc_alloc<__inst> > allocator_type;
+};
+
+
+template <class _Tp, bool __threads, int __inst>
+struct _Alloc_traits<_Tp, __node_alloc<__threads, __inst> > {
+ typedef __allocator<_Tp, __node_alloc<__threads, __inst> >
+ allocator_type;
+};
+
+template <class _Tp, class _Alloc>
+struct _Alloc_traits<_Tp, __debug_alloc<_Alloc> > {
+ typedef __allocator<_Tp, __debug_alloc<_Alloc> > allocator_type;
+};
+
+// Versions for the __allocator adaptor used with the predefined
+// SGI-style allocators.
+
+template <class _Tp, class _Tp1, class _Alloc>
+struct _Alloc_traits<_Tp, __allocator<_Tp1, _Alloc > > {
+ typedef __allocator<_Tp, _Alloc > allocator_type;
+};
+
+#endif
+
+#if !defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM)
+
+// Versions for the predefined SGI-style allocators.
+
+
+# if defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
+
+typedef __malloc_alloc<0> __malloc_alloc_dfl;
+typedef __node_alloc<false, 0> __single_client_node_alloc;
+typedef __node_alloc<true, 0> __multithreaded_node_alloc;
+
+template <class _Tp>
+inline __allocator<_Tp, __malloc_alloc_dfl >& _STLP_CALL
+__stl_alloc_rebind(__malloc_alloc_dfl& __a, const _Tp*) {
+ return (__allocator<_Tp, __malloc_alloc_dfl >&)__a;
+}
+
+template <class _Tp>
+inline __allocator<_Tp, __single_client_node_alloc >& _STLP_CALL
+__stl_alloc_rebind(__single_client_node_alloc& __a, const _Tp*) {
+ return (__allocator<_Tp, __single_client_node_alloc >&)__a;
+}
+
+template <class _Tp>
+inline __allocator<_Tp, __multithreaded_node_alloc >& _STLP_CALL
+__stl_alloc_rebind(__multithreaded_node_alloc& __a, const _Tp*) {
+ return (__allocator<_Tp, __multithreaded_node_alloc >&)__a;
+}
+
+template <class _Tp>
+inline __allocator<_Tp, __malloc_alloc_dfl > _STLP_CALL
+__stl_alloc_create(const __malloc_alloc_dfl&, const _Tp*) {
+ return __allocator<_Tp, __malloc_alloc_dfl > ();
+}
+
+template <class _Tp>
+inline __allocator<_Tp, __single_client_node_alloc > _STLP_CALL
+__stl_alloc_create(const __single_client_node_alloc&, const _Tp*) {
+ return __allocator<_Tp, __single_client_node_alloc >();
+}
+
+template <class _Tp>
+inline __allocator<_Tp, __multithreaded_node_alloc > _STLP_CALL
+__stl_alloc_create(const __multithreaded_node_alloc&, const _Tp*) {
+ return __allocator<_Tp, __multithreaded_node_alloc >();
+}
+
+# else
+
+template <class _Tp, int __inst>
+inline __allocator<_Tp, __malloc_alloc<__inst> >& _STLP_CALL
+__stl_alloc_rebind(__malloc_alloc<__inst>& __a, const _Tp*) {
+ return (__allocator<_Tp, __malloc_alloc<__inst> >&)__a;
+}
+
+template <class _Tp, bool __threads, int __inst>
+inline __allocator<_Tp, __node_alloc<__threads, __inst> >& _STLP_CALL
+__stl_alloc_rebind(__node_alloc<__threads, __inst>& __a, const _Tp*) {
+ return (__allocator<_Tp, __node_alloc<__threads, __inst> >&)__a;
+}
+
+template <class _Tp, int __inst>
+inline __allocator<_Tp, __malloc_alloc<__inst> > _STLP_CALL
+__stl_alloc_create(const __malloc_alloc<__inst>&, const _Tp*) {
+ return __allocator<_Tp, __malloc_alloc<__inst> >();
+}
+
+template <class _Tp, bool __threads, int __inst>
+inline __allocator<_Tp, __node_alloc<__threads, __inst> > _STLP_CALL
+__stl_alloc_create(const __node_alloc<__threads, __inst>&, const _Tp*) {
+ return __allocator<_Tp, __node_alloc<__threads, __inst> >();
+}
+
+# endif
+
+template <class _Tp, class _Alloc>
+inline __allocator<_Tp, __debug_alloc<_Alloc> > _STLP_CALL
+__stl_alloc_create(const __debug_alloc<_Alloc>&, const _Tp*) {
+ return __allocator<_Tp, __debug_alloc<_Alloc> >();
+}
+template <class _Tp, class _Alloc>
+inline __allocator<_Tp, __debug_alloc<_Alloc> >& _STLP_CALL
+__stl_alloc_rebind(__debug_alloc<_Alloc>& __a, const _Tp*) {
+ return (__allocator<_Tp, __debug_alloc<_Alloc> >&)__a;
+}
+
+template <class _Tp>
+inline __allocator<_Tp, __new_alloc > _STLP_CALL
+__stl_alloc_create(const __new_alloc&, const _Tp*) {
+ return __allocator<_Tp, __new_alloc >();
+}
+template <class _Tp>
+inline __allocator<_Tp, __new_alloc >& _STLP_CALL
+__stl_alloc_rebind(__new_alloc& __a, const _Tp*) {
+ return (__allocator<_Tp, __new_alloc >&)__a;
+}
+
+template <class _Tp1, class _Alloc, class _Tp2>
+inline __allocator<_Tp2, _Alloc>& _STLP_CALL
+__stl_alloc_rebind(__allocator<_Tp1, _Alloc>& __a, const _Tp2*) {
+ return (__allocator<_Tp2, _Alloc>&)__a;
+}
+
+template <class _Tp1, class _Alloc, class _Tp2>
+inline __allocator<_Tp2, _Alloc> _STLP_CALL
+__stl_alloc_create(const __allocator<_Tp1, _Alloc>&, const _Tp2*) {
+ return __allocator<_Tp2, _Alloc>();
+}
+#endif
diff --git a/src/STLport/stl/_auto_ptr.h b/src/STLport/stl/_auto_ptr.h
new file mode 100644
index 0000000..98d4ef2
--- /dev/null
+++ b/src/STLport/stl/_auto_ptr.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_AUTO_PTR_H
+# define _STLP_AUTO_PTR_H
+
+_STLP_BEGIN_NAMESPACE
+// implementation primitive
+class __ptr_base {
+public:
+ void* _M_p;
+ void __set(const void* p) { _M_p = __CONST_CAST(void*,p); }
+ void __set(void* p) { _M_p = p; }
+};
+
+template <class _Tp> class auto_ptr_ref {
+public:
+ __ptr_base& _M_r;
+ _Tp* const _M_p;
+
+ auto_ptr_ref(__ptr_base& __r, _Tp* __p) : _M_r(__r), _M_p(__p) { }
+
+ _Tp* release() const { _M_r.__set((void*)0); return _M_p; }
+
+};
+
+template<class _Tp> class auto_ptr : public __ptr_base {
+public:
+ typedef _Tp element_type;
+ typedef auto_ptr<_Tp> _Self;
+
+ _Tp* release() {
+ _Tp* __px = this->get();
+ this->_M_p = 0;
+ return __px;
+ }
+
+ void reset(_Tp* __px=0) {
+ _Tp* __pt = this->get();
+ if (__px != __pt)
+ delete __pt;
+ this->__set(__px);
+ }
+
+ _Tp* get() const { return __REINTERPRET_CAST(_Tp*,__CONST_CAST(void*,_M_p)); }
+
+# if !defined (_STLP_NO_ARROW_OPERATOR)
+ _Tp* operator->() const {
+ _STLP_VERBOSE_ASSERT(get()!=0, _StlMsg_AUTO_PTR_NULL)
+ return get();
+ }
+# endif
+ _Tp& operator*() const {
+ _STLP_VERBOSE_ASSERT(get()!=0, _StlMsg_AUTO_PTR_NULL)
+ return *get();
+ }
+
+ auto_ptr() { this->_M_p = 0; }
+
+ explicit auto_ptr(_Tp* __px) { this->__set(__px); }
+
+#if defined (_STLP_MEMBER_TEMPLATES)
+# if !defined (_STLP_NO_TEMPLATE_CONVERSIONS)
+ template<class _Tp1> auto_ptr(auto_ptr<_Tp1>& __r) {
+ _Tp* __conversionCheck = __r.release();
+ this->__set(__conversionCheck);
+ }
+# endif
+ template<class _Tp1> auto_ptr<_Tp>& operator=(auto_ptr<_Tp1>& __r) {
+ _Tp* __conversionCheck = __r.release();
+ reset(__conversionCheck);
+ return *this;
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ auto_ptr(_Self& __r) { this->__set(__r.release()); }
+
+ _Self& operator=(_Self& __r) {
+ reset(__r.release());
+ return *this;
+ }
+
+ ~auto_ptr() { /* boris : reset(0) might be better */ delete this->get(); }
+
+ auto_ptr(auto_ptr_ref<_Tp> __r) {
+ this->__set(__r.release());
+ }
+
+ _Self& operator=(auto_ptr_ref<_Tp> __r) {
+ reset(__r.release());
+ return *this;
+ }
+
+# if defined(_STLP_MEMBER_TEMPLATES) && !defined(_STLP_NO_TEMPLATE_CONVERSIONS)
+ template<class _Tp1> operator auto_ptr_ref<_Tp1>() {
+ return auto_ptr_ref<_Tp1>(*this, this->get());
+ }
+ template<class _Tp1> operator auto_ptr<_Tp1>() {
+ return auto_ptr<_Tp1>(release());
+ }
+# else
+ operator auto_ptr_ref<_Tp>()
+ { return auto_ptr_ref<_Tp>(*this, this->get()); }
+# endif
+
+};
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_AUTO_PTR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_bitset.c b/src/STLport/stl/_bitset.c
new file mode 100644
index 0000000..11990a8
--- /dev/null
+++ b/src/STLport/stl/_bitset.c
@@ -0,0 +1,407 @@
+/*
+ * Copyright (c) 1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_BITSET_C
+# define _STLP_BITSET_C
+
+# ifndef _STLP_BITSET_H
+# include <stl/_bitset.h>
+# endif
+
+# define __BITS_PER_WORD (CHAR_BIT*sizeof(unsigned long))
+
+_STLP_BEGIN_NAMESPACE
+
+//
+// Definitions of non-inline functions from _Base_bitset.
+//
+
+
+template<size_t _Nw>
+void _Base_bitset<_Nw>::_M_do_left_shift(size_t __shift)
+{
+
+ if (__shift != 0) {
+ const size_t __wshift = __shift / __BITS_PER_WORD;
+ const size_t __offset = __shift % __BITS_PER_WORD;
+
+ if (__offset == 0)
+ for (size_t __n = _Nw - 1; __n >= __wshift; --__n)
+ _M_w[__n] = _M_w[__n - __wshift];
+
+ else {
+ const size_t __sub_offset = __BITS_PER_WORD - __offset;
+ for (size_t __n = _Nw - 1; __n > __wshift; --__n)
+ _M_w[__n] = (_M_w[__n - __wshift] << __offset) |
+ (_M_w[__n - __wshift - 1] >> __sub_offset);
+ _M_w[__wshift] = _M_w[0] << __offset;
+ }
+
+ fill(_M_w + 0, _M_w + __wshift, __STATIC_CAST(_WordT,0));
+ }
+}
+
+template<size_t _Nw>
+void _Base_bitset<_Nw>::_M_do_right_shift(size_t __shift)
+{
+
+ if (__shift != 0) {
+ const size_t __wshift = __shift / __BITS_PER_WORD;
+ const size_t __offset = __shift % __BITS_PER_WORD;
+ const size_t __limit = _Nw - __wshift - 1;
+
+ if (__offset == 0)
+ for (size_t __n = 0; __n <= __limit; ++__n)
+ _M_w[__n] = _M_w[__n + __wshift];
+
+ else {
+ const size_t __sub_offset = __BITS_PER_WORD - __offset;
+ for (size_t __n = 0; __n < __limit; ++__n)
+ _M_w[__n] = (_M_w[__n + __wshift] >> __offset) |
+ (_M_w[__n + __wshift + 1] << __sub_offset);
+ _M_w[__limit] = _M_w[_Nw-1] >> __offset;
+ }
+
+ fill(_M_w + __limit + 1, _M_w + _Nw, __STATIC_CAST(_WordT,0));
+ }
+}
+
+template<size_t _Nw>
+unsigned long _Base_bitset<_Nw>::_M_do_to_ulong() const
+{
+ for (size_t __i = 1; __i < _Nw; ++__i)
+ if (_M_w[__i])
+ __stl_throw_overflow_error("bitset");
+ return _M_w[0];
+} // End _M_do_to_ulong
+
+template<size_t _Nw>
+size_t _Base_bitset<_Nw>::_M_do_find_first(size_t __not_found) const
+{
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _WordT __thisword = _M_w[__i];
+ if ( __thisword != __STATIC_CAST(_WordT,0) ) {
+ // find byte within word
+ for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) {
+ unsigned char __this_byte
+ = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0)));
+ if ( __this_byte )
+ return __i*__BITS_PER_WORD + __j*CHAR_BIT +
+ _Bs_G<bool>::_S_first_one[__this_byte];
+
+ __thisword >>= CHAR_BIT;
+ }
+ }
+ }
+ // not found, so return an indication of failure.
+ return __not_found;
+}
+
+template<size_t _Nw>
+size_t
+_Base_bitset<_Nw>::_M_do_find_next(size_t __prev,
+ size_t __not_found) const
+{
+ // make bound inclusive
+ ++__prev;
+
+ // check out of bounds
+ if ( __prev >= _Nw * __BITS_PER_WORD )
+ return __not_found;
+
+ // search first word
+ size_t __i = _S_whichword(__prev);
+ _WordT __thisword = _M_w[__i];
+
+ // mask off bits below bound
+ __thisword &= (~__STATIC_CAST(_WordT,0)) << _S_whichbit(__prev);
+
+ if ( __thisword != __STATIC_CAST(_WordT,0) ) {
+ // find byte within word
+ // get first byte into place
+ __thisword >>= _S_whichbyte(__prev) * CHAR_BIT;
+ for ( size_t __j = _S_whichbyte(__prev); __j < sizeof(_WordT); __j++ ) {
+ unsigned char __this_byte
+ = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0)));
+ if ( __this_byte )
+ return __i*__BITS_PER_WORD + __j*CHAR_BIT +
+ _Bs_G<bool>::_S_first_one[__this_byte];
+
+ __thisword >>= CHAR_BIT;
+ }
+ }
+
+ // check subsequent words
+ __i++;
+ for ( ; __i < _Nw; __i++ ) {
+ /* _WordT */ __thisword = _M_w[__i];
+ if ( __thisword != __STATIC_CAST(_WordT,0) ) {
+ // find byte within word
+ for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) {
+ unsigned char __this_byte
+ = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0)));
+ if ( __this_byte )
+ return __i*__BITS_PER_WORD + __j*CHAR_BIT +
+ _Bs_G<bool>::_S_first_one[__this_byte];
+
+ __thisword >>= CHAR_BIT;
+ }
+ }
+ }
+
+ // not found, so return an indication of failure.
+ return __not_found;
+} // end _M_do_find_next
+
+
+
+# if ! defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
+
+#if defined ( _STLP_USE_NEW_IOSTREAMS)
+
+template <class _CharT, class _Traits, size_t _Nb>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
+{
+ basic_string<_CharT, _Traits> __tmp;
+ __tmp.reserve(_Nb);
+
+ // Skip whitespace
+ typename basic_istream<_CharT, _Traits>::sentry __sentry(__is);
+ if (__sentry) {
+ basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
+ for (size_t __i = 0; __i < _Nb; ++__i) {
+ static typename _Traits::int_type __eof = _Traits::eof();
+
+ typename _Traits::int_type __c1 = __buf->sbumpc();
+ if (_Traits::eq_int_type(__c1, __eof)) {
+ __is.setstate(ios_base::eofbit);
+ break;
+ }
+ else {
+ char __c2 = _Traits::to_char_type(__c1);
+ char __c = __is.narrow(__c2, '*');
+
+ if (__c == '0' || __c == '1')
+ __tmp.push_back(__c);
+ else if (_Traits::eq_int_type(__buf->sputbackc(__c2), __eof)) {
+ __is.setstate(ios_base::failbit);
+ break;
+ }
+ }
+ }
+
+ if (__tmp.empty())
+ __is.setstate(ios_base::failbit);
+ else
+ __x._M_copy_from_string(__tmp, __STATIC_CAST(size_t,0), _Nb);
+ }
+
+ return __is;
+}
+
+template <class _CharT, class _Traits, size_t _Nb>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const bitset<_Nb>& __x)
+{
+ basic_string<_CharT, _Traits> __tmp;
+ __x._M_copy_to_string(__tmp);
+ return __os << __tmp;
+}
+
+#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
+
+// (reg) For Watcom IO, this tells if ostream class is in .exe or in .dll
+template <size_t _Nb>
+_ISTREAM_DLL& _STLP_CALL
+operator>>(_ISTREAM_DLL& __is, bitset<_Nb>& __x) {
+ string __tmp;
+ __tmp.reserve(_Nb);
+
+ // In new templatized iostreams, use istream::sentry
+ if (__is.flags() & ios::skipws) {
+ char __c;
+ do
+ __is.get(__c);
+ while (__is && isspace(__c));
+ if (__is)
+ __is.putback(__c);
+ }
+
+ for (size_t __i = 0; __i < _Nb; ++__i) {
+ char __c;
+ __is.get(__c);
+
+ if (!__is)
+ break;
+ else if (__c != '0' && __c != '1') {
+ __is.putback(__c);
+ break;
+ }
+ else
+ __tmp.push_back(__c);
+ }
+
+ if (__tmp.empty())
+ __is.clear(__is.rdstate() | ios::failbit);
+ else
+ __x._M_copy_from_string(__tmp, __STATIC_CAST(size_t,0), _Nb);
+
+ return __is;
+}
+
+# endif /* _STLP_USE_NEW_IOSTREAMS */
+
+# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+// ------------------------------------------------------------
+// Lookup tables for find and count operations.
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template<class _Dummy>
+unsigned char _Bs_G<_Dummy>::_S_bit_count[256] = {
+# else
+unsigned char _Bs_G<bool>::_S_bit_count[256] _STLP_WEAK = {
+# endif
+ 0, /* 0 */ 1, /* 1 */ 1, /* 2 */ 2, /* 3 */ 1, /* 4 */
+ 2, /* 5 */ 2, /* 6 */ 3, /* 7 */ 1, /* 8 */ 2, /* 9 */
+ 2, /* 10 */ 3, /* 11 */ 2, /* 12 */ 3, /* 13 */ 3, /* 14 */
+ 4, /* 15 */ 1, /* 16 */ 2, /* 17 */ 2, /* 18 */ 3, /* 19 */
+ 2, /* 20 */ 3, /* 21 */ 3, /* 22 */ 4, /* 23 */ 2, /* 24 */
+ 3, /* 25 */ 3, /* 26 */ 4, /* 27 */ 3, /* 28 */ 4, /* 29 */
+ 4, /* 30 */ 5, /* 31 */ 1, /* 32 */ 2, /* 33 */ 2, /* 34 */
+ 3, /* 35 */ 2, /* 36 */ 3, /* 37 */ 3, /* 38 */ 4, /* 39 */
+ 2, /* 40 */ 3, /* 41 */ 3, /* 42 */ 4, /* 43 */ 3, /* 44 */
+ 4, /* 45 */ 4, /* 46 */ 5, /* 47 */ 2, /* 48 */ 3, /* 49 */
+ 3, /* 50 */ 4, /* 51 */ 3, /* 52 */ 4, /* 53 */ 4, /* 54 */
+ 5, /* 55 */ 3, /* 56 */ 4, /* 57 */ 4, /* 58 */ 5, /* 59 */
+ 4, /* 60 */ 5, /* 61 */ 5, /* 62 */ 6, /* 63 */ 1, /* 64 */
+ 2, /* 65 */ 2, /* 66 */ 3, /* 67 */ 2, /* 68 */ 3, /* 69 */
+ 3, /* 70 */ 4, /* 71 */ 2, /* 72 */ 3, /* 73 */ 3, /* 74 */
+ 4, /* 75 */ 3, /* 76 */ 4, /* 77 */ 4, /* 78 */ 5, /* 79 */
+ 2, /* 80 */ 3, /* 81 */ 3, /* 82 */ 4, /* 83 */ 3, /* 84 */
+ 4, /* 85 */ 4, /* 86 */ 5, /* 87 */ 3, /* 88 */ 4, /* 89 */
+ 4, /* 90 */ 5, /* 91 */ 4, /* 92 */ 5, /* 93 */ 5, /* 94 */
+ 6, /* 95 */ 2, /* 96 */ 3, /* 97 */ 3, /* 98 */ 4, /* 99 */
+ 3, /* 100 */ 4, /* 101 */ 4, /* 102 */ 5, /* 103 */ 3, /* 104 */
+ 4, /* 105 */ 4, /* 106 */ 5, /* 107 */ 4, /* 108 */ 5, /* 109 */
+ 5, /* 110 */ 6, /* 111 */ 3, /* 112 */ 4, /* 113 */ 4, /* 114 */
+ 5, /* 115 */ 4, /* 116 */ 5, /* 117 */ 5, /* 118 */ 6, /* 119 */
+ 4, /* 120 */ 5, /* 121 */ 5, /* 122 */ 6, /* 123 */ 5, /* 124 */
+ 6, /* 125 */ 6, /* 126 */ 7, /* 127 */ 1, /* 128 */ 2, /* 129 */
+ 2, /* 130 */ 3, /* 131 */ 2, /* 132 */ 3, /* 133 */ 3, /* 134 */
+ 4, /* 135 */ 2, /* 136 */ 3, /* 137 */ 3, /* 138 */ 4, /* 139 */
+ 3, /* 140 */ 4, /* 141 */ 4, /* 142 */ 5, /* 143 */ 2, /* 144 */
+ 3, /* 145 */ 3, /* 146 */ 4, /* 147 */ 3, /* 148 */ 4, /* 149 */
+ 4, /* 150 */ 5, /* 151 */ 3, /* 152 */ 4, /* 153 */ 4, /* 154 */
+ 5, /* 155 */ 4, /* 156 */ 5, /* 157 */ 5, /* 158 */ 6, /* 159 */
+ 2, /* 160 */ 3, /* 161 */ 3, /* 162 */ 4, /* 163 */ 3, /* 164 */
+ 4, /* 165 */ 4, /* 166 */ 5, /* 167 */ 3, /* 168 */ 4, /* 169 */
+ 4, /* 170 */ 5, /* 171 */ 4, /* 172 */ 5, /* 173 */ 5, /* 174 */
+ 6, /* 175 */ 3, /* 176 */ 4, /* 177 */ 4, /* 178 */ 5, /* 179 */
+ 4, /* 180 */ 5, /* 181 */ 5, /* 182 */ 6, /* 183 */ 4, /* 184 */
+ 5, /* 185 */ 5, /* 186 */ 6, /* 187 */ 5, /* 188 */ 6, /* 189 */
+ 6, /* 190 */ 7, /* 191 */ 2, /* 192 */ 3, /* 193 */ 3, /* 194 */
+ 4, /* 195 */ 3, /* 196 */ 4, /* 197 */ 4, /* 198 */ 5, /* 199 */
+ 3, /* 200 */ 4, /* 201 */ 4, /* 202 */ 5, /* 203 */ 4, /* 204 */
+ 5, /* 205 */ 5, /* 206 */ 6, /* 207 */ 3, /* 208 */ 4, /* 209 */
+ 4, /* 210 */ 5, /* 211 */ 4, /* 212 */ 5, /* 213 */ 5, /* 214 */
+ 6, /* 215 */ 4, /* 216 */ 5, /* 217 */ 5, /* 218 */ 6, /* 219 */
+ 5, /* 220 */ 6, /* 221 */ 6, /* 222 */ 7, /* 223 */ 3, /* 224 */
+ 4, /* 225 */ 4, /* 226 */ 5, /* 227 */ 4, /* 228 */ 5, /* 229 */
+ 5, /* 230 */ 6, /* 231 */ 4, /* 232 */ 5, /* 233 */ 5, /* 234 */
+ 6, /* 235 */ 5, /* 236 */ 6, /* 237 */ 6, /* 238 */ 7, /* 239 */
+ 4, /* 240 */ 5, /* 241 */ 5, /* 242 */ 6, /* 243 */ 5, /* 244 */
+ 6, /* 245 */ 6, /* 246 */ 7, /* 247 */ 5, /* 248 */ 6, /* 249 */
+ 6, /* 250 */ 7, /* 251 */ 6, /* 252 */ 7, /* 253 */ 7, /* 254 */
+ 8 /* 255 */
+}; // end _Bitset_global
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template<class _Dummy>
+unsigned char _Bs_G<_Dummy>::_S_first_one[256] = {
+# else
+unsigned char _Bs_G<bool>::_S_first_one[256] _STLP_WEAK = {
+# endif
+
+ 0, /* 0 */ 0, /* 1 */ 1, /* 2 */ 0, /* 3 */ 2, /* 4 */
+ 0, /* 5 */ 1, /* 6 */ 0, /* 7 */ 3, /* 8 */ 0, /* 9 */
+ 1, /* 10 */ 0, /* 11 */ 2, /* 12 */ 0, /* 13 */ 1, /* 14 */
+ 0, /* 15 */ 4, /* 16 */ 0, /* 17 */ 1, /* 18 */ 0, /* 19 */
+ 2, /* 20 */ 0, /* 21 */ 1, /* 22 */ 0, /* 23 */ 3, /* 24 */
+ 0, /* 25 */ 1, /* 26 */ 0, /* 27 */ 2, /* 28 */ 0, /* 29 */
+ 1, /* 30 */ 0, /* 31 */ 5, /* 32 */ 0, /* 33 */ 1, /* 34 */
+ 0, /* 35 */ 2, /* 36 */ 0, /* 37 */ 1, /* 38 */ 0, /* 39 */
+ 3, /* 40 */ 0, /* 41 */ 1, /* 42 */ 0, /* 43 */ 2, /* 44 */
+ 0, /* 45 */ 1, /* 46 */ 0, /* 47 */ 4, /* 48 */ 0, /* 49 */
+ 1, /* 50 */ 0, /* 51 */ 2, /* 52 */ 0, /* 53 */ 1, /* 54 */
+ 0, /* 55 */ 3, /* 56 */ 0, /* 57 */ 1, /* 58 */ 0, /* 59 */
+ 2, /* 60 */ 0, /* 61 */ 1, /* 62 */ 0, /* 63 */ 6, /* 64 */
+ 0, /* 65 */ 1, /* 66 */ 0, /* 67 */ 2, /* 68 */ 0, /* 69 */
+ 1, /* 70 */ 0, /* 71 */ 3, /* 72 */ 0, /* 73 */ 1, /* 74 */
+ 0, /* 75 */ 2, /* 76 */ 0, /* 77 */ 1, /* 78 */ 0, /* 79 */
+ 4, /* 80 */ 0, /* 81 */ 1, /* 82 */ 0, /* 83 */ 2, /* 84 */
+ 0, /* 85 */ 1, /* 86 */ 0, /* 87 */ 3, /* 88 */ 0, /* 89 */
+ 1, /* 90 */ 0, /* 91 */ 2, /* 92 */ 0, /* 93 */ 1, /* 94 */
+ 0, /* 95 */ 5, /* 96 */ 0, /* 97 */ 1, /* 98 */ 0, /* 99 */
+ 2, /* 100 */ 0, /* 101 */ 1, /* 102 */ 0, /* 103 */ 3, /* 104 */
+ 0, /* 105 */ 1, /* 106 */ 0, /* 107 */ 2, /* 108 */ 0, /* 109 */
+ 1, /* 110 */ 0, /* 111 */ 4, /* 112 */ 0, /* 113 */ 1, /* 114 */
+ 0, /* 115 */ 2, /* 116 */ 0, /* 117 */ 1, /* 118 */ 0, /* 119 */
+ 3, /* 120 */ 0, /* 121 */ 1, /* 122 */ 0, /* 123 */ 2, /* 124 */
+ 0, /* 125 */ 1, /* 126 */ 0, /* 127 */ 7, /* 128 */ 0, /* 129 */
+ 1, /* 130 */ 0, /* 131 */ 2, /* 132 */ 0, /* 133 */ 1, /* 134 */
+ 0, /* 135 */ 3, /* 136 */ 0, /* 137 */ 1, /* 138 */ 0, /* 139 */
+ 2, /* 140 */ 0, /* 141 */ 1, /* 142 */ 0, /* 143 */ 4, /* 144 */
+ 0, /* 145 */ 1, /* 146 */ 0, /* 147 */ 2, /* 148 */ 0, /* 149 */
+ 1, /* 150 */ 0, /* 151 */ 3, /* 152 */ 0, /* 153 */ 1, /* 154 */
+ 0, /* 155 */ 2, /* 156 */ 0, /* 157 */ 1, /* 158 */ 0, /* 159 */
+ 5, /* 160 */ 0, /* 161 */ 1, /* 162 */ 0, /* 163 */ 2, /* 164 */
+ 0, /* 165 */ 1, /* 166 */ 0, /* 167 */ 3, /* 168 */ 0, /* 169 */
+ 1, /* 170 */ 0, /* 171 */ 2, /* 172 */ 0, /* 173 */ 1, /* 174 */
+ 0, /* 175 */ 4, /* 176 */ 0, /* 177 */ 1, /* 178 */ 0, /* 179 */
+ 2, /* 180 */ 0, /* 181 */ 1, /* 182 */ 0, /* 183 */ 3, /* 184 */
+ 0, /* 185 */ 1, /* 186 */ 0, /* 187 */ 2, /* 188 */ 0, /* 189 */
+ 1, /* 190 */ 0, /* 191 */ 6, /* 192 */ 0, /* 193 */ 1, /* 194 */
+ 0, /* 195 */ 2, /* 196 */ 0, /* 197 */ 1, /* 198 */ 0, /* 199 */
+ 3, /* 200 */ 0, /* 201 */ 1, /* 202 */ 0, /* 203 */ 2, /* 204 */
+ 0, /* 205 */ 1, /* 206 */ 0, /* 207 */ 4, /* 208 */ 0, /* 209 */
+ 1, /* 210 */ 0, /* 211 */ 2, /* 212 */ 0, /* 213 */ 1, /* 214 */
+ 0, /* 215 */ 3, /* 216 */ 0, /* 217 */ 1, /* 218 */ 0, /* 219 */
+ 2, /* 220 */ 0, /* 221 */ 1, /* 222 */ 0, /* 223 */ 5, /* 224 */
+ 0, /* 225 */ 1, /* 226 */ 0, /* 227 */ 2, /* 228 */ 0, /* 229 */
+ 1, /* 230 */ 0, /* 231 */ 3, /* 232 */ 0, /* 233 */ 1, /* 234 */
+ 0, /* 235 */ 2, /* 236 */ 0, /* 237 */ 1, /* 238 */ 0, /* 239 */
+ 4, /* 240 */ 0, /* 241 */ 1, /* 242 */ 0, /* 243 */ 2, /* 244 */
+ 0, /* 245 */ 1, /* 246 */ 0, /* 247 */ 3, /* 248 */ 0, /* 249 */
+ 1, /* 250 */ 0, /* 251 */ 2, /* 252 */ 0, /* 253 */ 1, /* 254 */
+ 0, /* 255 */
+}; // end _Bitset_global
+
+# endif /* defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION) */
+
+_STLP_END_NAMESPACE
+
+# undef __BITS_PER_WORD
+# undef bitset
+
+#endif /* _STLP_BITSET_C */
diff --git a/src/STLport/stl/_bitset.h b/src/STLport/stl/_bitset.h
new file mode 100644
index 0000000..a2372fc
--- /dev/null
+++ b/src/STLport/stl/_bitset.h
@@ -0,0 +1,768 @@
+/*
+ * Copyright (c) 1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_BITSET_H
+#define _STLP_BITSET_H
+
+// A bitset of size N has N % (sizeof(unsigned long) * CHAR_BIT) unused
+// bits. (They are the high- order bits in the highest word.) It is
+// a class invariant of class bitset<> that those unused bits are
+// always zero.
+
+// Most of the actual code isn't contained in bitset<> itself, but in the
+// base class _Base_bitset. The base class works with whole words, not with
+// individual bits. This allows us to specialize _Base_bitset for the
+// important special case where the bitset is only a single word.
+
+// The C++ standard does not define the precise semantics of operator[].
+// In this implementation the const version of operator[] is equivalent
+// to test(), except that it does no range checking. The non-const version
+// returns a reference to a bit, again without doing any range checking.
+
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+# include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_UNINITIALIZED_H
+# include <stl/_uninitialized.h>
+# endif
+
+# ifndef _STLP_RANGE_ERRORS_H
+# include <stl/_range_errors.h>
+# endif
+
+# ifndef _STLP_STRING
+# include <string>
+# endif
+
+# ifndef _STLP_ISTREAM
+# include <istream>
+# endif
+
+#define __BITS_PER_WORD (CHAR_BIT*sizeof(unsigned long))
+#define __BITSET_WORDS(__n) ((__n + __BITS_PER_WORD - 1)/__BITS_PER_WORD)
+
+_STLP_BEGIN_NAMESPACE
+
+// structure to aid in counting bits
+template<class _Dummy>
+class _Bs_G {
+public:
+ static unsigned char _S_bit_count[256];
+ // Mapping from 8 bit unsigned integers to the index of the first one
+ // bit:
+ static unsigned char _S_first_one[256];
+};
+
+//
+// Base class: general case.
+//
+
+template<size_t _Nw>
+struct _Base_bitset {
+ typedef unsigned long _WordT;
+
+ _WordT _M_w[_Nw]; // 0 is the least significant word.
+
+ _Base_bitset( void ) { _M_do_reset(); }
+
+ _Base_bitset(unsigned long __val) {
+ _M_do_reset();
+ _M_w[0] = __val;
+ }
+
+ static size_t _STLP_CALL _S_whichword( size_t __pos ) {
+ return __pos / __BITS_PER_WORD;
+ }
+ static size_t _STLP_CALL _S_whichbyte( size_t __pos ) {
+ return (__pos % __BITS_PER_WORD) / CHAR_BIT;
+ }
+ static size_t _STLP_CALL _S_whichbit( size_t __pos ) {
+ return __pos % __BITS_PER_WORD;
+ }
+ static _WordT _STLP_CALL _S_maskbit( size_t __pos ) {
+ return __STATIC_CAST(_WordT,1) << _S_whichbit(__pos);
+ }
+
+ _WordT& _M_getword(size_t __pos) { return _M_w[_S_whichword(__pos)]; }
+ _WordT _M_getword(size_t __pos) const { return _M_w[_S_whichword(__pos)]; }
+
+ _WordT& _M_hiword() { return _M_w[_Nw - 1]; }
+ _WordT _M_hiword() const { return _M_w[_Nw - 1]; }
+
+ void _M_do_and(const _Base_bitset<_Nw>& __x) {
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _M_w[__i] &= __x._M_w[__i];
+ }
+ }
+
+ void _M_do_or(const _Base_bitset<_Nw>& __x) {
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _M_w[__i] |= __x._M_w[__i];
+ }
+ }
+
+ void _M_do_xor(const _Base_bitset<_Nw>& __x) {
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _M_w[__i] ^= __x._M_w[__i];
+ }
+ }
+
+ void _M_do_left_shift(size_t __shift);
+
+ void _M_do_right_shift(size_t __shift);
+
+ void _M_do_flip() {
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _M_w[__i] = ~_M_w[__i];
+ }
+ }
+
+ void _M_do_set() {
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _M_w[__i] = ~__STATIC_CAST(_WordT,0);
+ }
+ }
+
+
+ void _M_do_reset() { memset(_M_w, 0, _Nw * sizeof(_WordT)); }
+
+ bool _M_is_equal(const _Base_bitset<_Nw>& __x) const {
+ for (size_t __i = 0; __i < _Nw; ++__i) {
+ if (_M_w[__i] != __x._M_w[__i])
+ return false;
+ }
+ return true;
+ }
+
+ bool _M_is_any() const {
+ for ( size_t __i = 0; __i < _Nw ; __i++ ) {
+ if ( _M_w[__i] != __STATIC_CAST(_WordT,0) )
+ return true;
+ }
+ return false;
+ }
+
+ size_t _M_do_count() const {
+ size_t __result = 0;
+ const unsigned char* __byte_ptr = (const unsigned char*)_M_w;
+ const unsigned char* __end_ptr = (const unsigned char*)(_M_w+_Nw);
+
+ while ( __byte_ptr < __end_ptr ) {
+ __result += _Bs_G<bool>::_S_bit_count[*__byte_ptr];
+ __byte_ptr++;
+ }
+ return __result;
+ }
+
+ unsigned long _M_do_to_ulong() const;
+
+ // find first "on" bit
+ size_t _M_do_find_first(size_t __not_found) const;
+
+ // find the next "on" bit that follows "prev"
+ size_t _M_do_find_next(size_t __prev, size_t __not_found) const;
+};
+
+//
+// Base class: specialization for a single word.
+//
+
+_STLP_TEMPLATE_NULL
+struct _Base_bitset<1UL> {
+ typedef unsigned long _WordT;
+ typedef _Base_bitset<1UL> _Self;
+
+ _WordT _M_w;
+
+ _Base_bitset( void ) : _M_w(0) {}
+ _Base_bitset(unsigned long __val) : _M_w(__val) {}
+
+ static size_t _STLP_CALL _S_whichword( size_t __pos ) {
+ return __pos / __BITS_PER_WORD ;
+ }
+ static size_t _STLP_CALL _S_whichbyte( size_t __pos ) {
+ return (__pos % __BITS_PER_WORD) / CHAR_BIT;
+ }
+ static size_t _STLP_CALL _S_whichbit( size_t __pos ) {
+ return __pos % __BITS_PER_WORD;
+ }
+ static _WordT _STLP_CALL _S_maskbit( size_t __pos ) {
+ return (__STATIC_CAST(_WordT,1)) << _S_whichbit(__pos);
+ }
+
+ _WordT& _M_getword(size_t) { return _M_w; }
+ _WordT _M_getword(size_t) const { return _M_w; }
+
+ _WordT& _M_hiword() { return _M_w; }
+ _WordT _M_hiword() const { return _M_w; }
+
+
+ void _M_do_and(const _Self& __x) { _M_w &= __x._M_w; }
+ void _M_do_or(const _Self& __x) { _M_w |= __x._M_w; }
+ void _M_do_xor(const _Self& __x) { _M_w ^= __x._M_w; }
+ void _M_do_left_shift(size_t __shift) { _M_w <<= __shift; }
+ void _M_do_right_shift(size_t __shift) { _M_w >>= __shift; }
+ void _M_do_flip() { _M_w = ~_M_w; }
+ void _M_do_set() { _M_w = ~__STATIC_CAST(_WordT,0); }
+ void _M_do_reset() { _M_w = 0; }
+
+ bool _M_is_equal(const _Self& __x) const {
+ return _M_w == __x._M_w;
+ }
+ bool _M_is_any() const {
+ return _M_w != 0;
+ }
+
+ size_t _M_do_count() const {
+ size_t __result = 0;
+ const unsigned char* __byte_ptr = (const unsigned char*)&_M_w;
+ const unsigned char* __end_ptr = ((const unsigned char*)&_M_w)+sizeof(_M_w);
+ while ( __byte_ptr < __end_ptr ) {
+ __result += _Bs_G<bool>::_S_bit_count[*__byte_ptr];
+ __byte_ptr++;
+ }
+ return __result;
+ }
+
+ unsigned long _M_do_to_ulong() const { return _M_w; }
+
+ inline size_t _M_do_find_first(size_t __not_found) const;
+
+ // find the next "on" bit that follows "prev"
+ inline size_t _M_do_find_next(size_t __prev, size_t __not_found) const;
+
+};
+
+
+// ------------------------------------------------------------
+//
+// Definitions of should-be-non-inline functions from the single-word version of
+// _Base_bitset.
+//
+
+inline size_t
+_Base_bitset<1UL>::_M_do_find_first(size_t __not_found) const
+{
+ // typedef unsigned long _WordT;
+ _WordT __thisword = _M_w;
+
+ if ( __thisword != __STATIC_CAST(_WordT,0) ) {
+ // find byte within word
+ for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) {
+ unsigned char __this_byte
+ = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0)));
+ if ( __this_byte )
+ return __j*CHAR_BIT + _Bs_G<bool>::_S_first_one[__this_byte];
+
+ __thisword >>= CHAR_BIT;
+ }
+ }
+ // not found, so return a value that indicates failure.
+ return __not_found;
+}
+
+inline size_t
+_Base_bitset<1UL>::_M_do_find_next(size_t __prev,
+ size_t __not_found ) const
+{
+ // make bound inclusive
+ ++__prev;
+
+ // check out of bounds
+ if ( __prev >= __BITS_PER_WORD )
+ return __not_found;
+
+ // search first (and only) word
+ _WordT __thisword = _M_w;
+
+ // mask off bits below bound
+ __thisword &= (~__STATIC_CAST(_WordT,0)) << _S_whichbit(__prev);
+
+ if ( __thisword != __STATIC_CAST(_WordT,0) ) {
+ // find byte within word
+ // get first byte into place
+ __thisword >>= _S_whichbyte(__prev) * CHAR_BIT;
+ for ( size_t __j = _S_whichbyte(__prev); __j < sizeof(_WordT); __j++ ) {
+ unsigned char __this_byte
+ = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0)));
+ if ( __this_byte )
+ return __j*CHAR_BIT + _Bs_G<bool>::_S_first_one[__this_byte];
+
+ __thisword >>= CHAR_BIT;
+ }
+ }
+
+ // not found, so return a value that indicates failure.
+ return __not_found;
+} // end _M_do_find_next
+
+
+// ------------------------------------------------------------
+// Helper class to zero out the unused high-order bits in the highest word.
+
+template <size_t _Extrabits> struct _Sanitize {
+ static void _STLP_CALL _M_do_sanitize(unsigned long& __val)
+ { __val &= ~((~__STATIC_CAST(unsigned long,0)) << _Extrabits); }
+};
+
+_STLP_TEMPLATE_NULL struct _Sanitize<0UL> {
+ static void _STLP_CALL _M_do_sanitize(unsigned long) {}
+};
+
+// ------------------------------------------------------------
+// Class bitset.
+// _Nb may be any nonzero number of type size_t.
+
+
+template<size_t _Nb>
+class bitset : public _Base_bitset<__BITSET_WORDS(_Nb) >
+{
+public:
+ enum { _Words = __BITSET_WORDS(_Nb) } ;
+
+private:
+ typedef _Base_bitset< _Words > _Base;
+
+ void _M_do_sanitize() {
+ _Sanitize<_Nb%__BITS_PER_WORD >::_M_do_sanitize(this->_M_hiword());
+ }
+public:
+ typedef unsigned long _WordT;
+ struct reference;
+ friend struct reference;
+
+ // bit reference:
+ struct reference {
+ typedef _Base_bitset<_Words > _Bitset_base;
+ typedef bitset<_Nb> _Bitset;
+ // friend _Bitset;
+ _WordT *_M_wp;
+ size_t _M_bpos;
+
+ // should be left undefined
+ reference() {}
+
+ reference( _Bitset& __b, size_t __pos ) {
+ _M_wp = &__b._M_getword(__pos);
+ _M_bpos = _Bitset_base::_S_whichbit(__pos);
+ }
+
+ public:
+ ~reference() {}
+
+ // for b[i] = __x;
+ reference& operator=(bool __x) {
+ if ( __x )
+ *_M_wp |= _Bitset_base::_S_maskbit(_M_bpos);
+ else
+ *_M_wp &= ~_Bitset_base::_S_maskbit(_M_bpos);
+
+ return *this;
+ }
+
+ // for b[i] = b[__j];
+ reference& operator=(const reference& __j) {
+ if ( (*(__j._M_wp) & _Bitset_base::_S_maskbit(__j._M_bpos)) )
+ *_M_wp |= _Bitset_base::_S_maskbit(_M_bpos);
+ else
+ *_M_wp &= ~_Bitset_base::_S_maskbit(_M_bpos);
+
+ return *this;
+ }
+
+ // flips the bit
+ bool operator~() const { return (*(_M_wp) & _Bitset_base::_S_maskbit(_M_bpos)) == 0; }
+
+ // for __x = b[i];
+ operator bool() const { return (*(_M_wp) & _Bitset_base::_S_maskbit(_M_bpos)) != 0; }
+
+ // for b[i].flip();
+ reference& flip() {
+ *_M_wp ^= _Bitset_base::_S_maskbit(_M_bpos);
+ return *this;
+ }
+ };
+
+ // 23.3.5.1 constructors:
+ bitset() {}
+
+ bitset(unsigned long __val) : _Base_bitset<_Words>(__val) { _M_do_sanitize(); }
+
+# ifdef _STLP_MEMBER_TEMPLATES
+ template<class _CharT, class _Traits, class _Alloc>
+ explicit bitset(const basic_string<_CharT,_Traits,_Alloc>& __s,
+ size_t __pos = 0)
+ : _Base_bitset<_Words >()
+ {
+ if (__pos > __s.size())
+ __stl_throw_out_of_range("bitset");
+ _M_copy_from_string(__s, __pos,
+ basic_string<_CharT, _Traits, _Alloc>::npos);
+ }
+ template<class _CharT, class _Traits, class _Alloc>
+ bitset(const basic_string<_CharT, _Traits, _Alloc>& __s,
+ size_t __pos,
+ size_t __n)
+ : _Base_bitset<_Words >()
+ {
+ if (__pos > __s.size())
+ __stl_throw_out_of_range("bitset");
+ _M_copy_from_string(__s, __pos, __n);
+ }
+#else /* _STLP_MEMBER_TEMPLATES */
+ explicit bitset(const string& __s,
+ size_t __pos = 0,
+ size_t __n = (size_t)-1)
+ : _Base_bitset<_Words >()
+ {
+ if (__pos > __s.size())
+ __stl_throw_out_of_range("bitset");
+ _M_copy_from_string(__s, __pos, __n);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ // 23.3.5.2 bitset operations:
+ bitset<_Nb>& operator&=(const bitset<_Nb>& __rhs) {
+ this->_M_do_and(__rhs);
+ return *this;
+ }
+
+ bitset<_Nb>& operator|=(const bitset<_Nb>& __rhs) {
+ this->_M_do_or(__rhs);
+ return *this;
+ }
+
+ bitset<_Nb>& operator^=(const bitset<_Nb>& __rhs) {
+ this->_M_do_xor(__rhs);
+ return *this;
+ }
+
+ bitset<_Nb>& operator<<=(size_t __pos) {
+ this->_M_do_left_shift(__pos);
+ this->_M_do_sanitize();
+ return *this;
+ }
+
+ bitset<_Nb>& operator>>=(size_t __pos) {
+ this->_M_do_right_shift(__pos);
+ this->_M_do_sanitize();
+ return *this;
+ }
+
+ //
+ // Extension:
+ // Versions of single-bit set, reset, flip, test with no range checking.
+ //
+
+ bitset<_Nb>& _Unchecked_set(size_t __pos) {
+ this->_M_getword(__pos) |= _Base_bitset<_Words > ::_S_maskbit(__pos);
+ return *this;
+ }
+
+ bitset<_Nb>& _Unchecked_set(size_t __pos, int __val) {
+ if (__val)
+ this->_M_getword(__pos) |= this->_S_maskbit(__pos);
+ else
+ this->_M_getword(__pos) &= ~ this->_S_maskbit(__pos);
+
+ return *this;
+ }
+
+ bitset<_Nb>& _Unchecked_reset(size_t __pos) {
+ this->_M_getword(__pos) &= ~ this->_S_maskbit(__pos);
+ return *this;
+ }
+
+ bitset<_Nb>& _Unchecked_flip(size_t __pos) {
+ this->_M_getword(__pos) ^= this->_S_maskbit(__pos);
+ return *this;
+ }
+
+ bool _Unchecked_test(size_t __pos) const {
+ return (this->_M_getword(__pos) & this->_S_maskbit(__pos)) != __STATIC_CAST(_WordT,0);
+ }
+
+ // Set, reset, and flip.
+
+ bitset<_Nb>& set() {
+ this->_M_do_set();
+ this->_M_do_sanitize();
+ return *this;
+ }
+
+ bitset<_Nb>& set(size_t __pos) {
+ if (__pos >= _Nb)
+ __stl_throw_out_of_range("bitset");
+ return _Unchecked_set(__pos);
+ }
+
+ bitset<_Nb>& set(size_t __pos, int __val) {
+ if (__pos >= _Nb)
+ __stl_throw_out_of_range("bitset");
+ return _Unchecked_set(__pos, __val);
+ }
+
+ bitset<_Nb>& reset() {
+ this->_M_do_reset();
+ return *this;
+ }
+
+ bitset<_Nb>& reset(size_t __pos) {
+ if (__pos >= _Nb)
+ __stl_throw_out_of_range("bitset");
+
+ return _Unchecked_reset(__pos);
+ }
+
+ bitset<_Nb>& flip() {
+ this->_M_do_flip();
+ this->_M_do_sanitize();
+ return *this;
+ }
+
+ bitset<_Nb>& flip(size_t __pos) {
+ if (__pos >= _Nb)
+ __stl_throw_out_of_range("bitset");
+
+ return _Unchecked_flip(__pos);
+ }
+
+ bitset<_Nb> operator~() const {
+ return bitset<_Nb>(*this).flip();
+ }
+
+ // element access:
+ //for b[i];
+ reference operator[](size_t __pos) { return reference(*this,__pos); }
+ bool operator[](size_t __pos) const { return _Unchecked_test(__pos); }
+
+ unsigned long to_ulong() const { return this->_M_do_to_ulong(); }
+
+#if defined (_STLP_MEMBER_TEMPLATES) && ! defined (_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS)
+ template <class _CharT, class _Traits, class _Alloc>
+ basic_string<_CharT, _Traits, _Alloc> to_string() const {
+ basic_string<_CharT, _Traits, _Alloc> __result;
+ _M_copy_to_string(__result);
+ return __result;
+ }
+#else
+ string to_string() const {
+ string __result;
+ _M_copy_to_string(__result);
+ return __result;
+ }
+#endif /* _STLP_EXPLICIT_FUNCTION_TMPL_ARGS */
+
+ size_t count() const { return this->_M_do_count(); }
+
+ size_t size() const { return _Nb; }
+
+ bool operator==(const bitset<_Nb>& __rhs) const {
+ return this->_M_is_equal(__rhs);
+ }
+ bool operator!=(const bitset<_Nb>& __rhs) const {
+ return !this->_M_is_equal(__rhs);
+ }
+
+ bool test(size_t __pos) const {
+ if (__pos >= _Nb)
+ __stl_throw_out_of_range("bitset");
+
+ return _Unchecked_test(__pos);
+ }
+
+ bool any() const { return this->_M_is_any(); }
+ bool none() const { return !this->_M_is_any(); }
+
+ bitset<_Nb> operator<<(size_t __pos) const {
+ bitset<_Nb> __result(*this);
+ __result <<= __pos ; return __result;
+ }
+ bitset<_Nb> operator>>(size_t __pos) const {
+ bitset<_Nb> __result(*this);
+ __result >>= __pos ; return __result;
+ }
+
+ //
+ // EXTENSIONS: bit-find operations. These operations are
+ // experimental, and are subject to change or removal in future
+ // versions.
+ //
+
+ // find the index of the first "on" bit
+ size_t _Find_first() const
+ { return this->_M_do_find_first(_Nb); }
+
+ // find the index of the next "on" bit after prev
+ size_t _Find_next( size_t __prev ) const
+ { return this->_M_do_find_next(__prev, _Nb); }
+
+//
+// Definitions of should-be non-inline member functions.
+//
+# if defined (_STLP_MEMBER_TEMPLATES)
+ template<class _CharT, class _Traits, class _Alloc>
+ void _M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s,
+ size_t __pos,
+ size_t __n) {
+#else
+ void _M_copy_from_string(const string& __s,
+ size_t __pos,
+ size_t __n) {
+ typedef char_traits<char> _Traits;
+#endif
+ reset();
+ size_t __tmp = _Nb;
+ const size_t __Nbits = (min) (__tmp, (min) (__n, __s.size() - __pos));
+ for ( size_t __i= 0; __i < __Nbits; ++__i) {
+ typename _Traits::int_type __k = _Traits::to_int_type(__s[__pos + __Nbits - __i - 1]);
+ // boris : widen() ?
+ if (__k == '1')
+ set(__i);
+ else if (__k !='0')
+ __stl_throw_invalid_argument("bitset");
+ }
+ }
+
+# if defined (_STLP_MEMBER_TEMPLATES)
+ template <class _CharT, class _Traits, class _Alloc>
+ void _M_copy_to_string(basic_string<_CharT, _Traits, _Alloc>& __s) const
+# else
+ void _M_copy_to_string(string& __s) const
+# endif
+ {
+ __s.assign(_Nb, '0');
+
+ for (size_t __i = 0; __i < _Nb; ++__i)
+ if (_Unchecked_test(__i))
+ __s[_Nb - 1 - __i] = '1';
+ }
+
+# if defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
+ bitset<_Nb> operator&(const bitset<_Nb>& __y) const {
+ bitset<_Nb> __result(*this);
+ __result &= __y;
+ return __result;
+ }
+ bitset<_Nb> operator|(const bitset<_Nb>& __y) const {
+ bitset<_Nb> __result(*this);
+ __result |= __y;
+ return __result;
+ }
+ bitset<_Nb> operator^(const bitset<_Nb>& __y) const {
+ bitset<_Nb> __result(*this);
+ __result ^= __y;
+ return __result;
+ }
+# endif
+
+};
+
+// ------------------------------------------------------------
+//
+// 23.3.5.3 bitset operations:
+//
+
+# if ! defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
+
+template <size_t _Nb>
+inline bitset<_Nb> _STLP_CALL
+operator&(const bitset<_Nb>& __x,
+ const bitset<_Nb>& __y) {
+ bitset<_Nb> __result(__x);
+ __result &= __y;
+ return __result;
+}
+
+
+template <size_t _Nb>
+inline bitset<_Nb> _STLP_CALL
+operator|(const bitset<_Nb>& __x,
+ const bitset<_Nb>& __y) {
+ bitset<_Nb> __result(__x);
+ __result |= __y;
+ return __result;
+}
+
+template <size_t _Nb>
+inline bitset<_Nb> _STLP_CALL
+operator^(const bitset<_Nb>& __x,
+ const bitset<_Nb>& __y) {
+ bitset<_Nb> __result(__x);
+ __result ^= __y;
+ return __result;
+}
+
+#if defined ( _STLP_USE_NEW_IOSTREAMS )
+
+template <class _CharT, class _Traits, size_t _Nb>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x);
+
+
+template <class _CharT, class _Traits, size_t _Nb>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Nb>& __x);
+
+#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
+
+// (reg) For Watcom IO, this tells if ostream class is in .exe or in .dll
+template <size_t _Nb>
+_ISTREAM_DLL& _STLP_CALL
+operator>>(_ISTREAM_DLL& __is, bitset<_Nb>& __x);
+
+template <size_t _Nb>
+inline _OSTREAM_DLL& _STLP_CALL operator<<(_OSTREAM_DLL& __os, const bitset<_Nb>& __x) {
+ string __tmp;
+ __x._M_copy_to_string(__tmp);
+ return __os << __tmp;
+}
+
+#endif
+
+# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+
+# undef bitset
+
+
+_STLP_END_NAMESPACE
+
+# undef __BITS_PER_WORD
+# undef __BITSET_WORDS
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_bitset.c>
+# endif
+
+#endif /* _STLP_BITSET_H */
+
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_bvector.h b/src/STLport/stl/_bvector.h
new file mode 100644
index 0000000..8aed5cd
--- /dev/null
+++ b/src/STLport/stl/_bvector.h
@@ -0,0 +1,807 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_BVECTOR_H
+#define _STLP_INTERNAL_BVECTOR_H
+
+#ifndef _STLP_INTERNAL_VECTOR_H
+# include <stl/_vector.h>
+# endif
+
+#define __WORD_BIT (int(CHAR_BIT*sizeof(unsigned int)))
+
+_STLP_BEGIN_NAMESPACE
+
+struct _Bit_reference {
+ unsigned int* _M_p;
+ unsigned int _M_mask;
+ _Bit_reference(unsigned int* __x, unsigned int __y)
+ : _M_p(__x), _M_mask(__y) {}
+
+public:
+ _Bit_reference() : _M_p(0), _M_mask(0) {}
+
+ operator bool() const {
+ return !(!(*_M_p & _M_mask));
+ }
+ _Bit_reference& operator=(bool __x) {
+ if (__x) *_M_p |= _M_mask;
+ else *_M_p &= ~_M_mask;
+ return *this;
+ }
+ _Bit_reference& operator=(const _Bit_reference& __x) {
+ return *this = bool(__x);
+ }
+ bool operator==(const _Bit_reference& __x) const {
+ return bool(*this) == bool(__x);
+ }
+ bool operator<(const _Bit_reference& __x) const {
+ return !bool(*this) && bool(__x);
+ }
+
+ _Bit_reference& operator |= (bool __x) {
+ if (__x)
+ *_M_p |= _M_mask;
+ return *this;
+ }
+ _Bit_reference& operator &= (bool __x) {
+ if (!__x)
+ *_M_p &= ~_M_mask;
+ return *this;
+ }
+ void flip() { *_M_p ^= _M_mask; }
+};
+
+
+inline void swap(_Bit_reference& __x, _Bit_reference& __y)
+{
+ bool __tmp = (bool)__x;
+ __x = __y;
+ __y = __tmp;
+}
+
+struct _Bit_iterator_base;
+
+struct _Bit_iterator_base
+{
+ typedef ptrdiff_t difference_type;
+
+ unsigned int* _M_p;
+ unsigned int _M_offset;
+
+ void _M_bump_up() {
+ if (_M_offset++ == __WORD_BIT - 1) {
+ _M_offset = 0;
+ ++_M_p;
+ }
+ }
+
+ void _M_bump_down() {
+ if (_M_offset-- == 0) {
+ _M_offset = __WORD_BIT - 1;
+ --_M_p;
+ }
+ }
+
+ _Bit_iterator_base() : _M_p(0), _M_offset(0) {}
+ _Bit_iterator_base(unsigned int* __x, unsigned int __y) : _M_p(__x), _M_offset(__y) {}
+ // _Bit_iterator_base( const _Bit_iterator_base& __x) : _M_p(__x._M_p), _M_offset(__x._M_offset) {}
+ // _Bit_iterator_base& operator = ( const _Bit_iterator_base& __x) { _M_p = __x._M_p ; _M_offset = __x._M_offset ; return *this; }
+
+ void _M_advance (difference_type __i) {
+ difference_type __n = __i + _M_offset;
+ _M_p += __n / __WORD_BIT;
+ __n = __n % __WORD_BIT;
+ if (__n < 0) {
+ _M_offset = (unsigned int) __n + __WORD_BIT;
+ --_M_p;
+ } else
+ _M_offset = (unsigned int) __n;
+ }
+
+ difference_type _M_subtract(const _Bit_iterator_base& __x) const {
+ return __WORD_BIT * (_M_p - __x._M_p) + _M_offset - __x._M_offset;
+ }
+};
+
+inline bool _STLP_CALL operator==(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
+ return __y._M_p == __x._M_p && __y._M_offset == __x._M_offset;
+}
+inline bool _STLP_CALL operator!=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
+ return __y._M_p != __x._M_p || __y._M_offset != __x._M_offset;
+}
+
+inline bool _STLP_CALL operator<(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
+ return __x._M_p < __y._M_p || (__x._M_p == __y._M_p && __x._M_offset < __y._M_offset);
+}
+
+inline bool _STLP_CALL operator>(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
+ return operator <(__y , __x);
+}
+inline bool _STLP_CALL operator<=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
+ return !(__y < __x);
+}
+inline bool _STLP_CALL operator>=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
+ return !(__x < __y);
+}
+
+template <class _Ref, class _Ptr>
+struct _Bit_iter : public _Bit_iterator_base
+{
+ typedef _Ref reference;
+ typedef _Ptr pointer;
+ typedef _Bit_iter<_Ref, _Ptr> _Self;
+ typedef random_access_iterator_tag iterator_category;
+ typedef bool value_type;
+ typedef ptrdiff_t difference_type;
+ typedef size_t size_type;
+
+ _Bit_iter(unsigned int* __x, unsigned int __y) : _Bit_iterator_base(__x, __y) {}
+ _Bit_iter() {}
+
+ _Bit_iter(const _Bit_iter<_Bit_reference, _Bit_reference*>& __x):
+ _Bit_iterator_base((const _Bit_iterator_base&)__x) {}
+
+ // _Self& operator = (const _Bit_iter<_Bit_reference, _Bit_reference*>& __x)
+ // { (_Bit_iterator_base&)*this = (const _Bit_iterator_base&)__x; return *this; }
+
+ reference operator*() const {
+ return _Bit_reference(_M_p, 1UL << _M_offset);
+ }
+ _Self& operator++() {
+ _M_bump_up();
+ return *this;
+ }
+ _Self operator++(int) {
+ _Self __tmp = *this;
+ _M_bump_up();
+ return __tmp;
+ }
+ _Self& operator--() {
+ _M_bump_down();
+ return *this;
+ }
+ _Self operator--(int) {
+ _Self __tmp = *this;
+ _M_bump_down();
+ return __tmp;
+ }
+ _Self& operator+=(difference_type __i) {
+ _M_advance(__i);
+ return *this;
+ }
+ _Self& operator-=(difference_type __i) {
+ *this += -__i;
+ return *this;
+ }
+ _Self operator+(difference_type __i) const {
+ _Self __tmp = *this;
+ return __tmp += __i;
+ }
+ _Self operator-(difference_type __i) const {
+ _Self __tmp = *this;
+ return __tmp -= __i;
+ }
+ difference_type operator-(const _Self& __x) const {
+ return _M_subtract(__x);
+ }
+ reference operator[](difference_type __i) { return *(*this + __i); }
+};
+
+template <class _Ref, class _Ptr>
+inline _Bit_iter<_Ref,_Ptr> _STLP_CALL
+operator+(ptrdiff_t __n, const _Bit_iter<_Ref, _Ptr>& __x) {
+ return __x + __n;
+}
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+inline random_access_iterator_tag iterator_category(const _Bit_iterator_base&) {return random_access_iterator_tag();}
+inline ptrdiff_t* distance_type(const _Bit_iterator_base&) {return (ptrdiff_t*)0;}
+inline bool* value_type(const _Bit_iter<_Bit_reference, _Bit_reference*>&) {return (bool*)0;}
+inline bool* value_type(const _Bit_iter<bool, const bool*>&) {return (bool*)0;}
+# endif
+
+typedef _Bit_iter<bool, const bool*> _Bit_const_iterator;
+typedef _Bit_iter<_Bit_reference, _Bit_reference*> _Bit_iterator;
+
+// Bit-vector base class, which encapsulates the difference between
+// old SGI-style allocators and standard-conforming allocators.
+
+
+template <class _Alloc>
+class _Bvector_base
+{
+public:
+ _STLP_FORCE_ALLOCATORS(bool, _Alloc)
+ typedef typename _Alloc_traits<bool, _Alloc>::allocator_type allocator_type;
+ typedef unsigned int __chunk_type;
+ typedef typename _Alloc_traits<__chunk_type,
+ _Alloc>::allocator_type __chunk_allocator_type;
+ allocator_type get_allocator() const {
+ return _STLP_CONVERT_ALLOCATOR((const __chunk_allocator_type&)_M_end_of_storage, bool);
+ }
+ static allocator_type __get_dfl_allocator() { return allocator_type(); }
+
+ _Bvector_base(const allocator_type& __a)
+ : _M_start(), _M_finish(), _M_end_of_storage(_STLP_CONVERT_ALLOCATOR(__a, __chunk_type),
+ (__chunk_type*)0) {
+ }
+ ~_Bvector_base() { _M_deallocate();
+ }
+
+protected:
+
+ unsigned int* _M_bit_alloc(size_t __n)
+ { return _M_end_of_storage.allocate((__n + __WORD_BIT - 1)/__WORD_BIT); }
+ void _M_deallocate() {
+ if (_M_start._M_p)
+ _M_end_of_storage.deallocate(_M_start._M_p,
+ _M_end_of_storage._M_data - _M_start._M_p);
+ }
+
+ _Bit_iterator _M_start;
+ _Bit_iterator _M_finish;
+ _STLP_alloc_proxy<__chunk_type*, __chunk_type, __chunk_allocator_type> _M_end_of_storage;
+};
+
+
+// The next few lines are confusing. What we're doing is declaring a
+// partial specialization of vector<T, Alloc> if we have the necessary
+// compiler support. Otherwise, we define a class bit_vector which uses
+// the default allocator.
+
+#if defined(_STLP_CLASS_PARTIAL_SPECIALIZATION) && ! defined(_STLP_NO_BOOL) && ! defined (__SUNPRO_CC)
+# define _STLP_VECBOOL_TEMPLATE
+# define __BVEC_TMPL_HEADER template <class _Alloc>
+#else
+# undef _STLP_VECBOOL_TEMPLATE
+# ifdef _STLP_NO_BOOL
+# define __BVEC_TMPL_HEADER
+# else
+# define __BVEC_TMPL_HEADER _STLP_TEMPLATE_NULL
+# endif
+# if !(defined(__MRC__)||(defined(__SC__)&&!defined(__DMC__))) //*TY 12/17/2000 -
+# define _Alloc _STLP_DEFAULT_ALLOCATOR(bool)
+# else
+# define _Alloc allocator<bool>
+# endif
+#endif
+
+#ifdef _STLP_NO_BOOL
+# define __BVECTOR_QUALIFIED bit_vector
+# define __BVECTOR bit_vector
+#else
+# ifdef _STLP_VECBOOL_TEMPLATE
+# define __BVECTOR_QUALIFIED __WORKAROUND_DBG_RENAME(vector) <bool, _Alloc>
+# else
+# define __BVECTOR_QUALIFIED __WORKAROUND_DBG_RENAME(vector) <bool, allocator<bool> >
+# endif
+#if defined (_STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS)
+# define __BVECTOR __BVECTOR_QUALIFIED
+#else
+# define __BVECTOR __WORKAROUND_DBG_RENAME(vector)
+#endif
+#endif
+
+
+__BVEC_TMPL_HEADER
+class __BVECTOR_QUALIFIED : public _Bvector_base<_Alloc >
+{
+ typedef _Bvector_base<_Alloc > _Base;
+ typedef __BVECTOR_QUALIFIED _Self;
+public:
+ typedef bool value_type;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Bit_reference reference;
+ typedef bool const_reference;
+ typedef _Bit_reference* pointer;
+ typedef const bool* const_pointer;
+ typedef random_access_iterator_tag _Iterator_category;
+
+ typedef _Bit_iterator iterator;
+ typedef _Bit_const_iterator const_iterator;
+
+#if defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION )
+ typedef _STLP_STD::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef _STLP_STD::reverse_iterator<iterator> reverse_iterator;
+#else /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+# if defined (_STLP_MSVC50_COMPATIBILITY)
+ typedef _STLP_STD::reverse_iterator<const_iterator, value_type, const_reference,
+ const_pointer, difference_type> const_reverse_iterator;
+ typedef _STLP_STD::reverse_iterator<iterator, value_type, reference, reference*,
+ difference_type> reverse_iterator;
+# else
+ typedef _STLP_STD::reverse_iterator<const_iterator, value_type, const_reference,
+ difference_type> const_reverse_iterator;
+ typedef _STLP_STD::reverse_iterator<iterator, value_type, reference, difference_type>
+ reverse_iterator;
+# endif
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+# ifdef _STLP_VECBOOL_TEMPLATE
+ typedef typename _Bvector_base<_Alloc >::allocator_type allocator_type;
+ typedef typename _Bvector_base<_Alloc >::__chunk_type __chunk_type ;
+# else
+ typedef _Bvector_base<_Alloc >::allocator_type allocator_type;
+ typedef _Bvector_base<_Alloc >::__chunk_type __chunk_type ;
+# endif
+
+protected:
+
+ void _M_initialize(size_type __n) {
+ unsigned int* __q = this->_M_bit_alloc(__n);
+ this->_M_end_of_storage._M_data = __q + (__n + __WORD_BIT - 1)/__WORD_BIT;
+ this->_M_start = iterator(__q, 0);
+ this->_M_finish = this->_M_start + difference_type(__n);
+ }
+ void _M_insert_aux(iterator __position, bool __x) {
+ if (this->_M_finish._M_p != this->_M_end_of_storage._M_data) {
+ __copy_backward(__position, this->_M_finish, this->_M_finish + 1, random_access_iterator_tag(), (difference_type*)0 );
+ *__position = __x;
+ ++this->_M_finish;
+ }
+ else {
+ size_type __len = size() ? 2 * size() : __WORD_BIT;
+ unsigned int* __q = this->_M_bit_alloc(__len);
+ iterator __i = copy(begin(), __position, iterator(__q, 0));
+ *__i++ = __x;
+ this->_M_finish = copy(__position, end(), __i);
+ this->_M_deallocate();
+ this->_M_end_of_storage._M_data = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
+ this->_M_start = iterator(__q, 0);
+ }
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void _M_initialize_range(_InputIterator __first, _InputIterator __last,
+ const input_iterator_tag &) {
+ this->_M_start = iterator();
+ this->_M_finish = iterator();
+ this->_M_end_of_storage._M_data = 0;
+ for ( ; __first != __last; ++__first)
+ push_back(*__first);
+ }
+
+ template <class _ForwardIterator>
+ void _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
+ const forward_iterator_tag &) {
+ size_type __n = distance(__first, __last);
+ _M_initialize(__n);
+ // copy(__first, __last, _M_start);
+ copy(__first, __last, this->_M_start); // dwa 12/22/99 -- resolving ambiguous reference.
+ }
+
+ template <class _InputIterator>
+ void _M_insert_range(iterator __pos,
+ _InputIterator __first, _InputIterator __last,
+ const input_iterator_tag &) {
+ for ( ; __first != __last; ++__first) {
+ __pos = insert(__pos, *__first);
+ ++__pos;
+ }
+ }
+
+ template <class _ForwardIterator>
+ void _M_insert_range(iterator __position,
+ _ForwardIterator __first, _ForwardIterator __last,
+ const forward_iterator_tag &) {
+ if (__first != __last) {
+ size_type __n = distance(__first, __last);
+ if (capacity() - size() >= __n) {
+ __copy_backward(__position, end(), this->_M_finish + difference_type(__n), random_access_iterator_tag(), (difference_type*)0 );
+ copy(__first, __last, __position);
+ this->_M_finish += difference_type(__n);
+ }
+ else {
+ size_type __len = size() + (max)(size(), __n);
+ unsigned int* __q = this->_M_bit_alloc(__len);
+ iterator __i = copy(begin(), __position, iterator(__q, 0));
+ __i = copy(__first, __last, __i);
+ this->_M_finish = copy(__position, end(), __i);
+ this->_M_deallocate();
+ this->_M_end_of_storage._M_data = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
+ this->_M_start = iterator(__q, 0);
+ }
+ }
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:
+ iterator begin() { return this->_M_start; }
+ const_iterator begin() const { return this->_M_start; }
+ iterator end() { return this->_M_finish; }
+ const_iterator end() const { return this->_M_finish; }
+
+ reverse_iterator rbegin() { return reverse_iterator(end()); }
+ const_reverse_iterator rbegin() const {
+ return const_reverse_iterator(end());
+ }
+ reverse_iterator rend() { return reverse_iterator(begin()); }
+ const_reverse_iterator rend() const {
+ return const_reverse_iterator(begin());
+ }
+
+ size_type size() const { return size_type(end() - begin()); }
+ size_type max_size() const { return size_type(-1); }
+ size_type capacity() const {
+ return size_type(const_iterator(this->_M_end_of_storage._M_data, 0) - begin());
+ }
+ bool empty() const { return begin() == end(); }
+ reference operator[](size_type __n)
+ { return *(begin() + difference_type(__n)); }
+ const_reference operator[](size_type __n) const
+ { return *(begin() + difference_type(__n)); }
+
+ void _M_range_check(size_type __n) const {
+ if (__n >= this->size())
+ __stl_throw_range_error("vector<bool>");
+ }
+
+ reference at(size_type __n)
+ { _M_range_check(__n); return (*this)[__n]; }
+ const_reference at(size_type __n) const
+ { _M_range_check(__n); return (*this)[__n]; }
+
+ explicit __BVECTOR(const allocator_type& __a = allocator_type())
+ : _Bvector_base<_Alloc >(__a) {}
+
+ __BVECTOR(size_type __n, bool __val,
+ const allocator_type& __a =
+ allocator_type())
+ : _Bvector_base<_Alloc >(__a)
+ {
+ _M_initialize(__n);
+ fill(this->_M_start._M_p, (__chunk_type*)(this->_M_end_of_storage._M_data), __val ? ~0 : 0);
+ }
+
+ explicit __BVECTOR(size_type __n)
+ : _Bvector_base<_Alloc >(allocator_type())
+ {
+ _M_initialize(__n);
+ fill(this->_M_start._M_p, (__chunk_type*)(this->_M_end_of_storage._M_data), 0);
+ }
+
+ __BVECTOR(const _Self& __x) : _Bvector_base<_Alloc >(__x.get_allocator()) {
+ _M_initialize(__x.size());
+ copy(__x.begin(), __x.end(), this->_M_start);
+ }
+
+#if defined (_STLP_MEMBER_TEMPLATES)
+ template <class _Integer>
+ void _M_initialize_dispatch(_Integer __n, _Integer __x, const __true_type&) {
+ _M_initialize(__n);
+ fill(this->_M_start._M_p, this->_M_end_of_storage._M_data, __x ? ~0 : 0);
+ }
+
+ template <class _InputIterator>
+ void _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
+ const __false_type&) {
+ _M_initialize_range(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+ }
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ // Check whether it's an integral type. If so, it's not an iterator.
+ template <class _InputIterator>
+ __BVECTOR(_InputIterator __first, _InputIterator __last)
+ : _Base(allocator_type())
+ {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_initialize_dispatch(__first, __last, _Integral());
+ }
+# endif
+ template <class _InputIterator>
+ __BVECTOR(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+ : _Base(__a)
+ {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_initialize_dispatch(__first, __last, _Integral());
+ }
+#else /* _STLP_MEMBER_TEMPLATES */
+ __BVECTOR(const_iterator __first, const_iterator __last,
+ const allocator_type& __a = allocator_type())
+ : _Bvector_base<_Alloc >(__a)
+ {
+ size_type __n = distance(__first, __last);
+ _M_initialize(__n);
+ copy(__first, __last, this->_M_start);
+ }
+ __BVECTOR(const bool* __first, const bool* __last,
+ const allocator_type& __a = allocator_type())
+ : _Bvector_base<_Alloc >(__a)
+ {
+ size_type __n = distance(__first, __last);
+ _M_initialize(__n);
+ copy(__first, __last, this->_M_start);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ ~__BVECTOR() { }
+
+ __BVECTOR_QUALIFIED& operator=(const __BVECTOR_QUALIFIED& __x) {
+ if (&__x == this) return *this;
+ if (__x.size() > capacity()) {
+ this->_M_deallocate();
+ _M_initialize(__x.size());
+ }
+ copy(__x.begin(), __x.end(), begin());
+ this->_M_finish = begin() + difference_type(__x.size());
+ return *this;
+ }
+
+ // assign(), a generalized assignment member function. Two
+ // versions: one that takes a count, and one that takes a range.
+ // The range version is a member template, so we dispatch on whether
+ // or not the type is an integer.
+
+ void _M_fill_assign(size_t __n, bool __x) {
+ if (__n > size()) {
+ fill(this->_M_start._M_p, (__chunk_type*)(this->_M_end_of_storage._M_data), __x ? ~0 : 0);
+ insert(end(), __n - size(), __x);
+ }
+ else {
+ erase(begin() + __n, end());
+ fill(this->_M_start._M_p, (__chunk_type*)(this->_M_end_of_storage._M_data), __x ? ~0 : 0);
+ }
+ }
+ void assign(size_t __n, bool __x) { _M_fill_assign(__n, __x); }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _InputIterator>
+ void assign(_InputIterator __first, _InputIterator __last) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_assign_dispatch(__first, __last, _Integral());
+ }
+
+ template <class _Integer>
+ void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type&)
+ { _M_fill_assign((size_t) __n, (bool) __val); }
+
+ template <class _InputIter>
+ void _M_assign_dispatch(_InputIter __first, _InputIter __last, const __false_type&)
+ { _M_assign_aux(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter)); }
+
+ template <class _InputIterator>
+ void _M_assign_aux(_InputIterator __first, _InputIterator __last,
+ const input_iterator_tag &) {
+ iterator __cur = begin();
+ for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
+ *__cur = *__first;
+ if (__first == __last)
+ erase(__cur, end());
+ else
+ insert(end(), __first, __last);
+ }
+
+ template <class _ForwardIterator>
+ void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
+ const forward_iterator_tag &) {
+ size_type __len = distance(__first, __last);
+ if (__len < size())
+ erase(copy(__first, __last, begin()), end());
+ else {
+ _ForwardIterator __mid = __first;
+ advance(__mid, size());
+ copy(__first, __mid, begin());
+ insert(end(), __mid, __last);
+ }
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ void reserve(size_type __n) {
+ if (capacity() < __n) {
+ unsigned int* __q = this->_M_bit_alloc(__n);
+ _Bit_iterator __z(__q, 0);
+ this->_M_finish = copy(begin(), end(), __z);
+ this->_M_deallocate();
+ this->_M_start = iterator(__q, 0);
+ this->_M_end_of_storage._M_data = __q + (__n + __WORD_BIT - 1)/__WORD_BIT;
+ }
+ }
+
+ reference front() { return *begin(); }
+ const_reference front() const { return *begin(); }
+ reference back() { return *(end() - 1); }
+ const_reference back() const { return *(end() - 1); }
+ void push_back(bool __x) {
+ if (this->_M_finish._M_p != this->_M_end_of_storage._M_data) {
+ *(this->_M_finish) = __x;
+ ++this->_M_finish;
+ }
+ else
+ _M_insert_aux(end(), __x);
+ }
+ void swap(__BVECTOR_QUALIFIED& __x) {
+ _STLP_STD::swap(this->_M_start, __x._M_start);
+ _STLP_STD::swap(this->_M_finish, __x._M_finish);
+ _STLP_STD::swap(this->_M_end_of_storage, __x._M_end_of_storage);
+ }
+ iterator insert(iterator __position, bool __x = bool()) {
+ difference_type __n = __position - begin();
+ if (this->_M_finish._M_p != this->_M_end_of_storage._M_data && __position == end()) {
+ *(this->_M_finish) = __x;
+ ++this->_M_finish;
+ }
+ else
+ _M_insert_aux(__position, __x);
+ return begin() + __n;
+ }
+
+#if defined ( _STLP_MEMBER_TEMPLATES )
+
+ template <class _Integer>
+ void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
+ const __true_type&) {
+ _M_fill_insert(__pos, (size_type) __n, (bool) __x);
+ }
+
+ template <class _InputIterator>
+ void _M_insert_dispatch(iterator __pos,
+ _InputIterator __first, _InputIterator __last,
+ const __false_type&) {
+ _M_insert_range(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+ }
+
+ // Check whether it's an integral type. If so, it's not an iterator.
+ template <class _InputIterator>
+ void insert(iterator __position,
+ _InputIterator __first, _InputIterator __last) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Is_Integral;
+ _M_insert_dispatch(__position, __first, __last, _Is_Integral());
+ }
+#else /* _STLP_MEMBER_TEMPLATES */
+ void insert(iterator __position,
+ const_iterator __first, const_iterator __last) {
+ if (__first == __last) return;
+ size_type __n = distance(__first, __last);
+ if (capacity() - size() >= __n) {
+ __copy_backward(__position, end(), this->_M_finish + __n,
+ random_access_iterator_tag(), (difference_type*)0 );
+ copy(__first, __last, __position);
+ this->_M_finish += __n;
+ }
+ else {
+ size_type __len = size() + (max)(size(), __n);
+ unsigned int* __q = this->_M_bit_alloc(__len);
+ iterator __i = copy(begin(), __position, iterator(__q, 0));
+ __i = copy(__first, __last, __i);
+ this->_M_finish = copy(__position, end(), __i);
+ this->_M_deallocate();
+ this->_M_end_of_storage._M_data = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
+ this->_M_start = iterator(__q, 0);
+ }
+ }
+
+ void insert(iterator __position, const bool* __first, const bool* __last) {
+ if (__first == __last) return;
+ size_type __n = distance(__first, __last);
+ if (capacity() - size() >= __n) {
+ __copy_backward(__position, end(), this->_M_finish + __n,
+ random_access_iterator_tag(), (difference_type*)0 );
+ copy(__first, __last, __position);
+ this->_M_finish += __n;
+ }
+ else {
+ size_type __len = size() + (max)(size(), __n);
+ unsigned int* __q = this->_M_bit_alloc(__len);
+ iterator __i = copy(begin(), __position, iterator(__q, 0));
+ __i = copy(__first, __last, __i);
+ this->_M_finish = copy(__position, end(), __i);
+ this->_M_deallocate();
+ this->_M_end_of_storage._M_data = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
+ this->_M_start = iterator(__q, 0);
+ }
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ void _M_fill_insert(iterator __position, size_type __n, bool __x) {
+ if (__n == 0) return;
+ if (capacity() - size() >= __n) {
+ __copy_backward(__position, end(), this->_M_finish + difference_type(__n), random_access_iterator_tag(), (difference_type*)0 );
+ fill(__position, __position + difference_type(__n), __x);
+ this->_M_finish += difference_type(__n);
+ }
+ else {
+ size_type __len = size() + (max)(size(), __n);
+ unsigned int* __q = this->_M_bit_alloc(__len);
+ iterator __i = copy(begin(), __position, iterator(__q, 0));
+ fill_n(__i, __n, __x);
+ this->_M_finish = copy(__position, end(), __i + difference_type(__n));
+ this->_M_deallocate();
+ this->_M_end_of_storage._M_data = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
+ this->_M_start = iterator(__q, 0);
+ }
+ }
+
+ void insert(iterator __position, size_type __n, bool __x) {
+ _M_fill_insert(__position, __n, __x);
+ }
+
+ void pop_back() {
+ --this->_M_finish;
+ }
+ iterator erase(iterator __position) {
+ if (__position + 1 != end())
+ copy(__position + 1, end(), __position);
+ --this->_M_finish;
+ return __position;
+ }
+ iterator erase(iterator __first, iterator __last) {
+ this->_M_finish = copy(__last, end(), __first);
+ return __first;
+ }
+ void resize(size_type __new_size, bool __x = bool()) {
+ if (__new_size < size())
+ erase(begin() + difference_type(__new_size), end());
+ else
+ insert(end(), __new_size - size(), __x);
+ }
+ void flip() {
+ for (unsigned int* __p = this->_M_start._M_p; __p != this->_M_end_of_storage._M_data; ++__p)
+ *__p = ~*__p;
+ }
+
+ void clear() { erase(begin(), end()); }
+};
+
+# if defined ( _STLP_NO_BOOL ) || defined (__HP_aCC) // fixed soon (03/17/2000)
+
+#define _STLP_TEMPLATE_HEADER __BVEC_TMPL_HEADER
+#define _STLP_TEMPLATE_CONTAINER __BVECTOR_QUALIFIED
+#include <stl/_relops_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+# endif /* NO_BOOL */
+
+#if !defined (_STLP_NO_BOOL)
+// This typedef is non-standard. It is provided for backward compatibility.
+ typedef __WORKAROUND_DBG_RENAME(vector) <bool, allocator<bool> > bit_vector;
+#endif
+
+_STLP_END_NAMESPACE
+
+#undef _Alloc
+#undef _STLP_VECBOOL_TEMPLATE
+#undef __BVECTOR
+#undef __BVECTOR_QUALIFIED
+#undef __BVEC_TMPL_HEADER
+
+# undef __WORD_BIT
+
+#endif /* _STLP_INTERNAL_BVECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_check_config.h b/src/STLport/stl/_check_config.h
new file mode 100644
index 0000000..923c4ba
--- /dev/null
+++ b/src/STLport/stl/_check_config.h
@@ -0,0 +1,37 @@
+// This file is reserved to site configuration purpose
+// and should NEVER be overridden by user
+
+# if defined ( _STLP_NO_OWN_IOSTREAMS )
+
+// User choose not to use SGI iostreams, which means no
+// precompiled library will be used and he is free to override
+// any STLport configuration flags
+
+# else
+
+// The following will be defined in stl_config.h :
+// # define _STLP_OWN_IOSTREAMS 1
+# endif
+
+/*
+ * Consistency check : if we use SGI iostreams, we have to use consistent
+ * thread model (single-threaded or multi-threaded) with the compiled library
+ *
+ * Default is multithreaded build. If you want to build and use single-threaded
+ * STLport, please change _STLP_NOTHREADS configuration setting above and rebuild the library
+ *
+ */
+
+# if defined (_STLP_OWN_IOSTREAMS) \
+ && !defined (_STLP_NO_THREADS) && !defined (_REENTRANT)
+
+# if defined(_MSC_VER) && !defined(__MWERKS__) && !defined (__COMO__) && !defined(_MT)
+# error "Only multi-threaded runtime library may be linked with STLport!"
+# endif
+
+// boris : you may change that to build non-threadsafe STLport library
+# if defined (__BUILDING_STLPORT) /* || defined (_STLP_DEBUG) */
+# define _REENTRANT 1
+# endif
+
+# endif
diff --git a/src/STLport/stl/_cmath.h b/src/STLport/stl/_cmath.h
new file mode 100644
index 0000000..b9a5ab4
--- /dev/null
+++ b/src/STLport/stl/_cmath.h
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CMATH_H_HEADER
+# define _STLP_CMATH_H_HEADER
+
+# include <cmath>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_SAME_FUNCTION_NAME_RESOLUTION_BUG
+
+// this proxy is needed for some compilers to resolve problems
+// calling sqrt() from within sqrt(), etc.
+template <class _Tp>
+struct _STL_math_proxy {
+ static inline _Tp _do_abs(const _Tp& __x) { return _STLP_VENDOR_CSTD::fabs(__x); }
+ static inline _Tp _do_acos(const _Tp& __x) { return _STLP_VENDOR_CSTD::acos(__x); }
+ static inline _Tp _do_asin(const _Tp& __x) { return _STLP_VENDOR_CSTD::asin(__x); }
+ static inline _Tp _do_atan(const _Tp& __x) { return _STLP_VENDOR_CSTD::atan(__x); }
+ static inline _Tp _do_atan2(const _Tp& __x, const _Tp& __y) { return _STLP_VENDOR_CSTD::atan2(__x, __y); }
+ static inline _Tp _do_cos(const _Tp& __x) { return _STLP_VENDOR_CSTD::cos(__x); }
+ static inline _Tp _do_cosh(const _Tp& __x) { return _STLP_VENDOR_CSTD::cosh(__x); }
+ static inline _Tp _do_floor(const _Tp& __x) { return _STLP_VENDOR_CSTD::floor(__x); }
+ static inline _Tp _do_ceil(const _Tp& __x) { return _STLP_VENDOR_CSTD::ceil(__x); }
+ static inline _Tp _do_fmod(const _Tp& __x, const _Tp& __y) { return _STLP_VENDOR_CSTD::fmod(__x, __y); }
+ static inline _Tp _do_frexp(const _Tp& __x, int* __y) { return _STLP_VENDOR_CSTD::frexp(__x, __y); }
+ static inline _Tp _do_ldexp(const _Tp& __x, int __y) { return _STLP_VENDOR_CSTD::ldexp(__x, __y); }
+ static inline _Tp _do_modf(const _Tp& __x, double* __y) { return _STLP_VENDOR_CSTD::modf(__x, __y); }
+ static inline _Tp _do_log(const _Tp& __x) { return _STLP_VENDOR_CSTD::log(__x); }
+ static inline _Tp _do_log10(const _Tp& __x) { return _STLP_VENDOR_CSTD::log10(__x); }
+ static inline _Tp _do_pow(const _Tp& __x, const _Tp& __y) { return _STLP_VENDOR_CSTD::pow(__x, __y); }
+ static inline _Tp _do_pow(const _Tp& __x, int __y) { return _STLP_VENDOR_CSTD::pow(__x, __y); }
+ static inline _Tp _do_sin(const _Tp& __x) { return _STLP_VENDOR_CSTD::sin(__x); }
+ static inline _Tp _do_sinh(const _Tp& __x) { return _STLP_VENDOR_CSTD::sinh(__x); }
+
+ static inline _Tp _do_sqrt(const _Tp& __x) { return _STLP_VENDOR_CSTD::sqrt(__x); }
+ static inline _Tp _do_tan(const _Tp& __x) { return _STLP_VENDOR_CSTD::tan(__x); }
+ static inline _Tp _do_tanh(const _Tp& __x) { return _STLP_VENDOR_CSTD::tanh(__x); }
+ static inline _Tp _do_exp(const _Tp& __x) { return _STLP_VENDOR_CSTD::exp(__x); }
+ static inline _Tp _do_hypot(const _Tp& __x, const _Tp& __y) { return _STLP_VENDOR_CSTD::hypot(__x, __y); }
+};
+
+# define _STLP_DO_ABS(_Tp) _STL_math_proxy<_Tp>::_do_abs
+# define _STLP_DO_ACOS(_Tp) _STL_math_proxy<_Tp>::_do_acos
+# define _STLP_DO_ASIN(_Tp) _STL_math_proxy<_Tp>::_do_asin
+# define _STLP_DO_ATAN(_Tp) _STL_math_proxy<_Tp>::_do_atan
+# define _STLP_DO_ATAN2(_Tp) _STL_math_proxy<_Tp>::_do_atan2
+# define _STLP_DO_COS(_Tp) _STL_math_proxy<_Tp>::_do_cos
+# define _STLP_DO_COSH(_Tp) _STL_math_proxy<_Tp>::_do_cosh
+# define _STLP_DO_FLOOR(_Tp) _STL_math_proxy<_Tp>::_do_floor
+# define _STLP_DO_CEIL(_Tp) _STL_math_proxy<_Tp>::_do_ceil
+# define _STLP_DO_FMOD(_Tp) _STL_math_proxy<_Tp>::_do_fmod
+# define _STLP_DO_FREXP(_Tp) _STL_math_proxy<_Tp>::_do_frexp
+# define _STLP_DO_LDEXP(_Tp) _STL_math_proxy<_Tp>::_do_ldexp
+# define _STLP_DO_MODF(_Tp) _STL_math_proxy<_Tp>::_do_modf
+# define _STLP_DO_LOG(_Tp) _STL_math_proxy<_Tp>::_do_log
+# define _STLP_DO_LOG10(_Tp) _STL_math_proxy<_Tp>::_do_log10
+# define _STLP_DO_POW(_Tp) _STL_math_proxy<_Tp>::_do_pow
+# define _STLP_DO_SIN(_Tp) _STL_math_proxy<_Tp>::_do_sin
+# define _STLP_DO_SINH(_Tp) _STL_math_proxy<_Tp>::_do_sinh
+# define _STLP_DO_SQRT(_Tp) _STL_math_proxy<_Tp>::_do_sqrt
+# define _STLP_DO_TAN(_Tp) _STL_math_proxy<_Tp>::_do_tan
+# define _STLP_DO_TANH(_Tp) _STL_math_proxy<_Tp>::_do_tanh
+# define _STLP_DO_EXP(_Tp) _STL_math_proxy<_Tp>::_do_exp
+# define _STLP_DO_HYPOT(_Tp) _STL_math_proxy<_Tp>::_do_hypot
+# else
+
+# define _STLP_DO_ABS(_Tp) _STLP_VENDOR_CSTD::fabs
+# define _STLP_DO_ACOS(_Tp) _STLP_VENDOR_CSTD::acos
+# define _STLP_DO_ASIN(_Tp) _STLP_VENDOR_CSTD::asin
+# define _STLP_DO_ATAN(_Tp) _STLP_VENDOR_CSTD::atan
+# define _STLP_DO_ATAN2(_Tp) _STLP_VENDOR_CSTD::atan2
+# define _STLP_DO_COS(_Tp) _STLP_VENDOR_CSTD::cos
+# define _STLP_DO_COSH(_Tp) _STLP_VENDOR_CSTD::cosh
+# define _STLP_DO_FLOOR(_Tp) _STLP_VENDOR_CSTD::floor
+# define _STLP_DO_CEIL(_Tp) _STLP_VENDOR_CSTD::ceil
+# define _STLP_DO_FMOD(_Tp) _STLP_VENDOR_CSTD::fmod
+# define _STLP_DO_FREXP(_Tp) _STLP_VENDOR_CSTD::frexp
+# define _STLP_DO_LDEXP(_Tp) _STLP_VENDOR_CSTD::ldexp
+# define _STLP_DO_MODF(_Tp) _STLP_VENDOR_CSTD::modf
+# define _STLP_DO_LOG(_Tp) _STLP_VENDOR_CSTD::log
+# define _STLP_DO_LOG10(_Tp) _STLP_VENDOR_CSTD::log10
+# define _STLP_DO_POW(_Tp) _STLP_VENDOR_CSTD::pow
+# define _STLP_DO_SIN(_Tp) _STLP_VENDOR_CSTD::sin
+# define _STLP_DO_SINH(_Tp) _STLP_VENDOR_CSTD::sinh
+# define _STLP_DO_SQRT(_Tp) _STLP_VENDOR_CSTD::sqrt
+# define _STLP_DO_TAN(_Tp) _STLP_VENDOR_CSTD::tan
+# define _STLP_DO_TANH(_Tp) _STLP_VENDOR_CSTD::tanh
+# define _STLP_DO_EXP(_Tp) _STLP_VENDOR_CSTD::exp
+//# if defined (__GNUC__) || defined ( __IBMCPP__ ) || defined (__SUNPRO_CC) || defined (__HP_aCC) || (_MSC_VER >= 1310)
+# define _STLP_DO_HYPOT(_Tp) ::hypot
+// # else
+// # define _STLP_DO_HYPOT(_Tp) _STLP_VENDOR_CSTD::hypot
+// # endif
+
+# endif
+
+_STLP_END_NAMESPACE
+
+# if (defined (_STLP_HAS_NO_NEW_C_HEADERS) || defined(_STLP_MSVC) || defined (__ICL)) && !defined (_STLP_HAS_NO_NAMESPACES)
+
+#if ! defined (_STLP_USE_NEW_C_HEADERS)
+
+_STLP_BEGIN_NAMESPACE
+
+# ifndef _STLP_HAS_NATIVE_FLOAT_ABS
+inline double abs(double __x) { return _STLP_DO_ABS(double)(__x); }
+inline float abs (float __x) { return _STLP_DO_ABS(float)(__x); }
+# endif
+
+inline double pow(double __x, int __y) { return _STLP_DO_POW(double)(__x, __y); }
+inline float acos (float __x) { return _STLP_DO_ACOS(float)(__x); }
+inline float asin (float __x) { return _STLP_DO_ASIN(float)(__x); }
+inline float atan (float __x) { return _STLP_DO_ATAN(float)(__x); }
+inline float atan2(float __x, float __y) { return _STLP_DO_ATAN2(float)(__x, __y); }
+inline float ceil (float __x) { return _STLP_DO_CEIL(float)(__x); }
+inline float cos (float __x) { return _STLP_DO_COS(float)(__x); }
+inline float cosh (float __x) { return _STLP_DO_COSH(float)(__x); }
+inline float exp (float __x) { return _STLP_DO_EXP(float)(__x); }
+# ifdef _STLP_USE_NAMESPACES
+inline float fabs (float __x) { return _STLP_DO_ABS(float)(__x); }
+# endif
+inline float floor(float __x) { return _STLP_DO_FLOOR(float)(__x); }
+inline float fmod (float __x, float __y) { return _STLP_DO_FMOD(float)(__x, __y); }
+inline float frexp(float __x, int* __y) { return _STLP_DO_FREXP(float)(__x, __y); }
+inline float ldexp(float __x, int __y) { return _STLP_DO_LDEXP(float)(__x, __y); }
+// fbp : float versions are not always available
+#if !defined(_STLP_VENDOR_LONG_DOUBLE_MATH) //*ty 11/25/2001 -
+inline float modf (float __x, float* __y) {
+ double __dd[2];
+ double __res = _STLP_DO_MODF(double)((double)__x, __dd);
+ __y[0] = (float)__dd[0] ; __y[1] = (float)__dd[1];
+ return (float)__res;
+}
+#else //*ty 11/25/2001 - i.e. for apple SCpp
+inline float modf (float __x, float* __y) {
+ long double __dd[2];
+ long double __res = _STLP_DO_MODF(long double)((long double)__x, __dd);
+ __y[0] = (float)__dd[0] ; __y[1] = (float)__dd[1];
+ return (float)__res;
+}
+#endif //*ty 11/25/2001 -
+
+inline float log (float __x) { return _STLP_DO_LOG(float)(__x); }
+inline float log10(float __x) { return _STLP_DO_LOG10(float)(__x); }
+inline float pow (float __x, float __y) { return _STLP_DO_POW(float)(__x, __y); }
+inline float pow (float __x, int __y) { return _STLP_DO_POW(float)(__x, __y); }
+inline float sin (float __x) { return _STLP_DO_SIN(float)(__x); }
+inline float sinh (float __x) { return _STLP_DO_SINH(float)(__x); }
+inline float sqrt (float __x) { return _STLP_DO_SQRT(float)(__x); }
+inline float tan (float __x) { return _STLP_DO_TAN(float)(__x); }
+inline float tanh (float __x) { return _STLP_DO_TANH(float)(__x); }
+
+# if ! (defined (_STLP_NO_LONG_DOUBLE) || defined(_STLP_VENDOR_LONG_DOUBLE_MATH))
+
+#if !defined (__MVS__)
+inline long double abs (long double __x) { return _STLP_DO_ABS(long double)((double)__x); }
+#endif
+inline long double acos (long double __x) { return _STLP_DO_ACOS(long double)(__x); }
+inline long double asin (long double __x) { return _STLP_DO_ASIN(long double)(__x); }
+inline long double atan (long double __x) { return _STLP_DO_ATAN(long double)(__x); }
+inline long double atan2(long double __x, long double __y) { return _STLP_DO_ATAN2(long double)(__x, __y); }
+inline long double ceil (long double __x) { return _STLP_DO_CEIL(long double)(__x); }
+inline long double cos (long double __x) { return _STLP_DO_COS(long double)(__x); }
+inline long double cosh (long double __x) { return _STLP_DO_COSH(long double)(__x); }
+inline long double exp (long double __x) { return _STLP_DO_EXP(long double)(__x); }
+inline long double fabs (long double __x) { return _STLP_DO_ABS(long double)(__x); }
+inline long double floor(long double __x) { return _STLP_DO_FLOOR(long double)(__x); }
+inline long double fmod (long double __x, long double __y) { return _STLP_DO_FMOD(long double)(__x, __y); }
+inline long double frexp(long double __x, int* __y) { return _STLP_DO_FREXP(long double)(__x, __y); }
+inline long double ldexp(long double __x, int __y) { return _STLP_DO_LDEXP(long double)(__x, __y); }
+// fbp : long double versions are not available
+inline long double modf (long double __x, long double* __y) {
+ double __dd[2];
+ double __res = _STLP_DO_MODF(double)((double)__x, __dd);
+ __y[0] = (long double)__dd[0] ; __y[1] = (long double)__dd[1];
+ return (long double)__res;
+}
+inline long double log (long double __x) { return _STLP_DO_LOG(long double)(__x); }
+inline long double log10(long double __x) { return _STLP_DO_LOG10(long double)(__x); }
+inline long double pow (long double __x, long double __y) { return _STLP_DO_POW(long double)(__x, __y); }
+inline long double pow (long double __x, int __y) { return _STLP_DO_POW(long double)(__x, __y); }
+inline long double sin (long double __x) { return _STLP_DO_SIN(long double)(__x); }
+inline long double sinh (long double __x) { return _STLP_DO_SINH(long double)(__x); }
+inline long double sqrt (long double __x) { return _STLP_DO_SQRT(long double)(__x); }
+inline long double tan (long double __x) { return _STLP_DO_TAN(long double)(__x); }
+inline long double tanh (long double __x) { return _STLP_DO_TANH(long double)(__x); }
+# endif
+
+_STLP_END_NAMESPACE
+
+# endif /* NEW_C_HEADERS */
+# endif /* NEW_C_HEADERS */
+
+#endif /* CMATH_H */
diff --git a/src/STLport/stl/_codecvt.h b/src/STLport/stl/_codecvt.h
new file mode 100644
index 0000000..48e2702
--- /dev/null
+++ b/src/STLport/stl/_codecvt.h
@@ -0,0 +1,307 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_CODECVT_H
+#define _STLP_INTERNAL_CODECVT_H
+
+# ifndef _STLP_C_LOCALE_H
+# include <stl/c_locale.h>
+# endif
+# ifndef _STLP_INTERNAL_LOCALE_H
+# include <stl/_locale.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+class _STLP_CLASS_DECLSPEC codecvt_base {
+public:
+ enum result {ok, partial, error, noconv};
+};
+
+template <class _InternT, class _ExternT, class _StateT>
+class codecvt : public locale::facet, public codecvt_base {
+ typedef _InternT intern_type;
+ typedef _ExternT extern_type;
+ typedef _StateT state_type;
+};
+
+template <class _InternT, class _ExternT, class _StateT>
+class codecvt_byname : public codecvt<_InternT, _ExternT, _StateT> {};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC codecvt<char, char, mbstate_t>
+ : public locale::facet, public codecvt_base
+{
+ friend class _Locale;
+public:
+ typedef char intern_type;
+ typedef char extern_type;
+ typedef mbstate_t state_type;
+
+ explicit codecvt(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+ result out(state_type& __state,
+ const char* __from,
+ const char* __from_end,
+ const char*& __from_next,
+ char* __to,
+ char* __to_limit,
+ char*& __to_next) const {
+ return do_out(__state,
+ __from, __from_end, __from_next,
+ __to, __to_limit, __to_next);
+ }
+
+ result unshift(mbstate_t& __state,
+ char* __to, char* __to_limit, char*& __to_next) const
+ { return do_unshift(__state, __to, __to_limit, __to_next); }
+
+ result in(state_type& __state,
+ const char* __from,
+ const char* __from_end,
+ const char*& __from_next,
+ char* __to,
+ char* __to_limit,
+ char*& __to_next) const {
+ return do_in(__state,
+ __from, __from_end, __from_next,
+ __to, __to_limit, __to_next);
+ }
+
+ int encoding() const _STLP_NOTHROW { return do_encoding(); }
+
+ bool always_noconv() const _STLP_NOTHROW { return do_always_noconv(); }
+
+ int length(const state_type& __state,
+ const char* __from, const char* __end,
+ size_t __max) const
+ { return do_length(__state, __from, __end, __max); }
+
+ int max_length() const _STLP_NOTHROW { return do_max_length(); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+ ~codecvt();
+
+ virtual result do_out(mbstate_t& /* __state */,
+ const char* __from,
+ const char* /* __from_end */,
+ const char*& __from_next,
+ char* __to,
+ char* /* __to_limit */,
+ char*& __to_next) const;
+
+ virtual result do_in (mbstate_t& /* __state */ ,
+ const char* __from,
+ const char* /* __from_end */,
+ const char*& __from_next,
+ char* __to,
+ char* /* __to_end */,
+ char*& __to_next) const;
+
+ virtual result do_unshift(mbstate_t& /* __state */,
+ char* __to,
+ char* /* __to_limit */,
+ char*& __to_next) const;
+
+ virtual int do_encoding() const _STLP_NOTHROW;
+ virtual bool do_always_noconv() const _STLP_NOTHROW;
+ virtual int do_length(const mbstate_t& __state,
+ const char* __from,
+ const char* __end,
+ size_t __max) const;
+ virtual int do_max_length() const _STLP_NOTHROW;
+private:
+ codecvt(const codecvt<char, char, mbstate_t>&);
+ codecvt<char, char, mbstate_t>& operator =(const codecvt<char, char, mbstate_t>&);
+};
+
+# ifndef _STLP_NO_WCHAR_T
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC codecvt<wchar_t, char, mbstate_t>
+ : public locale::facet, public codecvt_base
+{
+ friend class _Locale;
+public:
+ typedef wchar_t intern_type;
+ typedef char extern_type;
+ typedef mbstate_t state_type;
+
+ explicit codecvt(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+ result out(mbstate_t __state,
+ const wchar_t* __from,
+ const wchar_t* __from_end,
+ const wchar_t*& __from_next,
+ char* __to,
+ char* __to_limit,
+ char*& __to_next) const {
+ return do_out(__state,
+ __from, __from_end, __from_next,
+ __to, __to_limit, __to_next);
+ }
+
+ result unshift(mbstate_t& __state,
+ char* __to, char* __to_limit, char*& __to_next) const {
+ return do_unshift(__state, __to, __to_limit, __to_next);
+ }
+
+ result in(mbstate_t __state,
+ const char* __from,
+ const char* __from_end,
+ const char*& __from_next,
+ wchar_t* __to,
+ wchar_t* __to_limit,
+ wchar_t*& __to_next) const {
+ return do_in(__state,
+ __from, __from_end, __from_next,
+ __to, __to_limit, __to_next);
+ }
+
+ int encoding() const _STLP_NOTHROW { return do_encoding(); }
+
+ bool always_noconv() const _STLP_NOTHROW { return do_always_noconv(); }
+
+ int length(const mbstate_t& __state,
+ const char* __from,
+ const char* __end,
+ size_t __max) const
+ { return do_length(__state, __from, __end, __max); }
+
+ int max_length() const _STLP_NOTHROW { return do_max_length(); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+ ~codecvt();
+
+ virtual result do_out(mbstate_t& __state,
+ const wchar_t* __from,
+ const wchar_t* __from_end,
+ const wchar_t*& __from_next,
+ char* __to,
+ char* __to_limit,
+ char*& __to_next) const;
+
+ virtual result do_in (mbstate_t& __state,
+ const char* __from,
+ const char* __from_end,
+ const char*& __from_next,
+ wchar_t* __to,
+ wchar_t* __to_limit,
+ wchar_t*& __to_next) const;
+
+ virtual result do_unshift(mbstate_t& __state,
+ char* __to,
+ char* __to_limit,
+ char*& __to_next) const;
+
+ virtual int do_encoding() const _STLP_NOTHROW;
+
+ virtual bool do_always_noconv() const _STLP_NOTHROW;
+
+ virtual int do_length(const mbstate_t& __state,
+ const char* __from,
+ const char* __end,
+ size_t __max) const;
+
+ virtual int do_max_length() const _STLP_NOTHROW;
+
+private:
+ codecvt(const codecvt<wchar_t, char, mbstate_t>&);
+ codecvt<wchar_t, char, mbstate_t>& operator = (const codecvt<wchar_t, char, mbstate_t>&);
+};
+
+# endif
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC codecvt_byname<char, char, mbstate_t>
+ : public codecvt<char, char, mbstate_t> {
+public:
+ explicit codecvt_byname(const char* __name, size_t __refs = 0);
+ ~codecvt_byname();
+private:
+ codecvt_byname(const codecvt_byname<char, char, mbstate_t>&);
+ codecvt_byname<char, char, mbstate_t>& operator =(const codecvt_byname<char, char, mbstate_t>&);
+};
+
+# ifndef _STLP_NO_WCHAR_T
+_STLP_TEMPLATE_NULL
+class codecvt_byname<wchar_t, char, mbstate_t>
+ : public codecvt<wchar_t, char, mbstate_t>
+{
+public:
+ explicit codecvt_byname(const char * __name, size_t __refs = 0);
+
+protected:
+ ~codecvt_byname();
+
+ virtual result do_out(mbstate_t& __state,
+ const wchar_t* __from,
+ const wchar_t* __from_end,
+ const wchar_t*& __from_next,
+ char* __to,
+ char* __to_limit,
+ char*& __to_next) const;
+
+ virtual result do_in (mbstate_t& __state,
+ const char* __from,
+ const char* __from_end,
+ const char*& __from_next,
+ wchar_t* __to,
+ wchar_t* __to_limit,
+ wchar_t*& __to_next) const;
+
+ virtual result do_unshift(mbstate_t& __state,
+ char* __to,
+ char* __to_limit,
+ char*& __to_next) const;
+
+ virtual int do_encoding() const _STLP_NOTHROW;
+
+ virtual bool do_always_noconv() const _STLP_NOTHROW;
+
+ virtual int do_length(const mbstate_t& __state,
+ const char* __from,
+ const char* __end,
+ size_t __max) const;
+
+ virtual int do_max_length() const _STLP_NOTHROW;
+
+private:
+ _Locale_ctype* _M_ctype;
+ codecvt_byname(const codecvt_byname<wchar_t, char, mbstate_t>&);
+ codecvt_byname<wchar_t, char, mbstate_t>& operator =(const codecvt_byname<wchar_t, char, mbstate_t>&);
+};
+
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_CODECVT_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_collate.h b/src/STLport/stl/_collate.h
new file mode 100644
index 0000000..6ad23c3
--- /dev/null
+++ b/src/STLport/stl/_collate.h
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+#ifndef _STLP_INTERNAL_COLLATE_H
+#define _STLP_INTERNAL_COLLATE_H
+
+#ifndef _STLP_C_LOCALE_H
+# include <stl/c_locale.h>
+#endif
+
+#ifndef _STLP_INTERNAL_LOCALE_H
+# include <stl/_locale.h>
+#endif
+
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+
+template <class _CharT> class collate {};
+template <class _CharT> class collate_byname {};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC collate<char> : public locale::facet
+{
+ friend class _Locale;
+public:
+ typedef char char_type;
+ typedef string string_type;
+
+ explicit collate(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+ int compare(const char* __low1, const char* __high1,
+ const char* __low2, const char* __high2) const {
+ return do_compare( __low1, __high1, __low2, __high2);
+ }
+
+ string_type transform(const char* __low, const char* __high) const {
+ return do_transform(__low, __high);
+ }
+
+ long hash(const char* __low, const char* __high) const
+ { return do_hash(__low, __high); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+ ~collate();
+
+ virtual int do_compare(const char*, const char*,
+ const char*, const char*) const;
+ virtual string_type do_transform(const char*, const char*) const;
+ virtual long do_hash(const char*, const char*) const;
+private:
+ collate(const collate<char>&);
+ collate<char>& operator =(const collate<char>&);
+};
+
+# ifndef _STLP_NO_WCHAR_T
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC collate<wchar_t> : public locale::facet
+{
+ friend class _Locale;
+public:
+ typedef wchar_t char_type;
+ typedef wstring string_type;
+
+ explicit collate(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+ int compare(const wchar_t* __low1, const wchar_t* __high1,
+ const wchar_t* __low2, const wchar_t* __high2) const {
+ return do_compare( __low1, __high1, __low2, __high2);
+ }
+
+ string_type transform(const wchar_t* __low, const wchar_t* __high) const {
+ return do_transform(__low, __high);
+ }
+
+ long hash(const wchar_t* __low, const wchar_t* __high) const
+ { return do_hash(__low, __high); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+ ~collate();
+
+ virtual int do_compare(const wchar_t*, const wchar_t*,
+ const wchar_t*, const wchar_t*) const;
+ virtual string_type do_transform(const wchar_t*, const wchar_t*) const;
+ virtual long do_hash(const wchar_t* __low, const wchar_t* __high) const;
+private:
+ collate(const collate<wchar_t>&);
+ collate<wchar_t>& operator = (const collate<wchar_t>&);
+};
+
+# endif /* NO_WCHAR_T */
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC collate_byname<char>: public collate<char>
+{
+public:
+ explicit collate_byname(const char* __name, size_t __refs = 0);
+
+protected:
+ ~collate_byname();
+
+ virtual int do_compare(const char*, const char*,
+ const char*, const char*) const;
+ virtual string_type do_transform(const char*, const char*) const;
+
+private:
+ _Locale_collate* _M_collate;
+ collate_byname(const collate_byname<char>&);
+ collate_byname<char>& operator =(const collate_byname<char>&);
+};
+
+# ifndef _STLP_NO_WCHAR_T
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC collate_byname<wchar_t>: public collate<wchar_t>
+{
+public:
+ explicit collate_byname(const char * __name, size_t __refs = 0);
+
+protected:
+ ~collate_byname();
+
+ virtual int do_compare(const wchar_t*, const wchar_t*,
+ const wchar_t*, const wchar_t*) const;
+ virtual string_type do_transform(const wchar_t*, const wchar_t*) const;
+
+private:
+ _Locale_collate* _M_collate;
+ collate_byname(const collate_byname<wchar_t>&);
+ collate_byname<wchar_t>& operator =(const collate_byname<wchar_t>&);
+};
+
+# endif /* NO_WCHAR_T */
+
+
+template <class _CharT>
+bool
+__locale_do_operator_call (const locale* __that,
+ const basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >& __x,
+ const basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >& __y)
+{
+ collate<_CharT>* __f = (collate<_CharT>*)__that->_M_get_facet(collate<_CharT>::id);
+ if (!__f)
+ __that->_M_throw_runtime_error();
+ return __f->compare(__x.data(), __x.data() + __x.size(),
+ __y.data(), __y.data() + __y.size()) < 0;
+
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_COLLATE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_complex.c b/src/STLport/stl/_complex.c
new file mode 100644
index 0000000..804766e
--- /dev/null
+++ b/src/STLport/stl/_complex.c
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_COMPLEX_C
+#define _STLP_COMPLEX_C
+
+# ifndef _STLP_internal_complex_h
+# include <stl/_complex.h>
+# endif
+
+#include <istream>
+
+#ifdef _STLP_USE_NEW_IOSTREAMS
+# include <sstream>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// Non-inline member functions.
+
+template <class _Tp>
+void complex<_Tp>::_div(const _Tp& __z1_r, const _Tp& __z1_i,
+ const _Tp& __z2_r, const _Tp& __z2_i,
+ _Tp& __res_r, _Tp& __res_i) {
+ _Tp __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
+ _Tp __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
+
+ if (__ar <= __ai) {
+ _Tp __ratio = __z2_r / __z2_i;
+ _Tp __denom = __z2_i * (1 + __ratio * __ratio);
+ __res_r = (__z1_r * __ratio + __z1_i) / __denom;
+ __res_i = (__z1_i * __ratio - __z1_r) / __denom;
+ }
+ else {
+ _Tp __ratio = __z2_i / __z2_r;
+ _Tp __denom = __z2_r * (1 + __ratio * __ratio);
+ __res_r = (__z1_r + __z1_i * __ratio) / __denom;
+ __res_i = (__z1_i - __z1_r * __ratio) / __denom;
+ }
+}
+
+template <class _Tp>
+void complex<_Tp>::_div(const _Tp& __z1_r,
+ const _Tp& __z2_r, const _Tp& __z2_i,
+ _Tp& __res_r, _Tp& __res_i) {
+ _Tp __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
+ _Tp __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
+
+ if (__ar <= __ai) {
+ _Tp __ratio = __z2_r / __z2_i;
+ _Tp __denom = __z2_i * (1 + __ratio * __ratio);
+ __res_r = (__z1_r * __ratio) / __denom;
+ __res_i = - __z1_r / __denom;
+ }
+ else {
+ _Tp __ratio = __z2_i / __z2_r;
+ _Tp __denom = __z2_r * (1 + __ratio * __ratio);
+ __res_r = __z1_r / __denom;
+ __res_i = - (__z1_r * __ratio) / __denom;
+ }
+}
+
+// I/O.
+
+#ifdef _STLP_USE_NEW_IOSTREAMS
+
+// Complex output, in the form (re,im). We use a two-step process
+// involving stringstream so that we get the padding right.
+template <class _Tp, class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __z)
+{
+ basic_ostringstream<_CharT, _Traits, allocator<_CharT> > __tmp;
+ __tmp.flags(__os.flags());
+ __tmp.imbue(__os.getloc());
+ __tmp.precision(__os.precision());
+ __tmp << '(' << __z.real() << ',' << __z.imag() << ')';
+ return __os << __tmp.str();
+}
+
+// Complex input from arbitrary streams. Note that results in some
+// locales may be confusing, since the decimal character varies with
+// locale and the separator between real and imaginary parts does not.
+
+template <class _Tp, class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __z)
+{
+ _Tp __re = 0;
+ _Tp __im = 0;
+
+ // typedef ctype<_CharT> _Ctype;
+ // locale __loc = __is.getloc();
+ //const _Ctype& __c_type = use_facet<_Ctype>(__loc);
+ const ctype<_CharT>& __c_type = *(const ctype<_CharT>*)__is._M_ctype_facet();
+
+ char __punct[4] = "(,)";
+ _CharT __wpunct[3];
+ __c_type.widen(__punct, __punct + 3, __wpunct);
+
+ _CharT __c;
+
+ __is >> __c;
+ if (_Traits::eq(__c, __wpunct[0])) { // Left paren
+ __is >> __re >> __c;
+ if (_Traits::eq(__c, __wpunct[1])) // Comma
+ __is >> __im >> __c;
+ if (!_Traits::eq(__c, __wpunct[2])) // Right paren
+ __is.setstate(ios_base::failbit);
+ }
+ else {
+ __is.putback(__c);
+ __is >> __re;
+ }
+
+ if (__is)
+ __z = complex<_Tp>(__re, __im);
+ return __is;
+}
+
+
+#else /* _STLP_USE_NEW_IOSTREAMS */
+
+template <class _Tp>
+ostream& _STLP_CALL operator<<(ostream& s, const complex<_Tp>& __z)
+{
+ return s << "( " << __z._M_re <<", " << __z._M_im <<")";
+}
+
+template <class _Tp>
+istream& _STLP_CALL operator>>(istream& s, complex<_Tp>& a)
+{
+ _Tp re = 0, im = 0;
+ char c = 0;
+
+ s >> c;
+ if (c == '(') {
+ s >> re >> c;
+ if (c == ',') s >> im >> c;
+ if (c != ')') s.clear(ios::badbit);
+ }
+ else {
+ s.putback(c);
+ s >> re;
+ }
+
+ if (s) a = complex<_Tp>(re, im);
+ return s;
+}
+
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_COMPLEX_C */
diff --git a/src/STLport/stl/_complex.h b/src/STLport/stl/_complex.h
new file mode 100644
index 0000000..d019116
--- /dev/null
+++ b/src/STLport/stl/_complex.h
@@ -0,0 +1,969 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_internal_complex_h
+#define _STLP_internal_complex_h
+
+// This header declares the template class complex, as described in
+// in the draft C++ standard. Single-precision complex numbers
+// are complex<float>, double-precision are complex<double>, and
+// quad precision are complex<long double>.
+
+// Note that the template class complex is declared within namespace
+// std, as called for by the draft C++ standard.
+
+#include <stl/_cmath.h>
+#include <iosfwd>
+
+_STLP_BEGIN_NAMESPACE
+
+#if !defined(_STLP_NO_COMPLEX_SPECIALIZATIONS) //*TY 02/25/2000 - added for MPW compiler workaround
+
+template <class _Tp> struct complex;
+
+_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC complex<float>;
+_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC complex<double>;
+# ifndef _STLP_NO_LONG_DOUBLE
+_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC complex<long double>;
+# endif
+# endif
+
+template <class _Tp>
+struct complex {
+ typedef _Tp value_type;
+ typedef complex<_Tp> _Self;
+
+ // Constructors, destructor, assignment operator.
+ complex() : _M_re(0), _M_im(0) {}
+ complex(const value_type& __x)
+ : _M_re(__x), _M_im(0) {}
+ complex(const value_type& __x, const value_type& __y)
+ : _M_re(__x), _M_im(__y) {}
+ complex(const _Self& __z)
+ : _M_re(__z._M_re), _M_im(__z._M_im) {}
+
+ _Self& operator=(const _Self& __z) {
+ _M_re = __z._M_re;
+ _M_im = __z._M_im;
+ return *this;
+ }
+
+#if defined (_STLP_MEMBER_TEMPLATES) && ( defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) || defined(_STLP_NO_COMPLEX_SPECIALIZATIONS))
+ template <class _Tp2>
+ explicit complex(const complex<_Tp2>& __z)
+ : _M_re(__z._M_re), _M_im(__z._M_im) {}
+
+ template <class _Tp2>
+ _Self& operator=(const complex<_Tp2>& __z) {
+ _M_re = __z._M_re;
+ _M_im = __z._M_im;
+ return *this;
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ // Element access.
+ value_type real() const { return _M_re; }
+ value_type imag() const { return _M_im; }
+
+ // Arithmetic op= operations involving one real argument.
+
+ _Self& operator= (const value_type& __x) {
+ _M_re = __x;
+ _M_im = 0;
+ return *this;
+ }
+ _Self& operator+= (const value_type& __x) {
+ _M_re += __x;
+ return *this;
+ }
+ _Self& operator-= (const value_type& __x) {
+ _M_re -= __x;
+ return *this;
+ }
+ _Self& operator*= (const value_type& __x) {
+ _M_re *= __x;
+ _M_im *= __x;
+ return *this;
+ }
+ _Self& operator/= (const value_type& __x) {
+ _M_re /= __x;
+ _M_im /= __x;
+ return *this;
+ }
+
+ // Arithmetic op= operations involving two complex arguments.
+
+ static void _STLP_CALL _div(const value_type& __z1_r, const value_type& __z1_i,
+ const value_type& __z2_r, const value_type& __z2_i,
+ value_type& __res_r, value_type& __res_i);
+
+ static void _STLP_CALL _div(const value_type& __z1_r,
+ const value_type& __z2_r, const value_type& __z2_i,
+ value_type& __res_r, value_type& __res_i);
+
+#if defined ( _STLP_MEMBER_TEMPLATES ) // && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
+
+ template <class _Tp2> _Self& operator+= (const complex<_Tp2>& __z) {
+ _M_re += __z._M_re;
+ _M_im += __z._M_im;
+ return *this;
+ }
+
+ template <class _Tp2> _Self& operator-= (const complex<_Tp2>& __z) {
+ _M_re -= __z._M_re;
+ _M_im -= __z._M_im;
+ return *this;
+ }
+
+ template <class _Tp2> _Self& operator*= (const complex<_Tp2>& __z) {
+ value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
+ value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+ template <class _Tp2> _Self& operator/= (const complex<_Tp2>& __z) {
+ value_type __r;
+ value_type __i;
+ _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ _Self& operator+= (const _Self& __z) {
+ _M_re += __z._M_re;
+ _M_im += __z._M_im;
+ return *this;
+ }
+
+ _Self& operator-= (const _Self& __z) {
+ _M_re -= __z._M_re;
+ _M_im -= __z._M_im;
+ return *this;
+ }
+
+ _Self& operator*= (const _Self& __z) {
+ value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
+ value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+ _Self& operator/= (const _Self& __z) {
+ value_type __r;
+ value_type __i;
+ _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+ // Data members.
+ value_type _M_re;
+ value_type _M_im;
+};
+
+#if !defined(_STLP_NO_COMPLEX_SPECIALIZATIONS) //*TY 02/25/2000 - added for MPW compiler workaround
+// Explicit specializations for float, double, long double. The only
+// reason for these specializations is to enable automatic conversions
+// from complex<float> to complex<double>, and complex<double> to
+// complex<long double>.
+
+
+_STLP_TEMPLATE_NULL
+struct _STLP_CLASS_DECLSPEC complex<float> {
+ typedef float value_type;
+ typedef complex<float> _Self;
+ // Constructors, destructor, assignment operator.
+
+ complex(value_type __x = 0.0, value_type __y = 0.0)
+ : _M_re(__x), _M_im(__y) {}
+
+ complex(const complex<float>& __z) : _M_re(__z._M_re), _M_im(__z._M_im) {}
+
+ inline explicit complex(const complex<double>& __z);
+# ifndef _STLP_NO_LONG_DOUBLE
+ inline explicit complex(const complex<long double>& __z);
+# endif
+ // Element access.
+ value_type real() const { return _M_re; }
+ value_type imag() const { return _M_im; }
+
+ // Arithmetic op= operations involving one real argument.
+
+ _Self& operator= (value_type __x) {
+ _M_re = __x;
+ _M_im = 0;
+ return *this;
+ }
+ _Self& operator+= (value_type __x) {
+ _M_re += __x;
+ return *this;
+ }
+ _Self& operator-= (value_type __x) {
+ _M_re -= __x;
+ return *this;
+ }
+ _Self& operator*= (value_type __x) {
+ _M_re *= __x;
+ _M_im *= __x;
+ return *this;
+ }
+ _Self& operator/= (value_type __x) {
+ _M_re /= __x;
+ _M_im /= __x;
+ return *this;
+ }
+
+ // Arithmetic op= operations involving two complex arguments.
+
+ static void _STLP_CALL _div(const float& __z1_r, const float& __z1_i,
+ const float& __z2_r, const float& __z2_i,
+ float& __res_r, float& __res_i);
+
+ static void _STLP_CALL _div(const float& __z1_r,
+ const float& __z2_r, const float& __z2_i,
+ float& __res_r, float& __res_i);
+
+#if defined (_STLP_MEMBER_TEMPLATES)
+
+ template <class _Tp2>
+ complex<float>& operator=(const complex<_Tp2>& __z) {
+ _M_re = __z._M_re;
+ _M_im = __z._M_im;
+ return *this;
+ }
+
+ template <class _Tp2>
+ complex<float>& operator+= (const complex<_Tp2>& __z) {
+ _M_re += __z._M_re;
+ _M_im += __z._M_im;
+ return *this;
+ }
+
+ template <class _Tp2>
+ complex<float>& operator-= (const complex<_Tp2>& __z) {
+ _M_re -= __z._M_re;
+ _M_im -= __z._M_im;
+ return *this;
+ }
+
+ template <class _Tp2>
+ complex<float>& operator*= (const complex<_Tp2>& __z) {
+ float __r = _M_re * __z._M_re - _M_im * __z._M_im;
+ float __i = _M_re * __z._M_im + _M_im * __z._M_re;
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+ template <class _Tp2>
+ complex<float>& operator/= (const complex<_Tp2>& __z) {
+ float __r;
+ float __i;
+ _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ _Self& operator=(const _Self& __z) {
+ _M_re = __z._M_re;
+ _M_im = __z._M_im;
+ return *this;
+ }
+
+ _Self& operator+= (const _Self& __z) {
+ _M_re += __z._M_re;
+ _M_im += __z._M_im;
+ return *this;
+ }
+
+ _Self& operator-= (const _Self& __z) {
+ _M_re -= __z._M_re;
+ _M_im -= __z._M_im;
+ return *this;
+ }
+
+ _Self& operator*= (const _Self& __z) {
+ value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
+ value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+ _Self& operator/= (const _Self& __z) {
+ value_type __r;
+ value_type __i;
+ _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+ // Data members.
+ value_type _M_re;
+ value_type _M_im;
+};
+
+_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC complex<double> {
+ typedef double value_type;
+ typedef complex<double> _Self;
+
+ // Constructors, destructor, assignment operator.
+
+ complex(value_type __x = 0.0, value_type __y = 0.0)
+ : _M_re(__x), _M_im(__y) {}
+
+ complex(const complex<double>& __z)
+ : _M_re(__z._M_re), _M_im(__z._M_im) {}
+ inline complex(const complex<float>& __z);
+# ifndef _STLP_NO_LONG_DOUBLE
+ explicit inline complex(const complex<long double>& __z);
+# endif
+ // Element access.
+ value_type real() const { return _M_re; }
+ value_type imag() const { return _M_im; }
+
+ // Arithmetic op= operations involving one real argument.
+
+ _Self& operator= (value_type __x) {
+ _M_re = __x;
+ _M_im = 0;
+ return *this;
+ }
+ _Self& operator+= (value_type __x) {
+ _M_re += __x;
+ return *this;
+ }
+ _Self& operator-= (value_type __x) {
+ _M_re -= __x;
+ return *this;
+ }
+ _Self& operator*= (value_type __x) {
+ _M_re *= __x;
+ _M_im *= __x;
+ return *this;
+ }
+ _Self& operator/= (value_type __x) {
+ _M_re /= __x;
+ _M_im /= __x;
+ return *this;
+ }
+
+ // Arithmetic op= operations involving two complex arguments.
+
+ static void _STLP_CALL _div(const double& __z1_r, const double& __z1_i,
+ const double& __z2_r, const double& __z2_i,
+ double& __res_r, double& __res_i);
+ static void _STLP_CALL _div(const double& __z1_r,
+ const double& __z2_r, const double& __z2_i,
+ double& __res_r, double& __res_i);
+
+#if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
+
+ template <class _Tp2>
+ complex<double>& operator=(const complex<_Tp2>& __z) {
+ _M_re = __z._M_re;
+ _M_im = __z._M_im;
+ return *this;
+ }
+
+ template <class _Tp2>
+ complex<double>& operator+= (const complex<_Tp2>& __z) {
+ _M_re += __z._M_re;
+ _M_im += __z._M_im;
+ return *this;
+ }
+
+ template <class _Tp2>
+ complex<double>& operator-= (const complex<_Tp2>& __z) {
+ _M_re -= __z._M_re;
+ _M_im -= __z._M_im;
+ return *this;
+ }
+
+ template <class _Tp2>
+ complex<double>& operator*= (const complex<_Tp2>& __z) {
+ double __r = _M_re * __z._M_re - _M_im * __z._M_im;
+ double __i = _M_re * __z._M_im + _M_im * __z._M_re;
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+ template <class _Tp2>
+ complex<double>& operator/= (const complex<_Tp2>& __z) {
+ double __r;
+ double __i;
+ _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ _Self& operator=(const _Self& __z) {
+ _M_re = __z._M_re;
+ _M_im = __z._M_im;
+ return *this;
+ }
+
+ _Self& operator+= (const _Self& __z) {
+ _M_re += __z._M_re;
+ _M_im += __z._M_im;
+ return *this;
+ }
+
+ _Self& operator-= (const _Self& __z) {
+ _M_re -= __z._M_re;
+ _M_im -= __z._M_im;
+ return *this;
+ }
+
+ _Self& operator*= (const _Self& __z) {
+ value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
+ value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+ _Self& operator/= (const _Self& __z) {
+ value_type __r;
+ value_type __i;
+ _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+ // Data members.
+ value_type _M_re;
+ value_type _M_im;
+};
+
+# ifndef _STLP_NO_LONG_DOUBLE
+
+_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC complex<long double> {
+ typedef long double value_type;
+ typedef complex<long double> _Self;
+
+ // Constructors, destructor, assignment operator.
+ complex(value_type __x = 0.0, value_type __y = 0.0)
+ : _M_re(__x), _M_im(__y) {}
+
+ complex(const complex<long double>& __z)
+ : _M_re(__z._M_re), _M_im(__z._M_im) {}
+ inline complex(const complex<float>& __z);
+ inline complex(const complex<double>& __z);
+
+ // Element access.
+ value_type real() const { return _M_re; }
+ value_type imag() const { return _M_im; }
+
+ // Arithmetic op= operations involving one real argument.
+
+ _Self& operator= (value_type __x) {
+ _M_re = __x;
+ _M_im = 0;
+ return *this;
+ }
+ _Self& operator+= (value_type __x) {
+ _M_re += __x;
+ return *this;
+ }
+ _Self& operator-= (value_type __x) {
+ _M_re -= __x;
+ return *this;
+ }
+ _Self& operator*= (value_type __x) {
+ _M_re *= __x;
+ _M_im *= __x;
+ return *this;
+ }
+ _Self& operator/= (value_type __x) {
+ _M_re /= __x;
+ _M_im /= __x;
+ return *this;
+ }
+
+ // Arithmetic op= operations involving two complex arguments.
+
+ static void _STLP_CALL _div(const long double& __z1_r, const long double& __z1_i,
+ const long double& __z2_r, const long double& __z2_i,
+ long double& __res_r, long double& __res_i);
+
+ static void _STLP_CALL _div(const long double& __z1_r,
+ const long double& __z2_r, const long double& __z2_i,
+ long double& __res_r, long double& __res_i);
+
+#if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
+
+ template <class _Tp2>
+ complex<long double>& operator=(const complex<_Tp2>& __z) {
+ _M_re = __z._M_re;
+ _M_im = __z._M_im;
+ return *this;
+ }
+
+ template <class _Tp2>
+ complex<long double>& operator+= (const complex<_Tp2>& __z) {
+ _M_re += __z._M_re;
+ _M_im += __z._M_im;
+ return *this;
+ }
+
+ template <class _Tp2>
+ complex<long double>& operator-= (const complex<_Tp2>& __z) {
+ _M_re -= __z._M_re;
+ _M_im -= __z._M_im;
+ return *this;
+ }
+
+ template <class _Tp2>
+ complex<long double>& operator*= (const complex<_Tp2>& __z) {
+ long double __r = _M_re * __z._M_re - _M_im * __z._M_im;
+ long double __i = _M_re * __z._M_im + _M_im * __z._M_re;
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+ template <class _Tp2>
+ complex<long double>& operator/= (const complex<_Tp2>& __z) {
+ long double __r;
+ long double __i;
+ _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ _Self& operator=(const _Self& __z) {
+ _M_re = __z._M_re;
+ _M_im = __z._M_im;
+ return *this;
+ }
+
+ _Self& operator+= (const _Self& __z) {
+ _M_re += __z._M_re;
+ _M_im += __z._M_im;
+ return *this;
+ }
+
+ _Self& operator-= (const _Self& __z) {
+ _M_re -= __z._M_re;
+ _M_im -= __z._M_im;
+ return *this;
+ }
+
+ _Self& operator*= (const _Self& __z) {
+ value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
+ value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+ _Self& operator/= (const _Self& __z) {
+ value_type __r;
+ value_type __i;
+ _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+ _M_re = __r;
+ _M_im = __i;
+ return *this;
+ }
+
+ // Data members.
+ value_type _M_re;
+ value_type _M_im;
+};
+
+# endif /* _STLP_NO_LONG_DOUBLE */
+
+// Converting constructors from one of these three specialized types
+// to another.
+
+inline complex<float>::complex(const complex<double>& __z)
+ : _M_re(__z._M_re), _M_im(__z._M_im) {}
+inline complex<double>::complex(const complex<float>& __z)
+ : _M_re(__z._M_re), _M_im(__z._M_im) {}
+# ifndef _STLP_NO_LONG_DOUBLE
+inline complex<float>::complex(const complex<long double>& __z)
+ : _M_re(__z._M_re), _M_im(__z._M_im) {}
+inline complex<double>::complex(const complex<long double>& __z)
+ : _M_re(__z._M_re), _M_im(__z._M_im) {}
+inline complex<long double>::complex(const complex<float>& __z)
+ : _M_re(__z._M_re), _M_im(__z._M_im) {}
+inline complex<long double>::complex(const complex<double>& __z)
+ : _M_re(__z._M_re), _M_im(__z._M_im) {}
+# endif
+
+# endif /* SPECIALIZATIONS */
+
+// Unary non-member arithmetic operators.
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL operator+(const complex<_Tp>& __z) {
+ return __z;
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL operator-(const complex<_Tp>& __z) {
+ return complex<_Tp>(-__z._M_re, -__z._M_im);
+}
+
+// Non-member arithmetic operations involving one real argument.
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL operator+(const _Tp& __x, const complex<_Tp>& __z) {
+ return complex<_Tp>(__x + __z._M_re, __z._M_im);
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL operator+(const complex<_Tp>& __z, const _Tp& __x) {
+ return complex<_Tp>(__z._M_re + __x, __z._M_im);
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL operator-(const _Tp& __x, const complex<_Tp>& __z) {
+ return complex<_Tp>(__x - __z._M_re, -__z._M_im);
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL operator-(const complex<_Tp>& __z, const _Tp& __x) {
+ return complex<_Tp>(__z._M_re - __x, __z._M_im);
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL operator*(const _Tp& __x, const complex<_Tp>& __z) {
+ return complex<_Tp>(__x * __z._M_re, __x * __z._M_im);
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL operator*(const complex<_Tp>& __z, const _Tp& __x) {
+ return complex<_Tp>(__z._M_re * __x, __z._M_im * __x);
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL operator/(const _Tp& __x, const complex<_Tp>& __z) {
+ complex<_Tp> __result;
+ complex<_Tp>::_div(__x,
+ __z._M_re, __z._M_im,
+ __result._M_re, __result._M_im);
+ return __result;
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL operator/(const complex<_Tp>& __z, const _Tp& __x) {
+ return complex<_Tp>(__z._M_re / __x, __z._M_im / __x);
+}
+
+// Non-member arithmetic operations involving two complex arguments
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL
+operator+(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
+ return complex<_Tp>(__z1._M_re + __z2._M_re, __z1._M_im + __z2._M_im);
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL
+operator-(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
+ return complex<_Tp>(__z1._M_re - __z2._M_re, __z1._M_im - __z2._M_im);
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL
+operator*(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
+ return complex<_Tp>(__z1._M_re * __z2._M_re - __z1._M_im * __z2._M_im,
+ __z1._M_re * __z2._M_im + __z1._M_im * __z2._M_re);
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL
+operator/(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
+ complex<_Tp> __result;
+ complex<_Tp>::_div(__z1._M_re, __z1._M_im,
+ __z2._M_re, __z2._M_im,
+ __result._M_re, __result._M_im);
+ return __result;
+}
+
+// Comparison operators.
+
+template <class _Tp>
+inline bool _STLP_CALL operator==(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
+ return __z1._M_re == __z2._M_re && __z1._M_im == __z2._M_im;
+}
+
+template <class _Tp>
+inline bool _STLP_CALL operator==(const complex<_Tp>& __z, const _Tp& __x) {
+ return __z._M_re == __x && __z._M_im == 0;
+}
+
+template <class _Tp>
+inline bool _STLP_CALL operator==(const _Tp& __x, const complex<_Tp>& __z) {
+ return __x == __z._M_re && 0 == __z._M_im;
+}
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class _Tp>
+inline bool _STLP_CALL operator!=(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
+ return __z1._M_re != __z2._M_re || __z1._M_im != __z2._M_im;
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+template <class _Tp>
+inline bool _STLP_CALL operator!=(const complex<_Tp>& __z, const _Tp& __x) {
+ return __z._M_re != __x || __z._M_im != 0;
+}
+
+template <class _Tp>
+inline bool _STLP_CALL operator!=(const _Tp& __x, const complex<_Tp>& __z) {
+ return __x != __z._M_re || 0 != __z._M_im;
+}
+
+// Other basic arithmetic operations
+
+template <class _Tp>
+inline _Tp _STLP_CALL real(const complex<_Tp>& __z) {
+ return __z._M_re;
+}
+
+template <class _Tp>
+inline _Tp _STLP_CALL imag(const complex<_Tp>& __z) {
+ return __z._M_im;
+}
+
+template <class _Tp>
+_Tp _STLP_CALL abs(const complex<_Tp>& __z) {
+ return _Tp(abs(complex<double>(double(__z.real()), double(__z.imag()))));
+}
+
+template <class _Tp>
+_Tp _STLP_CALL arg(const complex<_Tp>& __z) {
+ return _Tp(arg(complex<double>(double(__z.real()), double(__z.imag()))));
+}
+
+template <class _Tp>
+inline _Tp _STLP_CALL norm(const complex<_Tp>& __z) {
+ return __z._M_re * __z._M_re + __z._M_im * __z._M_im;
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL conj(const complex<_Tp>& __z) {
+ return complex<_Tp>(__z._M_re, -__z._M_im);
+}
+
+template <class _Tp>
+complex<_Tp> _STLP_CALL polar(const _Tp& __rho) {
+ return complex<_Tp>(__rho, 0);
+}
+
+template <class _Tp>
+complex<_Tp> _STLP_CALL polar(const _Tp& __rho, const _Tp& __phi) {
+ complex<double> __tmp = polar(double(__rho), double(__phi));
+ return complex<_Tp>(_Tp(__tmp.real()), _Tp(__tmp.imag()));
+}
+
+
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC float _STLP_CALL abs(const complex<float>&);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC double _STLP_CALL abs(const complex<double>&);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC float _STLP_CALL arg(const complex<float>&);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC double _STLP_CALL arg(const complex<double>&);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC complex<float> _STLP_CALL polar(const float& __rho, const float& __phi);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC complex<double> _STLP_CALL polar(const double& __rho, const double& __phi);
+
+
+# ifndef _STLP_NO_LONG_DOUBLE
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC long double _STLP_CALL arg(const complex<long double>&);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC long double _STLP_CALL abs(const complex<long double>&);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC complex<long double> _STLP_CALL polar(const long double&, const long double&);
+# endif
+
+
+#ifdef _STLP_USE_NEW_IOSTREAMS
+
+// Complex output, in the form (re,im). We use a two-step process
+// involving stringstream so that we get the padding right.
+template <class _Tp, class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __z);
+
+template <class _Tp, class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __z);
+
+// Specializations for narrow characters; lets us avoid widen.
+
+_STLP_OPERATOR_TEMPLATE
+_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL
+operator>>(basic_istream<char, char_traits<char> >& __is, complex<float>& __z);
+
+_STLP_OPERATOR_TEMPLATE
+_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL
+operator>>(basic_istream<char, char_traits<char> >& __is, complex<double>& __z);
+
+
+_STLP_OPERATOR_TEMPLATE
+_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __is, const complex<float>& __z);
+
+_STLP_OPERATOR_TEMPLATE
+_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __is, const complex<double>& __z);
+
+# if ! defined (_STLP_NO_LONG_DOUBLE)
+_STLP_OPERATOR_TEMPLATE
+_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL
+operator>>(basic_istream<char, char_traits<char> >& __is, complex<long double>& __z);
+
+_STLP_OPERATOR_TEMPLATE
+_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __is, const complex<long double>& __z);
+
+# endif
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT) && ! defined (_STLP_NO_WCHAR_T)
+
+_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator>>(
+ basic_istream<wchar_t, char_traits<wchar_t> >&, complex<double>&);
+_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator<<(
+ basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<double>&);
+_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator>>(
+ basic_istream<wchar_t, char_traits<wchar_t> >&, complex<float>&);
+_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator<<(
+ basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<float>&);
+
+# ifndef _STLP_NO_LONG_DOUBLE
+_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator>>(
+ basic_istream<wchar_t, char_traits<wchar_t> >&, complex<long double>&);
+_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator<<(
+ basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<long double>&);
+# endif
+
+# endif /* USE_TEMPLATE_EXPORT */
+
+#else /* _STLP_USE_NEW_IOSTREAMS */
+
+template <class _Tp>
+ostream& _STLP_CALL operator<<(ostream& s, const complex<_Tp>& __z);
+
+template <class _Tp>
+istream& _STLP_CALL operator>>(istream& s, complex<_Tp>& a);
+
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+
+
+// Transcendental functions. These are defined only for float,
+// double, and long double. (Sqrt isn't transcendental, of course,
+// but it's included in this section anyway.)
+
+_STLP_DECLSPEC complex<float> _STLP_CALL sqrt(const complex<float>&);
+
+_STLP_DECLSPEC complex<float> _STLP_CALL exp(const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL log(const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL log10(const complex<float>&);
+
+_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, int);
+_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, const float&);
+_STLP_DECLSPEC complex<float> _STLP_CALL pow(const float&, const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, const complex<float>&);
+
+_STLP_DECLSPEC complex<float> _STLP_CALL sin(const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL cos(const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL tan(const complex<float>&);
+
+_STLP_DECLSPEC complex<float> _STLP_CALL sinh(const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL cosh(const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL tanh(const complex<float>&);
+
+_STLP_DECLSPEC complex<double> _STLP_CALL sqrt(const complex<double>&);
+
+_STLP_DECLSPEC complex<double> _STLP_CALL exp(const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL log(const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL log10(const complex<double>&);
+
+_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, int);
+_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, const double&);
+_STLP_DECLSPEC complex<double> _STLP_CALL pow(const double&, const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, const complex<double>&);
+
+_STLP_DECLSPEC complex<double> _STLP_CALL sin(const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL cos(const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL tan(const complex<double>&);
+
+_STLP_DECLSPEC complex<double> _STLP_CALL sinh(const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL cosh(const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL tanh(const complex<double>&);
+
+# ifndef _STLP_NO_LONG_DOUBLE
+_STLP_DECLSPEC complex<long double> _STLP_CALL sqrt(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL exp(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL log(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL log10(const complex<long double>&);
+
+_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&, int);
+_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&, const long double&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const long double&, const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&,
+ const complex<long double>&);
+
+_STLP_DECLSPEC complex<long double> _STLP_CALL sin(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL cos(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL tan(const complex<long double>&);
+
+_STLP_DECLSPEC complex<long double> _STLP_CALL sinh(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL cosh(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL tanh(const complex<long double>&);
+# endif
+
+_STLP_END_NAMESPACE
+
+# ifndef _STLP_LINK_TIME_INSTANTIATION
+# include <stl/_complex.c>
+# endif
+
+#endif /* _STLP_template_complex */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_config.h b/src/STLport/stl/_config.h
new file mode 100644
index 0000000..c7b582c
--- /dev/null
+++ b/src/STLport/stl/_config.h
@@ -0,0 +1,1064 @@
+ /*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CONFIG_H
+# define _STLP_CONFIG_H
+
+/*
+ * Purpose of this file :
+ *
+ * Defines all STLport settings.
+ * This file is actually a wrapper : it includes compiler-specific
+ * settings from <config/stlcomp.h>
+ * and user-defined settings from <stl_user_config.h>.
+ * See <config/stl_mycomp.h> and <stl_user_config.h> for the description
+ * of those macros
+ *
+ */
+
+/* Other macros defined by this file:
+
+ * bool, true, and false, if _STLP_NO_BOOL is defined.
+ * typename, as a null macro if it's not already a keyword.
+ * explicit, as a null macro if it's not already a keyword.
+ * namespace-related macros (_STLP_STD, _STLP_BEGIN_NAMESPACE, etc.)
+ * exception-related macros (_STLP_TRY, _STLP_UNWIND, etc.)
+ * _STLP_ASSERT, either as a test or as a null macro, depending on
+ whether or not _STLP_ASSERTIONS is defined.
+*/
+
+/* The last SGI STL release we merged with */
+# define __SGI_STL 0x330
+
+/* STLport version */
+# define _STLPORT_VERSION 0x461
+
+/* Placeholder for user to override settings.
+ * It could be also used to mask settings from
+ * different directories.
+ */
+# include <stl_user_config.h>
+
+/* ========================================================= */
+/* This file is used for compatibility; it accepts old-style config
+ switches */
+# include <stl/_config_compat.h>
+
+/* Common configuration file for this particular installation. */
+
+# include <stl/_site_config.h>
+
+/* Use per-version compiler recognition */
+# include <config/stlcomp.h>
+
+/* ========================================================= */
+
+/* some fixes to configuration. This also includes modifications
+ * of STLport switches depending on compiler flags,
+ * or settings applicable to a group of compilers, such as
+ * to all who use EDG front-end.
+ */
+# include <config/stl_confix.h>
+
+
+/*
+ * Performs integrity check on user-specified parameters
+ * and site-specific settings.
+ */
+// # include <stl/_check_config.h>
+
+/* SGI terms */
+
+# if !defined (_STLP_NO_MEMBER_TEMPLATES) && !defined (_STLP_MEMBER_TEMPLATES)
+# define _STLP_MEMBER_TEMPLATES 1
+# endif
+
+# if !defined (_STLP_NO_FRIEND_TEMPLATES) && !defined (_STLP_FRIEND_TEMPLATES)
+# define _STLP_FRIEND_TEMPLATES 1
+# endif
+
+# if !defined (_STLP_NO_MEMBER_TEMPLATE_CLASSES) && !defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+# define _STLP_MEMBER_TEMPLATE_CLASSES 1
+# endif
+
+# if !defined (_STLP_NO_MEMBER_TEMPLATE_CLASSES) && !defined (_STLP_DONT_USE_NESTED_TCLASS_THROUGHT_TPARAM) && !defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM)
+# define _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM 1
+# endif
+
+#if !defined (_STLP_NO_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+# define _STLP_CLASS_PARTIAL_SPECIALIZATION 1
+#endif
+
+#if !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) && !defined (_STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER)
+# define _STLP_FUNCTION_TMPL_PARTIAL_ORDER 1
+#endif
+
+# if !defined (_STLP_BIG_ENDIAN) && ! defined (_STLP_LITTLE_ENDIAN)
+# if defined(_MIPSEB) || defined (__sparc) || \
+ defined (_AIX) || defined (__hpux) || defined(macintosh) || defined (_MAC)
+# define _STLP_BIG_ENDIAN 1
+# elif defined(__i386) || defined(_M_IX86)
+# define _STLP_LITTLE_ENDIAN 1
+# else
+# define _STLP_UNKNOWN_ENDIAN 1
+# endif
+# endif /* _STLP_BIG_ENDIAN */
+
+/* ==========================================================
+ * final workaround tuning based on given flags
+ * ========================================================== */
+
+#ifndef _STLP_UINT32_T
+# define _STLP_UINT32_T unsigned long
+#endif
+#ifndef _STLP_ABORT
+# define _STLP_ABORT() abort()
+#endif
+
+# if !defined (_STLP_HAS_NO_NAMESPACES)
+# if defined _STLP_NO_NAMESPACES
+# undef _STLP_USE_NAMESPACES
+# else
+/* assume it as the default, turn it off later if NO_NAMESPACES selected */
+# undef _STLP_USE_NAMESPACES
+# define _STLP_USE_NAMESPACES 1
+# endif
+# endif
+
+# if defined (_STLP_NO_IOSTREAMS)
+# define _STLP_USE_NO_IOSTREAMS
+# endif
+
+# if defined (_STLP_USE_NO_IOSTREAMS)
+# undef _STLP_USE_NEW_IOSTREAMS
+# endif
+
+# if ( defined (_STLP_OWN_IOSTREAMS) || ! defined (_STLP_HAS_NO_NEW_IOSTREAMS)) \
+ && ! defined (_STLP_USE_NO_IOSTREAMS) && !defined (_STLP_USE_NEW_IOSTREAMS)
+# define _STLP_USE_NEW_IOSTREAMS
+# endif
+
+# if defined (_STLP_NO_NEW_IOSTREAMS)
+# undef _STLP_USE_NEW_IOSTREAMS
+# undef _STLP_OWN_IOSTREAMS
+# endif
+
+/* Operating system recognition (basic) */
+# if defined (__unix) || defined (__linux__) || defined (__QNX__) || defined (_AIX) || defined (__NetBSD__) || defined (__Lynx__)
+# define _STLP_UNIX 1
+# if defined (__linux__) && ! defined (_STLP_USE_GLIBC)
+# define _STLP_USE_GLIBC 1
+# endif
+# elif defined(macintosh) || defined (_MAC)
+# define _STLP_MAC 1
+# elif defined (_WIN32) || defined (__WIN32) || defined (WIN32) || defined (__WIN32__)
+# define _STLP_WIN32 1
+# elif defined (__WIN16) || defined (WIN16) || defined (_WIN16)
+# define _STLP_WIN16
+# endif /* __unix */
+
+# if !defined(_STLP_MAKE_HEADER)
+# define _STLP_MAKE_HEADER(path, header) <path/header>
+# endif
+
+#if !defined (_STLP_NATIVE_HEADER)
+# if !defined (_STLP_NATIVE_INCLUDE_PATH)
+# define _STLP_NATIVE_INCLUDE_PATH ../include
+# endif
+# define _STLP_NATIVE_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_INCLUDE_PATH,header)
+#endif
+
+/* For some compilers, C headers like <stdio.h> are located in separate directory */
+#if !defined (_STLP_NATIVE_C_HEADER)
+# if !defined (_STLP_NATIVE_C_INCLUDE_PATH)
+# define _STLP_NATIVE_C_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH
+# endif
+# define _STLP_NATIVE_C_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_C_INCLUDE_PATH,header)
+#endif
+
+/* For some compilers, C-library headers like <cstdio> are located in separate directory */
+#if !defined (_STLP_NATIVE_CPP_C_HEADER)
+# if !defined (_STLP_NATIVE_CPP_C_INCLUDE_PATH)
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH
+# endif
+# define _STLP_NATIVE_CPP_C_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_CPP_C_INCLUDE_PATH,header)
+#endif
+
+/* Some compilers have weird placement of old-style iostream headers */
+#if !defined ( _STLP_NATIVE_OLD_STREAMS_HEADER )
+# if !defined (_STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH)
+# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH
+# endif
+# define _STLP_NATIVE_OLD_STREAMS_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH,header)
+#endif
+
+/* Some compilers locate basic C++ runtime support headers (<new>, <typeinfo>, <exception>) in separate directory */
+#if !defined ( _STLP_NATIVE_CPP_RUNTIME_HEADER )
+# if !defined (_STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH)
+# define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH
+# endif
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH,header)
+#endif
+
+/* shared library tune-up */
+
+#if defined (__BUILDING_STLPORT)
+/* if we are rebuilding right now as a DLL, place everything here */
+# undef _STLP_DESIGNATED_DLL
+# define _STLP_DESIGNATED_DLL 1
+#endif
+
+/* Use own namespace always if possible and not explicitly instructed otherwise */
+# if defined (_STLP_USE_NAMESPACES) && !defined (_STLP_BROKEN_USING_DIRECTIVE) && \
+ /* !defined (_STLP_OWN_IOSTREAMS) && */ !defined(_STLP_NO_OWN_NAMESPACE)
+# undef _STLP_USE_OWN_NAMESPACE
+# define _STLP_USE_OWN_NAMESPACE 1
+# else
+# undef _STLP_WHOLE_NATIVE_STD
+# endif
+
+# undef _STLP_NAMESPACE
+
+# if !defined(_NOTHREADS) && ! defined (_STLP_THREADS_DEFINED)
+
+# ifndef _REENTRANT
+# define _REENTRANT
+# endif
+
+# if defined(_PTHREADS)
+# define _STLP_PTHREADS
+# define _STLP_THREADS
+# endif
+# if defined(_UITHREADS)
+# define _STLP_UITHREADS
+# define _STLP_THREADS
+# endif
+
+# if defined (__sgi) && ! defined (__KCC) && ! defined (__GNUC__)
+# define _STLP_SGI_THREADS
+# elif defined(__DECC) || defined(__DECCXX)
+# define _STLP_DEC_THREADS
+# elif defined (_STLP_WIN32) && ! defined (_STLP_PTHREADS)
+# define _STLP_WIN32THREADS 1
+# elif ((defined (__sun) && !defined (__linux__)) \
+ || defined(_UITHREADS) ) && !defined(_STLP_PTHREADS)
+# define _STLP_UITHREADS
+# elif defined (__OS2__)
+# define _STLP_OS2THREADS
+# elif defined(__BEOS__)
+# define _STLP_BETHREADS
+# else
+# define _STLP_PTHREADS
+# endif /* __sgi */
+# define _STLP_THREADS_DEFINED
+# endif
+
+# if defined (_REENTRANT) && ! defined (_STLP_THREADS)
+# define _STLP_THREADS
+# endif /* _REENTRANT */
+
+// warning : pthread_spinlock code was reported not to work on RedHat 3
+# if defined(__linux__) && defined(_STLP_USE_PTHREAD_SPINLOCK)
+# include <features.h>
+# ifndef __USE_XOPEN2K
+# undef _STLP_USE_PTHREAD_SPINLOCK
+# endif /* __USE_XOPEN2K */
+# endif /* __linux__ && _STLP_PTHREADS */
+
+# ifndef _STLP_STATIC_MUTEX
+# define _STLP_STATIC_MUTEX _STLP_mutex_base
+# endif
+
+
+# if defined (_MFC_VER) && !defined (_STLP_USE_MFC)
+# define _STLP_USE_MFC 1
+# endif
+
+#if defined (_STLP_THREADS)
+# define _STLP_VOLATILE volatile
+/* windows.h _MUST be included before bool definition ;( */
+# if defined (_STLP_WIN32THREADS) && defined (_STLP_NO_BOOL)
+# undef NOMINMAX
+# define NOMINMAX
+# ifdef _STLP_USE_MFC
+# include <afx.h>
+# else
+# include <windows.h>
+# endif
+# define _STLP_WINDOWS_H_INCLUDED
+# endif
+#else
+# define _STLP_VOLATILE
+#endif
+
+# if !defined ( _STLP_USE_NEW_C_HEADERS ) && !defined ( _STLP_HAS_NO_NEW_C_HEADERS )
+# define _STLP_USE_NEW_C_HEADERS
+# endif
+/* disable new-style headers if requested */
+# if defined ( _STLP_NO_NEW_C_HEADERS )
+# undef _STLP_USE_NEW_C_HEADERS
+# endif
+
+# if !defined ( _STLP_STATIC_TEMPLATE_DATA )
+# define _STLP_STATIC_TEMPLATE_DATA 1
+# endif
+
+# if defined (_STLP_BASE_TYPEDEF_BUG)
+# undef _STLP_BASE_TYPEDEF_OUTSIDE_BUG
+# define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+# endif
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG ) || (defined (_STLP_MSVC) && (_STLP_MSVC < 1100))
+# define _STLP_GLOBAL_NESTED_RETURN_TYPE_PARAM_BUG
+# endif
+
+/* SUNpro 4.2 inline string literal bug */
+#ifdef _STLP_INLINE_STRING_LITERAL_BUG
+# define _STLP_FIX_LITERAL_BUG(__x) __x=__x;
+#else
+# define _STLP_FIX_LITERAL_BUG(__x)
+#endif
+
+# if defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
+# undef _STLP_NO_DEFAULT_NON_TYPE_PARAM
+# define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+# endif
+
+# define _STLP_NEW new
+# define _STLP_PLACEMENT_NEW new
+
+# ifdef _STLP_DEBUG
+# define _STLP_ASSERTIONS 1
+# endif
+
+/* apple mpw exception handling bug */
+#ifndef _STLP_MPWFIX_TRY
+# define _STLP_MPWFIX_TRY
+#endif
+#ifndef _STLP_MPWFIX_CATCH
+# define _STLP_MPWFIX_CATCH
+#endif
+#ifndef _STLP_MPWFIX_CATCH_ACTION
+# define _STLP_MPWFIX_CATCH_ACTION(action)
+#endif
+
+/* if _STLP_DEBUG or _STLP_ASSERTIONS are set, stl/debug/_debug.h defines those */
+
+# if !defined( _STLP_ASSERTIONS ) && !defined(_STLP_DEBUG) && !defined(_STLP_DEBUG_ALLOC)
+# define _STLP_ASSERT(expr)
+# endif
+
+# ifndef _STLP_DEBUG
+# define _STLP_VERBOSE_ASSERT(expr,diagnostic)
+# define _STLP_DEBUG_CHECK(expr)
+# define _STLP_DEBUG_DO(expr)
+# endif
+
+# if !defined (_STLP_WEAK)
+# define _STLP_WEAK
+# endif
+
+/* default parameters as template types derived from arguments ( not always supported ) */
+# if defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
+# define __DFL_TMPL_PARAM( classname, defval ) class classname
+# define __DFL_TMPL_ARG(classname) , classname
+# else
+# define _STLP_DEFAULT_TYPE_PARAM 1
+# define __DFL_TMPL_PARAM( classname, defval ) class classname = defval
+# define __DFL_TMPL_ARG(classname)
+# endif
+
+/* default parameters as complete types */
+# if defined ( _STLP_DEFAULT_TYPE_PARAM )
+# define __DFL_TYPE_PARAM( classname, defval ) class classname = defval
+# define __DFL_NON_TYPE_PARAM(type,name,val) type name = val
+# define __DFL_TYPE_ARG(classname)
+# else
+# define __DFL_TYPE_PARAM( classname, defval ) class classname
+# define __DFL_NON_TYPE_PARAM(type,name,val) type name
+# define __DFL_TYPE_ARG(classname) , classname
+# endif
+
+/* SGI compatibility */
+
+#ifdef _STLP_NO_WCHAR_T
+# ifndef _STLP_NO_NATIVE_WIDE_STREAMS
+# define _STLP_NO_NATIVE_WIDE_STREAMS 1
+# endif
+#else
+# define _STLP_HAS_WCHAR_T 1
+#endif
+
+#if !defined (_STLP_NO_AT_MEMBER_FUNCTION)
+# define _STLP_CAN_THROW_RANGE_ERRORS 1
+#endif
+
+# if !defined (_STLP_USE_RAW_SGI_ALLOCATORS)
+# define _STLP_DEFAULT_ALLOCATOR(_Tp) allocator< _Tp >
+# define _STLP_DEFAULT_ALLOCATOR_SELECT( _Tp ) __DFL_TMPL_PARAM(_Alloc, allocator< _Tp >)
+# define _STLP_DEFAULT_PAIR_ALLOCATOR(_Key, _Tp) allocator< pair < _Key, _Tp > >
+# if defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
+# define _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(_Key, _Tp ) class _Alloc
+# define _STLP_USE_WRAPPER_FOR_ALLOC_PARAM 1
+# else
+# define _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(_Key, _Tp ) \
+ class _Alloc = allocator< pair < _Key, _Tp > >
+# endif
+# else
+# define _STLP_DEFAULT_ALLOCATOR( _Tp ) __sgi_alloc
+# define _STLP_DEFAULT_ALLOCATOR_SELECT( _Tp ) __DFL_TYPE_PARAM(_Alloc,__sgi_alloc)
+# define _STLP_DEFAULT_PAIR_ALLOCATOR( _Key, _Tp ) __sgi_alloc
+# define _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(_Key, _Tp ) __DFL_TYPE_PARAM(_Alloc,__sgi_alloc)
+# if defined (_STLP_LIMITED_DEFAULT_TEMPLATES) && !defined (_STLP_DEFAULT_TYPE_PARAM)
+# define _STLP_USE_WRAPPER_FOR_ALLOC_PARAM 1
+# endif
+# endif
+
+/* default parameters workaround tuning */
+# if defined ( _STLP_USE_WRAPPER_FOR_ALLOC_PARAM )
+# define __WORKAROUND_RENAME(X) __##X
+# else
+# define __WORKAROUND_RENAME(X) X
+# endif
+# if defined ( _STLP_DEBUG )
+# define __WORKAROUND_DBG_RENAME(X) __##X
+# else
+# define __WORKAROUND_DBG_RENAME(X) __WORKAROUND_RENAME(X)
+# endif
+# define __FULL_NAME(X) __WORKAROUND_RENAME(X)
+
+/* this always mean the C library is in global namespace */
+# if defined (_STLP_HAS_NO_NEW_C_HEADERS) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
+# define _STLP_VENDOR_GLOBAL_CSTD 1
+# endif
+
+/* Depending of whether compiler supports namespaces,
+ * tune the parameters for vendor-supplied libraries.
+ * This section is guarded by _STLP_HAS_NO_NAMESPACES, not by _STLP_USE_NAMESPACES,
+ * since it depends only on the native features, not on user's preference whether
+ * to use namespace for STLport or not.
+ */
+# if !defined (_STLP_HAS_NO_NAMESPACES)
+/* Import some vendor's headers into corresponding STLport ones if they might be needed
+ * (if we wrap native iostreams and use namepace other than std::) */
+# if defined (_STLP_WHOLE_NATIVE_STD)
+# define _STLP_IMPORT_VENDOR_STD 1
+# undef _STLP_MINIMUM_IMPORT_STD
+# elif (defined (_STLP_USE_OWN_NAMESPACE) || ( defined (_STLP_DEBUG) && defined (_STLP_USE_NAMESPACES))) \
+ && defined (_STLP_USE_NEW_IOSTREAMS) && ! defined (_STLP_OWN_IOSTREAMS)
+# define _STLP_IMPORT_VENDOR_STD 1
+# endif
+
+/* if using stlport:: namespace or if C library stuff is not in vendor's std::,
+ * try importing 'em.
+ * MSVC has ambiguity problem when we try to import C-style std:: stuff back into global namespace */
+# if defined (_STLP_USE_NAMESPACES) && /* ! defined (_STLP_OWN_IOSTREAMS) && */ \
+ ( defined(_STLP_USE_OWN_NAMESPACE) || defined (_STLP_VENDOR_GLOBAL_CSTD))
+# define _STLP_IMPORT_VENDOR_CSTD 1
+# endif
+
+# if defined (_STLP_NO_USING_FOR_GLOBAL_FUNCTIONS) && ! defined (_STLP_DO_IMPORT_CSTD_FUNCTIONS)
+# define _STLP_NO_CSTD_FUNCTION_IMPORTS
+# endif
+
+# define _STLP_USING_NAMESPACE(x) using namespace x ;
+
+namespace std { }
+namespace __std_alias = std;
+
+/* assume std:: namespace for C++ std library if not being told otherwise */
+# ifdef _STLP_VENDOR_GLOBAL_STD
+# define _STLP_VENDOR_STD
+# define _STLP_USING_VENDOR_STD
+# else
+# define _STLP_VENDOR_STD __std_alias
+# define _STLP_USING_VENDOR_STD _STLP_USING_NAMESPACE(_STLP_VENDOR_STD)
+// # define _STLP_USING_VENDOR_STD
+# endif
+
+/* tune things that come from C library */
+# if defined (_STLP_VENDOR_GLOBAL_CSTD) || !defined(_STLP_USE_NEW_C_HEADERS)
+/* in old-style headers, C functions go to global scope. */
+# define _STLP_VENDOR_CSTD
+# define _STLP_USING_VENDOR_CSTD
+# else
+# define _STLP_VENDOR_CSTD _STLP_VENDOR_STD
+# define _STLP_USING_VENDOR_CSTD _STLP_USING_NAMESPACE(_STLP_VENDOR_CSTD)
+# endif /* _STLP_VENDOR_CSTD */
+/* exception, typeinfo, new - always come from the vendor */
+# ifndef _STLP_VENDOR_EXCEPT_STD
+# ifdef _STLP_VENDOR_GLOBAL_EXCEPT_STD
+# define _STLP_VENDOR_EXCEPT_STD
+# else
+# define _STLP_VENDOR_EXCEPT_STD _STLP_VENDOR_STD
+# endif
+# endif
+# define _STLP_OLD_IO_NAMESPACE
+# ifndef _STLP_VENDOR_MB_NAMESPACE
+# define _STLP_VENDOR_MB_NAMESPACE _STLP_VENDOR_CSTD
+# endif
+# else
+/* compiler has no namespace support */
+# define _STLP_VENDOR_STD
+# define _STLP_VENDOR_CSTD
+# define _STLP_USING_NAMESPACE(x)
+# define _STLP_USING_VENDOR_CSTD
+# define _STLP_USING_VENDOR_STD
+# define _STLP_VENDOR_EXCEPT_STD
+# endif
+
+# if defined (_STLP_USE_NAMESPACES)
+
+# if defined (_STLP_USE_OWN_NAMESPACE)
+# define _STLP_STD _STL
+# else
+# ifdef _STLP_DEBUG
+namespace stdD = std;
+# endif
+# define _STLP_STD std
+# endif /* _STLP_USE_OWN_NAMESPACE */
+
+# define _STLP_BEGIN_NAMESPACE namespace _STLP_STD {
+# define _STLP_END_NAMESPACE }
+
+_STLP_BEGIN_NAMESPACE _STLP_END_NAMESPACE
+
+namespace stlport = _STLP_STD;
+// backward compatibility
+# undef __STLPORT_NAMESPACE
+# define __STLPORT_NAMESPACE _STLP_STD
+
+/* decide whether or not we use separate namespace for rel ops */
+# if defined(_STLP_NO_RELOPS_NAMESPACE)
+# define _STLP_BEGIN_RELOPS_NAMESPACE _STLP_BEGIN_NAMESPACE namespace rel_ops {}
+# define _STLP_END_RELOPS_NAMESPACE }
+# else
+/* Use std::rel_ops namespace */
+# define _STLP_BEGIN_RELOPS_NAMESPACE _STLP_BEGIN_NAMESPACE namespace rel_ops {
+# define _STLP_END_RELOPS_NAMESPACE } }
+# define _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+# endif /* Use std::rel_ops namespace */
+
+# else /* _STLP_USE_NAMESPACES */
+/* STLport is being put into global namespace */
+# define _STLP_STD
+# define _STLP_BEGIN_NAMESPACE
+# define _STLP_END_NAMESPACE
+
+/* boris : it was found out that _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+ causes less problems than having relational operator templates in global namespace
+ Please define _STLP_NO_RELOPS_NAMESPACE in stl_user_config.h if your code rely on them. */
+# ifndef _STLP_NO_RELOPS_NAMESPACE
+# define _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+# endif
+# define _STLP_BEGIN_RELOPS_NAMESPACE
+# define _STLP_END_RELOPS_NAMESPACE
+# undef _STLP_USE_OWN_NAMESPACE
+# endif /* _STLP_USE_NAMESPACES */
+
+# define STLPORT_CSTD _STLP_VENDOR_CSTD
+# define STLPORT _STLP_STD
+
+#if defined(_STLP_BOGUS_TEMPLATE_TYPE_MATCHING_BUG)
+# define _STLP_SIMPLE_TYPE(T) _stl_trivial_proxy<T>
+#else
+# define _STLP_SIMPLE_TYPE(T) T
+#endif
+
+/* if we are going to use native new iostreams, use native <string> and <stdexcept> */
+# if defined (_STLP_USE_NEW_IOSTREAMS) && !defined (_STLP_OWN_IOSTREAMS)
+# define _STLP_USE_NATIVE_STRING 1
+# define _STLP_USE_NATIVE_STDEXCEPT 1
+# endif
+
+# ifndef _STLP_RAND48
+# define _STLP_NO_DRAND48
+# endif
+
+/* backwards compatibility */
+# define __STL_NAMESPACE _STLP_STD
+# define __STL_NAME(name) _STLP_STD::name
+
+/* advanced keywords usage */
+# ifndef _STLP_NO_NEW_STYLE_CASTS
+# define __CONST_CAST(__x,__y) const_cast<__x>(__y)
+# define __STATIC_CAST(__x,__y) static_cast<__x>(__y)
+# define __REINTERPRET_CAST(__x,__y) reinterpret_cast<__x>(__y)
+# define __DYNAMIC_CAST(__x,__y) dynamic_cast<__x>(__y)
+# else
+# define __STATIC_CAST(__x,__y) ((__x)(__y))
+# define __CONST_CAST(__x,__y) ((__x)(__y))
+# define __REINTERPRET_CAST(__x,__y) ((__x)(__y))
+# define __DYNAMIC_CAST(__x,__y) ((__x)(__y))
+# endif
+# if defined (_STLP_NEED_TYPENAME) && ! defined (typename)
+# define typename
+# endif
+# if defined (_STLP_NEED_TYPENAME) || defined (_STLP_NO_TYPENAME_ON_RETURN_TYPE )
+# define _STLP_TYPENAME_ON_RETURN_TYPE
+# else
+# define _STLP_TYPENAME_ON_RETURN_TYPE typename
+# endif
+# ifdef _STLP_NO_TYPENAME_IN_TEMPLATE_HEADER
+# define _STLP_HEADER_TYPENAME
+# else
+# define _STLP_HEADER_TYPENAME typename
+# endif
+# ifndef _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+# define _STLP_TEMPLATE template
+# else
+# define _STLP_TEMPLATE
+# endif
+# if defined (_STLP_NEED_EXPLICIT) && ! defined (explicit)
+# define explicit
+# endif
+# ifndef _STLP_NEED_MUTABLE
+# define __ASSIGN_MUTABLE(type,x,y) x=y
+# else
+# define __ASSIGN_MUTABLE(type,x,y) __CONST_CAST(type,x)=y
+# define mutable
+# endif
+# if defined (_STLP_NO_SIGNED_BUILTINS)
+/* old HP-UX doesn't understand "signed" keyword */
+# define signed
+# endif
+
+# if defined (_STLP_LOOP_INLINE_PROBLEMS)
+# define _STLP_INLINE_LOOP
+# else
+# define _STLP_INLINE_LOOP inline
+# endif
+
+# define _STLP_PRIVATE public
+# define _STLP_PROTECTED public
+
+# ifndef _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX
+# define _STLP_TEMPLATE_NULL template<>
+# else
+# define _STLP_TEMPLATE_NULL
+# endif
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+# define _STLP_OPERATOR_TEMPLATE
+# else
+# define _STLP_OPERATOR_TEMPLATE _STLP_TEMPLATE_NULL
+#endif
+
+# ifndef _STLP_CLASS_PARTIAL_SPECIALIZATION
+/* unless we have other compiler problem, try simulating partial spec here */
+# if ! defined (_STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS)
+# define _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+# endif
+/* For your own iterators, please use inheritance from iterator<> instead of these obsolete queries. */
+# if ( defined (_STLP_NESTED_TYPE_PARAM_BUG) || !defined (_STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS))
+# if ! defined ( _STLP_USE_OLD_HP_ITERATOR_QUERIES )
+# define _STLP_USE_OLD_HP_ITERATOR_QUERIES
+# endif
+# elif defined ( _STLP_NO_ANACHRONISMS )
+# undef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+# endif
+# endif
+
+# ifndef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+# define _STLP_NULL_TMPL_ARGS <>
+# else
+# define _STLP_NULL_TMPL_ARGS
+# endif
+
+# ifndef _STLP_ALLOCATOR_TYPE_DFL
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+# define _STLP_ALLOCATOR_TYPE_DFL
+# else
+# define _STLP_ALLOCATOR_TYPE_DFL = allocator_type()
+# endif
+# endif
+
+//When the compiler do not correctly initialized the basic types value in default parameters we prefer
+//to avoid them to be able to correct this bug.
+# if defined (_STLP_DEF_CONST_DEF_PARAM_BUG)
+# define _STLP_DONT_SUP_DFLT_PARAM 1
+# endif
+
+# if defined (__SGI_STL_NO_ARROW_OPERATOR) && ! defined (_STLP_NO_ARROW_OPERATOR)
+# define _STLP_NO_ARROW_OPERATOR
+# endif
+
+# if !defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+# if !( defined (_STLP_NO_ARROW_OPERATOR)) \
+ && !defined (_STLP_NO_MSVC50_COMPATIBILITY) && !defined (_STLP_MSVC50_COMPATIBILITY)
+/* this one is needed for proper reverse_iterator<> operator ->() handling */
+# define _STLP_MSVC50_COMPATIBILITY 1
+# endif
+# endif
+
+#if defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION )
+# if (defined(__IBMCPP__) && (500 <= __IBMCPP__) && (__IBMCPP__ < 600) )
+# define _STLP_DECLARE_REVERSE_ITERATORS(__reverse_iterator) \
+ typedef typename _STLP_STD :: reverse_iterator<const_iterator> const_reverse_iterator; \
+ typedef typename _STLP_STD :: reverse_iterator<iterator> reverse_iterator
+# elif (defined (__sgi) && ! defined (__GNUC__)) || defined (__SUNPRO_CC) || defined (__xlC__)
+# define _STLP_DECLARE_REVERSE_ITERATORS(__reverse_iterator) \
+ typedef _STLP_STD:: _STLP_TEMPLATE reverse_iterator<const_iterator> const_reverse_iterator; \
+ typedef _STLP_STD:: _STLP_TEMPLATE reverse_iterator<iterator> reverse_iterator
+# else
+# define _STLP_DECLARE_REVERSE_ITERATORS(__reverse_iterator) \
+ typedef _STLP_STD::reverse_iterator<const_iterator> const_reverse_iterator; \
+ typedef _STLP_STD::reverse_iterator<iterator> reverse_iterator
+# endif
+#else /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+# if defined (_STLP_MSVC50_COMPATIBILITY)
+# define _STLP_DECLARE_REVERSE_ITERATORS(__reverse_iterator) \
+ typedef _STLP_STD::__reverse_iterator<const_iterator, value_type, const_reference, \
+ const_pointer, difference_type> const_reverse_iterator; \
+ typedef _STLP_STD::__reverse_iterator<iterator, value_type, reference, pointer, difference_type> \
+ reverse_iterator
+# else
+# define _STLP_DECLARE_REVERSE_ITERATORS(__reverse_iterator) \
+ typedef _STLP_STD::__reverse_iterator<const_iterator, value_type, const_reference, \
+ difference_type> const_reverse_iterator; \
+ typedef _STLP_STD::__reverse_iterator<iterator, value_type, \
+ reference, difference_type> \
+ reverse_iterator
+# endif
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+# define _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS \
+ _STLP_DECLARE_REVERSE_ITERATORS(reverse_bidirectional_iterator)
+# define _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS \
+ _STLP_DECLARE_REVERSE_ITERATORS(reverse_iterator)
+
+# define __IMPORT_CONTAINER_TYPEDEFS(_Super) \
+ typedef typename _Super::value_type value_type; \
+ typedef typename _Super::size_type size_type; \
+ typedef typename _Super::difference_type difference_type; \
+ typedef typename _Super::reference reference; \
+ typedef typename _Super::const_reference const_reference; \
+ typedef typename _Super::pointer pointer; \
+ typedef typename _Super::const_pointer const_pointer; \
+ typedef typename _Super::allocator_type allocator_type;
+
+
+# define __IMPORT_ITERATORS(_Super) \
+ typedef typename _Super::iterator iterator; \
+ typedef typename _Super::const_iterator const_iterator;
+
+# define __IMPORT_REVERSE_ITERATORS(_Super) \
+ typedef typename _Super::const_reverse_iterator const_reverse_iterator; \
+ typedef typename _Super::reverse_iterator reverse_iterator;
+
+# define __IMPORT_SUPER_COPY_ASSIGNMENT(__derived_name, _Self, _SUPER) \
+ __derived_name(const _Super& __x) : _SUPER(__x) {} \
+ _Self& operator=(const _Super& __x) { \
+ *(_Super*)this = __x; \
+ return *this; \
+ } \
+ __derived_name(const _Self& __x) : _SUPER(__x) {} \
+ _Self& operator=(const _Self& __x) { \
+ *(_Super*)this = __x; \
+ return *this; \
+ }
+
+# define __IMPORT_WITH_ITERATORS(_Super) \
+__IMPORT_CONTAINER_TYPEDEFS(_Super) __IMPORT_ITERATORS(_Super)
+
+# define __IMPORT_WITH_REVERSE_ITERATORS(_Super) \
+__IMPORT_WITH_ITERATORS(_Super) __IMPORT_REVERSE_ITERATORS(_Super)
+
+# if defined (_STLP_TRIVIAL_CONSTRUCTOR_BUG)
+# define __TRIVIAL_CONSTRUCTOR(__type) __type() {}
+# else
+# define __TRIVIAL_CONSTRUCTOR(__type)
+# endif
+# if defined (_STLP_TRIVIAL_DESTRUCTOR_BUG)
+# define __TRIVIAL_DESTRUCTOR(__type) ~__type() {}
+# else
+# define __TRIVIAL_DESTRUCTOR(__type)
+# endif
+
+# define __TRIVIAL_STUFF(__type) \
+ __TRIVIAL_CONSTRUCTOR(__type) __TRIVIAL_DESTRUCTOR(__type)
+
+# if ! (defined ( _STLP_NO_EXCEPTIONS ) || defined (_STLP_HAS_NO_EXCEPTIONS) \
+ || defined ( _STLP_USE_EXCEPTIONS ))
+# define _STLP_USE_EXCEPTIONS
+# endif
+
+# ifdef _STLP_USE_EXCEPTIONS
+# define _STLP_TRY try
+# define _STLP_CATCH_ALL catch(...)
+# ifndef _STLP_THROW
+# define _STLP_THROW(x) throw x
+# endif
+# define _STLP_RETHROW throw
+# define _STLP_UNWIND(action) catch(...) { action; throw; }
+
+# ifdef _STLP_THROW_RETURN_BUG
+# define _STLP_RET_AFTER_THROW(data) return data
+# else
+# define _STLP_RET_AFTER_THROW(data)
+# endif
+
+# if !defined ( _STLP_NO_EXCEPTION_SPEC )
+# define _STLP_THROWS_INHERENTLY(x) throw x
+# define _STLP_NOTHROW_INHERENTLY throw()
+# else
+# define _STLP_THROWS_INHERENTLY(x)
+# define _STLP_NOTHROW_INHERENTLY
+# endif
+/* We do not use exception throw specifications unless we are forced to */
+# define _STLP_THROWS(x)
+# define _STLP_NOTHROW
+# else
+# define _STLP_TRY
+# define _STLP_CATCH_ALL if (false)
+# ifndef _STLP_THROW
+# define _STLP_THROW(x)
+# endif
+# define _STLP_RETHROW {}
+# define _STLP_UNWIND(action)
+# define _STLP_THROWS(x)
+# define _STLP_NOTHROW
+# define _STLP_RET_AFTER_THROW(data)
+# define _STLP_THROWS_INHERENTLY(x)
+# define _STLP_NOTHROW_INHERENTLY
+# endif
+
+#if defined(_STLP_NO_BOOL)
+# if (defined (__IBMCPP__) && (__IBMCPP__ < 400)) && ! defined (_AIX)
+# include <isynonym.hpp>
+# if defined (__OS400__)
+ typedef int bool;
+# elif !( defined (__xlC__) || defined (_AIX))
+ typedef Boolean bool;
+# endif
+# else
+# if defined(_STLP_YVALS_H)
+# include <yvals.h>
+# else
+# if defined (_STLP_DONT_USE_BOOL_TYPEDEF)
+# define bool int
+# else
+ typedef int bool;
+# endif
+# define true 1
+# define false 0
+# endif
+# endif /* __IBMCPP__ */
+#else
+# define _STLP_BOOL_KEYWORD 1
+#endif /* _STLP_NO_BOOL */
+
+# ifndef _STLP_MPW_EXTRA_CONST
+# define _STLP_MPW_EXTRA_CONST
+# endif
+
+# ifndef _STLP_DEFAULTCHAR
+# define _STLP_DEFAULTCHAR char
+# endif
+
+# if defined (_STLP_DEBUG_ALLOC) && ! defined (_STLP_ASSERTIONS)
+# define _STLP_ASSERTIONS 1
+# endif
+
+/* uninitialized value filler */
+# ifndef _STLP_SHRED_BYTE
+/* This value is designed to cause problems if an error occurs */
+# define _STLP_SHRED_BYTE 0xA3
+# endif /* _STLP_SHRED_BYTE */
+
+/* shared library tune-up */
+# ifndef _STLP_IMPORT_DECLSPEC
+# define _STLP_IMPORT_DECLSPEC
+# endif
+
+/* a keyword used to instantiate export template */
+# ifndef _STLP_EXPORT_TEMPLATE_KEYWORD
+# define _STLP_EXPORT_TEMPLATE_KEYWORD
+# endif
+# ifndef _STLP_IMPORT_TEMPLATE_KEYWORD
+# define _STLP_IMPORT_TEMPLATE_KEYWORD
+# endif
+
+
+# if defined (_STLP_DLLEXPORT_NEEDS_PREDECLARATION) && defined (_STLP_USE_DECLSPEC)
+# if ! defined (_STLP_USE_TEMPLATE_EXPORT)
+/* this setting turns on "extern template" extension use */
+# define _STLP_USE_TEMPLATE_EXPORT
+# endif
+# if defined (_STLP_DESIGNATED_DLL) && ! defined (_STLP_NO_FORCE_INSTANTIATE)
+# define _STLP_NO_FORCE_INSTANTIATE
+# endif
+# endif
+
+# if defined (_STLP_DESIGNATED_DLL) /* This is a lib which will contain STLport exports */
+# define _STLP_EXPORT _STLP_EXPORT_TEMPLATE_KEYWORD
+# else
+# define _STLP_EXPORT _STLP_IMPORT_TEMPLATE_KEYWORD
+# endif
+
+# ifndef _STLP_EXPORT_TEMPLATE
+# define _STLP_EXPORT_TEMPLATE _STLP_EXPORT template
+# endif
+
+# if defined (_STLP_USE_DECLSPEC) /* using export/import technique */
+
+# ifndef _STLP_EXPORT_DECLSPEC
+# define _STLP_EXPORT_DECLSPEC
+# endif
+# ifndef _STLP_IMPORT_DECLSPEC
+# define _STLP_IMPORT_DECLSPEC
+# endif
+# ifndef _STLP_CLASS_EXPORT_DECLSPEC
+# define _STLP_CLASS_EXPORT_DECLSPEC
+# endif
+# ifndef _STLP_CLASS_IMPORT_DECLSPEC
+# define _STLP_CLASS_IMPORT_DECLSPEC
+# endif
+# if defined (_STLP_DESIGNATED_DLL) /* This is a lib which will contain STLport exports */
+# define _STLP_DECLSPEC _STLP_EXPORT_DECLSPEC
+# define _STLP_CLASS_DECLSPEC _STLP_CLASS_EXPORT_DECLSPEC
+# else
+# define _STLP_DECLSPEC _STLP_IMPORT_DECLSPEC /* Other modules, importing STLport exports */
+# define _STLP_CLASS_DECLSPEC _STLP_CLASS_IMPORT_DECLSPEC
+# endif
+
+# ifndef _STLP_STATIC_CONST_INIT_BUG
+// constant data members cannot be exported; using workaround here
+# define _STLP_STATIC_CONST_INIT_BUG
+# endif
+# else /* Not using DLL export/import specifications */
+
+# define _STLP_DECLSPEC
+# define _STLP_CLASS_DECLSPEC
+
+# endif
+
+# define _STLP_EXPORT_TEMPLATE_CLASS _STLP_EXPORT template class _STLP_CLASS_DECLSPEC
+
+# if defined (_STLP_MSVC) || defined (__ICL)
+# define _STLP_STATIC_MEMBER_DECLSPEC
+# else
+# define _STLP_STATIC_MEMBER_DECLSPEC _STLP_DECLSPEC
+# endif
+
+# if !defined (_STLP_CALL)
+# define _STLP_CALL
+# endif
+
+#ifdef _STLP_OWN_IOSTREAMS
+
+# if defined (__DECCXX) && ! defined (__USE_STD_IOSTREAM)
+# define __USE_STD_IOSTREAM
+# endif
+
+/* We only need to expose details of streams implementation
+ if we use non-standard i/o or are building STLport*/
+# if defined (__BUILDING_STLPORT) || defined (_STLP_NO_FORCE_INSTANTIATE) || !defined(_STLP_NO_CUSTOM_IO)
+# define _STLP_EXPOSE_STREAM_IMPLEMENTATION 1
+# endif
+
+/* We only need to expose details of global implementation if we are building STLport
+ or have not instantiated everything in the lib */
+# if defined (__BUILDING_STLPORT) || defined (_STLP_NO_FORCE_INSTANTIATE)
+# undef _STLP_EXPOSE_GLOBALS_IMPLEMENTATION
+# define _STLP_EXPOSE_GLOBALS_IMPLEMENTATION 1
+# endif
+
+#else
+/* when we are not using SGI iostreams, we must expose globals, but not streams implementation */
+# define _STLP_EXPOSE_GLOBALS_IMPLEMENTATION
+#endif
+
+# ifdef _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS
+# define _STLP_PSPEC2(t1,t2) < t1,t2 >
+# define _STLP_PSPEC3(t1,t2,t3) < t1,t2,t3 >
+# else
+# define _STLP_PSPEC2(t1,t2) /* nothing */
+# define _STLP_PSPEC3(t1,t2,t3) /* nothing */
+# endif
+
+# ifdef _STLP_OPERATOR_SPEC_NEEDS_TEMPLATE_ARGS
+# define _STLP_OPSPEC2(t1,t2) < t1,t2 >
+# else
+# define _STLP_OPSPEC2(t1,t2) /* nothing */
+# endif
+
+//Activation of the partial template workaround:
+# if !defined(_STLP_DONT_USE_PARTIAL_SPEC_WRKD) \
+ && (!defined(_STLP_CLASS_PARTIAL_SPECIALIZATION) || !defined(_STLP_FUNCTION_TMPL_PARTIAL_ORDER))
+# define _STLP_USE_PARTIAL_SPEC_WORKAROUND
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+# define _STLP_NEW_IO_NAMESPACE _STLP_STD
+# define _STLP_NO_WIDE_STREAMS _STLP_NO_WCHAR_T
+# else
+# ifdef _STLP_USE_NEW_IOSTREAMS
+# define _STLP_NEW_IO_NAMESPACE _STLP_VENDOR_STD
+# ifdef _STLP_NO_NATIVE_WIDE_STREAMS
+# define _STLP_NO_WIDE_STREAMS _STLP_NO_NATIVE_WIDE_STREAMS
+# endif /* _STLP_NO_NATIVE_WIDE_STREAMS */
+# else
+# define _STLP_NO_WIDE_STREAMS
+# define _STLP_NEW_IO_NAMESPACE
+# endif
+# endif
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+# define _STLP_RELOPS_OPERATORS(_TMPL, _TP) \
+_TMPL inline bool _STLP_CALL operator!=(const _TP& __x, const _TP& __y) {return !(__x == __y);}\
+_TMPL inline bool _STLP_CALL operator>(const _TP& __x, const _TP& __y) {return __y < __x;}\
+_TMPL inline bool _STLP_CALL operator<=(const _TP& __x, const _TP& __y) { return !(__y < __x);}\
+_TMPL inline bool _STLP_CALL operator>=(const _TP& __x, const _TP& __y) { return !(__x < __y);}
+# else
+# define _STLP_RELOPS_OPERATORS(_TMPL, _TP)
+# endif
+
+# if defined (_STLP_FULL_ADL_IMPLEMENTED) && defined (_STLP_NO_OWN_IOSTREAMS)
+# error "Invalid configuration, STLport wrapper iostream mode can't be used with compiler"\
+ "implementing full Argument Dependent Lookup. Please remove _STLP_NO_OWN_IOSTREAMS switch"\
+ "and build STLport library."
+# endif /* _STLP_FULL_ADL_IMPLEMENTED && _STLP_NO_OWN_IOSTREAMS */
+
+# if defined ( _STLP_USE_ABBREVS )
+# include <stl/_abbrevs.h>
+# endif
+
+/* some cleanup */
+# undef _STLP_DONT_USE_BOOL_TYPEDEF
+# undef _STLP_YVALS_H
+# undef _STLP_LOOP_INLINE_PROBLEMS
+# undef _STLP_NEED_EXPLICIT
+# undef _STLP_NEED_TYPENAME
+# undef _STLP_NO_NEW_STYLE_CASTS
+# undef __AUTO_CONFIGURED
+
+#endif /* _STLP_CONFIG_H */
+
+/*
+ Local Variables:
+ mode:C++
+ End:
+*/
diff --git a/src/STLport/stl/_config_compat.h b/src/STLport/stl/_config_compat.h
new file mode 100644
index 0000000..5d9110c
--- /dev/null
+++ b/src/STLport/stl/_config_compat.h
@@ -0,0 +1,89 @@
+
+/*
+ * Compatibility section
+ * This section sets new-style macros based on old-style ones, for compatibility
+ */
+
+# if (defined (__STL_NO_SGI_IOSTREAMS) || defined (_STLP_NO_SGI_IOSTREAMS)) \
+ && ! defined ( _STLP_NO_OWN_IOSTREAMS )
+# define _STLP_NO_OWN_IOSTREAMS
+# endif
+
+# if defined (__STL_NO_NEW_IOSTREAMS) && ! defined ( _STLP_NO_NEW_IOSTREAMS )
+# define _STLP_NO_NEW_IOSTREAMS __STL_NO_NEW_IOSTREAMS
+# endif
+# if defined (__STL_NO_IOSTREAMS) && ! defined ( _STLP_NO_IOSTREAMS )
+# define _STLP_NO_IOSTREAMS __STL_NO_IOSTREAMS
+# endif
+# if defined (__STL_DEBUG) && ! defined ( _STLP_DEBUG )
+# define _STLP_DEBUG __STL_DEBUG
+# endif
+# if defined (__STL_NO_ANACHRONISMS) && ! defined ( _STLP_NO_ANACHRONISMS )
+# define _STLP_NO_ANACHRONISMS __STL_NO_ANACHRONISMS
+# endif
+# if defined (__STL_NO_EXTENSIONS) && ! defined ( _STLP_NO_EXTENSIONS )
+# define _STLP_NO_EXTENSIONS __STL_NO_EXTENSIONS
+# endif
+# if defined (__STL_NO_EXCEPTIONS) && ! defined ( _STLP_NO_EXCEPTIONS )
+# define _STLP_NO_EXCEPTIONS __STL_NO_EXCEPTIONS
+# endif
+# if defined (__STL_NO_NAMESPACES) && ! defined ( _STLP_NO_NAMESPACES )
+# define _STLP_NO_NAMESPACES __STL_NO_NAMESPACES
+# endif
+# if defined (__STL_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && ! defined ( _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS )
+# define _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS __STL_MINIMUM_DEFAULT_TEMPLATE_PARAMS
+# endif
+# if defined (__STL_NO_OWN_NAMESPACE) && ! defined ( _STLP_NO_OWN_NAMESPACE )
+# define _STLP_NO_OWN_NAMESPACE __STL_NO_OWN_NAMESPACE
+# endif
+
+# if defined (__STL_NO_RELOPS_NAMESPACE) && ! defined ( _STLP_NO_RELOPS_NAMESPACE )
+# define _STLP_NO_RELOPS_NAMESPACE __STL_NO_RELOPS_NAMESPACE
+# endif
+
+# if defined (__STL_DEBUG_UNINITIALIZED) && ! defined ( _STLP_DEBUG_UNINITIALIZED )
+# define _STLP_DEBUG_UNINITIALIZED __STL_DEBUG_UNINITIALIZED
+# endif
+# if defined (__STL_SHRED_BYTE) && ! defined ( _STLP_SHRED_BYTE )
+# define _STLP_SHRED_BYTE __STL_SHRED_BYTE
+# endif
+# if defined (__STL_USE_MFC) && ! defined ( _STLP_USE_MFC )
+# define _STLP_USE_MFC __STL_USE_MFC
+# endif
+
+# if defined (__STL_USE_NEWALLOC) && ! defined ( _STLP_USE_NEWALLOC )
+# define _STLP_USE_NEWALLOC __STL_USE_NEWALLOC
+# endif
+# if defined (__STL_USE_MALLOC) && ! defined ( _STLP_USE_MALLOC )
+# define _STLP_USE_MALLOC __STL_USE_MALLOC
+# endif
+
+# if defined (__STL_DEBUG_ALLOC) && ! defined ( _STLP_DEBUG_ALLOC )
+# define _STLP_DEBUG_ALLOC __STL_DEBUG_ALLOC
+# endif
+
+# if defined (__STL_DEBUG_MESSAGE) && ! defined ( _STLP_DEBUG_MESSAGE )
+# define _STLP_DEBUG_MESSAGE __STL_DEBUG_MESSAGE
+# endif
+
+# if defined (__STL_DEBUG_TERMINATE) && ! defined ( _STLP_DEBUG_TERMINATE )
+# define _STLP_DEBUG_TERMINATE __STL_DEBUG_TERMINATE
+# endif
+
+# if defined (__STL_NO_DEBUG_EXCEPTIONS) && ! defined ( _STLP_NO_DEBUG_EXCEPTIONS )
+# define _STLP_NO_DEBUG_EXCEPTIONS __STL_NO_DEBUG_EXCEPTIONS
+# endif
+
+# if defined (__STL_USE_ABBREVS) && ! defined ( _STLP_USE_ABBREVS )
+# define _STLP_USE_ABBREVS __STL_USE_ABBREVS
+# endif
+
+# if defined (__STL_NO_MSVC50_COMPATIBILITY) && ! defined ( _STLP_NO_MSVC50_COMPATIBILITY )
+# define _STLP_NO_MSVC50_COMPATIBILITY __STL_NO_MSVC50_COMPATIBILITY
+# endif
+
+# if defined (__STL_USE_RAW_SGI_ALLOCATORS) && ! defined ( _STLP_USE_RAW_SGI_ALLOCATORS )
+# define _STLP_USE_RAW_SGI_ALLOCATORS __STL_USE_RAW_SGI_ALLOCATORS
+# endif
+
+
diff --git a/src/STLport/stl/_config_compat_post.h b/src/STLport/stl/_config_compat_post.h
new file mode 100644
index 0000000..298c49e
--- /dev/null
+++ b/src/STLport/stl/_config_compat_post.h
@@ -0,0 +1,35 @@
+//==========================================
+
+# define __SGI_STL_PORT _STLPORT_VERSION
+
+# if defined (_STLP_DEBUG) && ! defined ( __STL_DEBUG )
+# define __STL_DEBUG _STLP_DEBUG
+# endif
+
+# if defined (_STLP_USE_NAMESPACES)
+# undef __STL_USE_NAMESPACES
+# define __STL_USE_NAMESPACES _STLP_USE_NAMESPACES
+# endif
+
+# if defined (_STLP_USE_EXCEPTIONS)
+# undef __STL_USE_EXCEPTIONS
+# define __STL_USE_EXCEPTIONS _STLP_USE_EXCEPTIONS
+# endif
+
+# if defined (_STLP_USE_NEW_IOSTREAMS) && ! defined ( __STL_USE_NEW_IOSTREAMS )
+# define __STL_USE_NEW_IOSTREAMS _STLP_USE_NEW_IOSTREAMS
+# endif
+
+# if defined (_STLP_BEGIN_NAMESPACE) && ! defined ( __STL_BEGIN_NAMESPACE )
+# define __STL_BEGIN_NAMESPACE _STLP_BEGIN_NAMESPACE
+# define __STL_END_NAMESPACE _STLP_END_NAMESPACE
+# define __STL_VENDOR_STD _STLP_VENDOR_STD
+# define __STL_VENDOR_CSTD _STLP_VENDOR_CSTD
+# endif
+
+/*
+# if defined (_STLP_XXX) && ! defined ( __STL_XXX )
+# define __STL_XXX _STLP_XXX
+# endif
+*/
+
diff --git a/src/STLport/stl/_construct.h b/src/STLport/stl/_construct.h
new file mode 100644
index 0000000..12eb16d
--- /dev/null
+++ b/src/STLport/stl/_construct.h
@@ -0,0 +1,167 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_CONSTRUCT_H
+#define _STLP_INTERNAL_CONSTRUCT_H
+
+# if defined (_STLP_DEBUG_UNINITIALIZED) && ! defined (_STLP_CSTRING)
+# include <cstring>
+# endif
+
+# ifndef _STLP_INTERNAL_NEW_HEADER
+# include <stl/_new.h>
+# endif
+
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_TRIVIAL_DESTRUCTOR_BUG
+template <class _Tp>
+inline void __destroy_aux(_Tp* __pointer, const __false_type&) { __pointer->~_Tp(); }
+template <class _Tp>
+inline void __destroy_aux(_Tp* __pointer, const __true_type&) {}
+# endif
+
+template <class _Tp>
+inline void _Destroy(_Tp* __pointer) {
+# if _MSC_VER >= 1010
+ __pointer;
+# endif // _MSC_VER >= 1000
+# ifdef _STLP_TRIVIAL_DESTRUCTOR_BUG
+ typedef typename __type_traits<_Tp>::has_trivial_destructor _Trivial_destructor;
+ __destroy_aux(__pointer, _Trivial_destructor());
+# else
+# if ( defined (__BORLANDC__) && ( __BORLANDC__ < 0x500 ) )
+ __pointer->_Tp::~_Tp();
+# else
+ __pointer->~_Tp();
+# endif
+# endif
+# ifdef _STLP_DEBUG_UNINITIALIZED
+ memset((char*)__pointer, _STLP_SHRED_BYTE, sizeof(_Tp));
+# endif
+}
+
+# if defined (new)
+# define _STLP_NEW_REDEFINE new
+# undef new
+# endif
+
+# ifdef _STLP_DEFAULT_CONSTRUCTOR_BUG
+template <class _T1>
+inline void _Construct_aux (_T1* __p, const __false_type&) {
+_STLP_PLACEMENT_NEW (__p) _T1();
+}
+
+template <class _T1>
+inline void _Construct_aux (_T1* __p, const __true_type&) {
+_STLP_PLACEMENT_NEW (__p) _T1(0);
+}
+# endif
+
+template <class _T1, class _T2>
+inline void _Construct(_T1* __p, const _T2& __val) {
+# ifdef _STLP_DEBUG_UNINITIALIZED
+ memset((char*)__p, _STLP_SHRED_BYTE, sizeof(_T1));
+# endif
+ _STLP_PLACEMENT_NEW (__p) _T1(__val);
+}
+
+template <class _T1>
+inline void _Construct(_T1* __p) {
+# ifdef _STLP_DEBUG_UNINITIALIZED
+ memset((char*)__p, _STLP_SHRED_BYTE, sizeof(_T1));
+# endif
+# ifdef _STLP_DEFAULT_CONSTRUCTOR_BUG
+typedef typename _Is_integer<_T1>::_Integral _Is_Integral;
+_Construct_aux (__p, _Is_Integral() );
+# else
+ _STLP_PLACEMENT_NEW (__p) _T1();
+# endif
+}
+
+# if defined(_STLP_NEW_REDEFINE)
+# ifdef DEBUG_NEW
+# define new DEBUG_NEW
+# endif
+# undef _STLP_NEW_REDEFINE
+# endif
+
+template <class _ForwardIterator>
+_STLP_INLINE_LOOP void
+__destroy_aux(_ForwardIterator __first, _ForwardIterator __last, const __false_type&) {
+ for ( ; __first != __last; ++__first)
+ _STLP_STD::_Destroy(&*__first);
+}
+
+template <class _ForwardIterator>
+inline void __destroy_aux(_ForwardIterator, _ForwardIterator, const __true_type&) {}
+
+template <class _ForwardIterator, class _Tp>
+inline void
+__destroy(_ForwardIterator __first, _ForwardIterator __last, _Tp*) {
+ typedef typename __type_traits<_Tp>::has_trivial_destructor _Trivial_destructor;
+ __destroy_aux(__first, __last, _Trivial_destructor());
+}
+
+template <class _ForwardIterator>
+inline void _Destroy(_ForwardIterator __first, _ForwardIterator __last) {
+ __destroy(__first, __last, _STLP_VALUE_TYPE(__first, _ForwardIterator));
+}
+
+inline void _Destroy(char*, char*) {}
+# ifdef _STLP_HAS_WCHAR_T // dwa 8/15/97
+inline void _Destroy(wchar_t*, wchar_t*) {}
+inline void _Destroy(const wchar_t*, const wchar_t*) {}
+# endif
+
+# ifndef _STLP_NO_ANACHRONISMS
+// --------------------------------------------------
+// Old names from the HP STL.
+
+template <class _T1, class _T2>
+inline void construct(_T1* __p, const _T2& __val) {_Construct(__p, __val); }
+template <class _T1>
+inline void construct(_T1* __p) { _Construct(__p); }
+template <class _Tp>
+inline void destroy(_Tp* __pointer) { _STLP_STD::_Destroy(__pointer); }
+template <class _ForwardIterator>
+inline void destroy(_ForwardIterator __first, _ForwardIterator __last) { _STLP_STD::_Destroy(__first, __last); }
+# endif
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_CONSTRUCT_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_ctraits_fns.h b/src/STLport/stl/_ctraits_fns.h
new file mode 100644
index 0000000..09501b0
--- /dev/null
+++ b/src/STLport/stl/_ctraits_fns.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ */
+
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+#ifndef _STLP_INTERNAL_CTRAITS_FUNCTIONS_H
+#define _STLP_INTERNAL_CTRAITS_FUNCTIONS_H
+
+# ifndef _STLP_INTERNAL_FUNCTION_H
+# include <stl/_function_base.h>
+# endif
+
+// This file contains a few small adapters that allow a character
+// traits class to be used as a function object.
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Traits>
+struct _Eq_traits
+ : public binary_function<typename _Traits::char_type,
+ typename _Traits::char_type,
+ bool>
+{
+ bool operator()(const typename _Traits::char_type& __x,
+ const typename _Traits::char_type& __y) const
+ { return _Traits::eq(__x, __y); }
+};
+
+template <class _Traits>
+struct _Eq_char_bound
+ : public unary_function<typename _Traits::char_type, bool>
+{
+ typename _Traits::char_type __val;
+ _Eq_char_bound(typename _Traits::char_type __c) : __val(__c) {}
+ bool operator()(const typename _Traits::char_type& __x) const
+ { return _Traits::eq(__x, __val); }
+};
+
+template <class _Traits>
+struct _Neq_char_bound
+ : public unary_function<typename _Traits::char_type, bool>
+{
+ typename _Traits::char_type __val;
+ _Neq_char_bound(typename _Traits::char_type __c) : __val(__c) {}
+ bool operator()(const typename _Traits::char_type& __x) const
+ { return !_Traits::eq(__x, __val); }
+};
+
+template <class _Traits>
+struct _Eq_int_bound
+ : public unary_function<typename _Traits::char_type, bool>
+{
+ typename _Traits::int_type __val;
+
+ _Eq_int_bound(typename _Traits::int_type __c) : __val(__c) {}
+ bool operator()(const typename _Traits::char_type& __x) const
+ { return _Traits::eq_int_type(_Traits::to_int_type(__x), __val); }
+};
+
+# if 0
+template <class _Traits>
+struct _Lt_traits
+ : public binary_function<typename _Traits::char_type,
+ typename _Traits::char_type,
+ bool>
+{
+ bool operator()(const typename _Traits::char_type& __x,
+ const typename _Traits::char_type& __y) const
+ { return _Traits::lt(__x, __y); }
+};
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_CTRAITS_FUNCTIONS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
+
+
+
diff --git a/src/STLport/stl/_ctype.h b/src/STLport/stl/_ctype.h
new file mode 100644
index 0000000..5de2126
--- /dev/null
+++ b/src/STLport/stl/_ctype.h
@@ -0,0 +1,269 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+#ifndef _STLP_INTERNAL_CTYPE_H
+#define _STLP_INTERNAL_CTYPE_H
+
+# ifndef _STLP_C_LOCALE_H
+# include <stl/c_locale.h>
+# endif
+# ifndef _STLP_INTERNAL_LOCALE_H
+# include <stl/_locale.h>
+# endif
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+class _STLP_CLASS_DECLSPEC ctype_base {
+public:
+ enum mask {
+ space = _Locale_SPACE,
+ print = _Locale_PRINT,
+ cntrl = _Locale_CNTRL,
+ upper = _Locale_UPPER,
+ lower = _Locale_LOWER,
+ alpha = _Locale_ALPHA,
+ digit = _Locale_DIGIT,
+ punct = _Locale_PUNCT,
+ xdigit = _Locale_XDIGIT,
+ alnum = alpha | digit,
+ graph = alnum | punct
+ };
+};
+
+// ctype<> template
+
+template <class charT> class ctype {};
+template <class charT> class ctype_byname {};
+
+//ctype specializations
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC ctype<char> : public locale::facet, public ctype_base
+{
+
+# ifndef _STLP_NO_WCHAR_T
+# ifdef _STLP_MSVC
+ typedef ctype<wchar_t> _Wctype;
+ friend _Wctype;
+# else
+ friend class ctype<wchar_t>;
+# endif
+# endif
+ friend class _Locale;
+public:
+
+ typedef char char_type;
+
+ explicit ctype(const mask* __tab = 0, bool __del = false, size_t __refs = 0);
+ bool is(mask __m, char __c) const
+ { return ((*(_M_ctype_table+(unsigned char)__c)) & __m) != 0; }
+
+ const char* is(const char* __low, const char* __high, mask* __vec) const {
+ for (const char* __p = __low;__p != __high; ++__p, ++__vec) {
+ *__vec = _M_ctype_table[(unsigned char)*__p];
+ }
+ return __high;
+ }
+
+ const char* scan_is(mask __m, const char* __low, const char* __high) const;
+ const char* scan_not(mask __m, const char* __low, const char* __high) const;
+
+ char (toupper)(char __c) const { return do_toupper(__c); }
+ const char* (toupper)(char* __low, const char* __high) const {
+ return do_toupper(__low, __high);
+ }
+
+ char (tolower)(char __c) const { return do_tolower(__c); }
+ const char* (tolower)(char* __low, const char* __high) const {
+ return do_tolower(__low, __high);
+ }
+
+ char widen(char __c) const { return do_widen(__c); }
+ const char* widen(const char* __low, const char* __high, char* __to) const {
+ return do_widen(__low, __high, __to);
+ }
+
+ char narrow(char __c, char __dfault) const {
+ return do_narrow(__c, __dfault);
+ }
+ const char* narrow(const char* __low, const char* __high,
+ char __dfault, char* __to) const {
+ return do_narrow(__low, __high, __dfault, __to);
+ }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+# if defined(_STLP_STATIC_CONST_INIT_BUG)
+ enum __TableSize { table_size = 256 };
+# else
+ static const size_t table_size = 256;
+# endif
+
+protected:
+ const mask* table() const _STLP_NOTHROW {return _M_ctype_table;}
+ static const mask* _STLP_CALL classic_table() _STLP_NOTHROW { return & _S_classic_table [1]; }
+
+ ~ctype();
+
+ virtual char do_toupper(char __c) const;
+ virtual char do_tolower(char __c) const;
+ virtual const char* do_toupper(char* __low, const char* __high) const;
+ virtual const char* do_tolower(char* __low, const char* __high) const;
+ virtual char do_widen(char __c) const;
+ virtual const char* do_widen(const char* __low, const char* __high,
+ char* __to) const;
+ virtual char do_narrow(char __c, char /* dfault */ ) const;
+ virtual const char* do_narrow(const char* __low, const char* __high,
+ char /* dfault */, char* __to) const;
+private:
+ struct _Is_mask {
+ mask __m;
+ _Is_mask(mask __x): __m(__x) {}
+ bool operator()(char __c) {return (__m & (unsigned char) __c) != 0;}
+ };
+
+ static const mask _S_classic_table[257 /* table_size + 1 */];
+ const mask* _M_ctype_table;
+ bool _M_delete;
+
+ static const unsigned char _S_upper[256 /* table_size */];
+ static const unsigned char _S_lower[256 /* table_size */];
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC ctype_byname<char>: public ctype<char> {
+public:
+ explicit ctype_byname(const char*, size_t = 0);
+ ~ctype_byname();
+
+ virtual char do_toupper(char __c) const;
+ virtual char do_tolower(char __c) const;
+
+ virtual const char* do_toupper(char*, const char*) const;
+ virtual const char* do_tolower(char*, const char*) const;
+
+private:
+ mask _M_byname_table[table_size + 1];
+ _Locale_ctype* _M_ctype;
+};
+
+
+# ifndef _STLP_NO_WCHAR_T
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC ctype<wchar_t> : public locale::facet, public ctype_base
+{
+ friend class _Locale;
+public:
+ typedef wchar_t char_type;
+
+ explicit ctype(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+ bool is(mask __m, wchar_t __c) const
+ { return do_is(__m, __c); }
+
+ const wchar_t* is(const wchar_t* __low, const wchar_t* __high,
+ mask* __vec) const
+ { return do_is(__low, __high, __vec); }
+
+ const wchar_t* scan_is(mask __m,
+ const wchar_t* __low, const wchar_t* __high) const
+ { return do_scan_is(__m, __low, __high); }
+
+ const wchar_t* scan_not (mask __m,
+ const wchar_t* __low, const wchar_t* __high) const
+ { return do_scan_not(__m, __low, __high); }
+
+ wchar_t (toupper)(wchar_t __c) const { return do_toupper(__c); }
+ const wchar_t* (toupper)(wchar_t* __low, const wchar_t* __high) const
+ { return do_toupper(__low, __high); }
+
+ wchar_t (tolower)(wchar_t __c) const { return do_tolower(__c); }
+ const wchar_t* (tolower)(wchar_t* __low, const wchar_t* __high) const
+ { return do_tolower(__low, __high); }
+
+ wchar_t widen(char __c) const { return do_widen(__c); }
+ const char* widen(const char* __low, const char* __high,
+ wchar_t* __to) const
+ { return do_widen(__low, __high, __to); }
+
+ char narrow(wchar_t __c, char __dfault) const
+ { return do_narrow(__c, __dfault); }
+ const wchar_t* narrow(const wchar_t* __low, const wchar_t* __high,
+ char __dfault, char* __to) const
+ { return do_narrow(__low, __high, __dfault, __to); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+ ~ctype();
+
+ virtual bool do_is(mask __m, wchar_t __c) const;
+ virtual const wchar_t* do_is(const wchar_t*, const wchar_t*, mask*) const;
+ virtual const wchar_t* do_scan_is(mask,
+ const wchar_t*, const wchar_t*) const;
+ virtual const wchar_t* do_scan_not(mask,
+ const wchar_t*, const wchar_t*) const;
+ virtual wchar_t do_toupper(wchar_t __c) const;
+ virtual const wchar_t* do_toupper(wchar_t*, const wchar_t*) const;
+ virtual wchar_t do_tolower(wchar_t c) const;
+ virtual const wchar_t* do_tolower(wchar_t*, const wchar_t*) const;
+ virtual wchar_t do_widen(char c) const;
+ virtual const char* do_widen(const char*, const char*, wchar_t*) const;
+ virtual char do_narrow(wchar_t __c, char __dfault) const;
+ virtual const wchar_t* do_narrow(const wchar_t*, const wchar_t*,
+ char, char*) const;
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC ctype_byname<wchar_t>: public ctype<wchar_t> {
+public:
+ explicit ctype_byname(const char* __name, size_t __refs = 0);
+
+protected:
+ ~ctype_byname();
+
+ virtual bool do_is(mask __m, wchar_t __c) const;
+ virtual const wchar_t* do_is(const wchar_t*, const wchar_t*, mask*) const;
+ virtual const wchar_t* do_scan_is(mask,
+ const wchar_t*, const wchar_t*) const;
+ virtual const wchar_t* do_scan_not(mask,
+ const wchar_t*, const wchar_t*) const;
+ virtual wchar_t do_toupper(wchar_t __c) const;
+ virtual const wchar_t* do_toupper(wchar_t*, const wchar_t*) const;
+ virtual wchar_t do_tolower(wchar_t c) const;
+ virtual const wchar_t* do_tolower(wchar_t*, const wchar_t*) const;
+
+private:
+ _Locale_ctype* _M_ctype;
+};
+
+# endif /* WCHAR_T */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_CTYPE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_cwchar.h b/src/STLport/stl/_cwchar.h
new file mode 100644
index 0000000..45c7668
--- /dev/null
+++ b/src/STLport/stl/_cwchar.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CWCHAR_H
+# define _STLP_CWCHAR_H
+
+#ifndef _STLP_NO_WCHAR_T
+#ifdef __cplusplus
+# include <cwchar>
+#else
+# include <wchar.h>
+#endif
+#endif
+
+# if defined (__MRC__) || defined (__SC__) || defined (__BORLANDC__) || defined(__FreeBSD__) || (defined (__GNUC__) && defined (__APPLE__) || defined( __Lynx__ )) || defined (_STLP_NO_WCHAR_T)
+
+# include _STLP_NATIVE_C_HEADER(stddef.h)
+# if defined (__FreeBSD__) || defined (__Lynx__)
+# ifndef _WINT_T
+typedef long int wint_t;
+# define _WINT_T
+# endif /* _WINT_T */
+# endif
+# endif
+
+# if defined ( _STLP_OWN_IOSTREAMS ) && defined (_STLP_NO_NATIVE_MBSTATE_T) && ! defined (_STLP_NO_MBSTATE_T) && ! defined (_MBSTATE_T) && ! defined (__mbstate_t_defined)
+# define _STLP_USE_OWN_MBSTATE_T
+# define _MBSTATE_T
+# endif
+
+# ifdef _STLP_USE_OWN_MBSTATE_T
+
+// to be compatible across different SUN platforms
+#ifdef __sun
+# define __stl_mbstate_t __mbstate_t
+#endif
+
+struct __stl_mbstate_t;
+
+# ifdef __cplusplus
+struct __stl_mbstate_t {
+ __stl_mbstate_t( long __st = 0 ) { _M_state[0] = __st ; }
+ __stl_mbstate_t& operator=(const long __st) {
+ _M_state[0] = __st;
+ return *this;
+ }
+ __stl_mbstate_t(const __stl_mbstate_t& __x) {_M_state[0]= __x._M_state[0]; }
+ __stl_mbstate_t& operator=(const __stl_mbstate_t& __x) {
+ _M_state[0]= __x._M_state[0];
+ return *this;
+ }
+# if defined (__sun)
+# ifdef _LP64
+ long _M_state[4];
+# else
+ int _M_state[6];
+# endif
+# else
+ long _M_state[1];
+# endif
+};
+
+inline bool operator==(const __stl_mbstate_t& __x, const __stl_mbstate_t& __y) {
+ return ( __x._M_state[0] == __y._M_state[0] );
+}
+
+inline bool operator!=(const __stl_mbstate_t& __x, const __stl_mbstate_t& __y) {
+ return ( __x._M_state[0] == __y._M_state[0] );
+}
+# endif
+
+
+_STLP_BEGIN_NAMESPACE
+
+typedef __stl_mbstate_t mbstate_t;
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_USE_OWN_MBSTATE_T */
+
+#if !defined (_STLP_NO_WCHAR_T)
+# ifndef WCHAR_MIN
+# define WCHAR_MIN 0
+// SUNpro has some bugs with casts. wchar_t is size of int there anyway.
+# if defined (__SUNPRO_CC) || defined (__DJGPP)
+# define WCHAR_MAX (~0)
+# else
+# define WCHAR_MAX ((wchar_t)~0)
+# endif
+# endif
+#endif
+
+# if defined (_STLP_IMPORT_VENDOR_CSTD) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
+_STLP_BEGIN_NAMESPACE
+using namespace _STLP_VENDOR_CSTD;
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+#endif /* _STLP_CWCHAR_H */
+
diff --git a/src/STLport/stl/_deque.c b/src/STLport/stl/_deque.c
new file mode 100644
index 0000000..f72e525
--- /dev/null
+++ b/src/STLport/stl/_deque.c
@@ -0,0 +1,676 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_DEQUE_C
+# define _STLP_DEQUE_C
+
+# ifndef _STLP_INTERNAL_DEQUE_H
+# include <stl/_deque.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+// Non-inline member functions from _Deque_base.
+
+template <class _Tp, class _Alloc >
+_Deque_base<_Tp,_Alloc >::~_Deque_base() {
+ if (_M_map._M_data) {
+ _M_destroy_nodes(_M_start._M_node, this->_M_finish._M_node + 1);
+ _M_map.deallocate(_M_map._M_data, _M_map_size._M_data);
+ }
+}
+
+template <class _Tp, class _Alloc >
+void
+_Deque_base<_Tp,_Alloc>::_M_initialize_map(size_t __num_elements)
+{
+ size_t __num_nodes =
+ __num_elements / this->buffer_size() + 1 ;
+
+ _M_map_size._M_data = (max)((size_t) _S_initial_map_size, __num_nodes + 2);
+ _M_map._M_data = _M_map.allocate(_M_map_size._M_data);
+
+ _Tp** __nstart = _M_map._M_data + (_M_map_size._M_data - __num_nodes) / 2;
+ _Tp** __nfinish = __nstart + __num_nodes;
+
+ _STLP_TRY {
+ _M_create_nodes(__nstart, __nfinish);
+ }
+ _STLP_UNWIND((_M_map.deallocate(_M_map._M_data, _M_map_size._M_data),
+ _M_map._M_data = 0, _M_map_size._M_data = 0));
+ _M_start._M_set_node(__nstart);
+ this->_M_finish._M_set_node(__nfinish - 1);
+ _M_start._M_cur = _M_start._M_first;
+ this->_M_finish._M_cur = this->_M_finish._M_first +
+ __num_elements % this->buffer_size();
+}
+
+template <class _Tp, class _Alloc >
+void
+_Deque_base<_Tp,_Alloc>::_M_create_nodes(_Tp** __nstart,
+ _Tp** __nfinish)
+{
+ _Tp** __cur;
+ _STLP_TRY {
+ for (__cur = __nstart; __cur < __nfinish; ++__cur)
+ *__cur = _M_map_size.allocate(this->buffer_size());
+ }
+ _STLP_UNWIND(_M_destroy_nodes(__nstart, __cur));
+}
+
+template <class _Tp, class _Alloc >
+void
+_Deque_base<_Tp,_Alloc>::_M_destroy_nodes(_Tp** __nstart,
+ _Tp** __nfinish)
+{
+ for (_Tp** __n = __nstart; __n < __nfinish; ++__n)
+ _M_map_size.deallocate(*__n, this->buffer_size());
+}
+
+
+
+// Non-inline member functions
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+// qualified references
+# define __iterator__ _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >
+# define const_iterator _Deque_iterator<_Tp, _Const_traits<_Tp> >
+# define iterator __iterator__
+# define size_type size_t
+# define value_type _Tp
+# else
+# define __iterator__ _STLP_TYPENAME_ON_RETURN_TYPE __deque__<_Tp, _Alloc>::iterator
+# endif
+
+template <class _Tp, class _Alloc >
+__deque__<_Tp, _Alloc >&
+__deque__<_Tp, _Alloc >::operator= (const __deque__<_Tp, _Alloc >& __x) {
+ const size_type __len = size();
+ if (&__x != this) {
+ if (__len >= __x.size())
+ erase(copy(__x.begin(), __x.end(), this->_M_start), this->_M_finish);
+ else {
+ const_iterator __mid = __x.begin() + difference_type(__len);
+ copy(__x.begin(), __mid, this->_M_start);
+ insert(this->_M_finish, __mid, __x.end());
+ }
+ }
+ return *this;
+}
+
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp, _Alloc >::_M_fill_insert(iterator __pos,
+ size_type __n, const value_type& __x)
+{
+ if (__pos._M_cur == this->_M_start._M_cur) {
+ iterator __new_start = _M_reserve_elements_at_front(__n);
+ _STLP_TRY {
+ uninitialized_fill(__new_start, this->_M_start, __x);
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+ this->_M_start = __new_start;
+ }
+ else if (__pos._M_cur == this->_M_finish._M_cur) {
+ iterator __new_finish = _M_reserve_elements_at_back(__n);
+ _STLP_TRY {
+ uninitialized_fill(this->_M_finish, __new_finish, __x);
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node+1, __new_finish._M_node+1));
+ this->_M_finish = __new_finish;
+ }
+ else
+ _M_insert_aux(__pos, __n, __x);
+}
+
+#ifndef _STLP_MEMBER_TEMPLATES
+
+template <class _Tp, class _Alloc >
+void __deque__<_Tp, _Alloc>::insert(iterator __pos,
+ const value_type* __first,
+ const value_type* __last) {
+ size_type __n = __last - __first;
+ if (__pos._M_cur == this->_M_start._M_cur) {
+ iterator __new_start = _M_reserve_elements_at_front(__n);
+ _STLP_TRY {
+ uninitialized_copy(__first, __last, __new_start);
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+ this->_M_start = __new_start;
+ }
+ else if (__pos._M_cur == this->_M_finish._M_cur) {
+ iterator __new_finish = _M_reserve_elements_at_back(__n);
+ _STLP_TRY {
+ uninitialized_copy(__first, __last, this->_M_finish);
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1,
+ __new_finish._M_node + 1));
+ this->_M_finish = __new_finish;
+ }
+ else
+ _M_insert_aux(__pos, __first, __last, __n);
+}
+
+template <class _Tp, class _Alloc >
+void __deque__<_Tp,_Alloc>::insert(iterator __pos,
+ const_iterator __first,
+ const_iterator __last)
+{
+ size_type __n = __last - __first;
+ if (__pos._M_cur == this->_M_start._M_cur) {
+ iterator __new_start = _M_reserve_elements_at_front(__n);
+ _STLP_TRY {
+ uninitialized_copy(__first, __last, __new_start);
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+ this->_M_start = __new_start;
+ }
+ else if (__pos._M_cur == this->_M_finish._M_cur) {
+ iterator __new_finish = _M_reserve_elements_at_back(__n);
+ _STLP_TRY {
+ uninitialized_copy(__first, __last, this->_M_finish);
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1,__new_finish._M_node + 1));
+ this->_M_finish = __new_finish;
+ }
+ else
+ _M_insert_aux(__pos, __first, __last, __n);
+}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+template <class _Tp, class _Alloc >
+__iterator__
+__deque__<_Tp,_Alloc>::erase(iterator __first, iterator __last)
+{
+ if (__first == this->_M_start && __last == this->_M_finish) {
+ clear();
+ return this->_M_finish;
+ }
+ else {
+ difference_type __n = __last - __first;
+ difference_type __elems_before = __first - this->_M_start;
+ if (__elems_before < difference_type(this->size() - __n) / 2) {
+ copy_backward(this->_M_start, __first, __last);
+ iterator __new_start = this->_M_start + __n;
+ _STLP_STD::_Destroy(this->_M_start, __new_start);
+ this->_M_destroy_nodes(this->_M_start._M_node, __new_start._M_node);
+ this->_M_start = __new_start;
+ }
+ else {
+ copy(__last, this->_M_finish, __first);
+ iterator __new_finish = this->_M_finish - __n;
+ _STLP_STD::_Destroy(__new_finish, this->_M_finish);
+ this->_M_destroy_nodes(__new_finish._M_node + 1, this->_M_finish._M_node + 1);
+ this->_M_finish = __new_finish;
+ }
+ return this->_M_start + __elems_before;
+ }
+}
+
+template <class _Tp, class _Alloc >
+void __deque__<_Tp,_Alloc>::clear()
+{
+ for (_Map_pointer __node = this->_M_start._M_node + 1;
+ __node < this->_M_finish._M_node;
+ ++__node) {
+ _STLP_STD::_Destroy(*__node, *__node + this->buffer_size());
+ this->_M_map_size.deallocate(*__node, this->buffer_size());
+ }
+
+ if (this->_M_start._M_node != this->_M_finish._M_node) {
+ _STLP_STD::_Destroy(this->_M_start._M_cur, this->_M_start._M_last);
+ _STLP_STD::_Destroy(this->_M_finish._M_first, this->_M_finish._M_cur);
+ this->_M_map_size.deallocate(this->_M_finish._M_first, this->buffer_size());
+ }
+ else
+ _STLP_STD::_Destroy(this->_M_start._M_cur, this->_M_finish._M_cur);
+
+ this->_M_finish = this->_M_start;
+}
+
+// Precondition: this->_M_start and this->_M_finish have already been initialized,
+// but none of the deque's elements have yet been constructed.
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_fill_initialize(const value_type& __val) {
+ _Map_pointer __cur;
+ _STLP_TRY {
+ for (__cur = this->_M_start._M_node; __cur < this->_M_finish._M_node; ++__cur)
+ uninitialized_fill(*__cur, *__cur + this->buffer_size(), __val);
+ uninitialized_fill(this->_M_finish._M_first, this->_M_finish._M_cur, __val);
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_start, iterator(*__cur, __cur)));
+}
+
+
+// Called only if this->_M_finish._M_cur == this->_M_finish._M_last - 1.
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_push_back_aux_v(const value_type& __t)
+{
+ value_type __t_copy = __t;
+ _M_reserve_map_at_back();
+ *(this->_M_finish._M_node + 1) = this->_M_map_size.allocate(this->buffer_size());
+ _STLP_TRY {
+ _Construct(this->_M_finish._M_cur, __t_copy);
+ this->_M_finish._M_set_node(this->_M_finish._M_node + 1);
+ this->_M_finish._M_cur = this->_M_finish._M_first;
+ }
+ _STLP_UNWIND(this->_M_map_size.deallocate(*(this->_M_finish._M_node + 1),
+ this->buffer_size()));
+}
+
+# ifndef _STLP_NO_ANACHRONISMS
+// Called only if this->_M_finish._M_cur == this->_M_finish._M_last - 1.
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_push_back_aux()
+{
+ _M_reserve_map_at_back();
+ *(this->_M_finish._M_node + 1) = this->_M_map_size.allocate(this->buffer_size());
+ _STLP_TRY {
+ _Construct(this->_M_finish._M_cur);
+ this->_M_finish._M_set_node(this->_M_finish._M_node + 1);
+ this->_M_finish._M_cur = this->_M_finish._M_first;
+ }
+ _STLP_UNWIND(this->_M_map_size.deallocate(*(this->_M_finish._M_node + 1),
+ this->buffer_size()));
+}
+# endif
+
+// Called only if this->_M_start._M_cur == this->_M_start._M_first.
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_push_front_aux_v(const value_type& __t)
+{
+ value_type __t_copy = __t;
+ _M_reserve_map_at_front();
+ *(this->_M_start._M_node - 1) = this->_M_map_size.allocate(this->buffer_size());
+ _STLP_TRY {
+ this->_M_start._M_set_node(this->_M_start._M_node - 1);
+ this->_M_start._M_cur = this->_M_start._M_last - 1;
+ _Construct(this->_M_start._M_cur, __t_copy);
+ }
+ _STLP_UNWIND((++this->_M_start,
+ this->_M_map_size.deallocate(*(this->_M_start._M_node - 1), this->buffer_size())));
+}
+
+
+# ifndef _STLP_NO_ANACHRONISMS
+// Called only if this->_M_start._M_cur == this->_M_start._M_first.
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_push_front_aux()
+{
+ _M_reserve_map_at_front();
+ *(this->_M_start._M_node - 1) = this->_M_map_size.allocate(this->buffer_size());
+ _STLP_TRY {
+ this->_M_start._M_set_node(this->_M_start._M_node - 1);
+ this->_M_start._M_cur = this->_M_start._M_last - 1;
+ _Construct(this->_M_start._M_cur);
+ }
+ _STLP_UNWIND((++this->_M_start, this->_M_map_size.deallocate(*(this->_M_start._M_node - 1),
+ this->buffer_size() )));
+}
+# endif
+
+// Called only if this->_M_finish._M_cur == this->_M_finish._M_first.
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_pop_back_aux()
+{
+ this->_M_map_size.deallocate(this->_M_finish._M_first, this->buffer_size());
+ this->_M_finish._M_set_node(this->_M_finish._M_node - 1);
+ this->_M_finish._M_cur = this->_M_finish._M_last - 1;
+ _STLP_STD::_Destroy(this->_M_finish._M_cur);
+}
+
+// Called only if this->_M_start._M_cur == this->_M_start._M_last - 1. Note that
+// if the deque has at least one element (a precondition for this member
+// function), and if this->_M_start._M_cur == this->_M_start._M_last, then the deque
+// must have at least two nodes.
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_pop_front_aux()
+{
+ _STLP_STD::_Destroy(this->_M_start._M_cur);
+ this->_M_map_size.deallocate(this->_M_start._M_first, this->buffer_size());
+ this->_M_start._M_set_node(this->_M_start._M_node + 1);
+ this->_M_start._M_cur = this->_M_start._M_first;
+}
+
+
+
+template <class _Tp, class _Alloc >
+__iterator__
+__deque__<_Tp,_Alloc>::_M_insert_aux_prepare(iterator __pos) {
+ difference_type __index = __pos - this->_M_start;
+ if (__index < difference_type(size() / 2)) {
+ push_front(front());
+ iterator __front1 = this->_M_start;
+ ++__front1;
+ iterator __front2 = __front1;
+ ++__front2;
+ __pos = this->_M_start + __index;
+ iterator __pos1 = __pos;
+ ++__pos1;
+ copy(__front2, __pos1, __front1);
+ }
+ else {
+ push_back(back());
+ iterator __back1 = this->_M_finish;
+ --__back1;
+ iterator __back2 = __back1;
+ --__back2;
+ __pos = this->_M_start + __index;
+ copy_backward(__pos, __back2, __back1);
+ }
+ return __pos;
+}
+
+template <class _Tp, class _Alloc >
+__iterator__
+__deque__<_Tp,_Alloc>::_M_insert_aux(iterator __pos,
+ const value_type& __x) {
+ value_type __x_copy = __x;
+ _STLP_MPWFIX_TRY //*TY 06/01/2000 - mpw forget to call dtor on __x_copy without this try block
+ __pos = _M_insert_aux_prepare(__pos);
+ *__pos = __x_copy;
+ return __pos;
+ _STLP_MPWFIX_CATCH //*TY 06/01/2000 -
+}
+
+template <class _Tp, class _Alloc >
+__iterator__
+__deque__<_Tp,_Alloc>::_M_insert_aux(iterator __pos)
+{
+ __pos = _M_insert_aux_prepare(__pos);
+ *__pos = value_type();
+ return __pos;
+}
+
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_insert_aux(iterator __pos,
+ size_type __n,
+ const value_type& __x)
+{
+ const difference_type __elems_before = __pos - this->_M_start;
+ size_type __length = this->size();
+ value_type __x_copy = __x;
+ if (__elems_before < difference_type(__length / 2)) {
+ iterator __new_start = _M_reserve_elements_at_front(__n);
+ iterator __old_start = this->_M_start;
+ __pos = this->_M_start + __elems_before;
+ _STLP_TRY {
+ if (__elems_before >= difference_type(__n)) {
+ iterator __start_n = this->_M_start + difference_type(__n);
+ uninitialized_copy(this->_M_start, __start_n, __new_start);
+ this->_M_start = __new_start;
+ copy(__start_n, __pos, __old_start);
+ fill(__pos - difference_type(__n), __pos, __x_copy);
+ }
+ else {
+ __uninitialized_copy_fill(this->_M_start, __pos, __new_start,
+ this->_M_start, __x_copy);
+ this->_M_start = __new_start;
+ fill(__old_start, __pos, __x_copy);
+ }
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+ }
+ else {
+ iterator __new_finish = _M_reserve_elements_at_back(__n);
+ iterator __old_finish = this->_M_finish;
+ const difference_type __elems_after =
+ difference_type(__length) - __elems_before;
+ __pos = this->_M_finish - __elems_after;
+ _STLP_TRY {
+ if (__elems_after > difference_type(__n)) {
+ iterator __finish_n = this->_M_finish - difference_type(__n);
+ uninitialized_copy(__finish_n, this->_M_finish, this->_M_finish);
+ this->_M_finish = __new_finish;
+ copy_backward(__pos, __finish_n, __old_finish);
+ fill(__pos, __pos + difference_type(__n), __x_copy);
+ }
+ else {
+ __uninitialized_fill_copy(this->_M_finish, __pos + difference_type(__n),
+ __x_copy, __pos, this->_M_finish);
+ this->_M_finish = __new_finish;
+ fill(__pos, __old_finish, __x_copy);
+ }
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1));
+ }
+}
+
+#ifndef _STLP_MEMBER_TEMPLATES
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_insert_aux(iterator __pos,
+ const value_type* __first,
+ const value_type* __last,
+ size_type __n)
+{
+
+ const difference_type __elemsbefore = __pos - this->_M_start;
+ size_type __length = size();
+ if (__elemsbefore < difference_type(__length / 2)) {
+ iterator __new_start = _M_reserve_elements_at_front(__n);
+ iterator __old_start = this->_M_start;
+ __pos = this->_M_start + __elemsbefore;
+ _STLP_TRY {
+ if (__elemsbefore >= difference_type(__n)) {
+ iterator __start_n = this->_M_start + difference_type(__n);
+ uninitialized_copy(this->_M_start, __start_n, __new_start);
+ this->_M_start = __new_start;
+ copy(__start_n, __pos, __old_start);
+ copy(__first, __last, __pos - difference_type(__n));
+ }
+ else {
+ const value_type* __mid =
+ __first + (difference_type(__n) - __elemsbefore);
+ __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid,
+ __new_start, _IsPODType());
+ this->_M_start = __new_start;
+ copy(__mid, __last, __old_start);
+ }
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+ }
+ else {
+ iterator __new_finish = _M_reserve_elements_at_back(__n);
+ iterator __old_finish = this->_M_finish;
+ const difference_type __elemsafter =
+ difference_type(__length) - __elemsbefore;
+ __pos = this->_M_finish - __elemsafter;
+ _STLP_TRY {
+ if (__elemsafter > difference_type(__n)) {
+ iterator __finish_n = this->_M_finish - difference_type(__n);
+ uninitialized_copy(__finish_n, this->_M_finish, this->_M_finish);
+ this->_M_finish = __new_finish;
+ copy_backward(__pos, __finish_n, __old_finish);
+ copy(__first, __last, __pos);
+ }
+ else {
+ const value_type* __mid = __first + __elemsafter;
+ __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish, _IsPODType());
+ this->_M_finish = __new_finish;
+ copy(__first, __mid, __pos);
+ }
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1));
+ }
+}
+
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_insert_aux(iterator __pos,
+ const_iterator __first,
+ const_iterator __last,
+ size_type __n)
+{
+ const difference_type __elemsbefore = __pos - this->_M_start;
+ size_type __length = size();
+ if (__elemsbefore < difference_type(__length / 2)) {
+ iterator __new_start = _M_reserve_elements_at_front(__n);
+ iterator __old_start = this->_M_start;
+ __pos = this->_M_start + __elemsbefore;
+ _STLP_TRY {
+ if (__elemsbefore >= difference_type(__n)) {
+ iterator __start_n = this->_M_start + __n;
+ uninitialized_copy(this->_M_start, __start_n, __new_start);
+ this->_M_start = __new_start;
+ copy(__start_n, __pos, __old_start);
+ copy(__first, __last, __pos - difference_type(__n));
+ }
+ else {
+ const_iterator __mid = __first + (__n - __elemsbefore);
+ __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid,
+ __new_start, _IsPODType());
+ this->_M_start = __new_start;
+ copy(__mid, __last, __old_start);
+ }
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+ }
+ else {
+ iterator __new_finish = _M_reserve_elements_at_back(__n);
+ iterator __old_finish = this->_M_finish;
+ const difference_type __elemsafter = __length - __elemsbefore;
+ __pos = this->_M_finish - __elemsafter;
+ _STLP_TRY {
+ if (__elemsafter > difference_type(__n)) {
+ iterator __finish_n = this->_M_finish - difference_type(__n);
+ uninitialized_copy(__finish_n, this->_M_finish, this->_M_finish);
+ this->_M_finish = __new_finish;
+ copy_backward(__pos, __finish_n, __old_finish);
+ copy(__first, __last, __pos);
+ }
+ else {
+ const_iterator __mid = __first + __elemsafter;
+ __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish, _IsPODType());
+ this->_M_finish = __new_finish;
+ copy(__first, __mid, __pos);
+ }
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1));
+ }
+}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_new_elements_at_front(size_type __new_elems)
+{
+ size_type __new_nodes
+ = (__new_elems + this->buffer_size() - 1) / this->buffer_size();
+ _M_reserve_map_at_front(__new_nodes);
+ size_type __i =1;
+ _STLP_TRY {
+ for (; __i <= __new_nodes; ++__i)
+ *(this->_M_start._M_node - __i) = this->_M_map_size.allocate(this->buffer_size());
+ }
+# ifdef _STLP_USE_EXCEPTIONS
+ catch(...) {
+ for (size_type __j = 1; __j < __i; ++__j)
+ this->_M_map_size.deallocate(*(this->_M_start._M_node - __j), this->buffer_size());
+ throw;
+ }
+# endif /* _STLP_USE_EXCEPTIONS */
+}
+
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_new_elements_at_back(size_type __new_elems)
+{
+ size_type __new_nodes
+ = (__new_elems + this->buffer_size() - 1) / this->buffer_size();
+ _M_reserve_map_at_back(__new_nodes);
+ size_type __i = 1;
+ _STLP_TRY {
+ for (; __i <= __new_nodes; ++__i)
+ *(this->_M_finish._M_node + __i) = this->_M_map_size.allocate(this->buffer_size());
+ }
+# ifdef _STLP_USE_EXCEPTIONS
+ catch(...) {
+ for (size_type __j = 1; __j < __i; ++__j)
+ this->_M_map_size.deallocate(*(this->_M_finish._M_node + __j), this->buffer_size());
+ throw;
+ }
+# endif /* _STLP_USE_EXCEPTIONS */
+}
+
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_reallocate_map(size_type __nodes_to_add,
+ bool __add_at_front)
+{
+ size_type __old_num_nodes = this->_M_finish._M_node - this->_M_start._M_node + 1;
+ size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;
+
+ _Map_pointer __new_nstart;
+ if (this->_M_map_size._M_data > 2 * __new_num_nodes) {
+ __new_nstart = this->_M_map._M_data + (this->_M_map_size._M_data - __new_num_nodes) / 2
+ + (__add_at_front ? __nodes_to_add : 0);
+ if (__new_nstart < this->_M_start._M_node)
+ copy(this->_M_start._M_node, this->_M_finish._M_node + 1, __new_nstart);
+ else
+ copy_backward(this->_M_start._M_node, this->_M_finish._M_node + 1,
+ __new_nstart + __old_num_nodes);
+ }
+ else {
+ size_type __new_map_size =
+ this->_M_map_size._M_data + (max)((size_t)this->_M_map_size._M_data, __nodes_to_add) + 2;
+
+ _Map_pointer __new_map = this->_M_map.allocate(__new_map_size);
+ __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
+ + (__add_at_front ? __nodes_to_add : 0);
+ copy(this->_M_start._M_node, this->_M_finish._M_node + 1, __new_nstart);
+ this->_M_map.deallocate(this->_M_map._M_data, this->_M_map_size._M_data);
+
+ this->_M_map._M_data = __new_map;
+ this->_M_map_size._M_data = __new_map_size;
+ }
+
+ this->_M_start._M_set_node(__new_nstart);
+ this->_M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
+}
+
+_STLP_END_NAMESPACE
+
+# undef __iterator__
+# undef iterator
+# undef const_iterator
+# undef size_type
+# undef value_type
+
+#endif /* _STLP_DEQUE_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_deque.h b/src/STLport/stl/_deque.h
new file mode 100644
index 0000000..02eb070
--- /dev/null
+++ b/src/STLport/stl/_deque.h
@@ -0,0 +1,953 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DEQUE_H
+#define _STLP_INTERNAL_DEQUE_H
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+# include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_UNINITIALIZED_H
+# include <stl/_uninitialized.h>
+# endif
+
+# ifndef _STLP_RANGE_ERRORS_H
+# include <stl/_range_errors.h>
+# endif
+
+/* Class invariants:
+ * For any nonsingular iterator i:
+ * i.node is the address of an element in the map array. The
+ * contents of i.node is a pointer to the beginning of a node.
+ * i.first == *(i.node)
+ * i.last == i.first + node_size
+ * i.cur is a pointer in the range [i.first, i.last). NOTE:
+ * the implication of this is that i.cur is always a dereferenceable
+ * pointer, even if i is a past-the-end iterator.
+ * Start and Finish are always nonsingular iterators. NOTE: this means
+ * that an empty deque must have one node, and that a deque
+ * with N elements, where N is the buffer size, must have two nodes.
+ * For every node other than start.node and finish.node, every element
+ * in the node is an initialized object. If start.node == finish.node,
+ * then [start.cur, finish.cur) are initialized objects, and
+ * the elements outside that range are uninitialized storage. Otherwise,
+ * [start.cur, start.last) and [finish.first, finish.cur) are initialized
+ * objects, and [start.first, start.cur) and [finish.cur, finish.last)
+ * are uninitialized storage.
+ * [map, map + map_size) is a valid, non-empty range.
+ * [start.node, finish.node] is a valid range contained within
+ * [map, map + map_size).
+ * A pointer in the range [map, map + map_size) points to an allocated node
+ * if and only if the pointer is in the range [start.node, finish.node].
+ */
+
+# undef deque
+# define deque __WORKAROUND_DBG_RENAME(deque)
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp>
+struct _Deque_iterator_base {
+
+ enum _Constants {
+ _blocksize = _MAX_BYTES,
+ __buffer_size = (sizeof(_Tp) < (size_t)_blocksize ?
+ ( (size_t)_blocksize / sizeof(_Tp)) : size_t(1))
+ };
+
+ typedef random_access_iterator_tag iterator_category;
+
+ typedef _Tp value_type;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+
+ typedef value_type** _Map_pointer;
+
+ typedef _Deque_iterator_base< _Tp > _Self;
+
+ value_type* _M_cur;
+ value_type* _M_first;
+ value_type* _M_last;
+ _Map_pointer _M_node;
+
+ _Deque_iterator_base(value_type* __x, _Map_pointer __y)
+ : _M_cur(__x), _M_first(*__y),
+ _M_last(*__y + __buffer_size), _M_node(__y) {}
+ _Deque_iterator_base() : _M_cur(0), _M_first(0), _M_last(0), _M_node(0) {}
+
+ difference_type _M_subtract(const _Self& __x) const {
+ return difference_type(__buffer_size) * (_M_node - __x._M_node - 1) +
+ (_M_cur - _M_first) + (__x._M_last - __x._M_cur);
+ }
+
+ void _M_increment() {
+ if (++_M_cur == _M_last) {
+ _M_set_node(_M_node + 1);
+ _M_cur = _M_first;
+ }
+ }
+
+ void _M_decrement() {
+ if (_M_cur == _M_first) {
+ _M_set_node(_M_node - 1);
+ _M_cur = _M_last;
+ }
+ --_M_cur;
+ }
+
+ void _M_advance(difference_type __n)
+ {
+ difference_type __offset = __n + (_M_cur - _M_first);
+ if (__offset >= 0 && __offset < difference_type(__buffer_size))
+ _M_cur += __n;
+ else {
+ difference_type __node_offset =
+ __offset > 0 ? __offset / __buffer_size
+ : -difference_type((-__offset - 1) / __buffer_size) - 1;
+ _M_set_node(_M_node + __node_offset);
+ _M_cur = _M_first +
+ (__offset - __node_offset * difference_type(__buffer_size));
+ }
+ }
+
+ void _M_set_node(_Map_pointer __new_node) {
+ _M_last = (_M_first = *(_M_node = __new_node)) + difference_type(__buffer_size);
+ }
+};
+
+
+
+template <class _Tp, class _Traits>
+struct _Deque_iterator : public _Deque_iterator_base< _Tp> {
+
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef typename _Traits::reference reference;
+ typedef typename _Traits::pointer pointer;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type** _Map_pointer;
+
+ typedef _Deque_iterator_base< _Tp > _Base;
+ typedef _Deque_iterator<_Tp, _Traits> _Self;
+ typedef _Deque_iterator<_Tp, _Nonconst_traits<_Tp> > _Nonconst_self;
+ typedef _Deque_iterator<_Tp, _Const_traits<_Tp> > _Const_self;
+
+ _Deque_iterator(value_type* __x, _Map_pointer __y) :
+ _Deque_iterator_base<value_type>(__x,__y) {}
+
+ _Deque_iterator() {}
+ _Deque_iterator(const _Nonconst_self& __x) :
+ _Deque_iterator_base<value_type>(__x) {}
+
+ reference operator*() const {
+ return *this->_M_cur;
+ }
+
+ _STLP_DEFINE_ARROW_OPERATOR
+
+ difference_type operator-(const _Self& __x) const { return this->_M_subtract(__x); }
+
+ _Self& operator++() { this->_M_increment(); return *this; }
+ _Self operator++(int) {
+ _Self __tmp = *this;
+ ++*this;
+ return __tmp;
+ }
+
+ _Self& operator--() { this->_M_decrement(); return *this; }
+ _Self operator--(int) {
+ _Self __tmp = *this;
+ --*this;
+ return __tmp;
+ }
+
+ _Self& operator+=(difference_type __n) { this->_M_advance(__n); return *this; }
+ _Self operator+(difference_type __n) const
+ {
+ _Self __tmp = *this;
+ return __tmp += __n;
+ }
+
+ _Self& operator-=(difference_type __n) { return *this += -__n; }
+ _Self operator-(difference_type __n) const {
+ _Self __tmp = *this;
+ return __tmp -= __n;
+ }
+
+ reference operator[](difference_type __n) const { return *(*this + __n); }
+};
+
+template <class _Tp, class _Traits>
+inline _Deque_iterator<_Tp, _Traits> _STLP_CALL
+operator+(ptrdiff_t __n, const _Deque_iterator<_Tp, _Traits>& __x)
+{
+ return __x + __n;
+}
+
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _Tp>
+inline bool _STLP_CALL
+operator==(const _Deque_iterator_base<_Tp >& __x,
+ const _Deque_iterator_base<_Tp >& __y) {
+ return __x._M_cur == __y._M_cur;
+}
+
+template <class _Tp>
+inline bool _STLP_CALL
+operator < (const _Deque_iterator_base<_Tp >& __x,
+ const _Deque_iterator_base<_Tp >& __y) {
+ return (__x._M_node == __y._M_node) ?
+ (__x._M_cur < __y._M_cur) : (__x._M_node < __y._M_node);
+}
+
+template <class _Tp>
+inline bool _STLP_CALL
+operator!=(const _Deque_iterator_base<_Tp >& __x,
+ const _Deque_iterator_base<_Tp >& __y) {
+ return __x._M_cur != __y._M_cur;
+}
+template <class _Tp>
+inline bool _STLP_CALL
+operator>(const _Deque_iterator_base<_Tp >& __x,
+ const _Deque_iterator_base<_Tp >& __y) {
+ return __y < __x;
+}
+template <class _Tp>
+inline bool _STLP_CALL operator>=(const _Deque_iterator_base<_Tp >& __x,
+ const _Deque_iterator_base<_Tp >& __y) {
+ return !(__x < __y);
+}
+template <class _Tp>
+inline bool _STLP_CALL operator<=(const _Deque_iterator_base<_Tp >& __x,
+ const _Deque_iterator_base<_Tp >& __y) {
+ return !(__y < __x);
+}
+
+# else
+
+template <class _Tp, class _Traits1, class _Traits2>
+inline bool _STLP_CALL
+operator==(const _Deque_iterator<_Tp, _Traits1 >& __x,
+ const _Deque_iterator<_Tp, _Traits2 >& __y) {
+ return __x._M_cur == __y._M_cur;
+}
+
+template <class _Tp, class _Traits1, class _Traits2>
+inline bool _STLP_CALL
+operator < (const _Deque_iterator<_Tp, _Traits1 >& __x,
+ const _Deque_iterator<_Tp, _Traits2 >& __y) {
+ return (__x._M_node == __y._M_node) ?
+ (__x._M_cur < __y._M_cur) : (__x._M_node < __y._M_node);
+}
+
+template <class _Tp>
+inline bool _STLP_CALL
+operator!=(const _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >& __x,
+ const _Deque_iterator<_Tp, _Const_traits<_Tp> >& __y) {
+ return __x._M_cur != __y._M_cur;
+}
+template <class _Tp>
+inline bool _STLP_CALL
+operator>(const _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >& __x,
+ const _Deque_iterator<_Tp, _Const_traits<_Tp> >& __y) {
+ return __y < __x;
+}
+template <class _Tp>
+inline bool _STLP_CALL
+operator>=(const _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >& __x,
+ const _Deque_iterator<_Tp, _Const_traits<_Tp> >& __y) {
+ return !(__x < __y);
+}
+template <class _Tp>
+inline bool _STLP_CALL
+operator<=(const _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >& __x,
+ const _Deque_iterator<_Tp, _Const_traits<_Tp> >& __y) {
+ return !(__y < __x);
+}
+# endif
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _Tp, class _Traits> inline _Tp* _STLP_CALL value_type(const _Deque_iterator<_Tp, _Traits >&) { return (_Tp*)0; }
+template <class _Tp, class _Traits> inline random_access_iterator_tag _STLP_CALL
+iterator_category(const _Deque_iterator<_Tp, _Traits >&) { return random_access_iterator_tag(); }
+template <class _Tp, class _Traits> inline ptrdiff_t* _STLP_CALL
+distance_type(const _Deque_iterator<_Tp, _Traits >&) { return 0; }
+#endif
+
+// Deque base class. It has two purposes. First, its constructor
+// and destructor allocate (but don't initialize) storage. This makes
+// exception safety easier. Second, the base class encapsulates all of
+// the differences between SGI-style allocators and standard-conforming
+// allocators.
+
+template <class _Tp, class _Alloc>
+class _Deque_base {
+public:
+ typedef _Tp value_type;
+ _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+ typedef typename _Alloc_traits<_Tp,_Alloc>::allocator_type allocator_type;
+ typedef typename _Alloc_traits<_Tp*, _Alloc>::allocator_type _Map_alloc_type;
+
+ typedef _Deque_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
+ typedef _Deque_iterator<_Tp, _Const_traits<_Tp> > const_iterator;
+
+ static size_t _STLP_CALL buffer_size() { return (size_t)_Deque_iterator_base<_Tp>::__buffer_size; }
+
+ _Deque_base(const allocator_type& __a, size_t __num_elements)
+ : _M_start(), _M_finish(), _M_map(_STLP_CONVERT_ALLOCATOR(__a, _Tp*), 0),
+ _M_map_size(__a, (size_t)0) {
+ _M_initialize_map(__num_elements);
+ }
+ _Deque_base(const allocator_type& __a)
+ : _M_start(), _M_finish(), _M_map(_STLP_CONVERT_ALLOCATOR(__a, _Tp*), 0),
+ _M_map_size(__a, (size_t)0) {
+ }
+ ~_Deque_base();
+
+protected:
+ void _M_initialize_map(size_t);
+ void _M_create_nodes(_Tp** __nstart, _Tp** __nfinish);
+ void _M_destroy_nodes(_Tp** __nstart, _Tp** __nfinish);
+ enum { _S_initial_map_size = 8 };
+
+protected:
+ iterator _M_start;
+ iterator _M_finish;
+ _STLP_alloc_proxy<value_type**, value_type*, _Map_alloc_type> _M_map;
+ _STLP_alloc_proxy<size_t, value_type, allocator_type> _M_map_size;
+};
+
+
+template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
+class deque : protected _Deque_base<_Tp, _Alloc> {
+ typedef _Deque_base<_Tp, _Alloc> _Base;
+ typedef deque<_Tp, _Alloc> _Self;
+public: // Basic types
+ typedef _Tp value_type;
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef random_access_iterator_tag _Iterator_category;
+ _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+ typedef typename _Base::allocator_type allocator_type;
+
+public: // Iterators
+ typedef typename _Base::iterator iterator;
+ typedef typename _Base::const_iterator const_iterator;
+
+ _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+
+protected: // Internal typedefs
+ typedef pointer* _Map_pointer;
+ typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _TrivialAss;
+ typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _IsPODType;
+
+public: // Basic accessors
+ iterator begin() { return this->_M_start; }
+ iterator end() { return this->_M_finish; }
+ const_iterator begin() const { return const_iterator(this->_M_start); }
+ const_iterator end() const { return const_iterator(this->_M_finish); }
+
+ reverse_iterator rbegin() { return reverse_iterator(this->_M_finish); }
+ reverse_iterator rend() { return reverse_iterator(this->_M_start); }
+ const_reverse_iterator rbegin() const
+ { return const_reverse_iterator(this->_M_finish); }
+ const_reverse_iterator rend() const
+ { return const_reverse_iterator(this->_M_start); }
+
+ reference operator[](size_type __n)
+ { return this->_M_start[difference_type(__n)]; }
+ const_reference operator[](size_type __n) const
+ { return this->_M_start[difference_type(__n)]; }
+
+ void _M_range_check(size_type __n) const {
+ if (__n >= this->size())
+ __stl_throw_out_of_range("deque");
+ }
+ reference at(size_type __n)
+ { _M_range_check(__n); return (*this)[__n]; }
+ const_reference at(size_type __n) const
+ { _M_range_check(__n); return (*this)[__n]; }
+
+ reference front() { return *this->_M_start; }
+ reference back() {
+ iterator __tmp = this->_M_finish;
+ --__tmp;
+ return *__tmp;
+ }
+ const_reference front() const { return *this->_M_start; }
+ const_reference back() const {
+ const_iterator __tmp = this->_M_finish;
+ --__tmp;
+ return *__tmp;
+ }
+
+ size_type size() const { return this->_M_finish - this->_M_start; }
+ size_type max_size() const { return size_type(-1); }
+ bool empty() const { return this->_M_finish == this->_M_start; }
+ allocator_type get_allocator() const { return this->_M_map_size; }
+
+public: // Constructor, destructor.
+ explicit deque(const allocator_type& __a = allocator_type())
+ : _Deque_base<_Tp, _Alloc>(__a, 0) {}
+
+ deque(const _Self& __x) :
+ _Deque_base<_Tp, _Alloc>(__x.get_allocator(), __x.size()) {
+ __uninitialized_copy(__x.begin(), __x.end(), this->_M_start, _IsPODType());
+ }
+
+ deque(size_type __n, const value_type& __val,
+ const allocator_type& __a = allocator_type()) :
+ _Deque_base<_Tp, _Alloc>(__a, __n)
+ { _M_fill_initialize(__val); }
+ // int,long variants may be needed
+ explicit deque(size_type __n) : _Deque_base<_Tp, _Alloc>(allocator_type(), __n)
+ { _M_fill_initialize(value_type()); }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _Integer>
+ void _M_initialize_dispatch(_Integer __n, _Integer __x, const __true_type&) {
+ this->_M_initialize_map(__n);
+ _M_fill_initialize(__x);
+ }
+
+ template <class _InputIter>
+ void _M_initialize_dispatch(_InputIter __first, _InputIter __last,
+ const __false_type&) {
+ _M_range_initialize(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+ }
+
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ // VC++ needs this
+ template <class _InputIterator>
+ deque(_InputIterator __first, _InputIterator __last) :
+ _Deque_base<_Tp, _Alloc>(allocator_type()) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_initialize_dispatch(__first, __last, _Integral());
+ }
+# endif
+
+ // Check whether it's an integral type. If so, it's not an iterator.
+ template <class _InputIterator>
+ deque(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) :
+ _Deque_base<_Tp, _Alloc>(__a) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_initialize_dispatch(__first, __last, _Integral());
+ }
+
+# else
+ deque(const value_type* __first, const value_type* __last,
+ const allocator_type& __a = allocator_type() )
+ : _Deque_base<_Tp, _Alloc>(__a, __last - __first) {
+ __uninitialized_copy(__first, __last, this->_M_start, _IsPODType());
+ }
+
+ deque(const_iterator __first, const_iterator __last,
+ const allocator_type& __a = allocator_type() )
+ : _Deque_base<_Tp, _Alloc>(__a, __last - __first) {
+ __uninitialized_copy(__first, __last, this->_M_start, _IsPODType());
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ ~deque() {
+ _STLP_STD::_Destroy(this->_M_start, this->_M_finish);
+ }
+
+ _Self& operator= (const _Self& __x);
+
+ void swap(_Self& __x) {
+ _STLP_STD::swap(this->_M_start, __x._M_start);
+ _STLP_STD::swap(this->_M_finish, __x._M_finish);
+ _STLP_STD::swap(this->_M_map, __x._M_map);
+ _STLP_STD::swap(this->_M_map_size, __x._M_map_size);
+ }
+
+public:
+ // assign(), a generalized assignment member function. Two
+ // versions: one that takes a count, and one that takes a range.
+ // The range version is a member template, so we dispatch on whether
+ // or not the type is an integer.
+
+ void _M_fill_assign(size_type __n, const _Tp& __val) {
+ if (__n > size()) {
+ _STLP_STD::fill(begin(), end(), __val);
+ insert(end(), __n - size(), __val);
+ }
+ else {
+ erase(begin() + __n, end());
+ _STLP_STD::fill(begin(), end(), __val);
+ }
+ }
+
+ void assign(size_type __n, const _Tp& __val) {
+ _M_fill_assign(__n, __val);
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _InputIterator>
+ void assign(_InputIterator __first, _InputIterator __last) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_assign_dispatch(__first, __last, _Integral());
+ }
+
+private: // helper functions for assign()
+
+ template <class _Integer>
+ void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type&)
+ { _M_fill_assign((size_type) __n, (_Tp) __val); }
+
+ template <class _InputIterator>
+ void _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
+ const __false_type&) {
+ _M_assign_aux(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+ }
+
+ template <class _InputIter>
+ void _M_assign_aux(_InputIter __first, _InputIter __last, const input_iterator_tag &) {
+ iterator __cur = begin();
+ for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
+ *__cur = *__first;
+ if (__first == __last)
+ erase(__cur, end());
+ else
+ insert(end(), __first, __last);
+ }
+
+ template <class _ForwardIterator>
+ void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
+ const forward_iterator_tag &) {
+ size_type __len = distance(__first, __last);
+ if (__len > size()) {
+ _ForwardIterator __mid = __first;
+ advance(__mid, size());
+ copy(__first, __mid, begin());
+ insert(end(), __mid, __last);
+ }
+ else
+ erase(copy(__first, __last, begin()), end());
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public: // push_* and pop_*
+
+ void push_back(const value_type& __t) {
+ if (this->_M_finish._M_cur != this->_M_finish._M_last - 1) {
+ _Construct(this->_M_finish._M_cur, __t);
+ ++this->_M_finish._M_cur;
+ }
+ else
+ _M_push_back_aux_v(__t);
+ }
+ void push_front(const value_type& __t) {
+ if (this->_M_start._M_cur != this->_M_start._M_first) {
+ _Construct(this->_M_start._M_cur - 1, __t);
+ --this->_M_start._M_cur;
+ }
+ else
+ _M_push_front_aux_v(__t);
+ }
+
+# ifndef _STLP_NO_ANACHRONISMS
+ void push_back() {
+ if (this->_M_finish._M_cur != this->_M_finish._M_last - 1) {
+ _Construct(this->_M_finish._M_cur);
+ ++this->_M_finish._M_cur;
+ }
+ else
+ _M_push_back_aux();
+ }
+ void push_front() {
+ if (this->_M_start._M_cur != this->_M_start._M_first) {
+ _Construct(this->_M_start._M_cur - 1);
+ --this->_M_start._M_cur;
+ }
+ else
+ _M_push_front_aux();
+ }
+# endif
+
+ void pop_back() {
+ if (this->_M_finish._M_cur != this->_M_finish._M_first) {
+ --this->_M_finish._M_cur;
+ _STLP_STD::_Destroy(this->_M_finish._M_cur);
+ }
+ else
+ _M_pop_back_aux();
+ }
+
+ void pop_front() {
+ if (this->_M_start._M_cur != this->_M_start._M_last - 1) {
+ _STLP_STD::_Destroy(this->_M_start._M_cur);
+ ++this->_M_start._M_cur;
+ }
+ else
+ _M_pop_front_aux();
+ }
+
+public: // Insert
+
+ iterator insert(iterator __position, const value_type& __x) {
+ if (__position._M_cur == this->_M_start._M_cur) {
+ push_front(__x);
+ return this->_M_start;
+ }
+ else if (__position._M_cur == this->_M_finish._M_cur) {
+ push_back(__x);
+ iterator __tmp = this->_M_finish;
+ --__tmp;
+ return __tmp;
+ }
+ else {
+ return _M_insert_aux(__position, __x);
+ }
+ }
+
+ iterator insert(iterator __position)
+ { return insert(__position, value_type()); }
+
+ void insert(iterator __pos, size_type __n, const value_type& __x) {
+ _M_fill_insert(__pos, __n, __x);
+ }
+
+ void _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ // Check whether it's an integral type. If so, it's not an iterator.
+ template <class _InputIterator>
+ void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_insert_dispatch(__pos, __first, __last, _Integral());
+ }
+
+ template <class _Integer>
+ void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
+ const __true_type&) {
+ _M_fill_insert(__pos, (size_type) __n, (value_type) __x);
+ }
+
+ template <class _InputIterator>
+ void _M_insert_dispatch(iterator __pos,
+ _InputIterator __first, _InputIterator __last,
+ const __false_type&) {
+ insert(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+ }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ void insert(iterator __pos,
+ const value_type* __first, const value_type* __last);
+ void insert(iterator __pos,
+ const_iterator __first, const_iterator __last);
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ void resize(size_type __new_size, value_type __x) {
+ const size_type __len = size();
+ if (__new_size < __len)
+ erase(this->_M_start + __new_size, this->_M_finish);
+ else
+ insert(this->_M_finish, __new_size - __len, __x);
+ }
+
+ void resize(size_type new_size) { resize(new_size, value_type()); }
+
+public: // Erase
+ iterator erase(iterator __pos) {
+ iterator __next = __pos;
+ ++__next;
+ difference_type __index = __pos - this->_M_start;
+ if (size_type(__index) < this->size() >> 1) {
+ copy_backward(this->_M_start, __pos, __next);
+ pop_front();
+ }
+ else {
+ copy(__next, this->_M_finish, __pos);
+ pop_back();
+ }
+ return this->_M_start + __index;
+ }
+
+ iterator erase(iterator __first, iterator __last);
+ void clear();
+
+protected: // Internal construction/destruction
+
+ void _M_fill_initialize(const value_type& __val);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _InputIterator>
+ void _M_range_initialize(_InputIterator __first,
+ _InputIterator __last,
+ const input_iterator_tag &) {
+ this->_M_initialize_map(0);
+ _STLP_TRY {
+ for ( ; __first != __last; ++__first)
+ push_back(*__first);
+ }
+ _STLP_UNWIND(clear());
+ }
+ template <class _ForwardIterator>
+ void _M_range_initialize(_ForwardIterator __first,
+ _ForwardIterator __last,
+ const forward_iterator_tag &) {
+ size_type __n = distance(__first, __last);
+ this->_M_initialize_map(__n);
+ _Map_pointer __cur_node;
+ _STLP_TRY {
+ for (__cur_node = this->_M_start._M_node;
+ __cur_node < this->_M_finish._M_node;
+ ++__cur_node) {
+ _ForwardIterator __mid = __first;
+ advance(__mid, this->buffer_size());
+ uninitialized_copy(__first, __mid, *__cur_node);
+ __first = __mid;
+ }
+ uninitialized_copy(__first, __last, this->_M_finish._M_first);
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_start, iterator(*__cur_node, __cur_node)));
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+protected: // Internal push_* and pop_*
+
+ void _M_push_back_aux_v(const value_type&);
+ void _M_push_front_aux_v(const value_type&);
+# ifndef _STLP_NO_ANACHRONISMS
+ void _M_push_back_aux();
+ void _M_push_front_aux();
+# endif
+ void _M_pop_back_aux();
+ void _M_pop_front_aux();
+
+protected: // Internal insert functions
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+template <class _InputIterator>
+void
+insert(iterator __pos,
+ _InputIterator __first,
+ _InputIterator __last,
+ const input_iterator_tag &)
+{
+ copy(__first, __last, inserter(*this, __pos));
+}
+
+template <class _ForwardIterator>
+void insert(iterator __pos,
+ _ForwardIterator __first,
+ _ForwardIterator __last,
+ const forward_iterator_tag &)
+ {
+ size_type __n = distance(__first, __last);
+ if (__pos._M_cur == this->_M_start._M_cur) {
+ iterator __new_start = _M_reserve_elements_at_front(__n);
+ _STLP_TRY {
+ uninitialized_copy(__first, __last, __new_start);
+ this->_M_start = __new_start;
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+ }
+ else if (__pos._M_cur == this->_M_finish._M_cur) {
+ iterator __new_finish = _M_reserve_elements_at_back(__n);
+ _STLP_TRY {
+ uninitialized_copy(__first, __last, this->_M_finish);
+ this->_M_finish = __new_finish;
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1));
+ }
+ else
+ _M_insert_aux(__pos, __first, __last, __n);
+}
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ iterator _M_insert_aux(iterator __pos, const value_type& __x);
+ iterator _M_insert_aux(iterator __pos);
+ iterator _M_insert_aux_prepare(iterator __pos);
+
+ void _M_insert_aux(iterator __pos, size_type __n, const value_type& __x);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _ForwardIterator>
+ void _M_insert_aux(iterator __pos,
+ _ForwardIterator __first,
+ _ForwardIterator __last,
+ size_type __n) {
+
+ const difference_type __elemsbefore = __pos - this->_M_start;
+ size_type __length = size();
+ if (__elemsbefore < difference_type(__length / 2)) {
+ iterator __new_start = _M_reserve_elements_at_front(__n);
+ iterator __old_start = this->_M_start;
+ __pos = this->_M_start + __elemsbefore;
+ _STLP_TRY {
+ if (__elemsbefore >= difference_type(__n)) {
+ iterator __start_n = this->_M_start + difference_type(__n);
+ uninitialized_copy(this->_M_start, __start_n, __new_start);
+ this->_M_start = __new_start;
+ copy(__start_n, __pos, __old_start);
+ copy(__first, __last, __pos - difference_type(__n));
+ }
+ else {
+ _ForwardIterator __mid = __first;
+ advance(__mid, difference_type(__n) - __elemsbefore);
+ __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid,
+ __new_start, _IsPODType());
+ this->_M_start = __new_start;
+ copy(__mid, __last, __old_start);
+ }
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+ }
+ else {
+ iterator __new_finish = _M_reserve_elements_at_back(__n);
+ iterator __old_finish = this->_M_finish;
+ const difference_type __elemsafter =
+ difference_type(__length) - __elemsbefore;
+ __pos = this->_M_finish - __elemsafter;
+ _STLP_TRY {
+ if (__elemsafter > difference_type(__n)) {
+ iterator __finish_n = this->_M_finish - difference_type(__n);
+ uninitialized_copy(__finish_n, this->_M_finish, this->_M_finish);
+ this->_M_finish = __new_finish;
+ copy_backward(__pos, __finish_n, __old_finish);
+ copy(__first, __last, __pos);
+ }
+ else {
+ _ForwardIterator __mid = __first;
+ advance(__mid, __elemsafter);
+ __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish, _IsPODType());
+ this->_M_finish = __new_finish;
+ copy(__first, __mid, __pos);
+ }
+ }
+ _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1));
+ }
+ }
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ void _M_insert_aux(iterator __pos,
+ const value_type* __first, const value_type* __last,
+ size_type __n);
+
+ void _M_insert_aux(iterator __pos,
+ const_iterator __first, const_iterator __last,
+ size_type __n);
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ iterator _M_reserve_elements_at_front(size_type __n) {
+ size_type __vacancies = this->_M_start._M_cur - this->_M_start._M_first;
+ if (__n > __vacancies)
+ _M_new_elements_at_front(__n - __vacancies);
+ return this->_M_start - difference_type(__n);
+ }
+
+ iterator _M_reserve_elements_at_back(size_type __n) {
+ size_type __vacancies = (this->_M_finish._M_last - this->_M_finish._M_cur) - 1;
+ if (__n > __vacancies)
+ _M_new_elements_at_back(__n - __vacancies);
+ return this->_M_finish + difference_type(__n);
+ }
+
+ void _M_new_elements_at_front(size_type __new_elements);
+ void _M_new_elements_at_back(size_type __new_elements);
+
+protected: // Allocation of _M_map and nodes
+
+ // Makes sure the _M_map has space for new nodes. Does not actually
+ // add the nodes. Can invalidate _M_map pointers. (And consequently,
+ // deque iterators.)
+
+ void _M_reserve_map_at_back (size_type __nodes_to_add = 1) {
+ if (__nodes_to_add + 1 > this->_M_map_size._M_data - (this->_M_finish._M_node - this->_M_map._M_data))
+ _M_reallocate_map(__nodes_to_add, false);
+ }
+
+ void _M_reserve_map_at_front (size_type __nodes_to_add = 1) {
+ if (__nodes_to_add > size_type(this->_M_start._M_node - this->_M_map._M_data))
+ _M_reallocate_map(__nodes_to_add, true);
+ }
+
+ void _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front);
+
+};
+
+# define _STLP_TEMPLATE_CONTAINER deque<_Tp, _Alloc>
+# define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
+# include <stl/_relops_cont.h>
+# undef _STLP_TEMPLATE_CONTAINER
+# undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+
+// do a cleanup
+# undef deque
+# undef __deque__
+# define __deque__ __WORKAROUND_DBG_RENAME(deque)
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_deque.c>
+# endif
+
+#if defined (_STLP_DEBUG)
+# include <stl/debug/_deque.h>
+#endif
+
+# if defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM)
+# include <stl/wrappers/_deque.h>
+# endif
+
+#endif /* _STLP_INTERNAL_DEQUE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_epilog.h b/src/STLport/stl/_epilog.h
new file mode 100644
index 0000000..0393b92
--- /dev/null
+++ b/src/STLport/stl/_epilog.h
@@ -0,0 +1,44 @@
+/* NOTE : this header has no guards and is MEANT for multiple inclusion !
+ * If you are using "header protection" option with your compiler,
+ * please also find #pragma which disables it and put it here, to
+ * allow reentrancy of this header.
+ */
+
+/* If the platform provides any specific epilog actions,
+ like #pragmas, do include platform-specific prolog file */
+# if defined (_STLP_HAS_SPECIFIC_PROLOG_EPILOG)
+# include <config/_epilog.h>
+# endif
+
+# ifndef _STLP_NO_POST_COMPATIBLE_SECTION
+# include <stl/_config_compat_post.h>
+# endif
+
+/* provide a mechanism to redefine std:: namespace in a way that is transparent to the
+ * user. _STLP_REDEFINE_STD is being used for wrapper files that include native headers
+ * to temporary undef the std macro. */
+# if defined ( _STLP_USE_NAMESPACES ) && (defined ( _STLP_USE_OWN_NAMESPACE ) && !defined ( _STLP_REDEFINE_STD ) )
+# undef _STLP_REDEFINE_STD
+# define _STLP_REDEFINE_STD 1
+# endif
+
+# if defined (_STLP_REDEFINE_STD)
+/* We redefine "std" to "stlport", so that user code may use std:: transparently */
+# undef std
+# define std STLPORT
+# else
+# if defined(__cplusplus)
+# ifndef _STLP_CONFIG_H
+# include <stl/_config.h>
+# endif
+
+# endif /* __cplusplus */
+# endif
+
+
+
+
+
+
+
+
diff --git a/src/STLport/stl/_exception.h b/src/STLport/stl/_exception.h
new file mode 100644
index 0000000..e69de29
diff --git a/src/STLport/stl/_fstream.c b/src/STLport/stl/_fstream.c
new file mode 100644
index 0000000..b01789b
--- /dev/null
+++ b/src/STLport/stl/_fstream.c
@@ -0,0 +1,749 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_FSTREAM_C
+#define _STLP_FSTREAM_C
+
+# ifndef _STLP_INTERNAL_FSTREAM_H
+# include <stl/_fstream.h>
+# endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+// no wchar_t is supported for this mode
+# define __BF_int_type__ int
+# define __BF_pos_type__ streampos
+# define __BF_off_type__ streamoff
+# else
+# define __BF_int_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_filebuf<_CharT, _Traits>::int_type
+# define __BF_pos_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_filebuf<_CharT, _Traits>::pos_type
+# define __BF_off_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_filebuf<_CharT, _Traits>::off_type
+# endif
+
+
+//----------------------------------------------------------------------
+// Public basic_filebuf<> member functions
+
+template <class _CharT, class _Traits>
+basic_filebuf<_CharT, _Traits>::basic_filebuf()
+ : basic_streambuf<_CharT, _Traits>(), _M_base(),
+ _M_constant_width(false), _M_always_noconv(false),
+ _M_int_buf_dynamic(false),
+ _M_in_input_mode(false), _M_in_output_mode(false),
+ _M_in_error_mode(false), _M_in_putback_mode(false),
+ _M_int_buf(0), _M_int_buf_EOS(0),
+ _M_ext_buf(0), _M_ext_buf_EOS(0),
+ _M_ext_buf_converted(0), _M_ext_buf_end(0),
+ _M_state(_STLP_DEFAULT_CONSTRUCTED(_State_type)),
+ _M_end_state(_STLP_DEFAULT_CONSTRUCTED(_State_type)),
+ _M_mmap_base(0), _M_mmap_len(0),
+ _M_saved_eback(0), _M_saved_gptr(0), _M_saved_egptr(0),
+ _M_codecvt(0),
+ _M_width(1), _M_max_width(1)
+{
+ this->_M_setup_codecvt(locale());
+}
+
+template <class _CharT, class _Traits>
+basic_filebuf<_CharT, _Traits>::~basic_filebuf() {
+ this->close();
+ _M_deallocate_buffers();
+}
+
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_filebuf<_CharT, _Traits>::int_type
+basic_filebuf<_CharT, _Traits>::underflow()
+{
+ return _Underflow<_CharT, _Traits>::_M_doit(this);
+}
+
+template <class _CharT, class _Traits>
+basic_filebuf<_CharT, _Traits>*
+basic_filebuf<_CharT, _Traits>::close()
+{
+ bool __ok = this->is_open();
+
+ if (_M_in_output_mode) {
+ __ok = __ok && !_Traits::eq_int_type(this->overflow(traits_type::eof()),
+ traits_type::eof());
+ __ok == __ok && this->_M_unshift();
+ }
+ else if (_M_in_input_mode)
+ this->_M_exit_input_mode();
+
+ // Note order of arguments. We close the file even if __ok is false.
+ __ok = _M_base._M_close() && __ok;
+
+ // Restore the initial state, except that we don't deallocate the buffer
+ // or mess with the cached codecvt information.
+ _M_state = _M_end_state = _State_type();
+ _M_ext_buf_converted = _M_ext_buf_end = 0;
+
+ _M_mmap_base = 0;
+ _M_mmap_len = 0;
+
+ this->setg(0, 0, 0);
+ this->setp(0, 0);
+
+ _M_saved_eback = _M_saved_gptr = _M_saved_egptr = 0;
+
+ _M_in_input_mode = _M_in_output_mode = _M_in_error_mode = _M_in_putback_mode
+ = false;
+
+ return __ok ? this : 0;
+}
+
+// This member function is called whenever we exit input mode.
+// It unmaps the memory-mapped file, if any, and sets
+// _M_in_input_mode to false.
+template <class _CharT, class _Traits>
+void basic_filebuf<_CharT, _Traits>::_M_exit_input_mode()
+{
+ if (_M_mmap_base != 0)
+ _M_base._M_unmap(_M_mmap_base, _M_mmap_len);
+ _M_in_input_mode = false;
+ _M_mmap_base = 0;
+}
+
+
+//----------------------------------------------------------------------
+// basic_filebuf<> overridden protected virtual member functions
+
+template <class _CharT, class _Traits>
+streamsize basic_filebuf<_CharT, _Traits>::showmanyc()
+{
+ // Is there any possibility that reads can succeed?
+ if (!this->is_open() || _M_in_output_mode || _M_in_error_mode)
+ return -1;
+
+ else if (_M_in_putback_mode)
+ return this->egptr() - this->gptr();
+
+ else if (_M_constant_width) {
+ streamoff __pos = _M_base._M_seek(0, ios_base::cur);
+ streamoff __size = _M_base._M_file_size();
+ return __pos >= 0 && __size > __pos ? __size - __pos : 0;
+ }
+
+ else
+ return 0;
+}
+
+
+// Make a putback position available, if necessary, by switching to a
+// special internal buffer used only for putback. The buffer is
+// [_M_pback_buf, _M_pback_buf + _S_pback_buf_size), but the base
+// class only sees a piece of it at a time. (We want to make sure
+// that we don't try to read a character that hasn't been initialized.)
+// The end of the putback buffer is always _M_pback_buf + _S_pback_buf_size,
+// but the beginning is usually not _M_pback_buf.
+template <class _CharT, class _Traits>
+__BF_int_type__
+basic_filebuf<_CharT, _Traits>::pbackfail(int_type __c)
+{
+ const int_type __eof = traits_type::eof();
+
+ // If we aren't already in input mode, pushback is impossible.
+ if (!_M_in_input_mode)
+ return __eof;
+
+ // We can use the ordinary get buffer if there's enough space, and
+ // if it's a buffer that we're allowed to write to.
+ if (this->gptr() != this->eback() &&
+ (traits_type::eq_int_type(__c, __eof) ||
+ traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]) ||
+ !_M_mmap_base)) {
+ this->gbump(-1);
+ if (traits_type::eq_int_type(__c, __eof) ||
+ traits_type::eq(traits_type::to_char_type(__c), *this->gptr()))
+ return traits_type::to_int_type(*this->gptr());
+ }
+ else if (!traits_type::eq_int_type(__c, __eof)) {
+ // Are we in the putback buffer already?
+ _CharT* __pback_end = _M_pback_buf + __STATIC_CAST(int,_S_pback_buf_size);
+ if (_M_in_putback_mode) {
+ // Do we have more room in the putback buffer?
+ if (this->eback() != _M_pback_buf)
+ this->setg(this->egptr() - 1, this->egptr() - 1, __pback_end);
+ else
+ return __eof; // No more room in the buffer, so fail.
+ }
+ else { // We're not yet in the putback buffer.
+ _M_saved_eback = this->eback();
+ _M_saved_gptr = this->gptr();
+ _M_saved_egptr = this->egptr();
+ this->setg(__pback_end - 1, __pback_end - 1, __pback_end);
+ _M_in_putback_mode = true;
+ }
+ }
+ else
+ return __eof;
+
+ // We have made a putback position available. Assign to it, and return.
+ *this->gptr() = traits_type::to_char_type(__c);
+ return __c;
+}
+
+// This member function flushes the put area, and also outputs the
+// character __c (unless __c is eof). Invariant: we always leave room
+// in the internal buffer for one character more than the base class knows
+// about. We see the internal buffer as [_M_int_buf, _M_int_buf_EOS), but
+// the base class only sees [_M_int_buf, _M_int_buf_EOS - 1).
+template <class _CharT, class _Traits>
+__BF_int_type__
+basic_filebuf<_CharT, _Traits>::overflow(int_type __c)
+{
+ // Switch to output mode, if necessary.
+ if (!_M_in_output_mode)
+ if (!_M_switch_to_output_mode())
+ return traits_type::eof();
+
+ _CharT* __ibegin = this->_M_int_buf;
+ _CharT* __iend = this->pptr();
+ this->setp(_M_int_buf, _M_int_buf_EOS - 1);
+
+ // Put __c at the end of the internal buffer.
+ if (!traits_type::eq_int_type(__c, traits_type::eof()))
+ *__iend++ = __c;
+
+ // For variable-width encodings, output may take more than one pass.
+ while (__ibegin != __iend) {
+ const _CharT* __inext = __ibegin;
+ char* __enext = _M_ext_buf;
+ typename _Codecvt::result __status
+ = _M_codecvt->out(_M_state, __ibegin, __iend, __inext,
+ _M_ext_buf, _M_ext_buf_EOS, __enext);
+ if (__status == _Codecvt::noconv)
+ return _Noconv_output<_Traits>::_M_doit(this, __ibegin, __iend)
+ ? traits_type::not_eof(__c)
+ : _M_output_error();
+
+ // For a constant-width encoding we know that the external buffer
+ // is large enough, so failure to consume the entire internal buffer
+ // or to produce the correct number of external characters, is an error.
+ // For a variable-width encoding, however, we require only that we
+ // consume at least one internal character
+ else if (__status != _Codecvt::error &&
+ ((__inext == __iend && (__enext - _M_ext_buf ==
+ _M_width * (__iend - __ibegin))) ||
+ (!_M_constant_width && __inext != __ibegin))) {
+ // We successfully converted part or all of the internal buffer.
+ ptrdiff_t __n = __enext - _M_ext_buf;
+ if (_M_write(_M_ext_buf, __n))
+ __ibegin += __inext - __ibegin;
+ else
+ return _M_output_error();
+ }
+ else
+ return _M_output_error();
+ }
+
+ return traits_type::not_eof(__c);
+}
+
+// This member function must be called before any I/O has been
+// performed on the stream, otherwise it has no effect.
+//
+// __buf == 0 && __n == 0 means to make ths stream unbuffered.
+// __buf != 0 && __n > 0 means to use __buf as the stream's internal
+// buffer, rather than the buffer that would otherwise be allocated
+// automatically. __buf must be a pointer to an array of _CharT whose
+// size is at least __n.
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>*
+basic_filebuf<_CharT, _Traits>::setbuf(_CharT* __buf, streamsize __n)
+{
+ if (!_M_in_input_mode &&! _M_in_output_mode && !_M_in_error_mode &&
+ _M_int_buf == 0) {
+ if (__buf == 0 && __n == 0)
+ _M_allocate_buffers(0, 1);
+ else if (__buf != 0 && __n > 0)
+ _M_allocate_buffers(__buf, __n);
+ }
+ return this;
+}
+
+template <class _CharT, class _Traits>
+__BF_pos_type__
+basic_filebuf<_CharT, _Traits>::seekoff(off_type __off,
+ ios_base::seekdir __whence,
+ ios_base::openmode /* dummy */)
+{
+ if (this->is_open() &&
+ (__off == 0 || (_M_constant_width && this->_M_base._M_in_binary_mode()))) {
+
+ if (!_M_seek_init(__off != 0 || __whence != ios_base::cur))
+ return pos_type(-1);
+
+ // Seek to beginning or end, regardless of whether we're in input mode.
+ if (__whence == ios_base::beg || __whence == ios_base::end)
+ return _M_seek_return(_M_base._M_seek(_M_width * __off, __whence),
+ _State_type());
+
+ // Seek relative to current position. Complicated if we're in input mode.
+ else if (__whence == ios_base::cur) {
+
+ if (!_M_in_input_mode)
+ return _M_seek_return(_M_base._M_seek(_M_width * __off, __whence),
+ _State_type());
+ else if (_M_mmap_base != 0) {
+ // __off is relative to gptr(). We need to do a bit of arithmetic
+ // to get an offset relative to the external file pointer.
+ streamoff __adjust = _M_mmap_len - (this->gptr() - (_CharT*) _M_mmap_base);
+
+ // if __off == 0, we do not need to exit input mode and to shift file pointer
+ if (__off == 0) {
+ return pos_type(_M_base._M_seek(0, ios_base::cur) - __adjust);
+ }
+ else
+ return _M_seek_return(_M_base._M_seek(__off - __adjust, ios_base::cur), _State_type());
+ }
+ else if (_M_constant_width) { // Get or set the position.
+
+ streamoff __iadj = _M_width * (this->gptr() - this->eback());
+
+ // Compensate for offset relative to gptr versus offset relative
+ // to external pointer. For a text-oriented stream, where the
+ // compensation is more than just pointer arithmetic, we may get
+ // but not set the current position.
+
+ if (__iadj <= _M_ext_buf_end - _M_ext_buf) {
+
+ streamoff __eadj = _M_base._M_get_offset(_M_ext_buf + __iadj, _M_ext_buf_end);
+
+ if (__off == 0) {
+ return pos_type(_M_base._M_seek(0, ios_base::cur) - __eadj);
+ } else {
+ return _M_seek_return(_M_base._M_seek(__off - __eadj, ios_base::cur), _State_type());
+ }
+ }
+ else
+ return pos_type(-1);
+ }
+ else { // Get the position. Encoding is var width.
+ // Get position in internal buffer.
+ ptrdiff_t __ipos = this->gptr() - this->eback();
+
+ // Get corresponding position in external buffer.
+ _State_type __state = _M_state;
+ int __epos = _M_codecvt->length(__state, _M_ext_buf, _M_ext_buf_end,
+ __ipos);
+
+ // Sanity check (expensive): make sure __epos is the right answer.
+ _State_type __tmp_state = _M_state;
+ _Filebuf_Tmp_Buf<_CharT> __buf(__ipos);
+ _CharT* __ibegin = __buf._M_ptr;
+ _CharT* __inext = __ibegin;
+
+ const char* __dummy;
+ typename _Codecvt::result __status
+ = _M_codecvt->in(__tmp_state,
+ _M_ext_buf, _M_ext_buf + __epos, __dummy,
+ __ibegin, __ibegin + __ipos, __inext);
+ if (__status != _Codecvt::error &&
+ (__status == _Codecvt::noconv ||
+ (__inext == __ibegin + __ipos &&
+ equal(this->gptr(), this->eback(), __ibegin,
+ _Eq_traits<traits_type>())))) {
+ // Get the current position (at the end of the external buffer),
+ // then adjust it. Again, it might be a text-oriented stream.
+ streamoff __cur = _M_base._M_seek(0, ios_base::cur);
+ streamoff __adj =
+ _M_base._M_get_offset(_M_ext_buf, _M_ext_buf + __epos) -
+ _M_base._M_get_offset(_M_ext_buf, _M_ext_buf_end);
+ if (__cur != -1 && __cur + __adj >= 0)
+ return _M_seek_return(__cur + __adj, __state);
+ else
+ return pos_type(-1);
+ }
+ else // We failed the sanity check.
+ return pos_type(-1);
+ }
+ }
+ else // Unrecognized value for __whence.
+ return pos_type(-1);
+ }
+ else
+ return pos_type(-1);
+}
+
+
+template <class _CharT, class _Traits>
+__BF_pos_type__
+basic_filebuf<_CharT, _Traits>::seekpos(pos_type __pos,
+ ios_base::openmode /* dummy */)
+{
+ if (this->is_open()) {
+ if (!_M_seek_init(true))
+ return pos_type(-1);
+
+ streamoff __off = off_type(__pos);
+ if (__off != -1 && _M_base._M_seek(__off, ios_base::beg) != -1) {
+ _M_state = __pos.state();
+ return _M_seek_return(__off, __pos.state());
+ }
+ else
+ return pos_type(-1);
+ }
+ else
+ return pos_type(-1);
+}
+
+
+template <class _CharT, class _Traits>
+int basic_filebuf<_CharT, _Traits>::sync()
+{
+ if (_M_in_output_mode)
+ return traits_type::eq_int_type(this->overflow(traits_type::eof()),
+ traits_type::eof())
+ ? -1
+ : 0;
+ else
+ return 0;
+}
+
+
+// Change the filebuf's locale. This member function has no effect
+// unless it is called before any I/O is performed on the stream.
+template <class _CharT, class _Traits>
+void basic_filebuf<_CharT, _Traits>::imbue(const locale& __loc)
+{
+ if (!_M_in_input_mode &&! _M_in_output_mode && !_M_in_error_mode) {
+ this->_M_setup_codecvt(__loc);
+ }
+}
+
+//----------------------------------------------------------------------
+// basic_filebuf<> helper functions.
+
+//----------------------------------------
+// Helper functions for switching between modes.
+
+// This member function is called if we're performing the first I/O
+// operation on a filebuf, or if we're performing an input operation
+// immediately after a seek.
+template <class _CharT, class _Traits>
+bool basic_filebuf<_CharT, _Traits>::_M_switch_to_input_mode()
+{
+
+ if (this->is_open() && (((int)_M_base.__o_mode() & (int)ios_base::in) !=0)
+ && (_M_in_output_mode == 0) && (_M_in_error_mode == 0)) {
+ if (!_M_int_buf && !_M_allocate_buffers())
+ return false;
+
+ _M_ext_buf_converted = _M_ext_buf;
+ _M_ext_buf_end = _M_ext_buf;
+
+ _M_end_state = _M_state;
+
+ _M_in_input_mode = true;
+ return true;
+ }
+ else
+
+ return false;
+}
+
+
+// This member function is called if we're performing the first I/O
+// operation on a filebuf, or if we're performing an output operation
+// immediately after a seek.
+template <class _CharT, class _Traits>
+bool basic_filebuf<_CharT, _Traits>::_M_switch_to_output_mode()
+{
+ if (this->is_open() && (_M_base.__o_mode() & (int)ios_base::out) &&
+ _M_in_input_mode == 0 && _M_in_error_mode == 0) {
+
+ if (!_M_int_buf && !_M_allocate_buffers())
+ return false;
+
+ // In append mode, every write does an implicit seek to the end
+ // of the file. Whenever leaving output mode, the end of file
+ // get put in the initial shift state.
+ if (_M_base.__o_mode() & ios_base::app)
+ _M_state = _State_type();
+
+ this->setp(_M_int_buf, _M_int_buf_EOS - 1);
+ _M_in_output_mode = true;
+
+ return true;
+ }
+ else
+ return false;
+}
+
+
+//----------------------------------------
+// Helper functions for input
+
+// This member function is called if there is an error during input.
+// It puts the filebuf in error mode, clear the get area buffer, and
+// returns eof.
+// returns eof. Error mode is sticky; it is cleared only by close or
+// seek.
+
+template <class _CharT, class _Traits>
+__BF_int_type__
+basic_filebuf<_CharT, _Traits>::_M_input_error()
+{
+ this->_M_exit_input_mode();
+ _M_in_output_mode = false;
+ _M_in_error_mode = true;
+ this->setg(0, 0, 0);
+ return traits_type::eof();
+}
+
+template <class _CharT, class _Traits>
+__BF_int_type__
+basic_filebuf<_CharT, _Traits>::_M_underflow_aux()
+{
+ // We have the state and file position from the end of the internal
+ // buffer. This round, they become the beginning of the internal buffer.
+ _M_state = _M_end_state;
+
+ // Fill the external buffer. Start with any leftover characters that
+ // didn't get converted last time.
+ if (_M_ext_buf_end > _M_ext_buf_converted)
+
+ _M_ext_buf_end = copy(_M_ext_buf_converted, _M_ext_buf_end, _M_ext_buf);
+ // boris : copy_backward did not work
+ //_M_ext_buf_end = copy_backward(_M_ext_buf_converted, _M_ext_buf_end,
+ //_M_ext_buf+ (_M_ext_buf_end - _M_ext_buf_converted));
+ else
+ _M_ext_buf_end = _M_ext_buf;
+
+ // Now fill the external buffer with characters from the file. This is
+ // a loop because occasonally we don't get enough external characters
+ // to make progress.
+ while (true) {
+ ptrdiff_t __n = _M_base._M_read(_M_ext_buf_end, _M_ext_buf_EOS - _M_ext_buf_end);
+
+ // Don't enter error mode for a failed read. Error mode is sticky,
+ // and we might succeed if we try again.
+ if (__n <= 0)
+ return traits_type::eof();
+
+ // Convert the external buffer to internal characters.
+ _M_ext_buf_end += __n;
+ const char* __enext;
+ _CharT* __inext;
+
+ typename _Codecvt::result __status
+ = _M_codecvt->in(_M_end_state,
+ _M_ext_buf, _M_ext_buf_end, __enext,
+ _M_int_buf, _M_int_buf_EOS, __inext);
+
+ // Error conditions: (1) Return value of error. (2) Producing internal
+ // characters without consuming external characters. (3) In fixed-width
+ // encodings, producing an internal sequence whose length is inconsistent
+ // with that of the internal sequence. (4) Failure to produce any
+ // characters if we have enough characters in the external buffer, where
+ // "enough" means the largest possible width of a single character.
+ if (__status == _Codecvt::noconv)
+ return _Noconv_input<_Traits>::_M_doit(this);
+
+ else if (__status == _Codecvt::error ||
+ (__inext != _M_int_buf && __enext == _M_ext_buf) ||
+ (_M_constant_width &&
+ // __inext - _M_int_buf != _M_width * (__enext - _M_ext_buf)) ||
+ (__inext - _M_int_buf) * _M_width != (__enext - _M_ext_buf)) ||
+ (__inext == _M_int_buf && __enext - _M_ext_buf >= _M_max_width))
+ return _M_input_error();
+
+ else if (__inext != _M_int_buf) {
+ _M_ext_buf_converted = _M_ext_buf + (__enext - _M_ext_buf);
+ this->setg(_M_int_buf, _M_int_buf, __inext);
+ return traits_type::to_int_type(*_M_int_buf);
+ }
+ // We need to go around the loop again to get more external characters.
+ }
+}
+
+//----------------------------------------
+// Helper functions for output
+
+// This member function is called if there is an error during output.
+// It puts the filebuf in error mode, clear the put area buffer, and
+// returns eof. Error mode is sticky; it is cleared only by close or
+// seek.
+template <class _CharT, class _Traits>
+__BF_int_type__
+basic_filebuf<_CharT, _Traits>::_M_output_error()
+{
+ _M_in_output_mode = false;
+ _M_in_input_mode = false;
+ _M_in_error_mode = true;
+ this->setp(0, 0);
+ return traits_type::eof();
+}
+
+
+// Write whatever sequence of characters is necessary to get back to
+// the initial shift state. This function overwrites the external
+// buffer, changes the external file position, and changes the state.
+// Precondition: the internal buffer is empty.
+template <class _CharT, class _Traits>
+bool basic_filebuf<_CharT, _Traits>::_M_unshift()
+{
+ if (_M_in_output_mode && !_M_constant_width) {
+ typename _Codecvt::result __status;
+ do {
+ char* __enext = _M_ext_buf;
+ __status = _M_codecvt->unshift(_M_state,
+ _M_ext_buf, _M_ext_buf_EOS, __enext);
+ if (__status == _Codecvt::noconv ||
+ (__enext == _M_ext_buf && __status == _Codecvt::ok))
+ return true;
+ else if (__status == _Codecvt::error)
+ return false;
+ else if (!_M_write(_M_ext_buf, __enext - _M_ext_buf))
+ return false;
+ } while(__status == _Codecvt::partial);
+ }
+
+ return true;
+}
+
+
+//----------------------------------------
+// Helper functions for buffer allocation and deallocation
+
+// This member function is called when we're initializing a filebuf's
+// internal and external buffers. The argument is the size of the
+// internal buffer; the external buffer is sized using the character
+// width in the current encoding. Preconditions: the buffers are currently
+// null. __n >= 1. __buf is either a null pointer or a pointer to an
+// array show size is at least __n.
+
+// We need __n >= 1 for two different reasons. For input, the base
+// class always needs a buffer because of the sementics of underflow().
+// For output, we want to have an internal buffer that's larger by one
+// element than the buffer that the base class knows about. (See
+// basic_filebuf<>::overflow() for the reason.)
+template <class _CharT, class _Traits>
+bool
+basic_filebuf<_CharT, _Traits>::_M_allocate_buffers(_CharT* __buf, streamsize __n)
+{
+
+ if (__buf == 0) {
+ _M_int_buf = __STATIC_CAST(_CharT*,malloc(__n * sizeof(_CharT)));
+ if (! _M_int_buf)
+ return false;
+ _M_int_buf_dynamic = true;
+ }
+ else {
+ _M_int_buf = __buf;
+ _M_int_buf_dynamic = false;
+ }
+
+ size_t __ebufsiz = (max)(__n * (max)(_M_codecvt->encoding(), 1),
+ streamsize(_M_codecvt->max_length()));
+
+ _M_ext_buf = __STATIC_CAST(char*,malloc(__ebufsiz));
+ if (!_M_ext_buf) {
+ _M_deallocate_buffers();
+ return false;
+ }
+
+ _M_int_buf_EOS = _M_int_buf + __n;
+ _M_ext_buf_EOS = _M_ext_buf + __ebufsiz;
+ return true;
+}
+
+// Abbreviation for the most common case.
+template <class _CharT, class _Traits>
+bool basic_filebuf<_CharT, _Traits>::_M_allocate_buffers()
+{
+ // Choose a buffer that's at least 4096 characters long and that's a
+ // multiple of the page size.
+ streamsize __default_bufsiz =
+ ((_M_base.__page_size() + 4095UL) / _M_base.__page_size()) * _M_base.__page_size();
+ return _M_allocate_buffers(0, __default_bufsiz);
+}
+
+template <class _CharT, class _Traits>
+void basic_filebuf<_CharT, _Traits>::_M_deallocate_buffers()
+{
+ if (_M_int_buf_dynamic)
+ free(_M_int_buf);
+ free(_M_ext_buf);
+ _M_int_buf = 0;
+ _M_int_buf_EOS = 0;
+ _M_ext_buf = 0;
+ _M_ext_buf_EOS = 0;
+}
+
+
+//----------------------------------------
+// Helper functiosn for seek and imbue
+
+template <class _CharT, class _Traits>
+bool basic_filebuf<_CharT, _Traits>::_M_seek_init(bool __do_unshift) {
+ // If we're in error mode, leave it.
+ _M_in_error_mode = false;
+
+ // Flush the output buffer if we're in output mode, and (conditionally)
+ // emit an unshift sequence.
+ if (_M_in_output_mode) {
+ bool __ok = !traits_type::eq_int_type(this->overflow(traits_type::eof()),
+ traits_type::eof());
+ if (__do_unshift)
+ __ok = __ok && this->_M_unshift();
+ if (!__ok) {
+ _M_in_output_mode = false;
+ _M_in_error_mode = true;
+ this->setp(0, 0);
+ return false;
+ }
+ }
+
+ // Discard putback characters, if any.
+ if (_M_in_input_mode && _M_in_putback_mode)
+ _M_exit_putback_mode();
+
+ return true;
+}
+
+
+// Change the filebuf's locale. This member function has no effect
+// unless it is called before any I/O is performed on the stream.
+template <class _CharT, class _Traits>
+void basic_filebuf<_CharT, _Traits>::_M_setup_codecvt(const locale& __loc)
+{
+ _M_codecvt = &use_facet<_Codecvt>(__loc) ;
+ int __encoding = _M_codecvt->encoding();
+
+ _M_width = (max)(__encoding, 1);
+ _M_max_width = _M_codecvt->max_length();
+ _M_constant_width = __encoding > 0;
+ _M_always_noconv = _M_codecvt->always_noconv();
+}
+
+_STLP_END_NAMESPACE
+
+# undef __BF_int_type__
+# undef __BF_pos_type__
+# undef __BF_off_type__
+
+# endif /* defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) */
+
+#endif /* _STLP_FSTREAM_C */
+
diff --git a/src/STLport/stl/_fstream.h b/src/STLport/stl/_fstream.h
new file mode 100644
index 0000000..58f9c52
--- /dev/null
+++ b/src/STLport/stl/_fstream.h
@@ -0,0 +1,741 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// This header defines classes basic_filebuf, basic_ifstream,
+// basic_ofstream, and basic_fstream. These classes represent
+// streambufs and streams whose sources or destinations are files.
+
+#ifndef _STLP_INTERNAL_FSTREAM_H
+#define _STLP_INTERNAL_FSTREAM_H
+
+#if defined(__sgi) && !defined(__GNUC__) && !defined(_STANDARD_C_PLUS_PLUS)
+#error This header file requires the -LANG:std option
+#endif
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+# include <stl/_streambuf.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ISTREAM_H
+#include <stl/_istream.h>
+#endif
+
+#ifndef _STLP_INTERNAL_CODECVT_H
+#include <stl/_codecvt.h>
+#endif
+
+#ifndef _STLP_STDIO_FILE_H
+#include <stl/_stdio_file.h>
+#endif
+
+#if !defined (_STLP_USE_UNIX_IO) && !defined(_STLP_USE_WIN32_IO) \
+ && ! defined (_STLP_USE_UNIX_EMULATION_IO) && !defined (_STLP_USE_STDIO_IO)
+
+# if defined (_STLP_UNIX) || defined (__CYGWIN__) || defined (__amigaos__) || defined (__EMX__)
+// open/close/read/write
+# define _STLP_USE_UNIX_IO
+# elif defined (_STLP_WIN32) && ! defined (__CYGWIN__)
+// CreateFile/ReadFile/WriteFile
+# define _STLP_USE_WIN32_IO
+# elif defined (_STLP_WIN16) || defined (_STLP_WIN32) || defined (_STLP_MAC)
+// _open/_read/_write
+# define _STLP_USE_UNIX_EMULATION_IO
+# else
+// fopen/fread/fwrite
+# define _STLP_USE_STDIO_IO
+# endif /* _STLP_UNIX */
+
+#endif /* mode selection */
+
+
+#if defined (_STLP_USE_WIN32_IO)
+typedef void* _STLP_fd;
+#elif defined (_STLP_USE_UNIX_EMULATION_IO) || defined (_STLP_USE_STDIO_IO) || defined (_STLP_USE_UNIX_IO)
+typedef int _STLP_fd;
+#else
+#error "Configure i/o !"
+#endif
+
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// Class _Filebuf_base, a private base class to factor out the system-
+// dependent code from basic_filebuf<>.
+
+class _STLP_CLASS_DECLSPEC _Filebuf_base {
+public: // Opening and closing files.
+ _Filebuf_base();
+
+ bool _M_open(const char*, ios_base::openmode, long __protection);
+ bool _M_open(const char*, ios_base::openmode);
+ bool _M_open(int __id, ios_base::openmode = ios_base::__default_mode);
+ bool _M_close();
+
+public: // Low-level I/O, like Unix read/write
+ ptrdiff_t _M_read(char* __buf, ptrdiff_t __n);
+ streamoff _M_seek(streamoff __offset, ios_base::seekdir __dir);
+ streamoff _M_file_size();
+ bool _M_write(char* __buf, ptrdiff_t __n);
+
+public: // Memory-mapped I/O.
+ void* _M_mmap(streamoff __offset, streamoff __len);
+ void _M_unmap(void* __mmap_base, streamoff __len);
+
+public:
+ // Returns a value n such that, if pos is the file pointer at the
+ // beginning of the range [first, last), pos + n is the file pointer at
+ // the end. On many operating systems n == __last - __first.
+ // In Unix, writing n characters always bumps the file position by n.
+ // In Windows text mode, however, it bumps the file position by n + m,
+ // where m is the number of newlines in the range. That's because an
+ // internal \n corresponds to an external two-character sequence.
+ streamoff _M_get_offset(char* __first, char* __last) {
+#if defined (_STLP_UNIX) || defined (_STLP_MAC)
+ return __last - __first;
+#else // defined (_STLP_WIN32) || defined (_STLP_WIN16) || defined (_STLP_DOS)
+ return ( (_M_openmode & ios_base::binary) != 0 )
+ ? (__last - __first)
+ : count(__first, __last, '\n') + (__last - __first);
+#endif
+ }
+
+ // Returns true if we're in binary mode or if we're using an OS or file
+ // system where there is no distinction between text and binary mode.
+ bool _M_in_binary_mode() const {
+# if defined (_STLP_UNIX) || defined (_STLP_MAC) || defined(__BEOS__) || defined (__amigaos__)
+ return true;
+# elif defined (_STLP_WIN32) || defined (_STLP_WIN16) || defined (_STLP_DOS) || defined (_STLP_VM) || defined (__EMX__)
+ return (_M_openmode & ios_base::binary) != 0;
+# else
+# error "Port!"
+# endif
+ }
+
+protected: // Static data members.
+ static size_t _M_page_size;
+
+protected: // Data members.
+ _STLP_fd _M_file_id;
+# ifdef _STLP_USE_STDIO_IO
+ // for stdio, the whole FILE* is being kept here
+ FILE* _M_file;
+# endif
+# ifdef _STLP_USE_WIN32_IO
+ void* _M_view_id;
+# endif
+
+ ios_base::openmode _M_openmode ;
+ unsigned char _M_is_open ;
+ unsigned char _M_should_close ;
+ unsigned char _M_regular_file ;
+
+public :
+ static size_t _STLP_CALL __page_size() { return _M_page_size; }
+ int __o_mode() const { return (int)_M_openmode; }
+ bool __is_open() const { return (_M_is_open !=0 ); }
+ bool __should_close() const { return (_M_should_close != 0); }
+ bool __regular_file() const { return (_M_regular_file != 0); }
+ _STLP_fd __get_fd() const { return _M_file_id; }
+};
+
+
+
+
+//----------------------------------------------------------------------
+// Class basic_filebuf<>.
+
+// Forward declaration of two helper classes.
+template <class _Traits> class _Noconv_input;
+_STLP_TEMPLATE_NULL
+class _Noconv_input<char_traits<char> >;
+
+template <class _Traits> class _Noconv_output;
+_STLP_TEMPLATE_NULL
+class _Noconv_output< char_traits<char> >;
+
+// There is a specialized version of underflow, for basic_filebuf<char>,
+// in fstream.cxx.
+
+template <class _CharT, class _Traits>
+class _Underflow;
+
+ _STLP_TEMPLATE_NULL class _Underflow< char, char_traits<char> >;
+
+template <class _CharT, class _Traits>
+class basic_filebuf : public basic_streambuf<_CharT, _Traits>
+{
+public: // Types.
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+
+ typedef typename _Traits::state_type _State_type;
+ typedef basic_streambuf<_CharT, _Traits> _Base;
+ typedef basic_filebuf<_CharT, _Traits> _Self;
+
+public: // Constructors, destructor.
+ basic_filebuf();
+ ~basic_filebuf();
+
+public: // Opening and closing files.
+ bool is_open() const { return _M_base.__is_open(); }
+
+ _Self* open(const char* __s, ios_base::openmode __m) {
+ return _M_base._M_open(__s, __m) ? this : 0;
+ }
+
+# ifndef _STLP_NO_EXTENSIONS
+ // These two version of open() and file descriptor getter are extensions.
+ _Self* open(const char* __s, ios_base::openmode __m,
+ long __protection) {
+ return _M_base._M_open(__s, __m, __protection) ? this : 0;
+ }
+
+ _STLP_fd fd() const { return _M_base.__get_fd(); }
+
+ _Self* open(int __id, ios_base::openmode _Init_mode = ios_base::__default_mode) {
+ return this->_M_open(__id, _Init_mode);
+ }
+# endif
+
+ _Self* _M_open(int __id, ios_base::openmode _Init_mode = ios_base::__default_mode) {
+ return _M_base._M_open(__id, _Init_mode) ? this : 0;
+ }
+
+ _Self* close();
+
+protected: // Virtual functions from basic_streambuf.
+ virtual streamsize showmanyc();
+ virtual int_type underflow();
+
+ virtual int_type pbackfail(int_type = traits_type::eof());
+ virtual int_type overflow(int_type = traits_type::eof());
+
+ virtual basic_streambuf<_CharT, _Traits>* setbuf(char_type*, streamsize);
+ virtual pos_type seekoff(off_type, ios_base::seekdir,
+ ios_base::openmode = ios_base::in | ios_base::out);
+ virtual pos_type seekpos(pos_type,
+ ios_base::openmode = ios_base::in | ios_base::out);
+
+ virtual int sync();
+ virtual void imbue(const locale&);
+
+private: // Helper functions.
+
+ // Precondition: we are currently in putback input mode. Effect:
+ // switches back to ordinary input mode.
+ void _M_exit_putback_mode() {
+ this->setg(_M_saved_eback, _M_saved_gptr, _M_saved_egptr);
+ _M_in_putback_mode = false;
+ }
+ bool _M_switch_to_input_mode();
+ void _M_exit_input_mode();
+ bool _M_switch_to_output_mode();
+
+ int_type _M_input_error();
+ int_type _M_underflow_aux();
+ // friend class _Noconv_input<_Traits>;
+ // friend class _Noconv_output<_Traits>;
+ friend class _Underflow<_CharT, _Traits>;
+
+ int_type _M_output_error();
+ bool _M_unshift();
+
+ bool _M_allocate_buffers(_CharT* __buf, streamsize __n);
+ bool _M_allocate_buffers();
+ void _M_deallocate_buffers();
+
+ pos_type _M_seek_return(off_type __off, _State_type __state) {
+ if (__off != -1) {
+ if (_M_in_input_mode)
+ _M_exit_input_mode();
+ _M_in_input_mode = false;
+ _M_in_output_mode = false;
+ _M_in_putback_mode = false;
+ _M_in_error_mode = false;
+ this->setg(0, 0, 0);
+ this->setp(0, 0);
+ }
+
+ pos_type __result(__off);
+ __result.state(__state);
+ return __result;
+ }
+
+ bool _M_seek_init(bool __do_unshift);
+
+ void _M_setup_codecvt(const locale&);
+
+private: // Data members used in all modes.
+
+ _Filebuf_base _M_base;
+
+private: // Locale-related information.
+
+ unsigned char _M_constant_width;
+ unsigned char _M_always_noconv;
+
+ // private: // Mode flags.
+ unsigned char _M_int_buf_dynamic; // True if internal buffer is heap allocated,
+ // false if it was supplied by the user.
+ unsigned char _M_in_input_mode;
+ unsigned char _M_in_output_mode;
+ unsigned char _M_in_error_mode;
+ unsigned char _M_in_putback_mode;
+
+ // Internal buffer: characters seen by the filebuf's clients.
+ _CharT* _M_int_buf;
+ _CharT* _M_int_buf_EOS;
+
+ // External buffer: characters corresponding to the external file.
+ char* _M_ext_buf;
+ char* _M_ext_buf_EOS;
+
+ // The range [_M_ext_buf, _M_ext_buf_converted) contains the external
+ // characters corresponding to the sequence in the internal buffer. The
+ // range [_M_ext_buf_converted, _M_ext_buf_end) contains characters that
+ // have been read into the external buffer but have not been converted
+ // to an internal sequence.
+ char* _M_ext_buf_converted;
+ char* _M_ext_buf_end;
+
+ // State corresponding to beginning of internal buffer.
+ _State_type _M_state;
+
+private: // Data members used only in input mode.
+
+ // Similar to _M_state except that it corresponds to
+ // the end of the internal buffer instead of the beginning.
+ _State_type _M_end_state;
+
+ // This is a null pointer unless we are in mmap input mode.
+ void* _M_mmap_base;
+ streamoff _M_mmap_len;
+
+private: // Data members used only in putback mode.
+ _CharT* _M_saved_eback;
+ _CharT* _M_saved_gptr;
+ _CharT* _M_saved_egptr;
+
+ typedef codecvt<_CharT, char, _State_type> _Codecvt;
+ const _Codecvt* _M_codecvt;
+
+ int _M_width; // Width of the encoding (if constant), else 1
+ int _M_max_width; // Largest possible width of single character.
+
+
+ enum { _S_pback_buf_size = 8 };
+ _CharT _M_pback_buf[_S_pback_buf_size];
+
+ // for _Noconv_output
+public:
+ bool _M_write(char* __buf, ptrdiff_t __n) {return _M_base._M_write(__buf, __n); }
+
+public:
+ int_type
+ _M_do_noconv_input() {
+ _M_ext_buf_converted = _M_ext_buf_end;
+ this->setg((char_type*)_M_ext_buf, (char_type*)_M_ext_buf, (char_type*)_M_ext_buf_end);
+ return traits_type::to_int_type(*_M_ext_buf);
+ }
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_filebuf<char, char_traits<char> >;
+# if ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_filebuf<wchar_t, char_traits<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+// public:
+// helper class.
+template <class _CharT>
+struct _Filebuf_Tmp_Buf
+{
+ _CharT* _M_ptr;
+ _Filebuf_Tmp_Buf(ptrdiff_t __n) : _M_ptr(0) { _M_ptr = new _CharT[__n]; }
+ ~_Filebuf_Tmp_Buf() { delete[] _M_ptr; }
+};
+
+
+//
+// This class had to be designed very carefully to work
+// with Visual C++.
+//
+template <class _Traits>
+class _Noconv_output {
+public:
+ typedef typename _Traits::char_type char_type;
+ static bool _STLP_CALL _M_doit(basic_filebuf<char_type, _Traits >*,
+ char_type*, char_type*)
+ {
+ return false;
+ }
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC _Noconv_output< char_traits<char> > {
+public:
+ static bool _STLP_CALL
+ _M_doit(basic_filebuf<char, char_traits<char> >* __buf,
+ char* __first, char* __last)
+ {
+ ptrdiff_t __n = __last - __first;
+ if (__buf->_M_write(__first, __n)) {
+ return true;
+ }
+ else
+ return false;
+ }
+};
+
+//----------------------------------------------------------------------
+// basic_filebuf<> helper functions.
+
+
+//----------------------------------------
+// Helper functions for switching between modes.
+
+//
+// This class had to be designed very carefully to work
+// with Visual C++.
+//
+template <class _Traits>
+class _Noconv_input {
+public:
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::char_type char_type;
+
+ static inline int_type _STLP_CALL
+ _M_doit(basic_filebuf<char_type, _Traits>*)
+ {
+ return 0;
+ }
+};
+
+_STLP_TEMPLATE_NULL
+class _Noconv_input<char_traits<char> > {
+public:
+ static inline int _STLP_CALL
+ _M_doit(basic_filebuf<char, char_traits<char> >* __buf) {
+ return __buf->_M_do_noconv_input();
+ }
+};
+
+// underflow() may be called for one of two reasons. (1) We've
+// been going through the special putback buffer, and we need to move back
+// to the regular internal buffer. (2) We've exhausted the internal buffer,
+// and we need to replentish it.
+template <class _CharT, class _Traits>
+class _Underflow {
+public:
+ typedef typename _Traits::int_type int_type;
+ typedef _Traits traits_type;
+
+ static int_type _STLP_CALL _M_doit(basic_filebuf<_CharT, _Traits>* __this);
+};
+
+
+// Specialization of underflow: if the character type is char, maybe
+// we can use mmap instead of read.
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC _Underflow< char, char_traits<char> > {
+public:
+ typedef char_traits<char>::int_type int_type;
+ typedef char_traits<char> traits_type;
+ static int _STLP_CALL _M_doit(basic_filebuf<char, traits_type >* __this);
+};
+
+// There is a specialized version of underflow, for basic_filebuf<char>,
+// in fstream.cxx.
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE _Underflow<_CharT, _Traits>::int_type // _STLP_CALL
+ _Underflow<_CharT, _Traits>::_M_doit(basic_filebuf<_CharT, _Traits>* __this)
+{
+ if (!__this->_M_in_input_mode) {
+ if (!__this->_M_switch_to_input_mode())
+ return traits_type::eof();
+ }
+
+ else if (__this->_M_in_putback_mode) {
+ __this->_M_exit_putback_mode();
+ if (__this->gptr() != __this->egptr()) {
+ int_type __c = traits_type::to_int_type(*__this->gptr());
+ return __c;
+ }
+ }
+
+ return __this->_M_underflow_aux();
+}
+
+#if defined( _STLP_USE_TEMPLATE_EXPORT ) && ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS _Underflow<wchar_t, char_traits<wchar_t> >;
+#endif
+
+
+//----------------------------------------------------------------------
+// Class basic_ifstream<>
+
+template <class _CharT, class _Traits>
+class basic_ifstream : public basic_istream<_CharT, _Traits>
+{
+public: // Types
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+
+ typedef basic_ios<_CharT, _Traits> _Basic_ios;
+ typedef basic_istream<_CharT, _Traits> _Base;
+ typedef basic_filebuf<_CharT, _Traits> _Buf;
+
+public: // Constructors, destructor.
+
+ basic_ifstream() :
+ basic_ios<_CharT, _Traits>(), basic_istream<_CharT, _Traits>(0), _M_buf() {
+ this->init(&_M_buf);
+ }
+
+ explicit basic_ifstream(const char* __s, ios_base::openmode __mod = ios_base::in) :
+ basic_ios<_CharT, _Traits>(), basic_istream<_CharT, _Traits>(0),
+ _M_buf() {
+ this->init(&_M_buf);
+ if (!_M_buf.open(__s, __mod | ios_base::in))
+ this->setstate(ios_base::failbit);
+ }
+
+# ifndef _STLP_NO_EXTENSIONS
+ explicit basic_ifstream(int __id, ios_base::openmode __mod = ios_base::in) :
+ basic_ios<_CharT, _Traits>(), basic_istream<_CharT, _Traits>(0), _M_buf() {
+ this->init(&_M_buf);
+ if (!_M_buf.open(__id, __mod | ios_base::in))
+ this->setstate(ios_base::failbit);
+ }
+ basic_ifstream(const char* __s, ios_base::openmode __m,
+ long __protection) :
+ basic_ios<_CharT, _Traits>(), basic_istream<_CharT, _Traits>(0), _M_buf() {
+ this->init(&_M_buf);
+ if (!_M_buf.open(__s, __m | ios_base::in, __protection))
+ this->setstate(ios_base::failbit);
+ }
+
+# endif
+
+ ~basic_ifstream() {}
+
+public: // File and buffer operations.
+ basic_filebuf<_CharT, _Traits>* rdbuf() const
+ { return __CONST_CAST(_Buf*,&_M_buf); }
+
+ bool is_open() {
+ return this->rdbuf()->is_open();
+ }
+
+ void open(const char* __s, ios_base::openmode __mod = ios_base::in) {
+ if (!this->rdbuf()->open(__s, __mod | ios_base::in))
+ this->setstate(ios_base::failbit);
+ }
+
+ void close() {
+ if (!this->rdbuf()->close())
+ this->setstate(ios_base::failbit);
+ }
+
+
+private:
+ basic_filebuf<_CharT, _Traits> _M_buf;
+};
+
+
+//----------------------------------------------------------------------
+// Class basic_ofstream<>
+
+template <class _CharT, class _Traits>
+class basic_ofstream : public basic_ostream<_CharT, _Traits>
+{
+public: // Types
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+
+ typedef basic_ios<_CharT, _Traits> _Basic_ios;
+ typedef basic_ostream<_CharT, _Traits> _Base;
+ typedef basic_filebuf<_CharT, _Traits> _Buf;
+
+public: // Constructors, destructor.
+ basic_ofstream() :
+ basic_ios<_CharT, _Traits>(),
+ basic_ostream<_CharT, _Traits>(0), _M_buf() {
+ this->init(&_M_buf);
+ }
+ explicit basic_ofstream(const char* __s, ios_base::openmode __mod = ios_base::out)
+ : basic_ios<_CharT, _Traits>(), basic_ostream<_CharT, _Traits>(0),
+ _M_buf() {
+ this->init(&_M_buf);
+ if (!_M_buf.open(__s, __mod | ios_base::out))
+ this->setstate(ios_base::failbit);
+ }
+
+# ifndef _STLP_NO_EXTENSIONS
+ explicit basic_ofstream(int __id, ios_base::openmode __mod = ios_base::out)
+ : basic_ios<_CharT, _Traits>(), basic_ostream<_CharT, _Traits>(0),
+ _M_buf() {
+ this->init(&_M_buf);
+ if (!_M_buf.open(__id, __mod | ios_base::out))
+ this->setstate(ios_base::failbit);
+ }
+ basic_ofstream(const char* __s, ios_base::openmode __m, long __protection) :
+ basic_ios<_CharT, _Traits>(), basic_ostream<_CharT, _Traits>(0), _M_buf() {
+ this->init(&_M_buf);
+ if (!_M_buf.open(__s, __m | ios_base::out, __protection))
+ this->setstate(ios_base::failbit);
+ }
+# endif
+
+ ~basic_ofstream() {}
+
+public: // File and buffer operations.
+ basic_filebuf<_CharT, _Traits>* rdbuf() const
+ { return __CONST_CAST(_Buf*,&_M_buf); }
+
+ bool is_open() {
+ return this->rdbuf()->is_open();
+ }
+
+ void open(const char* __s, ios_base::openmode __mod= ios_base::out) {
+ if (!this->rdbuf()->open(__s, __mod | ios_base::out))
+ this->setstate(ios_base::failbit);
+ }
+
+ void close() {
+ if (!this->rdbuf()->close())
+ this->setstate(ios_base::failbit);
+ }
+
+private:
+ basic_filebuf<_CharT, _Traits> _M_buf;
+};
+
+
+//----------------------------------------------------------------------
+// Class basic_fstream<>
+
+template <class _CharT, class _Traits>
+class basic_fstream : public basic_iostream<_CharT, _Traits>
+{
+public: // Types
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+
+ typedef basic_ios<_CharT, _Traits> _Basic_ios;
+ typedef basic_iostream<_CharT, _Traits> _Base;
+ typedef basic_filebuf<_CharT, _Traits> _Buf;
+
+public: // Constructors, destructor.
+
+ basic_fstream()
+ : basic_ios<_CharT, _Traits>(), basic_iostream<_CharT, _Traits>(0), _M_buf() {
+ this->init(&_M_buf);
+ }
+
+ explicit basic_fstream(const char* __s,
+ ios_base::openmode __mod = ios_base::in | ios_base::out) :
+ basic_ios<_CharT, _Traits>(), basic_iostream<_CharT, _Traits>(0), _M_buf() {
+ this->init(&_M_buf);
+ if (!_M_buf.open(__s, __mod))
+ this->setstate(ios_base::failbit);
+ }
+
+# ifndef _STLP_NO_EXTENSIONS
+ explicit basic_fstream(int __id,
+ ios_base::openmode __mod = ios_base::in | ios_base::out) :
+ basic_ios<_CharT, _Traits>(), basic_iostream<_CharT, _Traits>(0), _M_buf() {
+ this->init(&_M_buf);
+ if (!_M_buf.open(__id, __mod))
+ this->setstate(ios_base::failbit);
+ }
+ basic_fstream(const char* __s, ios_base::openmode __m, long __protection) :
+ basic_ios<_CharT, _Traits>(), basic_iostream<_CharT, _Traits>(0), _M_buf() {
+ this->init(&_M_buf);
+ if (!_M_buf.open(__s, __m, __protection))
+ this->setstate(ios_base::failbit);
+ }
+# endif
+ ~basic_fstream() {}
+
+public: // File and buffer operations.
+
+ basic_filebuf<_CharT, _Traits>* rdbuf() const
+ { return __CONST_CAST(_Buf*,&_M_buf); }
+
+ bool is_open() {
+ return this->rdbuf()->is_open();
+ }
+
+ void open(const char* __s,
+ ios_base::openmode __mod =
+ ios_base::in | ios_base::out) {
+ if (!this->rdbuf()->open(__s, __mod))
+ this->setstate(ios_base::failbit);
+ }
+
+ void close() {
+ if (!this->rdbuf()->close())
+ this->setstate(ios_base::failbit);
+ }
+
+private:
+ basic_filebuf<_CharT, _Traits> _M_buf;
+};
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_fstream.c>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_ifstream<char, char_traits<char> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_ofstream<char, char_traits<char> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_fstream<char, char_traits<char> >;
+# if ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_ifstream<wchar_t, char_traits<wchar_t> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_ofstream<wchar_t, char_traits<wchar_t> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_fstream<wchar_t, char_traits<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_FSTREAM */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_function.h b/src/STLport/stl/_function.h
new file mode 100644
index 0000000..b97e2f2
--- /dev/null
+++ b/src/STLport/stl/_function.h
@@ -0,0 +1,371 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_FUNCTION_H
+#define _STLP_INTERNAL_FUNCTION_H
+
+#ifndef _STLP_INTERNAL_FUNCTION_BASE_H
+#include <stl/_function_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# ifndef _STLP_NO_EXTENSIONS
+// identity_element (not part of the C++ standard).
+template <class _Tp> inline _Tp identity_element(plus<_Tp>) { return _Tp(0); }
+template <class _Tp> inline _Tp identity_element(multiplies<_Tp>) { return _Tp(1); }
+# endif
+
+# if defined (_STLP_BASE_TYPEDEF_BUG)
+// this workaround is needed for SunPro 4.0.1
+// suggested by "Martin Abernethy" <gma at paston.co.uk>:
+
+// We have to introduce the XXary_predicate_aux structures in order to
+// access the argument and return types of predicate functions supplied
+// as type parameters. SUN C++ 4.0.1 compiler gives errors for template type parameters
+// of the form 'name1::name2', where name1 is itself a type parameter.
+template <class _Pair>
+struct __pair_aux : private _Pair
+{
+ typedef typename _Pair::first_type first_type;
+ typedef typename _Pair::second_type second_type;
+};
+
+template <class _Operation>
+struct __unary_fun_aux : private _Operation
+{
+ typedef typename _Operation::argument_type argument_type;
+ typedef typename _Operation::result_type result_type;
+};
+
+template <class _Operation>
+struct __binary_fun_aux : private _Operation
+{
+ typedef typename _Operation::first_argument_type first_argument_type;
+ typedef typename _Operation::second_argument_type second_argument_type;
+ typedef typename _Operation::result_type result_type;
+};
+
+# define __UNARY_ARG(__Operation,__type) __unary_fun_aux<__Operation>::__type
+# define __BINARY_ARG(__Operation,__type) __binary_fun_aux<__Operation>::__type
+# define __PAIR_ARG(__Pair,__type) __pair_aux<__Pair>::__type
+# else
+# define __UNARY_ARG(__Operation,__type) __Operation::__type
+# define __BINARY_ARG(__Operation,__type) __Operation::__type
+# define __PAIR_ARG(__Pair,__type) __Pair::__type
+# endif
+
+template <class _Predicate>
+class unary_negate :
+ public unary_function<typename __UNARY_ARG(_Predicate,argument_type), bool> {
+protected:
+ _Predicate _M_pred;
+public:
+ explicit unary_negate(const _Predicate& __x) : _M_pred(__x) {}
+ bool operator()(const typename _Predicate::argument_type& __x) const {
+ return !_M_pred(__x);
+ }
+};
+
+template <class _Predicate>
+inline unary_negate<_Predicate>
+not1(const _Predicate& __pred)
+{
+ return unary_negate<_Predicate>(__pred);
+}
+
+template <class _Predicate>
+class binary_negate
+ : public binary_function<typename __BINARY_ARG(_Predicate,first_argument_type),
+ typename __BINARY_ARG(_Predicate,second_argument_type),
+ bool> {
+protected:
+ _Predicate _M_pred;
+public:
+ explicit binary_negate(const _Predicate& __x) : _M_pred(__x) {}
+ bool operator()(const typename _Predicate::first_argument_type& __x,
+ const typename _Predicate::second_argument_type& __y) const
+ {
+ return !_M_pred(__x, __y);
+ }
+};
+
+template <class _Predicate>
+inline binary_negate<_Predicate>
+not2(const _Predicate& __pred)
+{
+ return binary_negate<_Predicate>(__pred);
+}
+
+template <class _Operation>
+class binder1st :
+ public unary_function<typename __BINARY_ARG(_Operation,second_argument_type),
+ typename __BINARY_ARG(_Operation,result_type) > {
+protected:
+ _Operation _M_op;
+ typename _Operation::first_argument_type _M_value;
+public:
+ binder1st(const _Operation& __x,
+ const typename _Operation::first_argument_type& __y)
+ : _M_op(__x), _M_value(__y) {}
+
+ typename _Operation::result_type
+ operator()(const typename _Operation::second_argument_type& __x) const {
+ return _M_op(_M_value, __x);
+ }
+
+ typename _Operation::result_type
+ operator()(typename _Operation::second_argument_type& __x) const {
+ return _M_op(_M_value, __x);
+ }
+};
+
+template <class _Operation, class _Tp>
+inline binder1st<_Operation>
+bind1st(const _Operation& __fn, const _Tp& __x)
+{
+ typedef typename _Operation::first_argument_type _Arg1_type;
+ return binder1st<_Operation>(__fn, _Arg1_type(__x));
+}
+
+template <class _Operation>
+class binder2nd
+ : public unary_function<typename __BINARY_ARG(_Operation,first_argument_type),
+ typename __BINARY_ARG(_Operation,result_type)> {
+protected:
+ _Operation _M_op;
+ typename _Operation::second_argument_type value;
+public:
+ binder2nd(const _Operation& __x,
+ const typename _Operation::second_argument_type& __y)
+ : _M_op(__x), value(__y) {}
+
+ typename _Operation::result_type
+ operator()(const typename _Operation::first_argument_type& __x) const {
+ return _M_op(__x, value);
+ }
+
+ typename _Operation::result_type
+ operator()(typename _Operation::first_argument_type& __x) const {
+ return _M_op(__x, value);
+ }
+};
+
+template <class _Operation, class _Tp>
+inline binder2nd<_Operation>
+bind2nd(const _Operation& __fn, const _Tp& __x)
+{
+ typedef typename _Operation::second_argument_type _Arg2_type;
+ return binder2nd<_Operation>(__fn, _Arg2_type(__x));
+}
+
+# ifndef _STLP_NO_EXTENSIONS
+// unary_compose and binary_compose (extensions, not part of the standard).
+
+template <class _Operation1, class _Operation2>
+class unary_compose :
+ public unary_function<typename __UNARY_ARG(_Operation2,argument_type),
+ typename __UNARY_ARG(_Operation1,result_type)> {
+protected:
+ _Operation1 _M_fn1;
+ _Operation2 _M_fn2;
+public:
+ unary_compose(const _Operation1& __x, const _Operation2& __y)
+ : _M_fn1(__x), _M_fn2(__y) {}
+
+ typename _Operation1::result_type
+ operator()(const typename _Operation2::argument_type& __x) const {
+ return _M_fn1(_M_fn2(__x));
+ }
+
+ typename _Operation1::result_type
+ operator()(typename _Operation2::argument_type& __x) const {
+ return _M_fn1(_M_fn2(__x));
+ }
+};
+
+template <class _Operation1, class _Operation2>
+inline unary_compose<_Operation1,_Operation2>
+compose1(const _Operation1& __fn1, const _Operation2& __fn2)
+{
+ return unary_compose<_Operation1,_Operation2>(__fn1, __fn2);
+}
+
+template <class _Operation1, class _Operation2, class _Operation3>
+class binary_compose :
+ public unary_function<typename __UNARY_ARG(_Operation2,argument_type),
+ typename __BINARY_ARG(_Operation1,result_type)> {
+protected:
+ _Operation1 _M_fn1;
+ _Operation2 _M_fn2;
+ _Operation3 _M_fn3;
+public:
+ binary_compose(const _Operation1& __x, const _Operation2& __y,
+ const _Operation3& __z)
+ : _M_fn1(__x), _M_fn2(__y), _M_fn3(__z) { }
+
+ typename _Operation1::result_type
+ operator()(const typename _Operation2::argument_type& __x) const {
+ return _M_fn1(_M_fn2(__x), _M_fn3(__x));
+ }
+
+ typename _Operation1::result_type
+ operator()(typename _Operation2::argument_type& __x) const {
+ return _M_fn1(_M_fn2(__x), _M_fn3(__x));
+ }
+};
+
+template <class _Operation1, class _Operation2, class _Operation3>
+inline binary_compose<_Operation1, _Operation2, _Operation3>
+compose2(const _Operation1& __fn1, const _Operation2& __fn2,
+ const _Operation3& __fn3)
+{
+ return binary_compose<_Operation1,_Operation2,_Operation3>
+ (__fn1, __fn2, __fn3);
+}
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+# ifndef _STLP_NO_EXTENSIONS
+
+// identity is an extension: it is not part of the standard.
+template <class _Tp> struct identity : public _Identity<_Tp> {};
+// select1st and select2nd are extensions: they are not part of the standard.
+template <class _Pair> struct select1st : public _Select1st<_Pair> {};
+template <class _Pair> struct select2nd : public _Select2nd<_Pair> {};
+
+template <class _Arg1, class _Arg2>
+struct project1st : public _Project1st<_Arg1, _Arg2> {};
+
+template <class _Arg1, class _Arg2>
+struct project2nd : public _Project2nd<_Arg1, _Arg2> {};
+
+
+// constant_void_fun, constant_unary_fun, and constant_binary_fun are
+// extensions: they are not part of the standard. (The same, of course,
+// is true of the helper functions constant0, constant1, and constant2.)
+
+template <class _Result>
+struct _Constant_void_fun {
+ typedef _Result result_type;
+ result_type _M_val;
+
+ _Constant_void_fun(const result_type& __v) : _M_val(__v) {}
+ const result_type& operator()() const { return _M_val; }
+};
+
+
+template <class _Result>
+struct constant_void_fun : public _Constant_void_fun<_Result> {
+ constant_void_fun(const _Result& __v) : _Constant_void_fun<_Result>(__v) {}
+};
+
+template <class _Result, __DFL_TMPL_PARAM( _Argument , _Result) >
+struct constant_unary_fun : public _Constant_unary_fun<_Result, _Argument>
+{
+ constant_unary_fun(const _Result& __v)
+ : _Constant_unary_fun<_Result, _Argument>(__v) {}
+};
+
+template <class _Result, __DFL_TMPL_PARAM( _Arg1 , _Result), __DFL_TMPL_PARAM( _Arg2 , _Arg1) >
+struct constant_binary_fun
+ : public _Constant_binary_fun<_Result, _Arg1, _Arg2>
+{
+ constant_binary_fun(const _Result& __v)
+ : _Constant_binary_fun<_Result, _Arg1, _Arg2>(__v) {}
+};
+
+template <class _Result>
+inline constant_void_fun<_Result> constant0(const _Result& __val)
+{
+ return constant_void_fun<_Result>(__val);
+}
+
+template <class _Result>
+inline constant_unary_fun<_Result,_Result> constant1(const _Result& __val)
+{
+ return constant_unary_fun<_Result,_Result>(__val);
+}
+
+template <class _Result>
+inline constant_binary_fun<_Result,_Result,_Result>
+constant2(const _Result& __val)
+{
+ return constant_binary_fun<_Result,_Result,_Result>(__val);
+}
+
+// subtractive_rng is an extension: it is not part of the standard.
+// Note: this code assumes that int is 32 bits.
+class subtractive_rng : public unary_function<_STLP_UINT32_T, _STLP_UINT32_T> {
+private:
+ _STLP_UINT32_T _M_table[55];
+ _STLP_UINT32_T _M_index1;
+ _STLP_UINT32_T _M_index2;
+public:
+ _STLP_UINT32_T operator()(_STLP_UINT32_T __limit) {
+ _M_index1 = (_M_index1 + 1) % 55;
+ _M_index2 = (_M_index2 + 1) % 55;
+ _M_table[_M_index1] = _M_table[_M_index1] - _M_table[_M_index2];
+ return _M_table[_M_index1] % __limit;
+ }
+
+ void _M_initialize(_STLP_UINT32_T __seed)
+ {
+ _STLP_UINT32_T __k = 1;
+ _M_table[54] = __seed;
+ _STLP_UINT32_T __i;
+ for (__i = 0; __i < 54; __i++) {
+ _STLP_UINT32_T __ii = (21 * (__i + 1) % 55) - 1;
+ _M_table[__ii] = __k;
+ __k = __seed - __k;
+ __seed = _M_table[__ii];
+ }
+ for (int __loop = 0; __loop < 4; __loop++) {
+ for (__i = 0; __i < 55; __i++)
+ _M_table[__i] = _M_table[__i] - _M_table[(1 + __i + 30) % 55];
+ }
+ _M_index1 = 0;
+ _M_index2 = 31;
+ }
+
+ subtractive_rng(unsigned int __seed) { _M_initialize(__seed); }
+ subtractive_rng() { _M_initialize(161803398ul); }
+};
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+_STLP_END_NAMESPACE
+
+#include <stl/_function_adaptors.h>
+
+#endif /* _STLP_INTERNAL_FUNCTION_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_function_adaptors.h b/src/STLport/stl/_function_adaptors.h
new file mode 100644
index 0000000..4ea584b
--- /dev/null
+++ b/src/STLport/stl/_function_adaptors.h
@@ -0,0 +1,802 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * Copyright (c) 2000
+ * Pavel Kuznetsov
+ *
+ * Copyright (c) 2001
+ * Meridian'93
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+// This file has noo macro protection as it is meant to be included several times
+// from other header.
+// Adaptor function objects: pointers to member functions.
+
+// There are a total of 16 = 2^4 function objects in this family.
+// (1) Member functions taking no arguments vs member functions taking
+// one argument.
+// (2) Call through pointer vs call through reference.
+// (3) Member function with void return type vs member function with
+// non-void return type.
+// (4) Const vs non-const member function.
+
+// Note that choice (3) is nothing more than a workaround: according
+// to the draft, compilers should handle void and non-void the same way.
+// This feature is not yet widely implemented, though. You can only use
+// member functions returning void if your compiler supports partial
+// specialization.
+
+// All of this complexity is in the function objects themselves. You can
+// ignore it by using the helper function mem_fun and mem_fun_ref,
+// which create whichever type of adaptor is appropriate.
+
+_STLP_BEGIN_NAMESPACE
+
+//This implementation will only be used if needed, that is to say when there is the return void bug
+//and when there is no partial template specialization
+#if defined(_STLP_DONT_RETURN_VOID) && defined (_STLP_NO_CLASS_PARTIAL_SPECIALIZATION) && defined(_STLP_MEMBER_TEMPLATE_CLASSES)
+
+template<class _Result, class _Tp>
+class _Mem_fun0_ptr : public unary_function<_Tp*, _Result> {
+protected:
+ typedef _Result (_Tp::*__fun_type) ();
+ explicit _Mem_fun0_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+ _Result operator ()(_Tp* __p) const { return (__p->*_M_f)(); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Result, class _Tp, class _Arg>
+class _Mem_fun1_ptr : public binary_function<_Tp*,_Arg,_Result> {
+protected:
+ typedef _Result (_Tp::*__fun_type) (_Arg);
+ explicit _Mem_fun1_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+ _Result operator ()(_Tp* __p, _Arg __x) const { return (__p->*_M_f)(__x); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Result, class _Tp>
+class _Const_mem_fun0_ptr : public unary_function<const _Tp*,_Result> {
+protected:
+ typedef _Result (_Tp::*__fun_type) () const;
+ explicit _Const_mem_fun0_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+ _Result operator ()(const _Tp* __p) const { return (__p->*_M_f)(); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Result, class _Tp, class _Arg>
+class _Const_mem_fun1_ptr : public binary_function<const _Tp*,_Arg,_Result> {
+protected:
+ typedef _Result (_Tp::*__fun_type) (_Arg) const;
+ explicit _Const_mem_fun1_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+ _Result operator ()(const _Tp* __p, _Arg __x) const {
+ return (__p->*_M_f)(__x); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Result, class _Tp>
+class _Mem_fun0_ref : public unary_function<_Tp&,_Result> {
+protected:
+ typedef _Result (_Tp::*__fun_type) ();
+ explicit _Mem_fun0_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+ _Result operator ()(_Tp& __p) const { return (__p.*_M_f)(); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Result, class _Tp, class _Arg>
+class _Mem_fun1_ref : public binary_function<_Tp&,_Arg,_Result> {
+protected:
+ typedef _Result (_Tp::*__fun_type) (_Arg);
+ explicit _Mem_fun1_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+ _Result operator ()(_Tp& __p, _Arg __x) const { return (__p.*_M_f)(__x); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Result, class _Tp>
+class _Const_mem_fun0_ref : public unary_function<const _Tp&,_Result> {
+protected:
+ typedef _Result (_Tp::*__fun_type) () const;
+ explicit _Const_mem_fun0_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+ _Result operator ()(const _Tp& __p) const { return (__p.*_M_f)(); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Result, class _Tp, class _Arg>
+class _Const_mem_fun1_ref : public binary_function<const _Tp&,_Arg,_Result> {
+protected:
+ typedef _Result (_Tp::*__fun_type) (_Arg) const;
+ explicit _Const_mem_fun1_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+ _Result operator ()(const _Tp& __p, _Arg __x) const { return (__p.*_M_f)(__x); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Result>
+struct _Mem_fun_traits {
+ template<class _Tp>
+ struct _Args0 {
+ typedef _Mem_fun0_ptr<_Result,_Tp> _Ptr;
+ typedef _Const_mem_fun0_ptr<_Result,_Tp> _Ptr_const;
+ typedef _Mem_fun0_ref<_Result,_Tp> _Ref;
+ typedef _Const_mem_fun0_ref<_Result,_Tp> _Ref_const;
+ };
+
+ template<class _Tp, class _Arg>
+ struct _Args1 {
+ typedef _Mem_fun1_ptr<_Result,_Tp,_Arg> _Ptr;
+ typedef _Const_mem_fun1_ptr<_Result,_Tp,_Arg> _Ptr_const;
+ typedef _Mem_fun1_ref<_Result,_Tp,_Arg> _Ref;
+ typedef _Const_mem_fun1_ref<_Result,_Tp,_Arg> _Ref_const;
+ };
+};
+
+template<class _Arg, class _Result>
+class _Ptr_fun1_base : public unary_function<_Arg, _Result> {
+protected:
+ typedef _Result (*__fun_type) (_Arg);
+ explicit _Ptr_fun1_base(__fun_type __f) : _M_f(__f) {}
+
+public:
+ _Result operator()(_Arg __x) const { return _M_f(__x); }
+
+private:
+ __fun_type _M_f;
+};
+
+template <class _Arg1, class _Arg2, class _Result>
+class _Ptr_fun2_base : public binary_function<_Arg1,_Arg2,_Result> {
+protected:
+ typedef _Result (*__fun_type) (_Arg1, _Arg2);
+ explicit _Ptr_fun2_base(__fun_type __f) : _M_f(__f) {}
+
+public:
+ _Result operator()(_Arg1 __x, _Arg2 __y) const { return _M_f(__x, __y); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Result>
+struct _Ptr_fun_traits {
+ template<class _Arg> struct _Args1 {
+ typedef _Ptr_fun1_base<_Arg,_Result> _Fun;
+ };
+
+ template<class _Arg1, class _Arg2> struct _Args2 {
+ typedef _Ptr_fun2_base<_Arg1,_Arg2,_Result> _Fun;
+ };
+};
+
+/*Specialization for void return type
+*/
+template<class _Tp>
+class _Void_mem_fun0_ptr : public unary_function<_Tp*,void> {
+protected:
+ typedef void (_Tp::*__fun_type) ();
+ explicit _Void_mem_fun0_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+ void operator ()(_Tp* __p) const { (__p->*_M_f)(); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Tp, class _Arg>
+class _Void_mem_fun1_ptr : public binary_function<_Tp*,_Arg,void> {
+protected:
+ typedef void (_Tp::*__fun_type) (_Arg);
+ explicit _Void_mem_fun1_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+ void operator ()(_Tp* __p, _Arg __x) const { (__p->*_M_f)(__x); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Tp>
+class _Void_const_mem_fun0_ptr : public unary_function<const _Tp*,void> {
+protected:
+ typedef void (_Tp::*__fun_type) () const;
+ explicit _Void_const_mem_fun0_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+ void operator ()(const _Tp* __p) const { (__p->*_M_f)(); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Tp, class _Arg>
+class _Void_const_mem_fun1_ptr : public binary_function<const _Tp*,_Arg,void> {
+protected:
+ typedef void (_Tp::*__fun_type) (_Arg) const;
+ explicit _Void_const_mem_fun1_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+ void operator ()(const _Tp* __p, _Arg __x) const { (__p->*_M_f)(__x); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Tp>
+class _Void_mem_fun0_ref : public unary_function<_Tp&,void> {
+protected:
+ typedef void (_Tp::*__fun_type) ();
+ explicit _Void_mem_fun0_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+ void operator ()(_Tp& __p) const { (__p.*_M_f)(); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Tp, class _Arg>
+class _Void_mem_fun1_ref : public binary_function<_Tp&,_Arg,void> {
+protected:
+ typedef void (_Tp::*__fun_type) (_Arg);
+ explicit _Void_mem_fun1_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+ void operator ()(_Tp& __p, _Arg __x) const { (__p.*_M_f)(__x); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Tp>
+class _Void_const_mem_fun0_ref : public unary_function<const _Tp&,void> {
+protected:
+ typedef void (_Tp::*__fun_type) () const;
+ explicit _Void_const_mem_fun0_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+ void operator ()(const _Tp& __p) const { (__p.*_M_f)(); }
+
+private:
+ __fun_type _M_f;
+};
+
+template<class _Tp, class _Arg>
+class _Void_const_mem_fun1_ref : public binary_function<const _Tp&,_Arg,void> {
+protected:
+ typedef void (_Tp::*__fun_type) (_Arg) const;
+ explicit _Void_const_mem_fun1_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+ void operator ()(const _Tp& __p, _Arg __x) const { (__p.*_M_f)(__x); }
+
+private:
+ __fun_type _M_f;
+};
+
+_STLP_TEMPLATE_NULL
+struct _Mem_fun_traits<void> {
+ template<class _Tp> struct _Args0 {
+ typedef _Void_mem_fun0_ptr<_Tp> _Ptr;
+ typedef _Void_const_mem_fun0_ptr<_Tp> _Ptr_const;
+ typedef _Void_mem_fun0_ref<_Tp> _Ref;
+ typedef _Void_const_mem_fun0_ref<_Tp> _Ref_const;
+ };
+
+ template<class _Tp, class _Arg> struct _Args1 {
+ typedef _Void_mem_fun1_ptr<_Tp,_Arg> _Ptr;
+ typedef _Void_const_mem_fun1_ptr<_Tp,_Arg> _Ptr_const;
+ typedef _Void_mem_fun1_ref<_Tp,_Arg> _Ref;
+ typedef _Void_const_mem_fun1_ref<_Tp,_Arg> _Ref_const;
+ };
+};
+
+template<class _Arg>
+class _Ptr_void_fun1_base : public unary_function<_Arg, void> {
+protected:
+ typedef void (*__fun_type) (_Arg);
+ explicit _Ptr_void_fun1_base(__fun_type __f) : _M_f(__f) {}
+
+public:
+ void operator()(_Arg __x) const { _M_f(__x); }
+
+private:
+ __fun_type _M_f;
+};
+
+template <class _Arg1, class _Arg2>
+class _Ptr_void_fun2_base : public binary_function<_Arg1,_Arg2,void> {
+protected:
+ typedef void (*__fun_type) (_Arg1, _Arg2);
+ explicit _Ptr_void_fun2_base(__fun_type __f) : _M_f(__f) {}
+
+public:
+ void operator()(_Arg1 __x, _Arg2 __y) const { _M_f(__x, __y); }
+
+private:
+ __fun_type _M_f;
+};
+
+_STLP_TEMPLATE_NULL
+struct _Ptr_fun_traits<void> {
+ template<class _Arg> struct _Args1 {
+ typedef _Ptr_void_fun1_base<_Arg> _Fun;
+ };
+
+ template<class _Arg1, class _Arg2> struct _Args2 {
+ typedef _Ptr_void_fun2_base<_Arg1,_Arg2> _Fun;
+ };
+};
+
+// pavel: need extra level of inheritance here since MSVC++ does not
+// accept traits-based fake partial specialization for template
+// arguments other than first
+
+template<class _Result, class _Arg>
+class _Ptr_fun1 :
+ public _Ptr_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Arg>::_Fun {
+protected:
+ typedef typename _Ptr_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Arg>::_Fun _Base;
+ explicit _Ptr_fun1(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+template<class _Result, class _Arg1, class _Arg2>
+class _Ptr_fun2 :
+ public _Ptr_fun_traits<_Result>::_STLP_TEMPLATE _Args2<_Arg1,_Arg2>::_Fun {
+protected:
+ typedef typename _Ptr_fun_traits<_Result>::_STLP_TEMPLATE _Args2<_Arg1,_Arg2>::_Fun _Base;
+ explicit _Ptr_fun2(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+
+#endif /*_STLP_DONT_RETURN_VOID && _STLP_NO_CLASS_PARTIAL_SPECIALIZATION && _STLP_MEMBER_TEMPLATE_CLASSES*/
+
+
+#if !defined(_STLP_DONT_RETURN_VOID) || !defined(_STLP_NO_CLASS_PARTIAL_SPECIALIZATION) || !defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+
+template <class _Ret, class _Tp>
+class mem_fun_t : public unary_function<_Tp*,_Ret> {
+ typedef _Ret (_Tp::*__fun_type)(void);
+public:
+ explicit mem_fun_t(__fun_type __pf) : _M_f(__pf) {}
+ _Ret operator()(_Tp* __p) const { return (__p->*_M_f)(); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Ret, class _Tp>
+class const_mem_fun_t : public unary_function<const _Tp*,_Ret> {
+ typedef _Ret (_Tp::*__fun_type)(void) const;
+public:
+ explicit const_mem_fun_t(__fun_type __pf) : _M_f(__pf) {}
+ _Ret operator()(const _Tp* __p) const { return (__p->*_M_f)(); }
+private:
+ __fun_type _M_f;
+};
+
+
+template <class _Ret, class _Tp>
+class mem_fun_ref_t : public unary_function<_Tp,_Ret> {
+ typedef _Ret (_Tp::*__fun_type)(void);
+public:
+ explicit mem_fun_ref_t(__fun_type __pf) : _M_f(__pf) {}
+ _Ret operator()(_Tp& __r) const { return (__r.*_M_f)(); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Ret, class _Tp>
+class const_mem_fun_ref_t : public unary_function<_Tp,_Ret> {
+ typedef _Ret (_Tp::*__fun_type)(void) const;
+public:
+ explicit const_mem_fun_ref_t(__fun_type __pf) : _M_f(__pf) {}
+ _Ret operator()(const _Tp& __r) const { return (__r.*_M_f)(); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Ret, class _Tp, class _Arg>
+class mem_fun1_t : public binary_function<_Tp*,_Arg,_Ret> {
+ typedef _Ret (_Tp::*__fun_type)(_Arg);
+public:
+ explicit mem_fun1_t(__fun_type __pf) : _M_f(__pf) {}
+ _Ret operator()(_Tp* __p, _Arg __x) const { return (__p->*_M_f)(__x); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Ret, class _Tp, class _Arg>
+class const_mem_fun1_t : public binary_function<const _Tp*,_Arg,_Ret> {
+ typedef _Ret (_Tp::*__fun_type)(_Arg) const;
+public:
+ explicit const_mem_fun1_t(__fun_type __pf) : _M_f(__pf) {}
+ _Ret operator()(const _Tp* __p, _Arg __x) const
+ { return (__p->*_M_f)(__x); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Ret, class _Tp, class _Arg>
+class mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret> {
+ typedef _Ret (_Tp::*__fun_type)(_Arg);
+public:
+ explicit mem_fun1_ref_t(__fun_type __pf) : _M_f(__pf) {}
+ _Ret operator()(_Tp& __r, _Arg __x) const { return (__r.*_M_f)(__x); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Ret, class _Tp, class _Arg>
+class const_mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret> {
+ typedef _Ret (_Tp::*__fun_type)(_Arg) const;
+public:
+ explicit const_mem_fun1_ref_t(__fun_type __pf) : _M_f(__pf) {}
+ _Ret operator()(const _Tp& __r, _Arg __x) const { return (__r.*_M_f)(__x); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Arg, class _Result>
+class pointer_to_unary_function : public unary_function<_Arg, _Result> {
+protected:
+ _Result (*_M_ptr)(_Arg);
+public:
+ pointer_to_unary_function() {}
+ explicit pointer_to_unary_function(_Result (*__x)(_Arg)) : _M_ptr(__x) {}
+ _Result operator()(_Arg __x) const { return _M_ptr(__x); }
+};
+
+template <class _Arg1, class _Arg2, class _Result>
+class pointer_to_binary_function :
+ public binary_function<_Arg1,_Arg2,_Result> {
+protected:
+ _Result (*_M_ptr)(_Arg1, _Arg2);
+public:
+ pointer_to_binary_function() {}
+ explicit pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
+ : _M_ptr(__x) {}
+ _Result operator()(_Arg1 __x, _Arg2 __y) const {
+ return _M_ptr(__x, __y);
+ }
+};
+
+
+#if defined(_STLP_DONT_RETURN_VOID) && !defined(_STLP_NO_CLASS_PARTIAL_SPECIALIZATION)
+//Partial specialization for the void type
+template <class _Tp>
+class mem_fun_t<void, _Tp> : public unary_function<_Tp*,void> {
+ typedef void (_Tp::*__fun_type)(void);
+public:
+ explicit mem_fun_t _STLP_PSPEC2(void,_Tp) (__fun_type __pf) : _M_f(__pf) {}
+ void operator()(_Tp* __p) const { (__p->*_M_f)(); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Tp>
+class const_mem_fun_t<void, _Tp> : public unary_function<const _Tp*,void> {
+ typedef void (_Tp::*__fun_type)(void) const;
+public:
+ explicit const_mem_fun_t _STLP_PSPEC2(void,_Tp) (__fun_type __pf) : _M_f(__pf) {}
+ void operator()(const _Tp* __p) const { (__p->*_M_f)(); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Tp>
+class mem_fun_ref_t<void, _Tp> : public unary_function<_Tp,void> {
+ typedef void (_Tp::*__fun_type)(void);
+public:
+ explicit mem_fun_ref_t _STLP_PSPEC2(void,_Tp) (__fun_type __pf) : _M_f(__pf) {}
+ void operator()(_Tp& __r) const { (__r.*_M_f)(); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Tp>
+class const_mem_fun_ref_t<void, _Tp> : public unary_function<_Tp,void> {
+ typedef void (_Tp::*__fun_type)(void) const;
+public:
+ explicit const_mem_fun_ref_t _STLP_PSPEC2(void,_Tp) (__fun_type __pf) : _M_f(__pf) {}
+ void operator()(const _Tp& __r) const { (__r.*_M_f)(); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Tp, class _Arg>
+class mem_fun1_t<void, _Tp, _Arg> : public binary_function<_Tp*,_Arg,void> {
+ typedef void (_Tp::*__fun_type)(_Arg);
+public:
+ explicit mem_fun1_t _STLP_PSPEC3(void,_Tp,_Arg) (__fun_type __pf) : _M_f(__pf) {}
+ void operator()(_Tp* __p, _Arg __x) const { (__p->*_M_f)(__x); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Tp, class _Arg>
+class const_mem_fun1_t<void, _Tp, _Arg>
+ : public binary_function<const _Tp*,_Arg,void> {
+ typedef void (_Tp::*__fun_type)(_Arg) const;
+public:
+ explicit const_mem_fun1_t _STLP_PSPEC3(void,_Tp,_Arg) (__fun_type __pf) : _M_f(__pf) {}
+ void operator()(const _Tp* __p, _Arg __x) const { (__p->*_M_f)(__x); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Tp, class _Arg>
+class mem_fun1_ref_t<void, _Tp, _Arg>
+ : public binary_function<_Tp,_Arg,void> {
+ typedef void (_Tp::*__fun_type)(_Arg);
+public:
+ explicit mem_fun1_ref_t _STLP_PSPEC3(void,_Tp,_Arg) (__fun_type __pf) : _M_f(__pf) {}
+ void operator()(_Tp& __r, _Arg __x) const { (__r.*_M_f)(__x); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Tp, class _Arg>
+class const_mem_fun1_ref_t<void, _Tp, _Arg>
+ : public binary_function<_Tp,_Arg,void> {
+ typedef void (_Tp::*__fun_type)(_Arg) const;
+public:
+ explicit const_mem_fun1_ref_t _STLP_PSPEC3(void,_Tp,_Arg) (__fun_type __pf) : _M_f(__pf) {}
+ void operator()(const _Tp& __r, _Arg __x) const { (__r.*_M_f)(__x); }
+private:
+ __fun_type _M_f;
+};
+
+template <class _Arg>
+class pointer_to_unary_function : public unary_function<_Arg, void> {
+ typedef void (*__fun_type)(_Arg);
+ __fun_type _M_ptr;
+public:
+ pointer_to_unary_function() {}
+ explicit pointer_to_unary_function(__fun_type __x) : _M_ptr(__x) {}
+ void operator()(_Arg __x) const { _M_ptr(__x); }
+};
+
+template <class _Arg1, class _Arg2>
+class pointer_to_binary_function : public binary_function<_Arg1,_Arg2,void> {
+ typedef void (*__fun_type)(_Arg1, _Arg2);
+ __fun_type _M_ptr;
+public:
+ pointer_to_binary_function() {}
+ explicit pointer_to_binary_function(__fun_type __x) : _M_ptr(__x) {}
+ void operator()(_Arg1 __x, _Arg2 __y) const { _M_ptr(__x, __y); }
+};
+
+#endif /*_STLP_DONT_RETURN_VOID && !_STLP_NO_CLASS_PARTIAL_SPECIALIZATION*/
+
+#else /*!_STLP_DONT_RETURN_VOID || !_STLP_NO_CLASS_PARTIAL_SPECIALIZATION || !_STLP_MEMBER_TEMPLATE_CLASSES*/
+
+//mem_fun_t
+template <class _Result, class _Tp>
+class mem_fun_t :
+ public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ptr {
+ typedef typename
+ _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ptr _Base;
+public:
+ explicit mem_fun_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//const_mem_fun_t
+template <class _Result, class _Tp>
+class const_mem_fun_t :
+ public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ptr_const {
+ typedef typename
+ _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ptr_const _Base;
+public:
+ explicit const_mem_fun_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//mem_fun_ref_t
+template <class _Result, class _Tp>
+class mem_fun_ref_t :
+ public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ref {
+ typedef typename
+ _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ref _Base;
+public:
+ explicit mem_fun_ref_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//const_mem_fun_ref_t
+template <class _Result, class _Tp>
+class const_mem_fun_ref_t :
+ public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ref_const {
+ typedef typename
+ _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ref_const _Base;
+public:
+ explicit const_mem_fun_ref_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//mem_fun1_t
+template <class _Result, class _Tp, class _Arg>
+class mem_fun1_t :
+ public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ptr {
+ typedef typename
+ _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ptr _Base;
+public:
+ explicit mem_fun1_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//const_mem_fun1_t
+template <class _Result, class _Tp, class _Arg>
+class const_mem_fun1_t :
+ public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ptr_const {
+ typedef typename
+ _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ptr_const _Base;
+public:
+ explicit const_mem_fun1_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//mem_fun1_ref_t
+template <class _Result, class _Tp, class _Arg>
+class mem_fun1_ref_t :
+ public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ref {
+ typedef typename
+ _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ref _Base;
+public:
+ explicit mem_fun1_ref_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//const_mem_fun1_t
+template <class _Result, class _Tp, class _Arg>
+class const_mem_fun1_ref_t :
+ public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ref_const {
+ typedef typename
+ _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ref_const _Base;
+public:
+ explicit const_mem_fun1_ref_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+
+template <class _Arg, class _Result>
+class pointer_to_unary_function :
+public _Ptr_fun1<_Result,_Arg> {
+ typedef typename
+ _Ptr_fun1<_Result,_Arg>::__fun_type __fun_type;
+public:
+ explicit pointer_to_unary_function(__fun_type __f)
+ : _Ptr_fun1<_Result,_Arg>(__f) {}
+};
+
+template <class _Arg1, class _Arg2, class _Result>
+class pointer_to_binary_function :
+public _Ptr_fun2<_Result,_Arg1,_Arg2> {
+ typedef typename
+ _Ptr_fun2<_Result,_Arg1,_Arg2>::__fun_type __fun_type;
+public:
+ explicit pointer_to_binary_function(__fun_type __f)
+ : _Ptr_fun2<_Result,_Arg1,_Arg2>(__f) {}
+};
+
+#endif /*!_STLP_DONT_RETURN_VOID || !_STLP_NO_CLASS_PARTIAL_SPECIALIZATION || !_STLP_MEMBER_TEMPLATE_CLASSES*/
+
+
+# if !defined (_STLP_MEMBER_POINTER_PARAM_BUG)
+// Mem_fun adaptor helper functions. There are only two:
+// mem_fun and mem_fun_ref. (mem_fun1 and mem_fun1_ref
+// are provided for backward compatibility, but they are no longer
+// part of the C++ standard.)
+
+template <class _Result, class _Tp>
+inline mem_fun_t<_Result,_Tp>
+mem_fun(_Result (_Tp::*__f)()) { return mem_fun_t<_Result,_Tp>(__f); }
+
+template <class _Result, class _Tp>
+inline const_mem_fun_t<_Result,_Tp>
+mem_fun(_Result (_Tp::*__f)() const) { return const_mem_fun_t<_Result,_Tp>(__f); }
+
+template <class _Result, class _Tp>
+inline mem_fun_ref_t<_Result,_Tp>
+mem_fun_ref(_Result (_Tp::*__f)()) { return mem_fun_ref_t<_Result,_Tp>(__f); }
+
+template <class _Result, class _Tp>
+inline const_mem_fun_ref_t<_Result,_Tp>
+mem_fun_ref(_Result (_Tp::*__f)() const) { return const_mem_fun_ref_t<_Result,_Tp>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline mem_fun1_t<_Result,_Tp,_Arg>
+mem_fun(_Result (_Tp::*__f)(_Arg)) { return mem_fun1_t<_Result,_Tp,_Arg>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline const_mem_fun1_t<_Result,_Tp,_Arg>
+mem_fun(_Result (_Tp::*__f)(_Arg) const) { return const_mem_fun1_t<_Result,_Tp,_Arg>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline mem_fun1_ref_t<_Result,_Tp,_Arg>
+mem_fun_ref(_Result (_Tp::*__f)(_Arg)) { return mem_fun1_ref_t<_Result,_Tp,_Arg>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline const_mem_fun1_ref_t<_Result,_Tp,_Arg>
+mem_fun_ref(_Result (_Tp::*__f)(_Arg) const) { return const_mem_fun1_ref_t<_Result,_Tp,_Arg>(__f); }
+
+# if !(defined (_STLP_NO_EXTENSIONS) || defined (_STLP_NO_ANACHRONISMS))
+// mem_fun1 and mem_fun1_ref are no longer part of the C++ standard,
+// but they are provided for backward compatibility.
+template <class _Result, class _Tp, class _Arg>
+inline mem_fun1_t<_Result,_Tp,_Arg>
+mem_fun1(_Result (_Tp::*__f)(_Arg)) { return mem_fun1_t<_Result,_Tp,_Arg>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline const_mem_fun1_t<_Result,_Tp,_Arg>
+mem_fun1(_Result (_Tp::*__f)(_Arg) const) { return const_mem_fun1_t<_Result,_Tp,_Arg>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline mem_fun1_ref_t<_Result,_Tp,_Arg>
+mem_fun1_ref(_Result (_Tp::*__f)(_Arg)) { return mem_fun1_ref_t<_Result,_Tp,_Arg>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline const_mem_fun1_ref_t<_Result,_Tp,_Arg>
+mem_fun1_ref(_Result (_Tp::*__f)(_Arg) const) { return const_mem_fun1_ref_t<_Result,_Tp,_Arg>(__f); }
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+# endif /* _STLP_MEMBER_POINTER_PARAM_BUG */
+
+template <class _Arg, class _Result>
+inline pointer_to_unary_function<_Arg, _Result>
+ptr_fun(_Result (*__f)(_Arg))
+{ return pointer_to_unary_function<_Arg, _Result>(__f); }
+
+template <class _Arg1, class _Arg2, class _Result>
+inline pointer_to_binary_function<_Arg1,_Arg2,_Result>
+ptr_fun(_Result (*__f)(_Arg1, _Arg2))
+{ return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__f); }
+
+_STLP_END_NAMESPACE
diff --git a/src/STLport/stl/_function_base.h b/src/STLport/stl/_function_base.h
new file mode 100644
index 0000000..e310427
--- /dev/null
+++ b/src/STLport/stl/_function_base.h
@@ -0,0 +1,226 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_FUNCTION_BASE_H
+#define _STLP_INTERNAL_FUNCTION_BASE_H
+
+#ifndef _STLP_CONFIG_H
+#include <stl/_config.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Arg, class _Result>
+struct unary_function {
+ typedef _Arg argument_type;
+ typedef _Result result_type;
+};
+
+template <class _Arg1, class _Arg2, class _Result>
+struct binary_function {
+ typedef _Arg1 first_argument_type;
+ typedef _Arg2 second_argument_type;
+ typedef _Result result_type;
+};
+
+template <class _Tp>
+struct equal_to : public binary_function<_Tp,_Tp,bool>
+{
+ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; }
+};
+
+template <class _Tp>
+struct not_equal_to : public binary_function<_Tp,_Tp,bool>
+{
+ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x != __y; }
+};
+
+template <class _Tp>
+struct greater : public binary_function<_Tp,_Tp,bool>
+{
+ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x > __y; }
+};
+
+template <class _Tp>
+struct less : public binary_function<_Tp,_Tp,bool>
+{
+ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }
+};
+
+template <class _Tp>
+struct greater_equal : public binary_function<_Tp,_Tp,bool>
+{
+ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x >= __y; }
+};
+
+template <class _Tp>
+struct less_equal : public binary_function<_Tp,_Tp,bool>
+{
+ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x <= __y; }
+};
+
+template <class _Tp>
+less<_Tp> __less(_Tp* ) { return less<_Tp>(); }
+
+template <class _Tp>
+equal_to<_Tp> __equal_to(_Tp* ) { return equal_to<_Tp>(); }
+
+template <class _Tp>
+struct plus : public binary_function<_Tp,_Tp,_Tp> {
+ _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x + __y; }
+};
+
+template <class _Tp>
+struct minus : public binary_function<_Tp,_Tp,_Tp> {
+ _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x - __y; }
+};
+
+template <class _Tp>
+plus<_Tp> __plus(_Tp* ) { return plus<_Tp>(); }
+
+template <class _Tp>
+minus<_Tp> __minus(_Tp* ) { return minus<_Tp>(); }
+
+template <class _Tp>
+struct multiplies : public binary_function<_Tp,_Tp,_Tp> {
+ _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x * __y; }
+};
+
+template <class _Tp>
+struct divides : public binary_function<_Tp,_Tp,_Tp> {
+ _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x / __y; }
+};
+
+template <class _Tp>
+struct modulus : public binary_function<_Tp,_Tp,_Tp>
+{
+ _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x % __y; }
+};
+
+template <class _Tp>
+struct negate : public unary_function<_Tp,_Tp>
+{
+ _Tp operator()(const _Tp& __x) const { return -__x; }
+};
+
+template <class _Tp>
+struct logical_and : public binary_function<_Tp,_Tp,bool>
+{
+ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x && __y; }
+};
+
+template <class _Tp>
+struct logical_or : public binary_function<_Tp,_Tp,bool>
+{
+ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x || __y; }
+};
+
+template <class _Tp>
+struct logical_not : public unary_function<_Tp,bool>
+{
+ bool operator()(const _Tp& __x) const { return !__x; }
+};
+
+template <class _Pair>
+struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> {
+ const typename _Pair::first_type& operator()(const _Pair& __x) const {
+ return __x.first;
+ }
+};
+
+template <class _Pair>
+struct _Select2nd : public unary_function<_Pair, typename _Pair::second_type>
+{
+ const typename _Pair::second_type& operator()(const _Pair& __x) const {
+ return __x.second;
+ }
+};
+
+// project1st and project2nd are extensions: they are not part of the standard
+template <class _Arg1, class _Arg2>
+struct _Project1st : public binary_function<_Arg1, _Arg2, _Arg1> {
+ _Arg1 operator()(const _Arg1& __x, const _Arg2&) const { return __x; }
+};
+
+template <class _Arg1, class _Arg2>
+struct _Project2nd : public binary_function<_Arg1, _Arg2, _Arg2> {
+ _Arg2 operator()(const _Arg1&, const _Arg2& __y) const { return __y; }
+};
+
+#ifdef _STLP_MULTI_CONST_TEMPLATE_ARG_BUG
+// fbp : sort of select1st just for maps
+template <class _Pair, class _Whatever>
+// JDJ (CW Pro1 doesn't like const when first_type is also const)
+struct __Select1st_hint : public unary_function<_Pair, _Whatever> {
+ const _Whatever& operator () (const _Pair& __x) const { return __x.first; }
+};
+# define _STLP_SELECT1ST(__x,__y) __Select1st_hint< __x, __y >
+# else
+# define _STLP_SELECT1ST(__x, __y) _Select1st< __x >
+# endif
+
+template <class _Tp>
+struct _Identity : public unary_function<_Tp,_Tp> {
+ const _Tp& operator()(const _Tp& __x) const { return __x; }
+};
+
+template <class _Result, class _Argument>
+struct _Constant_unary_fun {
+ typedef _Argument argument_type;
+ typedef _Result result_type;
+ result_type _M_val;
+
+ _Constant_unary_fun(const result_type& __v) : _M_val(__v) {}
+ const result_type& operator()(const _Argument&) const { return _M_val; }
+};
+
+template <class _Result, class _Arg1, class _Arg2>
+struct _Constant_binary_fun {
+ typedef _Arg1 first_argument_type;
+ typedef _Arg2 second_argument_type;
+ typedef _Result result_type;
+ _Result _M_val;
+
+ _Constant_binary_fun(const _Result& __v) : _M_val(__v) {}
+ const result_type& operator()(const _Arg1&, const _Arg2&) const {
+ return _M_val;
+ }
+};
+
+// identity_element (not part of the C++ standard).
+template <class _Tp> inline _Tp __identity_element(plus<_Tp>) { return _Tp(0); }
+template <class _Tp> inline _Tp __identity_element(multiplies<_Tp>) { return _Tp(1); }
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_FUNCTION_BASE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_hash_fun.h b/src/STLport/stl/_hash_fun.h
new file mode 100644
index 0000000..414ea8b
--- /dev/null
+++ b/src/STLport/stl/_hash_fun.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_HASH_FUN_H
+#define _STLP_HASH_FUN_H
+
+# ifndef _STLP_CSTDDEF
+# include <cstddef>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Key> struct hash { };
+
+inline size_t __stl_hash_string(const char* __s)
+{
+ _STLP_FIX_LITERAL_BUG(__s)
+ unsigned long __h = 0;
+ for ( ; *__s; ++__s)
+ __h = 5*__h + *__s;
+
+ return size_t(__h);
+}
+
+_STLP_TEMPLATE_NULL struct hash<char*>
+{
+ size_t operator()(const char* __s) const { _STLP_FIX_LITERAL_BUG(__s) return __stl_hash_string(__s); }
+};
+
+_STLP_TEMPLATE_NULL struct hash<const char*>
+{
+ size_t operator()(const char* __s) const { _STLP_FIX_LITERAL_BUG(__s) return __stl_hash_string(__s); }
+};
+
+_STLP_TEMPLATE_NULL struct hash<char> {
+ size_t operator()(char __x) const { return __x; }
+};
+_STLP_TEMPLATE_NULL struct hash<unsigned char> {
+ size_t operator()(unsigned char __x) const { return __x; }
+};
+#ifndef _STLP_NO_SIGNED_BUILTINS
+_STLP_TEMPLATE_NULL struct hash<signed char> {
+ size_t operator()(unsigned char __x) const { return __x; }
+};
+#endif
+_STLP_TEMPLATE_NULL struct hash<short> {
+ size_t operator()(short __x) const { return __x; }
+};
+_STLP_TEMPLATE_NULL struct hash<unsigned short> {
+ size_t operator()(unsigned short __x) const { return __x; }
+};
+_STLP_TEMPLATE_NULL struct hash<int> {
+ size_t operator()(int __x) const { return __x; }
+};
+_STLP_TEMPLATE_NULL struct hash<unsigned int> {
+ size_t operator()(unsigned int __x) const { return __x; }
+};
+_STLP_TEMPLATE_NULL struct hash<long> {
+ size_t operator()(long __x) const { return __x; }
+};
+_STLP_TEMPLATE_NULL struct hash<unsigned long> {
+ size_t operator()(unsigned long __x) const { return __x; }
+};
+
+# if defined (_STLP_LONG_LONG)
+_STLP_TEMPLATE_NULL struct hash<_STLP_LONG_LONG> {
+ size_t operator()(long x) const { return x; }
+};
+_STLP_TEMPLATE_NULL struct hash<unsigned _STLP_LONG_LONG> {
+ size_t operator()(unsigned long x) const { return x; }
+};
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_HASH_FUN_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_hash_map.h b/src/STLport/stl/_hash_map.h
new file mode 100644
index 0000000..6962264
--- /dev/null
+++ b/src/STLport/stl/_hash_map.h
@@ -0,0 +1,468 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_HASH_MAP_H
+#define _STLP_INTERNAL_HASH_MAP_H
+
+#ifndef _STLP_INTERNAL_HASHTABLE_H
+# include <stl/_hashtable.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# define hash_map __WORKAROUND_RENAME(hash_map)
+# define hash_multimap __WORKAROUND_RENAME(hash_multimap)
+
+# define _STLP_KEY_PAIR pair< const _Key, _Tp >
+# define _STLP_HASHTABLE hashtable \
+ < pair < const _Key, _Tp >, _Key, _HashFcn, \
+ _STLP_SELECT1ST( _STLP_KEY_PAIR, _Key ), _EqualKey, _Alloc >
+
+template <class _Key, class _Tp, __DFL_TMPL_PARAM(_HashFcn,hash<_Key>),
+ __DFL_TMPL_PARAM(_EqualKey,equal_to<_Key>),
+ _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(const _Key, _Tp) >
+class hash_map
+{
+private:
+ typedef _STLP_HASHTABLE _Ht;
+ typedef hash_map<_Key, _Tp, _HashFcn, _EqualKey, _Alloc> _Self;
+public:
+ typedef typename _Ht::key_type key_type;
+ typedef _Tp data_type;
+ typedef _Tp mapped_type;
+ typedef typename _Ht::value_type _value_type;
+ typedef typename _Ht::value_type value_type;
+ typedef typename _Ht::hasher hasher;
+ typedef typename _Ht::key_equal key_equal;
+
+ typedef typename _Ht::size_type size_type;
+ typedef typename _Ht::difference_type difference_type;
+ typedef typename _Ht::pointer pointer;
+ typedef typename _Ht::const_pointer const_pointer;
+ typedef typename _Ht::reference reference;
+ typedef typename _Ht::const_reference const_reference;
+
+ typedef typename _Ht::iterator iterator;
+ typedef typename _Ht::const_iterator const_iterator;
+
+ typedef typename _Ht::allocator_type allocator_type;
+
+ hasher hash_funct() const { return _M_ht.hash_funct(); }
+ key_equal key_eq() const { return _M_ht.key_eq(); }
+ allocator_type get_allocator() const { return _M_ht.get_allocator(); }
+
+private:
+ _Ht _M_ht;
+public:
+ hash_map() : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
+ explicit hash_map(size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
+ hash_map(size_type __n, const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
+ hash_map(size_type __n, const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a = allocator_type())
+ : _M_ht(__n, __hf, __eql, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ hash_map(_InputIterator __f, _InputIterator __l)
+ : _M_ht(100, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ template <class _InputIterator>
+ hash_map(_InputIterator __f, _InputIterator __l, size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ template <class _InputIterator>
+ hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
+ const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql)
+ : _M_ht(__n, __hf, __eql, allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+# endif
+ template <class _InputIterator>
+ hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+ : _M_ht(__n, __hf, __eql, __a)
+ { _M_ht.insert_unique(__f, __l); }
+
+#else
+ hash_map(const value_type* __f, const value_type* __l)
+ : _M_ht(100, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ hash_map(const value_type* __f, const value_type* __l, size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ hash_map(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ hash_map(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a = allocator_type())
+ : _M_ht(__n, __hf, __eql, __a)
+ { _M_ht.insert_unique(__f, __l); }
+
+ hash_map(const_iterator __f, const_iterator __l)
+ : _M_ht(100, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ hash_map(const_iterator __f, const_iterator __l, size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ hash_map(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ hash_map(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a = allocator_type())
+ : _M_ht(__n, __hf, __eql, __a)
+ { _M_ht.insert_unique(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+
+public:
+ size_type size() const { return _M_ht.size(); }
+ size_type max_size() const { return _M_ht.max_size(); }
+ bool empty() const { return _M_ht.empty(); }
+ void swap(_Self& __hs) { _M_ht.swap(__hs._M_ht); }
+ iterator begin() { return _M_ht.begin(); }
+ iterator end() { return _M_ht.end(); }
+ const_iterator begin() const { return _M_ht.begin(); }
+ const_iterator end() const { return _M_ht.end(); }
+
+public:
+ pair<iterator,bool> insert(const value_type& __obj)
+ { return _M_ht.insert_unique(__obj); }
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void insert(_InputIterator __f, _InputIterator __l)
+ { _M_ht.insert_unique(__f,__l); }
+#else
+ void insert(const value_type* __f, const value_type* __l) {
+ _M_ht.insert_unique(__f,__l);
+ }
+ void insert(const_iterator __f, const_iterator __l)
+ { _M_ht.insert_unique(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+ pair<iterator,bool> insert_noresize(const value_type& __obj)
+ { return _M_ht.insert_unique_noresize(__obj); }
+
+ iterator find(const key_type& __key) { return _M_ht.find(__key); }
+ const_iterator find(const key_type& __key) const { return _M_ht.find(__key); }
+
+ _Tp& operator[](const key_type& __key) {
+ iterator __it = _M_ht.find(__key);
+ return (__it == _M_ht.end() ?
+ _M_ht._M_insert(_value_type(__key, _Tp())).second :
+ (*__it).second );
+ }
+
+ size_type count(const key_type& __key) const { return _M_ht.count(__key); }
+
+ pair<iterator, iterator> equal_range(const key_type& __key)
+ { return _M_ht.equal_range(__key); }
+ pair<const_iterator, const_iterator>
+ equal_range(const key_type& __key) const
+ { return _M_ht.equal_range(__key); }
+
+ size_type erase(const key_type& __key) {return _M_ht.erase(__key); }
+ void erase(iterator __it) { _M_ht.erase(__it); }
+ void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
+ void clear() { _M_ht.clear(); }
+
+ void resize(size_type __hint) { _M_ht.resize(__hint); }
+ size_type bucket_count() const { return _M_ht.bucket_count(); }
+ size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
+ size_type elems_in_bucket(size_type __n) const
+ { return _M_ht.elems_in_bucket(__n); }
+ static bool _STLP_CALL _M_equal (const _Self& __x, const _Self& __y) {
+ return _Ht::_M_equal(__x._M_ht,__y._M_ht);
+ }
+};
+
+template <class _Key, class _Tp, __DFL_TMPL_PARAM(_HashFcn,hash<_Key>),
+ __DFL_TMPL_PARAM(_EqualKey,equal_to<_Key>),
+ _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(const _Key, _Tp) >
+class hash_multimap
+{
+private:
+ typedef _STLP_HASHTABLE _Ht;
+ typedef hash_multimap<_Key, _Tp, _HashFcn, _EqualKey, _Alloc> _Self;
+public:
+ typedef typename _Ht::key_type key_type;
+ typedef _Tp data_type;
+ typedef _Tp mapped_type;
+ typedef typename _Ht::value_type _value_type;
+ typedef _value_type value_type;
+ typedef typename _Ht::hasher hasher;
+ typedef typename _Ht::key_equal key_equal;
+
+ typedef typename _Ht::size_type size_type;
+ typedef typename _Ht::difference_type difference_type;
+ typedef typename _Ht::pointer pointer;
+ typedef typename _Ht::const_pointer const_pointer;
+ typedef typename _Ht::reference reference;
+ typedef typename _Ht::const_reference const_reference;
+
+ typedef typename _Ht::iterator iterator;
+ typedef typename _Ht::const_iterator const_iterator;
+
+ typedef typename _Ht::allocator_type allocator_type;
+
+ hasher hash_funct() const { return _M_ht.hash_funct(); }
+ key_equal key_eq() const { return _M_ht.key_eq(); }
+ allocator_type get_allocator() const { return _M_ht.get_allocator(); }
+
+private:
+ _Ht _M_ht;
+public:
+ hash_multimap() : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
+ explicit hash_multimap(size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
+ hash_multimap(size_type __n, const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
+ hash_multimap(size_type __n, const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a = allocator_type())
+ : _M_ht(__n, __hf, __eql, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ hash_multimap(_InputIterator __f, _InputIterator __l)
+ : _M_ht(100, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ template <class _InputIterator>
+ hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ template <class _InputIterator>
+ hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
+ const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql)
+ : _M_ht(__n, __hf, __eql, allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+# endif
+ template <class _InputIterator>
+ hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+ : _M_ht(__n, __hf, __eql, __a)
+ { _M_ht.insert_equal(__f, __l); }
+
+#else
+ hash_multimap(const value_type* __f, const value_type* __l)
+ : _M_ht(100, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ hash_multimap(const value_type* __f, const value_type* __l, size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ hash_multimap(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ hash_multimap(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a = allocator_type())
+ : _M_ht(__n, __hf, __eql, __a)
+ { _M_ht.insert_equal(__f, __l); }
+
+ hash_multimap(const_iterator __f, const_iterator __l)
+ : _M_ht(100, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ hash_multimap(const_iterator __f, const_iterator __l, size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ hash_multimap(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ hash_multimap(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a = allocator_type())
+ : _M_ht(__n, __hf, __eql, __a)
+ { _M_ht.insert_equal(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+
+public:
+ size_type size() const { return _M_ht.size(); }
+ size_type max_size() const { return _M_ht.max_size(); }
+ bool empty() const { return _M_ht.empty(); }
+ void swap(_Self& __hs) { _M_ht.swap(__hs._M_ht); }
+
+ iterator begin() { return _M_ht.begin(); }
+ iterator end() { return _M_ht.end(); }
+ const_iterator begin() const { return _M_ht.begin(); }
+ const_iterator end() const { return _M_ht.end(); }
+
+public:
+ iterator insert(const value_type& __obj)
+ { return _M_ht.insert_equal(__obj); }
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void insert(_InputIterator __f, _InputIterator __l)
+ { _M_ht.insert_equal(__f,__l); }
+#else
+ void insert(const value_type* __f, const value_type* __l) {
+ _M_ht.insert_equal(__f,__l);
+ }
+ void insert(const_iterator __f, const_iterator __l)
+ { _M_ht.insert_equal(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+ iterator insert_noresize(const value_type& __obj)
+ { return _M_ht.insert_equal_noresize(__obj); }
+
+ iterator find(const key_type& __key) { return _M_ht.find(__key); }
+ const_iterator find(const key_type& __key) const
+ { return _M_ht.find(__key); }
+
+ size_type count(const key_type& __key) const { return _M_ht.count(__key); }
+
+ pair<iterator, iterator> equal_range(const key_type& __key)
+ { return _M_ht.equal_range(__key); }
+ pair<const_iterator, const_iterator>
+ equal_range(const key_type& __key) const
+ { return _M_ht.equal_range(__key); }
+
+ size_type erase(const key_type& __key) {return _M_ht.erase(__key); }
+ void erase(iterator __it) { _M_ht.erase(__it); }
+ void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
+ void clear() { _M_ht.clear(); }
+
+public:
+ void resize(size_type __hint) { _M_ht.resize(__hint); }
+ size_type bucket_count() const { return _M_ht.bucket_count(); }
+ size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
+ size_type elems_in_bucket(size_type __n) const
+ { return _M_ht.elems_in_bucket(__n); }
+ static bool _STLP_CALL _M_equal (const _Self& __x, const _Self& __y) {
+ return _Ht::_M_equal(__x._M_ht,__y._M_ht);
+ }
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Key, class _Tp, class _HashFcn, class _EqlKey, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER hash_map<_Key,_Tp,_HashFcn,_EqlKey,_Alloc>
+
+#include <stl/_relops_hash_cont.h>
+
+#undef _STLP_TEMPLATE_CONTAINER
+#define _STLP_TEMPLATE_CONTAINER hash_multimap<_Key,_Tp,_HashFcn,_EqlKey,_Alloc>
+#include <stl/_relops_hash_cont.h>
+
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+// Specialization of insert_iterator so that it will work for hash_map
+// and hash_multimap.
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+template <class _Key, class _Tp, class _HashFn, class _EqKey, class _Alloc>
+class insert_iterator<hash_map<_Key, _Tp, _HashFn, _EqKey, _Alloc> > {
+protected:
+ typedef hash_map<_Key, _Tp, _HashFn, _EqKey, _Alloc> _Container;
+ _Container* container;
+public:
+ typedef _Container container_type;
+ typedef output_iterator_tag iterator_category;
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+
+ insert_iterator(_Container& __x) : container(&__x) {}
+ insert_iterator(_Container& __x, typename _Container::iterator)
+ : container(&__x) {}
+ insert_iterator<_Container>&
+ operator=(const typename _Container::value_type& __val) {
+ container->insert(__val);
+ return *this;
+ }
+ insert_iterator<_Container>& operator*() { return *this; }
+ insert_iterator<_Container>& operator++() { return *this; }
+ insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+template <class _Key, class _Tp, class _HashFn, class _EqKey, class _Alloc>
+class insert_iterator<hash_multimap<_Key, _Tp, _HashFn, _EqKey, _Alloc> > {
+protected:
+ typedef hash_multimap<_Key, _Tp, _HashFn, _EqKey, _Alloc> _Container;
+ _Container* container;
+ typename _Container::iterator iter;
+public:
+ typedef _Container container_type;
+ typedef output_iterator_tag iterator_category;
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+
+ insert_iterator(_Container& __x) : container(&__x) {}
+ insert_iterator(_Container& __x, typename _Container::iterator)
+ : container(&__x) {}
+ insert_iterator<_Container>&
+ operator=(const typename _Container::value_type& __val) {
+ container->insert(__val);
+ return *this;
+ }
+ insert_iterator<_Container>& operator*() { return *this; }
+ insert_iterator<_Container>& operator++() { return *this; }
+ insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+// do a cleanup
+# undef hash_map
+# undef hash_multimap
+
+# define __hash_map__ __FULL_NAME(hash_map)
+# define __hash_multimap__ __FULL_NAME(hash_multimap)
+
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM)
+# include <stl/wrappers/_hash_map.h>
+# endif /* WRAPPER */
+
+#endif /* _STLP_INTERNAL_HASH_MAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_hash_set.h b/src/STLport/stl/_hash_set.h
new file mode 100644
index 0000000..eb5279b
--- /dev/null
+++ b/src/STLport/stl/_hash_set.h
@@ -0,0 +1,470 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_HASH_SET_H
+#define _STLP_INTERNAL_HASH_SET_H
+
+#ifndef _STLP_INTERNAL_HASHTABLE_H
+# include <stl/_hashtable.h>
+#endif
+
+# define hash_set __WORKAROUND_RENAME(hash_set)
+# define hash_multiset __WORKAROUND_RENAME(hash_multiset)
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Value, __DFL_TMPL_PARAM(_HashFcn,hash<_Value>),
+ __DFL_TMPL_PARAM(_EqualKey,equal_to<_Value>),
+ _STLP_DEFAULT_ALLOCATOR_SELECT(_Value) >
+class hash_set
+{
+private:
+ typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>,
+ _EqualKey, _Alloc> _Ht;
+ typedef hash_set<_Value, _HashFcn, _EqualKey, _Alloc> _Self;
+ typedef typename _Ht::iterator _ht_iterator;
+public:
+ typedef typename _Ht::key_type key_type;
+ typedef typename _Ht::value_type value_type;
+ typedef typename _Ht::hasher hasher;
+ typedef typename _Ht::key_equal key_equal;
+
+ typedef typename _Ht::size_type size_type;
+ typedef typename _Ht::difference_type difference_type;
+ typedef typename _Ht::pointer pointer;
+ typedef typename _Ht::const_pointer const_pointer;
+ typedef typename _Ht::reference reference;
+ typedef typename _Ht::const_reference const_reference;
+
+ // SunPro bug
+ typedef typename _Ht::const_iterator const_iterator;
+ typedef const_iterator iterator;
+
+ typedef typename _Ht::allocator_type allocator_type;
+
+ hasher hash_funct() const { return _M_ht.hash_funct(); }
+ key_equal key_eq() const { return _M_ht.key_eq(); }
+ allocator_type get_allocator() const { return _M_ht.get_allocator(); }
+
+private:
+ _Ht _M_ht;
+
+public:
+ hash_set()
+ : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
+ explicit hash_set(size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
+ hash_set(size_type __n, const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
+ hash_set(size_type __n, const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a = allocator_type())
+ : _M_ht(__n, __hf, __eql, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ hash_set(_InputIterator __f, _InputIterator __l)
+ : _M_ht(100, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ template <class _InputIterator>
+ hash_set(_InputIterator __f, _InputIterator __l, size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ template <class _InputIterator>
+ hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
+ const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql)
+ : _M_ht(__n, __hf, __eql, allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+# endif
+ template <class _InputIterator>
+ hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+ : _M_ht(__n, __hf, __eql, __a)
+ { _M_ht.insert_unique(__f, __l); }
+#else
+
+ hash_set(const value_type* __f, const value_type* __l)
+ : _M_ht(100, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ hash_set(const value_type* __f, const value_type* __l, size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ hash_set(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ hash_set(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a = allocator_type())
+ : _M_ht(__n, __hf, __eql, __a)
+ { _M_ht.insert_unique(__f, __l); }
+
+ hash_set(const_iterator __f, const_iterator __l)
+ : _M_ht(100, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ hash_set(const_iterator __f, const_iterator __l, size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ hash_set(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type())
+ { _M_ht.insert_unique(__f, __l); }
+ hash_set(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a = allocator_type())
+ : _M_ht(__n, __hf, __eql, __a)
+ { _M_ht.insert_unique(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+
+public:
+ size_type size() const { return _M_ht.size(); }
+ size_type max_size() const { return _M_ht.max_size(); }
+ bool empty() const { return _M_ht.empty(); }
+ void swap(_Self& __hs) { _M_ht.swap(__hs._M_ht); }
+
+ iterator begin() const { return _M_ht.begin(); }
+ iterator end() const { return _M_ht.end(); }
+
+public:
+ pair<iterator, bool> insert(const value_type& __obj)
+ {
+ pair<_ht_iterator, bool> __p = _M_ht.insert_unique(__obj);
+ return pair<iterator,bool>(__REINTERPRET_CAST(const iterator&, __p.first), __p.second);
+ }
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void insert(_InputIterator __f, _InputIterator __l)
+ { _M_ht.insert_unique(__f,__l); }
+#else
+ void insert(const value_type* __f, const value_type* __l) {
+ _M_ht.insert_unique(__f,__l);
+ }
+ void insert(const_iterator __f, const_iterator __l)
+ {_M_ht.insert_unique(__f, __l); }
+
+#endif /*_STLP_MEMBER_TEMPLATES */
+ pair<iterator, bool> insert_noresize(const value_type& __obj)
+ {
+ pair<_ht_iterator, bool> __p =
+ _M_ht.insert_unique_noresize(__obj);
+ return pair<iterator, bool>(__p.first, __p.second);
+ }
+
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS )
+ template <class _KT>
+ iterator find(const _KT& __key) const { return _M_ht.find(__key); }
+# else
+ iterator find(const key_type& __key) const { return _M_ht.find(__key); }
+# endif
+ size_type count(const key_type& __key) const { return _M_ht.count(__key); }
+
+ pair<iterator, iterator> equal_range(const key_type& __key) const
+ { return _M_ht.equal_range(__key); }
+
+ size_type erase(const key_type& __key) {return _M_ht.erase(__key); }
+ void erase(iterator __it) { _M_ht.erase(__it); }
+ void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
+ void clear() { _M_ht.clear(); }
+
+public:
+ void resize(size_type __hint) { _M_ht.resize(__hint); }
+ size_type bucket_count() const { return _M_ht.bucket_count(); }
+ size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
+ size_type elems_in_bucket(size_type __n) const
+ { return _M_ht.elems_in_bucket(__n); }
+
+ static bool _STLP_CALL _M_equal (const _Self& __x, const _Self& __y) {
+ return _Ht::_M_equal(__x._M_ht,__y._M_ht);
+ }
+
+};
+
+template <class _Value, __DFL_TMPL_PARAM(_HashFcn,hash<_Value>),
+ __DFL_TMPL_PARAM(_EqualKey,equal_to<_Value>),
+ _STLP_DEFAULT_ALLOCATOR_SELECT(_Value) >
+class hash_multiset
+{
+private:
+ typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>,
+ _EqualKey, _Alloc> _Ht;
+ typedef hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc> _Self;
+
+public:
+ typedef typename _Ht::key_type key_type;
+ typedef typename _Ht::value_type value_type;
+ typedef typename _Ht::hasher hasher;
+ typedef typename _Ht::key_equal key_equal;
+
+ typedef typename _Ht::size_type size_type;
+ typedef typename _Ht::difference_type difference_type;
+ typedef typename _Ht::pointer pointer;
+ typedef typename _Ht::const_pointer const_pointer;
+ typedef typename _Ht::reference reference;
+ typedef typename _Ht::const_reference const_reference;
+
+ typedef typename _Ht::const_iterator const_iterator;
+ // SunPro bug
+ typedef const_iterator iterator;
+
+ typedef typename _Ht::allocator_type allocator_type;
+
+ hasher hash_funct() const { return _M_ht.hash_funct(); }
+ key_equal key_eq() const { return _M_ht.key_eq(); }
+ allocator_type get_allocator() const { return _M_ht.get_allocator(); }
+
+private:
+ _Ht _M_ht;
+
+public:
+ hash_multiset()
+ : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
+ explicit hash_multiset(size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
+ hash_multiset(size_type __n, const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
+ hash_multiset(size_type __n, const hasher& __hf, const key_equal& __eql)
+ : _M_ht(__n, __hf, __eql, allocator_type()) {}
+ hash_multiset(size_type __n, const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a)
+ : _M_ht(__n, __hf, __eql, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ hash_multiset(_InputIterator __f, _InputIterator __l)
+ : _M_ht(100, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ template <class _InputIterator>
+ hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ template <class _InputIterator>
+ hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
+ const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql)
+ : _M_ht(__n, __hf, __eql, allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+# endif
+ template <class _InputIterator>
+ hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+ : _M_ht(__n, __hf, __eql, __a)
+ { _M_ht.insert_equal(__f, __l); }
+#else
+
+ hash_multiset(const value_type* __f, const value_type* __l)
+ : _M_ht(100, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ hash_multiset(const value_type* __f, const value_type* __l, size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ hash_multiset(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ hash_multiset(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a = allocator_type())
+ : _M_ht(__n, __hf, __eql, __a)
+ { _M_ht.insert_equal(__f, __l); }
+
+ hash_multiset(const_iterator __f, const_iterator __l)
+ : _M_ht(100, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ hash_multiset(const_iterator __f, const_iterator __l, size_type __n)
+ : _M_ht(__n, hasher(), key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ hash_multiset(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf)
+ : _M_ht(__n, __hf, key_equal(), allocator_type())
+ { _M_ht.insert_equal(__f, __l); }
+ hash_multiset(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql,
+ const allocator_type& __a = allocator_type())
+ : _M_ht(__n, __hf, __eql, __a)
+ { _M_ht.insert_equal(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+
+public:
+ size_type size() const { return _M_ht.size(); }
+ size_type max_size() const { return _M_ht.max_size(); }
+ bool empty() const { return _M_ht.empty(); }
+ void swap(_Self& hs) { _M_ht.swap(hs._M_ht); }
+
+ iterator begin() const { return _M_ht.begin(); }
+ iterator end() const { return _M_ht.end(); }
+
+public:
+ iterator insert(const value_type& __obj)
+ { return _M_ht.insert_equal(__obj); }
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void insert(_InputIterator __f, _InputIterator __l)
+ { _M_ht.insert_equal(__f,__l); }
+#else
+ void insert(const value_type* __f, const value_type* __l) {
+ _M_ht.insert_equal(__f,__l);
+ }
+ void insert(const_iterator __f, const_iterator __l)
+ { _M_ht.insert_equal(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+ iterator insert_noresize(const value_type& __obj)
+ { return _M_ht.insert_equal_noresize(__obj); }
+
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS )
+ template <class _KT>
+ iterator find(const _KT& __key) const { return _M_ht.find(__key); }
+# else
+ iterator find(const key_type& __key) const { return _M_ht.find(__key); }
+# endif
+
+ size_type count(const key_type& __key) const { return _M_ht.count(__key); }
+
+ pair<iterator, iterator> equal_range(const key_type& __key) const
+ { return _M_ht.equal_range(__key); }
+
+ size_type erase(const key_type& __key) {return _M_ht.erase(__key); }
+ void erase(iterator __it) { _M_ht.erase(__it); }
+ void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
+ void clear() { _M_ht.clear(); }
+
+public:
+ void resize(size_type __hint) { _M_ht.resize(__hint); }
+ size_type bucket_count() const { return _M_ht.bucket_count(); }
+ size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
+ size_type elems_in_bucket(size_type __n) const
+ { return _M_ht.elems_in_bucket(__n); }
+ static bool _STLP_CALL _M_equal (const _Self& __x, const _Self& __y) {
+ return _Ht::_M_equal(__x._M_ht,__y._M_ht);
+ }
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Value, class _HashFcn, class _EqualKey, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER hash_set<_Value,_HashFcn,_EqualKey,_Alloc>
+
+#include <stl/_relops_hash_cont.h>
+
+#undef _STLP_TEMPLATE_CONTAINER
+#define _STLP_TEMPLATE_CONTAINER hash_multiset<_Value,_HashFcn,_EqualKey,_Alloc>
+#include <stl/_relops_hash_cont.h>
+
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+// Specialization of insert_iterator so that it will work for hash_set
+// and hash_multiset.
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+template <class _Value, class _HashFcn, class _EqualKey, class _Alloc>
+class insert_iterator<hash_set<_Value, _HashFcn, _EqualKey, _Alloc> > {
+protected:
+ typedef hash_set<_Value, _HashFcn, _EqualKey, _Alloc> _Container;
+ _Container* container;
+public:
+ typedef _Container container_type;
+ typedef output_iterator_tag iterator_category;
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+
+ insert_iterator(_Container& __x) : container(&__x) {}
+ insert_iterator(_Container& __x, typename _Container::iterator)
+ : container(&__x) {}
+ insert_iterator<_Container>&
+ operator=(const typename _Container::value_type& __val) {
+ container->insert(__val);
+ return *this;
+ }
+ insert_iterator<_Container>& operator*() { return *this; }
+ insert_iterator<_Container>& operator++() { return *this; }
+ insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+template <class _Value, class _HashFcn, class _EqualKey, class _Alloc>
+class insert_iterator<hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc> > {
+protected:
+ typedef hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc> _Container;
+ _Container* container;
+ typename _Container::iterator iter;
+public:
+ typedef _Container container_type;
+ typedef output_iterator_tag iterator_category;
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+
+ insert_iterator(_Container& __x) : container(&__x) {}
+ insert_iterator(_Container& __x, typename _Container::iterator)
+ : container(&__x) {}
+ insert_iterator<_Container>&
+ operator=(const typename _Container::value_type& __val) {
+ container->insert(__val);
+ return *this;
+ }
+ insert_iterator<_Container>& operator*() { return *this; }
+ insert_iterator<_Container>& operator++() { return *this; }
+ insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+_STLP_END_NAMESPACE
+
+// do a cleanup
+# undef hash_set
+# undef hash_multiset
+
+// provide a uniform way to access full funclionality
+# define __hash_set__ __FULL_NAME(hash_set)
+# define __hash_multiset__ __FULL_NAME(hash_multiset)
+
+# if defined ( _STLP_USE_WRAPPER_FOR_ALLOC_PARAM )
+# include <stl/wrappers/_hash_set.h>
+# endif /* WRAPPER */
+
+#endif /* _STLP_INTERNAL_HASH_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_hashtable.c b/src/STLport/stl/_hashtable.c
new file mode 100644
index 0000000..2e636f0
--- /dev/null
+++ b/src/STLport/stl/_hashtable.c
@@ -0,0 +1,468 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_HASHTABLE_C
+#define _STLP_HASHTABLE_C
+
+#ifndef _STLP_INTERNAL_HASHTABLE_H
+# include <stl/_hashtable.h>
+#endif
+
+#ifdef _STLP_DEBUG
+# define hashtable __WORKAROUND_DBG_RENAME(hashtable)
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# define __PRIME_LIST_BODY { \
+ 53ul, 97ul, 193ul, 389ul, 769ul, \
+ 1543ul, 3079ul, 6151ul, 12289ul, 24593ul, \
+ 49157ul, 98317ul, 196613ul, 393241ul, 786433ul, \
+ 1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul, \
+ 50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul,\
+ 1610612741ul, 3221225473ul, 4294967291ul \
+}
+
+#if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template <class _Tp>
+const size_t _Stl_prime<_Tp>::_M_list[__stl_num_primes] = __PRIME_LIST_BODY;
+#else
+__DECLARE_INSTANCE(const size_t,
+ _Stl_prime_type::_M_list[], =__PRIME_LIST_BODY);
+#endif /* _STLP_STATIC_TEMPLATE_DATA */
+
+# undef __PRIME_LIST_BODY
+
+// fbp: these defines are for outline methods definitions.
+// needed to definitions to be portable. Should not be used in method bodies.
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+# define __size_type__ size_t
+# define size_type size_t
+# define value_type _Val
+# define key_type _Key
+# define _Node _Hashtable_node<_Val>
+# define __reference__ _Val&
+
+# define __iterator__ _Ht_iterator<_Val, _Nonconst_traits<_Val>, _Key, _HF, _ExK, _EqK, _All>
+# define __const_iterator__ _Ht_iterator<_Val, _Const_traits<_Val>, _Key, _HF, _ExK, _EqK, _All>
+# else
+# define __size_type__ _STLP_TYPENAME_ON_RETURN_TYPE hashtable<_Val, _Key, _HF, _ExK, _EqK, _All>::size_type
+# define __reference__ _STLP_TYPENAME_ON_RETURN_TYPE hashtable<_Val, _Key, _HF, _ExK, _EqK, _All>::reference
+# define __iterator__ _STLP_TYPENAME_ON_RETURN_TYPE hashtable<_Val, _Key, _HF, _ExK, _EqK, _All>::iterator
+# endif
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK,
+ class _All>
+_Hashtable_node<_Val>*
+_Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>::_M_skip_to_next() {
+ size_t __bucket = _M_ht->_M_bkt_num(_M_cur->_M_val);
+ size_t __h_sz;
+ __h_sz = this->_M_ht->bucket_count();
+
+ _Node* __i=0;
+ while (__i==0 && ++__bucket < __h_sz)
+ __i = (_Node*)_M_ht->_M_buckets[__bucket];
+ return __i;
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK,
+ class _All>
+__size_type__
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::_M_next_size(size_type __n) const {
+ const size_type* __first = (const size_type*)_Stl_prime_type::_M_list;
+ const size_type* __last = (const size_type*)_Stl_prime_type::_M_list + (int)__stl_num_primes;
+ const size_type* pos = __lower_bound(__first, __last, __n, __less((size_type*)0), (ptrdiff_t*)0);
+ return (pos == __last ? *(__last - 1) : *pos);
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+bool
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::_M_equal(
+ const hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>& __ht1,
+ const hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>& __ht2)
+{
+ // typedef _Hashtable_node<_Val> _Node;
+ if (__ht1.bucket_count() != __ht2.bucket_count())
+ return false;
+ for (size_t __n = 0; __n < __ht1.bucket_count(); ++__n) {
+ const _Node* __cur1 = __ht1._M_get_bucket(__n);
+ const _Node* __cur2 = __ht2._M_get_bucket(__n);
+ for ( ; __cur1 && __cur2 && __cur1->_M_val == __cur2->_M_val;
+ __cur1 = __cur1->_M_next, __cur2 = __cur2->_M_next)
+ {}
+ if (__cur1 || __cur2)
+ return false;
+ }
+ return true;
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+pair< _Ht_iterator<_Val, _Nonconst_traits<_Val>, _Key, _HF, _ExK, _EqK, _All> , bool>
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+ ::insert_unique_noresize(const value_type& __obj)
+{
+ const size_type __n = _M_bkt_num(__obj);
+ _Node* __first = (_Node*)_M_buckets[__n];
+
+ for (_Node* __cur = __first; __cur; __cur = __cur->_M_next)
+ if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj)))
+ return pair<iterator, bool>(iterator(__cur, this), false);
+
+ _Node* __tmp = _M_new_node(__obj);
+ __tmp->_M_next = __first;
+ _M_buckets[__n] = __tmp;
+ ++_M_num_elements._M_data;
+ return pair<iterator, bool>(iterator(__tmp, this), true);
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+__iterator__
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+ ::insert_equal_noresize(const value_type& __obj)
+{
+ const size_type __n = _M_bkt_num(__obj);
+ _Node* __first = (_Node*)_M_buckets[__n];
+
+ for (_Node* __cur = __first; __cur; __cur = __cur->_M_next)
+ if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj))) {
+ _Node* __tmp = _M_new_node(__obj);
+ __tmp->_M_next = __cur->_M_next;
+ __cur->_M_next = __tmp;
+ ++_M_num_elements._M_data;
+ return iterator(__tmp, this);
+ }
+
+ _Node* __tmp = _M_new_node(__obj);
+ __tmp->_M_next = __first;
+ _M_buckets[__n] = __tmp;
+ ++_M_num_elements._M_data;
+ return iterator(__tmp, this);
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+__reference__
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::_M_insert(const value_type& __obj)
+{
+ resize(_M_num_elements._M_data + 1);
+
+ size_type __n = _M_bkt_num(__obj);
+ _Node* __first = (_Node*)_M_buckets[__n];
+
+ _Node* __tmp = _M_new_node(__obj);
+ __tmp->_M_next = __first;
+ _M_buckets[__n] = __tmp;
+ ++_M_num_elements._M_data;
+ return __tmp->_M_val;
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+__reference__
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::find_or_insert(const value_type& __obj)
+{
+
+ _Node* __first = _M_find(_M_get_key(__obj));
+ if (__first)
+ return __first->_M_val;
+ else
+ return _M_insert(__obj);
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+pair< _Ht_iterator<_Val, _Nonconst_traits<_Val>, _Key, _HF, _ExK, _EqK, _All>,
+ _Ht_iterator<_Val, _Nonconst_traits<_Val>, _Key, _HF, _ExK, _EqK, _All> >
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::equal_range(const key_type& __key)
+{
+ typedef pair<iterator, iterator> _Pii;
+ const size_type __n = _M_bkt_num_key(__key);
+
+ for (_Node* __first = (_Node*)_M_buckets[__n]; __first; __first = __first->_M_next)
+ if (_M_equals(_M_get_key(__first->_M_val), __key)) {
+ for (_Node* __cur = __first->_M_next; __cur; __cur = __cur->_M_next)
+ if (!_M_equals(_M_get_key(__cur->_M_val), __key))
+ return _Pii(iterator(__first, this), iterator(__cur, this));
+ for (size_type __m = __n + 1; __m < _M_buckets.size(); ++__m)
+ if (_M_buckets[__m])
+ return _Pii(iterator(__first, this),
+ iterator((_Node*)_M_buckets[__m], this));
+ return _Pii(iterator(__first, this), end());
+ }
+ return _Pii(end(), end());
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+pair< _Ht_iterator<_Val, _Const_traits<_Val>, _Key, _HF, _ExK, _EqK, _All>,
+ _Ht_iterator<_Val, _Const_traits<_Val>, _Key, _HF, _ExK, _EqK, _All> >
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+ ::equal_range(const key_type& __key) const
+{
+ typedef pair<const_iterator, const_iterator> _Pii;
+ const size_type __n = _M_bkt_num_key(__key);
+
+ for (const _Node* __first = (_Node*)_M_buckets[__n] ;
+ __first;
+ __first = __first->_M_next) {
+ if (_M_equals(_M_get_key(__first->_M_val), __key)) {
+ for (const _Node* __cur = __first->_M_next;
+ __cur;
+ __cur = __cur->_M_next)
+ if (!_M_equals(_M_get_key(__cur->_M_val), __key))
+ return _Pii(const_iterator(__first, this),
+ const_iterator(__cur, this));
+ for (size_type __m = __n + 1; __m < _M_buckets.size(); ++__m)
+ if (_M_buckets[__m])
+ return _Pii(const_iterator(__first, this),
+ const_iterator((_Node*)_M_buckets[__m], this));
+ return _Pii(const_iterator(__first, this), end());
+ }
+ }
+ return _Pii(end(), end());
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+__size_type__
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::erase(const key_type& __key)
+{
+ const size_type __n = _M_bkt_num_key(__key);
+ _Node* __first = (_Node*)_M_buckets[__n];
+ size_type __erased = 0;
+
+ if (__first) {
+ _Node* __cur = __first;
+ _Node* __next = __cur->_M_next;
+ while (__next) {
+ if (_M_equals(_M_get_key(__next->_M_val), __key)) {
+ __cur->_M_next = __next->_M_next;
+ _M_delete_node(__next);
+ __next = __cur->_M_next;
+ ++__erased;
+ --_M_num_elements._M_data;
+ }
+ else {
+ __cur = __next;
+ __next = __cur->_M_next;
+ }
+ }
+ if (_M_equals(_M_get_key(__first->_M_val), __key)) {
+ _M_buckets[__n] = __first->_M_next;
+ _M_delete_node(__first);
+ ++__erased;
+ --_M_num_elements._M_data;
+ }
+ }
+ return __erased;
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::erase(const const_iterator& __it)
+{
+ // const iterator& __it = __REINTERPRET_CAST(const iterator&,_c_it);
+ const _Node* __p = __it._M_cur;
+ if (__p) {
+ const size_type __n = _M_bkt_num(__p->_M_val);
+ _Node* __cur = (_Node*)_M_buckets[__n];
+
+ if (__cur == __p) {
+ _M_buckets[__n] = __cur->_M_next;
+ _M_delete_node(__cur);
+ --_M_num_elements._M_data;
+ }
+ else {
+ _Node* __next = __cur->_M_next;
+ while (__next) {
+ if (__next == __p) {
+ __cur->_M_next = __next->_M_next;
+ _M_delete_node(__next);
+ --_M_num_elements._M_data;
+ break;
+ }
+ else {
+ __cur = __next;
+ __next = __cur->_M_next;
+ }
+ }
+ }
+ }
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+ ::erase(const_iterator _c_first, const_iterator _c_last)
+{
+ iterator& __first = (iterator&)_c_first;
+ iterator& __last = (iterator&)_c_last;
+ size_type __f_bucket = __first._M_cur ?
+ _M_bkt_num(__first._M_cur->_M_val) : _M_buckets.size();
+ size_type __l_bucket = __last._M_cur ?
+ _M_bkt_num(__last._M_cur->_M_val) : _M_buckets.size();
+ if (__first._M_cur == __last._M_cur)
+ return;
+ else if (__f_bucket == __l_bucket)
+ _M_erase_bucket(__f_bucket, __first._M_cur, __last._M_cur);
+ else {
+ _M_erase_bucket(__f_bucket, __first._M_cur, 0);
+ for (size_type __n = __f_bucket + 1; __n < __l_bucket; ++__n)
+ _M_erase_bucket(__n, 0);
+ if (__l_bucket != _M_buckets.size())
+ _M_erase_bucket(__l_bucket, __last._M_cur);
+ }
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+ ::resize(size_type __num_elements_hint)
+{
+ const size_type __old_n = _M_buckets.size();
+ if (__num_elements_hint > __old_n) {
+ const size_type __n = _M_next_size(__num_elements_hint);
+ if (__n > __old_n) {
+ _BucketVector __tmp(__n, (void*)(0),
+ _M_buckets.get_allocator());
+ _STLP_TRY {
+ for (size_type __bucket = 0; __bucket < __old_n; ++__bucket) {
+ _Node* __first = (_Node*)_M_buckets[__bucket];
+ while (__first) {
+ size_type __new_bucket = _M_bkt_num(__first->_M_val, __n);
+ _M_buckets[__bucket] = __first->_M_next;
+ __first->_M_next = (_Node*)__tmp[__new_bucket];
+ __tmp[__new_bucket] = __first;
+ __first = (_Node*)_M_buckets[__bucket];
+ }
+ }
+ _M_buckets.swap(__tmp);
+ }
+# ifdef _STLP_USE_EXCEPTIONS
+ catch(...) {
+ for (size_type __bucket = 0; __bucket < __tmp.size(); ++__bucket) {
+ while (__tmp[__bucket]) {
+ _Node* __next = ((_Node*)__tmp[__bucket])->_M_next;
+ _M_delete_node((_Node*)__tmp[__bucket]);
+ __tmp[__bucket] = __next;
+ }
+ }
+ throw;
+ }
+# endif /* _STLP_USE_EXCEPTIONS */
+ }
+ }
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+ ::_M_erase_bucket(const size_type __n, _Node* __first, _Node* __last)
+{
+ _Node* __cur = (_Node*)_M_buckets[__n];
+ if (__cur == __first)
+ _M_erase_bucket(__n, __last);
+ else {
+ _Node* __next;
+ for (__next = __cur->_M_next;
+ __next != __first;
+ __cur = __next, __next = __cur->_M_next)
+ ;
+ while (__next != __last) {
+ __cur->_M_next = __next->_M_next;
+ _M_delete_node(__next);
+ __next = __cur->_M_next;
+ --_M_num_elements._M_data;
+ }
+ }
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+ ::_M_erase_bucket(const size_type __n, _Node* __last)
+{
+ _Node* __cur = (_Node*)_M_buckets[__n];
+ while (__cur && __cur != __last) {
+ _Node* __next = __cur->_M_next;
+ _M_delete_node(__cur);
+ __cur = __next;
+ _M_buckets[__n] = __cur;
+ --_M_num_elements._M_data;
+ }
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::clear()
+{
+ for (size_type __i = 0; __i < _M_buckets.size(); ++__i) {
+ _Node* __cur = (_Node*)_M_buckets[__i];
+ while (__cur != 0) {
+ _Node* __next = __cur->_M_next;
+ _M_delete_node(__cur);
+ __cur = __next;
+ }
+ _M_buckets[__i] = 0;
+ }
+ _M_num_elements._M_data = 0;
+}
+
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+ ::_M_copy_from(const hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>& __ht)
+{
+ _M_buckets.clear();
+ _M_buckets.reserve(__ht._M_buckets.size());
+ _M_buckets.insert(_M_buckets.end(), __ht._M_buckets.size(), (void*) 0);
+ _STLP_TRY {
+ for (size_type __i = 0; __i < __ht._M_buckets.size(); ++__i) {
+ const _Node* __cur = (_Node*)__ht._M_buckets[__i];
+ if (__cur) {
+ _Node* __xcopy = _M_new_node(__cur->_M_val);
+ _M_buckets[__i] = __xcopy;
+
+ for (_Node* __next = __cur->_M_next;
+ __next;
+ __cur = __next, __next = __cur->_M_next) {
+ __xcopy->_M_next = _M_new_node(__next->_M_val);
+ __xcopy = __xcopy->_M_next;
+ }
+ }
+ }
+ _M_num_elements._M_data = __ht._M_num_elements._M_data;
+ }
+ _STLP_UNWIND(clear());
+}
+
+# undef __iterator__
+# undef const_iterator
+# undef __size_type__
+# undef __reference__
+# undef size_type
+# undef value_type
+# undef key_type
+# undef _Node
+# undef __stl_num_primes
+# undef hashtable
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_HASHTABLE_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_hashtable.h b/src/STLport/stl/_hashtable.h
new file mode 100644
index 0000000..9efe721
--- /dev/null
+++ b/src/STLport/stl/_hashtable.h
@@ -0,0 +1,613 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_HASHTABLE_H
+#define _STLP_INTERNAL_HASHTABLE_H
+
+# ifndef _STLP_INTERNAL_VECTOR_H
+# include <stl/_vector.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_FUNCTION_H
+# include <stl/_function_base.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_HASH_FUN_H
+# include <stl/_hash_fun.h>
+# endif
+
+// Hashtable class, used to implement the hashed associative containers
+// hash_set, hash_map, hash_multiset, and hash_multimap.
+
+#ifdef _STLP_DEBUG
+# define hashtable __WORKAROUND_DBG_RENAME(hashtable)
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Val>
+struct _Hashtable_node
+{
+ typedef _Hashtable_node<_Val> _Self;
+ _Self* _M_next;
+ _Val _M_val;
+ __TRIVIAL_STUFF(_Hashtable_node)
+};
+
+// some compilers require the names of template parameters to be the same
+template <class _Val, class _Key, class _HF,
+ class _ExK, class _EqK, class _All>
+class hashtable;
+
+template <class _Val, class _Key, class _HF,
+ class _ExK, class _EqK, class _All>
+struct _Hashtable_iterator
+{
+ typedef hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+ _Hashtable;
+ typedef _Hashtable_node<_Val> _Node;
+
+ _Node* _M_cur;
+ _Hashtable* _M_ht;
+
+ _Hashtable_iterator(_Node* __n, _Hashtable* __tab)
+ : _M_cur(__n), _M_ht(__tab) {}
+ _Hashtable_iterator() {}
+
+ _Node* _M_skip_to_next();
+};
+
+
+template <class _Val, class _Traits, class _Key, class _HF,
+ class _ExK, class _EqK, class _All>
+struct _Ht_iterator : public _Hashtable_iterator< _Val, _Key,_HF, _ExK,_EqK,_All>
+{
+
+ typedef _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All> _Base;
+
+ // typedef _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All> iterator;
+ // typedef _Ht_iterator<_Val, _Const_traits<_Val>,_Key,_HF,_ExK,_EqK,_All> const_iterator;
+ typedef _Ht_iterator<_Val, _Traits,_Key,_HF,_ExK,_EqK,_All> _Self;
+
+ typedef hashtable<_Val,_Key,_HF,_ExK,_EqK,_All> _Hashtable;
+ typedef _Hashtable_node<_Val> _Node;
+
+ typedef _Val value_type;
+ typedef forward_iterator_tag iterator_category;
+ typedef ptrdiff_t difference_type;
+ typedef size_t size_type;
+ typedef typename _Traits::reference reference;
+ typedef typename _Traits::pointer pointer;
+
+ _Ht_iterator(const _Node* __n, const _Hashtable* __tab) :
+ _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>((_Node*)__n, (_Hashtable*)__tab) {}
+ _Ht_iterator() {}
+ _Ht_iterator(const _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __it) :
+ _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>(__it) {}
+
+ reference operator*() const {
+ return this->_M_cur->_M_val;
+ }
+ _STLP_DEFINE_ARROW_OPERATOR
+
+ _Self& operator++() {
+ _Node* __n = this->_M_cur->_M_next;
+ this->_M_cur = (__n !=0 ? __n : this->_M_skip_to_next());
+ return *this;
+ }
+ inline _Self operator++(int) {
+ _Self __tmp = *this;
+ ++*this;
+ return __tmp;
+ }
+};
+
+template <class _Val, class _Traits, class _Traits1, class _Key, class _HF,
+ class _ExK, class _EqK, class _All>
+inline bool
+operator==(const _Ht_iterator<_Val, _Traits,_Key,_HF,_ExK,_EqK,_All>& __x,
+ const _Ht_iterator<_Val, _Traits1,_Key,_HF,_ExK,_EqK,_All>& __y) {
+ return __x._M_cur == __y._M_cur;
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+template <class _Val, class _Key, class _HF,
+ class _ExK, class _EqK, class _All>
+inline bool
+operator!=(const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>& __x,
+ const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>& __y) {
+ return __x._M_cur != __y._M_cur;
+}
+#else
+
+# if (defined (__GNUC__) && (__GNUC_MINOR__ < 8))
+template <class _Val, class _Key, class _HF,
+ class _ExK, class _EqK, class _All>
+inline bool
+operator!=(const _Ht_iterator<_Val, _Const_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __x,
+ const _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __y) {
+ return __x._M_cur != __y._M_cur;
+}
+# endif
+
+template <class _Val, class _Key, class _HF,
+ class _ExK, class _EqK, class _All>
+inline bool
+operator!=(const _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __x,
+ const _Ht_iterator<_Val, _Const_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __y) {
+ return __x._M_cur != __y._M_cur;
+}
+#endif
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _Val, class _Traits, class _Key, class _HF, class _ExK, class _EqK, class _All>
+inline _Val* value_type(const _Ht_iterator<_Val, _Traits,_Key,_HF,_ExK,_EqK,_All>&) { return (_Val*) 0; }
+template <class _Val, class _Traits, class _Key, class _HF, class _ExK, class _EqK, class _All>
+inline forward_iterator_tag iterator_category(const _Ht_iterator<_Val, _Traits,_Key,_HF,_ExK,_EqK,_All>&) { return forward_iterator_tag(); }
+template <class _Val, class _Traits, class _Key, class _HF, class _ExK, class _EqK, class _All>
+inline ptrdiff_t* distance_type(const _Ht_iterator<_Val,_Traits,_Key,_HF,_ExK,_EqK,_All>&) { return (ptrdiff_t*) 0; }
+#endif
+
+#define __stl_num_primes 28
+template <class _Tp>
+class _Stl_prime {
+public:
+ static const size_t _M_list[__stl_num_primes];
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _Stl_prime<bool>;
+# endif
+
+typedef _Stl_prime<bool> _Stl_prime_type;
+
+
+// Hashtables handle allocators a bit differently than other containers
+// do. If we're using standard-conforming allocators, then a hashtable
+// unconditionally has a member variable to hold its allocator, even if
+// it so happens that all instances of the allocator type are identical.
+// This is because, for hashtables, this extra storage is negligible.
+// Additionally, a base class wouldn't serve any other purposes; it
+// wouldn't, for example, simplify the exception-handling code.
+template <class _Val, class _Key, class _HF,
+ class _ExK, class _EqK, class _All>
+class hashtable {
+ typedef hashtable<_Val, _Key, _HF, _ExK, _EqK, _All> _Self;
+public:
+ typedef _Key key_type;
+ typedef _Val value_type;
+ typedef _HF hasher;
+ typedef _EqK key_equal;
+
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef forward_iterator_tag _Iterator_category;
+
+ hasher hash_funct() const { return _M_hash; }
+ key_equal key_eq() const { return _M_equals; }
+
+private:
+ typedef _Hashtable_node<_Val> _Node;
+
+private:
+ _STLP_FORCE_ALLOCATORS(_Val, _All)
+ typedef typename _Alloc_traits<_Node, _All>::allocator_type _M_node_allocator_type;
+ typedef typename _Alloc_traits<void*, _All>::allocator_type _M_node_ptr_allocator_type;
+ typedef __vector__<void*, _M_node_ptr_allocator_type> _BucketVector;
+public:
+ typedef typename _Alloc_traits<_Val,_All>::allocator_type allocator_type;
+ allocator_type get_allocator() const {
+ return _STLP_CONVERT_ALLOCATOR((const _M_node_allocator_type&)_M_num_elements, _Val);
+ }
+private:
+ hasher _M_hash;
+ key_equal _M_equals;
+ _ExK _M_get_key;
+ _BucketVector _M_buckets;
+ _STLP_alloc_proxy<size_type, _Node, _M_node_allocator_type> _M_num_elements;
+ const _Node* _M_get_bucket(size_t __n) const { return (_Node*)_M_buckets[__n]; }
+
+public:
+ typedef _Const_traits<_Val> __const_val_traits;
+ typedef _Nonconst_traits<_Val> __nonconst_val_traits;
+ typedef _Ht_iterator<_Val, __const_val_traits,_Key,_HF,_ExK,_EqK, _All> const_iterator;
+ typedef _Ht_iterator<_Val, __nonconst_val_traits,_Key,_HF,_ExK,_EqK,_All> iterator;
+ friend struct _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>;
+ friend struct _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>;
+ friend struct _Ht_iterator<_Val, _Const_traits<_Val>,_Key,_HF,_ExK,_EqK, _All>;
+
+public:
+ hashtable(size_type __n,
+ const _HF& __hf,
+ const _EqK& __eql,
+ const _ExK& __ext,
+ const allocator_type& __a = allocator_type())
+ :
+ _M_hash(__hf),
+ _M_equals(__eql),
+ _M_get_key(__ext),
+ _M_buckets(_STLP_CONVERT_ALLOCATOR(__a,void*)),
+ _M_num_elements(_STLP_CONVERT_ALLOCATOR(__a,_Node), (size_type)0)
+ {
+ _M_initialize_buckets(__n);
+ }
+
+ hashtable(size_type __n,
+ const _HF& __hf,
+ const _EqK& __eql,
+ const allocator_type& __a = allocator_type())
+ :
+ _M_hash(__hf),
+ _M_equals(__eql),
+ _M_get_key(_ExK()),
+ _M_buckets(_STLP_CONVERT_ALLOCATOR(__a,void*)),
+ _M_num_elements(_STLP_CONVERT_ALLOCATOR(__a,_Node), (size_type)0)
+ {
+ _M_initialize_buckets(__n);
+ }
+
+ hashtable(const _Self& __ht)
+ :
+ _M_hash(__ht._M_hash),
+ _M_equals(__ht._M_equals),
+ _M_get_key(__ht._M_get_key),
+ _M_buckets(_STLP_CONVERT_ALLOCATOR(__ht.get_allocator(),void*)),
+ _M_num_elements((const _M_node_allocator_type&)__ht._M_num_elements, (size_type)0)
+ {
+ _M_copy_from(__ht);
+ }
+
+ _Self& operator= (const _Self& __ht)
+ {
+ if (&__ht != this) {
+ clear();
+ _M_hash = __ht._M_hash;
+ _M_equals = __ht._M_equals;
+ _M_get_key = __ht._M_get_key;
+ _M_copy_from(__ht);
+ }
+ return *this;
+ }
+
+ ~hashtable() { clear(); }
+
+ size_type size() const { return _M_num_elements._M_data; }
+ size_type max_size() const { return size_type(-1); }
+ bool empty() const { return size() == 0; }
+
+ void swap(_Self& __ht)
+ {
+ _STLP_STD::swap(_M_hash, __ht._M_hash);
+ _STLP_STD::swap(_M_equals, __ht._M_equals);
+ _STLP_STD::swap(_M_get_key, __ht._M_get_key);
+ _M_buckets.swap(__ht._M_buckets);
+ _STLP_STD::swap(_M_num_elements, __ht._M_num_elements);
+ }
+
+ iterator begin()
+ {
+ for (size_type __n = 0; __n < _M_buckets.size(); ++__n)
+ if (_M_buckets[__n])
+ return iterator((_Node*)_M_buckets[__n], this);
+ return end();
+ }
+
+ iterator end() { return iterator((_Node*)0, this); }
+
+ const_iterator begin() const
+ {
+ for (size_type __n = 0; __n < _M_buckets.size(); ++__n)
+ if (_M_buckets[__n])
+ return const_iterator((_Node*)_M_buckets[__n], this);
+ return end();
+ }
+
+ const_iterator end() const { return const_iterator((_Node*)0, this); }
+
+ static bool _STLP_CALL _M_equal (const hashtable<_Val, _Key, _HF, _ExK, _EqK, _All>&,
+ const hashtable<_Val, _Key, _HF, _ExK, _EqK, _All>&);
+
+public:
+
+ size_type bucket_count() const { return _M_buckets.size(); }
+
+ size_type max_bucket_count() const
+ { return _Stl_prime_type::_M_list[(int)__stl_num_primes - 1]; }
+
+ size_type elems_in_bucket(size_type __bucket) const
+ {
+ size_type __result = 0;
+ for (_Node* __cur = (_Node*)_M_buckets[__bucket]; __cur; __cur = __cur->_M_next)
+ __result += 1;
+ return __result;
+ }
+
+ pair<iterator, bool> insert_unique(const value_type& __obj)
+ {
+ resize(_M_num_elements._M_data + 1);
+ return insert_unique_noresize(__obj);
+ }
+
+ iterator insert_equal(const value_type& __obj)
+ {
+ resize(_M_num_elements._M_data + 1);
+ return insert_equal_noresize(__obj);
+ }
+
+ pair<iterator, bool> insert_unique_noresize(const value_type& __obj);
+ iterator insert_equal_noresize(const value_type& __obj);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void insert_unique(_InputIterator __f, _InputIterator __l)
+ {
+ insert_unique(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIterator));
+ }
+
+ template <class _InputIterator>
+ void insert_equal(_InputIterator __f, _InputIterator __l)
+ {
+ insert_equal(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIterator));
+ }
+
+ template <class _InputIterator>
+ void insert_unique(_InputIterator __f, _InputIterator __l,
+ const input_iterator_tag &)
+ {
+ for ( ; __f != __l; ++__f)
+ insert_unique(*__f);
+ }
+
+ template <class _InputIterator>
+ void insert_equal(_InputIterator __f, _InputIterator __l,
+ const input_iterator_tag &)
+ {
+ for ( ; __f != __l; ++__f)
+ insert_equal(*__f);
+ }
+
+ template <class _ForwardIterator>
+ void insert_unique(_ForwardIterator __f, _ForwardIterator __l,
+ const forward_iterator_tag &)
+ {
+ size_type __n = distance(__f, __l);
+ resize(_M_num_elements._M_data + __n);
+ for ( ; __n > 0; --__n, ++__f)
+ insert_unique_noresize(*__f);
+ }
+
+ template <class _ForwardIterator>
+ void insert_equal(_ForwardIterator __f, _ForwardIterator __l,
+ const forward_iterator_tag &)
+ {
+ size_type __n = distance(__f, __l);
+ resize(_M_num_elements._M_data + __n);
+ for ( ; __n > 0; --__n, ++__f)
+ insert_equal_noresize(*__f);
+ }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+ void insert_unique(const value_type* __f, const value_type* __l)
+ {
+ size_type __n = __l - __f;
+ resize(_M_num_elements._M_data + __n);
+ for ( ; __n > 0; --__n, ++__f)
+ insert_unique_noresize(*__f);
+ }
+
+ void insert_equal(const value_type* __f, const value_type* __l)
+ {
+ size_type __n = __l - __f;
+ resize(_M_num_elements._M_data + __n);
+ for ( ; __n > 0; --__n, ++__f)
+ insert_equal_noresize(*__f);
+ }
+
+ void insert_unique(const_iterator __f, const_iterator __l)
+ {
+ size_type __n = distance(__f, __l);
+ resize(_M_num_elements._M_data + __n);
+ for ( ; __n > 0; --__n, ++__f)
+ insert_unique_noresize(*__f);
+ }
+
+ void insert_equal(const_iterator __f, const_iterator __l)
+ {
+ size_type __n = distance(__f, __l);
+ resize(_M_num_elements._M_data + __n);
+ for ( ; __n > 0; --__n, ++__f)
+ insert_equal_noresize(*__f);
+ }
+#endif /*_STLP_MEMBER_TEMPLATES */
+
+ reference find_or_insert(const value_type& __obj);
+
+private:
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS ) && !(defined(__MRC__)||(defined(__SC__)&&!defined(__DMC_)))
+ template <class _KT>
+ _Node* _M_find(const _KT& __key) const
+# else
+ _Node* _M_find(const key_type& __key) const
+# endif
+ {
+ size_type __n = _M_hash(__key)% _M_buckets.size();
+ _Node* __first;
+ for ( __first = (_Node*)_M_buckets[__n];
+ __first && !_M_equals(_M_get_key(__first->_M_val), __key);
+ __first = __first->_M_next)
+ {}
+ return __first;
+ }
+
+public:
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS ) && !(defined(__MRC__)||(defined(__SC__)&&!defined(__DMC__)))
+ template <class _KT>
+ iterator find(const _KT& __key)
+# else
+ iterator find(const key_type& __key)
+# endif
+ {
+ return iterator(_M_find(__key), this);
+ }
+
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS ) && !(defined(__MRC__)||(defined(__SC__)&&!defined(__DMC__)))
+ template <class _KT>
+ const_iterator find(const _KT& __key) const
+# else
+ const_iterator find(const key_type& __key) const
+# endif
+ {
+ return const_iterator(_M_find(__key), this);
+ }
+
+ size_type count(const key_type& __key) const
+ {
+ const size_type __n = _M_bkt_num_key(__key);
+ size_type __result = 0;
+
+ for (const _Node* __cur = (_Node*)_M_buckets[__n]; __cur; __cur = __cur->_M_next)
+ if (_M_equals(_M_get_key(__cur->_M_val), __key))
+ ++__result;
+ return __result;
+ }
+
+ pair<iterator, iterator>
+ equal_range(const key_type& __key);
+
+ pair<const_iterator, const_iterator>
+ equal_range(const key_type& __key) const;
+
+ size_type erase(const key_type& __key);
+ // void erase(const iterator& __it); `
+ void erase(const const_iterator& __it) ;
+
+ // void erase(const const_iterator& __first, const const_iterator __last) {
+ // erase((const iterator&)__first, (const iterator&)__last);
+ // }
+ void erase(const_iterator __first, const_iterator __last);
+ void resize(size_type __num_elements_hint);
+ void clear();
+
+public:
+ // this is for hash_map::operator[]
+ reference _M_insert(const value_type& __obj);
+
+private:
+
+ size_type _M_next_size(size_type __n) const;
+
+ void _M_initialize_buckets(size_type __n)
+ {
+ const size_type __n_buckets = _M_next_size(__n);
+ _M_buckets.reserve(__n_buckets);
+ _M_buckets.insert(_M_buckets.end(), __n_buckets, (void*) 0);
+ _M_num_elements._M_data = 0;
+ }
+
+ size_type _M_bkt_num_key(const key_type& __key) const
+ {
+ return _M_bkt_num_key(__key, _M_buckets.size());
+ }
+
+ size_type _M_bkt_num(const value_type& __obj) const
+ {
+ return _M_bkt_num_key(_M_get_key(__obj));
+ }
+
+ size_type _M_bkt_num_key(const key_type& __key, size_t __n) const
+ {
+ return _M_hash(__key) % __n;
+ }
+
+ size_type _M_bkt_num(const value_type& __obj, size_t __n) const
+ {
+ return _M_bkt_num_key(_M_get_key(__obj), __n);
+ }
+
+ _Node* _M_new_node(const value_type& __obj)
+ {
+ _Node* __n = _M_num_elements.allocate(1);
+ __n->_M_next = 0;
+ _STLP_TRY {
+ _Construct(&__n->_M_val, __obj);
+ // return __n;
+ }
+ _STLP_UNWIND(_M_num_elements.deallocate(__n, 1));
+ return __n;
+ }
+
+ void _M_delete_node(_Node* __n)
+ {
+ _STLP_STD::_Destroy(&__n->_M_val);
+ _M_num_elements.deallocate(__n, 1);
+ }
+
+ void _M_erase_bucket(const size_type __n, _Node* __first, _Node* __last);
+ void _M_erase_bucket(const size_type __n, _Node* __last);
+
+ void _M_copy_from(const _Self& __ht);
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+#define _STLP_TEMPLATE_CONTAINER hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+#include <stl/_relops_hash_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+
+# undef hashtable
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_hashtable.c>
+# endif
+
+# if defined (_STLP_DEBUG)
+# include <stl/debug/_hashtable.h>
+# endif
+
+#endif /* _STLP_INTERNAL_HASHTABLE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
+
diff --git a/src/STLport/stl/_heap.c b/src/STLport/stl/_heap.c
new file mode 100644
index 0000000..21e087c
--- /dev/null
+++ b/src/STLport/stl/_heap.c
@@ -0,0 +1,242 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_HEAP_C
+#define _STLP_HEAP_C
+
+#ifndef _STLP_INTERNAL_HEAP_H
+# include <stl/_heap.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _RandomAccessIterator, class _Distance, class _Tp>
+_STLP_INLINE_LOOP
+void
+__push_heap(_RandomAccessIterator __first,
+ _Distance __holeIndex, _Distance __topIndex, _Tp __val)
+{
+ _Distance __parent = (__holeIndex - 1) / 2;
+ while (__holeIndex > __topIndex && *(__first + __parent) < __val) {
+ *(__first + __holeIndex) = *(__first + __parent);
+ __holeIndex = __parent;
+ __parent = (__holeIndex - 1) / 2;
+ }
+ *(__first + __holeIndex) = __val;
+}
+
+template <class _RandomAccessIterator, class _Distance, class _Tp>
+inline void
+__push_heap_aux(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Distance*, _Tp*)
+{
+ __push_heap(__first, _Distance((__last - __first) - 1), _Distance(0),
+ _Tp(*(__last - 1)));
+}
+
+template <class _RandomAccessIterator>
+void
+push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+{
+ __push_heap_aux(__first, __last,
+ _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator), _STLP_VALUE_TYPE(__first, _RandomAccessIterator));
+}
+
+
+template <class _RandomAccessIterator, class _Distance, class _Tp,
+ class _Compare>
+_STLP_INLINE_LOOP
+void
+__push_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __topIndex, _Tp __val, _Compare __comp)
+{
+ _Distance __parent = (__holeIndex - 1) / 2;
+ while (__holeIndex > __topIndex && __comp(*(__first + __parent), __val)) {
+ *(__first + __holeIndex) = *(__first + __parent);
+ __holeIndex = __parent;
+ __parent = (__holeIndex - 1) / 2;
+ }
+ *(__first + __holeIndex) = __val;
+}
+
+template <class _RandomAccessIterator, class _Compare,
+ class _Distance, class _Tp>
+inline void
+__push_heap_aux(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp,
+ _Distance*, _Tp*)
+{
+ __push_heap(__first, _Distance((__last - __first) - 1), _Distance(0),
+ _Tp(*(__last - 1)), __comp);
+}
+
+template <class _RandomAccessIterator, class _Compare>
+void
+push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+{
+ __push_heap_aux(__first, __last, __comp,
+ _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator), _STLP_VALUE_TYPE(__first, _RandomAccessIterator));
+}
+
+template <class _RandomAccessIterator, class _Distance, class _Tp>
+void
+__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __len, _Tp __val) {
+ _Distance __topIndex = __holeIndex;
+ _Distance __secondChild = 2 * __holeIndex + 2;
+ while (__secondChild < __len) {
+ if (*(__first + __secondChild) < *(__first + (__secondChild - 1)))
+ __secondChild--;
+ *(__first + __holeIndex) = *(__first + __secondChild);
+ __holeIndex = __secondChild;
+ __secondChild = 2 * (__secondChild + 1);
+ }
+ if (__secondChild == __len) {
+ *(__first + __holeIndex) = *(__first + (__secondChild - 1));
+ __holeIndex = __secondChild - 1;
+ }
+ __push_heap(__first, __holeIndex, __topIndex, __val);
+}
+
+
+template <class _RandomAccessIterator, class _Tp>
+inline void
+__pop_heap_aux(_RandomAccessIterator __first, _RandomAccessIterator __last, _Tp*) {
+ __pop_heap(__first, __last - 1, __last - 1,
+ _Tp(*(__last - 1)), _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator));
+}
+
+template <class _RandomAccessIterator>
+void pop_heap(_RandomAccessIterator __first,
+ _RandomAccessIterator __last) {
+ __pop_heap_aux(__first, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIterator));
+}
+
+template <class _RandomAccessIterator, class _Distance,
+ class _Tp, class _Compare>
+void
+__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __len, _Tp __val, _Compare __comp)
+{
+ _Distance __topIndex = __holeIndex;
+ _Distance __secondChild = 2 * __holeIndex + 2;
+ while (__secondChild < __len) {
+ if (__comp(*(__first + __secondChild), *(__first + (__secondChild - 1))))
+ __secondChild--;
+ *(__first + __holeIndex) = *(__first + __secondChild);
+ __holeIndex = __secondChild;
+ __secondChild = 2 * (__secondChild + 1);
+ }
+ if (__secondChild == __len) {
+ *(__first + __holeIndex) = *(__first + (__secondChild - 1));
+ __holeIndex = __secondChild - 1;
+ }
+ __push_heap(__first, __holeIndex, __topIndex, __val, __comp);
+}
+
+
+template <class _RandomAccessIterator, class _Tp, class _Compare>
+inline void
+__pop_heap_aux(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Tp*, _Compare __comp)
+{
+ __pop_heap(__first, __last - 1, __last - 1, _Tp(*(__last - 1)), __comp,
+ _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator));
+}
+
+
+template <class _RandomAccessIterator, class _Compare>
+void
+pop_heap(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+{
+ __pop_heap_aux(__first, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIterator), __comp);
+}
+
+template <class _RandomAccessIterator, class _Tp, class _Distance>
+_STLP_INLINE_LOOP
+void
+__make_heap(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Tp*, _Distance*)
+{
+ if (__last - __first < 2) return;
+ _Distance __len = __last - __first;
+ _Distance __parent = (__len - 2)/2;
+
+ while (true) {
+ __adjust_heap(__first, __parent, __len, _Tp(*(__first + __parent)));
+ if (__parent == 0) return;
+ __parent--;
+ }
+}
+
+template <class _RandomAccessIterator>
+void
+make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+{
+ __make_heap(__first, __last,
+ _STLP_VALUE_TYPE(__first, _RandomAccessIterator), _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator));
+}
+
+template <class _RandomAccessIterator, class _Compare,
+ class _Tp, class _Distance>
+_STLP_INLINE_LOOP
+void
+__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp, _Tp*, _Distance*)
+{
+ if (__last - __first < 2) return;
+ _Distance __len = __last - __first;
+ _Distance __parent = (__len - 2)/2;
+
+ while (true) {
+ __adjust_heap(__first, __parent, __len, _Tp(*(__first + __parent)),
+ __comp);
+ if (__parent == 0) return;
+ __parent--;
+ }
+}
+
+template <class _RandomAccessIterator, class _Compare>
+void
+make_heap(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+{
+ __make_heap(__first, __last, __comp,
+ _STLP_VALUE_TYPE(__first, _RandomAccessIterator), _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator));
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_HEAP_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_heap.h b/src/STLport/stl/_heap.h
new file mode 100644
index 0000000..fbf6337
--- /dev/null
+++ b/src/STLport/stl/_heap.h
@@ -0,0 +1,129 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_HEAP_H
+#define _STLP_INTERNAL_HEAP_H
+
+#ifndef _STLP_CONFIG_H
+#include <stl/_config.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap.
+
+template <class _RandomAccessIterator>
+void
+push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last);
+
+
+template <class _RandomAccessIterator, class _Compare>
+void
+push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp);
+
+template <class _RandomAccessIterator, class _Distance, class _Tp>
+void
+__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __len, _Tp __val);
+
+template <class _RandomAccessIterator, class _Tp, class _Distance>
+inline void
+__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _RandomAccessIterator __result, _Tp __val, _Distance*)
+{
+ *__result = *__first;
+ __adjust_heap(__first, _Distance(0), _Distance(__last - __first), __val);
+}
+
+template <class _RandomAccessIterator>
+void pop_heap(_RandomAccessIterator __first,
+ _RandomAccessIterator __last);
+
+template <class _RandomAccessIterator, class _Distance,
+ class _Tp, class _Compare>
+void
+__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __len, _Tp __val, _Compare __comp);
+
+template <class _RandomAccessIterator, class _Tp, class _Compare,
+ class _Distance>
+inline void
+__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _RandomAccessIterator __result, _Tp __val, _Compare __comp,
+ _Distance*)
+{
+ *__result = *__first;
+ __adjust_heap(__first, _Distance(0), _Distance(__last - __first),
+ __val, __comp);
+}
+
+template <class _RandomAccessIterator, class _Compare>
+void
+pop_heap(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp);
+
+template <class _RandomAccessIterator>
+void
+make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last);
+
+template <class _RandomAccessIterator, class _Compare>
+void
+make_heap(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp);
+
+template <class _RandomAccessIterator>
+_STLP_INLINE_LOOP
+void sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+{
+ while (__last - __first > 1)
+ pop_heap(__first, __last--);
+}
+
+template <class _RandomAccessIterator, class _Compare>
+_STLP_INLINE_LOOP
+void
+sort_heap(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+{
+ while (__last - __first > 1)
+ pop_heap(__first, __last--, __comp);
+}
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_heap.c>
+# endif
+
+#endif /* _STLP_INTERNAL_HEAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_ios.c b/src/STLport/stl/_ios.c
new file mode 100644
index 0000000..04076f0
--- /dev/null
+++ b/src/STLport/stl/_ios.c
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_IOS_C
+#define _STLP_IOS_C
+
+#ifndef _STLP_INTERNAL_IOS_H
+# include <stl/_ios.h>
+#endif
+
+#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+# include <stl/_streambuf.h>
+#endif
+
+#ifndef _STLP_INTERNAL_NUMPUNCT_H
+# include <stl/_numpunct.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// basic_ios<>'s non-inline member functions
+
+// Public constructor, taking a streambuf.
+template <class _CharT, class _Traits>
+basic_ios<_CharT, _Traits>
+ ::basic_ios(basic_streambuf<_CharT, _Traits>* __streambuf)
+ : ios_base(),
+ _M_fill(_STLP_NULL_CHAR_INIT(_CharT)), _M_streambuf(0), _M_tied_ostream(0)
+{
+ init(__streambuf);
+}
+
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>*
+basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<_CharT, _Traits>* __buf)
+{
+ basic_streambuf<_CharT, _Traits>* __tmp = _M_streambuf;
+ _M_streambuf = __buf;
+ this->clear();
+ return __tmp;
+}
+
+template <class _CharT, class _Traits>
+basic_ios<_CharT, _Traits>&
+basic_ios<_CharT, _Traits>::copyfmt(const basic_ios<_CharT, _Traits>& __x)
+{
+ _M_invoke_callbacks(erase_event);
+ _M_copy_state(__x); // Inherited from ios_base.
+ _M_fill = __x._M_fill;
+ _M_tied_ostream = __x._M_tied_ostream;
+ _M_invoke_callbacks(copyfmt_event);
+ this->_M_set_exception_mask(__x.exceptions());
+ return *this;
+}
+
+template <class _CharT, class _Traits>
+locale basic_ios<_CharT, _Traits>::imbue(const locale& __loc)
+{
+ locale __tmp = ios_base::imbue(__loc);
+
+ if (_M_streambuf)
+ _M_streambuf->pubimbue(__loc);
+
+ // no throwing here
+ this->_M_cached_ctype = __loc._M_get_facet(ctype<char_type>::id) ;
+ this->_M_cached_numpunct = __loc._M_get_facet(numpunct<char_type>::id) ;
+ this->_M_cached_grouping = ((numpunct<char_type>*)_M_cached_numpunct)->grouping() ;
+ return __tmp;
+}
+
+// Protected constructor and initialization functions. The default
+// constructor creates an uninitialized basic_ios, and init() initializes
+// all of the members to the values in Table 89 of the C++ standard.
+
+template <class _CharT, class _Traits>
+basic_ios<_CharT, _Traits>::basic_ios()
+ : ios_base(),
+ _M_fill(_STLP_NULL_CHAR_INIT(_CharT)), _M_streambuf(0), _M_tied_ostream(0)
+{}
+
+template <class _CharT, class _Traits>
+void
+basic_ios<_CharT, _Traits>::init(basic_streambuf<_CharT, _Traits>* __sb)
+{
+ this->rdbuf(__sb);
+ this->imbue(locale());
+ this->tie(0);
+ this->_M_set_exception_mask(ios_base::goodbit);
+ this->_M_clear_nothrow(__sb != 0 ? ios_base::goodbit : ios_base::badbit);
+ ios_base::flags(ios_base::skipws | ios_base::dec);
+ ios_base::width(0);
+ ios_base::precision(6);
+ this->fill(widen(' '));
+ // We don't need to worry about any of the three arrays: they are
+ // initialized correctly in ios_base's constructor.
+}
+
+// This is never called except from within a catch clause.
+template <class _CharT, class _Traits>
+void basic_ios<_CharT, _Traits>::_M_handle_exception(ios_base::iostate __flag)
+{
+ this->_M_setstate_nothrow(__flag);
+ if (this->_M_get_exception_mask() & __flag)
+ _STLP_RETHROW;
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) */
+
+#endif /* _STLP_IOS_C */
diff --git a/src/STLport/stl/_ios.h b/src/STLport/stl/_ios.h
new file mode 100644
index 0000000..af0e5e9
--- /dev/null
+++ b/src/STLport/stl/_ios.h
@@ -0,0 +1,199 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_INTERNAL_IOS_H
+#define _STLP_INTERNAL_IOS_H
+
+
+#ifndef _STLP_IOS_BASE_H
+# include <stl/_ios_base.h>
+#endif
+
+#ifndef _STLP_INTERNAL_CTYPE_H
+# include <stl/_ctype.h>
+#endif
+#ifndef _STLP_INTERNAL_NUMPUNCT_H
+# include <stl/_numpunct.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// ----------------------------------------------------------------------
+
+// Class basic_ios, a subclass of ios_base. The only important difference
+// between the two is that basic_ios is a class template, parameterized
+// by the character type. ios_base exists to factor out all of the
+// common properties that don't depend on the character type.
+
+// The second template parameter, _Traits, defaults to char_traits<_CharT>.
+// The default is declared in header <iosfwd>, and it isn't declared here
+// because C++ language rules do not allow it to be declared twice.
+
+template <class _CharT, class _Traits>
+class basic_ios : public ios_base {
+ friend class ios_base;
+public: // Synonyms for types.
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+
+public: // Constructor, destructor.
+ explicit basic_ios(basic_streambuf<_CharT, _Traits>* __streambuf);
+ virtual ~basic_ios() {}
+
+public: // Members from clause 27.4.4.2
+ basic_ostream<_CharT, _Traits>* tie() const {
+ return _M_tied_ostream;
+ }
+ basic_ostream<_CharT, _Traits>*
+ tie(basic_ostream<char_type, traits_type>* __new_tied_ostream) {
+ basic_ostream<char_type, traits_type>* __tmp = _M_tied_ostream;
+ _M_tied_ostream = __new_tied_ostream;
+ return __tmp;
+ }
+
+ basic_streambuf<_CharT, _Traits>* rdbuf() const
+ { return _M_streambuf; }
+
+ basic_streambuf<_CharT, _Traits>*
+ rdbuf(basic_streambuf<char_type, traits_type>*);
+
+ // Copies __x's state to *this.
+ basic_ios<_CharT, _Traits>& copyfmt(const basic_ios<_CharT, _Traits>& __x);
+
+ char_type fill() const { return _M_fill; }
+ char_type fill(char_type __fill) {
+ char_type __tmp(_M_fill);
+ _M_fill = __fill;
+ return __tmp;
+ }
+
+public: // Members from 27.4.4.3. These four functions
+ // can almost be defined in ios_base.
+
+ void clear(iostate __state = goodbit) {
+ _M_clear_nothrow(this->rdbuf() ? __state : iostate(__state|ios_base::badbit));
+ _M_check_exception_mask();
+ }
+ void setstate(iostate __state) { this->clear(rdstate() | __state); }
+
+ iostate exceptions() const { return this->_M_get_exception_mask(); }
+ void exceptions(iostate __mask) {
+ this->_M_set_exception_mask(__mask);
+ this->clear(this->rdstate());
+ }
+
+public: // Locale-related member functions.
+ locale imbue(const locale&);
+
+ inline char narrow(_CharT, char) const ;
+ inline _CharT widen(char) const;
+
+ // Helper function that makes testing for EOF more convenient.
+ static bool _STLP_CALL _S_eof(int_type __c) {
+ const int_type __eof = _Traits::eof();
+ return _Traits::eq_int_type(__c, __eof);
+ }
+
+protected:
+ basic_ios();
+
+ void init(basic_streambuf<_CharT, _Traits>* __streambuf);
+
+public:
+
+ // Helper function used in istream and ostream. It is called only from
+ // a catch clause.
+ void _M_handle_exception(ios_base::iostate __flag);
+
+private: // Data members
+ char_type _M_fill; // The fill character, used for padding.
+
+ basic_streambuf<_CharT, _Traits>* _M_streambuf;
+ basic_ostream<_CharT, _Traits>* _M_tied_ostream;
+
+};
+
+
+template <class _CharT, class _Traits>
+inline char
+basic_ios<_CharT, _Traits>::narrow(_CharT __c, char __default) const
+{ return ((const ctype<_CharT>*)this->_M_ctype_facet())->narrow(__c, __default); }
+
+template <class _CharT, class _Traits>
+inline _CharT
+basic_ios<_CharT, _Traits>::widen(char __c) const
+{
+ return ((const ctype<_CharT>*)this->_M_ctype_facet())->widen(__c); }
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_ios<char, char_traits<char> >;
+# if ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_ios<wchar_t, char_traits<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+# if !defined (_STLP_NO_METHOD_SPECIALIZATION)
+_STLP_TEMPLATE_NULL
+inline char
+basic_ios<char, char_traits<char> >::narrow(char __c, char) const
+{
+ return __c;
+}
+
+_STLP_TEMPLATE_NULL
+inline char
+basic_ios<char, char_traits<char> >::widen(char __c) const
+{
+ return __c;
+}
+# endif /* _STLP_NO_METHOD_SPECIALIZATION */
+
+
+_STLP_END_NAMESPACE
+
+#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_ios.c>
+# endif
+
+// The following is needed to ensure that the inlined _Stl_loc_init functions
+// that ios_base::_Loc_init::_Loc_init() calls are found eventually.
+// Otherwise, undefined externs may be caused.
+
+#if defined(__BORLANDC__) && defined(_RTLDLL)
+# ifndef _STLP_INTERNAL_NUM_PUT_H
+# include <stl/_num_put.h>
+# endif
+# ifndef _STLP_INTERNAL_NUM_GET_H
+# include <stl/_num_get.h>
+# endif
+# ifndef _STLP_INTERNAL_MONETARY_H
+# include <stl/_monetary.h>
+# endif
+# ifndef _STLP_INTERNAL_TIME_FACETS_H
+# include <stl/_time_facets.h>
+# endif
+#endif
+
+#endif /* _STLP_IOS */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_ios_base.h b/src/STLport/stl/_ios_base.h
new file mode 100644
index 0000000..e7ef38e
--- /dev/null
+++ b/src/STLport/stl/_ios_base.h
@@ -0,0 +1,403 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_IOS_BASE_H
+#define _STLP_IOS_BASE_H
+
+#ifndef _STLP_STDEXCEPT
+#include <stdexcept>
+#endif
+#ifndef _STLP_UTILITY
+#include <utility>
+#endif
+#ifndef _STLP_INTERNAL_LOCALE_H
+#include <stl/_locale.h>
+#endif
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// ----------------------------------------------------------------------
+
+// Class ios_base. This is the base class of the ios hierarchy, which
+// includes basic_istream and basic_ostream. Classes in the ios
+// hierarchy are actually quite simple: they are just glorified
+// wrapper classes. They delegate buffering and physical character
+// manipulation to the streambuf classes, and they delegate most
+// formatting tasks to a locale.
+
+class _STLP_CLASS_DECLSPEC ios_base {
+public:
+
+ class _STLP_CLASS_DECLSPEC failure : public __Named_exception {
+ public:
+ explicit failure(const string&);
+ virtual ~failure() _STLP_NOTHROW_INHERENTLY;
+ };
+
+ typedef int fmtflags;
+ typedef int iostate;
+ typedef int openmode;
+ typedef int seekdir;
+
+# ifndef _STLP_NO_ANACHRONISMS
+ typedef fmtflags fmt_flags;
+# endif
+
+ // Formatting flags.
+# ifdef _STLP_STATIC_CONST_INIT_BUG
+ enum {
+# else
+ // boris : type for all those constants is int
+ static const int
+# endif
+ left = 0x0001,
+ right = 0x0002,
+ internal = 0x0004,
+ dec = 0x0008,
+ hex = 0x0010,
+ oct = 0x0020,
+ fixed = 0x0040,
+ scientific = 0x0080,
+ boolalpha = 0x0100,
+ showbase = 0x0200,
+ showpoint = 0x0400,
+ showpos = 0x0800,
+ skipws = 0x1000,
+ unitbuf = 0x2000,
+ uppercase = 0x4000,
+ adjustfield = left | right | internal,
+ basefield = dec | hex | oct,
+ floatfield = scientific | fixed,
+
+ // State flags.
+ goodbit = 0x00,
+ badbit = 0x01,
+ eofbit = 0x02,
+ failbit = 0x04,
+
+ // Openmode flags.
+ __default_mode = 0x0, /* implementation detail */
+ app = 0x01,
+ ate = 0x02,
+ binary = 0x04,
+ in = 0x08,
+ out = 0x10,
+ trunc = 0x20,
+
+ // Seekdir flags
+
+ beg = 0x01,
+ cur = 0x02,
+ end = 0x04
+# ifdef _STLP_STATIC_CONST_INIT_BUG
+ }
+# endif
+ ;
+
+public: // Flag-manipulation functions.
+ fmtflags flags() const { return _M_fmtflags; }
+ fmtflags flags(fmtflags __flags) {
+ fmtflags __tmp = _M_fmtflags;
+ _M_fmtflags = __flags;
+ return __tmp;
+ }
+
+ fmtflags setf(fmtflags __flag) {
+ fmtflags __tmp = _M_fmtflags;
+ _M_fmtflags |= __flag;
+ return __tmp;
+ }
+ fmtflags setf(fmtflags __flag, fmtflags __mask) {
+ fmtflags __tmp = _M_fmtflags;
+ _M_fmtflags &= ~__mask;
+ _M_fmtflags |= __flag & __mask;
+ return __tmp;
+ }
+ void unsetf(fmtflags __mask) { _M_fmtflags &= ~__mask; }
+
+ streamsize precision() const { return _M_precision; }
+ streamsize precision(streamsize __newprecision) {
+ streamsize __tmp = _M_precision;
+ _M_precision = __newprecision;
+ return __tmp;
+ }
+
+ streamsize width() const { return _M_width; }
+ streamsize width(streamsize __newwidth) {
+ streamsize __tmp = _M_width;
+ _M_width = __newwidth;
+ return __tmp;
+ }
+
+public: // Locales
+ locale imbue(const locale&);
+ locale getloc() const { return _M_locale; }
+
+public: // Auxiliary storage.
+ static int _STLP_CALL xalloc();
+ long& iword(int __index);
+ void*& pword(int __index);
+
+public: // Destructor.
+ virtual ~ios_base();
+
+public: // Callbacks.
+ enum event { erase_event, imbue_event, copyfmt_event };
+ typedef void (*event_callback)(event, ios_base&, int __index);
+ void register_callback(event_callback __fn, int __index);
+
+public: // This member function affects only
+ // the eight predefined ios objects:
+ // cin, cout, etc.
+ static bool _STLP_CALL sync_with_stdio(bool __sync = true);
+
+public: // The C++ standard requires only that these
+ // member functions be defined in basic_ios.
+ // We define them in the non-template
+ // base class to avoid code duplication.
+ operator void*() const { return !fail() ? (void*) __CONST_CAST(ios_base*,this) : (void*) 0; }
+ bool operator!() const { return fail(); }
+
+ iostate rdstate() const { return _M_iostate; }
+
+ bool good() const { return _M_iostate == 0; }
+ bool eof() const { return (_M_iostate & eofbit) != 0; }
+ bool fail() const { return (_M_iostate & (failbit | badbit)) != 0; }
+ bool bad() const { return (_M_iostate & badbit) != 0; }
+
+protected: // The functional protected interface.
+
+ // Copies the state of __x to *this. This member function makes it
+ // possible to implement basic_ios::copyfmt without having to expose
+ // ios_base's private data members. Does not copy _M_exception_mask
+ // or _M_iostate.
+ void _M_copy_state(const ios_base& __x);
+
+ void _M_setstate_nothrow(iostate __state) { _M_iostate |= __state; }
+ void _M_clear_nothrow(iostate __state) { _M_iostate = __state; }
+ iostate _M_get_exception_mask() const { return _M_exception_mask; }
+ void _M_set_exception_mask(iostate __mask) { _M_exception_mask = __mask; }
+ void _M_check_exception_mask() {
+ if (_M_iostate & _M_exception_mask)
+ _M_throw_failure();
+ }
+
+ void _M_invoke_callbacks(event);
+ void _M_throw_failure();
+
+ ios_base(); // Default constructor.
+
+protected: // Initialization of the I/O system
+ static void _STLP_CALL _S_initialize();
+ static void _STLP_CALL _S_uninitialize();
+ static bool _S_was_synced;
+
+private: // Invalidate the copy constructor and
+ // assignment operator.
+ ios_base(const ios_base&);
+ void operator=(const ios_base&);
+
+private: // Data members.
+
+ fmtflags _M_fmtflags; // Flags
+ iostate _M_iostate;
+ openmode _M_openmode;
+ seekdir _M_seekdir;
+ iostate _M_exception_mask;
+
+ streamsize _M_precision;
+ streamsize _M_width;
+
+ locale _M_locale;
+
+ pair<event_callback, int>* _M_callbacks;
+ size_t _M_num_callbacks; // Size of the callback array.
+ size_t _M_callback_index; // Index of the next available callback;
+ // initially zero.
+
+ long* _M_iwords; // Auxiliary storage. The count is zero
+ size_t _M_num_iwords; // if and only if the pointer is null.
+
+ void** _M_pwords;
+ size_t _M_num_pwords;
+
+ static int _S_index;
+
+protected:
+ // Cached copies of the curent locale's facets. Set by init() and imbue().
+ locale::facet* _M_cached_ctype;
+ locale::facet* _M_cached_numpunct;
+ string _M_cached_grouping;
+public:
+ // Equivalent to &use_facet< Facet >(getloc()), but faster.
+ const locale::facet* _M_ctype_facet() const { return _M_cached_ctype; }
+ const locale::facet* _M_numpunct_facet() const { return _M_cached_numpunct; }
+ const string& _M_grouping() const { return _M_cached_grouping; }
+public:
+
+ // ----------------------------------------------------------------------
+ // Nested initializer class. This is an implementation detail, but it's
+ // prescribed by the standard. The static initializer object (on
+ // implementations where such a thing is required) is declared in
+ // <iostream>
+
+ class _STLP_CLASS_DECLSPEC Init {
+ public:
+ Init();
+ ~Init();
+ private:
+ static long _S_count;
+ friend class ios_base;
+ };
+
+ // this class is needed to ensure locale initialization w/o <iostream> inclusion
+ class _STLP_CLASS_DECLSPEC _Loc_init {
+ public:
+ _Loc_init();
+ ~_Loc_init();
+ private:
+ static long _S_count;
+ friend class locale;
+ friend class ios_base;
+ };
+
+ friend class Init;
+
+public:
+# ifndef _STLP_NO_ANACHRONISMS
+ // 31.6 Old iostreams members [depr.ios.members]
+ typedef iostate io_state;
+ typedef openmode open_mode;
+ typedef seekdir seek_dir;
+ typedef _STLP_STD::streamoff streamoff;
+ typedef _STLP_STD::streampos streampos;
+# endif
+};
+
+// ----------------------------------------------------------------------
+// ios_base manipulator functions, from section 27.4.5 of the C++ standard.
+// All of them are trivial one-line wrapper functions.
+
+// fmtflag manipulators, section 27.4.5.1
+inline ios_base& _STLP_CALL boolalpha(ios_base& __s)
+ { __s.setf(ios_base::boolalpha); return __s;}
+
+inline ios_base& _STLP_CALL noboolalpha(ios_base& __s)
+ { __s.unsetf(ios_base::boolalpha); return __s;}
+
+inline ios_base& _STLP_CALL showbase(ios_base& __s)
+ { __s.setf(ios_base::showbase); return __s;}
+
+inline ios_base& _STLP_CALL noshowbase(ios_base& __s)
+ { __s.unsetf(ios_base::showbase); return __s;}
+
+inline ios_base& _STLP_CALL showpoint(ios_base& __s)
+ { __s.setf(ios_base::showpoint); return __s;}
+
+inline ios_base& _STLP_CALL noshowpoint(ios_base& __s)
+ { __s.unsetf(ios_base::showpoint); return __s;}
+
+inline ios_base& _STLP_CALL showpos(ios_base& __s)
+ { __s.setf(ios_base::showpos); return __s;}
+
+inline ios_base& _STLP_CALL noshowpos(ios_base& __s)
+ { __s.unsetf(ios_base::showpos); return __s;}
+
+inline ios_base& _STLP_CALL skipws(ios_base& __s)
+ { __s.setf(ios_base::skipws); return __s;}
+
+inline ios_base& _STLP_CALL noskipws(ios_base& __s)
+ { __s.unsetf(ios_base::skipws); return __s;}
+
+inline ios_base& _STLP_CALL uppercase(ios_base& __s)
+ { __s.setf(ios_base::uppercase); return __s;}
+
+inline ios_base& _STLP_CALL nouppercase(ios_base& __s)
+ { __s.unsetf(ios_base::uppercase); return __s;}
+
+inline ios_base& _STLP_CALL unitbuf(ios_base& __s)
+ { __s.setf(ios_base::unitbuf); return __s;}
+
+inline ios_base& _STLP_CALL nounitbuf(ios_base& __s)
+ { __s.unsetf(ios_base::unitbuf); return __s;}
+
+
+// adjustfield manipulators, section 27.4.5.2
+inline ios_base& _STLP_CALL internal(ios_base& __s)
+ { __s.setf(ios_base::internal, ios_base::adjustfield); return __s; }
+
+inline ios_base& _STLP_CALL left(ios_base& __s)
+ { __s.setf(ios_base::left, ios_base::adjustfield); return __s; }
+
+inline ios_base& _STLP_CALL right(ios_base& __s)
+ { __s.setf(ios_base::right, ios_base::adjustfield); return __s; }
+
+// basefield manipulators, section 27.4.5.3
+inline ios_base& _STLP_CALL dec(ios_base& __s)
+ { __s.setf(ios_base::dec, ios_base::basefield); return __s; }
+
+inline ios_base& _STLP_CALL hex(ios_base& __s)
+ { __s.setf(ios_base::hex, ios_base::basefield); return __s; }
+
+inline ios_base& _STLP_CALL oct(ios_base& __s)
+ { __s.setf(ios_base::oct, ios_base::basefield); return __s; }
+
+
+// floatfield manipulators, section 27.4.5.3
+inline ios_base& _STLP_CALL fixed(ios_base& __s)
+ { __s.setf(ios_base::fixed, ios_base::floatfield); return __s; }
+
+inline ios_base& _STLP_CALL scientific(ios_base& __s)
+ { __s.setf(ios_base::scientific, ios_base::floatfield); return __s; }
+
+#if defined(__BORLANDC__) && defined(_RTLDLL)
+
+long ios_base::_Loc_init::_S_count = 0;
+
+void _STLP_CALL _Stl_loc_init_num_put();
+void _STLP_CALL _Stl_loc_init_num_get();
+void _STLP_CALL _Stl_loc_init_monetary();
+void _STLP_CALL _Stl_loc_init_time_facets();
+
+inline ios_base::_Loc_init::_Loc_init() {
+ if (_S_count++ == 0) {
+ _Stl_loc_init_num_put();
+ _Stl_loc_init_num_get();
+ _Stl_loc_init_monetary();
+ _Stl_loc_init_time_facets();
+ locale::_S_initialize();
+ }
+}
+
+inline ios_base::_Loc_init::~_Loc_init() {
+ if (--_S_count == 0)
+ locale::_S_uninitialize();
+}
+
+#endif /* __BORLANDC__ */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_IOS_BASE */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_iosfwd.h b/src/STLport/stl/_iosfwd.h
new file mode 100644
index 0000000..848fa4b
--- /dev/null
+++ b/src/STLport/stl/_iosfwd.h
@@ -0,0 +1,159 @@
+# ifndef _STLP_INTERNAL_IOSFWD
+# define _STLP_INTERNAL_IOSFWD
+
+#if defined(__sgi) && !defined(__GNUC__) && !defined(_STANDARD_C_PLUS_PLUS)
+#error This header file requires the -LANG:std option
+#endif
+
+// This file provides forward declarations of the most important I/O
+// classes. Note that almost all of those classes are class templates,
+// with default template arguments. According to the C++ standard,
+// if a class template is declared more than once in the same scope
+// then only one of those declarations may have default arguments.
+
+// <iosfwd> contains the same declarations as other headers, and including
+// both <iosfwd> and (say) <iostream> is permitted. This means that only
+// one header may contain those default template arguments.
+
+// In this implementation, the declarations in <iosfwd> contain default
+// template arguments. All of the other I/O headers include <iosfwd>.
+
+#ifndef _STLP_CHAR_TRAITS_H
+# include <stl/char_traits.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+class _STLP_CLASS_DECLSPEC ios_base;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_ios;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_streambuf;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_istream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_ostream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_iostream;
+
+template <class _CharT, __DFL_TMPL_PARAM( _Traits , char_traits<_CharT>),
+ __DFL_TMPL_PARAM(_Allocator , allocator<_CharT>) >
+class basic_stringbuf;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>),
+ __DFL_TMPL_PARAM(_Allocator , allocator<_CharT>) >
+class basic_istringstream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>),
+ __DFL_TMPL_PARAM(_Allocator , allocator<_CharT>) >
+class basic_ostringstream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>),
+ __DFL_TMPL_PARAM(_Allocator , allocator<_CharT>) >
+class basic_stringstream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_filebuf;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_ifstream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_ofstream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_fstream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class istreambuf_iterator;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class ostreambuf_iterator;
+
+typedef basic_ios<char, char_traits<char> > ios;
+
+# ifndef _STLP_NO_WCHAR_T
+typedef basic_ios<wchar_t, char_traits<wchar_t> > wios;
+# endif
+
+// Forward declaration of class locale, and of the most important facets.
+class locale;
+# ifdef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+template <class _Facet>
+struct _Use_facet {
+ const locale& __loc;
+ _Use_facet(const locale& __p_loc) : __loc(__p_loc) {}
+ inline const _Facet& operator *() const;
+};
+# define use_facet *_Use_facet
+# else
+template <class _Facet> inline const _Facet& use_facet(const locale&);
+# endif
+
+template <class _CharT> class ctype;
+template <class _CharT> class ctype_byname;
+template <class _CharT> class collate;
+template <class _CharT> class collate_byname;
+
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC ctype<char>;
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC ctype_byname<char>;
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC collate<char>;
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC collate_byname<char>;
+
+# ifndef _STLP_NO_WCHAR_T
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC ctype<wchar_t>;
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC ctype_byname<wchar_t>;
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC collate<wchar_t>;
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC collate_byname<wchar_t>;
+# endif
+
+# if !(defined (__SUNPRO_CC) && __SUNPRO_CC < 0x500 ) && !defined(_STLP_WINCE)
+// Typedefs for ordinary (narrow-character) streams.
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC basic_streambuf<char, char_traits<char> >;
+# endif
+
+typedef basic_istream<char, char_traits<char> > istream;
+typedef basic_ostream<char, char_traits<char> > ostream;
+typedef basic_iostream<char, char_traits<char> > iostream;
+typedef basic_streambuf<char,char_traits<char> > streambuf;
+
+typedef basic_stringbuf<char, char_traits<char>, allocator<char> > stringbuf;
+typedef basic_istringstream<char, char_traits<char>, allocator<char> > istringstream;
+typedef basic_ostringstream<char, char_traits<char>, allocator<char> > ostringstream;
+typedef basic_stringstream<char, char_traits<char>, allocator<char> > stringstream;
+
+typedef basic_filebuf<char, char_traits<char> > filebuf;
+typedef basic_ifstream<char, char_traits<char> > ifstream;
+typedef basic_ofstream<char, char_traits<char> > ofstream;
+typedef basic_fstream<char, char_traits<char> > fstream;
+
+# ifndef _STLP_NO_WCHAR_T
+// Typedefs for wide-character streams.
+typedef basic_streambuf<wchar_t, char_traits<wchar_t> > wstreambuf;
+typedef basic_istream<wchar_t, char_traits<wchar_t> > wistream;
+typedef basic_ostream<wchar_t, char_traits<wchar_t> > wostream;
+typedef basic_iostream<wchar_t, char_traits<wchar_t> > wiostream;
+
+typedef basic_stringbuf<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstringbuf;
+typedef basic_istringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wistringstream;
+typedef basic_ostringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wostringstream;
+typedef basic_stringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstringstream;
+
+typedef basic_filebuf<wchar_t, char_traits<wchar_t> > wfilebuf;
+typedef basic_ifstream<wchar_t, char_traits<wchar_t> > wifstream;
+typedef basic_ofstream<wchar_t, char_traits<wchar_t> > wofstream;
+typedef basic_fstream<wchar_t, char_traits<wchar_t> > wfstream;
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_istream.c b/src/STLport/stl/_istream.c
new file mode 100644
index 0000000..234bba7
--- /dev/null
+++ b/src/STLport/stl/_istream.c
@@ -0,0 +1,1430 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_ISTREAM_C
+#define _STLP_ISTREAM_C
+
+#ifndef _STLP_INTERNAL_ISTREAM_H
+# include <stl/_istream.h>
+#endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#ifndef _STLP_LIMITS_H
+# include <stl/_limits.h>
+#endif
+
+#ifndef _STLP_INTERNAL_NUM_GET_H
+# include <stl/_num_get.h>
+#endif
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+// no wchar_t is supported for this mode
+# define __BIS_int_type__ int
+# define __BIS_pos_type__ streampos
+# define __BIS_off_type__ streamoff
+# else
+# define __BIS_int_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_istream<_CharT, _Traits>::int_type
+# define __BIS_pos_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_istream<_CharT, _Traits>::pos_type
+# define __BIS_off_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_istream<_CharT, _Traits>::off_type
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// Function object structs used by some member functions.
+
+template <class _Traits>
+struct _Is_not_wspace {
+ typedef typename _Traits::char_type argument_type;
+ typedef bool result_type;
+
+ const ctype<argument_type>* _M_ctype;
+
+ _Is_not_wspace(const ctype<argument_type>* __c_type) : _M_ctype(__c_type) {}
+ bool operator()(argument_type __c) const
+ { return !_M_ctype->is(ctype_base::space, __c); }
+};
+
+template <class _Traits>
+struct _Is_wspace_null {
+ typedef typename _Traits::char_type argument_type;
+ typedef bool result_type;
+
+ const ctype<argument_type>* _M_ctype;
+
+ _Is_wspace_null(const ctype<argument_type>* __c_type) : _M_ctype(__c_type) {}
+ bool operator()(argument_type __c) const {
+ return _Traits::eq(__c, argument_type()) ||
+ _M_ctype->is(ctype_base::space, __c);
+ }
+};
+
+template <class _Traits>
+struct _Scan_for_wspace {
+ typedef typename _Traits::char_type char_type;
+ typedef char_type* first_argument_type;
+ typedef char_type* second_argument_type;
+ typedef char_type* result_type;
+
+ const ctype<char_type>* _M_ctype;
+
+ _Scan_for_wspace(const ctype<char_type>* __ctype) : _M_ctype(__ctype) {}
+ const char_type*
+ operator()(const char_type* __first, const char_type* __last) const {
+ return _M_ctype->scan_is(ctype_base::space, __first, __last);
+ }
+};
+
+template <class _Traits>
+struct _Scan_wspace_null {
+ typedef typename _Traits::char_type char_type;
+ typedef char_type* first_argument_type;
+ typedef char_type* second_argument_type;
+ typedef char_type* result_type;
+
+ const ctype<char_type>* _M_ctype;
+
+ _Scan_wspace_null(const ctype<char_type>* __c_type) : _M_ctype(__c_type) {}
+ const char_type*
+ operator()(const char_type* __first, const char_type* __last) const {
+ __last = find_if(__first, __last,
+ _Eq_char_bound<_Traits>(char_type()));
+ return _M_ctype->scan_is(ctype_base::space, __first, __last);
+ }
+};
+
+template <class _Traits>
+struct _Scan_for_not_wspace {
+ typedef typename _Traits::char_type char_type;
+ typedef char_type* first_argument_type;
+ typedef char_type* second_argument_type;
+ typedef char_type* result_type;
+
+ const ctype<char_type>* _M_ctype;
+
+ _Scan_for_not_wspace(const ctype<char_type>* __c_type) : _M_ctype(__c_type) {}
+ const char_type*
+ operator()(const char_type* __first, const char_type* __last) const {
+ return _M_ctype->scan_not(ctype_base::space, __first, __last);
+ }
+};
+
+template <class _Traits>
+struct _Scan_for_char_val
+{
+ typedef typename _Traits::char_type char_type;
+ typedef char_type* first_argument_type;
+ typedef char_type* second_argument_type;
+ typedef char_type* result_type;
+
+ char_type _M_val;
+
+ _Scan_for_char_val(char_type __val) : _M_val(__val) {}
+
+ const char_type*
+ operator()(const char_type* __first, const char_type* __last) const {
+ return find_if(__first, __last, _Eq_char_bound<_Traits>(_M_val));
+ }
+};
+
+template <class _Traits>
+struct _Scan_for_int_val
+{
+ typedef typename _Traits::char_type char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef char_type* first_argument_type;
+ typedef char_type* second_argument_type;
+ typedef char_type* result_type;
+
+ int_type _M_val;
+
+ _Scan_for_int_val(int_type __val) : _M_val(__val) {}
+
+ const char_type*
+ operator()(const char_type* __first, const char_type* __last) const {
+ return find_if(__first, __last,
+ _Eq_int_bound<_Traits>(_M_val));
+ }
+};
+
+// Helper function: try to push back a character to a streambuf,
+// return true if the pushback succeeded. Does not throw.
+
+template <class _CharT, class _Traits>
+bool _STLP_CALL
+__pushback(basic_streambuf<_CharT, _Traits>* __buf, _CharT __c)
+{
+ bool ret;
+ _STLP_TRY {
+ const typename _Traits::int_type __eof = _Traits::eof();
+ ret = !_Traits::eq_int_type(__buf->sputbackc(__c), __eof);
+ }
+ _STLP_CATCH_ALL {
+ ret = false;
+ }
+ return ret;
+}
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+ws(basic_istream<_CharT, _Traits>& __is)
+{
+ typedef typename basic_istream<_CharT, _Traits>::sentry _Sentry;
+ _Sentry __sentry(__is, _No_Skip_WS()); // Don't skip whitespace.
+ if (__sentry)
+ __is._M_skip_whitespace(false);
+ return __is;
+}
+
+// Helper functions for istream<>::sentry constructor.
+template <class _CharT, class _Traits>
+bool
+_M_init_skip(basic_istream<_CharT, _Traits>& __is) {
+ if (__is.good()) {
+ if (__is.tie())
+ __is.tie()->flush();
+
+ __is._M_skip_whitespace(true);
+ }
+
+ if (!__is.good()) {
+ __is.setstate(ios_base::failbit);
+ return false;
+ } else
+ return true;
+}
+
+template <class _CharT, class _Traits>
+bool
+_M_init_noskip(basic_istream<_CharT, _Traits>& __is){
+ if (__is.good()) {
+ if (__is.tie())
+ __is.tie()->flush();
+
+ if (!__is.rdbuf())
+ __is.setstate(ios_base::badbit);
+ }
+ else
+ __is.setstate(ios_base::failbit);
+ return __is.good();
+}
+
+//----------------------------------------------------------------------
+// Definitions of basic_istream<>'s noninline member functions.
+
+// Helper function for formatted input of numbers.
+template <class _CharT, class _Traits, class _Number>
+ios_base::iostate _STLP_CALL
+_M_get_num(basic_istream<_CharT, _Traits>& __that, _Number& __val)
+{
+ typedef typename basic_istream<_CharT, _Traits>::sentry _Sentry;
+ ios_base::iostate __err = 0;
+ _Sentry __sentry( __that ); // Skip whitespace.
+ if (__sentry) {
+ typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> > _Num_get;
+ _STLP_TRY {
+ ((const _Num_get&)use_facet<_Num_get>(__that.getloc())).get(istreambuf_iterator<_CharT, _Traits>(__that.rdbuf()),
+ 0, __that, __err, __val);
+ }
+ _STLP_CATCH_ALL {
+ __that._M_handle_exception(ios_base::badbit);
+ }
+ if (__err) __that.setstate(__err);
+ }
+ return __err;
+}
+
+
+// Unformatted input
+
+template <class _CharT, class _Traits>
+__BIS_int_type__
+basic_istream<_CharT, _Traits>::peek()
+{
+ typename _Traits::int_type __tmp = _Traits::eof();
+
+ this->_M_gcount = 0;
+ sentry __sentry(*this, _No_Skip_WS());
+
+ if (__sentry) {
+ _STLP_TRY {
+ __tmp = this->rdbuf()->sgetc();
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ }
+ if (this->_S_eof(__tmp))
+ this->setstate(ios_base::eofbit);
+ }
+
+ return __tmp;
+}
+
+
+template <class _CharT, class _Traits>
+__BIS_int_type__
+basic_istream<_CharT, _Traits>::get()
+{
+ typename _Traits::int_type __tmp = _Traits::eof();
+ sentry __sentry(*this, _No_Skip_WS());
+ this->_M_gcount = 0;
+
+ if (__sentry) {
+ _STLP_TRY {
+ __tmp = this->rdbuf()->sbumpc();
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ }
+
+ if (!this->_S_eof(__tmp))
+ this->_M_gcount = 1;
+ }
+
+ if (_M_gcount == 0)
+ this->setstate(ios_base::eofbit | ios_base::failbit);
+
+ return __tmp;
+}
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::get(_CharT& __c)
+{
+ sentry __sentry(*this, _No_Skip_WS());
+ this->_M_gcount = 0;
+
+ if (__sentry) {
+ typename _Traits::int_type __tmp = _Traits::eof();
+ _STLP_TRY {
+ __tmp = this->rdbuf()->sbumpc();
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ }
+
+ if (!this->_S_eof(__tmp)) {
+ this->_M_gcount = 1;
+ __c = _Traits::to_char_type(__tmp);
+ }
+ }
+
+ if (this->_M_gcount == 0)
+ this->setstate(ios_base::eofbit | ios_base::failbit);
+
+ return *this;
+}
+
+
+
+// Read characters and discard them. The standard specifies a single
+// function with two arguments, each with a default. We instead use
+// three overloded functions, because it's possible to implement the
+// first two more efficiently than the fully general third version.
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::ignore()
+{
+ sentry __sentry(*this, _No_Skip_WS());
+ this->_M_gcount = 0;
+
+ if (__sentry) {
+ int_type __c;
+ _STLP_TRY {
+ __c = this->rdbuf()->sbumpc();
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ return *this;
+ }
+
+ if (!this->_S_eof(__c))
+ this->_M_gcount = 1;
+ else
+ this->setstate(ios_base::eofbit);
+ }
+
+ return *this;
+}
+
+// Putback
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::putback(_CharT __c) {
+ this->_M_gcount = 0;
+ sentry __sentry(*this, _No_Skip_WS());
+
+ if (__sentry) {
+ typename _Traits::int_type __tmp = _Traits::eof();
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+// if (!__buf || this->_S_eof(__buf->sputbackc(__c)))
+ if (__buf) {
+ _STLP_TRY {
+ __tmp = __buf->sputbackc(__c);
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ }
+ }
+ if (this->_S_eof(__tmp))
+ this->setstate(ios_base::badbit);
+ }
+ else
+ this->setstate(ios_base::failbit);
+
+ return *this;
+}
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::unget() {
+ this->_M_gcount = 0;
+
+ sentry __sentry(*this, _No_Skip_WS());
+
+ if (__sentry) {
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+ // if (!__buf || _Traits::eq_int_type(__buf->sungetc(), _Traits::eof()))
+ if (__buf) {
+ _STLP_TRY {
+ _CharT __tmp;
+ __tmp = __buf->sungetc();
+ if (this->_S_eof(__tmp))
+ this->setstate(ios_base::badbit);
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ }
+ } else
+ this->setstate(ios_base::badbit);
+ }
+ else
+ this->setstate(ios_base::failbit);
+
+ return *this;
+}
+
+// Positioning and buffer control.
+
+template <class _CharT, class _Traits>
+int basic_istream<_CharT, _Traits>::sync() {
+ sentry __sentry(*this, _No_Skip_WS());
+
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+ if (__buf) {
+ if (__buf->pubsync() == -1) {
+ this->setstate(ios_base::badbit);
+ return -1;
+ }
+ else
+ return 0;
+ }
+ else
+ return -1;
+}
+
+template <class _CharT, class _Traits>
+__BIS_pos_type__
+basic_istream<_CharT, _Traits>::tellg() {
+ // sentry __sentry(*this, _No_Skip_WS());
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+ return (__buf && !this->fail()) ? __buf->pubseekoff(0, ios_base::cur, ios_base::in)
+ : pos_type(-1);
+}
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::seekg(pos_type __pos) {
+ sentry __sentry(*this, _No_Skip_WS());
+
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+ if (!this->fail() && __buf)
+ __buf->pubseekpos(__pos, ios_base::in);
+ return *this;
+}
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
+{
+ sentry __sentry(*this, _No_Skip_WS());
+
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+ if (!this->fail() && __buf)
+ __buf->pubseekoff(__off, __dir, ios_base::in);
+ return *this;
+}
+
+// Formatted input of characters and character arrays.
+
+template <class _CharT, class _Traits>
+void basic_istream<_CharT, _Traits>::_M_formatted_get(_CharT& __c)
+{
+// typename _Traits::int_type __tmp = _Traits::eof();
+
+ sentry __sentry(*this); // Skip whitespace.
+
+ if (__sentry) {
+ typename _Traits::int_type __tmp = _Traits::eof();
+
+ _STLP_TRY {
+ __tmp = this->rdbuf()->sbumpc();
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ return;
+ }
+
+ if (!this->_S_eof(__tmp))
+ __c = _Traits::to_char_type(__tmp);
+ else
+ this->setstate(ios_base::eofbit | ios_base::failbit);
+ }
+}
+
+
+//---------------------------------------------------------------------------
+// istream's helper functions.
+
+// A generic function for unbuffered input. We stop when we reach EOF,
+// or when we have extracted _Num characters, or when the function object
+// __is_delim return true. In the last case, it extracts the character
+// for which __is_delim is true, if and only if __extract_delim is true.
+// It appends a null character to the end of the string; this means that
+// it may store up to _Num + 1 characters.
+//
+// __is_getline governs two corner cases: reading _Num characters without
+// encountering delim or eof (in which case failbit is set if __is_getline
+// is true); and reading _Num characters where the _Num+1'st character is
+// eof (in which case eofbit is set if __is_getline is true).
+//
+// It is assumed that __is_delim never throws.
+//
+// Return value is the number of characters extracted, including the
+// delimiter if it is extracted. Note that the number of characaters
+// extracted isn't necessarily the same as the number stored.
+
+template < class _CharT, class _Traits, class _Is_Delim>
+streamsize _STLP_CALL
+_M_read_unbuffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __buf,
+ streamsize _Num, _CharT* __s,
+ _Is_Delim __is_delim,
+ bool __extract_delim, bool __append_null,
+ bool __is_getline)
+{
+ streamsize __n = 0;
+ ios_base::iostate __status = 0;
+
+ typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
+ // The operations that can potentially throw are sbumpc, snextc, and sgetc.
+ _STLP_TRY {
+# if 0
+ int_type __c = __buf->sgetc();
+ while (true) {
+ if (__that->_S_eof(__c)) {
+ if (__n < _Num || __is_getline)
+ __status |= ios_base::eofbit;
+ break;
+ }
+
+ else if (__is_delim(__c)) {
+ if (__extract_delim) { // Extract and discard current character.
+ __buf->sbumpc();
+ ++__n;
+ }
+ break;
+ }
+
+ else if (__n == _Num) {
+ if (__is_getline)
+ __status |= ios_base::failbit;
+ break;
+ }
+
+ *__s++ = _Traits::to_char_type(__c);
+ ++__n;
+ __c = __buf->snextc();
+ }
+# else
+// int_type __c = __buf->sbumpc(); // __buf->sgetc();
+while (true) {
+
+int_type __c = __buf->sbumpc(); // sschwarz
+
+if (__that->_S_eof(__c)) {
+if (__n < _Num || __is_getline)
+__status |= ios_base::eofbit;
+break;
+}
+
+else if (__is_delim(__c)) {
+if (__extract_delim) { // Extract and discard current character.
+// __buf->sbumpc();
+++__n;
+}
+break;
+}
+
+else { // regular character
+
+*__s++ = _Traits::to_char_type(__c);
+++__n;
+
+}
+
+if (__n == _Num) {
+if (__is_getline) // didn't find delimiter as one of the _Num chars
+__status |= ios_base::failbit;
+break;
+}
+
+// *__s++ = _Traits::to_char_type(__c);
+// ++__n;
+
+}
+
+# endif
+
+ }
+ _STLP_CATCH_ALL {
+ __that->_M_handle_exception(ios_base::badbit);
+ *__s = _STLP_DEFAULT_CONSTRUCTED(_CharT);
+ return __n;
+ }
+
+ if (__append_null)
+ *__s = _STLP_DEFAULT_CONSTRUCTED(_CharT);
+ if (__status)
+ __that->setstate(__status); // This might throw.
+ return __n;
+}
+
+// Much like _M_read_unbuffered, but with one additional function object:
+// __scan_delim(first, last) returns the first pointer p in [first, last)
+// such that __is_delim(p) is true.
+
+template < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
+streamsize _STLP_CALL
+_M_read_buffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __buf,
+ streamsize _Num, _CharT* __s,
+ _Is_Delim __is_delim, _Scan_Delim __scan_delim,
+ bool __extract_delim, bool __append_null,
+ bool __is_getline)
+{
+ streamsize __n = 0;
+ ios_base::iostate __status = 0;
+ bool __done = false;
+
+ _STLP_TRY {
+ while (__buf->_M_egptr() != __buf->_M_gptr() && !__done) {
+ const _CharT* __first = __buf->_M_gptr();
+ const _CharT* __last = __buf->_M_egptr();
+ ptrdiff_t __request = _Num - __n;
+
+ const _CharT* __p = __scan_delim(__first, __last);
+ ptrdiff_t __chunk = (min) (ptrdiff_t(__p - __first), __request);
+ _Traits::copy(__s, __first, __chunk);
+ __s += __chunk;
+ __n += __chunk;
+ __buf->_M_gbump((int)__chunk);
+
+ // We terminated by finding delim.
+ if (__p != __last && __p - __first <= __request) {
+ if (__extract_delim) {
+ __n += 1;
+ __buf->_M_gbump(1);
+ }
+ __done = true;
+ }
+
+ // We terminated by reading all the characters we were asked for.
+ else if(__n == _Num) {
+
+ // Find out if we have reached eof. This matters for getline.
+ if (__is_getline) {
+ if (__chunk == __last - __first) {
+ if (__that->_S_eof(__buf->sgetc()))
+ __status |= ios_base::eofbit;
+ }
+ else
+ __status |= ios_base::failbit;
+ }
+ __done = true;
+ }
+
+ // The buffer contained fewer than _Num - __n characters. Either we're
+ // at eof, or we should refill the buffer and try again.
+ else {
+ if (__that->_S_eof(__buf->sgetc())) {
+ __status |= ios_base::eofbit;
+ __done = true;
+ }
+ }
+ } // Close the while loop.
+ }
+ _STLP_CATCH_ALL {
+ __that->_M_handle_exception(ios_base::badbit);
+ __done = true;
+ }
+
+ if (__done) {
+ if (__append_null)
+ *__s = _STLP_DEFAULT_CONSTRUCTED(_CharT);
+ if (__status != 0)
+ __that->setstate(__status); // This might throw.
+ return __n;
+ }
+
+ // If execution has reached this point, then we have an empty buffer but
+ // we have not reached eof. What that means is that the streambuf has
+ // decided to switch from buffered to unbuffered input. We switch to
+ // to _M_read_unbuffered.
+
+ return __n + _M_read_unbuffered(__that, __buf, _Num - __n, __s, __is_delim,
+ __extract_delim,__append_null,__is_getline);
+}
+
+
+
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::get(_CharT* __s, streamsize __n,
+ _CharT __delim) {
+ sentry __sentry(*this, _No_Skip_WS());
+ this->_M_gcount = 0;
+
+ if (__sentry) {
+ if (__n > 0) {
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+
+ if (__buf->egptr() != __buf->gptr())
+ this->_M_gcount =
+ _M_read_buffered(this, __buf, __n - 1, __s,
+ _Eq_char_bound<_Traits>(__delim),
+ _Scan_for_char_val<_Traits>(__delim),
+ false, true, false);
+ else
+ this->_M_gcount =
+ _M_read_unbuffered(this, __buf, __n - 1, __s,
+ _Eq_char_bound<_Traits>(__delim),
+ false, true, false);
+ }
+ }
+
+ if (this->_M_gcount == 0)
+ this->setstate(ios_base::failbit);
+
+ return *this;
+}
+
+// Getline is essentially identical to get, except that it extracts
+// the delimiter.
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::getline(_CharT* __s, streamsize __n,
+ _CharT __delim) {
+ sentry __sentry(*this, _No_Skip_WS());
+ this->_M_gcount = 0;
+
+ if (__sentry) {
+ if (__n > 0) {
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+ this->_M_gcount = __buf->egptr() != __buf->gptr()
+ ? _M_read_buffered(this, __buf, __n - 1, __s,
+ _Eq_char_bound<_Traits>(__delim),
+ _Scan_for_char_val<_Traits>(__delim),
+ true, true, true)
+ : _M_read_unbuffered(this, __buf, __n - 1, __s,
+ _Eq_char_bound<_Traits>(__delim),
+ true, true, true);
+ }
+ }
+
+ if (this->_M_gcount == 0)
+ this->setstate(ios_base::failbit);
+
+ return *this;
+}
+
+// Read n characters. We don't look for any delimiter, and we don't
+// put in a terminating null character.
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
+{
+ sentry __sentry(*this, _No_Skip_WS());
+ this->_M_gcount = 0;
+
+ if (__sentry && !this->eof()) {
+ basic_streambuf<_CharT, _Traits>*__buf = this->rdbuf();
+ if (__buf->gptr() != __buf->egptr())
+ _M_gcount
+ = _M_read_buffered(this, __buf, __n, __s,
+ _Constant_unary_fun<bool, int_type>(false),
+ _Project2nd<const _CharT*, const _CharT*>(),
+ false, false, false);
+ else
+ _M_gcount
+ = _M_read_unbuffered(this, __buf, __n, __s,
+ _Constant_unary_fun<bool, int_type>(false),
+ false, false, false);
+ }
+ else
+ this->setstate(ios_base::failbit);
+
+ if (this->eof())
+ this->setstate(ios_base::eofbit | ios_base::failbit);
+
+ return *this;
+}
+
+
+// Read n or fewer characters. We don't look for any delimiter, and
+// we don't put in a terminating null character.
+template <class _CharT, class _Traits>
+streamsize
+basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __nmax)
+{
+ sentry __sentry(*this, _No_Skip_WS());
+ this->_M_gcount = 0;
+
+ if (__sentry && !this->eof() && __nmax >= 0) {
+
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+ streamsize __avail = __buf->in_avail();
+
+ // fbp : isn't full-blown setstate required here ?
+ if (__avail == -1)
+ this->_M_setstate_nothrow(ios_base::eofbit);
+
+ else if (__avail != 0) {
+
+ if (__buf->gptr() != __buf->egptr())
+ _M_gcount
+ = _M_read_buffered(this, __buf, (min) (__avail, __nmax), __s,
+ _Constant_unary_fun<bool, int_type>(false),
+ _Project2nd<const _CharT*, const _CharT*>(),
+ false, false, false);
+ else
+ _M_gcount
+ = _M_read_unbuffered(this, __buf, (min) (__avail, __nmax), __s,
+ _Constant_unary_fun<bool, int_type>(false),
+ false, false, false);
+ }
+ }
+ else {
+ // fbp : changed so that failbit is set only there, to pass Dietmar's test
+ if (this->eof())
+ this->setstate(ios_base::eofbit | ios_base::failbit);
+ else
+ this->setstate(ios_base::failbit);
+ }
+
+ // if (this->eof())
+ // this->setstate(ios_base::eofbit | ios_base::failbit);
+
+ return _M_gcount;
+}
+
+template <class _CharT, class _Traits>
+void basic_istream<_CharT, _Traits>::_M_formatted_get(_CharT* __s)
+{
+ sentry __sentry(*this); // Skip whitespace.
+
+ if (__sentry) {
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+ streamsize __nmax = this->width() > 0
+ ? this->width() - 1
+ : (numeric_limits<streamsize>::max)() / sizeof(_CharT) - 1;
+
+ streamsize __n = __buf->gptr() != __buf->egptr()
+ ? _M_read_buffered(this, __buf, __nmax, __s,
+ _Is_wspace_null<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
+ _Scan_wspace_null<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
+ false, true, false)
+ : _M_read_unbuffered(this, __buf, __nmax, __s,
+ _Is_wspace_null<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
+ false, true, false);
+ if (__n == 0)
+ this->setstate(ios_base::failbit);
+ }
+ this->width(0);
+}
+
+// A generic unbuffered function for ignoring characters. We stop
+// when we reach EOF, or when the function object __is_delim returns
+// true. In the last case, it extracts the character for which
+// __is_delim is true, if and only if __extract_delim is true.
+
+template < class _CharT, class _Traits, class _Is_Delim>
+void _STLP_CALL
+_M_ignore_unbuffered(basic_istream<_CharT, _Traits>* __that,
+ basic_streambuf<_CharT, _Traits>* __buf,
+ _Is_Delim __is_delim,
+ bool __extract_delim, bool __set_failbit)
+{
+ bool __done = false;
+ ios_base::iostate __status = 0;
+ typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
+
+ _STLP_TRY {
+ while (!__done) {
+ int_type __c = __buf->sbumpc();
+
+ if (__that->_S_eof(__c)) {
+ __done = true;
+ __status |= __set_failbit ? ios_base::eofbit | ios_base::failbit
+ : ios_base::eofbit;
+ }
+
+ else if (__is_delim(__c)) {
+ __done = true;
+ if (!__extract_delim)
+ if (__that->_S_eof(__buf->sputbackc(_Traits::to_char_type(__c))))
+ __status |= ios_base::failbit;
+ }
+ }
+ }
+ _STLP_CATCH_ALL {
+ __that->_M_handle_exception(ios_base::badbit);
+ }
+
+ __that->setstate(__status);
+}
+
+// A generic buffered function for ignoring characters. Much like
+// _M_ignore_unbuffered, but with one additional function object:
+// __scan_delim(first, last) returns the first pointer p in [first,
+// last) such that __is_delim(p) is true.
+
+template < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
+void _STLP_CALL
+_M_ignore_buffered(basic_istream<_CharT, _Traits>* __that,
+ basic_streambuf<_CharT, _Traits>* __buf,
+ _Is_Delim __is_delim, _Scan_Delim __scan_delim,
+ bool __extract_delim, bool __set_failbit)
+{
+ bool __at_eof = false;
+ bool __found_delim = false;
+
+ _STLP_TRY {
+ while (__buf->_M_egptr() != __buf->_M_gptr() && !__at_eof && !__found_delim) {
+ const _CharT* __p = __scan_delim(__buf->_M_gptr(), __buf->_M_egptr());
+ __buf->_M_gbump((int)(__p - __buf->_M_gptr()));
+
+ if (__p != __buf->_M_egptr()) { // We found delim, so we're done.
+ if (__extract_delim)
+ __buf->_M_gbump(1);
+ __found_delim = true;
+ }
+
+ else // No delim. Try to refil the buffer.
+ __at_eof = __that->_S_eof(__buf->sgetc());
+ } // Close the while loop.
+ }
+ _STLP_CATCH_ALL {
+ __that->_M_handle_exception(ios_base::badbit);
+ return;
+ }
+
+ if (__at_eof) {
+ __that->setstate(__set_failbit ? ios_base::eofbit | ios_base::failbit
+ : ios_base::eofbit);
+ return;
+ }
+ if (__found_delim)
+ return;
+
+ // If execution has reached this point, then we have an empty buffer but
+ // we have not reached eof. What that means is that the streambuf has
+ // decided to switch from a buffered to an unbuffered mode. We switch
+ // to _M_ignore_unbuffered.
+ _M_ignore_unbuffered(__that, __buf, __is_delim, __extract_delim, __set_failbit);
+}
+
+// Overloaded versions of _M_ignore_unbuffered and _M_ignore_unbuffered
+// with an explicit count _Num. Return value is the number of
+// characters extracted.
+//
+// The function object __max_chars takes two arguments, _Num and __n
+// (the latter being the number of characters we have already read),
+// and returns the maximum number of characters to read from the buffer.
+// We parameterize _M_ignore_buffered so that we can use it for both
+// bounded and unbounded input; for the former the function object should
+// be minus<>, and for the latter it should return a constant maximum value.
+
+template < class _CharT, class _Traits, class _Max_Chars, class _Is_Delim>
+streamsize _STLP_CALL
+_M_ignore_unbuffered(basic_istream<_CharT, _Traits>* __that,
+ basic_streambuf<_CharT, _Traits>* __buf,
+ streamsize _Num, _Max_Chars __max_chars,
+ _Is_Delim __is_delim,
+ bool __extract_delim, bool __set_failbit)
+{
+ streamsize __n = 0;
+ ios_base::iostate __status = 0;
+ typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
+
+ _STLP_TRY {
+ while (__max_chars(_Num, __n) > 0) {
+ int_type __c = __buf->sbumpc();
+
+ if (__that->_S_eof(__c)) {
+ __status |= __set_failbit ? ios_base::eofbit | ios_base::failbit
+ : ios_base::eofbit;
+ break;
+ }
+
+ else if (__is_delim(__c)) {
+ if (__extract_delim)
+ ++__n;
+ else if (__that->_S_eof(__buf->sputbackc(_Traits::to_char_type(__c))))
+ __status |= ios_base::failbit;
+
+ break;
+ }
+ // fbp : added counter increment to pass Dietmar's test
+ ++__n;
+ }
+ }
+ _STLP_CATCH_ALL {
+ __that->_M_handle_exception(ios_base::badbit);
+ }
+
+ if (__status)
+ __that->setstate(__status); // This might throw.
+ return __n;
+}
+
+template < class _CharT, class _Traits, class _Max_Chars, class _Is_Delim, class _Scan_Delim>
+streamsize _STLP_CALL
+_M_ignore_buffered(basic_istream<_CharT, _Traits>* __that,
+ basic_streambuf<_CharT, _Traits>* __buf,
+ streamsize _Num,
+ _Max_Chars __max_chars,
+ _Is_Delim __is_delim, _Scan_Delim __scan_delim,
+ bool __extract_delim, bool __set_failbit)
+{
+ streamsize __n = 0;
+ bool __at_eof = false;
+ bool __done = false;
+
+ _STLP_TRY {
+ while (__buf->_M_egptr() != __buf->_M_gptr() && !__done) {
+ ptrdiff_t __avail = __buf->_M_egptr() - __buf->_M_gptr();
+ streamsize __m = __max_chars(_Num, __n);
+
+ if (__avail >= __m) { // We have more characters than we need.
+ const _CharT* __last = __buf->_M_gptr() + __m;
+ const _CharT* __p = __scan_delim(__buf->_M_gptr(), __last);
+ ptrdiff_t __chunk = __p - __buf->_M_gptr();
+ __n += __chunk;
+ __buf->_M_gbump((int)__chunk);
+
+ if (__extract_delim && __p != __last) {
+ __n += 1;
+ __buf->_M_gbump(1);
+ }
+
+ __done = true;
+ }
+
+ else {
+ const _CharT* __p = __scan_delim(__buf->_M_gptr(), __buf->_M_egptr());
+ ptrdiff_t __chunk = __p - __buf->_M_gptr();
+ __n += __chunk;
+ __buf->_M_gbump((int)__chunk);
+
+ if (__p != __buf->_M_egptr()) { // We found delim.
+ if (__extract_delim) {
+ __n += 1;
+ __buf->_M_gbump(1);
+ }
+
+ __done = true;
+ }
+
+ // We didn't find delim. Try to refill the buffer.
+ else if (__that->_S_eof(__buf->sgetc())) {
+ __done = true;
+ __at_eof = true;
+ }
+ }
+ } // Close the while loop.
+ }
+ _STLP_CATCH_ALL {
+ __that->_M_handle_exception(ios_base::badbit);
+ return __n;
+ }
+
+ if (__at_eof)
+ __that->setstate(__set_failbit ? ios_base::eofbit | ios_base::failbit
+ : ios_base::eofbit);
+
+ if (__done)
+ return __n;
+
+ // If execution has reached this point, then we have an empty buffer but
+ // we have not reached eof. What that means is that the streambuf has
+ // decided to switch from buffered to unbuffered input. We switch to
+ // to _M_ignore_unbuffered.
+
+ return __n + _M_ignore_unbuffered( __that, __buf, _Num, __max_chars,
+ __is_delim, __extract_delim, __set_failbit);
+}
+
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::ignore(streamsize __n)
+{
+ sentry __sentry(*this, _No_Skip_WS());
+ this->_M_gcount = 0;
+
+ if (__sentry) {
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+ typedef _Constant_unary_fun<bool, int_type> _Const_bool;
+ typedef _Constant_binary_fun<streamsize, streamsize, streamsize>
+ _Const_streamsize;
+ const streamsize __maxss = (numeric_limits<streamsize>::max)();
+
+ if (__n == (numeric_limits<int>::max)()) {
+ if (__buf->gptr() != __buf->egptr())
+ _M_gcount
+ = _M_ignore_buffered(this, __buf,
+ __maxss, _Const_streamsize(__maxss),
+ _Const_bool(false),
+ _Project2nd<const _CharT*, const _CharT*>(),
+ false, false);
+ else
+ _M_gcount = _M_ignore_unbuffered(this, __buf,
+ __maxss, _Const_streamsize(__maxss),
+ _Const_bool(false), false, false);
+ }
+ else {
+ if (__buf->gptr() != __buf->egptr())
+ _M_gcount
+ = _M_ignore_buffered(this, __buf,
+ __n, minus<streamsize>(),
+ _Const_bool(false),
+ _Project2nd<const _CharT*, const _CharT*>(),
+ false, false);
+ else
+ _M_gcount = _M_ignore_unbuffered(this, __buf, __n, minus<streamsize>(),
+ _Const_bool(false), false, false);
+ }
+ }
+
+ return *this;
+}
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __delim)
+{
+ sentry __sentry(*this, _No_Skip_WS());
+ this->_M_gcount = 0;
+
+ if (__sentry) {
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+ typedef _Constant_unary_fun<bool, int_type> _Const_bool;
+ typedef _Constant_binary_fun<streamsize, streamsize, streamsize>
+ _Const_streamsize;
+ const streamsize __maxss = (numeric_limits<streamsize>::max)();
+
+ if (__n == (numeric_limits<int>::max)()) {
+ if (__buf->gptr() != __buf->egptr())
+ _M_gcount = _M_ignore_buffered(this, __buf,
+ __maxss, _Const_streamsize(__maxss),
+ _Eq_int_bound<_Traits>(__delim),
+ _Scan_for_int_val<_Traits>(__delim),
+ true, false);
+ else
+ _M_gcount = _M_ignore_unbuffered(this, __buf,
+ __maxss, _Const_streamsize(__maxss),
+ _Eq_int_bound<_Traits>(__delim),
+ true, false);
+ }
+ else {
+ if (__buf->gptr() != __buf->egptr())
+ _M_gcount = _M_ignore_buffered(this, __buf,
+ __n, minus<streamsize>(),
+ _Eq_int_bound<_Traits>(
+ __delim),
+ _Scan_for_int_val<_Traits>(__delim),
+ true, false);
+ else
+ _M_gcount = _M_ignore_unbuffered(this, __buf, __n, minus<streamsize>(),
+ _Eq_int_bound<_Traits>(__delim),
+ true, false);
+ }
+ }
+
+ return *this;
+}
+
+// This member function does not construct a sentry object, because
+// it is called from sentry's constructor.
+template <class _CharT, class _Traits>
+void basic_istream<_CharT, _Traits>::_M_skip_whitespace(bool __set_failbit)
+{
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+ if (!__buf)
+ this->setstate(ios_base::badbit);
+ else if (__buf->gptr() != __buf->egptr())
+ _M_ignore_buffered(this, __buf,
+ _Is_not_wspace<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
+ _Scan_for_not_wspace<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
+ false, __set_failbit);
+ else
+ _M_ignore_unbuffered(this, __buf,
+ _Is_not_wspace<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
+ false, __set_failbit);
+}
+
+
+// This is a very simple loop that reads characters from __src and puts
+// them into __dest. It looks complicated because of the (standard-
+// mandated) exception handling policy.
+//
+// We stop when we get an exception, when we fail to insert into the
+// output streambuf, or when __is_delim is true.
+
+template < class _CharT, class _Traits, class _Is_Delim>
+streamsize _STLP_CALL
+_M_copy_unbuffered( basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __src,
+ basic_streambuf<_CharT, _Traits>* __dest,
+ _Is_Delim __is_delim,
+ bool __extract_delim, bool __rethrow)
+{
+ streamsize __extracted = 0;
+ ios_base::iostate __status = 0;
+ typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
+ int_type __c;
+
+ _STLP_TRY {
+
+ while (true) {
+
+ // Get a character. If there's an exception, catch and (maybe) rethrow it.
+ __c = __src->sbumpc();
+
+ // If we failed to get a character, then quit.
+ if (__that->_S_eof(__c)) {
+ __status |= ios_base::eofbit;
+ break;
+ }
+ // If it's the delimiter, then quit.
+ else if (__is_delim(__c)) {
+ if (!__extract_delim && !__pushback(__src, _Traits::to_char_type(__c)))
+ __status |= ios_base::failbit;
+ break;
+ }
+
+ else {
+
+ // Try to put the character in the output streambuf.
+ bool __failed = false;
+ _STLP_TRY {
+ if (!__that->_S_eof(__dest->sputc(__c)))
+ ++__extracted;
+ else
+ __failed = true;
+ }
+ _STLP_CATCH_ALL {
+ __failed = true;
+ }
+
+ // If we failed to put the character in the output streambuf, then
+ // try to push it back to the input streambuf.
+ if (__failed && !__pushback(__src, _Traits::to_char_type(__c)))
+ __status |= ios_base::failbit;
+
+ // fbp : avoiding infinite loop in io-27-6-1-2-3.exp
+ if (__failed)
+ break;
+ }
+
+ } /* while (true) */
+
+ }
+ // fbp : this try/catch moved here in reasonable assumption
+ // __is_delim never throw (__pushback is guaranteed not to)
+ _STLP_CATCH_ALL {
+ // See 27.6.1.2.3, paragraph 13.
+ if (__rethrow && __extracted == 0)
+ __that->_M_handle_exception(ios_base::failbit);
+ }
+ __that->setstate(__status);
+ return __extracted;
+}
+
+// Buffered copying from one streambuf to another. We copy the characters
+// in chunks, rather than one at a time. We still have to worry about all
+// of the error conditions we checked in _M_copy_unbuffered, plus one more:
+// the streambuf might decide to switch from a buffered to an unbuffered mode.
+
+template < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
+streamsize _STLP_CALL
+_M_copy_buffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __src,
+ basic_streambuf<_CharT, _Traits>* __dest,
+ _Scan_Delim __scan_delim, _Is_Delim __is_delim,
+ bool __extract_delim, bool __rethrow)
+{
+ streamsize __extracted = 0;
+ ios_base::iostate __status = 0;
+ typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
+ int_type __c = _Traits::eof();
+ _CharT* __first = __src->_M_gptr();
+ ptrdiff_t __avail = __src->_M_egptr() - __first;
+ // fbp : introduced to move catch/try blocks out of the loop
+ bool __do_handle_exceptions;
+
+ _STLP_TRY {
+ while (true) {
+ __do_handle_exceptions = false ;
+ const _CharT* __last = __scan_delim(__first, __src->_M_egptr());
+
+ // Try to copy the entire input buffer to the output buffer.
+ streamsize __n = __dest->sputn(__first, __extract_delim && __last != __src->_M_egptr()
+ ? (__last - __first) + 1
+ : (__last - __first));
+ __src->_M_gbump((int)__n);
+ __extracted += __n;
+
+ // from this on, catch() will call _M_handle_exceptions()
+ __do_handle_exceptions = true;
+
+ if (__n < __avail) // We found the delimiter, or else failed to
+ break; // copy some characters.
+
+ __c = __src->sgetc();
+
+ // Three possibilities: we succeeded in refilling the buffer, or
+ // we got EOF, or the streambuf has switched to unbuffered mode.
+ __first = __src->_M_gptr();
+ __avail = __src->_M_egptr() - __first;
+
+ if (__avail > 0)
+ {} // dwa 1/16/00 -- suppress a Metrowerks warning
+ else if (__that->_S_eof(__c)) {
+ __status |= ios_base::eofbit;
+ break;
+ }
+ else
+ return __extracted + _M_copy_unbuffered(__that, __src, __dest, __is_delim,
+ __extract_delim, __rethrow);
+ } /* while */
+ }
+
+ _STLP_CATCH_ALL {
+ // See 27.6.1.2.3, paragraph 13.
+ if (__rethrow && __do_handle_exceptions && __extracted == 0)
+ __that->_M_handle_exception(ios_base::failbit);
+ }
+
+ if (__status)
+ __that->setstate(__status); // This might throw.
+ return __extracted;
+}
+
+
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>
+ ::get(basic_streambuf<_CharT, _Traits>& __dest, _CharT __delim)
+{
+ sentry __sentry(*this, _No_Skip_WS());
+ this->_M_gcount = 0;
+
+ if (__sentry) {
+ basic_streambuf<_CharT, _Traits>* __src = this->rdbuf();
+
+ if (__src)
+ this->_M_gcount = __src->egptr() != __src->gptr()
+ ? _M_copy_buffered(this, __src, &__dest,
+ _Scan_for_char_val<_Traits>(__delim),
+ _Eq_char_bound<_Traits>(__delim),
+ false, false)
+ : _M_copy_unbuffered(this, __src, &__dest,
+ _Eq_char_bound<_Traits>(__delim),
+ false, false);
+ }
+
+ if (this->_M_gcount == 0)
+ this->setstate(ios_base::failbit);
+
+ return *this;
+}
+
+// Copying characters into a streambuf.
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>
+ ::operator>>(basic_streambuf<_CharT, _Traits>* __dest)
+{
+ streamsize __n = 0;
+ typedef typename basic_istream<_CharT, _Traits>::sentry _Sentry;
+ _Sentry __sentry(*this);
+ if (__sentry) {
+ basic_streambuf<_CharT, _Traits>* __src = this->rdbuf();
+ if (__src && __dest)
+ __n = __src->egptr() != __src->gptr()
+ ? _M_copy_buffered(this, __src, __dest,
+ _Project2nd<const _CharT*, const _CharT*>(),
+ _Constant_unary_fun<bool, int_type>(false),
+ false, true)
+ : _M_copy_unbuffered(this, __src, __dest,
+ _Constant_unary_fun<bool, int_type>(false),
+ false, true);
+ }
+
+ if (__n == 0)
+ this->setstate(ios_base::failbit);
+
+ return *this;
+}
+
+// ----------------------------------------------------------------
+// basic_iostream<> class
+// ----------------------------------------------------------------
+
+template <class _CharT, class _Traits>
+basic_iostream<_CharT, _Traits>
+ ::basic_iostream(basic_streambuf<_CharT, _Traits>* __buf)
+ : basic_ios<_CharT, _Traits>(),
+ basic_istream<_CharT, _Traits>(__buf),
+ basic_ostream<_CharT, _Traits>(__buf)
+{
+ this->init(__buf);
+}
+
+template <class _CharT, class _Traits>
+basic_iostream<_CharT, _Traits>::~basic_iostream()
+{}
+
+_STLP_END_NAMESPACE
+
+# undef __BIS_int_type__
+# undef __BIS_pos_type__
+# undef __BIS_off_type__
+
+# endif /* defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) */
+
+#endif /* _STLP_ISTREAM_C */
diff --git a/src/STLport/stl/_istream.h b/src/STLport/stl/_istream.h
new file mode 100644
index 0000000..646bb31
--- /dev/null
+++ b/src/STLport/stl/_istream.h
@@ -0,0 +1,344 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_INTERNAL_ISTREAM_H
+#define _STLP_INTERNAL_ISTREAM_H
+
+// this block is included by _ostream.h, we include it here to lower #include level
+# if defined (_STLP_HAS_WCHAR_T) && !defined (_STLP_CWCHAR_H)
+# include <stl/_cwchar.h>
+# endif
+
+# ifndef _STLP_INTERNAL_IOS_H
+# include <stl/_ios.h> // For basic_ios<>. Includes <iosfwd>.
+# endif
+
+#ifndef _STLP_INTERNAL_OSTREAM_H
+# include <stl/_ostream.h> // Needed as a base class of basic_iostream.
+#endif
+
+#ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
+# include <stl/_istreambuf_iterator.h>
+#endif
+
+#include <stl/_ctraits_fns.h> // Helper functions that allow char traits
+ // to be used as function objects.
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT, class _Traits, class _Number>
+ios_base::iostate _STLP_CALL
+_M_get_num(basic_istream<_CharT, _Traits>& __that, _Number& __val);
+
+#if defined (_STLP_USE_TEMPLATE_EXPORT)
+template <class _CharT, class _Traits>
+class _Isentry;
+#endif
+
+struct _No_Skip_WS {}; // Dummy class used by sentry.
+
+template <class _CharT, class _Traits>
+bool _M_init_skip(basic_istream<_CharT, _Traits>& __is);
+template <class _CharT, class _Traits>
+bool _M_init_noskip(basic_istream<_CharT, _Traits>& __is);
+
+//----------------------------------------------------------------------
+// Class basic_istream, a class that performs formatted input through
+// a stream buffer.
+
+// The second template parameter, _Traits, defaults to char_traits<_CharT>.
+// The default is declared in header <iosfwd>, and it isn't declared here
+// because C++ language rules do not allow it to be declared twice.
+
+template <class _CharT, class _Traits>
+class basic_istream : virtual public basic_ios<_CharT, _Traits> {
+public:
+ // Types
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef basic_ios<_CharT, _Traits> _Basic_ios;
+ typedef basic_istream<_CharT, _Traits> _Self;
+
+ typedef basic_ios<_CharT, _Traits>& (_STLP_CALL *__ios_fn)(basic_ios<_CharT, _Traits>&);
+ typedef ios_base& (_STLP_CALL *__ios_base_fn)(ios_base&);
+ typedef _Self& (_STLP_CALL *__istream_fn)(_Self&);
+
+public: // Constructor and destructor.
+ explicit basic_istream(basic_streambuf<_CharT, _Traits>* __buf) :
+ basic_ios<_CharT, _Traits>(), _M_gcount(0) {
+ this->init(__buf);
+ }
+ ~basic_istream() {};
+
+public: // Nested sentry class.
+
+public: // Hooks for manipulators. The arguments are
+ // function pointers.
+ _Self& operator>> (__istream_fn __f) { return __f(*this); }
+ _Self& operator>> (__ios_fn __f) { __f(*this); return *this; }
+ _Self& operator>> (__ios_base_fn __f) { __f(*this); return *this; }
+
+public: // Formatted input of numbers.
+ _Self& operator>> (short& __val) {
+ long __lval;
+ unsigned short __uval;
+ _M_get_num(*this, __lval);
+ __val = __STATIC_CAST(short, __lval);
+ __uval = __lval;
+ // check if we lose digits
+ // if ((__val != __lval) && ((unsigned short)__val != __lval))
+ if ((__val != __lval) && ((long)__uval != __lval))
+ this->setstate(ios_base::failbit);
+ return *this;
+ }
+ _Self& operator>> (int& __val) {
+ long __lval;
+ unsigned int __uval;
+ _M_get_num(*this, __lval);
+ __val = __lval;
+ __uval = __lval;
+ // check if we lose digits
+ // if ((__val != __lval) && ((unsigned int)__val != __lval))
+ if ((__val != __lval) && ((long)__uval != __lval))
+ this->setstate(ios_base::failbit);
+ return *this;
+ }
+ _Self& operator>> (unsigned short& __val) { _M_get_num(*this, __val); return *this; }
+ _Self& operator>> (unsigned int& __val) { _M_get_num(*this, __val); return *this; }
+ _Self& operator>> (long& __val) { _M_get_num(*this, __val); return *this; }
+ _Self& operator>> (unsigned long& __val) { _M_get_num(*this, __val); return *this; }
+#ifdef _STLP_LONG_LONG
+ _Self& operator>> (_STLP_LONG_LONG& __val) { _M_get_num(*this, __val); return *this; }
+ _Self& operator>> (unsigned _STLP_LONG_LONG& __val) { _M_get_num(*this, __val); return *this; }
+#endif
+ _Self& operator>> (float& __val) { _M_get_num(*this, __val); return *this; }
+ _Self& operator>> (double& __val) { _M_get_num(*this, __val); return *this; }
+# ifndef _STLP_NO_LONG_DOUBLE
+ _Self& operator>> (long double& __val) { _M_get_num(*this, __val); return *this; }
+# endif
+# ifndef _STLP_NO_BOOL
+ _Self& operator>> (bool& __val) { _M_get_num(*this, __val); return *this; }
+# endif
+ _Self& operator>> (void*& __val) { _M_get_num(*this, __val); return *this; }
+
+public: // Copying characters into a streambuf.
+ _Self& operator>>(basic_streambuf<_CharT, _Traits>*);
+
+public: // Unformatted input.
+ streamsize gcount() const { return _M_gcount; }
+ int_type peek();
+
+public: // get() for single characters
+ int_type get();
+ _Self& get(char_type& __c);
+
+public: // get() for character arrays.
+ _Self& get(char_type* __s, streamsize __n, char_type __delim);
+ _Self& get(char_type* __s, streamsize __n)
+ { return get(__s, __n, this->widen('\n')); }
+
+public: // get() for streambufs
+ _Self& get(basic_streambuf<_CharT, _Traits>& __buf,
+ char_type __delim);
+ _Self& get(basic_streambuf<_CharT, _Traits>& __buf)
+ { return get(__buf, this->widen('\n')); }
+
+public: // getline()
+ _Self& getline(char_type* __s, streamsize __n, char_type delim);
+ _Self& getline(char_type* __s, streamsize __n)
+ { return getline(__s, __n, this->widen('\n')); }
+
+public: // read(), readsome(), ignore()
+ _Self& ignore();
+ _Self& ignore(streamsize __n);
+#if (defined (_STLP_MSVC) && _STLP_MSVC < 1200)
+ inline
+#endif
+ _Self& ignore(streamsize __n, int_type __delim);
+
+ _Self& read(char_type* __s, streamsize __n);
+ streamsize readsome(char_type* __s, streamsize __n);
+
+public: // putback
+ _Self& putback(char_type __c);
+ _Self& unget();
+
+public: // Positioning and buffer control.
+ int sync();
+
+ pos_type tellg();
+ _Self& seekg(pos_type __pos);
+ _Self& seekg(off_type, ios_base::seekdir);
+
+public: // Helper functions for non-member extractors.
+ void _M_formatted_get(_CharT& __c);
+ void _M_formatted_get(_CharT* __s);
+ void _M_skip_whitespace(bool __set_failbit);
+
+private: // Number of characters extracted by the
+ streamsize _M_gcount; // most recent unformatted input function.
+
+public:
+
+#if defined (_STLP_USE_TEMPLATE_EXPORT)
+ // If we are using DLL specs, we have not to use inner classes
+ // end class declaration here
+ typedef _Isentry<_CharT, _Traits> sentry;
+};
+# define sentry _Isentry
+template <class _CharT, class _Traits>
+class _Isentry {
+ typedef _Isentry<_CharT, _Traits> _Self;
+# else
+ class sentry {
+ typedef sentry _Self;
+#endif
+
+ private:
+ const bool _M_ok;
+ // basic_streambuf<_CharT, _Traits>* _M_buf;
+
+ public:
+ typedef _Traits traits_type;
+
+ explicit sentry(basic_istream<_CharT, _Traits>& __is,
+ bool __noskipws = false) :
+ _M_ok((__noskipws || !(__is.flags() & ios_base::skipws)) ? _M_init_noskip(__is) : _M_init_skip(__is) )
+ /* , _M_buf(__is.rdbuf()) */
+ {}
+
+ // Calling this constructor is the same as calling the previous one with
+ // __noskipws = true, except that it doesn't require a runtime test.
+ sentry(basic_istream<_CharT, _Traits>& __is, _No_Skip_WS) : /* _M_buf(__is.rdbuf()), */
+ _M_ok(_M_init_noskip(__is)) {}
+
+ ~sentry() {}
+
+ operator bool() const { return _M_ok; }
+
+ private: // Disable assignment and copy constructor.
+ sentry(const _Self&) : _M_ok(false) {}
+ void operator=(const _Self&) {}
+ };
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+# undef sentry
+# else
+ // close basic_istream class definition here
+};
+# endif
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _Isentry<char, char_traits<char> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_istream<char, char_traits<char> >;
+# if ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS _Isentry<wchar_t, char_traits<wchar_t> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_istream<wchar_t, char_traits<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+// Non-member character and string extractor functions.
+
+template <class _CharT, class _Traits>
+inline basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c) {
+ __in._M_formatted_get(__c);
+ return __in;
+}
+
+template <class _Traits>
+inline basic_istream<char, _Traits>& _STLP_CALL
+operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c) {
+ __in._M_formatted_get(__REINTERPRET_CAST(char&,__c));
+ return __in;
+}
+
+template <class _Traits>
+inline basic_istream<char, _Traits>& _STLP_CALL
+operator>>(basic_istream<char, _Traits>& __in, signed char& __c) {
+ __in._M_formatted_get(__REINTERPRET_CAST(char&,__c));
+ return __in;
+}
+
+template <class _CharT, class _Traits>
+inline basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s) {
+ __in._M_formatted_get(__s);
+ return __in;
+}
+
+template <class _Traits>
+inline basic_istream<char, _Traits>& _STLP_CALL
+operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s) {
+ __in._M_formatted_get(__REINTERPRET_CAST(char*,__s));
+ return __in;
+}
+
+template <class _Traits>
+inline basic_istream<char, _Traits>& _STLP_CALL
+operator>>(basic_istream<char, _Traits>& __in, signed char* __s) {
+ __in._M_formatted_get(__REINTERPRET_CAST(char*,__s));
+ return __in;
+}
+
+//----------------------------------------------------------------------
+// istream manipulator.
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+ws(basic_istream<_CharT, _Traits>& __is);
+
+//----------------------------------------------------------------------
+// Class iostream.
+
+template <class _CharT, class _Traits>
+class basic_iostream
+ : public basic_istream<_CharT, _Traits>,
+ public basic_ostream<_CharT, _Traits>
+{
+public:
+ typedef basic_ios<_CharT, _Traits> _Basic_ios;
+
+ explicit basic_iostream(basic_streambuf<_CharT, _Traits>* __buf);
+ virtual ~basic_iostream();
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_iostream<char, char_traits<char> >;
+# if ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_iostream<wchar_t, char_traits<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>* _STLP_CALL _M_get_istreambuf(basic_istream<_CharT, _Traits>& __is)
+{
+ return __is.rdbuf();
+}
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_istream.c>
+# endif
+
+#endif /* _STLP_INTERNAL_ISTREAM_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_istreambuf_iterator.h b/src/STLport/stl/_istreambuf_iterator.h
new file mode 100644
index 0000000..c3ef8a2
--- /dev/null
+++ b/src/STLport/stl/_istreambuf_iterator.h
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
+#define _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+# include <stl/_streambuf.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// defined in _istream.h
+template <class _CharT, class _Traits>
+extern basic_streambuf<_CharT, _Traits>* _STLP_CALL _M_get_istreambuf(basic_istream<_CharT, _Traits>& ) ;
+
+// We do not read any characters until operator* is called. operator* calls sgetc
+// unless the iterator is unchanged from the last call in which case a cached value is
+// used. Calls to operator++ use sbumpc.
+
+template<class _CharT, class _Traits>
+class istreambuf_iterator
+{
+public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef typename _Traits::int_type int_type;
+ typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+ typedef basic_istream<_CharT, _Traits> istream_type;
+
+ typedef input_iterator_tag iterator_category;
+ typedef _CharT value_type;
+ typedef typename _Traits::off_type difference_type;
+ typedef const _CharT* pointer;
+ typedef const _CharT& reference;
+
+public:
+ istreambuf_iterator(streambuf_type* __p = 0) { this->_M_init(__p); }
+ // istreambuf_iterator(basic_istream<_CharT, _Traits>& __is) { this->_M_init(_M_get_istreambuf(__is)); }
+ inline istreambuf_iterator(basic_istream<_CharT, _Traits>& __is);
+
+ char_type operator*() const { this->_M_getc(); return _M_c; }
+ istreambuf_iterator<_CharT, _Traits>& operator++() { this->_M_bumpc(); return *this; }
+ istreambuf_iterator<_CharT, _Traits> operator++(int);
+
+ bool equal(const istreambuf_iterator<_CharT, _Traits>& __i) const {
+ if (this->_M_buf)
+ this->_M_getc();
+ if (__i._M_buf)
+ __i._M_getc();
+ return this->_M_eof == __i._M_eof;
+ }
+
+private:
+ void _M_init(streambuf_type* __p) {
+ _M_buf = __p;
+ _M_eof = !__p;
+ // _M_is_initialized = _M_eof;
+ _M_have_c = false;
+ }
+
+ void _M_getc() const {
+ if (_M_have_c)
+ return;
+ int_type __c = _M_buf->sgetc();
+# if !defined (_STLP_NEED_MUTABLE) /* && ! defined (__SUNPRO_CC) */
+ _M_c = traits_type::to_char_type(__c);
+ _M_eof = traits_type::eq_int_type(__c, traits_type::eof());
+ _M_have_c = true;
+# else
+ typedef istreambuf_iterator<_CharT,_Traits> _Self;
+ _Self* __that = __CONST_CAST(_Self*, this);
+ __that->_M_c = __STATIC_CAST(_CharT, traits_type::to_char_type(__c));
+ __that->_M_eof = traits_type::eq_int_type(__c, traits_type::eof());
+ __that->_M_have_c = true;
+# endif
+ }
+
+ void _M_bumpc() {
+ _M_buf->sbumpc();
+ _M_have_c = false;
+ }
+
+private:
+ streambuf_type* _M_buf;
+ mutable _CharT _M_c;
+ mutable unsigned char _M_eof;
+ mutable unsigned char _M_have_c;
+};
+
+template<class _CharT, class _Traits>
+inline istreambuf_iterator<_CharT, _Traits>::istreambuf_iterator(basic_istream<_CharT, _Traits>& __is)
+{ this->_M_init(_M_get_istreambuf(__is)); }
+
+template<class _CharT, class _Traits>
+inline bool _STLP_CALL operator==(const istreambuf_iterator<_CharT, _Traits>& __x,
+ const istreambuf_iterator<_CharT, _Traits>& __y) {
+ return __x.equal(__y);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template<class _CharT, class _Traits>
+inline bool _STLP_CALL operator!=(const istreambuf_iterator<_CharT, _Traits>& __x,
+ const istreambuf_iterator<_CharT, _Traits>& __y) {
+ return !__x.equal(__y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS istreambuf_iterator<char, char_traits<char> >;
+# if defined (INSTANTIATE_WIDE_STREAMS)
+_STLP_EXPORT_TEMPLATE_CLASS istreambuf_iterator<wchar_t, char_traits<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _CharT, class _Traits>
+inline input_iterator_tag _STLP_CALL iterator_category(const istreambuf_iterator<_CharT, _Traits>&) { return input_iterator_tag(); }
+template <class _CharT, class _Traits>
+inline streamoff* _STLP_CALL
+distance_type(const istreambuf_iterator<_CharT, _Traits>&) { return (streamoff*)0; }
+template <class _CharT, class _Traits>
+inline _CharT* _STLP_CALL value_type(const istreambuf_iterator<_CharT, _Traits>&) { return (_CharT*)0; }
+# endif
+
+template <class _CharT, class _Traits>
+istreambuf_iterator<_CharT, _Traits>
+istreambuf_iterator<_CharT, _Traits>::operator++(int) {
+ istreambuf_iterator<_CharT, _Traits> __tmp = *this;
+ this->_M_bumpc();
+ this->_M_have_c = false;
+ return __tmp;
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_iterator.h b/src/STLport/stl/_iterator.h
new file mode 100644
index 0000000..34baef7
--- /dev/null
+++ b/src/STLport/stl/_iterator.h
@@ -0,0 +1,269 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_ITERATOR_H
+#define _STLP_INTERNAL_ITERATOR_H
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+#if defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION )
+// This is the new version of reverse_iterator, as defined in the
+// draft C++ standard. It relies on the iterator_traits template,
+// which in turn relies on partial specialization. The class
+// reverse_bidirectional_iterator is no longer part of the draft
+// standard, but it is retained for backward compatibility.
+
+template <class _Iterator>
+class reverse_iterator :
+ public iterator<typename iterator_traits<_Iterator>::iterator_category,
+ typename iterator_traits<_Iterator>::value_type,
+ typename iterator_traits<_Iterator>::difference_type,
+ typename iterator_traits<_Iterator>::pointer,
+ typename iterator_traits<_Iterator>::reference>
+{
+protected:
+ _Iterator current;
+ typedef reverse_iterator<_Iterator> _Self;
+public:
+ typedef typename iterator_traits<_Iterator>::iterator_category iterator_category;
+ typedef typename iterator_traits<_Iterator>::value_type value_type;
+ typedef typename iterator_traits<_Iterator>::difference_type difference_type;
+ typedef typename iterator_traits<_Iterator>::pointer pointer;
+ typedef typename iterator_traits<_Iterator>::reference reference;
+ typedef _Iterator iterator_type;
+public:
+ reverse_iterator() {}
+ explicit reverse_iterator(iterator_type __x) : current(__x) {}
+ reverse_iterator(const _Self& __x) : current(__x.current) {}
+ _Self& operator = (const _Self& __x) { current = __x.base(); return *this; }
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _Iter>
+ reverse_iterator(const reverse_iterator<_Iter>& __x) : current(__x.base()) {}
+ template <class _Iter>
+ _Self& operator = (const reverse_iterator<_Iter>& __x) { current = __x.base(); return *this; }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ iterator_type base() const { return current; }
+ reference operator*() const {
+ _Iterator __tmp = current;
+ return *--__tmp;
+ }
+ _STLP_DEFINE_ARROW_OPERATOR
+ _Self& operator++() {
+ --current;
+ return *this;
+ }
+ _Self operator++(int) {
+ _Self __tmp = *this;
+ --current;
+ return __tmp;
+ }
+ _Self& operator--() {
+ ++current;
+ return *this;
+ }
+ _Self operator--(int) {
+ _Self __tmp = *this;
+ ++current;
+ return __tmp;
+ }
+
+ _Self operator+(difference_type __n) const {
+ return _Self(current - __n);
+ }
+ _Self& operator+=(difference_type __n) {
+ current -= __n;
+ return *this;
+ }
+ _Self operator-(difference_type __n) const {
+ return _Self(current + __n);
+ }
+ _Self& operator-=(difference_type __n) {
+ current += __n;
+ return *this;
+ }
+ reference operator[](difference_type __n) const { return *(*this + __n); }
+};
+
+template <class _Iterator>
+inline bool _STLP_CALL operator==(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y) {
+ return __x.base() == __y.base();
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL operator<(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y) {
+ return __y.base() < __x.base();
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _Iterator>
+inline bool _STLP_CALL operator!=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y) {
+ return !(__x == __y);
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL operator>(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y) {
+ return __y < __x;
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL operator<=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y) {
+ return !(__y < __x);
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL operator>=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y) {
+ return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _Iterator>
+# ifdef __SUNPRO_CC
+inline ptrdiff_t _STLP_CALL
+# else
+inline typename reverse_iterator<_Iterator>::difference_type _STLP_CALL
+# endif
+operator-(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y) {
+ return __y.base() - __x.base();
+}
+
+template <class _Iterator, class _DifferenceType>
+inline reverse_iterator<_Iterator> _STLP_CALL
+operator+(_DifferenceType n,const reverse_iterator<_Iterator>& x) {
+ return x.operator+(n);
+}
+
+# endif
+
+template <class _Container>
+class back_insert_iterator
+ : public iterator<output_iterator_tag,void,void,void,void>
+{
+protected:
+ _Container* container;
+public:
+ typedef _Container container_type;
+ typedef output_iterator_tag iterator_category;
+
+ explicit back_insert_iterator(_Container& __x) : container(&__x) {}
+ back_insert_iterator<_Container>&
+ operator=(const typename _Container::value_type& __val) {
+ container->push_back(__val);
+ return *this;
+ }
+ back_insert_iterator<_Container>& operator*() { return *this; }
+ back_insert_iterator<_Container>& operator++() { return *this; }
+ back_insert_iterator<_Container> operator++(int) { return *this; }
+};
+
+template <class _Container>
+inline back_insert_iterator<_Container> _STLP_CALL back_inserter(_Container& __x) {
+ return back_insert_iterator<_Container>(__x);
+}
+
+template <class _Container>
+class front_insert_iterator
+ : public iterator<output_iterator_tag,void,void,void,void>
+{
+protected:
+ _Container* container;
+public:
+ typedef _Container container_type;
+ typedef output_iterator_tag iterator_category;
+ explicit front_insert_iterator(_Container& __x) : container(&__x) {}
+ front_insert_iterator<_Container>&
+ operator=(const typename _Container::value_type& __val) {
+ container->push_front(__val);
+ return *this;
+ }
+ front_insert_iterator<_Container>& operator*() { return *this; }
+ front_insert_iterator<_Container>& operator++() { return *this; }
+ front_insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+template <class _Container>
+inline front_insert_iterator<_Container> _STLP_CALL front_inserter(_Container& __x) {
+ return front_insert_iterator<_Container>(__x);
+}
+
+template <class _Container>
+class insert_iterator
+ : public iterator<output_iterator_tag,void,void,void,void>
+{
+protected:
+ _Container* container;
+ typename _Container::iterator iter;
+public:
+ typedef _Container container_type;
+ typedef output_iterator_tag iterator_category;
+ insert_iterator(_Container& __x, typename _Container::iterator __i)
+ : container(&__x), iter(__i) {}
+ insert_iterator<_Container>&
+ operator=(const typename _Container::value_type& __val) {
+ iter = container->insert(iter, __val);
+ ++iter;
+ return *this;
+ }
+ insert_iterator<_Container>& operator*() { return *this; }
+ insert_iterator<_Container>& operator++() { return *this; }
+ insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+template <class _Container, class _Iterator>
+inline insert_iterator<_Container> _STLP_CALL
+inserter(_Container& __x, _Iterator __i)
+{
+ typedef typename _Container::iterator __iter;
+ return insert_iterator<_Container>(__x, __iter(__i));
+}
+
+_STLP_END_NAMESPACE
+
+#if ! defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION ) || defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
+# include <stl/_iterator_old.h>
+#endif /* __NO_PARTIAL_SPEC || ANACHRONISMS */
+
+#endif /* _STLP_INTERNAL_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_iterator_base.h b/src/STLport/stl/_iterator_base.h
new file mode 100644
index 0000000..26b5161
--- /dev/null
+++ b/src/STLport/stl/_iterator_base.h
@@ -0,0 +1,463 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+#define _STLP_INTERNAL_ITERATOR_BASE_H
+
+#ifndef _STLP_CSTDDEF
+# include <cstddef>
+#endif
+
+# if defined (_STLP_IMPORT_VENDOR_CSTD) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
+_STLP_BEGIN_NAMESPACE
+using namespace _STLP_VENDOR_CSTD;
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+#ifndef __TYPE_TRAITS_H
+# include <stl/type_traits.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+struct input_iterator_tag {};
+struct output_iterator_tag {};
+struct forward_iterator_tag : public input_iterator_tag {};
+struct bidirectional_iterator_tag : public forward_iterator_tag {};
+struct random_access_iterator_tag : public bidirectional_iterator_tag {};
+
+
+template <class _Category, class _Tp, __DFL_TMPL_PARAM(_Distance,ptrdiff_t),
+ __DFL_TMPL_PARAM(_Pointer,_Tp*), __DFL_TMPL_PARAM(_Reference,_Tp&) >
+struct iterator {
+ typedef _Category iterator_category;
+ typedef _Tp value_type;
+ typedef _Distance difference_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+};
+_STLP_TEMPLATE_NULL
+struct iterator<output_iterator_tag, void, void, void, void> {
+ typedef output_iterator_tag iterator_category;
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+#endif
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+# define _STLP_ITERATOR_CATEGORY(_It, _Tp) iterator_category(_It)
+# define _STLP_DISTANCE_TYPE(_It, _Tp) distance_type(_It)
+# define _STLP_VALUE_TYPE(_It, _Tp) value_type(_It)
+# else
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+# define _STLP_VALUE_TYPE(_It, _Tp) (typename iterator_traits< _Tp >::value_type*)0
+# define _STLP_DISTANCE_TYPE(_It, _Tp) (typename iterator_traits< _Tp >::difference_type*)0
+# if defined (__BORLANDC__) || defined (__SUNPRO_CC) || ( defined (__MWERKS__) && (__MWERKS__ <= 0x2303)) || ( defined (__sgi) && defined (_COMPILER_VERSION)) || defined (__DMC__)
+# define _STLP_ITERATOR_CATEGORY(_It, _Tp) iterator_traits< _Tp >::iterator_category()
+# else
+# define _STLP_ITERATOR_CATEGORY(_It, _Tp) typename iterator_traits< _Tp >::iterator_category()
+# endif
+# else
+# define _STLP_ITERATOR_CATEGORY(_It, _Tp) __iterator_category(_It, _IsPtrType<_Tp>::_Ret())
+# define _STLP_DISTANCE_TYPE(_It, _Tp) (ptrdiff_t*)0
+# define _STLP_VALUE_TYPE(_It, _Tp) __value_type(_It, _IsPtrType<_Tp>::_Ret() )
+# endif
+# endif
+
+template <class _Iterator>
+struct iterator_traits {
+ typedef typename _Iterator::iterator_category iterator_category;
+ typedef typename _Iterator::value_type value_type;
+ typedef typename _Iterator::difference_type difference_type;
+ typedef typename _Iterator::pointer pointer;
+ typedef typename _Iterator::reference reference;
+};
+
+
+# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && ! defined (__SUNPRO_CC)
+# define _STLP_DIFFERENCE_TYPE(_Iterator) typename iterator_traits<_Iterator>::difference_type
+# else
+# define _STLP_DIFFERENCE_TYPE(_Iterator) ptrdiff_t
+# endif
+
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+// fbp : this order keeps gcc happy
+template <class _Tp>
+struct iterator_traits<const _Tp*> {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef const _Tp* pointer;
+ typedef const _Tp& reference;
+};
+
+template <class _Tp>
+struct iterator_traits<_Tp*> {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef _Tp& reference;
+};
+
+# if defined (__BORLANDC__)
+template <class _Tp>
+struct iterator_traits<_Tp* const> {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef const _Tp* pointer;
+ typedef const _Tp& reference;
+};
+# endif
+
+# endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+
+# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) \
+ || (defined (_STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS) && ! defined (_STLP_NO_ARROW_OPERATOR))
+# define _STLP_POINTERS_SPECIALIZE( _TpP )
+# define _STLP_DEFINE_ARROW_OPERATOR pointer operator->() const { return &(operator*()); }
+# else
+# include <stl/_ptrs_specialize.h>
+# endif
+
+# ifndef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+// The overloaded functions iterator_category, distance_type, and
+// value_type are not part of the C++ standard. (They have been
+// replaced by struct iterator_traits.) They are included for
+// backward compatibility with the HP STL.
+// We introduce internal names for these functions.
+
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+template <class _Iter>
+inline typename iterator_traits<_Iter>::iterator_category __iterator_category(const _Iter&) {
+ typedef typename iterator_traits<_Iter>::iterator_category _Category;
+ return _Category();
+}
+
+template <class _Iter>
+inline typename iterator_traits<_Iter>::difference_type* __distance_type(const _Iter&) {
+ typedef typename iterator_traits<_Iter>::difference_type _diff_type;
+ return __STATIC_CAST(_diff_type*,0);
+}
+
+template <class _Iter>
+inline typename iterator_traits<_Iter>::value_type* __value_type(const _Iter&) {
+ typedef typename iterator_traits<_Iter>::value_type _value_type;
+ return __STATIC_CAST(_value_type*,0);
+}
+
+# else
+
+template <class _Iter>
+inline random_access_iterator_tag
+__iterator_category(const _Iter&, const __true_type&) {
+ return random_access_iterator_tag();
+}
+
+template <class _Iter>
+inline _STLP_TYPENAME_ON_RETURN_TYPE iterator_traits<_Iter>::iterator_category
+__iterator_category(const _Iter&, const __false_type&) {
+ typedef typename iterator_traits<_Iter>::iterator_category _Category;
+ return _Category();
+}
+
+
+template <class _Iter>
+inline ptrdiff_t* _STLP_CALL __distance_type(const _Iter&) { return (ptrdiff_t*)(0); }
+
+template <class _Iter>
+inline _STLP_TYPENAME_ON_RETURN_TYPE iterator_traits<_Iter>::value_type*
+__value_type(const _Iter&, const __false_type&) {
+ typedef typename iterator_traits<_Iter>::value_type _value_type;
+ return __STATIC_CAST(_value_type*,0);
+}
+
+template <class _Tp>
+inline _Tp*
+__value_type(const _Tp*, const __true_type&) {
+ return __STATIC_CAST(_Tp*, 0);
+}
+
+# endif
+
+#else /* old queries */
+template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
+inline _Category _STLP_CALL iterator_category(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return _Category(); }
+template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
+inline _Tp* _STLP_CALL value_type(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return (_Tp*)(0); }
+template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
+inline _Distance* _STLP_CALL distance_type(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return (_Distance*)(0); }
+template <class _Tp>
+inline random_access_iterator_tag _STLP_CALL iterator_category(const _Tp*) { return random_access_iterator_tag(); }
+template <class _Tp>
+inline _Tp* _STLP_CALL value_type(const _Tp*) { return (_Tp*)(0); }
+template <class _Tp>
+inline ptrdiff_t* _STLP_CALL distance_type(const _Tp*) { return (ptrdiff_t*)(0); }
+#endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */
+
+# if ! defined (_STLP_NO_ANACHRONISMS)
+// The base classes input_iterator, output_iterator, forward_iterator,
+// bidirectional_iterator, and random_access_iterator are not part of
+// the C++ standard. (They have been replaced by struct iterator.)
+// They are included for backward compatibility with the HP STL.
+template <class _Tp, class _Distance> struct input_iterator :
+ public iterator <input_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
+struct output_iterator : public iterator <output_iterator_tag, void, void, void, void> {};
+template <class _Tp, class _Distance> struct forward_iterator :
+ public iterator<forward_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
+template <class _Tp, class _Distance> struct bidirectional_iterator :
+ public iterator<bidirectional_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
+template <class _Tp, class _Distance> struct random_access_iterator :
+ public iterator<random_access_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
+
+# if defined (_STLP_BASE_MATCH_BUG) && defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
+template <class _Tp, class _Distance>
+inline input_iterator_tag _STLP_CALL
+iterator_category(const input_iterator<_Tp, _Distance>&) { return input_iterator_tag(); }
+inline output_iterator_tag _STLP_CALL
+iterator_category(const output_iterator&) { return output_iterator_tag(); }
+template <class _Tp, class _Distance>
+inline forward_iterator_tag _STLP_CALL
+iterator_category(const forward_iterator<_Tp, _Distance>&) { return forward_iterator_tag(); }
+template <class _Tp, class _Distance>
+inline bidirectional_iterator_tag _STLP_CALL
+iterator_category(const bidirectional_iterator<_Tp, _Distance>&) { return bidirectional_iterator_tag(); }
+template <class _Tp, class _Distance>
+inline random_access_iterator_tag _STLP_CALL
+iterator_category(const random_access_iterator<_Tp, _Distance>&) { return random_access_iterator_tag(); }
+template <class _Tp, class _Distance>
+inline _Tp* _STLP_CALL value_type(const input_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
+template <class _Tp, class _Distance>
+inline _Tp* _STLP_CALL value_type(const forward_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
+template <class _Tp, class _Distance>
+inline _Tp* _STLP_CALL value_type(const bidirectional_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
+template <class _Tp, class _Distance>
+inline _Tp* _STLP_CALL value_type(const random_access_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
+template <class _Tp, class _Distance>
+inline _Distance* _STLP_CALL distance_type(const input_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }
+template <class _Tp, class _Distance>
+inline _Distance* _STLP_CALL distance_type(const forward_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }
+template <class _Tp, class _Distance>
+inline _Distance* _STLP_CALL distance_type(const bidirectional_iterator<_Tp, _Distance>&) { return (_Distance*)(0);}
+template <class _Tp, class _Distance>
+inline _Distance* _STLP_CALL distance_type(const random_access_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }
+# endif /* BASE_MATCH */
+
+#endif /* _STLP_NO_ANACHRONISMS */
+
+template <class _InputIterator, class _Distance>
+inline void _STLP_CALL __distance(const _InputIterator& __first, const _InputIterator& __last,
+ _Distance& __n, const input_iterator_tag &) {
+ _InputIterator __it(__first);
+ while (__it != __last) { ++__it; ++__n; }
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
+template <class _ForwardIterator, class _Distance>
+inline void _STLP_CALL __distance(const _ForwardIterator& __first, const _ForwardIterator& __last,
+ _Distance& __n, const forward_iterator_tag &) {
+ _ForwardIterator __it(__first);
+ while (__it != __last) { ++__first; ++__n; }
+}
+
+template <class _BidirectionalIterator, class _Distance>
+_STLP_INLINE_LOOP void _STLP_CALL __distance(const _BidirectionalIterator& __first,
+ const _BidirectionalIterator& __last,
+ _Distance& __n, const bidirectional_iterator_tag &) {
+ _BidirectionalIterator __it(__first);
+ while (__it != __last) { ++__it; ++__n; }
+}
+# endif
+
+template <class _RandomAccessIterator, class _Distance>
+inline void _STLP_CALL __distance(const _RandomAccessIterator& __first,
+ const _RandomAccessIterator& __last,
+ _Distance& __n, const random_access_iterator_tag &) {
+ __n += __last - __first;
+}
+
+#ifndef _STLP_NO_ANACHRONISMS
+template <class _InputIterator, class _Distance>
+inline void _STLP_CALL distance(const _InputIterator& __first,
+ const _InputIterator& __last, _Distance& __n) {
+ __distance(__first, __last, __n, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+}
+#endif
+
+template <class _InputIterator>
+inline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL
+__distance(const _InputIterator& __first, const _InputIterator& __last, const input_iterator_tag &) {
+ _STLP_DIFFERENCE_TYPE(_InputIterator) __n = 0;
+ _InputIterator __it(__first);
+ while (__it != __last) {
+ ++__it; ++__n;
+ }
+ return __n;
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
+template <class _ForwardIterator>
+inline _STLP_DIFFERENCE_TYPE(_ForwardIterator) _STLP_CALL
+__distance(const _ForwardIterator& __first, const _ForwardIterator& __last,
+ const forward_iterator_tag &)
+{
+ _STLP_DIFFERENCE_TYPE(_ForwardIterator) __n = 0;
+ _ForwardIterator __it(__first);
+ while (__it != __last) {
+ ++__it; ++__n;
+ }
+ return __n;
+}
+
+template <class _BidirectionalIterator>
+_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) _STLP_CALL
+__distance(const _BidirectionalIterator& __first,
+ const _BidirectionalIterator& __last,
+ const bidirectional_iterator_tag &) {
+ _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) __n = 0;
+ _BidirectionalIterator __it(__first);
+ while (__it != __last) {
+ ++__it; ++__n;
+ }
+ return __n;
+}
+# endif
+
+template <class _RandomAccessIterator>
+inline _STLP_DIFFERENCE_TYPE(_RandomAccessIterator) _STLP_CALL
+__distance(const _RandomAccessIterator& __first, const _RandomAccessIterator& __last,
+ const random_access_iterator_tag &) {
+ return __last - __first;
+}
+
+template <class _InputIterator>
+inline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL
+distance(const _InputIterator& __first, const _InputIterator& __last) {
+ return __distance(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+}
+
+
+// fbp: those are being used for iterator/const_iterator definitions everywhere
+template <class _Tp>
+struct _Nonconst_traits;
+
+template <class _Tp>
+struct _Const_traits {
+ typedef _Tp value_type;
+ typedef const _Tp& reference;
+ typedef const _Tp* pointer;
+ typedef _Nonconst_traits<_Tp> _Non_const_traits;
+};
+
+template <class _Tp>
+struct _Nonconst_traits {
+ typedef _Tp value_type;
+ typedef _Tp& reference;
+ typedef _Tp* pointer;
+ typedef _Nonconst_traits<_Tp> _Non_const_traits;
+};
+
+# if defined (_STLP_BASE_TYPEDEF_BUG)
+// this workaround is needed for SunPro 4.0.1
+template <class _Traits>
+struct __cnst_traits_aux : private _Traits
+{
+ typedef typename _Traits::value_type value_type;
+};
+# define __TRAITS_VALUE_TYPE(_Traits) __cnst_traits_aux<_Traits>::value_type
+# else
+# define __TRAITS_VALUE_TYPE(_Traits) _Traits::value_type
+# endif
+
+# if defined (_STLP_MSVC)
+// MSVC specific
+template <class _InputIterator, class _Dist>
+inline void _STLP_CALL _Distance(_InputIterator __first,
+ _InputIterator __last, _Dist& __n) {
+ __distance(__first, __last, __n, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+}
+# endif
+
+template <class _InputIter, class _Distance>
+_STLP_INLINE_LOOP void _STLP_CALL __advance(_InputIter& __i, _Distance __n, const input_iterator_tag &) {
+ while (__n--) ++__i;
+}
+
+// fbp : added output iterator tag variant
+template <class _InputIter, class _Distance>
+_STLP_INLINE_LOOP void _STLP_CALL __advance(_InputIter& __i, _Distance __n, const output_iterator_tag &) {
+ while (__n--) ++__i;
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
+template <class _ForwardIterator, class _Distance>
+_STLP_INLINE_LOOP void _STLP_CALL __advance(_ForwardIterator& i, _Distance n, const forward_iterator_tag &) {
+ while (n--) ++i;
+}
+# endif
+
+template <class _BidirectionalIterator, class _Distance>
+_STLP_INLINE_LOOP void _STLP_CALL __advance(_BidirectionalIterator& __i, _Distance __n,
+ const bidirectional_iterator_tag &) {
+ if (__n > 0)
+ while (__n--) ++__i;
+ else
+ while (__n++) --__i;
+}
+
+template <class _RandomAccessIterator, class _Distance>
+inline void _STLP_CALL __advance(_RandomAccessIterator& __i, _Distance __n,
+ const random_access_iterator_tag &) {
+ __i += __n;
+}
+
+template <class _InputIterator, class _Distance>
+inline void _STLP_CALL advance(_InputIterator& __i, _Distance __n) {
+ __advance(__i, __n, _STLP_ITERATOR_CATEGORY(__i, _InputIterator));
+}
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_DEBUG) && ! defined (_STLP_DEBUG_H)
+# include <stl/debug/_debug.h>
+# endif
+
+#endif /* _STLP_INTERNAL_ITERATOR_BASE_H */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_iterator_old.h b/src/STLport/stl/_iterator_old.h
new file mode 100644
index 0000000..3b3b038
--- /dev/null
+++ b/src/STLport/stl/_iterator_old.h
@@ -0,0 +1,351 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_ITERATOR_OLD_H
+#define _STLP_INTERNAL_ITERATOR_OLD_H
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+
+template <class _Container>
+inline output_iterator_tag _STLP_CALL
+iterator_category(const back_insert_iterator<_Container>&) { return output_iterator_tag(); }
+template <class _Container>
+inline output_iterator_tag _STLP_CALL
+iterator_category(const front_insert_iterator<_Container>&) { return output_iterator_tag(); }
+template <class _Container>
+inline output_iterator_tag _STLP_CALL
+iterator_category(const insert_iterator<_Container>&) { return output_iterator_tag(); }
+
+# endif
+
+# if defined (_STLP_MSVC50_COMPATIBILITY)
+# define __Reference _Reference, class _Pointer
+# define Reference__ _Reference, _Pointer
+template <class _BidirectionalIterator, class _Tp,
+ __DFL_TMPL_PARAM(_Reference, _Tp& ),
+ __DFL_TMPL_PARAM(_Pointer, _Tp*),
+ __DFL_TYPE_PARAM(_Distance, ptrdiff_t)>
+# else
+# define __Reference _Reference
+# define Reference__ _Reference
+template <class _BidirectionalIterator, class _Tp, __DFL_TMPL_PARAM(_Reference, _Tp& ),
+ __DFL_TYPE_PARAM(_Distance, ptrdiff_t)>
+# endif
+class reverse_bidirectional_iterator {
+ typedef reverse_bidirectional_iterator<_BidirectionalIterator, _Tp,
+ Reference__, _Distance> _Self;
+ // friend inline bool operator== _STLP_NULL_TMPL_ARGS (const _Self& x, const _Self& y);
+protected:
+ _BidirectionalIterator current;
+public:
+ typedef bidirectional_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef _Distance difference_type;
+# if defined (_STLP_MSVC50_COMPATIBILITY)
+ typedef _Pointer pointer;
+# else
+ typedef _Tp* pointer;
+# endif
+ typedef _Reference reference;
+
+ reverse_bidirectional_iterator() {}
+ explicit reverse_bidirectional_iterator(_BidirectionalIterator __x)
+ : current(__x) {}
+ _BidirectionalIterator base() const { return current; }
+ _Reference operator*() const {
+ _BidirectionalIterator __tmp = current;
+ return *--__tmp;
+ }
+# if !(defined _STLP_NO_ARROW_OPERATOR)
+ _STLP_DEFINE_ARROW_OPERATOR
+# endif
+ _Self& operator++() {
+ --current;
+ return *this;
+ }
+ _Self operator++(int) {
+ _Self __tmp = *this;
+ --current;
+ return __tmp;
+ }
+ _Self& operator--() {
+ ++current;
+ return *this;
+ }
+ _Self operator--(int) {
+ _Self __tmp = *this;
+ ++current;
+ return __tmp;
+ }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _BidirectionalIterator, class _Tp, class __Reference,
+ class _Distance>
+inline bidirectional_iterator_tag _STLP_CALL
+iterator_category(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, Reference__, _Distance>&)
+{ return bidirectional_iterator_tag(); }
+template <class _BidirectionalIterator, class _Tp, class __Reference,
+ class _Distance>
+inline _Tp* _STLP_CALL
+value_type(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, Reference__, _Distance>&)
+{ return (_Tp*) 0; }
+template <class _BidirectionalIterator, class _Tp, class __Reference,
+ class _Distance>
+inline _Distance* _STLP_CALL
+distance_type(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, Reference__, _Distance>&)
+{ return (_Distance*) 0; }
+#endif
+
+template <class _BidirectionalIterator, class _Tp, class __Reference,
+ class _Distance>
+inline bool _STLP_CALL operator==(
+ const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp,
+ Reference__, _Distance>& __x,
+ const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp,
+ Reference__, _Distance>& __y)
+{
+ return __x.base() == __y.base();
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _BiIter, class _Tp, class __Reference, class _Distance>
+inline bool _STLP_CALL operator!=(
+ const reverse_bidirectional_iterator<_BiIter, _Tp, Reference__, _Distance>& __x,
+ const reverse_bidirectional_iterator<_BiIter, _Tp, Reference__, _Distance>& __y)
+{
+ return !(__x == __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+#if ! defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION )
+
+// This is the old version of reverse_iterator, as found in the original
+// HP STL. It does not use partial specialization.
+
+template <class _RandomAccessIterator,
+# if defined (__MSL__) && (__MSL__ >= 0x2405) \
+ || defined(__MRC__) || (defined(__SC__) && !defined(__DMC__)) //*ty 03/22/2001 - give the default to the secont param under MPW.
+ // I believe giving the default will cause any harm even though the 2nd type parameter
+ // still have to be provided for T* type iterators.
+ __DFL_TMPL_PARAM(_Tp,iterator_traits<_RandomAccessIterator>::value_type),
+# else
+ class _Tp,
+#endif
+ __DFL_TMPL_PARAM(_Reference,_Tp&),
+# if defined (_STLP_MSVC50_COMPATIBILITY)
+ __DFL_TMPL_PARAM(_Pointer, _Tp*),
+# endif
+ __DFL_TYPE_PARAM(_Distance,ptrdiff_t)>
+class reverse_iterator {
+ typedef reverse_iterator<_RandomAccessIterator, _Tp, Reference__, _Distance>
+ _Self;
+protected:
+ _RandomAccessIterator __current;
+public:
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef _Distance difference_type;
+# if defined (_STLP_MSVC50_COMPATIBILITY)
+ typedef _Pointer pointer;
+# else
+ typedef _Tp* pointer;
+# endif
+ typedef _Reference reference;
+
+ reverse_iterator() {}
+ reverse_iterator(const _Self& __x) : __current(__x.base()) {}
+ explicit reverse_iterator(_RandomAccessIterator __x) : __current(__x) {}
+ _Self& operator=(const _Self& __x) {__current = __x.base(); return *this; }
+
+ _RandomAccessIterator base() const { return __current; }
+ _Reference operator*() const { return *(__current - (difference_type)1); }
+
+# if !(defined _STLP_NO_ARROW_OPERATOR)
+ _STLP_DEFINE_ARROW_OPERATOR
+# endif
+
+ _Self& operator++() {
+ --__current;
+ return *this;
+ }
+ _Self operator++(int) {
+ _Self __tmp = *this;
+ --__current;
+ return __tmp;
+ }
+ _Self& operator--() {
+ ++__current;
+ return *this;
+ }
+ _Self operator--(int) {
+ _Self __tmp = *this;
+ ++__current;
+ return __tmp;
+ }
+ _Self operator+(_Distance __n) const {
+ return _Self(__current - __n);
+ }
+ _Self& operator+=(_Distance __n) {
+ __current -= __n;
+ return *this;
+ }
+ _Self operator-(_Distance __n) const {
+ return _Self(__current + __n);
+ }
+ _Self& operator-=(_Distance __n) {
+ __current += __n;
+ return *this;
+ }
+ _Reference operator[](_Distance __n) const { return *(*this + __n); }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _RandomAccessIterator, class _Tp,
+ class __Reference, class _Distance>
+inline random_access_iterator_tag _STLP_CALL
+iterator_category(const reverse_iterator<_RandomAccessIterator, _Tp, Reference__, _Distance>&)
+{ return random_access_iterator_tag(); }
+template <class _RandomAccessIterator, class _Tp,
+ class __Reference, class _Distance>
+inline _Tp* _STLP_CALL value_type(const reverse_iterator<_RandomAccessIterator, _Tp, Reference__, _Distance>&)
+{ return (_Tp*) 0; }
+template <class _RandomAccessIterator, class _Tp,
+ class __Reference, class _Distance>
+inline _Distance* _STLP_CALL
+distance_type(const reverse_iterator<_RandomAccessIterator, _Tp, Reference__, _Distance>&)
+{ return (_Distance*) 0; }
+#endif
+
+template <class _RandomAccessIterator, class _Tp,
+ class __Reference, class _Distance>
+inline bool _STLP_CALL
+operator==(const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __x,
+ const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __y)
+{
+ return __x.base() == __y.base();
+}
+
+template <class _RandomAccessIterator, class _Tp,
+ class __Reference, class _Distance>
+inline bool _STLP_CALL
+operator<(const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __x,
+ const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __y)
+{
+ return __y.base() < __x.base();
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _RandomAccessIterator, class _Tp,
+ class __Reference, class _Distance>
+inline bool _STLP_CALL
+operator!=(const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __x,
+ const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __y) {
+ return !(__x == __y);
+}
+
+template <class _RandomAccessIterator, class _Tp,
+ class __Reference, class _Distance>
+inline bool _STLP_CALL
+operator>(const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __x,
+ const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __y) {
+ return __y < __x;
+}
+
+template <class _RandomAccessIterator, class _Tp,
+ class __Reference, class _Distance>
+inline bool _STLP_CALL
+operator<=(const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __x,
+ const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __y) {
+ return !(__y < __x);
+}
+
+template <class _RandomAccessIterator, class _Tp,
+ class __Reference, class _Distance>
+inline bool _STLP_CALL
+operator>=(const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __x,
+ const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __y) {
+ return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _RandomAccessIterator, class _Tp,
+ class __Reference, class _Distance>
+inline _Distance _STLP_CALL
+operator-(const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __x,
+ const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __y)
+{
+ return __y.base() - __x.base();
+}
+
+template <class _RandomAccessIterator, class _Tp,
+ class __Reference, class _Distance>
+inline reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance> _STLP_CALL
+operator+(_Distance __n,
+ const reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>& __x)
+{
+ return reverse_iterator<_RandomAccessIterator, _Tp,
+ Reference__, _Distance>(__x.base() - __n);
+}
+
+#endif /* ! defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION ) */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_limits.c b/src/STLport/stl/_limits.c
new file mode 100644
index 0000000..5048d3f
--- /dev/null
+++ b/src/STLport/stl/_limits.c
@@ -0,0 +1,293 @@
+/*
+ * Copyright (c) 1998,1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_LIMITS_C)
+# define _STLP_LIMITS_C
+
+#ifndef _STLP_INTERNAL_LIMITS_H
+# include <stl/_limits.h>
+#endif
+
+//==========================================================
+// numeric_limits static members
+//==========================================================
+
+_STLP_BEGIN_NAMESPACE
+
+# if ! defined ( _STLP_STATIC_CONST_INIT_BUG)
+
+# define __declare_numeric_base_member(__type, __mem, _Init) \
+template <class __number> \
+ const __type _Numeric_limits_base<__number>:: __mem
+
+__declare_numeric_base_member(bool, is_specialized, false);
+__declare_numeric_base_member(int, digits, 0);
+__declare_numeric_base_member(int, digits10, 0);
+__declare_numeric_base_member(bool, is_signed, false);
+__declare_numeric_base_member(bool, is_integer, false);
+__declare_numeric_base_member(bool, is_exact, false);
+__declare_numeric_base_member(int, radix, 0);
+__declare_numeric_base_member(int, min_exponent, 0);
+__declare_numeric_base_member(int, max_exponent, 0);
+__declare_numeric_base_member(int, min_exponent10, 0);
+__declare_numeric_base_member(int, max_exponent10, 0);
+__declare_numeric_base_member(bool, has_infinity, false);
+__declare_numeric_base_member(bool, has_quiet_NaN, false);
+__declare_numeric_base_member(bool, has_signaling_NaN, false);
+__declare_numeric_base_member(float_denorm_style, has_denorm, denorm_absent);
+__declare_numeric_base_member(bool, has_denorm_loss, false);
+__declare_numeric_base_member(bool, is_iec559, false);
+__declare_numeric_base_member(bool, is_bounded, false);
+__declare_numeric_base_member(bool, is_modulo, false);
+__declare_numeric_base_member(bool, traps, false);
+__declare_numeric_base_member(bool, tinyness_before, false);
+__declare_numeric_base_member(float_round_style, round_style, round_toward_zero);
+
+# undef __declare_numeric_base_member
+
+# define __declare_integer_limits_member(__type, __mem, _Init) \
+template <class _Int, _STLP_LIMITS_MIN_TYPE __imin, _STLP_LIMITS_MAX_TYPE __imax, int __idigits, bool __ismod> \
+ const __type _Integer_limits<_Int, __imin, __imax, __idigits, __ismod>:: __mem
+
+__declare_integer_limits_member(bool, is_specialized, true);
+__declare_integer_limits_member(int, digits, (__idigits < 0) ? \
+ ((int)((sizeof(_Int) * (CHAR_BIT))) - ((__imin == 0) ? 0 : 1)) \
+ : (__idigits) );
+__declare_integer_limits_member(int, digits10, (int)(301UL * digits) /1000);
+__declare_integer_limits_member(bool, is_signed, __imin != 0);
+__declare_integer_limits_member(bool, is_integer, true);
+__declare_integer_limits_member(bool, is_exact, true);
+__declare_integer_limits_member(int, radix, 2);
+__declare_integer_limits_member(bool, is_bounded, true);
+__declare_integer_limits_member(bool, is_modulo, true);
+
+# define __declare_float_limits_member(__type, __mem, _Init) \
+template <class __number, \
+ int __Digits, int __Digits10, \
+ int __MinExp, int __MaxExp, \
+ int __MinExp10, int __MaxExp10, \
+ bool __IsIEC559, \
+ float_round_style __RoundStyle> \
+const __type _Floating_limits< __number, __Digits, __Digits10, \
+ __MinExp, __MaxExp, __MinExp10, __MaxExp10, \
+ __IsIEC559, __RoundStyle>::\
+ __mem
+
+__declare_float_limits_member(bool, is_specialized, true);
+__declare_float_limits_member(int, digits, __Digits);
+__declare_float_limits_member(int, digits10, __Digits10);
+__declare_float_limits_member(bool, is_signed, true);
+__declare_float_limits_member(int, radix, FLT_RADIX);
+__declare_float_limits_member(int, min_exponent, __MinExp);
+__declare_float_limits_member(int, max_exponent, __MaxExp);
+__declare_float_limits_member(int, min_exponent10, __MinExp10);
+__declare_float_limits_member(int, max_exponent10, __MaxExp10);
+__declare_float_limits_member(bool, has_infinity, true);
+__declare_float_limits_member(bool, has_quiet_NaN, true);
+__declare_float_limits_member(bool, has_signaling_NaN, true);
+__declare_float_limits_member(float_denorm_style, has_denorm, denorm_indeterminate);
+__declare_float_limits_member(bool, has_denorm_loss, false);
+__declare_float_limits_member(bool, is_iec559, __IsIEC559);
+__declare_float_limits_member(bool, is_bounded, true);
+__declare_float_limits_member(bool, traps, true);
+__declare_float_limits_member(bool, tinyness_before, false);
+__declare_float_limits_member(float_round_style, round_style, __RoundStyle);
+
+# endif /* _STLP_STATIC_CONST_INIT_BUG */
+
+
+# ifdef _STLP_EXPOSE_GLOBALS_IMPLEMENTATION
+
+# if defined(_STLP_BIG_ENDIAN)
+# if defined(__OS400__)
+# define _STLP_FLOAT_INF_REP { 0x7f80, 0 }
+# define _STLP_FLOAT_QNAN_REP { 0xffc0, 0 }
+# define _STLP_FLOAT_SNAN_REP { 0xff80, 0 }
+# define _STLP_DOUBLE_INF_REP { 0x7ff0, 0, 0, 0 }
+# define _STLP_DOUBLE_QNAN_REP { 0xfff8, 0, 0, 0 }
+# define _STLP_DOUBLE_SNAN_REP { 0xfff0, 0, 0, 0 }
+# define _STLP_LDOUBLE_INF_REP { 0x7ff0, 0, 0, 0, 0, 0, 0, 0 }
+# define _STLP_LDOUBLE_QNAN_REP { 0xfff8, 0, 0, 0, 0, 0, 0, 0 }
+# define _STLP_LDOUBLE_SNAN_REP { 0xfff0, 0, 0, 0, 0, 0, 0, 0 }
+# else
+# define _STLP_FLOAT_INF_REP { 0x7f80, 0 }
+# define _STLP_FLOAT_SNAN_REP { 0x7f81, 0 }
+# define _STLP_FLOAT_QNAN_REP { 0x7fc1, 0 }
+# define _STLP_DOUBLE_INF_REP { 0x7ff0, 0, 0, 0 }
+# define _STLP_DOUBLE_QNAN_REP { 0x7ff1, 0, 0, 0 }
+# define _STLP_DOUBLE_SNAN_REP { 0x7ff9, 0, 0, 0 }
+# define _STLP_LDOUBLE_INF_REP { 0x7ff0, 0, 0, 0, 0, 0, 0, 0 }
+# define _STLP_LDOUBLE_SNAN_REP { 0x7ff1, 0, 0, 0, 0, 0, 0, 0 }
+# define _STLP_LDOUBLE_QNAN_REP { 0x7ff9, 0, 0, 0, 0, 0, 0, 0 }
+# endif
+
+# elif defined (_STLP_LITTLE_ENDIAN)
+
+# if 0 /* defined(_STLP_MSVC) || defined(__linux__) */
+// some IA-32 platform ??
+# define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
+# define _STLP_FLOAT_QNAN_REP { 0, 0xffc0 }
+# define _STLP_FLOAT_SNAN_REP { 0, 0xff80 }
+
+# define _STLP_DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
+# define _STLP_DOUBLE_QNAN_REP { 0, 0, 0, 0xfff8 }
+# define _STLP_DOUBLE_SNAN_REP { 0, 0, 0, 0xfff0 }
+# define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x7FF0, 0 } // ????
+# define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xFFF8, 0 } // ????
+# define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xFFF0, 0 } // ????
+
+# elif defined(__DECCXX)
+
+# define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
+# define _STLP_FLOAT_QNAN_REP { 0, 0xffc0 }
+# define _STLP_FLOAT_SNAN_REP { 0x5555, 0x7f85 }
+
+# define _STLP_DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
+# define _STLP_DOUBLE_QNAN_REP { 0, 0, 0, 0xfff8 }
+# define _STLP_DOUBLE_SNAN_REP { 0x5555, 0x5555, 0x5555, 0x7ff5 }
+
+# define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0, 0, 0, 0, 0x7fff }
+# define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0, 0, 0, 0x8000, 0xffff }
+# define _STLP_LDOUBLE_SNAN_REP { 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x7fff}
+# else
+# define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
+# define _STLP_FLOAT_QNAN_REP { 0, 0x7fa0 }
+# define _STLP_FLOAT_SNAN_REP { 0, 0x7fc0 }
+# define _STLP_DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
+# define _STLP_DOUBLE_QNAN_REP { 0, 0, 0, 0x7ff4 }
+# define _STLP_DOUBLE_SNAN_REP { 0, 0, 0, 0x7ff8 }
+# if defined (_STLP_MSVC) || defined (__ICL) || defined (__BORLANDC__)
+# define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x7FF0, 0 } // ????
+# define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xFFF8, 0 } // ????
+# define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xFFF8, 0 }
+# else
+# define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x8000, 0x7fff }
+# define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xa000, 0x7fff }
+# define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xc000, 0x7fff }
+# endif
+# endif
+#else
+/* This is an architecture we don't know how to handle. Return some
+obviously wrong values. */
+# define _STLP_FLOAT_INF_REP { 0, 0 }
+# define _STLP_FLOAT_QNAN_REP { 0, 0 }
+# define _STLP_FLOAT_SNAN_REP { 0, 0 }
+# define _STLP_DOUBLE_INF_REP { 0, 0 }
+# define _STLP_DOUBLE_QNAN_REP { 0, 0 }
+# define _STLP_DOUBLE_SNAN_REP { 0, 0 }
+# define _STLP_LDOUBLE_INF_REP { 0 }
+# define _STLP_LDOUBLE_QNAN_REP { 0 }
+# define _STLP_LDOUBLE_SNAN_REP { 0 }
+
+#endif
+
+
+# if 0
+# if defined(_STLP_BIG_ENDIAN)
+
+# elif defined (_STLP_LITTLE_ENDIAN)
+#else
+
+/* This is an architecture we don't know how to handle. Return some
+ obviously wrong values. */
+# define _STLP_FLOAT_INF_REP { 0, 0 }
+# define _STLP_FLOAT_QNAN_REP { 0, 0 }
+# define _STLP_FLOAT_SNAN_REP { 0, 0 }
+# define _STLP_DOUBLE_INF_REP { 0, 0 }
+# define _STLP_DOUBLE_QNAN_REP { 0, 0 }
+# define _STLP_DOUBLE_SNAN_REP { 0, 0 }
+# define _STLP_LDOUBLE_INF_REP { 0 }
+# define _STLP_LDOUBLE_QNAN_REP { 0 }
+# define _STLP_LDOUBLE_SNAN_REP { 0 }
+
+#endif
+# endif
+
+#if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+
+# ifndef _STLP_NO_LONG_DOUBLE
+template <class __dummy>
+const _L_rep _LimG<__dummy>::_L_inf = {_STLP_LDOUBLE_INF_REP};
+template <class __dummy>
+const _L_rep _LimG<__dummy>::_L_qNaN = {_STLP_LDOUBLE_QNAN_REP};
+template <class __dummy>
+const _L_rep _LimG<__dummy>::_L_sNaN = {_STLP_LDOUBLE_SNAN_REP};
+# endif
+template <class __dummy>
+const _D_rep _LimG<__dummy>::_D_inf = {_STLP_DOUBLE_INF_REP};
+template <class __dummy>
+const _D_rep _LimG<__dummy>::_D_qNaN = {_STLP_DOUBLE_QNAN_REP};
+template <class __dummy>
+const _D_rep _LimG<__dummy>::_D_sNaN = {_STLP_DOUBLE_SNAN_REP};
+template <class __dummy>
+const _F_rep _LimG<__dummy>::_F_inf = {_STLP_FLOAT_INF_REP};
+template <class __dummy>
+const _F_rep _LimG<__dummy>::_F_qNaN = {_STLP_FLOAT_QNAN_REP};
+template <class __dummy>
+const _F_rep _LimG<__dummy>::_F_sNaN = {_STLP_FLOAT_SNAN_REP};
+
+#else
+
+__DECLARE_INSTANCE( const _F_rep,
+ _LimG<bool>::_F_inf, = _STLP_FLOAT_INF_REP);
+__DECLARE_INSTANCE( const _F_rep,
+ _LimG<bool>::_F_qNaN, = _STLP_FLOAT_QNAN_REP);
+__DECLARE_INSTANCE( const _F_rep,
+ _LimG<bool>::_F_sNaN, = _STLP_FLOAT_SNAN_REP);
+__DECLARE_INSTANCE( const _D_rep,
+ _LimG<bool>::_D_inf, = _STLP_DOUBLE_INF_REP);
+__DECLARE_INSTANCE( const _D_rep,
+ _LimG<bool>::_D_qNaN, = _STLP_DOUBLE_QNAN_REP);
+__DECLARE_INSTANCE( const _D_rep,
+ _LimG<bool>::_D_sNaN, = _STLP_DOUBLE_SNAN_REP);
+# ifndef _STLP_NO_LONG_DOUBLE
+__DECLARE_INSTANCE( const _L_rep,
+ _LimG<bool>::_L_inf, = _STLP_LDOUBLE_INF_REP);
+__DECLARE_INSTANCE( const _L_rep,
+ _LimG<bool>::_L_qNaN, = _STLP_LDOUBLE_QNAN_REP);
+__DECLARE_INSTANCE( const _L_rep,
+ _LimG<bool>::_L_sNaN, = _STLP_LDOUBLE_SNAN_REP);
+# endif
+
+#endif /* STATIC_DATA */
+
+# endif /* _STLP_EXPOSE_GLOBALS_IMPLEMENTATION */
+
+# undef __declare_integer_limits_member
+# undef __declare_float_limits_member
+# undef __HACK_ILIMITS
+# undef __HACK_NOTHING
+# undef __declare_int_members
+# undef __declare_float_members
+# undef _STLP_LIMITS_MIN_TYPE
+# undef _STLP_LIMITS_MAX_TYPE
+
+# undef _STLP_FLOAT_INF_REP
+# undef _STLP_FLOAT_QNAN_REP
+# undef _STLP_FLOAT_SNAN_REP
+# undef _STLP_DOUBLE_INF_REP
+# undef _STLP_DOUBLE_QNAN_REP
+# undef _STLP_DOUBLE_SNAN_REP
+# undef _STLP_LDOUBLE_INF_REP
+# undef _STLP_LDOUBLE_QNAN_REP
+# undef _STLP_LDOUBLE_SNAN_REP
+
+_STLP_END_NAMESPACE
+
+
+#endif /* _STLP_LIMITS_C_INCLUDED */
diff --git a/src/STLport/stl/_limits.h b/src/STLport/stl/_limits.h
new file mode 100644
index 0000000..67987ee
--- /dev/null
+++ b/src/STLport/stl/_limits.h
@@ -0,0 +1,557 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This may be not portable code. Parts of numeric_limits<> are
+ * inherently machine-dependent. At present this file is suitable
+ * for the MIPS, SPARC, Alpha and ia32 architectures.
+ */
+
+#ifndef _STLP_INTERNAL_LIMITS_H
+# define _STLP_INTERNAL_LIMITS_H
+
+#ifndef _STLP_CLIMITS
+# include <climits>
+#endif
+
+#ifndef _STLP_CFLOAT
+# include <cfloat>
+#endif
+
+#if !defined (_STLP_NO_WCHAR_T) && !defined (_STLP_CWCHAR_H)
+# include <stl/_cwchar.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+enum float_round_style {
+ round_indeterminate = -1,
+ round_toward_zero = 0,
+ round_to_nearest = 1,
+ round_toward_infinity = 2,
+ round_toward_neg_infinity = 3
+};
+
+enum float_denorm_style {
+ denorm_indeterminate = -1,
+ denorm_absent = 0,
+ denorm_present = 1
+};
+
+// Base class for all specializations of numeric_limits.
+
+template <class __number>
+class _Numeric_limits_base {
+public:
+
+ static __number (_STLP_CALL min)() _STLP_NOTHROW { return __number(); }
+ static __number (_STLP_CALL max)() _STLP_NOTHROW { return __number(); }
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+ enum {
+# else
+ static const int
+# endif
+
+ digits = 0,
+ digits10 = 0,
+ radix = 0,
+ min_exponent = 0,
+ min_exponent10 = 0,
+ max_exponent = 0,
+ max_exponent10 = 0
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+ ,
+ has_denorm = denorm_absent,
+ round_style = round_toward_zero,
+# else
+ ;
+ static const float_denorm_style has_denorm = denorm_absent;
+ static const float_round_style round_style = round_toward_zero;
+ static const bool
+# endif
+
+ is_specialized = false,
+ is_signed = false,
+ is_integer = false,
+ is_exact = false,
+ has_infinity = false,
+ has_quiet_NaN = false,
+ has_signaling_NaN = false,
+ has_denorm_loss = false,
+ is_iec559 = false,
+ is_bounded = false,
+ is_modulo = false,
+ traps = false,
+ tinyness_before = false
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+ }
+# endif
+ ;
+
+ static __number _STLP_CALL epsilon() _STLP_NOTHROW { return __number(); }
+ static __number _STLP_CALL round_error() _STLP_NOTHROW { return __number(); }
+
+ static __number _STLP_CALL infinity() _STLP_NOTHROW { return __number(); }
+ static __number _STLP_CALL quiet_NaN() _STLP_NOTHROW { return __number(); }
+ static __number _STLP_CALL signaling_NaN() _STLP_NOTHROW { return __number(); }
+ static __number _STLP_CALL denorm_min() _STLP_NOTHROW { return __number(); }
+
+
+};
+
+// Base class for integers.
+
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+# ifdef _STLP_LONG_LONG
+# define _STLP_LIMITS_MIN_TYPE _STLP_LONG_LONG
+# define _STLP_LIMITS_MAX_TYPE unsigned _STLP_LONG_LONG
+# else
+# define _STLP_LIMITS_MIN_TYPE long
+# define _STLP_LIMITS_MAX_TYPE unsigned long
+# endif
+# else
+# define _STLP_LIMITS_MIN_TYPE _Int
+# define _STLP_LIMITS_MAX_TYPE _Int
+# endif /* _STLP_LIMITED_DEFAULT_TEMPLATES */
+
+template <class _Int,
+ _STLP_LIMITS_MIN_TYPE __imin,
+ _STLP_LIMITS_MAX_TYPE __imax,
+ int __idigits, bool __ismod>
+class _Integer_limits : public _Numeric_limits_base<_Int>
+{
+public:
+
+ static _Int (_STLP_CALL min) () _STLP_NOTHROW { return (_Int)__imin; }
+ static _Int (_STLP_CALL max) () _STLP_NOTHROW { return (_Int)__imax; }
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+ enum {
+# else
+ static const int
+# endif
+ digits = (__idigits < 0) ?
+ ((int)((sizeof(_Int) * (CHAR_BIT))) - ((__imin == 0) ? 0 : 1))
+ : (__idigits),
+ digits10 = (digits * 301UL) / 1000,
+ radix = 2
+# if ! defined ( _STLP_STATIC_CONST_INIT_BUG)
+ ;
+ static const bool
+# else
+ ,
+# endif
+ is_specialized = true,
+ is_signed = (__imin != 0),
+ is_integer = true,
+ is_exact = true,
+ is_bounded = true,
+ is_modulo = __ismod
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+ }
+# endif
+ ;
+};
+
+// Base class for floating-point numbers.
+template <class __number,
+ int __Digits, int __Digits10,
+ int __MinExp, int __MaxExp,
+ int __MinExp10, int __MaxExp10,
+ bool __IsIEC559,
+ float_round_style __RoundStyle>
+class _Floating_limits : public _Numeric_limits_base<__number>
+{
+public:
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+ enum {
+# else
+ static const int
+# endif
+
+ digits = __Digits,
+ digits10 = __Digits10,
+
+ radix = ( FLT_RADIX /* 2 */ ),
+ min_exponent = __MinExp,
+ max_exponent = __MaxExp,
+ min_exponent10 = __MinExp10,
+ max_exponent10 = __MaxExp10
+
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+ ,
+ has_denorm = denorm_indeterminate,
+ round_style = __RoundStyle,
+# else
+ ;
+ static const float_denorm_style has_denorm = denorm_indeterminate;
+ static const float_round_style round_style = __RoundStyle;
+ static const bool
+# endif
+
+ is_specialized = true,
+ is_signed = true,
+
+#if (!defined(_CRAY) || !defined(_CRAYIEEE))
+ has_infinity = true,
+ has_quiet_NaN = true,
+ has_signaling_NaN= true,
+#else
+ has_infinity = false,
+ has_quiet_NaN = false,
+ has_signaling_NaN= false,
+#endif
+
+ has_denorm_loss = false,
+ is_iec559 = __IsIEC559,
+ is_bounded = true,
+ traps = true,
+ tinyness_before= false
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+ }
+# endif
+ ;
+
+};
+
+// Class numeric_limits
+
+// The unspecialized class.
+
+template<class _Tp>
+class numeric_limits : public _Numeric_limits_base<_Tp> {};
+
+// Specializations for all built-in integral types.
+
+#ifndef _STLP_NO_BOOL
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<bool>
+ : public _Integer_limits<bool, false, true, 1, false>
+{};
+
+#endif /* _STLP_NO_BOOL */
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<char>
+ : public _Integer_limits<char, CHAR_MIN, CHAR_MAX, -1, true>
+{};
+
+# ifndef _STLP_NO_SIGNED_BUILTINS
+_STLP_TEMPLATE_NULL
+class numeric_limits<signed char>
+ : public _Integer_limits<signed char, SCHAR_MIN, SCHAR_MAX, -1, true>
+{};
+# endif
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<unsigned char>
+ : public _Integer_limits<unsigned char, 0, UCHAR_MAX, -1, true>
+{};
+
+#if !(defined ( _STLP_NO_WCHAR_T ) || defined (_STLP_WCHAR_T_IS_USHORT))
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<wchar_t>
+ : public _Integer_limits<wchar_t, WCHAR_MIN, WCHAR_MAX, -1, true>
+{};
+
+#endif
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<short>
+ : public _Integer_limits<short, SHRT_MIN, SHRT_MAX, -1, true>
+{};
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<unsigned short>
+ : public _Integer_limits<unsigned short, 0, USHRT_MAX, -1, true>
+{};
+
+# if defined (__xlC__) && (__xlC__ == 0x500)
+# undef INT_MIN
+# define INT_MIN -2147483648
+# endif
+
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<int>
+ : public _Integer_limits<int, INT_MIN, INT_MAX, -1, true>
+{};
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<unsigned int>
+ : public _Integer_limits<unsigned int, 0, UINT_MAX, -1, true>
+{};
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<long>
+ : public _Integer_limits<long, LONG_MIN, LONG_MAX, -1, true>
+{};
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<unsigned long>
+ : public _Integer_limits<unsigned long, 0, ULONG_MAX, -1, true>
+{};
+
+#ifdef _STLP_LONG_LONG
+
+# if defined (_STLP_MSVC) || defined (__BORLANDC__)
+
+# define LONGLONG_MAX 0x7fffffffffffffffi64
+# define LONGLONG_MIN (-LONGLONG_MAX-1i64)
+# define ULONGLONG_MAX 0xffffffffffffffffUi64
+
+# else
+
+# ifndef LONGLONG_MAX
+# define LONGLONG_MAX 0x7fffffffffffffffLL
+# endif
+# ifndef LONGLONG_MIN
+# define LONGLONG_MIN (-LONGLONG_MAX-1LL)
+# endif
+# ifndef ULONGLONG_MAX
+# define ULONGLONG_MAX 0xffffffffffffffffULL
+# endif
+
+# endif
+
+#if !defined(__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ <= 96)
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<_STLP_LONG_LONG>
+ : public _Integer_limits<_STLP_LONG_LONG, LONGLONG_MIN, LONGLONG_MAX, -1, true>
+{};
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<unsigned _STLP_LONG_LONG>
+ : public _Integer_limits<unsigned _STLP_LONG_LONG, 0, ULONGLONG_MAX, -1, true>
+{};
+#else /* gcc 2.97 (after 2000-11-01), 2.98, 3.0 */
+/*
+ newest gcc has new mangling scheme, that has problem
+ with generating name [instantiated] of template specialization like
+ _Integer_limits<_STLP_LONG_LONG, LONGLONG_MIN, LONGLONG_MAX, -1, true>
+ ~~~~~~~~~~~~ ~~~~~~~~~~~~
+ Below is code that solve this problem.
+ - ptr
+ */
+_STLP_TEMPLATE_NULL
+class numeric_limits<_STLP_LONG_LONG>
+ : public _Numeric_limits_base<_STLP_LONG_LONG>
+{
+public:
+
+ static _STLP_LONG_LONG (_STLP_CALL min) () _STLP_NOTHROW { return LONGLONG_MIN; }
+ static _STLP_LONG_LONG (_STLP_CALL max) () _STLP_NOTHROW { return LONGLONG_MAX; }
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+ enum {
+# else
+ static const int
+# endif
+ digits = ((int)((sizeof(_STLP_LONG_LONG) * (CHAR_BIT))) - 1),
+ digits10 = (digits * 301UL) / 1000,
+ radix = 2
+# if ! defined ( _STLP_STATIC_CONST_INIT_BUG)
+ ;
+ static const bool
+# else
+ ,
+# endif
+ is_specialized = true,
+ is_signed = true,
+ is_integer = true,
+ is_exact = true,
+ is_bounded = true,
+ is_modulo = true
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+ }
+# endif
+ ;
+};
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<unsigned _STLP_LONG_LONG>
+ : public _Numeric_limits_base<unsigned _STLP_LONG_LONG>
+{
+public:
+
+ static unsigned _STLP_LONG_LONG (_STLP_CALL min) () _STLP_NOTHROW { return 0ULL; }
+ static unsigned _STLP_LONG_LONG (_STLP_CALL max) () _STLP_NOTHROW { return ULONGLONG_MAX; }
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+ enum {
+# else
+ static const int
+# endif
+ digits = ((int)((sizeof(unsigned _STLP_LONG_LONG) * (CHAR_BIT)))),
+ digits10 = (digits * 301UL) / 1000,
+ radix = 2
+# if ! defined ( _STLP_STATIC_CONST_INIT_BUG)
+ ;
+ static const bool
+# else
+ ,
+# endif
+ is_specialized = true,
+ is_signed = false,
+ is_integer = true,
+ is_exact = true,
+ is_bounded = true,
+ is_modulo = true
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+ }
+# endif
+ ;
+};
+
+# endif /* __GNUC__ > 2000-11-01 */
+
+#endif /* _STLP_LONG_LONG */
+
+// Specializations for all built-in floating-point types.
+
+union _F_rep
+{
+ unsigned short rep[2];
+ float val;
+};
+union _D_rep
+{
+ unsigned short rep[4];
+ double val;
+};
+
+# ifndef _STLP_NO_LONG_DOUBLE
+union _L_rep
+{
+ unsigned short rep[8];
+ long double val;
+};
+# endif
+
+template <class __dummy>
+class _LimG
+{
+public:
+ static const _F_rep _F_inf;
+ static const _F_rep _F_qNaN;
+ static const _F_rep _F_sNaN;
+ static const _D_rep _D_inf;
+ static const _D_rep _D_qNaN;
+ static const _D_rep _D_sNaN;
+
+# ifndef _STLP_NO_LONG_DOUBLE
+ static const _L_rep _L_inf;
+ static const _L_rep _L_qNaN;
+ static const _L_rep _L_sNaN;
+# endif
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _LimG<bool>;
+# endif
+
+_STLP_TEMPLATE_NULL class numeric_limits<float>
+ : public _Floating_limits<float,
+ FLT_MANT_DIG, // Binary digits of precision
+ FLT_DIG, // Decimal digits of precision
+ FLT_MIN_EXP, // Minimum exponent
+ FLT_MAX_EXP, // Maximum exponent
+ FLT_MIN_10_EXP, // Minimum base 10 exponent
+ FLT_MAX_10_EXP, // Maximum base 10 exponent
+ true, // conforms to iec559
+ round_to_nearest>
+{
+public:
+ static float (_STLP_CALL min) () _STLP_NOTHROW { return FLT_MIN; }
+ static float _STLP_CALL denorm_min() _STLP_NOTHROW { return FLT_MIN; }
+ static float (_STLP_CALL max) () _STLP_NOTHROW { _STLP_USING_VENDOR_CSTD return FLT_MAX; }
+ static float _STLP_CALL epsilon() _STLP_NOTHROW { return FLT_EPSILON; }
+ static float _STLP_CALL round_error() _STLP_NOTHROW { return 0.5f; } // Units: ulps.
+ static float _STLP_CALL infinity() { return _LimG<bool>::_F_inf.val; }
+ static float _STLP_CALL quiet_NaN() { return _LimG<bool>::_F_qNaN.val; }
+ static float _STLP_CALL signaling_NaN() { return _LimG<bool>::_F_sNaN.val; }
+};
+
+_STLP_TEMPLATE_NULL class numeric_limits<double>
+ : public _Floating_limits<double,
+ DBL_MANT_DIG, // Binary digits of precision
+ DBL_DIG, // Decimal digits of precision
+ DBL_MIN_EXP, // Minimum exponent
+ DBL_MAX_EXP, // Maximum exponent
+ DBL_MIN_10_EXP, // Minimum base 10 exponent
+ DBL_MAX_10_EXP, // Maximum base 10 exponent
+ true, // conforms to iec559
+ round_to_nearest>
+{
+public:
+ static double (_STLP_CALL min)() _STLP_NOTHROW { return DBL_MIN; }
+ static double _STLP_CALL denorm_min() _STLP_NOTHROW { return DBL_MIN; }
+ static double (_STLP_CALL max)() _STLP_NOTHROW { _STLP_USING_VENDOR_CSTD return DBL_MAX; }
+ static double _STLP_CALL epsilon() _STLP_NOTHROW { return DBL_EPSILON; }
+ static double _STLP_CALL round_error() _STLP_NOTHROW { return 0.5; } // Units: ulps.
+ static double _STLP_CALL infinity() { return _LimG<bool>::_D_inf.val; }
+ static double _STLP_CALL quiet_NaN(){ return _LimG<bool>::_D_qNaN.val; }
+ static double _STLP_CALL signaling_NaN() { return _LimG<bool>::_D_sNaN.val; }
+};
+
+# ifndef _STLP_NO_LONG_DOUBLE
+
+_STLP_TEMPLATE_NULL
+class numeric_limits<long double>
+ : public _Floating_limits<long double,
+ LDBL_MANT_DIG, // Binary digits of precision
+ LDBL_DIG, // Decimal digits of precision
+ LDBL_MIN_EXP, // Minimum exponent
+ LDBL_MAX_EXP, // Maximum exponent
+ LDBL_MIN_10_EXP,// Minimum base 10 exponent
+ LDBL_MAX_10_EXP,// Maximum base 10 exponent
+ false, // Doesn't conform to iec559
+ round_to_nearest>
+{
+public:
+ static long double (_STLP_CALL min) () _STLP_NOTHROW { _STLP_USING_VENDOR_CSTD return LDBL_MIN; }
+ static long double _STLP_CALL denorm_min() _STLP_NOTHROW { _STLP_USING_VENDOR_CSTD return LDBL_MIN; }
+ static long double (_STLP_CALL max) () _STLP_NOTHROW { _STLP_USING_VENDOR_CSTD return LDBL_MAX; }
+ static long double _STLP_CALL epsilon() _STLP_NOTHROW { return LDBL_EPSILON; }
+ static long double _STLP_CALL round_error() _STLP_NOTHROW { return 4; } // Units: ulps.
+ static long double _STLP_CALL infinity() { return _LimG<bool>::_L_inf.val; }
+ static long double _STLP_CALL quiet_NaN() { return _LimG<bool>::_L_qNaN.val; }
+ static long double _STLP_CALL signaling_NaN() { return _LimG<bool>::_L_sNaN.val; }
+};
+
+# endif
+
+// We write special values (Inf and NaN) as bit patterns and
+// cast the the appropriate floating-point types.
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_limits.c>
+# endif
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_list.c b/src/STLport/stl/_list.c
new file mode 100644
index 0000000..21bb044
--- /dev/null
+++ b/src/STLport/stl/_list.c
@@ -0,0 +1,210 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_LIST_C
+#define _STLP_LIST_C
+
+#ifndef _STLP_INTERNAL_LIST_H
+# include <stl/_list.h>
+#endif
+
+#if defined (__WATCOMC__)
+#include <vector>
+#endif
+
+# undef list
+# define list __WORKAROUND_DBG_RENAME(list)
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+template <class _Dummy>
+void _STLP_CALL
+_List_global<_Dummy>::_Transfer(_List_node_base* __position,
+ _List_node_base* __first, _List_node_base* __last) {
+ if (__position != __last) {
+ // Remove [first, last) from its old position.
+ ((_Node*) (__last->_M_prev))->_M_next = __position;
+ ((_Node*) (__first->_M_prev))->_M_next = __last;
+ ((_Node*) (__position->_M_prev))->_M_next = __first;
+
+ // Splice [first, last) into its new position.
+ _Node* __tmp = (_Node*) (__position->_M_prev);
+ __position->_M_prev = __last->_M_prev;
+ __last->_M_prev = __first->_M_prev;
+ __first->_M_prev = __tmp;
+ }
+}
+
+#endif /* defined (__BUILDING_STLPORT) || ! defined (_STLP_OWN_IOSTREAMS) */
+
+
+template <class _Tp, class _Alloc>
+void
+_List_base<_Tp,_Alloc>::clear()
+{
+ _List_node<_Tp>* __cur = (_List_node<_Tp>*) this->_M_node._M_data->_M_next;
+ while (__cur != this->_M_node._M_data) {
+ _List_node<_Tp>* __tmp = __cur;
+ __cur = (_List_node<_Tp>*) __cur->_M_next;
+ _STLP_STD::_Destroy(&__tmp->_M_data);
+ this->_M_node.deallocate(__tmp, 1);
+ }
+ this->_M_node._M_data->_M_next = this->_M_node._M_data;
+ this->_M_node._M_data->_M_prev = this->_M_node._M_data;
+}
+
+# if defined (_STLP_NESTED_TYPE_PARAM_BUG)
+# define size_type size_t
+# endif
+
+template <class _Tp, class _Alloc>
+void list<_Tp, _Alloc>::resize(size_type __new_size, _Tp __x)
+{
+ iterator __i = begin();
+ size_type __len = 0;
+ for ( ; __i != end() && __len < __new_size; ++__i, ++__len);
+
+ if (__len == __new_size)
+ erase(__i, end());
+ else // __i == end()
+ insert(end(), __new_size - __len, __x);
+}
+
+template <class _Tp, class _Alloc>
+list<_Tp, _Alloc>& list<_Tp, _Alloc>::operator=(const list<_Tp, _Alloc>& __x)
+{
+ if (this != &__x) {
+ iterator __first1 = begin();
+ iterator __last1 = end();
+ const_iterator __first2 = __x.begin();
+ const_iterator __last2 = __x.end();
+ while (__first1 != __last1 && __first2 != __last2)
+ *__first1++ = *__first2++;
+ if (__first2 == __last2)
+ erase(__first1, __last1);
+ else
+ insert(__last1, __first2, __last2);
+ }
+ return *this;
+}
+
+template <class _Tp, class _Alloc>
+void list<_Tp, _Alloc>::_M_fill_assign(size_type __n, const _Tp& __val) {
+ iterator __i = begin();
+ for ( ; __i != end() && __n > 0; ++__i, --__n)
+ *__i = __val;
+ if (__n > 0)
+ insert(end(), __n, __val);
+ else
+ erase(__i, end());
+}
+
+template <class _Tp, class _Alloc, class _Predicate>
+void _S_remove_if(list<_Tp, _Alloc>& __that, _Predicate __pred) {
+ typename list<_Tp, _Alloc>::iterator __first = __that.begin();
+ typename list<_Tp, _Alloc>::iterator __last = __that.end();
+ while (__first != __last) {
+ typename list<_Tp, _Alloc>::iterator __next = __first;
+ ++__next;
+ if (__pred(*__first)) __that.erase(__first);
+ __first = __next;
+ }
+}
+
+template <class _Tp, class _Alloc, class _BinaryPredicate>
+void _S_unique(list<_Tp, _Alloc>& __that, _BinaryPredicate __binary_pred) {
+ typename list<_Tp, _Alloc>::iterator __first = __that.begin();
+ typename list<_Tp, _Alloc>::iterator __last = __that.end();
+ if (__first == __last) return;
+ typename list<_Tp, _Alloc>::iterator __next = __first;
+ while (++__next != __last) {
+ if (__binary_pred(*__first, *__next))
+ __that.erase(__next);
+ else
+ __first = __next;
+ __next = __first;
+ }
+}
+
+template <class _Tp, class _Alloc, class _StrictWeakOrdering>
+void _S_merge(list<_Tp, _Alloc>& __that, list<_Tp, _Alloc>& __x,
+ _StrictWeakOrdering __comp) {
+ typedef typename list<_Tp, _Alloc>::iterator _Literator;
+ _Literator __first1 = __that.begin();
+ _Literator __last1 = __that.end();
+ _Literator __first2 = __x.begin();
+ _Literator __last2 = __x.end();
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first2, *__first1)) {
+ _Literator __next = __first2;
+ _List_global_inst::_Transfer(__first1._M_node, __first2._M_node, (++__next)._M_node);
+ __first2 = __next;
+ }
+ else
+ ++__first1;
+ if (__first2 != __last2) _List_global_inst::_Transfer(__last1._M_node, __first2._M_node, __last2._M_node);
+}
+
+template <class _Tp, class _Alloc, class _StrictWeakOrdering>
+void _S_sort(list<_Tp, _Alloc>& __that, _StrictWeakOrdering __comp) {
+ // Do nothing if the list has length 0 or 1.
+ if (__that._M_node._M_data->_M_next != __that._M_node._M_data &&
+ (__that._M_node._M_data->_M_next)->_M_next != __that._M_node._M_data) {
+ list<_Tp, _Alloc> __carry;
+#if !defined (__WATCOMC__)
+ list<_Tp, _Alloc> __counter[64];
+#else
+ __vector__<list<_Tp, _Alloc>, _Alloc> __counter(64);
+#endif //*TY 05/25/2000 -
+ int __fill = 0;
+ while (!__that.empty()) {
+ __carry.splice(__carry.begin(), __that, __that.begin());
+ int __i = 0;
+ while(__i < __fill && !__counter[__i].empty()) {
+ _S_merge(__counter[__i], __carry, __comp);
+ __carry.swap(__counter[__i++]);
+ }
+ __carry.swap(__counter[__i]);
+ if (__i == __fill) ++__fill;
+ }
+
+ for (int __i = 1; __i < __fill; ++__i)
+ _S_merge(__counter[__i], __counter[__i-1], __comp);
+ __that.swap(__counter[__fill-1]);
+ }
+}
+
+# undef list
+# undef size_type
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_LIST_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_list.h b/src/STLport/stl/_list.h
new file mode 100644
index 0000000..ee7d293
--- /dev/null
+++ b/src/STLport/stl/_list.h
@@ -0,0 +1,575 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_LIST_H
+#define _STLP_INTERNAL_LIST_H
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+# include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_CONSTRUCT_H
+# include <stl/_construct.h>
+# endif
+
+# ifndef _STLP_INTERNAL_FUNCTION_BASE_H
+# include <stl/_function_base.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+# undef list
+# define list __WORKAROUND_DBG_RENAME(list)
+
+struct _List_node_base {
+ _List_node_base* _M_next;
+ _List_node_base* _M_prev;
+};
+
+template <class _Dummy>
+class _List_global {
+public:
+ typedef _List_node_base _Node;
+ static void _STLP_CALL _Transfer(_List_node_base* __position,
+ _List_node_base* __first, _List_node_base* __last);
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _List_global<bool>;
+# endif
+typedef _List_global<bool> _List_global_inst;
+
+template <class _Tp>
+struct _List_node : public _List_node_base {
+ _Tp _M_data;
+ __TRIVIAL_STUFF(_List_node)
+
+#ifdef __DMC__
+ // for some reason, Digital Mars C++ needs a constructor...
+ private:
+ _List_node();
+#endif
+};
+
+struct _List_iterator_base {
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef bidirectional_iterator_tag iterator_category;
+
+ _List_node_base* _M_node;
+
+ _List_iterator_base(_List_node_base* __x) : _M_node(__x) {}
+ _List_iterator_base() {}
+
+ void _M_incr() { _M_node = _M_node->_M_next; }
+ void _M_decr() { _M_node = _M_node->_M_prev; }
+ bool operator==(const _List_iterator_base& __y ) const {
+ return _M_node == __y._M_node;
+ }
+ bool operator!=(const _List_iterator_base& __y ) const {
+ return _M_node != __y._M_node;
+ }
+};
+
+
+
+
+template<class _Tp, class _Traits>
+struct _List_iterator : public _List_iterator_base {
+ typedef _Tp value_type;
+ typedef typename _Traits::pointer pointer;
+ typedef typename _Traits::reference reference;
+
+ typedef _List_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
+ typedef _List_iterator<_Tp, _Const_traits<_Tp> > const_iterator;
+ typedef _List_iterator<_Tp, _Traits> _Self;
+
+ typedef bidirectional_iterator_tag iterator_category;
+ typedef _List_node<_Tp> _Node;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+
+ _List_iterator(_Node* __x) : _List_iterator_base(__x) {}
+ _List_iterator() {}
+ _List_iterator(const iterator& __x) : _List_iterator_base(__x._M_node) {}
+
+ reference operator*() const { return ((_Node*)_M_node)->_M_data; }
+
+ _STLP_DEFINE_ARROW_OPERATOR
+
+ _Self& operator++() {
+ this->_M_incr();
+ return *this;
+ }
+ _Self operator++(int) {
+ _Self __tmp = *this;
+ this->_M_incr();
+ return __tmp;
+ }
+ _Self& operator--() {
+ this->_M_decr();
+ return *this;
+ }
+ _Self operator--(int) {
+ _Self __tmp = *this;
+ this->_M_decr();
+ return __tmp;
+ }
+};
+
+
+#ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _Tp, class _Traits>
+inline _Tp* value_type(const _List_iterator<_Tp, _Traits>&) { return 0; }
+inline bidirectional_iterator_tag iterator_category(const _List_iterator_base&) { return bidirectional_iterator_tag();}
+inline ptrdiff_t* distance_type(const _List_iterator_base&) { return 0; }
+#endif
+
+
+// Base class that encapsulates details of allocators and helps
+// to simplify EH
+
+template <class _Tp, class _Alloc>
+class _List_base
+{
+protected:
+ _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+ typedef _List_node<_Tp> _Node;
+ typedef typename _Alloc_traits<_Node, _Alloc>::allocator_type
+ _Node_allocator_type;
+public:
+ typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type
+ allocator_type;
+
+ allocator_type get_allocator() const {
+ return _STLP_CONVERT_ALLOCATOR((const _Node_allocator_type&)_M_node, _Tp);
+ }
+
+ _List_base(const allocator_type& __a) : _M_node(_STLP_CONVERT_ALLOCATOR(__a, _Node), (_Node*)0) {
+ _Node* __n = _M_node.allocate(1);
+ __n->_M_next = __n;
+ __n->_M_prev = __n;
+ _M_node._M_data = __n;
+ }
+ ~_List_base() {
+ clear();
+ _M_node.deallocate(_M_node._M_data, 1);
+ }
+
+ void clear();
+
+public:
+ _STLP_alloc_proxy<_Node*, _Node, _Node_allocator_type> _M_node;
+};
+
+template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
+class list;
+
+// helper functions to reduce code duplication
+template <class _Tp, class _Alloc, class _Predicate>
+void _S_remove_if(list<_Tp, _Alloc>& __that, _Predicate __pred);
+
+template <class _Tp, class _Alloc, class _BinaryPredicate>
+void _S_unique(list<_Tp, _Alloc>& __that, _BinaryPredicate __binary_pred);
+
+template <class _Tp, class _Alloc, class _StrictWeakOrdering>
+void _S_merge(list<_Tp, _Alloc>& __that, list<_Tp, _Alloc>& __x,
+ _StrictWeakOrdering __comp);
+
+template <class _Tp, class _Alloc, class _StrictWeakOrdering>
+void _S_sort(list<_Tp, _Alloc>& __that, _StrictWeakOrdering __comp);
+
+template <class _Tp, class _Alloc>
+class list : public _List_base<_Tp, _Alloc> {
+ typedef _List_base<_Tp, _Alloc> _Base;
+ typedef list<_Tp, _Alloc> _Self;
+public:
+ typedef _Tp value_type;
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef _List_node<_Tp> _Node;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+ typedef typename _Base::allocator_type allocator_type;
+ typedef bidirectional_iterator_tag _Iterator_category;
+
+public:
+ typedef _List_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
+ typedef _List_iterator<_Tp, _Const_traits<_Tp> > const_iterator;
+ _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;
+
+protected:
+ _Node* _M_create_node(const _Tp& __x)
+ {
+ _Node* __p = this->_M_node.allocate(1);
+ _STLP_TRY {
+ _Construct(&__p->_M_data, __x);
+ }
+ _STLP_UNWIND(this->_M_node.deallocate(__p, 1));
+ return __p;
+ }
+
+ _Node* _M_create_node()
+ {
+ _Node* __p = this->_M_node.allocate(1);
+ _STLP_TRY {
+ _Construct(&__p->_M_data);
+ }
+ _STLP_UNWIND(this->_M_node.deallocate(__p, 1));
+ return __p;
+ }
+
+public:
+# if !(defined(__MRC__)||(defined(__SC__) && !defined(__DMC__)))
+ explicit
+# endif
+ list(const allocator_type& __a = allocator_type()) :
+ _List_base<_Tp, _Alloc>(__a) {}
+
+ iterator begin() { return iterator((_Node*)(this->_M_node._M_data->_M_next)); }
+ const_iterator begin() const { return const_iterator((_Node*)(this->_M_node._M_data->_M_next)); }
+
+ iterator end() { return this->_M_node._M_data; }
+ const_iterator end() const { return this->_M_node._M_data; }
+
+ reverse_iterator rbegin()
+ { return reverse_iterator(end()); }
+ const_reverse_iterator rbegin() const
+ { return const_reverse_iterator(end()); }
+
+ reverse_iterator rend()
+ { return reverse_iterator(begin()); }
+ const_reverse_iterator rend() const
+ { return const_reverse_iterator(begin()); }
+
+ bool empty() const { return this->_M_node._M_data->_M_next == this->_M_node._M_data; }
+ size_type size() const {
+ size_type __result = distance(begin(), end());
+ return __result;
+ }
+ size_type max_size() const { return size_type(-1); }
+
+ reference front() { return *begin(); }
+ const_reference front() const { return *begin(); }
+ reference back() { return *(--end()); }
+ const_reference back() const { return *(--end()); }
+
+ void swap(list<_Tp, _Alloc>& __x) {
+ _STLP_STD::swap(this->_M_node, __x._M_node);
+ }
+
+ iterator insert(iterator __position, const _Tp& __x) {
+
+ _Node* __tmp = _M_create_node(__x);
+ _List_node_base* __n = __position._M_node;
+ _List_node_base* __p = __n->_M_prev;
+ __tmp->_M_next = __n;
+ __tmp->_M_prev = __p;
+ __p->_M_next = __tmp;
+ __n->_M_prev = __tmp;
+ return __tmp;
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_insert_dispatch(__pos, __first, __last, _Integral());
+ }
+ // Check whether it's an integral type. If so, it's not an iterator.
+ template<class _Integer>
+ void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
+ const __true_type&) {
+ _M_fill_insert(__pos, (size_type) __n, (_Tp) __x);
+ }
+ template <class _InputIter>
+ void
+ _M_insert_dispatch(iterator __position,
+ _InputIter __first, _InputIter __last,
+ const __false_type&)
+#else /* _STLP_MEMBER_TEMPLATES */
+ void insert(iterator __position, const _Tp* __first, const _Tp* __last) {
+ for ( ; __first != __last; ++__first)
+ insert(__position, *__first);
+ }
+ void insert(iterator __position, const_iterator __first, const_iterator __last)
+#endif /* _STLP_MEMBER_TEMPLATES */
+ {
+ for ( ; __first != __last; ++__first)
+ insert(__position, *__first);
+ }
+ void insert(iterator __pos, size_type __n, const _Tp& __x) { _M_fill_insert(__pos, __n, __x); }
+
+ void _M_fill_insert(iterator __pos, size_type __n, const _Tp& __x) {
+ for ( ; __n > 0; --__n)
+ insert(__pos, __x);
+ }
+ void push_front(const _Tp& __x) { insert(begin(), __x); }
+ void push_back(const _Tp& __x) { insert(end(), __x); }
+
+# ifndef _STLP_NO_ANACHRONISMS
+ iterator insert(iterator __position) { return insert(__position, _Tp()); }
+ void push_front() {insert(begin());}
+ void push_back() {insert(end());}
+# endif
+
+ iterator erase(iterator __position) {
+ _List_node_base* __next_node = __position._M_node->_M_next;
+ _List_node_base* __prev_node = __position._M_node->_M_prev;
+ _Node* __n = (_Node*) __position._M_node;
+ __prev_node->_M_next = __next_node;
+ __next_node->_M_prev = __prev_node;
+ _STLP_STD::_Destroy(&__n->_M_data);
+ this->_M_node.deallocate(__n, 1);
+ return iterator((_Node*)__next_node);
+ }
+
+ iterator erase(iterator __first, iterator __last) {
+ while (__first != __last)
+ erase(__first++);
+ return __last;
+ }
+
+ void resize(size_type __new_size, _Tp __x);
+ void resize(size_type __new_size) { this->resize(__new_size, _Tp()); }
+
+ void pop_front() { erase(begin()); }
+ void pop_back() {
+ iterator __tmp = end();
+ erase(--__tmp);
+ }
+ list(size_type __n, const _Tp& __val,
+ const allocator_type& __a = allocator_type())
+ : _List_base<_Tp, _Alloc>(__a)
+ { this->insert(begin(), __n, __val); }
+ explicit list(size_type __n)
+ : _List_base<_Tp, _Alloc>(allocator_type())
+ { this->insert(begin(), __n, _Tp()); }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ // We don't need any dispatching tricks here, because insert does all of
+ // that anyway.
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ list(_InputIterator __first, _InputIterator __last)
+ : _List_base<_Tp, _Alloc>(allocator_type())
+ { insert(begin(), __first, __last); }
+# endif
+ template <class _InputIterator>
+ list(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+ : _List_base<_Tp, _Alloc>(__a)
+ { insert(begin(), __first, __last); }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ list(const _Tp* __first, const _Tp* __last,
+ const allocator_type& __a = allocator_type())
+ : _List_base<_Tp, _Alloc>(__a)
+ { insert(begin(), __first, __last); }
+ list(const_iterator __first, const_iterator __last,
+ const allocator_type& __a = allocator_type())
+ : _List_base<_Tp, _Alloc>(__a)
+ { insert(begin(), __first, __last); }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+ list(const list<_Tp, _Alloc>& __x) : _List_base<_Tp, _Alloc>(__x.get_allocator())
+ { insert(begin(), __x.begin(), __x.end()); }
+
+ ~list() { }
+
+ list<_Tp, _Alloc>& operator=(const list<_Tp, _Alloc>& __x);
+
+public:
+ // assign(), a generalized assignment member function. Two
+ // versions: one that takes a count, and one that takes a range.
+ // The range version is a member template, so we dispatch on whether
+ // or not the type is an integer.
+
+ void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); }
+
+ void _M_fill_assign(size_type __n, const _Tp& __val);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _InputIterator>
+ void assign(_InputIterator __first, _InputIterator __last) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_assign_dispatch(__first, __last, _Integral());
+ }
+
+ template <class _Integer>
+ void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type&)
+ { assign((size_type) __n, (_Tp) __val); }
+
+ template <class _InputIterator>
+ void _M_assign_dispatch(_InputIterator __first2, _InputIterator __last2,
+ const __false_type&) {
+ iterator __first1 = begin();
+ iterator __last1 = end();
+ for ( ; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
+ *__first1 = *__first2;
+ if (__first2 == __last2)
+ erase(__first1, __last1);
+ else
+ insert(__last1, __first2, __last2);
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:
+ void splice(iterator __position, _Self& __x) {
+ if (!__x.empty())
+ _List_global_inst::_Transfer(__position._M_node, __x.begin()._M_node, __x.end()._M_node);
+ }
+ void splice(iterator __position, _Self&, iterator __i) {
+ iterator __j = __i;
+ ++__j;
+ if (__position == __i || __position == __j) return;
+ _List_global_inst::_Transfer(__position._M_node, __i._M_node, __j._M_node);
+ }
+ void splice(iterator __position, _Self&, iterator __first, iterator __last) {
+ if (__first != __last)
+ _List_global_inst::_Transfer(__position._M_node, __first._M_node, __last._M_node);
+ }
+
+ void remove(const _Tp& __val) {
+ iterator __first = begin();
+ iterator __last = end();
+ while (__first != __last) {
+ iterator __next = __first;
+ ++__next;
+ if (__val == *__first) erase(__first);
+ __first = __next;
+ }
+ }
+
+ void unique() {
+ _S_unique(*this, equal_to<_Tp>());
+ }
+
+ void merge(_Self& __x) {
+ _S_merge(*this, __x, less<_Tp>());
+ }
+
+ void reverse() {
+ _List_node_base* __p = this->_M_node._M_data;
+ _List_node_base* __tmp = __p;
+ do {
+ _STLP_STD::swap(__tmp->_M_next, __tmp->_M_prev);
+ __tmp = __tmp->_M_prev; // Old next node is now prev.
+ } while (__tmp != __p);
+ }
+
+ void sort() {
+ _S_sort(*this, less<_Tp>());
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _Predicate> void remove_if(_Predicate __pred) {
+ _S_remove_if(*this, __pred);
+ }
+ template <class _BinaryPredicate>
+ void unique(_BinaryPredicate __binary_pred) {
+ _S_unique(*this, __binary_pred);
+ }
+
+ template <class _StrictWeakOrdering>
+ void merge(list<_Tp, _Alloc>& __x,
+ _StrictWeakOrdering __comp) {
+ _S_merge(*this, __x, __comp);
+ }
+
+ template <class _StrictWeakOrdering>
+ void sort(_StrictWeakOrdering __comp) {
+ _S_sort(*this, __comp);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+};
+
+template <class _Tp, class _Alloc>
+_STLP_INLINE_LOOP bool _STLP_CALL
+operator==(const list<_Tp,_Alloc>& __x, const list<_Tp,_Alloc>& __y)
+{
+ typedef typename list<_Tp,_Alloc>::const_iterator const_iterator;
+ const_iterator __end1 = __x.end();
+ const_iterator __end2 = __y.end();
+
+ const_iterator __i1 = __x.begin();
+ const_iterator __i2 = __y.begin();
+ while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) {
+ ++__i1;
+ ++__i2;
+ }
+ return __i1 == __end1 && __i2 == __end2;
+}
+
+# define _STLP_EQUAL_OPERATOR_SPECIALIZED
+# define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
+# define _STLP_TEMPLATE_CONTAINER list<_Tp, _Alloc>
+# include <stl/_relops_cont.h>
+# undef _STLP_TEMPLATE_CONTAINER
+# undef _STLP_TEMPLATE_HEADER
+# undef _STLP_EQUAL_OPERATOR_SPECIALIZED
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_list.c>
+# endif
+
+// do a cleanup
+# undef list
+# define __list__ __FULL_NAME(list)
+
+#if defined (_STLP_DEBUG)
+# include <stl/debug/_list.h>
+#endif
+
+#if defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM)
+# include <stl/wrappers/_list.h>
+#endif
+
+#endif /* _STLP_INTERNAL_LIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_locale.h b/src/STLport/stl/_locale.h
new file mode 100644
index 0000000..3270a0a
--- /dev/null
+++ b/src/STLport/stl/_locale.h
@@ -0,0 +1,233 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_LOCALE_H
+#define _STLP_INTERNAL_LOCALE_H
+
+#ifndef _STLP_CSTDLIB
+# include <cstdlib>
+#endif
+
+#ifndef _STLP_CWCHAR_H
+# include <stl/_cwchar.h>
+#endif
+
+#ifndef _STLP_INTERNAL_THREADS_H
+# include <stl/_threads.h>
+#endif
+
+#ifndef _STLP_STRING_FWD_H
+# include <stl/_string_fwd.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+class _STLP_CLASS_DECLSPEC _Locale_impl; // Forward declaration of opaque type.
+class _STLP_CLASS_DECLSPEC _Locale; // Forward declaration of opaque type.
+class _STLP_CLASS_DECLSPEC locale;
+class _STLP_CLASS_DECLSPEC ios_base;
+
+
+template <class _CharT>
+bool
+__locale_do_operator_call (const locale* __that,
+ const basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >& __x,
+ const basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >& __y);
+
+# define _BaseFacet locale::facet
+
+class _STLP_CLASS_DECLSPEC locale {
+public:
+ // types:
+
+ class _STLP_DECLSPEC facet : private _Refcount_Base {
+ protected:
+ explicit facet(size_t __no_del = 0) : _Refcount_Base(1), _M_delete(__no_del == 0) {}
+ virtual ~facet();
+ friend class locale;
+ friend class _Locale_impl;
+ friend class _Locale;
+
+ private: // Invalidate assignment and copying.
+ facet(const facet& __f) : _Refcount_Base(1), _M_delete(__f._M_delete == 0) {};
+ void operator=(const facet&);
+
+ private: // Data members.
+ const bool _M_delete;
+ };
+
+#if defined(__MVS__) || defined(__OS400__)
+ struct
+#else
+ class
+#endif
+ _STLP_DECLSPEC id {
+ friend class locale;
+ friend class _Locale_impl;
+ public:
+ size_t _M_index;
+ static size_t _S_max;
+ };
+
+ typedef int category;
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+ enum _Category {
+# else
+ static const category
+# endif
+ none = 0x000,
+ collate = 0x010,
+ ctype = 0x020,
+ monetary = 0x040,
+ numeric = 0x100,
+ time = 0x200,
+ messages = 0x400,
+ all = collate | ctype | monetary | numeric | time | messages
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+ }
+# endif
+ ;
+
+ // construct/copy/destroy:
+ locale();
+ locale(const locale&) _STLP_NOTHROW;
+ explicit locale(const char *);
+ locale(const locale&, const char*, category);
+
+ // those are for internal use
+ locale(_Locale_impl*);
+ locale(_Locale_impl*, bool);
+
+public:
+
+# if defined ( _STLP_MEMBER_TEMPLATES ) /* && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) */
+ template <class _Facet>
+ locale(const locale& __loc, _Facet* __f) : _M_impl(0)
+ {
+ // _M_impl = this->_S_copy_impl(__loc._M_impl, __f != 0);
+ new(this) locale(__loc._M_impl, __f != 0);
+ if (__f != 0)
+ this->_M_insert(__f, _Facet::id);
+ }
+# endif
+
+ locale(const locale&, const locale&, category);
+ ~locale() _STLP_NOTHROW;
+ const locale& operator=(const locale&) _STLP_NOTHROW;
+
+# if !(defined (_STLP_NO_MEMBER_TEMPLATES) || defined (_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS))
+ template <class _Facet> locale combine(const locale& __loc) {
+ locale __result(__loc._M_impl, true);
+ if (facet* __f = __loc._M_get_facet(_Facet::id)) {
+ __result._M_insert(__f, _Facet::id);
+ __f->_M_incr();
+ }
+ else
+ _M_throw_runtime_error();
+ return __result;
+ }
+# endif
+ // locale operations:
+ string name() const;
+
+ bool operator==(const locale&) const;
+ bool operator!=(const locale&) const;
+
+# if ! defined ( _STLP_MEMBER_TEMPLATES ) || defined (_STLP_INLINE_MEMBER_TEMPLATES) || (defined(__MWERKS__) && __MWERKS__ <= 0x2301)
+ bool operator()(const string& __x, const string& __y) const;
+# ifndef _STLP_NO_WCHAR_T
+ bool operator()(const wstring& __x, const wstring& __y) const;
+# endif
+# else
+ template <class _CharT, class _Traits, class _Alloc>
+ bool operator()(const basic_string<_CharT, _Traits, _Alloc>& __x,
+ const basic_string<_CharT, _Traits, _Alloc>& __y) const {
+ return __locale_do_operator_call(this, __x, __y);
+ }
+# endif
+
+ // global locale objects:
+ static locale _STLP_CALL global(const locale&);
+ static const locale& _STLP_CALL classic();
+
+public: // Helper functions for locale globals.
+ facet* _M_get_facet(const id&) const;
+ // same, but throws
+ facet* _M_use_facet(const id&) const;
+ static void _STLP_CALL _M_throw_runtime_error(const char* = 0);
+ static void _STLP_CALL _S_initialize();
+ static void _STLP_CALL _S_uninitialize();
+
+private: // More helper functions.
+ // static _Locale_impl* _STLP_CALL _S_copy_impl(_Locale_impl*, bool);
+ void _M_insert(facet* __f, id& __id);
+
+ // friends:
+ friend class _Locale_impl;
+ friend class _Locale;
+ friend class ios_base;
+
+private: // Data members
+ _Locale_impl* _M_impl;
+};
+
+//----------------------------------------------------------------------
+// locale globals
+
+# ifdef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+template <class _Facet>
+inline const _Facet&
+_Use_facet<_Facet>::operator *() const
+# else
+template <class _Facet> inline const _Facet& use_facet(const locale& __loc)
+# endif
+{
+ return *__STATIC_CAST(const _Facet*,__loc._M_use_facet(_Facet::id));
+}
+
+
+# ifdef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+template <class _Facet>
+struct has_facet {
+ const locale& __loc;
+ has_facet(const locale& __p_loc) : __loc(__p_loc) {}
+ operator bool() const _STLP_NOTHROW
+# else
+template <class _Facet> inline bool has_facet(const locale& __loc) _STLP_NOTHROW
+# endif
+{
+ return (__loc._M_get_facet(_Facet::id) != 0);
+}
+
+# ifdef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+ // close class definition
+};
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_LOCALE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_map.h b/src/STLport/stl/_map.h
new file mode 100644
index 0000000..a14edeb
--- /dev/null
+++ b/src/STLport/stl/_map.h
@@ -0,0 +1,411 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_MAP_H
+#define _STLP_INTERNAL_MAP_H
+
+#ifndef _STLP_INTERNAL_TREE_H
+# include <stl/_tree.h>
+#endif
+
+#define map __WORKAROUND_RENAME(map)
+#define multimap __WORKAROUND_RENAME(multimap)
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Key, class _Tp, __DFL_TMPL_PARAM(_Compare, less<_Key> ),
+ _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(const _Key, _Tp) >
+class map {
+public:
+
+// typedefs:
+
+ typedef _Key key_type;
+ typedef _Tp data_type;
+ typedef _Tp mapped_type;
+ typedef pair<const _Key, _Tp> value_type;
+ typedef _Compare key_compare;
+
+ class value_compare
+ : public binary_function<value_type, value_type, bool> {
+ friend class map<_Key,_Tp,_Compare,_Alloc>;
+ protected :
+ _Compare _M_comp;
+ value_compare(_Compare __c) : _M_comp(__c) {}
+ public:
+ bool operator()(const value_type& __x, const value_type& __y) const {
+ return _M_comp(__x.first, __y.first);
+ }
+ };
+
+private:
+# ifdef _STLP_MULTI_CONST_TEMPLATE_ARG_BUG
+ typedef _Rb_tree<key_type, value_type,
+ _Select1st_hint<value_type, _Key>, key_compare, _Alloc> _Rep_type;
+# else
+ typedef _Rb_tree<key_type, value_type,
+ _Select1st<value_type>, key_compare, _Alloc> _Rep_type;
+# endif
+ _Rep_type _M_t; // red-black tree representing map
+public:
+ typedef typename _Rep_type::pointer pointer;
+ typedef typename _Rep_type::const_pointer const_pointer;
+ typedef typename _Rep_type::reference reference;
+ typedef typename _Rep_type::const_reference const_reference;
+ typedef typename _Rep_type::iterator iterator;
+ typedef typename _Rep_type::const_iterator const_iterator;
+ typedef typename _Rep_type::reverse_iterator reverse_iterator;
+ typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
+ typedef typename _Rep_type::size_type size_type;
+ typedef typename _Rep_type::difference_type difference_type;
+ typedef typename _Rep_type::allocator_type allocator_type;
+
+ // allocation/deallocation
+
+ map() : _M_t(_Compare(), allocator_type()) {}
+ explicit map(const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _M_t(__comp, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ map(_InputIterator __first, _InputIterator __last)
+ : _M_t(_Compare(), allocator_type())
+ { _M_t.insert_unique(__first, __last); }
+
+ template <class _InputIterator>
+ map(_InputIterator __first, _InputIterator __last, const _Compare& __comp,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+ : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }
+
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ map(_InputIterator __first, _InputIterator __last, const _Compare& __comp)
+ : _M_t(__comp, allocator_type()) { _M_t.insert_unique(__first, __last); }
+# endif
+
+#else
+ map(const value_type* __first, const value_type* __last)
+ : _M_t(_Compare(), allocator_type())
+ { _M_t.insert_unique(__first, __last); }
+
+ map(const value_type* __first,
+ const value_type* __last, const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }
+
+ map(const_iterator __first, const_iterator __last)
+ : _M_t(_Compare(), allocator_type())
+ { _M_t.insert_unique(__first, __last); }
+
+ map(const_iterator __first, const_iterator __last, const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ map(const map<_Key,_Tp,_Compare,_Alloc>& __x) : _M_t(__x._M_t) {}
+ map<_Key,_Tp,_Compare,_Alloc>&
+ operator=(const map<_Key, _Tp, _Compare, _Alloc>& __x)
+ {
+ _M_t = __x._M_t;
+ return *this;
+ }
+
+ // accessors:
+
+ key_compare key_comp() const { return _M_t.key_comp(); }
+ value_compare value_comp() const { return value_compare(_M_t.key_comp()); }
+ allocator_type get_allocator() const { return _M_t.get_allocator(); }
+
+ iterator begin() { return _M_t.begin(); }
+ const_iterator begin() const { return _M_t.begin(); }
+ iterator end() { return _M_t.end(); }
+ const_iterator end() const { return _M_t.end(); }
+ reverse_iterator rbegin() { return _M_t.rbegin(); }
+ const_reverse_iterator rbegin() const { return _M_t.rbegin(); }
+ reverse_iterator rend() { return _M_t.rend(); }
+ const_reverse_iterator rend() const { return _M_t.rend(); }
+ bool empty() const { return _M_t.empty(); }
+ size_type size() const { return _M_t.size(); }
+ size_type max_size() const { return _M_t.max_size(); }
+ _Tp& operator[](const key_type& __k) {
+ iterator __i = lower_bound(__k);
+ // __i->first is greater than or equivalent to __k.
+ if (__i == end() || key_comp()(__k, (*__i).first))
+ __i = insert(__i, value_type(__k, _STLP_DEFAULT_CONSTRUCTED(_Tp)));
+ return (*__i).second;
+ }
+ void swap(map<_Key,_Tp,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); }
+
+ // insert/erase
+
+ pair<iterator,bool> insert(const value_type& __x)
+ { return _M_t.insert_unique(__x); }
+ iterator insert(iterator position, const value_type& __x)
+ { return _M_t.insert_unique(position, __x); }
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void insert(_InputIterator __first, _InputIterator __last) {
+ _M_t.insert_unique(__first, __last);
+ }
+#else
+ void insert(const value_type* __first, const value_type* __last) {
+ _M_t.insert_unique(__first, __last);
+ }
+ void insert(const_iterator __first, const_iterator __last) {
+ _M_t.insert_unique(__first, __last);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ void erase(iterator __position) { _M_t.erase(__position); }
+ size_type erase(const key_type& __x) { return _M_t.erase(__x); }
+ void erase(iterator __first, iterator __last)
+ { _M_t.erase(__first, __last); }
+ void clear() { _M_t.clear(); }
+
+ // map operations:
+
+ iterator find(const key_type& __x) { return _M_t.find(__x); }
+ const_iterator find(const key_type& __x) const { return _M_t.find(__x); }
+ size_type count(const key_type& __x) const {
+ return _M_t.find(__x) == _M_t.end() ? 0 : 1;
+ }
+ iterator lower_bound(const key_type& __x) {return _M_t.lower_bound(__x); }
+ const_iterator lower_bound(const key_type& __x) const {
+ return _M_t.lower_bound(__x);
+ }
+ iterator upper_bound(const key_type& __x) {return _M_t.upper_bound(__x); }
+ const_iterator upper_bound(const key_type& __x) const {
+ return _M_t.upper_bound(__x);
+ }
+
+ pair<iterator,iterator> equal_range(const key_type& __x) {
+ return _M_t.equal_range(__x);
+ }
+ pair<const_iterator,const_iterator> equal_range(const key_type& __x) const {
+ return _M_t.equal_range(__x);
+ }
+};
+
+
+template <class _Key, class _Tp, __DFL_TMPL_PARAM(_Compare, less<_Key> ),
+ _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(const _Key, _Tp) >
+class multimap {
+public:
+
+// typedefs:
+
+ typedef _Key key_type;
+ typedef _Tp data_type;
+ typedef _Tp mapped_type;
+ typedef pair<const _Key, _Tp> value_type;
+ typedef _Compare key_compare;
+
+ class value_compare : public binary_function<value_type, value_type, bool> {
+ friend class multimap<_Key,_Tp,_Compare,_Alloc>;
+ protected:
+ _Compare _M_comp;
+ value_compare(_Compare __c) : _M_comp(__c) {}
+ public:
+ bool operator()(const value_type& __x, const value_type& __y) const {
+ return _M_comp(__x.first, __y.first);
+ }
+ };
+
+private:
+# ifdef _STLP_MULTI_CONST_TEMPLATE_ARG_BUG
+ typedef _Rb_tree<key_type, value_type,
+ _Select1st_hint<value_type, _Key>, key_compare, _Alloc> _Rep_type;
+# else
+ typedef _Rb_tree<key_type, value_type,
+ _Select1st<value_type>, key_compare, _Alloc> _Rep_type;
+# endif
+ _Rep_type _M_t; // red-black tree representing multimap
+public:
+ typedef typename _Rep_type::pointer pointer;
+ typedef typename _Rep_type::const_pointer const_pointer;
+ typedef typename _Rep_type::reference reference;
+ typedef typename _Rep_type::const_reference const_reference;
+ typedef typename _Rep_type::iterator iterator;
+ typedef typename _Rep_type::const_iterator const_iterator;
+ typedef typename _Rep_type::reverse_iterator reverse_iterator;
+ typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
+ typedef typename _Rep_type::size_type size_type;
+ typedef typename _Rep_type::difference_type difference_type;
+ typedef typename _Rep_type::allocator_type allocator_type;
+
+// allocation/deallocation
+
+ multimap() : _M_t(_Compare(), allocator_type()) { }
+ explicit multimap(const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _M_t(__comp, __a) { }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ multimap(_InputIterator __first, _InputIterator __last)
+ : _M_t(_Compare(), allocator_type())
+ { _M_t.insert_equal(__first, __last); }
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ multimap(_InputIterator __first, _InputIterator __last,
+ const _Compare& __comp)
+ : _M_t(__comp, allocator_type()) { _M_t.insert_equal(__first, __last); }
+# endif
+ template <class _InputIterator>
+ multimap(_InputIterator __first, _InputIterator __last,
+ const _Compare& __comp,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+ : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); }
+#else
+ multimap(const value_type* __first, const value_type* __last)
+ : _M_t(_Compare(), allocator_type())
+ { _M_t.insert_equal(__first, __last); }
+ multimap(const value_type* __first, const value_type* __last,
+ const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); }
+
+ multimap(const_iterator __first, const_iterator __last)
+ : _M_t(_Compare(), allocator_type())
+ { _M_t.insert_equal(__first, __last); }
+ multimap(const_iterator __first, const_iterator __last,
+ const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ multimap(const multimap<_Key,_Tp,_Compare,_Alloc>& __x) : _M_t(__x._M_t) { }
+ multimap<_Key,_Tp,_Compare,_Alloc>&
+ operator=(const multimap<_Key,_Tp,_Compare,_Alloc>& __x) {
+ _M_t = __x._M_t;
+ return *this;
+ }
+
+ // accessors:
+
+ key_compare key_comp() const { return _M_t.key_comp(); }
+ value_compare value_comp() const { return value_compare(_M_t.key_comp()); }
+ allocator_type get_allocator() const { return _M_t.get_allocator(); }
+
+ iterator begin() { return _M_t.begin(); }
+ const_iterator begin() const { return _M_t.begin(); }
+ iterator end() { return _M_t.end(); }
+ const_iterator end() const { return _M_t.end(); }
+ reverse_iterator rbegin() { return _M_t.rbegin(); }
+ const_reverse_iterator rbegin() const { return _M_t.rbegin(); }
+ reverse_iterator rend() { return _M_t.rend(); }
+ const_reverse_iterator rend() const { return _M_t.rend(); }
+ bool empty() const { return _M_t.empty(); }
+ size_type size() const { return _M_t.size(); }
+ size_type max_size() const { return _M_t.max_size(); }
+ void swap(multimap<_Key,_Tp,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); }
+
+ // insert/erase
+
+ iterator insert(const value_type& __x) { return _M_t.insert_equal(__x); }
+ iterator insert(iterator __position, const value_type& __x) {
+ return _M_t.insert_equal(__position, __x);
+ }
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void insert(_InputIterator __first, _InputIterator __last) {
+ _M_t.insert_equal(__first, __last);
+ }
+#else
+ void insert(const value_type* __first, const value_type* __last) {
+ _M_t.insert_equal(__first, __last);
+ }
+ void insert(const_iterator __first, const_iterator __last) {
+ _M_t.insert_equal(__first, __last);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+ void erase(iterator __position) { _M_t.erase(__position); }
+ size_type erase(const key_type& __x) { return _M_t.erase(__x); }
+ void erase(iterator __first, iterator __last)
+ { _M_t.erase(__first, __last); }
+ void clear() { _M_t.clear(); }
+
+ // multimap operations:
+
+ iterator find(const key_type& __x) { return _M_t.find(__x); }
+ const_iterator find(const key_type& __x) const { return _M_t.find(__x); }
+ size_type count(const key_type& __x) const { return _M_t.count(__x); }
+ iterator lower_bound(const key_type& __x) {return _M_t.lower_bound(__x); }
+ const_iterator lower_bound(const key_type& __x) const {
+ return _M_t.lower_bound(__x);
+ }
+ iterator upper_bound(const key_type& __x) {return _M_t.upper_bound(__x); }
+ const_iterator upper_bound(const key_type& __x) const {
+ return _M_t.upper_bound(__x);
+ }
+ pair<iterator,iterator> equal_range(const key_type& __x) {
+ return _M_t.equal_range(__x);
+ }
+ pair<const_iterator,const_iterator> equal_range(const key_type& __x) const {
+ return _M_t.equal_range(__x);
+ }
+};
+
+# define _STLP_TEMPLATE_HEADER template <class _Key, class _Tp, class _Compare, class _Alloc>
+
+# define _STLP_TEMPLATE_CONTAINER map<_Key,_Tp,_Compare,_Alloc>
+
+// fbp : if this template header gets protected against your will, report it !
+# include <stl/_relops_cont.h>
+
+# undef _STLP_TEMPLATE_CONTAINER
+# define _STLP_TEMPLATE_CONTAINER multimap<_Key,_Tp,_Compare,_Alloc>
+
+// fbp : if this template header gets protected against your will, report it !
+# include <stl/_relops_cont.h>
+
+# undef _STLP_TEMPLATE_CONTAINER
+# undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+
+// do a cleanup
+# undef map
+# undef multimap
+// provide a way to access full funclionality
+# define __map__ __FULL_NAME(map)
+# define __multimap__ __FULL_NAME(multimap)
+
+# ifdef _STLP_USE_WRAPPER_FOR_ALLOC_PARAM
+# include <stl/wrappers/_map.h>
+# endif
+
+#endif /* _STLP_INTERNAL_MAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_messages_facets.h b/src/STLport/stl/_messages_facets.h
new file mode 100644
index 0000000..564136b
--- /dev/null
+++ b/src/STLport/stl/_messages_facets.h
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_MESSAGES_H
+#define _STLP_INTERNAL_MESSAGES_H
+
+#ifndef _STLP_IOS_BASE_H
+# include <stl/_ios_base.h>
+#endif
+
+# ifndef _STLP_C_LOCALE_H
+# include <stl/c_locale.h>
+# endif
+
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// messages facets
+
+class messages_base {
+public:
+ typedef int catalog;
+};
+
+template <class _CharT> class messages {};
+
+class _Messages;
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC messages<char> : public locale::facet, public messages_base
+{
+ friend class _Locale;
+public:
+ typedef messages_base::catalog catalog;
+ typedef char char_type;
+ typedef string string_type;
+
+ explicit messages(size_t __refs = 0);
+
+ catalog open(const string& __fn, const locale& __loc) const
+ { return do_open(__fn, __loc); }
+ string_type get(catalog __c, int __set, int __msgid,
+ const string_type& __dfault) const
+ { return do_get(__c, __set, __msgid, __dfault); }
+ inline void close(catalog __c) const
+ { do_close(__c); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+ messages(_Messages*);
+
+protected:
+ messages(size_t, _Locale_messages*);
+ ~messages();
+
+ virtual catalog do_open(const string& __fn, const locale& __loc) const;
+ virtual string_type do_get(catalog __c, int __set, int __msgid,
+ const string_type& __dfault) const;
+ virtual void do_close(catalog __c) const;
+
+ void _M_initialize(const char* __name);
+
+private:
+ _Messages* _M_impl;
+};
+
+# if !defined (_STLP_NO_WCHAR_T)
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC messages<wchar_t> : public locale::facet, public messages_base
+{
+ friend class _Locale;
+public:
+ typedef messages_base::catalog catalog;
+ typedef wchar_t char_type;
+ typedef wstring string_type;
+
+ explicit messages(size_t __refs = 0);
+
+ inline catalog open(const string& __fn, const locale& __loc) const
+ { return do_open(__fn, __loc); }
+ inline string_type get(catalog __c, int __set, int __msgid,
+ const string_type& __dfault) const
+ { return do_get(__c, __set, __msgid, __dfault); }
+ inline void close(catalog __c) const
+ { do_close(__c); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+ messages(_Messages*);
+
+protected:
+
+ messages(size_t, _Locale_messages*);
+ ~messages();
+
+ virtual catalog do_open(const string& __fn, const locale& __loc) const;
+ virtual string_type do_get(catalog __c, int __set, int __msgid,
+ const string_type& __dfault) const;
+ virtual void do_close(catalog __c) const;
+
+ void _M_initialize(const char* __name);
+
+private:
+ _Messages* _M_impl;
+};
+
+# endif /* WCHAR_T */
+
+template <class _CharT> class messages_byname {};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC messages_byname<char> : public messages<char> {
+public:
+ typedef messages_base::catalog catalog;
+ typedef string string_type;
+
+ explicit messages_byname(const char* __name, size_t __refs = 0);
+
+protected:
+ ~messages_byname();
+};
+
+# ifndef _STLP_NO_WCHAR_T
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC messages_byname<wchar_t> : public messages<wchar_t> {
+public:
+ typedef messages_base::catalog catalog;
+ typedef wstring string_type;
+
+ explicit messages_byname(const char* __name, size_t __refs = 0);
+
+protected:
+ ~messages_byname();
+};
+# endif /* WCHAR_T */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_MESSAGES_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_monetary.c b/src/STLport/stl/_monetary.c
new file mode 100644
index 0000000..5430532
--- /dev/null
+++ b/src/STLport/stl/_monetary.c
@@ -0,0 +1,527 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_MONETARY_C
+#define _STLP_MONETARY_C
+
+# ifndef _STLP_INTERNAL_MONETARY_H
+# include <stl/_monetary.h>
+# endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#ifndef _STLP_INTERNAL_IOS_H
+# include <stl/_ios.h>
+#endif
+
+#ifndef _STLP_INTERNAL_NUM_PUT_H
+# include <stl/_num_put.h>
+#endif
+
+#ifndef _STLP_INTERNAL_NUM_GET_H
+# include <stl/_num_get.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+
+template <class _CharT, class _InputIterator>
+locale::id money_get<_CharT, _InputIterator>::id;
+
+template <class _CharT, class _OutputIterator>
+locale::id money_put<_CharT, _OutputIterator>::id;
+
+# else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+typedef money_get<char, const char*> money_get_char;
+typedef money_put<char, char*> money_put_char;
+typedef money_get<char, istreambuf_iterator<char, char_traits<char> > > money_get_char_2;
+typedef money_put<char, ostreambuf_iterator<char, char_traits<char> > > money_put_char_2;
+
+__DECLARE_INSTANCE(locale::id, money_get_char::id, );
+__DECLARE_INSTANCE(locale::id, money_put_char::id, );
+__DECLARE_INSTANCE(locale::id, money_get_char_2::id, );
+__DECLARE_INSTANCE(locale::id, money_put_char_2::id, );
+
+# ifndef _STLP_NO_WCHAR_T
+
+typedef money_get<wchar_t, const wchar_t*> money_get_wchar_t;
+typedef money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > > money_get_wchar_t_2;
+typedef money_put<wchar_t, wchar_t*> money_put_wchar_t;
+typedef money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > money_put_wchar_t_2;
+
+__DECLARE_INSTANCE(locale::id, money_get_wchar_t::id, );
+__DECLARE_INSTANCE(locale::id, money_put_wchar_t::id, );
+__DECLARE_INSTANCE(locale::id, money_get_wchar_t_2::id, );
+__DECLARE_INSTANCE(locale::id, money_put_wchar_t_2::id, );
+
+# endif
+# endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+// money_get facets
+
+
+// helper functions for do_get
+template <class _InIt1, class _InIt2>
+pair<_InIt1, bool> __get_string(_InIt1 __first, _InIt1 __last,
+ _InIt2 __str_first, _InIt2 __str_last) {
+ pair<_InIt1, _InIt2> __pr = mismatch(__first, __last, __str_first);
+ return make_pair(__pr.first, __pr.second == __str_last);
+}
+
+template <class _InIt, class _OuIt, class _CharT>
+bool
+__get_monetary_value(_InIt& __first, _InIt __last, _OuIt __out,
+ const ctype<_CharT>& _c_type,
+ _CharT __point,
+ int __frac_digits,
+ _CharT __sep,
+ const string& __grouping,
+ bool& __syntax_ok)
+{
+ if (__first == __last || !_c_type.is(ctype_base::digit, *__first))
+ return false;
+
+ char __group_sizes[128];
+ char* __group_sizes_end = __grouping.size() == 0 ? 0 : __group_sizes;
+ char __current_group_size = 0;
+
+ while (__first != __last) {
+ if (_c_type.is(ctype_base::digit, *__first)) {
+ ++__current_group_size;
+ *__out++ = *__first++;
+ }
+ else if (__group_sizes_end) {
+ if (*__first == __sep) {
+ *__group_sizes_end++ = __current_group_size;
+ __current_group_size = 0;
+ ++__first;
+ }
+ else break;
+ }
+ else
+ break;
+ }
+
+ if (__grouping.size() == 0)
+ __syntax_ok = true;
+ else {
+ if (__group_sizes_end != __group_sizes)
+ *__group_sizes_end++ = __current_group_size;
+
+ __syntax_ok = __valid_grouping(__group_sizes, __group_sizes_end,
+ __grouping.data(), __grouping.data()+ __grouping.size());
+
+ if (__first == __last || *__first != __point) {
+ for (int __digits = 0; __digits != __frac_digits; ++__digits)
+ *__out++ = _CharT('0');
+ return true; // OK not to have decimal point
+ }
+ }
+
+ ++__first;
+
+ size_t __digits = 0;
+
+ while (__first != __last && _c_type.is(ctype_base::digit, *__first)) {
+ *__out++ = *__first++;
+ ++__digits;
+ }
+
+ __syntax_ok = __syntax_ok && (__digits == __frac_digits);
+
+ return true;
+}
+
+# ifndef _STLP_NO_LONG_DOUBLE
+
+//===== methods ======
+template <class _CharT, class _InputIter>
+_InputIter
+money_get<_CharT, _InputIter>::do_get(_InputIter __s, _InputIter __end, bool __intl,
+ ios_base& __str, ios_base::iostate& __err,
+ long double& __units) const {
+ string_type __buf;
+ __s = do_get(__s, __end, __intl, __str, __err, __buf);
+
+ if (__err == ios_base::goodbit || __err == ios_base::eofbit) {
+ __buf.push_back(0);
+ typename string_type::iterator __b = __buf.begin(), __e = __buf.end();
+ // Can't use atold, since it might be wchar_t. Don't get confused by name below :
+ // it's perfectly capable of reading long double.
+ __get_decimal_integer(__b, __e, __units);
+ }
+ if (__s == __end)
+ __err |= ios_base::eofbit;
+ return __s;
+}
+# endif
+
+template <class _CharT, class _InputIter>
+_InputIter
+money_get<_CharT, _InputIter>::do_get(iter_type __s,
+ iter_type __end, bool __intl,
+ ios_base& __str, ios_base::iostate& __err,
+ string_type& __digits) const {
+ if (__s == __end) {
+ __err |= ios_base::eofbit;
+ return __s;
+ }
+
+ typedef moneypunct<_CharT, false> _Punct;
+ typedef moneypunct<_CharT, true> _Punct_intl;
+ typedef ctype<_CharT> _Ctype;
+
+ locale __loc = __str.getloc();
+ const _Punct& __punct = use_facet<_Punct>(__loc) ;
+ const _Punct_intl& __punct_intl = use_facet<_Punct_intl>(__loc) ;
+ const _Ctype& __c_type = use_facet<_Ctype>(__loc) ;
+
+ money_base::pattern __format = __intl ? __punct_intl.neg_format()
+ : __punct.neg_format();
+ string_type __ns = __intl ? __punct_intl.negative_sign()
+ : __punct.negative_sign();
+ string_type __ps = __intl ? __punct_intl.positive_sign()
+ : __punct.positive_sign();
+ int __i;
+ bool __is_positive = true;
+ bool __symbol_required = (__str.flags() & ios_base::showbase) !=0;
+ string_type __buf;
+ back_insert_iterator<string_type> __out(__buf);
+// pair<iter_type, bool> __result;
+
+ for (__i = 0; __i < 4; ++__i) {
+ switch (__format.field[__i]) {
+ case (char) money_base::none:
+ if (__i == 3) {
+ if (__c_type.is(ctype_base::space, *__s)) {
+ __err = ios_base::failbit;
+ return __s;
+ }
+ break;
+ }
+ while (__s != __end && __c_type.is(ctype_base::space, *__s))
+ ++__s;
+ break;
+ case (char) money_base::space:
+ if (!__c_type.is(ctype_base::space, *__s)) {
+ __err = ios_base::failbit;
+ return __s;
+ }
+ ++__s;
+ while (__s != __end && __c_type.is(ctype_base::space, *__s))
+ ++__s;
+ break;
+ case money_base::symbol: {
+ string_type __curs = __intl ? __punct_intl.curr_symbol()
+ : __punct.curr_symbol();
+ pair<iter_type, bool>
+ __result = __get_string(__s, __end, __curs.begin(), __curs.end());
+ if (!__result.second && __symbol_required)
+ __err = ios_base::failbit;
+ __s = __result.first;
+ break;
+ }
+ case money_base::sign: {
+ if (__s == __end) {
+ if (__ps.size() == 0)
+ break;
+ if (__ns.size() == 0) {
+ __is_positive = false;
+ break;
+ }
+ __err = ios_base::failbit;
+ return __s;
+ }
+ else {
+ if (__ps.size() == 0) {
+ if (__ns.size() == 0)
+ break;
+ if (*__s == ++__ns[0]) {
+ ++__s;
+ __is_positive = false;
+ break;
+ }
+ __err = ios_base::failbit;
+ // return __s;
+ }
+ else {
+ if (*__s == __ps[0]) {
+ ++__s;
+ break;
+ }
+ if (__ns.size() == 0)
+ break;
+ if (*__s == __ns[0]) {
+ ++__s;
+ __is_positive = false;
+ break;
+ }
+ __err = ios_base::failbit;
+ // return __s;
+ }
+ }
+ return __s;
+ // break;
+ }
+ case money_base::value: {
+ _CharT __point = __intl ? __punct_intl.decimal_point()
+ : __punct.decimal_point();
+ int __frac_digits = __intl ? __punct_intl.frac_digits()
+ : __punct.frac_digits();
+ string __grouping = __intl ? __punct_intl.grouping()
+ : __punct.grouping();
+ bool __syntax_ok = true;
+
+ bool __result;
+
+ _CharT __sep = __grouping.size() == 0 ? _CharT() :
+ __intl ? __punct_intl.thousands_sep() : __punct.thousands_sep();
+
+ __result = __get_monetary_value(__s, __end, __out, __c_type,
+ __point, __frac_digits,
+ __sep,
+ __grouping, __syntax_ok);
+
+ if (!__syntax_ok)
+ __err |= ios_base::failbit;
+ if (!__result) {
+ __err = ios_base::failbit;
+ return __s;
+ }
+ break;
+
+ } // Close money_base::value case
+
+
+ } // Close switch statement
+ } // Close for loop
+
+ if (__is_positive) {
+ if (__ps.size() > 1) {
+ pair<_InputIter, bool>
+ __result = __get_string(__s, __end, __ps.begin() + 1, __ps.end());
+ __s = __result.first;
+ if (!__result.second)
+ __err |= ios::failbit;
+ }
+ if (!(__err & ios_base::failbit))
+ __digits = __buf;
+ }
+ else {
+ if (__ns.size() > 1) {
+ pair<_InputIter, bool>
+ __result = __get_string(__s, __end, __ns.begin() + 1, __ns.end());
+ __s = __result.first;
+ if (!__result.second)
+ __err |= ios::failbit;
+ }
+ if (!(__err & ios::failbit)) {
+ __buf.insert(__buf.begin(),__c_type.widen('-'));
+ __digits = __buf;
+ }
+ }
+ if (__s == __end)
+ __err |= ios::eofbit;
+
+ return __s;
+}
+
+// money_put facets
+
+template <class _CharT, class _OutputIter>
+_OutputIter
+money_put<_CharT, _OutputIter>
+ ::do_put(_OutputIter __s, bool __intl, ios_base& __str,
+ char_type __fill,
+ const string_type& __digits) const {
+ typedef ctype<_CharT> _Ctype;
+ typedef moneypunct<_CharT, false> _Punct;
+ typedef moneypunct<_CharT, true> _Punct_intl;
+
+ locale __loc = __str.getloc();
+ const _Ctype& __c_type = use_facet<_Ctype>(__loc) ;
+ const _Punct& __punct = use_facet<_Punct>(__loc) ;
+ const _Punct_intl& __punct_intl = use_facet<_Punct_intl>(__loc) ;
+
+ // some special characters
+
+ char_type __minus = __c_type.widen('-');
+ char_type __plus = __c_type.widen('+');
+ char_type __space = __c_type.widen(' ');
+ char_type __zero = __c_type.widen('0');
+ char_type __point = __intl ? __c_type.widen(__punct_intl.decimal_point())
+ : __c_type.widen(__punct.decimal_point());
+
+ char_type __sep = __intl ? __punct_intl.thousands_sep()
+ : __punct .thousands_sep();
+
+ string __grouping = __intl ? __punct_intl.grouping()
+ : __punct .grouping();
+
+ int __frac_digits = __intl ? __punct_intl.frac_digits()
+ : __punct.frac_digits();
+
+ string_type __curr_sym = __intl ? __punct_intl.curr_symbol()
+ : __punct.curr_symbol();
+
+ // if there are no digits we are going to return __s. If there
+ // are digits, but not enough to fill the frac_digits, we are
+ // going to add zeros. I don't know whether this is right or
+ // not.
+
+ if (__digits.size() == 0)
+ return __s;
+
+ typename string_type::const_iterator __digits_first = __digits.begin();
+ typename string_type::const_iterator __digits_last = __digits.end();
+
+ bool __is_negative = *__digits_first == __minus;
+ if (__is_negative)
+ ++__digits_first;
+
+ string_type __sign = __intl ?
+ __is_negative ? __punct_intl.negative_sign()
+ : __punct_intl.positive_sign()
+ :
+ __is_negative ? __punct.negative_sign()
+ : __punct.positive_sign();
+ typename string_type::const_iterator __cp = __digits_first;
+ while (__cp != __digits_last && __c_type.is(ctype_base::digit, *__cp))
+ ++__cp;
+ if (__cp == __digits_first)
+ return __s;
+ __digits_last = __cp;
+
+ // If grouping is required, we make a copy of __digits and
+ // insert the grouping.
+
+ // To handle the fractional digits, we augment the first group
+ // by frac_digits. If there is only one group, we need first
+ // to duplicate it.
+
+ string_type __new_digits(__digits_first, __digits_last);
+
+ if (__grouping.size() != 0) {
+ if (__grouping.size() == 1)
+ __grouping.push_back(__grouping[0]);
+ __grouping[0] += __frac_digits;
+ _CharT* __data_ptr = __CONST_CAST(_CharT*,__new_digits.data());
+ _CharT* __data_end = __data_ptr + __new_digits.size();
+
+ ptrdiff_t __value_length = __insert_grouping(__data_ptr,
+ __data_end,
+ __grouping,
+ __sep,
+ __plus, __minus, 0);
+ __digits_first = __new_digits.begin();
+ __digits_last = __digits_first + __value_length;
+ }
+
+ // Determine the amount of padding required, if any.
+
+ size_t __width = __str.width();
+
+#if defined(_STLP_DEBUG) && (defined(__HP_aCC) || (__HP_aCC <= 1))
+ size_t __value_length = operator -(__digits_last, __digits_first);
+#else
+ size_t __value_length = __digits_last - __digits_first;
+#endif
+
+ size_t __length = __value_length;
+
+ __length += __sign.size();
+ if (__frac_digits != 0)
+ ++__length;
+
+ bool __generate_curr = (__str.flags() & ios_base::showbase) !=0;
+ if (__generate_curr)
+ __length += __curr_sym.size();
+ money_base::pattern __format =
+ __intl ? (__is_negative ? __punct_intl.neg_format()
+ : __punct_intl.pos_format())
+ : (__is_negative ? __punct.neg_format()
+ : __punct.pos_format());
+ {
+ for (int __i = 0; __i < 4; ++__i)
+ if (__format.field[__i] == (char) money_base::space)
+ ++__length;
+ }
+
+ size_t __fill_amt = __length < __width ? __width - __length : 0;
+
+ ios_base::fmtflags __fill_pos = __str.flags() & ios_base::adjustfield;
+
+ if (__fill_amt != 0 &&
+ !(__fill_pos & (ios_base::left | ios_base::internal)))
+ __s = fill_n(__s, __fill_amt, __fill);
+
+ for (int __i = 0; __i < 4; ++__i) {
+ char __ffield = __format.field[__i];
+ if (__ffield == money_base::none) {
+ if (__fill_amt != 0 && __fill_pos == ios_base::internal)
+ __s = fill_n(__s, __fill_amt, __fill);
+ }
+ else if (__ffield == money_base::space) {
+ *__s++ = __space;
+ if (__fill_amt != 0 && __fill_pos == ios_base::internal)
+ __s = fill_n(__s, __fill_amt, __fill);
+ }
+ else if (__ffield == money_base::symbol) {
+ if (__generate_curr)
+ __s = copy(__curr_sym.begin(), __curr_sym.end(), __s);
+ }
+ else if (__ffield == money_base::sign) {
+ if (__sign.size() != 0)
+ *__s++ = __sign[0];
+ }
+ else if (__ffield == money_base::value) {
+ if (__frac_digits == 0)
+ __s = copy(__digits_first, __digits_last, __s);
+ else {
+ if ((int)__value_length <= __frac_digits) {
+ *__s++ = __point;
+ __s = copy(__digits_first, __digits_last, __s);
+ __s = fill_n(__s, __frac_digits - __value_length, __zero);
+ }
+ else {
+ __s = copy(__digits_first, __digits_last - __frac_digits, __s);
+ if (__frac_digits != 0) {
+ *__s++ = __point;
+ __s = copy(__digits_last - __frac_digits, __digits_last, __s);
+ }
+ }
+ }
+ }
+ } // Close for loop
+
+ // Ouput rest of sign if necessary.
+
+ if (__sign.size() > 1)
+ __s = copy(__sign.begin() + 1, __sign.end(), __s);
+ if (!(__fill_pos & (ios_base::right | ios_base::internal)))
+ __s = fill_n(__s, __fill_amt, __fill);
+
+ return __s;
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* EXPOSE */
+
+#endif /* _STLP_MONETARY_C */
diff --git a/src/STLport/stl/_monetary.h b/src/STLport/stl/_monetary.h
new file mode 100644
index 0000000..3343c14
--- /dev/null
+++ b/src/STLport/stl/_monetary.h
@@ -0,0 +1,463 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_MONETARY_H
+#define _STLP_INTERNAL_MONETARY_H
+
+#ifndef _STLP_INTERNAL_CTYPE_H
+# include <stl/_ctype.h>
+#endif
+
+#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
+# include <stl/_ostreambuf_iterator.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
+# include <stl/_istreambuf_iterator.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+class money_base {
+public:
+ enum part {none, space, symbol, sign, value};
+ struct pattern {
+ char field[4];
+ };
+};
+
+// moneypunct facets: forward declaration
+template <class _charT, __DFL_NON_TYPE_PARAM(bool, _International, false) > class moneypunct {};
+
+// money_get facets
+
+template <class _CharT, __DFL_TMPL_PARAM(_InputIter , istreambuf_iterator<_CharT>) >
+class money_get : public locale::facet
+{
+ friend class _Locale;
+public:
+ typedef _CharT char_type;
+ typedef _InputIter iter_type;
+ typedef basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > string_type;
+
+ money_get(size_t __refs = 0) : _BaseFacet(__refs) {}
+# ifndef _STLP_NO_LONG_DOUBLE
+ iter_type get(iter_type __s, iter_type __end, bool __intl,
+ ios_base& __str, ios_base::iostate& __err,
+ long double& __units) const
+ { return do_get(__s, __end, __intl, __str, __err, __units); }
+# endif
+ iter_type get(iter_type __s, iter_type __end, bool __intl,
+ ios_base& __str, ios_base::iostate& __err,
+ string_type& __digits) const
+ { return do_get(__s, __end, __intl, __str, __err, __digits); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+ ~money_get() {}
+# ifndef _STLP_NO_LONG_DOUBLE
+ virtual iter_type do_get(iter_type __s, iter_type __end, bool __intl,
+ ios_base& __str, ios_base::iostate& __err,
+ long double& __units) const;
+# endif
+ virtual iter_type do_get(iter_type __s, iter_type __end, bool __intl,
+ ios_base& __str, ios_base::iostate& __err,
+ string_type& __digits) const;
+};
+
+
+// moneypunct facets: definition of specializations
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct<char, true> : public locale::facet, public money_base
+{
+
+public:
+ typedef char char_type;
+ typedef string string_type;
+ explicit moneypunct _STLP_PSPEC2(char, true) (size_t __refs = 0);
+
+ char decimal_point() const { return do_decimal_point(); }
+ char thousands_sep() const { return do_thousands_sep(); }
+ string grouping() const { return do_grouping(); }
+ string_type curr_symbol() const { return do_curr_symbol(); }
+ string_type positive_sign() const { return do_positive_sign(); }
+ string_type negative_sign() const { return do_negative_sign(); }
+ int frac_digits() const { return do_frac_digits(); }
+ pattern pos_format() const { return do_pos_format(); }
+ pattern neg_format() const { return do_neg_format(); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+ enum _IntlVal { intl = 1 } ;
+# else
+ static const bool intl = true;
+# endif
+
+protected:
+ pattern _M_pos_format;
+ pattern _M_neg_format;
+
+ ~moneypunct _STLP_PSPEC2(char, true) ();
+
+ virtual char do_decimal_point() const;
+ virtual char do_thousands_sep() const;
+ virtual string do_grouping() const;
+
+ virtual string do_curr_symbol() const;
+
+ virtual string do_positive_sign() const;
+ virtual string do_negative_sign() const;
+ virtual int do_frac_digits() const;
+ virtual pattern do_pos_format() const;
+ virtual pattern do_neg_format() const;
+
+ friend class _Locale;
+
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct<char, false> : public locale::facet, public money_base
+{
+public:
+ typedef char char_type;
+ typedef string string_type;
+
+ explicit moneypunct _STLP_PSPEC2(char, false) (size_t __refs = 0);
+
+ char decimal_point() const { return do_decimal_point(); }
+ char thousands_sep() const { return do_thousands_sep(); }
+ string grouping() const { return do_grouping(); }
+ string_type curr_symbol() const { return do_curr_symbol(); }
+ string_type positive_sign() const { return do_positive_sign(); }
+ string_type negative_sign() const { return do_negative_sign(); }
+ int frac_digits() const { return do_frac_digits(); }
+ pattern pos_format() const { return do_pos_format(); }
+ pattern neg_format() const { return do_neg_format(); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+ enum _IntlVal { intl = 0 } ;
+# else
+ static const bool intl = false;
+# endif
+
+protected:
+ pattern _M_pos_format;
+ pattern _M_neg_format;
+
+ ~moneypunct _STLP_PSPEC2(char, false) ();
+
+ virtual char do_decimal_point() const;
+ virtual char do_thousands_sep() const;
+ virtual string do_grouping() const;
+
+ virtual string do_curr_symbol() const;
+
+ virtual string do_positive_sign() const;
+ virtual string do_negative_sign() const;
+ virtual int do_frac_digits() const;
+ virtual pattern do_pos_format() const;
+ virtual pattern do_neg_format() const;
+
+ friend class _Locale;
+};
+
+
+# ifndef _STLP_NO_WCHAR_T
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct<wchar_t, true> : public locale::facet, public money_base
+{
+ friend class _Locale;
+public:
+ typedef wchar_t char_type;
+ typedef wstring string_type;
+ explicit moneypunct _STLP_PSPEC2(wchar_t, true) (size_t __refs = 0);
+ wchar_t decimal_point() const { return do_decimal_point(); }
+ wchar_t thousands_sep() const { return do_thousands_sep(); }
+ string grouping() const { return do_grouping(); }
+ string_type curr_symbol() const { return do_curr_symbol(); }
+ string_type positive_sign() const { return do_positive_sign(); }
+ string_type negative_sign() const { return do_negative_sign(); }
+ int frac_digits() const { return do_frac_digits(); }
+ pattern pos_format() const { return do_pos_format(); }
+ pattern neg_format() const { return do_neg_format(); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+ enum _IntlVal { intl = 1 } ;
+# else
+ static const bool intl = true;
+# endif
+
+protected:
+ pattern _M_pos_format;
+ pattern _M_neg_format;
+
+ ~moneypunct _STLP_PSPEC2(wchar_t, true) ();
+
+ virtual wchar_t do_decimal_point() const;
+ virtual wchar_t do_thousands_sep() const;
+ virtual string do_grouping() const;
+
+ virtual string_type do_curr_symbol() const;
+
+ virtual string_type do_positive_sign() const;
+ virtual string_type do_negative_sign() const;
+ virtual int do_frac_digits() const;
+ virtual pattern do_pos_format() const;
+ virtual pattern do_neg_format() const;
+};
+
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct<wchar_t, false> : public locale::facet, public money_base
+{
+ friend class _Locale;
+public:
+ typedef wchar_t char_type;
+ typedef wstring string_type;
+ explicit moneypunct _STLP_PSPEC2(wchar_t, false) (size_t __refs = 0);
+ wchar_t decimal_point() const { return do_decimal_point(); }
+ wchar_t thousands_sep() const { return do_thousands_sep(); }
+ string grouping() const { return do_grouping(); }
+ string_type curr_symbol() const { return do_curr_symbol(); }
+ string_type positive_sign() const { return do_positive_sign(); }
+ string_type negative_sign() const { return do_negative_sign(); }
+ int frac_digits() const { return do_frac_digits(); }
+ pattern pos_format() const { return do_pos_format(); }
+ pattern neg_format() const { return do_neg_format(); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+ enum _IntlVal { intl = 0 } ;
+# else
+ static const bool intl = false;
+# endif
+
+protected:
+ pattern _M_pos_format;
+ pattern _M_neg_format;
+
+ ~moneypunct _STLP_PSPEC2(wchar_t, false) ();
+
+ virtual wchar_t do_decimal_point() const;
+ virtual wchar_t do_thousands_sep() const;
+ virtual string do_grouping() const;
+
+ virtual string_type do_curr_symbol() const;
+
+ virtual string_type do_positive_sign() const;
+ virtual string_type do_negative_sign() const;
+ virtual int do_frac_digits() const;
+ virtual pattern do_pos_format() const;
+ virtual pattern do_neg_format() const;
+};
+
+# endif
+
+template <class _charT, __DFL_NON_TYPE_PARAM(bool , _International , false) > class moneypunct_byname {};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct_byname<char, true> : public moneypunct<char, true>
+{
+public:
+ typedef money_base::pattern pattern;
+ typedef char char_type;
+ typedef string string_type;
+
+ explicit moneypunct_byname _STLP_PSPEC2(char, true) (const char * __name, size_t __refs = 0);
+
+protected:
+ _Locale_monetary* _M_monetary;
+ ~moneypunct_byname _STLP_PSPEC2(char, true) ();
+ virtual char do_decimal_point() const;
+ virtual char do_thousands_sep() const;
+ virtual string do_grouping() const;
+
+ virtual string_type do_curr_symbol() const;
+
+ virtual string_type do_positive_sign() const;
+ virtual string_type do_negative_sign() const;
+ virtual int do_frac_digits() const;
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct_byname<char, false> : public moneypunct<char, false>
+{
+public:
+ typedef money_base::pattern pattern;
+ typedef char char_type;
+ typedef string string_type;
+
+ explicit moneypunct_byname _STLP_PSPEC2(char, false) (const char * __name, size_t __refs = 0);
+
+protected:
+ _Locale_monetary* _M_monetary;
+ ~moneypunct_byname _STLP_PSPEC2(char, false) ();
+ virtual char do_decimal_point() const;
+ virtual char do_thousands_sep() const;
+ virtual string do_grouping() const;
+
+ virtual string_type do_curr_symbol() const;
+
+ virtual string_type do_positive_sign() const;
+ virtual string_type do_negative_sign() const;
+ virtual int do_frac_digits() const;
+};
+
+# ifndef _STLP_NO_WCHAR_T
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct_byname<wchar_t, true> : public moneypunct<wchar_t, true>
+{
+public:
+ typedef money_base::pattern pattern;
+ typedef wchar_t char_type;
+ typedef wstring string_type;
+
+ explicit moneypunct_byname _STLP_PSPEC2(wchar_t, true) (const char * __name, size_t __refs = 0);
+
+protected:
+ _Locale_monetary* _M_monetary;
+ ~moneypunct_byname _STLP_PSPEC2(wchar_t, true) ();
+ virtual wchar_t do_decimal_point() const;
+ virtual wchar_t do_thousands_sep() const;
+ virtual string do_grouping() const;
+
+ virtual string_type do_curr_symbol() const;
+
+ virtual string_type do_positive_sign() const;
+ virtual string_type do_negative_sign() const;
+ virtual int do_frac_digits() const;
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct_byname<wchar_t, false> : public moneypunct<wchar_t, false>
+{
+public:
+ typedef money_base::pattern pattern;
+ typedef wchar_t char_type;
+ typedef wstring string_type;
+
+ explicit moneypunct_byname _STLP_PSPEC2(wchar_t, false) (const char * __name, size_t __refs = 0);
+
+protected:
+ _Locale_monetary* _M_monetary;
+ ~moneypunct_byname _STLP_PSPEC2(wchar_t, false) ();
+ virtual wchar_t do_decimal_point() const;
+ virtual wchar_t do_thousands_sep() const;
+ virtual string do_grouping() const;
+
+ virtual string_type do_curr_symbol() const;
+
+ virtual string_type do_positive_sign() const;
+ virtual string_type do_negative_sign() const;
+ virtual int do_frac_digits() const;
+};
+# endif
+
+//===== methods ======
+
+
+// money_put facets
+
+template <class _CharT, __DFL_TMPL_PARAM( _OutputIter , ostreambuf_iterator<_CharT>) >
+class money_put : public locale::facet {
+ friend class _Locale;
+
+public:
+ typedef _CharT char_type;
+ typedef _OutputIter iter_type;
+ typedef basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > string_type;
+
+ money_put(size_t __refs = 0) : _BaseFacet(__refs) {}
+# ifndef _STLP_NO_LONG_DOUBLE
+ iter_type put(iter_type __s, bool __intl, ios_base& __str,
+ char_type __fill, long double __units) const
+ { return do_put(__s, __intl, __str, __fill, __units); }
+# endif
+ iter_type put(iter_type __s, bool __intl, ios_base& __str,
+ char_type __fill,
+ const string_type& __digits) const
+ { return do_put(__s, __intl, __str, __fill, __digits); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+ ~money_put() {}
+# ifndef _STLP_NO_LONG_DOUBLE
+ virtual iter_type do_put(iter_type __s, bool __intl, ios_base& __str,
+ char_type __fill, long double /* __units */ ) const {
+
+ locale __loc = __str.getloc();
+ _CharT __buf[64];
+ return do_put(__s, __intl, __str, __fill, __buf + 0);
+ }
+# endif
+ virtual iter_type do_put(iter_type __s, bool __intl, ios_base& __str,
+ char_type __fill,
+ const string_type& __digits) const;
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS money_get<char, istreambuf_iterator<char, char_traits<char> > >;
+_STLP_EXPORT_TEMPLATE_CLASS money_put<char, ostreambuf_iterator<char, char_traits<char> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS money_get<char, const char* >;
+// _STLP_EXPORT_TEMPLATE_CLASS money_put<char, char* >;
+# if ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
+_STLP_EXPORT_TEMPLATE_CLASS money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS money_get<wchar_t, const wchar_t* >;
+// _STLP_EXPORT_TEMPLATE_CLASS money_put<wchar_t, wchar_t* >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+# if defined (__BORLANDC__) && defined (_RTLDLL)
+inline void _Stl_loc_init_monetary() {
+ money_get<char, istreambuf_iterator<char, char_traits<char> > >::id._M_index = 8;
+ money_get<char, const char*>::id._M_index = 9;
+ money_put<char, ostreambuf_iterator<char, char_traits<char> > >::id._M_index = 10;
+ money_put<char, char*>::id._M_index = 11;
+# ifndef _STLP_NO_WCHAR_T
+ money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 27;
+ money_get<wchar_t, const wchar_t*>::id._M_index = 28;
+ money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 29;
+ money_put<wchar_t, wchar_t*>::id._M_index = 30;
+# endif
+}
+#endif
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_monetary.c>
+# endif
+
+#endif /* _STLP_INTERNAL_MONETARY_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
+
diff --git a/src/STLport/stl/_new.h b/src/STLport/stl/_new.h
new file mode 100644
index 0000000..9c9dc35
--- /dev/null
+++ b/src/STLport/stl/_new.h
@@ -0,0 +1,93 @@
+
+#ifndef _STLP_NEW_H_HEADER
+# define _STLP_NEW_H_HEADER
+
+# ifdef _STLP_NO_BAD_ALLOC
+
+# ifndef _STLP_NEW_DONT_THROW
+# define _STLP_NEW_DONT_THROW 1
+# endif /* _STLP_NEW_DONT_THROW */
+
+# include <exception>
+
+_STLP_BEGIN_NAMESPACE
+
+struct nothrow_t {};
+
+# ifdef _STLP_OWN_IOSTREAMS
+extern _STLP_DECLSPEC const nothrow_t nothrow;
+# else
+# define nothrow nothrow_t()
+# endif
+
+class bad_alloc : public _STLP_EXCEPTION_BASE {
+public:
+ bad_alloc () _STLP_NOTHROW_INHERENTLY { }
+ bad_alloc(const bad_alloc&) _STLP_NOTHROW_INHERENTLY { }
+ bad_alloc& operator=(const bad_alloc&) _STLP_NOTHROW_INHERENTLY {return *this;}
+ ~bad_alloc () _STLP_NOTHROW_INHERENTLY { }
+ const char* what() const _STLP_NOTHROW_INHERENTLY { return "bad alloc"; }
+};
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_NO_BAD_ALLOC */
+
+#ifdef _STLP_WINCE
+_STLP_BEGIN_NAMESPACE
+
+inline void* _STLP_CALL __stl_new(size_t __n) {
+ return ::malloc(__n);
+}
+
+inline void _STLP_CALL __stl_delete(void* __p) {
+ free(__p);
+}
+_STLP_END_NAMESPACE
+
+#else /* _STLP_WINCE */
+
+#include <new>
+
+# ifndef _STLP_NO_BAD_ALLOC
+# ifdef _STLP_USE_OWN_NAMESPACE
+
+ _STLP_BEGIN_NAMESPACE
+ using _STLP_VENDOR_EXCEPT_STD::bad_alloc;
+ using _STLP_VENDOR_EXCEPT_STD::nothrow_t;
+ using _STLP_VENDOR_EXCEPT_STD::nothrow;
+
+# if defined (_STLP_GLOBAL_NEW_HANDLER)
+ using ::new_handler;
+ using ::set_new_handler;
+# else
+ using _STLP_VENDOR_EXCEPT_STD::new_handler;
+ using _STLP_VENDOR_EXCEPT_STD::set_new_handler;
+# endif
+
+ _STLP_END_NAMESPACE
+
+# endif /* _STLP_OWN_NAMESPACE */
+
+# endif /* _STLP_NO_BAD_ALLOC */
+
+# if defined (_STLP_NO_NEW_NEW_HEADER) || defined (_STLP_NEW_DONT_THROW) && ! defined (_STLP_CHECK_NULL_ALLOC)
+# define _STLP_CHECK_NULL_ALLOC(__x) void* __y = __x;if (__y == 0){_STLP_THROW(bad_alloc());}return __y
+# else
+# define _STLP_CHECK_NULL_ALLOC(__x) return __x
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+#if (( defined(__IBMCPP__)|| defined(__OS400__) || defined (__xlC__) || defined (qTidyHeap)) && defined(__DEBUG_ALLOC__) )
+inline void* _STLP_CALL __stl_new(size_t __n) { _STLP_CHECK_NULL_ALLOC(::operator _STLP_NEW(__n, __FILE__, __LINE__)); }
+inline void _STLP_CALL __stl_delete(void* __p) { ::operator delete(__p, __FILE__, __LINE__); }
+#else
+inline void* _STLP_CALL __stl_new(size_t __n) { _STLP_CHECK_NULL_ALLOC(::operator _STLP_NEW(__n)); }
+inline void _STLP_CALL __stl_delete(void* __p) { ::operator delete(__p); }
+#endif
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_WINCE */
+
+#endif /* _STLP_NEW_H_HEADER */
diff --git a/src/STLport/stl/_null_stream.h b/src/STLport/stl/_null_stream.h
new file mode 100644
index 0000000..1628783
--- /dev/null
+++ b/src/STLport/stl/_null_stream.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2000
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_NULL_STREAM_H
+# define _STLP_NULL_STREAM_H
+
+_STLP_BEGIN_NAMESPACE
+
+struct __null_stream
+{
+ void flush() { }
+};
+
+template <class _Tp>
+__null_stream& operator <<(__null_stream& __x, const _Tp& )
+{
+ return __x;
+}
+
+template <class _Tp>
+__null_stream& operator >>(const _Tp&, __null_stream& __x )
+{
+ return __x;
+}
+
+extern __null_stream cin, cout, cerr, endl, ws, hex, dec;
+
+_STLP_END_NAMESPACE
+
+# endif
diff --git a/src/STLport/stl/_num_get.c b/src/STLport/stl/_num_get.c
new file mode 100644
index 0000000..5f50bb2
--- /dev/null
+++ b/src/STLport/stl/_num_get.c
@@ -0,0 +1,671 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_NUM_GET_C
+#define _STLP_NUM_GET_C
+
+#ifndef _STLP_INTERNAL_NUM_GET_H
+# include <stl/_num_get.h>
+#endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#ifndef _STLP_LIMITS_H
+# include <stl/_limits.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+extern const unsigned char __digit_val_table[];
+
+template < class _InputIter, class _Integer, class _CharT>
+_InputIter _STLP_CALL
+_M_do_get_integer(_InputIter&, _InputIter&, ios_base&, ios_base::iostate&, _Integer&, _CharT*);
+
+// _M_do_get_integer and its helper functions.
+
+inline bool _STLP_CALL __get_fdigit(char& __c, const char*)
+ { return __c >= '0' && __c <= '9'; }
+
+inline bool _STLP_CALL __get_fdigit_or_sep(char& __c, char __sep, const char *)
+{
+ if (__c == __sep) {
+ __c = ',' ;
+ return true ;
+ } else
+ return ( __c >= '0' && __c <= '9');
+}
+
+inline int _STLP_CALL
+__get_digit_from_table(unsigned __index)
+{
+ return (__index > 127 ? 0xFF : __digit_val_table[__index]);
+}
+
+extern const char __narrow_atoms[];
+
+template <class _InputIter, class _CharT>
+int
+_M_get_base_or_zero(_InputIter& __in, _InputIter& __end, ios_base& __str, _CharT*)
+{
+ _CharT __atoms[5];
+ const ctype<_CharT>& __c_type = use_facet< ctype<_CharT> >(__str.getloc());
+ // const ctype<_CharT>& __c_type = *(const ctype<_CharT>*)__str._M_ctype_facet();
+
+ __c_type.widen(__narrow_atoms, __narrow_atoms + 5, __atoms);
+
+ bool __negative = false;
+ _CharT __c = *__in;
+
+ if (__c == __atoms[1] /* __xminus_char */ ) {
+ __negative = true;
+ ++__in;
+ }
+ else if (__c == __atoms[0] /* __xplus_char */ )
+ ++__in;
+
+
+ int __base;
+ int __valid_zero = 0;
+
+ ios_base::fmtflags __basefield = __str.flags() & ios_base::basefield;
+
+ switch (__basefield) {
+ case ios_base::oct:
+ __base = 8;
+ break;
+ case ios_base::dec:
+ __base = 10;
+ break;
+ case ios_base::hex:
+ __base = 16;
+ if (__in != __end && *__in == __atoms[2] /* __zero_char */ ) {
+ ++__in;
+ if (__in != __end &&
+ (*__in == __atoms[3] /* __x_char */ || *__in == __atoms[4] /* __X_char */ ))
+ ++__in;
+ else
+ __valid_zero = 1; // That zero is valid by itself.
+ }
+ break;
+ default:
+ if (__in != __end && *__in == __atoms[2] /* __zero_char */ ) {
+ ++__in;
+ if (__in != __end &&
+ (*__in == __atoms[3] /* __x_char */ || *__in == __atoms[4] /* __X_char */ )) {
+ ++__in;
+ __base = 16;
+ }
+ else
+ {
+ __base = 8;
+ __valid_zero = 1; // That zero is still valid by itself.
+ }
+ }
+ else
+ __base = 10;
+ break;
+ }
+ return (__base << 2) | ((int)__negative << 1) | __valid_zero;
+}
+
+
+template <class _InputIter, class _Integer>
+bool _STLP_CALL
+__get_integer(_InputIter& __first, _InputIter& __last,
+ int __base, _Integer& __val,
+ int __got, bool __is_negative, char __separator, const string& __grouping, const __true_type&)
+{
+ bool __ovflow = false;
+ _Integer __result = 0;
+ bool __is_group = !__grouping.empty();
+ char __group_sizes[64];
+ int __current_group_size = 0;
+ char* __group_sizes_end = __group_sizes;
+
+ _Integer __over_base = (numeric_limits<_Integer>::min)() / __STATIC_CAST(_Integer, __base);
+
+ for ( ; __first != __last ; ++__first) {
+
+ const char __c = *__first;
+
+ if (__is_group && __c == __separator) {
+ *__group_sizes_end++ = __current_group_size;
+ __current_group_size = 0;
+ continue;
+ }
+
+ int __n = __get_digit_from_table(__c);
+
+ if (__n >= __base)
+ break;
+
+ ++__got;
+ ++__current_group_size;
+
+ if (__result < __over_base)
+ __ovflow = true; // don't need to keep accumulating
+ else {
+ _Integer __next = __STATIC_CAST(_Integer, __base * __result - __n);
+ if (__result != 0)
+ __ovflow = __ovflow || __next >= __result;
+ __result = __next;
+ }
+ }
+
+ if (__is_group && __group_sizes_end != __group_sizes) {
+ *__group_sizes_end++ = __current_group_size;
+ }
+
+ // fbp : added to not modify value if nothing was read
+ if (__got > 0) {
+ __val = __ovflow
+ ? __is_negative ? (numeric_limits<_Integer>::min)()
+ : (numeric_limits<_Integer>::max)()
+ : (__is_negative ? __result : __STATIC_CAST(_Integer, -__result));
+ }
+ // overflow is being treated as failure
+ return ((__got > 0) && !__ovflow) && (__is_group == 0 || __valid_grouping(__group_sizes, __group_sizes_end,
+ __grouping.data(), __grouping.data()+ __grouping.size())) ;
+}
+
+template <class _InputIter, class _Integer>
+bool _STLP_CALL
+__get_integer(_InputIter& __first, _InputIter& __last,
+ int __base, _Integer& __val,
+ int __got, bool __is_negative, char __separator, const string& __grouping, const __false_type&)
+{
+ bool __ovflow = false;
+ _Integer __result = 0;
+ bool __is_group = !__grouping.empty();
+ char __group_sizes[64];
+ int __current_group_size = 0;
+ char* __group_sizes_end = __group_sizes;
+
+ _Integer __over_base = (numeric_limits<_Integer>::max)() / __STATIC_CAST(_Integer, __base);
+
+ for ( ; __first != __last ; ++__first) {
+
+ const char __c = *__first;
+
+ if (__is_group && __c == __separator) {
+ *__group_sizes_end++ = __current_group_size;
+ __current_group_size = 0;
+ continue;
+ }
+
+ int __n = __get_digit_from_table(__c);
+
+ if (__n >= __base)
+ break;
+
+ ++__got;
+ ++__current_group_size;
+
+ if (__result > __over_base)
+ __ovflow = true; //don't need to keep accumulating
+ else {
+ _Integer __next = __STATIC_CAST(_Integer, __base * __result + __n);
+ if (__result != 0)
+ __ovflow = __ovflow || __next <= __result;
+ __result = __next;
+ }
+ }
+
+ if (__is_group && __group_sizes_end != __group_sizes) {
+ *__group_sizes_end++ = __current_group_size;
+ }
+
+ // fbp : added to not modify value if nothing was read
+ if (__got > 0) {
+ __val = __ovflow
+ ? (numeric_limits<_Integer>::max)()
+ : (__is_negative ? __STATIC_CAST(_Integer, -__result) : __result);
+ }
+ // overflow is being treated as failure
+ return ((__got > 0) && !__ovflow) &&
+ (__is_group == 0 || __valid_grouping(__group_sizes, __group_sizes_end,
+ __grouping.data(), __grouping.data()+ __grouping.size())) ;
+}
+
+
+template <class _InputIter, class _Integer>
+bool _STLP_CALL
+__get_decimal_integer(_InputIter& __first, _InputIter& __last, _Integer& __val)
+{
+ string __grp;
+ return __get_integer(__first, __last, 10, __val, 0, false, ' ', __grp, __false_type());
+}
+
+template <class _InputIter, class _Integer, class _CharT>
+_InputIter _STLP_CALL
+_M_do_get_integer(_InputIter& __in, _InputIter& __end, ios_base& __str,
+ ios_base::iostate& __err, _Integer& __val, _CharT* __pc)
+{
+
+#if defined(__HP_aCC) && (__HP_aCC == 1)
+ bool _IsSigned = !((_Integer)(-1) > 0);
+#else
+ typedef typename __bool2type<numeric_limits<_Integer>::is_signed>::_Ret _IsSigned;
+#endif
+
+ const numpunct<_CharT>& __numpunct = *(const numpunct<_CharT>*)__str._M_numpunct_facet();
+ const string& __grouping = __str._M_grouping(); // cached copy
+
+ const int __base_or_zero = _M_get_base_or_zero(__in, __end, __str, __pc);
+ int __got = __base_or_zero & 1;
+
+ bool __result;
+
+ if (__in == __end) { // We may have already read a 0. If so,
+
+ if (__got > 0) { // the result is 0 even if we're at eof.
+ __val = 0;
+ __result = true;
+ }
+ else
+ __result = false;
+ } else {
+
+ const bool __negative = __base_or_zero & 2;
+ const int __base = __base_or_zero >> 2;
+
+#if defined(__HP_aCC) && (__HP_aCC == 1)
+ if (_IsSigned)
+ __result = __get_integer(__in, __end, __base, __val, __got, __negative, __numpunct.thousands_sep(), __grouping, __true_type() );
+ else
+ __result = __get_integer(__in, __end, __base, __val, __got, __negative, __numpunct.thousands_sep(), __grouping, __false_type() );
+#else
+ __result = __get_integer(__in, __end, __base, __val, __got, __negative, __numpunct.thousands_sep(), __grouping, _IsSigned());
+# endif
+ }
+
+ __err = __STATIC_CAST(ios_base::iostate, __result ? ios_base::goodbit : ios_base::failbit);
+
+ if (__in == __end)
+ __err |= ios_base::eofbit;
+ return __in;
+}
+
+// _M_read_float and its helper functions.
+template <class _InputIter, class _CharT>
+_InputIter _STLP_CALL
+__copy_sign(_InputIter __first, _InputIter __last, string& __v,
+ _CharT __xplus, _CharT __xminus) {
+ if (__first != __last) {
+ _CharT __c = *__first;
+ if (__c == __xplus)
+ ++__first;
+ else if (__c == __xminus) {
+ __v.push_back('-');
+ ++__first;
+ }
+ }
+ return __first;
+}
+
+
+template <class _InputIter, class _CharT>
+bool _STLP_CALL
+__copy_digits(_InputIter& __first, _InputIter& __last,
+ string& __v, const _CharT* __digits)
+{
+ bool __ok = false;
+
+ for ( ; __first != __last; ++__first) {
+ _CharT __c = *__first;
+ if (__get_fdigit(__c, __digits)) {
+ __v.push_back((char)__c);
+ __ok = true;
+ }
+ else
+ break;
+ }
+ return __ok;
+}
+
+template <class _InputIter, class _CharT>
+bool _STLP_CALL
+__copy_grouped_digits(_InputIter& __first, _InputIter& __last,
+ string& __v, const _CharT * __digits,
+ _CharT __sep, const string& __grouping,
+ bool& __grouping_ok)
+{
+ bool __ok = false;
+ char __group_sizes[64];
+ char*__group_sizes_end = __group_sizes;
+ char __current_group_size = 0;
+
+ for ( ; __first != __last; ++__first) {
+ _CharT __c = *__first;
+ bool __tmp = __get_fdigit_or_sep(__c, __sep, __digits);
+ if (__tmp) {
+ if (__c == ',') {
+ *__group_sizes_end++ = __current_group_size;
+ __current_group_size = 0;
+ }
+ else {
+ __ok = true;
+ __v.push_back((char)__c);
+ ++__current_group_size;
+ }
+ }
+ else
+ break;
+ }
+
+ if (__group_sizes_end != __group_sizes)
+ *__group_sizes_end++ = __current_group_size;
+ __grouping_ok = __valid_grouping(__group_sizes, __group_sizes_end, __grouping.data(), __grouping.data() + __grouping.size());
+ return __ok;
+}
+
+
+template <class _InputIter, class _CharT>
+bool _STLP_CALL
+_M_read_float(string& __buf, _InputIter& __in, _InputIter& __end, ios_base& __s, _CharT*)
+{
+ // Create a string, copying characters of the form
+ // [+-]? [0-9]* .? [0-9]* ([eE] [+-]? [0-9]+)?
+
+ bool __digits_before_dot /* = false */;
+ bool __digits_after_dot = false;
+ bool __ok;
+
+ bool __grouping_ok = true;
+
+ const ctype<_CharT>& __ct = use_facet< ctype<_CharT> >(__s.getloc());
+ // const ctype<_CharT>& __ct = *(const ctype<_CharT>*)__s._M_ctype_facet();
+ const numpunct<_CharT>& __numpunct = *(const numpunct<_CharT>*)__s._M_numpunct_facet();
+ const string& __grouping = __s._M_grouping(); // cached copy
+
+ _CharT __dot = __numpunct.decimal_point();
+ _CharT __sep = __numpunct.thousands_sep();
+
+ _CharT __digits[10];
+ _CharT __xplus;
+ _CharT __xminus;
+
+ _CharT __pow_e;
+ _CharT __pow_E;
+
+ _Initialize_get_float(__ct, __xplus, __xminus, __pow_e, __pow_E, __digits);
+
+ // Get an optional sign
+ __in = __copy_sign(__in, __end, __buf, __xplus, __xminus);
+
+ // Get an optional string of digits.
+ if (__grouping.size() != 0)
+ __digits_before_dot = __copy_grouped_digits(__in, __end, __buf, __digits,
+ __sep, __grouping, __grouping_ok);
+ else
+ __digits_before_dot = __copy_digits(__in, __end, __buf, __digits);
+
+ // Get an optional decimal point, and an optional string of digits.
+ if (__in != __end && *__in == __dot) {
+ __buf.push_back('.');
+ ++__in;
+ __digits_after_dot = __copy_digits(__in, __end, __buf, __digits);
+ }
+
+ // There have to be some digits, somewhere.
+ __ok = __digits_before_dot || __digits_after_dot;
+
+ // Get an optional exponent.
+ if (__ok && __in != __end && (*__in == __pow_e || *__in == __pow_E)) {
+ __buf.push_back('e');
+ ++__in;
+ __in = __copy_sign(__in, __end, __buf, __xplus, __xminus);
+ __ok = __copy_digits(__in, __end, __buf, __digits);
+ // If we have an exponent then the sign
+ // is optional but the digits aren't.
+ }
+
+ return __ok;
+}
+
+//
+// num_get<>, num_put<>
+//
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template <class _CharT, class _InputIterator>
+locale::id num_get<_CharT, _InputIterator>::id;
+# else
+
+typedef num_get<char, const char*> num_get_char;
+typedef num_get<char, istreambuf_iterator<char, char_traits<char> > > num_get_char_2;
+
+__DECLARE_INSTANCE(locale::id, num_get_char::id, );
+__DECLARE_INSTANCE(locale::id, num_get_char_2::id, );
+
+# ifndef _STLP_NO_WCHAR_T
+
+typedef num_get<wchar_t, const wchar_t*> num_get_wchar_t;
+typedef num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > > num_get_wchar_t_2;
+
+__DECLARE_INSTANCE(locale::id, num_get_wchar_t::id, );
+__DECLARE_INSTANCE(locale::id, num_get_wchar_t_2::id, );
+
+# endif
+
+# endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+# ifndef _STLP_NO_BOOL
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end,
+ ios_base& __s,
+ ios_base::iostate& __err, bool& __x) const
+{
+ if (__s.flags() & ios_base::boolalpha) {
+ locale __loc = __s.getloc();
+ const _Numpunct& __np = *(const _Numpunct*)__s._M_numpunct_facet();
+ // const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc) ;
+// const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__loc) ;
+
+ const basic_string<_CharT> __truename = __np.truename();
+ const basic_string<_CharT> __falsename = __np.falsename();
+ bool __true_ok = true;
+ bool __false_ok = true;
+
+ size_t __n = 0;
+ for ( ; __in != __end; ++__in) {
+ _CharT __c = *__in;
+ __true_ok = __true_ok && (__c == __truename[__n]);
+ __false_ok = __false_ok && (__c == __falsename[__n]);
+ ++__n;
+
+ if ((!__true_ok && !__false_ok) ||
+ (__true_ok && __n >= __truename.size()) ||
+ (__false_ok && __n >= __falsename.size())) {
+ ++__in;
+ break;
+ }
+ }
+ if (__true_ok && __n < __truename.size()) __true_ok = false;
+ if (__false_ok && __n < __falsename.size()) __false_ok = false;
+
+ if (__true_ok || __false_ok) {
+ __err = ios_base::goodbit;
+ __x = __true_ok;
+ }
+ else
+ __err = ios_base::failbit;
+
+ if (__in == __end)
+ __err |= ios_base::eofbit;
+
+ return __in;
+ }
+
+ else {
+ long __lx;
+ _InputIter __tmp = this->do_get(__in, __end, __s, __err, __lx);
+ if (!(__err & ios_base::failbit)) {
+ if (__lx == 0)
+ __x = false;
+ else if (__lx == 1)
+ __x = true;
+ else
+ __err |= ios_base::failbit;
+ }
+ return __tmp;
+ }
+}
+
+# endif /* _STLP_NO_BOOL */
+
+# ifdef _STLP_FIX_LIBRARY_ISSUES
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, short& __val) const {
+ return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, int& __val) const {
+ return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+# endif
+
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, long& __val) const {
+ return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err,
+ unsigned short& __val) const {
+ return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err,
+ unsigned int& __val) const {
+ return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err,
+ unsigned long& __val) const {
+ return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err,
+ float& __val) const {
+ string __buf ;
+ bool __ok = _M_read_float(__buf, __in, __end, __str, (_CharT*)0 );
+ __string_to_float(__buf, __val);
+ __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit);
+ if (__in == __end)
+ __err |= ios_base::eofbit;
+ return __in;
+}
+
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err,
+ double& __val) const {
+ string __buf ;
+ bool __ok = _M_read_float(__buf, __in, __end, __str, (_CharT*)0 );
+ __string_to_float(__buf, __val);
+ __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit);
+ if (__in == __end)
+ __err |= ios_base::eofbit;
+ return __in;
+}
+
+#ifndef _STLP_NO_LONG_DOUBLE
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err,
+ long double& __val) const {
+ string __buf ;
+ bool __ok = _M_read_float(__buf, __in, __end, __str, (_CharT*)0 );
+ __string_to_float(__buf, __val);
+ __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit);
+ if (__in == __end)
+ __err |= ios_base::eofbit;
+ return __in;
+}
+#endif /* _STLP_NO_LONG_DOUBLE */
+
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err,
+ void*& __p) const {
+# if defined(_STLP_LONG_LONG)&&!defined(__MRC__) //*ty 12/07/2001 - MrCpp can not cast from long long to void*
+ unsigned _STLP_LONG_LONG __val;
+# else
+ unsigned long __val;
+# endif
+ iter_type __tmp = _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+ if (!(__err & ios_base::failbit))
+ __p = __REINTERPRET_CAST(void*,__val);
+ return __tmp;
+ }
+
+
+#ifdef _STLP_LONG_LONG
+
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err,
+ _STLP_LONG_LONG& __val) const {
+ return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err,
+ unsigned _STLP_LONG_LONG& __val) const {
+ return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+#endif /* _STLP_LONG_LONG */
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_EXPOSE_STREAM_IMPLEMENTATION */
+
+#endif /* _STLP_NUMERIC_FACETS_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_num_get.h b/src/STLport/stl/_num_get.h
new file mode 100644
index 0000000..b396d4a
--- /dev/null
+++ b/src/STLport/stl/_num_get.h
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_NUM_GET_H
+#define _STLP_INTERNAL_NUM_GET_H
+
+#ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
+# include <stl/_istreambuf_iterator.h>
+#endif
+
+# ifndef _STLP_C_LOCALE_H
+# include <stl/c_locale.h>
+# endif
+
+#ifndef _STLP_INTERNAL_NUMPUNCT_H
+# include <stl/_numpunct.h>
+#endif
+#ifndef _STLP_INTERNAL_CTYPE_H
+# include <stl/_ctype.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// num_get facets
+
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+template <class _CharT, class _InputIter>
+# else
+template <class _CharT, class _InputIter = istreambuf_iterator<_CharT> >
+# endif
+class num_get: public locale::facet
+{
+ friend class _Locale;
+public:
+ typedef _CharT char_type;
+ typedef _InputIter iter_type;
+
+ explicit num_get(size_t __refs = 0): locale::facet(__refs) {}
+
+# ifndef _STLP_NO_BOOL
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, bool& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+# endif
+
+# ifdef _STLP_FIX_LIBRARY_ISSUES
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, short& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, int& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+# endif
+
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, long& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, unsigned short& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, unsigned int& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, unsigned long& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+
+#ifdef _STLP_LONG_LONG
+
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, _STLP_LONG_LONG& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, unsigned _STLP_LONG_LONG& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+
+#endif /* _STLP_LONG_LONG */
+
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, float& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, double& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+
+# ifndef _STLP_NO_LONG_DOUBLE
+
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, long double& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+# endif
+
+ _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, void*& __val) const {
+ return do_get(__in, __end, __str, __err, __val);
+ }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+ ~num_get() {}
+
+ typedef string string_type;
+ typedef ctype<_CharT> _Ctype;
+ typedef numpunct<_CharT> _Numpunct;
+
+# ifndef _STLP_NO_BOOL
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end,
+ ios_base& __str, ios_base::iostate& __err, bool& __val) const;
+# endif
+
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, long& __val) const;
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, unsigned short& __val) const;
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, unsigned int& __val) const;
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, unsigned long& __val) const;
+# ifdef _STLP_FIX_LIBRARY_ISSUES
+ // issue 118 : those are actually not supposed to be here
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, short& __val) const;
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, int& __val) const;
+# endif
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, float& __val) const;
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, double& __val) const;
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err,
+ void*& __p) const;
+
+#ifndef _STLP_NO_LONG_DOUBLE
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, long double& __val) const;
+#endif /* _STLP_NO_LONG_DOUBLE */
+
+#ifdef _STLP_LONG_LONG
+
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, _STLP_LONG_LONG& __val) const;
+ virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+ ios_base::iostate& __err, unsigned _STLP_LONG_LONG& __val) const;
+#endif /* _STLP_LONG_LONG */
+
+};
+
+
+# ifdef _STLP_USE_TEMPLATE_EXPORT
+_STLP_EXPORT_TEMPLATE_CLASS num_get<char, istreambuf_iterator<char, char_traits<char> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS num_get<char, const char*>;
+# ifndef _STLP_NO_WCHAR_T
+_STLP_EXPORT_TEMPLATE_CLASS num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS num_get<wchar_t, const wchar_t*>;
+# endif /* _STLP_NO_WCHAR_T */
+# endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+extern bool _STLP_CALL __valid_grouping(const char*, const char*, const char*, const char*);
+
+template <class _InputIter, class _Integer>
+bool _STLP_CALL
+__get_decimal_integer(_InputIter& __first, _InputIter& __last, _Integer& __val);
+
+inline bool _STLP_CALL __get_fdigit(char& __c, const char*);
+inline bool _STLP_CALL __get_fdigit_or_sep(char& __c, char __sep, const char *);
+# ifndef _STLP_NO_WCHAR_T
+bool _STLP_CALL __get_fdigit(wchar_t&, const wchar_t*);
+bool _STLP_CALL __get_fdigit_or_sep(wchar_t&, wchar_t, const wchar_t*);
+# endif
+
+inline void _STLP_CALL
+_Initialize_get_float(const ctype<char>&,
+ char& Plus, char& Minus,
+ char& pow_e, char& pow_E,
+ char*)
+{
+ Plus = '+';
+ Minus = '-';
+ pow_e = 'e';
+ pow_E = 'E';
+}
+
+# ifndef _STLP_NO_WCHAR_T
+void _STLP_CALL _Initialize_get_float(const ctype<wchar_t>&,
+ wchar_t&, wchar_t&, wchar_t&, wchar_t&, wchar_t*);
+# endif
+void _STLP_CALL __string_to_float(const string&, float&);
+void _STLP_CALL __string_to_float(const string&, double&);
+# ifndef _STLP_NO_LONG_DOUBLE
+void _STLP_CALL __string_to_float(const string&, long double&);
+# endif
+# endif
+
+# if defined (__BORLANDC__) && defined (_RTLDLL)
+inline void _Stl_loc_init_num_get() {
+ num_get<char, istreambuf_iterator<char, char_traits<char> > >::id._M_index = 12;
+ num_get<char, const char*>::id._M_index = 13;
+
+# ifndef _STLP_NO_WCHAR_T
+ num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 31;
+ num_get<wchar_t, const wchar_t*>::id._M_index = 32;
+# endif
+}
+# endif
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && ! defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_num_get.c>
+# endif
+
+#endif /* _STLP_INTERNAL_NUM_GET_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_num_put.c b/src/STLport/stl/_num_put.c
new file mode 100644
index 0000000..2c191ea
--- /dev/null
+++ b/src/STLport/stl/_num_put.c
@@ -0,0 +1,553 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_NUM_PUT_C
+#define _STLP_NUM_PUT_C
+
+#ifndef _STLP_INTERNAL_NUM_PUT_H
+# include <stl/_num_put.h>
+#endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#ifndef _STLP_LIMITS_H
+# include <stl/_limits.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// _M_do_put_float and its helper functions. Strategy: write the output
+// to a buffer of char, transform the buffer to _CharT, and then copy
+// it to the output.
+
+template <class _CharT, class _OutputIter,class _Float>
+_OutputIter _STLP_CALL
+_M_do_put_float(_OutputIter __s, ios_base& __f, _CharT __fill,_Float __x);
+
+
+//----------------------------------------------------------------------
+// num_put facet
+
+template <class _CharT, class _OutputIter>
+_OutputIter _STLP_CALL
+__copy_float_and_fill(const _CharT* __first, const _CharT* __last,
+ _OutputIter __out,
+ ios_base::fmtflags __flags,
+ streamsize __width, _CharT __fill,
+ _CharT __xplus, _CharT __xminus) {
+ if (__width <= __last - __first)
+ return copy(__first, __last, __out);
+ else {
+ streamsize __pad = __width - (__last - __first);
+ ios_base::fmtflags __dir = __flags & ios_base::adjustfield;
+
+ if (__dir == ios_base::left) {
+ __out = copy(__first, __last, __out);
+ return fill_n(__out, __pad, __fill);
+ }
+ else if (__dir == ios_base::internal && __first != __last &&
+ (*__first == __xplus || *__first == __xminus)) {
+ *__out++ = *__first++;
+ __out = fill_n(__out, __pad, __fill);
+ return copy(__first, __last, __out);
+ }
+ else {
+ __out = fill_n(__out, __pad, __fill);
+ return copy(__first, __last, __out);
+ }
+ }
+}
+
+#ifndef _STLP_NO_WCHAR_T
+// Helper routine for wchar_t
+template <class _OutputIter>
+_OutputIter _STLP_CALL
+__put_float(char* __ibuf, char* __iend, _OutputIter __out,
+ ios_base& __f, wchar_t __fill,
+ wchar_t __decimal_point,
+ wchar_t __sep, const string& __grouping)
+{
+ const ctype<wchar_t>& __ct = *(ctype<wchar_t>*)__f._M_ctype_facet() ;
+
+ wchar_t __wbuf[128];
+ wchar_t* __eend = __convert_float_buffer(__ibuf, __iend, __wbuf,
+ __ct, __decimal_point);
+ if (!__grouping.empty()) {
+ // In order to do separator-insertion only to the left of the
+ // decimal point, we adjust the size of the first (right-most)
+ // group. We need to be careful if there is only one entry in
+ // grouping: in this case we need to duplicate the first entry.
+
+ string __new_grouping = __grouping;
+ wchar_t* __decimal_pos = find(__wbuf, __eend, __decimal_point);
+ if (__grouping.size() == 1)
+ __new_grouping.push_back(__grouping[0]);
+
+ // dwa 1/24/00 - try as I might, there doesn't seem to be a way
+ // to suppress the warning
+ __new_grouping[0] += __STATIC_CAST(char, __eend - __decimal_pos);
+ ptrdiff_t __len = __insert_grouping(__wbuf, __eend, __new_grouping,
+ __sep,
+ __ct.widen('+'), __ct.widen('-'),
+ 0);
+ __eend = __wbuf + __len;
+ }
+
+ return __copy_float_and_fill(__wbuf, __eend, __out,
+ __f.flags(), __f.width(0), __fill,
+ __ct.widen('+'), __ct.widen('-'));
+}
+# endif /* WCHAR_T */
+
+// Helper routine for char
+template <class _OutputIter>
+_OutputIter _STLP_CALL
+__put_float(char* __ibuf, char* __iend, _OutputIter __out,
+ ios_base& __f, char __fill,
+ char __decimal_point,
+ char __sep, const string& __grouping)
+{
+ __adjust_float_buffer(__ibuf, __iend, __decimal_point);
+ if (!__grouping.empty()) {
+ string __new_grouping = __grouping;
+ const char * __decimal_pos = find(__ibuf, __iend, __decimal_point);
+ if (__grouping.size() == 1)
+ __new_grouping.push_back(__grouping[0]);
+ __new_grouping[0] += __STATIC_CAST(char, (__iend - __decimal_pos));
+ ptrdiff_t __len = __insert_grouping(__ibuf, __iend, __new_grouping,
+ __sep, '+', '-', 0);
+ __iend = __ibuf + __len;
+ }
+
+ return __copy_float_and_fill(__ibuf, __iend, __out,
+ __f.flags(), __f.width(0), __fill, '+', '-');
+}
+
+template <class _CharT, class _OutputIter, class _Float>
+_OutputIter _STLP_CALL
+_M_do_put_float(_OutputIter __s, ios_base& __f,
+ _CharT __fill, _Float __x)
+{
+ string __buf;
+ __buf.reserve(128);
+ __write_float(__buf, __f.flags(), (int)__f.precision(), __x);
+
+ const numpunct<_CharT>& __np = *(const numpunct<_CharT>*)__f._M_numpunct_facet();
+
+ return __put_float(__CONST_CAST(char*, __buf.c_str()),
+ __CONST_CAST(char*, __buf.c_str()) + __buf.size(),
+ __s, __f, __fill,
+ __np.decimal_point(),
+ __np.thousands_sep(), __f._M_grouping());
+}
+
+// _M_do_put_integer and its helper functions.
+
+template <class _CharT, class _OutputIter>
+_OutputIter _STLP_CALL
+__copy_integer_and_fill(const _CharT* __buf, ptrdiff_t __len,
+ _OutputIter __out,
+ ios_base::fmtflags __flg, streamsize __wid, _CharT __fill,
+ _CharT __xplus, _CharT __xminus)
+{
+ if (__len >= __wid)
+ return copy(__buf, __buf + __len, __out);
+ else {
+ ptrdiff_t __pad = __wid - __len;
+ ios_base::fmtflags __dir = __flg & ios_base::adjustfield;
+
+ if (__dir == ios_base::left) {
+ __out = copy(__buf, __buf + __len, __out);
+ return fill_n(__out, __pad, __fill);
+ }
+ else if (__dir == ios_base::internal && __len != 0 &&
+ (__buf[0] == __xplus || __buf[0] == __xminus)) {
+ *__out++ = __buf[0];
+ __out = fill_n(__out, __pad, __fill);
+ return copy(__buf + 1, __buf + __len, __out);
+ }
+ else if (__dir == ios_base::internal && __len >= 2 &&
+ (__flg & ios_base::showbase) &&
+ (__flg & ios_base::basefield) == ios_base::hex) {
+ *__out++ = __buf[0];
+ *__out++ = __buf[1];
+ __out = fill_n(__out, __pad, __fill);
+ return copy(__buf + 2, __buf + __len, __out);
+ }
+ else {
+ __out = fill_n(__out, __pad, __fill);
+ return copy(__buf, __buf + __len, __out);
+ }
+ }
+}
+
+#ifndef _STLP_NO_WCHAR_T
+// Helper function for wchar_t
+template <class _OutputIter>
+_OutputIter _STLP_CALL
+__put_integer(char* __buf, char* __iend, _OutputIter __s,
+ ios_base& __f,
+ ios_base::fmtflags __flags, wchar_t __fill)
+{
+ locale __loc = __f.getloc();
+ // const ctype<wchar_t>& __ct = use_facet<ctype<wchar_t> >(__loc);
+ const ctype<wchar_t>& __ct = *(const ctype<wchar_t>*)__f._M_ctype_facet();
+
+ wchar_t __xplus = __ct.widen('+');
+ wchar_t __xminus = __ct.widen('-');
+
+ wchar_t __wbuf[64];
+ __ct.widen(__buf, __iend, __wbuf);
+ ptrdiff_t __len = __iend - __buf;
+ wchar_t* __eend = __wbuf + __len;
+
+ // const numpunct<wchar_t>& __np = use_facet<numpunct<wchar_t> >(__loc);
+ // const string& __grouping = __np.grouping();
+
+ const numpunct<wchar_t>& __np = *(const numpunct<wchar_t>*)__f._M_numpunct_facet();
+ const string& __grouping = __f._M_grouping();
+
+ if (!__grouping.empty()) {
+ int __basechars;
+ if (__flags & ios_base::showbase)
+ switch (__flags & ios_base::basefield) {
+ case ios_base::hex: __basechars = 2; break;
+ case ios_base::oct: __basechars = 1; break;
+ default: __basechars = 0;
+ }
+ else
+ __basechars = 0;
+
+ __len = __insert_grouping(__wbuf, __eend, __grouping, __np.thousands_sep(),
+ __xplus, __xminus, __basechars);
+ }
+
+ return __copy_integer_and_fill((wchar_t*)__wbuf, __len, __s,
+ __flags, __f.width(0), __fill, __xplus, __xminus);
+}
+#endif
+
+// Helper function for char
+template <class _OutputIter>
+_OutputIter _STLP_CALL
+__put_integer(char* __buf, char* __iend, _OutputIter __s,
+ ios_base& __f, ios_base::fmtflags __flags, char __fill)
+{
+ ptrdiff_t __len = __iend - __buf;
+ char __grpbuf[64];
+
+ // const numpunct<char>& __np = use_facet<numpunct<char> >(__f.getloc());
+ // const string& __grouping = __np.grouping();
+
+ const numpunct<char>& __np = *(const numpunct<char>*)__f._M_numpunct_facet();
+ const string& __grouping = __f._M_grouping();
+
+ if (!__grouping.empty()) {
+ int __basechars;
+ if (__flags & ios_base::showbase)
+ switch (__flags & ios_base::basefield) {
+ case ios_base::hex: __basechars = 2; break;
+ case ios_base::oct: __basechars = 1; break;
+ default: __basechars = 0;
+ }
+ else
+ __basechars = 0;
+
+ // make sure there is room at the end of the buffer
+ // we pass to __insert_grouping
+
+ copy(__buf, __iend, (char *) __grpbuf);
+ __buf = __grpbuf;
+ __iend = __grpbuf + __len;
+ __len = __insert_grouping(__buf, __iend, __grouping, __np.thousands_sep(),
+ '+', '-', __basechars);
+ }
+
+ return __copy_integer_and_fill(__buf, __len, __s, __flags, __f.width(0), __fill, '+', '-');
+}
+
+#ifdef _STLP_LONG_LONG
+typedef _STLP_LONG_LONG __max_int_t;
+typedef unsigned _STLP_LONG_LONG __umax_int_t;
+#else
+typedef long __max_int_t;
+typedef unsigned long __umax_int_t;
+#endif
+
+extern const char __hex_char_table_lo[];
+extern const char __hex_char_table_hi[];
+
+template <class _Integer>
+inline char* _STLP_CALL
+__write_decimal_backward(char* __ptr, _Integer __x, ios_base::fmtflags __flags, const __true_type& /* is_signed */)
+{
+ const bool __negative = __x < 0 ;
+ __max_int_t __temp = __x;
+ __umax_int_t __utemp = __negative?-__temp:__temp;
+
+ for (; __utemp != 0; __utemp /= 10)
+ *--__ptr = (int)(__utemp % 10) + '0';
+ // put sign if needed or requested
+ if (__negative)
+ *--__ptr = '-';
+ else if (__flags & ios_base::showpos)
+ *--__ptr = '+';
+ return __ptr;
+}
+
+template <class _Integer>
+inline char* _STLP_CALL
+__write_decimal_backward(char* __ptr, _Integer __x, ios_base::fmtflags __flags, const __false_type& /* is_signed */)
+{
+ for (; __x != 0; __x /= 10)
+ *--__ptr = (int)(__x % 10) + '0';
+ // put sign if requested
+ if (__flags & ios_base::showpos)
+ *--__ptr = '+';
+ return __ptr;
+}
+
+template <class _Integer>
+char* _STLP_CALL
+__write_integer_backward(char* __buf, ios_base::fmtflags __flags, _Integer __x)
+{
+ char* __ptr = __buf;
+ __umax_int_t __temp;
+
+ if (__x == 0) {
+ *--__ptr = '0';
+ if ((__flags & ios_base::showpos) && ( (__flags & (ios_base::hex | ios_base::oct)) == 0 ))
+ *--__ptr = '+';
+ }
+ else {
+
+ switch (__flags & ios_base::basefield) {
+ case ios_base::oct:
+ __temp = __x;
+ // if the size of integer is less than 8, clear upper part
+ if ( sizeof(__x) < 8 && sizeof(__umax_int_t) >= 8 )
+ __temp &= 0xFFFFFFFF;
+
+ for (; __temp != 0; __temp >>=3)
+ *--__ptr = (((unsigned)__temp)& 0x7) + '0';
+
+ // put leading '0' is showbase is set
+ if (__flags & ios_base::showbase)
+ *--__ptr = '0';
+ break;
+ case ios_base::hex:
+ {
+ const char* __table_ptr = (__flags & ios_base::uppercase) ?
+ __hex_char_table_hi : __hex_char_table_lo;
+ __temp = __x;
+ // if the size of integer is less than 8, clear upper part
+ if ( sizeof(__x) < 8 && sizeof(__umax_int_t) >= 8 )
+ __temp &= 0xFFFFFFFF;
+
+ for (; __temp != 0; __temp >>=4)
+ *--__ptr = __table_ptr[((unsigned)__temp & 0xF)];
+
+ if (__flags & ios_base::showbase) {
+ *--__ptr = __table_ptr[16];
+ *--__ptr = '0';
+ }
+ }
+ break;
+ default:
+ {
+#if defined(__HP_aCC) && (__HP_aCC == 1)
+ bool _IsSigned = !((_Integer)-1 > 0);
+ if (_IsSigned)
+ __ptr = __write_decimal_backward(__ptr, __x, __flags, __true_type() );
+ else
+ __ptr = __write_decimal_backward(__ptr, __x, __flags, __false_type() );
+#else
+ typedef typename __bool2type<numeric_limits<_Integer>::is_signed>::_Ret _IsSigned;
+ __ptr = __write_decimal_backward(__ptr, __x, __flags, _IsSigned());
+# endif
+ }
+ break;
+ }
+ }
+ // return pointer to beginning of the string
+ return __ptr;
+}
+
+//
+// num_put<>
+//
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+
+template <class _CharT, class _OutputIterator>
+locale::id num_put<_CharT, _OutputIterator>::id;
+# else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+typedef num_put<char, const char*> num_put_char;
+typedef num_put<char, char*> num_put_char_2;
+typedef num_put<char, ostreambuf_iterator<char, char_traits<char> > > num_put_char_3;
+
+__DECLARE_INSTANCE(locale::id, num_put_char::id, );
+__DECLARE_INSTANCE(locale::id, num_put_char_2::id, );
+__DECLARE_INSTANCE(locale::id, num_put_char_3::id, );
+
+# ifndef _STLP_NO_WCHAR_T
+
+typedef num_put<wchar_t, const wchar_t*> num_put_wchar_t;
+typedef num_put<wchar_t, wchar_t*> num_put_wchar_t_2;
+typedef num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > num_put_wchar_t_3;
+
+__DECLARE_INSTANCE(locale::id, num_put_wchar_t::id, );
+__DECLARE_INSTANCE(locale::id, num_put_wchar_t_2::id, );
+__DECLARE_INSTANCE(locale::id, num_put_wchar_t_3::id, );
+
+# endif
+
+# endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+// issue 118
+
+# ifndef _STLP_NO_BOOL
+
+template <class _CharT, class _OutputIter>
+_OutputIter
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f,
+ char_type __fill, bool __val) const {
+ if (!(__f.flags() & ios_base::boolalpha))
+ return this->do_put(__s, __f, __fill, __STATIC_CAST(long,__val));
+
+ locale __loc = __f.getloc();
+ // typedef numpunct<_CharT> _Punct;
+ // const _Punct& __np = use_facet<_Punct>(__loc);
+
+ const numpunct<_CharT>& __np = *(const numpunct<_CharT>*)__f._M_numpunct_facet();
+
+ basic_string<_CharT> __str = __val ? __np.truename() : __np.falsename();
+
+ // Reuse __copy_integer_and_fill. Since internal padding makes no
+ // sense for bool, though, make sure we use something else instead.
+ // The last two argument to __copy_integer_and_fill are dummies.
+ ios_base::fmtflags __flags = __f.flags();
+ if ((__flags & ios_base::adjustfield) == ios_base::internal)
+ __flags = (__flags & ~ios_base::adjustfield) | ios_base::right;
+
+ return __copy_integer_and_fill(__str.c_str(), __str.size(), __s,
+ __flags, __f.width(0), __fill,
+ (_CharT) 0, (_CharT) 0);
+}
+
+# endif
+
+template <class _CharT, class _OutputIter>
+_OutputIter
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+ long __val) const {
+
+ char __buf[64]; // Large enough for a base 8 64-bit integer,
+ // plus any necessary grouping.
+ ios_base::fmtflags __flags = __f.flags();
+ char* __ibeg = __write_integer_backward((char*)__buf+64, __flags, __val);
+ return __put_integer(__ibeg, (char*)__buf+64, __s, __f, __flags, __fill);
+}
+
+
+template <class _CharT, class _OutputIter>
+_OutputIter
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+ unsigned long __val) const {
+ char __buf[64]; // Large enough for a base 8 64-bit integer,
+ // plus any necessary grouping.
+
+ ios_base::fmtflags __flags = __f.flags();
+ char* __ibeg = __write_integer_backward((char*)__buf+64, __flags, __val);
+ return __put_integer(__ibeg, (char*)__buf+64, __s, __f, __flags, __fill);
+}
+
+template <class _CharT, class _OutputIter>
+_OutputIter
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+ double __val) const {
+ return _M_do_put_float(__s, __f, __fill, __val);
+}
+
+#ifndef _STLP_NO_LONG_DOUBLE
+template <class _CharT, class _OutputIter>
+_OutputIter
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+ long double __val) const {
+ return _M_do_put_float(__s, __f, __fill, __val);
+}
+#endif
+
+#ifdef _STLP_LONG_LONG
+template <class _CharT, class _OutputIter>
+_OutputIter
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+ _STLP_LONG_LONG __val) const {
+ char __buf[64]; // Large enough for a base 8 64-bit integer,
+ // plus any necessary grouping.
+
+ ios_base::fmtflags __flags = __f.flags();
+ char* __ibeg = __write_integer_backward((char*)__buf+64, __flags, __val);
+ return __put_integer(__ibeg, (char*)__buf+64, __s, __f, __flags, __fill);
+}
+
+template <class _CharT, class _OutputIter>
+_OutputIter
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+ unsigned _STLP_LONG_LONG __val) const {
+ char __buf[64]; // Large enough for a base 8 64-bit integer,
+ // plus any necessary grouping.
+
+ ios_base::fmtflags __flags = __f.flags();
+ char* __ibeg = __write_integer_backward((char*)__buf+64, __flags, __val);
+ return __put_integer(__ibeg, (char*)__buf+64, __s, __f, __flags, __fill);
+}
+
+#endif /* _STLP_LONG_LONG */
+
+
+// lib.facet.num.put.virtuals "12 For conversion from void* the specifier is %p."
+template <class _CharT, class _OutputIter>
+_OutputIter
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT /*__fill*/,
+ const void* __val) const {
+ const ctype<_CharT>& __c_type = *(const ctype<_CharT>*)__f._M_ctype_facet();
+ ios_base::fmtflags __save_flags = __f.flags();
+
+ __f.setf(ios_base::hex, ios_base::basefield);
+ __f.setf(ios_base::showbase);
+ __f.setf(ios_base::internal, ios_base::adjustfield);
+ __f.width((sizeof(void*) * 2) + 2); // digits in pointer type plus '0x' prefix
+# if defined(_STLP_LONG_LONG) && !defined(__MRC__) //*ty 11/24/2001 - MrCpp can not cast from void* to long long
+ _OutputIter result = this->do_put(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned _STLP_LONG_LONG,__val));
+# else
+ _OutputIter result = this->do_put(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned long,__val));
+# endif
+ __f.flags(__save_flags);
+ return result;
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_EXPOSE_STREAM_IMPLEMENTATION */
+
+#endif /* _STLP_NUM_PUT_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_num_put.h b/src/STLport/stl/_num_put.h
new file mode 100644
index 0000000..8fccfaf
--- /dev/null
+++ b/src/STLport/stl/_num_put.h
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_NUM_PUT_H
+#define _STLP_INTERNAL_NUM_PUT_H
+
+#ifndef _STLP_INTERNAL_NUMPUNCT_H
+# include <stl/_numpunct.h>
+#endif
+#ifndef _STLP_INTERNAL_CTYPE_H
+# include <stl/_ctype.h>
+#endif
+#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
+# include <stl/_ostreambuf_iterator.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// num_put facet
+
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+template <class _CharT, class _OutputIter>
+# else
+template <class _CharT, class _OutputIter = ostreambuf_iterator<_CharT, char_traits<_CharT> > >
+# endif
+class num_put: public locale::facet
+{
+ friend class _Locale;
+public:
+ typedef _CharT char_type;
+ typedef _OutputIter iter_type;
+
+ explicit num_put(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+# ifndef _STLP_NO_BOOL
+ iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+ bool __val) const {
+ return do_put(__s, __f, __fill, __val);
+ }
+# endif
+ iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+ long __val) const {
+ return do_put(__s, __f, __fill, __val);
+ }
+
+ iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+ unsigned long __val) const {
+ return do_put(__s, __f, __fill, __val);
+ }
+
+#ifdef _STLP_LONG_LONG
+ iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+ _STLP_LONG_LONG __val) const {
+ return do_put(__s, __f, __fill, __val);
+ }
+
+ iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+ unsigned _STLP_LONG_LONG __val) const {
+ return do_put(__s, __f, __fill, __val);
+ }
+#endif
+
+ iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+ double __val) const {
+ return do_put(__s, __f, __fill, (double)__val);
+ }
+
+#ifndef _STLP_NO_LONG_DOUBLE
+ iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+ long double __val) const {
+ return do_put(__s, __f, __fill, __val);
+ }
+# endif
+
+ iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+ const void * __val) const {
+ return do_put(__s, __f, __fill, __val);
+ }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+ ~num_put() {}
+# ifndef _STLP_NO_BOOL
+ virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, bool __val) const;
+# endif
+ virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, long __val) const;
+ virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, unsigned long __val) const;
+ virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, double __val) const;
+#ifndef _STLP_NO_LONG_DOUBLE
+ virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, long double __val) const;
+#endif
+
+#ifdef _STLP_LONG_LONG
+ virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, _STLP_LONG_LONG __val) const;
+ virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+ unsigned _STLP_LONG_LONG __val) const ;
+#endif /* _STLP_LONG_LONG */
+ virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, const void* __val) const;
+};
+
+# ifdef _STLP_USE_TEMPLATE_EXPORT
+_STLP_EXPORT_TEMPLATE_CLASS num_put<char, ostreambuf_iterator<char, char_traits<char> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS num_put<char, char*>;
+# ifndef _STLP_NO_WCHAR_T
+_STLP_EXPORT_TEMPLATE_CLASS num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS num_put<wchar_t, wchar_t*>;
+# endif /* _STLP_NO_WCHAR_T */
+# endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+template <class _Integer>
+char* _STLP_CALL
+__write_integer_backward(char* __buf, ios_base::fmtflags __flags, _Integer __x);
+
+void _STLP_CALL __string_to_float(const string&, float&);
+void _STLP_CALL __string_to_float(const string&, double&);
+extern void _STLP_CALL __write_float(string&, ios_base::fmtflags, int, double);
+# ifndef _STLP_NO_LONG_DOUBLE
+void _STLP_CALL __string_to_float(const string&, long double&);
+extern void _STLP_CALL __write_float(string&, ios_base::fmtflags, int, long double);
+# endif
+
+#ifndef _STLP_NO_WCHAR_T
+extern wchar_t* _STLP_CALL __convert_float_buffer(const char*, const char*, wchar_t*, const ctype<wchar_t>&, wchar_t);
+#endif
+extern void _STLP_CALL __adjust_float_buffer(char*, char*, char);
+
+extern char* _STLP_CALL
+__write_integer(char* buf, ios_base::fmtflags flags, long x);
+
+extern ptrdiff_t _STLP_CALL __insert_grouping(char* first, char* last, const string&, char, char, char, int);
+# ifndef _STLP_NO_WCHAR_T
+extern ptrdiff_t _STLP_CALL __insert_grouping(wchar_t*, wchar_t*, const string&, wchar_t, wchar_t, wchar_t, int);
+# endif
+
+# endif
+
+# if defined (__BORLANDC__) && defined (_RTLDLL)
+inline void _Stl_loc_init_num_put() {
+
+ num_put<char, ostreambuf_iterator<char, char_traits<char> > >::id._M_index = 14;
+ num_put<char, char*>::id._M_index = 15;
+
+# ifndef _STLP_NO_WCHAR_T
+ num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > ::id._M_index = 33;
+ num_put<wchar_t, wchar_t*>::id._M_index = 34;
+# endif
+
+}
+
+# endif
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && ! defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_num_put.c>
+# endif
+
+#endif /* _STLP_INTERNAL_NUMERIC_FACETS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_numeric.c b/src/STLport/stl/_numeric.c
new file mode 100644
index 0000000..f050112
--- /dev/null
+++ b/src/STLport/stl/_numeric.c
@@ -0,0 +1,104 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_NUMERIC_C
+#define _STLP_NUMERIC_C
+
+#ifndef _STLP_INTERNAL_NUMERIC_H
+# include <stl/_numeric.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _InputIterator, class _OutputIterator, class _Tp,
+ class _BinaryOperation>
+_OutputIterator
+__partial_sum(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _Tp*, _BinaryOperation __binary_op)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last) return __result;
+ *__result = *__first;
+
+ _Tp __val = *__first;
+ while (++__first != __last) {
+ __val = __binary_op(__val, *__first);
+ *++__result = __val;
+ }
+ return ++__result;
+}
+
+template <class _InputIterator, class _OutputIterator, class _Tp,
+ class _BinaryOperation>
+_OutputIterator
+__adjacent_difference(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _Tp*,
+ _BinaryOperation __binary_op) {
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ if (__first == __last) return __result;
+ *__result = *__first;
+ _Tp __val = *__first;
+ while (++__first != __last) {
+ _Tp __tmp = *__first;
+ *++__result = __binary_op(__tmp, __val);
+ __val = __tmp;
+ }
+ return ++__result;
+}
+
+
+template <class _Tp, class _Integer, class _MonoidOperation>
+_Tp __power(_Tp __x, _Integer __n, _MonoidOperation __opr)
+{
+ _STLP_MPWFIX_TRY
+ if (__n == 0)
+ return __identity_element(__opr);
+ else {
+ while ((__n & 1) == 0) {
+ __n >>= 1;
+ __x = __opr(__x, __x);
+ }
+ _Tp __result = __x;
+ _STLP_MPWFIX_TRY
+ __n >>= 1;
+ while (__n != 0) {
+ __x = __opr(__x, __x);
+ if ((__n & 1) != 0)
+ __result = __opr(__result, __x);
+ __n >>= 1;
+ }
+ return __result;
+ _STLP_MPWFIX_CATCH
+ }
+ _STLP_MPWFIX_CATCH_ACTION(__x = _Tp())
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_NUMERIC_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_numeric.h b/src/STLport/stl/_numeric.h
new file mode 100644
index 0000000..d58ac16
--- /dev/null
+++ b/src/STLport/stl/_numeric.h
@@ -0,0 +1,186 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+
+#ifndef _STLP_INTERNAL_NUMERIC_H
+#define _STLP_INTERNAL_NUMERIC_H
+
+#ifndef _STLP_INTERNAL_FUNCTION_H
+# include <stl/_function_base.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _InputIterator, class _Tp>
+_STLP_INLINE_LOOP
+_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp _Init)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first)
+ _Init = _Init + *__first;
+ return _Init;
+}
+
+template <class _InputIterator, class _Tp, class _BinaryOperation>
+_STLP_INLINE_LOOP
+_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp _Init,
+ _BinaryOperation __binary_op)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ for ( ; __first != __last; ++__first)
+ _Init = __binary_op(_Init, *__first);
+ return _Init;
+}
+
+template <class _InputIterator1, class _InputIterator2, class _Tp>
+_STLP_INLINE_LOOP
+_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _Tp _Init)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ for ( ; __first1 != __last1; ++__first1, ++__first2)
+ _Init = _Init + (*__first1 * *__first2);
+ return _Init;
+}
+
+template <class _InputIterator1, class _InputIterator2, class _Tp,
+ class _BinaryOperation1, class _BinaryOperation2>
+_STLP_INLINE_LOOP
+_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _Tp _Init,
+ _BinaryOperation1 __binary_op1,
+ _BinaryOperation2 __binary_op2)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+ for ( ; __first1 != __last1; ++__first1, ++__first2)
+ _Init = __binary_op1(_Init, __binary_op2(*__first1, *__first2));
+ return _Init;
+}
+
+template <class _InputIterator, class _OutputIterator, class _Tp,
+ class _BinaryOperation>
+_OutputIterator
+__partial_sum(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _Tp*, _BinaryOperation __binary_op);
+
+
+template <class _InputIterator, class _OutputIterator>
+inline _OutputIterator
+partial_sum(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result) {
+ return __partial_sum(__first, __last, __result, _STLP_VALUE_TYPE(__first, _InputIterator),
+ __plus(_STLP_VALUE_TYPE(__first, _InputIterator)));
+}
+
+template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
+inline _OutputIterator
+partial_sum(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _BinaryOperation __binary_op) {
+ return __partial_sum(__first, __last, __result, _STLP_VALUE_TYPE(__first, _InputIterator),
+ __binary_op);
+}
+
+
+template <class _InputIterator, class _OutputIterator, class _Tp,
+ class _BinaryOperation>
+_OutputIterator
+__adjacent_difference(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _Tp*,
+ _BinaryOperation __binary_op);
+
+template <class _InputIterator, class _OutputIterator>
+inline _OutputIterator
+adjacent_difference(_InputIterator __first,
+ _InputIterator __last, _OutputIterator __result) {
+ return __adjacent_difference(__first, __last, __result,
+ _STLP_VALUE_TYPE(__first, _InputIterator),
+ __minus(_STLP_VALUE_TYPE(__first, _InputIterator)));
+}
+
+template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
+_OutputIterator
+adjacent_difference(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _BinaryOperation __binary_op) {
+ return __adjacent_difference(__first, __last, __result,
+ _STLP_VALUE_TYPE(__first, _InputIterator),
+ __binary_op);
+}
+
+template <class _Tp, class _Integer, class _MonoidOperation>
+_Tp __power(_Tp __x, _Integer __n, _MonoidOperation __opr);
+
+# ifndef _STLP_NO_EXTENSIONS
+
+// Returns __x ** __n, where __n >= 0. _Note that "multiplication"
+// is required to be associative, but not necessarily commutative.
+
+template <class _Tp, class _Integer>
+inline _Tp __power(_Tp __x, _Integer __n)
+{
+ return __power(__x, __n, multiplies<_Tp>());
+}
+
+// Alias for the internal name __power. Note that power is an extension,
+// not part of the C++ standard.
+template <class _Tp, class _Integer, class _MonoidOperation>
+inline _Tp power(_Tp __x, _Integer __n, _MonoidOperation __opr) {
+ return __power(__x, __n, __opr);
+}
+
+
+template <class _Tp, class _Integer>
+inline _Tp power(_Tp __x, _Integer __n) {
+ return __power(__x, __n, multiplies<_Tp>());
+}
+
+// iota is not part of the C++ standard. It is an extension.
+
+template <class _ForwardIterator, class _Tp>
+_STLP_INLINE_LOOP
+void
+iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __val)
+{
+ _STLP_DEBUG_CHECK(__check_range(__first, __last))
+ while (__first != __last)
+ *__first++ = __val++;
+}
+# endif
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_numeric.c>
+# endif
+
+#endif /* _STLP_INTERNAL_NUMERIC_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_numpunct.h b/src/STLport/stl/_numpunct.h
new file mode 100644
index 0000000..7f8ed50
--- /dev/null
+++ b/src/STLport/stl/_numpunct.h
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_NUMPUNCT_H
+#define _STLP_INTERNAL_NUMPUNCT_H
+
+#ifndef _STLP_IOS_BASE_H
+# include <stl/_ios_base.h>
+#endif
+
+# ifndef _STLP_C_LOCALE_H
+# include <stl/c_locale.h>
+# endif
+
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// numpunct facets
+
+template <class _CharT> class numpunct {};
+template <class _CharT> class numpunct_byname {};
+template <class _Ch, class _InIt> class num_get;
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC numpunct<char> : public locale::facet
+{
+ friend class _Locale;
+# ifndef _STLP_NO_FRIEND_TEMPLATES
+ template <class _Ch, class _InIt> friend class num_get;
+# endif
+public:
+ typedef char char_type;
+ typedef string string_type;
+
+ explicit numpunct(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+ char decimal_point() const { return do_decimal_point(); }
+ char thousands_sep() const { return do_thousands_sep(); }
+ string grouping() const { return do_grouping(); }
+ string truename() const { return do_truename(); }
+ string falsename() const { return do_falsename(); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+# ifndef _STLP_NO_FRIEND_TEMPLATES
+protected:
+# endif
+ ~numpunct();
+
+ _STLP_STATIC_MEMBER_DECLSPEC static string _M_truename;
+ _STLP_STATIC_MEMBER_DECLSPEC static string _M_falsename;
+ _STLP_STATIC_MEMBER_DECLSPEC static string _M_grouping;
+
+ virtual char do_decimal_point() const;
+ virtual char do_thousands_sep() const;
+ virtual string do_grouping() const;
+ virtual string do_truename() const;
+ virtual string do_falsename() const;
+};
+
+# if ! defined (_STLP_NO_WCHAR_T)
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC numpunct<wchar_t> : public locale::facet
+{
+ friend class _Locale;
+public:
+ typedef wchar_t char_type;
+ typedef wstring string_type;
+
+ explicit numpunct(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+ wchar_t decimal_point() const { return do_decimal_point(); }
+ wchar_t thousands_sep() const { return do_thousands_sep(); }
+ string grouping() const { return do_grouping(); }
+ wstring truename() const { return do_truename(); }
+ wstring falsename() const { return do_falsename(); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+ _STLP_STATIC_MEMBER_DECLSPEC static wstring _M_truename;
+ _STLP_STATIC_MEMBER_DECLSPEC static wstring _M_falsename;
+ _STLP_STATIC_MEMBER_DECLSPEC static string _M_grouping;
+
+ ~numpunct();
+
+ virtual wchar_t do_decimal_point() const;
+ virtual wchar_t do_thousands_sep() const;
+ virtual string do_grouping() const;
+ virtual wstring do_truename() const;
+ virtual wstring do_falsename() const;
+};
+
+# endif /* WCHAR_T */
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC numpunct_byname<char> : public numpunct<char> {
+public:
+ typedef char char_type;
+ typedef string string_type;
+
+ explicit numpunct_byname(const char* __name, size_t __refs = 0);
+
+protected:
+
+ ~numpunct_byname();
+
+ virtual char do_decimal_point() const;
+ virtual char do_thousands_sep() const;
+ virtual string do_grouping() const;
+
+private:
+ _Locale_numeric* _M_numeric;
+};
+
+# ifndef _STLP_NO_WCHAR_T
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC numpunct_byname<wchar_t>: public numpunct<wchar_t> {
+public:
+ typedef wchar_t char_type;
+ typedef wstring string_type;
+
+ explicit numpunct_byname(const char* __name, size_t __refs = 0);
+
+protected:
+
+ ~numpunct_byname();
+
+ virtual wchar_t do_decimal_point() const;
+ virtual wchar_t do_thousands_sep() const;
+ virtual string do_grouping() const;
+
+private:
+ _Locale_numeric* _M_numeric;
+};
+
+# endif /* WCHAR_T */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_NUMPUNCT_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_ostream.c b/src/STLport/stl/_ostream.c
new file mode 100644
index 0000000..da75a0b
--- /dev/null
+++ b/src/STLport/stl/_ostream.c
@@ -0,0 +1,382 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_OSTREAM_C
+#define _STLP_OSTREAM_C
+
+
+#ifndef _STLP_INTERNAL_OSTREAM_H
+# include <stl/_ostream.h>
+#endif
+
+#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#if !defined (_STLP_INTERNAL_NUM_PUT_H)
+# include <stl/_num_put.h> // For basic_streambuf and iterators
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// Helper functions for istream<>::sentry constructor.
+template <class _CharT, class _Traits>
+bool
+_M_init(basic_ostream<_CharT, _Traits>& __str) {
+ if (__str.good()) {
+ // boris : check if this is needed !
+ if (!__str.rdbuf())
+ __str.setstate(ios_base::badbit);
+ if (__str.tie())
+ __str.tie()->flush();
+ return __str.good();
+ } else
+ return false;
+}
+
+//----------------------------------------------------------------------
+// Definitions of non-inline member functions.
+
+// Constructor, destructor
+
+template <class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>
+ ::basic_ostream(basic_streambuf<_CharT, _Traits>* __buf)
+ : basic_ios<_CharT, _Traits>()
+{
+ this->init(__buf);
+}
+
+template <class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>::~basic_ostream()
+{}
+
+// Output directly from a streambuf.
+template <class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>&
+basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<_CharT, _Traits>* __from)
+{
+ sentry __sentry(*this);
+ if (__sentry) {
+ if (__from) {
+ bool __any_inserted = __from->gptr() != __from->egptr()
+ ? this->_M_copy_buffered(__from, this->rdbuf())
+ : this->_M_copy_unbuffered(__from, this->rdbuf());
+ if (!__any_inserted)
+ this->setstate(ios_base::failbit);
+ }
+ else
+ this->setstate(ios_base::badbit);
+ }
+
+ return *this;
+}
+
+// Helper functions for the streambuf version of operator<<. The
+// exception-handling code is complicated because exceptions thrown
+// while extracting characters are treated differently than exceptions
+// thrown while inserting characters.
+
+template <class _CharT, class _Traits>
+bool basic_ostream<_CharT, _Traits>
+ ::_M_copy_buffered(basic_streambuf<_CharT, _Traits>* __from,
+ basic_streambuf<_CharT, _Traits>* __to)
+{
+ bool __any_inserted = false;
+
+ while (__from->egptr() != __from->gptr()) {
+ const ptrdiff_t __avail = __from->egptr() - __from->gptr();
+
+ streamsize __nwritten;
+ _STLP_TRY {
+ __nwritten = __to->sputn(__from->gptr(), __avail);
+ __from->gbump((int)__nwritten);
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ return __any_inserted;
+ }
+
+ if (__nwritten == __avail) {
+ _STLP_TRY {
+ if (this->_S_eof(__from->sgetc()))
+ return true;
+ else
+ __any_inserted = true;
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::failbit);
+ return false;
+ }
+ }
+
+ else if (__nwritten != 0)
+ return true;
+
+ else
+ return __any_inserted;
+ }
+
+ // No characters are in the buffer, but we aren't at EOF. Switch to
+ // unbuffered mode.
+ return __any_inserted || this->_M_copy_unbuffered(__from, __to);
+}
+
+template <class _CharT, class _Traits>
+bool basic_ostream<_CharT, _Traits>
+ ::_M_copy_unbuffered(basic_streambuf<_CharT, _Traits>* __from,
+ basic_streambuf<_CharT, _Traits>* __to)
+{
+ bool __any_inserted = false;
+
+ while (true) {
+ int_type __c;
+ _STLP_TRY {
+ __c = __from->sbumpc();
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::failbit);
+ return __any_inserted;
+ }
+
+ if (this->_S_eof(__c))
+ return __any_inserted;
+
+ else {
+ int_type __tmp;
+ _STLP_TRY {
+ __tmp = __to->sputc(__c);
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ return __any_inserted;
+ }
+
+ if (this->_S_eof(__tmp)) {
+ _STLP_TRY {
+ /* __tmp = */ __from->sputbackc(__c);
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ return __any_inserted;
+ }
+ }
+ else
+ __any_inserted = true;
+ }
+ }
+}
+
+// Helper function for numeric output.
+
+template <class _CharT, class _Traits, class _Number>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+_M_put_num(basic_ostream<_CharT, _Traits>& __os, _Number __x)
+{
+ typedef typename basic_ostream<_CharT, _Traits>::sentry _Sentry;
+ _Sentry __sentry(__os);
+ bool __failed = true;
+
+ if (__sentry) {
+ _STLP_TRY {
+ typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> > _NumPut;
+ __failed = (use_facet<_NumPut>(__os.getloc())).put(
+ ostreambuf_iterator<_CharT, _Traits>(__os.rdbuf()),
+ __os, __os.fill(),
+ __x).failed();
+ }
+ _STLP_CATCH_ALL {
+ __os._M_handle_exception(ios_base::badbit);
+ }
+ }
+ if (__failed)
+ __os.setstate(ios_base::badbit);
+ return __os;
+}
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT) && defined (__BUILDING_STLPORT)
+_STLP_EXPORT_TEMPLATE _STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
+_M_put_num(basic_ostream<char, char_traits<char> >&, unsigned long);
+_STLP_EXPORT_TEMPLATE _STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
+_M_put_num(basic_ostream<char, char_traits<char> >&, long);
+# if defined (_STLP_LONG_LONG)
+_STLP_EXPORT_TEMPLATE _STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
+_M_put_num(basic_ostream<char, char_traits<char> >&, unsigned _STLP_LONG_LONG);
+_STLP_EXPORT_TEMPLATE _STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
+_M_put_num(basic_ostream<char, char_traits<char> >&, _STLP_LONG_LONG );
+# endif
+# endif
+
+template <class _CharT, class _Traits>
+void basic_ostream<_CharT, _Traits>::_M_put_char(_CharT __c)
+{
+ sentry __sentry(*this);
+ if (__sentry) {
+ bool __failed = true;
+ _STLP_TRY {
+ streamsize __npad = this->width() > 0 ? this->width() - 1 : 0;
+ // if (__npad <= 1)
+ if (__npad == 0)
+ __failed = this->_S_eof(this->rdbuf()->sputc(__c));
+ else if ((this->flags() & ios_base::adjustfield) == ios_base::left) {
+ __failed = this->_S_eof(this->rdbuf()->sputc(__c));
+ __failed = __failed ||
+ this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
+ }
+ else {
+ __failed = this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
+ __failed = __failed || this->_S_eof(this->rdbuf()->sputc(__c));
+ }
+
+ this->width(0);
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ }
+
+ if (__failed)
+ this->setstate(ios_base::badbit);
+ }
+}
+
+template <class _CharT, class _Traits>
+void basic_ostream<_CharT, _Traits>::_M_put_nowiden(const _CharT* __s)
+{
+ sentry __sentry(*this);
+ if (__sentry) {
+ bool __failed = true;
+ streamsize __n = _Traits::length(__s);
+ streamsize __npad = this->width() > __n ? this->width() - __n : 0;
+
+ _STLP_TRY {
+ if (__npad == 0)
+ __failed = this->rdbuf()->sputn(__s, __n) != __n;
+ else if ((this->flags() & ios_base::adjustfield) == ios_base::left) {
+ __failed = this->rdbuf()->sputn(__s, __n) != __n;
+ __failed = __failed ||
+ this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
+ }
+ else {
+ __failed = this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
+ __failed = __failed || this->rdbuf()->sputn(__s, __n) != __n;
+ }
+
+ this->width(0);
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ }
+
+ if (__failed)
+ this->setstate(ios_base::failbit);
+ }
+}
+
+template <class _CharT, class _Traits>
+void basic_ostream<_CharT, _Traits>::_M_put_widen(const char* __s)
+{
+ sentry __sentry(*this);
+ if (__sentry) {
+ bool __failed = true;
+ streamsize __n = char_traits<char>::length(__s);
+ streamsize __npad = this->width() > __n ? this->width() - __n : 0;
+
+ _STLP_TRY {
+ if (__npad == 0)
+ __failed = !this->_M_put_widen_aux(__s, __n);
+ else if ((this->flags() & ios_base::adjustfield) == ios_base::left) {
+ __failed = !this->_M_put_widen_aux(__s, __n);
+ __failed = __failed ||
+ this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
+ }
+ else {
+ __failed = this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
+ __failed = __failed || !this->_M_put_widen_aux(__s, __n);
+ }
+
+ this->width(0);
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ }
+
+ if (__failed)
+ this->setstate(ios_base::failbit);
+ }
+}
+
+template <class _CharT, class _Traits>
+bool basic_ostream<_CharT, _Traits>::_M_put_widen_aux(const char* __s,
+ streamsize __n)
+{
+ basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+
+ for ( ; __n > 0 ; --__n)
+ if (this->_S_eof(__buf->sputc(this->widen(*__s++))))
+ return false;
+ return true;
+}
+
+// Unformatted output of a single character.
+template <class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>&
+basic_ostream<_CharT, _Traits>::put(char_type __c)
+{
+ sentry __sentry(*this);
+ bool __failed = true;
+
+ if (__sentry) {
+ _STLP_TRY {
+ __failed = this->_S_eof(this->rdbuf()->sputc(__c));
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ }
+ }
+
+ if (__failed)
+ this->setstate(ios_base::badbit);
+
+ return *this;
+}
+
+// Unformatted output of a single character.
+template <class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>&
+basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n)
+{
+ sentry __sentry(*this);
+ bool __failed = true;
+
+ if (__sentry) {
+ _STLP_TRY {
+ __failed = this->rdbuf()->sputn(__s, __n) != __n;
+ }
+ _STLP_CATCH_ALL {
+ this->_M_handle_exception(ios_base::badbit);
+ }
+ }
+
+ if (__failed)
+ this->setstate(ios_base::badbit);
+
+ return *this;
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) */
+
+#endif /* _STLP_OSTREAM_C */
diff --git a/src/STLport/stl/_ostream.h b/src/STLport/stl/_ostream.h
new file mode 100644
index 0000000..91e2541
--- /dev/null
+++ b/src/STLport/stl/_ostream.h
@@ -0,0 +1,356 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+
+#ifndef _STLP_INTERNAL_OSTREAM_H
+#define _STLP_INTERNAL_OSTREAM_H
+
+#ifndef _STLP_INTERNAL_IOS_H
+# include <stl/_ios.h> // For basic_ios<>. Includes <iosfwd>.
+#endif
+
+#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
+# include <stl/_ostreambuf_iterator.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT, class _Traits, class _Number>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+_M_put_num(basic_ostream<_CharT, _Traits>& __os, _Number __x);
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+template <class _CharT, class _Traits>
+class _Osentry;
+# endif
+
+template <class _CharT, class _Traits>
+bool
+_M_init(basic_ostream<_CharT, _Traits>& __str);
+
+//----------------------------------------------------------------------
+// class basic_ostream<>
+
+template <class _CharT, class _Traits>
+class basic_ostream : virtual public basic_ios<_CharT, _Traits>
+{
+ typedef basic_ostream<_CharT, _Traits> _Self;
+
+public: // Types
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef basic_ios<_CharT, _Traits> _Basic_ios;
+
+public: // Constructor and destructor.
+ explicit basic_ostream(basic_streambuf<_CharT, _Traits>* __buf);
+ ~basic_ostream();
+
+public: // Hooks for manipulators.
+ typedef basic_ios<_CharT, _Traits>& (_STLP_CALL *__ios_fn)(basic_ios<_CharT, _Traits>&);
+ typedef ios_base& (_STLP_CALL *__ios_base_fn)(ios_base&);
+ typedef _Self& (_STLP_CALL *__ostream_fn)(_Self&);
+ _Self& operator<< (__ostream_fn __f) { return __f(*this); }
+ _Self & operator<< (__ios_base_fn __f) { __f(*this); return *this; }
+ _Self& operator<< (__ios_fn __ff) { __ff(*this); return *this; }
+
+private:
+ bool _M_copy_buffered(basic_streambuf<_CharT, _Traits>* __from,
+ basic_streambuf<_CharT, _Traits>* __to);
+ bool _M_copy_unbuffered(basic_streambuf<_CharT, _Traits>* __from,
+ basic_streambuf<_CharT, _Traits>* __to);
+
+public:
+ void _M_put_char(_CharT __c);
+
+ void _M_put_nowiden(const _CharT* __s);
+ void _M_put_widen(const char* __s);
+ bool _M_put_widen_aux(const char* __s, streamsize __n);
+
+public: // Unformatted output.
+ _Self& put(char_type __c);
+ _Self& write(const char_type* __s, streamsize __n);
+
+public: // Formatted output.
+ // Formatted output from a streambuf.
+ _Self& operator<<(basic_streambuf<_CharT, _Traits>* __buf);
+# ifndef _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
+ // this is needed for compiling with option char = unsigned
+ _Self& operator<<(unsigned char __x) { _M_put_char(__x); return *this; }
+# endif
+ _Self& operator<<(short __x) { return _M_put_num(*this, __STATIC_CAST(long,__x)); }
+ _Self& operator<<(unsigned short __x) { return _M_put_num(*this, __STATIC_CAST(unsigned long,__x)); }
+ _Self& operator<<(int __x) { return _M_put_num(*this, __STATIC_CAST(long,__x)); }
+ _Self& operator<<(unsigned int __x) { return _M_put_num(*this, __STATIC_CAST(unsigned long,__x)); }
+ _Self& operator<<(long __x) { return _M_put_num(*this, __x); }
+ _Self& operator<<(unsigned long __x) { return _M_put_num(*this, __x); }
+#ifdef _STLP_LONG_LONG
+ _Self& operator<< (_STLP_LONG_LONG __x) { return _M_put_num(*this, __x); }
+ _Self& operator<< (unsigned _STLP_LONG_LONG __x) { return _M_put_num(*this, __x); }
+#endif
+ _Self& operator<<(float __x)
+ { return _M_put_num(*this, __STATIC_CAST(double,__x)); }
+ _Self& operator<<(double __x) { return _M_put_num(*this, __x); }
+# ifndef _STLP_NO_LONG_DOUBLE
+ _Self& operator<<(long double __x) { return _M_put_num(*this, __x); }
+# endif
+ _Self& operator<<(const void* __x) { return _M_put_num(*this, __x); }
+# ifndef _STLP_NO_BOOL
+ _Self& operator<<(bool __x) { return _M_put_num(*this, __x); }
+# endif
+
+public: // Buffer positioning and manipulation.
+ _Self& flush() {
+ if (this->rdbuf())
+ if (this->rdbuf()->pubsync() == -1)
+ this->setstate(ios_base::badbit);
+ return *this;
+ }
+
+ pos_type tellp() {
+ return this->rdbuf() && !this->fail()
+ ? this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out)
+ : pos_type(-1);
+ }
+
+ _Self& seekp(pos_type __pos) {
+ if (this->rdbuf() && !this->fail())
+ this->rdbuf()->pubseekpos(__pos, ios_base::out);
+ return *this;
+ }
+
+ _Self& seekp(off_type __off, ios_base::seekdir __dir) {
+ if (this->rdbuf() && !this->fail())
+ this->rdbuf()->pubseekoff(__off, __dir, ios_base::out);
+ return *this;
+ }
+
+#if defined (_STLP_USE_TEMPLATE_EXPORT)
+ // If we are using DLL specs, we have not to use inner classes
+ // end class declaration here
+ typedef _Osentry<_CharT, _Traits> sentry;
+};
+# define sentry _Osentry
+ template <class _CharT, class _Traits>
+ class _Osentry {
+ typedef _Osentry<_CharT, _Traits> _Self;
+# else
+ class sentry {
+ typedef sentry _Self;
+# endif
+ private:
+ basic_ostream<_CharT, _Traits>& _M_str;
+ // basic_streambuf<_CharT, _Traits>* _M_buf;
+ bool _M_ok;
+ public:
+ explicit sentry(basic_ostream<_CharT, _Traits>& __str)
+ : _M_str(__str), /* _M_buf(__str.rdbuf()), */ _M_ok(_M_init(__str))
+ {
+ }
+
+ ~sentry() {
+ if (_M_str.flags() & ios_base::unitbuf)
+# ifndef _STLP_INCOMPLETE_EXCEPTION_HEADER
+ if (!_STLP_VENDOR_EXCEPT_STD::uncaught_exception())
+# endif
+ _M_str.flush();
+ }
+
+ operator bool() const { return _M_ok; }
+ private: // Disable assignment and copy constructor.
+ sentry(const _Self& __s) : _M_str (__s._M_str) {};
+ void operator=(const _Self&) {};
+ };
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+# undef sentry
+# else
+ // close basic_ostream class definition here
+};
+# endif
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_ostream<char, char_traits<char> >;
+_STLP_EXPORT_TEMPLATE_CLASS _Osentry<char, char_traits<char> >;
+# if !defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_ostream<wchar_t, char_traits<wchar_t> >;
+_STLP_EXPORT_TEMPLATE_CLASS _Osentry<wchar_t, char_traits<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+template <class _CharT, class _Traits>
+inline basic_streambuf<_CharT, _Traits>* _STLP_CALL
+_M_get_ostreambuf(basic_ostream<_CharT, _Traits>& __St)
+{
+ return __St.rdbuf();
+}
+
+// Non-member functions.
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c) {
+ __os._M_put_char(__c);
+ return __os;
+}
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __s) {
+ __os._M_put_nowiden(__s);
+ return __os;
+}
+
+# ifdef _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
+// some specializations
+
+inline basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __os, char __c) {
+ __os._M_put_char(__c);
+ return __os;
+}
+
+inline basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __os, signed char __c) {
+ __os._M_put_char(__c);
+ return __os;
+}
+
+inline basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __os, unsigned char __c) {
+ __os._M_put_char(__c);
+ return __os;
+}
+
+inline basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __os, const char* __s) {
+ __os._M_put_nowiden(__s);
+ return __os;
+}
+
+inline basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __os, const signed char* __s) {
+ __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
+ return __os;
+}
+
+inline basic_ostream<char, char_traits<char> >&
+operator<<(basic_ostream<char, char_traits<char> >& __os, const unsigned char* __s) {
+ __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
+ return __os;
+}
+
+# else
+
+// also for compilers who might use that
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, char __c) {
+ __os._M_put_char(__os.widen(__c));
+ return __os;
+}
+
+template <class _Traits>
+inline basic_ostream<char, _Traits>& _STLP_CALL
+operator<<(basic_ostream<char, _Traits>& __os, char __c) {
+ __os._M_put_char(__c);
+ return __os;
+}
+
+template <class _Traits>
+inline basic_ostream<char, _Traits>& _STLP_CALL
+operator<<(basic_ostream<char, _Traits>& __os, signed char __c) {
+ __os._M_put_char(__c);
+ return __os;
+}
+
+template <class _Traits>
+inline basic_ostream<char, _Traits>& _STLP_CALL
+operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) {
+ __os._M_put_char(__c);
+ return __os;
+}
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __s) {
+ __os._M_put_widen(__s);
+ return __os;
+}
+
+template <class _Traits>
+inline basic_ostream<char, _Traits>& _STLP_CALL
+operator<<(basic_ostream<char, _Traits>& __os, const char* __s) {
+ __os._M_put_nowiden(__s);
+ return __os;
+}
+
+template <class _Traits>
+inline basic_ostream<char, _Traits>& _STLP_CALL
+operator<<(basic_ostream<char, _Traits>& __os, const signed char* __s) {
+ __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
+ return __os;
+}
+
+template <class _Traits>
+inline basic_ostream<char, _Traits>&
+operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __s) {
+ __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
+ return __os;
+}
+# endif /* _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER */
+
+//----------------------------------------------------------------------
+// basic_ostream manipulators.
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+endl(basic_ostream<_CharT, _Traits>& __os) {
+ __os.put(__os.widen('\n'));
+ __os.flush();
+ return __os;
+}
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+ends(basic_ostream<_CharT, _Traits>& __os) {
+ __os.put(_STLP_DEFAULT_CONSTRUCTED(_CharT));
+ return __os;
+}
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+flush(basic_ostream<_CharT, _Traits>& __os) {
+ __os.flush();
+ return __os;
+}
+
+_STLP_END_NAMESPACE
+
+# undef _STLP_MANIP_INLINE
+
+#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_ostream.c>
+# endif
+
+#endif /* _STLP_INTERNAL_OSTREAM_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_ostreambuf_iterator.h b/src/STLport/stl/_ostreambuf_iterator.h
new file mode 100644
index 0000000..096f428
--- /dev/null
+++ b/src/STLport/stl/_ostreambuf_iterator.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
+#define _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+# include <stl/_streambuf.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT, class _Traits>
+extern basic_streambuf<_CharT, _Traits>* _STLP_CALL _M_get_ostreambuf(basic_ostream<_CharT, _Traits>& ) ;
+
+// The default template argument is declared in iosfwd
+template<class _CharT, class _Traits>
+class ostreambuf_iterator
+{
+public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef typename _Traits::int_type int_type;
+ typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+ typedef basic_ostream<_CharT, _Traits> ostream_type;
+
+ typedef output_iterator_tag iterator_category;
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+
+public:
+ ostreambuf_iterator(streambuf_type* __buf) _STLP_NOTHROW : _M_buf(__buf), _M_ok(__buf!=0) {}
+ // ostreambuf_iterator(ostream_type& __o) _STLP_NOTHROW : _M_buf(_M_get_ostreambuf(__o)), _M_ok(_M_buf != 0) {}
+ inline ostreambuf_iterator(ostream_type& __o) _STLP_NOTHROW;
+
+ ostreambuf_iterator<_CharT, _Traits>& operator=(char_type __c) {
+ _M_ok = _M_ok && !traits_type::eq_int_type(_M_buf->sputc(__c),
+ traits_type::eof());
+ return *this;
+ }
+
+ ostreambuf_iterator<_CharT, _Traits>& operator*() { return *this; }
+ ostreambuf_iterator<_CharT, _Traits>& operator++() { return *this; }
+ ostreambuf_iterator<_CharT, _Traits>& operator++(int) { return *this; }
+
+ bool failed() const { return !_M_ok; }
+
+private:
+ streambuf_type* _M_buf;
+ bool _M_ok;
+};
+
+template <class _CharT, class _Traits>
+inline ostreambuf_iterator<_CharT, _Traits>::ostreambuf_iterator(basic_ostream<_CharT, _Traits>& __o) _STLP_NOTHROW : _M_buf(_M_get_ostreambuf(__o)), _M_ok(_M_buf != 0) {}
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS ostreambuf_iterator<char, char_traits<char> >;
+# if defined (INSTANTIATE_WIDE_STREAMS)
+_STLP_EXPORT_TEMPLATE_CLASS ostreambuf_iterator<wchar_t, char_traits<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _CharT, class _Traits>
+inline output_iterator_tag _STLP_CALL
+iterator_category(const ostreambuf_iterator<_CharT, _Traits>&) { return output_iterator_tag(); }
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_pair.h b/src/STLport/stl/_pair.h
new file mode 100644
index 0000000..5888a18
--- /dev/null
+++ b/src/STLport/stl/_pair.h
@@ -0,0 +1,161 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_PAIR_H
+#define _STLP_INTERNAL_PAIR_H
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _T1, class _T2>
+struct pair {
+ typedef _T1 first_type;
+ typedef _T2 second_type;
+
+ _T1 first;
+ _T2 second;
+# if defined (_STLP_CONST_CONSTRUCTOR_BUG)
+ pair() {}
+# else
+ pair() : first(_T1()), second(_T2()) {}
+# endif
+ pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) {}
+
+#if defined (_STLP_MEMBER_TEMPLATES) && !(defined (_STLP_MSVC) && (_STLP_MSVC < 1200))
+ template <class _U1, class _U2>
+ pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {}
+
+ pair(const pair<_T1,_T2>& __o) : first(__o.first), second(__o.second) {}
+#endif
+ __TRIVIAL_DESTRUCTOR(pair)
+};
+
+template <class _T1, class _T2>
+inline bool _STLP_CALL operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+{
+ return __x.first == __y.first && __x.second == __y.second;
+}
+
+template <class _T1, class _T2>
+inline bool _STLP_CALL operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+{
+ return __x.first < __y.first ||
+ (!(__y.first < __x.first) && __x.second < __y.second);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _T1, class _T2>
+inline bool _STLP_CALL operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
+ return !(__x == __y);
+}
+
+template <class _T1, class _T2>
+inline bool _STLP_CALL operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
+ return __y < __x;
+}
+
+template <class _T1, class _T2>
+inline bool _STLP_CALL operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
+ return !(__y < __x);
+}
+
+template <class _T1, class _T2>
+inline bool _STLP_CALL operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
+ return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+
+#if defined(_STLP_FUNCTION_TMPL_PARTIAL_ORDER) && ! defined (_STLP_NO_EXTENSIONS) && ! defined (__BORLANDC__) && ! defined (__DMC__)
+template <class _T1, class _T2, int _Sz>
+inline pair<_T1, _T2 const*> make_pair(_T1 const& __x,
+ _T2 const (&__y)[_Sz])
+{
+ return pair<_T1, _T2 const*>(__x, static_cast<_T2 const*>(__y));
+}
+
+template <class _T1, class _T2, int _Sz>
+inline pair<_T1 const*, _T2> make_pair(_T1 const (&__x)[_Sz],
+ _T2 const& __y)
+{
+ return pair<_T1 const*, _T2>(static_cast<_T1 const*>(__x), __y);
+}
+
+template <class _T1, class _T2, int _Sz1, int _Sz2>
+inline pair<_T1 const*, _T2 const*> make_pair(_T1 const (&__x)[_Sz1],
+ _T2 const (&__y)[_Sz2])
+{
+ return pair<_T1 const*, _T2 const*>(static_cast<_T1 const*>(__x),
+ static_cast<_T2 const*>(__y));
+}
+#endif
+
+template <class _T1, class _T2>
+inline pair<_T1, _T2> _STLP_CALL make_pair(const _T1& __x, const _T2& __y)
+{
+ return pair<_T1, _T2>(__x, __y);
+}
+
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_USE_NAMESPACES) || ! defined (_STLP_USE_SEPARATE_RELOPS_NAMESPACE)
+_STLP_BEGIN_RELOPS_NAMESPACE
+
+template <class _Tp>
+inline bool _STLP_CALL operator!=(const _Tp& __x, const _Tp& __y) {
+ return !(__x == __y);
+}
+
+template <class _Tp>
+inline bool _STLP_CALL operator>(const _Tp& __x, const _Tp& __y) {
+ return __y < __x;
+}
+
+template <class _Tp>
+inline bool _STLP_CALL operator<=(const _Tp& __x, const _Tp& __y) {
+ return !(__y < __x);
+}
+
+template <class _Tp>
+inline bool _STLP_CALL operator>=(const _Tp& __x, const _Tp& __y) {
+ return !(__x < __y);
+}
+
+_STLP_END_RELOPS_NAMESPACE
+
+# endif
+
+#endif /* _STLP_INTERNAL_PAIR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_prolog.h b/src/STLport/stl/_prolog.h
new file mode 100644
index 0000000..c545322
--- /dev/null
+++ b/src/STLport/stl/_prolog.h
@@ -0,0 +1,17 @@
+/* NOTE : this header has no guards and is MEANT for multiple inclusion !
+ * If you are using "header protection" option with your compiler,
+ * please also find #pragma which disables it and put it here, to
+ * allow reentrancy of this header.
+ */
+/* We undef "std" on entry , as STLport headers may include native ones. */
+# undef std
+
+# ifndef _STLP_CONFIG_H
+# include <stl/_config.h>
+# endif
+
+/* If the platform provides any specific prolog actions,
+ * like #pragmas, do include platform-specific prolog file */
+# if defined (_STLP_HAS_SPECIFIC_PROLOG_EPILOG)
+# include <config/_prolog.h>
+# endif
diff --git a/src/STLport/stl/_pthread_alloc.c b/src/STLport/stl/_pthread_alloc.c
new file mode 100644
index 0000000..5d64b6b
--- /dev/null
+++ b/src/STLport/stl/_pthread_alloc.c
@@ -0,0 +1,262 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_PTHREAD_ALLOC_C
+#define _STLP_PTHREAD_ALLOC_C
+
+#ifdef __WATCOMC__
+#pragma warning 13 9
+#pragma warning 367 9
+#pragma warning 368 9
+#endif
+
+#ifndef _STLP_PTHREAD_ALLOC_H
+# include <stl/_pthread_alloc.h>
+#endif
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+# include <cerrno>
+
+_STLP_BEGIN_NAMESPACE
+
+template <size_t _Max_size>
+void _Pthread_alloc<_Max_size>::_S_destructor(void * __instance)
+{
+ _M_lock __lock_instance; // Need to acquire lock here.
+ _Pthread_alloc_per_thread_state<_Max_size>* __s =
+ (_Pthread_alloc_per_thread_state<_Max_size> *)__instance;
+ __s -> __next = _S_free_per_thread_states;
+ _S_free_per_thread_states = __s;
+}
+
+template <size_t _Max_size>
+_Pthread_alloc_per_thread_state<_Max_size> *
+_Pthread_alloc<_Max_size>::_S_new_per_thread_state()
+{
+ /* lock already held here. */
+ if (0 != _S_free_per_thread_states) {
+ _Pthread_alloc_per_thread_state<_Max_size> *__result =
+ _S_free_per_thread_states;
+ _S_free_per_thread_states = _S_free_per_thread_states -> __next;
+ return __result;
+ } else {
+ return _STLP_NEW _Pthread_alloc_per_thread_state<_Max_size>;
+ }
+}
+
+template <size_t _Max_size>
+_Pthread_alloc_per_thread_state<_Max_size> *
+_Pthread_alloc<_Max_size>::_S_get_per_thread_state()
+{
+
+ int __ret_code;
+ __state_type* __result;
+
+ if (_S_key_initialized && (__result = (__state_type*) pthread_getspecific(_S_key)))
+ return __result;
+
+ /*REFERENCED*/
+ _M_lock __lock_instance; // Need to acquire lock here.
+ if (!_S_key_initialized) {
+ if (pthread_key_create(&_S_key, _S_destructor)) {
+ __THROW_BAD_ALLOC; // failed
+ }
+ _S_key_initialized = true;
+ }
+
+ __result = _S_new_per_thread_state();
+ __ret_code = pthread_setspecific(_S_key, __result);
+ if (__ret_code) {
+ if (__ret_code == ENOMEM) {
+ __THROW_BAD_ALLOC;
+ } else {
+ // EINVAL
+ _STLP_ABORT();
+ }
+ }
+ return __result;
+}
+
+/* We allocate memory in large chunks in order to avoid fragmenting */
+/* the malloc heap too much. */
+/* We assume that size is properly aligned. */
+template <size_t _Max_size>
+char *_Pthread_alloc<_Max_size>
+::_S_chunk_alloc(size_t __p_size, size_t &__nobjs)
+{
+ {
+ char * __result;
+ size_t __total_bytes;
+ size_t __bytes_left;
+ /*REFERENCED*/
+ _M_lock __lock_instance; // Acquire lock for this routine
+
+ __total_bytes = __p_size * __nobjs;
+ __bytes_left = _S_end_free - _S_start_free;
+ if (__bytes_left >= __total_bytes) {
+ __result = _S_start_free;
+ _S_start_free += __total_bytes;
+ return(__result);
+ } else if (__bytes_left >= __p_size) {
+ __nobjs = __bytes_left/__p_size;
+ __total_bytes = __p_size * __nobjs;
+ __result = _S_start_free;
+ _S_start_free += __total_bytes;
+ return(__result);
+ } else {
+ size_t __bytes_to_get =
+ 2 * __total_bytes + _S_round_up(_S_heap_size >> 4);
+ // Try to make use of the left-over piece.
+ if (__bytes_left > 0) {
+ _Pthread_alloc_per_thread_state<_Max_size>* __a =
+ (_Pthread_alloc_per_thread_state<_Max_size>*)
+ pthread_getspecific(_S_key);
+ __obj * volatile * __my_free_list =
+ __a->__free_list + _S_freelist_index(__bytes_left);
+
+ ((__obj *)_S_start_free) -> __free_list_link = *__my_free_list;
+ *__my_free_list = (__obj *)_S_start_free;
+ }
+# ifdef _SGI_SOURCE
+ // Try to get memory that's aligned on something like a
+ // cache line boundary, so as to avoid parceling out
+ // parts of the same line to different threads and thus
+ // possibly different processors.
+ {
+ const int __cache_line_size = 128; // probable upper bound
+ __bytes_to_get &= ~(__cache_line_size-1);
+ _S_start_free = (char *)memalign(__cache_line_size, __bytes_to_get);
+ if (0 == _S_start_free) {
+ _S_start_free = (char *)__malloc_alloc<0>::allocate(__bytes_to_get);
+ }
+ }
+# else /* !SGI_SOURCE */
+ _S_start_free = (char *)__malloc_alloc<0>::allocate(__bytes_to_get);
+# endif
+ _S_heap_size += __bytes_to_get;
+ _S_end_free = _S_start_free + __bytes_to_get;
+ }
+ }
+ // lock is released here
+ return(_S_chunk_alloc(__p_size, __nobjs));
+}
+
+
+/* Returns an object of size n, and optionally adds to size n free list.*/
+/* We assume that n is properly aligned. */
+/* We hold the allocation lock. */
+template <size_t _Max_size>
+void *_Pthread_alloc_per_thread_state<_Max_size>
+::_M_refill(size_t __n)
+{
+ size_t __nobjs = 128;
+ char * __chunk =
+ _Pthread_alloc<_Max_size>::_S_chunk_alloc(__n, __nobjs);
+ __obj * volatile * __my_free_list;
+ __obj * __result;
+ __obj * __current_obj, * __next_obj;
+ int __i;
+
+ if (1 == __nobjs) {
+ return(__chunk);
+ }
+ __my_free_list = __free_list
+ + _Pthread_alloc<_Max_size>::_S_freelist_index(__n);
+
+ /* Build free list in chunk */
+ __result = (__obj *)__chunk;
+ *__my_free_list = __next_obj = (__obj *)(__chunk + __n);
+ for (__i = 1; ; __i++) {
+ __current_obj = __next_obj;
+ __next_obj = (__obj *)((char *)__next_obj + __n);
+ if (__nobjs - 1 == __i) {
+ __current_obj -> __free_list_link = 0;
+ break;
+ } else {
+ __current_obj -> __free_list_link = __next_obj;
+ }
+ }
+ return(__result);
+}
+
+template <size_t _Max_size>
+void *_Pthread_alloc<_Max_size>
+::reallocate(void *__p, size_t __old_sz, size_t __new_sz)
+{
+ void * __result;
+ size_t __copy_sz;
+
+ if (__old_sz > _Max_size
+ && __new_sz > _Max_size) {
+ return(realloc(__p, __new_sz));
+ }
+ if (_S_round_up(__old_sz) == _S_round_up(__new_sz)) return(__p);
+ __result = allocate(__new_sz);
+ __copy_sz = __new_sz > __old_sz? __old_sz : __new_sz;
+ memcpy(__result, __p, __copy_sz);
+ deallocate(__p, __old_sz);
+ return(__result);
+}
+
+#if defined (_STLP_STATIC_TEMPLATE_DATA) && (_STLP_STATIC_TEMPLATE_DATA > 0)
+
+template <size_t _Max_size>
+_Pthread_alloc_per_thread_state<_Max_size> * _Pthread_alloc<_Max_size>::_S_free_per_thread_states = 0;
+
+template <size_t _Max_size>
+pthread_key_t _Pthread_alloc<_Max_size>::_S_key =0;
+
+template <size_t _Max_size>
+bool _Pthread_alloc<_Max_size>::_S_key_initialized = false;
+
+template <size_t _Max_size>
+_STLP_mutex_base _Pthread_alloc<_Max_size>::_S_chunk_allocator_lock _STLP_MUTEX_INITIALIZER;
+
+template <size_t _Max_size>
+char *_Pthread_alloc<_Max_size>::_S_start_free = 0;
+
+template <size_t _Max_size>
+char *_Pthread_alloc<_Max_size>::_S_end_free = 0;
+
+template <size_t _Max_size>
+size_t _Pthread_alloc<_Max_size>::_S_heap_size = 0;
+
+ # else
+
+ __DECLARE_INSTANCE(template <size_t _Max_size> _Pthread_alloc_per_thread_state<_Max_size> *, _Pthread_alloc<_Max_size>::_S_free_per_thread_states, = 0);
+ __DECLARE_INSTANCE(template <size_t _Max_size> pthread_key_t, _Pthread_alloc<_Max_size>::_S_key, = 0);
+ __DECLARE_INSTANCE(template <size_t _Max_size> bool, _Pthread_alloc<_Max_size>::_S_key_initialized, = false);
+ __DECLARE_INSTANCE(template <size_t _Max_size> char *, _Pthread_alloc<_Max_size>::_S_start_free, = 0);
+ __DECLARE_INSTANCE(template <size_t _Max_size> char *, _Pthread_alloc<_Max_size>::_S_end_free, = 0);
+ __DECLARE_INSTANCE(template <size_t _Max_size> size_t, _Pthread_alloc<_Max_size>::_S_heap_size, = 0);
+
+# endif
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_EXPOSE_GLOBALS_IMPLEMENTATION */
+
+#endif /* _STLP_PTHREAD_ALLOC_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_pthread_alloc.h b/src/STLport/stl/_pthread_alloc.h
new file mode 100644
index 0000000..3d6be7e
--- /dev/null
+++ b/src/STLport/stl/_pthread_alloc.h
@@ -0,0 +1,489 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_PTHREAD_ALLOC_H
+#define _STLP_PTHREAD_ALLOC_H
+
+// Pthread-specific node allocator.
+// This is similar to the default allocator, except that free-list
+// information is kept separately for each thread, avoiding locking.
+// This should be reasonably fast even in the presence of threads.
+// The down side is that storage may not be well-utilized.
+// It is not an error to allocate memory in thread A and deallocate
+// it in thread B. But this effectively transfers ownership of the memory,
+// so that it can only be reallocated by thread B. Thus this can effectively
+// result in a storage leak if it's done on a regular basis.
+// It can also result in frequent sharing of
+// cache lines among processors, with potentially serious performance
+// consequences.
+
+#include <pthread.h>
+
+#ifndef _STLP_INTERNAL_ALLOC_H
+#include <stl/_alloc.h>
+#endif
+
+#ifndef __RESTRICT
+# define __RESTRICT
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+#define _STLP_DATA_ALIGNMENT 8
+
+union _Pthread_alloc_obj {
+ union _Pthread_alloc_obj * __free_list_link;
+ char __client_data[_STLP_DATA_ALIGNMENT]; /* The client sees this. */
+};
+
+// Pthread allocators don't appear to the client to have meaningful
+// instances. We do in fact need to associate some state with each
+// thread. That state is represented by
+// _Pthread_alloc_per_thread_state<_Max_size>.
+
+template<size_t _Max_size>
+struct _Pthread_alloc_per_thread_state {
+ typedef _Pthread_alloc_obj __obj;
+ enum { _S_NFREELISTS = _Max_size/_STLP_DATA_ALIGNMENT };
+
+ // Free list link for list of available per thread structures.
+ // When one of these becomes available for reuse due to thread
+ // termination, any objects in its free list remain associated
+ // with it. The whole structure may then be used by a newly
+ // created thread.
+ _Pthread_alloc_per_thread_state() : __next(0)
+ {
+ memset((void *)__free_list, 0, (size_t)_S_NFREELISTS * sizeof(__obj *));
+ }
+ // Returns an object of size __n, and possibly adds to size n free list.
+ void *_M_refill(size_t __n);
+
+ _Pthread_alloc_obj* volatile __free_list[_S_NFREELISTS];
+ _Pthread_alloc_per_thread_state<_Max_size> * __next;
+ // this data member is only to be used by per_thread_allocator, which returns memory to the originating thread.
+ _STLP_mutex _M_lock;
+
+ };
+
+// Pthread-specific allocator.
+// The argument specifies the largest object size allocated from per-thread
+// free lists. Larger objects are allocated using malloc_alloc.
+// Max_size must be a power of 2.
+template < __DFL_NON_TYPE_PARAM(size_t, _Max_size, _MAX_BYTES) >
+class _Pthread_alloc {
+
+public: // but only for internal use:
+
+ typedef _Pthread_alloc_obj __obj;
+ typedef _Pthread_alloc_per_thread_state<_Max_size> __state_type;
+ typedef char value_type;
+
+ // Allocates a chunk for nobjs of size size. nobjs may be reduced
+ // if it is inconvenient to allocate the requested number.
+ static char *_S_chunk_alloc(size_t __size, size_t &__nobjs);
+
+ enum {_S_ALIGN = _STLP_DATA_ALIGNMENT};
+
+ static size_t _S_round_up(size_t __bytes) {
+ return (((__bytes) + (int)_S_ALIGN-1) & ~((int)_S_ALIGN - 1));
+ }
+ static size_t _S_freelist_index(size_t __bytes) {
+ return (((__bytes) + (int)_S_ALIGN-1)/(int)_S_ALIGN - 1);
+ }
+
+private:
+ // Chunk allocation state. And other shared state.
+ // Protected by _S_chunk_allocator_lock.
+ static _STLP_mutex_base _S_chunk_allocator_lock;
+ static char *_S_start_free;
+ static char *_S_end_free;
+ static size_t _S_heap_size;
+ static _Pthread_alloc_per_thread_state<_Max_size>* _S_free_per_thread_states;
+ static pthread_key_t _S_key;
+ static bool _S_key_initialized;
+ // Pthread key under which per thread state is stored.
+ // Allocator instances that are currently unclaimed by any thread.
+ static void _S_destructor(void *instance);
+ // Function to be called on thread exit to reclaim per thread
+ // state.
+ static _Pthread_alloc_per_thread_state<_Max_size> *_S_new_per_thread_state();
+public:
+ // Return a recycled or new per thread state.
+ static _Pthread_alloc_per_thread_state<_Max_size> *_S_get_per_thread_state();
+private:
+ // ensure that the current thread has an associated
+ // per thread state.
+ class _M_lock;
+ friend class _M_lock;
+ class _M_lock {
+ public:
+ _M_lock () { _S_chunk_allocator_lock._M_acquire_lock(); }
+ ~_M_lock () { _S_chunk_allocator_lock._M_release_lock(); }
+ };
+
+public:
+
+ /* n must be > 0 */
+ static void * allocate(size_t __n)
+ {
+ __obj * volatile * __my_free_list;
+ __obj * __RESTRICT __result;
+ __state_type* __a;
+
+ if (__n > _Max_size) {
+ return(__malloc_alloc<0>::allocate(__n));
+ }
+
+ __a = _S_get_per_thread_state();
+
+ __my_free_list = __a -> __free_list + _S_freelist_index(__n);
+ __result = *__my_free_list;
+ if (__result == 0) {
+ void *__r = __a -> _M_refill(_S_round_up(__n));
+ return __r;
+ }
+ *__my_free_list = __result -> __free_list_link;
+ return (__result);
+ };
+
+ /* p may not be 0 */
+ static void deallocate(void *__p, size_t __n)
+ {
+ __obj *__q = (__obj *)__p;
+ __obj * volatile * __my_free_list;
+ __state_type* __a;
+
+ if (__n > _Max_size) {
+ __malloc_alloc<0>::deallocate(__p, __n);
+ return;
+ }
+
+ __a = _S_get_per_thread_state();
+
+ __my_free_list = __a->__free_list + _S_freelist_index(__n);
+ __q -> __free_list_link = *__my_free_list;
+ *__my_free_list = __q;
+ }
+
+ // boris : versions for per_thread_allocator
+ /* n must be > 0 */
+ static void * allocate(size_t __n, __state_type* __a)
+ {
+ __obj * volatile * __my_free_list;
+ __obj * __RESTRICT __result;
+
+ if (__n > _Max_size) {
+ return(__malloc_alloc<0>::allocate(__n));
+ }
+
+ // boris : here, we have to lock per thread state, as we may be getting memory from
+ // different thread pool.
+ _STLP_mutex_lock __lock(__a->_M_lock);
+
+ __my_free_list = __a -> __free_list + _S_freelist_index(__n);
+ __result = *__my_free_list;
+ if (__result == 0) {
+ void *__r = __a -> _M_refill(_S_round_up(__n));
+ return __r;
+ }
+ *__my_free_list = __result -> __free_list_link;
+ return (__result);
+ };
+
+ /* p may not be 0 */
+ static void deallocate(void *__p, size_t __n, __state_type* __a)
+ {
+ __obj *__q = (__obj *)__p;
+ __obj * volatile * __my_free_list;
+
+ if (__n > _Max_size) {
+ __malloc_alloc<0>::deallocate(__p, __n);
+ return;
+ }
+
+ // boris : here, we have to lock per thread state, as we may be returning memory from
+ // different thread.
+ _STLP_mutex_lock __lock(__a->_M_lock);
+
+ __my_free_list = __a->__free_list + _S_freelist_index(__n);
+ __q -> __free_list_link = *__my_free_list;
+ *__my_free_list = __q;
+ }
+
+ static void * reallocate(void *__p, size_t __old_sz, size_t __new_sz);
+
+} ;
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _Pthread_alloc<_MAX_BYTES>;
+# endif
+
+typedef _Pthread_alloc<_MAX_BYTES> __pthread_alloc;
+typedef __pthread_alloc pthread_alloc;
+
+template <class _Tp>
+class pthread_allocator {
+ typedef pthread_alloc _S_Alloc; // The underlying allocator.
+public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+
+#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
+ template <class _NewType> struct rebind {
+ typedef pthread_allocator<_NewType> other;
+ };
+#endif
+
+ pthread_allocator() _STLP_NOTHROW {}
+ pthread_allocator(const pthread_allocator<_Tp>& a) _STLP_NOTHROW {}
+
+#if defined (_STLP_MEMBER_TEMPLATES) /* && defined (_STLP_FUNCTION_PARTIAL_ORDER) */
+ template <class _OtherType> pthread_allocator(const pthread_allocator<_OtherType>&)
+ _STLP_NOTHROW {}
+#endif
+
+ ~pthread_allocator() _STLP_NOTHROW {}
+
+ pointer address(reference __x) const { return &__x; }
+ const_pointer address(const_reference __x) const { return &__x; }
+
+ // __n is permitted to be 0. The C++ standard says nothing about what
+ // the return value is when __n == 0.
+ _Tp* allocate(size_type __n, const void* = 0) {
+ return __n != 0 ? __STATIC_CAST(_Tp*,_S_Alloc::allocate(__n * sizeof(_Tp)))
+ : 0;
+ }
+
+ // p is not permitted to be a null pointer.
+ void deallocate(pointer __p, size_type __n)
+ { _S_Alloc::deallocate(__p, __n * sizeof(_Tp)); }
+
+ size_type max_size() const _STLP_NOTHROW
+ { return size_t(-1) / sizeof(_Tp); }
+
+ void construct(pointer __p, const _Tp& __val) { _STLP_PLACEMENT_NEW (__p) _Tp(__val); }
+ void destroy(pointer _p) { _p->~_Tp(); }
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC pthread_allocator<void> {
+public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+ typedef void value_type;
+#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
+ template <class _NewType> struct rebind {
+ typedef pthread_allocator<_NewType> other;
+ };
+#endif
+};
+
+template <class _T1, class _T2>
+inline bool operator==(const pthread_allocator<_T1>&,
+ const pthread_allocator<_T2>& a2)
+{
+ return true;
+}
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+template <class _T1, class _T2>
+inline bool operator!=(const pthread_allocator<_T1>&,
+ const pthread_allocator<_T2>&)
+{
+ return false;
+}
+#endif
+
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+# ifdef _STLP_USE_RAW_SGI_ALLOCATORS
+template <class _Tp, size_t _Max_size>
+struct _Alloc_traits<_Tp, _Pthread_alloc<_Max_size> >
+{
+ typedef __allocator<_Tp, _Pthread_alloc<_Max_size> >
+ allocator_type;
+};
+# endif
+
+template <class _Tp, class _Atype>
+struct _Alloc_traits<_Tp, pthread_allocator<_Atype> >
+{
+ typedef pthread_allocator<_Tp> allocator_type;
+};
+
+#endif
+
+#if !defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM)
+
+template <class _Tp1, class _Tp2>
+inline pthread_allocator<_Tp2>&
+__stl_alloc_rebind(pthread_allocator<_Tp1>& __x, const _Tp2*) {
+ return (pthread_allocator<_Tp2>&)__x;
+}
+
+template <class _Tp1, class _Tp2>
+inline pthread_allocator<_Tp2>
+__stl_alloc_create(pthread_allocator<_Tp1>&, const _Tp2*) {
+ return pthread_allocator<_Tp2>();
+}
+
+#endif /* _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM */
+
+//
+// per_thread_allocator<> : this allocator always return memory to the same thread
+// it was allocated from.
+//
+
+template <class _Tp>
+class per_thread_allocator {
+ typedef pthread_alloc _S_Alloc; // The underlying allocator.
+ typedef pthread_alloc::__state_type __state_type;
+public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+
+#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
+ template <class _NewType> struct rebind {
+ typedef per_thread_allocator<_NewType> other;
+ };
+#endif
+
+ per_thread_allocator() _STLP_NOTHROW {
+ _M_state = _S_Alloc::_S_get_per_thread_state();
+ }
+ per_thread_allocator(const per_thread_allocator<_Tp>& __a) _STLP_NOTHROW : _M_state(__a._M_state){}
+
+#if defined (_STLP_MEMBER_TEMPLATES) /* && defined (_STLP_FUNCTION_PARTIAL_ORDER) */
+ template <class _OtherType> per_thread_allocator(const per_thread_allocator<_OtherType>& __a)
+ _STLP_NOTHROW : _M_state(__a._M_state) {}
+#endif
+
+ ~per_thread_allocator() _STLP_NOTHROW {}
+
+ pointer address(reference __x) const { return &__x; }
+ const_pointer address(const_reference __x) const { return &__x; }
+
+ // __n is permitted to be 0. The C++ standard says nothing about what
+ // the return value is when __n == 0.
+ _Tp* allocate(size_type __n, const void* = 0) {
+ return __n != 0 ? __STATIC_CAST(_Tp*,_S_Alloc::allocate(__n * sizeof(_Tp), _M_state)): 0;
+ }
+
+ // p is not permitted to be a null pointer.
+ void deallocate(pointer __p, size_type __n)
+ { _S_Alloc::deallocate(__p, __n * sizeof(_Tp), _M_state); }
+
+ size_type max_size() const _STLP_NOTHROW
+ { return size_t(-1) / sizeof(_Tp); }
+
+ void construct(pointer __p, const _Tp& __val) { _STLP_PLACEMENT_NEW (__p) _Tp(__val); }
+ void destroy(pointer _p) { _p->~_Tp(); }
+
+ // state is being kept here
+ __state_type* _M_state;
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC per_thread_allocator<void> {
+public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+ typedef void value_type;
+#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
+ template <class _NewType> struct rebind {
+ typedef per_thread_allocator<_NewType> other;
+ };
+#endif
+};
+
+template <class _T1, class _T2>
+inline bool operator==(const per_thread_allocator<_T1>& __a1,
+ const per_thread_allocator<_T2>& __a2)
+{
+ return __a1._M_state == __a2._M_state;
+}
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+template <class _T1, class _T2>
+inline bool operator!=(const per_thread_allocator<_T1>& __a1,
+ const per_thread_allocator<_T2>& __a2)
+{
+ return __a1._M_state != __a2._M_state;
+}
+#endif
+
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+template <class _Tp, class _Atype>
+struct _Alloc_traits<_Tp, per_thread_allocator<_Atype> >
+{
+ typedef per_thread_allocator<_Tp> allocator_type;
+};
+
+#endif
+
+#if !defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM)
+
+template <class _Tp1, class _Tp2>
+inline per_thread_allocator<_Tp2>&
+__stl_alloc_rebind(per_thread_allocator<_Tp1>& __x, const _Tp2*) {
+ return (per_thread_allocator<_Tp2>&)__x;
+}
+
+template <class _Tp1, class _Tp2>
+inline per_thread_allocator<_Tp2>
+__stl_alloc_create(per_thread_allocator<_Tp1>&, const _Tp2*) {
+ return per_thread_allocator<_Tp2>();
+}
+
+#endif /* _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM */
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_pthread_alloc.c>
+# endif
+
+#endif /* _STLP_PTHREAD_ALLOC */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_ptrs_specialize.h b/src/STLport/stl/_ptrs_specialize.h
new file mode 100644
index 0000000..cc5d259
--- /dev/null
+++ b/src/STLport/stl/_ptrs_specialize.h
@@ -0,0 +1,72 @@
+#ifndef _STLP_PTRS_SPECIALIZE_H
+# define _STLP_PTRS_SPECIALIZE_H
+
+// the following is a workaround for arrow operator problems
+# if defined ( _STLP_NO_ARROW_OPERATOR )
+// User wants to disable proxy -> operators
+# define _STLP_DEFINE_ARROW_OPERATOR
+# define _STLP_ARROW_SPECIALIZE_WITH_PTRS(_Tp)
+# else
+// Compiler can handle generic -> operator.
+# define _STLP_ARROW_SPECIALIZE_WITH_PTRS(_Tp)
+# ifdef __BORLANDC__
+# define _STLP_DEFINE_ARROW_OPERATOR pointer operator->() const { return &(*(*this)); }
+# elif defined ( _STLP_WINCE ) || defined(__WATCOMC__)
+# define _STLP_DEFINE_ARROW_OPERATOR pointer operator->() const { reference x = operator*(); return &x; }
+# else
+# define _STLP_DEFINE_ARROW_OPERATOR pointer operator->() const { return &(operator*()); }
+# endif
+# endif /* _STLP_NO_ARROW_OPERATOR */
+
+// Important pointers specializations
+
+# ifdef _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+# define _STLP_TYPE_TRAITS_POD_SPECIALIZE_V(_Type)
+# define _STLP_TYPE_TRAITS_POD_SPECIALIZE(_Type)
+# else
+# define _STLP_TYPE_TRAITS_POD_SPECIALIZE(_Type) _STLP_TEMPLATE_NULL struct __type_traits<_Type> : __type_traits_aux<true> {};
+# define _STLP_TYPE_TRAITS_POD_SPECIALIZE_V(_Type) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(_Type*) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(const _Type*) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(_Type**) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(_Type* const *) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(const _Type**) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(_Type***) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(const _Type***)
+# endif
+
+# define _STLP_POINTERS_SPECIALIZE(_Type) _STLP_TYPE_TRAITS_POD_SPECIALIZE_V(_Type) _STLP_ARROW_SPECIALIZE_WITH_PTRS(_Type)
+
+# if !defined ( _STLP_NO_BOOL )
+_STLP_POINTERS_SPECIALIZE( bool )
+# endif
+_STLP_TYPE_TRAITS_POD_SPECIALIZE_V(void)
+# ifndef _STLP_NO_SIGNED_BUILTINS
+ _STLP_POINTERS_SPECIALIZE( signed char )
+# endif
+ _STLP_POINTERS_SPECIALIZE( char )
+ _STLP_POINTERS_SPECIALIZE( unsigned char )
+ _STLP_POINTERS_SPECIALIZE( short )
+ _STLP_POINTERS_SPECIALIZE( unsigned short )
+ _STLP_POINTERS_SPECIALIZE( int )
+ _STLP_POINTERS_SPECIALIZE( unsigned int )
+ _STLP_POINTERS_SPECIALIZE( long )
+ _STLP_POINTERS_SPECIALIZE( unsigned long )
+ _STLP_POINTERS_SPECIALIZE( float )
+ _STLP_POINTERS_SPECIALIZE( double )
+# if !defined ( _STLP_NO_LONG_DOUBLE )
+ _STLP_POINTERS_SPECIALIZE( long double )
+# endif
+# if defined ( _STLP_LONG_LONG)
+ _STLP_POINTERS_SPECIALIZE( _STLP_LONG_LONG )
+ _STLP_POINTERS_SPECIALIZE( unsigned _STLP_LONG_LONG )
+# endif
+#if defined ( _STLP_HAS_WCHAR_T ) && ! defined (_STLP_WCHAR_T_IS_USHORT)
+ _STLP_POINTERS_SPECIALIZE( wchar_t )
+# endif
+
+# undef _STLP_ARROW_SPECIALIZE
+# undef _STLP_ARROW_SPECIALIZE_WITH_PTRS
+# undef _STLP_TYPE_TRAITS_POD_SPECIALIZE_V
+
+#endif
diff --git a/src/STLport/stl/_queue.h b/src/STLport/stl/_queue.h
new file mode 100644
index 0000000..d95e42f
--- /dev/null
+++ b/src/STLport/stl/_queue.h
@@ -0,0 +1,212 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_QUEUE_H
+#define _STLP_INTERNAL_QUEUE_H
+
+#ifndef _STLP_INTERNAL_DEQUE_H
+# include <stl/_deque.h>
+#endif
+
+#ifndef _STLP_INTERNAL_VECTOR_H
+# include <stl/_vector.h>
+#endif
+
+#ifndef _STLP_INTERNAL_HEAP_H
+# include <stl/_heap.h>
+#endif
+
+#ifndef _STLP_INTERNAL_FUNCTION_H
+# include <stl/_function.h>
+#endif
+
+#if defined(__SC__) && !defined(__DMC__) //*ty 12/07/2001 - since "comp" is a built-in type and reserved under SCpp
+#define comp _Comp
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if ! defined ( _STLP_LIMITED_DEFAULT_TEMPLATES )
+template <class _Tp, class _Sequence = deque<_Tp> >
+# elif defined ( _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS )
+# define _STLP_QUEUE_ARGS _Tp
+template <class _Tp>
+# else
+template <class _Tp, class _Sequence>
+# endif
+
+class queue {
+# if defined ( _STLP_QUEUE_ARGS )
+ typedef deque<_Tp> _Sequence;
+# endif
+public:
+ typedef typename _Sequence::value_type value_type;
+ typedef typename _Sequence::size_type size_type;
+ typedef _Sequence container_type;
+
+ typedef typename _Sequence::reference reference;
+ typedef typename _Sequence::const_reference const_reference;
+
+protected:
+ _Sequence c;
+public:
+ queue() : c() {}
+ explicit queue(const _Sequence& __c) : c(__c) {}
+
+ bool empty() const { return c.empty(); }
+ size_type size() const { return c.size(); }
+ reference front() { return c.front(); }
+ const_reference front() const { return c.front(); }
+ reference back() { return c.back(); }
+ const_reference back() const { return c.back(); }
+ void push(const value_type& __x) { c.push_back(__x); }
+ void pop() { c.pop_front(); }
+ const _Sequence& _Get_c() const { return c; }
+};
+
+# ifndef _STLP_QUEUE_ARGS
+# define _STLP_QUEUE_ARGS _Tp, _Sequence
+# define _STLP_QUEUE_HEADER_ARGS class _Tp, class _Sequence
+# else
+# define _STLP_QUEUE_HEADER_ARGS class _Tp
+# endif
+
+template < _STLP_QUEUE_HEADER_ARGS >
+inline bool _STLP_CALL
+operator==(const queue<_STLP_QUEUE_ARGS >& __x, const queue<_STLP_QUEUE_ARGS >& __y)
+{
+ return __x._Get_c() == __y._Get_c();
+}
+
+template < _STLP_QUEUE_HEADER_ARGS >
+inline bool _STLP_CALL
+operator<(const queue<_STLP_QUEUE_ARGS >& __x, const queue<_STLP_QUEUE_ARGS >& __y)
+{
+ return __x._Get_c() < __y._Get_c();
+}
+
+_STLP_RELOPS_OPERATORS( template < _STLP_QUEUE_HEADER_ARGS >, queue<_STLP_QUEUE_ARGS > )
+
+# if !(defined ( _STLP_LIMITED_DEFAULT_TEMPLATES ) || defined ( _STLP_TEMPLATE_PARAM_SUBTYPE_BUG ))
+template <class _Tp, class _Sequence = vector<_Tp>,
+ class _Compare = less<_STLP_HEADER_TYPENAME _Sequence::value_type> >
+# elif defined ( _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS )
+template <class _Tp>
+# else
+template <class _Tp, class _Sequence, class _Compare>
+# endif
+class priority_queue {
+# ifdef _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS
+ typedef vector<_Tp> _Sequence;
+ typedef less< typename vector<_Tp>::value_type> _Compare;
+# endif
+public:
+ typedef typename _Sequence::value_type value_type;
+ typedef typename _Sequence::size_type size_type;
+ typedef _Sequence container_type;
+
+ typedef typename _Sequence::reference reference;
+ typedef typename _Sequence::const_reference const_reference;
+protected:
+ _Sequence c;
+ _Compare comp;
+public:
+ priority_queue() : c() {}
+ explicit priority_queue(const _Compare& __x) : c(), comp(__x) {}
+ priority_queue(const _Compare& __x, const _Sequence& __s)
+ : c(__s), comp(__x)
+ { make_heap(c.begin(), c.end(), comp); }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ priority_queue(_InputIterator __first, _InputIterator __last)
+ : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }
+
+ template <class _InputIterator>
+ priority_queue(_InputIterator __first,
+ _InputIterator __last, const _Compare& __x)
+ : c(__first, __last), comp(__x)
+ { make_heap(c.begin(), c.end(), comp); }
+
+ template <class _InputIterator>
+ priority_queue(_InputIterator __first, _InputIterator __last,
+ const _Compare& __x, const _Sequence& __s)
+ : c(__s), comp(__x)
+ {
+ c.insert(c.end(), __first, __last);
+ make_heap(c.begin(), c.end(), comp);
+ }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+ priority_queue(const value_type* __first, const value_type* __last)
+ : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }
+
+ priority_queue(const value_type* __first, const value_type* __last,
+ const _Compare& __x)
+ : c(__first, __last), comp(__x)
+ { make_heap(c.begin(), c.end(), comp); }
+
+ priority_queue(const value_type* __first, const value_type* __last,
+ const _Compare& __x, const _Sequence& __c)
+ : c(__c), comp(__x)
+ {
+ c.insert(c.end(), __first, __last);
+ make_heap(c.begin(), c.end(), comp);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ bool empty() const { return c.empty(); }
+ size_type size() const { return c.size(); }
+ const_reference top() const { return c.front(); }
+ void push(const value_type& __x) {
+ _STLP_TRY {
+ c.push_back(__x);
+ push_heap(c.begin(), c.end(), comp);
+ }
+ _STLP_UNWIND(c.clear());
+ }
+ void pop() {
+ _STLP_TRY {
+ pop_heap(c.begin(), c.end(), comp);
+ c.pop_back();
+ }
+ _STLP_UNWIND(c.clear());
+ }
+};
+
+_STLP_END_NAMESPACE
+
+# undef _STLP_QUEUE_ARGS
+# undef _STLP_QUEUE_HEADER_ARGS
+
+#endif /* _STLP_INTERNAL_QUEUE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_range_errors.h b/src/STLport/stl/_range_errors.h
new file mode 100644
index 0000000..0f7fa03
--- /dev/null
+++ b/src/STLport/stl/_range_errors.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef _STLP_RANGE_ERRORS_H
+#define _STLP_RANGE_ERRORS_H
+
+// A few places in the STL throw range errors, using standard exception
+// classes defined in <stdexcept>. This header file provides functions
+// to throw those exception objects.
+
+// _STLP_DONT_THROW_RANGE_ERRORS is a hook so that users can disable
+// this exception throwing.
+#if defined(_STLP_CAN_THROW_RANGE_ERRORS) && defined(_STLP_USE_EXCEPTIONS) \
+ && !defined(_STLP_DONT_THROW_RANGE_ERRORS)
+# define _STLP_THROW_RANGE_ERRORS
+#endif
+
+// For the STLport iostreams, only declaration here, definition is in the lib
+
+#if defined ( _STLP_OWN_IOSTREAMS ) && ! defined (_STLP_EXTERN_RANGE_ERRORS)
+# define _STLP_EXTERN_RANGE_ERRORS
+# endif
+
+#if defined (_STLP_EXTERN_RANGE_ERRORS)
+_STLP_BEGIN_NAMESPACE
+void _STLP_DECLSPEC _STLP_CALL __stl_throw_range_error(const char* __msg);
+void _STLP_DECLSPEC _STLP_CALL __stl_throw_out_of_range(const char* __msg);
+void _STLP_DECLSPEC _STLP_CALL __stl_throw_length_error(const char* __msg);
+void _STLP_DECLSPEC _STLP_CALL __stl_throw_invalid_argument(const char* __msg);
+void _STLP_DECLSPEC _STLP_CALL __stl_throw_overflow_error(const char* __msg);
+_STLP_END_NAMESPACE
+#else
+
+#if defined(_STLP_THROW_RANGE_ERRORS)
+# ifndef _STLP_STDEXCEPT
+# include <stdexcept>
+# endif
+# ifndef _STLP_STRING
+# include <string>
+# endif
+# define _STLP_THROW_MSG(ex,msg) throw ex(string(msg))
+#else
+# if defined (_STLP_WINCE)
+# define _STLP_THROW_MSG(ex,msg) TerminateProcess(GetCurrentProcess(), 0)
+# else
+# include <cstdlib>
+# include <cstdio>
+# define _STLP_THROW_MSG(ex,msg) puts(msg),_STLP_ABORT()
+# endif
+#endif
+
+// For wrapper mode and throwing range errors, include the
+// stdexcept header and throw the appropriate exceptions directly.
+
+_STLP_BEGIN_NAMESPACE
+inline void _STLP_DECLSPEC _STLP_CALL __stl_throw_range_error(const char* __msg) {
+ _STLP_THROW_MSG(range_error, __msg);
+}
+
+inline void _STLP_DECLSPEC _STLP_CALL __stl_throw_out_of_range(const char* __msg) {
+ _STLP_THROW_MSG(out_of_range, __msg);
+}
+
+inline void _STLP_DECLSPEC _STLP_CALL __stl_throw_length_error(const char* __msg) {
+ _STLP_THROW_MSG(length_error, __msg);
+}
+
+inline void _STLP_DECLSPEC _STLP_CALL __stl_throw_invalid_argument(const char* __msg) {
+ _STLP_THROW_MSG(invalid_argument, __msg);
+}
+
+inline void _STLP_DECLSPEC _STLP_CALL __stl_throw_overflow_error(const char* __msg) {
+ _STLP_THROW_MSG(overflow_error, __msg);
+}
+_STLP_END_NAMESPACE
+
+# undef _STLP_THROW_MSG
+
+# endif /* EXTERN_RANGE_ERRORS */
+
+
+#endif /* _STLP_RANGE_ERRORS_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_raw_storage_iter.h b/src/STLport/stl/_raw_storage_iter.h
new file mode 100644
index 0000000..7d253f3
--- /dev/null
+++ b/src/STLport/stl/_raw_storage_iter.h
@@ -0,0 +1,82 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_RAW_STORAGE_ITERATOR_H
+#define _STLP_INTERNAL_RAW_STORAGE_ITERATOR_H
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _ForwardIterator, class _Tp>
+class raw_storage_iterator
+# ifdef _STLP_HAS_VOID_SPECIALIZATION
+ : public iterator<output_iterator_tag,void,void,void,void>
+# endif
+{
+protected:
+ _ForwardIterator _M_iter;
+public:
+ typedef output_iterator_tag iterator_category;
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+# endif
+ explicit raw_storage_iterator(_ForwardIterator __x) : _M_iter(__x) {}
+ raw_storage_iterator<_ForwardIterator, _Tp>& operator*() { return *this; }
+ raw_storage_iterator<_ForwardIterator, _Tp>& operator=(const _Tp& __element) {
+ _Construct(&*_M_iter, __element);
+ return *this;
+ }
+ raw_storage_iterator<_ForwardIterator, _Tp>& operator++() {
+ ++_M_iter;
+ return *this;
+ }
+ raw_storage_iterator<_ForwardIterator, _Tp> operator++(int) {
+ raw_storage_iterator<_ForwardIterator, _Tp> __tmp = *this;
+ ++_M_iter;
+ return __tmp;
+ }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _ForwardIterator, class _Tp>
+inline output_iterator_tag iterator_category(const raw_storage_iterator<_ForwardIterator, _Tp>&) { return output_iterator_tag(); }
+#endif
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_RAW_STORAGE_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_relops.h b/src/STLport/stl/_relops.h
new file mode 100644
index 0000000..e186cd3
--- /dev/null
+++ b/src/STLport/stl/_relops.h
@@ -0,0 +1,33 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_relops_cont.h b/src/STLport/stl/_relops_cont.h
new file mode 100644
index 0000000..bbbf513
--- /dev/null
+++ b/src/STLport/stl/_relops_cont.h
@@ -0,0 +1,29 @@
+// This is an implementation file which
+// is intended to be included multiple times with different _STLP_ASSOCIATIVE_CONTAINER
+// setting
+
+#ifndef _STLP_EQUAL_OPERATOR_SPECIALIZED
+_STLP_TEMPLATE_HEADER
+inline bool _STLP_CALL operator==(const _STLP_TEMPLATE_CONTAINER& __x,
+ const _STLP_TEMPLATE_CONTAINER& __y) {
+ return __x.size() == __y.size() &&
+ equal(__x.begin(), __x.end(), __y.begin());
+}
+#endif /* _STLP_EQUAL_OPERATOR_SPECIALIZED */
+
+_STLP_TEMPLATE_HEADER
+inline bool _STLP_CALL operator<(const _STLP_TEMPLATE_CONTAINER& __x,
+ const _STLP_TEMPLATE_CONTAINER& __y) {
+ return lexicographical_compare(__x.begin(), __x.end(),
+ __y.begin(), __y.end());
+}
+
+_STLP_RELOPS_OPERATORS( _STLP_TEMPLATE_HEADER , _STLP_TEMPLATE_CONTAINER )
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+_STLP_TEMPLATE_HEADER
+inline void _STLP_CALL swap(_STLP_TEMPLATE_CONTAINER& __x,
+ _STLP_TEMPLATE_CONTAINER& __y) {
+ __x.swap(__y);
+}
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
diff --git a/src/STLport/stl/_relops_hash_cont.h b/src/STLport/stl/_relops_hash_cont.h
new file mode 100644
index 0000000..8739567
--- /dev/null
+++ b/src/STLport/stl/_relops_hash_cont.h
@@ -0,0 +1,32 @@
+// This is an implementation file which
+// is intended to be included multiple times with different _STLP_ASSOCIATIVE_CONTAINER
+// setting
+
+_STLP_TEMPLATE_HEADER
+inline bool _STLP_CALL
+operator==(const _STLP_TEMPLATE_CONTAINER& __hm1, const _STLP_TEMPLATE_CONTAINER& __hm2)
+{
+ return _STLP_TEMPLATE_CONTAINER::_M_equal(__hm1, __hm2);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+_STLP_TEMPLATE_HEADER
+inline bool _STLP_CALL
+operator!=(const _STLP_TEMPLATE_CONTAINER& __hm1, const _STLP_TEMPLATE_CONTAINER& __hm2) {
+ return !(__hm1 == __hm2);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+_STLP_TEMPLATE_HEADER
+inline void _STLP_CALL
+swap(_STLP_TEMPLATE_CONTAINER& __hm1, _STLP_TEMPLATE_CONTAINER& __hm2)
+{
+ __hm1.swap(__hm2);
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
diff --git a/src/STLport/stl/_relops_template.h b/src/STLport/stl/_relops_template.h
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/STLport/stl/_relops_template.h
@@ -0,0 +1 @@
+
diff --git a/src/STLport/stl/_rope.c b/src/STLport/stl/_rope.c
new file mode 100644
index 0000000..1820e7c
--- /dev/null
+++ b/src/STLport/stl/_rope.c
@@ -0,0 +1,1540 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+// Set buf_start, buf_end, and buf_ptr appropriately, filling tmp_buf
+// if necessary. Assumes path_end[leaf_index] and leaf_pos are correct.
+// Results in a valid buf_ptr if the iterator can be legitimately
+// dereferenced.
+# ifndef _STLP_ROPEIMPL_H
+# define _STLP_ROPEIMPL_H
+
+#ifndef _STLP_INTERNAL_ROPE_H
+# include <stl/_rope.h>
+#endif
+
+# ifndef _STLP_CSTDIO
+# include <cstdio>
+# endif
+
+#ifndef _STLP_IOSTREAM
+# include <iostream>
+#endif
+
+# include <stl/_range_errors.h>
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+# define __allocator__ _Alloc
+# else
+# define __allocator__ allocator_type
+# endif
+
+template<class _CharT, class _Alloc>
+_Rope_iterator<_CharT, _Alloc>::_Rope_iterator(rope<_CharT,_Alloc>* __r, size_t __pos)
+ : _Rope_iterator_base<_CharT,_Alloc>(__r->_M_tree_ptr._M_data, __pos),
+ _M_root_rope(__r) { _RopeRep::_S_ref(this->_M_root); }
+
+template<class _CharT, class _Alloc>
+_Rope_iterator<_CharT, _Alloc>::_Rope_iterator(rope<_CharT,_Alloc>& __r, size_t __pos):
+ _Rope_iterator_base<_CharT,_Alloc>(__r._M_tree_ptr._M_data, __pos),
+ _M_root_rope(&__r) {
+ _RopeRep::_S_ref(this->_M_root); if (!(__r.empty()))_S_setcache(*this);
+}
+
+template<class _CharT, class _Alloc>
+void
+_Rope_RopeRep<_CharT, _Alloc>::_M_free_c_string()
+{
+ _CharT* __cstr = _M_c_string;
+ if (0 != __cstr) {
+ size_t _p_size = _M_size._M_data + 1;
+ _STLP_STD::_Destroy(__cstr, __cstr + _p_size);
+ _M_size.deallocate(__cstr, _p_size);
+ }
+}
+
+
+// Set buf_start, buf_end, and buf_ptr appropriately, filling tmp_buf
+// if necessary. Assumes _M_path_end[leaf_index] and leaf_pos are correct.
+// Results in a valid buf_ptr if the iterator can be legitimately
+// dereferenced.
+template <class _CharT, class _Alloc>
+void _Rope_iterator_base<_CharT,_Alloc>::_S_setbuf(
+ _Rope_iterator_base<_CharT,_Alloc>& __x)
+{
+ const _RopeRep* __leaf = __x._M_path_end[__x._M_leaf_index];
+ size_t __leaf_pos = __x._M_leaf_pos;
+ size_t __pos = __x._M_current_pos;
+
+ switch(__leaf->_M_tag) {
+ case _RopeRep::_S_leaf:
+ __x._M_buf_start =
+ ((_Rope_RopeLeaf<_CharT,_Alloc>*)__leaf)->_M_data;
+ __x._M_buf_ptr = __x._M_buf_start + (__pos - __leaf_pos);
+ __x._M_buf_end = __x._M_buf_start + __leaf->_M_size._M_data;
+ break;
+ case _RopeRep::_S_function:
+ case _RopeRep::_S_substringfn:
+ {
+ size_t __len = _S_iterator_buf_len;
+ size_t __buf_start_pos = __leaf_pos;
+ size_t __leaf_end = __leaf_pos + __leaf->_M_size._M_data;
+ char_producer<_CharT>* __fn =
+ ((_Rope_RopeFunction<_CharT,_Alloc>*)__leaf)->_M_fn;
+
+ if (__buf_start_pos + __len <= __pos) {
+ __buf_start_pos = __pos - __len/4;
+ if (__buf_start_pos + __len > __leaf_end) {
+ __buf_start_pos = __leaf_end - __len;
+ }
+ }
+ if (__buf_start_pos + __len > __leaf_end) {
+ __len = __leaf_end - __buf_start_pos;
+ }
+ (*__fn)(__buf_start_pos - __leaf_pos, __len, __x._M_tmp_buf);
+ __x._M_buf_ptr = __x._M_tmp_buf + (__pos - __buf_start_pos);
+ __x._M_buf_start = __x._M_tmp_buf;
+ __x._M_buf_end = __x._M_tmp_buf + __len;
+ }
+ break;
+ default:
+ _STLP_ASSERT(0)
+ ;
+ }
+}
+
+// Set path and buffer inside a rope iterator. We assume that
+// pos and root are already set.
+template <class _CharT, class _Alloc>
+void _Rope_iterator_base<_CharT,_Alloc>::_S_setcache
+(_Rope_iterator_base<_CharT,_Alloc>& __x)
+{
+ const _RopeRep* __path[_RopeRep::_S_max_rope_depth+1];
+ const _RopeRep* __curr_rope;
+ int __curr_depth = -1; /* index into path */
+ size_t __curr_start_pos = 0;
+ size_t __pos = __x._M_current_pos;
+ unsigned char __dirns = 0; // Bit vector marking right turns in the path
+
+ _STLP_ASSERT(__pos <= __x._M_root->_M_size._M_data)
+ if (__pos >= __x._M_root->_M_size._M_data) {
+ __x._M_buf_ptr = 0;
+ return;
+ }
+ __curr_rope = __x._M_root;
+ if (0 != __curr_rope->_M_c_string) {
+ /* Treat the root as a leaf. */
+ __x._M_buf_start = __curr_rope->_M_c_string;
+ __x._M_buf_end = __curr_rope->_M_c_string + __curr_rope->_M_size._M_data;
+ __x._M_buf_ptr = __curr_rope->_M_c_string + __pos;
+ __x._M_path_end[0] = __curr_rope;
+ __x._M_leaf_index = 0;
+ __x._M_leaf_pos = 0;
+ return;
+ }
+ for(;;) {
+ ++__curr_depth;
+ _STLP_ASSERT(__curr_depth <= _RopeRep::_S_max_rope_depth)
+ __path[__curr_depth] = __curr_rope;
+ switch(__curr_rope->_M_tag) {
+ case _RopeRep::_S_leaf:
+ case _RopeRep::_S_function:
+ case _RopeRep::_S_substringfn:
+ __x._M_leaf_pos = __curr_start_pos;
+ goto done;
+ case _RopeRep::_S_concat:
+ {
+ _Rope_RopeConcatenation<_CharT,_Alloc>* __c =
+ (_Rope_RopeConcatenation<_CharT,_Alloc>*)__curr_rope;
+ _RopeRep* __left = __c->_M_left;
+ size_t __left_len = __left->_M_size._M_data;
+
+ __dirns <<= 1;
+ if (__pos >= __curr_start_pos + __left_len) {
+ __dirns |= 1;
+ __curr_rope = __c->_M_right;
+ __curr_start_pos += __left_len;
+ } else {
+ __curr_rope = __left;
+ }
+ }
+ break;
+ }
+ }
+ done:
+ // Copy last section of path into _M_path_end.
+ {
+ int __i = -1;
+ int __j = __curr_depth + 1 - _S_path_cache_len;
+
+ if (__j < 0) __j = 0;
+ while (__j <= __curr_depth) {
+ __x._M_path_end[++__i] = __path[__j++];
+ }
+ __x._M_leaf_index = __i;
+ }
+ __x._M_path_directions = __dirns;
+ _S_setbuf(__x);
+}
+
+// Specialized version of the above. Assumes that
+// the path cache is valid for the previous position.
+template <class _CharT, class _Alloc>
+void _Rope_iterator_base<_CharT,_Alloc>::_S_setcache_for_incr
+(_Rope_iterator_base<_CharT,_Alloc>& __x)
+{
+ int __current_index = __x._M_leaf_index;
+ const _RopeRep* __current_node = __x._M_path_end[__current_index];
+ size_t __len = __current_node->_M_size._M_data;
+ size_t __node_start_pos = __x._M_leaf_pos;
+ unsigned char __dirns = __x._M_path_directions;
+ _Rope_RopeConcatenation<_CharT,_Alloc>* __c;
+
+ _STLP_ASSERT(__x._M_current_pos <= __x._M_root->_M_size._M_data)
+ if (__x._M_current_pos - __node_start_pos < __len) {
+ /* More stuff in this leaf, we just didn't cache it. */
+ _S_setbuf(__x);
+ return;
+ }
+ _STLP_ASSERT(__node_start_pos + __len == __x._M_current_pos)
+ // node_start_pos is starting position of last_node.
+ while (--__current_index >= 0) {
+ if (!(__dirns & 1) /* Path turned left */)
+ break;
+ __current_node = __x._M_path_end[__current_index];
+ __c = (_Rope_RopeConcatenation<_CharT,_Alloc>*)__current_node;
+ // Otherwise we were in the right child. Thus we should pop
+ // the concatenation node.
+ __node_start_pos -= __c->_M_left->_M_size._M_data;
+ __dirns >>= 1;
+ }
+ if (__current_index < 0) {
+ // We underflowed the cache. Punt.
+ _S_setcache(__x);
+ return;
+ }
+ __current_node = __x._M_path_end[__current_index];
+ __c = (_Rope_RopeConcatenation<_CharT,_Alloc>*)__current_node;
+ // current_node is a concatenation node. We are positioned on the first
+ // character in its right child.
+ // node_start_pos is starting position of current_node.
+ __node_start_pos += __c->_M_left->_M_size._M_data;
+ __current_node = __c->_M_right;
+ __x._M_path_end[++__current_index] = __current_node;
+ __dirns |= 1;
+ while (_RopeRep::_S_concat == __current_node->_M_tag) {
+ ++__current_index;
+ if (_S_path_cache_len == __current_index) {
+ int __i;
+ for (__i = 0; __i < _S_path_cache_len-1; __i++) {
+ __x._M_path_end[__i] = __x._M_path_end[__i+1];
+ }
+ --__current_index;
+ }
+ __current_node =
+ ((_Rope_RopeConcatenation<_CharT,_Alloc>*)__current_node)->_M_left;
+ __x._M_path_end[__current_index] = __current_node;
+ __dirns <<= 1;
+ // node_start_pos is unchanged.
+ }
+ __x._M_leaf_index = __current_index;
+ __x._M_leaf_pos = __node_start_pos;
+ __x._M_path_directions = __dirns;
+ _S_setbuf(__x);
+}
+
+template <class _CharT, class _Alloc>
+void _Rope_iterator_base<_CharT,_Alloc>::_M_incr(size_t __n) {
+ _M_current_pos += __n;
+ if (0 != _M_buf_ptr) {
+ size_t __chars_left = _M_buf_end - _M_buf_ptr;
+ if (__chars_left > __n) {
+ _M_buf_ptr += __n;
+ } else if (__chars_left == __n) {
+ _M_buf_ptr += __n;
+ _S_setcache_for_incr(*this);
+ } else {
+ _M_buf_ptr = 0;
+ }
+ }
+}
+
+template <class _CharT, class _Alloc>
+void _Rope_iterator_base<_CharT,_Alloc>::_M_decr(size_t __n) {
+ if (0 != _M_buf_ptr) {
+ size_t __chars_left = _M_buf_ptr - _M_buf_start;
+ if (__chars_left >= __n) {
+ _M_buf_ptr -= __n;
+ } else {
+ _M_buf_ptr = 0;
+ }
+ }
+ _M_current_pos -= __n;
+}
+
+template <class _CharT, class _Alloc>
+void _Rope_iterator<_CharT,_Alloc>::_M_check() {
+ if (_M_root_rope->_M_tree_ptr._M_data != this->_M_root) {
+ // _Rope was modified. Get things fixed up.
+ _RopeRep::_S_unref(this->_M_root);
+ this->_M_root = _M_root_rope->_M_tree_ptr._M_data;
+ _RopeRep::_S_ref(this->_M_root);
+ this->_M_buf_ptr = 0;
+ }
+}
+
+# ifndef _GC
+// There are several reasons for not doing this with virtual destructors
+// and a class specific delete operator:
+// - A class specific delete operator can't easily get access to
+// allocator instances if we need them.
+// - Any virtual function would need a 4 or byte vtable pointer;
+// this only requires a one byte tag per object.
+template <class _CharT, class _Alloc>
+void _Rope_RopeRep<_CharT,_Alloc>::_M_free_tree()
+{
+ switch(_M_tag) {
+ case _S_leaf:
+ {
+ typedef _Rope_RopeLeaf<_CharT,_Alloc> _Rope_RopeLeaf_T;
+ _Rope_RopeLeaf_T* __l = (_Rope_RopeLeaf_T*)this;
+ _STLP_STD::_Destroy(__l); // ->_Rope_RopeLeaf<_CharT,_Alloc>::~_Rope_RopeLeaf();
+ _STLP_CREATE_ALLOCATOR(allocator_type,(const allocator_type&)_M_size, _Rope_RopeLeaf_T).deallocate(__l, 1);
+ break;
+ }
+ case _S_concat:
+ {
+ typedef _Rope_RopeConcatenation<_CharT,_Alloc> _Rope_RopeConcatenation_T;
+ _Rope_RopeConcatenation_T* __c = (_Rope_RopeConcatenation_T*)this;
+ _STLP_STD::_Destroy(__c);
+ _STLP_CREATE_ALLOCATOR(allocator_type,(const allocator_type&)_M_size,
+ _Rope_RopeConcatenation_T).deallocate(__c, 1);
+ break;
+ }
+ case _S_function:
+ {
+ typedef _Rope_RopeFunction<_CharT,_Alloc> _Rope_RopeFunctionT;
+ _Rope_RopeFunctionT* __f = (_Rope_RopeFunctionT*)this;
+ _STLP_STD::_Destroy(__f);
+ _STLP_CREATE_ALLOCATOR(allocator_type,(const allocator_type&)_M_size,
+ _Rope_RopeFunctionT).deallocate(__f, 1);
+ break;
+ }
+ case _S_substringfn:
+ {
+ typedef _Rope_RopeSubstring<_CharT,_Alloc> _Rope_RopeSubstring_T;
+ _Rope_RopeSubstring_T* __ss = (_Rope_RopeSubstring_T*)this;
+ _STLP_STD::_Destroy(__ss);
+ _STLP_CREATE_ALLOCATOR(allocator_type,(const allocator_type&)_M_size,
+ _Rope_RopeSubstring_T).deallocate(__ss, 1);
+ break;
+ }
+ }
+}
+#endif
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+# define __RopeLeaf__ _Rope_RopeLeaf<_CharT,_Alloc>
+# define __RopeRep__ _Rope_RopeRep<_CharT,_Alloc>
+# define _RopeLeaf _Rope_RopeLeaf<_CharT,_Alloc>
+# define _RopeRep _Rope_RopeRep<_CharT,_Alloc>
+# define size_type size_t
+# else
+# define __RopeLeaf__ _STLP_TYPENAME_ON_RETURN_TYPE rope<_CharT,_Alloc>::_RopeLeaf
+# define __RopeRep__ _STLP_TYPENAME_ON_RETURN_TYPE rope<_CharT,_Alloc>::_RopeRep
+# endif
+
+// Concatenate a C string onto a leaf rope by copying the rope data.
+// Used for short ropes.
+template <class _CharT, class _Alloc>
+__RopeLeaf__*
+rope<_CharT,_Alloc>::_S_leaf_concat_char_iter
+ (_RopeLeaf* __r, const _CharT* __iter, size_t __len)
+{
+ size_t __old_len = __r->_M_size._M_data;
+ _CharT* __new_data = __r->_M_size.allocate(_S_rounded_up_size(__old_len + __len));
+ _RopeLeaf* __result;
+
+ uninitialized_copy_n(__r->_M_data, __old_len, __new_data);
+ uninitialized_copy_n(__iter, __len, __new_data + __old_len);
+ _S_cond_store_eos(__new_data[__old_len + __len]);
+ _STLP_TRY {
+ __result = _S_new_RopeLeaf(__new_data, __old_len + __len,
+ __r->get_allocator());
+ }
+ _STLP_UNWIND(_RopeRep::_S_free_string(__new_data, __old_len + __len,
+ __r->get_allocator()));
+ return __result;
+}
+
+#ifndef __GC
+// As above, but it's OK to clobber original if refcount is 1
+template <class _CharT, class _Alloc>
+__RopeLeaf__*
+rope<_CharT,_Alloc>::_S_destr_leaf_concat_char_iter
+ (_RopeLeaf* __r, const _CharT* __iter, size_t __len)
+{
+ _STLP_ASSERT(__r->_M_ref_count >= 1)
+ if (__r->_M_ref_count > 1)
+ return _S_leaf_concat_char_iter(__r, __iter, __len);
+ size_t __old_len = __r->_M_size._M_data;
+ if (_S_allocated_capacity(__old_len) >= __old_len + __len) {
+ // The space has been partially initialized for the standard
+ // character types. But that doesn't matter for those types.
+ uninitialized_copy_n(__iter, __len, __r->_M_data + __old_len);
+ if (_S_is_basic_char_type((_CharT*)0)) {
+ _S_cond_store_eos(__r->_M_data[__old_len + __len]);
+ _STLP_ASSERT(__r->_M_c_string == __r->_M_data)
+ } else if (__r->_M_c_string != __r->_M_data && 0 != __r->_M_c_string) {
+ __r->_M_free_c_string();
+ __r->_M_c_string = 0;
+ }
+ __r->_M_size._M_data = __old_len + __len;
+ _STLP_ASSERT(__r->_M_ref_count == 1)
+ __r->_M_ref_count = 2;
+ return __r;
+ } else {
+ _RopeLeaf* __result = _S_leaf_concat_char_iter(__r, __iter, __len);
+ _STLP_ASSERT(__result->_M_ref_count == 1)
+ return __result;
+ }
+}
+#endif
+
+// Assumes left and right are not 0.
+// Does not increment (nor decrement on exception) child reference counts.
+// Result has ref count 1.
+template <class _CharT, class _Alloc>
+__RopeRep__*
+rope<_CharT,_Alloc>::_S_tree_concat (_RopeRep* __left, _RopeRep* __right)
+{
+ _RopeConcatenation* __result =
+ _S_new_RopeConcatenation(__left, __right, __left->get_allocator());
+ size_t __depth = __result->_M_depth;
+
+ _STLP_ASSERT(__left->get_allocator() == __right->get_allocator())
+ if (__depth > 20 && (__result->_M_size._M_data < 1000 ||
+ __depth > _RopeRep::_S_max_rope_depth)) {
+ _RopeRep* __balanced;
+
+ _STLP_TRY {
+ __balanced = _S_balance(__result);
+# ifndef __GC
+ if (__result != __balanced) {
+ _STLP_ASSERT(1 == __result->_M_ref_count
+ && 1 == __balanced->_M_ref_count)
+ }
+# endif
+ __result->_M_unref_nonnil();
+ }
+ _STLP_UNWIND((_STLP_CREATE_ALLOCATOR(allocator_type,(allocator_type&)__left->_M_size,
+ _RopeConcatenation).deallocate(__result,1)));
+ // In case of exception, we need to deallocate
+ // otherwise dangling result node. But caller
+ // still owns its children. Thus unref is
+ // inappropriate.
+ return __balanced;
+ } else {
+ return __result;
+ }
+}
+
+template <class _CharT, class _Alloc>
+__RopeRep__*
+rope<_CharT,_Alloc>::_S_concat_char_iter
+ (_RopeRep* __r, const _CharT*__s, size_t __slen)
+{
+ _RopeRep* __result;
+ if (0 == __slen) {
+ _S_ref(__r);
+ return __r;
+ }
+ if (0 == __r)
+ return _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen,
+ /* __r->get_allocator()*/ allocator_type() );
+ if (_RopeRep::_S_leaf == __r->_M_tag &&
+ __r->_M_size._M_data + __slen <= _S_copy_max) {
+ __result = _S_leaf_concat_char_iter((_RopeLeaf*)__r, __s, __slen);
+# ifndef __GC
+ _STLP_ASSERT(1 == __result->_M_ref_count)
+# endif
+ return __result;
+ }
+ if (_RopeRep::_S_concat == __r->_M_tag
+ && _RopeRep::_S_leaf == ((_RopeConcatenation*)__r)->_M_right->_M_tag) {
+ _RopeLeaf* __right =
+ (_RopeLeaf* )(((_RopeConcatenation* )__r)->_M_right);
+ if (__right->_M_size._M_data + __slen <= _S_copy_max) {
+ _RopeRep* __left = ((_RopeConcatenation*)__r)->_M_left;
+ _RopeRep* __nright =
+ _S_leaf_concat_char_iter((_RopeLeaf*)__right, __s, __slen);
+ __left->_M_ref_nonnil();
+ _STLP_TRY {
+ __result = _S_tree_concat(__left, __nright);
+ }
+ _STLP_UNWIND(_S_unref(__left); _S_unref(__nright));
+# ifndef __GC
+ _STLP_ASSERT(1 == __result->_M_ref_count)
+# endif
+ return __result;
+ }
+ }
+ _RopeRep* __nright =
+ _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __r->get_allocator());
+ _STLP_TRY {
+ __r->_M_ref_nonnil();
+ __result = _S_tree_concat(__r, __nright);
+ }
+ _STLP_UNWIND(_S_unref(__r); _S_unref(__nright));
+# ifndef __GC
+ _STLP_ASSERT(1 == __result->_M_ref_count)
+# endif
+ return __result;
+}
+
+#ifndef __GC
+template <class _CharT, class _Alloc>
+__RopeRep__*
+rope<_CharT,_Alloc>::_S_destr_concat_char_iter(
+ _RopeRep* __r, const _CharT* __s, size_t __slen)
+{
+ _RopeRep* __result;
+ if (0 == __r)
+ return _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen,
+ /* __r-> */allocator_type());
+ size_t __count = __r->_M_ref_count;
+ size_t __orig_size = __r->_M_size._M_data;
+ _STLP_ASSERT(__count >= 1)
+ if (__count > 1) return _S_concat_char_iter(__r, __s, __slen);
+ if (0 == __slen) {
+ __r->_M_ref_count = 2; // One more than before
+ return __r;
+ }
+ if (__orig_size + __slen <= _S_copy_max &&
+ _RopeRep::_S_leaf == __r->_M_tag) {
+ __result = _S_destr_leaf_concat_char_iter((_RopeLeaf*)__r, __s, __slen);
+ return __result;
+ }
+ if (_RopeRep::_S_concat == __r->_M_tag) {
+ _RopeLeaf* __right = (_RopeLeaf*)(((_RopeConcatenation*)__r)->_M_right);
+ if (_RopeRep::_S_leaf == __right->_M_tag
+ && __right->_M_size._M_data + __slen <= _S_copy_max) {
+ _RopeRep* __new_right =
+ _S_destr_leaf_concat_char_iter(__right, __s, __slen);
+ if (__right == __new_right) {
+ _STLP_ASSERT(__new_right->_M_ref_count == 2)
+ __new_right->_M_ref_count = 1;
+ } else {
+ _STLP_ASSERT(__new_right->_M_ref_count >= 1)
+ __right->_M_unref_nonnil();
+ }
+ _STLP_ASSERT(__r->_M_ref_count == 1)
+ __r->_M_ref_count = 2; // One more than before.
+ ((_RopeConcatenation*)__r)->_M_right = __new_right;
+ // E.Musser : moved below
+ // __r->_M_size._M_data = __orig_size + __slen;
+ if (0 != __r->_M_c_string) {
+ __r->_M_free_c_string();
+ __r->_M_c_string = 0;
+ }
+ __r->_M_size._M_data = __orig_size + __slen;
+ return __r;
+ }
+ }
+ _RopeRep* __right =
+ _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __r->get_allocator());
+ __r->_M_ref_nonnil();
+ _STLP_TRY {
+ __result = _S_tree_concat(__r, __right);
+ }
+ _STLP_UNWIND(_S_unref(__r); _S_unref(__right))
+ _STLP_ASSERT(1 == __result->_M_ref_count)
+ return __result;
+}
+#endif /* !__GC */
+
+template <class _CharT, class _Alloc>
+__RopeRep__*
+rope<_CharT,_Alloc>::_S_concat_rep(_RopeRep* __left, _RopeRep* __right)
+{
+ if (0 == __left) {
+ _S_ref(__right);
+ return __right;
+ }
+ if (0 == __right) {
+ __left->_M_ref_nonnil();
+ return __left;
+ }
+ if (_RopeRep::_S_leaf == __right->_M_tag) {
+ if (_RopeRep::_S_leaf == __left->_M_tag) {
+ if (__right->_M_size._M_data + __left->_M_size._M_data <= _S_copy_max) {
+ return _S_leaf_concat_char_iter((_RopeLeaf*)__left,
+ ((_RopeLeaf*)__right)->_M_data,
+ __right->_M_size._M_data);
+ }
+ } else if (_RopeRep::_S_concat == __left->_M_tag
+ && _RopeRep::_S_leaf ==
+ ((_RopeConcatenation*)__left)->_M_right->_M_tag) {
+ _RopeLeaf* __leftright =
+ (_RopeLeaf*)(((_RopeConcatenation*)__left)->_M_right);
+ if (__leftright->_M_size._M_data + __right->_M_size._M_data <= _S_copy_max) {
+ _RopeRep* __leftleft = ((_RopeConcatenation*)__left)->_M_left;
+ _RopeRep* __rest = _S_leaf_concat_char_iter(__leftright,
+ ((_RopeLeaf*)__right)->_M_data,
+ __right->_M_size._M_data);
+ __leftleft->_M_ref_nonnil();
+ _STLP_TRY {
+ return(_S_tree_concat(__leftleft, __rest));
+ }
+ _STLP_UNWIND(_S_unref(__leftleft); _S_unref(__rest))
+ }
+ }
+ }
+ __left->_M_ref_nonnil();
+ __right->_M_ref_nonnil();
+ _STLP_TRY {
+ return(_S_tree_concat(__left, __right));
+ }
+ _STLP_UNWIND(_S_unref(__left); _S_unref(__right));
+#ifdef _STLP_THROW_RETURN_BUG
+ return 0;
+#endif
+}
+
+template <class _CharT, class _Alloc>
+__RopeRep__*
+rope<_CharT,_Alloc>::_S_substring(_RopeRep* __base,
+ size_t __start, size_t __endp1)
+{
+ if (0 == __base) return 0;
+ size_t __len = __base->_M_size._M_data;
+ size_t __adj_endp1;
+ const size_t __lazy_threshold = 128;
+
+ if (__endp1 >= __len) {
+ if (0 == __start) {
+ __base->_M_ref_nonnil();
+ return __base;
+ } else {
+ __adj_endp1 = __len;
+ }
+ } else {
+ __adj_endp1 = __endp1;
+ }
+ switch(__base->_M_tag) {
+ case _RopeRep::_S_concat:
+ {
+ _RopeConcatenation* __c = (_RopeConcatenation*)__base;
+ _RopeRep* __left = __c->_M_left;
+ _RopeRep* __right = __c->_M_right;
+ size_t __left_len = __left->_M_size._M_data;
+ _RopeRep* __result;
+
+ if (__adj_endp1 <= __left_len) {
+ return _S_substring(__left, __start, __endp1);
+ } else if (__start >= __left_len) {
+ return _S_substring(__right, __start - __left_len,
+ __adj_endp1 - __left_len);
+ }
+ _Self_destruct_ptr __left_result(
+ _S_substring(__left, __start, __left_len));
+ _Self_destruct_ptr __right_result(
+ _S_substring(__right, 0, __endp1 - __left_len));
+ _STLP_MPWFIX_TRY //*TY 06/01/2000 - mpw forgets to call dtor on __left_result and __right_result without this try block
+ __result = _S_concat_rep(__left_result, __right_result);
+# ifndef __GC
+ _STLP_ASSERT(1 == __result->_M_ref_count)
+# endif
+ return __result;
+ _STLP_MPWFIX_CATCH //*TY 06/01/2000 -
+ }
+ case _RopeRep::_S_leaf:
+ {
+ _RopeLeaf* __l = (_RopeLeaf*)__base;
+ _RopeLeaf* __result;
+ size_t __result_len;
+ if (__start >= __adj_endp1) return 0;
+ __result_len = __adj_endp1 - __start;
+ if (__result_len > __lazy_threshold) goto lazy;
+# ifdef __GC
+ const _CharT* __section = __l->_M_data + __start;
+ __result = _S_new_RopeLeaf(__section, __result_len,
+ __base->get_allocator());
+ __result->_M_c_string = 0; // Not eos terminated.
+# else
+ // We should sometimes create substring node instead.
+ __result = _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(
+ __l->_M_data + __start, __result_len,
+ __base->get_allocator());
+# endif
+ return __result;
+ }
+ case _RopeRep::_S_substringfn:
+ // Avoid introducing multiple layers of substring nodes.
+ {
+ _RopeSubstring* __old = (_RopeSubstring*)__base;
+ size_t __result_len;
+ if (__start >= __adj_endp1) return 0;
+ __result_len = __adj_endp1 - __start;
+ if (__result_len > __lazy_threshold) {
+ _RopeSubstring* __result =
+ _S_new_RopeSubstring(__old->_M_base,
+ __start + __old->_M_start,
+ __adj_endp1 - __start,
+ __base->get_allocator());
+ return __result;
+
+ } // *** else fall through: ***
+ }
+ case _RopeRep::_S_function:
+ {
+ _RopeFunction* __f = (_RopeFunction*)__base;
+ if (__start >= __adj_endp1) return 0;
+ size_t __result_len = __adj_endp1 - __start;
+
+ if (__result_len > __lazy_threshold) goto lazy;
+ _CharT* __section = __base->_M_size.allocate(_S_rounded_up_size(__result_len));
+ _STLP_TRY {
+ (*(__f->_M_fn))(__start, __result_len, __section);
+ }
+ _STLP_UNWIND(_RopeRep::_S_free_string(
+ __section, __result_len, __base->get_allocator()));
+ _S_cond_store_eos(__section[__result_len]);
+ return _S_new_RopeLeaf(__section, __result_len,
+ __base->get_allocator());
+ }
+ }
+ /*NOTREACHED*/
+ _STLP_ASSERT(false)
+ lazy:
+ {
+ // Create substring node.
+ return _S_new_RopeSubstring(__base, __start, __adj_endp1 - __start,
+ __base->get_allocator());
+ }
+}
+
+template<class _CharT>
+class _Rope_flatten_char_consumer : public _Rope_char_consumer<_CharT> {
+ private:
+ _CharT* _M_buf_ptr;
+ public:
+ // _CharT* _M_buffer; // XXX not used
+
+ _Rope_flatten_char_consumer(_CharT* __buffer) {
+ _M_buf_ptr = __buffer;
+ };
+ ~_Rope_flatten_char_consumer() {}
+ bool operator() (const _CharT* __leaf, size_t __n) {
+ uninitialized_copy_n(__leaf, __n, _M_buf_ptr);
+ _M_buf_ptr += __n;
+ return true;
+ }
+};
+
+template<class _CharT>
+class _Rope_find_char_char_consumer : public _Rope_char_consumer<_CharT> {
+ private:
+ _CharT _M_pattern;
+ public:
+ size_t _M_count; // Number of nonmatching characters
+ _Rope_find_char_char_consumer(_CharT __p)
+ : _M_pattern(__p), _M_count(0) {}
+ ~_Rope_find_char_char_consumer() {}
+ bool operator() (const _CharT* __leaf, size_t __n) {
+ size_t __i;
+ for (__i = 0; __i < __n; __i++) {
+ if (__leaf[__i] == _M_pattern) {
+ _M_count += __i; return false;
+ }
+ }
+ _M_count += __n; return true;
+ }
+};
+
+#if !defined (_STLP_USE_NO_IOSTREAMS)
+#if defined (_STLP_USE_NEW_IOSTREAMS)
+ template<class _CharT, class _Traits>
+ // Here _CharT is both the stream and rope character type.
+#else
+ template<class _CharT>
+ // Here _CharT is the rope character type. Unlike in the
+ // above case, we somewhat handle the case in which it doesn't
+ // match the stream character type, i.e. char.
+#endif
+class _Rope_insert_char_consumer : public _Rope_char_consumer<_CharT> {
+ private:
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+ typedef basic_ostream<_CharT,_Traits> _Insert_ostream;
+# else
+ typedef ostream _Insert_ostream;
+# endif
+ _Insert_ostream& _M_o;
+ public:
+ // _CharT* buffer; // XXX not used
+ _Rope_insert_char_consumer(_Insert_ostream& __writer)
+ : _M_o(__writer) {};
+#if defined(__MRC__)||(defined(__SC__) && !defined(__DMC__)) //*TY 05/23/2000 - added support for mpw compiler's trigger function approach to generate vtable
+ ~_Rope_insert_char_consumer(); //*TY 05/23/2000 -
+#else //*TY 05/23/2000 -
+ ~_Rope_insert_char_consumer() {}
+#endif //*TY 05/23/2000 -
+ // Caller is presumed to own the ostream
+ bool operator() (const _CharT* __leaf, size_t __n);
+ // Returns true to continue traversal.
+};
+
+# if defined ( _STLP_USE_NEW_IOSTREAMS )
+# if defined(__MRC__)||(defined(__SC__) && !defined(__DMC__)) //*TY 05/23/2000 - added support for mpw compiler's trigger function approach to generate vtable
+ template<class _CharT, class _Traits>
+ _Rope_insert_char_consumer<_CharT, _Traits>:: ~_Rope_insert_char_consumer() {}
+# endif //*TY 05/23/2000 -
+
+ template<class _CharT, class _Traits>
+ bool _Rope_insert_char_consumer<_CharT, _Traits>::operator()
+ (const _CharT* __leaf, size_t __n)
+{
+ size_t __i;
+ // We assume that formatting is set up correctly for each element.
+ for (__i = 0; __i < __n; __i++) _M_o.put(__leaf[__i]);
+ return true;
+}
+# else
+# if defined(__MRC__)||(defined(__SC__) && !defined(__DMC__)) //*TY 05/23/2000 - added support for mpw compiler's trigger function approach to generate vtable
+ template<class _CharT>
+ _Rope_insert_char_consumer<_CharT>:: ~_Rope_insert_char_consumer() {}
+# endif //*TY 05/23/2000 -
+
+ template<class _CharT>
+ bool _Rope_insert_char_consumer<_CharT>::operator()
+ (const _CharT* __leaf, size_t __n)
+ {
+ size_t __i;
+ // We assume that formatting is set up correctly for each element.
+ for (__i = 0; __i < __n; __i++) _M_o << __leaf[__i];
+ return true;
+ }
+
+# if !defined (_STLP_NO_METHOD_SPECIALIZATION)
+_STLP_TEMPLATE_NULL
+inline bool
+_Rope_insert_char_consumer<char>::operator()
+ (const char* __leaf, size_t __n)
+{
+ size_t __i;
+ for (__i = 0; __i < __n; __i++) _M_o.put(__leaf[__i]);
+ return true;
+}
+
+#endif /* _STLP_METHOD_SPECIALIZATION */
+#endif /* _STLP_USE_NEW_IOSTREAM */
+#endif /* if !defined (_STLP_USE_NO_IOSTREAMS) */
+
+template <class _CharT, class _Alloc>
+bool rope<_CharT, _Alloc>::_S_apply_to_pieces(
+ _Rope_char_consumer<_CharT>& __c,
+ const _RopeRep* __r,
+ size_t __begin, size_t __end)
+{
+ if (0 == __r) return true;
+ switch(__r->_M_tag) {
+ case _RopeRep::_S_concat:
+ {
+ _RopeConcatenation* __conc = (_RopeConcatenation*)__r;
+ _RopeRep* __left = __conc->_M_left;
+ size_t __left_len = __left->_M_size._M_data;
+ if (__begin < __left_len) {
+ size_t __left_end = (min) (__left_len, __end);
+ if (!_S_apply_to_pieces(__c, __left, __begin, __left_end))
+ return false;
+ }
+ if (__end > __left_len) {
+ _RopeRep* __right = __conc->_M_right;
+ size_t __right_start = (max)(__left_len, __begin);
+ if (!_S_apply_to_pieces(__c, __right,
+ __right_start - __left_len,
+ __end - __left_len)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ case _RopeRep::_S_leaf:
+ {
+ _RopeLeaf* __l = (_RopeLeaf*)__r;
+ return __c.operator()(__l->_M_data + __begin, __end - __begin);
+ }
+ case _RopeRep::_S_function:
+ case _RopeRep::_S_substringfn:
+ {
+ _RopeFunction* __f = (_RopeFunction*)__r;
+ size_t __len = __end - __begin;
+ bool __result;
+ _CharT* __buffer =
+ (_CharT*)__sgi_alloc::allocate(__len * sizeof(_CharT));
+ _STLP_TRY {
+ (*(__f->_M_fn))(__begin, __len, __buffer);
+ __result = __c.operator()(__buffer, __len);
+ __sgi_alloc::deallocate(__buffer, __len * sizeof(_CharT));
+ }
+ _STLP_UNWIND((__sgi_alloc::deallocate(__buffer,
+ __len * sizeof(_CharT))))
+ return __result;
+ }
+ default:
+ _STLP_ASSERT(false)
+ /*NOTREACHED*/
+ return false;
+ }
+}
+
+template <class _CharT> inline bool _Rope_is_simple(_CharT*) { return false; }
+inline bool _Rope_is_simple(char*) { return true; }
+# ifdef _STLP_HAS_WCHAR_T
+inline bool _Rope_is_simple(wchar_t*) { return true; }
+# endif
+
+#if !defined (_STLP_USE_NO_IOSTREAMS)
+#if defined (_STLP_USE_NEW_IOSTREAMS)
+ template<class _CharT, class _Traits>
+ inline void _Rope_fill(basic_ostream<_CharT, _Traits>& __o, size_t __n)
+#else
+inline void _Rope_fill(ostream& __o, size_t __n)
+#endif
+{
+ char __f = __o.fill();
+ size_t __i;
+
+ for (__i = 0; __i < __n; __i++) __o.put(__f);
+}
+
+#if defined (_STLP_USE_NEW_IOSTREAMS)
+ template<class _CharT, class _Traits, class _Alloc>
+ basic_ostream<_CharT, _Traits>& operator<<
+ (basic_ostream<_CharT, _Traits>& __o,
+ const rope<_CharT, _Alloc>& __r)
+# else
+template<class _CharT, class _Alloc>
+ostream& operator<< (ostream& __o, const rope<_CharT, _Alloc>& __r)
+#endif
+{
+ size_t __w = __o.width();
+ bool __left = bool(__o.flags() & ios::left);
+ size_t __pad_len;
+ size_t __rope_len = __r.size();
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+ _Rope_insert_char_consumer<_CharT, _Traits> __c(__o);
+# else
+ _Rope_insert_char_consumer<_CharT> __c(__o);
+# endif
+ bool __is_simple = _Rope_is_simple((_CharT*)0);
+
+ if (__rope_len < __w) {
+ __pad_len = __w - __rope_len;
+ } else {
+ __pad_len = 0;
+ }
+ if (!__is_simple) __o.width(__w/__rope_len);
+ _STLP_TRY {
+ if (__is_simple && !__left && __pad_len > 0) {
+ _Rope_fill(__o, __pad_len);
+ }
+ __r.apply_to_pieces(0, __r.size(), __c);
+ if (__is_simple && __left && __pad_len > 0) {
+ _Rope_fill(__o, __pad_len);
+ }
+ if (!__is_simple)
+ __o.width(__w);
+ }
+ _STLP_UNWIND(if (!__is_simple) __o.width(__w))
+ return __o;
+}
+
+#endif /* NO_IOSTREAMS */
+
+template <class _CharT, class _Alloc>
+_CharT*
+rope<_CharT,_Alloc>::_S_flatten(_RopeRep* __r,
+ size_t __start, size_t __len,
+ _CharT* __buffer)
+{
+ _Rope_flatten_char_consumer<_CharT> __c(__buffer);
+ _S_apply_to_pieces(__c, __r, __start, __start + __len);
+ return(__buffer + __len);
+}
+
+template <class _CharT, class _Alloc>
+size_t
+rope<_CharT,_Alloc>::find(_CharT __pattern, size_t __start) const
+{
+ _Rope_find_char_char_consumer<_CharT> __c(__pattern);
+ _S_apply_to_pieces(__c, _M_tree_ptr._M_data, __start, size());
+ size_type __result_pos = __start + __c._M_count;
+# ifndef _STLP_OLD_ROPE_SEMANTICS
+ if (__result_pos == size()) __result_pos = npos;
+# endif
+ return __result_pos;
+}
+
+template <class _CharT, class _Alloc>
+_CharT*
+rope<_CharT,_Alloc>::_S_flatten(_Rope_RopeRep<_CharT, _Alloc>* __r, _CharT* __buffer)
+{
+ if (0 == __r) return __buffer;
+ switch(__r->_M_tag) {
+ case _RopeRep::_S_concat:
+ {
+ _RopeConcatenation* __c = (_RopeConcatenation*)__r;
+ _RopeRep* __left = __c->_M_left;
+ _RopeRep* __right = __c->_M_right;
+ _CharT* __rest = _S_flatten(__left, __buffer);
+ return _S_flatten(__right, __rest);
+ }
+ case _RopeRep::_S_leaf:
+ {
+ _RopeLeaf* __l = (_RopeLeaf*)__r;
+ return copy_n(__l->_M_data, __l->_M_size._M_data, __buffer).second;
+ }
+ case _RopeRep::_S_function:
+ case _RopeRep::_S_substringfn:
+ // We dont yet do anything with substring nodes.
+ // This needs to be fixed before ropefiles will work well.
+ {
+ _RopeFunction* __f = (_RopeFunction*)__r;
+ (*(__f->_M_fn))(0, __f->_M_size._M_data, __buffer);
+ return __buffer + __f->_M_size._M_data;
+ }
+ default:
+ _STLP_ASSERT(false)
+ /*NOTREACHED*/
+ return 0;
+ }
+}
+
+
+// This needs work for _CharT != char
+template <class _CharT, class _Alloc>
+void
+rope<_CharT,_Alloc>::_S_dump(_RopeRep* __r, int __indent)
+{
+ for (int __i = 0; __i < __indent; __i++) putchar(' ');
+ if (0 == __r) {
+ printf("NULL\n"); return;
+ }
+ if (_RopeRep::_S_concat == __r->_M_tag) {
+ _RopeConcatenation* __c = (_RopeConcatenation*)__r;
+ _RopeRep* __left = __c->_M_left;
+ _RopeRep* __right = __c->_M_right;
+
+# ifdef __GC
+ printf("Concatenation %p (depth = %d, len = %ld, %s balanced)\n",
+ __r, __r->_M_depth, __r->_M_size._M_data, __r->_M_is_balanced? "" : "not");
+# else
+ printf("Concatenation %p (rc = %ld, depth = %d, "
+ "len = %ld, %s balanced)\n",
+ __r, __r->_M_ref_count, __r->_M_depth, __r->_M_size._M_data,
+ __r->_M_is_balanced? "" : "not");
+# endif
+ _S_dump(__left, __indent + 2);
+ _S_dump(__right, __indent + 2);
+ return;
+ } else {
+ const char* __kind;
+
+ switch (__r->_M_tag) {
+ case _RopeRep::_S_leaf:
+ __kind = "Leaf";
+ break;
+ case _RopeRep::_S_function:
+ __kind = "Function";
+ break;
+ case _RopeRep::_S_substringfn:
+ __kind = "Function representing substring";
+ break;
+ default:
+ __kind = "(corrupted kind field!)";
+ }
+# ifdef __GC
+ printf("%s %p (depth = %d, len = %ld) ",
+ __kind, __r, __r->_M_depth, __r->_M_size._M_data);
+# else
+ printf("%s %p (rc = %ld, depth = %d, len = %ld) ",
+ __kind, __r, __r->_M_ref_count, __r->_M_depth, __r->_M_size._M_data);
+# endif
+ if (_S_is_one_byte_char_type((_CharT*)0)) {
+ const int __max_len = 40;
+ _Self_destruct_ptr __prefix(_S_substring(__r, 0, __max_len));
+ _CharT __buffer[__max_len + 1];
+ bool __too_big = __r->_M_size._M_data > __prefix->_M_size._M_data;
+
+ _S_flatten(__prefix, __buffer);
+ __buffer[__prefix->_M_size._M_data] = _S_eos((_CharT*)0);
+ printf("%s%s\n",
+ (char*)__buffer, __too_big? "...\n" : "\n");
+ } else {
+ printf("\n");
+ }
+ }
+}
+
+# define __ROPE_TABLE_BODY = { \
+/* 0 */1, /* 1 */2, /* 2 */3, /* 3 */5, /* 4 */8, /* 5 */13, /* 6 */21, \
+/* 7 */34, /* 8 */55, /* 9 */89, /* 10 */144, /* 11 */233, /* 12 */377, \
+/* 13 */610, /* 14 */987, /* 15 */1597, /* 16 */2584, /* 17 */4181, \
+/* 18 */6765ul, /* 19 */10946ul, /* 20 */17711ul, /* 21 */28657ul, /* 22 */46368ul, \
+/* 23 */75025ul, /* 24 */121393ul, /* 25 */196418ul, /* 26 */317811ul, \
+/* 27 */514229ul, /* 28 */832040ul, /* 29 */1346269ul, /* 30 */2178309ul, \
+/* 31 */3524578ul, /* 32 */5702887ul, /* 33 */9227465ul, /* 34 */14930352ul, \
+/* 35 */24157817ul, /* 36 */39088169ul, /* 37 */63245986ul, /* 38 */102334155ul, \
+/* 39 */165580141ul, /* 40 */267914296ul, /* 41 */433494437ul, \
+/* 42 */701408733ul, /* 43 */1134903170ul, /* 44 */1836311903ul, \
+/* 45 */2971215073ul }
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template <class _CharT, class _Alloc>
+const unsigned long
+rope<_CharT,_Alloc>::_S_min_len[__ROPE_DEPTH_SIZE] __ROPE_TABLE_BODY ;
+# else
+__DECLARE_INSTANCE(const unsigned long,
+ crope::_S_min_len[__ROPE_DEPTH_SIZE],
+ __ROPE_TABLE_BODY);
+# ifndef _STLP_NO_WCHAR_T
+__DECLARE_INSTANCE(const unsigned long,
+ wrope::_S_min_len[__ROPE_DEPTH_SIZE],
+ __ROPE_TABLE_BODY);
+# endif
+# endif
+# undef __ROPE_DEPTH_SIZE
+# undef __ROPE_MAX_DEPTH
+# undef __ROPE_TABLE_BODY
+
+// These are Fibonacci numbers < 2**32.
+
+template <class _CharT, class _Alloc>
+__RopeRep__*
+rope<_CharT,_Alloc>::_S_balance(_RopeRep* __r)
+{
+ _RopeRep* __forest[_RopeRep::_S_max_rope_depth + 1];
+ _RopeRep* __result = 0;
+ int __i;
+ // Invariant:
+ // The concatenation of forest in descending order is equal to __r.
+ // __forest[__i]._M_size._M_data >= _S_min_len[__i]
+ // __forest[__i]._M_depth = __i
+ // References from forest are included in refcount.
+
+ for (__i = 0; __i <= _RopeRep::_S_max_rope_depth; ++__i)
+ __forest[__i] = 0;
+ _STLP_TRY {
+ _S_add_to_forest(__r, __forest);
+ for (__i = 0; __i <= _RopeRep::_S_max_rope_depth; ++__i)
+ if (0 != __forest[__i]) {
+# ifndef __GC
+ _Self_destruct_ptr __old(__result);
+# endif
+ __result = _S_concat_rep(__forest[__i], __result);
+ __forest[__i]->_M_unref_nonnil();
+# if !defined(__GC) && defined(_STLP_USE_EXCEPTIONS)
+ __forest[__i] = 0;
+# endif
+ }
+ }
+ _STLP_UNWIND(for(__i = 0; __i <= _RopeRep::_S_max_rope_depth; __i++)
+ _S_unref(__forest[__i]))
+ if (__result->_M_depth > _RopeRep::_S_max_rope_depth) {
+ __stl_throw_range_error("rope too long");
+ }
+ return(__result);
+}
+
+
+template <class _CharT, class _Alloc>
+void
+rope<_CharT,_Alloc>::_S_add_to_forest(_RopeRep* __r, _RopeRep** __forest)
+{
+ if (__r -> _M_is_balanced) {
+ _S_add_leaf_to_forest(__r, __forest);
+ return;
+ }
+ _STLP_ASSERT(__r->_M_tag == _RopeRep::_S_concat)
+ {
+ _RopeConcatenation* __c = (_RopeConcatenation*)__r;
+
+ _S_add_to_forest(__c->_M_left, __forest);
+ _S_add_to_forest(__c->_M_right, __forest);
+ }
+}
+
+
+template <class _CharT, class _Alloc>
+void
+rope<_CharT,_Alloc>::_S_add_leaf_to_forest(_RopeRep* __r, _RopeRep** __forest)
+{
+ _RopeRep* __insertee; // included in refcount
+ _RopeRep* __too_tiny = 0; // included in refcount
+ int __i; // forest[0..__i-1] is empty
+ size_t __s = __r->_M_size._M_data;
+
+ for (__i = 0; __s >= _S_min_len[__i+1]/* not this bucket */; ++__i) {
+ if (0 != __forest[__i]) {
+# ifndef __GC
+ _Self_destruct_ptr __old(__too_tiny);
+# endif
+ __too_tiny = _S_concat_and_set_balanced(__forest[__i], __too_tiny);
+ __forest[__i]->_M_unref_nonnil();
+ __forest[__i] = 0;
+ }
+ }
+ {
+# ifndef __GC
+ _Self_destruct_ptr __old(__too_tiny);
+# endif
+ __insertee = _S_concat_and_set_balanced(__too_tiny, __r);
+ }
+ // Too_tiny dead, and no longer included in refcount.
+ // Insertee is live and included.
+ _STLP_ASSERT(_S_is_almost_balanced(__insertee))
+ _STLP_ASSERT(__insertee->_M_depth <= __r->_M_depth + 1)
+ for (;; ++__i) {
+ if (0 != __forest[__i]) {
+# ifndef __GC
+ _Self_destruct_ptr __old(__insertee);
+# endif
+ __insertee = _S_concat_and_set_balanced(__forest[__i], __insertee);
+ __forest[__i]->_M_unref_nonnil();
+ __forest[__i] = 0;
+ _STLP_ASSERT(_S_is_almost_balanced(__insertee))
+ }
+ _STLP_ASSERT(_S_min_len[__i] <= __insertee->_M_size._M_data)
+ _STLP_ASSERT(__forest[__i] == 0)
+ if (__i == _RopeRep::_S_max_rope_depth ||
+ __insertee->_M_size._M_data < _S_min_len[__i+1]) {
+ __forest[__i] = __insertee;
+ // refcount is OK since __insertee is now dead.
+ return;
+ }
+ }
+}
+
+template <class _CharT, class _Alloc>
+_CharT
+rope<_CharT,_Alloc>::_S_fetch(_RopeRep* __r, size_type __i)
+{
+ __GC_CONST _CharT* __cstr = __r->_M_c_string;
+
+ _STLP_ASSERT(__i < __r->_M_size._M_data)
+ if (0 != __cstr) return __cstr[__i];
+ for(;;) {
+ switch(__r->_M_tag) {
+ case _RopeRep::_S_concat:
+ {
+ _RopeConcatenation* __c = (_RopeConcatenation*)__r;
+ _RopeRep* __left = __c->_M_left;
+ size_t __left_len = __left->_M_size._M_data;
+
+ if (__i >= __left_len) {
+ __i -= __left_len;
+ __r = __c->_M_right;
+ } else {
+ __r = __left;
+ }
+ }
+ break;
+ case _RopeRep::_S_leaf:
+ {
+ _RopeLeaf* __l = (_RopeLeaf*)__r;
+ return __l->_M_data[__i];
+ }
+ case _RopeRep::_S_function:
+ case _RopeRep::_S_substringfn:
+ {
+ _RopeFunction* __f = (_RopeFunction*)__r;
+ _CharT __result;
+
+ (*(__f->_M_fn))(__i, 1, &__result);
+ return __result;
+ }
+ }
+ }
+#if defined(_STLP_NEED_UNREACHABLE_RETURN)
+ return 0;
+#endif
+}
+
+# ifndef __GC
+// Return a uniquely referenced character slot for the given
+// position, or 0 if that's not possible.
+template <class _CharT, class _Alloc>
+_CharT*
+rope<_CharT,_Alloc>::_S_fetch_ptr(_RopeRep* __r, size_type __i)
+{
+ _RopeRep* __clrstack[_RopeRep::_S_max_rope_depth];
+ size_t __csptr = 0;
+
+ for(;;) {
+ if (__r->_M_ref_count > 1) return 0;
+ switch(__r->_M_tag) {
+ case _RopeRep::_S_concat:
+ {
+ _RopeConcatenation* __c = (_RopeConcatenation*)__r;
+ _RopeRep* __left = __c->_M_left;
+ size_t __left_len = __left->_M_size._M_data;
+
+ if (__c->_M_c_string != 0) __clrstack[__csptr++] = __c;
+ if (__i >= __left_len) {
+ __i -= __left_len;
+ __r = __c->_M_right;
+ } else {
+ __r = __left;
+ }
+ }
+ break;
+ case _RopeRep::_S_leaf:
+ {
+ _RopeLeaf* __l = (_RopeLeaf*)__r;
+ if (__l->_M_c_string != __l->_M_data && __l->_M_c_string != 0)
+ __clrstack[__csptr++] = __l;
+ while (__csptr > 0) {
+ -- __csptr;
+ _RopeRep* __d = __clrstack[__csptr];
+ __d->_M_free_c_string();
+ __d->_M_c_string = 0;
+ }
+ return __l->_M_data + __i;
+ }
+ case _RopeRep::_S_function:
+ case _RopeRep::_S_substringfn:
+ return 0;
+ }
+ }
+#if defined(_STLP_NEED_UNREACHABLE_RETURN)
+ return 0;
+#endif
+
+}
+# endif /* __GC */
+
+// The following could be implemented trivially using
+// lexicographical_compare_3way.
+// We do a little more work to avoid dealing with rope iterators for
+// flat strings.
+template <class _CharT, class _Alloc>
+int
+rope<_CharT,_Alloc>::_S_compare (const _RopeRep* __left,
+ const _RopeRep* __right)
+{
+ size_t __left_len;
+ size_t __right_len;
+
+ if (0 == __right) return 0 != __left;
+ if (0 == __left) return -1;
+ __left_len = __left->_M_size._M_data;
+ __right_len = __right->_M_size._M_data;
+ if (_RopeRep::_S_leaf == __left->_M_tag) {
+ _RopeLeaf* __l = (_RopeLeaf*) __left;
+ if (_RopeRep::_S_leaf == __right->_M_tag) {
+ _RopeLeaf* __r = (_RopeLeaf*) __right;
+ return lexicographical_compare_3way(
+ __l->_M_data, __l->_M_data + __left_len,
+ __r->_M_data, __r->_M_data + __right_len);
+ } else {
+ const_iterator __rstart(__right, 0);
+ const_iterator __rend(__right, __right_len);
+ return lexicographical_compare_3way(
+ __l->_M_data, __l->_M_data + __left_len,
+ __rstart, __rend);
+ }
+ } else {
+ const_iterator __lstart(__left, 0);
+ const_iterator __lend(__left, __left_len);
+ if (_RopeRep::_S_leaf == __right->_M_tag) {
+ _RopeLeaf* __r = (_RopeLeaf*) __right;
+ return lexicographical_compare_3way(
+ __lstart, __lend,
+ __r->_M_data, __r->_M_data + __right_len);
+ } else {
+ const_iterator __rstart(__right, 0);
+ const_iterator __rend(__right, __right_len);
+ return lexicographical_compare_3way(
+ __lstart, __lend,
+ __rstart, __rend);
+ }
+ }
+}
+
+// Assignment to reference proxies.
+template <class _CharT, class _Alloc>
+_Rope_char_ref_proxy<_CharT, _Alloc>&
+_Rope_char_ref_proxy<_CharT, _Alloc>::operator= (_CharT __c) {
+ _RopeRep* __old = _M_root->_M_tree_ptr._M_data;
+# ifndef __GC
+ // First check for the case in which everything is uniquely
+ // referenced. In that case we can do this destructively.
+ _CharT* __ptr = _My_rope::_S_fetch_ptr(__old, _M_pos);
+ if (0 != __ptr) {
+ *__ptr = __c;
+ return *this;
+ }
+# endif
+ _Self_destruct_ptr __left(
+ _My_rope::_S_substring(__old, 0, _M_pos));
+ _Self_destruct_ptr __right(
+ _My_rope::_S_substring(__old, _M_pos+1, __old->_M_size._M_data));
+ _Self_destruct_ptr __result_left(
+ _My_rope::_S_destr_concat_char_iter(__left, &__c, 1));
+
+# ifndef __GC
+ _STLP_ASSERT(__left == __result_left || 1 == __result_left->_M_ref_count)
+# endif
+ _RopeRep* __result =
+ _My_rope::_S_concat_rep(__result_left, __right);
+# ifndef __GC
+ _STLP_ASSERT(1 <= __result->_M_ref_count)
+ _RopeRep::_S_unref(__old);
+# endif
+ _M_root->_M_tree_ptr._M_data = __result;
+ return *this;
+}
+
+template <class _CharT, class _Alloc>
+_Rope_char_ptr_proxy<_CharT, _Alloc>
+_Rope_char_ref_proxy<_CharT, _Alloc>::operator& () const {
+ return _Rope_char_ptr_proxy<_CharT, _Alloc>(*this);
+}
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template<class _CharT, class _Alloc>
+_CharT rope<_CharT,_Alloc>::_S_empty_c_str[1] = { _CharT() };
+# else
+__DECLARE_INSTANCE(char, crope::_S_empty_c_str[1], ={0});
+# ifdef _STLP_HAS_WCHAR_T
+__DECLARE_INSTANCE(wchar_t, wrope::_S_empty_c_str[1], ={0});
+# endif /* _STLP_HAS_WCHAR_T */
+# endif /* _STLP_STATIC_TEMPLATE_DATA */
+// # endif
+
+template<class _CharT, class _Alloc>
+const _CharT* rope<_CharT,_Alloc>::c_str() const {
+ if (0 == _M_tree_ptr._M_data) {
+ _S_empty_c_str[0] = _S_eos((_CharT*)0); // Possibly redundant,
+ // but probably fast.
+ return _S_empty_c_str;
+ }
+ __GC_CONST _CharT* __old_c_string = _M_tree_ptr._M_data->_M_c_string;
+ if (0 != __old_c_string) return(__old_c_string);
+ size_t __s = size();
+ _CharT* __result = _STLP_CREATE_ALLOCATOR(allocator_type,(const allocator_type&)_M_tree_ptr, _CharT).allocate(__s + 1);
+ _S_flatten(_M_tree_ptr._M_data, __result);
+ __result[__s] = _S_eos((_CharT*)0);
+# ifdef __GC
+ _M_tree_ptr._M_data->_M_c_string = __result;
+# else
+ if ((__old_c_string = (__GC_CONST _CharT*)
+ _Atomic_swap((__stl_atomic_t *)(&(_M_tree_ptr._M_data->_M_c_string)),
+ (__stl_atomic_t)__result)) != 0) {
+ // It must have been added in the interim. Hence it had to have been
+ // separately allocated. Deallocate the old copy, since we just
+ // replaced it.
+ _STLP_STD::_Destroy(__old_c_string, __old_c_string + __s + 1);
+ _STLP_CREATE_ALLOCATOR(allocator_type,(const allocator_type&)_M_tree_ptr, _CharT).deallocate(__old_c_string, __s + 1);
+ }
+# endif
+ return(__result);
+}
+
+template<class _CharT, class _Alloc>
+const _CharT* rope<_CharT,_Alloc>::replace_with_c_str() {
+ if (0 == _M_tree_ptr._M_data) {
+ _S_empty_c_str[0] = _S_eos((_CharT*)0);
+ return _S_empty_c_str;
+ }
+ __GC_CONST _CharT* __old_c_string = _M_tree_ptr._M_data->_M_c_string;
+ if (_RopeRep::_S_leaf == _M_tree_ptr._M_data->_M_tag && 0 != __old_c_string) {
+ return(__old_c_string);
+ }
+ size_t __s = size();
+ _CharT* __result = _M_tree_ptr.allocate(_S_rounded_up_size(__s));
+ _S_flatten(_M_tree_ptr._M_data, __result);
+ __result[__s] = _S_eos((_CharT*)0);
+ _M_tree_ptr._M_data->_M_unref_nonnil();
+ _M_tree_ptr._M_data = _S_new_RopeLeaf(__result, __s, get_allocator());
+ return(__result);
+}
+
+// Algorithm specializations. More should be added.
+
+#ifndef _STLP_MSVC
+// I couldn't get this to work with VC++
+template<class _CharT,class _Alloc>
+void
+_Rope_rotate(_Rope_iterator<_CharT,_Alloc> __first,
+ _Rope_iterator<_CharT,_Alloc> __middle,
+ _Rope_iterator<_CharT,_Alloc> __last)
+{
+ _STLP_ASSERT(__first.container() == __middle.container()
+ && __middle.container() == __last.container())
+ rope<_CharT,_Alloc>& __r(__first.container());
+ rope<_CharT,_Alloc> __prefix = __r.substr(0, __first.index());
+ rope<_CharT,_Alloc> __suffix =
+ __r.substr(__last.index(), __r.size() - __last.index());
+ rope<_CharT,_Alloc> __part1 =
+ __r.substr(__middle.index(), __last.index() - __middle.index());
+ rope<_CharT,_Alloc> __part2 =
+ __r.substr(__first.index(), __middle.index() - __first.index());
+ __r = __prefix;
+ __r += __part1;
+ __r += __part2;
+ __r += __suffix;
+}
+
+
+# if 0
+// Probably not useful for several reasons:
+// - for SGIs 7.1 compiler and probably some others,
+// this forces lots of rope<wchar_t, ...> instantiations, creating a
+// code bloat and compile time problem. (Fixed in 7.2.)
+// - wchar_t is 4 bytes wide on most UNIX platforms, making it unattractive
+// for unicode strings. Unsigned short may be a better character
+// type.
+inline void rotate(
+ _Rope_iterator<wchar_t,_STLP_DEFAULT_ALLOCATOR(char) > __first,
+ _Rope_iterator<wchar_t,_STLP_DEFAULT_ALLOCATOR(char) > __middle,
+ _Rope_iterator<wchar_t,_STLP_DEFAULT_ALLOCATOR(char) > __last) {
+ _Rope_rotate(__first, __middle, __last);
+}
+# endif
+#endif /* _STLP_MSVC */
+
+# undef __RopeLeaf__
+# undef __RopeRep__
+# undef __RopeLeaf
+# undef __RopeRep
+# undef size_type
+
+_STLP_END_NAMESPACE
+
+# endif /* ROPEIMPL_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_rope.h b/src/STLport/stl/_rope.h
new file mode 100644
index 0000000..d6a09ed
--- /dev/null
+++ b/src/STLport/stl/_rope.h
@@ -0,0 +1,2518 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+// rope<_CharT,_Alloc> is a sequence of _CharT.
+// Ropes appear to be mutable, but update operations
+// really copy enough of the data structure to leave the original
+// valid. Thus ropes can be logically copied by just copying
+// a pointer value.
+
+#ifndef _STLP_INTERNAL_ROPE_H
+# define _STLP_INTERNAL_ROPE_H
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_IOSFWD
+# include <iosfwd>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+# include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALGO_H
+# include <stl/_algo.h>
+# endif
+
+# ifndef _STLP_INTERNAL_FUNCTION_H
+# include <stl/_function.h>
+# endif
+
+# ifndef _STLP_INTERNAL_NUMERIC_H
+# include <stl/_numeric.h>
+# endif
+
+# ifndef _STLP_INTERNAL_HASH_FUN_H
+# include <stl/_hash_fun.h>
+# endif
+
+# ifdef __GC
+# define __GC_CONST const
+# else
+# include <stl/_threads.h>
+# define __GC_CONST // constant except for deallocation
+# endif
+# ifdef _STLP_SGI_THREADS
+# include <mutex.h>
+# endif
+
+#ifdef _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM
+# define _STLP_CREATE_ALLOCATOR(__atype,__a, _Tp) (_Alloc_traits<_Tp,__atype>::create_allocator(__a))
+#elif defined(__MRC__)||defined(__SC__)
+# define _STLP_CREATE_ALLOCATOR(__atype,__a, _Tp) __stl_alloc_create<_Tp,__atype>(__a,(_Tp*)0)
+#else
+# define _STLP_CREATE_ALLOCATOR(__atype,__a, _Tp) __stl_alloc_create(__a,(_Tp*)0)
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// First a lot of forward declarations. The standard seems to require
+// much stricter "declaration before use" than many of the implementations
+// that preceded it.
+template<class _CharT, _STLP_DEFAULT_ALLOCATOR_SELECT(_CharT) > class rope;
+template<class _CharT, class _Alloc> struct _Rope_RopeConcatenation;
+template<class _CharT, class _Alloc> struct _Rope_RopeRep;
+template<class _CharT, class _Alloc> struct _Rope_RopeLeaf;
+template<class _CharT, class _Alloc> struct _Rope_RopeFunction;
+template<class _CharT, class _Alloc> struct _Rope_RopeSubstring;
+template<class _CharT, class _Alloc> class _Rope_iterator;
+template<class _CharT, class _Alloc> class _Rope_const_iterator;
+template<class _CharT, class _Alloc> class _Rope_char_ref_proxy;
+template<class _CharT, class _Alloc> class _Rope_char_ptr_proxy;
+
+// Some helpers, so we can use power on ropes.
+// See below for why this isn't local to the implementation.
+
+// This uses a nonstandard refcount convention.
+// The result has refcount 0.
+template<class _CharT, class _Alloc>
+struct _Rope_Concat_fn
+ : public binary_function<rope<_CharT,_Alloc>, rope<_CharT,_Alloc>,
+ rope<_CharT,_Alloc> > {
+ rope<_CharT,_Alloc> operator() (const rope<_CharT,_Alloc>& __x,
+ const rope<_CharT,_Alloc>& __y) {
+ return __x + __y;
+ }
+};
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>
+__identity_element(_Rope_Concat_fn<_CharT, _Alloc>)
+{
+ return rope<_CharT,_Alloc>();
+}
+
+// The _S_eos function is used for those functions that
+// convert to/from C-like strings to detect the end of the string.
+
+// The end-of-C-string character.
+// This is what the draft standard says it should be.
+template <class _CharT>
+inline _CharT _S_eos(_CharT*) { return _CharT(); }
+
+// fbp : some compilers fail to zero-initialize builtins ;(
+inline const char _S_eos(const char*) { return 0; }
+# ifdef _STLP_HAS_WCHAR_T
+inline const wchar_t _S_eos(const wchar_t*) { return 0; }
+# endif
+
+// Test for basic character types.
+// For basic character types leaves having a trailing eos.
+template <class _CharT>
+inline bool _S_is_basic_char_type(_CharT*) { return false; }
+template <class _CharT>
+inline bool _S_is_one_byte_char_type(_CharT*) { return false; }
+
+inline bool _S_is_basic_char_type(char*) { return true; }
+inline bool _S_is_one_byte_char_type(char*) { return true; }
+# ifdef _STLP_HAS_WCHAR_T
+inline bool _S_is_basic_char_type(wchar_t*) { return true; }
+# endif
+
+// Store an eos iff _CharT is a basic character type.
+// Do not reference _S_eos if it isn't.
+template <class _CharT>
+inline void _S_cond_store_eos(_CharT&) {}
+
+inline void _S_cond_store_eos(char& __c) { __c = 0; }
+# ifdef _STLP_HAS_WCHAR_T
+inline void _S_cond_store_eos(wchar_t& __c) { __c = 0; }
+# endif
+
+// char_producers are logically functions that generate a section of
+// a string. These can be convereted to ropes. The resulting rope
+// invokes the char_producer on demand. This allows, for example,
+// files to be viewed as ropes without reading the entire file.
+template <class _CharT>
+class char_producer {
+public:
+ virtual ~char_producer() {};
+ virtual void operator()(size_t __start_pos, size_t __len,
+ _CharT* __buffer) = 0;
+ // Buffer should really be an arbitrary output iterator.
+ // That way we could flatten directly into an ostream, etc.
+ // This is thoroughly impossible, since iterator types don't
+ // have runtime descriptions.
+};
+
+// Sequence buffers:
+//
+// Sequence must provide an append operation that appends an
+// array to the sequence. Sequence buffers are useful only if
+// appending an entire array is cheaper than appending element by element.
+// This is true for many string representations.
+// This should perhaps inherit from ostream<sequence::value_type>
+// and be implemented correspondingly, so that they can be used
+// for formatted. For the sake of portability, we don't do this yet.
+//
+// For now, sequence buffers behave as output iterators. But they also
+// behave a little like basic_ostringstream<sequence::value_type> and a
+// little like containers.
+
+template<class _Sequence
+# if !(defined (_STLP_NON_TYPE_TMPL_PARAM_BUG) || \
+ defined ( _STLP_NO_DEFAULT_NON_TYPE_PARAM ))
+, size_t _Buf_sz = 100
+# if defined(__sgi) && !defined(__GNUC__)
+# define __TYPEDEF_WORKAROUND
+,class _V = typename _Sequence::value_type
+# endif /* __sgi */
+# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+>
+// The 3rd parameter works around a common compiler bug.
+class sequence_buffer : public iterator <output_iterator_tag, void, void, void, void> {
+public:
+# ifndef __TYPEDEF_WORKAROUND
+ typedef typename _Sequence::value_type value_type;
+ typedef sequence_buffer<_Sequence
+# if !(defined (_STLP_NON_TYPE_TMPL_PARAM_BUG) || \
+ defined ( _STLP_NO_DEFAULT_NON_TYPE_PARAM ))
+ , _Buf_sz
+ > _Self;
+# else /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+ > _Self;
+ enum { _Buf_sz = 100};
+# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+ // # endif
+# else /* __TYPEDEF_WORKAROUND */
+ typedef _V value_type;
+ typedef sequence_buffer<_Sequence, _Buf_sz, _V> _Self;
+# endif /* __TYPEDEF_WORKAROUND */
+protected:
+ _Sequence* _M_prefix;
+ value_type _M_buffer[_Buf_sz];
+ size_t _M_buf_count;
+public:
+ void flush() {
+ _M_prefix->append(_M_buffer, _M_buffer + _M_buf_count);
+ _M_buf_count = 0;
+ }
+ ~sequence_buffer() { flush(); }
+ sequence_buffer() : _M_prefix(0), _M_buf_count(0) {}
+ sequence_buffer(const _Self& __x) {
+ _M_prefix = __x._M_prefix;
+ _M_buf_count = __x._M_buf_count;
+ copy(__x._M_buffer, __x._M_buffer + __x._M_buf_count, _M_buffer);
+ }
+ sequence_buffer(_Self& __x) {
+ __x.flush();
+ _M_prefix = __x._M_prefix;
+ _M_buf_count = 0;
+ }
+ sequence_buffer(_Sequence& __s) : _M_prefix(&__s), _M_buf_count(0) {}
+ _Self& operator= (_Self& __x) {
+ __x.flush();
+ _M_prefix = __x._M_prefix;
+ _M_buf_count = 0;
+ return *this;
+ }
+ _Self& operator= (const _Self& __x) {
+ _M_prefix = __x._M_prefix;
+ _M_buf_count = __x._M_buf_count;
+ copy(__x._M_buffer, __x._M_buffer + __x._M_buf_count, _M_buffer);
+ return *this;
+ }
+ void push_back(value_type __x)
+ {
+ if (_M_buf_count < _Buf_sz) {
+ _M_buffer[_M_buf_count] = __x;
+ ++_M_buf_count;
+ } else {
+ flush();
+ _M_buffer[0] = __x;
+ _M_buf_count = 1;
+ }
+ }
+ void append(value_type* __s, size_t __len)
+ {
+ if (__len + _M_buf_count <= _Buf_sz) {
+ size_t __i = _M_buf_count;
+ size_t __j = 0;
+ for (; __j < __len; __i++, __j++) {
+ _M_buffer[__i] = __s[__j];
+ }
+ _M_buf_count += __len;
+ } else if (0 == _M_buf_count) {
+ _M_prefix->append(__s, __s + __len);
+ } else {
+ flush();
+ append(__s, __len);
+ }
+ }
+ _Self& write(value_type* __s, size_t __len)
+ {
+ append(__s, __len);
+ return *this;
+ }
+ _Self& put(value_type __x)
+ {
+ push_back(__x);
+ return *this;
+ }
+ _Self& operator=(const value_type& __rhs)
+ {
+ push_back(__rhs);
+ return *this;
+ }
+ _Self& operator*() { return *this; }
+ _Self& operator++() { return *this; }
+ _Self& operator++(int) { return *this; }
+};
+
+// The following should be treated as private, at least for now.
+template<class _CharT>
+class _Rope_char_consumer {
+public:
+ // If we had member templates, these should not be virtual.
+ // For now we need to use run-time parametrization where
+ // compile-time would do. _Hence this should all be private
+ // for now.
+ // The symmetry with char_producer is accidental and temporary.
+ virtual ~_Rope_char_consumer() {};
+ virtual bool operator()(const _CharT* __buffer, size_t __len) = 0;
+};
+
+//
+// What follows should really be local to rope. Unfortunately,
+// that doesn't work, since it makes it impossible to define generic
+// equality on rope iterators. According to the draft standard, the
+// template parameters for such an equality operator cannot be inferred
+// from the occurence of a member class as a parameter.
+// (SGI compilers in fact allow this, but the __result wouldn't be
+// portable.)
+// Similarly, some of the static member functions are member functions
+// only to avoid polluting the global namespace, and to circumvent
+// restrictions on type inference for template functions.
+//
+
+//
+// The internal data structure for representing a rope. This is
+// private to the implementation. A rope is really just a pointer
+// to one of these.
+//
+// A few basic functions for manipulating this data structure
+// are members of _RopeRep. Most of the more complex algorithms
+// are implemented as rope members.
+//
+// Some of the static member functions of _RopeRep have identically
+// named functions in rope that simply invoke the _RopeRep versions.
+//
+// A macro to introduce various allocation and deallocation functions
+// These need to be defined differently depending on whether or not
+// we are using standard conforming allocators, and whether the allocator
+// instances have real state. Thus this macro is invoked repeatedly
+// with different definitions of __ROPE_DEFINE_ALLOC.
+
+#if defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+# define __ROPE_DEFINE_ALLOC(_Tp, __name, _M_proxy) \
+ typedef typename \
+ _Alloc_traits<_Tp,_Alloc>::allocator_type __name##Allocator;
+
+#define __ROPE_DEFINE_ALLOCS(__a, _M_proxy) \
+ __ROPE_DEFINE_ALLOC(_CharT,_Data, _M_proxy) /* character data */ \
+ typedef _Rope_RopeConcatenation<_CharT,__a> __C; \
+ __ROPE_DEFINE_ALLOC(__C,_C, _M_proxy) \
+ typedef _Rope_RopeLeaf<_CharT,__a> __L; \
+ __ROPE_DEFINE_ALLOC(__L,_L, _M_proxy) \
+ typedef _Rope_RopeFunction<_CharT,__a> __F; \
+ __ROPE_DEFINE_ALLOC(__F,_F, _M_proxy) \
+ typedef _Rope_RopeSubstring<_CharT,__a> __S; \
+ __ROPE_DEFINE_ALLOC(__S,_S,_M_proxy)
+#else
+#define __ROPE_DEFINE_ALLOC(_Tp, __name, _M_proxy)
+#define __ROPE_DEFINE_ALLOCS(__a, _M_proxy)
+#endif
+
+
+template<class _CharT, class _Alloc>
+struct _Rope_RopeRep
+# ifndef __GC
+ : public _Refcount_Base
+# endif
+{
+ typedef _Rope_RopeRep<_CharT, _Alloc> _Self;
+public:
+# define __ROPE_MAX_DEPTH 45
+# define __ROPE_DEPTH_SIZE 46
+ enum { _S_max_rope_depth = __ROPE_MAX_DEPTH };
+ enum _Tag {_S_leaf, _S_concat, _S_substringfn, _S_function};
+ // Apparently needed by VC++
+ // The data fields of leaves are allocated with some
+ // extra space, to accomodate future growth and for basic
+ // character types, to hold a trailing eos character.
+ enum { _S_alloc_granularity = 8 };
+
+
+ _Tag _M_tag:8;
+ bool _M_is_balanced:8;
+
+ _STLP_FORCE_ALLOCATORS(_CharT, _Alloc)
+ typedef typename _Alloc_traits<_CharT,_Alloc>::allocator_type
+ allocator_type;
+
+ allocator_type get_allocator() const { return allocator_type(_M_size); }
+
+ unsigned char _M_depth;
+ __GC_CONST _CharT* _M_c_string;
+ _STLP_alloc_proxy<size_t, _CharT, allocator_type> _M_size;
+
+# ifdef _STLP_NO_ARROW_OPERATOR
+ _Rope_RopeRep() : _Refcount_Base(1), _M_size(allocator_type(), 0) {}
+# endif
+
+ /* Flattened version of string, if needed. */
+ /* typically 0. */
+ /* If it's not 0, then the memory is owned */
+ /* by this node. */
+ /* In the case of a leaf, this may point to */
+ /* the same memory as the data field. */
+ _Rope_RopeRep(_Tag __t, int __d, bool __b, size_t _p_size,
+ allocator_type __a) :
+# ifndef __GC
+ _Refcount_Base(1),
+# endif
+ _M_tag(__t), _M_is_balanced(__b), _M_depth(__d), _M_c_string(0), _M_size(__a, _p_size)
+ { }
+# ifdef __GC
+ void _M_incr () {}
+# endif
+
+ // fbp : moved from RopeLeaf
+ static size_t _S_rounded_up_size(size_t __n) {
+ size_t __size_with_eos;
+
+ if (_S_is_basic_char_type((_CharT*)0)) {
+ __size_with_eos = __n + 1;
+ } else {
+ __size_with_eos = __n;
+ }
+# ifdef __GC
+ return __size_with_eos;
+# else
+ // Allow slop for in-place expansion.
+ return (__size_with_eos + _S_alloc_granularity-1)
+ &~ (_S_alloc_granularity-1);
+# endif
+ }
+
+ static void _S_free_string(__GC_CONST _CharT* __s, size_t __len,
+ allocator_type __a) {
+
+ if (!_S_is_basic_char_type((_CharT*)0)) {
+ _STLP_STD::_Destroy(__s, __s + __len);
+ }
+ // This has to be a static member, so this gets a bit messy
+# ifdef _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM
+ __a.deallocate(__s, _S_rounded_up_size(__len)); //*ty 03/24/2001 - restored not to use __stl_alloc_rebind() since it is not defined under _STLP_MEMBER_TEMPLATE_CLASSES
+# else
+ __stl_alloc_rebind (__a, (_CharT*)0).deallocate(__s, _S_rounded_up_size(__len));
+# endif
+ }
+
+ // Deallocate data section of a leaf.
+ // This shouldn't be a member function.
+ // But its hard to do anything else at the
+ // moment, because it's templatized w.r.t.
+ // an allocator.
+ // Does nothing if __GC is defined.
+# ifndef __GC
+ void _M_free_c_string();
+ void _M_free_tree();
+ // Deallocate t. Assumes t is not 0.
+ void _M_unref_nonnil()
+ {
+ _M_decr(); if (!_M_ref_count) _M_free_tree();
+ }
+ void _M_ref_nonnil()
+ {
+ _M_incr();
+ }
+ static void _S_unref(_Self* __t)
+ {
+ if (0 != __t) {
+ __t->_M_unref_nonnil();
+ }
+ }
+ static void _S_ref(_Self* __t)
+ {
+ if (0 != __t) __t->_M_incr();
+ }
+ static void _S_free_if_unref(_Self* __t)
+ {
+ if (0 != __t && 0 == __t->_M_ref_count) __t->_M_free_tree();
+ }
+# else /* __GC */
+ void _M_unref_nonnil() {}
+ void _M_ref_nonnil() {}
+ static void _S_unref(_Self*) {}
+ static void _S_ref(_Self*) {}
+ static void _S_free_if_unref(_Self*) {}
+# endif
+
+ __ROPE_DEFINE_ALLOCS(_Alloc, _M_size)
+ };
+
+template<class _CharT, class _Alloc>
+struct _Rope_RopeLeaf : public _Rope_RopeRep<_CharT,_Alloc> {
+public:
+ __GC_CONST _CharT* _M_data; /* Not necessarily 0 terminated. */
+ /* The allocated size is */
+ /* _S_rounded_up_size(size), except */
+ /* in the GC case, in which it */
+ /* doesn't matter. */
+ _STLP_FORCE_ALLOCATORS(_CharT, _Alloc)
+ typedef typename _Rope_RopeRep<_CharT,_Alloc>::allocator_type allocator_type;
+ _Rope_RopeLeaf(__GC_CONST _CharT* __d, size_t _p_size, allocator_type __a)
+ : _Rope_RopeRep<_CharT,_Alloc>(_Rope_RopeRep<_CharT,_Alloc>::_S_leaf, 0, true, _p_size, __a),
+ _M_data(__d)
+ {
+ _STLP_ASSERT(_p_size > 0)
+ if (_S_is_basic_char_type((_CharT *)0)) {
+ // already eos terminated.
+ this->_M_c_string = __d;
+ }
+ }
+
+# ifdef _STLP_NO_ARROW_OPERATOR
+ _Rope_RopeLeaf() {}
+ _Rope_RopeLeaf(const _Rope_RopeLeaf<_CharT, _Alloc>& ) {}
+# endif
+
+// The constructor assumes that d has been allocated with
+ // the proper allocator and the properly padded size.
+ // In contrast, the destructor deallocates the data:
+# ifndef __GC
+ ~_Rope_RopeLeaf() {
+ if (_M_data != this->_M_c_string) {
+ this->_M_free_c_string();
+ }
+ _S_free_string(_M_data, this->_M_size._M_data, this->get_allocator());
+ }
+# endif
+};
+
+template<class _CharT, class _Alloc>
+struct _Rope_RopeConcatenation : public _Rope_RopeRep<_CharT,_Alloc> {
+public:
+ _Rope_RopeRep<_CharT,_Alloc>* _M_left;
+ _Rope_RopeRep<_CharT,_Alloc>* _M_right;
+ _STLP_FORCE_ALLOCATORS(_CharT, _Alloc)
+ typedef typename _Rope_RopeRep<_CharT,_Alloc>::allocator_type allocator_type;
+ _Rope_RopeConcatenation(_Rope_RopeRep<_CharT,_Alloc>* __l,
+ _Rope_RopeRep<_CharT,_Alloc>* __r,
+ allocator_type __a)
+ : _Rope_RopeRep<_CharT,_Alloc>(
+ _Rope_RopeRep<_CharT,_Alloc>::_S_concat,
+ (max)(__l->_M_depth, __r->_M_depth) + 1, false,
+ __l->_M_size._M_data + __r->_M_size._M_data, __a), _M_left(__l), _M_right(__r)
+ {}
+# ifdef _STLP_NO_ARROW_OPERATOR
+ _Rope_RopeConcatenation() {}
+ _Rope_RopeConcatenation(const _Rope_RopeConcatenation<_CharT, _Alloc>&) {}
+# endif
+
+# ifndef __GC
+ ~_Rope_RopeConcatenation() {
+ this->_M_free_c_string();
+ _M_left->_M_unref_nonnil();
+ _M_right->_M_unref_nonnil();
+ }
+# endif
+};
+
+template<class _CharT, class _Alloc>
+struct _Rope_RopeFunction : public _Rope_RopeRep<_CharT,_Alloc> {
+public:
+ char_producer<_CharT>* _M_fn;
+# ifndef __GC
+ bool _M_delete_when_done; // Char_producer is owned by the
+ // rope and should be explicitly
+ // deleted when the rope becomes
+ // inaccessible.
+# else
+ // In the GC case, we either register the rope for
+ // finalization, or not. Thus the field is unnecessary;
+ // the information is stored in the collector data structures.
+ // We do need a finalization procedure to be invoked by the
+ // collector.
+ static void _S_fn_finalization_proc(void * __tree, void *) {
+ delete ((_Rope_RopeFunction *)__tree) -> _M_fn;
+ }
+# endif
+ _STLP_FORCE_ALLOCATORS(_CharT, _Alloc)
+ typedef typename _Rope_RopeRep<_CharT,_Alloc>::allocator_type allocator_type;
+# ifdef _STLP_NO_ARROW_OPERATOR
+ _Rope_RopeFunction() {}
+ _Rope_RopeFunction(const _Rope_RopeFunction<_CharT, _Alloc>& ) {}
+# endif
+
+ _Rope_RopeFunction(char_producer<_CharT>* __f, size_t _p_size,
+ bool __d, allocator_type __a)
+ :
+ _Rope_RopeRep<_CharT,_Alloc>(_Rope_RopeRep<_CharT,_Alloc>::_S_function, 0, true, _p_size, __a),
+ _M_fn(__f)
+# ifndef __GC
+ , _M_delete_when_done(__d)
+# endif
+ {
+ _STLP_ASSERT(_p_size > 0)
+# ifdef __GC
+ if (__d) {
+ GC_REGISTER_FINALIZER(
+ this, _Rope_RopeFunction::_S_fn_finalization_proc, 0, 0, 0);
+ }
+# endif
+ }
+# ifndef __GC
+ ~_Rope_RopeFunction() {
+ this->_M_free_c_string();
+ if (_M_delete_when_done) {
+ delete _M_fn;
+ }
+ }
+# endif
+};
+// Substring results are usually represented using just
+// concatenation nodes. But in the case of very long flat ropes
+// or ropes with a functional representation that isn't practical.
+// In that case, we represent the __result as a special case of
+// RopeFunction, whose char_producer points back to the rope itself.
+// In all cases except repeated substring operations and
+// deallocation, we treat the __result as a RopeFunction.
+template<class _CharT, class _Alloc>
+# if ( defined (__IBMCPP__) && (__IBMCPP__ == 500) ) // JFA 10-Aug-2000 for some reason xlC cares about the order
+struct _Rope_RopeSubstring : public char_producer<_CharT> , public _Rope_RopeFunction<_CharT,_Alloc>
+# else
+struct _Rope_RopeSubstring : public _Rope_RopeFunction<_CharT,_Alloc>,
+ public char_producer<_CharT>
+# endif
+{
+public:
+ // XXX this whole class should be rewritten.
+ typedef _Rope_RopeRep<_CharT,_Alloc> _Base;
+ _Rope_RopeRep<_CharT,_Alloc>* _M_base; // not 0
+ size_t _M_start;
+ virtual void operator()(size_t __start_pos, size_t __req_len,
+ _CharT* __buffer) {
+ switch(_M_base->_M_tag) {
+ case _Base::_S_function:
+ case _Base::_S_substringfn:
+ {
+ char_producer<_CharT>* __fn =
+ ((_Rope_RopeFunction<_CharT,_Alloc>*)_M_base)->_M_fn;
+ _STLP_ASSERT(__start_pos + __req_len <= this->_M_size._M_data)
+ _STLP_ASSERT(_M_start + this->_M_size._M_data <= _M_base->_M_size._M_data)
+ (*__fn)(__start_pos + _M_start, __req_len, __buffer);
+ }
+ break;
+ case _Base::_S_leaf:
+ {
+ __GC_CONST _CharT* __s =
+ ((_Rope_RopeLeaf<_CharT,_Alloc>*)_M_base)->_M_data;
+ uninitialized_copy_n(__s + __start_pos + _M_start, __req_len,
+ __buffer);
+ }
+ break;
+ default:
+ _STLP_ASSERT(false)
+ ;
+ }
+ }
+
+ _STLP_FORCE_ALLOCATORS(_CharT, _Alloc)
+ typedef typename _Rope_RopeRep<_CharT,_Alloc>::allocator_type allocator_type;
+
+ _Rope_RopeSubstring(_Rope_RopeRep<_CharT,_Alloc>* __b, size_t __s,
+ size_t __l, allocator_type __a)
+ : _Rope_RopeFunction<_CharT,_Alloc>(this, __l, false, __a),
+ _M_base(__b),
+ _M_start(__s)
+
+ {
+ _STLP_ASSERT(__l > 0)
+ _STLP_ASSERT(__s + __l <= __b->_M_size._M_data)
+# ifndef __GC
+ _M_base->_M_ref_nonnil();
+# endif
+ this->_M_tag = _Base::_S_substringfn;
+ }
+ virtual ~_Rope_RopeSubstring()
+ {
+# ifndef __GC
+ _M_base->_M_unref_nonnil();
+# endif
+ }
+};
+
+// Self-destructing pointers to Rope_rep.
+// These are not conventional smart pointers. Their
+// only purpose in life is to ensure that unref is called
+// on the pointer either at normal exit or if an exception
+// is raised. It is the caller's responsibility to
+// adjust reference counts when these pointers are initialized
+// or assigned to. (This convention significantly reduces
+// the number of potentially expensive reference count
+// updates.)
+#ifndef __GC
+template<class _CharT, class _Alloc>
+struct _Rope_self_destruct_ptr {
+ _Rope_RopeRep<_CharT,_Alloc>* _M_ptr;
+ ~_Rope_self_destruct_ptr()
+ { _Rope_RopeRep<_CharT,_Alloc>::_S_unref(_M_ptr); }
+# ifdef _STLP_USE_EXCEPTIONS
+ _Rope_self_destruct_ptr() : _M_ptr(0) {};
+# else
+ _Rope_self_destruct_ptr() {};
+# endif
+ _Rope_self_destruct_ptr(_Rope_RopeRep<_CharT,_Alloc>* __p) : _M_ptr(__p) {}
+ _Rope_RopeRep<_CharT,_Alloc>& operator*() { return *_M_ptr; }
+ _Rope_RopeRep<_CharT,_Alloc>* operator->() { return _M_ptr; }
+ operator _Rope_RopeRep<_CharT,_Alloc>*() { return _M_ptr; }
+ _Rope_self_destruct_ptr<_CharT, _Alloc>&
+ operator= (_Rope_RopeRep<_CharT,_Alloc>* __x)
+ { _M_ptr = __x; return *this; }
+};
+#endif
+
+// Dereferencing a nonconst iterator has to return something
+// that behaves almost like a reference. It's not possible to
+// return an actual reference since assignment requires extra
+// work. And we would get into the same problems as with the
+// CD2 version of basic_string.
+template<class _CharT, class _Alloc>
+class _Rope_char_ref_proxy {
+ typedef _Rope_char_ref_proxy<_CharT, _Alloc> _Self;
+ friend class rope<_CharT,_Alloc>;
+ friend class _Rope_iterator<_CharT,_Alloc>;
+ friend class _Rope_char_ptr_proxy<_CharT,_Alloc>;
+# ifdef __GC
+ typedef _Rope_RopeRep<_CharT,_Alloc>* _Self_destruct_ptr;
+# else
+ typedef _Rope_self_destruct_ptr<_CharT,_Alloc> _Self_destruct_ptr;
+# endif
+ typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep;
+ typedef rope<_CharT,_Alloc> _My_rope;
+ size_t _M_pos;
+ _CharT _M_current;
+ bool _M_current_valid;
+ _My_rope* _M_root; // The whole rope.
+public:
+ _Rope_char_ref_proxy(_My_rope* __r, size_t __p) :
+ _M_pos(__p), _M_current_valid(false), _M_root(__r) {}
+ _Rope_char_ref_proxy(const _Self& __x) :
+ _M_pos(__x._M_pos), _M_current_valid(false), _M_root(__x._M_root) {}
+ // Don't preserve cache if the reference can outlive the
+ // expression. We claim that's not possible without calling
+ // a copy constructor or generating reference to a proxy
+ // reference. We declare the latter to have undefined semantics.
+ _Rope_char_ref_proxy(_My_rope* __r, size_t __p,
+ _CharT __c) :
+ _M_pos(__p), _M_current(__c), _M_current_valid(true), _M_root(__r) {}
+ inline operator _CharT () const;
+ _Self& operator= (_CharT __c);
+ _Rope_char_ptr_proxy<_CharT, _Alloc> operator& () const;
+ _Self& operator= (const _Self& __c) {
+ return operator=((_CharT)__c);
+ }
+};
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+template<class _CharT, class __Alloc>
+inline void swap(_Rope_char_ref_proxy <_CharT, __Alloc > __a,
+ _Rope_char_ref_proxy <_CharT, __Alloc > __b) {
+ _CharT __tmp = __a;
+ __a = __b;
+ __b = __tmp;
+}
+#else
+// There is no really acceptable way to handle this. The default
+// definition of swap doesn't work for proxy references.
+// It can't really be made to work, even with ugly hacks, since
+// the only unusual operation it uses is the copy constructor, which
+// is needed for other purposes. We provide a macro for
+// full specializations, and instantiate the most common case.
+# define _ROPE_SWAP_SPECIALIZATION(_CharT, __Alloc) \
+ inline void swap(_Rope_char_ref_proxy <_CharT, __Alloc > __a, \
+ _Rope_char_ref_proxy <_CharT, __Alloc > __b) { \
+ _CharT __tmp = __a; \
+ __a = __b; \
+ __b = __tmp; \
+ }
+
+_ROPE_SWAP_SPECIALIZATION(char,_STLP_DEFAULT_ALLOCATOR(char) )
+
+#endif /* !_STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+ template<class _CharT, class _Alloc>
+class _Rope_char_ptr_proxy {
+ // XXX this class should be rewritten.
+public:
+ typedef _Rope_char_ptr_proxy<_CharT, _Alloc> _Self;
+ friend class _Rope_char_ref_proxy<_CharT,_Alloc>;
+ size_t _M_pos;
+ rope<_CharT,_Alloc>* _M_root; // The whole rope.
+
+ _Rope_char_ptr_proxy(const _Rope_char_ref_proxy<_CharT,_Alloc>& __x)
+ : _M_pos(__x._M_pos), _M_root(__x._M_root) {}
+ _Rope_char_ptr_proxy(const _Self& __x)
+ : _M_pos(__x._M_pos), _M_root(__x._M_root) {}
+ _Rope_char_ptr_proxy() {}
+ _Rope_char_ptr_proxy(_CharT* __x) : _M_pos(0), _M_root(0) {
+ _STLP_ASSERT(0 == __x)
+ }
+ _Self&
+ operator= (const _Self& __x) {
+ _M_pos = __x._M_pos;
+ _M_root = __x._M_root;
+ return *this;
+ }
+
+ _Rope_char_ref_proxy<_CharT,_Alloc> operator*() const {
+ return _Rope_char_ref_proxy<_CharT,_Alloc>(_M_root, _M_pos);
+ }
+};
+
+
+// Rope iterators:
+// Unlike in the C version, we cache only part of the stack
+// for rope iterators, since they must be efficiently copyable.
+// When we run out of cache, we have to reconstruct the iterator
+// value.
+// Pointers from iterators are not included in reference counts.
+// Iterators are assumed to be thread private. Ropes can
+// be shared.
+
+template<class _CharT, class _Alloc>
+class _Rope_iterator_base
+/* : public random_access_iterator<_CharT, ptrdiff_t> */
+{
+ friend class rope<_CharT,_Alloc>;
+ typedef _Rope_iterator_base<_CharT, _Alloc> _Self;
+public:
+ typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep;
+ // Borland doesnt want this to be protected.
+ // protected:
+ enum { _S_path_cache_len = 4 }; // Must be <= 9.
+ enum { _S_iterator_buf_len = 15 };
+ size_t _M_current_pos;
+ _RopeRep* _M_root; // The whole rope.
+ size_t _M_leaf_pos; // Starting position for current leaf
+ __GC_CONST _CharT* _M_buf_start;
+ // Buffer possibly
+ // containing current char.
+ __GC_CONST _CharT* _M_buf_ptr;
+ // Pointer to current char in buffer.
+ // != 0 ==> buffer valid.
+ __GC_CONST _CharT* _M_buf_end;
+ // One past __last valid char in buffer.
+ // What follows is the path cache. We go out of our
+ // way to make this compact.
+ // Path_end contains the bottom section of the path from
+ // the root to the current leaf.
+ const _RopeRep* _M_path_end[_S_path_cache_len];
+ int _M_leaf_index; // Last valid __pos in path_end;
+ // _M_path_end[0] ... _M_path_end[leaf_index-1]
+ // point to concatenation nodes.
+ unsigned char _M_path_directions;
+ // (path_directions >> __i) & 1 is 1
+ // iff we got from _M_path_end[leaf_index - __i - 1]
+ // to _M_path_end[leaf_index - __i] by going to the
+ // __right. Assumes path_cache_len <= 9.
+ _CharT _M_tmp_buf[_S_iterator_buf_len];
+ // Short buffer for surrounding chars.
+ // This is useful primarily for
+ // RopeFunctions. We put the buffer
+ // here to avoid locking in the
+ // multithreaded case.
+ // The cached path is generally assumed to be valid
+ // only if the buffer is valid.
+ static void _S_setbuf(_Rope_iterator_base<_CharT, _Alloc>& __x);
+ // Set buffer contents given
+ // path cache.
+ static void _S_setcache(_Rope_iterator_base<_CharT, _Alloc>& __x);
+ // Set buffer contents and
+ // path cache.
+ static void _S_setcache_for_incr(_Rope_iterator_base<_CharT, _Alloc>& __x);
+ // As above, but assumes path
+ // cache is valid for previous posn.
+ _Rope_iterator_base() {}
+ _Rope_iterator_base(_RopeRep* __root, size_t __pos)
+ : _M_current_pos(__pos),_M_root(__root), _M_buf_ptr(0) {}
+ void _M_incr(size_t __n);
+ void _M_decr(size_t __n);
+public:
+ size_t index() const { return _M_current_pos; }
+ _Rope_iterator_base(const _Self& __x) {
+ if (0 != __x._M_buf_ptr) {
+ *this = __x;
+ } else {
+ _M_current_pos = __x._M_current_pos;
+ _M_root = __x._M_root;
+ _M_buf_ptr = 0;
+ }
+ }
+};
+
+template<class _CharT, class _Alloc> class _Rope_iterator;
+
+template<class _CharT, class _Alloc>
+class _Rope_const_iterator : public _Rope_iterator_base<_CharT,_Alloc> {
+ friend class rope<_CharT,_Alloc>;
+ typedef _Rope_const_iterator<_CharT, _Alloc> _Self;
+ typedef _Rope_iterator_base<_CharT,_Alloc> _Base;
+ // protected:
+public:
+# ifndef _STLP_HAS_NO_NAMESPACES
+ typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep;
+ // The one from the base class may not be directly visible.
+# endif
+ _Rope_const_iterator(const _RopeRep* __root, size_t __pos):
+ _Rope_iterator_base<_CharT,_Alloc>(
+ __CONST_CAST(_RopeRep*,__root), __pos)
+ // Only nonconst iterators modify root ref count
+ {}
+public:
+ typedef _CharT reference; // Really a value. Returning a reference
+ // Would be a mess, since it would have
+ // to be included in refcount.
+ typedef const _CharT* pointer;
+ typedef _CharT value_type;
+ typedef ptrdiff_t difference_type;
+ typedef random_access_iterator_tag iterator_category;
+
+public:
+ _Rope_const_iterator() {};
+ _Rope_const_iterator(const _Self& __x) :
+ _Rope_iterator_base<_CharT,_Alloc>(__x) { }
+ _Rope_const_iterator(const _Rope_iterator<_CharT,_Alloc>& __x):
+ _Rope_iterator_base<_CharT,_Alloc>(__x) {}
+ _Rope_const_iterator(const rope<_CharT,_Alloc>& __r, size_t __pos) :
+ _Rope_iterator_base<_CharT,_Alloc>(__r._M_tree_ptr._M_data, __pos) {}
+ _Self& operator= (const _Self& __x) {
+ if (0 != __x._M_buf_ptr) {
+ *(__STATIC_CAST(_Base*,this)) = __x;
+ } else {
+ this->_M_current_pos = __x._M_current_pos;
+ this->_M_root = __x._M_root;
+ this->_M_buf_ptr = 0;
+ }
+ return(*this);
+ }
+ reference operator*() {
+ if (0 == this->_M_buf_ptr) _S_setcache(*this);
+ return *(this->_M_buf_ptr);
+ }
+ _Self& operator++() {
+ __GC_CONST _CharT* __next;
+ if (0 != this->_M_buf_ptr && (__next = this->_M_buf_ptr + 1) < this->_M_buf_end) {
+ this->_M_buf_ptr = __next;
+ ++this->_M_current_pos;
+ } else {
+ this->_M_incr(1);
+ }
+ return *this;
+ }
+ _Self& operator+=(ptrdiff_t __n) {
+ if (__n >= 0) {
+ this->_M_incr(__n);
+ } else {
+ this->_M_decr(-__n);
+ }
+ return *this;
+ }
+ _Self& operator--() {
+ this->_M_decr(1);
+ return *this;
+ }
+ _Self& operator-=(ptrdiff_t __n) {
+ if (__n >= 0) {
+ this->_M_decr(__n);
+ } else {
+ this->_M_incr(-__n);
+ }
+ return *this;
+ }
+ _Self operator++(int) {
+ size_t __old_pos = this->_M_current_pos;
+ this->_M_incr(1);
+ return _Rope_const_iterator<_CharT,_Alloc>(this->_M_root, __old_pos);
+ // This makes a subsequent dereference expensive.
+ // Perhaps we should instead copy the iterator
+ // if it has a valid cache?
+ }
+ _Self operator--(int) {
+ size_t __old_pos = this->_M_current_pos;
+ this->_M_decr(1);
+ return _Rope_const_iterator<_CharT,_Alloc>(this->_M_root, __old_pos);
+ }
+ inline reference operator[](size_t __n);
+};
+
+template<class _CharT, class _Alloc>
+class _Rope_iterator : public _Rope_iterator_base<_CharT,_Alloc> {
+ friend class rope<_CharT,_Alloc>;
+ typedef _Rope_iterator<_CharT, _Alloc> _Self;
+ typedef _Rope_iterator_base<_CharT,_Alloc> _Base;
+ typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep;
+ // protected:
+public:
+ rope<_CharT,_Alloc>* _M_root_rope;
+ // root is treated as a cached version of this,
+ // and is used to detect changes to the underlying
+ // rope.
+ // Root is included in the reference count.
+ // This is necessary so that we can detect changes reliably.
+ // Unfortunately, it requires careful bookkeeping for the
+ // nonGC case.
+ _Rope_iterator(rope<_CharT,_Alloc>* __r, size_t __pos);
+
+ void _M_check();
+public:
+ typedef _Rope_char_ref_proxy<_CharT,_Alloc> reference;
+ typedef _Rope_char_ref_proxy<_CharT,_Alloc>* pointer;
+ typedef _CharT value_type;
+ typedef ptrdiff_t difference_type;
+ typedef random_access_iterator_tag iterator_category;
+public:
+ ~_Rope_iterator() //*TY 5/6/00 - added dtor to balance reference count
+ {
+ _RopeRep::_S_unref(this->_M_root);
+ }
+
+ rope<_CharT,_Alloc>& container() { return *_M_root_rope; }
+ _Rope_iterator() {
+ this->_M_root = 0; // Needed for reference counting.
+ };
+ _Rope_iterator(const _Self& __x) :
+ _Rope_iterator_base<_CharT,_Alloc>(__x) {
+ _M_root_rope = __x._M_root_rope;
+ _RopeRep::_S_ref(this->_M_root);
+ }
+ _Rope_iterator(rope<_CharT,_Alloc>& __r, size_t __pos);
+ _Self& operator= (const _Self& __x) {
+ _RopeRep* __old = this->_M_root;
+
+ _RopeRep::_S_ref(__x._M_root);
+ if (0 != __x._M_buf_ptr) {
+ _M_root_rope = __x._M_root_rope;
+ *(__STATIC_CAST(_Base*,this)) = __x;
+ } else {
+ this->_M_current_pos = __x._M_current_pos;
+ this->_M_root = __x._M_root;
+ _M_root_rope = __x._M_root_rope;
+ this->_M_buf_ptr = 0;
+ }
+ _RopeRep::_S_unref(__old);
+ return(*this);
+ }
+ reference operator*() {
+ _M_check();
+ if (0 == this->_M_buf_ptr) {
+ return _Rope_char_ref_proxy<_CharT,_Alloc>(
+ _M_root_rope, this->_M_current_pos);
+ } else {
+ return _Rope_char_ref_proxy<_CharT,_Alloc>(
+ _M_root_rope, this->_M_current_pos, *(this->_M_buf_ptr));
+ }
+ }
+ _Self& operator++() {
+ this->_M_incr(1);
+ return *this;
+ }
+ _Self& operator+=(ptrdiff_t __n) {
+ if (__n >= 0) {
+ this->_M_incr(__n);
+ } else {
+ this->_M_decr(-__n);
+ }
+ return *this;
+ }
+ _Self& operator--() {
+ this->_M_decr(1);
+ return *this;
+ }
+ _Self& operator-=(ptrdiff_t __n) {
+ if (__n >= 0) {
+ this->_M_decr(__n);
+ } else {
+ this->_M_incr(-__n);
+ }
+ return *this;
+ }
+ _Self operator++(int) {
+ size_t __old_pos = this->_M_current_pos;
+ this->_M_incr(1);
+ return _Rope_iterator<_CharT,_Alloc>(_M_root_rope, __old_pos);
+ }
+ _Self operator--(int) {
+ size_t __old_pos = this->_M_current_pos;
+ this->_M_decr(1);
+ return _Rope_iterator<_CharT,_Alloc>(_M_root_rope, __old_pos);
+ }
+ reference operator[](ptrdiff_t __n) {
+ return _Rope_char_ref_proxy<_CharT,_Alloc>(
+ _M_root_rope, this->_M_current_pos + __n);
+ }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _CharT, class _Alloc>
+inline random_access_iterator_tag
+iterator_category(const _Rope_iterator<_CharT,_Alloc>&) { return random_access_iterator_tag();}
+template <class _CharT, class _Alloc>
+inline _CharT* value_type(const _Rope_iterator<_CharT,_Alloc>&) { return 0; }
+template <class _CharT, class _Alloc>
+inline ptrdiff_t* distance_type(const _Rope_iterator<_CharT,_Alloc>&) { return 0; }
+template <class _CharT, class _Alloc>
+inline random_access_iterator_tag
+iterator_category(const _Rope_const_iterator<_CharT,_Alloc>&) { return random_access_iterator_tag(); }
+template <class _CharT, class _Alloc>
+inline _CharT* value_type(const _Rope_const_iterator<_CharT,_Alloc>&) { return 0; }
+template <class _CharT, class _Alloc>
+inline ptrdiff_t* distance_type(const _Rope_const_iterator<_CharT,_Alloc>&) { return 0; }
+#endif
+
+template <class _CharT, class _Alloc>
+class rope {
+ typedef rope<_CharT,_Alloc> _Self;
+public:
+ typedef _CharT value_type;
+ typedef ptrdiff_t difference_type;
+ typedef size_t size_type;
+ typedef _CharT const_reference;
+ typedef const _CharT* const_pointer;
+ typedef _Rope_iterator<_CharT,_Alloc> iterator;
+ typedef _Rope_const_iterator<_CharT,_Alloc> const_iterator;
+ typedef _Rope_char_ref_proxy<_CharT,_Alloc> reference;
+ typedef _Rope_char_ptr_proxy<_CharT,_Alloc> pointer;
+
+ friend class _Rope_iterator<_CharT,_Alloc>;
+ friend class _Rope_const_iterator<_CharT,_Alloc>;
+ friend struct _Rope_RopeRep<_CharT,_Alloc>;
+ friend class _Rope_iterator_base<_CharT,_Alloc>;
+ friend class _Rope_char_ptr_proxy<_CharT,_Alloc>;
+ friend class _Rope_char_ref_proxy<_CharT,_Alloc>;
+ friend struct _Rope_RopeSubstring<_CharT,_Alloc>;
+
+ _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+
+protected:
+ typedef __GC_CONST _CharT* _Cstrptr;
+
+ static _CharT _S_empty_c_str[1];
+
+ static bool _S_is0(_CharT __c) { return __c == _S_eos((_CharT*)0); }
+ enum { _S_copy_max = 23 };
+ // For strings shorter than _S_copy_max, we copy to
+ // concatenate.
+
+public:
+ typedef _Rope_RopeRep<_CharT, _Alloc> _RopeRep;
+ _STLP_FORCE_ALLOCATORS(_CharT, _Alloc)
+ typedef typename _Alloc_traits<_CharT,_Alloc>::allocator_type allocator_type;
+ allocator_type get_allocator() const { return allocator_type(_M_tree_ptr); }
+public:
+ // The only data member of a rope:
+ _STLP_alloc_proxy<_RopeRep*, _CharT, allocator_type> _M_tree_ptr;
+
+ typedef _Rope_RopeConcatenation<_CharT,_Alloc> _RopeConcatenation;
+ typedef _Rope_RopeLeaf<_CharT,_Alloc> _RopeLeaf;
+ typedef _Rope_RopeFunction<_CharT,_Alloc> _RopeFunction;
+ typedef _Rope_RopeSubstring<_CharT,_Alloc> _RopeSubstring;
+
+
+
+ // Retrieve a character at the indicated position.
+ static _CharT _S_fetch(_RopeRep* __r, size_type __pos);
+
+# ifndef __GC
+ // Obtain a pointer to the character at the indicated position.
+ // The pointer can be used to change the character.
+ // If such a pointer cannot be produced, as is frequently the
+ // case, 0 is returned instead.
+ // (Returns nonzero only if all nodes in the path have a refcount
+ // of 1.)
+ static _CharT* _S_fetch_ptr(_RopeRep* __r, size_type __pos);
+# endif
+
+ static bool _S_apply_to_pieces(
+ // should be template parameter
+ _Rope_char_consumer<_CharT>& __c,
+ const _RopeRep* __r,
+ size_t __begin, size_t __end);
+ // begin and end are assumed to be in range.
+
+# ifndef __GC
+ static void _S_unref(_RopeRep* __t)
+ {
+ _RopeRep::_S_unref(__t);
+ }
+ static void _S_ref(_RopeRep* __t)
+ {
+ _RopeRep::_S_ref(__t);
+ }
+# else /* __GC */
+ static void _S_unref(_RopeRep*) {}
+ static void _S_ref(_RopeRep*) {}
+# endif
+
+
+# ifdef __GC
+ typedef _Rope_RopeRep<_CharT,_Alloc>* _Self_destruct_ptr;
+# else
+ typedef _Rope_self_destruct_ptr<_CharT,_Alloc> _Self_destruct_ptr;
+# endif
+
+ // _Result is counted in refcount.
+ static _RopeRep* _S_substring(_RopeRep* __base,
+ size_t __start, size_t __endp1);
+
+ static _RopeRep* _S_concat_char_iter(_RopeRep* __r,
+ const _CharT* __iter, size_t __slen);
+ // Concatenate rope and char ptr, copying __s.
+ // Should really take an arbitrary iterator.
+ // Result is counted in refcount.
+ static _RopeRep* _S_destr_concat_char_iter(_RopeRep* __r,
+ const _CharT* __iter, size_t __slen)
+ // As above, but one reference to __r is about to be
+ // destroyed. Thus the pieces may be recycled if all
+ // relevent reference counts are 1.
+# ifdef __GC
+ // We can't really do anything since refcounts are unavailable.
+ { return _S_concat_char_iter(__r, __iter, __slen); }
+# else
+ ;
+# endif
+
+ static _RopeRep* _S_concat_rep(_RopeRep* __left, _RopeRep* __right);
+ // General concatenation on _RopeRep. _Result
+ // has refcount of 1. Adjusts argument refcounts.
+
+public:
+ void apply_to_pieces( size_t __begin, size_t __end,
+ _Rope_char_consumer<_CharT>& __c) const {
+ _S_apply_to_pieces(__c, _M_tree_ptr._M_data, __begin, __end);
+ }
+
+
+protected:
+
+ static size_t _S_rounded_up_size(size_t __n) {
+ return _RopeRep::_S_rounded_up_size(__n);
+ }
+
+ static size_t _S_allocated_capacity(size_t __n) {
+ if (_S_is_basic_char_type((_CharT*)0)) {
+ return _S_rounded_up_size(__n) - 1;
+ } else {
+ return _S_rounded_up_size(__n);
+ }
+ }
+
+ // Allocate and construct a RopeLeaf using the supplied allocator
+ // Takes ownership of s instead of copying.
+ static _RopeLeaf* _S_new_RopeLeaf(__GC_CONST _CharT *__s,
+ size_t _p_size, allocator_type __a)
+ {
+ _RopeLeaf* __space = _STLP_CREATE_ALLOCATOR(allocator_type,__a, _RopeLeaf).allocate(1,(const void*)0);
+ _STLP_TRY {
+ _STLP_PLACEMENT_NEW(__space) _RopeLeaf(__s, _p_size, __a);
+ }
+ _STLP_UNWIND(_STLP_CREATE_ALLOCATOR(allocator_type,__a,
+ _RopeLeaf).deallocate(__space, 1))
+ return __space;
+ }
+
+ static _RopeConcatenation* _S_new_RopeConcatenation(
+ _RopeRep* __left, _RopeRep* __right,
+ allocator_type __a)
+ {
+ _RopeConcatenation* __space = _STLP_CREATE_ALLOCATOR(allocator_type,__a,
+ _RopeConcatenation).allocate(1,(const void*)0);
+ return _STLP_PLACEMENT_NEW(__space) _RopeConcatenation(__left, __right, __a);
+ }
+
+ static _RopeFunction* _S_new_RopeFunction(char_producer<_CharT>* __f,
+ size_t _p_size, bool __d, allocator_type __a)
+ {
+ _RopeFunction* __space = _STLP_CREATE_ALLOCATOR(allocator_type,__a,
+ _RopeFunction).allocate(1,(const void*)0);
+ return _STLP_PLACEMENT_NEW(__space) _RopeFunction(__f, _p_size, __d, __a);
+ }
+
+ static _RopeSubstring* _S_new_RopeSubstring(
+ _Rope_RopeRep<_CharT,_Alloc>* __b, size_t __s,
+ size_t __l, allocator_type __a)
+ {
+ _RopeSubstring* __space = _STLP_CREATE_ALLOCATOR(allocator_type,__a,
+ _RopeSubstring).allocate(1,(const void*)0);
+ return _STLP_PLACEMENT_NEW(__space) _RopeSubstring(__b, __s, __l, __a);
+ }
+
+# define _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, _p_size, __a) \
+ _S_RopeLeaf_from_unowned_char_ptr(__s, _p_size, __a)
+
+ static
+ _RopeLeaf* _S_RopeLeaf_from_unowned_char_ptr(const _CharT *__s,
+ size_t _p_size, allocator_type __a)
+ {
+ if (0 == _p_size) return 0;
+
+ _CharT* __buf = _STLP_CREATE_ALLOCATOR(allocator_type,__a, _CharT).allocate(_S_rounded_up_size(_p_size));
+
+ uninitialized_copy_n(__s, _p_size, __buf);
+ _S_cond_store_eos(__buf[_p_size]);
+
+ _STLP_TRY {
+ return _S_new_RopeLeaf(__buf, _p_size, __a);
+ }
+ _STLP_UNWIND(_RopeRep::_S_free_string(__buf, _p_size, __a))
+
+# if defined (_STLP_THROW_RETURN_BUG)
+ return 0;
+# endif
+ }
+
+
+ // Concatenation of nonempty strings.
+ // Always builds a concatenation node.
+ // Rebalances if the result is too deep.
+ // Result has refcount 1.
+ // Does not increment left and right ref counts even though
+ // they are referenced.
+ static _RopeRep*
+ _S_tree_concat(_RopeRep* __left, _RopeRep* __right);
+
+ // Concatenation helper functions
+ static _RopeLeaf*
+ _S_leaf_concat_char_iter(_RopeLeaf* __r,
+ const _CharT* __iter, size_t __slen);
+ // Concatenate by copying leaf.
+ // should take an arbitrary iterator
+ // result has refcount 1.
+# ifndef __GC
+ static _RopeLeaf* _S_destr_leaf_concat_char_iter
+ (_RopeLeaf* __r, const _CharT* __iter, size_t __slen);
+ // A version that potentially clobbers __r if __r->_M_ref_count == 1.
+# endif
+
+
+ // A helper function for exponentiating strings.
+ // This uses a nonstandard refcount convention.
+ // The result has refcount 0.
+ friend struct _Rope_Concat_fn<_CharT,_Alloc>;
+ typedef _Rope_Concat_fn<_CharT,_Alloc> _Concat_fn;
+
+public:
+ static size_t _S_char_ptr_len(const _CharT* __s) {
+ const _CharT* __p = __s;
+
+ while (!_S_is0(*__p)) { ++__p; }
+ return (__p - __s);
+ }
+
+public: /* for operators */
+ rope(_RopeRep* __t, const allocator_type& __a = allocator_type())
+ : _M_tree_ptr(__a, __t) { }
+private:
+ // Copy __r to the _CharT buffer.
+ // Returns __buffer + __r->_M_size._M_data.
+ // Assumes that buffer is uninitialized.
+ static _CharT* _S_flatten(_RopeRep* __r, _CharT* __buffer);
+
+ // Again, with explicit starting position and length.
+ // Assumes that buffer is uninitialized.
+ static _CharT* _S_flatten(_RopeRep* __r,
+ size_t __start, size_t __len,
+ _CharT* __buffer);
+
+ // fbp : HP aCC prohibits access to protected min_len from within static methods ( ?? )
+public:
+ static const unsigned long _S_min_len[46];
+protected:
+ static bool _S_is_balanced(_RopeRep* __r)
+ { return (__r->_M_size._M_data >= _S_min_len[__r->_M_depth]); }
+
+ static bool _S_is_almost_balanced(_RopeRep* __r)
+ { return (__r->_M_depth == 0 ||
+ __r->_M_size._M_data >= _S_min_len[__r->_M_depth - 1]); }
+
+ static bool _S_is_roughly_balanced(_RopeRep* __r)
+ { return (__r->_M_depth <= 1 ||
+ __r->_M_size._M_data >= _S_min_len[__r->_M_depth - 2]); }
+
+ // Assumes the result is not empty.
+ static _RopeRep* _S_concat_and_set_balanced(_RopeRep* __left,
+ _RopeRep* __right)
+ {
+ _RopeRep* __result = _S_concat_rep(__left, __right);
+ if (_S_is_balanced(__result)) __result->_M_is_balanced = true;
+ return __result;
+ }
+
+ // The basic rebalancing operation. Logically copies the
+ // rope. The result has refcount of 1. The client will
+ // usually decrement the reference count of __r.
+ // The result is within height 2 of balanced by the above
+ // definition.
+ static _RopeRep* _S_balance(_RopeRep* __r);
+
+ // Add all unbalanced subtrees to the forest of balanceed trees.
+ // Used only by balance.
+ static void _S_add_to_forest(_RopeRep*__r, _RopeRep** __forest);
+
+ // Add __r to forest, assuming __r is already balanced.
+ static void _S_add_leaf_to_forest(_RopeRep* __r, _RopeRep** __forest);
+
+ // Print to stdout, exposing structure
+ static void _S_dump(_RopeRep* __r, int __indent = 0);
+
+ // Return -1, 0, or 1 if __x < __y, __x == __y, or __x > __y resp.
+ static int _S_compare(const _RopeRep* __x, const _RopeRep* __y);
+
+public:
+ bool empty() const { return 0 == _M_tree_ptr._M_data; }
+
+ // Comparison member function. This is public only for those
+ // clients that need a ternary comparison. Others
+ // should use the comparison operators below.
+ int compare(const _Self& __y) const {
+ return _S_compare(_M_tree_ptr._M_data, __y._M_tree_ptr._M_data);
+ }
+
+ rope(const _CharT* __s, const allocator_type& __a = allocator_type())
+ : _M_tree_ptr(__a, _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, _S_char_ptr_len(__s),__a))
+ { }
+
+ rope(const _CharT* __s, size_t __len,
+ const allocator_type& __a = allocator_type())
+ : _M_tree_ptr(__a, (_STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __len, __a)))
+ { }
+
+ // Should perhaps be templatized with respect to the iterator type
+ // and use Sequence_buffer. (It should perhaps use sequence_buffer
+ // even now.)
+ rope(const _CharT *__s, const _CharT *__e,
+ const allocator_type& __a = allocator_type())
+ : _M_tree_ptr(__a, _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __e - __s, __a))
+ { }
+
+ rope(const const_iterator& __s, const const_iterator& __e,
+ const allocator_type& __a = allocator_type())
+ : _M_tree_ptr(__a, _S_substring(__s._M_root, __s._M_current_pos,
+ __e._M_current_pos))
+ { }
+
+ rope(const iterator& __s, const iterator& __e,
+ const allocator_type& __a = allocator_type())
+ : _M_tree_ptr(__a, _S_substring(__s._M_root, __s._M_current_pos,
+ __e._M_current_pos))
+ { }
+
+ rope(_CharT __c, const allocator_type& __a = allocator_type())
+ : _M_tree_ptr(__a, (_RopeRep*)0)
+ {
+ _CharT* __buf = _M_tree_ptr.allocate(_S_rounded_up_size(1));
+
+ _Construct(__buf, __c);
+ _STLP_TRY {
+ _M_tree_ptr._M_data = _S_new_RopeLeaf(__buf, 1, __a);
+ }
+ _STLP_UNWIND(_RopeRep::_S_free_string(__buf, 1, __a))
+ }
+
+ rope(size_t __n, _CharT __c,
+ const allocator_type& __a = allocator_type()):
+ _M_tree_ptr(__a, (_RopeRep*)0) {
+ rope<_CharT,_Alloc> __result;
+# define __exponentiate_threshold size_t(32)
+ _RopeRep* __remainder;
+ rope<_CharT,_Alloc> __remainder_rope;
+
+ // gcc-2.7.2 bugs
+ typedef _Rope_Concat_fn<_CharT,_Alloc> _Concat_fn;
+
+ if (0 == __n)
+ return;
+
+ size_t __exponent = __n / __exponentiate_threshold;
+ size_t __rest = __n % __exponentiate_threshold;
+ if (0 == __rest) {
+ __remainder = 0;
+ } else {
+ _CharT* __rest_buffer = _M_tree_ptr.allocate(_S_rounded_up_size(__rest));
+ uninitialized_fill_n(__rest_buffer, __rest, __c);
+ _S_cond_store_eos(__rest_buffer[__rest]);
+ _STLP_TRY {
+ __remainder = _S_new_RopeLeaf(__rest_buffer, __rest, __a);
+ }
+ _STLP_UNWIND(_RopeRep::_S_free_string(__rest_buffer, __rest, __a))
+ }
+ __remainder_rope._M_tree_ptr._M_data = __remainder;
+ if (__exponent != 0) {
+ _CharT* __base_buffer =
+ _M_tree_ptr.allocate(_S_rounded_up_size(__exponentiate_threshold));
+ _RopeLeaf* __base_leaf;
+ rope<_CharT,_Alloc> __base_rope;
+ uninitialized_fill_n(__base_buffer, __exponentiate_threshold, __c);
+ _S_cond_store_eos(__base_buffer[__exponentiate_threshold]);
+ _STLP_TRY {
+ __base_leaf = _S_new_RopeLeaf(__base_buffer,
+ __exponentiate_threshold, __a);
+ }
+ _STLP_UNWIND(_RopeRep::_S_free_string(__base_buffer,
+ __exponentiate_threshold, __a))
+ __base_rope._M_tree_ptr._M_data = __base_leaf;
+ if (1 == __exponent) {
+ __result = __base_rope;
+# ifndef __GC
+ _STLP_ASSERT(2 == __result._M_tree_ptr._M_data->_M_ref_count)
+ // One each for base_rope and __result
+# endif
+ } else {
+ __result = power(__base_rope, __exponent, _Concat_fn());
+ }
+ if (0 != __remainder) {
+ __result += __remainder_rope;
+ }
+ } else {
+ __result = __remainder_rope;
+ }
+ _M_tree_ptr._M_data = __result._M_tree_ptr._M_data;
+ _M_tree_ptr._M_data->_M_ref_nonnil();
+# undef __exponentiate_threshold
+ }
+
+ rope(const allocator_type& __a = allocator_type())
+ : _M_tree_ptr(__a, (_RopeRep*)0) {}
+
+ // Construct a rope from a function that can compute its members
+ rope(char_producer<_CharT> *__fn, size_t __len, bool __delete_fn,
+ const allocator_type& __a = allocator_type())
+ : _M_tree_ptr(__a, (_RopeRep*)0)
+ {
+ _M_tree_ptr._M_data = (0 == __len) ?
+ 0 : _S_new_RopeFunction(__fn, __len, __delete_fn, __a);
+ }
+
+ rope(const _Self& __x)
+ : _M_tree_ptr(__x.get_allocator(), __x._M_tree_ptr._M_data)
+ {
+ _S_ref(_M_tree_ptr._M_data);
+ }
+
+ ~rope()
+ {
+ _S_unref(_M_tree_ptr._M_data);
+ }
+
+ _Self& operator=(const _Self& __x)
+ {
+ _RopeRep* __old = _M_tree_ptr._M_data;
+ _STLP_ASSERT(get_allocator() == __x.get_allocator())
+ _M_tree_ptr._M_data = __x._M_tree_ptr._M_data;
+ _S_ref(_M_tree_ptr._M_data);
+ _S_unref(__old);
+ return(*this);
+ }
+ void clear()
+ {
+ _S_unref(_M_tree_ptr._M_data);
+ _M_tree_ptr._M_data = 0;
+ }
+ void push_back(_CharT __x)
+ {
+ _RopeRep* __old = _M_tree_ptr._M_data;
+ _M_tree_ptr._M_data = _S_destr_concat_char_iter(_M_tree_ptr._M_data, &__x, 1);
+ _S_unref(__old);
+ }
+
+ void pop_back()
+ {
+ _RopeRep* __old = _M_tree_ptr._M_data;
+ _M_tree_ptr._M_data =
+ _S_substring(_M_tree_ptr._M_data, 0, _M_tree_ptr._M_data->_M_size._M_data - 1);
+ _S_unref(__old);
+ }
+
+ _CharT back() const
+ {
+ return _S_fetch(_M_tree_ptr._M_data, _M_tree_ptr._M_data->_M_size._M_data - 1);
+ }
+
+ void push_front(_CharT __x)
+ {
+ _RopeRep* __old = _M_tree_ptr._M_data;
+ _RopeRep* __left =
+ _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(&__x, 1, get_allocator());
+ _STLP_TRY {
+ _M_tree_ptr._M_data = _S_concat_rep(__left, _M_tree_ptr._M_data);
+ _S_unref(__old);
+ _S_unref(__left);
+ }
+ _STLP_UNWIND(_S_unref(__left))
+ }
+
+ void pop_front()
+ {
+ _RopeRep* __old = _M_tree_ptr._M_data;
+ _M_tree_ptr._M_data = _S_substring(_M_tree_ptr._M_data, 1, _M_tree_ptr._M_data->_M_size._M_data);
+ _S_unref(__old);
+ }
+
+ _CharT front() const
+ {
+ return _S_fetch(_M_tree_ptr._M_data, 0);
+ }
+
+ void balance()
+ {
+ _RopeRep* __old = _M_tree_ptr._M_data;
+ _M_tree_ptr._M_data = _S_balance(_M_tree_ptr._M_data);
+ _S_unref(__old);
+ }
+
+ void copy(_CharT* __buffer) const {
+ _STLP_STD::_Destroy(__buffer, __buffer + size());
+ _S_flatten(_M_tree_ptr._M_data, __buffer);
+ }
+
+ // This is the copy function from the standard, but
+ // with the arguments reordered to make it consistent with the
+ // rest of the interface.
+ // Note that this guaranteed not to compile if the draft standard
+ // order is assumed.
+ size_type copy(size_type __pos, size_type __n, _CharT* __buffer) const
+ {
+ size_t _p_size = size();
+ size_t __len = (__pos + __n > _p_size? _p_size - __pos : __n);
+
+ _STLP_STD::_Destroy(__buffer, __buffer + __len);
+ _S_flatten(_M_tree_ptr._M_data, __pos, __len, __buffer);
+ return __len;
+ }
+
+ // Print to stdout, exposing structure. May be useful for
+ // performance debugging.
+ void dump() {
+ _S_dump(_M_tree_ptr._M_data);
+ }
+
+ // Convert to 0 terminated string in new allocated memory.
+ // Embedded 0s in the input do not terminate the copy.
+ const _CharT* c_str() const;
+
+ // As above, but lso use the flattened representation as the
+ // the new rope representation.
+ const _CharT* replace_with_c_str();
+
+ // Reclaim memory for the c_str generated flattened string.
+ // Intentionally undocumented, since it's hard to say when this
+ // is safe for multiple threads.
+ void delete_c_str () {
+ if (0 == _M_tree_ptr._M_data) return;
+ if (_RopeRep::_S_leaf == _M_tree_ptr._M_data->_M_tag &&
+ ((_RopeLeaf*)_M_tree_ptr._M_data)->_M_data ==
+ _M_tree_ptr._M_data->_M_c_string) {
+ // Representation shared
+ return;
+ }
+# ifndef __GC
+ _M_tree_ptr._M_data->_M_free_c_string();
+# endif
+ _M_tree_ptr._M_data->_M_c_string = 0;
+ }
+
+ _CharT operator[] (size_type __pos) const {
+ return _S_fetch(_M_tree_ptr._M_data, __pos);
+ }
+
+ _CharT at(size_type __pos) const {
+ // if (__pos >= size()) throw out_of_range; // XXX
+ return (*this)[__pos];
+ }
+
+ const_iterator begin() const {
+ return(const_iterator(_M_tree_ptr._M_data, 0));
+ }
+
+ // An easy way to get a const iterator from a non-const container.
+ const_iterator const_begin() const {
+ return(const_iterator(_M_tree_ptr._M_data, 0));
+ }
+
+ const_iterator end() const {
+ return(const_iterator(_M_tree_ptr._M_data, size()));
+ }
+
+ const_iterator const_end() const {
+ return(const_iterator(_M_tree_ptr._M_data, size()));
+ }
+
+ size_type size() const {
+ return(0 == _M_tree_ptr._M_data? 0 : _M_tree_ptr._M_data->_M_size._M_data);
+ }
+
+ size_type length() const {
+ return size();
+ }
+
+ size_type max_size() const {
+ return _S_min_len[__ROPE_MAX_DEPTH-1] - 1;
+ // Guarantees that the result can be sufficirntly
+ // balanced. Longer ropes will probably still work,
+ // but it's harder to make guarantees.
+ }
+
+ const_reverse_iterator rbegin() const {
+ return const_reverse_iterator(end());
+ }
+
+ const_reverse_iterator const_rbegin() const {
+ return const_reverse_iterator(end());
+ }
+
+ const_reverse_iterator rend() const {
+ return const_reverse_iterator(begin());
+ }
+
+ const_reverse_iterator const_rend() const {
+ return const_reverse_iterator(begin());
+ }
+ // The symmetric cases are intentionally omitted, since they're presumed
+ // to be less common, and we don't handle them as well.
+
+ // The following should really be templatized.
+ // The first argument should be an input iterator or
+ // forward iterator with value_type _CharT.
+ _Self& append(const _CharT* __iter, size_t __n) {
+ _RopeRep* __result =
+ _S_destr_concat_char_iter(_M_tree_ptr._M_data, __iter, __n);
+ _S_unref(_M_tree_ptr._M_data);
+ _M_tree_ptr._M_data = __result;
+ return *this;
+ }
+
+ _Self& append(const _CharT* __c_string) {
+ size_t __len = _S_char_ptr_len(__c_string);
+ append(__c_string, __len);
+ return(*this);
+ }
+
+ _Self& append(const _CharT* __s, const _CharT* __e) {
+ _RopeRep* __result =
+ _S_destr_concat_char_iter(_M_tree_ptr._M_data, __s, __e - __s);
+ _S_unref(_M_tree_ptr._M_data);
+ _M_tree_ptr._M_data = __result;
+ return *this;
+ }
+
+ _Self& append(const_iterator __s, const_iterator __e) {
+ _STLP_ASSERT(__s._M_root == __e._M_root)
+ _STLP_ASSERT(get_allocator() == __s._M_root->get_allocator())
+ _Self_destruct_ptr __appendee(_S_substring(
+ __s._M_root, __s._M_current_pos, __e._M_current_pos));
+ _RopeRep* __result =
+ _S_concat_rep(_M_tree_ptr._M_data, (_RopeRep*)__appendee);
+ _S_unref(_M_tree_ptr._M_data);
+ _M_tree_ptr._M_data = __result;
+ return *this;
+ }
+
+ _Self& append(_CharT __c) {
+ _RopeRep* __result =
+ _S_destr_concat_char_iter(_M_tree_ptr._M_data, &__c, 1);
+ _S_unref(_M_tree_ptr._M_data);
+ _M_tree_ptr._M_data = __result;
+ return *this;
+ }
+
+ _Self& append() { return append(_CharT()); } // XXX why?
+
+ _Self& append(const _Self& __y) {
+ _STLP_ASSERT(__y.get_allocator() == get_allocator())
+ _RopeRep* __result = _S_concat_rep(_M_tree_ptr._M_data, __y._M_tree_ptr._M_data);
+ _S_unref(_M_tree_ptr._M_data);
+ _M_tree_ptr._M_data = __result;
+ return *this;
+ }
+
+ _Self& append(size_t __n, _CharT __c) {
+ rope<_CharT,_Alloc> __last(__n, __c);
+ return append(__last);
+ }
+
+ void swap(_Self& __b) {
+ _STLP_ASSERT(get_allocator() == __b.get_allocator())
+ _RopeRep* __tmp = _M_tree_ptr._M_data;
+ _M_tree_ptr._M_data = __b._M_tree_ptr._M_data;
+ __b._M_tree_ptr._M_data = __tmp;
+ }
+
+
+protected:
+ // Result is included in refcount.
+ static _RopeRep* replace(_RopeRep* __old, size_t __pos1,
+ size_t __pos2, _RopeRep* __r) {
+ if (0 == __old) { _S_ref(__r); return __r; }
+ _Self_destruct_ptr __left(
+ _S_substring(__old, 0, __pos1));
+ _Self_destruct_ptr __right(
+ _S_substring(__old, __pos2, __old->_M_size._M_data));
+ _STLP_MPWFIX_TRY //*TY 06/01/2000 -
+ _RopeRep* __result;
+
+ if (0 == __r) {
+ __result = _S_concat_rep(__left, __right);
+ } else {
+ _STLP_ASSERT(__old->get_allocator() == __r->get_allocator())
+ _Self_destruct_ptr __left_result(_S_concat_rep(__left, __r));
+ __result = _S_concat_rep(__left_result, __right);
+ }
+ return __result;
+ _STLP_MPWFIX_CATCH //*TY 06/01/2000 -
+ }
+
+public:
+ void insert(size_t __p, const _Self& __r) {
+ _RopeRep* __result =
+ replace(_M_tree_ptr._M_data, __p, __p, __r._M_tree_ptr._M_data);
+ _STLP_ASSERT(get_allocator() == __r.get_allocator())
+ _S_unref(_M_tree_ptr._M_data);
+ _M_tree_ptr._M_data = __result;
+ }
+
+ void insert(size_t __p, size_t __n, _CharT __c) {
+ rope<_CharT,_Alloc> __r(__n,__c);
+ insert(__p, __r);
+ }
+
+ void insert(size_t __p, const _CharT* __i, size_t __n) {
+ _Self_destruct_ptr __left(_S_substring(_M_tree_ptr._M_data, 0, __p));
+ _Self_destruct_ptr __right(_S_substring(_M_tree_ptr._M_data, __p, size()));
+ _Self_destruct_ptr __left_result(
+ _S_concat_char_iter(__left, __i, __n));
+ // _S_ destr_concat_char_iter should be safe here.
+ // But as it stands it's probably not a win, since __left
+ // is likely to have additional references.
+ _RopeRep* __result = _S_concat_rep(__left_result, __right);
+ _S_unref(_M_tree_ptr._M_data);
+ _M_tree_ptr._M_data = __result;
+ }
+
+ void insert(size_t __p, const _CharT* __c_string) {
+ insert(__p, __c_string, _S_char_ptr_len(__c_string));
+ }
+
+ void insert(size_t __p, _CharT __c) {
+ insert(__p, &__c, 1);
+ }
+
+ void insert(size_t __p) {
+ _CharT __c = _CharT();
+ insert(__p, &__c, 1);
+ }
+
+ void insert(size_t __p, const _CharT* __i, const _CharT* __j) {
+ _Self __r(__i, __j);
+ insert(__p, __r);
+ }
+
+ void insert(size_t __p, const const_iterator& __i,
+ const const_iterator& __j) {
+ _Self __r(__i, __j);
+ insert(__p, __r);
+ }
+
+ void insert(size_t __p, const iterator& __i,
+ const iterator& __j) {
+ _Self __r(__i, __j);
+ insert(__p, __r);
+ }
+
+ // (position, length) versions of replace operations:
+
+ void replace(size_t __p, size_t __n, const _Self& __r) {
+ _RopeRep* __result =
+ replace(_M_tree_ptr._M_data, __p, __p + __n, __r._M_tree_ptr._M_data);
+ _S_unref(_M_tree_ptr._M_data);
+ _M_tree_ptr._M_data = __result;
+ }
+
+ void replace(size_t __p, size_t __n,
+ const _CharT* __i, size_t __i_len) {
+ _Self __r(__i, __i_len);
+ replace(__p, __n, __r);
+ }
+
+ void replace(size_t __p, size_t __n, _CharT __c) {
+ _Self __r(__c);
+ replace(__p, __n, __r);
+ }
+
+ void replace(size_t __p, size_t __n, const _CharT* __c_string) {
+ _Self __r(__c_string);
+ replace(__p, __n, __r);
+ }
+
+ void replace(size_t __p, size_t __n,
+ const _CharT* __i, const _CharT* __j) {
+ _Self __r(__i, __j);
+ replace(__p, __n, __r);
+ }
+
+ void replace(size_t __p, size_t __n,
+ const const_iterator& __i, const const_iterator& __j) {
+ _Self __r(__i, __j);
+ replace(__p, __n, __r);
+ }
+
+ void replace(size_t __p, size_t __n,
+ const iterator& __i, const iterator& __j) {
+ _Self __r(__i, __j);
+ replace(__p, __n, __r);
+ }
+
+ // Single character variants:
+ void replace(size_t __p, _CharT __c) {
+ iterator __i(this, __p);
+ *__i = __c;
+ }
+
+ void replace(size_t __p, const _Self& __r) {
+ replace(__p, 1, __r);
+ }
+
+ void replace(size_t __p, const _CharT* __i, size_t __i_len) {
+ replace(__p, 1, __i, __i_len);
+ }
+
+ void replace(size_t __p, const _CharT* __c_string) {
+ replace(__p, 1, __c_string);
+ }
+
+ void replace(size_t __p, const _CharT* __i, const _CharT* __j) {
+ replace(__p, 1, __i, __j);
+ }
+
+ void replace(size_t __p, const const_iterator& __i,
+ const const_iterator& __j) {
+ replace(__p, 1, __i, __j);
+ }
+
+ void replace(size_t __p, const iterator& __i,
+ const iterator& __j) {
+ replace(__p, 1, __i, __j);
+ }
+
+ // Erase, (position, size) variant.
+ void erase(size_t __p, size_t __n) {
+ _RopeRep* __result = replace(_M_tree_ptr._M_data, __p, __p + __n, 0);
+ _S_unref(_M_tree_ptr._M_data);
+ _M_tree_ptr._M_data = __result;
+ }
+
+ // Erase, single character
+ void erase(size_t __p) {
+ erase(__p, __p + 1);
+ }
+
+ // Insert, iterator variants.
+ iterator insert(const iterator& __p, const _Self& __r)
+ { insert(__p.index(), __r); return __p; }
+ iterator insert(const iterator& __p, size_t __n, _CharT __c)
+ { insert(__p.index(), __n, __c); return __p; }
+ iterator insert(const iterator& __p, _CharT __c)
+ { insert(__p.index(), __c); return __p; }
+ iterator insert(const iterator& __p )
+ { insert(__p.index()); return __p; }
+ iterator insert(const iterator& __p, const _CharT* c_string)
+ { insert(__p.index(), c_string); return __p; }
+ iterator insert(const iterator& __p, const _CharT* __i, size_t __n)
+ { insert(__p.index(), __i, __n); return __p; }
+ iterator insert(const iterator& __p, const _CharT* __i,
+ const _CharT* __j)
+ { insert(__p.index(), __i, __j); return __p; }
+ iterator insert(const iterator& __p,
+ const const_iterator& __i, const const_iterator& __j)
+ { insert(__p.index(), __i, __j); return __p; }
+ iterator insert(const iterator& __p,
+ const iterator& __i, const iterator& __j)
+ { insert(__p.index(), __i, __j); return __p; }
+
+ // Replace, range variants.
+ void replace(const iterator& __p, const iterator& __q,
+ const _Self& __r)
+ { replace(__p.index(), __q.index() - __p.index(), __r); }
+ void replace(const iterator& __p, const iterator& __q, _CharT __c)
+ { replace(__p.index(), __q.index() - __p.index(), __c); }
+ void replace(const iterator& __p, const iterator& __q,
+ const _CharT* __c_string)
+ { replace(__p.index(), __q.index() - __p.index(), __c_string); }
+ void replace(const iterator& __p, const iterator& __q,
+ const _CharT* __i, size_t __n)
+ { replace(__p.index(), __q.index() - __p.index(), __i, __n); }
+ void replace(const iterator& __p, const iterator& __q,
+ const _CharT* __i, const _CharT* __j)
+ { replace(__p.index(), __q.index() - __p.index(), __i, __j); }
+ void replace(const iterator& __p, const iterator& __q,
+ const const_iterator& __i, const const_iterator& __j)
+ { replace(__p.index(), __q.index() - __p.index(), __i, __j); }
+ void replace(const iterator& __p, const iterator& __q,
+ const iterator& __i, const iterator& __j)
+ { replace(__p.index(), __q.index() - __p.index(), __i, __j); }
+
+ // Replace, iterator variants.
+ void replace(const iterator& __p, const _Self& __r)
+ { replace(__p.index(), __r); }
+ void replace(const iterator& __p, _CharT __c)
+ { replace(__p.index(), __c); }
+ void replace(const iterator& __p, const _CharT* __c_string)
+ { replace(__p.index(), __c_string); }
+ void replace(const iterator& __p, const _CharT* __i, size_t __n)
+ { replace(__p.index(), __i, __n); }
+ void replace(const iterator& __p, const _CharT* __i, const _CharT* __j)
+ { replace(__p.index(), __i, __j); }
+ void replace(const iterator& __p, const_iterator __i,
+ const_iterator __j)
+ { replace(__p.index(), __i, __j); }
+ void replace(const iterator& __p, iterator __i, iterator __j)
+ { replace(__p.index(), __i, __j); }
+
+ // Iterator and range variants of erase
+ iterator erase(const iterator& __p, const iterator& __q) {
+ size_t __p_index = __p.index();
+ erase(__p_index, __q.index() - __p_index);
+ return iterator(this, __p_index);
+ }
+ iterator erase(const iterator& __p) {
+ size_t __p_index = __p.index();
+ erase(__p_index, 1);
+ return iterator(this, __p_index);
+ }
+
+ _Self substr(size_t __start, size_t __len = 1) const {
+ return rope<_CharT,_Alloc>(
+ _S_substring(_M_tree_ptr._M_data, __start, __start + __len));
+ }
+
+ _Self substr(iterator __start, iterator __end) const {
+ return rope<_CharT,_Alloc>(
+ _S_substring(_M_tree_ptr._M_data, __start.index(), __end.index()));
+ }
+
+ _Self substr(iterator __start) const {
+ size_t __pos = __start.index();
+ return rope<_CharT,_Alloc>(
+ _S_substring(_M_tree_ptr._M_data, __pos, __pos + 1));
+ }
+
+ _Self substr(const_iterator __start, const_iterator __end) const {
+ // This might eventually take advantage of the cache in the
+ // iterator.
+ return rope<_CharT,_Alloc>(
+ _S_substring(_M_tree_ptr._M_data, __start.index(), __end.index()));
+ }
+
+ rope<_CharT,_Alloc> substr(const_iterator __start) {
+ size_t __pos = __start.index();
+ return rope<_CharT,_Alloc>(
+ _S_substring(_M_tree_ptr._M_data, __pos, __pos + 1));
+ }
+
+ enum { npos = -1 };
+
+ // static const size_type npos;
+
+ size_type find(_CharT __c, size_type __pos = 0) const;
+ size_type find(const _CharT* __s, size_type __pos = 0) const {
+ size_type __result_pos;
+ const_iterator __result = search(const_begin() + (ptrdiff_t)__pos, const_end(),
+ __s, __s + _S_char_ptr_len(__s));
+ __result_pos = __result.index();
+# ifndef _STLP_OLD_ROPE_SEMANTICS
+ if (__result_pos == size()) __result_pos = npos;
+# endif
+ return __result_pos;
+ }
+
+ iterator mutable_begin() {
+ return(iterator(this, 0));
+ }
+
+ iterator mutable_end() {
+ return(iterator(this, size()));
+ }
+
+ reverse_iterator mutable_rbegin() {
+ return reverse_iterator(mutable_end());
+ }
+
+ reverse_iterator mutable_rend() {
+ return reverse_iterator(mutable_begin());
+ }
+
+ reference mutable_reference_at(size_type __pos) {
+ return reference(this, __pos);
+ }
+
+# ifdef __STD_STUFF
+ reference operator[] (size_type __pos) {
+ return reference(this, __pos);
+ }
+
+ reference at(size_type __pos) {
+ // if (__pos >= size()) throw out_of_range; // XXX
+ return (*this)[__pos];
+ }
+
+ void resize(size_type, _CharT) {}
+ void resize(size_type) {}
+ void reserve(size_type = 0) {}
+ size_type capacity() const {
+ return max_size();
+ }
+
+ // Stuff below this line is dangerous because it's error prone.
+ // I would really like to get rid of it.
+ // copy function with funny arg ordering.
+ size_type copy(_CharT* __buffer, size_type __n,
+ size_type __pos = 0) const {
+ return copy(__pos, __n, __buffer);
+ }
+
+ iterator end() { return mutable_end(); }
+
+ iterator begin() { return mutable_begin(); }
+
+ reverse_iterator rend() { return mutable_rend(); }
+
+ reverse_iterator rbegin() { return mutable_rbegin(); }
+
+# else
+
+ const_iterator end() { return const_end(); }
+
+ const_iterator begin() { return const_begin(); }
+
+ const_reverse_iterator rend() { return const_rend(); }
+
+ const_reverse_iterator rbegin() { return const_rbegin(); }
+
+# endif
+
+ __ROPE_DEFINE_ALLOCS(_Alloc, _M_tree_ptr)
+ };
+
+# undef __ROPE_DEFINE_ALLOC
+# undef __ROPE_DEFINE_ALLOCS
+
+template <class _CharT, class _Alloc>
+inline _CharT
+_Rope_const_iterator< _CharT, _Alloc>::operator[](size_t __n)
+{
+ return rope<_CharT,_Alloc>::_S_fetch(this->_M_root, this->_M_current_pos + __n);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator== (const _Rope_const_iterator<_CharT,_Alloc>& __x,
+ const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+ return (__x._M_current_pos == __y._M_current_pos &&
+ __x._M_root == __y._M_root);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator< (const _Rope_const_iterator<_CharT,_Alloc>& __x,
+ const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+ return (__x._M_current_pos < __y._M_current_pos);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _CharT, class _Alloc>
+inline bool operator!= (const _Rope_const_iterator<_CharT,_Alloc>& __x,
+ const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+ return !(__x == __y);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator> (const _Rope_const_iterator<_CharT,_Alloc>& __x,
+ const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+ return __y < __x;
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator<= (const _Rope_const_iterator<_CharT,_Alloc>& __x,
+ const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+ return !(__y < __x);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator>= (const _Rope_const_iterator<_CharT,_Alloc>& __x,
+ const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+ return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _CharT, class _Alloc>
+inline ptrdiff_t operator-(const _Rope_const_iterator<_CharT,_Alloc>& __x,
+ const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+ return (ptrdiff_t)__x._M_current_pos - (ptrdiff_t)__y._M_current_pos;
+}
+
+#if !defined( __MWERKS__ ) || __MWERKS__ >= 0x2000 // dwa 8/21/97 - "ambiguous access to overloaded function" bug.
+template <class _CharT, class _Alloc>
+inline _Rope_const_iterator<_CharT,_Alloc>
+operator-(const _Rope_const_iterator<_CharT,_Alloc>& __x, ptrdiff_t __n) {
+ return _Rope_const_iterator<_CharT,_Alloc>(
+ __x._M_root, __x._M_current_pos - __n);
+}
+# endif
+
+template <class _CharT, class _Alloc>
+inline _Rope_const_iterator<_CharT,_Alloc>
+operator+(const _Rope_const_iterator<_CharT,_Alloc>& __x, ptrdiff_t __n) {
+ return _Rope_const_iterator<_CharT,_Alloc>(
+ __x._M_root, __x._M_current_pos + __n);
+}
+
+template <class _CharT, class _Alloc>
+inline _Rope_const_iterator<_CharT,_Alloc>
+operator+(ptrdiff_t __n, const _Rope_const_iterator<_CharT,_Alloc>& __x) {
+ return _Rope_const_iterator<_CharT,_Alloc>(
+ __x._M_root, __x._M_current_pos + __n);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator== (const _Rope_iterator<_CharT,_Alloc>& __x,
+ const _Rope_iterator<_CharT,_Alloc>& __y) {
+ return (__x._M_current_pos == __y._M_current_pos &&
+ __x._M_root_rope == __y._M_root_rope);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator< (const _Rope_iterator<_CharT,_Alloc>& __x,
+ const _Rope_iterator<_CharT,_Alloc>& __y) {
+ return (__x._M_current_pos < __y._M_current_pos);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _CharT, class _Alloc>
+inline bool operator!= (const _Rope_iterator<_CharT,_Alloc>& __x,
+ const _Rope_iterator<_CharT,_Alloc>& __y) {
+ return !(__x == __y);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator> (const _Rope_iterator<_CharT,_Alloc>& __x,
+ const _Rope_iterator<_CharT,_Alloc>& __y) {
+ return __y < __x;
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator<= (const _Rope_iterator<_CharT,_Alloc>& __x,
+ const _Rope_iterator<_CharT,_Alloc>& __y) {
+ return !(__y < __x);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator>= (const _Rope_iterator<_CharT,_Alloc>& __x,
+ const _Rope_iterator<_CharT,_Alloc>& __y) {
+ return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _CharT, class _Alloc>
+inline ptrdiff_t operator-(const _Rope_iterator<_CharT,_Alloc>& __x,
+ const _Rope_iterator<_CharT,_Alloc>& __y) {
+ return (ptrdiff_t)__x._M_current_pos - (ptrdiff_t)__y._M_current_pos;
+}
+
+#if !defined( __MWERKS__ ) || __MWERKS__ >= 0x2000 // dwa 8/21/97 - "ambiguous access to overloaded function" bug.
+template <class _CharT, class _Alloc>
+inline _Rope_iterator<_CharT,_Alloc>
+operator-(const _Rope_iterator<_CharT,_Alloc>& __x,
+ ptrdiff_t __n) {
+ return _Rope_iterator<_CharT,_Alloc>(
+ __x._M_root_rope, __x._M_current_pos - __n);
+}
+# endif
+
+template <class _CharT, class _Alloc>
+inline _Rope_iterator<_CharT,_Alloc>
+operator+(const _Rope_iterator<_CharT,_Alloc>& __x,
+ ptrdiff_t __n) {
+ return _Rope_iterator<_CharT,_Alloc>(
+ __x._M_root_rope, __x._M_current_pos + __n);
+}
+
+template <class _CharT, class _Alloc>
+inline _Rope_iterator<_CharT,_Alloc>
+operator+(ptrdiff_t __n, const _Rope_iterator<_CharT,_Alloc>& __x) {
+ return _Rope_iterator<_CharT,_Alloc>(
+ __x._M_root_rope, __x._M_current_pos + __n);
+}
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>
+operator+ (const rope<_CharT,_Alloc>& __left,
+ const rope<_CharT,_Alloc>& __right)
+{
+ _STLP_ASSERT(__left.get_allocator() == __right.get_allocator())
+ return rope<_CharT,_Alloc>(rope<_CharT,_Alloc>::_S_concat_rep(__left._M_tree_ptr._M_data, __right._M_tree_ptr._M_data));
+ // Inlining this should make it possible to keep __left and
+ // __right in registers.
+}
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>&
+operator+= (rope<_CharT,_Alloc>& __left,
+ const rope<_CharT,_Alloc>& __right)
+{
+ __left.append(__right);
+ return __left;
+}
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>
+operator+ (const rope<_CharT,_Alloc>& __left,
+ const _CharT* __right) {
+ size_t __rlen = rope<_CharT,_Alloc>::_S_char_ptr_len(__right);
+ return rope<_CharT,_Alloc>(
+ rope<_CharT,_Alloc>::_S_concat_char_iter(
+ __left._M_tree_ptr._M_data, __right, __rlen));
+}
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>&
+operator+= (rope<_CharT,_Alloc>& __left,
+ const _CharT* __right) {
+ __left.append(__right);
+ return __left;
+}
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>
+operator+ (const rope<_CharT,_Alloc>& __left, _STLP_SIMPLE_TYPE(_CharT) __right) {
+ return rope<_CharT,_Alloc>(
+ rope<_CharT,_Alloc>::_S_concat_char_iter(
+ __left._M_tree_ptr._M_data, &__right, 1));
+}
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>&
+operator+= (rope<_CharT,_Alloc>& __left, _STLP_SIMPLE_TYPE(_CharT) __right) {
+ __left.append(__right);
+ return __left;
+}
+
+template <class _CharT, class _Alloc>
+inline bool
+operator< (const rope<_CharT,_Alloc>& __left,
+ const rope<_CharT,_Alloc>& __right) {
+ return __left.compare(__right) < 0;
+}
+
+template <class _CharT, class _Alloc>
+inline bool
+operator== (const rope<_CharT,_Alloc>& __left,
+ const rope<_CharT,_Alloc>& __right) {
+ return __left.compare(__right) == 0;
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _CharT, class _Alloc>
+inline bool
+operator!= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) {
+ return !(__x == __y);
+}
+
+template <class _CharT, class _Alloc>
+inline bool
+operator> (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) {
+ return __y < __x;
+}
+
+template <class _CharT, class _Alloc>
+inline bool
+operator<= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) {
+ return !(__y < __x);
+}
+
+template <class _CharT, class _Alloc>
+inline bool
+operator>= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) {
+ return !(__x < __y);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator!= (const _Rope_char_ptr_proxy<_CharT,_Alloc>& __x,
+ const _Rope_char_ptr_proxy<_CharT,_Alloc>& __y) {
+ return !(__x == __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _CharT, class _Alloc>
+inline bool operator== (const _Rope_char_ptr_proxy<_CharT,_Alloc>& __x,
+ const _Rope_char_ptr_proxy<_CharT,_Alloc>& __y) {
+ return (__x._M_pos == __y._M_pos && __x._M_root == __y._M_root);
+}
+
+#ifdef _STLP_USE_NEW_IOSTREAMS
+template<class _CharT, class _Traits, class _Alloc>
+basic_ostream<_CharT, _Traits>& operator<< (
+ basic_ostream<_CharT, _Traits>& __o,
+ const rope<_CharT, _Alloc>& __r);
+#elif ! defined (_STLP_USE_NO_IOSTREAMS)
+template<class _CharT, class _Alloc>
+ostream& operator<< (ostream& __o, const rope<_CharT,_Alloc>& __r);
+#endif
+
+typedef rope<char, _STLP_DEFAULT_ALLOCATOR(char) > crope;
+# ifdef _STLP_HAS_WCHAR_T
+typedef rope<wchar_t, _STLP_DEFAULT_ALLOCATOR(wchar_t) > wrope;
+# endif
+
+inline crope::reference __mutable_reference_at(crope& __c, size_t __i)
+{
+ return __c.mutable_reference_at(__i);
+}
+
+# ifdef _STLP_HAS_WCHAR_T
+inline wrope::reference __mutable_reference_at(wrope& __c, size_t __i)
+{
+ return __c.mutable_reference_at(__i);
+}
+# endif
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class _CharT, class _Alloc>
+inline void swap(rope<_CharT,_Alloc>& __x, rope<_CharT,_Alloc>& __y) {
+ __x.swap(__y);
+}
+#else
+
+inline void swap(crope& __x, crope& __y) { __x.swap(__y); }
+# ifdef _STLP_HAS_WCHAR_T // dwa 8/21/97
+inline void swap(wrope& __x, wrope& __y) { __x.swap(__y); }
+# endif
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+
+// Hash functions should probably be revisited later:
+_STLP_TEMPLATE_NULL struct hash<crope>
+{
+ size_t operator()(const crope& __str) const
+ {
+ size_t _p_size = __str.size();
+
+ if (0 == _p_size) return 0;
+ return 13*__str[0] + 5*__str[_p_size - 1] + _p_size;
+ }
+};
+
+# ifdef _STLP_HAS_WCHAR_T // dwa 8/21/97
+_STLP_TEMPLATE_NULL struct hash<wrope>
+{
+ size_t operator()(const wrope& __str) const
+ {
+ size_t _p_size = __str.size();
+
+ if (0 == _p_size) return 0;
+ return 13*__str[0] + 5*__str[_p_size - 1] + _p_size;
+ }
+};
+#endif
+
+#ifndef _STLP_MSVC
+// I couldn't get this to work with VC++
+template<class _CharT,class _Alloc>
+void
+_Rope_rotate(_Rope_iterator<_CharT,_Alloc> __first,
+ _Rope_iterator<_CharT,_Alloc> __middle,
+ _Rope_iterator<_CharT,_Alloc> __last);
+
+#if !defined(__GNUC__)
+// Appears to confuse g++
+inline void rotate(_Rope_iterator<char,_STLP_DEFAULT_ALLOCATOR(char) > __first,
+ _Rope_iterator<char,_STLP_DEFAULT_ALLOCATOR(char) > __middle,
+ _Rope_iterator<char,_STLP_DEFAULT_ALLOCATOR(char) > __last) {
+ _Rope_rotate(__first, __middle, __last);
+}
+#endif
+
+#endif
+
+template <class _CharT, class _Alloc>
+inline _Rope_char_ref_proxy<_CharT, _Alloc>::operator _CharT () const
+{
+ if (_M_current_valid) {
+ return _M_current;
+ } else {
+ return _My_rope::_S_fetch(_M_root->_M_tree_ptr._M_data, _M_pos);
+ }
+}
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_rope.c>
+# endif
+
+# endif /* _STLP_INTERNAL_ROPE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_set.h b/src/STLport/stl/_set.h
new file mode 100644
index 0000000..3f795a4
--- /dev/null
+++ b/src/STLport/stl/_set.h
@@ -0,0 +1,372 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_SET_H
+#define _STLP_INTERNAL_SET_H
+
+#ifndef _STLP_INTERNAL_TREE_H
+#include <stl/_tree.h>
+#endif
+
+#define set __WORKAROUND_RENAME(set)
+#define multiset __WORKAROUND_RENAME(multiset)
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Key, __DFL_TMPL_PARAM(_Compare,less<_Key>),
+ _STLP_DEFAULT_ALLOCATOR_SELECT(_Key) >
+class set {
+public:
+// typedefs:
+ typedef _Key key_type;
+ typedef _Key value_type;
+ typedef _Compare key_compare;
+ typedef _Compare value_compare;
+private:
+ typedef _Rb_tree<key_type, value_type,
+ _Identity<value_type>, key_compare, _Alloc> _Rep_type;
+public:
+ typedef typename _Rep_type::pointer pointer;
+ typedef typename _Rep_type::const_pointer const_pointer;
+ typedef typename _Rep_type::reference reference;
+ typedef typename _Rep_type::const_reference const_reference;
+ typedef typename _Rep_type::const_iterator const_iterator;
+ typedef const_iterator iterator;
+ typedef typename _Rep_type::const_reverse_iterator reverse_iterator;
+ typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
+ typedef typename _Rep_type::size_type size_type;
+ typedef typename _Rep_type::difference_type difference_type;
+ typedef typename _Rep_type::allocator_type allocator_type;
+
+private:
+ _Rep_type _M_t; // red-black tree representing set
+public:
+
+ // allocation/deallocation
+
+ set() : _M_t(_Compare(), allocator_type()) {}
+ explicit set(const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _M_t(__comp, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ set(_InputIterator __first, _InputIterator __last)
+ : _M_t(_Compare(), allocator_type())
+ { _M_t.insert_unique(__first, __last); }
+
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ set(_InputIterator __first, _InputIterator __last, const _Compare& __comp)
+ : _M_t(__comp, allocator_type()) { _M_t.insert_unique(__first, __last); }
+# endif
+ template <class _InputIterator>
+ set(_InputIterator __first, _InputIterator __last, const _Compare& __comp,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+ : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }
+#else
+ set(const value_type* __first, const value_type* __last)
+ : _M_t(_Compare(), allocator_type())
+ { _M_t.insert_unique(__first, __last); }
+
+ set(const value_type* __first,
+ const value_type* __last, const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }
+
+ set(const_iterator __first, const_iterator __last)
+ : _M_t(_Compare(), allocator_type())
+ { _M_t.insert_unique(__first, __last); }
+
+ set(const_iterator __first, const_iterator __last, const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ set(const set<_Key,_Compare,_Alloc>& __x) : _M_t(__x._M_t) {}
+ set<_Key,_Compare,_Alloc>& operator=(const set<_Key, _Compare, _Alloc>& __x)
+ {
+ _M_t = __x._M_t;
+ return *this;
+ }
+
+ // accessors:
+
+ key_compare key_comp() const { return _M_t.key_comp(); }
+ value_compare value_comp() const { return _M_t.key_comp(); }
+ allocator_type get_allocator() const { return _M_t.get_allocator(); }
+
+ iterator begin() const { return _M_t.begin(); }
+ iterator end() const { return _M_t.end(); }
+ reverse_iterator rbegin() const { return _M_t.rbegin(); }
+ reverse_iterator rend() const { return _M_t.rend(); }
+ bool empty() const { return _M_t.empty(); }
+ size_type size() const { return _M_t.size(); }
+ size_type max_size() const { return _M_t.max_size(); }
+ void swap(set<_Key,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); }
+
+ // insert/erase
+ pair<iterator,bool> insert(const value_type& __x) {
+ typedef typename _Rep_type::iterator _Rep_iterator;
+ pair<_Rep_iterator, bool> __p = _M_t.insert_unique(__x);
+ return pair<iterator, bool>(__REINTERPRET_CAST(const iterator&,__p.first), __p.second);
+ }
+ iterator insert(iterator __position, const value_type& __x) {
+ typedef typename _Rep_type::iterator _Rep_iterator;
+ return _M_t.insert_unique((_Rep_iterator&)__position, __x);
+ }
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void insert(_InputIterator __first, _InputIterator __last) {
+ _M_t.insert_unique(__first, __last);
+ }
+#else
+ void insert(const_iterator __first, const_iterator __last) {
+ _M_t.insert_unique(__first, __last);
+ }
+ void insert(const value_type* __first, const value_type* __last) {
+ _M_t.insert_unique(__first, __last);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+ void erase(iterator __position) {
+ typedef typename _Rep_type::iterator _Rep_iterator;
+ _M_t.erase((_Rep_iterator&)__position);
+ }
+ size_type erase(const key_type& __x) {
+ return _M_t.erase(__x);
+ }
+ void erase(iterator __first, iterator __last) {
+ typedef typename _Rep_type::iterator _Rep_iterator;
+ _M_t.erase((_Rep_iterator&)__first, (_Rep_iterator&)__last);
+ }
+ void clear() { _M_t.clear(); }
+
+ // set operations:
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS )
+ template <class _KT>
+ iterator find(const _KT& __x) const { return _M_t.find(__x); }
+# else
+ iterator find(const key_type& __x) const { return _M_t.find(__x); }
+# endif
+ size_type count(const key_type& __x) const {
+ return _M_t.find(__x) == _M_t.end() ? 0 : 1 ;
+ }
+ iterator lower_bound(const key_type& __x) const {
+ return _M_t.lower_bound(__x);
+ }
+ iterator upper_bound(const key_type& __x) const {
+ return _M_t.upper_bound(__x);
+ }
+ pair<iterator,iterator> equal_range(const key_type& __x) const {
+ return _M_t.equal_range(__x);
+ }
+};
+
+template <class _Key, __DFL_TMPL_PARAM(_Compare,less<_Key>),
+ _STLP_DEFAULT_ALLOCATOR_SELECT(_Key) >
+class multiset {
+public:
+ // typedefs:
+
+ typedef _Key key_type;
+ typedef _Key value_type;
+ typedef _Compare key_compare;
+ typedef _Compare value_compare;
+private:
+ typedef _Rb_tree<key_type, value_type,
+ _Identity<value_type>, key_compare, _Alloc> _Rep_type;
+public:
+ typedef typename _Rep_type::pointer pointer;
+ typedef typename _Rep_type::const_pointer const_pointer;
+ typedef typename _Rep_type::reference reference;
+ typedef typename _Rep_type::const_reference const_reference;
+ typedef typename _Rep_type::const_iterator const_iterator;
+ typedef const_iterator iterator;
+ typedef typename _Rep_type::const_reverse_iterator reverse_iterator;
+ typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
+ typedef typename _Rep_type::size_type size_type;
+ typedef typename _Rep_type::difference_type difference_type;
+ typedef typename _Rep_type::allocator_type allocator_type;
+
+private:
+ _Rep_type _M_t; // red-black tree representing multiset
+public:
+ // allocation/deallocation
+
+ multiset() : _M_t(_Compare(), allocator_type()) {}
+ explicit multiset(const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _M_t(__comp, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _InputIterator>
+ multiset(_InputIterator __first, _InputIterator __last)
+ : _M_t(_Compare(), allocator_type())
+ { _M_t.insert_equal(__first, __last); }
+
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ multiset(_InputIterator __first, _InputIterator __last,
+ const _Compare& __comp)
+ : _M_t(__comp, allocator_type()) { _M_t.insert_equal(__first, __last); }
+# endif
+ template <class _InputIterator>
+ multiset(_InputIterator __first, _InputIterator __last,
+ const _Compare& __comp,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+ : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); }
+
+#else
+
+ multiset(const value_type* __first, const value_type* __last)
+ : _M_t(_Compare(), allocator_type())
+ { _M_t.insert_equal(__first, __last); }
+
+ multiset(const value_type* __first, const value_type* __last,
+ const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); }
+
+ multiset(const_iterator __first, const_iterator __last)
+ : _M_t(_Compare(), allocator_type())
+ { _M_t.insert_equal(__first, __last); }
+
+ multiset(const_iterator __first, const_iterator __last,
+ const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ multiset(const multiset<_Key,_Compare,_Alloc>& __x) : _M_t(__x._M_t) {}
+ multiset<_Key,_Compare,_Alloc>&
+ operator=(const multiset<_Key,_Compare,_Alloc>& __x) {
+ _M_t = __x._M_t;
+ return *this;
+ }
+
+ // accessors:
+
+ key_compare key_comp() const { return _M_t.key_comp(); }
+ value_compare value_comp() const { return _M_t.key_comp(); }
+ allocator_type get_allocator() const { return _M_t.get_allocator(); }
+
+ iterator begin() const { return _M_t.begin(); }
+ iterator end() const { return _M_t.end(); }
+ reverse_iterator rbegin() const { return _M_t.rbegin(); }
+ reverse_iterator rend() const { return _M_t.rend(); }
+ bool empty() const { return _M_t.empty(); }
+ size_type size() const { return _M_t.size(); }
+ size_type max_size() const { return _M_t.max_size(); }
+ void swap(multiset<_Key,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); }
+
+ // insert/erase
+ iterator insert(const value_type& __x) {
+ return _M_t.insert_equal(__x);
+ }
+ iterator insert(iterator __position, const value_type& __x) {
+ typedef typename _Rep_type::iterator _Rep_iterator;
+ return _M_t.insert_equal((_Rep_iterator&)__position, __x);
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void insert(_InputIterator __first, _InputIterator __last) {
+ _M_t.insert_equal(__first, __last);
+ }
+#else
+ void insert(const value_type* __first, const value_type* __last) {
+ _M_t.insert_equal(__first, __last);
+ }
+ void insert(const_iterator __first, const_iterator __last) {
+ _M_t.insert_equal(__first, __last);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+ void erase(iterator __position) {
+ typedef typename _Rep_type::iterator _Rep_iterator;
+ _M_t.erase((_Rep_iterator&)__position);
+ }
+ size_type erase(const key_type& __x) {
+ return _M_t.erase(__x);
+ }
+ void erase(iterator __first, iterator __last) {
+ typedef typename _Rep_type::iterator _Rep_iterator;
+ _M_t.erase((_Rep_iterator&)__first, (_Rep_iterator&)__last);
+ }
+ void clear() { _M_t.clear(); }
+
+ // multiset operations:
+
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS )
+ template <class _KT>
+ iterator find(const _KT& __x) const { return _M_t.find(__x); }
+# else
+ iterator find(const key_type& __x) const { return _M_t.find(__x); }
+# endif
+ size_type count(const key_type& __x) const { return _M_t.count(__x); }
+ iterator lower_bound(const key_type& __x) const {
+ return _M_t.lower_bound(__x);
+ }
+ iterator upper_bound(const key_type& __x) const {
+ return _M_t.upper_bound(__x);
+ }
+ pair<iterator,iterator> equal_range(const key_type& __x) const {
+ return _M_t.equal_range(__x);
+ }
+};
+
+# define _STLP_TEMPLATE_HEADER template <class _Key, class _Compare, class _Alloc>
+# define _STLP_TEMPLATE_CONTAINER set<_Key,_Compare,_Alloc>
+# include <stl/_relops_cont.h>
+# undef _STLP_TEMPLATE_CONTAINER
+# define _STLP_TEMPLATE_CONTAINER multiset<_Key,_Compare,_Alloc>
+# include <stl/_relops_cont.h>
+# undef _STLP_TEMPLATE_CONTAINER
+# undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+
+// do a cleanup
+# undef set
+# undef multiset
+// provide a way to access full funclionality
+# define __set__ __FULL_NAME(set)
+# define __multiset__ __FULL_NAME(multiset)
+
+# ifdef _STLP_USE_WRAPPER_FOR_ALLOC_PARAM
+# include <stl/wrappers/_set.h>
+# endif
+
+#endif /* _STLP_INTERNAL_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_site_config.h b/src/STLport/stl/_site_config.h
new file mode 100644
index 0000000..0ef8aa9
--- /dev/null
+++ b/src/STLport/stl/_site_config.h
@@ -0,0 +1,194 @@
+//
+// This file defines site configuration.
+//
+//
+
+/*
+ * _STLP_NO_THREADS: if defined, STLport don't use any
+ * multithreading support. Synonym is _NOTHREADS
+ */
+// #define _NOTHREADS
+// #define _STLP_NO_THREADS
+
+/* _PTHREADS: if defined, use Posix threads for multithreading support. */
+// #define _PTHREADS
+
+// compatibility section
+
+# if defined (_STLP_NO_IOSTREAMS) || defined (_STLP_NO_NEW_IOSTREAMS) && ! defined ( _STLP_NO_OWN_IOSTREAMS )
+# define _STLP_NO_OWN_IOSTREAMS
+# endif
+
+# if !defined (_STLP_NO_OWN_IOSTREAMS) && ! defined (_STLP_OWN_IOSTREAMS)
+# define _STLP_OWN_IOSTREAMS
+# endif
+
+# if (defined (_STLP_NOTHREADS) || defined (_STLP_NO_THREADS) || defined (NOTHREADS))
+# if ! defined (_NOTHREADS)
+# define _NOTHREADS
+# endif
+# if ! defined (_STLP_NO_THREADS)
+# define _STLP_NO_THREADS
+# endif
+# endif
+
+/*
+ * Turn _STLP_USE_DYNAMIC_LIB to enforce use of .dll version of STLport library.
+ * NOTE : please do that only if you know what you are doing !
+ * Changing default will require you to change makefile in "src" accordingly
+ * and to rebuild STLPort library !
+ * On UNIX, this has no effect.
+ *
+ */
+// # define _STLP_USE_DYNAMIC_LIB
+
+/*
+ * Turn _STLP_USE_STATIC_LIB to enforce use of static version of STLport library.
+ * NOTE : please do that only if you know what you are doing !
+ * Changing default will require you to change makefile in "src" accordingly
+ * and to rebuild STLPort library !
+ * On UNIX, this has no effect.
+ *
+ */
+// # define _STLP_USE_STATIC_LIB
+
+
+/*
+ * Edit relative path below (or put full path) to get native
+ * compiler vendor's headers included. Default is "../include"
+ * Hint : never install STLport in the directory that ends with "include"
+ */
+// # undef _STLP_NATIVE_INCLUDE_PATH
+// # define _STLP_NATIVE_INCLUDE_PATH ../include
+// same for C library headers like <cstring>
+// # undef _STLP_NATIVE_CPP_C_INCLUDE_PATH
+// # define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include
+// same for C headers like <string.h>
+// # undef _STLP_NATIVE_C_INCLUDE_PATH
+// # define _STLP_NATIVE_C_INCLUDE_PATH ../include
+
+
+/*
+ * _STLP_USE_OWN_NAMESPACE/_STLP_NO_OWN_NAMESPACE
+ * If defined, STLport uses _STL:: namespace, else std::
+ * The reason you have to use separate namespace in wrapper mode is that new-style IO
+ * compiled library may have its own idea about STL stuff (string, vector, etc.),
+ * so redefining them in the same namespace would break ODR and may cause
+ * undefined behaviour. Rule of thumb is - if new-style iostreams are
+ * available, there WILL be a conflict. Otherwise you should be OK.
+ * In STLport iostreams mode, there is no need for this flag other than to facilitate
+ * link with third-part libraries compiled with different standard library implementation.
+ */
+// # define _STLP_USE_OWN_NAMESPACE 1
+// # define _STLP_NO_OWN_NAMESPACE 1
+
+
+/*
+ * Uncomment _STLP_USE_NEWALLOC to force allocator<T> to use plain "new"
+ * instead of STLport optimized node allocator engine.
+ */
+// #define _STLP_USE_NEWALLOC 1
+
+/*
+ * Uncomment _STLP_USE_MALLOC to force allocator<T> to use plain "malloc"
+ * instead of STLport optimized node allocator engine.
+ */
+// #define _STLP_USE_MALLOC 1
+
+/*
+ * Set _STLP_DEBUG_ALLOC to use allocators that perform memory debugging,
+ * such as padding/checking for memory consistency
+ */
+// #define _STLP_DEBUG_ALLOC 1
+
+
+/*
+ * Uncomment this to force all debug diagnostic to be directed through a
+ * user-defined global function:
+ * void __stl_debug_message(const char * format_str, ...)
+ * instead of predefined STLport routine.
+ * This allows you to take control of debug message output.
+ * Default routine calls fprintf(stderr,...)
+ * Note : If you set this macro, you must supply __stl_debug_message
+ * function definition somewhere.
+ */
+//#define _STLP_DEBUG_MESSAGE 1
+
+/*
+ * Uncomment this to force all failed assertions to be executed through
+ * user-defined global function:
+ * void __stl_debug_terminate(void). This allows
+ * you to take control of assertion behaviour for debugging purposes.
+ * Default routine throws unique exception if _STLP_USE_EXCEPTIONS is set,
+ * calls _STLP_ABORT() otherwise.
+ * Note : If you set this macro, you must supply __stl_debug_terminate
+ * function definition somewhere.
+ */
+//#define _STLP_DEBUG_TERMINATE 1
+
+/*
+ * Comment this out to enable throwing exceptions from default __stl_debug_terminate()
+ * instead of calling _STLP_ABORT().
+ */
+#define _STLP_NO_DEBUG_EXCEPTIONS 1
+
+/*
+ * Uncomment that to disable exception handling code
+ */
+// #define _STLP_NO_EXCEPTIONS 1
+
+/*
+ * _STLP_NO_NAMESPACES: if defined, don't put the library in namespace
+ * stlport:: or std::, even if the compiler supports namespaces
+ */
+
+// #define _STLP_NO_NAMESPACES 1
+
+//==========================================================
+// Compatibility section
+//==========================================================
+
+/*
+ * Use abbreviated class names for linker benefit (don't affect interface).
+ * This option is obsolete, but should work in this release.
+ *
+ */
+// # define _STLP_USE_ABBREVS
+
+/*
+ * This definition precludes STLport reverse_iterator to be compatible with
+ * other parts of MSVC library. (With partial specialization, it just
+ * has no effect).
+ * Use it _ONLY_ if you use SGI-style reverse_iterator<> template explicitly
+ */
+// # define _STLP_NO_MSVC50_COMPATIBILITY 1
+
+/*
+ * _STLP_USE_RAW_SGI_ALLOCATORS is a hook so that users can disable use of
+ * allocator<T> as default parameter for containers, and use SGI
+ * raw allocators as default ones, without having to edit library headers.
+ * Use of this macro is strongly discouraged.
+ */
+// #define _STLP_USE_RAW_SGI_ALLOCATORS 1
+
+/*
+ * Use obsolete overloaded template functions iterator_category(), value_type(), distance_type()
+ * for querying iterator properties. Please note those names are non-standard and are not guaranteed
+ * to be used by every implementation. However, this setting is on by default when partial specialization
+ * is not implemented in the compiler and cannot be sumulated (only if _STLP_NO_ANACHRONISMS is not set).
+ * Use of those interfaces for user-defined iterators is strongly discouraged:
+ * please use public inheritance from iterator<> template to achieve desired effect.
+ * Second form is to disable old-style queries in any case.
+ */
+// # define _STLP_USE_OLD_HP_ITERATOR_QUERIES
+// # define _STLP_NO_OLD_HP_ITERATOR_QUERIES
+
+
+//==========================================================================
+
+// This section contains swithes which should be off by default,
+// but so few compilers would have it undefined, so that we set them here,
+// with the option to be turned off later in compiler-specific file
+
+# define _STLP_INCOMPLETE_EXCEPTION_HEADER
+
diff --git a/src/STLport/stl/_slist.c b/src/STLport/stl/_slist.c
new file mode 100644
index 0000000..11e67d4
--- /dev/null
+++ b/src/STLport/stl/_slist.c
@@ -0,0 +1,179 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_SLIST_C
+#define _STLP_SLIST_C
+
+#ifndef _STLP_INTERNAL_SLIST_H
+# include <stl/_slist.h>
+#endif
+
+# undef slist
+# define slist __WORKAROUND_DBG_RENAME(slist)
+# if defined (_STLP_NESTED_TYPE_PARAM_BUG)
+# define size_type size_t
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp, class _Alloc>
+_Slist_node_base*
+_Slist_base<_Tp,_Alloc>::_M_erase_after(_Slist_node_base* __before_first,
+ _Slist_node_base* __last_node) {
+ _Slist_node<_Tp>* __cur = (_Slist_node<_Tp>*) (__before_first->_M_next);
+ while (__cur != __last_node) {
+ _Slist_node<_Tp>* __tmp = __cur;
+ __cur = (_Slist_node<_Tp>*) __cur->_M_next;
+ _STLP_STD::_Destroy(&__tmp->_M_data);
+ _M_head.deallocate(__tmp,1);
+ }
+ __before_first->_M_next = __last_node;
+ return __last_node;
+}
+
+template <class _Tp, class _Alloc>
+slist<_Tp,_Alloc>& slist<_Tp,_Alloc>::operator=(const slist<_Tp,_Alloc>& __x)
+{
+ if (&__x != this) {
+ _Node_base* __p1 = &this->_M_head._M_data;
+ _Node* __n1 = (_Node*) this->_M_head._M_data._M_next;
+ const _Node* __n2 = (const _Node*) __x._M_head._M_data._M_next;
+ while (__n1 && __n2) {
+ __n1->_M_data = __n2->_M_data;
+ __p1 = __n1;
+ __n1 = (_Node*) __n1->_M_next;
+ __n2 = (const _Node*) __n2->_M_next;
+ }
+ if (__n2 == 0)
+ this->_M_erase_after(__p1, 0);
+ else
+ _M_insert_after_range(__p1, const_iterator((_Node*)__n2),
+ const_iterator(0));
+ }
+ return *this;
+}
+
+template <class _Tp, class _Alloc>
+void slist<_Tp, _Alloc>::_M_fill_assign(size_type __n, const _Tp& __val) {
+ _Node_base* __prev = &this->_M_head._M_data;
+ _Node* __node = (_Node*) this->_M_head._M_data._M_next;
+ for ( ; __node != 0 && __n > 0 ; --__n) {
+ __node->_M_data = __val;
+ __prev = __node;
+ __node = (_Node*) __node->_M_next;
+ }
+ if (__n > 0)
+ _M_insert_after_fill(__prev, __n, __val);
+ else
+ this->_M_erase_after(__prev, 0);
+}
+
+
+template <class _Tp, class _Alloc>
+void slist<_Tp,_Alloc>::resize(size_type __len, const _Tp& __x)
+{
+ _Node_base* __cur = &this->_M_head._M_data;
+ while (__cur->_M_next != 0 && __len > 0) {
+ --__len;
+ __cur = __cur->_M_next;
+ }
+ if (__cur->_M_next)
+ this->_M_erase_after(__cur, 0);
+ else
+ _M_insert_after_fill(__cur, __len, __x);
+}
+
+template <class _Tp, class _Alloc>
+void slist<_Tp,_Alloc>::remove(const _Tp& __val)
+{
+ _Node_base* __cur = &this->_M_head._M_data;
+ while (__cur && __cur->_M_next) {
+ if (((_Node*) __cur->_M_next)->_M_data == __val)
+ this->_M_erase_after(__cur);
+ else
+ __cur = __cur->_M_next;
+ }
+}
+
+template <class _Tp, class _Alloc>
+void slist<_Tp,_Alloc>::unique()
+{
+ _Node_base* __cur = this->_M_head._M_data._M_next;
+ if (__cur) {
+ while (__cur->_M_next) {
+ if (((_Node*)__cur)->_M_data ==
+ ((_Node*)(__cur->_M_next))->_M_data)
+ this->_M_erase_after(__cur);
+ else
+ __cur = __cur->_M_next;
+ }
+ }
+}
+
+template <class _Tp, class _Alloc>
+void slist<_Tp,_Alloc>::merge(slist<_Tp,_Alloc>& __x)
+{
+ _Node_base* __n1 = &this->_M_head._M_data;
+ while (__n1->_M_next && __x._M_head._M_data._M_next) {
+ if (((_Node*) __x._M_head._M_data._M_next)->_M_data <
+ ((_Node*) __n1->_M_next)->_M_data)
+ _Sl_global_inst::__splice_after(__n1, &__x._M_head._M_data, __x._M_head._M_data._M_next);
+ __n1 = __n1->_M_next;
+ }
+ if (__x._M_head._M_data._M_next) {
+ __n1->_M_next = __x._M_head._M_data._M_next;
+ __x._M_head._M_data._M_next = 0;
+ }
+}
+
+template <class _Tp, class _Alloc>
+void slist<_Tp,_Alloc>::sort()
+{
+ if (this->_M_head._M_data._M_next && this->_M_head._M_data._M_next->_M_next) {
+ _Self __carry;
+ _Self __counter[64];
+ int __fill = 0;
+ while (!empty()) {
+ _Sl_global_inst::__splice_after(&__carry._M_head._M_data, &this->_M_head._M_data, this->_M_head._M_data._M_next);
+ int __i = 0;
+ while (__i < __fill && !__counter[__i].empty()) {
+ __counter[__i].merge(__carry);
+ __carry.swap(__counter[__i]);
+ ++__i;
+ }
+ __carry.swap(__counter[__i]);
+ if (__i == __fill)
+ ++__fill;
+ }
+
+ for (int __i = 1; __i < __fill; ++__i)
+ __counter[__i].merge(__counter[__i-1]);
+ this->swap(__counter[__fill-1]);
+ }
+}
+
+# undef slist
+# undef size_type
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_SLIST_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_slist.h b/src/STLport/stl/_slist.h
new file mode 100644
index 0000000..e2f84e4
--- /dev/null
+++ b/src/STLport/stl/_slist.h
@@ -0,0 +1,741 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_SLIST_H
+#define _STLP_INTERNAL_SLIST_H
+
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+# include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_CONSTRUCT_H
+# include <stl/_construct.h>
+# endif
+
+# ifndef _STLP_INTERNAL_SLIST_BASE_H
+# include <stl/_slist_base.h>
+# endif
+
+# undef slist
+# define slist __WORKAROUND_DBG_RENAME(slist)
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp>
+struct _Slist_node : public _Slist_node_base
+{
+ _Tp _M_data;
+ __TRIVIAL_STUFF(_Slist_node)
+};
+
+struct _Slist_iterator_base {
+
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef forward_iterator_tag iterator_category;
+
+ _Slist_node_base* _M_node;
+
+ _Slist_iterator_base(_Slist_node_base* __x) : _M_node(__x) {}
+
+ void _M_incr() {
+// _STLP_VERBOSE_ASSERT(_M_node != 0, _StlMsg_INVALID_ADVANCE)
+ _M_node = _M_node->_M_next;
+ }
+ bool operator==(const _Slist_iterator_base& __y ) const {
+ return _M_node == __y._M_node;
+ }
+ bool operator!=(const _Slist_iterator_base& __y ) const {
+ return _M_node != __y._M_node;
+ }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+inline ptrdiff_t* _STLP_CALL distance_type(const _Slist_iterator_base&) { return 0; }
+inline forward_iterator_tag _STLP_CALL iterator_category(const _Slist_iterator_base&) { return forward_iterator_tag(); }
+#endif
+
+template <class _Tp, class _Traits>
+struct _Slist_iterator : public _Slist_iterator_base
+{
+ typedef _Tp value_type;
+ typedef typename _Traits::pointer pointer;
+ typedef typename _Traits::reference reference;
+ typedef forward_iterator_tag iterator_category;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+
+ typedef _Slist_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
+ typedef _Slist_iterator<_Tp, _Const_traits<_Tp> > const_iterator;
+ typedef _Slist_iterator<_Tp, _Traits> _Self;
+
+ typedef _Slist_node<value_type> _Node;
+
+ _Slist_iterator(_Node* __x) : _Slist_iterator_base(__x) {}
+ _Slist_iterator() : _Slist_iterator_base(0) {}
+ _Slist_iterator(const iterator& __x) : _Slist_iterator_base(__x._M_node) {}
+
+ reference operator*() const { return ((_Node*) _M_node)->_M_data; }
+
+ _STLP_DEFINE_ARROW_OPERATOR
+
+ _Self& operator++()
+ {
+ _M_incr();
+ return *this;
+ }
+ _Self operator++(int)
+ {
+ _Self __tmp = *this;
+ _M_incr();
+ return __tmp;
+ }
+};
+
+#ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _Tp, class _Traits>
+inline _Tp* _STLP_CALL value_type(const _Slist_iterator<_Tp, _Traits>&) { return (_Tp*)0; }
+#endif /* OLD_QUERIES */
+
+// Base class that encapsulates details of allocators and simplifies EH
+
+template <class _Tp, class _Alloc>
+struct _Slist_base {
+ _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+ typedef typename _Alloc_traits<_Tp,_Alloc>::allocator_type allocator_type;
+ typedef _Slist_node<_Tp> _Node;
+
+ _Slist_base(const allocator_type& __a) :
+ _M_head(_STLP_CONVERT_ALLOCATOR(__a, _Node), _Slist_node_base() ) {
+ _M_head._M_data._M_next = 0;
+ }
+ ~_Slist_base() { _M_erase_after(&_M_head._M_data, 0); }
+
+protected:
+ typedef typename _Alloc_traits<_Node,_Alloc>::allocator_type _M_node_allocator_type;
+
+ _Slist_node_base* _M_erase_after(_Slist_node_base* __pos)
+ {
+ _Node* __next = (_Node*) (__pos->_M_next);
+ _Slist_node_base* __next_next = __next->_M_next;
+ __pos->_M_next = __next_next;
+ _STLP_STD::_Destroy(&__next->_M_data);
+ _M_head.deallocate(__next,1);
+ return __next_next;
+ }
+ _Slist_node_base* _M_erase_after(_Slist_node_base*, _Slist_node_base*);
+
+public:
+ allocator_type get_allocator() const {
+ return _STLP_CONVERT_ALLOCATOR((const _M_node_allocator_type&)_M_head, _Tp);
+ }
+ _STLP_alloc_proxy<_Slist_node_base, _Node, _M_node_allocator_type> _M_head;
+};
+
+template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
+class slist : protected _Slist_base<_Tp,_Alloc>
+{
+private:
+ typedef _Slist_base<_Tp,_Alloc> _Base;
+ typedef slist<_Tp,_Alloc> _Self;
+public:
+ typedef _Tp value_type;
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef forward_iterator_tag _Iterator_category;
+
+ typedef _Slist_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
+ typedef _Slist_iterator<_Tp, _Const_traits<_Tp> > const_iterator;
+
+ _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+ typedef typename _Base::allocator_type allocator_type;
+
+
+private:
+ typedef _Slist_node<_Tp> _Node;
+ typedef _Slist_node_base _Node_base;
+ typedef _Slist_iterator_base _Iterator_base;
+
+ _Node* _M_create_node(const value_type& __x) {
+ _Node* __node = this->_M_head.allocate(1);
+ _STLP_TRY {
+ _Construct(&__node->_M_data, __x);
+ __node->_M_next = 0;
+ }
+ _STLP_UNWIND(this->_M_head.deallocate(__node, 1));
+ return __node;
+ }
+
+ _Node* _M_create_node() {
+ _Node* __node = this->_M_head.allocate(1);
+ _STLP_TRY {
+ _Construct(&__node->_M_data);
+ __node->_M_next = 0;
+ }
+ _STLP_UNWIND(this->_M_head.deallocate(__node, 1));
+ return __node;
+ }
+
+public:
+ allocator_type get_allocator() const { return _Base::get_allocator(); }
+
+ explicit slist(const allocator_type& __a = allocator_type()) : _Slist_base<_Tp,_Alloc>(__a) {}
+
+ slist(size_type __n, const value_type& __x,
+ const allocator_type& __a = allocator_type()) : _Slist_base<_Tp,_Alloc>(__a)
+ { _M_insert_after_fill(&this->_M_head._M_data, __n, __x); }
+
+ explicit slist(size_type __n) : _Slist_base<_Tp,_Alloc>(allocator_type())
+ { _M_insert_after_fill(&this->_M_head._M_data, __n, value_type()); }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ // We don't need any dispatching tricks here, because _M_insert_after_range
+ // already does them.
+ template <class _InputIterator>
+ slist(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) :
+ _Slist_base<_Tp,_Alloc>(__a)
+ { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ // VC++ needs this crazyness
+ template <class _InputIterator>
+ slist(_InputIterator __first, _InputIterator __last) :
+ _Slist_base<_Tp,_Alloc>(allocator_type())
+ { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }
+# endif
+#else /* _STLP_MEMBER_TEMPLATES */
+ slist(const_iterator __first, const_iterator __last,
+ const allocator_type& __a = allocator_type() ) :
+ _Slist_base<_Tp,_Alloc>(__a)
+ { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }
+ slist(const value_type* __first, const value_type* __last,
+ const allocator_type& __a = allocator_type()) :
+ _Slist_base<_Tp,_Alloc>(__a)
+ { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ slist(const _Self& __x) : _Slist_base<_Tp,_Alloc>(__x.get_allocator())
+ { _M_insert_after_range(&this->_M_head._M_data, __x.begin(), __x.end()); }
+
+ _Self& operator= (const _Self& __x);
+
+ ~slist() {}
+
+public:
+ // assign(), a generalized assignment member function. Two
+ // versions: one that takes a count, and one that takes a range.
+ // The range version is a member template, so we dispatch on whether
+ // or not the type is an integer.
+
+ void assign(size_type __n, const _Tp& __val)
+ { _M_fill_assign(__n, __val); }
+
+ void _M_fill_assign(size_type __n, const _Tp& __val);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _InputIterator>
+ void assign(_InputIterator __first, _InputIterator __last) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_assign_dispatch(__first, __last, _Integral());
+ }
+
+ template <class _Integer>
+ void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type&)
+ { _M_fill_assign((size_type) __n, (_Tp) __val); }
+
+ template <class _InputIter>
+ void
+ _M_assign_dispatch(_InputIter __first, _InputIter __last,
+ const __false_type&) {
+ _Node_base* __prev = &this->_M_head._M_data;
+ _Node* __node = (_Node*) this->_M_head._M_data._M_next;
+ while (__node != 0 && __first != __last) {
+ __node->_M_data = *__first;
+ __prev = __node;
+ __node = (_Node*) __node->_M_next;
+ ++__first;
+ }
+ if (__first != __last)
+ _M_insert_after_range(__prev, __first, __last);
+ else
+ this->_M_erase_after(__prev, 0);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:
+
+ // Experimental new feature: before_begin() returns a
+ // non-dereferenceable iterator that, when incremented, yields
+ // begin(). This iterator may be used as the argument to
+ // insert_after, erase_after, etc. Note that even for an empty
+ // slist, before_begin() is not the same iterator as end(). It
+ // is always necessary to increment before_begin() at least once to
+ // obtain end().
+ iterator before_begin() { return iterator((_Node*) &this->_M_head._M_data); }
+ const_iterator before_begin() const
+ { return const_iterator((_Node*) &this->_M_head._M_data); }
+
+ iterator begin() { return iterator((_Node*)this->_M_head._M_data._M_next); }
+ const_iterator begin() const
+ { return const_iterator((_Node*)this->_M_head._M_data._M_next);}
+
+ iterator end() { return iterator(0); }
+ const_iterator end() const { return const_iterator(0); }
+
+ size_type size() const { return _Sl_global_inst::size(this->_M_head._M_data._M_next); }
+
+ size_type max_size() const { return size_type(-1); }
+
+ bool empty() const { return this->_M_head._M_data._M_next == 0; }
+
+ void swap(_Self& __x) {
+ _STLP_STD::swap(this->_M_head, __x._M_head);
+ }
+
+public:
+ reference front() { return ((_Node*) this->_M_head._M_data._M_next)->_M_data; }
+ const_reference front() const
+ { return ((_Node*) this->_M_head._M_data._M_next)->_M_data; }
+ void push_front(const value_type& __x) {
+ __slist_make_link(&this->_M_head._M_data, _M_create_node(__x));
+ }
+
+# ifndef _STLP_NO_ANACHRONISMS
+ void push_front() { __slist_make_link(&this->_M_head._M_data, _M_create_node());}
+# endif
+
+ void pop_front() {
+ _Node* __node = (_Node*) this->_M_head._M_data._M_next;
+ this->_M_head._M_data._M_next = __node->_M_next;
+ _STLP_STD::_Destroy(&__node->_M_data);
+ this->_M_head.deallocate(__node, 1);
+ }
+
+ iterator previous(const_iterator __pos) {
+ return iterator((_Node*) _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node));
+ }
+ const_iterator previous(const_iterator __pos) const {
+ return const_iterator((_Node*) _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node));
+ }
+
+private:
+ _Node* _M_insert_after(_Node_base* __pos, const value_type& __x) {
+ return (_Node*) (__slist_make_link(__pos, _M_create_node(__x)));
+ }
+
+ _Node* _M_insert_after(_Node_base* __pos) {
+ return (_Node*) (__slist_make_link(__pos, _M_create_node()));
+ }
+
+ void _M_insert_after_fill(_Node_base* __pos,
+ size_type __n, const value_type& __x) {
+ for (size_type __i = 0; __i < __n; ++__i)
+ __pos = __slist_make_link(__pos, _M_create_node(__x));
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ // Check whether it's an integral type. If so, it's not an iterator.
+ template <class _InIter>
+ void _M_insert_after_range(_Node_base* __pos,
+ _InIter __first, _InIter __last) {
+ typedef typename _Is_integer<_InIter>::_Integral _Integral;
+ _M_insert_after_range(__pos, __first, __last, _Integral());
+ }
+
+ template <class _Integer>
+ void _M_insert_after_range(_Node_base* __pos, _Integer __n, _Integer __x,
+ const __true_type&) {
+ _M_insert_after_fill(__pos, __n, __x);
+ }
+
+ template <class _InIter>
+ void _M_insert_after_range(_Node_base* __pos,
+ _InIter __first, _InIter __last,
+ const __false_type&) {
+ while (__first != __last) {
+ __pos = __slist_make_link(__pos, _M_create_node(*__first));
+ ++__first;
+ }
+ }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ void _M_insert_after_range(_Node_base* __pos,
+ const_iterator __first, const_iterator __last) {
+ while (__first != __last) {
+ __pos = __slist_make_link(__pos, _M_create_node(*__first));
+ ++__first;
+ }
+ }
+ void _M_insert_after_range(_Node_base* __pos,
+ const value_type* __first,
+ const value_type* __last) {
+ while (__first != __last) {
+ __pos = __slist_make_link(__pos, _M_create_node(*__first));
+ ++__first;
+ }
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:
+
+ iterator insert_after(iterator __pos, const value_type& __x) {
+ return iterator(_M_insert_after(__pos._M_node, __x));
+ }
+
+ iterator insert_after(iterator __pos) {
+ return insert_after(__pos, value_type());
+ }
+
+ void insert_after(iterator __pos, size_type __n, const value_type& __x) {
+ _M_insert_after_fill(__pos._M_node, __n, __x);
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ // We don't need any dispatching tricks here, because _M_insert_after_range
+ // already does them.
+ template <class _InIter>
+ void insert_after(iterator __pos, _InIter __first, _InIter __last) {
+ _M_insert_after_range(__pos._M_node, __first, __last);
+ }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ void insert_after(iterator __pos,
+ const_iterator __first, const_iterator __last) {
+ _M_insert_after_range(__pos._M_node, __first, __last);
+ }
+ void insert_after(iterator __pos,
+ const value_type* __first, const value_type* __last) {
+ _M_insert_after_range(__pos._M_node, __first, __last);
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ iterator insert(iterator __pos, const value_type& __x) {
+ return iterator(_M_insert_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+ __x));
+ }
+
+ iterator insert(iterator __pos) {
+ return iterator(_M_insert_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+ value_type()));
+ }
+
+ void insert(iterator __pos, size_type __n, const value_type& __x) {
+ _M_insert_after_fill(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), __n, __x);
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ // We don't need any dispatching tricks here, because _M_insert_after_range
+ // already does them.
+ template <class _InIter>
+ void insert(iterator __pos, _InIter __first, _InIter __last) {
+ _M_insert_after_range(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+ __first, __last);
+ }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ void insert(iterator __pos, const_iterator __first, const_iterator __last) {
+ _M_insert_after_range(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+ __first, __last);
+ }
+ void insert(iterator __pos, const value_type* __first,
+ const value_type* __last) {
+ _M_insert_after_range(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+ __first, __last);
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+
+public:
+ iterator erase_after(iterator __pos) {
+ return iterator((_Node*) this->_M_erase_after(__pos._M_node));
+ }
+ iterator erase_after(iterator __before_first, iterator __last) {
+ return iterator((_Node*) this->_M_erase_after(__before_first._M_node,
+ __last._M_node));
+ }
+
+ iterator erase(iterator __pos) {
+ return iterator((_Node*) this->_M_erase_after(_Sl_global_inst::__previous(&this->_M_head._M_data,
+ __pos._M_node)));
+ }
+ iterator erase(iterator __first, iterator __last) {
+ return iterator((_Node*) this->_M_erase_after(
+ _Sl_global_inst::__previous(&this->_M_head._M_data, __first._M_node), __last._M_node));
+ }
+
+ void resize(size_type new_size, const _Tp& __x);
+ void resize(size_type new_size) { resize(new_size, _Tp()); }
+ void clear() {
+ this->_M_erase_after(&this->_M_head._M_data, 0);
+ }
+
+public:
+ // Moves the range [__before_first + 1, __before_last + 1) to *this,
+ // inserting it immediately after __pos. This is constant time.
+ void splice_after(iterator __pos,
+ iterator __before_first, iterator __before_last)
+ {
+ if (__before_first != __before_last) {
+ _Sl_global_inst::__splice_after(__pos._M_node, __before_first._M_node,
+ __before_last._M_node);
+ }
+ }
+
+ // Moves the element that follows __prev to *this, inserting it immediately
+ // after __pos. This is constant time.
+ void splice_after(iterator __pos, iterator __prev)
+ {
+ _Sl_global_inst::__splice_after(__pos._M_node,
+ __prev._M_node, __prev._M_node->_M_next);
+ }
+
+ // Removes all of the elements from the list __x to *this, inserting
+ // them immediately after __pos. __x must not be *this. Complexity:
+ // linear in __x.size().
+ void splice_after(iterator __pos, _Self& __x)
+ {
+ _Sl_global_inst::__splice_after(__pos._M_node, &__x._M_head._M_data);
+ }
+
+ // Linear in distance(begin(), __pos), and linear in __x.size().
+ void splice(iterator __pos, _Self& __x) {
+ if (__x._M_head._M_data._M_next)
+ _Sl_global_inst::__splice_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+ &__x._M_head._M_data, _Sl_global_inst::__previous(&__x._M_head._M_data, 0));
+ }
+
+ // Linear in distance(begin(), __pos), and in distance(__x.begin(), __i).
+ void splice(iterator __pos, _Self& __x, iterator __i) {
+ _Sl_global_inst::__splice_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+ _Sl_global_inst::__previous(&__x._M_head._M_data, __i._M_node),
+ __i._M_node);
+ }
+
+ // Linear in distance(begin(), __pos), in distance(__x.begin(), __first),
+ // and in distance(__first, __last).
+ void splice(iterator __pos, _Self& __x, iterator __first, iterator __last)
+ {
+ if (__first != __last)
+ _Sl_global_inst::__splice_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+ _Sl_global_inst::__previous(&__x._M_head._M_data, __first._M_node),
+ _Sl_global_inst::__previous(__first._M_node, __last._M_node));
+ }
+
+public:
+ void reverse() {
+ if (this->_M_head._M_data._M_next)
+ this->_M_head._M_data._M_next = _Sl_global_inst::__reverse(this->_M_head._M_data._M_next);
+ }
+
+ void remove(const _Tp& __val);
+ void unique();
+ void merge(_Self& __x);
+ void sort();
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _Predicate>
+ void remove_if(_Predicate __pred) {
+ _Node_base* __cur = &this->_M_head._M_data;
+ while (__cur->_M_next) {
+ if (__pred(((_Node*) __cur->_M_next)->_M_data))
+ this->_M_erase_after(__cur);
+ else
+ __cur = __cur->_M_next;
+ }
+ }
+
+ template <class _BinaryPredicate>
+ void unique(_BinaryPredicate __pred) {
+ _Node* __cur = (_Node*) this->_M_head._M_data._M_next;
+ if (__cur) {
+ while (__cur->_M_next) {
+ if (__pred(((_Node*)__cur)->_M_data,
+ ((_Node*)(__cur->_M_next))->_M_data))
+ this->_M_erase_after(__cur);
+ else
+ __cur = (_Node*) __cur->_M_next;
+ }
+ }
+ }
+
+ template <class _StrictWeakOrdering>
+ void merge(slist<_Tp,_Alloc>& __x,
+ _StrictWeakOrdering __comp) {
+ _Node_base* __n1 = &this->_M_head._M_data;
+ while (__n1->_M_next && __x._M_head._M_data._M_next) {
+ if (__comp(((_Node*) __x._M_head._M_data._M_next)->_M_data,
+ ((_Node*) __n1->_M_next)->_M_data))
+ _Sl_global_inst::__splice_after(__n1, &__x._M_head._M_data, __x._M_head._M_data._M_next);
+ __n1 = __n1->_M_next;
+ }
+ if (__x._M_head._M_data._M_next) {
+ __n1->_M_next = __x._M_head._M_data._M_next;
+ __x._M_head._M_data._M_next = 0;
+ }
+ }
+
+ template <class _StrictWeakOrdering>
+ void sort(_StrictWeakOrdering __comp) {
+ if (this->_M_head._M_data._M_next && this->_M_head._M_data._M_next->_M_next) {
+ slist __carry;
+ slist __counter[64];
+ int __fill = 0;
+ while (!empty()) {
+ _Sl_global_inst::__splice_after(&__carry._M_head._M_data, &this->_M_head._M_data, this->_M_head._M_data._M_next);
+ int __i = 0;
+ while (__i < __fill && !__counter[__i].empty()) {
+ __counter[__i].merge(__carry, __comp);
+ __carry.swap(__counter[__i]);
+ ++__i;
+ }
+ __carry.swap(__counter[__i]);
+ if (__i == __fill)
+ ++__fill;
+ }
+
+ for (int __i = 1; __i < __fill; ++__i)
+ __counter[__i].merge(__counter[__i-1], __comp);
+ this->swap(__counter[__fill-1]);
+ }
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+};
+
+template <class _Tp, class _Alloc>
+inline bool _STLP_CALL
+operator==(const slist<_Tp,_Alloc>& _SL1, const slist<_Tp,_Alloc>& _SL2)
+{
+ typedef typename slist<_Tp,_Alloc>::const_iterator const_iterator;
+ const_iterator __end1 = _SL1.end();
+ const_iterator __end2 = _SL2.end();
+
+ const_iterator __i1 = _SL1.begin();
+ const_iterator __i2 = _SL2.begin();
+ while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) {
+ ++__i1;
+ ++__i2;
+ }
+ return __i1 == __end1 && __i2 == __end2;
+}
+
+# define _STLP_EQUAL_OPERATOR_SPECIALIZED
+# define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
+# define _STLP_TEMPLATE_CONTAINER slist<_Tp, _Alloc>
+# include <stl/_relops_cont.h>
+# undef _STLP_TEMPLATE_CONTAINER
+# undef _STLP_TEMPLATE_HEADER
+# undef _STLP_EQUAL_OPERATOR_SPECIALIZED
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_slist.c>
+# endif
+
+# undef slist
+# define __slist__ __FULL_NAME(slist)
+
+#if defined (_STLP_DEBUG) && !defined (_STLP_INTERNAL_DBG_SLIST_H)
+# include <stl/debug/_slist.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+// Specialization of insert_iterator so that insertions will be constant
+// time rather than linear time.
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+template <class _Tp, class _Alloc>
+class insert_iterator<slist<_Tp, _Alloc> > {
+protected:
+ typedef slist<_Tp, _Alloc> _Container;
+ _Container* container;
+ typename _Container::iterator iter;
+public:
+ typedef _Container container_type;
+ typedef output_iterator_tag iterator_category;
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+
+ insert_iterator(_Container& __x, typename _Container::iterator __i)
+ : container(&__x) {
+ if (__i == __x.begin())
+ iter = __x.before_begin();
+ else
+ iter = __x.previous(__i);
+ }
+
+ insert_iterator<_Container>&
+ operator=(const typename _Container::value_type& __val) {
+ iter = container->insert_after(iter, __val);
+ return *this;
+ }
+ insert_iterator<_Container>& operator*() { return *this; }
+ insert_iterator<_Container>& operator++() { return *this; }
+ insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+_STLP_END_NAMESPACE
+
+
+# if defined ( _STLP_USE_WRAPPER_FOR_ALLOC_PARAM )
+# include <stl/wrappers/_slist.h>
+# endif
+
+#endif /* _STLP_INTERNAL_SLIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_slist_base.c b/src/STLport/stl/_slist_base.c
new file mode 100644
index 0000000..26fb6ea
--- /dev/null
+++ b/src/STLport/stl/_slist_base.c
@@ -0,0 +1,109 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_SLIST_BASE_C
+#define _STLP_SLIST_BASE_C
+
+#ifndef _STLP_INTERNAL_SLIST_BASE_H
+# include <stl/_slist_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+template <class _Dummy>
+_Slist_node_base* _STLP_CALL
+_Sl_global<_Dummy>::__previous(_Slist_node_base* __head,
+ const _Slist_node_base* __node)
+{
+ while (__head && __head->_M_next != __node)
+ __head = __head->_M_next;
+ return __head;
+}
+
+template <class _Dummy>
+void _STLP_CALL
+_Sl_global<_Dummy>::__splice_after(_Slist_node_base* __pos, _Slist_node_base* __head)
+{
+ _Slist_node_base* __before_last = __previous(__head, 0);
+ if (__before_last != __head) {
+ _Slist_node_base* __after = __pos->_M_next;
+ __pos->_M_next = __head->_M_next;
+ __head->_M_next = 0;
+ __before_last->_M_next = __after;
+ }
+}
+
+template <class _Dummy>
+void _STLP_CALL
+_Sl_global<_Dummy>::__splice_after(_Slist_node_base* __pos,
+ _Slist_node_base* __before_first,
+ _Slist_node_base* __before_last)
+{
+ if (__pos != __before_first && __pos != __before_last) {
+ _Slist_node_base* __first = __before_first->_M_next;
+ _Slist_node_base* __after = __pos->_M_next;
+ __before_first->_M_next = __before_last->_M_next;
+ __pos->_M_next = __first;
+ __before_last->_M_next = __after;
+ }
+}
+
+template <class _Dummy>
+_Slist_node_base* _STLP_CALL
+_Sl_global<_Dummy>::__reverse(_Slist_node_base* __node)
+{
+ _Slist_node_base* __result = __node;
+ __node = __node->_M_next;
+ __result->_M_next = 0;
+ while(__node) {
+ _Slist_node_base* __next = __node->_M_next;
+ __node->_M_next = __result;
+ __result = __node;
+ __node = __next;
+ }
+ return __result;
+}
+
+template <class _Dummy>
+size_t _STLP_CALL
+_Sl_global<_Dummy>::size(_Slist_node_base* __node)
+{
+ size_t __result = 0;
+ for ( ; __node != 0; __node = __node->_M_next)
+ ++__result;
+ return __result;
+}
+
+#endif /* defined (__BUILDING_STLPORT) || ! defined (_STLP_OWN_IOSTREAMS) */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_SLIST_BASE_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_slist_base.h b/src/STLport/stl/_slist_base.h
new file mode 100644
index 0000000..e090e81
--- /dev/null
+++ b/src/STLport/stl/_slist_base.h
@@ -0,0 +1,87 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_SLIST_BASE_H
+#define _STLP_INTERNAL_SLIST_BASE_H
+
+#ifndef _STLP_CSTDDEF
+#include <cstddef>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+struct _Slist_node_base
+{
+ _Slist_node_base* _M_next;
+};
+
+inline _Slist_node_base*
+__slist_make_link(_Slist_node_base* __prev_node,
+ _Slist_node_base* __new_node)
+{
+ __new_node->_M_next = __prev_node->_M_next;
+ __prev_node->_M_next = __new_node;
+ return __new_node;
+}
+
+
+template <class _Dummy>
+class _Sl_global {
+public:
+ // those used to be global functions
+ // moved here to reduce code bloat without templatizing _Slist_iterator_base
+ static size_t _STLP_CALL size(_Slist_node_base* __node);
+ static _Slist_node_base* _STLP_CALL __reverse(_Slist_node_base* __node);
+ static void _STLP_CALL __splice_after(_Slist_node_base* __pos,
+ _Slist_node_base* __before_first,
+ _Slist_node_base* __before_last);
+
+ static void _STLP_CALL __splice_after(_Slist_node_base* __pos, _Slist_node_base* __head);
+
+ static _Slist_node_base* _STLP_CALL __previous(_Slist_node_base* __head,
+ const _Slist_node_base* __node);
+ static const _Slist_node_base* _STLP_CALL __previous(const _Slist_node_base* __head,
+ const _Slist_node_base* __node) {
+ return _Sl_global<_Dummy>::__previous((_Slist_node_base*)__head, __node);
+ }
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _Sl_global<bool>;
+# endif
+typedef _Sl_global<bool> _Sl_global_inst;
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_slist_base.c>
+# endif
+
+#endif /* _STLP_INTERNAL_SLIST_BASE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_sparc_atomic.h b/src/STLport/stl/_sparc_atomic.h
new file mode 100644
index 0000000..320dd19
--- /dev/null
+++ b/src/STLport/stl/_sparc_atomic.h
@@ -0,0 +1,60 @@
+
+// Currently, SUN CC requires object file
+
+#if defined (__GNUC__)
+
+/*
+** int _STLP_atomic_exchange (__stl_atomic_t *pvalue, __stl_atomic_t value)
+*/
+
+# ifdef __sparc_v9__
+
+# ifdef __arch64__
+
+# define _STLP_EXCH_ASM asm volatile ("casx [%3], %4, %0 ; membar #LoadLoad | #LoadStore " : \
+ "=r" (_L_value2), "=m" (*_L_pvalue1) : \
+ "m" (*_L_pvalue1), "r" (_L_pvalue1), "r" (_L_value1), "0" (_L_value2) )
+
+# else /* __arch64__ */
+
+# define _STLP_EXCH_ASM asm volatile ("cas [%3], %4, %0" : \
+ "=r" (_L_value2), "=m" (*_L_pvalue1) : \
+ "m" (*_L_pvalue1), "r" (_L_pvalue1), "r" (_L_value1), "0" (_L_value2) )
+# endif
+
+# else /* __sparc_v9__ */
+
+# define _STLP_EXCH_ASM asm volatile ("swap [%3], %0 " : \
+ "=r" (_L_value2), "=m" (*_L_pvalue1) : \
+ "m" (*_L_pvalue1), "r" (_L_pvalue1), "0" (_L_value2) )
+# endif
+
+
+# define _STLP_ATOMIC_EXCHANGE(__pvalue1, __value2) \
+ ({ register volatile __stl_atomic_t *_L_pvalue1 = __pvalue1; \
+ register __stl_atomic_t _L_value1, _L_value2 = __value2 ; \
+ do { _L_value1 = *_L_pvalue1; _STLP_EXCH_ASM; } while ( _L_value1 != _L_value2 ) ; \
+ _L_value1; })
+
+# define _STLP_ATOMIC_INCREMENT(__pvalue1) \
+ { register volatile __stl_atomic_t *_L_pvalue1 = __pvalue1; \
+ register __stl_atomic_t _L_value1, _L_value2; \
+ do { _L_value1 = *_L_pvalue1; _L_value2 = _L_value1+1; _STLP_EXCH_ASM; } while ( _L_value1 != _L_value2 ) ; }
+
+# define _STLP_ATOMIC_DECREMENT(__pvalue1) \
+ { register volatile __stl_atomic_t *_L_pvalue1 = __pvalue1; \
+ register __stl_atomic_t _L_value1, _L_value2; \
+ do { _L_value1 = *_L_pvalue1; _L_value2 = _L_value1-1; _STLP_EXCH_ASM; } while ( _L_value1 != _L_value2 ) ; }
+
+# elif ! defined (_STLP_NO_EXTERN_INLINE)
+
+extern "C" __stl_atomic_t _STLP_atomic_exchange(__stl_atomic_t * __x, __stl_atomic_t __v);
+extern "C" void _STLP_atomic_decrement(__stl_atomic_t* i);
+extern "C" void _STLP_atomic_increment(__stl_atomic_t* i);
+
+# define _STLP_ATOMIC_INCREMENT(__x) _STLP_atomic_increment((__stl_atomic_t*)__x)
+# define _STLP_ATOMIC_DECREMENT(__x) _STLP_atomic_decrement((__stl_atomic_t*)__x)
+# define _STLP_ATOMIC_EXCHANGE(__x, __y) _STLP_atomic_exchange((__stl_atomic_t*)__x, (__stl_atomic_t)__y)
+
+# endif
+
diff --git a/src/STLport/stl/_sstream.c b/src/STLport/stl/_sstream.c
new file mode 100644
index 0000000..411e2b1
--- /dev/null
+++ b/src/STLport/stl/_sstream.c
@@ -0,0 +1,543 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_SSTREAM_C
+#define _STLP_SSTREAM_C
+
+#ifndef _STLP_SSTREAM_H
+# include <stl/_sstream.h>
+#endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+// no wint_t is supported for this mode
+# define __BSB_int_type__ int
+# define __BSB_pos_type__ streampos
+# else
+# define __BSB_int_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
+# define __BSB_pos_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// Non-inline stringbuf member functions.
+
+// Constructors. Note that the base class constructor sets all of the
+// get and area pointers to null.
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_stringbuf<_CharT, _Traits, _Alloc>
+ ::basic_stringbuf(ios_base::openmode __mode)
+ : basic_streambuf<_CharT, _Traits>(), _M_mode(__mode), _M_str()
+{}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_stringbuf<_CharT, _Traits, _Alloc>
+ ::basic_stringbuf(const basic_string<_CharT, _Traits, _Alloc>& __s, ios_base::openmode __mode)
+ : basic_streambuf<_CharT, _Traits>(), _M_mode(__mode), _M_str(__s)
+{
+ _M_set_ptrs();
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_stringbuf<_CharT, _Traits, _Alloc>::~basic_stringbuf()
+{}
+
+// Set the underlying string to a new value.
+template <class _CharT, class _Traits, class _Alloc>
+void
+basic_stringbuf<_CharT, _Traits, _Alloc>::str(const basic_string<_CharT, _Traits, _Alloc>& __s)
+{
+ _M_str = __s;
+ _M_set_ptrs();
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+void
+basic_stringbuf<_CharT, _Traits, _Alloc>::_M_set_ptrs() {
+ _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data());
+ _CharT* __data_end = __data_ptr + _M_str.size();
+ // The initial read position is the beginning of the string.
+ if (_M_mode & ios_base::in)
+ this->setg(__data_ptr, __data_ptr, __data_end);
+
+ // The initial write position is the beginning of the string.
+ if (_M_mode & ios_base::out) {
+ if (_M_mode & ios_base::app)
+ this->setp(__data_end, __data_end);
+ else
+ this->setp(__data_ptr, __data_end);
+ }
+}
+
+// Precondition: gptr() >= egptr(). Returns a character, if one is available.
+template <class _CharT, class _Traits, class _Alloc>
+__BSB_int_type__
+basic_stringbuf<_CharT, _Traits, _Alloc>::underflow()
+{
+ return this->gptr() != this->egptr()
+ ? _Traits::to_int_type(*this->gptr())
+ : _Traits::eof();
+}
+
+// Precondition: gptr() >= egptr().
+template <class _CharT, class _Traits, class _Alloc>
+__BSB_int_type__
+basic_stringbuf<_CharT, _Traits, _Alloc>::uflow()
+{
+ if (this->gptr() != this->egptr()) {
+ int_type __c = _Traits::to_int_type(*this->gptr());
+ this->gbump(1);
+ return __c;
+ }
+ else
+ return _Traits::eof();
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+__BSB_int_type__
+basic_stringbuf<_CharT, _Traits, _Alloc>::pbackfail(int_type __c)
+{
+ if (this->gptr() != this->eback()) {
+ if (!_Traits::eq_int_type(__c, _Traits::eof())) {
+ if (_Traits::eq(_Traits::to_char_type(__c), this->gptr()[-1])) {
+ this->gbump(-1);
+ return __c;
+ }
+ else if (_M_mode & ios_base::out) {
+ this->gbump(-1);
+ *this->gptr() = __c;
+ return __c;
+ }
+ else
+ return _Traits::eof();
+ }
+ else {
+ this->gbump(-1);
+ return _Traits::not_eof(__c);
+ }
+ }
+ else
+ return _Traits::eof();
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+__BSB_int_type__
+basic_stringbuf<_CharT, _Traits, _Alloc>::overflow(int_type __c)
+{
+ // fbp : reverse order of "ifs" to pass Dietmar's test.
+ // Apparently, standard allows overflow with eof even for read-only streams.
+ if (!_Traits::eq_int_type(__c, _Traits::eof())) {
+ if (_M_mode & ios_base::out) {
+ if (!(_M_mode & ios_base::in)) {
+ // It's a write-only streambuf, so we can use special append buffer.
+ if (this->pptr() == this->epptr())
+ this->_M_append_buffer();
+
+ if (this->pptr() != this->epptr()) {
+ *this->pptr() = _Traits::to_char_type(__c);
+ this->pbump(1);
+ return __c;
+ }
+ else
+ return _Traits::eof();
+ }
+
+ else {
+ // We're not using a special append buffer, just the string itself.
+ if (this->pptr() == this->epptr()) {
+ ptrdiff_t __offset = this->gptr() - this->eback();
+ _M_str.push_back(_Traits::to_char_type(__c));
+
+ _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data());
+ size_t __data_size = _M_str.size();
+
+ this->setg(__data_ptr, __data_ptr + __offset, __data_ptr+__data_size);
+ this->setp(__data_ptr, __data_ptr + __data_size);
+ this->pbump((int)__data_size);
+ return __c;
+ }
+ else {
+ *this->pptr() = _Traits::to_char_type(__c);
+ this->pbump(1);
+ return __c;
+ }
+ }
+ }
+ else // Overflow always fails if it's read-only
+ return _Traits::eof();
+ }
+ else // __c is EOF, so we don't have to do anything
+ return _Traits::not_eof(__c);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+streamsize
+basic_stringbuf<_CharT, _Traits, _Alloc>::xsputn(const char_type* __s,
+ streamsize __n)
+{
+ streamsize __nwritten = 0;
+
+ if ((_M_mode & ios_base::out) && __n > 0) {
+ // If the put pointer is somewhere in the middle of the string,
+ // then overwrite instead of append.
+ if (this->pbase() == _M_str.data() ) {
+ ptrdiff_t __avail = _M_str.data() + _M_str.size() - this->pptr();
+ if (__avail > __n) {
+ _Traits::copy(this->pptr(), __s, __n);
+ this->pbump((int)__n);
+ return __n;
+ }
+ else {
+ _Traits::copy(this->pptr(), __s, __avail);
+ __nwritten += __avail;
+ __n -= __avail;
+ __s += __avail;
+ this->setp(_M_Buf, _M_Buf + __STATIC_CAST(int,_S_BufSiz));
+ }
+ }
+
+ // At this point we know we're appending.
+ if (_M_mode & ios_base::in) {
+ ptrdiff_t __get_offset = this->gptr() - this->eback();
+ _M_str.append(__s, __s + __n);
+
+ _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data());
+ size_t __data_size = _M_str.size();
+
+ this->setg(__data_ptr, __data_ptr + __get_offset, __data_ptr+__data_size);
+ this->setp(__data_ptr, __data_ptr + __data_size);
+ this->pbump((int)__data_size);
+ }
+ else {
+ _M_append_buffer();
+ _M_str.append(__s, __s + __n);
+ }
+
+ __nwritten += __n;
+ }
+
+ return __nwritten;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+streamsize
+basic_stringbuf<_CharT, _Traits, _Alloc>::_M_xsputnc(char_type __c,
+ streamsize __n)
+{
+ streamsize __nwritten = 0;
+
+ if ((_M_mode & ios_base::out) && __n > 0) {
+ // If the put pointer is somewhere in the middle of the string,
+ // then overwrite instead of append.
+ if (this->pbase() == _M_str.data()) {
+ ptrdiff_t __avail = _M_str.data() + _M_str.size() - this->pptr();
+ if (__avail > __n) {
+ _Traits::assign(this->pptr(), __n, __c);
+ this->pbump((int)__n);
+ return __n;
+ }
+ else {
+ _Traits::assign(this->pptr(), __avail, __c);
+ __nwritten += __avail;
+ __n -= __avail;
+ this->setp(_M_Buf, _M_Buf + __STATIC_CAST(int,_S_BufSiz));
+ }
+ }
+
+ // At this point we know we're appending.
+ if (this->_M_mode & ios_base::in) {
+ ptrdiff_t __get_offset = this->gptr() - this->eback();
+ _M_str.append(__n, __c);
+
+ _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data());
+ size_t __data_size = _M_str.size();
+
+ this->setg(__data_ptr, __data_ptr + __get_offset, __data_ptr+__data_size);
+ this->setp(__data_ptr, __data_ptr + __data_size);
+ this->pbump((int)__data_size);
+
+ }
+ else {
+ _M_append_buffer();
+ _M_str.append(__n, __c);
+ }
+
+ __nwritten += __n;
+ }
+
+ return __nwritten;
+}
+
+// According to the C++ standard the effects of setbuf are implementation
+// defined, except that setbuf(0, 0) has no effect. In this implementation,
+// setbuf(<anything>, n), for n > 0, calls reserve(n) on the underlying
+// string.
+template <class _CharT, class _Traits, class _Alloc>
+basic_streambuf<_CharT, _Traits>*
+basic_stringbuf<_CharT, _Traits, _Alloc>::setbuf(_CharT*, streamsize __n)
+{
+ if (__n > 0) {
+ bool __do_get_area = false;
+ bool __do_put_area = false;
+ ptrdiff_t __offg = 0;
+ ptrdiff_t __offp = 0;
+
+ if (this->pbase() == _M_str.data()) {
+ __do_put_area = true;
+ __offp = this->pptr() - this->pbase();
+ }
+
+ if (this->eback() == _M_str.data()) {
+ __do_get_area = true;
+ __offg = this->gptr() - this->eback();
+ }
+
+ if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in))
+ _M_append_buffer();
+
+ _M_str.reserve(__n);
+
+ _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data());
+ size_t __data_size = _M_str.size();
+
+ if (__do_get_area) {
+ this->setg(__data_ptr, __data_ptr + __offg, __data_ptr+__data_size);
+ }
+
+ if (__do_put_area) {
+ this->setp(__data_ptr, __data_ptr+__data_size);
+ this->pbump((int)__offp);
+ }
+ }
+
+ return this;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+__BSB_pos_type__
+basic_stringbuf<_CharT, _Traits, _Alloc>::seekoff(off_type __off,
+ ios_base::seekdir __dir,
+ ios_base::openmode __mode)
+{
+ bool __in = false;
+ bool __out = false;
+
+ if ((__mode & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out) ) {
+ if (__dir == ios_base::beg || __dir == ios_base::end)
+ __in = __out = true;
+ }
+ else if (__mode & ios_base::in)
+ __in = true;
+ else if (__mode & ios_base::out)
+ __out = true;
+
+ if (!__in && !__out)
+ return pos_type(off_type(-1));
+ else if ((__in && (!(_M_mode & ios_base::in) || this->gptr() == 0)) ||
+ (__out && (!(_M_mode & ios_base::out) || this->pptr() == 0)))
+ return pos_type(off_type(-1));
+
+ if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in))
+ _M_append_buffer();
+
+ streamoff __newoff;
+ switch(__dir) {
+ case ios_base::beg:
+ __newoff = 0;
+ break;
+ case ios_base::end:
+ __newoff = _M_str.size();
+ break;
+ case ios_base::cur:
+ __newoff = __in ? this->gptr() - this->eback()
+ : this->pptr() - this->pbase();
+ break;
+ default:
+ return pos_type(off_type(-1));
+ }
+
+ __off += __newoff;
+
+ if (__in) {
+ ptrdiff_t __n = this->egptr() - this->eback();
+
+ if (__off < 0 || __off > __n)
+ return pos_type(off_type(-1));
+ else
+ this->setg(this->eback(), this->eback() + __off, this->eback() + __n);
+ }
+
+ if (__out) {
+ ptrdiff_t __n = this->epptr() - this->pbase();
+
+ if (__off < 0 || __off > __n)
+ return pos_type(off_type(-1));
+ else {
+ this->setp(this->pbase(), this->pbase() + __n);
+ this->pbump((int)__off);
+ }
+ }
+
+ return pos_type(__off);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+__BSB_pos_type__
+basic_stringbuf<_CharT, _Traits, _Alloc>
+ ::seekpos(pos_type __pos, ios_base::openmode __mode)
+{
+ bool __in = (__mode & ios_base::in) != 0;
+ bool __out = (__mode & ios_base::out) != 0;
+
+ if ((__in && (!(_M_mode & ios_base::in) || this->gptr() == 0)) ||
+ (__out && (!(_M_mode & ios_base::out) || this->pptr() == 0)))
+ return pos_type(off_type(-1));
+
+ const off_type __n = __pos - pos_type(off_type(0));
+ if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in))
+ _M_append_buffer();
+
+ if (__in) {
+ if (__n < 0 || __n > this->egptr() - this->eback())
+ return pos_type(off_type(-1));
+ this->setg(this->eback(), this->eback() + __n, this->egptr());
+ }
+
+ if (__out) {
+ if (__n < 0 || size_t(__n) > _M_str.size())
+ return pos_type(off_type(-1));
+
+ _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data());
+ size_t __data_size = _M_str.size();
+
+ this->setp(__data_ptr, __data_ptr+__data_size);
+ this->pbump((int)__n);
+ }
+
+ return __pos;
+}
+
+// This is declared as a const member function because it is
+// called by basic_stringbuf<>::str(). Precondition: this is a
+// write-only stringbuf. We can't use an output buffer for read-
+// write stringbufs. Postcondition: pptr is reset to the beginning
+// of the buffer.
+template <class _CharT, class _Traits, class _Alloc>
+void basic_stringbuf<_CharT, _Traits, _Alloc>::_M_append_buffer() const
+
+{
+ // Do we have a buffer to append?
+ if (this->pbase() == this->_M_Buf && this->pptr() != this->_M_Buf) {
+ basic_stringbuf<_CharT, _Traits, _Alloc>* __this = __CONST_CAST(_Self*,this);
+ __this->_M_str.append((const _CharT*)this->pbase(), (const _CharT*)this->pptr());
+ __this->setp(__CONST_CAST(_CharT*,_M_Buf),
+ __CONST_CAST(_CharT*,_M_Buf + __STATIC_CAST(int,_S_BufSiz)));
+ }
+
+ // Have we run off the end of the string?
+ else if (this->pptr() == this->epptr()) {
+ basic_stringbuf<_CharT, _Traits, _Alloc>* __this = __CONST_CAST(_Self*,this);
+ __this->setp(__CONST_CAST(_CharT*,_M_Buf),
+ __CONST_CAST(_CharT*,_M_Buf + __STATIC_CAST(int,_S_BufSiz)));
+ }
+}
+
+//----------------------------------------------------------------------
+// Non-inline istringstream member functions.
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istringstream<_CharT, _Traits, _Alloc>
+ ::basic_istringstream(ios_base::openmode __mode)
+ : basic_istream<_CharT, _Traits>(0),
+ _M_buf(__mode | ios_base::in)
+{
+ this->init(&_M_buf);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istringstream<_CharT, _Traits, _Alloc>
+ ::basic_istringstream(const _String& __str,ios_base::openmode __mode)
+ : basic_istream<_CharT, _Traits>(0),
+ _M_buf(__str, __mode | ios_base::in)
+{
+ this->init(&_M_buf);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istringstream<_CharT, _Traits, _Alloc>::~basic_istringstream()
+{}
+
+//----------------------------------------------------------------------
+// Non-inline ostringstream member functions.
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_ostringstream<_CharT, _Traits, _Alloc>
+ ::basic_ostringstream(ios_base::openmode __mode)
+ : basic_ostream<_CharT, _Traits>(0),
+ _M_buf(__mode | ios_base::out)
+{
+ this->init(&_M_buf);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_ostringstream<_CharT, _Traits, _Alloc>
+ ::basic_ostringstream(const _String& __str, ios_base::openmode __mode)
+ : basic_ostream<_CharT, _Traits>(0),
+ _M_buf(__str, __mode | ios_base::out)
+{
+ this->init(&_M_buf);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_ostringstream<_CharT, _Traits, _Alloc>::~basic_ostringstream()
+{}
+
+//----------------------------------------------------------------------
+// Non-inline stringstream member functions.
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_stringstream<_CharT, _Traits, _Alloc>
+ ::basic_stringstream(ios_base::openmode __mode)
+ : basic_iostream<_CharT, _Traits>(0), _M_buf(__mode)
+{
+ this->init(&_M_buf);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_stringstream<_CharT, _Traits, _Alloc>
+ ::basic_stringstream(const _String& __str, ios_base::openmode __mode)
+ : basic_iostream<_CharT, _Traits>(0), _M_buf(__str, __mode)
+{
+ this->init(&_M_buf);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_stringstream<_CharT, _Traits, _Alloc>::~basic_stringstream()
+{}
+
+_STLP_END_NAMESPACE
+
+# undef __BSB_int_type__
+# undef __BSB_pos_type__
+
+# endif /* EXPOSE */
+
+#endif /* _STLP_SSTREAM_C */
diff --git a/src/STLport/stl/_sstream.h b/src/STLport/stl/_sstream.h
new file mode 100644
index 0000000..985f929
--- /dev/null
+++ b/src/STLport/stl/_sstream.h
@@ -0,0 +1,252 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+
+// This header defines classes basic_stringbuf, basic_istringstream,
+// basic_ostringstream, and basic_stringstream. These classes
+// represent streamsbufs and streams whose sources or destinations are
+// C++ strings.
+
+#ifndef _STLP_SSTREAM_H
+#define _STLP_SSTREAM_H
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+# include <stl/_streambuf.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ISTREAM_H
+# include <stl/_istream.h> // Includes <ostream>, <ios>, <iosfwd>
+#endif
+
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// This version of basic_stringbuf relies on the internal details of
+// basic_string. It relies on the fact that, in this implementation,
+// basic_string's iterators are pointers. It also assumes (as allowed
+// by the standard) that _CharT is a POD type.
+
+// We have a very small buffer for the put area, just so that we don't
+// have to use append() for every sputc. Conceptually, the buffer
+// immediately follows the end of the underlying string. We use this
+// buffer when appending to write-only streambufs, but we don't use it
+// for read-write streambufs.
+
+template <class _CharT, class _Traits, class _Alloc>
+class basic_stringbuf : public basic_streambuf<_CharT, _Traits>
+{
+public: // Typedefs.
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+
+ typedef basic_streambuf<_CharT, _Traits> _Base;
+ typedef basic_stringbuf<_CharT, _Traits, _Alloc> _Self;
+ typedef basic_string<_CharT, _Traits, _Alloc> _String;
+
+public: // Constructors, destructor.
+ explicit basic_stringbuf(ios_base::openmode __mode
+ = ios_base::in | ios_base::out);
+ explicit basic_stringbuf(const _String& __s, ios_base::openmode __mode
+ = ios_base::in | ios_base::out);
+ virtual ~basic_stringbuf();
+
+public: // Get or set the string.
+ _String str() const { _M_append_buffer(); return _M_str; }
+ void str(const _String& __s);
+
+protected: // Overridden virtual member functions.
+ virtual int_type underflow();
+ virtual int_type uflow();
+ virtual int_type pbackfail(int_type __c);
+ virtual int_type overflow(int_type __c);
+ int_type pbackfail() {return pbackfail(_Traits::eof());}
+ int_type overflow() {return overflow(_Traits::eof());}
+
+ virtual streamsize xsputn(const char_type* __s, streamsize __n);
+ virtual streamsize _M_xsputnc(char_type __c, streamsize __n);
+
+ virtual _Base* setbuf(_CharT* __buf, streamsize __n);
+ virtual pos_type seekoff(off_type __off, ios_base::seekdir __dir,
+ ios_base::openmode __mode
+ = ios_base::in | ios_base::out);
+ virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode
+ = ios_base::in | ios_base::out);
+
+private: // Helper functions.
+ // Append the internal buffer to the string if necessary.
+ void _M_append_buffer() const;
+ void _M_set_ptrs();
+
+private:
+ ios_base::openmode _M_mode;
+ mutable basic_string<_CharT, _Traits, _Alloc> _M_str;
+
+ enum _JustName { _S_BufSiz = 8 };
+ _CharT _M_Buf[ 8 /* _S_BufSiz */];
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_stringbuf<char, char_traits<char>, allocator<char> >;
+# if !defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_stringbuf<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+//----------------------------------------------------------------------
+// Class basic_istringstream, an input stream that uses a stringbuf.
+
+template <class _CharT, class _Traits, class _Alloc>
+class basic_istringstream : public basic_istream<_CharT, _Traits>
+{
+public: // Typedefs
+ typedef typename _Traits::char_type char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+
+ typedef basic_ios<_CharT, _Traits> _Basic_ios;
+ typedef basic_istream<_CharT, _Traits> _Base;
+ typedef basic_string<_CharT, _Traits, _Alloc> _String;
+ typedef basic_stringbuf<_CharT, _Traits, _Alloc> _Buf;
+
+public: // Constructors, destructor.
+ basic_istringstream(ios_base::openmode __mode = ios_base::in);
+ basic_istringstream(const _String& __str,
+ ios_base::openmode __mode = ios_base::in);
+ ~basic_istringstream();
+
+public: // Member functions
+
+ basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const
+ { return __CONST_CAST(_Buf*,&_M_buf); }
+
+ _String str() const { return _M_buf.str(); }
+ void str(const _String& __s) { _M_buf.str(__s); }
+
+private:
+ basic_stringbuf<_CharT, _Traits, _Alloc> _M_buf;
+};
+
+
+//----------------------------------------------------------------------
+// Class basic_ostringstream, an output stream that uses a stringbuf.
+
+template <class _CharT, class _Traits, class _Alloc>
+class basic_ostringstream : public basic_ostream<_CharT, _Traits>
+{
+public: // Typedefs
+ typedef typename _Traits::char_type char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+
+ typedef basic_ios<_CharT, _Traits> _Basic_ios;
+ typedef basic_ostream<_CharT, _Traits> _Base;
+ typedef basic_string<_CharT, _Traits, _Alloc> _String;
+ typedef basic_stringbuf<_CharT, _Traits, _Alloc> _Buf;
+
+public: // Constructors, destructor.
+ basic_ostringstream(ios_base::openmode __mode = ios_base::out);
+ basic_ostringstream(const _String& __str,
+ ios_base::openmode __mode = ios_base::out);
+ ~basic_ostringstream();
+
+public: // Member functions.
+
+ basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const
+ { return __CONST_CAST(_Buf*,&_M_buf); }
+
+ _String str() const { return _M_buf.str(); }
+ void str(const _String& __s) { _M_buf.str(__s); } // dwa 02/07/00 - BUG STOMPER DAVE
+
+
+private:
+ basic_stringbuf<_CharT, _Traits, _Alloc> _M_buf;
+};
+
+
+//----------------------------------------------------------------------
+// Class basic_stringstream, a bidirectional stream that uses a stringbuf.
+
+template <class _CharT, class _Traits, class _Alloc>
+class basic_stringstream : public basic_iostream<_CharT, _Traits>
+{
+public: // Typedefs
+ typedef typename _Traits::char_type char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+
+ typedef basic_ios<_CharT, _Traits> _Basic_ios;
+ typedef basic_iostream<_CharT, _Traits> _Base;
+ typedef basic_string<_CharT, _Traits, _Alloc> _String;
+ typedef basic_stringbuf<_CharT, _Traits, _Alloc> _Buf;
+
+ typedef ios_base::openmode openmode;
+
+public: // Constructors, destructor.
+ basic_stringstream(openmode __mod = ios_base::in | ios_base::out);
+ basic_stringstream(const _String& __str,
+ openmode __mod = ios_base::in | ios_base::out);
+ ~basic_stringstream();
+
+public: // Member functions.
+
+ basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const
+ { return __CONST_CAST(_Buf*,&_M_buf); }
+
+ _String str() const { return _M_buf.str(); }
+ void str(const _String& __s) { _M_buf.str(__s); }
+
+private:
+ basic_stringbuf<_CharT, _Traits, _Alloc> _M_buf;
+};
+
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_istringstream<char, char_traits<char>, allocator<char> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_ostringstream<char, char_traits<char>, allocator<char> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_stringstream<char, char_traits<char>, allocator<char> >;
+# if !defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_istringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_ostringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_stringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_sstream.c>
+# endif
+
+#endif /* _STLP_SSTREAM_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_stack.h b/src/STLport/stl/_stack.h
new file mode 100644
index 0000000..8bfca5b
--- /dev/null
+++ b/src/STLport/stl/_stack.h
@@ -0,0 +1,105 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_STACK_H
+#define _STLP_INTERNAL_STACK_H
+
+#ifndef _STLP_INTERNAL_DEQUE_H
+# include <stl/_deque.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if !defined ( _STLP_LIMITED_DEFAULT_TEMPLATES )
+template <class _Tp, class _Sequence = deque<_Tp> >
+# elif defined ( _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS )
+# define _STLP_STACK_ARGS _Tp
+template <class _Tp>
+# else
+template <class _Tp, class _Sequence>
+# endif
+class stack {
+
+# ifdef _STLP_STACK_ARGS
+ typedef deque<_Tp> _Sequence;
+# endif
+
+public:
+ typedef typename _Sequence::value_type value_type;
+ typedef typename _Sequence::size_type size_type;
+ typedef _Sequence container_type;
+
+ typedef typename _Sequence::reference reference;
+ typedef typename _Sequence::const_reference const_reference;
+protected:
+ _Sequence c;
+public:
+ stack() : c() {}
+ explicit stack(const _Sequence& __s) : c(__s) {}
+
+ bool empty() const { return c.empty(); }
+ size_type size() const { return c.size(); }
+ reference top() { return c.back(); }
+ const_reference top() const { return c.back(); }
+ void push(const value_type& __x) { c.push_back(__x); }
+ void pop() { c.pop_back(); }
+ const _Sequence& _Get_c() const { return c; }
+};
+
+# ifndef _STLP_STACK_ARGS
+# define _STLP_STACK_ARGS _Tp, _Sequence
+# define _STLP_STACK_HEADER_ARGS class _Tp, class _Sequence
+# else
+# define _STLP_STACK_HEADER_ARGS class _Tp
+# endif
+
+template < _STLP_STACK_HEADER_ARGS >
+inline bool _STLP_CALL operator==(const stack< _STLP_STACK_ARGS >& __x, const stack< _STLP_STACK_ARGS >& __y)
+{
+ return __x._Get_c() == __y._Get_c();
+}
+
+template < _STLP_STACK_HEADER_ARGS >
+inline bool _STLP_CALL operator<(const stack< _STLP_STACK_ARGS >& __x, const stack< _STLP_STACK_ARGS >& __y)
+{
+ return __x._Get_c() < __y._Get_c();
+}
+
+_STLP_RELOPS_OPERATORS(template < _STLP_STACK_HEADER_ARGS >, stack< _STLP_STACK_ARGS >)
+
+_STLP_END_NAMESPACE
+
+# undef _STLP_STACK_ARGS
+# undef _STLP_STACK_HEADER_ARGS
+
+#endif /* _STLP_INTERNAL_STACK_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_stdio_file.h b/src/STLport/stl/_stdio_file.h
new file mode 100644
index 0000000..1bd2e72
--- /dev/null
+++ b/src/STLport/stl/_stdio_file.h
@@ -0,0 +1,758 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_STDIO_FILE_H
+#define _STLP_STDIO_FILE_H
+
+// This file provides a low-level interface between the internal
+// representation of struct FILE, from the C stdio library, and
+// the C++ I/O library. The C++ I/O library views a FILE object as
+// a collection of three pointers: the beginning of the buffer, the
+// current read/write position, and the end of the buffer.
+
+// The interface:
+// - char* _FILE_[IO]_begin(const FILE *__f);
+// Returns a pointer to the beginning of the buffer.
+// - char* _FILE_[IO]_next(const FILE *__f);
+// Returns the current read/write position within the buffer.
+// - char* _FILE_[IO]_end(const FILE *__f);
+// Returns a pointer immediately past the end of the buffer.
+// - char* _FILE_[IO]_avail(const FILE *__f);
+// Returns the number of characters remaining in the buffer, i.e.
+// _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
+// - char& _FILE_[IO]_preincr(FILE *__f)
+// Increments the current read/write position by 1, returning the
+// character at the old position.
+// - char& _FILE_[IO]_postincr(FILE *__f)
+// Increments the current read/write position by 1, returning the
+// character at the old position.
+// - char& _FILE_[IO]_predecr(FILE *__f)
+// Decrements the current read/write position by 1, returning the
+// character at the old position.
+// - char& _FILE_[IO]_postdecr(FILE *__f)
+// Decrements the current read/write position by 1, returning the
+// character at the old position.
+// - void _FILE_[IO]_bump(FILE *__f, int __n)
+// Increments the current read/write position by __n.
+// - void _FILE_[IO]_set(FILE *__f, char* __begin, char* __next, char* __end);
+// Sets the beginning of the bufer to __begin, the current read/write
+// position to __next, and the buffer's past-the-end pointer to __end.
+// If any of those pointers is null, then all of them must be null.
+
+// Each function comes in two versions, one for a FILE used as an input
+// buffer and one for a FILE used as an output buffer. In some stdio
+// implementations the two functions are identical, but in others they are
+// not.
+
+#ifndef _STLP_CSTDIO
+# include <cstdio>
+#endif
+#ifndef _STLP_CSTDDEF
+# include <cstddef>
+#endif
+
+#if defined(__MSL__)
+# include <unix.h> // get the definition of fileno
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+#if !defined(_STLP_WINCE)
+//----------------------------------------------------------------------
+// Implementation for the IRIX C library.
+// Solaris interface looks to be identical.
+#if !defined(_STLP_USE_GLIBC) && \
+ ( defined(__sgi) || \
+ ( defined(__sun) && ! defined (_LP64) ) || \
+ defined (__osf__) || defined(__DECCXX) || \
+ defined (_STLP_MSVC) || defined (__ICL) || defined (__MINGW32__) || defined(__DJGPP) || defined (_AIX) || defined (_CRAY))
+
+#if defined ( _MSC_VER ) || defined (__ICL) || defined (__MINGW32__) || defined(__DJGPP)
+typedef char* _File_ptr_type;
+#else
+typedef unsigned char* _File_ptr_type;
+#endif
+
+inline int _FILE_fd(const FILE *__f) { return __f->_file; }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_base; }
+inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_ptr; }
+inline char* _FILE_I_end(const FILE *__f)
+ { return (char*) __f->_ptr + __f->_cnt; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+ { --__f->_cnt; return *(char*) (++__f->_ptr); }
+inline char& _FILE_I_postincr(FILE *__f)
+ { --__f->_cnt; return *(char*) (__f->_ptr++); }
+inline char& _FILE_I_predecr(FILE *__f)
+ { ++__f->_cnt; return *(char*) (--__f->_ptr); }
+inline char& _FILE_I_postdecr(FILE *__f)
+ { ++__f->_cnt; return *(char*) (__f->_ptr--); }
+inline void _FILE_I_bump(FILE *__f, int __n)
+ { __f->_ptr += __n; __f->_cnt -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
+ __f->_base = (_File_ptr_type) __begin;
+ __f->_ptr = (_File_ptr_type) __next;
+ __f->_cnt = __end - __next;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL 1
+
+#elif defined(__EMX__)
+
+inline int _FILE_fd(const FILE* __f) { return __f->_handle; }
+inline char* _FILE_I_begin(const FILE* __f) { return (char*) __f->_buffer; }
+inline char* _FILE_I_next(const FILE* __f) { return (char*) __f->_ptr; }
+inline char* _FILE_I_end(const FILE* __f) { return (char *) __f->_ptr + __f->_rcount; }
+inline ptrdiff_t _FILE_I_avail(const FILE* __f) { return __f->_rcount; }
+inline char& _FILE_I_preincr(FILE* __f) { --__f->_rcount; return *(char*) (++__f->_ptr); }
+inline char& _FILE_I_postincr(FILE* __f) { --__f->_rcount; return *(char*) (__f->_ptr++); }
+inline char& _FILE_I_predecr(FILE* __f) { ++__f->_rcount; return *(char*) (--__f->_ptr); }
+inline char& _FILE_I_postdecr(FILE* __f) { ++__f->_rcount; return *(char*) (__f->_ptr--); }
+inline void _FILE_I_bump(FILE* __f, int __n) { __f->_ptr += __n; __f->_rcount -= __n; }
+inline void _FILE_I_set(FILE* __f, char* __begin, char* __next, char* __end) {
+ __f->_buffer = __begin;
+ __f->_ptr = __next;
+ __f->_rcount = __end - __next;
+}
+
+inline char* _FILE_O_begin(const FILE* __f) { return (char*) __f->_buffer; }
+inline char* _FILE_O_next(const FILE* __f) { return (char*) __f->_ptr; }
+inline char* _FILE_O_end(const FILE* __f) { return (char*) __f->_ptr + __f->_wcount; }
+inline ptrdiff_t _FILE_O_avail(const FILE* __f) { return __f->_wcount; }
+inline char& _FILE_O_preincr(FILE* __f) { --__f->_wcount; return *(char*) (++__f->_ptr); }
+inline char& _FILE_O_postincr(FILE* __f) { --__f->_wcount; return *(char*) (__f->_ptr++); }
+inline char& _FILE_O_predecr(FILE* __f) { ++__f->_wcount; return *(char*) (--__f->_ptr); }
+inline char& _FILE_O_postdecr(FILE* __f) { ++__f->_wcount; return *(char*) (__f->_ptr--); }
+inline void _FILE_O_bump(FILE* __f, int __n) { __f->_ptr += __n; __f->_wcount -= __n; }
+inline void _FILE_O_set(FILE* __f, char* __begin, char* __next, char* __end) {
+ __f->_buffer = __begin;
+ __f->_ptr = __next;
+ __f->_wcount = __end - __next;
+}
+
+
+# undef _STLP_FILE_I_O_IDENTICAL
+
+# elif defined(_STLP_SCO_OPENSERVER) || defined(__NCR_SVR)
+
+typedef unsigned char* _File_ptr_type;
+
+inline int _FILE_fd(const FILE *__f) { return __f->__file; }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->__base; }
+inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->__ptr; }
+inline char* _FILE_I_end(const FILE *__f)
+ { return (char*) __f->__ptr + __f->__cnt; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->__cnt; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+ { --__f->__cnt; return *(char*) (++__f->__ptr); }
+inline char& _FILE_I_postincr(FILE *__f)
+ { --__f->__cnt; return *(char*) (__f->__ptr++); }
+inline char& _FILE_I_predecr(FILE *__f)
+ { ++__f->__cnt; return *(char*) (--__f->__ptr); }
+inline char& _FILE_I_postdecr(FILE *__f)
+ { ++__f->__cnt; return *(char*) (__f->__ptr--); }
+inline void _FILE_I_bump(FILE *__f, int __n)
+ { __f->__ptr += __n; __f->__cnt -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
+ __f->__base = (_File_ptr_type) __begin;
+ __f->__ptr = (_File_ptr_type) __next;
+ __f->__cnt = __end - __next;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL 1
+
+# elif defined(__sun) && defined( _LP64)
+
+typedef long _File_ptr_type;
+
+inline int _FILE_fd(const FILE *__f) { return (int) __f->__pad[2]; }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*)
+__f->__pad[1]; }
+inline char* _FILE_I_next(const FILE *__f) { return (char*)
+__f->__pad[0]; }
+inline char* _FILE_I_end(const FILE *__f)
+{ return (char*) __f->__pad[0] + __f->__pad[3]; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->__pad[3]; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+{ --__f->__pad[3]; return *(char*) (++__f->__pad[0]); }
+inline char& _FILE_I_postincr(FILE *__f)
+{ --__f->__pad[3]; return *(char*) (__f->__pad[0]++); }
+inline char& _FILE_I_predecr(FILE *__f)
+{ ++__f->__pad[3]; return *(char*) (--__f->__pad[0]); }
+inline char& _FILE_I_postdecr(FILE *__f)
+{ ++__f->__pad[3]; return *(char*) (__f->__pad[0]--); }
+inline void _FILE_I_bump(FILE *__f, long __n)
+{ __f->__pad[0] += __n; __f->__pad[3] -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char*
+__end) {
+__f->__pad[1] = (_File_ptr_type) __begin;
+__f->__pad[0] = (_File_ptr_type) __next;
+__f->__pad[3] = __end - __next;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined (__CYGWIN__) || defined(__FreeBSD__) || defined(__NetBSD__) \
+ || defined(__amigaos__) || ( defined(__GNUC__) && defined(__APPLE__) )
+
+inline int _FILE_fd(const FILE *__f) { return __f->_file; }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*)
+ __f->_bf._base; }
+inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_p; }
+inline char* _FILE_I_end(const FILE *__f)
+{ return (char*) __f->_p + __f->_r; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_r; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+{ --__f->_r; --__f->_bf._size; return *(char*) (++__f->_p); }
+inline char& _FILE_I_postincr(FILE *__f)
+{ --__f->_r; --__f->_bf._size; return *(char*) (__f->_p++); }
+inline char& _FILE_I_predecr(FILE *__f)
+{ ++__f->_r; ++ __f->_bf._size; return *(char*) (--__f->_p); }
+inline char& _FILE_I_postdecr(FILE *__f)
+{ ++__f->_r; ++__f->_bf._size; return *(char*) (__f->_p--); }
+inline void _FILE_I_bump(FILE *__f, int __n)
+{ __f->_p += __n; __f->_bf._size+=__n; __f->_r -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char*
+ __end) {
+ __f->_bf._base = (unsigned char*) __begin;
+ __f->_p = (unsigned char*) __next;
+ __f->_r = __f->_bf._size = __end - __next;
+}
+inline char* _FILE_O_begin(const FILE *__f) { return (char*)
+ __f->_bf._base; }
+inline char* _FILE_O_next(const FILE *__f) { return (char*) __f->_p; }
+inline char* _FILE_O_end(const FILE *__f)
+{ return (char*) __f->_p + __f->_w; }
+
+inline ptrdiff_t _FILE_O_avail(const FILE *__f) { return __f->_w; }
+
+inline char& _FILE_O_preincr(FILE *__f)
+{ --__f->_w; --__f->_bf._size; return *(char*) (++__f->_p); }
+inline char& _FILE_O_postincr(FILE *__f)
+{ --__f->_w; --__f->_bf._size; return *(char*) (__f->_p++); }
+inline char& _FILE_O_predecr(FILE *__f)
+{ ++__f->_w; ++__f->_bf._size; return *(char*) (--__f->_p); }
+inline char& _FILE_O_postdecr(FILE *__f)
+{ ++__f->_w; ++__f->_bf._size; return *(char*) (__f->_p--); }
+inline void _FILE_O_bump(FILE *__f, int __n)
+{ __f->_p += __n; __f->_bf._size+=__n; __f->_w -= __n; }
+
+inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char*
+ __end) {
+ __f->_bf._base = (unsigned char*) __begin;
+ __f->_p = (unsigned char*) __next;
+ __f->_w = __f->_bf._size = __end - __next;
+}
+
+# undef _STLP_FILE_I_O_IDENTICAL
+
+#elif defined(_STLP_USE_GLIBC)
+
+inline int _FILE_fd(const FILE *__f) { return __f->_fileno; }
+inline char* _FILE_I_begin(const FILE *__f) { return __f->_IO_read_base; }
+inline char* _FILE_I_next(const FILE *__f) { return __f->_IO_read_ptr; }
+inline char* _FILE_I_end(const FILE *__f) { return __f->_IO_read_end; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f)
+ { return __f->_IO_read_end - __f->_IO_read_ptr; }
+
+inline char& _FILE_I_preincr(FILE *__f) { return *++__f->_IO_read_ptr; }
+inline char& _FILE_I_postincr(FILE *__f) { return *__f->_IO_read_ptr++; }
+inline char& _FILE_I_predecr(FILE *__f) { return *--__f->_IO_read_ptr; }
+inline char& _FILE_I_postdecr(FILE *__f) { return *__f->_IO_read_ptr--; }
+inline void _FILE_I_bump(FILE *__f, int __n) { __f->_IO_read_ptr += __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
+ __f->_IO_read_base = __begin;
+ __f->_IO_read_ptr = __next;
+ __f->_IO_read_end = __end;
+}
+
+inline char* _FILE_O_begin(const FILE *__f) { return __f->_IO_write_base; }
+inline char* _FILE_O_next(const FILE *__f) { return __f->_IO_write_ptr; }
+inline char* _FILE_O_end(const FILE *__f) { return __f->_IO_write_end; }
+
+inline ptrdiff_t _FILE_O_avail(const FILE *__f)
+ { return __f->_IO_write_end - __f->_IO_write_ptr; }
+
+inline char& _FILE_O_preincr(FILE *__f) { return *++__f->_IO_write_ptr; }
+inline char& _FILE_O_postincr(FILE *__f) { return *__f->_IO_write_ptr++; }
+inline char& _FILE_O_predecr(FILE *__f) { return *--__f->_IO_write_ptr; }
+inline char& _FILE_O_postdecr(FILE *__f) { return *__f->_IO_write_ptr--; }
+inline void _FILE_O_bump(FILE *__f, int __n) { __f->_IO_write_ptr += __n; }
+
+inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char* __end) {
+ __f->_IO_write_base = __begin;
+ __f->_IO_write_ptr = __next;
+ __f->_IO_write_end = __end;
+
+}
+
+#elif defined(__hpux) /* && defined(__hppa) && defined(__HP_aCC)) */
+
+#ifndef _INCLUDE_HPUX_SOURCE
+extern "C" unsigned char *__bufendtab[];
+# undef _bufend
+# define _bufend(__p) \
+ (*(((__p)->__flag & _IOEXT) ? &(((_FILEX *)(__p))->__bufendp) \
+ : &(__bufendtab[(__p) - __iob])))
+
+# define _bufsiz(__p) (_bufend(__p) - (__p)->__base)
+#endif /* _INCLUDE_HPUX_SOURCE */
+
+#if defined(_STLP_HPACC_BROKEN_BUFEND)
+# undef _bufend
+# define _bufend(__p) \
+ (*(((__p)->__flag & _IOEXT) ? &((__REINTERPRET_CAST(_FILEX*,(__p)))->__bufendp) \
+ : &(__bufendtab[__REINTERPRET_CAST(FILE*,(__p)) - __iob])))
+#endif
+
+inline int _FILE_fd(const FILE *__f) { return fileno(__CONST_CAST(FILE *,__f)); }
+inline char* _FILE_I_begin(const FILE *__f) { return (__REINTERPRET_CAST(char*, __f->__base)); }
+inline char* _FILE_I_next(const FILE *__f) { return (__REINTERPRET_CAST(char*, __f->__ptr)); }
+inline char* _FILE_I_end(const FILE *__f) { return (__REINTERPRET_CAST(char*, __f->__ptr +__f->__cnt)); }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->__cnt; }
+
+inline char& _FILE_I_preincr(FILE *__f) { --__f->__cnt; return *__REINTERPRET_CAST(char*, ++__f->__ptr); }
+inline char& _FILE_I_postincr(FILE *__f) { --__f->__cnt; return *__REINTERPRET_CAST(char*, __f->__ptr++); }
+inline char& _FILE_I_predecr(FILE *__f) { ++__f->__cnt; return *__REINTERPRET_CAST(char*,--__f->__ptr); }
+inline char& _FILE_I_postdecr(FILE *__f) { ++__f->__cnt; return *__REINTERPRET_CAST(char*,__f->__ptr--); }
+inline void _FILE_I_bump(FILE *__f, int __n) { __f->__cnt -= __n; __f->__ptr += __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
+# if defined(__hpux)
+ if( (unsigned long) (__f - &__iob[0]) > _NFILE)
+ __f->__flag |= _IOEXT; // used by stdio's _bufend macro and goodness knows what else...
+# endif
+ __f->__cnt = __end - __next;
+ __f->__base = __REINTERPRET_CAST(unsigned char*, __begin);
+ __f->__ptr = __REINTERPRET_CAST(unsigned char*, __next);
+ _bufend(__f) = __REINTERPRET_CAST(unsigned char*, __end);
+}
+
+// For HPUX stdio, input and output FILE manipulation is identical.
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined (__BORLANDC__)
+
+typedef unsigned char* _File_ptr_type;
+
+inline int _FILE_fd(const FILE *__f) { return __f->fd; }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->buffer;
+}
+inline char* _FILE_I_next(const FILE *__f)
+{ return (char*)__f->curp; }
+inline char* _FILE_I_end(const FILE *__f)
+{ return (char*) __f->curp + __f->level; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->level; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+{ --__f->level; return *(char*) (++__f->curp); }
+inline char& _FILE_I_postincr(FILE *__f)
+{ --__f->level; return *(char*) (__f->curp++); }
+inline char& _FILE_I_predecr(FILE *__f)
+{ ++__f->level; return *(char*) (--__f->curp); }
+inline char& _FILE_I_postdecr(FILE *__f)
+{ ++__f->level; return *(char*) (__f->curp--); }
+inline void _FILE_I_bump(FILE *__f, int __n)
+{ __f->curp += __n; __f->level -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char*
+ __end) {
+ __f->buffer = (_File_ptr_type) __begin;
+ __f->curp = (_File_ptr_type) __next;
+ __f->level = __end - __next;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined( __MWERKS__ )
+
+// using MWERKS-specific defines here to detect other OS targets
+// dwa: I'm not sure they provide fileno for all OS's, but this should
+// work for Win32 and WinCE
+# if __dest_os == __mac_os
+inline int _FILE_fd(const FILE *__f) { return ::fileno(__CONST_CAST(FILE*, __f)); }
+# else
+inline int _FILE_fd(const FILE *__f) { return ::_fileno(__CONST_CAST(FILE*, __f)); }
+# endif
+
+// Returns a pointer to the beginning of the buffer.
+inline char* _FILE_I_begin(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->buffer); }
+// Returns the current read/write position within the buffer.
+inline char* _FILE_I_next(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->buffer_ptr); }
+
+// Returns a pointer immediately past the end of the buffer.
+inline char* _FILE_I_end(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->buffer_ptr + __f->buffer_len); }
+
+// Returns the number of characters remaining in the buffer, i.e.
+// _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->buffer_len; }
+
+// Increments the current read/write position by 1, returning the
+// character at the old position.
+inline char& _FILE_I_preincr(FILE *__f)
+ { --__f->buffer_len; return *(char*) (++__f->buffer_ptr); }
+inline char& _FILE_I_postincr(FILE *__f)
+ { --__f->buffer_len; return *(char*) (__f->buffer_ptr++); }
+inline char& _FILE_I_predecr(FILE *__f)
+ { ++__f->buffer_len; return *(char*) (--__f->buffer_ptr); }
+inline char& _FILE_I_postdecr(FILE *__f)
+ { ++__f->buffer_len; return *(char*) (__f->buffer_ptr--); }
+inline void _FILE_I_bump(FILE *__f, int __n)
+ { __f->buffer_ptr += __n; __f->buffer_len -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
+ __f->buffer = __REINTERPRET_CAST(unsigned char*, __begin);
+ __f->buffer_ptr = __REINTERPRET_CAST(unsigned char*, __next);
+ __f->buffer_len = __end - __next;
+ __f->buffer_size = __end - __begin;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined(__DMC__)
+
+inline int _FILE_fd(const FILE *__f) { return __f->_file; }
+
+// Returns a pointer to the beginning of the buffer.
+inline char* _FILE_I_begin(const FILE *__f) { return __f->_base; }
+
+// Returns the current read/write position within the buffer.
+inline char* _FILE_I_next(const FILE *__f) { return __f->_ptr; }
+
+// Returns a pointer immediately past the end of the buffer.
+inline char* _FILE_I_end(const FILE *__f) { return __f->_ptr + __f->_cnt; }
+
+// Returns the number of characters remaining in the buffer, i.e.
+// _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
+
+// Increments the current read/write position by 1, returning the
+// character at the NEW position.
+inline char& _FILE_I_preincr(FILE *__f) { --__f->_cnt; return *(++__f->_ptr); }
+
+
+// Increments the current read/write position by 1, returning the
+// character at the old position.
+inline char& _FILE_I_postincr(FILE *__f) { --__f->_cnt; return *(__f->_ptr++); }
+
+// Decrements the current read/write position by 1, returning the
+// character at the NEW position.
+inline char& _FILE_I_predecr(FILE *__f) { ++__f->_cnt; return *(--__f->_ptr); }
+
+// Decrements the current read/write position by 1, returning the
+// character at the old position.
+inline char& _FILE_I_postdecr(FILE *__f) { ++__f->_cnt; return *(__f->_ptr--); }
+
+// Increments the current read/write position by __n.
+inline void _FILE_I_bump(FILE *__f, int __n) { __f->_cnt -= __n; __f->_ptr += __n; }
+
+// Sets the beginning of the bufer to __begin, the current read/write
+// position to __next, and the buffer's past-the-end pointer to __end.
+// If any of those pointers is null, then all of them must be null.
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
+{
+ __f->_base = __begin;
+ __f->_ptr = __next;
+ __f->_cnt = __end - __next;
+ __f->_bufsiz = __end - __begin;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined(__MRC__) || defined(__SC__) //*TY 02/24/2000 - added support for MPW
+
+inline int _FILE_fd(const FILE *__f) { return __f->_file; }
+
+// Returns a pointer to the beginning of the buffer.
+inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_base; }
+
+// Returns the current read/write position within the buffer.
+inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_ptr; }
+
+// Returns a pointer immediately past the end of the buffer.
+inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->_end; }
+
+// Returns the number of characters remaining in the buffer, i.e.
+// _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
+
+// Increments the current read/write position by 1, returning the
+// character at the NEW position.
+inline char& _FILE_I_preincr(FILE *__f) { --__f->_cnt; return*(char*) (++__f->_ptr); }
+
+
+// Increments the current read/write position by 1, returning the
+// character at the old position.
+inline char& _FILE_I_postincr(FILE *__f) { --__f->_cnt; return*(char*) (__f->_ptr++); }
+
+// Decrements the current read/write position by 1, returning the
+// character at the NEW position.
+inline char& _FILE_I_predecr(FILE *__f) { ++__f->_cnt; return*(char*) (--__f->_ptr); }
+
+// Decrements the current read/write position by 1, returning the
+// character at the old position.
+inline char& _FILE_I_postdecr(FILE *__f) { ++__f->_cnt; return*(char*) (__f->_ptr--); }
+
+// Increments the current read/write position by __n.
+inline void _FILE_I_bump(FILE *__f, int __n) { __f->_cnt -= __n; __f->_ptr += __n; }
+
+// Sets the beginning of the bufer to __begin, the current read/write
+// position to __next, and the buffer's past-the-end pointer to __end.
+// If any of those pointers is null, then all of them must be null.
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
+{
+ __f->_base = (unsigned char*)__begin;
+ __f->_ptr = (unsigned char*)__next;
+ __f->_end = (unsigned char*)__end;
+ __f->_cnt = __end - __next;
+ __f->_size = __end - __begin;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined (__MVS__)
+
+typedef unsigned char* _File_ptr_type;
+
+inline int _FILE_fd(const FILE *__f) { return fileno(__CONST_CAST(FILE
+ *,__f)); }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*)
+ __f->__fp->__bufPtr; }
+inline char* _FILE_I_next(const FILE *__f) { return (char*)
+ __f->__fp->__bufPtr; }
+inline char* _FILE_I_end(const FILE *__f)
+{ return (char*) __f->__fp->__bufPtr + __f->__fp->__countIn; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return
+ __f->__fp->__countIn; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+{ --__f->__fp->__countIn; return *(char*) (++__f->__fp->__bufPtr); }
+inline char& _FILE_I_postincr(FILE *__f)
+{ --__f->__fp->__countIn; return *(char*) (__f->__fp->__bufPtr++); }
+inline char& _FILE_I_predecr(FILE *__f)
+{ ++__f->__fp->__countIn; return *(char*) (--__f->__fp->__bufPtr); }
+inline char& _FILE_I_postdecr(FILE *__f)
+{ ++__f->__fp->__countIn; return *(char*) (__f->__fp->__bufPtr--); }
+inline void _FILE_I_bump(FILE *__f, int __n)
+{ __f->__fp->__bufPtr += __n; __f->__fp->__countIn -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char*
+ __end) {
+ // __f->_base = (_File_ptr_type) __begin;
+ if(__f->__fp) {
+ __f->__fp->__bufPtr = (_File_ptr_type) __next;
+ __f->__fp->__countIn = __end - __next;
+ }
+}
+
+inline char* _FILE_O_begin(const FILE *__f) { return (char*)__f->__fp->__bufPtr;}
+inline char* _FILE_O_next(const FILE *__f) { return (char*) __f->__fp->__bufPtr;}
+inline char* _FILE_O_end(const FILE *__f) { return (char*) __f->__fp->__bufPtr + __f->__fp->__countOut; }
+inline ptrdiff_t _FILE_O_avail(const FILE *__f) { return __f->__fp->__countOut; }
+
+inline char& _FILE_O_preincr(FILE *__f)
+{ --__f->__fp->__countOut; return *(char*) (++__f->__fp->__bufPtr); }
+inline char& _FILE_O_postincr(FILE *__f)
+{ --__f->__fp->__countOut; return *(char*) (__f->__fp->__bufPtr++); }
+inline char& _FILE_O_predecr(FILE *__f)
+{ ++__f->__fp->__countOut; return *(char*) (--__f->__fp->__bufPtr); }
+inline char& _FILE_O_postdecr(FILE *__f)
+{ ++__f->__fp->__countOut; return *(char*) (__f->__fp->__bufPtr--); }
+inline void _FILE_O_bump(FILE *__f, int __n)
+{ __f->__fp->__bufPtr += __n; __f->__fp->__countOut -= __n; }
+
+inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char*
+ __end) {
+ // __f->_base = (_File_ptr_type) __begin;
+ if(__f->__fp) {
+ __f->__fp->__bufPtr = (_File_ptr_type) __next;
+ __f->__fp->__countOut = __end - __next;
+ }
+}
+
+#elif defined(__QNXNTO__)
+
+inline int _FILE_fd(const FILE *__f) { return __f->_handle;
+}
+inline char* _FILE_I_begin(const FILE *__f) { return
+ (char*) __f->_base; }
+inline char* _FILE_I_next(const FILE *__f) { return
+ (char*) __f->_ptr; }
+inline char* _FILE_I_end(const FILE *__f)
+{ return (char*) __f->_ptr + __f->_cnt; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return
+ __f->_cnt; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+{ --__f->_cnt; return *(char*) (++__f->_ptr); }
+inline char& _FILE_I_postincr(FILE *__f)
+{ --__f->_cnt; return *(char*) (__f->_ptr++); }
+inline char& _FILE_I_predecr(FILE *__f)
+{ ++__f->_cnt; return *(char*) (--__f->_ptr); }
+inline char& _FILE_I_postdecr(FILE *__f)
+{ ++__f->_cnt; return *(char*) (__f->_ptr--); }
+inline void _FILE_I_bump(FILE *__f, int __n)
+{ __f->_ptr += __n; __f->_cnt -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char*
+ __next, char*
+ __end) {
+ __f->_base = (unsigned char*) __begin;
+ __f->_ptr = (unsigned char*) __next;
+ __f->_cnt = __end - __next;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined(__WATCOMC__) // Nikolaev
+
+inline int _FILE_fd (const FILE *__f) { return __f->_handle;}
+inline char* _FILE_I_begin (const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_link); }
+inline char* _FILE_I_next (const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_ptr); }
+inline char* _FILE_I_end (const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_ptr + __f->_cnt); }
+inline ptrdiff_t _FILE_I_avail (const FILE *__f) { return __f->_cnt; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+{
+ --__f->_cnt;
+ return *__REINTERPRET_CAST(char*, ++__f->_ptr);
+}
+
+inline char& _FILE_I_postincr(FILE *__f)
+{
+ --__f->_cnt;
+ return *__REINTERPRET_CAST(char*, __f->_ptr++);
+}
+
+inline char& _FILE_I_predecr(FILE *__f)
+{
+ ++__f->_cnt;
+ return *__REINTERPRET_CAST(char*, --__f->_ptr);
+}
+
+inline char& _FILE_I_postdecr(FILE *__f)
+{
+ ++__f->_cnt;
+ return *__REINTERPRET_CAST(char*, __f->_ptr--);
+}
+
+inline void _FILE_I_bump(FILE *__f, int __n)
+{
+ __f->_ptr += __n;
+ __f->_cnt -= __n;
+}
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
+{
+ __f->_link = __REINTERPRET_CAST(__stream_link*, __begin);
+ __f->_ptr = __REINTERPRET_CAST(unsigned char*, __next);
+ __f->_cnt = __end - __next;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined (__Lynx__)
+
+// the prototypes are taken from LynxOS patch for STLport 4.0
+inline int _FILE_fd(const FILE *__f) { return __f->_fd; }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_base; }
+inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_ptr; }
+inline char* _FILE_I_end(const FILE *__f)
+ { return (char*) __f->_ptr + __f->_cnt; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+ { --__f->_cnt; return *(char*) (++__f->_ptr); }
+inline char& _FILE_I_postincr(FILE *__f)
+ { --__f->_cnt; return *(char*) (__f->_ptr++); }
+inline char& _FILE_I_predecr(FILE *__f)
+ { ++__f->_cnt; return *(char*) (--__f->_ptr); }
+inline char& _FILE_I_postdecr(FILE *__f)
+ { ++__f->_cnt; return *(char*) (__f->_ptr--); }
+inline void _FILE_I_bump(FILE *__f, int __n)
+ { __f->_ptr += __n; __f->_cnt -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
+ __f->_base = __begin;
+ __f->_ptr = __next;
+ __f->_cnt = __end - __next;
+}
+# define _STLP_FILE_I_O_IDENTICAL
+
+#else /* A C library that we don't have an implementation for. */
+
+# error The C++ I/O library is not configured for this compiler
+
+#endif
+
+
+// For most stdio's , input and output FILE manipulation is identical.
+# ifdef _STLP_FILE_I_O_IDENTICAL
+inline char* _FILE_O_begin(const FILE *__f) { return _FILE_I_begin(__f); }
+inline char* _FILE_O_next(const FILE *__f) { return _FILE_I_next(__f); }
+inline char* _FILE_O_end(const FILE *__f) { return _FILE_I_end(__f); }
+
+inline ptrdiff_t _FILE_O_avail(const FILE *__f) { return _FILE_I_avail(__f); }
+
+inline char& _FILE_O_preincr(FILE *__f) { return _FILE_I_preincr(__f); }
+inline char& _FILE_O_postincr(FILE *__f) { return _FILE_I_postincr(__f); }
+inline char& _FILE_O_predecr(FILE *__f) { return _FILE_I_predecr(__f); }
+inline char& _FILE_O_postdecr(FILE *__f) { return _FILE_I_postdecr(__f); }
+
+inline void _FILE_O_bump(FILE *__f, int __n) { _FILE_I_bump(__f, __n); }
+inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char* __end)
+ { _FILE_I_set(__f, __begin, __next, __end); }
+# endif
+
+#else
+inline int _FILE_fd(const FILE *__f) { return (int)::_fileno(__CONST_CAST(FILE *, __f)); }
+#endif /* _STLP_WINCE */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_STDIO_FILE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_stream_iterator.h b/src/STLport/stl/_stream_iterator.h
new file mode 100644
index 0000000..2979e3a
--- /dev/null
+++ b/src/STLport/stl/_stream_iterator.h
@@ -0,0 +1,343 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#if !defined (_STLP_INTERNAL_STREAM_ITERATOR_H) && ! defined (_STLP_USE_NO_IOSTREAMS)
+#define _STLP_INTERNAL_STREAM_ITERATOR_H
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+// streambuf_iterators predeclarations must appear first
+#ifndef _STLP_IOSFWD
+# include <iosfwd>
+#endif
+
+#ifndef _STLP_INTERNAL_ALGOBASE_H
+#include <stl/_algobase.h>
+#endif
+
+#if defined (_STLP_OWN_IOSTREAMS)
+
+#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
+# include <stl/_ostreambuf_iterator.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
+# include <stl/_istreambuf_iterator.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ISTREAM_H
+# include <stl/_istream.h>
+#endif
+#endif /* _STLP_OWN_IOSTREAMS */
+
+// istream_iterator and ostream_iterator look very different if we're
+// using new, templatized iostreams than if we're using the old cfront
+// version.
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+
+_STLP_BEGIN_NAMESPACE
+
+# ifndef _STLP_LIMITED_DEFAULT_TEMPLATES
+template <class _Tp,
+ class _CharT = _STLP_DEFAULTCHAR, class _Traits = char_traits<_CharT>,
+ class _Dist = ptrdiff_t>
+# define __ISI_TMPL_HEADER_ARGUMENTS class _Tp, class _CharT, class _Traits, class _Dist
+# define __ISI_TMPL_ARGUMENTS _Tp, _CharT, _Traits, _Dist
+class istream_iterator : public iterator<input_iterator_tag, _Tp , _Dist,
+ const _Tp*, const _Tp& > {
+# else
+
+# if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && ! defined (_STLP_DEFAULT_TYPE_PARAM)
+# define __ISI_TMPL_HEADER_ARGUMENTS class _Tp
+# define __ISI_TMPL_ARGUMENTS _Tp
+template <class _Tp>
+class istream_iterator : public iterator<input_iterator_tag, _Tp , ptrdiff_t,
+ const _Tp*, const _Tp& > {
+# else
+# define __ISI_TMPL_HEADER_ARGUMENTS class _Tp, class _Dist
+# define __ISI_TMPL_ARGUMENTS _Tp, _Dist
+template <class _Tp,__DFL_TYPE_PARAM(_Dist, ptrdiff_t)>
+class istream_iterator : public iterator<input_iterator_tag, _Tp, _Dist ,
+ const _Tp*, const _Tp& > {
+# endif /* _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS */
+
+# endif /* _STLP_LIMITED_DEFAULT_TEMPLATES */
+
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+ typedef char _CharT;
+ typedef char_traits<char> _Traits;
+# if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && ! defined (_STLP_DEFAULT_TYPE_PARAM)
+ typedef ptrdiff_t _Dist;
+# endif
+# endif
+
+ typedef istream_iterator< __ISI_TMPL_ARGUMENTS > _Self;
+public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef basic_istream<_CharT, _Traits> istream_type;
+
+ typedef input_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef _Dist difference_type;
+ typedef const _Tp* pointer;
+ typedef const _Tp& reference;
+
+ istream_iterator() : _M_stream(0), _M_ok(false) {}
+ istream_iterator(istream_type& __s) : _M_stream(&__s) { _M_read(); }
+
+ reference operator*() const { return _M_value; }
+
+ _STLP_DEFINE_ARROW_OPERATOR
+
+ _Self& operator++() {
+ _M_read();
+ return *this;
+ }
+ _Self operator++(int) {
+ _Self __tmp = *this;
+ _M_read();
+ return __tmp;
+ }
+
+ bool _M_equal(const _Self& __x) const
+ { return (_M_ok == __x._M_ok) && (!_M_ok || _M_stream == __x._M_stream); }
+
+private:
+ istream_type* _M_stream;
+ _Tp _M_value;
+ bool _M_ok;
+
+ void _M_read() {
+ _M_ok = (_M_stream && *_M_stream) ? true : false;
+ if (_M_ok) {
+ *_M_stream >> _M_value;
+ _M_ok = *_M_stream ? true : false;
+ }
+ }
+};
+
+#ifndef _STLP_LIMITED_DEFAULT_TEMPLATES
+template <class _TpP,
+ class _CharT = _STLP_DEFAULTCHAR, class _Traits = char_traits<_CharT> >
+#else
+template <class _TpP>
+#endif
+class ostream_iterator: public iterator<output_iterator_tag, void, void, void, void> {
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+ typedef char _CharT;
+ typedef char_traits<char> _Traits;
+ typedef ostream_iterator<_TpP> _Self;
+# else
+ typedef ostream_iterator<_TpP, _CharT, _Traits> _Self;
+# endif
+public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef basic_ostream<_CharT, _Traits> ostream_type;
+
+ typedef output_iterator_tag iterator_category;
+
+ ostream_iterator(ostream_type& __s) : _M_stream(&__s), _M_string(0) {}
+ ostream_iterator(ostream_type& __s, const _CharT* __c)
+ : _M_stream(&__s), _M_string(__c) {}
+ _Self& operator=(const _TpP& __val) {
+ *_M_stream << __val;
+ if (_M_string) *_M_stream << _M_string;
+ return *this;
+ }
+ _Self& operator*() { return *this; }
+ _Self& operator++() { return *this; }
+ _Self& operator++(int) { return *this; }
+private:
+ ostream_type* _M_stream;
+ const _CharT* _M_string;
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+template <class _TpP>
+inline output_iterator_tag _STLP_CALL
+iterator_category(const ostream_iterator<_TpP>&) { return output_iterator_tag(); }
+# else
+template <class _TpP, class _CharT, class _Traits>
+inline output_iterator_tag _STLP_CALL
+iterator_category(const ostream_iterator<_TpP, _CharT, _Traits>&) { return output_iterator_tag(); }
+# endif
+# endif
+
+_STLP_END_NAMESPACE
+
+# elif ! defined(_STLP_USE_NO_IOSTREAMS)
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && ! defined (_STLP_DEFAULT_TYPE_PARAM)
+# define __ISI_TMPL_HEADER_ARGUMENTS class _Tp
+# define __ISI_TMPL_ARGUMENTS _Tp
+template <class _Tp>
+class istream_iterator : public iterator<input_iterator_tag, _Tp, ptrdiff_t,
+ const _Tp*, const _Tp& > {
+# else
+# define __ISI_TMPL_HEADER_ARGUMENTS class _Tp, class _Dist
+# define __ISI_TMPL_ARGUMENTS _Tp, _Dist
+template <class _Tp, __DFL_TYPE_PARAM(_Dist, ptrdiff_t)>
+class istream_iterator : public iterator<input_iterator_tag, _Tp, _Dist,
+ const _Tp*, const _Tp& > {
+# endif
+
+protected:
+ istream* _M_stream;
+ _Tp _M_value;
+ bool _M_end_marker;
+ void _M_read() {
+ _M_end_marker = (*_M_stream) ? true : false;
+ if (_M_end_marker) *_M_stream >> _M_value;
+ _M_end_marker = (*_M_stream) ? true : false;
+}
+public:
+ typedef input_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef _Dist difference_type;
+ typedef const _Tp* pointer;
+ typedef const _Tp& reference;
+
+ istream_iterator() : _M_stream(&cin), _M_end_marker(false) {}
+ istream_iterator(istream& __s) : _M_stream(&__s) { _M_read(); }
+ reference operator*() const { return _M_value; }
+
+ _STLP_DEFINE_ARROW_OPERATOR
+
+ istream_iterator< __ISI_TMPL_ARGUMENTS >& operator++() {
+ _M_read();
+ return *this;
+ }
+ istream_iterator< __ISI_TMPL_ARGUMENTS > operator++(int) {
+ istream_iterator< __ISI_TMPL_ARGUMENTS > __tmp = *this;
+ _M_read();
+ return __tmp;
+ }
+ inline bool _M_equal(const istream_iterator< __ISI_TMPL_ARGUMENTS >& __y) const {
+ return (_M_stream == __y._M_stream &&
+ _M_end_marker == __y._M_end_marker) ||
+ _M_end_marker == false && __y._M_end_marker == false;
+ }
+};
+
+template <class _Tp>
+class ostream_iterator {
+protected:
+ ostream* _M_stream;
+ const char* _M_string;
+public:
+ typedef output_iterator_tag iterator_category;
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+# endif
+ ostream_iterator(ostream& __s) : _M_stream(&__s), _M_string(0) {}
+ ostream_iterator(ostream& __s, const char* __c)
+ : _M_stream(&__s), _M_string(__c) {}
+ ostream_iterator<_Tp>& operator=(const _Tp& __val) {
+ *_M_stream << __val;
+ if (_M_string) *_M_stream << _M_string;
+ return *this;
+ }
+ ostream_iterator<_Tp>& operator*() { return *this; }
+ ostream_iterator<_Tp>& operator++() { return *this; }
+ ostream_iterator<_Tp>& operator++(int) { return *this; }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _Tp> inline output_iterator_tag
+iterator_category(const ostream_iterator<_Tp>&) { return output_iterator_tag(); }
+#endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+
+// form-independent definiotion of stream iterators
+_STLP_BEGIN_NAMESPACE
+
+template < __ISI_TMPL_HEADER_ARGUMENTS >
+inline bool _STLP_CALL
+operator==(const istream_iterator< __ISI_TMPL_ARGUMENTS >& __x,
+ const istream_iterator< __ISI_TMPL_ARGUMENTS >& __y) {
+ return __x._M_equal(__y);
+}
+
+# ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template < __ISI_TMPL_HEADER_ARGUMENTS >
+inline bool _STLP_CALL
+operator!=(const istream_iterator< __ISI_TMPL_ARGUMENTS >& __x,
+ const istream_iterator< __ISI_TMPL_ARGUMENTS >& __y) {
+ return !__x._M_equal(__y);
+}
+
+# endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template < __ISI_TMPL_HEADER_ARGUMENTS >
+inline input_iterator_tag _STLP_CALL
+iterator_category(const istream_iterator< __ISI_TMPL_ARGUMENTS >&)
+{ return input_iterator_tag(); }
+template < __ISI_TMPL_HEADER_ARGUMENTS >
+inline _Tp* _STLP_CALL
+value_type(const istream_iterator< __ISI_TMPL_ARGUMENTS >&) { return (_Tp*) 0; }
+
+# if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && ! defined (_STLP_DEFAULT_TYPE_PARAM)
+template < __ISI_TMPL_HEADER_ARGUMENTS >
+inline ptrdiff_t* _STLP_CALL
+distance_type(const istream_iterator< __ISI_TMPL_ARGUMENTS >&) { return (ptrdiff_t*)0; }
+# else
+template < __ISI_TMPL_HEADER_ARGUMENTS >
+inline _Dist* _STLP_CALL
+distance_type(const istream_iterator< __ISI_TMPL_ARGUMENTS >&) { return (_Dist*)0; }
+# endif /* _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS */
+
+# endif
+
+_STLP_END_NAMESPACE
+
+# undef __ISI_TMPL_HEADER_ARGUMENTS
+# undef __ISI_TMPL_ARGUMENTS
+
+
+#endif /* _STLP_INTERNAL_STREAM_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_streambuf.c b/src/STLport/stl/_streambuf.c
new file mode 100644
index 0000000..59a1e4b
--- /dev/null
+++ b/src/STLport/stl/_streambuf.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_STREAMBUF_C
+#define _STLP_STREAMBUF_C
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+# include <stl/_streambuf.h>
+#endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+_STLP_BEGIN_NAMESPACE
+//----------------------------------------------------------------------
+// Non-inline basic_streambuf<> member functions.
+
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>::basic_streambuf()
+ : _M_gbegin(0), _M_gnext(0), _M_gend(0),
+ _M_pbegin(0), _M_pnext(0), _M_pend(0),
+ _M_locale()
+{
+ // _M_lock._M_initialize();
+}
+
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>::~basic_streambuf()
+{}
+
+
+template <class _CharT, class _Traits>
+locale
+basic_streambuf<_CharT, _Traits>::pubimbue(const locale& __loc) {
+ this->imbue(__loc);
+ locale __tmp = _M_locale;
+ _M_locale = __loc;
+ return __tmp;
+}
+
+template <class _CharT, class _Traits>
+streamsize
+basic_streambuf<_CharT, _Traits>::xsgetn(_CharT* __s, streamsize __n)
+{
+ streamsize __result = 0;
+ const int_type __eof = _Traits::eof();
+
+ while (__result < __n) {
+ if (_M_gnext < _M_gend) {
+ size_t __chunk = (min) (__STATIC_CAST(size_t,_M_gend - _M_gnext),
+ __STATIC_CAST(size_t,__n - __result));
+ _Traits::copy(__s, _M_gnext, __chunk);
+ __result += __chunk;
+ __s += __chunk;
+ _M_gnext += __chunk;
+ }
+ else {
+ int_type __c = this->sbumpc();
+ if (!_Traits::eq_int_type(__c, __eof)) {
+ *__s = __c;
+ ++__result;
+ ++__s;
+ }
+ else
+ break;
+ }
+ }
+
+ return __result;
+}
+
+template <class _CharT, class _Traits>
+streamsize
+basic_streambuf<_CharT, _Traits>::xsputn(const _CharT* __s, streamsize __n)
+{
+ streamsize __result = 0;
+ const int_type __eof = _Traits::eof();
+
+ while (__result < __n) {
+ if (_M_pnext < _M_pend) {
+ size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext),
+ __STATIC_CAST(size_t,__n - __result));
+ _Traits::copy(_M_pnext, __s, __chunk);
+ __result += __chunk;
+ __s += __chunk;
+ _M_pnext += __chunk;
+ }
+
+ else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(*__s)),
+ __eof)) {
+ ++__result;
+ ++__s;
+ }
+ else
+ break;
+ }
+ return __result;
+}
+
+template <class _CharT, class _Traits>
+streamsize
+basic_streambuf<_CharT, _Traits>::_M_xsputnc(_CharT __c, streamsize __n)
+{
+ streamsize __result = 0;
+ const int_type __eof = _Traits::eof();
+
+ while (__result < __n) {
+ if (_M_pnext < _M_pend) {
+ size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext),
+ __STATIC_CAST(size_t,__n - __result));
+ _Traits::assign(_M_pnext, __chunk, __c);
+ __result += __chunk;
+ _M_pnext += __chunk;
+ }
+
+ else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(__c)),
+ __eof))
+ ++__result;
+ else
+ break;
+ }
+ return __result;
+}
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
+basic_streambuf<_CharT, _Traits>::_M_snextc_aux()
+{
+ int_type __eof = _Traits::eof();
+ if (_M_gend == _M_gnext)
+ return _Traits::eq_int_type(this->uflow(), __eof) ? __eof : this->sgetc();
+ else {
+ _M_gnext = _M_gend;
+ return this->underflow();
+ }
+}
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
+basic_streambuf<_CharT, _Traits>::pbackfail(int_type) {
+ return _Traits::eof();
+}
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
+basic_streambuf<_CharT, _Traits>::overflow(int_type) {
+ return _Traits::eof();
+}
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
+basic_streambuf<_CharT, _Traits>::uflow() {
+ return ( _Traits::eq_int_type(this->underflow(),_Traits::eof()) ?
+ _Traits::eof() :
+ _Traits::to_int_type(*_M_gnext++));
+}
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
+basic_streambuf<_CharT, _Traits>::underflow()
+{ return _Traits::eof(); }
+
+template <class _CharT, class _Traits>
+streamsize
+basic_streambuf<_CharT, _Traits>::showmanyc()
+{ return 0; }
+
+template <class _CharT, class _Traits>
+void
+basic_streambuf<_CharT, _Traits>::imbue(const locale&) {}
+
+template <class _CharT, class _Traits>
+int
+basic_streambuf<_CharT, _Traits>::sync() { return 0; }
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::pos_type
+basic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode)
+{ return pos_type(-1); }
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::pos_type
+basic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir,
+ ios_base::openmode)
+{ return pos_type(-1); }
+
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>*
+basic_streambuf<_CharT, _Traits>:: setbuf(char_type*, streamsize)
+{ return this; }
+
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+# if !defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_streambuf<wchar_t, char_traits<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+_STLP_END_NAMESPACE
+
+# endif /* EXPOSE */
+
+#endif
diff --git a/src/STLport/stl/_streambuf.h b/src/STLport/stl/_streambuf.h
new file mode 100644
index 0000000..b2f5cb2
--- /dev/null
+++ b/src/STLport/stl/_streambuf.h
@@ -0,0 +1,526 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_INTERNAL_STREAMBUF
+#define _STLP_INTERNAL_STREAMBUF
+
+#ifndef _STLP_IOS_BASE_H
+#include <stl/_ios_base.h> // Needed for ios_base bitfield members.
+ // <ios_base> includes <iosfwd>.
+#endif
+
+#ifndef _STLP_STDIO_FILE_H
+#include <stl/_stdio_file.h> // Declaration of struct FILE, and of
+ // functions to manipulate it.
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// Class basic_streambuf<>, the base class of the streambuf hierarchy.
+
+// A basic_streambuf<> manages an input (get) area and an output (put)
+// area. Each is described by three pointers: a beginning, an end, and a
+// current position. basic_streambuf<> contains some very simple member
+// functions that manipulate those six pointers, but almost all of the real
+// functionality gets delegated to protected virtual member functions.
+// All of the public member functions are inline, and most of the protected
+// member functions are virtual.
+
+// Although basic_streambuf<> is not abstract, it is useful only as a base
+// class. Its virtual member functions have default definitions such that
+// reading from a basic_streambuf<> will always yield EOF, and writing to a
+// basic_streambuf<> will always fail.
+
+// The second template parameter, _Traits, defaults to char_traits<_CharT>.
+// The default is declared in header <iosfwd>, and it isn't declared here
+// because C++ language rules do not allow it to be declared twice.
+
+template <class _CharT, class _Traits>
+class basic_streambuf
+{
+ friend class basic_istream<_CharT, _Traits>;
+ friend class basic_ostream<_CharT, _Traits>;
+
+public: // Typedefs.
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+
+private: // Data members.
+
+ char_type* _M_gbegin; // Beginning of get area
+ char_type* _M_gnext; // Current position within the get area
+ char_type* _M_gend; // End of get area
+
+ char_type* _M_pbegin; // Beginning of put area
+ char_type* _M_pnext; // Current position within the put area
+ char_type* _M_pend; // End of put area
+
+ locale _M_locale; // The streambuf's locale object
+
+public: // Extension: locking, for thread safety.
+ _STLP_mutex _M_lock;
+
+public: // Destructor.
+ virtual ~basic_streambuf();
+
+protected: // The default constructor.
+ basic_streambuf();
+
+protected: // Protected interface to the get area.
+ char_type* eback() const { return _M_gbegin; } // Beginning
+ char_type* gptr() const { return _M_gnext; } // Current position
+ char_type* egptr() const { return _M_gend; } // End
+
+ void gbump(int __n) { _M_gnext += __n; }
+ void setg(char_type* __gbegin, char_type* __gnext, char_type* __gend) {
+ _M_gbegin = __gbegin;
+ _M_gnext = __gnext;
+ _M_gend = __gend;
+ }
+
+public:
+ // An alternate public interface to the above functions
+ // which allows us to avoid using templated friends which
+ // are not supported on some compilers.
+
+ char_type* _M_eback() const { return eback(); }
+ char_type* _M_gptr() const { return gptr(); }
+ char_type* _M_egptr() const { return egptr(); }
+ void _M_gbump(int __n) { gbump(__n); }
+ void _M_setg(char_type* __gbegin, char_type* __gnext, char_type* __gend)
+ { setg(__gbegin, __gnext, __gend); }
+
+protected: // Protected interface to the put area
+
+ char_type* pbase() const { return _M_pbegin; } // Beginning
+ char_type* pptr() const { return _M_pnext; } // Current position
+ char_type* epptr() const { return _M_pend; } // End
+
+ void pbump(int __n) { _M_pnext += __n; }
+ void setp(char_type* __pbegin, char_type* __pend) {
+ _M_pbegin = __pbegin;
+ _M_pnext = __pbegin;
+ _M_pend = __pend;
+ }
+
+protected: // Virtual buffer management functions.
+
+ virtual basic_streambuf<_CharT, _Traits>* setbuf(char_type*, streamsize);
+
+ // Alters the stream position, using an integer offset. In this
+ // class seekoff does nothing; subclasses are expected to override it.
+ virtual pos_type seekoff(off_type, ios_base::seekdir,
+ ios_base::openmode = ios_base::in | ios_base::out);
+
+ // Alters the stream position, using a previously obtained streampos. In
+ // this class seekpos does nothing; subclasses are expected to override it.
+ virtual pos_type
+ seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out);
+
+ // Synchronizes (i.e. flushes) the buffer. All subclasses are expected to
+ // override this virtual member function.
+ virtual int sync();
+
+
+public: // Buffer management.
+ basic_streambuf<_CharT, _Traits>* pubsetbuf(char_type* __s, streamsize __n)
+ { return this->setbuf(__s, __n); }
+
+ pos_type pubseekoff(off_type __offset, ios_base::seekdir __way,
+ ios_base::openmode __mod = ios_base::in | ios_base::out)
+ { return this->seekoff(__offset, __way, __mod); }
+
+ pos_type pubseekpos(pos_type __sp,
+ ios_base::openmode __mod = ios_base::in | ios_base::out)
+ { return this->seekpos(__sp, __mod); }
+
+ int pubsync() { return this->sync(); }
+
+protected: // Virtual get area functions, as defined in
+ // 17.5.2.4.3 and 17.5.2.4.4 of the standard.
+ // Returns a lower bound on the number of characters that we can read,
+ // with underflow, before reaching end of file. (-1 is a special value:
+ // it means that underflow will fail.) Most subclasses should probably
+ // override this virtual member function.
+ virtual streamsize showmanyc();
+
+ // Reads up to __n characters. Return value is the number of
+ // characters read.
+ virtual streamsize xsgetn(char_type* __s, streamsize __n);
+
+ // Called when there is no read position, i.e. when gptr() is null
+ // or when gptr() >= egptr(). Subclasses are expected to override
+ // this virtual member function.
+ virtual int_type underflow();
+
+ // Similar to underflow(), but used for unbuffered input. Most
+ // subclasses should probably override this virtual member function.
+ virtual int_type uflow();
+
+ // Called when there is no putback position, i.e. when gptr() is null
+ // or when gptr() == eback(). All subclasses are expected to override
+ // this virtual member function.
+ virtual int_type pbackfail(int_type = traits_type::eof());
+
+protected: // Virtual put area functions, as defined in
+ // 27.5.2.4.5 of the standard.
+
+ // Writes up to __n characters. Return value is the number of characters
+ // written.
+ virtual streamsize xsputn(const char_type* __s, streamsize __n);
+
+ // Extension: writes up to __n copies of __c. Return value is the number
+ // of characters written.
+ virtual streamsize _M_xsputnc(char_type __c, streamsize __n);
+
+ // Called when there is no write position. All subclasses are expected to
+ // override this virtual member function.
+ virtual int_type overflow(int_type = traits_type::eof());
+
+public: // Public members for writing characters.
+ // Write a single character.
+ int_type sputc(char_type __c) {
+ return ((_M_pnext < _M_pend) ? _Traits::to_int_type(*_M_pnext++ = __c)
+ : this->overflow(_Traits::to_int_type(__c)));
+ }
+
+ // Write __n characters.
+ streamsize sputn(const char_type* __s, streamsize __n)
+ { return this->xsputn(__s, __n); }
+
+ // Extension: write __n copies of __c.
+ streamsize _M_sputnc(char_type __c, streamsize __n)
+ { return this->_M_xsputnc(__c, __n); }
+
+private: // Helper functions.
+ int_type _M_snextc_aux();
+
+
+public: // Public members for reading characters.
+ streamsize in_avail() {
+ return (_M_gnext < _M_gend) ? (_M_gend - _M_gnext) : this->showmanyc();
+ }
+
+ // Advance to the next character and return it.
+ int_type snextc() {
+ return ( _M_gend - _M_gnext > 1 ?
+ _Traits::to_int_type(*++_M_gnext) :
+ this->_M_snextc_aux());
+ }
+
+ // Return the current character and advance to the next.
+ int_type sbumpc() {
+ return _M_gnext < _M_gend ? _Traits::to_int_type(*_M_gnext++)
+ : this->uflow();
+ }
+
+ // Return the current character without advancing to the next.
+ int_type sgetc() {
+ return _M_gnext < _M_gend ? _Traits::to_int_type(*_M_gnext)
+ : this->underflow();
+ }
+
+ streamsize sgetn(char_type* __s, streamsize __n)
+ { return this->xsgetn(__s, __n); }
+
+ int_type sputbackc(char_type __c) {
+ return ((_M_gbegin < _M_gnext) && _Traits::eq(__c, *(_M_gnext - 1)))
+ ? _Traits::to_int_type(*--_M_gnext)
+ : this->pbackfail(_Traits::to_int_type(__c));
+ }
+
+ int_type sungetc() {
+ return (_M_gbegin < _M_gnext)
+ ? _Traits::to_int_type(*--_M_gnext)
+ : this->pbackfail();
+ }
+
+protected: // Virtual locale functions.
+
+ // This is a hook, called by pubimbue() just before pubimbue()
+ // sets the streambuf's locale to __loc. Note that imbue should
+ // not (and cannot, since it has no access to streambuf's private
+ // members) set the streambuf's locale itself.
+ virtual void imbue(const locale&);
+
+public: // Locale-related functions.
+ locale pubimbue(const locale&);
+ locale getloc() const { return _M_locale; }
+
+# ifndef _STLP_NO_ANACHRONISMS
+ void stossc() { this->sbumpc(); }
+# endif
+#if defined(__MVS__) || defined(__OS400__)
+private: // Data members.
+
+ char_type* _M_gbegin; // Beginning of get area
+ char_type* _M_gnext; // Current position within the get area
+ char_type* _M_gend; // End of get area
+
+ char_type* _M_pbegin; // Beginning of put area
+ char_type* _M_pnext; // Current position within the put area
+ char_type* _M_pend; // End of put area
+#endif
+};
+
+
+//----------------------------------------------------------------------
+// Specialization: basic_streambuf<char, char_traits<char> >
+
+// We implement basic_streambuf<char, char_traits<char> > very differently
+// than the general basic_streambuf<> template. The main reason for this
+// difference is a requirement in the C++ standard: the standard input
+// and output streams cin and cout are required by default to be synchronized
+// with the C library components stdin and stdout. This means it must be
+// possible to synchronize a basic_streambuf<char> with a C buffer.
+//
+// There are two basic ways to do that. First, the streambuf could be
+// unbuffered and delegate all buffering to stdio operations. This
+// would be correct, but slow: it would require at least one virtual
+// function call for every character. Second, the streambuf could use
+// a C stdio FILE as its buffer.
+//
+// We choose the latter option. Every streambuf has pointers to two
+// FILE objects, one for the get area and one for the put area. Ordinarily
+// it just uses a FILE object as a convenient way to package the three
+// get/put area pointers. If a basic_streambuf<char> is synchronized with
+// a stdio stream, though, then the pointers are to a FILE object that's
+// also used by the C library.
+//
+// The header <stl/_stdio_file.h> encapsulates the implementation details
+// of struct FILE. It contains low-level inline functions that convert
+// between whe FILE's internal representation and the three-pointer
+// representation that basic_streambuf<> needs.
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC basic_streambuf<char, char_traits<char> >
+{
+ friend class basic_istream<char, char_traits<char> >;
+ friend class basic_ostream<char, char_traits<char> >;
+public: // Typedefs.
+ typedef char char_type;
+ typedef char_traits<char>::int_type int_type;
+ typedef char_traits<char>::pos_type pos_type;
+ typedef char_traits<char>::off_type off_type;
+ typedef char_traits<char> traits_type;
+
+private: // Data members.
+
+ FILE* _M_get; // Reference to the get area
+ FILE* _M_put; // Reference to the put area
+
+#if defined(__hpux)
+ _FILEX _M_default_get; // Get area, unless we're syncing with stdio.
+ _FILEX _M_default_put; // Put area, unless we're syncing with stdio.
+#else
+ FILE _M_default_get; // Get area, unless we're syncing with stdio.
+ FILE _M_default_put; // Put area, unless we're syncing with stdio.
+#endif
+
+ locale _M_locale;
+
+public: // Extension: locking, for thread safety.
+ _STLP_mutex _M_lock;
+
+public: // Destructor.
+ virtual ~basic_streambuf _STLP_PSPEC2(char, char_traits<char>) ();
+
+protected: // Constructors.
+
+ // The default constructor; defined here inline as some compilers require it
+ basic_streambuf _STLP_PSPEC2(char, char_traits<char>) ()
+ : _M_get(__REINTERPRET_CAST(FILE*,&_M_default_get)),
+ _M_put(__REINTERPRET_CAST(FILE*,&_M_default_put)), _M_locale()
+ {
+ // _M_lock._M_initialize();
+ _FILE_I_set(_M_get, 0, 0, 0);
+ _FILE_O_set(_M_put, 0, 0, 0);
+ }
+
+ // Extension: a constructor for streambufs synchronized with C stdio files.
+ basic_streambuf _STLP_PSPEC2(char, char_traits<char>) (FILE* __get, FILE* __put);
+
+protected: // Protected interface to the get area.
+ char_type* eback() const { return _FILE_I_begin(_M_get); }
+ char_type* gptr() const { return _FILE_I_next(_M_get); }
+ char_type* egptr() const { return _FILE_I_end(_M_get); }
+ void gbump(int __n) { _FILE_I_bump(_M_get, __n); }
+ void setg(char_type* __gbegin, char_type* __gnext, char_type* __gend)
+ { _FILE_I_set(_M_get, __gbegin, __gnext, __gend); }
+
+public:
+ // An alternate public interface to the above functions
+ // which allows us to avoid using templated friends which
+ // are not supported on some compilers.
+
+ char_type* _M_eback() const { return _FILE_I_begin(_M_get); }
+ char_type* _M_gptr() const { return _FILE_I_next(_M_get); }
+ char_type* _M_egptr() const { return _FILE_I_end(_M_get); }
+
+ void _M_gbump(int __n) { _FILE_I_bump(_M_get, __n); }
+ void _M_setg(char_type* __gbegin, char_type* __gnext, char_type* __gend)
+ { _FILE_I_set(_M_get, __gbegin, __gnext, __gend); }
+
+protected: // Protected interface to the put area
+ char_type* pbase() const { return _FILE_O_begin(_M_put); }
+ char_type* pptr() const { return _FILE_O_next(_M_put); }
+ char_type* epptr() const { return _FILE_O_end(_M_put); }
+
+ void pbump(int __n) { _FILE_O_bump(_M_put, __n); }
+ void setp(char_type* __pbegin, char_type* __pend)
+ { _FILE_O_set(_M_put, __pbegin, __pbegin, __pend); }
+
+protected: // Virtual buffer-management functions.
+ virtual basic_streambuf<char, char_traits<char> >* setbuf(char_type*, streamsize);
+ virtual pos_type seekoff(off_type, ios_base::seekdir,
+ ios_base::openmode = ios_base::in | ios_base::out);
+ virtual pos_type
+ seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out);
+ virtual int sync();
+
+public: // Buffer management.
+ basic_streambuf<char, char_traits<char> >* pubsetbuf(char_type* __s, streamsize __n)
+ { return this->setbuf(__s, __n); }
+
+ pos_type pubseekoff(off_type __offset, ios_base::seekdir __way,
+ ios_base::openmode __mod = ios_base::in | ios_base::out)
+ { return this->seekoff(__offset, __way, __mod); }
+
+ pos_type pubseekpos(pos_type __sp,
+ ios_base::openmode __mod = ios_base::in | ios_base::out)
+ { return this->seekpos(__sp, __mod); }
+
+ int pubsync() { return this->sync(); }
+
+protected: // Virtual get area functions.
+ virtual streamsize showmanyc();
+ virtual streamsize xsgetn(char_type* __s, streamsize __n);
+ virtual int_type underflow();
+ virtual int_type uflow();
+ virtual int_type pbackfail(int_type __c = traits_type::eof());
+
+protected: // Virtual put area functions.
+ virtual streamsize xsputn(const char_type* __s, streamsize __n);
+ virtual streamsize _M_xsputnc(char_type __c, streamsize __n);
+ virtual int_type overflow(int_type = traits_type::eof());
+
+public: // Public members for writing characters.
+ // Write a single character.
+ int_type sputc(char_type __c) {
+ int_type __res;
+ if( _FILE_O_avail(_M_put) > 0 )
+ {
+ _FILE_O_postincr(_M_put) = __c;
+ __res = traits_type::to_int_type(__c);
+ }
+ else
+ __res = this->overflow(traits_type::to_int_type(__c));
+ return __res;
+ }
+
+ // Write __n characters.
+ streamsize sputn(const char_type* __s, streamsize __n)
+ { return this->xsputn(__s, __n); }
+
+ // Extension: write __n copies of __c.
+ streamsize _M_sputnc(char_type __c, streamsize __n)
+ { return this->_M_xsputnc(__c, __n); }
+
+private: // Helper functions.
+ int_type _M_snextc_aux();
+
+public: // Public members for reading characters.
+ streamsize in_avail()
+ { return _FILE_I_avail(_M_get) > 0 ? _FILE_I_avail(_M_get)
+ : this->showmanyc(); }
+
+ // Advance to the next character and return it.
+ int_type snextc() {
+ return _FILE_I_avail(_M_get) > 1
+ ? traits_type::to_int_type(_FILE_I_preincr(_M_get))
+ : this->_M_snextc_aux();
+ }
+
+ // Return the current character and advance to the next.
+ int_type sbumpc() {
+ return _FILE_I_avail(_M_get) > 0
+ ? traits_type::to_int_type(_FILE_I_postincr(_M_get))
+ : this->uflow();
+ }
+
+ // Return the current character without advancing to the next.
+ int_type sgetc() {
+ return _FILE_I_avail(_M_get) > 0
+ ? traits_type::to_int_type(*_FILE_I_next(_M_get))
+ : this->underflow();
+ }
+
+ streamsize sgetn(char_type* __s, streamsize __n)
+ { return this->xsgetn(__s, __n); }
+
+ int_type sputbackc(char_type __c) {
+ return _FILE_I_begin(_M_get) < _FILE_I_next(_M_get) &&
+ __c == *(_FILE_I_next(_M_get) - 1)
+ ? traits_type::to_int_type(_FILE_I_predecr(_M_get))
+ : this->pbackfail(traits_type::to_int_type(__c));
+ }
+
+ int_type sungetc() {
+ return _FILE_I_begin(_M_get) < _FILE_I_next(_M_get)
+ ? traits_type::to_int_type(_FILE_I_predecr(_M_get))
+ : this->pbackfail();
+ }
+
+protected: // Virtual locale functions.
+ virtual void imbue(const locale&);
+
+public: // Locale-related functions.
+ locale pubimbue(const locale&);
+ locale getloc() const { return _M_locale; }
+
+# ifndef _STLP_NO_ANACHRONISMS
+public:
+ void stossc() { this->sbumpc(); }
+# endif
+
+#if defined(__MVS__) || defined(__OS400__)
+private: // Data members.
+
+ char_type* _M_gbegin; // Beginning of get area
+ char_type* _M_gnext; // Current position within the get area
+ char_type* _M_gend; // End of get area
+
+ char_type* _M_pbegin; // Beginning of put area
+ char_type* _M_pnext; // Current position within the put area
+ char_type* _M_pend; // End of put area
+#endif
+
+};
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_streambuf.c>
+# endif
+
+#endif
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_streambuf_iterator.h b/src/STLport/stl/_streambuf_iterator.h
new file mode 100644
index 0000000..dd685f7
--- /dev/null
+++ b/src/STLport/stl/_streambuf_iterator.h
@@ -0,0 +1,83 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#if !defined (_STLP_INTERNAL_STREAMBUF_ITERATOR_H)
+#define _STLP_INTERNAL_STREAMBUF_ITERATOR_H
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>* _STLP_CALL _M_get_ostreambuf(basic_ostream<_CharT, _Traits>& ) ;
+
+// The default template argument is declared in iosfwd
+template<class _CharT, class _Traits>
+class ostreambuf_iterator
+{
+public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef typename _Traits::int_type int_type;
+ typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+ typedef basic_ostream<_CharT, _Traits> ostream_type;
+
+ typedef output_iterator_tag iterator_category;
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+
+public:
+ ostreambuf_iterator(streambuf_type* __buf) _STLP_NOTHROW : _M_buf(__buf), _M_ok(__buf!=0) {}
+ ostreambuf_iterator(ostream_type& __o) _STLP_NOTHROW : _M_buf(_M_get_ostreambuf(__o)), _M_ok(_M_buf != 0) {}
+
+ ostreambuf_iterator<_CharT, _Traits>& operator=(char_type __c) {
+ _M_ok = _M_ok && !traits_type::eq_int_type(_M_buf->sputc(__c),
+ traits_type::eof());
+ return *this;
+ }
+
+ ostreambuf_iterator<_CharT, _Traits>& operator*() { return *this; }
+ ostreambuf_iterator<_CharT, _Traits>& operator++() { return *this; }
+ ostreambuf_iterator<_CharT, _Traits>& operator++(int) { return *this; }
+
+ bool failed() const { return !_M_ok; }
+
+private:
+ streambuf_type* _M_buf;
+ bool _M_ok;
+};
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_STREAMBUF_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_string.c b/src/STLport/stl/_string.c
new file mode 100644
index 0000000..3457990
--- /dev/null
+++ b/src/STLport/stl/_string.c
@@ -0,0 +1,580 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_STRING_C
+#define _STLP_STRING_C
+
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+# ifdef _STLP_DEBUG
+# define basic_string _Nondebug_string
+# endif
+
+# if defined (_STLP_USE_OWN_NAMESPACE) || !defined (_STLP_USE_NATIVE_STRING)
+
+# if defined (_STLP_NESTED_TYPE_PARAM_BUG)
+# define __size_type__ size_t
+# define size_type size_t
+# define iterator _CharT*
+# else
+# define __size_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_string<_CharT,_Traits,_Alloc>::size_type
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+// ------------------------------------------------------------
+// Non-inline declarations.
+
+
+// Change the string's capacity so that it is large enough to hold
+// at least __res_arg elements, plus the terminating _CharT(). Note that,
+// if __res_arg < capacity(), this member function may actually decrease
+// the string's capacity.
+template <class _CharT, class _Traits, class _Alloc> void basic_string<_CharT,_Traits,_Alloc>::reserve(size_type __res_arg) {
+
+ if (__res_arg >= capacity())
+ {
+ if (__res_arg > max_size())
+ this->_M_throw_length_error();
+
+ size_type __n = __res_arg + 1;
+ pointer __new_start = this->_M_end_of_storage.allocate(__n);
+ pointer __new_finish = __new_start;
+
+ _STLP_TRY {
+ __new_finish = uninitialized_copy(this->_M_start, this->_M_finish, __new_start);
+ _M_construct_null(__new_finish);
+ }
+ _STLP_UNWIND((_STLP_STD::_Destroy(__new_start, __new_finish),
+ this->_M_end_of_storage.deallocate(__new_start, __n)));
+
+ _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+ this->_M_deallocate_block();
+ this->_M_start = __new_start;
+ this->_M_finish = __new_finish;
+ this->_M_end_of_storage._M_data = __new_start + __n;
+ }
+}
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT,_Traits,_Alloc>& basic_string<_CharT,_Traits,_Alloc>::append(size_type __n, _CharT __c) {
+ if (__n > max_size() || size() > max_size() - __n)
+ this->_M_throw_length_error();
+ if (size() + __n > capacity())
+ reserve(size() + (max)(size(), __n));
+ if (__n > 0) {
+ uninitialized_fill_n(this->_M_finish + 1, __n - 1, __c);
+ _STLP_TRY {
+ _M_construct_null(this->_M_finish + __n);
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_finish + 1, this->_M_finish + __n));
+ _Traits::assign(*end(), __c);
+ this->_M_finish += __n;
+ }
+ return *this;
+}
+
+#ifndef _STLP_MEMBER_TEMPLATES
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT, _Traits, _Alloc>& basic_string<_CharT, _Traits, _Alloc>::append(const _CharT* __first,
+ const _CharT* __last)
+{
+ if (__first != __last) {
+ const size_type __old_size = size();
+ ptrdiff_t __n = __last - __first;
+ if ((size_type)__n > max_size() || __old_size > max_size() - __n)
+ this->_M_throw_length_error();
+ if (__old_size + __n > capacity()) {
+ const size_type __len = __old_size + (max)(__old_size, (size_t) __n) + 1;
+ pointer __new_start = this->_M_end_of_storage.allocate(__len);
+ pointer __new_finish = __new_start;
+ _STLP_TRY {
+ __new_finish = uninitialized_copy(this->_M_start, this->_M_finish, __new_start);
+ __new_finish = uninitialized_copy(__first, __last, __new_finish);
+ _M_construct_null(__new_finish);
+ }
+ _STLP_UNWIND((_STLP_STD::_Destroy(__new_start,__new_finish),
+ this->_M_end_of_storage.deallocate(__new_start,__len)));
+ _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+ this->_M_deallocate_block();
+ this->_M_start = __new_start;
+ this->_M_finish = __new_finish;
+ this->_M_end_of_storage._M_data = __new_start + __len;
+ }
+ else {
+ const _CharT* __f1 = __first;
+ ++__f1;
+ uninitialized_copy(__f1, __last, this->_M_finish + 1);
+ _STLP_TRY {
+ _M_construct_null(this->_M_finish + __n);
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_finish + 1, this->_M_finish + __n));
+ _Traits::assign(*end(), *__first);
+ this->_M_finish += __n;
+ }
+ }
+ return *this;
+}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_string<_CharT,_Traits,_Alloc>&
+basic_string<_CharT,_Traits,_Alloc>::assign(size_type __n, _CharT __c) {
+ if (__n <= size()) {
+ _Traits::assign(this->_M_start, __n, __c);
+ erase(begin() + __n, end());
+ }
+ else {
+ _Traits::assign(this->_M_start, size(), __c);
+ append(__n - size(), __c);
+ }
+ return *this;
+}
+
+template <class _CharT, class _Traits, class _Alloc> _CharT*
+basic_string<_CharT,_Traits,_Alloc> ::_M_insert_aux(_CharT* __p,
+ _CharT __c)
+{
+ pointer __new_pos = __p;
+ if (this->_M_finish + 1 < this->_M_end_of_storage._M_data) {
+ _M_construct_null(this->_M_finish + 1);
+ _Traits::move(__p + 1, __p, this->_M_finish - __p);
+ _Traits::assign(*__p, __c);
+ ++this->_M_finish;
+ }
+ else {
+ const size_type __old_len = size();
+ const size_type __len = __old_len +
+ (max)(__old_len, __STATIC_CAST(size_type,1)) + 1;
+ pointer __new_start = this->_M_end_of_storage.allocate(__len);
+ pointer __new_finish = __new_start;
+ _STLP_TRY {
+ __new_pos = uninitialized_copy(this->_M_start, __p, __new_start);
+ _Construct(__new_pos, __c);
+ __new_finish = __new_pos + 1;
+ __new_finish = uninitialized_copy(__p, this->_M_finish, __new_finish);
+ _M_construct_null(__new_finish);
+ }
+ _STLP_UNWIND((_STLP_STD::_Destroy(__new_start,__new_finish),
+ this->_M_end_of_storage.deallocate(__new_start,__len)));
+ _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+ this->_M_deallocate_block();
+ this->_M_start = __new_start;
+ this->_M_finish = __new_finish;
+ this->_M_end_of_storage._M_data = __new_start + __len;
+ }
+ return __new_pos;
+}
+
+template <class _CharT, class _Traits, class _Alloc> void basic_string<_CharT,_Traits,_Alloc>::insert(iterator __position,
+ size_t __n, _CharT __c)
+{
+ if (__n != 0) {
+ if (size_type(this->_M_end_of_storage._M_data - this->_M_finish) >= __n + 1) {
+ const size_type __elems_after = this->_M_finish - __position;
+ pointer __old_finish = this->_M_finish;
+ if (__elems_after >= __n) {
+ uninitialized_copy((this->_M_finish - __n) + 1, this->_M_finish + 1,
+ this->_M_finish + 1);
+ this->_M_finish += __n;
+ _Traits::move(__position + __n,
+ __position, (__elems_after - __n) + 1);
+ _Traits::assign(__position, __n, __c);
+ }
+ else {
+ uninitialized_fill_n(this->_M_finish + 1, __n - __elems_after - 1, __c);
+ this->_M_finish += __n - __elems_after;
+ _STLP_TRY {
+ uninitialized_copy(__position, __old_finish + 1, this->_M_finish);
+ this->_M_finish += __elems_after;
+ }
+ _STLP_UNWIND((_STLP_STD::_Destroy(__old_finish + 1, this->_M_finish),
+ this->_M_finish = __old_finish));
+ _Traits::assign(__position, __elems_after + 1, __c);
+ }
+ }
+ else {
+ const size_type __old_size = size();
+ const size_type __len = __old_size + (max)(__old_size, __n) + 1;
+ pointer __new_start = this->_M_end_of_storage.allocate(__len);
+ pointer __new_finish = __new_start;
+ _STLP_TRY {
+ __new_finish = uninitialized_copy(this->_M_start, __position, __new_start);
+ __new_finish = uninitialized_fill_n(__new_finish, __n, __c);
+ __new_finish = uninitialized_copy(__position, this->_M_finish,
+ __new_finish);
+ _M_construct_null(__new_finish);
+ }
+ _STLP_UNWIND((_STLP_STD::_Destroy(__new_start,__new_finish),
+ this->_M_end_of_storage.deallocate(__new_start,__len)));
+ _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+ this->_M_deallocate_block();
+ this->_M_start = __new_start;
+ this->_M_finish = __new_finish;
+ this->_M_end_of_storage._M_data = __new_start + __len;
+ }
+ }
+}
+
+#ifndef _STLP_MEMBER_TEMPLATES
+
+template <class _CharT, class _Traits, class _Alloc> void
+basic_string<_CharT,_Traits,_Alloc>::insert(iterator __position,
+ const _CharT* __first,
+ const _CharT* __last)
+{
+ if (__first != __last) {
+ const ptrdiff_t __n = __last - __first;
+ if (this->_M_end_of_storage._M_data - this->_M_finish >= __n + 1) {
+ const ptrdiff_t __elems_after = this->_M_finish - __position;
+ pointer __old_finish = this->_M_finish;
+ if (__elems_after >= __n) {
+ uninitialized_copy((this->_M_finish - __n) + 1, this->_M_finish + 1,
+ this->_M_finish + 1);
+ this->_M_finish += __n;
+ _Traits::move(__position + __n,
+ __position, (__elems_after - __n) + 1);
+ _M_copy(__first, __last, __position);
+ }
+ else {
+ const _CharT* __mid = __first;
+ advance(__mid, __elems_after + 1);
+ uninitialized_copy(__mid, __last, this->_M_finish + 1);
+ this->_M_finish += __n - __elems_after;
+ _STLP_TRY {
+ uninitialized_copy(__position, __old_finish + 1, this->_M_finish);
+ this->_M_finish += __elems_after;
+ }
+ _STLP_UNWIND((_STLP_STD::_Destroy(__old_finish + 1, this->_M_finish),
+ this->_M_finish = __old_finish));
+ _M_copy(__first, __mid, __position);
+ }
+ }
+ else {
+ size_type __old_size = size();
+ size_type __len
+ = __old_size + (max)(__old_size, __STATIC_CAST(const size_type,__n)) + 1;
+ pointer __new_start = this->_M_end_of_storage.allocate(__len);
+ pointer __new_finish = __new_start;
+ _STLP_TRY {
+ __new_finish = uninitialized_copy(this->_M_start, __position, __new_start);
+ __new_finish = uninitialized_copy(__first, __last, __new_finish);
+ __new_finish
+ = uninitialized_copy(__position, this->_M_finish, __new_finish);
+ _M_construct_null(__new_finish);
+ }
+ _STLP_UNWIND((_STLP_STD::_Destroy(__new_start,__new_finish),
+ this->_M_end_of_storage.deallocate(__new_start,__len)));
+ _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+ this->_M_deallocate_block();
+ this->_M_start = __new_start;
+ this->_M_finish = __new_finish;
+ this->_M_end_of_storage._M_data = __new_start + __len;
+ }
+ }
+}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT,_Traits,_Alloc>& basic_string<_CharT,_Traits,_Alloc> ::replace(iterator __first, iterator __last, size_type __n, _CharT __c)
+{
+ size_type __len = (size_type)(__last - __first);
+
+ if (__len >= __n) {
+ _Traits::assign(__first, __n, __c);
+ erase(__first + __n, __last);
+ }
+ else {
+ _Traits::assign(__first, __len, __c);
+ insert(__last, __n - __len, __c);
+ }
+ return *this;
+}
+
+#ifndef _STLP_MEMBER_TEMPLATES
+
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT,_Traits,_Alloc>& basic_string<_CharT,_Traits,_Alloc> ::replace(iterator __first, iterator __last,
+ const _CharT* __f, const _CharT* __l)
+{
+ const ptrdiff_t __n = __l - __f;
+ const difference_type __len = __last - __first;
+ if (__len >= __n) {
+ _M_copy(__f, __l, __first);
+ erase(__first + __n, __last);
+ }
+ else {
+ const _CharT* __m = __f + __len;
+ _M_copy(__f, __m, __first);
+ insert(__last, __m, __l);
+ }
+ return *this;
+}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find(const _CharT* __s, size_type __pos, size_type __n) const
+{
+ if (__pos + __n > size())
+ return npos;
+ else {
+ const const_pointer __result =
+ _STLP_STD::search((const _CharT*)this->_M_start + __pos, (const _CharT*)this->_M_finish,
+ __s, __s + __n, _Eq_traits<_Traits>());
+ return __result != this->_M_finish ? __result - this->_M_start : npos;
+ }
+}
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find(_CharT __c, size_type __pos) const
+{
+ if (__pos >= size())
+ return npos;
+ else {
+ const const_pointer __result =
+ _STLP_STD::find_if((const _CharT*)this->_M_start + __pos, (const _CharT*)this->_M_finish,
+ _Eq_char_bound<_Traits>(__c));
+ return __result != this->_M_finish ? __result - this->_M_start : npos;
+ }
+}
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::rfind(const _CharT* __s, size_type __pos, size_type __n) const
+{
+ const size_t __len = size();
+
+ if (__n > __len)
+ return npos;
+ else if (__n == 0)
+ return (min) (__len, __pos);
+ else {
+ const_pointer __last = this->_M_start + (min) (__len - __n, __pos) + __n;
+ const_pointer __result = _STLP_STD::find_end((const_pointer)this->_M_start, __last,
+ __s, __s + __n,
+ _Eq_traits<_Traits>());
+ return __result != __last ? __result - this->_M_start : npos;
+ }
+}
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::rfind(_CharT __c, size_type __pos) const
+{
+ const size_type __len = size();
+
+ if (__len < 1)
+ return npos;
+ else {
+ const const_iterator __last = begin() + (min) (__len - 1, __pos) + 1;
+ const_reverse_iterator __rresult =
+ _STLP_STD::find_if(const_reverse_iterator(__last), rend(),
+ _Eq_char_bound<_Traits>(__c));
+ return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos;
+ }
+}
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
+{
+ if (__pos >= size())
+ return npos;
+ else {
+ const_iterator __result = __find_first_of(begin() + __pos, end(),
+ __s, __s + __n,
+ _Eq_traits<_Traits>());
+ return __result != end() ? __result - begin() : npos;
+ }
+}
+
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
+{
+ const size_type __len = size();
+
+ if (__len < 1)
+ return npos;
+ else {
+ const const_iterator __last = begin() + (min) (__len - 1, __pos) + 1;
+ const const_reverse_iterator __rresult =
+ __find_first_of(const_reverse_iterator(__last), rend(),
+ __s, __s + __n,
+ _Eq_traits<_Traits>());
+ return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos;
+ }
+}
+
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
+{
+ typedef typename _Traits::char_type _CharType;
+ if (__pos > size())
+ return npos;
+ else {
+ const_pointer __result = _STLP_STD::find_if((const _CharT*)this->_M_start + __pos,
+ (const _CharT*)this->_M_finish,
+ _Not_within_traits<_Traits>((const _CharType*)__s,
+ (const _CharType*)__s + __n));
+ return __result != this->_M_finish ? __result - this->_M_start : npos;
+ }
+}
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find_first_not_of(_CharT __c, size_type __pos) const
+{
+ if (__pos > size())
+ return npos;
+ else {
+ const_pointer __result = _STLP_STD::find_if((const _CharT*)this->_M_start + __pos, (const _CharT*)this->_M_finish,
+ _Neq_char_bound<_Traits>(__c));
+ return __result != this->_M_finish ? __result - this->_M_start : npos;
+ }
+}
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
+{
+ typedef typename _Traits::char_type _CharType;
+ const size_type __len = size();
+
+ if (__len < 1)
+ return npos;
+ else {
+ const_iterator __last = begin() + (min) (__len - 1, __pos) + 1;
+ const_reverse_iterator __rlast = const_reverse_iterator(__last);
+ const_reverse_iterator __rresult =
+ _STLP_STD::find_if(__rlast, rend(),
+ _Not_within_traits<_Traits>((const _CharType*)__s,
+ (const _CharType*)__s + __n));
+ return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos;
+ }
+}
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT, _Traits, _Alloc> ::find_last_not_of(_CharT __c, size_type __pos) const
+{
+ const size_type __len = size();
+
+ if (__len < 1)
+ return npos;
+ else {
+ const_iterator __last = begin() + (min) (__len - 1, __pos) + 1;
+ const_reverse_iterator __rlast = const_reverse_iterator(__last);
+ const_reverse_iterator __rresult =
+ _STLP_STD::find_if(__rlast, rend(),
+ _Neq_char_bound<_Traits>(__c));
+ return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos;
+ }
+}
+
+template <class _CharT, class _Traits, class _Alloc> void _STLP_CALL _S_string_copy(const basic_string<_CharT,_Traits,_Alloc>& __s,
+ _CharT* __buf,
+ size_t __n)
+{
+ if (__n > 0) {
+ __n = (min) (__n - 1, __s.size());
+ _STLP_STD::copy(__s.begin(), __s.begin() + __n, __buf);
+ __buf[__n] = _CharT();
+ }
+}
+_STLP_END_NAMESPACE
+
+// _string_fwd has to see clean basic_string
+# undef basic_string
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_string_fwd.c>
+# endif
+
+# ifdef _STLP_DEBUG
+# define basic_string _Nondebug_string
+# endif
+
+# include <stl/_range_errors.h>
+_STLP_BEGIN_NAMESPACE
+
+// _String_base methods
+template <class _Tp, class _Alloc> void _String_base<_Tp,_Alloc>::_M_throw_length_error() const {
+ __stl_throw_length_error("basic_string");
+}
+
+template <class _Tp, class _Alloc> void _String_base<_Tp, _Alloc>::_M_throw_out_of_range() const {
+ __stl_throw_out_of_range("basic_string");
+}
+
+template <class _Tp, class _Alloc> void _String_base<_Tp, _Alloc>::_M_allocate_block(size_t __n) {
+ if ((__n <= (max_size()+1)) && (__n>0)){
+ _M_start = _M_end_of_storage.allocate(__n);
+ _M_finish = _M_start;
+ _M_end_of_storage._M_data = _M_start + __n;
+ }
+ else
+ _M_throw_length_error();
+}
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT, _Traits, _Alloc>::basic_string()
+ : _String_base<_CharT,_Alloc>(allocator_type()) {
+ this->_M_start = this->_M_end_of_storage.allocate(8);
+ this->_M_finish = this->_M_start;
+ this->_M_end_of_storage._M_data = this->_M_start + 8;
+ _M_terminate_string();
+}
+
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT* __s,
+ const allocator_type& __a)
+ : _String_base<_CharT,_Alloc>(__a)
+{
+ _STLP_FIX_LITERAL_BUG(__s)
+ _M_range_initialize(__s, __s + traits_type::length(__s));
+}
+
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT, _Traits, _Alloc>::basic_string(const basic_string<_CharT, _Traits, _Alloc> & __s)
+ : _String_base<_CharT,_Alloc>(__s.get_allocator())
+{
+ _M_range_initialize(__s._M_start, __s._M_finish);
+}
+
+# if defined ( __SUNPRO_CC) && ! defined(_STLP_STATIC_CONST_INIT_BUG)
+template <class _CharT, class _Traits, class _Alloc> const size_t basic_string<_CharT, _Traits, _Alloc>::npos;
+# endif
+
+_STLP_END_NAMESPACE
+
+# undef basic_string
+# undef __size_type__
+# undef size_type
+# undef iterator
+# endif /* NATIVE */
+
+#endif /* _STLP_STRING_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_string.h b/src/STLport/stl/_string.h
new file mode 100644
index 0000000..f00dbe7
--- /dev/null
+++ b/src/STLport/stl/_string.h
@@ -0,0 +1,1501 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRING_H
+#define _STLP_STRING_H
+
+#ifndef _STLP_MEMORY
+# include <memory>
+#endif
+
+# ifndef _STLP_CCTYPE
+# include <cctype>
+# endif
+
+#ifndef _STLP_STRING_FWD_H
+# include <stl/_string_fwd.h>
+#endif
+
+#ifndef _STLP_INTERNAL_FUNCTION_BASE_H
+# include <stl/_function.h>
+#endif
+
+# include <stl/_ctraits_fns.h>
+#ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h>
+#endif
+
+#if defined( __MWERKS__ ) && ! defined (_STLP_USE_OWN_NAMESPACE)
+
+// MSL implementation classes expect to see the definition of streampos
+// when this header is included. We expect this to be fixed in later MSL
+// implementations
+# if !defined( __MSL_CPP__ ) || __MSL_CPP__ < 0x4105
+# include <stl/msl_string.h>
+# endif
+
+#endif // __MWERKS__
+
+// Standard C++ string class. This class has performance
+// characteristics very much like vector<>, meaning, for example, that
+// it does not perform reference-count or copy-on-write, and that
+// concatenation of two strings is an O(N) operation.
+
+// There are three reasons why basic_string is not identical to
+// vector. First, basic_string always stores a null character at the
+// end; this makes it possible for c_str to be a fast operation.
+// Second, the C++ standard requires basic_string to copy elements
+// using char_traits<>::assign, char_traits<>::copy, and
+// char_traits<>::move. This means that all of vector<>'s low-level
+// operations must be rewritten. Third, basic_string<> has a lot of
+// extra functions in its interface that are convenient but, strictly
+// speaking, redundant.
+
+// Additionally, the C++ standard imposes a major restriction: according
+// to the standard, the character type _CharT must be a POD type. This
+// implementation weakens that restriction, and allows _CharT to be a
+// a user-defined non-POD type. However, _CharT must still have a
+// default constructor.
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG
+# define basic_string _Nondebug_string
+# endif
+
+// A helper class to use a char_traits as a function object.
+
+template <class _Traits> struct _Not_within_traits
+ : public unary_function<typename _Traits::char_type, bool> {
+ typedef typename _Traits::char_type _CharT;
+ const _CharT* _M_first;
+ const _CharT* _M_last;
+
+ _Not_within_traits(const typename _Traits::char_type* __f,
+ const typename _Traits::char_type* __l)
+ : _M_first(__f), _M_last(__l) {}
+
+ bool operator()(const typename _Traits::char_type& __x) const {
+ return find_if(_M_first, _M_last,
+ _Eq_char_bound<_Traits>(__x)) == _M_last;
+ }
+};
+
+// ------------------------------------------------------------
+// Class _String_base.
+
+// _String_base is a helper class that makes it it easier to write an
+// exception-safe version of basic_string. The constructor allocates,
+// but does not initialize, a block of memory. The destructor
+// deallocates, but does not destroy elements within, a block of
+// memory. The destructor assumes that _M_start either is null, or else
+// points to a block of memory that was allocated using _String_base's
+// allocator and whose size is _M_end_of_storage._M_data - _M_start.
+
+template <class _Tp, class _Alloc> class _String_base {
+public:
+ _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+ typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type;
+ _Tp* _M_start;
+ _Tp* _M_finish;
+ _STLP_alloc_proxy<_Tp*, _Tp, allocator_type> _M_end_of_storage;
+ // Precondition: 0 < __n <= max_size().
+ void _M_allocate_block(size_t);
+ void _M_deallocate_block()
+ { _M_end_of_storage.deallocate(_M_start, _M_end_of_storage._M_data - _M_start); }
+
+ size_t max_size() const { return (size_t(-1) / sizeof(_Tp)) - 1; }
+
+ _String_base(const allocator_type& __a)
+ : _M_start(0), _M_finish(0), _M_end_of_storage(__a, (_Tp*)0) {}
+
+ _String_base(const allocator_type& __a, size_t __n)
+ : _M_start(0), _M_finish(0), _M_end_of_storage(__a, (_Tp*)0)
+ { _M_allocate_block(__n); }
+
+ ~_String_base() { _M_deallocate_block(); }
+
+ void _M_throw_length_error() const;
+ void _M_throw_out_of_range() const;
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _String_base<char, allocator<char> >;
+# if defined (_STLP_HAS_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS _String_base<wchar_t, allocator<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+// ------------------------------------------------------------
+// Class basic_string.
+
+// Class invariants:
+// (1) [start, finish) is a valid range.
+// (2) Each iterator in [start, finish) points to a valid object
+// of type value_type.
+// (3) *finish is a valid object of type value_type; in particular,
+// it is value_type().
+// (4) [finish + 1, end_of_storage) is a valid range.
+// (5) Each iterator in [finish + 1, end_of_storage) points to
+// unininitialized memory.
+
+// Note one important consequence: a string of length n must manage
+// a block of memory whose size is at least n + 1.
+
+struct _String_reserve_t {};
+
+template <class _CharT, class _Traits, class _Alloc> class basic_string : protected _String_base<_CharT,_Alloc> {
+private: // Protected members inherited from base.
+ typedef _String_base<_CharT,_Alloc> _Base;
+ typedef basic_string<_CharT, _Traits, _Alloc> _Self;
+ // fbp : used to optimize char/wchar_t cases, and to simplify
+ // _STLP_DEFAULT_CONSTRUCTOR_BUG problem workaround
+ typedef typename _Is_integer<_CharT>::_Integral _Char_Is_Integral;
+public:
+ typedef _CharT value_type;
+ typedef _Traits traits_type;
+
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef random_access_iterator_tag _Iterator_category;
+
+ typedef const value_type* const_iterator;
+ typedef value_type* iterator;
+
+ _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+
+# if defined(_STLP_STATIC_CONST_INIT_BUG)
+ enum { npos = -1 };
+# elif __GNUC__ == 2 && __GNUC_MINOR__ == 96
+ // inline initializer conflicts with 'extern template'
+ static const size_t npos ;
+# else
+ static const size_t npos = ~(size_t)0;
+# endif
+
+ typedef _String_reserve_t _Reserve_t;
+# if defined (_STLP_USE_NATIVE_STRING) && ! defined (_STLP_DEBUG)
+# if (defined(__IBMCPP__) && (500 <= __IBMCPP__) && (__IBMCPP__ < 600) )
+ // this typedef is being used for conversions
+ typedef typename _STLP_VENDOR_STD::basic_string<_CharT,_Traits,
+ typename _STLP_VENDOR_STD::allocator<_CharT> > __std_string;
+# else
+ // this typedef is being used for conversions
+ typedef _STLP_VENDOR_STD::basic_string<_CharT,_Traits,
+ _STLP_VENDOR_STD::allocator<_CharT> > __std_string;
+# endif
+# endif
+
+public: // Constructor, destructor, assignment.
+ typedef typename _String_base<_CharT,_Alloc>::allocator_type allocator_type;
+
+ allocator_type get_allocator() const {
+ return _STLP_CONVERT_ALLOCATOR((const allocator_type&)this->_M_end_of_storage, _CharT);
+ }
+
+ basic_string();
+
+ explicit basic_string(const allocator_type& __a)
+ : _String_base<_CharT,_Alloc>(__a, 8) {
+ _M_terminate_string();
+ }
+
+ basic_string(_Reserve_t, size_t __n,
+ const allocator_type& __a = allocator_type())
+ : _String_base<_CharT,_Alloc>(__a, __n + 1) {
+ _M_terminate_string();
+ }
+
+ basic_string(const basic_string<_CharT, _Traits, _Alloc>&);
+
+ basic_string(const _Self& __s, size_type __pos, size_type __n = npos,
+ const allocator_type& __a = allocator_type())
+ : _String_base<_CharT,_Alloc>(__a) {
+ if (__pos > __s.size())
+ this->_M_throw_out_of_range();
+ else
+ _M_range_initialize(__s._M_start + __pos,
+ __s._M_start + __pos + (min) (__n, __s.size() - __pos));
+ }
+
+ basic_string(const _CharT* __s, size_type __n,
+ const allocator_type& __a = allocator_type())
+ : _String_base<_CharT,_Alloc>(__a)
+ {
+ _STLP_FIX_LITERAL_BUG(__s)
+ _M_range_initialize(__s, __s + __n);
+ }
+
+ basic_string(const _CharT* __s,
+ const allocator_type& __a = allocator_type());
+
+ basic_string(size_type __n, _CharT __c,
+ const allocator_type& __a = allocator_type())
+ : _String_base<_CharT,_Alloc>(__a, __n + 1)
+ {
+ this->_M_finish = uninitialized_fill_n(this->_M_start, __n, __c);
+ _M_terminate_string();
+ }
+
+ // Check to see if _InputIterator is an integer type. If so, then
+ // it can't be an iterator.
+#if defined (_STLP_MEMBER_TEMPLATES) && !(defined(__MRC__)||(defined(__SC__) && !defined(__DMC__))) //*ty 04/30/2001 - mpw compilers choke on this ctor
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator> basic_string(_InputIterator __f, _InputIterator __l)
+ : _String_base<_CharT,_Alloc>(allocator_type())
+ {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_initialize_dispatch(__f, __l, _Integral());
+ }
+# endif
+ template <class _InputIterator> basic_string(_InputIterator __f, _InputIterator __l,
+ const allocator_type & __a _STLP_ALLOCATOR_TYPE_DFL)
+ : _String_base<_CharT,_Alloc>(__a)
+ {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_initialize_dispatch(__f, __l, _Integral());
+ }
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ basic_string(const _CharT* __f, const _CharT* __l,
+ const allocator_type& __a = allocator_type())
+ : _String_base<_CharT,_Alloc>(__a)
+ {
+ _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)
+ _M_range_initialize(__f, __l);
+ }
+
+#endif
+
+# if defined (_STLP_USE_NATIVE_STRING) && ! defined (_STLP_DEBUG)
+ // these conversion operations still needed for
+ // strstream, etc.
+ basic_string (const __std_string& __x): _String_base<_CharT,_Alloc>(allocator_type())
+ {
+ const _CharT* __s = __x.data();
+ _M_range_initialize(__s, __s + __x.size());
+ }
+
+ operator __std_string() const { return __std_string(this->data(), this->size()); }
+# endif
+
+ ~basic_string() { _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1); }
+
+ _Self& operator=(const _Self& __s) {
+ if (&__s != this)
+ assign(__s._M_start, __s._M_finish);
+ return *this;
+ }
+
+ _Self& operator=(const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return assign(__s, __s + traits_type::length(__s));
+ }
+
+ _Self& operator=(_CharT __c)
+ { return assign(__STATIC_CAST(size_type,1), __c); }
+
+ static _CharT _STLP_CALL _M_null() {
+ return _STLP_DEFAULT_CONSTRUCTED(_CharT);
+ }
+
+private: // Helper functions used by constructors
+ // and elsewhere.
+ // fbp : simplify integer types (char, wchar)
+ void _M_construct_null_aux(_CharT* __p, const __false_type&) {
+ _Construct(__p);
+ }
+ void _M_construct_null_aux(_CharT* __p, const __true_type&) {
+ *__p = 0;
+ }
+
+ void _M_construct_null(_CharT* __p) {
+ _M_construct_null_aux(__p, _Char_Is_Integral());
+ }
+
+private:
+ // Helper functions used by constructors. It is a severe error for
+ // any of them to be called anywhere except from within constructors.
+
+ void _M_terminate_string_aux(const __false_type&) {
+ _STLP_TRY {
+ _M_construct_null(this->_M_finish);
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_start, this->_M_finish));
+ }
+
+ void _M_terminate_string_aux(const __true_type&) {
+ *(this->_M_finish)=0;
+ }
+
+ void _M_terminate_string() {
+ _M_terminate_string_aux(_Char_Is_Integral());
+ }
+
+#ifndef _STLP_MEMBER_TEMPLATES
+ bool _M_inside(const _CharT* __s ) const {
+ return (__s >= this->_M_start) && (__s < this->_M_finish);
+ }
+#else
+ template <class _InputIter>
+ bool _M_inside(_InputIter __i) const {
+ const _CharT* __s = __STATIC_CAST(const _CharT*, &(*__i));
+ return (__s >= this->_M_start) && (__s < this->_M_finish);
+ }
+#endif /*_STLP_MEMBER_TEMPLATES*/
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _InputIter> void _M_range_initialize(_InputIter __f, _InputIter __l,
+ const input_iterator_tag &) {
+ this->_M_allocate_block(8);
+ _M_construct_null(this->_M_finish);
+ _STLP_TRY {
+ append(__f, __l);
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1));
+ }
+
+ template <class _ForwardIter> void _M_range_initialize(_ForwardIter __f, _ForwardIter __l,
+ const forward_iterator_tag &) {
+ difference_type __n = distance(__f, __l);
+ this->_M_allocate_block(__n + 1);
+ this->_M_finish = uninitialized_copy(__f, __l, this->_M_start);
+ _M_terminate_string();
+ }
+
+ template <class _InputIter> void _M_range_initialize(_InputIter __f, _InputIter __l) {
+ _M_range_initialize(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter));
+ }
+
+ template <class _Integer> void _M_initialize_dispatch(_Integer __n, _Integer __x, const __true_type&) {
+ this->_M_allocate_block(__n + 1);
+ this->_M_finish = uninitialized_fill_n(this->_M_start, __n, __x);
+ _M_terminate_string();
+ }
+
+ template <class _InputIter> void _M_initialize_dispatch(_InputIter __f, _InputIter __l, const __false_type&) {
+ _M_range_initialize(__f, __l);
+ }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ void _M_range_initialize(const _CharT* __f, const _CharT* __l) {
+ ptrdiff_t __n = __l - __f;
+ this->_M_allocate_block(__n + 1);
+ this->_M_finish = uninitialized_copy(__f, __l, this->_M_start);
+ _M_terminate_string();
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public: // Iterators.
+ iterator begin() { return this->_M_start; }
+ iterator end() { return this->_M_finish; }
+ const_iterator begin() const { return this->_M_start; }
+ const_iterator end() const { return this->_M_finish; }
+
+ reverse_iterator rbegin()
+ { return reverse_iterator(this->_M_finish); }
+ reverse_iterator rend()
+ { return reverse_iterator(this->_M_start); }
+ const_reverse_iterator rbegin() const
+ { return const_reverse_iterator(this->_M_finish); }
+ const_reverse_iterator rend() const
+ { return const_reverse_iterator(this->_M_start); }
+
+public: // Size, capacity, etc.
+ size_type size() const { return this->_M_finish - this->_M_start; }
+ size_type length() const { return size(); }
+
+ size_t max_size() const { return _Base::max_size(); }
+
+
+ void resize(size_type __n, _CharT __c) {
+ if (__n <= size())
+ erase(begin() + __n, end());
+ else
+ append(__n - size(), __c);
+ }
+ void resize(size_type __n) { resize(__n, _M_null()); }
+
+ void reserve(size_type = 0);
+
+ size_type capacity() const { return (this->_M_end_of_storage._M_data - this->_M_start) - 1; }
+
+ void clear() {
+ if (!empty()) {
+ _Traits::assign(*(this->_M_start), _M_null());
+ _STLP_STD::_Destroy(this->_M_start+1, this->_M_finish+1);
+ this->_M_finish = this->_M_start;
+ }
+ }
+
+ bool empty() const { return this->_M_start == this->_M_finish; }
+
+public: // Element access.
+
+ const_reference operator[](size_type __n) const
+ { return *(this->_M_start + __n); }
+ reference operator[](size_type __n)
+ { return *(this->_M_start + __n); }
+
+ const_reference at(size_type __n) const {
+ if (__n >= size())
+ this->_M_throw_out_of_range();
+ return *(this->_M_start + __n);
+ }
+
+ reference at(size_type __n) {
+ if (__n >= size())
+ this->_M_throw_out_of_range();
+ return *(this->_M_start + __n);
+ }
+
+public: // Append, operator+=, push_back.
+
+ _Self& operator+=(const _Self& __s) { return append(__s); }
+ _Self& operator+=(const _CharT* __s) { _STLP_FIX_LITERAL_BUG(__s) return append(__s); }
+ _Self& operator+=(_CharT __c) { push_back(__c); return *this; }
+
+ _Self& append(const _Self& __s)
+ { return append(__s._M_start, __s._M_finish); }
+
+ _Self& append(const _Self& __s,
+ size_type __pos, size_type __n)
+ {
+ if (__pos > __s.size())
+ this->_M_throw_out_of_range();
+ return append(__s._M_start + __pos,
+ __s._M_start + __pos + (min) (__n, __s.size() - __pos));
+ }
+
+ _Self& append(const _CharT* __s, size_type __n)
+ { _STLP_FIX_LITERAL_BUG(__s) return append(__s, __s+__n); }
+ _Self& append(const _CharT* __s)
+ { _STLP_FIX_LITERAL_BUG(__s) return append(__s, __s + traits_type::length(__s)); }
+ _Self& append(size_type __n, _CharT __c);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ // Check to see if _InputIterator is an integer type. If so, then
+ // it can't be an iterator.
+ template <class _InputIter> _Self& append(_InputIter __first, _InputIter __last) {
+ typedef typename _Is_integer<_InputIter>::_Integral _Integral;
+ return _M_append_dispatch(__first, __last, _Integral());
+ }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ _Self& append(const _CharT* __first, const _CharT* __last);
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ void push_back(_CharT __c) {
+ if (this->_M_finish + 1 == this->_M_end_of_storage._M_data)
+ reserve(size() + (max)(size(), __STATIC_CAST(size_type,1)));
+ _M_construct_null(this->_M_finish + 1);
+ _Traits::assign(*(this->_M_finish), __c);
+ ++this->_M_finish;
+ }
+
+ void pop_back() {
+ _Traits::assign(*(this->_M_finish - 1), _M_null());
+ _STLP_STD::_Destroy(this->_M_finish);
+ --this->_M_finish;
+ }
+
+private: // Helper functions for append.
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _InputIter> _Self& append(_InputIter __first, _InputIter __last, const input_iterator_tag &)
+ {
+ for ( ; __first != __last ; ++__first)
+ push_back(*__first);
+ return *this;
+ }
+
+ template <class _ForwardIter> _Self& append(_ForwardIter __first, _ForwardIter __last,
+ const forward_iterator_tag &) {
+ if (__first != __last) {
+ const size_type __old_size = size();
+ difference_type __n = distance(__first, __last);
+ if (__STATIC_CAST(size_type,__n) > max_size() || __old_size > max_size() - __STATIC_CAST(size_type,__n))
+ this->_M_throw_length_error();
+ if (__old_size + __n > capacity()) {
+ const size_type __len = __old_size +
+ (max)(__old_size, __STATIC_CAST(size_type,__n)) + 1;
+ pointer __new_start = this->_M_end_of_storage.allocate(__len);
+ pointer __new_finish = __new_start;
+ _STLP_TRY {
+ __new_finish = uninitialized_copy(this->_M_start, this->_M_finish, __new_start);
+ __new_finish = uninitialized_copy(__first, __last, __new_finish);
+ _M_construct_null(__new_finish);
+ }
+ _STLP_UNWIND((_STLP_STD::_Destroy(__new_start,__new_finish),
+ this->_M_end_of_storage.deallocate(__new_start,__len)));
+ _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+ this->_M_deallocate_block();
+ this->_M_start = __new_start;
+ this->_M_finish = __new_finish;
+ this->_M_end_of_storage._M_data = __new_start + __len;
+ }
+ else {
+ _ForwardIter __f1 = __first;
+ ++__f1;
+ uninitialized_copy(__f1, __last, this->_M_finish + 1);
+ _STLP_TRY {
+ _M_construct_null(this->_M_finish + __n);
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_finish + 1, this->_M_finish + __n));
+ _Traits::assign(*end(), *__first);
+ this->_M_finish += __n;
+ }
+ }
+ return *this;
+ }
+
+ template <class _Integer> _Self& _M_append_dispatch(_Integer __n, _Integer __x, const __true_type&) {
+ return append((size_type) __n, (_CharT) __x);
+ }
+
+ template <class _InputIter> _Self& _M_append_dispatch(_InputIter __f, _InputIter __l,
+ const __false_type&) {
+ return append(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter));
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public: // Assign
+
+ _Self& assign(const _Self& __s)
+ { return assign(__s._M_start, __s._M_finish); }
+
+ _Self& assign(const _Self& __s,
+ size_type __pos, size_type __n) {
+ if (__pos > __s.size())
+ this->_M_throw_out_of_range();
+ return assign(__s._M_start + __pos,
+ __s._M_start + __pos + (min) (__n, __s.size() - __pos));
+ }
+
+ _Self& assign(const _CharT* __s, size_type __n)
+ { _STLP_FIX_LITERAL_BUG(__s) return assign(__s, __s + __n); }
+
+ _Self& assign(const _CharT* __s)
+ { _STLP_FIX_LITERAL_BUG(__s) return assign(__s, __s + _Traits::length(__s)); }
+
+ _Self& assign(size_type __n, _CharT __c);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+private: // Helper functions for assign.
+
+ template <class _Integer>
+ _Self& _M_assign_dispatch(_Integer __n, _Integer __x, const __true_type&) {
+ return assign((size_type) __n, (_CharT) __x);
+ }
+
+ template <class _InputIter>
+ _Self& _M_assign_dispatch(_InputIter __f, _InputIter __l,
+ const __false_type&) {
+ pointer __cur = this->_M_start;
+ while (__f != __l && __cur != this->_M_finish) {
+ _Traits::assign(*__cur, *__f);
+ ++__f;
+ ++__cur;
+ }
+ if (__f == __l)
+ erase(__cur, end());
+ else
+ append(__f, __l);
+ return *this;
+ }
+
+public:
+ // Check to see if _InputIterator is an integer type. If so, then
+ // it can't be an iterator.
+ template <class _InputIter> _Self& assign(_InputIter __first, _InputIter __last) {
+ typedef typename _Is_integer<_InputIter>::_Integral _Integral;
+ return _M_assign_dispatch(__first, __last, _Integral());
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ // if member templates are on, this works as specialization
+ _Self& assign(const _CharT* __f, const _CharT* __l)
+ {
+ ptrdiff_t __n = __l - __f;
+ if (__STATIC_CAST(size_type,__n) <= size()) {
+ _Traits::copy(this->_M_start, __f, __n);
+ erase(begin() + __n, end());
+ }
+ else {
+ _Traits::copy(this->_M_start, __f, size());
+ append(__f + size(), __l);
+ }
+ return *this;
+ }
+
+public: // Insert
+
+ _Self& insert(size_type __pos, const _Self& __s) {
+ if (__pos > size())
+ this->_M_throw_out_of_range();
+ if (size() > max_size() - __s.size())
+ this->_M_throw_length_error();
+ insert(begin() + __pos, __s._M_start, __s._M_finish);
+ return *this;
+ }
+
+ _Self& insert(size_type __pos, const _Self& __s,
+ size_type __beg, size_type __n) {
+ if (__pos > size() || __beg > __s.size())
+ this->_M_throw_out_of_range();
+ size_type __len = (min) (__n, __s.size() - __beg);
+ if (size() > max_size() - __len)
+ this->_M_throw_length_error();
+ insert(begin() + __pos,
+ __s._M_start + __beg, __s._M_start + __beg + __len);
+ return *this;
+ }
+
+ _Self& insert(size_type __pos, const _CharT* __s, size_type __n) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ if (__pos > size())
+ this->_M_throw_out_of_range();
+ if (size() > max_size() - __n)
+ this->_M_throw_length_error();
+ insert(begin() + __pos, __s, __s + __n);
+ return *this;
+ }
+
+ _Self& insert(size_type __pos, const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ if (__pos > size())
+ this->_M_throw_out_of_range();
+ size_type __len = _Traits::length(__s);
+ if (size() > max_size() - __len)
+ this->_M_throw_length_error();
+ insert(this->_M_start + __pos, __s, __s + __len);
+ return *this;
+ }
+
+ _Self& insert(size_type __pos, size_type __n, _CharT __c) {
+ if (__pos > size())
+ this->_M_throw_out_of_range();
+ if (size() > max_size() - __n)
+ this->_M_throw_length_error();
+ insert(begin() + __pos, __n, __c);
+ return *this;
+ }
+
+ iterator insert(iterator __p, _CharT __c) {
+ _STLP_FIX_LITERAL_BUG(__p)
+ if (__p == end()) {
+ push_back(__c);
+ return this->_M_finish - 1;
+ }
+ else
+ return _M_insert_aux(__p, __c);
+ }
+
+ void insert(iterator __p, size_t __n, _CharT __c);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ // Check to see if _InputIterator is an integer type. If so, then
+ // it can't be an iterator.
+ template <class _InputIter> void insert(iterator __p, _InputIter __first, _InputIter __last) {
+ typedef typename _Is_integer<_InputIter>::_Integral _Integral;
+ _M_insert_dispatch(__p, __first, __last, _Integral());
+ }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ void insert(iterator __p, const _CharT* __first, const _CharT* __last);
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+private: // Helper functions for insert.
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _InputIter> void insert(iterator __p, _InputIter __first, _InputIter __last,
+ const input_iterator_tag &)
+ {
+ for ( ; __first != __last; ++__first) {
+ __p = insert(__p, *__first);
+ ++__p;
+ }
+ }
+
+ template <class _ForwardIter>
+ void insert(iterator __position, _ForwardIter __first, _ForwardIter __last,
+ const forward_iterator_tag &) {
+ if (__first != __last) {
+ difference_type __n = distance(__first, __last);
+ if (this->_M_end_of_storage._M_data - this->_M_finish >= __n + 1) {
+ const difference_type __elems_after = this->_M_finish - __position;
+ pointer __old_finish = this->_M_finish;
+ if (__elems_after >= __n) {
+ uninitialized_copy((this->_M_finish - __n) + 1, this->_M_finish + 1,
+ this->_M_finish + 1);
+ this->_M_finish += __n;
+ _Traits::move(__position + __n,
+ __position, (__elems_after - __n) + 1);
+ _M_move(__first, __last, __position);
+ }
+ else {
+ _ForwardIter __mid = __first;
+ advance(__mid, __elems_after + 1);
+ uninitialized_copy(__mid, __last, this->_M_finish + 1);
+ this->_M_finish += __n - __elems_after;
+ _STLP_TRY {
+ uninitialized_copy(__position, __old_finish + 1, this->_M_finish);
+ this->_M_finish += __elems_after;
+ }
+ _STLP_UNWIND((_STLP_STD::_Destroy(__old_finish + 1, this->_M_finish),
+ this->_M_finish = __old_finish));
+ _M_move(__first, __mid, __position);
+ }
+ }
+ else {
+ const size_type __old_size = size();
+ const size_type __len
+ = __old_size + (max)(__old_size, __STATIC_CAST(size_type,__n)) + 1;
+ pointer __new_start = this->_M_end_of_storage.allocate(__len);
+ pointer __new_finish = __new_start;
+ _STLP_TRY {
+ __new_finish = uninitialized_copy(this->_M_start, __position, __new_start);
+ __new_finish = uninitialized_copy(__first, __last, __new_finish);
+ __new_finish
+ = uninitialized_copy(__position, this->_M_finish, __new_finish);
+ _M_construct_null(__new_finish);
+ }
+ _STLP_UNWIND((_STLP_STD::_Destroy(__new_start,__new_finish),
+ this->_M_end_of_storage.deallocate(__new_start,__len)));
+ _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+ this->_M_deallocate_block();
+ this->_M_start = __new_start;
+ this->_M_finish = __new_finish;
+ this->_M_end_of_storage._M_data = __new_start + __len;
+ }
+ }
+ }
+
+ template <class _Integer> void _M_insert_dispatch(iterator __p, _Integer __n, _Integer __x,
+ const __true_type&) {
+ insert(__p, (size_type) __n, (_CharT) __x);
+ }
+
+ template <class _InputIter> void _M_insert_dispatch(iterator __p, _InputIter __first, _InputIter __last,
+ const __false_type&) {
+ insert(__p, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+ }
+
+ template <class _InputIterator> void
+ _M_copy(_InputIterator __first, _InputIterator __last, pointer __result) {
+ for ( ; __first != __last; ++__first, ++__result)
+ _Traits::assign(*__result, *__first);
+ }
+
+ template <class _InputIterator>
+ void _M_move(_InputIterator __first, _InputIterator __last, pointer __result) {
+ //call _M_copy as being here means that __result is not within [__first, __last)
+ for ( ; __first != __last; ++__first, ++__result)
+ _Traits::assign(*__result, *__first);
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ pointer _M_insert_aux(pointer, _CharT);
+
+ void
+ _M_copy(const _CharT* __first, const _CharT* __last, _CharT* __result) {
+ _Traits::copy(__result, __first, __last - __first);
+ }
+ void _M_move(const _CharT* __first, const _CharT* __last, _CharT* __result) {
+ _Traits::move(__result, __first, __last - __first);
+ }
+
+public: // Erase.
+
+ _Self& erase(size_type __pos = 0, size_type __n = npos) {
+ if (__pos > size())
+ this->_M_throw_out_of_range();
+ erase(begin() + __pos, begin() + __pos + (min) (__n, size() - __pos));
+ return *this;
+ }
+
+ iterator erase(iterator __position) {
+ // The move includes the terminating _CharT().
+ _Traits::move(__position, __position + 1, this->_M_finish - __position);
+ _STLP_STD::_Destroy(this->_M_finish);
+ --this->_M_finish;
+ return __position;
+ }
+
+ iterator erase(iterator __first, iterator __last) {
+ if (__first != __last) {
+ // The move includes the terminating _CharT().
+ traits_type::move(__first, __last, (this->_M_finish - __last) + 1);
+ pointer __new_finish = this->_M_finish - (__last - __first);
+ _STLP_STD::_Destroy(__new_finish + 1, this->_M_finish + 1);
+ this->_M_finish = __new_finish;
+ }
+ return __first;
+ }
+
+public: // Replace. (Conceptually equivalent
+ // to erase followed by insert.)
+ _Self& replace(size_type __pos, size_type __n,
+ const _Self& __s) {
+ if (__pos > size())
+ this->_M_throw_out_of_range();
+ const size_type __len = (min) (__n, size() - __pos);
+ if (size() - __len >= max_size() - __s.size())
+ this->_M_throw_length_error();
+ return replace(begin() + __pos, begin() + __pos + __len,
+ __s._M_start, __s._M_finish);
+ }
+
+ _Self& replace(size_type __pos1, size_type __n1,
+ const _Self& __s,
+ size_type __pos2, size_type __n2) {
+ if (__pos1 > size() || __pos2 > __s.size())
+ this->_M_throw_out_of_range();
+ const size_type __len1 = (min) (__n1, size() - __pos1);
+ const size_type __len2 = (min) (__n2, __s.size() - __pos2);
+ if (size() - __len1 >= max_size() - __len2)
+ this->_M_throw_length_error();
+ return replace(begin() + __pos1, begin() + __pos1 + __len1,
+ __s._M_start + __pos2, __s._M_start + __pos2 + __len2);
+ }
+
+ _Self& replace(size_type __pos, size_type __n1,
+ const _CharT* __s, size_type __n2) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ if (__pos > size())
+ this->_M_throw_out_of_range();
+ const size_type __len = (min) (__n1, size() - __pos);
+ if (__n2 > max_size() || size() - __len >= max_size() - __n2)
+ this->_M_throw_length_error();
+ return replace(begin() + __pos, begin() + __pos + __len,
+ __s, __s + __n2);
+ }
+
+ _Self& replace(size_type __pos, size_type __n1,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ if (__pos > size())
+ this->_M_throw_out_of_range();
+ const size_type __len = (min) (__n1, size() - __pos);
+ const size_type __n2 = _Traits::length(__s);
+ if (__n2 > max_size() || size() - __len >= max_size() - __n2)
+ this->_M_throw_length_error();
+ return replace(begin() + __pos, begin() + __pos + __len,
+ __s, __s + _Traits::length(__s));
+ }
+
+ _Self& replace(size_type __pos, size_type __n1,
+ size_type __n2, _CharT __c) {
+ if (__pos > size())
+ this->_M_throw_out_of_range();
+ const size_type __len = (min) (__n1, size() - __pos);
+ if (__n2 > max_size() || size() - __len >= max_size() - __n2)
+ this->_M_throw_length_error();
+ return replace(begin() + __pos, begin() + __pos + __len, __n2, __c);
+ }
+
+ _Self& replace(iterator __first, iterator __last,
+ const _Self& __s)
+ { return replace(__first, __last, __s._M_start, __s._M_finish); }
+
+ _Self& replace(iterator __first, iterator __last,
+ const _CharT* __s, size_type __n)
+ { _STLP_FIX_LITERAL_BUG(__s) return replace(__first, __last, __s, __s + __n); }
+
+ _Self& replace(iterator __first, iterator __last,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return replace(__first, __last, __s, __s + _Traits::length(__s));
+ }
+
+ _Self& replace(iterator __first, iterator __last,
+ size_type __n, _CharT __c);
+
+ // Check to see if _InputIterator is an integer type. If so, then
+ // it can't be an iterator.
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIter> _Self& replace(iterator __first, iterator __last,
+ _InputIter __f, _InputIter __l) {
+ typedef typename _Is_integer<_InputIter>::_Integral _Integral;
+ return _M_replace_dispatch(__first, __last, __f, __l, _Integral());
+ }
+#else /* _STLP_MEMBER_TEMPLATES */
+ _Self& replace(iterator __first, iterator __last,
+ const _CharT* __f, const _CharT* __l);
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+private: // Helper functions for replace.
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _Integer> _Self& _M_replace_dispatch(iterator __first, iterator __last,
+ _Integer __n, _Integer __x,
+ const __true_type&) {
+ return replace(__first, __last, (size_type) __n, (_CharT) __x);
+ }
+
+ template <class _InputIter> _Self& _M_replace_dispatch(iterator __first, iterator __last,
+ _InputIter __f, _InputIter __l,
+ const __false_type&) {
+ return replace(__first, __last, __f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter));
+ }
+
+ template <class _InputIter> _Self& replace(iterator __first, iterator __last,
+ _InputIter __f, _InputIter __l, const input_iterator_tag &) {
+ for ( ; __first != __last && __f != __l; ++__first, ++__f)
+ _Traits::assign(*__first, *__f);
+
+ if (__f == __l)
+ erase(__first, __last);
+ else
+ insert(__last, __f, __l);
+ return *this;
+ }
+
+ template <class _InputIter>
+ _Self& replace(iterator __first, iterator __last,
+ _InputIter __f, _InputIter __l, const random_access_iterator_tag &) {
+ //might be overlapping
+ if (_M_inside(__f)) {
+ difference_type __n = __l - __f;
+ const difference_type __len = __last - __first;
+ if (__len >= __n) {
+ _M_move(__f, __l, __first);
+ erase(__first + __n, __last);
+ }
+ else {
+ _InputIter __m = __f + __len;
+ if ((__l <= __first) || (__f >= __last)) {
+ //no overlap:
+ _M_copy(__f, __m, __first);
+ insert(__last, __m, __l);
+ }
+ else {
+ //we have to take care of reallocation:
+ const difference_type __off_dest = __first - this->begin();
+ const difference_type __off_src = __f - this->begin();
+ insert(__last, __m, __l);
+ _Traits::move(begin() + __off_dest, begin() + __off_src, __n);
+ }
+ }
+ return *this;
+ }
+ else {
+ return replace(__first, __last, __f, __l, forward_iterator_tag());
+ }
+ }
+
+
+ template <class _ForwardIter> _Self& replace(iterator __first, iterator __last,
+ _ForwardIter __f, _ForwardIter __l,
+ const forward_iterator_tag &) {
+ difference_type __n = distance(__f, __l);
+ const difference_type __len = __last - __first;
+ if (__len >= __n) {
+ _M_copy(__f, __l, __first);
+ erase(__first + __n, __last);
+ }
+ else {
+ _ForwardIter __m = __f;
+ advance(__m, __len);
+ _M_copy(__f, __m, __first);
+ insert(__last, __m, __l);
+ }
+ return *this;
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public: // Other modifier member functions.
+
+ size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const {
+ _STLP_FIX_LITERAL_BUG(__s)
+ if (__pos > size())
+ this->_M_throw_out_of_range();
+ const size_type __len = (min) (__n, size() - __pos);
+ _Traits::copy(__s, this->_M_start + __pos, __len);
+ return __len;
+ }
+
+ void swap(_Self& __s) {
+ _STLP_STD::swap(this->_M_start, __s._M_start);
+ _STLP_STD::swap(this->_M_finish, __s._M_finish);
+ _STLP_STD::swap(this->_M_end_of_storage, __s._M_end_of_storage);
+ }
+
+public: // Conversion to C string.
+
+ const _CharT* c_str() const { return this->_M_start; }
+ const _CharT* data() const { return this->_M_start; }
+
+public: // find.
+
+ size_type find(const _Self& __s, size_type __pos = 0) const
+ { return find(__s._M_start, __pos, __s.size()); }
+
+ size_type find(const _CharT* __s, size_type __pos = 0) const
+ { _STLP_FIX_LITERAL_BUG(__s) return find(__s, __pos, _Traits::length(__s)); }
+
+ size_type find(const _CharT* __s, size_type __pos, size_type __n) const;
+
+ // WIE: Versant schema compiler 5.2.2 ICE workaround
+ size_type find(_CharT __c) const
+ { return find(__c, 0) ; }
+ size_type find(_CharT __c, size_type __pos /* = 0 */) const;
+
+public: // rfind.
+
+ size_type rfind(const _Self& __s, size_type __pos = npos) const
+ { return rfind(__s._M_start, __pos, __s.size()); }
+
+ size_type rfind(const _CharT* __s, size_type __pos = npos) const
+ { _STLP_FIX_LITERAL_BUG(__s) return rfind(__s, __pos, _Traits::length(__s)); }
+
+ size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type rfind(_CharT __c, size_type __pos = npos) const;
+
+public: // find_first_of
+
+ size_type find_first_of(const _Self& __s, size_type __pos = 0) const
+ { return find_first_of(__s._M_start, __pos, __s.size()); }
+
+ size_type find_first_of(const _CharT* __s, size_type __pos = 0) const
+ { _STLP_FIX_LITERAL_BUG(__s) return find_first_of(__s, __pos, _Traits::length(__s)); }
+
+ size_type find_first_of(const _CharT* __s, size_type __pos,
+ size_type __n) const;
+
+ size_type find_first_of(_CharT __c, size_type __pos = 0) const
+ { return find(__c, __pos); }
+
+public: // find_last_of
+
+ size_type find_last_of(const _Self& __s,
+ size_type __pos = npos) const
+ { return find_last_of(__s._M_start, __pos, __s.size()); }
+
+ size_type find_last_of(const _CharT* __s, size_type __pos = npos) const
+ { _STLP_FIX_LITERAL_BUG(__s) return find_last_of(__s, __pos, _Traits::length(__s)); }
+
+ size_type find_last_of(const _CharT* __s, size_type __pos,
+ size_type __n) const;
+
+ size_type find_last_of(_CharT __c, size_type __pos = npos) const {
+ return rfind(__c, __pos);
+ }
+
+public: // find_first_not_of
+
+ size_type find_first_not_of(const _Self& __s,
+ size_type __pos = 0) const
+ { return find_first_not_of(__s._M_start, __pos, __s.size()); }
+
+ size_type find_first_not_of(const _CharT* __s, size_type __pos = 0) const
+ { _STLP_FIX_LITERAL_BUG(__s) return find_first_not_of(__s, __pos, _Traits::length(__s)); }
+
+ size_type find_first_not_of(const _CharT* __s, size_type __pos,
+ size_type __n) const;
+
+ size_type find_first_not_of(_CharT __c, size_type __pos = 0) const;
+
+public: // find_last_not_of
+
+ size_type find_last_not_of(const _Self& __s,
+ size_type __pos = npos) const
+ { return find_last_not_of(__s._M_start, __pos, __s.size()); }
+
+ size_type find_last_not_of(const _CharT* __s, size_type __pos = npos) const
+ { _STLP_FIX_LITERAL_BUG(__s) return find_last_not_of(__s, __pos, _Traits::length(__s)); }
+
+ size_type find_last_not_of(const _CharT* __s, size_type __pos,
+ size_type __n) const;
+
+ size_type find_last_not_of(_CharT __c, size_type __pos = npos) const;
+
+public: // Substring.
+
+ _Self substr(size_type __pos = 0, size_type __n = npos) const {
+ if (__pos > size())
+ this->_M_throw_out_of_range();
+ return _Self(this->_M_start + __pos,
+ this->_M_start + __pos + (min) (__n, size() - __pos));
+ }
+
+public: // Compare
+
+ int compare(const _Self& __s) const
+ { return _M_compare(this->_M_start, this->_M_finish, __s._M_start, __s._M_finish); }
+
+ int compare(size_type __pos1, size_type __n1,
+ const _Self& __s) const {
+ if (__pos1 > size())
+ this->_M_throw_out_of_range();
+ return _M_compare(this->_M_start + __pos1,
+ this->_M_start + __pos1 + (min) (__n1, size() - __pos1),
+ __s._M_start, __s._M_finish);
+ }
+
+ int compare(size_type __pos1, size_type __n1,
+ const _Self& __s,
+ size_type __pos2, size_type __n2) const {
+ if (__pos1 > size() || __pos2 > __s.size())
+ this->_M_throw_out_of_range();
+ return _M_compare(this->_M_start + __pos1,
+ this->_M_start + __pos1 + (min) (__n1, size() - __pos1),
+ __s._M_start + __pos2,
+ __s._M_start + __pos2 + (min) (__n2, __s.size() - __pos2));
+ }
+
+ int compare(const _CharT* __s) const {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return _M_compare(this->_M_start, this->_M_finish, __s, __s + _Traits::length(__s));
+ }
+
+ int compare(size_type __pos1, size_type __n1, const _CharT* __s) const {
+ _STLP_FIX_LITERAL_BUG(__s)
+ if (__pos1 > size())
+ this->_M_throw_out_of_range();
+ return _M_compare(this->_M_start + __pos1,
+ this->_M_start + __pos1 + (min) (__n1, size() - __pos1),
+ __s, __s + _Traits::length(__s));
+ }
+
+ int compare(size_type __pos1, size_type __n1, const _CharT* __s,
+ size_type __n2) const {
+ _STLP_FIX_LITERAL_BUG(__s)
+ if (__pos1 > size())
+ this->_M_throw_out_of_range();
+ return _M_compare(this->_M_start + __pos1,
+ this->_M_start + __pos1 + (min) (__n1, size() - __pos1),
+ __s, __s + __n2);
+ }
+
+public: // Helper functions for compare.
+
+ static int _STLP_CALL _M_compare(const _CharT* __f1, const _CharT* __l1,
+ const _CharT* __f2, const _CharT* __l2) {
+ const ptrdiff_t __n1 = __l1 - __f1;
+ const ptrdiff_t __n2 = __l2 - __f2;
+ const int cmp = _Traits::compare(__f1, __f2, (min) (__n1, __n2));
+ return cmp != 0 ? cmp : (__n1 < __n2 ? -1 : (__n1 > __n2 ? 1 : 0));
+ }
+};
+
+#if ! defined (__STLP_STATIC_CONST_INIT_BUG) && \
+ __GNUC__ == 2 && __GNUC_MINOR__ == 96
+template <class _CharT, class _Traits, class _Alloc>
+const size_t basic_string<_CharT, _Traits, _Alloc>::npos = ~(size_t) 0;
+#endif
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_string<char, char_traits<char>, allocator<char> >;
+# if defined (_STLP_HAS_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+// ------------------------------------------------------------
+// Non-member functions.
+
+template <class _CharT, class _Traits, class _Alloc> inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const basic_string<_CharT,_Traits,_Alloc>& __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y)
+{
+ typedef basic_string<_CharT,_Traits,_Alloc> _Str;
+ typedef typename _Str::_Reserve_t _Reserve_t;
+# ifdef __GNUC__
+ // gcc counts this as a function
+ _Str __result = _Str(_Reserve_t(),__s.size() + __y.size());
+# else
+ _Str __result(_Reserve_t(), __s.size() + __y.size());
+# endif
+ __result.append(__s);
+ __result.append(__y);
+ return __result;
+}
+
+# if defined (__GNUC__) || defined (__MLCCPP__)
+# define _STLP_INIT_AMBIGUITY 1
+# endif
+
+template <class _CharT, class _Traits, class _Alloc> inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ typedef basic_string<_CharT,_Traits,_Alloc> _Str;
+ typedef typename _Str::_Reserve_t _Reserve_t;
+ const size_t __n = _Traits::length(__s);
+# ifdef _STLP_INIT_AMBIGUITY
+ _Str __result = _Str(_Reserve_t(), __n + __y.size());
+# else
+ _Str __result(_Reserve_t(), __n + __y.size());
+# endif
+ __result.append(__s, __s + __n);
+ __result.append(__y);
+ return __result;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(_CharT __c,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ typedef basic_string<_CharT,_Traits,_Alloc> _Str;
+ typedef typename _Str::_Reserve_t _Reserve_t;
+# ifdef _STLP_INIT_AMBIGUITY
+ _Str __result = _Str(_Reserve_t(), 1 + __y.size());
+# else
+ _Str __result(_Reserve_t(), 1 + __y.size());
+# endif
+ __result.push_back(__c);
+ __result.append(__y);
+ return __result;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ typedef basic_string<_CharT,_Traits,_Alloc> _Str;
+ typedef typename _Str::_Reserve_t _Reserve_t;
+ const size_t __n = _Traits::length(__s);
+# ifdef _STLP_INIT_AMBIGUITY
+ _Str __result = _Str(_Reserve_t(), __x.size() + __n, __x.get_allocator());
+# else
+ _Str __result(_Reserve_t(), __x.size() + __n, __x.get_allocator());
+# endif
+ __result.append(__x);
+ __result.append(__s, __s + __n);
+ return __result;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT __c) {
+ typedef basic_string<_CharT,_Traits,_Alloc> _Str;
+ typedef typename _Str::_Reserve_t _Reserve_t;
+# ifdef _STLP_INIT_AMBIGUITY
+ _Str __result = _Str(_Reserve_t(), __x.size() + 1, __x.get_allocator());
+# else
+ _Str __result(_Reserve_t(), __x.size() + 1, __x.get_allocator());
+# endif
+ __result.append(__x);
+ __result.push_back(__c);
+ return __result;
+}
+
+# undef _STLP_INIT_AMBIGUITY
+
+// Operator== and operator!=
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator==(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return __x.size() == __y.size() && _Traits::compare(__x.data(), __y.data(), __x.size()) == 0;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator==(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ size_t __n = _Traits::length(__s);
+ return __n == __y.size() && _Traits::compare(__s, __y.data(), __n) == 0;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator==(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ size_t __n = _Traits::length(__s);
+ return __x.size() == __n && _Traits::compare(__x.data(), __s, __n) == 0;
+}
+
+// Operator< (and also >, <=, and >=).
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator<(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return basic_string<_CharT,_Traits,_Alloc> ::_M_compare(__x.begin(), __x.end(),
+ __y.begin(), __y.end()) < 0;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator<(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ size_t __n = _Traits::length(__s);
+ return basic_string<_CharT,_Traits,_Alloc> ::_M_compare(__s, __s + __n, __y.begin(), __y.end()) < 0;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator<(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ size_t __n = _Traits::length(__s);
+ return basic_string<_CharT,_Traits,_Alloc> ::_M_compare(__x.begin(), __x.end(), __s, __s + __n) < 0;
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator!=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return !(__x == __y);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator>(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return __y < __x;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator<=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return !(__y < __x);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator>=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator!=(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return !(__s == __y);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator!=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return !(__x == __s);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator>(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return __y < __s;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator>(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return __s < __x;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator<=(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return !(__y < __s);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator<=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return !(__s < __x);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator>=(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return !(__s < __y);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator>=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return !(__x < __s);
+}
+
+
+// Swap.
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class _CharT, class _Traits, class _Alloc> inline void _STLP_CALL
+swap(basic_string<_CharT,_Traits,_Alloc>& __x,
+ basic_string<_CharT,_Traits,_Alloc>& __y) {
+ __x.swap(__y);
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+template <class _CharT, class _Traits, class _Alloc> void _STLP_CALL _S_string_copy(const basic_string<_CharT,_Traits,_Alloc>& __s,
+ _CharT* __buf,
+ size_t __n);
+
+# undef basic_string
+
+#if defined(_STLP_WINCE)
+// A couple of functions to transfer between ASCII/Unicode
+
+wstring __ASCIIToWide(const char *ascii);
+string __WideToASCII(const wchar_t *wide);
+#endif
+
+_STLP_END_NAMESPACE
+
+# ifdef _STLP_DEBUG
+# include <stl/debug/_string.h>
+# endif
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_string.c>
+# endif
+
+# include <stl/_string_io.h>
+# include <stl/_string_hash.h>
+
+#endif /* _STLP_STRING_H */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_string_fwd.c b/src/STLport/stl/_string_fwd.c
new file mode 100644
index 0000000..509ac82
--- /dev/null
+++ b/src/STLport/stl/_string_fwd.c
@@ -0,0 +1,48 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRING_FWD_H
+# include <stl/_string_fwd.h>
+#endif
+
+#if !defined ( _STLP_STRING_FWD_C) && ! defined (_STLP_OWN_IOSTREAMS)
+#define _STLP_STRING_FWD_C
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT, class _Traits, class _Alloc>
+const char* _STLP_CALL
+__get_c_string(const basic_string<_CharT,_Traits,_Alloc>& __str) {
+ return __str.c_str();
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_STRING_FWD_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_string_fwd.h b/src/STLport/stl/_string_fwd.h
new file mode 100644
index 0000000..e90a00b
--- /dev/null
+++ b/src/STLport/stl/_string_fwd.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRING_FWD_H
+#define _STLP_STRING_FWD_H
+
+#ifndef _STLP_IOSFWD
+# include <iosfwd>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if !defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
+template <class _CharT,
+ class _Traits = char_traits<_CharT>,
+ class _Alloc = allocator<_CharT> >
+class basic_string;
+# else
+template <class _CharT,
+ class _Traits,
+ class _Alloc>
+class basic_string;
+# endif /* _STLP_LIMITED_DEFAULT_TEMPLATES */
+
+typedef basic_string<char, char_traits<char>, allocator<char> > string;
+
+# ifdef _STLP_HAS_WCHAR_T
+typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
+# endif
+
+# ifdef _STLP_OWN_IOSTREAMS
+_STLP_DECLSPEC const char* _STLP_CALL
+__get_c_string(const string& __str);
+# else
+template <class _CharT, class _Traits, class _Alloc>
+const char* _STLP_CALL
+__get_c_string(const basic_string<_CharT, _Traits, _Alloc>& __str);
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_STRING_FWD_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_string_hash.h b/src/STLport/stl/_string_hash.h
new file mode 100644
index 0000000..acf8f04
--- /dev/null
+++ b/src/STLport/stl/_string_hash.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRING_HASH_H
+# define _STLP_STRING_HASH_H
+
+#ifndef _STLP_HASH_FUN_H
+# include <stl/_hash_fun.h>
+#endif
+
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT, class _Traits, class _Alloc>
+_STLP_INLINE_LOOP size_t
+__stl_string_hash(const basic_string<_CharT,_Traits,_Alloc>& __s) {
+ unsigned long __h = 0;
+ typedef typename basic_string<_CharT,_Traits,_Alloc>::const_pointer const_ptr;
+ size_t __len = __s.size();
+ const _CharT* __data = __s.data();
+ for ( size_t __i = 0; __i < __len; ++__i)
+ __h = 5*__h + __data[__i];
+ return size_t(__h);
+}
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+template <class _CharT, class _Traits, class _Alloc>
+struct hash<basic_string<_CharT,_Traits,_Alloc> > {
+ size_t operator()(const basic_string<_CharT,_Traits,_Alloc>& __s) const
+ { return __stl_string_hash(__s); }
+};
+
+#else
+
+_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC hash<string> {
+ size_t operator()(const string& __s) const
+ { return __stl_string_hash(__s); }
+};
+
+# if defined (_STLP_HAS_WCHAR_T)
+_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC hash<wstring> {
+ size_t operator()(const wstring& __s) const
+ { return __stl_string_hash(__s); }
+};
+# endif
+
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+_STLP_END_NAMESPACE
+
+#endif
diff --git a/src/STLport/stl/_string_io.c b/src/STLport/stl/_string_io.c
new file mode 100644
index 0000000..973b6c4
--- /dev/null
+++ b/src/STLport/stl/_string_io.c
@@ -0,0 +1,334 @@
+#ifndef _STLP_STRING_IO_C
+#define _STLP_STRING_IO_C
+
+#ifndef _STLP_STRING_IO_H
+# include <stl/_string_io.h>
+#endif
+
+#ifndef _STLP_INTERNAL_CTYPE_H
+# include <stl/_ctype.h>
+#endif
+
+# ifdef _STLP_DEBUG
+# define basic_string _Nondebug_string
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_OWN_IOSTREAMS)
+# define _STLP_USING_IO
+# else
+# define _STLP_USING_IO _STLP_USING_VENDOR_STD
+# endif
+
+#if defined (_STLP_USE_NEW_IOSTREAMS)
+
+template <class _CharT, class _Traits>
+bool _STLP_CALL
+__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os,
+ basic_streambuf<_CharT, _Traits>* __buf,
+ size_t __n)
+{
+ _CharT __f = __os.fill();
+ size_t __i;
+ bool __ok = true;
+
+ for (__i = 0; __i < __n; ++__i)
+ __ok = __ok && !_Traits::eq_int_type(__buf->sputc(__f), _Traits::eof());
+ return __ok;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const basic_string<_CharT,_Traits,_Alloc>& __s)
+{
+
+ _STLP_USING_IO
+ typedef basic_ostream<_CharT, _Traits> __ostream;
+ typename __ostream::sentry __sentry(__os);
+ bool __ok = false;
+
+ if (__sentry) {
+ __ok = true;
+ size_t __n = __s.size();
+ size_t __pad_len = 0;
+ const bool __left = (__os.flags() & __ostream::left) != 0;
+ const size_t __w = __os.width(0);
+ basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf();
+
+ if (__n < __w) {
+ __pad_len = __w - __n;
+ }
+
+ if (!__left)
+ __ok = __stlp_string_fill(__os, __buf, __pad_len);
+
+ __ok = __ok && (__buf->sputn(__s.data(), streamsize(__n)) == streamsize(__n));
+
+ if (__left)
+ __ok = __ok && __stlp_string_fill(__os, __buf, __pad_len);
+ }
+
+ if (!__ok)
+ __os.setstate(__ostream::failbit);
+
+ return __os;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT,_Traits, _Alloc>& __s)
+{
+ _STLP_USING_IO
+ typedef basic_istream<_CharT, _Traits> __istream;
+ typename __istream::sentry __sentry(__is);
+
+ if (__sentry) {
+ basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
+ typedef ctype<_CharT> _C_type;
+
+#ifdef _STLP_OWN_IOSTREAMS
+ // const _C_type& _Ctype = use_facet<_C_type>(__loc);
+ const _C_type& _Ctype = *(const _C_type*)__is._M_ctype_facet();
+#else
+# if defined (_STLP_MSVC) && (_STLP_MSVC <= 1200 ) || defined (__ICL)
+ const locale& __loc = __is.getloc();
+ const _C_type& _Ctype = use_facet(__loc , ( _C_type * ) 0, true);
+# elif defined (__SUNPRO_CC)
+ const locale& __loc = __is.getloc();
+ const _C_type& _Ctype = use_facet(__loc , ( _C_type * ) 0);
+# else
+ const locale& __loc = __is.getloc();
+ const _C_type& _Ctype = use_facet<_C_type>(__loc);
+# endif
+#endif
+ __s.clear();
+ size_t __n = __is.width(0);
+ if (__n == 0)
+ __n = __STATIC_CAST(size_t,-1);
+ else
+ __s.reserve(__n);
+
+
+ while (__n-- > 0) {
+ typename _Traits::int_type __c1 = __buf->sbumpc();
+ if (_Traits::eq_int_type(__c1, _Traits::eof())) {
+ __is.setstate(__istream::eofbit);
+ break;
+ }
+ else {
+ _CharT __c = _Traits::to_char_type(__c1);
+
+ if (_Ctype.is(_C_type::space, __c)) {
+ if (_Traits::eq_int_type(__buf->sputbackc(__c), _Traits::eof()))
+ __is.setstate(__istream::failbit);
+ break;
+ }
+ else
+ __s.push_back(__c);
+ }
+ }
+
+ // If we have read no characters, then set failbit.
+ if (__s.size() == 0)
+ __is.setstate(__istream::failbit);
+ }
+ else
+ __is.setstate(__istream::failbit);
+
+ return __is;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+getline(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT,_Traits,_Alloc>& __s,
+ _CharT __delim)
+{
+ _STLP_USING_IO
+ typedef basic_istream<_CharT, _Traits> __istream;
+ size_t __nread = 0;
+ typename basic_istream<_CharT, _Traits>::sentry __sentry(__is, true);
+ if (__sentry) {
+ basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
+ __s.clear();
+
+ while (__nread < __s.max_size()) {
+ int __c1 = __buf->sbumpc();
+ if (_Traits::eq_int_type(__c1, _Traits::eof())) {
+ __is.setstate(__istream::eofbit);
+ break;
+ }
+ else {
+ ++__nread;
+ _CharT __c = _Traits::to_char_type(__c1);
+ if (!_Traits::eq(__c, __delim))
+ __s.push_back(__c);
+ else
+ break; // Character is extracted but not appended.
+ }
+ }
+ }
+ if (__nread == 0 || __nread >= __s.max_size())
+ __is.setstate(__istream::failbit);
+
+ return __is;
+}
+
+#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
+
+// (reg) For Watcom IO, _OSTREAM_DLL tells if ostream class is in .exe or in .dll
+
+template <class _CharT, class _Traits, class _Alloc>
+_OSTREAM_DLL& _STLP_CALL operator<<(_OSTREAM_DLL& __os,
+ const basic_string<_CharT,_Traits,_Alloc>& __s)
+{
+ _STLP_USING_IO
+ streambuf* __buf = __os.rdbuf();
+ if (__buf) {
+ size_t __n = __s.size();
+ size_t __pad_len = 0;
+ const bool __left = (__os.flags() & ios::left) !=0;
+ const size_t __w = __os.width();
+
+ if (__n < __w) {
+ __pad_len = __w - __n;
+ }
+
+ if (!__left)
+ __stlp_string_fill(__os, __buf, __pad_len);
+
+ const size_t __nwritten = __buf->sputn(__s.data(), __n);
+
+ if (__left)
+ __stlp_string_fill(__os, __buf, __pad_len);
+
+ if (__nwritten != __n)
+ __os.clear(__os.rdstate() | ios::failbit);
+
+ __os.width(0);
+ }
+ else
+ __os.clear(__os.rdstate() | ios::badbit);
+
+ return __os;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+_ISTREAM_DLL& _STLP_CALL operator>>(_ISTREAM_DLL& __is, basic_string<_CharT,_Traits,_Alloc>& __s)
+{
+ _STLP_USING_IO
+ if (!__is)
+ return __is;
+
+ streambuf* __buf = __is.rdbuf();
+ if (__buf) {
+
+ if (__is.flags() & ios::skipws) {
+ // _CharT __c;
+ int __c;
+ do {
+ __c = __buf->sbumpc();
+ }
+ while (__c != EOF && isspace((unsigned char)__c));
+
+ if (__c == EOF) {
+ __is.clear(__is.rdstate() | ios::eofbit | ios::failbit);
+ }
+ else {
+ if (__buf->sputbackc(__c) == EOF)
+ __is.clear(__is.rdstate() | ios::failbit);
+ }
+ }
+
+ // If we arrive at end of file (or fail for some other reason) while
+ // still discarding whitespace, then we don't try to read the string.
+ if (__is) {
+ __s.clear();
+
+ size_t __n = __is.width();
+ if (__n == 0)
+ __n = __STATIC_CAST(size_t,-1);
+ else
+ __s.reserve(__n);
+
+ while (__n-- > 0) {
+ int __c1 = __buf->sbumpc();
+ if (__c1 == EOF) {
+ __is.clear(__is.rdstate() | ios::eofbit);
+ break;
+ }
+ else {
+ _CharT __c = _Traits::to_char_type(__c1);
+
+ if (isspace((unsigned char) __c)) {
+ if (__buf->sputbackc(__c) == EOF)
+ __is.clear(__is.rdstate() | ios::failbit);
+ break;
+ }
+ else
+ __s.push_back(__c);
+ }
+ }
+
+ // If we have read no characters, then set failbit.
+ if (__s.size() == 0)
+ __is.clear(__is.rdstate() | ios::failbit);
+ }
+
+ __is.width(0);
+ }
+ else // We have no streambuf.
+ __is.clear(__is.rdstate() | ios::badbit);
+
+ return __is;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+_ISTREAM_DLL& _STLP_CALL getline(_ISTREAM_DLL& __is,
+ basic_string<_CharT,_Traits,_Alloc>& __s,
+ _CharT __delim)
+{
+ _STLP_USING_IO
+ streambuf* __buf = __is.rdbuf();
+ if (__buf) {
+ size_t __nread = 0;
+ if (__is) {
+ __s.clear();
+
+ while (__nread < __s.max_size()) {
+ int __c1 = __buf->sbumpc();
+ if (__c1 == EOF) {
+ __is.clear(__is.rdstate() | ios::eofbit);
+ break;
+ }
+ else {
+ ++__nread;
+ _CharT __c = _Traits::to_char_type(__c1);
+ if (!_Traits::eq(__c, __delim))
+ __s.push_back(__c);
+ else
+ break; // Character is extracted but not appended.
+ }
+ }
+ }
+
+ if (__nread == 0 || __nread >= __s.max_size())
+ __is.clear(__is.rdstate() | ios::failbit);
+ }
+ else
+ __is.clear(__is.rdstate() | ios::badbit);
+
+ return __is;
+}
+
+# endif /* _STLP_NEW_IOSTREAMS */
+
+_STLP_END_NAMESPACE
+
+// # undef _STLP_USING_IO
+# undef basic_string
+
+#endif
diff --git a/src/STLport/stl/_string_io.h b/src/STLport/stl/_string_io.h
new file mode 100644
index 0000000..c4b99e3
--- /dev/null
+++ b/src/STLport/stl/_string_io.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRING_IO_H
+#define _STLP_STRING_IO_H
+
+// this is for link-time instantiation
+#if !defined ( _STLP_STRING )
+# include <string>
+# endif
+
+//#ifndef _STLP_LOCALE
+//# include <locale>
+//#endif
+
+# ifdef _STLP_DEBUG
+# define basic_string _Nondebug_string
+# endif
+
+// I/O.
+_STLP_BEGIN_NAMESPACE
+
+#if defined (_STLP_USE_NEW_IOSTREAMS)
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const basic_string<_CharT,_Traits,_Alloc>& __s);
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT,_Traits,_Alloc>& __s);
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+getline(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT,_Traits,_Alloc>& __s,
+ _CharT __delim);
+
+# if !(defined (__BORLANDC__) && ! defined (_STLP_USE_OWN_NAMESPACE))
+
+template <class _CharT, class _Traits, class _Alloc>
+inline basic_istream<_CharT, _Traits>& _STLP_CALL
+getline(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT,_Traits,_Alloc>& __s)
+{
+ return getline(__is, __s, __is.widen('\n'));
+}
+# endif
+
+template <class _CharT, class _Traits>
+bool _STLP_CALL
+__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os,
+ basic_streambuf<_CharT, _Traits>* __buf,
+ size_t __n);
+#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
+
+// (reg) For Watcom IO, this tells if ostream class is in .exe or in .dll
+# ifdef _WPRTLINK
+typedef _WPRTLINK ostream _OSTREAM_DLL;
+typedef _WPRTLINK istream _ISTREAM_DLL;
+#else
+typedef ostream _OSTREAM_DLL;
+typedef istream _ISTREAM_DLL;
+#endif
+
+template <class _CharT, class _Traits, class _Alloc>
+_OSTREAM_DLL& _STLP_CALL operator<<(_OSTREAM_DLL& __os,
+ const basic_string<_CharT,_Traits,_Alloc>& __s);
+
+template <class _CharT, class _Traits, class _Alloc>
+_ISTREAM_DLL& _STLP_CALL operator>>(_ISTREAM_DLL& __is, basic_string<_CharT,_Traits,_Alloc>& __s);
+
+template <class _CharT, class _Traits, class _Alloc>
+_ISTREAM_DLL& _STLP_CALL getline(_ISTREAM_DLL& __is,
+ basic_string<_CharT,_Traits,_Alloc>& __s,
+ _CharT __delim);
+
+
+template <class _CharT, class _Traits, class _Alloc>
+inline _ISTREAM_DLL& _STLP_CALL
+getline(_ISTREAM_DLL& __is, basic_string<_CharT,_Traits,_Alloc>& __s)
+{
+ return getline(__is, __s, '\n');
+}
+
+inline void _STLP_CALL
+__stlp_string_fill(_OSTREAM_DLL& __os, streambuf* __buf, size_t __n)
+{
+ char __f = __os.fill();
+ size_t __i;
+
+ for (__i = 0; __i < __n; ++__i) __buf->sputc(__f);
+}
+
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+
+_STLP_END_NAMESPACE
+
+# undef basic_string
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_string_io.c>
+# endif
+
+#endif /* _STLP_STRING_IO_H */
diff --git a/src/STLport/stl/_strstream.h b/src/STLport/stl/_strstream.h
new file mode 100644
index 0000000..85bb7fc
--- /dev/null
+++ b/src/STLport/stl/_strstream.h
@@ -0,0 +1,141 @@
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+#include <stl/_streambuf.h>
+#endif
+#ifndef _STLP_ISTREAM
+#include <istream> // Includes <ostream>, <ios>, <iosfwd>
+#endif
+#ifndef _STLP_STRING_H
+#include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+#ifndef _STLP_USE_NAMESPACES
+# define strstream _STLP_strstream
+# define ostrstream _STLP_ostrstream
+# define istrstream _STLP_istrstream
+# define strstreambuf _STLP_strstreambuf
+#endif
+
+//----------------------------------------------------------------------
+// Class strstreambuf, a streambuf class that manages an array of char.
+// Note that this class is not a template.
+
+class _STLP_CLASS_DECLSPEC strstreambuf : public basic_streambuf<char, char_traits<char> >
+{
+public: // Types.
+ typedef char_traits<char> _Traits;
+ typedef basic_streambuf<char, char_traits<char> > _Base;
+ typedef void* (*__alloc_fn)(size_t);
+ typedef void (*__free_fn)(void*);
+public: // Constructor, destructor
+
+ explicit strstreambuf(streamsize _Initial_capacity = 0);
+
+ strstreambuf(__alloc_fn, __free_fn);
+
+ strstreambuf(char* __get, streamsize __n, char* __put = 0);
+ strstreambuf(signed char* __get, streamsize __n, signed char* __put = 0);
+ strstreambuf(unsigned char* __get, streamsize __n, unsigned char* __put=0);
+
+ strstreambuf(const char* __get, streamsize __n);
+ strstreambuf(const signed char* __get, streamsize __n);
+ strstreambuf(const unsigned char* __get, streamsize __n);
+
+ virtual ~strstreambuf();
+
+public: // strstreambuf operations.
+ void freeze(bool = true);
+ char* str();
+ int pcount() const;
+
+protected: // Overridden virtual member functions.
+ virtual int_type overflow(int_type __c = _Traits::eof());
+ virtual int_type pbackfail(int_type __c = _Traits::eof());
+ virtual int_type underflow();
+ virtual _Base* setbuf(char* __buf, streamsize __n);
+ virtual pos_type seekoff(off_type __off, ios_base::seekdir __dir,
+ ios_base::openmode __mode
+ = ios_base::in | ios_base::out);
+ virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode
+ = ios_base::in | ios_base::out);
+
+private: // Helper functions.
+ // Dynamic allocation, possibly using _M_alloc_fun and _M_free_fun.
+ char* _M_alloc(size_t);
+ void _M_free(char*);
+
+ // Helper function used in constructors.
+ void _M_setup(char* __get, char* __put, streamsize __n);
+private: // Data members.
+ __alloc_fn _M_alloc_fun;
+ __free_fn _M_free_fun;
+ bool _M_dynamic : 1;
+ bool _M_frozen : 1;
+ bool _M_constant : 1;
+};
+
+//----------------------------------------------------------------------
+// Class istrstream, an istream that manages a strstreambuf.
+
+class _STLP_CLASS_DECLSPEC istrstream : public basic_istream<char, char_traits<char> >
+{
+public:
+ explicit istrstream(char*);
+ explicit istrstream(const char*);
+ istrstream(char* , streamsize);
+ istrstream(const char*, streamsize);
+ virtual ~istrstream();
+
+ strstreambuf* rdbuf() const;
+ char* str();
+
+private:
+ strstreambuf _M_buf;
+};
+
+//----------------------------------------------------------------------
+// Class ostrstream
+
+class _STLP_CLASS_DECLSPEC ostrstream : public basic_ostream<char, char_traits<char> >
+{
+public:
+ ostrstream();
+ ostrstream(char*, int, ios_base::openmode = ios_base::out);
+ virtual ~ostrstream();
+
+ strstreambuf* rdbuf() const;
+ void freeze(bool = true);
+ char* str();
+ int pcount() const;
+
+private:
+ strstreambuf _M_buf;
+};
+
+//----------------------------------------------------------------------
+// Class strstream
+
+class _STLP_CLASS_DECLSPEC strstream : public basic_iostream<char, char_traits<char> >
+{
+public:
+ typedef char char_type;
+ typedef char_traits<char>::int_type int_type;
+ typedef char_traits<char>::pos_type pos_type;
+ typedef char_traits<char>::off_type off_type;
+
+ strstream();
+ strstream(char*, int, ios_base::openmode = ios_base::in | ios_base::out);
+ virtual ~strstream();
+
+ strstreambuf* rdbuf() const;
+ void freeze(bool = true);
+ int pcount() const;
+ char* str();
+
+private:
+ strstreambuf _M_buf;
+};
+
+_STLP_END_NAMESPACE
diff --git a/src/STLport/stl/_tempbuf.c b/src/STLport/stl/_tempbuf.c
new file mode 100644
index 0000000..b1eb21c
--- /dev/null
+++ b/src/STLport/stl/_tempbuf.c
@@ -0,0 +1,57 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_TEMPBUF_C
+#define _STLP_TEMPBUF_C
+
+#ifndef _STLP_INTERNAL_TEMPBUF_H
+# include <stl/_tempbuf.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp>
+pair<_Tp*, ptrdiff_t> _STLP_CALL
+__get_temporary_buffer(ptrdiff_t __len, _Tp*)
+{
+ if (__len > ptrdiff_t(INT_MAX / sizeof(_Tp)))
+ __len = INT_MAX / sizeof(_Tp);
+
+ while (__len > 0) {
+ _Tp* __tmp = (_Tp*) malloc((size_t)__len * sizeof(_Tp));
+ if (__tmp != 0)
+ return pair<_Tp*, ptrdiff_t>(__tmp, __len);
+ __len /= 2;
+ }
+
+ return pair<_Tp*, ptrdiff_t>((_Tp*)0, 0);
+}
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_TEMPBUF_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_tempbuf.h b/src/STLport/stl/_tempbuf.h
new file mode 100644
index 0000000..f6d342e
--- /dev/null
+++ b/src/STLport/stl/_tempbuf.h
@@ -0,0 +1,165 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_TEMPBUF_H
+#define _STLP_INTERNAL_TEMPBUF_H
+
+# ifndef _STLP_CLIMITS
+# include <climits>
+# endif
+# ifndef _STLP_CSTDLIB
+# include <cstdlib>
+# endif
+# ifndef _STLP_INTERNAL_UNINITIALIZED_H
+# include <stl/_uninitialized.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp>
+pair<_Tp*, ptrdiff_t> _STLP_CALL
+__get_temporary_buffer(ptrdiff_t __len, _Tp*);
+
+#ifndef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+
+template <class _Tp>
+inline pair<_Tp*, ptrdiff_t> _STLP_CALL get_temporary_buffer(ptrdiff_t __len) {
+ return __get_temporary_buffer(__len, (_Tp*) 0);
+}
+
+# if ! defined(_STLP_NO_EXTENSIONS)
+// This overload is not required by the standard; it is an extension.
+// It is supported for backward compatibility with the HP STL, and
+// because not all compilers support the language feature (explicit
+// function template arguments) that is required for the standard
+// version of get_temporary_buffer.
+template <class _Tp>
+inline pair<_Tp*, ptrdiff_t> _STLP_CALL
+get_temporary_buffer(ptrdiff_t __len, _Tp*) {
+ return __get_temporary_buffer(__len, (_Tp*) 0);
+}
+# endif
+#endif
+
+template <class _Tp>
+inline void _STLP_CALL return_temporary_buffer(_Tp* __p) {
+// SunPro brain damage
+ free((char*)__p);
+}
+
+template <class _ForwardIterator, class _Tp>
+class _Temporary_buffer {
+private:
+ ptrdiff_t _M_original_len;
+ ptrdiff_t _M_len;
+ _Tp* _M_buffer;
+
+ void _M_allocate_buffer() {
+ _M_original_len = _M_len;
+ _M_buffer = 0;
+
+ if (_M_len > (ptrdiff_t)(INT_MAX / sizeof(_Tp)))
+ _M_len = INT_MAX / sizeof(_Tp);
+
+ while (_M_len > 0) {
+ _M_buffer = (_Tp*) malloc(_M_len * sizeof(_Tp));
+ if (_M_buffer)
+ break;
+ _M_len /= 2;
+ }
+ }
+
+ void _M_initialize_buffer(const _Tp&, const __true_type&) {}
+ void _M_initialize_buffer(const _Tp& val, const __false_type&) {
+ uninitialized_fill_n(_M_buffer, _M_len, val);
+ }
+
+public:
+ ptrdiff_t size() const { return _M_len; }
+ ptrdiff_t requested_size() const { return _M_original_len; }
+ _Tp* begin() { return _M_buffer; }
+ _Tp* end() { return _M_buffer + _M_len; }
+
+ _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) {
+ // Workaround for a __type_traits bug in the pre-7.3 compiler.
+# if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION < 730
+ typedef typename __type_traits<_Tp>::is_POD_type _Trivial;
+# else
+ typedef typename __type_traits<_Tp>::has_trivial_default_constructor _Trivial;
+# endif
+ _STLP_TRY {
+ _M_len = distance(__first, __last);
+ _M_allocate_buffer();
+ if (_M_len > 0)
+ _M_initialize_buffer(*__first, _Trivial());
+ }
+ _STLP_UNWIND(free(_M_buffer); _M_buffer = 0; _M_len = 0);
+ }
+
+ ~_Temporary_buffer() {
+ _STLP_STD::_Destroy(_M_buffer, _M_buffer + _M_len);
+ free(_M_buffer);
+ }
+
+private:
+ // Disable copy constructor and assignment operator.
+ _Temporary_buffer(const _Temporary_buffer<_ForwardIterator, _Tp>&) {}
+ void operator=(const _Temporary_buffer<_ForwardIterator, _Tp>&) {}
+};
+
+# ifndef _STLP_NO_EXTENSIONS
+
+// Class temporary_buffer is not part of the standard. It is an extension.
+
+template <class _ForwardIterator,
+ class _Tp
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+ = typename iterator_traits<_ForwardIterator>::value_type
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+ >
+struct temporary_buffer : public _Temporary_buffer<_ForwardIterator, _Tp>
+{
+ temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
+ : _Temporary_buffer<_ForwardIterator, _Tp>(__first, __last) {}
+ ~temporary_buffer() {}
+};
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+_STLP_END_NAMESPACE
+
+# ifndef _STLP_LINK_TIME_INSTANTIATION
+# include <stl/_tempbuf.c>
+# endif
+
+#endif /* _STLP_INTERNAL_TEMPBUF_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_threads.c b/src/STLport/stl/_threads.c
new file mode 100644
index 0000000..31c2cfa
--- /dev/null
+++ b/src/STLport/stl/_threads.c
@@ -0,0 +1,172 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_THREADS_C
+#define _STLP_THREADS_C
+
+#ifndef _STLP_INTERNAL_THREADS_H
+# include <stl/_threads.h>
+#endif
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+# if defined(_STLP_SGI_THREADS)
+# include <time.h>
+# elif defined (_STLP_UNIX)
+# include <ctime>
+# if defined (_STLP_USE_NAMESPACES) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
+using _STLP_VENDOR_CSTD::time_t;
+# endif
+# include <sys/time.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if (_STLP_STATIC_TEMPLATE_DATA > 0)
+
+# ifdef _STLP_THREADS
+# if !defined(_STLP_ATOMIC_EXCHANGE) && (defined(_STLP_PTHREADS) || defined(_STLP_UITHREADS) || defined(_STLP_OS2THREADS) || defined(_STLP_USE_PTHREAD_SPINLOCK))
+template<int __dummy>
+_STLP_STATIC_MUTEX
+_Swap_lock_struct<__dummy>::_S_swap_lock _STLP_MUTEX_INITIALIZER;
+# endif
+# endif //_STLP_THREADS
+
+# ifndef _STLP_USE_PTHREAD_SPINLOCK
+template <int __inst>
+unsigned _STLP_mutex_spin<__inst>::__max = _STLP_mutex_spin<__inst>::__low_max;
+
+template <int __inst>
+unsigned _STLP_mutex_spin<__inst>::__last = 0;
+# endif // _STLP_USE_PTHREAD_SPINLOCK
+
+# else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+# if defined(_STLP_PTHREADS) || defined(_STLP_UITHREADS) || defined(_STLP_OS2THREADS)
+__DECLARE_INSTANCE(_STLP_STATIC_MUTEX, _Swap_lock_struct<0>::_S_swap_lock,
+ _STLP_MUTEX_INITIALIZER );
+# endif /* _STLP_PTHREADS */
+
+# ifndef _STLP_USE_PTHREAD_SPINLOCK
+__DECLARE_INSTANCE(unsigned, _STLP_mutex_spin<0>::__max, =30);
+__DECLARE_INSTANCE(unsigned, _STLP_mutex_spin<0>::__last, =0);
+# endif // _STLP_USE_PTHREAD_SPINLOCK
+
+# endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+#ifndef _STLP_USE_PTHREAD_SPINLOCK
+
+#ifdef _STLP_SPARC_SOLARIS_THREADS
+// underground function in libc.so; we do not want dependance on librt
+extern "C" int __nanosleep(const struct timespec*, struct timespec*);
+# define _STLP_NANOSLEEP __nanosleep
+#else
+# define _STLP_NANOSLEEP nanosleep
+#endif
+
+template <int __inst>
+void _STLP_CALL
+_STLP_mutex_spin<__inst>::_S_nsec_sleep(int __log_nsec) {
+# if defined(_STLP_WIN32THREADS)
+ if (__log_nsec <= 20) {
+ // Note from boost (www.boost.org):
+ // Changed to Sleep(1) from Sleep(0).
+ // According to MSDN, Sleep(0) will never yield
+ // to a lower-priority thread, whereas Sleep(1)
+ // will. Performance seems not to be affected.
+ Sleep(1);
+ } else {
+ Sleep(1 << (__log_nsec - 20));
+ }
+# elif defined(_STLP_OS2THREADS)
+ if (__log_nsec <= 20) {
+ DosSleep(0);
+ } else {
+ DosSleep(1 << (__log_nsec - 20));
+ }
+# elif defined (_STLP_UNIX)
+ timespec __ts;
+ /* Max sleep is 2**27nsec ~ 60msec */
+ __ts.tv_sec = 0;
+ __ts.tv_nsec = 1 << __log_nsec;
+ _STLP_NANOSLEEP(&__ts, 0);
+# endif
+ }
+
+
+template <int __inst>
+void _STLP_CALL
+_STLP_mutex_spin<__inst>::_M_do_lock(volatile __stl_atomic_t* __lock)
+{
+#if defined(_STLP_ATOMIC_EXCHANGE)
+ if (_Atomic_swap(__lock, 1)) {
+ unsigned __my_spin_max = _STLP_mutex_spin<0>::__max;
+ unsigned __my_last_spins = _STLP_mutex_spin<0>::__last;
+ volatile unsigned __junk = 17; // Value doesn't matter.
+ unsigned __i;
+
+ for (__i = 0; __i < __my_spin_max; ++__i) {
+ if (__i < __my_last_spins/2 || *__lock) {
+ __junk *= __junk; __junk *= __junk;
+ __junk *= __junk; __junk *= __junk;
+ } else {
+ if (!_Atomic_swap(__lock, 1)) {
+ // got it!
+ // Spinning worked. Thus we're probably not being scheduled
+ // against the other process with which we were contending.
+ // Thus it makes sense to spin longer the next time.
+ _STLP_mutex_spin<0>::__last = __i;
+ _STLP_mutex_spin<0>::__max = _STLP_mutex_spin<0>::__high_max;
+ return;
+ }
+ }
+ }
+
+ // We are probably being scheduled against the other process. Sleep.
+ _STLP_mutex_spin<0>::__max = _STLP_mutex_spin<0>::__low_max;
+
+ for (__i = 0 ;; ++__i) {
+ int __log_nsec = __i + 6;
+
+ if (__log_nsec > 27) __log_nsec = 27;
+ if (!_Atomic_swap(__lock, 1)) {
+ break;
+ }
+ _S_nsec_sleep(__log_nsec);
+ }
+
+ } /* first _Atomic_swap */
+# endif
+}
+#endif // _STLP_USE_PTHREAD_SPINLOCK
+
+_STLP_END_NAMESPACE
+
+# endif /* BUILDING_STLPORT */
+#endif /* _STLP_THREADS_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_threads.h b/src/STLport/stl/_threads.h
new file mode 100644
index 0000000..a383604
--- /dev/null
+++ b/src/STLport/stl/_threads.h
@@ -0,0 +1,721 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+// Stl_config.h should be included before this file.
+
+
+#ifndef _STLP_INTERNAL_THREADS_H
+#define _STLP_INTERNAL_THREADS_H
+
+// Supported threading models are native SGI, pthreads, uithreads
+// (similar to pthreads, but based on an earlier draft of the Posix
+// threads standard), and Win32 threads. Uithread support by Jochen
+// Schlick, 1999, and Solaris threads generalized to them.
+
+#ifndef _STLP_CONFIG_H
+#include <stl/_config.h>
+#endif
+
+# if ! defined (_STLP_CSTDDEF)
+# include <cstddef>
+# endif
+
+# if ! defined (_STLP_CSTDLIB)
+# include <cstdlib>
+# endif
+
+// On SUN and Mac OS X gcc, zero-initialization works just fine...
+# if defined (__sun) || ( defined(__GNUC__) && defined(__APPLE__) )
+# define _STLP_MUTEX_INITIALIZER
+# endif
+
+# if defined (_STLP_WIN32) || defined (__sgi) || defined (_STLP_SPARC_SOLARIS_THREADS)
+ typedef long __stl_atomic_t;
+# else
+# if defined (_STLP_USE_NAMESPACES) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
+// using _STLP_VENDOR_CSTD::size_t;
+using namespace _STLP_VENDOR_CSTD;
+# endif
+ typedef size_t __stl_atomic_t;
+#endif
+
+# if defined(_STLP_SGI_THREADS)
+# include <mutex.h>
+// Hack for SGI o32 compilers.
+#if !defined(__add_and_fetch) && \
+ (__mips < 3 || !(defined (_ABIN32) || defined(_ABI64)))
+# define __add_and_fetch(__l,__v) add_then_test((unsigned long*)__l,__v)
+# define __test_and_set(__l,__v) test_and_set(__l,__v)
+#endif /* o32 */
+
+# if __mips < 3 || !(defined (_ABIN32) || defined(_ABI64))
+# define _STLP_ATOMIC_EXCHANGE(__p, __q) test_and_set(__p, __q)
+# else
+# define _STLP_ATOMIC_EXCHANGE(__p, __q) __test_and_set((unsigned long*)__p, (unsigned long)__q)
+# endif
+
+# define _STLP_ATOMIC_INCREMENT(__x) __add_and_fetch(__x, 1)
+# define _STLP_ATOMIC_DECREMENT(__x) __add_and_fetch(__x, (size_t) -1)
+
+# elif defined (__GNUC__) && defined (__i386__) && defined (__unix__) && defined (_STLP_USE_INLINE_X86_SPINLOCK)
+
+// gcc on i386 linux, freebsd, etc.
+
+// This enables the memory caching on x86 linux. It is critical for SMP
+// without it the performace is DISMAL!
+static inline unsigned long __xchg(volatile __stl_atomic_t* target, int source)
+{
+
+ // The target is refernce in memory rather than the register
+ // because making a copy of it from memory to the register and
+ // back again would ruin the atomic nature of the call.
+ // the source does not need to be delt with atomicly so it can
+ // be copied about as needed.
+ //
+ // The casting of the source is used to prevent gcc from optimizing
+ // in such a way that breaks the atomic nature of this call.
+ //
+ __asm__ __volatile__("xchgl %1,%0"
+ :"=m" (*(volatile long *) target), "=r" (source)
+ :"m" (*(volatile long *) target), "r" (source) );
+ return source;
+
+ // The assembly above does the following atomicly:
+ // int temp=source;
+ // source=(int)(*target);
+ // (int)(*target)=temp;
+ // return source
+}
+
+static inline void __inc_and_fetch(volatile __stl_atomic_t* __x)
+{
+ // Referenced in memory rather than register to preserve the atomic nature.
+ //
+ __asm__ __volatile__(
+ "lock; incl %0"
+ :"=m" (*__x)
+ :"m" (*__x) );
+
+ // The assembly above does the following atomicly:
+ // ++(int)(*__x);
+
+}
+static inline void __dec_and_fetch(volatile __stl_atomic_t* __x)
+{
+ // Referenced in memory rather than register to preserve the atomic nature.
+ //
+ __asm__ __volatile__(
+ "lock; decl %0"
+ :"=m" (*__x)
+ :"m" (*__x) );
+
+ // The assembly above does the following atomicly:
+ // --(int)(*__x);
+}
+
+# define _STLP_ATOMIC_EXCHANGE(target, newValue) ((__xchg(target, newValue)))
+# define _STLP_ATOMIC_INCREMENT(__x) __inc_and_fetch(__x)
+# define _STLP_ATOMIC_DECREMENT(__x) __dec_and_fetch(__x)
+
+# elif defined(_STLP_PTHREADS)
+
+# include <pthread.h>
+# ifndef _STLP_USE_PTHREAD_SPINLOCK
+# if defined(PTHREAD_MUTEX_INITIALIZER) && !defined(_STLP_MUTEX_INITIALIZER)
+# define _STLP_MUTEX_INITIALIZER = { PTHREAD_MUTEX_INITIALIZER }
+# endif
+
+//HPUX variants have (on some platforms optional) non-standard "DCE" pthreads impl
+# if defined(_DECTHREADS_) && (defined(_PTHREAD_USE_D4) || defined(__hpux)) && !defined(_CMA_SUPPRESS_EXTERNALS_)
+# define _STLP_PTHREAD_ATTR_DEFAULT pthread_mutexattr_default
+# else
+# define _STLP_PTHREAD_ATTR_DEFAULT 0
+# endif
+# endif // !_STLP_USE_PTHREAD_SPINLOCK
+
+# elif defined(_STLP_WIN32THREADS)
+# if !defined (_STLP_WINDOWS_H_INCLUDED) && ! defined (_WINDOWS_H)
+# if ! (defined ( _STLP_MSVC ) || defined (__BORLANDC__) || defined (__ICL) || defined (__WATCOMC__) || defined (__MINGW32__) || defined (__DMC__))
+# ifdef _STLP_USE_MFC
+# include <afx.h>
+# else
+# include <windows.h>
+# endif
+# define _STLP_WINDOWS_H_INCLUDED
+# else
+// This section serves as a replacement for windows.h header for Visual C++
+extern "C" {
+# if (defined(_M_MRX000) || defined(_M_ALPHA) \
+ || (defined(_M_PPC) && (_MSC_VER >= 1000))) && !defined(RC_INVOKED)
+# define InterlockedIncrement _InterlockedIncrement
+# define InterlockedDecrement _InterlockedDecrement
+# define InterlockedExchange _InterlockedExchange
+# define _STLP_STDCALL
+# else
+# ifdef _MAC
+# define _STLP_STDCALL _cdecl
+# else
+# define _STLP_STDCALL __stdcall
+# endif
+# endif
+
+#if (_MSC_VER >= 1300) || defined (_STLP_NEW_PLATFORM_SDK)
+_STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedIncrement(long volatile *);
+_STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedDecrement(long volatile *);
+_STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedExchange(long volatile *, long);
+#else
+ // boris : for the latest SDK, you may actually need the other version of the declaration (above)
+ // even for earlier VC++ versions. There is no way to tell SDK versions apart, sorry ...
+_STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedIncrement(long*);
+_STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedDecrement(long*);
+_STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedExchange(long*, long);
+#endif
+
+_STLP_IMPORT_DECLSPEC void _STLP_STDCALL Sleep(unsigned long);
+_STLP_IMPORT_DECLSPEC void _STLP_STDCALL OutputDebugStringA( const char* lpOutputString );
+
+#ifdef _STLP_DEBUG
+typedef unsigned long DWORD;
+_STLP_IMPORT_DECLSPEC DWORD _STLP_STDCALL GetCurrentThreadId();
+#endif /* _STLP_DEBUG */
+
+# if defined (InterlockedIncrement)
+# pragma intrinsic(_InterlockedIncrement)
+# pragma intrinsic(_InterlockedDecrement)
+# pragma intrinsic(_InterlockedExchange)
+# endif
+} /* extern "C" */
+
+# endif /* STL_MSVC */
+
+# define _STLP_WINDOWS_H_INCLUDED
+
+# endif /* _STLP_WIN32 */
+
+# ifndef _STLP_ATOMIC_INCREMENT
+# define _STLP_ATOMIC_INCREMENT(__x) InterlockedIncrement((long*)__x)
+# define _STLP_ATOMIC_DECREMENT(__x) InterlockedDecrement((long*)__x)
+# define _STLP_ATOMIC_EXCHANGE(__x, __y) InterlockedExchange((long*)__x, (long)__y)
+# endif
+# elif defined(__DECC) || defined(__DECCXX)
+# include <machine/builtins.h>
+# define _STLP_ATOMIC_EXCHANGE __ATOMIC_EXCH_LONG
+# define _STLP_ATOMIC_INCREMENT(__x) __ATOMIC_ADD_LONG(__x, 1)
+# define _STLP_ATOMIC_DECREMENT(__x) __ATOMIC_ADD_LONG(__x, -1)
+# elif defined(_STLP_SPARC_SOLARIS_THREADS)
+# include <stl/_sparc_atomic.h>
+# elif defined (_STLP_UITHREADS)
+// this inclusion is potential hazard to bring up all sorts
+// of old-style headers. Let's assume vendor already know how
+// to deal with that.
+# include <ctime>
+# if defined (_STLP_USE_NAMESPACES) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
+using _STLP_VENDOR_CSTD::time_t;
+# endif
+# include <synch.h>
+# include <cstdio>
+# include <stl/_cwchar.h>
+# elif defined (_STLP_BETHREADS)
+# include <OS.h>
+#include <cassert>
+#include <stdio.h>
+# define _STLP_MUTEX_INITIALIZER = { 0 }
+#elif defined(_STLP_OS2THREADS)
+# ifdef __GNUC__
+# define INCL_DOSSEMAPHORES
+# include <os2.h>
+# else
+ // This section serves to replace os2.h for VisualAge C++
+ typedef unsigned long ULONG;
+ #ifndef __HEV__ /* INCL_SEMAPHORE may also define HEV */
+ #define __HEV__
+ typedef ULONG HEV;
+ typedef HEV* PHEV;
+ #endif
+ typedef ULONG APIRET;
+ typedef ULONG HMTX;
+ typedef HMTX* PHMTX;
+ typedef const char* PCSZ;
+ typedef ULONG BOOL32;
+ APIRET _System DosCreateMutexSem(PCSZ pszName, PHEV phev, ULONG flAttr, BOOL32 fState);
+ APIRET _System DosRequestMutexSem(HMTX hmtx, ULONG ulTimeout);
+ APIRET _System DosReleaseMutexSem(HMTX hmtx);
+ APIRET _System DosCloseMutexSem(HMTX hmtx);
+# define _STLP_MUTEX_INITIALIZER = { 0 };
+# endif /* GNUC */
+# endif
+
+# ifndef _STLP_MUTEX_INITIALIZER
+# if defined(_STLP_ATOMIC_EXCHANGE)
+// we are using our own spinlock.
+# define _STLP_MUTEX_INITIALIZER = { 0 }
+# elif defined(_STLP_UITHREADS)
+// known case
+# define _STLP_MUTEX_INITIALIZER = { DEFAULTMUTEX }
+# else
+// we do not have static initializer available. therefore, on-demand synchronization is needed.
+# define _STLP_MUTEX_INITIALIZER
+# define _STLP_MUTEX_NEEDS_ONDEMAND_INITIALIZATION
+# endif
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+#ifndef _STLP_USE_PTHREAD_SPINLOCK
+// Helper struct. This is a workaround for various compilers that don't
+// handle static variables in inline functions properly.
+template <int __inst>
+struct _STLP_mutex_spin {
+ enum { __low_max = 30, __high_max = 1000 };
+ // Low if we suspect uniprocessor, high for multiprocessor.
+ static unsigned __max;
+ static unsigned __last;
+ static void _STLP_CALL _M_do_lock(volatile __stl_atomic_t* __lock);
+ static void _STLP_CALL _S_nsec_sleep(int __log_nsec);
+};
+#endif // !_STLP_USE_PTHREAD_SPINLOCK
+
+
+// Locking class. Note that this class *does not have a constructor*.
+// It must be initialized either statically, with _STLP_MUTEX_INITIALIZER,
+// or dynamically, by explicitly calling the _M_initialize member function.
+// (This is similar to the ways that a pthreads mutex can be initialized.)
+// There are explicit member functions for acquiring and releasing the lock.
+
+// There is no constructor because static initialization is essential for
+// some uses, and only a class aggregate (see section 8.5.1 of the C++
+// standard) can be initialized that way. That means we must have no
+// constructors, no base classes, no virtual functions, and no private or
+// protected members.
+
+// For non-static cases, clients should use _STLP_mutex.
+
+struct _STLP_CLASS_DECLSPEC _STLP_mutex_base
+{
+#if defined(_STLP_ATOMIC_EXCHANGE) || defined(_STLP_SGI_THREADS)
+ // It should be relatively easy to get this to work on any modern Unix.
+ volatile __stl_atomic_t _M_lock;
+#endif
+
+#ifdef _STLP_THREADS
+
+# ifdef _STLP_ATOMIC_EXCHANGE
+ inline void _M_initialize() { _M_lock=0; }
+ inline void _M_destroy() {}
+
+ void _M_acquire_lock() {
+ _STLP_mutex_spin<0>::_M_do_lock(&_M_lock);
+ }
+
+ inline void _M_release_lock() {
+ volatile __stl_atomic_t* __lock = &_M_lock;
+# if defined(_STLP_SGI_THREADS) && defined(__GNUC__) && __mips >= 3
+ asm("sync");
+ *__lock = 0;
+# elif defined(_STLP_SGI_THREADS) && __mips >= 3 \
+ && (defined (_ABIN32) || defined(_ABI64))
+ __lock_release(__lock);
+# elif defined (_STLP_SPARC_SOLARIS_THREADS)
+# if defined (__WORD64) || defined (__arch64__) || defined (__sparcv9) || defined (__sparcv8plus)
+ asm("membar #StoreStore ; membar #LoadStore");
+# else
+ asm(" stbar ");
+# endif
+ *__lock = 0;
+# else
+ *__lock = 0;
+ // This is not sufficient on many multiprocessors, since
+ // writes to protected variables and the lock may be reordered.
+# endif
+ }
+# elif defined(_STLP_PTHREADS)
+# ifdef _STLP_USE_PTHREAD_SPINLOCK
+ pthread_spinlock_t _M_lock;
+ inline void _M_initialize() { pthread_spin_init( &_M_lock, 0 ); }
+ inline void _M_destroy() { pthread_spin_destroy( &_M_lock ); }
+
+ inline void _M_acquire_lock() {
+ // we do not care about race conditions here : there is only one thread at this point
+ if(!_M_lock) pthread_spin_init( &_M_lock, 0 );
+
+ // fbp: here, initialization on demand should happen before the lock
+ // we use simple strategy as we are sure this only happens on initialization
+ pthread_spin_lock( &_M_lock );
+ }
+
+ inline void _M_acquire_lock_nodemand() {
+ pthread_spin_lock( &_M_lock );
+ }
+ inline void _M_release_lock() { pthread_spin_unlock( &_M_lock ); }
+# else // !_STLP_USE_PTHREAD_SPINLOCK
+ pthread_mutex_t _M_lock;
+
+ inline void _M_initialize() {
+ pthread_mutex_init(&_M_lock,_STLP_PTHREAD_ATTR_DEFAULT);
+ }
+ inline void _M_destroy() {
+ pthread_mutex_destroy(&_M_lock);
+ }
+ inline void _M_acquire_lock_nodemand() {
+ pthread_mutex_lock(&_M_lock);
+ }
+
+ inline void _M_acquire_lock() {
+# if defined (__hpux) && !defined (PTHREAD_MUTEX_INITIALIZER)
+ if (!_M_lock.field1) _M_initialize();
+# endif
+ pthread_mutex_lock(&_M_lock);
+ }
+ inline void _M_release_lock() { pthread_mutex_unlock(&_M_lock); }
+# endif // !_STLP_USE_PTHREAD_SPINLOCK
+
+# elif defined (_STLP_UITHREADS)
+ mutex_t _M_lock;
+ inline void _M_initialize() {
+ mutex_init(&_M_lock,0,NULL);
+ }
+ inline void _M_destroy() {
+ mutex_destroy(&_M_lock);
+ }
+ inline void _M_acquire_lock() { mutex_lock(&_M_lock); }
+ inline void _M_release_lock() { mutex_unlock(&_M_lock); }
+
+# elif defined(_STLP_OS2THREADS)
+ HMTX _M_lock;
+ inline void _M_initialize() { DosCreateMutexSem(NULL, &_M_lock, 0, false); }
+ inline void _M_destroy() { DosCloseMutexSem(_M_lock); }
+ inline void _M_acquire_lock_nodemand() {
+ DosRequestMutexSem(_M_lock, SEM_INDEFINITE_WAIT);
+ }
+ inline void _M_acquire_lock() {
+ if(!_M_lock) _M_initialize();
+ DosRequestMutexSem(_M_lock, SEM_INDEFINITE_WAIT);
+ }
+ inline void _M_release_lock() { DosReleaseMutexSem(_M_lock); }
+# elif defined(_STLP_BETHREADS)
+ sem_id sem;
+ inline void _M_initialize()
+ {
+ sem = create_sem(1, "STLPort");
+ assert(sem > 0);
+ }
+ inline void _M_destroy()
+ {
+ int t = delete_sem(sem);
+ assert(t == B_NO_ERROR);
+ }
+ inline void _M_acquire_lock_nodemand()
+ {
+ status_t t;
+ t = acquire_sem(sem);
+ assert(t == B_NO_ERROR);
+ }
+ inline void _M_acquire_lock();
+ inline void _M_release_lock()
+ {
+ status_t t = release_sem(sem);
+ assert(t == B_NO_ERROR);
+ }
+# else //*ty 11/24/2001 - added configuration check
+# error "Unknown thread facility configuration"
+# endif
+#else /* No threads */
+ inline void _M_initialize() {}
+ inline void _M_destroy() {}
+ inline void _M_acquire_lock() {}
+ inline void _M_release_lock() {}
+#endif // _STLP_PTHREADS
+};
+
+
+#if defined (_STLP_THREADS) && defined (_STLP_MUTEX_NEEDS_ONDEMAND_INITIALIZATION)
+// for use in _STLP_mutex, our purposes do not require ondemand initialization
+// also, mutex_base may use some hacks to determine uninitialized state by zero data, which only works for globals.
+class _STLP_CLASS_DECLSPEC _STLP_mutex_nodemand : public _STLP_mutex_base {
+ inline void _M_acquire_lock() {
+ _M_acquire_lock_nodemand();
+ }
+};
+#else
+typedef _STLP_mutex_base _STLP_mutex_nodemand;
+#endif
+
+
+// Locking class. The constructor initializes the lock, the destructor destroys it.
+// Well - behaving class, does not need static initializer
+class _STLP_CLASS_DECLSPEC _STLP_mutex : public _STLP_mutex_nodemand {
+ public:
+ inline _STLP_mutex () { _M_initialize(); }
+ inline ~_STLP_mutex () { _M_destroy(); }
+ private:
+ _STLP_mutex(const _STLP_mutex&);
+ void operator=(const _STLP_mutex&);
+};
+
+#if 0 /* def _STLP_DEBUG */
+/*
+ * Recursive Safe locking class.
+*/
+# ifndef _STLP_THREADS
+class _STLP_mutex_RS
+{};
+# else
+class _STLP_CLASS_DECLSPEC _STLP_mutex_RS : public _STLP_mutex
+{
+ public:
+ _STLP_mutex_RS()
+ : _count( 0 )
+# if defined(_STLP_UITHREADS)
+ ,_id( __STATIC_CAST(thread_t,-1) )
+# elif defined(_STLP_PTHREADS)
+# if !defined(__FreeBSD__) && !defined(__DECCXX)
+ ,_id( __STATIC_CAST(pthread_t,-1) )
+# else
+ ,_id( __STATIC_CAST(pthread_t,0) )
+# endif /*__FreeBSD__*/
+# elif defined(__FIT_NOVELL_THREADS)
+ ,_id( -1 )
+# elif defined(_STLP_WIN32THREADS)
+ ,_id( NULL )
+# else
+# error "New _STLP_mutex_RS class not yet ported to this platform"
+# endif
+ {}
+
+ ~_STLP_mutex_RS()
+ {}
+
+ void _M_acquire_lock() {
+# if defined(_STLP_PTHREADS)
+ pthread_t _c_id = pthread_self();
+# elif defined(_STLP_UITHREADS)
+ thread_t _c_id = thr_self();
+# elif defined(__FIT_NOVELL_THREADS)
+ int _c_id = GetThreadID();
+# elif defined(_STLP_WIN32THREADS)
+ DWORD _c_id = GetCurrentThreadId();
+# endif
+ if ( _c_id == _id ) {
+ ++_count;
+ return;
+ }
+ _STLP_mutex::_M_acquire_lock();
+ _id = _c_id;
+ ++_count;
+ }
+
+ void _M_release_lock() {
+ if ( --_count == 0 ) {
+# if defined(_STLP_UITHREADS)
+ _id = __STATIC_CAST(thread_t,-1);
+# elif defined(_STLP_PTHREADS)
+# if !defined(__FreeBSD__) && !defined(__DECCXX)
+ _id = __STATIC_CAST(pthread_t,-1);
+# else
+ _id = __STATIC_CAST(pthread_t,0);
+# endif /*__FreeBSD__*/
+# elif defined(__FIT_NOVELL_THREADS)
+ _id = -1;
+# elif defined(_STLP_WIN32THREADS)
+ _id = NULL;
+# endif
+ _STLP_mutex::_M_release_lock();
+ }
+ }
+
+ protected:
+ unsigned int _count;
+
+# if defined(_STLP_PTHREADS)
+ pthread_t _id;
+# elif defined(_STLP_UITHREADS)
+ thread_t _id;
+# elif defined(__FIT_NOVELL_THREADS)
+ int _id;
+# elif defined(_STLP_WIN32THREADS)
+ DWORD _id;
+# endif
+};
+
+# endif /* _STLP_THREADS */
+
+#endif /* OBSOLETE, _STLP_DEBUG */
+
+
+/*
+ * Class _Refcount_Base provides a type, __stl_atomic_t, a data member,
+ * _M_ref_count, and member functions _M_incr and _M_decr, which perform
+ * atomic preincrement/predecrement. The constructor initializes
+ * _M_ref_count.
+ */
+struct _STLP_CLASS_DECLSPEC _Refcount_Base
+{
+ // The data member _M_ref_count
+ volatile __stl_atomic_t _M_ref_count;
+
+# if !defined (_STLP_ATOMIC_EXCHANGE)
+ _STLP_mutex _M_mutex;
+# endif
+
+ // Constructor
+ _Refcount_Base(__stl_atomic_t __n) : _M_ref_count(__n) {}
+
+ // _M_incr and _M_decr
+# if defined (_STLP_THREADS) && defined (_STLP_ATOMIC_EXCHANGE)
+ void _M_incr() { _STLP_ATOMIC_INCREMENT((__stl_atomic_t*)&_M_ref_count); }
+ void _M_decr() { _STLP_ATOMIC_DECREMENT((__stl_atomic_t*)&_M_ref_count); }
+# elif defined(_STLP_THREADS)
+ void _M_incr() {
+ _M_mutex._M_acquire_lock();
+ ++_M_ref_count;
+ _M_mutex._M_release_lock();
+ }
+ void _M_decr() {
+ _M_mutex._M_acquire_lock();
+ --_M_ref_count;
+ _M_mutex._M_release_lock();
+ }
+# else /* No threads */
+ void _M_incr() { ++_M_ref_count; }
+ void _M_decr() { --_M_ref_count; }
+# endif
+};
+
+// Atomic swap on unsigned long
+// This is guaranteed to behave as though it were atomic only if all
+// possibly concurrent updates use _Atomic_swap.
+// In some cases the operation is emulated with a lock.
+# if defined (_STLP_THREADS)
+# ifdef _STLP_ATOMIC_EXCHANGE
+inline __stl_atomic_t _Atomic_swap(volatile __stl_atomic_t * __p, __stl_atomic_t __q) {
+ return (__stl_atomic_t) _STLP_ATOMIC_EXCHANGE(__p,__q);
+}
+# elif defined(_STLP_PTHREADS) || defined (_STLP_UITHREADS) || defined (_STLP_OS2THREADS) || defined(_STLP_USE_PTHREAD_SPINLOCK)
+// We use a template here only to get a unique initialized instance.
+template<int __dummy>
+struct _Swap_lock_struct {
+ static _STLP_STATIC_MUTEX _S_swap_lock;
+};
+
+
+// This should be portable, but performance is expected
+// to be quite awful. This really needs platform specific
+// code.
+inline __stl_atomic_t _Atomic_swap(volatile __stl_atomic_t * __p, __stl_atomic_t __q) {
+ _Swap_lock_struct<0>::_S_swap_lock._M_acquire_lock();
+ __stl_atomic_t __result = *__p;
+ *__p = __q;
+ _Swap_lock_struct<0>::_S_swap_lock._M_release_lock();
+ return __result;
+}
+# endif // _STLP_PTHREADS || _STLP_UITHREADS || _STLP_OS2THREADS || _STLP_USE_PTHREAD_SPINLOCK
+# else // !_STLP_THREADS
+/* no threads */
+static inline __stl_atomic_t _STLP_CALL
+_Atomic_swap(volatile __stl_atomic_t * __p, __stl_atomic_t __q) {
+ __stl_atomic_t __result = *__p;
+ *__p = __q;
+ return __result;
+}
+# endif // _STLP_THREADS
+
+// A locking class that uses _STLP_STATIC_MUTEX. The constructor takes
+// a reference to an _STLP_STATIC_MUTEX, and acquires a lock. The destructor
+// releases the lock.
+
+struct _STLP_CLASS_DECLSPEC _STLP_auto_lock
+{
+ _STLP_STATIC_MUTEX& _M_lock;
+
+ _STLP_auto_lock(_STLP_STATIC_MUTEX& __lock) : _M_lock(__lock)
+ { _M_lock._M_acquire_lock(); }
+ ~_STLP_auto_lock() { _M_lock._M_release_lock(); }
+
+private:
+ void operator=(const _STLP_auto_lock&);
+ _STLP_auto_lock(const _STLP_auto_lock&);
+};
+
+typedef _STLP_auto_lock _STLP_mutex_lock;
+
+#ifdef _STLP_BETHREADS
+
+template <int __inst>
+struct _STLP_beos_static_lock_data
+{
+ static bool is_init;
+ struct mutex_t : public _STLP_mutex
+ {
+ mutex_t()
+ {
+ _STLP_beos_static_lock_data<0>::is_init = true;
+ }
+ ~mutex_t()
+ {
+ _STLP_beos_static_lock_data<0>::is_init = false;
+ }
+ };
+ static mutex_t mut;
+};
+
+template <int __inst>
+bool _STLP_beos_static_lock_data<__inst>::is_init = false;
+template <int __inst>
+typename _STLP_beos_static_lock_data<__inst>::mutex_t _STLP_beos_static_lock_data<__inst>::mut;
+
+
+inline void _STLP_mutex_base::_M_acquire_lock()
+{
+ if(sem == 0)
+ {
+ // we need to initialise on demand here
+ // to prevent race conditions use our global
+ // mutex if it's available:
+ if(_STLP_beos_static_lock_data<0>::is_init)
+ {
+ _STLP_auto_lock al(_STLP_beos_static_lock_data<0>::mut);
+ if(sem == 0) _M_initialize();
+ }
+ else
+ {
+ // no lock available, we must still be
+ // in startup code, THERE MUST BE ONE THREAD
+ // ONLY active at this point.
+ _M_initialize();
+ }
+ }
+ _M_acquire_lock_nodemand();
+}
+
+#endif
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_threads.c>
+# endif
+
+#endif /* _STLP_INTERNAL_THREADS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_time_facets.c b/src/STLport/stl/_time_facets.c
new file mode 100644
index 0000000..5f58deb
--- /dev/null
+++ b/src/STLport/stl/_time_facets.c
@@ -0,0 +1,497 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_TIME_FACETS_C
+#define _STLP_TIME_FACETS_C
+
+#ifndef _STLP_INTERNAL_TIME_FACETS_H
+# include <stl/_time_facets.h>
+#endif
+
+#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#ifndef _STLP_INTERNAL_NUM_PUT_H
+# include <stl/_num_put.h>
+#endif
+
+#ifndef _STLP_INTERNAL_NUM_GET_H
+# include <stl/_num_get.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// Declarations of static template members.
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+
+template <class _CharT, class _InputIterator>
+locale::id time_get<_CharT, _InputIterator>::id;
+
+template <class _CharT, class _OutputIterator>
+locale::id time_put<_CharT, _OutputIterator>::id;
+
+# else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+typedef time_get<char, const char*> time_get_char;
+typedef time_get<char, char*> time_get_char_2;
+typedef time_get<char, istreambuf_iterator<char, char_traits<char> > > time_get_char_3;
+typedef time_put<char, const char*> time_put_char;
+typedef time_put<char, char*> time_put_char_2;
+typedef time_put<char, ostreambuf_iterator<char, char_traits<char> > > time_put_char_3;
+
+__DECLARE_INSTANCE(locale::id, time_get_char::id, );
+__DECLARE_INSTANCE(locale::id, time_get_char_2::id, );
+__DECLARE_INSTANCE(locale::id, time_get_char_3::id, );
+__DECLARE_INSTANCE(locale::id, time_put_char::id, );
+__DECLARE_INSTANCE(locale::id, time_put_char_2::id, );
+__DECLARE_INSTANCE(locale::id, time_put_char_3::id, );
+
+# ifndef _STLP_NO_WCHAR_T
+
+typedef time_get<wchar_t, const wchar_t*> time_get_wchar_t;
+typedef time_get<wchar_t, wchar_t*> time_get_wchar_t_2;
+typedef time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > > time_get_wchar_t_3;
+typedef time_put<wchar_t, const wchar_t*> time_put_wchar_t;
+typedef time_put<wchar_t, wchar_t*> time_put_wchar_t_2;
+typedef time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > time_put_wchar_t_3;
+
+__DECLARE_INSTANCE(locale::id, time_get_wchar_t::id, );
+__DECLARE_INSTANCE(locale::id, time_get_wchar_t_2::id, );
+__DECLARE_INSTANCE(locale::id, time_get_wchar_t_3::id, );
+__DECLARE_INSTANCE(locale::id, time_put_wchar_t::id, );
+__DECLARE_INSTANCE(locale::id, time_put_wchar_t_2::id, );
+__DECLARE_INSTANCE(locale::id, time_put_wchar_t_3::id, );
+
+# endif
+
+# endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+template <class _InIt, class _RAIt, class _DiffType>
+_RAIt _STLP_CALL
+__match(_InIt& __first, _InIt& __last, _RAIt __name, _RAIt __name_end, _DiffType*) {
+ typedef _DiffType difference_type;
+ difference_type __n = __name_end - __name;
+ size_t __max_pos = 0;
+ difference_type __i;
+ difference_type __pos = 0;
+ difference_type __check_count = __n;
+ bool __do_check[_MAXNAMES];
+ _RAIt __matching_name[_MAX_NAME_LENGTH];
+
+ for (__i = 0; __i < __n; ++__i)
+ __max_pos = (max)(__max_pos, __name[__i].size());
+
+ for (__i = 0; __i < _MAXNAMES; ++__i)
+ __do_check[__i] = true;
+
+
+
+ for (__i = 0; __i < _MAX_NAME_LENGTH; ++__i)
+ __matching_name[__i] = __name_end;
+
+ while (__first != __last) {
+ for (__i = 0; __i < __n; ++__i)
+ if (__do_check[__i])
+ if (*__first == __name[__i][__pos]) {
+ if (__pos == _DiffType(__name[__i].size()) - 1) {
+ __do_check[__i] = 0;
+ __matching_name[__pos+1] = __name + __i;
+ --__check_count;
+ if (__check_count == 0) {
+ ++__first;
+ return __name + __i;
+ }
+ }
+ }
+ else {
+ __do_check[__i] = 0;
+ --__check_count;
+ if (__check_count == 0)
+ return __matching_name[__pos];
+ }
+
+ ++__first; ++__pos;
+ }
+
+ return __matching_name[__pos];
+}
+
+template <class _InIt, class _RAIt>
+_RAIt _STLP_CALL
+__match(_InIt& __first, _InIt& __last, _RAIt __name, _RAIt __name_end) {
+ return __match((_InIt&)__first, (_InIt&)__last, __name, __name_end, _STLP_DISTANCE_TYPE(__name, _InIt));
+}
+
+// __get_formatted_time reads input that is assumed to be formatted
+// according to the rules for the C strftime function (C standard,
+// 7.12.3.5). This function is used to implement the do_get_time
+// and do_get_date virtual functions, which depend on the locale
+// specifications for the time and day formats respectively.
+// Note the catchall default case, intended mainly for the '%Z'
+// format designator, which does not make sense here since the
+// representation of timezones is not part of the locale.
+//
+// The case branches are implemented either by doing a match using
+// the appopriate name table or by doing a __get_integer_nogroup.
+//
+// 'y' format is assumed to mean that the input represents years
+// since 1900. That is, 2002 should be represented as 102. There
+// is no century-guessing.
+//
+// The match is successful if and only if the second component of the
+// return value is format_end.
+
+// Note that the antepenultimate parameter is being used only to determine
+// the correct overloading for the calls to __get_integer_nogroup.
+
+template <class _InIt1, class _InIt2 /* , class _Ch */ >
+_InIt2 _STLP_CALL
+__get_formatted_time _STLP_WEAK (_InIt1 __first, _InIt1 __last,
+ _InIt2 __format, _InIt2 __format_end,
+ /* _Ch, */ const _Time_Info& __table,
+ ios_base::iostate& __err,
+ tm* __t) {
+ while(__first != __last && __format != __format_end) {
+ if (*__format == '%') {
+ ++__format;
+ char __c = *__format;
+ switch (__c) {
+ case 'a': {
+ const string* __pr =
+ __match(__first, __last,
+ (string*)__table._M_dayname + 0 , (string*)__table._M_dayname + 7);
+ if (__pr == (string*)__table._M_dayname + 7)
+ return __format;
+ __t->tm_wday = (int)(__pr - (string*)__table._M_dayname);
+ break;
+ }
+
+ case 'A': {
+ const string* __pr =
+ __match(__first, __last,
+ (string*)__table._M_dayname + 7, (string*)__table._M_dayname + 14);
+ if (__pr == (string*)__table._M_dayname + 14)
+ return __format;
+ __t->tm_wday = (int)(__pr - (string*)__table._M_dayname - 7);
+ break;
+ }
+
+ case 'b': {
+ const string* __pr =
+ __match(__first, __last,
+ (string*)__table._M_monthname + 0, (string*)__table._M_monthname + 12);
+ if (__pr == (string*)__table._M_monthname + 12)
+ return __format;
+ __t->tm_mon = (int)(__pr - (string*)__table._M_monthname);
+ break;
+ }
+
+ case 'B': {
+ const string* __pr =
+ __match(__first, __last,
+ (string*)__table._M_monthname + 12, (string*)__table._M_monthname + 24);
+ if (__pr == (string*)__table._M_monthname + 24)
+ return __format;
+ __t->tm_mon = (int)(__pr - (string*)__table._M_monthname - 12);
+ break;
+ }
+
+ case 'd': {
+ bool __pr =
+ __get_decimal_integer(__first, __last, __t->tm_mday);
+ if (!__pr || __t->tm_mday < 1 || __t->tm_mday > 31) {
+ __err |= ios_base::failbit;
+ return __format;
+ }
+ break;
+ }
+
+ case 'H': case 'I': {
+ bool __pr =
+ __get_decimal_integer(__first, __last, __t->tm_hour);
+ if (!__pr)
+ return __format;
+ break;
+ }
+
+ case 'j': {
+ bool __pr =
+ __get_decimal_integer(__first, __last, __t->tm_yday);
+ if (!__pr)
+ return __format;
+ break;
+ }
+
+ case 'm': {
+ bool __pr =
+ __get_decimal_integer(__first, __last, __t->tm_mon);
+ --__t->tm_mon;
+ if (!__pr || __t->tm_mon < 0 || __t->tm_mon > 11) {
+ __err |= ios_base::failbit;
+ return __format;
+ }
+ break;
+ }
+
+ case 'M': {
+ bool __pr =
+ __get_decimal_integer(__first, __last, __t->tm_min);
+ if (!__pr)
+ return __format;
+ break;
+ }
+
+ case 'p': {
+ const string* __pr =
+ __match(__first, __last, (string*)__table._M_am_pm + 0, (string*)__table._M_am_pm + 2);
+ if (__pr == (string*)__table._M_am_pm + 2)
+ return __format;
+ if (__pr == (string*)__table._M_am_pm + 1)
+ __t->tm_hour += 12;
+ break;
+ }
+
+ case 'S': {
+ bool __pr =
+ __get_decimal_integer(__first, __last, __t->tm_sec);
+ if (!__pr)
+ return __format;
+ break;
+ }
+
+ case 'y': {
+ bool __pr =
+ __get_decimal_integer(__first, __last, __t->tm_year);
+ if (!__pr)
+ return __format;
+ break;
+ }
+
+ case 'Y': {
+ bool __pr =
+ __get_decimal_integer(__first, __last, __t->tm_year);
+ __t->tm_year -= 1900;
+ if (!__pr)
+ return __format;
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ }
+ else {
+ if (*__first++ != *__format) break;
+ }
+
+ ++__format;
+ }
+
+ return __format;
+}
+
+template <class _InIt>
+bool _STLP_CALL
+__get_short_or_long_dayname(_InIt& __first, _InIt& __last,
+ const _Time_Info& __table, tm* __t) {
+ const string* __pr =
+ __match(__first, __last, __table._M_dayname + 0, __table._M_dayname + 14);
+ __t->tm_wday = (int)(__pr - __table._M_dayname) % 7;
+ return __pr != __table._M_dayname + 14;
+}
+
+template <class _InIt>
+bool _STLP_CALL
+__get_short_or_long_monthname(_InIt& __first, _InIt& __last,
+ const _Time_Info& __table, tm* __t) {
+ const string* __pr =
+ __match(__first, __last, (string*)__table._M_monthname + 0, (string*)__table._M_monthname + 24);
+ __t->tm_mon = (int)(__pr - __table._M_monthname) % 12;
+ return __pr != __table._M_monthname + 24;
+}
+
+# ifndef _STLP_NO_WCHAR_T
+template <class _OuIt>
+_OuIt _STLP_CALL
+__put_time(char * __first, char * __last, _OuIt __out,
+ const ios_base& __s, wchar_t) {
+ const ctype<wchar_t>& __ct = *(ctype<wchar_t>*)__s._M_ctype_facet();
+ wchar_t __wbuf[64];
+ __ct.widen(__first, __last, __wbuf);
+ ptrdiff_t __len = __last - __first;
+ wchar_t * __eend = __wbuf + __len;
+ return copy((wchar_t*)__wbuf, __eend, __out);
+}
+# endif
+
+template <class _Ch, class _InIt>
+_InIt
+time_get<_Ch, _InIt>::do_get_date(_InIt __s, _InIt __end,
+ ios_base& /* __str */, ios_base::iostate& __err,
+ tm* __t) const
+{
+ typedef string::const_iterator string_iterator;
+
+ string_iterator __format
+ = _M_timeinfo._M_date_format.begin();
+ string_iterator __format_end
+ = _M_timeinfo._M_date_format.end();
+
+ string_iterator __result
+ = __get_formatted_time(__s, __end, __format, __format_end,
+ /* _Ch() ,*/ _M_timeinfo, __err, __t);
+ if (__result == __format_end)
+ __err = ios_base::goodbit;
+ else {
+ __err = ios_base::failbit;
+ if (__s == __end)
+ __err |= ios_base::eofbit;
+ }
+ return __s;
+}
+
+template <class _Ch, class _InIt>
+_InIt
+time_get<_Ch, _InIt>::do_get_time(_InIt __s, _InIt __end,
+ ios_base& /* __str */, ios_base::iostate& __err,
+ tm* __t) const
+{
+ typedef string::const_iterator string_iterator;
+ string_iterator __format
+ = _M_timeinfo._M_time_format.begin();
+ string_iterator __format_end
+ = _M_timeinfo._M_time_format.end();
+
+ string_iterator __result
+ = __get_formatted_time(__s, __end, __format, __format_end,
+ /* _Ch() , */ _M_timeinfo, __err, __t);
+ __err = __result == __format_end ? ios_base::goodbit
+ : ios_base::failbit;
+ if (__s == __end)
+ __err |= ios_base::eofbit;
+ return __s;
+}
+
+template <class _Ch, class _InIt>
+_InIt
+time_get<_Ch, _InIt>::do_get_year(_InIt __s, _InIt __end,
+ ios_base&,
+ ios_base::iostate& __err,
+ tm* __t) const
+{
+
+ if (__s == __end) {
+ __err = ios_base::failbit | ios_base::eofbit;
+ return __s;
+ }
+
+ bool __pr = __get_decimal_integer(__s, __end, __t->tm_year);
+ __t->tm_year -= 1900;
+ __err = __pr ? ios_base::goodbit : ios_base::failbit;
+ if (__s == __end)
+ __err |= ios_base::eofbit;
+
+ return __s;
+}
+
+template <class _Ch, class _InIt>
+_InIt
+time_get<_Ch, _InIt>::do_get_weekday(_InIt __s, _InIt __end,
+ ios_base& /* __str */,
+ ios_base::iostate& __err,
+ tm* __t) const
+{
+ bool __result =
+ __get_short_or_long_dayname(__s, __end, _M_timeinfo, __t);
+ if (__result)
+ __err = ios_base::goodbit;
+ else {
+ __err = ios_base::failbit;
+ if (__s == __end)
+ __err |= ios_base::eofbit;
+ }
+ return __s;
+}
+
+template <class _Ch, class _InIt>
+_InIt
+time_get<_Ch, _InIt>::do_get_monthname(_InIt __s, _InIt __end,
+ ios_base& /* __str */,
+ ios_base::iostate& __err,
+ tm* __t) const
+{
+ bool __result =
+ __get_short_or_long_monthname(__s, __end, _M_timeinfo, __t);
+ if (__result)
+ __err = ios_base::goodbit;
+ else {
+ __err = ios_base::failbit;
+ if (__s == __end)
+ __err |= ios_base::eofbit;
+ }
+ return __s;
+}
+
+template<class _Ch, class _OutputIter>
+_OutputIter
+time_put<_Ch,_OutputIter>::put(_OutputIter __s, ios_base& __f, _Ch __fill,
+ const tm* __tmb,
+ const _Ch* __pat, const _Ch* __pat_end) const
+{
+ // locale __loc = __f.getloc();
+ // const ctype<_Ch>& _Ct = use_facet<ctype<_Ch> >(__loc);
+ const ctype<_Ch>& _Ct = *(ctype<_Ch>*)__f._M_ctype_facet();
+ while (__pat != __pat_end) {
+ char __c = _Ct.narrow(*__pat, 0);
+ if (__c == '%') {
+ char __mod = 0;
+ ++__pat;
+ __c = _Ct.narrow(*__pat++, 0);
+ if(__c == '#') { // MS extension
+ __mod = __c;
+ __c = _Ct.narrow(*__pat++, 0);
+ }
+ __s = do_put(__s, __f, __fill, __tmb, __c, __mod);
+ }
+ else
+ *__s++ = *__pat++;
+ }
+ return __s;
+}
+
+template<class _Ch, class _OutputIter>
+_OutputIter
+time_put<_Ch,_OutputIter>::do_put(_OutputIter __s, ios_base& __f, _Ch /* __fill */ ,
+ const tm* __tmb,
+ char __format, char __modifier ) const
+{
+ char __buf[64];
+ char * __iend = __write_formatted_time(__buf, __format, __modifier,
+ _M_timeinfo, __tmb);
+ // locale __loc = __f.getloc();
+ return __put_time(__buf, __iend, __s, __f, _Ch());
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) */
+#endif /* _STLP_TIME_FACETS_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_time_facets.h b/src/STLport/stl/_time_facets.h
new file mode 100644
index 0000000..4d777ca
--- /dev/null
+++ b/src/STLport/stl/_time_facets.h
@@ -0,0 +1,315 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// WARNING: This is an internal header file, included by other C++
+// standard library headers. You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_TIME_FACETS_H
+#define _STLP_INTERNAL_TIME_FACETS_H
+
+#ifndef _STLP_CTIME
+# include <ctime> // Needed (for struct tm) by time facets
+#endif
+
+#include <stl/c_locale.h>
+#include <stl/_ios_base.h>
+
+_STLP_BEGIN_NAMESPACE
+
+// Template functions used by time_get
+
+// Matching input against a list of names
+
+// Alphabetic input of the names of months and the names
+// of weekdays requires matching input against a list of names.
+// We use a simple generic algorithm to accomplish this. This
+// algorithm is not very efficient, especially for longer lists
+// of names, but it probably does not matter for the initial
+// implementation and it may never matter, since we do not expect
+// this kind of input to be used very often. The algorithm
+// could be improved fairly simply by creating a new list of
+// names still in the running at each iteration. A more sophisticated
+// approach would be to build a trie to do the matching.
+//
+// We compare each character of the input to the corresponding
+// character of each name on the list that has not been eliminated,
+// either because every character in the name has already been
+// matched, or because some character has not been matched. We
+// continue only as long as there are some names that have not been
+// eliminated.
+
+// We do not really need a random access iterator (a forward iterator
+// would do), but the extra generality makes the notation clumsier,
+// and we don't really need it.
+
+// We can recognize a failed match by the fact that the second
+// component of the return value will be __name_end.
+
+#define _MAXNAMES 64
+#define _MAX_NAME_LENGTH 64
+
+// Both time_get and time_put need a structure of type _Time_Info
+// to provide names and abbreviated names for months and days,
+// as well as the am/pm designator. The month and weekday tables
+// have the all the abbreviated names before all the full names.
+// The _Time_Info tables are initialized using the non-template
+// function _Init_timeinfo, which has two overloadings: one
+// with a single reference parameter for the table to be initialized,
+// and one with a second _Locale_time * parameter. The first form
+// is called by the default constructor and the second by a special
+// constructor invoked from the _byname subclass constructor to
+// construct the base class.
+
+class _STLP_CLASS_DECLSPEC _Time_Info {
+public:
+ string _M_dayname[14];
+ string _M_monthname[24];
+ string _M_am_pm[2];
+ string _M_time_format;
+ string _M_date_format;
+ string _M_date_time_format;
+ string _M_long_date_format;
+ string _M_long_date_time_format;
+};
+
+void _STLP_CALL _Init_timeinfo(_Time_Info&);
+void _STLP_CALL _Init_timeinfo(_Time_Info&, _Locale_time*);
+
+class _STLP_CLASS_DECLSPEC time_base {
+public:
+ enum dateorder {no_order, dmy, mdy, ymd, ydm};
+};
+
+
+template <class _Ch, __DFL_TMPL_PARAM( _InIt , istreambuf_iterator<_Ch>) >
+class time_get : public locale::facet, public time_base
+{
+ friend class _Locale;
+
+public:
+ typedef _Ch char_type;
+ typedef _InIt iter_type;
+
+ explicit time_get(size_t __refs = 0) : _BaseFacet(__refs) {
+ _Init_timeinfo(_M_timeinfo);
+ }
+ dateorder date_order() const { return do_date_order(); }
+ iter_type get_time(iter_type __s, iter_type __end, ios_base& __str,
+ ios_base::iostate& __err, tm* __t) const
+ { return do_get_time(__s, __end, __str, __err, __t); }
+ iter_type get_date(iter_type __s, iter_type __end, ios_base& __str,
+ ios_base::iostate& __err, tm* __t) const
+ { return do_get_date(__s, __end, __str, __err, __t); }
+ iter_type get_weekday(iter_type __s, iter_type __end, ios_base& __str,
+ ios_base::iostate& __err, tm* __t) const
+ { return do_get_weekday(__s, __end, __str, __err, __t); }
+ iter_type get_monthname(iter_type __s, iter_type __end, ios_base& __str,
+ ios_base::iostate& __err, tm* __t) const
+ { return do_get_monthname(__s, __end, __str, __err, __t); }
+ iter_type get_year(iter_type __s, iter_type __end, ios_base& __str,
+ ios_base::iostate& __err, tm* __t) const
+ { return do_get_year(__s, __end, __str, __err, __t); }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+ _Time_Info _M_timeinfo;
+
+ time_get(_Locale_time *, size_t __refs) : _BaseFacet(__refs) {}
+
+ ~time_get() {}
+
+ virtual dateorder do_date_order() const {return no_order;}
+
+ virtual iter_type do_get_time(iter_type __s, iter_type __end,
+ ios_base&, ios_base::iostate& __err,
+ tm* __t) const;
+
+ virtual iter_type do_get_date(iter_type __s, iter_type __end,
+ ios_base&, ios_base::iostate& __err,
+ tm* __t) const;
+
+ virtual iter_type do_get_weekday(iter_type __s, iter_type __end,
+ ios_base&,
+ ios_base::iostate& __err,
+ tm* __t) const;
+ virtual iter_type do_get_monthname(iter_type __s, iter_type __end,
+ ios_base&,
+ ios_base::iostate& __err,
+ tm* __t) const;
+
+ virtual iter_type do_get_year(iter_type __s, iter_type __end,
+ ios_base&, ios_base::iostate& __err,
+ tm* __t) const;
+};
+
+time_base::dateorder _STLP_CALL
+__get_date_order(_Locale_time*);
+_Locale_time* _STLP_CALL __acquire_time(const char* __name);
+void _STLP_CALL __release_time(_Locale_time* __time);
+
+template <class _Ch, __DFL_TMPL_PARAM( _InIt , istreambuf_iterator<_Ch>) >
+class time_get_byname : public time_get<_Ch, _InIt>
+{
+public:
+ typedef time_base::dateorder dateorder;
+ typedef _InIt iter_type;
+
+ explicit time_get_byname(const char* __name, size_t __refs = 0)
+ : time_get<_Ch, _InIt>((_Locale_time*) 0, __refs),
+ _M_time(__acquire_time(__name))
+ { _Init_timeinfo(this->_M_timeinfo, this->_M_time); }
+
+protected:
+ ~time_get_byname() { __release_time(_M_time); }
+ dateorder do_date_order() const { return __get_date_order(_M_time); }
+private:
+ _Locale_time* _M_time;
+};
+
+// time_put facet
+
+// For the formats 'x, 'X', and 'c', do_put calls the first form of
+// put with the pattern obtained from _M_timeinfo._M_date_format or
+// _M_timeinfo._M_time_format.
+
+// Helper function: __ takes a single-character
+// format. As indicated by the foregoing remark, this will never be
+// 'x', 'X', or 'c'.
+
+char * _STLP_CALL
+__write_formatted_time(char * __buf, char __format, char __modifier,
+ const _Time_Info& __table, const tm* __t);
+
+template <class _OuIt>
+inline _OuIt _STLP_CALL __put_time(char * __first, char * __last, _OuIt __out,
+ const ios_base& /* __loc */, char) {
+ return copy(__first, __last, __out);
+}
+
+# ifndef _STLP_NO_WCHAR_T
+template <class _OuIt>
+_OuIt _STLP_CALL __put_time(char * __first, char * __last, _OuIt __out,
+ const ios_base& __s, wchar_t);
+# endif
+
+template<class _Ch, __DFL_TMPL_PARAM( _OutputIter , ostreambuf_iterator<_Ch> ) >
+class time_put : public locale::facet, public time_base
+{
+ friend class _Locale;
+public:
+ typedef _Ch char_type;
+ typedef _OutputIter iter_type;
+
+ explicit time_put(size_t __refs = 0) : _BaseFacet(__refs) {
+ _Init_timeinfo(_M_timeinfo);
+ }
+
+ _OutputIter put(iter_type __s, ios_base& __f, _Ch __fill,
+ const tm* __tmb,
+ const _Ch* __pat, const _Ch* __pat_end) const;
+
+ _OutputIter put(iter_type __s, ios_base& __f, _Ch __fill,
+ const tm* __tmb, char __format, char __modifier = 0) const {
+ return do_put(__s, __f, __fill, __tmb, __format, __modifier);
+ }
+
+ _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+ _Time_Info _M_timeinfo;
+
+ time_put(_Locale_time* /*__time*/, size_t __refs) : _BaseFacet(__refs) {
+ // _Init_timeinfo(_M_timeinfo, __time);
+ }
+
+ ~time_put() {}
+ virtual iter_type do_put(iter_type __s, ios_base& __f,
+ char_type /* __fill */, const tm* __tmb,
+ char __format, char /* __modifier */) const;
+};
+
+template <class _Ch, __DFL_TMPL_PARAM( _InIt , ostreambuf_iterator<_Ch> ) >
+class time_put_byname : public time_put<_Ch, _InIt>
+{
+ friend class _Locale;
+public:
+ typedef time_base::dateorder dateorder;
+ typedef _InIt iter_type;
+ typedef _Ch char_type;
+
+ explicit time_put_byname(const char * __name, size_t __refs = 0)
+ : time_put<_Ch, _InIt>((_Locale_time*) 0, __refs),
+ _M_time(__acquire_time(__name))
+ { _Init_timeinfo(this->_M_timeinfo, this->_M_time); }
+
+protected:
+ ~time_put_byname() { __release_time(_M_time); }
+
+private:
+ _Locale_time* _M_time;
+};
+
+# ifdef _STLP_USE_TEMPLATE_EXPORT
+_STLP_EXPORT_TEMPLATE_CLASS time_get<char, istreambuf_iterator<char, char_traits<char> > >;
+_STLP_EXPORT_TEMPLATE_CLASS time_put<char, ostreambuf_iterator<char, char_traits<char> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS time_get<char, const char*>;
+// _STLP_EXPORT_TEMPLATE_CLASS time_put<char, char*>;
+# ifndef _STLP_NO_WCHAR_T
+_STLP_EXPORT_TEMPLATE_CLASS time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
+_STLP_EXPORT_TEMPLATE_CLASS time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS time_get<wchar_t, const wchar_t*>;
+// _STLP_EXPORT_TEMPLATE_CLASS time_put<wchar_t, wchar_t*>;
+# endif /* INSTANTIATE_WIDE_STREAMS */
+
+# endif
+
+# if defined (__BORLANDC__) && defined (_RTLDLL)
+inline void _Stl_loc_init_time_facets() {
+
+ time_get<char, istreambuf_iterator<char, char_traits<char> > >::id._M_index = 16;
+ time_get<char, const char*>::id._M_index = 17;
+ time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id._M_index = 18;
+ time_put<char, char*>::id._M_index = 19;
+
+# ifndef _STLP_NO_WCHAR_T
+
+ time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 35;
+ time_get<wchar_t, const wchar_t*>::id._M_index = 36;
+ time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 37;
+ time_put<wchar_t, wchar_t*>::id._M_index = 38;
+
+# endif
+
+}
+# endif
+
+_STLP_END_NAMESPACE
+
+#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_time_facets.c>
+# endif
+
+#endif /* _STLP_INTERNAL_TIME_FACETS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
+
diff --git a/src/STLport/stl/_tree.c b/src/STLport/stl/_tree.c
new file mode 100644
index 0000000..eb056fd
--- /dev/null
+++ b/src/STLport/stl/_tree.c
@@ -0,0 +1,715 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ * Modified CRP 7/10/00 for improved conformance / efficiency on insert_unique /
+ * insert_equal with valid hint -- efficiency is improved all around, and it is
+ * should now be standard conforming for complexity on insert point immediately
+ * after hint (amortized constant time).
+ *
+ */
+#ifndef _STLP_TREE_C
+#define _STLP_TREE_C
+
+#ifndef _STLP_INTERNAL_TREE_H
+# include <stl/_tree.h>
+#endif
+
+// fbp: these defines are for outline methods definitions.
+// needed for definitions to be portable. Should not be used in method bodies.
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+# define __iterator__ _Rb_tree_iterator<_Value, _Nonconst_traits<_Value> >
+# define __size_type__ size_t
+# define iterator __iterator__
+# else
+# define __iterator__ _STLP_TYPENAME_ON_RETURN_TYPE _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>::iterator
+# define __size_type__ _STLP_TYPENAME_ON_RETURN_TYPE _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>::size_type
+# endif
+
+#if defined ( _STLP_DEBUG)
+# define _Rb_tree __WORKAROUND_DBG_RENAME(Rb_tree)
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+template <class _Dummy> void _STLP_CALL
+_Rb_global<_Dummy>::_Rotate_left(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root)
+{
+ _Rb_tree_node_base* __y = __x->_M_right;
+ __x->_M_right = __y->_M_left;
+ if (__y->_M_left !=0)
+ __y->_M_left->_M_parent = __x;
+ __y->_M_parent = __x->_M_parent;
+
+ if (__x == __root)
+ __root = __y;
+ else if (__x == __x->_M_parent->_M_left)
+ __x->_M_parent->_M_left = __y;
+ else
+ __x->_M_parent->_M_right = __y;
+ __y->_M_left = __x;
+ __x->_M_parent = __y;
+}
+
+template <class _Dummy> void _STLP_CALL
+_Rb_global<_Dummy>::_Rotate_right(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root)
+{
+ _Rb_tree_node_base* __y = __x->_M_left;
+ __x->_M_left = __y->_M_right;
+ if (__y->_M_right != 0)
+ __y->_M_right->_M_parent = __x;
+ __y->_M_parent = __x->_M_parent;
+
+ if (__x == __root)
+ __root = __y;
+ else if (__x == __x->_M_parent->_M_right)
+ __x->_M_parent->_M_right = __y;
+ else
+ __x->_M_parent->_M_left = __y;
+ __y->_M_right = __x;
+ __x->_M_parent = __y;
+}
+
+template <class _Dummy> void _STLP_CALL
+_Rb_global<_Dummy>::_Rebalance(_Rb_tree_node_base* __x,
+ _Rb_tree_node_base*& __root)
+{
+ __x->_M_color = _S_rb_tree_red;
+ while (__x != __root && __x->_M_parent->_M_color == _S_rb_tree_red) {
+ if (__x->_M_parent == __x->_M_parent->_M_parent->_M_left) {
+ _Rb_tree_node_base* __y = __x->_M_parent->_M_parent->_M_right;
+ if (__y && __y->_M_color == _S_rb_tree_red) {
+ __x->_M_parent->_M_color = _S_rb_tree_black;
+ __y->_M_color = _S_rb_tree_black;
+ __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red;
+ __x = __x->_M_parent->_M_parent;
+ }
+ else {
+ if (__x == __x->_M_parent->_M_right) {
+ __x = __x->_M_parent;
+ _Rotate_left(__x, __root);
+ }
+ __x->_M_parent->_M_color = _S_rb_tree_black;
+ __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red;
+ _Rotate_right(__x->_M_parent->_M_parent, __root);
+ }
+ }
+ else {
+ _Rb_tree_node_base* __y = __x->_M_parent->_M_parent->_M_left;
+ if (__y && __y->_M_color == _S_rb_tree_red) {
+ __x->_M_parent->_M_color = _S_rb_tree_black;
+ __y->_M_color = _S_rb_tree_black;
+ __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red;
+ __x = __x->_M_parent->_M_parent;
+ }
+ else {
+ if (__x == __x->_M_parent->_M_left) {
+ __x = __x->_M_parent;
+ _Rotate_right(__x, __root);
+ }
+ __x->_M_parent->_M_color = _S_rb_tree_black;
+ __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red;
+ _Rotate_left(__x->_M_parent->_M_parent, __root);
+ }
+ }
+ }
+ __root->_M_color = _S_rb_tree_black;
+}
+
+template <class _Dummy> _Rb_tree_node_base* _STLP_CALL
+_Rb_global<_Dummy>::_Rebalance_for_erase(_Rb_tree_node_base* __z,
+ _Rb_tree_node_base*& __root,
+ _Rb_tree_node_base*& __leftmost,
+ _Rb_tree_node_base*& __rightmost)
+{
+ _Rb_tree_node_base* __y = __z;
+ _Rb_tree_node_base* __x = 0;
+ _Rb_tree_node_base* __x_parent = 0;
+ if (__y->_M_left == 0) // __z has at most one non-null child. y == z.
+ __x = __y->_M_right; // __x might be null.
+ else
+ if (__y->_M_right == 0) // __z has exactly one non-null child. y == z.
+ __x = __y->_M_left; // __x is not null.
+ else { // __z has two non-null children. Set __y to
+ __y = __y->_M_right; // __z's successor. __x might be null.
+ while (__y->_M_left != 0)
+ __y = __y->_M_left;
+ __x = __y->_M_right;
+ }
+ if (__y != __z) { // relink y in place of z. y is z's successor
+ __z->_M_left->_M_parent = __y;
+ __y->_M_left = __z->_M_left;
+ if (__y != __z->_M_right) {
+ __x_parent = __y->_M_parent;
+ if (__x) __x->_M_parent = __y->_M_parent;
+ __y->_M_parent->_M_left = __x; // __y must be a child of _M_left
+ __y->_M_right = __z->_M_right;
+ __z->_M_right->_M_parent = __y;
+ }
+ else
+ __x_parent = __y;
+ if (__root == __z)
+ __root = __y;
+ else if (__z->_M_parent->_M_left == __z)
+ __z->_M_parent->_M_left = __y;
+ else
+ __z->_M_parent->_M_right = __y;
+ __y->_M_parent = __z->_M_parent;
+ _STLP_STD::swap(__y->_M_color, __z->_M_color);
+ __y = __z;
+ // __y now points to node to be actually deleted
+ }
+ else { // __y == __z
+ __x_parent = __y->_M_parent;
+ if (__x) __x->_M_parent = __y->_M_parent;
+ if (__root == __z)
+ __root = __x;
+ else
+ if (__z->_M_parent->_M_left == __z)
+ __z->_M_parent->_M_left = __x;
+ else
+ __z->_M_parent->_M_right = __x;
+ if (__leftmost == __z)
+ if (__z->_M_right == 0) // __z->_M_left must be null also
+ __leftmost = __z->_M_parent;
+ // makes __leftmost == _M_header if __z == __root
+ else
+ __leftmost = _Rb_tree_node_base::_S_minimum(__x);
+ if (__rightmost == __z)
+ if (__z->_M_left == 0) // __z->_M_right must be null also
+ __rightmost = __z->_M_parent;
+ // makes __rightmost == _M_header if __z == __root
+ else // __x == __z->_M_left
+ __rightmost = _Rb_tree_node_base::_S_maximum(__x);
+ }
+ if (__y->_M_color != _S_rb_tree_red) {
+ while (__x != __root && (__x == 0 || __x->_M_color == _S_rb_tree_black))
+ if (__x == __x_parent->_M_left) {
+ _Rb_tree_node_base* __w = __x_parent->_M_right;
+ if (__w->_M_color == _S_rb_tree_red) {
+ __w->_M_color = _S_rb_tree_black;
+ __x_parent->_M_color = _S_rb_tree_red;
+ _Rotate_left(__x_parent, __root);
+ __w = __x_parent->_M_right;
+ }
+ if ((__w->_M_left == 0 ||
+ __w->_M_left->_M_color == _S_rb_tree_black) && (__w->_M_right == 0 ||
+ __w->_M_right->_M_color == _S_rb_tree_black)) {
+ __w->_M_color = _S_rb_tree_red;
+ __x = __x_parent;
+ __x_parent = __x_parent->_M_parent;
+ } else {
+ if (__w->_M_right == 0 ||
+ __w->_M_right->_M_color == _S_rb_tree_black) {
+ if (__w->_M_left) __w->_M_left->_M_color = _S_rb_tree_black;
+ __w->_M_color = _S_rb_tree_red;
+ _Rotate_right(__w, __root);
+ __w = __x_parent->_M_right;
+ }
+ __w->_M_color = __x_parent->_M_color;
+ __x_parent->_M_color = _S_rb_tree_black;
+ if (__w->_M_right) __w->_M_right->_M_color = _S_rb_tree_black;
+ _Rotate_left(__x_parent, __root);
+ break;
+ }
+ } else { // same as above, with _M_right <-> _M_left.
+ _Rb_tree_node_base* __w = __x_parent->_M_left;
+ if (__w->_M_color == _S_rb_tree_red) {
+ __w->_M_color = _S_rb_tree_black;
+ __x_parent->_M_color = _S_rb_tree_red;
+ _Rotate_right(__x_parent, __root);
+ __w = __x_parent->_M_left;
+ }
+ if ((__w->_M_right == 0 ||
+ __w->_M_right->_M_color == _S_rb_tree_black) && (__w->_M_left == 0 ||
+ __w->_M_left->_M_color == _S_rb_tree_black)) {
+ __w->_M_color = _S_rb_tree_red;
+ __x = __x_parent;
+ __x_parent = __x_parent->_M_parent;
+ } else {
+ if (__w->_M_left == 0 ||
+ __w->_M_left->_M_color == _S_rb_tree_black) {
+ if (__w->_M_right) __w->_M_right->_M_color = _S_rb_tree_black;
+ __w->_M_color = _S_rb_tree_red;
+ _Rotate_left(__w, __root);
+ __w = __x_parent->_M_left;
+ }
+ __w->_M_color = __x_parent->_M_color;
+ __x_parent->_M_color = _S_rb_tree_black;
+ if (__w->_M_left) __w->_M_left->_M_color = _S_rb_tree_black;
+ _Rotate_right(__x_parent, __root);
+ break;
+ }
+ }
+ if (__x) __x->_M_color = _S_rb_tree_black;
+ }
+ return __y;
+}
+
+template <class _Dummy> _Rb_tree_node_base* _STLP_CALL
+_Rb_global<_Dummy>::_M_decrement(_Rb_tree_node_base* _M_node)
+{
+ if (_M_node->_M_color == _S_rb_tree_red && _M_node->_M_parent->_M_parent == _M_node)
+ _M_node = _M_node->_M_right;
+ else if (_M_node->_M_left != 0) {
+ _Base_ptr __y = _M_node->_M_left;
+ while (__y->_M_right != 0)
+ __y = __y->_M_right;
+ _M_node = __y;
+ }
+ else {
+ _Base_ptr __y = _M_node->_M_parent;
+ while (_M_node == __y->_M_left) {
+ _M_node = __y;
+ __y = __y->_M_parent;
+ }
+ _M_node = __y;
+ }
+ return _M_node;
+}
+
+template <class _Dummy> _Rb_tree_node_base* _STLP_CALL
+_Rb_global<_Dummy>::_M_increment(_Rb_tree_node_base* _M_node)
+{
+ if (_M_node->_M_right != 0) {
+ _M_node = _M_node->_M_right;
+ while (_M_node->_M_left != 0)
+ _M_node = _M_node->_M_left;
+ }
+ else {
+ _Base_ptr __y = _M_node->_M_parent;
+ while (_M_node == __y->_M_right) {
+ _M_node = __y;
+ __y = __y->_M_parent;
+ }
+ if (_M_node->_M_right != __y)
+ _M_node = __y;
+ }
+ return _M_node;
+}
+
+#endif /* defined (__BUILDING_STLPORT) || ! defined (_STLP_OWN_IOSTREAMS) */
+
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::operator=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x)
+{
+ if (this != &__x) {
+ // Note that _Key may be a constant type.
+ clear();
+ _M_node_count = 0;
+ _M_key_compare = __x._M_key_compare;
+ if (__x._M_root() == 0) {
+ _M_root() = 0;
+ _M_leftmost() = this->_M_header._M_data;
+ _M_rightmost() = this->_M_header._M_data;
+ }
+ else {
+ _M_root() = _M_copy(__x._M_root(), this->_M_header._M_data);
+ _M_leftmost() = _S_minimum(_M_root());
+ _M_rightmost() = _S_maximum(_M_root());
+ _M_node_count = __x._M_node_count;
+ }
+ }
+ return *this;
+}
+
+// CRP 7/10/00 inserted argument __w_, which is another hint (meant to
+// act like __x_ and ignore a portion of the if conditions -- specify
+// __w_ != 0 to bypass comparison as false or __x_ != 0 to bypass
+// comparison as true)
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> __iterator__
+_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::_M_insert(_Rb_tree_node_base* __x_, _Rb_tree_node_base* __y_, const _Value& __v,
+ _Rb_tree_node_base* __w_)
+{
+ _Link_type __w = (_Link_type) __w_;
+ _Link_type __x = (_Link_type) __x_;
+ _Link_type __y = (_Link_type) __y_;
+ _Link_type __z;
+
+ if ( __y == this->_M_header._M_data ||
+ ( __w == 0 && // If w != 0, the remainder fails to false
+ ( __x != 0 || // If x != 0, the remainder succeeds to true
+ _M_key_compare( _KeyOfValue()(__v), _S_key(__y) ) )
+ )
+ ) {
+
+ __z = _M_create_node(__v);
+ _S_left(__y) = __z; // also makes _M_leftmost() = __z
+ // when __y == _M_header
+ if (__y == this->_M_header._M_data) {
+ _M_root() = __z;
+ _M_rightmost() = __z;
+ }
+ else if (__y == _M_leftmost())
+ _M_leftmost() = __z; // maintain _M_leftmost() pointing to min node
+ }
+ else {
+ __z = _M_create_node(__v);
+ _S_right(__y) = __z;
+ if (__y == _M_rightmost())
+ _M_rightmost() = __z; // maintain _M_rightmost() pointing to max node
+ }
+ _S_parent(__z) = __y;
+ _S_left(__z) = 0;
+ _S_right(__z) = 0;
+ _Rb_global_inst::_Rebalance(__z, this->_M_header._M_data->_M_parent);
+ ++_M_node_count;
+ return iterator(__z);
+}
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> __iterator__
+_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::insert_equal(const _Value& __v)
+{
+ _Link_type __y = this->_M_header._M_data;
+ _Link_type __x = _M_root();
+ while (__x != 0) {
+ __y = __x;
+ __x = _M_key_compare(_KeyOfValue()(__v), _S_key(__x)) ?
+ _S_left(__x) : _S_right(__x);
+ }
+ return _M_insert(__x, __y, __v);
+}
+
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> pair< _Rb_tree_iterator<_Value, _Nonconst_traits<_Value> >, bool> _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::insert_unique(const _Value& __v)
+{
+ _Link_type __y = this->_M_header._M_data;
+ _Link_type __x = _M_root();
+ bool __comp = true;
+ while (__x != 0) {
+ __y = __x;
+ __comp = _M_key_compare(_KeyOfValue()(__v), _S_key(__x));
+ __x = __comp ? _S_left(__x) : _S_right(__x);
+ }
+ iterator __j = iterator(__y);
+ if (__comp)
+ if (__j == begin())
+ return pair<iterator,bool>(_M_insert(/* __x*/ __y, __y, __v), true);
+ else
+ --__j;
+ if (_M_key_compare(_S_key(__j._M_node), _KeyOfValue()(__v)))
+ return pair<iterator,bool>(_M_insert(__x, __y, __v), true);
+ return pair<iterator,bool>(__j, false);
+}
+
+// Modifications CRP 7/10/00 as noted to improve conformance and
+// efficiency.
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> __iterator__
+_Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc> ::insert_unique(iterator __position, const _Value& __v)
+{
+ if (__position._M_node == this->_M_header._M_data->_M_left) { // begin()
+
+ // if the container is empty, fall back on insert_unique.
+ if (size() <= 0)
+ return insert_unique(__v).first;
+
+ if ( _M_key_compare(_KeyOfValue()(__v), _S_key(__position._M_node)))
+ return _M_insert(__position._M_node, __position._M_node, __v);
+ // first argument just needs to be non-null
+ else
+ {
+ bool __comp_pos_v = _M_key_compare( _S_key(__position._M_node), _KeyOfValue()(__v) );
+
+ if (__comp_pos_v == false) // compare > and compare < both false so compare equal
+ return __position;
+ //Below __comp_pos_v == true
+
+ // Standard-conformance - does the insertion point fall immediately AFTER
+ // the hint?
+ iterator __after = __position;
+ ++__after;
+
+ // Check for only one member -- in that case, __position points to itself,
+ // and attempting to increment will cause an infinite loop.
+ if (__after._M_node == this->_M_header._M_data)
+ // Check guarantees exactly one member, so comparison was already
+ // performed and we know the result; skip repeating it in _M_insert
+ // by specifying a non-zero fourth argument.
+ return _M_insert(0, __position._M_node, __v, __position._M_node);
+
+
+ // All other cases:
+
+ // Optimization to catch insert-equivalent -- save comparison results,
+ // and we get this for free.
+ if(_M_key_compare( _KeyOfValue()(__v), _S_key(__after._M_node) )) {
+ if (_S_right(__position._M_node) == 0)
+ return _M_insert(0, __position._M_node, __v, __position._M_node);
+ else
+ return _M_insert(__after._M_node, __after._M_node, __v);
+ } else {
+ return insert_unique(__v).first;
+ }
+ }
+
+ } else if (__position._M_node == this->_M_header._M_data) { // end()
+ if (_M_key_compare(_S_key(_M_rightmost()), _KeyOfValue()(__v)))
+ // pass along to _M_insert that it can skip comparing
+ // v, Key ; since compare Key, v was true, compare v, Key must be false.
+ return _M_insert(0, _M_rightmost(), __v, __position._M_node); // Last argument only needs to be non-null
+ else
+ return insert_unique(__v).first;
+ } else {
+ iterator __before = __position;
+ --__before;
+
+ bool __comp_v_pos = _M_key_compare(_KeyOfValue()(__v), _S_key(__position._M_node));
+
+ if (__comp_v_pos
+ && _M_key_compare( _S_key(__before._M_node), _KeyOfValue()(__v) )) {
+
+ if (_S_right(__before._M_node) == 0)
+ return _M_insert(0, __before._M_node, __v, __before._M_node); // Last argument only needs to be non-null
+ else
+ return _M_insert(__position._M_node, __position._M_node, __v);
+ // first argument just needs to be non-null
+ } else
+ {
+ // Does the insertion point fall immediately AFTER the hint?
+ iterator __after = __position;
+ ++__after;
+
+ // Optimization to catch equivalent cases and avoid unnecessary comparisons
+ bool __comp_pos_v = !__comp_v_pos; // Stored this result earlier
+ // If the earlier comparison was true, this comparison doesn't need to be
+ // performed because it must be false. However, if the earlier comparison
+ // was false, we need to perform this one because in the equal case, both will
+ // be false.
+ if (!__comp_v_pos) __comp_pos_v = _M_key_compare(_S_key(__position._M_node), _KeyOfValue()(__v));
+
+ if ( (!__comp_v_pos) // comp_v_pos true implies comp_v_pos false
+ && __comp_pos_v
+ && (__after._M_node == this->_M_header._M_data ||
+ _M_key_compare( _KeyOfValue()(__v), _S_key(__after._M_node) ))) {
+
+ if (_S_right(__position._M_node) == 0)
+ return _M_insert(0, __position._M_node, __v, __position._M_node);
+ else
+ return _M_insert(__after._M_node, __after._M_node, __v);
+ } else {
+ // Test for equivalent case
+ if (__comp_v_pos == __comp_pos_v)
+ return __position;
+ else
+ return insert_unique(__v).first;
+ }
+ }
+ }
+}
+
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> __iterator__
+_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::insert_equal(iterator __position, const _Value& __v)
+{
+ if (__position._M_node == this->_M_header._M_data->_M_left) { // begin()
+
+ // Check for zero members
+ if (size() <= 0)
+ return insert_equal(__v);
+
+ if (!_M_key_compare(_S_key(__position._M_node), _KeyOfValue()(__v)))
+ return _M_insert(__position._M_node, __position._M_node, __v);
+ else {
+ // Check for only one member
+ if (__position._M_node->_M_left == __position._M_node)
+ // Unlike insert_unique, can't avoid doing a comparison here.
+ return _M_insert(0, __position._M_node, __v);
+
+ // All other cases:
+ // Standard-conformance - does the insertion point fall immediately AFTER
+ // the hint?
+ iterator __after = __position;
+ ++__after;
+
+ // Already know that compare(pos, v) must be true!
+ // Therefore, we want to know if compare(after, v) is false.
+ // (i.e., we now pos < v, now we want to know if v <= after)
+ // If not, invalid hint.
+ if ( __after._M_node==this->_M_header._M_data ||
+ !_M_key_compare( _S_key(__after._M_node), _KeyOfValue()(__v) ) ) {
+ if (_S_right(__position._M_node) == 0)
+ return _M_insert(0, __position._M_node, __v, __position._M_node);
+ else
+ return _M_insert(__after._M_node, __after._M_node, __v);
+ } else // Invalid hint
+ return insert_equal(__v);
+ }
+ } else if (__position._M_node == this->_M_header._M_data) {// end()
+ if (!_M_key_compare(_KeyOfValue()(__v), _S_key(_M_rightmost())))
+ return _M_insert(0, _M_rightmost(), __v, __position._M_node); // Last argument only needs to be non-null
+ else
+ return insert_equal(__v);
+ } else {
+ iterator __before = __position;
+ --__before;
+ // store the result of the comparison between pos and v so
+ // that we don't have to do it again later. Note that this reverses the shortcut
+ // on the if, possibly harming efficiency in comparisons; I think the harm will
+ // be negligible, and to do what I want to do (save the result of a comparison so
+ // that it can be re-used) there is no alternative. Test here is for before <= v <= pos.
+ bool __comp_pos_v = _M_key_compare(_S_key(__position._M_node), _KeyOfValue()(__v));
+ if (!__comp_pos_v
+ && !_M_key_compare(_KeyOfValue()(__v), _S_key(__before._M_node))) {
+ if (_S_right(__before._M_node) == 0)
+ return _M_insert(0, __before._M_node, __v, __before._M_node); // Last argument only needs to be non-null
+ else
+ return _M_insert(__position._M_node, __position._M_node, __v);
+ } else {
+ // Does the insertion point fall immediately AFTER the hint?
+ // Test for pos < v <= after
+ iterator __after = __position;
+ ++__after;
+
+ if (__comp_pos_v
+ && ( __after._M_node==this->_M_header._M_data
+ || !_M_key_compare( _S_key(__after._M_node), _KeyOfValue()(__v) ) ) ) {
+ if (_S_right(__position._M_node) == 0)
+ return _M_insert(0, __position._M_node, __v, __position._M_node);
+ else
+ return _M_insert(__after._M_node, __after._M_node, __v);
+ } else // Invalid hint
+ return insert_equal(__v);
+ }
+ }
+}
+
+template <class _Key, class _Value, class _KeyOfValue, class _Compare, class _Alloc> _Rb_tree_node<_Value>*
+_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::_M_copy(_Rb_tree_node<_Value>* __x, _Rb_tree_node<_Value>* __p)
+{
+ // structural copy. __x and __p must be non-null.
+ _Link_type __top = _M_clone_node(__x);
+ __top->_M_parent = __p;
+
+ _STLP_TRY {
+ if (__x->_M_right)
+ __top->_M_right = _M_copy(_S_right(__x), __top);
+ __p = __top;
+ __x = _S_left(__x);
+
+ while (__x != 0) {
+ _Link_type __y = _M_clone_node(__x);
+ __p->_M_left = __y;
+ __y->_M_parent = __p;
+ if (__x->_M_right)
+ __y->_M_right = _M_copy(_S_right(__x), __y);
+ __p = __y;
+ __x = _S_left(__x);
+ }
+ }
+ _STLP_UNWIND(_M_erase(__top));
+
+ return __top;
+}
+
+// this has to stay out-of-line : it's recursive
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> void
+_Rb_tree<_Key,_Value,_KeyOfValue,
+ _Compare,_Alloc>::_M_erase(_Rb_tree_node<_Value>* __x)
+{
+ // erase without rebalancing
+ while (__x != 0) {
+ _M_erase(_S_right(__x));
+ _Link_type __y = _S_left(__x);
+ _STLP_STD::_Destroy(&__x->_M_value_field);
+ this->_M_header.deallocate(__x,1);
+ __x = __y;
+ }
+}
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> __size_type__
+_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::count(const _Key& __k) const
+{
+ pair<const_iterator, const_iterator> __p = equal_range(__k);
+ size_type __n = distance(__p.first, __p.second);
+ return __n;
+}
+
+inline int
+__black_count(_Rb_tree_node_base* __node, _Rb_tree_node_base* __root)
+{
+ if (__node == 0)
+ return 0;
+ else {
+ int __bc = __node->_M_color == _S_rb_tree_black ? 1 : 0;
+ if (__node == __root)
+ return __bc;
+ else
+ return __bc + __black_count(__node->_M_parent, __root);
+ }
+}
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> bool _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::__rb_verify() const
+{
+ if (_M_node_count == 0 || begin() == end())
+ return _M_node_count == 0 && begin() == end() && this->_M_header._M_data->_M_left == this->_M_header._M_data
+ && this->_M_header._M_data->_M_right == this->_M_header._M_data;
+
+ int __len = __black_count(_M_leftmost(), _M_root());
+ for (const_iterator __it = begin(); __it != end(); ++__it) {
+ _Link_type __x = (_Link_type) __it._M_node;
+ _Link_type __L = _S_left(__x);
+ _Link_type __R = _S_right(__x);
+
+ if (__x->_M_color == _S_rb_tree_red)
+ if ((__L && __L->_M_color == _S_rb_tree_red) ||
+ (__R && __R->_M_color == _S_rb_tree_red))
+ return false;
+
+ if (__L && _M_key_compare(_S_key(__x), _S_key(__L)))
+ return false;
+ if (__R && _M_key_compare(_S_key(__R), _S_key(__x)))
+ return false;
+
+ if (!__L && !__R && __black_count(__x, _M_root()) != __len)
+ return false;
+ }
+
+ if (_M_leftmost() != _Rb_tree_node_base::_S_minimum(_M_root()))
+ return false;
+ if (_M_rightmost() != _Rb_tree_node_base::_S_maximum(_M_root()))
+ return false;
+
+ return true;
+}
+_STLP_END_NAMESPACE
+
+# undef __iterator__
+# undef iterator
+# undef __size_type__
+
+#endif /* _STLP_TREE_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_tree.h b/src/STLport/stl/_tree.h
new file mode 100644
index 0000000..c46a17d
--- /dev/null
+++ b/src/STLport/stl/_tree.h
@@ -0,0 +1,622 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_TREE_H
+#define _STLP_INTERNAL_TREE_H
+
+/*
+
+Red-black tree class, designed for use in implementing STL
+associative containers (set, multiset, map, and multimap). The
+insertion and deletion algorithms are based on those in Cormen,
+Leiserson, and Rivest, Introduction to Algorithms (MIT Press, 1990),
+except that
+
+(1) the header cell is maintained with links not only to the root
+but also to the leftmost node of the tree, to enable constant time
+begin(), and to the rightmost node of the tree, to enable linear time
+performance when used with the generic set algorithms (set_union,
+etc.);
+
+(2) when a node being deleted has two children its successor node is
+relinked into its place, rather than copied, so that the only
+iterators invalidated are those referring to the deleted node.
+
+*/
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+# include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_CONSTRUCT_H
+# include <stl/_construct.h>
+# endif
+
+# ifndef _STLP_INTERNAL_FUNCTION_H
+# include <stl/_function_base.h>
+# endif
+
+#if defined ( _STLP_DEBUG)
+# define _Rb_tree __WORKAROUND_DBG_RENAME(Rb_tree)
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+typedef bool _Rb_tree_Color_type;
+//const _Rb_tree_Color_type _S_rb_tree_red = false;
+//const _Rb_tree_Color_type _S_rb_tree_black = true;
+
+#define _S_rb_tree_red false
+#define _S_rb_tree_black true
+
+struct _Rb_tree_node_base
+{
+ typedef _Rb_tree_Color_type _Color_type;
+ typedef _Rb_tree_node_base* _Base_ptr;
+
+ _Color_type _M_color;
+ _Base_ptr _M_parent;
+ _Base_ptr _M_left;
+ _Base_ptr _M_right;
+
+ static _Base_ptr _STLP_CALL _S_minimum(_Base_ptr __x)
+ {
+ while (__x->_M_left != 0) __x = __x->_M_left;
+ return __x;
+ }
+
+ static _Base_ptr _STLP_CALL _S_maximum(_Base_ptr __x)
+ {
+ while (__x->_M_right != 0) __x = __x->_M_right;
+ return __x;
+ }
+};
+
+template <class _Value> struct _Rb_tree_node : public _Rb_tree_node_base
+{
+ _Value _M_value_field;
+ __TRIVIAL_STUFF(_Rb_tree_node)
+};
+
+struct _Rb_tree_base_iterator;
+
+template <class _Dummy> class _Rb_global {
+public:
+ typedef _Rb_tree_node_base* _Base_ptr;
+ // those used to be global functions
+ static void _STLP_CALL _Rebalance(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root);
+ static _Rb_tree_node_base* _STLP_CALL _Rebalance_for_erase(_Rb_tree_node_base* __z,
+ _Rb_tree_node_base*& __root,
+ _Rb_tree_node_base*& __leftmost,
+ _Rb_tree_node_base*& __rightmost);
+ // those are from _Rb_tree_base_iterator - moved here to reduce code bloat
+ // moved here to reduce code bloat without templatizing _Rb_tree_base_iterator
+ static _Rb_tree_node_base* _STLP_CALL _M_increment(_Rb_tree_node_base*);
+ static _Rb_tree_node_base* _STLP_CALL _M_decrement(_Rb_tree_node_base*);
+ static void _STLP_CALL _Rotate_left(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root);
+ static void _STLP_CALL _Rotate_right(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root);
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _Rb_global<bool>;
+# endif
+
+typedef _Rb_global<bool> _Rb_global_inst;
+
+struct _Rb_tree_base_iterator
+{
+ typedef _Rb_tree_node_base* _Base_ptr;
+ typedef bidirectional_iterator_tag iterator_category;
+ typedef ptrdiff_t difference_type;
+ _Base_ptr _M_node;
+ bool operator==(const _Rb_tree_base_iterator& __y) const {
+ return _M_node == __y._M_node;
+ }
+ bool operator!=(const _Rb_tree_base_iterator& __y) const {
+ return _M_node != __y._M_node;
+ }
+};
+
+
+template <class _Value, class _Traits> struct _Rb_tree_iterator : public _Rb_tree_base_iterator
+{
+ typedef _Value value_type;
+ typedef typename _Traits::reference reference;
+ typedef typename _Traits::pointer pointer;
+ typedef _Rb_tree_iterator<_Value, _Traits> _Self;
+ typedef _Rb_tree_node<_Value>* _Link_type;
+
+ _Rb_tree_iterator() { _M_node = 0; }
+ _Rb_tree_iterator(_Link_type __x) { _M_node = __x; }
+ _Rb_tree_iterator(const _Rb_tree_iterator<_Value,
+ _Nonconst_traits<_Value> >& __it) { _M_node = __it._M_node; }
+
+ reference operator*() const {
+ return _Link_type(_M_node)->_M_value_field;
+ }
+
+ _STLP_DEFINE_ARROW_OPERATOR
+
+ _Self& operator++() { _M_node = _Rb_global_inst::_M_increment(_M_node); return *this; }
+ _Self operator++(int) {
+ _Self __tmp = *this;
+ _M_node = _Rb_global_inst::_M_increment(_M_node);
+ return __tmp;
+ }
+
+ _Self& operator--() { _M_node = _Rb_global_inst::_M_decrement(_M_node); return *this; }
+ _Self operator--(int) {
+ _Self __tmp = *this;
+ _M_node = _Rb_global_inst::_M_decrement(_M_node);
+ return __tmp;
+ }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _Value, class _Traits> inline _Value* value_type(const _Rb_tree_iterator<_Value, _Traits>&) { return (_Value*)0; }
+inline bidirectional_iterator_tag iterator_category(const _Rb_tree_base_iterator&) { return bidirectional_iterator_tag(); }
+inline ptrdiff_t* distance_type(const _Rb_tree_base_iterator&) { return (ptrdiff_t*) 0; }
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+// Base class to help EH
+
+template <class _Tp, class _Alloc> struct _Rb_tree_base
+{
+ typedef _Rb_tree_node<_Tp> _Node;
+ _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+ typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type;
+
+ _Rb_tree_base(const allocator_type& __a) :
+ _M_header(_STLP_CONVERT_ALLOCATOR(__a, _Node), (_Node*)0) {
+ _M_header._M_data = _M_header.allocate(1);
+ }
+ ~_Rb_tree_base() {
+ _M_header.deallocate(_M_header._M_data,1);
+ }
+ allocator_type get_allocator() const {
+ return _STLP_CONVERT_ALLOCATOR(_M_header, _Tp);
+ }
+protected:
+ typedef typename _Alloc_traits<_Node, _Alloc>::allocator_type _M_node_allocator_type;
+ _STLP_alloc_proxy<_Node*, _Node, _M_node_allocator_type> _M_header;
+};
+
+
+template <class _Key, class _Value, class _KeyOfValue, class _Compare,
+ _STLP_DEFAULT_ALLOCATOR_SELECT(_Value) > class _Rb_tree : public _Rb_tree_base<_Value, _Alloc> {
+ typedef _Rb_tree_base<_Value, _Alloc> _Base;
+protected:
+ typedef _Rb_tree_node_base* _Base_ptr;
+ typedef _Rb_tree_node<_Value> _Node;
+ typedef _Rb_tree_Color_type _Color_type;
+public:
+ typedef _Key key_type;
+ typedef _Value value_type;
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef _Rb_tree_node<_Value>* _Link_type;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef bidirectional_iterator_tag _Iterator_category;
+ typedef typename _Base::allocator_type allocator_type;
+
+protected:
+
+ _Link_type _M_create_node(const value_type& __x)
+ {
+ _Link_type __tmp = this->_M_header.allocate(1);
+ _STLP_TRY {
+ _Construct(&__tmp->_M_value_field, __x);
+ }
+ _STLP_UNWIND(this->_M_header.deallocate(__tmp,1));
+ return __tmp;
+ }
+
+ _Link_type _M_clone_node(_Link_type __x)
+ {
+ _Link_type __tmp = _M_create_node(__x->_M_value_field);
+ __tmp->_M_color = __x->_M_color;
+ __tmp->_M_left = 0;
+ __tmp->_M_right = 0;
+ return __tmp;
+ }
+
+protected:
+ size_type _M_node_count; // keeps track of size of tree
+ _Compare _M_key_compare;
+
+ _Link_type& _M_root() const
+ { return (_Link_type&) this->_M_header._M_data->_M_parent; }
+ _Link_type& _M_leftmost() const
+ { return (_Link_type&) this->_M_header._M_data->_M_left; }
+ _Link_type& _M_rightmost() const
+ { return (_Link_type&) this->_M_header._M_data->_M_right; }
+
+ static _Link_type& _STLP_CALL _S_left(_Link_type __x)
+ { return (_Link_type&)(__x->_M_left); }
+ static _Link_type& _STLP_CALL _S_right(_Link_type __x)
+ { return (_Link_type&)(__x->_M_right); }
+ static _Link_type& _STLP_CALL _S_parent(_Link_type __x)
+ { return (_Link_type&)(__x->_M_parent); }
+ static reference _STLP_CALL _S_value(_Link_type __x)
+ { return __x->_M_value_field; }
+ static const _Key& _STLP_CALL _S_key(_Link_type __x)
+ { return _KeyOfValue()(_S_value(__x)); }
+ static _Color_type& _STLP_CALL _S_color(_Link_type __x)
+ { return (_Color_type&)(__x->_M_color); }
+
+ static _Link_type& _STLP_CALL _S_left(_Base_ptr __x)
+ { return (_Link_type&)(__x->_M_left); }
+ static _Link_type& _STLP_CALL _S_right(_Base_ptr __x)
+ { return (_Link_type&)(__x->_M_right); }
+ static _Link_type& _STLP_CALL _S_parent(_Base_ptr __x)
+ { return (_Link_type&)(__x->_M_parent); }
+ static reference _STLP_CALL _S_value(_Base_ptr __x)
+ { return ((_Link_type)__x)->_M_value_field; }
+ static const _Key& _STLP_CALL _S_key(_Base_ptr __x)
+ { return _KeyOfValue()(_S_value(_Link_type(__x)));}
+ static _Color_type& _STLP_CALL _S_color(_Base_ptr __x)
+ { return (_Color_type&)(_Link_type(__x)->_M_color); }
+
+ static _Link_type _STLP_CALL _S_minimum(_Link_type __x)
+ { return (_Link_type) _Rb_tree_node_base::_S_minimum(__x); }
+
+ static _Link_type _STLP_CALL _S_maximum(_Link_type __x)
+ { return (_Link_type) _Rb_tree_node_base::_S_maximum(__x); }
+
+public:
+ typedef _Rb_tree_iterator<value_type, _Nonconst_traits<value_type> > iterator;
+ typedef _Rb_tree_iterator<value_type, _Const_traits<value_type> > const_iterator;
+ _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;
+
+private:
+ iterator _M_insert(_Base_ptr __x, _Base_ptr __y, const value_type& __v, _Base_ptr __w = 0);
+ _Link_type _M_copy(_Link_type __x, _Link_type __p);
+ void _M_erase(_Link_type __x);
+
+public:
+ // allocation/deallocation
+ _Rb_tree()
+ : _Rb_tree_base<_Value, _Alloc>(allocator_type()), _M_node_count(0), _M_key_compare(_Compare())
+ { _M_empty_initialize(); }
+
+ _Rb_tree(const _Compare& __comp)
+ : _Rb_tree_base<_Value, _Alloc>(allocator_type()), _M_node_count(0), _M_key_compare(__comp)
+ { _M_empty_initialize(); }
+
+ _Rb_tree(const _Compare& __comp, const allocator_type& __a)
+ : _Rb_tree_base<_Value, _Alloc>(__a), _M_node_count(0), _M_key_compare(__comp)
+ { _M_empty_initialize(); }
+
+ _Rb_tree(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x)
+ : _Rb_tree_base<_Value, _Alloc>(__x.get_allocator()),
+ _M_node_count(0), _M_key_compare(__x._M_key_compare)
+ {
+ if (__x._M_root() == 0)
+ _M_empty_initialize();
+ else {
+ _S_color(this->_M_header._M_data) = _S_rb_tree_red;
+ _M_root() = _M_copy(__x._M_root(), this->_M_header._M_data);
+ _M_leftmost() = _S_minimum(_M_root());
+ _M_rightmost() = _S_maximum(_M_root());
+ }
+ _M_node_count = __x._M_node_count;
+ }
+ ~_Rb_tree() { clear(); }
+ _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& operator=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x);
+
+private:
+ void _M_empty_initialize() {
+ _S_color(this->_M_header._M_data) = _S_rb_tree_red; // used to distinguish header from
+ // __root, in iterator.operator++
+ _M_root() = 0;
+ _M_leftmost() = this->_M_header._M_data;
+ _M_rightmost() = this->_M_header._M_data;
+ }
+
+public:
+ // accessors:
+ _Compare key_comp() const { return _M_key_compare; }
+
+ iterator begin() { return iterator(_M_leftmost()); }
+ const_iterator begin() const { return const_iterator(_M_leftmost()); }
+ iterator end() { return iterator(this->_M_header._M_data); }
+ const_iterator end() const { return const_iterator(this->_M_header._M_data); }
+
+ reverse_iterator rbegin() { return reverse_iterator(end()); }
+ const_reverse_iterator rbegin() const {
+ return const_reverse_iterator(end());
+ }
+ reverse_iterator rend() { return reverse_iterator(begin()); }
+ const_reverse_iterator rend() const {
+ return const_reverse_iterator(begin());
+ }
+ bool empty() const { return _M_node_count == 0; }
+ size_type size() const { return _M_node_count; }
+ size_type max_size() const { return size_type(-1); }
+
+ void swap(_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __t) {
+ _STLP_STD::swap(this->_M_header, __t._M_header);
+ _STLP_STD::swap(_M_node_count, __t._M_node_count);
+ _STLP_STD::swap(_M_key_compare, __t._M_key_compare);
+ }
+
+public:
+ // insert/erase
+ pair<iterator,bool> insert_unique(const value_type& __x);
+ iterator insert_equal(const value_type& __x);
+
+ iterator insert_unique(iterator __position, const value_type& __x);
+ iterator insert_equal(iterator __position, const value_type& __x);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template<class _II> void insert_equal(_II __first, _II __last) {
+ for ( ; __first != __last; ++__first)
+ insert_equal(*__first);
+ }
+ template<class _II> void insert_unique(_II __first, _II __last) {
+ for ( ; __first != __last; ++__first)
+ insert_unique(*__first);
+ }
+#else /* _STLP_MEMBER_TEMPLATES */
+ void insert_unique(const_iterator __first, const_iterator __last) {
+ for ( ; __first != __last; ++__first)
+ insert_unique(*__first);
+ }
+ void insert_unique(const value_type* __first, const value_type* __last) {
+ for ( ; __first != __last; ++__first)
+ insert_unique(*__first);
+ }
+ void insert_equal(const_iterator __first, const_iterator __last) {
+ for ( ; __first != __last; ++__first)
+ insert_equal(*__first);
+ }
+ void insert_equal(const value_type* __first, const value_type* __last) {
+ for ( ; __first != __last; ++__first)
+ insert_equal(*__first);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ void erase(iterator __position) {
+ _Link_type __y =
+ (_Link_type) _Rb_global_inst::_Rebalance_for_erase(__position._M_node,
+ this->_M_header._M_data->_M_parent,
+ this->_M_header._M_data->_M_left,
+ this->_M_header._M_data->_M_right);
+ _STLP_STD::_Destroy(&__y->_M_value_field);
+ this->_M_header.deallocate(__y,1);
+ --_M_node_count;
+ }
+
+ size_type erase(const key_type& __x) {
+ pair<iterator,iterator> __p = equal_range(__x);
+ size_type __n = distance(__p.first, __p.second);
+ erase(__p.first, __p.second);
+ return __n;
+ }
+
+ void erase(iterator __first, iterator __last) {
+ if (__first == begin() && __last == end())
+ clear();
+ else
+ while (__first != __last) erase(__first++);
+ }
+
+ void erase(const key_type* __first, const key_type* __last) {
+ while (__first != __last) erase(*__first++);
+ }
+
+ void clear() {
+ if (_M_node_count != 0) {
+ _M_erase(_M_root());
+ _M_leftmost() = this->_M_header._M_data;
+ _M_root() = 0;
+ _M_rightmost() = this->_M_header._M_data;
+ _M_node_count = 0;
+ }
+ }
+
+public:
+ // set operations:
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS ) && !defined(__MRC__) && !(defined(__SC__) && !defined(__DMC__))
+ template <class _KT> iterator find(const _KT& __x) { return iterator(_M_find(__x)); }
+ template <class _KT> const_iterator find(const _KT& __x) const { return const_iterator(_M_find(__x)); }
+private:
+ template <class _KT> _Rb_tree_node<_Value>* _M_find(const _KT& __k) const
+# else
+ iterator find(const key_type& __x) { return iterator(_M_find(__x)); }
+ const_iterator find(const key_type& __x) const { return const_iterator(_M_find(__x)); }
+private:
+ _Rb_tree_node<_Value>* _M_find(const key_type& __k) const
+# endif
+ {
+ _Link_type __y = this->_M_header._M_data; // Last node which is not less than __k.
+ _Link_type __x = _M_root(); // Current node.
+
+ while (__x != 0)
+ if (!_M_key_compare(_S_key(__x), __k))
+ __y = __x, __x = _S_left(__x);
+ else
+ __x = _S_right(__x);
+ if (__y == this->_M_header._M_data || _M_key_compare(__k, _S_key(__y)))
+ __y = this->_M_header._M_data;
+ return __y;
+ }
+
+ _Link_type _M_lower_bound(const key_type& __k) const {
+ _Link_type __y = this->_M_header._M_data; /* Last node which is not less than __k. */
+ _Link_type __x = _M_root(); /* Current node. */
+
+ while (__x != 0)
+ if (!_M_key_compare(_S_key(__x), __k))
+ __y = __x, __x = _S_left(__x);
+ else
+ __x = _S_right(__x);
+
+ return __y;
+ }
+
+ _Link_type _M_upper_bound(const key_type& __k) const {
+ _Link_type __y = this->_M_header._M_data; /* Last node which is greater than __k. */
+ _Link_type __x = _M_root(); /* Current node. */
+
+ while (__x != 0)
+ if (_M_key_compare(__k, _S_key(__x)))
+ __y = __x, __x = _S_left(__x);
+ else
+ __x = _S_right(__x);
+
+ return __y;
+ }
+
+public:
+ size_type count(const key_type& __x) const;
+ iterator lower_bound(const key_type& __x) { return iterator(_M_lower_bound(__x)); }
+ const_iterator lower_bound(const key_type& __x) const { return const_iterator(_M_lower_bound(__x)); }
+ iterator upper_bound(const key_type& __x) { return iterator(_M_upper_bound(__x)); }
+ const_iterator upper_bound(const key_type& __x) const { return const_iterator(_M_upper_bound(__x)); }
+ pair<iterator,iterator> equal_range(const key_type& __x) {
+ return pair<iterator, iterator>(lower_bound(__x), upper_bound(__x));
+ }
+ pair<const_iterator, const_iterator> equal_range(const key_type& __x) const {
+ return pair<const_iterator,const_iterator>(lower_bound(__x),
+ upper_bound(__x));
+ }
+
+public:
+ // Debugging.
+ bool __rb_verify() const;
+};
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> inline bool _STLP_CALL
+operator==(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
+ const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y)
+{
+ return __x.size() == __y.size() && equal(__x.begin(), __x.end(), __y.begin());
+}
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> inline bool _STLP_CALL
+operator<(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
+ const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y)
+{
+ return lexicographical_compare(__x.begin(), __x.end(),
+ __y.begin(), __y.end());
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> inline bool _STLP_CALL
+operator!=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
+ const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) {
+ return !(__x == __y);
+}
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> inline bool _STLP_CALL
+operator>(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
+ const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) {
+ return __y < __x;
+}
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> inline bool _STLP_CALL
+operator<=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
+ const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) {
+ return !(__y < __x);
+}
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> inline bool _STLP_CALL
+operator>=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
+ const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) {
+ return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class _Key, class _Value, class _KeyOfValue,
+ class _Compare, class _Alloc> inline void _STLP_CALL
+swap(_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
+ _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y)
+{
+ __x.swap(__y);
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_tree.c>
+# endif
+
+# undef _Rb_tree
+
+#if defined (_STLP_DEBUG)
+# include <stl/debug/_tree.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+// Class rb_tree is not part of the C++ standard. It is provided for
+// compatibility with the HP STL.
+
+template <class _Key, class _Value, class _KeyOfValue, class _Compare,
+ _STLP_DEFAULT_ALLOCATOR_SELECT(_Value) > struct rb_tree : public _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc> {
+ typedef _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc> _Base;
+ typedef typename _Base::allocator_type allocator_type;
+
+ rb_tree()
+ : _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>(_Compare(), allocator_type()) {}
+ rb_tree(const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
+ : _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>(__comp, __a) {}
+ ~rb_tree() {}
+};
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_TREE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_uninitialized.h b/src/STLport/stl/_uninitialized.h
new file mode 100644
index 0000000..6784ff7
--- /dev/null
+++ b/src/STLport/stl/_uninitialized.h
@@ -0,0 +1,287 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_UNINITIALIZED_H
+#define _STLP_INTERNAL_UNINITIALIZED_H
+
+# ifndef _STLP_CSTRING
+# include <cstring>
+# endif
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_CONSTRUCT_H
+# include <stl/_construct.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+// uninitialized_copy
+
+// Valid if copy construction is equivalent to assignment, and if the
+// destructor is trivial.
+template <class _InputIter, class _ForwardIter>
+inline _ForwardIter
+__uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result,
+ const __true_type&) {
+ return __copy_aux(__first, __last, __result, _BothPtrType< _InputIter, _ForwardIter> :: _Ret());
+}
+
+template <class _InputIter, class _ForwardIter>
+_STLP_INLINE_LOOP
+_ForwardIter
+__uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result,
+ const __false_type&)
+{
+ _ForwardIter __cur = __result;
+ _STLP_TRY {
+ for ( ; __first != __last; ++__first, ++__cur)
+ _Construct(&*__cur, *__first);
+ return __cur;
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(__result, __cur));
+# ifdef _STLP_THROW_RETURN_BUG
+ return __cur;
+# endif
+}
+
+template <class _InputIter, class _ForwardIter>
+inline _ForwardIter
+uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result) {
+ return __uninitialized_copy(__first, __last, __result, _IS_POD_ITER(__result, _ForwardIter));
+}
+
+inline char*
+uninitialized_copy(const char* __first, const char* __last, char* __result) {
+ return (char*)__copy_trivial (__first, __last, __result);
+}
+
+# ifdef _STLP_HAS_WCHAR_T // dwa 8/15/97
+inline wchar_t*
+uninitialized_copy(const wchar_t* __first, const wchar_t* __last, wchar_t* __result) {
+ return (wchar_t*)__copy_trivial (__first, __last, __result);
+}
+# endif /* _STLP_HAS_WCHAR_T */
+
+# ifndef _STLP_NO_EXTENSIONS
+// uninitialized_copy_n (not part of the C++ standard)
+
+template <class _InputIter, class _Size, class _ForwardIter>
+_STLP_INLINE_LOOP
+pair<_InputIter, _ForwardIter>
+__uninitialized_copy_n(_InputIter __first, _Size __count,
+ _ForwardIter __result,
+ const input_iterator_tag &)
+{
+ _ForwardIter __cur = __result;
+ _STLP_TRY {
+ for ( ; __count > 0 ; --__count, ++__first, ++__cur)
+ _Construct(&*__cur, *__first);
+ return pair<_InputIter, _ForwardIter>(__first, __cur);
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(__result, __cur));
+# ifdef _STLP_THROW_RETURN_BUG
+ return pair<_InputIter, _ForwardIter>(__first, __cur);
+# endif
+}
+
+# if defined(_STLP_NONTEMPL_BASE_MATCH_BUG)
+template <class _InputIterator, class _Size, class _ForwardIterator>
+inline pair<_InputIterator, _ForwardIterator>
+__uninitialized_copy_n(_InputIterator __first, _Size __count,
+ _ForwardIterator __result,
+ const forward_iterator_tag &) {
+ return __uninitialized_copy_n(__first, __count, __result, input_iterator_tag());
+}
+
+template <class _InputIterator, class _Size, class _ForwardIterator>
+inline pair<_InputIterator, _ForwardIterator>
+__uninitialized_copy_n(_InputIterator __first, _Size __count,
+ _ForwardIterator __result,
+ const bidirectional_iterator_tag &) {
+ return __uninitialized_copy_n(__first, __count, __result, input_iterator_tag());
+}
+# endif
+
+
+template <class _RandomAccessIter, class _Size, class _ForwardIter>
+inline pair<_RandomAccessIter, _ForwardIter>
+__uninitialized_copy_n(_RandomAccessIter __first, _Size __count, _ForwardIter __result, const random_access_iterator_tag &) {
+ _RandomAccessIter __last = __first + __count;
+ return pair<_RandomAccessIter, _ForwardIter>( __last, __uninitialized_copy(__first, __last, __result,
+ _IS_POD_ITER(__result, _ForwardIter)));
+}
+
+// this is used internally in <rope> , which is extension itself.
+template <class _InputIter, class _Size, class _ForwardIter>
+inline pair<_InputIter, _ForwardIter>
+uninitialized_copy_n(_InputIter __first, _Size __count,
+ _ForwardIter __result) {
+ return __uninitialized_copy_n(__first, __count, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+}
+# endif /* _STLP_NO_EXTENSIONS */
+
+// Valid if copy construction is equivalent to assignment, and if the
+// destructor is trivial.
+template <class _ForwardIter, class _Tp>
+inline void
+__uninitialized_fill(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __x, const __true_type&) {
+ _STLP_STD::fill(__first, __last, __x);
+}
+
+template <class _ForwardIter, class _Tp>
+_STLP_INLINE_LOOP void
+__uninitialized_fill(_ForwardIter __first, _ForwardIter __last,
+ const _Tp& __x, const __false_type&)
+{
+ _ForwardIter __cur = __first;
+ _STLP_TRY {
+ for ( ; __cur != __last; ++__cur)
+ _Construct(&*__cur, __x);
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(__first, __cur));
+}
+
+template <class _ForwardIter, class _Tp>
+inline void uninitialized_fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __x) {
+ __uninitialized_fill(__first, __last, __x, _IS_POD_ITER(__first, _ForwardIter));
+}
+
+// Valid if copy construction is equivalent to assignment, and if the
+// destructor is trivial.
+template <class _ForwardIter, class _Size, class _Tp>
+inline _ForwardIter
+__uninitialized_fill_n(_ForwardIter __first, _Size __n,
+ const _Tp& __x, const __true_type&) {
+ return _STLP_STD::fill_n(__first, __n, __x);
+}
+
+template <class _ForwardIter, class _Size, class _Tp>
+_STLP_INLINE_LOOP _ForwardIter
+__uninitialized_fill_n(_ForwardIter __first, _Size __n,
+ const _Tp& __x, const __false_type&)
+{
+ _ForwardIter __cur = __first;
+ _STLP_TRY {
+ for ( ; __n > 0; --__n, ++__cur)
+ _Construct(&*__cur, __x);
+ return __cur;
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(__first, __cur));
+# ifdef _STLP_THROW_RETURN_BUG
+ return __cur;
+# endif
+}
+
+template <class _ForwardIter, class _Size, class _Tp>
+inline _ForwardIter
+uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x) {
+ return __uninitialized_fill_n(__first, __n, __x, _IS_POD_ITER(__first, _ForwardIter));
+}
+
+// Extensions: __uninitialized_copy_copy, __uninitialized_copy_fill,
+// __uninitialized_fill_copy.
+
+// __uninitialized_copy_copy
+// Copies [first1, last1) into [result, result + (last1 - first1)), and
+// copies [first2, last2) into
+// [result, result + (last1 - first1) + (last2 - first2)).
+
+template <class _InputIter1, class _InputIter2, class _ForwardIter>
+inline _ForwardIter
+__uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _ForwardIter __result, __true_type)
+{
+ return __uninitialized_copy(__first2, __last2,
+ __uninitialized_copy(__first1, __last1, __result, __true_type()), __true_type());
+}
+
+template <class _InputIter1, class _InputIter2, class _ForwardIter>
+inline _ForwardIter
+__uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _ForwardIter __result, __false_type)
+{
+ _ForwardIter __mid = __uninitialized_copy(__first1, __last1, __result, _IS_POD_ITER(__result, _ForwardIter));
+ _STLP_TRY {
+ return __uninitialized_copy(__first2, __last2, __mid , _IS_POD_ITER(__result, _ForwardIter));
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(__result, __mid));
+# ifdef _STLP_THROW_RETURN_BUG
+ return __mid;
+# endif
+}
+
+// __uninitialized_fill_copy
+// Fills [result, mid) with x, and copies [first, last) into
+// [mid, mid + (last - first)).
+template <class _ForwardIter, class _Tp, class _InputIter>
+inline _ForwardIter
+__uninitialized_fill_copy(_ForwardIter __result, _ForwardIter __mid, const _Tp& __x,
+ _InputIter __first, _InputIter __last)
+{
+ typedef typename __type_traits<_Tp>::is_POD_type _I_POD;
+ __uninitialized_fill(__result, __mid, __x, _I_POD());
+ _STLP_TRY {
+ return __uninitialized_copy(__first, __last, __mid, _I_POD());
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(__result, __mid));
+# ifdef _STLP_THROW_RETURN_BUG
+ return __result;
+# endif
+}
+
+// __uninitialized_copy_fill
+// Copies [first1, last1) into [first2, first2 + (last1 - first1)), and
+// fills [first2 + (last1 - first1), last2) with x.
+template <class _InputIter, class _ForwardIter, class _Tp>
+inline void
+__uninitialized_copy_fill(_InputIter __first1, _InputIter __last1,
+ _ForwardIter __first2, _ForwardIter __last2,
+ const _Tp& __x)
+{
+ typedef typename __type_traits<_Tp>::is_POD_type _I_POD;
+ _ForwardIter __mid2 = __uninitialized_copy(__first1, __last1, __first2, _I_POD());
+ _STLP_TRY {
+ __uninitialized_fill(__mid2, __last2, __x, _I_POD());
+ }
+ _STLP_UNWIND(_STLP_STD::_Destroy(__first2, __mid2));
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_UNINITIALIZED_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_valarray.c b/src/STLport/stl/_valarray.c
new file mode 100644
index 0000000..3381ca2
--- /dev/null
+++ b/src/STLport/stl/_valarray.c
@@ -0,0 +1,197 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_VALARRAY_C
+#define _STLP_VALARRAY_C
+
+#ifndef _STLP_VALARRAY_H
+# include <stl/_valarray.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp>
+_Valarray_bool valarray<_Tp>:: operator!() const {
+ _Valarray_bool __tmp(this->size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ __tmp[__i] = !(*this)[__i];
+ return __tmp;
+}
+
+// Behavior is undefined if __x and *this have different sizes
+template <class _Tp>
+valarray<_Tp>& valarray<_Tp>::operator=(const slice_array<_Tp>& __x)
+{
+ size_t __index = __x._M_slice.start();
+ for (size_t __i = 0;
+ __i < __x._M_slice.size();
+ ++__i, __index += __x._M_slice.stride())
+ (*this)[__i] = __x._M_array[__index];
+ return *this;
+}
+
+template <class _Tp>
+valarray<_Tp> valarray<_Tp>::operator[](slice __slice) const {
+ valarray<_Tp> __tmp(__slice.size(), _NoInit());
+ size_t __index = __slice.start();
+ for (size_t __i = 0;
+ __i < __slice.size();
+ ++__i, __index += __slice.stride())
+ __tmp[__i] = (*this)[__index];
+ return __tmp;
+}
+
+template <class _Size>
+bool _Gslice_Iter_tmpl<_Size>::_M_incr() {
+ size_t __dim = _M_indices.size() - 1;
+ ++_M_step;
+ while (true) {
+ _M_1d_idx += _M_gslice._M_strides[__dim];
+ if (++_M_indices[__dim] != _M_gslice._M_lengths[__dim])
+ return true;
+ else if (__dim != 0) {
+ _M_1d_idx -=
+ _M_gslice._M_strides[__dim] * _M_gslice._M_lengths[__dim];
+ _M_indices[__dim] = 0;
+ --__dim;
+ }
+ else
+ return false;
+ }
+}
+
+// Behavior is undefined if __x and *this have different sizes, or if
+// __x was constructed from a degenerate gslice.
+template <class _Tp>
+valarray<_Tp>& valarray<_Tp>::operator=(const gslice_array<_Tp>& __x)
+{
+ if (this->size() != 0) {
+ _Gslice_Iter __i(__x._M_gslice);
+ do
+ (*this)[__i._M_step] = __x._M_array[__i._M_1d_idx];
+ while(__i._M_incr());
+ }
+ return *this;
+}
+
+template <class _Tp>
+valarray<_Tp> valarray<_Tp>::operator[](gslice __slice) const
+{
+ valarray<_Tp> __tmp(__slice._M_size(), _NoInit());
+ if (__tmp.size() != 0) {
+ _Gslice_Iter __i(__slice);
+ do __tmp[__i._M_step] = (*this)[__i._M_1d_idx]; while(__i._M_incr());
+ }
+ return __tmp;
+}
+
+template <class _Tp>
+valarray<_Tp> valarray<_Tp>::operator[](const _Valarray_bool& __mask) const
+{
+ size_t _p_size = 0;
+ {
+ for (size_t __i = 0; __i < __mask.size(); ++__i)
+ if (__mask[__i]) ++_p_size;
+ }
+
+ valarray<_Tp> __tmp(_p_size, _NoInit());
+ size_t __idx = 0;
+ {
+ for (size_t __i = 0; __i < __mask.size(); ++__i)
+ if (__mask[__i]) __tmp[__idx++] = (*this)[__i];
+ }
+
+ return __tmp;
+}
+
+template <class _Tp>
+valarray<_Tp>& valarray<_Tp>::operator=(const indirect_array<_Tp>& __x) {
+ for (size_t __i = 0; __i < __x._M_addr.size(); ++__i)
+ (*this)[__i] = __x._M_array[__x._M_addr[__i]];
+ return *this;
+}
+
+template <class _Tp>
+valarray<_Tp>
+valarray<_Tp>::operator[](const _Valarray_size_t& __addr) const
+{
+ valarray<_Tp> __tmp(__addr.size(), _NoInit());
+ for (size_t __i = 0; __i < __addr.size(); ++__i)
+ __tmp[__i] = (*this)[__addr[__i]];
+ return __tmp;
+}
+
+//----------------------------------------------------------------------
+// Other valarray noninline member functions
+
+// Shift and cshift
+
+template <class _Tp>
+valarray<_Tp> valarray<_Tp>::shift(int __n) const
+{
+ valarray<_Tp> __tmp(this->size());
+
+ if (__n >= 0) {
+ if (__n < this->size())
+ copy(this->_M_first + __n, this->_M_first + this->size(),
+ __tmp._M_first);
+ }
+ else {
+ if (-__n < this->size())
+ copy(this->_M_first, this->_M_first + this->size() + __n,
+ __tmp._M_first - __n);
+ }
+ return __tmp;
+}
+
+template <class _Tp>
+valarray<_Tp> valarray<_Tp>::cshift(int __m) const
+{
+ valarray<_Tp> __tmp(this->size());
+
+ // Reduce __m to an equivalent number in the range [0, size()). We
+ // have to be careful with negative numbers, since the sign of a % b
+ // is unspecified when a < 0.
+ long __n = __m;
+ if (this->size() < (numeric_limits<long>::max)())
+ __n %= long(this->size());
+ if (__n < 0)
+ __n += this->size();
+
+ copy(this->_M_first, this->_M_first + __n,
+ __tmp._M_first + (this->size() - __n));
+ copy(this->_M_first + __n, this->_M_first + this->size(),
+ __tmp._M_first);
+
+ return __tmp;
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_VALARRAY_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_valarray.h b/src/STLport/stl/_valarray.h
new file mode 100644
index 0000000..be8b5b7
--- /dev/null
+++ b/src/STLport/stl/_valarray.h
@@ -0,0 +1,1657 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_VALARRAY_H
+#define _STLP_VALARRAY_H
+
+#ifndef _STLP_CMATH_H_HEADER
+#include <stl/_cmath.h>
+#endif
+#ifndef _STLP_INTERNAL_NEW_HEADER
+#include <stl/_new.h>
+#endif
+#ifndef _STLP_INTERNAL_ALGO_H
+#include <stl/_algo.h>
+#endif
+#ifndef _STLP_INTERNAL_NUMERIC_H
+#include <stl/_numeric.h>
+#endif
+#ifndef _STLP_LIMITS_H
+#include <limits>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+class slice;
+class gslice;
+
+template <class _Tp> class valarray;
+typedef valarray<bool> _Valarray_bool;
+typedef valarray<size_t> _Valarray_size_t;
+
+template <class _Tp> class slice_array;
+template <class _Tp> class gslice_array;
+template <class _Tp> class mask_array;
+template <class _Tp> class indirect_array;
+
+//----------------------------------------------------------------------
+// class valarray
+
+// Base class to handle memory allocation and deallocation. We can't just
+// use vector<>, because vector<bool> would be unsuitable as an internal
+// representation for valarray<bool>.
+
+template <class _Tp>
+struct _Valarray_base
+{
+ _Tp* _M_first;
+ size_t _M_size;
+
+ _Valarray_base() : _M_first(0), _M_size(0) {}
+ _Valarray_base(size_t __n) : _M_first(0), _M_size(0) { _M_allocate(__n); }
+ ~_Valarray_base() { _M_deallocate(); }
+
+ void _M_allocate(size_t __n) {
+ if (__n != 0) {
+ _M_first = __STATIC_CAST(_Tp*, (malloc(__n * sizeof(_Tp))));
+ _M_size = __n;
+# if !defined(_STLP_NO_BAD_ALLOC) && defined(_STLP_USE_EXCEPTIONS)
+ if (_M_first == 0) {
+ _M_size = 0;
+ throw _STLP_STD::bad_alloc();
+ }
+# endif
+ }
+ else {
+ _M_first = 0;
+ _M_size = 0;
+ }
+ }
+
+ void _M_deallocate() {
+ free(_M_first);
+ _M_first = 0;
+ _M_size = 0;
+ }
+};
+
+template <class _Tp>
+class valarray : private _Valarray_base<_Tp>
+{
+ friend class gslice;
+
+public:
+ typedef _Tp value_type;
+
+ // Basic constructors
+ valarray() : _Valarray_base<_Tp>() {}
+ valarray(size_t __n) : _Valarray_base<_Tp>(__n)
+ { uninitialized_fill_n(this->_M_first, this->_M_size, value_type()); }
+ valarray(const value_type& __x, size_t __n) : _Valarray_base<_Tp>(__n)
+ { uninitialized_fill_n(this->_M_first, this->_M_size, __x); }
+ valarray(const value_type* __p, size_t __n) : _Valarray_base<_Tp>(__n)
+ { uninitialized_copy(__p, __p + __n, this->_M_first); }
+ valarray(const valarray<_Tp>& __x) : _Valarray_base<_Tp>(__x._M_size) {
+ uninitialized_copy(__x._M_first, __x._M_first + __x._M_size,
+ this->_M_first);
+ }
+
+ // Constructors from auxiliary array types
+ valarray(const slice_array<_Tp>&);
+ valarray(const gslice_array<_Tp>&);
+ valarray(const mask_array<_Tp>&);
+ valarray(const indirect_array<_Tp>&);
+
+ // Destructor
+ ~valarray() { _STLP_STD::_Destroy(this->_M_first, this->_M_first + this->_M_size); }
+
+ // Extension: constructor that doesn't initialize valarray elements to a
+ // specific value. This is faster for types such as int and double.
+private:
+ void _M_initialize(const __true_type&) {}
+ void _M_initialize(const __false_type&)
+ { uninitialized_fill_n(this->_M_first, this->_M_size, value_type()); }
+
+public:
+ struct _NoInit {};
+ valarray(size_t __n, _NoInit) : _Valarray_base<_Tp>(__n) {
+ typedef typename __type_traits<_Tp>::has_trivial_default_constructor _Is_Trivial;
+ _M_initialize(_Is_Trivial());
+ }
+
+public: // Assignment
+ // Basic assignment. Note that 'x = y' is undefined if x.size() != y.size()
+ valarray<_Tp>& operator=(const valarray<_Tp>& __x) {
+ _STLP_ASSERT(__x.size() == this->size())
+ if (this != &__x)
+ copy(__x._M_first, __x._M_first + __x._M_size, this->_M_first);
+ return *this;
+ }
+
+ // Scalar assignment
+ valarray<_Tp>& operator=(const value_type& __x) {
+ fill_n(this->_M_first, this->_M_size, __x);
+ return *this;
+ }
+
+ // Assignment of auxiliary array types
+ valarray<_Tp>& operator=(const slice_array<_Tp>&);
+ valarray<_Tp>& operator=(const gslice_array<_Tp>&);
+ valarray<_Tp>& operator=(const mask_array<_Tp>&);
+ valarray<_Tp>& operator=(const indirect_array<_Tp>&);
+
+public: // Element access
+ value_type operator[](size_t __n) const { return this->_M_first[__n]; }
+ value_type& operator[](size_t __n) { return this->_M_first[__n]; }
+ size_t size() const { return this->_M_size; }
+
+public: // Subsetting operations with auxiliary type
+ valarray<_Tp> operator[](slice) const;
+ slice_array<_Tp> operator[](slice);
+ valarray<_Tp> operator[](gslice) const;
+ gslice_array<_Tp> operator[](const gslice&);
+ valarray<_Tp> operator[](const _Valarray_bool&) const;
+ mask_array<_Tp> operator[](const _Valarray_bool&);
+ valarray<_Tp> operator[](const _Valarray_size_t&) const;
+ indirect_array<_Tp> operator[](const _Valarray_size_t&);
+
+public: // Unary operators.
+ valarray<_Tp> operator+() const { return *this; }
+
+ valarray<_Tp> operator-() const {
+ valarray<_Tp> __tmp(this->size(), _NoInit());
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ __tmp[__i] = -(*this)[__i];
+ return __tmp;
+ }
+
+ valarray<_Tp> operator~() const {
+ valarray<_Tp> __tmp(this->size(), _NoInit());
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ __tmp[__i] = ~(*this)[__i];
+ return __tmp;
+ }
+
+ _Valarray_bool operator!() const;
+
+public: // Scalar computed assignment.
+ valarray<_Tp>& operator*= (const value_type& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] *= __x;
+ return *this;
+ }
+
+ valarray<_Tp>& operator/= (const value_type& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] /= __x;
+ return *this;
+ }
+
+ valarray<_Tp>& operator%= (const value_type& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] %= __x;
+ return *this;
+ }
+
+ valarray<_Tp>& operator+= (const value_type& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] += __x;
+ return *this;
+ }
+
+ valarray<_Tp>& operator-= (const value_type& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] -= __x;
+ return *this;
+ }
+
+ valarray<_Tp>& operator^= (const value_type& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] ^= __x;
+ return *this;
+ }
+
+ valarray<_Tp>& operator&= (const value_type& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] &= __x;
+ return *this;
+ }
+
+ valarray<_Tp>& operator|= (const value_type& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] |= __x;
+ return *this;
+ }
+
+ valarray<_Tp>& operator<<= (const value_type& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] <<= __x;
+ return *this;
+ }
+
+ valarray<_Tp>& operator>>= (const value_type& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] >>= __x;
+ return *this;
+ }
+
+public: // Array computed assignment.
+ valarray<_Tp>& operator*= (const valarray<_Tp>& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] *= __x[__i];
+ return *this;
+ }
+
+ valarray<_Tp>& operator/= (const valarray<_Tp>& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] /= __x[__i];
+ return *this;
+ }
+
+ valarray<_Tp>& operator%= (const valarray<_Tp>& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] %= __x[__i];
+ return *this;
+ }
+
+ valarray<_Tp>& operator+= (const valarray<_Tp>& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] += __x[__i];
+ return *this;
+ }
+
+ valarray<_Tp>& operator-= (const valarray<_Tp>& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] -= __x[__i];
+ return *this;
+ }
+
+ valarray<_Tp>& operator^= (const valarray<_Tp>& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] ^= __x[__i];
+ return *this;
+ }
+
+ valarray<_Tp>& operator&= (const valarray<_Tp>& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] &= __x[__i];
+ return *this;
+ }
+
+ valarray<_Tp>& operator|= (const valarray<_Tp>& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] |= __x[__i];
+ return *this;
+ }
+
+ valarray<_Tp>& operator<<= (const valarray<_Tp>& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] <<= __x[__i];
+ return *this;
+ }
+
+ valarray<_Tp>& operator>>= (const valarray<_Tp>& __x) {
+ for (size_t __i = 0; __i < this->size(); ++__i)
+ (*this)[__i] >>= __x[__i];
+ return *this;
+ }
+
+public: // Other member functions.
+
+ // The result is undefined for zero-length arrays
+ value_type sum() const {
+ return accumulate(this->_M_first + 1, this->_M_first + this->_M_size,
+ (*this)[0]);
+ }
+
+ // The result is undefined for zero-length arrays
+ value_type (min) () const {
+ return *min_element(this->_M_first + 0, this->_M_first + this->_M_size);
+ }
+
+ value_type (max) () const {
+ return *max_element(this->_M_first + 0, this->_M_first + this->_M_size);
+ }
+
+ valarray<_Tp> shift(int __n) const;
+ valarray<_Tp> cshift(int __n) const;
+
+ valarray<_Tp> apply(value_type __f(value_type)) const {
+ valarray<_Tp> __tmp(this->size());
+ transform(this->_M_first + 0, this->_M_first + this->_M_size, __tmp._M_first,
+ __f);
+ return __tmp;
+ }
+ valarray<_Tp> apply(value_type __f(const value_type&)) const {
+ valarray<_Tp> __tmp(this->size());
+ transform(this->_M_first + 0, this->_M_first + this->_M_size, __tmp._M_first,
+ __f);
+ return __tmp;
+ }
+
+ void resize(size_t __n, value_type __x = value_type()) {
+ _STLP_STD::_Destroy(this->_M_first, this->_M_first + this->_M_size);
+ this->_Valarray_base<_Tp>::_M_deallocate();
+ this->_Valarray_base<_Tp>::_M_allocate(__n);
+ uninitialized_fill_n(this->_M_first, this->_M_size, __x);
+ }
+};
+
+//----------------------------------------------------------------------
+// valarray non-member functions.
+
+// Binary arithmetic operations between two arrays. Behavior is
+// undefined if the two arrays do not have the same length.
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator*(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] * __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator/(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] / __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator%(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] % __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator+(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] + __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator-(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] - __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator^(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] ^ __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator&(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] & __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator|(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] | __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator<<(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] << __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator>>(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] >> __y[__i];
+ return __tmp;
+}
+
+// Binary arithmetic operations between an array and a scalar.
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator*(const valarray<_Tp>& __x, const _Tp& __c) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] * __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator*(const _Tp& __c, const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c * __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator/(const valarray<_Tp>& __x, const _Tp& __c) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] / __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator/(const _Tp& __c, const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c / __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator%(const valarray<_Tp>& __x, const _Tp& __c) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] % __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator%(const _Tp& __c, const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c % __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator+(const valarray<_Tp>& __x, const _Tp& __c) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] + __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator+(const _Tp& __c, const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c + __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator-(const valarray<_Tp>& __x, const _Tp& __c) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] - __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator-(const _Tp& __c, const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c - __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator^(const valarray<_Tp>& __x, const _Tp& __c) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] ^ __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator^(const _Tp& __c, const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c ^ __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator&(const valarray<_Tp>& __x, const _Tp& __c) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] & __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator&(const _Tp& __c, const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c & __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator|(const valarray<_Tp>& __x, const _Tp& __c) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] | __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator|(const _Tp& __c, const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c | __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator<<(const valarray<_Tp>& __x, const _Tp& __c) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] << __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator<<(const _Tp& __c, const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c << __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator>>(const valarray<_Tp>& __x, const _Tp& __c) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] >> __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> _STLP_CALL operator>>(const _Tp& __c, const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c >> __x[__i];
+ return __tmp;
+}
+
+// Binary logical operations between two arrays. Behavior is undefined
+// if the two arrays have different lengths. Note that operator== does
+// not do what you might at first expect.
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator==(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] == __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator<(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] < __y[__i];
+ return __tmp;
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator!=(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] != __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator>(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] > __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator<=(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] <= __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator>=(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] >= __y[__i];
+ return __tmp;
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+// fbp : swap ?
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator&&(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] && __y[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator||(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] || __y[__i];
+ return __tmp;
+}
+
+// Logical operations between an array and a scalar.
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator==(const valarray<_Tp>& __x, const _Tp& __c)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] == __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator==(const _Tp& __c, const valarray<_Tp>& __x)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c == __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator!=(const valarray<_Tp>& __x, const _Tp& __c)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] != __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator!=(const _Tp& __c, const valarray<_Tp>& __x)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c != __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator<(const valarray<_Tp>& __x, const _Tp& __c)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] < __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator<(const _Tp& __c, const valarray<_Tp>& __x)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c < __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator>(const valarray<_Tp>& __x, const _Tp& __c)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] > __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator>(const _Tp& __c, const valarray<_Tp>& __x)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c > __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator<=(const valarray<_Tp>& __x, const _Tp& __c)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] <= __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator<=(const _Tp& __c, const valarray<_Tp>& __x)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c <= __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator>=(const valarray<_Tp>& __x, const _Tp& __c)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] >= __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator>=(const _Tp& __c, const valarray<_Tp>& __x)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c >= __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator&&(const valarray<_Tp>& __x, const _Tp& __c)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] && __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator&&(const _Tp& __c, const valarray<_Tp>& __x)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c && __x[__i];
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator||(const valarray<_Tp>& __x, const _Tp& __c)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __x[__i] || __c;
+ return __tmp;
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator||(const _Tp& __c, const valarray<_Tp>& __x)
+{
+ _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = __c || __x[__i];
+ return __tmp;
+}
+
+// valarray "transcendentals" (the list includes abs and sqrt, which,
+// of course, are not transcendental).
+
+template <class _Tp>
+inline valarray<_Tp> abs(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_ABS(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> acos(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_ACOS(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> asin(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_ASIN(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> atan(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_ATAN(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> atan2(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_ATAN2(_Tp)(__x[__i], __y[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> atan2(const valarray<_Tp>& __x, const _Tp& __c) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_ATAN2(_Tp)(__x[__i], __c);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> atan2(const _Tp& __c, const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_ATAN2(_Tp)(__c, __x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> cos(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_COS(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> cosh(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_COSH(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> exp(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_EXP(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> log(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_LOG(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> log10(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_LOG10(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> pow(const valarray<_Tp>& __x,
+ const valarray<_Tp>& __y) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_POW(_Tp)(__x[__i], __y[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> pow(const valarray<_Tp>& __x, const _Tp& __c) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_POW(_Tp)(__x[__i], __c);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> pow(const _Tp& __c, const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_POW(_Tp)(__c, __x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> sin(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_SIN(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> sinh(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_SINH(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> sqrt(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_SQRT(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> tan(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_TAN(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> tanh(const valarray<_Tp>& __x) {
+ typedef typename valarray<_Tp>::_NoInit _NoInit;
+ valarray<_Tp> __tmp(__x.size(), _NoInit());
+ for (size_t __i = 0; __i < __x.size(); ++__i)
+ __tmp[__i] = _STLP_DO_TANH(_Tp)(__x[__i]);
+ return __tmp;
+}
+
+//----------------------------------------------------------------------
+// slice and slice_array
+
+class slice {
+public:
+ slice() : _M_start(0), _M_length(0), _M_stride(0) {}
+ slice(size_t __start, size_t __length, size_t __stride)
+ : _M_start(__start), _M_length(__length), _M_stride(__stride)
+ {}
+ __TRIVIAL_DESTRUCTOR(slice)
+
+ size_t start() const { return _M_start; }
+ size_t size() const { return _M_length; }
+ size_t stride() const { return _M_stride; }
+
+
+private:
+ size_t _M_start;
+ size_t _M_length;
+ size_t _M_stride;
+};
+
+template <class _Tp>
+class slice_array {
+ friend class valarray<_Tp>;
+public:
+ typedef _Tp value_type;
+
+ void operator=(const valarray<value_type>& __x) const {
+ size_t __index = _M_slice.start();
+ for (size_t __i = 0;
+ __i < _M_slice.size();
+ ++__i, __index += _M_slice.stride())
+ _M_array[__index] = __x[__i];
+ }
+
+ void operator*=(const valarray<value_type>& __x) const {
+ size_t __index = _M_slice.start();
+ for (size_t __i = 0;
+ __i < _M_slice.size();
+ ++__i, __index += _M_slice.stride())
+ _M_array[__index] *= __x[__i];
+ }
+
+ void operator/=(const valarray<value_type>& __x) const {
+ size_t __index = _M_slice.start();
+ for (size_t __i = 0;
+ __i < _M_slice.size();
+ ++__i, __index += _M_slice.stride())
+ _M_array[__index] /= __x[__i];
+ }
+
+ void operator%=(const valarray<value_type>& __x) const {
+ size_t __index = _M_slice.start();
+ for (size_t __i = 0;
+ __i < _M_slice.size();
+ ++__i, __index += _M_slice.stride())
+ _M_array[__index] %= __x[__i];
+ }
+
+ void operator+=(const valarray<value_type>& __x) const {
+ size_t __index = _M_slice.start();
+ for (size_t __i = 0;
+ __i < _M_slice.size();
+ ++__i, __index += _M_slice.stride())
+ _M_array[__index] += __x[__i];
+ }
+
+ void operator-=(const valarray<value_type>& __x) const {
+ size_t __index = _M_slice.start();
+ for (size_t __i = 0;
+ __i < _M_slice.size();
+ ++__i, __index += _M_slice.stride())
+ _M_array[__index] -= __x[__i];
+ }
+
+ void operator^=(const valarray<value_type>& __x) const {
+ size_t __index = _M_slice.start();
+ for (size_t __i = 0;
+ __i < _M_slice.size();
+ ++__i, __index += _M_slice.stride())
+ _M_array[__index] ^= __x[__i];
+ }
+
+ void operator&=(const valarray<value_type>& __x) const {
+ size_t __index = _M_slice.start();
+ for (size_t __i = 0;
+ __i < _M_slice.size();
+ ++__i, __index += _M_slice.stride())
+ _M_array[__index] &= __x[__i];
+ }
+
+ void operator|=(const valarray<value_type>& __x) const {
+ size_t __index = _M_slice.start();
+ for (size_t __i = 0;
+ __i < _M_slice.size();
+ ++__i, __index += _M_slice.stride())
+ _M_array[__index] |= __x[__i];
+ }
+
+ void operator<<=(const valarray<value_type>& __x) const {
+ size_t __index = _M_slice.start();
+ for (size_t __i = 0;
+ __i < _M_slice.size();
+ ++__i, __index += _M_slice.stride())
+ _M_array[__index] <<= __x[__i];
+ }
+
+ void operator>>=(const valarray<value_type>& __x) const {
+ size_t __index = _M_slice.start();
+ for (size_t __i = 0;
+ __i < _M_slice.size();
+ ++__i, __index += _M_slice.stride())
+ _M_array[__index] >>= __x[__i];
+ }
+
+ void operator=(const value_type& __c) {
+ size_t __index = _M_slice.start();
+ for (size_t __i = 0;
+ __i < _M_slice.size();
+ ++__i, __index += _M_slice.stride())
+ _M_array[__index] = __c;
+ }
+
+ ~slice_array() {}
+
+private:
+ slice_array(const slice& __slice, valarray<_Tp>& __array)
+ : _M_slice(__slice), _M_array(__array)
+ {}
+
+ slice _M_slice;
+ valarray<_Tp>& _M_array;
+
+private: // Disable assignment and default constructor
+ slice_array();
+};
+
+// valarray member functions dealing with slice and slice_array
+
+template <class _Tp>
+inline valarray<_Tp>::valarray(const slice_array<_Tp>& __x)
+ : _Valarray_base<_Tp>(__x._M_slice.size())
+{
+ typedef typename __type_traits<_Tp>::has_trivial_default_constructor
+ _Is_Trivial;
+ _M_initialize(_Is_Trivial());
+ *this = __x;
+}
+
+
+template <class _Tp>
+inline slice_array<_Tp> valarray<_Tp>::operator[](slice __slice) {
+ return slice_array<_Tp>(__slice, *this);
+}
+
+//----------------------------------------------------------------------
+// gslice and gslice_array
+
+template <class _Size>
+struct _Gslice_Iter_tmpl;
+
+class gslice {
+ friend struct _Gslice_Iter_tmpl<size_t>;
+public:
+ gslice() : _M_start(0), _M_lengths(0), _M_strides(0) {}
+ gslice(size_t __start,
+ const _Valarray_size_t& __lengths, const _Valarray_size_t& __strides)
+ : _M_start(__start), _M_lengths(__lengths), _M_strides(__strides)
+ {}
+ __TRIVIAL_DESTRUCTOR(gslice)
+
+ size_t start() const { return _M_start; }
+ _Valarray_size_t size() const { return _M_lengths; }
+ _Valarray_size_t stride() const { return _M_strides; }
+
+ // Extension: check for an empty gslice.
+ bool _M_empty() const { return _M_lengths.size() == 0; }
+
+ // Extension: number of indices this gslice represents. (For a degenerate
+ // gslice, they're not necessarily all distinct.)
+ size_t _M_size() const {
+ return !this->_M_empty()
+ ? accumulate(_M_lengths._M_first + 1,
+ _M_lengths._M_first + _M_lengths._M_size,
+ _M_lengths[0],
+ multiplies<size_t>())
+ : 0;
+ }
+
+# ifndef __HP_aCC
+private:
+# endif
+
+ size_t _M_start;
+ _Valarray_size_t _M_lengths;
+ _Valarray_size_t _M_strides;
+};
+
+// This is not an STL iterator. It is constructed from a gslice, and it
+// steps through the gslice indices in sequence. See 23.3.6 of the C++
+// standard, paragraphs 2-3, for an explanation of the sequence. At
+// each step we get two things: the ordinal (i.e. number of steps taken),
+// and the one-dimensional index.
+
+template <class _Size>
+struct _Gslice_Iter_tmpl {
+ _Gslice_Iter_tmpl(const gslice& __gslice)
+ : _M_step(0), _M_1d_idx(__gslice.start()),
+ _M_indices(size_t(0), __gslice._M_lengths.size()),
+ _M_gslice(__gslice)
+ {}
+
+ bool _M_done() const { return _M_indices[0] == _M_gslice._M_lengths[0]; }
+
+ bool _M_incr();
+
+ _Size _M_step;
+ _Size _M_1d_idx;
+
+ valarray<_Size> _M_indices;
+ const gslice& _M_gslice;
+};
+
+typedef _Gslice_Iter_tmpl<size_t> _Gslice_Iter;
+
+template <class _Tp>
+class gslice_array {
+ friend class valarray<_Tp>;
+public:
+ typedef _Tp value_type;
+
+ void operator= (const valarray<value_type>& __x) const {
+ if (!_M_gslice._M_empty()) {
+ _Gslice_Iter __i(_M_gslice);
+ do _M_array[__i._M_1d_idx] = __x[__i._M_step]; while(__i._M_incr());
+ }
+ }
+
+ void operator*= (const valarray<value_type>& __x) const {
+ if (!_M_gslice._M_empty()) {
+ _Gslice_Iter __i(_M_gslice);
+ do _M_array[__i._M_1d_idx] *= __x[__i._M_step]; while(__i._M_incr());
+ }
+ }
+
+ void operator/= (const valarray<value_type>& __x) const {
+ if (!_M_gslice._M_empty()) {
+ _Gslice_Iter __i(_M_gslice);
+ do _M_array[__i._M_1d_idx] /= __x[__i._M_step]; while(__i._M_incr());
+ }
+ }
+
+ void operator%= (const valarray<value_type>& __x) const {
+ if (!_M_gslice._M_empty()) {
+ _Gslice_Iter __i(_M_gslice);
+ do _M_array[__i._M_1d_idx] %= __x[__i._M_step]; while(__i._M_incr());
+ }
+ }
+
+ void operator+= (const valarray<value_type>& __x) const {
+ if (!_M_gslice._M_empty()) {
+ _Gslice_Iter __i(_M_gslice);
+ do _M_array[__i._M_1d_idx] += __x[__i._M_step]; while(__i._M_incr());
+ }
+ }
+
+ void operator-= (const valarray<value_type>& __x) const {
+ if (!_M_gslice._M_empty()) {
+ _Gslice_Iter __i(_M_gslice);
+ do _M_array[__i._M_1d_idx] -= __x[__i._M_step]; while(__i._M_incr());
+ }
+ }
+
+ void operator^= (const valarray<value_type>& __x) const {
+ if (!_M_gslice._M_empty()) {
+ _Gslice_Iter __i(_M_gslice);
+ do _M_array[__i._M_1d_idx] ^= __x[__i._M_step]; while(__i._M_incr());
+ }
+ }
+
+ void operator&= (const valarray<value_type>& __x) const {
+ if (!_M_gslice._M_empty()) {
+ _Gslice_Iter __i(_M_gslice);
+ do _M_array[__i._M_1d_idx] &= __x[__i._M_step]; while(__i._M_incr());
+ }
+ }
+
+ void operator|= (const valarray<value_type>& __x) const {
+ if (!_M_gslice._M_empty()) {
+ _Gslice_Iter __i(_M_gslice);
+ do _M_array[__i._M_1d_idx] |= __x[__i._M_step]; while(__i._M_incr());
+ }
+ }
+
+ void operator<<= (const valarray<value_type>& __x) const {
+ if (!_M_gslice._M_empty()) {
+ _Gslice_Iter __i(_M_gslice);
+ do _M_array[__i._M_1d_idx] <<= __x[__i._M_step]; while(__i._M_incr());
+ }
+ }
+
+ void operator>>= (const valarray<value_type>& __x) const {
+ if (!_M_gslice._M_empty()) {
+ _Gslice_Iter __i(_M_gslice);
+ do _M_array[__i._M_1d_idx] >>= __x[__i._M_step]; while(__i._M_incr());
+ }
+ }
+
+ void operator= (const value_type& __c) {
+ if (!_M_gslice._M_empty()) {
+ _Gslice_Iter __i(_M_gslice);
+ do _M_array[__i._M_1d_idx] = __c; while(__i._M_incr());
+ }
+ }
+
+ ~gslice_array() {}
+
+private:
+ gslice_array(gslice __gslice, valarray<_Tp>& __array)
+ : _M_gslice(__gslice), _M_array(__array)
+ {}
+
+ gslice _M_gslice;
+ valarray<value_type>& _M_array;
+
+private: // Disable assignment
+ void operator=(const gslice_array<_Tp>&);
+};
+
+// valarray member functions dealing with gslice and gslice_array. Note
+// that it is illegal (behavior is undefined) to construct a gslice_array
+// from a degenerate gslice.
+
+template <class _Tp>
+inline valarray<_Tp>::valarray(const gslice_array<_Tp>& __x)
+ : _Valarray_base<_Tp>(__x._M_gslice._M_size())
+{
+ typedef typename __type_traits<_Tp>::has_trivial_default_constructor
+ _Is_Trivial;
+ _M_initialize(_Is_Trivial());
+ *this = __x;
+}
+
+template <class _Tp>
+inline gslice_array<_Tp> valarray<_Tp>::operator[](const gslice& __slice) {
+ return gslice_array<_Tp>(__slice, *this);
+}
+
+
+//----------------------------------------------------------------------
+// mask_array
+
+template <class _Tp>
+class mask_array {
+ friend class valarray<_Tp>;
+public:
+ typedef _Tp value_type;
+
+ void operator=(const valarray<value_type>& __x) const {
+ size_t __idx = 0;
+ for (size_t __i = 0; __i < _M_array.size(); ++__i)
+ if (_M_mask[__i]) _M_array[__i] = __x[__idx++];
+ }
+
+ void operator*=(const valarray<value_type>& __x) const {
+ size_t __idx = 0;
+ for (size_t __i = 0; __i < _M_array.size(); ++__i)
+ if (_M_mask[__i]) _M_array[__i] *= __x[__idx++];
+ }
+
+ void operator/=(const valarray<value_type>& __x) const {
+ size_t __idx = 0;
+ for (size_t __i = 0; __i < _M_array.size(); ++__i)
+ if (_M_mask[__i]) _M_array[__i] /= __x[__idx++];
+ }
+
+ void operator%=(const valarray<value_type>& __x) const {
+ size_t __idx = 0;
+ for (size_t __i = 0; __i < _M_array.size(); ++__i)
+ if (_M_mask[__i]) _M_array[__i] %= __x[__idx++];
+ }
+
+ void operator+=(const valarray<value_type>& __x) const {
+ size_t __idx = 0;
+ for (size_t __i = 0; __i < _M_array.size(); ++__i)
+ if (_M_mask[__i]) _M_array[__i] += __x[__idx++];
+ }
+
+ void operator-=(const valarray<value_type>& __x) const {
+ size_t __idx = 0;
+ for (size_t __i = 0; __i < _M_array.size(); ++__i)
+ if (_M_mask[__i]) _M_array[__i] -= __x[__idx++];
+ }
+
+ void operator^=(const valarray<value_type>& __x) const {
+ size_t __idx = 0;
+ for (size_t __i = 0; __i < _M_array.size(); ++__i)
+ if (_M_mask[__i]) _M_array[__i] ^= __x[__idx++];
+ }
+
+ void operator&=(const valarray<value_type>& __x) const {
+ size_t __idx = 0;
+ for (size_t __i = 0; __i < _M_array.size(); ++__i)
+ if (_M_mask[__i]) _M_array[__i] &= __x[__idx++];
+ }
+
+ void operator|=(const valarray<value_type>& __x) const {
+ size_t __idx = 0;
+ for (size_t __i = 0; __i < _M_array.size(); ++__i)
+ if (_M_mask[__i]) _M_array[__i] |= __x[__idx++];
+ }
+
+ void operator<<=(const valarray<value_type>& __x) const {
+ size_t __idx = 0;
+ for (size_t __i = 0; __i < _M_array.size(); ++__i)
+ if (_M_mask[__i]) _M_array[__i] <<= __x[__idx++];
+ }
+
+ void operator>>=(const valarray<value_type>& __x) const {
+ size_t __idx = 0;
+ for (size_t __i = 0; __i < _M_array.size(); ++__i)
+ if (_M_mask[__i]) _M_array[__i] >>= __x[__idx++];
+ }
+
+ void operator=(const value_type& __c) const {
+ for (size_t __i = 0; __i < _M_array.size(); ++__i)
+ if (_M_mask[__i]) _M_array[__i] = __c;
+ }
+
+ ~mask_array() {}
+
+ // Extension: number of true values in the mask
+ size_t _M_num_true() const {
+ size_t __result = 0;
+ for (size_t __i = 0; __i < _M_mask.size(); ++__i)
+ if (_M_mask[__i]) ++__result;
+ return __result;
+ }
+
+private:
+ mask_array(const _Valarray_bool& __mask, valarray<_Tp>& __array)
+ : _M_mask(__mask), _M_array(__array)
+ {}
+
+ _Valarray_bool _M_mask;
+ valarray<_Tp>& _M_array;
+
+private: // Disable assignment
+ void operator=(const mask_array<_Tp>&);
+};
+
+// valarray member functions dealing with mask_array
+
+template <class _Tp>
+inline valarray<_Tp>::valarray(const mask_array<_Tp>& __x)
+ : _Valarray_base<_Tp>(__x._M_num_true())
+{
+ typedef typename __type_traits<_Tp>::has_trivial_default_constructor
+ _Is_Trivial;
+ _M_initialize(_Is_Trivial());
+ *this = __x;
+}
+
+// Behavior is undefined if __x._M_num_true() != this->size()
+template <class _Tp>
+inline valarray<_Tp>& valarray<_Tp>::operator=(const mask_array<_Tp>& __x) {
+ size_t __idx = 0;
+ for (size_t __i = 0; __i < __x._M_array.size(); ++__i)
+ if (__x._M_mask[__i]) (*this)[__idx++] = __x._M_array[__i];
+ return *this;
+}
+
+template <class _Tp>
+inline mask_array<_Tp> valarray<_Tp>::operator[](const _Valarray_bool& __mask)
+{
+ return mask_array<_Tp>(__mask, *this);
+}
+
+
+//----------------------------------------------------------------------
+// indirect_array
+
+template <class _Tp>
+class indirect_array {
+ friend class valarray<_Tp>;
+public:
+ typedef _Tp value_type;
+
+ void operator=(const valarray<value_type>& __x) const {
+ for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+ _M_array[_M_addr[__i]] = __x[__i];
+ }
+
+ void operator*=(const valarray<value_type>& __x) const {
+ for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+ _M_array[_M_addr[__i]] *= __x[__i];
+ }
+
+ void operator/=(const valarray<value_type>& __x) const {
+ for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+ _M_array[_M_addr[__i]] /= __x[__i];
+ }
+
+ void operator%=(const valarray<value_type>& __x) const {
+ for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+ _M_array[_M_addr[__i]] %= __x[__i];
+ }
+
+ void operator+=(const valarray<value_type>& __x) const {
+ for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+ _M_array[_M_addr[__i]] += __x[__i];
+ }
+
+ void operator-=(const valarray<value_type>& __x) const {
+ for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+ _M_array[_M_addr[__i]] -= __x[__i];
+ }
+
+ void operator^=(const valarray<value_type>& __x) const {
+ for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+ _M_array[_M_addr[__i]] ^= __x[__i];
+ }
+
+ void operator&=(const valarray<value_type>& __x) const {
+ for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+ _M_array[_M_addr[__i]] &= __x[__i];
+ }
+
+ void operator|=(const valarray<value_type>& __x) const {
+ for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+ _M_array[_M_addr[__i]] |= __x[__i];
+ }
+
+ void operator<<=(const valarray<value_type>& __x) const {
+ for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+ _M_array[_M_addr[__i]] <<= __x[__i];
+ }
+
+ void operator>>=(const valarray<value_type>& __x) const {
+ for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+ _M_array[_M_addr[__i]] >>= __x[__i];
+ }
+
+ void operator=(const value_type& __c) const {
+ for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+ _M_array[_M_addr[__i]] = __c;
+ }
+
+ ~indirect_array() {}
+
+private:
+ indirect_array(const _Valarray_size_t& __addr, valarray<_Tp>& __array)
+ : _M_addr(__addr), _M_array(__array)
+ {}
+
+ _Valarray_size_t _M_addr;
+ valarray<_Tp>& _M_array;
+
+private: // Disable assignment
+ void operator=(const indirect_array<_Tp>&);
+};
+
+// valarray member functions dealing with indirect_array
+
+template <class _Tp>
+inline valarray<_Tp>::valarray(const indirect_array<_Tp>& __x)
+ : _Valarray_base<_Tp>(__x._M_addr.size())
+{
+ typedef typename __type_traits<_Tp>::has_trivial_default_constructor
+ _Is_Trivial;
+ _M_initialize(_Is_Trivial());
+ *this = __x;
+}
+
+
+template <class _Tp>
+inline indirect_array<_Tp>
+valarray<_Tp>::operator[](const _Valarray_size_t& __addr)
+{
+ return indirect_array<_Tp>(__addr, *this);
+}
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_valarray.c>
+# endif
+
+#endif /* _STLP_VALARRAY */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_vector.c b/src/STLport/stl/_vector.c
new file mode 100644
index 0000000..30ec488
--- /dev/null
+++ b/src/STLport/stl/_vector.c
@@ -0,0 +1,137 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_VECTOR_C
+#define _STLP_VECTOR_C
+
+# if !defined (_STLP_INTERNAL_VECTOR_H)
+# include <stl/_vector.h>
+# endif
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+# define iterator _Tp*
+# define size_type size_t
+# endif
+
+# undef vector
+# define vector __WORKAROUND_DBG_RENAME(vector)
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp, class _Alloc>
+void
+__vector__<_Tp, _Alloc>::reserve(size_type __n) {
+ if (capacity() < __n) {
+ const size_type __old_size = size();
+ pointer __tmp;
+ if (this->_M_start) {
+ __tmp = _M_allocate_and_copy(__n, this->_M_start, this->_M_finish);
+ _M_clear();
+ } else {
+ __tmp = this->_M_end_of_storage.allocate(__n);
+ }
+ _M_set(__tmp, __tmp + __old_size, __tmp + __n);
+ }
+}
+
+template <class _Tp, class _Alloc>
+void
+__vector__<_Tp, _Alloc>::_M_fill_insert(
+ iterator __position,
+ size_type __n, const _Tp& __x) {
+ if (__n != 0) {
+ if (size_type(this->_M_end_of_storage._M_data - this->_M_finish) >= __n) {
+ _Tp __x_copy = __x;
+ const size_type __elems_after = this->_M_finish - __position;
+ pointer __old_finish = this->_M_finish;
+ if (__elems_after > __n) {
+ __uninitialized_copy(this->_M_finish - __n, this->_M_finish, this->_M_finish, _IsPODType());
+ this->_M_finish += __n;
+ __copy_backward_ptrs(__position, __old_finish - __n, __old_finish, _TrivialAss());
+ _STLP_STD::fill(__position, __position + __n, __x_copy);
+ }
+ else {
+ uninitialized_fill_n(this->_M_finish, __n - __elems_after, __x_copy);
+ this->_M_finish += __n - __elems_after;
+ __uninitialized_copy(__position, __old_finish, this->_M_finish, _IsPODType());
+ this->_M_finish += __elems_after;
+ _STLP_STD::fill(__position, __old_finish, __x_copy);
+ }
+ }
+ else
+ _M_insert_overflow(__position, __x, _IsPODType(), __n);
+ }
+}
+
+template <class _Tp, class _Alloc>
+__vector__<_Tp,_Alloc>&
+__vector__<_Tp,_Alloc>::operator=(const __vector__<_Tp, _Alloc>& __x)
+{
+ if (&__x != this) {
+ const size_type __xlen = __x.size();
+ if (__xlen > capacity()) {
+ pointer __tmp = _M_allocate_and_copy(__xlen, (const_pointer)__x._M_start+0, (const_pointer)__x._M_finish+0);
+ _M_clear();
+ this->_M_start = __tmp;
+ this->_M_end_of_storage._M_data = this->_M_start + __xlen;
+ }
+ else if (size() >= __xlen) {
+ pointer __i = __copy_ptrs((const_pointer)__x._M_start+0, (const_pointer)__x._M_finish+0, (pointer)this->_M_start, _TrivialAss());
+ _STLP_STD::_Destroy(__i, this->_M_finish);
+ }
+ else {
+ __copy_ptrs((const_pointer)__x._M_start, (const_pointer)__x._M_start + size(), (pointer)this->_M_start, _TrivialAss());
+ __uninitialized_copy((const_pointer)__x._M_start + size(), (const_pointer)__x._M_finish+0, this->_M_finish, _IsPODType());
+ }
+ this->_M_finish = this->_M_start + __xlen;
+ }
+ return *this;
+}
+
+template <class _Tp, class _Alloc>
+void __vector__<_Tp, _Alloc>::_M_fill_assign(size_t __n, const _Tp& __val) {
+ if (__n > capacity()) {
+ __vector__<_Tp, _Alloc> __tmp(__n, __val, get_allocator());
+ __tmp.swap(*this);
+ }
+ else if (__n > size()) {
+ fill(begin(), end(), __val);
+ this->_M_finish = _STLP_STD::uninitialized_fill_n(this->_M_finish, __n - size(), __val);
+ }
+ else
+ erase(_STLP_STD::fill_n(begin(), __n, __val), end());
+}
+
+_STLP_END_NAMESPACE
+
+# undef size_type
+# undef iterator
+# undef vector
+
+#endif /* _STLP_VECTOR_C */
+
+ // Local Variables:
+ // mode:C++
+ // End:
diff --git a/src/STLport/stl/_vector.h b/src/STLport/stl/_vector.h
new file mode 100644
index 0000000..7ad440c
--- /dev/null
+++ b/src/STLport/stl/_vector.h
@@ -0,0 +1,591 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_VECTOR_H
+#define _STLP_INTERNAL_VECTOR_H
+
+
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+# include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_UNINITIALIZED_H
+# include <stl/_uninitialized.h>
+# endif
+
+# ifndef _STLP_RANGE_ERRORS_H
+# include <stl/_range_errors.h>
+# endif
+
+# undef vector
+# define vector __WORKAROUND_DBG_RENAME(vector)
+
+_STLP_BEGIN_NAMESPACE
+
+// The vector base class serves two purposes. First, its constructor
+// and destructor allocate (but don't initialize) storage. This makes
+// exception safety easier.
+
+template <class _Tp, class _Alloc>
+class _Vector_base {
+public:
+
+ _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+ typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type;
+
+ _Vector_base(const _Alloc& __a)
+ : _M_start(0), _M_finish(0), _M_end_of_storage(__a, 0) {
+ }
+ _Vector_base(size_t __n, const _Alloc& __a)
+ : _M_start(0), _M_finish(0), _M_end_of_storage(__a, 0)
+ {
+ _M_start = _M_end_of_storage.allocate(__n);
+ _M_finish = _M_start;
+ _M_end_of_storage._M_data = _M_start + __n;
+ _STLP_MPWFIX_TRY _STLP_MPWFIX_CATCH
+ }
+
+ ~_Vector_base() {
+ if (_M_start !=0)
+ _M_end_of_storage.deallocate(_M_start, _M_end_of_storage._M_data - _M_start);
+ }
+
+protected:
+ _Tp* _M_start;
+ _Tp* _M_finish;
+ _STLP_alloc_proxy<_Tp*, _Tp, allocator_type> _M_end_of_storage;
+};
+
+template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
+class vector : public _Vector_base<_Tp, _Alloc>
+{
+private:
+ typedef _Vector_base<_Tp, _Alloc> _Base;
+public:
+ typedef _Tp value_type;
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
+ typedef value_type* iterator;
+ typedef const value_type* const_iterator;
+
+public:
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef random_access_iterator_tag _Iterator_category;
+
+ _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+ _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+ typedef typename _Vector_base<_Tp, _Alloc>::allocator_type allocator_type;
+
+ allocator_type get_allocator() const {
+ return _STLP_CONVERT_ALLOCATOR((const allocator_type&)this->_M_end_of_storage, _Tp);
+ }
+protected:
+ typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _TrivialAss;
+ typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _IsPODType;
+
+ // handles insertions on overflow
+ void _M_insert_overflow(pointer __position, const _Tp& __x, const __false_type&,
+ size_type __fill_len, bool __atend = false) {
+ const size_type __old_size = size();
+ const size_type __len = __old_size + (max)(__old_size, __fill_len);
+
+ pointer __new_start = this->_M_end_of_storage.allocate(__len);
+ pointer __new_finish = __new_start;
+ _STLP_TRY {
+ __new_finish = __uninitialized_copy(this->_M_start, __position, __new_start, __false_type());
+ // handle insertion
+ if (__fill_len == 1) {
+ _Construct(__new_finish, __x);
+ ++__new_finish;
+ } else
+ __new_finish = __uninitialized_fill_n(__new_finish, __fill_len, __x, __false_type());
+ if (!__atend)
+ // copy remainder
+ __new_finish = __uninitialized_copy(__position, this->_M_finish, __new_finish, __false_type());
+ }
+ _STLP_UNWIND((_Destroy(__new_start,__new_finish),
+ this->_M_end_of_storage.deallocate(__new_start,__len)));
+ _M_clear();
+ _M_set(__new_start, __new_finish, __new_start + __len);
+ }
+
+ void _M_insert_overflow(pointer __position, const _Tp& __x, const __true_type&,
+ size_type __fill_len, bool __atend = false) {
+ const size_type __old_size = size();
+ const size_type __len = __old_size + (max)(__old_size, __fill_len);
+
+ pointer __new_start = this->_M_end_of_storage.allocate(__len);
+ pointer __new_finish = (pointer)__copy_trivial(this->_M_start, __position, __new_start);
+ // handle insertion
+ __new_finish = fill_n(__new_finish, __fill_len, __x);
+ if (!__atend)
+ // copy remainder
+ __new_finish = (pointer)__copy_trivial(__position, this->_M_finish, __new_finish);
+ _M_clear();
+ _M_set(__new_start, __new_finish, __new_start + __len);
+ }
+
+ void _M_range_check(size_type __n) const {
+ if (__n >= size_type(this->_M_finish-this->_M_start))
+ __stl_throw_out_of_range("vector");
+ }
+
+public:
+ iterator begin() { return this->_M_start; }
+ const_iterator begin() const { return this->_M_start; }
+ iterator end() { return this->_M_finish; }
+ const_iterator end() const { return this->_M_finish; }
+
+ reverse_iterator rbegin() { return reverse_iterator(end()); }
+ const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
+ reverse_iterator rend() { return reverse_iterator(begin()); }
+ const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
+
+ size_type size() const { return size_type(this->_M_finish - this->_M_start); }
+ size_type max_size() const { return size_type(-1) / sizeof(_Tp); }
+ size_type capacity() const { return size_type(this->_M_end_of_storage._M_data - this->_M_start); }
+ bool empty() const { return this->_M_start == this->_M_finish; }
+
+ reference operator[](size_type __n) { return *(begin() + __n); }
+ const_reference operator[](size_type __n) const { return *(begin() + __n); }
+
+ reference front() { return *begin(); }
+ const_reference front() const { return *begin(); }
+ reference back() { return *(end() - 1); }
+ const_reference back() const { return *(end() - 1); }
+
+ reference at(size_type __n) { _M_range_check(__n); return (*this)[__n]; }
+ const_reference at(size_type __n) const { _M_range_check(__n); return (*this)[__n]; }
+
+ explicit vector(const allocator_type& __a = allocator_type()) :
+ _Vector_base<_Tp, _Alloc>(__a) {}
+
+ vector(size_type __n, const _Tp& __val,
+ const allocator_type& __a = allocator_type())
+ : _Vector_base<_Tp, _Alloc>(__n, __a) {
+ this->_M_finish = uninitialized_fill_n(this->_M_start, __n, __val);
+ }
+
+ explicit vector(size_type __n)
+ : _Vector_base<_Tp, _Alloc>(__n, allocator_type() ) {
+ this->_M_finish = uninitialized_fill_n(this->_M_start, __n, _Tp());
+ }
+
+ vector(const vector<_Tp, _Alloc>& __x)
+ : _Vector_base<_Tp, _Alloc>(__x.size(), __x.get_allocator()) {
+ this->_M_finish = __uninitialized_copy((const_pointer)__x._M_start,
+ (const_pointer)__x._M_finish, this->_M_start, _IsPODType());
+ }
+
+#if defined (_STLP_MEMBER_TEMPLATES)
+
+ template <class _Integer>
+ void _M_initialize_aux(_Integer __n, _Integer __val, const __true_type&) {
+ this->_M_start = this->_M_end_of_storage.allocate(__n);
+ this->_M_end_of_storage._M_data = this->_M_start + __n;
+ this->_M_finish = uninitialized_fill_n(this->_M_start, __n, __val);
+ }
+
+ template <class _InputIterator>
+ void _M_initialize_aux(_InputIterator __first, _InputIterator __last,
+ const __false_type&) {
+ _M_range_initialize(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+ }
+
+ // Check whether it's an integral type. If so, it's not an iterator.
+ # ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ vector(_InputIterator __first, _InputIterator __last) :
+ _Vector_base<_Tp, _Alloc>(allocator_type()) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_initialize_aux(__first, __last, _Integral());
+ }
+ # endif
+ template <class _InputIterator>
+ vector(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL ) :
+ _Vector_base<_Tp, _Alloc>(__a) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_initialize_aux(__first, __last, _Integral());
+ }
+
+#else
+ vector(const _Tp* __first, const _Tp* __last,
+ const allocator_type& __a = allocator_type())
+ : _Vector_base<_Tp, _Alloc>(__last - __first, __a) {
+ this->_M_finish = __uninitialized_copy(__first, __last, this->_M_start, _IsPODType());
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ ~vector() { _Destroy(this->_M_start, this->_M_finish); }
+
+ vector<_Tp, _Alloc>& operator=(const vector<_Tp, _Alloc>& __x);
+
+ void reserve(size_type __n);
+
+ // assign(), a generalized assignment member function. Two
+ // versions: one that takes a count, and one that takes a range.
+ // The range version is a member template, so we dispatch on whether
+ // or not the type is an integer.
+
+ void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); }
+ void _M_fill_assign(size_type __n, const _Tp& __val);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _ForwardIter>
+ void _M_assign_aux(_ForwardIter __first, _ForwardIter __last, const forward_iterator_tag &)
+#else
+ void assign(const_iterator __first, const_iterator __last)
+#endif
+ {
+ size_type __len = distance(__first, __last);
+
+ if (__len > capacity()) {
+ iterator __tmp = _M_allocate_and_copy(__len, __first, __last);
+ _M_clear();
+ _M_set(__tmp, __tmp + __len, __tmp + __len);
+ }
+ else if (size() >= __len) {
+ iterator __new_finish = copy(__first, __last, this->_M_start);
+ _Destroy(__new_finish, this->_M_finish);
+ this->_M_finish = __new_finish;
+ }
+ else {
+# if defined ( _STLP_MEMBER_TEMPLATES )
+ _ForwardIter __mid = __first;
+ advance(__mid, size());
+# else
+ const_iterator __mid = __first + size() ;
+# endif
+ copy(__first, __mid, this->_M_start);
+ this->_M_finish = __uninitialized_copy(__mid, __last, this->_M_finish, _IsPODType());
+ }
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIter>
+ void _M_assign_aux(_InputIter __first, _InputIter __last,
+ const input_iterator_tag &) {
+ iterator __cur = begin();
+ for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
+ *__cur = *__first;
+ if (__first == __last)
+ erase(__cur, end());
+ else
+ insert(end(), __first, __last);
+ }
+
+ template <class _Integer>
+ void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type&)
+ { assign((size_type) __n, (_Tp) __val); }
+
+ template <class _InputIter>
+ void _M_assign_dispatch(_InputIter __first, _InputIter __last, const __false_type&)
+ { _M_assign_aux(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter)); }
+
+ template <class _InputIterator>
+ void assign(_InputIterator __first, _InputIterator __last) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_assign_dispatch(__first, __last, _Integral());
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ void push_back(const _Tp& __x) {
+ if (this->_M_finish != this->_M_end_of_storage._M_data) {
+ _Construct(this->_M_finish, __x);
+ ++this->_M_finish;
+ }
+ else
+ _M_insert_overflow(this->_M_finish, __x, _IsPODType(), 1UL, true);
+ }
+
+ void swap(vector<_Tp, _Alloc>& __x) {
+ _STLP_STD::swap(this->_M_start, __x._M_start);
+ _STLP_STD::swap(this->_M_finish, __x._M_finish);
+ _STLP_STD::swap(this->_M_end_of_storage, __x._M_end_of_storage);
+ }
+
+ iterator insert(iterator __position, const _Tp& __x) {
+ size_type __n = __position - begin();
+ if (this->_M_finish != this->_M_end_of_storage._M_data) {
+ if (__position == end()) {
+ _Construct(this->_M_finish, __x);
+ ++this->_M_finish;
+ } else {
+ _Construct(this->_M_finish, *(this->_M_finish - 1));
+ ++this->_M_finish;
+ _Tp __x_copy = __x;
+ __copy_backward_ptrs(__position, this->_M_finish - 2, this->_M_finish - 1, _TrivialAss());
+ *__position = __x_copy;
+ }
+ }
+ else
+ _M_insert_overflow(__position, __x, _IsPODType(), 1UL);
+ return begin() + __n;
+ }
+
+# ifndef _STLP_NO_ANACHRONISMS
+ void push_back() { push_back(_Tp()); }
+ iterator insert(iterator __position) { return insert(__position, _Tp()); }
+# endif
+
+ void _M_fill_insert (iterator __pos, size_type __n, const _Tp& __x);
+
+#if defined ( _STLP_MEMBER_TEMPLATES)
+
+ template <class _Integer>
+ void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
+ const __true_type&) {
+ _M_fill_insert(__pos, (size_type) __n, (_Tp) __val);
+ }
+
+ template <class _InputIterator>
+ void _M_insert_dispatch(iterator __pos,
+ _InputIterator __first, _InputIterator __last,
+ const __false_type&) {
+ _M_range_insert(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+ }
+
+ // Check whether it's an integral type. If so, it's not an iterator.
+ template <class _InputIterator>
+ void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
+ typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+ _M_insert_dispatch(__pos, __first, __last, _Integral());
+ }
+
+ template <class _InputIterator>
+ void _M_range_insert(iterator __pos,
+ _InputIterator __first,
+ _InputIterator __last,
+ const input_iterator_tag &) {
+ for ( ; __first != __last; ++__first) {
+ __pos = insert(__pos, *__first);
+ ++__pos;
+ }
+ }
+
+ template <class _ForwardIterator>
+ void _M_range_insert(iterator __position,
+ _ForwardIterator __first,
+ _ForwardIterator __last,
+ const forward_iterator_tag &)
+#else /* _STLP_MEMBER_TEMPLATES */
+ void insert(iterator __position,
+ const_iterator __first, const_iterator __last)
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ {
+ if (__first != __last) {
+ size_type __n = distance(__first, __last);
+
+ if (size_type(this->_M_end_of_storage._M_data - this->_M_finish) >= __n) {
+ const size_type __elems_after = this->_M_finish - __position;
+ pointer __old_finish = this->_M_finish;
+ if (__elems_after > __n) {
+ __uninitialized_copy(this->_M_finish - __n, this->_M_finish, this->_M_finish, _IsPODType());
+ this->_M_finish += __n;
+ __copy_backward_ptrs(__position, __old_finish - __n, __old_finish, _TrivialAss());
+ copy(__first, __last, __position);
+ }
+ else {
+# if defined ( _STLP_MEMBER_TEMPLATES )
+ _ForwardIterator __mid = __first;
+ advance(__mid, __elems_after);
+# else
+ const_pointer __mid = __first + __elems_after;
+# endif
+ __uninitialized_copy(__mid, __last, this->_M_finish, _IsPODType());
+ this->_M_finish += __n - __elems_after;
+ __uninitialized_copy(__position, __old_finish, this->_M_finish, _IsPODType());
+ this->_M_finish += __elems_after;
+ copy(__first, __mid, __position);
+ } /* elems_after */
+ }
+ else {
+ const size_type __old_size = size();
+ const size_type __len = __old_size + (max)(__old_size, __n);
+ pointer __new_start = this->_M_end_of_storage.allocate(__len);
+ pointer __new_finish = __new_start;
+ _STLP_TRY {
+ __new_finish = __uninitialized_copy(this->_M_start, __position, __new_start, _IsPODType());
+ __new_finish = __uninitialized_copy(__first, __last, __new_finish, _IsPODType());
+ __new_finish = __uninitialized_copy(__position, this->_M_finish, __new_finish, _IsPODType());
+ }
+ _STLP_UNWIND((_Destroy(__new_start,__new_finish),
+ this->_M_end_of_storage.deallocate(__new_start,__len)));
+ _M_clear();
+ _M_set(__new_start, __new_finish, __new_start + __len);
+ }
+ }
+ }
+ void insert (iterator __pos, size_type __n, const _Tp& __x)
+ { _M_fill_insert(__pos, __n, __x); }
+
+ void pop_back() {
+ --this->_M_finish;
+ _Destroy(this->_M_finish);
+ }
+ iterator erase(iterator __position) {
+ if (__position + 1 != end())
+ __copy_ptrs(__position + 1, this->_M_finish, __position, _TrivialAss());
+ --this->_M_finish;
+ _Destroy(this->_M_finish);
+ return __position;
+ }
+ iterator erase(iterator __first, iterator __last) {
+ pointer __i = __copy_ptrs(__last, this->_M_finish, __first, _TrivialAss());
+ _Destroy(__i, this->_M_finish);
+ this->_M_finish = __i;
+ return __first;
+ }
+
+ void resize(size_type __new_size, _Tp __x) {
+ if (__new_size < size())
+ erase(begin() + __new_size, end());
+ else
+ insert(end(), __new_size - size(), __x);
+ }
+ void resize(size_type __new_size) { resize(__new_size, _Tp()); }
+ void clear() {
+ erase(begin(), end());
+ }
+
+protected:
+
+ void _M_clear() {
+ // if (this->_M_start) {
+ _Destroy(this->_M_start, this->_M_finish);
+ this->_M_end_of_storage.deallocate(this->_M_start, this->_M_end_of_storage._M_data - this->_M_start);
+ // }
+ }
+
+ void _M_set(pointer __s, pointer __f, pointer __e) {
+ this->_M_start = __s;
+ this->_M_finish = __f;
+ this->_M_end_of_storage._M_data = __e;
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _ForwardIterator>
+ pointer _M_allocate_and_copy(size_type __n, _ForwardIterator __first,
+ _ForwardIterator __last)
+#else /* _STLP_MEMBER_TEMPLATES */
+ pointer _M_allocate_and_copy(size_type __n, const_pointer __first,
+ const_pointer __last)
+#endif /* _STLP_MEMBER_TEMPLATES */
+ {
+ pointer __result = this->_M_end_of_storage.allocate(__n);
+ _STLP_TRY {
+#if !defined(__MRC__) //*TY 12/17/2000 - added workaround for MrCpp. it confuses on nested try/catch block
+ __uninitialized_copy(__first, __last, __result, _IsPODType());
+#else
+ uninitialized_copy(__first, __last, __result);
+#endif
+ return __result;
+ }
+ _STLP_UNWIND(this->_M_end_of_storage.deallocate(__result, __n));
+# ifdef _STLP_THROW_RETURN_BUG
+ return __result;
+# endif
+ }
+
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void _M_range_initialize(_InputIterator __first,
+ _InputIterator __last, const input_iterator_tag &) {
+ for ( ; __first != __last; ++__first)
+ push_back(*__first);
+ }
+ // This function is only called by the constructor.
+ template <class _ForwardIterator>
+ void _M_range_initialize(_ForwardIterator __first,
+ _ForwardIterator __last, const forward_iterator_tag &) {
+ size_type __n = distance(__first, __last);
+ this->_M_start = this->_M_end_of_storage.allocate(__n);
+ this->_M_end_of_storage._M_data = this->_M_start + __n;
+ this->_M_finish = __uninitialized_copy(__first, __last, this->_M_start, _IsPODType());
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+};
+
+# define _STLP_TEMPLATE_CONTAINER vector<_Tp, _Alloc>
+# define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
+# include <stl/_relops_cont.h>
+# undef _STLP_TEMPLATE_CONTAINER
+# undef _STLP_TEMPLATE_HEADER
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS allocator<void*>;
+_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<void**, void*, allocator<void*> >;
+_STLP_EXPORT_TEMPLATE_CLASS _Vector_base<void*,allocator<void*> >;
+_STLP_EXPORT_TEMPLATE_CLASS vector<void*,allocator<void*> >;
+# endif
+
+# undef vector
+# undef __vector__
+# define __vector__ __WORKAROUND_RENAME(vector)
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/_vector.c>
+# endif
+
+#ifndef _STLP_INTERNAL_BVECTOR_H
+# include <stl/_bvector.h>
+#endif
+
+# if defined (_STLP_DEBUG)
+# include <stl/debug/_vector.h>
+# endif
+
+# if defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM)
+# include <stl/wrappers/_vector.h>
+# endif
+
+#endif /* _STLP_VECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/c_locale.h b/src/STLport/stl/c_locale.h
new file mode 100644
index 0000000..0a619ea
--- /dev/null
+++ b/src/STLport/stl/c_locale.h
@@ -0,0 +1,436 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+
+#ifndef _STLP_C_LOCALE_H
+# define _STLP_C_LOCALE_H
+
+/*
+ * Implementation dependent definitions
+ */
+#ifdef __cplusplus
+# include <stl/_config.h>
+#endif
+
+#if defined(__sgi)
+# if defined(ROOT_65) /* IRIX 6.5.x */
+# include <sgidefs.h>
+# include <standards.h>
+# include <wchar.h>
+# include <ctype.h>
+
+# else
+ /* IRIX pre-6.5 */
+# include <sgidefs.h>
+# include <standards.h>
+
+# if !defined(_SIZE_T) && !defined(_SIZE_T_)
+# define _SIZE_T
+# if (_MIPS_SZLONG == 32)
+typedef unsigned int size_t;
+# endif
+# if (_MIPS_SZLONG == 64)
+typedef unsigned long size_t;
+# endif
+# endif
+
+# ifndef _WCHAR_T
+# define _WCHAR_T
+# if (_MIPS_SZLONG == 32)
+typedef long wchar_t;
+# endif
+# if (_MIPS_SZLONG == 64)
+typedef __int32_t wchar_t;
+# endif
+# endif /* _WCHAR_T */
+
+# ifndef _WINT_T
+# define _WINT_T
+# if (_MIPS_SZLONG == 32)
+ typedef long wint_t;
+# endif
+# if (_MIPS_SZLONG == 64)
+ typedef __int32_t wint_t;
+# endif
+# endif /* _WINT_T */
+
+# ifndef _MBSTATE_T
+# define _MBSTATE_T
+# ifdef _MSC_VER
+ typedef int mbstate_t;
+# else
+ typedef char mbstate_t;
+# endif
+# endif /* _MBSTATE_T */
+
+# endif /* ROOT65 */
+
+# else /* __sgi */
+
+# ifdef __cplusplus
+# ifndef _STLP_CSTDDEF
+# include <cstddef>
+# endif
+# ifndef _STLP_CWCHAR_H
+# include <stl/_cwchar.h>
+# endif
+# ifndef _STLP_CCTYPE
+# include <cctype>
+# endif
+# else
+# include <stddef.h>
+# include <wchar.h>
+# include <ctype.h>
+# endif
+
+#endif /* __sgi */
+
+/*
+ * GENERAL FRAMEWORK
+ */
+
+struct _Locale_ctype;
+struct _Locale_numeric;
+struct _Locale_time;
+struct _Locale_collate;
+struct _Locale_monetary;
+struct _Locale_messages;
+
+/*
+ Bitmask macros.
+*/
+
+/*
+ * For narrow characters, we expose the lookup table interface.
+ */
+
+/* Internal bitmask macros, os-specific. */
+
+#if defined(__sgi) /* IRIX */
+
+#define _Locale_S 0x00000008 /* Spacing character */
+#define _Locale_A 0x00004000 /* Alphabetical characters only */
+#define _Locale_B 0x00000040 /* Obsolete: was space char only */
+#define _Locale_PR 0x00008000 /* Printable characters only */
+#define _Locale_G 0x40000000 /* Graphic characters only */
+#define _Locale_BL 0x80000000 /* The blank character class */
+
+/* Public bitmask macros, must be defined for every OS. These values, of
+ * course, are specific to IRIX. */
+
+#define _Locale_CNTRL 0x00000020 /* Control character */
+#define _Locale_UPPER 0x00000001 /* Upper case */
+#define _Locale_LOWER 0x00000002 /* Lower case */
+#define _Locale_DIGIT 0x00000004 /* Numeral (digit) */
+#define _Locale_XDIGIT 0x00000080 /* heXadecimal digit */
+#define _Locale_PUNCT 0x00000010 /* Punctuation */
+#define _Locale_SPACE (_Locale_S | _Locale_BL)
+#define _Locale_PRINT (_Locale_PUNCT | _Locale_UPPER | _Locale_LOWER | \
+ _Locale_DIGIT | _Locale_A | _Locale_XDIGIT | \
+ _Locale_PR)
+#define _Locale_ALPHA _Locale_A
+
+/*
+* All of these except for graph and blank are from the C standard;
+* graph and blank are XPG4. (graph in XPG4 doesn't mean quite the
+* same thing as graph in the C++ library)
+*/
+
+#endif /* IRIX */
+
+
+#if defined( __Lynx__ )
+ /* azov: On Lynx isalpha defined as (_U | _L), which gives us a mask
+ * unusable in ctype_table. So we have to redefine it and use hard-coded
+ * numbers (to avoid potential clashes if system headers change).
+ *
+ * P.S. Actually, I see no reason in using platform-specific masks -
+ * having just one set of masks for all platforms should work just as
+ * well - we only use them internally and they don't have to be equal
+ * to whatever defined in local ctype.h
+ *
+ */
+# define _Locale_CNTRL 040 /* _C, Control character */
+# define _Locale_UPPER 01 /* _U, Upper case */
+# define _Locale_LOWER 02 /* _L, Lower case */
+# define _Locale_DIGIT 04 /* _N, Numeral (digit) */
+# define _Locale_XDIGIT 0200 /* _X, heXadecimal digit */
+# define _Locale_PUNCT 020 /* _P, Punctuation */
+# define _Locale_SPACE 010 /* _S, Spacing */
+# define _Locale_ALPHA 040000 /* none, Alphanumerical */
+# define _Locale_PRINT (_Locale_PUNCT | _Locale_UPPER | _Locale_LOWER | \
+ _Locale_DIGIT | _Locale_ALPHA | _Locale_XDIGIT |\
+ _Locale_SPACE ) /* Printable */
+# endif /* __Lynx__ */
+
+#if defined(__GNUC__) || defined (__BORLANDC__) || defined (__COMO__)
+
+# if defined (__CYGWIN__)
+
+# define _Locale_CNTRL 040
+# define _Locale_UPPER 02
+# define _Locale_LOWER 01
+# define _Locale_DIGIT 04
+# define _Locale_XDIGIT ( 0100 | _Locale_DIGIT )
+# define _Locale_PUNCT 020
+# define _Locale_SPACE 010
+# define _Locale_ALPHA (_Locale_UPPER | _Locale_LOWER)
+# define _Locale_PRINT (_Locale_ALPHA | _Locale_DIGIT | _Locale_PUNCT | 0200 )
+
+# elif defined (__FreeBSD__)
+
+# define _Locale_CNTRL _CTYPE_C
+# define _Locale_UPPER _CTYPE_U
+# define _Locale_LOWER _CTYPE_L
+# define _Locale_DIGIT _CTYPE_D
+# define _Locale_XDIGIT _CTYPE_X
+# define _Locale_PUNCT _CTYPE_P
+# define _Locale_SPACE _CTYPE_S
+# define _Locale_PRINT _CTYPE_R
+# define _Locale_ALPHA _CTYPE_A
+
+# elif defined (__NetBSD__) || defined (__amigaos__)
+
+# define _Locale_CNTRL _C
+# define _Locale_UPPER _U
+# define _Locale_LOWER _L
+# define _Locale_DIGIT _N
+# define _Locale_XDIGIT (_N|_X)
+# define _Locale_PUNCT _P
+# define _Locale_SPACE _S
+# define _Locale_PRINT (_P|_U|_L|_N|_B)
+# define _Locale_ALPHA (_U|_L)
+# elif defined(__EMX__) /* OS/2 with emx runtime */
+# define _Locale_CNTRL _CNTRL
+# define _Locale_UPPER _UPPER
+# define _Locale_LOWER _LOWER
+# define _Locale_DIGIT _DIGIT
+# define _Locale_XDIGIT _XDIGIT
+# define _Locale_PUNCT _PUNCT
+# define _Locale_SPACE _SPACE
+# define _Locale_PRINT _PRINT
+# define _Locale_ALPHA (_UPPER|_LOWER)
+
+# elif defined(_STLP_USE_GLIBC) /* linux, using the gnu compiler */
+
+/* This section uses macros defined in the gnu libc ctype.h header */
+
+# define _Locale_CNTRL _IScntrl
+# define _Locale_UPPER _ISupper
+# define _Locale_LOWER _ISlower
+# define _Locale_DIGIT _ISdigit
+# define _Locale_XDIGIT _ISxdigit
+# define _Locale_PUNCT _ISpunct
+# define _Locale_SPACE _ISspace
+# define _Locale_PRINT _ISprint
+# define _Locale_ALPHA _ISalpha
+
+# endif /* GLIBC */
+
+#endif /* gnu */
+
+#if ( defined(__sun) && defined (__SVR4) ) \
+ || (defined (__digital__) && defined (__unix__)) \
+ || defined(_AIX)
+/* fbp : condition from AT&T code*/
+#if !(defined(__XPG4_CHAR_CLASS__) || defined(_XPG4_2) || \
+ (defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 == 4))) && ! defined (_ISCNTRL)
+ /* fbp : on 2.5.1, the defines are different ;( */
+ // # if ( defined (__sun) && defined (__SVR4) && ! defined (_ISCNTRL) )
+# define _ISCNTRL _C
+# define _ISUPPER _U
+# define _ISLOWER _L
+# define _ISDIGIT _N
+# define _ISXDIGIT _X
+# define _ISPUNCT _P
+# define _ISSPACE _S
+# define _ISPRINT (_P | _U | _L | _N | _B)
+# define _ISALPHA (_U | _L)
+# endif
+
+# define _Locale_CNTRL _ISCNTRL
+# define _Locale_UPPER _ISUPPER
+# define _Locale_LOWER _ISLOWER
+# define _Locale_DIGIT _ISDIGIT
+# define _Locale_XDIGIT _ISXDIGIT
+# define _Locale_PUNCT _ISPUNCT
+# define _Locale_SPACE _ISSPACE
+# define _Locale_PRINT _ISPRINT
+# define _Locale_ALPHA _ISALPHA
+#elif defined (__MWERKS__)
+# define _Locale_CNTRL __control_char
+# define _Locale_UPPER __upper_case
+# define _Locale_LOWER __lower_case
+# define _Locale_DIGIT __digit
+# define _Locale_XDIGIT __hex_digit
+# define _Locale_PUNCT __punctuation
+# define _Locale_SPACE __space_char
+# define _Locale_PRINT __printable
+# define _Locale_ALPHA __alphanumeric
+#elif defined (__BORLANDC__)
+# define _Locale_CNTRL _IS_CTL
+# define _Locale_UPPER _IS_UPP
+# define _Locale_LOWER _IS_LOW
+# define _Locale_DIGIT _IS_DIG
+# define _Locale_XDIGIT _IS_HEX
+# define _Locale_PUNCT _IS_PUN
+# define _Locale_SPACE _IS_SP
+# define _Locale_PRINT (_IS_SP|_IS_PUN|_IS_UPP|_IS_LOW|_IS_DIG)
+# define _Locale_ALPHA _IS_ALPHA
+#elif defined (_MSC_VER) || defined (__MINGW32__)
+# define _Locale_CNTRL _CONTROL
+# define _Locale_UPPER _UPPER
+# define _Locale_LOWER _LOWER
+# define _Locale_DIGIT _DIGIT
+# define _Locale_XDIGIT _HEX
+# define _Locale_PUNCT _PUNCT
+# define _Locale_SPACE _SPACE
+# define _Locale_PRINT (_ALPHA | _DIGIT | _BLANK | _PUNCT)
+// is this one has to be so complex ?
+# define _Locale_ALPHA ( _ALPHA & ~ (_UPPER | _LOWER ))
+#elif defined (__DMC__)
+# define _Locale_CNTRL _CONTROL
+# define _Locale_UPPER _UPPER
+# define _Locale_LOWER _LOWER
+# define _Locale_DIGIT _DIGIT
+# define _Locale_XDIGIT _HEX
+# define _Locale_PUNCT _PUNCT
+# define _Locale_SPACE _SPACE
+# define _Locale_PRINT (_UPPER | _LOWER | _DIGIT | _PUNCT | _SPACE)
+# define _Locale_ALPHA _ALPHA
+#elif defined(__MRC__) || defined(__SC__) //*TY 02/24/2000 - added support for MPW
+# define _Locale_CNTRL _CTL
+# define _Locale_UPPER _UPP
+# define _Locale_LOWER _LOW
+# define _Locale_DIGIT _DIG
+# define _Locale_XDIGIT _HEX
+# define _Locale_PUNCT _PUN
+# define _Locale_SPACE _BLA
+# define _Locale_PRINT (_UPP | _LOW | _DIG | _PUN | _BLA)
+# define _Locale_ALPHA (_UPP | _LOW)
+#elif defined(__MLCCPP__)
+# define _Locale_CNTRL 1
+# define _Locale_UPPER 2
+# define _Locale_LOWER 4
+# define _Locale_DIGIT 8
+# define _Locale_XDIGIT 16
+# define _Locale_PUNCT 32
+# define _Locale_SPACE 64
+# define _Locale_PRINT 128
+# define _Locale_ALPHA 256
+
+# elif defined (__GNUC__) && defined (__APPLE__)
+
+# define _Locale_CNTRL _C
+# define _Locale_UPPER _U
+# define _Locale_LOWER _L
+# define _Locale_DIGIT _D
+# define _Locale_XDIGIT _X
+# define _Locale_PUNCT _P
+# define _Locale_SPACE _S
+# define _Locale_PRINT _R
+# define _Locale_ALPHA _A
+
+# elif defined (__hpux) || defined (__osf__)
+
+# if defined(__HP_aCC) && !defined(_INCLUDE_HPUX_SOURCE)
+# define _ISALPHA 0x001
+# define _ISALNUM 0x002
+# define _ISBLANK 0x004
+# define _ISCNTRL 0x008
+# define _ISDIGIT 0x010
+# define _ISGRAPH 0x020
+# define _ISLOWER 0x040
+# define _ISPRINT 0x080
+# define _ISPUNCT 0x100
+# define _ISSPACE 0x200
+# define _ISUPPER 0x400
+# define _ISXDIGIT 0x800
+# endif
+# define _Locale_CNTRL _ISCNTRL
+# define _Locale_UPPER _ISUPPER
+# define _Locale_LOWER _ISLOWER
+# define _Locale_DIGIT _ISDIGIT
+# define _Locale_XDIGIT _ISXDIGIT
+# define _Locale_PUNCT _ISPUNCT
+# define _Locale_SPACE _ISSPACE
+# define _Locale_PRINT _ISPRINT
+# define _Locale_ALPHA _ISALPHA
+# elif defined (__MVS__) || defined(__OS400__)
+# define _Locale_CNTRL __ISCNTRL
+# define _Locale_UPPER __ISUPPER
+# define _Locale_LOWER __ISLOWER
+# define _Locale_DIGIT __ISDIGIT
+# define _Locale_XDIGIT __ISXDIGIT
+# define _Locale_PUNCT __ISPUNCT
+# define _Locale_SPACE __ISSPACE
+# define _Locale_PRINT __ISPRINT
+# define _Locale_ALPHA __ISALPHA
+# elif defined (__QNXNTO__) || defined (__WATCOMC__)
+# define _Locale_CNTRL _CNTRL
+# define _Locale_UPPER _UPPER
+# define _Locale_LOWER _LOWER
+# define _Locale_DIGIT _DIGIT
+# define _Locale_XDIGIT _XDIGT
+# define _Locale_PUNCT _PUNCT
+# define _Locale_SPACE _SPACE
+# define _Locale_PRINT _PRINT
+# define _Locale_ALPHA (_UPPER | _LOWER)
+#elif defined (__DJGPP)
+# define _Locale_CNTRL __dj_ISCNTRL
+# define _Locale_UPPER __dj_ISUPPER
+# define _Locale_LOWER __dj_ISLOWER
+# define _Locale_DIGIT __dj_ISDIGIT
+# define _Locale_XDIGIT __dj_ISXDIGIT
+# define _Locale_PUNCT __dj_ISPUNCT
+# define _Locale_SPACE __dj_ISSPACE
+# define _Locale_PRINT __dj_ISPRINT
+# define _Locale_ALPHA __dj_ISALPHA
+#elif defined (_STLP_SCO_OPENSERVER)
+# define _Locale_CNTRL _C
+# define _Locale_UPPER _U
+# define _Locale_LOWER _L
+# define _Locale_DIGIT _N
+# define _Locale_XDIGIT _X
+# define _Locale_PUNCT _P
+# define _Locale_SPACE _S
+# define _Locale_PRINT _R
+# define _Locale_ALPHA _A
+#elif defined (__NCR_SVR)
+# define _Locale_CNTRL _C
+# define _Locale_UPPER _U
+# define _Locale_LOWER _L
+# define _Locale_DIGIT _N
+# define _Locale_XDIGIT _X
+# define _Locale_PUNCT _P
+# define _Locale_SPACE _S
+# define _Locale_PRINT (_P | _U | _L | _N | _B)
+# define _Locale_ALPHA (_U | _L)
+#elif defined (_CRAY)
+# define _Locale_CNTRL _CNTRL
+# define _Locale_UPPER _UPPER
+# define _Locale_LOWER _LOWER
+# define _Locale_DIGIT _DIGIT
+# define _Locale_XDIGIT _XDIGIT
+# define _Locale_PUNCT _PUNCT
+# define _Locale_SPACE _SPACE
+# define _Locale_PRINT _PRINT
+# define _Locale_ALPHA _ALPHA
+#endif
+
+# endif /* _STLP_C_LOCALE_H */
diff --git a/src/STLport/stl/char_traits.h b/src/STLport/stl/char_traits.h
new file mode 100644
index 0000000..e93a56e
--- /dev/null
+++ b/src/STLport/stl/char_traits.h
@@ -0,0 +1,266 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CHAR_TRAITS_H
+#define _STLP_CHAR_TRAITS_H
+
+// Define char_traits
+
+# if defined (_STLP_OWN_IOSTREAMS) || ! defined (_STLP_USE_NEW_IOSTREAMS)
+
+# if ! defined (_STLP_CSTDDEF)
+# include <cstddef>
+# endif
+
+#if ! defined (_STLP_CSTRING)
+# include <cstring>
+#endif
+
+#if defined (_STLP_UNIX) && defined (_STLP_HAS_NO_NEW_C_HEADERS)
+#include <sys/types.h> // For off_t
+#endif /* __unix */
+
+#ifdef __BORLANDC__
+# include <mem.h>
+# include <string.h>
+# include <_stddef.h>
+// class mbstate_t;
+#endif
+
+#ifndef __TYPE_TRAITS_H
+# include <stl/type_traits.h>
+#endif
+
+# if !defined (_STLP_CWCHAR)
+# include <stl/_cwchar.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_OWN_IOSTREAMS
+
+template <class _Tp> class allocator;
+
+#define _STLP_NULL_CHAR_INIT(_ChT) _STLP_DEFAULT_CONSTRUCTED(_ChT)
+
+#if defined (__sgi) && defined (_STLP_HAS_NO_NEW_C_HEADERS) /* IRIX */
+typedef off64_t streamoff;
+// #elif defined (__unix) && defined (_STLP_HAS_NO_NEW_C_HEADERS) /* Other version of UNIX */
+// typedef off_t streamoff;
+#else /* __unix */
+// boris : here, it's not ptrdiff_t as some Solaris systems have confusing definitions of these.
+typedef long streamoff;
+#endif /* _STLP_HAS_NO_NEW_C_HEADERS */
+
+typedef ptrdiff_t streamsize;
+
+// Class fpos, which represents a position within a file. (The C++
+// standard calls for it to be defined in <ios>. This implementation
+// moves it to <iosfwd>, which is included by <ios>.)
+template <class _StateT> class fpos
+{
+public: // From table 88 of the C++ standard.
+ fpos(streamoff __pos) : _M_pos(__pos), _M_st(_STLP_NULL_CHAR_INIT(_StateT)) {}
+ fpos() : _M_pos(0), _M_st(_STLP_NULL_CHAR_INIT(_StateT)) {}
+
+ operator streamoff() const { return _M_pos; }
+
+ bool _STLP_CALL operator==(const fpos<_StateT>& __y) const
+ { return _M_pos == __y._M_pos; }
+ bool _STLP_CALL operator!=(const fpos<_StateT>& __y) const
+ { return _M_pos != __y._M_pos; }
+
+ fpos<_StateT>& operator+=(streamoff __off) {
+ _M_pos += __off;
+ return *this;
+ }
+ fpos<_StateT>& operator-=(streamoff __off) {
+ _M_pos -= __off;
+ return *this;
+ }
+
+ fpos<_StateT> operator+(streamoff __off) {
+ fpos<_StateT> __tmp(*this);
+ __tmp += __off;
+ return __tmp;
+ }
+ fpos<_StateT> operator-(streamoff __off) {
+ fpos<_StateT> __tmp(*this);
+ __tmp -= __off;
+ return __tmp;
+ }
+
+public: // Manipulation of the state member.
+ _StateT state() const { return _M_st; }
+ void state(_StateT __st) { _M_st = __st; }
+private:
+ streamoff _M_pos;
+ _StateT _M_st;
+};
+
+typedef fpos<mbstate_t> streampos;
+typedef fpos<mbstate_t> wstreampos;
+# endif
+
+// Class __char_traits_base.
+
+template <class _CharT, class _IntT> class __char_traits_base {
+public:
+ typedef _CharT char_type;
+ typedef _IntT int_type;
+#ifdef _STLP_USE_NEW_IOSTREAMS
+ typedef streamoff off_type;
+ typedef streampos pos_type;
+# ifdef _STLP_NO_MBSTATE_T
+ typedef char state_type;
+# else
+ typedef mbstate_t state_type;
+# endif
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+
+ static void _STLP_CALL assign(char_type& __c1, const char_type& __c2) { __c1 = __c2; }
+ static bool _STLP_CALL eq(const _CharT& __c1, const _CharT& __c2)
+ { return __c1 == __c2; }
+ static bool _STLP_CALL lt(const _CharT& __c1, const _CharT& __c2)
+ { return __c1 < __c2; }
+
+ static int _STLP_CALL compare(const _CharT* __s1, const _CharT* __s2, size_t __n) {
+ for (size_t __i = 0; __i < __n; ++__i)
+ if (!eq(__s1[__i], __s2[__i]))
+ return __s1[__i] < __s2[__i] ? -1 : 1;
+ return 0;
+ }
+
+ static size_t _STLP_CALL length(const _CharT* __s) {
+ const _CharT _NullChar = _STLP_DEFAULT_CONSTRUCTED(_CharT);
+ size_t __i;
+ for (__i = 0; !eq(__s[__i], _NullChar); ++__i)
+ {}
+ return __i;
+ }
+
+ static const _CharT* _STLP_CALL find(const _CharT* __s, size_t __n, const _CharT& __c) {
+ for ( ; __n > 0 ; ++__s, --__n)
+ if (eq(*__s, __c))
+ return __s;
+ return 0;
+ }
+
+
+ static _CharT* _STLP_CALL move(_CharT* __s1, const _CharT* __s2, size_t _Sz) {
+ return (_Sz == 0 ? __s1 : (_CharT*)memmove(__s1, __s2, _Sz * sizeof(_CharT)));
+ }
+
+ static _CharT* _STLP_CALL copy(_CharT* __s1, const _CharT* __s2, size_t __n) {
+ return (__n == 0 ? __s1 :
+ (_CharT*)memcpy(__s1, __s2, __n * sizeof(_CharT)));
+ }
+
+ static _CharT* _STLP_CALL assign(_CharT* __s, size_t __n, _CharT __c) {
+ for (size_t __i = 0; __i < __n; ++__i)
+ __s[__i] = __c;
+ return __s;
+ }
+
+ static int_type _STLP_CALL not_eof(const int_type& __c) {
+ return !eq_int_type(__c, eof()) ? __c : __STATIC_CAST(int_type, 0);
+ }
+
+ static char_type _STLP_CALL to_char_type(const int_type& __c) {
+ return (char_type)__c;
+ }
+
+ static int_type _STLP_CALL to_int_type(const char_type& __c) {
+ return (int_type)__c;
+ }
+
+ static bool _STLP_CALL eq_int_type(const int_type& __c1, const int_type& __c2) {
+ return __c1 == __c2;
+ }
+
+ static int_type _STLP_CALL eof() {
+ return (int_type)-1;
+ // return __STATIC_CAST(int_type,-1);
+ }
+};
+
+// Generic char_traits class. Note that this class is provided only
+// as a base for explicit specialization; it is unlikely to be useful
+// as is for any particular user-defined type. In particular, it
+// *will not work* for a non-POD type.
+
+template <class _CharT> class char_traits
+ : public __char_traits_base<_CharT, _CharT>
+{};
+
+// Specialization for char.
+
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC char_traits<char>
+ : public __char_traits_base<char, int>
+{
+public:
+ typedef char char_type;
+ typedef int int_type;
+#ifdef _STLP_USE_NEW_IOSTREAMS
+ typedef streamoff off_type;
+# ifndef _STLP_NO_MBSTATE_T
+ typedef streampos pos_type;
+ typedef mbstate_t state_type;
+# endif
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+
+ static char _STLP_CALL to_char_type(const int& __c) {
+ return (char)(unsigned char)__c;
+ }
+
+ static int _STLP_CALL to_int_type(const char& __c) {
+ return (unsigned char)__c;
+ }
+
+ static int _STLP_CALL compare(const char* __s1, const char* __s2, size_t __n)
+ { return memcmp(__s1, __s2, __n); }
+
+ static size_t _STLP_CALL length(const char* __s) { return strlen(__s); }
+
+ static void _STLP_CALL assign(char& __c1, const char& __c2) { __c1 = __c2; }
+
+ static char* _STLP_CALL assign(char* __s, size_t __n, char __c)
+ { memset(__s, __c, __n); return __s; }
+};
+
+# if defined (_STLP_HAS_WCHAR_T)
+// Specialization for wchar_t.
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC char_traits<wchar_t>
+ : public __char_traits_base<wchar_t, wint_t>
+{};
+# endif
+
+_STLP_END_NAMESPACE
+
+# else /* OWN_IOSTREAMS */
+
+# include <wrap_std/iosfwd>
+
+# endif /* OWN_IOSTREAMS */
+
+#endif /* _STLP_CHAR_TRAITS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/concept_checks.h b/src/STLport/stl/concept_checks.h
new file mode 100644
index 0000000..36fb00c
--- /dev/null
+++ b/src/STLport/stl/concept_checks.h
@@ -0,0 +1,810 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __CONCEPT_CHECKS_H
+#define __CONCEPT_CHECKS_H
+
+/*
+ Use these macro like assertions, but they assert properties
+ on types (usually template arguments). In technical terms they
+ verify whether a type "models" a "concept".
+
+ This set of requirements and the terminology used here is derived
+ from the book "Generic Programming and the STL" by Matt Austern
+ (Addison Wesley). For further information please consult that
+ book. The requirements also are intended to match the ANSI/ISO C++
+ standard.
+
+ This file covers the basic concepts and the iterator concepts.
+ There are several other files that provide the requirements
+ for the STL containers:
+ container_concepts.h
+ sequence_concepts.h
+ assoc_container_concepts.h
+
+ Jeremy Siek, 1999
+
+ TO DO:
+ - some issues with regards to concept classification and mutability
+ including AssociativeContianer -> ForwardContainer
+ and SortedAssociativeContainer -> ReversibleContainer
+ - HashedAssociativeContainer
+ - Allocator
+ - Function Object Concepts
+
+ */
+
+#ifndef _STLP_USE_CONCEPT_CHECKS
+
+// Some compilers lack the features that are necessary for concept checks.
+// On those compilers we define the concept check macros to do nothing.
+#define _STLP_REQUIRES(__type_var, __concept) do {} while(0)
+#define _STLP_CLASS_REQUIRES(__type_var, __concept) \
+ static int __##__type_var##_##__concept
+#define _STLP_CONVERTIBLE(__type_x, __type_y) do {} while(0)
+#define _STLP_REQUIRES_SAME_TYPE(__type_x, __type_y) do {} while(0)
+#define _STLP_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y) \
+ static int __##__type_x##__type_y##_require_same_type
+#define _STLP_GENERATOR_CHECK(__func, __ret) do {} while(0)
+#define _STLP_CLASS_GENERATOR_CHECK(__func, __ret) \
+ static int __##__func##__ret##_generator_check
+#define _STLP_UNARY_FUNCTION_CHECK(__func, __ret, __arg) do {} while(0)
+#define _STLP_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \
+ static int __##__func##__ret##__arg##_unary_function_check
+#define _STLP_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
+ do {} while(0)
+#define _STLP_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
+ static int __##__func##__ret##__first##__second##_binary_function_check
+#define _STLP_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
+ do {} while(0)
+#define _STLP_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
+ static int __##__opname##__ret##__first##__second##_require_binary_op
+
+#else /* _STLP_USE_CONCEPT_CHECKS */
+
+// This macro tests whether the template argument "__type_var"
+// satisfies the requirements of "__concept". Here is a list of concepts
+// that we know how to check:
+// _Allocator
+// _Assignable
+// _DefaultConstructible
+// _EqualityComparable
+// _LessThanComparable
+// _TrivialIterator
+// _InputIterator
+// _OutputIterator
+// _ForwardIterator
+// _BidirectionalIterator
+// _RandomAccessIterator
+// _Mutable_TrivialIterator
+// _Mutable_ForwardIterator
+// _Mutable_BidirectionalIterator
+// _Mutable_RandomAccessIterator
+
+#define _STLP_REQUIRES(__type_var, __concept) \
+do { \
+ void (*__x)( __type_var ) = __concept##_concept_specification< __type_var >\
+ ::##__concept##_requirement_violation; __x = __x; } while (0)
+
+// Use this to check whether type X is convertible to type Y
+#define _STLP_CONVERTIBLE(__type_x, __type_y) \
+do { \
+ void (*__x)( __type_x , __type_y ) = _STL_CONVERT_ERROR< __type_x , \
+ __type_y >::__type_X_is_not_convertible_to_type_Y; \
+ __x = __x; } while (0)
+
+// Use this to test whether two template arguments are the same type
+#define _STLP_REQUIRES_SAME_TYPE(__type_x, __type_y) \
+do { \
+ void (*__x)( __type_x , __type_y ) = _STL_SAME_TYPE_ERROR< __type_x, \
+ __type_y >::__type_X_not_same_as_type_Y; \
+ __x = __x; } while (0)
+
+
+// function object checks
+#define _STLP_GENERATOR_CHECK(__func, __ret) \
+do { \
+ __ret (*__x)( __func&) = \
+ _STL_GENERATOR_ERROR< \
+ __func, __ret>::__generator_requirement_violation; \
+ __x = __x; } while (0)
+
+
+#define _STLP_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \
+do { \
+ __ret (*__x)( __func&, const __arg& ) = \
+ _STL_UNARY_FUNCTION_ERROR< \
+ __func, __ret, __arg>::__unary_function_requirement_violation; \
+ __x = __x; } while (0)
+
+
+#define _STLP_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
+do { \
+ __ret (*__x)( __func&, const __first&, const __second& ) = \
+ _STL_BINARY_FUNCTION_ERROR< \
+ __func, __ret, __first, __second>::__binary_function_requirement_violation; \
+ __x = __x; } while (0)
+
+
+#define _STLP_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
+ do { \
+ __ret (*__x)( __first&, __second& ) = _STL_BINARY##__opname##_ERROR< \
+ __ret, __first, __second>::__binary_operator_requirement_violation; \
+ __ret (*__y)( const __first&, const __second& ) = \
+ _STL_BINARY##__opname##_ERROR< __ret, __first, __second>:: \
+ __const_binary_operator_requirement_violation; \
+ __y = __y; __x = __x; } while (0)
+
+
+#ifdef _STLP_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE
+
+#define _STLP_CLASS_REQUIRES(__type_var, __concept)
+#define _STLP_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y)
+#define _STLP_CLASS_GENERATOR_CHECK(__func, __ret)
+#define _STLP_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg)
+#define _STLP_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second)
+#define _STLP_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second)
+
+#else
+
+// Use this macro inside of template classes, where you would
+// like to place requirements on the template arguments to the class
+// Warning: do not pass pointers and such (e.g. T*) in as the __type_var,
+// since the type_var is used to construct identifiers. Instead typedef
+// the pointer type, then use the typedef name for the __type_var.
+#define _STLP_CLASS_REQUIRES(__type_var, __concept) \
+ typedef void (* __func##__type_var##__concept)( __type_var ); \
+ template <__func##__type_var##__concept _Tp1> \
+ struct __dummy_struct_##__type_var##__concept { }; \
+ static __dummy_struct_##__type_var##__concept< \
+ __concept##_concept_specification< \
+ __type_var>::__concept##_requirement_violation> \
+ __dummy_ptr_##__type_var##__concept
+
+
+#define _STLP_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y) \
+ typedef void (* __func_##__type_x##__type_y##same_type)( __type_x, \
+ __type_y ); \
+ template < __func_##__type_x##__type_y##same_type _Tp1> \
+ struct __dummy_struct_##__type_x##__type_y##_same_type { }; \
+ static __dummy_struct_##__type_x##__type_y##_same_type< \
+ _STL_SAME_TYPE_ERROR<__type_x, __type_y>::__type_X_not_same_as_type_Y> \
+ __dummy_ptr_##__type_x##__type_y##_same_type
+
+
+#define _STLP_CLASS_GENERATOR_CHECK(__func, __ret) \
+ typedef __ret (* __f_##__func##__ret##_generator)( __func& ); \
+ template <__f_##__func##__ret##_generator _Tp1> \
+ struct __dummy_struct_##__func##__ret##_generator { }; \
+ static __dummy_struct_##__func##__ret##_generator< \
+ _STL_GENERATOR_ERROR< \
+ __func, __ret>::__generator_requirement_violation> \
+ __dummy_ptr_##__func##__ret##_generator
+
+
+#define _STLP_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \
+ typedef __ret (* __f_##__func##__ret##__arg##_unary_check)( __func&, \
+ const __arg& ); \
+ template <__f_##__func##__ret##__arg##_unary_check _Tp1> \
+ struct __dummy_struct_##__func##__ret##__arg##_unary_check { }; \
+ static __dummy_struct_##__func##__ret##__arg##_unary_check< \
+ _STL_UNARY_FUNCTION_ERROR< \
+ __func, __ret, __arg>::__unary_function_requirement_violation> \
+ __dummy_ptr_##__func##__ret##__arg##_unary_check
+
+
+#define _STLP_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
+ typedef __ret (* __f_##__func##__ret##__first##__second##_binary_check)( __func&, const __first&,\
+ const __second& ); \
+ template <__f_##__func##__ret##__first##__second##_binary_check _Tp1> \
+ struct __dummy_struct_##__func##__ret##__first##__second##_binary_check { }; \
+ static __dummy_struct_##__func##__ret##__first##__second##_binary_check< \
+ _STL_BINARY_FUNCTION_ERROR<__func, __ret, __first, __second>:: \
+ __binary_function_requirement_violation> \
+ __dummy_ptr_##__func##__ret##__first##__second##_binary_check
+
+
+#define _STLP_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
+ typedef __ret (* __f_##__func##__ret##__first##__second##_binary_op)(const __first&, \
+ const __second& ); \
+ template <__f_##__func##__ret##__first##__second##_binary_op _Tp1> \
+ struct __dummy_struct_##__func##__ret##__first##__second##_binary_op { }; \
+ static __dummy_struct_##__func##__ret##__first##__second##_binary_op< \
+ _STL_BINARY##__opname##_ERROR<__ret, __first, __second>:: \
+ __binary_operator_requirement_violation> \
+ __dummy_ptr_##__func##__ret##__first##__second##_binary_op
+
+#endif
+
+/* helper class for finding non-const version of a type. Need to have
+ something to assign to etc. when testing constant iterators. */
+
+template <class _Tp>
+struct _Mutable_trait {
+ typedef _Tp _Type;
+};
+template <class _Tp>
+struct _Mutable_trait<const _Tp> {
+ typedef _Tp _Type;
+};
+
+
+/* helper function for avoiding compiler warnings about unused variables */
+template <class _Type>
+void __sink_unused_warning(_Type) { }
+
+template <class _TypeX, class _TypeY>
+struct _STL_CONVERT_ERROR {
+ static void
+ __type_X_is_not_convertible_to_type_Y(_TypeX __x, _TypeY) {
+ _TypeY __y = __x;
+ __sink_unused_warning(__y);
+ }
+};
+
+
+template <class _Type> struct __check_equal { };
+
+template <class _TypeX, class _TypeY>
+struct _STL_SAME_TYPE_ERROR {
+ static void
+ __type_X_not_same_as_type_Y(_TypeX , _TypeY ) {
+ __check_equal<_TypeX> t1 = __check_equal<_TypeY>();
+ }
+};
+
+
+// Some Functon Object Checks
+
+template <class _Func, class _Ret>
+struct _STL_GENERATOR_ERROR {
+ static _Ret __generator_requirement_violation(_Func& __f) {
+ return __f();
+ }
+};
+
+template <class _Func>
+struct _STL_GENERATOR_ERROR<_Func, void> {
+ static void __generator_requirement_violation(_Func& __f) {
+ __f();
+ }
+};
+
+
+template <class _Func, class _Ret, class _Arg>
+struct _STL_UNARY_FUNCTION_ERROR {
+ static _Ret
+ __unary_function_requirement_violation(_Func& __f,
+ const _Arg& __arg) {
+ return __f(__arg);
+ }
+};
+
+template <class _Func, class _Arg>
+struct _STL_UNARY_FUNCTION_ERROR<_Func, void, _Arg> {
+ static void
+ __unary_function_requirement_violation(_Func& __f,
+ const _Arg& __arg) {
+ __f(__arg);
+ }
+};
+
+template <class _Func, class _Ret, class _First, class _Second>
+struct _STL_BINARY_FUNCTION_ERROR {
+ static _Ret
+ __binary_function_requirement_violation(_Func& __f,
+ const _First& __first,
+ const _Second& __second) {
+ return __f(__first, __second);
+ }
+};
+
+template <class _Func, class _First, class _Second>
+struct _STL_BINARY_FUNCTION_ERROR<_Func, void, _First, _Second> {
+ static void
+ __binary_function_requirement_violation(_Func& __f,
+ const _First& __first,
+ const _Second& __second) {
+ __f(__first, __second);
+ }
+};
+
+
+#define _STLP_DEFINE_BINARY_OP_CHECK(_OP, _NAME) \
+template <class _Ret, class _First, class _Second> \
+struct _STL_BINARY##_NAME##_ERROR { \
+ static _Ret \
+ __const_binary_operator_requirement_violation(const _First& __first, \
+ const _Second& __second) { \
+ return __first _OP __second; \
+ } \
+ static _Ret \
+ __binary_operator_requirement_violation(_First& __first, \
+ _Second& __second) { \
+ return __first _OP __second; \
+ } \
+}
+
+_STLP_DEFINE_BINARY_OP_CHECK(==, _OP_EQUAL);
+_STLP_DEFINE_BINARY_OP_CHECK(!=, _OP_NOT_EQUAL);
+_STLP_DEFINE_BINARY_OP_CHECK(<, _OP_LESS_THAN);
+_STLP_DEFINE_BINARY_OP_CHECK(<=, _OP_LESS_EQUAL);
+_STLP_DEFINE_BINARY_OP_CHECK(>, _OP_GREATER_THAN);
+_STLP_DEFINE_BINARY_OP_CHECK(>=, _OP_GREATER_EQUAL);
+_STLP_DEFINE_BINARY_OP_CHECK(+, _OP_PLUS);
+_STLP_DEFINE_BINARY_OP_CHECK(*, _OP_TIMES);
+_STLP_DEFINE_BINARY_OP_CHECK(/, _OP_DIVIDE);
+_STLP_DEFINE_BINARY_OP_CHECK(-, _OP_SUBTRACT);
+_STLP_DEFINE_BINARY_OP_CHECK(%, _OP_MOD);
+// ...
+
+// TODO, add unary operators (prefix and postfix)
+
+/*
+ The presence of this class is just to trick EDG into displaying
+ these error messages before any other errors. Without the
+ classes, the errors in the functions get reported after
+ other class errors deep inside the library. The name
+ choice just makes for an eye catching error message :)
+ */
+struct _STL_ERROR {
+
+ template <class _Type>
+ static _Type
+ __default_constructor_requirement_violation(_Type) {
+ return _Type();
+ }
+ template <class _Type>
+ static _Type
+ __assignment_operator_requirement_violation(_Type __a) {
+ __a = __a;
+ return __a;
+ }
+ template <class _Type>
+ static _Type
+ __copy_constructor_requirement_violation(_Type __a) {
+ _Type __c(__a);
+ return __c;
+ }
+ template <class _Type>
+ static _Type
+ __const_parameter_required_for_copy_constructor(_Type /* __a */,
+ const _Type& __b) {
+ _Type __c(__b);
+ return __c;
+ }
+ template <class _Type>
+ static _Type
+ __const_parameter_required_for_assignment_operator(_Type __a,
+ const _Type& __b) {
+ __a = __b;
+ return __a;
+ }
+ template <class _Type>
+ static _Type
+ __less_than_comparable_requirement_violation(_Type __a, _Type __b) {
+ if (__a < __b || __a > __b || __a <= __b || __a >= __b) return __a;
+ return __b;
+ }
+ template <class _Type>
+ static _Type
+ __equality_comparable_requirement_violation(_Type __a, _Type __b) {
+ if (__a == __b || __a != __b) return __a;
+ return __b;
+ }
+ template <class _Iterator>
+ static void
+ __dereference_operator_requirement_violation(_Iterator __i) {
+ __sink_unused_warning(*__i);
+ }
+ template <class _Iterator>
+ static void
+ __dereference_operator_and_assignment_requirement_violation(_Iterator __i) {
+ *__i = *__i;
+ }
+ template <class _Iterator>
+ static void
+ __preincrement_operator_requirement_violation(_Iterator __i) {
+ ++__i;
+ }
+ template <class _Iterator>
+ static void
+ __postincrement_operator_requirement_violation(_Iterator __i) {
+ __i++;
+ }
+ template <class _Iterator>
+ static void
+ __predecrement_operator_requirement_violation(_Iterator __i) {
+ --__i;
+ }
+ template <class _Iterator>
+ static void
+ __postdecrement_operator_requirement_violation(_Iterator __i) {
+ __i--;
+ }
+ template <class _Iterator, class _Type>
+ static void
+ __postincrement_operator_and_assignment_requirement_violation(_Iterator __i,
+ _Type __t) {
+ *__i++ = __t;
+ }
+ template <class _Iterator, class _Distance>
+ static _Iterator
+ __iterator_addition_assignment_requirement_violation(_Iterator __i,
+ _Distance __n) {
+ __i += __n;
+ return __i;
+ }
+ template <class _Iterator, class _Distance>
+ static _Iterator
+ __iterator_addition_requirement_violation(_Iterator __i, _Distance __n) {
+ __i = __i + __n;
+ __i = __n + __i;
+ return __i;
+ }
+ template <class _Iterator, class _Distance>
+ static _Iterator
+ __iterator_subtraction_assignment_requirement_violation(_Iterator __i,
+ _Distance __n) {
+ __i -= __n;
+ return __i;
+ }
+ template <class _Iterator, class _Distance>
+ static _Iterator
+ __iterator_subtraction_requirement_violation(_Iterator __i, _Distance __n) {
+ __i = __i - __n;
+ return __i;
+ }
+ template <class _Iterator, class _Distance>
+ static _Distance
+ __difference_operator_requirement_violation(_Iterator __i, _Iterator __j,
+ _Distance __n) {
+ __n = __i - __j;
+ return __n;
+ }
+ template <class _Exp, class _Type, class _Distance>
+ static _Type
+ __element_access_operator_requirement_violation(_Exp __x, _Type*,
+ _Distance __n) {
+ return __x[__n];
+ }
+ template <class _Exp, class _Type, class _Distance>
+ static void
+ __element_assignment_operator_requirement_violation(_Exp __x,
+ _Type* __t,
+ _Distance __n) {
+ __x[__n] = *__t;
+ }
+
+}; /* _STL_ERROR */
+
+/* Associated Type Requirements */
+
+_STLP_BEGIN_NAMESPACE
+template <class _Iterator> struct iterator_traits;
+_STLP_END_NAMESPACE
+
+template <class _Iter>
+struct __value_type_type_definition_requirement_violation {
+ typedef typename __STD::iterator_traits<_Iter>::value_type value_type;
+};
+
+template <class _Iter>
+struct __difference_type_type_definition_requirement_violation {
+ typedef typename __STD::iterator_traits<_Iter>::difference_type
+ difference_type;
+};
+
+template <class _Iter>
+struct __reference_type_definition_requirement_violation {
+ typedef typename __STD::iterator_traits<_Iter>::reference reference;
+};
+
+template <class _Iter>
+struct __pointer_type_definition_requirement_violation {
+ typedef typename __STD::iterator_traits<_Iter>::pointer pointer;
+};
+
+template <class _Iter>
+struct __iterator_category_type_definition_requirement_violation {
+ typedef typename __STD::iterator_traits<_Iter>::iterator_category
+ iterator_category;
+};
+
+/* Assignable Requirements */
+
+
+template <class _Type>
+struct _Assignable_concept_specification {
+ static void _Assignable_requirement_violation(_Type __a) {
+ _STL_ERROR::__assignment_operator_requirement_violation(__a);
+ _STL_ERROR::__copy_constructor_requirement_violation(__a);
+ _STL_ERROR::__const_parameter_required_for_copy_constructor(__a,__a);
+ _STL_ERROR::__const_parameter_required_for_assignment_operator(__a,__a);
+ }
+};
+
+/* DefaultConstructible Requirements */
+
+
+template <class _Type>
+struct _DefaultConstructible_concept_specification {
+ static void _DefaultConstructible_requirement_violation(_Type __a) {
+ _STL_ERROR::__default_constructor_requirement_violation(__a);
+ }
+};
+
+/* EqualityComparable Requirements */
+
+template <class _Type>
+struct _EqualityComparable_concept_specification {
+ static void _EqualityComparable_requirement_violation(_Type __a) {
+ _STL_ERROR::__equality_comparable_requirement_violation(__a, __a);
+ }
+};
+
+/* LessThanComparable Requirements */
+template <class _Type>
+struct _LessThanComparable_concept_specification {
+ static void _LessThanComparable_requirement_violation(_Type __a) {
+ _STL_ERROR::__less_than_comparable_requirement_violation(__a, __a);
+ }
+};
+
+/* TrivialIterator Requirements */
+
+template <class _TrivialIterator>
+struct _TrivialIterator_concept_specification {
+static void
+_TrivialIterator_requirement_violation(_TrivialIterator __i) {
+ typedef typename
+ __value_type_type_definition_requirement_violation<_TrivialIterator>::
+ value_type __T;
+ // Refinement of Assignable
+ _Assignable_concept_specification<_TrivialIterator>::
+ _Assignable_requirement_violation(__i);
+ // Refinement of DefaultConstructible
+ _DefaultConstructible_concept_specification<_TrivialIterator>::
+ _DefaultConstructible_requirement_violation(__i);
+ // Refinement of EqualityComparable
+ _EqualityComparable_concept_specification<_TrivialIterator>::
+ _EqualityComparable_requirement_violation(__i);
+ // Valid Expressions
+ _STL_ERROR::__dereference_operator_requirement_violation(__i);
+}
+};
+
+template <class _TrivialIterator>
+struct _Mutable_TrivialIterator_concept_specification {
+static void
+_Mutable_TrivialIterator_requirement_violation(_TrivialIterator __i) {
+ _TrivialIterator_concept_specification<_TrivialIterator>::
+ _TrivialIterator_requirement_violation(__i);
+ // Valid Expressions
+ _STL_ERROR::__dereference_operator_and_assignment_requirement_violation(__i);
+}
+};
+
+/* InputIterator Requirements */
+
+template <class _InputIterator>
+struct _InputIterator_concept_specification {
+static void
+_InputIterator_requirement_violation(_InputIterator __i) {
+ // Refinement of TrivialIterator
+ _TrivialIterator_concept_specification<_InputIterator>::
+ _TrivialIterator_requirement_violation(__i);
+ // Associated Types
+ __difference_type_type_definition_requirement_violation<_InputIterator>();
+ __reference_type_definition_requirement_violation<_InputIterator>();
+ __pointer_type_definition_requirement_violation<_InputIterator>();
+ __iterator_category_type_definition_requirement_violation<_InputIterator>();
+ // Valid Expressions
+ _STL_ERROR::__preincrement_operator_requirement_violation(__i);
+ _STL_ERROR::__postincrement_operator_requirement_violation(__i);
+}
+};
+
+/* OutputIterator Requirements */
+
+template <class _OutputIterator>
+struct _OutputIterator_concept_specification {
+static void
+_OutputIterator_requirement_violation(_OutputIterator __i) {
+ // Refinement of Assignable
+ _Assignable_concept_specification<_OutputIterator>::
+ _Assignable_requirement_violation(__i);
+ // Associated Types
+ __iterator_category_type_definition_requirement_violation<_OutputIterator>();
+ // Valid Expressions
+ _STL_ERROR::__dereference_operator_requirement_violation(__i);
+ _STL_ERROR::__preincrement_operator_requirement_violation(__i);
+ _STL_ERROR::__postincrement_operator_requirement_violation(__i);
+ _STL_ERROR::
+ __postincrement_operator_and_assignment_requirement_violation(__i, *__i);
+}
+};
+
+/* ForwardIterator Requirements */
+
+template <class _ForwardIterator>
+struct _ForwardIterator_concept_specification {
+static void
+_ForwardIterator_requirement_violation(_ForwardIterator __i) {
+ // Refinement of InputIterator
+ _InputIterator_concept_specification<_ForwardIterator>::
+ _InputIterator_requirement_violation(__i);
+}
+};
+
+template <class _ForwardIterator>
+struct _Mutable_ForwardIterator_concept_specification {
+static void
+_Mutable_ForwardIterator_requirement_violation(_ForwardIterator __i) {
+ _ForwardIterator_concept_specification<_ForwardIterator>::
+ _ForwardIterator_requirement_violation(__i);
+ // Refinement of OutputIterator
+ _OutputIterator_concept_specification<_ForwardIterator>::
+ _OutputIterator_requirement_violation(__i);
+}
+};
+
+/* BidirectionalIterator Requirements */
+
+template <class _BidirectionalIterator>
+struct _BidirectionalIterator_concept_specification {
+static void
+_BidirectionalIterator_requirement_violation(_BidirectionalIterator __i) {
+ // Refinement of ForwardIterator
+ _ForwardIterator_concept_specification<_BidirectionalIterator>::
+ _ForwardIterator_requirement_violation(__i);
+ // Valid Expressions
+ _STL_ERROR::__predecrement_operator_requirement_violation(__i);
+ _STL_ERROR::__postdecrement_operator_requirement_violation(__i);
+}
+};
+
+template <class _BidirectionalIterator>
+struct _Mutable_BidirectionalIterator_concept_specification {
+static void
+_Mutable_BidirectionalIterator_requirement_violation(
+ _BidirectionalIterator __i)
+{
+ _BidirectionalIterator_concept_specification<_BidirectionalIterator>::
+ _BidirectionalIterator_requirement_violation(__i);
+ // Refinement of mutable_ForwardIterator
+ _Mutable_ForwardIterator_concept_specification<_BidirectionalIterator>::
+ _Mutable_ForwardIterator_requirement_violation(__i);
+ typedef typename
+ __value_type_type_definition_requirement_violation<
+ _BidirectionalIterator>::value_type __T;
+ typename _Mutable_trait<__T>::_Type* __tmp_ptr = 0;
+ // Valid Expressions
+ _STL_ERROR::
+ __postincrement_operator_and_assignment_requirement_violation(__i,
+ *__tmp_ptr);
+}
+};
+
+/* RandomAccessIterator Requirements */
+
+template <class _RandAccIter>
+struct _RandomAccessIterator_concept_specification {
+static void
+_RandomAccessIterator_requirement_violation(_RandAccIter __i) {
+ // Refinement of BidirectionalIterator
+ _BidirectionalIterator_concept_specification<_RandAccIter>::
+ _BidirectionalIterator_requirement_violation(__i);
+ // Refinement of LessThanComparable
+ _LessThanComparable_concept_specification<_RandAccIter>::
+ _LessThanComparable_requirement_violation(__i);
+ typedef typename
+ __value_type_type_definition_requirement_violation<_RandAccIter>
+ ::value_type
+ value_type;
+ typedef typename
+ __difference_type_type_definition_requirement_violation<_RandAccIter>
+ ::difference_type
+ _Dist;
+ typedef typename _Mutable_trait<_Dist>::_Type _MutDist;
+
+ // Valid Expressions
+ _STL_ERROR::__iterator_addition_assignment_requirement_violation(__i,
+ _MutDist());
+ _STL_ERROR::__iterator_addition_requirement_violation(__i,
+ _MutDist());
+ _STL_ERROR::
+ __iterator_subtraction_assignment_requirement_violation(__i,
+ _MutDist());
+ _STL_ERROR::__iterator_subtraction_requirement_violation(__i,
+ _MutDist());
+ _STL_ERROR::__difference_operator_requirement_violation(__i, __i,
+ _MutDist());
+ typename _Mutable_trait<value_type>::_Type* __dummy_ptr = 0;
+ _STL_ERROR::__element_access_operator_requirement_violation(__i,
+ __dummy_ptr,
+ _MutDist());
+}
+};
+
+template <class _RandAccIter>
+struct _Mutable_RandomAccessIterator_concept_specification {
+static void
+_Mutable_RandomAccessIterator_requirement_violation(_RandAccIter __i)
+{
+ _RandomAccessIterator_concept_specification<_RandAccIter>::
+ _RandomAccessIterator_requirement_violation(__i);
+ // Refinement of mutable_BidirectionalIterator
+ _Mutable_BidirectionalIterator_concept_specification<_RandAccIter>::
+ _Mutable_BidirectionalIterator_requirement_violation(__i);
+ typedef typename
+ __value_type_type_definition_requirement_violation<_RandAccIter>
+ ::value_type
+ value_type;
+ typedef typename
+ __difference_type_type_definition_requirement_violation<_RandAccIter>
+ ::difference_type
+ _Dist;
+
+ typename _Mutable_trait<value_type>::_Type* __tmp_ptr = 0;
+ // Valid Expressions
+ _STL_ERROR::__element_assignment_operator_requirement_violation(__i,
+ __tmp_ptr, _Dist());
+}
+};
+
+#define _STLP_TYPEDEF_REQUIREMENT(__REQUIREMENT) \
+template <class Type> \
+struct __##__REQUIREMENT##__typedef_requirement_violation { \
+ typedef typename Type::__REQUIREMENT __REQUIREMENT; \
+};
+
+_STLP_TYPEDEF_REQUIREMENT(value_type);
+_STLP_TYPEDEF_REQUIREMENT(difference_type);
+_STLP_TYPEDEF_REQUIREMENT(size_type);
+_STLP_TYPEDEF_REQUIREMENT(reference);
+_STLP_TYPEDEF_REQUIREMENT(const_reference);
+_STLP_TYPEDEF_REQUIREMENT(pointer);
+_STLP_TYPEDEF_REQUIREMENT(const_pointer);
+
+
+template <class _Alloc>
+struct _Allocator_concept_specification {
+static void
+_Allocator_requirement_violation(_Alloc __a) {
+ // Refinement of DefaultConstructible
+ _DefaultConstructible_concept_specification<_Alloc>::
+ _DefaultConstructible_requirement_violation(__a);
+ // Refinement of EqualityComparable
+ _EqualityComparable_concept_specification<_Alloc>::
+ _EqualityComparable_requirement_violation(__a);
+ // Associated Types
+ __value_type__typedef_requirement_violation<_Alloc>();
+ __difference_type__typedef_requirement_violation<_Alloc>();
+ __size_type__typedef_requirement_violation<_Alloc>();
+ __reference__typedef_requirement_violation<_Alloc>();
+ __const_reference__typedef_requirement_violation<_Alloc>();
+ __pointer__typedef_requirement_violation<_Alloc>();
+ __const_pointer__typedef_requirement_violation<_Alloc>();
+ typedef typename _Alloc::value_type _Type;
+ _STLP_REQUIRES_SAME_TYPE(typename _Alloc::rebind<_Type>::other, _Alloc);
+}
+};
+
+#endif /* _STLP_USE_CONCEPT_CHECKS */
+
+#endif /* __CONCEPT_CHECKS_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/debug/_debug.c b/src/STLport/stl/debug/_debug.c
new file mode 100644
index 0000000..028ed76
--- /dev/null
+++ b/src/STLport/stl/debug/_debug.c
@@ -0,0 +1,490 @@
+/*
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_DEBUG_C
+# define _STLP_DEBUG_C
+
+#if defined ( _STLP_DEBUG )
+
+# ifdef _STLP_THREADS
+# ifndef _STLP_NEED_MUTABLE
+# define _STLP_ACQUIRE_LOCK(_Lock) _Lock._M_acquire_lock();
+# define _STLP_RELEASE_LOCK(_Lock) _Lock._M_release_lock();
+# else
+# define _STLP_ACQUIRE_LOCK(_Lock) ((_STLP_mutex&)_Lock)._M_acquire_lock();
+# define _STLP_RELEASE_LOCK(_Lock) ((_STLP_mutex&)_Lock)._M_release_lock();
+# endif /* _STLP_NEED_MUTABLE */
+# else
+# define _STLP_ACQUIRE_LOCK(_Lock)
+# define _STLP_RELEASE_LOCK(_Lock)
+# endif /* _STLP_THREADS */
+
+_STLP_BEGIN_NAMESPACE
+
+//==========================================================
+// global non-inline functions
+//==========================================================
+
+// [ i1, i2)
+template <class _Iterator>
+inline bool _STLP_CALL
+__in_range_aux(const _Iterator& __it, const _Iterator& __first,
+ const _Iterator& __last, const random_access_iterator_tag &) {
+ return ( __it >= __first &&
+ __it < __last);
+}
+
+template <class _Iterator1, class _Iterator>
+# if defined (_STLP_MSVC) && (_STLP_MSVC >= 1100)
+inline bool _STLP_CALL __in_range_aux(_Iterator1 __it, const _Iterator& __first,
+# else
+inline bool _STLP_CALL __in_range_aux(const _Iterator1& __it, const _Iterator& __first,
+# endif
+ const _Iterator& __last, const forward_iterator_tag &) {
+ _Iterator1 __i(__first);
+ for (; __i != __last && __i != __it; ++__i);
+ return (__i!=__last);
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
+template <class _Iterator1, class _Iterator>
+inline bool _STLP_CALL
+__in_range_aux(const _Iterator1& __it, const _Iterator& __first,
+ const _Iterator& __last, const bidirectional_iterator_tag &) {
+ _Iterator1 __i(__first);
+ for (; __i != __last && __i != __it; ++__i);
+ return (__i !=__last);
+}
+# endif
+
+template <class _Iterator>
+bool _STLP_CALL __check_range(const _Iterator& __first, const _Iterator& __last) {
+ _STLP_VERBOSE_RETURN(__valid_range(__first,__last), _StlMsg_INVALID_RANGE )
+ return true;
+}
+
+template <class _Iterator>
+bool _STLP_CALL __check_range(const _Iterator& __it,
+ const _Iterator& __start, const _Iterator& __finish) {
+ _STLP_VERBOSE_RETURN(__in_range(__it,__start, __finish),
+ _StlMsg_NOT_IN_RANGE_1)
+ return true;
+}
+
+template <class _Iterator>
+bool _STLP_CALL __check_range(const _Iterator& __first, const _Iterator& __last,
+ const _Iterator& __start, const _Iterator& __finish) {
+ _STLP_VERBOSE_RETURN(__in_range(__first, __last, __start, __finish),
+ _StlMsg_NOT_IN_RANGE_2)
+ return true;
+}
+
+//===============================================================
+
+template <class _Iterator>
+void _STLP_CALL __invalidate_range(const __owned_list* __base,
+ const _Iterator& __first,
+ const _Iterator& __last)
+{
+ typedef _Iterator* _Safe_iterator_ptr;
+ typedef __owned_link _L_type;
+ _STLP_ACQUIRE_LOCK(__base->_M_lock)
+ _L_type* __pos;
+ _L_type* __prev;
+
+ for (__prev = (_L_type*)&__base->_M_node, __pos= (_L_type*)__prev->_M_next;
+ __pos!=0;) {
+ if ((!(&__first == (_Iterator*)__pos || &__last == (_Iterator*)__pos))
+ && __in_range_aux(
+ ((_Iterator*)__pos)->_M_iterator,
+ __first._M_iterator,
+ __last._M_iterator,
+ _STLP_ITERATOR_CATEGORY(__first, _Iterator))) {
+ __pos->_M_owner = 0;
+ __pos = (_L_type*) (__prev->_M_next = __pos->_M_next);
+ }
+ else {
+ __prev = __pos;
+ __pos=(_L_type*)__pos->_M_next;
+ }
+ }
+ _STLP_RELEASE_LOCK(__base->_M_lock)
+}
+
+template <class _Iterator>
+void _STLP_CALL __invalidate_iterator(const __owned_list* __base,
+ const _Iterator& __it)
+{
+ typedef __owned_link _L_type;
+ _L_type* __position, *__prev;
+ _STLP_ACQUIRE_LOCK(__base->_M_lock)
+ for (__prev = (_L_type*)&__base->_M_node, __position = (_L_type*)__prev->_M_next;
+ __position!= 0;) {
+ // this requires safe iterators to be derived from __owned_link
+ if ((__position != (_L_type*)&__it) && ((_Iterator*)__position)->_M_iterator ==__it._M_iterator) {
+ __position->_M_owner = 0;
+ __position = (_L_type*) (__prev->_M_next = __position->_M_next);
+ }
+ else {
+ __prev = __position;
+ __position=(_L_type*)__position->_M_next;
+ }
+ }
+ _STLP_RELEASE_LOCK(__base->_M_lock)
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_DEBUG */
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+// dwa 12/26/99 -- for abort
+# if defined (_STLP_USE_NEW_C_HEADERS)
+# include <cstdlib>
+# else
+# include <stdlib.h>
+# endif
+
+# if defined (_STLP_WIN32)
+# include <stl/_threads.h>
+# endif
+
+//==========================================================
+// .c section
+// owned_list non-inline methods and global functions
+//==========================================================
+
+#if defined ( _STLP_ASSERTIONS )
+
+_STLP_BEGIN_NAMESPACE
+
+# ifndef _STLP_STRING_LITERAL
+# define _STLP_STRING_LITERAL(__x) __x
+# endif
+
+# ifdef _STLP_WINCE
+# define _STLP_PERCENT_S "%hs"
+# else
+# define _STLP_PERCENT_S "%s"
+# endif
+
+# define _STLP_MESSAGE_TABLE_BODY = { \
+_STLP_STRING_LITERAL("\n" _STLP_PERCENT_S "(%d): STL error: %s\n"), \
+_STLP_STRING_LITERAL(_STLP_PERCENT_S "(%d): STL assertion failure : " _STLP_PERCENT_S "\n" _STLP_ASSERT_MSG_TRAILER), \
+_STLP_STRING_LITERAL("\n" _STLP_PERCENT_S "(%d): STL error : " _STLP_PERCENT_S "\n" _STLP_PERCENT_S "(%d): STL assertion failure: " _STLP_PERCENT_S " \n" _STLP_ASSERT_MSG_TRAILER), \
+_STLP_STRING_LITERAL("Invalid argument to operation (see operation documentation)"), \
+_STLP_STRING_LITERAL("Taking an iterator out of destroyed (or otherwise corrupted) container"), \
+_STLP_STRING_LITERAL("Trying to extract an object out from empty container"),\
+_STLP_STRING_LITERAL("Past-the-end iterator could not be erased"), \
+_STLP_STRING_LITERAL("Index out of bounds"), \
+_STLP_STRING_LITERAL("Container doesn't own the iterator"), \
+_STLP_STRING_LITERAL("Uninitialized or invalidated (by mutating operation) iterator used"), \
+_STLP_STRING_LITERAL("Uninitialized or invalidated (by mutating operation) lefthand iterator in expression"), \
+_STLP_STRING_LITERAL("Uninitialized or invalidated (by mutating operation) righthand iterator in expression"), \
+_STLP_STRING_LITERAL("Iterators used in expression are from different owners"), \
+_STLP_STRING_LITERAL("Iterator could not be dereferenced (past-the-end ?)"), \
+_STLP_STRING_LITERAL("Range [first,last) is invalid"), \
+_STLP_STRING_LITERAL("Iterator is not in range [first,last)"), \
+_STLP_STRING_LITERAL("Range [first,last) is not in range [start,finish)"), \
+_STLP_STRING_LITERAL("The advance would produce invalid iterator"), \
+_STLP_STRING_LITERAL("Iterator is singular (advanced beyond the bounds ?)"), \
+_STLP_STRING_LITERAL("Memory block deallocated twice"), \
+_STLP_STRING_LITERAL("Deallocating a block that was never allocated"), \
+_STLP_STRING_LITERAL("Deallocating a memory block allocated for another type"), \
+_STLP_STRING_LITERAL("Size of block passed to deallocate() doesn't match block size"), \
+_STLP_STRING_LITERAL("Pointer underrun - safety margin at front of memory block overwritten"), \
+_STLP_STRING_LITERAL("Pointer overrrun - safety margin at back of memory block overwritten"), \
+_STLP_STRING_LITERAL("Attempt to dereference null pointer returned by auto_ptr::get()"), \
+_STLP_STRING_LITERAL("Unknown problem") \
+ }
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template <class _Dummy>
+const char* __stl_debug_engine<_Dummy>::_Message_table[_StlMsg_MAX] _STLP_MESSAGE_TABLE_BODY;
+
+# else
+__DECLARE_INSTANCE(const char*, __stl_debug_engine<bool>::_Message_table[_StlMsg_MAX],
+ _STLP_MESSAGE_TABLE_BODY);
+
+# endif
+
+# undef _STLP_STRING_LITERAL
+# undef _STLP_PERCENT_S
+_STLP_END_NAMESPACE
+
+// abort()
+# include <cstdlib>
+
+# if !defined( _STLP_DEBUG_MESSAGE )
+
+# include <cstdarg>
+# include <cstdio>
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Dummy>
+void _STLP_CALL
+__stl_debug_engine<_Dummy>::_Message(const char * __format_str, ...)
+{
+ STLPORT_CSTD::va_list __args;
+ va_start( __args, __format_str );
+
+# if defined (_STLP_WINCE)
+ TCHAR __buffer[512];
+ int _convert = strlen(__format_str) + 1;
+ LPWSTR _lpw = (LPWSTR)alloca(_convert*sizeof(wchar_t));
+ _lpw[0] = '\0';
+ MultiByteToWideChar(GetACP(), 0, __format_str, -1, _lpw, _convert);
+ wvsprintf(__buffer, _lpw, __args);
+ // wvsprintf(__buffer, __format_str, __args);
+ _STLP_WINCE_TRACE(__buffer);
+# elif defined (_STLP_WIN32) && ( defined(_STLP_MSVC) || defined (__ICL) || defined (__BORLANDC__))
+ char __buffer [4096];
+ _vsnprintf(__buffer, sizeof(__buffer) / sizeof(char),
+ __format_str, __args);
+ OutputDebugStringA(__buffer);
+# elif defined (__amigaos__)
+ STLPORT_CSTD::vfprintf(stderr, __format_str, (char *)__args);
+# else
+ STLPORT_CSTD::vfprintf(stderr, __format_str, __args);
+# endif /* WINCE */
+
+# ifdef _STLP_DEBUG_MESSAGE_POST
+ _STLP_DEBUG_MESSAGE_POST
+# endif
+
+ va_end(__args);
+
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_DEBUG_MESSAGE */
+
+
+_STLP_BEGIN_NAMESPACE
+
+
+template <class _Dummy>
+void _STLP_CALL
+__stl_debug_engine<_Dummy>::_IndexedError(int __error_ind, const char* __f, int __l)
+{
+ __stl_debug_message(_Message_table[_StlFormat_ERROR_RETURN],
+ __f, __l, _Message_table[__error_ind]);
+}
+
+template <class _Dummy>
+void _STLP_CALL
+__stl_debug_engine<_Dummy>::_VerboseAssert(const char* __expr, int __error_ind, const char* __f, int __l)
+{
+ __stl_debug_message(_Message_table[_StlFormat_VERBOSE_ASSERTION_FAILURE],
+ __f, __l, _Message_table[__error_ind], __f, __l, __expr);
+ __stl_debug_terminate();
+}
+
+template <class _Dummy>
+void _STLP_CALL
+__stl_debug_engine<_Dummy>::_Assert(const char* __expr, const char* __f, int __l)
+{
+ __stl_debug_message(_Message_table[_StlFormat_ASSERTION_FAILURE],__f, __l, __expr);
+ __stl_debug_terminate();
+}
+
+// if exceptions are present, sends unique exception
+// if not, calls abort() to terminate
+template <class _Dummy>
+void _STLP_CALL
+__stl_debug_engine<_Dummy>::_Terminate()
+{
+# ifdef _STLP_USE_NAMESPACES
+ using namespace _STLP_STD;
+# endif
+# if defined (_STLP_USE_EXCEPTIONS) && ! defined (_STLP_NO_DEBUG_EXCEPTIONS)
+ throw __stl_debug_exception();
+# else
+ _STLP_ABORT();
+# endif
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_ASSERTIONS */
+
+#ifdef _STLP_DEBUG
+
+_STLP_BEGIN_NAMESPACE
+
+//==========================================================
+// owned_list non-inline methods
+//==========================================================
+
+template <class _Dummy>
+void _STLP_CALL
+__stl_debug_engine<_Dummy>::_Invalidate_all(__owned_list* __l) {
+ _STLP_ACQUIRE_LOCK(__l->_M_lock);
+ _Stamp_all(__l, 0);
+ __l->_M_node._M_next =0;
+ _STLP_RELEASE_LOCK(__l->_M_lock);
+}
+
+// boris : this is unasafe routine; should be used from within critical section only !
+template <class _Dummy>
+void _STLP_CALL
+__stl_debug_engine<_Dummy>::_Stamp_all(__owned_list* __l, __owned_list* __o) {
+ // crucial
+ if (__l->_M_node._M_owner) {
+ for (__owned_link* __position = (__owned_link*)__l->_M_node._M_next;
+ __position != 0; __position= (__owned_link*)__position->_M_next) {
+ _STLP_ASSERT(__position->_Owner()== __l)
+ __position->_M_owner=__o;
+ }
+ }
+}
+
+template <class _Dummy>
+void _STLP_CALL
+__stl_debug_engine<_Dummy>::_Verify(const __owned_list* __l) {
+ _STLP_ACQUIRE_LOCK(__l->_M_lock);
+ if (__l) {
+ _STLP_ASSERT(__l->_M_node._Owner() != 0)
+ for (__owned_link* __position = (__owned_link*)__l->_M_node._M_next;
+ __position != 0; __position= (__owned_link*)__position->_M_next) {
+ _STLP_ASSERT(__position->_Owner()== __l)
+ }
+ }
+ _STLP_RELEASE_LOCK(__l->_M_lock);
+}
+
+template <class _Dummy>
+void _STLP_CALL
+__stl_debug_engine<_Dummy>::_Swap_owners(__owned_list& __x, __owned_list& __y) {
+
+ // according to the standard : --no swap() function invalidates any references,
+ // pointers, or iterators referring to the elements of the containers being swapped.
+
+ __owned_link* __tmp;
+
+ // boris : there is a deadlock potential situation here if we lock two containers sequentially.
+ // As user is supposed to provide its own synchronization around swap() ( it is unsafe to do any container/iterator access
+ // in parallel with swap()), we just do not use any locking at all -- that behaviour is closer to non-debug version
+
+ __tmp = __x._M_node._M_next;
+
+ _Stamp_all(&__x, &__y);
+ _Stamp_all(&__y, &__x);
+
+ __x._M_node._M_next = __y._M_node._M_next;
+ __y._M_node._M_next = __tmp;
+
+}
+
+template <class _Dummy>
+void _STLP_CALL
+__stl_debug_engine<_Dummy>::_M_detach(__owned_list* __l, __owned_link* __c_node) {
+ if (__l != 0) {
+
+ _STLP_VERBOSE_ASSERT(__l->_Owner()!=0, _StlMsg_INVALID_CONTAINER)
+
+ _STLP_ACQUIRE_LOCK(__l->_M_lock)
+ // boris : re-test the condition in case someone else already deleted us
+ if(__c_node->_M_owner != 0) {
+ __owned_link* __prev, *__next;
+
+ for (__prev = &__l->_M_node; (__next = __prev->_M_next) != __c_node;
+ __prev = __next) {
+ _STLP_ASSERT(__next && __next->_Owner() == __l)
+ }
+
+ __prev->_M_next = __c_node->_M_next;
+ __c_node->_M_owner=0;
+ }
+ _STLP_RELEASE_LOCK(__l->_M_lock)
+ }
+}
+
+template <class _Dummy>
+void _STLP_CALL
+__stl_debug_engine<_Dummy>::_M_attach(__owned_list* __l, __owned_link* __c_node) {
+ if (__l ==0) {
+ (__c_node)->_M_owner = 0;
+ } else {
+ _STLP_VERBOSE_ASSERT(__l->_Owner()!=0, _StlMsg_INVALID_CONTAINER)
+ _STLP_ACQUIRE_LOCK(__l->_M_lock)
+ __c_node->_M_owner = __l;
+ __c_node->_M_next = __l->_M_node._M_next;
+ __l->_M_node._M_next = __c_node;
+ _STLP_RELEASE_LOCK(__l->_M_lock)
+ }
+}
+
+
+template <class _Dummy>
+void* _STLP_CALL
+__stl_debug_engine<_Dummy>::_Get_container_ptr(const __owned_link* __l) {
+ const __owned_list* __owner = __l->_Owner();
+ _STLP_VERBOSE_RETURN_0(__owner != 0, _StlMsg_INVALID_ITERATOR)
+ void* __ret = __CONST_CAST(void*,__owner->_Owner());
+ _STLP_VERBOSE_RETURN_0(__ret !=0, _StlMsg_INVALID_CONTAINER)
+ return __ret;
+}
+
+template <class _Dummy>
+bool _STLP_CALL
+__stl_debug_engine<_Dummy>::_Check_same_owner( const __owned_link& __i1,
+ const __owned_link& __i2)
+{
+ _STLP_VERBOSE_RETURN(__i1._Valid(), _StlMsg_INVALID_LEFTHAND_ITERATOR)
+ _STLP_VERBOSE_RETURN(__i2._Valid(), _StlMsg_INVALID_RIGHTHAND_ITERATOR)
+ _STLP_VERBOSE_RETURN((__i1._Owner()==__i2._Owner()), _StlMsg_DIFFERENT_OWNERS)
+ return true;
+}
+
+template <class _Dummy>
+bool _STLP_CALL
+__stl_debug_engine<_Dummy>::_Check_same_owner_or_null( const __owned_link& __i1,
+ const __owned_link& __i2)
+{
+ _STLP_VERBOSE_RETURN(__i1._Owner()==__i2._Owner(), _StlMsg_DIFFERENT_OWNERS)
+ return true;
+}
+
+template <class _Dummy>
+bool _STLP_CALL
+__stl_debug_engine<_Dummy>::_Check_if_owner( const __owned_list * __l, const __owned_link& __it)
+{
+ const __owned_list* __owner_ptr = __it._Owner();
+ _STLP_VERBOSE_RETURN(__owner_ptr!=0, _StlMsg_INVALID_ITERATOR)
+ _STLP_VERBOSE_RETURN(__l==__owner_ptr, _StlMsg_NOT_OWNER)
+ return true;
+}
+
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_DEBUG */
+
+#endif /* if defined (EXPOSE_GLOBALS_IMPLEMENTATION) */
+
+#endif /* header guard */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/debug/_debug.h b/src/STLport/stl/debug/_debug.h
new file mode 100644
index 0000000..0297598
--- /dev/null
+++ b/src/STLport/stl/debug/_debug.h
@@ -0,0 +1,426 @@
+/*
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_DEBUG_H
+# define _STLP_DEBUG_H
+
+# if defined (_STLP_ASSERTIONS) || defined (_STLP_DEBUG)
+
+#ifndef _STLP_CONFIG_H
+# include <stl/_config.h>
+#endif
+
+# if !defined (_STLP_EXTRA_OPERATORS_FOR_DEBUG) && \
+ ( defined (_STLP_BASE_MATCH_BUG) || (defined (_STLP_MSVC) && _STLP_MSVC < 1100 ) )
+# define _STLP_EXTRA_OPERATORS_FOR_DEBUG
+# endif
+
+# if !defined(_STLP_FILE__)
+# define _STLP_FILE__ __FILE__
+# endif
+
+enum {
+ _StlFormat_ERROR_RETURN,
+ _StlFormat_ASSERTION_FAILURE,
+ _StlFormat_VERBOSE_ASSERTION_FAILURE,
+ _StlMsg_INVALID_ARGUMENT,
+ _StlMsg_INVALID_CONTAINER,
+ _StlMsg_EMPTY_CONTAINER,
+ _StlMsg_ERASE_PAST_THE_END,
+ _StlMsg_OUT_OF_BOUNDS,
+ _StlMsg_NOT_OWNER,
+ _StlMsg_INVALID_ITERATOR,
+ _StlMsg_INVALID_LEFTHAND_ITERATOR,
+ _StlMsg_INVALID_RIGHTHAND_ITERATOR,
+ _StlMsg_DIFFERENT_OWNERS ,
+ _StlMsg_NOT_DEREFERENCEABLE ,
+ _StlMsg_INVALID_RANGE ,
+ _StlMsg_NOT_IN_RANGE_1 ,
+ _StlMsg_NOT_IN_RANGE_2 ,
+ _StlMsg_INVALID_ADVANCE ,
+ _StlMsg_SINGULAR_ITERATOR ,
+ // debug alloc messages
+ _StlMsg_DBA_DELETED_TWICE ,
+ _StlMsg_DBA_NEVER_ALLOCATED ,
+ _StlMsg_DBA_TYPE_MISMATCH ,
+ _StlMsg_DBA_SIZE_MISMATCH ,
+ _StlMsg_DBA_UNDERRUN ,
+ _StlMsg_DBA_OVERRUN ,
+ // auto_ptr messages
+ _StlMsg_AUTO_PTR_NULL ,
+ _StlMsg_UNKNOWN
+ /* _StlMsg_MAX */
+};
+
+/* have to hardcode that ;() */
+# define _StlMsg_MAX 27
+
+_STLP_BEGIN_NAMESPACE
+
+// This class is unique (not inherited from exception),
+// to disallow catch in anything but (...)
+struct __stl_debug_exception {
+ // no members
+};
+
+class _STLP_CLASS_DECLSPEC __owned_link;
+class _STLP_CLASS_DECLSPEC __owned_list;
+
+template <class _Dummy>
+struct __stl_debug_engine {
+
+ // Basic routine to report any debug message
+ // Use _STLP_DEBUG_MESSAGE to override
+ static void _STLP_CALL _Message(const char * format_str, ...);
+
+ // Micsellanous function to report indexed error message
+ static void _STLP_CALL _IndexedError(int __ind, const char* __f, int __l);
+
+ // Basic assertion report mechanism.
+ // Reports failed assertion via __stl_debug_message and calls _Terminate
+ // if _STLP_DEBUG_TERMINATE is specified, calls __stl_debug_terminate instead
+ static void _STLP_CALL _Assert(const char* __expr, const char* __f, int __l);
+
+ // The same, with additional diagnostics
+ static void _STLP_CALL _VerboseAssert(const char* __expr, int __error_ind, const char* __f, int __l);
+
+ // If exceptions are present, sends unique exception
+ // If not, calls _STLP_ABORT() to terminate
+ // Use _STLP_DEBUG_TERMINATE to override
+ static void _STLP_CALL _Terminate();
+
+# ifdef _STLP_DEBUG
+
+ // owned_list/link delegate non-inline functions here
+
+ static bool _STLP_CALL _Check_same_owner( const __owned_link& __i1,
+ const __owned_link& __i2);
+ static bool _STLP_CALL _Check_same_owner_or_null( const __owned_link& __i1,
+ const __owned_link& __i2);
+ static bool _STLP_CALL _Check_if_owner( const __owned_list*, const __owned_link&);
+
+ static void _STLP_CALL _Verify(const __owned_list*);
+
+ static void _STLP_CALL _Swap_owners(__owned_list&, __owned_list& /*, bool __swap_roots */ );
+
+ static void _STLP_CALL _Invalidate_all(__owned_list*);
+
+ static void _STLP_CALL _Stamp_all(__owned_list*, __owned_list*);
+
+ static void _STLP_CALL _M_detach(__owned_list*, __owned_link*);
+
+ static void _STLP_CALL _M_attach(__owned_list*, __owned_link*);
+
+ // accessor : check and get pointer to the container
+ static void* _STLP_CALL _Get_container_ptr(const __owned_link*);
+# endif /* _STLP_DEBUG */
+
+ // debug messages and formats
+ _STLP_STATIC_MEMBER_DECLSPEC static const char* _Message_table[_StlMsg_MAX];
+};
+
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE struct _STLP_CLASS_DECLSPEC __stl_debug_engine<bool>;
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+typedef __stl_debug_engine<bool> __stl_debugger;
+
+_STLP_END_NAMESPACE
+
+# ifndef _STLP_ASSERT
+# define _STLP_ASSERT(expr) \
+ if (!(expr)) {STLPORT::__stl_debugger::_Assert( # expr, _STLP_FILE__, __LINE__);}
+# endif
+
+# endif /* _STLP_ASSERTIONS || _STLP_DEBUG */
+
+
+// this section is for _STLP_DEBUG only
+#if defined ( _STLP_DEBUG )
+
+# ifndef _STLP_VERBOSE_ASSERT
+// fbp : new form not requiring ";"
+# define _STLP_VERBOSE_ASSERT(expr,__diag_num) \
+ if (!(expr)) { STLPORT::__stl_debugger::_VerboseAssert\
+ ( # expr, __diag_num, _STLP_FILE__, __LINE__ ); \
+ }
+# endif
+
+# define _STLP_DEBUG_CHECK(expr) _STLP_ASSERT(expr)
+# define _STLP_DEBUG_DO(expr) expr;
+
+# ifndef _STLP_VERBOSE_RETURN
+# define _STLP_VERBOSE_RETURN(__expr,__diag_num) if (!(__expr)) { \
+ __stl_debugger::_IndexedError(__diag_num, __FILE__ , __LINE__); \
+ return false; }
+# endif
+
+# ifndef _STLP_VERBOSE_RETURN_0
+# define _STLP_VERBOSE_RETURN_0(__expr,__diag_num) if (!(__expr)) { \
+ __stl_debugger::_IndexedError(__diag_num, __FILE__ , __LINE__); \
+ return 0; }
+# endif
+
+#if ! defined (_STLP_INTERNAL_THREADS_H)
+# include <stl/_threads.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//=============================================================
+template <class _Iterator>
+inline bool _STLP_CALL __valid_range(const _Iterator& __i1 ,const _Iterator& __i2,
+ const random_access_iterator_tag&) {
+ return (__i1< __i2) || (__i1 == __i2);
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL __valid_range(const _Iterator& __i1 ,const _Iterator& __i2,
+ const bidirectional_iterator_tag&) {
+ // check if comparable
+ bool __dummy(__i1==__i2);
+ return (__dummy==__dummy);
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL __valid_range(const _Iterator& __i1 ,const _Iterator& __i2, const forward_iterator_tag&) {
+ // check if comparable
+ bool __dummy(__i1==__i2);
+ return (__dummy==__dummy);
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL __valid_range(const _Iterator&,const _Iterator&, const input_iterator_tag&) {
+ return true;
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL __valid_range(const _Iterator&,const _Iterator&, const output_iterator_tag&) {
+ return true;
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL __valid_range(const _Iterator& __i1, const _Iterator& __i2) {
+ return __valid_range(__i1,__i2,_STLP_ITERATOR_CATEGORY(__i1, _Iterator));
+}
+
+// Note : that means in range [i1, i2].
+template <class _Iterator>
+inline bool _STLP_CALL __in_range(const _Iterator& _It, const _Iterator& __i1,
+ const _Iterator& __i2) {
+ return __valid_range(__i1,_It,_STLP_ITERATOR_CATEGORY(__i1, _Iterator)) &&
+ __valid_range(_It,__i2,_STLP_ITERATOR_CATEGORY(_It, _Iterator));
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL __in_range(const _Iterator& __first, const _Iterator& __last,
+ const _Iterator& __start, const _Iterator& __finish) {
+ return __valid_range(__first,__last,_STLP_ITERATOR_CATEGORY(__first, _Iterator)) &&
+ __valid_range(__start,__first,_STLP_ITERATOR_CATEGORY(__first, _Iterator)) &&
+ __valid_range(__last,__finish,_STLP_ITERATOR_CATEGORY(__last, _Iterator));
+}
+
+//==========================================================
+
+
+class _STLP_CLASS_DECLSPEC __owned_link {
+public:
+
+ __owned_link() : _M_owner(0) {}
+ __owned_link(const __owned_list* __c) : _M_owner(0), _M_next(0) {
+ __stl_debugger::_M_attach(__CONST_CAST(__owned_list*,__c), this);
+ }
+ __owned_link(const __owned_link& __rhs): _M_owner(0) {
+ __stl_debugger::_M_attach(__CONST_CAST(__owned_list*,__rhs._M_owner), this);
+ }
+ __owned_link& operator=(const __owned_link& __rhs) {
+ __owned_list* __new_owner = __CONST_CAST(__owned_list*,__rhs._M_owner);
+ __owned_list* __old_owner = _M_owner;
+ if ( __old_owner != __new_owner ) {
+ __stl_debugger::_M_detach(__old_owner, this);
+ __stl_debugger::_M_attach(__new_owner, this);
+ }
+ return *this;
+ }
+ ~__owned_link() {
+ __stl_debugger::_M_detach(_M_owner, this);
+ _Invalidate();
+ }
+
+ const __owned_list* _Owner() const {
+ return _M_owner;
+ }
+ __owned_list* _Owner() {
+ return _M_owner;
+ }
+ void _Set_owner(const __owned_list* __o) {
+ _M_owner= __CONST_CAST(__owned_list*,__o);
+ }
+ bool _Valid() const {
+ return _M_owner !=0;
+ }
+
+ void _Invalidate() { _M_owner=0; _M_next = 0; }
+ void _Link_to_self() { _M_next= 0; }
+
+ __owned_link* _Next() { return _M_next; }
+ const __owned_link* _Next() const { return _M_next; }
+
+public:
+ __owned_list* _M_owner;
+ __owned_link* _M_next;
+};
+
+
+class _STLP_CLASS_DECLSPEC __owned_list {
+public:
+ __owned_list(const void* __o) {
+ // fprintf(stderr, "__owned_list(): %p\n",(void*)this);
+ _M_node._M_owner = __CONST_CAST(__owned_list*, __REINTERPRET_CAST(const __owned_list*,__o));
+ _M_node._M_next=0;
+ }
+ ~__owned_list() {
+ // fprintf(stderr, "~__owned_list(): %p\n",(void*)this);
+ _Invalidate_all();
+ // that prevents detach
+ _M_node._Invalidate();
+ }
+ const void* _Owner() const {
+ return (const void*)_M_node._M_owner;
+ }
+ void* _Owner() {
+ return (void*)_M_node._M_owner;
+ }
+ bool _Valid() const {
+ return _M_node._M_owner!=0;
+ }
+ void _Invalidate() { _M_node._M_owner=0; }
+
+ __owned_link* _First() { return _M_node._Next(); }
+ __owned_link* _Last() { return 0 ; }
+
+ const __owned_link* _First() const { return (__owned_link*)_M_node._M_next; }
+ const __owned_link* _Last() const { return 0 ;}
+
+ void _Verify() const {
+ __stl_debugger::_Verify(this);
+ }
+
+ void _Swap_owners(__owned_list& __y) {
+ __stl_debugger::_Swap_owners(*this, __y);
+ }
+
+ void _Invalidate_all() {
+ __stl_debugger::_Invalidate_all(this);
+ }
+
+ mutable __owned_link _M_node;
+ mutable _STLP_mutex _M_lock;
+
+private:
+ // should never be called, should be left undefined,
+ // but some compilers complain about it ;(
+ __owned_list(const __owned_list&){}
+ void operator=(const __owned_list&) {}
+
+ friend class __owned_link;
+ friend struct __stl_debug_engine<bool>;
+};
+
+
+//==========================================================
+
+// forward declaratioins
+
+template <class _Iterator>
+bool _STLP_CALL __check_range(const _Iterator&, const _Iterator&);
+template <class _Iterator>
+bool _STLP_CALL __check_range(const _Iterator&,
+ const _Iterator&, const _Iterator&);
+template <class _Iterator>
+bool _STLP_CALL __check_range(const _Iterator&, const _Iterator& ,
+ const _Iterator&, const _Iterator& );
+
+template <class _Iterator>
+void _STLP_CALL __invalidate_range(const __owned_list* __base,
+ const _Iterator& __first,
+ const _Iterator& __last);
+
+template <class _Iterator>
+void _STLP_CALL __invalidate_iterator(const __owned_list* __base,
+ const _Iterator& __it);
+
+//============================================================
+
+inline bool _STLP_CALL
+__check_same_owner( const __owned_link& __i1, const __owned_link& __i2) {
+ return __stl_debugger::_Check_same_owner(__i1,__i2);
+}
+inline bool _STLP_CALL
+__check_same_owner_or_null( const __owned_link& __i1, const __owned_link& __i2) {
+ return __stl_debugger::_Check_same_owner_or_null(__i1,__i2);
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL __check_if_owner( const __owned_list* __owner,
+ const _Iterator& __it) {
+ return __stl_debugger::_Check_if_owner(__owner, (const __owned_link&)__it);
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_DEBUG */
+
+#if defined ( _STLP_ASSERTIONS )
+
+# ifndef _STLP_ASSERT_MSG_TRAILER
+# define _STLP_ASSERT_MSG_TRAILER
+# endif
+
+// dwa 12/30/98 - if _STLP_DEBUG_MESSAGE is defined, the user can supply own definition.
+# if !defined( _STLP_DEBUG_MESSAGE )
+# define __stl_debug_message __stl_debugger::_Message
+# else
+ extern void __stl_debug_message(const char * format_str, ...);
+# endif
+
+// fbp: if _STLP_DEBUG_TERMINATE is defined, the user can supply own definition.
+# if !defined( _STLP_DEBUG_TERMINATE )
+# define __stl_debug_terminate __stl_debugger::_Terminate
+# else
+ extern void __stl_debug_terminate(void);
+# endif
+
+#endif
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+# include <stl/debug/_debug.c>
+# endif
+
+#endif /* DEBUG_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/debug/_deque.h b/src/STLport/stl/debug/_deque.h
new file mode 100644
index 0000000..2212696
--- /dev/null
+++ b/src/STLport/stl/debug/_deque.h
@@ -0,0 +1,281 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DBG_DEQUE_H
+#define _STLP_INTERNAL_DBG_DEQUE_H
+
+#include <stl/debug/_iterator.h>
+
+# if !defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM) && !defined (_STLP_NO_DEFAULT_NON_TYPE_PARAM)
+# undef _DBG_deque
+# define _DBG_deque deque
+# endif
+
+# define _DEQUE_WRAPPER _DBG_deque<_Tp,_Alloc>
+
+# define _STLP_DEQUE_SUPER __WORKAROUND_DBG_RENAME(deque) <_Tp,_Alloc>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _Tp, class _Alloc>
+inline _Tp* value_type(const _DBG_iter_base< _STLP_DEQUE_SUPER >&) {
+ return (_Tp*)0;
+}
+template <class _Tp, class _Alloc>
+inline random_access_iterator_tag iterator_category(const _DBG_iter_base< _STLP_DEQUE_SUPER >&) {
+ return random_access_iterator_tag();
+}
+# endif
+
+template <class _Tp, _STLP_DBG_ALLOCATOR_SELECT(_Tp) >
+class _DBG_deque : public _STLP_DEQUE_SUPER {
+
+ typedef _DBG_deque<_Tp,_Alloc> _Self;
+ typedef _STLP_DEQUE_SUPER _Base;
+
+public: // Basic types
+
+ __IMPORT_CONTAINER_TYPEDEFS(_Base)
+
+public: // Iterators
+ typedef _DBG_iter< _STLP_DEQUE_SUPER, _Nonconst_traits<value_type> > iterator;
+ typedef _DBG_iter< _STLP_DEQUE_SUPER, _Const_traits<value_type> > const_iterator;
+
+ _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+
+protected:
+ __owned_list _M_iter_list;
+ void _Invalidate_iterator(const iterator& __it) {
+ __invalidate_iterator(&_M_iter_list,__it);
+ }
+ void _Invalidate_all() {
+ _M_iter_list._Invalidate_all();
+ }
+
+public: // Basic accessors
+ iterator begin() { return iterator(&_M_iter_list, this->_M_start); }
+ iterator end() { return iterator(&_M_iter_list, this->_M_finish); }
+ const_iterator begin() const {
+ return const_iterator(&_M_iter_list, this->_M_start);
+ }
+ const_iterator end() const {
+ return const_iterator(&_M_iter_list, this->_M_finish);
+ }
+
+ reverse_iterator rbegin() { return reverse_iterator(end()); }
+ reverse_iterator rend() { return reverse_iterator(begin()); }
+ const_reverse_iterator rbegin() const
+ { return const_reverse_iterator(end()); }
+ const_reverse_iterator rend() const
+ { return const_reverse_iterator(begin()); }
+
+ reference operator[](size_type __n)
+ { return begin()[difference_type(__n)]; }
+ const_reference operator[](size_type __n) const
+ { return begin()[difference_type(__n)]; }
+
+ reference front() { return *begin(); }
+ reference back() {
+ iterator __tmp = end();
+ --__tmp;
+ return *__tmp;
+ }
+ const_reference front() const { return *begin(); }
+ const_reference back() const {
+ const_iterator __tmp = end();
+ --__tmp;
+ return *__tmp;
+ }
+
+public: // Constructor, destructor.
+
+ const _Base* _Get_base() const { return (const _Base*)this; }
+
+ explicit _DBG_deque(const allocator_type& __a = allocator_type()) :
+ _STLP_DEQUE_SUPER(__a), _M_iter_list(_Get_base()) {}
+ _DBG_deque(const _Self& __x) : _STLP_DEQUE_SUPER(__x), _M_iter_list(_Get_base()) {}
+ _DBG_deque(size_type __n, const value_type& __value,
+ const allocator_type& __a = allocator_type()) :
+ _STLP_DEQUE_SUPER(__n, __value, __a), _M_iter_list(_Get_base()) {}
+ explicit _DBG_deque(size_type __n) : _STLP_DEQUE_SUPER(__n), _M_iter_list(_Get_base()) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ _DBG_deque(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) :
+ _STLP_DEQUE_SUPER(__first, __last, __a) , _M_iter_list(_Get_base()) {}
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ _DBG_deque(_InputIterator __first, _InputIterator __last):
+ _STLP_DEQUE_SUPER(__first, __last, allocator_type()) , _M_iter_list(_Get_base()) {}
+# endif
+#else /* _STLP_MEMBER_TEMPLATES */
+ _DBG_deque(const value_type* __first, const value_type* __last,
+ const allocator_type& __a = allocator_type())
+ : _STLP_DEQUE_SUPER(__first, __last, __a), _M_iter_list(_Get_base()) {}
+
+ _DBG_deque(const_iterator __first, const_iterator __last,
+ const allocator_type& __a = allocator_type())
+ : _STLP_DEQUE_SUPER(__first._M_iterator, __last._M_iterator, __a),
+ _M_iter_list(_Get_base()) {}
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ _Self& operator= (const _Self& __x) {
+ _Invalidate_all();
+ (_Base&)*this = (const _Base&)__x;
+ return *this;
+ }
+
+ void swap(_Self& __x) {
+ _M_iter_list._Swap_owners(__x._M_iter_list);
+ _Base::swap(__x);
+ }
+
+public:
+ void assign(size_type __n, const _Tp& __val) {
+ _Base::assign(__n, __val);
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _InputIterator>
+ void assign(_InputIterator __first, _InputIterator __last) {
+ _Base::assign(__first, __last);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public: // push_* and pop_*
+
+ void push_back(const value_type& __t) {
+ _Invalidate_all();
+ _Base::push_back(__t);
+ }
+
+ void push_back() {
+ _Invalidate_all();
+ _Base::push_back();
+ }
+
+ void push_front(const value_type& __t) {
+ _Invalidate_all();
+ _Base::push_front(__t);
+ }
+
+ void push_front() {
+ _Base::push_front();
+ _Invalidate_all();
+ }
+
+
+ void pop_back() {
+ _Invalidate_iterator(end());
+ _Base::pop_back();
+ }
+
+ void pop_front() {
+ _Invalidate_iterator(begin());
+ _Base::pop_front();
+ }
+
+public: // Insert
+
+ iterator insert(iterator __position, const value_type& __x) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ // fbp : invalidation !
+ return iterator(&_M_iter_list, _Base::insert(__position._M_iterator, __x));
+ }
+
+ iterator insert(iterator __position) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ // fbp : invalidation !
+ return iterator(&_M_iter_list, _Base::insert(__position._M_iterator));
+ }
+
+ void insert(iterator __position, size_type __n, const value_type& __x) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ // fbp : invalidation !
+ _Base::insert(__position._M_iterator, __n, __x);
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void insert(iterator __position, _InputIterator __first, _InputIterator __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ // fbp : invalidation !
+ _Base::insert(__position._M_iterator, __first, __last);
+ }
+#else /* _STLP_MEMBER_TEMPLATES */
+ void insert(iterator __position,
+ const value_type* __first, const value_type* __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ _Base::insert(__position._M_iterator, __first, __last);
+ }
+ void insert(iterator __position,
+ const_iterator __first, const_iterator __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ _Base::insert(__position._M_iterator, __first._M_iterator, __last._M_iterator);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public: // Erase
+ iterator erase(iterator __pos) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __pos) && (__pos != end()))
+ return iterator (&_M_iter_list, _Base::erase(__pos._M_iterator));
+ }
+
+ iterator erase(iterator __first, iterator __last) {
+ _STLP_DEBUG_CHECK(__first >= begin() && __last <= end())
+ return iterator (&_M_iter_list, _Base::erase(__first._M_iterator, __last._M_iterator));
+ }
+
+ void clear() {
+ _Invalidate_all();
+ _Base::clear();
+ }
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER _DBG_deque<_Tp, _Alloc>
+#define _STLP_TEMPLATE_CONTAINER_BASE _STLP_DEQUE_SUPER
+#include <stl/debug/_relops_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER_BASE
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+
+# undef _DBG_deque
+# undef _STLP_DEQUE_SUPER
+
+#endif /* _STLP_INTERNAL_DEQUE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/debug/_hashtable.h b/src/STLport/stl/debug/_hashtable.h
new file mode 100644
index 0000000..0d5a110
--- /dev/null
+++ b/src/STLport/stl/debug/_hashtable.h
@@ -0,0 +1,261 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DBG_HASHTABLE_H
+#define _STLP_INTERNAL_DBG_HASHTABLE_H
+
+// Hashtable class, used to implement the hashed associative containers
+// hash_set, hash_map, hash_multiset, and hash_multimap.
+
+# include <stl/debug/_iterator.h>
+
+# undef hashtable
+# undef _DBG_hashtable
+# define _DBG_hashtable hashtable
+
+# define _STLP_DBG_HT_SUPER \
+__WORKAROUND_DBG_RENAME(hashtable) <_Val, _Key, _HF, _ExK, _EqK, _All>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _Val, class _Key, class _HF,
+ class _ExK, class _EqK, class _All>
+inline _Val*
+value_type(const _DBG_iter_base< _STLP_DBG_HT_SUPER >&) {
+ return (_Val*)0;
+}
+
+template <class _Val, class _Key, class _HF,
+ class _ExK, class _EqK, class _All>
+inline forward_iterator_tag
+iterator_category(const _DBG_iter_base< _STLP_DBG_HT_SUPER >&) {
+ return forward_iterator_tag();
+}
+# endif
+
+template <class _Val, class _Key, class _HF,
+ class _ExK, class _EqK, class _All>
+class _DBG_hashtable : public _STLP_DBG_HT_SUPER {
+ typedef _DBG_hashtable<_Val, _Key, _HF, _ExK, _EqK, _All> _Self;
+ typedef _STLP_DBG_HT_SUPER _Base;
+
+public:
+ typedef _Key key_type;
+ typedef _HF hasher;
+ typedef _EqK key_equal;
+
+ __IMPORT_CONTAINER_TYPEDEFS(_Base)
+
+public:
+ typedef _DBG_iter<_Base, _Nonconst_traits<value_type> > iterator;
+ typedef _DBG_iter<_Base, _Const_traits<value_type> > const_iterator;
+ typedef typename _Base::iterator _Base_iterator;
+ typedef typename _Base::const_iterator _Base_const_iterator;
+
+protected:
+ void _Invalidate_all() {_M_iter_list._Invalidate_all();}
+
+ void _Invalidate_iterator(const const_iterator& __it) {
+ __invalidate_iterator(&_M_iter_list,__it);
+ }
+ void _Invalidate_iterators(const const_iterator& __first, const const_iterator& __last) {
+ const_iterator __cur = __first;
+ while (__cur != __last) __invalidate_iterator(&_M_iter_list, __cur++);
+ }
+
+ const _Base* _Get_base() const { return (const _Base*)this; }
+ _Base* _Get_base() { return (_Base*)this; }
+
+public:
+ _DBG_hashtable(size_type __n,
+ const _HF& __hf,
+ const _EqK& __eql,
+ const _ExK& __ext,
+ const allocator_type& __a = allocator_type()):
+ _STLP_DBG_HT_SUPER(__n, __hf, __eql, __ext, __a),
+ _M_iter_list(_Get_base()) {}
+
+ _DBG_hashtable(size_type __n,
+ const _HF& __hf,
+ const _EqK& __eql,
+ const allocator_type& __a = allocator_type()):
+
+ _STLP_DBG_HT_SUPER(__n, __hf, __eql, __a),
+ _M_iter_list(_Get_base()) {}
+
+ _DBG_hashtable(const _Self& __ht):
+ _STLP_DBG_HT_SUPER(__ht),
+ _M_iter_list(_Get_base()) {}
+
+ _Self& operator= (const _Self& __ht) {
+ _Invalidate_all();
+ _Base::operator=(__ht);
+ return *this;
+ }
+
+ void swap(_Self& __ht)
+ {
+ _M_iter_list._Swap_owners(__ht._M_iter_list);
+ _Base::swap(__ht);
+ }
+
+ iterator begin() { return iterator(&_M_iter_list, _Base::begin()); }
+ iterator end() { return iterator(&_M_iter_list, _Base::end()); }
+
+ const_iterator begin() const { return const_iterator(&_M_iter_list, _Base::begin()); }
+ const_iterator end() const { return const_iterator(&_M_iter_list, _Base::end()); }
+
+ pair<iterator, bool> insert_unique(const value_type& __obj)
+ {
+ pair < _Base_iterator, bool> __res =
+ _Base::insert_unique(__obj);
+ return pair<iterator, bool> ( iterator(&_M_iter_list, __res.first), __res.second);
+ }
+
+ iterator insert_equal(const value_type& __obj) {
+ return iterator(&_M_iter_list, _Base::insert_equal(__obj));
+ }
+
+ pair<iterator, bool> insert_unique_noresize(const value_type& __obj) {
+ pair < _Base_iterator, bool> __res =
+ _Base::insert_unique_noresize(__obj);
+ return pair<iterator, bool> ( iterator(&_M_iter_list, __res.first), __res.second);
+ }
+
+ iterator insert_equal_noresize(const value_type& __obj) {
+ return iterator(&_M_iter_list, _Base::insert_equal_noresize(__obj));
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIterator>
+ void insert_unique(_InputIterator __f, _InputIterator __l) {
+ _Base::insert_unique(__f, __l);
+ }
+
+ template <class _InputIterator>
+ void insert_equal(_InputIterator __f, _InputIterator __l){
+ _Base::insert_equal(__f, __l);
+ }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ void insert_unique(const value_type* __f, const value_type* __l) {
+ _Base::insert_unique(__f, __l);
+ }
+
+ void insert_equal(const value_type* __f, const value_type* __l) {
+ _Base::insert_equal(__f, __l);
+ }
+
+ void insert_unique(const_iterator __f, const_iterator __l) {
+ _Base::insert_unique(__f._M_iterator, __l._M_iterator);
+ }
+
+ void insert_equal(const_iterator __f, const_iterator __l) {
+ _Base::insert_equal(__f._M_iterator, __l._M_iterator);
+ }
+#endif /*_STLP_MEMBER_TEMPLATES */
+
+ iterator find(const key_type& __key) {
+ return iterator(&_M_iter_list, _Base::find(__key));
+ }
+
+ const_iterator find(const key_type& __key) const {
+ return const_iterator(&_M_iter_list, _Base::find(__key));
+ }
+
+ pair<iterator, iterator>
+ equal_range(const key_type& __key) {
+ pair < _Base_iterator, _Base_iterator > __res =
+ _Base::equal_range(__key);
+ return pair<iterator,iterator> (iterator(&_M_iter_list,__res.first),
+ iterator(&_M_iter_list,__res.second));
+ }
+
+ pair<const_iterator, const_iterator>
+ equal_range(const key_type& __key) const {
+ pair < _Base_const_iterator, _Base_const_iterator > __res =
+ _Base::equal_range(__key);
+ return pair<const_iterator,const_iterator> (const_iterator(&_M_iter_list,__res.first),
+ const_iterator(&_M_iter_list,__res.second));
+ }
+
+ size_type erase(const key_type& __key) {
+ pair<const_iterator, const_iterator> __p = equal_range(__key);
+ size_type __n = distance(__p.first, __p.second);
+ _Invalidate_iterators(__p.first, __p.second);
+ _Base::erase(__p.first._M_iterator, __p.second._M_iterator);
+ return __n;
+ }
+
+ void erase(const const_iterator& __it) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __it))
+ _STLP_DEBUG_CHECK(_Dereferenceable(__it))
+ _Invalidate_iterator(__it);
+ _Base::erase(__it._M_iterator);
+ }
+ void erase(const_iterator __first, const_iterator __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __first)&&
+ __check_if_owner(&_M_iter_list, __last))
+ _Invalidate_iterators(__first, __last);
+ _Base::erase(__first._M_iterator, __last._M_iterator);
+ }
+ void resize(size_type __num_elements_hint) {
+ _Base::resize(__num_elements_hint);
+ }
+
+ void clear() {
+ _Invalidate_all();
+ _Base::clear();
+ }
+
+private:
+ __owned_list _M_iter_list;
+
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+#define _STLP_TEMPLATE_CONTAINER _DBG_hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+#define _STLP_TEMPLATE_CONTAINER_BASE hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+#include <stl/debug/_relops_hash_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER_BASE
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+# undef hashtable
+
+#endif /* _STLP_INTERNAL_HASHTABLE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
+
diff --git a/src/STLport/stl/debug/_iterator.h b/src/STLport/stl/debug/_iterator.h
new file mode 100644
index 0000000..2b96a2f
--- /dev/null
+++ b/src/STLport/stl/debug/_iterator.h
@@ -0,0 +1,394 @@
+/*
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_DBG_ITERATOR_H
+# define _STLP_DBG_ITERATOR_H
+
+# include <stl/_pair.h>
+# include <stl/_alloc.h>
+
+# define _STLP_DBG_ALLOCATOR_SELECT( _Tp ) _STLP_DEFAULT_ALLOCATOR_SELECT( _Tp )
+
+_STLP_BEGIN_NAMESPACE
+
+//============================================================
+
+template <class _Iterator>
+void _Decrement(_Iterator& __it, const bidirectional_iterator_tag &) {
+ --__it;
+}
+
+template <class _Iterator>
+void _Decrement(_Iterator& __it, const random_access_iterator_tag &) {
+ --__it;
+}
+
+template <class _Iterator>
+void _Decrement(_Iterator& __it, const forward_iterator_tag &) {
+ _STLP_ASSERT(0)
+}
+
+template <class _Iterator>
+void _Advance(_Iterator&, ptrdiff_t, const forward_iterator_tag &) {
+ _STLP_ASSERT(0)
+}
+
+template <class _Iterator>
+void _Advance(_Iterator& __it, ptrdiff_t, const bidirectional_iterator_tag &) {
+ _STLP_ASSERT(0)
+}
+
+template <class _Iterator>
+void _Advance(_Iterator& __it, ptrdiff_t __n, const random_access_iterator_tag &) {
+ __it += __n;
+}
+
+template <class _Iterator>
+ptrdiff_t _DBG_distance(const _Iterator& __x, const _Iterator& __y, const random_access_iterator_tag &) {
+ return __x - __y;
+}
+
+template <class _Iterator>
+ptrdiff_t _DBG_distance(const _Iterator&, const _Iterator&, const forward_iterator_tag &) {
+ _STLP_ASSERT(0)
+ return 0;
+}
+
+template <class _Iterator>
+ptrdiff_t _DBG_distance(const _Iterator&, const _Iterator&, const bidirectional_iterator_tag &) {
+ _STLP_ASSERT(0)
+ return 0;
+}
+
+template <class _Iterator>
+bool _CompareIt(const _Iterator&, const _Iterator&, const forward_iterator_tag &) {
+ _STLP_ASSERT(0)
+ return false;
+}
+
+template <class _Iterator>
+bool _CompareIt(const _Iterator&, const _Iterator&, const bidirectional_iterator_tag &) {
+ _STLP_ASSERT(0)
+ return false;
+}
+
+template <class _Iterator>
+bool _CompareIt(const _Iterator& __x, const _Iterator& __y, const random_access_iterator_tag &) {
+ return __x < __y;
+}
+
+
+template <class _Iterator>
+bool _Dereferenceable(_Iterator __it) {
+ return (__it._Get_container_ptr() !=0) && !(__it._M_iterator == (__it._Get_container_ptr())->end());
+}
+
+
+template <class _Iterator>
+bool _Incrementable(const _Iterator& __it, ptrdiff_t __n, const forward_iterator_tag &) {
+ return (__n == 1) && _Dereferenceable(__it);
+}
+
+template <class _Iterator>
+bool _Incrementable(const _Iterator& __it, ptrdiff_t __n, const bidirectional_iterator_tag &) {
+ typedef typename _Iterator::_Container_type __container_type;
+ __container_type* __c = __it._Get_container_ptr();
+ return (__c!=0) && ((__n == 1 && __it._M_iterator != __c->end() ) ||
+ (__n == -1 && __it._M_iterator != __c->begin()));
+}
+
+template <class _Iterator>
+bool _Incrementable(const _Iterator& __it, ptrdiff_t __n, const random_access_iterator_tag &) {
+ typedef typename _Iterator::_Container_type __container_type;
+ __container_type* __c = __it._Get_container_ptr();
+ if (!__c) return false;
+ ptrdiff_t __new_pos = (__it._M_iterator - __c->begin()) + __n;
+ return (__new_pos >=0) && (__STATIC_CAST(typename __container_type::size_type,__new_pos) <=__c->size());
+}
+
+
+template <class _Container>
+struct _DBG_iter_base : public __owned_link {
+public:
+ typedef typename _Container::value_type value_type;
+ typedef typename _Container::reference reference;
+ typedef typename _Container::pointer pointer;
+ typedef ptrdiff_t difference_type;
+ //private:
+ typedef typename _Container::iterator _Nonconst_iterator;
+ typedef typename _Container::const_iterator _Const_iterator;
+ typedef _Container _Container_type;
+
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+ typedef typename iterator_traits<_Const_iterator>::iterator_category _Iterator_category;
+# else
+ typedef typename _Container::_Iterator_category _Iterator_category;
+# endif
+ typedef _Iterator_category iterator_category;
+
+ _DBG_iter_base() : __owned_link(0) {}
+ _DBG_iter_base(const __owned_list* __c, const _Const_iterator& __it) :
+# ifdef __HP_aCC
+ __owned_link(__c), _M_iterator(*__REINTERPRET_CAST(const _Nonconst_iterator *, &__it)) {}
+# else
+ __owned_link(__c), _M_iterator(*(const _Nonconst_iterator*)&__it) {}
+# endif
+ _Container* _Get_container_ptr() const {
+ return (_Container*)__stl_debugger::_Get_container_ptr(this);
+ }
+
+ void __increment() {
+ _STLP_DEBUG_CHECK(_Incrementable(*this,1,_Iterator_category()))
+ ++_M_iterator;
+ }
+
+ void __decrement() {
+ _STLP_DEBUG_CHECK(_Incrementable(*this,-1,_Iterator_category()))
+ _Decrement(_M_iterator, _Iterator_category());
+ }
+
+ void __advance(difference_type __n) {
+ _STLP_DEBUG_CHECK(_Incrementable(*this,__n, _Iterator_category()))
+ _Advance(_M_iterator,__n, _Iterator_category());
+ }
+
+// protected:
+ _Nonconst_iterator _M_iterator;
+};
+
+template <class _Container>
+ptrdiff_t operator-(const _DBG_iter_base<_Container>& __x,
+ const _DBG_iter_base<_Container>& __y ) {
+ typedef typename _DBG_iter_base<_Container>::_Iterator_category _Iterator_category;
+ _STLP_DEBUG_CHECK(__check_same_owner(__x, __y))
+ return _DBG_distance(__x._M_iterator,__y._M_iterator, _Iterator_category());
+}
+
+template <class _Container, class _Traits>
+struct _DBG_iter_mid : public _DBG_iter_base<_Container>
+{
+ typedef _DBG_iter_mid<_Container, typename _Traits::_Non_const_traits> _Nonconst_self;
+ typedef typename _Container::iterator _Nonconst_iterator;
+ typedef typename _Container::const_iterator _Const_iterator;
+
+ _DBG_iter_mid() {}
+
+ explicit _DBG_iter_mid(const _Nonconst_self& __it) :
+ _DBG_iter_base<_Container>(__it) {}
+
+ _DBG_iter_mid(const __owned_list* __c, const _Const_iterator& __it) :
+ _DBG_iter_base<_Container>(__c, __it) {}
+};
+
+template <class _Container, class _Traits>
+struct _DBG_iter : public _DBG_iter_mid<_Container, _Traits> {
+ typedef _DBG_iter_base<_Container> _Base;
+public:
+ typedef typename _Base::value_type value_type;
+ typedef typename _Base::difference_type difference_type;
+ typedef typename _Traits::reference reference;
+ typedef typename _Traits::pointer pointer;
+
+private:
+ typedef typename _Base::_Nonconst_iterator _Nonconst_iterator;
+ typedef typename _Base::_Const_iterator _Const_iterator;
+
+ typedef _DBG_iter<_Container, _Traits> _Self;
+ typedef _DBG_iter_mid<_Container, typename _Traits::_Non_const_traits> _Nonconst_mid;
+
+public:
+
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+ typedef typename _Base::iterator_category iterator_category;
+# endif
+ typedef typename _Base::_Iterator_category _Iterator_category;
+
+public:
+ _DBG_iter() {}
+ // boris : real type of iter would be nice
+ _DBG_iter(const __owned_list* __c, const _Const_iterator& __it) :
+ _DBG_iter_mid<_Container, _Traits>(__c, __it) {}
+
+ // This allows conversions from iterator to const_iterator without being
+ // redundant with the copy constructor below.
+ _DBG_iter(const _Nonconst_mid& __rhs) :
+ _DBG_iter_mid<_Container, _Traits>(__rhs) {}
+
+ _DBG_iter(const _Self& __rhs) :
+ _DBG_iter_mid<_Container, _Traits>(__rhs) {}
+
+ // This allows conversions from iterator to const_iterator without being
+ // redundant with the copy assignment operator below.
+ _Self& operator=(const _Nonconst_mid& __rhs)
+ {
+ (_Base&)*this = __rhs;
+ return *this;
+ }
+
+ _Self& operator=(const _Self& __rhs)
+ {
+ (_Base&)*this = __rhs;
+ return *this;
+ }
+
+ reference operator*() const {
+ _STLP_DEBUG_CHECK(_Dereferenceable(*this))
+ return *this->_M_iterator;
+ }
+
+ _STLP_DEFINE_ARROW_OPERATOR
+
+ _Self& operator++() {
+ this->__increment();
+ return *this;
+ }
+ _Self operator++(int) {
+ _Self __tmp = *this;
+ this->__increment();
+ return __tmp;
+ }
+ _Self& operator--() {
+ this->__decrement();
+ return *this;
+ }
+ _Self operator--(int) {
+ _Self __tmp = *this;
+ this->__decrement();
+ return __tmp;
+ }
+
+ _Self& operator+=(difference_type __n) {
+ this->__advance(__n);
+ return *this;
+ }
+
+ _Self& operator-=(difference_type __n) {
+ this->__advance(-__n);
+ return *this;
+ }
+ _Self operator+(difference_type __n) const {
+ _Self __tmp(*this);
+ __tmp.__advance(__n);
+ return __tmp;
+ }
+ _Self operator-(difference_type __n) const {
+ _Self __tmp(*this);
+ __tmp.__advance(-__n);
+ return __tmp;
+ }
+ reference operator[](difference_type __n) const { return *(*this + __n); }
+};
+
+template <class _Container>
+inline bool
+operator==(const _DBG_iter_base<_Container>& __x, const _DBG_iter_base<_Container>& __y) {
+ _STLP_DEBUG_CHECK(__check_same_owner_or_null(__x, __y))
+ return __x._M_iterator==__y._M_iterator;
+}
+
+template <class _Container>
+inline bool
+operator<(const _DBG_iter_base<_Container>& __x, const _DBG_iter_base<_Container>& __y) {
+ _STLP_DEBUG_CHECK(__check_same_owner_or_null(__x, __y))
+ typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
+ return _CompareIt(__x._M_iterator , __y._M_iterator, _Category());
+}
+
+template <class _Container>
+inline bool
+operator>(const _DBG_iter_base<_Container>& __x,
+ const _DBG_iter_base<_Container>& __y) {
+ typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
+ return _CompareIt(__y._M_iterator , __x._M_iterator, _Category());
+}
+
+template <class _Container>
+inline bool
+operator>=(const _DBG_iter_base<_Container>& __x, const _DBG_iter_base<_Container>& __y) {
+ _STLP_DEBUG_CHECK(__check_same_owner_or_null(__x, __y))
+ typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
+ return !_CompareIt(__x._M_iterator , __y._M_iterator, _Category());
+}
+
+template <class _Container>
+inline bool
+operator<=(const _DBG_iter_base<_Container>& __x,
+ const _DBG_iter_base<_Container>& __y) {
+ typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
+ return !_CompareIt(__y._M_iterator , __x._M_iterator, _Category());
+}
+
+template <class _Container>
+inline bool
+operator!=(const _DBG_iter_base<_Container>& __x,
+ const _DBG_iter_base<_Container>& __y) {
+ _STLP_DEBUG_CHECK(__check_same_owner_or_null(__x, __y))
+ return __x._M_iterator != __y._M_iterator;
+}
+
+//------------------------------------------
+
+template <class _Container, class _Traits>
+inline _DBG_iter<_Container, _Traits>
+operator+(ptrdiff_t __n, const _DBG_iter<_Container, _Traits>& __it) {
+ _DBG_iter<_Container, _Traits> __tmp(__it);
+ return __tmp += __n;
+}
+
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+# if defined (_STLP_NESTED_TYPE_PARAM_BUG) \
+ || ( defined (__SUNPRO_CC) && __SUNPRO_CC < 0x600) \
+ || ( defined (_STLP_MSVC) && (_STLP_MSVC < 1100) )
+# define _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS 1
+# endif
+
+template <class _Container>
+inline ptrdiff_t*
+distance_type(const _DBG_iter_base<_Container>&) { return (ptrdiff_t*) 0; }
+
+# if !defined (_STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS)
+template <class _Container>
+inline _STLP_TYPENAME_ON_RETURN_TYPE _DBG_iter_base<_Container>::value_type*
+value_type(const _DBG_iter_base<_Container>&) {
+ typedef typename _DBG_iter_base<_Container>::value_type _Val;
+ return (_Val*)0;
+}
+
+template <class _Container>
+inline _STLP_TYPENAME_ON_RETURN_TYPE _DBG_iter_base<_Container>::_Iterator_category
+iterator_category(const _DBG_iter_base<_Container>&) {
+ typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
+ return _Category();
+}
+# endif
+
+# endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */
+
+# define _Get_iter(__x) __x
+# define _Debug_iter(__x, __y) __y
+
+_STLP_END_NAMESPACE
+
+#endif /* INTERNAL_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/debug/_list.h b/src/STLport/stl/debug/_list.h
new file mode 100644
index 0000000..de35cdc
--- /dev/null
+++ b/src/STLport/stl/debug/_list.h
@@ -0,0 +1,318 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DBG_LIST_H
+#define _STLP_INTERNAL_DBG_LIST_H
+
+#include <stl/debug/_iterator.h>
+
+# ifndef _STLP_USE_WRAPPER_FOR_ALLOC_PARAM
+# undef _DBG_list
+# define _DBG_list list
+# endif
+
+# define _STLP_DBG_LIST_BASE \
+__WORKAROUND_DBG_RENAME(list) <_Tp, _Alloc>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _Tp, class _Alloc>
+inline _Tp*
+value_type(const _DBG_iter_base< _STLP_DBG_LIST_BASE >&) {
+ return (_Tp*)0;
+}
+template <class _Tp, class _Alloc>
+inline bidirectional_iterator_tag
+iterator_category(const _DBG_iter_base< _STLP_DBG_LIST_BASE >&) {
+ return bidirectional_iterator_tag();
+}
+# endif
+
+template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
+class _DBG_list : public _STLP_DBG_LIST_BASE {
+
+ typedef _STLP_DBG_LIST_BASE _Base;
+ typedef _DBG_list<_Tp, _Alloc> _Self;
+
+public:
+ __IMPORT_CONTAINER_TYPEDEFS(_Base)
+
+public:
+ typedef _DBG_iter<_Base, _Nonconst_traits<value_type> > iterator;
+ typedef _DBG_iter<_Base, _Const_traits<value_type> > const_iterator;
+
+ _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;
+
+protected:
+ mutable __owned_list _M_iter_list;
+ void _Invalidate_all() { _M_iter_list._Invalidate_all();}
+
+public:
+ const _Base* _Get_base() const { return (const _Base*)this; }
+ _Base* _Get_base() { return (_Base*)this; }
+ explicit _DBG_list(const allocator_type& __a = allocator_type()) :
+ _STLP_DBG_LIST_BASE(__a), _M_iter_list(_Get_base()) {}
+ _DBG_list(size_type __n, const _Tp& __value,
+ const allocator_type& __a = allocator_type())
+ : _STLP_DBG_LIST_BASE(__n, __value, __a), _M_iter_list(_Get_base()) {}
+ explicit _DBG_list(size_type __n)
+ : _STLP_DBG_LIST_BASE(__n), _M_iter_list(_Get_base()) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ // We don't need any dispatching tricks here, because insert does all of
+ // that anyway.
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ _DBG_list(_InputIterator __first, _InputIterator __last)
+ : _STLP_DBG_LIST_BASE(__first, __last, allocator_type()), _M_iter_list(_Get_base()) {}
+# endif
+ template <class _InputIterator>
+ _DBG_list(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+ : _STLP_DBG_LIST_BASE(__first, __last, __a), _M_iter_list(_Get_base()) {}
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ _DBG_list(const _Tp* __first, const _Tp* __last,
+ const allocator_type& __a = allocator_type())
+ : _STLP_DBG_LIST_BASE(__first, __last, __a), _M_iter_list(_Get_base()) {}
+ _DBG_list(const_iterator __first, const_iterator __last,
+ const allocator_type& __a = allocator_type()):
+ _STLP_DBG_LIST_BASE(__first._M_iterator, __last._M_iterator, __a),
+ _M_iter_list(_Get_base()) {}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ _DBG_list(const _Self& __x) :
+ _STLP_DBG_LIST_BASE(__x) , _M_iter_list(_Get_base()) {}
+
+ _Self& operator=(const _Self& __x) {
+ _Invalidate_all();
+ _Base::operator=((const _Base&)__x);
+ return *this;
+ }
+
+public:
+ iterator begin() { return iterator(&_M_iter_list, _Base::begin()); }
+ const_iterator begin() const { return const_iterator(&_M_iter_list, _Base::begin()); }
+
+ iterator end() { return iterator(&_M_iter_list, _Base::end()); }
+ const_iterator end() const { return const_iterator(&_M_iter_list, _Base::end()); }
+
+ reverse_iterator rbegin() { return reverse_iterator(end()); }
+ reverse_iterator rend() { return reverse_iterator(begin()); }
+
+ const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
+ const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
+
+ // those are here to enforce checking
+ reference front() { return *begin(); }
+ const_reference front() const { return *begin(); }
+ reference back() { return *(--end()); }
+ const_reference back() const { return *(--end()); }
+
+ void swap(_Self& __x) {
+ _M_iter_list._Swap_owners(__x._M_iter_list);
+ _Base::swap(__x);
+ }
+
+ iterator insert(iterator __position, const _Tp& __x) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+ return iterator(&_M_iter_list,_Base::insert(__position._M_iterator, __x) );
+ }
+
+# ifndef _STLP_NO_ANACHRONISMS
+ iterator insert(iterator __position) { return insert(__position, _Tp()); }
+# endif
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _InputIterator>
+ void insert(iterator __position, _InputIterator __first, _InputIterator __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+ _Base::insert(__position._M_iterator, __first, __last);
+ }
+
+#else
+
+ void insert(iterator __position, const _Tp* __first, const _Tp* __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+ _Base::insert(__position._M_iterator, __first, __last);
+ }
+
+ void insert(iterator __position,
+ const_iterator __first, const_iterator __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+ _Base::insert(__position._M_iterator, __first._M_iterator, __last._M_iterator);
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ void insert(iterator __position, size_type __n, const _Tp& __x) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+ _Base::insert(__position._M_iterator, __n, __x);
+ }
+
+ void pop_back() {
+ _STLP_VERBOSE_ASSERT(!this->empty(), _StlMsg_EMPTY_CONTAINER)
+ __invalidate_iterator(&_M_iter_list,end());
+ _Base::pop_back();
+ }
+
+ void pop_front() {
+ _STLP_VERBOSE_ASSERT(!this->empty(), _StlMsg_EMPTY_CONTAINER)
+ __invalidate_iterator(&_M_iter_list,begin());
+ _Base::pop_front();
+ }
+
+ iterator erase(iterator __position) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+ _STLP_VERBOSE_ASSERT(__position._M_iterator._M_node!=this->_M_node._M_data,
+ _StlMsg_ERASE_PAST_THE_END)
+ // fbp : CHECK !!!
+ __invalidate_iterator(&_M_iter_list, __position);
+ return iterator(&_M_iter_list,_Base::erase(__position._M_iterator));
+ }
+ iterator erase(iterator __first, iterator __last) {
+ while (__first != __last)
+ erase(__first++);
+ return __last;
+ }
+
+ void resize(size_type __new_size, const _Tp& __x) {
+ typename _Base::iterator __i = _Base::begin();
+ size_type __len = 0;
+ for ( ; __i != _Base::end() && __len < __new_size; ++__i, ++__len);
+
+ if (__len == __new_size)
+ erase(iterator(&_M_iter_list,__i), end());
+ else // __i == end()
+ _Base::insert(_Base::end(), __new_size - __len, __x);
+ }
+
+ void resize(size_type __new_size) { this->resize(__new_size, _Tp()); }
+
+ void remove(const _Tp& __value) {
+ typename _Base::iterator __first = _Base::begin();
+ typename _Base::iterator __last = _Base::end();
+ while (__first != __last) {
+ typename _Base::iterator __next = __first;
+ ++__next;
+ if (__value == *__first) erase(iterator(&_M_iter_list,__first));
+ __first = __next;
+ }
+ }
+
+ void clear() {
+ _Invalidate_all();
+ _Base::clear();
+ }
+
+public:
+ void splice(iterator __position, _Self& __x) {
+ _STLP_VERBOSE_ASSERT(&__x!=this, _StlMsg_INVALID_ARGUMENT)
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+ _Base::splice(__position._M_iterator, __x);
+ __x._Invalidate_all();
+ }
+
+ void splice(iterator __position, _Self& __x, iterator __i) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position) &&
+ __check_if_owner(&__x._M_iter_list ,__i))
+ _STLP_DEBUG_CHECK(_Dereferenceable(__i))
+ // fbp : CHECK !!!
+ // __invalidate_iterator(&__x._M_iter_list, __i);
+ _Base::splice(__position._M_iterator, __x, __i._M_iterator);
+ }
+
+ void splice(iterator __position, _Self& __x, iterator __first, iterator __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ _STLP_VERBOSE_ASSERT(__first._Owner()==&__x._M_iter_list && __last._Owner()==&__x._M_iter_list,
+ _StlMsg_NOT_OWNER)
+ _Base::splice(__position._M_iterator, __x, __first._M_iterator, __last._M_iterator);
+ }
+
+ void merge(_Self& __x) {
+ __x._Invalidate_all();
+ _Base::merge(__x);
+ }
+ void reverse() {
+ _Invalidate_all();
+ _Base::reverse();
+ }
+ void unique() {
+ _Invalidate_all();
+ _Base::unique();
+ }
+ void sort() {
+ _Invalidate_all();
+ _Base::sort();
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _Predicate> void remove_if(_Predicate __pred) {
+ _Base::remove_if(__pred);
+ }
+ template <class _BinaryPredicate>
+ void unique(_BinaryPredicate __binary_pred) {
+ _Base::unique(__binary_pred);
+ }
+ template <class _StrictWeakOrdering>
+ void merge(_Self& __x,
+ _StrictWeakOrdering __comp) {
+ __x._Invalidate_all();
+ _Base::merge(__x, __comp);
+ }
+
+ template <class _StrictWeakOrdering>
+ void sort(_StrictWeakOrdering __comp) {
+ _Invalidate_all();
+ _Base::sort(__comp);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER _DBG_list<_Tp,_Alloc>
+#define _STLP_TEMPLATE_CONTAINER_BASE _STLP_DBG_LIST_BASE
+#include <stl/debug/_relops_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER_BASE
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_LIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/debug/_relops_cont.h b/src/STLport/stl/debug/_relops_cont.h
new file mode 100644
index 0000000..c800404
--- /dev/null
+++ b/src/STLport/stl/debug/_relops_cont.h
@@ -0,0 +1,41 @@
+// This is an implementation file which
+// is intended to be included multiple times with different _STLP_ASSOCIATIVE_CONTAINER
+// setting
+
+#ifdef _STLP_EXTRA_OPERATORS_FOR_DEBUG
+
+_STLP_TEMPLATE_HEADER
+inline bool _STLP_CALL
+operator==(const _STLP_TEMPLATE_CONTAINER& __x, const _STLP_TEMPLATE_CONTAINER& __y)
+{
+ return (const _STLP_TEMPLATE_CONTAINER_BASE&)__x == (const _STLP_TEMPLATE_CONTAINER_BASE&)__y;
+}
+
+_STLP_TEMPLATE_HEADER
+inline bool _STLP_CALL
+operator<(const _STLP_TEMPLATE_CONTAINER& __x, const _STLP_TEMPLATE_CONTAINER& __y)
+{
+ return (const _STLP_TEMPLATE_CONTAINER_BASE&)__x < (const _STLP_TEMPLATE_CONTAINER_BASE&)__y;
+}
+
+_STLP_RELOPS_OPERATORS( _STLP_TEMPLATE_HEADER , _STLP_TEMPLATE_CONTAINER )
+
+#endif /* _STLP_EXTRA_OPERATORS_FOR_DEBUG */
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+_STLP_TEMPLATE_HEADER
+inline void _STLP_CALL swap(_STLP_TEMPLATE_CONTAINER& __x, _STLP_TEMPLATE_CONTAINER& __y)
+{
+ __x.swap(__y);
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+#if 0 /* def _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+_STLP_TEMPLATE_HEADER
+struct __type_traits<_STLP_STD::_STLP_TEMPLATE_CONTAINER > : __type_traits_aux<0, 1>
+{};
+
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
diff --git a/src/STLport/stl/debug/_relops_hash_cont.h b/src/STLport/stl/debug/_relops_hash_cont.h
new file mode 100644
index 0000000..6e94167
--- /dev/null
+++ b/src/STLport/stl/debug/_relops_hash_cont.h
@@ -0,0 +1,34 @@
+// This is an implementation file which
+// is intended to be included multiple times with different _STLP_ASSOCIATIVE_CONTAINER
+// setting
+
+#ifdef _STLP_EXTRA_OPERATORS_FOR_DEBUG
+_STLP_TEMPLATE_HEADER
+inline bool _STLP_CALL
+operator==(const _STLP_TEMPLATE_CONTAINER& __hm1, const _STLP_TEMPLATE_CONTAINER& __hm2)
+{
+ return _STLP_TEMPLATE_CONTAINER_BASE::_M_equal(__hm1, __hm2);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+_STLP_TEMPLATE_HEADER
+inline bool _STLP_CALL
+operator!=(const _STLP_TEMPLATE_CONTAINER& __hm1, const _STLP_TEMPLATE_CONTAINER& __hm2) {
+ return !(__hm1 == __hm2);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+#endif /* _STLP_EXTRA_OPERATORS_FOR_DEBUG */
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+_STLP_TEMPLATE_HEADER
+inline void _STLP_CALL
+swap(_STLP_TEMPLATE_CONTAINER& __hm1, _STLP_TEMPLATE_CONTAINER& __hm2)
+{
+ __hm1.swap(__hm2);
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
diff --git a/src/STLport/stl/debug/_slist.h b/src/STLport/stl/debug/_slist.h
new file mode 100644
index 0000000..ec22394
--- /dev/null
+++ b/src/STLport/stl/debug/_slist.h
@@ -0,0 +1,399 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DBG_SLIST_H
+#define _STLP_INTERNAL_DBG_SLIST_H
+
+#include <stl/debug/_iterator.h>
+
+# ifndef _STLP_USE_WRAPPER_FOR_ALLOC_PARAM
+# undef _DBG_slist
+# define _DBG_slist slist
+# endif
+
+# define _STLP_DBG_SLIST_BASE __WORKAROUND_DBG_RENAME(slist) <_Tp, _Alloc>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _Tp, class _Alloc>
+inline _Tp*
+value_type(const _DBG_iter_base< _STLP_DBG_SLIST_BASE >&) {
+ return (_Tp*)0;
+}
+
+template <class _Tp, class _Alloc>
+inline forward_iterator_tag
+iterator_category(const _DBG_iter_base< _STLP_DBG_SLIST_BASE >&) {
+ return forward_iterator_tag();
+}
+# endif
+
+template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
+class _DBG_slist : public _STLP_DBG_SLIST_BASE
+{
+private:
+ typedef _STLP_DBG_SLIST_BASE _Base;
+ typedef _DBG_slist<_Tp,_Alloc> _Self;
+
+public:
+
+ __IMPORT_CONTAINER_TYPEDEFS(_Base)
+
+ typedef _DBG_iter<_Base, _Nonconst_traits<value_type> > iterator;
+ typedef _DBG_iter<_Base, _Const_traits<value_type> > const_iterator;
+
+protected:
+ friend class __owned_link;
+ mutable __owned_list _M_iter_list;
+ void _Invalidate_all() { _M_iter_list._Invalidate_all();}
+ void _Invalidate_iterator(const iterator& __it) {__invalidate_iterator(&_M_iter_list, __it); }
+
+public:
+ const _Base* _Get_base() const { return (const _Base*)this; }
+ _Base* _Get_base() { return (_Base*)this; }
+
+public:
+
+ explicit _DBG_slist(const allocator_type& __a = allocator_type()) :
+ _STLP_DBG_SLIST_BASE(__a) , _M_iter_list(_Get_base()) {}
+
+ _DBG_slist(size_type __n, const value_type& __x,
+ const allocator_type& __a = allocator_type()) :
+ _STLP_DBG_SLIST_BASE(__n, __x, __a), _M_iter_list(_Get_base()) {}
+
+ explicit _DBG_slist(size_type __n) : _STLP_DBG_SLIST_BASE(__n) , _M_iter_list(_Get_base()) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ // We don't need any dispatching tricks here, because _M_insert_after_range
+ // already does them.
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ _DBG_slist(_InputIterator __first, _InputIterator __last) :
+ _STLP_DBG_SLIST_BASE(__first, __last, allocator_type()), _M_iter_list(_Get_base()) {}
+# endif
+ template <class _InputIterator>
+ _DBG_slist(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) :
+ _STLP_DBG_SLIST_BASE(__first, __last, __a), _M_iter_list(_Get_base()) {}
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ _DBG_slist(const_iterator __first, const_iterator __last,
+ const allocator_type& __a = allocator_type() ) :
+ _STLP_DBG_SLIST_BASE(__first._M_iterator, __last._M_iterator, __a),
+ _M_iter_list(_Get_base()) {}
+
+ _DBG_slist(const value_type* __first, const value_type* __last,
+ const allocator_type& __a = allocator_type()) :
+ _STLP_DBG_SLIST_BASE(__first, __last, __a), _M_iter_list(_Get_base()) {}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ _DBG_slist(const _Self& __x) : _STLP_DBG_SLIST_BASE(__x), _M_iter_list(_Get_base()) {}
+
+ _Self& operator= (const _Self& __x) {
+ _Invalidate_all();
+ (_Base&)*this = (const _Base&)__x;
+ return *this;
+ }
+
+ ~_DBG_slist() {}
+
+public:
+ void assign(size_type __n, const _Tp& __val) {
+ // fbp :check invalidation here !
+ _Base::assign(__n, __val);
+ }
+
+public:
+
+ iterator before_begin() { return iterator(&_M_iter_list, _Base::before_begin()); }
+ const_iterator before_begin() const
+ { return const_iterator(&_M_iter_list, _Base::before_begin()); }
+
+ iterator begin() { return iterator(&_M_iter_list, _Base::begin()); }
+ const_iterator begin() const
+ { return const_iterator(&_M_iter_list,_Base::begin());}
+
+ iterator end() { return iterator(&_M_iter_list, _Base::end()); }
+ const_iterator end() const { return const_iterator(&_M_iter_list, _Base::end()); }
+
+ void swap(_Self& __x) {
+ _M_iter_list._Swap_owners(__x._M_iter_list);
+ _Base::swap(__x);
+ }
+
+public:
+ // fbp : checks here !
+ reference front() {
+ _STLP_VERBOSE_ASSERT(!this->empty(), _StlMsg_EMPTY_CONTAINER)
+ return _Base::front();
+ }
+ const_reference front() const {
+ _STLP_VERBOSE_ASSERT(!this->empty(), _StlMsg_EMPTY_CONTAINER)
+ return _Base::front();
+ }
+ void pop_front() {
+ _STLP_VERBOSE_ASSERT(!this->empty(), _StlMsg_EMPTY_CONTAINER)
+ _Base::pop_front();
+ }
+ iterator previous(const_iterator __pos) {
+ return iterator(&_M_iter_list,_Base::previous(__pos._M_iterator));
+ }
+ const_iterator previous(const_iterator __pos) const {
+ return const_iterator(&_M_iter_list,_Base::previous(__pos._M_iterator));
+ }
+
+public:
+
+ iterator insert_after(iterator __pos, const value_type& __x) {
+ return iterator(&_M_iter_list,_Base::insert_after(__pos._M_iterator, __x));
+ }
+
+ iterator insert_after(iterator __pos) {
+ return iterator(&_M_iter_list,_Base::insert_after(__pos._M_iterator));
+ }
+
+ void insert_after(iterator __pos, size_type __n, const value_type& __x) {
+ _Base::insert_after(__pos._M_iterator, __n, __x);
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _InputIterator>
+ void assign(_InputIterator __first, _InputIterator __last) {
+ // fbp :check invalidation here !
+ _Base::assign(__first, __last);
+ }
+
+ // We don't need any dispatching tricks here, because _M_insert_after_range
+ // already does them.
+ template <class _InIter>
+ void insert_after(iterator __pos, _InIter __first, _InIter __last) {
+ _Base::insert_after(__pos._M_iterator, __first, __last);
+ }
+
+ // We don't need any dispatching tricks here, because _M_insert_after_range
+ // already does them.
+ template <class _InIter>
+ void insert(iterator __pos, _InIter __first, _InIter __last) {
+ _Base::insert(__pos._M_iterator, __first, __last);
+
+ }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ void insert_after(iterator __pos,
+ const_iterator __first, const_iterator __last) {
+ _Base::insert_after(__pos._M_iterator, __first._M_iterator, __last._M_iterator);
+ }
+ void insert_after(iterator __pos,
+ const value_type* __first, const value_type* __last) {
+ _Base::insert_after(__pos._M_iterator, __first, __last);
+ }
+
+ void insert(iterator __pos, const_iterator __first, const_iterator __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+ _Base::insert(__pos._M_iterator, __first._M_iterator, __last._M_iterator);
+ }
+ void insert(iterator __pos, const value_type* __first,
+ const value_type* __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+ _Base::insert(__pos._M_iterator, __first, __last);
+ }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ iterator insert(iterator __pos, const value_type& __x) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+ return iterator(&_M_iter_list, _Base::insert(__pos._M_iterator, __x));
+ }
+
+ iterator insert(iterator __pos) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+ return iterator(&_M_iter_list, _Base::insert(__pos._M_iterator));
+ }
+
+ void insert(iterator __pos, size_type __n, const value_type& __x) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+ _Base::insert(__pos._M_iterator, __n, __x);
+ }
+
+public:
+ iterator erase_after(iterator __pos) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+ return iterator(&_M_iter_list, _Base::erase_after(__pos._M_iterator));
+ }
+ iterator erase_after(iterator __before_first, iterator __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__before_first))
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__last))
+ return iterator(&_M_iter_list,
+ _Base::erase_after(__before_first._M_iterator, __last._M_iterator));
+ }
+
+ iterator erase(iterator __pos) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+ return iterator(&_M_iter_list, _Base::erase(__pos._M_iterator));
+ }
+ iterator erase(iterator __first, iterator __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__first))
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__last))
+ return iterator(&_M_iter_list,
+ _Base::erase(__first._M_iterator, __last._M_iterator));
+ }
+
+ void resize(size_type __new_size, const _Tp& __x) {
+ _Base::resize(__new_size, __x);
+ }
+ void resize(size_type new_size) { resize(new_size, _Tp()); }
+
+ void clear() {
+ _Invalidate_all();
+ _Base::clear();
+ }
+
+public:
+ // Moves the range [__before_first + 1, __before_last + 1) to *this,
+ // inserting it immediately after __pos. This is constant time.
+ void splice_after(iterator __pos,
+ iterator __before_first, iterator __before_last)
+ {
+ if (__before_first != __before_last) {
+ _Base::splice_after(__pos._M_iterator,
+ __before_first._M_iterator, __before_last._M_iterator);
+ __before_first++;
+ __before_last++;
+ __invalidate_range(__before_first._Owner(),
+ __before_first, __before_last);
+ }
+ }
+
+ // Moves the element that follows __prev to *this, inserting it immediately
+ // after __pos. This is constant time.
+ void splice_after(iterator __pos, iterator __prev)
+ {
+ _Base::splice_after(__pos._M_iterator, __prev._M_iterator);
+ __invalidate_iterator(__prev._Owner(), ++__prev);
+ }
+
+ // Removes all of the elements from the list __x to *this, inserting
+ // them immediately after __pos. __x must not be *this. Complexity:
+ // linear in __x.size().
+ void splice_after(iterator __pos, _Self& __x)
+ {
+ _Base::splice_after(__pos._M_iterator, (_Base&)__x);
+ __x._Invalidate_all();
+ }
+
+ // Linear in distance(begin(), __pos), and linear in __x.size().
+ void splice(iterator __pos, _Self& __x) {
+ _STLP_VERBOSE_ASSERT(!(&__x==this), _StlMsg_INVALID_ARGUMENT)
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+ _Base::splice(__pos._M_iterator, (_Base&)__x);
+ __x._Invalidate_all();
+ }
+
+ // Linear in distance(begin(), __pos), and in distance(__x.begin(), __i).
+ void splice(iterator __pos, _Self& __x, iterator __i) {
+ _STLP_VERBOSE_ASSERT(&__x!=this, _StlMsg_INVALID_ARGUMENT)
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos) &&
+ __check_if_owner(&__x._M_iter_list ,__i))
+ _Base::splice(__pos._M_iterator, (_Base&)__x, __i._M_iterator);
+ __x._Invalidate_iterator(__i);
+ }
+
+ // Linear in distance(begin(), __pos), in distance(__x.begin(), __first),
+ // and in distance(__first, __last).
+ void splice(iterator __pos, _Self& __x, iterator __first, iterator __last)
+ {
+ _STLP_VERBOSE_ASSERT(&__x!=this, _StlMsg_INVALID_ARGUMENT)
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+ if (__first != __last)
+ _Base::splice(__pos._M_iterator, (_Base&)__x, __first._M_iterator, __last._M_iterator);
+ __invalidate_range(&__x._M_iter_list, __first, __last);
+ }
+
+public:
+
+ void remove(const _Tp& __val) {
+ _Base::remove(__val);
+ // __x._Invalidate_all();
+ }
+ void unique() {
+ _Base::unique();
+ }
+ void merge(_Self& __x) {
+ _Base::merge((_Base&)__x);
+ __x._Invalidate_all();
+ }
+ void sort() {
+ _Invalidate_all();
+ _Base::sort();
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ template <class _Predicate>
+ void remove_if(_Predicate __pred) {
+ _Base::remove_if(__pred);
+ }
+
+ template <class _BinaryPredicate>
+ void unique(_BinaryPredicate __pred) {
+ _Base::unique(__pred);
+ }
+
+ template <class _StrictWeakOrdering>
+ void merge(_Self& __x, _StrictWeakOrdering __ord) {
+ _Base::merge((_Base&)__x, __ord);
+ __x._Invalidate_all();
+ }
+
+ template <class _StrictWeakOrdering>
+ void sort(_StrictWeakOrdering __comp) {
+ _Invalidate_all();
+ _Base::sort(__comp);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER _DBG_slist<_Tp,_Alloc>
+#define _STLP_TEMPLATE_CONTAINER_BASE _STLP_DBG_SLIST_BASE
+#include <stl/debug/_relops_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER_BASE
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_DBG_SLIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/debug/_string.h b/src/STLport/stl/debug/_string.h
new file mode 100644
index 0000000..2ea29e1
--- /dev/null
+++ b/src/STLport/stl/debug/_string.h
@@ -0,0 +1,772 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_DBG_STRING_H
+#define _STLP_DBG_STRING_H
+
+#include <stl/debug/_iterator.h>
+
+# define _STLP_DBG_STRING_BASE _Nondebug_string <_CharT, _Traits, _Alloc>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _CharT,class _Traits, class _Alloc>
+inline _CharT*
+value_type(const _DBG_iter_base< _STLP_DBG_STRING_BASE >&) {
+return (_CharT*)0;
+}
+template <class _CharT, class _Traits, class _Alloc>
+inline random_access_iterator_tag
+iterator_category(const _DBG_iter_base< _STLP_DBG_STRING_BASE >&) {
+ return random_access_iterator_tag();
+}
+# endif
+
+template <class _CharT, class _Traits, class _Alloc>
+class basic_string : public _STLP_DBG_STRING_BASE {
+private:
+ typedef _STLP_DBG_STRING_BASE _Base;
+ typedef basic_string<_CharT, _Traits, _Alloc> _Self;
+protected:
+ mutable __owned_list _M_iter_list;
+public:
+ __IMPORT_CONTAINER_TYPEDEFS(_Base)
+ typedef _DBG_iter<_Base, _Nonconst_traits<value_type> > iterator;
+ typedef _DBG_iter<_Base, _Const_traits<value_type> > const_iterator;
+ _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+# ifdef _STLP_USE_NATIVE_STRING
+ // this typedef is being used for conversions
+ typedef _STLP_VENDOR_STD::basic_string<_CharT,_Traits,
+ _STLP_VENDOR_STD::allocator<_CharT> > __std_string;
+# endif
+public: // Constructor, destructor, assignment.
+ typedef typename _Base::_Reserve_t _Reserve_t;
+
+ const _Base* _Get_base() const { return (const _Base*)this; }
+ _Base* _Get_base() { return (_Base*)this; }
+
+ basic_string() :_STLP_DBG_STRING_BASE(), _M_iter_list(_Get_base()) {}
+
+ explicit basic_string(const allocator_type& __a):
+ _STLP_DBG_STRING_BASE(__a), _M_iter_list(_Get_base()) {}
+
+ basic_string(_Reserve_t __r, size_t __n,
+ const allocator_type& __a = allocator_type())
+ : _STLP_DBG_STRING_BASE(__r, __n, __a), _M_iter_list(_Get_base()) {}
+
+ basic_string(const _Self& __s):
+ _STLP_DBG_STRING_BASE(__s), _M_iter_list(_Get_base()) {}
+
+ basic_string(const _Self& __s, size_type __pos, size_type __n = _Base::npos,
+ const allocator_type& __a = allocator_type()):
+ _STLP_DBG_STRING_BASE(__s, __pos, __n, __a), _M_iter_list(_Get_base()) {}
+
+ basic_string(const _CharT* __s, size_type __n,
+ const allocator_type& __a = allocator_type()):
+ _STLP_DBG_STRING_BASE(__s, __n, __a), _M_iter_list(_Get_base()) {}
+
+ basic_string(const _CharT* __s,
+ const allocator_type& __a = allocator_type()):
+ _STLP_DBG_STRING_BASE(__s, __a), _M_iter_list(_Get_base()) {}
+
+ basic_string(size_type __n, _CharT __c,
+ const allocator_type& __a = allocator_type()):
+ _STLP_DBG_STRING_BASE(__n, __c, __a), _M_iter_list(_Get_base()) {}
+
+#if defined (_STLP_MEMBER_TEMPLATES) && !(defined(__MRC__)||(defined(__SC__) && !defined(__DMC__)))
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ basic_string(_InputIterator __f, _InputIterator __l):
+ _STLP_DBG_STRING_BASE(__f, __l), _M_iter_list(_Get_base()) {}
+# endif
+ template <class _InputIterator>
+ basic_string(_InputIterator __f, _InputIterator __l,
+ const allocator_type & __a _STLP_ALLOCATOR_TYPE_DFL):
+ _STLP_DBG_STRING_BASE(__f, __l, __a), _M_iter_list(_Get_base()) {}
+#else /* _STLP_MEMBER_TEMPLATES */
+ basic_string(const_iterator __f, const_iterator __l,
+ const allocator_type & __a = allocator_type()):
+ _STLP_DBG_STRING_BASE(__f._M_iterator, __l._M_iterator, __a),
+ _M_iter_list(_Get_base()) {}
+
+ basic_string(const _CharT* __f, const _CharT* __l,
+ const allocator_type& __a = allocator_type()):
+ _STLP_DBG_STRING_BASE(__f, __l, __a), _M_iter_list(_Get_base()) {}
+#endif
+
+# ifdef _STLP_USE_NATIVE_STRING
+ // these conversion operations still needed for
+ // strstream, etc.
+ basic_string (const __std_string& __x)
+ : _STLP_DBG_STRING_BASE(__x.begin(), __x.end()), _M_iter_list(_Get_base()) {}
+ operator __std_string() const { return __std_string(this->data()); }
+# endif
+
+ // constructor from non-debug version
+ basic_string (const _Base& __x)
+ : _STLP_DBG_STRING_BASE(__x), _M_iter_list(_Get_base()) {}
+
+ _Self& operator=(const _Self& __s) {
+ _Base::operator=(__s);
+ return *this;
+ }
+
+ _Self& operator=(const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ _Base::operator=(__s);
+ return *this;
+ }
+
+ _Self& operator=(_CharT __c) {
+ _Base::operator=(__c);
+ return *this;
+ }
+
+public: // Iterators.
+
+ iterator begin() { return iterator(&_M_iter_list, this->_M_start); }
+ const_iterator begin() const { return const_iterator(&_M_iter_list,this->_M_start); }
+ iterator end() { return iterator(&_M_iter_list,this->_M_finish); }
+ const_iterator end() const { return const_iterator(&_M_iter_list,this->_M_finish); }
+ void _M_deallocate_block() {
+ _M_iter_list._Invalidate_all();
+ _Base::_M_deallocate_block();
+ }
+
+ reverse_iterator rbegin()
+ { return reverse_iterator(iterator(&_M_iter_list,this->_M_finish)); }
+ reverse_iterator rend()
+ { return reverse_iterator(iterator(&_M_iter_list,this->_M_start)); }
+ const_reverse_iterator rbegin() const
+ { return const_reverse_iterator(const_iterator(&_M_iter_list,this->_M_finish)); }
+ const_reverse_iterator rend() const
+ { return const_reverse_iterator(const_iterator(&_M_iter_list,this->_M_start)); }
+
+public: // Size, capacity, etc.
+
+ void resize(size_type __n, _CharT __c) {
+ _Base::resize(__n, __c);
+ }
+ void resize(size_type __n) { resize(__n, this->_M_null()); }
+
+ void reserve(size_type __s= 0) {
+ _Base::reserve(__s);
+ }
+
+ void clear() {
+ _M_iter_list._Invalidate_all();
+ _Base::clear();
+ }
+
+public: // Element access.
+
+ const_reference operator[](size_type __n) const
+ { return *(begin() + __n); }
+ reference operator[](size_type __n)
+ { return *(begin() + __n); }
+
+ const_reference at(size_type __n) const {
+ if (__n >= this->size())
+ this->_M_throw_out_of_range();
+ return *(begin() + __n);
+ }
+
+ reference at(size_type __n) {
+ if (__n >= this->size())
+ this->_M_throw_out_of_range();
+ return *(begin() + __n);
+ }
+
+public: // Append, operator+=, push_back.
+
+ _Self& operator+=(const _Self& __s) { return append(__s); }
+ _Self& operator+=(const _CharT* __s) { _STLP_FIX_LITERAL_BUG(__s) return append(__s); }
+ _Self& operator+=(_CharT __c) { push_back(__c); return *this; }
+
+ _Self& append(const _Self& __s) { return append(__s._M_start, __s._M_finish); }
+
+ _Self& append(const _Self& __s,
+ size_type __pos, size_type __n)
+ {
+ _Base::append(__s, __pos, __n);
+ return *this;
+ }
+
+ _Self& append(const _CharT* __s, size_type __n)
+ { _STLP_FIX_LITERAL_BUG(__s) return append(__s, __s+__n); }
+
+ _Self& append(const _CharT* __s)
+ { _STLP_FIX_LITERAL_BUG(__s) return append(__s, __s + _Traits::length(__s)); }
+
+ _Self& append(size_type __n, _CharT __c){
+ _Base::append(__n, __c);
+ return *this;
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+ // Check to see if _InputIterator is an integer type. If so, then
+ // it can't be an iterator.
+ template <class _InputIter>
+ _Self& append(_InputIter __first, _InputIter __last) {
+ _Base::append(__first, __last);
+ return *this;
+ }
+
+#ifdef _STLP_MSVC
+// specialization for append
+ template <>
+ inline _Self& append(iterator __f, iterator __l) {
+ _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)
+ __check_range(__f, __l);
+ _Base::append(__f._M_iterator, __l._M_iterator);
+ return *this;
+ }
+#endif
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+ _Self& append(const _CharT* __first, const _CharT* __last) {
+ _Base::append(__first, __last);
+ return *this;
+ }
+
+ _Self& append(const_iterator __first, const_iterator __last) {
+ _Base::append(__first._M_iterator, __last._M_iterator);
+ return *this;
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ void push_back(_CharT __c) {
+ _Base::push_back(__c);
+ }
+
+ void pop_back() {
+ __invalidate_iterator(&_M_iter_list,end());
+ _Base::pop_back();
+ }
+
+
+public: // Assign
+
+ _Self& assign(const _Self& __s) {
+ _Base::assign(__s);
+ return *this;
+ }
+
+ _Self& assign(const _Self& __s,
+ size_type __pos, size_type __n) {
+ _Base::assign(__s, __pos, __n);
+ return *this;
+ }
+
+ _Self& assign(const _CharT* __s, size_type __n)
+ { _STLP_FIX_LITERAL_BUG(__s) return assign(__s, __s + __n); }
+
+ _Self& assign(const _CharT* __s)
+ { _STLP_FIX_LITERAL_BUG(__s) return assign(__s, __s + _Traits::length(__s)); }
+
+ _Self& assign(size_type __n, _CharT __c) {
+ _Base::assign(__n, __c);
+ return *this;
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIter>
+ inline _Self& assign(_InputIter __first, _InputIter __last) {
+ _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
+ __check_range(__first, __last);
+ _Base::assign(__first, __last);
+ return *this;
+ }
+
+#ifdef _STLP_MSVC
+// partial specialization for assign
+template <>
+inline _Self& assign(iterator __f, iterator __l) {
+ _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)
+ __check_range(__f, __l);
+ _Base::assign(__f._M_iterator, __l._M_iterator);
+ return *this;
+ }
+#endif
+
+#else
+ _Self& assign(const _CharT* __f, const _CharT* __l) {
+ _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)
+ __check_range(__f, __l);
+ _Base::assign(__f, __l);
+ return *this;
+ }
+ _Self& assign(const_iterator __f, const_iterator __l) {
+
+ _Base::assign(__f._M_iterator, __l._M_iterator);
+ return *this;
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public: // Insert
+
+ _Self& insert(size_type __pos, const _Self& __s) {
+ _Base::insert(__pos, __s);
+ return *this;
+ }
+
+ _Self& insert(size_type __pos, const _Self& __s,
+ size_type __beg, size_type __n) {
+ _Base::insert(__pos, __s, __beg, __n);
+ return *this;
+ }
+
+ _Self& insert(size_type __pos, const _CharT* __s, size_type __n) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ _Base::insert(__pos, __s, __n);
+ return *this;
+ }
+
+ _Self& insert(size_type __pos, const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ _Base::insert(__pos, __s);
+ return *this;
+ }
+
+ _Self& insert(size_type __pos, size_type __n, _CharT __c) {
+ _Base::insert(__pos, __n, __c);
+ return *this;
+ }
+
+ iterator insert(iterator __p, _CharT __c) {
+ _STLP_FIX_LITERAL_BUG(__p)
+ __check_if_owner(&_M_iter_list,__p);
+ return iterator(&_M_iter_list,_Base::insert(__p._M_iterator, __c));
+ }
+
+ void insert(iterator __p, size_t __n, _CharT __c) {
+ __check_if_owner(&_M_iter_list,__p);
+ _Base::insert(__p._M_iterator, __n, __c);
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIter>
+ void insert(iterator __p, _InputIter __first, _InputIter __last) {
+ __check_if_owner(&_M_iter_list,__p);
+ __check_range(__first,__last);
+ _Base::insert(__p._M_iterator, __first, __last);
+ }
+#else /* _STLP_MEMBER_TEMPLATES */
+ void insert(iterator __p, const _CharT* __first, const _CharT* __last) {
+ _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
+ __check_if_owner(&_M_iter_list,__p);
+ __check_range(__first,__last);
+ _Base::insert(__p._M_iterator, __first, __last);
+ }
+ void insert(iterator __p, const_iterator __first, const_iterator __last) {
+ __check_range(__first,__last);
+ _Base::insert(__p._M_iterator, __first._M_iterator, __last._M_iterator);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public: // Erase.
+ _Self& erase(size_type __pos = 0, size_type __n = _Base::npos) {
+ _Base::erase(__pos, __n);
+ return *this;
+ }
+ iterator erase(iterator __position) {
+ __check_if_owner(&_M_iter_list, __position);
+ __invalidate_iterator(&_M_iter_list,end());
+ return iterator(&_M_iter_list, _Base::erase(__position._M_iterator));
+ }
+ iterator erase(iterator __first, iterator __last) {
+ __check_range(__first, __last)&&__check_if_owner(&_M_iter_list,__first);
+ if (__first != __last) {
+ __invalidate_range(&_M_iter_list, __last, end());
+ }
+ return iterator(&_M_iter_list, _Base::erase(__first._M_iterator, __last._M_iterator));
+ }
+
+public: // Substring.
+ _Self substr(size_type __pos = 0, size_type __n = _Base::npos) const {
+ if (__pos > this->size())
+ this->_M_throw_out_of_range();
+ return _Self(this->begin() + __pos,
+ this->begin() + __pos + min(__n, this->size() - __pos),
+ allocator_type());
+ }
+public: // Replace. (Conceptually equivalent
+ // to erase followed by insert.)
+ _Self& replace(size_type __pos, size_type __n,
+ const _Self& __s) {
+ _Base::replace(__pos, __n, __s);
+ return *this;
+ }
+
+ _Self& replace(size_type __pos1, size_type __n1,
+ const _Self& __s,
+ size_type __pos2, size_type __n2) {
+ _Base::replace(__pos1, __n1, (const _Base&)__s, __pos2, __n2);
+ return *this;
+ }
+
+ _Self& replace(size_type __pos, size_type __n1,
+ const _CharT* __s, size_type __n2) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ _Base::replace(__pos, __n1, __s, __n2);
+ return *this;
+ }
+
+ _Self& replace(size_type __pos, size_type __n1,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ _Base::replace(__pos, __n1, __s);
+ return *this;
+ }
+
+ _Self& replace(size_type __pos, size_type __n1,
+ size_type __n2, _CharT __c) {
+ _Base::replace(__pos, __n1, __n2, __c);
+ return *this;
+ }
+
+ _Self& replace(iterator __first, iterator __last,
+ const _Self& __s) {
+ __check_if_owner(&_M_iter_list,__first);
+ __check_range(__first, __last);
+ _Base::replace(__first._M_iterator, __last._M_iterator,__s);
+ return *this;
+ }
+
+ _Self& replace(iterator __first, iterator __last,
+ const _CharT* __s, size_type __n) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ __check_if_owner(&_M_iter_list,__first);
+ __check_range(__first, __last);
+ _Base::replace(__first._M_iterator, __last._M_iterator,__s, __n);
+ return *this;
+ }
+
+ _Self& replace(iterator __first, iterator __last,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ __check_if_owner(&_M_iter_list,__first);
+ __check_range(__first, __last);
+ _Base::replace(__first._M_iterator, __last._M_iterator,__s);
+ return *this;
+ }
+
+ _Self& replace(iterator __first, iterator __last,
+ size_type __n, _CharT __c) {
+ __check_if_owner(&_M_iter_list,__first);
+ __check_range(__first, __last);
+ _Base::replace(__first._M_iterator, __last._M_iterator, __n, __c);
+ return *this;
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template <class _InputIter>
+ _Self& replace(iterator __first, iterator __last,
+ _InputIter __f, _InputIter __l) {
+ __check_if_owner(&_M_iter_list, __first);
+ __check_range(__first, __last);
+ __check_range(__f, __l);
+ _Base::replace(__first._M_iterator, __last._M_iterator, __f, __l);
+ return *this;
+ }
+#else /* _STLP_MEMBER_TEMPLATES */
+ _Self& replace(iterator __first, iterator __last,
+ const _CharT* __f, const _CharT* __l) {
+ __check_if_owner(&_M_iter_list, __first);
+ __check_range(__first, __last);
+ __check_range(__f, __l);
+ _Base::replace(__first._M_iterator, __last._M_iterator, __f, __l);
+ return *this;
+ }
+
+ _Self& replace(iterator __first, iterator __last,
+ const_iterator __f, const_iterator __l) {
+ __check_if_owner(&_M_iter_list, __first);
+ __check_range(__first, __last);
+ __check_range(__f, __l);
+ _Base::replace(__first._M_iterator, __last._M_iterator,
+ __f._M_iterator, __l._M_iterator);
+ return *this;
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public: // Other modifier member functions.
+
+ void swap(_Self& __s) {
+ _M_iter_list._Swap_owners(__s._M_iter_list);
+ _Base::swap(__s);
+ }
+};
+
+
+// This is a hook to instantiate STLport exports in a designated DLL
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT template class _STLP_CLASS_DECLSPEC basic_string<char, char_traits<char>, allocator<char> >;
+# if defined (_STLP_HAS_WCHAR_T)
+_STLP_EXPORT template class _STLP_CLASS_DECLSPEC basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
+# endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+
+// ------------------------------------------------------------
+// Non-member functions.
+
+template <class _CharT, class _Traits, class _Alloc>
+inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const basic_string<_CharT,_Traits,_Alloc>& __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y)
+{
+ return basic_string<_CharT,_Traits,_Alloc>(*__s._Get_base() + *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return basic_string<_CharT,_Traits,_Alloc>(__s + *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(_CharT __c,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return basic_string<_CharT,_Traits,_Alloc>(__c + *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return basic_string<_CharT,_Traits,_Alloc>(*__x._Get_base()+ __s);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT __c) {
+ return basic_string<_CharT,_Traits,_Alloc>(*__x._Get_base() + __c);
+}
+
+#ifdef _STLP_EXTRA_OPERATORS_FOR_DEBUG
+
+// Operator== and operator!=
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator==(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return (*__x._Get_base() == *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator==(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return (__s == *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator==(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return (*__x._Get_base() == __s);
+}
+
+// Operator< (and also >, <=, and >=).
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator<(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return (*__x._Get_base() < *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator<(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return (__s < *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator<(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return (*__x._Get_base() < __s);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator!=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return !(__x == __y);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator>(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return __y < __x;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator<=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return !(__y < __x);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator>=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator!=(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return !(__s == __y);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator!=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return !(__x == __s);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator>(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return __y < __s;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator>(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return __s < __x;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator<=(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return !(__y < __s);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator<=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return !(__s < __x);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator>=(const _CharT* __s,
+ const basic_string<_CharT,_Traits,_Alloc>& __y) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return !(__s < __y);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator>=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+ const _CharT* __s) {
+ _STLP_FIX_LITERAL_BUG(__s)
+ return !(__x < __s);
+}
+#endif /* if 0 */
+
+// Swap.
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+template <class _CharT, class _Traits, class _Alloc>
+inline void swap(basic_string<_CharT,_Traits,_Alloc>& __x,
+ basic_string<_CharT,_Traits,_Alloc>& __y) {
+ __x.swap(__y);
+}
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+// I/O.
+
+#ifdef _STLP_EXTRA_OPERATORS_FOR_DEBUG
+#if defined (_STLP_USE_NEW_IOSTREAMS) && ! defined (_STLP_OWN_IOSTREAMS)
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const basic_string<_CharT,_Traits,_Alloc>& __s) {
+ return __os << *__s._Get_base();
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT,_Traits,_Alloc>& __s) {
+ return __is >> *__s._Get_base();
+}
+
+#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
+
+template <class _CharT, class _Traits, class _Alloc>
+ostream& _STLP_CALL operator<<(ostream& __os,
+ const basic_string<_CharT,_Traits,_Alloc>& __s) {
+ return __os << *__s._Get_base();
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+istream& _STLP_CALL operator>>(istream& __is, basic_string<_CharT,_Traits,_Alloc>& __s) {
+ return __is >> *__s._Get_base();
+}
+
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+#endif /* if _STLP_EXTRA_OPERATORS_FOR_DEBUG */
+
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_DBG_STRING */
+
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/debug/_tree.h b/src/STLport/stl/debug/_tree.h
new file mode 100644
index 0000000..4d2ecc0
--- /dev/null
+++ b/src/STLport/stl/debug/_tree.h
@@ -0,0 +1,249 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DBG_TREE_H
+#define _STLP_INTERNAL_DBG_TREE_H
+
+#include <stl/debug/_iterator.h>
+#include <stl/_function.h>
+#include <stl/_alloc.h>
+
+# undef _DBG_Rb_tree
+# define _DBG_Rb_tree _Rb_tree
+
+# define _STLP_DBG_TREE_SUPER __WORKAROUND_DBG_RENAME(Rb_tree) <_Key, _Value, _KeyOfValue, _Compare, _Alloc>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _Key, class _Value, class _KeyOfValue, class _Compare, class _Alloc >
+inline _Value*
+value_type(const _DBG_iter_base< _STLP_DBG_TREE_SUPER >&) {
+ return (_Value*)0;
+}
+template <class _Key, class _Value, class _KeyOfValue, class _Compare, class _Alloc >
+inline bidirectional_iterator_tag
+iterator_category(const _DBG_iter_base< _STLP_DBG_TREE_SUPER >&) {
+ return bidirectional_iterator_tag();
+}
+# endif
+
+template <class _Key, class _Value, class _KeyOfValue, class _Compare,
+ _STLP_DBG_ALLOCATOR_SELECT(_Value) >
+class _DBG_Rb_tree : public _STLP_DBG_TREE_SUPER {
+ typedef _STLP_DBG_TREE_SUPER _Base;
+ typedef _DBG_Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc> _Self;
+protected:
+ friend class __owned_link;
+ mutable __owned_list _M_iter_list;
+
+public:
+ __IMPORT_CONTAINER_TYPEDEFS(_Base)
+ typedef typename _Base::key_type key_type;
+
+ typedef _DBG_iter<_Base, _Nonconst_traits<value_type> > iterator;
+ typedef _DBG_iter<_Base, _Const_traits<value_type> > const_iterator;
+
+ _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;
+
+protected:
+
+ //typedef typename _Base::key_param_type key_param_type;
+ //typedef typename _Base::val_param_type val_param_type;
+
+ void _Invalidate_all() {_M_iter_list._Invalidate_all();}
+
+ void _Invalidate_iterator(const iterator& __it) {
+ __invalidate_iterator(&_M_iter_list,__it);
+ }
+ void _Invalidate_iterators(const iterator& __first, const iterator& __last) {
+ iterator __cur = __first;
+ while (__cur != __last) __invalidate_iterator(&_M_iter_list, __cur++);
+ }
+
+ const _Base* _Get_base() const { return (const _Base*)this; }
+ _Base* _Get_base() { return (_Base*)this; }
+
+public:
+ _DBG_Rb_tree() : _STLP_DBG_TREE_SUPER(),
+ _M_iter_list(_Get_base()) {}
+ _DBG_Rb_tree(const _Compare& __comp) :
+ _STLP_DBG_TREE_SUPER(__comp), _M_iter_list(_Get_base()) {}
+ _DBG_Rb_tree(const _Compare& __comp, const allocator_type& __a):
+ _STLP_DBG_TREE_SUPER(__comp, __a), _M_iter_list(_Get_base()) {}
+ _DBG_Rb_tree(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x):
+ _STLP_DBG_TREE_SUPER(__x), _M_iter_list(_Get_base()) {}
+ ~_DBG_Rb_tree() { _Invalidate_all(); }
+
+ _Self& operator=(const _Self& __x) {
+ _Invalidate_all();
+ (_Base&)*this = (const _Base&)__x;
+ return *this;
+ }
+
+ iterator begin() { return iterator(&_M_iter_list,_Base::begin()); }
+ const_iterator begin() const { return const_iterator(&_M_iter_list, _Base::begin()); }
+ iterator end() { return iterator(&_M_iter_list, _Base::end()); }
+ const_iterator end() const { return const_iterator(&_M_iter_list,_Base::end()); }
+
+public:
+ reverse_iterator rbegin() { return reverse_iterator(end()); }
+ const_reverse_iterator rbegin() const {
+ return const_reverse_iterator(end());
+ }
+ reverse_iterator rend() { return reverse_iterator(begin()); }
+ const_reverse_iterator rend() const {
+ return const_reverse_iterator(begin());
+ }
+ void swap(_Self& __t) {
+ _Base::swap(__t);
+ _M_iter_list._Swap_owners(__t._M_iter_list);
+ }
+
+public:
+
+ iterator find(const key_type& __x) {
+ return iterator(&_M_iter_list, _Base::find(__x));
+ }
+ const_iterator find(const key_type& __x) const {
+ return const_iterator(&_M_iter_list, _Base::find(__x));
+ }
+
+ iterator lower_bound(const key_type& __x) {
+ return iterator(&_M_iter_list, _Base::lower_bound(__x));
+ }
+ const_iterator lower_bound(const key_type& __x) const {
+ return const_iterator(&_M_iter_list, _Base::lower_bound(__x));
+ }
+
+ iterator upper_bound(const key_type& __x) {
+ return iterator(&_M_iter_list, _Base::upper_bound(__x));
+ }
+ const_iterator upper_bound(const key_type& __x) const {
+ return const_iterator(&_M_iter_list, _Base::upper_bound(__x));
+ }
+
+ pair<iterator,iterator> equal_range(const key_type& __x) {
+ return pair<iterator, iterator>(iterator(&_M_iter_list, _Base::lower_bound(__x)),
+ iterator(&_M_iter_list, _Base::upper_bound(__x)));
+ }
+ pair<const_iterator, const_iterator> equal_range(const key_type& __x) const {
+ return pair<const_iterator,const_iterator>(const_iterator(&_M_iter_list, _Base::lower_bound(__x)),
+ const_iterator(&_M_iter_list, _Base::upper_bound(__x)));
+ }
+
+ pair<iterator,bool> insert_unique(const value_type& __x) {
+ _STLP_STD::pair<_STLP_HEADER_TYPENAME _Base::iterator, bool> __res = _Base::insert_unique(__x);
+ return pair<iterator,bool>( iterator(&_M_iter_list, __res.first), __res.second ) ;
+ }
+ iterator insert_equal(const value_type& __x) {
+ return iterator(&_M_iter_list, _Base::insert_equal(__x));
+ }
+
+ iterator insert_unique(iterator __position, const value_type& __x) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+ return iterator(&_M_iter_list, _Base::insert_unique(__position._M_iterator, __x));
+ }
+ iterator insert_equal(iterator __position, const value_type& __x) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+ return iterator(&_M_iter_list, _Base::insert_equal(__position._M_iterator, __x));
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ template<class _II>
+ void insert_equal(_II __first, _II __last) {
+ _Base::insert_equal(__first, __last);
+ }
+ template<class _II>
+ void insert_unique(_II __first, _II __last) {
+ _Base::insert_unique(__first, __last);
+ }
+#else /* _STLP_MEMBER_TEMPLATES */
+ void insert_unique(const_iterator __first, const_iterator __last) {
+ _Base::insert_unique(__first._M_iterator, __last._M_iterator);
+ }
+ void insert_unique(const value_type* __first, const value_type* __last) {
+ _Base::insert_unique(__first, __last);
+ }
+ void insert_equal(const_iterator __first, const_iterator __last) {
+ _Base::insert_equal(__first._M_iterator, __last._M_iterator);
+ }
+ void insert_equal(const value_type* __first, const value_type* __last) {
+ _Base::insert_equal(__first, __last);
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ void erase(iterator __position) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+ _STLP_DEBUG_CHECK(_Dereferenceable(__position))
+ _Invalidate_iterator(__position);
+ _Base::erase(__position._M_iterator);
+ }
+ size_type erase(const key_type& __x) {
+ pair<iterator,iterator> __p = equal_range(__x);
+ size_type __n = distance(__p.first, __p.second);
+ _Invalidate_iterators(__p.first, __p.second);
+ _Base::erase(__p.first._M_iterator, __p.second._M_iterator);
+ return __n;
+ }
+
+ void erase(iterator __first, iterator __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __first)&&
+ __check_if_owner(&_M_iter_list, __last))
+ _Invalidate_iterators(__first, __last);
+ _Base::erase(__first._M_iterator, __last._M_iterator);
+ }
+ void erase(const key_type* __first, const key_type* __last) {
+ while (__first != __last) erase(*__first++);
+ }
+
+ void clear() {
+ _Invalidate_all();
+ _Base::clear();
+ }
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Key, class _Value, class _KeyOfValue, class _Compare, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER _DBG_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
+#define _STLP_TEMPLATE_CONTAINER_BASE _STLP_DBG_TREE_SUPER
+#include <stl/debug/_relops_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER_BASE
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+
+# undef _STLP_DBG_TREE_SUPER
+
+#endif /* _STLP_INTERNAL_DBG_TREE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/debug/_vector.h b/src/STLport/stl/debug/_vector.h
new file mode 100644
index 0000000..a9a1a0a
--- /dev/null
+++ b/src/STLport/stl/debug/_vector.h
@@ -0,0 +1,300 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DBG_VECTOR_H
+#define _STLP_INTERNAL_DBG_VECTOR_H
+
+#include <stl/debug/_iterator.h>
+
+# ifndef _STLP_USE_WRAPPER_FOR_ALLOC_PARAM
+# undef _DBG_vector
+# define _DBG_vector vector
+# endif
+
+# define _STLP_DBG_VECTOR_BASE __WORKAROUND_DBG_RENAME(vector) <_Tp, _Alloc>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _Tp, class _Alloc>
+inline _Tp*
+value_type(const _DBG_iter_base< _STLP_DBG_VECTOR_BASE >&) {
+ return (_Tp*)0;
+}
+template <class _Tp, class _Alloc>
+inline random_access_iterator_tag
+iterator_category(const _DBG_iter_base< _STLP_DBG_VECTOR_BASE >&) {
+ return random_access_iterator_tag();
+}
+# endif
+
+template <class _Tp, class _NcIt>
+struct _Vector_nonconst_traits
+{
+ typedef _Nonconst_traits<_Tp> _BaseT;
+ typedef _Tp value_type;
+ typedef _Tp& reference;
+ typedef _Tp* pointer;
+ typedef _Vector_nonconst_traits<_Tp, _NcIt> _Non_const_traits;
+};
+
+template <class _Tp, class _NcIt>
+struct _Vector_const_traits
+{
+ typedef _Const_traits<_Tp> _BaseT;
+ typedef _Tp value_type;
+ typedef const _Tp& reference;
+ typedef const _Tp* pointer;
+ typedef _Vector_nonconst_traits<_Tp, _NcIt> _Non_const_traits;
+};
+
+_STLP_TEMPLATE_NULL
+struct _Vector_nonconst_traits<bool, _Bit_iterator>
+{
+ typedef _Bit_iterator::value_type value_type;
+ typedef _Bit_iterator::reference reference;
+ typedef _Bit_iterator::pointer pointer;
+ typedef _Vector_nonconst_traits<bool, _Bit_iterator> _Non_const_traits;
+};
+
+_STLP_TEMPLATE_NULL
+struct _Vector_const_traits<bool, _Bit_iterator>
+{
+ typedef _Bit_const_iterator::value_type value_type;
+ typedef _Bit_const_iterator::reference reference;
+ typedef _Bit_const_iterator::pointer pointer;
+ typedef _Vector_nonconst_traits<bool, _Bit_iterator> _Non_const_traits;
+};
+
+template <class _Tp, _STLP_DBG_ALLOCATOR_SELECT(_Tp) >
+class _DBG_vector : public _STLP_DBG_VECTOR_BASE {
+private:
+ typedef _STLP_DBG_VECTOR_BASE _Base;
+ typedef _DBG_vector<_Tp, _Alloc> _Self;
+ mutable __owned_list _M_iter_list;
+
+public:
+
+ __IMPORT_CONTAINER_TYPEDEFS(_Base)
+
+ typedef _DBG_iter<_Base,
+ _Vector_nonconst_traits<value_type, typename _Base::iterator> > iterator;
+
+ typedef _DBG_iter<_Base,
+ _Vector_const_traits<value_type, typename _Base::iterator> > const_iterator;
+
+ _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+
+ iterator begin() { return iterator(&_M_iter_list, this->_M_start); }
+ const_iterator begin() const { return const_iterator(&_M_iter_list, this->_M_start); }
+ iterator end() { return iterator(&_M_iter_list, this->_M_finish); }
+ const_iterator end() const { return const_iterator(&_M_iter_list, this->_M_finish); }
+
+ reverse_iterator rbegin()
+ { return reverse_iterator(end()); }
+ const_reverse_iterator rbegin() const
+ { return const_reverse_iterator(end()); }
+ reverse_iterator rend()
+ { return reverse_iterator(begin()); }
+ const_reverse_iterator rend() const
+ { return const_reverse_iterator(begin()); }
+
+ reference operator[](size_type __n) {
+ _STLP_VERBOSE_ASSERT(__n < _Base::size(), _StlMsg_OUT_OF_BOUNDS)
+ return _Base::operator[](__n);
+ }
+
+ const_reference operator[](size_type __n) const {
+ _STLP_VERBOSE_ASSERT(__n < _Base::size(), _StlMsg_OUT_OF_BOUNDS)
+ return _Base::operator[](__n);
+ }
+
+ _Base* _Get_base() { return (_Base*)this; }
+ const _Base* _Get_base() const { return (const _Base*)this; }
+
+ explicit _DBG_vector(const allocator_type& __a = allocator_type())
+ : _STLP_DBG_VECTOR_BASE(__a), _M_iter_list((const _Base*)this) {}
+
+ _DBG_vector(size_type __n, const _Tp& __value,
+ const allocator_type& __a = allocator_type())
+ : _STLP_DBG_VECTOR_BASE(__n, __value, __a), _M_iter_list((const _Base*)this) {}
+
+ explicit _DBG_vector(size_type __n)
+ : _STLP_DBG_VECTOR_BASE(__n), _M_iter_list((const _Base*)this) {}
+
+
+ _DBG_vector(const _Self& __x)
+ : _STLP_DBG_VECTOR_BASE(__x), _M_iter_list((const _Base*)this) {}
+
+#if defined (_STLP_MEMBER_TEMPLATES)
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+ template <class _InputIterator>
+ _DBG_vector(_InputIterator __first, _InputIterator __last):
+ _STLP_DBG_VECTOR_BASE(__first, __last), _M_iter_list((const _Base*)this) {}
+# endif
+ template <class _InputIterator>
+ _DBG_vector(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) :
+ _STLP_DBG_VECTOR_BASE(__first, __last, __a), _M_iter_list((const _Base*)this) {}
+
+#else
+ _DBG_vector(const _Tp* __first, const _Tp* __last,
+ const allocator_type& __a = allocator_type())
+ : _STLP_DBG_VECTOR_BASE(__first, __last, __a), _M_iter_list((const _Base*)this) {}
+
+ // mysterious VC++ bug ?
+ _DBG_vector(const_iterator __first, const_iterator __last ,
+ const allocator_type& __a = allocator_type())
+ : _STLP_DBG_VECTOR_BASE(__first._M_iterator, __last._M_iterator, __a),
+ _M_iter_list((const _Base*)this) { }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ _Self& operator=(const _Self& __x) {
+ _M_iter_list._Invalidate_all();
+ (_Base&)*this = (const _Base&)__x;
+ return *this;
+ }
+
+ reference front() { return *begin(); }
+ const_reference front() const { return *begin(); }
+
+ reference back() {
+ iterator __tmp = end();
+ --__tmp;
+ return *__tmp;
+ }
+ const_reference back() const {
+ const_iterator __tmp = end();
+ --__tmp;
+ return *__tmp;
+ }
+
+ void swap(_Self& __x) {
+ _M_iter_list._Swap_owners(__x._M_iter_list);
+ _Base::swap((_Base&)__x);
+ }
+
+ iterator insert(iterator __position, const _Tp& __x) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ if (this->size()+1 > this->capacity()) _M_iter_list._Invalidate_all();
+ return iterator(&_M_iter_list, _Base::insert(__position._M_iterator, __x));
+ }
+
+ iterator insert(iterator __position) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ if (this->size()+1 > this->capacity()) _M_iter_list._Invalidate_all();
+ return iterator(&_M_iter_list, _Base::insert(__position._M_iterator));
+ }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+ // Check whether it's an integral type. If so, it's not an iterator.
+ template <class _InputIterator>
+ void insert(iterator __position, _InputIterator __first, _InputIterator __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first,__last))
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ size_type __n = distance(__first, __last);
+ if (this->size()+__n > this->capacity()) _M_iter_list._Invalidate_all();
+ _Base::insert(__position._M_iterator, __first, __last);
+ }
+#else /* _STLP_MEMBER_TEMPLATES */
+ void insert(iterator __position,
+ const_iterator __first, const_iterator __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first,__last))
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ size_type __n = distance(__first, __last);
+ if (this->size()+__n > this->capacity()) _M_iter_list._Invalidate_all();
+ _Base::insert(__position._M_iterator,
+ __first._M_iterator, __last._M_iterator);
+ }
+
+ void insert (iterator __position, const_pointer __first, const_pointer __last) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ _STLP_DEBUG_CHECK(__check_range(__first,__last))
+ size_type __n = distance(__first, __last);
+ if (this->size()+__n > this->capacity()) _M_iter_list._Invalidate_all();
+ _Base::insert(__position._M_iterator, __first, __last);
+}
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+ void insert (iterator __position, size_type __n, const _Tp& __x){
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ if (this->size()+__n > this->capacity()) _M_iter_list._Invalidate_all();
+ _Base::insert(__position._M_iterator, __n, __x);
+ }
+
+ void pop_back() {
+ _STLP_VERBOSE_ASSERT(!this->empty(), _StlMsg_EMPTY_CONTAINER)
+ __invalidate_iterator(&_M_iter_list,end());
+ _Base::pop_back();
+ }
+ iterator erase(iterator __position) {
+ _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+ _STLP_VERBOSE_ASSERT(__position._M_iterator !=this->_M_finish,_StlMsg_ERASE_PAST_THE_END)
+ __invalidate_range(&_M_iter_list, __position+1, end());
+ return iterator(&_M_iter_list,_Base::erase(__position._M_iterator));
+ }
+ iterator erase(iterator __first, iterator __last) {
+ _STLP_DEBUG_CHECK(__check_range(__first,__last, begin(), end()))
+ __invalidate_range(&_M_iter_list, __first._M_iterator == this->_M_finish ?
+ __first : __first+1, end());
+ return iterator(&_M_iter_list, _Base::erase(__first._M_iterator, __last._M_iterator));
+ }
+ void clear() {
+ _M_iter_list._Invalidate_all();
+ _Base::clear();
+ }
+ void push_back(const _Tp& __x) {
+ if (this->size()+1 > this->capacity()) _M_iter_list._Invalidate_all();
+ _Base::push_back(__x);
+ }
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER _DBG_vector<_Tp, _Alloc>
+#define _STLP_TEMPLATE_CONTAINER_BASE _STLP_DBG_VECTOR_BASE
+#include <stl/debug/_relops_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER_BASE
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+ _STLP_EXPORT_TEMPLATE_CLASS _DBG_vector <void*,allocator<void*> >;
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+_STLP_END_NAMESPACE
+
+# undef _STLP_DBG_VECTOR_BASE
+# undef _DBG_vector
+
+#endif /* _STLP_DBG_VECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/msl_string.h b/src/STLport/stl/msl_string.h
new file mode 100644
index 0000000..0e57377
--- /dev/null
+++ b/src/STLport/stl/msl_string.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1998
+ * Mark of the Unicorn, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Mark of the Unicorn, Inc. makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ */
+#if defined( _STLP_USE_MSIPL ) && !defined( _STLP_MSL_STRING_H_ )
+#define _STLP_MSL_STRING_H_
+
+//# define char_traits __msl_char_traits
+# define basic_string __msl_basic_string
+# define b_str_ref __msl_b_str_ref
+# define basic_istream __msl_basic_istream
+# define basic_ostream __msl_basic_ostream
+# define string __msl_string
+# define wstring __msl_wstring
+# define iterator_traits __msl_iterator_traits
+
+namespace std
+{
+ template<class charT, class traits> class basic_istream;
+ template<class charT, class traits> class basic_ostream;
+}
+
+# include _STLP_NATIVE_HEADER(string)
+// # undef char_traits
+# undef basic_string
+# undef b_str_ref
+# undef basic_istream
+# undef basic_ostream
+# undef string
+# undef wstring
+# undef iterator_traits
+
+#endif
diff --git a/src/STLport/stl/type_traits.h b/src/STLport/stl/type_traits.h
new file mode 100644
index 0000000..240f7b2
--- /dev/null
+++ b/src/STLport/stl/type_traits.h
@@ -0,0 +1,418 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_TYPE_TRAITS_H
+#define _STLP_TYPE_TRAITS_H
+
+/*
+This header file provides a framework for allowing compile time dispatch
+based on type attributes. This is useful when writing template code.
+For example, when making a copy of an array of an unknown type, it helps
+to know if the type has a trivial copy constructor or not, to help decide
+if a memcpy can be used.
+
+The class template __type_traits provides a series of typedefs each of
+which is either __true_type or __false_type. The argument to
+__type_traits can be any type. The typedefs within this template will
+attain their correct values by one of these means:
+ 1. The general instantiation contain conservative values which work
+ for all types.
+ 2. Specializations may be declared to make distinctions between types.
+ 3. Some compilers (such as the Silicon Graphics N32 and N64 compilers)
+ will automatically provide the appropriate specializations for all
+ types.
+
+EXAMPLE:
+
+//Copy an array of elements which have non-trivial copy constructors
+template <class T> void copy(T* source, T* destination, int n, __false_type);
+//Copy an array of elements which have trivial copy constructors. Use memcpy.
+template <class T> void copy(T* source, T* destination, int n, __true_type);
+
+//Copy an array of any type by using the most efficient copy mechanism
+template <class T> inline void copy(T* source,T* destination,int n) {
+ copy(source, destination, n,
+ typename __type_traits<T>::has_trivial_copy_constructor());
+}
+*/
+
+#ifdef __WATCOMC__
+# include <stl/_cwchar.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+struct __true_type {};
+struct __false_type {};
+
+
+template <int _Is> struct __bool2type {
+ typedef __false_type _Ret;
+};
+
+_STLP_TEMPLATE_NULL
+struct __bool2type<1> { typedef __true_type _Ret; };
+
+_STLP_TEMPLATE_NULL
+struct __bool2type<0> { typedef __false_type _Ret; };
+
+// logical end of 3 predicated
+template <class _P1, class _P2, class _P3>
+struct _Land3 {
+ typedef __false_type _Ret;
+};
+
+_STLP_TEMPLATE_NULL
+struct _Land3<__true_type, __true_type, __true_type> {
+ typedef __true_type _Ret;
+};
+
+
+// Forward declarations.
+template <class _Tp> struct __type_traits;
+template <int _IsPOD> struct __type_traits_aux {
+ typedef __false_type has_trivial_default_constructor;
+ typedef __false_type has_trivial_copy_constructor;
+ typedef __false_type has_trivial_assignment_operator;
+ typedef __false_type has_trivial_destructor;
+ typedef __false_type is_POD_type;
+};
+
+_STLP_TEMPLATE_NULL
+struct __type_traits_aux<0> {
+ typedef __false_type has_trivial_default_constructor;
+ typedef __false_type has_trivial_copy_constructor;
+ typedef __false_type has_trivial_assignment_operator;
+ typedef __false_type has_trivial_destructor;
+ typedef __false_type is_POD_type;
+};
+
+_STLP_TEMPLATE_NULL
+struct __type_traits_aux<1> {
+ typedef __true_type has_trivial_default_constructor;
+ typedef __true_type has_trivial_copy_constructor;
+ typedef __true_type has_trivial_assignment_operator;
+ typedef __true_type has_trivial_destructor;
+ typedef __true_type is_POD_type;
+};
+
+# ifdef _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+
+// Boris : simulation technique is used here according to Adobe Open Source License Version 1.0.
+// Copyright 2000 Adobe Systems Incorporated and others. All rights reserved.
+// Authors: Mat Marcus and Jesse Jones
+// The original version of this source code may be found at
+// http://opensource.adobe.com.
+
+struct _PointerShim {
+ // Since the compiler only allows at most one non-trivial
+ // implicit conversion we can make use of a shim class to
+ // be sure that IsPtr below doesn't accept classes with
+ // implicit pointer conversion operators
+ _PointerShim(const volatile void*); // no implementation
+};
+
+// These are the discriminating functions
+
+char _STLP_CALL _IsP(bool, _PointerShim); // no implementation is required
+char* _STLP_CALL _IsP(bool, ...); // no implementation is required
+
+template <class _Tp>
+char _STLP_CALL _IsSameFun(bool, _Tp*, _Tp*); // no implementation is required
+char* _STLP_CALL _IsSameFun(bool, ...); // no implementation is required
+
+template <class _Tp1, class _Tp2>
+struct _IsSame {
+ // boris : check!
+ static _Tp1* __null_rep1();
+ static _Tp2* __null_rep2();
+ enum { _Ret = (sizeof(_IsSameFun(false,__null_rep1(),__null_rep2())) == sizeof(char)) };
+};
+
+template <class _Tp>
+struct _IsPtr {
+
+ // This template meta function takes a type T
+ // and returns true exactly when T is a pointer.
+ // One can imagine meta-functions discriminating on
+ // other criteria.
+ static _Tp& __null_rep();
+ enum { _Ret = (sizeof(_IsP(false,__null_rep())) == sizeof(char)) };
+
+};
+
+template <class _Tp>
+struct _IsPtrType {
+ enum { _Is = _IsPtr<_Tp>::_Ret } ;
+ typedef __bool2type< _Is > _BT;
+ typedef typename _BT::_Ret _Type;
+ static _Type _Ret() { return _Type(); }
+};
+
+template <class _Tp1, class _Tp2>
+struct _BothPtrType {
+ typedef __bool2type< _IsPtr<_Tp1>::_Ret> _B1;
+ typedef __bool2type< _IsPtr<_Tp2>::_Ret> _B2;
+ typedef typename _B1::_Ret _Type1;
+ typedef typename _B2::_Ret _Type2;
+ typedef typename _Land3<_Type1, _Type2, __true_type>::_Ret _Type;
+ static _Type _Ret() { return _Type(); }
+};
+
+// we make general case dependant on the fact the type is actually a pointer.
+
+template <class _Tp>
+struct __type_traits : __type_traits_aux<_IsPtr<_Tp>::_Ret> {};
+
+# else
+
+template <class _Tp>
+struct __type_traits {
+ typedef __true_type this_dummy_member_must_be_first;
+ /* Do not remove this member. It informs a compiler which
+ automatically specializes __type_traits that this
+ __type_traits template is special. It just makes sure that
+ things work if an implementation is using a template
+ called __type_traits for something unrelated. */
+
+ /* The following restrictions should be observed for the sake of
+ compilers which automatically produce type specific specializations
+ of this class:
+ - You may reorder the members below if you wish
+ - You may remove any of the members below if you wish
+ - You must not rename members without making the corresponding
+ name change in the compiler
+ - Members you add will be treated like regular members unless
+ you add the appropriate support in the compiler. */
+ typedef __false_type has_trivial_default_constructor;
+ typedef __false_type has_trivial_copy_constructor;
+ typedef __false_type has_trivial_assignment_operator;
+ typedef __false_type has_trivial_destructor;
+ typedef __false_type is_POD_type;
+};
+
+
+template <class _Tp> struct _IsPtr { enum { _Ret = 0 }; };
+template <class _Tp> struct _IsPtrType {
+ static __false_type _Ret() { return __false_type();}
+};
+template <class _Tp1, class _Tp2> struct _BothPtrType {
+ static __false_type _Ret() { return __false_type();}
+};
+
+template <class _Tp1, class _Tp2>
+struct _IsSame { enum { _Ret = 0 }; };
+
+// template <class _Tp1, class _Tp2>
+// struct _IsSameType { static __false_type _Ret() { return __false_type(); } };
+
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+template <class _Tp> struct _IsPtr<_Tp*> { enum { _Ret = 1 }; };
+template <class _Tp> struct _IsPtrType<_Tp*> {
+ static __true_type _Ret() { return __true_type();}
+};
+template <class _Tp1, class _Tp2> struct _BothPtrType<_Tp1*, _Tp2*> {
+ static __true_type _Ret() { return __true_type();}
+};
+template <class _Tp>
+struct _IsSame<_Tp, _Tp> { enum { _Ret = 1 }; };
+# endif
+
+# endif /* _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS */
+
+// Provide some specializations. This is harmless for compilers that
+// have built-in __types_traits support, and essential for compilers
+// that don't.
+#ifndef _STLP_NO_BOOL
+_STLP_TEMPLATE_NULL struct __type_traits<bool> : __type_traits_aux<1> {};
+#endif /* _STLP_NO_BOOL */
+_STLP_TEMPLATE_NULL struct __type_traits<char> : __type_traits_aux<1> {};
+#ifndef _STLP_NO_SIGNED_BUILTINS
+_STLP_TEMPLATE_NULL struct __type_traits<signed char> : __type_traits_aux<1> {};
+# endif
+_STLP_TEMPLATE_NULL struct __type_traits<unsigned char> : __type_traits_aux<1> {};
+#if defined ( _STLP_HAS_WCHAR_T ) && ! defined (_STLP_WCHAR_T_IS_USHORT)
+_STLP_TEMPLATE_NULL struct __type_traits<wchar_t> : __type_traits_aux<1> {};
+#endif /* _STLP_HAS_WCHAR_T */
+
+_STLP_TEMPLATE_NULL struct __type_traits<short> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<unsigned short> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<int> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<unsigned int> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<long> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<unsigned long> : __type_traits_aux<1> {};
+
+#ifdef _STLP_LONG_LONG
+_STLP_TEMPLATE_NULL struct __type_traits<_STLP_LONG_LONG> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<unsigned _STLP_LONG_LONG> : __type_traits_aux<1> {};
+#endif /* _STLP_LONG_LONG */
+
+_STLP_TEMPLATE_NULL struct __type_traits<float> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<double> : __type_traits_aux<1> {};
+
+# if !defined ( _STLP_NO_LONG_DOUBLE )
+_STLP_TEMPLATE_NULL struct __type_traits<long double> : __type_traits_aux<1> {};
+# endif
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+template <class _Tp> struct __type_traits<_Tp*> : __type_traits_aux<1> {};
+#endif
+
+// The following could be written in terms of numeric_limits.
+// We're doing it separately to reduce the number of dependencies.
+
+template <class _Tp> struct _Is_integer {
+ typedef __false_type _Integral;
+};
+
+#ifndef _STLP_NO_BOOL
+
+_STLP_TEMPLATE_NULL struct _Is_integer<bool> {
+ typedef __true_type _Integral;
+};
+
+#endif /* _STLP_NO_BOOL */
+
+_STLP_TEMPLATE_NULL struct _Is_integer<char> {
+ typedef __true_type _Integral;
+};
+
+#ifndef _STLP_NO_SIGNED_BUILTINS
+
+_STLP_TEMPLATE_NULL struct _Is_integer<signed char> {
+ typedef __true_type _Integral;
+};
+#endif
+
+_STLP_TEMPLATE_NULL struct _Is_integer<unsigned char> {
+ typedef __true_type _Integral;
+};
+
+#if defined ( _STLP_HAS_WCHAR_T ) && ! defined (_STLP_WCHAR_T_IS_USHORT)
+
+_STLP_TEMPLATE_NULL struct _Is_integer<wchar_t> {
+ typedef __true_type _Integral;
+};
+
+#endif /* _STLP_HAS_WCHAR_T */
+
+_STLP_TEMPLATE_NULL struct _Is_integer<short> {
+ typedef __true_type _Integral;
+};
+
+_STLP_TEMPLATE_NULL struct _Is_integer<unsigned short> {
+ typedef __true_type _Integral;
+};
+
+_STLP_TEMPLATE_NULL struct _Is_integer<int> {
+ typedef __true_type _Integral;
+};
+
+_STLP_TEMPLATE_NULL struct _Is_integer<unsigned int> {
+ typedef __true_type _Integral;
+};
+
+_STLP_TEMPLATE_NULL struct _Is_integer<long> {
+ typedef __true_type _Integral;
+};
+
+_STLP_TEMPLATE_NULL struct _Is_integer<unsigned long> {
+ typedef __true_type _Integral;
+};
+
+#ifdef _STLP_LONG_LONG
+
+_STLP_TEMPLATE_NULL struct _Is_integer<_STLP_LONG_LONG> {
+ typedef __true_type _Integral;
+};
+
+_STLP_TEMPLATE_NULL struct _Is_integer<unsigned _STLP_LONG_LONG> {
+ typedef __true_type _Integral;
+};
+
+#endif /* _STLP_LONG_LONG */
+
+template <class _Tp1, class _Tp2>
+struct _OKToMemCpy {
+ enum { _Same = _IsSame<_Tp1,_Tp2>::_Ret } ;
+ typedef typename __type_traits<_Tp1>::has_trivial_assignment_operator _Tr1;
+ typedef typename __type_traits<_Tp2>::has_trivial_assignment_operator _Tr2;
+ typedef typename __bool2type< _Same >::_Ret _Tr3;
+ typedef typename _Land3<_Tr1, _Tr2, _Tr3>::_Ret _Type;
+ static _Type _Ret() { return _Type(); }
+};
+
+template <class _Tp1, class _Tp2>
+inline _OKToMemCpy<_Tp1, _Tp2> _IsOKToMemCpy(_Tp1*, _Tp2*) {
+ return _OKToMemCpy<_Tp1, _Tp2>();
+}
+
+template <class _Tp>
+struct _IsPOD {
+ typedef typename __type_traits<_Tp>::is_POD_type _Type;
+ static _Type _Ret() { return _Type(); }
+};
+
+template <class _Tp>
+inline _IsPOD<_Tp> _Is_POD (_Tp*) { return _IsPOD<_Tp>(); }
+
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+# if defined (__BORLANDC__) || defined (__SUNPRO_CC) || ( defined (__MWERKS__) && (__MWERKS__ <= 0x2303)) || ( defined (__sgi) && defined (_COMPILER_VERSION)) || defined (__DMC__)
+# define _IS_POD_ITER(_It, _Tp) __type_traits< typename iterator_traits< _Tp >::value_type >::is_POD_type()
+# else
+# define _IS_POD_ITER(_It, _Tp) typename __type_traits< typename iterator_traits< _Tp >::value_type >::is_POD_type()
+# endif
+# else
+# define _IS_POD_ITER(_It, _Tp) _Is_POD( _STLP_VALUE_TYPE( _It, _Tp ) )._Ret()
+# endif
+
+# ifdef _STLP_DEFAULT_CONSTRUCTOR_BUG
+// Those adaptors are here to fix common compiler bug regarding builtins:
+// expressions like int k = int() should initialize k to 0
+template <class _Tp>
+inline _Tp __default_constructed_aux(_Tp*, const __false_type&) {
+ return _Tp();
+}
+template <class _Tp>
+inline _Tp __default_constructed_aux(_Tp*, const __true_type&) {
+ return _Tp(0);
+}
+
+template <class _Tp>
+inline _Tp __default_constructed(_Tp* __p) {
+ typedef typename _Is_integer<_Tp>::_Integral _Is_Integral;
+ return __default_constructed_aux(__p, _Is_Integral());
+}
+
+# define _STLP_DEFAULT_CONSTRUCTED(_TTp) __default_constructed((_TTp*)0)
+# else
+# define _STLP_DEFAULT_CONSTRUCTED(_TTp) _TTp()
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* __TYPE_TRAITS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/wrappers/_deque.h b/src/STLport/stl/wrappers/_deque.h
new file mode 100644
index 0000000..0a79713
--- /dev/null
+++ b/src/STLport/stl/wrappers/_deque.h
@@ -0,0 +1,76 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_INTERNAL_DEQUE_H
+# include <stl/_deque.h>
+#endif
+
+# if defined (_STLP_DEBUG)
+# define _DEQUE_SUPER_NAME _DBG_deque
+# else
+# define _DEQUE_SUPER_NAME __deque__
+# endif
+
+# define _DEQUE_SUPER _DEQUE_SUPER_NAME<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+
+_STLP_BEGIN_NAMESPACE
+
+// provide a "default" deque adaptor
+template <class _Tp>
+class deque : public _DEQUE_SUPER {
+public:
+ typedef deque<_Tp> _Self;
+ typedef _DEQUE_SUPER _Super;
+ __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+ __IMPORT_SUPER_COPY_ASSIGNMENT(deque, _Self, _DEQUE_SUPER)
+ deque() : _DEQUE_SUPER() { }
+ deque(size_type __n, const _Tp& __value) : _DEQUE_SUPER(__n, __value) { }
+ explicit deque(size_type __n) : _DEQUE_SUPER(__n) { }
+ deque(const _Tp* __first, const _Tp* __last) : _DEQUE_SUPER(__first, __last) { }
+ deque(const_iterator __first, const_iterator __last) : _DEQUE_SUPER(__first, __last) { }
+ ~deque() { }
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+template <class _Tp>
+inline bool
+operator==(const deque<_Tp>& __x, const deque<_Tp>& __y) {
+ return __x.size() == __y.size() && equal(__x.begin(), __x.end(), __y.begin());
+}
+
+template <class _Tp>
+inline bool
+operator<(const deque<_Tp>& __x, const deque<_Tp>& __y) {
+ return lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
+}
+# endif /* BASE_MATCH_BUG */
+
+# undef _DEQUE_SUPER
+
+_STLP_END_NAMESPACE
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_hash_map.h b/src/STLport/stl/wrappers/_hash_map.h
new file mode 100644
index 0000000..952f3e5
--- /dev/null
+++ b/src/STLport/stl/wrappers/_hash_map.h
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 1999, 2000
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_HASH_MAP_H
+#define _STLP_INTERNAL_WRAP_HASH_MAP_H
+
+#ifndef _STLP_INTERNAL_HASH_MAP_H
+# include <stl/_hash_map.h>
+#endif
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT {
+# endif
+
+// provide a "default" hash_map adaptor
+# if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS)
+# define __HM_TEMPLATE_HEADER template <class _Key, class _Tp>
+# define __HM_ARGUMENTS _Key, _Tp
+# define __HM_BASE_ARGUMENTS _Key, _Tp, hash<_Key>, equal_to<_Key>, _STLP_DEFAULT_PAIR_ALLOCATOR(const _Key, _Tp)
+# else
+# define __HM_TEMPLATE_HEADER template <class _Key, class _Tp, class _HashFcn, class _EqualKey >
+# define __HM_ARGUMENTS _Key, _Tp, _HashFcn, _EqualKey
+# define __HM_BASE_ARGUMENTS _Key, _Tp, _HashFcn, _EqualKey, _STLP_DEFAULT_PAIR_ALLOCATOR(const _Key, _Tp)
+# endif
+
+
+# define __HM_SUPER __hash_map< __HM_BASE_ARGUMENTS >
+# define __HMM_SUPER __hash_multimap< __HM_BASE_ARGUMENTS >
+
+__HM_TEMPLATE_HEADER
+class hash_map : public __HM_SUPER
+{
+ typedef hash_map< __HM_ARGUMENTS > _Self;
+public:
+ typedef __HM_SUPER _Super;
+ __IMPORT_WITH_ITERATORS(_Super)
+ typedef typename _Super::key_type key_type;
+ typedef typename _Super::hasher hasher;
+ typedef typename _Super::key_equal key_equal;
+ typedef _Tp data_type;
+ hash_map() {}
+ hash_map(size_type __n) : __HM_SUPER(__n) {}
+ hash_map(size_type __n, const hasher& __hf) : __HM_SUPER(__n, __hf) {}
+ hash_map(size_type __n, const hasher& __hf, const key_equal& __eql): __HM_SUPER(__n, __hf, __eql) {}
+ hash_map(const value_type* __f, const value_type* __l) : __HM_SUPER(__f,__l) {}
+ hash_map(const value_type* __f, const value_type* __l, size_type __n): __HM_SUPER(__f,__l,__n) {}
+ hash_map(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf) : __HM_SUPER(__f,__l,__n,__hf) {}
+ hash_map(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql) : __HM_SUPER(__f,__l,__n,__hf, __eql) {}
+ hash_map(const_iterator __f, const_iterator __l) : __HM_SUPER(__f,__l) { }
+ hash_map(const_iterator __f, const_iterator __l, size_type __n) : __HM_SUPER(__f,__l,__n) { }
+ hash_map(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf) : __HM_SUPER(__f, __l, __n, __hf) { }
+ hash_map(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql) : __HM_SUPER(__f, __l, __n, __hf, __eql) { }
+# if defined (_STLP_BASE_MATCH_BUG)
+ friend inline bool operator== _STLP_NULL_TMPL_ARGS (const _Self& __hm1, const _Self& __hm2);
+# endif
+};
+
+
+# if defined (_STLP_BASE_MATCH_BUG)
+__HM_TEMPLATE_HEADER
+inline bool operator==(const hash_map< __HM_ARGUMENTS >& __hm1,
+ const hash_map< __HM_ARGUMENTS >& __hm2)
+{
+ typedef __HM_SUPER _Super;
+ return (const _Super&)__hm1 == (const _Super&)__hm2;
+}
+# endif
+
+// provide a "default" hash_multimap adaptor
+__HM_TEMPLATE_HEADER
+class hash_multimap : public __HMM_SUPER
+{
+ typedef hash_multimap< __HM_ARGUMENTS > _Self;
+public:
+ typedef __HMM_SUPER _Super;
+ __IMPORT_WITH_ITERATORS(_Super)
+ typedef typename _Super::key_type key_type;
+ typedef typename _Super::hasher hasher;
+ typedef typename _Super::key_equal key_equal;
+ typedef _Tp data_type;
+ hash_multimap() {}
+ hash_multimap(size_type __n) : __HMM_SUPER(__n) {}
+ hash_multimap(size_type __n, const hasher& __hf) : __HMM_SUPER(__n, __hf) {}
+ hash_multimap(size_type __n, const hasher& __hf, const key_equal& __eql): __HMM_SUPER(__n, __hf, __eql) {}
+ hash_multimap(const value_type* __f, const value_type* __l) : __HMM_SUPER(__f,__l) {}
+ hash_multimap(const value_type* __f, const value_type* __l, size_type __n): __HMM_SUPER(__f,__l,__n) {}
+ hash_multimap(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf) : __HMM_SUPER(__f,__l,__n,__hf) {}
+ hash_multimap(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql) : __HMM_SUPER(__f,__l,__n,__hf, __eql) {}
+
+ hash_multimap(const_iterator __f, const_iterator __l) : __HMM_SUPER(__f,__l) { }
+ hash_multimap(const_iterator __f, const_iterator __l, size_type __n) : __HMM_SUPER(__f,__l,__n) { }
+ hash_multimap(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf) : __HMM_SUPER(__f, __l, __n, __hf) { }
+ hash_multimap(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql) : __HMM_SUPER(__f, __l, __n, __hf, __eql) { }
+# if defined (_STLP_BASE_MATCH_BUG)
+ friend inline bool operator== _STLP_NULL_TMPL_ARGS (const _Self& __hm1, const _Self& __hm2);
+# endif
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+__HM_TEMPLATE_HEADER
+inline bool operator==(const hash_multimap< __HM_ARGUMENTS >& __hm1,
+ const hash_multimap< __HM_ARGUMENTS >& __hm2)
+{
+ typedef __HMM_SUPER _Super;
+ return (const _Super&)__hm1 == (const _Super&)__hm2;
+}
+# endif
+
+# undef __HM_SUPER
+# undef __HMM_SUPER
+# undef __HM_TEMPLATE_HEADER
+# undef __HM_ARGUMENTS
+# undef __HM_BASE_ARGUMENTS
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_HASH_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_hash_set.h b/src/STLport/stl/wrappers/_hash_set.h
new file mode 100644
index 0000000..e5af83c
--- /dev/null
+++ b/src/STLport/stl/wrappers/_hash_set.h
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 1999, 2000
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_HASH_SET_H
+#define _STLP_INTERNAL_WRAP_HASH_SET_H
+
+#ifndef _STLP_INTERNAL_HASH_SET_H
+# include <stl/_hash_set.h>
+#endif
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT {
+# endif
+
+# if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS)
+# define __HS_TEMPLATE_HEADER template <class _Value>
+# define __HS_ARGUMENTS _Value
+# define __HS_BASE_ARGUMENTS _Value, hash<_Value>, equal_to<_Value>, _STLP_DEFAULT_ALLOCATOR(_Value)
+# else
+# define __HS_TEMPLATE_HEADER template <class _Value, class _HashFcn, class _EqualKey >
+# define __HS_ARGUMENTS _Value, _HashFcn, _EqualKey
+# define __HS_BASE_ARGUMENTS _Value, _HashFcn, _EqualKey, _STLP_DEFAULT_ALLOCATOR(_Value)
+# endif
+
+
+# define __HS_SUPER __hash_set< __HS_BASE_ARGUMENTS >
+# define __HMS_SUPER __hash_multiset< __HS_BASE_ARGUMENTS >
+
+
+// provide a "default" hash_set adaptor
+__HS_TEMPLATE_HEADER
+class hash_set : public __HS_SUPER
+{
+ typedef hash_set< __HS_ARGUMENTS > _Self;
+public:
+ typedef __HS_SUPER _Super;
+ __IMPORT_WITH_ITERATORS(_Super)
+ typedef typename _Super::key_type key_type;
+ typedef typename _Super::hasher hasher;
+ typedef typename _Super::key_equal key_equal;
+ hash_set() {}
+ hash_set(size_type n) : __HS_SUPER(n) {}
+ hash_set(size_type n, const hasher& hf) : __HS_SUPER(n, hf) {}
+ hash_set(size_type n, const hasher& hf, const key_equal& eql): __HS_SUPER(n, hf, eql) {}
+
+ hash_set(const value_type* f, const value_type* l) : __HS_SUPER(f,l) {}
+ hash_set(const value_type* f, const value_type* l, size_type n): __HS_SUPER(f,l,n) {}
+ hash_set(const value_type* f, const value_type* l, size_type n,
+ const hasher& hf) : __HS_SUPER(f,l,n,hf) {}
+ hash_set(const value_type* f, const value_type* l, size_type n,
+ const hasher& hf, const key_equal& eql) : __HS_SUPER(f,l,n,hf, eql) {}
+
+ hash_set(const_iterator f, const_iterator l) : __HS_SUPER(f,l) { }
+ hash_set(const_iterator f, const_iterator l, size_type n) : __HS_SUPER(f,l,n) { }
+ hash_set(const_iterator f, const_iterator l, size_type n,
+ const hasher& hf) : __HS_SUPER(f, l, n, hf) { }
+ hash_set(const_iterator f, const_iterator l, size_type n,
+ const hasher& hf, const key_equal& eql) : __HS_SUPER(f, l, n, hf, eql) { }
+# if defined (_STLP_BASE_MATCH_BUG)
+ friend inline bool operator== _STLP_NULL_TMPL_ARGS (const _Self& hs1, const _Self& hs2);
+# endif
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+__HS_TEMPLATE_HEADER
+inline bool operator==(const hash_set< __HS_ARGUMENTS >& hs1,
+ const hash_set< __HS_ARGUMENTS >& hs2)
+{
+ typedef __HS_SUPER _Super;
+ return (const _Super&)hs1 == (const _Super&)hs2;
+}
+# endif
+
+// provide a "default" hash_multiset adaptor
+__HS_TEMPLATE_HEADER
+class hash_multiset : public __HMS_SUPER
+{
+ typedef hash_multiset< __HS_ARGUMENTS > _Self;
+public:
+ typedef __HMS_SUPER _Super;
+ __IMPORT_WITH_ITERATORS(_Super)
+ typedef typename _Super::key_type key_type;
+ typedef typename _Super::hasher hasher;
+ typedef typename _Super::key_equal key_equal;
+
+ hash_multiset() {}
+ hash_multiset(size_type __n) : __HMS_SUPER(__n) {}
+ hash_multiset(size_type __n, const hasher& __hf) : __HMS_SUPER(__n, __hf) {}
+ hash_multiset(size_type __n, const hasher& __hf, const key_equal& __eql): __HMS_SUPER(__n, __hf, __eql) {}
+
+ hash_multiset(const value_type* __f, const value_type* __l) : __HMS_SUPER(__f,__l) {}
+ hash_multiset(const value_type* __f, const value_type* __l, size_type __n): __HMS_SUPER(__f,__l,__n) {}
+ hash_multiset(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf) : __HMS_SUPER(__f,__l,__n,__hf) {}
+ hash_multiset(const value_type* __f, const value_type* __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql) : __HMS_SUPER(__f,__l,__n,__hf, __eql) {}
+
+ hash_multiset(const_iterator __f, const_iterator __l) : __HMS_SUPER(__f,__l) { }
+ hash_multiset(const_iterator __f, const_iterator __l, size_type __n) : __HMS_SUPER(__f,__l,__n) { }
+ hash_multiset(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf) : __HMS_SUPER(__f, __l, __n, __hf) { }
+ hash_multiset(const_iterator __f, const_iterator __l, size_type __n,
+ const hasher& __hf, const key_equal& __eql) : __HMS_SUPER(__f, __l, __n, __hf, __eql) { }
+# if defined (_STLP_BASE_MATCH_BUG)
+ friend inline bool operator== _STLP_NULL_TMPL_ARGS (const _Self& __hs1, const _Self& __hs2);
+# endif
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+__HS_TEMPLATE_HEADER
+inline bool operator==(const hash_multiset< __HS_ARGUMENTS >& __hs1,
+ const hash_multiset< __HS_ARGUMENTS >& __hs2)
+{
+ typedef __HMS_SUPER __s;
+ return _STLP_STD::operator==((const __s&)__hs1,(const __s&)__hs2);
+}
+# endif
+
+
+# undef __HS_SUPER
+# undef __HMS_SUPER
+# undef __HS_ARGUMENTS
+# undef __HS_BASE_ARGUMENTS
+# undef __HS_TEMPLATE_HEADER
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_HASH_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_list.h b/src/STLport/stl/wrappers/_list.h
new file mode 100644
index 0000000..4baf5be
--- /dev/null
+++ b/src/STLport/stl/wrappers/_list.h
@@ -0,0 +1,86 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_LIST_H
+#define _STLP_INTERNAL_WRAP_LIST_H
+
+#ifndef _STLP_INTERNAL_LIST_H
+# include <stl/_list.h>
+#endif
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT {
+# endif
+
+# if defined (_STLP_DEBUG)
+# define __LIST_SUPER _DBG_list<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+# else
+# define __LIST_SUPER __list__<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+# endif
+
+
+// provide a "default" list adaptor
+template <class _Tp>
+class list : public __LIST_SUPER
+{
+public:
+ typedef __LIST_SUPER _Super;
+ __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+ __IMPORT_SUPER_COPY_ASSIGNMENT(list, list<_Tp>, __LIST_SUPER)
+ list() { }
+ explicit list(size_type __n, const _Tp& __value) : __LIST_SUPER(__n, __value) { }
+ explicit list(size_type __n) : __LIST_SUPER(__n) { }
+ list(const _Tp* __first, const _Tp* __last) : __LIST_SUPER(__first, __last) { }
+ list(const_iterator __first, const_iterator __last) : __LIST_SUPER(__first, __last) { }
+# undef __LIST_SUPER
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+template <class _Tp>
+inline bool operator==(const list<_Tp>& __x, const list<_Tp>& __y) {
+ typedef typename list<_Tp>::_Super _Super;
+ return operator == ((const _Super&)__x,(const _Super&)__y);
+}
+
+template <class _Tp>
+inline bool operator<(const list<_Tp>& __x, const list<_Tp>& __y) {
+ return lexicographical_compare(__x.begin(), __x.end(),
+ __y.begin(), __y.end());
+}
+# endif
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_LIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_map.h b/src/STLport/stl/wrappers/_map.h
new file mode 100644
index 0000000..3ad9940
--- /dev/null
+++ b/src/STLport/stl/wrappers/_map.h
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 1999, 2000
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_MAP_H
+#define _STLP_INTERNAL_WRAP_MAP_H
+
+#ifndef _STLP_INTERNAL_MAP_H
+# include <stl/_map.h>
+#endif
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT {
+# endif
+
+# if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS)
+# define __MAP_TEMPLATE_HEADER template <class _Key, class _Tp>
+# define __MAP_ARGUMENTS _Key, _Tp
+# define __MMAP_TEMPLATE_HEADER template <class _Key, class _Tp>
+# define __MMAP_ARGUMENTS _Key, _Tp
+# define _Compare less<_Key>
+# else
+# define __MAP_TEMPLATE_HEADER template <class _Key, class _Tp, class _Compare >
+# define __MAP_ARGUMENTS _Key, _Tp, _Compare
+# define __MMAP_TEMPLATE_HEADER template <class _Key, class _Tp, class _Compare >
+# define __MMAP_ARGUMENTS _Key, _Tp, _Compare
+# endif
+
+
+# define __MAP_SUPER __map< _Key, _Tp, _Compare, _STLP_DEFAULT_PAIR_ALLOCATOR(const _Key, _Tp) >
+# define __MMAP_SUPER __multimap< _Key, _Tp, _Compare, _STLP_DEFAULT_PAIR_ALLOCATOR(const _Key, _Tp) >
+
+// provide a "default" map adaptor
+__MAP_TEMPLATE_HEADER
+class map : public __MAP_SUPER
+{
+ typedef map< __MAP_ARGUMENTS > _Self;
+public:
+ typedef __MAP_SUPER _Super;
+ __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+ __IMPORT_SUPER_COPY_ASSIGNMENT(map, _Self, __MAP_SUPER)
+ map() : __MAP_SUPER(_Compare()) {}
+ explicit map(const _Compare& __comp) : __MAP_SUPER(__comp) {}
+ map(const typename _Super::value_type* __first,
+ const typename _Super::value_type* __last) :
+ __MAP_SUPER(__first, __last, _Compare()) { }
+ map(const typename _Super::value_type* __first,
+ const typename _Super::value_type* __last,
+ const _Compare& __comp) : __MAP_SUPER(__first, __last, __comp) { }
+ map(typename _Super::const_iterator __first,
+ typename _Super::const_iterator __last) :
+ __MAP_SUPER(__first, __last, _Compare()) { }
+ map(typename _Super::const_iterator __first,
+ typename _Super::const_iterator __last,
+ const _Compare& __comp) : __MAP_SUPER(__first, __last, __comp) { }
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+__MAP_TEMPLATE_HEADER
+inline bool operator==(const map< __MAP_ARGUMENTS >& __x,
+ const map< __MAP_ARGUMENTS >& __y) {
+ typedef __MAP_SUPER _Super;
+ return operator==((const _Super&)__x,(const _Super&)__y);
+}
+
+__MAP_TEMPLATE_HEADER
+inline bool operator<(const map< __MAP_ARGUMENTS >& __x,
+ const map< __MAP_ARGUMENTS >& __y) {
+ typedef __MAP_SUPER _Super;
+ return operator < ((const _Super&)__x,(const _Super&)__y);
+}
+# endif /* _STLP_BASE_MATCH_BUG */
+
+
+// provide a "default" multimap adaptor
+__MMAP_TEMPLATE_HEADER
+class multimap : public __MMAP_SUPER
+{
+ typedef multimap< __MMAP_ARGUMENTS > _Self;
+public:
+ typedef __MMAP_SUPER _Super;
+ __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+ // copy & assignment from super
+ __IMPORT_SUPER_COPY_ASSIGNMENT(multimap, _Self, __MMAP_SUPER)
+ multimap() : __MMAP_SUPER(_Compare()) {}
+ explicit multimap(const _Compare& __comp) : __MMAP_SUPER(__comp) {}
+ multimap(const typename _Super::value_type* __first,
+ const typename _Super::value_type* __last) :
+ __MMAP_SUPER(__first, __last, _Compare()) { }
+ multimap(const typename _Super::value_type* __first,
+ const typename _Super::value_type* __last,
+ const _Compare& __comp) : __MMAP_SUPER(__first, __last, __comp) { }
+ multimap(typename _Super::const_iterator __first,
+ typename _Super::const_iterator __last) :
+ __MMAP_SUPER(__first, __last, _Compare()) { }
+ multimap(typename _Super::const_iterator __first,
+ typename _Super::const_iterator __last,
+ const _Compare& __comp) : __MMAP_SUPER(__first, __last, __comp) { }
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+__MMAP_TEMPLATE_HEADER
+inline bool operator==(const multimap< __MMAP_ARGUMENTS >& __x,
+ const multimap< __MMAP_ARGUMENTS >& __y) {
+ typedef __MMAP_SUPER _Super;
+ return (const _Super&)__x == (const _Super&)__y;
+}
+
+__MMAP_TEMPLATE_HEADER
+inline bool operator<(const multimap< __MMAP_ARGUMENTS >& __x,
+ const multimap< __MMAP_ARGUMENTS >& __y) {
+ typedef __MMAP_SUPER _Super;
+ return (const _Super&)__x < (const _Super&)__y;
+}
+# endif
+
+# undef __MMAP_TEMPLATE_HEADER
+# undef __MMAP_ARGUMENTS
+# undef __MMAP_SUPER
+
+# undef __MAP_TEMPLATE_HEADER
+# undef __MAP_ARGUMENTS
+# undef __MAP_SUPER
+
+# undef _Compare
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_WRAP_MAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_mmap.h b/src/STLport/stl/wrappers/_mmap.h
new file mode 100644
index 0000000..49a32f6
--- /dev/null
+++ b/src/STLport/stl/wrappers/_mmap.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999, 2000
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_MULTIMAP_H
+#define _STLP_INTERNAL_WRAP_MULTIMAP_H
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT {
+# endif
+
+# if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS)
+# define _Compare less<_Key>
+# else
+# endif
+
+# if defined (_STLP_DEBUG) && ! defined (_STLP_USE_NAMESPACES)
+# else
+
+# endif
+
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_WRAP_MULTIMAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_set.h b/src/STLport/stl/wrappers/_set.h
new file mode 100644
index 0000000..3785cc1
--- /dev/null
+++ b/src/STLport/stl/wrappers/_set.h
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 1999, 2000
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_SET_H
+#define _STLP_INTERNAL_WRAP_SET_H
+
+#ifndef _STLP_INTERNAL_SET_H
+# include <stl/_set.h>
+#endif
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT {
+# endif
+
+# if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS)
+# define __SET_TEMPLATE_HEADER template <class _Key>
+# define __SET_ARGUMENTS _Key
+# define __MSET_TEMPLATE_HEADER template <class _Key>
+# define __MSET_ARGUMENTS _Key
+# define _Compare less<_Key>
+# else
+# define __SET_TEMPLATE_HEADER template <class _Key, class _Compare >
+# define __SET_ARGUMENTS _Key, _Compare
+# define __MSET_TEMPLATE_HEADER template <class _Key, class _Compare >
+# define __MSET_ARGUMENTS _Key, _Compare
+# endif
+
+# define __SET_SUPER __set< _Key, _Compare, _STLP_DEFAULT_ALLOCATOR(_Key) >
+# define __MSET_SUPER __multiset< _Key, _Compare, _STLP_DEFAULT_ALLOCATOR(_Key) >
+
+// provide a "default" set adaptor
+__SET_TEMPLATE_HEADER
+class set : public __SET_SUPER
+{
+ typedef set< __SET_ARGUMENTS > _Self;
+public:
+ typedef __SET_SUPER _Super;
+ __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+ // copy & assignment from super
+ __IMPORT_SUPER_COPY_ASSIGNMENT(set,_Self,__SET_SUPER)
+ // specific constructors
+ explicit set() : __SET_SUPER(_Compare()) {}
+ explicit set(const _Compare& __comp) : __SET_SUPER(__comp) {}
+ set(const value_type* __first, const value_type* __last) :
+ __SET_SUPER(__first, __last, _Compare()) { }
+ set(const value_type* __first, const value_type* __last,
+ const _Compare& __comp) : __SET_SUPER(__first, __last, __comp) { }
+ set(const_iterator __first, const_iterator __last) :
+ __SET_SUPER(__first, __last, _Compare()) { }
+ set(const_iterator __first, const_iterator __last,
+ const _Compare& __comp) : __SET_SUPER(__first, __last, __comp) { }
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+__SET_TEMPLATE_HEADER
+inline bool operator==(const set< __SET_ARGUMENTS >& __x,
+ const set< __SET_ARGUMENTS >& __y) {
+ typedef __SET_SUPER _Super;
+ return operator==((const _Super&)__x,(const _Super&)__y);
+}
+
+__SET_TEMPLATE_HEADER
+inline bool operator<(const set< __SET_ARGUMENTS >& __x,
+ const set< __SET_ARGUMENTS >& __y) {
+ typedef __SET_SUPER _Super;
+ return operator < ((const _Super&)__x , (const _Super&)__y);
+}
+# endif
+
+// provide a "default" multiset adaptor
+__MSET_TEMPLATE_HEADER
+class multiset : public __MSET_SUPER
+{
+ typedef multiset< __MSET_ARGUMENTS > _Self;
+public:
+ typedef __MSET_SUPER _Super;
+ __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+ // copy & assignment from super
+ __IMPORT_SUPER_COPY_ASSIGNMENT(multiset, _Self, __MSET_SUPER)
+ explicit multiset() : __MSET_SUPER(_Compare()) {}
+ explicit multiset(const _Compare& __comp) : __MSET_SUPER(__comp) {}
+ multiset(const value_type* __first, const value_type* __last) :
+ __MSET_SUPER(__first, __last, _Compare()) { }
+ multiset(const value_type* __first, const value_type* __last,
+ const _Compare& __comp) : __MSET_SUPER(__first, __last, __comp) { }
+ multiset(const_iterator __first, const_iterator __last) :
+ __MSET_SUPER(__first, __last, _Compare()) { }
+ multiset(const_iterator __first, const_iterator __last,
+ const _Compare& __comp) : __MSET_SUPER(__first, __last, __comp) { }
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+__MSET_TEMPLATE_HEADER
+inline bool operator==(const multiset< __MSET_ARGUMENTS >& __x,
+ const multiset< __MSET_ARGUMENTS >& __y) {
+ typedef __MSET_SUPER _Super;
+ return (const _Super&)__x == (const _Super&)__y;
+}
+
+__MSET_TEMPLATE_HEADER
+inline bool operator<(const multiset< __MSET_ARGUMENTS >& __x,
+ const multiset< __MSET_ARGUMENTS >& __y) {
+ typedef __MSET_SUPER _Super;
+ return (const _Super&)__x < (const _Super&)__y;
+}
+# endif
+
+# undef __MSET_TEMPLATE_HEADER
+# undef __MSET_ARGUMENTS
+# undef __MSET_SUPER
+
+# undef __SET_TEMPLATE_HEADER
+# undef __SET_ARGUMENTS
+# undef __SET_SUPER
+# undef _Compare
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_WRAP_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_slist.h b/src/STLport/stl/wrappers/_slist.h
new file mode 100644
index 0000000..ffa8de1
--- /dev/null
+++ b/src/STLport/stl/wrappers/_slist.h
@@ -0,0 +1,83 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_SLIST_H
+#define _STLP_INTERNAL_WRAP_SLIST_H
+
+#ifndef _STLP_INTERNAL_SLIST_H
+# include <stl/_slist.h>
+#endif
+
+# if defined (_STLP_DEBUG)
+# define __SL_SUPER _DBG_slist<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+# else
+# define __SL_SUPER __slist__<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+# endif
+
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT {
+# endif
+
+// provide a "default" list adaptor
+template <class _Tp>
+class slist : public __SL_SUPER
+{
+public:
+ typedef __SL_SUPER _Super;
+ __IMPORT_WITH_ITERATORS(_Super)
+ __IMPORT_SUPER_COPY_ASSIGNMENT(slist, slist<_Tp>, __SL_SUPER)
+ slist() { }
+ explicit slist(size_type __n, const _Tp& __value) : __SL_SUPER(__n, __value) { }
+ explicit slist(size_type __n) : __SL_SUPER(__n) { }
+ slist(const _Tp* __first, const _Tp* __last) : __SL_SUPER(__first, __last) { }
+ slist(const_iterator __first, const_iterator __last) : __SL_SUPER(__first, __last) { }
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+template <class _Tp>
+inline bool operator==(const slist<_Tp>& __x, const slist<_Tp>& __y) {
+ typedef typename slist<_Tp>::_Super _Super;
+ return operator == ((const _Super&)__x,(const _Super&)__y);
+}
+
+template <class _Tp>
+inline bool operator<(const slist<_Tp>& __x, const slist<_Tp>& __y) {
+ typedef typename slist<_Tp>::_Super _Super;
+ return operator < ((const _Super&)__x,(const _Super&)__y);
+}
+# endif
+# undef __SL_SUPER
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_WRAP_SLIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_vector.h b/src/STLport/stl/wrappers/_vector.h
new file mode 100644
index 0000000..ff42bc6
--- /dev/null
+++ b/src/STLport/stl/wrappers/_vector.h
@@ -0,0 +1,89 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_VECTOR_H
+#define _STLP_INTERNAL_WRAP_VECTOR_H
+
+#ifndef _STLP_INTERNAL_VECTOR_H
+# include <stl/_vector.h>
+#endif
+
+# if defined (_STLP_DEBUG)
+# define _VEC_SUPER _DBG_vector<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+# else
+# define _VEC_SUPER __vector__<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+# endif
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT {
+# endif
+
+template <class _Tp>
+class vector : public _VEC_SUPER
+{
+public:
+ typedef _VEC_SUPER _Super;
+ __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+ __IMPORT_SUPER_COPY_ASSIGNMENT(vector, vector<_Tp>, _VEC_SUPER)
+ vector() {}
+ explicit vector(size_type __n, const _Tp& __value) : _VEC_SUPER(__n, __value) { }
+ explicit vector(size_type __n) : _VEC_SUPER(__n) { }
+ vector(const_iterator __first, const_iterator __last) : _VEC_SUPER(__first,__last) { }
+# ifdef _STLP_DEBUG
+ // certainly, no member templates here !
+ vector(const _Tp* __first, const _Tp* __last) : _VEC_SUPER(__first,__last) { }
+# endif
+ ~vector() {}
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+template <class _Tp>
+inline bool operator==(const vector<_Tp>& __x, const vector<_Tp>& __y) {
+ return __x.size() == __y.size() &&
+ equal(__x.begin(), __x.end(), __y.begin());
+}
+
+template <class _Tp>
+inline bool operator<(const vector<_Tp>& __x, const vector<_Tp>& __y) {
+ return lexicographical_compare(__x.begin(), __x.end(),
+ __y.begin(), __y.end());
+}
+# endif /* _STLP_BASE_MATCH_BUG */
+# undef _VEC_SUPER
+
+// close std namespace
+# ifdef _STLP_USE_NAMESPACES
+}
+# endif
+
+#endif /* _STLP_WRAP_VECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl_user_config.h b/src/STLport/stl_user_config.h
new file mode 100644
index 0000000..2fdcccd
--- /dev/null
+++ b/src/STLport/stl_user_config.h
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ * Purpose of this file :
+ *
+ * To hold user-definable portion of STLport settings which may be overridden
+ * on per-project basis.
+ * Please note that if you use STLport iostreams (compiled library) then you have
+ * to use consistent settings when you compile STLport library and your project.
+ * Those settings are defined in _site_config.h and have to be the same for a given
+ * STLport installation.
+ *
+ */
+
+
+//==========================================================
+// User-settable macros that control compilation:
+// Features selection
+//==========================================================
+
+/* _STLP_NO_OWN_IOSTREAMS:
+ * __STL_NO_SGI_IOSTREAMS (in older versions)
+ * This is major configuration switch.
+ * Turn it on to disable use of SGI iostreams and use wrappers
+ * around your compiler's iostreams, like before.
+ * Keep it off if you want to use SGI iostreams
+ * (Note that in this case you have to compile library in ../src
+ * and supply resulting library at link time).
+ *
+ */
+
+ # define _STLP_NO_OWN_IOSTREAMS 1
+
+
+/*
+ * This macro only works in non-SGI iostreams mode.
+ *
+ * Uncomment to suppress using new-style streams even if they are
+ * available.
+ * Beware - _STLP_USE_OWN_NAMESPACE depends on this macro, too.
+ * Do that only if you are absolutely sure backwards-compatible
+ * <iostream.h> is not actually a wrapper with <iostream>
+ * Hint : In VC++ 6.x, they are not.
+ */
+
+// #define _STLP_NO_NEW_IOSTREAMS 1
+
+/*
+ * Use this switch for embedded systems where no iostreams are available
+ * at all. STLport own iostreams will also get disabled automatically then.
+ */
+// # define _STLP_NO_IOSTREAMS 1
+
+/*
+ * Set _STLP_DEBUG to turn the "Debug Mode" on.
+ * That gets you checked iterators/ranges in the manner
+ * of "Safe STL". Very useful for debugging. Thread-safe.
+ * Please do not forget to link proper STLport library flavor
+ * (e.g libstlport_gcc_stldebug.a) when you set this flag in STLport iostreams mode.
+ */
+//#define _STLP_DEBUG 1
+
+
+/*
+ *
+ * _STLP_NO_CUSTOM_IO : define this if you do not instantiate basic_xxx iostream classes with custom types (which is most likely the case).
+ * Custom means types other than char, wchar and char_traits<>,
+ * like basic_ostream<my_char_type, my_traits<my_char_type> >
+ * When this option is on, most non-inline template functions definitions for iostreams are not seen by the client.
+ * Default is off, just not to break compilation for those who do use those types.
+ * which saves a lot of compile time for most compilers, also object and executable size for some.
+ * That also guarantees that you still use optimized standard i/o when you compile your program without optimization.
+ * Option does not affect STLport library build; you may use the same binary library with and without this option,
+ * on per-project basis.
+ *
+ */
+//#define _STLP_NO_CUSTOM_IO
+
+
+/*
+ * _STLP_NO_RELOPS_NAMESPACE: if defined, don't put the relational
+ * operator templates (>, <=. >=, !=) in namespace std::rel_ops, even
+ * if the compiler supports namespaces.
+ * Note : if the compiler do not support namespaces, those operators are not be provided by default,
+ * to simulate hiding them into rel_ops. This was proved to resolve many compiler bugs with ambiguity.
+ */
+
+// #define _STLP_NO_RELOPS_NAMESPACE 1
+
+
+/*
+ * If _STLP_USE_OWN_NAMESPACE is in effect, STLport by default will not try
+ * to rename std:: for the user
+ * to _STL::. If you do want this feature, please define the following switch :
+ */
+// # define _STLP_REDEFINE_STD 1
+
+
+/*
+ * _STLP_WHOLE_NATIVE_STD : only meaningful in _STLP_USE_OWN_NAMESPACE mode.
+ * Normally, STLport only imports necessary components from native std:: namespace -
+ * those not yet provided by STLport (<iostream>, <complex>, etc.)
+ * and their dependencies (<string>, <stdexcept>).
+ * You might want everything from std:: being available in std:: namespace when you
+ * include corresponding STLport header (like STLport <map> provides std::map as well, etc.),
+ * if you are going to use both stlport:: and std:: components in your code.
+ * Otherwise this option is not recommended as it increases the size of your object files
+ * and slows down compilation.
+ */
+// # define _STLP_WHOLE_NATIVE_STD
+
+
+/*
+ * Use this option to catch uninitialized members in your classes.
+ * When it is set, construct() and destroy() fill the class storage
+ * with _STLP_SHRED_BYTE (see below).
+ * Note : _STLP_DEBUG and _STLP_DEBUG_ALLOC don't set this option automatically.
+ */
+
+// # define _STLP_DEBUG_UNINITIALIZED 1
+
+/*
+ * Uncomment and provide a definition for the byte with which raw memory
+ * will be filled if _STLP_DEBUG_ALLOC or _STLP_DEBUG_UNINITIALIZED is defined.
+ * Choose a value which is likely to cause a noticeable problem if dereferenced
+ * or otherwise abused. A good value may already be defined for your platform; see
+ * stl_config.h
+ */
+// #define _STLP_SHRED_BYTE 0xA3
+
+/*
+ * This option is for gcc users only and only affects systems where native linker
+ * does not let gcc to implement automatic instantiation of static template data members/
+ * It is being put in this file as there is no way to check if we are using GNU ld automatically,
+ * so it becomes user's responsibility.
+ *
+ */
+
+// #define _STLP_GCC_USES_GNU_LD
+
+
+//==========================================================
+// Compatibility section
+//==========================================================
+
+/*
+ * Define this macro to disable anachronistic constructs (like the ones used in HP STL and
+ * not included in final standard, etc.
+ */
+// define _STLP_NO_ANACHRONISMS 1
+
+/*
+ * Define this macro to disable STLport extensions (for example, to make sure your code will
+ * compile with some other implementation )
+ */
+// define _STLP_NO_EXTENSIONS 1
+
+
+/*
+ * You should define this macro if compiling with MFC - STLport <stl/_config.h>
+ * then include <afx.h> instead of <windows.h> to get synchronisation primitives
+ *
+ */
+
+// # define _STLP_USE_MFC 1
+
+
+// boris : this setting is here as we cannot detect precense of new Platform SDK automatically
+// If you are using new PSDK with VC++ 6.0 or lower, please define this to get correct prototypes for InterlockedXXX functions
+//# define _STLP_NEW_PLATFORM_SDK 1
+
+/*
+ * Use minimum set of default arguments on template classes that have more
+ * than one - for example map<>, set<>.
+ * This has effect only if _STLP_LIMITED_DEFAULT_TEMPLATES is on.
+ * If _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS is set, you'll be able to compile
+ * set<T> with those compilers, but you'll have to use __set__<T, less<T>>
+ *
+ * Affects : map<>, multimap<>, set<>, multiset<>, hash_*<>,
+ * queue<>, priority_queue<>, stack<>, istream_iterator<>
+ */
+
+// # define _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS 1
+
+//==========================================================
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/streambuf b/src/STLport/streambuf
new file mode 100644
index 0000000..b033cfc
--- /dev/null
+++ b/src/STLport/streambuf
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_STREAMBUF
+#define _STLP_STREAMBUF
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1066
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# if defined ( _STLP_OWN_IOSTREAMS )
+# include <stl/_streambuf.h>
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+# include <wrap_std/streambuf>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1066)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STREAMBUF */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/streambuf.h b/src/STLport/streambuf.h
new file mode 100644
index 0000000..378c23c
--- /dev/null
+++ b/src/STLport/streambuf.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_STREAMBUF_H
+# define _STLP_STREAMBUF_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x2067
+# include <stl/_prolog.h>
+# endif
+
+# if defined ( _STLP_OWN_IOSTREAMS )
+
+#ifdef __BORLANDC__
+# include <streambuf.>
+#else
+# include <streambuf>
+#endif
+
+# include <ios.h>
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+ using namespace _STLP_STD;
+# else
+using _STLP_STD::basic_streambuf;
+using _STLP_STD::streambuf;
+# ifndef _STLP_NO_WCHAR_T
+using _STLP_STD::wstreambuf;
+# endif
+# endif
+# endif /* _STLP_HAS_NO_NAMESPACES */
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(streambuf.h)
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2067)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STREAMBUF_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/string b/src/STLport/string
new file mode 100644
index 0000000..d3a8055
--- /dev/null
+++ b/src/STLport/string
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRING
+# define _STLP_STRING
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x68
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+#if defined (_STLP_USE_NATIVE_STRING)
+
+// as part of compiled runtime library depends on it.
+
+# if defined (_STLP_MSVC)
+# include <streambuf>
+# include <istream>
+# endif
+
+# include _STLP_NATIVE_HEADER(string)
+
+# endif /* _STLP_USE_NATIVE_STRING */
+
+# if !defined (_STLP_USE_NATIVE_STRING) || defined (_STLP_USE_OWN_NAMESPACE)
+# include <stl/_string.h>
+# else
+# include <stl/_string_hash.h>
+# endif /*_STLP_USE_NATIVE_STRING */
+
+// cleanup
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x68)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STRING */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/string.h b/src/STLport/string.h
new file mode 100644
index 0000000..47babc3
--- /dev/null
+++ b/src/STLport/string.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x269
+# include <stl/_prolog.h>
+# endif
+
+# if defined (__BORLANDC__)
+# include _STLP_NATIVE_CPP_C_HEADER(_str.h)
+# else
+# include _STLP_NATIVE_C_HEADER(string.h)
+# endif
+
+# if defined (__BORLANDC__) && defined (_STLP_IMPORT_VENDOR_CSTD)
+# include <using/cstring>
+# endif /* BORLAND */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x269)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/strstream b/src/STLport/strstream
new file mode 100644
index 0000000..6f87f19
--- /dev/null
+++ b/src/STLport/strstream
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+// WARNING: The classes defined in this header are DEPRECATED. This
+// header is defined in section D.7.1 of the C++ standard, and it
+// MAY BE REMOVED in a future standard revision. You should use the
+// header <sstream> instead.
+
+
+#ifndef _STLP_STRSTREAM
+#define _STLP_STRSTREAM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x1070
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+# include <stl/_strstream.h>
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+# include <wrap_std/strstream>
+# else
+# include <wrap_std/h/strstream.h>
+# endif
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1070)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STRSTREAM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/strstream.h b/src/STLport/strstream.h
new file mode 100644
index 0000000..6a1978e
--- /dev/null
+++ b/src/STLport/strstream.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRSTREAM_H
+# define _STLP_STRSTREAM_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x2071
+# include <stl/_prolog.h>
+# endif
+
+# if defined ( _STLP_USE_NEW_IOSTREAMS )
+
+// fbp - if we are going to use that consistently, let's do it
+#ifdef __BORLANDC__
+# include <strstream.>
+#else
+# include <strstream>
+#endif
+
+# include <iostream.h>
+
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+
+using namespace _STLP_STD;
+
+# else
+
+using _STLP_STD::strstreambuf;
+using _STLP_STD::istrstream;
+using _STLP_STD::ostrstream;
+using _STLP_STD::strstream;
+
+# endif /* _STLP_BROKEN_USING_DIRECTIVE */
+
+# endif /* _STLP_HAS_NO_NAMESPACES */
+
+# else
+
+
+// just include old-style strstream.h
+# if defined (_MSC_VER) && (_MSC_VER <= 1200)
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(strstrea.h)
+# else
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(strstream.h)
+# endif
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2071)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STRSTREAM_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/time.h b/src/STLport/time.h
new file mode 100644
index 0000000..ccb64b3
--- /dev/null
+++ b/src/STLport/time.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x272
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x272) && ! defined (_STLP_DONT_POP_0x272)
+# define _STLP_DONT_POP_0x272
+# endif
+
+# include _STLP_NATIVE_C_HEADER(time.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x272)
+# if ! defined (_STLP_DONT_POP_0x272)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x272
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/typeinfo b/src/STLport/typeinfo
new file mode 100644
index 0000000..1301bfe
--- /dev/null
+++ b/src/STLport/typeinfo
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_TYPEINFO
+# define _STLP_TYPEINFO
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x473
+# include <stl/_prolog.h>
+# endif
+
+# ifndef _STLP_NO_TYPEINFO
+
+# if defined (_STLP_NO_NEW_NEW_HEADER)
+# include <typeinfo.h>
+# else
+# include _STLP_NATIVE_CPP_RUNTIME_HEADER(typeinfo)
+# endif
+
+# if defined(_STLP_MSVC) && (_STLP_MSVC >= 1300)
+// In .NET, <typeinfo> actually includes <typeinfo.h>
+# undef _STLP_OLDSTD_typeinfo
+# endif
+
+// if <typeinfo.h> already included, do not import anything
+# if defined (_STLP_USE_NAMESPACES) && ! defined (_STLP_OLDSTD_typeinfo) \
+&& ( defined (_STLP_VENDOR_GLOBAL_EXCEPT_STD) || defined (_STLP_USE_OWN_NAMESPACE) || defined (_STLP_DEBUG))
+# if defined(_STLP_MSVC) && (_STLP_MSVC < 1300)
+class bad_cast : public exception {};
+# endif
+_STLP_BEGIN_NAMESPACE
+
+// VC++ 6 has only this guy in ::
+// # if !(defined(_STLP_MSVC)&& (_STLP_MSVC <= 1200))
+using _STLP_VENDOR_EXCEPT_STD::type_info;
+// # endif
+
+# if !(defined(__MRC__) || defined(__SC__) || defined(__DMC__))
+using _STLP_VENDOR_EXCEPT_STD::bad_typeid;
+# endif
+
+//#if defined( __xlC__ ) && (__xlC__ < 0x500)
+//# include <exception>
+//struct bad_cast : exception {};
+//#endif
+# if defined(_STLP_MSVC) && (_STLP_MSVC < 1300)
+using ::bad_cast;
+# else
+using _STLP_VENDOR_EXCEPT_STD::bad_cast;
+# endif
+
+_STLP_END_NAMESPACE
+#endif /* _STLP_OWN_NAMESPACE */
+
+#else
+
+# include <exception>
+_STLP_BEGIN_NAMESPACE
+# ifndef __DMC__
+struct bad_cast : exception {};
+# endif
+_STLP_END_NAMESPACE
+#endif /* NO_TYPEINFO */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x473)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_TYPEINFO */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/typeinfo.h b/src/STLport/typeinfo.h
new file mode 100644
index 0000000..c0ec75d
--- /dev/null
+++ b/src/STLport/typeinfo.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_OLDSTD_typeinfo
+# define _STLP_OLDSTD_typeinfo
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x874
+# include <stl/_prolog.h>
+# endif
+
+# ifndef _STLP_NO_TYPEINFO
+
+#if defined (__GNUC__)
+# undef _STLP_OLDSTD_typeinfo
+# include <typeinfo>
+# define _STLP_OLDSTD_typeinfo
+#else
+# include _STLP_NATIVE_CPP_RUNTIME_HEADER(typeinfo.h)
+#endif
+
+// if <typeinfo> already included, do not import anything
+
+# if defined (_STLP_USE_OWN_NAMESPACE) && ! (defined (_STLP_TYPEINFO) && !defined(_STLP_NO_NEW_NEW_HEADER))
+
+_STLP_BEGIN_NAMESPACE
+
+using /*_STLP_VENDOR_EXCEPT_STD */ :: type_info;
+# if !(defined(__MRC__) || (defined(__SC__) && !defined(__DMC__)))
+using /* _STLP_VENDOR_EXCEPT_STD */ :: bad_typeid;
+# endif
+using /* _STLP_VENDOR_EXCEPT_STD */ :: bad_cast;
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_OWN_NAMESPACE */
+
+# endif /* _STLP_NO_TYPEINFO */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x874)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_OLDSTD_typeinfo */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/using/cstring b/src/STLport/using/cstring
new file mode 100644
index 0000000..5142dda
--- /dev/null
+++ b/src/STLport/using/cstring
@@ -0,0 +1,54 @@
+using _STLP_VENDOR_CSTD::size_t;
+
+# ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+# if defined(__MSL__) && __MC68K__ && !_No_BlockMove && __dest_os == __mac_os
+# undef memcpy
+# undef memmove
+inline void* memcpy(void* dst, const void* src, size_t len)
+{
+ return _STLP_VENDOR_CSTD::__memcpy(dst, src, len);
+}
+inline void* memmove(void* dst, const void* src, size_t len)
+{
+ return _STLP_VENDOR_CSTD::__memmove(dst, src, len);
+}
+# else
+
+ using _STLP_VENDOR_CSTD::memmove;
+ using _STLP_VENDOR_CSTD::memcpy;
+
+# endif
+
+# if ! defined (__BORLANDC__)
+using _STLP_VENDOR_CSTD::memchr;
+using _STLP_VENDOR_CSTD::strchr;
+using _STLP_VENDOR_CSTD::strpbrk;
+using _STLP_VENDOR_CSTD::strrchr;
+using _STLP_VENDOR_CSTD::strstr;
+# endif
+
+using _STLP_VENDOR_CSTD::memcmp;
+using _STLP_VENDOR_CSTD::memset;
+
+using _STLP_VENDOR_CSTD::strcat;
+
+# if !defined (strcmp)
+using _STLP_VENDOR_CSTD::strcmp;
+# endif
+
+using _STLP_VENDOR_CSTD::strcoll;
+# if !defined (strcpy)
+using _STLP_VENDOR_CSTD::strcpy;
+# endif
+using _STLP_VENDOR_CSTD::strcspn;
+using _STLP_VENDOR_CSTD::strerror;
+using _STLP_VENDOR_CSTD::strlen;
+using _STLP_VENDOR_CSTD::strncat;
+using _STLP_VENDOR_CSTD::strncmp;
+
+using _STLP_VENDOR_CSTD::strncpy;
+using _STLP_VENDOR_CSTD::strspn;
+
+using _STLP_VENDOR_CSTD::strtok;
+using _STLP_VENDOR_CSTD::strxfrm;
+# endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
diff --git a/src/STLport/using/export b/src/STLport/using/export
new file mode 100644
index 0000000..2d3afcd
--- /dev/null
+++ b/src/STLport/using/export
@@ -0,0 +1,12 @@
+cstring
+fstream
+iomanip
+ios
+iosfwd
+iostream
+istream
+locale
+ostream
+sstream
+streambuf
+strstream
diff --git a/src/STLport/using/fstream b/src/STLport/using/fstream
new file mode 100644
index 0000000..e79e048
--- /dev/null
+++ b/src/STLport/using/fstream
@@ -0,0 +1,19 @@
+#ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_STD;
+#else
+using _STLP_NEW_IO_NAMESPACE::basic_filebuf;
+using _STLP_NEW_IO_NAMESPACE::filebuf;
+using _STLP_NEW_IO_NAMESPACE::basic_ifstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ofstream;
+using _STLP_NEW_IO_NAMESPACE::ifstream;
+using _STLP_NEW_IO_NAMESPACE::ofstream;
+using _STLP_NEW_IO_NAMESPACE::basic_fstream;
+using _STLP_NEW_IO_NAMESPACE::fstream;
+
+# ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wofstream;
+using _STLP_NEW_IO_NAMESPACE::wfilebuf;
+using _STLP_NEW_IO_NAMESPACE::wifstream;
+using _STLP_NEW_IO_NAMESPACE::wfstream;
+# endif
+#endif
diff --git a/src/STLport/using/h/fstream.h b/src/STLport/using/h/fstream.h
new file mode 100644
index 0000000..6600568
--- /dev/null
+++ b/src/STLport/using/h/fstream.h
@@ -0,0 +1,4 @@
+using ::streambuf;
+using ::ifstream;
+using ::ofstream;
+using ::fstream;
diff --git a/src/STLport/using/h/iomanip.h b/src/STLport/using/h/iomanip.h
new file mode 100644
index 0000000..99e48d9
--- /dev/null
+++ b/src/STLport/using/h/iomanip.h
@@ -0,0 +1,6 @@
+using ::setiosflags;
+using ::resetiosflags;
+// using ::setbase;
+using ::setfill;
+using ::setprecision;
+using ::setw;
diff --git a/src/STLport/using/h/iostream.h b/src/STLport/using/h/iostream.h
new file mode 100644
index 0000000..e85f4e2
--- /dev/null
+++ b/src/STLport/using/h/iostream.h
@@ -0,0 +1,24 @@
+using _STLP_OLD_IO_NAMESPACE::istream;
+using _STLP_OLD_IO_NAMESPACE::ostream;
+
+/* HP aCC include files re-define these when THREAD_SAFE */
+#if !defined(cin)
+using _STLP_OLD_IO_NAMESPACE::cin;
+#endif
+#if !defined(cout)
+using _STLP_OLD_IO_NAMESPACE::cout;
+#endif
+#if !defined(cerr)
+using _STLP_OLD_IO_NAMESPACE::cerr;
+#endif
+#if !defined(clog)
+using _STLP_OLD_IO_NAMESPACE::clog;
+#endif
+
+using _STLP_OLD_IO_NAMESPACE::endl;
+using _STLP_OLD_IO_NAMESPACE::ends;
+
+using _STLP_OLD_IO_NAMESPACE::ios;
+using _STLP_OLD_IO_NAMESPACE::flush;
+
+// using _STLP_OLD_IO_NAMESPACE::ws;
diff --git a/src/STLport/using/h/ostream.h b/src/STLport/using/h/ostream.h
new file mode 100644
index 0000000..6ba3f88
--- /dev/null
+++ b/src/STLport/using/h/ostream.h
@@ -0,0 +1,6 @@
+using _STLP_OLD_IO_NAMESPACE::ostream;
+using _STLP_OLD_IO_NAMESPACE::endl;
+using _STLP_OLD_IO_NAMESPACE::ends;
+using _STLP_OLD_IO_NAMESPACE::flush;
+
+// using _STLP_OLD_IO_NAMESPACE::ws;
diff --git a/src/STLport/using/h/streambuf.h b/src/STLport/using/h/streambuf.h
new file mode 100644
index 0000000..459de3d
--- /dev/null
+++ b/src/STLport/using/h/streambuf.h
@@ -0,0 +1 @@
+using ::streambuf;
diff --git a/src/STLport/using/h/strstream.h b/src/STLport/using/h/strstream.h
new file mode 100644
index 0000000..a7d9f11
--- /dev/null
+++ b/src/STLport/using/h/strstream.h
@@ -0,0 +1,4 @@
+using _STLP_OLD_IO_NAMESPACE::strstreambuf;
+using _STLP_OLD_IO_NAMESPACE::istrstream;
+using _STLP_OLD_IO_NAMESPACE::ostrstream;
+using _STLP_OLD_IO_NAMESPACE::strstream;
diff --git a/src/STLport/using/iomanip b/src/STLport/using/iomanip
new file mode 100644
index 0000000..8a7c792
--- /dev/null
+++ b/src/STLport/using/iomanip
@@ -0,0 +1,6 @@
+using _STLP_NEW_IO_NAMESPACE::setiosflags;
+using _STLP_NEW_IO_NAMESPACE::resetiosflags;
+using _STLP_NEW_IO_NAMESPACE::setbase;
+using _STLP_NEW_IO_NAMESPACE::setfill;
+using _STLP_NEW_IO_NAMESPACE::setprecision;
+using _STLP_NEW_IO_NAMESPACE::setw;
diff --git a/src/STLport/using/ios b/src/STLport/using/ios
new file mode 100644
index 0000000..22f23ae
--- /dev/null
+++ b/src/STLport/using/ios
@@ -0,0 +1,41 @@
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_NEW_IO_NAMESPACE;
+# else
+
+using _STLP_NEW_IO_NAMESPACE::ios;
+using _STLP_NEW_IO_NAMESPACE::streamoff;
+using _STLP_NEW_IO_NAMESPACE::streamsize;
+
+using _STLP_NEW_IO_NAMESPACE::ios_base;
+using _STLP_NEW_IO_NAMESPACE::basic_ios;
+
+// _lib.std.ios.manip_, manipulators:
+using _STLP_NEW_IO_NAMESPACE::boolalpha;
+using _STLP_NEW_IO_NAMESPACE::noboolalpha;
+using _STLP_NEW_IO_NAMESPACE::showbase;
+using _STLP_NEW_IO_NAMESPACE::noshowbase;
+using _STLP_NEW_IO_NAMESPACE::showpoint;
+using _STLP_NEW_IO_NAMESPACE::noshowpoint;
+using _STLP_NEW_IO_NAMESPACE::showpos;
+using _STLP_NEW_IO_NAMESPACE::noshowpos;
+using _STLP_NEW_IO_NAMESPACE::skipws;
+using _STLP_NEW_IO_NAMESPACE::noskipws;
+using _STLP_NEW_IO_NAMESPACE::uppercase;
+using _STLP_NEW_IO_NAMESPACE::nouppercase;
+
+// _lib.adjustfield.manip_ adjustfield:
+using _STLP_NEW_IO_NAMESPACE::internal;
+using _STLP_NEW_IO_NAMESPACE::left;
+using _STLP_NEW_IO_NAMESPACE::right;
+
+// _lib.basefield.manip_ basefield:
+using _STLP_NEW_IO_NAMESPACE::dec;
+using _STLP_NEW_IO_NAMESPACE::hex;
+using _STLP_NEW_IO_NAMESPACE::oct;
+
+// _lib.floatfield.manip_ floatfield:
+using _STLP_NEW_IO_NAMESPACE::fixed;
+using _STLP_NEW_IO_NAMESPACE::scientific;
+
+# endif /* _STLP_BROKEN_USING_DIRECTIVE */
+
diff --git a/src/STLport/using/iosfwd b/src/STLport/using/iosfwd
new file mode 100644
index 0000000..b564e81
--- /dev/null
+++ b/src/STLport/using/iosfwd
@@ -0,0 +1,54 @@
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+using _STLP_NEW_IO_NAMESPACE::char_traits;
+using _STLP_NEW_IO_NAMESPACE::basic_ios;
+using _STLP_NEW_IO_NAMESPACE::basic_streambuf;
+using _STLP_NEW_IO_NAMESPACE::basic_istream;
+using _STLP_NEW_IO_NAMESPACE::basic_ostream;
+using _STLP_NEW_IO_NAMESPACE::basic_iostream;
+using _STLP_NEW_IO_NAMESPACE::basic_stringbuf;
+using _STLP_NEW_IO_NAMESPACE::basic_istringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ostringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_stringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_filebuf;
+using _STLP_NEW_IO_NAMESPACE::basic_ifstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ofstream;
+using _STLP_NEW_IO_NAMESPACE::basic_fstream;
+using _STLP_NEW_IO_NAMESPACE::fpos;
+using _STLP_NEW_IO_NAMESPACE::istreambuf_iterator;
+using _STLP_NEW_IO_NAMESPACE::ostreambuf_iterator;
+using _STLP_NEW_IO_NAMESPACE::stringbuf;
+using _STLP_NEW_IO_NAMESPACE::istringstream;
+using _STLP_NEW_IO_NAMESPACE::ostringstream;
+using _STLP_NEW_IO_NAMESPACE::stringstream;
+# endif
+
+using _STLP_NEW_IO_NAMESPACE::ios;
+using _STLP_NEW_IO_NAMESPACE::streambuf;
+using _STLP_NEW_IO_NAMESPACE::istream;
+using _STLP_NEW_IO_NAMESPACE::ostream;
+using _STLP_NEW_IO_NAMESPACE::iostream;
+
+using _STLP_NEW_IO_NAMESPACE::filebuf;
+using _STLP_NEW_IO_NAMESPACE::ifstream;
+using _STLP_NEW_IO_NAMESPACE::ofstream;
+using _STLP_NEW_IO_NAMESPACE::fstream;
+
+using _STLP_NEW_IO_NAMESPACE::streampos;
+using _STLP_NEW_IO_NAMESPACE::streamoff;
+
+# if !defined (_STLP_NO_WIDE_STREAMS)
+using _STLP_NEW_IO_NAMESPACE::wios;
+using _STLP_NEW_IO_NAMESPACE::wstreambuf;
+using _STLP_NEW_IO_NAMESPACE::wistream;
+using _STLP_NEW_IO_NAMESPACE::wostream;
+using _STLP_NEW_IO_NAMESPACE::wiostream;
+using _STLP_NEW_IO_NAMESPACE::wstringbuf;
+using _STLP_NEW_IO_NAMESPACE::wistringstream;
+using _STLP_NEW_IO_NAMESPACE::wostringstream;
+using _STLP_NEW_IO_NAMESPACE::wstringstream;
+using _STLP_NEW_IO_NAMESPACE::wfilebuf;
+using _STLP_NEW_IO_NAMESPACE::wifstream;
+using _STLP_NEW_IO_NAMESPACE::wofstream;
+using _STLP_NEW_IO_NAMESPACE::wfstream;
+using _STLP_NEW_IO_NAMESPACE::wstreampos;
+# endif
diff --git a/src/STLport/using/iostream b/src/STLport/using/iostream
new file mode 100644
index 0000000..6169afb
--- /dev/null
+++ b/src/STLport/using/iostream
@@ -0,0 +1,14 @@
+
+# include <using/istream>
+
+using _STLP_VENDOR_STD::cin;
+using _STLP_VENDOR_STD::cout;
+using _STLP_VENDOR_STD::cerr;
+using _STLP_VENDOR_STD::clog;
+
+# if ! defined (_STLP_NO_WIDE_STREAMS)
+using _STLP_VENDOR_STD::wcin;
+using _STLP_VENDOR_STD::wcout;
+using _STLP_VENDOR_STD::wcerr;
+using _STLP_VENDOR_STD::wclog;
+# endif
diff --git a/src/STLport/using/istream b/src/STLport/using/istream
new file mode 100644
index 0000000..baf10d2
--- /dev/null
+++ b/src/STLport/using/istream
@@ -0,0 +1,16 @@
+# include <using/ostream>
+
+using _STLP_NEW_IO_NAMESPACE::basic_istream;
+using _STLP_NEW_IO_NAMESPACE::basic_iostream;
+
+using _STLP_NEW_IO_NAMESPACE::istream;
+using _STLP_NEW_IO_NAMESPACE::iostream;
+
+# if !defined (_STLP_NO_NATIVE_WIDE_STREAMS)
+using _STLP_NEW_IO_NAMESPACE::wistream;
+using _STLP_NEW_IO_NAMESPACE::wiostream;
+# endif
+
+#if !(defined (_STLP_MSVC) && (_STLP_MSVC < 1200))
+using _STLP_NEW_IO_NAMESPACE::ws;
+#endif
diff --git a/src/STLport/using/locale b/src/STLport/using/locale
new file mode 100644
index 0000000..aa99b5b
--- /dev/null
+++ b/src/STLport/using/locale
@@ -0,0 +1,65 @@
+#if !defined(_STLP_NO_IMPORT_LOCALE)
+
+// from <cwchar>
+#if !defined (_STLP_NO_MBSTATE_T)
+using _STLP_VENDOR_MB_NAMESPACE::mbstate_t;
+#endif
+
+// _lib.locale_, locale:
+using _STLP_NEW_IO_NAMESPACE::locale;
+using _STLP_NEW_IO_NAMESPACE::use_facet;
+using _STLP_NEW_IO_NAMESPACE::has_facet;
+
+// _lib.locale.convenience_, convenience interfaces:
+using _STLP_NEW_IO_NAMESPACE::isspace;
+using _STLP_NEW_IO_NAMESPACE::isprint;
+using _STLP_NEW_IO_NAMESPACE::iscntrl;
+using _STLP_NEW_IO_NAMESPACE::isupper;
+using _STLP_NEW_IO_NAMESPACE::islower;
+using _STLP_NEW_IO_NAMESPACE::isalpha;
+using _STLP_NEW_IO_NAMESPACE::isdigit;
+using _STLP_NEW_IO_NAMESPACE::ispunct;
+using _STLP_NEW_IO_NAMESPACE::isxdigit;
+using _STLP_NEW_IO_NAMESPACE::isalnum;
+using _STLP_NEW_IO_NAMESPACE::isgraph;
+using _STLP_NEW_IO_NAMESPACE::toupper;
+using _STLP_NEW_IO_NAMESPACE::tolower;
+
+// _lib.category.ctype_ and _lib.facet.ctype.special_, ctype:
+using _STLP_NEW_IO_NAMESPACE::ctype_base;
+using _STLP_NEW_IO_NAMESPACE::ctype;
+using _STLP_NEW_IO_NAMESPACE::ctype_byname;
+using _STLP_NEW_IO_NAMESPACE::codecvt_base;
+using _STLP_NEW_IO_NAMESPACE::codecvt;
+using _STLP_NEW_IO_NAMESPACE::codecvt_byname;
+
+// _lib.category.numeric_ and _lib.facet.numpunct_, numeric:
+using _STLP_NEW_IO_NAMESPACE::num_get;
+using _STLP_NEW_IO_NAMESPACE::num_put;
+using _STLP_NEW_IO_NAMESPACE::numpunct;
+using _STLP_NEW_IO_NAMESPACE::numpunct_byname;
+
+// _lib.category.collate_, collation:
+using _STLP_NEW_IO_NAMESPACE::collate;
+using _STLP_NEW_IO_NAMESPACE::collate_byname;
+
+// _lib.category.time_, date and time:
+using _STLP_NEW_IO_NAMESPACE::time_base;
+using _STLP_NEW_IO_NAMESPACE::time_get;
+using _STLP_NEW_IO_NAMESPACE::time_get_byname;
+using _STLP_NEW_IO_NAMESPACE::time_put;
+using _STLP_NEW_IO_NAMESPACE::time_put_byname;
+
+// _lib.category.monetary_, money:
+using _STLP_NEW_IO_NAMESPACE::money_base;
+using _STLP_NEW_IO_NAMESPACE::money_get;
+using _STLP_NEW_IO_NAMESPACE::money_put;
+using _STLP_NEW_IO_NAMESPACE::moneypunct;
+using _STLP_NEW_IO_NAMESPACE::moneypunct_byname;
+
+#if !defined (_STLP_OWN_IOSTREAMS) && !defined (_STLP_NO_NATIVE_MESSAGE_FACET)
+using _STLP_NEW_IO_NAMESPACE::messages_base;
+using _STLP_NEW_IO_NAMESPACE::messages;
+using _STLP_NEW_IO_NAMESPACE::messages_byname;
+#endif // _MSL_NO_MESSAGE_FACET
+#endif /* !defined(_STLP_NO_IMPORT_LOCALE) */
diff --git a/src/STLport/using/ostream b/src/STLport/using/ostream
new file mode 100644
index 0000000..162b32d
--- /dev/null
+++ b/src/STLport/using/ostream
@@ -0,0 +1,10 @@
+using _STLP_NEW_IO_NAMESPACE::basic_ostream;
+using _STLP_NEW_IO_NAMESPACE::ostream;
+
+# ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wostream;
+# endif
+
+using _STLP_NEW_IO_NAMESPACE::endl;
+using _STLP_NEW_IO_NAMESPACE::ends;
+using _STLP_NEW_IO_NAMESPACE::flush;
diff --git a/src/STLport/using/sstream b/src/STLport/using/sstream
new file mode 100644
index 0000000..925c37e
--- /dev/null
+++ b/src/STLport/using/sstream
@@ -0,0 +1,16 @@
+using _STLP_NEW_IO_NAMESPACE::basic_stringbuf;
+using _STLP_NEW_IO_NAMESPACE::stringbuf;
+
+using _STLP_NEW_IO_NAMESPACE::basic_istringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ostringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_stringstream;
+using _STLP_NEW_IO_NAMESPACE::istringstream;
+using _STLP_NEW_IO_NAMESPACE::ostringstream;
+using _STLP_NEW_IO_NAMESPACE::stringstream;
+
+#ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wstringbuf;
+using _STLP_NEW_IO_NAMESPACE::wistringstream;
+using _STLP_NEW_IO_NAMESPACE::wostringstream;
+using _STLP_NEW_IO_NAMESPACE::wstringstream;
+#endif
diff --git a/src/STLport/using/streambuf b/src/STLport/using/streambuf
new file mode 100644
index 0000000..308241d
--- /dev/null
+++ b/src/STLport/using/streambuf
@@ -0,0 +1,5 @@
+using _STLP_NEW_IO_NAMESPACE::basic_streambuf;
+using _STLP_NEW_IO_NAMESPACE::streambuf;
+#ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wstreambuf;
+# endif
diff --git a/src/STLport/using/strstream b/src/STLport/using/strstream
new file mode 100644
index 0000000..eb26ac1
--- /dev/null
+++ b/src/STLport/using/strstream
@@ -0,0 +1,4 @@
+using _STLP_NEW_IO_NAMESPACE::strstreambuf;
+using _STLP_NEW_IO_NAMESPACE::istrstream;
+using _STLP_NEW_IO_NAMESPACE::ostrstream;
+using _STLP_NEW_IO_NAMESPACE::strstream;
diff --git a/src/STLport/utility b/src/STLport/utility
new file mode 100644
index 0000000..c6de4d8
--- /dev/null
+++ b/src/STLport/utility
@@ -0,0 +1,65 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_UTILITY
+#define _STLP_UTILITY
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x75
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# ifndef __TYPE_TRAITS_H
+# include <stl/type_traits.h>
+# endif
+
+# if !defined (_STLP_DEBUG_H) && (defined (_STLP_DEBUG) || defined (_STLP_ASSERTIONS))
+# include <stl/debug/_debug.h>
+# endif
+
+# ifndef _STLP_INTERNAL_PAIR_H
+# include <stl/_pair.h>
+# endif
+
+# if defined (_STLP_IMPORT_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(utility)
+# else
+# if defined (_STLP_MSVC) && ! defined (_STLP_INTERNAL_ITERATOR_H)
+# include <stl/_iterator.h>
+# endif
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x75)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_UTILITY */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/valarray b/src/STLport/valarray
new file mode 100644
index 0000000..8acc0b1
--- /dev/null
+++ b/src/STLport/valarray
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_VALARRAY
+#define _STLP_VALARRAY
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x76
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+#include <stl/_valarray.h>
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(valarray)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x76)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_VALARRAY */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/vector b/src/STLport/vector
new file mode 100644
index 0000000..23ae762
--- /dev/null
+++ b/src/STLport/vector
@@ -0,0 +1,57 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_VECTOR
+#define _STLP_VECTOR
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+# define _STLP_OUTERMOST_HEADER_ID 0x77
+# include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+# pragma once
+# endif
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h>
+# endif
+
+#ifndef _STLP_INTERNAL_VECTOR_H
+# include <stl/_vector.h>
+#endif
+
+#if defined (_STLP_IMPORT_VENDOR_STD) && ! defined (_STLP_MINIMUM_IMPORT_STD)
+# include _STLP_NATIVE_HEADER(vector)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x77)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_VECTOR */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/wchar.h b/src/STLport/wchar.h
new file mode 100644
index 0000000..30608d6
--- /dev/null
+++ b/src/STLport/wchar.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x278
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x278) && ! defined (_STLP_DONT_POP_0x278)
+# define _STLP_DONT_POP_0x278
+# endif
+
+# if ! defined (_STLP_WINCE) && ! defined (_STLP_NO_WCHAR_T)
+
+# if defined ( __BORLANDC__ ) && (__BORLANDC__) >= 0x530
+// # include <cstring>
+# include _STLP_NATIVE_CPP_C_HEADER(_str.h)
+using _STLP_VENDOR_CSTD::strlen;
+using _STLP_VENDOR_CSTD::strspn;
+# endif
+
+# if defined (__GNUC__) && defined (__APPLE__)
+# include _STLP_NATIVE_C_HEADER(stddef.h)
+# else
+# include _STLP_NATIVE_C_HEADER(wchar.h)
+# endif
+
+# endif /* WINCE */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x278)
+# if ! defined (_STLP_DONT_POP_0x278)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x278
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wctype.h b/src/STLport/wctype.h
new file mode 100644
index 0000000..f5de1e1
--- /dev/null
+++ b/src/STLport/wctype.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+# define _STLP_OUTERMOST_HEADER_ID 0x279
+# include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x279) && ! defined (_STLP_DONT_POP_0x279)
+# define _STLP_DONT_POP_0x279
+# endif
+
+# include _STLP_NATIVE_C_HEADER(wctype.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x279)
+# if ! defined (_STLP_DONT_POP_0x279)
+# include <stl/_epilog.h>
+# undef _STLP_OUTERMOST_HEADER_ID
+# endif
+# undef _STLP_DONT_POP_0x279
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/complex b/src/STLport/wrap_std/complex
new file mode 100644
index 0000000..0dc4e4e
--- /dev/null
+++ b/src/STLport/wrap_std/complex
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# include _STLP_NATIVE_HEADER(complex)
+
+# if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+
+using _STLP_COMPLEX_NAMESPACE::complex;
+
+using _STLP_COMPLEX_NAMESPACE::real;
+using _STLP_COMPLEX_NAMESPACE::imag;
+using _STLP_COMPLEX_NAMESPACE::abs;
+using _STLP_COMPLEX_NAMESPACE::arg;
+using _STLP_COMPLEX_NAMESPACE::norm;
+
+using _STLP_COMPLEX_NAMESPACE::conj;
+using _STLP_COMPLEX_NAMESPACE::polar;
+
+using _STLP_COMPLEX_NAMESPACE::cos;
+using _STLP_COMPLEX_NAMESPACE::cosh;
+using _STLP_COMPLEX_NAMESPACE::exp;
+using _STLP_COMPLEX_NAMESPACE::log;
+using _STLP_COMPLEX_NAMESPACE::log10;
+using _STLP_COMPLEX_NAMESPACE::pow;
+using _STLP_COMPLEX_NAMESPACE::sin;
+using _STLP_COMPLEX_NAMESPACE::sinh;
+using _STLP_COMPLEX_NAMESPACE::sqrt;
+using _STLP_COMPLEX_NAMESPACE::tan;
+using _STLP_COMPLEX_NAMESPACE::tanh;
+
+_STLP_END_NAMESPACE
+# endif /* USE_OWN_NAMESPACE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/export b/src/STLport/wrap_std/export
new file mode 100644
index 0000000..f9b7305
--- /dev/null
+++ b/src/STLport/wrap_std/export
@@ -0,0 +1,13 @@
+./complex
+./export
+./fstream
+./iomanip
+./ios
+./iosfwd
+./iostream
+./istream
+./locale
+./ostream
+./sstream
+./streambuf
+./strstream
diff --git a/src/STLport/wrap_std/fstream b/src/STLport/wrap_std/fstream
new file mode 100644
index 0000000..b69e024
--- /dev/null
+++ b/src/STLport/wrap_std/fstream
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+# include _STLP_NATIVE_HEADER(fstream)
+# if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+# include <using/fstream>
+_STLP_END_NAMESPACE
+# endif /* _STLP_OWN_NAMESPACE */
+# else
+# include <wrap_std/h/fstream.h>
+# endif /* _STLP_USE_NEW_IOSTREAMS */
diff --git a/src/STLport/wrap_std/h/fstream.h b/src/STLport/wrap_std/h/fstream.h
new file mode 100644
index 0000000..27192c3
--- /dev/null
+++ b/src/STLport/wrap_std/h/fstream.h
@@ -0,0 +1,7 @@
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(fstream.h)
+# if defined (_STLP_USE_NAMESPACES) && ! defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+# include <using/h/fstream.h>
+_STLP_END_NAMESPACE
+# endif /* _STLP_OWN_NAMESPACE */
+
diff --git a/src/STLport/wrap_std/h/iostream.h b/src/STLport/wrap_std/h/iostream.h
new file mode 100644
index 0000000..b523af6
--- /dev/null
+++ b/src/STLport/wrap_std/h/iostream.h
@@ -0,0 +1,11 @@
+// # ifndef _STLP_NO_WCHAR_T
+// # include <wchar.h>
+// # endif
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(iostream.h)
+
+# if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+# include <using/h/iostream.h>
+_STLP_END_NAMESPACE
+# endif /* _STLP_USE_OWN_NAMESPACE */
diff --git a/src/STLport/wrap_std/h/streambuf.h b/src/STLport/wrap_std/h/streambuf.h
new file mode 100644
index 0000000..37fc08f
--- /dev/null
+++ b/src/STLport/wrap_std/h/streambuf.h
@@ -0,0 +1,9 @@
+//*TY 02/11/2000 - added missing header file
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(iostream.h)
+
+# if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+# include <using/h/streambuf.h>
+_STLP_END_NAMESPACE
+# endif /* _STLP_USE_OWN_NAMESPACE */
diff --git a/src/STLport/wrap_std/h/strstream.h b/src/STLport/wrap_std/h/strstream.h
new file mode 100644
index 0000000..bf271be
--- /dev/null
+++ b/src/STLport/wrap_std/h/strstream.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_MSC_VER) && (_MSC_VER <= 1200)
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(strstrea.h)
+# else
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(strstream.h)
+# endif
+
+# ifdef _STLP_USE_OWN_NAMESPACE
+_STLP_BEGIN_NAMESPACE
+# include <using/h/strstream.h>
+_STLP_END_NAMESPACE
+#endif /* _STLP_OWN_NAMESPACE */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/iomanip b/src/STLport/wrap_std/iomanip
new file mode 100644
index 0000000..6c93073
--- /dev/null
+++ b/src/STLport/wrap_std/iomanip
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+
+# include _STLP_NATIVE_HEADER(iomanip)
+
+# ifdef _STLP_USE_OWN_NAMESPACE
+_STLP_BEGIN_NAMESPACE
+# include <using/iomanip>
+_STLP_END_NAMESPACE
+# endif /* _STLP_OWN_NAMESPACE */
+
+# else
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(iomanip.h)
+
+# if defined (_STLP_USE_NAMESPACES) && ! defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+# include <using/h/iomanip.h>
+_STLP_END_NAMESPACE
+# endif /* _STLP_USE_OWN_NAMESPACE */
+
+# endif /* _STLP_USE_NEW_IOSTREAMS */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/ios b/src/STLport/wrap_std/ios
new file mode 100644
index 0000000..765f4c9
--- /dev/null
+++ b/src/STLport/wrap_std/ios
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+# include _STLP_NATIVE_HEADER(ios)
+# ifdef _STLP_USE_OWN_NAMESPACE
+_STLP_BEGIN_NAMESPACE
+# include <using/ios>
+_STLP_END_NAMESPACE
+#endif /* _STLP_OWN_NAMESPACE */
+# else
+# include <wrap_std/h/iostream.h>
+# endif /* USE_NEW_IOSTREAMS */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/iosfwd b/src/STLport/wrap_std/iosfwd
new file mode 100644
index 0000000..0582bda
--- /dev/null
+++ b/src/STLport/wrap_std/iosfwd
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_CSTDDEF
+# include <cstddef> /* wchar_t */
+# endif
+
+# ifndef _STLP_CSTRING
+# include <cstring>
+# endif
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+
+# include _STLP_NATIVE_HEADER(iosfwd)
+
+# if defined ( __MWERKS__ ) || defined (__KCC)
+// MSL leaves a few important things out of <iosfwd>.
+// We expect this to be fixed in later MSL implementations
+# if !defined( __MSL_CPP__ ) || __MSL_CPP__ <= 0x4105
+
+# ifdef MSIPL_USING_NAMESPACE
+namespace std {
+# endif
+
+// A few things that seem to be missing from CodeWarrior's <iosfwd>
+# ifdef __MWERKS__
+template <class charT, class traits = char_traits<charT> >
+ class istreambuf_iterator;
+
+template <class charT, class traits = char_traits<charT> >
+ class ostreambuf_iterator;
+# endif /* __MWERKS__ */
+
+# if defined (_STLP_NO_NATIVE_WIDE_STREAMS)
+class streampos;
+# endif
+
+# ifdef MSIPL_USING_NAMESPACE
+ } // namespace std
+# endif
+
+# endif /* __MSL__ version */
+# endif /* MWERKS */
+
+# else
+
+_STLP_BEGIN_NAMESPACE
+template <class _Tp> class allocator;
+_STLP_END_NAMESPACE
+
+// use old-style iostreams
+# include <iostream.h>
+# include <fstream.h>
+
+#ifndef _STLP_CHAR_TRAITS_H
+// that defines char_traits or imports std::char_traits
+# include <stl/char_traits.h>
+#endif
+
+# endif /* _STLP_USE_NEW_IOSTREAMS */
+
+# ifdef _STLP_USE_ABBREVS
+# define istream_iterator _iS__It
+# define ostream_iterator _oS__It
+# endif
+
+# if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+# include <using/iosfwd>
+_STLP_END_NAMESPACE
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
+
+
+
+
+
+
+
diff --git a/src/STLport/wrap_std/iostream b/src/STLport/wrap_std/iostream
new file mode 100644
index 0000000..4f522df
--- /dev/null
+++ b/src/STLport/wrap_std/iostream
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_MSVC) && (_STLP_MSVC < 1200)
+# include <cwchar>
+// lower ifdef level
+# include <ios>
+# endif
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+# include _STLP_NATIVE_HEADER(iostream)
+# if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+# include <using/iostream>
+_STLP_END_NAMESPACE
+# endif
+# else
+# include <wrap_std/h/iostream.h>
+# endif /* _STLP_USE_NEW_STYLE_IOSTREAMS */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/istream b/src/STLport/wrap_std/istream
new file mode 100644
index 0000000..8d3647a
--- /dev/null
+++ b/src/STLport/wrap_std/istream
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_MSVC) && (_STLP_MSVC < 1200)
+// # include <cwchar>
+// lower ifdef level
+# include <ios>
+# endif
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+
+# include _STLP_NATIVE_HEADER(istream)
+
+# if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+# include <using/istream>
+_STLP_END_NAMESPACE
+# endif /* _STLP_OWN_NAMESPACE */
+
+# else
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(iostream.h)
+# if defined (_STLP_USE_NAMESPACES)
+_STLP_BEGIN_NAMESPACE
+using ::istream;
+// using ::ws;
+_STLP_END_NAMESPACE
+# endif /* NAMESPACES */
+
+# endif /* if defined (_STLP_USE_NEW_IOSTREAMS) */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/wrap_std/locale b/src/STLport/wrap_std/locale
new file mode 100644
index 0000000..5c7e125
--- /dev/null
+++ b/src/STLport/wrap_std/locale
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_CSTDLIB
+# include <cstdlib>
+# endif
+
+# include _STLP_NATIVE_HEADER(locale)
+
+# ifdef _STLP_USE_OWN_NAMESPACE
+_STLP_BEGIN_NAMESPACE
+# include <using/locale>
+_STLP_END_NAMESPACE
+#endif /* _STLP_OWN_NAMESPACE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/ostream b/src/STLport/wrap_std/ostream
new file mode 100644
index 0000000..d6d4fa8
--- /dev/null
+++ b/src/STLport/wrap_std/ostream
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_MSVC) && (_STLP_MSVC < 1200)
+// # include <cwchar>
+// lower ifdef level
+# include <ios>
+# endif
+
+# if defined (_STLP_USE_NEW_IOSTREAMS) || defined (__IN_STLPORT_OSTREAM)
+
+# include _STLP_NATIVE_HEADER(ostream)
+
+# if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+# include <using/ostream>
+_STLP_END_NAMESPACE
+# endif /* _STLP_OWN_NAMESPACE */
+
+# else
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(iostream.h)
+
+# if defined (_STLP_USE_NAMESPACES) && ! defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+# include <using/h/ostream.h>
+_STLP_END_NAMESPACE
+# endif /* _STLP_NAMESPACE */
+# endif /* if defined (_STLP_USE_NEW_IOSTREAMS) */
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/sstream b/src/STLport/wrap_std/sstream
new file mode 100644
index 0000000..086c512
--- /dev/null
+++ b/src/STLport/wrap_std/sstream
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# include _STLP_NATIVE_HEADER(sstream)
+# ifdef _STLP_USE_OWN_NAMESPACE
+_STLP_BEGIN_NAMESPACE
+# include <using/sstream>
+_STLP_END_NAMESPACE
+#endif /* _STLP_OWN_NAMESPACE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/streambuf b/src/STLport/wrap_std/streambuf
new file mode 100644
index 0000000..2c0dc58
--- /dev/null
+++ b/src/STLport/wrap_std/streambuf
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+# include _STLP_NATIVE_HEADER(streambuf)
+# else
+# include <wrap_std/h/streambuf.h>
+# endif
+
+# if defined (_STLP_USE_OWN_NAMESPACE) && defined (_STLP_USE_NEW_IOSTREAMS)
+_STLP_BEGIN_NAMESPACE
+# include <using/streambuf>
+_STLP_END_NAMESPACE
+# endif /* _STLP_OWN_NAMESPACE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/strstream b/src/STLport/wrap_std/strstream
new file mode 100644
index 0000000..28164cc
--- /dev/null
+++ b/src/STLport/wrap_std/strstream
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# include _STLP_NATIVE_HEADER(strstream)
+
+# ifdef _STLP_USE_OWN_NAMESPACE
+_STLP_BEGIN_NAMESPACE
+# include <using/strstream>
+_STLP_END_NAMESPACE
+#endif /* _STLP_OWN_NAMESPACE */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/shapelib/dbfopen.c b/src/shapelib/dbfopen.c
new file mode 100644
index 0000000..edcab76
--- /dev/null
+++ b/src/shapelib/dbfopen.c
@@ -0,0 +1,1542 @@
+/******************************************************************************
+ * $Id: dbfopen.c,v 1.5 2004/11/01 15:11:39 juan Exp $
+ *
+ * Project: Shapelib
+ * Purpose: Implementation of .dbf access API documented in dbf_api.html.
+ * Author: Frank Warmerdam, warmerdam at pobox.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * This software is available under the following "MIT Style" license,
+ * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This
+ * option is discussed in more detail in shapelib.html.
+ *
+ * --
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: dbfopen.c,v $
+ * Revision 1.5 2004/11/01 15:11:39 juan
+ * Warnings removidos
+ *
+ * Revision 1.4 2004/04/29 14:48:57 lubia
+ * modificacao de tempo
+ *
+ * Revision 1.3 2004/02/20 14:10:42 lubia
+ * Migrando para ultima versao da shapelib: 1.2.10
+ *
+ * Revision 1.48 2003/03/10 14:51:27 warmerda
+ * DBFWrite* calls now return FALSE if they have to truncate
+ *
+ * Revision 1.47 2002/11/20 03:32:22 warmerda
+ * Ensure field name in DBFGetFieldIndex() is properly terminated.
+ *
+ * Revision 1.46 2002/10/09 13:10:21 warmerda
+ * Added check that width is positive.
+ *
+ * Revision 1.45 2002/09/29 00:00:08 warmerda
+ * added FTLogical and logical attribute read/write calls
+ *
+ * Revision 1.44 2002/05/07 13:46:11 warmerda
+ * Added DBFWriteAttributeDirectly().
+ *
+ * Revision 1.43 2002/02/13 19:39:21 warmerda
+ * Fix casting issues in DBFCloneEmpty().
+ *
+ * Revision 1.42 2002/01/15 14:36:07 warmerda
+ * updated email address
+ *
+ * Revision 1.41 2002/01/15 14:31:49 warmerda
+ * compute rather than copying nHeaderLength in DBFCloneEmpty()
+ *
+ * Revision 1.40 2002/01/09 04:32:35 warmerda
+ * fixed to read correct amount of header
+ *
+ * Revision 1.39 2001/12/11 22:41:03 warmerda
+ * improve io related error checking when reading header
+ *
+ * Revision 1.38 2001/11/28 16:07:31 warmerda
+ * Cleanup to avoid compiler warnings as suggested by Richard Hash.
+ *
+ * Revision 1.37 2001/07/04 05:18:09 warmerda
+ * do last fix properly
+ *
+ * Revision 1.36 2001/07/04 05:16:09 warmerda
+ * fixed fieldname comparison in DBFGetFieldIndex
+ *
+ * Revision 1.35 2001/06/22 02:10:06 warmerda
+ * fixed NULL shape support with help from Jim Matthews
+ *
+ * Revision 1.33 2001/05/31 19:20:13 warmerda
+ * added DBFGetFieldIndex()
+ *
+ * Revision 1.32 2001/05/31 18:15:40 warmerda
+ * Added support for NULL fields in DBF files
+ *
+ * Revision 1.31 2001/05/23 13:36:52 warmerda
+ * added use of SHPAPI_CALL
+ *
+ * Revision 1.30 2000/12/05 14:43:38 warmerda
+ * DBReadAttribute() white space trimming bug fix
+ *
+ * Revision 1.29 2000/10/05 14:36:44 warmerda
+ * fix bug with writing very wide numeric fields
+ *
+ * Revision 1.28 2000/09/25 14:18:07 warmerda
+ * Added some casts of strlen() return result to fix warnings on some
+ * systems, as submitted by Daniel.
+ *
+ * Revision 1.27 2000/09/25 14:15:51 warmerda
+ * added DBFGetNativeFieldType()
+ *
+ * Revision 1.26 2000/07/07 13:39:45 warmerda
+ * removed unused variables, and added system include files
+ *
+ * Revision 1.25 2000/05/29 18:19:13 warmerda
+ * avoid use of uchar, and adding casting fix
+ *
+ * Revision 1.24 2000/05/23 13:38:27 warmerda
+ * Added error checks on return results of fread() and fseek().
+ *
+ * Revision 1.23 2000/05/23 13:25:49 warmerda
+ * Avoid crashing if field or record are out of range in dbfread*attribute().
+ *
+ * Revision 1.22 1999/12/15 13:47:24 warmerda
+ * Added stdlib.h to ensure that atof() is prototyped.
+ *
+ * Revision 1.21 1999/12/13 17:25:46 warmerda
+ * Added support for upper case .DBF extention.
+ *
+ * Revision 1.20 1999/11/30 16:32:11 warmerda
+ * Use atof() instead of sscanf().
+ *
+ * Revision 1.19 1999/11/05 14:12:04 warmerda
+ * updated license terms
+ *
+ * Revision 1.18 1999/07/27 00:53:28 warmerda
+ * ensure that whole old field value clear on write of string
+ *
+ * Revision 1.1 1999/07/05 18:58:07 warmerda
+ * New
+ *
+ * Revision 1.17 1999/06/11 19:14:12 warmerda
+ * Fixed some memory leaks.
+ *
+ * Revision 1.16 1999/06/11 19:04:11 warmerda
+ * Remoted some unused variables.
+ *
+ * Revision 1.15 1999/05/11 03:19:28 warmerda
+ * added new Tuple api, and improved extension handling - add from candrsn
+ *
+ * Revision 1.14 1999/05/04 15:01:48 warmerda
+ * Added 'F' support.
+ *
+ * Revision 1.13 1999/03/23 17:38:59 warmerda
+ * DBFAddField() now actually does return the new field number, or -1 if
+ * it fails.
+ *
+ * Revision 1.12 1999/03/06 02:54:46 warmerda
+ * Added logic to convert shapefile name to dbf filename in DBFOpen()
+ * for convenience.
+ *
+ * Revision 1.11 1998/12/31 15:30:34 warmerda
+ * Improved the interchangability of numeric and string attributes. Add
+ * white space trimming option for attributes.
+ *
+ * Revision 1.10 1998/12/03 16:36:44 warmerda
+ * Use r+b instead of rb+ for binary access.
+ *
+ * Revision 1.9 1998/12/03 15:34:23 warmerda
+ * Updated copyright message.
+ *
+ * Revision 1.8 1997/12/04 15:40:15 warmerda
+ * Added newline character after field definitions.
+ *
+ * Revision 1.7 1997/03/06 14:02:10 warmerda
+ * Ensure bUpdated is initialized.
+ *
+ * Revision 1.6 1996/02/12 04:54:41 warmerda
+ * Ensure that DBFWriteAttribute() returns TRUE if it succeeds.
+ *
+ * Revision 1.5 1995/10/21 03:15:12 warmerda
+ * Changed to use binary file access, and ensure that the
+ * field name field is zero filled, and limited to 10 chars.
+ *
+ * Revision 1.4 1995/08/24 18:10:42 warmerda
+ * Added use of SfRealloc() to avoid pre-ANSI realloc() functions such
+ * as on the Sun.
+ *
+ * Revision 1.3 1995/08/04 03:15:16 warmerda
+ * Fixed up header.
+ *
+ * Revision 1.2 1995/08/04 03:14:43 warmerda
+ * Added header.
+ */
+
+/* static char rcsid[] =
+ "$Id: dbfopen.c,v 1.5 2004/11/01 15:11:39 juan Exp $"; */
+
+#include "shapefil.h"
+
+#include <math.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+
+#ifndef FALSE
+# define FALSE 0
+# define TRUE 1
+#endif
+
+static int nStringFieldLen = 0;
+static char * pszStringField = NULL;
+
+/************************************************************************/
+/* SfRealloc() */
+/* */
+/* A realloc cover function that will access a NULL pointer as */
+/* a valid input. */
+/************************************************************************/
+
+static void * SfRealloc( void * pMem, int nNewSize )
+
+{
+ if( pMem == NULL )
+ return( (void *) malloc(nNewSize) );
+ else
+ return( (void *) realloc(pMem,nNewSize) );
+}
+
+/************************************************************************/
+/* DBFWriteHeader() */
+/* */
+/* This is called to write out the file header, and field */
+/* descriptions before writing any actual data records. This */
+/* also computes all the DBFDataSet field offset/size/decimals */
+/* and so forth values. */
+/************************************************************************/
+
+static void DBFWriteHeader(DBFHandle psDBF)
+
+{
+ unsigned char abyHeader[XBASE_FLDHDR_SZ];
+ int i;
+
+ if( !psDBF->bNoHeader )
+ return;
+
+ psDBF->bNoHeader = FALSE;
+
+/* -------------------------------------------------------------------- */
+/* Initialize the file header information. */
+/* -------------------------------------------------------------------- */
+ for( i = 0; i < XBASE_FLDHDR_SZ; i++ )
+ abyHeader[i] = 0;
+
+ abyHeader[0] = 0x03; /* memo field? - just copying */
+
+ /* date updated on close, record count preset at zero */
+
+ abyHeader[8] = psDBF->nHeaderLength % 256;
+ abyHeader[9] = psDBF->nHeaderLength / 256;
+
+ abyHeader[10] = psDBF->nRecordLength % 256;
+ abyHeader[11] = psDBF->nRecordLength / 256;
+
+/* -------------------------------------------------------------------- */
+/* Write the initial 32 byte file header, and all the field */
+/* descriptions. */
+/* -------------------------------------------------------------------- */
+ fseek( psDBF->fp, 0, 0 );
+ fwrite( abyHeader, XBASE_FLDHDR_SZ, 1, psDBF->fp );
+ fwrite( psDBF->pszHeader, XBASE_FLDHDR_SZ, psDBF->nFields, psDBF->fp );
+
+/* -------------------------------------------------------------------- */
+/* Write out the newline character if there is room for it. */
+/* -------------------------------------------------------------------- */
+ if( psDBF->nHeaderLength > 32*psDBF->nFields + 32 )
+ {
+ char cNewline;
+
+ cNewline = 0x0d;
+ fwrite( &cNewline, 1, 1, psDBF->fp );
+ }
+}
+
+/************************************************************************/
+/* DBFFlushRecord() */
+/* */
+/* Write out the current record if there is one. */
+/************************************************************************/
+
+static void DBFFlushRecord( DBFHandle psDBF )
+
+{
+ int nRecordOffset;
+
+ if( psDBF->bCurrentRecordModified && psDBF->nCurrentRecord > -1 )
+ {
+ psDBF->bCurrentRecordModified = FALSE;
+
+ nRecordOffset = psDBF->nRecordLength * psDBF->nCurrentRecord
+ + psDBF->nHeaderLength;
+
+ fseek( psDBF->fp, nRecordOffset, 0 );
+ fwrite( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp );
+ }
+}
+
+/************************************************************************/
+/* DBFOpen() */
+/* */
+/* Open a .dbf file. */
+/************************************************************************/
+
+DBFHandle SHPAPI_CALL
+DBFOpen( const char * pszFilename, const char * pszAccess )
+
+{
+ DBFHandle psDBF;
+ unsigned char *pabyBuf;
+ int nFields, nHeadLen, nRecLen, iField, i;
+ char *pszBasename, *pszFullname;
+
+/* -------------------------------------------------------------------- */
+/* We only allow the access strings "rb" and "r+". */
+/* -------------------------------------------------------------------- */
+ if( strcmp(pszAccess,"r") != 0 && strcmp(pszAccess,"r+") != 0
+ && strcmp(pszAccess,"rb") != 0 && strcmp(pszAccess,"rb+") != 0
+ && strcmp(pszAccess,"r+b") != 0 )
+ return( NULL );
+
+ if( strcmp(pszAccess,"r") == 0 )
+ pszAccess = "rb";
+
+ if( strcmp(pszAccess,"r+") == 0 )
+ pszAccess = "rb+";
+
+/* -------------------------------------------------------------------- */
+/* Compute the base (layer) name. If there is any extension */
+/* on the passed in filename we will strip it off. */
+/* -------------------------------------------------------------------- */
+ pszBasename = (char *) malloc(strlen(pszFilename)+5);
+ strcpy( pszBasename, pszFilename );
+ for( i = strlen(pszBasename)-1;
+ i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/'
+ && pszBasename[i] != '\\';
+ i-- ) {}
+
+ if( pszBasename[i] == '.' )
+ pszBasename[i] = '\0';
+
+ pszFullname = (char *) malloc(strlen(pszBasename) + 5);
+ sprintf( pszFullname, "%s.dbf", pszBasename );
+
+ psDBF = (DBFHandle) calloc( 1, sizeof(DBFInfo) );
+ psDBF->fp = fopen( pszFullname, pszAccess );
+
+ if( psDBF->fp == NULL )
+ {
+ sprintf( pszFullname, "%s.DBF", pszBasename );
+ psDBF->fp = fopen(pszFullname, pszAccess );
+ }
+
+ free( pszBasename );
+ free( pszFullname );
+
+ if( psDBF->fp == NULL )
+ {
+ free( psDBF );
+ return( NULL );
+ }
+
+ psDBF->bNoHeader = FALSE;
+ psDBF->nCurrentRecord = -1;
+ psDBF->bCurrentRecordModified = FALSE;
+
+/* -------------------------------------------------------------------- */
+/* Read Table Header info */
+/* -------------------------------------------------------------------- */
+ pabyBuf = (unsigned char *) malloc(500);
+ if( fread( pabyBuf, 32, 1, psDBF->fp ) != 1 )
+ {
+ fclose( psDBF->fp );
+ free( pabyBuf );
+ free( psDBF );
+ return NULL;
+ }
+
+ psDBF->nRecords =
+ pabyBuf[4] + pabyBuf[5]*256 + pabyBuf[6]*256*256 + pabyBuf[7]*256*256*256;
+
+ psDBF->nHeaderLength = nHeadLen = pabyBuf[8] + pabyBuf[9]*256;
+ psDBF->nRecordLength = nRecLen = pabyBuf[10] + pabyBuf[11]*256;
+
+ psDBF->nFields = nFields = (nHeadLen - 32) / 32;
+
+ psDBF->pszCurrentRecord = (char *) malloc(nRecLen);
+
+/* -------------------------------------------------------------------- */
+/* Read in Field Definitions */
+/* -------------------------------------------------------------------- */
+
+ pabyBuf = (unsigned char *) SfRealloc(pabyBuf,nHeadLen);
+ psDBF->pszHeader = (char *) pabyBuf;
+
+ fseek( psDBF->fp, 32, 0 );
+ if( fread( pabyBuf, nHeadLen-32, 1, psDBF->fp ) != 1 )
+ {
+ fclose( psDBF->fp );
+ free( pabyBuf );
+ free( psDBF );
+ return NULL;
+ }
+
+ psDBF->panFieldOffset = (int *) malloc(sizeof(int) * nFields);
+ psDBF->panFieldSize = (int *) malloc(sizeof(int) * nFields);
+ psDBF->panFieldDecimals = (int *) malloc(sizeof(int) * nFields);
+ psDBF->pachFieldType = (char *) malloc(sizeof(char) * nFields);
+
+ for( iField = 0; iField < nFields; iField++ )
+ {
+ unsigned char *pabyFInfo;
+
+ pabyFInfo = pabyBuf+iField*32;
+
+ if( pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F' )
+ {
+ psDBF->panFieldSize[iField] = pabyFInfo[16];
+ psDBF->panFieldDecimals[iField] = pabyFInfo[17];
+ }
+ else
+ {
+ psDBF->panFieldSize[iField] = pabyFInfo[16] + pabyFInfo[17]*256;
+ psDBF->panFieldDecimals[iField] = 0;
+ }
+
+ psDBF->pachFieldType[iField] = (char) pabyFInfo[11];
+ if( iField == 0 )
+ psDBF->panFieldOffset[iField] = 1;
+ else
+ psDBF->panFieldOffset[iField] =
+ psDBF->panFieldOffset[iField-1] + psDBF->panFieldSize[iField-1];
+ }
+
+ return( psDBF );
+}
+
+/************************************************************************/
+/* DBFClose() */
+/************************************************************************/
+
+void SHPAPI_CALL
+DBFClose(DBFHandle psDBF)
+{
+/* -------------------------------------------------------------------- */
+/* Write out header if not already written. */
+/* -------------------------------------------------------------------- */
+ if( psDBF->bNoHeader )
+ DBFWriteHeader( psDBF );
+
+ DBFFlushRecord( psDBF );
+
+/* -------------------------------------------------------------------- */
+/* Update last access date, and number of records if we have */
+/* write access. */
+/* -------------------------------------------------------------------- */
+ if( psDBF->bUpdated )
+ {
+ unsigned char abyFileHeader[32];
+
+ fseek( psDBF->fp, 0, 0 );
+ fread( abyFileHeader, 32, 1, psDBF->fp );
+
+ abyFileHeader[1] = 95; /* YY */
+ abyFileHeader[2] = 7; /* MM */
+ abyFileHeader[3] = 26; /* DD */
+
+ abyFileHeader[4] = psDBF->nRecords % 256;
+ abyFileHeader[5] = (psDBF->nRecords/256) % 256;
+ abyFileHeader[6] = (psDBF->nRecords/(256*256)) % 256;
+ abyFileHeader[7] = (psDBF->nRecords/(256*256*256)) % 256;
+
+ fseek( psDBF->fp, 0, 0 );
+ fwrite( abyFileHeader, 32, 1, psDBF->fp );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Close, and free resources. */
+/* -------------------------------------------------------------------- */
+ fclose( psDBF->fp );
+
+ if( psDBF->panFieldOffset != NULL )
+ {
+ free( psDBF->panFieldOffset );
+ free( psDBF->panFieldSize );
+ free( psDBF->panFieldDecimals );
+ free( psDBF->pachFieldType );
+ }
+
+ free( psDBF->pszHeader );
+ free( psDBF->pszCurrentRecord );
+
+ free( psDBF );
+
+ if( pszStringField != NULL )
+ {
+ free( pszStringField );
+ pszStringField = NULL;
+ nStringFieldLen = 0;
+ }
+}
+
+/************************************************************************/
+/* DBFCreate() */
+/* */
+/* Create a new .dbf file. */
+/************************************************************************/
+
+DBFHandle SHPAPI_CALL
+DBFCreate( const char * pszFilename )
+
+{
+ DBFHandle psDBF;
+ FILE *fp;
+ char *pszFullname, *pszBasename;
+ int i;
+
+/* -------------------------------------------------------------------- */
+/* Compute the base (layer) name. If there is any extension */
+/* on the passed in filename we will strip it off. */
+/* -------------------------------------------------------------------- */
+ pszBasename = (char *) malloc(strlen(pszFilename)+5);
+ strcpy( pszBasename, pszFilename );
+ for( i = strlen(pszBasename)-1;
+ i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/'
+ && pszBasename[i] != '\\';
+ i-- ) {}
+
+ if( pszBasename[i] == '.' )
+ pszBasename[i] = '\0';
+
+ pszFullname = (char *) malloc(strlen(pszBasename) + 5);
+ sprintf( pszFullname, "%s.dbf", pszBasename );
+ free( pszBasename );
+
+/* -------------------------------------------------------------------- */
+/* Create the file. */
+/* -------------------------------------------------------------------- */
+ fp = fopen( pszFullname, "wb" );
+ if( fp == NULL )
+ return( NULL );
+
+ fputc( 0, fp );
+ fclose( fp );
+
+ fp = fopen( pszFullname, "rb+" );
+ if( fp == NULL )
+ return( NULL );
+
+ free( pszFullname );
+
+/* -------------------------------------------------------------------- */
+/* Create the info structure. */
+/* -------------------------------------------------------------------- */
+ psDBF = (DBFHandle) malloc(sizeof(DBFInfo));
+
+ psDBF->fp = fp;
+ psDBF->nRecords = 0;
+ psDBF->nFields = 0;
+ psDBF->nRecordLength = 1;
+ psDBF->nHeaderLength = 33;
+
+ psDBF->panFieldOffset = NULL;
+ psDBF->panFieldSize = NULL;
+ psDBF->panFieldDecimals = NULL;
+ psDBF->pachFieldType = NULL;
+ psDBF->pszHeader = NULL;
+
+ psDBF->nCurrentRecord = -1;
+ psDBF->bCurrentRecordModified = FALSE;
+ psDBF->pszCurrentRecord = NULL;
+
+ psDBF->bNoHeader = TRUE;
+
+ return( psDBF );
+}
+
+/************************************************************************/
+/* DBFAddField() */
+/* */
+/* Add a field to a newly created .dbf file before any records */
+/* are written. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFAddField(DBFHandle psDBF, const char * pszFieldName,
+ DBFFieldType eType, int nWidth, int nDecimals )
+
+{
+ char *pszFInfo;
+ int i;
+
+/* -------------------------------------------------------------------- */
+/* Do some checking to ensure we can add records to this file. */
+/* -------------------------------------------------------------------- */
+ if( psDBF->nRecords > 0 )
+ return( -1 );
+
+ if( !psDBF->bNoHeader )
+ return( -1 );
+
+ if( eType != FTDouble && nDecimals != 0 )
+ return( -1 );
+
+ if( nWidth < 1 )
+ return -1;
+
+/* -------------------------------------------------------------------- */
+/* SfRealloc all the arrays larger to hold the additional field */
+/* information. */
+/* -------------------------------------------------------------------- */
+ psDBF->nFields++;
+
+ psDBF->panFieldOffset = (int *)
+ SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields );
+
+ psDBF->panFieldSize = (int *)
+ SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields );
+
+ psDBF->panFieldDecimals = (int *)
+ SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields );
+
+ psDBF->pachFieldType = (char *)
+ SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields );
+
+/* -------------------------------------------------------------------- */
+/* Assign the new field information fields. */
+/* -------------------------------------------------------------------- */
+ psDBF->panFieldOffset[psDBF->nFields-1] = psDBF->nRecordLength;
+ psDBF->nRecordLength += nWidth;
+ psDBF->panFieldSize[psDBF->nFields-1] = nWidth;
+ psDBF->panFieldDecimals[psDBF->nFields-1] = nDecimals;
+
+ if( eType == FTDate )
+ psDBF->pachFieldType[psDBF->nFields-1] = 'D';
+ else if( eType == FTLogical )
+ psDBF->pachFieldType[psDBF->nFields-1] = 'L';
+ else if( eType == FTString )
+ psDBF->pachFieldType[psDBF->nFields-1] = 'C';
+ else
+ psDBF->pachFieldType[psDBF->nFields-1] = 'N';
+
+/* -------------------------------------------------------------------- */
+/* Extend the required header information. */
+/* -------------------------------------------------------------------- */
+ psDBF->nHeaderLength += 32;
+ psDBF->bUpdated = FALSE;
+
+ psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader,psDBF->nFields*32);
+
+ pszFInfo = psDBF->pszHeader + 32 * (psDBF->nFields-1);
+
+ for( i = 0; i < 32; i++ )
+ pszFInfo[i] = '\0';
+
+ if( (int) strlen(pszFieldName) < 10 )
+ strncpy( pszFInfo, pszFieldName, strlen(pszFieldName));
+ else
+ strncpy( pszFInfo, pszFieldName, 10);
+
+ pszFInfo[11] = psDBF->pachFieldType[psDBF->nFields-1];
+
+ if( eType == FTDate )
+ {
+ pszFInfo[16] = 8 % 256;
+ pszFInfo[17] = 8 / 256;
+ }
+ else if( eType == FTString )
+ {
+ pszFInfo[16] = nWidth % 256;
+ pszFInfo[17] = nWidth / 256;
+ }
+ else
+ {
+ pszFInfo[16] = nWidth;
+ pszFInfo[17] = nDecimals;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Make the current record buffer appropriately larger. */
+/* -------------------------------------------------------------------- */
+ psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord,
+ psDBF->nRecordLength);
+
+ return( psDBF->nFields-1 );
+}
+
+/************************************************************************/
+/* DBFReadAttribute() */
+/* */
+/* Read one of the attribute fields of a record. */
+/************************************************************************/
+
+static void *DBFReadAttribute(DBFHandle psDBF, int hEntity, int iField,
+ char chReqType )
+
+{
+ int nRecordOffset;
+ unsigned char *pabyRec;
+ void *pReturnField = NULL;
+
+ static double dDoubleField;
+
+/* -------------------------------------------------------------------- */
+/* Verify selection. */
+/* -------------------------------------------------------------------- */
+ if( hEntity < 0 || hEntity >= psDBF->nRecords )
+ return( NULL );
+
+ if( iField < 0 || iField >= psDBF->nFields )
+ return( NULL );
+
+/* -------------------------------------------------------------------- */
+/* Have we read the record? */
+/* -------------------------------------------------------------------- */
+ if( psDBF->nCurrentRecord != hEntity )
+ {
+ DBFFlushRecord( psDBF );
+
+ nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength;
+
+ if( fseek( psDBF->fp, nRecordOffset, 0 ) != 0 )
+ {
+ fprintf( stderr, "fseek(%d) failed on DBF file.\n",
+ nRecordOffset );
+ return NULL;
+ }
+
+ if( fread( psDBF->pszCurrentRecord, psDBF->nRecordLength,
+ 1, psDBF->fp ) != 1 )
+ {
+ fprintf( stderr, "fread(%d) failed on DBF file.\n",
+ psDBF->nRecordLength );
+ return NULL;
+ }
+
+ psDBF->nCurrentRecord = hEntity;
+ }
+
+ pabyRec = (unsigned char *) psDBF->pszCurrentRecord;
+
+/* -------------------------------------------------------------------- */
+/* Ensure our field buffer is large enough to hold this buffer. */
+/* -------------------------------------------------------------------- */
+ if( psDBF->panFieldSize[iField]+1 > nStringFieldLen )
+ {
+ nStringFieldLen = psDBF->panFieldSize[iField]*2 + 10;
+ pszStringField = (char *) SfRealloc(pszStringField,nStringFieldLen);
+ }
+
+/* -------------------------------------------------------------------- */
+/* Extract the requested field. */
+/* -------------------------------------------------------------------- */
+ strncpy( pszStringField,
+ ((const char *) pabyRec) + psDBF->panFieldOffset[iField],
+ psDBF->panFieldSize[iField] );
+ pszStringField[psDBF->panFieldSize[iField]] = '\0';
+
+ pReturnField = pszStringField;
+
+/* -------------------------------------------------------------------- */
+/* Decode the field. */
+/* -------------------------------------------------------------------- */
+ if( chReqType == 'D' )
+ {
+ char dateField[11];
+ sprintf(dateField,"%4s/%2s/%2s",pszStringField,pszStringField+4,pszStringField+6);
+ dateField[10] = '\0';
+ pReturnField = dateField;
+ }
+ else if( chReqType == 'N' )
+ {
+ dDoubleField = atof(pszStringField);
+
+ pReturnField = &dDoubleField;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Should we trim white space off the string attribute value? */
+/* -------------------------------------------------------------------- */
+#ifdef TRIM_DBF_WHITESPACE
+ else
+ {
+ char *pchSrc, *pchDst;
+
+ pchDst = pchSrc = pszStringField;
+ while( *pchSrc == ' ' )
+ pchSrc++;
+
+ while( *pchSrc != '\0' )
+ *(pchDst++) = *(pchSrc++);
+ *pchDst = '\0';
+
+ while( pchDst != pszStringField && *(--pchDst) == ' ' )
+ *pchDst = '\0';
+ }
+#endif
+
+ return( pReturnField );
+}
+
+/************************************************************************/
+/* DBFReadIntAttribute() */
+/* */
+/* Read an integer attribute. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFReadIntegerAttribute( DBFHandle psDBF, int iRecord, int iField )
+
+{
+ double *pdValue;
+
+ pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' );
+
+ if( pdValue == NULL )
+ return 0;
+ else
+ return( (int) *pdValue );
+}
+
+/************************************************************************/
+/* DBFReadDoubleAttribute() */
+/* */
+/* Read a double attribute. */
+/************************************************************************/
+
+double SHPAPI_CALL
+DBFReadDoubleAttribute( DBFHandle psDBF, int iRecord, int iField )
+
+{
+ double *pdValue;
+
+ pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' );
+
+ if( pdValue == NULL )
+ return 0.0;
+ else
+ return( *pdValue );
+}
+
+/************************************************************************/
+/* DBFReadStringAttribute() */
+/* */
+/* Read a string attribute. */
+/************************************************************************/
+
+const char SHPAPI_CALL1(*)
+DBFReadStringAttribute( DBFHandle psDBF, int iRecord, int iField )
+
+{
+ return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'C' ) );
+}
+
+/************************************************************************/
+/* DBFReadStringAttribute() */
+/* */
+/* Read a string attribute. */
+/************************************************************************/
+
+const char SHPAPI_CALL1(*)
+DBFReadDateAttribute( DBFHandle psDBF, int iRecord, int iField )
+
+{
+ return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'D' ) );
+}
+
+/************************************************************************/
+/* DBFReadLogicalAttribute() */
+/* */
+/* Read a logical attribute. */
+/************************************************************************/
+
+const char SHPAPI_CALL1(*)
+DBFReadLogicalAttribute( DBFHandle psDBF, int iRecord, int iField )
+
+{
+ return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'L' ) );
+}
+
+/************************************************************************/
+/* DBFIsAttributeNULL() */
+/* */
+/* Return TRUE if value for field is NULL. */
+/* */
+/* Contributed by Jim Matthews. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFIsAttributeNULL( DBFHandle psDBF, int iRecord, int iField )
+
+{
+ const char *pszValue;
+
+ pszValue = DBFReadStringAttribute( psDBF, iRecord, iField );
+
+ switch(psDBF->pachFieldType[iField])
+ {
+ case 'N':
+ case 'F':
+ /* NULL numeric fields have value "****************" */
+ return pszValue[0] == '*';
+
+ case 'D':
+ /* NULL date fields have value "00000000" */
+ return strncmp(pszValue,"00000000",8) == 0;
+
+ case 'L':
+ /* NULL boolean fields have value "?" */
+ return pszValue[0] == '?';
+
+ default:
+ /* empty string fields are considered NULL */
+ return strlen(pszValue) == 0;
+ }
+}
+
+/************************************************************************/
+/* DBFGetFieldCount() */
+/* */
+/* Return the number of fields in this table. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFGetFieldCount( DBFHandle psDBF )
+
+{
+ return( psDBF->nFields );
+}
+
+/************************************************************************/
+/* DBFGetRecordCount() */
+/* */
+/* Return the number of records in this table. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFGetRecordCount( DBFHandle psDBF )
+
+{
+ return( psDBF->nRecords );
+}
+
+/************************************************************************/
+/* DBFGetFieldInfo() */
+/* */
+/* Return any requested information about the field. */
+/************************************************************************/
+
+DBFFieldType SHPAPI_CALL
+DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName,
+ int * pnWidth, int * pnDecimals )
+
+{
+ if( iField < 0 || iField >= psDBF->nFields )
+ return( FTInvalid );
+
+ if( pnWidth != NULL )
+ *pnWidth = psDBF->panFieldSize[iField];
+
+ if( pnDecimals != NULL )
+ *pnDecimals = psDBF->panFieldDecimals[iField];
+
+ if( pszFieldName != NULL )
+ {
+ int i;
+
+ strncpy( pszFieldName, (char *) psDBF->pszHeader+iField*32, 11 );
+ pszFieldName[11] = '\0';
+ for( i = 10; i > 0 && pszFieldName[i] == ' '; i-- )
+ pszFieldName[i] = '\0';
+ }
+
+ if ( psDBF->pachFieldType[iField] == 'L' )
+ return( FTLogical);
+ else if ( psDBF->pachFieldType[iField] == 'D')
+ return (FTDate);
+ else if( psDBF->pachFieldType[iField] == 'N' || psDBF->pachFieldType[iField] == 'F')
+ {
+ if( psDBF->panFieldDecimals[iField] > 0 )
+ return( FTDouble );
+ else
+ return( FTInteger );
+ }
+ else
+ {
+ return( FTString );
+ }
+}
+
+/************************************************************************/
+/* DBFWriteAttribute() */
+/* */
+/* Write an attribute record to the file. */
+/************************************************************************/
+
+static int DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField,
+ void * pValue )
+
+{
+ int nRecordOffset, i, j, nRetResult = TRUE;
+ unsigned char *pabyRec;
+ char szSField[400], szFormat[20];
+
+/* -------------------------------------------------------------------- */
+/* Is this a valid record? */
+/* -------------------------------------------------------------------- */
+ if( hEntity < 0 || hEntity > psDBF->nRecords )
+ return( FALSE );
+
+ if( psDBF->bNoHeader )
+ DBFWriteHeader(psDBF);
+
+/* -------------------------------------------------------------------- */
+/* Is this a brand new record? */
+/* -------------------------------------------------------------------- */
+ if( hEntity == psDBF->nRecords )
+ {
+ DBFFlushRecord( psDBF );
+
+ psDBF->nRecords++;
+ for( i = 0; i < psDBF->nRecordLength; i++ )
+ psDBF->pszCurrentRecord[i] = ' ';
+
+ psDBF->nCurrentRecord = hEntity;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Is this an existing record, but different than the last one */
+/* we accessed? */
+/* -------------------------------------------------------------------- */
+ if( psDBF->nCurrentRecord != hEntity )
+ {
+ DBFFlushRecord( psDBF );
+
+ nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength;
+
+ fseek( psDBF->fp, nRecordOffset, 0 );
+ fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp );
+
+ psDBF->nCurrentRecord = hEntity;
+ }
+
+ pabyRec = (unsigned char *) psDBF->pszCurrentRecord;
+
+ psDBF->bCurrentRecordModified = TRUE;
+ psDBF->bUpdated = TRUE;
+
+/* -------------------------------------------------------------------- */
+/* Translate NULL value to valid DBF file representation. */
+/* */
+/* Contributed by Jim Matthews. */
+/* -------------------------------------------------------------------- */
+ if( pValue == NULL )
+ {
+ switch(psDBF->pachFieldType[iField])
+ {
+ case 'N':
+ case 'F':
+ /* NULL numeric fields have value "****************" */
+ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '*',
+ psDBF->panFieldSize[iField] );
+ break;
+
+ case 'D':
+ /* NULL date fields have value "00000000" */
+ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '0',
+ psDBF->panFieldSize[iField] );
+ break;
+
+ case 'L':
+ /* NULL boolean fields have value "?" */
+ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '?',
+ psDBF->panFieldSize[iField] );
+ break;
+
+ default:
+ /* empty string fields are considered NULL */
+ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '\0',
+ psDBF->panFieldSize[iField] );
+ break;
+ }
+ return TRUE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Assign all the record fields. */
+/* -------------------------------------------------------------------- */
+ switch( psDBF->pachFieldType[iField] )
+ {
+ case 'N':
+ case 'F':
+ if( psDBF->panFieldDecimals[iField] == 0 )
+ {
+ int nWidth = psDBF->panFieldSize[iField];
+
+ if( sizeof(szSField)-2 < (unsigned int)nWidth )
+ nWidth = sizeof(szSField)-2;
+
+ sprintf( szFormat, "%%%dd", nWidth );
+ sprintf(szSField, szFormat, (int) *((double *) pValue) );
+ if( (int)strlen(szSField) > psDBF->panFieldSize[iField] )
+ {
+ szSField[psDBF->panFieldSize[iField]] = '\0';
+ nRetResult = FALSE;
+ }
+
+ strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]),
+ szSField, strlen(szSField) );
+ }
+ else
+ {
+ int nWidth = psDBF->panFieldSize[iField];
+
+ if( sizeof(szSField)-2 < (unsigned int)nWidth )
+ nWidth = sizeof(szSField)-2;
+
+ sprintf( szFormat, "%%%d.%df",
+ nWidth, psDBF->panFieldDecimals[iField] );
+ sprintf(szSField, szFormat, *((double *) pValue) );
+ if( (int) strlen(szSField) > psDBF->panFieldSize[iField] )
+ {
+ szSField[psDBF->panFieldSize[iField]] = '\0';
+ nRetResult = FALSE;
+ }
+ strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]),
+ szSField, strlen(szSField) );
+ }
+ break;
+
+ case 'L':
+ if (psDBF->panFieldSize[iField] >= 1 &&
+ (*(char*)pValue == 'F' || *(char*)pValue == 'T'))
+ *(pabyRec+psDBF->panFieldOffset[iField]) = *(char*)pValue;
+ break;
+
+ default:
+ if( (int) strlen((char *) pValue) > psDBF->panFieldSize[iField] )
+ {
+ j = psDBF->panFieldSize[iField];
+ nRetResult = FALSE;
+ }
+ else
+ {
+ memset( pabyRec+psDBF->panFieldOffset[iField], ' ',
+ psDBF->panFieldSize[iField] );
+ j = strlen((char *) pValue);
+ }
+
+ strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]),(char *) pValue, j );
+ break;
+ }
+
+ return( nRetResult );
+}
+
+/************************************************************************/
+/* DBFWriteAttributeDirectly() */
+/* */
+/* Write an attribute record to the file, but without any */
+/* reformatting based on type. The provided buffer is written */
+/* as is to the field position in the record. */
+/************************************************************************/
+
+int DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField,
+ void * pValue )
+
+{
+ int nRecordOffset, i, j;
+ unsigned char *pabyRec;
+
+/* -------------------------------------------------------------------- */
+/* Is this a valid record? */
+/* -------------------------------------------------------------------- */
+ if( hEntity < 0 || hEntity > psDBF->nRecords )
+ return( FALSE );
+
+ if( psDBF->bNoHeader )
+ DBFWriteHeader(psDBF);
+
+/* -------------------------------------------------------------------- */
+/* Is this a brand new record? */
+/* -------------------------------------------------------------------- */
+ if( hEntity == psDBF->nRecords )
+ {
+ DBFFlushRecord( psDBF );
+
+ psDBF->nRecords++;
+ for( i = 0; i < psDBF->nRecordLength; i++ )
+ psDBF->pszCurrentRecord[i] = ' ';
+
+ psDBF->nCurrentRecord = hEntity;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Is this an existing record, but different than the last one */
+/* we accessed? */
+/* -------------------------------------------------------------------- */
+ if( psDBF->nCurrentRecord != hEntity )
+ {
+ DBFFlushRecord( psDBF );
+
+ nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength;
+
+ fseek( psDBF->fp, nRecordOffset, 0 );
+ fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp );
+
+ psDBF->nCurrentRecord = hEntity;
+ }
+
+ pabyRec = (unsigned char *) psDBF->pszCurrentRecord;
+
+/* -------------------------------------------------------------------- */
+/* Assign all the record fields. */
+/* -------------------------------------------------------------------- */
+ if( (int)strlen((char *) pValue) > psDBF->panFieldSize[iField] )
+ j = psDBF->panFieldSize[iField];
+ else
+ {
+ memset( pabyRec+psDBF->panFieldOffset[iField], ' ',
+ psDBF->panFieldSize[iField] );
+ j = strlen((char *) pValue);
+ }
+
+ strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]),
+ (char *) pValue, j );
+
+ psDBF->bCurrentRecordModified = TRUE;
+ psDBF->bUpdated = TRUE;
+
+ return( TRUE );
+}
+
+/************************************************************************/
+/* DBFWriteDoubleAttribute() */
+/* */
+/* Write a double attribute. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteDoubleAttribute( DBFHandle psDBF, int iRecord, int iField,
+ double dValue )
+
+{
+ return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) );
+}
+
+/************************************************************************/
+/* DBFWriteIntegerAttribute() */
+/* */
+/* Write a integer attribute. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteIntegerAttribute( DBFHandle psDBF, int iRecord, int iField,
+ int nValue )
+
+{
+ double dValue = nValue;
+
+ return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) );
+}
+
+/************************************************************************/
+/* DBFWriteStringAttribute() */
+/* */
+/* Write a string attribute. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteStringAttribute( DBFHandle psDBF, int iRecord, int iField,
+ const char * pszValue )
+
+{
+ return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) pszValue ) );
+}
+
+/************************************************************************/
+/* DBFWriteDateAttribute() */
+/* */
+/* Write a date attribute. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteDateAttribute( DBFHandle psDBF, int iRecord, int iField,
+ const char * pszValue )
+
+{
+ return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) pszValue ) );
+}
+
+/************************************************************************/
+/* DBFWriteNULLAttribute() */
+/* */
+/* Write a string attribute. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteNULLAttribute( DBFHandle psDBF, int iRecord, int iField )
+
+{
+ return( DBFWriteAttribute( psDBF, iRecord, iField, NULL ) );
+}
+
+/************************************************************************/
+/* DBFWriteLogicalAttribute() */
+/* */
+/* Write a logical attribute. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteLogicalAttribute( DBFHandle psDBF, int iRecord, int iField,
+ const char lValue)
+
+{
+ return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) (&lValue) ) );
+}
+
+/************************************************************************/
+/* DBFWriteTuple() */
+/* */
+/* Write an attribute record to the file. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple )
+
+{
+ int nRecordOffset, i;
+ unsigned char *pabyRec;
+
+/* -------------------------------------------------------------------- */
+/* Is this a valid record? */
+/* -------------------------------------------------------------------- */
+ if( hEntity < 0 || hEntity > psDBF->nRecords )
+ return( FALSE );
+
+ if( psDBF->bNoHeader )
+ DBFWriteHeader(psDBF);
+
+/* -------------------------------------------------------------------- */
+/* Is this a brand new record? */
+/* -------------------------------------------------------------------- */
+ if( hEntity == psDBF->nRecords )
+ {
+ DBFFlushRecord( psDBF );
+
+ psDBF->nRecords++;
+ for( i = 0; i < psDBF->nRecordLength; i++ )
+ psDBF->pszCurrentRecord[i] = ' ';
+
+ psDBF->nCurrentRecord = hEntity;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Is this an existing record, but different than the last one */
+/* we accessed? */
+/* -------------------------------------------------------------------- */
+ if( psDBF->nCurrentRecord != hEntity )
+ {
+ DBFFlushRecord( psDBF );
+
+ nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength;
+
+ fseek( psDBF->fp, nRecordOffset, 0 );
+ fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp );
+
+ psDBF->nCurrentRecord = hEntity;
+ }
+
+ pabyRec = (unsigned char *) psDBF->pszCurrentRecord;
+
+ memcpy ( pabyRec, pRawTuple, psDBF->nRecordLength );
+
+ psDBF->bCurrentRecordModified = TRUE;
+ psDBF->bUpdated = TRUE;
+
+ return( TRUE );
+}
+
+/************************************************************************/
+/* DBFReadTuple() */
+/* */
+/* Read one of the attribute fields of a record. */
+/************************************************************************/
+
+const char SHPAPI_CALL1(*)
+DBFReadTuple(DBFHandle psDBF, int hEntity )
+
+{
+ int nRecordOffset;
+ unsigned char *pabyRec;
+ static char *pReturnTuple = NULL;
+
+ static int nTupleLen = 0;
+
+/* -------------------------------------------------------------------- */
+/* Have we read the record? */
+/* -------------------------------------------------------------------- */
+ if( hEntity < 0 || hEntity >= psDBF->nRecords )
+ return( NULL );
+
+ if( psDBF->nCurrentRecord != hEntity )
+ {
+ DBFFlushRecord( psDBF );
+
+ nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength;
+
+ fseek( psDBF->fp, nRecordOffset, 0 );
+ fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp );
+
+ psDBF->nCurrentRecord = hEntity;
+ }
+
+ pabyRec = (unsigned char *) psDBF->pszCurrentRecord;
+
+ if ( nTupleLen < psDBF->nRecordLength) {
+ nTupleLen = psDBF->nRecordLength;
+ pReturnTuple = (char *) SfRealloc(pReturnTuple, psDBF->nRecordLength);
+ }
+
+ memcpy ( pReturnTuple, pabyRec, psDBF->nRecordLength );
+
+ return( pReturnTuple );
+}
+
+/************************************************************************/
+/* DBFCloneEmpty() */
+/* */
+/* Read one of the attribute fields of a record. */
+/************************************************************************/
+
+DBFHandle SHPAPI_CALL
+DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename )
+{
+ DBFHandle newDBF;
+
+ newDBF = DBFCreate ( pszFilename );
+ if ( newDBF == NULL ) return ( NULL );
+
+ newDBF->pszHeader = (char *) malloc ( 32 * psDBF->nFields );
+ memcpy ( newDBF->pszHeader, psDBF->pszHeader, 32 * psDBF->nFields );
+
+ newDBF->nFields = psDBF->nFields;
+ newDBF->nRecordLength = psDBF->nRecordLength;
+ newDBF->nHeaderLength = 32 * (psDBF->nFields+1);
+
+ newDBF->panFieldOffset = (int *) malloc ( sizeof(int) * psDBF->nFields );
+ memcpy ( newDBF->panFieldOffset, psDBF->panFieldOffset, sizeof(int) * psDBF->nFields );
+ newDBF->panFieldSize = (int *) malloc ( sizeof(int) * psDBF->nFields );
+ memcpy ( newDBF->panFieldSize, psDBF->panFieldSize, sizeof(int) * psDBF->nFields );
+ newDBF->panFieldDecimals = (int *) malloc ( sizeof(int) * psDBF->nFields );
+ memcpy ( newDBF->panFieldDecimals, psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields );
+ newDBF->pachFieldType = (char *) malloc ( sizeof(int) * psDBF->nFields );
+ memcpy ( newDBF->pachFieldType, psDBF->pachFieldType, sizeof(int) * psDBF->nFields );
+
+ newDBF->bNoHeader = TRUE;
+ newDBF->bUpdated = TRUE;
+
+ DBFWriteHeader ( newDBF );
+ DBFClose ( newDBF );
+
+ newDBF = DBFOpen ( pszFilename, "rb+" );
+
+ return ( newDBF );
+}
+
+/************************************************************************/
+/* DBFGetNativeFieldType() */
+/* */
+/* Return the DBase field type for the specified field. */
+/* */
+/* Value can be one of: 'C' (String), 'D' (Date), 'F' (Float), */
+/* 'N' (Numeric, with or without decimal), */
+/* 'L' (Logical), */
+/* 'M' (Memo: 10 digits .DBT block ptr) */
+/************************************************************************/
+
+char SHPAPI_CALL
+DBFGetNativeFieldType( DBFHandle psDBF, int iField )
+
+{
+ if( iField >=0 && iField < psDBF->nFields )
+ return psDBF->pachFieldType[iField];
+
+ return ' ';
+}
+
+/************************************************************************/
+/* str_to_upper() */
+/************************************************************************/
+
+static void str_to_upper (char *string)
+{
+ int len;
+ short i = -1;
+
+ len = strlen (string);
+
+ while (++i < len)
+ if (isalpha(string[i]) && islower(string[i]))
+ string[i] = toupper ((int)string[i]);
+}
+
+/************************************************************************/
+/* DBFGetFieldIndex() */
+/* */
+/* Get the index number for a field in a .dbf file. */
+/* */
+/* Contributed by Jim Matthews. */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName)
+
+{
+ char name[12], name1[12], name2[12];
+ int i;
+
+ strncpy(name1, pszFieldName,11);
+ name1[11] = '\0';
+ str_to_upper(name1);
+
+ for( i = 0; i < DBFGetFieldCount(psDBF); i++ )
+ {
+ DBFGetFieldInfo( psDBF, i, name, NULL, NULL );
+ strncpy(name2,name,11);
+ str_to_upper(name2);
+
+ if(!strncmp(name1,name2,10))
+ return(i);
+ }
+ return(-1);
+}
diff --git a/src/shapelib/shapefil.h b/src/shapelib/shapefil.h
new file mode 100644
index 0000000..3e2aec6
--- /dev/null
+++ b/src/shapelib/shapefil.h
@@ -0,0 +1,496 @@
+#ifndef _SHAPEFILE_H_INCLUDED
+#define _SHAPEFILE_H_INCLUDED
+
+/******************************************************************************
+ * $Id: shapefil.h,v 1.3 2004/04/29 14:48:57 lubia Exp $
+ *
+ * Project: Shapelib
+ * Purpose: Primary include file for Shapelib.
+ * Author: Frank Warmerdam, warmerdam at pobox.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * This software is available under the following "MIT Style" license,
+ * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This
+ * option is discussed in more detail in shapelib.html.
+ *
+ * --
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: shapefil.h,v $
+ * Revision 1.3 2004/04/29 14:48:57 lubia
+ * modificacao de tempo
+ *
+ * Revision 1.2 2004/02/20 14:10:42 lubia
+ * Migrando para ultima versao da shapelib: 1.2.10
+ *
+ * Revision 1.26 2002/09/29 00:00:08 warmerda
+ * added FTLogical and logical attribute read/write calls
+ *
+ * Revision 1.25 2002/05/07 13:46:30 warmerda
+ * added DBFWriteAttributeDirectly().
+ *
+ * Revision 1.24 2002/04/10 16:59:54 warmerda
+ * added SHPRewindObject
+ *
+ * Revision 1.23 2002/01/15 14:36:07 warmerda
+ * updated email address
+ *
+ * Revision 1.22 2002/01/15 14:32:00 warmerda
+ * try to improve SHPAPI_CALL docs
+ *
+ * Revision 1.21 2001/11/01 16:29:55 warmerda
+ * move pabyRec into SHPInfo for thread safety
+ *
+ * Revision 1.20 2001/07/20 13:06:02 warmerda
+ * fixed SHPAPI attribute for SHPTreeFindLikelyShapes
+ *
+ * Revision 1.19 2001/05/31 19:20:13 warmerda
+ * added DBFGetFieldIndex()
+ *
+ * Revision 1.18 2001/05/31 18:15:40 warmerda
+ * Added support for NULL fields in DBF files
+ *
+ * Revision 1.17 2001/05/23 13:36:52 warmerda
+ * added use of SHPAPI_CALL
+ *
+ * Revision 1.16 2000/09/25 14:15:59 warmerda
+ * added DBFGetNativeFieldType()
+ *
+ * Revision 1.15 2000/02/16 16:03:51 warmerda
+ * added null shape support
+ *
+ * Revision 1.14 1999/11/05 14:12:05 warmerda
+ * updated license terms
+ *
+ * Revision 1.13 1999/06/02 18:24:21 warmerda
+ * added trimming code
+ *
+ * Revision 1.12 1999/06/02 17:56:12 warmerda
+ * added quad'' subnode support for trees
+ *
+ * Revision 1.11 1999/05/18 19:11:11 warmerda
+ * Added example searching capability
+ *
+ * Revision 1.10 1999/05/18 17:49:38 warmerda
+ * added initial quadtree support
+ *
+ * Revision 1.9 1999/05/11 03:19:28 warmerda
+ * added new Tuple api, and improved extension handling - add from candrsn
+ *
+ * Revision 1.8 1999/03/23 17:22:27 warmerda
+ * Added extern "C" protection for C++ users of shapefil.h.
+ *
+ * Revision 1.7 1998/12/31 15:31:07 warmerda
+ * Added the TRIM_DBF_WHITESPACE and DISABLE_MULTIPATCH_MEASURE options.
+ *
+ * Revision 1.6 1998/12/03 15:48:15 warmerda
+ * Added SHPCalculateExtents().
+ *
+ * Revision 1.5 1998/11/09 20:57:16 warmerda
+ * Altered SHPGetInfo() call.
+ *
+ * Revision 1.4 1998/11/09 20:19:33 warmerda
+ * Added 3D support, and use of SHPObject.
+ *
+ * Revision 1.3 1995/08/23 02:24:05 warmerda
+ * Added support for reading bounds.
+ *
+ * Revision 1.2 1995/08/04 03:17:39 warmerda
+ * Added header.
+ *
+ */
+
+#include <stdio.h>
+
+#ifdef USE_DBMALLOC
+#include <dbmalloc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/************************************************************************/
+/* Configuration options. */
+/************************************************************************/
+
+/* -------------------------------------------------------------------- */
+/* Should the DBFReadStringAttribute() strip leading and */
+/* trailing white space? */
+/* -------------------------------------------------------------------- */
+#define TRIM_DBF_WHITESPACE
+
+/* -------------------------------------------------------------------- */
+/* Should we write measure values to the Multipatch object? */
+/* Reportedly ArcView crashes if we do write it, so for now it */
+/* is disabled. */
+/* -------------------------------------------------------------------- */
+#define DISABLE_MULTIPATCH_MEASURE
+
+/* -------------------------------------------------------------------- */
+/* SHPAPI_CALL */
+/* */
+/* The following two macros are present to allow forcing */
+/* various calling conventions on the Shapelib API. */
+/* */
+/* To force __stdcall conventions (needed to call Shapelib */
+/* from Visual Basic and/or Dephi I believe) the makefile could */
+/* be modified to define: */
+/* */
+/* /DSHPAPI_CALL=__stdcall */
+/* */
+/* If it is desired to force export of the Shapelib API without */
+/* using the shapelib.def file, use the following definition. */
+/* */
+/* /DSHAPELIB_DLLEXPORT */
+/* */
+/* To get both at once it will be necessary to hack this */
+/* include file to define: */
+/* */
+/* #define SHPAPI_CALL __declspec(dllexport) __stdcall */
+/* #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall */
+/* */
+/* The complexity of the situtation is partly caused by the */
+/* peculiar requirement of Visual C++ that __stdcall appear */
+/* after any "*"'s in the return value of a function while the */
+/* __declspec(dllexport) must appear before them. */
+/* -------------------------------------------------------------------- */
+
+#ifdef SHAPELIB_DLLEXPORT
+# define SHPAPI_CALL __declspec(dllexport)
+# define SHPAPI_CALL1(x) __declspec(dllexport) x
+#endif
+
+#ifndef SHPAPI_CALL
+# define SHPAPI_CALL
+#endif
+
+#ifndef SHPAPI_CALL1
+# define SHPAPI_CALL1(x) x SHPAPI_CALL
+#endif
+
+/************************************************************************/
+/* SHP Support. */
+/************************************************************************/
+typedef struct
+{
+ FILE *fpSHP;
+ FILE *fpSHX;
+
+ int nShapeType; /* SHPT_* */
+
+ int nFileSize; /* SHP file */
+
+ int nRecords;
+ int nMaxRecords;
+ int *panRecOffset;
+ int *panRecSize;
+
+ double adBoundsMin[4];
+ double adBoundsMax[4];
+
+ int bUpdated;
+
+ unsigned char *pabyRec;
+ int nBufSize;
+} SHPInfo;
+
+typedef SHPInfo * SHPHandle;
+
+/* -------------------------------------------------------------------- */
+/* Shape types (nSHPType) */
+/* -------------------------------------------------------------------- */
+#define SHPT_NULL 0
+#define SHPT_POINT 1
+#define SHPT_ARC 3
+#define SHPT_POLYGON 5
+#define SHPT_MULTIPOINT 8
+#define SHPT_POINTZ 11
+#define SHPT_ARCZ 13
+#define SHPT_POLYGONZ 15
+#define SHPT_MULTIPOINTZ 18
+#define SHPT_POINTM 21
+#define SHPT_ARCM 23
+#define SHPT_POLYGONM 25
+#define SHPT_MULTIPOINTM 28
+#define SHPT_MULTIPATCH 31
+
+
+/* -------------------------------------------------------------------- */
+/* Part types - everything but SHPT_MULTIPATCH just uses */
+/* SHPP_RING. */
+/* -------------------------------------------------------------------- */
+
+#define SHPP_TRISTRIP 0
+#define SHPP_TRIFAN 1
+#define SHPP_OUTERRING 2
+#define SHPP_INNERRING 3
+#define SHPP_FIRSTRING 4
+#define SHPP_RING 5
+
+/* -------------------------------------------------------------------- */
+/* SHPObject - represents on shape (without attributes) read */
+/* from the .shp file. */
+/* -------------------------------------------------------------------- */
+typedef struct
+{
+ int nSHPType;
+
+ int nShapeId; /* -1 is unknown/unassigned */
+
+ int nParts;
+ int *panPartStart;
+ int *panPartType;
+
+ int nVertices;
+ double *padfX;
+ double *padfY;
+ double *padfZ;
+ double *padfM;
+
+ double dfXMin;
+ double dfYMin;
+ double dfZMin;
+ double dfMMin;
+
+ double dfXMax;
+ double dfYMax;
+ double dfZMax;
+ double dfMMax;
+} SHPObject;
+
+/* -------------------------------------------------------------------- */
+/* SHP API Prototypes */
+/* -------------------------------------------------------------------- */
+SHPHandle SHPAPI_CALL
+ SHPOpen( const char * pszShapeFile, const char * pszAccess );
+SHPHandle SHPAPI_CALL
+ SHPCreate( const char * pszShapeFile, int nShapeType );
+void SHPAPI_CALL
+ SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType,
+ double * padfMinBound, double * padfMaxBound );
+
+SHPObject SHPAPI_CALL1(*)
+ SHPReadObject( SHPHandle hSHP, int iShape );
+int SHPAPI_CALL
+ SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject );
+
+void SHPAPI_CALL
+ SHPDestroyObject( SHPObject * psObject );
+void SHPAPI_CALL
+ SHPComputeExtents( SHPObject * psObject );
+SHPObject SHPAPI_CALL1(*)
+ SHPCreateObject( int nSHPType, int nShapeId,
+ int nParts, int * panPartStart, int * panPartType,
+ int nVertices, double * padfX, double * padfY,
+ double * padfZ, double * padfM );
+SHPObject SHPAPI_CALL1(*)
+ SHPCreateSimpleObject( int nSHPType, int nVertices,
+ double * padfX, double * padfY, double * padfZ );
+
+int SHPAPI_CALL
+ SHPRewindObject( SHPHandle hSHP, SHPObject * psObject );
+
+void SHPAPI_CALL
+ SHPClose( SHPHandle hSHP );
+
+const char SHPAPI_CALL1(*)
+ SHPTypeName( int nSHPType );
+const char SHPAPI_CALL1(*)
+ SHPPartTypeName( int nPartType );
+
+/* -------------------------------------------------------------------- */
+/* Shape quadtree indexing API. */
+/* -------------------------------------------------------------------- */
+
+/* this can be two or four for binary or quad tree */
+#define MAX_SUBNODE 4
+
+typedef struct shape_tree_node
+{
+ /* region covered by this node */
+ double adfBoundsMin[4];
+ double adfBoundsMax[4];
+
+ /* list of shapes stored at this node. The papsShapeObj pointers
+ or the whole list can be NULL */
+ int nShapeCount;
+ int *panShapeIds;
+ SHPObject **papsShapeObj;
+
+ int nSubNodes;
+ struct shape_tree_node *apsSubNode[MAX_SUBNODE];
+
+} SHPTreeNode;
+
+typedef struct
+{
+ SHPHandle hSHP;
+
+ int nMaxDepth;
+ int nDimension;
+
+ SHPTreeNode *psRoot;
+} SHPTree;
+
+SHPTree SHPAPI_CALL1(*)
+ SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth,
+ double *padfBoundsMin, double *padfBoundsMax );
+void SHPAPI_CALL
+ SHPDestroyTree( SHPTree * hTree );
+
+int SHPAPI_CALL
+ SHPWriteTree( SHPTree *hTree, const char * pszFilename );
+SHPTree SHPAPI_CALL
+ SHPReadTree( const char * pszFilename );
+
+int SHPAPI_CALL
+ SHPTreeAddObject( SHPTree * hTree, SHPObject * psObject );
+int SHPAPI_CALL
+ SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject );
+int SHPAPI_CALL
+ SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId );
+
+void SHPAPI_CALL
+ SHPTreeTrimExtraNodes( SHPTree * hTree );
+
+int SHPAPI_CALL1(*)
+ SHPTreeFindLikelyShapes( SHPTree * hTree,
+ double * padfBoundsMin,
+ double * padfBoundsMax,
+ int * );
+int SHPAPI_CALL
+ SHPCheckBoundsOverlap( double *, double *, double *, double *, int );
+
+/************************************************************************/
+/* DBF Support. */
+/************************************************************************/
+typedef struct
+{
+ FILE *fp;
+
+ int nRecords;
+
+ int nRecordLength;
+ int nHeaderLength;
+ int nFields;
+ int *panFieldOffset;
+ int *panFieldSize;
+ int *panFieldDecimals;
+ char *pachFieldType;
+
+ char *pszHeader;
+
+ int nCurrentRecord;
+ int bCurrentRecordModified;
+ char *pszCurrentRecord;
+
+ int bNoHeader;
+ int bUpdated;
+} DBFInfo;
+
+typedef DBFInfo * DBFHandle;
+
+typedef enum {
+ FTString,
+ FTInteger,
+ FTDouble,
+ FTLogical,
+ FTInvalid,
+ FTDate,
+} DBFFieldType;
+
+#define XBASE_FLDHDR_SZ 32
+
+DBFHandle SHPAPI_CALL
+ DBFOpen( const char * pszDBFFile, const char * pszAccess );
+DBFHandle SHPAPI_CALL
+ DBFCreate( const char * pszDBFFile );
+
+int SHPAPI_CALL
+ DBFGetFieldCount( DBFHandle psDBF );
+int SHPAPI_CALL
+ DBFGetRecordCount( DBFHandle psDBF );
+int SHPAPI_CALL
+ DBFAddField( DBFHandle hDBF, const char * pszFieldName,
+ DBFFieldType eType, int nWidth, int nDecimals );
+
+DBFFieldType SHPAPI_CALL
+ DBFGetFieldInfo( DBFHandle psDBF, int iField,
+ char * pszFieldName, int * pnWidth, int * pnDecimals );
+
+int SHPAPI_CALL
+ DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName);
+
+int SHPAPI_CALL
+ DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField );
+double SHPAPI_CALL
+ DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField );
+const char SHPAPI_CALL1(*)
+ DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField );
+const char SHPAPI_CALL1(*)
+ DBFReadDatettribute( DBFHandle hDBF, int iShape, int iField );
+const char SHPAPI_CALL1(*)
+ DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField );
+int SHPAPI_CALL
+ DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField );
+
+int SHPAPI_CALL
+ DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField,
+ int nFieldValue );
+int SHPAPI_CALL
+ DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField,
+ double dFieldValue );
+int SHPAPI_CALL
+ DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField,
+ const char * pszFieldValue );
+int SHPAPI_CALL
+ DBFWriteDateAttribute( DBFHandle hDBF, int iShape, int iField,
+ const char * pszFieldValue );
+int SHPAPI_CALL
+ DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField );
+
+int SHPAPI_CALL
+ DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField,
+ const char lFieldValue);
+int SHPAPI_CALL
+ DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField,
+ void * pValue );
+const char SHPAPI_CALL1(*)
+ DBFReadTuple(DBFHandle psDBF, int hEntity );
+int SHPAPI_CALL
+ DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple );
+
+DBFHandle SHPAPI_CALL
+ DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename );
+
+void SHPAPI_CALL
+ DBFClose( DBFHandle hDBF );
+char SHPAPI_CALL
+ DBFGetNativeFieldType( DBFHandle hDBF, int iField );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ndef _SHAPEFILE_H_INCLUDED */
diff --git a/src/shapelib/shpopen.c b/src/shapelib/shpopen.c
new file mode 100644
index 0000000..b33b16b
--- /dev/null
+++ b/src/shapelib/shpopen.c
@@ -0,0 +1,1872 @@
+/******************************************************************************
+ * $Id: shpopen.c,v 1.4 2004/11/01 14:54:44 juan Exp $
+ *
+ * Project: Shapelib
+ * Purpose: Implementation of core Shapefile read/write functions.
+ * Author: Frank Warmerdam, warmerdam at pobox.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, 2001, Frank Warmerdam
+ *
+ * This software is available under the following "MIT Style" license,
+ * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This
+ * option is discussed in more detail in shapelib.html.
+ *
+ * --
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: shpopen.c,v $
+ * Revision 1.4 2004/11/01 14:54:44 juan
+ * Warning removed
+ *
+ * Revision 1.3 2004/02/20 14:10:42 lubia
+ * Migrando para ultima versao da shapelib: 1.2.10
+ *
+ * Revision 1.39 2002/08/26 06:46:56 warmerda
+ * avoid c++ comments
+ *
+ * Revision 1.38 2002/05/07 16:43:39 warmerda
+ * Removed debugging printf.
+ *
+ * Revision 1.37 2002/04/10 17:35:22 warmerda
+ * fixed bug in ring reversal code
+ *
+ * Revision 1.36 2002/04/10 16:59:54 warmerda
+ * added SHPRewindObject
+ *
+ * Revision 1.35 2001/12/07 15:10:44 warmerda
+ * fix if .shx fails to open
+ *
+ * Revision 1.34 2001/11/01 16:29:55 warmerda
+ * move pabyRec into SHPInfo for thread safety
+ *
+ * Revision 1.33 2001/07/03 12:18:15 warmerda
+ * Improved cleanup if SHX not found, provied by Riccardo Cohen.
+ *
+ * Revision 1.32 2001/06/22 01:58:07 warmerda
+ * be more careful about establishing initial bounds in face of NULL shapes
+ *
+ * Revision 1.31 2001/05/31 19:35:29 warmerda
+ * added support for writing null shapes
+ *
+ * Revision 1.30 2001/05/28 12:46:29 warmerda
+ * Add some checking on reasonableness of record count when opening.
+ *
+ * Revision 1.29 2001/05/23 13:36:52 warmerda
+ * added use of SHPAPI_CALL
+ *
+ * Revision 1.28 2001/02/06 22:25:06 warmerda
+ * fixed memory leaks when SHPOpen() fails
+ *
+ * Revision 1.27 2000/07/18 15:21:33 warmerda
+ * added better enforcement of -1 for append in SHPWriteObject
+ *
+ * Revision 1.26 2000/02/16 16:03:51 warmerda
+ * added null shape support
+ *
+ * Revision 1.25 1999/12/15 13:47:07 warmerda
+ * Fixed record size settings in .shp file (was 4 words too long)
+ * Added stdlib.h.
+ *
+ * Revision 1.24 1999/11/05 14:12:04 warmerda
+ * updated license terms
+ *
+ * Revision 1.23 1999/07/27 00:53:46 warmerda
+ * added support for rewriting shapes
+ *
+ * Revision 1.22 1999/06/11 19:19:11 warmerda
+ * Cleanup pabyRec static buffer on SHPClose().
+ *
+ * Revision 1.21 1999/06/02 14:57:56 kshih
+ * Remove unused variables
+ *
+ * Revision 1.20 1999/04/19 21:04:17 warmerda
+ * Fixed syntax error.
+ *
+ * Revision 1.19 1999/04/19 21:01:57 warmerda
+ * Force access string to binary in SHPOpen().
+ *
+ * Revision 1.18 1999/04/01 18:48:07 warmerda
+ * Try upper case extensions if lower case doesn't work.
+ *
+ * Revision 1.17 1998/12/31 15:29:39 warmerda
+ * Disable writing measure values to multipatch objects if
+ * DISABLE_MULTIPATCH_MEASURE is defined.
+ *
+ * Revision 1.16 1998/12/16 05:14:33 warmerda
+ * Added support to write MULTIPATCH. Fixed reading Z coordinate of
+ * MULTIPATCH. Fixed record size written for all feature types.
+ *
+ * Revision 1.15 1998/12/03 16:35:29 warmerda
+ * r+b is proper binary access string, not rb+.
+ *
+ * Revision 1.14 1998/12/03 15:47:56 warmerda
+ * Fixed setting of nVertices in SHPCreateObject().
+ *
+ * Revision 1.13 1998/12/03 15:33:54 warmerda
+ * Made SHPCalculateExtents() separately callable.
+ *
+ * Revision 1.12 1998/11/11 20:01:50 warmerda
+ * Fixed bug writing ArcM/Z, and PolygonM/Z for big endian machines.
+ *
+ * Revision 1.11 1998/11/09 20:56:44 warmerda
+ * Fixed up handling of file wide bounds.
+ *
+ * Revision 1.10 1998/11/09 20:18:51 warmerda
+ * Converted to support 3D shapefiles, and use of SHPObject.
+ *
+ * Revision 1.9 1998/02/24 15:09:05 warmerda
+ * Fixed memory leak.
+ *
+ * Revision 1.8 1997/12/04 15:40:29 warmerda
+ * Fixed byte swapping of record number, and record length fields in the
+ * .shp file.
+ *
+ * Revision 1.7 1995/10/21 03:15:58 warmerda
+ * Added support for binary file access, the magic cookie 9997
+ * and tried to improve the int32 selection logic for 16bit systems.
+ *
+ * Revision 1.6 1995/09/04 04:19:41 warmerda
+ * Added fix for file bounds.
+ *
+ * Revision 1.5 1995/08/25 15:16:44 warmerda
+ * Fixed a couple of problems with big endian systems ... one with bounds
+ * and the other with multipart polygons.
+ *
+ * Revision 1.4 1995/08/24 18:10:17 warmerda
+ * Switch to use SfRealloc() to avoid problems with pre-ANSI realloc()
+ * functions (such as on the Sun).
+ *
+ * Revision 1.3 1995/08/23 02:23:15 warmerda
+ * Added support for reading bounds, and fixed up problems in setting the
+ * file wide bounds.
+ *
+ * Revision 1.2 1995/08/04 03:16:57 warmerda
+ * Added header.
+ *
+ */
+
+/* static char rcsid[] =
+ "$Id: shpopen.c,v 1.4 2004/11/01 14:54:44 juan Exp $"; */
+
+#include "shapefil.h"
+
+#include <math.h>
+#include <limits.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef unsigned char uchar;
+
+#if UINT_MAX == 65535
+typedef long int32;
+#else
+typedef int int32;
+#endif
+
+#ifndef FALSE
+# define FALSE 0
+# define TRUE 1
+#endif
+
+#define ByteCopy( a, b, c ) memcpy( b, a, c )
+#ifndef MAX
+# define MIN(a,b) ((a<b) ? a : b)
+# define MAX(a,b) ((a>b) ? a : b)
+#endif
+
+static int bBigEndian;
+
+
+/************************************************************************/
+/* SwapWord() */
+/* */
+/* Swap a 2, 4 or 8 byte word. */
+/************************************************************************/
+
+static void SwapWord( int length, void * wordP )
+
+{
+ int i;
+ uchar temp;
+
+ for( i=0; i < length/2; i++ )
+ {
+ temp = ((uchar *) wordP)[i];
+ ((uchar *)wordP)[i] = ((uchar *) wordP)[length-i-1];
+ ((uchar *) wordP)[length-i-1] = temp;
+ }
+}
+
+/************************************************************************/
+/* SfRealloc() */
+/* */
+/* A realloc cover function that will access a NULL pointer as */
+/* a valid input. */
+/************************************************************************/
+
+static void * SfRealloc( void * pMem, int nNewSize )
+
+{
+ if( pMem == NULL )
+ return( (void *) malloc(nNewSize) );
+ else
+ return( (void *) realloc(pMem,nNewSize) );
+}
+
+/************************************************************************/
+/* SHPWriteHeader() */
+/* */
+/* Write out a header for the .shp and .shx files as well as the */
+/* contents of the index (.shx) file. */
+/************************************************************************/
+
+static void SHPWriteHeader( SHPHandle psSHP )
+
+{
+ uchar abyHeader[100];
+ int i;
+ int32 i32;
+ double dValue;
+ int32 *panSHX;
+
+/* -------------------------------------------------------------------- */
+/* Prepare header block for .shp file. */
+/* -------------------------------------------------------------------- */
+ for( i = 0; i < 100; i++ )
+ abyHeader[i] = 0;
+
+ abyHeader[2] = 0x27; /* magic cookie */
+ abyHeader[3] = 0x0a;
+
+ i32 = psSHP->nFileSize/2; /* file size */
+ ByteCopy( &i32, abyHeader+24, 4 );
+ if( !bBigEndian ) SwapWord( 4, abyHeader+24 );
+
+ i32 = 1000; /* version */
+ ByteCopy( &i32, abyHeader+28, 4 );
+ if( bBigEndian ) SwapWord( 4, abyHeader+28 );
+
+ i32 = psSHP->nShapeType; /* shape type */
+ ByteCopy( &i32, abyHeader+32, 4 );
+ if( bBigEndian ) SwapWord( 4, abyHeader+32 );
+
+ dValue = psSHP->adBoundsMin[0]; /* set bounds */
+ ByteCopy( &dValue, abyHeader+36, 8 );
+ if( bBigEndian ) SwapWord( 8, abyHeader+36 );
+
+ dValue = psSHP->adBoundsMin[1];
+ ByteCopy( &dValue, abyHeader+44, 8 );
+ if( bBigEndian ) SwapWord( 8, abyHeader+44 );
+
+ dValue = psSHP->adBoundsMax[0];
+ ByteCopy( &dValue, abyHeader+52, 8 );
+ if( bBigEndian ) SwapWord( 8, abyHeader+52 );
+
+ dValue = psSHP->adBoundsMax[1];
+ ByteCopy( &dValue, abyHeader+60, 8 );
+ if( bBigEndian ) SwapWord( 8, abyHeader+60 );
+
+ dValue = psSHP->adBoundsMin[2]; /* z */
+ ByteCopy( &dValue, abyHeader+68, 8 );
+ if( bBigEndian ) SwapWord( 8, abyHeader+68 );
+
+ dValue = psSHP->adBoundsMax[2];
+ ByteCopy( &dValue, abyHeader+76, 8 );
+ if( bBigEndian ) SwapWord( 8, abyHeader+76 );
+
+ dValue = psSHP->adBoundsMin[3]; /* m */
+ ByteCopy( &dValue, abyHeader+84, 8 );
+ if( bBigEndian ) SwapWord( 8, abyHeader+84 );
+
+ dValue = psSHP->adBoundsMax[3];
+ ByteCopy( &dValue, abyHeader+92, 8 );
+ if( bBigEndian ) SwapWord( 8, abyHeader+92 );
+
+/* -------------------------------------------------------------------- */
+/* Write .shp file header. */
+/* -------------------------------------------------------------------- */
+ fseek( psSHP->fpSHP, 0, 0 );
+ fwrite( abyHeader, 100, 1, psSHP->fpSHP );
+
+/* -------------------------------------------------------------------- */
+/* Prepare, and write .shx file header. */
+/* -------------------------------------------------------------------- */
+ i32 = (psSHP->nRecords * 2 * sizeof(int32) + 100)/2; /* file size */
+ ByteCopy( &i32, abyHeader+24, 4 );
+ if( !bBigEndian ) SwapWord( 4, abyHeader+24 );
+
+ fseek( psSHP->fpSHX, 0, 0 );
+ fwrite( abyHeader, 100, 1, psSHP->fpSHX );
+
+/* -------------------------------------------------------------------- */
+/* Write out the .shx contents. */
+/* -------------------------------------------------------------------- */
+ panSHX = (int32 *) malloc(sizeof(int32) * 2 * psSHP->nRecords);
+
+ for( i = 0; i < psSHP->nRecords; i++ )
+ {
+ panSHX[i*2 ] = psSHP->panRecOffset[i]/2;
+ panSHX[i*2+1] = psSHP->panRecSize[i]/2;
+ if( !bBigEndian ) SwapWord( 4, panSHX+i*2 );
+ if( !bBigEndian ) SwapWord( 4, panSHX+i*2+1 );
+ }
+
+ fwrite( panSHX, sizeof(int32) * 2, psSHP->nRecords, psSHP->fpSHX );
+
+ free( panSHX );
+}
+
+/************************************************************************/
+/* SHPOpen() */
+/* */
+/* Open the .shp and .shx files based on the basename of the */
+/* files or either file name. */
+/************************************************************************/
+
+SHPHandle SHPAPI_CALL
+SHPOpen( const char * pszLayer, const char * pszAccess )
+
+{
+ char *pszFullname, *pszBasename;
+ SHPHandle psSHP;
+
+ uchar *pabyBuf;
+ int i;
+ double dValue;
+
+/* -------------------------------------------------------------------- */
+/* Ensure the access string is one of the legal ones. We */
+/* ensure the result string indicates binary to avoid common */
+/* problems on Windows. */
+/* -------------------------------------------------------------------- */
+ if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0
+ || strcmp(pszAccess,"r+") == 0 )
+ pszAccess = "r+b";
+ else
+ pszAccess = "rb";
+
+/* -------------------------------------------------------------------- */
+/* Establish the byte order on this machine. */
+/* -------------------------------------------------------------------- */
+ i = 1;
+ if( *((uchar *) &i) == 1 )
+ bBigEndian = FALSE;
+ else
+ bBigEndian = TRUE;
+
+/* -------------------------------------------------------------------- */
+/* Initialize the info structure. */
+/* -------------------------------------------------------------------- */
+ psSHP = (SHPHandle) calloc(sizeof(SHPInfo),1);
+
+ psSHP->bUpdated = FALSE;
+
+/* -------------------------------------------------------------------- */
+/* Compute the base (layer) name. If there is any extension */
+/* on the passed in filename we will strip it off. */
+/* -------------------------------------------------------------------- */
+ pszBasename = (char *) malloc(strlen(pszLayer)+5);
+ strcpy( pszBasename, pszLayer );
+ for( i = strlen(pszBasename)-1;
+ i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/'
+ && pszBasename[i] != '\\';
+ i-- ) {}
+
+ if( pszBasename[i] == '.' )
+ pszBasename[i] = '\0';
+
+/* -------------------------------------------------------------------- */
+/* Open the .shp and .shx files. Note that files pulled from */
+/* a PC to Unix with upper case filenames won't work! */
+/* -------------------------------------------------------------------- */
+ pszFullname = (char *) malloc(strlen(pszBasename) + 5);
+ sprintf( pszFullname, "%s.shp", pszBasename );
+ psSHP->fpSHP = fopen(pszFullname, pszAccess );
+ if( psSHP->fpSHP == NULL )
+ {
+ sprintf( pszFullname, "%s.SHP", pszBasename );
+ psSHP->fpSHP = fopen(pszFullname, pszAccess );
+ }
+
+ if( psSHP->fpSHP == NULL )
+ {
+ free( psSHP );
+ free( pszBasename );
+ free( pszFullname );
+ return( NULL );
+ }
+
+ sprintf( pszFullname, "%s.shx", pszBasename );
+ psSHP->fpSHX = fopen(pszFullname, pszAccess );
+ if( psSHP->fpSHX == NULL )
+ {
+ sprintf( pszFullname, "%s.SHX", pszBasename );
+ psSHP->fpSHX = fopen(pszFullname, pszAccess );
+ }
+
+ if( psSHP->fpSHX == NULL )
+ {
+ fclose( psSHP->fpSHP );
+ free( psSHP );
+ free( pszBasename );
+ free( pszFullname );
+ return( NULL );
+ }
+
+ free( pszFullname );
+ free( pszBasename );
+
+/* -------------------------------------------------------------------- */
+/* Read the file size from the SHP file. */
+/* -------------------------------------------------------------------- */
+ pabyBuf = (uchar *) malloc(100);
+ fread( pabyBuf, 100, 1, psSHP->fpSHP );
+
+ psSHP->nFileSize = (pabyBuf[24] * 256 * 256 * 256
+ + pabyBuf[25] * 256 * 256
+ + pabyBuf[26] * 256
+ + pabyBuf[27]) * 2;
+
+/* -------------------------------------------------------------------- */
+/* Read SHX file Header info */
+/* -------------------------------------------------------------------- */
+ fread( pabyBuf, 100, 1, psSHP->fpSHX );
+
+ if( pabyBuf[0] != 0
+ || pabyBuf[1] != 0
+ || pabyBuf[2] != 0x27
+ || (pabyBuf[3] != 0x0a && pabyBuf[3] != 0x0d) )
+ {
+ fclose( psSHP->fpSHP );
+ fclose( psSHP->fpSHX );
+ free( psSHP );
+
+ return( NULL );
+ }
+
+ psSHP->nRecords = pabyBuf[27] + pabyBuf[26] * 256
+ + pabyBuf[25] * 256 * 256 + pabyBuf[24] * 256 * 256 * 256;
+ psSHP->nRecords = (psSHP->nRecords*2 - 100) / 8;
+
+ psSHP->nShapeType = pabyBuf[32];
+
+ if( psSHP->nRecords < 0 || psSHP->nRecords > 256000000 )
+ {
+ /* this header appears to be corrupt. Give up. */
+ fclose( psSHP->fpSHP );
+ fclose( psSHP->fpSHX );
+ free( psSHP );
+
+ return( NULL );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Read the bounds. */
+/* -------------------------------------------------------------------- */
+ if( bBigEndian ) SwapWord( 8, pabyBuf+36 );
+ memcpy( &dValue, pabyBuf+36, 8 );
+ psSHP->adBoundsMin[0] = dValue;
+
+ if( bBigEndian ) SwapWord( 8, pabyBuf+44 );
+ memcpy( &dValue, pabyBuf+44, 8 );
+ psSHP->adBoundsMin[1] = dValue;
+
+ if( bBigEndian ) SwapWord( 8, pabyBuf+52 );
+ memcpy( &dValue, pabyBuf+52, 8 );
+ psSHP->adBoundsMax[0] = dValue;
+
+ if( bBigEndian ) SwapWord( 8, pabyBuf+60 );
+ memcpy( &dValue, pabyBuf+60, 8 );
+ psSHP->adBoundsMax[1] = dValue;
+
+ if( bBigEndian ) SwapWord( 8, pabyBuf+68 ); /* z */
+ memcpy( &dValue, pabyBuf+68, 8 );
+ psSHP->adBoundsMin[2] = dValue;
+
+ if( bBigEndian ) SwapWord( 8, pabyBuf+76 );
+ memcpy( &dValue, pabyBuf+76, 8 );
+ psSHP->adBoundsMax[2] = dValue;
+
+ if( bBigEndian ) SwapWord( 8, pabyBuf+84 ); /* z */
+ memcpy( &dValue, pabyBuf+84, 8 );
+ psSHP->adBoundsMin[3] = dValue;
+
+ if( bBigEndian ) SwapWord( 8, pabyBuf+92 );
+ memcpy( &dValue, pabyBuf+92, 8 );
+ psSHP->adBoundsMax[3] = dValue;
+
+ free( pabyBuf );
+
+/* -------------------------------------------------------------------- */
+/* Read the .shx file to get the offsets to each record in */
+/* the .shp file. */
+/* -------------------------------------------------------------------- */
+ psSHP->nMaxRecords = psSHP->nRecords;
+
+ psSHP->panRecOffset =
+ (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) );
+ psSHP->panRecSize =
+ (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) );
+
+ pabyBuf = (uchar *) malloc(8 * MAX(1,psSHP->nRecords) );
+ fread( pabyBuf, 8, psSHP->nRecords, psSHP->fpSHX );
+
+ for( i = 0; i < psSHP->nRecords; i++ )
+ {
+ int32 nOffset, nLength;
+
+ memcpy( &nOffset, pabyBuf + i * 8, 4 );
+ if( !bBigEndian ) SwapWord( 4, &nOffset );
+
+ memcpy( &nLength, pabyBuf + i * 8 + 4, 4 );
+ if( !bBigEndian ) SwapWord( 4, &nLength );
+
+ psSHP->panRecOffset[i] = nOffset*2;
+ psSHP->panRecSize[i] = nLength*2;
+ }
+ free( pabyBuf );
+
+ return( psSHP );
+}
+
+/************************************************************************/
+/* SHPClose() */
+/* */
+/* Close the .shp and .shx files. */
+/************************************************************************/
+
+void SHPAPI_CALL
+SHPClose(SHPHandle psSHP )
+
+{
+/* -------------------------------------------------------------------- */
+/* Update the header if we have modified anything. */
+/* -------------------------------------------------------------------- */
+ if( psSHP->bUpdated )
+ {
+ SHPWriteHeader( psSHP );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Free all resources, and close files. */
+/* -------------------------------------------------------------------- */
+ free( psSHP->panRecOffset );
+ free( psSHP->panRecSize );
+
+ fclose( psSHP->fpSHX );
+ fclose( psSHP->fpSHP );
+
+ if( psSHP->pabyRec != NULL )
+ {
+ free( psSHP->pabyRec );
+ }
+
+ free( psSHP );
+}
+
+/************************************************************************/
+/* SHPGetInfo() */
+/* */
+/* Fetch general information about the shape file. */
+/************************************************************************/
+
+void SHPAPI_CALL
+SHPGetInfo(SHPHandle psSHP, int * pnEntities, int * pnShapeType,
+ double * padfMinBound, double * padfMaxBound )
+
+{
+ int i;
+
+ if( pnEntities != NULL )
+ *pnEntities = psSHP->nRecords;
+
+ if( pnShapeType != NULL )
+ *pnShapeType = psSHP->nShapeType;
+
+ for( i = 0; i < 4; i++ )
+ {
+ if( padfMinBound != NULL )
+ padfMinBound[i] = psSHP->adBoundsMin[i];
+ if( padfMaxBound != NULL )
+ padfMaxBound[i] = psSHP->adBoundsMax[i];
+ }
+}
+
+/************************************************************************/
+/* SHPCreate() */
+/* */
+/* Create a new shape file and return a handle to the open */
+/* shape file with read/write access. */
+/************************************************************************/
+
+SHPHandle SHPAPI_CALL
+SHPCreate( const char * pszLayer, int nShapeType )
+
+{
+ char *pszBasename, *pszFullname;
+ int i;
+ FILE *fpSHP, *fpSHX;
+ uchar abyHeader[100];
+ int32 i32;
+ double dValue;
+
+/* -------------------------------------------------------------------- */
+/* Establish the byte order on this system. */
+/* -------------------------------------------------------------------- */
+ i = 1;
+ if( *((uchar *) &i) == 1 )
+ bBigEndian = FALSE;
+ else
+ bBigEndian = TRUE;
+
+/* -------------------------------------------------------------------- */
+/* Compute the base (layer) name. If there is any extension */
+/* on the passed in filename we will strip it off. */
+/* -------------------------------------------------------------------- */
+ pszBasename = (char *) malloc(strlen(pszLayer)+5);
+ strcpy( pszBasename, pszLayer );
+ for( i = strlen(pszBasename)-1;
+ i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/'
+ && pszBasename[i] != '\\';
+ i-- ) {}
+
+ if( pszBasename[i] == '.' )
+ pszBasename[i] = '\0';
+
+/* -------------------------------------------------------------------- */
+/* Open the two files so we can write their headers. */
+/* -------------------------------------------------------------------- */
+ pszFullname = (char *) malloc(strlen(pszBasename) + 5);
+ sprintf( pszFullname, "%s.shp", pszBasename );
+ fpSHP = fopen(pszFullname, "wb" );
+ if( fpSHP == NULL )
+ return( NULL );
+
+ sprintf( pszFullname, "%s.shx", pszBasename );
+ fpSHX = fopen(pszFullname, "wb" );
+ if( fpSHX == NULL )
+ return( NULL );
+
+ free( pszFullname );
+ free( pszBasename );
+
+/* -------------------------------------------------------------------- */
+/* Prepare header block for .shp file. */
+/* -------------------------------------------------------------------- */
+ for( i = 0; i < 100; i++ )
+ abyHeader[i] = 0;
+
+ abyHeader[2] = 0x27; /* magic cookie */
+ abyHeader[3] = 0x0a;
+
+ i32 = 50; /* file size */
+ ByteCopy( &i32, abyHeader+24, 4 );
+ if( !bBigEndian ) SwapWord( 4, abyHeader+24 );
+
+ i32 = 1000; /* version */
+ ByteCopy( &i32, abyHeader+28, 4 );
+ if( bBigEndian ) SwapWord( 4, abyHeader+28 );
+
+ i32 = nShapeType; /* shape type */
+ ByteCopy( &i32, abyHeader+32, 4 );
+ if( bBigEndian ) SwapWord( 4, abyHeader+32 );
+
+ dValue = 0.0; /* set bounds */
+ ByteCopy( &dValue, abyHeader+36, 8 );
+ ByteCopy( &dValue, abyHeader+44, 8 );
+ ByteCopy( &dValue, abyHeader+52, 8 );
+ ByteCopy( &dValue, abyHeader+60, 8 );
+
+/* -------------------------------------------------------------------- */
+/* Write .shp file header. */
+/* -------------------------------------------------------------------- */
+ fwrite( abyHeader, 100, 1, fpSHP );
+
+/* -------------------------------------------------------------------- */
+/* Prepare, and write .shx file header. */
+/* -------------------------------------------------------------------- */
+ i32 = 50; /* file size */
+ ByteCopy( &i32, abyHeader+24, 4 );
+ if( !bBigEndian ) SwapWord( 4, abyHeader+24 );
+
+ fwrite( abyHeader, 100, 1, fpSHX );
+
+/* -------------------------------------------------------------------- */
+/* Close the files, and then open them as regular existing files. */
+/* -------------------------------------------------------------------- */
+ fclose( fpSHP );
+ fclose( fpSHX );
+
+ return( SHPOpen( pszLayer, "r+b" ) );
+}
+
+/************************************************************************/
+/* _SHPSetBounds() */
+/* */
+/* Compute a bounds rectangle for a shape, and set it into the */
+/* indicated location in the record. */
+/************************************************************************/
+
+static void _SHPSetBounds( uchar * pabyRec, SHPObject * psShape )
+
+{
+ ByteCopy( &(psShape->dfXMin), pabyRec + 0, 8 );
+ ByteCopy( &(psShape->dfYMin), pabyRec + 8, 8 );
+ ByteCopy( &(psShape->dfXMax), pabyRec + 16, 8 );
+ ByteCopy( &(psShape->dfYMax), pabyRec + 24, 8 );
+
+ if( bBigEndian )
+ {
+ SwapWord( 8, pabyRec + 0 );
+ SwapWord( 8, pabyRec + 8 );
+ SwapWord( 8, pabyRec + 16 );
+ SwapWord( 8, pabyRec + 24 );
+ }
+}
+
+/************************************************************************/
+/* SHPComputeExtents() */
+/* */
+/* Recompute the extents of a shape. Automatically done by */
+/* SHPCreateObject(). */
+/************************************************************************/
+
+void SHPAPI_CALL
+SHPComputeExtents( SHPObject * psObject )
+
+{
+ int i;
+
+/* -------------------------------------------------------------------- */
+/* Build extents for this object. */
+/* -------------------------------------------------------------------- */
+ if( psObject->nVertices > 0 )
+ {
+ psObject->dfXMin = psObject->dfXMax = psObject->padfX[0];
+ psObject->dfYMin = psObject->dfYMax = psObject->padfY[0];
+ psObject->dfZMin = psObject->dfZMax = psObject->padfZ[0];
+ psObject->dfMMin = psObject->dfMMax = psObject->padfM[0];
+ }
+
+ for( i = 0; i < psObject->nVertices; i++ )
+ {
+ psObject->dfXMin = MIN(psObject->dfXMin, psObject->padfX[i]);
+ psObject->dfYMin = MIN(psObject->dfYMin, psObject->padfY[i]);
+ psObject->dfZMin = MIN(psObject->dfZMin, psObject->padfZ[i]);
+ psObject->dfMMin = MIN(psObject->dfMMin, psObject->padfM[i]);
+
+ psObject->dfXMax = MAX(psObject->dfXMax, psObject->padfX[i]);
+ psObject->dfYMax = MAX(psObject->dfYMax, psObject->padfY[i]);
+ psObject->dfZMax = MAX(psObject->dfZMax, psObject->padfZ[i]);
+ psObject->dfMMax = MAX(psObject->dfMMax, psObject->padfM[i]);
+ }
+}
+
+/************************************************************************/
+/* SHPCreateObject() */
+/* */
+/* Create a shape object. It should be freed with */
+/* SHPDestroyObject(). */
+/************************************************************************/
+
+SHPObject SHPAPI_CALL1(*)
+SHPCreateObject( int nSHPType, int nShapeId, int nParts,
+ int * panPartStart, int * panPartType,
+ int nVertices, double * padfX, double * padfY,
+ double * padfZ, double * padfM )
+
+{
+ SHPObject *psObject;
+ int i, bHasM, bHasZ;
+
+ psObject = (SHPObject *) calloc(1,sizeof(SHPObject));
+ psObject->nSHPType = nSHPType;
+ psObject->nShapeId = nShapeId;
+
+/* -------------------------------------------------------------------- */
+/* Establish whether this shape type has M, and Z values. */
+/* -------------------------------------------------------------------- */
+ if( nSHPType == SHPT_ARCM
+ || nSHPType == SHPT_POINTM
+ || nSHPType == SHPT_POLYGONM
+ || nSHPType == SHPT_MULTIPOINTM )
+ {
+ bHasM = TRUE;
+ bHasZ = FALSE;
+ }
+ else if( nSHPType == SHPT_ARCZ
+ || nSHPType == SHPT_POINTZ
+ || nSHPType == SHPT_POLYGONZ
+ || nSHPType == SHPT_MULTIPOINTZ
+ || nSHPType == SHPT_MULTIPATCH )
+ {
+ bHasM = TRUE;
+ bHasZ = TRUE;
+ }
+ else
+ {
+ bHasM = FALSE;
+ bHasZ = FALSE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Capture parts. Note that part type is optional, and */
+/* defaults to ring. */
+/* -------------------------------------------------------------------- */
+ if( nSHPType == SHPT_ARC || nSHPType == SHPT_POLYGON
+ || nSHPType == SHPT_ARCM || nSHPType == SHPT_POLYGONM
+ || nSHPType == SHPT_ARCZ || nSHPType == SHPT_POLYGONZ
+ || nSHPType == SHPT_MULTIPATCH )
+ {
+ psObject->nParts = MAX(1,nParts);
+
+ psObject->panPartStart = (int *)
+ malloc(sizeof(int) * psObject->nParts);
+ psObject->panPartType = (int *)
+ malloc(sizeof(int) * psObject->nParts);
+
+ psObject->panPartStart[0] = 0;
+ psObject->panPartType[0] = SHPP_RING;
+
+ for( i = 0; i < nParts; i++ )
+ {
+ psObject->panPartStart[i] = panPartStart[i];
+ if( panPartType != NULL )
+ psObject->panPartType[i] = panPartType[i];
+ else
+ psObject->panPartType[i] = SHPP_RING;
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* Capture vertices. Note that Z and M are optional, but X and */
+/* Y are not. */
+/* -------------------------------------------------------------------- */
+ if( nVertices > 0 )
+ {
+ psObject->padfX = (double *) calloc(sizeof(double),nVertices);
+ psObject->padfY = (double *) calloc(sizeof(double),nVertices);
+ psObject->padfZ = (double *) calloc(sizeof(double),nVertices);
+ psObject->padfM = (double *) calloc(sizeof(double),nVertices);
+
+ assert( padfX != NULL );
+ assert( padfY != NULL );
+
+ for( i = 0; i < nVertices; i++ )
+ {
+ psObject->padfX[i] = padfX[i];
+ psObject->padfY[i] = padfY[i];
+ if( padfZ != NULL && bHasZ )
+ psObject->padfZ[i] = padfZ[i];
+ if( padfM != NULL && bHasM )
+ psObject->padfM[i] = padfM[i];
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* Compute the extents. */
+/* -------------------------------------------------------------------- */
+ psObject->nVertices = nVertices;
+ SHPComputeExtents( psObject );
+
+ return( psObject );
+}
+
+/************************************************************************/
+/* SHPCreateSimpleObject() */
+/* */
+/* Create a simple (common) shape object. Destroy with */
+/* SHPDestroyObject(). */
+/************************************************************************/
+
+SHPObject SHPAPI_CALL1(*)
+SHPCreateSimpleObject( int nSHPType, int nVertices,
+ double * padfX, double * padfY,
+ double * padfZ )
+
+{
+ return( SHPCreateObject( nSHPType, -1, 0, NULL, NULL,
+ nVertices, padfX, padfY, padfZ, NULL ) );
+}
+
+/************************************************************************/
+/* SHPWriteObject() */
+/* */
+/* Write out the vertices of a new structure. Note that it is */
+/* only possible to write vertices at the end of the file. */
+/************************************************************************/
+
+int SHPAPI_CALL
+SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject )
+
+{
+ int nRecordOffset, i, nRecordSize;
+ uchar *pabyRec;
+ int32 i32;
+
+ psSHP->bUpdated = TRUE;
+
+/* -------------------------------------------------------------------- */
+/* Ensure that shape object matches the type of the file it is */
+/* being written to. */
+/* -------------------------------------------------------------------- */
+ assert( psObject->nSHPType == psSHP->nShapeType
+ || psObject->nSHPType == SHPT_NULL );
+
+/* -------------------------------------------------------------------- */
+/* Ensure that -1 is used for appends. Either blow an */
+/* assertion, or if they are disabled, set the shapeid to -1 */
+/* for appends. */
+/* -------------------------------------------------------------------- */
+ assert( nShapeId == -1
+ || (nShapeId >= 0 && nShapeId < psSHP->nRecords) );
+
+ if( nShapeId != -1 && nShapeId >= psSHP->nRecords )
+ nShapeId = -1;
+
+/* -------------------------------------------------------------------- */
+/* Add the new entity to the in memory index. */
+/* -------------------------------------------------------------------- */
+ if( nShapeId == -1 && psSHP->nRecords+1 > psSHP->nMaxRecords )
+ {
+ psSHP->nMaxRecords =(int) ( psSHP->nMaxRecords * 1.3 + 100);
+
+ psSHP->panRecOffset = (int *)
+ SfRealloc(psSHP->panRecOffset,sizeof(int) * psSHP->nMaxRecords );
+ psSHP->panRecSize = (int *)
+ SfRealloc(psSHP->panRecSize,sizeof(int) * psSHP->nMaxRecords );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Initialize record. */
+/* -------------------------------------------------------------------- */
+ pabyRec = (uchar *) malloc(psObject->nVertices * 4 * sizeof(double)
+ + psObject->nParts * 8 + 128);
+
+/* -------------------------------------------------------------------- */
+/* Extract vertices for a Polygon or Arc. */
+/* -------------------------------------------------------------------- */
+ if( psObject->nSHPType == SHPT_POLYGON
+ || psObject->nSHPType == SHPT_POLYGONZ
+ || psObject->nSHPType == SHPT_POLYGONM
+ || psObject->nSHPType == SHPT_ARC
+ || psObject->nSHPType == SHPT_ARCZ
+ || psObject->nSHPType == SHPT_ARCM
+ || psObject->nSHPType == SHPT_MULTIPATCH )
+ {
+ int32 nPoints, nParts;
+ int i;
+
+ nPoints = psObject->nVertices;
+ nParts = psObject->nParts;
+
+ _SHPSetBounds( pabyRec + 12, psObject );
+
+ if( bBigEndian ) SwapWord( 4, &nPoints );
+ if( bBigEndian ) SwapWord( 4, &nParts );
+
+ ByteCopy( &nPoints, pabyRec + 40 + 8, 4 );
+ ByteCopy( &nParts, pabyRec + 36 + 8, 4 );
+
+ nRecordSize = 52;
+
+ /*
+ * Write part start positions.
+ */
+ ByteCopy( psObject->panPartStart, pabyRec + 44 + 8,
+ 4 * psObject->nParts );
+ for( i = 0; i < psObject->nParts; i++ )
+ {
+ if( bBigEndian ) SwapWord( 4, pabyRec + 44 + 8 + 4*i );
+ nRecordSize += 4;
+ }
+
+ /*
+ * Write multipatch part types if needed.
+ */
+ if( psObject->nSHPType == SHPT_MULTIPATCH )
+ {
+ memcpy( pabyRec + nRecordSize, psObject->panPartType,
+ 4*psObject->nParts );
+ for( i = 0; i < psObject->nParts; i++ )
+ {
+ if( bBigEndian ) SwapWord( 4, pabyRec + nRecordSize );
+ nRecordSize += 4;
+ }
+ }
+
+ /*
+ * Write the (x,y) vertex values.
+ */
+ for( i = 0; i < psObject->nVertices; i++ )
+ {
+ ByteCopy( psObject->padfX + i, pabyRec + nRecordSize, 8 );
+ ByteCopy( psObject->padfY + i, pabyRec + nRecordSize + 8, 8 );
+
+ if( bBigEndian )
+ SwapWord( 8, pabyRec + nRecordSize );
+
+ if( bBigEndian )
+ SwapWord( 8, pabyRec + nRecordSize + 8 );
+
+ nRecordSize += 2 * 8;
+ }
+
+ /*
+ * Write the Z coordinates (if any).
+ */
+ if( psObject->nSHPType == SHPT_POLYGONZ
+ || psObject->nSHPType == SHPT_ARCZ
+ || psObject->nSHPType == SHPT_MULTIPATCH )
+ {
+ ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+
+ ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+
+ for( i = 0; i < psObject->nVertices; i++ )
+ {
+ ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+ }
+ }
+
+ /*
+ * Write the M values, if any.
+ */
+ if( psObject->nSHPType == SHPT_POLYGONM
+ || psObject->nSHPType == SHPT_ARCM
+#ifndef DISABLE_MULTIPATCH_MEASURE
+ || psObject->nSHPType == SHPT_MULTIPATCH
+#endif
+ || psObject->nSHPType == SHPT_POLYGONZ
+ || psObject->nSHPType == SHPT_ARCZ )
+ {
+ ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+
+ ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+
+ for( i = 0; i < psObject->nVertices; i++ )
+ {
+ ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+ }
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* Extract vertices for a MultiPoint. */
+/* -------------------------------------------------------------------- */
+ else if( psObject->nSHPType == SHPT_MULTIPOINT
+ || psObject->nSHPType == SHPT_MULTIPOINTZ
+ || psObject->nSHPType == SHPT_MULTIPOINTM )
+ {
+ int32 nPoints;
+ int i;
+
+ nPoints = psObject->nVertices;
+
+ _SHPSetBounds( pabyRec + 12, psObject );
+
+ if( bBigEndian ) SwapWord( 4, &nPoints );
+ ByteCopy( &nPoints, pabyRec + 44, 4 );
+
+ for( i = 0; i < psObject->nVertices; i++ )
+ {
+ ByteCopy( psObject->padfX + i, pabyRec + 48 + i*16, 8 );
+ ByteCopy( psObject->padfY + i, pabyRec + 48 + i*16 + 8, 8 );
+
+ if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 + 8 );
+ }
+
+ nRecordSize = 48 + 16 * psObject->nVertices;
+
+ if( psObject->nSHPType == SHPT_MULTIPOINTZ )
+ {
+ ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+
+ ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+
+ for( i = 0; i < psObject->nVertices; i++ )
+ {
+ ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+ }
+ }
+
+ if( psObject->nSHPType == SHPT_MULTIPOINTZ
+ || psObject->nSHPType == SHPT_MULTIPOINTM )
+ {
+ ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+
+ ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+
+ for( i = 0; i < psObject->nVertices; i++ )
+ {
+ ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+ }
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* Write point. */
+/* -------------------------------------------------------------------- */
+ else if( psObject->nSHPType == SHPT_POINT
+ || psObject->nSHPType == SHPT_POINTZ
+ || psObject->nSHPType == SHPT_POINTM )
+ {
+ ByteCopy( psObject->padfX, pabyRec + 12, 8 );
+ ByteCopy( psObject->padfY, pabyRec + 20, 8 );
+
+ if( bBigEndian ) SwapWord( 8, pabyRec + 12 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + 20 );
+
+ nRecordSize = 28;
+
+ if( psObject->nSHPType == SHPT_POINTZ )
+ {
+ ByteCopy( psObject->padfZ, pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+ }
+
+ if( psObject->nSHPType == SHPT_POINTZ
+ || psObject->nSHPType == SHPT_POINTM )
+ {
+ ByteCopy( psObject->padfM, pabyRec + nRecordSize, 8 );
+ if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+ nRecordSize += 8;
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* Not much to do for null geometries. */
+/* -------------------------------------------------------------------- */
+ else if( psObject->nSHPType == SHPT_NULL )
+ {
+ nRecordSize = 12;
+ }
+
+ else
+ {
+ /* unknown type */
+ assert( FALSE );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Establish where we are going to put this record. If we are */
+/* rewriting and existing record, and it will fit, then put it */
+/* back where the original came from. Otherwise write at the end. */
+/* -------------------------------------------------------------------- */
+ if( nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize-8 )
+ {
+ if( nShapeId == -1 )
+ nShapeId = psSHP->nRecords++;
+
+ psSHP->panRecOffset[nShapeId] = nRecordOffset = psSHP->nFileSize;
+ psSHP->panRecSize[nShapeId] = nRecordSize-8;
+ psSHP->nFileSize += nRecordSize;
+ }
+ else
+ {
+ nRecordOffset = psSHP->panRecOffset[nShapeId];
+ }
+
+/* -------------------------------------------------------------------- */
+/* Set the shape type, record number, and record size. */
+/* -------------------------------------------------------------------- */
+ i32 = nShapeId+1; /* record # */
+ if( !bBigEndian ) SwapWord( 4, &i32 );
+ ByteCopy( &i32, pabyRec, 4 );
+
+ i32 = (nRecordSize-8)/2; /* record size */
+ if( !bBigEndian ) SwapWord( 4, &i32 );
+ ByteCopy( &i32, pabyRec + 4, 4 );
+
+ i32 = psObject->nSHPType; /* shape type */
+ if( bBigEndian ) SwapWord( 4, &i32 );
+ ByteCopy( &i32, pabyRec + 8, 4 );
+
+/* -------------------------------------------------------------------- */
+/* Write out record. */
+/* -------------------------------------------------------------------- */
+ if( fseek( psSHP->fpSHP, nRecordOffset, 0 ) != 0
+ || fwrite( pabyRec, nRecordSize, 1, psSHP->fpSHP ) < 1 )
+ {
+ printf( "Error in fseek() or fwrite().\n" );
+ free( pabyRec );
+ return -1;
+ }
+
+ free( pabyRec );
+
+/* -------------------------------------------------------------------- */
+/* Expand file wide bounds based on this shape. */
+/* -------------------------------------------------------------------- */
+ if( psSHP->adBoundsMin[0] == 0.0
+ && psSHP->adBoundsMax[0] == 0.0
+ && psSHP->adBoundsMin[1] == 0.0
+ && psSHP->adBoundsMax[1] == 0.0
+ && psObject->nSHPType != SHPT_NULL )
+ {
+ psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = psObject->padfX[0];
+ psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = psObject->padfY[0];
+ psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = psObject->padfZ[0];
+ psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = psObject->padfM[0];
+ }
+
+ for( i = 0; i < psObject->nVertices; i++ )
+ {
+ psSHP->adBoundsMin[0] = MIN(psSHP->adBoundsMin[0],psObject->padfX[i]);
+ psSHP->adBoundsMin[1] = MIN(psSHP->adBoundsMin[1],psObject->padfY[i]);
+ psSHP->adBoundsMin[2] = MIN(psSHP->adBoundsMin[2],psObject->padfZ[i]);
+ psSHP->adBoundsMin[3] = MIN(psSHP->adBoundsMin[3],psObject->padfM[i]);
+ psSHP->adBoundsMax[0] = MAX(psSHP->adBoundsMax[0],psObject->padfX[i]);
+ psSHP->adBoundsMax[1] = MAX(psSHP->adBoundsMax[1],psObject->padfY[i]);
+ psSHP->adBoundsMax[2] = MAX(psSHP->adBoundsMax[2],psObject->padfZ[i]);
+ psSHP->adBoundsMax[3] = MAX(psSHP->adBoundsMax[3],psObject->padfM[i]);
+ }
+
+ return( nShapeId );
+}
+
+/************************************************************************/
+/* SHPReadObject() */
+/* */
+/* Read the vertices, parts, and other non-attribute information */
+/* for one shape. */
+/************************************************************************/
+
+SHPObject SHPAPI_CALL1(*)
+SHPReadObject( SHPHandle psSHP, int hEntity )
+
+{
+ SHPObject *psShape;
+
+/* -------------------------------------------------------------------- */
+/* Validate the record/entity number. */
+/* -------------------------------------------------------------------- */
+ if( hEntity < 0 || hEntity >= psSHP->nRecords )
+ return( NULL );
+
+/* -------------------------------------------------------------------- */
+/* Ensure our record buffer is large enough. */
+/* -------------------------------------------------------------------- */
+ if( psSHP->panRecSize[hEntity]+8 > psSHP->nBufSize )
+ {
+ psSHP->nBufSize = psSHP->panRecSize[hEntity]+8;
+ psSHP->pabyRec = (uchar *) SfRealloc(psSHP->pabyRec,psSHP->nBufSize);
+ }
+
+/* -------------------------------------------------------------------- */
+/* Read the record. */
+/* -------------------------------------------------------------------- */
+ fseek( psSHP->fpSHP, psSHP->panRecOffset[hEntity], 0 );
+ fread( psSHP->pabyRec, psSHP->panRecSize[hEntity]+8, 1, psSHP->fpSHP );
+
+/* -------------------------------------------------------------------- */
+/* Allocate and minimally initialize the object. */
+/* -------------------------------------------------------------------- */
+ psShape = (SHPObject *) calloc(1,sizeof(SHPObject));
+ psShape->nShapeId = hEntity;
+
+ memcpy( &psShape->nSHPType, psSHP->pabyRec + 8, 4 );
+ if( bBigEndian ) SwapWord( 4, &(psShape->nSHPType) );
+
+/* ==================================================================== */
+/* Extract vertices for a Polygon or Arc. */
+/* ==================================================================== */
+ if( psShape->nSHPType == SHPT_POLYGON || psShape->nSHPType == SHPT_ARC
+ || psShape->nSHPType == SHPT_POLYGONZ
+ || psShape->nSHPType == SHPT_POLYGONM
+ || psShape->nSHPType == SHPT_ARCZ
+ || psShape->nSHPType == SHPT_ARCM
+ || psShape->nSHPType == SHPT_MULTIPATCH )
+ {
+ int32 nPoints, nParts;
+ int i, nOffset;
+
+/* -------------------------------------------------------------------- */
+/* Get the X/Y bounds. */
+/* -------------------------------------------------------------------- */
+ memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 );
+ memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 );
+ memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 );
+ memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 );
+
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) );
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) );
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) );
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) );
+
+/* -------------------------------------------------------------------- */
+/* Extract part/point count, and build vertex and part arrays */
+/* to proper size. */
+/* -------------------------------------------------------------------- */
+ memcpy( &nPoints, psSHP->pabyRec + 40 + 8, 4 );
+ memcpy( &nParts, psSHP->pabyRec + 36 + 8, 4 );
+
+ if( bBigEndian ) SwapWord( 4, &nPoints );
+ if( bBigEndian ) SwapWord( 4, &nParts );
+
+ psShape->nVertices = nPoints;
+ psShape->padfX = (double *) calloc(nPoints,sizeof(double));
+ psShape->padfY = (double *) calloc(nPoints,sizeof(double));
+ psShape->padfZ = (double *) calloc(nPoints,sizeof(double));
+ psShape->padfM = (double *) calloc(nPoints,sizeof(double));
+
+ psShape->nParts = nParts;
+ psShape->panPartStart = (int *) calloc(nParts,sizeof(int));
+ psShape->panPartType = (int *) calloc(nParts,sizeof(int));
+
+ for( i = 0; i < nParts; i++ )
+ psShape->panPartType[i] = SHPP_RING;
+
+/* -------------------------------------------------------------------- */
+/* Copy out the part array from the record. */
+/* -------------------------------------------------------------------- */
+ memcpy( psShape->panPartStart, psSHP->pabyRec + 44 + 8, 4 * nParts );
+ for( i = 0; i < nParts; i++ )
+ {
+ if( bBigEndian ) SwapWord( 4, psShape->panPartStart+i );
+ }
+
+ nOffset = 44 + 8 + 4*nParts;
+
+/* -------------------------------------------------------------------- */
+/* If this is a multipatch, we will also have parts types. */
+/* -------------------------------------------------------------------- */
+ if( psShape->nSHPType == SHPT_MULTIPATCH )
+ {
+ memcpy( psShape->panPartType, psSHP->pabyRec + nOffset, 4*nParts );
+ for( i = 0; i < nParts; i++ )
+ {
+ if( bBigEndian ) SwapWord( 4, psShape->panPartType+i );
+ }
+
+ nOffset += 4*nParts;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Copy out the vertices from the record. */
+/* -------------------------------------------------------------------- */
+ for( i = 0; i < nPoints; i++ )
+ {
+ memcpy(psShape->padfX + i,
+ psSHP->pabyRec + nOffset + i * 16,
+ 8 );
+
+ memcpy(psShape->padfY + i,
+ psSHP->pabyRec + nOffset + i * 16 + 8,
+ 8 );
+
+ if( bBigEndian ) SwapWord( 8, psShape->padfX + i );
+ if( bBigEndian ) SwapWord( 8, psShape->padfY + i );
+ }
+
+ nOffset += 16*nPoints;
+
+/* -------------------------------------------------------------------- */
+/* If we have a Z coordinate, collect that now. */
+/* -------------------------------------------------------------------- */
+ if( psShape->nSHPType == SHPT_POLYGONZ
+ || psShape->nSHPType == SHPT_ARCZ
+ || psShape->nSHPType == SHPT_MULTIPATCH )
+ {
+ memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 );
+ memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 );
+
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) );
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) );
+
+ for( i = 0; i < nPoints; i++ )
+ {
+ memcpy( psShape->padfZ + i,
+ psSHP->pabyRec + nOffset + 16 + i*8, 8 );
+ if( bBigEndian ) SwapWord( 8, psShape->padfZ + i );
+ }
+
+ nOffset += 16 + 8*nPoints;
+ }
+
+/* -------------------------------------------------------------------- */
+/* If we have a M measure value, then read it now. We assume */
+/* that the measure can be present for any shape if the size is */
+/* big enough, but really it will only occur for the Z shapes */
+/* (options), and the M shapes. */
+/* -------------------------------------------------------------------- */
+ if( psSHP->panRecSize[hEntity]+8 >= nOffset + 16 + 8*nPoints )
+ {
+ memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 );
+ memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 );
+
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) );
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) );
+
+ for( i = 0; i < nPoints; i++ )
+ {
+ memcpy( psShape->padfM + i,
+ psSHP->pabyRec + nOffset + 16 + i*8, 8 );
+ if( bBigEndian ) SwapWord( 8, psShape->padfM + i );
+ }
+ }
+
+ }
+
+/* ==================================================================== */
+/* Extract vertices for a MultiPoint. */
+/* ==================================================================== */
+ else if( psShape->nSHPType == SHPT_MULTIPOINT
+ || psShape->nSHPType == SHPT_MULTIPOINTM
+ || psShape->nSHPType == SHPT_MULTIPOINTZ )
+ {
+ int32 nPoints;
+ int i, nOffset;
+
+ memcpy( &nPoints, psSHP->pabyRec + 44, 4 );
+ if( bBigEndian ) SwapWord( 4, &nPoints );
+
+ psShape->nVertices = nPoints;
+ psShape->padfX = (double *) calloc(nPoints,sizeof(double));
+ psShape->padfY = (double *) calloc(nPoints,sizeof(double));
+ psShape->padfZ = (double *) calloc(nPoints,sizeof(double));
+ psShape->padfM = (double *) calloc(nPoints,sizeof(double));
+
+ for( i = 0; i < nPoints; i++ )
+ {
+ memcpy(psShape->padfX+i, psSHP->pabyRec + 48 + 16 * i, 8 );
+ memcpy(psShape->padfY+i, psSHP->pabyRec + 48 + 16 * i + 8, 8 );
+
+ if( bBigEndian ) SwapWord( 8, psShape->padfX + i );
+ if( bBigEndian ) SwapWord( 8, psShape->padfY + i );
+ }
+
+ nOffset = 48 + 16*nPoints;
+
+/* -------------------------------------------------------------------- */
+/* Get the X/Y bounds. */
+/* -------------------------------------------------------------------- */
+ memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 );
+ memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 );
+ memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 );
+ memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 );
+
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) );
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) );
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) );
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) );
+
+/* -------------------------------------------------------------------- */
+/* If we have a Z coordinate, collect that now. */
+/* -------------------------------------------------------------------- */
+ if( psShape->nSHPType == SHPT_MULTIPOINTZ )
+ {
+ memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 );
+ memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 );
+
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) );
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) );
+
+ for( i = 0; i < nPoints; i++ )
+ {
+ memcpy( psShape->padfZ + i,
+ psSHP->pabyRec + nOffset + 16 + i*8, 8 );
+ if( bBigEndian ) SwapWord( 8, psShape->padfZ + i );
+ }
+
+ nOffset += 16 + 8*nPoints;
+ }
+
+/* -------------------------------------------------------------------- */
+/* If we have a M measure value, then read it now. We assume */
+/* that the measure can be present for any shape if the size is */
+/* big enough, but really it will only occur for the Z shapes */
+/* (options), and the M shapes. */
+/* -------------------------------------------------------------------- */
+ if( psSHP->panRecSize[hEntity]+8 >= nOffset + 16 + 8*nPoints )
+ {
+ memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 );
+ memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 );
+
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) );
+ if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) );
+
+ for( i = 0; i < nPoints; i++ )
+ {
+ memcpy( psShape->padfM + i,
+ psSHP->pabyRec + nOffset + 16 + i*8, 8 );
+ if( bBigEndian ) SwapWord( 8, psShape->padfM + i );
+ }
+ }
+ }
+
+/* ==================================================================== */
+/* Extract vertices for a point. */
+/* ==================================================================== */
+ else if( psShape->nSHPType == SHPT_POINT
+ || psShape->nSHPType == SHPT_POINTM
+ || psShape->nSHPType == SHPT_POINTZ )
+ {
+ int nOffset;
+
+ psShape->nVertices = 1;
+ psShape->padfX = (double *) calloc(1,sizeof(double));
+ psShape->padfY = (double *) calloc(1,sizeof(double));
+ psShape->padfZ = (double *) calloc(1,sizeof(double));
+ psShape->padfM = (double *) calloc(1,sizeof(double));
+
+ memcpy( psShape->padfX, psSHP->pabyRec + 12, 8 );
+ memcpy( psShape->padfY, psSHP->pabyRec + 20, 8 );
+
+ if( bBigEndian ) SwapWord( 8, psShape->padfX );
+ if( bBigEndian ) SwapWord( 8, psShape->padfY );
+
+ nOffset = 20 + 8;
+
+/* -------------------------------------------------------------------- */
+/* If we have a Z coordinate, collect that now. */
+/* -------------------------------------------------------------------- */
+ if( psShape->nSHPType == SHPT_POINTZ )
+ {
+ memcpy( psShape->padfZ, psSHP->pabyRec + nOffset, 8 );
+
+ if( bBigEndian ) SwapWord( 8, psShape->padfZ );
+
+ nOffset += 8;
+ }
+
+/* -------------------------------------------------------------------- */
+/* If we have a M measure value, then read it now. We assume */
+/* that the measure can be present for any shape if the size is */
+/* big enough, but really it will only occur for the Z shapes */
+/* (options), and the M shapes. */
+/* -------------------------------------------------------------------- */
+ if( psSHP->panRecSize[hEntity]+8 >= nOffset + 8 )
+ {
+ memcpy( psShape->padfM, psSHP->pabyRec + nOffset, 8 );
+
+ if( bBigEndian ) SwapWord( 8, psShape->padfM );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Since no extents are supplied in the record, we will apply */
+/* them from the single vertex. */
+/* -------------------------------------------------------------------- */
+ psShape->dfXMin = psShape->dfXMax = psShape->padfX[0];
+ psShape->dfYMin = psShape->dfYMax = psShape->padfY[0];
+ psShape->dfZMin = psShape->dfZMax = psShape->padfZ[0];
+ psShape->dfMMin = psShape->dfMMax = psShape->padfM[0];
+ }
+
+ return( psShape );
+}
+
+/************************************************************************/
+/* SHPTypeName() */
+/************************************************************************/
+
+const char SHPAPI_CALL1(*)
+SHPTypeName( int nSHPType )
+
+{
+ switch( nSHPType )
+ {
+ case SHPT_NULL:
+ return "NullShape";
+
+ case SHPT_POINT:
+ return "Point";
+
+ case SHPT_ARC:
+ return "Arc";
+
+ case SHPT_POLYGON:
+ return "Polygon";
+
+ case SHPT_MULTIPOINT:
+ return "MultiPoint";
+
+ case SHPT_POINTZ:
+ return "PointZ";
+
+ case SHPT_ARCZ:
+ return "ArcZ";
+
+ case SHPT_POLYGONZ:
+ return "PolygonZ";
+
+ case SHPT_MULTIPOINTZ:
+ return "MultiPointZ";
+
+ case SHPT_POINTM:
+ return "PointM";
+
+ case SHPT_ARCM:
+ return "ArcM";
+
+ case SHPT_POLYGONM:
+ return "PolygonM";
+
+ case SHPT_MULTIPOINTM:
+ return "MultiPointM";
+
+ case SHPT_MULTIPATCH:
+ return "MultiPatch";
+
+ default:
+ return "UnknownShapeType";
+ }
+}
+
+/************************************************************************/
+/* SHPPartTypeName() */
+/************************************************************************/
+
+const char SHPAPI_CALL1(*)
+SHPPartTypeName( int nPartType )
+
+{
+ switch( nPartType )
+ {
+ case SHPP_TRISTRIP:
+ return "TriangleStrip";
+
+ case SHPP_TRIFAN:
+ return "TriangleFan";
+
+ case SHPP_OUTERRING:
+ return "OuterRing";
+
+ case SHPP_INNERRING:
+ return "InnerRing";
+
+ case SHPP_FIRSTRING:
+ return "FirstRing";
+
+ case SHPP_RING:
+ return "Ring";
+
+ default:
+ return "UnknownPartType";
+ }
+}
+
+/************************************************************************/
+/* SHPDestroyObject() */
+/************************************************************************/
+
+void SHPAPI_CALL
+SHPDestroyObject( SHPObject * psShape )
+
+{
+ if( psShape == NULL )
+ return;
+
+ if( psShape->padfX != NULL )
+ free( psShape->padfX );
+ if( psShape->padfY != NULL )
+ free( psShape->padfY );
+ if( psShape->padfZ != NULL )
+ free( psShape->padfZ );
+ if( psShape->padfM != NULL )
+ free( psShape->padfM );
+
+ if( psShape->panPartStart != NULL )
+ free( psShape->panPartStart );
+ if( psShape->panPartType != NULL )
+ free( psShape->panPartType );
+
+ free( psShape );
+}
+
+/************************************************************************/
+/* SHPRewindObject() */
+/* */
+/* Reset the winding of polygon objects to adhere to the */
+/* specification. */
+/************************************************************************/
+
+int SHPAPI_CALL
+SHPRewindObject( SHPHandle hSHP, SHPObject * psObject )
+
+{
+ int iOpRing, bAltered = 0;
+
+/* -------------------------------------------------------------------- */
+/* Do nothing if this is not a polygon object. */
+/* -------------------------------------------------------------------- */
+ if( psObject->nSHPType != SHPT_POLYGON
+ && psObject->nSHPType != SHPT_POLYGONZ
+ && psObject->nSHPType != SHPT_POLYGONM )
+ return 0;
+
+/* -------------------------------------------------------------------- */
+/* Process each of the rings. */
+/* -------------------------------------------------------------------- */
+ for( iOpRing = 0; iOpRing < psObject->nParts; iOpRing++ )
+ {
+ int bInner, iVert, nVertCount, nVertStart, iCheckRing;
+ double dfSum, dfTestX, dfTestY;
+
+/* -------------------------------------------------------------------- */
+/* Determine if this ring is an inner ring or an outer ring */
+/* relative to all the other rings. For now we assume the */
+/* first ring is outer and all others are inner, but eventually */
+/* we need to fix this to handle multiple island polygons and */
+/* unordered sets of rings. */
+/* -------------------------------------------------------------------- */
+ dfTestX = psObject->padfX[psObject->panPartStart[iOpRing]];
+ dfTestY = psObject->padfY[psObject->panPartStart[iOpRing]];
+
+ bInner = FALSE;
+ for( iCheckRing = 0; iCheckRing < psObject->nParts; iCheckRing++ )
+ {
+ int iEdge;
+
+ if( iCheckRing == iOpRing )
+ continue;
+
+ nVertStart = psObject->panPartStart[iCheckRing];
+
+ if( iCheckRing == psObject->nParts-1 )
+ nVertCount = psObject->nVertices
+ - psObject->panPartStart[iCheckRing];
+ else
+ nVertCount = psObject->panPartStart[iCheckRing+1]
+ - psObject->panPartStart[iCheckRing];
+
+ for( iEdge = 0; iEdge < nVertCount; iEdge++ )
+ {
+ int iNext;
+
+ if( iEdge < nVertCount-1 )
+ iNext = iEdge+1;
+ else
+ iNext = 0;
+
+ if( (psObject->padfY[iEdge+nVertStart] < dfTestY
+ && psObject->padfY[iNext+nVertStart] >= dfTestY)
+ || (psObject->padfY[iNext+nVertStart] < dfTestY
+ && psObject->padfY[iEdge+nVertStart] >= dfTestY) )
+ {
+ if( psObject->padfX[iEdge+nVertStart]
+ + (dfTestY - psObject->padfY[iEdge+nVertStart])
+ / (psObject->padfY[iNext+nVertStart]
+ - psObject->padfY[iEdge+nVertStart])
+ * (psObject->padfX[iNext+nVertStart]
+ - psObject->padfX[iEdge+nVertStart]) < dfTestX )
+ bInner = !bInner;
+ }
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* Determine the current order of this ring so we will know if */
+/* it has to be reversed. */
+/* -------------------------------------------------------------------- */
+ nVertStart = psObject->panPartStart[iOpRing];
+
+ if( iOpRing == psObject->nParts-1 )
+ nVertCount = psObject->nVertices - psObject->panPartStart[iOpRing];
+ else
+ nVertCount = psObject->panPartStart[iOpRing+1]
+ - psObject->panPartStart[iOpRing];
+
+ dfSum = 0.0;
+ for( iVert = nVertStart; iVert < nVertStart+nVertCount-1; iVert++ )
+ {
+ dfSum += psObject->padfX[iVert] * psObject->padfY[iVert+1]
+ - psObject->padfY[iVert] * psObject->padfX[iVert+1];
+ }
+
+ dfSum += psObject->padfX[iVert] * psObject->padfY[nVertStart]
+ - psObject->padfY[iVert] * psObject->padfX[nVertStart];
+
+/* -------------------------------------------------------------------- */
+/* Reverse if necessary. */
+/* -------------------------------------------------------------------- */
+ if( (dfSum < 0.0 && bInner) || (dfSum > 0.0 && !bInner) )
+ {
+ int i;
+
+ bAltered++;
+ for( i = 0; i < nVertCount/2; i++ )
+ {
+ double dfSaved;
+
+ /* Swap X */
+ dfSaved = psObject->padfX[nVertStart+i];
+ psObject->padfX[nVertStart+i] =
+ psObject->padfX[nVertStart+nVertCount-i-1];
+ psObject->padfX[nVertStart+nVertCount-i-1] = dfSaved;
+
+ /* Swap Y */
+ dfSaved = psObject->padfY[nVertStart+i];
+ psObject->padfY[nVertStart+i] =
+ psObject->padfY[nVertStart+nVertCount-i-1];
+ psObject->padfY[nVertStart+nVertCount-i-1] = dfSaved;
+
+ /* Swap Z */
+ if( psObject->padfZ )
+ {
+ dfSaved = psObject->padfZ[nVertStart+i];
+ psObject->padfZ[nVertStart+i] =
+ psObject->padfZ[nVertStart+nVertCount-i-1];
+ psObject->padfZ[nVertStart+nVertCount-i-1] = dfSaved;
+ }
+
+ /* Swap M */
+ if( psObject->padfM )
+ {
+ dfSaved = psObject->padfM[nVertStart+i];
+ psObject->padfM[nVertStart+i] =
+ psObject->padfM[nVertStart+nVertCount-i-1];
+ psObject->padfM[nVertStart+nVertCount-i-1] = dfSaved;
+ }
+ }
+ }
+ }
+
+ return bAltered;
+}
diff --git a/src/terralib/PDI/.cvsignore b/src/terralib/PDI/.cvsignore
new file mode 100644
index 0000000..33ceb8f
--- /dev/null
+++ b/src/terralib/PDI/.cvsignore
@@ -0,0 +1 @@
+Makefile
\ No newline at end of file
diff --git a/src/terralib/PDI/Doxyfile b/src/terralib/PDI/Doxyfile
new file mode 100644
index 0000000..234bd7b
--- /dev/null
+++ b/src/terralib/PDI/Doxyfile
@@ -0,0 +1,214 @@
+# Doxyfile 1.3.9.1
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME = "TerraLib - Digital Image Processing Algorithms"
+PROJECT_NUMBER =
+OUTPUT_DIRECTORY = docs
+CREATE_SUBDIRS = YES
+OUTPUT_LANGUAGE = English
+USE_WINDOWS_ENCODING = YES
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = NO
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = YES
+INLINE_INHERITED_MEMB = YES
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = YES
+JAVADOC_AUTOBRIEF = YES
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP = YES
+INHERIT_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 8
+ALIASES =
+OPTIMIZE_OUTPUT_FOR_C = YES
+OPTIMIZE_OUTPUT_JAVA = NO
+SUBGROUPING = NO
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = YES
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = YES
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = YES
+SORT_BY_SCOPE_NAME = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+SHOW_DIRECTORIES = YES
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = source
+FILE_PATTERNS =
+RECURSIVE = YES
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = YES
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = YES
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = YES
+INLINE_SOURCES = YES
+STRIP_CODE_COMMENTS = NO
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+GENERATE_HTMLHELP = YES
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = YES
+BINARY_TOC = NO
+TOC_EXPAND = YES
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = YES
+TREEVIEW_WIDTH = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = NO
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = NO
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE =
+ALLEXTERNALS = YES
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = YES
+HIDE_UNDOC_RELATIONS = NO
+HAVE_DOT = YES
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+UML_LOOK = NO
+TEMPLATE_RELATIONS = YES
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = YES
+GRAPHICAL_HIERARCHY = YES
+DOT_IMAGE_FORMAT = png
+DOT_PATH =
+DOTFILE_DIRS =
+MAX_DOT_GRAPH_WIDTH = 1024
+MAX_DOT_GRAPH_HEIGHT = 1024
+MAX_DOT_GRAPH_DEPTH = 0
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = YES
diff --git a/src/terralib/PDI/PDI.pro b/src/terralib/PDI/PDI.pro
new file mode 100755
index 0000000..0f63f80
--- /dev/null
+++ b/src/terralib/PDI/PDI.pro
@@ -0,0 +1,8 @@
+
+TEMPLATE = subdirs
+
+SUBDIRS = \
+ source \
+ tests
+
+
diff --git a/src/terralib/PDI/bin/.cvsignore b/src/terralib/PDI/bin/.cvsignore
new file mode 100644
index 0000000..e69de29
diff --git a/src/terralib/PDI/bin/dynamic/.cvsignore b/src/terralib/PDI/bin/dynamic/.cvsignore
new file mode 100644
index 0000000..1f78391
--- /dev/null
+++ b/src/terralib/PDI/bin/dynamic/.cvsignore
@@ -0,0 +1 @@
+libterralibpdi*
diff --git a/src/terralib/PDI/bin/static/.cvsignore b/src/terralib/PDI/bin/static/.cvsignore
new file mode 100644
index 0000000..1f78391
--- /dev/null
+++ b/src/terralib/PDI/bin/static/.cvsignore
@@ -0,0 +1 @@
+libterralibpdi*
diff --git a/src/terralib/PDI/docs/.cvsignore b/src/terralib/PDI/docs/.cvsignore
new file mode 100644
index 0000000..1936cc1
--- /dev/null
+++ b/src/terralib/PDI/docs/.cvsignore
@@ -0,0 +1 @@
+html
diff --git a/src/terralib/PDI/source/.cvsignore b/src/terralib/PDI/source/.cvsignore
new file mode 100644
index 0000000..550bd25
--- /dev/null
+++ b/src/terralib/PDI/source/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+
diff --git a/src/terralib/PDI/source/TePDIAgnostic.cpp b/src/terralib/PDI/source/TePDIAgnostic.cpp
new file mode 100644
index 0000000..f19c24a
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIAgnostic.cpp
@@ -0,0 +1,13 @@
+#include "TePDIAgnostic.hpp"
+
+#include "stdio.h"
+
+namespace TePDIAgnostic{
+
+ void redirect_log( char* log_file_name, char* error_log_file_name )
+ {
+ freopen( log_file_name, "w", stdout );
+ freopen( error_log_file_name, "w", stderr );
+ };
+
+};
diff --git a/src/terralib/PDI/source/TePDIAgnostic.hpp b/src/terralib/PDI/source/TePDIAgnostic.hpp
new file mode 100644
index 0000000..b33a1e0
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIAgnostic.hpp
@@ -0,0 +1,257 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ * This file contains a set of macros, routines and classes to deal with
+ * system checking and logging facility.
+ */
+
+#ifndef TEPDIAGNOSTIC_HPP
+ #define TEPDIAGNOSTIC_HPP
+
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <sstream>
+ #include <string>
+ #include <iostream>
+
+ #ifdef USETERRALIBLOG
+
+ #include <TeException.h>
+ #include <TeErrorLog.h>
+
+ /**
+ * Logs a message to stdout
+ *
+ * @param message Message to be logged.
+ */
+ #define PDIAGN_LOGMSG(message) \
+ TeErroLog::instance().insert( LOG_MESSAGE, std::string( __DATE__ ) + \
+ " - " + std::string( __TIME__ ) + " - " + std::string( __FILE__ ) + \
+ ":" + std::string( __LINE__ ) + " : " + \
+ TePDIAgnostic::to_string( message ) );
+
+ /**
+ * Logs a message to stderr
+ *
+ * @param message Message to be logged.
+ */
+ #define PDIAGN_LOGERR(message) \
+ TeErroLog::instance().insert( UNKNOWN_ERROR_TYPE, \
+ std::string( __DATE__ ) + \
+ " - " + std::string( __TIME__ ) + " - " + std::string( __FILE__ ) + \
+ ":" + std::string( __LINE__ ) + " : " + \
+ TePDIAgnostic::to_string( message ) );
+
+ #else // USETERRALIBLOG
+
+ /**
+ * Logs a message to stdout
+ *
+ * @param message Message to be logged.
+ */
+ #define PDIAGN_LOGMSG(message) \
+ std::cout << std::endl << "Message :" \
+ << " " << __DATE__ \
+ << " " << __TIME__ \
+ << " - " << __FILE__ \
+ << ":" << __LINE__ \
+ << " - " << TePDIAgnostic::to_string( message ) \
+ << std::endl;
+
+ /**
+ * Logs a error message to stderr
+ *
+ * @param message Message to be logged.
+ */
+ #define PDIAGN_LOGERR(message) \
+ std::cerr << std::endl << "Error :" \
+ << " " << __DATE__ \
+ << " " << __TIME__ \
+ << " - " << __FILE__ \
+ << ":" << __LINE__ \
+ << " - " << TePDIAgnostic::to_string( message ) \
+ << std::endl;
+
+ #endif // USETERRALIBLOG
+
+ /**
+ * Logs a message to stderr and throws.
+ *
+ * @param variable Variable to be logged.
+ */
+ #define PDIAGN_WATCH( variable ) \
+ { \
+ PDIAGN_LOGMSG( "WATCH - " + TePDIAgnostic::to_string( #variable ) + \
+ "=" + TePDIAgnostic::to_string( variable ) ); \
+ }
+
+ /**
+ * Logs a message to stderr and throws.
+ *
+ * @param message Message to be logged.
+ */
+ #define PDIAGN_LOG_AND_THROW( message ) \
+ { \
+ PDIAGN_LOGERR( message ); \
+ throw; \
+ }
+
+ /**
+ * Checks if value is true and throws an exception if not.
+ *
+ * @param value Value to be checked.
+ * @param message Message to be logged.
+ */
+ #define PDIAGN_TRUE_OR_THROW(value,message) \
+ if( value == 0 ) { \
+ PDIAGN_LOG_AND_THROW( message ); \
+ };
+
+ /**
+ * Checks if value is true and logs an error message if not.
+ *
+ * @param value Value to be checked.
+ * @param message Message to be logged.
+ */
+ #define PDIAGN_TRUE_OR_LOG(value,message) \
+ if( value == 0 ) { \
+ PDIAGN_LOGERR( message ); \
+ };
+
+ /**
+ * Checks if value is true. if not a message will be logget and
+ * a return of context with false value will be done.
+ *
+ * @param value Value to be checked.
+ * @param message Message to be logged.
+ */
+ #define PDIAGN_TRUE_OR_RETURN(value,message) \
+ if( value == 0 ) { \
+ PDIAGN_LOGERR( message ); \
+ return false; \
+ };
+
+ /**
+ * Checks if value is false and logs an error message if not.
+ *
+ * @param value Value to be checked.
+ * @param message Message to be logged.
+ */
+ #define PDIAGN_FALSE_OR_LOG(value,message) \
+ if( value != 0 ) { \
+ PDIAGN_LOGERR( message ); \
+ };
+
+ /**
+ * Checks if two values are equal and throws an exception if not.
+ *
+ * @param value1 Value to be checked.
+ * @param value2 Value to be checked.
+ * @param message Message to be logged.
+ */
+ #define PDIAGN_CHECK_EQUAL(value1,value2,message) \
+ PDIAGN_TRUE_OR_THROW( ( value1 == value2 ), \
+ message + std::string( " [" ) + \
+ TePDIAgnostic::to_string( value1 ) + "!=" + \
+ TePDIAgnostic::to_string( value2 ) + "]" );
+
+ /**
+ * Checks if two values are diferent and throws an exception if not.
+ *
+ * @param value1 Value to be checked.
+ * @param value2 Value to be checked.
+ * @param message Message to be logged.
+ */
+ #define PDIAGN_CHECK_NOTEQUAL(value1,value2,message) \
+ PDIAGN_TRUE_OR_THROW( ( value1 != value2 ), \
+ message + std::string( " [Values are equal]" ) );
+
+ /**
+ * Throws an exception for not implemented source.
+ */
+ #define PDIAGN_NOT_IMPLEMENTED \
+ PDIAGN_LOG_AND_THROW( "Not Implemented." );
+
+ /**
+ * Checks if Debug mode is enabled and throws an exception if not.
+ */
+ #ifdef NDEBUG
+ #define PDIAGN_DEBUG_MODE_CHECK \
+ PDIAGN_LOG_AND_THROW( "Debug Mode Disabled." );
+ #else
+ #define PDIAGN_DEBUG_MODE_CHECK {};
+ #endif
+
+ /**
+ * Checks if value is true and throws an exception if not.
+ * This macro will be disabled for non debug mode.
+ *
+ * @param value Value to be checked.
+ * @param message Message to be logged.
+ */
+ #ifndef NDEBUG
+ #define PDIAGN_PRE_CONDITION(value,message) \
+ PDIAGN_TRUE_OR_THROW( value, message );
+ #else
+ #define PDIAGN_PRE_CONDITION(value,message) {};
+ #endif
+
+ /**
+ * Checks if value is true and throws an exception if not.
+ * This macro will be disabled for non debug mode.
+ *
+ * @param value Value to be checked.
+ * @param message Message to be logged.
+ */
+ #define PDIAGN_POS_CONDITION(value,message) \
+ PDIAGN_PRE_CONDITION(value,message);
+
+ namespace TePDIAgnostic{
+
+ /**
+ * Data convertion to string.
+ *
+ * @param data Data to be converted.
+ * @return The converted string.
+ */
+ template< class T >
+ std::string to_string( const T& data )
+ {
+ std::stringstream temp_ss;
+ temp_ss << data;
+ return temp_ss.str();
+ }
+
+ /**
+ * Redirects stdout and stderr to disk files.
+ *
+ * @param log_file_name stdout output file name.
+ * @param error_log_file_name stderr output file name.
+ */
+ void redirect_log( char* log_file_name, char* error_log_file_name );
+
+ };
+
+#endif //TEPDIAGNOSTIC_HPP
diff --git a/src/terralib/PDI/source/TePDIAlgorithm.cpp b/src/terralib/PDI/source/TePDIAlgorithm.cpp
new file mode 100755
index 0000000..8ae5b96
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIAlgorithm.cpp
@@ -0,0 +1,42 @@
+#include "TePDIAlgorithm.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+TePDIAlgorithm::TePDIAlgorithm()
+{
+}
+
+TePDIAlgorithm::TePDIAlgorithm( const TePDIParameters& params )
+{
+ Reset( params );
+}
+
+
+TePDIAlgorithm::~TePDIAlgorithm()
+{
+}
+
+
+bool TePDIAlgorithm::Reset( const TePDIParameters& params )
+{
+ ResetState();
+
+ if( CheckParameters( params ) ) {
+ params_ = params;
+ return true;
+ } else {
+ PDIAGN_LOGERR( "Invalid supplied parameters" );
+ return false;
+ }
+}
+
+
+bool TePDIAlgorithm::Apply()
+{
+ if( CheckParameters( params_ ) ) {
+ return RunImplementation();
+ } else {
+ PDIAGN_LOGERR( "Invalid supplied parameters" );
+ return false;
+ }
+}
diff --git a/src/terralib/PDI/source/TePDIAlgorithm.hpp b/src/terralib/PDI/source/TePDIAlgorithm.hpp
new file mode 100644
index 0000000..5abd657
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIAlgorithm.hpp
@@ -0,0 +1,106 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ * This file contains the base class for digital image processing
+ * algorithms.
+ */
+
+#ifndef TEPDIALGORITHM_HPP
+ #define TEPDIALGORITHM_HPP
+
+ #include "TePDIParameters.hpp"
+
+ #include "TePDISharedPtr.cpp"
+
+ class TePDIAlgorithm{
+ public :
+ typedef TePDISharedPtr< TePDIAlgorithm > pointer;
+ typedef const TePDISharedPtr< TePDIAlgorithm > const_pointer;
+
+ /**
+ * Default Destructor
+ */
+ virtual ~TePDIAlgorithm();
+
+ /**
+ * Applies the algorithm following the current state and
+ * internal stored parameters.
+ *
+ * @return true if OK. false on error.
+ */
+ bool Apply();
+
+ /**
+ * Reset the internal state with new supplied parameters.
+ *
+ * @param params The new supplied parameters.
+ * @return true if parameters OK, false on error.
+ */
+ bool Reset( const TePDIParameters& params );
+
+ /**
+ * Checks if the supplied parameters fits the requirements of each
+ * PDI algorithm implementation.
+ *
+ * Error log messages must be generated. No exceptions generated.
+ *
+ * @param parameters The parameters to be checked.
+ * @return true if the parameters are OK. false if not.
+ */
+ virtual bool CheckParameters( const TePDIParameters& parameters ) = 0;
+
+ protected :
+ /**
+ * Internal parameters reference
+ */
+ mutable TePDIParameters params_;
+
+ /**
+ * Default Constructor
+ */
+ TePDIAlgorithm();
+
+ /**
+ * Alternative Constructor
+ *
+ * @param params Algoritm parameters.
+ */
+ TePDIAlgorithm( const TePDIParameters& params );
+
+ /**
+ * Runs the current algorithm implementation.
+ *
+ * @return true if OK. false on error.
+ */
+ virtual bool RunImplementation() = 0;
+
+ /**
+ * Reset the internal state to the initial state.
+ */
+ virtual void ResetState() = 0;
+
+ };
+
+#endif //TEPDIALGORITHM_HPP
diff --git a/src/terralib/PDI/source/TePDIBox.cpp b/src/terralib/PDI/source/TePDIBox.cpp
new file mode 100755
index 0000000..f0f4bf3
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIBox.cpp
@@ -0,0 +1,37 @@
+#include "TePDIBox.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+
+TePDIBox::TePDIBox( unsigned long int top_left_x,
+ unsigned long int top_left_y,
+ unsigned long int bottom_right_x,
+ unsigned long int bottom_right_y )
+{
+ Reset( top_left_x, top_left_y, bottom_right_x, bottom_right_y );
+}
+
+
+TePDIBox::~TePDIBox()
+{
+
+}
+
+
+void TePDIBox::Reset( unsigned long int top_left_x,
+ unsigned long int top_left_y,
+ unsigned long int bottom_right_x,
+ unsigned long int bottom_right_y )
+{
+
+ PDIAGN_TRUE_OR_THROW( top_left_x < bottom_right_x,
+ "Invalid supplied parameter X" );
+
+ PDIAGN_TRUE_OR_THROW( top_left_y < bottom_right_y,
+ "Invalid supplied parameter Y" );
+
+ top_left_x_ = top_left_x;
+ top_left_y_ = top_left_y;
+ bottom_right_x_ = bottom_right_x;
+ bottom_right_y_ = bottom_right_y;
+}
diff --git a/src/terralib/PDI/source/TePDIBox.hpp b/src/terralib/PDI/source/TePDIBox.hpp
new file mode 100644
index 0000000..e1c46bf
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIBox.hpp
@@ -0,0 +1,77 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ * This file contains the base class for digital image processing
+ * algorithms.
+ */
+
+#ifndef TEPDIBOX_HPP
+ #define TEPDIBOX_HPP
+
+ #include "TePDISharedPtr.cpp"
+
+ class TePDIBox{
+ public :
+ typedef TePDISharedPtr< TePDIBox > pointer;
+ typedef const TePDISharedPtr< TePDIBox > const_pointer;
+
+ /**
+ * Default Constructor
+ *
+ * @param top_left_x Top left X coord.
+ * @param top_left_y Top left Y coord.
+ * @param bottom_right_x Bottom right X coord.
+ * @param bottom_right_y Bottom right Y coord.
+ */
+ TePDIBox( unsigned long int top_left_x = 0,
+ unsigned long int top_left_y = 0,
+ unsigned long int bottom_right_x = 0,
+ unsigned long int bottom_right_y = 0 );
+
+ /**
+ * Default Destructor
+ */
+ ~TePDIBox();
+
+ /**
+ * Resets the current Box coords.
+ *
+ * @param top_left_x Top left X coord.
+ * @param top_left_y Top left Y coord.
+ * @param bottom_right_x Bottom right X coord.
+ * @param bottom_right_y Bottom right Y coord.
+ */
+ void Reset( unsigned long int top_left_x,
+ unsigned long int top_left_y,
+ unsigned long int bottom_right_x,
+ unsigned long int bottom_right_y );
+ protected :
+ unsigned long int top_left_x_;
+ unsigned long int top_left_y_;
+ unsigned long int bottom_right_x_;
+ unsigned long int bottom_right_y_;
+ };
+
+#endif //TEPDIBOX_HPP
diff --git a/src/terralib/PDI/source/TePDIContrast.cpp b/src/terralib/PDI/source/TePDIContrast.cpp
new file mode 100755
index 0000000..f901344
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIContrast.cpp
@@ -0,0 +1,879 @@
+#include "TePDIContrast.hpp"
+
+#include "TePDIAgnostic.hpp"
+#include "TePDITypes.hpp"
+#include "TePDIUtils.hpp"
+
+#include <sstream>
+#include <cmath>
+
+
+TePDIContrast::TePDIContrast( const TePDIParameters& params )
+: TePDIAlgorithm( params )
+{
+}
+
+TePDIContrast::TePDIContrast()
+{
+}
+
+
+TePDIContrast::~TePDIContrast()
+{
+}
+
+
+bool TePDIContrast::RunImplementation()
+{
+ /* Getting general parameters */
+
+ int contrast_type;
+ params_.GetParameter( "contrast_type", contrast_type );
+
+ TePDITypes::TePDIRasterPtrType inRaster;
+ params_.GetParameter( "input_image", inRaster );
+
+ std::vector< int > channels;
+ params_.GetParameter( "channels", channels );
+
+ int histo_levels;
+ params_.GetParameter( "histo_levels", histo_levels );
+
+ TePDITypes::TePDIRasterPtrType outRaster;
+ params_.GetParameter( "output_image", outRaster );
+
+ /* Generating histograms */
+
+ BuildHistograms( inRaster, (unsigned int)histo_levels, channels );
+
+ /* Processing each algorithm */
+
+ TePDITypes::TePDILutType lut;
+
+ switch( contrast_type ) {
+ case TePDIContrastMinMax :
+ {
+ PDIAGN_TRUE_OR_RETURN(
+ TePDIUtils::TeResetRaster( outRaster, channels.size(),
+ inRaster->params().nlines_, inRaster->params().ncols_ ),
+ "Raster reset error" );
+
+ for( unsigned int channels_index = 0 ;
+ channels_index < channels.size() ;
+ ++channels_index ) {
+
+ lut = GetMinMaxLut( histo_cache_[ channels[ channels_index ] ] );
+
+ RemapLevels( inRaster, lut, channels[ channels_index ],
+ channels_index, outRaster );
+ }
+
+ break;
+ }
+ case TePDIContrastLinear :
+ {
+ PDIAGN_TRUE_OR_RETURN(
+ TePDIUtils::TeResetRaster( outRaster, channels.size(),
+ inRaster->params().nlines_, inRaster->params().ncols_ ),
+ "Raster reset error" );
+
+ double min_level = 0;
+ double max_level = 0;
+
+ params_.GetParameter( "min_level", min_level );
+ params_.GetParameter( "max_level", max_level );
+
+ for( unsigned int channels_index = 0 ;
+ channels_index < channels.size() ;
+ ++channels_index ) {
+
+ lut = GetLinearLut( histo_cache_[ channels[ channels_index ] ],
+ min_level, max_level );
+
+ RemapLevels( inRaster, lut, channels[ channels_index ],
+ channels_index, outRaster );
+ }
+
+ break;
+ }
+ case TePDIContrastSquareRoot :
+ {
+ PDIAGN_TRUE_OR_RETURN(
+ TePDIUtils::TeResetRaster( outRaster, channels.size(),
+ inRaster->params().nlines_, inRaster->params().ncols_ ),
+ "Raster reset error" );
+
+ double min_level = 0;
+ double max_level = 0;
+
+ params_.GetParameter( "min_level", min_level );
+ params_.GetParameter( "max_level", max_level );
+
+ for( unsigned int channels_index = 0 ;
+ channels_index < channels.size() ;
+ ++channels_index ) {
+
+ lut = GetSquareRootLut( histo_cache_[ channels[ channels_index ] ],
+ min_level, max_level );
+
+ RemapLevels( inRaster, lut, channels[ channels_index ],
+ channels_index, outRaster );
+ }
+
+ break;
+ }
+ case TePDIContrastSquare :
+ {
+ PDIAGN_TRUE_OR_RETURN(
+ TePDIUtils::TeResetRaster( outRaster, channels.size(),
+ inRaster->params().nlines_, inRaster->params().ncols_ ),
+ "Raster reset error" );
+
+ double min_level = 0;
+ double max_level = 0;
+
+ params_.GetParameter( "min_level", min_level );
+ params_.GetParameter( "max_level", max_level );
+
+ for( unsigned int channels_index = 0 ;
+ channels_index < channels.size() ;
+ ++channels_index ) {
+
+ lut = GetSquareLut( histo_cache_[ channels[ channels_index ] ],
+ min_level, max_level );
+ RemapLevels( inRaster, lut, channels[ channels_index ],
+ channels_index, outRaster );
+ }
+
+ break;
+ }
+ case TePDIContrastLog :
+ {
+ PDIAGN_TRUE_OR_RETURN(
+ TePDIUtils::TeResetRaster( outRaster, channels.size(),
+ inRaster->params().nlines_, inRaster->params().ncols_ ),
+ "Raster reset error" );
+
+ double min_level = 0;
+ double max_level = 0;
+
+ params_.GetParameter( "min_level", min_level );
+ params_.GetParameter( "max_level", max_level );
+
+ for( unsigned int channels_index = 0 ;
+ channels_index < channels.size() ;
+ ++channels_index ) {
+
+ lut = GetLogLut( histo_cache_[ channels[ channels_index ] ],
+ min_level, max_level );
+
+ RemapLevels( inRaster, lut, channels[ channels_index ],
+ channels_index, outRaster );
+ }
+
+ break;
+ }
+ case TePDIContrastNegative :
+ {
+ PDIAGN_TRUE_OR_RETURN(
+ TePDIUtils::TeResetRaster( outRaster, channels.size(),
+ inRaster->params().nlines_, inRaster->params().ncols_ ),
+ "Raster reset error" );
+
+ double min_level = 0;
+ double max_level = 0;
+
+ params_.GetParameter( "min_level", min_level );
+ params_.GetParameter( "max_level", max_level );
+
+ for( unsigned int channels_index = 0 ;
+ channels_index < channels.size() ;
+ ++channels_index ) {
+
+ lut = GetNegativeLut( histo_cache_[ channels[ channels_index ] ],
+ min_level, max_level );
+
+ RemapLevels( inRaster, lut, channels[ channels_index ],
+ channels_index, outRaster );
+
+ }
+
+ break;
+ }
+ case TePDIContrastHistEqualizer :
+ {
+ PDIAGN_TRUE_OR_RETURN(
+ TePDIUtils::TeResetRaster( outRaster, channels.size(),
+ inRaster->params().nlines_, inRaster->params().ncols_ ),
+ "Raster reset error" );
+
+ for( unsigned int channels_index = 0 ;
+ channels_index < channels.size() ;
+ ++channels_index ) {
+
+ lut = GetHistEqualizerLut( histo_cache_[ channels[ channels_index ] ] );
+
+ RemapLevels( inRaster, lut, channels[ channels_index ],
+ channels_index, outRaster );
+
+ }
+
+ break;
+ }
+ case TePDIContrastSimpleSlicer :
+ {
+ /* Getting user parameters */
+
+ TePDIRgbPalette::pointer palette;
+ params_.GetParameter( "rgb_palette", palette );
+
+ double min_level = 0;
+ double max_level = 0;
+ params_.GetParameter( "min_level", min_level );
+ params_.GetParameter( "max_level", max_level );
+
+ PDIAGN_TRUE_OR_RETURN(
+ TePDIUtils::TeResetRaster( outRaster, 1,
+ inRaster->params().nlines_, inRaster->params().ncols_,
+ palette.NakedPointer() ), "Raster reset error" );
+
+ /* Slicing process */
+
+ GetSimpleSlicerLut( histo_cache_[ channels[ 0 ] ],
+ palette, min_level, max_level, lut );
+
+ RemapLevels( inRaster, lut, channels[ 0 ], 0,
+ outRaster );
+
+ break;
+ }
+ default :
+ {
+ PDIAGN_NOT_IMPLEMENTED;
+ break;
+ }
+ }
+
+
+ return true;
+}
+
+
+bool TePDIContrast::CheckParameters( const TePDIParameters& parameters )
+{
+ /* Checking for general required parameters */
+
+ TePDITypes::TePDIRasterPtrType inRaster;
+ if( ! parameters.GetParameter( "input_image", inRaster ) ) {
+
+ PDIAGN_LOGERR( "Missing parameter: input_image" );
+ return false;
+ }
+ if( ! inRaster.isActive() ) {
+
+ PDIAGN_LOGERR( "Invalid parameter: input_image inactive" );
+ return false;
+ }
+ if( inRaster->status() == TeNOTREADY ) {
+
+ PDIAGN_LOGERR( "Invalid parameter: input_image not ready" );
+ return false;
+ }
+
+ TePDITypes::TePDIRasterPtrType outRaster;
+ if( ! parameters.GetParameter( "output_image", outRaster ) ) {
+
+ PDIAGN_LOGERR( "Missing parameter: output_image" );
+ return false;
+ }
+ if( ! outRaster.isActive() ) {
+
+ PDIAGN_LOGERR( "Invalid parameter: output_image inactive" );
+ return false;
+ }
+ if( inRaster->status() == TeREADYTOWRITE ) {
+
+ PDIAGN_LOGERR( "Invalid parameter: output_image not ready" );
+ return false;
+ }
+
+ int histo_levels = 0;
+ if( ! parameters.GetParameter( "histo_levels", histo_levels ) ||
+ ( histo_levels <= 0 ) ) {
+
+ PDIAGN_LOGERR( "Invalid parameter: histo_levels" );
+ return false;
+ }
+
+ /* Checking for the correct allowed contrast types */
+
+ int contrast_type;
+ if( ! parameters.GetParameter( "contrast_type", contrast_type ) ) {
+ PDIAGN_LOGERR( "Missing parameter: contrast_type" );
+ return false;
+ }
+ PDIAGN_CHECK_NOTEQUAL( contrast_type, 0 ,
+ "Invalid Contrast Type" );
+ if( ( contrast_type != TePDIContrastMinMax ) &&
+ ( contrast_type != TePDIContrastLinear ) &&
+ ( contrast_type != TePDIContrastSquareRoot ) &&
+ ( contrast_type != TePDIContrastSquare ) &&
+ ( contrast_type != TePDIContrastLog ) &&
+ ( contrast_type != TePDIContrastNegative ) &&
+ ( contrast_type != TePDIContrastHistEqualizer ) &&
+ ( contrast_type != TePDIContrastSimpleSlicer ) ) {
+
+ PDIAGN_LOGERR( "Invalid parameter: contrast_type" );
+ return false;
+ }
+
+ /* channels parameter checking */
+
+ std::vector< int > channels;
+ if( ! parameters.GetParameter( "channels", channels ) ) {
+
+ PDIAGN_LOGERR( "Missing parameter: channels" );
+ return false;
+ }
+ for( unsigned int index = 0 ; index < channels.size() ; ++index ) {
+ if( channels[ index ] >= inRaster->nBands() ) {
+ PDIAGN_LOGERR( "Invalid parameter: channels" );
+ return false;
+ }
+ }
+ if( ( contrast_type == TePDIContrastSimpleSlicer ) ) {
+ if( channels.size() != 1 ) {
+ PDIAGN_LOGERR( "Invalid channels number" );
+ return false;
+ }
+ } else {
+ /* For the other algorithms */
+ if( channels.size() == 0 ) {
+ PDIAGN_LOGERR( "Invalid channels number" );
+ return false;
+ }
+ }
+
+ /* Checking for min and max required parameters */
+
+ if( ( contrast_type == TePDIContrastLinear ) ||
+ ( contrast_type == TePDIContrastSquareRoot ) ||
+ ( contrast_type == TePDIContrastSquare ) ||
+ ( contrast_type == TePDIContrastLog ) ||
+ ( contrast_type == TePDIContrastNegative ) ||
+ ( contrast_type == TePDIContrastSimpleSlicer ) ) {
+
+ if( ! parameters.CheckParameter( "min_level",
+ TePDIParameters::TePDIDoubleParam ) ) {
+
+ PDIAGN_LOGERR( "Missing parameter: min_level" );
+ return false;
+ }
+ if( ! parameters.CheckParameter( "max_level",
+ TePDIParameters::TePDIDoubleParam ) ) {
+
+ PDIAGN_LOGERR( "Missing parameter: max_level" );
+ return false;
+ }
+ }
+
+ /* Checking for RGB Palette required parameters */
+
+ if( ( contrast_type == TePDIContrastSimpleSlicer ) ) {
+ TePDIRgbPalette::pointer rgb_palette;
+
+ if( ( ! parameters.GetParameter( "rgb_palette", rgb_palette ) ) ||
+ ( ! rgb_palette.isActive() ) ) {
+
+ PDIAGN_LOGERR( "Missing parameter: rgb_palette" );
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+void TePDIContrast::ResetState()
+{
+ histo_cache_.clear();
+}
+
+
+void TePDIContrast::BuildHistograms(
+ TePDITypes::TePDIRasterPtrType& inRaster,
+ unsigned int histo_levels,
+ std::vector< int >& channels,
+ bool force )
+{
+ PDIAGN_TRUE_OR_THROW( inRaster.isActive(),
+ "inRaster inactive" );
+ PDIAGN_TRUE_OR_THROW( inRaster->status() != TeNOTREADY,
+ "inRaster not ready" );
+
+ for( unsigned int channels_index = 0 ; channels_index < channels.size() ;
+ ++channels_index ) {
+
+ PDIAGN_TRUE_OR_THROW( channels[ channels_index ] < inRaster->nBands(),
+ "Trying to creat histogram from an invalid band" );
+
+ bool hist_cached =
+ ( histo_cache_.find( channels[ channels_index ] ) !=
+ histo_cache_.end() ) ? true : false;
+
+ if( ( ! hist_cached ) || force ) {
+ if( hist_cached ) {
+ histo_cache_[ channels[ channels_index ] ].clear();
+ }
+
+ TePDITypes::TePDIHistogramType temp_hist;
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeGenerateHistogram( inRaster,
+ histo_levels, channels[ channels_index ], temp_hist ),
+ "Histogram Generation Error" );
+
+ PDIAGN_CHECK_EQUAL( temp_hist.size(), histo_levels,
+ "Generated histogram size error" );
+
+ histo_cache_[ channels[ channels_index ] ] = temp_hist;
+ }
+ }
+}
+
+
+void TePDIContrast::RemapLevels(
+ TePDITypes::TePDIRasterPtrType& inRaster,
+ TePDITypes::TePDILutType& lut,
+ int in_channel,
+ int out_channel,
+ TePDITypes::TePDIRasterPtrType& outRaster )
+{
+ PDIAGN_TRUE_OR_THROW( inRaster.isActive(),
+ "inRaster inactive" );
+ PDIAGN_TRUE_OR_THROW( outRaster.isActive(),
+ "outRaster inactive" );
+ PDIAGN_TRUE_OR_THROW( inRaster->status() != TeNOTREADY,
+ "inRaster not ready" );
+ PDIAGN_TRUE_OR_THROW( outRaster->status() == TeREADYTOWRITE,
+ "outRaster not ready" );
+ PDIAGN_CHECK_EQUAL( inRaster->params().nlines_,
+ outRaster->params().nlines_,
+ "Lines number mismatch between input and output image" );
+ PDIAGN_CHECK_EQUAL( inRaster->params().ncols_,
+ outRaster->params().ncols_,
+ "Columns number mismatch between input and output image" );
+
+ int raster_lines = inRaster->params().nlines_;
+ int raster_columns = inRaster->params().ncols_;
+
+ double current_level;
+ double best_lut_reference;
+
+ TePDITypes::TePDILutType::iterator lut_it;
+ TePDITypes::TePDILutType::iterator lut_next_it;
+ TePDITypes::TePDILutType::iterator lut_it_end = lut.end();
+
+ for( int line = 0 ; line < raster_lines ; ++line ) {
+ for( int column = 0 ; column < raster_columns ; ++column ) {
+ if( inRaster->getElement( column, line, current_level,
+ in_channel ) ) {
+
+ /* Finding mapped level by using the best LUT reference Level */
+
+ lut_it = lut.begin();
+ lut_next_it = lut_it;
+ ++lut_next_it;
+
+ while( lut_next_it != lut_it_end ) {
+ if( lut_next_it->first >= current_level ) {
+ break;
+ }
+
+ ++lut_it;
+ ++lut_next_it;
+ }
+
+ if( lut_next_it == lut_it_end ) {
+ best_lut_reference = lut_it->first;
+ } else {
+ if( std::abs( lut_it->first - current_level ) <
+ std::abs( lut_next_it->first - current_level ) ) {
+
+ best_lut_reference = lut_it->first;
+ } else {
+ best_lut_reference = lut_next_it->first;
+ }
+ }
+
+ /* Pixel Output level mapping */
+
+ PDIAGN_TRUE_OR_THROW( outRaster->setElement( column, line,
+ lut[ best_lut_reference ], out_channel ),
+ "Level remmaping error at " + TePDIUtils::to_string( line ) +
+ "," + TePDIUtils::to_string( column ) );
+ }
+ }
+ }
+
+}
+
+double TePDIContrast::GetHistMax( TePDITypes::TePDIHistogramType& hist )
+{
+ PDIAGN_TRUE_OR_THROW( hist.size() != 0, "Invalid histogram" );
+
+ TePDITypes::TePDIHistogramType::reverse_iterator hist_it = hist.rbegin();
+ TePDITypes::TePDIHistogramType::reverse_iterator hist_it_end = hist.rend();
+
+ while( hist_it != hist_it_end ) {
+ if( hist_it->second != 0 ) {
+ return hist_it->first;
+ }
+
+ ++hist_it;
+ }
+
+ PDIAGN_LOG_AND_THROW( "Empty invalid Histogram" );
+
+ return 0;
+}
+
+double TePDIContrast::GetHistMin( TePDITypes::TePDIHistogramType& hist )
+{
+ PDIAGN_TRUE_OR_THROW( hist.size() != 0, "Invalid histogram" );
+
+ TePDITypes::TePDIHistogramType::iterator hist_it = hist.begin();
+ TePDITypes::TePDIHistogramType::iterator hist_it_end = hist.end();
+
+ while( hist_it != hist_it_end ) {
+ if( hist_it->second != 0 ) {
+ return hist_it->first;
+ }
+
+ ++hist_it;
+ }
+
+ PDIAGN_LOG_AND_THROW( "Empty invalid Histogram" );
+
+ return 0;
+}
+
+
+TePDITypes::TePDILutType TePDIContrast::GetMinMaxLut(
+ TePDITypes::TePDIHistogramType& hist )
+{
+ PDIAGN_TRUE_OR_THROW( hist.size() != 0, "Invalid histogram" );
+
+ return GetLinearLut( hist, GetHistMin( hist ), GetHistMax( hist ) );
+}
+
+
+TePDITypes::TePDILutType TePDIContrast::GetLinearLut(
+ TePDITypes::TePDIHistogramType& hist,
+ double min, double max )
+{
+ PDIAGN_CHECK_NOTEQUAL( hist.size(), 0, "Invalid histogram size" );
+ PDIAGN_TRUE_OR_THROW( max > min, "Invalid max and min values" );
+
+ /* Calculating parameters */
+
+ unsigned int levels = hist.size();
+
+ double a = 0;
+ double b = 0;
+
+ if( max == min ) {
+ a = (double)levels;
+ b = -1. * ((double)levels) * min;
+ } else {
+ a = ((double)levels) / ( max - min );
+ b = ( -1. * ((double)levels) * min ) / ( max - min );
+ }
+
+ /* Generating LUT map using the existing histogram levels */
+
+ TePDITypes::TePDILutType out_lut;
+
+ TePDITypes::TePDIHistogramType::iterator hist_it = hist.begin();
+ TePDITypes::TePDIHistogramType::iterator hist_it_end = hist.end();
+
+ while( hist_it != hist_it_end ) {
+ if( hist_it->first <= min ) {
+ out_lut[ hist_it->first ] = min;
+ } else if( hist_it->first >= max ) {
+ out_lut[ hist_it->first ] = max;
+ } else {
+ out_lut[ hist_it->first ] = ( a * hist_it->first ) + b;
+ }
+
+ ++hist_it;
+ }
+
+ return out_lut;
+}
+
+
+TePDITypes::TePDILutType TePDIContrast::GetSquareRootLut(
+ TePDITypes::TePDIHistogramType& hist,
+ double min, double max )
+{
+ PDIAGN_CHECK_NOTEQUAL( hist.size(), 0, "Invalid histogram size" );
+ PDIAGN_TRUE_OR_THROW( min < max, "Invalid min and max values" );
+
+ unsigned int levels = hist.size();
+
+ double factor = ((double)levels) / std::sqrt( max - min );
+
+ /* Generating LUT map using the existing histogram levels */
+
+ TePDITypes::TePDILutType out_lut;
+
+ TePDITypes::TePDIHistogramType::iterator hist_it = hist.begin();
+ TePDITypes::TePDIHistogramType::iterator hist_it_end = hist.end();
+
+ while( hist_it != hist_it_end ) {
+ if( hist_it->first <= min ) {
+ out_lut[ hist_it->first ] = min;
+ } else if( hist_it->first >= max ) {
+ out_lut[ hist_it->first ] = max;
+ } else {
+ out_lut[ hist_it->first ] = factor * std::sqrt( hist_it->first - min );
+ }
+
+ ++hist_it;
+ }
+
+ return out_lut;
+}
+
+
+TePDITypes::TePDILutType TePDIContrast::GetSquareLut(
+ TePDITypes::TePDIHistogramType& hist,
+ double min, double max )
+{
+ PDIAGN_CHECK_NOTEQUAL( hist.size(), 0, "Invalid histogram size" );
+ PDIAGN_TRUE_OR_THROW( min < max, "Invalid min and max values" );
+
+ unsigned int levels = hist.size();
+
+ double factor = ((double)levels) / std::pow( (max - min), 2 );
+
+ /* Generating LUT map using the existing histogram levels */
+
+ TePDITypes::TePDILutType out_lut;
+
+ TePDITypes::TePDIHistogramType::iterator hist_it = hist.begin();
+ TePDITypes::TePDIHistogramType::iterator hist_it_end = hist.end();
+
+ while( hist_it != hist_it_end ) {
+ if( hist_it->first <= min ) {
+ out_lut[ hist_it->first ] = min;
+ } else if( hist_it->first >= max ) {
+ out_lut[ hist_it->first ] = max;
+ } else {
+ out_lut[ hist_it->first ] =
+ factor * std::pow( hist_it->first - min, 2 );
+ }
+
+ ++hist_it;
+ }
+
+ return out_lut;
+}
+
+
+TePDITypes::TePDILutType TePDIContrast::GetLogLut(
+ TePDITypes::TePDIHistogramType& hist,
+ double min, double max )
+{
+ PDIAGN_CHECK_NOTEQUAL( hist.size(), 0, "Invalid histogram size" );
+ PDIAGN_TRUE_OR_THROW( max > ( min+1 ), "Invalid min and max values" );
+
+ unsigned int levels = hist.size();
+
+ double factor = ((double)levels) / std::log10( max - min + 1 );
+
+ /* Generating LUT map using the existing histogram levels */
+
+ TePDITypes::TePDILutType out_lut;
+
+ TePDITypes::TePDIHistogramType::iterator hist_it = hist.begin();
+ TePDITypes::TePDIHistogramType::iterator hist_it_end = hist.end();
+
+ while( hist_it != hist_it_end ) {
+ if( hist_it->first <= min ) {
+ out_lut[ hist_it->first ] = min;
+ } else if( hist_it->first >= max ) {
+ out_lut[ hist_it->first ] = max;
+ } else {
+ out_lut[ hist_it->first ] =
+ factor * std::log10( hist_it->first - min + 1 );
+ }
+
+ ++hist_it;
+ }
+
+ return out_lut;
+}
+
+
+TePDITypes::TePDILutType TePDIContrast::GetNegativeLut(
+ TePDITypes::TePDIHistogramType& hist,
+ double min, double max )
+{
+ PDIAGN_CHECK_NOTEQUAL( hist.size(), 0, "Invalid histogram size" );
+ PDIAGN_TRUE_OR_THROW( max > min, "Invalid max and min values" );
+
+ /* Calculating parameters */
+
+ unsigned int levels = hist.size();
+
+ double a = -1. * ((double)levels) / ( max - min );
+ double b = ( ((double)levels) * max ) / ( max - min );
+
+ /* Generating LUT map using the existing histogram levels */
+
+ TePDITypes::TePDILutType out_lut;
+
+ TePDITypes::TePDIHistogramType::iterator hist_it = hist.begin();
+ TePDITypes::TePDIHistogramType::iterator hist_it_end = hist.end();
+
+ while( hist_it != hist_it_end ) {
+ if( hist_it->first <= min ) {
+ out_lut[ hist_it->first ] = max;
+ } else if( hist_it->first >= max ) {
+ out_lut[ hist_it->first ] = min;
+ } else {
+ out_lut[ hist_it->first ] = ( a * hist_it->first ) + b;
+ }
+
+ ++hist_it;
+ }
+
+ return out_lut;
+}
+
+TePDITypes::TePDILutType TePDIContrast::GetHistEqualizerLut(
+ TePDITypes::TePDIHistogramType& hist )
+{
+ PDIAGN_TRUE_OR_THROW( hist.size() > 1, "Invalid histogram size" );
+
+ TePDITypes::TePDIHistogramType::iterator in_hist_it = hist.begin();
+ TePDITypes::TePDIHistogramType::iterator in_hist_it_past = hist.begin();
+ TePDITypes::TePDIHistogramType::iterator in_hist_it_end = hist.end();
+
+ int hist_population = 0;
+
+ /* Generating the accumulative histogram */
+
+ TePDITypes::TePDIHistogramType accumulative_hist;
+
+ accumulative_hist[ in_hist_it->first ] = in_hist_it->second;
+ hist_population += in_hist_it->second;
+ ++in_hist_it;
+
+ TePDITypes::TePDIHistogramType::iterator accumulative_hist_it =
+ accumulative_hist.begin();
+ TePDITypes::TePDIHistogramType::iterator accumulative_hist_it_past =
+ accumulative_hist.begin();
+ ++accumulative_hist_it;
+
+ while( in_hist_it != in_hist_it_end ) {
+ hist_population += in_hist_it->second;
+
+ /* Building accumulative histogram */
+
+ accumulative_hist[ in_hist_it->first ] =
+ accumulative_hist_it_past->second + in_hist_it->second;
+
+ ++accumulative_hist_it_past;
+ ++accumulative_hist_it;
+
+ ++in_hist_it_past;
+ ++in_hist_it;
+ }
+
+ /* Creating the look-up table */
+
+ double levels = (double)hist.size();
+
+ TePDITypes::TePDILutType out_lut;
+
+ in_hist_it = hist.begin();
+
+ while( in_hist_it != in_hist_it_end ) {
+ out_lut[ in_hist_it->first ] = accumulative_hist[ in_hist_it->first ] *
+ levels / ((double)hist_population);
+
+ ++in_hist_it;
+ }
+
+ return out_lut;
+}
+
+
+void TePDIContrast::GetSimpleSlicerLut(
+ TePDITypes::TePDIHistogramType& hist,
+ TePDIRgbPalette::pointer in_palette,
+ double min,
+ double max,
+ TePDITypes::TePDILutType& out_lut )
+{
+ PDIAGN_CHECK_NOTEQUAL( hist.size(), 0, "Invalid histogram size" );
+ PDIAGN_TRUE_OR_THROW( max > min, "Invalid max and min values" );
+ PDIAGN_TRUE_OR_THROW( in_palette->size() > 0,
+ "Invalid input palette size" );
+
+ out_lut.clear();
+
+ /* Extracting palette levels */
+
+ std::vector< double > palette_levels;
+ TePDIRgbPalette::iterator pal_it = in_palette->begin();
+ TePDIRgbPalette::iterator pal_it_end = in_palette->end();
+
+ while( pal_it != pal_it_end ) {
+ palette_levels.push_back( pal_it.level() );
+
+ ++pal_it;
+ }
+
+ /* min and max adjusting to the supplied histogram range */
+
+ double in_hist_max = GetHistMax( hist );
+ double in_hist_min = GetHistMin( hist );
+
+ min = ( min < in_hist_min ) ? in_hist_min : min;
+ max = ( max > in_hist_max ) ? in_hist_max : max;
+
+ /* Output LUT generation */
+
+ double slice_size = ( max - min ) / ((double)in_palette->size());
+
+ double first_pal_level = palette_levels[ 0 ];
+ double last_pal_level = palette_levels[ palette_levels.size() - 1 ];
+
+ TePDITypes::TePDIHistogramType::iterator in_hist_it = hist.begin();
+ TePDITypes::TePDIHistogramType::iterator in_hist_it_end = hist.end();
+
+ double current_level;
+ unsigned int current_slice;
+
+ while( in_hist_it != in_hist_it_end ) {
+ current_level = in_hist_it->first;
+
+ if( current_level < min ) {
+ out_lut[ current_level ] = first_pal_level;
+ } else if ( current_level > max ) {
+ out_lut[ current_level ] = last_pal_level;
+ } else {
+ current_slice =
+ (unsigned int) std::floor( ( current_level - min ) / slice_size );
+
+ out_lut[ current_level ] = palette_levels[ current_slice ];
+ }
+
+ ++in_hist_it;
+ }
+
+
+}
diff --git a/src/terralib/PDI/source/TePDIContrast.hpp b/src/terralib/PDI/source/TePDIContrast.hpp
new file mode 100755
index 0000000..100a963
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIContrast.hpp
@@ -0,0 +1,278 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+#ifndef TEPDICONTRAST_HPP
+ #define TEPDICONTRAST_HPP
+
+ #include "TePDIAlgorithm.hpp"
+ #include "TePDIRgbPalette.hpp"
+ #include "TePDITypes.hpp"
+
+ #include "TePDISharedPtr.cpp"
+
+ /**
+ * This is the class for contrast image processing algorithms.
+ */
+ class TePDIContrast : public TePDIAlgorithm{
+ public :
+ typedef TePDISharedPtr< TePDIContrast > pointer;
+ typedef const TePDISharedPtr< TePDIContrast > const_pointer;
+
+ /**
+ * Allowed contrast types.
+ */
+ enum TePDIContrastType{
+ TePDIContrastMinMax = 1,
+ TePDIContrastLinear = 2,
+ TePDIContrastSquareRoot = 3,
+ TePDIContrastSquare = 4,
+ TePDIContrastLog = 5,
+ TePDIContrastNegative = 6,
+ TePDIContrastHistEqualizer = 7,
+ TePDIContrastSimpleSlicer = 8
+ };
+
+ /**
+ * Alternative Constructor.
+ *
+ * The general required parameters by any contrast type:
+ *
+ * contrast_type (TePDIContrastType),
+ * input_image (TePDITypes::TePDIRasterPtrType),
+ * output_image (TePDITypes::TePDIRasterPtrType),
+ * histo_levels (int) - Number of interpolated histogram levels.
+ *
+ * The specific required parameters ( by parameter type ):
+ *
+ * channels (std::vector<int>) - Band(s) to process. For
+ * TePDIContrastSimpleSlicer just one band is allowed.
+ *
+ * min_level (double) - Minimal level for Linear Luts
+ * Required by: TePDIContrastLinear, TePDIContrastSquareRoot,
+ * TePDIContrastSquare, TePDIContrastLog, TePDIContrastNegative,
+ * TePDIContrastSimpleSlicer
+ *
+ * max_level (double) - Minimal level for Linear Luts
+ * Required by: TePDIContrastLinear, TePDIContrastSquareRoot,
+ * TePDIContrastSquare, TePDIContrastLog, TePDIContrastNegative,
+ * TePDIContrastSimpleSlicer
+ *
+ * rgb_palette (TePDIRgbPalette::pointer) -
+ * Reference RGB palette.
+ * Required by: TePDIContrastSimpleSlicer
+ *
+ * @param params Algoritm parameters.
+ */
+ TePDIContrast( const TePDIParameters& params );
+
+ /**
+ * Default Constructor.
+ *
+ */
+ TePDIContrast();
+
+ /**
+ * Default Destructor
+ */
+ ~TePDIContrast();
+
+ /**
+ * Checks if the supplied parameters fits the requirements of each
+ * PDI algorithm implementation.
+ *
+ * Error log messages must be generated. No exceptions generated.
+ *
+ * @param parameters The parameters to be checked.
+ * @return true if the parameters are OK. false if not.
+ */
+ bool CheckParameters( const TePDIParameters& parameters );
+
+ protected :
+ /**
+ * A cache of level ordered histograms to avoid rebuilding
+ * histograms all the times.
+ */
+ TePDITypes::TePDIHistogramsMapType histo_cache_;
+
+ /**
+ * Runs the current algorithm implementation.
+ *
+ * @return true if OK. false on error.
+ */
+ bool RunImplementation();
+
+ /**
+ * Reset the internal state to the initial state.
+ */
+ void ResetState();
+
+ /**
+ * Build level ordered histograms from the required raster channels.
+ *
+ * The result histograms will remain inside the protected
+ * object histo_cache_
+ *
+ * @param inRaster The input Raster.
+ * @param histo_levels Number of histogram interpolated levels.
+ * @param channels Channels to use for histogram generation.
+ * @param force Force histogram regeneratin even if already in cache.
+ */
+ void BuildHistograms(
+ TePDITypes::TePDIRasterPtrType& inRaster,
+ unsigned int histo_levels,
+ std::vector< int >& channels,
+ bool force = false );
+
+ /**
+ * Do level remapping from one raster to another.
+ *
+ * @param inRaster The input Raster.
+ * @param outRaster The Output Raster.
+ * @param lut The look-up table.
+ * @param in_channel in_raster channel to remap.
+ * @param out_channel out_raster channel to write on.
+ */
+ void RemapLevels(
+ TePDITypes::TePDIRasterPtrType& inRaster,
+ TePDITypes::TePDILutType& lut,
+ int in_channel,
+ int out_channel,
+ TePDITypes::TePDIRasterPtrType& outRaster );
+
+ /**
+ * Get the maximum histogram level.
+ *
+ * Only for histograms with levels equal or greater than zero.
+ *
+ * @param hist The input LEVEL ORDERED histogram.
+ * @return the maximum level.
+ */
+ double GetHistMax( TePDITypes::TePDIHistogramType& hist );
+
+ /**
+ * Get the minimum histogram level.
+ *
+ * Only for histograms with levels equal or greater than zero.
+ *
+ * @param hist The input LEVEL ORDERED histogram.
+ * @return the minimum level.
+ */
+ double GetHistMin( TePDITypes::TePDIHistogramType& hist );
+
+ /**
+ * Build a min-max look-up table.
+ *
+ * @param hist Base histogram.
+ * @return The look-up table.
+ */
+ TePDITypes::TePDILutType GetMinMaxLut(
+ TePDITypes::TePDIHistogramType& hist );
+
+ /**
+ * Build a Linear look-up table.
+ *
+ * @param min Minimal level value.
+ * @param max Maximum level value.
+ * @param hist Base histogram.
+ * @return The look-up table.
+ */
+ TePDITypes::TePDILutType GetLinearLut(
+ TePDITypes::TePDIHistogramType& hist,
+ double min, double max );
+
+ /**
+ * Build a Square Root look-up table.
+ *
+ * @param min Minimal level value.
+ * @param max Maximum level value.
+ * @param hist Base histogram.
+ * @return The look-up table.
+ */
+ TePDITypes::TePDILutType GetSquareRootLut(
+ TePDITypes::TePDIHistogramType& hist,
+ double min, double max );
+
+ /**
+ * Build a Square look-up table.
+ *
+ * @param min Minimal level value.
+ * @param max Maximum level value.
+ * @param hist Base histogram.
+ * @return The look-up table.
+ */
+ TePDITypes::TePDILutType GetSquareLut(
+ TePDITypes::TePDIHistogramType& hist,
+ double min, double max );
+
+ /**
+ * Build a Log look-up table.
+ *
+ * @param min Minimal level value.
+ * @param max Maximum level value.
+ * @param hist Base histogram.
+ * @return The look-up table.
+ */
+ TePDITypes::TePDILutType GetLogLut(
+ TePDITypes::TePDIHistogramType& hist,
+ double min, double max );
+
+ /**
+ * Build a Negative look-up table.
+ *
+ * @param min Minimal level value.
+ * @param max Maximum level value.
+ * @param hist Base histogram.
+ * @return The look-up table.
+ */
+ TePDITypes::TePDILutType GetNegativeLut(
+ TePDITypes::TePDIHistogramType& hist,
+ double min, double max );
+
+ /**
+ * Build a Histogram equalizer look-up table.
+ *
+ * @param hist A LEVEL-ORDERED Base histogram.
+ * @return The look-up table.
+ */
+ TePDITypes::TePDILutType GetHistEqualizerLut(
+ TePDITypes::TePDIHistogramType& hist );
+
+ /**
+ * Builds a Simple slicer look-up table.
+ *
+ * @param hist A LEVEL-ORDERED Base histogram.
+ * @param in_palette The reference RGB palette.
+ * @param min Minimal level value.
+ * @param max Maximum level value.
+ * @param out_lut The look-up table.
+ */
+ void GetSimpleSlicerLut(
+ TePDITypes::TePDIHistogramType& hist,
+ TePDIRgbPalette::pointer in_palette,
+ double min,
+ double max,
+ TePDITypes::TePDILutType& out_lut );
+ };
+
+#endif //TEPDICONTRAST_HPP
diff --git a/src/terralib/PDI/source/TePDIFilter.cpp b/src/terralib/PDI/source/TePDIFilter.cpp
new file mode 100755
index 0000000..0f7d1d5
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIFilter.cpp
@@ -0,0 +1,17 @@
+#include "TePDIFilter.hpp"
+
+
+TePDIFilter::TePDIFilter( const TePDIParameters& params )
+: TePDIAlgorithm( params )
+{
+}
+
+TePDIFilter::TePDIFilter()
+{
+}
+
+
+TePDIFilter::~TePDIFilter()
+{
+}
+
diff --git a/src/terralib/PDI/source/TePDIFilter.hpp b/src/terralib/PDI/source/TePDIFilter.hpp
new file mode 100755
index 0000000..b9708fd
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIFilter.hpp
@@ -0,0 +1,85 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+#ifndef TEPDIFILTER_HPP
+ #define TEPDIFILTER_HPP
+
+ #include "TePDIAlgorithm.hpp"
+ #include "TePDIParameters.hpp"
+
+ #include "TePDISharedPtr.cpp"
+
+ /**
+ * This is the base class for image filtering algorithms.
+ */
+ class TePDIFilter : public TePDIAlgorithm{
+ public :
+ typedef TePDISharedPtr< TePDIFilter > pointer;
+ typedef const TePDISharedPtr< TePDIFilter > const_pointer;
+
+ /**
+ * Default Destructor
+ */
+ ~TePDIFilter();
+
+ /**
+ * Checks if the supplied parameters fits the requirements of each
+ * PDI algorithm implementation.
+ *
+ * Error log messages must be generated. No exceptions generated.
+ *
+ * @param parameters The parameters to be checked.
+ * @return true if the parameters are OK. false if not.
+ */
+ virtual bool CheckParameters( const TePDIParameters& parameters ) = 0;
+
+ protected :
+ /**
+ * Default Constructor.
+ *
+ */
+ TePDIFilter();
+
+ /**
+ * Alternative Constructor
+ *
+ * @param params Algoritm parameters.
+ */
+ TePDIFilter( const TePDIParameters& params );
+
+ /**
+ * Runs the current algorithm implementation.
+ *
+ * @return true if OK. false on error.
+ */
+ virtual bool RunImplementation() = 0;
+
+ /**
+ * Reset the internal state to the initial state.
+ */
+ virtual void ResetState() = 0;
+
+ };
+
+#endif //TEPDIFILTER_HPP
diff --git a/src/terralib/PDI/source/TePDIFilterMask.cpp b/src/terralib/PDI/source/TePDIFilterMask.cpp
new file mode 100755
index 0000000..c5b086c
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIFilterMask.cpp
@@ -0,0 +1,17 @@
+#include "TePDIFilterMask.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+
+TePDIFilterMask::TePDIFilterMask()
+{
+}
+
+
+TePDIFilterMask::~TePDIFilterMask()
+{
+}
+
+
+
+
diff --git a/src/terralib/PDI/source/TePDIFilterMask.hpp b/src/terralib/PDI/source/TePDIFilterMask.hpp
new file mode 100755
index 0000000..ad6f98e
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIFilterMask.hpp
@@ -0,0 +1,53 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+#ifndef TEPDIFILTERMASK_HPP
+ #define TEPDIFILTERMASK_HPP
+
+ #include <TeMatrix.h>
+
+ #include "TePDISharedPtr.cpp"
+
+ /**
+ * This is the class for image Linear filtering processing.
+ */
+ class TePDIFilterMask : public TeMatrix{
+ public :
+ typedef TePDISharedPtr< TePDIFilterMask > pointer;
+ typedef const TePDISharedPtr< TePDIFilterMask > const_pointer;
+
+ /**
+ * Default Constructor.
+ *
+ */
+ TePDIFilterMask();
+
+ /**
+ * Default Destructor
+ */
+ ~TePDIFilterMask();
+
+ };
+
+#endif //TEPDIFILTERMASK_HPP
diff --git a/src/terralib/PDI/source/TePDILinearFilter.cpp b/src/terralib/PDI/source/TePDILinearFilter.cpp
new file mode 100755
index 0000000..0256cf6
--- /dev/null
+++ b/src/terralib/PDI/source/TePDILinearFilter.cpp
@@ -0,0 +1,90 @@
+#include "TePDILinearFilter.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+
+TePDILinearFilter::TePDILinearFilter( const TePDIParameters& params )
+: TePDIFilter( params )
+{
+}
+
+
+TePDILinearFilter::TePDILinearFilter()
+{
+}
+
+
+TePDILinearFilter::~TePDILinearFilter()
+{
+}
+
+
+bool TePDILinearFilter::CheckParameters( const TePDIParameters& parameters )
+{
+ /* Checking for general required parameters */
+
+ TePDITypes::TePDIRasterPtrType inRaster;
+ if( ! parameters.GetParameter( "input_image", inRaster ) ) {
+
+ PDIAGN_LOGERR( "Missing parameter: input_image" );
+ return false;
+ }
+ if( ! inRaster.isActive() ) {
+
+ PDIAGN_LOGERR( "Invalid parameter: input_image inactive" );
+ return false;
+ }
+ if( inRaster->status() == TeNOTREADY ) {
+
+ PDIAGN_LOGERR( "Invalid parameter: input_image not ready" );
+ return false;
+ }
+
+ TePDITypes::TePDIRasterPtrType outRaster;
+ if( ! parameters.GetParameter( "output_image", outRaster ) ) {
+
+ PDIAGN_LOGERR( "Missing parameter: output_image" );
+ return false;
+ }
+ if( ! outRaster.isActive() ) {
+
+ PDIAGN_LOGERR( "Invalid parameter: output_image inactive" );
+ return false;
+ }
+ if( inRaster->status() == TeREADYTOWRITE ) {
+
+ PDIAGN_LOGERR( "Invalid parameter: output_image not ready" );
+ return false;
+ }
+
+ /* channels parameter checking */
+
+ std::vector< int > channels;
+ if( ! parameters.GetParameter( "channels", channels ) ) {
+
+ PDIAGN_LOGERR( "Missing parameter: channels" );
+ return false;
+ }
+ for( unsigned int index = 0 ; index < channels.size() ; ++index ) {
+ if( channels[ index ] >= inRaster->nBands() ) {
+ PDIAGN_LOGERR( "Invalid parameter: channels" );
+ return false;
+ }
+ }
+ return true;
+}
+
+
+bool TePDILinearFilter::RunImplementation()
+{
+ PDIAGN_NOT_IMPLEMENTED;
+
+ return false;
+}
+
+
+void TePDILinearFilter::ResetState()
+{
+ PDIAGN_NOT_IMPLEMENTED;
+}
+
diff --git a/src/terralib/PDI/source/TePDILinearFilter.hpp b/src/terralib/PDI/source/TePDILinearFilter.hpp
new file mode 100755
index 0000000..430b844
--- /dev/null
+++ b/src/terralib/PDI/source/TePDILinearFilter.hpp
@@ -0,0 +1,86 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+#ifndef TEPDILINEARFILTER_HPP
+ #define TEPDILINEARFILTER_HPP
+
+ #include "TePDIFilter.hpp"
+ #include "TePDIParameters.hpp"
+
+ #include "TePDISharedPtr.cpp"
+
+ /**
+ * This is the class for image Linear filtering processing.
+ */
+ class TePDILinearFilter : public TePDIFilter{
+ public :
+ typedef TePDISharedPtr< TePDILinearFilter > pointer;
+ typedef const TePDISharedPtr< TePDILinearFilter > const_pointer;
+
+ /**
+ * Default Constructor.
+ *
+ */
+ TePDILinearFilter();
+
+ /**
+ * Alternative Constructor
+ *
+ * @param params Algoritm parameters.
+ */
+ TePDILinearFilter( const TePDIParameters& params );
+
+ /**
+ * Default Destructor
+ */
+ ~TePDILinearFilter();
+
+ /**
+ * Checks if the supplied parameters fits the requirements of each
+ * PDI algorithm implementation.
+ *
+ * Error log messages must be generated. No exceptions generated.
+ *
+ * @param parameters The parameters to be checked.
+ * @return true if the parameters are OK. false if not.
+ */
+ bool CheckParameters( const TePDIParameters& parameters );
+
+ protected :
+
+ /**
+ * Runs the current algorithm implementation.
+ *
+ * @return true if OK. false on error.
+ */
+ bool RunImplementation();
+
+ /**
+ * Reset the internal state to the initial state.
+ */
+ void ResetState();
+
+ };
+
+#endif //TEPDILINEARFILTER_HPP
diff --git a/src/terralib/PDI/source/TePDIParameters.cpp b/src/terralib/PDI/source/TePDIParameters.cpp
new file mode 100644
index 0000000..93cd64e
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIParameters.cpp
@@ -0,0 +1,313 @@
+#include "TePDIParameters.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+TePDIParameters::TePDIParameters()
+{
+
+}
+
+
+TePDIParameters::~TePDIParameters()
+{
+
+}
+
+void TePDIParameters::SetParameter( const std::string& pname,
+ const TePDITypes::TePDIRasterPtrType& data )
+{
+ unsigned int old_size = RasterMap_.size();
+
+ RasterMap_[ pname ] = data;
+
+ PDIAGN_TRUE_OR_THROW( old_size != RasterMap_.size(),
+ "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+ TePDITypes::TePDIRasterPtrType& data ) const
+{
+ TePDIRasterMap::iterator it = RasterMap_.find( pname );
+
+ if( it != RasterMap_.end() ) {
+ data = it->second;
+ return true;
+ }
+
+ PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+ return false;
+}
+
+
+void TePDIParameters::SetParameter( const std::string& pname,
+ TePDIRgbPalette::const_pointer& data )
+{
+ unsigned int old_size = PDIRgbPaletteMap_.size();
+
+ PDIRgbPaletteMap_[ pname ] = data;
+
+ PDIAGN_TRUE_OR_THROW( old_size != PDIRgbPaletteMap_.size(),
+ "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+ TePDIRgbPalette::pointer& data ) const
+{
+ TePDIRgbPaletteMap::iterator it = PDIRgbPaletteMap_.find( pname );
+
+ if( it != PDIRgbPaletteMap_.end() ) {
+ data = it->second;
+ return true;
+ }
+
+ PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+ return false;
+}
+
+
+void TePDIParameters::SetParameter( const std::string& pname,
+ int data )
+{
+ unsigned int old_size = IntegerMap_.size();
+
+ IntegerMap_[ pname ] = data;
+
+ PDIAGN_TRUE_OR_THROW( old_size != IntegerMap_.size(),
+ "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+ int& data ) const
+{
+ TePDIIntegerMap::iterator it = IntegerMap_.find( pname );
+
+ if( it != IntegerMap_.end() ) {
+ data = it->second;
+ return true;
+ }
+
+ PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+ return false;
+}
+
+void TePDIParameters::SetParameter( const std::string& pname,
+ std::vector< int >& data )
+{
+ unsigned int old_size = IntegerVectorMap_.size();
+
+ IntegerVectorMap_[ pname ] = data;
+
+ PDIAGN_TRUE_OR_THROW( old_size != IntegerVectorMap_.size(),
+ "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+ std::vector< int >& data ) const
+{
+ TePDIIntegerVectorMap::iterator it = IntegerVectorMap_.find( pname );
+
+ if( it != IntegerVectorMap_.end() ) {
+ data = it->second;
+ return true;
+ }
+
+ PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+ return false;
+}
+
+void TePDIParameters::SetParameter( const std::string& pname,
+ const std::string& data )
+{
+ unsigned int old_size = StringMap_.size();
+
+ StringMap_[ pname ] = data;
+
+ PDIAGN_TRUE_OR_THROW( old_size != StringMap_.size(),
+ "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+ std::string& data ) const
+{
+ TePDIStringMap::iterator it = StringMap_.find( pname );
+
+ if( it != StringMap_.end() ) {
+ data = it->second;
+ return true;
+ }
+
+ PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+ return false;
+}
+
+void TePDIParameters::SetParameter( const std::string& pname,
+ double data )
+{
+ unsigned int old_size = DoubleMap_.size();
+
+ DoubleMap_[ pname ] = data;
+
+ PDIAGN_TRUE_OR_THROW( old_size != DoubleMap_.size(),
+ "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+ double& data ) const
+{
+ TePDIDoubleMap::iterator it = DoubleMap_.find( pname );
+
+ if( it != DoubleMap_.end() ) {
+ data = it->second;
+ return true;
+ }
+
+ PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+ return false;
+}
+
+void TePDIParameters::SetParameter( const std::string& pname,
+ const TePDIBox::pointer& data )
+{
+ unsigned int old_size = PDIBoxMap_.size();
+
+ PDIBoxMap_[ pname ] = data;
+
+ PDIAGN_TRUE_OR_THROW( old_size != PDIBoxMap_.size(),
+ "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+ TePDIBox::pointer& data ) const
+{
+ TePDIBoxMap::iterator it = PDIBoxMap_.find( pname );
+
+ if( it != PDIBoxMap_.end() ) {
+ data = it->second;
+ return true;
+ }
+
+ PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+ return false;
+}
+
+void TePDIParameters::SetParameter( const std::string& pname,
+ const TePDIFilterMask::pointer& data )
+{
+ unsigned int old_size = PDIFilterMaskMap_.size();
+
+ PDIFilterMaskMap_[ pname ] = data;
+
+ PDIAGN_TRUE_OR_THROW( old_size != PDIFilterMaskMap_.size(),
+ "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+ TePDIFilterMask::pointer& data ) const
+{
+ TePDIFilterMaskMap::iterator it = PDIFilterMaskMap_.find( pname );
+
+ if( it != PDIFilterMaskMap_.end() ) {
+ data = it->second;
+ return true;
+ }
+
+ PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+ return false;
+}
+
+bool TePDIParameters::CheckParameter( const std::string& pname,
+ TePDIParamTypes type ) const
+{
+ switch( type ) {
+ case TePDIIntParam :
+ {
+ if( IntegerMap_.find( pname ) != IntegerMap_.end() ){
+ return true;
+ }
+ break;
+ }
+ case TePDIIntVectorParam :
+ {
+ if( IntegerVectorMap_.find( pname ) != IntegerVectorMap_.end() ){
+ return true;
+ }
+ break;
+ }
+ case TePDIRasterParam :
+ {
+ if( RasterMap_.find( pname ) != RasterMap_.end() ){
+ return true;
+ }
+ break;
+ }
+ case TePDIStringParam :
+ {
+ if( StringMap_.find( pname ) != StringMap_.end() ){
+ return true;
+ }
+ break;
+ }
+ case TePDIDoubleParam :
+ {
+ if( DoubleMap_.find( pname ) != DoubleMap_.end() ){
+ return true;
+ }
+ break;
+ }
+ case TePDIBoxParam :
+ {
+ if( PDIBoxMap_.find( pname ) != PDIBoxMap_.end() ){
+ return true;
+ }
+ break;
+ }
+ case TePDIRgbPaletteParam :
+ {
+ if( PDIRgbPaletteMap_.find( pname ) != PDIRgbPaletteMap_.end() ){
+ return true;
+ }
+ break;
+ }
+ case TePDIFilterMaskParam :
+ {
+ if( PDIFilterMaskMap_.find( pname ) != PDIFilterMaskMap_.end() ){
+ return true;
+ }
+ break;
+ } default :
+ {
+ PDIAGN_LOG_AND_THROW( "Invalid Parameter Type" );
+ break;
+ }
+ }
+
+ return false;
+}
+
+void TePDIParameters::operator=( const TePDIParameters& ext_params )
+{
+ RasterMap_ = ext_params.RasterMap_;
+ IntegerMap_ = ext_params.IntegerMap_;
+ IntegerVectorMap_ = ext_params.IntegerVectorMap_;
+ StringMap_ = ext_params.StringMap_;
+ DoubleMap_ = ext_params.DoubleMap_;
+ PDIBoxMap_ = ext_params.PDIBoxMap_;
+ PDIRgbPaletteMap_ = ext_params.PDIRgbPaletteMap_;
+ PDIFilterMaskMap_ = ext_params.PDIFilterMaskMap_;
+}
diff --git a/src/terralib/PDI/source/TePDIParameters.hpp b/src/terralib/PDI/source/TePDIParameters.hpp
new file mode 100644
index 0000000..da1b40f
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIParameters.hpp
@@ -0,0 +1,306 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ * This file contains the class of structures and definitions
+ * to deal with parameters used by all PDI classes.
+ */
+
+#ifndef TEPDIPARAMETERS_HPP
+ #define TEPDIPARAMETERS_HPP
+
+ #include "TePDIBox.hpp"
+ #include "TePDITypes.hpp"
+ #include "TePDIRgbPalette.hpp"
+ #include "TePDIFilterMask.hpp"
+
+ #include "TePDISharedPtr.cpp"
+
+ #include <TeRaster.h>
+
+ #include <map>
+ #include <string>
+ #include <vector>
+
+ class TePDIParameters {
+ public :
+ typedef TePDISharedPtr< TePDIParameters > pointer;
+ typedef const TePDISharedPtr< TePDIParameters > const_pointer;
+
+ /**
+ * Suported parameters.
+ */
+ enum TePDIParamTypes{
+ TePDIIntParam = 1,
+ TePDIIntVectorParam = 2,
+ TePDIRasterParam = 3,
+ TePDIDoubleParam = 4,
+ TePDIStringParam = 5,
+ TePDIBoxParam = 6,
+ TePDIRgbPaletteParam = 7,
+ TePDIFilterMaskParam = 8
+ };
+
+ /**
+ * Default Constructor
+ */
+ TePDIParameters();
+
+ /**
+ * Default Destructor
+ */
+ ~TePDIParameters();
+
+ /**
+ * Sets a TeRaster parameter reference.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ */
+ void SetParameter( const std::string& pname,
+ const TePDITypes::TePDIRasterPtrType& data );
+
+ /**
+ * Gets a TeRaster parameter reference.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ * @return true if OK, false if the parameter was not found or error.
+ */
+ bool GetParameter( const std::string& pname,
+ TePDITypes::TePDIRasterPtrType& data ) const;
+
+ /**
+ * Sets a TePDIPalette parameter reference.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ */
+ void SetParameter( const std::string& pname,
+ TePDIRgbPalette::const_pointer& data );
+
+ /**
+ * Gets a TePDIPalette parameter reference.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ * @return true if OK, false if the parameter was not found or error.
+ */
+ bool GetParameter( const std::string& pname,
+ TePDIRgbPalette::pointer& data ) const;
+
+ /**
+ * Sets a Integer parameter.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ */
+ void SetParameter( const std::string& pname,
+ int data );
+
+ /**
+ * Gets a Integer parameter.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ * @return true if OK, false if the parameter was no found or error.
+ */
+ bool GetParameter( const std::string& pname,
+ int& data ) const;
+
+ /**
+ * Sets a Integer vector parameter.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ */
+ void SetParameter( const std::string& pname,
+ std::vector< int >& data );
+
+ /**
+ * Gets a Integer vector parameter.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ * @return true if OK, false if the parameter was no found or error.
+ */
+ bool GetParameter( const std::string& pname,
+ std::vector< int >& data ) const;
+
+ /**
+ * Sets a String parameter.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ */
+ void SetParameter( const std::string& pname,
+ const std::string& data );
+
+ /**
+ * Gets a String parameter.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ * @return true if OK, false if the parameter was no found or error.
+ */
+ bool GetParameter( const std::string& pname,
+ std::string& data ) const;
+
+ /**
+ * Sets a Double parameter.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ */
+ void SetParameter( const std::string& pname,
+ double data );
+
+ /**
+ * Gets a Double parameter.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ * @return true if OK, false if the parameter was no found or error.
+ */
+ bool GetParameter( const std::string& pname,
+ double& data ) const;
+
+ /**
+ * Sets a PDIBox parameter.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ */
+ void SetParameter( const std::string& pname,
+ const TePDIBox::pointer& data );
+
+ /**
+ * Gets a PDIBox parameter.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ * @return true if OK, false if the parameter was no found or error.
+ */
+ bool GetParameter( const std::string& pname,
+ TePDIBox::pointer& data ) const;
+
+ /**
+ * Sets a FilterMask parameter.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ */
+ void SetParameter( const std::string& pname,
+ const TePDIFilterMask::pointer& data );
+
+ /**
+ * Gets a FilterMask parameter.
+ *
+ * @param pname Parameter name.
+ * @param data Parameter data.
+ * @return true if OK, false if the parameter was no found or error.
+ */
+ bool GetParameter( const std::string& pname,
+ TePDIFilterMask::pointer& data ) const;
+
+ /**
+ * Checks if the parameter was set.
+ *
+ * @param pname Parameter name.
+ * @param type Parameter type.
+ * @return true if OK, false if the parameter was not set.
+ */
+ bool CheckParameter( const std::string& pname,
+ TePDIParamTypes type ) const;
+
+ /**
+ * Operator = overload.
+ *
+ * @param ext_params External instance TePDIParameters reference.
+ */
+ void operator=( const TePDIParameters& ext_params );
+
+ protected :
+ /**
+ * Internal Type definitions of suported parameters.
+ */
+ typedef std::map< std::string, std::string >
+ TePDIStringMap;
+ typedef std::map< std::string, int >
+ TePDIIntegerMap;
+ typedef std::map< std::string, std::vector< int > >
+ TePDIIntegerVectorMap;
+ typedef std::map< std::string, double >
+ TePDIDoubleMap;
+ typedef std::map< std::string, TePDITypes::TePDIRasterPtrType >
+ TePDIRasterMap;
+ typedef std::map< std::string, TePDIBox::pointer >
+ TePDIBoxMap;
+ typedef std::map< std::string, TePDIRgbPalette::pointer >
+ TePDIRgbPaletteMap;
+ typedef std::map< std::string, TePDIFilterMask::pointer >
+ TePDIFilterMaskMap;
+
+ /**
+ * Stored TeRaster references Map.
+ */
+ mutable TePDIRasterMap RasterMap_;
+
+ /**
+ * Stored integer references Map.
+ */
+ mutable TePDIIntegerMap IntegerMap_;
+
+ /**
+ * Stored integer vector references Map.
+ */
+ mutable TePDIIntegerVectorMap IntegerVectorMap_;
+
+ /**
+ * Stored double references Map.
+ */
+ mutable TePDIDoubleMap DoubleMap_;
+
+ /**
+ * Stored string references Map.
+ */
+ mutable TePDIStringMap StringMap_;
+
+ /**
+ * Stored PDIBox references Map.
+ */
+ mutable TePDIBoxMap PDIBoxMap_;
+
+ /**
+ * Stored PDIPalette references Map.
+ */
+ mutable TePDIRgbPaletteMap PDIRgbPaletteMap_;
+
+ /**
+ * Stored PDIFilterMask references Map.
+ */
+ mutable TePDIFilterMaskMap PDIFilterMaskMap_;
+};
+
+#endif //TEPDIPARAMETERS_HPP
diff --git a/src/terralib/PDI/source/TePDIRgbPalette.cpp b/src/terralib/PDI/source/TePDIRgbPalette.cpp
new file mode 100755
index 0000000..e825f04
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIRgbPalette.cpp
@@ -0,0 +1,194 @@
+#include "TePDIRgbPalette.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+#include <math.h>
+
+
+TePDIRgbPalette::iterator::iterator(
+ const std::map< double, unsigned int >::iterator& red_it,
+ const std::map< double, unsigned int >::iterator& green_it,
+ const std::map< double, unsigned int >::iterator& blue_it )
+{
+ red_it_ = red_it;
+ green_it_ = green_it;
+ blue_it_ = blue_it;
+}
+
+
+TePDIRgbPalette::iterator::~iterator()
+{
+}
+
+
+void TePDIRgbPalette::iterator::operator++()
+{
+ ++red_it_;
+ ++green_it_;
+ ++blue_it_;
+}
+
+
+void TePDIRgbPalette::iterator::operator--()
+{
+ --red_it_;
+ --green_it_;
+ --blue_it_;
+}
+
+
+void TePDIRgbPalette::iterator::operator=( const iterator& ext_ref )
+{
+ red_it_ = ext_ref.red_it_;
+ green_it_ = ext_ref.green_it_;
+ blue_it_ = ext_ref.blue_it_;
+}
+
+
+bool TePDIRgbPalette::iterator::operator!=( const iterator& ext_ref )
+{
+ return ( red_it_ != ext_ref.red_it_ ) ? true : false;
+}
+
+
+double TePDIRgbPalette::iterator::level() const
+{
+ return red_it_->first;
+}
+
+
+unsigned int TePDIRgbPalette::iterator::red() const
+{
+ return red_it_->second;
+}
+
+
+unsigned int TePDIRgbPalette::iterator::green() const
+{
+ return green_it_->second;
+}
+
+
+unsigned int TePDIRgbPalette::iterator::blue() const
+{
+ return blue_it_->second;
+}
+
+
+TePDIRgbPalette::TePDIRgbPalette()
+{
+}
+
+
+TePDIRgbPalette::~TePDIRgbPalette()
+{
+}
+
+void TePDIRgbPalette::set( double level, unsigned int red,
+ unsigned int green, unsigned int blue )
+{
+ red_map_[ level ] = red;
+ green_map_[ level ] = green;
+ blue_map_[ level ] = blue;
+}
+
+bool TePDIRgbPalette::get( double level, unsigned int& red,
+ unsigned int& green, unsigned int& blue ) const
+{
+ if( red_map_.find( level ) != red_map_.end() ) {
+ red = red_map_[ level ];
+ green = green_map_[ level ];
+ blue = blue_map_[ level ];
+
+ return true;
+ } else {
+ return false;
+ }
+}
+
+
+void TePDIRgbPalette::clear()
+{
+ red_map_.clear();
+ green_map_.clear();
+ blue_map_.clear();
+}
+
+
+unsigned long int TePDIRgbPalette::size() const
+{
+ return red_map_.size();
+}
+
+
+void TePDIRgbPalette::operator=( TePDIRgbPalette& external_reference )
+{
+ red_map_ = external_reference.red_map_;
+ green_map_ = external_reference.green_map_;
+ blue_map_ = external_reference.blue_map_;
+}
+
+
+TePDIRgbPalette::iterator TePDIRgbPalette::begin() const
+{
+ TePDIRgbPalette::iterator temp_it( red_map_.begin(), green_map_.begin(),
+ blue_map_.begin() );
+
+ return temp_it;
+}
+
+
+TePDIRgbPalette::iterator TePDIRgbPalette::end() const
+{
+ TePDIRgbPalette::iterator temp_it( red_map_.end(), green_map_.end(),
+ blue_map_.end() );
+
+ return temp_it;
+}
+
+
+TePDISharedPtr< TePDIRgbPalette > TePDIRgbPalette::createLB(
+ unsigned int levels )
+{
+ PDIAGN_TRUE_OR_THROW( levels > 0, "Invalid supplied Levels" );
+
+ unsigned int channel_levels =
+ (unsigned int) ceil( cbrtf( (float)levels ) );
+
+ unsigned int channel_step =
+ (unsigned int) floor( 256. / (float)(channel_levels + 1) );
+
+ unsigned int red_level = 0;
+ unsigned int green_level = 0;
+ unsigned int blue_level = 0;
+
+ TePDISharedPtr< TePDIRgbPalette > outPal( new TePDIRgbPalette );
+
+ unsigned int level = 0;
+
+ while( level < levels ) {
+ if( red_level > 255 ) {
+ red_level = red_level % 255;
+
+ green_level += channel_step;
+
+ if( green_level > 255 ) {
+ green_level = green_level % 255;
+
+ blue_level += channel_step;
+
+ if( blue_level > 255 ) {
+ blue_level = blue_level % 255;
+ }
+ }
+ }
+
+ outPal->set( (double)level, red_level, green_level, blue_level );
+
+ red_level += channel_step;
+
+ ++level;
+ }
+
+ return outPal;
+}
diff --git a/src/terralib/PDI/source/TePDIRgbPalette.hpp b/src/terralib/PDI/source/TePDIRgbPalette.hpp
new file mode 100644
index 0000000..abe8b62
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIRgbPalette.hpp
@@ -0,0 +1,238 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ * This file contains the class for RGB Palettes.
+ */
+
+#ifndef TEPDIRGBPALETTE_HPP
+ #define TEPDIRGBPALETTE_HPP
+
+ #include "TePDISharedPtr.cpp"
+
+ #include <map>
+ #include <cctype>
+
+ class TePDIRgbPalette{
+ public :
+ typedef TePDISharedPtr< TePDIRgbPalette > pointer;
+ typedef const TePDISharedPtr< TePDIRgbPalette > const_pointer;
+
+ /**
+ * Default Constructor
+ *
+ */
+ TePDIRgbPalette();
+
+ /**
+ * Default Destructor
+ */
+ virtual ~TePDIRgbPalette();
+
+ /**
+ * Stores RGB values associated with a paletted level.
+ *
+ * @param level Palette Level.
+ * @param red Red Level.
+ * @param green Green Level.
+ * @param blue Blue Level.
+ */
+ void set( double level, unsigned int red, unsigned int green,
+ unsigned int blue );
+
+ /**
+ * Retrives Stored RGB values associated with a paletted level.
+ *
+ * @param level Palette Level.
+ * @param red Red Level.
+ * @param green Green Level.
+ * @param blue Blue Level.
+ *
+ * @return true if the paletted level was found, false on error.
+ */
+ bool get( double level, unsigned int& red, unsigned int& green,
+ unsigned int& blue ) const;
+
+ /**
+ * Clears the entire palette.
+ */
+ void clear();
+
+ /**
+ * The current palette size.
+ *
+ * @return The current palette size.
+ */
+ unsigned long int size() const;
+
+ /**
+ * Operator = overload.
+ *
+ * @param external_reference A external palette reference.
+ */
+ void operator=( TePDIRgbPalette& external_reference );
+
+ /**
+ * Automatic Level Based Palette creation.
+ *
+ * @param levels The number of levels.
+ * @return The generated palette.
+ */
+ static TePDISharedPtr< TePDIRgbPalette > createLB( unsigned int levels );
+
+ /**
+ * Palette iterator.
+ */
+ class iterator{
+ public :
+ /**
+ * Default Constructor.
+ *
+ * @param red_it Red channel iterator.
+ * @param green_it Green channel iterator.
+ * @param blue_it Blue channel iterator.
+ */
+ explicit iterator(
+ const std::map< double, unsigned int >::iterator& red_it,
+ const std::map< double, unsigned int >::iterator& green_it,
+ const std::map< double, unsigned int >::iterator& blue_it );
+
+ /**
+ * Default Destructor.
+ */
+ ~iterator();
+
+ /**
+ * Operator ++ overload.
+ */
+ void operator++();
+
+ /**
+ * Operator -- overload.
+ */
+ void operator--();
+
+ /**
+ * Operator = overload.
+ *
+ * @param ext_ref External iterator reference.
+ */
+ void operator=( const iterator& ext_ref );
+
+ /**
+ * Operator != overload.
+ *
+ * @param ext_ref External iterator reference.
+ * @return true if both iterators are pointing to the same
+ * position.
+ */
+ bool operator!=( const iterator& ext_ref );
+
+ /**
+ * The current iterator pointed level.
+ *
+ * @return The current iterator pointed level.
+ */
+ double level() const;
+
+ /**
+ * The current iterator red channel value.
+ *
+ * @return The current iterator red channel value.
+ */
+ unsigned int red() const;
+
+ /**
+ * The current iterator green channel value.
+ *
+ * @return The current iterator green channel value.
+ */
+ unsigned int green() const;
+
+ /**
+ * The current iterator blue channel value.
+ *
+ * @return The current iterator blue channel value.
+ */
+ unsigned int blue() const;
+
+ protected :
+ /**
+ * Internal red map iterator;
+ */
+ mutable std::map< double, unsigned int >::iterator red_it_;
+
+ /**
+ * Internal green map iterator;
+ */
+ mutable std::map< double, unsigned int >::iterator green_it_;
+
+ /**
+ * Internal blue map iterator;
+ */
+ mutable std::map< double, unsigned int >::iterator blue_it_;
+ };
+
+ /**
+ * Iterator to the first element.
+ *
+ * @return An Iterator to the first element.
+ */
+ iterator begin() const;
+
+ /**
+ * Iterator pointing to the position after the
+ * last element.
+ *
+ * @return The iterator.
+ */
+ iterator end() const;
+
+ protected :
+ /**
+ * Internal Red channel map.
+ *
+ * @param double Paletted Level.
+ * @param unsigned int Relative Red Level.
+ */
+ mutable std::map< double, unsigned int > red_map_;
+
+ /**
+ * Internal Green channel map.
+ *
+ * @param double Paletted Level.
+ * @param unsigned int Relative Green Level.
+ */
+ mutable std::map< double, unsigned int > green_map_;
+
+ /**
+ * Internal Blue channel map.
+ *
+ * @param double Paletted Level.
+ * @param unsigned int Relative Blue Level.
+ */
+ mutable std::map< double, unsigned int > blue_map_;
+ };
+
+#endif //TEPDIRGBPALETTE_HPP
diff --git a/src/terralib/PDI/source/TePDISharedPtr.cpp b/src/terralib/PDI/source/TePDISharedPtr.cpp
new file mode 100644
index 0000000..dcb0aca
--- /dev/null
+++ b/src/terralib/PDI/source/TePDISharedPtr.cpp
@@ -0,0 +1,146 @@
+#ifndef TEPDISHAREDPTR_CPP
+#define TEPDISHAREDPTR_CPP
+
+#include "TePDISharedPtr.hpp"
+
+#include <iostream>
+
+
+template< class T >
+TePDISharedPtr< T >::TePDISharedPtr( T* pointer,
+ bool static_assignment )
+{
+ if( pointer == 0 ) {
+ counter_ = 0;
+ reference_ = 0;
+ static_assignment_ = false;
+ } else {
+ counter_ = new unsigned long int;
+ (*counter_) = 1;
+
+ reference_ = pointer;
+
+ static_assignment_ = static_assignment;
+ }
+}
+
+
+template< class T >
+TePDISharedPtr< T >::TePDISharedPtr( const TePDISharedPtr& external )
+{
+ counter_ = 0;
+ reference_ = 0;
+ static_assignment_ = false;
+
+ (*this) = external;
+}
+
+
+template< class T >
+ TePDISharedPtr< T >::~TePDISharedPtr()
+{
+ reset();
+}
+
+
+template< class T >
+bool TePDISharedPtr< T >::isActive() const
+{
+ return ( reference_ == 0 ) ? false : true;
+}
+
+
+template< class T >
+void TePDISharedPtr< T >::reset( T* pointer, bool static_assignment )
+{
+ if( isActive() ) {
+ --(*counter_);
+
+ if( (*counter_) == 0 ) {
+ delete counter_;
+
+ if( ! static_assignment_ ) {
+ delete reference_;
+ }
+ }
+ }
+
+ if( pointer != 0 ){
+ counter_ = new unsigned long int;
+ (*counter_) = 1;
+
+ reference_ = pointer;
+
+ static_assignment_ = static_assignment;
+ } else {
+ counter_ = 0;
+ reference_ = 0;
+ static_assignment_ = false;
+ }
+}
+
+
+template< class T >
+TePDISharedPtr< T >& TePDISharedPtr< T >::operator=(
+ const TePDISharedPtr< T >& external )
+{
+ reset();
+
+ if( external.isActive() ) {
+ counter_ = external.counter_;
+ (*counter_) = (*counter_) + 1;
+
+ reference_ = external.reference_;
+
+ static_assignment_ = external.static_assignment_;
+ }
+
+ return *this;
+}
+
+
+template< class T >
+T& TePDISharedPtr< T >::operator*()
+{
+ if( ! isActive() ) {
+ std::cout << std::endl
+ << "TePDISharedPtr::operator* - Invalid use of inactive instance"
+ << std::endl;
+ throw;
+ }
+
+ return *reference_;
+}
+
+
+template< class T >
+T* TePDISharedPtr< T >::operator->()
+{
+ return reference_;
+}
+
+
+template< class T >
+bool TePDISharedPtr< T >::operator==( const TePDISharedPtr& external )
+{
+ return ( ( reference_ == external.reference_ ) &&
+ ( counter_ == external.counter_ ) ) ? true : false;
+}
+
+
+template< class T >
+bool TePDISharedPtr< T >::operator!=( const TePDISharedPtr& external )
+{
+ return ( ( reference_ != external.reference_ ) ||
+ ( counter_ != external.counter_ ) ) ? true : false;
+}
+
+
+template< class T >
+T* TePDISharedPtr< T >::NakedPointer()
+{
+ return reference_;
+}
+
+
+#endif //TEPDISHAREDPTR_CPP
diff --git a/src/terralib/PDI/source/TePDISharedPtr.hpp b/src/terralib/PDI/source/TePDISharedPtr.hpp
new file mode 100644
index 0000000..f06ca4f
--- /dev/null
+++ b/src/terralib/PDI/source/TePDISharedPtr.hpp
@@ -0,0 +1,142 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ * This file contains the class to deal with automatic dynamic memory
+ * allocation / desallocation.
+ */
+
+#ifndef TEPDISHAREDPTR_HPP
+ #define TEPDISHAREDPTR_HPP
+
+ template< class T >
+ class TePDISharedPtr{
+ public :
+ /**
+ * Default Constructor.
+ *
+ * @param pointer A pointer the the active object.
+ * @param static_assignment A flag indication for a static
+ * assignment (the pointed object will not be destroyed at the
+ * end ).
+ */
+ TePDISharedPtr( T* pointer = 0, bool static_assignment = false );
+
+ /**
+ * Alternative Constructor.
+ *
+ * @param external External object reference.
+ */
+ TePDISharedPtr( const TePDISharedPtr& external );
+
+ /**
+ * Default Destructor
+ */
+ ~TePDISharedPtr();
+
+ /**
+ * Verifies if the current pointer points to an active object.
+ *
+ * @return true if active, false if not.
+ */
+ bool isActive() const;
+
+ /**
+ * Reset the active instance the the new pointer.
+ *
+ * @param pointer A pointer the the active object.
+ * @param static_assignment A flag indication for a static
+ * assignment (the pointed object will not be destroyed at the
+ * end ).
+ */
+ void reset( T* pointer = 0, bool static_assignment = false );
+
+ /**
+ * Operator = overload.
+ *
+ * @param external External instance reference.
+ */
+ TePDISharedPtr< T >& operator=( const TePDISharedPtr< T >& external );
+
+ /**
+ * Operator * overload.
+ *
+ * @return The internal instance reference.
+ */
+ T& operator*();
+
+ /**
+ * Operator -> overload.
+ *
+ * @return The internal instance pointer.
+ */
+ T* operator->();
+
+ /**
+ * Operator == overload.
+ *
+ * @return true if the current pointer and the external pointer
+ * are pointing to the same object.
+ */
+ bool operator==( const TePDISharedPtr& external );
+
+ /**
+ * Operator != overload.
+ *
+ * @return true if the current pointer and the external pointer
+ * are not pointing to the same object.
+ */
+ bool operator!=( const TePDISharedPtr& external );
+
+ /**
+ * A Naked Pointer to the encapsulated object.
+ *
+ * @return The internal instance pointer.
+ */
+ T* NakedPointer();
+
+ protected :
+
+ /**
+ * A pointer to the current number of active users of this pointer.
+ */
+ mutable unsigned long int* counter_;
+
+ /**
+ * A pointer to the current object encapsulated by this
+ * shared pointer.
+ */
+ mutable T* reference_;
+
+ /**
+ * A flag indicating if this shared pointer was created by a
+ * dynamic assignment ( false value ) or by a static
+ * assignment( true value - the encapsulated object will not
+ * be destroyed at the end.
+ */
+ mutable bool static_assignment_;
+ };
+
+
+#endif //TEPDISHAREDPTR_HPP
diff --git a/src/terralib/PDI/source/TePDITypes.hpp b/src/terralib/PDI/source/TePDITypes.hpp
new file mode 100644
index 0000000..ae30194
--- /dev/null
+++ b/src/terralib/PDI/source/TePDITypes.hpp
@@ -0,0 +1,84 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+#ifndef TEPDITYPES_HPP
+ #define TEPDITYPES_HPP
+
+ #include "TePDIRgbPalette.hpp"
+
+ #include "TePDISharedPtr.cpp"
+
+ #include <TeRaster.h>
+
+ #include <map>
+ #include <vector>
+
+
+ /**
+ * This namespace contains the global types used by all PDI classes.
+ */
+ namespace TePDITypes
+ {
+ /**
+ * Histogram alias definition.
+ *
+ * @param double level.
+ * @param int Pixel count.
+ */
+ typedef map< double, int > TePDIHistogramType;
+
+ /**
+ * Histograms vector alias definition.
+ */
+ typedef std::vector< TePDIHistogramType > TePDIHistogramsVectorType;
+
+ /**
+ * Histograms map alias definition.
+ *
+ * @param int Channel ( band ) number;
+ * @param TePDIHistogramType Related histogram.
+ */
+ typedef std::map< int, TePDIHistogramType > TePDIHistogramsMapType;
+
+ /**
+ * Type definition for a simple LUT - Look-Up Table.
+ *
+ * @param double (First) input level.
+ * @param double (Second) output level.
+ */
+ typedef map< double, double > TePDILutType;
+
+ /**
+ * Look-Up Table vector alias definition.
+ */
+ typedef std::vector< TePDILutType > TePDILutsVectorType;
+
+ /**
+ * TeRaster pointer definition.
+ */
+ typedef TePDISharedPtr< TeRaster > TePDIRasterPtrType;
+
+ };
+
+#endif //TEPDITYPES_HPP
diff --git a/src/terralib/PDI/source/TePDIUtils.cpp b/src/terralib/PDI/source/TePDIUtils.cpp
new file mode 100755
index 0000000..70b5822
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIUtils.cpp
@@ -0,0 +1,284 @@
+#include "TePDIUtils.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+#include <TeDecoderMemory.h>
+#include <TeDecoderTIFF.h>
+#include <TeRaster.h>
+#include <TeRasterParams.h>
+
+#include <cmath>
+
+namespace TePDIUtils{
+
+ bool TeGenerateHistogram(
+ TePDITypes::TePDIRasterPtrType& in_raster,
+ unsigned int levels,
+ unsigned int band,
+ TePDITypes::TePDIHistogramType& out_hist,
+ bool force_zero_reference )
+ {
+ int bands_number = in_raster->nBands();
+
+ PDIAGN_TRUE_OR_RETURN( (int)band < bands_number,
+ "Invalid band" );
+
+ out_hist.clear();
+
+ TeRaster::iterator raster_it = in_raster->begin();
+
+ TeRaster::iterator raster_end_it = in_raster->end();
+
+ /* Finding the lowest end highest level */
+
+ double lowest_level = 0;
+ bool lowest_level_enabled = 0;
+ double highest_level = 0;
+ bool highest_level_enabled = 0;
+ double current_raster_level;
+
+ while( raster_it != raster_end_it ) {
+ current_raster_level = raster_it*( band );
+
+ if( lowest_level_enabled ) {
+ if( current_raster_level < lowest_level) {
+ lowest_level = current_raster_level;
+ }
+ } else {
+ lowest_level = current_raster_level;
+ lowest_level_enabled = true;
+ }
+
+ if( highest_level_enabled ) {
+ if( current_raster_level > highest_level) {
+ highest_level = current_raster_level;
+ }
+ } else {
+ highest_level = current_raster_level;
+ highest_level_enabled = true;
+ }
+
+ ++raster_it;
+ }
+
+ if( force_zero_reference ) {
+ if( highest_level > 0 ) {
+ lowest_level = 0;
+ } else {
+ highest_level = 0;
+ }
+ }
+
+ /* Calculating the histogram step */
+
+ double step = 1;
+ unsigned int hist_computed_levels = 1;
+
+ if( levels == 0 ) {
+ /* Auto step feature */
+ PDIAGN_TRUE_OR_RETURN( ( highest_level - lowest_level ) > 1,
+ "Unable to use the Histogram Auto-step feature" );
+
+ hist_computed_levels = 1 +
+ ( unsigned int ) std::floor( highest_level - lowest_level );
+ } else {
+ hist_computed_levels = levels;
+ }
+
+ PDIAGN_TRUE_OR_RETURN( hist_computed_levels > 1,
+ "Invalid levels number" );
+
+ step = ( highest_level - lowest_level ) / (double)hist_computed_levels;
+
+ /* Ordered Histogram pre-allocation */
+
+ for( unsigned int level = 0 ; level < ( hist_computed_levels - 1 ) ;
+ ++level ) {
+
+ out_hist[ ( level * step ) + lowest_level ] = 0;
+ }
+ out_hist[ highest_level ] = 0;
+
+ /* Histogram generation */
+
+ raster_it = in_raster->begin();
+ TePDITypes::TePDIHistogramType::iterator hist_it;
+ TePDITypes::TePDIHistogramType::iterator hist_next_it;
+ TePDITypes::TePDIHistogramType::iterator hist_end_it = out_hist.end();
+
+ while( raster_it != raster_end_it ) {
+ current_raster_level = raster_it*( band );
+
+ /* locating the raster level position relative to histogram levels */
+
+ hist_it = out_hist.begin();
+ hist_next_it = hist_it;
+ ++hist_next_it;
+
+ while( hist_next_it != hist_end_it ) {
+ if( current_raster_level <= hist_next_it->first ) {
+ break;
+ }
+
+ ++hist_it;
+ ++hist_next_it;
+ }
+
+ /* Interpolating level */
+
+ if( hist_next_it == hist_end_it ) {
+ (*hist_it).second = (*hist_it).second + 1;
+ } else {
+ if( std::abs( hist_it->first - current_raster_level ) <
+ std::abs( hist_next_it->first - current_raster_level ) ) {
+
+ (*hist_it).second = (*hist_it).second + 1;
+ } else {
+ (*hist_next_it).second = (*hist_next_it).second + 1;
+ }
+ }
+
+
+ ++raster_it;
+ }
+
+ return true;
+ }
+
+
+ bool TeAllocRAMRaster(
+ TePDITypes::TePDIRasterPtrType& template_raster,
+ TePDITypes::TePDIRasterPtrType& RAMRaster )
+ {
+ PDIAGN_TRUE_OR_RETURN( template_raster.isActive(),
+ "Inactive Input Raster" );
+ PDIAGN_TRUE_OR_RETURN( template_raster->status() != TeNOTREADY,
+ "Input not Ready" );
+
+ if( ! RAMRaster.isActive() ) {
+ RAMRaster.reset( new TeRaster() );
+ }
+
+ TeRasterParams temp_params = template_raster->params();
+ temp_params.mode_ = 'c';
+
+ /* Assigning a RAM decoder */
+ RAMRaster->setDecoder( new TeDecoderMemory( temp_params ) );
+
+ return RAMRaster->init();
+ }
+
+
+ bool TeRaster2Geotiff(
+ TePDITypes::TePDIRasterPtrType& in_raster,
+ const std::string& file_name )
+ {
+ PDIAGN_TRUE_OR_RETURN( in_raster.isActive(),
+ "Inactive Input Raster" );
+ PDIAGN_TRUE_OR_RETURN( in_raster->status() != TeNOTREADY,
+ "Input not Ready" );
+ PDIAGN_TRUE_OR_RETURN( file_name.size() != 0,
+ "Invalid file name" );
+
+ TeRasterParams temp_params = in_raster->params();
+
+ temp_params.mode_ = 'c';
+ temp_params.fileName_ = file_name;
+
+ TePDITypes::TePDIRasterPtrType outRaster( new TeRaster( temp_params ) );
+
+ outRaster->setDecoder( new TeDecoderTIFF( outRaster->params() ) );
+
+ PDIAGN_TRUE_OR_RETURN( outRaster->init(),
+ "Unable to init GeoTIFF Raster" );
+
+ return TeCopyRasterPixels( in_raster, outRaster );
+ }
+
+
+ bool TeCopyRasterPixels(
+ TePDITypes::TePDIRasterPtrType& source_raster,
+ TePDITypes::TePDIRasterPtrType& target_raster )
+ {
+ PDIAGN_TRUE_OR_RETURN( source_raster.isActive(),
+ "Inactive Input Raster" );
+ PDIAGN_TRUE_OR_RETURN( target_raster.isActive(),
+ "Inactive Output Raster" );
+ PDIAGN_TRUE_OR_RETURN( source_raster->status() != TeNOTREADY,
+ "Input not Ready" );
+ PDIAGN_TRUE_OR_RETURN( target_raster->status() == TeREADYTOWRITE,
+ "OutPut not Ready" );
+
+ TeRasterParams& source_params = source_raster->params();
+ TeRasterParams& target_params = target_raster->params();
+
+ PDIAGN_TRUE_OR_RETURN(
+ ( ( source_params.nBands() == target_params.nBands() ) &&
+ ( source_params.nlines_ == target_params.nlines_ ) &&
+ ( source_params.ncols_ == target_params.ncols_ ) ),
+ "Input and Output Raster's have different dimentions" );
+
+ double pixel_value;
+
+ for( int band = 0 ; band < source_params.nBands() ; ++band )
+ for( int line = 0 ; line < source_params.nlines_ ; ++line )
+ for( int column = 0 ; column < source_params.ncols_ ; ++column ) {
+ if( source_raster->getElement( column, line, pixel_value, band ) ) {
+ PDIAGN_TRUE_OR_THROW( target_raster->setElement( column, line,
+ pixel_value, band ), "Pixel copy error" );
+ }
+
+ }
+
+ return true;
+ }
+
+
+ bool TeResetRaster(TePDITypes::TePDIRasterPtrType& raster,
+ unsigned int bands, unsigned int lines, unsigned int columns,
+ TePDIRgbPalette* palette )
+ {
+ PDIAGN_TRUE_OR_RETURN( raster.isActive(),
+ "Inactive Raster" );
+ PDIAGN_TRUE_OR_RETURN( raster->status() == TeREADYTOWRITE,
+ "Raster not ready" );
+
+ TeRasterParams params = raster->params();
+
+ params.nBands( (int) bands );
+
+ params.nlines_ = (int) lines;
+ params.ncols_ = (int) columns;
+ params.mode_ = 'c';
+ params.useDummy_ = false;
+
+ if( palette != 0 ) {
+ params.setPhotometric( TeRASTERPALETTE );
+ params.setNumberPalleteEntries( palette->size() );
+
+ TePDIRgbPalette::iterator pal_it = palette->begin();
+ TePDIRgbPalette::iterator pal_it_end = palette->end();
+
+ for( unsigned int lut_index = 0 ; lut_index < palette->size() ;
+ ++lut_index ) {
+
+ params.lutr_[ lut_index ] = (unsigned short)pal_it.red();
+ params.lutg_[ lut_index ] = (unsigned short)pal_it.green();
+ params.lutb_[ lut_index ] = (unsigned short)pal_it.blue();
+
+ ++pal_it;
+ }
+
+ params.lutr_[ palette->size() ] = 255;
+ params.lutg_[ palette->size() ] = 255;
+ params.lutb_[ palette->size() ] = 255;
+ }
+
+ PDIAGN_TRUE_OR_RETURN( raster->init( params ),
+ "Unable to init raster" );
+
+ return true;
+ }
+
+}
+
diff --git a/src/terralib/PDI/source/TePDIUtils.hpp b/src/terralib/PDI/source/TePDIUtils.hpp
new file mode 100644
index 0000000..1ac499e
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIUtils.hpp
@@ -0,0 +1,132 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ * This file contains utilitary functions.
+ */
+
+#ifndef TEPDIUTILS_HPP
+ #define TEPDIUTILS_HPP
+
+ #include "TePDITypes.hpp"
+
+ #include <TeRaster.h>
+
+ #include <sstream>
+ #include <string>
+ #include <iostream>
+ #include <map>
+
+ namespace TePDIUtils{
+
+ /**
+ * Data convertion to string.
+ *
+ * @param data Data to be converted.
+ * @return The converted string.
+ */
+ template< class T >
+ std::string to_string( const T& data )
+ {
+ std::stringstream temp_ss;
+ temp_ss << data;
+ return temp_ss.str();
+ }
+
+ /**
+ * Generates a discrete level-ordered histogram by interpolation, using
+ * the supplied parameters.
+ *
+ * @param in_raster Input raster.
+ * @param levels The number of interpolated levels, and if set to zero,
+ * the number of levels will be automaticlly found by using
+ * level step aproximation to one.
+ * @param band Band number.
+ * @param out_hist The generated histogram.
+ * @param force_zero_reference If true, the histogram will always
+ * start( or end ) with the zero level.
+ * @return true if the histogram has been generated, false on error.
+ */
+ bool TeGenerateHistogram(
+ TePDITypes::TePDIRasterPtrType& in_raster,
+ unsigned int levels,
+ unsigned int band,
+ TePDITypes::TePDIHistogramType& out_hist,
+ bool force_zero_reference = 0 );
+
+ /**
+ * Allocates one RAM raster using the info of another.
+ *
+ * @param template_raster Input raster.
+ * @param RAMRaster Output raster.
+ * @return true if OK. false on error.
+ */
+ bool TeAllocRAMRaster(
+ TePDITypes::TePDIRasterPtrType& template_raster,
+ TePDITypes::TePDIRasterPtrType& RAMRaster );
+
+ /**
+ * Save the raster to a GeoTIFF file.
+ *
+ * @param in_raster Input raster.
+ * @param file_name Output file name.
+ * @return true if OK. false on error.
+ */
+ bool TeRaster2Geotiff(
+ TePDITypes::TePDIRasterPtrType& in_raster,
+ const std::string& file_name );
+
+ /**
+ * Do pixel by pixel copy from on raster to another ( all bands ).
+ *
+ * @param source_raster Input raster.
+ * @param target_raster Output raster.
+ * @return true if OK. false on error.
+ */
+ bool TeCopyRasterPixels(
+ TePDITypes::TePDIRasterPtrType& source_raster,
+ TePDITypes::TePDIRasterPtrType& target_raster );
+
+ /**
+ * Reset the raster to the new parameters.
+ *
+ * If there are no decoder associated with the raster, a
+ * default MEMORY DECODER will be created.
+ *
+ * @param raster Input raster.
+ * @param bands The new number of bands.
+ * @param lines The new number of lines.
+ * @param columns The new number of columns.
+ * @param palette A palette reference, for generation of a paletted
+ * raster.
+ * @return true if OK. false on error.
+ */
+ bool TeResetRaster(
+ TePDITypes::TePDIRasterPtrType& raster,
+ unsigned int bands, unsigned int lines, unsigned int columns,
+ TePDIRgbPalette* palette = 0 );
+
+ };
+
+#endif //TEPDIUTILS_HPP
diff --git a/src/terralib/PDI/source/projects/.cvsignore b/src/terralib/PDI/source/projects/.cvsignore
new file mode 100644
index 0000000..550bd25
--- /dev/null
+++ b/src/terralib/PDI/source/projects/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+
diff --git a/src/terralib/PDI/source/projects/base/.cvsignore b/src/terralib/PDI/source/projects/base/.cvsignore
new file mode 100644
index 0000000..0236094
--- /dev/null
+++ b/src/terralib/PDI/source/projects/base/.cvsignore
@@ -0,0 +1,4 @@
+*.o
+*.obj
+
+
diff --git a/src/terralib/PDI/source/projects/base/base.pro b/src/terralib/PDI/source/projects/base/base.pro
new file mode 100755
index 0000000..79142f4
--- /dev/null
+++ b/src/terralib/PDI/source/projects/base/base.pro
@@ -0,0 +1,52 @@
+TEMPLATE = lib
+
+CONFIG = warn_on debug create_prl
+
+LANGUAGE = C++
+
+INCLUDEPATH = ../../../../kernel
+INCLUDEPATH += ../../../../functions
+INCLUDEPATH += ../../../../../tiff
+
+HEADERS = \
+ TePDIAgnostic.hpp \
+ TePDISharedPtr.hpp \
+ TePDIUtils.hpp \
+ TePDITypes.hpp \
+ TePDIBox.hpp \
+ TePDIRgbPalette.hpp \
+ TePDIParameters.hpp \
+ TePDIAlgorithm.hpp \
+ TePDIContrast.hpp \
+ TePDIFilter.hpp \
+ TePDIFilterMask.hpp \
+ TePDILinearFilter.hpp
+
+SOURCES = \
+ TePDIAgnostic.cpp \
+ TePDISharedPtr.cpp \
+ TePDIUtils.cpp \
+ TePDIBox.cpp \
+ TePDIRgbPalette.cpp \
+ TePDIParameters.cpp \
+ TePDIAlgorithm.cpp \
+ TePDIContrast.cpp \
+ TePDIFilter.cpp \
+ TePDIFilterMask.cpp \
+ TePDILinearFilter.cpp
+
+
+VPATH = ../..
+
+win32 {
+ INCLUDEPATH += ../../../../../STLport/
+
+ LIBS = ../../../../../../terralibw/terralib/terralib.lib
+ LIBS += ../../../../../../terralibw/tiff/tiff.lib
+}
+
+unix {
+ LIBS = -L../../../../../../terralibx/terralib -lterralib
+ LIBS += -L../../../../../../terralibx/tiff -ltiff
+}
+
diff --git a/src/terralib/PDI/source/projects/dynamic/.cvsignore b/src/terralib/PDI/source/projects/dynamic/.cvsignore
new file mode 100644
index 0000000..f896ca9
--- /dev/null
+++ b/src/terralib/PDI/source/projects/dynamic/.cvsignore
@@ -0,0 +1,4 @@
+Makefile
+*.obj
+*.o
+
diff --git a/src/terralib/PDI/source/projects/dynamic/dynamic.pro b/src/terralib/PDI/source/projects/dynamic/dynamic.pro
new file mode 100644
index 0000000..5b1a8f6
--- /dev/null
+++ b/src/terralib/PDI/source/projects/dynamic/dynamic.pro
@@ -0,0 +1,17 @@
+include( ../base/base.pro )
+
+CONFIG += dll
+
+TARGET = ../../../bin/dynamic/terralibpdi
+
+unix {
+ QMAKE_CLEAN += \
+ ../../../bin/dynamic/*.so.* \
+ ../../../bin/dynamic/*.prl
+}
+
+win32 {
+ QMAKE_CLEAN += \
+ ../../../bin/dynamic/*.lib \
+ ../../../bin/dynamic/*.prl
+}
\ No newline at end of file
diff --git a/src/terralib/PDI/source/projects/projects.pro b/src/terralib/PDI/source/projects/projects.pro
new file mode 100755
index 0000000..ea32871
--- /dev/null
+++ b/src/terralib/PDI/source/projects/projects.pro
@@ -0,0 +1,6 @@
+
+TEMPLATE = subdirs
+
+SUBDIRS = \
+ dynamic
+
diff --git a/src/terralib/PDI/source/projects/static/.cvsignore b/src/terralib/PDI/source/projects/static/.cvsignore
new file mode 100644
index 0000000..f896ca9
--- /dev/null
+++ b/src/terralib/PDI/source/projects/static/.cvsignore
@@ -0,0 +1,4 @@
+Makefile
+*.obj
+*.o
+
diff --git a/src/terralib/PDI/source/projects/static/static.pro b/src/terralib/PDI/source/projects/static/static.pro
new file mode 100644
index 0000000..5146d03
--- /dev/null
+++ b/src/terralib/PDI/source/projects/static/static.pro
@@ -0,0 +1,17 @@
+include( ../base/base.pro )
+
+CONFIG += staticlib
+
+TARGET = ../../../bin/static/terralibpdi
+
+unix {
+ QMAKE_CLEAN += \
+ ../../../bin/static/*.so.* \
+ ../../../bin/static/*.prl
+}
+
+win32 {
+ QMAKE_CLEAN += \
+ ../../../bin/static/*.lib \
+ ../../../bin/static/*.prl
+}
\ No newline at end of file
diff --git a/src/terralib/PDI/source/source.pro b/src/terralib/PDI/source/source.pro
new file mode 100755
index 0000000..3b1affe
--- /dev/null
+++ b/src/terralib/PDI/source/source.pro
@@ -0,0 +1,6 @@
+
+TEMPLATE = subdirs
+
+SUBDIRS = \
+ projects
+
diff --git a/src/terralib/PDI/tests/.cvsignore b/src/terralib/PDI/tests/.cvsignore
new file mode 100644
index 0000000..f3c7a7c
--- /dev/null
+++ b/src/terralib/PDI/tests/.cvsignore
@@ -0,0 +1 @@
+Makefile
diff --git a/src/terralib/PDI/tests/bin/.cvsignore b/src/terralib/PDI/tests/bin/.cvsignore
new file mode 100644
index 0000000..620ec53
--- /dev/null
+++ b/src/terralib/PDI/tests/bin/.cvsignore
@@ -0,0 +1,3 @@
+*.tif
+Te*
+
diff --git a/src/terralib/PDI/tests/resources/.cvsignore b/src/terralib/PDI/tests/resources/.cvsignore
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/terralib/PDI/tests/resources/.cvsignore
@@ -0,0 +1 @@
+
diff --git a/src/terralib/PDI/tests/resources/cbers_b2_crop.tif b/src/terralib/PDI/tests/resources/cbers_b2_crop.tif
new file mode 100755
index 0000000..484acd4
Binary files /dev/null and b/src/terralib/PDI/tests/resources/cbers_b2_crop.tif differ
diff --git a/src/terralib/PDI/tests/source/.cvsignore b/src/terralib/PDI/tests/source/.cvsignore
new file mode 100644
index 0000000..550bd25
--- /dev/null
+++ b/src/terralib/PDI/tests/source/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+
diff --git a/src/terralib/PDI/tests/source/TePDIContrast/.cvsignore b/src/terralib/PDI/tests/source/TePDIContrast/.cvsignore
new file mode 100644
index 0000000..ac63e51
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIContrast/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+*.o
+*.obj
diff --git a/src/terralib/PDI/tests/source/TePDIContrast/TePDIContrast.pro b/src/terralib/PDI/tests/source/TePDIContrast/TePDIContrast.pro
new file mode 100755
index 0000000..d36c036
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIContrast/TePDIContrast.pro
@@ -0,0 +1,7 @@
+include( ../base/base.pro )
+
+SOURCES += \
+ TePDIContrast_test.cpp
+
+QMAKE_CLEAN += \
+ ../../bin/TePDIContrast*
diff --git a/src/terralib/PDI/tests/source/TePDIContrast/TePDIContrast_test.cpp b/src/terralib/PDI/tests/source/TePDIContrast/TePDIContrast_test.cpp
new file mode 100644
index 0000000..96d60db
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIContrast/TePDIContrast_test.cpp
@@ -0,0 +1,346 @@
+#include <TePDIContrast.hpp>
+#include <TePDIParameters.hpp>
+#include <TePDIUtils.hpp>
+#include <TePDIRgbPalette.hpp>
+
+#include <TeRaster.h>
+#include <TeDataTypes.h>
+#include <TeDecoderTIFF.h>
+#include <TeInitRasterDecoders.h>
+
+#include <TePDIAgnostic.hpp>
+
+#include <string>
+
+void TePDIContrastMinMax_test()
+{
+ TePDIParameters params;
+
+ int contrast_type = TePDIContrast::TePDIContrastMinMax;
+ params.SetParameter( "contrast_type", contrast_type );
+
+ TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+ std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+ PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+ params.SetParameter( "input_image", inRaster );
+
+ TePDITypes::TePDIRasterPtrType outRaster;
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+ outRaster ), "RAM Raster Alloc error" );
+ params.SetParameter( "output_image", outRaster );
+
+ std::vector<int> channels;
+ channels.push_back( 0 );
+ params.SetParameter( "channels", channels );
+
+ params.SetParameter( "histo_levels", (int)256 );
+
+ TePDIContrast contra;
+
+ PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+ "Invalid Parameters" );
+
+ PDIAGN_TRUE_OR_THROW( contra.Apply(),
+ "Apply error" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+ "TePDIContrastMinMax_test.tif" ), "GeoTIF generation error" );
+}
+
+
+void TePDIContrastLinear_test()
+{
+ TePDIParameters params;
+
+ int contrast_type = TePDIContrast::TePDIContrastLinear;
+ params.SetParameter( "contrast_type", contrast_type );
+
+ TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+ std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+ PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+ params.SetParameter( "input_image", inRaster );
+
+ TePDITypes::TePDIRasterPtrType outRaster;
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+ outRaster ), "RAM Raster Alloc error" );
+ params.SetParameter( "output_image", outRaster );
+
+ std::vector<int> channels;
+ channels.push_back( 0 );
+ params.SetParameter( "channels", channels );
+
+ params.SetParameter( "histo_levels", (int)256 );
+
+ params.SetParameter( "min_level", (double)46 );
+ params.SetParameter( "max_level", (double)102 );
+
+ TePDIContrast contra;
+
+ PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+ "Invalid Parameters" );
+
+ PDIAGN_TRUE_OR_THROW( contra.Apply(),
+ "Apply error" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+ "TePDIContrastLinear_test.tif" ), "GeoTIF generation error" );
+}
+
+void TePDIContrastSquareRoot_test()
+{
+ TePDIParameters params;
+
+ int contrast_type = TePDIContrast::TePDIContrastSquareRoot;
+ params.SetParameter( "contrast_type", contrast_type );
+
+ TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+ std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+ PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+ params.SetParameter( "input_image", inRaster );
+
+ TePDITypes::TePDIRasterPtrType outRaster;
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+ outRaster ), "RAM Raster Alloc error" );
+ params.SetParameter( "output_image", outRaster );
+
+ std::vector<int> channels;
+ channels.push_back( 0 );
+ params.SetParameter( "channels", channels );
+
+ params.SetParameter( "histo_levels", (int)256 );
+
+ params.SetParameter( "min_level", (double)46 );
+ params.SetParameter( "max_level", (double)102 );
+
+ TePDIContrast contra;
+
+ PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+ "Invalid Parameters" );
+
+ PDIAGN_TRUE_OR_THROW( contra.Apply(),
+ "Apply error" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+ "TePDIContrastSquareRoot_test.tif" ), "GeoTIF generation error" );
+}
+
+void TePDIContrastSquare_test()
+{
+ TePDIParameters params;
+
+ int contrast_type = TePDIContrast::TePDIContrastSquare;
+ params.SetParameter( "contrast_type", contrast_type );
+
+ TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+ std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+ PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+ params.SetParameter( "input_image", inRaster );
+
+ TePDITypes::TePDIRasterPtrType outRaster;
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+ outRaster ), "RAM Raster Alloc error" );
+ params.SetParameter( "output_image", outRaster );
+
+ std::vector<int> channels;
+ channels.push_back( 0 );
+ params.SetParameter( "channels", channels );
+
+ params.SetParameter( "histo_levels", (int)256 );
+
+ params.SetParameter( "min_level", (double)46 );
+ params.SetParameter( "max_level", (double)102 );
+
+ TePDIContrast contra;
+
+ PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+ "Invalid Parameters" );
+
+ PDIAGN_TRUE_OR_THROW( contra.Apply(),
+ "Apply error" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+ "TePDIContrastSquare_test.tif" ), "GeoTIF generation error" );
+}
+
+void TePDIContrastLog_test()
+{
+ TePDIParameters params;
+
+ int contrast_type = TePDIContrast::TePDIContrastLog;
+ params.SetParameter( "contrast_type", contrast_type );
+
+ TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+ std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+ PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+ params.SetParameter( "input_image", inRaster );
+
+ TePDITypes::TePDIRasterPtrType outRaster;
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+ outRaster ), "RAM Raster Alloc error" );
+ params.SetParameter( "output_image", outRaster );
+
+ std::vector<int> channels;
+ channels.push_back( 0 );
+ params.SetParameter( "channels", channels );
+
+ params.SetParameter( "histo_levels", (int)256 );
+
+ params.SetParameter( "min_level", (double)46 );
+ params.SetParameter( "max_level", (double)102 );
+
+ TePDIContrast contra;
+
+ PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+ "Invalid Parameters" );
+
+ PDIAGN_TRUE_OR_THROW( contra.Apply(),
+ "Apply error" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+ "TePDIContrastLog_test.tif" ), "GeoTIF generation error" );
+}
+
+void TePDIContrastNegative_test()
+{
+ TePDIParameters params;
+
+ int contrast_type = TePDIContrast::TePDIContrastNegative;
+ params.SetParameter( "contrast_type", contrast_type );
+
+ TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+ std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+ PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+ params.SetParameter( "input_image", inRaster );
+
+ TePDITypes::TePDIRasterPtrType outRaster;
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+ outRaster ), "RAM Raster Alloc error" );
+ params.SetParameter( "output_image", outRaster );
+
+ std::vector<int> channels;
+ channels.push_back( 0 );
+ params.SetParameter( "channels", channels );
+
+ params.SetParameter( "histo_levels", (int)256 );
+
+ params.SetParameter( "min_level", (double)46 );
+ params.SetParameter( "max_level", (double)102 );
+
+ TePDIContrast contra;
+
+ PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+ "Invalid Parameters" );
+
+ PDIAGN_TRUE_OR_THROW( contra.Apply(),
+ "Apply error" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+ "TePDIContrastNegative_test.tif" ), "GeoTIF generation error" );
+}
+
+void TePDIContrastHistEqualizer_test()
+{
+ TePDIParameters params;
+
+ int contrast_type = TePDIContrast::TePDIContrastHistEqualizer;
+ params.SetParameter( "contrast_type", contrast_type );
+
+ TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+ std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+ PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+ params.SetParameter( "input_image", inRaster );
+
+ TePDITypes::TePDIRasterPtrType outRaster;
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+ outRaster ), "RAM Raster Alloc error" );
+ params.SetParameter( "output_image", outRaster );
+
+ std::vector<int> channels;
+ channels.push_back( 0 );
+ params.SetParameter( "channels", channels );
+
+ params.SetParameter( "histo_levels", (int)256 );
+
+ params.SetParameter( "min_level", (double)46 );
+ params.SetParameter( "max_level", (double)102 );
+
+ TePDIContrast contra;
+
+ PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+ "Invalid Parameters" );
+
+ PDIAGN_TRUE_OR_THROW( contra.Apply(),
+ "Apply error" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+ "TePDIContrastHistEqualizer_test.tif" ), "GeoTIF generation error" );
+}
+
+void TePDIContrastSimpleSlicer_test()
+{
+ TePDIParameters params;
+
+ int contrast_type = TePDIContrast::TePDIContrastSimpleSlicer;
+ params.SetParameter( "contrast_type", contrast_type );
+
+ TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+ std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+ PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+ params.SetParameter( "input_image", inRaster );
+
+ TePDITypes::TePDIRasterPtrType outRaster;
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+ outRaster ), "RAM Raster Alloc error" );
+ params.SetParameter( "output_image", outRaster );
+
+ std::vector<int> channels;
+ channels.push_back( 0 );
+ params.SetParameter( "channels", channels );
+
+ params.SetParameter( "histo_levels", (int)( 102 - 47 + 1 ) );
+
+ params.SetParameter( "min_level", (double)47 );
+ params.SetParameter( "max_level", (double)102 );
+
+ TePDIRgbPalette::pointer pal =
+ TePDIRgbPalette::createLB( 20 );
+ params.SetParameter( "rgb_palette", pal );
+
+ TePDIContrast contra;
+
+ PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+ "Invalid Parameters" );
+
+ PDIAGN_TRUE_OR_THROW( contra.Apply(),
+ "Apply error" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+ "TePDIContrastSimpleSlicer_test.tif" ), "GeoTIF generation error" );
+}
+
+int main()
+{
+ PDIAGN_LOGMSG( "Test started." );
+
+ PDIAGN_DEBUG_MODE_CHECK;
+
+ try{
+ TeInitRasterDecoders();
+
+ TePDIContrastMinMax_test();
+ TePDIContrastLinear_test();
+ TePDIContrastSquareRoot_test();
+ TePDIContrastSquare_test();
+ TePDIContrastLog_test();
+ TePDIContrastNegative_test();
+ TePDIContrastHistEqualizer_test();
+ TePDIContrastSimpleSlicer_test();
+ }
+ catch(...){
+ PDIAGN_LOGERR( "Test Failed.");
+ return EXIT_FAILURE;
+ }
+
+ PDIAGN_LOGMSG( "Test OK." );
+ return EXIT_SUCCESS;
+}
diff --git a/src/terralib/PDI/tests/source/TePDIParameters/.cvsignore b/src/terralib/PDI/tests/source/TePDIParameters/.cvsignore
new file mode 100644
index 0000000..ac63e51
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIParameters/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+*.o
+*.obj
diff --git a/src/terralib/PDI/tests/source/TePDIParameters/TePDIParameters.pro b/src/terralib/PDI/tests/source/TePDIParameters/TePDIParameters.pro
new file mode 100755
index 0000000..6295733
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIParameters/TePDIParameters.pro
@@ -0,0 +1,6 @@
+include( ../base/base.pro )
+
+SOURCES += TePDIParameters_test.cpp
+
+QMAKE_CLEAN += \
+ ../../bin/TePDIParameters
diff --git a/src/terralib/PDI/tests/source/TePDIParameters/TePDIParameters_test.cpp b/src/terralib/PDI/tests/source/TePDIParameters/TePDIParameters_test.cpp
new file mode 100644
index 0000000..bb5eba1
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIParameters/TePDIParameters_test.cpp
@@ -0,0 +1,103 @@
+#include <TePDIParameters.hpp>
+
+#include <TePDIAgnostic.hpp>
+
+#include <TeRaster.h>
+
+#include <stdlib.h>
+#include <iostream>
+
+int main()
+{
+ PDIAGN_LOGMSG( "Test started." );
+
+ PDIAGN_DEBUG_MODE_CHECK;
+
+ try{
+ /* Integer type test */
+
+ TePDIParameters tparam;
+
+ tparam.SetParameter( std::string("param_name_1"), (int)1 );
+ tparam.SetParameter( std::string("param_name_2"), (int)2 );
+
+ PDIAGN_TRUE_OR_THROW( tparam.CheckParameter( "param_name_1",
+ TePDIParameters::TePDIIntParam ),
+ "Parameter checking error for param_name_1" );
+
+ PDIAGN_TRUE_OR_THROW( tparam.CheckParameter( "param_name_2",
+ TePDIParameters::TePDIIntParam ),
+ "Parameter checking error for param_name_2" );
+
+ PDIAGN_TRUE_OR_THROW( false == tparam.CheckParameter(
+ "param_name_unknown", TePDIParameters::TePDIIntParam ),
+ "Unknown Parameter checking error" );
+
+ int temp_v1 = 0;
+ int temp_v2 = 0;
+
+ PDIAGN_TRUE_OR_THROW( tparam.GetParameter( "param_name_1", temp_v1 ),
+ "Invalid param_name_1 GET" );
+
+ PDIAGN_TRUE_OR_THROW( temp_v1 == 1,
+ "param_name_1 value checking" );
+
+ PDIAGN_TRUE_OR_THROW( tparam.GetParameter( "param_name_2", temp_v2 ),
+ "Invalid param_name_2 GET" );
+
+ PDIAGN_TRUE_OR_THROW( temp_v2 == 2,
+ "param_name_2 value checking" );
+
+ /* Vector type test */
+
+ std::vector< int > temp_vector_1;
+ temp_vector_1.push_back( 1 );
+
+ tparam.SetParameter( "temp_vector_1", temp_vector_1 );
+
+ std::vector< int > temp_vector_2;
+
+ PDIAGN_TRUE_OR_THROW(
+ tparam.GetParameter( "temp_vector_1", temp_vector_2 ),
+ "Invalid temp_vector_1 GET" );
+
+ PDIAGN_TRUE_OR_THROW( temp_vector_2.size() != 0,
+ "Invalid temp_vector_2.size()" );
+
+ /* Raster type test */
+
+ TePDISharedPtr < TeRaster > rast1( new TeRaster( 0, 0, 0, TeDOUBLE ) );
+
+ tparam.SetParameter( "rast1", rast1 );
+
+ TePDISharedPtr < TeRaster > rast2( new TeRaster( 0, 0, 0, TeDOUBLE ) );
+
+ PDIAGN_TRUE_OR_THROW(
+ tparam.GetParameter( "rast1", rast2 ),
+ "Invalid rast1 GET" );
+
+ /* Copy operator test */
+
+ TePDIParameters tparam2;
+
+ tparam2 = tparam;
+
+ PDIAGN_TRUE_OR_THROW( tparam2.GetParameter( "param_name_1", temp_v1 ),
+ "Invalid param_name_1 GET" );
+
+ PDIAGN_TRUE_OR_THROW(
+ tparam2.GetParameter( "temp_vector_1", temp_vector_2 ),
+ "Invalid temp_vector_1 GET" );
+
+ PDIAGN_TRUE_OR_THROW(
+ tparam2.GetParameter( "rast1", rast2 ),
+ "Invalid rast1 GET" );
+ }
+ catch(...){
+ PDIAGN_LOGERR( "Test Failed.");
+ return EXIT_FAILURE;
+ }
+
+ PDIAGN_LOGMSG( "Test OK." );
+ return EXIT_SUCCESS;
+}
diff --git a/src/terralib/PDI/tests/source/TePDISharedPtr/.cvsignore b/src/terralib/PDI/tests/source/TePDISharedPtr/.cvsignore
new file mode 100644
index 0000000..ac63e51
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDISharedPtr/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+*.o
+*.obj
diff --git a/src/terralib/PDI/tests/source/TePDISharedPtr/TePDISharedPtr.pro b/src/terralib/PDI/tests/source/TePDISharedPtr/TePDISharedPtr.pro
new file mode 100755
index 0000000..3d079de
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDISharedPtr/TePDISharedPtr.pro
@@ -0,0 +1,7 @@
+include( ../base/base.pro )
+
+SOURCES += \
+ TePDISharedPtr_test.cpp
+
+QMAKE_CLEAN += \
+ ../../bin/TePDISharedPtr
diff --git a/src/terralib/PDI/tests/source/TePDISharedPtr/TePDISharedPtr_test.cpp b/src/terralib/PDI/tests/source/TePDISharedPtr/TePDISharedPtr_test.cpp
new file mode 100644
index 0000000..bc33663
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDISharedPtr/TePDISharedPtr_test.cpp
@@ -0,0 +1,65 @@
+
+#include <TePDIAgnostic.hpp>
+
+#include <TePDISharedPtr.cpp>
+
+#include <string>
+
+int main()
+{
+ PDIAGN_LOGMSG( "Test started." );
+
+ PDIAGN_DEBUG_MODE_CHECK;
+
+ try{
+ TePDISharedPtr< int > sptr1( new int );
+
+ *sptr1 = 12345;
+
+ TePDISharedPtr< int > sptr2;
+
+ sptr2 = sptr1;
+
+ *sptr2 = 54321;
+
+ PDIAGN_TRUE_OR_THROW( *sptr2 == 54321,
+ "Invalid pointer 2 reference" );
+
+ PDIAGN_TRUE_OR_THROW( *sptr1 == 54321,
+ "Invalid pointer 1 reference" );
+
+ sptr1.reset( new int );
+
+ *sptr1 = 6789;
+
+ PDIAGN_TRUE_OR_THROW( *sptr1 == 6789,
+ "Invalid pointer 1 reference" );
+
+ PDIAGN_TRUE_OR_THROW( *sptr2 == 54321,
+ "Invalid pointer 2 reference" );
+
+ TePDISharedPtr< int > sptr3( sptr2 );
+
+ PDIAGN_TRUE_OR_THROW( *sptr3 == 54321,
+ "Invalid pointer 2 reference" );
+
+ /* Static shared pointer test */
+
+ int temp_int = 54321;
+ int* temp_int_ptr = &temp_int;
+
+ if( true ) {
+ TePDISharedPtr< int > sptr4( temp_int_ptr, true );
+ }
+
+ PDIAGN_TRUE_OR_THROW( *temp_int_ptr == 54321,
+ "Invalid naked pointer reference" );
+ }
+ catch(...){
+ PDIAGN_LOGERR( "Test Failed.");
+ return EXIT_FAILURE;
+ }
+
+ PDIAGN_LOGMSG( "Test OK." );
+ return EXIT_SUCCESS;
+}
diff --git a/src/terralib/PDI/tests/source/TePDIUtils/.cvsignore b/src/terralib/PDI/tests/source/TePDIUtils/.cvsignore
new file mode 100644
index 0000000..ac63e51
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIUtils/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+*.o
+*.obj
diff --git a/src/terralib/PDI/tests/source/TePDIUtils/TePDIUtils.pro b/src/terralib/PDI/tests/source/TePDIUtils/TePDIUtils.pro
new file mode 100755
index 0000000..8e41e21
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIUtils/TePDIUtils.pro
@@ -0,0 +1,10 @@
+include( ../base/base.pro )
+
+SOURCES += TePDIUtils_test.cpp
+
+QMAKE_CLEAN += \
+ ../../bin/TePDIUtils \
+ ../../bin/TeRaster2Geotiff_test.tif \
+ ../../bin/TeAllocRAMRaster_test.tif \
+ ../../bin/TeResetRaster_test.tif
+
diff --git a/src/terralib/PDI/tests/source/TePDIUtils/TePDIUtils_test.cpp b/src/terralib/PDI/tests/source/TePDIUtils/TePDIUtils_test.cpp
new file mode 100644
index 0000000..56a421d
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIUtils/TePDIUtils_test.cpp
@@ -0,0 +1,119 @@
+#include <TePDIUtils.hpp>
+
+//#include <TeRaster.h>
+//#include <TeDataTypes.h>
+//#include <TeDecoderTIFF.h>
+#include <TeInitRasterDecoders.h>
+
+#include <TePDIAgnostic.hpp>
+
+#include <string>
+
+void TeGenerateHistogram_test()
+{
+ TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+ std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+
+ PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+
+ TePDITypes::TePDIHistogramType out_hist;
+
+ PDIAGN_TRUE_OR_THROW(
+ TePDIUtils::TeGenerateHistogram(inRaster, 0, 0, out_hist, true ),
+ "Histogram generation error" );
+
+ PDIAGN_CHECK_EQUAL( out_hist.size(), 256,
+ "Invalid Generated histogram" );
+
+ int pixels = 0;
+
+ TePDITypes::TePDIHistogramType::iterator hist_it = out_hist.begin();
+ TePDITypes::TePDIHistogramType::iterator hist_it_end = out_hist.end();
+
+ while( hist_it != hist_it_end ) {
+ pixels += hist_it->second;
+
+ ++hist_it;
+ }
+
+ PDIAGN_CHECK_EQUAL( pixels, inRaster->params().nlines_ *
+ inRaster->params().ncols_, "Invalid Generated historgram" );
+
+}
+
+void TeRaster2Geotiff_test()
+{
+ TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+ std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+
+ PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( inRaster,
+ "TeRaster2Geotiff_test.tif" ), "GeoTIF generation error" );
+}
+
+void TeAllocRAMRaster_test()
+{
+ TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+ std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+
+ PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+
+ TePDITypes::TePDIRasterPtrType RAMRaster;
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster, RAMRaster ),
+ "RAM Raster Allocation error" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeCopyRasterPixels( inRaster, RAMRaster ),
+ "Raster pixel copy error" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( RAMRaster,
+ "TeAllocRAMRaster_test.tif" ), "GeoTIF generation error" );
+}
+
+void TeResetRaster_test()
+{
+ TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+ std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+
+ PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+
+ TePDITypes::TePDIRasterPtrType outRaster(
+ new TeRaster( inRaster->params().ncols_, inRaster->params().nlines_,
+ inRaster->nBands(), TeUNSIGNEDCHAR ) );
+ PDIAGN_TRUE_OR_THROW( outRaster->init(), "Unable to init outRaster" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeResetRaster( outRaster,
+ inRaster->nBands(), inRaster->params().nlines_,
+ inRaster->params().ncols_ ), "Raster reset error" );
+
+ PDIAGN_TRUE_OR_THROW(
+ TePDIUtils::TeCopyRasterPixels( inRaster, outRaster ),
+ "Raster pixel copy error" );
+
+ PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+ "TeResetRaster_test.tif" ), "GeoTIF generation error" );
+}
+
+int main()
+{
+ PDIAGN_LOGMSG( "Test started." );
+
+ PDIAGN_DEBUG_MODE_CHECK;
+
+ try{
+ TeInitRasterDecoders();
+
+ TeGenerateHistogram_test();
+ TeRaster2Geotiff_test();
+ TeAllocRAMRaster_test();
+ TeResetRaster_test();
+ }
+ catch(...){
+ PDIAGN_LOGERR( "Test Failed.");
+ return EXIT_FAILURE;
+ }
+
+ PDIAGN_LOGMSG( "Test OK." );
+ return EXIT_SUCCESS;
+}
diff --git a/src/terralib/PDI/tests/source/base/.cvsignore b/src/terralib/PDI/tests/source/base/.cvsignore
new file mode 100644
index 0000000..139597f
--- /dev/null
+++ b/src/terralib/PDI/tests/source/base/.cvsignore
@@ -0,0 +1,2 @@
+
+
diff --git a/src/terralib/PDI/tests/source/base/base.pro b/src/terralib/PDI/tests/source/base/base.pro
new file mode 100755
index 0000000..8b1ca8e
--- /dev/null
+++ b/src/terralib/PDI/tests/source/base/base.pro
@@ -0,0 +1,27 @@
+
+INCLUDEPATH = ../../../source
+INCLUDEPATH += ../../../../kernel
+INCLUDEPATH += ../../../../../tiff
+
+CONFIG = warn_on debug link_prl
+
+LANGUAGE = C++
+
+DESTDIR = ../../bin
+
+win32 {
+ TEMPLATE = vcapp
+
+ LIBS = ../../../bin/static/terralibpdi.lib
+}
+
+unix {
+ TEMPLATE = app
+
+ LIBS = -L../../../bin/dynamic -lterralibpdi
+}
+
+
+
+
+
diff --git a/src/terralib/PDI/tests/source/source.pro b/src/terralib/PDI/tests/source/source.pro
new file mode 100755
index 0000000..70d5dd9
--- /dev/null
+++ b/src/terralib/PDI/tests/source/source.pro
@@ -0,0 +1,10 @@
+
+TEMPLATE = subdirs
+
+SUBDIRS = \
+ TePDIParameters \
+ TePDIUtils \
+ TePDISharedPtr \
+ TePDIContrast
+
+
diff --git a/src/terralib/PDI/tests/tests.pro b/src/terralib/PDI/tests/tests.pro
new file mode 100755
index 0000000..0635acc
--- /dev/null
+++ b/src/terralib/PDI/tests/tests.pro
@@ -0,0 +1,7 @@
+
+TEMPLATE = subdirs
+
+SUBDIRS = \
+ source
+
+
diff --git a/src/terralib/application/TeApplicationUtils.cpp b/src/terralib/application/TeApplicationUtils.cpp
new file mode 100644
index 0000000..94c7e02
--- /dev/null
+++ b/src/terralib/application/TeApplicationUtils.cpp
@@ -0,0 +1,409 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include "TeApplicationUtils.h"
+#include "TeSlice.h"
+#include "TeDatabase.h"
+#include "TeDatabaseUtils.h"
+#include "TeColorUtils.h"
+
+template<class iterator> extern void
+TeGroupByEqualStep(iterator, iterator, int , vector<TeSlice>& , int);
+
+extern void TeGroupByUniqueValue(vector<string>& vec, TeAttrDataType tipo, vector<TeSlice>& result, int precision);
+
+bool generateCountLegends(TeThemeApplication* theme, string table, string field)
+{
+ if(theme == 0)
+ return false;
+
+ theme->groupObjects(TeAll);
+ TeAttributeRep rep;
+ rep.name_ = table + "." + field;
+ rep.type_ = TeINT;
+
+ TeGrouping* group = new TeGrouping();
+ group->groupAttribute_ = rep;
+ group->groupNormAttribute_ = "";
+ group->groupMode_ = TeUniqueValue;
+ group->groupPrecision_ = 0;
+ theme->grouping(group);
+
+ string scor = "Cy-G-Y-Or-R";
+ theme->groupColor(scor);
+ theme->countObj(true);
+ theme->mixColor(true);
+ theme->groupColorDir(TeColorAscSatEnd);
+
+ string fieldId = theme->collectionTable() + ".c_object_id";
+ TeLayer* layer = theme->layer();
+ TeDatabase* db = layer->database();
+ vector<TeSlice> result;
+ vector<string> valVec;
+ vector<string> idVec;
+
+ string sel = "SELECT " + fieldId + ", " + field + theme->sqlFrom() + " ORDER BY " + field;
+
+ TeDatabasePortal* portal = db->getPortal();
+ if(portal->query(sel) == false)
+ {
+ delete portal;
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ string objectId = portal->getData(0);
+ string val = portal->getData(1);
+ if (val.empty() == false)
+ {
+ valVec.push_back(val);
+ idVec.push_back(objectId);
+ }
+ }
+ delete portal;
+
+ if(valVec.size()==0)
+ return false;
+
+ TeGroupByUniqueValue(valVec, TeINT, result, 0);
+ theme->grouping()->groupNumSlices_ = result.size();
+
+ vector<string> colorRamps;
+ colorRamps.push_back("CYAN");
+ colorRamps.push_back("GREEN");
+ colorRamps.push_back("YELLOW");
+ colorRamps.push_back("ORANGE");
+ colorRamps.push_back("RED");
+ vector<TeColor> colorVec;
+ getColors(colorRamps,10, colorVec);
+
+ TeVisual visual;
+ if((layer->geomRep() & TePOLYGONS) || (layer->geomRep() & TeCELLS))
+ visual = theme->defaultLegend().visual(TePOLYGONS);
+ else if((layer->geomRep() & TeLINES))
+ visual = theme->defaultLegend().visual(TeLINES);
+ else if((layer->geomRep() & TePOINTS))
+ visual = theme->defaultLegend().visual(TePOINTS);
+
+ TeLegendEntryVector legVec;
+ unsigned int i, j = 0;
+ for(i = 0; i < result.size(); i++)
+ {
+ TeColor cor = colorVec[i];
+ visual.color(cor);
+
+ TeLegendEntry leg;
+ leg.from(result[i].from_);
+ leg.to(result[i].to_);
+ if((layer->geomRep() & TePOLYGONS) || (layer->geomRep() & TeCELLS))
+ leg.setVisual(visual, TePOLYGONS);
+ else if((layer->geomRep() & TeLINES))
+ leg.setVisual(visual, TeLINES);
+ else if((layer->geomRep() & TePOINTS))
+ leg.setVisual(visual, TePOINTS);
+
+ int count = 0;
+ while(j < valVec.size())
+ {
+ if(valVec[j] == leg.from())
+ {
+ count++;
+ j++;
+ }
+ else
+ break;
+ }
+ leg.count(count);
+ leg.group(i);
+ leg.theme(theme->id());
+ string label = leg.from();
+ leg.label(label);
+ legVec.push_back(leg);
+ }
+
+ colorRamps.clear();
+ colorVec.clear();
+
+ db->deleteLegend(theme->id());
+ map<int, vector<string> > legMap;
+ for(i=j=0; i<legVec.size(); i++)
+ {
+ theme->legend().push_back(legVec[i]);
+ if (db->insertLegend(&(theme->legend()[i])) == false)
+ return false;
+
+ vector<string> ids;
+ TeLegendEntry& leg = theme->legend()[i];
+ while(j < valVec.size())
+ {
+ if(valVec[j] == leg.from())
+ {
+ ids.push_back(idVec[j]);
+ j++;
+ }
+ else
+ break;
+ }
+ legMap[leg.id()] = ids;
+ }
+
+ map<int, vector<string> > :: iterator it = legMap.begin();
+ while(it != legMap.end())
+ {
+ vector<string>::iterator itB = it->second.begin();
+ vector<string>::iterator itE = it->second.end();
+ vector<string> svec = generateInClauses(itB,itE,db);
+
+ for(i=0; i<svec.size(); i++)
+ {
+ string up = "UPDATE " + theme->collectionTable() + " SET c_legend_id = " + Te2String(it->first);
+ up += " WHERE c_object_id IN " + svec[i];
+
+ if(db->execute(up) == false)
+ return false;
+ }
+ it++;
+ }
+
+ if(theme->legend().size())
+ theme->visibleRep(theme->visibleRep() | 0x40000000);
+ else
+ theme->visibleRep(theme->visibleRep() & 0xbfffffff);
+
+ if((db->updateGrouping (theme->id(), theme->grouping())) == false)
+ return false;
+
+ return(updateThemeApplication(db, theme));
+}
+
+void changeObjectStatus(ObjectInfo& info, string& uniqueId, string mode, int pointed)
+{
+ if(uniqueId.empty())
+ {
+ if(mode == "pointing")
+ info.status_ ^= 0x1; // toggle least significant bit
+ else if(mode == "shiftAndPointing")
+ {
+ if(pointed == 1)
+ info.status_ |= 0x1; // set least significant bit
+ else
+ info.status_ &= 0x2; // reset least significant bit
+ }
+ return;
+ }
+
+ int& gs = info.uniqueMap_[uniqueId];
+ int os;
+
+ if(mode == "pointing")
+ {
+ gs ^= 0x1; // toggle least significant bit
+
+ set<int> statusSet;
+ map<string, int>::iterator it = info.uniqueMap_.begin();
+ while(it != info.uniqueMap_.end())
+ {
+ statusSet.insert(it->second);
+ it++;
+ }
+ if(statusSet.find(3) != statusSet.end())
+ os = 3;
+ else if(statusSet.find(2) != statusSet.end() && statusSet.find(1) != statusSet.end())
+ os = 3;
+ else if(statusSet.find(2) != statusSet.end() && statusSet.find(1) == statusSet.end())
+ os = 2;
+ else if(statusSet.find(2) == statusSet.end() && statusSet.find(1) != statusSet.end())
+ os = 1;
+ else
+ os = 0;
+ }
+ else if(mode == "shiftAndPointing")
+ {
+ if(pointed == 1)
+ gs |= 0x1; // set least significant bit
+ else
+ gs &= 0x2; // reset least significant bit
+
+ set<int> statusSet;
+ map<string, int>::iterator it = info.uniqueMap_.begin();
+ while(it != info.uniqueMap_.end())
+ {
+ statusSet.insert(it->second);
+ it++;
+ }
+ if(statusSet.find(3) != statusSet.end())
+ os = 3;
+ else if(statusSet.find(2) != statusSet.end() && statusSet.find(1) != statusSet.end())
+ os = 3;
+ else if(statusSet.find(2) != statusSet.end() && statusSet.find(1) == statusSet.end())
+ os = 2;
+ else if(statusSet.find(2) == statusSet.end() && statusSet.find(1) != statusSet.end())
+ os = 1;
+ else
+ os = 0;
+ }
+
+ info.status_ = os;
+}
+
+bool saveObjectStatus(TeThemeApplication *theme, set<string>& objectSet, map<string, ObjectInfo>& objectMap)
+{
+ unsigned int i;
+ int os, gs;
+ string q, oid, uid;
+ TeDatabase *db = theme->layer()->database();
+ map<int, vector<string> > sameObjectStMap;
+ map<int, vector<string> > sameGridStMap;
+
+ set<string>::iterator setIt = objectSet.begin();
+ while(setIt != objectSet.end())
+ {
+ oid = *setIt;
+ ObjectInfo& info = objectMap[oid];
+ os = info.status_;
+ sameObjectStMap[os].push_back(oid);
+
+ map<string, int>& gridMap = info.uniqueMap_;
+ map<string, int>::iterator gridIt = gridMap.begin();
+ while(gridIt != gridMap.end())
+ {
+ uid = gridIt->first;
+ gs = gridIt->second;
+ sameGridStMap[gs].push_back(uid);
+ gridIt++;
+ }
+ setIt++;
+ }
+
+ string qUpdate = "UPDATE " + theme->collectionTable();
+ map<int, vector<string> >::iterator it;
+ for (it = sameObjectStMap.begin(); it != sameObjectStMap.end(); ++it)
+ {
+ vector<string>::iterator itB = it->second.begin();
+ vector<string>::iterator itE = it->second.end();
+ vector<string> inClauseVector = generateInClauses(itB,itE,db);
+ for (i = 0; i < inClauseVector.size(); ++i)
+ {
+ q = qUpdate + " SET c_object_status = " + Te2String(it->first);
+ q += " WHERE c_object_id IN " + inClauseVector[i];
+
+ if (db->execute(q) == false)
+ return false;
+ }
+ }
+
+
+ qUpdate = "UPDATE " + theme->collectionAuxTable();
+ for (it = sameGridStMap.begin(); it != sameGridStMap.end(); ++it)
+ {
+ vector<string>::iterator itB = it->second.begin();
+ vector<string>::iterator itE = it->second.end();
+ vector<string> inClauseVector = generateInClauses(itB,itE,db);
+ for (i = 0; i < inClauseVector.size(); ++i)
+ {
+ q = qUpdate + " SET grid_status = " + Te2String(it->first);
+ q += " WHERE unique_id IN " + inClauseVector[i];
+
+ if (db->execute(q) == false)
+ return false;
+ }
+ }
+ return true;
+}
+
+string getStringFromStatistic(TeStatisticType sType)
+{
+ string ss;
+
+ if(sType == TeSUM)
+ ss = "SUM";
+ else if(sType == TeMAXVALUE)
+ ss = "MAXVALUE";
+ else if(sType == TeMINVALUE)
+ ss = "MINVALUE";
+ else if(sType == TeCOUNT)
+ ss = "COUNT";
+ else if(sType == TeVALIDCOUNT)
+ ss = "VALIDCOUNT";
+ else if(sType == TeSTANDARDDEVIATION)
+ ss = "STANDARDDEVIATION";
+ else if(sType == TeKERNEL)
+ ss = "KERNEL";
+ else if(sType == TeMEAN)
+ ss = "MEAN";
+ else if(sType == TeVARIANCE)
+ ss = "VARIANCE";
+ else if(sType == TeSKEWNESS)
+ ss = "SKEWNESS";
+ else if(sType == TeKURTOSIS)
+ ss = "KURTOSIS";
+ else if(sType == TeAMPLITUDE)
+ ss = "AMPLITUDE";
+ else if(sType == TeMEDIAN)
+ ss = "MEDIAN";
+ else if(sType == TeVARCOEFF)
+ ss = "VARCOEFF";
+ else if(sType == TeMODE)
+ ss = "MODE";
+
+ return ss;
+}
+
+TeStatisticType getStatisticFromString(const string& s)
+{
+ TeStatisticType sType;
+
+ if(s == "TeSUM")
+ sType = TeSUM;
+ else if(s == "TeMAXVALUE")
+ sType = TeMAXVALUE;
+ else if(s == "TeMINVALUE")
+ sType = TeMINVALUE;
+ else if(s == "TeCOUNT")
+ sType = TeCOUNT;
+ else if(s == "TeVALIDCOUNT")
+ sType = TeVALIDCOUNT;
+ else if(s == "TeSTANDARDDEVIATION")
+ sType = TeSTANDARDDEVIATION;
+ else if(s == "TeKERNEL")
+ sType = TeKERNEL;
+ else if(s == "TeMEAN")
+ sType = TeMEAN;
+ else if(s == "TeVARIANCE")
+ sType = TeVARIANCE;
+ else if(s == "TeSKEWNESS")
+ sType = TeSKEWNESS;
+ else if(s == "TeKURTOSIS")
+ sType = TeKURTOSIS;
+ else if(s == "TeAMPLITUDE")
+ sType = TeAMPLITUDE;
+ else if(s == "TeMEDIAN")
+ sType = TeMEDIAN;
+ else if(s == "TeVARCOEFF")
+ sType = TeVARCOEFF;
+ else if(s == "TeMODE")
+ sType = TeMODE;
+
+ return sType;
+}
+
+
diff --git a/src/terralib/application/TeApplicationUtils.h b/src/terralib/application/TeApplicationUtils.h
new file mode 100644
index 0000000..2df0412
--- /dev/null
+++ b/src/terralib/application/TeApplicationUtils.h
@@ -0,0 +1,102 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeApplicationUtils.h
+ This contains some utilitary functions to deal with TerraLib databases
+*/
+#ifndef __TERRALIB_INTERNAL_APPLICATIONUTILS_H
+#define __TERRALIB_INTERNAL_APPLICATIONUTILS_H
+
+#include "TeThemeApplication.h"
+#include "TeVisual.h"
+#include "TeDatabase.h"
+
+#include <string>
+#include <vector>
+#include <set>
+using namespace std;
+
+struct ObjectInfo
+{
+ int status_; // collection: c_object_status
+ map<string, int> uniqueMap_; // uniqueId to grid status (collection: grid_status)
+};
+
+//! Breaks a collection of strings into a series of IN clauses to be used in query expressions
+/*
+ \params begin Iterator that p oints to the beginning of the collection
+ \params end Iterator that points to the end of the collection
+ \param db pointer to the database where the query expression will be applied
+ \param addPlicae flat to indicate that the character ' should enclose each string
+*/
+template <typename Iterator>
+vector<string>
+generateInClauses(Iterator& begin, Iterator& end, TeDatabase* db, bool addPlicae=true)
+{
+ int i, chunkSize = 200;
+ string inClause;
+ vector<string> inClauseVector;
+
+ Iterator temp = begin;
+ i = 0;
+ while (temp != end)
+ {
+ if (i%chunkSize == 0)
+ {
+ if (!inClause.empty())
+ {
+ inClause[inClause.size() - 1] = ')';
+ inClauseVector.push_back(inClause);
+ inClause.clear();
+ }
+ inClause = "(";
+ }
+
+ if (addPlicae)
+ inClause += "'" + db->escapeSequence(*temp) + "',";
+ else
+ inClause += db->escapeSequence(*temp) + ",";
+ i++;
+ ++temp;
+ }
+ if (!inClause.empty())
+ {
+ inClause[inClause.size() - 1] = ')';
+ inClauseVector.push_back(inClause);
+ }
+ return inClauseVector;
+}
+
+//! generate Count legends
+bool generateCountLegends(TeThemeApplication* theme, string table, string field);
+
+void changeObjectStatus(ObjectInfo& info, string& uniqueId, string mode, int pointed = 1);
+
+bool saveObjectStatus(TeThemeApplication *theme, set<string>& objectSet, map<string, ObjectInfo>& objectMap);
+
+string getStringFromStatistic (TeStatisticType st);
+
+TeStatisticType getStatisticFromString(const string& s);
+
+#endif
+
+
diff --git a/src/terralib/application/TeColorUtils.cpp b/src/terralib/application/TeColorUtils.cpp
new file mode 100644
index 0000000..e688c14
--- /dev/null
+++ b/src/terralib/application/TeColorUtils.cpp
@@ -0,0 +1,198 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#include "TeColorUtils.h"
+
+bool getColors(TeDatabase* db, vector<string>& ramps, int nc, bool asc, vector<TeColor> &colors)
+{
+ if (!db)
+ return false;
+
+ TeDatabasePortal* portal = db->getPortal();
+ if (!portal)
+ return false;
+
+ if (ramps.empty())
+ ramps.push_back("RED");
+
+ vector<TeColor> allColors;
+
+ unsigned int i;
+ for (i=0; i<ramps.size(); i++)
+ {
+ string query = "SELECT red, green, blue FROM te_color_scheme";
+ if (asc)
+ query = query + " WHERE ramp_name = '" + ramps[i] + "' ORDER BY color_order ASC";
+ else
+ query = query + " WHERE ramp_name = '" + ramps[i] + "' ORDER BY color_order DESC";
+
+ TeColor color;
+ if (portal->query(query))
+ {
+ while(portal->fetchRow())
+ {
+ color.name_ = ramps[i];
+ color.red_ = portal->getInt(0);
+ color.green_ = portal->getInt(1);
+ color.blue_ = portal->getInt(2);
+ allColors.push_back(color);
+ }
+ }
+ portal->freeResult();
+ }
+ delete portal;
+
+ double step = 0.;
+ if (nc > 1)
+ step = (double)(allColors.size()) / (double)(nc-1);
+ for (int j=0; j<nc; j++)
+ {
+ int ind = (int)(step * (double)j + .5);
+ if(ind > (int)(allColors.size() - 1))
+ ind = allColors.size() - 1;
+ colors.push_back(allColors[ind]);
+ }
+ allColors.clear();
+ return true;
+}
+
+bool getColors(vector<string>& ramps, int nc, vector<TeColor> &colors)
+{
+ if (ramps.empty())
+ ramps.push_back("RED");
+
+ TeColor RGB;
+ map<string, TeColor> mapcor;
+
+ RGB.name_ = "RED";
+ RGB.red_ = 240;
+ RGB.green_ = 0;
+ RGB.blue_ = 0;
+ mapcor["RED"] = RGB;
+
+ RGB.name_ = "GREEN";
+ RGB.red_ = 0;
+ RGB.green_ = 240;
+ RGB.blue_ = 0;
+ mapcor["GREEN"] = RGB;
+
+ RGB.name_ = "BLUE";
+ RGB.red_ = 0;
+ RGB.green_ = 0;
+ RGB.blue_ = 240;
+ mapcor["BLUE"] = RGB;
+
+ RGB.name_ = "YELLOW";
+ RGB.red_ = 255;
+ RGB.green_ = 255;
+ RGB.blue_ = 100;
+ mapcor["YELLOW"] = RGB;
+
+ RGB.name_ = "CYAN";
+ RGB.red_ = 100;
+ RGB.green_ = 255;
+ RGB.blue_ = 255;
+ mapcor["CYAN"] = RGB;
+
+ RGB.name_ = "MAGENTA";
+ RGB.red_ = 255;
+ RGB.green_ = 100;
+ RGB.blue_ = 255;
+ mapcor["MAGENTA"] = RGB;
+
+ RGB.name_ = "ORANGE";
+ RGB.red_ = 255;
+ RGB.green_ = 140;
+ RGB.blue_ = 0;
+ mapcor["ORANGE"] = RGB;
+
+ RGB.name_ = "GRAY";
+ RGB.red_ = 240;
+ RGB.green_ = 240;
+ RGB.blue_ = 240;
+ mapcor["GRAY"] = RGB;
+
+ RGB.name_ = "BLACK";
+ RGB.red_ = 0;
+ RGB.green_ = 0;
+ RGB.blue_ = 0;
+ mapcor["BLACK"] = RGB;
+
+ int ii, jj;
+ int n = 200;
+
+ TeColor cfrom = mapcor[ramps[0]];
+ TeColor cto, cor;
+
+ vector<TeColor> allColors;
+ if (ramps.size() == 1)
+ {
+ cto.red_ = cfrom.red_ / 5;
+ cto.green_ = cfrom.green_ / 5;
+ cto.blue_ = cfrom.blue_ / 5;
+ double dr = (double)(cto.red_ - cfrom.red_) / (double)n;
+ double dg = (double)(cto.green_ - cfrom.green_) / (double)n;
+ double db = (double)(cto.blue_ - cfrom.blue_) / (double)n;
+
+ for(jj=0; jj<n; jj++)
+ {
+ cor.red_ = cfrom.red_ + (int)(dr * (double)jj);
+ cor.green_ = cfrom.green_ + (int)(dg * (double)jj);
+ cor.blue_ = cfrom.blue_ + (int)(db * (double)jj);
+ allColors.push_back(cor);
+ }
+ }
+ else
+ {
+ ii = 1;
+ while(ii < (int)ramps.size())
+ {
+ cto = mapcor[ramps[ii]];
+
+ double dr = (double)(cto.red_ - cfrom.red_) / (double)n;
+ double dg = (double)(cto.green_ - cfrom.green_) / (double)n;
+ double db = (double)(cto.blue_ - cfrom.blue_) / (double)n;
+
+ for(jj=0; jj<n; jj++)
+ {
+ cor.red_ = cfrom.red_ + (int)(dr * (double)jj);
+ cor.green_ = cfrom.green_ + (int)(dg * (double)jj);
+ cor.blue_ = cfrom.blue_ + (int)(db * (double)jj);
+ allColors.push_back(cor);
+ }
+ cfrom = cto;
+ ii++;
+ }
+ }
+ double step = 0.;
+ if (nc > 1)
+ step = (double)(allColors.size()) / (double)(nc-1);
+ for (int i=0; i<nc; i++)
+ {
+ int ind = (int)(step * (double)i + .5);
+ if (ind > (int)(allColors.size() - 1))
+ ind = allColors.size() - 1;
+ colors.push_back(allColors[ind]);
+ }
+ allColors.clear();
+ return true;
+}
diff --git a/src/terralib/application/TeColorUtils.h b/src/terralib/application/TeColorUtils.h
new file mode 100644
index 0000000..f52483d
--- /dev/null
+++ b/src/terralib/application/TeColorUtils.h
@@ -0,0 +1,58 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#ifndef __TERRALIB_INTERNAL_COLORUTILS_H
+#define __TERRALIB_INTERNAL_COLORUTILS_H
+
+#include "TeVisual.h"
+#include "TeDatabase.h"
+
+#include <vector>
+#include <string>
+
+//! Generates a graduated color scale following a set of color ramps, based on a color scheme table stored in a TerraLib database
+/*!
+ \param db pointer do a TerraLib database
+ \param ramps vector with the sequence color ramps used to build the scale
+ \param nc desired number of colors on the scale
+ \param asc flag to indicate that within each ramp goes from light to dark colors
+ \param colors resulting color scale
+ \returns true if color scale was successfully generated and false otherwise
+*/
+bool getColors(TeDatabase* db, vector<string>& ramps, int nc, bool asc, vector<TeColor> &colors);
+
+
+//! Generates a graduated color scale following a set of color ramps
+/*!
+ \param ramps vector with the sequence color ramps used to build the scale
+ \param nc desired number of colors on the scale
+ \param colors resulting color scale
+ \returns true if color scale was successfully generated and false otherwise
+ \note the available ramps are "RED", "GREEN", "BLUE", "YELLOW", "CYAN", "MAGENTA", "GRAY" and "BLACK"
+*/
+bool getColors(vector<string>& ramps, int nc, vector<TeColor> &colors);
+
+#endif
+
+
+
+
diff --git a/src/terralib/application/TeDatabaseUtils.cpp b/src/terralib/application/TeDatabaseUtils.cpp
new file mode 100644
index 0000000..17ddd8f
--- /dev/null
+++ b/src/terralib/application/TeDatabaseUtils.cpp
@@ -0,0 +1,3269 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include "TeDatabaseUtils.h"
+#include "TeApplicationUtils.h"
+#include "TeDatabase.h"
+#include "TeTable.h"
+#include "TeKernelParams.h"
+#include "TeLayerFunctions.h"
+#include "TeErrorLog.h"
+#include "TeStatistics.h"
+
+#include <algorithm>
+
+using std::string;
+
+bool createColorSchemeTable(TeDatabase* db, const string& tname)
+{
+ string table;
+
+ if (!db)
+ return false;
+ if (tname.empty())
+ table = "te_color_scheme";
+ else
+ table = tname;
+
+ TeAttributeList attList;
+
+ TeAttribute at1;
+ at1.rep_.type_ = TeSTRING;
+ at1.rep_.numChar_ = 50;
+ at1.rep_.name_ = "ramp_name";
+ at1.rep_.isPrimaryKey_ = true;
+ attList.push_back(at1);
+
+ TeAttribute at2;
+ at2.rep_.type_ = TeINT;
+ at2.rep_.name_ = "color_order";
+ at2.rep_.isPrimaryKey_ = true;
+ attList.push_back(at2);
+
+ TeAttribute at3;
+ at3.rep_.type_ = TeINT;
+ at3.rep_.name_ = "red";
+ attList.push_back(at3);
+
+
+ TeAttribute at4;
+ at4.rep_.type_ = TeINT;
+ at4.rep_.name_ = "green";
+ attList.push_back(at4);
+
+ TeAttribute at5;
+ at5.rep_.type_ = TeINT;
+ at5.rep_.name_ = "blue";
+ attList.push_back(at5);
+
+ bool status = db->createTable(table,attList);
+ attList.clear();
+ return status;
+}
+
+bool createChartParamsTable(TeDatabase* db, bool integrity)
+{
+ if (!db)
+ return false;
+
+ string table = "te_chart_params";
+
+ TeAttributeList attList;
+
+ TeAttribute at5;
+ at5.rep_.type_ = TeINT;
+ at5.rep_.name_ = "theme_id";
+ at5.rep_.isPrimaryKey_ = true;
+ attList.push_back(at5);
+
+ TeAttribute at1;
+ at1.rep_.type_ = TeSTRING;
+ at1.rep_.numChar_ = 50;
+ at1.rep_.name_ = "attr_name";
+ at1.rep_.isPrimaryKey_ = true;
+ attList.push_back(at1);
+
+ TeAttribute at2;
+ at2.rep_.type_ = TeINT;
+ at2.rep_.name_ = "red";
+ attList.push_back(at2);
+
+ TeAttribute at3;
+ at3.rep_.type_ = TeINT;
+ at3.rep_.name_ = "blue";
+ attList.push_back(at3);
+
+ TeAttribute at4;
+ at4.rep_.type_ = TeINT;
+ at4.rep_.name_ = "green";
+ attList.push_back(at4);
+
+ bool status = db->createTable(table,attList);
+ attList.clear();
+
+ if(status && integrity)
+ {
+ if(db->tableExist ("te_theme_application"))
+ {
+ if (!db->createRelation("fk_chartpar_theme_id", "te_chart_params", "theme_id", "te_theme_application", "theme_id", true))
+ return false;
+ }
+ else
+ return false;
+ }
+ return status;
+}
+
+
+bool createThemeApplicationTable(TeDatabase* db, bool integrity)
+{
+ if (!db)
+ return false;
+
+ string table = "te_theme_application";
+
+ TeAttributeList attList;
+
+ TeAttribute at1;
+ at1.rep_.type_ = TeINT;
+ at1.rep_.name_ = "theme_id";
+ at1.rep_.isPrimaryKey_ = true;
+ attList.push_back(at1);
+
+ TeAttribute at2;
+ at2.rep_.type_ = TeINT;
+ at2.rep_.name_ = "visible_out_coll";
+ attList.push_back(at2);
+
+ TeAttribute at3;
+ at3.rep_.type_ = TeINT;
+ at3.rep_.name_ = "visible_without_conn";
+ attList.push_back(at3);
+
+ TeAttribute at31;
+ at31.rep_.type_ = TeSTRING;
+ at31.rep_.numChar_ = 255;
+ at31.rep_.name_ = "refine_attribute_where";
+ attList.push_back(at31);
+
+ TeAttribute at32;
+ at32.rep_.type_ = TeSTRING;
+ at32.rep_.numChar_ = 255;
+ at32.rep_.name_ = "refine_spatial_where";
+ attList.push_back(at32);
+
+ TeAttribute at33;
+ at33.rep_.type_ = TeSTRING;
+ at33.rep_.numChar_ = 255;
+ at33.rep_.name_ = "refine_temporal_where";
+ attList.push_back(at33);
+
+ TeAttribute at4;
+ at4.rep_.type_ = TeSTRING;
+ at4.rep_.numChar_ = 50;
+ at4.rep_.name_ = "grouping_color";
+ attList.push_back(at4);
+
+ TeAttribute at5;
+ at5.rep_.type_ = TeINT;
+ at5.rep_.name_ = "grouping_color_direction";
+ attList.push_back(at5);
+
+ TeAttribute at6;
+ at6.rep_.type_ = TeINT;
+ at6.rep_.name_ = "grouping_objects";
+ attList.push_back(at6);
+
+ TeAttribute at7;
+ at7.rep_.type_ = TeREAL;
+ at7.rep_.name_ = "pie_diameter";
+ attList.push_back(at7);
+
+ TeAttribute at8;
+ at8.rep_.type_ = TeREAL;
+ at8.rep_.name_ = "pie_max_diameter";
+ attList.push_back(at8);
+
+ TeAttribute at9;
+ at9.rep_.type_ = TeREAL;
+ at9.rep_.name_ = "pie_min_diameter";
+ attList.push_back(at9);
+
+ TeAttribute at10;
+ at10.rep_.type_ = TeSTRING;
+ at10.rep_.numChar_ = 255;
+ at10.rep_.name_ = "pie_dimension_attr";
+ attList.push_back(at10);
+
+ TeAttribute at11;
+ at11.rep_.type_ = TeREAL;
+ at11.rep_.name_ = "bar_max_height";
+ attList.push_back(at11);
+
+ TeAttribute at12;
+ at12.rep_.type_ = TeREAL;
+ at12.rep_.name_ = "bar_min_height";
+ attList.push_back(at12);
+
+ TeAttribute at13;
+ at13.rep_.type_ = TeREAL;
+ at13.rep_.name_ = "bar_width";
+ attList.push_back(at13);
+
+ TeAttribute at14;
+ at14.rep_.type_ = TeREAL;
+ at14.rep_.name_ = "chart_max_value";
+ attList.push_back(at14);
+
+ TeAttribute at15;
+ at15.rep_.type_ = TeREAL;
+ at15.rep_.name_ = "chart_min_value";
+ attList.push_back(at15);
+
+ TeAttribute at16;
+ at16.rep_.type_ = TeINT;
+ at16.rep_.name_ = "chart_type";
+ attList.push_back(at16);
+
+ TeAttribute at17;
+ at17.rep_.type_ = TeINT;
+ at17.rep_.name_ = "chart_objects";
+ attList.push_back(at17);
+
+ TeAttribute at18;
+ at18.rep_.type_ = TeINT;
+ at18.rep_.name_ = "keep_dimension";
+ attList.push_back(at18);
+
+ TeAttribute at19;
+ at19.rep_.type_ = TeINT;
+ at19.rep_.name_ = "show_canvas_leg";
+ attList.push_back(at19);
+
+ TeAttribute at20;
+ at20.rep_.type_ = TeREAL;
+ at20.rep_.name_ = "canvas_leg_x";
+ attList.push_back(at20);
+
+ TeAttribute at21;
+ at21.rep_.type_ = TeREAL;
+ at21.rep_.name_ = "canvas_leg_y";
+ attList.push_back(at21);
+
+ TeAttribute at22;
+ at22.rep_.type_ = TeINT;
+ at22.rep_.name_ = "mix_color";
+ attList.push_back(at22);
+
+ TeAttribute at23;
+ at23.rep_.type_ = TeINT;
+ at23.rep_.name_ = "count_obj";
+ attList.push_back(at23);
+
+ TeAttribute at24;
+ at24.rep_.type_ = TeSTRING;
+ at24.rep_.name_ = "text_table";
+ at24.rep_.numChar_ = 50;
+ attList.push_back(at24);
+
+ TeAttribute at26;
+ at26.rep_.type_ = TeSTRING;
+ at26.rep_.name_ = "chart_function";
+ at26.rep_.numChar_ = 10;
+ attList.push_back(at26);
+
+ bool status = db->createTable(table,attList);
+ attList.clear();
+
+ if(status && integrity)
+ {
+ if (!db->createRelation("fk_themeAppl_theme_id", "te_theme_application", "theme_id", "te_theme", "theme_id", true))
+ return false;
+ }
+ return status;
+}
+
+
+bool populateThemeApplicationTable(TeDatabase* db)
+{
+ string sel, ins;
+
+ if(db->dbmsName()=="MySQL") //MySQL doesn�t support NOT EXISTS
+ {
+ sel = " SELECT theme_id FROM te_theme ";
+ }
+ else
+ {
+ ins = " INSERT INTO te_theme_application (theme_id) ";
+ ins += " SELECT t.theme_id FROM te_theme t ";
+ ins += " WHERE NOT EXISTS ";
+ ins += " ( SELECT ta.theme_id FROM ";
+ ins += " te_theme_application ta ";
+ ins += " WHERE ta.theme_id = t.theme_id ) ";
+
+ return (db->execute(ins));
+ }
+
+ TeDatabasePortal* portal = db->getPortal();
+ if(!portal)
+ return false;
+
+ if(!portal->query(sel))
+ {
+ delete portal;
+ return false;
+ }
+
+ if(!portal->fetchRow())
+ {
+ delete portal;
+ return true;
+ }
+
+ do
+ {
+ ins = " INSERT INTO te_theme_application (theme_id) VALUES (";
+ ins += string(portal->getData(0));
+ ins += " )";
+
+ db->execute(ins);
+
+ } while(portal->fetchRow());
+
+ delete portal;
+ return true;
+}
+
+
+bool createMediaTable(TeDatabase* db, const string& tname)
+{
+ if (!db)
+ return false;
+
+ TeAttributeList attList;
+
+ TeAttribute at1;
+ at1.rep_.type_ = TeSTRING;
+ at1.rep_.numChar_ = 255;
+ at1.rep_.name_ = "media_name";
+ at1.rep_.isPrimaryKey_ = true;
+ attList.push_back(at1);
+
+ TeAttribute at2;
+ at2.rep_.type_ = TeSTRING;
+ at2.rep_.numChar_ = 50;
+ at2.rep_.name_ = "media_type";
+ attList.push_back(at2);
+
+ TeAttribute at3;
+ at3.rep_.type_ = TeSTRING;
+ at3.rep_.numChar_ = 255;
+ at3.rep_.name_ = "description";
+ attList.push_back(at3);
+
+ TeAttribute at4;
+ at4.rep_.type_ = TeBLOB;
+ at4.rep_.name_ = "media_blob";
+ attList.push_back(at4);
+
+ TeAttribute at5;
+ at5.rep_.type_ = TeSTRING;
+ at5.rep_.numChar_ = 255;
+ at5.rep_.name_ = "media_path";
+ attList.push_back(at5);
+
+ vector<string> pkeys;
+ pkeys.push_back("media_name");
+
+ bool status = db->createTable(tname,attList);
+ attList.clear();
+ return status;
+}
+
+
+bool createLayerMediaTable(TeDatabase* db, int layerId, const string& tname)
+{
+ if (!db)
+ return false;
+
+ TeAttributeList attList;
+
+ TeAttribute at1;
+ at1.rep_.type_ = TeSTRING;
+ at1.rep_.numChar_ = 50;
+ at1.rep_.name_ = "object_id";
+ at1.rep_.isPrimaryKey_ = true;
+ attList.push_back(at1);
+
+ TeAttribute at3;
+ at3.rep_.type_ = TeSTRING;
+ at3.rep_.numChar_ = 255;
+ at3.rep_.name_ = "media_name";
+ at3.rep_.isPrimaryKey_ = true;
+ attList.push_back(at3);
+
+ TeAttribute at2;
+ at2.rep_.type_ = TeSTRING;
+ at2.rep_.numChar_ = 50;
+ at2.rep_.name_ = "media_table";
+ at2.rep_.isPrimaryKey_ = true;
+ attList.push_back(at2);
+
+ TeAttribute at4;
+ at4.rep_.type_ = TeINT;
+ at4.rep_.name_ = "show_default";
+ attList.push_back(at4);
+
+ if(!db->createTable(tname,attList))
+ {
+ attList.clear();
+ return false;
+ }
+
+ //insert in te_layer_table
+ TeTable table(tname, attList,"object_id", "object_id", TeAttrMedia);
+
+ bool status = db->insertTableInfo(layerId, table);
+ db->layerMap()[layerId]->addAttributeTable (table);
+
+ attList.clear();
+ return status;
+}
+
+bool createKernelMetadataTable(TeDatabase* db)
+{
+ if (!db)
+ return false;
+
+ TeAttributeList attList;
+
+ TeAttribute at1;
+ at1.rep_.type_ = TeINT;
+ at1.rep_.name_ = "kernel_id";
+ at1.rep_.isPrimaryKey_ = true;
+ at1.rep_.isAutoNumber_ = true;
+ attList.push_back(at1);
+
+ TeAttribute at2;
+ at2.rep_.type_ = TeINT;
+ at2.rep_.name_ = "event_theme_id_1";
+ attList.push_back(at2);
+
+ TeAttribute at3;
+ at3.rep_.type_ = TeSTRING;
+ at3.rep_.numChar_ = 255;
+ at3.rep_.name_ = "intensity_attr_name_1";
+ attList.push_back(at3);
+
+ TeAttribute at4;
+ at4.rep_.type_ = TeSTRING;
+ at4.rep_.numChar_ = 255;
+ at4.rep_.name_ = "intensity_attr_table_1";
+ attList.push_back(at4);
+
+ TeAttribute at5;
+ at5.rep_.type_ = TeINT;
+ at5.rep_.name_ = "kernel_function_1";
+ attList.push_back(at5);
+
+ TeAttribute at6;
+ at6.rep_.type_ = TeINT;
+ at6.rep_.name_ = "compute_type_1";
+ attList.push_back(at6);
+
+ TeAttribute at7;
+ at7.rep_.type_ = TeREAL;
+ at7.rep_.name_ = "radius_value_1";
+ attList.push_back(at7);
+
+ TeAttribute at8;
+ at8.rep_.type_ = TeINT;
+ at8.rep_.name_ = "combination_type";
+ attList.push_back(at8);
+
+ TeAttribute at9;
+ at9.rep_.type_ = TeINT;
+ at9.rep_.name_ = "event_theme_id_2";
+ attList.push_back(at9);
+
+ TeAttribute at10;
+ at10.rep_.type_ = TeSTRING;
+ at10.rep_.numChar_ = 255;
+ at10.rep_.name_ = "intensity_attr_name_2";
+ attList.push_back(at10);
+
+ TeAttribute at11;
+ at11.rep_.type_ = TeSTRING;
+ at11.rep_.numChar_ = 255;
+ at11.rep_.name_ = "intensity_attr_table_2";
+ attList.push_back(at11);
+
+ TeAttribute at12;
+ at12.rep_.type_ = TeINT;
+ at12.rep_.name_ = "kernel_function_2";
+ attList.push_back(at12);
+
+ TeAttribute at13;
+ at13.rep_.type_ = TeINT;
+ at13.rep_.name_ = "compute_type_2";
+ attList.push_back(at13);
+
+ TeAttribute at14;
+ at14.rep_.type_ = TeREAL;
+ at14.rep_.name_ = "radius_value_2";
+ attList.push_back(at14);
+
+ TeAttribute at15;
+ at15.rep_.type_ = TeINT;
+ at15.rep_.name_ = "support_theme_id";
+ attList.push_back(at15);
+
+ TeAttribute at17;
+ at17.rep_.type_ = TeSTRING;
+ at17.rep_.numChar_ = 255;
+ at17.rep_.name_ = "support_theme_table";
+ attList.push_back(at17);
+
+ TeAttribute at18;
+ at18.rep_.type_ = TeSTRING;
+ at18.rep_.numChar_ = 255;
+ at18.rep_.name_ = "support_theme_attr";
+ attList.push_back(at18);
+
+ TeAttribute at19;
+ at19.rep_.type_ = TeINT;
+ at19.rep_.name_ = "generated_layer_id";
+ attList.push_back(at19);
+
+ if(!db->createTable("te_kernel_metadata",attList))
+ {
+ attList.clear();
+ return false;
+ }
+
+ db->createIndex("te_kernel_metadata", "kernel_meta_ind1", "support_theme_id, support_theme_table, support_theme_attr");
+ db->createIndex("te_kernel_metadata", "kernel_meta_ind2", "generated_layer_id");
+
+ return true;
+}
+
+
+bool insertMedia(TeDatabase* bd, const string& tableName, string fileName, const string& description, const string& type, bool blob)
+{
+ string ins;
+ if(blob)
+ {
+ if(bd->dbmsName()!="OracleSpatial")
+ {
+ ins = " INSERT INTO "+ tableName +" (media_name, media_type, description) ";
+ ins += " VALUES (";
+ ins += "'"+ fileName + "'";
+ ins += ", '"+ type +"'";
+ ins += ", '"+ description +"'";
+ ins += ")";
+ }
+ else
+ {
+ ins = " INSERT INTO "+ tableName +" (media_name, media_type, description, media_blob) ";
+ ins += " VALUES (";
+ ins += "'"+ fileName + "'";
+ ins += ", '"+ type +"'";
+ ins += ", '"+ description +"'";
+ ins += ", EMPTY_BLOB()";
+ ins += " )";
+ }
+ }
+ else
+ {
+ ins = " INSERT INTO "+ tableName +" (media_name, media_type, description, media_path) ";
+ ins += " VALUES (";
+ ins += "'"+ fileName + "'";
+ ins += ", '"+ type +"'";
+ ins += ", '"+ description +"'";
+ ins += ", '"+ fileName +"'";
+ ins += ")";
+ }
+
+ if(!bd->execute (ins))
+ return false;
+
+ //insert blob
+ TeAttributeRep rep;
+ rep.name_ = "media_name";
+ rep.type_ = TeSTRING;
+
+ if(blob)
+ {
+ if(!bd->insertBlob (tableName, "media_blob", rep, fileName, fileName))
+ return false;
+ }
+
+ return true;
+}
+
+bool insertMediaObjLayer (TeDatabase* db, TeLayer* layer, const string& objectId, const string& mediaName, const string& mediaTable)
+{
+ string table = layer->mediaTable();
+ int show = 0;
+
+ string ins = " INSERT INTO "+ table +" (object_id, media_name, media_table, show_default) ";
+ ins += " VALUES (";
+ ins += "'"+ objectId + "'";
+ ins += ", '"+ mediaName +"'";
+ ins += ", '"+ mediaTable +"'";
+ ins += ", "+ Te2String(show);
+ ins += ")";
+
+ if(!db->execute (ins))
+ return false;
+
+ return true;
+}
+
+bool insertKernelMetadata(TeDatabase* db, TeKernelParams& kernelPar)
+{
+ string ins = " INSERT INTO te_kernel_metadata (event_theme_id_1, intensity_attr_name_1, ";
+ ins += " intensity_attr_table_1, kernel_function_1, compute_type_1, radius_value_1, ";
+ ins += " combination_type, event_theme_id_2, intensity_attr_name_2, intensity_attr_table_2, ";
+ ins += " kernel_function_2, compute_type_2, radius_value_2, support_theme_id, ";
+ ins += " support_theme_table, support_theme_attr, generated_layer_id)";
+ ins += " VALUES ( ";
+ ins += Te2String(kernelPar.eventThemeId1_) + ",";
+ ins += "'"+ kernelPar.intensityAttrName1_ + "',";
+ ins += "'"+ kernelPar.intensityAttrTable1_ + "',";
+ ins += Te2String((int)kernelPar.kernelFunction1_) + ",";
+ ins += Te2String((int)kernelPar.computeType1_) + ",";
+ ins += Te2String(kernelPar.radiusValue1_) + ",";
+ ins += Te2String((int)kernelPar.combinationType_) + ",";
+ ins += Te2String(kernelPar.eventThemeId2_) + ",";
+ ins += "'"+ kernelPar.intensityAttrName2_ + "',";
+ ins += "'"+ kernelPar.intensityAttrTable2_ + "',";
+ ins += Te2String((int)kernelPar.kernelFunction2_) + ",";
+ ins += Te2String((int)kernelPar.computeType2_) + ",";
+ ins += Te2String(kernelPar.radiusValue2_) + ",";
+ ins += Te2String(kernelPar.supportThemeId_)+ ",";
+ ins += "'"+ kernelPar.supportThemeTable_+ "',";
+ ins += "'"+ kernelPar.supportThemeAttr_+ "',";
+ ins += Te2String(kernelPar.generatedLayerId_);
+ ins += ")";
+
+ if(!db->execute (ins))
+ return false;
+
+ return true;
+}
+
+
+bool updateKernelMetadata(TeDatabase* db, TeKernelParams& kernelPar)
+{
+ string del = "DELETE FROM te_kernel_metadata WHERE support_theme_id = ";
+ del += Te2String(kernelPar.supportThemeId_);
+
+ if (!db->execute(del))
+ {
+ return false;
+ }
+
+ return insertKernelMetadata(db,kernelPar);
+}
+
+bool setDefaultMedia(TeDatabase* db, TeLayer* layer, const string& objectId, const string& mediaName, const string& mediaTable)
+{
+ string table = layer->mediaTable();
+
+ string up = "UPDATE " + table + " SET show_default = 0 WHERE ";
+ up += "object_id = '" + objectId + "'";
+ if(!db->execute(up))
+ return false;
+
+ up = "UPDATE "+ table +" SET ";
+ up += " show_default = 1 ";
+ up += " WHERE object_id = '"+ objectId +"'";
+ up += " AND media_name = '"+ mediaName +"'";
+ up += " AND media_table = '"+ mediaTable +"'";
+
+ if(!db->execute (up))
+ return false;
+
+ return true;
+}
+
+
+bool updateMediaDescription(TeDatabase* db, const string& mediaName, const string& mediaTable, const string& desc)
+{
+ string up = "UPDATE " + mediaTable + " SET description = '" + desc.c_str() + "'";
+ up += " WHERE media_name = '" + mediaName + "'";
+ if(!db->execute(up))
+ return false;
+ return true;
+}
+
+
+bool populateColorSchemeTable(TeDatabase* db, const string& tname)
+{
+ string table;
+
+ if (!db)
+ return false;
+ if (tname.empty())
+ table = "te_color_scheme";
+ else
+ table = tname;
+ if (!db->tableExist(table))
+ createColorSchemeTable(db,table);
+
+ string ins = "INSERT INTO " + table + " (ramp_name, color_order, red, green, blue)";
+ string insert;
+ insert = ins + " VALUES ('RED', 1, 255, 225, 225)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED', 2, 255, 195, 195)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED', 3, 255, 165, 165)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED', 4, 255, 135, 135)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED', 5, 255, 112, 112)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED', 6, 255, 66, 66)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED', 7, 255, 0, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED', 8, 225, 1, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED', 9, 200, 1, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED', 10, 175, 1, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED', 11, 150, 1, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED', 12, 125, 0, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED', 13, 100, 0, 0)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('GREEN', 1, 231, 255, 231)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN', 2, 206, 255, 206)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN', 3, 176, 255, 176)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN', 4, 136, 255, 135)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN', 5, 92, 255, 91)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN', 6, 47, 255, 46)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN', 7, 0, 255, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN', 8, 3, 225, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN', 9, 2, 195, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN', 10, 2, 170, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN', 11, 2, 140, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN', 12, 1, 115, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN', 13, 1, 85, 0)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('BLUE', 1, 225, 226, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE', 2, 195, 196, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE', 3, 165, 167, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE', 4, 135, 137, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE', 5, 112, 114, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE', 6, 76, 79, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE', 7, 41, 44, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE', 8, 0, 0, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE', 9, 1, 4, 239)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE', 10, 1, 4, 210)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE', 11, 1, 4, 185)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE', 12, 1, 3, 160)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE', 13, 1, 3, 135)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('CYAN', 1, 225, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN', 2, 195, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN', 3, 165, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN', 4, 135, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN', 5, 106, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN', 6, 76, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN', 7, 41, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN', 8, 0, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN', 9, 1, 235, 235)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN', 10, 1, 215, 215)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN', 11, 1, 195, 195)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN', 12, 1, 175, 175)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN', 13, 1, 155, 155)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('ORANGE', 1, 255, 238, 225)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ORANGE', 2, 255, 222, 195)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ORANGE', 3, 255, 205, 165)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ORANGE', 4, 255, 189, 135)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ORANGE', 5, 255, 172, 106)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ORANGE', 6, 255, 156, 76)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ORANGE', 7, 255, 136, 41)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ORANGE', 8, 255, 114, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ORANGE', 9, 239, 105, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ORANGE', 10, 210, 94, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ORANGE', 11, 185, 83, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ORANGE', 12, 160, 72, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ORANGE', 13, 135, 60, 1)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('YELLOW', 1, 255, 250, 225)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW', 2, 255, 245, 195)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW', 3, 255, 241, 165)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW', 4, 255, 236, 135)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW', 5, 255, 232, 106)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW', 6, 255, 227, 76)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW', 7, 255, 222, 41)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW', 8, 255, 215, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW', 9, 235, 198, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW', 10, 210, 177, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW', 11, 185, 156, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW', 12, 160, 135, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW', 13, 135, 114, 1)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('MAGENTA', 1, 255, 225, 247)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('MAGENTA', 2, 255, 195, 239)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('MAGENTA', 3, 255, 165, 231)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('MAGENTA', 4, 255, 135, 222)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('MAGENTA', 5, 255, 106, 214)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('MAGENTA', 6, 255, 76, 206)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('MAGENTA', 7, 255, 41, 197)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('MAGENTA', 8, 255, 1, 186)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('MAGENTA', 9, 235, 1, 171)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('MAGENTA', 10, 210, 1, 153)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('MAGENTA', 11, 185, 1, 135)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('MAGENTA', 12, 160, 1, 116)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('MAGENTA', 13, 135, 1, 98)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('GRAY', 1, 245, 245, 245)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY', 2, 225, 225, 225)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY', 3, 205, 205, 205)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY', 4, 185, 185, 185)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY', 5, 165, 165, 165)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY', 6, 145, 145, 145)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY', 7, 125, 125, 125)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY', 8, 105, 105, 105)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY', 9, 85, 85, 85)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY', 10, 65, 65, 65)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY', 11, 45, 45, 45)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY', 12, 25, 25, 25)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY', 13, 5, 5, 5)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('CHARTREUSE', 1, 246, 255, 225)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CHARTREUSE', 2, 238, 255, 195)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CHARTREUSE', 3, 229, 255, 165)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CHARTREUSE', 4, 220, 255, 135)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CHARTREUSE', 5, 211, 255, 106)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CHARTREUSE', 6, 203, 255, 76)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CHARTREUSE', 7, 193, 255, 41)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CHARTREUSE', 8, 41, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CHARTREUSE', 9, 238, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CHARTREUSE', 10, 238, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CHARTREUSE', 11, 132, 185, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CHARTREUSE', 12, 114, 154, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CHARTREUSE', 13, 96, 135, 1)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('PURPLE', 1, 251, 215, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE', 2, 249, 195, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE', 3, 248, 165, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE', 4, 246, 135, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE', 5, 242, 96, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE', 6, 235, 55, 250)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE', 7, 221, 1, 240)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE', 8, 207, 1, 225)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE', 9, 184, 1, 205)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE', 10, 166, 1, 180)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE', 11, 138, 1, 150)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE', 12, 112, 0, 125)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE', 13, 92, 0, 100)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('BLUE TO RED', 1, 23, 1, 220)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO RED', 2, 21, 1, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO RED', 3, 85, 71, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO RED', 4, 101, 103, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO RED', 5, 165, 167, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO RED', 6, 210, 211, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO RED', 7, 255, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO RED', 8, 255, 210, 210)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO RED', 9, 255, 160, 160)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO RED', 10, 255, 111, 111)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO RED', 11, 255, 71, 71)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO RED', 12, 255, 0, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO RED', 13, 220, 1, 1)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('GRAY TO RED', 1, 85, 85, 85)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY TO RED', 2, 115, 115, 115)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY TO RED', 3, 145, 145, 145)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY TO RED', 4, 170, 170, 170)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY TO RED', 5, 195, 195, 195)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY TO RED', 6, 225, 225, 225)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY TO RED', 7, 255, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY TO RED', 8, 255, 210, 210)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY TO RED', 9, 255, 160, 160)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY TO RED', 10, 255, 111, 111)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY TO RED', 11, 255, 71, 71)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY TO RED', 12, 255, 0, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GRAY TO RED', 13, 220, 1, 1)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('BLUE TO ORANGE', 1, 23, 1, 220)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO ORANGE', 2, 21, 1, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO ORANGE', 3, 85, 71, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO ORANGE', 4, 101, 103, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO ORANGE', 5, 165, 167, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO ORANGE', 6, 210, 211, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO ORANGE', 7, 255, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO ORANGE', 8, 255, 230, 210)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO ORANGE', 9, 255, 205, 165)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO ORANGE', 10, 255, 178, 116)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO ORANGE', 11, 255, 153, 71)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO ORANGE', 12, 255, 114, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('BLUE TO ORANGE', 13, 220, 98, 1)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 1, 198, 1, 220)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 2, 229, 1, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 3, 236, 71, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 4, 240, 111, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 5, 246, 165, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 6, 250, 195, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 7, 255, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 8, 255, 230, 210)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 9, 255, 205, 165)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 10, 255, 178, 116)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 11, 255, 153, 71)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 12, 255, 114, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PURPLE TO ORANGE', 13, 220, 98, 1)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('GREEN TO RED', 1, 3, 220, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO RED', 2, 0, 255, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO RED', 3, 72, 255, 71)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO RED', 4, 112, 255, 111)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO RED', 5, 166, 255, 165)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO RED', 6, 196, 255, 195)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO RED', 7, 255, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO RED', 8, 255, 210, 210)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO RED', 9, 255, 160, 160)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO RED', 10, 255, 111, 111)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO RED', 11, 255, 71, 71)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO RED', 12, 255, 0, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO RED', 13, 220, 1, 1)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('GREEN TO ORANGE', 1, 3, 220, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO ORANGE', 2, 0, 255, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO ORANGE', 3, 72, 255, 71)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO ORANGE', 4, 112, 255, 111)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO ORANGE', 5, 166, 255, 165)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO ORANGE', 6, 196, 255, 195)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO ORANGE', 7, 255, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO ORANGE', 8, 255, 230, 210)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO ORANGE', 9, 255, 205, 165)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO ORANGE', 10, 255, 178, 116)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO ORANGE', 11, 255, 153, 71)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO ORANGE', 12, 255, 114, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO ORANGE', 13, 220, 98, 1)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('CYAN TO RED', 1, 1, 220, 220)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO RED', 2, 0, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO RED', 3, 71, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO RED', 4, 116, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO RED', 5, 165, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO RED', 6, 210, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO RED', 7, 255, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO RED', 8, 255, 210, 210)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO RED', 9, 255, 160, 160)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO RED', 10, 255, 111, 111)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO RED', 11, 255, 71, 71)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO RED', 12, 255, 0, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO RED', 13, 220, 1, 1)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('CYAN TO ORANGE', 1, 1, 220, 220)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO ORANGE', 2, 0, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO ORANGE', 3, 71, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO ORANGE', 4, 116, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO ORANGE', 5, 165, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO ORANGE', 6, 210, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO ORANGE', 7, 255, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO ORANGE', 8, 255, 230, 210)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO ORANGE', 9, 255, 220, 165)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO ORANGE', 10, 255, 178, 116)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO ORANGE', 11, 255, 153, 71)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO ORANGE', 12, 255, 114, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('CYAN TO ORANGE', 13, 220, 98, 1)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 1, 247, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 2, 255, 245, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 3, 255, 227, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 4, 255, 209, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 5, 255, 183, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 6, 255, 174, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 7, 255, 156, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 8, 255, 132, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 9, 255, 108, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 10, 255, 90, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 11, 255, 61, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 12, 255, 37, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 13, 255, 0, 0)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 1, 220, 1, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 2, 240, 1, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 3, 255, 1, 49)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 4, 255, 1, 96)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 5, 255, 1, 144)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 6, 255, 1, 204)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 7, 255, 0, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 8, 223, 1, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 9, 187, 1, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 10, 152, 1, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 11, 116, 1, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 12, 56, 1, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 13, 0, 255, 0)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 1, 1, 255, 58)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 2, 1, 255, 88)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 3, 1, 255, 118)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 4, 1, 255, 148)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 5, 1, 255, 178)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 6, 1, 255, 207)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 7, 1, 255, 237)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 8, 1, 243, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 9, 1, 213, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 10, 1, 184, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 11, 1, 124, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 12, 1, 94, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 13, 0, 0, 255)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 1, 255, 255, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 2, 229, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 3, 205, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 4, 170, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 5, 116, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 6, 63, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 7, 3, 235, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 8, 1, 222, 103)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 9, 1, 220, 153)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 10, 1, 170, 138)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 11, 1, 135, 166)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 12, 1, 81, 166)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 13, 14, 1, 130)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('ELEVATION 1', 1, 175, 255, 231)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 1', 2, 151, 255, 150)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 1', 3, 255, 247, 130)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 1', 4, 122, 205, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 1', 5, 2, 130, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 1', 6, 230, 162, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 1', 7, 230, 125, 31)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 1', 8, 220, 104, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 1', 9, 200, 74, 36)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 1', 10, 170, 1, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 1', 11, 88, 52, 20)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 1', 12, 185, 185, 185)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 1', 13, 255, 55, 255)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('ELEVATION 2', 1, 176, 231, 219)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 2', 2, 228, 255, 180)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 2', 3, 255, 251, 195)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 2', 4, 250, 255, 156)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 2', 5, 225, 212, 124)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 2', 6, 219, 166, 32)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 2', 7, 187, 165, 99)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 2', 8, 161, 103, 51)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 2', 9, 156, 123, 96)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 2', 10, 157, 174, 176)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 2', 11, 217, 192, 217)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 2', 12, 198, 220, 221)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('ELEVATION 2', 13, 255, 255, 255)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 1, 210, 255, 218)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 2, 198, 255, 231)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 3, 157, 255, 225)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 4, 116, 242, 248)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 5, 0, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 6, 83, 231, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 7, 127, 192, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 8, 65, 155, 220)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 9, 1, 123, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 10, 0, 0, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 11, 23, 1, 220)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 12, 16, 1, 200)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('SEA FLOOR ELEVATION', 13, 14, 1, 130)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('FULL SPECTRUM', 1, 255, 0, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('FULL SPECTRUM', 2, 255, 90, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('FULL SPECTRUM', 3, 255, 180, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('FULL SPECTRUM', 4, 241, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('FULL SPECTRUM', 5, 152, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('FULL SPECTRUM', 6, 3, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('FULL SPECTRUM', 7, 1, 255, 148)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('FULL SPECTRUM', 8, 1, 255, 237)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('FULL SPECTRUM', 9, 1, 184, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('FULL SPECTRUM', 10, 0, 0, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('FULL SPECTRUM', 11, 176, 1, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('FULL SPECTRUM', 12, 254, 0, 245)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('FULL SPECTRUM', 13, 254, 0, 155)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('PRECIPITATION', 1, 206, 134, 63)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PRECIPITATION', 2, 255, 166, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PRECIPITATION', 3, 255, 216, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PRECIPITATION', 4, 255, 255, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PRECIPITATION', 5, 186, 239, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PRECIPITATION', 6, 111, 255, 39)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PRECIPITATION', 7, 0, 206, 102)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PRECIPITATION', 8, 3, 220, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PRECIPITATION', 9, 2, 187, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PRECIPITATION', 10, 0, 140, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PRECIPITATION', 11, 0, 135, 140)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PRECIPITATION', 12, 44, 102, 130)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('PRECIPITATION', 13, 32, 71, 146)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('TEMPERATURE', 1, 255, 255, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('TEMPERATURE', 2, 255, 101, 150)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('TEMPERATURE', 3, 176, 1, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('TEMPERATURE', 4, 0, 0, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('TEMPERATURE', 5, 1, 130, 255)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('TEMPERATURE', 6, 1, 210, 220)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('TEMPERATURE', 7, 1, 255, 178)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('TEMPERATURE', 8, 0, 255, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('TEMPERATURE', 9, 185, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('TEMPERATURE', 10, 255, 255, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('TEMPERATURE', 11, 255, 180, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('TEMPERATURE', 12, 204, 72, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('TEMPERATURE', 13, 180, 1, 1)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('LAND COVER 1', 1, 255, 239, 140)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 1', 2, 255, 201, 125)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 1', 3, 239, 202, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 1', 4, 239, 155, 73)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 1', 5, 206, 174, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 1', 6, 206, 191, 112)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 1', 7, 163, 206, 90)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 1', 8, 155, 206, 50)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 1', 9, 0, 206, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 1', 10, 69, 140, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 1', 11, 122, 139, 53)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 1', 12, 2, 130, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 1', 13, 1, 100, 99)";
+ if (!db->execute(insert)) return false;
+
+ insert = ins + " VALUES ('LAND COVER 2', 1, 222, 51, 51)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 2', 2, 239, 155, 73)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 2', 3, 239, 202, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 2', 4, 255, 247, 144)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 2', 5, 189, 239, 104)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 2', 6, 182, 255, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 2', 7, 172, 220, 119)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 2', 8, 155, 206, 50)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 2', 9, 0, 206, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 2', 10, 69, 140, 0)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 2', 11, 122, 139, 53)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 2', 12, 2, 130, 1)";
+ if (!db->execute(insert)) return false;
+ insert = ins + " VALUES ('LAND COVER 2', 13, 1, 100, 0)";
+ if (!db->execute(insert)) return false;
+ return true;
+}
+
+bool locatePieBar (TeDatabase* db, TeThemeApplication* theme, TeCoord2D pt, double delta)
+{
+ if (!db || !theme)
+ return false;
+
+ theme->chartSelected_.clear();
+ string TC = theme->collectionTable();
+ string xmin = Te2String(pt.x()-delta);
+ string xmax = Te2String(pt.x()+delta);
+ string ymin = Te2String(pt.y()-delta);
+ string ymax = Te2String(pt.y()+delta);
+
+ TeDatabasePortal* portal = db->getPortal();
+ if (!portal)
+ return false;
+
+ string sel = "SELECT c_object_id FROM " + TC + " WHERE ";
+ sel += "label_x > " + xmin + " AND ";
+ sel += "label_x < " + xmax + " AND ";
+ sel += "label_y > " + ymin + " AND ";
+ sel += "label_y < " + ymax;
+
+ if(!portal->query(sel))
+ {
+ delete portal;
+ return false;
+ }
+
+ if(portal->fetchRow() == false)
+ {
+ delete portal;
+ return false;
+ }
+
+ theme->chartSelected_ = portal->getData("c_object_id");
+
+ delete portal;
+
+ return true;
+}
+
+
+bool loadChartParams (TeDatabase* db, TeThemeApplication *theme)
+{
+ if (!db || !theme)
+ return false;
+
+ TeDatabasePortal* portal = db->getPortal();
+
+ string q ="SELECT * FROM te_chart_params WHERE theme_id= ";
+ q += Te2String (theme->id());
+
+ if (!portal->query(q))
+ {
+ delete portal;
+ return false;
+ }
+ while (portal->fetchRow())
+ {
+ TeColor cor = portal->getColor ();
+ string attname = portal->getData("attr_name");
+ int f = attname.find("(");
+ if(f >= 0)
+ {
+ string alias = attname;
+ attname.erase(f, attname.size()-f);
+ alias.erase(0, f+1);
+ alias.erase(alias.size()-1, 1);
+ map<string, string>& mapAA = db->mapThemeAlias()[theme->id()];
+ theme->concatTableName(attname);
+ mapAA[attname] = alias;
+ }
+ theme->chartAttributes_.push_back(attname);
+ theme->chartColors_.push_back(cor);
+ }
+ delete portal;
+ return true;
+}
+
+
+bool loadKernelParams (TeDatabase* db, int supThemeId, const string& supTableName, const string& supAttrName, TeKernelParams& KernelPar)
+{
+ if (!db)
+ return false;
+
+ TeDatabasePortal* portal = db->getPortal();
+
+ string q ="SELECT event_theme_id_1, intensity_attr_name_1, ";
+ q += " intensity_attr_table_1, kernel_function_1, compute_type_1, radius_value_1, ";
+ q += " combination_type, event_theme_id_2, intensity_attr_name_2, intensity_attr_table_2, ";
+ q += " kernel_function_2, compute_type_2, radius_value_2, support_theme_id, ";
+ q += " support_theme_table, support_theme_attr, generated_layer_id ";
+ q += " FROM te_kernel_metadata WHERE ";
+ q += " support_theme_id = "+ Te2String (supThemeId);
+ q += " AND support_theme_table = '"+ supTableName +"'";
+ q += " AND support_theme_attr = '"+ supAttrName +"'";
+
+ if (!portal->query(q))
+ {
+ delete portal;
+ return false;
+ }
+
+ if (portal->fetchRow())
+ {
+ KernelPar.eventThemeId1_ = atoi(portal->getData(0));
+ KernelPar.intensityAttrName1_ = string(portal->getData(1));
+ KernelPar.intensityAttrTable1_ = string(portal->getData(2));
+ KernelPar.kernelFunction1_ = TeKernelFunctionType(atoi(portal->getData(3)));
+ KernelPar.computeType1_ = TeKernelComputeType(atoi(portal->getData(4)));
+ KernelPar.radiusValue1_ = portal->getDouble(5);
+ KernelPar.combinationType_ = TeKernelCombinationType(atoi(portal->getData(6)));
+ KernelPar.eventThemeId2_ = atoi(portal->getData(7));
+ KernelPar.intensityAttrName2_ = string(portal->getData(8));
+ KernelPar.intensityAttrTable2_ = string(portal->getData(9));
+ KernelPar.kernelFunction2_ = TeKernelFunctionType(atoi(portal->getData(10)));
+ KernelPar.computeType2_ = TeKernelComputeType(atoi(portal->getData(11)));
+ KernelPar.radiusValue2_ = portal->getDouble(12);
+ KernelPar.supportThemeId_ = atoi(portal->getData(13));
+ KernelPar.supportThemeTable_ = string(portal->getData(14));
+ KernelPar.supportThemeAttr_ = string(portal->getData(15));
+ KernelPar.generatedLayerId_ = atoi(portal->getData(16));
+
+ vector<int> ids;
+ if(KernelPar.eventThemeId1_>0)
+ ids.push_back (KernelPar.eventThemeId1_);
+ if(KernelPar.eventThemeId2_>0)
+ ids.push_back (KernelPar.eventThemeId2_);
+ if(KernelPar.supportThemeId_>0)
+ ids.push_back (KernelPar.supportThemeId_);
+
+ string sqlIds;
+ vector<int>::iterator it = ids.begin();
+
+ while (it != ids.end ())
+ {
+ sqlIds += Te2String((*it)) +",";
+ ++it;
+ }
+
+ sqlIds.replace (sqlIds.size()-1, 1, " ");
+ string sql = "SELECT theme_id, name FROM te_theme WHERE theme_id IN ("+ sqlIds +")";
+
+ portal->freeResult();
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ int themeId = atoi(portal->getData(0));
+ string themeName = string(portal->getData(1));
+
+ if(themeId==KernelPar.eventThemeId1_)
+ KernelPar.eventThemeName1_ = themeName;
+ else if (themeId==KernelPar.eventThemeId2_)
+ KernelPar.eventThemeName2_ = themeName;
+ else if (themeId==KernelPar.supportThemeId_)
+ KernelPar.supportThemeName_ = themeName;
+ }
+
+ if(KernelPar.generatedLayerId_>0)
+ {
+ sql = "SELECT name FROM te_layer WHERE layer_id = "+ KernelPar.generatedLayerId_;
+
+ portal->freeResult();
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ KernelPar.generatedLayerName_= string(portal->getData(0));
+ }
+
+ delete portal;
+ return true;
+ }
+
+ delete portal;
+ return false;
+}
+
+
+
+bool loadKernelParams (TeDatabase* db, int layerId, TeKernelParams& KernelPar)
+{
+ if (!db)
+ return false;
+
+ TeDatabasePortal* portal = db->getPortal();
+
+ string q ="SELECT event_theme_id_1, intensity_attr_name_1, ";
+ q += " intensity_attr_table_1, kernel_function_1, compute_type_1, radius_value_1, ";
+ q += " combination_type, event_theme_id_2, intensity_attr_name_2, intensity_attr_table_2, ";
+ q += " kernel_function_2, compute_type_2, radius_value_2, support_theme_id, ";
+ q += " support_theme_table, support_theme_attr, generated_layer_id ";
+ q += " FROM te_kernel_metadata WHERE ";
+ q += " generated_layer_id = "+ Te2String (layerId);
+
+ if (!portal->query(q))
+ {
+ delete portal;
+ return false;
+ }
+
+ if (portal->fetchRow())
+ {
+ KernelPar.eventThemeId1_ = atoi(portal->getData(0));
+ KernelPar.intensityAttrName1_ = string(portal->getData(1));
+ KernelPar.intensityAttrTable1_ = string(portal->getData(2));
+ KernelPar.kernelFunction1_ = TeKernelFunctionType(atoi(portal->getData(3)));
+ KernelPar.computeType1_ = TeKernelComputeType(atoi(portal->getData(4)));
+ KernelPar.radiusValue1_ = portal->getDouble(5);
+ KernelPar.combinationType_ = TeKernelCombinationType(atoi(portal->getData(6)));
+ KernelPar.eventThemeId2_ = atoi(portal->getData(7));
+ KernelPar.intensityAttrName2_ = string(portal->getData(8));
+ KernelPar.intensityAttrTable2_ = string(portal->getData(9));
+ KernelPar.kernelFunction2_ = TeKernelFunctionType(atoi(portal->getData(10)));
+ KernelPar.computeType2_ = TeKernelComputeType(atoi(portal->getData(11)));
+ KernelPar.radiusValue2_ = portal->getDouble(12);
+ KernelPar.supportThemeId_ = atoi(portal->getData(13));
+ KernelPar.supportThemeTable_ = string(portal->getData(14));
+ KernelPar.supportThemeAttr_ = string(portal->getData(15));
+ KernelPar.generatedLayerId_ = atoi(portal->getData(16));
+
+ vector<int> ids;
+ if(KernelPar.eventThemeId1_>0)
+ ids.push_back (KernelPar.eventThemeId1_);
+ if(KernelPar.eventThemeId2_>0)
+ ids.push_back (KernelPar.eventThemeId2_);
+ if(KernelPar.supportThemeId_>0)
+ ids.push_back (KernelPar.supportThemeId_);
+
+ string sqlIds;
+ vector<int>::iterator it = ids.begin();
+
+ while (it != ids.end ())
+ {
+ sqlIds += Te2String((*it)) +",";
+ ++it;
+ }
+
+ sqlIds.replace (sqlIds.size()-1, 1, " ");
+ string sql = "SELECT theme_id, name FROM te_theme WHERE theme_id IN ("+ sqlIds +")";
+
+ portal->freeResult();
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ int themeId = atoi(portal->getData(0));
+ string themeName = string(portal->getData(1));
+
+ if(themeId==KernelPar.eventThemeId1_)
+ KernelPar.eventThemeName1_ = themeName;
+ else if (themeId==KernelPar.eventThemeId2_)
+ KernelPar.eventThemeName2_ = themeName;
+ else if (themeId==KernelPar.supportThemeId_)
+ KernelPar.supportThemeName_ = themeName;
+ }
+
+ if(KernelPar.generatedLayerId_>0)
+ {
+ sql = "";
+ sql =
+ "SELECT name FROM te_layer WHERE layer_id = "
+ + Te2String(KernelPar.generatedLayerId_);
+
+ portal->freeResult();
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ KernelPar.generatedLayerName_= string(portal->getData(0));
+ }
+
+ delete portal;
+ return true;
+ }
+
+ delete portal;
+ return false;
+}
+
+
+bool updatePieBarLocation (TeDatabase* db, TeThemeApplication* theme, TeCoord2D pt)
+{
+ if (!db || !theme)
+ return false;
+
+ if (theme->chartSelected_.empty() == true)
+ return false;
+
+ string x = Te2String(pt.x());
+ string y = Te2String(pt.y());
+ string TC = theme->collectionTable();
+ string mover = "UPDATE " + TC + " SET label_x = " + x + ", label_y = " + y;
+ mover += " WHERE c_object_id = '" + theme->chartSelected_ + "'";
+ return db->execute(mover);
+}
+
+bool updatePointLocation (TeDatabase* db, TeThemeApplication* theme, TeCoord2D pt)
+{
+ if (!db || !theme)
+ return false;
+
+ string x = Te2String(pt.x());
+ string y = Te2String(pt.y());
+ string table = theme->layer()->tableName(TePOINTS);
+ string mover = "UPDATE " + table + " SET x = " + x + ", y = " + y;
+ mover += " WHERE geom_id = " + Te2String(theme->tePoint_.geomId());
+ return db->execute(mover);
+}
+
+
+bool insertChartParams(TeDatabase* db, TeThemeApplication *theme)
+{
+ if (!db || !theme)
+ return false;
+
+ unsigned int n = theme->chartColors_.size();
+ int themeId = theme->id();
+ TeColor cor;
+ string ins, insert;
+ for (unsigned int i=0; i<n; i++)
+ {
+ cor = theme->chartColors_[i];
+ ins = "INSERT INTO te_chart_params (theme_id, attr_name, red, green, blue)";
+ insert = ins + " VALUES (" + Te2String(themeId) +",'";
+ string attname = theme->chartAttributes_[i];
+ map<int, map<string, string> > mapTAA = db->mapThemeAlias();
+ map<int, map<string, string> >::iterator tit = mapTAA.find(theme->id());
+ if(tit != mapTAA.end())
+ {
+ map<string, string> mapAA = tit->second;
+ theme->concatTableName(attname);
+ map<string, string>::iterator it = mapAA.find(attname);
+ if(it != mapAA.end())
+ {
+ string alias = it->second;
+ attname += "(" + alias + ")";
+ }
+ }
+ insert += attname +"',";
+ insert += Te2String(cor.red_) + ",";
+ insert += Te2String(cor.green_) + ",";
+ insert += Te2String(cor.blue_) + ")";
+ if (!db->execute(insert))
+ return false;
+ }
+ return true;
+}
+
+
+bool deleteChartParams (TeDatabase* db, TeThemeApplication* theme)
+{
+ if (!db || !theme)
+ return false;
+
+ string id = Te2String(theme->id());
+ string del = "DELETE FROM te_chart_params WHERE theme_id = " + id;
+ return db->execute(del);
+}
+
+bool insertRampColor(TeDatabase* db, const string& name, int /* order */, TeColor& color, const string& tableName)
+{
+ if (!db)
+ return false;
+
+ string ins = "INSERT INTO " + tableName + " (ramp_name, color_order, red, green, blue)";
+ ins += " VALUES ('" + name + "', " + Te2String(color.red_);
+ ins += ", " + Te2String(color.green_);
+ ins += ", " + Te2String (color.blue_) + ")";
+ return db->execute(ins);
+}
+
+bool updateGridColor(TeDatabase* db, int themeId, TeObjectSelectionMode sel, TeColor& color)
+{
+ if (!db || themeId <= 0)
+ return false;
+
+ string ins = "UPDATE te_legend SET red = " + Te2String(color.red_);
+ ins += ", green = " + Te2String(color.green_);
+ ins += ", blue = " + Te2String (color.blue_);
+ ins += " WHERE theme_id = " + Te2String(themeId) + " AND ";
+ if(sel == TeDefaultSelection)
+ ins += "group_id = -3";
+ else if(sel == TePointingSelection)
+ ins += "group_id = -4";
+ else if(sel == TeQuerySelection)
+ ins += "group_id = -5";
+ else
+ ins += "group_id = -6";
+ return db->execute(ins);
+}
+
+bool loadThemeApplication (TeDatabase* db, TeThemeApplication *theme, const string& tableName)
+{
+ if (!db || !theme)
+ return false;
+
+ if (!db->loadTheme(theme))
+ return false;
+
+ TeDatabasePortal* portal = db->getPortal();
+ if (!portal)
+ return false;
+
+ string q = "SELECT * FROM " + tableName + " WHERE theme_id= ";
+ q += Te2String (theme->id());
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ theme->outOfCollectionVisibility(portal->getBool(1));
+ theme->withoutDataConnectionVisibility(portal->getBool(2));
+ theme->refineAttributeWhere(string(portal->getData (3)));
+ theme->refineSpatialWhere(string(portal->getData (4)));
+ theme->refineTemporalWhere(string(portal->getData (5)));
+
+ string name = portal->getData(6);
+ if (!name.empty())
+ theme->groupColor(name);
+ theme->groupColorDir(TeColorDirection(atoi(portal->getData(7))));
+ theme->groupObjects(TeSelectedObjects(atoi(portal->getData(8))));
+ theme->pieDiameter(portal->getDouble(9));
+ theme->pieMaxDiameter(portal->getDouble(10));
+ theme->pieMinDiameter(portal->getDouble(11));
+ name = portal->getData(12);
+ if (!name.empty())
+ theme->pieDimAttribute(name);
+ theme->barMaxHeight(portal->getDouble(13));
+ theme->barMinHeight(portal->getDouble(14));
+ theme->barWidth(portal->getDouble(15));
+ theme->chartMaxVal(portal->getDouble(16));
+ theme->chartMinVal(portal->getDouble(17));
+ theme->chartType(TeChartType(atoi(portal->getData(18))));
+ theme->chartObjects(TeSelectedObjects(atoi(portal->getData(19))));
+ theme->keepDimension(atoi(portal->getData(20)));
+ theme->showCanvasLegend(portal->getBool(21));
+ TeCoord2D p;
+ p.x(portal->getDouble(22));
+ p.y(portal->getDouble(23));
+ theme->canvasLegUpperLeft(p);
+ bool n = portal->getBool(24);
+ theme->mixColor(n);
+ n = portal->getBool(25);
+ theme->countObj(n);
+ name = portal->getData(26);
+ if (!name.empty())
+ theme->textTable(name);
+ theme->chartFunction(portal->getData(27));
+ portal->freeResult();
+ delete portal;
+ return loadChartParams(db,theme);
+}
+
+bool insertThemeApplication (TeDatabase* db, TeThemeApplication *theme, const string& tableName)
+{
+ if (!db || !theme)
+ return false;
+ if (!db->insertTheme((TeTheme*) theme))
+ return false;
+
+ string q = "INSERT INTO " + tableName + " (theme_id, visible_out_coll, visible_without_conn, ";
+ q += "refine_attribute_where, refine_spatial_where, refine_temporal_where, ";
+ q += "grouping_color, grouping_color_direction, grouping_objects, ";
+ q += "pie_diameter, pie_max_diameter, pie_min_diameter, pie_dimension_attr, ";
+ q += "bar_max_height, bar_min_height, bar_width, ";
+ q += "chart_max_value, chart_min_value, chart_type, chart_objects, ";
+ q += "keep_dimension, show_canvas_leg, canvas_leg_x, canvas_leg_y, ";
+ q += "mix_color, count_obj, text_table, chart_function) VALUES (";
+
+ q += Te2String(theme->id()) + ", ";
+ if (theme->outOfCollectionVisibility())
+ q += "1, ";
+ else
+ q += "0, ";
+ if (theme->withoutDataConnectionVisibility())
+ q += "1, '";
+ else
+ q += "0, '";
+ q += theme->refineAttributeWhere () + "', '" + theme->refineSpatialWhere() + "', '";
+ q += theme->refineTemporalWhere () + "', '" + theme->groupColor() + "', ";
+ q += Te2String(theme->groupColorDir()) + ", " + Te2String(theme->groupObjects()) + ", ";
+ q += Te2String(theme->pieDiameter(),8) + ", " + Te2String(theme->pieMaxDiameter(),8) + ", ";
+ q += Te2String(theme->pieMinDiameter(),8) + ", '" + theme->pieDimAttribute() + "', ";
+ q += Te2String(theme->barMaxHeight(),8) + ", " + Te2String(theme->barMinHeight(),8) + ", ";
+ q += Te2String(theme->barWidth(),8) + ", " + Te2String(theme->chartMaxVal(),8) + ", ";
+ q += Te2String(theme->chartMinVal(),8)+ ", " + Te2String(theme->chartType()) + ", ";
+ q += Te2String(theme->chartObjects()) + ", ";
+ q += Te2String(theme->keepDimension()) + ", ";
+ if (theme->showCanvasLegend())
+ q += "1, ";
+ else
+ q += "0, ";
+ q += Te2String(theme->canvasLegWidth(),8) + ", ";
+ q += Te2String(theme->canvasLegHeight(),8) + ", ";
+ if (theme->mixColor())
+ q += "1, ";
+ else
+ q += "0, ";
+ if (theme->countObj())
+ q += "1, '";
+ else
+ q += "0, '";
+ q += theme->textTable() + "', '";
+ q += theme->chartFunction() + "')";
+ if(!db->execute(q))
+ return false;
+
+ for (unsigned int i=0; i<theme->chartAttributes_.size(); i++)
+ {
+ q = "INSERT INTO te_chart_params VALUES (attr_name, red, blue, green, theme_id) VALUES (";
+ string attname = theme->chartAttributes_[i];
+ map<int, map<string, string> > mapTAA = db->mapThemeAlias();
+ map<int, map<string, string> >::iterator tit = mapTAA.find(theme->id());
+ if(tit != mapTAA.end())
+ {
+ map<string, string> mapAA = tit->second;
+ theme->concatTableName(attname);
+ map<string, string>::iterator it = mapAA.find(attname);
+ if(it != mapAA.end())
+ {
+ string alias = it->second;
+ attname += "(" + alias + ")";
+ }
+ }
+ q += "'" + attname + "', " + Te2String(theme->chartColors_[i].red_)+ ", ";
+ q += Te2String(theme->chartColors_[i].green_)+ ", " + Te2String(theme->chartColors_[i].blue_) +", ";
+ q += Te2String(theme->id()) + ")";
+ if (!db->execute(q))
+ return false;
+ }
+ return true;
+}
+
+bool loadViewSet(TeDatabase* db, const string& user)
+{
+ if (!db)
+ return false;
+
+ TeViewMap::iterator it = db->viewMap().begin();
+ while (it != db->viewMap().end())
+ {
+ delete it->second;
+ ++it;
+ }
+ db->viewMap().clear();
+
+
+ TeDatabasePortal* portal = db->getPortal();
+ if (!portal)
+ return false;
+
+ string q = " SELECT * FROM te_view WHERE user_name = '" + user + "'";
+
+ if (!portal->query(q))
+ {
+ delete portal;
+ return false;
+ }
+
+ TeDatabasePortal* themePortal = db->getPortal();
+ if (!themePortal)
+ {
+ delete portal;
+ return false;
+ }
+
+ while (portal->fetchRow())
+ {
+ TeView *view = new TeView();
+ view->id (atoi(portal->getData("view_id")));
+ int projId = atoi(portal->getData("projection_id"));
+ TeProjection* proj = db->loadProjection(projId);
+ if (proj != 0)
+ view->projection(proj);
+ view->name(portal->getData("name"));
+ view->user(portal->getData("user_name"));
+ view->isVisible (portal->getBool("visibility"));
+
+ loadViewTree(db, view, 0);
+
+ vector<TeViewNode*>& themes = view->themes();
+ for (unsigned int i = 0; i < themes.size(); i++)
+ {
+ TeTheme *theme = (TeTheme*)themes[i];
+ int id = theme->layerId();
+ TeLayerMap::iterator it = db->layerMap().find(id);
+ if (it == db->layerMap().end())
+ {
+ db->layerMap().clear();
+ db->loadLayerSet();
+ }
+ theme->layer(db->layerMap()[id]);
+ }
+ db->viewMap()[view->id()] = view;
+ themePortal->freeResult();
+ }
+
+ delete themePortal;
+ delete portal;
+ return true;
+}
+
+bool
+updateView(TeDatabase* db, TeView *view)
+{
+ if(!db) return false;
+ if(!view) return false;
+
+ TeProjection* proj = view->projection();
+ if (proj)
+ {
+ if (proj->id() <= 0)
+ db->insertProjection(view->projection());
+ else
+ db->updateProjection(view->projection());
+ }
+ else
+ return false;
+
+ string sql = "UPDATE te_view SET projection_id=" + Te2String(proj->id());
+ sql+= ", name='" + view->name() + "'";
+ sql+= ", user_name='" + view->user() + "'";
+ sql+= ", visibility= " + Te2String((int)view->isVisible());
+ sql +=" WHERE view_id = " + Te2String(view->id());
+
+ if (!db->execute (sql))
+ return false;
+
+ TeViewTree* tree = view->root();
+ if(tree)
+ updateViewTree(db, tree);
+
+ return true;
+}
+
+bool updateThemeApplication (TeDatabase* db, TeThemeApplication *theme)
+{
+ if (!db || !theme)
+ return false;
+ if (!db->updateTheme((TeTheme*) theme))
+ return false;
+
+ string sql;
+
+ if (theme->id() <= 0 ) // theme doesn�t exist in the database yet
+ {
+ return insertThemeApplication (db, theme);
+ }
+
+ // update theme metadata
+ sql = "UPDATE te_theme_application SET ";
+ sql += " visible_out_coll=";
+ if (theme->outOfCollectionVisibility())
+ sql += "1";
+ else
+ sql += "0";
+ sql += ", visible_without_conn=";
+ if (theme->withoutDataConnectionVisibility())
+ sql += "1";
+ else
+ sql += "0";
+
+ sql += ", refine_attribute_where='" + theme->refineAttributeWhere()+"'";
+ sql += ", refine_spatial_where='" + theme->refineSpatialWhere()+"'";
+ sql += ", refine_temporal_where='" + theme->refineTemporalWhere()+"'";
+ sql += ", grouping_color='" + theme->groupColor() + "'";
+ sql += ", grouping_color_direction=" + Te2String(theme->groupColorDir());
+ sql += ", grouping_objects=" + Te2String (theme->groupObjects());
+ sql += ", pie_diameter=" + Te2String(theme->pieDiameter());
+ sql += ", pie_max_diameter=" + Te2String(theme->pieMaxDiameter());
+ sql += ", pie_min_diameter=" + Te2String(theme->pieMinDiameter());
+ sql += ", pie_dimension_attr='" + theme->pieDimAttribute()+"'";
+ sql += ", bar_max_height=" + Te2String(theme->barMaxHeight());
+ sql += ", bar_min_height=" + Te2String(theme->barMinHeight());
+ sql += ", bar_width=" + Te2String(theme->barWidth());
+ sql += ", chart_max_value=" + Te2String(theme->chartMaxVal());
+ sql += ", chart_min_value=" + Te2String(theme->chartMinVal());
+ sql += ", chart_type=" + Te2String (theme->chartType());
+ sql += ", chart_objects=" + Te2String (theme->chartObjects());
+ sql += ", keep_dimension=" + Te2String(theme->keepDimension());
+ sql += ", show_canvas_leg=";
+ if (theme->showCanvasLegend())
+ sql += "1";
+ else
+ sql += "0";
+ sql += ", canvas_leg_x=" + Te2String(theme->canvasLegUpperLeft().x());
+ sql += ", canvas_leg_y=" + Te2String(theme->canvasLegUpperLeft().y());
+ sql += ", mix_color=";
+ if (theme->mixColor())
+ sql += "1";
+ else
+ sql += "0";
+ sql += ", count_obj=";
+ if (theme->countObj())
+ sql += "1";
+ else
+ sql += "0";
+ sql += ", text_table='" + theme->textTable () + "'";
+ sql += ", chart_function='" + theme->chartFunction () + "'";
+ sql += " WHERE theme_id=" + Te2String (theme->id());
+
+ if (!db->execute (sql))
+ return false;
+
+ // remove it�s chart parameters and reinsert them
+ deleteChartParams(db, theme);
+ if(!insertChartParams (db, theme))
+ return false;
+
+ return true;
+
+// return theme->mountSqlJoin (false);
+}
+
+
+bool deleteThemeApplication (TeDatabase* db, int themeId)
+{
+ if (!db || themeId < 1)
+ return false;
+ if (!db->deleteTheme(themeId))
+ return false;
+
+ string sql = "DELETE FROM te_kernel_metadata WHERE event_theme_id_1 = "+ Te2String(themeId);
+ sql += " OR event_theme_id_2 = "+ Te2String(themeId);
+ db->execute(sql);
+
+ if (db->existRelation("te_theme_application", "fk_themeAppl_theme_id") != TeRICascadeDeletion)
+ {
+ // Delete all chart parameters associated to the theme
+ string sql = "DELETE FROM te_theme_application WHERE theme_id =" + Te2String(themeId);
+ if (!db->execute (sql))
+ return false;
+ }
+
+ if (db->existRelation("te_chart_params", "fk_chartpar_theme_id") != TeRICascadeDeletion)
+ {
+ // Delete all chart parameters associated to the theme
+ string sql = "DELETE FROM te_chart_params WHERE theme_id =" + Te2String(themeId);
+ if (!db->execute (sql))
+ return false;
+ }
+ return true;
+}
+
+TeViewTree*
+loadViewTree(TeDatabase* db, TeView* view, int id)
+{
+ if(db == NULL) return NULL;
+ if(view == NULL) return NULL;
+ TeDatabasePortal* portal = db->getPortal();
+ string q;
+ TeViewTree *node = NULL;
+
+ if(id != 0)
+ {
+ q = "SELECT * FROM te_theme";
+ q += " WHERE view_id = " + Te2String (view->id());
+ q += " AND theme_id = " + Te2String(id);
+ if (!portal->query(q) || portal->fetchRow())
+ {
+ delete portal;
+ return NULL;
+ }
+
+ TeViewNodeType type = (TeViewNodeType)atoi(portal->getData("node_type"));
+ if(type != TeTREE)
+ {
+ portal->freeResult();
+ delete portal;
+ return NULL;
+ }
+
+ node = portal->getViewTree();
+ portal->freeResult();
+ }
+
+ q ="SELECT * FROM te_theme";
+ q += " WHERE view_id = " + Te2String (view->id());
+ q += " AND parent_id = " + Te2String(id);
+ q += " ORDER BY priority ASC";
+
+ if (!portal->query(q))
+ {
+ delete portal;
+ return node;
+ }
+
+ while (portal->fetchRow())
+ {
+ TeViewNodeType childType = (TeViewNodeType)atoi(portal->getData("node_type"));
+ TeViewNode *childNode;
+ if (childType == TeTHEME)
+ {
+ childNode = new TeThemeApplication();
+ childNode->id(atoi(portal->getData("theme_id")));
+ if(loadThemeApplication(db,(TeThemeApplication*) childNode))
+ db->themeMap()[childNode->id()] = (TeTheme*)childNode;
+ else
+ childNode = 0;
+ }
+ else
+ {
+ childNode = loadViewTree(db, view, atoi(portal->getData("theme_id")));
+ }
+
+ if((id==0) && (childNode))
+ {
+ view->add(childNode);
+ }
+ else if (childNode)
+ {
+// view->addTheme(childNode);
+ node->add(childNode);
+ }
+ }
+
+ delete portal;
+ return node;
+}
+
+bool updateViewTree (TeDatabase* db, TeViewTree *tree)
+{
+ if(tree->id() > 0)
+ {
+ string sql;
+ sql = "UPDATE te_theme SET ";
+ sql += "name='" + tree->name()+"'";
+ sql += ", parent_id=" + Te2String (tree->parentId());
+ sql += ", node_type=" + Te2String (tree->type());
+ sql += " ,priority=" + Te2String (tree->priority());
+// sql += ", visible_rep=" + Te2String (tree->visible());
+ sql += " WHERE theme_id = " + Te2String(tree->id());
+
+ if(!db->execute (sql)) return false;
+ }
+
+ for (unsigned int th=0; th<tree->size(); th++)
+ {
+ TeViewNode* node = tree->retrieve(th);
+ if (node->type() == TeTHEME)
+ {
+ TeThemeApplication *theme = (TeThemeApplication*)node;
+ if(!updateThemeApplication(db, theme)) return false;
+ }
+ else
+ {
+ TeViewTree* tree = (TeViewTree*)node;
+ if(!updateViewTree(db, tree)) return false;
+ }
+ }
+
+ return true;
+}
+
+int createTeLayerMetadata(TeDatabase* db)
+{
+ TeAttributeList attr;
+ TeAttribute at;
+
+ at.rep_.type_ = TeINT;
+ at.rep_.name_ = "layer_id";
+ at.rep_.isPrimaryKey_ = true;
+ attr.push_back(at);
+
+ at.rep_.isPrimaryKey_ = false;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "name";
+ at.rep_.numChar_ = 128;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "author";
+ at.rep_.numChar_ = 128;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "source";
+ at.rep_.numChar_ = 255;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "quality";
+ at.rep_.numChar_ = 128;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "description";
+ at.rep_.numChar_ = 255;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "date_";
+ at.rep_.numChar_ = 64;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "hour_";
+ at.rep_.numChar_ = 64;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeINT;
+ at.rep_.name_ = "transf";
+ attr.push_back(at);
+
+ if(db->createTable ("te_layer_metadata", attr) == false)
+ return 1;
+
+ bool b = db->tableExist("te_layer_metadata");
+ while(b == false)
+ b = db->tableExist("te_layer_metadata");
+
+ if (db->createRelation("fk_te_layer_met_id", "te_layer_metadata", "layer_id", "te_layer", "layer_id", true) == false)
+ return 2;
+ return 3;
+}
+
+int createTeTableMetadata(TeDatabase* db)
+{
+ TeAttributeList attr;
+ TeAttribute at;
+
+ at.rep_.type_ = TeINT;
+ at.rep_.name_ = "table_id";
+ at.rep_.isPrimaryKey_ = true;
+ attr.push_back(at);
+
+ at.rep_.isPrimaryKey_ = false;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "name";
+ at.rep_.numChar_ = 128;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "author";
+ at.rep_.numChar_ = 128;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "source";
+ at.rep_.numChar_ = 255;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "quality";
+ at.rep_.numChar_ = 128;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "description";
+ at.rep_.numChar_ = 255;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "date_";
+ at.rep_.numChar_ = 64;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "hour_";
+ at.rep_.numChar_ = 64;
+ attr.push_back(at);
+
+ at.rep_.type_ = TeINT;
+ at.rep_.name_ = "transf";
+ attr.push_back(at);
+
+ if(db->createTable ("te_table_metadata", attr) == false)
+ return 1;
+
+ bool b = db->tableExist("te_table_metadata");
+ while(b == false)
+ b = db->tableExist("te_table_metadata");
+
+ if (db->createRelation("fk_te_table_met_id", "te_table_metadata", "table_id", "te_layer_table", "table_id", true) == false)
+ return 2;
+ return 3;
+}
+
+
+bool deleteTextVisual(TeLayer* layer)
+{
+ TeDatabase* db = layer->database();
+ TeDatabasePortal* portal = db->getPortal();
+
+ string sel = "SELECT geom_table FROM te_representation";
+ sel += " WHERE layer_id = " + Te2String(layer->id());
+ sel += " AND geom_type = " + Te2String(TeTEXT);
+
+ if(portal->query(sel))
+ {
+ while(portal->fetchRow())
+ {
+ string s = portal->getData(0);
+ string drop = "DROP TABLE " + s + "_txvisual";
+ if(db->execute(drop) == false)
+ {
+ delete portal;
+ return false;
+ }
+ }
+ }
+ delete portal;
+ return true;
+}
+
+
+bool isTerralibModel(TeDatabase* db)
+{
+ vector<string>::iterator it;
+ vector<string> tables;
+ db->listTables(tables);
+
+ for(unsigned int i = 0; i<tables.size(); i++)
+ {
+ if((it = find(tables.begin(), tables.end(), "te_projection")) == tables.end())
+ return false;
+ if((it = find(tables.begin(), tables.end(), "te_layer")) == tables.end())
+ return false;
+ if((it = find(tables.begin(), tables.end(), "te_layer_table")) == tables.end())
+ return false;
+ if((it = find(tables.begin(), tables.end(), "te_tables_relation")) == tables.end())
+ return false;
+ if((it = find(tables.begin(), tables.end(), "te_representation")) == tables.end())
+ return false;
+ if((it = find(tables.begin(), tables.end(), "te_view")) == tables.end())
+ return false;
+ if((it = find(tables.begin(), tables.end(), "te_theme")) == tables.end())
+ return false;
+ if((it = find(tables.begin(), tables.end(), "te_grouping")) == tables.end())
+ return false;
+ if((it = find(tables.begin(), tables.end(), "te_theme_table")) == tables.end())
+ return false;
+ if((it = find(tables.begin(), tables.end(), "te_legend")) == tables.end())
+ return false;
+ if((it = find(tables.begin(), tables.end(), "te_visual")) == tables.end())
+ return false;
+ if((it = find(tables.begin(), tables.end(), "te_visual_raster")) == tables.end())
+ return false;
+ if((it = find(tables.begin(), tables.end(), "te_database")) == tables.end())
+ return false;
+ }
+ if(tables.size() == 0)
+ return false;
+
+ return true;
+}
+
+string insertObjectIntoCollection(TeTheme* theme, TeCoord2D p, string newId, string newTId)
+{
+ string erro;
+ string sel;
+ TeLayer* layer = theme->layer();
+ TeDatabase* db = layer->database();
+ string CT = theme->collectionTable();
+ string CAT = theme->collectionAuxTable();
+
+ TeDatabasePortal* portal = db->getPortal();
+ if(newId.empty() == false)
+ {
+ sel = "SELECT * FROM " + CT + " WHERE c_object_id = '" + newId + "'";
+ if(portal->query(sel) && portal->fetchRow())
+ {
+// erro = "There is already the object identifier:" + newId;
+// erro += " in the collection table:" + CT;
+ delete portal;
+ return "There is already";
+ }
+ }
+
+// if(newTId.empty() == false)
+// {
+// sel = "SELECT * FROM " + CAT + " WHERE aux0 = '" + newTId + "'";
+// portal->freeResult();
+// if(portal->query(sel) && portal->fetchRow())
+// {
+// erro = "There is already the object identifier:" + newTId;
+// erro += " in the collection auxliar table:" + CAT;
+// delete portal;
+// return erro;
+// }
+// }
+ delete portal;
+
+ unsigned int i;
+ vector<TeTable> staticTableVec, eventTableVec, temporalTableVec;
+ TeAttrTableVector layerTablesVector;
+ if(layer->getAttrTables(layerTablesVector))
+ {
+ for(i=0; i<layerTablesVector.size(); i++)
+ {
+ TeTable t = layerTablesVector[i];
+ if(t.tableType() == TeAttrStatic)
+ staticTableVec.push_back(t);
+ else if(t.tableType() == TeAttrEvent)
+ eventTableVec.push_back(t);
+ else if(t.tableType() == TeFixedGeomDynAttr)
+ temporalTableVec.push_back(t);
+ }
+ }
+ else
+ {
+ erro = "Fail in the layer method to gets attribute table associated";
+ return erro;
+ }
+
+ bool ret;
+ if(newId.empty() == false)
+ {
+ string ins = "INSERT INTO " + CT + " (c_object_id, c_legend_id,";
+ ins += " label_x, label_y, c_legend_own, c_object_status) VALUES (";
+ ins += "'" + newId + "', 0, " + Te2String(p.x()) + ", " + Te2String(p.y());
+ ins += ", 0, 1)";
+ ret = db->execute(ins);
+ if(ret == false)
+ return db->errorMessage();
+
+ for(i=0; i<staticTableVec.size(); i++)
+ {
+ TeTable t = staticTableVec[i];
+ ins = "INSERT INTO " + t.name() + " (" + t.linkName() + ")";
+ ins += " VALUES ('" + newId + "')";
+ ret = db->execute(ins);
+ if(ret == false)
+ return db->errorMessage();
+ }
+ for(i=0; i<eventTableVec.size(); i++)
+ {
+ TeTable t = eventTableVec[i];
+ ins = "INSERT INTO " + t.name() + " (" + t.linkName() + ")";
+ ins += " VALUES ('" + newId + "')";
+ ret = db->execute(ins);
+ if(ret == false)
+ return db->errorMessage();
+ }
+ }
+
+ string uniqueId = newId;
+ if(newTId.empty() == false)
+ {
+ uniqueId = newId + newTId;
+ string ins = "INSERT INTO " + CAT + " (object_id, aux0, unique_id, grid_status) VALUES (";
+ ins += "'" + newId + "', '" + newTId + "', '" + uniqueId + "', 1)";
+ ret = db->execute(ins);
+ if(ret == false)
+ return db->errorMessage();
+
+ for(i=0; i<temporalTableVec.size(); i++)
+ {
+ TeTable t = temporalTableVec[i];
+ ins = "INSERT INTO " + t.name() + " (" + t.linkName() + ", " + t.uniqueName() + ")";
+ ins += " VALUES ('" + newId + "', '" + newTId + "')";
+ ret = db->execute(ins);
+ if(ret == false)
+ return db->errorMessage();
+ }
+ }
+ else
+ {
+ string ins = "INSERT INTO " + CAT + " (object_id, unique_id, grid_status) VALUES (";
+ ins += "'" + newId + "', '" + uniqueId + "', 1)";
+ ret = db->execute(ins);
+ if(ret == false)
+ return db->errorMessage();
+ }
+
+ return "";
+}
+
+string deletePointedObjects(TeTheme* theme, TeBox& box)
+{
+ unsigned int i;
+ TeLayer* layer = theme->layer();
+ TeDatabase* db = layer->database();
+ TeThemeMap& themeMap = db->themeMap();
+ string CT = theme->collectionTable();
+ string CAT = theme->collectionAuxTable();
+ string tsel, sel, del;
+ vector<TeTable> table;
+ vector<TeTable> ttable;
+ vector<string> selVec;
+ vector<string> selAuxVec;
+
+ TeAttrTableVector layerTablesVector;
+ layer->getAttrTables(layerTablesVector);
+
+// delete temporal instances of TeFixedGeomDynAttr tables
+ for(i=0; i<layerTablesVector.size(); i++)
+ {
+ TeTable t = layerTablesVector[i];
+ TeAttrTableType type = t.tableType();
+
+ if(type == TeFixedGeomDynAttr)
+ ttable.push_back(t);
+ }
+
+ if(ttable.size())
+ {
+ tsel = "(SELECT aux0 FROM " + CAT;
+ tsel += " WHERE grid_status = 1 OR grid_status = 3)";
+
+ for(i=0; i<ttable.size(); i++)
+ {
+ del = "DELETE FROM " + ttable[i].name() + " WHERE " + ttable[i].uniqueName() + " IN " + tsel;
+ if(db->execute(del) == false)
+ return db->errorMessage();
+ }
+ }
+
+// get selected object ids
+ TeDatabasePortal* portal = db->getPortal();
+ vector<string> oidVec;
+ sel = "SELECT DISTINCT object_id FROM " + CAT;
+ sel += " WHERE (grid_status = 1 OR grid_status = 3) AND object_id NOT IN";
+ sel += "(SELECT DISTINCT object_id FROM " + CAT;
+ sel += " WHERE grid_status = 0 OR grid_status = 2)";
+ portal->freeResult();
+ if(portal->query(sel))
+ {
+ while(portal->fetchRow())
+ {
+ string oid = portal->getData(0);
+ oidVec.push_back(oid);
+ }
+ }
+
+ sel = "SELECT * FROM " + CT + " as T LEFT JOIN " + CAT + " as TT";
+ sel += " ON T.c_object_id = TT.object_id WHERE TT.grid_status is null";
+ sel += " AND (T.c_object_status = 1 OR T.c_object_status = 3)";
+ portal->freeResult();
+ if(portal->query(sel))
+ {
+ while(portal->fetchRow())
+ {
+ string oid = portal->getData(0);
+ oidVec.push_back(oid);
+ }
+ }
+ vector<string>::iterator itB = oidVec.begin();
+ vector<string>::iterator itE = oidVec.end();
+ selVec = generateInClauses(itB,itE, db, true);
+
+// delete attributes of TeAttrStatic tables and TeAttrEvent tables
+ for(i=0; i<layerTablesVector.size(); i++)
+ {
+ TeTable t = layerTablesVector[i];
+ TeAttrTableType type = t.tableType();
+
+ if(type == TeAttrStatic || type == TeAttrEvent)
+ table.push_back(t);
+ }
+
+ for(i=0; i<table.size(); i++)
+ {
+ for(i=0; i<selVec.size(); i++)
+ {
+ del = "DELETE FROM " + table[i].name() + " WHERE ";
+ del += table[i].linkName() + " IN " + selVec[i];
+ if(db->execute(del) == false)
+ {
+ delete portal;
+ return db->errorMessage();
+ }
+ }
+ }
+
+ double minX = TeMAXFLOAT, minY = TeMAXFLOAT, maxX = -TeMAXFLOAT, maxY = -TeMAXFLOAT;
+// delete selected geometries
+ if(layer->geomRep() & TePOLYGONS)
+ {
+ string geo = layer->tableName(TePOLYGONS);
+ for(i=0; i<selVec.size(); i++)
+ {
+ string boxsel = "SELECT * FROM " + geo;
+ boxsel += " WHERE object_id IN " + selVec[i];
+
+ portal->freeResult();
+ if(portal->query(boxsel))
+ {
+ while(portal->fetchRow())
+ {
+ double x1 = portal->getDouble("lower_x");
+ double y1 = portal->getDouble("lower_y");
+ double x2 = portal->getDouble("upper_x");
+ double y2 = portal->getDouble("upper_y");
+ TeBox b(x1, y1, x2, y2);
+ box = TeUnion(box, b);
+ }
+ }
+ del = "DELETE FROM " + geo + " WHERE object_id IN " + selVec[i];
+ if(db->execute(del) == false)
+ {
+ delete portal;
+ return db->errorMessage();
+ }
+ }
+ string bb = "SELECT MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y) FROM " + geo;
+ portal->freeResult();
+ if(portal->query(bb) && portal->fetchRow())
+ {
+ minX = MIN(minX, portal->getDouble(0));
+ minY = MIN(minY, portal->getDouble(1));
+ maxX = MAX(maxX, portal->getDouble(2));
+ maxY = MAX(maxY, portal->getDouble(3));
+ }
+ }
+ if(layer->geomRep() & TePOINTS)
+ {
+ string geo = layer->tableName(TePOINTS);
+ for(i=0; i<selVec.size(); i++)
+ {
+ string boxsel = "SELECT * FROM " + geo;
+ boxsel += " WHERE object_id IN " + selVec[i];
+
+ portal->freeResult();
+ if(portal->query(boxsel))
+ {
+ while(portal->fetchRow())
+ {
+ double x = portal->getDouble("x");
+ double y = portal->getDouble("y");
+ TeBox b(x, y, x, y);
+ box = TeUnion(box, b);
+ }
+ }
+ del = "DELETE FROM " + geo + " WHERE object_id IN " + selVec[i];
+ if(db->execute(del) == false)
+ {
+ delete portal;
+ return db->errorMessage();
+ }
+ }
+ string bb = "SELECT MIN(x), MIN(y), MAX(x), MAX(y) FROM " + geo;
+ portal->freeResult();
+ if(portal->query(bb) && portal->fetchRow())
+ {
+ minX = MIN(minX, portal->getDouble(0));
+ minY = MIN(minY, portal->getDouble(1));
+ maxX = MAX(maxX, portal->getDouble(2));
+ maxY = MAX(maxY, portal->getDouble(3));
+ }
+ }
+ if(layer->geomRep() & TeCELLS)
+ {
+ string geo = layer->tableName(TeCELLS);
+ for(i=0; i<selVec.size(); i++)
+ {
+ string boxsel = "SELECT * FROM " + geo;
+ boxsel += " WHERE object_id IN " + selVec[i];
+
+ portal->freeResult();
+ if(portal->query(boxsel))
+ {
+ while(portal->fetchRow())
+ {
+ double x1 = portal->getDouble("lower_x");
+ double y1 = portal->getDouble("lower_y");
+ double x2 = portal->getDouble("upper_x");
+ double y2 = portal->getDouble("upper_y");
+ TeBox b(x1, y1, x2, y2);
+ box = TeUnion(box, b);
+ }
+ }
+ del = "DELETE FROM " + geo + " WHERE object_id IN " + selVec[i];
+ if(db->execute(del) == false)
+ {
+ delete portal;
+ return db->errorMessage();
+ }
+ }
+ string bb = "SELECT MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y) FROM " + geo;
+ portal->freeResult();
+ if(portal->query(bb) && portal->fetchRow())
+ {
+ minX = MIN(minX, portal->getDouble(0));
+ minY = MIN(minY, portal->getDouble(1));
+ maxX = MAX(maxX, portal->getDouble(2));
+ maxY = MAX(maxY, portal->getDouble(3));
+ }
+ }
+ if(layer->geomRep() & TeLINES)
+ {
+ string geo = layer->tableName(TePOINTS);
+ for(i=0; i<selVec.size(); i++)
+ {
+ string boxsel = "SELECT * FROM " + geo;
+ boxsel += " WHERE object_id IN " + selVec[i];
+
+ portal->freeResult();
+ if(portal->query(boxsel))
+ {
+ while(portal->fetchRow())
+ {
+ double x1 = portal->getDouble("lower_x");
+ double y1 = portal->getDouble("lower_y");
+ double x2 = portal->getDouble("upper_x");
+ double y2 = portal->getDouble("upper_y");
+ TeBox b(x1, y1, x2, y2);
+ box = TeUnion(box, b);
+ }
+ }
+ del = "DELETE FROM " + geo + " WHERE object_id IN " + selVec[i];
+ if(db->execute(del) == false)
+ {
+ delete portal;
+ return db->errorMessage();
+ }
+ }
+ string bb = "SELECT MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y) FROM " + geo;
+ portal->freeResult();
+ if(portal->query(bb) && portal->fetchRow())
+ {
+ minX = MIN(minX, portal->getDouble(0));
+ minY = MIN(minY, portal->getDouble(1));
+ maxX = MAX(maxX, portal->getDouble(2));
+ maxY = MAX(maxY, portal->getDouble(3));
+ }
+ }
+
+ double dx = maxX - minX;
+ double dy = maxY - minY;
+ minX -= dx/20.;
+ maxX += dx/20.;
+ minY -= dy/20.;
+ maxY += dy/20.;
+
+ string up = "UPDATE te_layer SET lower_x = " + Te2String(minX);
+ up += ", lower_y = " + Te2String(minY);
+ up += ", upper_x = " + Te2String(maxX);
+ up += ", upper_y = " + Te2String(maxY);
+ up += " WHERE layer_id = " + Te2String(layer->id());
+ if(db->execute(up) == false)
+ {
+ delete portal;
+ return db->errorMessage();
+ }
+ TeBox nbox(minX, minY, maxX, maxY);
+ layer->setLayerBox(nbox);
+
+// get collection names of all themes that use this layer
+ vector<string> CATFVec;
+ vector<string> CATVec;
+ vector<string> CTVec;
+ string ss = "SELECT theme_id FROM te_theme WHERE layer_id = " + Te2String(layer->id());
+ portal->freeResult();
+ if(portal->query(ss))
+ {
+ while(portal->fetchRow())
+ {
+ int id = atoi(portal->getData(0));
+ if(id != theme->id())
+ {
+ TeTheme* t = themeMap[id];
+ TeAttrTableVector& tableVec = t->attrTables();
+ for(i=0; i<tableVec.size(); i++)
+ {
+ string s = t->collectionAuxTable();
+ if(tableVec[i].tableType() == TeFixedGeomDynAttr)
+ CATFVec.push_back(s);
+ else
+ CATVec.push_back(s);
+ }
+ string s = t->collectionTable();
+ CTVec.push_back(s);
+ }
+ }
+ }
+ delete portal;
+
+// delete selected objects of the collections of other themes
+ for(i=0; i<CTVec.size(); i++)
+ {
+ for(i=0; i<selVec.size(); i++)
+ {
+ del = "DELETE FROM " + CTVec[i] + " WHERE c_object_id IN " + selVec[i];
+ if(db->execute(del) == false)
+ return db->errorMessage();
+ }
+ }
+
+// delete selected objects of the collection this theme
+ for(i=0; i<selVec.size(); i++)
+ {
+ del = "DELETE FROM " + CT + " WHERE c_object_id IN " + selVec[i];
+ if(db->execute(del) == false)
+ return db->errorMessage();
+ }
+
+ up = "UPDATE " + CT + " SET c_object_status = c_object_status - 1 WHERE (c_object_status = 1 OR c_object_status = 3)";
+ if(db->execute(up) == false)
+ return db->errorMessage();
+
+// delete selected instances of the auxiliar collection of other themes (only TeFixedGeomDynAttr)
+ if(ttable.size())
+ {
+ for(i=0; i<CATFVec.size(); i++)
+ {
+ del = "DELETE FROM " + CATFVec[i] + " WHERE aux0 IN " + tsel;
+ if(db->execute(del) == false)
+ return db->errorMessage();
+ }
+ }
+
+// delete selected instances of the auxiliar collection of other themes (TeAttrStatic and TeAttrEvent)
+ unsigned int j;
+ for(i=0; i<CATVec.size(); i++)
+ {
+ for(j=0; j<selVec.size(); j++)
+ {
+ del = "DELETE FROM " + CATVec[i] + " WHERE object_id IN " + selVec[j];
+ if(db->execute(del) == false)
+ return db->errorMessage();
+ }
+ }
+
+// delete selected instances of the auxiliar collection this theme
+ del = "DELETE FROM " + CAT + " WHERE grid_status = 1 OR grid_status = 3";
+ if(db->execute(del) == false)
+ return db->errorMessage();
+
+ return "";
+}
+
+bool TeCopyDatabase(TeDatabase* dbFrom, TeDatabase* dbTo)
+{
+ // -- Step 1 : copies the external tables
+ TeAttrTableVector externs;
+ dbFrom->getAttrTables(externs,TeAttrExternal);
+ if (!externs.empty())
+ {
+ TeDatabasePortal* portal = dbFrom->getPortal();
+ if (!portal)
+ {
+ // log error here
+ return false;
+ }
+
+ for (unsigned int nt=0; nt < externs.size(); nt++)
+ {
+ TeTable table = externs[nt];
+ table.setId(-1);
+ string sql = "select * from " + table.name();
+ if (!portal->query(sql) || portal->numRows() == 0)
+ {
+ portal->freeResult();
+ continue;
+ }
+ if (!dbTo->createTable(table.name(),table.attributeList()))
+ {
+ portal->freeResult();
+ continue;
+ }
+ unsigned int nr=0;
+ while (portal->fetchRow())
+ {
+ TeTableRow row;
+ for(int i = 0; i < portal->numFields(); i++)
+ row.push_back(portal->getData(i));
+ table.add(row);
+ nr++;
+ if (nr % 200)
+ {
+ dbTo->insertTable(table);
+ table.clear();
+ nr = 0;
+ }
+ }
+ if (table.size() >0)
+ dbTo->insertTable(table);
+ table.clear();
+ dbTo->insertTableInfo(-1,table);
+ portal->freeResult();
+ }
+ delete portal;
+ }
+
+ // -- Step 2: Copies the layers
+ if(!dbFrom->loadLayerSet())
+ {
+ // log error here
+ return false;
+ }
+
+ TeLayerMap& fromLayerMap = dbFrom->layerMap();
+ TeLayerMap::iterator itFrom = fromLayerMap.begin();
+
+ while(itFrom != fromLayerMap.end())
+ {
+ TeLayer* fromLayer = (*itFrom).second;
+ TeLayer* toLayer = new TeLayer(fromLayer->name(), dbTo, fromLayer->projection());
+ map<string, string> tables;
+ if (!TeCopyLayerToLayer(fromLayer, toLayer, &tables))
+ {
+ // log error here: layer couldn�t be copied
+ }
+ ++itFrom;
+ }
+ // -- Set 3: Copies the views and themes
+ if(!dbFrom->loadViewSet(dbFrom->user()))
+ {
+ // log error here
+ return false;
+ }
+
+ if(!dbTo->loadLayerSet())
+ {
+ // log error here
+ return false;
+ }
+
+ TeViewMap& fromViewMap = dbFrom->viewMap();
+ TeViewMap::iterator itvFrom = fromViewMap.begin();
+ while (itvFrom != fromViewMap.end())
+ {
+ TeView* fromView = (*itvFrom).second;
+ TeView* toView = new TeView();
+
+ TeProjection* toViewProjection = 0;
+ if (fromView->projection())
+ toViewProjection = TeProjectionFactory::make(fromView->projection()->params());
+
+ toView->projection(toViewProjection);
+ toView->name(fromView->name());
+ toView->user(dbTo->user());
+ toView->isVisible(fromView->isVisible());
+
+ if (!dbTo->insertView(toView))
+ {
+ // log error here
+ ++itvFrom;
+ continue;
+ }
+
+ TeLayerMap& toLayerMap = dbTo->layerMap();
+ vector<TeViewNode*>& themeVec = fromView->themes();
+ for (unsigned int i = 0; i < themeVec.size(); ++i)
+ {
+ TeTheme* themeFrom = (TeTheme*) themeVec[i];
+ string fromLayerName = themeFrom->layer()->name();
+ TeLayer* toLayer = 0;
+ TeLayerMap::iterator itTo = toLayerMap.begin();
+ while(itTo != toLayerMap.end())
+ {
+ if(itTo->second->name() == fromLayerName)
+ {
+ toLayer = itTo->second;
+ break;
+ }
+ ++itTo;
+ }
+
+ if (!toLayer )
+ {
+ // log error here
+ continue;
+ }
+
+ TeTheme* themeTo = new TeTheme(themeFrom->name(), toLayer);
+ toView->add(themeTo);
+
+ themeTo->outOfCollectionLegend(themeFrom->outOfCollectionLegend());
+ themeTo->withoutDataConnectionLegend(themeFrom->withoutDataConnectionLegend ());
+ themeTo->defaultLegend(themeFrom->defaultLegend());
+ themeTo->pointingLegend(themeFrom->pointingLegend());
+ themeTo->queryLegend(themeFrom->queryLegend());
+
+ TeAttrTableVector tftablevec = themeFrom->attrTables();
+ TeAttrTableVector tttablevec;
+
+ for (unsigned int nt=0; nt<tftablevec.size(); nt++)
+ {
+ TeTable attTable(tftablevec[nt].name());
+ dbTo->loadTableInfo(attTable);
+ tttablevec.push_back(attTable);
+ }
+ themeTo->setAttTables(tttablevec);
+ themeTo->attributeRest(themeFrom->attributeRest());
+ themeTo->temporalRest(themeFrom->temporalRest());
+ themeTo->spatialRest(themeFrom->spatialRest());
+ themeTo->visibleRep(themeFrom->visibleRep());
+ if(!themeTo->save() || !themeTo->buildCollection())
+ {
+ // log error here
+ continue;
+ }
+ themeTo->generateLabelPositions();
+
+ if(themeFrom->grouping())
+ {
+ TeGrouping* grouping = new TeGrouping();
+ (*grouping) = (*themeFrom->grouping());
+
+ themeTo->buildGrouping(grouping);
+ TeLegendEntryVector& legends = themeFrom->legend();
+ for (unsigned int nl=0; nl<legends.size(); nl++)
+ themeTo->setGroupingVisual(nl+1,legends[nl].getVisualMap());
+ if (!themeTo->saveGrouping())
+ {
+ // log error here
+ }
+ }
+ } // end for each theme
+ ++itvFrom;
+ } // end for each view
+ return true;
+}
+
+
+
diff --git a/src/terralib/application/TeDatabaseUtils.h b/src/terralib/application/TeDatabaseUtils.h
new file mode 100644
index 0000000..3901baa
--- /dev/null
+++ b/src/terralib/application/TeDatabaseUtils.h
@@ -0,0 +1,179 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeDatabaseUtils.h
+ This contains some utilitary functions to create some tables useful for
+ TerraView like applications.
+*/
+#ifndef __TERRALIB_INTERNAL_DATABASEUTILS_H
+#define __TERRALIB_INTERNAL_DATABASEUTILS_H
+
+#include "TeThemeApplication.h"
+#include <TeDatabase.h>
+#include <string>
+#include <map>
+
+class TeView;
+struct TeKernelParams;
+
+
+/*!
+ \fn bool createColorSchemeTable(TeDatabase* db, const string& tname="te_color_scheme")
+ \brief Creates a standard TerraView table to store color ramps
+ \param db pointer to an opened database connection
+ \note The table created will have the following scheme:
+
+ \par --------------------------------------------------
+ \par | ramp_name | color_order | red | green | blue |
+ \par ----------------------------------------------------
+ \par | red | 1 | 255 | 256 | 256 |
+ \par | red | 2 | 196 | 195 | 256 |
+ \par | red | 3 | 123 | 124 | 256 |
+ \par | green | 1 | 0 | 256 | 123 |
+ \par | ... | ... | ... | ... | ... |
+ \par ---------------------------------------------------
+*/
+bool createColorSchemeTable(TeDatabase* db, const string& tname="te_color_scheme");
+
+//! Populates a color scheme table with 30 ramp colors, each ramp with 13 shades
+bool populateColorSchemeTable(TeDatabase* db, const string& tname="te_color_scheme");
+
+//! Insert a ramp color entry in the database
+bool insertRampColor(TeDatabase* bd, const string& name, int order, TeColor& color, const string& tableName = "te_color_scheme");
+
+//! Insert some default colors a grid color table
+bool updateGridColor(TeDatabase* bd, int themeId, TeObjectSelectionMode sel, TeColor& color);
+
+//! Creates table to store information about the results of Kernel algorithm
+bool createKernelMetadataTable(TeDatabase* db);
+
+//! Inserts kernel parameters
+bool insertKernelMetadata(TeDatabase* db, TeKernelParams& kernelPar);
+
+//! Updates kernel parameters in a database -- inserts if it does not exist
+bool updateKernelMetadata(TeDatabase* db, TeKernelParams& kernelPar);
+
+//! Creates a table to store multimedia documents
+bool createMediaTable(TeDatabase* db, const string& tname);
+
+//! Creates a table to store the association between objects of a layer and its multimedia attributes
+bool createLayerMediaTable(TeDatabase* db, int layerId, const string& tname);
+
+//! Inserts a new media file in a database
+bool insertMedia(TeDatabase* db, const string& tableName, string fileName, const string& description, const string& type, bool blob=true);
+
+//! Associates a media data to an object of a layer
+bool insertMediaObjLayer (TeDatabase* db, TeLayer* layer, const string& objectId, const string& mediaName, const string& mediaTable);
+
+//! Sets a media as a default media of an object of a layer
+bool setDefaultMedia(TeDatabase* db, TeLayer* layer, const string& objectId, const string& mediaName, const string& mediaTable);
+
+//! Updates a media description in a database
+bool updateMediaDescription(TeDatabase* db, const string& mediaName, const string& mediaTable, const string& desc);
+
+//! Load the kernel parameters
+bool loadKernelParams (TeDatabase* db, int supThemeId, const string& supTableName, const string& supAttrName, TeKernelParams& KernelPar);
+
+//! Load the kernel parameters
+bool loadKernelParams (TeDatabase* db, int LayerId, TeKernelParams& KernelPar);
+
+//! Creates a table to store parameters of bar and pie charts
+bool createChartParamsTable(TeDatabase* db, bool integrity=false);
+
+//! Retrieves the location of pie/bar charts over the objects of a theme
+bool locatePieBar (TeDatabase* db, TeThemeApplication* theme, TeCoord2D pt, double delta);
+
+//! Load the charts parameters of a theme in the database
+bool loadChartParams (TeDatabase* db, TeThemeApplication *theme);
+
+//! Sets the location of pie/bar charts over the objects of a theme
+bool updatePieBarLocation (TeDatabase* db, TeThemeApplication* theme, TeCoord2D pt);
+
+//! Sets the location of point of a layer
+bool updatePointLocation (TeDatabase* db, TeThemeApplication* theme, TeCoord2D pt);
+
+//! Insert the chart parameters of a theme in the database
+bool insertChartParams(TeDatabase* bd, TeThemeApplication *theme);
+
+//! Delete the chart parameters of a theme in the database
+bool deleteChartParams (TeDatabase* bd, TeThemeApplication *theme);
+
+//! Loads a set of views that belongs to a user
+bool loadViewSet(TeDatabase* db, const string& user);
+
+//! Updates the parameters of a view
+bool updateView(TeDatabase* db, TeView *view);
+
+//! Creates a table to store other information about the theme
+bool createThemeApplicationTable(TeDatabase* db, bool integrity=false);
+
+//! Populates the te_theme_application table with default parameters
+bool populateThemeApplicationTable(TeDatabase* db);
+
+//! Loads the parameters of a ThemeApplication
+bool loadThemeApplication (TeDatabase* db, TeThemeApplication *theme, const string& tableName="te_theme_application");
+
+//! Saves the parameters of a ThemeApplication
+bool insertThemeApplication (TeDatabase* db, TeThemeApplication *theme, const string& tableName="te_theme_application");
+
+//! Updates the parameters of a theme application
+bool updateThemeApplication (TeDatabase* db, TeThemeApplication *theme);
+
+//! Delete a theme application
+bool deleteThemeApplication (TeDatabase* db, int themeId);
+
+//! Recursive load view tree from a database
+TeViewTree* loadViewTree(TeDatabase* db, TeView* view, int id);
+
+//! Updates a tree view structure in a database
+bool updateViewTree (TeDatabase* db, TeViewTree *tree);
+
+//! Creates a table to store metadata about layers
+int createTeLayerMetadata(TeDatabase* db);
+
+//! Creates a table to store metadata about attribute tables
+int createTeTableMetadata(TeDatabase* db);
+
+//! Removes tables that visual of texts associated to a layer
+bool deleteTextVisual(TeLayer* layer);
+
+//! Returns true whether a database contains the TerraLib data model
+bool isTerralibModel(TeDatabase* db);
+
+//! insert a new object into collection
+string insertObjectIntoCollection(TeTheme* theme, TeCoord2D p, string newId, string newTId = "");
+
+//! delete pointed objects
+string deletePointedObjects(TeTheme* theme, TeBox& box);
+
+//! \fn bool TeCopyDatabase(TeDatabase* dbFrom, TeDatabase* dbTo)
+/*
+ \brief This function copies the contents of a TerraLib database to another TerraLib database
+ \param dbFrom A pointer to the source database
+ \param dbTo A pointer to the destination database
+*/
+bool TeCopyDatabase(TeDatabase* dbFrom, TeDatabase* dbTo);
+
+
+#endif
+
diff --git a/src/terralib/application/TeGUIUtils.cpp b/src/terralib/application/TeGUIUtils.cpp
new file mode 100644
index 0000000..563e40f
--- /dev/null
+++ b/src/terralib/application/TeGUIUtils.cpp
@@ -0,0 +1,141 @@
+#include "TeGUIUtils.h"
+#include <TeViewNode.h>
+#include <TeThemeApplication.h>
+
+bool fillThemeCombo(TeGeomRep tg, TeView* view, QComboBox* cBox, string selName, bool clear)
+{
+ vector<TeViewNode *> themeVec = view->themes();
+// bool enableWindow = false;
+
+ if (clear)
+ cBox->clear();
+
+ int idx = 0;
+ int count = 0;
+
+ for(unsigned int i=0; i<themeVec.size(); i++)
+ {
+ TeThemeApplication* t = (TeThemeApplication *)themeVec[i];
+ if(t->layer()->hasGeometry(tg))
+ {
+ cBox->insertItem(t->name().c_str());
+ if (!t->name().compare(selName)) {
+ idx = count;
+ }
+ count++;
+ }
+ }
+
+ if (count > 0) {
+ cBox->setCurrentItem(idx);
+ }
+
+ return (count > 0);
+}
+
+
+bool fillTableCombo(TeView* view,
+ QComboBox *cTableCombo,
+ QComboBox *cThemeCombo,
+ string selName, bool clear)
+{
+ TeTable ttable;
+ string tableName;
+ string themeName = string(cThemeCombo->currentText().ascii());
+ TeTheme* currTheme = view->get(themeName);
+
+ if (currTheme == NULL)
+ return false;
+
+ TeAttrTableVector atvec;
+ currTheme->getAttTables(atvec);
+
+ if (atvec.size() == 0)
+ return false;
+
+ if (clear)
+ cTableCombo->clear();
+ int idx = 0;
+
+ for(unsigned int i=0; i<atvec.size(); i++)
+ {
+ TeTable ttable = atvec[i];
+ tableName = ttable.name();
+ cTableCombo->insertItem(tableName.c_str());
+ if (!selName.compare(tableName)) {
+ idx = i;
+ }
+ }
+
+ cTableCombo->setCurrentItem(idx);
+ return true;
+}
+
+
+bool fillColumnCombo(TeAttrDataType aType,
+ TeTheme* theme,
+ QComboBox *cColumnCombo,
+ QComboBox *cTableCombo,
+ string selName, bool clear) {
+
+// bool done = false;
+
+ TeAttributeList columns;
+ TeAttrTableVector atvec;
+ theme->getAttTables(atvec);
+
+ string tableName = string(cTableCombo->currentText().ascii());
+ unsigned int t;
+
+ for (t = 0; t < atvec.size(); t++) {
+ if (!tableName.compare(atvec[t].name()))
+ break;
+ }
+
+ if (t == atvec.size())
+ return false;
+
+ TeTable ttable = atvec[t];
+ columns = ttable.attributeList();
+
+ if (clear)
+ cColumnCombo->clear();
+
+ int idx = 0;
+ int count = 0;
+
+ for(unsigned int i=0; i<columns.size(); i++)
+ {
+ int type = columns[i].rep_.type_;
+ string colName = columns[i].rep_.name_;
+ if ((aType == TeUNKNOWN) || (type == aType)) {
+ cColumnCombo->insertItem(colName.c_str());
+ if (!selName.compare(colName)) {
+ idx = count;
+ }
+ count++;
+ }
+ }
+
+ if (count > 0)
+ cColumnCombo->setCurrentItem(idx);
+
+ return count> 0;
+}
+
+bool fillColumnCombo(vector<TeAttrDataType> &aTypeVec,
+ TeTheme* theme,
+ QComboBox *cColumnCombo,
+ QComboBox *cTableCombo,
+ string selName, bool clear)
+{
+ bool result = true;
+
+ for(unsigned int i = 0; i < aTypeVec.size(); i++)
+ {
+ result = fillColumnCombo(aTypeVec[i], theme, cColumnCombo, cTableCombo, selName, clear);
+ if(!result)
+ return false;
+ }
+ return true;
+}
diff --git a/src/terralib/application/TeGUIUtils.h b/src/terralib/application/TeGUIUtils.h
new file mode 100644
index 0000000..4fc5ecd
--- /dev/null
+++ b/src/terralib/application/TeGUIUtils.h
@@ -0,0 +1,42 @@
+#ifndef __GUIUTILSH
+#define __GUIUTILSH
+
+#include <TeDataTypes.h>
+#include <TeView.h>
+#include <qcombobox.h>
+/**
+ * Acha temas na vista que contenham geometria de um determinado tipo
+ **/
+bool fillThemeCombo(TeGeomRep tg,
+ TeView* view,
+ QComboBox* cBox,
+ string selName, bool clear=true);
+
+/**
+ * Acha tabelas de um tema, de um determinado tipo
+ **/
+
+bool fillTableCombo(TeView* view,
+ QComboBox *cTableCombo,
+ QComboBox *cThemeCombo,
+ string selName, bool clear=true);
+
+/**
+ * Acha colunas de uma tabela, com um determinado tipo
+ **/
+bool fillColumnCombo(TeAttrDataType aType,
+ TeTheme* theme,
+ QComboBox *cColumnCombo,
+ QComboBox *cTableCombo,
+ string selName, bool clear=true);
+
+/**
+ * Acha colunas de uma tabela, com mais de um determinado tipo
+ **/
+bool fillColumnCombo(vector<TeAttrDataType> &aTypeVec,
+ TeTheme* theme,
+ QComboBox *cColumnCombo,
+ QComboBox *cTableCombo,
+ string selName, bool clear=true);
+
+#endif
diff --git a/src/terralib/application/TeMSVFactory.cpp b/src/terralib/application/TeMSVFactory.cpp
new file mode 100644
index 0000000..3569ca9
--- /dev/null
+++ b/src/terralib/application/TeMSVFactory.cpp
@@ -0,0 +1,163 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeMSVFactory.h>
+#include <vector>
+
+using namespace std;
+
+static TeSemivariogram_Factory semivar("Semivariogram");
+static TeCorrelogram_Factory correlo("Correlogram");
+static TeSemimadogram_Factory semimad("Semimadogram");
+static TeCovariance_Factory covaria("Covariance");
+
+
+///////////////////////////////
+TeMatrix
+TeSemivariogram :: calculate ()
+{
+ TeMatrix msvar;
+ vector<double> dis, gam, np;
+ double dmin, dmax, dirmin, dirmax, tolincr, inc;
+ int lin, col, nl, nrow, ncol;
+
+ // Le o n�mero de linha e coluna da matriz de entrada
+ nrow = MSVmatrix_->Nrow()-1;
+ ncol = MSVmatrix_->Ncol()-1;
+
+ // Inicializa a matriz de retorno
+ msvar.Init((int)MSVnlag_, 2.);
+
+ // Inicializa vetores auxiliares
+ for (nl=0; nl<MSVnlag_; ++nl)
+ {
+ np.push_back(0.);
+ dis.push_back(0.);
+ gam.push_back(0.);
+ }
+
+ // Define a tolerancia do incremento = 50% do increm.
+ tolincr = MSVincr_/2.;
+
+ // Define dire��o minima e m�xima
+ dirmin = dirmax = 0.0;
+ if (MSVtoldir_ != 90.0)
+ {
+ dirmin = MSVdir_ - MSVtoldir_;
+ dirmax = MSVdir_ + MSVtoldir_;
+ }
+
+ // Inicializa variavel auxiliar
+ inc = MSVincr_;
+
+ for (nl=0; nl<MSVnlag_; ++nl)
+ {
+ dmin = inc - tolincr;
+ dmax = inc + tolincr;
+
+ for (lin=0; lin<nrow; ++lin)
+ {
+ for (col=0; col<ncol; ++col)
+ {
+ if ( MSVtoldir_ == 90.0) // Omnidirecional
+ {
+ if ( lin<col && (*MSVmatrix_)(lin,col)>0. && (*MSVmatrix_)(lin,col)<=tolincr && nl==0 )
+ {
+ np[nl] = np[nl] + 1.;
+ dis[nl] = dis[nl] + (*MSVmatrix_)(lin,col);
+ gam[nl] = gam[nl] + (( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ) * ( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ));
+ }
+ else if ( lin<col && (*MSVmatrix_)(lin,col)>dmin && (*MSVmatrix_)(lin,col)<=dmax && nl!=0 )
+ {
+ np[nl] = np[nl] + 1.;
+ dis[nl] = dis[nl] + (*MSVmatrix_)(lin,col);
+ gam[nl] = gam[nl] + (( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ) * ( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ));
+ }
+ }
+ else // Direcional
+ {
+ if ( lin<col && (*MSVmatrix_)(lin,col)>0. && (*MSVmatrix_)(lin,col)<=tolincr && (*MSVmatrix_)(col,lin)>=dirmin && (*MSVmatrix_)(col,lin)<=dirmax && nl==0 )
+ {
+ np[nl] = np[nl] + 1.;
+ dis[nl] = dis[nl] + (*MSVmatrix_)(lin,col);
+ gam[nl] = gam[nl] + (( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ) * ( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ));
+ }
+ else if ( lin<col && (*MSVmatrix_)(lin,col)>dmin && (*MSVmatrix_)(lin,col)<=dmax && (*MSVmatrix_)(col,lin)>=dirmin && (*MSVmatrix_)(col,lin)<=dirmax && nl!=0 )
+ {
+ np[nl] = np[nl] + 1.;
+ dis[nl] = dis[nl] + (*MSVmatrix_)(lin,col);
+ gam[nl] = gam[nl] + (( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ) * ( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ));
+ }
+ }
+ }
+ }
+ if (nl != 0)
+ inc = MSVincr_ + inc;
+ }
+
+ // Reporta o semivariograma
+ for (nl=0; nl<MSVnlag_; ++nl)
+ {
+
+ if (np[nl] != 0)
+ {
+ dis[nl] = dis[nl] / np[nl];
+ gam[nl] = (gam[nl] / np[nl])*.5;
+ }
+
+ //Preenche a matriz de retorno da funcao
+ msvar(nl,0) = dis[nl];
+ msvar(nl,1) = gam[nl];
+ }
+ return msvar;
+}
+
+
+///////////////////////////////
+TeMatrix
+TeCorrelogram :: calculate ()
+{
+ TeMatrix msvar;
+
+ return msvar;
+}
+
+
+///////////////////////////////
+TeMatrix
+TeSemimadogram :: calculate ()
+{
+ TeMatrix msvar;
+
+ return msvar;
+}
+
+
+///////////////////////////////
+TeMatrix
+TeCovariance :: calculate ()
+{
+ TeMatrix msvar;
+
+ return msvar;
+}
diff --git a/src/terralib/application/TeMSVFactory.h b/src/terralib/application/TeMSVFactory.h
new file mode 100644
index 0000000..e06b44b
--- /dev/null
+++ b/src/terralib/application/TeMSVFactory.h
@@ -0,0 +1,192 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_SPATIALMEASUREFACTORY_H
+#define __TERRALIB_INTERNAL_SPATIALMEASUREFACTORY_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+
+#include <map>
+#include <string>
+#include <TeMatrix.h>
+#include <TeFactory.h>
+
+using namespace std;
+
+// -- Struct of Parameters
+struct TeMSVParams
+{
+ TeMatrix MSVPmatrix_;
+ double MSVPdir_;
+ double MSVPtoldir_;
+ double MSVPincr_;
+ double MSVPnlag_;
+};
+
+// -- Measures of Spatial Variability
+class TeMSV
+{
+public:
+ TeMSV (){};
+ virtual ~TeMSV () {}
+
+ virtual TeMatrix calculate ()=0;
+ static TeMSV* DefaultObject(TeMSVParams){ return 0; }
+ void setMatrix(TeMatrix* m) {MSVmatrix_ = m;}
+
+protected:
+ TeMatrix* MSVmatrix_;
+ double MSVdir_;
+ double MSVtoldir_;
+ double MSVincr_;
+ double MSVnlag_;
+};
+
+
+//////////////////////////////////
+class TeSemivariogram : public TeMSV
+{
+public:
+ TeSemivariogram(const TeMSVParams& params){
+ MSVdir_ = params.MSVPdir_;
+ MSVtoldir_ = params.MSVPtoldir_;
+ MSVincr_ = params.MSVPincr_;
+ MSVnlag_ = params.MSVPnlag_;
+ }
+
+ ~TeSemivariogram() { }
+
+ virtual TeMatrix calculate ();
+};
+
+
+////////////////////////////////////
+class TeCorrelogram : public TeMSV
+{
+public:
+ TeCorrelogram(const TeMSVParams& params){
+ MSVdir_ = params.MSVPdir_;
+ MSVtoldir_ = params.MSVPtoldir_;
+ MSVincr_ = params.MSVPincr_;
+ MSVnlag_ = params.MSVPnlag_;
+ }
+
+ ~TeCorrelogram(){};
+
+ virtual TeMatrix calculate ();
+};
+
+////////////////////////////////////
+class TeSemimadogram : public TeMSV
+{
+public:
+ TeSemimadogram(const TeMSVParams& params){
+ MSVdir_ = params.MSVPdir_;
+ MSVtoldir_ = params.MSVPtoldir_;
+ MSVincr_ = params.MSVPincr_;
+ MSVnlag_ = params.MSVPnlag_;
+ }
+
+ ~TeSemimadogram(){};
+
+ virtual TeMatrix calculate ();
+};
+
+////////////////////////////////////
+class TeCovariance : public TeMSV
+{
+public:
+ TeCovariance(const TeMSVParams& params){
+ MSVdir_ = params.MSVPdir_;
+ MSVtoldir_ = params.MSVPtoldir_;
+ MSVincr_ = params.MSVPincr_;
+ MSVnlag_ = params.MSVPnlag_;
+ }
+
+ ~TeCovariance(){};
+
+ virtual TeMatrix calculate ();
+};
+
+
+
+
+
+
+//////////////////////////////////////////////
+// -- Factory: Measures of Spatial Variability
+
+class TeMSVFactory : public TeFactory<TeMSV, TeMSVParams>
+{
+public:
+ TeMSVFactory(const string& name) : TeFactory<TeMSV, TeMSVParams>(name){}
+ virtual TeMSV* build(const TeMSVParams&) = 0;
+};
+
+
+/////////////////////////////
+class TeSemivariogram_Factory : public TeMSVFactory
+{
+public:
+ TeSemivariogram_Factory (const string& name) : TeMSVFactory(name){}
+
+ virtual TeMSV* build(const TeMSVParams& params){return new TeSemivariogram(params);}
+};
+
+
+/////////////////////////////
+class TeCorrelogram_Factory : public TeMSVFactory
+{
+public:
+ TeCorrelogram_Factory (const string& name) : TeMSVFactory (name){}
+
+ virtual TeMSV* build (const TeMSVParams& params){return new TeCorrelogram(params);}
+};
+
+
+/////////////////////////////
+class TeSemimadogram_Factory : public TeMSVFactory
+{
+public:
+ TeSemimadogram_Factory (const string& name) : TeMSVFactory (name){}
+
+ virtual TeMSV* build (const TeMSVParams& params){return new TeSemimadogram(params);}
+};
+
+
+/////////////////////////////
+class TeCovariance_Factory : public TeMSVFactory
+{
+public:
+ TeCovariance_Factory (const string& name) : TeMSVFactory (name){}
+
+ virtual TeMSV* build (const TeMSVParams& params){return new TeCovariance(params);}
+};
+
+
+#endif
+
+
diff --git a/src/terralib/application/TePlotTheme.h b/src/terralib/application/TePlotTheme.h
new file mode 100644
index 0000000..9bdee90
--- /dev/null
+++ b/src/terralib/application/TePlotTheme.h
@@ -0,0 +1,2155 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TePlotTheme.h
+ This file contains support to plot a theme on a canvas
+*/
+#ifndef __TERRALIB_INTERNAL_PLOTTHEME_H
+#define __TERRALIB_INTERNAL_PLOTTHEME_H
+
+#include "TeThemeApplication.h"
+#include "TeDatabase.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeVectorRemap.h"
+#include "TeDecoderMemory.h"
+#include <time.h>
+#include <set>
+#include "TeApplicationUtils.h"
+
+template<class Canvas, class Progress>
+void TePlotTextWV(TeThemeApplication* theme, Canvas* canvas, Progress * progress, TeBox box = TeBox())
+{
+ if ((theme->visibleRep() & TeTEXT) == 0)
+ return;
+
+ if(theme->textTable().empty())
+ return;
+ TeDatabase* db = theme->layer()->database();
+ if(db->tableExist(theme->textTable()) == false)
+ return;
+ canvas->setDataProjection (theme->layer()->projection());
+ TeDatabasePortal* plot = db->getPortal();
+
+ string tabtx = theme->textTable();
+ string tabs = theme->collectionTable();
+
+ string wherebox;
+ if(box.isValid())
+ {
+ wherebox = "NOT (x >= " + Te2String(box.x2()+4*box.width());
+ wherebox += " OR y >= " + Te2String(box.y2()+2*box.height());
+ wherebox += " OR x <= " + Te2String(box.x1()-4*box.width());
+ wherebox += " OR y <= " + Te2String(box.y1()-2*box.height()) + ")";
+ }
+ else
+ {
+ wherebox = getWhereBox(plot, theme, canvas, TeTEXT, box);
+ if(wherebox.empty())
+ {
+ TeBox box = canvas->getDataWorld();
+ wherebox = " x >= " + Te2String(box.x1());
+ wherebox += " AND x <= " + Te2String(box.x2());
+ wherebox += " AND y >= " + Te2String(box.y1());
+ wherebox += " AND y <= " + Te2String(box.y2());
+ }
+ }
+
+ // calculate initial filed number for collection and legenda (sind and vind)
+ int sind=0, vind=0;
+ string ind = "SELECT * FROM " + tabtx + " WHERE object_id < ' '";
+ plot->freeResult();
+ if (plot->query (ind))
+ sind = plot->AttributeList().size();
+
+ ind = "SELECT * FROM " + tabs + " WHERE c_object_id < ' '";
+ plot->freeResult();
+ if (plot->query (ind))
+ vind = plot->AttributeList().size() + sind;
+
+ int numrows = 0;
+ string conta = "SELECT COUNT(*) FROM " + tabs;
+ plot->freeResult();
+ if (plot->query (conta))
+ {
+ if(plot->fetchRow())
+ numrows = atoi(plot->getData(0));
+ }
+ delete plot;
+
+ string tabv = tabtx + "_txvisual";
+ string sa = "SELECT " + tabtx + ".*, " + tabv + ".*, " + tabs + ".* ";
+ sa += "FROM " + tabtx + ", " + tabv + ", " + tabs;
+ sa += " WHERE (" + tabs + ".c_object_id = " + tabtx + ".object_id";
+ sa += " AND " + tabtx + ".geom_id = " + tabv + ".geom_id)";
+ string squery;
+ squery = sa + " AND (" + wherebox + ")";
+ plotTextWV(theme, canvas, squery, progress);
+
+ string othersQuery = "SELECT " + tabtx + ".*, " + tabv + ".* ";
+ othersQuery += "FROM " + tabtx + ", " + tabv;
+ othersQuery += " WHERE " + tabtx + ".geom_id = " + tabv + ".geom_id";
+ othersQuery += " AND " + tabtx + ".object_id = 'TE_NONE_ID'";
+ plotTextWV(theme, canvas, othersQuery, progress);
+}
+
+template<class Canvas, class Progress>
+void plotTextWV(TeThemeApplication *theme, Canvas *canvas, string query, Progress *progress)
+{
+ TeText text;
+ int np = 0;
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+ TeDatabasePortal* plot = theme->layer()->database()->getPortal();
+
+ if(progress == 0)
+ {
+ if(plot->query(query) && plot->fetchRow())
+ {
+ t1 = clock();
+ t2 = t1;
+ bool flag = true;
+ do
+ {
+ bool bold = false, italic = false;
+ int size;
+ int dot_height = atoi(plot->getData(10));
+ bool fixedSize = atoi(plot->getData(11));
+ int rgb = atoi(plot->getData(12));
+ TeColor cor((rgb >> 16) & 0xff, (rgb >> 8) & 0xff, rgb & 0xff);
+ string family = plot->getData(13);
+ if(atoi(plot->getData(14)))
+ bold = true;
+ if(atoi(plot->getData(15)))
+ italic = true;
+
+ flag = plot->fetchGeometry(text);
+ if(fixedSize == false && text.height() > 0.)
+ {
+ TeBox wbox = canvas->getDataWorld();
+ TeCoord2D p1(wbox.x1_, wbox.y1_);
+ TeCoord2D p2(p1.x() + text.height(), p1.y() + text.height());
+ TeBox box(p1, p2);
+ canvas->mapWtoV(box);
+ size = int(box.height());
+ }
+ else
+ size = dot_height;
+
+ canvas->setTextColor(cor.red_, cor.green_, cor.blue_);
+ canvas->setTextStyle (family, size, bold, italic );
+ TeVisual visual;
+ visual.size(size);
+ visual.family(family);
+ visual.bold(bold);
+ visual.italic(italic);
+ visual.fixedSize(fixedSize);
+ visual.ptAngle((int)text.angle());
+
+ canvas->plotText (text, visual);
+ np++;
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmapToWindow();
+ }
+ } while (flag);
+ canvas->copyPixmapToWindow();
+ }
+ }
+ else
+ {
+ int steps = 0;
+ string conta = query;
+ int ff;
+ if((ff=conta.find(" FROM ")) >= 0)
+ conta.replace(0, ff, "SELECT COUNT(*)");
+ if((ff=conta.find("ORDER BY")) >= 0)
+ conta.erase(ff, conta.size()-ff);
+ plot->freeResult();
+ if(plot->query(conta) && plot->fetchRow())
+ steps = atoi(plot->getData(0));
+
+ plot->freeResult();
+ if(plot->query(query) && plot->fetchRow())
+ {
+ string caption = "Plotando tema: " + theme->name();
+ progress->setCaption(caption.c_str());
+ progress->setLabelText(" Plotagem de textos em andamento, aguarde... ");
+ progress->setTotalSteps(steps);
+ t2 = clock();
+ t0 = t1 = t2;
+ bool flag = true;
+ do
+ {
+ bool bold = false, italic = false;
+ int size;
+ int dot_height = atoi(plot->getData(10));
+ bool fixedSize = atoi(plot->getData(11));
+ int rgb = atoi(plot->getData(12));
+ TeColor cor((rgb >> 16) & 0xff, (rgb >> 8) & 0xff, rgb & 0xff);
+ string family = plot->getData(13);
+ if(atoi(plot->getData(14)))
+ bold = true;
+ if(atoi(plot->getData(15)))
+ italic = true;
+
+ flag = plot->fetchGeometry(text);
+ if(fixedSize == false && text.height() > 0.)
+ {
+ TeBox wbox = canvas->getDataWorld();
+ TeCoord2D p1(wbox.x1_, wbox.y1_);
+ TeCoord2D p2(p1.x() + text.height(), p1.y() + text.height());
+ TeBox box(p1, p2);
+ canvas->mapWtoV(box);
+ size = int(box.height());
+ }
+ else
+ size = dot_height;
+
+ canvas->setTextColor(cor.red_, cor.green_, cor.blue_);
+ canvas->setTextStyle (family, size, bold, italic );
+ TeVisual visual;
+ visual.size(size);
+ visual.family(family);
+ visual.bold(bold);
+ visual.italic(italic);
+ visual.fixedSize(fixedSize);
+ visual.ptAngle((int)text.angle());
+
+ canvas->plotText (text, visual);
+ np++;
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmapToWindow();
+ if(progress->wasCancelled())
+ {
+ progress->reset();
+ break;
+ }
+ if((int)(t2-t0) > dt2)
+ progress->setProgress(np);
+ }
+ } while (flag);
+ canvas->copyPixmapToWindow();
+ }
+ progress->reset();
+ }
+ delete plot;
+}
+
+template<class Canvas, class Progress>
+void TePlotTexts(TeThemeApplication* theme, Canvas* canvas, Progress * progress)
+{
+ if ((theme->visibleRep() & TeTEXT) == 0)
+ return;
+
+ if(theme->textTable().empty())
+ return;
+ TeDatabase* db = theme->layer()->database();
+ if(db->tableExist(theme->textTable()) == false)
+ return;
+ canvas->setDataProjection (theme->layer()->projection());
+ TeDatabasePortal* plot = db->getPortal();
+
+ string tabtx = theme->textTable();
+ string tabs = theme->collectionTable();
+
+ string wherebox = getWhereBox(plot, theme, canvas, TeTEXT);
+ if(wherebox.empty())
+ {
+ TeBox box = canvas->getDataWorld();
+ wherebox = " x >= " + Te2String(box.x1());
+ wherebox += " AND x <= " + Te2String(box.x2());
+ wherebox += " AND y >= " + Te2String(box.y1());
+ wherebox += " AND y <= " + Te2String(box.y2());
+ }
+
+ // calculate initial filed number for collection and legenda (sind and vind)
+ int sind=0, vind=0;
+ string ind = "SELECT * FROM " + tabtx + " WHERE object_id < ' '";
+ plot->freeResult();
+ if (plot->query (ind))
+ sind = plot->AttributeList().size();
+
+ ind = "SELECT * FROM " + tabs + " WHERE c_object_id < ' '";
+ plot->freeResult();
+ if (plot->query (ind))
+ vind = plot->AttributeList().size() + sind;
+
+ int numrows = 0;
+ string conta = "SELECT COUNT(*) FROM " + tabs;
+ plot->freeResult();
+ if (plot->query (conta))
+ {
+ if(plot->fetchRow())
+ numrows = atoi(plot->getData(0));
+ }
+ string sa;
+ string sel;
+ if(plot->getDatabase()->dbmsName() == "OracleSpatial")
+ sel = " SELECT /*+ ordered */ * ";
+ else
+ sel = " SELECT * ";
+
+ delete plot;
+ if(numrows > 0)
+ sa = sel + " FROM (" + tabtx + " INNER JOIN " + tabs;
+ else
+ sa = sel + " FROM (" + tabtx + " LEFT JOIN " + tabs;
+
+ sa += " ON " + tabtx + ".object_id = " + tabs + ".c_object_id) WHERE ";
+
+ string squery;
+ squery = sa + wherebox;
+ plotTexts(theme, canvas, squery, progress);
+
+ string othersQuery = "SELECT * FROM " + tabtx + " WHERE object_id = 'TE_NONE_ID'";
+ plotTexts(theme, canvas, othersQuery, progress);
+}
+
+template<class Canvas, class Progress>
+void plotTexts(TeThemeApplication *theme, Canvas *canvas, string query, Progress *progress)
+{
+ TeText text;
+ int np = 0;
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+ TeDatabasePortal* plot = theme->layer()->database()->getPortal();
+
+ if(progress == 0)
+ {
+ if(plot->query(query) && plot->fetchRow())
+ {
+ t1 = clock();
+ t2 = t1;
+ bool flag = true;
+ do
+ {
+ flag = plot->fetchGeometry(text);
+ setTextAttributes(theme, canvas, text);
+ canvas->plotText (text, theme->defaultLegend().visual(TeTEXT));
+ np++;
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmapToWindow();
+ }
+ } while (flag);
+ canvas->copyPixmapToWindow();
+ }
+ }
+ else
+ {
+ int steps = 0;
+ string conta = query;
+ conta.replace(0, strlen("SELECT *")+1, "SELECT COUNT(*)");
+ int ff;
+ if((ff=conta.find("ORDER BY")) >= 0)
+ conta.erase(ff, conta.size()-ff);
+ plot->freeResult();
+ if(plot->query(conta) && plot->fetchRow())
+ steps = atoi(plot->getData(0));
+
+ plot->freeResult();
+ if(plot->query(query) && plot->fetchRow())
+ {
+ string caption = "Plotando tema: " + theme->name();
+ progress->setCaption(caption.c_str());
+ progress->setLabelText(" Plotagem de textos em andamento, aguarde... ");
+ progress->setTotalSteps(steps);
+ t2 = clock();
+ t0 = t1 = t2;
+ bool flag = true;
+ do
+ {
+ flag = plot->fetchGeometry(text);
+ setTextAttributes(theme, canvas, text);
+ canvas->plotText (text, theme->defaultLegend().visual(TeTEXT));
+ np++;
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmapToWindow();
+ if(progress->wasCancelled())
+ {
+ progress->reset();
+ break;
+ }
+ if((int)(t2-t0) > dt2)
+ progress->setProgress(np);
+ }
+ } while (flag);
+ canvas->copyPixmapToWindow();
+ }
+ progress->reset();
+ }
+ delete plot;
+}
+
+template<class Canvas>
+void setTextAttributes(TeThemeApplication* theme, Canvas* canvas, TeText tx)
+{
+ TeColor cor;
+ static TeVisual snc;
+ string family;
+ static int ssize;
+ int size = 0;
+ bool bold, italic, fixedSize;
+
+ if(theme == 0)
+ {
+ ssize = 0;
+ snc.family("notFamily");
+ return;
+ }
+
+ fixedSize = theme->defaultLegend().visual(TeTEXT).fixedSize(); // font size is fixed
+ if(snc == theme->defaultLegend().visual(TeTEXT))
+ {
+ if(fixedSize == false && tx.height() > 0.)
+ {
+ TeBox wbox = canvas->getDataWorld();
+ TeCoord2D p1(wbox.x1_, wbox.y1_);
+ TeCoord2D p2(p1.x() + tx.height(), p1.y() + tx.height());
+ TeBox box(p1, p2);
+ canvas->mapWtoV(box);
+ size = int(box.height());
+ }
+ else
+ size = theme->defaultLegend().visual(TeTEXT).size(); // font size
+ }
+
+ if(size == 0)
+ {
+ if(fixedSize == false && tx.height() > 0.)
+ {
+ TeBox wbox = canvas->getDataWorld();
+ TeCoord2D p1(wbox.x1_, wbox.y1_);
+ TeCoord2D p2(p1.x() + tx.height(), p1.y() + tx.height());
+ TeBox box(p1, p2);
+ canvas->mapWtoV(box);
+ size = int(box.height());
+ }
+ else
+ size = theme->defaultLegend().visual(TeTEXT).size(); // font size
+ }
+
+ cor = theme->defaultLegend().visual(TeTEXT).color();
+ family = theme->defaultLegend().visual(TeTEXT).family();
+ bold = theme->defaultLegend().visual(TeTEXT).bold();
+ italic = theme->defaultLegend().visual(TeTEXT).italic();
+ fixedSize = theme->defaultLegend().visual(TeTEXT).fixedSize(); // font size is fixed
+
+ canvas->setTextColor(cor.red_, cor.green_, cor.blue_);
+ canvas->setTextStyle (family, size, bold, italic );
+ snc = theme->defaultLegend().visual(TeTEXT);
+ ssize = size;
+}
+
+template<class Canvas, class Progress>
+void plotPieBars(TeThemeApplication *theme, Canvas *canvas, Progress *progress, TeBox ebox = TeBox())
+{
+ if((theme->visibleRep() & 0x80000000) == 0)
+ return;
+
+ int steps = 0;
+ int np = 0;
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 2;
+ clock_t t0, t1, t2;
+ TeDatabasePortal* plot = theme->layer()->database()->getPortal();
+ canvas->setDataProjection (theme->layer()->projection());
+
+ if(theme->chartAttributes_.size() == 0)
+ {
+ delete plot;
+ return;
+ }
+ double width = theme->barWidth();
+ double maxh = theme->barMaxHeight();
+ double minh = theme->barMinHeight();
+ double maxd = theme->pieMaxDiameter();
+ double mind = theme->pieMinDiameter();
+ double diameter = theme->pieDiameter();
+ string FUNC = theme->chartFunction();
+
+ if(theme->keepDimension() != 0)
+ {
+ width = canvas->mapVtoData((int)width);
+ maxh = canvas->mapVtoData((int)maxh);
+ minh = canvas->mapVtoData((int)minh);
+ maxd = canvas->mapVtoData((int)maxd);
+ mind = canvas->mapVtoData((int)mind);
+ diameter = canvas->mapVtoData((int)diameter);
+ }
+
+ unsigned int i;
+ string input, cinput;
+ TeSelectedObjects selectedObjects = theme->chartObjects();
+
+ if(selectedObjects == TeSelectedByPointing)
+ {
+ input = "(grid_status = 1 OR grid_status = 3";
+ input += " OR (grid_status is null AND (c_object_status = 1 OR c_object_status = 3)))";
+ cinput = "(c_object_status = 1 OR c_object_status = 3)";
+ }
+ else if(selectedObjects == TeNotSelectedByPointing)
+ {
+ input = "(grid_status = 0 OR grid_status = 2";
+ input += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 2)))";
+ cinput = "(c_object_status = 0 OR c_object_status = 2)";
+ }
+ else if(selectedObjects == TeSelectedByQuery)
+ {
+ input = "(grid_status = 2 OR grid_status = 3";
+ input += " OR (grid_status is null AND (c_object_status = 2 OR c_object_status = 3)))";
+ cinput = "(c_object_status = 2 OR c_object_status = 3)";
+ }
+ else if(selectedObjects == TeNotSelectedByQuery)
+ {
+ input = "(grid_status = 0 OR grid_status = 1";
+ input += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 1)))";
+ cinput = "(c_object_status = 0 OR c_object_status = 1)";
+ }
+ else if(selectedObjects == TeGrouped)
+ {
+ input = "c_legend_id <> 0";
+ cinput = "c_legend_id <> 0";
+ }
+ else if(selectedObjects == TeNotGrouped)
+ {
+ input = "c_legend_id = 0";
+ cinput = "c_legend_id = 0";
+ }
+
+ canvas->setLineStyle(TeLnTypeContinuous, 0);
+ canvas->setLineColor(0, 0, 0);
+ TeChartType chartType = (TeChartType)theme->chartType();
+ if(chartType == TePieChart)
+ {
+ string wherebox;
+ double delta = diameter / 2.;
+ if(!(theme->pieDimAttribute() == "NONE"))
+ delta = maxd / 2.;
+
+ TeBox box;
+ if(ebox.isValid())
+ box = ebox;
+ else
+ box = canvas->getDataWorld();
+
+ box.x1_ = box.x1_ - delta;
+ box.x2_ = box.x2_ + delta;
+ box.y1_ = box.y1_ - delta;
+ box.y2_ = box.y2_ + delta;
+
+ wherebox = "NOT(label_x > " + Te2String(box.x2_, 10) + " OR ";
+ wherebox = wherebox + "label_x < " + Te2String(box.x1_, 10) + " OR ";
+ wherebox = wherebox + "label_y > " + Te2String(box.y2_, 10) + " OR ";
+ wherebox = wherebox + "label_y < " + Te2String(box.y1_, 10) + ")";
+
+ string attrs, q;
+ for(i=0; i<theme->chartAttributes_.size(); i++)
+ attrs += FUNC + "(" + theme->chartAttributes_[i] + "),";
+ attrs += "AVG(label_x),AVG(label_y)";
+ if(!(theme->pieDimAttribute() == "NONE"))
+ attrs += "," + FUNC + "(" + theme->pieDimAttribute() + ")";
+
+ if(wherebox.empty() && input.empty())
+ q = "SELECT " + attrs + theme->sqlGridFrom();
+ else if(wherebox.empty() && input.empty()==false)
+ q = "SELECT " + attrs + theme->sqlGridFrom() + " WHERE " + input;
+ else if(wherebox.empty()==false && input.empty())
+ q = "SELECT " + attrs + theme->sqlGridFrom() + " WHERE " + wherebox;
+ else if(wherebox.empty()==false && input.empty()==false)
+ q = "SELECT " + attrs + theme->sqlGridFrom() + " WHERE " + input + " AND " + wherebox;
+ q += " GROUP BY " + theme->collectionTable() + ".c_object_id";
+
+ string conta = "SELECT COUNT(*) FROM " + theme->collectionTable();
+ if(wherebox.empty() && cinput.empty()==false)
+ conta += " WHERE " + cinput;
+ else if(wherebox.empty()==false && cinput.empty())
+ conta += " WHERE " + wherebox;
+ else if(wherebox.empty()==false && cinput.empty()==false)
+ conta += " WHERE " + cinput + " AND " + wherebox;
+
+ plot->freeResult();
+ if(plot->query(conta) && plot->fetchRow())
+ steps = atoi(plot->getData(0));
+
+ plot->freeResult();
+ if(plot->query(q))
+ {
+ if(progress)
+ {
+ string caption = "Plotando tema: " + theme->name();
+ progress->setCaption(caption.c_str());
+ progress->setLabelText(" Plotagem de tortas em andamento, aguarde... ");
+ progress->setTotalSteps(steps);
+ }
+ t2 = clock();
+ t0 = t1 = t2;
+ bool b = plot->fetchRow(0);
+ while(b)
+ {
+ double tot = 0.;
+ for(i=0; i<theme->chartAttributes_.size(); i++)
+ {
+ string v = plot->getData(i);
+ if(v.empty())
+ {
+ tot = 0.;
+ break;
+ }
+ tot += atof(v.c_str());
+ }
+ if(tot == 0.)
+ {
+ b = plot->fetchRow();
+ np++;
+ continue;
+ }
+
+ if(!(theme->pieDimAttribute() == "NONE"))
+ {
+ if(theme->chartMaxVal() - theme->chartMinVal() == 0)
+ diameter = 0.;
+ else
+ {
+ double adim = atof(plot->getData(theme->chartAttributes_.size()+2));
+ double a = (adim - theme->chartMinVal()) / (theme->chartMaxVal() - theme->chartMinVal());
+ diameter = a * (maxd - mind) + mind;
+ }
+ }
+ double x = atof(plot->getData(theme->chartAttributes_.size())) - diameter / 2.;
+ double y = atof(plot->getData(theme->chartAttributes_.size()+1)) - diameter / 2.;
+
+ double a = 0.;
+ for(i=0; i<theme->chartAttributes_.size(); i++)
+ {
+ double b = atof(plot->getData(i)) / tot * 360.;
+ TeColor cor = theme->chartColors_[i];
+ canvas->setPieColor(cor.red_, cor.green_, cor.blue_);
+ canvas->plotPie(x, y, diameter, diameter, a, b);
+ a += b;
+ }
+ np++;
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmapToWindow();
+ if(progress)
+ {
+ if(progress->wasCancelled())
+ {
+ progress->reset();
+ break;
+ }
+ if((int)(t2-t0) > dt2)
+ progress->setProgress(np);
+ }
+ }
+ b = plot->fetchRow();
+ }
+ canvas->copyPixmapToWindow();
+ }
+ }
+ else
+ {
+ double n = theme->chartAttributes_.size();
+ double maxv = theme->chartMaxVal();
+ double minv = theme->chartMinVal();
+ double delta = maxh / 2.;
+
+ string wherebox;
+
+ TeBox box;
+ if(ebox.isValid())
+ box = ebox;
+ else
+ box = canvas->getDataWorld();
+
+ box.x1_ = box.x1_ - delta;
+ box.x2_ = box.x2_ + delta;
+ box.y1_ = box.y1_ - delta;
+ box.y2_ = box.y2_ + delta;
+
+ wherebox = "NOT(label_x > " + Te2String(box.x2_, 10) + " OR ";
+ wherebox = wherebox + "label_x < " + Te2String(box.x1_, 10) + " OR ";
+ wherebox = wherebox + "label_y > " + Te2String(box.y2_, 10) + " OR ";
+ wherebox = wherebox + "label_y < " + Te2String(box.y1_, 10) + ")";
+
+ string attrs, q;
+ for(i=0; i<theme->chartAttributes_.size(); i++)
+ attrs += FUNC + "(" + theme->chartAttributes_[i] + "),";
+ attrs += "AVG(label_x),AVG(label_y)";
+
+ if(wherebox.empty() && input.empty())
+ q = "SELECT " + attrs + theme->sqlGridFrom();
+ else if (wherebox.empty() == false && input.empty() == false)
+ q = "SELECT " + attrs + theme->sqlGridFrom() + " WHERE " + input + " AND " + wherebox;
+ else if (wherebox.empty() == false && input.empty())
+ q = "SELECT " + attrs + theme->sqlGridFrom() + " WHERE " + wherebox;
+ else if (wherebox.empty() && input.empty() == false)
+ q = "SELECT " + attrs + theme->sqlGridFrom() + " WHERE " + input;
+ q += " GROUP BY " + theme->collectionTable() + ".c_object_id";
+
+ string conta = "SELECT COUNT(*) FROM " + theme->collectionTable();
+ if(wherebox.empty() && cinput.empty()==false)
+ conta += " WHERE " + cinput;
+ else if(wherebox.empty()==false && cinput.empty())
+ conta += " WHERE " + wherebox;
+ else if(wherebox.empty()==false && cinput.empty()==false)
+ conta += " WHERE " + cinput + " AND " + wherebox;
+
+ plot->freeResult();
+ if(plot->query(conta) && plot->fetchRow())
+ steps = atoi(plot->getData(0));
+
+ vector<double> dvec;
+ plot->freeResult();
+ if(plot->query(q))
+ {
+ if(progress)
+ {
+ string caption = "Plotando tema: " + theme->name();
+ progress->setCaption(caption.c_str());
+ progress->setLabelText(" Plotagem de barras em andamento, aguarde... ");
+ progress->setTotalSteps(steps);
+ }
+ t2 = clock();
+ t0 = t1 = t2;
+ bool b = plot->fetchRow(0);
+ while(b)
+ {
+ double x = atof(plot->getData(theme->chartAttributes_.size())) - n * width / 2.;
+ double y = atof(plot->getData(theme->chartAttributes_.size()+1));
+
+ dvec.clear();
+ for(i=0; i<theme->chartAttributes_.size(); i++)
+ {
+ string val = plot->getData(i);
+ if(val.empty())
+ {
+ dvec.clear();
+ break;
+ }
+ dvec.push_back(atof(val.c_str()));
+ }
+
+ for(i=0; i<dvec.size(); i++)
+ {
+ double height;
+ double v = dvec[i];
+ if(maxv - minv == 0)
+ height = 0.;
+ else
+ height = (v - minv) * (maxh - minh) / (maxv - minv) + minh;
+ TeColor cor = theme->chartColors_[i];
+ canvas->setRectColor(cor.red_, cor.green_, cor.blue_);
+ canvas->plotRect(x, y, width, height);
+ x += width;
+ }
+ np++;
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmapToWindow();
+ if(progress)
+ {
+ if(progress->wasCancelled())
+ {
+ progress->reset();
+ break;
+ }
+ if((int)(t2-t0) > dt2)
+ progress->setProgress(np);
+ }
+ }
+ b = plot->fetchRow();
+ }
+ canvas->copyPixmapToWindow();
+ }
+ }
+ if(progress)
+ progress->reset();
+ delete plot;
+}
+
+
+template<class Portal, class Canvas>
+string getWhereBox(Portal *plot, TeThemeApplication *theme, Canvas *canvas, TeGeomRep rep, TeBox bbox = TeBox())
+{
+ string wherebox;
+ if(theme->chartSelected_.empty() == true)
+ {
+ TeBox box;
+ if(bbox.isValid())
+ box = bbox;
+ else
+ box = canvas->getDataWorld ();
+ wherebox = plot->getDatabase()->getSQLBoxWhere(box, rep);
+ }
+ else
+ {
+ if (rep == TePOINTS)
+ {
+ double width = theme->barWidth();
+ double maxh = theme->barMaxHeight();
+ double minh = theme->barMinHeight();
+ double maxd = theme->pieMaxDiameter();
+ double mind = theme->pieMinDiameter();
+ double diameter = theme->pieDiameter();
+ double delta;
+
+ if(theme->keepDimension() != 0)
+ {
+ width = canvas->mapVtoData((int)width);
+ maxh = canvas->mapVtoData((int)maxh);
+ minh = canvas->mapVtoData((int)minh);
+ maxd = canvas->mapVtoData((int)maxd);
+ mind = canvas->mapVtoData((int)mind);
+ diameter = canvas->mapVtoData((int)diameter);
+ }
+
+ TeChartType chartType = (TeChartType)theme->chartType();
+ if(chartType == TePieChart)
+ {
+ delta = diameter / 2.;
+ if(!(theme->pieDimAttribute() == "NONE"))
+ delta = maxd / 2.;
+ }
+ else
+ delta = maxh / 2.;
+
+ string sel = "SELECT label_x, label_y FROM " + theme->collectionTable();
+ sel += " WHERE c_object_id = '" + theme->chartSelected_ + "'";
+ plot->freeResult();
+ if(plot->query(sel))
+ {
+ bool b = plot->fetchRow(0);
+ if(b == false)
+ return wherebox;
+ if(b)
+ {
+ double x = atof(plot->getData(0));
+ double y = atof(plot->getData(1));
+ string xmin = Te2String(x - delta);
+ string xmax = Te2String(x + delta);
+ string ymin = Te2String(y - delta);
+ string ymax = Te2String(y + delta);
+ wherebox = "label_x > " + xmin + " AND ";
+ wherebox += "label_x < " + xmax + " AND ";
+ wherebox += "label_y > " + ymin + " AND ";
+ wherebox += "label_y < " + ymax;
+ }
+ }
+ }
+ else if(rep == TePOLYGONS || rep == TeLINES || rep == TeCELLS)
+ {
+ string tab;
+ if(rep == TePOLYGONS)
+ tab = theme->layer()->tableName(TePOLYGONS);
+ else if (rep == TeLINES)
+ tab = theme->layer()->tableName(TeLINES);
+ else if (rep == TeCELLS)
+ tab = theme->layer()->tableName(TeCELLS);
+
+ plot->freeResult();
+
+ TeBox b;
+ bool result = plot->getDatabase()->getMBRGeom(tab, theme->chartSelected_, b, "spatial_data");
+ if(!result)
+ return wherebox;
+ else
+ wherebox = plot->getDatabase()->getSQLBoxWhere(b, rep);
+ }
+ }
+ return wherebox;
+}
+
+template<class Portal>
+TeVisual getVisual(Portal* portal, TeThemeApplication* theme, TeGeomRep GEOMREP, int resPos, int groPos, int ownPos)
+{
+ TeVisual visual;
+ TeDatabase* db = theme->layer()->database();
+ TeLegendEntry* legendEntry;
+
+ int status = atoi(portal->getData(resPos));
+ int groId = atoi(portal->getData(groPos));
+ int ownId = atoi(portal->getData(ownPos));
+
+ if(groId && (theme->visibleRep()&0x40000000))
+ legendEntry = db->legendMap()[groId];
+ else if(ownId != 0)
+ legendEntry = db->legendMap()[ownId];
+ else
+ legendEntry = &(theme->defaultLegend());
+
+// if(legendEntry)
+// visual = legendEntry->visual(GEOMREP);
+// else
+// visual = TeVisual(GEOMREP);
+/////////////////////////////////////////////////////////
+ TeGeomRepVisualMap vm = legendEntry->getVisualMap();
+ if(legendEntry && vm.find(GEOMREP) != vm.end())
+ visual = legendEntry->visual(GEOMREP);
+ else
+ {
+ if(ownId != 0)
+ legendEntry = db->legendMap()[ownId];
+ else
+ legendEntry = &(theme->defaultLegend());
+
+ visual = legendEntry->visual(GEOMREP);
+ }
+/////////////////////////////////////////////////////////
+
+ if(status == 1)
+ visual.color(theme->pointingLegend().visual(TePOLYGONS).color());
+ else if(status == 2)
+ visual.color(theme->queryLegend().visual(TePOLYGONS).color());
+ else if(status == 3)
+ visual.color(theme->queryAndPointingLegend().visual(TePOLYGONS).color());
+
+ return visual;
+}
+
+template<class Canvas , class Progress>
+void TePlotObjects (TeThemeApplication *theme, Canvas *canvas, map<int, RepMap>& layerRepMap, Progress *progress = 0, TeBox box = TeBox())
+{
+ string tableName, objectId;
+ TeColor color;
+ TeVisual visual;
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+ int nSteps, nLoops;
+
+
+ TeLayer *layer = theme->layer();
+ TeDatabase *db = layer->database();
+ TeDatabasePortal *portal = db->getPortal();
+ canvas->setDataProjection (layer->projection());
+ map<int, RepMap>::iterator it = layerRepMap.find(layer->id());
+
+ TeBox vb = box;
+ if(box.isValid())
+ {
+ canvas->mapDataWorldToCanvasWorld(vb);
+ canvas->mapCanvasWorldToViewport(vb);
+ }
+
+ if (layer->hasGeometry(TeRASTER) && (theme->visibleRep() & TeRASTER))
+ {
+ TeBox bIn;
+ if (box.isValid())
+ {
+ canvas->setClipRegion((int)vb.x1(), (int)vb.y1(), (int)vb.width(), (int)vb.height());
+ bIn = vb;
+ }
+
+ TeRaster* raster = theme->layer()->raster();
+ if (!theme->rasterVisual())
+ theme->createRasterVisual();
+
+ canvas->plotRaster(raster,theme->rasterVisual(),progress);
+ }
+ if(layer->hasGeometry(TePOLYGONS) && (theme->visibleRep() & TePOLYGONS))
+ {
+ nLoops = 0;
+ // query the database table containing the polygons� geometry
+ string wherebox = getWhereBox(portal, theme, canvas, TePOLYGONS, box);
+ tableName = layer->tableName(TePOLYGONS);
+
+ string queryPolygons = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+ queryPolygons += " FROM " + tableName + ", " + theme->collectionTable();
+ queryPolygons += " WHERE object_id = c_object_id";
+ if(wherebox.empty() == false)
+ queryPolygons += " AND " + wherebox;
+
+ if(db->dbmsName() != "OracleSpatial" && db->dbmsName() != "PostGIS")
+ queryPolygons += " ORDER BY object_id ASC, parent_id ASC, num_holes DESC";
+ else
+ queryPolygons += " ORDER BY object_id ASC";
+
+ //Calculate the number of polygons to be drawn
+ string selectPolyCount;
+ if(db->dbmsName()=="SqlServerAdo")
+ selectPolyCount="SELECT COUNT(DISTINCT(parent_id)) FROM ";
+ else if(db->dbmsName() != "OracleSpatial" && db->dbmsName() != "PostGIS")
+ selectPolyCount = "SELECT DISTINCT parent_id FROM ";
+ else
+ selectPolyCount = "SELECT DISTINCT object_id FROM ";
+
+ selectPolyCount += tableName + ", " + theme->collectionTable() + " WHERE c_object_id = object_id";
+ if(wherebox.empty() == false)
+ selectPolyCount += " AND " + wherebox;
+
+ string polyCount;
+ if(db->dbmsName() =="SqlServerAdo")
+ polyCount=selectPolyCount;
+ else if(db->dbmsName() == "PostgreSQL" || db->dbmsName() == "PostGIS")
+ polyCount = "SELECT COUNT(*) FROM (" + selectPolyCount + ") AS r";
+ else if(db->dbmsName() == "MySQL")
+ {
+ string createTempTable = "CREATE TEMPORARY TABLE count_table " + selectPolyCount;
+ db->execute(createTempTable);
+ polyCount = "SELECT COUNT(*) FROM count_table";
+ }
+ else
+ polyCount = "SELECT COUNT(*) FROM (" + selectPolyCount + ")";
+
+ if (portal->query(polyCount))
+ {
+ if (portal->fetchRow())
+ nSteps = atoi(portal->getData(0));
+ }
+ else
+ {
+ delete portal;
+ return;
+ }
+
+ if (db->dbmsName() == "MySQL")
+ db->execute("DROP TABLE count_table");
+
+ portal->freeResult();
+
+ //Plot the polygons whose number was placed in nSteps
+ if(db->dbmsName() == "PostgreSQL" || db->dbmsName() == "PostGIS")
+ {
+ if(portal->query(queryPolygons, TeSERVERSIDE, TeUNIDIRECTIONAL, TeREADONLY, TeBINARYCURSOR) == false)
+ {
+ delete portal;
+ return;
+ }
+ }
+ else
+ {
+ if (portal->query(queryPolygons) == false)
+ {
+ delete portal;
+ return;
+ }
+ }
+
+ int groPos = portal->AttributeList().size() - 3;
+ int ownPos = portal->AttributeList().size() - 2;
+ int resPos = portal->AttributeList().size() - 1;
+
+ progress->setTotalSteps(nSteps);
+ t2 = clock();
+ t0 = t1 = t2;
+ if(portal->fetchRow())
+ {
+ bool flag;
+ flag = true;
+ do
+ {
+ int geomId = atoi(portal->getData(0));
+ TePolygon poly;
+ visual = getVisual(portal, theme, TePOLYGONS, resPos, groPos, ownPos);
+ color = visual.color();
+ canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+ canvas->setPolygonStyle((int)visual.style(),visual.transparency());
+ color = visual.contourColor();
+ canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+ canvas->setPolygonLineStyle((int)visual.contourStyle(),visual.contourWidth());
+ if(box.isValid())
+ canvas->setClipRegion((int)vb.x1(), (int)vb.y1(), (int)vb.width(), (int)vb.height());
+ if(it == layerRepMap.end())
+ {
+ flag = portal->fetchGeometry(poly);
+ canvas->plotPolygon(poly);
+ }
+ else
+ {
+ canvas->plotPolygon(layerRepMap[layer->id()].polygonMap_[geomId]);
+ int parent_id = atoi(portal->getData(4));
+ int parent = parent_id;
+ while(parent == parent_id)
+ {
+ flag = portal->fetchRow();
+ if(flag)
+ parent = atoi(portal->getData(4));
+ else
+ parent = -1;
+ }
+ }
+ t2 = clock();
+ nLoops++;
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmapToWindow();
+ if(progress->wasCancelled())
+ {
+ progress->reset();
+ break;
+ }
+ if((int)(t2-t0) > dt2)
+ progress->setProgress(nLoops);
+ }
+ }
+ while (flag);
+ }
+ progress->reset();
+ }
+
+ if(box.isValid())
+ canvas->setClipRegion((int)vb.x1(), (int)vb.y1(), (int)vb.width(), (int)vb.height());
+ if(layer->hasGeometry(TeCELLS) && (theme->visibleRep() & TeCELLS))
+ {
+ nLoops = 0;
+ // query the database table containing the polygons� geometry
+ string wherebox = getWhereBox(portal, theme, canvas, TeCELLS, box);
+ tableName = layer->tableName(TeCELLS);
+
+ string queryCells = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+ queryCells += " FROM " + tableName + ", " + theme->collectionTable();
+ queryCells += " WHERE object_id = c_object_id";
+ if(wherebox.empty() == false)
+ queryCells += " AND " + wherebox;
+
+ string cellsCount = "SELECT COUNT(*) FROM " + tableName + ", " + theme->collectionTable();
+ cellsCount += " WHERE object_id = c_object_id";
+ if(wherebox.empty() == false)
+ cellsCount += " AND " + wherebox;
+
+ portal->freeResult();
+ if (portal->query(cellsCount))
+ {
+ if (portal->fetchRow())
+ nSteps = atoi(portal->getData(0));
+ }
+ else
+ {
+ delete portal;
+ return;
+ }
+
+ portal->freeResult();
+ if (portal->query(queryCells) == false)
+ {
+ delete portal;
+ return;
+ }
+ int groPos = portal->AttributeList().size() - 3;
+ int ownPos = portal->AttributeList().size() - 2;
+ int resPos = portal->AttributeList().size() - 1;
+
+ progress->setTotalSteps(nSteps);
+ t2 = clock();
+ t0 = t1 = t2;
+ if(portal->fetchRow())
+ {
+ bool flag;
+ flag = true;
+ do
+ {
+ TeCell cell;
+ visual = getVisual(portal, theme, TePOLYGONS, resPos, groPos, ownPos); //use TePOLYGONS
+ color = visual.color();
+ canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+ canvas->setPolygonStyle((int)visual.style(),visual.transparency());
+ color = visual.contourColor();
+ canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+ canvas->setPolygonLineStyle((int)visual.contourStyle(),visual.contourWidth());
+ flag = portal->fetchGeometry(cell);
+ canvas->plotCell(cell);
+ t2 = clock();
+ nLoops++;
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmapToWindow();
+ if(progress->wasCancelled())
+ {
+ progress->reset();
+ break;
+ }
+ if((int)(t2-t0) > dt2)
+ progress->setProgress(nLoops);
+ }
+ }
+ while (flag);
+ }
+ progress->reset();
+ }
+
+ if (layer->hasGeometry(TeLINES) && (theme->visibleRep() & TeLINES))
+ {
+ nLoops = 0;
+ string wherebox = getWhereBox(portal, theme, canvas, TeLINES, box);
+ // query the database table containing the lines� geometry
+ tableName = layer->tableName(TeLINES);
+
+ string queryLines = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+ queryLines += " FROM " + tableName + ", " + theme->collectionTable();
+ queryLines += " WHERE object_id = c_object_id";
+ if(wherebox.empty() == false)
+ queryLines += " AND " + wherebox;
+
+ string linesCount = "SELECT COUNT(*) FROM " + tableName + ", " + theme->collectionTable();
+ linesCount += " WHERE object_id = c_object_id";
+ if(wherebox.empty() == false)
+ linesCount += " AND " + wherebox;
+
+ portal->freeResult();
+ if (portal->query(linesCount))
+ {
+ if (portal->fetchRow())
+ nSteps = atoi(portal->getData(0));
+ }
+ else
+ {
+ delete portal;
+ return;
+ }
+
+ portal->freeResult();
+ if (portal->query(queryLines) == false)
+ {
+ delete portal;
+ return;
+ }
+ int groPos = portal->AttributeList().size() - 3;
+ int ownPos = portal->AttributeList().size() - 2;
+ int resPos = portal->AttributeList().size() - 1;
+
+ progress->setTotalSteps(nSteps);
+ t2 = clock();
+ t0 = t1 = t2;
+ if(portal->fetchRow())
+ {
+ bool flag = true;
+ do
+ {
+ int geomId = atoi(portal->getData(0));
+ TeLine2D line;
+ visual = getVisual(portal, theme, TeLINES, resPos, groPos, ownPos);
+ color = visual.color();
+ canvas->setLineColor(color.red_, color.green_, color.blue_);
+ canvas->setLineStyle((int)visual.style(),visual.width());
+ if(it == layerRepMap.end())
+ {
+ flag = portal->fetchGeometry(line);
+ canvas->plotLine(line);
+ }
+ else
+ {
+ canvas->plotLine(layerRepMap[layer->id()].lineMap_[geomId]);
+ flag = portal->fetchRow();
+ }
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmapToWindow();
+ if(progress->wasCancelled())
+ {
+ progress->reset();
+ break;
+ }
+ if((int)(t2-t0) > dt2)
+ progress->setProgress(int(t2));
+ }
+ }
+ while (flag);
+ }
+ progress->reset();
+ }
+
+ if (layer->hasGeometry(TePOINTS) && (theme->visibleRep() & TePOINTS))
+ {
+ nLoops = 0;
+ string wherebox = getWhereBox(portal, theme, canvas, TePOINTS, box);
+ // query the database table containing the points� geometry
+ tableName = layer->tableName(TePOINTS);
+
+ string queryPoints = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+ queryPoints += " FROM " + tableName + ", " + theme->collectionTable();
+ queryPoints += " WHERE object_id = c_object_id";
+ if(wherebox.empty() == false)
+ queryPoints += " AND " + wherebox;
+
+ string pointsCount = "SELECT COUNT(*) FROM " + tableName + ", " + theme->collectionTable();
+ pointsCount += " WHERE object_id = c_object_id";
+ if(wherebox.empty() == false)
+ pointsCount += " AND " + wherebox;
+
+ portal->freeResult();
+ if (portal->query(pointsCount))
+ {
+ if (portal->fetchRow())
+ nSteps = atoi(portal->getData(0));
+ }
+ else
+ {
+ delete portal;
+ return;
+ }
+
+ portal->freeResult();
+ if (portal->query(queryPoints) == false)
+ {
+ delete portal;
+ return;
+ }
+ int groPos = portal->AttributeList().size() - 3;
+ int ownPos = portal->AttributeList().size() - 2;
+ int resPos = portal->AttributeList().size() - 1;
+
+ progress->setTotalSteps(nSteps);
+ t2 = clock();
+ t0 = t1 = t2;
+ if(portal->fetchRow())
+ {
+ bool flag = true;
+ do
+ {
+ TePoint point;
+ visual = getVisual(portal, theme, TePOINTS, resPos, groPos, ownPos);
+ color = visual.color();
+ canvas->setPointColor(color.red_, color.green_, color.blue_);
+ canvas->setPointStyle((int)visual.style(),visual.size());
+ flag = portal->fetchGeometry(point);
+ canvas->plotPoint(point);
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmapToWindow();
+ if(progress->wasCancelled())
+ {
+ progress->reset();
+ break;
+ }
+ if((int)(t2-t0) > dt2)
+ progress->setProgress(int(t2));
+ }
+ }
+ while (flag);
+ }
+ progress->reset();
+ }
+ delete portal;
+
+ if(box.isValid())
+ canvas->setClipping(false);
+}
+
+
+
+template<class Canvas , class Progress>
+TeBox TePlotSelectedObjects(TeThemeApplication *theme, Canvas *canvas, set<string>& drawSet, map<int, RepMap>& layerRepMap, Progress * /* progress */ = 0, TeGeomRepVisualMap* visualMap = 0)
+{
+ TeBox boxRet;
+ int i, nLoops;
+ int dt = CLOCKS_PER_SEC/4;
+ clock_t t0, t1, t2;
+ vector<string> inClauseVector;
+
+ TeLayer *layer = theme->layer();
+ TeDatabase *db = layer->database();
+ TeDatabasePortal *portal = db->getPortal();
+ canvas->setDataProjection (layer->projection());
+ string TC = theme->collectionTable();
+
+ string tableName, objectId;
+ TeColor color;
+ TeVisual visual;
+
+ set<string>::iterator itB = drawSet.begin();
+ set<string>::iterator itE = drawSet.end();
+ inClauseVector = generateInClauses(itB,itE, db);
+
+ if (layer->hasGeometry(TePOLYGONS) && (theme->visibleRep() & TePOLYGONS))
+ {
+ map<int, RepMap>::iterator it = layerRepMap.find(layer->id());
+// nLoops = 0;
+// progress->setTotalSteps(drawSet.size());
+ t2 = clock();
+ t0 = t1 = t2;
+
+ bool hasVisual = false;
+
+ if(visualMap)
+ hasVisual = (visualMap->find(TePOLYGONS) != visualMap->end());
+
+ TeVisual visualPol;
+
+ if(hasVisual)
+ visualPol = (*visualMap)[TePOLYGONS];
+
+
+ for (i = 0; i < (int)inClauseVector.size(); ++i)
+ {
+ // query the database table containing the polygons� geometry
+ tableName = layer->tableName(TePOLYGONS);
+ string queryPolygons = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+ queryPolygons += " FROM " + tableName + ", " + theme->collectionTable();
+ queryPolygons += " WHERE object_id = c_object_id AND object_id IN " + inClauseVector[i];
+
+ if(db->dbmsName() != "OracleSpatial" && db->dbmsName() != "PostGIS")
+ queryPolygons += " ORDER BY object_id ASC, parent_id ASC, num_holes DESC";
+ else
+ queryPolygons += " ORDER BY object_id ASC";
+
+ portal->freeResult();
+ if (portal->query(queryPolygons) == false)
+ {
+ delete portal;
+ return boxRet;
+ }
+ int groPos = portal->AttributeList().size() - 3;
+ int ownPos = portal->AttributeList().size() - 2;
+ int resPos = portal->AttributeList().size() - 1;
+
+ if(portal->fetchRow())
+ {
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+
+ if(hasVisual)
+ {
+ color = visualPol.color();
+ canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+ canvas->setPolygonStyle((int)visualPol.style(),visualPol.transparency());
+ color = visualPol.contourColor();
+ canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+ canvas->setPolygonLineStyle((int)visualPol.contourStyle(),visualPol.contourWidth());
+ }
+ else
+ {
+ visual = getVisual(portal, theme, TePOLYGONS, resPos, groPos, ownPos);
+ color = visual.color();
+ canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+ canvas->setPolygonStyle((int)visual.style(),visual.transparency());
+ color = visual.contourColor();
+ canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+ canvas->setPolygonLineStyle((int)visual.contourStyle(),visual.contourWidth());
+ }
+
+ if(it == layerRepMap.end())
+ {
+ flag = portal->fetchGeometry(poly);
+ boxRet = TeUnion(boxRet, poly.box());
+ canvas->plotPolygon(poly);
+ }
+ else
+ {
+ int geomId = atoi(portal->getData(0));
+ int parent_id = atoi(portal->getData(4));
+ int parent = parent_id;
+ while(parent == parent_id)
+ {
+ flag = portal->fetchRow();
+ if(flag)
+ parent = atoi(portal->getData(4));
+ else
+ parent = -1;
+ }
+ boxRet = TeUnion(boxRet, layerRepMap[layer->id()].polygonMap_[geomId].box());
+ canvas->plotPolygon(layerRepMap[layer->id()].polygonMap_[geomId]);
+ }
+ t2 = clock();
+// nLoops++;
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmap1ToWindow();
+// if(progress->wasCancelled())
+// break;
+// progress->setProgress(nLoops);
+ }
+ }
+ while (flag);
+ }
+ }
+// progress->reset();
+ }
+
+ if (layer->hasGeometry(TeCELLS) && (theme->visibleRep() & TeCELLS))
+ {
+// nLoops = 0;
+// progress->setTotalSteps(drawSet.size());
+ t2 = clock();
+ t0 = t1 = t2;
+
+ bool hasVisual = false;
+
+ if(visualMap)
+ hasVisual = (visualMap->find(TeCELLS) != visualMap->end());
+
+ TeVisual visualCell;
+
+ if(hasVisual)
+ visualCell = (*visualMap)[TeCELLS];
+
+
+ for (i = 0; i < (int)inClauseVector.size(); ++i)
+ {
+ // query the database table containing the lines� geometry
+ tableName = layer->tableName(TeCELLS);
+ string queryCells = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+ queryCells += " FROM " + tableName + ", " + theme->collectionTable();
+ queryCells += " WHERE object_id = c_object_id AND object_id IN " + inClauseVector[i];
+
+ portal->freeResult();
+ if (portal->query(queryCells) == false)
+ {
+ delete portal;
+ return boxRet;
+ }
+ int groPos = portal->AttributeList().size() - 3;
+ int ownPos = portal->AttributeList().size() - 2;
+ int resPos = portal->AttributeList().size() - 1;
+
+ if(portal->fetchRow())
+ {
+ bool flag = true;
+ do
+ {
+ TeCell cell;
+
+ if(hasVisual)
+ {
+ color = visualCell.color();
+ canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+ canvas->setPolygonStyle((int)visualCell.style(),visualCell.transparency());
+ color = visualCell.contourColor();
+ canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+ canvas->setPolygonLineStyle((int)visualCell.contourStyle(),visualCell.contourWidth());
+ }
+ else
+ {
+
+ visual = getVisual(portal, theme, TePOLYGONS, resPos, groPos, ownPos); //use TePOLYGONS
+ color = visual.color();
+ canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+ canvas->setPolygonStyle((int)visual.style(),visual.transparency());
+ color = visual.contourColor();
+ canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+ canvas->setPolygonLineStyle((int)visual.contourStyle(),visual.contourWidth());
+ }
+
+ flag = portal->fetchGeometry(cell);
+ boxRet = TeUnion(boxRet, cell.box());
+ canvas->plotCell(cell);
+ t2 = clock();
+// nLoops++;
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmap1ToWindow();
+// if(progress->wasCancelled())
+// break;
+// progress->setProgress(nLoops);
+ }
+ }
+ while (flag);
+ }
+ }
+// progress->reset();
+ }
+
+ if (layer->hasGeometry(TeLINES) && (theme->visibleRep() & TeLINES))
+ {
+// nLoops = 0;
+// progress->setTotalSteps(drawSet.size());
+ t2 = clock();
+ t0 = t1 = t2;
+
+ bool hasVisual = false;
+
+ if(visualMap)
+ hasVisual = (visualMap->find(TeLINES) != visualMap->end());
+
+ TeVisual visualLin;
+
+ if(hasVisual)
+ visualLin = (*visualMap)[TeLINES];
+
+
+ for (i = 0; i < (int)inClauseVector.size(); ++i)
+ {
+ // query the database table containing the lines� geometry
+ tableName = layer->tableName(TeLINES);
+ string queryLines = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+ queryLines += " FROM " + tableName + ", " + theme->collectionTable();
+ queryLines += " WHERE object_id = c_object_id AND object_id IN " + inClauseVector[i];
+
+ portal->freeResult();
+ if (portal->query(queryLines) == false)
+ {
+ delete portal;
+ return boxRet;
+ }
+ int groPos = portal->AttributeList().size() - 3;
+ int ownPos = portal->AttributeList().size() - 2;
+ int resPos = portal->AttributeList().size() - 1;
+
+ if(portal->fetchRow())
+ {
+ bool flag = true;
+ do
+ {
+ TeLine2D line;
+
+ if(hasVisual)
+ {
+ color = visualLin.color();
+ canvas->setLineColor(color.red_, color.green_, color.blue_);
+ canvas->setLineStyle((int)visualLin.style(),visualLin.width());
+ }
+ else
+ {
+ visual = getVisual(portal, theme, TeLINES, resPos, groPos, ownPos);
+ color = visual.color();
+ canvas->setLineColor(color.red_, color.green_, color.blue_);
+ canvas->setLineStyle((int)visual.style(),visual.width());
+ }
+
+ flag = portal->fetchGeometry(line);
+ boxRet = TeUnion(boxRet, line.box());
+ canvas->plotLine(line);
+ t2 = clock();
+// nLoops++;
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmap1ToWindow();
+// if(progress->wasCancelled())
+// break;
+// progress->setProgress(nLoops);
+ }
+ }
+ while (flag);
+ }
+ }
+// progress->reset();
+ }
+
+ if (layer->hasGeometry(TePOINTS) && (theme->visibleRep() & TePOINTS))
+ {
+ nLoops = 0;
+// progress->setTotalSteps(drawSet.size());
+ t2 = clock();
+ t0 = t1 = t2;
+
+ bool hasVisual = false;
+
+ if(visualMap)
+ hasVisual = (visualMap->find(TePOINTS) != visualMap->end());
+
+ TeVisual visualPt;
+
+ if(hasVisual)
+ visualPt = (*visualMap)[TePOINTS];
+
+
+
+ for (i = 0; i < (int)inClauseVector.size(); ++i)
+ {
+ // query the database table containing the points� geometry
+ tableName = layer->tableName(TePOINTS);
+ string queryLines = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+ queryLines += " FROM " + tableName + ", " + theme->collectionTable();
+ queryLines += " WHERE object_id = c_object_id AND object_id IN " + inClauseVector[i];
+
+ portal->freeResult();
+ if (portal->query(queryLines) == false)
+ {
+ delete portal;
+ return boxRet;
+ }
+ int groPos = portal->AttributeList().size() - 3;
+ int ownPos = portal->AttributeList().size() - 2;
+ int resPos = portal->AttributeList().size() - 1;
+
+ if(portal->fetchRow())
+ {
+ bool flag = true;
+ do
+ {
+ TePoint point;
+
+ if(hasVisual)
+ {
+ color = visualPt.color();
+ canvas->setPointColor(color.red_, color.green_, color.blue_);
+ canvas->setPointStyle((int)visualPt.style(),visualPt.size());
+ }
+ else
+ {
+ visual = getVisual(portal, theme, TePOINTS, resPos, groPos, ownPos);
+ color = visual.color();
+ canvas->setPointColor(color.red_, color.green_, color.blue_);
+ canvas->setPointStyle((int)visual.style(),visual.size());
+ }
+
+ flag = portal->fetchGeometry(point);
+ double dw = canvas->mapVtoDW(visual.size());
+ TeCoord2D p = point.location();
+ TeBox b(p.x()-dw, p.y()-dw, p.x()+dw, p.y()+dw);
+ boxRet = TeUnion(boxRet, b);
+ canvas->plotPoint(point);
+ t2 = clock();
+ nLoops++;
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ canvas->copyPixmap1ToWindow();
+// if(progress->wasCancelled())
+// break;
+// progress->setProgress(nLoops);
+ }
+ }
+ while (flag);
+ }
+ }
+// progress->reset();
+ }
+ delete portal;
+ return boxRet;
+}
+
+template<class Canvas>
+bool objBoxInCanvas(TeThemeApplication *theme, Canvas *canvas, set<string>& drawSet, TeGeomRep repType, TeBox& bout, double tol)
+{
+ //calculate the box that contains all the objects in objectIdSet.
+ //If this box is inside the canvas box, return true to indicate that
+ //is enough to paint the objects selected. If this box is not inside
+ //the canvas box, center this box in the canvas, and return false
+ //to indicate that a plot in the whole canvas area is necessary.
+
+ TeLayer *layer = theme->layer();
+ TeDatabase *db = layer->database();
+ TeDatabasePortal *portal = db->getPortal();
+
+ string tableName;
+ if (repType & TePOLYGONS)
+ tableName = theme->layer()->tableName(TePOLYGONS);
+ else if (repType & TeLINES)
+ tableName = theme->layer()->tableName(TeLINES);
+ else if (repType & TePOINTS)
+ tableName = theme->layer()->tableName(TePOINTS);
+ else if (repType & TeCELLS)
+ tableName = theme->layer()->tableName(TeCELLS);
+
+ set<string>::iterator it, beginIt;
+ int i, chunk = 200, size = drawSet.size();
+ string inClause, plic, fields, queryString;
+
+ beginIt = drawSet.begin();
+ while (size > 0)
+ {
+ portal->freeResult();
+ inClause = "(";
+ plic = "'";
+ i = 0;
+ for (it = beginIt; it != drawSet.end(); ++it)
+ {
+ if (i >= chunk)
+ break;
+ inClause += plic + *it + "',";
+ ++i;
+ }
+ inClause[inClause.size() - 1] = ')';
+ beginIt = it;
+ size -= chunk;
+
+ if((repType & TePOLYGONS) || (repType & TeLINES) || (repType & TeCELLS))
+ {
+ if(db->dbmsName() == "PostGIS")
+ fields = "MIN(xmin(spatial_data::box3d)), MIN(ymin(spatial_data::box3d)), MAX(xmax(spatial_data::box3d)), MAX(ymax(spatial_data::box3d))";
+ else
+ fields = "MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y)";
+
+ queryString = "SELECT " + fields;
+ queryString += " FROM " + tableName;
+ queryString += " WHERE object_id IN " + inClause;
+
+ if (portal->query(queryString))
+ {
+ while(portal->fetchRow())
+ {
+ string vxmin = portal->getData(0);
+ string vymin = portal->getData(1);
+ string vxmax = portal->getData(2);
+ string vymax = portal->getData(3);
+ if(vxmin.empty() || vymin.empty() || vxmax.empty() || vymax.empty())
+ continue;
+ double xmin = atof(vxmin.c_str());
+ double ymin = atof(vymin.c_str());
+ double xmax = atof(vxmax.c_str());
+ double ymax = atof(vymax.c_str());
+ TeBox ibox(xmin+tol, ymin+tol, xmax-tol, ymax-tol);
+ updateBox (bout, ibox);
+ }
+ }
+ }
+ else if(repType & TePOINTS)
+ {
+ if(db->dbmsName() == "PostGIS")
+ fields = "MIN(xmin(spatial_data::box3d)), MIN(ymin(spatial_data::box3d)), MAX(xmax(spatial_data::box3d)), MAX(ymax(spatial_data::box3d))";
+ else
+ fields = "MIN(x), MIN(y), MAX(x), MAX(y)";
+
+ queryString = "SELECT " + fields;
+ queryString += " FROM " + tableName;
+ queryString += " WHERE object_id IN " + inClause;
+
+ if (portal->query(queryString))
+ {
+ while(portal->fetchRow())
+ {
+ string vx = portal->getData(0);
+ string vy = portal->getData(1);
+ if(vx.empty() || vy.empty())
+ continue;
+ double x = atof(vx.c_str());
+ double y = atof(vy.c_str());
+
+ TeBox ibox(x-tol, y-tol, x+tol, y+tol);
+ updateBox (bout, ibox);
+ }
+ }
+ }
+ }
+
+ TeBox cbox = canvas->getDataWorld();
+ if(TeWithin(bout, cbox) == true)
+ {
+ delete portal;
+ return true;
+ }
+
+ //box of the objects selected is not inside the canvas box
+ if(bout.width() < cbox.width())
+ {
+ double w = cbox.width();
+ double tw = bout.width();
+ double dw = (w - tw) / 2.;
+ bout.x1_ = bout.x1_ - dw;
+ bout.x2_ = bout.x2_ + dw;
+ }
+
+ if(bout.height() < cbox.height())
+ {
+ double h = cbox.height();
+ double th = bout.height();
+ double dh = (h - th) / 2.;
+ bout.y1_ = bout.y1_ - dh;
+ bout.y2_ = bout.y2_ + dh;
+ }
+
+ delete portal;
+
+ // layer to canvas projection
+ bout = TeRemapBox(bout, theme->layer()->projection(), canvas->projection());
+ return false;
+}
+
+
+template<class Canvas>
+void TePlotFrame(TeThemeApplication* theme, Canvas* canvas, map<int, RepMap>& layerRepMap, map<string, TeGeomRepVisualMap*>& objVisualMap)
+{
+ string tableName, objectId;
+ TeColor color;
+ TeVisual visual;
+
+ TeLayer *layer = theme->layer();
+ TeDatabase *db = layer->database();
+ TeDatabasePortal *portal = db->getPortal();
+ canvas->setDataProjection (layer->projection());
+ map<int, RepMap>::iterator it = layerRepMap.find(layer->id());
+ TeGeomRepVisualMap* vmap;
+
+ TeBox box;
+ TeBox vb = box;
+ if(box.isValid())
+ {
+ canvas->mapDataWorldToCanvasWorld(vb);
+ canvas->mapCanvasWorldToViewport(vb);
+ }
+
+ if (layer->hasGeometry(TeRASTER) && (theme->visibleRep() & TeRASTER))
+ {
+ TeBox bIn;
+ if (box.isValid())
+ {
+ canvas->setClipRegion((int)vb.x1(), (int)vb.y1(), (int)vb.width(), (int)vb.height());
+ bIn = vb;
+ }
+
+ TeRaster* raster = theme->layer()->raster();
+ if (!theme->rasterVisual())
+ theme->createRasterVisual();
+
+ canvas->plotRaster(raster,theme->rasterVisual(), 0);
+ }
+ if(layer->hasGeometry(TePOLYGONS) && (theme->visibleRep() & TePOLYGONS))
+ {
+ // query the database table containing the polygons� geometry
+ string wherebox = getWhereBox(portal, theme, canvas, TePOLYGONS, box);
+ tableName = layer->tableName(TePOLYGONS);
+
+ string queryPolygons = "SELECT " + tableName + ".*";
+ queryPolygons += " FROM " + tableName + ", " + theme->collectionTable();
+ queryPolygons += " WHERE object_id = c_object_id";
+ if(wherebox.empty() == false)
+ queryPolygons += " AND " + wherebox;
+
+ if(db->dbmsName() != "OracleSpatial" && db->dbmsName() != "PostGIS")
+ queryPolygons += " ORDER BY object_id ASC, parent_id ASC, num_holes DESC";
+ else
+ queryPolygons += " ORDER BY object_id ASC";
+
+ portal->freeResult();
+
+ //Plot the polygons whose number was placed in nSteps
+ if (portal->query(queryPolygons) == false)
+ {
+ delete portal;
+ return;
+ }
+
+ if(portal->fetchRow())
+ {
+ bool flag;
+ flag = true;
+ do
+ {
+ TePolygon poly;
+ int geomId = atoi(portal->getData(0));
+ string oid = portal->getData(1);
+ if (objVisualMap.find(oid) != objVisualMap.end())
+ vmap = objVisualMap[oid];
+ else
+ {
+ flag = portal->fetchGeometry(poly);
+ continue;
+ }
+
+ visual = vmap->operator[](TePOLYGONS);
+ color = visual.color();
+ canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+ canvas->setPolygonStyle((int)visual.style(),visual.transparency());
+ color = visual.contourColor();
+ canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+ canvas->setPolygonLineStyle((int)visual.contourStyle(),visual.contourWidth());
+ if(box.isValid())
+ canvas->setClipRegion((int)vb.x1(), (int)vb.y1(), (int)vb.width(), (int)vb.height());
+ if(it == layerRepMap.end())
+ {
+ flag = portal->fetchGeometry(poly);
+ canvas->plotPolygon(poly);
+ }
+ else
+ {
+ canvas->plotPolygon(layerRepMap[layer->id()].polygonMap_[geomId]);
+ int parent_id = atoi(portal->getData(4));
+ int parent = parent_id;
+ while(parent == parent_id)
+ {
+ flag = portal->fetchRow();
+ if(flag)
+ parent = atoi(portal->getData(4));
+ else
+ parent = -1;
+ }
+ }
+ }
+ while (flag);
+ }
+ }
+
+ if(box.isValid())
+ canvas->setClipRegion((int)vb.x1(), (int)vb.y1(), (int)vb.width(), (int)vb.height());
+ if(layer->hasGeometry(TeCELLS) && (theme->visibleRep() & TeCELLS))
+ {
+ // query the database table containing the polygons� geometry
+ string wherebox = getWhereBox(portal, theme, canvas, TeCELLS, box);
+ tableName = layer->tableName(TeCELLS);
+
+ string queryCells = "SELECT " + tableName + ".*";
+ queryCells += " FROM " + tableName + ", " + theme->collectionTable();
+ queryCells += " WHERE object_id = c_object_id";
+ if(wherebox.empty() == false)
+ queryCells += " AND " + wherebox;
+
+ portal->freeResult();
+ if (portal->query(queryCells) == false)
+ {
+ delete portal;
+ return;
+ }
+
+ if(portal->fetchRow())
+ {
+ bool flag;
+ flag = true;
+ do
+ {
+ TeCell cell;
+ string oid = portal->getData(1);
+ if (objVisualMap.find(oid) != objVisualMap.end())
+ vmap = objVisualMap[oid];
+ else
+ {
+ flag = portal->fetchGeometry(cell);
+ continue;
+ }
+ visual = vmap->operator[](TePOLYGONS);
+ color = visual.color();
+ canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+ canvas->setPolygonStyle((int)visual.style(),visual.transparency());
+ color = visual.contourColor();
+ canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+ canvas->setPolygonLineStyle((int)visual.contourStyle(),visual.contourWidth());
+ flag = portal->fetchGeometry(cell);
+ canvas->plotCell(cell);
+ }
+ while (flag);
+ }
+ }
+
+ if (layer->hasGeometry(TeLINES) && (theme->visibleRep() & TeLINES))
+ {
+ string wherebox = getWhereBox(portal, theme, canvas, TeLINES, box);
+ // query the database table containing the lines� geometry
+ tableName = layer->tableName(TeLINES);
+
+ string queryLines = "SELECT " + tableName + ".*";
+ queryLines += " FROM " + tableName + ", " + theme->collectionTable();
+ queryLines += " WHERE object_id = c_object_id";
+ if(wherebox.empty() == false)
+ queryLines += " AND " + wherebox;
+
+ portal->freeResult();
+ if (portal->query(queryLines) == false)
+ {
+ delete portal;
+ return;
+ }
+
+ if(portal->fetchRow())
+ {
+ bool flag = true;
+ do
+ {
+ TeLine2D line;
+ int geomId = atoi(portal->getData(0));
+ string oid = portal->getData(1);
+ if (objVisualMap.find(oid) != objVisualMap.end())
+ vmap = objVisualMap[oid];
+ else
+ {
+ flag = portal->fetchGeometry(line);
+ continue;
+ }
+
+ visual = vmap->operator[](TeLINES);
+ color = visual.color();
+ canvas->setLineColor(color.red_, color.green_, color.blue_);
+ canvas->setLineStyle((int)visual.style(),visual.width());
+ if(it == layerRepMap.end())
+ {
+ flag = portal->fetchGeometry(line);
+ canvas->plotLine(line);
+ }
+ else
+ {
+ canvas->plotLine(layerRepMap[layer->id()].lineMap_[geomId]);
+ flag = portal->fetchRow();
+ }
+ }
+ while (flag);
+ }
+ }
+
+ if (layer->hasGeometry(TePOINTS) && (theme->visibleRep() & TePOINTS))
+ {
+ string wherebox = getWhereBox(portal, theme, canvas, TePOINTS, box);
+ // query the database table containing the points� geometry
+ tableName = layer->tableName(TePOINTS);
+
+ string queryPoints = "SELECT " + tableName + ".*";
+ queryPoints += " FROM " + tableName + ", " + theme->collectionTable();
+ queryPoints += " WHERE object_id = c_object_id";
+ if(wherebox.empty() == false)
+ queryPoints += " AND " + wherebox;
+
+ portal->freeResult();
+ if (portal->query(queryPoints) == false)
+ {
+ delete portal;
+ return;
+ }
+
+ if(portal->fetchRow())
+ {
+ bool flag = true;
+ do
+ {
+ TePoint point;
+ string oid = portal->getData(1);
+ if (objVisualMap.find(oid) != objVisualMap.end())
+ vmap = objVisualMap[oid];
+ else
+ {
+ flag = portal->fetchGeometry(point);
+ continue;
+ }
+
+ visual = vmap->operator[](TePOINTS);
+ color = visual.color();
+ canvas->setPointColor(color.red_, color.green_, color.blue_);
+ canvas->setPointStyle((int)visual.style(),visual.size());
+ flag = portal->fetchGeometry(point);
+ canvas->plotPoint(point);
+ }
+ while (flag);
+ }
+ }
+ delete portal;
+
+ if(box.isValid())
+ canvas->setClipping(false);
+}
+
+#endif
+
diff --git a/src/terralib/application/TePlotView.h b/src/terralib/application/TePlotView.h
new file mode 100644
index 0000000..a400f82
--- /dev/null
+++ b/src/terralib/application/TePlotView.h
@@ -0,0 +1,41 @@
+//***********************************************************************
+// TerraLib is a GIS Classes and Functions Library that
+// strongly explores Spatial Database Technologies
+//
+// Copyright � 2002 INPE and Tecgraf/PUC-Rio.
+//
+// This library is free software; you can redistribute it
+// and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation
+// version 2.1.(http://www.opensource.org/licenses/lgpl-license.php)
+//
+//
+//
+// Send questions or suggestions about the TerraLib Project
+// to terralib at dpi.inpe.br .
+//**************************************************************************//
+/*! \file TePlotTheme.h
+ This file contains support to plot a view on a canvas
+*/
+#ifndef TEPLOTVIEW_H
+#define TEPLOTVIEW_H
+#include <TeView.h>
+#include <TePlotTheme.h>
+#include <TeDatabase.h>
+
+template<class Portal, class Canvas>
+void TePlotView (Portal *portal, TeView *view, Canvas *canvas)
+{
+ if (view->themes().size() == 0)
+ portal->loadView (*view);
+
+ for (int i=0 ; i < view->themes().size() ; i++)
+ {
+ TeThemeApplication *theme = (TeTheme*)view->get(i);
+ if (theme->visible ())
+ TePlotTheme (portal, theme, canvas);
+ }
+}
+
+#endif
+
diff --git a/src/terralib/application/TeSemivarModelFactory.cpp b/src/terralib/application/TeSemivarModelFactory.cpp
new file mode 100644
index 0000000..457bdd3
--- /dev/null
+++ b/src/terralib/application/TeSemivarModelFactory.cpp
@@ -0,0 +1,198 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeSemivarModelFactory.h>
+#include <math.h>
+#include <vector>
+using namespace std;
+
+static TeEsfericSemivar_Factory mesf("Esferic");
+static TeExponentialSemivar_Factory mexp("Exponential");
+static TeGaussianSemivar_Factory mgau("Gaussian");
+
+
+TeMatrix
+TeEsfericSemivarModel :: calculate (TeMatrix& g)
+{
+ TeMatrix mxesf;
+ vector<double> esf;
+ int i, nlag;
+ double c0, c1, a;
+
+ c0=modeloefeitopepita_;
+ c1=modelocontribuicao_;
+ a=modeloalcance_;
+ nlag = g.Nrow();
+ mxesf.Init(nlag+1, 2);
+
+ for (i=0; i<nlag; ++i)
+ {
+ if (g(i,0) == 0)
+ esf.push_back(c0);
+
+ else if (g(i,0) > 0 && g(i,0) < 1000000.0)
+ {
+ esf.push_back( c0 + c1*(1.5*(g(i,0)/a)) - 0.5*(pow(g(i,0)/a,3) ));
+ if (esf[i] > c0+c1)
+ esf[i]=c0+c1;
+ }
+
+ else
+ esf.push_back(c0+c1);
+
+ // Escreve Saida
+ mxesf(i+1,0) = g(i,0); // h
+ mxesf(i+1,1) = esf[i]; // gama(h)
+ }
+
+ // quando h=0 => gama(h)=c0
+ mxesf(0,1)=c0;
+
+ // acrescentar o �ltimo valor
+ mxesf(nlag,0)= mxesf(nlag-1,0) + (mxesf(nlag-1,0) - mxesf(nlag-2,0));
+ mxesf(nlag,1)= mxesf(nlag-1,1);
+
+ return mxesf;
+}
+
+TeMatrix
+TeExponentialSemivarModel :: calculate (TeMatrix& g)
+{
+ TeMatrix mxexp;
+ vector<double> expo;
+ int i, nlag;
+ double c0, c1, a;
+
+ c0=modeloefeitopepita_;
+ c1=modelocontribuicao_;
+ a=modeloalcance_;
+ nlag = g.Nrow();
+ mxexp.Init(nlag+1, 2);
+
+ for (i=0; i<nlag; ++i)
+ {
+ if (g(i,0) == 0)
+ expo.push_back(c0);
+
+ //expo(i) = c0 + c1*( 1 - exp( -(3*g(i,1))/a) );
+ expo.push_back(c0 + c1*( 1 - exp( -(3*g(i,0))/a) ));
+
+ // Escreve Saida
+ mxexp(i+1,0) = g(i,0); // h
+ mxexp(i+1,1) = expo[i]; // gama(h)
+ }
+
+ // quando h=0 => gama(h)=c0
+ mxexp(0,1)=c0;
+
+ // acrescentar o �ltimo valor
+ mxexp(nlag,0)= mxexp(nlag-1,0) + (mxexp(nlag-1,0) - mxexp(nlag-2,0));
+ mxexp(nlag,1)= mxexp(nlag-1,1);
+
+ return mxexp;
+}
+
+TeMatrix
+TeGaussianSemivarModel :: calculate (TeMatrix& g)
+{
+ TeMatrix mxgau;
+ vector<double> gau;
+ int i, nlag;
+ double c0, c1, a;
+
+ c0=modeloefeitopepita_;
+ c1=modelocontribuicao_;
+ a=modeloalcance_;
+ nlag = g.Nrow();
+ mxgau.Init(nlag+1, 2);
+
+ for (i=0; i<nlag; ++i)
+ {
+ if (g(i,0) == 0)
+ gau.push_back(c0);
+
+ // gaus(i) = c0 + c1*( 1 - exp(-3*(g(i,1)/a)^2) );
+ gau.push_back( c0 + c1*( 1 - exp(-3*pow(g(i,0)/a,2))) );
+
+ // Escreve Saida
+ mxgau(i+1,0) = g(i,0); // h
+ mxgau(i+1,1) = gau[i]; // gama(h)
+ }
+
+ // quando h=0 => gama(h)=c0
+ mxgau(0,1)=c0;
+
+ // acrescentar o �ltimo valor
+ mxgau(nlag,0)= mxgau(nlag-1,0) + (mxgau(nlag-1,0) - mxgau(nlag-2,0));
+ mxgau(nlag,1)= mxgau(nlag-1,1);
+
+ return mxgau;
+}
+
+
+/*
+for i=1:nlag;
+ if (g(i,1) == 0)
+ sphe(i) = c0;
+ gaus(i) = c0;
+ expo(i) = c0;
+ elseif (g(i,1) > 0 & g(i,1) < a)
+ sphe(i) = c0 + c1*((1.5*(g(i,1)/a) - 0.5*((g(i,1)/a)^3)));
+ else
+ if (g(i,1) >= a)
+ sphe(i)=c0+c1;
+ end
+ end
+ gaus(i) = c0 + c1*( 1 - exp(-3*(g(i,1)/a)^2) );
+ expo(i) = c0 + c1*( 1 - exp( -(3*g(i,1))/a) );
+
+ % Escreve Saida
+ m(i+1,1) = g(i,1);% lag distance
+
+ switch (model)
+ case 1
+ m(i+1,2) = sphe(i);
+ case 2
+ m(i+1,2) = expo(i);
+ case 3
+ m(i+1,2) = gaus(i);
+ otherwise
+ m(i+1,2) = 0;
+ end
+end
+
+%Para o modelo quando h=0 => gamma(h)=c0
+m(1,2)=c0;
+
+%Para o modelo quando h >= a => gamma(h)=c0+c1
+switch (model)
+ case 1 %Para modelo esferico
+ m(nlag+2,2)= c0+c1;
+
+ case 2 %Para modelo exponencial
+ m(nlag+2,2)= m(nlag+1,2);
+
+ case 3 %Para modelo gaussiano
+ m(nlag+2,2)= m(nlag+1,2);
+end
+*/
diff --git a/src/terralib/application/TeSemivarModelFactory.h b/src/terralib/application/TeSemivarModelFactory.h
new file mode 100644
index 0000000..d9d556d
--- /dev/null
+++ b/src/terralib/application/TeSemivarModelFactory.h
@@ -0,0 +1,153 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeFactorySemivarModel.h
+ This file contains support do deal with factory semivar model
+*/
+
+#ifndef __TERRALIB_INTERNAL_SEMIVARMODEL_H
+#define __TERRALIB_INTERNAL_SEMIVARMODEL_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include <TeMatrix.h>
+#include <TeFactory.h>
+
+struct TeSemivarModelParams
+{
+ double efeitopepita_;
+ double contribuicao_;
+ double alcance_;
+};
+
+
+////////////////////////////////////
+class TeSemivarModel
+{
+public:
+ TeSemivarModel (){};
+ virtual ~TeSemivarModel (){};
+
+ virtual TeMatrix calculate (TeMatrix&)=0;
+ static TeSemivarModel* DefaultObject(TeSemivarModelParams){ return 0; }
+
+protected:
+ double modeloefeitopepita_;
+ double modelocontribuicao_;
+ double modeloalcance_;
+};
+
+////////////////////////////////////
+class TeEsfericSemivarModel : public TeSemivarModel
+{
+public:
+ TeEsfericSemivarModel(const TeSemivarModelParams& params){
+ modeloefeitopepita_ = params.efeitopepita_;
+ modelocontribuicao_ = params.contribuicao_;
+ modeloalcance_ = params.alcance_;
+ }
+
+ virtual ~TeEsfericSemivarModel(){};
+
+ virtual TeMatrix calculate (TeMatrix&);
+};
+
+//////////////////////////////////
+class TeExponentialSemivarModel : public TeSemivarModel
+{
+public:
+ TeExponentialSemivarModel(const TeSemivarModelParams& params){
+ modeloefeitopepita_ = params.efeitopepita_;
+ modelocontribuicao_ = params.contribuicao_;
+ modeloalcance_ = params.alcance_;
+ }
+
+ virtual ~TeExponentialSemivarModel(){};
+
+ virtual TeMatrix calculate (TeMatrix&);
+};
+
+//////////////////////////////////
+class TeGaussianSemivarModel : public TeSemivarModel
+{
+public:
+ TeGaussianSemivarModel(const TeSemivarModelParams& params){
+ modeloefeitopepita_ = params.efeitopepita_;
+ modelocontribuicao_ = params.contribuicao_;
+ modeloalcance_ = params.alcance_;
+ }
+
+ virtual ~TeGaussianSemivarModel(){};
+
+ virtual TeMatrix calculate (TeMatrix&);
+};
+
+
+
+///////////////////////////////////////////////////////////
+// -- Fabrica de Modelos Teoricos de Variabilidade Espacial
+
+class TeSemivarModelFactory : public TeFactory<TeSemivarModel, TeSemivarModelParams>
+{
+public:
+ TeSemivarModelFactory( const string& name) : TeFactory<TeSemivarModel, TeSemivarModelParams>(name){}
+
+ virtual TeSemivarModel* build( const TeSemivarModelParams&) = 0;
+};
+
+
+/////////////////////////////
+class TeEsfericSemivar_Factory : public TeSemivarModelFactory
+{
+public:
+ TeEsfericSemivar_Factory (const string& name) : TeSemivarModelFactory(name){}
+
+ virtual TeSemivarModel* build(const TeSemivarModelParams& params){return new TeEsfericSemivarModel(params);}
+};
+
+
+/////////////////////////////
+class TeExponentialSemivar_Factory : public TeSemivarModelFactory
+{
+public:
+ TeExponentialSemivar_Factory (const string& name) : TeSemivarModelFactory(name){}
+
+ virtual TeSemivarModel* build(const TeSemivarModelParams& params){return new TeExponentialSemivarModel(params);}
+};
+
+
+/////////////////////////////
+class TeGaussianSemivar_Factory : public TeSemivarModelFactory
+{
+public:
+ TeGaussianSemivar_Factory (const string& name) : TeSemivarModelFactory(name){}
+
+ virtual TeSemivarModel* build(const TeSemivarModelParams& params){return new TeGaussianSemivarModel(params);}
+};
+
+
+#endif
+
+
diff --git a/src/terralib/application/TeThemeApplication.cpp b/src/terralib/application/TeThemeApplication.cpp
new file mode 100644
index 0000000..1cdc086
--- /dev/null
+++ b/src/terralib/application/TeThemeApplication.cpp
@@ -0,0 +1,345 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeThemeApplication.h"
+#include "TeUtils.h"
+#include "TeDatabase.h"
+#include "TeDatabaseUtils.h"
+
+
+unsigned int TeThemeApplication::getTableIndexFromField(string fieldName)
+{
+ unsigned int i, n, index;
+ index = 0;
+ n = attTableVector_[0].attributeList().size();
+ for (i = 0; i < sqlAttList_.size(); ++i)
+ {
+ if (i > n - 1)
+ {
+ ++index;
+ n += attTableVector_[index].attributeList().size();
+ }
+
+ if (sqlAttList_[i].rep_.name_ == fieldName)
+ break;
+ }
+ return index;
+}
+
+
+
+bool TeThemeApplication::locateText (TeCoord2D &pt, TeText &text, const double& tol)
+{
+ TeDatabasePortal* portal = layer()->database()->getPortal();
+ string table = textTable();
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+ string q = "SELECT " + table + ".* FROM " + table + ", " + collectionTable();
+ char buf [1024];
+ sprintf (buf," WHERE c_object_id = object_id AND (x < %f AND x > %f AND y < %f AND y > %f)",
+ box.x2(),box.x1(),box.y2(),box.y1());
+ q += buf;
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ // Look for all texts
+ bool flag = true;
+ TeTextSet ts;
+ do
+ {
+ TeText p;
+ flag = portal->fetchGeometry(p);
+ ts.add ( p );
+ } while (flag);
+
+ delete portal;
+
+ int k;
+ if (TeNearest (pt, ts, k, tol))
+ {
+ text = ts[k];
+ return true;
+ }
+ return false;
+}
+
+TeVisual TeThemeApplication::getTextVisual(const TeText &text)
+{
+ int dot_height, rgb;
+ string family;
+ string table = textTable() + "_txvisual";
+ bool fix_size = false, bold = false, italic = false;
+ TeDatabase* db = layer()->database();
+
+ string sel = "SELECT dot_height, fix_size, color, family, bold, italic FROM ";
+ sel += table + " WHERE geom_id = " + Te2String(text.geomId());
+
+ TeDatabasePortal* portal = db->getPortal();
+ if(portal->query(sel))
+ {
+ if(portal->fetchRow())
+ {
+ dot_height = atoi(portal->getData(0));
+ if(atoi(portal->getData(1)))
+ fix_size = true;
+ rgb = atoi(portal->getData(2));
+ family = portal->getData(3);
+ if(atoi(portal->getData(4)))
+ bold = true;
+ if(atoi(portal->getData(5)))
+ italic = true;
+ }
+ }
+ delete portal;
+ TeColor cor((rgb >> 16) & 0xff, (rgb >> 8) & 0xff, rgb & 0xff);
+ TeVisual visual;
+ visual.size(dot_height);
+ visual.fixedSize(fix_size);
+ visual.color(cor);
+ visual.family(family);
+ visual.bold(bold);
+ visual.italic(italic);
+
+ return visual;
+}
+
+
+string TeThemeApplication::getLegendTitleAlias()
+{
+ string text;
+
+ TeLegendEntryVector& legendVector = legend();
+ if (legendVector.size() > 0)
+ {
+ TeDatabase* database = layer()->database();
+ TeAttributeRep rep;
+ string nattr;
+ if(grouping())
+ {
+ rep = grouping()->groupAttribute_;
+ nattr = grouping()->groupNormAttribute_;
+ }
+ text = rep.name_;
+ map<int, map<string, string> >::iterator it = database->mapThemeAlias().find(id());
+ if(it != database->mapThemeAlias().end())
+ {
+ map<string, string>& m = it->second;
+ map<string, string>::iterator tit = m.find(text);
+ if(tit != m.end())
+ text = tit->second;
+ if(!(nattr.empty() || nattr == "NONE"))
+ {
+ tit = m.find(nattr);
+ if(tit != m.end()) {
+ if (!tit->second.empty()) {
+ text += "/" + tit->second;
+ }
+ }
+ else //Deixando ficar sem barra
+ text += "/" + nattr;
+ }
+ }
+ }
+ return text;
+}
+
+string TeThemeApplication:: getPieBarAlias(string atr)
+{
+ string text;
+
+ if (chartAttributes_.size() > 0)
+ {
+ TeDatabase* database = layer()->database();
+ map<int, map<string, string> >::iterator it = database->mapThemeAlias().find(id());
+ if(it != database->mapThemeAlias().end())
+ {
+ map<string, string>& m = it->second;
+ map<string, string>::iterator tit = m.find(atr);
+ if(tit != m.end())
+ text = tit->second;
+ }
+ }
+ return text;
+}
+
+bool TeThemeApplication::setAlias(string attr, string attAlias)
+{
+ TeDatabase* db = layer()->database();
+ map<int, map<string, string> >& mapThemeAlias = db->mapThemeAlias();
+ map<string, string>& mapAA = mapThemeAlias[id()];
+ map<string, string>::iterator it = mapAA.begin();
+
+ while(it != mapAA.end())
+ {
+ if(it->first != attr && it->second == attAlias)
+ return false;
+ it++;
+ }
+
+ int f = attr.find("/");
+ int af = attAlias.find("/");
+ if(f >= 0 && af >= 0)
+ {
+ string nattr = attr;
+ attr.erase(f, attr.size()-f);
+ nattr.erase(0, f+1);
+
+ string alias = attAlias;
+ string nalias = alias;
+ alias.erase(af, alias.size()-af);
+ nalias.erase(0, af+1);
+
+ mapAA[attr] = alias;
+ mapAA[nattr] = nalias;
+ updateThemeApplication (db, this);
+ return true;
+ }
+ else
+ {
+ //Alterando para deixar ficar sem /
+ if(f >= 0) {
+ string nattr = attr;
+ nattr.erase(0, f+1);
+ mapAA[nattr] = "";
+ attr.erase(f, attr.size()-f);
+ }
+ mapAA[attr] = attAlias;
+ updateThemeApplication (db, this);
+ return true;
+ }
+}
+
+void TeThemeApplication::removeAlias(string attribute)
+{
+ string attr = attribute;
+ string nattr = attr;
+ TeDatabase* db = layer()->database();
+ map<int, map<string, string> >& mapThemeAlias = db->mapThemeAlias();
+ map<string, string>& mapAA = mapThemeAlias[id()];
+
+ int f = attr.find("/");
+ if(f >= 0)
+ {
+ attr.erase(f, attr.size()-f);
+ nattr.erase(0, f+1);
+ }
+ map<string, string>::iterator it = mapAA.find(attr);
+ if(it != mapAA.end())
+ {
+ mapAA.erase(it);
+ if(mapAA.size() == 0)
+ {
+ map<int, map<string, string> >::iterator tit = mapThemeAlias.find(id());
+ if(tit != mapThemeAlias.end())
+ mapThemeAlias.erase(tit);
+ }
+ }
+ if(nattr != attr)
+ {
+ map<string, string>::iterator it = mapAA.find(nattr);
+ if(it != mapAA.end())
+ {
+ mapAA.erase(it);
+ if(mapAA.size() == 0)
+ {
+ map<int, map<string, string> >::iterator tit = mapThemeAlias.find(id());
+ if(tit != mapThemeAlias.end())
+ mapThemeAlias.erase(tit);
+ }
+ }
+ }
+
+ updateThemeApplication (db, this);
+}
+
+void TeThemeApplication::removeAllAlias()
+{
+ TeDatabase* db = layer()->database();
+ map<int, map<string, string> >& mapThemeAlias = db->mapThemeAlias();
+ map<int, map<string, string> >::iterator it = mapThemeAlias.find(id());
+ if(it != mapThemeAlias.end())
+ mapThemeAlias.erase(it);
+ updateThemeApplication (db, this);
+}
+
+void TeThemeApplication::concatTableName(string& attr)
+{
+ string tableName;
+
+ if(attr.find(".") == attr.npos)
+ {
+ TeAttrTableVector::iterator it = attTableVector_.begin();
+
+ while(it != attTableVector_.end())
+ {
+ TeTable t = *it;
+ TeAttributeList AL = t.attributeList();
+ TeAttributeList::iterator iit = AL.begin();
+
+ while(iit != AL.end())
+ {
+ if((*iit).rep_.name_ == attr)
+ {
+ tableName = (*it).name();
+ break;
+ }
+ iit++;
+ }
+
+ if(tableName.empty() == false)
+ {
+ tableName += ".";
+ attr.insert(0, tableName);
+ break;
+ }
+ it++;
+ }
+ }
+}
+
+
+
+int TeThemeApplication::numObjects() {
+
+ int numRows;
+
+ string s = "SELECT COUNT(*) " + sqlFrom();
+ TeDatabasePortal* portal = layer_->database()->getPortal();
+ if(portal->query(s))
+ {
+ if(portal->fetchRow())
+ {
+ numRows = atoi(portal->getData(0));
+ }
+ }
+
+ delete portal;
+ return numRows;
+
+}
+
+TeBox TeThemeApplication::boundingBox() {
+ return layer_->database()->getThemeBox(this);
+}
diff --git a/src/terralib/application/TeThemeApplication.h b/src/terralib/application/TeThemeApplication.h
new file mode 100644
index 0000000..e6b8317
--- /dev/null
+++ b/src/terralib/application/TeThemeApplication.h
@@ -0,0 +1,314 @@
+/************************************************************************************
+ TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_THEMEAPLICATION_H
+#define __TERRALIB_INTERNAL_THEMEAPLICATION_H
+
+#include "TeTheme.h"
+
+struct RepMap {
+ map<int, TePolygon> polygonMap_;
+ map<int, TeLine2D> lineMap_;
+};
+
+
+class TeThemeApplication: public TeTheme
+{
+public:
+
+ //! Constructor
+ TeThemeApplication( const string& name="", TeLayer* layer=0, TeViewNode* parent = 0, int view=0, int id=0)
+ : TeTheme(name, layer, parent, view, id),
+ outOfCollectionVisibility_(false),
+ withoutDataConnectionVisibility_(false),
+ refineAttributeWhere_(""),
+ refineSpatialWhere_(""),
+ refineTemporalWhere_(""),
+ groupColorDir_(TeColorAscSatEnd),
+ groupObjects_(TeAll),
+ pieDiameter_ (0.0),
+ pieMinDiameter_(0.0),
+ pieMaxDiameter_(0.0),
+ barMinHeight_(0.0),
+ barMaxHeight_(0.0),
+ barWidth_(0.0),
+ chartMaxVal_(-1),
+ chartMinVal_(-1),
+ chartType_(TeBarChart),
+ chartObjects_(TeAll),
+ chartFunction_("AVG"),
+ keepDimension_(0),
+ showCanvasLegend_(false),
+ canvasLegWidth_(0.0),
+ canvasLegHeight_(0.0),
+ editRep_ (TeGeomRep(0)),
+ mix_color_(false),
+ count_obj_(false),
+ textTable_("")
+ {}
+
+ //! Destructor
+ ~TeThemeApplication () {}
+
+ //! Returns TRUE if objects of the layer that don�t belong to the theme are visible
+ bool outOfCollectionVisibility()
+ { return outOfCollectionVisibility_;}
+ //! Set whether objects of the layer that don�t belong to the theme are visible
+ void outOfCollectionVisibility(bool v)
+ { outOfCollectionVisibility_ = v;}
+
+ //! Returns TRUE if objects whithout descriptive attributes are visible
+ bool withoutDataConnectionVisibility()
+ { return withoutDataConnectionVisibility_;}
+ //! Set whether objects whithout descriptive attributes are visible
+ void withoutDataConnectionVisibility(bool v)
+ { withoutDataConnectionVisibility_ = v;}
+
+ //! Returns a attribute restriction (where clause) used to refine the selection defined by the theme
+ string refineAttributeWhere() { return refineAttributeWhere_; }
+ //! Set a attribute restriction (where clause) to refine the selection defined by the theme
+ void refineAttributeWhere(const string& s) { refineAttributeWhere_ = s; }
+
+ //! Returns a spatial restriction (where clause) used to refine the selection defined by the theme
+ string refineSpatialWhere() { return refineSpatialWhere_; }
+ //! Set a spatial restriction (where clause) used to refine the selection defined by the theme
+ void refineSpatialWhere(const string& s) { refineSpatialWhere_ = s; }
+
+ //! Returns a temporal restriction (where clause) used to refine the selection defined by the theme
+ string refineTemporalWhere() { return refineTemporalWhere_; }
+ //! Set a temporal restriction (where clause) used to refine the selection defined by the theme
+ void refineTemporalWhere(const string& t) { refineTemporalWhere_ = t; }
+
+ //! Returns the grouping colors
+ string groupColor () { return groupColor_ ; }
+ //! Set the grouping colors
+ void groupColor (const string& c) { groupColor_ = c; }
+
+ //! Returns the grouping colors direction
+ TeColorDirection groupColorDir() { return groupColorDir_; }
+ //! Set the grouping colors direction
+ void groupColorDir(TeColorDirection n){ groupColorDir_ = n; }
+
+ //! Returns a code identifying which objects should be grouped
+ TeSelectedObjects groupObjects() { return groupObjects_; }
+ //! Set a code identifying which objects should be grouped
+ void groupObjects(TeSelectedObjects n) { groupObjects_ = n; }
+
+ //! Returns the diameter in pixels of the pie charts
+ double pieDiameter() { return pieDiameter_; };
+ //! Set the diameter in pixels of the pie charts
+ void pieDiameter(double n) { pieDiameter_ = n; };
+
+ //! Returns the name of the attribute which gives the dimension of the diameter in pixels of the pie charts
+ string pieDimAttribute() { return pieAttr_; }
+ //! Set the name of the attribute which gives the dimension of the diameter in pixels of the pie charts
+ void pieDimAttribute(const string& s) { pieAttr_ = s; }
+
+ //! Returns the minimum diameter in pixels of the pie charts
+ double pieMinDiameter() { return pieMinDiameter_; };
+ //! Set the minimum diameter in pixels of pie charts
+ void pieMinDiameter(double n) { pieMinDiameter_ = n; };
+
+ //! Returns the maximum diameter in pixels of the pie charts
+ double pieMaxDiameter() { return pieMaxDiameter_; };
+ //! Set the maximum diameter in pixels of pie charts
+ void pieMaxDiameter(double n) { pieMaxDiameter_ = n; };
+
+ //! Returns the minimum height in pixels of the bar charts
+ double barMinHeight() { return barMinHeight_; };
+ //! Set the minimum height in pixels of the bar charts
+ void barMinHeight(double n) { barMinHeight_ = n; };
+
+ //! Returns the maximum height in pixels of the bar charts
+ double barMaxHeight() { return barMaxHeight_; };
+ //! Set the maximum height in pixels of the bar charts
+ void barMaxHeight(double n) { barMaxHeight_ = n; };
+
+ //! Returns the bar width in pixels of the bar charts
+ double barWidth() { return barWidth_; };
+ //! Set the bar width in pixels of the bar charts
+ void barWidth(double n) { barWidth_ = n; };
+
+ //! Returns the type of the chart
+ TeChartType chartType() {return chartType_;}
+ //! Set the type of the chart
+ void chartType(TeChartType n) { chartType_ = n; }
+
+ //! Get the chart aggregate function
+ string chartFunction() { return chartFunction_; }
+
+ //! Set the chart aggregate function
+ void chartFunction(string s) { chartFunction_ = s; }
+
+ //! Returns the objects where the charts should be plotted
+ TeSelectedObjects chartObjects() { return chartObjects_; };
+ //! Set the objects where the charts should be plotted
+ void chartObjects(TeSelectedObjects n) { chartObjects_ = n; };
+
+ //! Returns the maximum value used to plot charts
+ double chartMaxVal() { return chartMaxVal_; }
+ //! Set the maximum value used to plot charts
+ void chartMaxVal(double n) { chartMaxVal_ = n; }
+
+ //! Returns the minimum value used to plot charts
+ double chartMinVal() { return chartMinVal_; }
+ //! Set the minimum value used to plot charts
+ void chartMinVal(double n) { chartMinVal_ = n; }
+
+ //! Returns TRUE if charts keep its dimension in zooming operations
+ int keepDimension() { return keepDimension_; };
+ //! Set if charts keep its dimension in zooming operations
+ void keepDimension(int n) { keepDimension_ = n; };
+
+ //! Returns TRUE if the legends of the grouping should be plot in the canvas
+ bool showCanvasLegend()
+ { return showCanvasLegend_; }
+ //! Set whether the legends of the grouping should be plot in the canvas
+ void showCanvasLegend(bool cl)
+ { showCanvasLegend_ = cl; }
+
+ //! Returns the upper left position of the canvas legend
+ TeCoord2D canvasLegUpperLeft()
+ { return canvasLegUpperLeft_; }
+ //! Set the upper left position of the canvas legend
+ void canvasLegUpperLeft(TeCoord2D c)
+ { canvasLegUpperLeft_ = c; }
+ //! Returns the canvas legend width
+ double canvasLegWidth()
+ { return canvasLegWidth_; }
+ //! Set the canvas legend width
+ void canvasLegWidth(double w)
+ { canvasLegWidth_ = w; }
+ //! Returns the canvas legend height
+ double canvasLegHeight()
+ { return canvasLegHeight_; }
+ //! Set the canvas legend height
+ void canvasLegHeight(double h)
+ { canvasLegHeight_ = h; }
+
+ //! Returns the geometrical representation being edited
+ TeGeomRep editRep() {return editRep_;}
+ //! Set the geometrical representation being edited
+ void editRep(TeGeomRep r) {editRep_ = r;}
+
+ //! Get the table index from the list of the theme tables, through a given field
+ unsigned int getTableIndexFromField(string fieldName);
+
+ bool mixColor()
+ { return mix_color_; }
+
+ void mixColor(bool mixcolor)
+ { mix_color_ = mixcolor; }
+
+ bool countObj()
+ { return count_obj_; }
+
+ void countObj(bool countobj)
+ { count_obj_ = countobj; }
+
+ //! Returns the name of a text table that is visible by this theme (used to label objects)
+ string textTable() { return textTable_; }
+
+ //! Set the name of a text table that is visible by this theme (used to label objects)
+ void textTable(const string& t) { textTable_ = t; }
+
+ bool locateText (TeCoord2D &pt, TeText &text, const double& tol = 0.0);
+
+ TeVisual getTextVisual(const TeText &text);
+
+ bool setAlias(string att, string attAlias);
+
+ string getLegendTitleAlias();
+
+ string getPieBarAlias(string atr);
+
+ void removeAlias(string att);
+
+ void removeAllAlias();
+
+ void concatTableName(string &attr);
+
+ //! Returns the number of objects in a theme
+ int numObjects();
+
+ //! Returns the bounding box of the theme
+ TeBox boundingBox();
+
+
+
+ //! Vector of colors used to plot the charts
+ vector<TeColor> chartColors_;
+ //! Vector of attributes used to plot the charts
+ vector<string> chartAttributes_;
+
+ string chartSelected_;
+ TeCoord2D chartPoint_;
+ TePoint tePoint_;
+
+private:
+
+ bool outOfCollectionVisibility_;
+ bool withoutDataConnectionVisibility_;
+
+ // Refining
+ string refineAttributeWhere_;
+ string refineSpatialWhere_;
+ string refineTemporalWhere_;
+
+ string groupColor_;
+ TeColorDirection groupColorDir_;
+ TeSelectedObjects groupObjects_;
+
+ double pieDiameter_;
+ string pieAttr_;
+ double pieMinDiameter_;
+ double pieMaxDiameter_;
+
+ double barMinHeight_;
+ double barMaxHeight_;
+ double barWidth_;
+
+ double chartMaxVal_;
+ double chartMinVal_;
+ TeChartType chartType_;
+ TeSelectedObjects chartObjects_;
+ string chartFunction_;
+
+ int keepDimension_;
+
+ bool showCanvasLegend_; //to show or not the legend in the canvas
+ TeCoord2D canvasLegUpperLeft_; //legend�s upper left point
+ double canvasLegWidth_; //legend width
+ double canvasLegHeight_; //legend height
+
+ TeGeomRep editRep_;
+
+ bool mix_color_;
+ bool count_obj_;
+
+ string textTable_;
+};
+
+
+#endif
+
diff --git a/src/terralib/application/TeUpdateDBVersion.cpp b/src/terralib/application/TeUpdateDBVersion.cpp
new file mode 100644
index 0000000..686a623
--- /dev/null
+++ b/src/terralib/application/TeUpdateDBVersion.cpp
@@ -0,0 +1,545 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeUpdateDBVersion.h"
+
+bool needUpdateDB(TeDatabase* db, string& DBversion)
+{
+ TeDatabasePortal* portal = db->getPortal();
+ if(!portal)
+ return false;
+
+ string sql = " SELECT db_version FROM te_database ";
+ if(!portal->query(sql))
+ {
+ DBversion = "";
+ delete portal;
+ return true;
+ }
+
+ if(!portal->fetchRow())
+ {
+ DBversion = "";
+ delete portal;
+ return true;
+ }
+
+ DBversion = portal->getData(0);
+ if(DBversion=="3.0.2") //3.0 Plus
+ {
+ delete portal;
+ return false;
+ }
+
+ delete portal;
+ return true;
+}
+
+
+bool updateDBVersion(TeDatabase* db, string& DBversion, string& errorMessage)
+{
+ //from old version to 3.0
+ if(DBversion=="")
+ {
+ if(!updateDB30To301(db, errorMessage))
+ return false;
+
+ if(!updateDB20To30(db, errorMessage))
+ return false;
+
+ DBversion = "3.0.1";
+ }
+
+ //from 3.0 to 3.0.1
+ if(DBversion=="3.0")
+ {
+ if(!updateDB30To301(db, errorMessage))
+ return false;
+
+ DBversion = "3.0.1";
+ }
+
+ //from 3.0.1 to 3.0.2
+ if(DBversion=="3.0.1")
+ {
+ if(!updateDB301To302(db, errorMessage))
+ return false;
+
+ DBversion = "3.0.2";
+ }
+
+ if(DBversion!="3.0.2")
+ return false;
+
+ string del= "DELETE FROM te_database";
+ if(!db->execute(del))
+ return false;
+
+ string ins = "INSERT INTO te_database (db_version) VALUES ('3.0.2')";
+ if(!db->execute(ins))
+ return false;
+
+ return true;
+}
+
+
+bool updateDB20To30(TeDatabase* db, string& errorMessage)
+{
+ TeAttribute fattr;
+
+ // ----- te_grouping
+
+ if(db->columnExist("te_grouping", "grouping_function", fattr) == false)
+ {
+ TeAttributeRep atRep;
+ atRep.type_ = TeSTRING;
+ atRep.name_ = "grouping_function";
+ atRep.numChar_ = 10;
+ if(db->addColumn("te_grouping", atRep) == false)
+ {
+ errorMessage = "The column grouping_function could not be appended!";
+ return false;
+ }
+
+ string upd;
+ if(db->columnExist("te_theme_application", "group_function", fattr))
+ {
+ upd = " UPDATE te_grouping g, te_theme_application ta ";
+ upd += " SET g.grouping_function = ta.group_function ";
+ upd += " WHERE ta.theme_id = g.theme_id ";
+
+ if(!db->execute (upd))
+ return false;
+
+ db->deleteColumn("te_theme_application", "group_function");
+ }
+ else
+ {
+ upd = " UPDATE te_grouping g ";
+ upd += " SET g.grouping_function = 'AVG' ";
+
+ if(!db->execute (upd))
+ return false;
+ }
+ }
+
+ // ----- te_theme_application
+
+ if(db->columnExist("te_theme_application", "chart_function", fattr) == false)
+ {
+ TeAttributeRep atRep;
+ atRep.type_ = TeSTRING;
+ atRep.name_ = "chart_function";
+ atRep.numChar_ = 10;
+ if(db->addColumn("te_theme_application", atRep) == false)
+ {
+ errorMessage = "The column chart_function could not be appended!";
+ return false;
+ }
+ db->execute("UPDATE te_theme_application SET chart_function = 'AVG'");
+ }
+
+ // ----- te_theme
+ if(db->columnExist("te_theme", "visible_rep", fattr) == false)
+ {
+ TeAttributeRep atRep;
+ atRep.type_ = TeINT;
+ atRep.name_ = "visible_rep";
+ if(db->addColumn("te_theme", atRep) == false)
+ {
+ errorMessage = "The column visible_rep could not be appended!";
+ return false;
+ }
+
+ atRep.name_ = "enable_visibility";
+ if(db->addColumn("te_theme", atRep) == false)
+ {
+ errorMessage = "The column enable_visibility could not be appended!";
+ return false;
+ }
+
+ string upd = " UPDATE te_theme t, te_theme_application ta ";
+ upd += " SET t.visible_rep = ta.visible_rep ";
+ upd += " WHERE ta.theme_id = t.theme_id ";
+ if(!db->execute (upd))
+ return false;
+
+ upd = " UPDATE te_theme t, te_theme_application ta ";
+ upd += " SET t.enable_visibility = ta.enable_visibility ";
+ upd += " WHERE ta.theme_id = t.theme_id ";
+ if(!db->execute (upd))
+ return false;
+
+ db->deleteColumn("te_theme_application", "visible_rep");
+ db->deleteColumn("te_theme_application", "enable_visibility");
+ }
+
+ //if for ADO passar todas as tabelas para aceitar comprimento iguel a zero!!!
+ if(db->dbmsName() == "Ado")
+ {
+ //te_layer
+ //te_layer_table
+ db->allowEmptyString ("te_layer_table", "attr_initial_time");
+ db->allowEmptyString ("te_layer_table", "attr_final_time");
+ db->allowEmptyString ("te_layer_table", "user_name");
+
+ //te_representation
+ db->allowEmptyString ("te_representation", "description");
+
+ //te_view
+ db->allowEmptyString ("te_view", "user_name");
+
+ //te_visual
+ db->allowEmptyString ("te_visual", "lib_name");
+ db->allowEmptyString ("te_visual", "contour_lib_name");
+ db->allowEmptyString ("te_visual", "family");
+
+ //te_legend
+ db->allowEmptyString ("te_legend", "lower_value");
+ db->allowEmptyString ("te_legend", "upper_value");
+ db->allowEmptyString ("te_legend", "label");
+
+ //te_theme
+ db->allowEmptyString ("te_theme", "generate_attribute_where");
+ db->allowEmptyString ("te_theme", "generate_spatial_where");
+ db->allowEmptyString ("te_theme", "generate_temporal_where");
+ db->allowEmptyString ("te_theme", "collection_table");
+
+ //te_grouping
+ db->allowEmptyString ("te_grouping", "grouping_attr");
+ db->allowEmptyString ("te_grouping", "grouping_norm_attr");
+ db->allowEmptyString ("te_grouping", "grouping_function");
+
+ //te_theme_application
+ db->allowEmptyString ("te_theme_application", "refine_attribute_where");
+ db->allowEmptyString ("te_theme_application", "refine_spatial_where");
+ db->allowEmptyString ("te_theme_application", "refine_temporal_where");
+ db->allowEmptyString ("te_theme_application", "grouping_color");
+ db->allowEmptyString ("te_theme_application", "pie_dimension_attr");
+ db->allowEmptyString ("te_theme_application", "text_table");
+ db->allowEmptyString ("te_theme_application", "chart_function");
+ }
+
+ //------------ auxiliary collection
+ TeDatabasePortal* portal = db->getPortal();
+ if(!portal)
+ return false;
+
+ string sql = " SELECT theme_id, visible_rep FROM te_theme ";
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return true;
+ }
+
+ while(portal->fetchRow ())
+ {
+ string themeId = portal->getData(0);
+ int visRep = atoi(portal->getData(1));
+
+ string collExtTable = "te_collection_"+ themeId +"_aux";
+
+ if ((db->tableExist("te_collection_"+ themeId)) &&
+ ((visRep & TeRASTER) != TeRASTER) &&
+ (!db->tableExist(collExtTable)))
+ {
+ TeTheme* theme = new TeTheme();
+ theme->id(atoi(themeId.c_str()));
+ if(!db->loadTheme (theme))
+ {
+ delete portal;
+ return false;
+ }
+
+ string up = "UPDATE " + theme->collectionTable() + " SET c_object_status = 0";
+ up += " WHERE c_object_status <> " + Te2String(theme->pointingLegend().id());
+ up += " AND c_object_status <> " + Te2String(theme->queryLegend().id());
+ up += " AND c_object_status <> " + Te2String(theme->queryAndPointingLegend().id());
+ db->execute(up);
+
+ up = "UPDATE " + theme->collectionTable() + " SET c_object_status = 1";
+ up += " WHERE c_object_status = " + Te2String(theme->pointingLegend().id());
+ db->execute(up);
+
+ up = "UPDATE " + theme->collectionTable() + " SET c_object_status = 2";
+ up += " WHERE c_object_status = " + Te2String(theme->queryLegend().id());
+ db->execute(up);
+
+ up = "UPDATE " + theme->collectionTable() + " SET c_object_status = 3";
+ up += " WHERE c_object_status = " + Te2String(theme->queryAndPointingLegend().id());
+ db->execute(up);
+
+ if ((!theme->createCollectionAuxTable()) || (!theme->populateCollectionAux()))
+ {
+ errorMessage = "Fail to mount the auxiliary table of the collection!";
+ delete portal;
+ return false;
+ }
+
+ theme->collectionAuxTable(collExtTable);
+ theme->addThemeTable(collExtTable);
+
+ string oldTCE = theme->collectionTable() + "_ext";
+ if (db->tableExist(oldTCE))
+ {
+ string delTable = "DROP TABLE " + oldTCE;
+ db->execute(delTable);
+ }
+ }
+
+ }
+ //------------ end auxiliary collection
+
+ portal->freeResult();
+
+ //------------ text table
+ // if text table have not text visual table associated, create it
+ string sel = "SELECT geom_table FROM te_representation WHERE";
+ sel += " geom_type = " + Te2String(TeTEXT);
+ if(portal->query(sel))
+ {
+ while(portal->fetchRow())
+ {
+ string table = portal->getData(0);
+ string tvis = table + "_txvisual";
+ if(!db->tableExist(tvis))
+ {
+ TeAttributeList atl;
+ TeAttribute at;
+
+ at.rep_.name_ = "geom_id";
+ at.rep_.type_ = TeINT;
+ at.rep_.numChar_ = 0;
+ at.rep_.isPrimaryKey_ = true;
+ atl.push_back(at);
+
+ at.rep_.isPrimaryKey_ = false;
+ at.rep_.name_ = "dot_height";
+ at.rep_.type_ = TeINT;
+ atl.push_back(at);
+
+ at.rep_.name_ = "fix_size";
+ at.rep_.type_ = TeINT;
+ atl.push_back(at);
+
+ at.rep_.name_ = "color";
+ at.rep_.type_ = TeINT;
+ atl.push_back(at);
+
+ at.rep_.name_ = "family";
+ at.rep_.type_ = TeSTRING;
+ at.rep_.numChar_ = 128;
+ atl.push_back(at);
+
+ at.rep_.name_ = "bold";
+ at.rep_.type_ = TeINT;
+ at.rep_.numChar_ = 0;
+ atl.push_back(at);
+
+ at.rep_.name_ = "italic";
+ at.rep_.type_ = TeINT;
+ atl.push_back(at);
+
+ db->createTable(tvis, atl);
+ string fk = "fk_" + tvis;
+ db->createRelation(fk, tvis, "geom_id", table, "geom_id", true);
+ string ins = "INSERT INTO " + tvis + " (geom_id) SELECT geom_id FROM " + table;
+ db->execute(ins);
+
+ string popule = "UPDATE " + tvis;
+ popule += " SET dot_height = 12";
+ popule += ", fix_size = 0";
+ popule += ", color = 16711680";
+ popule += ", family = 'verdana'";
+ popule += ", bold = 1";
+ popule += ", italic = 0";
+ if(!db->execute(popule))
+ {
+ errorMessage = "Fail to generate the text visual table!";
+ delete portal;
+ return false;;
+ }
+ }
+ }
+ }
+ //------------ end text table
+ delete portal;
+ return true;
+}
+
+
+bool updateDB30To301(TeDatabase* db, string& errorMessage)
+{
+ TeAttribute fattr;
+
+ TeDatabasePortal* portal = db->getPortal();
+ if(!portal)
+ return false;
+
+ // ----- collection_table
+
+ string sql = " SELECT collection_table FROM te_theme ";
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ string collName = portal->getData(0);
+ if( (db->tableExist(collName)) &&
+ (!db->columnExist(collName, "c_object_status", fattr)))
+ {
+ TeAttributeRep atRep;
+ atRep.type_ = TeINT;
+ atRep.name_ = "c_object_status";
+ if(db->addColumn(collName, atRep) == false)
+ {
+ errorMessage = "The column c_object_status could not be appended!";
+ delete portal;
+ return false;
+ }
+
+ string upd = " UPDATE "+collName+" t1, "+collName+" t2 ";
+ upd += " SET t1.c_object_status = t2.c_legend_result ";
+ upd += " WHERE t1.c_object_id = t2.c_object_id ";
+
+ if(!db->execute (upd))
+ {
+ delete portal;
+ return false;
+ }
+
+ db->deleteColumn(collName, "c_legend_result");
+ }
+ }
+
+ delete portal;
+ return true;
+}
+
+
+bool updateDB301To302(TeDatabase* db, string& errorMessage)
+{
+
+ TeDatabasePortal* portal = db->getPortal();
+ if(!portal)
+ return false;
+
+ // ----- valid attribute table
+
+ TeAttrTableVector attrTableVec;
+ if(db->getAttrTables(attrTableVec))
+ {
+ for(unsigned int i=0; i<attrTableVec.size(); ++i)
+ {
+ TeTable fromTable = attrTableVec[i];
+ bool flag = false;
+
+ if(fromTable.tableType()==TeAttrMedia)
+ continue;
+
+ //verify if there is another table with the same name
+ for(unsigned int j=0; j<i; ++j)
+ {
+ if(TeConvertToUpperCase(attrTableVec[j].name())==TeConvertToUpperCase(fromTable.name()))
+ {
+ flag = true;
+ break;
+ }
+ }
+
+ if(flag)
+ continue;
+
+ if(db->validTable(fromTable)) //fromTable was modified
+ {
+ TeAttributeList newAttrList = fromTable.attributeList();
+ TeAttributeList oldAttrList = attrTableVec[i].attributeList();
+ TeAttributeList::iterator newAttIt = newAttrList.begin();
+ TeAttributeList::iterator oldAttIt = oldAttrList.begin();
+
+ bool change = false;
+ while(newAttIt!=newAttrList.end())
+ {
+ if(((*oldAttIt).rep_.name_) != ((*newAttIt).rep_.name_))
+ {
+ TeAttributeRep rep = (*newAttIt).rep_;
+ if(db->alterTable(fromTable.name(), rep, (*oldAttIt).rep_.name_))
+ change = true;
+ }
+
+ ++newAttIt;
+ ++oldAttIt;
+ }
+
+ if(change)
+ {
+ // update te_layer_table
+ string upd = " UPDATE te_layer_table ";
+ upd += " SET unique_id = '"+ fromTable.uniqueName() +"'";
+ upd += ", attr_link = '"+ fromTable.linkName() +"'";
+ upd += " WHERE attr_table = '"+ fromTable.name() +"'";
+
+ if(!db->execute (upd))
+ {
+ delete portal;
+ errorMessage = "Error updating te_layer_table!";
+ return false;
+ }
+ }
+ }//if
+ }//for
+ portal->freeResult();
+ }
+
+ // ----- te_grouping table
+
+ string sel = " SELECT theme_id, grouping_attr, grouping_attr_type FROM te_grouping ";
+ if(!portal->query(sel))
+ {
+ delete portal;
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ string themeId, gAttr;
+ themeId = portal->getData(0);
+ gAttr = portal->getData(1);
+ int gTypr = portal->getInt(2);
+
+ if(((gAttr.empty()) || (gAttr=="NONE")) && (gTypr==0))
+ {
+ string del = " DELETE FROM te_grouping WHERE theme_id = "+ themeId;
+ db->execute(del);
+ }
+ }
+
+ // ----- te_grouping table
+
+ delete portal;
+ return true;
+}
+
diff --git a/src/terralib/application/TeUpdateDBVersion.h b/src/terralib/application/TeUpdateDBVersion.h
new file mode 100644
index 0000000..528f584
--- /dev/null
+++ b/src/terralib/application/TeUpdateDBVersion.h
@@ -0,0 +1,46 @@
+/************************************************************************************
+ TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_UPDATEDBVERSION_H
+#define __TERRALIB_INTERNAL_UPDATEDBVERSION_H
+
+#include "TeDatabase.h"
+
+//! verify if the database needs update
+bool needUpdateDB(TeDatabase* db, string& DBversion);
+
+//! update database version
+bool updateDBVersion(TeDatabase* db, string& DBversion, string& errorMessage);
+
+//! update database from release 2.0 to release 3.0
+bool updateDB20To30(TeDatabase* db, string& errorMessage);
+
+//! update database from release 3.0 to release 3.0.1
+bool updateDB30To301(TeDatabase* db, string& errorMessage);
+
+//! update database from release 3.0.1 to release 3.0.2 (3.0 Plus)
+bool updateDB301To302(TeDatabase* db, string& errorMessage);
+
+
+#endif
+
diff --git a/src/terralib/application/qt/TeDecoderQtImage.cpp b/src/terralib/application/qt/TeDecoderQtImage.cpp
new file mode 100644
index 0000000..cf4f005
--- /dev/null
+++ b/src/terralib/application/qt/TeDecoderQtImage.cpp
@@ -0,0 +1,102 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeDecoderQtImage.h>
+
+TeDecoderQtImage::TeDecoderQtImage ( const TeRasterParams& par )
+{
+ image_ = 0;
+ params_ = par;
+}
+
+TeDecoderQtImage::~TeDecoderQtImage ()
+{
+ clear ();
+}
+
+void
+TeDecoderQtImage::init()
+{
+ params_.status_= TeNOTREADY;
+ if (params_.mode_ == 'c') // creating a new file
+ {
+ clear ();
+ image_ = new QImage (params_.ncols_,params_.nlines_,32);
+ image_->fill(qRgb(255,255,255));
+ params_.status_ = TeREADYTOWRITE;
+ }
+ else if (params_.mode_ == 'w')
+ {
+ if (image_)
+ params_.status_ = TeREADYTOWRITE;
+ }
+ else if (params_.mode_ == 'r')
+ {
+ if (image_)
+ params_.status_ = TeREADYTOREAD;
+ }
+}
+
+bool
+TeDecoderQtImage::clear()
+{
+ if (image_ != 0)
+ delete image_;
+ image_ = 0;
+ return true;
+}
+
+bool
+TeDecoderQtImage::getElement (int col, int lin, double &val,int band )
+{
+ QRgb cell = image_->pixel ( col, lin );
+
+ if (band == 0)
+ val = (double) qRed(cell);
+ if (band == 1)
+ val = (double) qGreen(cell);
+ if (band == 2)
+ val = (double) qBlue(cell);
+
+ return true;
+}
+
+bool
+TeDecoderQtImage::setElement (int col, int lin, double val,int band )
+{
+ int r,g,b;
+ QRgb cell = image_->pixel ( col, lin );
+ r = qRed(cell);
+ g = qGreen(cell);
+ b = qBlue(cell);
+
+ if (band == 0)
+ r = (int)val;
+ if (band == 1)
+ g = (int)val;
+ if (band == 2)
+ b = (int)val;
+
+ image_->setPixel(col,lin, qRgb ( r, g, b));
+ return true;
+}
+
+
diff --git a/src/terralib/application/qt/TeDecoderQtImage.h b/src/terralib/application/qt/TeDecoderQtImage.h
new file mode 100644
index 0000000..cdb2ac6
--- /dev/null
+++ b/src/terralib/application/qt/TeDecoderQtImage.h
@@ -0,0 +1,61 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+/*! \file TeDecoderQtImage_H.h
+ This file contais the definitions of a decoder to a QTImage
+*/
+#ifndef __TERRALIB_INTERNAL_DECODERQTIMAGE_H
+#define __TERRALIB_INTERNAL_DECODERQTIMAGE_H
+
+#include "TeDecoder.h"
+#include <qimage.h>
+
+//! Implements a decoder to access a Qt image as a TeRaster
+class TeDecoderQtImage : public TeDecoder
+{
+public:
+ TeDecoderQtImage ( const TeRasterParams& );
+ ~TeDecoderQtImage ();
+
+ bool setElement (int col, int lin, double val, int band = 0);
+ bool getElement (int col, int lin, double &val, int band = 0);
+
+ void init ();
+ bool clear ();
+ QImage* getImage () { return image_; }
+private:
+
+ QImage* image_;
+};
+
+//! Implements a factory to build TeQtDecoders
+class TeDecoderQtImageFactory : public TeDecoderFactory
+{
+public:
+
+ TeDecoderQtImageFactory(const string& name) : TeDecoderFactory(name) {}
+
+ virtual TeDecoder* build (const TeRasterParams& arg)
+ { return new TeDecoderQtImage(arg); }
+};
+
+#endif
+
diff --git a/src/terralib/application/qt/TeInitRasterQtDecoder.cpp b/src/terralib/application/qt/TeInitRasterQtDecoder.cpp
new file mode 100644
index 0000000..04a5aa5
--- /dev/null
+++ b/src/terralib/application/qt/TeInitRasterQtDecoder.cpp
@@ -0,0 +1,11 @@
+#include <TeDecoderQtImage.h>
+
+#include <map>
+
+void TeInitRasterQtDecoder();
+
+void
+TeInitRasterQtDecoder()
+{
+ static TeDecoderQtImageFactory theDecoderQtImageFactory("QT");
+}
\ No newline at end of file
diff --git a/src/terralib/application/qt/TeQtAnimaThread.cpp b/src/terralib/application/qt/TeQtAnimaThread.cpp
new file mode 100644
index 0000000..92907f0
--- /dev/null
+++ b/src/terralib/application/qt/TeQtAnimaThread.cpp
@@ -0,0 +1,117 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+#include <TeQtAnimaThread.h>
+#include <TeQtCanvas.h>
+#include <qpainter.h>
+#include <qpaintdevice.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <animation.h>
+#include <qdatetime.h>
+
+void TeQtAnimaThread::run()
+{
+ bool init = false;
+ stop_ = false;
+ frame_ = pauseFrame_;
+ frames_ = fileList_.count();
+ animation_->playingScrollBar->setMinValue(0);
+ animation_->playingScrollBar->setMaxValue(frames_-1);
+ animation_->playingScrollBar->setValue(frame_);
+ while(frame_ < frames_)
+ {
+ showFrame(frame_);
+ if(pause_)
+ frame_ = pauseFrame_;
+ if(pause_ || stop_)
+ break;
+
+ int t = 10000 / animation_->velocitySlider->value() - 10000 / animation_->velocitySlider->maxValue();
+ sleep(t);
+ frame_++;
+ if(frame_ == frames_)
+ {
+ if(animation_->loopCheckBox->isChecked())
+ {
+ sleep(t);
+ sleep(t);
+ frame_ = 0;
+ }
+ else
+ init = true;
+ }
+ }
+ if(init)
+ {
+ animation_->stopButton->setEnabled(false);
+ animation_->pauseButton->setEnabled(false);
+ animation_->playButton->setEnabled(true);
+ animation_->playingScrollBar->setEnabled(false);
+ showFrame(0);
+ }
+}
+
+void TeQtAnimaThread::showFrame(int i)
+{
+ if((unsigned int)i >= fileList_.count())
+ return;
+ pauseFrame_ = i;
+ QString s = *(fileList_.at(i));
+ QString ss = dir_.absPath() + "/" + s;
+ QPixmap pixmap(ss);
+ QRect rect = pixmap.rect();
+ QRect crect = canvas_->viewport()->rect();
+ rect = crect.intersect(rect);
+ QPaintDevice *device = canvas_->viewport();
+ bitBlt(device, 0, 0, &pixmap, 0, 0, rect.width(), rect.height(), Qt::CopyROP);
+ animation_->frameNumberLineEdit->setText(Te2String(pauseFrame_).c_str());
+ animation_->playingScrollBar->setValue(pauseFrame_);
+}
+
+void TeQtAnimaThread::setAnimation(Animation* a, QDir d)
+{
+ animation_ = a;
+ dir_ = d;
+ fileList_ = dir_.entryList(QDir::Files);
+}
+
+void TeQtAnimaThread::stop()
+{
+ if(pause_)
+ pause_=false;
+ stop_ = true; wait();
+}
+
+void TeQtAnimaThread::sleep(int t)
+{
+ QTime time;
+ time.start();
+
+ int vel = animation_->velocitySlider->value();
+ int frame = animation_->playingScrollBar->value();
+ while(time.elapsed() < t)
+ {
+ if(pause_ || stop_ || vel != animation_->velocitySlider->value() || frame != animation_->playingScrollBar->value())
+ break;
+ }
+}
diff --git a/src/terralib/application/qt/TeQtAnimaThread.h b/src/terralib/application/qt/TeQtAnimaThread.h
new file mode 100644
index 0000000..a1cb302
--- /dev/null
+++ b/src/terralib/application/qt/TeQtAnimaThread.h
@@ -0,0 +1,48 @@
+#ifndef __TERRALIB_INTERNAL_QTANIMATHREAD_H
+#define __TERRALIB_INTERNAL_QTANIMATHREAD_H
+#include <qthread.h>
+#include<qdir.h>
+#include<qstringlist.h>
+class TeQtCanvas;
+class Animation;
+
+class TeQtAnimaThread : public QThread
+{
+public:
+ TeQtAnimaThread(){
+ canvas_ = 0;
+ pause_ = false;
+ stop_ = true;
+ rate_ = 1;
+ frame_ = 0;
+ frames_ = 0;
+ pauseFrame_ = 0;
+ }
+
+ void run();
+ void stop();
+ void pause(bool b) {pause_ = b;}
+ bool pause() {return pause_;}
+ void frame(int n) {frame_ = n;}
+ int frame() {return frame_;}
+ void frames(int n) {frames_ = n;}
+ int frames() {return frames_;}
+ int pauseFrame(int pf) {return pauseFrame_ = pf;}
+ void canvas(TeQtCanvas* c) {canvas_ = c;}
+ void setAnimation(Animation* a, QDir d);
+ void showFrame(int i);
+
+private:
+ bool pause_;
+ bool stop_;
+ int rate_;
+ int frame_;
+ int frames_;
+ int pauseFrame_;
+ TeQtCanvas* canvas_;
+ Animation* animation_;
+ QDir dir_;
+ QStringList fileList_;
+ void sleep(int t);
+};
+#endif
diff --git a/src/terralib/application/qt/TeQtBasicCanvas.cpp b/src/terralib/application/qt/TeQtBasicCanvas.cpp
new file mode 100644
index 0000000..a04c4be
--- /dev/null
+++ b/src/terralib/application/qt/TeQtBasicCanvas.cpp
@@ -0,0 +1,2428 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtBasicCanvas.h>
+#include <TeQtCanvas.h>
+#include <TeDecoderMemory.h>
+#include <TeQtProgress.h>
+#include <TeVectorRemap.h>
+#include <TeGeometryAlgorithms.h>
+#include <TeDefines.h>
+#include <TeRasterRemap.h>
+#include <TeDecoderQtImage.h>
+
+#include <qpaintdevice.h>
+#include <qpaintdevicemetrics.h>
+#include <qapplication.h>
+
+#include <algorithm>
+#include <time.h>
+
+
+//TeQtBasicCanvas::TeQtBasicCanvas( )
+TeQtBasicCanvas::TeQtBasicCanvas(QWidget *parent, const char *name ) : QScrollView(parent,name,WNorthWestGravity)
+{
+ pixmap0_ = 0;
+ pixmap1_ = 0;
+ pixmap2_ = 0;
+ pixmap3_ = 0;
+ backRaster_ = 0;
+
+ canvasProjection_ = 0;
+ dataProjection_ = 0;
+ pointStyle_ = 0;
+ nodeStyle_ = 0;
+ pointSize_ = 3;
+ nodeSize_ = 4;
+
+#ifdef WIN32
+ int winVersion = qApp->winVersion();
+ if (winVersion == Qt::WV_2000 || winVersion == Qt::WV_NT)
+ setTextTTStyle (QString("c:/winnt/fonts/tahoma.ttf"),10);
+ else
+ setTextTTStyle (QString("c:/windows/fonts/tahoma.ttf"),10);
+#else
+ char *s = "/usr/share/fonts/ttf/western/Bluehigc.ttf";
+ QString qs = s;
+ setTextTTStyle (qs,10);
+#endif
+ textTT_ = true;
+ db_ = 0;
+
+ //Mounting the brushStyleMap
+ brushStyleMap_[TePolyTypeTransparent] = Qt::NoBrush;
+ brushStyleMap_[TePolyTypeFill] = Qt::SolidPattern;
+ brushStyleMap_[TePolyTypeHorizontal] = Qt::HorPattern;
+ brushStyleMap_[TePolyTypeVertical] = Qt::VerPattern;
+ brushStyleMap_[TePolyTypeFDiagonal] = Qt::FDiagPattern;
+ brushStyleMap_[TePolyTypeBDiagonal] = Qt::BDiagPattern;
+ brushStyleMap_[TePolyTypeCross] = Qt::CrossPattern;
+ brushStyleMap_[TePolyTypeDiagonalCross] = Qt::DiagCrossPattern;
+
+ //Mounting the penStyleMap
+ penStyleMap_[TeLnTypeContinuous] = Qt::SolidLine;
+ penStyleMap_[TeLnTypeDashed] = Qt::DashLine;
+ penStyleMap_[TeLnTypeDotted] = Qt::DotLine;
+ penStyleMap_[TeLnTypeDashDot] = Qt::DashDotLine;
+ penStyleMap_[TeLnTypeDashDotDot] = Qt::DashDotDotLine;
+ penStyleMap_[TeLnTypeNone] = Qt::NoPen;
+}
+
+TeQtBasicCanvas::~TeQtBasicCanvas()
+{
+ if (dataProjection_)
+ delete dataProjection_;
+ if (canvasProjection_)
+ delete canvasProjection_;
+}
+
+void
+TeQtBasicCanvas::setDataProjection ( TeProjection* proj )
+{
+ if(dataProjection_)
+ delete dataProjection_;
+ dataProjection_ = TeProjectionFactory::make(proj->params());
+ if (canvasProjection_ && dataProjection_ && !(*canvasProjection_== *dataProjection_))
+ {
+ dataProjection_->setDestinationProjection(canvasProjection_);
+ canvasProjection_->setDestinationProjection(dataProjection_);
+ }
+}
+
+void
+TeQtBasicCanvas::setProjection ( TeProjection* proj )
+{
+ if (canvasProjection_)
+ delete canvasProjection_;
+ canvasProjection_ = TeProjectionFactory::make(proj->params());
+ params_.projection(canvasProjection_);
+}
+
+void TeQtBasicCanvas::plotOnWindow ()
+{
+ QPaintDevice* dev = painter_.device();
+ if(dev == viewport())
+ return;
+ if(dev)
+ painter_.end();
+ painter_.begin(viewport());
+}
+
+void TeQtBasicCanvas::plotOnPixmap0 ()
+{
+ QPaintDevice* dev = painter_.device();
+ if(dev == pixmap0_)
+ return;
+ if(dev)
+ painter_.end();
+ painter_.begin(pixmap0_);
+}
+
+void TeQtBasicCanvas::plotOnPixmap1 ()
+{
+ QPaintDevice* dev = painter_.device();
+ if(dev == pixmap1_)
+ return;
+ if(dev)
+ painter_.end();
+ painter_.begin(pixmap1_);
+}
+
+void TeQtBasicCanvas::setWorld(TeBox b, int w, int h, QPaintDevice *pd)
+{
+ xmin_= b.x1();
+ xmax_= b.x2();
+ ymin_= b.y1();
+ ymax_= b.y2();
+ setView (w,h,pd);
+ bool extend = pd ? false : true;
+ TeQtBasicCanvas::setTransformation (b.x1(),b.x2(),b.y1(),b.y2(),extend);
+ params_.nBands(3);
+ double resx = pixelSize();
+ double resy = pixelSize();
+ TeBox box(getWorld());
+ params_.lowerLeftResolutionSize(box.x1_+0.5*resx,box.y1_+0.5*resy,resx,resy,width_,height_);
+ params_.projection();
+ params_.mode_ = 'w';
+ params_.decoderIdentifier_ = "";
+}
+void TeQtBasicCanvas::setTransformation(double xmin, double xmax, double ymin, double ymax, bool extend)
+{
+ if (painter_.device() == 0)
+ return;
+
+ xmin_= xmin;
+ xmax_= xmax;
+ ymin_= ymin;
+ ymax_= ymax;
+ double dxw = xmax_ - xmin_,
+ dyw = ymax_ - ymin_,
+ dxv = width_,
+ dyv = height_;
+
+ double fx = dxv/dxw,
+ fy = dyv/dyw;
+
+ if (fx > fy)
+ {
+ f_ = fy;
+ if (extend)
+ {
+ dxw = width_/f_;
+ xmax_ = xmin_ + dxw;
+ }
+ else
+ width_ = (int)(f_*dxw + .5);
+ }
+ else
+ {
+ f_ = fx;
+ if (extend)
+ {
+ dyw = height_/f_;
+ ymax_ = ymin_ + dyw;
+ }
+ else
+ height_ = (int)(f_*dyw + .5);
+ }
+
+ wc_ = TeBox (xmin_,ymin_,xmax_,ymax_);
+ params_.boundingBoxResolution(xmin_,ymin_,xmax_,ymax_,params_.resx_,params_.resy_);
+
+ QPaintDeviceMetrics devMetric(viewport());
+ double wpixels = devMetric.width();
+ double wMM = devMetric.widthMM();
+ double wT = wMM;
+ if(canvasProjection_)
+ {
+ string unit = canvasProjection_->units();
+ if(unit == "Meters")
+ wT = wMM / 1000.;
+ else if(unit == "Kilometers")
+ wT = wMM / 1000000.;
+ else if(unit == "Centimeters")
+ wT = wMM / 100.;
+ else if(unit == "Millimeters")
+ wT = wMM;
+ else if(unit == "Feet")
+ wT = wMM / (12. * 25.4);
+ else if(unit == "Inches")
+ wT = wMM / 25.4;
+ else if(unit == "DecimalDegrees")
+ wT = wMM / 110000000.;
+ }
+ double wp = wT / wpixels;
+ scaleApx_ = (1. / f_) / wp;
+}
+
+void TeQtBasicCanvas::scaleApx(double scale)
+{
+ QPaintDeviceMetrics devMetric(viewport());
+ double wMM = devMetric.widthMM();
+ double wT = wMM;
+ if(canvasProjection_)
+ {
+ string unit = canvasProjection_->units();
+ if(unit == "Meters")
+ wT = wMM / 1000.;
+ else if(unit == "Kilometers")
+ wT = wMM / 1000000.;
+ else if(unit == "Centimeters")
+ wT = wMM / 100.;
+ else if(unit == "Millimeters")
+ wT = wMM;
+ else if(unit == "Feet")
+ wT = wMM / (12. * 25.4);
+ else if(unit == "Inches")
+ wT = wMM / 25.4;
+ else if(unit == "DecimalDegrees")
+ wT = wMM / 110000000.;
+ }
+
+ double ff = scale / scaleApx_;
+ double xmin, ymin, xmax, ymax;
+ if(ff < 1)
+ {
+ double dx = (wc_.width() - (wc_.width() * ff)) / 2.;
+ double dy = (wc_.height() - (wc_.height() * ff)) / 2.;
+ xmin = xmin_ + dx;
+ ymin = ymin_ + dy;
+ xmax = xmax_ - dx;
+ ymax = ymax_ - dy;
+ }
+ else
+ {
+ double dx = ((wc_.width() * ff) - wc_.width()) / 2.;
+ double dy = ((wc_.height() * ff) - wc_.height()) / 2.;
+ xmin = xmin_ - dx;
+ ymin = ymin_ - dy;
+ xmax = xmax_ + dx;
+ ymax = ymax_ + dy;
+ }
+
+ TeBox box(xmin, ymin, xmax, ymax);
+ setWorld(box);
+}
+
+double TeQtBasicCanvas::mapVtoDW (int pixels)
+{
+ TeBox wbox = getDataWorld();
+ TeCoord2D wpc(wbox.x1_ + wbox.width()/2., wbox.y1_ + wbox.height()/2.);
+ QPoint pc = mapWtoV(wpc);
+ QPoint qp(pc.x()+pixels, pc.y());
+ TeCoord2D wp = mapVtoDW(qp);
+ wpc = mapVtoDW(pc);
+ double d = fabs(wp.x() - wpc.x());
+ return d;
+}
+
+TeCoord2D TeQtBasicCanvas::mapVtoDW (QPoint v)
+{
+ TeCoord2D w((v.x()-x0_)/f_ + xmin_,
+ (height_ - y0_ - v.y())/f_ + ymin_);
+
+ if ( canvasProjection_ && dataProjection_ )
+ if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+ {
+ w = canvasProjection_->PC2LL (w);
+ w = dataProjection_->LL2PC (w);
+ }
+ return w;
+}
+
+double TeQtBasicCanvas::mapVtoW (int pixels)
+{
+ TeBox wbox = getDataWorld();
+ TeCoord2D wpc(wbox.x1_ + wbox.width()/2., wbox.y1_ + wbox.height()/2.);
+ QPoint pc = mapWtoV(wpc);
+ QPoint qp(pc.x()+pixels, pc.y());
+ TeCoord2D wp = mapVtoW(qp);
+ wpc = mapVtoW(pc);
+ double d = fabs(wp.x() - wpc.x());
+ return d;
+}
+
+TeCoord2D TeQtBasicCanvas::mapVtoW (QPoint v)
+{
+ TeCoord2D w((v.x()-x0_)/f_ + xmin_,
+ (height_ - y0_ - v.y())/f_ + ymin_);
+ return w;
+}
+
+TeBox TeQtBasicCanvas::getDataWorld()
+{
+ if ( canvasProjection_ && dataProjection_ )
+ if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+ {
+ TeBox b = TeRemapBox ( wc_, canvasProjection_, dataProjection_);
+ return b;
+ }
+ return wc_ ;
+}
+
+QPoint TeQtBasicCanvas::mapWtoV (TeCoord2D w)
+{
+ TeCoord2D tw = w;
+ if ( canvasProjection_ && dataProjection_ )
+ if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+ {
+ tw = dataProjection_->PC2LL (tw);
+ tw = canvasProjection_->LL2PC (tw);
+ }
+
+ QPoint v((int)((tw.x() - xmin_)*f_ + 0.5)+x0_,
+ height_ - y0_ - (int)((tw.y() - ymin_)*f_ + 0.5));
+ correctScrolling (v);
+ return v;
+}
+
+void TeQtBasicCanvas::mapWtoV (TeBox& w)
+{
+ TeCoord2D tw = w.lowerLeft();
+ if ( canvasProjection_ && dataProjection_ )
+ if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+ {
+ tw = dataProjection_->PC2LL (tw);
+ tw = canvasProjection_->LL2PC (tw);
+ }
+
+ QPoint p1((int)((tw.x() - xmin_)*f_ + 0.5)+x0_,
+ height_ - y0_ - (int)((tw.y() - ymin_)*f_ + 0.5));
+ correctScrolling (p1);
+
+ tw = w.upperRight();
+ if ( canvasProjection_ && dataProjection_ )
+ if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+ {
+ tw = dataProjection_->PC2LL (tw);
+ tw = canvasProjection_->LL2PC (tw);
+ }
+
+ QPoint p2((int)((tw.x() - xmin_)*f_ + 0.5)+x0_,
+ height_ - y0_ - (int)((tw.y() - ymin_)*f_ + 0.5));
+ correctScrolling (p2);
+ w.x1_ = p1.x();
+ w.y1_ = p2.y();
+ w.x2_ = p2.x();
+ w.y2_ = p1.y();
+}
+
+void TeQtBasicCanvas::mapCanvasWorldToDataWorld (TeBox& w)
+{
+ TeCoord2D wll = w.lowerLeft();
+ TeCoord2D wur = w.upperRight();
+ if ( canvasProjection_ && dataProjection_ )
+ if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+ {
+ canvasProjection_->setDestinationProjection(dataProjection_);
+ wll = canvasProjection_->PC2LL (wll);
+ wll = dataProjection_->LL2PC (wll);
+ wur = canvasProjection_->PC2LL (wur);
+ wur = dataProjection_->LL2PC (wur);
+ }
+
+ w = TeBox(wll, wur);
+}
+
+void TeQtBasicCanvas::mapDataWorldToCanvasWorld (TeBox& w)
+{
+ TeCoord2D wll = w.lowerLeft();
+ TeCoord2D wur = w.upperRight();
+ if ( canvasProjection_ && dataProjection_ )
+ if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+ {
+ dataProjection_->setDestinationProjection(canvasProjection_);
+ wll = dataProjection_->PC2LL (wll);
+ wll = canvasProjection_->LL2PC (wll);
+ wur = dataProjection_->PC2LL (wur);
+ wur = canvasProjection_->LL2PC (wur);
+ }
+
+ w = TeBox(wll, wur);
+}
+
+void TeQtBasicCanvas::mapCanvasWorldToViewport (TeBox& w)
+{
+ QPoint p1((int)((w.x1() - xmin_)*f_ + 0.5)+x0_,
+ height_ - y0_ - (int)((w.y1() - ymin_)*f_ + 0.5));
+ correctScrolling (p1);
+
+ QPoint p2((int)((w.x2() - xmin_)*f_ + 0.5)+x0_,
+ height_ - y0_ - (int)((w.y2() - ymin_)*f_ + 0.5));
+ correctScrolling (p2);
+
+// swap y value
+ w.x1_ = p1.x();
+ w.y1_ = p2.y();
+ w.x2_ = p2.x();
+ w.y2_ = p1.y();
+}
+
+void TeQtBasicCanvas::mapViewportToCanvasWorld (TeBox& v)
+{
+// swap y value
+
+ TeCoord2D w1((v.x1()-x0_)/f_ + xmin_,
+ (height_ - y0_ - v.y2())/f_ + ymin_);
+
+ TeCoord2D w2((v.x2()-x0_)/f_ + xmin_,
+ (height_ - y0_ - v.y1())/f_ + ymin_);
+
+ v = TeBox(w1, w2);
+}
+
+QPoint TeQtBasicCanvas::mapCanvasWorldToViewport (TeCoord2D& c)
+{
+ QPoint p((int)((c.x() - xmin_)*f_ + 0.5)+x0_,
+ height_ - y0_ - (int)((c.y() - ymin_)*f_ + 0.5));
+ correctScrolling (p);
+
+ return p;
+}
+
+void TeQtBasicCanvas::setPolygonColor (int r, int g, int b)
+{
+// polygonColor_.setRgb(r,g,b);
+// polygonBrush_.setColor (polygonColor_);
+
+ QRgb cor = qRgba(r, g, b, 50);
+ polygonColor_.setRgb(cor);
+ polygonBrush_.setColor (polygonColor_);
+}
+
+void TeQtBasicCanvas::setPolygonStyle (int s, int t)
+{
+ polygonBrush_.setStyle(brushStyleMap_[(TePolyBasicType)s]);
+ polygonTransparency_ = t;
+}
+
+void TeQtBasicCanvas::setPolygonLineColor (int r, int g, int b)
+{
+ QColor cor(r, g, b);
+ polygonPen_.setColor (cor);
+}
+
+void TeQtBasicCanvas::setPolygonLineStyle (int s, int w)
+{
+ polygonPen_.setStyle(penStyleMap_[(TeLnBasicType)s]);
+ polygonPen_.setWidth(w);
+}
+
+void TeQtBasicCanvas::setLineColor (int r, int g, int b)
+{
+ lineColor_.setRgb(r,g,b);
+ linePen_.setColor (lineColor_);
+}
+
+void TeQtBasicCanvas::setLineStyle (int s, int w)
+{
+ linePen_.setStyle(penStyleMap_[(TeLnBasicType)s]);
+ linePen_.setWidth(w);
+}
+
+void TeQtBasicCanvas::setTextColor (int r, int g, int b)
+{
+ textColor_.setRgb(r,g,b);
+ textPen_.setColor (textColor_);
+}
+
+void TeQtBasicCanvas::setTextStyle (string& family, int size, bool bold, bool italic )
+{
+ textFont_.setFamily (family.c_str());
+ textFont_.setBold (bold);
+ textFont_.setItalic (italic);
+ if(size <= 0)
+ textSize_ = 1;
+ else
+ textSize_ = size;
+ textFont_.setPointSize (textSize_);
+}
+
+void TeQtBasicCanvas::setTextSize (int size)
+{
+ if(size <= 0)
+ textSize_ = 1;
+ else
+ textSize_ = size;
+ textFont_.setPointSize (textSize_);
+}
+
+void TeQtBasicCanvas::setTextTTStyle (QString& font, int size)
+{
+ textTTFont_ = font.latin1();
+ textSize_ = size;
+}
+
+void TeQtBasicCanvas::plotText (TeCoord2D &pt, string &str, double angle, double /*alignh*/, double /*alignv*/)
+{
+ painter_.setPen(textPen_);
+ painter_.setFont(textFont_);
+ QPoint p = mapWtoV (pt);
+ if (angle != 0.)
+ {
+ painter_.save ();
+ painter_.translate (p.x(),p.y());
+ painter_.rotate (-angle);
+ painter_.drawText (0,-4,QString(str.c_str()));
+ painter_.restore ();
+ }
+ else
+ painter_.drawText (p,QString(str.c_str()));
+}
+
+void TeQtBasicCanvas::plotText (TeText& tx, TeVisual& visual)
+{
+ if(tx.textValue().empty())
+ return;
+
+ int x, y;
+
+ TeCoord2D pt = tx.location();
+ QPoint p = mapWtoV (pt);
+ double angle = tx.angle();
+
+ QRect brect = textRect(tx, visual);
+ painter_.setFont(textFont_);
+ painter_.setPen(textPen_);
+ painter_.setRasterOp (Qt::CopyROP);
+ string st = tx.textValue();
+
+ if (angle != 0.)
+ {
+ x = - brect.width()/2;
+ y = - brect.height()/2;
+ painter_.save ();
+ painter_.translate (p.x(), p.y());
+ painter_.rotate (-angle);
+ painter_.drawText(x, y, brect.width(), brect.height(), Qt::AlignLeft|Qt::DontClip, st.c_str());
+ painter_.restore ();
+ }
+ else
+ {
+ x = p.x() - brect.width()/2;
+ y = p.y() - brect.height()/2;
+ painter_.drawText(x, y, brect.width(), brect.height(), Qt::AlignLeft|Qt::DontClip, st.c_str());
+ }
+}
+
+QRect TeQtBasicCanvas::textRect (TeText& tx, TeVisual visual)
+{
+ QRect rect;
+ if(tx.textValue().empty())
+ return rect;
+
+ int size;
+ int fixedSize = visual.fixedSize(); // font size is fixed
+ if(fixedSize == false && tx.height() > 0.)
+ {
+ TeBox wbox = getDataWorld();
+ TeCoord2D p1(wbox.x1_, wbox.y1_);
+ TeCoord2D p2(double(p1.x() + tx.height()), double(p1.y() + tx.height()));
+ TeBox box(p1, p2);
+ mapWtoV(box);
+ size = int(box.height());
+ }
+ else
+ size = visual.size(); // font size
+ if(size == 0)
+ size = 1;
+
+ setTextSize(size);
+ textFont_.setFamily (visual.family().c_str());
+
+ TeCoord2D pt = tx.location();
+ QPoint p = mapWtoV (pt);
+
+ string st = tx.textValue();
+ QFontMetrics fm(textFont_);
+// int hh = fm.height(); //hh is not used
+// int ww = fm.width(st.c_str()); //ww is not used
+ rect = fm.boundingRect(st.c_str());
+ QPoint cc = rect.center();
+ QPoint tr = p;
+ tr = tr - cc;
+ rect.setRight(rect.right()+tr.x());
+ rect.setLeft(rect.left()+tr.x());
+ rect.setTop(rect.top()+tr.y());
+ rect.setBottom(rect.bottom()+tr.y());
+ QPoint o = offset();
+ rect.moveCenter(rect.center() + o); // do offset translation on window
+ return rect;
+}
+
+void TeQtBasicCanvas::plotXorPolyline (QPointArray& PA, bool cdev)
+{
+// if(painter_ == 0)
+// return;
+
+ QPoint o = offset();
+ QPen pen(QColor("green"));
+
+ plotOnPixmap0();
+ painter_.save ();
+ if(cdev == false)
+ painter_.translate(o.x(), o.y());
+ painter_.setRasterOp (Qt::XorROP);
+ painter_.setPen(pen);
+ painter_.drawPolyline(PA);
+ painter_.restore ();
+
+ plotOnWindow(); // do offset translation on window
+ painter_.save ();
+ if(cdev)
+ painter_.translate(-o.x(), -o.y());
+ painter_.setRasterOp (Qt::XorROP);
+ painter_.setPen(pen);
+ painter_.drawPolyline(PA);
+ painter_.restore ();
+
+}
+
+void TeQtBasicCanvas::plotTextRects (TeText& tx, TeVisual visual)
+{
+ if(tx.textValue().empty())
+ return;
+
+ QPoint o = offset();
+ QRect rect, l, r, t, b, c;
+
+ TeCoord2D pt = tx.location();
+ plotOnWindow();
+ QPoint p = mapWtoV (pt) + o;
+ double angle = tx.angle();
+
+ rect = textRect(tx, visual);
+ if(angle != 0.)
+ {
+ rect.setTop(rect.top()-p.y());
+ rect.setBottom(rect.bottom()-p.y());
+ rect.setLeft(rect.left()-p.x());
+ rect.setRight(rect.right()-p.x());
+ }
+
+ l = rect;
+ l.setTop(rect.top()+rect.height()/2-3);
+ l.setBottom(rect.top()+rect.height()/2+3);
+ l.setRight(rect.left() + 6);
+
+ r = rect;
+ r.setTop(l.top());
+ r.setBottom(l.bottom());
+ r.setLeft(rect.right() - 6);
+
+ t = rect;
+ t.setLeft(rect.left()+rect.width()/2-3);
+ t.setRight(rect.left()+rect.width()/2+3);
+ t.setBottom(rect.top() + 6);
+
+ b = rect;
+ b.setLeft(t.left());
+ b.setRight(t.right());
+ b.setTop(rect.bottom() - 6);
+
+ c.setLeft(rect.left()+rect.width()/2-3);
+ c.setRight(c.left() + 6);
+ c.setTop(rect.top()+rect.height()/2-3);
+ c.setBottom(c.top() + 6);
+
+ QPointArray parL(4);
+ parL.setPoint(0, l.bottomLeft());
+ parL.setPoint(1, l.bottomRight());
+ parL.setPoint(2, l.topRight());
+ parL.setPoint(3, l.topLeft());
+
+ QPointArray parR(4);
+ parR.setPoint(0, r.bottomRight());
+ parR.setPoint(1, r.bottomLeft());
+ parR.setPoint(2, r.topLeft());
+ parR.setPoint(3, r.topRight());
+
+ QPointArray parT(4);
+ parT.setPoint(0, t.topLeft());
+ parT.setPoint(1, t.bottomLeft());
+ parT.setPoint(2, t.bottomRight());
+ parT.setPoint(3, t.topRight());
+
+ QPointArray parB(4);
+ parB.setPoint(0, b.bottomLeft());
+ parB.setPoint(1, b.topLeft());
+ parB.setPoint(2, b.topRight());
+ parB.setPoint(3, b.bottomRight());
+
+ QBrush brush(QColor("green"));
+
+ if (angle != 0.)
+ {
+ plotOnPixmap0();
+ painter_.save ();
+ painter_.setRasterOp (Qt::XorROP);
+ painter_.setBrush(Qt::NoBrush);
+ QPen pen(QColor("green"));
+ painter_.setPen(pen);
+ painter_.translate (p.x(), p.y());
+ painter_.rotate (-angle);
+ painter_.drawRect(rect);
+ painter_.drawPolyline(parL);
+ painter_.drawPolyline(parR);
+ painter_.drawPolyline(parT);
+ painter_.drawPolyline(parB);
+ painter_.fillRect(c, brush);
+ painter_.restore ();
+
+ plotOnWindow(); // do offset translation on window
+ painter_.save ();
+ painter_.setRasterOp (Qt::XorROP);
+ painter_.setBrush(Qt::NoBrush);
+ pen = QPen(QColor("green"));
+ painter_.setPen(pen);
+ painter_.translate (p.x()-o.x(), p.y()-o.y());
+ painter_.rotate (-angle);
+ painter_.drawRect(rect);
+ painter_.drawPolyline(parL);
+ painter_.drawPolyline(parR);
+ painter_.drawPolyline(parT);
+ painter_.drawPolyline(parB);
+ painter_.fillRect(c, brush);
+ painter_.restore ();
+ }
+ else
+ {
+ plotOnPixmap0();
+ painter_.save ();
+ painter_.setRasterOp (Qt::XorROP);
+ painter_.setBrush(Qt::NoBrush);
+ QPen pen(QColor("green"));
+ painter_.setPen(pen);
+ painter_.drawRect(rect);
+ painter_.drawPolyline(parL);
+ painter_.drawPolyline(parR);
+ painter_.drawPolyline(parT);
+ painter_.drawPolyline(parB);
+ painter_.fillRect(c, brush);
+ painter_.restore ();
+
+ plotOnWindow(); // do offset translation on window
+ painter_.save ();
+ painter_.setRasterOp (Qt::XorROP);
+ painter_.setBrush(Qt::NoBrush);
+ pen = QPen(QColor("green"));
+ painter_.setPen(pen);
+ painter_.translate (-o.x(), -o.y());
+ painter_.drawRect(rect);
+ painter_.drawPolyline(parL);
+ painter_.drawPolyline(parR);
+ painter_.drawPolyline(parT);
+ painter_.drawPolyline(parB);
+ painter_.fillRect(c, brush);
+ painter_.restore ();
+ }
+}
+
+void TeQtBasicCanvas::setArcColor (int r, int g, int b)
+{
+ arcColor_.setRgb(r,g,b);
+}
+
+void TeQtBasicCanvas::setArcStyle (int s, int w )
+{
+ arcPen_.setStyle ((Qt::PenStyle)s);
+ arcPen_.setWidth(w);
+}
+
+void TeQtBasicCanvas::setPointColor (int r, int g, int b)
+{
+ pointColor_.setRgb(r,g,b);
+}
+
+void TeQtBasicCanvas::setPointStyle (int s, int w)
+{
+ pointStyle_ = (TePtBasicType) s;
+ pointSize_ = w;
+}
+
+void TeQtBasicCanvas::plotPoint (TeCoord2D &pt)
+{
+ pointPen_.setColor (pointColor_);
+ painter_.setPen(pointPen_);
+
+ QPoint p = mapWtoV (pt);
+
+ plotMark(p,pointStyle_, pointSize_);
+}
+
+void TeQtBasicCanvas::setNodeColor (int r, int g, int b)
+{
+ nodeColor_.setRgb(r,g,b);
+}
+
+void TeQtBasicCanvas::setNodeStyle (int s, int w)
+{
+ nodeStyle_ = s;
+ nodeSize_ = w;
+}
+
+void TeQtBasicCanvas::plotNode (TeNode &pt)
+{
+ nodePen_.setColor (nodeColor_);
+ painter_.setPen(nodePen_);
+
+ QPoint p = mapWtoV (pt.location());
+ plotMark(p,nodeStyle_, nodeSize_);
+}
+
+
+void TeQtBasicCanvas::plotMark(QPoint &p, int s, int w)
+{
+ painter_.setPen(pointColor_);
+ if (s == TePtTypePlus)
+ {
+ painter_.drawLine (p.x()-w/2,p.y(),p.x()+w/2,p.y());
+ painter_.drawLine (p.x(),p.y()-w/2,p.x(),p.y()+w/2);
+ }
+ else if (s == TePtTypeStar)
+ {
+ painter_.save ();
+ painter_.translate (p.x(),p.y());
+ painter_.drawLine (0,-w/2,0,w/2);
+ painter_.rotate (45);
+ painter_.drawLine (0,-w/2,0,w/2);
+ painter_.rotate (-90);
+ painter_.drawLine (0,-w/2,0,w/2);
+ painter_.restore ();
+ }
+ else if (s == TePtTypeCircle)
+ {
+ painter_.setBrush(pointColor_);
+ painter_.drawChord (p.x()-w/2,p.y()-w/2,w,w,0,360*16);
+ }
+ else if (s == TePtTypeX)
+ {
+ painter_.drawLine (p.x()-w/2,p.y()-w/2,p.x()+w/2,p.y()+w/2);
+ painter_.drawLine (p.x()-w/2,p.y()+w/2,p.x()+w/2,p.y()-w/2);
+ }
+ else if (s == TePtTypeBox)
+ {
+ painter_.fillRect (p.x()-w/2,p.y()-w/2,w,w,pointColor_);
+ }
+ else if (s == TePtTypeDiamond)
+ {
+ QPointArray pa(5);
+ pa.setPoint(0, p.x()-w/2, p.y());
+ pa.setPoint(1, p.x(), p.y()-w/2);
+ pa.setPoint(2, p.x()+w/2, p.y());
+ pa.setPoint(3, p.x(), p.y()+w/2);
+ pa.setPoint(4, p.x()-w/2, p.y());
+ painter_.setBrush(pointColor_);
+ painter_.drawPolygon(pa);
+ }
+ else if (s == TePtTypeHollowCircle)
+ {
+ painter_.drawArc (p.x()-w/2,p.y()-w/2,w,w,0,360*16);
+ }
+ else if (s == TePtTypeHollowBox)
+ {
+ painter_.setBrush(Qt::NoBrush);
+ painter_.drawRect (p.x()-w/2,p.y()-w/2,w,w);
+ }
+ else if (s == TePtTypeHollowDiamond)
+ {
+ painter_.drawLine (p.x()-w/2,p.y(),p.x(),p.y()-w/2);
+ painter_.drawLine (p.x(),p.y()-w/2,p.x()+w/2,p.y());
+ painter_.drawLine (p.x()+w/2,p.y(),p.x(),p.y()+w/2);
+ painter_.drawLine (p.x(),p.y()+w/2,p.x()-w/2,p.y());
+ }
+}
+
+
+void TeQtBasicCanvas::plotCell (TeCell &cell)
+{
+ TeBox b = getDataWorld ();
+
+ if (!TeIntersects (b, cell.box ()))
+ return;
+
+ QPoint pfrom, pto;
+
+ pfrom = mapWtoV (cell.box().lowerLeft());
+ pto = mapWtoV (cell.box().upperRight());
+
+ painter_.setBrush(polygonBrush_);
+ painter_.setPen (polygonPen_);
+
+ if((polygonTransparency_ == 0 && polygonBrush_.style() != Qt::NoBrush) || // 100% opaque or
+ (polygonTransparency_ == 100 || polygonBrush_.style() == Qt::NoBrush)) // 100% transparent
+ {
+ if(polygonTransparency_ == 100 && polygonBrush_.style() != Qt::NoBrush)
+ painter_.setBrush(Qt::NoBrush);
+ painter_.drawRect( pfrom.x()+1, pto.y()+1,pto.x()-pfrom.x(), pfrom.y()-pto.y() );
+ }
+ else
+ {
+ QRect viewRect = painter_.viewport();
+
+ TeBox box = cell.box();
+ mapWtoV (box); // data coordinate to viewport coordinate
+ QRect polyRect((int)box.x1_, (int)box.y1_, (int)box.width(), (int)box.height());
+ QRect interRect = viewRect & polyRect;
+ QPoint pOffset = interRect.topLeft();
+
+ int width = interRect.width();
+ int height = interRect.height();
+
+ int r = width%8;
+ if(r)
+ width += (8-r);
+ r = height%8;
+ if(r)
+ height += (8-r);
+
+ QBitmap bm;
+ bm.resize(width, height);
+ //Fill bitmap with 0-bits: clipping region
+ bm.fill(Qt::color0);
+ QPainter maskPainter(&bm);
+
+ // Draw cell with 1-bits: drawing region
+ QBrush bs(Qt::color1, polygonBrush_.style());
+ maskPainter.setBrush(bs);
+ QPen pen(Qt::color1, polygonPen_.width());
+ maskPainter.setPen(pen);
+ maskPainter.translate(-pOffset.x(), -pOffset.y());
+ maskPainter.drawRect( interRect );
+ maskPainter.end();
+
+ QRegion clipRegion(bm);
+ clipRegion.translate(pOffset.x(), pOffset.y());
+
+ int transp = 255 - (polygonTransparency_ * 255 / 100);
+ painter_.setClipRegion(clipRegion);
+ // restore background from pixmap2_
+// bitBlt(painter_.device(), pOffset.x(), pOffset.y(), pixmap2_, pOffset.x(), pOffset.y(), interRect.width(), interRect.height());
+ painter_.drawPixmap(pOffset.x(), pOffset.y(), *pixmap2_, pOffset.x(),
+ pOffset.y(), interRect.width(), interRect.height());
+
+ // set alpha buffer and color
+ QImage img(interRect.width(), interRect.height(), 32);
+ unsigned int val = (transp << 24) | (polygonColor_.red() << 16) | (polygonColor_.green() << 8) | polygonColor_.blue();
+ img.fill(val);
+ img.setAlphaBuffer(true);
+
+ // plot transparency
+// bitBlt(painter_.device(), pOffset.x(), pOffset.y(), &img);
+ painter_.drawPixmap(pOffset.x(), pOffset.y(), img);
+
+
+ // plot contours
+ painter_.setClipping(false);
+ painter_.setBrush(Qt::NoBrush);
+ painter_.drawRect( interRect );
+ }
+}
+
+void TeQtBasicCanvas::plotPolygon (TePolygon &poly)
+{
+ TeBox b = getDataWorld ();
+
+ if (!TeIntersects (b, poly.box ()))
+ return;
+
+ int i, j, k, np;
+ QPoint p;
+ painter_.setBrush(polygonBrush_);
+ painter_.setPen (polygonPen_);
+
+ if(polygonTransparency_==100 || polygonBrush_.style() == Qt::NoBrush) // contour
+ {
+ TeLinearRing ring = poly[0];
+ np = ring.size();
+ QPointArray parray(np);
+
+ for ( i = 0 ; i < np; i++)
+ {
+ p = mapWtoV (ring[i]);
+ parray.setPoint(i, p);
+ }
+ painter_.drawPolyline( parray );
+
+ for ( k = 1; k < (int)(poly.size()); k++ )
+ {
+ ring = poly[k];
+ np = ring.size();
+ QPointArray hole(np);
+
+ for ( i = 0 ; i < np; i++)
+ {
+ p = mapWtoV (ring[i]);
+ hole.setPoint(i, p);
+ }
+ painter_.drawPolyline( hole );
+ }
+ }
+ else if(poly.size() == 1 && // no holes
+ polygonTransparency_ == 0 && // and is opaque
+ polygonBrush_.style() != Qt::NoBrush)
+ {
+ TeLinearRing ring = poly[0];
+ np = ring.size();
+ QPointArray parray(np);
+ for ( i = 0 ; i < np; i++)
+ {
+ p = mapWtoV (ring[i]);
+ parray.setPoint(i, p);
+ }
+ painter_.drawPolygon( parray );
+ }
+ else
+ {
+ QRect viewRect = painter_.viewport();
+
+ TeBox box = poly.box();
+ mapWtoV (box); // data coordinate to viewport coordinate
+ if(box.width() <= 0 || box.height() <= 0)
+ return;
+ QRect polyRect((int)box.x1_, (int)box.y1_, (int)box.width(), (int)box.height());
+ if(polyRect.intersects(viewRect) == false)
+ return;
+ QRect interRect = viewRect & polyRect;
+
+ if(painter_.hasClipping())
+ {
+ QRegion interRegion = QRegion(interRect);
+ QRegion pclip = painter_.clipRegion();
+ interRegion = interRegion.intersect(pclip);
+ interRect = interRegion.boundingRect();
+ }
+
+ QPoint pOffset = interRect.topLeft();
+ int width = interRect.width();
+ int height = interRect.height();
+
+ int r = width%8;
+ if(r)
+ width += (8-r);
+ r = height%8;
+ if(r)
+ height += (8-r);
+
+ if(width == 0)
+ width = 8;
+ if(height == 0)
+ height = 8;
+
+ QBitmap bm;
+ bm.resize(width, height);
+ //Fill bitmap with 0-bits: clipping region
+ bm.fill(Qt::color0);
+ QPainter maskPainter(&bm);
+
+ TeLinearRing ring = poly[0];
+ np = ring.size();
+ QPointArray parray(np);
+
+ // Draw polygon with 1-bits: drawing region
+ QBrush bs(Qt::color1, polygonBrush_.style());
+ maskPainter.setBrush(bs);
+ QPen pen(Qt::color1, polygonPen_.width());
+ maskPainter.setPen(pen);
+ maskPainter.translate(-pOffset.x(), -pOffset.y());
+ j = 0;
+ parray.setPoint(j, mapWtoV (ring[0]));
+ for ( i = 1 ; i < np; i++)
+ {
+ p = mapWtoV (ring[i]);
+ parray.setPoint(++j, p);
+ }
+ maskPainter.drawPolygon( parray );
+
+ vector<QPointArray> holeVec;
+ if(poly.size() > 1)
+ {
+ // Draw holes with 0-bits: clipping region
+ maskPainter.setBrush(Qt::color0);
+ pen.setColor(Qt::color0);
+ maskPainter.setPen(pen);
+ for ( k = 1; k < (int)poly.size(); k++ )
+ {
+ ring = poly[k];
+ np = ring.size();
+ QPointArray hole(np);
+
+ for ( i = 0 ; i < np; i++)
+ {
+ p = mapWtoV (ring[i]);
+ hole.setPoint(i, p);
+ }
+ holeVec.push_back(hole);
+ maskPainter.drawPolygon( hole );
+ }
+ }
+ maskPainter.end();
+
+ QRegion clipRegion(bm);
+ clipRegion.translate(pOffset.x(), pOffset.y());
+
+ if(polygonTransparency_ == 0)
+ {
+ painter_.setClipRegion(clipRegion);
+ painter_.drawPolygon( parray );
+ painter_.setClipping(false);
+ for(i = 0; i < (int)holeVec.size(); i++)
+ painter_.drawPolyline( holeVec[i] );
+ }
+ else
+ {
+ int transp = 255 - (polygonTransparency_ * 255 / 100);
+ painter_.setClipRegion(clipRegion);
+ // restore background from pixmap2_
+ painter_.drawPixmap(pOffset.x(), pOffset.y(), *pixmap2_, pOffset.x(),
+ pOffset.y(), interRect.width(), interRect.height());
+
+ // set alpha buffer and color
+ QImage img(interRect.width(), interRect.height(), 32);
+ unsigned int val = (transp << 24) | (polygonColor_.red() << 16) | (polygonColor_.green() << 8) | polygonColor_.blue();
+ img.fill(val);
+ img.setAlphaBuffer(true);
+
+ // plot transparency
+// bitBlt(painter_.device(), pOffset.x(), pOffset.y(), &img);
+ painter_.drawPixmap(pOffset.x(), pOffset.y(), img);
+
+ // plot contours
+ painter_.setClipping(false);
+ painter_.drawPolyline( parray );
+ for(i = 0; i< (int)holeVec.size(); i++)
+ painter_.drawPolyline( holeVec[i] );
+ }
+ }
+}
+
+
+/*void TeQtBasicCanvas::plotPolygon (TePolygon &poly)
+{
+ TeBox b = getDataWorld ();
+
+ if (!TeIntersects (b, poly.box (), 0.0))
+ return;
+
+ int i, np;
+
+ if(polygonTransparency_==0 &&
+ polygonBrush_.style()!=Qt::NoBrush)
+ {
+ painter_->setBrush(polygonBrush_);
+ painter_->setPen (polygonPen_);
+ if (poly.size() == 1)
+ {
+ TeLinearRing ring = poly[0];
+ np = ring.size();
+ QPointArray a(np);
+ QPoint p;
+
+ // Draw polygon with polygon brush and line pen
+ for ( i = 0 ; i < np; i++)
+ {
+ p = mapWtoV (ring[i]);
+ a.setPoint(i,p);
+ }
+ painter_->drawPolygon( a );
+ }
+ else
+ {
+ QRect rect = painter_->viewport();
+ int w = rect.width();
+ int h = rect.height();
+
+ int r = w%8;
+ if(r)
+ w += (8-r);
+ r = h%8;
+ if(r)
+ h += (8-r);
+
+ QBitmap bm;
+ bm.resize(w, h);
+ //Fill bitmap with 0-bits:background(or transparent)
+ bm.fill(Qt::color0);
+ QPainter qp(&bm);
+
+ TeLinearRing ring = poly[0];
+ np = ring.size();
+ QPointArray a(np);
+ QPoint p;
+
+ // Draw outer polygon with 1-bits:foreground(or opaque)
+ qp.setBrush(Qt::color1);
+ QPen pen(Qt::color1, polygonPen_.width());
+ qp.setPen(pen);
+ for ( i = 0 ; i < np; i++)
+ {
+ p = mapWtoV (ring[i]);
+ a.setPoint(i,p);
+ }
+ qp.drawPolygon( a );
+
+ // Draw holes with 0-bits:background(or transparent)
+ qp.setBrush(Qt::color0);
+ pen.setColor(Qt::color0);
+ qp.setPen(pen);
+ unsigned int k;
+ for ( k = 1; k < poly.size(); k++ )
+ {
+ ring = poly[k];
+ np = ring.size();
+ QPointArray hole(np);
+
+ for ( i = 0 ; i < np; i++)
+ {
+ p = mapWtoV (ring[i]);
+ hole.setPoint(i,p);
+ }
+ qp.drawPolygon( hole );
+ }
+
+ QRegion region(bm);
+ painter_->setClipRegion(region);
+ painter_->drawPolygon( a );
+ painter_->setClipping(false);
+ }
+ }
+ else
+ {
+ Qt::BrushStyle bstyle = polygonBrush_.style();
+ int transp = polygonTransparency_;
+ if(polygonBrush_.style()==Qt::NoBrush || polygonTransparency_==100)
+ {
+ polygonTransparency_ = 100;
+ polygonBrush_.setStyle(Qt::SolidPattern);
+ }
+
+ QRect rect = painter_->viewport();
+
+ int j, xmin, ymin, xmax, ymax, height, width;
+ TeBox box = poly.box();
+ QPoint pll, pur;
+ pll = mapWtoV (box.lowerLeft());
+ pur = mapWtoV (box.upperRight());
+ xmin = MAX (pll.x(), rect.left());
+ xmax = MIN (pur.x(), rect.right());
+ ymin = MAX (pur.y(), rect.top());
+ ymax = MIN (pll.y(), rect.bottom());
+ height = ymax - ymin;
+ width = xmax - xmin;
+
+ int w = rect.width();
+ int h = rect.height();
+
+ int r = w%8;
+ if(r)
+ w += (8-r);
+ r = h%8;
+ if(r)
+ h += (8-r);
+
+ QBitmap bm;
+ bm.resize(w, h);
+ //Fill bitmap with 0-bits:background(or transparent)
+ bm.fill(Qt::color0);
+ QPainter qp(&bm);
+
+ TeLinearRing ring = poly[0];
+ np = ring.size();
+ QPointArray a(np);
+ QPoint p;
+
+ // Draw outer polygon with 1-bits: foreground(or opaque)
+ qp.setBrush(Qt::color1);
+ QPen pen(Qt::color1, polygonPen_.width());
+ qp.setPen(pen);
+ for ( i = 0 ; i < np; i++)
+ {
+ p = mapWtoV (ring[i]);
+ a.setPoint(i,p);
+ }
+ qp.drawPolygon( a );
+
+ if(poly.size() > 1)
+ {
+ // Draw holes with 0-bits:background(or transparent)
+ qp.setBrush(Qt::color0);
+ pen.setColor(Qt::color0);
+ qp.setPen(pen);
+ unsigned int k;
+ for ( k = 1; k < poly.size(); k++ )
+ {
+ ring = poly[k];
+ np = ring.size();
+ QPointArray hole(np);
+
+ for ( i = 0 ; i < np; i++)
+ {
+ p = mapWtoV (ring[i]);
+ hole.setPoint(i,p);
+ }
+ qp.drawPolygon( hole );
+ }
+ }
+
+ QRegion region(bm);
+ qp.end();
+ painter_->setClipRegion(region);
+
+ QPixmap pixmap(rect.width(), rect.height());
+ QPainter painter(&pixmap);
+ painter.setBrush(polygonBrush_);
+ if(bstyle == Qt::NoBrush)
+ painter.setPen(polygonColor_);
+ else
+ painter.setPen(polygonPen_);
+ painter.drawPolygon( a );
+
+ QImage imap = pixmap.convertToImage();
+ painter.end();
+
+ if(qimage_.width()==0 || qimage_.height()==0)
+ {
+ qimage_.reset();
+ qimage_ = pixmap2_->convertToImage();
+ }
+
+ QRgb polyRgb = polygonColor_.rgb() & 0x00ffffff;
+// QRgb contourRgb = polygonPen_.color().rgb() & 0x00ffffff; //contourRgb not used
+ double alpha = (double)polygonTransparency_ / 100.;
+ double beta = 1. - alpha;
+ for(i=xmin; i<xmax; i++)
+ {
+ for(j=ymin; j<ymax; j++)
+ {
+ QRgb vp = imap.pixel(i, j);
+ if(vp == polyRgb)
+ {
+ QRgb v = qimage_.pixel(i, j);
+ int r = (int)((double)qRed(v) * alpha + (double)qRed(vp) * beta);
+ int g = (int)((double)qGreen(v) * alpha + (double)qGreen(vp) * beta);
+ int b = (int)((double)qBlue(v) * alpha + (double)qBlue(vp) * beta);
+ QRgb t = qRgb(r, g, b);
+ imap.setPixel(i, j, t);
+ }
+ else if(vp == 0)
+ imap.setPixel(i, j, qimage_.pixel(i, j));
+ }
+ }
+ pixmap.convertFromImage(imap);
+ bitBlt (painter_->device(),xmin,ymin,&pixmap,xmin,ymin,width,height,Qt::CopyROP,true);
+ painter_->setClipping(false);
+ polygonBrush_.setStyle(bstyle);
+ polygonTransparency_ = transp;
+ }
+}*/
+
+QRect TeQtBasicCanvas::getLegendRect (QPoint p, const QPixmap* pix, string tx)
+{
+ QRect rect;
+ TeVisual visual;
+ TeColor cor(0, 0, 0);
+
+ visual.fixedSize(true);
+ visual.size(8);
+ visual.bold(true);
+ visual.color(cor);
+ setTextColor (cor.red_, cor.green_, cor.blue_);
+ string fam(visual.family());
+ setTextStyle (fam, visual.size(), visual.bold(), visual.italic());
+
+ if(pix)
+ {
+ int x = p.x()+pix->width()+3;
+ int y = p.y()+13;
+ QFontMetrics fm(textFont_);
+ rect = fm.boundingRect(tx.c_str());
+ rect.setRight(rect.right() + x);
+ rect.setLeft(rect.left() + x);
+ rect.setTop(rect.top() + y);
+ rect.setBottom(rect.bottom() + y);
+ QRect prect = pix->rect();
+ prect.setRight(prect.right() + p.x());
+ prect.setLeft(prect.left() + p.x());
+ prect.setTop(prect.top() + p.y());
+ prect.setBottom(prect.bottom() + p.y());
+ rect |= prect;
+ }
+ else
+ {
+ int x = p.x()+1;
+ int y = p.y()+13;
+ QFontMetrics fm(textFont_);
+ rect = fm.boundingRect(tx.c_str());
+ rect = fm.boundingRect(tx.c_str());
+ rect.setRight(rect.right() + x);
+ rect.setLeft(rect.left() + x);
+ rect.setTop(rect.top() + y);
+ rect.setBottom(rect.bottom() + y);
+ }
+ return rect;
+}
+
+void TeQtBasicCanvas::plotLegend (QPoint p, const QPixmap* pix, string tx)
+{
+// if(painter_ == 0)
+// return;
+
+ TeVisual visual;
+ TeColor cor(0, 0, 0);
+
+ visual.fixedSize(true);
+ visual.size(8);
+ visual.bold(true);
+ visual.color(cor);
+ setTextColor (cor.red_, cor.green_, cor.blue_);
+ string fam = visual.family();
+ setTextStyle (fam, visual.size(), visual.bold(), visual.italic());
+ painter_.setFont(textFont_);
+ painter_.setPen(textPen_);
+
+ if(pix)
+ {
+ int x = p.x()+pix->width()+3;
+ int y = p.y()+13;
+ bitBlt (painter_.device(), p.x(), p.y(), pix, 0, 0, pix->width(), pix->height(), Qt::CopyROP, true);
+ painter_.drawText(x, y, tx.c_str());
+ }
+ else
+ {
+ int x = p.x()+1;
+ int y = p.y()+13;
+ painter_.drawText(x, y, tx.c_str());
+ }
+}
+
+void TeQtBasicCanvas::plotLine (TeLine2D &line)
+{
+ TeBox b = getDataWorld ();
+ if (!TeIntersects (b, line.box ()))
+ return;
+ int i,np;
+
+ linePen_.setColor (lineColor_);
+ painter_.setPen(linePen_);
+
+ np = line.size();
+ QPointArray a(np);
+ QPoint p;
+ for ( i = 0 ; i < np; i++)
+ {
+ p = mapWtoV (line[i]);
+ a.setPoint(i,p);
+ }
+ painter_.drawPolyline( a );
+}
+
+void TeQtBasicCanvas::plotArc (TeArc &arc)
+{
+ TeBox b = getDataWorld ();
+ if (!TeIntersects (b, arc.box ()))
+ return;
+
+ arcPen_.setColor (arcColor_);
+ painter_.setPen(arcPen_);
+
+ QPoint pfrom, pto;
+
+ pfrom = mapWtoV (arc.fromNode().location());
+ pto = mapWtoV (arc.toNode().location());
+
+ painter_.drawLine( pfrom, pto );
+
+ double ang = atan2 (double(pfrom.y()-pto.y()), double (pfrom.x()-pto.x()));
+ QPoint pm((int)((pto.x()+pfrom.x())/2.+0.5),(int)((pto.y()+pfrom.y())/2.+0.5));
+
+ double ang1 = ang + 25.*TeCDR;
+ double ang2 = ang - 25.*TeCDR;
+ QPoint p1((int)(10.*cos(ang1)+0.5),(int)(10.*sin(ang1)+.5)),
+ p2((int)(10.*cos(ang2)+0.5),(int)(10.*sin(ang2)+.5));
+ p1 += pm;
+ p2 += pm;
+ painter_.drawLine( pm, p1 );
+ painter_.drawLine( pm, p2 );
+ painter_.drawLine( p1, p2 );
+
+}
+
+void TeQtBasicCanvas::plotPie (double x, double y, double w, double h, double a, double alen)
+{
+ int dx, dy, dw, dh, da, df;
+
+ pieBrush_.setColor (pieColor_);
+ painter_.setBrush(pieBrush_);
+ painter_.setPen(linePen_);
+
+ TeCoord2D p(x, y);
+ QPoint qp = mapWtoV(p);
+ dx = qp.x();
+ dy = qp.y();
+
+ TeCoord2D pt(x+w, y+h);
+ QPoint qpt = mapWtoV(pt);
+ dw = abs(qpt.x() - dx);
+ dh = abs(qpt.y() - dy);
+
+ da = (int)(a * 16);
+ df = (int)(alen * 16);
+ painter_.drawPie(dx, dy-dh, dw, dh, da, df);
+}
+
+void TeQtBasicCanvas::setPieColor (int r, int g, int b)
+{
+ pieColor_.setRgb(r, g, b);
+ pieBrush_.setStyle(Qt::SolidPattern);
+}
+
+void TeQtBasicCanvas::plotRect (QRect& rect)
+{
+ rectBrush_.setColor (rectColor_);
+ painter_.setBrush(Qt::NoBrush);
+ painter_.setPen(linePen_);
+ painter_.drawRect(rect);
+}
+
+void TeQtBasicCanvas::plotRect (double x, double y, double w, double h, int transp, bool legend)
+{
+ if(pixmap1_ == 0)
+ return;
+
+ int dx, dy, dw, dh;
+
+ TeCoord2D p(x, y);
+ QPoint qp;
+ if(legend)
+ qp = QPoint((int)p.x(), (int)p.y());
+ else
+ qp = mapWtoV(p);
+ dx = qp.x();
+ dy = qp.y();
+
+ TeCoord2D pt(x+w, y+h);
+ QPoint qpt;
+ if(legend)
+ qpt = QPoint((int)pt.x(), (int)pt.y());
+ else
+ qpt = mapWtoV(pt);
+ dw = abs(qpt.x() - dx);
+ dh = abs(qpt.y() - dy);
+
+ if(transp == 0)
+ {
+ rectBrush_.setColor (rectColor_);
+ painter_.setBrush(rectBrush_);
+ painter_.setPen(linePen_);
+ painter_.drawRect(dx, dy-dh, dw, dh);
+ }
+ else
+ {
+ double alpha = transp / 100.;
+ double beta = 1 - alpha;
+ double red = rectColor_.red() * beta;
+ double green = rectColor_.green() * beta;
+ double blue = rectColor_.blue() * beta;
+
+ int r = dw%8;
+ if(r)
+ dw += (8-r);
+ r = dh%8;
+ if(r)
+ dh += (8-r);
+
+// QImage ima = pixmap1_->convertToImage();
+ QImage ima = pixmap0_->convertToImage();
+ QImage imap(dw, dh, 32);
+ int i, j;
+ int x = qp.x();
+ int y = qp.y() - dh;
+ for(i=x; i-x<dw && i<ima.width(); i++)
+ {
+ if(i < 0)
+ continue;
+ for(j=y; j-y<dh && j<ima.height(); j++)
+ {
+ if(j < 0)
+ continue;
+ QRgb v = ima.pixel(i, j);
+ int r = (int)((double)qRed(v) * alpha + red);
+ int g = (int)((double)qGreen(v) * alpha + green);
+ int b = (int)((double)qBlue(v) * alpha + blue);
+ QRgb t = qRgb(r, g, b);
+ imap.setPixel(i-x, j-y, t);
+ }
+ }
+
+ QPixmap pm(dw, dh);
+ pm.convertFromImage(imap);
+ QRect rec = pm.rect();
+ rec &= painter_.viewport();
+ bitBlt (painter_.device(), x, y, &pm, 0, 0, rec.width(), rec.height(), Qt::CopyROP, true);
+ }
+}
+
+void TeQtBasicCanvas::setRectColor (int r, int g, int b)
+{
+ rectColor_.setRgb(r, g, b);
+ rectBrush_.setStyle(Qt::SolidPattern);
+}
+
+static inline int blendComponent( int back, int fore, int falpha )
+{
+ int balpha = 255 - falpha;
+ int a = falpha + balpha -(falpha*balpha)/255;
+ return (falpha*fore + balpha*back -(balpha*falpha*fore)/255)/a;
+}
+
+int d2dms(double v)
+{
+ double av;
+ int d, m, s;
+ av = fabs(v);
+ d = (int)av;
+ av = av - d;
+ av = av * 60;
+ m = (int)av;
+ av = av - m;
+ av = av * 60;
+ s = (int)av;
+ int gms = d * 10000 + m * 100 + s ;
+ return gms;
+}
+
+double dms2d (int vs)
+{
+ int v = abs(vs);
+ int dd = v/10000;
+ int dm = (v-dd*10000)/100;
+ int ds = v - dd*10000 - dm*100;
+ double d = dd + dm/60. + ds/3600.;
+ if (vs < 0)
+ d = -d;
+ return d;
+}
+
+string buildMosaicName (int x, int y, int delta)
+{
+ int lad,lam,las,lod,lom,los,dd,dm,ds;
+ char hemis,hemiss;
+ int lx1,ly1;
+
+ hemis = 'S';
+ if (y>=0)hemis = 'N';
+ ly1 = abs(y);
+ lad = ly1/3600;
+ lam = (ly1-lad*3600)/60;
+ las = ly1 - lad*3600 - lam*60;
+
+ hemiss = 'O';
+ if (x>=0)hemis = 'E';
+ lx1 = abs(x);
+ lod = lx1/3600;
+ lom = (lx1-lod*3600)/60;
+ los = lx1 - lod*3600 - lom*60;
+
+ dd = delta/10000;
+ dm = (delta-dd*10000)/100;
+ ds = delta - dd*10000 - dm*100;
+
+ char name[128];
+ sprintf(name,"%c%02d%02d%02d%c%02d%02d%02d%02d%02d%02d",
+ hemis,lad,lam,las,hemiss,lod,lom,los,dd,dm,ds);
+ return string(name);
+}
+
+void TeQtBasicCanvas::copyPixmap0ToPrinter()
+{
+ if (pixmap0_)
+ {
+ QPrinter printer;
+ if (printer.setup())
+ {
+ QPainter p(&printer);
+
+ QPaintDevice* dev = painter_.device();
+ if(dev == pixmap0_)
+ painter_.end();
+
+ p.drawPixmap(0, 0, *pixmap0_);
+ p.flush();
+ p.end();
+
+ if(dev && painter_.device() == 0)
+ painter_.begin(dev);
+ }
+ }
+}
+
+void TeQtBasicCanvas::copyPixmapToWindow(QPixmap* p, int ulx, int uly, int w, int h)
+{
+ bitBlt (viewport(),ulx,uly,p,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap0To(QPaintDevice* dev)
+{
+ if (pixmap0_)
+ {
+ bitBlt (dev,0,0,pixmap0_,0,0,width_,height_,Qt::CopyROP,true);
+ }
+}
+
+void TeQtBasicCanvas::copyPixmap0ToWindow()
+{
+ if (pixmap0_)
+ {
+ bitBlt (viewport(),0,0,pixmap0_,0,0,width_,height_,Qt::CopyROP,true);
+ }
+}
+
+void TeQtBasicCanvas::copyPixmap1ToWindow()
+{
+ if (pixmap1_)
+ {
+ bitBlt (viewport(),0,0,pixmap1_,0,0,width_,height_,Qt::CopyROP,true);
+ }
+}
+
+void TeQtBasicCanvas::copyPixmap2ToWindow()
+{
+ if (pixmap2_)
+ {
+ bitBlt (viewport(),0,0,pixmap2_,0,0,width_,height_,Qt::CopyROP,true);
+ }
+}
+
+void TeQtBasicCanvas::copyPixmap3ToWindow()
+{
+ if (pixmap3_)
+ {
+ bitBlt (viewport(),0,0,pixmap3_,0,0,width_,height_,Qt::CopyROP,true);
+ }
+}
+
+void TeQtBasicCanvas::copyPixmap0ToWindow(int ulx, int uly, int w, int h)
+{
+ if (pixmap0_)
+ {
+ bitBlt (viewport(),ulx,uly,pixmap0_,ulx,uly,w,h,Qt::CopyROP,true);
+ }
+}
+
+void TeQtBasicCanvas::copyPanArea(int x, int y)
+{
+ if (pixmap0_)
+ {
+ QPaintDevice* dev = painter_.device();
+ if(dev)
+ painter_.end();
+ painter_.begin(viewport());
+ int w, h;
+ QRect a, b;
+ int hh = pixmap0_->height();
+ int ww = pixmap0_->width();
+ if(x <= 0 && y <= 0)
+ {
+ a = QRect(0, 0, ww, -y);
+ b = QRect(0, -y, -x, hh+y);
+ w = ww + x;
+ h = hh + y;
+ painter_.fillRect(a, painter_.backgroundColor());
+ painter_.fillRect(b, painter_.backgroundColor());
+ bitBlt (viewport(), -x, -y, pixmap1_, 0, 0, w, h, Qt::CopyROP, true);
+ }
+ else if(x >= 0 && y >= 0)
+ {
+ a = QRect(0, hh-y, ww, y);
+ b = QRect(ww-x, 0, x, hh-y);
+ w = ww - x;
+ h = hh - y;
+ painter_.fillRect(a, painter_.backgroundColor());
+ painter_.fillRect(b, painter_.backgroundColor());
+ bitBlt (viewport(), 0, 0, pixmap1_, x, y, w, h, Qt::CopyROP, true);
+ }
+ else if(x >= 0 && y <= 0)
+ {
+ a = QRect(0, 0, ww, -y);
+ b = QRect(ww-x, -y, x, hh+y);
+ w = ww - x;
+ h = hh + y;
+ painter_.fillRect(a, painter_.backgroundColor());
+ painter_.fillRect(b, painter_.backgroundColor());
+ bitBlt (viewport(), 0, -y, pixmap1_, x, 0, w, h, Qt::CopyROP, true);
+ }
+ else
+ {
+ a = QRect(0, hh-y, ww, y);
+ b = QRect(0, 0, -x, hh-y);
+ w = ww + x;
+ h = hh - y;
+ painter_.fillRect(a, painter_.backgroundColor());
+ painter_.fillRect(b, painter_.backgroundColor());
+ bitBlt (viewport(), -x, 0, pixmap1_, 0, y, w, h, Qt::CopyROP, true);
+ }
+ if(dev)
+ painter_.begin(dev);
+ }
+}
+
+void TeQtBasicCanvas::copyPixmap0ToPixmap1()
+{
+ if (pixmap1_ && pixmap0_)
+ bitBlt (pixmap1_,0,0,pixmap0_,0,0,width_,height_,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap0ToPixmap1(int ulx, int uly, int w, int h)
+{
+ if (pixmap1_ && pixmap0_)
+ bitBlt (pixmap1_,ulx,uly,pixmap0_,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap1ToPixmap0()
+{
+ if (pixmap1_ && pixmap0_)
+ bitBlt (pixmap0_,0,0,pixmap1_,0,0,width_,height_,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap1ToPixmap0(int ulx, int uly, int w, int h)
+{
+ if (pixmap1_ && pixmap0_)
+ bitBlt (pixmap0_,ulx,uly,pixmap1_,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap1ToPixmap2()
+{
+ if (pixmap1_ && pixmap2_)
+ {
+ bitBlt (pixmap2_,0,0,pixmap1_,0,0,width_,height_,Qt::CopyROP,true);
+ qimage_.reset();
+ qimage_ = pixmap2_->convertToImage();
+ }
+}
+
+void TeQtBasicCanvas::copyPixmap1ToPixmap2(int ulx, int uly, int w, int h)
+{
+ if (pixmap1_ && pixmap2_)
+ {
+ bitBlt (pixmap2_,ulx,uly,pixmap1_,ulx,uly,w,h,Qt::CopyROP,true);
+ qimage_.reset();
+ qimage_ = pixmap2_->convertToImage();
+ }
+}
+
+void TeQtBasicCanvas::copyPixmap2ToPixmap1()
+{
+ if (pixmap1_ && pixmap2_)
+ bitBlt (pixmap1_,0,0,pixmap2_,0,0,width_,height_,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap2ToPixmap1(int ulx, int uly, int w, int h)
+{
+ if (pixmap1_ && pixmap2_)
+ bitBlt (pixmap1_,ulx,uly,pixmap2_,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap2ToPixmap3()
+{
+ if (pixmap3_ && pixmap2_)
+ bitBlt (pixmap3_,0,0,pixmap2_,0,0,width_,height_,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap2ToPixmap3(int ulx, int uly, int w, int h)
+{
+ if (pixmap3_ && pixmap2_)
+ bitBlt (pixmap3_,ulx,uly,pixmap2_,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap3ToPixmap2()
+{
+ if (pixmap3_ && pixmap2_)
+ bitBlt (pixmap2_,0,0,pixmap3_,0,0,width_,height_,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap3ToPixmap2(int ulx, int uly, int w, int h)
+{
+ if (pixmap3_ && pixmap2_)
+ bitBlt (pixmap2_,ulx,uly,pixmap3_,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::plotRaster(TeRaster* raster, TeRasterTransform* transf, TeQtProgress *progress)
+{
+ QPixmap* pix = (QPixmap*)(painter_.device());
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+ params_.fileName_ = raster->params().fileName_;
+
+ if (buildRaster ())
+ {
+ // Calculates the box of input image that intersects the box of the canvas
+ TeBox bboxBackRaster = backRaster_->params().boundingBox();
+ TeBox bboxSearched = TeRemapBox(bboxBackRaster, backRaster_->projection(), raster->projection());
+ TeBox bboxIntersection;
+ if (!TeIntersection (raster->params().boundingBox(),bboxSearched,bboxIntersection))
+ return ; // no intersection
+
+ // Create a remapping tool to back raster
+ TeDecoderQtImage* decqt = reinterpret_cast<TeDecoderQtImage*>(backRaster_->decoder());
+ TeRasterRemap remap;
+ if (transf)
+ remap.setTransformer(transf);
+ remap.setOutput(backRaster_);
+
+ // Calculates best resolution level to display the input image on this canvas
+ TeBox box = params_.boundingBox();
+ int nlines = params_.nlines_;
+ int ncols = params_.ncols_;
+ int res = raster->decoder()->bestResolution(box, nlines, ncols, params_.projection());
+
+ // Check if raster blocks in best level of resolution that intersects the canvas box
+ TeRasterParams parBlock;
+ if (raster->selectBlocks(bboxIntersection,res,parBlock))
+ {
+ params_.resolution_ = res;
+ if (progress)
+ progress->setTotalSteps(raster->numberOfSelectedBlocks());
+ t2 = clock();
+ t0 = t1 = t2;
+
+ // Process each block as an independent raster decoded in memory
+ TeRaster* block = new TeRaster;
+ TeDecoderMemory* decMem = new TeDecoderMemory(parBlock);
+ decMem->init();
+ remap.setInput(block);
+
+ // Portal of raster block selection behaves as portal of geometries
+ // use the "bool flag - do - while" scheme
+ int numBlockProcessed=0;
+ bool flag = true;
+ do
+ {
+ flag = raster->fetchRasterBlock(decMem);
+ block->setDecoder(decMem);
+ remap.apply();
+ numBlockProcessed++;
+
+ TeRasterParams par = decMem->params();
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ if((int)(t2-t0) > dt2) // show progress and refresh painted area
+ {
+ if (progress)
+ {
+ if (progress->wasCancelled())
+ break;
+ else
+ progress->setProgress(numBlockProcessed);
+ }
+ if(pix == pixmap0_ || pix == pixmap1_ || pix == pixmap2_ || pix == pixmap3_)
+ {
+ QPaintDevice* dev = painter_.device();
+ if(dev)
+ painter_.end();
+ if(dev == pixmap0_)
+ {
+ pixmap0_->convertFromImage (*(decqt->getImage ()));
+ copyPixmap0ToWindow();
+ }
+ else if(dev == pixmap1_)
+ {
+ pixmap1_->convertFromImage (*(decqt->getImage ()));
+ copyPixmap1ToWindow();
+ }
+ else if(dev == pixmap2_)
+ {
+ pixmap2_->convertFromImage (*(decqt->getImage ()));
+ copyPixmap2ToWindow();
+ }
+ else if(dev == pixmap3_)
+ {
+ pixmap3_->convertFromImage (*(decqt->getImage ()));
+ copyPixmap3ToWindow();
+ }
+ if(dev)
+ painter_.begin(dev);
+ }
+ else
+ pix->convertFromImage (*(decqt->getImage ()));
+ }
+ }
+ } while (flag);
+ if (progress)
+ progress->reset();
+ decMem->clear();
+ delete block;
+ raster->clearBlockSelection();
+ }
+ else // no blocks found try to remap the whole raster
+ {
+ remap.setInput(raster);
+ remap.apply(true);
+ }
+
+ if(pix == pixmap0_ || pix == pixmap1_ || pix == pixmap2_ || pix == pixmap3_)
+ {
+ QPaintDevice* dev = painter_.device();
+ if(dev)
+ painter_.end();
+
+ if(dev == pixmap0_)
+ {
+ pixmap0_->convertFromImage (*(decqt->getImage ()));
+ copyPixmap0ToWindow();
+ }
+ else if(dev == pixmap1_)
+ {
+ pixmap1_->convertFromImage (*(decqt->getImage ()));
+ copyPixmap1ToWindow();
+ }
+ else if(dev == pixmap2_)
+ {
+ pixmap2_->convertFromImage (*(decqt->getImage ()));
+ copyPixmap2ToWindow();
+ }
+ else if(dev == pixmap3_)
+ {
+ pixmap3_->convertFromImage (*(decqt->getImage ()));
+ copyPixmap3ToWindow();
+ }
+ if(dev)
+ painter_.begin(dev);
+ }
+ else
+ pix->convertFromImage (*(decqt->getImage ()));
+ }
+}
+
+bool TeQtBasicCanvas::buildRaster ()
+{
+/* if (backRaster_)
+ {
+ TeRasterParams rparams = backRaster_->params();
+ if (!(rparams.box() == params_.box()) ||
+ rparams.ncols_ != params_.ncols_ ||
+ rparams.nlines_ != params_.nlines_)
+ {
+ delete backRaster_;
+ backRaster_ = 0;
+ }
+ else
+ {
+ if (rparams.fileName_ != params_.fileName_)
+ return true;
+ return false;
+ }
+ }
+*/
+ if (!backRaster_)
+ {
+ backRaster_ = new TeRaster();
+ params_.mode_ = 'c';
+ params_.useDummy_ = true;
+ params_.setDummy(255);
+ TeDecoderQtImage *dec = new TeDecoderQtImage(params_);
+ backRaster_->setDecoder (dec);
+ backRaster_->init();
+ }
+ return true;
+}
+
+void TeQtBasicCanvas::endPrinting()
+{
+ QPaintDevice* dev = painter_.device();
+ if(dev)
+ painter_.end();
+ if(pixmap0_)
+ painter_.begin(pixmap0_);
+}
+
+void TeQtBasicCanvas::plotGraphicScale(TeVisual& visual)
+{
+ TeColor cor = visual.color();
+ string family = visual.family();
+ int size = visual.size();
+ bool bold = visual.bold();
+ bool italic = visual.italic();
+ TeBox box = getWorld();
+ double w = box.width();
+ double dx = w / 9.;
+ long idx = (long)dx;
+ double f;
+ double fa = 1.;
+ int fw, fh;
+
+ if(box.isValid() == false)
+ return;
+
+ int conta = 1000;
+ if(idx > 0)
+ {
+ while(--conta)
+ {
+ dx /= 10.;
+ fa *= 10.;
+ idx = (long)dx;
+ if(idx == 0)
+ {
+ idx = (long)(dx * 10.);
+ f = idx * fa / 10.;
+ break;
+ }
+ }
+ }
+ else
+ {
+ while(--conta)
+ {
+ dx *= 10.;
+ fa /= 10.;
+ idx = (long)dx;
+ if(idx > 0)
+ {
+ f = idx * fa;
+ break;
+ }
+ }
+ }
+ if(conta == 0)
+ return;
+
+ double space = f * 3.;
+ double hini = box.x1_ + (w - space) / 2.;
+
+ QFont font(family.c_str(), size);
+ font.setBold (bold);
+ font.setItalic (italic);
+ painter_.setFont(font);
+
+ QFontMetrics fm(font);
+ QRect rect;
+ string unit = canvasProjection_->units();
+ rect = fm.boundingRect(unit.c_str());
+ fh = rect.height();
+ double vini = box.y1_ + mapVtoW(fh+6);
+
+ TeCoord2D wp(hini, vini);
+ QPoint p1((int)((wp.x() - xmin_)*f_ + 0.5)+x0_,
+ height_ - y0_ - (int)((wp.y() - ymin_)*f_ + 0.5));
+ correctScrolling (p1);
+
+ wp.x(wp.x() + f);
+ QPoint p2((int)((wp.x() - xmin_)*f_ + 0.5)+x0_,
+ height_ - y0_ - (int)((wp.y() - ymin_)*f_ + 0.5));
+ correctScrolling (p2);
+
+ wp.x(wp.x() + f);
+ QPoint p3((int)((wp.x() - xmin_)*f_ + 0.5)+x0_,
+ height_ - y0_ - (int)((wp.y() - ymin_)*f_ + 0.5));
+ correctScrolling (p3);
+
+ wp.x(wp.x() + f);
+ QPoint p4((int)((wp.x() - xmin_)*f_ + 0.5)+x0_,
+ height_ - y0_ - (int)((wp.y() - ymin_)*f_ + 0.5));
+ correctScrolling (p4);
+
+ QPen pen(QColor(cor.red_, cor.green_, cor.blue_));
+ painter_.setPen(pen);
+
+ if(bold == false)
+ {
+ QPoint pa = p2;
+ QPoint pb = p3;
+ painter_.drawLine(pa, pb);
+
+ pa = p1;
+ pb = pa;
+ pa.setY(pa.y() - 5);
+ pb.setY(pb.y() + 4);
+ painter_.drawLine(pa, pb);
+
+ pa = p2;
+ pb = pa;
+ pa.setY(pa.y() - 5);
+ pb.setY(pb.y() + 4);
+ painter_.drawLine(pa, pb);
+
+ pa = p3;
+ pb = pa;
+ pa.setY(pa.y() - 5);
+ pb.setY(pb.y() + 4);
+ painter_.drawLine(pa, pb);
+
+ pa = p4;
+ pb = pa;
+ pa.setY(pa.y() - 5);
+ pb.setY(pb.y() + 4);
+ painter_.drawLine(pa, pb);
+
+ pa = p1;
+ pb = p4;
+ pa.setY(pa.y() - 1);
+ pb.setY(pb.y() - 1);
+ painter_.drawLine(pa, pb);
+ pa.setY(pa.y() + 2);
+ pb.setY(pb.y() + 2);
+ painter_.drawLine(pa, pb);
+ }
+ else
+ {
+ QPoint pa = p2;
+ QPoint pb = p3;
+ painter_.drawLine(pa, pb);
+ pa.setY(pa.y()-1);
+ pb.setY(pb.y()-1);
+ painter_.drawLine(pa, pb);
+
+ pa = p1;
+ pb = pa;
+ pa.setY(pa.y() - 5);
+ pb.setY(pb.y() + 4);
+ painter_.drawLine(pa, pb);
+ pa.setX(pa.x()-1);
+ pb.setX(pb.x()-1);
+ painter_.drawLine(pa, pb);
+
+ pa = p2;
+ pb = pa;
+ pa.setY(pa.y() - 5);
+ pb.setY(pb.y() + 4);
+ painter_.drawLine(pa, pb);
+ pa.setX(pa.x()-1);
+ pb.setX(pb.x()-1);
+ painter_.drawLine(pa, pb);
+
+ pa = p3;
+ pb = pa;
+ pa.setY(pa.y() - 5);
+ pb.setY(pb.y() + 4);
+ painter_.drawLine(pa, pb);
+ pa.setX(pa.x()-1);
+ pb.setX(pb.x()-1);
+ painter_.drawLine(pa, pb);
+
+ pa = p4;
+ pb = pa;
+ pa.setY(pa.y() - 5);
+ pb.setY(pb.y() + 4);
+ painter_.drawLine(pa, pb);
+ pa.setX(pa.x()-1);
+ pb.setX(pb.x()-1);
+ painter_.drawLine(pa, pb);
+
+ pa = p1;
+ pb = p4;
+ pa.setY(pa.y() - 2);
+ pb.setY(pb.y() - 2);
+ painter_.drawLine(pa, pb);
+ pa.setY(pa.y() + 3);
+ pb.setY(pb.y() + 3);
+ painter_.drawLine(pa, pb);
+ }
+
+ rect = fm.boundingRect("0");
+ fw = rect.width();
+ painter_.drawText (p1.x()-fw/2, p1.y()-8, "0");
+
+ char buf[50];
+ long n = (long)f;
+
+ if(n > 0)
+ {
+ sprintf(buf, "%ld", n);
+ QString s = buf;
+ rect = fm.boundingRect(s);
+ int fw1 = rect.width();
+
+ sprintf(buf, "%ld", n*2);
+ s = buf;
+ rect = fm.boundingRect(s);
+ int fw2 = rect.width();
+
+ sprintf(buf, "%ld", n*3);
+ s = buf;
+ rect = fm.boundingRect(s);
+ int fw3 = rect.width();
+
+ if((fw1 + fw2)/2 < p3.x()-p2.x() &&
+ (fw2 + fw3)/2 < p3.x()-p2.x())
+ {
+ sprintf(buf, "%ld", n);
+ QString s = buf;
+ rect = fm.boundingRect(s);
+ fw = rect.width();
+ painter_.drawText (p2.x()-fw/2, p2.y()-8, s);
+
+ sprintf(buf, "%ld", n*2);
+ s = buf;
+ rect = fm.boundingRect(s);
+ fw = rect.width();
+ painter_.drawText (p3.x()-fw/2, p3.y()-8, s);
+ }
+
+ sprintf(buf, "%ld", n*3);
+ s = buf;
+ rect = fm.boundingRect(s);
+ fw = rect.width();
+ painter_.drawText (p4.x()-fw/2, p4.y()-8, s);
+ }
+ else
+ {
+ int nn=0;
+ int fn = (int)fa;
+ while(fn == 0)
+ {
+ fa *= 10;
+ fn = (int)fa;
+ nn++;
+ }
+ sprintf (buf, "%.*f", nn, f);
+ QString s = buf;
+ rect = fm.boundingRect(s);
+ int fw1 = rect.width();
+
+ sprintf (buf, "%.*f", nn, f*2.);
+ s = buf;
+ rect = fm.boundingRect(s);
+ int fw2 = rect.width();
+
+ sprintf (buf, "%.*f", nn, f*3.);
+ s = buf;
+ rect = fm.boundingRect(s);
+ int fw3 = rect.width();
+
+ if((fw1 + fw2)/2 < p3.x()-p2.x() &&
+ (fw2 + fw3)/2 < p3.x()-p2.x())
+ {
+ sprintf (buf, "%.*f", nn, f);
+ QString s = buf;
+ rect = fm.boundingRect(s);
+ fw = rect.width();
+ painter_.drawText (p2.x()-fw/2, p2.y()-8, s);
+
+ sprintf (buf, "%.*f", nn, f*2.);
+ s = buf;
+ rect = fm.boundingRect(s);
+ fw = rect.width();
+ painter_.drawText (p3.x()-fw/2, p3.y()-8, s);
+ }
+
+ sprintf (buf, "%.*f", nn, f*3.);
+ s = buf;
+ rect = fm.boundingRect(s);
+ fw = rect.width();
+ painter_.drawText (p4.x()-fw/2, p4.y()-8, s);
+ }
+
+ int sw = p4.x() - p1.x();
+ rect = fm.boundingRect(unit.c_str());
+ fw = rect.width();
+ fh = rect.height();
+ int suini = (sw - fw) / 2 + p1.x();
+ painter_.drawText (suini, p1.y()+fh+2, unit.c_str());
+}
+
+void TeQtBasicCanvas::setClipRegion(int x, int y, int w, int h)
+{
+ QRegion region(x, y, w, h);
+ if(painter_.device())
+ painter_.setClipRegion(region);
+}
+
+void TeQtBasicCanvas::setClipRegion(QRegion region)
+{
+ if(painter_.device())
+ painter_.setClipRegion(region);
+}
+
+void TeQtBasicCanvas::setClipping(bool enable)
+{
+ if(painter_.device())
+ painter_.setClipping(enable);
+}
+
+void TeQtBasicCanvas::clearRaster()
+{
+ if (backRaster_)
+ delete backRaster_;
+ backRaster_ = 0;
+}
diff --git a/src/terralib/application/qt/TeQtBasicCanvas.h b/src/terralib/application/qt/TeQtBasicCanvas.h
new file mode 100644
index 0000000..066decf
--- /dev/null
+++ b/src/terralib/application/qt/TeQtBasicCanvas.h
@@ -0,0 +1,280 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTBASICCANVAS_H
+#define __TERRALIB_INTERNAL_QTBASICCANVAS_H
+
+#include <TeDatabase.h>
+#include <TeRaster.h>
+
+#include <qpainter.h>
+#include <qbrush.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qbitmap.h>
+#include <qprinter.h>
+#include <qscrollview.h>
+
+#include <string>
+using namespace std;
+
+class TeQtProgress;
+/**
+ *@author R Cartaxo
+ */
+
+class TeQtBasicCanvas : public QScrollView
+{
+public:
+ TeQtBasicCanvas(QWidget *parent, const char *name );
+ virtual ~TeQtBasicCanvas();
+ void setWorld(TeBox b, int w = 0, int h = 0, QPaintDevice *pd = 0);
+ virtual void setView(int /*w*/ = 0, int /*h*/ = 0, QPaintDevice * /* pd */ = 0) {}
+ void setTransformation(double xmin, double xmax, double ymin, double ymax, bool extend = true);
+ TeBox getWorld() {return wc_ ;}
+ TeBox getDataWorld();
+
+// Coordinates system transformation
+// Viewport to Canvas coordinates
+ double mapVtoW (int);
+ TeCoord2D mapVtoW (QPoint);
+// Viewport to Data World coordinates
+ double mapVtoDW (int);
+ TeCoord2D mapVtoDW (QPoint);
+// Data World to Viewport coordinates
+ QPoint mapWtoV (TeCoord2D);
+ void mapWtoV (TeBox& box);
+// Canvas World to Data World coordinates
+ void mapCanvasWorldToDataWorld (TeBox& w);
+// Data World to Canvas World coordinates
+ void mapDataWorldToCanvasWorld (TeBox& w);
+// Data Canvas World to Viewport coordinates
+ void mapCanvasWorldToViewport (TeBox& w);
+// Viewport to Canvas World coordinates
+ void mapViewportToCanvasWorld (TeBox& w);
+ QPoint mapCanvasWorldToViewport (TeCoord2D& c);
+
+ virtual void correctScrolling (QPoint & ) {}
+ virtual QPoint offset () {QPoint p; return p;}
+// Pixel size in world coordinates
+ double pixelSize () { return (xmax_-xmin_)/(double)width_; }
+
+// Sets the projection of next incoming data
+ void setDataProjection ( TeProjection* proj );
+
+// Sets the projection
+ void setProjection ( TeProjection* proj );
+
+// Retrive the projection
+ TeProjection* projection()
+ { return canvasProjection_; }
+
+// Plotting primitives
+
+// void setPainter (QPainter* p) {painter_ = p;}
+ QPainter* getPainter () {return &painter_;}
+ void plotOnWindow ();
+ void plotOnPixmap0 ();
+ void plotOnPixmap1 ();
+ virtual void copyPixmapToWindow(QPixmap*, int, int, int, int);
+ virtual void copyPixmap0ToPrinter();
+ virtual void copyPixmap0To(QPaintDevice*);
+ virtual void copyPixmap0ToWindow();
+ virtual void copyPixmap1ToWindow();
+ virtual void copyPixmap2ToWindow();
+ virtual void copyPixmap3ToWindow();
+ virtual void copyPixmap0ToWindow(int, int, int, int);
+ virtual void copyPixmap0ToPixmap1();
+ virtual void copyPixmap0ToPixmap1(int, int, int, int);
+ virtual void copyPixmap1ToPixmap0();
+ virtual void copyPixmap1ToPixmap0(int, int, int, int);
+ virtual void copyPixmap1ToPixmap2();
+ virtual void copyPixmap1ToPixmap2(int, int, int, int);
+ virtual void copyPixmap2ToPixmap1();
+ virtual void copyPixmap2ToPixmap1(int, int, int, int);
+ virtual void copyPixmap2ToPixmap3();
+ virtual void copyPixmap2ToPixmap3(int, int, int, int);
+ virtual void copyPixmap3ToPixmap2();
+ virtual void copyPixmap3ToPixmap2(int, int, int, int);
+ virtual void copyPanArea(int, int);
+
+ void plotPoint (TeCoord2D &p);
+ void plotPoint (TePoint &p){ plotPoint(p.location()); }
+
+ void setPointColor (int r, int g, int b);
+ void setPointStyle (int s, int w = 3);
+ void setPointPixmap (char* p);
+
+ void plotCell (TeCell &s);
+
+ QRect getLegendRect (QPoint p, const QPixmap* pix, string tx);
+ void plotLegend (QPoint p, const QPixmap* pix, string tx);
+
+ void plotPolygon (TePolygon &p);
+ void setPolygonColor (int r, int g, int b);
+ void setPolygonStyle (int s, int width = 1);
+ void setPolygonLineColor (int r, int g, int b);
+ void setPolygonLineStyle (int s, int width = 1);
+
+ void plotLine (TeLine2D &l);
+ void setLineColor (int r, int g, int b);
+ void setLineStyle (int s, int w = 1);
+
+ void plotNode (TeNode &n);
+ void setNodeColor (int r, int g, int b);
+ void setNodeStyle (int s, int w = 4);
+ void setNodePixmap (char* p);
+
+ void plotArc (TeArc &a);
+ void setArcColor (int r, int g, int b);
+ void setArcStyle ( int s, int w = 1 );
+
+ void plotPie (double x, double y, double w, double h, double a, double alen);
+ void setPieColor (int r, int g, int b);
+ void plotRect (double x, double y, double w, double h, int transp=0, bool legend=false);
+ void plotRect (QRect&);
+ void setRectColor (int r, int g, int b);
+
+ void plotText (TeCoord2D &p, string &str, double angle = 0., double alignh = 0., double alignv = 0.);
+ void plotText (TeText &tx, TeVisual& visual);
+ QRect textRect (TeText &tx, TeVisual visual);
+ void plotTextRects (TeText &tx, TeVisual visual);
+ void setTextColor (int r, int g, int b);
+ void setTextSize (int size);
+ void setTextStyle (string& family, int size, bool bold, bool italic);
+ void setTextTTStyle (QString& font, int size);
+ void useTextTT (bool u) { textTT_ = u; }
+ void textExtent ( string &str, int &w, int &h, double angle = 0.);
+ void plotXorPolyline (QPointArray& PA, bool cdev=true);
+
+ void setDB (TeDatabase* db) { db_ = db; }
+ void plotRaster (TeRaster* raster, TeRasterTransform* transf, TeQtProgress *progress);
+ void clearRaster();
+ void endPrinting();
+
+ QPixmap* getPixmap0 () {return pixmap0_; }
+ QPixmap* getPixmap1 () {return pixmap1_; }
+ QPixmap* getPixmap2 () {return pixmap2_; }
+ QPixmap* getPixmap3 () {return pixmap3_; }
+
+ void plotGraphicScale(TeVisual& visual);
+
+ void setClipRegion(int x, int y, int w, int h);
+ void setClipRegion(QRegion region);
+ void setClipping (bool enable);
+
+ virtual void copyPixmapToWindow(){}
+
+ TeRasterParams& getParams()
+ { return params_; }
+
+ double scaleApx() {return scaleApx_;}
+ void scaleApx(double);
+
+protected:
+
+ void plotMark(QPoint &p, int s, int w);
+ bool buildRaster ();
+
+// Sizes and transformation
+ TeBox wc_;
+ double xmin_,
+ xmax_,
+ ymin_,
+ ymax_;
+
+ int x0_;
+ int y0_;
+ int width_;
+ int height_;
+ double f_;
+ double scaleApx_;
+ TeProjection* canvasProjection_;
+ TeProjection* dataProjection_;
+
+// The Painter
+ QPainter painter_;
+
+// Pie
+ QBrush pieBrush_;
+ QColor pieColor_;
+ QBrush rectBrush_;
+ QColor rectColor_;
+
+// Polygon
+ int polygonTransparency_;
+ QBrush polygonBrush_;
+ QPen polygonPen_;
+ QColor polygonColor_;
+ map<TePolyBasicType, Qt::BrushStyle> brushStyleMap_;
+
+// Line
+ QPen linePen_;
+ QColor lineColor_;
+ map<TeLnBasicType, Qt::PenStyle> penStyleMap_;
+
+// Point
+ int pointStyle_;
+ int pointSize_;
+ QPen pointPen_;
+ QColor pointColor_;
+ QPixmap* pointPixmap_;
+
+// Arc
+ QPen arcPen_;
+ QColor arcColor_;
+
+// Node
+ int nodeStyle_;
+ int nodeSize_;
+ QPen nodePen_;
+ QColor nodeColor_;
+ QPixmap* nodePixmap_;
+
+// Text
+ QPen textPen_;
+ QColor textColor_;
+ QFont textFont_;
+ string textTTFont_;
+ int textSize_;
+ bool textTT_;
+
+// Pixmap
+ QPixmap *pixmap0_;
+ QPixmap *pixmap1_;
+ QPixmap *pixmap2_;
+ QPixmap *pixmap3_;
+
+ QImage qimage_;
+
+ int scale_;
+ TeRaster *backRaster_;
+ TeRasterParams params_;
+ int lx1_,
+ ly1_,
+ lx2_,
+ ly2_;
+
+ TeDatabase *db_;
+};
+
+#endif
+
diff --git a/src/terralib/application/qt/TeQtCanvas.cpp b/src/terralib/application/qt/TeQtCanvas.cpp
new file mode 100644
index 0000000..051eb3e
--- /dev/null
+++ b/src/terralib/application/qt/TeQtCanvas.cpp
@@ -0,0 +1,625 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtCanvas.h>
+#include <stdio.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qcursor.h>
+#include <qpaintdevicemetrics.h>
+
+#define MIN(a,b) a<b?a:b
+#define MAX(a,b) a>b?a:b
+
+//TeQtCanvas::TeQtCanvas(QWidget *parent, const char *name ) : QScrollView(parent,name,WNorthWestGravity)
+TeQtCanvas::TeQtCanvas(QWidget *parent, const char *name ) : TeQtBasicCanvas(parent,name)
+{
+ setVScrollBarMode(QScrollView::Auto);
+ setHScrollBarMode(QScrollView::Auto);
+ viewport()->setMouseTracking( TRUE );
+ viewport()->setFocusPolicy( StrongFocus );
+ viewport()->setBackgroundColor( backgroundColor() );
+ setMargin (0);
+ width_ = viewport()->width();
+ height_ = viewport()->height();
+ popupCanvas_ = new QPopupMenu(this);
+}
+
+TeQtCanvas::~TeQtCanvas()
+{
+ if (backRaster_)
+ delete backRaster_;
+ backRaster_ = 0;
+
+ QPaintDevice* dev = painter_.device();
+ if(dev)
+ painter_.end();
+
+ if(pixmap0_)
+ delete pixmap0_;
+ pixmap0_ = 0;
+
+ if(pixmap1_)
+ delete pixmap1_;
+ pixmap1_ = 0;
+
+ if(pixmap2_)
+ delete pixmap2_;
+ pixmap2_ = 0;
+
+ if(pixmap3_)
+ delete pixmap3_;
+ pixmap3_ = 0;
+}
+
+void TeQtCanvas::setMode (CursorMode m)
+{
+ cursorMode_ = m;
+ down_ = false;
+}
+
+void TeQtCanvas::clear()
+{
+ int ww, hh;
+ ww = viewport()->width();
+ hh = viewport()->height();
+ resizeContents (ww,hh);
+
+// Clear the window
+ QPaintDevice* dev = painter_.device();
+ if(dev)
+ painter_.end();
+ painter_.begin(viewport());
+ painter_.eraseRect(0, 0, ww, hh);
+ painter_.end();
+ if(dev)
+ painter_.begin(dev);
+
+ emit windowClear();
+}
+
+void TeQtCanvas::clear(TeBox box)
+{
+ int ww, hh;
+ ww = viewport()->width();
+ hh = viewport()->height();
+ resizeContents (ww,hh);
+
+ mapCanvasWorldToViewport(box);
+// Clear the window
+ QPaintDevice* dev = painter_.device();
+ plotOnWindow();
+ painter_.eraseRect((int)box.x1(), (int)box.y1(), (int)box.width(), (int)box.height());
+ painter_.end();
+ if(dev)
+ painter_.begin(dev);
+ emit windowClear();
+}
+
+void TeQtCanvas::clearAll()
+{
+ // Clear the window
+ clear();
+
+ // Clear the pixmap
+ if(pixmap0_)
+ pixmap0_->fill(paletteBackgroundColor());
+ if(pixmap1_)
+ pixmap1_->fill(paletteBackgroundColor());
+ if(pixmap2_)
+ pixmap2_->fill(paletteBackgroundColor());
+ if(pixmap3_)
+ pixmap3_->fill(paletteBackgroundColor());
+
+ if (backRaster_)
+ delete backRaster_;
+ backRaster_ = 0;
+
+}
+
+void TeQtCanvas::clearAll(TeBox box)
+{
+ // Clear the window
+ clear(box);
+
+ // Clear the pixmap
+ mapCanvasWorldToViewport(box);
+
+ QPaintDevice* dev = painter_.device();
+ if(dev)
+ painter_.end();
+
+ if(pixmap0_)
+ {
+ painter_.begin(pixmap0_);
+ painter_.fillRect((int)box.x1(), (int)box.y1(), (int)box.width(), (int)box.height(), backgroundColor());
+ painter_.end();
+ }
+ if(pixmap1_)
+ {
+ painter_.begin(pixmap1_);
+ painter_.fillRect((int)box.x1(), (int)box.y1(), (int)box.width(), (int)box.height(), backgroundColor());
+ painter_.end();
+ }
+ if(pixmap0_)
+ {
+ painter_.begin(pixmap2_);
+ painter_.fillRect((int)box.x1(), (int)box.y1(), (int)box.width(), (int)box.height(), backgroundColor());
+ painter_.end();
+ }
+
+ if(dev)
+ painter_.begin(dev);
+}
+
+void TeQtCanvas::setView(int w, int h, QPaintDevice *pd)
+{
+ int ww = w,
+ hh = h;
+
+ int dpix, dpiy, ncolors, wmm, hmm, depth, pdepth;
+
+ if (pd == 0)
+ {
+ if (ww == 0)
+ ww = viewport()->width();
+ if (hh == 0)
+ hh = viewport()->height();
+ resizeContents (ww,hh);
+ x0_ = 0;
+ y0_ = 0;
+ }
+ else
+ {
+ QPaintDeviceMetrics pdm( pd );
+ if (ww == 0)
+ ww = pdm.width();
+ if (hh == 0)
+ hh = pdm.height ();
+// x0_ = pdm.width()*.1;
+// y0_ = pdm.height()*.1;
+ x0_ = 0;
+ y0_ = 0;
+ dpix = pdm.logicalDpiX();
+ dpiy = pdm.logicalDpiY();
+ ncolors = pdm.numColors ();
+ wmm = pdm.widthMM ();
+ hmm = pdm.heightMM ();
+ depth = pdm.depth ();
+ QPaintDevice* dev = painter_.device();
+ if(dev)
+ painter_.end();
+ painter_.begin(pd);
+ painter_.setClipRect( x0_, y0_, ww, hh );
+ }
+
+// Build new pixmap if window has been resized
+ if (pixmap0_ == 0 || width_ != ww || height_ != hh)
+ {
+ QPaintDevice* dev = painter_.device();
+ if(dev)
+ painter_.end();
+
+ if (pixmap0_)
+ delete pixmap0_;
+ pixmap0_ = 0;
+
+ if (pixmap1_)
+ delete pixmap1_;
+ pixmap1_ = 0;
+
+ if (pixmap2_)
+ delete pixmap2_;
+ pixmap2_ = 0;
+
+ if (pixmap3_)
+ delete pixmap3_;
+ pixmap3_ = 0;
+
+// Build a new pixmap
+ pixmap0_ = new QPixmap (ww,hh);
+ pixmap1_ = new QPixmap (ww,hh);
+ pixmap2_ = new QPixmap (ww,hh);
+ pixmap3_ = new QPixmap (ww,hh);
+
+ pdepth = pixmap0_->depth ();
+ }
+
+ width_ = ww;
+ height_ = hh;
+ params_.ncols_ = width_;
+ params_.nlines_ = height_;
+
+ if (pd == 0)
+ {
+ QPaintDevice* dev = painter_.device();
+ if(dev)
+ painter_.end();
+ painter_.begin(pixmap0_);
+ }
+
+ down_ = false;
+ xul_ = xmin_;
+ yul_ = ymax_;
+ xlr_ = xmax_;
+ ylr_ = ymin_;
+ clearAll();
+}
+
+void TeQtCanvas::correctScrolling (QPoint &p)
+{
+ if(painter_.device() == viewport())
+ {
+ QPoint o (contentsX (), contentsY ());
+ p -= o;
+ }
+}
+
+void TeQtCanvas::initCursorArea(QPoint p)
+{
+ if (!pixmap0_)
+ return;
+
+ down_ = true;
+ TeCoord2D pw = mapVtoW(p);
+ xul_ = pw.x();
+ yul_ = pw.y();
+ ixul_ = ixlr_ = p.x();
+ iyul_ = iylr_ = p.y();
+}
+
+void TeQtCanvas::contentsMousePressEvent( QMouseEvent* e)
+{
+ if (!pixmap0_)
+ return;
+
+ QPoint m = e->pos();
+ TeCoord2D p = mapVtoW(m);
+
+ if(e->button() == LeftButton)
+ {
+ if (cursorMode_ == Area || cursorMode_ == Edit)
+ {
+ plotOnWindow();
+ down_ = true;
+ xul_ = p.x();
+ yul_ = p.y();
+ ixul_ = ixlr_ = e->pos().x();
+ iyul_ = iylr_ = e->pos().y();
+ emit mouseMoved (p, e->state(), m);
+ }
+ else
+ emit mousePressed (p, e->state(), m);
+ }
+ else if(e->button() == RightButton)
+ emit mouseRightButtonPressed (p, e->state(), m);
+}
+
+void TeQtCanvas::contentsMouseMoveEvent ( QMouseEvent* e)
+{
+ if (!pixmap0_)
+ return;
+ QPoint m = e->pos();
+ TeCoord2D p = mapVtoW(m);
+ if (down_)
+ {
+ QPoint o = offset();
+ painter_.setPen (green);
+ painter_.setRasterOp (Qt::XorROP);
+ painter_.drawLine(ixul_-o.x(),iyul_-o.y(),ixlr_-o.x()-1,iyul_-o.y());
+ painter_.drawLine(ixlr_-o.x(),iyul_-o.y(),ixlr_-o.x(),iylr_-o.y() -1);
+ painter_.drawLine(ixlr_-o.x(),iylr_-o.y(),ixul_-o.x()-1,iylr_-o.y() );
+ painter_.drawLine(ixul_-o.x(),iylr_-o.y(),ixul_-o.x(),iyul_-o.y()-1 );
+ ixlr_ = e->pos().x();
+ iylr_ = e->pos().y();
+ painter_.drawLine(ixul_-o.x(),iyul_-o.y(),ixlr_-o.x()-1,iyul_-o.y());
+ painter_.drawLine(ixlr_-o.x(),iyul_-o.y(),ixlr_-o.x(),iylr_ -o.y()-1);
+ painter_.drawLine(ixlr_-o.x(),iylr_-o.y(),ixul_-o.x()-1,iylr_-o.y() );
+ painter_.drawLine(ixul_-o.x(),iylr_-o.y(),ixul_-o.x(),iyul_-o.y()-1 );
+ painter_.setRasterOp (Qt::CopyROP);
+ }
+ emit mouseMoved (p, e->state(), m);
+}
+
+void TeQtCanvas::contentsMouseReleaseEvent( QMouseEvent* e)
+{
+ if (!pixmap0_)
+ return;
+ QPoint m = e->pos();
+ TeCoord2D p = mapVtoW(m);
+ if (down_)
+ {
+ ixlr_ = e->pos().x();
+ iylr_ = e->pos().y();
+ xlr_ = p.x();
+ ylr_ = p.y();
+ if(xul_ > xlr_)
+ {
+ double a = xlr_;
+ xlr_ = xul_;
+ xul_ = a;
+ }
+ if(ylr_ > yul_)
+ {
+ double a = ylr_;
+ ylr_ = yul_;
+ yul_ = a;
+ }
+ down_ = false;
+ }
+ emit mouseReleased (p, e->state(), m);
+}
+
+void TeQtCanvas::contentsMouseDoubleClickEvent ( QMouseEvent* e)
+{
+ if (!pixmap0_)
+ return;
+
+ QPoint m = e->pos();
+ TeCoord2D p = mapVtoW(m);
+
+ if(e->button() == LeftButton)
+ emit mouseDoublePressed (p, e->state(), m);
+}
+
+
+void TeQtCanvas::contentsContextMenuEvent( QContextMenuEvent* e)
+{
+// popupCanvas_->exec(QCursor::pos());
+ QMouseEvent *m = (QMouseEvent *)e;
+ emit popupCanvasSignal(m);
+}
+
+
+void TeQtCanvas::leaveEvent ( QEvent * )
+{
+ emit mouseLeave();
+}
+
+void TeQtCanvas::keyPressEvent (QKeyEvent* e)
+{
+ emit keyPressed(e);
+}
+
+void TeQtCanvas::keyReleaseEvent (QKeyEvent* e)
+{
+ emit keyReleased(e);
+}
+
+void TeQtCanvas::viewportPaintEvent (QPaintEvent*)
+{
+ copyPixmapToWindow ();
+ emit paintEvent ();
+}
+
+void TeQtCanvas::resizeEvent ( QResizeEvent * e)
+{
+// viewport()->resize(e->size());
+ QScrollView::resizeEvent(e);
+}
+
+void TeQtCanvas::copyPixmapToWindow()
+{
+ if (pixmap0_)
+ {
+ int cx = contentsX();
+ int cy = contentsY();
+ bitBlt (viewport(),0,0,pixmap0_,cx,cy,width_-cx,height_-cy,CopyROP,true);
+ }
+}
+
+double TeQtCanvas::mapVtoData (int pixels)
+{
+ TeBox dbox = getDataWorld();
+ double dwidth = dbox.width();
+ int width = viewport()->width();
+
+ double d = (double)pixels * dwidth / (double)width;
+ return d;
+}
+
+int TeQtCanvas::mapDatatoV (double a)
+{
+ TeBox dbox = getDataWorld();
+ double dwidth = dbox.width();
+ int pwidth = viewport()->width();
+
+ int d = (int)((double)pwidth * a / (double)dwidth);
+ return d;
+}
+
+TeBox
+TeQtCanvas::getPieBarBox(TeThemeApplication* theme)
+{
+ TeBox boxOut;
+
+ if(theme->chartAttributes_.size() == 0)
+ return boxOut;
+
+ string objectId = theme->chartSelected_;
+
+ string TS = theme->collectionTable();
+ string sel = "SELECT * FROM " + TS + " WHERE ";
+
+/* if(theme->chartObjects() == TeSelectedByPointing)
+ sel += TS + ".sel_by_pointing = 1 AND ";
+ else if(theme->chartObjects() == TeNotSelectedByPointing)
+ sel += TS + ".sel_by_pointing = 0 AND ";
+ else if(theme->chartObjects() == TeSelectedByQuery)
+ sel += TS + ".sel_by_query = 1 AND ";
+ else if(theme->chartObjects() == TeNotSelectedByQuery)
+ sel += TS + ".sel_by_query = 0 AND ";
+ else if(theme->chartObjects() == TeGrouped)
+ sel += TS + ".c_legend_id <> 0 AND ";
+ else if(theme->chartObjects() == TeNotGrouped)
+ sel += TS + ".c_legend_id = 0 AND ";
+*/
+ sel += TS + ".c_object_id = '" + objectId + "'";
+
+ TeDatabasePortal *portal = theme->layer()->database()->getPortal();
+ if (!portal)
+ return false;
+
+ if (!portal->query(sel) || !portal->fetchRow())
+ {
+ delete portal;
+ return boxOut;
+ }
+
+ setDataProjection(theme->layer()->projection());
+
+ double width = theme->barWidth();
+ double maxh = theme->barMaxHeight();
+ double minh = theme->barMinHeight();
+ double maxd = theme->pieMaxDiameter();
+ double mind = theme->pieMinDiameter();
+ double diameter = theme->pieDiameter();
+
+
+ if(theme->keepDimension() != 0)
+ {
+ width = mapVtoData((int)width);
+ maxh = mapVtoData((int)maxh);
+ minh = mapVtoData((int)minh);
+ maxd = mapVtoData((int)maxd);
+ mind = mapVtoData((int)mind);
+ diameter = mapVtoData((int)diameter);
+ }
+
+ unsigned int i;
+
+ TeChartType chartType = (TeChartType)theme->chartType();
+ if(chartType == TePieChart)
+ {
+ double delta = diameter / 2.;
+ if(!(theme->pieDimAttribute() == "NONE"))
+ delta = maxd / 2.;
+
+ string attrs;
+ for(i=0; i<theme->chartAttributes_.size(); i++)
+ attrs += theme->chartAttributes_[i] + ",";
+ attrs += "label_x,label_y";
+ if(!(theme->pieDimAttribute() == "NONE"))
+ attrs += "," + theme->pieDimAttribute();
+
+ string q = "SELECT " + attrs + theme->sqlFrom() + " WHERE " + TS + ".c_object_id = '" + objectId + "'";
+ portal->freeResult();
+ if(portal->query(q))
+ {
+ if(portal->fetchRow())
+ {
+ double tot = 0.;
+ for(i=0; i<theme->chartAttributes_.size(); i++)
+ {
+ string v = portal->getData(i);
+ if(v.empty())
+ {
+ delete portal;
+ return boxOut;
+ }
+ tot += atof(v.c_str());
+ }
+ if(tot == 0.)
+ {
+ delete portal;
+ return boxOut;
+ }
+
+ if(!(theme->pieDimAttribute() == "NONE"))
+ {
+ if(theme->chartMaxVal() - theme->chartMinVal() == 0)
+ diameter = 0.;
+ else
+ {
+ double adim = portal->getDouble(theme->chartAttributes_.size()+2);
+ double a = (adim - theme->chartMinVal()) / (theme->chartMaxVal() - theme->chartMinVal());
+ diameter = a * (maxd - mind) + mind;
+ }
+ }
+ double x = theme->chartPoint_.x();
+ double y = theme->chartPoint_.y();
+ boxOut.x1_ = x - diameter / 2.;
+ boxOut.y1_ = y - diameter / 2.;
+ boxOut.x2_ = x + diameter / 2.;
+ boxOut.y2_ = y + diameter / 2.;
+ }
+ }
+ }
+ else
+ {
+ double n = theme->chartAttributes_.size();
+ double maxv = theme->chartMaxVal();
+ double minv = theme->chartMinVal();
+
+ string attrs;
+ for(i=0; i<theme->chartAttributes_.size(); i++)
+ attrs += theme->chartAttributes_[i] + ",";
+ attrs += "label_x,label_y";
+
+ string q = "SELECT " + attrs + theme->sqlFrom() + " WHERE " + TS + ".c_object_id = '" + objectId + "'";
+
+ vector<double> dvec;
+ portal->freeResult();
+ if(portal->query(q))
+ {
+ if(portal->fetchRow())
+ {
+ double x = theme->chartPoint_.x();
+ double xmin = x - n * width / 2.;
+ double xmax = x + n * width / 2.;
+ double y = theme->chartPoint_.y();
+
+ dvec.clear();
+ for(i=0; i<theme->chartAttributes_.size(); i++)
+ {
+ string val = portal->getData(i);
+ if(val.empty())
+ {
+ delete portal;
+ return boxOut;
+ }
+ dvec.push_back(atof(val.c_str()));
+ }
+
+ double mheight = -10;
+ for(i=0; i<dvec.size(); i++)
+ {
+ double height;
+ double v = dvec[i];
+ if(maxv - minv == 0)
+ height = 0.;
+ else
+ height = (v - minv) * (maxh - minh) / (maxv - minv) + minh;
+ mheight = MAX(height, mheight);
+ }
+ boxOut.x1_ = xmin;
+ boxOut.y1_ = y;
+ boxOut.x2_ = xmax;
+ boxOut.y2_ = y + mheight;
+ }
+ }
+ }
+ delete portal;
+ return boxOut;
+}
+
+
diff --git a/src/terralib/application/qt/TeQtCanvas.h b/src/terralib/application/qt/TeQtCanvas.h
new file mode 100644
index 0000000..993301e
--- /dev/null
+++ b/src/terralib/application/qt/TeQtCanvas.h
@@ -0,0 +1,118 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTCANVAS_H
+#define __TERRALIB_INTERNAL_QTCANVAS_H
+
+#include "TeQtBasicCanvas.h"
+#include "TeThemeApplication.h"
+//#include <qscrollview.h>
+#include <qpopupmenu.h>
+#include <qpixmap.h>
+
+/**
+ *@author R Cartaxo
+ */
+
+//class TeQtCanvas : public QScrollView ,public TeQtBasicCanvas {
+class TeQtCanvas : public TeQtBasicCanvas {
+ Q_OBJECT
+public:
+ enum CursorMode { Pointer, Area, Pan, Hand, SizeVer, SizeBDiag, UpArrow, Edit, Distance, Information, ZoomIn, ZoomOut };
+
+// Initialization
+ TeQtCanvas(QWidget *parent=0, const char *name=0);
+ ~TeQtCanvas();
+
+ void setMode (CursorMode);
+ void initCursorArea (QPoint p);
+ TeBox getCursorBox (){ return TeBox (xul_,ylr_,xlr_,yul_); }
+
+ void copyPixmapToWindow();
+
+ void setView(int w = 0, int h = 0, QPaintDevice *pd = 0);
+ void clear();
+ void clear(TeBox box);
+ void clearAll();
+ void clearAll(TeBox box);
+ CursorMode getCursorMode() { return cursorMode_;}
+// void drawTextTT (int x, int y, string &str, double angle = 0.);
+ double mapVtoData (int);
+ int mapDatatoV (double);
+ TeBox getPieBarBox(TeThemeApplication* theme);
+ QPopupMenu* popupCanvas() { return popupCanvas_; }
+// scrollbar offset
+ QPoint offset () {return QPoint(contentsX(), contentsY());}
+
+signals:
+ void mousePressed (TeCoord2D&, int, QPoint&);
+ void mouseDoublePressed (TeCoord2D&, int, QPoint&);
+ void mouseRightButtonPressed (TeCoord2D&, int, QPoint&);
+ void mouseMoved (TeCoord2D&, int, QPoint&);
+ void mouseReleased (TeCoord2D&, int, QPoint&);
+ void mouseLeave ();
+ void paintEvent ();
+ void windowClear();
+ void popupCanvasSignal(QMouseEvent*);
+ void keyPressed(QKeyEvent*);
+ void keyReleased(QKeyEvent*);
+
+protected:
+
+// Mouse events
+ void contentsMousePressEvent( QMouseEvent* );
+ void contentsMouseMoveEvent ( QMouseEvent* );
+ void contentsMouseReleaseEvent ( QMouseEvent* );
+ void contentsMouseDoubleClickEvent ( QMouseEvent* );
+ void contentsContextMenuEvent( QContextMenuEvent* );
+
+// leave Event
+ void leaveEvent ( QEvent * );
+
+// Key events
+ void keyPressEvent ( QKeyEvent*);
+ void keyReleaseEvent ( QKeyEvent*);
+
+// Area Cursor section
+ CursorMode cursorMode_;
+ bool down_;
+ double xul_, // cursor world coordinates
+ xlr_,
+ yul_,
+ ylr_;
+ int ixul_, // cursor screen coordinates
+ ixlr_,
+ iyul_,
+ iylr_;
+
+// Other events
+ void viewportPaintEvent (QPaintEvent* e);
+ void resizeEvent ( QResizeEvent * );
+
+// Mapping correction when scrollbars have been used
+ void correctScrolling (QPoint &p);
+
+// Menu de popup
+ QPopupMenu *popupCanvas_;
+
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtChartItem.cpp b/src/terralib/application/qt/TeQtChartItem.cpp
new file mode 100644
index 0000000..8e986a6
--- /dev/null
+++ b/src/terralib/application/qt/TeQtChartItem.cpp
@@ -0,0 +1,87 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <qpixmap.h>
+#include <qpainter.h>
+#include <TeQtChartItem.h>
+#include <TeQtViewsListView.h>
+
+
+//Chart item constructor
+TeQtChartItem::TeQtChartItem(QListViewItem *parent,
+ QString text, TeColor color)
+ : TeQtCheckListItem(parent, text), color_(color)
+{
+ type_ = CHART;
+ name_ = text.latin1();
+ setRenameEnabled(0,true);
+ setSelected(false);
+ setEnabled(true);
+
+ order_ = parent->childCount();
+
+ //create pixmap
+ int w = 21;
+ int h = 16;
+
+ QPixmap pixmap(w, h);
+ pixmap.resize(w, h);
+ pixmap.fill();
+
+ QPainter p(&pixmap);
+ QBrush brush;
+ QColor qColor;
+
+ qColor.setRgb(color_.red_, color_.green_, color_.blue_);
+ brush.setColor(qColor);
+ brush.setStyle((Qt::BrushStyle)SolidPattern);
+
+ p.fillRect (1, 1, w-2, h-2, brush);
+ p.end();
+
+ setPixmap(0, pixmap);
+}
+
+void TeQtChartItem::changeColor(TeColor color)
+{
+ color_ = color;
+
+ int w = 21;
+ int h = 16;
+
+ QPixmap pixmap(w, h);
+ pixmap.resize(w, h);
+ pixmap.fill();
+
+ QPainter p(&pixmap);
+ QBrush brush;
+ QColor qColor;
+
+ qColor.setRgb(color_.red_, color_.green_, color_.blue_);
+ brush.setColor(qColor);
+ brush.setStyle((Qt::BrushStyle)SolidPattern);
+
+ p.fillRect (1, 1, w-2, h-2, brush);
+ p.end();
+
+ setPixmap(0, pixmap);
+ repaint();
+}
diff --git a/src/terralib/application/qt/TeQtChartItem.h b/src/terralib/application/qt/TeQtChartItem.h
new file mode 100644
index 0000000..7038b03
--- /dev/null
+++ b/src/terralib/application/qt/TeQtChartItem.h
@@ -0,0 +1,63 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTCHARTITEM_H
+#define __TERRALIB_INTERNAL_QTCHARTITEM_H
+
+#include "TeQtCheckListItem.h"
+#include "TeVisual.h"
+
+
+class TeQtChartItem : public TeQtCheckListItem
+{
+public:
+ TeQtChartItem(QListViewItem *parent, QString text, TeColor color);
+
+ ~TeQtChartItem () {}
+
+ TeColor color()
+ { return color_; }
+
+ void changeColor(TeColor color);
+
+ string name() {return name_;}
+
+protected:
+ TeColor color_;
+ string name_;
+};
+
+
+class TeQtChartTitleItem : public TeQtCheckListItem
+{
+public:
+ TeQtChartTitleItem(QListViewItem *parent, QString text)
+ : TeQtCheckListItem(parent, text)
+ {
+ type_ = CHARTTITLE;
+ order_ = parent->childCount();
+ }
+
+ ~TeQtChartTitleItem() {}
+};
+
+
+#endif
diff --git a/src/terralib/application/qt/TeQtCheckListItem.cpp b/src/terralib/application/qt/TeQtCheckListItem.cpp
new file mode 100644
index 0000000..5d0f62b
--- /dev/null
+++ b/src/terralib/application/qt/TeQtCheckListItem.cpp
@@ -0,0 +1,95 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtCheckListItem.h>
+#include <TeUtils.h>
+#include <vector>
+
+
+int TeQtCheckListItem::compare (QListViewItem *i, int col, bool ascending) const
+{
+ int order1 = atoi(key(col, ascending).latin1());
+ int order2 = atoi(i->key(col, ascending).latin1());
+
+ if (order1 < order2)
+ return -1;
+ else if (order1 == order2)
+ return 0;
+ else
+ return 1;
+}
+
+
+QString TeQtCheckListItem::key ( int /* col */, bool /* ascending */ ) const
+{
+ return Te2String(order_).c_str();
+}
+
+
+vector<QListViewItem*> TeQtCheckListItem::getChildren()
+{
+ vector<QListViewItem*> childrenVector;
+
+ QListViewItem *child = firstChild();
+ while (child)
+ {
+ childrenVector.push_back(child);
+ child = child->nextSibling();
+ }
+ return childrenVector;
+}
+
+
+void TeQtCheckListItem::unselectChildren()
+{
+ TeQtCheckListItem *item;
+ int n = childCount();
+ int i = 0;
+
+ if (n == 0)
+ return;
+
+ QListViewItemIterator it(this);
+ ++it;
+ item = (TeQtCheckListItem*)(it.current());
+ while(item)
+ {
+ if (item->parent() == this)
+ {
+ item->setSelected(false);
+ item->repaint();
+ ++i;
+ }
+ if (i == n)
+ break;
+ ++it;
+ item = (TeQtCheckListItem*)(it.current());
+ }
+}
+
+
+bool TeQtCheckListItem::isChild(QListViewItem *item)
+{
+ if (item->parent() == this)
+ return true;
+ else
+ return false;
+}
diff --git a/src/terralib/application/qt/TeQtCheckListItem.h b/src/terralib/application/qt/TeQtCheckListItem.h
new file mode 100644
index 0000000..7d1d7da
--- /dev/null
+++ b/src/terralib/application/qt/TeQtCheckListItem.h
@@ -0,0 +1,72 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTCHECKLISTITEM_H
+#define __TERRALIB_INTERNAL_QTCHECKLISTITEM_H
+
+#include <qlistview.h>
+#include <vector>
+using namespace std;
+
+
+class TeQtCheckListItem : public QCheckListItem
+{
+public:
+ enum ItemType {DATABASE, INFOLAYER, VIEW, THEME, LEGENDTITLE, LEGEND, CHARTTITLE, CHART};
+
+ TeQtCheckListItem(QListView *parent, QString text, QCheckListItem::Type ctype = QCheckListItem::Controller)
+ : QCheckListItem(parent, text, ctype) {}
+
+ TeQtCheckListItem(QListViewItem *parent, QString text, QCheckListItem::Type ctype = QCheckListItem::Controller)
+ : QCheckListItem(parent, text, ctype) {}
+
+ TeQtCheckListItem(QCheckListItem *parent, QString text, QCheckListItem::Type ctype = QCheckListItem::Controller)
+ : QCheckListItem(parent, text, ctype) {}
+
+ virtual ~TeQtCheckListItem() {}
+
+ ItemType getType() {return type_;}
+
+ int order()
+ {return order_;}
+
+ void order(int order)
+ {order_ = order;}
+
+ virtual int compare(QListViewItem * i, int col, bool ascending) const;
+
+ virtual QString key(int column, bool ascending) const;
+
+ vector<QListViewItem*> getChildren();
+
+ void unselectChildren();
+
+ bool isChild(QListViewItem *item);
+
+ void cancelRename(int col) {QListViewItem::cancelRename(col);}
+
+
+protected:
+ ItemType type_;
+ int order_;
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtDatabaseItem.cpp b/src/terralib/application/qt/TeQtDatabaseItem.cpp
new file mode 100644
index 0000000..4d78bd4
--- /dev/null
+++ b/src/terralib/application/qt/TeQtDatabaseItem.cpp
@@ -0,0 +1,40 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <qpixmap.h>
+#include <TeQtDatabaseItem.h>
+#include <images/database.xpm>
+
+
+//Database item constructor
+TeQtDatabaseItem::TeQtDatabaseItem(QListView *parent,
+ QString text, TeDatabase *db)
+ : TeQtCheckListItem(parent,text), db_(db)
+{
+ type_ = DATABASE;
+ QPixmap p(database_xpm);
+ setPixmap(0,p);
+ sortChildItems(0, true);
+ setSelected(false);
+ setEnabled(true);
+}
+
+
diff --git a/src/terralib/application/qt/TeQtDatabaseItem.h b/src/terralib/application/qt/TeQtDatabaseItem.h
new file mode 100644
index 0000000..af25fc0
--- /dev/null
+++ b/src/terralib/application/qt/TeQtDatabaseItem.h
@@ -0,0 +1,51 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTDATABASEITEM_H
+#define __TERRALIB_INTERNAL_QTDATABASEITEM_H
+
+#include <TeQtCheckListItem.h>
+
+class TeDatabase;
+
+
+class TeQtDatabaseItem : public TeQtCheckListItem
+{
+public:
+ TeQtDatabaseItem(QListView *parent, QString text,
+ TeDatabase *db);
+
+ ~TeQtDatabaseItem () {}
+
+ int compare(QListViewItem * i, int col, bool ascending) const
+ { return QListViewItem::compare(i, col, ascending); }
+
+ QString key(int col, bool ascending) const
+ { return QListViewItem::key(col, ascending); }
+
+ TeDatabase* getDatabase()
+ {return db_;}
+
+protected:
+ TeDatabase *db_;
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtDatabasesListView.cpp b/src/terralib/application/qt/TeQtDatabasesListView.cpp
new file mode 100644
index 0000000..cc07859
--- /dev/null
+++ b/src/terralib/application/qt/TeQtDatabasesListView.cpp
@@ -0,0 +1,270 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtDatabasesListView.h>
+#include <TeQtCheckListItem.h>
+#include <TeQtDatabaseItem.h>
+#include <TeQtLayerItem.h>
+#include <qpopupmenu.h>
+
+
+TeQtDatabasesListView::TeQtDatabasesListView(QWidget *parent, const char *name)
+ : QListView(parent, name)
+{
+ currentDatabaseItem_ = 0;
+ currentLayerItem_ = 0;
+ rightMouseWasClicked_ = false;
+
+ setSelectionMode(QListView::Multi);
+ setRootIsDecorated( TRUE );
+
+ popupDatabase_ = new QPopupMenu(this);
+ popupLayer_ = new QPopupMenu(this);
+ popupOutItem_ = new QPopupMenu(this);
+
+ // rename action
+ setDefaultRenameAction(QListView::Accept);
+
+ connect(this,SIGNAL(clicked(QListViewItem*)),
+ this,SLOT(clicked(QListViewItem*)));
+ connect(this,SIGNAL(contextMenuRequested(QListViewItem*,const QPoint&, int)),
+ this,SLOT(contextMenuRequested(QListViewItem*,const QPoint&, int)));
+}
+
+
+TeQtDatabasesListView::~TeQtDatabasesListView()
+{
+ if (popupDatabase_)
+ delete popupDatabase_;
+ if (popupLayer_)
+ delete popupLayer_;
+ if (popupOutItem_)
+ delete popupOutItem_;
+}
+
+
+void TeQtDatabasesListView::selectItem(QListViewItem *item)
+{
+ clicked(item);
+}
+
+
+void TeQtDatabasesListView::selectLayerItem(TeLayer *layer)
+{
+ if (layer == 0)
+ return;
+
+ QListViewItem *item;
+ TeQtCheckListItem *checkListItem;
+ TeQtLayerItem *layerItem;
+ TeQtDatabaseItem *dbItem;
+
+ unselectAllItems();
+ QListViewItemIterator it(this);
+ item = it.current();
+ while(item)
+ {
+ checkListItem = (TeQtCheckListItem*)item;
+ if (checkListItem->getType() == TeQtCheckListItem::INFOLAYER)
+ {
+ layerItem = (TeQtLayerItem*)item;
+ if (layerItem->getLayer() == layer)
+ {
+ if (layerItem == currentLayerItem_)
+ break;
+ else
+ {
+ item->setSelected(true);
+ item->repaint();
+ currentLayerItem_ = layerItem;
+
+ dbItem = (TeQtDatabaseItem*)item->parent();
+ dbItem->setSelected(true);
+ dbItem->repaint();
+ currentDatabaseItem_ = dbItem;
+ emit itemChanged(item);
+ return;
+ }
+ }
+ }
+ it++;
+ item = it.current();
+ }
+}
+
+
+void TeQtDatabasesListView::removeItem(QListViewItem *item)
+{
+ TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+
+ if(checkListItem->getType() == TeQtCheckListItem::DATABASE)
+ {
+ TeQtDatabaseItem* dbItem = (TeQtDatabaseItem*)item;
+
+ vector<QListViewItem*> childrenVector;
+ childrenVector = dbItem->getChildren();
+
+ unsigned int i;
+ TeQtLayerItem *layerItem;
+ for (i = 0; i < childrenVector.size(); ++i)
+ {
+ layerItem = (TeQtLayerItem*)childrenVector[i];
+ delete layerItem;
+ }
+
+ if (currentDatabaseItem_ == dbItem)
+ {
+ currentDatabaseItem_ = 0;
+ currentLayerItem_ = 0;
+ }
+ delete dbItem;
+ }
+ else
+ {
+ // item is a layer
+ TeQtLayerItem *layerItem = (TeQtLayerItem*)item;
+ if (currentLayerItem_ == layerItem)
+ currentLayerItem_ = 0;
+ delete layerItem;
+ }
+}
+
+
+void TeQtDatabasesListView::clicked(QListViewItem *item)
+{
+ unselectAllItems();
+ if (item == 0 || rightMouseWasClicked_ == true)
+ {
+ if (currentDatabaseItem_ != 0)
+ {
+ currentDatabaseItem_->setSelected(true);
+ currentDatabaseItem_->repaint();
+ }
+
+ if (currentLayerItem_ != 0)
+ {
+ currentLayerItem_->setSelected(true);
+ currentLayerItem_->repaint();
+ }
+
+ rightMouseWasClicked_ = false;
+ return;
+ }
+
+ TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+ if (checkListItem->getType() == TeQtCheckListItem::DATABASE)
+ {
+ item->setSelected(true);
+ item->repaint();
+
+ TeQtDatabaseItem* dbItem = (TeQtDatabaseItem*)item;
+ if (dbItem != currentDatabaseItem_)
+ {
+ currentDatabaseItem_ = dbItem;
+ currentLayerItem_ = 0;
+ emit itemChanged(item);
+ }
+ else
+ {
+ if (currentLayerItem_ != 0)
+ {
+ currentLayerItem_->setSelected(true);
+ currentLayerItem_->repaint();
+ }
+ }
+ }
+ else if(checkListItem->getType() == TeQtCheckListItem::INFOLAYER)
+ {
+ item->parent()->setSelected(true);
+ item->parent()->repaint();
+ item->setSelected(true);
+ item->repaint();
+
+ TeQtDatabaseItem *dbItem = (TeQtDatabaseItem*)item->parent();
+ if (currentDatabaseItem_ != dbItem)
+ {
+ currentDatabaseItem_ = dbItem;
+ emit itemChanged(item->parent());
+ }
+
+ TeQtLayerItem* layerItem = (TeQtLayerItem*)item;
+ if (layerItem != currentLayerItem_)
+ {
+ currentLayerItem_ = layerItem;
+ emit itemChanged(item);
+ }
+ }
+}
+
+
+void TeQtDatabasesListView::contextMenuRequested(QListViewItem *item, const QPoint&, int)
+{
+ popupItem_ = (TeQtCheckListItem*)item;
+
+ unselectAllItems();
+ if (currentDatabaseItem_)
+ {
+ currentDatabaseItem_->setSelected(true);
+ currentDatabaseItem_->repaint();
+ }
+
+ if (currentLayerItem_)
+ {
+ currentLayerItem_->setSelected(true);
+ currentLayerItem_->repaint();
+ }
+
+ emit popupSignal();
+}
+
+
+void TeQtDatabasesListView::contentsMousePressEvent(QMouseEvent *e)
+{
+ if (e->button() == Qt::RightButton)
+ {
+ rightMouseWasClicked_ = true;
+ popupDatabase_->move(e->globalPos().x(), e->globalPos().y());
+ popupLayer_->move(e->globalPos().x(), e->globalPos().y());
+ popupOutItem_->move(e->globalPos().x(), e->globalPos().y());
+ }
+ QListView::contentsMousePressEvent(e);
+}
+
+
+void TeQtDatabasesListView::unselectAllItems()
+{
+ QListViewItem *item;
+
+ QListViewItemIterator it(this);
+ item = it.current();
+ while(item)
+ {
+ item->setSelected(false);
+ item->repaint();
+ it++;
+ item = it.current();
+ }
+}
+
+
+
+
+
diff --git a/src/terralib/application/qt/TeQtDatabasesListView.h b/src/terralib/application/qt/TeQtDatabasesListView.h
new file mode 100644
index 0000000..2b29be9
--- /dev/null
+++ b/src/terralib/application/qt/TeQtDatabasesListView.h
@@ -0,0 +1,92 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTDATABASESLISTVIEW_H
+#define __TERRALIB_INTERNAL_QTDATABASESLISTVIEW_H
+
+
+#include <qlistview.h>
+
+class QPopupMenu;
+class TeQtCheckListItem;
+class TeQtDatabaseItem;
+class TeQtLayerItem;
+class TeLayer;
+
+
+class TeQtDatabasesListView : public QListView
+{
+ Q_OBJECT
+
+public:
+ TeQtDatabasesListView(QWidget *parent = 0, const char *name = 0);
+
+ ~TeQtDatabasesListView();
+
+ TeQtDatabaseItem* currentDatabaseItem()
+ { return currentDatabaseItem_; }
+
+ TeQtLayerItem* currentLayerItem()
+ { return currentLayerItem_; }
+
+ TeQtCheckListItem *popupItem()
+ { return popupItem_; }
+
+ QPopupMenu* popupDatabase()
+ { return popupDatabase_; }
+
+ QPopupMenu* popupLayer()
+ { return popupLayer_; }
+
+ QPopupMenu* popupOutItem()
+ { return popupOutItem_; }
+
+ void selectItem(QListViewItem *item);
+
+ void selectLayerItem(TeLayer *layer);
+
+ void removeItem(QListViewItem *item);
+
+signals:
+ void itemChanged(QListViewItem*);
+ void popupSignal();
+
+protected slots:
+ void clicked(QListViewItem *item);
+ void contextMenuRequested(QListViewItem*, const QPoint&, int);
+
+protected:
+ TeQtDatabaseItem *currentDatabaseItem_;
+ TeQtLayerItem *currentLayerItem_;
+ bool rightMouseWasClicked_;
+ TeQtCheckListItem *popupItem_;
+ QPopupMenu *popupDatabase_;
+ QPopupMenu *popupLayer_;
+ QPopupMenu *popupOutItem_;
+
+ void contentsMousePressEvent(QMouseEvent *e);
+
+ void unselectAllItems();
+};
+
+
+#endif
+
diff --git a/src/terralib/application/qt/TeQtGraph.cpp b/src/terralib/application/qt/TeQtGraph.cpp
new file mode 100644
index 0000000..836266b
--- /dev/null
+++ b/src/terralib/application/qt/TeQtGraph.cpp
@@ -0,0 +1,284 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtGraph.h>
+#include <TeCoord2D.h>
+#include <qpaintdevicemetrics.h>
+#include <qprinter.h>
+
+TeQtGraphPlot::TeQtGraphPlot (QWidget *parent, const char * /* name */)
+{
+ QPaintDevice* dev = painter_.device();
+ if(dev)
+ painter_.end();
+
+// Build a new pixmap
+ widget_ = parent;
+ QPaintDeviceMetrics pdm( widget_ );
+ pixmap_ = new QPixmap (pdm.width(), pdm.height());
+ pixmap_->fill(widget_->paletteBackgroundColor());
+
+ if(dev)
+ painter_.end();
+ painter_.begin(pixmap_);
+
+ pwidth_ = pdm.width();
+ pheight_ = pdm.height();
+
+ //Mounting the brushStyleMap
+ brushStyleMap_[TePolyTypeTransparent] = Qt::NoBrush;
+ brushStyleMap_[TePolyTypeFill] = Qt::SolidPattern;
+ brushStyleMap_[TePolyTypeHorizontal] = Qt::HorPattern;
+ brushStyleMap_[TePolyTypeVertical] = Qt::VerPattern;
+ brushStyleMap_[TePolyTypeFDiagonal] = Qt::FDiagPattern;
+ brushStyleMap_[TePolyTypeBDiagonal] = Qt::BDiagPattern;
+ brushStyleMap_[TePolyTypeCross] = Qt::CrossPattern;
+ brushStyleMap_[TePolyTypeDiagonalCross] = Qt::DiagCrossPattern;
+
+ //Mounting the penStyleMap
+ penStyleMap_[TeLnTypeContinuous] = Qt::SolidLine;
+ penStyleMap_[TeLnTypeDashed] = Qt::DashLine;
+ penStyleMap_[TeLnTypeDotted] = Qt::DotLine;
+ penStyleMap_[TeLnTypeDashDot] = Qt::DashDotLine;
+ penStyleMap_[TeLnTypeDashDotDot] = Qt::DashDotDotLine;
+ penStyleMap_[TeLnTypeNone] = Qt::NoPen;
+
+ QString family;
+#ifdef WIN32
+ family = "Verdana";
+#else
+ family = "Sans";
+#endif
+ QFont font(family);
+ font.setPointSize(10);
+ font.setBold(true);
+ painter_.setFont(font);
+}
+
+TeQtGraphPlot::~TeQtGraphPlot ()
+{
+ if(painter_.device())
+ painter_.end();
+
+ delete pixmap_;
+}
+
+void TeQtGraphPlot::resize (int w, int h)
+{
+ if(painter_.device())
+ painter_.end();
+ delete pixmap_;
+
+ pwidth_ = w;
+ pheight_ = h;
+ pixmap_ = new QPixmap (w, h);
+ pixmap_->fill(widget_->paletteBackgroundColor());
+ painter_.begin(pixmap_);
+}
+
+void TeQtGraphPlot::plot ()
+{
+ plotOnPixmap();
+ polygonBrush_ = QBrush(Qt::white);
+ fillRectangle (0, 0, pwidth_, pheight_);
+ plotCurves ();
+ copyPixmapToWindow();
+}
+
+int TeQtGraphPlot::getWidth ()
+{
+ return pwidth_;
+}
+
+int TeQtGraphPlot::getHeight ()
+{
+ return pheight_;
+}
+
+void TeQtGraphPlot::setLineAttributes(TeColor c, int /* s */, int w)
+{
+ QColor cor(c.red_, c.green_, c.blue_);
+ linePen_.setColor (cor);
+ linePen_.setStyle(penStyleMap_[(TeLnBasicType)TeLnTypeContinuous]);
+ linePen_.setWidth(w);
+}
+
+void TeQtGraphPlot::setFillAreaColor (TeColor c)
+{
+ QColor cor(c.red_, c.green_, c.blue_);
+ polygonBrush_.setColor (cor);
+ polygonBrush_.setStyle(brushStyleMap_[(TePolyBasicType)TePolyTypeFill]);
+}
+
+void TeQtGraphPlot::setTextColor (TeColor c)
+{
+ QColor cor(c.red_, c.green_, c.blue_);
+ textPen_.setColor (cor);
+}
+
+void TeQtGraphPlot::fillRectangle (int x, int y, int dx, int dy)
+{
+ painter_.fillRect (x,y,dx,dy,polygonBrush_);
+}
+
+void TeQtGraphPlot::drawRectangle (int x, int y, int dx, int dy)
+{
+ painter_.setPen(linePen_);
+ painter_.moveTo(x,y);
+ painter_.lineTo(x+dx,y);
+ painter_.lineTo(x+dx,y+dy);
+ painter_.lineTo(x,y+dy);
+ painter_.lineTo(x,y);
+}
+
+void TeQtGraphPlot::drawLine (int sx, int sy, int dx, int dy)
+{
+ painter_.setPen(linePen_);
+ painter_.drawLine (sx,sy,dx,dy);
+}
+
+void TeQtGraphPlot::drawText (int x, int y, char* t, double angle)
+{
+ painter_.setPen(textPen_);
+
+ if(angle != 0)
+ {
+ painter_.save();
+ painter_.translate(x, y);
+ painter_.rotate(-angle);
+ painter_.drawText(0, 0, t);
+ painter_.restore();
+ }
+ else
+ painter_.drawText(x, y, t);
+}
+
+void TeQtGraphPlot::fillArc (int xc, int yc, int w, int h, double a1, double a2, TeColor c)
+{
+ QColor cor(c.red_, c.green_, c.blue_);
+ painter_.setBrush(cor);
+ painter_.drawPie (xc,yc,w,h,(int)(a1*16),(int)((a2-a1)*16));
+}
+
+void TeQtGraphPlot::drawArc (int xc, int yc, int w, int h, double a1, double a2, TeColor c)
+{
+ QColor cor(c.red_, c.green_, c.blue_);
+ painter_.setBrush(cor);
+ painter_.drawArc (xc,yc,w,h,(int)(a1*16),(int)((a2-a1)*16));
+}
+
+void TeQtGraphPlot::copyPixmapToWindow ()
+{
+ if (pixmap_)
+ bitBlt (widget_,0,0,pixmap_,0,0,pwidth_,pheight_,Qt::CopyROP,true);
+}
+
+void TeQtGraphPlot::copyPixmapToWindow(int ulx, int uly, int w, int h)
+{
+ if (pixmap_)
+ bitBlt (widget_,ulx,uly,pixmap_,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtGraphPlot::plotOnWindow ()
+{
+ QPaintDevice* dev = painter_.device();
+ if(dev == widget_)
+ return;
+ if(dev)
+ painter_.end();
+ painter_.begin(widget_);
+}
+
+void TeQtGraphPlot::plotOnPixmap ()
+{
+ QPaintDevice* dev = painter_.device();
+ if(dev == pixmap_)
+ return;
+ if(dev)
+ painter_.end();
+ painter_.begin(pixmap_);
+}
+
+TePlotWidget::TePlotWidget(QWidget *parent, const char *name):TeQtGraphPlot(parent,name)
+{
+ widget_ = parent;
+}
+
+void TePlotWidget::plot ()
+{
+ TeQtGraphPlot::plot ();
+}
+
+
+void TePlotWidget::erase( int order)
+{
+ kill (order);
+ plot ();
+}
+
+void TeQtGraphPlot::plotRectangle (int x, int y, int dx, int dy)
+{
+ painter_.setPen(linePen_);
+ painter_.moveTo(x,y);
+ painter_.lineTo(x+dx,y);
+ painter_.lineTo(x+dx,y+dy);
+ painter_.lineTo(x,y+dy);
+ painter_.lineTo(x,y);
+}
+
+void TeQtGraphPlot::value_to_pixel(double px, double py, int* x, int* y)
+{
+ TeGraphPlot::value_to_pixel(px, py, x, y);
+}
+
+void TeQtGraphPlot::copyPixmapToPrinter()
+{
+ if (pixmap_)
+ {
+ QPrinter printer;
+ if (printer.setup())
+ {
+ QPainter p(&printer);
+
+ QPaintDevice* dev = painter_.device();
+ if(dev == pixmap_)
+ painter_.end();
+
+ p.drawPixmap(0, 0, *pixmap_);
+ p.flush();
+ p.end();
+
+ if(dev && painter_.device() == 0)
+ painter_.begin(dev);
+ }
+ }
+}
+
+void TeQtGraphPlot::textExtent (string &str, int &w, int &h, double /* angle */)
+{
+ QFont font = painter_.font();
+ QFontMetrics fm(font);
+
+ w = fm.width(str.c_str());
+ h = fm.height();
+
+ //?????????????????? fazer codigo......
+}
diff --git a/src/terralib/application/qt/TeQtGraph.h b/src/terralib/application/qt/TeQtGraph.h
new file mode 100644
index 0000000..b14a606
--- /dev/null
+++ b/src/terralib/application/qt/TeQtGraph.h
@@ -0,0 +1,83 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTGRAPH_H
+#define __TERRALIB_INTERNAL_QTGRAPH_H
+
+#include <qwidget.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include "TeGraph.h"
+
+class TeQtGraphPlot : public TeGraphPlot
+{
+public :
+ TeQtGraphPlot (QWidget *parent=0, const char *name=0);
+ ~TeQtGraphPlot ();
+ virtual void plot ();
+ void plotRectangle (int x, int y, int dx, int dy);
+ void value_to_pixel(double px, double py, int* x, int* y);
+ int pwidth_;
+ int pheight_;
+ int getWidth ();
+ int getHeight ();
+ QPixmap* getPixmap() {return pixmap_;}
+ QWidget* widget_;
+ void plotOnWindow();
+ void plotOnPixmap();
+ void copyPixmapToWindow();
+ void copyPixmapToWindow(int, int, int, int);
+ void copyPixmapToPrinter();
+ void setLineAttributes (TeColor c, int , int );
+ void setFillAreaColor (TeColor c);
+ void setTextColor (TeColor c);
+ void fillRectangle (int x, int y, int dx, int dy);
+ void drawRectangle (int x, int y, int dx, int dy);
+ void drawLine (int sx, int sy, int dx, int dy);
+ void drawText (int x, int y, char*t, double angle = 0);
+ void fillArc (int xc, int yc, int w, int h, double a1, double a2, TeColor c);
+ void drawArc (int xc, int yc, int w, int h, double a1, double a2, TeColor c);
+ void textExtent ( string &str, int &w, int &h, double angle = 0.);
+ void resize(int, int);
+
+private :
+ QPainter painter_;
+ QPixmap* pixmap_;
+ QPen linePen_;
+ QColor lineColor_;
+ QBrush polygonBrush_;
+ QColor polygonColor_;
+ QPen textPen_;
+ map<TePolyBasicType, Qt::BrushStyle> brushStyleMap_;
+ map<TeLnBasicType, Qt::PenStyle> penStyleMap_;
+};
+
+class TePlotWidget : public TeQtGraphPlot {
+public:
+
+// Initialization
+ TePlotWidget(QWidget *parent=0, const char *name=0);
+ ~TePlotWidget() {}
+ void erase (int order = 0);
+ void plot ();
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtGrid.cpp b/src/terralib/application/qt/TeQtGrid.cpp
new file mode 100644
index 0000000..038f1f2
--- /dev/null
+++ b/src/terralib/application/qt/TeQtGrid.cpp
@@ -0,0 +1,2765 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+************************************************************************************/
+#include "TeQtGrid.h"
+#include "TeWaitCursor.h"
+#include "TeApplicationUtils.h"
+#include <qtable.h>
+#include <qcolordialog.h>
+#include <qmessagebox.h>
+#include <qapplication.h>
+#include <qdragobject.h>
+#include <algorithm>
+
+TeQtGrid::TeQtGrid(QWidget* parent, const char* name)
+ : QTable(parent, name)
+{
+ autoPromote_ = true;
+ gridX_ = -1;
+ gridY_ = -1;
+ iLine_ = -1;
+ fLine_ = -1;
+ iCol_ = -1;
+ fCol_ = -1;
+ gridWidth_ = -1;
+ gridHeight_ = -1;
+ portal_ = 0;
+ doRepaint_ = true;
+ doRefresh_ = false;
+ shiftKeyPressed_ = false;
+ lastLinePressed_ = -1;
+ verticalEdition_ = true;
+ rowToEdit_ = -1;
+ colToEdit_ = -1;
+ editing_ = false;
+ showGridInformation_ = true;
+ columnDragEnabled_ = false;
+ mousePressedOnHorizontalHeader_ = false;
+
+ setNumCols(0);
+ setNumRows(0);
+ setSelectionMode(QTable::Multi);
+
+ popupHorizHeader_ = new QPopupMenu;
+ popupVertHeader_ = new QPopupMenu;
+ popupViewport_ = new QPopupMenu;
+
+ horizontalHeader()->setAcceptDrops(true);
+
+ verticalHeader()->installEventFilter(this);
+ horizontalHeader()->installEventFilter(this);
+
+ connect(verticalHeader(), SIGNAL(released(int)),
+ this, SLOT(mouseReleasedOnVerticalHeaderSlot(int))); // NOTE: QT send the pressed position in your argument
+
+ verticalHeader()->setResizeEnabled(false);
+}
+
+
+TeQtGrid::~TeQtGrid()
+{
+ if (portal_)
+ {
+ delete portal_;
+ portal_ = 0;
+ }
+ if (popupHorizHeader_)
+ delete popupHorizHeader_;
+ if (popupVertHeader_)
+ delete popupVertHeader_;
+ if (popupViewport_)
+ delete popupViewport_;
+}
+
+
+void TeQtGrid::init (TeThemeApplication *theme)
+{
+ int i, j, numRows, nCols, gs;
+ int collectionNumCols = 0;
+ char buf[20];
+ string oid, uid;
+ hide();
+ clear();
+
+ if (theme == 0)
+ return;
+
+ TeAttrTableVector attrTables;
+ theme->getAttTables(attrTables);
+
+ if (attrTables.size() == 0)
+ return;
+
+ TeWaitCursor wait;
+
+ theme_ = theme;
+ CT_ = theme->collectionTable();
+ CTE_ = theme->collectionAuxTable();
+ db_ = theme_->layer()->database();
+
+ sqlJoin_ = theme_->sqlGridJoin();
+
+ // Mount the vector of indexes (indexName_) from the tables
+ theme_->getAttTables(tableVector_);
+ for (i = 0; i < (int)tableVector_.size(); ++i)
+ {
+ TeTable t = tableVector_[i];
+ if(t.tableType() == TeAttrStatic || t.tableType() == TeAttrEvent)
+ {
+ if(tableVector_[i].linkName().empty())
+ indexVector_.push_back(tableVector_[i].name() + "." + tableVector_[i].uniqueName());
+ else
+ indexVector_.push_back(tableVector_[i].name() + "." + tableVector_[i].linkName());
+ }
+ else if(t.tableType() != TeAttrExternal)
+ {
+ if(tableVector_[i].uniqueName().empty() == false)
+ indexVector_.push_back(tableVector_[i].name() + "." + tableVector_[i].uniqueName());
+ if(tableVector_[i].linkName().empty() == false)
+ indexVector_.push_back(tableVector_[i].name() + "." + tableVector_[i].linkName());
+ }
+ else
+ {
+ if(tableVector_[i].uniqueName().empty() == false)
+ indexVector_.push_back(tableVector_[i].name() + "." + tableVector_[i].uniqueName());
+ if(tableVector_[i].linkName().empty() == false)
+ indexVector_.push_back(tableVector_[i].name() + "." + tableVector_[i].linkName());
+ if(tableVector_[i].relatedAttribute().empty() == false)
+ indexVector_.push_back(tableVector_[i].relatedTableName() + "." + tableVector_[i].relatedAttribute());
+ }
+ }
+
+ TeAttributeList collAttrList;
+ db_->getAttributeList(CT_, collAttrList);
+ collectionNumCols = collAttrList.size();
+
+ if (portal_)
+ delete portal_;
+ portal_= db_->getPortal();
+
+ //read the objects and their legends
+ //from the collection table
+ orderBy_ = CTE_ + ".unique_id ";
+ sql_ = sqlJoin_ + " ORDER BY " + orderBy_ + "ASC ";
+ if (!portal_->query(sql_))
+ {
+ delete portal_;
+ portal_ = 0;
+ wait.resetWaitCursor();
+ return;
+ }
+
+ TeAttributeList extAttList;
+ db_->getAttributeList(CTE_, extAttList);
+
+ TeAttributeList attrList = portal_->AttributeList();
+ uniqueIdPos_ = attrList.size() - 2;
+ objectIdPos_ = attrList.size() - extAttList.size() - 6;
+ gridStatusPos_ = attrList.size() - 1;
+ resultIdPos_ = attrList.size() - extAttList.size() - 1;
+ i = 0;
+ while (portal_->fetchRow())
+ {
+ uid = portal_->getData(uniqueIdPos_);
+ oid = portal_->getData(objectIdPos_);
+ gs = atoi(portal_->getData(gridStatusPos_));
+
+ if(uid.empty())
+ {
+ unique2ObjectMap_[oid] = oid;
+ ObjectInfo info;
+ info.status_ = atoi(portal_->getData(resultIdPos_));
+ objectMap_[oid] = info;
+ portalRow2UniqueIdVector_.push_back(oid);
+ }
+ else
+ {
+ unique2ObjectMap_[uid] = oid;
+
+ if(objectMap_.find(oid) == objectMap_.end())
+ {
+ ObjectInfo info;
+ info.uniqueMap_[uid] = gs;
+ info.status_ = atoi(portal_->getData(resultIdPos_));
+ objectMap_[oid] = info;
+ }
+ else
+ {
+ objectMap_[oid].uniqueMap_[uid] = gs;
+
+ if(objectMap_[oid].status_ == 0 && gs > 0)
+ objectMap_[oid].status_ = gs;
+ else if(objectMap_[oid].status_ == 1 && gs == 2)
+ objectMap_[oid].status_ = 3;
+ else if(objectMap_[oid].status_ == 2 && gs == 1)
+ objectMap_[oid].status_ = 3;
+ }
+ portalRow2UniqueIdVector_.push_back(uid);
+ }
+ gridToPortalRowVector_.push_back(i);
+ ++i;
+ }
+ numRows = i;
+
+ //get the column names
+
+ nCols = theme->sqlAttList().size();
+ vector<string> colNamesVector;
+ for (j = 0; j < nCols; ++j)
+ colNamesVector.push_back(theme->sqlAttList()[j].rep_.name_);
+
+ doRepaint_ = false; // don�t repaint
+ setNumRows(numRows);
+ setNumCols(nCols);
+
+ for (i = 0; i < nCols; ++i)
+ horizontalHeader()->setLabel(i, colNamesVector[i].c_str());
+
+ // Set the vector that will contain the order the
+ // grid columns will be shown
+ for (i = 0; i < nCols; i++)
+ {
+ gridToPortalColVector_.push_back(i);
+ gridColVisVector_.push_back(true);
+ }
+
+ // Set the minimum width of the vertical header of the grid
+ sprintf(buf, "%d", numRows);
+ int minw = strlen(buf) + 1;
+ if (minw < 3)
+ minw = 3;
+ verticalHeader()->setMinimumWidth(minw*9); // supposing char width of 9 pixels
+ setLeftMargin(minw*9);
+
+
+ doRepaint_ = true; // do repaint
+ doRefresh_ = true; // do refresh
+
+ refresh();
+ int visibleCols = 0;
+ int scVal = horizontalScrollBar()->value();
+ for(i=0; i<numCols(); i++)
+ {
+ if(visibleWidth() < columnPos(i) - scVal)
+ break;
+ visibleCols++;
+ }
+
+ for (i = 0; i < visibleCols; ++i)
+ adjustColumn(i);
+ refresh();
+ emit gridChangedSignal();
+ show();
+ gridInformation();
+}
+
+
+void TeQtGrid::initPortal()
+{
+ TeWaitCursor wait;
+
+ int i, j;
+ int nCols = numCols();
+
+ doRepaint_ = false; // do not repaint
+
+ for (j = 0; j < nCols; ++j)
+ horizontalHeader()->removeLabel(j);
+
+ TeAttributeList collAttrList;
+ db_->getAttributeList(CT_, collAttrList);
+
+ portal_= db_->getPortal();
+
+ //read the objects and their legends
+ //from the collection table
+ if (!portal_->query(sql_))
+ {
+ delete portal_;
+ portal_ = 0;
+ wait.resetWaitCursor();
+ return;
+ }
+
+ TeAttrTableVector cTableVec = tableVector_;
+ tableVector_.clear();
+ theme_->getAttTables(tableVector_);
+
+ TeAttributeList extAttList;
+ db_->getAttributeList(CTE_, extAttList);
+
+ TeAttributeList attrList = portal_->AttributeList();
+ uniqueIdPos_ = attrList.size() - 2;
+ objectIdPos_ = attrList.size() - extAttList.size() - 6;
+ gridStatusPos_ = attrList.size() - 1;
+ resultIdPos_ = attrList.size() - extAttList.size() - 1;
+
+ //get the column names
+ nCols = theme_->sqlAttList().size();
+ vector<string> colNamesVector;
+ for (j = 0; j < nCols; ++j)
+ colNamesVector.push_back(theme_->sqlAttList()[j].rep_.name_);
+
+ setNumCols(nCols);
+
+ arrangeColumns(cTableVec);
+ for(i=0; (unsigned int)i<gridColVisVector_.size(); i++)
+ showColumn(i);
+
+ for (i = 0; i < nCols; ++i)
+ {
+ j = gridToPortalColVector_[i];
+ horizontalHeader()->setLabel(i, colNamesVector[j].c_str());
+ }
+ doRepaint_ = true; // do repaint
+ doRefresh_ = true; // do refresh
+
+ for(i=0; (unsigned int)i<gridColVisVector_.size(); i++)
+ {
+ bool b = gridColVisVector_[i];
+ if(b == false)
+ hideColumn(i);
+ }
+ refresh();
+ int visibleCols = 0;
+ int scVal = horizontalScrollBar()->value();
+ for(i=0; i<numCols(); i++)
+ {
+ if(visibleWidth() < columnPos(i) - scVal)
+ break;
+ visibleCols++;
+ }
+
+ for (i = 0; i < visibleCols; ++i)
+ adjustColumn(i);
+ refresh();
+ emit gridChangedSignal();
+ show();
+ gridInformation();
+}
+
+void TeQtGrid::updatePortalContents()
+{
+ TeWaitCursor wait;
+
+ if (portal_ == 0)
+ {
+ wait.resetWaitCursor();
+ return;
+ }
+
+ portal_->freeResult();
+
+ if (!portal_->query(sql_))
+ {
+ delete portal_;
+ portal_ = 0;
+ }
+}
+
+void TeQtGrid::clear()
+{
+ gridX_ = -1;
+ gridY_ = -1;
+ iLine_ = -1;
+ fLine_ = -1;
+ iCol_ = -1;
+ fCol_ = -1;
+ gridWidth_ = -1;
+ gridHeight_ = -1;
+ rowToEdit_ = -1;
+ colToEdit_ = -1;
+
+ shiftKeyPressed_ = false;
+ lastLinePressed_ = -1;
+
+ gridToPortalRowVector_.clear();
+ gridToPortalColVector_.clear();
+ objectMap_.clear();
+ unique2ObjectMap_.clear();
+ portalRow2UniqueIdVector_.clear();
+ gridColVisVector_.clear();
+ indexVector_.clear();
+ tableVector_.clear();
+
+ if (portal_)
+ {
+ delete portal_;
+ portal_ = 0;
+ }
+ setNumRows(0);
+ setNumCols(0);
+}
+
+void TeQtGrid::clearPortal()
+{
+ if (portal_)
+ {
+ delete portal_;
+ portal_ = 0;
+ }
+}
+
+
+bool TeQtGrid::eventFilter(QObject *o, QEvent *e)
+{
+ if (doRepaint_ == false) // do not repaint
+ return true; // stop event
+ static int stx, sty;
+
+ if(o == horizontalHeader())
+ {
+ QMouseEvent *m = (QMouseEvent *)e;
+ int gridCol = columnAt(m->x() + contentsX());
+ if(portal_)
+ {
+ TeTable table = findTable(gridCol);
+ QString msg = tr("Table:") + " ";
+ msg += table.name().c_str();
+ if(table.tableType() == TeAttrStatic)
+ msg += " - " + tr("Table type: TeAttrStatic");
+ else if(table.tableType() == TeAttrExternal)
+ msg += " " + tr("Table type: TeAttrExternal");
+ else if(table.tableType() == TeAttrEvent)
+ msg += " - " + tr("Table type: TeAttrEvent");
+ else if(table.tableType() == TeFixedGeomDynAttr)
+ msg += " - " + tr("Table type: TeFixedGeomDynAttr");
+ else if(table.tableType() == TeDynGeomDynAttr)
+ msg += " - " + tr("Table type: TeDynGeomDynAttr");
+
+ TeAttributeList AL = portal_->AttributeList();
+ int pcol = gridToPortalColVector_[gridCol];
+ if(AL.size() > (unsigned int)pcol)
+ {
+ msg += " - " + tr("Column:");
+ msg += " ";
+ msg += AL[pcol].rep_.name_.c_str();
+ if(AL[pcol].rep_.type_ == TeSTRING)
+ {
+ msg += " - " + tr("Column type: TeSTRING");
+ msg += " - " + tr("Num char:");
+ msg += " ";
+ msg += Te2String(AL[pcol].rep_.numChar_).c_str();
+ }
+ else if(AL[pcol].rep_.type_ == TeREAL)
+ msg += " " + tr("Column type: TeREAL");
+ else if(AL[pcol].rep_.type_ == TeINT)
+ msg += " - " + tr("Column type: TeINT");
+ else if(AL[pcol].rep_.type_ == TeDATETIME)
+ msg += " - " + tr("Column type: TeDATETIME");
+ if(isIndex(pcol))
+ msg += " - " + tr("Column is not editable");
+ else
+ msg += " - " + tr("Column is editable");
+ }
+
+ displayGridInformation(msg);
+ }
+
+ if (e->type() == QEvent::MouseButtonPress)
+ {
+ stx = sty = -1;
+ if (m->button() == RightButton)
+ {
+ if(gridCol < 0)
+ return false;
+
+ int portalColToPopup = gridToPortalColVector_[gridCol];
+ popupHorizHeader_->move(m->globalPos().x(), m->globalPos().y());
+ emit horizHeaderSignal(portalColToPopup);
+ return true;
+ }
+ if (m->button() == LeftButton)
+ {
+ stx = contentsX();
+ sty = contentsY();
+ if(sty != 0)
+ mousePressedOnHorizontalHeader_ = true;
+ int p = horizontalHeader()->sectionPos(gridCol);
+ int ss = horizontalHeader()->sectionSize(gridCol);
+ int x = m->x() + horizontalHeader()->offset();
+ if(abs(x-p) <= 3 || abs(x-(p+ss)) <= 3)
+ return false;
+ columnDragEnabled_ = true;
+ return false;
+ }
+ }
+ else if(e->type() == QEvent::DragEnter) {
+ QDragEnterEvent *dg = (QDragEnterEvent *)e;
+ dg->accept(QTextDrag::canDecode(dg));
+ return true;
+ }
+ else if(e->type() == QEvent::DragMove) {
+ return true;
+ }
+ else if(e->type() == QEvent::MouseMove) {
+ if (columnDragEnabled_)
+ {
+ columnDragEnabled_ = false;
+ clearSelection(true);
+ setSelectionMode(QTable::NoSelection);
+ string t = "swap:" + Te2String(gridCol);
+ QTextDrag* tDrag = new QTextDrag(t.c_str(), this, "gridswap");
+ tDrag->drag();
+ }
+ return false;
+ }
+ else if(e->type() == QEvent::Drop) {
+ QDragEnterEvent *dg = (QDragEnterEvent *)e;
+ dg->accept(QTextDrag::canDecode(dg));
+ QDropEvent *dp = (QDropEvent *)e;
+
+ QString tx;
+ string dragText;
+ if(QTextDrag::decode(dp, tx))
+ dragText = tx.latin1();
+
+ string fName = dragText;
+ int f = fName.find("-fieldName:");
+ if(f >= 0)
+ {
+ fName.erase(0, f+strlen("-fieldName:"));
+
+ string table = dragText;
+ table.erase(f, table.size()-f);
+ f = table.find("table:", string::npos);
+ if(f == 0)
+ table.erase(0, strlen("table:"));
+
+ int col = columnAt(dg->pos().x() + contentsX());
+ string dropName = horizontalHeader()->label(col).latin1();
+ emit linkTable(table, fName, dropName);
+ }
+ else // swap column
+ {
+ f = fName.find("swap:", string::npos);
+ if(f >= 0)
+ {
+ TeWaitCursor wait;
+ string s = fName;
+ s.erase(0, strlen("swap:"));
+ int col1 = atoi(s.c_str());
+ int col2 = columnAt(dg->pos().x() + contentsX());
+ if(col1 < col2)
+ for(int i=col1; i<col2; i++)
+ swapColumns(i, i+1);
+ else
+ for(int i=col1; i>col2; i--)
+ swapColumns(i, i-1);
+ QPoint p = dg->pos();
+ QMouseEvent* e = new QMouseEvent(QEvent::MouseButtonRelease, p, Qt::LeftButton, Qt::LeftButton);
+ QApplication::postEvent(horizontalHeader(), e);
+ }
+ }
+ return true;
+ }
+ else if (e->type() == QEvent::MouseButtonRelease)
+ {
+ columnDragEnabled_ = false;
+ setSelectionMode(QTable::Multi);
+ if(stx > -1 && sty > -1)
+ setContentsPos(stx, sty);
+ return false;
+ }
+ }
+ else if(o == verticalHeader())
+ {
+ if (e->type() == QEvent::MouseButtonDblClick)
+ {
+ QMouseEvent *m = (QMouseEvent *)e;
+ if (m->button() == LeftButton)
+ {
+ int lin = rowAt(m->y() + contentsY());
+ if (lin >= 0)
+ {
+ int portalRowToPopup = gridToPortalRowVector_[lin];
+ emit vertHeaderLeftDblClickSignal(portalRowToPopup);
+ }
+ }
+ }
+ else if (e->type() == QEvent::MouseButtonPress)
+ {
+ QMouseEvent *m = (QMouseEvent *)e;
+ if (m->button() == LeftButton)
+ {
+ stx = contentsX();
+ sty = contentsY();
+ return false;
+ }
+ else if (m->button() == RightButton)
+ {
+ int lin = rowAt(m->y() + contentsY());
+ if (lin < 0)
+ return false;
+
+ int portalRowToPopup = gridToPortalRowVector_[lin];
+ popupVertHeader_->move(m->globalPos().x(), m->globalPos().y());
+ emit vertHeaderSignal(portalRowToPopup);
+ return true;
+ }
+ }
+ else if (e->type() == QEvent::MouseButtonRelease)
+ {
+ QMouseEvent *m = (QMouseEvent *)e;
+ if (m->button() == LeftButton)
+ {
+ if (m->state() & Qt::ShiftButton)
+ shiftKeyPressed_ = true;
+ else
+ shiftKeyPressed_ = false;
+ int lin = m->y();
+ dragLineReleased_ = rowAt(lin + contentsY());
+ setContentsPos(stx, sty);
+ }
+ return false;
+ }
+ }
+ else if (o == viewport())
+ {
+ if (e->type() == QEvent::MouseButtonPress)
+ {
+ if(rowToEdit_ > -1 && colToEdit_ > -1)
+ endEdit(rowToEdit_, colToEdit_, true, true);
+ rowToEdit_ = -1;
+ colToEdit_ = -1;
+ editing_ = false;
+
+ QMouseEvent *m = (QMouseEvent *)e;
+ if (m->button() == RightButton)
+ {
+ popupViewport_->move(m->globalPos().x(), m->globalPos().y());
+ emit viewportSignal();
+ return true;
+ }
+ }
+ else if (e->type() == QEvent::MouseButtonDblClick)
+ {
+ QMouseEvent *m = (QMouseEvent *)e;
+ if (m->button() == LeftButton)
+ {
+ int col = gridToPortalColVector_[currentColumn()];
+ if(isIndex(col))
+ return true;
+
+ refresh();
+ setEditMode(QTable::Editing, currentRow(), currentColumn());
+ beginEdit(currEditRow(), currEditCol(), false);
+ rowToEdit_ = currEditRow();
+ colToEdit_ = currEditCol();
+ return false;
+ }
+ }
+ else if (e->type() == QEvent::Enter)
+ gridInformation();
+ }
+ else
+ {
+ if (e->type() == QEvent::KeyPress)
+ {
+ if(rowToEdit_ == -1 || colToEdit_ == -1)
+ return true;
+
+ QKeyEvent *k = (QKeyEvent*)e;
+ if (k->state() & Qt::ControlButton)
+ {
+ if(k->key() == Qt::Key_PageDown)
+ {
+ scrollToNextPointedObjectSlot();
+ return true;
+ }
+ else if(k->key() == Qt::Key_PageUp)
+ {
+ scrollToPrevPointedObjectSlot();
+ return true;
+ }
+ }
+ else if (k->state() & Qt::AltButton)
+ {
+ if(k->key() == Qt::Key_PageDown)
+ {
+ scrollToNextQueriedObjectSlot();
+ return true;
+ }
+ else if(k->key() == Qt::Key_PageUp)
+ {
+ scrollToPrevQueriedObjectSlot();
+ return true;
+ }
+ }
+ else if (k->key() == Qt::Key_Return)
+ {
+ editing_ = true;
+ endEdit(rowToEdit_, colToEdit_, true, true);
+ goToEditNewCell();
+ return true;
+ }
+ }
+ }
+
+ return QTable::eventFilter(o, e);
+}
+
+
+void TeQtGrid::mouseReleasedOnVerticalHeaderSlot(int lin)
+{
+ TeWaitCursor wait;
+ string uid, oid;
+ int i, begin, end;
+ set<string> drawSet;
+
+ if (shiftKeyPressed_ == false) // single toggle
+ {
+ portal_->fetchRow(gridToPortalRowVector_[lin]);
+ uid = portal_->getData(uniqueIdPos_);
+ oid = portal_->getData(objectIdPos_);
+ drawSet.insert(oid);
+ ObjectInfo& info = objectMap_[oid];
+ changeObjectStatus(info, uid, "pointing");
+ }
+ else // set or reset grid lines (shift and pointing operation)
+ {
+ if (lastLinePressed_ != -1)
+ {
+ portal_->fetchRow(gridToPortalRowVector_[lastLinePressed_]);
+ uid = portal_->getData(uniqueIdPos_);
+ oid = portal_->getData(objectIdPos_);
+ ObjectInfo& info = objectMap_[oid];
+ int pointed = info.status_ & 0x1;
+ if(uid.empty() == false)
+ pointed = info.uniqueMap_[uid] & 0x1;
+
+ if (lin > lastLinePressed_)
+ {
+ begin = lastLinePressed_ + 1;
+ end = lin;
+ }
+ else if (lin < lastLinePressed_)
+ {
+ begin = lin;
+ end = lastLinePressed_ - 1;
+ }
+ else
+ begin = end = lin;
+
+ for (i = begin ; i <= end; ++i)
+ {
+ portal_->fetchRow(gridToPortalRowVector_[i]);
+ uid = portal_->getData(uniqueIdPos_);
+ oid = portal_->getData(objectIdPos_);
+ ObjectInfo& info = objectMap_[oid];
+ changeObjectStatus(info, uid, "shiftAndPointing", pointed);
+ drawSet.insert(oid);
+ }
+ }
+ }
+
+ if (lin != dragLineReleased_)
+ {
+ if (dragLineReleased_ == -1)
+ {
+ int ini, fim;
+ for (ini = iLine_; ini <= fLine_; ini++)
+ if (isRowSelected(ini, true))
+ break;
+
+ for (fim = fLine_; fim >= iLine_; fim--)
+ if (isRowSelected(fim, true))
+ break;
+
+ if (fim > lin)
+ dragLineReleased_ = fim;
+ else
+ dragLineReleased_ = ini;
+ }
+ portal_->fetchRow(gridToPortalRowVector_[lin]);
+ uid = portal_->getData(uniqueIdPos_);
+ oid = portal_->getData(objectIdPos_);
+ ObjectInfo& info = objectMap_[oid];
+ int pointed = info.status_ & 0x1;
+ if(uid.empty() == false)
+ pointed = info.uniqueMap_[uid] & 0x1;
+
+ if (lin < dragLineReleased_)
+ {
+ begin = lin + 1;
+ end = dragLineReleased_;
+ }
+ else
+ {
+ begin = dragLineReleased_;
+ end = lin - 1;
+ }
+
+ for (i = begin ; i <= end; ++i)
+ {
+ portal_->fetchRow(gridToPortalRowVector_[i]);
+ uid = portal_->getData(uniqueIdPos_);
+ oid = portal_->getData(objectIdPos_);
+ ObjectInfo& info = objectMap_[oid];
+ changeObjectStatus(info, uid, "shiftAndPointing", pointed);
+ drawSet.insert(oid);
+ }
+ }
+
+ lastLinePressed_ = lin;
+ clearSelection(true);
+
+ refresh();
+ if (saveObjectStatus(theme_, drawSet, objectMap_) == false)
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Fail to update the \"c_object_status\" and \"grid_status\" fields in the collection table!"));
+ return;
+ }
+ emit putColorOnObject(theme_, drawSet);
+ gridInformation();
+}
+
+
+void TeQtGrid::putColorOnGrid(set<string> uidSet, set<string> oidSet, string operation, string /* attrQuery */)
+{
+ int x, y;
+ string oid, uid;
+ set<string> drawSet;
+ set<string>::iterator it, nit;
+ list<string>::iterator vit;
+ map<string, int>::iterator uit;
+ map<string, ObjectInfo>::iterator oit;
+ set<string> auxSet;
+
+ for (it = oidSet.begin(); it != oidSet.end(); ++it)
+ {
+ ObjectInfo& info = objectMap_[*it];
+ if(info.uniqueMap_.size())
+ {
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uidSet.insert(uit->first);
+ }
+ else
+ auxSet.insert(*it);
+ }
+ oidSet = auxSet;
+
+ if (operation == "newQuery" || operation == "filterQuery" || operation == "addQuery")
+ {
+ //get the unique ids that were queried before this query
+ list<string> oldUQueriedList, oldOQueriedList;
+ for(oit = objectMap_.begin(); oit != objectMap_.end(); oit++)
+ {
+ ObjectInfo& info = oit->second;
+ if(info.uniqueMap_.size())
+ {
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ {
+ if(uit->second & 0x2)
+ oldUQueriedList.push_back(uit->first);
+ }
+ }
+ else
+ {
+ if(info.status_ & 0x2)
+ oldOQueriedList.push_back(oit->first);
+ }
+ }
+
+ if(operation == "newQuery")
+ {
+ // remove intersection (new and old set)
+ vit = oldUQueriedList.begin();
+ while(vit != oldUQueriedList.end())
+ {
+ if((nit = uidSet.find(*vit)) != uidSet.end())
+ {
+ vit = oldUQueriedList.erase(vit);
+ uidSet.erase(nit);
+ }
+ else
+ vit++;
+ }
+ vit = oldOQueriedList.begin();
+ while(vit != oldOQueriedList.end())
+ {
+ if((nit = oidSet.find(*vit)) != oidSet.end())
+ {
+ vit = oldOQueriedList.erase(vit);
+ oidSet.erase(nit);
+ }
+ else
+ vit++;
+ }
+
+ // reset old queried
+ for(vit = oldUQueriedList.begin(); vit != oldUQueriedList.end(); vit++)
+ {
+ oid = unique2ObjectMap_[*vit];
+ ObjectInfo& info = objectMap_[oid];
+ info.uniqueMap_[*vit] &= 0x1;
+ drawSet.insert(oid);
+ }
+ for(vit = oldOQueriedList.begin(); vit != oldOQueriedList.end(); vit++)
+ {
+ oid = *vit;
+ ObjectInfo& info = objectMap_[oid];
+ info.status_ &= 0x1;
+ drawSet.insert(oid);
+ }
+
+ // set new queried
+ for(nit = uidSet.begin(); nit != uidSet.end(); nit++)
+ {
+ oid = unique2ObjectMap_[*nit];
+ ObjectInfo& info = objectMap_[oid];
+ info.uniqueMap_[*nit] |= 0x2;
+ drawSet.insert(oid);
+ }
+ for(nit = oidSet.begin(); nit != oidSet.end(); nit++)
+ {
+ oid = *nit;
+ ObjectInfo& info = objectMap_[oid];
+ info.status_ |= 0x2;
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uit->second |= 0x2;
+ drawSet.insert(oid);
+ }
+ }
+ else if(operation == "filterQuery")
+ {
+ // remove intersection (old set)
+ for (nit = uidSet.begin(); nit != uidSet.end(); nit++)
+ if((vit = std::find(oldUQueriedList.begin(), oldUQueriedList.end(), *nit)) != oldUQueriedList.end())
+ oldUQueriedList.erase(vit);
+ for (nit = oidSet.begin(); nit != oidSet.end(); nit++)
+ if((vit = std::find(oldOQueriedList.begin(), oldOQueriedList.end(), *nit)) != oldOQueriedList.end())
+ oldOQueriedList.erase(vit);
+
+ // reset old queried
+ for(vit = oldUQueriedList.begin(); vit != oldUQueriedList.end(); vit++)
+ {
+ oid = unique2ObjectMap_[*vit];
+ ObjectInfo& info = objectMap_[oid];
+ info.uniqueMap_[*vit] &= 0x1;
+ drawSet.insert(oid);
+ }
+ for(vit = oldOQueriedList.begin(); vit != oldOQueriedList.end(); vit++)
+ {
+ oid = *vit;
+ ObjectInfo& info = objectMap_[oid];
+ info.status_ &= 0x1;
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uit->second &= 0x1;
+ drawSet.insert(oid);
+ }
+ }
+ else if(operation == "addQuery")
+ {
+ // remove intersection (new set)
+ for (vit = oldUQueriedList.begin(); vit != oldUQueriedList.end(); vit++)
+ if((nit = uidSet.find(*vit)) != uidSet.end())
+ uidSet.erase(nit);
+ for (vit = oldOQueriedList.begin(); vit != oldOQueriedList.end(); vit++)
+ if((nit = oidSet.find(*vit)) != oidSet.end())
+ oidSet.erase(nit);
+
+ // set new queried
+ for(nit = uidSet.begin(); nit != uidSet.end(); nit++)
+ {
+ oid = unique2ObjectMap_[*nit];
+ ObjectInfo& info = objectMap_[oid];
+ info.uniqueMap_[*nit] |= 0x2;
+ drawSet.insert(oid);
+ }
+ for(nit = oidSet.begin(); nit != oidSet.end(); nit++)
+ {
+ oid = *nit;
+ ObjectInfo& info = objectMap_[oid];
+ info.status_ |= 0x2;
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uit->second |= 0x2;
+ drawSet.insert(oid);
+ }
+ }
+ }
+ else if (operation == "newPointing" || operation == "togglePointing" || operation == "addPointing")
+ {
+ list<string> oldUPointedList, oldOPointedList;
+ if(operation != "togglePointing")
+ {
+ //get the object ids that were pointed before this pointing
+ for(oit = objectMap_.begin(); oit != objectMap_.end(); oit++)
+ {
+ ObjectInfo& info = oit->second;
+ if(info.uniqueMap_.size())
+ {
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ {
+ if(uit->second & 0x1)
+ oldUPointedList.push_back(uit->first);
+ }
+ }
+ else
+ {
+ if(info.status_ & 0x1)
+ oldOPointedList.push_back(oit->first);
+ }
+ }
+ }
+
+ if(operation == "newPointing")
+ {
+ // remove intersection (new and old set)
+ vit = oldUPointedList.begin();
+ while(vit != oldUPointedList.end())
+ {
+ if((nit = uidSet.find(*vit)) != uidSet.end())
+ vit = oldUPointedList.erase(vit);
+ else
+ vit++;
+ }
+ vit = oldOPointedList.begin();
+ while(vit != oldOPointedList.end())
+ {
+ if((nit = oidSet.find(*vit)) != oidSet.end())
+ oldOPointedList.erase(vit);
+ else
+ vit++;
+ }
+
+ // reset old pointeds
+ for(vit = oldUPointedList.begin(); vit != oldUPointedList.end(); vit++)
+ {
+ oid = unique2ObjectMap_[*vit];
+ ObjectInfo& info = objectMap_[oid];
+ info.uniqueMap_[*vit] &= 0x2;
+ drawSet.insert(oid);
+ }
+ for(vit = oldOPointedList.begin(); vit != oldOPointedList.end(); vit++)
+ {
+ oid = *vit;
+ ObjectInfo& info = objectMap_[oid];
+ info.status_ &= 0x2;
+ drawSet.insert(oid);
+ }
+
+ // set new pointed
+ for(nit = uidSet.begin(); nit != uidSet.end(); nit++)
+ {
+ oid = unique2ObjectMap_[*nit];
+ ObjectInfo& info = objectMap_[oid];
+ info.uniqueMap_[*nit] |= 0x1;
+ drawSet.insert(oid);
+ }
+ for(nit = oidSet.begin(); nit != oidSet.end(); nit++)
+ {
+ oid = *nit;
+ ObjectInfo& info = objectMap_[oid];
+ info.status_ |= 0x1;
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uit->second |= 0x1;
+ drawSet.insert(oid);
+ }
+ }
+ else if(operation == "togglePointing")
+ {
+ // toggle status (new pointed ids)
+ nit = oidSet.begin();
+ if(nit != oidSet.end())
+ {
+ oid = *nit;
+ ObjectInfo& info = objectMap_[oid];
+ int status = info.status_;
+
+ if(status & 0x1) // reset new pointed
+ {
+ while(nit != oidSet.end())
+ {
+ oid = *nit;
+ ObjectInfo& info = objectMap_[oid];
+ info.status_ &= 0x2;
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uit->second &= 0x2;
+ nit++;
+ drawSet.insert(oid);
+ }
+ }
+ else // set new pointed
+ {
+ while(nit != oidSet.end())
+ {
+ oid = *nit;
+ ObjectInfo& info = objectMap_[oid];
+ info.status_ |= 0x1;
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uit->second |= 0x1;
+ nit++;
+ drawSet.insert(oid);
+ }
+ }
+ }
+
+ nit = uidSet.begin();
+ if(nit != uidSet.end())
+ {
+ oid = unique2ObjectMap_[*nit];
+ ObjectInfo& info = objectMap_[oid];
+ int status = info.status_;
+
+ if(status & 0x1) // reset new pointed
+ {
+ for(nit = uidSet.begin(); nit != uidSet.end(); nit++)
+ {
+ oid = unique2ObjectMap_[*nit];
+ ObjectInfo& info = objectMap_[oid];
+ info.uniqueMap_[*nit] &= 0x2;
+ drawSet.insert(oid);
+ }
+ }
+ else // set new pointed
+ {
+ for(nit = uidSet.begin(); nit != uidSet.end(); nit++)
+ {
+ oid = unique2ObjectMap_[*nit];
+ ObjectInfo& info = objectMap_[oid];
+ info.uniqueMap_[*nit] |= 0x1;
+ drawSet.insert(oid);
+ }
+ }
+ }
+ }
+ else if(operation == "addPointing")
+ {
+ // remove intersection (new pointed ids)
+ // not erase (not optimize) - graphic plot need selectd objects
+
+ // set new pointeds
+ for(nit = uidSet.begin(); nit != uidSet.end(); nit++)
+ {
+ oid = unique2ObjectMap_[*nit];
+ ObjectInfo& info = objectMap_[oid];
+ info.uniqueMap_[*nit] |= 0x1;
+ drawSet.insert(oid);
+ }
+ for(nit = oidSet.begin(); nit != oidSet.end(); nit++)
+ {
+ oid = *nit;
+ ObjectInfo& info = objectMap_[oid];
+ info.status_ |= 0x1;
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uit->second |= 0x1;
+ drawSet.insert(oid);
+ }
+ }
+ }
+
+ for(it = drawSet.begin(); it != drawSet.end(); it++)
+ {
+ oid = *it;
+ ObjectInfo& info = objectMap_[oid];
+ if(info.uniqueMap_.size())
+ {
+ set<int> statusSet;
+ uit = info.uniqueMap_.begin();
+ uid = uit->first;
+
+ while(uit != info.uniqueMap_.end())
+ statusSet.insert(uit++->second);
+ if(statusSet.find(3) != statusSet.end())
+ info.status_ = 3;
+ else if(statusSet.find(2) != statusSet.end() && statusSet.find(1) != statusSet.end())
+ info.status_ = 3;
+ else if(statusSet.find(2) != statusSet.end() && statusSet.find(1) == statusSet.end())
+ info.status_ = 2;
+ else if(statusSet.find(2) == statusSet.end() && statusSet.find(1) != statusSet.end())
+ info.status_ = 1;
+ else
+ info.status_ = 0;
+ }
+ }
+
+ // If it is not a query operation (i.e., a pointing operation), scroll the grid if the
+ // single object is not visible in the grid.
+ if (operation == "togglePointing")
+ {
+ vector<string>::iterator itpos;
+ if(uid.empty() == false)
+ itpos = std::find(portalRow2UniqueIdVector_.begin(), portalRow2UniqueIdVector_.end(), uid);
+ else
+ itpos = std::find(portalRow2UniqueIdVector_.begin(), portalRow2UniqueIdVector_.end(), oid);
+ int pos = 0;
+ if(itpos != portalRow2UniqueIdVector_.end())
+ pos = itpos - portalRow2UniqueIdVector_.begin();
+
+ vector<int>::iterator itpos2;
+ itpos2 = std::find(gridToPortalRowVector_.begin(),gridToPortalRowVector_.end(), pos);
+ pos = itpos2 - gridToPortalRowVector_.begin();
+
+ if (pos <= iLine_ || pos >= fLine_)
+ {
+ // if editing, end edit to enable vertical scrolling
+ if(editing_ && (rowToEdit_ > -1 && colToEdit_ > -1))
+ {
+ endEdit(rowToEdit_, colToEdit_, true, true);
+ rowToEdit_ = -1;
+ colToEdit_ = -1;
+ editing_ = false;
+ }
+ doRepaint_ = true;
+ x = contentsX();
+ y = rowPos(pos);
+ setContentsPos(x, y);
+ }
+ }
+
+ clearSelection(true);
+ refresh();
+
+ if (saveObjectStatus(theme_, drawSet, objectMap_) == false)
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Fail to update the \"c_object_status\" and \"grid_status\" fields in the collection table!"));
+ return;
+ }
+
+ emit putColorOnObject(theme_, drawSet);
+
+ if(autoPromote_)
+ {
+ // if editing, end edit to enable vertical scrolling
+ if(editing_ && (rowToEdit_ > -1 && colToEdit_ > -1))
+ {
+ endEdit(rowToEdit_, colToEdit_, true, true);
+ rowToEdit_ = -1;
+ colToEdit_ = -1;
+ editing_ = false;
+ }
+ if (operation == "newPointing" || operation == "addPointing")
+ promotePointedObjectsSlot();
+ else if(operation == "newQuery" || operation == "addQuery" || operation == "filterQuery")
+ promoteQueriedObjectsSlot();
+ }
+
+ gridInformation();
+}
+
+
+void TeQtGrid::drawContents (QPainter *qp, int clipx, int clipy, int clipw, int cliph)
+{
+ if(doRepaint_ == true)
+ {
+ update();
+ QTable :: drawContents(qp, clipx, clipy, clipw, cliph);
+ }
+}
+
+
+void TeQtGrid::update()
+{
+ if(portal_ == 0)
+ return;
+ int ie = currEditRow();
+ int je = currEditCol();
+ QString vale;
+ if(ie >= 0 && je >= 0)
+ {
+ setCellContentFromEditor(ie, je);
+ vale = text(ie, je);
+ if(vale.isEmpty())
+ {
+ int pos = gridToPortalRowVector_[ie];
+ if(portal_->fetchRow(pos))
+ {
+ string s = portal_->getData(gridToPortalColVector_[je]);
+ if(s.empty() == false)
+ vale = s.c_str();
+ }
+ }
+ }
+
+ int i, j, pos;
+
+ int gridY = contentsY();
+ int gridX = contentsX();
+
+ if(mousePressedOnHorizontalHeader_ && gridY == 0)
+ {
+ setContentsPos(gridX_, gridY_);
+ gridY = gridY_;
+ mousePressedOnHorizontalHeader_ = false;
+ }
+
+ int gridHeight = visibleHeight();
+ int gridWidth = visibleWidth();
+
+ if (doRefresh_ == false &&
+ gridX_ == gridX && gridY_ == gridY &&
+ gridHeight_ == gridHeight &&
+ gridWidth_ == gridWidth)
+ return;
+
+ gridX_ = gridX;
+ gridY_ = gridY;
+ gridHeight_ = gridHeight;
+ gridWidth_ = gridWidth;
+
+// clear cells
+ doRepaint_ = false; // do not repaint
+ if (iLine_ >= 0 && iCol_ >= 0)
+ {
+ for (i = iLine_; i <= fLine_; ++i)
+ {
+ for (j = iCol_; j <= fCol_; ++j)
+ {
+ if(item(i, j))
+ clearCell(i, j);
+ }
+ }
+ }
+
+ iLine_ = rowAt(gridY_);
+ iCol_ = columnAt(gridX_);
+ visibleLines_ = rowAt(gridHeight_);
+ if (visibleLines_ == -1)
+ visibleLines_ = numRows();
+
+ visibleCols_ = 0;
+ int scVal = horizontalScrollBar()->value();
+ for(i=iCol_; i<numCols(); i++)
+ {
+ if(gridWidth_ < columnPos(i) - scVal)
+ break;
+ visibleCols_++;
+ }
+
+ if (iLine_ < 0 || iCol_ < 0)
+ {
+ gridX_ = gridY_ = iLine_ = fLine_ = iCol_ = fCol_ = -1;
+ doRepaint_ = true;
+ return;
+ }
+
+ fLine_ = iLine_ + visibleLines_;
+ if (fLine_ > numRows() - 1)
+ fLine_ = numRows() - 1;
+ fCol_ = iCol_ + visibleCols_ - 1;
+
+ int status;
+ string st, oid, uid;
+ QColor qc;
+ TeColor color;
+ for (i = iLine_; i <= fLine_ ; ++i)
+ {
+ pos = gridToPortalRowVector_[i];
+ if (portal_->fetchRow(pos) == false)
+ return;
+
+ oid = portal_->getData(objectIdPos_);
+ uid = portal_->getData(uniqueIdPos_);
+
+ ObjectInfo& info = objectMap_[oid];
+ if(uid.empty() == false)
+ status = info.uniqueMap_[uid];
+ else
+ status = info.status_;
+
+ if (status == 1)
+ color = theme_->pointingLegend().visual(TePOLYGONS).color();
+ else if (status == 2)
+ color = theme_->queryLegend().visual(TePOLYGONS).color();
+ else if (status == 3)
+ color = theme_->queryAndPointingLegend().visual(TePOLYGONS).color();
+ qc = QColor(color.red_,color.green_,color.blue_);
+
+ for (j = iCol_; j <= fCol_; ++j)
+ {
+ if (gridColVisVector_[j] == true)
+ {
+ st = portal_->getData(gridToPortalColVector_[j]);
+ if(status != 0)
+ {
+ TeQtGridItem *ti;
+ if(ie == i && je == j)
+ ti = new TeQtGridItem( this, QTableItem::OnTyping, vale);
+ else
+ ti = new TeQtGridItem( this, QTableItem::OnTyping, st.c_str());
+
+ ti->setColor(qc);
+ setItem(i, j, ti );
+ }
+ else
+ {
+ if(ie == i && je == j)
+ setText(i, j, vale);
+ else
+ setText(i, j, st.c_str());
+ }
+ }
+
+ if(i == fLine_ && j == fCol_- 1)
+ {
+ doRepaint_ = true; // do repaint
+ doRefresh_ = true;
+ updateCell(i, j);
+ }
+ }
+ }
+
+ doRepaint_ = true; // do repaint
+ doRefresh_ = false;
+
+ if(ie >= 0 && je >= 0)
+ endEdit(ie, je, true, true);
+
+ if(rowToEdit_ > -1 && colToEdit_ > -1 && editing_)
+ {
+ setEditMode(QTable::Editing, rowToEdit_, colToEdit_);
+ beginEdit(rowToEdit_, colToEdit_, false);
+ }
+}
+
+
+void TeQtGrid::adjustColumns()
+{
+ int i;
+ for (i = 0; i < numCols(); ++i)
+ adjustColumn(i);
+ refresh();
+}
+
+
+void TeQtGrid::swapColumns(int col1, int col2)
+{
+ int nc = numCols();
+ vector<int> cols;
+ int n;
+
+ if (col1 == -1 || col2 == -1)
+ {
+ for(n = 0; n < nc; n++)
+ if (isColumnSelected(n, true) == true)
+ cols.push_back(n);
+ if(cols.size() != 2)
+ {
+ QMessageBox::warning(this, tr("Warning"),
+ tr("Select the two grid columns to be exchanged!"));
+ return;
+ }
+ col1 = cols[0];
+ col2 = cols[1];
+ }
+
+ int c1 = gridToPortalColVector_[col1];
+ int c2 = gridToPortalColVector_[col2];
+
+ gridToPortalColVector_[col1] = c2;
+ gridToPortalColVector_[col2] = c1;
+
+ QTable::swapColumns(col1, col2);
+ for (n=0; n<nc; n++)
+ {
+ string st = portal_->getAttribute(gridToPortalColVector_[n]).rep_.name_;
+ horizontalHeader()->setLabel(n, st.c_str());
+ }
+ refresh();
+}
+
+
+void TeQtGrid::setVisColumn(bool vis, int col)
+{
+ unsigned int nc = numCols();
+ unsigned int n;
+ vector<int> cols;
+
+ if (vis == false)
+ {
+ if (col == -1)
+ {
+ for(n=0; n<nc; n++)
+ if (isColumnSelected(n, true) == true)
+ cols.push_back(n);
+ if(cols.size() == 0)
+ {
+ QMessageBox::warning(this, tr("Warning"),
+ tr("Select the grid column(s) to be hidden!"));
+ return;
+ }
+ }
+ else
+ cols.push_back(col);
+
+ for(n=0; n<cols.size(); n++)
+ {
+ showColumn(cols[n]); // it is a BUG in the QT 3.2.0
+ hideColumn(cols[n]);
+ gridColVisVector_[cols[n]] = false;
+ }
+ }
+ else
+ {
+ for(n=0; n<nc; n++)
+ {
+ if(gridColVisVector_[n] == false)
+ {
+ gridColVisVector_[n] = true;
+ showColumn(n);
+ cols.push_back(n);
+ }
+ }
+ }
+ refresh();
+}
+
+void TeQtGrid::refresh()
+{
+ doRefresh_ = true;
+ update();
+}
+
+
+void TeQtGrid::promotePointedObjectsSlot()
+{
+ TeWaitCursor wait;
+ gridToPortalRowVector_.clear();
+ string oid, uid;
+ TeDatabasePortal* portal = db_->getPortal();
+ vector<int> notByPointingVector;
+
+ unsigned int i=0;
+ int gs;
+ if (portal->query(sql_))
+ {
+ while (portal->fetchRow())
+ {
+ gs = atoi(portal->getData(gridStatusPos_));
+ if(gs &= 0x1)
+ gridToPortalRowVector_.push_back(i);
+ else
+ notByPointingVector.push_back(i);
+ ++i;
+ }
+ }
+ delete portal;
+
+ for (i = 0; i < notByPointingVector.size(); ++i)
+ gridToPortalRowVector_.push_back(notByPointingVector[i]);
+
+ doRepaint_ = true;
+
+ int x = contentsX();
+ int y = rowPos(0);
+ setContentsPos(x, y);
+
+ refresh();
+}
+
+
+void TeQtGrid::promoteQueriedObjectsSlot()
+{
+ TeWaitCursor wait;
+ gridToPortalRowVector_.clear();
+ string oid, uid, val;
+ TeDatabasePortal* portal = db_->getPortal();
+ vector<int> notByQueryVector;
+
+ unsigned int i=0;
+ int gs;
+ if (portal->query(sql_))
+ {
+ while (portal->fetchRow())
+ {
+ val = portal->getData(gridStatusPos_);
+ if(val.empty())
+ gs = atoi(portal->getData(resultIdPos_));
+ else
+ gs = atoi(val.c_str());
+
+ if(gs &= 0x2)
+ gridToPortalRowVector_.push_back(i);
+ else
+ notByQueryVector.push_back(i);
+ ++i;
+ }
+ }
+ delete portal;
+
+ for (i = 0; i < notByQueryVector.size(); ++i)
+ gridToPortalRowVector_.push_back(notByQueryVector[i]);
+
+ doRepaint_ = true;
+
+ int x = contentsX();
+ int y = rowPos(0);
+ setContentsPos(x, y);
+
+ refresh();
+}
+
+
+void TeQtGrid::sortAscOrderSlot()
+{
+ vector<int> v;
+
+ sort(v, "ASC");
+}
+
+
+void TeQtGrid::sortDescOrderSlot()
+{
+ vector<int> v;
+
+ sort(v, "DESC");
+}
+
+
+void TeQtGrid::sort(vector<int> cols, string order)
+{
+ unsigned int nc = numCols();
+ unsigned int n;
+ string uid, oid;
+
+ if (portal_ == 0)
+ return;
+
+
+ if (cols.size() == 0)
+ {
+ for(n = 0; n < nc; ++n)
+ if (isColumnSelected(n, true) == true)
+ cols.push_back(n);
+ }
+
+ if (cols.size() == 0)
+ {
+ QMessageBox::warning(this, tr("Warning"),
+ tr("Select the grid column(s) to be sorted!"));
+ return;
+ }
+
+ orderBy_.clear();
+ for (n=0; n<cols.size(); n++)
+ orderBy_ += (horizontalHeader()->label(cols[n]) + " ").latin1() + order + ",";
+ orderBy_.erase(orderBy_.size()-1, 1);
+ doRepaint_ = true;
+
+ portal_->freeResult();
+ sql_ = sqlJoin_ + " ORDER BY " + orderBy_;
+ if (portal_->query(sql_) == false)
+ {
+ delete portal_;
+ portal_ = 0;
+ return;
+ }
+
+ gridToPortalRowVector_.clear();
+ portalRow2UniqueIdVector_.clear();
+ int i = 0;
+ while(portal_->fetchRow())
+ {
+ uid = portal_->getData(uniqueIdPos_);
+ if(uid.empty() == false)
+ portalRow2UniqueIdVector_.push_back(uid);
+ else
+ {
+ oid = portal_->getData(objectIdPos_);
+ portalRow2UniqueIdVector_.push_back(oid);
+ }
+ gridToPortalRowVector_.push_back(i);
+ ++i;
+ }
+
+ refresh();
+}
+
+
+TeTable& TeQtGrid::findTable(int col) // grid column
+{
+ unsigned int i;
+ int nCols;
+ static TeTable t;
+
+ int portalCol = gridToPortalColVector_[col];
+ TeAttributeList attrList;
+
+ nCols = 0;
+ for (i = 0; i < tableVector_.size(); ++i)
+ {
+ attrList = tableVector_[i].attributeList();
+ nCols += attrList.size();
+ if (portalCol < nCols)
+ break;
+ }
+ if(i == tableVector_.size())
+ return t;
+ return tableVector_[i];
+}
+
+TeTable& TeQtGrid::findTable(string colName)
+{
+ int i;
+ for(i=0; i<numCols(); i++)
+ {
+ string cname = horizontalHeader()->label(i).latin1();
+ if(cname == colName)
+ break;
+ }
+ return findTable(i);
+}
+
+
+void TeQtGrid::setVerticalEdition(bool flag)
+{
+ verticalEdition_ = flag;
+}
+
+bool TeQtGrid::writeCell()
+{
+ string val;
+ QString qs;
+ unsigned int i;
+
+ if(rowToEdit_ == -1 || colToEdit_ == -1)
+ return false;
+
+ int portalRowToEdit = gridToPortalRowVector_[rowToEdit_];
+ int portalColToEdit = gridToPortalColVector_[colToEdit_];
+ endEdit(rowToEdit_, colToEdit_, true, false);
+
+ int col = gridToPortalColVector_[colToEdit_];
+ if(isIndex(col))
+ return false;
+
+ string colName = horizontalHeader()->label(colToEdit_).latin1();
+ qs = text(rowToEdit_, colToEdit_);
+// if(qs.isEmpty() && db_->dbmsName() == "Ado")
+// return false;
+ if(qs.isEmpty() == false)
+ val = qs.latin1();
+
+ TeAttributeList attrList = portal_->AttributeList();
+ TeAttrDataType type = attrList[portalColToEdit].rep_.type_;
+
+ if (portal_->fetchRow(portalRowToEdit) == false)
+ return false;
+
+ TeWaitCursor wait;
+ TeTable& tableToEdit = findTable(colToEdit_);
+ string tableName = tableToEdit.name();
+ string linkName;
+ if(tableToEdit.tableType() == TeAttrStatic || tableToEdit.tableType() == TeAttrEvent)
+ linkName = tableToEdit.linkName();
+ else
+ linkName = tableToEdit.uniqueName();
+
+ i = linkName.find(".");
+ if(i == string::npos)
+ linkName = tableName + "." + linkName;
+
+ string id = portal_->getData(linkName);
+
+ string qString = "UPDATE " + tableName;
+ if(val.empty())
+ {
+ qString += " SET " + colName + " = null";
+ qString += " WHERE " + linkName + " = '" + id + "'";
+ }
+ else
+ {
+ if (type == TeSTRING)
+ {
+ qString += " SET " + colName + " = '" + val;
+ qString += "' WHERE " + linkName + " = '" + id + "'";
+ }
+ else
+ {
+ qString += " SET " + colName + " = " + val;
+ qString += " WHERE " + linkName + " = '" + id + "'";
+ }
+ }
+
+ if (db_->execute(qString) == false)
+ return false;
+
+ if (db_->dbmsName() != "Ado")
+ arrangeGridToPortalRowVector(col);
+
+ return true;
+}
+
+
+void TeQtGrid::editNextRow()
+{
+ if (rowToEdit_ < numRows()-1)
+ ++rowToEdit_;
+ else
+ {
+ rowToEdit_ = 0;
+ editNextColumn();
+ }
+}
+
+
+void TeQtGrid::editNextColumn()
+{
+ bool editavel = false;
+ while(editavel == false)
+ {
+ if (colToEdit_ == numCols()-1)
+ {
+ colToEdit_ = 0;
+ if (rowToEdit_ == numRows()-1)
+ rowToEdit_ = 0;
+ else
+ ++rowToEdit_;
+ }
+ else
+ ++colToEdit_;
+
+ int col = gridToPortalColVector_[colToEdit_];
+ if(isIndex(col))
+ editavel = false;
+ else
+ editavel = true;
+ }
+}
+
+void TeQtGrid::goToEditNewCell()
+{
+ int x = contentsX();
+ int y = contentsY();
+
+ if(verticalEdition_ == true)
+ editNextRow();
+ else
+ editNextColumn();
+
+ if(rowToEdit_ >= fLine_)
+ y = rowPos(iLine_+1);
+ if(colToEdit_ >= fCol_)
+ x = columnPos(iCol_+1);
+
+ setContentsPos(x, y);
+ refresh();
+
+ int i = currEditRow();
+ int j = currEditCol();
+ if(i != rowToEdit_ || j != colToEdit_)
+ {
+ if(i > 0 && j > 0)
+ endEdit(i, j, true, true);
+ setEditMode(QTable::Editing, rowToEdit_, colToEdit_);
+ beginEdit(rowToEdit_, colToEdit_, false);
+ }
+}
+
+void TeQtGrid::removeQueryColorSlot()
+{
+ TeWaitCursor wait;
+
+ set<string> drawSet;
+ map<string, int>::iterator uit;
+
+ map<string, ObjectInfo>::iterator oit;
+ for(oit = objectMap_.begin(); oit != objectMap_.end(); oit++)
+ {
+ ObjectInfo& info = oit->second;
+ if(info.status_ & 0x2)
+ {
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uit->second &= 0x1;
+ info.status_ &= 0x1;
+ drawSet.insert(oit->first);
+ }
+ }
+
+ clearSelection(true);
+ refresh();
+ string s = "UPDATE " + theme_->collectionTable();
+ s += " SET c_object_status = 0 WHERE c_object_status = 2";
+ db_->execute(s);
+
+ s = "UPDATE " + theme_->collectionTable();
+ s += " SET c_object_status = 1 WHERE c_object_status = 3";
+ db_->execute(s);
+
+ s = "UPDATE " + theme_->collectionAuxTable();
+ s += " SET grid_status = 0 WHERE grid_status = 2";
+ db_->execute(s);
+
+ s = "UPDATE " + theme_->collectionAuxTable();
+ s += " SET grid_status = 1 WHERE grid_status = 3";
+ db_->execute(s);
+
+ emit putColorOnObject(theme_, drawSet);
+}
+
+
+void TeQtGrid::removePointingColorSlot()
+{
+ TeWaitCursor wait;
+
+ set<string> drawSet;
+ map<string, int>::iterator uit;
+
+ map<string, ObjectInfo>::iterator oit;
+ for(oit = objectMap_.begin(); oit != objectMap_.end(); oit++)
+ {
+ ObjectInfo& info = oit->second;
+ if(info.status_ & 0x1)
+ {
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uit->second &= 0x2;
+ info.status_ &= 0x2;
+ drawSet.insert(oit->first);
+ }
+ }
+
+ clearSelection(true);
+ refresh();
+ string s = "UPDATE " + theme_->collectionTable();
+ s += " SET c_object_status = 0 WHERE c_object_status = 1";
+ db_->execute(s);
+
+ s = "UPDATE " + theme_->collectionTable();
+ s += " SET c_object_status = 2 WHERE c_object_status = 3";
+ db_->execute(s);
+
+ s = "UPDATE " + theme_->collectionAuxTable();
+ s += " SET grid_status = 0 WHERE grid_status = 1";
+ db_->execute(s);
+
+ s = "UPDATE " + theme_->collectionAuxTable();
+ s += " SET grid_status = 2 WHERE grid_status = 3";
+ db_->execute(s);
+
+ emit putColorOnObject(theme_, drawSet);
+}
+
+
+void TeQtGrid::scrollToNextPointedObjectSlot()
+{
+ TeWaitCursor wait;
+
+ int rowpos, portalpos, nrows = numRows();
+ int x, y;
+ string oid, uid;
+
+ x = contentsX();
+ y = contentsY();
+ rowpos = rowAt(y);
+
+ if(rowpos == numRows() - 1)
+ {
+ wait.resetWaitCursor();
+ return;
+ }
+ rowpos++;
+
+ while(rowpos < nrows)
+ {
+ portalpos = gridToPortalRowVector_[rowpos];
+ portal_->fetchRow(portalpos);
+
+ oid = portal_->getData(objectIdPos_);
+ uid = portal_->getData(uniqueIdPos_);
+
+ ObjectInfo& info = objectMap_[oid];
+ int status = info.status_;
+ if(uid.empty() == false)
+ status = info.uniqueMap_[uid];
+
+
+ if (status & 0x1)
+ break;
+ rowpos++;
+ }
+
+
+ if (rowpos == nrows)
+ {
+ wait.resetWaitCursor();
+ return;
+ }
+
+ y = rowPos(rowpos);
+ setContentsPos (x, y);
+
+ clearSelection(true);
+ refresh();
+}
+
+
+void TeQtGrid::scrollToPrevPointedObjectSlot()
+{
+ TeWaitCursor wait;
+
+ int rowpos, portalpos;
+ int x, y;
+ string oid, uid;
+
+ x = contentsX();
+ y = contentsY();
+ rowpos = rowAt(y);
+
+ if(rowpos == 0)
+ {
+ wait.resetWaitCursor();
+ return;
+ }
+ rowpos--;
+
+ while(rowpos >= 0)
+ {
+ portalpos = gridToPortalRowVector_[rowpos];
+ portal_->fetchRow(portalpos);
+
+ oid = portal_->getData(objectIdPos_);
+ uid = portal_->getData(uniqueIdPos_);
+
+ ObjectInfo& info = objectMap_[oid];
+ int status = info.status_;
+ if(uid.empty() == false)
+ status = info.uniqueMap_[uid];
+
+ if (status & 0x1)
+ break;
+ rowpos--;
+ }
+
+
+ if (rowpos < 0)
+ {
+ wait.resetWaitCursor();
+ return;
+ }
+
+ y = rowPos(rowpos);
+ setContentsPos (x, y);
+
+ clearSelection(true);
+ refresh();
+}
+
+
+void TeQtGrid::scrollToNextQueriedObjectSlot()
+{
+ TeWaitCursor wait;
+
+ int rowpos, portalpos, nrows = numRows();
+ int x, y;
+ string oid, uid;
+
+ x = contentsX();
+ y = contentsY();
+ rowpos = rowAt(y);
+
+ if(rowpos == numRows() - 1)
+ {
+ wait.resetWaitCursor();
+ return;
+ }
+ rowpos++;
+
+ while(rowpos < nrows)
+ {
+ portalpos = gridToPortalRowVector_[rowpos];
+ portal_->fetchRow(portalpos);
+
+ oid = portal_->getData(objectIdPos_);
+ uid = portal_->getData(uniqueIdPos_);
+
+ ObjectInfo& info = objectMap_[oid];
+ int status = info.status_;
+ if(uid.empty() == false)
+ status = info.uniqueMap_[uid];
+
+ if (status & 0x2)
+ break;
+ rowpos++;
+ }
+
+
+ if (rowpos == nrows)
+ {
+ wait.resetWaitCursor();
+ return;
+ }
+
+ y = rowPos(rowpos);
+ setContentsPos (x, y);
+
+ clearSelection(true);
+ refresh();
+}
+
+
+void TeQtGrid::scrollToPrevQueriedObjectSlot()
+{
+ TeWaitCursor wait;
+
+ int rowpos, portalpos;
+ int x, y;
+ string oid, uid;
+
+ x = contentsX();
+ y = contentsY();
+ rowpos = rowAt(y);
+
+ if(rowpos == 0)
+ {
+ wait.resetWaitCursor();
+ return;
+ }
+ rowpos--;
+
+ while(rowpos >= 0)
+ {
+ portalpos = gridToPortalRowVector_[rowpos];
+ portal_->fetchRow(portalpos);
+
+ oid = portal_->getData(objectIdPos_);
+ uid = portal_->getData(uniqueIdPos_);
+
+ ObjectInfo& info = objectMap_[oid];
+ int status = info.status_;
+ if(uid.empty() == false)
+ status = info.uniqueMap_[uid];
+
+ if (status & 0x2)
+ break;
+ rowpos--;
+ }
+
+
+ if (rowpos < 0)
+ {
+ wait.resetWaitCursor();
+ return;
+ }
+
+ y = rowPos(rowpos);
+ setContentsPos (x, y);
+
+ clearSelection(true);
+ refresh();
+}
+
+void TeQtGrid::invertSelectionSlot()
+{
+ TeWaitCursor wait;
+
+ set<string> drawSet;
+ map<string, int>::iterator uit;
+ string oid, uid;
+
+ map<string, ObjectInfo>::iterator oit;
+ for(oit = objectMap_.begin(); oit != objectMap_.end(); oit++)
+ {
+ ObjectInfo& info = oit->second;
+ if(info.status_ & 0x2) //queried object -> sets it to selected
+ {
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uit->second &= 0x1;
+ info.status_ &= 0x1;
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uit->second |= 0x1;
+ info.status_ |= 0x1;
+ }
+ for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+ uit->second ^= 0x1;
+ info.status_ ^= 0x1;
+ drawSet.insert(oit->first);
+ }
+ refresh();
+ if (saveObjectStatus(theme_, drawSet, objectMap_) == false)
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Fail to update the \"c_legend_result\" and \"grid_status\" fields in the collection table!"));
+ return;
+ }
+ emit putColorOnObject(theme_, drawSet);
+}
+
+bool TeQtGrid::getVisColumn(int col)
+{
+ if(col < (int)gridColVisVector_.size())
+ return gridColVisVector_[col];
+ return false;
+}
+
+
+bool TeQtGrid::isIndex(int col) // portal column
+{
+ unsigned int i;
+ string cname = portal_->getAttribute(col).rep_.name_;
+
+ if(cname.find(".") == string::npos)
+ {
+ TeAttributeList attrList;
+ int nCols = 0;
+ for (i = 0; i < tableVector_.size(); ++i)
+ {
+ attrList = tableVector_[i].attributeList();
+ nCols += attrList.size();
+ if (col < nCols)
+ break;
+ }
+
+ if(i>0)
+ cname.insert(0, tableVector_[(i-1)].name() + ".");
+ }
+
+ for(i=0; i<indexVector_.size(); i++)
+ {
+ string s = indexVector_[i];
+ if(s.find(cname, string::npos) != string::npos)
+ return true;
+ }
+ return false;
+}
+
+bool TeQtGrid::isDateTimeRegistered(int col) // portal column
+{
+ string cname = portal_->getAttribute(col).rep_.name_;
+ TeTable& t = findTable(cname);
+ string name = cname;
+ int f = name.find(".");
+ if(f >= 0)
+ name.erase(0, f+1);
+ if(t.attInitialTime() == name || t.attFinalTime() == name)
+ return true;
+ return false;
+}
+
+bool TeQtGrid::isSortBy(int col) // portal column
+{
+ string cname = portal_->getAttribute(col).rep_.name_;
+ cname += " ";
+
+ if(orderBy_.find(cname, string::npos) == string::npos)
+ return false;
+ return true;
+}
+
+bool TeQtGrid::isExternalTable(int col) // portal column
+{
+ unsigned int c;
+ for(c=0; c<gridToPortalColVector_.size(); c++)
+ {
+ if(gridToPortalColVector_[c] == col)
+ break;
+ }
+
+ TeTable& T = findTable(c);
+ if(T.tableType() == TeAttrExternal)
+ return true;
+ else
+ return false;
+}
+
+string TeQtGrid::getObject(int row)
+{
+ int portalpos = gridToPortalRowVector_[row];
+ portal_->fetchRow(portalpos);
+
+ string oid = portal_->getData(objectIdPos_);
+ return oid;
+}
+
+void TeQtGrid::gridInformation()
+{
+ if(showGridInformation_ == false)
+ return;
+
+ int orows = 0, opointed = 0, oqueried = 0, opqs = 0;
+ int pointed = 0, queried = 0, pqs = 0;
+ int rows = numRows();
+ map<string, ObjectInfo>::iterator it = objectMap_.begin();
+
+ while (it != objectMap_.end())
+ {
+ orows++;
+ ObjectInfo& info = it->second;
+ int leg_res = info.status_;
+ if(leg_res == 1)
+ opointed++;
+ else if(leg_res == 2)
+ oqueried++;
+ else if(leg_res == 3)
+ {
+ opointed++;
+ oqueried++;
+ opqs++;
+ }
+
+ map<string, int> uMap = info.uniqueMap_;
+ if(uMap.size())
+ {
+ map<string, int>::iterator uit = uMap.begin();
+ while(uit != uMap.end())
+ {
+ int gStatus = uit->second;
+ if(gStatus == 1)
+ pointed++;
+ else if(gStatus == 2)
+ queried++;
+ else if(gStatus == 3)
+ {
+ pointed++;
+ queried++;
+ pqs++;
+ }
+ uit++;
+ }
+ }
+ it++;
+ }
+
+ string sorows = Te2String(orows);
+ string sopointed = Te2String(opointed);
+ string soqueried = Te2String(oqueried);
+ string sopqs = Te2String(opqs);
+ string srows = Te2String(rows);
+ string spointed = Te2String(pointed);
+ string squeried = Te2String(queried);
+ string spqs = Te2String(pqs);
+
+ if(orows != rows || opointed != pointed || oqueried != queried || opqs != pqs)
+ {
+ sorows += "/" + srows;
+ sopointed += "/" + spointed;
+ soqueried += "/" + squeried;
+ sopqs += "/" + spqs;
+ }
+
+ QString msg = tr("Number of Rows:") + " " + sorows.c_str() + ", " + tr("Pointed:") + " " + sopointed.c_str();
+ msg += ", " + tr("Queried:") + " " + soqueried.c_str() + ", " + tr("Pointed and Queried:") + " " + sopqs.c_str();
+ emit displayGridInformation(msg);
+}
+
+void TeQtGrid::endEdit(int row, int col, bool accept, bool replace)
+{
+ if(accept && replace)
+ writeCell();
+ else
+ QTable::endEdit(row, col, accept, replace);
+}
+
+
+void TeQtGrid::columnWidthChanged(int col)
+{
+ if(doRepaint_)
+ refresh();
+ QTable::columnWidthChanged(col);
+}
+
+void TeQtGrid::insertObjectIntoCollection(string newId, string newTId)
+{
+ doRepaint_ = false;
+ ObjectInfo info;
+
+ string oid = newId;
+ string uid = newId;
+ if(newTId.empty() == false)
+ {
+ uid += newTId;
+ info.uniqueMap_[uid] = 1;
+ unique2ObjectMap_[uid] = oid;
+ }
+ else
+ {
+ info.uniqueMap_[oid] = 1;
+ unique2ObjectMap_[oid] = oid;
+ }
+
+ info.status_ = 1;
+ objectMap_[oid] = info;
+
+ portalRow2UniqueIdVector_.push_back(uid);
+
+ int numRows = portalRow2UniqueIdVector_.size();
+ gridToPortalRowVector_.push_back(numRows - 1);
+ doRepaint_ = true;
+ setNumRows(numRows);
+}
+
+void TeQtGrid::deletePointedLines()
+{
+ doRepaint_ = false;
+ unsigned int i, j;
+ string oid, uid;
+ vector<string> oidVec;
+ map<string, vector<string> > uidMap;
+
+ map<string, ObjectInfo>::iterator it = objectMap_.begin();
+ while(it != objectMap_.end())
+ {
+ ObjectInfo info = (*it).second;
+ if(info.status_ == 1 || info.status_ == 3)
+ {
+ oid = (*it).first;
+ uid.clear();
+ map<string, int>::iterator uit = info.uniqueMap_.begin();
+ vector<string> uidVec;
+ while(uit != info.uniqueMap_.end())
+ {
+ if((*uit).second == 1 || (*uit).second == 3)
+ {
+ uid = (*uit).first;
+ uidVec.push_back(uid);
+ }
+ uit++;
+ }
+
+ if(uidVec.size() == 0)
+ {
+ uidVec.push_back(oid);
+ }
+ uidMap[oid] = uidVec;
+ oidVec.push_back(oid);
+ }
+ it++;
+ }
+
+ vector<string> iVec;
+ for(i=0; i<oidVec.size(); i++)
+ {
+ oid = oidVec[i];
+ ObjectInfo& info = objectMap_[oid];
+ vector<string> uidVec = uidMap[oid];
+
+ for(j=0; j<uidVec.size(); j++)
+ {
+ string s = uidVec[j];
+ iVec.push_back(s);
+ info.uniqueMap_.erase(s);
+ unique2ObjectMap_.erase(s);
+ }
+ if(info.uniqueMap_.size() == 0)
+ objectMap_.erase(oid);
+ }
+
+ vector<int> jVec;
+ vector<string> copy1(portalRow2UniqueIdVector_.begin(), portalRow2UniqueIdVector_.end());
+ portalRow2UniqueIdVector_.clear();
+ for(i=0; i<copy1.size(); i++)
+ {
+ string ps = copy1[i];
+ for(j=0; j<iVec.size(); j++)
+ {
+ string s = iVec[j];
+ if(ps == s)
+ {
+ jVec.push_back(i);
+ break;
+ }
+ }
+ if(j == iVec.size())
+ portalRow2UniqueIdVector_.push_back(ps);
+ }
+
+ vector<int> copy2(gridToPortalRowVector_.begin(), gridToPortalRowVector_.end());
+ gridToPortalRowVector_.clear();
+ for(i=0; i<copy2.size(); i++)
+ {
+ int ps = copy2[i];
+ for(j=0; j<jVec.size(); j++)
+ {
+ int s = jVec[j];
+ if(ps == s)
+ break;
+ }
+ if(j == jVec.size())
+ gridToPortalRowVector_.push_back(ps);
+ }
+
+ for(i=jVec.size()-1; (int)i>=0; i--)
+ {
+ int s = jVec[i];
+ for(j=0; j<gridToPortalRowVector_.size(); j++)
+ {
+ int ss = gridToPortalRowVector_[j];
+ if(ss >= s)
+ gridToPortalRowVector_[j] = ss - 1;
+ }
+ }
+
+ int numRows = portalRow2UniqueIdVector_.size();
+ doRepaint_ = true;
+ setNumRows(numRows);
+}
+
+bool TeQtGrid::hasPointedLine()
+{
+ map<string, ObjectInfo>::iterator it = objectMap_.begin();
+
+ while(it != objectMap_.end())
+ {
+ ObjectInfo info = (*it).second;
+ if(info.status_ == 1 || info.status_ == 3)
+ return true;
+ it++;
+ }
+
+ return false;
+}
+
+void TeQtGrid::goToLastLine()
+{
+ int nRows = numRows();
+ int iniRow = nRows - visibleLines_;
+
+ doRepaint_ = true;
+ int x = columnAt(gridX_);
+ int y = rowPos(iniRow);
+ setContentsPos(x, y);
+ refresh();
+}
+
+void TeQtGrid::goToLastColumn()
+{
+ int x = contentsWidth() - visibleWidth();
+
+ doRepaint_ = true;
+ int y = contentsY();
+ setContentsPos(x, y);
+ refresh();
+}
+
+vector<int> TeQtGrid::getSelectedColumns()
+{
+ int i, j;
+ vector<int> colVec;
+
+ for (i = 0; i < numCols(); i++)
+ {
+ if(gridColVisVector_[i])
+ {
+ if (isColumnSelected(i, true) == true)
+ {
+ j = gridToPortalColVector_[i];
+ colVec.push_back(j);
+ }
+ }
+ }
+ return colVec;
+}
+
+void TeQtGrid::arrangeColumns(TeAttrTableVector cTableVec)
+{
+ int i, j, k, m;
+ TeAttributeList CAL;
+ TeAttributeList AL;
+ vector<int> cVec;
+
+ for(i=m=0; (unsigned int)i<cTableVec.size(); i++)
+ {
+ TeTable ct = cTableVec[i];
+ CAL = ct.attributeList();
+
+ TeTable t = tableVector_[i];
+ AL = t.attributeList();
+
+ if(AL.size() > CAL.size())
+ {
+ for(j=0; (unsigned int)j<AL.size(); j++, m++)
+ {
+ TeAttribute a = AL[j];
+ for(k=0; (unsigned int)k<CAL.size(); k++)
+ {
+ TeAttribute ca = CAL[k];
+ if(TeConvertToUpperCase(a.rep_.name_) == TeConvertToUpperCase(ca.rep_.name_))
+ break;
+ }
+ if((unsigned int)k == CAL.size())
+ cVec.push_back(m);
+ }
+ }
+ else if(AL.size() < CAL.size())
+ {
+ for(j=0; (unsigned int)j<CAL.size(); j++, m++)
+ {
+ TeAttribute a = CAL[j];
+ for(k=0; (unsigned int)k<AL.size(); k++)
+ {
+ TeAttribute ca = AL[k];
+ if(TeConvertToUpperCase(a.rep_.name_) == TeConvertToUpperCase(ca.rep_.name_))
+ break;
+ }
+ if((unsigned int)k == AL.size())
+ cVec.push_back(m);
+ }
+ }
+ else
+ m += (int)AL.size();
+ }
+
+ TeAttributeList attrList = portal_->AttributeList();
+ int nCols = numCols();
+ int nOldCols = gridColVisVector_.size();
+ vector<bool> cVisVec(gridColVisVector_.begin(), gridColVisVector_.end());
+ vector<int> cSwapVec(gridToPortalColVector_.begin(), gridToPortalColVector_.end());
+ gridColVisVector_.clear();
+ gridToPortalColVector_.clear();
+
+ bool added = false;
+ if(nCols > nOldCols)
+ added = true;
+
+ std::sort(cVec.begin(), cVec.end());
+ if(cVec.size())
+ {
+ if(added)
+ {
+ for(i=nOldCols; i<nCols; i++)
+ cVisVec.push_back(true);
+ gridColVisVector_ = vector<bool>(cVisVec.begin(), cVisVec.end());
+
+ for(i=0; (unsigned int)i<cVec.size(); i++)
+ {
+ k = cVec[i];
+ for(j=0; (unsigned int)j<cSwapVec.size(); j++)
+ {
+ int v = cSwapVec[j];
+ if(v >= k)
+ cSwapVec[j] = v + 1;
+ }
+ cSwapVec.push_back(k);
+ }
+ gridToPortalColVector_ = vector<int>(cSwapVec.begin(), cSwapVec.end());
+ }
+ else
+ {
+ for(i=j=0; (unsigned int)i<cVec.size(); i++)
+ {
+ k = cVec[i];
+ while(j < k)
+ {
+ bool b = cVisVec[j];
+ gridColVisVector_.push_back(b);
+ j++;
+ }
+ j = k + 1;
+ }
+ while((unsigned int)j < cVisVec.size())
+ {
+ bool b = cVisVec[j];
+ gridColVisVector_.push_back(b);
+ j++;
+ }
+
+ for(i=0; (unsigned int)i<cVec.size(); i++)
+ {
+ k = cVec[i];
+ for(j=0; (unsigned int)j<cSwapVec.size(); j++)
+ {
+ int kk = cSwapVec[j];
+ if(kk != k)
+ gridToPortalColVector_.push_back(kk);
+ }
+ cSwapVec.clear();
+ cSwapVec = vector<int>(gridToPortalColVector_.begin(), gridToPortalColVector_.end());
+ gridToPortalColVector_.clear();
+ }
+
+ for(i = (int)cVec.size() - 1; i>=0; i--)
+ {
+ k = cVec[i];
+ for(j=0; (unsigned int)j<cSwapVec.size(); j++)
+ {
+ int v = cSwapVec[j];
+ if(v >= k)
+ cSwapVec[j] = v - 1;
+ }
+ }
+ gridToPortalColVector_ = vector<int>(cSwapVec.begin(), cSwapVec.end());
+ }
+ }
+ else
+ {
+ // Set the vector that will contain the order the
+ // grid columns will be shown
+ gridToPortalColVector_.clear();
+ gridColVisVector_.clear();
+ for (i = 0; i < nCols; i++)
+ {
+ gridToPortalColVector_.push_back(i);
+ gridColVisVector_.push_back(true);
+ }
+ }
+}
+
+void TeQtGrid::arrangeGridToPortalRowVector(int col)
+{
+ int i, p, pp;
+ string id, s, ss;
+
+ portal_->freeResult();
+ if (!portal_->query(sql_))
+ {
+ delete portal_;
+ portal_ = 0;
+ return;
+ }
+
+ if(isSortBy(col) == false)
+ return;
+
+ vector<int> cGridToPortal(gridToPortalRowVector_.begin(), gridToPortalRowVector_.end());
+ vector<string> cPortalToUnique(portalRow2UniqueIdVector_.begin(), portalRow2UniqueIdVector_.end());
+ gridToPortalRowVector_.clear();
+ portalRow2UniqueIdVector_.clear();
+
+ while (portal_->fetchRow())
+ {
+ id = portal_->getData(uniqueIdPos_);
+ if(id.empty())
+ id = portal_->getData(objectIdPos_);
+ portalRow2UniqueIdVector_.push_back(id);
+ }
+
+ vector<string>::iterator it;
+ for(i=0; (unsigned int)i<cGridToPortal.size(); i++)
+ {
+ p = cGridToPortal[i];
+ s = cPortalToUnique[p];
+ ss = portalRow2UniqueIdVector_[p];
+ if(s == ss)
+ gridToPortalRowVector_.push_back(p);
+ else
+ {
+ it = std::find(portalRow2UniqueIdVector_.begin(), portalRow2UniqueIdVector_.end(), s);
+ if(it != portalRow2UniqueIdVector_.end())
+ pp = it - portalRow2UniqueIdVector_.begin();
+
+ gridToPortalRowVector_.push_back(pp);
+ }
+ }
+}
+
+void TeQtGridItem::paint(QPainter* p, const QColorGroup& cg,
+ const QRect& cr, bool selected)
+{
+ QColorGroup g(cg);
+ g.setColor( QColorGroup::Base, color_);
+ QTableItem :: paint(p, g, cr, selected);
+}
+
+
+
+
+
diff --git a/src/terralib/application/qt/TeQtGrid.h b/src/terralib/application/qt/TeQtGrid.h
new file mode 100644
index 0000000..ff89198
--- /dev/null
+++ b/src/terralib/application/qt/TeQtGrid.h
@@ -0,0 +1,251 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTGRID_H
+#define __TERRALIB_INTERNAL_QTGRID_H
+
+#include <qwidget.h>
+#include <qtable.h>
+#include <qcolor.h>
+#include <qlabel.h>
+#include <qpopupmenu.h>
+#include <vector>
+#include <map>
+#include <set>
+#include <string>
+#include "TeDatabase.h"
+#include "TeThemeApplication.h"
+#include "TeApplicationUtils.h"
+
+using namespace std;
+
+class TeQtGrid : public QTable
+{
+ Q_OBJECT
+
+protected:
+ TeDatabase *db_;
+ TeThemeApplication *theme_;
+ TeDatabasePortal *portal_;
+ string sqlJoin_;
+ string orderBy_;
+ string sql_;
+ string CT_;
+ string CTE_;
+ vector<string> indexVector_;
+ vector<TeTable> tableVector_;
+ bool editing_;
+ bool doRefresh_;
+ bool doRepaint_;
+ bool shiftKeyPressed_;
+ bool showGridInformation_;
+ int uniqueIdPos_;
+ int objectIdPos_;
+ int resultIdPos_;
+ int gridStatusPos_;
+ int gridX_, gridY_;
+ int iLine_, fLine_;
+ int iCol_, fCol_;
+ int gridWidth_, gridHeight_;
+ int visibleLines_, visibleCols_;
+ long lastLinePressed_;
+ long dragLineReleased_;
+ map<string, ObjectInfo> objectMap_;
+ map<string, string> unique2ObjectMap_;
+ vector<int> gridToPortalRowVector_;
+ vector<int> gridToPortalColVector_;
+ vector<bool> gridColVisVector_;
+ vector<string> portalRow2UniqueIdVector_;
+ int rowToEdit_;
+ int colToEdit_;
+ bool verticalEdition_;
+ QPopupMenu *popupHorizHeader_;
+ QPopupMenu *popupVertHeader_;
+ QPopupMenu *popupViewport_;
+ bool columnDragEnabled_;
+ bool mousePressedOnHorizontalHeader_;
+
+ virtual bool eventFilter(QObject*, QEvent*);
+
+ virtual void drawContents (QPainter *qp, int clipx, int clipy,
+ int clipw, int cliph);
+
+ void sort(vector<int> cols, string order);
+
+ bool writeCell();
+
+ void editNextRow();
+
+ void editNextColumn();
+
+ void update();
+
+ void goToEditNewCell();
+
+ virtual void endEdit(int row, int col, bool accept, bool replace);
+
+ void arrangeColumns(TeAttrTableVector cTableVec);
+
+public:
+
+ bool autoPromote_;
+
+ TeQtGrid (QWidget* parent = 0, const char* name = 0);
+
+ ~TeQtGrid();
+
+ void init(TeThemeApplication *theme);
+
+ void initPortal();
+
+ void updatePortalContents();
+
+ QPopupMenu* popupHorizHeader()
+ { return popupHorizHeader_; }
+
+ QPopupMenu* popupVertHeader()
+ { return popupVertHeader_; }
+
+ QPopupMenu* popupViewport()
+ { return popupViewport_; }
+
+ TeDatabasePortal* getPortal()
+ { return portal_; }
+ TeThemeApplication* getTheme()
+ { return theme_;}
+
+
+ bool isIndex(int col);
+
+ bool isDateTimeRegistered(int col);
+
+ bool isSortBy(int col);
+
+ bool isExternalTable(int col);
+
+ TeTable& findTable(int col);
+
+ TeTable& findTable(string colName);
+
+ void adjustColumns();
+
+ void swapColumns(int col1 = -1, int col2 = -1);
+
+ int getColumn(int col) {return gridToPortalColVector_[col];}
+
+ void setVisColumn (bool vis, int col=-1);
+
+ bool getVisColumn (int col);
+
+ void putColorOnGrid(set<string> uniqueIdSet, set<string> objectIdSet, string operation, string attrQuery = "");
+
+ void setVerticalEdition(bool flag);
+
+ void refresh();
+
+ void clear();
+
+ void clearPortal();
+
+ string getObject(int row);
+
+ bool isVerticalEdition() { return verticalEdition_; }
+
+ bool showGridInformation() { return showGridInformation_;}
+
+ void showGridInformation(bool b) { showGridInformation_ = b;}
+
+ void gridInformation ();
+
+ void insertObjectIntoCollection(string newId, string newTId = "");
+
+ void goToLastLine();
+
+ void goToLastColumn();
+
+ bool hasPointedLine();
+
+ void deletePointedLines();
+
+ vector<int> getSelectedColumns();
+
+ void arrangeGridToPortalRowVector(int col);
+
+public slots:
+ void mouseReleasedOnVerticalHeaderSlot(int lin);
+
+ void promotePointedObjectsSlot();
+
+ void promoteQueriedObjectsSlot();
+
+ void sortAscOrderSlot();
+
+ void sortDescOrderSlot();
+
+ void removeQueryColorSlot();
+
+ void removePointingColorSlot();
+
+ void scrollToPrevPointedObjectSlot();
+
+ void scrollToNextPointedObjectSlot();
+
+ void scrollToPrevQueriedObjectSlot();
+
+ void scrollToNextQueriedObjectSlot();
+
+ void invertSelectionSlot();
+
+protected slots:
+ void columnWidthChanged(int col);
+
+signals:
+ void putColorOnObject(TeThemeApplication*, set<string>&);
+ void horizHeaderSignal(int);
+ void vertHeaderSignal(int);
+ void viewportSignal();
+ void vertHeaderLeftDblClickSignal(int);
+ void linkTable(string, string, string);
+ void gridChangedSignal();
+ void displayGridInformation(QString);
+ void clearGridInformation();
+};
+
+
+
+
+class TeQtGridItem : public QTableItem
+{
+ QColor color_;
+
+public:
+ TeQtGridItem(QTable *t, EditType et, const QString &txt)
+ : QTableItem( t, et, txt )
+ {}
+
+ void setColor(QColor& c)
+ { color_.setRgb(c.red(), c.green(), c.blue()); }
+
+ void paint(QPainter *p, const QColorGroup &cg,
+ const QRect &cr, bool selected );
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtLatEdit.cpp b/src/terralib/application/qt/TeQtLatEdit.cpp
new file mode 100644
index 0000000..b187d97
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLatEdit.cpp
@@ -0,0 +1,131 @@
+#include <qregexp.h>
+#include <qstringlist.h>
+#include <math.h>
+
+#include "TeQtLatEdit.h"
+
+TeQtLatEdit::TeQtLatEdit(QWidget* parent, const char *name)
+ :QLineEdit(parent, name)
+{}
+
+bool
+TeQtLatEdit::decode(QString lado, short& dg, short& mn, float& sc, double& grauDec)
+{
+ short posat,lim = 90;
+
+ double dd,pi;
+ posat = 0;
+ pi = 4.*atan((double)1.);
+
+ // Longitude
+ if(dg < 0 || dg > lim)
+ return false;
+
+ if(mn < 0 || mn > 60)
+ return false;
+
+ if(sc < 0. || sc > 60.)
+ return false;
+
+ if(lado == "s" || lado == "S")
+ {
+ if(dg > 0) dg = dg * -1;
+ else if(mn > 0) mn = mn * -1;
+ else sc = sc * -1.;
+ }
+
+ dd = (double)(abs(dg)) + ((double)abs(mn)/60.) + fabs(sc)/3600.;
+ if (dg < 0 || mn < 0 || (int)sc < 0)
+ dd = -dd;
+
+// dd = dd*pi/180.;
+ grauDec = dd;
+ return true;
+}
+
+
+void TeQtLatEdit::focusOutEvent( QFocusEvent *e )
+{
+ int mat;
+ QString str = text();
+ QStringList myList;
+ QRegExp exp1("^[nNsS][ ]\\d\\d?\\d?[ ]?\\d?\\d?[ ]?\\d?\\d?\\.?[0-9]?" );
+ QRegExp exp2("^[nNsS][;]\\d\\d?\\d?[;]?\\d?\\d?[;]?\\d?\\d?\\.?[0-9]?" );
+ QRegExp exp3("^[nNsS][:]\\d\\d?\\d?[:]?\\d?\\d?[:]?\\d?\\d?\\.?[0-9]?" );
+ QRegExp exp4("^[+-]?\\d\\d?\\d?\\.?[0-9]?" );
+ QString echo_;
+
+ double grauDec;
+
+ if ( (mat=exp1.match( str )) != -1 )
+ {
+ myList = QStringList::split(" ",str);
+ }
+ else if ((mat=exp2.match( str )) != -1 )
+ {
+ myList = QStringList::split(";",str);
+ }
+ else if ((mat=exp3.match( str )) != -1 )
+ {
+ myList = QStringList::split(":",str);
+ }
+ else if ((mat=exp4.match( str )) != -1 )
+ {
+ grauDec = str.toDouble();
+ if ((grauDec >= -90.0 && grauDec <=90.0))
+ {
+ echo_.sprintf("%3.10f",grauDec);
+ setText(echo_);
+ emit coordValidator(grauDec);
+ return;
+ }
+ else
+ {
+ setSelection( 0, text().length() );
+ emit coordValidator(TeLATINVALID);
+ return;
+ }
+ }
+ else
+ {
+ setSelection( 0, text().length() );
+ emit coordValidator(TeLATINVALID);
+ return;
+ }
+
+ int nelementos = myList.count();
+ short graus, minutos = 0;
+ float segundos = 0.0;
+
+ graus = myList[1].toShort();
+
+ if (nelementos > 2)
+ minutos = myList[2].toShort();
+
+ if (nelementos > 3)
+ segundos = myList[3].toFloat();
+
+ bool dec = decode(myList[0],graus, minutos, segundos, grauDec);
+ if (dec)
+ {
+ echo_.sprintf("%s %d %d %2.2f",(const char*) myList[0], abs(graus), minutos, segundos);
+ setText(echo_);
+ emit coordValidator(grauDec);
+ return;
+ }
+ else
+ {
+ setSelection( 0, text().length() );
+ emit coordValidator(TeLATINVALID);
+ return;
+ }
+}
+
+void TeQtLatEdit::keyPressEvent( QKeyEvent *e )
+{
+ QLineEdit::keyPressEvent( e );
+ if ( e->key() == Key_Enter || e->key() == Key_Return )
+ {
+ emit focusOutEvent(0);
+ }
+}
\ No newline at end of file
diff --git a/src/terralib/application/qt/TeQtLatEdit.h b/src/terralib/application/qt/TeQtLatEdit.h
new file mode 100644
index 0000000..2b02b2a
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLatEdit.h
@@ -0,0 +1,24 @@
+#ifndef TEQTLATEDIT_H
+#define TEQTLATEDIT_H
+
+#include <qlineedit.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+#define TeLATINVALID -99.99
+
+class TeQtLatEdit : public QLineEdit
+{
+ Q_OBJECT
+public:
+ TeQtLatEdit(QWidget * parent, const char* name);
+ bool decode(QString lado, short& dg, short& mn, float& sc, double& grauDec);
+
+protected:
+ void focusOutEvent( QFocusEvent *e );
+ void keyPressEvent( QKeyEvent *e );
+
+signals:
+ void coordValidator(const double&);
+};
+#endif
\ No newline at end of file
diff --git a/src/terralib/application/qt/TeQtLayerItem.cpp b/src/terralib/application/qt/TeQtLayerItem.cpp
new file mode 100644
index 0000000..12b8c57
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLayerItem.cpp
@@ -0,0 +1,43 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtLayerItem.h>
+#include <qpixmap.h>
+#include <images/infolayer.xpm>
+
+
+//Layer item constructor
+TeQtLayerItem::TeQtLayerItem(QListViewItem *parent,
+ QString name, TeLayer* layer)
+ : TeQtCheckListItem(parent,name), layer_(layer)
+{
+ type_ = INFOLAYER;
+ QPixmap p(infolayer_xpm);
+ setPixmap(0,p);
+ setRenameEnabled(0,true);
+ sortChildItems(0, true);
+ setSelected(false);
+ setEnabled(true);
+}
+
+
+
+
diff --git a/src/terralib/application/qt/TeQtLayerItem.h b/src/terralib/application/qt/TeQtLayerItem.h
new file mode 100644
index 0000000..8410d7d
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLayerItem.h
@@ -0,0 +1,49 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTLAYERITEM_H
+#define __TERRALIB_INTERNAL_QTLAYERITEM_H
+
+#include <TeQtCheckListItem.h>
+
+class TeLayer;
+
+
+class TeQtLayerItem : public TeQtCheckListItem
+{
+public:
+ TeQtLayerItem(QListViewItem *parent, QString text, TeLayer* layer);
+
+ ~TeQtLayerItem () {}
+
+ int compare(QListViewItem * i, int col, bool ascending) const
+ { return QListViewItem::compare(i, col, ascending); }
+
+ QString key(int col, bool ascending) const
+ { return QListViewItem::key(col, ascending); }
+
+ TeLayer* getLayer() {return layer_;}
+
+protected:
+ TeLayer *layer_;
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtLegendItem.cpp b/src/terralib/application/qt/TeQtLegendItem.cpp
new file mode 100644
index 0000000..9167c6c
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLegendItem.cpp
@@ -0,0 +1,319 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtLegendItem.h>
+#include <TeQtViewsListView.h>
+#include <TeLegendEntry.h>
+#include <qpixmap.h>
+#include <qpainter.h>
+#include <qbitmap.h>
+#include <qimage.h>
+
+
+//Legend item constructor
+TeQtLegendItem::TeQtLegendItem(QListViewItem *parent,
+ QString text, TeLegendEntry *legendEntry)
+ : TeQtCheckListItem(parent, text), legendEntry_(legendEntry)
+{
+ type_ = LEGEND;
+ setRenameEnabled(0,true);
+ setSelected(false);
+ setEnabled(true);
+
+ order_ = parent->childCount();
+
+ if (legendEntry_ != 0)
+ createPixmap();
+}
+
+
+void TeQtLegendItem::createPixmap()
+{
+ int ww = 21;
+ int pixh = 16;
+ int pixw = ww;
+
+ QPixmap pixmap(ww, pixh);
+ pixmap.fill();
+
+// TePOLYGONS = 1, TeLINES = 2, TePOINTS = 4, TeCELLS = 256
+ bool hasPolygons = true;
+ bool hasCells = true;
+ bool hasLines = true;
+ bool hasPoints = true;
+
+ if(legendEntry_->to().find("mean = ") == string::npos)
+ {
+ TeGeomRepVisualMap vm = legendEntry_->getVisualMap();
+ if(vm.find(TePOLYGONS) == vm.end())
+ {
+ hasPolygons = false;
+ hasCells = false;
+ }
+ if(vm.find(TeLINES) == vm.end())
+ hasLines = false;
+ if(vm.find(TePOINTS) == vm.end())
+ hasPoints = false;
+
+ if ((hasPolygons || hasCells) && (hasLines == false) && (hasPoints == false))
+ drawPolygonRep(pixw, pixh, 0, &pixmap);
+ else if ((hasPolygons || hasCells) && (hasLines == true) && (hasPoints == false))
+ {
+ pixmap.resize(2*ww, pixh);
+ pixmap.fill();
+ drawPolygonRep(pixw, pixh, 0, &pixmap);
+ drawLineRep(pixw, pixh, ww, &pixmap);
+ }
+ else if ((hasPolygons || hasCells) && (hasLines == false) && (hasPoints == true))
+ {
+ pixmap.resize(2*ww, pixh);
+ pixmap.fill();
+ drawPolygonRep(pixw, pixh, 0, &pixmap);
+ drawPointRep(pixw, pixh, ww, &pixmap);
+ }
+ else if ((hasPolygons || hasCells) && (hasLines == true) && (hasPoints == true))
+ {
+ pixmap.resize(3*ww, pixh);
+ pixmap.fill();
+ drawPolygonRep(pixw, pixh, 0, &pixmap);
+ drawLineRep(pixw, pixh, ww, &pixmap);
+ drawPointRep(pixw, pixh, 2*ww, &pixmap);
+ }
+ else if (hasPolygons == false && hasCells == false && hasLines == true && hasPoints == false)
+ drawLineRep(pixw, pixh, 0, &pixmap);
+ else if (hasPolygons == false && hasCells == false && hasLines == false && hasPoints == true)
+ drawPointRep(pixw, pixh, 0, &pixmap);
+ else if (hasPolygons == false && hasCells == false && hasLines == true && hasPoints == true)
+ {
+ pixmap.resize(2*ww, pixh);
+ pixmap.fill();
+ drawLineRep(pixw, pixh, 0, &pixmap);
+ drawPointRep(pixw, pixh, ww, &pixmap);
+ }
+ }
+ setPixmap(0, pixmap);
+}
+
+
+void TeQtLegendItem::changeVisual(TeLegendEntry *legendEntry)
+{
+ legendEntry_ = legendEntry;
+ createPixmap();
+}
+
+
+void TeQtLegendItem::drawPolygonRep(int w, int h, int offset, QPixmap *pixmap)
+{
+ QPainter p(pixmap);
+ QBrush brush;
+ QColor cor;
+ TeColor tcor;
+ Qt::BrushStyle style;
+
+ TeVisual& visual = legendEntry_->visual(TePOLYGONS);
+ int transp = 255 - (visual.transparency() * 255 / 100);
+ tcor = visual.color();
+ cor.setRgb(tcor.red_, tcor.green_, tcor.blue_);
+ TeQtViewsListView* viewsListView = (TeQtViewsListView*) listView();
+ map<TePolyBasicType, Qt::BrushStyle>& brushMap = viewsListView->getBrushStyleMap();
+
+ style = brushMap[(TePolyBasicType)(legendEntry_->visual(TePOLYGONS).style())];
+ brush.setStyle(style);
+ brush.setColor(cor);
+
+ QRect trect(offset+1, 1, w-2, h-2);
+ QRect rect(0, 0, offset+w-1, h-1);
+
+ int width = rect.width();
+ int height = rect.height();
+
+ int r = width%8;
+ if(r)
+ width += (8-r);
+ r = height%8;
+ if(r)
+ height += (8-r);
+
+ if(width == 0)
+ width = 8;
+ if(height == 0)
+ height = 8;
+
+ QBitmap bm;
+ bm.resize(width, height);
+ //Fill bitmap with 0-bits: clipping region
+ bm.fill(Qt::color0);
+ QPainter maskPainter(&bm);
+
+ // Draw bitmap with 1-bits: drawing region
+ QBrush bs(Qt::color1, style);
+ QPen pen(Qt::color1, 1);
+ maskPainter.setPen(pen);
+ maskPainter.fillRect(trect, bs);
+ maskPainter.end();
+
+ QRegion clipRegion(bm);
+ p.setClipRegion(clipRegion);
+
+ if(visual.transparency() == 0)
+ p.fillRect(trect, brush);
+ else
+ {
+ // set alpha buffer and color
+ QImage img(rect.width(), rect.height(), 32);
+ unsigned int val = (transp << 24) | (cor.red() << 16) | (cor.green() << 8) | cor.blue();
+ img.fill(val);
+ img.setAlphaBuffer(true);
+
+ // plot transparency
+ p.drawPixmap(trect.x(), trect.y(), img);
+ }
+ p.setClipping(false);
+
+ Qt::PenStyle pstyle;
+ uint pwidth;
+
+ tcor = visual.contourColor();
+ cor.setRgb(tcor.red_, tcor.green_, tcor.blue_);
+ pen.setColor(cor);
+
+ map<TeLnBasicType, Qt::PenStyle>& penMap = viewsListView->getPenStyleMap();
+ pstyle = penMap[(TeLnBasicType)(visual.contourStyle())];
+ pen.setStyle(pstyle);
+
+ pwidth = (Qt::PenStyle) visual.contourWidth();
+ pen.setWidth (pwidth);
+
+ p.setPen(pen);
+ p.drawRect (offset+1+pwidth/2,1+pwidth/2,w-2-pwidth/2,h-2-pwidth/2);
+
+ p.end();
+}
+
+void TeQtLegendItem::drawLineRep( int w, int h, int offset, QPixmap *pixmap)
+{
+ QPainter p(pixmap);
+ QPen pen;
+ QColor cor;
+ TeColor tcor;
+ Qt::PenStyle style;
+ uint width;
+
+ TeVisual& visual = legendEntry_->visual(TeLINES);
+
+ tcor = visual.color();
+ cor.setRgb(tcor.red_, tcor.green_, tcor.blue_);
+ pen.setColor(cor);
+
+ TeQtViewsListView* viewsListView = (TeQtViewsListView*) listView();
+ map<TeLnBasicType, Qt::PenStyle>& penMap = viewsListView->getPenStyleMap();
+
+ style = penMap[(TeLnBasicType)(legendEntry_->visual(TeLINES).style())];
+ pen.setStyle(style);
+
+ width = (Qt::PenStyle) legendEntry_->visual(TeLINES).width();
+ pen.setWidth (width);
+
+ p.setPen(pen);
+ p.moveTo(offset+1, h-2);
+ p.lineTo(offset+w/3, 1);
+ p.lineTo(offset+w/3*2, h-3);
+ p.lineTo(offset+w-2, 1);
+ p.end();
+}
+
+
+void TeQtLegendItem::drawPointRep( int pw, int ph, int offset, QPixmap *pixmap)
+{
+ QPainter painter(pixmap);
+ QColor cor;
+ TeColor tcor;
+
+ TeVisual& visual = legendEntry_->visual(TePOINTS);
+ tcor = visual.color();
+ cor.setRgb(tcor.red_, tcor.green_, tcor.blue_);
+ int s = visual.style();
+
+ int w = visual.size();
+ QPoint p;
+ p.setX(offset+pw/2);
+ p.setY(ph/2-1);
+
+ painter.setPen(cor);
+ if (s == TePtTypePlus)
+ {
+ painter.drawLine (p.x()-w/2,p.y(),p.x()+w/2,p.y());
+ painter.drawLine (p.x(),p.y()-w/2,p.x(),p.y()+w/2);
+ }
+ else if (s == TePtTypeStar)
+ {
+ painter.save ();
+ painter.translate (p.x(),p.y());
+ painter.drawLine (0,-w/2,0,w/2);
+ painter.rotate (45);
+ painter.drawLine (0,-w/2,0,w/2);
+ painter.rotate (-90);
+ painter.drawLine (0,-w/2,0,w/2);
+ painter.restore ();
+ }
+ else if (s == TePtTypeCircle)
+ {
+ painter.setBrush(cor);
+ painter.drawChord (p.x()-w/2,p.y()-w/2,w,w,0,360*16);
+ }
+ else if (s == TePtTypeX)
+ {
+ painter.drawLine (p.x()-w/2,p.y()-w/2,p.x()+w/2,p.y()+w/2);
+ painter.drawLine (p.x()-w/2,p.y()+w/2,p.x()+w/2,p.y()-w/2);
+ }
+ else if (s == TePtTypeBox)
+ {
+ painter.fillRect (p.x()-w/2,p.y()-w/2,w,w,cor);
+ }
+ else if (s == TePtTypeDiamond)
+ {
+ QPointArray pa(5);
+ pa.setPoint(0, p.x()-w/2, p.y());
+ pa.setPoint(1, p.x(), p.y()-w/2);
+ pa.setPoint(2, p.x()+w/2, p.y());
+ pa.setPoint(3, p.x(), p.y()+w/2);
+ pa.setPoint(4, p.x()-w/2, p.y());
+ painter.setBrush(cor);
+ painter.drawPolygon(pa);
+ }
+ else if (s == TePtTypeHollowCircle)
+ {
+ painter.drawArc (p.x()-w/2,p.y()-w/2,w,w,0,360*16);
+ }
+ else if (s == TePtTypeHollowBox)
+ {
+ painter.setBrush(Qt::NoBrush);
+ painter.drawRect (p.x()-w/2,p.y()-w/2,w,w);
+ }
+ else if (s == TePtTypeHollowDiamond)
+ {
+ painter.drawLine (p.x()-w/2,p.y(),p.x(),p.y()-w/2);
+ painter.drawLine (p.x(),p.y()-w/2,p.x()+w/2,p.y());
+ painter.drawLine (p.x()+w/2,p.y(),p.x(),p.y()+w/2);
+ painter.drawLine (p.x(),p.y()+w/2,p.x()-w/2,p.y());
+ }
+ painter.end();
+}
diff --git a/src/terralib/application/qt/TeQtLegendItem.h b/src/terralib/application/qt/TeQtLegendItem.h
new file mode 100644
index 0000000..a21ba3f
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLegendItem.h
@@ -0,0 +1,71 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTLEGENDITEM_H
+#define __TERRALIB_INTERNAL_QTLEGENDITEM_H
+
+#include <TeQtCheckListItem.h>
+
+class TeLegendEntry;
+
+
+class TeQtLegendItem : public TeQtCheckListItem
+{
+public:
+ TeQtLegendItem(QListViewItem *parent, QString text, TeLegendEntry *legendEntry);
+
+ ~TeQtLegendItem() {}
+
+ TeLegendEntry* legendEntry()
+ { return legendEntry_; }
+
+ void changeVisual(TeLegendEntry *legendEntry);
+
+protected:
+ TeLegendEntry *legendEntry_;
+
+ void createPixmap();
+
+ void drawPolygonRep(int w, int h, int offset, QPixmap *pixmap);
+
+ void drawLineRep(int w, int h, int offset, QPixmap *pixmap);
+
+ void drawPointRep(int w, int h, int offset, QPixmap *pixmap);
+};
+
+
+class TeQtLegendTitleItem : public TeQtCheckListItem
+{
+public:
+ TeQtLegendTitleItem(QListViewItem *parent, QString text)
+ : TeQtCheckListItem(parent, text)
+ {
+ type_ = LEGENDTITLE;
+ setRenameEnabled(0,true);
+ order_ = parent->childCount();
+ }
+
+ ~TeQtLegendTitleItem() {}
+};
+
+
+
+#endif
diff --git a/src/terralib/application/qt/TeQtLongEdit.cpp b/src/terralib/application/qt/TeQtLongEdit.cpp
new file mode 100644
index 0000000..12be58b
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLongEdit.cpp
@@ -0,0 +1,130 @@
+#include <qregexp.h>
+#include <qstringlist.h>
+#include <math.h>
+
+#include "TeQtLongEdit.h"
+
+TeQtLongEdit::TeQtLongEdit(QWidget * parent, const char *name)
+ :QLineEdit(parent, name)
+{}
+
+bool
+TeQtLongEdit::decode(QString lado, short& dg, short& mn, float& sc, double& grauDec)
+{
+ short posat,lim = 180;
+
+ double dd,pi;
+ posat = 0;
+ pi = 4.*atan((double)1.);
+
+ // Longitude
+ if(dg < 0 || dg > lim)
+ return false;
+
+ if(mn < 0 || mn > 60)
+ return false;
+
+ if(sc < 0. || sc > 60.)
+ return false;
+
+ if(lado == "W" || lado == "w"|| lado == "O"|| lado == "o")
+ {
+ if(dg > 0) dg = dg * -1;
+ else if(mn > 0) mn = mn * -1;
+ else sc = sc * -1.;
+ }
+
+ dd = (double)(abs(dg)) + ((double)abs(mn)/60.) + fabs(sc)/3600.;
+ if (dg < 0 || mn < 0 || (int)sc < 0)
+ dd = -dd;
+
+// dd = dd*pi/180.;
+ grauDec = dd;
+ return true;
+}
+
+
+void TeQtLongEdit::focusOutEvent( QFocusEvent *e )
+{
+ int mat;
+ QString str = text();
+ QStringList myList;
+ QRegExp exp1("^[oOwWeElL][ ]\\d\\d?\\d?[ ]?\\d\\d?[ ]?\\d?\\d?\\.?[0-9]?" );
+ QRegExp exp2("^[oOwWeElL][;]\\d\\d?\\d?[;]?\\d\\d?[;]?\\d?\\d?\\.?[0-9]?" );
+ QRegExp exp3("^[oOwWeElL][:]\\d\\d?\\d?[:]?\\d\\d?[:]?\\d?\\d?\\.?[0-9]?" );
+ QRegExp exp4("^[+-]?\\d\\d?\\d?\\.?[0-9]?" );
+
+ double grauDec;
+ QString echo_;
+
+ if ( (mat=exp1.match( str )) != -1 )
+ {
+ myList = QStringList::split(" ",str);
+ }
+ else if ((mat=exp2.match( str )) != -1 )
+ {
+ myList = QStringList::split(";",str);
+ }
+ else if ((mat=exp3.match( str )) != -1 )
+ {
+ myList = QStringList::split(":",str);
+ }
+ else if ((mat=exp4.match( str )) != -1 )
+ {
+ grauDec = str.toDouble();
+ if ((grauDec >= -180.0 && grauDec <=180.0))
+ {
+ echo_.sprintf("%3.10f",grauDec);
+ setText(echo_);
+ emit coordValidator(grauDec);
+ return;
+ }
+ else
+ {
+ setSelection( 0, text().length() );
+ emit coordValidator(TeLONGINVALID);
+ return;
+ }
+ }
+ else
+ {
+ setSelection( 0, text().length() );
+ emit coordValidator(TeLONGINVALID);
+ return;
+ }
+ int nelementos = myList.count();
+ short graus, minutos = 0;
+ float segundos = 0.0;
+
+ graus = myList[1].toShort();
+
+ if (nelementos > 2)
+ minutos = myList[2].toShort();
+
+ if (nelementos > 3)
+ segundos = myList[3].toFloat();
+
+ bool dec = decode(myList[0],graus, minutos, segundos, grauDec);
+ if (dec)
+ {
+ echo_.sprintf("%s %d %d %2.2f",(const char*) myList[0], abs(graus), minutos, segundos);
+ setText(echo_);
+ emit coordValidator(grauDec);
+ return;
+ }
+ else
+ {
+ setSelection( 0, text().length() );
+ emit coordValidator(TeLONGINVALID);
+ return;
+ }
+}
+
+void TeQtLongEdit::keyPressEvent( QKeyEvent *e )
+{
+ QLineEdit::keyPressEvent( e );
+ if ( e->key() == Key_Enter || e->key() == Key_Return )
+ {
+ emit focusOutEvent(0);
+ }
+}
\ No newline at end of file
diff --git a/src/terralib/application/qt/TeQtLongEdit.h b/src/terralib/application/qt/TeQtLongEdit.h
new file mode 100644
index 0000000..04cfb13
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLongEdit.h
@@ -0,0 +1,24 @@
+#ifndef TEQTLONGEDIT_H
+#define TEQTLONGEDIT_H
+
+#include <qlineedit.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+#define TeLONGINVALID -999.99
+
+class TeQtLongEdit : public QLineEdit
+{
+ Q_OBJECT
+public:
+ TeQtLongEdit(QWidget *parent, const char* name);
+ bool decode(QString lado, short& dg, short& mn, float& sc, double& grauDec);
+
+protected:
+ void focusOutEvent( QFocusEvent *e );
+ void keyPressEvent( QKeyEvent *e );
+
+signals:
+ void coordValidator(const double&);
+};
+#endif
\ No newline at end of file
diff --git a/src/terralib/application/qt/TeQtMethods.cpp b/src/terralib/application/qt/TeQtMethods.cpp
new file mode 100644
index 0000000..961cf06
--- /dev/null
+++ b/src/terralib/application/qt/TeQtMethods.cpp
@@ -0,0 +1,98 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+
+#include "TeSTElementSet.h"
+#include "TeQtMethods.h"
+#include "TeSkaterFunctions.h"
+#include "TeQtTerraStat.h"
+#include "TeQtGrid.h"
+#include "TeSTEFunctionsDB.h"
+#include <qobject.h>
+#include <qapplication.h>
+
+/////////////////////////////////////////////////////////////////////////////////////
+
+
+bool TeSkaterMethod::apply(vector<double>& het) {
+
+
+
+ if (this->hasPop_) {
+ this->attrVector_.push_back(this->attrPop_);
+ }
+
+ TeSTElementSet stoSet(regTheme_);
+
+ if (!TeSTOSetBuildDB(&stoSet, true, false, attrVector_)) {
+ QMessageBox::critical(NULL, tr("Error"),
+ tr("Unexpected: Regions and attributes could not be loaded!"));
+ return false;
+ }
+
+ if (!TeSkaterFunction(this->hasPop_, this->type_, this->nClusters_, this->minPop_,
+ stoSet, this->resName_, het) ) {
+ QMessageBox::critical(NULL, tr("Error"),
+ tr("Choose a connected graph!"));
+ return false;
+ }
+
+ double h;
+ for(unsigned int i = 0; i < het.size(); i++) {
+ h = het[i];
+ }
+
+
+ if (!insertPropertyColumn(stoSet, tableName_, resName_) )
+ {
+ QMessageBox::critical(NULL, tr("Error"),
+ tr("Error storing results. Check result column name!"));
+ return false;
+ }
+
+ // ---------------------------------------------- load updated table from database
+ // Update all the themes that uses this table
+ TeViewMap& viewMap = regTheme_->layer()->database()->viewMap();
+ TeViewMap::iterator it;
+ set<TeLayer*> layerSet;
+ for (it = viewMap.begin(); it != viewMap.end(); ++it)
+ {
+ TeView *view = it->second;
+ vector<TeViewNode*>& themesVector = view->themes();
+ for (unsigned int i = 0; i < themesVector.size(); ++i)
+ {
+ TeTheme *theme = (TeThemeApplication*)themesVector[i];
+ if (theme->isThemeTable(tableName_) == true)
+ {
+ theme->loadThemeTables();
+ layerSet.insert(theme->layer());
+ }
+ }
+ }
+
+ // Update the layer tables affected
+ set<TeLayer*>::iterator setIt;
+ for (setIt = layerSet.begin(); setIt != layerSet.end(); ++setIt)
+ (*setIt)->loadLayerTables();
+
+ return true;
+}
+
diff --git a/src/terralib/application/qt/TeQtMethods.h b/src/terralib/application/qt/TeQtMethods.h
new file mode 100644
index 0000000..d0a3860
--- /dev/null
+++ b/src/terralib/application/qt/TeQtMethods.h
@@ -0,0 +1,64 @@
+#ifndef __TERRALIB_INTERNAL_QTTERRAMETHODS_H
+#define __TERRALIB_INTERNAL_QTTERRAMETHODS_H
+/***
+ * Implementa suporte para as funcoes do TerraStat
+ * Objetivo -- soh nao manter a parte de geracao de eventos,
+ * etc no ui, que podera ser reaproveitado.
+ ****/
+
+#include "TeDatabase.h"
+#include "TeKernelParams.h"
+#include <qapplication.h>
+
+/////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////
+class TeThemeApplication;
+class TeQtGrid;
+
+class TeSkaterMethod : public QWidget {
+
+ Q_OBJECT
+
+protected:
+ //Method params
+ TeTheme* regTheme_; //Tema de regioes
+ vector<string> attrVector_; //Atributos a serem utilizados
+ bool hasPop_; //Usa populacao
+ string attrPop_; //Atributo de populacao
+ int type_;
+ int minPop_;
+ int nClusters_;
+ string tableName_;
+ string resName_;
+
+public:
+
+ bool setTheme(string name, TeView* view) {
+ regTheme_ = view->get(name);
+ return (regTheme_ != NULL);
+ }
+
+ void setAttrVector(const vector<string>& vec) {
+ attrVector_ = vec;
+ }
+
+ void setHasPop(bool hp, const string& pop) {
+ hasPop_ = hp;
+ attrPop_ = pop;
+ }
+
+ void setType(int t, int mp, int nc) {
+ type_ = t; minPop_= mp; nClusters_= nc;
+ }
+
+ void setResName(string r, string t) {
+ resName_ = r;
+ tableName_ = t;
+ }
+
+ //Aplica o metodo skater
+ bool apply(vector<double>& het);
+
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtProgress.h b/src/terralib/application/qt/TeQtProgress.h
new file mode 100644
index 0000000..691b9ee
--- /dev/null
+++ b/src/terralib/application/qt/TeQtProgress.h
@@ -0,0 +1,138 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTPROGRESS_H
+#define __TERRALIB_INTERNAL_QTPROGRESS_H
+
+#include <qprogressdialog.h>
+#include <qapplication.h>
+#include <qcursor.h>
+#include <qaction.h>
+#include "TeProgress.h"
+#include <qeventloop.h>
+
+class TeQtProgress : public QProgressDialog, public TeProgressBase
+{
+ Q_OBJECT
+
+protected:
+ int numberOfCursors_; //<! Number of cursors that were pushed on application stack.
+
+ void enterEvent ( QEvent * )
+ {
+ if(QApplication::overrideCursor())
+ {
+ if(QApplication::overrideCursor()->shape() != Qt::ArrowCursor)
+ {
+ QApplication::setOverrideCursor( Qt::ArrowCursor );
+ numberOfCursors_++;
+ }
+ }
+ }
+
+ void leaveEvent ( QEvent * )
+ {
+ if(QApplication::overrideCursor())
+ {
+ if(QApplication::overrideCursor()->shape() == Qt::ArrowCursor)
+ {
+ QApplication::restoreOverrideCursor();
+ numberOfCursors_--;
+ }
+ }
+ }
+
+public:
+ TeQtProgress( QWidget * creator = 0, const char * name = 0, bool modal = FALSE, WFlags f = 0)
+ : QProgressDialog(creator, name, modal, f)
+ {
+ numberOfCursors_ = 0;
+ }
+
+ ~TeQtProgress() {}
+
+ void reset()
+ {
+ int i;
+ QProgressDialog::reset();
+ QProgressDialog::setLabelText("");
+ QProgressDialog::setCaption("");
+
+ //Restore all cursors that were set by TeQtProgress.
+ for (i=0; i<numberOfCursors_; i++)
+ {
+ if(QApplication::overrideCursor())
+ QApplication::restoreOverrideCursor();
+ }
+ numberOfCursors_ = 0;
+ }
+
+ void setTotalSteps (int steps)
+ {
+ QProgressDialog::setTotalSteps(steps);
+ if(QApplication::overrideCursor())
+ {
+ if(QApplication::overrideCursor()->shape() != Qt::WaitCursor)
+ {
+ QApplication::setOverrideCursor( Qt::WaitCursor );
+ numberOfCursors_++;
+ }
+ }
+ else
+ {
+ QApplication::setOverrideCursor( Qt::WaitCursor );
+ numberOfCursors_++;
+ }
+ }
+
+ void setMessage(const string& text)
+ {
+ QProgressDialog::setLabelText(text.c_str());
+ }
+
+ string getMessage()
+ {
+ return QProgressDialog::labelText().latin1();
+ }
+
+ void setProgress(int steps)
+ {
+ QProgressDialog::setProgress(steps);
+ }
+
+ bool wasCancelled()
+ {
+ hasMouse();
+ return QProgressDialog::wasCancelled();
+ }
+
+ void setCaption(const string& cap)
+ {
+ QProgressDialog::setCaption(cap.c_str());
+ }
+
+ void cancel()
+ {
+ QProgressDialog::cancel();
+ }
+
+};
+#endif
diff --git a/src/terralib/application/qt/TeQtShowMedia.cpp b/src/terralib/application/qt/TeQtShowMedia.cpp
new file mode 100644
index 0000000..1807781
--- /dev/null
+++ b/src/terralib/application/qt/TeQtShowMedia.cpp
@@ -0,0 +1,1444 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtShowMedia.h>
+#include <TeAttribute.h>
+#include <qfiledialog.h>
+#include <qlineedit.h>
+#include <qstring.h>
+#include <qtextedit.h>
+#include <qmessagebox.h>
+#include <qfile.h>
+#include <errno.h>
+
+#ifdef WIN32
+#include <windows.h>
+#include <process.h>
+#include <io.h>
+#include <direct.h>
+#else
+#include <unistd.h>
+#endif
+
+
+TeQtShowMedia :: TeQtShowMedia(QWidget* parent, const char* name)
+ : QTable(2, 2, parent, name)
+{
+ layer_ = 0;
+ db_ = 0;
+ cmdLocal_ = false;
+ popup_ = new QPopupMenu(this);
+ popup_->insertItem(tr("Show Media..."), this, SLOT(slotShow()));
+ popup_->insertItem(tr("Insert Media..."), this, SLOT(slotInsert()));
+ popup_->insertItem(tr("Insert URL..."), this, SLOT(slotInsertURL()));
+ popup_->insertItem(tr("Remove..."), this, SLOT(slotRemove()));
+ popup_->insertItem(tr("Set the Default Media"), this, SLOT(slotSetDefault()));
+ popup_->insertItem(tr("Description..."), this, SLOT(slotDescription()));
+
+ connect(this, SIGNAL(pressed(int, int, int, const QPoint&)),
+ this, SLOT(slotpressed(int, int, int, const QPoint&)));
+
+ connect(this, SIGNAL(doubleClicked(int, int, int, const QPoint&)),
+ this, SLOT(slotDoubleClicked(int, int, int, const QPoint&)));
+}
+
+TeQtShowMedia :: ~TeQtShowMedia()
+{
+}
+
+void TeQtShowMedia :: init(string objId, TeThemeApplication* theme, TeQtGrid* grid)
+{
+ setNumRows(0);
+ id_ = objId;
+ nattrs_ = grid->numCols();
+ layer_ = theme->layer();
+ table_ = layer_->mediaTable();
+ db_ = layer_->database();
+ TeDatabasePortal* portal = db_->getPortal();
+
+ TeAttributeList colAttrList;
+ db_->getAttributeList(theme->collectionTable(), colAttrList);
+
+ horizontalHeader()->setLabel(0, tr("Attribute"));
+ horizontalHeader()->setLabel(1, tr("Value"));
+
+ int i, nMidias = 0;
+ if(table_.empty() == false)
+ {
+ string q = "SELECT COUNT(*) FROM " + table_;
+ q += " WHERE object_id = '" + id_ + "'";
+ if(portal->query(q))
+ {
+ if(portal->fetchRow())
+ nMidias = atoi(portal->getData(0));
+ }
+ }
+
+ string sel = theme->sqlJoin() + " WHERE c_object_id = '" + id_ + "'";
+
+ portal->freeResult();
+ if(portal->query(sel))
+ {
+ int ncol = portal->AttributeList().size() - colAttrList.size() + nMidias;
+
+ setNumRows(ncol);
+
+ if(portal->fetchRow())
+ {
+ for(i=0; i<grid->numCols(); i++)
+ {
+ string fname = portal->getAttribute(i).rep_.name_;
+ string data = portal->getData(i);
+ setText(i, 0, fname.c_str());
+ setText(i, 1, data.c_str());
+ }
+ }
+
+ if(table_.empty() == false)
+ {
+ string q = "SELECT media_name, media_table, show_default FROM " + table_;
+ q += " WHERE object_id = '" + id_ + "'";
+ portal->freeResult();
+ if(portal->query(q))
+ {
+ TeDatabasePortal* portal2 = db_->getPortal();
+ while(portal->fetchRow())
+ {
+ string type;
+ string mediaName = portal->getData(0);
+ string mediaTable = portal->getData(1);
+ bool showDefault = atoi(portal->getData(2));
+
+ string q = "SELECT media_type FROM " + mediaTable;
+ q += " WHERE media_name = '" + mediaName + "'";
+ portal2->freeResult();
+ if(portal2->query(q))
+ {
+ if(portal2->fetchRow())
+ type = portal2->getData(0);
+ }
+
+ string ss;
+ if(showDefault)
+ ss = "*media: "; // + type;
+ else
+ ss = "media: "; // + type;
+
+ setText(i, 0, ss.c_str());
+ setText(i, 1, mediaName.c_str());
+ i++;
+ }
+ delete portal2;
+ }
+ }
+ show();
+ moveDown();
+ }
+ delete portal;
+}
+
+bool TeQtShowMedia :: eventFilter(QObject* o, QEvent* e)
+{
+// if (e->type() == QEvent::MouseButtonDblClick)
+// return true;
+ return QTable::eventFilter(o, e); // standard event processing
+}
+
+void TeQtShowMedia :: slotpressed( int row, int /* col */, int button, const QPoint & mousePos )
+{
+ if(button == RightButton)
+ {
+ cmdLocal_ = true;
+ row_ = row;
+ popup_->move(mousePos.x() + x() - contentsX(), mousePos.y() + y() - contentsY());
+ popup_->exec();
+ cmdLocal_ = false;
+ }
+}
+
+void TeQtShowMedia :: slotDoubleClicked( int row, int /* col */, int button, const QPoint & /*mousePos */)
+{
+ if(button == LeftButton)
+ {
+ row_ = row;
+ slotShow();
+ }
+}
+
+void TeQtShowMedia :: slotShow()
+{
+ if(row_ > 0 && nattrs_ > row_)
+ return;
+
+ string name;
+ if(row_ >= 0)
+ name = text(row_, 1).latin1();
+
+ int pos;
+ char buf[300];
+ vector<string> varg;
+ string cmd, arg, sname;
+ string swdir;
+ string mediaTable;
+ string type;
+
+// load media data to archive from database
+ TeDatabasePortal *portal = db_->getPortal();
+ string query = "SELECT media_table, media_name FROM " + table_;
+ if(row_ >= 0)
+ query += " WHERE object_id = '" + id_ + "' AND media_name = '" + name + "'";
+ else
+ query += " WHERE object_id = '" + id_ + "' AND show_default = 1";
+ if(portal->query(query))
+ {
+ if(portal->fetchRow())
+ {
+ mediaTable = portal->getData(0);
+ name = portal->getData(1);
+ }
+ }
+
+ if(mediaTable.empty())
+ {
+ QMessageBox::warning(this, tr("Warning"),
+ tr("There is no media to show!\nInsert one first."));
+ delete portal;
+ return;
+ }
+
+ query = "SELECT * FROM " + mediaTable + " WHERE media_name = '" + name + "'";
+ portal->freeResult();
+ if(portal->query(query))
+ if(portal->fetchRow())
+ type = portal->getData("media_type");
+
+ if(type.empty())
+ {
+ QMessageBox::warning(this, tr("Warning"),
+ tr("There is no media in the table!"));
+ delete portal;
+ return;
+ }
+
+ string tempName = name;
+ if(type != "url")
+ {
+ int f;
+#ifdef WIN32
+ char wdir[100];
+ GetWindowsDirectory((LPTSTR)wdir, 100);
+ swdir = wdir;
+ f = swdir.find(":\\");
+ if(f >= 0)
+ swdir.erase(f, swdir.size()-f);
+ swdir.append(":\\TERRAVIEW_TEMP");
+ if( access (swdir.c_str(), 06) == -1 ) // test if directory exists
+ {
+ if( errno == ENOENT ) // directory does not exist so create it
+ {
+ if ( _mkdir(swdir.c_str()) == -1)
+ {
+ QString msg = tr("The directory ");
+ msg += swdir.c_str();
+ msg += tr(" could not be created");
+ QMessageBox::critical(this, tr("Error"),
+ tr("The directory /tmp/TERRAVIEW_TEMP could not be created!"));
+ delete portal;
+ return;
+ }
+ }
+ }
+ swdir.append("\\");
+#else
+ swdir = "/tmp/TERRAVIEW_TEMP";
+ if( access (swdir.c_str(), F_OK) == -1 ) // test if directory exists
+ {
+ if( errno == ENOENT ) // directory does not exist so create it
+ {
+ char buf[20];
+ sprintf(buf, "mkdir %s", swdir.c_str());
+ if (system(buf) != 0)
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("The directory /tmp/TERRAVIEW_TEMP could not be created!"));
+ delete portal;
+ return;
+ }
+ }
+ }
+ swdir.append("/");
+#endif
+ f = tempName.rfind("/");
+ if(f < 0)
+ f = tempName.rfind("\\");
+ if(f >= 0)
+ tempName.erase(0, f+1);
+ tempName.insert(0, swdir);
+
+ pos = tempName.rfind(".");
+ if (pos < 0)
+ {
+ tempName.append(".");
+ tempName.append(type);
+ }
+ unsigned char *data = 0;
+ long size;
+// string description;
+// string type;
+ if((portal->getBlob("media_blob", data, size)) == false)
+ {
+ delete portal;
+ return;
+ }
+ FILE *fp = fopen(tempName.c_str(), "wb");
+ if(fp == 0)
+ {
+ delete portal;
+ return;
+ }
+ if(fwrite(data, sizeof(unsigned char), size, fp) < (unsigned long)size)
+ {
+ delete portal;
+ return;
+ }
+ if(data)
+ delete []data;
+ fclose(fp);
+
+ pos = tempName.rfind(".");
+ if (pos < 0)
+ {
+ delete portal;
+ return;
+ }
+
+ memset (buf, 0, 300);
+ tempName.copy (buf, tempName.size()-pos, pos);
+ }
+ else
+ strcpy(buf, ".html");
+
+ delete portal;
+
+#ifdef WIN32
+ if (TeConvertToUpperCase (buf) == ".EXE")
+ {
+ _spawnl (P_NOWAIT, tempName.c_str(), tempName.c_str(), NULL);
+ return;
+ }
+ // if application is user defined find current application
+ // else use default application
+ string key = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\";
+ key += buf;
+
+ string keycmd = getSystemKeyValue(HKEY_CURRENT_USER, key, "Application");
+ if(keycmd.empty() == false)
+ {
+ string com = keycmd;
+ key = "Applications\\" + com + "\\SHELL\\PLAY\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.empty())
+ {
+ key = "Applications\\" + com + "\\SHELL\\OPEN\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.empty())
+ {
+ key = "Applications\\" + com + "\\SHELL\\EDIT\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ }
+ }
+ }
+ else
+ {
+ key = buf;
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.size() <= 1)
+ {
+ key += "\\SHELL\\PLAY\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.empty())
+ {
+ key = buf;
+ key += "\\SHELL\\OPEN\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.empty())
+ {
+ key = buf;
+ key += "\\SHELL\\EDIT\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ }
+ }
+ }
+ else
+ {
+ memset (buf, 0, 300);
+ strcpy(buf, keycmd.c_str());
+
+ key = buf;
+ key += "\\SHELL\\PLAY\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.empty())
+ {
+ key = buf;
+ key += "\\SHELL\\OPEN\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.empty())
+ {
+ key = buf;
+ key += "\\SHELL\\EDIT\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ }
+ }
+ }
+ }
+
+ if(keycmd.empty())
+ {
+ QMessageBox::warning(this, tr("Warning"),
+ tr("The media cannot be shown!\nCheck if there is a program defined to open it."));
+ return;
+ }
+
+// get command and arguments from keycmd
+ getCommand(keycmd, cmd, varg);
+ if((pos = tempName.find(" ")) >= 0)
+ tempName = "\"" + tempName + "\"";
+
+ char curdir[256];
+ _getcwd(curdir, 256);
+ _chdir(swdir.c_str());
+
+ if (varg.size() == 0)
+ _spawnl (P_NOWAIT, cmd.c_str(), tempName.c_str(), NULL);
+ else if (varg.size() == 1)
+ _spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), tempName.c_str(), NULL);
+ else if (varg.size() == 2)
+ {
+ const char* p = varg[1].c_str();
+ if(varg[1] == "%L" || varg[1] == "%1")
+ _spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), tempName.c_str(), NULL);
+ else
+ _spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), p, tempName.c_str(), NULL);
+ }
+ else if (varg.size() == 3)
+ {
+ const char* p = varg[1].c_str();
+ const char* p1 = varg[2].c_str();
+ int f = varg[0].find("/prefetch:", -1);
+ if(f >= 0 && (varg[2] == "%L" || varg[2] == "%1"))
+ _spawnl (P_NOWAIT, cmd.c_str(), p, tempName.c_str(), NULL);
+ else
+ _spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), p, p1, tempName.c_str(), NULL);
+
+
+ }
+
+ _chdir(curdir);
+#else
+ string command;
+ //Mount the vector of directory paths that are
+ //stored in the PATH environment variable
+ string path = getenv("PATH");
+ vector<string> dirVector;
+ string dirPath;
+ size_t idx = 0;
+ size_t len = path.find(':', idx);
+ while (len != string::npos)
+ {
+ dirPath = path.substr(idx, len-idx);
+ dirVector.push_back(dirPath);
+ idx = len+1;
+ len = path.find(':', idx);
+ }
+
+
+ // get the last directory path
+ idx = path.rfind(':', path.size());
+ dirPath = path.substr(idx+1, path.size());
+ dirVector.push_back(dirPath);
+
+ string fs;
+ if(type != "url")
+ {
+ bool exists = false;
+ for (unsigned int i = 0; i < dirVector.size(); ++i)
+ {
+ QString qfs = dirVector[i].c_str();
+ qfs += "/konqueror";
+ QFile file(qfs);
+ if (file.exists() == true)
+ {
+ exists = true;
+ break;
+ }
+ }
+ if (exists == true)
+ command = "konqueror " + tempName + " &";
+ else
+ {
+ QString msg = tr("The program konqueror used to display your media is not") + "\n";
+ msg += tr("present in your PATH environment variable or KDE is not installed!");
+ QMessageBox::warning(this, tr("Warning"), msg);
+ return;
+ }
+ }
+ else
+ {
+ unsigned int i;
+ for (i = 0; i < dirVector.size(); ++i)
+ {
+ QString qfs = dirVector[i].c_str();
+ qfs += "/netscape";
+ QFile file(qfs);
+ if (file.exists() == true)
+ {
+ command = "netscape -remote 'openURL(" + tempName + ")' &";
+ break;
+ }
+ }
+
+ if (command.empty() == true)
+ {
+ for (i = 0; i < dirVector.size(); ++i)
+ {
+ QString qfs = dirVector[i].c_str();
+ qfs += "/mozilla";
+ QFile file(qfs);
+ if (file.exists() == true)
+ {
+ command = "mozilla -remote 'openURL(" + tempName + ")' &";
+ break;
+ }
+ }
+ }
+
+ if (command.empty() == true)
+ {
+ for (i = 0; i < dirVector.size(); ++i)
+ {
+ QString qfs = dirVector[i].c_str();
+ qfs += "/konqueror";
+ QFile file(qfs);
+ if (file.exists() == true)
+ {
+ command = "konqueror " + tempName + " &";
+ break;
+ }
+ }
+ }
+
+ if (command.empty() == true)
+ {
+ QString msg = tr("The program konqueror used to display your media is not") + "\n";
+ msg += tr("present in your PATH environment variable or KDE is not installed!");
+ QMessageBox::warning(this, tr("Warning"), msg);
+ return;
+ }
+ }
+
+ system(command.c_str());
+#endif
+}
+
+void TeQtShowMedia :: slotInsert()
+{
+ if(cmdLocal_ == false)
+ hide();
+ QFileDialog filed("c:\\", QString::null, 0, 0, true);
+ QString qfile = filed.getOpenFileName (QString::null, QString::null, 0, 0);
+
+ if(qfile.isEmpty())
+ {
+ QMessageBox::warning(this, tr("Warning"), tr("No media was selected!"));
+ show();
+ return;
+ }
+
+ string file = qfile.latin1();
+ string type;
+ int f = file.rfind(".");
+ if (f >= 0)
+ {
+ type = file;
+ type.erase(0, f+1);
+ }
+
+ string mTable = "media_table_" + Te2String(layer_->id());
+ if(table_.empty())
+ {
+ string tname = "media_layer_" + Te2String(layer_->id());
+ if(createLayerMediaTable(db_, layer_->id(), tname) == false)
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Fail to create the table that will store media names!"));
+ return;
+ }
+ table_ = layer_->mediaTable();
+ if(createMediaTable(db_, mTable) == false)
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Fail to create the media table!"));
+ return;
+ }
+ }
+
+ int response = 1;
+
+ TeDatabasePortal *portal = db_->getPortal();
+ string sel = "SELECT media_name, object_id FROM " + table_ + " WHERE media_table = '" + mTable + "'";
+ if(portal->query(sel))
+ {
+ while(portal->fetchRow())
+ {
+ string s = portal->getData(0);
+ if(s == file)
+ {
+ response = QMessageBox::question(this, tr("Question"),
+ tr("The media already exists! Do you wish to use it even so?"), tr("Yes"), tr("No"));
+ if(response == 1)
+ {
+ QMessageBox::warning(this, tr("Warning"),
+ tr("Rename the file and try again!"));
+ delete portal;
+ return;
+ }
+ else
+ {
+ string s = portal->getData(1);
+ if(s == id_)
+ {
+ QMessageBox::warning(this, tr("Warning"),
+ tr("There is already a media associated to this object!"));
+ delete portal;
+ return;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ if(response == 1)
+ {
+ if(insertMedia(db_, mTable, file, "", type) == false)
+ {
+ QString msg = tr("Fail to insert media:") + " ";
+ msg += db_->errorMessage().c_str();
+ QMessageBox::critical(this, tr("Error"), msg);
+ delete portal;
+ return;
+ }
+ }
+ if(insertMediaObjLayer(db_, layer_, id_, file, mTable) == false)
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Fail to insert the \"media_name\" field in the table!"));
+ delete portal;
+ return;
+ }
+
+ setNumRows(numRows() + 1);
+ setText(numRows()-1, 1, file.c_str());
+
+ int nmidias = 0;
+ string conta = "SELECT COUNT(*) FROM " + table_ + " WHERE object_id = '" + id_ + "'";
+ portal->freeResult();
+ if(portal->query(conta))
+ {
+ if(portal->fetchRow())
+ nmidias = atoi(portal->getData(0));
+ }
+
+ string title = "media: ";
+
+ if(nmidias <= 1)
+ {
+ title = "*media: "; // + type;
+ string up = "UPDATE " + table_ + " SET show_default = 1 WHERE object_id = '" + id_ + "'";
+ db_->execute(up);
+ }
+ delete portal;
+ setText(numRows()-1, 0, title.c_str());
+
+ if(cmdLocal_ == false)
+ hide();
+ else
+ {
+ moveDown();
+ show();
+ raise();
+
+ }
+}
+
+void TeQtShowMedia :: moveDown()
+{
+ int x = contentsX();
+ int height = visibleHeight();
+ int nlins = rowAt(height);
+ int y = rowPos(numRows()-nlins);
+ setContentsPos(x, y);
+ adjustColumn(0);
+ adjustColumn(1);
+}
+
+void TeQtShowMedia :: slotRemove()
+{
+ if(nattrs_ > row_)
+ return;
+
+ int x = contentsX();
+ int y = contentsY();
+
+ vector<string> atr;
+ vector<string> val;
+ int i;
+
+ for(i=0; i<numRows(); i++)
+ {
+ string a = text(i, 0).latin1();
+ atr.push_back(a);
+ string b = text(i, 1).latin1();
+ val.push_back(b);
+ }
+
+ string name = val[row_];
+ vector<string>::iterator ait = atr.begin();
+ ait += row_;
+ atr.erase(ait, ait+1);
+ vector<string>::iterator vit = val.begin();
+ vit += row_;
+ val.erase(vit, vit+1);
+
+ setNumRows(0);
+ string mTable = "media_table_" + Te2String(layer_->id());
+ string remover = "DELETE FROM " + table_ + " WHERE object_id = '" + id_ + "'";
+ remover += " AND media_name = '" + name + "'" + " AND media_table = '" + mTable + "'";
+ db_->execute(remover);
+
+ bool aindaUsa = false;
+ TeDatabasePortal* portal = db_->getPortal();
+ string sel = "SELECT * FROM " + table_ + " WHERE media_name = '" + name + "'";
+ sel += " AND media_table = '" + mTable + "'";
+ if(portal->query(sel))
+ if(portal->fetchRow())
+ aindaUsa = true;
+
+ if(aindaUsa == false)
+ {
+ string remover = "DELETE FROM " + mTable + " WHERE media_name = '" + name + "'";
+ db_->execute(remover);
+ }
+
+ string defname;
+ bool defshow = false;
+ sel = "SELECT media_name, show_default FROM " + table_ + " WHERE object_id = '" + id_ + "'";
+ portal->freeResult();
+ if(portal->query(sel))
+ {
+ while(portal->fetchRow())
+ {
+ defname = portal->getData(0);
+ defshow = atoi(portal->getData(1));
+ if(defshow)
+ break;
+ }
+ }
+ delete portal;
+
+ if(defshow == false && defname.empty() == false)
+ {
+ string up = "UPDATE " + table_ + " SET show_default = 1 WHERE media_name = '" + defname + "'";
+ db_->execute(up);
+ }
+
+ setNumRows(atr.size());
+
+ unsigned int k;
+ for(k=0; k<atr.size(); k++)
+ {
+ if(defshow == false && defname.empty() == false)
+ {
+ if(val[k] == defname)
+ atr[k].insert(0, "*");
+ }
+ setText(k, 0, atr[k].c_str());
+ setText(k, 1, val[k].c_str());
+ }
+ setContentsPos(x, y);
+ raise();
+}
+
+void TeQtShowMedia :: slotInsertURL()
+{
+ if(cmdLocal_ == false)
+ hide();
+
+ urlWindow_ = new URLWindow(this, "urlInsertion", true);
+ urlWindow_->exec();
+ QString qsite = urlWindow_->URLLineEdit->text();
+ delete urlWindow_;
+ if(qsite.isNull() || qsite.isEmpty())
+ return;
+
+ string site = qsite.latin1();
+ string type = "url";
+
+
+ string mTable = "media_table_" + Te2String(layer_->id());
+ if(table_.empty())
+ {
+ string tname = "media_layer_" + Te2String(layer_->id());
+ if(createLayerMediaTable(db_, layer_->id(), tname) == false)
+ {
+ QMessageBox::critical(this,tr("Error"),
+ tr("Fail to create the table to store media names!"));
+ return;
+ }
+ if(createMediaTable(db_, mTable) == false)
+ {
+ QMessageBox::critical(this, tr("Error"), tr("Fail to create the media tables!"));
+ return;
+ }
+ }
+
+
+ bool jatem = false;
+
+ TeDatabasePortal *portal = db_->getPortal();
+ string sel = "SELECT media_name, object_id FROM " + table_ + " WHERE media_table = '" + mTable + "'";
+ if(portal->query(sel))
+ {
+ while(portal->fetchRow())
+ {
+ string s = portal->getData(0);
+ if(s == site)
+ {
+ jatem = true;
+ string ss = portal->getData(1);
+ if(ss == id_)
+ {
+ QMessageBox::warning(this, tr("Warning"),
+ tr("This URL is already associated to this object!"));
+ delete portal;
+ return;
+ }
+ break;
+ }
+ }
+ }
+
+ if(jatem == false)
+ {
+ if(insertMedia(db_, mTable, site, "", type, false) == false)
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Fail to insert the \"media_blob\" field in the table!"));
+ delete portal;
+ return;
+ }
+ }
+ if(insertMediaObjLayer(db_, layer_, id_, site, mTable) == false)
+ {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Fail to insert the \"media_name\" field in the table!"));
+ delete portal;
+ return;
+ }
+
+ setNumRows(numRows() + 1);
+ setText(numRows()-1, 1, site.c_str());
+
+ int nmidias = 0;
+ string conta = "SELECT COUNT(*) FROM " + table_ + " WHERE object_id = '" + id_ + "'";
+ portal->freeResult();
+ if(portal->query(conta))
+ {
+ if(portal->fetchRow())
+ nmidias = atoi(portal->getData(0));
+ }
+
+ string title;
+
+ if(nmidias <= 1)
+ {
+ title = "*media: "; // + type;
+ string up = "UPDATE " + table_ + " SET show_default = 1 WHERE object_id = '" + id_ + "'";
+ db_->execute(up);
+ }
+
+ delete portal;
+ setText(numRows()-1, 0, title.c_str());
+
+ if(cmdLocal_ == false)
+ hide();
+ else
+ {
+ moveDown();
+ show();
+ raise();
+ }
+}
+
+void TeQtShowMedia :: slotSetDefault()
+{
+ if(nattrs_ > row_)
+ return;
+
+ string media_name = text(row_, 1).latin1();
+ string mTable = "media_table_" + Te2String(layer_->id());
+ setDefaultMedia(db_, layer_, id_, media_name, mTable);
+
+ string type = text(row_, 0).latin1();
+ int f = type.find("*", string::npos);
+ if(f >= 0)
+ return;
+ else
+ {
+ int i;
+ for(i = nattrs_; i<numRows(); i++)
+ {
+ string s = text(i, 0).latin1();
+ f = s.find("*", 0);
+ if(f >= 0)
+ {
+
+ setText(i, 0, "media:");
+ break;
+ }
+ }
+ setText(row_, 0, "*media:");
+ }
+
+ if(cmdLocal_ == false)
+ hide();
+ else
+ raise();
+}
+
+void TeQtShowMedia :: slotDescription()
+{
+ if(row_ > 0 && nattrs_ > row_)
+ return;
+
+ string mTable = "media_table_" + Te2String(layer_->id());
+ TeDatabasePortal *ptal = db_->getPortal();
+ string name;
+
+ if(row_ < 0)
+ {
+ string s = "SELECT media_name FROM " + table_ + " WHERE object_id = '" + id_ + "'";
+ s += " AND show_default = 1";
+ if(ptal->query(s))
+ {
+ if(ptal->fetchRow())
+ name = ptal->getData(0);
+ }
+ }
+ else
+ name = text(row_, 1).latin1();
+
+ string q = "SELECT * FROM " + mTable + " WHERE media_name = '" + name + "'";
+
+ string description;
+ ptal->freeResult();
+ if(ptal->query(q))
+ {
+ if(ptal->fetchRow())
+ description = ptal->getData("description");
+ }
+ delete ptal;
+ descriptionWindow_ = new MediaDescription(this, "mediaDescription", true);
+ QString qdesc;
+ qdesc.setLatin1(description.c_str(), description.size());
+ descriptionWindow_->descriptionTextEdit->setText(qdesc);
+ descriptionWindow_->exec();
+
+ QString qtext = descriptionWindow_->descriptionTextEdit->text();
+ if(qtext.isEmpty() || qtext.isNull())
+ description.clear();
+ else
+ description = qtext.latin1();
+ if(description.size() > 255)
+ {
+ QMessageBox::warning(this, tr("Warning"),
+ tr("The description is longer than 255 caracteres!\nIt will be truncated."));
+ description.erase(255, description.size()-255);
+ }
+ if(description.empty() == false)
+ updateMediaDescription(db_, name, mTable, description);
+
+ delete descriptionWindow_;
+
+ if(cmdLocal_ == false)
+ hide();
+ else
+ raise();
+}
+
+#ifdef WIN32
+void TeQtShowMedia :: getCommand(string keycom, string& cmd, vector<string>& varg)
+{
+ string s = keycom;
+ string ss = keycom;
+ string S = TeConvertToUpperCase(keycom);
+ unsigned int i;
+ int pos, n;
+ string arg;
+ bool isDll = false;
+
+ varg.clear();
+ cmd.clear();
+ arg.clear();
+
+// find command
+ if((pos=s.find(".")) >= 0)
+ {
+ if((n=s.find(" ", pos)) >= 0)
+ {
+ s.erase(n, s.size()-n);
+ S.erase(n, S.size()-n);
+ ss.erase(0, n);
+ }
+ }
+
+// remove ""
+ while((pos=s.find("\"", -1)) >= 0)
+ {
+ s.erase(pos, 1);
+ S.erase(pos, 1);
+ }
+// replace %SystemRoot%
+ if((pos=S.find("%SYSTEMROOT%", -1)) >= 0)
+ {
+ int len = strlen("%SystemRoot%");
+ string systemRoot = getSystemKeyValue(HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "SystemRoot");
+ s.replace(pos, len, systemRoot);
+ S.replace(pos, len, systemRoot);
+ }
+
+// replace %ProgramFiles%
+ if((pos=S.find("%PROGRAMFILES%", -1)) >= 0)
+ {
+ int len = strlen("%ProgramFiles%");
+ string programFiles = getSystemKeyValue(HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Microsoft\\Windows\\CurrentVersion", "ProgramFilesDir");
+ s.replace(pos, len, programFiles);
+ S.replace(pos, len, programFiles);
+ }
+
+// replace %CommonProgramFiles%
+ if((pos=S.find("%COMMOMFILES%", -1)) >= 0)
+ {
+ int len = strlen("%CommonFiles%");
+ string commonFiles = getSystemKeyValue(HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Microsoft\\Windows\\CurrentVersion", "CommonFilesDir");
+ s.replace(pos, len, commonFiles);
+ S.replace(pos, len, commonFiles);
+ }
+
+// rundll32.exe
+ if((pos=S.find("RUNDLL32", -1)) == 0)
+ {
+ string dllDirectory = getSystemKeyValue(HKEY_LOCAL_MACHINE,
+ "System\\ControlSet001\\Control\\Session Manager\\KnownDLLs", "DllDirectory");
+ string DIR = TeConvertToUpperCase(dllDirectory);
+ if((pos=DIR.find("%SYSTEMROOT%", -1)) >= 0)
+ {
+
+ int len = strlen("%SystemRoot%");
+ string systemRoot = getSystemKeyValue(HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "SystemRoot");
+ dllDirectory.replace(pos, len, systemRoot);
+ }
+ cmd = dllDirectory + "\\rundll32.exe";
+ isDll = true;
+ }
+ else
+ cmd = s;
+
+ string command = TeConvertToUpperCase(cmd);
+ bool percentOut = false;
+ if((pos=command.find("MSACCESS.EXE", -1)) >= 0)
+
+ percentOut = true;
+ if((pos=command.find("POWERPNT.EXE", -1)) >= 0)
+ percentOut = true;
+
+ s = ss; // arguments
+ if(isDll)
+ {
+ varg.push_back("rundll32.exe");
+ S = TeConvertToUpperCase(s);
+ if((pos=S.find("%SYSTEMROOT%", -1)) >= 0)
+ {
+ int len = strlen("%SystemRoot%");
+ string systemRoot = getSystemKeyValue(HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "SystemRoot");
+ s.replace(pos, len, systemRoot);
+ }
+ if(s[0] == ' ')
+ s.erase(0, 1);
+
+ for(i=0; i<s.size(); i++)
+ if(s[i] == '/' || s[i] == '-' || s[i]=='%')
+ break;
+ string arg = s;
+ arg.erase(i-1, arg.size()-(i-1));
+ varg.push_back(arg);
+ s.erase(0, i-1);
+ }
+
+// if runddl32 the option has "/" or "-" and termineted with " "
+// else the option has "/", "-" or "%" and termineted with " "
+ for(i=0; i<s.size(); i++)
+ {
+ if(isDll || percentOut)
+ {
+ if(s[i] == '/' || s[i] == '-')
+ {
+ if((pos=s.find(" ", i)) >=0)
+ {
+ string arg = s;
+
+ arg.erase(pos, arg.size()-pos);
+ arg.erase(0, i);
+ // remove ""
+ while((n=arg.find("\"", -1)) >= 0)
+ arg.erase(n, 1);
+
+ varg.push_back(arg);
+ i = pos;
+ }
+ else
+ {
+ string arg = s;
+ arg.erase(0, i);
+ // remove ""
+ while((n=arg.find("\"", -1)) >= 0)
+ arg.erase(n, 1);
+
+
+ varg.push_back(arg);
+ break;
+ }
+ }
+ }
+ else
+ {
+ if(s[i] == '/' || s[i] == '-' || s[i] == '%')
+ {
+ if((pos=s.find(" ", i)) >=0)
+ {
+ string arg = s;
+ arg.erase(pos, arg.size()-pos);
+ arg.erase(0, i);
+ // remove ""
+ while((n=arg.find("\"", -1)) >= 0)
+ arg.erase(n, 1);
+
+ varg.push_back(arg);
+ i = pos;
+ }
+ else
+ {
+ string arg = s;
+ arg.erase(0, i);
+ // remove ""
+ while((n=arg.find("\"", -1)) >= 0)
+ arg.erase(n, 1);
+
+ varg.push_back(arg);
+ break;
+ }
+ }
+ }
+ }
+}
+
+
+string TeQtShowMedia :: getSystemKeyValue(HKEY hkey, string key, string value)
+{
+ HKEY hk;
+ DWORD DataSize = 1024;
+ DWORD Type = REG_SZ;
+ char buf[1024];
+ string keycmd;
+
+ if (RegOpenKeyEx(hkey, (LPCTSTR)key.c_str(), 0, KEY_READ, &hk) == ERROR_SUCCESS)
+ {
+ memset (buf, 0, 1024);
+ if (RegQueryValueEx(hk, (LPCTSTR)value.c_str(), NULL, &Type, (LPBYTE)buf, &DataSize) == ERROR_SUCCESS)
+
+ keycmd = buf;
+ }
+ if(hk)
+ RegCloseKey (hk);
+ return keycmd;
+
+
+// key query example:
+// HKEY key; LONG res;
+// res = RegOpenKeyEx(HKEY_CURRENT_USER,"Identities",0,KEY_READ,&key);
+// if (res!=ERROR_SUCCESS) return;
+// list<string> ids = RegQuerySubkeys(key);
+// string defid = RegQueryString(key,"Default User ID");
+// RegCloseKey(key);
+// if (ids.size()==0) return;
+}
+#endif
+
+void TeQtShowMedia :: slotShowFile(string file)
+{
+ int pos;
+ string cmd;
+ vector<string> varg;
+ string name = file;
+
+ string tempName = name;
+ pos = tempName.find("/");
+ while(pos >= 0)
+ {
+ tempName.replace(pos, 1, "\\");
+ pos = tempName.find("/");
+ }
+
+ string type = tempName;
+ pos = type.rfind(".");
+ if(pos >= 0)
+ type.erase(0, pos);
+ else
+ return;
+
+#ifdef WIN32
+ char buf[300];
+
+ if (TeConvertToUpperCase (type) == ".EXE")
+ {
+ _spawnl (P_NOWAIT, tempName.c_str(), tempName.c_str(), NULL);
+ return;
+ }
+ // if application is user defined find current application
+ // else use default application
+ string key = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\";
+ key += type;
+
+ string keycmd = getSystemKeyValue(HKEY_CURRENT_USER, key, "Application");
+ if(keycmd.empty() == false)
+ {
+ string com = keycmd;
+ key = "Applications\\" + com + "\\SHELL\\PLAY\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.empty())
+ {
+ key = "Applications\\" + com + "\\SHELL\\OPEN\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.empty())
+ {
+ key = "Applications\\" + com + "\\SHELL\\EDIT\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ }
+ }
+ }
+ else
+ {
+ key = type;
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.size() <= 1)
+ {
+ key += "\\SHELL\\PLAY\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.empty())
+ {
+ key = type;
+ key += "\\SHELL\\OPEN\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.empty())
+ {
+ key = type;
+ key += "\\SHELL\\EDIT\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ }
+ }
+ }
+ else
+ {
+ memset (buf, 0, 300);
+ strcpy(buf, keycmd.c_str());
+
+ key = buf;
+ key += "\\SHELL\\PLAY\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.empty())
+ {
+ key = buf;
+ key += "\\SHELL\\OPEN\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ if(keycmd.empty())
+ {
+ key = buf;
+ key += "\\SHELL\\EDIT\\COMMAND";
+ keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+ }
+ }
+ }
+ }
+
+ if(keycmd.empty())
+ {
+ QMessageBox::warning(this, tr("Warning"),
+ tr("The media cannot be shown!\nCheck if there is a program defined to open it."));
+ return;
+ }
+
+// get command and arguments from keycmd
+ getCommand(keycmd, cmd, varg);
+ if((pos = tempName.find(" ")) >= 0)
+ tempName = "\"" + tempName + "\"";
+
+ if (varg.size() == 0)
+ _spawnl (P_NOWAIT, cmd.c_str(), tempName.c_str(), NULL);
+ else if (varg.size() == 1)
+ _spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), tempName.c_str(), NULL);
+ else if (varg.size() == 2)
+ {
+ const char* p = varg[1].c_str();
+ if(varg[1] == "%L" || varg[1] == "%1")
+ _spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), tempName.c_str(), NULL);
+ else
+ _spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), p, tempName.c_str(), NULL);
+ }
+ else if (varg.size() == 3)
+ {
+ const char* p = varg[1].c_str();
+ const char* p1 = varg[2].c_str();
+ int f = varg[0].find("/prefetch:", -1);
+ if(f >= 0 && (varg[2] == "%L" || varg[2] == "%1"))
+ _spawnl (P_NOWAIT, cmd.c_str(), p, tempName.c_str(), NULL);
+ else
+ _spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), p, p1, tempName.c_str(), NULL);
+ }
+
+#else
+ string command;
+ //Mount the vector of directory paths that are
+ //stored in the PATH environment variable
+ string path = getenv("PATH");
+ vector<string> dirVector;
+ string dirPath;
+ size_t idx = 0;
+ size_t len = path.find(':', idx);
+ while (len != string::npos)
+ {
+ dirPath = path.substr(idx, len-idx);
+ dirVector.push_back(dirPath);
+ idx = len+1;
+ len = path.find(':', idx);
+ }
+
+
+ // get the last directory path
+ idx = path.rfind(':', path.size());
+ dirPath = path.substr(idx+1, path.size());
+ dirVector.push_back(dirPath);
+
+ string fs;
+ if(type != "url")
+ {
+ bool exists = false;
+ for (unsigned int i = 0; i < dirVector.size(); ++i)
+ {
+ fs = dirVector[i] + "/konqueror";
+ QFile file(fs.c_str());
+ if (file.exists() == true)
+ {
+ exists = true;
+ break;
+ }
+ }
+ if (exists == true)
+ command = "konqueror " + name + " &";
+ else
+ {
+ QString msg = tr("The program konqueror used to display your media is not") + "\n";
+ msg += tr("present in your PATH environment variable or KDE is not installed!");
+ QMessageBox::warning(this, tr("Warning"), msg);
+ return;
+ }
+ }
+ else
+ {
+ unsigned int i;
+ for (i = 0; i < dirVector.size(); ++i)
+ {
+ QString qfs = dirVector[i].c_str();
+ qfs += "/netscape";
+ QFile file(qfs);
+ if (file.exists() == true)
+ {
+ command = "netscape -remote 'openURL(" + name + ")' &";
+ break;
+ }
+ }
+
+ if (command.empty() == true)
+ {
+ for (i = 0; i < dirVector.size(); ++i)
+ {
+ QString qfs = dirVector[i].c_str();
+ qfs += "/mozilla";
+ QFile file(qfs);
+ if (file.exists() == true)
+ {
+ command = "mozilla -remote 'openURL(" + name + ")' &";
+ break;
+ }
+ }
+ }
+
+ if (command.empty() == true)
+ {
+ for (i = 0; i < dirVector.size(); ++i)
+ {
+ QString qfs = dirVector[i].c_str();
+ qfs += "/konqueror";
+ QFile file(qfs);
+ if (file.exists() == true)
+ {
+ command = "konqueror " + name + " &";
+ break;
+ }
+ }
+ }
+
+ if (command.empty() == true)
+ {
+ QString msg = tr("The program konqueror used to display your media is not") + "\n";
+ msg += tr("present in your PATH environment variable or KDE is not installed!");
+ QMessageBox::warning(this, tr("Warning"), msg);
+ return;
+ }
+ }
+
+ system(command.c_str());
+#endif
+}
diff --git a/src/terralib/application/qt/TeQtShowMedia.h b/src/terralib/application/qt/TeQtShowMedia.h
new file mode 100644
index 0000000..cdb8cd1
--- /dev/null
+++ b/src/terralib/application/qt/TeQtShowMedia.h
@@ -0,0 +1,77 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTSHOWMEDIA_H
+#define __TERRALIB_INTERNAL_QTSHOWMEDIA_H
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+#include <TeDatabase.h>
+#include <qtable.h>
+#include <urlWindow.h>
+#include <mediaDescription.h>
+#include <qpopupmenu.h>
+#include <TeDatabaseUtils.h>
+#include <TeQtGrid.h>
+#include <string>
+using namespace std;
+
+class TeQtShowMedia : public QTable
+{
+ Q_OBJECT
+ QPopupMenu* popup_;
+ URLWindow* urlWindow_;
+ MediaDescription* descriptionWindow_;
+
+public:
+ int row_;
+ string id_;
+ string table_;
+ TeDatabase* db_;
+ TeLayer* layer_;
+ int nattrs_;
+ bool cmdLocal_;
+ TeQtShowMedia(QWidget* parent = 0, const char* name = 0);
+
+ ~TeQtShowMedia();
+ void moveDown();
+ void init(string objId, TeThemeApplication* theme, TeQtGrid* grid);
+
+protected:
+ bool eventFilter(QObject*, QEvent*);
+#ifdef WIN32
+ void getCommand(string keycom, string& cmd, vector<string>& varg);
+ string getSystemKeyValue(HKEY hkey, string key, string value);
+#endif
+
+public slots:
+ void slotpressed(int, int, int, const QPoint&);
+ void slotDoubleClicked(int, int, int, const QPoint&);
+ void slotShow();
+ void slotShowFile(string file);
+ void slotInsert();
+ void slotInsertURL();
+ void slotRemove();
+ void slotSetDefault();
+ void slotDescription();
+};
+#endif
diff --git a/src/terralib/application/qt/TeQtTable.cpp b/src/terralib/application/qt/TeQtTable.cpp
new file mode 100644
index 0000000..09f7c9d
--- /dev/null
+++ b/src/terralib/application/qt/TeQtTable.cpp
@@ -0,0 +1,316 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+************************************************************************************/
+#include "TeQtTable.h"
+#include <qmessagebox.h>
+#include <qapplication.h>
+#include <TeDatabase.h>
+
+TeQtTable::TeQtTable(QWidget* parent, QString name)
+ : QTable(parent, name)
+{
+ gridX_ = -1;
+ gridY_ = -1;
+ iLine_ = -1;
+ fLine_ = -1;
+ iCol_ = -1;
+ fCol_ = -1;
+ gridWidth_ = -1;
+ gridHeight_ = -1;
+ portal_ = 0;
+ db_ = 0;
+ doRepaint_ = true;
+
+ setNumCols(0);
+ setNumRows(0);
+ setSelectionMode(QTable::NoSelection);
+}
+
+TeQtTable::~TeQtTable()
+{
+ if (portal_)
+ {
+ delete portal_;
+ portal_ = 0;
+ }
+}
+
+
+void TeQtTable::openTable (TeDatabase* db, string& table)
+{
+ int i, numRows, nCols;
+
+ doRepaint_ = false; // don�t repaint
+
+ if (table.empty() || db == 0)
+ return;
+
+ db_ = db;
+
+ if (portal_)
+ delete portal_;
+ portal_= db_->getPortal();
+
+ string s = "SELECT * FROM " + table;
+
+ if (!portal_->query(s))
+ {
+ delete portal_;
+ portal_ = 0;
+ return;
+ }
+
+ TeAttributeList attrList = portal_->AttributeList();
+ numRows = portal_->numRows();
+
+ if(numRows <= 0)
+ {
+ numRows = 0;
+ while (portal_->fetchRow(numRows))
+ numRows += 1000;
+ numRows -= 1000;
+
+ portal_->fetchRow(numRows);
+ while (portal_->fetchRow())
+ numRows++;
+ }
+
+ //get the column names
+ nCols = attrList.size();
+ setNumRows(numRows);
+ setNumCols(nCols);
+
+ for (i = 0; i < nCols; ++i)
+ horizontalHeader()->setLabel(i, attrList[i].rep_.name_.c_str());
+
+ // Set the minimum width of the vertical header of the grid
+ char buf[10];
+ sprintf(buf, "%d", numRows);
+ int minw = strlen(buf) + 1;
+ if (minw < 3)
+ minw = 3;
+ verticalHeader()->setMinimumWidth(minw*9); // supposing char width of 9 pixels
+ setLeftMargin(minw*9);
+
+
+ doRepaint_ = true; // do repaint
+
+ int visibleCols = 0;
+ int scVal = horizontalScrollBar()->value();
+ for(i=0; i<numCols(); i++)
+ {
+ if(visibleWidth() < columnPos(i) - scVal)
+ break;
+ visibleCols++;
+ }
+
+ repaint();
+}
+
+
+void TeQtTable::openSql(TeDatabase* db, string& sql)
+{
+ int i, numRows, nCols;
+
+ doRepaint_ = false; // don�t repaint
+
+ if (sql.empty() || db == 0)
+ return;
+
+ db_ = db;
+
+ if (portal_)
+ delete portal_;
+ portal_= db_->getPortal();
+
+ string s = sql;
+
+ if (!portal_->query(s))
+ {
+ delete portal_;
+ portal_ = 0;
+ return;
+ }
+
+ TeAttributeList attrList = portal_->AttributeList();
+ numRows = portal_->numRows();
+
+ if(numRows <= 0)
+ {
+ numRows = 0;
+ while (portal_->fetchRow())
+ ++numRows;
+ }
+
+ //get the column names
+ nCols = attrList.size();
+ setNumRows(numRows);
+ setNumCols(nCols);
+
+ for (i = 0; i < nCols; ++i)
+ horizontalHeader()->setLabel(i, attrList[i].rep_.name_.c_str());
+
+ // Set the minimum width of the vertical header of the grid
+ char buf[10];
+ sprintf(buf, "%d", numRows);
+ int minw = strlen(buf) + 1;
+ if (minw < 3)
+ minw = 3;
+ verticalHeader()->setMinimumWidth(minw*9); // supposing char width of 9 pixels
+ setLeftMargin(minw*9);
+
+
+ doRepaint_ = true; // do repaint
+
+ int visibleCols = 0;
+ int scVal = horizontalScrollBar()->value();
+ for(i=0; i<numCols(); i++)
+ {
+ if(visibleWidth() < columnPos(i) - scVal)
+ break;
+ visibleCols++;
+ }
+
+ repaint();
+}
+
+void TeQtTable::freePortal()
+{
+ gridX_ = -1;
+ gridY_ = -1;
+ iLine_ = -1;
+ fLine_ = -1;
+ iCol_ = -1;
+ fCol_ = -1;
+ gridWidth_ = -1;
+ gridHeight_ = -1;
+ portal_ = 0;
+ db_ = 0;
+ doRepaint_ = true;
+
+ if (portal_)
+ {
+ delete portal_;
+ portal_ = 0;
+ }
+
+ setNumRows(0);
+ setNumCols(0);
+}
+
+void TeQtTable::drawContents (QPainter *qp, int clipx, int clipy, int clipw, int cliph)
+{
+ if(doRepaint_ == false)
+ return;
+
+ update();
+ QTable :: drawContents(qp, clipx, clipy, clipw, cliph);
+}
+
+void TeQtTable::update ()
+{
+ if(portal_ == 0)
+ return;
+
+ int i, j;
+
+ int gridY = contentsY();
+ int gridX = contentsX();
+
+ int gridHeight = visibleHeight();
+ int gridWidth = visibleWidth();
+
+ if (gridX_ == gridX && gridY_ == gridY &&
+ gridHeight_ == gridHeight &&
+ gridWidth_ == gridWidth)
+ return;
+
+ gridX_ = gridX;
+ gridY_ = gridY;
+ gridHeight_ = gridHeight;
+ gridWidth_ = gridWidth;
+
+// clear cells
+ doRepaint_ = false; // do not repaint
+ if (iLine_ >= 0 && iCol_ >= 0)
+ {
+ for (i = iLine_; i <= fLine_; ++i)
+ {
+ for (j = iCol_; j <= fCol_; ++j)
+ {
+ if(item(i, j))
+ clearCell(i, j);
+ }
+ }
+ }
+
+ iLine_ = rowAt(gridY_);
+ iCol_ = columnAt(gridX_);
+ int visibleLines = rowAt(gridHeight_);
+ if (visibleLines == -1)
+ visibleLines = numRows();
+
+ int visibleCols = 0;
+ int scVal = horizontalScrollBar()->value();
+ for(i=iCol_; i<numCols(); i++)
+ {
+ if(gridWidth_ < columnPos(i) - scVal)
+ break;
+ visibleCols++;
+ }
+
+ if (iLine_ < 0 || iCol_ < 0)
+ {
+ gridX_ = gridY_ = iLine_ = fLine_ = iCol_ = fCol_ = -1;
+ doRepaint_ = true;
+ return;
+ }
+
+ fLine_ = iLine_ + visibleLines;
+ if (fLine_ > numRows() - 1)
+ fLine_ = numRows() - 1;
+ fCol_ = iCol_ + visibleCols - 1;
+
+ for (i = iLine_; i <= fLine_ ; ++i)
+ {
+ if (portal_->fetchRow(i) == false)
+ return;
+
+ string s;
+ for (j = iCol_; j <= fCol_; ++j)
+ {
+ s = portal_->getData(j);
+ setText(i, j, s.c_str());
+
+ if(i == fLine_ && j == fCol_- 1)
+ {
+ doRepaint_ = true; // do repaint
+ updateCell(i, j);
+ }
+ }
+ }
+
+ doRepaint_ = true; // do repaint
+}
+
+
+
+
+
diff --git a/src/terralib/application/qt/TeQtTable.h b/src/terralib/application/qt/TeQtTable.h
new file mode 100644
index 0000000..c6825ae
--- /dev/null
+++ b/src/terralib/application/qt/TeQtTable.h
@@ -0,0 +1,67 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef TEQTTABLE_H
+#define TEQTTABLE_H
+
+#include <qtable.h>
+#include <string>
+using namespace std;
+
+class TeDatabase;
+class TeDatabasePortal;
+
+class TeQtTable : public QTable
+{
+protected:
+ TeDatabase *db_;
+ TeDatabasePortal *portal_;
+ int gridX_, gridY_;
+ int iLine_, fLine_;
+ int iCol_, fCol_;
+ int gridWidth_, gridHeight_;
+ bool doRepaint_;
+
+ virtual void drawContents (QPainter *qp, int clipx, int clipy, int clipw, int cliph);
+
+ void update();
+
+public:
+
+ TeQtTable(QWidget *parent, QString name);
+
+ virtual ~TeQtTable();
+
+ virtual void endEdit(int row, int col, bool accept, bool replace)
+ {
+ QTable::endEdit(row, col, accept, replace);
+ }
+
+ void openTable(TeDatabase* db, string& table);
+
+ void openSql(TeDatabase* db, string& sql);
+
+ void freePortal();
+
+ TeDatabasePortal* getPortal() {return portal_;}
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtTerraStat.cpp b/src/terralib/application/qt/TeQtTerraStat.cpp
new file mode 100644
index 0000000..a1ed886
--- /dev/null
+++ b/src/terralib/application/qt/TeQtTerraStat.cpp
@@ -0,0 +1,1184 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+
+#include "TeSTElementSet.h"
+#include "TeKernelParams.h"
+#include "TeQtTerraStat.h"
+#include "TeKernelFunctions.h"
+#include "TeStatDataStructures.h"
+#include "TeQtDatabasesListView.h"
+#include "TeImportRaster.h"
+#include "TeQtViewsListView.h"
+#include "TeQtGrid.h"
+#include "TeSTEFunctionsDB.h"
+#include "TeWaitCursor.h"
+#include "TeColorUtils.h"
+#include "TeDatabaseUtils.h"
+#include "TeKernelParams.h"
+#include "TeQtLayerItem.h"
+#include <qobject.h>
+#include <qapplication.h>
+
+
+string getKernelFunction (TeKernelFunctionType t)
+{
+ string result;
+
+ switch (t)
+ {
+ case TeKQuartic:
+ result = QObject::tr("Quartic").latin1();
+ break;
+ case TeKNormal:
+ result = QObject::tr("Normal").latin1();
+ break;
+ case TeKUniform:
+ result = QObject::tr("Uniform").latin1();
+ break;
+ case TeKTriangular:
+ result = QObject::tr("Triangular").latin1();
+ break;
+ case TeKNegExponential:
+ result = QObject::tr("NegExponential").latin1();
+ break;
+ }
+ return result;
+}
+
+string getKernelComputeType (TeKernelComputeType t)
+{
+ string result;
+
+ switch (t)
+ {
+ case TeKDensity:
+ result = QObject::tr("Density").latin1();
+ break;
+ case TeKProbability:
+ result = QObject::tr("Probability").latin1();
+ break;
+ case TeKMovingAverage:
+ result = QObject::tr("Spatial Moving Average").latin1();
+ break;
+ }
+ return result;
+}
+
+string getCombinationType (TeKernelCombinationType /* t */)
+{
+ string result;
+
+ //COMPLETAR---
+
+// switch (t)
+// {
+// case TeNone:
+// result = "None";
+// break;
+// default:
+// result = "DESCONHECIDO";
+// break;
+// }
+ result = "DESCONHECIDO";
+ return result;
+}
+
+
+/**
+ * Retorna legenda para kernel
+ **/
+bool getKernelLegend(TeKernelParams& par, vector<string>& result)
+{
+ string legend = QObject::tr("Kernel parameters").latin1();
+ result.push_back(legend);
+ string numb = "";
+
+ legend = QObject::tr("Event theme").ascii()+ numb +" : "+ par.eventThemeName1_ ;
+ result.push_back(legend);
+
+ if(!par.intensityAttrName1_.empty())
+ {
+ legend = QObject::tr("Attribute name").ascii()+ numb +" : "+ par.intensityAttrTable1_+"."+ par.intensityAttrName1_;
+ result.push_back(legend);
+ }
+
+ if (par.radiusValue1_ > 0) {
+ legend = QObject::tr("Radius value").ascii()+ numb +" : "+ Te2String(par.radiusValue1_);
+ }
+ else {
+ legend = QObject::tr("Adaptive radius").ascii();
+ }
+ result.push_back(legend);
+
+ legend = QObject::tr("Compute: ").ascii()+getKernelComputeType(par.computeType1_);
+ result.push_back(legend);
+
+ legend = QObject::tr("Function: ").ascii()+getKernelFunction(par.kernelFunction1_);
+ result.push_back(legend);
+
+ /*
+ if(!eventThemeName2_.empty())
+ {
+ legend = "Combination type : "+ getCombinationType(combinationType_);
+ result.push_back(legend);
+ numb = "1";
+ }
+
+ if(!eventThemeName2_.empty())
+ {
+ legend = "Event theme 2 : "+ eventThemeName2_ ;
+ result.push_back(legend);
+
+ if(!intensityAttrName2_.empty())
+ {
+ legend = "Intensity attribute name 2 : "+ intensityAttrName2_;
+ result.push_back(legend);
+ legend = "Intensity attribute table 2 : "+ intensityAttrTable2_;
+ result.push_back(legend);
+ }
+
+ legend = "Radius value 2 : "+ Te2String(radiusValue2_);
+ result.push_back(legend);
+ }
+ */
+ return true;
+}
+
+
+/**
+ * Grava uma coluna na tabela de atributos associada a um STOSet.
+ * Nome da coluna eh o mesmo nome da propriedade
+ **/
+bool insertPropertyColumn(TeSTElementSet& stoSet,
+ const string& tableName,
+ const string& columnName)
+{
+
+
+ vector<int> index;
+ int ind = stoSet.getAttributeIndex(columnName);
+ if(ind<0)
+ {
+ ind = stoSet.getAttributeIndex(tableName+"."+columnName);
+ if(ind>-1)
+ index.push_back (ind);
+ }
+ else
+ index.push_back (ind);
+
+ if(!index.empty())
+ {
+ if (!TeUpdateDBFromSet (&stoSet, tableName, &index))
+ return false;
+ }
+ else
+ {
+ if (!TeUpdateDBFromSet (&stoSet, tableName))
+ return false;
+ }
+ return true;
+}
+
+/**
+ * Grava uma coluna na tabela de atributos associada a um STOSet.
+ * Nome da coluna eh o mesmo nome da propriedade
+ **/
+bool insertPropertyColumn(TeSTStatInstanceSet& stSet,
+ int idxDoubleProp,
+ TeTheme* theme,
+ const string& tableName,
+ const string& columnName) {
+
+ TeProperty prop;
+
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ double value;
+ TePropertyVector pVect;
+ pVect.push_back(prop);
+
+ //Constroi um de outro
+ TeSTElementSet rs(theme);
+
+ TeSTStatInstanceSet::iterator ito = stSet.begin();
+ while (ito != stSet.end()) {
+
+ //Cria uma nova propriedade no objeto
+ (*ito).getDoubleProperty(idxDoubleProp, value);
+ pVect[0].value_ = Te2String(value, STAT_PRECISION);
+ (*ito).properties(pVect);
+ rs.insertSTInstance(*ito);
+ ++ito;
+ }
+
+ return insertPropertyColumn(rs, tableName, columnName) ;
+}
+
+
+/***
+ * Cria um STOSet a partir de um tema e um conjunto de atributos,
+ * colocando todas as tabelas do TEMA
+ ***/
+bool createSTOSetFromTheme(TeTheme* theme,
+ vector<string>& attributes,
+ TeSTElementSet* rs) {
+
+ TeSTElementSet newRS(theme);
+
+ if (TeSTOSetBuildDB(&newRS, true, false, attributes) ) {
+ *rs = newRS;
+ return true;
+ }
+ else return false;
+}
+
+
+/***
+ * Cria um STOSet a partir de um tema e um conjunto de atributos,
+ * colocando todas as tabelas do TEMA
+ ***/
+bool createSTOStatSetFromTheme(TeTheme* theme,
+ vector<string>& attributes,
+ int additionalDouble,
+ TeSTStatInstanceSet* rs) {
+
+ TeSTElementSet stoSet(theme);
+ if (!TeSTOSetBuildDB(&stoSet, true, false, attributes))
+ return false;
+ rs->Copy(stoSet, attributes.size(), additionalDouble);
+ return true;
+
+}
+
+
+
+void TeKernelMethod::error(TeKernelErrorType type, string message, QWidget* parent) {
+
+ QString title;
+ switch (type) {
+ case Uerror:
+ title = tr("Unexpected Error");
+ break;
+ case Error:
+ title = tr("Error");
+ break;
+ case Warning:
+ title = tr("Warning");
+ break;
+ }
+
+ if (parent) {
+ QMessageBox::information(parent, title, tr(message.c_str()));
+ }
+ else {
+ QMessageBox::information(0, (title), tr(message.c_str()));
+ }
+
+}
+
+/**
+ * Defines name, theme pointer and id for a given theme
+ * id = 0 -- support theme
+ * id = 1,2 -- first and second event theme
+ **/
+bool TeKernelMethod::setTheme(string name, int id, TeView* view) {
+ if (id == 0) {
+ params_.supportThemeName_ = name;
+ regTheme_ = (TeThemeApplication *)view->get(params_.supportThemeName_);
+ if (evTheme1_ == NULL) {
+ return false;
+ }
+ params_.supportThemeId_ = regTheme_->id();
+ }
+ else if (id == 1) {
+ params_.eventThemeName1_ = name;
+
+ evTheme1_ = view->get(params_.eventThemeName1_);
+ if (evTheme1_ == NULL) {
+ return false;
+ }
+ params_.eventThemeId1_ = evTheme1_->id();
+
+ }
+ else if (id == 2) {
+ params_.eventThemeName2_ = name;
+
+ evTheme2_ = view->get(params_.eventThemeName2_);
+ if (evTheme2_ == NULL) {
+ return false;
+ }
+ params_.eventThemeId2_ = evTheme2_->id();
+
+ }
+ return true;
+}
+
+
+enum TeGridType {GridFromSupport, GridFromEvent, GridFromBoth};
+
+
+/**
+ * Generates support set from parameters
+ * If grid, generate box
+ * If theme, generate column
+ **/
+bool TeKernelMethod::generateSupportSet() {
+
+
+ bool isGrid = isGridReg_ || isGridEv_;
+ bool isRatio = (params_.eventThemeId2_ != -1);
+
+ justOnePolygon_ = false;
+
+ //support set is from type TeKernelGridSupport
+ if (isGrid) {
+
+ //Computes grid boundary and defines if just one set.
+ TeGridType t;
+ TeBox gridBound;
+
+
+ if (isRatio) {
+ t = GridFromBoth;
+ }
+ else if (isGridEv_) {
+ t = GridFromEvent;
+ }
+ else {
+ t = GridFromSupport;
+ }
+
+ if (db_ == NULL) {
+ error(Uerror, tr("There is no database. Please, contact support!").latin1());
+ return false;
+ }
+
+ TeBox bound1;
+ TeBox bound2;
+
+ switch(t) {
+ case GridFromSupport:
+ if (regTheme_ == NULL) {
+ error(Uerror, tr("There is no support theme. Please, contact support!").latin1());
+ return false;
+ }
+ gridBound = db_->getThemeBox(regTheme_);
+ break;
+ case GridFromEvent:
+ if (evTheme1_ == NULL) {
+ error(Uerror, tr("There is no event theme. Please, contact support!").latin1());
+ return false;
+ }
+ gridBound = db_->getThemeBox(evTheme1_);
+ break;
+ case GridFromBoth:
+ if ((evTheme1_ == NULL) || (evTheme2_ == NULL)) {
+ error(Uerror, tr("There is no event theme. Please, contact support!").latin1());
+ return false;
+ }
+
+ bound1 = db_->getThemeBox(evTheme1_);
+ bound2 = db_->getThemeBox(evTheme2_);
+
+ //Box is the rectangle that envolves both boxes
+ gridBound.x1_ = (bound1.x1_ < bound2.x1_) ? bound1.x1_ : bound2.x1_;
+ gridBound.y1_ = (bound1.y1_ < bound2.y1_) ? bound1.y1_ : bound2.y1_;
+ gridBound.x2_ = (bound1.x2_ > bound2.x2_) ? bound1.x2_ : bound2.x2_;
+ gridBound.y2_ = (bound1.y2_ < bound2.y2_) ? bound1.y2_ : bound2.y2_;
+
+ break;
+
+ default:
+ error(Uerror, tr("Invalid type. Please, contact support!").latin1());
+ return false;
+ break;
+ }
+
+
+ if (!gridBound.isValid()) {
+ error(Uerror, tr("Invalid grid box. Please, contact support!").latin1());
+ return false;
+ }
+
+
+ //Verifies if it has just one polygon
+ if (t == GridFromSupport) {
+
+ TeDatabasePortal* portal = this->db_->getPortal();
+
+ TeLayer* l = this->regTheme_->layer();
+
+ if (l->hasGeometry(TePOLYGONS))
+ {
+ string count = "SELECT COUNT(*) FROM " + l->tableName(TePOLYGONS);
+ count += ", " + regTheme_->collectionTable() + " WHERE ";
+ count += l->tableName(TePOLYGONS) + ".object_id = ";
+ count += regTheme_->collectionTable() + ".c_object_id";
+ portal->freeResult();
+ if(portal->query(count))
+ {
+ if(portal->fetchRow())
+ {
+ count = portal->getData(0);
+ }
+ else {
+ error(Uerror, tr("There is no polygons. Please, contact support!").latin1());
+ }
+ }
+
+ int nPol = atoi(count.c_str());
+ this->justOnePolygon_ = (nPol == 1);
+ delete portal;
+ }
+ }
+
+ TeProjection* proj = db_->loadProjection(this->evTheme1_->layer()->projection()->id());
+
+ if (proj == NULL) {
+ error(Uerror, tr("There is no projection. Please, contact support!").latin1());
+ return false;
+ }
+
+ regSet_ = new TeKernelGridSupport(gridBound, gridCols_, proj);
+ }
+ //Gera grid irregular a partir de poligonos do layer
+ else {
+
+ //Define regioes a partir de tema -- aplicar restricao
+ if (regTheme_ == NULL) {
+ error(Uerror, tr("There is no support theme. Please, contact support!").latin1());
+ return false;
+ }
+
+ //Generates set from theme
+ vector<string> empty;
+ TeSTStatInstanceSet* rs = new TeSTStatInstanceSet();
+ createSTOStatSetFromTheme(regTheme_,
+ empty, 1, rs);
+ resName_ = string(this->params_.supportThemeAttr_);
+ regSet_ = rs;
+ }
+ return true;
+}
+
+
+/**
+ * Generates event set from theme. If there is an attribute, set is initialize with it.
+ * Otherwise, just geometries are loaded. Geometries may be points or polygons
+ **/
+bool TeKernelMethod::generateEventSet(int which) {
+
+ bool isPoint;
+ TeTheme* theme;
+ TeLayer* layer;
+ string table;
+ string column;
+
+ if (which == 1) {
+ isPoint = this->isPoint1_;
+ theme = this->evTheme1_;
+ if (this->evTheme1_ == NULL) {
+ error(Uerror, tr("There is no event set for the kernel. Please, contact support!").latin1());
+ return false;
+ }
+ layer = this->evTheme1_->layer();
+ if (layer == NULL) {
+ error(Uerror, tr("There is no layer for the theme. Please, contact support!").latin1());
+ return false;
+ }
+ table = this->params_.intensityAttrTable1_;
+ column = this->params_.intensityAttrName1_;
+ }
+ else if (which == 2) {
+ isPoint = this->isPoint2_;
+ theme = this->evTheme2_;
+ if (this->evTheme2_ == NULL) {
+ error(Uerror, tr("There is no event set for the kernel. Please, contact support!").latin1());
+ return false;
+ }
+ layer = this->evTheme2_->layer();
+ if (layer == NULL) {
+ error(Uerror, tr("There is no layer for the theme. Please, contact support!").latin1());
+ return false;
+ }
+ table = this->params_.intensityAttrTable2_;
+ column = this->params_.intensityAttrName2_;
+ }
+ else {
+ error(Uerror, tr("Invalid event set. Please, contact support!").latin1());
+ return false;
+ }
+
+ TeWaitCursor wait;
+
+ bool done;
+ vector<string> vecAttr;
+ if (column.compare("")) {
+ vecAttr.push_back(column);
+ }
+ if (isPoint) {
+
+ //Generates set from theme
+ TePointTInstanceSet* evs = new TePointTInstanceSet();
+ if (vecAttr.size() == 0) {
+ done = createSTOStatSetFromTheme(theme, vecAttr, 1, evs);
+ //Deve inicializar com 1 toda a propriedade
+ TePointTInstanceSet::iterator itev = evs->begin();
+ while (itev != evs->end()) {
+ (*itev).setDoubleProperty(0, 1.0);
+ ++itev;
+ }
+ }
+ else {
+ done = createSTOStatSetFromTheme(theme, vecAttr, 0, evs);
+ }
+
+ if (!done)
+ return false;
+ if (which == 1) {
+ evSet1_ = evs;
+ }
+ else {
+ evSet2_ = evs;
+ }
+
+ }
+ else {
+
+ //Generates set from theme
+ TePointTInstanceSet* evs = new TePointTInstanceSet();
+ if (vecAttr.size() == 0) {
+ done = createSTOStatSetFromTheme(theme, vecAttr, 1, evs);
+ //Deve inicializar com 1 toda a propriedade
+ TePointTInstanceSet::iterator itev = evs->begin();
+ while (itev != evs->end()) {
+ (*itev).setDoubleProperty(0, 1.0);
+ ++itev;
+ }
+ }
+ else {
+ done = createSTOStatSetFromTheme(theme, vecAttr, 0, evs);
+ }
+ if (!done)
+ return false;
+ if (which == 1) {
+ evSet1_ = evs;
+ }
+ else {
+ evSet2_ = evs;
+ }
+ }
+ return true;
+}
+
+
+bool TeKernelMethod::call()
+{
+ bool isGrid = this->isGridEv_ || this->isGridReg_;
+ bool isRatio = this->params_.eventThemeName2_.compare("");
+
+// bool justOnePolygon = false;
+
+ double totalArea;
+ if (isGrid) {
+ totalArea = ((TeKernelGridSupport *)regSet_)->totalArea();
+ }
+ else {
+ //SUBSTITUIR
+ totalArea = TeGeometryArea(db_->getThemeBox(regTheme_));
+ }
+
+ int totalRegions;
+ if (isGrid) {
+ totalRegions = ((TeKernelGridSupport *)regSet_)->numObjects();
+ }
+ else {
+ totalRegions = ((TeSTStatInstanceSet *)regSet_)->numObjects();
+ }
+
+ if (TeProgress::instance())
+ {
+ TeProgress::instance()->setTotalSteps(totalRegions);
+ }
+
+ //Kernel de razao
+ if (isRatio) {
+
+
+ TeStatKernelRatio kerRatio;
+ kerRatio.numReg_ = totalRegions;
+ kerRatio.kComb_ = params_.combinationType_;
+ kerRatio.ktype_ = params_.computeType1_;
+ kerRatio.kfunc1_ = params_.kernelFunction1_;
+ kerRatio.radius1_ = params_.radiusValue1_;
+ kerRatio.kfunc2_ = params_.kernelFunction2_;
+ kerRatio.radius2_ = params_.radiusValue2_;
+ kerRatio.totalArea_ = totalArea;
+
+
+ //Colocar janela com parametros para o usuario confirmar
+
+ if (isGrid) {
+ //Verifica se o iterador eh para um unico poligono
+ if (justOnePolygon_) {
+ TeDatabasePortal* portal = db_->getPortal();
+
+ string count = "SELECT c_object_id FROM " + regTheme_->layer()->tableName(TePOLYGONS)+",";
+ count += regTheme_->collectionTable() + " WHERE ";
+ count += regTheme_->layer()->tableName(TePOLYGONS) + ".object_id = ";
+ count += regTheme_->collectionTable() + ".c_object_id";
+ portal->freeResult();
+ if(portal->query(count))
+ {
+ if(portal->fetchRow())
+ {
+ count = portal->getData(0);
+ }
+ else {
+ error(Uerror, tr("There is no polygons. Please, contact support!").latin1());
+ return false;
+ }
+ }
+ delete portal;
+ TePolygonSet polygon;
+ if (!regTheme_->layer()->loadGeometrySet(count, polygon)) {
+ error(Uerror, tr("There is no polygon boundary. Please, contact support!").latin1());
+ return false;
+ }
+ boundary_ = polygon.first();
+ if (boundary_.empty()) {
+ error(Uerror, tr("There is no polygon boundary. Please, contact support!").latin1());
+ return false;
+ }
+ return kerRatio.apply(*((TePointTInstanceSet *)evSet1_),
+ *((TePointTInstanceSet *)evSet2_),
+ (*((TeKernelGridSupport *)regSet_)).begin(boundary_),
+ (*((TeKernelGridSupport *)regSet_)).end(boundary_));
+ }
+ else {
+ return kerRatio.apply(*((TePointTInstanceSet *)evSet1_),
+ *((TePointTInstanceSet *)evSet2_),
+ (*((TeKernelGridSupport *)regSet_)).begin(),
+ (*((TeKernelGridSupport *)regSet_)).end());
+ }
+ }
+ else {
+ return kerRatio.apply(*((TePointTInstanceSet *)evSet1_),
+ *((TePointTInstanceSet *)evSet2_),
+ (*((TeSTStatInstanceSet *)regSet_)).begin(),
+ (*((TeSTStatInstanceSet *)regSet_)).end());
+ }
+ }
+ //Kernel normal com um unico conjunto
+ else {
+
+ TeStatKernel kernel;
+ kernel.radius_ = params_.radiusValue1_;
+ kernel.kfunc_ = params_.kernelFunction1_;
+ kernel.ktype_ = params_.computeType1_;
+ kernel.totalArea_ = totalArea;
+ kernel.numReg_ = totalRegions;
+
+ //Colocar janela com parametros para o usuario confirmar
+
+ if (isGrid) {
+ //Verifica se o iterador eh para um unico poligono
+ if (justOnePolygon_) {
+ TeDatabasePortal* portal = db_->getPortal();
+
+ string count = "SELECT c_object_id FROM " + regTheme_->layer()->tableName(TePOLYGONS)+",";
+ count += regTheme_->collectionTable() + " WHERE ";
+ count += regTheme_->layer()->tableName(TePOLYGONS) + ".object_id = ";
+ count += regTheme_->collectionTable() + ".c_object_id";
+ portal->freeResult();
+ if(portal->query(count))
+ {
+ if(portal->fetchRow())
+ {
+ count = portal->getData(0);
+ }
+ else {
+ error(Uerror, tr("There is no polygons. Please, contact support!").latin1());
+ return false;
+ }
+ }
+ delete portal;
+ TePolygonSet polygon;
+ if (!regTheme_->layer()->loadGeometrySet(count, polygon)) {
+ error(Uerror, tr("There is no polygon boundary. Please, contact support!").latin1());
+ return false;
+ }
+ boundary_ = polygon.first();
+ if (boundary_.empty()) {
+ error(Uerror, tr("There is no polygon boundary. Please, contact support!").latin1());
+ return false;
+ }
+ return kernel.apply(*((TePointTInstanceSet *)evSet1_),
+ (*((TeKernelGridSupport *)regSet_)).begin(boundary_),
+ (*((TeKernelGridSupport *)regSet_)).end(boundary_));
+ }
+ else {
+ return kernel.apply(*((TePointTInstanceSet *)evSet1_),
+ (*((TeKernelGridSupport *)regSet_)).begin(),
+ (*((TeKernelGridSupport *)regSet_)).end());
+ }
+ }
+ else {
+ return kernel.apply(*((TePointTInstanceSet *)evSet1_),
+ (*((TeSTStatInstanceSet *)regSet_)).begin(),
+ (*((TeSTStatInstanceSet *)regSet_)).end());
+ }
+ }
+ return true;
+}
+
+
+
+/**
+ * Apply kernel method based on parameters definition
+ * Create event(s) set
+ * Create support set
+ * Execute suitable kernel method (basic, adaptive, ratio)
+ * Returns support set region
+ **/
+bool TeKernelMethod::apply(void*& supportSet, QWidget* parent)
+{
+ precision_ = -1;
+
+ //Verifies if there is an event theme
+ if (this->evTheme1_ == NULL) {
+ error(Uerror, tr("There is no event set for the kernel. Please, contact support!").latin1());
+ return false;
+ }
+
+ //Verifies if all themes are in the same projection
+ TeProjection* ev1 = this->evTheme1_->layer()->projection();
+ if (this->regTheme_ != NULL) {
+ TeProjection* reg = this->regTheme_->layer()->projection();
+ if (!(*reg == *ev1)) {
+ error(Warning,tr("All of the themes should be in the same projection!").latin1(),parent);
+ return false;
+ }
+ }
+
+ if (this->evTheme2_ != NULL) {
+ TeProjection* ev2 = this->evTheme2_->layer()->projection();
+ if (!(*ev1 == *ev2)) {
+ error(Warning,tr("All of the themes should be in the same projection!").latin1(),parent);
+ return false;
+ }
+ }
+
+ if (TeProgress::instance())
+ {
+ TeProgress::instance()->setTotalSteps(4);
+ TeProgress::instance()->setMessage(tr("Generating the support set...").latin1());
+ TeProgress::instance()->setProgress(1);
+ }
+
+ // Generates support set
+ if (!this->generateSupportSet() ) {
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ error(Error, tr("It was not possible to create the support set!").latin1(), parent);
+ return false;
+ }
+ if (TeProgress::instance()) {
+ if (TeProgress::instance()->wasCancelled() ) {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ {
+ TeProgress::instance()->setMessage(tr("Generating the event set...").latin1());
+ TeProgress::instance()->setProgress(2);
+ }
+ }
+
+ // Generates first event set
+ if (!this->generateEventSet(1)) {
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ error(Error, tr("It was not possible to create the event set!").latin1(),parent);
+ return false;
+ }
+
+ if (TeProgress::instance()) {
+ if (TeProgress::instance()->wasCancelled()) {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ TeProgress::instance()->setTotalSteps(4);
+ }
+
+
+ // Generates second event set
+ if (this->evTheme2_ != NULL) {
+ if (TeProgress::instance())
+ {
+ TeProgress::instance()->setTotalSteps(5);
+ TeProgress::instance()->setMessage(tr("Generating second event set...").latin1());
+ TeProgress::instance()->setProgress(3);
+ }
+ if (!this->generateEventSet(2)) {
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ error(Error, tr("It was not possible to create the event set 2!").latin1(),parent);
+ return false;
+ }
+ }
+
+ if (TeProgress::instance())
+ {
+ TeProgress::instance()->setTotalSteps(5);
+ TeProgress::instance()->setMessage(tr("Calculating Kernel Map...").latin1());
+ TeProgress::instance()->setProgress(4);
+ }
+
+ // Calls kernel functions
+ bool okKernel = this->call();
+ if (okKernel)
+ supportSet = this->regSet_;
+
+ //Deallocate temporary values
+ if (this->evSet1_ != NULL)
+ {
+ delete (TePointTInstanceSet *)this->evSet1_;
+ }
+
+ if (this->evSet2_ != NULL)
+ {
+ delete (TePointTInstanceSet *)this->evSet2_;
+ }
+// delete this->evSet2_;
+
+ return okKernel;
+}
+
+
+
+bool TeKernelMethod::getPrecision(int& prec) {
+
+ //Precisao ja foi calculada
+ if (precision_ >= 0) {
+ prec= precision_;
+ return true;
+ }
+
+ bool isGrid = isGridReg_ || isGridEv_;
+ if (isGrid) {
+ if (justOnePolygon_) {
+ if (this->getPrecision((*((TeKernelGridSupport *)regSet_)).begin(boundary_),
+ (*((TeKernelGridSupport *)regSet_)).end(boundary_))) {
+ prec = precision_;
+ return true;
+ }
+ else
+ return false;
+ }
+ else {
+ if (this->getPrecision((*((TeKernelGridSupport *)regSet_)).begin(),
+ (*((TeKernelGridSupport *)regSet_)).end())) {
+ prec = precision_;
+ return true;
+ }
+ else
+ return false;
+ }
+ }
+ if (this->getPrecision((*((TeSTStatInstanceSet *)regSet_)).begin(),
+ (*((TeSTStatInstanceSet *)regSet_)).end())) {
+ prec = precision_;
+ return true;
+ }
+ else {
+ return false;
+ }
+
+}
+
+bool TeKernelMethod::setGridLayer(string name) {
+
+ this->resName_ = name;
+ this->gridLayer_ = NULL;
+
+ // Check whether there is a layer with this name in the database
+ TeLayerMap& layerMap = db_->layerMap();
+ TeLayerMap::iterator it;
+ for (it = layerMap.begin(); it != layerMap.end(); ++it)
+ {
+ if (it->second->name() == name)
+ {
+ this->gridLayer_ = it->second;
+ this->params_.generatedLayerId_ = it->second->id();
+ break;
+ }
+ }
+
+ //Vai criar uma nova -- verifica se nome esta ok
+ if (!gridLayer_)
+ {
+ size_t pos = name.find("-",string::npos,1);
+ if (pos != string::npos)
+ {
+ QMessageBox::warning( NULL, tr("Error"),
+ tr("The layer name cannot have the \"-\" character!"));
+ return false;
+ }
+ char ch = name.at(0);
+ if (isdigit(ch))
+ {
+ QMessageBox::information( NULL, tr("Error"),
+ tr("The layer name cannot have numerical characters!"));
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+bool TeKernelMethod::createLayer(TeRaster* raster,
+ TerraViewBase* mWindow)
+{
+
+ TeQtDatabasesListView* dbView = mWindow->getDatabasesListView();
+ if (!isNewLayer()) {
+
+ //Recupera item associado ao layer para poder remover
+ TeQtLayerItem* lItPrev = dbView->currentLayerItem();
+ dbView->selectLayerItem(gridLayer_);
+ TeQtLayerItem* layerItem = dbView->currentLayerItem();
+ if (lItPrev != layerItem) {
+ mWindow->removeItem((TeQtCheckListItem*)layerItem);
+ if (lItPrev != NULL)
+ dbView->selectLayerItem(lItPrev->getLayer());
+ }
+ else {
+ mWindow->removeItem(layerItem);
+ }
+ }
+ TeLayer* l = new TeLayer(resName_, db_, raster->projection());
+ int bw, bh;
+ if (raster->params().ncols_ > 512)
+ {
+ bw = 256;
+ bh = 256;
+ }
+ else
+ {
+ bw = raster->params().ncols_;
+ bh = raster->params().nlines_;
+ }
+ if (!TeImportRaster(l,raster,bw,bh, TeNoCompression,"", -TeMAXFLOAT, true, TeNoExpansible))
+ {
+ return false;
+ }
+
+ params_.generatedLayerId_ = l->id();
+
+ TeQtDatabaseItem *dbItem = dbView->currentDatabaseItem();
+
+ TeQtLayerItem *layerItem =
+ new TeQtLayerItem((QListViewItem*)dbItem,l->name().c_str(), l);
+ layerItem->setEnabled(true);
+ if (!dbView->isOpen(layerItem->parent()))
+ dbView->setOpen(layerItem->parent(),true);
+ mWindow->checkWidgetEnabling();
+
+ //Verifica se existe tema com mesmo nome e remove
+ vector<TeViewNode*>& themeVec = mWindow->currentView()->themes();
+ TeThemeApplication* theme;
+ unsigned int i;
+ for (i = 0; i < themeVec.size(); i++) {
+ theme = (TeThemeApplication *)themeVec[i];
+ if (!resName_.compare(theme->name())) {
+ TeQtViewsListView* viewList = mWindow->getViewsListView();
+ TeQtThemeItem* themeItem = viewList->getThemeItem(theme);
+ if (themeItem != NULL)
+ mWindow->removeItem((TeQtCheckListItem*)themeItem);
+ }
+ }
+
+ TeAttrTableVector ATV;
+ if (! mWindow->createTheme(resName_, mWindow->currentView(), l, "", ATV))
+ return false;
+
+
+ //Recupera apontador para o tema criado
+
+ themeVec = mWindow->currentView()->themes();
+ for (i = 0; i < themeVec.size(); i++) {
+ theme = (TeThemeApplication *)themeVec[i];
+ if (!resName_.compare(theme->name())) {
+ this->rasterTheme_ = theme;
+ }
+ }
+ if (this->rasterTheme_ == NULL) {
+ QMessageBox::information( NULL, tr("Error"),
+ tr("There is no theme with the raster representation!"));
+ return false;
+ }
+ return true;
+}
+
+bool TeKernelMethod::createColumn(TeThemeApplication* currTheme,
+ TeQtGrid* grid)
+{
+
+ grid->clear();
+ if(!insertPropertyColumn(*((TeSTStatInstanceSet *)this->regSet_),
+ 0, this->regTheme_, params_.supportThemeTable_, params_.supportThemeAttr_))
+ return false;
+
+ // ---------------------------------------------- load updated table from database
+ // Update all the themes that uses this table
+ TeViewMap& viewMap = this->db_->viewMap();
+ TeViewMap::iterator it;
+ set<TeLayer*> layerSet;
+ for (it = viewMap.begin(); it != viewMap.end(); ++it)
+ {
+ TeView *view = it->second;
+ vector<TeViewNode*>& themesVector = view->themes();
+ for (unsigned int i = 0; i < themesVector.size(); ++i)
+ {
+ TeTheme *theme = (TeThemeApplication*)themesVector[i];
+ if (theme->isThemeTable(params_.supportThemeTable_) == true)
+ {
+ theme->loadThemeTables();
+ layerSet.insert(theme->layer());
+ }
+ }
+ }
+
+ // Update the layer tables affected
+ set<TeLayer*>::iterator setIt;
+ for (setIt = layerSet.begin(); setIt != layerSet.end(); ++setIt)
+ (*setIt)->loadLayerTables();
+
+ // ---------------------------------------------- grid
+ if(currTheme!= NULL)
+ {
+ grid->init(currTheme);
+ grid->refresh();
+ grid->goToLastColumn();
+ }
+
+ return true;
+}
+
+//Alterando pois soh precisa internamente
+bool TeKernelMethod::createKernelLegends(int nColors, bool /* color */)
+{
+ int precision;
+ if (!getPrecision(precision))
+ {
+ QMessageBox::critical(NULL, tr("Error"),
+ tr("Unexpected error in the evaluation of the kernel precision!"));
+ return false;
+ }
+
+ // recupera o tema sobre o qual foi calculado kernel
+ TeThemeApplication* theme;
+ if (this->rasterTheme_ != NULL)
+ theme = this->rasterTheme_;
+ else
+ theme = this->regTheme_;
+
+ TeAttributeRep rep;
+ rep.type_ = TeREAL;
+
+ TeGrouping* groupKernel = new TeGrouping();
+ groupKernel->groupNumSlices_ = nColors;
+ groupKernel->groupPrecision_ = precision;
+
+ if (theme->layer()->geomRep() & TeRASTER) // suporte foi grade
+ {
+ groupKernel->groupMode_ = TeRasterSlicing;
+ rep.name_ = "0";
+ }
+ else // suporte foi regioes
+ {
+ groupKernel->groupMode_ = TeEqualSteps;
+ rep.name_ = this->params_.supportThemeTable_ + "." + this->params_.supportThemeAttr_;
+ }
+ groupKernel->groupAttribute_ = rep;
+
+ if (!theme->buildGrouping(groupKernel))
+ return false;
+
+ theme->groupColor("Cy-G-Y-Or-R");
+ vector<string> colorRamp;
+ colorRamp.push_back("CYAN");
+ colorRamp.push_back("GREEN");
+ colorRamp.push_back("YELLOW");
+ colorRamp.push_back("ORANGE");
+ colorRamp.push_back("RED");
+
+ // cria rampa de cores default para dados de kernel e define visual de cada fatia
+ vector<TeColor> colorGrad;
+ getColors(colorRamp,10, colorGrad);
+ for (int g=0; g<theme->grouping()->groupNumSlices_; g++)
+ {
+ TeVisual visual(TePOLYGONS);
+ visual.color(colorGrad[g]);
+ if((theme->layer()->geomRep() & TePOLYGONS) ||
+ (theme->layer()->geomRep() & TeCELLS) ||
+ (theme->layer()->geomRep() & TeRASTER))
+ {
+ visual.transparency(theme->defaultLegend().visual(TePOLYGONS).transparency());
+ visual.contourStyle(theme->defaultLegend().visual(TePOLYGONS).contourStyle());
+ visual.contourWidth(theme->defaultLegend().visual(TePOLYGONS).contourWidth());
+ visual.contourColor(theme->defaultLegend().visual(TePOLYGONS).contourColor());
+ theme->setGroupingVisual(g+1,visual,TePOLYGONS);
+ }
+ if(theme->layer()->geomRep() & TeLINES)
+ {
+ visual.style(theme->defaultLegend().visual(TeLINES).style());
+ visual.width(theme->defaultLegend().visual(TeLINES).width());
+ theme->setGroupingVisual(g+1,visual,TeLINES);
+ }
+ else if(theme->layer()->geomRep() & TePOINTS)
+ {
+ visual.style(theme->defaultLegend().visual(TePOINTS).style());
+ visual.size(theme->defaultLegend().visual(TePOINTS).size());
+ theme->setGroupingVisual(g+1,visual,TePOINTS);
+ }
+ }
+ colorGrad.clear();
+
+ // acrescenta algumas informacoes relativas ao theme application
+ theme->countObj(false);
+ theme->mixColor(true);
+ theme->groupColorDir(TeColorAscSatEnd);
+ if (!theme->saveGrouping())
+ return false;
+
+ theme->visibleRep(theme->visibleRep() | 0x40000000);
+ updateThemeApplication(this->db_,theme);
+
+ if (this->rasterTheme_ != NULL)
+ theme->setAlias("0",tr("Kernel Values").latin1());
+ return true;
+}
+
diff --git a/src/terralib/application/qt/TeQtTerraStat.h b/src/terralib/application/qt/TeQtTerraStat.h
new file mode 100644
index 0000000..2e53273
--- /dev/null
+++ b/src/terralib/application/qt/TeQtTerraStat.h
@@ -0,0 +1,207 @@
+#ifndef __TERRALIB_INTERNAL_QTTERRASTAT_H
+#define __TERRALIB_INTERNAL_QTTERRASTAT_H
+/***
+ * Implementa suporte para as funcoes do TerraStat
+ * Objetivo -- soh nao manter a parte de geracao de eventos,
+ * etc no ui, que podera ser reaproveitado.
+ ****/
+
+#include "TeDatabase.h"
+#include "TeKernelParams.h"
+#include <qmessagebox.h>
+#include <terraViewBase.h>
+
+
+#define STAT_PRECISION 12
+/////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////
+
+class TeSTElementSet;
+class TeSTStatInstanceSet;
+
+/**
+ * Grava uma coluna na tabela de atributos associada a um STOSet.
+ * Nome da coluna eh o mesmo nome da propriedade
+ **/
+bool insertPropertyColumn(TeSTElementSet& stoSet,
+ const string& tableName,
+ const string& columnName);
+
+bool insertPropertyColumn(TeSTStatInstanceSet& stSet,
+ int idxDoubleProp,
+ TeTheme* theme,
+ const string& tableName,
+ const string& columnName);
+
+/***
+ * Cria um STOSet a partir de um tema e um conjunto de atributos,
+ * colocando todas as tabelas do TEMA
+ ***/
+bool createSTOSetFromTheme(TeTheme* theme,
+ vector<string>& attributes,
+ TeSTElementSet* rs);
+
+
+/***
+ * Cria um STOSet a partir de um tema e um conjunto de atributos,
+ * colocando todas as tabelas do TEMA
+ ***/
+bool createSTOStatSetFromTheme(TeTheme* theme,
+ vector<string>& attributes,
+ int additionalDouble,
+ TeSTStatInstanceSet* rs);
+
+
+enum TeKernelErrorType {Uerror, Error, Warning};
+
+
+///Retorna legenda do kernel
+bool getKernelLegend(TeKernelParams& par, vector<string>& legend);
+
+/** Classe para aplicar o metodo de Kernel **/
+class TeKernelMethod : public QWidget {
+
+ Q_OBJECT
+
+protected:
+ TeTheme* evTheme1_;
+ TeTheme* evTheme2_;
+ TeThemeApplication* regTheme_;
+ TeThemeApplication* rasterTheme_;
+
+
+ /**
+ * Pointers to containers -- void since different types may apply
+ * should dispose them
+ **/
+ void* evSet1_;
+ void* evSet2_;
+ void* regSet_;
+ int precision_;
+ TeLayer* gridLayer_;
+ bool justOnePolygon_;
+ TePolygon boundary_;
+
+ bool call();
+ bool generateEventSet(int which);
+ bool generateSupportSet();
+ void error(TeKernelErrorType type, string message,
+ QWidget* parent = 0);
+
+
+ //Calcula a precisao para um conjunto de valores
+ template<typename SetIt>
+ bool getPrecision(SetIt itBegin, SetIt itEnd) {
+
+
+ SetIt it = itBegin;
+
+ double max = -TeMAXFLOAT;
+ double min = TeMAXFLOAT;
+
+ double kValue;
+ while (it != itEnd) {
+
+ if ((*it).getDoubleProperty(0, kValue)) {
+ if (kValue > max)
+ max = kValue;
+ if ((kValue > 0) && (kValue < min))
+ min = kValue;
+ }
+ ++it;
+ }
+
+ if (min == TeMAXFLOAT)
+ return false;
+ if (max == -TeMAXFLOAT)
+ return false;
+
+ double diff = max - min;
+
+ double prec = log10(diff);
+ //Diferenca esta antes da virgula
+ if (prec > 0) {
+ precision_ = 2;
+ }
+ else {
+ precision_ = (int)(ceil(fabs(prec)) + 3);
+ }
+ return true;
+ }
+
+
+public:
+
+ TeKernelParams params_;
+
+ /** Geracao de conjuntos **/
+ bool isPoint1_;
+ bool isPoint2_;
+
+ bool isGridEv_;
+ bool isGridReg_;
+ int gridCols_;
+ TeDatabase* db_;
+ string resName_; //Nome do layer ou da coluna gerada
+
+ TeKernelMethod():
+ evTheme1_(0),
+ evTheme2_(0),
+ regTheme_(0),
+ rasterTheme_(0),
+ evSet1_(0),
+ evSet2_(0),
+ regSet_(0),
+ precision_(-1),
+ isPoint1_(true),
+ isPoint2_(true),
+ isGridEv_(false),
+ isGridReg_(false),
+ gridCols_(0),
+ db_(0)
+ {}
+
+ //Recupera tema e inicializa os parametros necessarios
+ bool setTheme(string name, int id, TeView* view);
+
+ //Define nome de layer para criacao de grid
+ bool setGridLayer(string name);
+
+ //Verifica se layer eh nova
+ bool isNewLayer() {
+ return gridLayer_ == NULL;
+ }
+
+ //Cria layer de grid para criar uma nova
+ bool createLayer(TeRaster* raster, TerraViewBase* mWindow);
+
+ bool createColumn(TeThemeApplication* currTheme, TeQtGrid* grid);
+
+ //Aplica o metodo de kernel
+ bool apply(void*& regSet, QWidget* parent);
+
+ //Recupera precisao dos dados
+ //Definida como prec(max - min) + 3
+ bool getPrecision(int& prec);
+
+ TeTheme* getTheme(int id) {
+ if (id == 0)
+ return (TeTheme *)regTheme_;
+ if (id == 1)
+ return evTheme1_;
+ if (id == 2)
+ return evTheme2_;
+ return NULL;
+ }
+
+ bool createKernelLegends(int nColors, bool color);
+
+ TeThemeApplication* regTheme()
+ { return regTheme_; }
+
+ TeThemeApplication* rasterTheme()
+ { return rasterTheme_; }
+
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtTextEdit.cpp b/src/terralib/application/qt/TeQtTextEdit.cpp
new file mode 100644
index 0000000..03f3a78
--- /dev/null
+++ b/src/terralib/application/qt/TeQtTextEdit.cpp
@@ -0,0 +1,862 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtTextEdit.h>
+#include <TeDefines.h>
+
+TeQtTextEdit::TeQtTextEdit()
+{
+ canvas_ = 0;
+ edit_ = false;
+ mode_ = 0;
+}
+
+TeQtTextEdit::TeQtTextEdit(TeText& tx, TeVisual v, TeQtBasicCanvas* canvas)
+{
+ edit_ = true;
+ mode_ = 0;
+ canvas_ = canvas;
+ text_ = tx;
+ visual_ = v;
+ change();
+}
+
+TeQtTextEdit::~TeQtTextEdit ()
+{
+}
+
+void
+TeQtTextEdit::change(QPoint p, bool apxAngle)
+{
+ double angle, dx, dy;
+
+ if(mode_ == 1) // change angle from left
+ {
+ dx = -(p.x() - pCenter_.x());
+ dy = p.y() - pCenter_.y();
+
+ if(apxAngle)
+ {
+ double fdx = fabs(dx);
+ double fdy = fabs(dy);
+ if(fdx < fdy)
+ {
+ if(4*fdx < fdy)
+ dx = 0.;
+ else
+ {
+ fdx = fdy;
+ if(dx >= 0)
+ dx = fdx;
+ else
+ dx = -fdx;
+ }
+ }
+ else
+ {
+ if(4*fdy < fdx)
+ dy = 0.;
+ else
+ {
+ fdy = fdx;
+ if(dy >= 0)
+ dy = fdy;
+ else
+ dy = -fdy;
+ }
+ }
+ }
+ if(dx == 0)
+ {
+ if(dy > 0)
+ angle = 90;
+ else
+ angle = 270;
+ }
+ else
+ {
+ if(dx > 0)
+ angle = atan(dy/dx) * 180. / TePI;
+ else
+ angle = atan(dy/dx) * 180. / TePI + 180;
+ }
+ text_.setAngle(angle);
+ }
+ else if(mode_ == 2) // change angle from right
+ {
+ dx = p.x() - pCenter_.x();
+ dy = -(p.y() - pCenter_.y());
+
+ if(apxAngle)
+ {
+ double fdx = fabs(dx);
+ double fdy = fabs(dy);
+ if(fdx < fdy)
+ {
+ if(4*fdx < fdy)
+ dx = 0.;
+ else
+ {
+ fdx = fdy;
+ if(dx >= 0)
+ dx = fdx;
+ else
+ dx = -fdx;
+ }
+ }
+ else
+ {
+ if(4*fdy < fdx)
+ dy = 0.;
+ else
+ {
+ fdy = fdx;
+ if(dy >= 0)
+ dy = fdy;
+ else
+ dy = -fdy;
+ }
+ }
+ }
+ if(dx == 0)
+ {
+ if(dy > 0)
+ angle = 90;
+ else
+ angle = 270;
+ }
+ else
+ {
+ if(dx > 0)
+ angle = atan(dy/dx) * 180. / TePI;
+ else
+ angle = atan(dy/dx) * 180. / TePI + 180;
+ }
+ text_.setAngle(angle);
+ }
+ else if(mode_ == 3 || mode_ == 4) // change size
+ {
+ if(visual_.fixedSize() == false)
+ {
+ double dx = fabs(double(pCenter_.x() - p.x()));
+ double dy = fabs(double(pCenter_.y() - p.y()));
+ int h = apx(sqrt(dx*dx + dy*dy));
+
+ double dh, hc, c = 1.;
+
+ hc = h * c;
+ dh = canvas_->mapVtoDW((int)hc);
+ text_.setHeight(dh);
+ QRect r = canvas_->textRect (text_, visual_);
+ while(r.height()/2 <= h-1)
+ {
+ c *= 1.01;
+ hc = h * c;
+ dh = canvas_->mapVtoDW((int)hc);
+ text_.setHeight(dh);
+ r = canvas_->textRect (text_, visual_);
+ }
+ }
+ }
+ else if(mode_ == 5) // change position
+ {
+ TeCoord2D pt = canvas_->mapVtoDW(p);
+ text_.add(pt);
+ }
+ change();
+}
+
+void
+TeQtTextEdit::init(TeText& tx, TeVisual v, TeQtBasicCanvas* canvas)
+{
+ edit_ = true;
+ mode_ = 0;
+ canvas_ = canvas;
+ text_ = tx;
+ visual_ = v;
+ change();
+}
+
+void
+TeQtTextEdit::change()
+{
+ QRect rect = canvas_->textRect(text_, visual_);
+
+ pCenter_ = rect.center();
+
+ pLeft_ = rect.center();
+ pLeft_.setX(rect.left()+3);
+
+ pRight_ = rect.center();
+ pRight_.setX(rect.right()-3);
+
+ pTop_ = rect.center();
+ pTop_.setY(rect.top()+3);
+
+ pBottom_ = rect.center();
+ pBottom_.setY(rect.bottom()-3);
+
+ double angle = text_.angle();
+ if(angle == 0)
+ {
+// canvas_->plotOnWindow();
+// canvas_->plotTextRects(text_, visual_);
+// canvas_->plotOnPixmap0();
+ return;
+ }
+
+ int nx, ny;
+ double d;
+
+ d = fabs(double(pRight_.x() - pCenter_.x()));
+ nx = pCenter_.x() + apx(cos(angle*TePI/180.) * d);
+ ny = pCenter_.y() - apx(sin(angle*TePI/180.) * d);
+ pRight_ = QPoint(nx, ny);
+
+ d = fabs(double(pLeft_.x() - pCenter_.x()));
+ nx = pCenter_.x() + apx(cos((180.+angle)*TePI/180.) * d);
+ ny = pCenter_.y() - apx(sin((180.+angle)*TePI/180.) * d);
+ pLeft_ = QPoint(nx, ny);
+
+ d = fabs(double(pTop_.y() - pCenter_.y()));
+ nx = pCenter_.x() + apx(cos((90.+angle)*TePI/180.) * d);
+ ny = pCenter_.y() - apx(sin((90.+angle)*TePI/180.) * d);
+ pTop_ = QPoint(nx, ny);
+
+ d = fabs(double(pBottom_.y() - pCenter_.y()));
+ nx = pCenter_.x() + apx(cos((270.+angle)*TePI/180.) * d);
+ ny = pCenter_.y() - apx(sin((270.+angle)*TePI/180.) * d);
+ pBottom_ = QPoint(nx, ny);
+
+// canvas_->plotTextRects(text_, visual_);
+}
+
+int
+TeQtTextEdit::apx(double d)
+{
+ if(d >= 0)
+ return (int)(d+.5);
+ else
+ return (int)(d-.5);
+}
+
+int
+TeQtTextEdit::located(QPoint& p)
+{
+ QRect rLeft(0, 0, 6, 6), rRight(0, 0, 6, 6), rTop(0, 0, 6, 6), rBottom(0, 0, 6, 6), rCenter(0, 0, 6, 6);
+ rLeft.moveCenter(pLeft_);
+ rRight.moveCenter(pRight_);
+ rTop.moveCenter(pTop_);
+ rBottom.moveCenter(pBottom_);
+ rCenter.moveCenter(pCenter_);
+
+ mode_ = 0;
+ double d, m = TeMAXFLOAT;
+
+ if(rLeft.contains(p))
+ {
+ QPoint a(rLeft.left() + rLeft.width()/2, rLeft.left() + rLeft.height()/2);
+ d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+ m = MIN(m, d);
+ if(m == d)
+ mode_ = 1;
+ }
+ if(rRight.contains(p))
+ {
+ QPoint a(rRight.left() + rRight.width()/2, rRight.left() + rRight.height()/2);
+ d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+ m = MIN(m, d);
+ if(m == d)
+ mode_ = 2;
+ }
+ if(rTop.contains(p))
+ {
+ QPoint a(rTop.left() + rTop.width()/2, rTop.left() + rTop.height()/2);
+ d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+ m = MIN(m, d);
+ if(m == d)
+ mode_ = 3;
+ }
+ if(rBottom.contains(p))
+ {
+ QPoint a(rBottom.left() + rBottom.width()/2, rBottom.left() + rBottom.height()/2);
+ d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+ m = MIN(m, d);
+ if(m == d)
+ mode_ = 4;
+ }
+ if(rCenter.contains(p))
+ {
+ QPoint a(rCenter.left() + rCenter.width()/2, rCenter.left() + rCenter.height()/2);
+ d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+ m = MIN(m, d);
+ mode_ = 5;
+ }
+
+ if(mode_ == 1)
+ pLeft_ = p;
+ else if(mode_ == 2)
+ pRight_ = p;
+ else if(mode_ == 3)
+ pTop_ = p;
+ else if(mode_ == 4)
+ pBottom_ = p;
+ else if(mode_ == 5)
+ pCenter_ = p;
+
+ return mode_;
+}
+
+bool
+TeQtTextEdit::isHotPoint(QPoint& p)
+{
+ QRect rLeft(0, 0, 6, 6), rRight(0, 0, 6, 6), rTop(0, 0, 6, 6), rBottom(0, 0, 6, 6), rCenter(0, 0, 6, 6);
+ rLeft.moveCenter(pLeft_);
+ rRight.moveCenter(pRight_);
+ rTop.moveCenter(pTop_);
+ rBottom.moveCenter(pBottom_);
+ rCenter.moveCenter(pCenter_);
+
+ mode_ = 0;
+ double d, m = TeMAXFLOAT;
+
+ if(rLeft.contains(p))
+ {
+ QPoint a(rLeft.left() + rLeft.width()/2, rLeft.left() + rLeft.height()/2);
+ d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+ m = MIN(m, d);
+ if(m == d)
+ mode_ = 1;
+ }
+ if(rRight.contains(p))
+ {
+ QPoint a(rRight.left() + rRight.width()/2, rRight.left() + rRight.height()/2);
+ d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+ m = MIN(m, d);
+ if(m == d)
+ mode_ = 2;
+ }
+ if(rTop.contains(p))
+ {
+ QPoint a(rTop.left() + rTop.width()/2, rTop.left() + rTop.height()/2);
+ d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+ m = MIN(m, d);
+ if(m == d)
+ mode_ = 3;
+ }
+ if(rBottom.contains(p))
+ {
+ QPoint a(rBottom.left() + rBottom.width()/2, rBottom.left() + rBottom.height()/2);
+ d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+ m = MIN(m, d);
+ if(m == d)
+ mode_ = 4;
+ }
+ if(rCenter.contains(p))
+ {
+ QPoint a(rCenter.left() + rCenter.width()/2, rCenter.left() + rCenter.height()/2);
+ d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+ m = MIN(m, d);
+ mode_ = 5;
+ }
+
+ if(mode_ > 0)
+ return true;
+ return false;
+}
+
+void
+TeQtTextEdit::endEdit()
+{
+ edit_ = false;
+ mode_ = 0;
+}
+
+int
+TeQtTextEdit::mode()
+{
+ return mode_;
+}
+
+void
+TeQtTextEdit::mode(int mode)
+{
+ mode_ = mode;
+}
+
+bool
+TeQtTextEdit::edit()
+{
+ return edit_;
+}
+
+TeText
+TeQtTextEdit::text()
+{
+ return text_;
+}
+
+void
+TeQtTextEdit::text(TeText t)
+{
+ text_ = t;
+}
+
+void
+TeQtTextEdit::height(double h)
+{
+ text_.setHeight(h);
+}
+
+void
+TeQtTextEdit::angle(double a)
+{
+ text_.setAngle(a);
+}
+
+void
+TeQtTextEdit::addPosition(TeCoord2D p)
+{
+ TeCoord2D tp = text_.location();
+ tp += p;
+ text_.add(tp);
+}
+
+TeQtBasicCanvas*
+TeQtTextEdit::canvas()
+{
+ return canvas_;
+}
+
+QRect
+TeQtTextEdit::getRect()
+{
+ QRect rect = canvas_->textRect(text_, visual_);
+ int x1 = rect.left();
+ int y1 = rect.top();
+ int x2 = rect.right();
+ int y2 = rect.bottom();
+
+ double angle = text_.angle() * -1;
+ if(!(angle == 0 || angle == 90 || angle == 180 || angle == 270))
+ {
+ double d, dx, dy, alfa, beta;
+ QPoint c = rect.center();
+ QPoint p, p1, p2, p3, p4;
+
+ p = QPoint(x1, y1);
+ dx = p.x() - c.x();
+ dy = p.y() - c.y();
+ alfa = atan(dy/dx) * 180. / TePI;
+ if(dx<0)
+ alfa = 180. + alfa;
+ else if(dx>=0 && dy<0)
+ alfa = 360. + alfa;
+ beta = alfa + angle;
+ d = sqrt(double((p.x()-c.x()) * (p.x()-c.x()) + (p.y()-c.y()) * (p.y()-c.y())));
+ p1.setX(c.x() + TeRound(cos(beta*TePI/180.) * d));
+ p1.setY(c.y() + TeRound(sin(beta*TePI/180.) * d));
+
+ p = QPoint(x1, y2);
+ dx = p.x() - c.x();
+ dy = p.y() - c.y();
+ alfa = atan(dy/dx) * 180. / TePI;
+ if(dx<0)
+ alfa = 180. + alfa;
+ else if(dx>=0 && dy<0)
+ alfa = 360. + alfa;
+ beta = alfa + angle;
+ d = sqrt(double((p.x()-c.x()) * (p.x()-c.x()) + (p.y()-c.y()) * (p.y()-c.y())));
+ p2.setX(c.x() + TeRound(cos(beta*TePI/180.) * d));
+ p2.setY(c.y() + TeRound(sin(beta*TePI/180.) * d));
+
+ p = QPoint(x2, y1);
+ dx = p.x() - c.x();
+ dy = p.y() - c.y();
+ alfa = atan(dy/dx) * 180. / TePI;
+ if(dx<0)
+ alfa = 180. + alfa;
+ else if(dx>=0 && dy<0)
+ alfa = 360. + alfa;
+ beta = alfa + angle;
+ d = sqrt(double((p.x()-c.x()) * (p.x()-c.x()) + (p.y()-c.y()) * (p.y()-c.y())));
+ p3.setX(c.x() + TeRound(cos(beta*TePI/180.) * d));
+ p3.setY(c.y() + TeRound(sin(beta*TePI/180.) * d));
+
+ p = QPoint(x2, y2);
+ dx = p.x() - c.x();
+ dy = p.y() - c.y();
+ alfa = atan(dy/dx) * 180. / TePI;
+ if(dx<0)
+ alfa = 180. + alfa;
+ else if(dx>=0 && dy<0)
+ alfa = 360. + alfa;
+ beta = alfa + angle;
+ d = sqrt(double((p.x()-c.x()) * (p.x()-c.x()) + (p.y()-c.y()) * (p.y()-c.y())));
+ p4.setX(c.x() + TeRound(cos(beta*TePI/180.) * d));
+ p4.setY(c.y() + TeRound(sin(beta*TePI/180.) * d));
+
+ x1 = MIN(p1.x(), p2.x());
+ x1 = MIN(x1, p3.x());
+ x1 = MIN(x1, p4.x());
+ y1 = MIN(p1.y(), p2.y());
+ y1 = MIN(y1, p3.y());
+ y1 = MIN(y1, p4.y());
+ x2 = MAX(p1.x(), p2.x());
+ x2 = MAX(x2, p3.x());
+ x2 = MAX(x2, p4.x());
+ y2 = MAX(p1.y(), p2.y());
+ y2 = MAX(y2, p3.y());
+ y2 = MAX(y2, p4.y());
+
+ rect.setLeft(x1);
+ rect.setTop(y1);
+ rect.setRight(x2);
+ rect.setBottom(y2);
+ }
+ return rect;
+// QRect rect;
+// int x1, y1, x2, y2;
+
+// x1 = pLeft_.x();
+// x1 = MIN(x1, pRight_.x());
+// x1 = MIN(x1, pTop_.x());
+// x1 = MIN(x1, pBottom_.x());
+
+// y1 = pLeft_.y();
+// y1 = MIN(y1, pRight_.y());
+// y1 = MIN(y1, pTop_.y());
+// y1 = MIN(y1, pBottom_.y());
+
+// x2 = pLeft_.x();
+// x2 = MAX(x2, pRight_.x());
+// x2 = MAX(x2, pTop_.x());
+// x2 = MAX(x2, pBottom_.x());
+
+// y2 = pLeft_.y();
+// y2 = MAX(y2, pRight_.y());
+// y2 = MAX(y2, pTop_.y());
+// y2 = MAX(y2, pBottom_.y());
+
+// if(text_.angle() == 0 || text_.angle() == 90 || text_.angle() == 180 || text_.angle() == 270)
+// rect = QRect(x1-3, y1-3, x2-x1+7, y2-y1+7);
+// else
+// {
+// int h = y2 - y1;
+// int w = x2 - x1;
+// int d = h;
+// if(w < h)
+// d = w;
+// x1 -= d;
+// y1 -= d;
+// x2 += d;
+// y2 += d;
+// rect = QRect(x1, y1, x2-x1, y2-y1);
+// }
+// return rect;
+}
+
+QRect
+TeQtTextEdit::getHRect()
+{
+ return canvas_->textRect(text_, visual_);
+}
+
+TeQtMultiTextEdit::TeQtMultiTextEdit()
+{
+ current_ = -1;
+ selMode_ = false;
+}
+
+TeQtMultiTextEdit::~TeQtMultiTextEdit()
+{
+}
+
+int
+TeQtMultiTextEdit::size()
+{
+ return textVec_.size();
+}
+
+void
+TeQtMultiTextEdit::push(TeQtTextEdit t)
+{
+ int geomId = t.text().geomId();
+ if(geomIdSet_.find(geomId) == geomIdSet_.end())
+ {
+ geomIdSet_.insert(geomId);
+ textVec_.push_back(t);
+ current_ = textVec_.size() - 1;
+ }
+}
+
+void
+TeQtMultiTextEdit::change()
+{
+ if(current_ == -1)
+ return;
+
+// canvas->plotOnWindow();
+ unsigned int i;
+ for(i=0; i<textVec_.size(); i++)
+ {
+ TeQtTextEdit& t = textVec_[i];
+ t.change();
+ }
+}
+
+void
+TeQtMultiTextEdit::change(QPoint p, bool apxAngle)
+{
+ if(current_ == -1)
+ return;
+
+ TeQtTextEdit& t = textVec_[current_];
+ TeCoord2D pa = t.text().location();
+ t.change(p, apxAngle);
+ TeCoord2D pb = t.text().location();
+ TeCoord2D poffset(pb.x()-pa.x(), pb.y()-pa.y());
+
+ if(t.mode()==1 || t.mode()==2)
+ angle(t.text().angle());
+ else if(t.mode()==3 || t.mode()==4)
+ height(t.text().height());
+ else if(t.mode() == 5)
+ addPosition(poffset);
+ change();
+}
+
+int
+TeQtMultiTextEdit::located(QPoint& p)
+{
+ unsigned int i;
+ int mode = 0;
+ for(i=0; i<textVec_.size(); i++)
+ {
+ TeQtTextEdit& t = textVec_[i];
+ mode = t.located(p);
+ if(mode)
+ {
+ current_ = i;
+ break;
+ }
+ }
+ return mode;
+}
+
+bool
+TeQtMultiTextEdit::isHotPoint(QPoint& p)
+{
+ if(textVec_.size() == 0)
+ return false;
+
+ unsigned int i;
+ for(i=0; i<textVec_.size(); i++)
+ {
+ TeQtTextEdit& t = textVec_[i];
+ if(t.isHotPoint(p))
+ {
+ current_ = i;
+ break;
+ }
+ }
+ if(i < textVec_.size())
+ return true;
+ return false;
+}
+
+void
+TeQtMultiTextEdit::endEdit()
+{
+ unsigned int i;
+ for(i=0; i<textVec_.size(); i++)
+ {
+ TeQtTextEdit& t = textVec_[i];
+ t.endEdit();
+ }
+ textVec_.clear();
+ geomIdSet_.clear();
+}
+
+int
+TeQtMultiTextEdit::mode()
+{
+ if(current_ >= 0)
+ return textVec_[current_].mode();
+ return 0;
+}
+
+void
+TeQtMultiTextEdit::mode(int m)
+{
+ if(current_ >= 0)
+ textVec_[current_].mode(m);
+}
+
+bool
+TeQtMultiTextEdit::selMode()
+{
+ return selMode_;
+}
+
+void
+TeQtMultiTextEdit::selMode(bool m)
+{
+ selMode_ = m;
+}
+
+bool
+TeQtMultiTextEdit::edit()
+{
+ if(current_ >= 0)
+ return textVec_[current_].edit();
+ return false;
+}
+
+TeText
+TeQtMultiTextEdit::text(int i)
+{
+ TeText t;
+ if(i<(int)textVec_.size())
+ return textVec_[i].text();
+ else
+ return t;
+}
+
+TeVisual
+TeQtMultiTextEdit::visual(int i)
+{
+ TeVisual v;
+ if(i<(int)textVec_.size())
+ return textVec_[i].visual();
+ else
+ return v;
+}
+
+void
+TeQtMultiTextEdit::height(double h)
+{
+ int i;
+ for(i=0; i<(int)textVec_.size(); i++)
+ {
+ if(i == current_)
+ continue;
+ TeQtTextEdit& t = textVec_[i];
+ t.height(h);
+ }
+}
+
+void
+TeQtMultiTextEdit::angle(double a)
+{
+ int i;
+ for(i=0; i<(int)textVec_.size(); i++)
+ {
+ if(i == current_)
+ continue;
+ TeQtTextEdit& t = textVec_[i];
+ t.angle(a);
+ }
+}
+
+void
+TeQtMultiTextEdit::addPosition(TeCoord2D p)
+{
+ int i;
+ for(i=0; i<(int)textVec_.size(); i++)
+ {
+ if(i == current_)
+ continue;
+ TeQtTextEdit& t = textVec_[i];
+ t.addPosition(p);
+ }
+}
+
+QRect
+TeQtMultiTextEdit::getRect()
+{
+ QRect rect;
+ int i;
+ for(i=0; i<(int)textVec_.size(); i++)
+ {
+ TeQtTextEdit& t = textVec_[i];
+ rect = rect | t.getRect();
+ }
+ return rect;
+}
+
+int
+TeQtMultiTextEdit::getTextIndex(QPoint p)
+{
+ int i;
+ for(i=0; i<(int)textVec_.size(); i++)
+ {
+ TeQtTextEdit& t = textVec_[i];
+ QRect rect = t.getHRect();
+ TeText tx = t.text();
+ double angle = tx.angle() * -1;
+
+ if(angle == 0)
+ {
+ if(rect.contains(p, true))
+ return i;
+ }
+ else
+ {
+ double d, dx, dy, alfa, beta;
+ QPoint c = rect.center();
+
+ dx = p.x() - c.x();
+ dy = p.y() - c.y();
+ alfa = atan(dy/dx) * 180. / TePI;
+ if(dx<0)
+ alfa = 180. + alfa;
+ else if(dx>=0 && dy<0)
+ alfa = 360. + alfa;
+ beta = alfa - angle;
+ d = sqrt(double((p.x()-c.x()) * (p.x()-c.x()) + (p.y()-c.y()) * (p.y()-c.y())));
+ int x = c.x() + TeRound(cos(beta*TePI/180.) * d);
+ int y = c.y() + TeRound(sin(beta*TePI/180.) * d);
+
+ QPoint pp(x, y);
+ if(rect.contains(pp))
+ return i;
+ }
+ }
+ return -1;
+}
+
+void
+TeQtMultiTextEdit::updateText(int index, string t)
+{
+ TeText tx = textVec_[index].text();
+ tx.setTextValue(t);
+ textVec_[index].text(tx);
+ textVec_[index].change();
+}
+
+void
+TeQtMultiTextEdit::visual(const TeVisual& visual)
+{
+ unsigned int i;
+ for(i=0; i<textVec_.size(); i++)
+ textVec_[i].visual(visual);
+}
diff --git a/src/terralib/application/qt/TeQtTextEdit.h b/src/terralib/application/qt/TeQtTextEdit.h
new file mode 100644
index 0000000..5404d3d
--- /dev/null
+++ b/src/terralib/application/qt/TeQtTextEdit.h
@@ -0,0 +1,150 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTTEXTEDIT_H
+#define __TERRALIB_INTERNAL_QTTEXTEDIT_H
+
+#include "TeCoord2D.h"
+#include "TeQtCanvas.h"
+#include "TeTheme.h"
+#include <qpoint.h>
+#include <set>
+
+class TeQtTextEdit
+{
+ QPoint pLeft_;
+ QPoint pRight_;
+ QPoint pTop_;
+ QPoint pBottom_;
+ QPoint pCenter_;
+ bool edit_;
+ int mode_;
+ TeQtBasicCanvas* canvas_;
+ TeTheme* theme_;
+ TeVisual visual_;
+ TeText text_;
+
+public:
+
+ TeQtTextEdit();
+ TeQtTextEdit(TeText& tx, TeVisual v, TeQtBasicCanvas* canvas);
+
+ ~TeQtTextEdit ();
+
+ void init(TeText& tx, TeVisual v, TeQtBasicCanvas* canvas);
+
+ void change();
+
+ void change(QPoint p, bool apxAngle=false);
+
+ int apx(double d);
+
+ int located(QPoint& p);
+
+ bool isHotPoint(QPoint& p);
+
+ void endEdit();
+
+ int mode();
+
+ void mode(int m);
+
+ bool edit();
+
+ TeText text();
+
+ void text(TeText t);
+
+ void height(double h);
+
+ void angle(double a);
+
+ void addPosition(TeCoord2D p);
+
+ TeQtBasicCanvas* canvas();
+
+ TeVisual visual() {return visual_;}
+
+ void visual(const TeVisual& visual) {visual_ = visual;}
+
+ QRect getRect();
+
+ QRect getHRect();
+};
+
+
+class TeQtMultiTextEdit
+{
+ vector<TeQtTextEdit> textVec_;
+ set<int> geomIdSet_;
+ int current_;
+ bool selMode_;
+
+public:
+
+ TeQtMultiTextEdit();
+ ~TeQtMultiTextEdit();
+
+ int size();
+
+ void push(TeQtTextEdit t);
+
+ void change();
+
+ void change(QPoint p, bool apxAngle=false);
+
+ int located(QPoint& p);
+
+ bool isHotPoint(QPoint& p);
+
+ void endEdit();
+
+ int mode();
+
+ void mode(int m);
+
+ bool selMode();
+
+ void selMode(bool m);
+
+ bool edit();
+
+ TeText text(int i);
+
+ TeVisual visual(int i);
+
+ void visual(const TeVisual&);
+
+ void height(double h);
+
+ void angle(double a);
+
+ void addPosition(TeCoord2D p);
+
+ void clear() {textVec_.clear(); geomIdSet_.clear();}
+
+ QRect getRect();
+
+ int getTextIndex(QPoint p);
+
+ void updateText(int index, string t);
+};
+#endif
diff --git a/src/terralib/application/qt/TeQtThemeItem.cpp b/src/terralib/application/qt/TeQtThemeItem.cpp
new file mode 100644
index 0000000..498ed2d
--- /dev/null
+++ b/src/terralib/application/qt/TeQtThemeItem.cpp
@@ -0,0 +1,187 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtThemeItem.h>
+#include <TeQtViewsListView.h>
+#include <TeQtLegendItem.h>
+#include <TeQtChartItem.h>
+#include <TeDatabase.h>
+#include <qpixmap.h>
+#include <images/theme.xpm>
+#include <qimage.h>
+
+//Database item constructor
+TeQtThemeItem::TeQtThemeItem(QListViewItem *parent,
+ QString text, TeTheme *theme)
+ : TeQtCheckListItem(parent,text,CheckBox), theme_(theme)
+{
+ type_ = THEME;
+ QPixmap p(theme_xpm);
+ setPixmap(0,p);
+ setRenameEnabled(0,true);
+ setSelected(false);
+ setEnabled(true);
+
+ order_ = theme->priority();
+}
+
+
+void TeQtThemeItem::stateChange(bool visible)
+{
+ TeQtViewsListView *lView = (TeQtViewsListView*)listView();
+ lView->checkItemStateChanged(this, visible);
+}
+
+
+void TeQtThemeItem::removeLegends()
+{
+ vector<QListViewItem*> legendVector = getChildren();
+ unsigned int i;
+ for (i = 0; i < legendVector.size(); ++i)
+ {
+ TeQtCheckListItem *checkItem = (TeQtCheckListItem*)legendVector[i];
+ if (checkItem->getType() == TeQtCheckListItem::LEGEND ||
+ checkItem->getType() == TeQtCheckListItem::LEGENDTITLE)
+ delete checkItem;
+ }
+}
+
+
+void TeQtThemeItem::removeCharts()
+{
+ vector<QListViewItem*> legendVector = getChildren();
+ unsigned int i;
+ for (i = 0; i < legendVector.size(); ++i)
+ {
+ TeQtCheckListItem *checkItem = (TeQtCheckListItem*)legendVector[i];
+ if (checkItem->getType() == TeQtCheckListItem::CHART ||
+ checkItem->getType() == TeQtCheckListItem::CHARTTITLE)
+ delete checkItem;
+ }
+}
+
+
+void TeQtThemeItem::getLegends(vector<const QPixmap*>& pixmapVector, vector<string>& labelVector, string& title)
+{
+ vector<QListViewItem*> legendVector = getChildren();
+ unsigned int i;
+ for (i = 0; i < legendVector.size(); ++i)
+ {
+ TeQtCheckListItem *checkItem = (TeQtCheckListItem*)legendVector[i];
+
+ if (checkItem->getType() == TeQtCheckListItem::LEGENDTITLE)
+ {
+ title = checkItem->text().latin1();
+ }
+ else if (checkItem->getType() == TeQtCheckListItem::LEGEND)
+ {
+ TeQtLegendItem *legendItem = (TeQtLegendItem*)checkItem;
+ pixmapVector.push_back(legendItem->pixmap(0));
+ labelVector.push_back(legendItem->text().latin1());
+ }
+ }
+}
+
+TeQtCheckListItem* TeQtThemeItem::getLegendItem(TeLegendEntry* leg)
+{
+ vector<QListViewItem*> legendVector = getChildren();
+ unsigned int i;
+ for (i = 0; i < legendVector.size(); ++i)
+ {
+ TeQtCheckListItem *checkItem = (TeQtCheckListItem*)legendVector[i];
+
+ if (checkItem->getType() == TeQtCheckListItem::LEGEND)
+ {
+ TeQtLegendItem *legendItem = (TeQtLegendItem*)checkItem;
+ if(legendItem->legendEntry()->id() == leg->id())
+ return legendItem;
+ }
+ }
+ return (TeQtCheckListItem*)0;
+}
+
+void TeQtThemeItem::updateAlias()
+{
+ TeDatabase* db = theme_->layer()->database();
+ map<int, map<string, string> >& mapThemeAlias = db->mapThemeAlias();
+ map<string, string>& mapAA = mapThemeAlias[theme_->id()];
+
+ vector<QListViewItem*> itemVec = getChildren();
+
+ unsigned int i;
+ for (i = 0; i < itemVec.size(); ++i)
+ {
+ TeQtCheckListItem *checkItem = (TeQtCheckListItem*)itemVec[i];
+
+ if (checkItem->getType() == TeQtCheckListItem::LEGENDTITLE)
+ {
+ string attr, nattr;
+ if(theme_->grouping())
+ {
+ attr = theme_->grouping()->groupAttribute_.name_;
+ nattr = theme_->grouping()->groupNormAttribute_;
+ }
+
+ if(nattr.empty() || nattr == "NONE")
+ {
+ map<string, string>::iterator it = mapAA.find(attr);
+ if(it != mapAA.end())
+ {
+ string alias = it->second;
+ if(alias.empty())
+ checkItem->setText(0, attr.c_str());
+ else
+ checkItem->setText(0, alias.c_str());
+ }
+ else
+ checkItem->setText(0, attr.c_str());
+ }
+ else
+ {
+ string alias = attr;
+ map<string, string>::iterator it = mapAA.find(attr);
+ if(it != mapAA.end())
+ alias = it->second;
+
+ it = mapAA.find(nattr);
+ if(it != mapAA.end())
+ alias += "/" + it->second;
+ else
+ alias += "/" + nattr;
+
+ checkItem->setText(0, alias.c_str());
+ }
+ }
+ else if (checkItem->getType() == TeQtCheckListItem::CHART)
+ {
+ string attr = ((TeQtChartItem*)checkItem)->name();
+ map<string, string>::iterator it = mapAA.find(attr);
+ if(it != mapAA.end())
+ {
+ string alias = it->second;
+ checkItem->setText(0, alias.c_str());
+ }
+ else
+ checkItem->setText(0, attr.c_str());
+ }
+ }
+}
+
diff --git a/src/terralib/application/qt/TeQtThemeItem.h b/src/terralib/application/qt/TeQtThemeItem.h
new file mode 100644
index 0000000..585137f
--- /dev/null
+++ b/src/terralib/application/qt/TeQtThemeItem.h
@@ -0,0 +1,57 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTTHEMEITEM_H
+#define __TERRALIB_INTERNAL_QTTHEMEITEM_H
+
+#include <TeQtCheckListItem.h>
+
+class TeTheme;
+class TeLegendEntry;
+
+
+class TeQtThemeItem : public TeQtCheckListItem
+{
+public:
+ TeQtThemeItem(QListViewItem *parent, QString text, TeTheme* theme);
+
+ ~TeQtThemeItem () {}
+
+ TeTheme* getTheme()
+ {return theme_;}
+
+ void removeLegends();
+
+ void removeCharts();
+
+ void getLegends(vector<const QPixmap*>& pixmapVector, vector<string>& labels, string& title);
+
+ TeQtCheckListItem* getLegendItem(TeLegendEntry* leg);
+
+ void updateAlias();
+
+protected:
+ TeTheme *theme_;
+
+ virtual void stateChange(bool);
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtViewItem.cpp b/src/terralib/application/qt/TeQtViewItem.cpp
new file mode 100644
index 0000000..5505a33
--- /dev/null
+++ b/src/terralib/application/qt/TeQtViewItem.cpp
@@ -0,0 +1,49 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtViewItem.h>
+#include <TeQtThemeItem.h>
+#include <qpixmap.h>
+#include <images/view.xpm>
+
+
+//Database item constructor
+TeQtViewItem::TeQtViewItem(QListView *parent,
+ QString text, TeView *view)
+ : TeQtCheckListItem(parent,text), view_(view)
+{
+ type_ = VIEW;
+// QPixmap p("images/view.bmp");
+ QPixmap p((const char**)view_xpm);
+ setPixmap(0,p);
+ setRenameEnabled(0,true);
+ setSelected(false);
+ setEnabled(true);
+ setDragEnabled(false);
+}
+
+void
+TeQtViewItem::resetAll()
+{
+ vector<QListViewItem*> childrenVector = this->getChildren();
+ for (int i = 0; i < (int)childrenVector.size(); ++i)
+ ((TeQtThemeItem*)childrenVector[i])->setOn(false);
+}
diff --git a/src/terralib/application/qt/TeQtViewItem.h b/src/terralib/application/qt/TeQtViewItem.h
new file mode 100644
index 0000000..560df84
--- /dev/null
+++ b/src/terralib/application/qt/TeQtViewItem.h
@@ -0,0 +1,54 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTVIEWITEM_H
+#define __TERRALIB_INTERNAL_QQTVIEWITEM_H
+
+#include <TeQtCheckListItem.h>
+
+class TeView;
+
+class TeQtViewItem : public TeQtCheckListItem
+{
+public:
+ TeQtViewItem(QListView *parent, QString text,
+ TeView *view);
+
+ ~TeQtViewItem () {}
+
+ int compare(QListViewItem * i, int col, bool ascending) const
+ { return QListViewItem::compare(i, col, ascending); }
+
+ QString key(int col, bool ascending) const
+ { return QListViewItem::key(col, ascending); }
+
+ TeView* getView() {return view_;}
+
+ void setView(TeView *view)
+ { view_ = view; }
+
+ void resetAll();
+
+protected:
+ TeView *view_;
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtViewsListView.cpp b/src/terralib/application/qt/TeQtViewsListView.cpp
new file mode 100644
index 0000000..1046300
--- /dev/null
+++ b/src/terralib/application/qt/TeQtViewsListView.cpp
@@ -0,0 +1,767 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtViewsListView.h>
+#include <TeQtCheckListItem.h>
+#include <TeQtViewItem.h>
+#include <TeQtThemeItem.h>
+#include <TeWaitCursor.h>
+#include <qapplication.h>
+#include <qpopupmenu.h>
+#include <qdragobject.h>
+
+TeQtViewsListView::TeQtViewsListView(QWidget *parent, const char *name)
+ : QListView(parent, name)
+{
+ pressedThemeItem_ = 0;
+ currentViewItem_ = 0;
+ currentThemeItem_ = 0;
+ rightMouseWasClicked_ = false;
+ checkItemStateChanged_ = false;
+ leftButtonPressed_ = false;
+ drag_ = false;
+
+ setSelectionMode(QListView::Multi);
+ setRootIsDecorated( TRUE );
+// setAcceptDrops(true);
+ viewport()->setAcceptDrops(true);
+
+ popupView_ = new QPopupMenu(this);
+ popupTheme_ = new QPopupMenu(this);
+ popupLegendTitle_ = new QPopupMenu(this);
+ popupLegend_ = new QPopupMenu(this);
+ popupChartTitle_ = new QPopupMenu(this);
+ popupChart_ = new QPopupMenu(this);
+ popupOutItem_ = new QPopupMenu(this);
+
+ //Mounting the brushStyleMap
+ brushStyleMap_[TePolyTypeTransparent] = Qt::NoBrush;
+ brushStyleMap_[TePolyTypeFill] = Qt::SolidPattern;
+ brushStyleMap_[TePolyTypeHorizontal] = Qt::HorPattern;
+ brushStyleMap_[TePolyTypeVertical] = Qt::VerPattern;
+ brushStyleMap_[TePolyTypeFDiagonal] = Qt::FDiagPattern;
+ brushStyleMap_[TePolyTypeBDiagonal] = Qt::BDiagPattern;
+ brushStyleMap_[TePolyTypeCross] = Qt::CrossPattern;
+ brushStyleMap_[TePolyTypeDiagonalCross] = Qt::DiagCrossPattern;
+
+ //Mounting the penStyleMap
+ penStyleMap_[TeLnTypeContinuous] = Qt::SolidLine;
+ penStyleMap_[TeLnTypeDashed] = Qt::DashLine;
+ penStyleMap_[TeLnTypeDotted] = Qt::DotLine;
+ penStyleMap_[TeLnTypeDashDot] = Qt::DashDotLine;
+ penStyleMap_[TeLnTypeDashDotDot] = Qt::DashDotDotLine;
+ penStyleMap_[TeLnTypeNone] = Qt::NoPen;
+
+ // rename action
+ setDefaultRenameAction(QListView::Accept);
+
+ connect(this,SIGNAL(clicked(QListViewItem*)),
+ this,SLOT(clicked(QListViewItem*)));
+ connect(this,SIGNAL(contextMenuRequested(QListViewItem*,const QPoint&, int)),
+ this,SLOT(contextMenuRequested(QListViewItem*,const QPoint&, int)));
+}
+
+
+TeQtViewsListView::~TeQtViewsListView()
+{
+ if (popupView_)
+ delete popupView_;
+ if (popupTheme_)
+ delete popupTheme_;
+ if (popupLegendTitle_)
+ delete popupLegendTitle_;
+ if (popupLegend_)
+ delete popupLegend_;
+ if (popupChartTitle_)
+ delete popupChartTitle_;
+ if (popupChart_)
+ delete popupChart_;
+ if (popupOutItem_)
+ delete popupOutItem_;
+}
+
+
+void TeQtViewsListView::selectItem(QListViewItem *item)
+{
+ checkItemStateChanged_ = false;
+ clicked(item);
+}
+
+
+void TeQtViewsListView::selectViewItem(TeView *view)
+{
+ if (view == 0)
+ return;
+
+ QListViewItem *child = firstChild();
+ while (child)
+ {
+ TeQtViewItem *viewItem = (TeQtViewItem*)child;
+ if (viewItem->getView() == view)
+ {
+ if (viewItem == currentViewItem_)
+ break;
+ else
+ {
+ unselectAllItems();
+ child->setSelected(true);
+ child->repaint();
+ currentViewItem_ = viewItem;
+ currentThemeItem_ = 0;
+ emit itemChanged(child);
+ return;
+ }
+ }
+ child = child->nextSibling();
+ }
+}
+
+
+TeQtViewItem* TeQtViewsListView::getViewItem(TeView *view)
+{
+ if (view == 0)
+ return 0;
+
+ QListViewItem *child = firstChild();
+ while (child)
+ {
+ TeQtViewItem *viewItem = (TeQtViewItem*)child;
+ if (viewItem->getView() == view)
+ return viewItem;
+ else
+ child = child->nextSibling();
+ }
+ return 0;
+}
+
+
+TeQtThemeItem* TeQtViewsListView::getThemeItem(TeTheme *theme)
+{
+ if (theme == 0)
+ return 0;
+
+ QListViewItem *item;
+ QListViewItemIterator it(this);
+ item = it.current();
+ while(item)
+ {
+ TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+ if (checkListItem->getType() == TeQtCheckListItem::THEME)
+ {
+ TeQtThemeItem* themeItem = (TeQtThemeItem*)item;
+ if (themeItem->getTheme() == theme)
+ return themeItem;
+ }
+ it++;
+ item = it.current();
+ }
+ return 0;
+}
+
+
+void TeQtViewsListView::removeViewItem(TeView *view)
+{
+ QListViewItem *item;
+
+ QListViewItemIterator it(this);
+ item = it.current();
+ while(item)
+ {
+ TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+ if (checkListItem->getType() == TeQtCheckListItem::VIEW)
+ {
+ TeQtViewItem* viewItem = (TeQtViewItem*)item;
+ if (viewItem->getView() == view)
+ {
+ if (viewItem == currentViewItem_)
+ currentViewItem_ = 0;
+ removeItem(item);
+ break;
+ }
+ }
+ it++;
+ item = it.current();
+ }
+}
+
+
+void TeQtViewsListView::removeThemeItem(TeTheme *theme)
+{
+ QListViewItem *item;
+
+ QListViewItemIterator it(this);
+ item = it.current();
+ while(item)
+ {
+ TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+ if (checkListItem->getType() == TeQtCheckListItem::THEME)
+ {
+ TeQtThemeItem* themeItem = (TeQtThemeItem*)item;
+ if (themeItem->getTheme() == theme)
+ {
+ if (themeItem == currentThemeItem_)
+ currentThemeItem_ = 0;
+ removeItem(item);
+ break;
+ }
+ }
+ it++;
+ item = it.current();
+ }
+}
+
+
+void TeQtViewsListView::removeItem(QListViewItem *item)
+{
+ TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+
+ if(checkListItem->getType() == TeQtCheckListItem::VIEW)
+ {
+ TeQtViewItem* viewItem = (TeQtViewItem*)item;
+
+ vector<QListViewItem*> childrenVector;
+ childrenVector = viewItem->getChildren();
+
+ int i;
+ TeQtThemeItem *themeItem;
+ for (i = 0; i < (int)childrenVector.size(); ++i)
+ {
+ themeItem = (TeQtThemeItem*)childrenVector[i];
+ delete themeItem;
+ }
+
+ if (currentViewItem_ == viewItem)
+ {
+ currentViewItem_ = 0;
+ currentThemeItem_ = 0;
+ }
+ delete viewItem;
+ }
+ else if (checkListItem->getType() == TeQtCheckListItem::THEME)
+ {
+ TeQtThemeItem* themeItem = (TeQtThemeItem*)item;
+ if (currentThemeItem_ == themeItem)
+ currentThemeItem_ = 0;
+ delete themeItem;
+ }
+ else
+ delete item;
+}
+
+
+void TeQtViewsListView::checkItemStateChanged(QCheckListItem *checkListItem, bool visible)
+{
+ checkItemStateChanged_ = true;
+ emit checkListItemVisChanged(checkListItem, visible);
+}
+
+
+void TeQtViewsListView::openViewItems()
+{
+ QListViewItem *child = firstChild();
+ while (child)
+ {
+ setOpen(child, true);
+ child = child->nextSibling();
+ }
+}
+
+
+void TeQtViewsListView::reset()
+{
+ unselectAllItems();
+ currentViewItem_ = 0;
+ currentThemeItem_ = 0;
+}
+
+
+void TeQtViewsListView::setOn(QCheckListItem *item, bool visible)
+{
+ TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+ if (checkListItem->getType() == TeQtCheckListItem::THEME)
+ {
+ TeQtThemeItem *themeItem = (TeQtThemeItem*)item;
+ themeItem->setOn(visible);
+ checkItemStateChanged_ = false;
+ }
+}
+
+void TeQtViewsListView::clicked(QListViewItem *item)
+{
+ if(item == 0)
+ return;
+ if(drag_ && pressedThemeItem_)
+ return;
+
+ unselectAllItems();
+
+ TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+
+ if( checkItemStateChanged_ && (checkListItem->getType() == TeQtCheckListItem::THEME))
+ {
+ checkItemStateChanged_ = false;
+ if(currentThemeItem_)
+ {
+ currentThemeItem_->parent()->setSelected(true);
+ currentThemeItem_->parent()->repaint();
+ currentThemeItem_->setSelected(true);
+ currentThemeItem_->repaint();
+ return;
+ }
+ }
+
+ if(checkListItem->getType() != TeQtCheckListItem::THEME)
+ {
+ if (rightMouseWasClicked_ == true || checkItemStateChanged_ == true ||
+ drag_ == true || checkListItem->getType() == TeQtCheckListItem::LEGEND ||
+ checkListItem->getType() == TeQtCheckListItem::CHART)
+ {
+ if (checkListItem->getType() == TeQtCheckListItem::LEGEND ||
+ checkListItem->getType() == TeQtCheckListItem::CHART)
+ {
+ checkListItem->setSelected(false);
+ checkListItem->repaint();
+ }
+
+ if (currentViewItem_ != 0)
+ {
+ currentViewItem_->setSelected(true);
+ currentViewItem_->repaint();
+ }
+
+ if (currentThemeItem_ != 0)
+ {
+ currentThemeItem_->setSelected(true);
+ currentThemeItem_->repaint();
+ }
+ rightMouseWasClicked_ = false;
+ checkItemStateChanged_ = false;
+ return;
+ }
+ }
+
+ if (checkListItem->getType() == TeQtCheckListItem::VIEW)
+ {
+ item->setSelected(true);
+ item->repaint();
+
+ TeQtViewItem *viewItem = (TeQtViewItem*)item;
+ if (viewItem != currentViewItem_)
+ {
+ currentViewItem_ = viewItem;
+ currentThemeItem_ = 0;
+ emit itemChanged(item);
+ }
+ else
+ {
+ if (currentThemeItem_ != 0)
+ {
+ currentThemeItem_->setSelected(true);
+ currentThemeItem_->repaint();
+ }
+ }
+ }
+ else if(checkListItem->getType() == TeQtCheckListItem::THEME)
+ {
+ item->parent()->setSelected(true);
+ item->parent()->repaint();
+ item->setSelected(true);
+ item->repaint();
+
+ TeQtViewItem *viewItem = (TeQtViewItem*)item->parent();
+ if (currentViewItem_ != viewItem && rightMouseWasClicked_ == false)
+ {
+ currentViewItem_ = viewItem;
+ emit itemChanged(item->parent());
+ }
+
+ TeQtThemeItem* themeItem = (TeQtThemeItem*)item;
+ if (themeItem != currentThemeItem_ && rightMouseWasClicked_ == false)
+ {
+ currentThemeItem_ = themeItem;
+ emit itemChanged(item);
+ }
+ }
+ rightMouseWasClicked_ = false;
+ checkItemStateChanged_ = false;
+}
+
+
+void TeQtViewsListView::contextMenuRequested(QListViewItem *item, const QPoint&, int)
+{
+ popupItem_ = (TeQtCheckListItem*)item;
+
+ unselectAllItems();
+ if (currentViewItem_)
+ {
+ currentViewItem_->setSelected(true);
+ currentViewItem_->repaint();
+ }
+
+ if (currentThemeItem_)
+ {
+ currentThemeItem_->setSelected(true);
+ currentThemeItem_->repaint();
+ }
+
+ emit popupSignal();
+}
+
+void TeQtViewsListView::contentsMousePressEvent(QMouseEvent *e)
+{
+ rightMouseWasClicked_ = false;;
+ if (e->button() == RightButton)
+ {
+ rightMouseWasClicked_ = true;
+ popupView_->move(e->globalPos().x(), e->globalPos().y());
+ popupTheme_->move(e->globalPos().x(), e->globalPos().y());
+ popupLegendTitle_->move(e->globalPos().x(), e->globalPos().y());
+ popupLegend_->move(e->globalPos().x(), e->globalPos().y());
+ popupChartTitle_->move(e->globalPos().x(), e->globalPos().y());
+ popupChart_->move(e->globalPos().x(), e->globalPos().y());
+ popupOutItem_->move(e->globalPos().x(), e->globalPos().y());
+ }
+ else if (e->button() == LeftButton)
+ {
+ QPoint p( contentsToViewport( e->pos() ) );
+ pressedPosition_ = p;
+ TeQtCheckListItem *item = (TeQtCheckListItem*)itemAt(p);
+ if (item != 0)
+ {
+ if(item->getType() == TeQtCheckListItem::THEME)
+ {
+ // don�t drag, if the user clicked into the root decoration of the item
+ if (p.x() > treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0)) + itemMargin())
+ {
+ pressedThemeItem_ = (TeQtThemeItem*)item;
+ themeOpen_ = isOpen(item);
+ }
+ }
+ else
+ {
+ item->setSelected(false);
+ item->repaint();
+ pressedThemeItem_ = 0;
+ }
+ leftButtonPressed_ = true;
+ }
+ }
+
+ QListView::contentsMousePressEvent(e);
+}
+
+
+void TeQtViewsListView::contentsMouseReleaseEvent(QMouseEvent *e)
+{
+ leftButtonPressed_ = false;
+ QListView::contentsMouseReleaseEvent(e);
+
+ if(currentThemeItem_)
+ {
+ unselectAllItems();
+ currentThemeItem_->parent()->setSelected(true);
+ currentThemeItem_->parent()->repaint();
+ currentThemeItem_->setSelected(true);
+ repaint();
+ }
+ drag_ = false;
+}
+
+
+void TeQtViewsListView::unselectAllItems()
+{
+ QListViewItem *item;
+
+ QListViewItemIterator it(this);
+ item = it.current();
+ while(item)
+ {
+ setSelected(item,false);
+ item->repaint();
+ it++;
+ item = it.current();
+ }
+}
+
+
+void TeQtViewsListView::contentsMouseMoveEvent(QMouseEvent* e)
+{
+ QPoint p( contentsToViewport( e->pos() ) );
+ if (leftButtonPressed_)
+ {
+ QPoint pdif = pressedPosition_ - p;
+ if(abs(pdif.x()) > 2 || abs(pdif.y()) > 2)
+ {
+ drag_ = true;
+ leftButtonPressed_ = false;
+ if(pressedThemeItem_)
+ {
+ TeQtCheckListItem *item = (TeQtCheckListItem*)itemAt(p);
+ if (item && item->getType() == TeQtCheckListItem::THEME)
+ {
+ // clicked(item);
+ QUriDrag* ud = new QUriDrag(viewport());
+ ud->drag();
+ }
+ }
+ }
+ }
+ if(drag_ && pressedThemeItem_)
+ pressedThemeItem_->setOpen(themeOpen_);
+}
+
+
+void TeQtViewsListView::contentsDragMoveEvent(QDragMoveEvent *e)
+{
+ if(pressedThemeItem_)
+ pressedThemeItem_->setOpen(themeOpen_);
+
+ if(e->source() != viewport())
+ {
+ e->ignore();
+ e->acceptAction(false);
+ return;
+ }
+
+ QPoint p = contentsToViewport(((QDragMoveEvent*)e)->pos());
+ TeQtCheckListItem *item = (TeQtCheckListItem*)itemAt(p);
+ if (item)
+ {
+ if (p.x() < treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0)) + itemMargin())
+ {
+ e->ignore();
+ e->acceptAction(false);
+ }
+ else
+ {
+ if(item->getType() == TeQtCheckListItem::THEME || item->getType() == TeQtCheckListItem::VIEW)
+ {
+ e->accept();
+ e->acceptAction();
+ }
+ else
+ {
+ e->ignore();
+ e->acceptAction(false);
+ if(currentThemeItem_)
+ {
+ unselectAllItems();
+ currentThemeItem_->parent()->setSelected(true);
+ currentThemeItem_->parent()->repaint();
+ currentThemeItem_->setSelected(true);
+ repaint();
+ }
+ }
+ }
+ }
+ else
+ {
+ e->ignore();
+ e->acceptAction(false);
+ }
+}
+
+
+void TeQtViewsListView::contentsDropEvent(QDropEvent *e)
+{
+ if(e->source() != viewport())
+ {
+ e->ignore();
+ e->acceptAction(false);
+ pressedThemeItem_ = 0;
+ if(currentThemeItem_)
+ {
+ unselectAllItems();
+ currentThemeItem_->parent()->setSelected(true);
+ currentThemeItem_->parent()->repaint();
+ currentThemeItem_->setSelected(true);
+ repaint();
+ }
+ return;
+ }
+
+ int itemPriority;
+ TeQtThemeItem *themeItem;
+ bool viewChanged = false;
+
+ QPoint p = contentsToViewport(((QDragMoveEvent*)e)->pos());
+ TeQtCheckListItem *dropItem = (TeQtCheckListItem*)itemAt(p);
+
+ if (dropItem == 0)
+ {
+ e->ignore();
+ e->acceptAction(false);
+ pressedThemeItem_ = 0;
+ if(currentThemeItem_)
+ {
+ unselectAllItems();
+ currentThemeItem_->parent()->setSelected(true);
+ currentThemeItem_->parent()->repaint();
+ currentThemeItem_->setSelected(true);
+ repaint();
+ }
+ return;
+ }
+
+ if (dropItem == pressedThemeItem_)
+ {
+ e->ignore();
+ e->acceptAction(false);
+ pressedThemeItem_ = 0;
+ if(currentThemeItem_)
+ {
+ unselectAllItems();
+ currentThemeItem_->parent()->setSelected(true);
+ currentThemeItem_->parent()->repaint();
+ currentThemeItem_->setSelected(true);
+ repaint();
+ }
+ return;
+ }
+
+ e->accept();
+ e->acceptAction();
+
+ //Set the view item of the pressed item and the drop item
+ TeQtViewItem *pressedViewItem = (TeQtViewItem*)pressedThemeItem_->parent();
+ TeQtViewItem *dropViewItem;
+ if(dropItem->getType() == TeQtCheckListItem::THEME)
+ dropViewItem = (TeQtViewItem*)dropItem->parent();
+ else
+ dropViewItem = (TeQtViewItem*)dropItem;
+
+ //set a flag to indicate whether there was a view change
+ if (pressedViewItem != dropViewItem)
+ viewChanged = true;
+
+ //update the priorities and move the items accordingly
+ if (viewChanged)
+ {
+ vector<QListViewItem*> themeItemVector = dropViewItem->getChildren();
+ for (unsigned int i = 0; i < themeItemVector.size(); ++i)
+ {
+ themeItem = (TeQtThemeItem*)themeItemVector[i];
+ if(pressedThemeItem_->text(0) == themeItem->text(0))
+ {
+ emit dragDropItems(0, 0, 0);
+ pressedThemeItem_ = 0;
+ return;
+ }
+ }
+
+ if (dropItem->getType() == TeQtCheckListItem::THEME)
+ {
+ TeQtThemeItem *dropThemeItem = (TeQtThemeItem*)dropItem;
+ itemPriority = dropThemeItem->order();
+ pressedThemeItem_->order(itemPriority);
+ themeItem = dropThemeItem;
+ }
+ else
+ {
+ itemPriority = 0;
+ pressedThemeItem_->order(itemPriority);
+ themeItem = (TeQtThemeItem*)dropViewItem->firstChild();
+ }
+
+ while (themeItem)
+ {
+ themeItem->order(++itemPriority);
+ themeItem = (TeQtThemeItem*)themeItem->nextSibling();
+ }
+ pressedViewItem->takeItem(pressedThemeItem_);
+ dropViewItem->insertItem(pressedThemeItem_);
+ }
+ else
+ {
+ if (dropItem->getType() == TeQtCheckListItem::THEME)
+ {
+ TeQtThemeItem *dropThemeItem = (TeQtThemeItem*)dropItem;
+ int pressedItemPriority = pressedThemeItem_->order();
+ int droppedItemPriority = dropThemeItem->order();
+ if (pressedItemPriority < droppedItemPriority)
+ {
+ itemPriority = pressedItemPriority;
+ pressedThemeItem_->order(droppedItemPriority);
+ themeItem = (TeQtThemeItem*)pressedThemeItem_->nextSibling();
+ while (themeItem != dropThemeItem)
+ {
+ themeItem->order(itemPriority++);
+ themeItem = (TeQtThemeItem*)themeItem->nextSibling();
+ }
+ dropThemeItem->order(itemPriority);
+ }
+ else
+ {
+ itemPriority = droppedItemPriority;
+ pressedThemeItem_->order(itemPriority);
+ themeItem = (TeQtThemeItem*)dropThemeItem;
+
+ while (themeItem != pressedThemeItem_)
+ {
+ themeItem->order(++itemPriority);
+ themeItem = (TeQtThemeItem*)themeItem->nextSibling();
+ }
+ }
+ pressedThemeItem_->moveItem(dropThemeItem);
+ }
+ else
+ {
+ itemPriority = 0;
+ pressedThemeItem_->order(itemPriority);
+ themeItem = (TeQtThemeItem*)dropItem->firstChild();
+ while (themeItem != pressedThemeItem_)
+ {
+ themeItem->order(++itemPriority);
+ themeItem = (TeQtThemeItem*)themeItem->nextSibling();
+ }
+ pressedViewItem->takeItem(pressedThemeItem_);
+ pressedViewItem->insertItem(pressedThemeItem_);
+ dropViewItem->setOpen(true);
+ }
+ }
+
+ if (pressedViewItem != dropViewItem)
+ {
+ // the drag and drop theme items belong to different views
+ if (pressedThemeItem_ == currentThemeItem_)
+ {
+ currentViewItem_ = dropViewItem;
+ clicked(pressedThemeItem_);
+ }
+ }
+
+// emit dragDropItems(pressedViewItem, dropViewItem);
+ emit dragDropItems(pressedThemeItem_, pressedViewItem, dropViewItem);
+ pressedThemeItem_->setOpen(themeOpen_);
+
+ pressedThemeItem_ = 0;
+
+ if(currentThemeItem_)
+ {
+ unselectAllItems();
+ currentThemeItem_->parent()->setSelected(true);
+ currentThemeItem_->parent()->repaint();
+ currentThemeItem_->setSelected(true);
+ repaint();
+ }
+}
+
+
diff --git a/src/terralib/application/qt/TeQtViewsListView.h b/src/terralib/application/qt/TeQtViewsListView.h
new file mode 100644
index 0000000..820ef79
--- /dev/null
+++ b/src/terralib/application/qt/TeQtViewsListView.h
@@ -0,0 +1,146 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QTVIEWSLISTVIEW_H
+#define __TERRALIB_INTERNAL_QTVIEWSLISTVIEW_H
+
+#include <qlistview.h>
+#include <TeDataTypes.h>
+
+class QPopupMenu;
+class TeView;
+class TeQtThemeItem;
+class TeQtViewItem;
+class TeQtCheckListItem;
+class TeTheme;
+
+class TeQtViewsListView : public QListView
+{
+ Q_OBJECT
+
+public:
+
+ TeQtViewsListView(QWidget *parent = 0, const char *name = 0);
+
+ ~TeQtViewsListView();
+
+ TeQtViewItem* currentViewItem()
+ { return currentViewItem_; }
+
+ TeQtThemeItem* currentThemeItem()
+ { return currentThemeItem_; }
+
+ TeQtCheckListItem *popupItem()
+ { return popupItem_; }
+
+ QPopupMenu* popupView()
+ { return popupView_; }
+
+ QPopupMenu* popupTheme()
+ { return popupTheme_; }
+
+ QPopupMenu* popupLegendTitle()
+ { return popupLegendTitle_; }
+
+ QPopupMenu* popupLegend()
+ { return popupLegend_; }
+
+ QPopupMenu* popupChartTitle()
+ { return popupChartTitle_; }
+
+ QPopupMenu* popupChart()
+ { return popupChart_; }
+
+ QPopupMenu* popupOutItem()
+ { return popupOutItem_; }
+
+ void selectItem(QListViewItem *item);
+
+ void selectViewItem(TeView *view);
+
+ TeQtViewItem* getViewItem(TeView *view);
+
+ TeQtThemeItem* getThemeItem(TeTheme *theme);
+
+ void removeViewItem(TeView *view);
+
+ void removeThemeItem(TeTheme *theme);
+
+ void removeItem(QListViewItem *item);
+
+ void checkItemStateChanged(QCheckListItem*, bool);
+
+ void openViewItems();
+
+ void reset();
+
+ void setOn(QCheckListItem*, bool);
+
+ map<TePolyBasicType, Qt::BrushStyle>& getBrushStyleMap() {return brushStyleMap_;}
+
+ map<TeLnBasicType, Qt::PenStyle>& getPenStyleMap() {return penStyleMap_;}
+
+signals:
+ void itemChanged(QListViewItem*);
+ void popupSignal();
+ void checkListItemVisChanged(QCheckListItem*, bool);
+ void dragDropItems(TeQtThemeItem*, TeQtViewItem*, TeQtViewItem*);
+
+protected slots:
+ void clicked(QListViewItem *item);
+ void contextMenuRequested(QListViewItem*, const QPoint&, int);
+
+protected:
+ TeQtViewItem *currentViewItem_;
+ TeQtThemeItem *currentThemeItem_;
+ bool rightMouseWasClicked_;
+ bool checkItemStateChanged_;
+ bool drag_;
+ bool themeOpen_;
+ bool leftButtonPressed_;
+ QPoint pressedPosition_;
+ TeQtCheckListItem *popupItem_;
+ QPopupMenu *popupView_;
+ QPopupMenu *popupTheme_;
+ QPopupMenu *popupLegendTitle_;
+ QPopupMenu *popupLegend_;
+ QPopupMenu *popupChartTitle_;
+ QPopupMenu *popupChart_;
+ QPopupMenu *popupOutItem_;
+ map<TePolyBasicType, Qt::BrushStyle> brushStyleMap_;
+ map<TeLnBasicType, Qt::PenStyle> penStyleMap_;
+ TeQtThemeItem *pressedThemeItem_;
+
+ void contentsMousePressEvent(QMouseEvent *e);
+
+ void contentsMouseReleaseEvent(QMouseEvent *e);
+
+ void contentsMouseMoveEvent(QMouseEvent* e);
+
+ void contentsDragMoveEvent(QDragMoveEvent *e);
+
+ void contentsDropEvent(QDropEvent *e);
+
+ void unselectAllItems();
+};
+
+
+#endif
diff --git a/src/terralib/application/qt/TeWaitCursor.cpp b/src/terralib/application/qt/TeWaitCursor.cpp
new file mode 100644
index 0000000..3194a98
--- /dev/null
+++ b/src/terralib/application/qt/TeWaitCursor.cpp
@@ -0,0 +1,59 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include "TeWaitCursor.h"
+#include <qapplication.h>
+
+TeWaitCursor::TeWaitCursor ()
+{
+ if(QApplication::overrideCursor())
+ {
+ if(QApplication::overrideCursor()->shape() != Qt::WaitCursor)
+ QApplication::setOverrideCursor( Qt::WaitCursor );
+ }
+ else
+ QApplication::setOverrideCursor( Qt::WaitCursor );
+}
+
+TeWaitCursor::~TeWaitCursor ()
+{
+ if(QApplication::overrideCursor())
+ QApplication::restoreOverrideCursor();
+}
+
+
+void TeWaitCursor::setWaitCursor ()
+{
+ if(QApplication::overrideCursor())
+ {
+ if(QApplication::overrideCursor()->shape() != Qt::WaitCursor)
+ QApplication::setOverrideCursor( Qt::WaitCursor );
+ }
+ else
+ QApplication::setOverrideCursor( Qt::WaitCursor );
+}
+
+void TeWaitCursor::resetWaitCursor ()
+{
+ if(QApplication::overrideCursor())
+ QApplication::restoreOverrideCursor();
+}
+
diff --git a/src/terralib/application/qt/TeWaitCursor.h b/src/terralib/application/qt/TeWaitCursor.h
new file mode 100644
index 0000000..695cbc0
--- /dev/null
+++ b/src/terralib/application/qt/TeWaitCursor.h
@@ -0,0 +1,36 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_WAITCURSOR_H
+#define __TERRALIB_INTERNAL_WAITCURSOR_H
+
+#include <qcursor.h>
+
+
+class TeWaitCursor : public QCursor {
+public:
+ TeWaitCursor();
+ ~TeWaitCursor();
+ void setWaitCursor();
+ void resetWaitCursor();
+};
+
+#endif
diff --git a/src/terralib/application/qt/resultVisual.h b/src/terralib/application/qt/resultVisual.h
new file mode 100644
index 0000000..0ba8787
--- /dev/null
+++ b/src/terralib/application/qt/resultVisual.h
@@ -0,0 +1,37 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef RESULTVISUAL_H
+#define RESULTVISUAL_H
+
+
+#include <qwidget.h>
+
+class ResultVisual : public QWidget
+{
+public:
+ ResultVisual(QWidget *parent=0, const char *name=0)
+ :QWidget(parent,name) {}
+
+ ~ResultVisual() {}
+};
+
+#endif
diff --git a/src/terralib/drivers/MrSID/TeDecoderMrSID.cpp b/src/terralib/drivers/MrSID/TeDecoderMrSID.cpp
new file mode 100644
index 0000000..19977dc
--- /dev/null
+++ b/src/terralib/drivers/MrSID/TeDecoderMrSID.cpp
@@ -0,0 +1,387 @@
+#include "TeDecoderMrSID.h"
+#include "TeMrSID.h"
+#include "TeDecoderMemory.h"
+#include "TeVectorRemap.h"
+#include "TeAsciiFile.h"
+#include "TeGeometryAlgorithms.h"
+
+
+TeDecoderMrSID::TeDecoderMrSID(const TeRasterParams& par) :
+ mrsid_(0),
+ nSelectedBlocks_(0),
+ data_(0),
+ dX_(0),
+ dY_(0)
+{
+ params_ = par;
+ params_.decoderIdentifier_= "MrSID";
+ try
+ {
+ mrsid_ = new TeMrSIDReader(params_.fileName_.c_str());
+ }
+ catch(/*exception& e*/...)
+ {
+ return;
+ }
+ fillRasterParams();
+ originalLevel_ = currentLevel_;
+}
+
+TeDecoderMrSID::TeDecoderMrSID(const std::string& fname):
+ mrsid_(0),
+ nSelectedBlocks_(0),
+ data_(0),
+ dX_(0),
+ dY_(0)
+{
+ try
+ {
+ mrsid_ = new TeMrSIDReader(params_.fileName_.c_str());
+ }
+ catch(...)
+ {
+ return;
+ }
+ fillRasterParams();
+}
+
+TeProjection*
+TeDecoderMrSID::readProjection()
+{
+ TeProjection* proj = 0;
+ try
+ {
+ string projFile = TeGetName(params_.fileName_.c_str()) + ".prj";
+ TeAsciiFile pFile (projFile);
+ string name;
+ string pname, dname;
+ int zone;
+ TeProjectionParams projPar;
+ while (pFile.isNotAtEOF())
+ {
+ name = pFile.readString();
+ if (name == "Projection")
+ {
+ pname = pFile.readString();
+ }
+ else if (name == "Datum")
+ {
+ name = pFile.readString();
+ if (name == "SOUTH_AMERICAN_1969")
+ dname = "SAD69";
+ if (name == "WGS84")
+ dname = "WGS84";
+
+ }
+ else if (name == "Zone")
+ {
+ zone = pFile.readInt();
+ }
+ }
+ if (pname == "UTM" && (dname == "SAD69" || "WGS84"))
+ {
+ TeDatum d = TeDatumFactory::make(dname);
+ proj = new TeUtm(d,zone*TeCDR);
+ }
+ }
+ catch(...)
+ {
+ }
+ if (!proj)
+ proj = new TeNoProjection();
+ return proj;
+}
+
+void TeDecoderMrSID::fillRasterParams()
+{
+ params_.projection(readProjection());
+ params_.nBands(mrsid_->nBands());
+ params_.setDataType(TeUNSIGNEDCHAR);
+ if(mrsid_->getColorModel() == TeMrSIDReader::ColorModelRGB)
+ params_.setPhotometric(TeRASTERRGB);
+ else
+ params_.setPhotometric(TeRASTERMULTIBAND);
+
+ // retrieves the original resolution (level 0) of MrSID
+ double oResx_ = mrsid_->resX();
+ double oResy_ = -mrsid_->resY();
+
+ // calculates the proper MrSID level accordingly to the asked TerraLib resolution
+ // lowest level where resolution is equal or greater than the asked resolution
+ double dResx_ = oResx_* params_.resolution_;
+ double dResy_ = oResy_* params_.resolution_;
+ currentLevel_ = 0;
+
+ while (oResx_ < dResx_ && oResy_ < dResy_ && currentLevel_ < mrsid_->nlev())
+ {
+ currentLevel_++;
+ mrsid_->zoomTo(currentLevel_);
+ mrsid_->getCurrentLevelResolution(oResx_, oResy_);
+ }
+ zoomToLevel(currentLevel_);
+ if (params_.blockHeight_ == 0 || params_.blockWidth_ != params_.ncols_)
+ {
+ params_.blockWidth_ = params_.ncols_;
+ params_.blockHeight_ = nLinesInBlock();
+ }
+}
+
+
+void TeDecoderMrSID::init()
+{
+ params_.status_= TeNOTREADY;
+ if (params_.mode_ != 'r')
+ return;
+
+ if (mrsid_)
+ {
+ string curFile(mrsid_->fileName());
+ if (curFile.empty() || curFile != params_.fileName_)
+ {
+ delete mrsid_;
+ mrsid_ = 0;
+ }
+ }
+
+ if (!mrsid_)
+ {
+ try
+ {
+ mrsid_ = new TeMrSIDReader(params_.fileName_.c_str());
+ }
+ catch(...)
+ {
+ return;
+ }
+ }
+
+ if (data_)
+ {
+ delete data_;
+ data_ = 0;
+ }
+ fillRasterParams();
+ originalLevel_ = currentLevel_;
+ if (!allocateMemory())
+ return;
+ params_.status_= TeREADYTOREAD;
+ return;
+}
+
+bool
+TeDecoderMrSID::allocateMemory()
+{
+ curStrip_ = -1;
+ if (data_)
+ delete []data_;
+ data_ = 0;
+ data_ = new unsigned char[params_.blockWidth_ * params_.blockHeight_ * params_.nBands()];
+ return (data_ != 0);
+}
+
+bool
+TeDecoderMrSID::clear()
+{
+ if (mrsid_)
+ mrsid_->clear();
+ if (data_)
+ delete data_;
+ data_ = 0;
+ dX_ = dY_ = 0;
+ curStrip_ = -1;
+ nSelectedBlocks_ = 0;
+ params_.status_= TeNOTREADY;
+ return true;
+}
+
+bool
+TeDecoderMrSID::getElement(int col, int lin, double& val, int band)
+{
+ if ((unsigned int)(lin/params_.blockHeight_) != (unsigned int)(curStrip_/params_.blockHeight_))
+ {
+ curStrip_ = ((unsigned int)(lin/params_.blockHeight_))*params_.blockHeight_;
+ if (!loadStrip())
+ return false;
+ }
+ unsigned int position = params_.nBands()*(params_.ncols_*(lin-curStrip_)+col)+band;
+ val = (unsigned char) data_[position];
+ return true;
+}
+
+bool TeDecoderMrSID::loadLine(int row, unsigned char* buf, int nlines)
+{
+ try
+ {
+ if (!mrsid_->selectArea(dX_,row+dY_,params_.blockWidth_,nlines))
+ return false;
+ mrsid_->getSelectedArea(buf);
+ }
+ catch(...)
+ {
+ return false;
+ }
+ return true;
+}
+
+
+bool
+TeDecoderMrSID::zoomToLevel(int level)
+{
+ if (level < 0 || level >= mrsid_->nlev())
+ return false;
+
+ mrsid_->zoomTo(level);
+ int ncols, nlines;
+ mrsid_->getDimensionAtLevel(level, ncols, nlines);
+ double x0,y0,x1,y1;
+ mrsid_->getCurrentBoundingBox(x0,y0,x1,y1);
+ params_.boundingBoxLinesColumns(x0,y0,x1,y1,nlines,ncols);
+ params_.resolution_ = (int)(params_.resx_/mrsid_->resX());
+ return true;
+}
+
+int
+TeDecoderMrSID::bestResolution(TeBox& bb, int ncols, int nlines, TeProjection* proj)
+{
+ if (!mrsid_)
+ return -1;
+
+ TeBox box = bb;
+ if (proj && !(*proj==*params_.projection()))
+ box = TeRemapBox(bb, proj, params_.projection());
+
+ double resx = box.width()/ncols; // desired resolution
+ double resy = box.height()/nlines;
+ double res = MIN(resx,resy);
+
+ int prevLevel = mrsid_->getCurrentLevel(); // save current level
+
+ int nlev = mrsid_->nlev();
+ int sidscale_ = 0;
+ double mrsidresx, mrsidresy, mrsidres;
+ do
+ {
+ mrsid_->zoomTo(sidscale_);
+ mrsid_->getCurrentLevelResolution(mrsidresx, mrsidresy);
+ mrsidres = std::min(mrsidresx, mrsidresy);
+ sidscale_++;
+ }while (res >= mrsidres && sidscale_< nlev);
+
+ mrsid_->zoomTo(prevLevel);
+ return sidscale_-1;
+}
+
+bool TeDecoderMrSID::selectBlocks(TeBox& bbox, int resLevel, TeRasterParams& parBlock)
+{
+ if (!mrsid_)
+ return false;
+
+ // check if desired resolution level is between the range of available levels
+ if (resLevel < 0 || resLevel >= mrsid_->nlev())
+ return false;
+
+ nSelectedBlocks_ = 0;
+ int prevLevel = mrsid_->getCurrentLevel(); // save current level
+
+ // zoom to level and defines clipping area
+ zoomToLevel(resLevel);
+
+ // calculates width and height of the selected area
+ double bw = bbox.width();
+ double bh = bbox.height();
+ int w = TeRound(bbox.width()/params_.resx_);
+ int h = TeRound(bbox.height()/params_.resy_);
+
+ TeCoord2D ul = coord2Index(TeCoord2D(bbox.x1_,bbox.y2_));
+ int ulx = TeRoundRasterIndex(ul.x_);
+ int uly = TeRoundRasterIndex(ul.y_);
+
+ if (!mrsid_->selectArea(ulx,uly,w,h))
+ {
+ zoomToLevel(prevLevel);
+ return false;
+ }
+ params_.blockWidth_ = w;
+ params_.blockHeight_ = h;
+
+ // defines parameters of the selected block
+ nSelectedBlocks_ = 1; // always select only one block
+ parBlock = params_;
+ parBlock.boundingBoxResolution(bbox.x1_,bbox.y1_,bbox.x2_,bbox.y2_,parBlock.resx_,parBlock.resy_);
+ parBlock.interleaving_ = TePerPixel;
+ return true;
+}
+
+bool TeDecoderMrSID::getSelectedRasterBlock(TeDecoderMemory* memDec)
+{
+ if (!mrsid_ || nSelectedBlocks_ <= 0)
+ return false;
+ bool res = mrsid_->getSelectedArea((unsigned char*) memDec->data(0));
+ nSelectedBlocks_--;
+ return res;
+}
+
+void
+TeDecoderMrSID::clearBlockSelection()
+{
+ zoomToLevel(originalLevel_);
+ nSelectedBlocks_ = 0;
+}
+
+int
+TeDecoderMrSID::nLinesInBlock()
+{
+ int nlines = 1;
+ while (nlines*params_.ncols_*params_.nBands() < 200*1024*1024 && nlines < params_.nlines_)
+ nlines *= 2;
+ nlines /= 2;
+ return nlines;
+}
+
+void
+TeDecoderMrSID::setClippingArea(TeBox clipBox)
+{
+ zoomToLevel(originalLevel_);
+ TeBox clipBoxInter;
+ if (TeIntersection(params_.boundingBox(),clipBox,clipBoxInter)) //if there where a given box set in parameters
+ {
+ int nlines = params_.nlines_;
+ clipBox = params_.boundingBox();
+ params_.boundingBoxResolution(clipBoxInter.x1_,clipBoxInter.y1_,
+ clipBoxInter.x2_,clipBoxInter.y2_,
+ params_.resx_,params_.resy_);
+
+ dX_ = static_cast<int>((params_.boundingBox().x1_ - clipBox.x1_)/params_.resx_);
+ dY_ = nlines - static_cast<int>((params_.boundingBox().y1_ - clipBox.y1_)/params_.resy_)
+ - params_.nlines_;
+ }
+ params_.blockWidth_ = params_.ncols_;
+ params_.blockHeight_ = nLinesInBlock();
+ allocateMemory();
+}
+
+void
+TeDecoderMrSID::resetClippingArea()
+{
+ zoomToLevel(originalLevel_);
+ params_.blockWidth_ = params_.ncols_;
+ params_.blockHeight_ = nLinesInBlock();
+ allocateMemory();
+}
+
+bool
+TeDecoderMrSID::loadStrip()
+{
+ try
+ {
+ //(int leftColumn, int topRow, int width, int height)
+ if (!mrsid_->selectArea(dX_,curStrip_+dY_,params_.blockWidth_, params_.blockHeight_))
+ return false;
+ mrsid_->getSelectedArea(data_);
+ }
+ catch(...)
+ {
+ return false;
+ }
+ return true;
+}
diff --git a/src/terralib/drivers/MrSID/TeDecoderMrSID.h b/src/terralib/drivers/MrSID/TeDecoderMrSID.h
new file mode 100644
index 0000000..49ea060
--- /dev/null
+++ b/src/terralib/drivers/MrSID/TeDecoderMrSID.h
@@ -0,0 +1,163 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderMrSID.h
+ This file deals with decoding of raster images in MrSID Format
+*/
+#ifndef __TERRALIB_INTERNAL_DECODERMRSID_H
+#define __TERRALIB_INTERNAL_DECODERMRSID_H
+
+#include "TeDecoder.h"
+#include "TeMrSID.h"
+
+//! The TeMrSID driver provides access to decode MrSID Images
+class TeDecoderMrSID : public TeDecoder
+{
+public:
+
+ //! Constructor from parameters
+ TeDecoderMrSID(const TeRasterParams& par);
+
+ //! Constructor from file name
+ TeDecoderMrSID(const std::string& fname);
+
+ //! Destructor
+ ~TeDecoderMrSID()
+ {
+ if (mrsid_)
+ delete mrsid_;
+ if (data_)
+ delete data_;
+ }
+
+ //! Initalizes internal structures to make decode able to read MrSID images
+ void init();
+
+ //! Releases internal structures and invalidates MrSID decoder
+ bool clear();
+
+ //! Provided for compatibility reasons only, this decoder can not encode data
+ bool setElement(int col, int lin, double val, int band=0)
+ { return false; }
+
+ //! Gets the value of an specific element (col, lin, band) of a raster data
+ /*!
+ \param col pixel column identifier
+ \param lin pixel line identifier
+ \param val pixel value being retrieved
+ \param band pixel band identifier
+ */
+ bool getElement(int col, int lin, double& val, int band=0);
+
+ //! Returns the best resolution level in a MrSID image to cover a paricular area
+ /*
+ \param bb bounding box geographical coordinates of the area to be covered
+ \param ncols number of columns of the area
+ \param nlines number of lines of the area
+ \param proj projection of the geographical coordinates
+ \returns A resolution level available in the MrSID files
+ \note Resolution level in decoder MrSid is a level in a multi-resolution pyramid
+ stored in the format. Original resolution has value 0 and following higher
+ levels assume integer values (1,2,3,4...)
+ */
+ int bestResolution(TeBox& bb, int ncols, int nlines, TeProjection* proj);
+
+ //! Selects a portion of a MrSID image in a certain resolution level
+ /*
+ \param bb bounding box (in geographical coordinates) of that area to be selected
+ \param the resolution level desired
+ \param parBlock returns the parameters of the portion selected
+ \returns TRUE if could select the portion and FALSE otherwise
+ \note MrSID navigator will be bounded to the given resolution level
+ */
+ bool selectBlocks(TeBox& bbox, int resLevel, TeRasterParams& parBlock);
+
+ //! Returns the contents of a portion of image previously selected
+ /*
+ \param memDec a pointer to a decoder to a raster in memory. This decoder
+ should be previously initialialized
+ */
+ bool getSelectedRasterBlock(TeDecoderMemory* memDec);
+
+ //! Returns the number of blocks selected by the latest selection
+ int numberOfSelectedBlocks()
+ { return nSelectedBlocks_; }
+
+ //! Reset block selection. Returns navigator to the original resolution level
+ void clearBlockSelection();
+
+ //! Defines a decoding subarea
+ void setClippingArea(TeBox clipBox);
+
+ //! Resets decoding area
+ void resetClippingArea();
+
+ bool loadLine(int row, unsigned char* buf,int nlines);
+
+ void addDeltaY()
+ {
+ params_.boxLinesColumns(params_.box().x1_, params_.box().y1_+10000000,
+ params_.box().x2_, params_.box().y2_+10000000,
+ params_.nlines_, params_.ncols_);
+ }
+
+private:
+
+ TeDecoderMrSID();
+
+ bool allocateMemory();
+
+ TeMrSIDReader* mrsid_;
+
+ int nSelectedBlocks_;
+ int originalLevel_;
+ int currentLevel_;
+
+ unsigned int curStrip_;
+ unsigned char* data_;
+
+ void fillRasterParams();
+
+ bool zoomToLevel(int level);
+
+ bool loadStrip();
+
+ int nLinesInBlock();
+
+ TeProjection* readProjection();
+
+
+ int dX_, dY_;
+};
+
+//! Implements a factory to build TeQtDecoders
+class TeDecoderMrSIDFactory : public TeDecoderFactory
+{
+public:
+
+ TeDecoderMrSIDFactory(const string& name) : TeDecoderFactory(name) {}
+
+ virtual TeDecoder* build (const TeRasterParams& arg)
+ { return new TeDecoderMrSID(arg); }
+};
+
+#endif
diff --git a/src/terralib/drivers/MrSID/TeMrSID.cpp b/src/terralib/drivers/MrSID/TeMrSID.cpp
new file mode 100644
index 0000000..653b170
--- /dev/null
+++ b/src/terralib/drivers/MrSID/TeMrSID.cpp
@@ -0,0 +1,465 @@
+#include "TeMrSID.h"
+#include "MrSIDNavigator.h"
+#include "MrSIDImageFile.h"
+#include "lt_xTrans.h"
+#include "lt_exception.h"
+
+LT_USE_NAMESPACE(LizardTech)
+
+// MrSID not initialized yet
+bool TeMrSIDReader::mrsid_initialized = false;
+
+// Constructor
+TeMrSIDReader::TeMrSIDReader(const char* fname) :
+ sidNav_(0),
+ sidImageFile_(0),
+ imgBuffer_(0),
+ mrsidFileName_(fname)
+{
+ if(!mrsid_initialized)
+ {
+ setlocale(LC_ALL,"English");
+ XTrans::initialize();
+ mrsid_initialized = true;
+ }
+
+ FileSpecification filespec(fname);
+ try
+ {
+ sidImageFile_ = new MrSIDImageFile(filespec);
+ sidNav_ = new MrSIDNavigator(*sidImageFile_);
+ }
+ catch(...)
+ {
+ int j = 0;
+ }
+
+ return;
+};
+
+TeMrSIDReader::~TeMrSIDReader()
+{
+ if(sidNav_) delete sidNav_;
+ // if(sidImageFile_) delete sidImageFile_; // ????!!!
+ clear();
+}
+
+void TeMrSIDReader::clear()
+{
+ if(imgBuffer_ != NULL)
+ {
+ free(imgBuffer_);
+ imgBuffer_ = NULL;
+ }
+}
+
+int TeMrSIDReader::nBands() const
+{
+ return sidNav_->nband();
+}
+
+unsigned int TeMrSIDReader::bitsPerPixel() const
+{
+ return sidImageFile_->colorSpace().samplesPerPixel();
+}
+
+TeMrSIDReader::ColorModel TeMrSIDReader::getColorModel() const
+{
+ ColorSpace::Scheme scheme = sidImageFile_->colorSpace().scheme();
+ if (scheme == ColorSpace::RGB)
+ return ColorModelRGB;
+ else if (scheme == ColorSpace::GRAYSCALE)
+ return ColorModelGray;
+ else
+ return ColorModelUnknown;
+}
+
+unsigned int TeMrSIDReader::getWidth() const
+{
+ return sidNav_->imageWidth();
+}
+
+unsigned int TeMrSIDReader::getHeight() const
+{
+ return sidNav_->imageHeight();
+}
+
+bool TeMrSIDReader::hasWorldInfo()
+{
+ return sidNav_->hasWorldInfo();
+}
+
+double TeMrSIDReader::originX()
+{
+ double x;
+
+ if(!sidImageFile_->xu(x))
+ return 0;
+
+ x-= resX() * 0.5;
+
+ return x;
+}
+
+double TeMrSIDReader::originY()
+{
+ double y;
+
+ if(!sidImageFile_->yu(y))
+ return 0;
+
+ y-= resY() * 0.5;
+
+ return y;
+}
+
+double TeMrSIDReader::resX()
+{
+ double res;
+
+ MetadataReader myReader = sidImageFile_->metadata();
+ if (myReader.empty()) return 1;
+ if (myReader.keyExists("IMAGE::X_RESOLUTION"))
+ {
+ MetadataElement element = myReader.getValue("IMAGE::X_RESOLUTION");
+ if (!(element.type() == MetadataValue::DOUBLE)) return 1;
+ res = (double) element.getMetadataValue();
+ return res;
+ }
+ else return 1;
+}
+
+double TeMrSIDReader::resY()
+{
+ double res;
+
+ MetadataReader myReader = sidImageFile_->metadata();
+ if (myReader.empty()) return -1;
+ if (myReader.keyExists("IMAGE::Y_RESOLUTION"))
+ {
+ MetadataElement element = myReader.getValue("IMAGE::Y_RESOLUTION");
+ if (!(element.type() == MetadataValue::DOUBLE)) return -1;
+ res = (double) element.getMetadataValue();
+ return -res;
+ }
+ else return -1;
+}
+
+void TeMrSIDReader::getWorld(double& x0, double& y0, double& x1, double& y1)
+{
+ double sx, sy;
+ unsigned int w, h;
+
+ getOrigin(x0, y0);
+ getResolution(sx, sy);
+ getDimensions(w, h);
+
+ x1 = x0 + w * sx;
+ y1 = y0 + h * sy;
+}
+
+void TeMrSIDReader::getCurrentBoundingBox(double& xmin, double& ymin, double& xmax, double& ymax)
+{
+ double sx, sy;
+ unsigned int w, h;
+ double x0, y0, x1, y1;
+
+ sidNav_->xres(sx);
+ sidNav_->yres(sy);
+
+ sidNav_->panTo(0,0,IntRect::TOP_LEFT);
+ if(!sidNav_->xu(x0))
+ x0 = 0.0;
+ else
+ x0-= sx * 0.5;
+
+ if(!sidNav_->yu(y0))
+ y0 = 0.0;
+ else
+ y0-= sy * 0.5;
+
+ sy = -1*sy;
+ int l = sidNav_->level();
+
+ LizardTech::IntDimension dim = sidImageFile_->getDimensionsAtLevel(l);
+ w = dim.width;
+ h = dim.height;
+
+ x1 = x0 + w * sx;
+ y1 = y0 + h * sy;
+
+ if(x0 < x1)
+ {
+ xmin = x0;
+ xmax = x1;
+ }
+ else
+ {
+ xmin = x1;
+ xmax = x0;
+ }
+
+ if(y0 < y1)
+ {
+ ymin = y0;
+ ymax = y1;
+ }
+ else
+ {
+ ymin = y1;
+ ymax = y0;
+ }
+}
+
+void TeMrSIDReader::getBoundingBox(double& xmin, double& ymin, double& xmax, double& ymax)
+{
+ double sx, sy;
+ unsigned int w, h;
+ double x0, y0, x1, y1;
+
+ sx = resX();
+ sy = resY();
+
+ if(!sidImageFile_->xu(x0))
+ x0 = 0.0;
+ else
+ x0-= sx * 0.5;
+
+ if(!sidImageFile_->yu(y0))
+ y0 = 0.0;
+ else
+ y0-= sy * 0.5;
+
+ w = sidNav_->imageWidth();
+ h = sidNav_->imageHeight();
+
+ x1 = x0 + w * sx;
+ y1 = y0 + h * sy;
+
+ if(x0 < x1)
+ {
+ xmin = x0;
+ xmax = x1;
+ }
+ else
+ {
+ xmin = x1;
+ xmax = x0;
+ }
+
+ if(y0 < y1)
+ {
+ ymin = y0;
+ ymax = y1;
+ }
+ else
+ {
+ ymin = y1;
+ ymax = y0;
+ }
+}
+
+ImageBuffer* TeMrSIDReader::getImageBuffer(unsigned int size, unsigned int nbands,
+ const unsigned int* bands, void* data)
+{
+ unsigned int i;
+ ImageBufferInfo properties;
+ int* sample_map;
+
+ if(data == NULL)
+ throw OutOfMemoryException();
+
+ // compute each band offset
+ sample_map = (int*)calloc(nbands, sizeof(int));
+ if (sample_map == NULL)
+ throw OutOfMemoryException();
+
+ for(i = 0;i < nbands;i++)
+ sample_map[i] = bands[i] * size;
+
+ /*
+ Set image buffer properties
+ Attention! The order in which the ImageBufferInfo properties are set matters.
+ So, care must be taken during modification of code part.
+ */
+ if(nBands() == 1)
+ properties.setColorSpace(ColorSpace::GRAYSCALE);
+ else
+ properties.setColorSpace(ColorSpace::RGB);
+
+ properties.setSampleMap((const int*)sample_map);
+ properties.setBandDistribution(ImageBufferInfo::BSQ);
+ properties.setSampleType(ImageBufferInfo::UINT8);
+ properties.setAlignment(ImageBufferInfo::NO_ALIGN);
+ properties.setStride(1);
+ free(sample_map);
+ return new ImageBuffer(properties, data);
+}
+
+ImageBuffer* TeMrSIDReader::getImageBuffer2(unsigned int size, unsigned int nbands,
+ const unsigned int* bands, void* data[])
+{
+ unsigned int i;
+ ImageBufferInfo properties;
+ int* sample_map;
+
+ // allocate data for the image buffer
+ if(imgBuffer_ != NULL)
+ free(imgBuffer_);
+ imgBuffer_ = (unsigned char*)calloc(nbands, size);
+
+ if(imgBuffer_ == NULL)
+ throw OutOfMemoryException();
+
+ // compute each band offset
+ sample_map = (int*)calloc(nbands, sizeof(int));
+ if(sample_map == NULL)
+ throw OutOfMemoryException();
+
+ for(i = 0;i < nbands;i++)
+ {
+ sample_map[i] = bands[i] * size;
+ data[i] = imgBuffer_ + sample_map[i];
+ }
+
+ /*
+ Set image buffer properties
+ Attention! The order in which the ImageBufferInfo properties are set matters.
+ So, care must be taken during modification of code part.
+ */
+ if(nBands() == 1)
+ properties.setColorSpace(ColorSpace::GRAYSCALE);
+ else
+ properties.setColorSpace(ColorSpace::RGB);
+
+ properties.setSampleMap((const int*)sample_map);
+ properties.setBandDistribution(ImageBufferInfo::BSQ);
+ properties.setSampleType(ImageBufferInfo::UINT8);
+ properties.setAlignment(ImageBufferInfo::NO_ALIGN);
+ properties.setStride(1);
+
+ free(sample_map);
+
+ return new ImageBuffer(properties, imgBuffer_);
+}
+
+int TeMrSIDReader::getMaxZoomLevel()
+{
+ if (sidNav_)
+ return sidNav_->getMaxZoomLevel();
+ return -1;
+}
+
+int TeMrSIDReader::nlev()
+{
+ if (sidNav_)
+ return sidNav_->nlev();
+ return 0;
+}
+
+int TeMrSIDReader::getCurrentLevel()
+{
+ if (sidNav_)
+ return sidNav_->level();
+ return 0;
+}
+
+void TeMrSIDReader::zoomTo(int level)
+{
+ if (sidNav_)
+ sidNav_->zoomTo(level);
+}
+
+void TeMrSIDReader::getCurrentLevelResolution(double& resx, double& resy)
+{
+ if (!sidNav_)
+ return;
+ sidNav_->yres(resy);
+ sidNav_->xres(resx);
+}
+
+void TeMrSIDReader::getCurrentRectangleDimension(int& w, int& h)
+{
+ if (!sidNav_)
+ return;
+ w = sidNav_->width();
+ h = sidNav_->height();
+}
+
+void TeMrSIDReader::getDimensionAtLevel(int level, int& w, int& h)
+{
+ if (!sidImageFile_)
+ return;
+ LizardTech::IntDimension dim;
+ dim = sidImageFile_->getDimensionsAtLevel(level);
+ w = dim.width;
+ h = dim.height;
+}
+
+/* Pans the specified rectangle navigator to a new point and redefines it's dimension*/
+bool
+TeMrSIDReader::selectArea(int leftColumn, int topRow, int width, int height)
+{
+ if(!sidImageFile_)
+ return false;
+
+ if(!sidNav_)
+ return false;
+ try{
+ sidNav_->panTo(leftColumn, topRow, IntRect::TOP_LEFT);
+ sidNav_->resize(width, height, IntRect::TOP_LEFT);
+ }
+ catch(...)
+ {
+ return false;
+ }
+ return true;
+}
+
+/* Loads the image selected by the navigator rectangle into memory.
+ Expects that the pointer to unsiged char was already allocated */
+bool
+TeMrSIDReader::getSelectedArea(unsigned char* data)
+{
+ if(!sidImageFile_)
+ return false;
+
+ if(!sidNav_)
+ return false;
+
+ try{
+ ImageBuffer* sidBuffer = getImageBuffer(sidNav_->width() * sidNav_->height(),
+ nBands(), data);
+ sidNav_->loadImage(*sidBuffer);
+ delete sidBuffer;
+ }
+ catch(...)
+ {
+ return false;
+ }
+ return true;
+}
+
+
+/* Allocates an image buffer as expected from MrSID */
+ImageBuffer*
+TeMrSIDReader::getImageBuffer(unsigned int size, unsigned int nbands, void* data)
+{
+ ImageBufferInfo properties;
+ if (nbands == 1)
+ properties.setColorSpace(ColorSpace::GRAYSCALE);
+ else
+ properties.setColorSpace(ColorSpace::RGB);
+ properties.setBandDistribution(ImageBufferInfo::BIP);
+ properties.setSampleType(ImageBufferInfo::UINT8);
+ properties.setAlignment(ImageBufferInfo::NO_ALIGN);
+ if (nbands == 3)
+ {
+ properties.setStride(3);
+ int sampleMap[] = {0, 1, 2,};
+ properties.setSampleMap(sampleMap);
+ }
+ else
+ properties.setStride(1);
+ return new ImageBuffer(properties, data);
+}
diff --git a/src/terralib/drivers/MrSID/TeMrSID.h b/src/terralib/drivers/MrSID/TeMrSID.h
new file mode 100644
index 0000000..50510a1
--- /dev/null
+++ b/src/terralib/drivers/MrSID/TeMrSID.h
@@ -0,0 +1,223 @@
+#ifndef TEMRSID_H
+#define TEMRSID_H
+
+/*
+#ifdef TEMRSIDDLL_EXPORTS
+#define DLL_IMP __declspec(dllexport)
+#else
+#define DLL_IMP __declspec(dllimport)
+#endif
+*/
+
+namespace LizardTech
+{
+class MrSIDNavigator;
+class MrSIDImageFile;
+class ImageBuffer;
+}
+
+#pragma warning(disable: 4275)
+
+//class DLL_IMP TeMrSIDReader
+class TeMrSIDReader
+{
+ LizardTech::MrSIDNavigator* sidNav_;
+ LizardTech::MrSIDImageFile* sidImageFile_;
+
+ unsigned char* imgBuffer_; //!< image buffer
+
+ const char* mrsidFileName_;
+
+public:
+ //! Color Models
+ typedef enum {
+ ColorModelUnknown, //!< unknown color model
+ ColorModelGray, //!< gray scale, composed by one 8 bit channel
+ ColorModelMap, //!< indexed , composed by one 8 bit channel and a palette
+ ColorModelRGB, //!< composed by three 8 bit channels
+ ColorModelRGBA //!< composed by four 8 bit channels
+ } ColorModel;
+
+ static bool mrsid_initialized; //!< indicates if MrSID has already been initialized
+
+ //! Returns the color space
+ TeMrSIDReader::ColorModel getColorModel() const;
+
+ //! Constructor
+ TeMrSIDReader(const char* fname);
+
+ //! Destructor
+ ~TeMrSIDReader();
+
+ //! Releases internal buffer image
+ void clear();
+
+ //! Returns the name of the data file
+ const char* fileName()
+ { return mrsidFileName_; }
+
+ // { --- These methods are relative to the level 0 (or original) image
+ //@
+ int nBands() const;
+ unsigned int bitsPerPixel() const;
+ unsigned int getWidth() const;
+ unsigned int getHeight() const;
+ void getDimensions(unsigned int& width, unsigned int& height) const;
+
+ bool hasWorldInfo();
+
+ double originX();
+ double originY();
+ void getOrigin(double& x, double& y);
+
+ double resX();
+ double resY();
+ void getResolution(double& rx, double& ry);
+
+ void getWorld(double& x0, double& y0, double& x1, double& y1);
+ void getBoundingBox(double& xmin, double& ymin, double& xmax, double& ymax);
+ void world2Pixel(double wx, double wy, int& ix, int& iy);
+ void pixel2World(int ix, int iy, double& wx, double& wy);
+
+ // Returns the number of levels of resolution available on the image
+ int nlev();
+
+ // Returns the maxmum resolution level available on the image
+ int getMaxZoomLevel();
+
+ //@}
+ //------- }
+
+ // { --- Methods to get ImageBuffer's
+ //@{
+ /*! Returns an ImageBuffer for loading an image from MrSIDNavigator.
+ \param size(in) size of the image buffer
+ \param nbands(in) number of output bands
+ \param bands(in) output bands vector indicating the desired output bands and its order
+ \param data(out) image buffer
+ \note data must have been previously allocated and its content is band interleaved
+ */
+ LizardTech::ImageBuffer* getImageBuffer (unsigned int size,
+ unsigned int nbands,
+ const unsigned int* bands,
+ void* data);
+
+ /*! Returns an ImageBuffer for loading an image from MrSIDNavigator.
+ \param size(in) size of the image buffer
+ \param nbands(in) number of output bands
+ \param bands(in) output bands vector indicating the desired output bands and its order
+ \param data(out) bands image buffer vector
+ \note data will be internally allocated and its content is band interleaved
+ */
+ LizardTech::ImageBuffer* getImageBuffer2(unsigned int size,
+ unsigned int nbands,
+ const unsigned int* bands,
+ void* data[]);
+
+ /*! Returns an ImageBuffer for loading an image from MrSIDNavigator.
+ \param size(in) size of the image buffer
+ \param nbands(in) number of output bands
+ \param data(out) image buffer
+ \note
+ - data must have been previously allocated and its content is pixel interleaved
+ - band order is always set to 0, 1, 2
+ */
+ LizardTech::ImageBuffer* getImageBuffer(unsigned int size, unsigned int nbands, void* data);
+ //@}
+
+ //@{
+ void getData(unsigned int& w, unsigned int& h,
+ double& x0, double& y0,
+ double& x1, double& y1,
+ unsigned int nbands,
+ const unsigned int* bands,
+ void *data[]);
+ //@}
+
+ // { --- Methods that are relative to the SidNavigator rectangle
+
+ //! Changes resolution level of MrSIDNavigator to the indicated level
+ void zoomTo(int level);
+
+ //! Gets the current resolution level that navigator is bound
+ int getCurrentLevel();
+
+ //! Gets the number of lines and columns at the current level
+ void getDimensionAtLevel(int level, int& w, int& h);
+
+ //! Gets the dimension of the current Navigator rectangle
+ void getCurrentRectangleDimension(int& w, int& h);
+
+ void getCurrentBoundingBox(double& xmin, double& ymin, double& xmax, double& ymax);
+
+ //! Gets the pixel resolution at the current level
+ void getCurrentLevelResolution(double& resx, double& resy);
+
+ //! Move an redimension current rectangle navigator
+ /*!
+ \param leftColum X index of upper left corner of the rectangle
+ \param topRow Y index of the upper corner of the rectangle
+ \param width width of the rectangle
+ \param height height of the rectangle
+ \returns TRUE if the rectangle is valid and can be positioned and FALSE otherwise
+ */
+ bool selectArea(int leftColumn, int topRow, int width, int height);
+
+ //! Gets the image defines by the current rectangle navigator
+ /*!
+ \param pointer to a selected area of memory to hold the content of the
+ current rectangle navigator
+ */
+ bool getSelectedArea(unsigned char* data);
+ // --- }
+
+};
+
+/*
+** ---------------------------------------------------------------
+** Inline methods:
+*/
+
+inline void TeMrSIDReader::getDimensions(unsigned int& width, unsigned int& height) const
+{
+ width = getWidth();
+ height = getHeight();
+}
+
+inline void TeMrSIDReader::getResolution(double& rx, double& ry)
+{
+ rx = resX();
+ ry = resY();
+}
+
+inline void TeMrSIDReader::getOrigin(double& x, double& y)
+{
+ x = originX();
+ y = originY();
+}
+
+inline void TeMrSIDReader::world2Pixel(double wx, double wy, int& ix, int& iy)
+{
+ double off_x, off_y;
+ double sx, sy;
+
+ getOrigin(off_x, off_y);
+ getResolution(sx, sy);
+
+ ix = (int) ((wx - off_x)/sx + 0.5);
+ iy = (int) ((wy - off_y)/sy + 0.5);
+}
+
+inline void TeMrSIDReader::pixel2World(int ix, int iy, double& wx, double& wy)
+{
+ double off_x, off_y;
+ double sx, sy;
+
+ getOrigin(off_x, off_y);
+ getResolution(sx, sy);
+
+ wx = off_x + ix * sx;
+ wy = off_y + iy * sy;
+}
+
+#endif
diff --git a/src/terralib/drivers/MySQL/TeMySQL.cpp b/src/terralib/drivers/MySQL/TeMySQL.cpp
new file mode 100644
index 0000000..6b2bb42
--- /dev/null
+++ b/src/terralib/drivers/MySQL/TeMySQL.cpp
@@ -0,0 +1,1893 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeMySQL.h"
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+extern "C" {
+extern char *strxmov(char* dest, const char* src, ...);
+}
+
+#define MAX(a,b) a>b?a:b
+#define MIN(a,b) a<b?a:b
+
+
+double swappd(double din)
+{
+ char stri[8],stro[8];
+ double dout;
+
+ memcpy (stri,&din,8);
+ stro[0] = stri[7];
+ stro[1] = stri[6];
+ stro[2] = stri[5];
+ stro[3] = stri[4];
+ stro[4] = stri[3];
+ stro[5] = stri[2];
+ stro[6] = stri[1];
+ stro[7] = stri[0];
+ memcpy (&dout,stro,8);
+ return (dout);
+}
+
+
+TeMySQL::TeMySQL()
+{
+ isConnected_ = false;
+ dbmsName_ = "MySQL";
+ bufferBlob_ = 0;
+ bufferBlobSize_ = 0;
+ mysql_init (&mysql_);
+}
+
+
+TeMySQL::~TeMySQL()
+{
+ if (bufferBlob_)
+ delete bufferBlob_;
+ if (isConnected_)
+ close ();
+}
+
+void
+TeMySQL::close()
+{
+ clear();
+ if (bufferBlob_)
+ delete bufferBlob_;
+ bufferBlob_ = 0;
+ bufferBlobSize_ = 0;
+ mysql_close(&mysql_);
+}
+
+bool
+TeMySQL::newDatabase(const string& database, const string& user, const string& password, const string& host, const int & /* port */, bool terralibModel)
+{
+ if (mysql_real_connect(&mysql_,host.c_str(),user.c_str(),password.c_str(),"",0,NULL,0) == NULL)
+ {
+ isConnected_ = false;
+ return false;
+ }
+
+ string create = "CREATE DATABASE " + database;
+ if (mysql_query(&mysql_,create.c_str()) != 0)
+// if (mysql_create_db(&mysql_,database.c_str()) != 0)
+ {
+ isConnected_ = false;
+ return false;
+ }
+
+ if (mysql_select_db(&mysql_,database.c_str()) != 0)
+ {
+ isConnected_ = false;
+ return false;
+ }
+
+ if(terralibModel)
+ {
+ //create conceptual model
+ if(!this->createConceptualModel())
+ return false;
+ }
+ isConnected_ = true;
+ user_ = user;
+ host_ = host;
+ password_ = password;
+ database_ = database;
+ return true;
+}
+
+
+bool
+TeMySQL::connect (const string& host, const string& user, const string& password, const string& database, int port)
+{
+ if (mysql_real_connect(&mysql_,host.c_str(),user.c_str(),password.c_str(),database.c_str(),port,NULL,0) == NULL)
+ {
+ isConnected_ = false;
+ return false;
+ }
+
+ isConnected_ = true;
+ user_ = user;
+ host_ = host;
+ password_ = password;
+ database_ = database;
+ return true;
+}
+
+
+bool
+TeMySQL::showDatabases (const string& host, const string& user, const string& password, vector<string>& dbNames, int port)
+{
+ unsigned long i;
+ MYSQL_ROW row;
+
+ if (mysql_real_connect(&mysql_,host.c_str(),user.c_str(),password.c_str(),0,port,NULL,0) == NULL)
+ {
+ errorMessage_= string(mysql_error(&mysql_));
+ return false;
+ }
+
+ MYSQL_RES *result = mysql_list_dbs(&mysql_, "%");
+
+ unsigned int numRows = (unsigned int)mysql_num_rows(result);
+
+ for (i = 0; i < numRows; ++i)
+ {
+ row = mysql_fetch_row(result);
+ dbNames.push_back(row[0]);
+ }
+
+ close();
+
+ return true;
+}
+
+
+bool
+TeMySQL::execute (const string &q)
+{
+ if (mysql_real_query(&mysql_, q.c_str(), q.size()) != 0)
+ {
+ errorMessage_= string(mysql_error(&mysql_));
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeMySQL::tableExist(const string& table)
+{
+ string q ="DESC "+ table;
+
+ if (mysql_real_query(&mysql_, q.c_str(), q.size()) != 0)
+ {
+ errorMessage_ = string(mysql_error(&mysql_));
+ }
+
+ MYSQL_RES* res_ = mysql_use_result(&mysql_);
+
+ if (res_)
+ {
+ mysql_free_result(res_);
+ return true;
+ }
+ else
+ return false;
+}
+
+bool
+TeMySQL::columnExist(const string& table, const string& column ,TeAttribute& attr)
+{
+ string q = "SHOW COLUMNS FROM " + table + " LIKE \'" + column + "\'";
+ if (mysql_query(&mysql_, q.c_str()) != 0)
+ {
+ return false;
+ }
+ MYSQL_RES* fieldsres = mysql_use_result(&mysql_);
+ if (!fieldsres)
+ return false;
+ MYSQL_ROW row = mysql_fetch_row(fieldsres);
+ if (!row)
+ return false;
+ attr.rep_.name_ = column;
+
+ string ftype(row[1]);
+ string fpk(row[3]);
+ if (ftype.find("char") != string::npos)
+ attr.rep_.type_ = TeSTRING;
+ else if (ftype.find("int") != string::npos)
+ attr.rep_.type_ = TeINT;
+ else if (ftype.find("double") != string::npos)
+ attr.rep_.type_ = TeREAL;
+ else if (ftype.find("blob") != string::npos)
+ attr.rep_.type_ = TeBLOB;
+ else if ((ftype.find("date") != string::npos) || (ftype.find("time") != string::npos))
+ attr.rep_.type_ = TeDATETIME;
+
+ unsigned int p1 = ftype.find("(");
+ unsigned int p2 = ftype.find(")");
+ if (p1 != string::npos && p2 != string::npos)
+ attr.rep_.numChar_ = atoi(ftype.substr(p1+1,p2-1).c_str());
+
+ if (fpk.find("PRI") != string::npos)
+ attr.rep_.isPrimaryKey_ = true;
+
+ mysql_free_result(fieldsres);
+ return true;
+}
+
+bool TeMySQL::addColumn (const string& table, TeAttributeRep &rep)
+{
+ string q ="ALTER TABLE " + table +" ADD ";
+ string type;
+ char size[8];
+
+ string field = TeGetExtension(rep.name_.c_str());
+ if(field.empty())
+ field = rep.name_;
+
+ switch (rep.type_)
+ {
+ case TeSTRING:
+ type = " VARCHAR ";
+ sprintf (size,"(%d)",rep.numChar_);
+ type += string (size);
+ break;
+ case TeREAL:
+ type = " DOUBLE";
+ break;
+ case TeINT:
+ type = " INT";
+ break;
+ case TeCHARACTER:
+ type = " CHAR";
+ break;
+ case TeDATETIME:
+ type = " DATETIME";
+ break;
+ case TeBLOB:
+ type = " LONGBLOB";
+ break;
+ default:
+ type = " VARCHAR ";
+ sprintf (size,"(%d)",rep.numChar_);
+ type += string (size);
+ break;
+ }
+ q += field;
+ q += type;
+ return execute(q);
+}
+
+TeDatabasePortal*
+TeMySQL::getPortal ()
+{
+ TeMySQLPortal* portal = new TeMySQLPortal (this);
+ return portal;
+}
+
+bool
+TeMySQL::createRasterTable (const string& table)
+{
+ if (table.empty())
+ return false;
+
+ string create = "CREATE TABLE "+table+" (";
+ create += "block_id VARCHAR(50) not null, ";
+ create += "lower_x double(24,15) not null, ";
+ create += "lower_y double(24,15) not null, ";
+ create += "upper_x double(24,15) not null, ";
+ create += "upper_y double(24,15) not null, ";
+ create += "band_id int(10) unsigned not null, ";
+ create += "resolution_factor int(10) unsigned , ";
+ create += "subband int(10) unsigned,";
+ create += "spatial_data LONGBLOB not null NOT NULL, ";
+ create += "block_size int(10) unsigned not null, ";
+ create += "PRIMARY KEY (block_id),";
+ create += "INDEX (band_id),";
+ create += "INDEX (subband),";
+ create += "INDEX (resolution_factor),";
+ create += "INDEX (lower_x,lower_y,upper_x,upper_y))";
+ return execute (create);
+}
+
+
+bool
+TeMySQL::createPolygonGeometry (const string& table)
+{
+ if (table.empty())
+ return false;
+
+ string q ="CREATE TABLE " + table +"(";
+ q += "geom_id INT UNSIGNED not null AUTO_INCREMENT,";
+ q += "object_id VARCHAR(50) NOT NULL ,";
+ q += "num_coords INT UNSIGNED not null ,";
+ q += "num_holes INT UNSIGNED not null ,";
+ q += "parent_id INT UNSIGNED not null ,";
+ q += "lower_x double(24,15) not null ,";
+ q += "lower_y double(24,15) not null ,";
+ q += "upper_x double(24,15) not null ,";
+ q += "upper_y double(24,15) not null ,";
+ q += "ext_max double(24,15) not null ,";
+ q += "spatial_data LONGBLOB not null ,";
+ q += "PRIMARY KEY (geom_id),";
+ q += "INDEX (object_id),";
+ q += "INDEX (ext_max),";
+ q += "INDEX (lower_x,lower_y,upper_x,upper_y))";
+ bool status = execute(q);
+ return status;
+}
+
+
+bool
+TeMySQL::createLineGeometry (const string& table)
+{
+ if (table.empty())
+ return false;
+
+ string q ="CREATE TABLE " + table +"(";
+ q += "geom_id INT UNSIGNED not null AUTO_INCREMENT,";
+ q += "object_id VARCHAR(50) not null ,";
+ q += "num_coords INT UNSIGNED not null ,";
+ q += "lower_x double(24,15) not null ,";
+ q += "lower_y double(24,15) not null ,";
+ q += "upper_x double(24,15) not null ,";
+ q += "upper_y double(24,15) not null ,";
+ q += "ext_max double(24,15) not null ,";
+ q += "spatial_data LONGBLOB not null ,";
+ q += "PRIMARY KEY (geom_id),";
+ q += "INDEX (object_id),";
+ q += "INDEX (lower_x,lower_y,upper_x,upper_y))";
+ return execute(q);
+}
+
+
+bool
+TeMySQL::defineIntegrity(void)
+{
+ return true; // mysql doesn't have referencial integrity
+ // there is nothing to be done
+}
+
+
+TeMySQLPortal::TeMySQLPortal ( TeMySQL *m)
+{
+ mysql_ = m->getMySQL();
+ numRows_ = 0;
+ numFields_ = 0;
+ result_ = 0;
+ row_ = 0;
+ db_ = m;
+}
+
+
+TeMySQLPortal::TeMySQLPortal ( const TeMySQLPortal& p) : TeDatabasePortal()
+{
+ mysql_ = p.mysql_;
+ numRows_ = 0;
+ numFields_ = 0;
+ result_ = 0;
+ row_ = 0;
+}
+
+
+TeMySQLPortal::~TeMySQLPortal ()
+{
+ freeResult ();
+}
+
+
+string
+TeMySQL::escapeSequence(const string& from)
+{
+ string ret = "";
+ if (!from.empty())
+ {
+ char *to = new char[from.size()*2+1];
+ mysql_real_escape_string(&mysql_,to,from.c_str(),from.size());
+ ret = to;
+ delete to;
+ }
+
+ return ret;
+}
+
+bool TeMySQLPortal::query (const string &q, TeCursorLocation /* l */, TeCursorType /* t */, TeCursorEditType /* e */, TeCursorDataType /*dt*/)
+{
+ if (result_)
+ freeResult();
+ attList_.clear ();
+
+ if (mysql_real_query(mysql_, q.c_str(), q.size()) != 0)
+ {
+ string erro = string(mysql_error(mysql_));
+ return false;
+ }
+
+ result_ = mysql_store_result(mysql_);
+ numRows_ = (int)mysql_num_rows(result_);
+ if (result_) // there are rows
+ {
+ numFields_ = mysql_num_fields(result_);
+
+ MYSQL_FIELD *fields = mysql_fetch_fields(result_);
+
+ int i;
+ for(i = 0; i < numFields_; i++)
+ {
+ TeAttribute attribute;
+ switch (fields[i].type)
+ {
+ case FIELD_TYPE_DECIMAL:
+ case FIELD_TYPE_TINY:
+ case FIELD_TYPE_SHORT:
+ case FIELD_TYPE_LONG:
+ case FIELD_TYPE_INT24:
+ attribute.rep_.type_ = TeINT;
+ attribute.rep_.numChar_ = fields[i].length;
+ break;
+
+ case FIELD_TYPE_FLOAT:
+ case FIELD_TYPE_DOUBLE:
+ case FIELD_TYPE_LONGLONG:
+ attribute.rep_.type_ = TeREAL;
+ attribute.rep_.numChar_ = fields[i].length;
+ attribute.rep_.decimals_ = fields[i].decimals;
+ break;
+
+ case FIELD_TYPE_DATE:
+ case FIELD_TYPE_TIME:
+ case FIELD_TYPE_DATETIME:
+ case FIELD_TYPE_YEAR:
+ case FIELD_TYPE_NEWDATE:
+ attribute.rep_.type_ = TeDATETIME;
+ attribute.dateTimeFormat_ = "YYYYsMMsDDsHHsmmsSS24";
+ attribute.dateChronon_ = TeSECOND;
+ break;
+
+ case FIELD_TYPE_TINY_BLOB:
+ case FIELD_TYPE_MEDIUM_BLOB:
+ case FIELD_TYPE_LONG_BLOB:
+ case FIELD_TYPE_BLOB:
+ attribute.rep_.type_ = TeBLOB;
+ break;
+
+ case FIELD_TYPE_VAR_STRING:
+ case FIELD_TYPE_STRING:
+ attribute.rep_.type_ = TeSTRING;
+ attribute.rep_.numChar_ = fields[i].length;
+ break;
+
+ case FIELD_TYPE_ENUM:
+ case FIELD_TYPE_SET:
+ default :
+ attribute.rep_.type_ = TeUNKNOWN;
+ break;
+ }
+ if (fields[i].flags & PRI_KEY_FLAG)
+ attribute.rep_.isPrimaryKey_ = true;
+
+ if (fields[i].flags & AUTO_INCREMENT_FLAG)
+ attribute.rep_.isAutoNumber_ = true;
+
+ attribute.rep_.name_ = fields[i].name;
+ attList_.push_back ( attribute );
+ }
+ }
+ else // mysql_store_result() returned nothing; should it have?
+ {
+ if(mysql_field_count(mysql_) == 0)
+ {
+ // query does not return data
+ // (it was not a SELECT)
+ numFields_ = 0;
+ numRows_ = (int)mysql_affected_rows(mysql_);
+ }
+ else // mysql_store_result() should have returned data
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+
+bool
+TeMySQLPortal::fetchRow ()
+{
+ if ((row_ = mysql_fetch_row(result_)))
+ return true;
+ else
+ return false;
+}
+
+
+bool
+TeMySQLPortal::fetchRow (int i)
+{
+ if (i >= 0 && i < numRows_)
+ {
+ mysql_data_seek (result_, i);
+ return fetchRow ();
+ }
+ else
+ return false;
+}
+
+
+void TeMySQLPortal::freeResult ()
+{
+ if (result_)
+ {
+ mysql_free_result(result_);
+ result_ = 0;
+ }
+}
+
+
+int
+TeMySQLPortal::insertId ()
+{
+ return (int)mysql_insert_id(mysql_);
+}
+
+
+int
+TeMySQL::insertId ()
+{
+ return (int)mysql_insert_id(&mysql_);
+}
+
+
+
+bool
+TeMySQL::insertProjection (TeProjection *proj)
+{
+ char q[512];
+ sprintf (q,"INSERT INTO te_projection VALUES('','%s',%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,'%s',%.15f,%d,'%s',%.15f,%.15f,%.15f,%.15f,%.15f)",
+ proj->name().c_str(),
+ proj->params().lon0*TeCRD,
+ proj->params().lat0*TeCRD,
+ proj->params().offx,
+ proj->params().offy,
+ proj->params().stlat1*TeCRD,
+ proj->params().stlat2*TeCRD,
+ proj->params().units.c_str(),
+ proj->params().scale,
+ proj->params().hemisphere,
+ proj->datum().name().c_str(),
+ proj->datum().radius(),
+ proj->datum().flattening(),
+ proj->datum().xShift(),
+ proj->datum().yShift(),
+ proj->datum().zShift());
+
+ if (!execute(q))
+ return false;
+
+ proj->id(insertId());
+ return true;
+}
+
+
+bool
+TeMySQL::insertView (TeView *view)
+{
+ TeProjection* proj = view->projection();
+ // save it�s projection
+ if (!proj || !insertProjection(proj))
+ {
+ errorMessage_ = "N�o � poss�vel inserir vista sem proje��o";
+ return false;
+ }
+
+ char q[512];
+ sprintf (q,"INSERT INTO te_view VALUES('',%d,'%s','%s',%d)",
+ proj->id(),view->name().c_str(),view->user().c_str(),view->isVisible());
+
+ if (!execute(q))
+ return false;
+
+ view->id(insertId());
+
+ for (unsigned int th=0; th<view->size(); th++)
+ {
+ TeViewNode* node = view->get (th);
+ if (node->type() == TeTHEME)
+ {
+ TeTheme *theme = (TeTheme*) node;
+ insertTheme (theme);
+ }
+ else
+ {
+ TeViewTree* tree = (TeViewTree*)node;
+ insertViewTree (tree);
+ }
+ }
+
+ viewMap_[view->id()] = view;
+ return true;
+}
+
+
+bool
+TeMySQL::insertViewTree (TeViewTree *tree)
+{
+ string save;
+ save = "INSERT INTO te_theme (name, layer_id, node_type, view_id, priority) VALUES('','";
+ save += tree->name() + "," + Te2String(tree->parentId()) + "," + Te2String((int)tree->type());
+ save += "," + Te2String(tree->view()) + "," + Te2String(tree->priority()) + ")";
+ if (!execute(save))
+ return false;
+ tree->id(insertId());
+ return true;
+}
+
+
+bool
+TeMySQL::insertTheme (TeTheme *tem)
+{
+ string save;
+ save = "INSERT INTO te_theme ";
+ save += "(layer_id, view_id, name, parent_id, priority, node_type, min_scale, max_scale, ";
+ save += "generate_attribute_where, generate_spatial_where, generate_temporal_where, ";
+ save += "collection_table, visible_rep, enable_visibility) ";
+ save += " VALUES(";
+ save += Te2String(tem->layerId()) +", ";
+ save += Te2String(tem->view()) +", ";
+ save += "'" + tem->name() + "', ";
+ save += Te2String(tem->parentId()) +", ";
+ save += Te2String(tem->priority()) +", ";
+ save += Te2String(tem->type()) +", ";
+ save += Te2String(tem->minScale()) +", ";
+ save += Te2String(tem->maxScale()) +", ";
+ save += "'" + escapeSequence(tem->attributeRest()) + "', ";
+ save += "'" + escapeSequence(tem->spatialRest()) + "', ";
+ save += "'" + escapeSequence(tem->temporalRest()) + "', ";
+ save += "'" + escapeSequence(tem->collectionTable()) + "', ";
+ save += Te2String(tem->visibleRep()) +", ";
+ save += Te2String(tem->visibility()) +" ) ";
+
+ if (!this->execute(save))
+ return false;
+
+ tem->id(this->insertId());
+
+ if (tem->collectionTable().empty())
+ {
+ string colTab = "te_collection_" + Te2String(tem->id());
+ tem->collectionTable(colTab);
+ save = "UPDATE te_theme SET collection_table='" + colTab + "' WHERE theme_id=" ;
+ save += Te2String(tem->id());
+ this->execute(save);
+ }
+
+ bool status;
+
+ // insert grouping
+ int numSlices = 0;
+ if(tem->grouping())
+ {
+ if(!insertGrouping (tem->id(), tem->grouping()))
+ return false;
+ numSlices = tem->grouping()->groupNumSlices_;
+ }
+
+ tem->outOfCollectionLegend().group(-1);
+ tem->outOfCollectionLegend().theme(tem->id());
+ status = insertLegend (&(tem->outOfCollectionLegend()));
+ if (!status)
+ return status;
+
+ tem->withoutDataConnectionLegend().group(-2);
+ tem->withoutDataConnectionLegend().theme(tem->id());
+ status = insertLegend (&(tem->withoutDataConnectionLegend()));
+ if (!status)
+ return status;
+
+ tem->defaultLegend().group(-3);
+ tem->defaultLegend().theme(tem->id());
+ status = insertLegend (&(tem->defaultLegend()));
+ if (!status)
+ return status;
+
+ tem->pointingLegend().group(-4);
+ tem->pointingLegend().theme(tem->id());
+ status = insertLegend (&(tem->pointingLegend()));
+ if (!status)
+ return status;
+
+ tem->queryLegend().group(-5);
+ tem->queryLegend().theme(tem->id());
+ status = insertLegend (&(tem->queryLegend()));
+ if (!status)
+ return status;
+
+ tem->queryAndPointingLegend().group(-6);
+ tem->queryAndPointingLegend().theme(tem->id());
+ status = insertLegend (&(tem->queryAndPointingLegend()));
+ if (!status)
+ return status;
+
+ for (int i = 0; i < numSlices; i++)
+ {
+ tem->legend()[i].group(i);
+ tem->legend()[i].theme(tem->id());
+ status = insertLegend (&(tem->legend()[i]));
+ if (!status)
+ return status;
+ }
+ if (!status)
+ return status;
+
+ themeMap_[tem->id()] = tem;
+ return updateThemeTable(tem);
+}
+
+bool
+TeMySQL::insertThemeGroup (TeViewTree* tree)
+{
+ string save;
+ save = "INSERT INTO te_theme ";
+ save += "(name,parent_id,node_type,view_id,priority) ";
+ save += " VALUES ('" + tree->name() + "',1,1, ";
+ save += Te2String(tree->view()) +", ";
+ save += Te2String(tree->priority()) +") ";
+ if (!this->execute(save))
+ return false;
+ tree->id(this->insertId());
+ return true;
+}
+
+
+bool
+TeMySQL::generateLabelPositions (TeTheme *theme)
+{
+ string geomTable, query;
+ string collTable = theme->collectionTable();
+
+ if((collTable.empty()) || (!tableExist(collTable)))
+ return false;
+
+ if (theme->layer()->hasGeometry(TeLINES))
+ {
+ geomTable = theme->layer()->tableName(TeLINES);
+
+ string extMax = "CREATE TEMPORARY TABLE maxTable";
+ extMax += " SELECT object_id, lower_x, lower_y, upper_x, upper_y";
+ extMax += " FROM " + geomTable + " ORDER BY object_id, ext_max DESC";
+
+ if(!execute(extMax))
+ return false;
+
+ query = "UPDATE " + collTable + ",maxTable SET label_x = (lower_x + upper_x)/2,";
+ query += "label_y = (lower_y + upper_y)/2 WHERE c_object_id = object_id";
+
+ if (execute(query) == false)
+ {
+ execute("DROP TABLE maxTable");
+ return false;
+ }
+
+ execute("DROP TABLE maxTable");
+ }
+
+ if (theme->layer()->hasGeometry(TePOINTS))
+ {
+ geomTable = theme->layer()->tableName(TePOINTS);
+
+ query = "UPDATE " + collTable + "," + geomTable + " SET label_x = x,";
+ query += "label_y = y WHERE c_object_id = object_id";
+
+ if(execute(query) == false)
+ return false;
+ }
+
+ if (theme->layer()->hasGeometry(TePOLYGONS))
+ {
+ geomTable = theme->layer()->tableName(TePOLYGONS);
+
+ string extMax = "CREATE TEMPORARY TABLE maxTable";
+ extMax += " SELECT object_id, lower_x, lower_y, upper_x, upper_y";
+ extMax += " FROM " + geomTable + " ORDER BY object_id, ext_max DESC";
+
+ if(!execute(extMax))
+ return false;
+
+ query = "UPDATE " + collTable + ",maxTable SET label_x = (lower_x + upper_x)/2,";
+ query += "label_y = (lower_y + upper_y)/2 WHERE c_object_id = object_id";
+
+ if (execute(query) == false)
+ {
+ execute("DROP TABLE maxTable");
+ return false;
+ }
+
+ execute("DROP TABLE maxTable");
+ }
+
+ if(theme->layer()->hasGeometry(TeCELLS))
+ {
+ geomTable = theme->layer()->tableName(TeCELLS);
+
+ query = "UPDATE " + collTable + "," + geomTable + " SET label_x = (lower_x + upper_x)/2,";
+ query += "label_y = (lower_y + upper_y)/2 WHERE c_object_id = object_id";
+
+ if (execute(query) == false)
+ return false;
+ }
+
+
+
+
+
+ return true;
+}
+
+
+bool
+TeMySQL::insertLayer (TeLayer* layer)
+{
+ TeProjection* proj = layer->projection();
+ if (!proj || !insertProjection(proj))
+ {
+ errorMessage_ = "Layer sem proje��o ou falha na inser��o da proje��o";
+ return false;
+ }
+ int pid = proj->id();
+ string save = "INSERT INTO te_layer (layer_id,projection_id,name,lower_x,lower_y,upper_x,upper_y) VALUES('',";
+ save += Te2String(pid);
+ save += ",'" + layer->name() + "', ";
+ save += Te2String(layer->box().x1(),15)+ ", ";
+ save += Te2String(layer->box().y1(),15)+ ", ";
+ save += Te2String(layer->box().x2(),15)+ ", ";
+ save += Te2String(layer->box().y2(),15) + ")";
+
+ // if layer insertion fails remove projection
+ if (!this->execute (save))
+ {
+ string sql = "DELETE FROM te_projection WHERE projection_id = " + Te2String(pid);
+ this->execute(sql);
+ return false;
+ }
+
+ layer->id(this->insertId());
+ layerMap_[layer->id()] = layer;
+
+ return true;
+}
+
+
+bool TeMySQL::insertLegend (TeLegendEntry *legend)
+{
+ char q[1024];
+ string save;
+ sprintf (q,"INSERT INTO te_legend VALUES('',%d,%d,%d,'%s','%s','%s')",
+ legend->theme(),
+ legend->group(),
+ legend->count(),
+ legend->from().c_str(),
+ legend->to().c_str(),
+ legend->label().c_str());
+ save = q;
+
+ if (!this->execute(save))
+ return false;
+
+ int legId = insertId();
+ legend->id(legId);
+ legendMap_[legend->id()] = legend;
+ return insertVisual(legend);
+}
+
+
+bool
+TeMySQL::insertRepresentation (int layerId, TeRepresentation& rep)
+{
+ if (layerId <= 0)
+ return false;
+
+ string sql;
+ sql = "INSERT INTO te_representation (layer_id, geom_type, geom_table, description,";
+ sql += "lower_x, lower_y, upper_x, upper_y, res_x, res_y, num_cols, num_rows) VALUES( ";
+ sql += Te2String(layerId) + ", ";
+ sql += Te2String(static_cast<int>(rep.geomRep_)) + ", ";
+ sql += "'" + rep.tableName_ + "', ";
+ sql += "'" + rep.description_ + "',";
+ sql += Te2String(rep.box_.x1(),15) + ", ";
+ sql += Te2String(rep.box_.y1(),15) + ", ";
+ sql += Te2String(rep.box_.x2(),15) + ", ";
+ sql += Te2String(rep.box_.y2(),15) + ", ";
+ sql += Te2String(rep.resX_,15) + ", ";
+ sql += Te2String(rep.resY_,15) + ", ";
+ sql += Te2String(rep.nCols_,15) + ", ";
+ sql += Te2String(rep.nLins_,15) + ") ";
+ if (execute(sql))
+ {
+ rep.id_ = (this->insertId());
+ return true;
+ }
+ return false;
+}
+
+bool
+TeMySQL::insertRelationInfo(const int tableId, const string& tField,
+ const string& eTable, const string& eField, int& relId)
+{
+ // check if relation already exists
+ TeMySQLPortal* portal = (TeMySQLPortal*) this->getPortal();
+ if (!portal)
+ return false;
+
+ relId = -1;
+ string sel = "SELECT relation_id FROM te_tables_relation WHERE";
+ sel += " related_table_id = " + Te2String(tableId);
+ sel += " AND related_attr = '" + tField + "'";
+ sel += " AND external_table_name = '" + eTable + "'";
+ sel += " AND external_attr = '" + eField + "'";
+ if (!portal->query(sel))
+ {
+ delete portal;
+ return false;
+ }
+
+ if (portal->fetchRow())
+ {
+ relId = atoi(portal->getData(0));
+ delete portal;
+ return true;
+ }
+ delete portal;
+
+ string sql = "INSERT INTO te_tables_relation(related_table_id, related_attr, external_table_name, external_attr) ";
+ sql += " VALUES( ";
+ sql += Te2String(tableId);
+ sql += ",'" + tField + "'";
+ sql += ",'" + eTable + "'";
+ sql += ",'" + eField + "')";
+ if (!this->execute(sql))
+ return false;
+ relId = this->insertId();
+ return true;
+}
+
+bool
+TeMySQL::insertTableInfo (int layerId, TeTable &table, const string& user)
+{
+ string sql;
+
+ sql = "INSERT INTO te_layer_table (unique_id, attr_link,attr_initial_time, attr_final_time, attr_time_unit,attr_table_type, ";
+ sql += " user_name, attr_table ";
+ if (layerId > 0)
+ sql += ",layer_id";
+ sql += ") VALUES( ";
+ sql += "'" + table.uniqueName() + "', ";
+ sql += "'" + table.linkName() + "', ";
+ sql += "'" + table.attInitialTime() + "', ";
+ sql += "'" + table.attFinalTime() + "', ";
+ sql += "" + Te2String(table.attTimeUnit()) + ", ";
+ sql += ""+ Te2String(table.tableType()) + ", ";
+ sql += "'" + user + "','" + table.name() +"'";
+ if (layerId > 0)
+ sql += ", " + Te2String(layerId) ;
+ sql += ")";
+
+ if (!this->execute(sql))
+ return false;
+
+ int id = (this->insertId());
+ table.setId(id);
+ return true;
+}
+
+bool
+TeMySQL::insertThemeTable (int themeId, int tableId, int relationId, int tableOrder)
+{
+ string relId;
+ if (relationId > 0)
+ relId = Te2String(relationId);
+ else
+ relId = "NULL";
+
+ string sql = "INSERT INTO te_theme_table VALUES ('',";
+ sql += Te2String(themeId) + "," + Te2String(tableId) + ",";
+ sql += relId + "," + Te2String(tableOrder) + ")";
+
+
+ if (!execute(sql))
+ return false;
+
+ return true;
+}
+
+
+bool
+TeMySQL::insertPolygon (const string& table, TePolygon &poly )
+{
+ double ext_max;
+
+ int i,
+ ni,
+ size;
+ unsigned int k;
+ double *points = NULL;
+ char buf[256], *query, *end;
+
+
+ int parentId = 0;
+ for ( k = 0; k < poly.size(); k++ )
+ {
+ TeLinearRing ring ( poly[k] );
+ TeBox b = ring.box();
+ size = ring.size();
+ ni = 0;
+ ext_max = MAX(b.width(),b.height());
+ if (k==0)
+ ni = poly.size()-1;
+ else
+ ni = 0;
+
+ // Create and save the BLOB
+ points = new double[2*sizeof(double)*size];
+
+ int iac = 0;
+ for (i=0;i<size;i++)
+ {
+ points[iac++]=swappd(ring[i].x());
+ points[iac++]=swappd(ring[i].y());
+ }
+
+ sprintf (buf,"INSERT INTO %s values('','%s',%d,%d,%d,%.15f,%.15f,%.15f,%.15f,%.15f,",
+ table.c_str(),escapeSequence(poly.objectId()).c_str(),size,ni,parentId,b.lowerLeft().x(),b.lowerLeft().y(),b.upperRight().x(),b.upperRight().y(),ext_max);
+
+ query = new char[size*4*sizeof(double)+strlen(buf)+4];
+ end = strxmov(query,buf,(char*)0);
+ *end++ = '\'';
+ end += mysql_real_escape_string(&mysql_,end,(char*)points,size*2*sizeof(double));
+ *end++ = '\'';
+ *end++ = ')';
+ delete points;
+
+ if (mysql_real_query(&mysql_,query,(unsigned int) (end - query)) != 0)
+ {
+ errorMessage_ = string(mysql_error(&mysql_));
+ delete query;
+ return false;
+ }
+ delete query;
+ query = 0;
+ ring.geomId (insertId());
+ if (k==0)
+ parentId = ring.geomId();
+ }
+ sprintf(buf,"UPDATE %s SET parent_id=%d WHERE geom_id=%d",table.c_str(),parentId,parentId);
+ if (mysql_real_query(&mysql_,buf,(unsigned int)strlen(buf)) != 0)
+ {
+ errorMessage_ = string(mysql_error(&mysql_));
+ delete query;
+ return false;
+ }
+ return true;
+}
+
+bool
+TeMySQL::updatePolygon (const string& table, TePolygon &poly )
+{
+ double ext_max;
+ int ni;
+ unsigned int i,k,size;
+ double *points = NULL;
+ char buf[256], message[256], *query, *end;
+ TeBox b = poly.box();
+
+ for ( k = 0; k < poly.size(); k++ )
+ {
+ TeLinearRing ring ( poly[k] );
+ size = ring.size();
+ ni = 0;
+ if (k==0)
+ {
+ ext_max = MAX(b.width(),b.height());
+ ni = poly.size()-1;
+ }
+ else
+ ni = 0;
+
+// Create and save the BLOB
+ points = new double[2*sizeof(double)*size];
+ int iac = 0;
+ for (i=0;i<size;i++)
+ {
+ points[iac++]=swappd(ring[i].x());
+ points[iac++]=swappd(ring[i].y());
+ }
+
+ sprintf (buf,"UPDATE %s SET num_coords=%d, num_holes=%d, parent_id=%d, lower_x=%g, lower_y=%g, upper_x=%g, upper_y=%g, ext_max=%g, spatial_data=",
+ table.c_str(),size,ni,k,b.lowerLeft().x(),b.lowerLeft().y(),b.upperRight().x(),b.upperRight().y(),ext_max);
+ query = new char[size*4*sizeof(double)+strlen(buf)+50];
+ end = strxmov(query,buf,(char*)0);
+ *end++ = '\'';
+ end += mysql_real_escape_string(&mysql_,end,(char*)points,size*2*sizeof(double));
+ *end++ = '\'';
+ sprintf (message," WHERE geom_id=%d",ring.geomId());
+ end = strxmov(end,message,0);
+ delete points;
+
+ if (mysql_real_query(&mysql_,query,(unsigned int) (end - query)) != 0)
+ {
+ errorMessage_ = string(mysql_error(&mysql_));
+ delete query;
+ return false;
+ }
+ delete query;
+ query = 0;
+ }
+ return true;
+}
+
+
+bool
+TeMySQLPortal::fetchGeometry (TePolygon& poly)
+{
+ int ni,j;
+ TeLinearRing ring = this->getLinearRing(ni);
+ poly.objectId ( ring.objectId() );
+ poly.geomId ( ring.geomId() );
+ poly.add ( ring );
+ int parentId = poly.geomId();
+ while (fetchRow())
+ {
+ if (atoi(this->getData("parent_id")) == parentId)
+ {
+ TeLinearRing ring = getLinearRing(j);
+ poly.add ( ring );
+ }
+ else
+ return true;
+ }
+ return false;
+}
+
+
+TeLinearRing
+TeMySQLPortal::getLinearRing (int &ni)
+{
+ int index = atoi(getData("geom_id"));
+ string object_id = getData("object_id");
+ int np = atoi (getData("num_coords"));
+ ni = atoi (getData("num_holes"));
+ TeBox b (getDouble("lower_x"),getDouble("lower_y"),getDouble("upper_x"),getDouble("upper_y"));
+ int k;
+ TeLine2D line;
+ double x,y,*data = (double*)getData("spatial_data");
+
+ for (k=0;k<np;k++)
+ {
+ x = swappd(*data++);
+ y = swappd(*data++);
+ TeCoord2D pt(x,y);
+ line.add(pt);
+ }
+
+ TeLinearRing ring ( line );
+ ring.objectId (object_id);
+ ring.geomId (index);
+ ring.setBox (b);
+ return ring;
+}
+
+
+bool
+TeMySQL::insertLine (const string& table, TeLine2D &l)
+{
+ char buf[256],
+ *query,
+ *end;
+ double *points = NULL,
+ ext_max;
+ int size=l.size(),
+ i,
+ iac;
+ TeBox b=l.box();
+
+ ext_max = MAX(b.width(),b.height());
+ points = new double[2*sizeof(double)*size];
+ iac = 0;
+
+ for (i=0;i<size;i++)
+ {
+ points[iac++]=l[i].x();
+ points[iac++]=l[i].y();
+ }
+
+ sprintf (buf,"INSERT INTO %s values('','%s',%d,%.15f,%.15f,%.15f,%.15f,%.15f,",
+ table.c_str(),
+ escapeSequence(l.objectId()).c_str(),
+ size,
+ b.lowerLeft().x(),b.lowerLeft().y(),b.upperRight().x(),b.upperRight().y(),ext_max);
+
+ query = new char[size*4*sizeof(double)+strlen(buf)+4];
+
+ end = strxmov(query,buf,0);
+ *end++ = '\'';
+ end += mysql_real_escape_string(&mysql_,end,(char*)points,size*2*sizeof(double));
+ *end++ = '\'';
+ *end++ = ')';
+ delete points;
+
+ if (mysql_real_query(&mysql_,query,(unsigned int) (end - query)) != 0)
+ {
+ errorMessage_ = string(mysql_error(&mysql_));
+ delete query;
+ return false;
+ }
+
+ l.geomId (insertId());
+ delete query;
+ return true;
+}
+
+
+bool
+TeMySQL::updateLine (const string& table, TeLine2D &l)
+{
+ char buf[256],
+ message[256],
+ *query,
+ *end;
+ double *points = NULL,
+ ext_max;
+ int size=l.size(),
+ i,
+ iac;
+ TeBox b=l.box();
+
+ ext_max = MAX(b.width(),b.height());
+ points = new double[2*sizeof(double)*size];
+ iac = 0;
+
+ for (i=0;i<size;i++)
+ {
+ points[iac++]=l[i].x();
+ points[iac++]=l[i].y();
+ }
+
+ sprintf (buf,"UPDATE %s SET num_coords=%d, lower_x=%g, lower_y=%g, upper_x=%g, upper_y=%g, ext_max=%g, spatial_data=",
+ table.c_str(),size,b.lowerLeft().x(),b.lowerLeft().y(),b.upperRight().x(),b.upperRight().y(),ext_max);
+ query = new char[size*4*sizeof(double)+strlen(buf)+50];
+ end = strxmov(query,buf,(char*)0);
+ *end++ = '\'';
+ end += mysql_real_escape_string(&mysql_,end,(char*)points,size*2*sizeof(double));
+ *end++ = '\'';
+ delete points;
+
+ sprintf (message," WHERE geom_id=%d",l.geomId());
+ end = strxmov(end,message,(char*)0);
+
+ if (mysql_real_query(&mysql_,query,(unsigned int) (end - query)) != 0)
+ {
+ errorMessage_ = string(mysql_error(&mysql_));
+ delete query;
+ return false;
+ }
+ delete query;
+ return true;
+}
+
+
+
+bool
+TeMySQLPortal::fetchGeometry(TeLine2D& line)
+{
+ int index = atoi (getData ("geom_id"));
+ string object_id = getData ("object_id");
+ int np = atoi (getData("num_coords"));
+ TeBox b (atof(getData("lower_x")),atof(getData("lower_y")),atof(getData("upper_x")),atof(getData("upper_y")));
+ int k;
+ double x,y,*data = (double*)getData("spatial_data");
+
+ for (k=0;k<np;k++)
+ {
+ x = *data++;
+ y = *data++;
+ TeCoord2D pt(x,y);
+ line.add(pt);
+ }
+ line.objectId (object_id);
+ line.geomId (index);
+ line.setBox (b);
+ return (fetchRow());
+}
+
+
+bool
+TeMySQL::insertPoint(const string& table,TePoint &p)
+{
+ string q = "INSERT INTO " + table + " VALUES('',";
+ q += "'" + escapeSequence(p.objectId()) + "',";
+ q += Te2String(p.location().x(),15) + ",";
+ q += Te2String(p.location().y(),15) + ")";
+
+ if (!this->execute(string(q)))
+ return false;
+ p.geomId(this->insertId());
+ return true;
+}
+
+
+bool
+TeMySQLPortal::fetchGeometry(TePoint& p)
+{
+ TeCoord2D c(atof (getData("x")), atof (getData("y")));
+ p.geomId( atoi(getData("geom_id")));
+ p.objectId( string(getData("object_id")));
+ p.add(c);
+ return (fetchRow());
+}
+
+
+bool
+TeMySQL::insertText(const string& table, TeText &t)
+{
+ char q[256];
+ sprintf (q,"INSERT INTO %s values('','%s',%g,%g,'%s',%g, %g, %g, %g)",
+ table.c_str(), escapeSequence(t.objectId()).c_str(),
+ t.location().x(), t.location().y(),
+ t.textValue().c_str(), t.angle(), t.height(),t.alignmentVert(),t.alignmentHoriz());
+ if (!this->execute(string(q)))
+ return false;
+ t.geomId(this->insertId());
+
+ return true;
+}
+
+
+bool
+TeMySQL::insertArc(const string& table, TeArc &arc)
+{
+ char q[256];
+ sprintf (q,"INSERT INTO %s values('','%s',%d,%d)",
+ table.c_str(),escapeSequence(arc.objectId()).c_str(),arc.fromNode().geomId(),arc.toNode().geomId());
+ if (!this->execute(string(q)))
+ return false;
+ arc.geomId(this->insertId());
+ return true;
+}
+
+
+bool
+TeMySQL::insertNode(const string& table, TeNode &node)
+{
+ char q[256];
+ sprintf (q,"INSERT INTO %s values('','%s',%g,%g)",table.c_str(),node.objectId().c_str(),node.location().x(),node.location().y());
+ if (!this->execute(string(q)))
+ return false;
+ node.geomId(this->insertId());
+ return true;
+}
+
+bool
+TeMySQL::insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName)
+{
+ unsigned char *cdata = 0;
+ int size;
+ FILE *fp = 0;
+
+ struct stat buf;
+ int result;
+
+ result = stat(fileName.c_str(), &buf);
+
+ if( result != 0 )
+ return false;
+
+ size = buf.st_size;
+
+ cdata = new unsigned char[size];
+ fp = fopen(fileName.c_str(), "rb");
+ fread(cdata, sizeof(unsigned char), size, fp);
+
+ bool status = insertBlob (tableName, columnBlob, columnId, valueId, cdata, size);
+
+ if(fp)
+ fclose(fp);
+
+ return status;
+}
+
+bool
+TeMySQL::insertBlob (const string& tableName, const string& /* columnBlob */, TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size)
+{
+ TeMySQLPortal* portal = (TeMySQLPortal*)this->getPortal();
+ if (!portal)
+ return false;
+
+ string q = "SELECT * FROM "+ tableName +" WHERE "+ columnId.name_ +" = ";
+
+ switch (columnId.type_ )
+ {
+ case TeSTRING:
+ q += "'"+ valueId + "'";
+ break;
+ default:
+ q += valueId;
+ break;
+ }
+
+ if ((!portal->query(q)) || (!portal->fetchRow()))
+ {
+ delete portal;
+ return false;
+ }
+ delete portal;
+
+ char message[256],
+ *query,
+ *end;
+ sprintf (message,"UPDATE %s SET media_blob= ",tableName.c_str());
+
+ query = new char[2*size+strlen(message)+4];
+ end = strxmov(query,message,0);
+ *end++ = '\'';
+ end += mysql_real_escape_string(&mysql_,end,(char*)data,size);
+ *end++ = '\'';
+
+ if (columnId.type_ == TeSTRING)
+ sprintf (message,"WHERE %s='%s'",columnId.name_.c_str(),valueId.c_str());
+ else
+ sprintf (message,"WHERE %s=%s",columnId.name_.c_str(),valueId.c_str());
+
+ end = strxmov(end,message,0);
+
+ if (mysql_real_query(&mysql_,query,(unsigned int) (end - query)))
+ {
+ errorMessage_ = string(mysql_error(&mysql_));
+ delete query;
+ return false;
+ }
+ delete query;
+ return true;
+}
+
+bool
+TeMySQL::insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur,
+ unsigned char *buf,unsigned long size, int band, unsigned int res, unsigned int subband)
+{
+ if (blockId.empty()) // no block identifier provided
+ {
+ errorMessage_ = "bloco sem identificador";
+ return false;
+ }
+
+ TeMySQLPortal* portal = (TeMySQLPortal*) this->getPortal();
+ if (!portal)
+ return false;
+
+ bool update = false;
+ string q ="SELECT * FROM " + table;
+ q += " WHERE block_id='" + blockId + "'";
+
+ if (!portal->query (q))
+ {
+ delete portal;
+ return false;
+ }
+ // check if this block is alread in the database
+ if (portal->fetchRow())
+ update = true;
+ delete portal;
+
+ char message[256],
+ *end;
+ if (!update)
+ {
+ sprintf (message,"INSERT INTO %s values('%s',%f,%f,%f,%f,%d,%d,%d,",
+ table.c_str(),blockId.c_str(),ll.x(),ll.y(),ur.x(),ur.y(),band,res,subband);
+ }
+ else
+ {
+ sprintf (message,"UPDATE %s SET spatial_data=",table.c_str());
+ }
+
+ if (bufferBlobSize_ < (long)(2*size+strlen(message)+20))
+ {
+ if (bufferBlob_)
+ delete bufferBlob_;
+ bufferBlobSize_ = 2*size+strlen(message)+20;
+ bufferBlob_ = new char[bufferBlobSize_];
+ }
+ end = strxmov(bufferBlob_,message,0);
+ *end++ = '\'';
+ end += mysql_real_escape_string(&mysql_,end,(char*)buf,size);
+ *end++ = '\'';
+
+ if (update)
+ {
+ sprintf (message,", block_size=%ld WHERE block_id='%s'",size,blockId.c_str());
+ end = strxmov(end,message,0);
+ }
+ else
+ {
+ sprintf (message,",%ld)",size);
+ end = strxmov(end,message,0);
+ }
+
+ if (mysql_real_query(&mysql_,bufferBlob_,(unsigned int) (end - bufferBlob_)))
+ {
+ errorMessage_ = string(mysql_error(&mysql_));
+ delete bufferBlob_;
+ bufferBlobSize_ = 0;
+ bufferBlob_ = 0;
+ return false;
+ }
+ return true;
+}
+
+bool
+TeMySQLPortal::fetchGeometry(TeNode& n)
+{
+ TeCoord2D c(atof (getData("x")), atof (getData("y")));
+ n.geomId( atoi(getData("geom_id")));
+ n.objectId( string(getData("object_id")));
+ n.add(c);
+ return (fetchRow());
+}
+
+
+bool
+TeMySQL::insertCell(const string& table, TeCell &c)
+{
+ TeBox b=c.box();
+ char q[256];
+ sprintf (q,"INSERT INTO %s values('','%s',%.15f,%.15f,%.15f,%.15f,%d,%d)",
+ table.c_str(),c.objectId().c_str(),
+ b.lowerLeft().x(),b.lowerLeft().y(),b.upperRight().x(),b.upperRight().y(),
+ c.column(),c.line());
+
+ if (!this->execute (string(q)))
+ return false;
+ c.geomId(this->insertId());
+ return true;
+}
+
+
+TeTime
+TeMySQLPortal::getDate (int i)
+{
+ string s = getData(i);
+ TeTime t(s, TeSECOND, "YYYYsMMsDDsHHsmmsSS","-");
+ return t;
+}
+
+TeTime
+TeMySQLPortal::getDate (const string& s)
+{
+ string sv = getData(s);
+ TeTime t(sv, TeSECOND, "YYYYsMMsDDsHHsmmsSS","-");
+ return t;
+}
+
+string
+TeMySQLPortal::getDateAsString(const string& s)
+{
+ TeTime t = this->getDate(s);
+ if (t.isValid())
+ {
+ string tval = "\'"+t.getDateTime("YYYYsMMsDDsHHsmmsSS", "-")+"\'";
+ return tval;
+ }
+ else
+ return "";
+}
+
+string
+
+TeMySQLPortal::getDateAsString(int i)
+{
+ TeTime t = this->getDate(i);
+ if (t.isValid())
+ {
+ string tval = "\'"+t.getDateTime("YYYYsMMsDDsHHsmmsSS", "-")+"\'";
+ return tval;
+ }
+ else
+ return "";
+}
+
+double
+TeMySQLPortal::getDouble (const string& s)
+{
+ return atof(getData(s));
+}
+
+
+double
+TeMySQLPortal::getDouble (int i)
+{
+ if (row_ == 0)
+ return 0.;
+
+ if (row_[i])
+ return atof(row_[i]);
+ else
+ return 0.;
+}
+
+int
+TeMySQLPortal::getInt (const string& s)
+{
+ return atoi(getData(s));
+}
+
+
+int
+TeMySQLPortal::getInt (int i)
+{
+ if (row_ == 0)
+ return 0;
+
+ if (row_[i])
+ return atoi(row_[i]);
+ else
+ return 0;
+}
+
+
+char*
+TeMySQLPortal::getData (int i)
+{
+ if (row_ == 0)
+ return "";
+
+ if (row_[i])
+ return row_[i];
+ else
+ return "";
+}
+
+
+char*
+TeMySQLPortal::getData (const string& s)
+{
+ string fieldName;
+ size_t pos = s.find(".", string::npos,1);
+ if (pos != string::npos)
+ fieldName = s.substr(pos+1);
+ else
+ fieldName = s;
+
+ if (row_ == 0)
+ return "";
+
+ TeAttributeList::iterator it = attList_.begin();
+
+ int j = 0;
+ while ( it != attList_.end() )
+ {
+ if ((TeConvertToUpperCase(fieldName) == TeConvertToUpperCase((*it).rep_.name_)) ||
+ (TeConvertToUpperCase(s) == TeConvertToUpperCase((*it).rep_.name_)))
+ {
+ if (row_[j])
+ return row_[j];
+ else
+ return "";
+ }
+ ++it;
+ j++;
+ }
+ return "";
+}
+
+bool
+TeMySQLPortal::getBlob (const string& s, unsigned char* &data, long& size)
+{
+ string fieldName;
+ size_t pos = s.find(".", string::npos,1);
+ if (pos != string::npos)
+ fieldName = s.substr(pos+1);
+ else
+ fieldName = s;
+
+ TeAttributeList::iterator it = attList_.begin();
+ int j = 0, i=-1;
+ while ( it != attList_.end() )
+ {
+ if (fieldName == (*it).rep_.name_)
+ {
+ i=j;
+ break;
+ }
+ ++it;
+ j++;
+ }
+ if (i<0)
+ return false;
+
+ unsigned long *lengths;
+ lengths = mysql_fetch_lengths(result_);
+ size = lengths[i];
+ if (row_[i])
+ {
+// data = (unsigned char*) row_[i];
+ data = new unsigned char[size];
+ memcpy(data, (unsigned char*) row_[i], size * sizeof(char));
+ return true;
+ }
+ else
+ {
+ data = 0;
+ return false;
+ }
+}
+
+
+bool
+TeMySQLPortal::getBool (const string& s)
+{
+ int val = atoi(getData(s));
+ return val ? true : false;
+}
+
+
+bool
+TeMySQLPortal::getBool (int i)
+{
+ if (row_ == 0)
+ return false;
+ int val = atoi(getData(i));
+ return val ? true : false;
+}
+
+bool
+TeMySQLPortal::getRasterBlock(unsigned long& size, unsigned char* ptData)
+{
+
+ // get the actual length of the compressed data
+ size = atoi(getData("block_size"));
+ if ( (size>0) && row_[8])
+ {
+ memcpy((void*)ptData,(void*)(row_[8]),size);
+ return true;
+ }
+ else
+ {
+ ptData = 0;
+ return false;
+ }
+}
+
+bool
+TeMySQL::inClauseValues(const string& query, const string& attribute, vector<string>& inClauseVector)
+{
+ int i = 0, numRows = 0, count = 0, chunk = 200;
+ string id, inClause = "(", plic = "'";
+
+ TeDatabasePortal *pt = getPortal();
+ if(pt->query(query) == false)
+ {
+ delete pt;
+ return false;
+ }
+
+ while (numRows < pt->numRows())
+ {
+ if(count < chunk && pt->fetchRow())
+ {
+ id = pt->getData(attribute);
+ inClause = inClause + plic + id + "',";
+ ++count;
+ ++numRows;
+ }
+ else
+ {
+ inClause.erase(inClause.size()-1,1);
+ inClause += ")";
+ inClauseVector.push_back(inClause);
+ count = 0;
+ ++i;
+ inClause = "(";
+ }
+ }
+ if (numRows == 0)
+ {
+ delete pt;
+ return true;
+ }
+ else
+ {
+ inClause.erase(inClause.size()-1,1);
+ inClause += ")";
+ inClauseVector.push_back(inClause);
+ }
+
+ delete pt;
+ return true;
+}
+
+string
+TeMySQL::getSQLTime(TeTime& time)
+{
+ string result = "'"+ time.getDateTime("YYYYsMMsDDsHHsmmsSS", "-", ":") +"'";
+ return result;
+}
+
+string
+TeMySQL::getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel,
+ const string& initialTime, const string& finalTime)
+{
+
+ //In MySQL the first day of the week is monday with index 0
+ if(chr==TeDAYOFWEEK)
+ {
+ time1 = time1-1;
+ if(time1<0)
+ time1=6;
+ time2 = time2-1;
+ if(time2<0)
+ time2=6;
+ }
+
+ return(TeDatabase::getSQLTemporalWhere(time1, time2, chr, rel, initialTime, finalTime));
+}
+
+
+string TeMySQL::concatValues(vector<string>& values, const string& unionString)
+{
+ string concat = "CONCAT(";
+
+ for(unsigned int i = 0; i < values.size(); ++i)
+ {
+ if(i != 0)
+ {
+ concat += ", ";
+
+ if(!unionString.empty())
+ {
+ concat += "'";
+ concat += unionString;
+ concat += "'";
+ concat += ", ";
+ }
+ }
+
+ concat += values[i];
+ }
+
+ concat += ")";
+
+ return concat;
+}
+
+string TeMySQL::toUpper(const string& value)
+{
+ string result = "upper(";
+ result += value;
+ result += ")";
+
+ return result;
+}
diff --git a/src/terralib/drivers/MySQL/TeMySQL.h b/src/terralib/drivers/MySQL/TeMySQL.h
new file mode 100644
index 0000000..d268062
--- /dev/null
+++ b/src/terralib/drivers/MySQL/TeMySQL.h
@@ -0,0 +1,218 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_MYSQL_H
+#define __TERRALIB_INTERNAL_MYSQL_H
+
+#ifdef WIN32
+#include <winsock.h>
+#endif
+
+#include <mysql.h>
+
+#include <TeTable.h>
+#include <TeDatabase.h>
+
+
+//! A concrete implementation of a driver to the MySQL SGDB
+class TeMySQL : public TeDatabase
+{
+friend class TeMySQLPortal;
+
+public:
+
+ TeMySQL();
+
+ ~TeMySQL();
+
+ MYSQL* getMySQL ()
+ { return &mysql_; }
+
+ string escapeSequence(const string& from);
+
+ bool newDatabase(const string& database, const string& user, const string& password, const string& host, const int &port=0, bool terralibModel=true);
+
+ bool connect (const string& host, const string& user, const string& password, const string& database, int port=0);
+
+ bool showDatabases (const string& host, const string& user, const string& password, vector<string>& dbNames, int port=0);
+
+ void close();
+
+ bool tableExist(const string& table);
+
+ bool columnExist(const string& table, const string& column, TeAttribute& attr);
+
+ bool addColumn (const string& table,TeAttributeRep &rep);
+
+ bool defineIntegrity(void);
+
+ bool createRelation (const string& /* relName */, const string& /* table */, const string& /* fieldName */,
+ const string& /* relatedTable */, const string& /* relatedField */, bool /* cascadeDeletion */)
+ { return true; }
+
+ TeDBRelationType existRelation(const string& /* tableName */, const string& /* relName */)
+
+ { return TeNoRelation; }
+
+ bool execute ( const string &q);
+
+ TeDatabasePortal* getPortal ();
+
+ string errorMessage ()
+ { return string(mysql_error(&mysql_)); }
+
+ int errorNum ()
+ { return mysql_errno(&mysql_); }
+
+ bool createPolygonGeometry (const string& table);
+ bool createLineGeometry (const string& table);
+ bool createRasterTable (const string& table);
+
+// specific TerraLib database access methods
+
+ bool insertProjection (TeProjection *proj);
+ bool insertLayer(TeLayer* layer);
+ bool insertRepresentation(int layerId, TeRepresentation& rep);
+ bool insertTableInfo (int layerId, TeTable &table, const string& user="");
+ bool insertRelationInfo(const int tableId, const string& tField,
+ const string& eTable, const string& eField, int& relId);
+ bool insertView (TeView *view);
+ bool insertViewTree (TeViewTree *tree);
+ bool insertTheme(TeTheme *theme);
+ bool insertThemeGroup (TeViewTree* tree);
+ bool generateLabelPositions (TeTheme *theme);
+ bool insertThemeTable (int themeId, int tableId, int relationId, int tableOrder);
+ bool insertLegend (TeLegendEntry *legend);
+ bool insertPolygon (const string& table, TePolygon &p);
+ bool updatePolygon (const string& table, TePolygon &p);
+ bool insertLine (const string& table, TeLine2D &l);
+ bool updateLine (const string& table, TeLine2D &l);
+ bool insertPoint (const string& table, TePoint &p);
+ bool insertText (const string& table, TeText &t);
+ bool insertArc (const string& table,TeArc &arc);
+ bool insertNode (const string& table, TeNode &node);
+ bool insertCell (const string& table, TeCell &c);
+ int insertId();
+
+ bool insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, unsigned char *buf,unsigned long size, int band=0, unsigned int res=1, unsigned int subband=0);
+
+ string getSQLTime(TeTime& time);
+ string getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel,
+ const string& initialTime, const string& finalTime);
+
+ bool inClauseValues(const string& query, const string& attribute, vector<string>& inClauseVector);
+
+ bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName);
+ bool insertBlob (const string& tableName, const string& columnBlob,
+ TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size);
+
+ //! Concat values in a vector using unionString as the join between each value
+ string concatValues(vector<string>& values, const string& unionString);
+
+ //! Returns the SQL function for upper case
+ string toUpper(const string& value);
+
+private :
+
+ MYSQL mysql_;
+ char* bufferBlob_; // internal buffer used to write blob data
+ long bufferBlobSize_; // size of the data already allocated
+
+};
+
+//! A concrete implementation of a portal to a MySQL database
+class TeMySQLPortal : public TeDatabasePortal
+{
+private:
+
+ MYSQL *mysql_;
+ MYSQL_RES* result_;
+ MYSQL_ROW row_;
+
+public :
+
+// Constructor / Destructor
+
+ TeMySQLPortal ( TeMySQL *m);
+
+ TeMySQLPortal ( const TeMySQLPortal& p);
+
+ ~TeMySQLPortal ();
+
+// Basic database methods
+
+ int insertId();
+
+ bool query (const string &qry, TeCursorLocation l = TeSERVERSIDE, TeCursorType t = TeUNIDIRECTIONAL, TeCursorEditType e = TeREADONLY, TeCursorDataType dt = TeTEXTCURSOR );
+
+ bool fetchRow ();
+
+ bool fetchRow (int i);
+
+ void freeResult ();
+
+ string errorMessage ()
+
+ { return string(mysql_error(mysql_));} //: last error message()
+
+ int errorNum ()
+
+ { return mysql_errno(mysql_);}
+
+// specific SQL SELECT command methods
+
+ char* getData (int i);
+ char* getData (const string& s);
+ double getDouble (int i);
+ double getDouble (const string& s);
+ int getInt (int i);
+ int getInt (const string& s);
+ bool getBool (const string& s);
+ bool getBool (int i);
+
+ bool fetchGeometry(TePolygon& pol);
+ bool fetchGeometry(TeLine2D& line);
+ bool fetchGeometry(TeNode& n);
+ bool fetchGeometry(TePoint& p);
+
+ bool setData (int /* field */, string /* val */)
+ {return true; }
+ MYSQL_RES* result()
+ {return result_; }
+
+ bool getBlob (const string& s, unsigned char* &data, long& size);
+ bool getRasterBlock(unsigned long& size, unsigned char* ptData);
+
+ TeTime getDate (int i);
+ TeTime getDate (const string& s);
+
+ string getDateAsString(int i);
+ string getDateAsString(const string& s);
+
+
+protected:
+ TeLinearRing getLinearRing (int &ni);
+};
+
+#endif
+
diff --git a/src/terralib/drivers/MySQL/include/config-netware.h b/src/terralib/drivers/MySQL/include/config-netware.h
new file mode 100644
index 0000000..3e145f5
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/config-netware.h
@@ -0,0 +1,119 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/* Header for NetWare compatible with MySQL */
+
+#ifndef _config_netware_h
+#define _config_netware_h
+
+/* required headers */
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+#include <screen.h>
+#include <limits.h>
+#include <signal.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <time.h>
+#include <sys/time.h>
+#include <pthread.h>
+#include <termios.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* required adjustments */
+#undef HAVE_READDIR_R
+#undef HAVE_RWLOCK_INIT
+#undef HAVE_SCHED_H
+#undef HAVE_SYS_MMAN_H
+#undef HAVE_SYNCH_H
+#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1
+#define HAVE_PTHREAD_SIGMASK 1
+#define HAVE_PTHREAD_YIELD_ZERO_ARG 1
+#define HAVE_BROKEN_REALPATH 1
+
+/* no libc crypt() function */
+#ifdef HAVE_OPENSSL
+ #define HAVE_CRYPT 1
+#else
+ #undef HAVE_CRYPT
+#endif /* HAVE_OPENSSL */
+
+/* Configure can't detect this because it uses AC_TRY_RUN */
+#undef HAVE_COMPRESS
+#define HAVE_COMPRESS
+
+/* include the old function apis */
+#define USE_OLD_FUNCTIONS 1
+
+/* no case sensitivity */
+#define FN_NO_CASE_SENCE 1
+
+/* the thread alarm is not used */
+#define DONT_USE_THR_ALARM 1
+
+/* signals do not interrupt sockets */
+#define SIGNALS_DONT_BREAK_READ 1
+
+/* signal by closing the sockets */
+#define SIGNAL_WITH_VIO_CLOSE 1
+
+/* On NetWare, stack grows towards lower address*/
+#define STACK_DIRECTION -1
+
+/* default directory information */
+#define DEFAULT_MYSQL_HOME "sys:/mysql"
+#define PACKAGE "mysql"
+#define DEFAULT_BASEDIR "sys:/"
+#define SHAREDIR "share/"
+#define DEFAULT_CHARSET_HOME "sys:/mysql/"
+#define DATADIR "data/"
+
+/* 64-bit file system calls */
+#define SIZEOF_OFF_T 8
+#define off_t off64_t
+#define chsize chsize64
+#define ftruncate ftruncate64
+#define lseek lseek64
+#define pread pread64
+#define pwrite pwrite64
+#define tell tell64
+
+/* do not use the extended time in LibC sys\stat.h */
+#define _POSIX_SOURCE
+
+/* Kernel call on NetWare that will only yield if our time slice is up */
+void kYieldIfTimeSliceUp(void);
+
+/* Some macros for portability */
+
+#define set_timespec(ABSTIME,SEC) { (ABSTIME).tv_sec=time(NULL)+(SEC); (ABSTIME).tv_nsec=0; }
+
+/* extra protection against CPU Hogs on NetWare */
+#define NETWARE_YIELD kYieldIfTimeSliceUp()
+/* Screen mode for help texts */
+#define NETWARE_SET_SCREEN_MODE(A) setscreenmode(A)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _config_netware_h */
diff --git a/src/terralib/drivers/MySQL/include/config-os2.h b/src/terralib/drivers/MySQL/include/config-os2.h
new file mode 100644
index 0000000..0402074
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/config-os2.h
@@ -0,0 +1,835 @@
+/* Copyright (C) 2000 MySQL AB & Yuri Dario
+ All the above parties has a full, independent copyright to
+ the following code, including the right to use the code in
+ any manner without any demands from the other parties.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA */
+
+/* Defines for OS2 to make it compatible for MySQL */
+
+#ifndef __CONFIG_OS2_H__
+#define __CONFIG_OS2_H__
+
+#include <os2.h>
+#include <math.h>
+#include <io.h>
+#include <types.h>
+
+/* Define to name of system eg solaris*/
+#define SYSTEM_TYPE "IBM OS/2 Warp"
+/* Define to machine type name eg sun10 */
+#define MACHINE_TYPE "i686"
+/* Name of package */
+#define PACKAGE "mysql"
+/* Version number of package */
+#define VERSION MYSQL_SERVER_VERSION
+/* Default socket */
+#define MYSQL_UNIX_ADDR "\\socket\\MySQL"
+
+#define FN_LIBCHAR '\\'
+#define FN_ROOTDIR "\\"
+#define MY_NFILE 1024 /* This is only used to save filenames */
+
+#define HAVE_ACCESS
+
+#define DEFAULT_MYSQL_HOME "c:\\mysql"
+#define DEFAULT_BASEDIR "C:\\"
+#define SHAREDIR "share"
+#define DEFAULT_CHARSET_HOME "C:/mysql/"
+#define _POSIX_PATH_MAX 255
+#define DWORD ULONG
+
+#define O_SHARE 0x1000 /* Open file in sharing mode */
+#define FILE_BINARY O_BINARY /* my_fopen in binary mode */
+#define S_IROTH S_IREAD /* for my_lib */
+
+#define CANT_DELETE_OPEN_FILES /* saves open files in a list, for delayed delete */
+
+#define O_NONBLOCK 0x10
+
+#define NO_OPEN_3 /* For my_create() */
+#define SIGQUIT SIGTERM /* No SIGQUIT */
+#define SIGALRM 14 /* Alarm */
+
+#define NO_FCNTL_NONBLOCK
+
+#define EFBIG E2BIG
+/*#define ENFILE EMFILE */
+/*#define ENAMETOOLONG (EOS2ERR+2) */
+/*#define ETIMEDOUT 145 */
+/*#define EPIPE 146 */
+#define EROFS 147
+
+#define sleep(A) DosSleep((A)*1000)
+#define closesocket(A) soclose(A)
+
+#define F_OK 0
+#define W_OK 2
+
+#define bzero(x,y) memset((x),'\0',(y))
+#define bcopy(x,y,z) memcpy((y),(x),(z))
+#define bcmp(x,y,z) memcmp((y),(x),(z))
+
+#define F_RDLCK 4 /* Read lock. */
+#define F_WRLCK 2 /* Write lock. */
+#define F_UNLCK 0 /* Remove lock. */
+
+#define S_IFMT 0x17000 /* Mask for file type */
+#define F_TO_EOF 0L /* Param to lockf() to lock rest of file */
+
+#define HUGE_PTR
+
+#ifdef __cplusplus
+extern "C"
+#endif
+double _cdecl rint( double nr);
+
+DWORD TlsAlloc( void);
+BOOL TlsFree( DWORD);
+PVOID TlsGetValue( DWORD);
+BOOL TlsSetValue( DWORD, PVOID);
+
+/* support for > 2GB file size */
+#define SIZEOF_OFF_T 8
+#define lseek(A,B,C) _lseek64( A, B, C)
+#define tell(A) _lseek64( A, 0, SEEK_CUR)
+
+void* dlopen( char* path, int flag);
+char* dlerror( void);
+void* dlsym( void* hmod, char* fn);
+void dlclose( void* hmod);
+
+/* Some typedefs */
+typedef unsigned long long os_off_t;
+
+/* config.h. Generated automatically by configure. */
+/* config.h.in. Generated automatically from configure.in by autoheader. */
+
+/* Define if using alloca.c. */
+/* #undef C_ALLOCA */
+
+/* Define to empty if the keyword does not work. */
+/* #undef const */
+
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+ This function is required for alloca.c support on those systems. */
+/* #undef CRAY_STACKSEG_END */
+
+/* Define if you have alloca, as a function or macro. */
+#define HAVE_ALLOCA 1
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
+/* #define HAVE_ALLOCA_H 1 */
+
+/* Define if you don't have vprintf but do have _doprnt. */
+/* #undef HAVE_DOPRNT */
+
+/* Define if you have a working `mmap' system call. */
+/* #undef HAVE_MMAP */
+
+/* Define if system calls automatically restart after interruption
+ by a signal. */
+/* #undef HAVE_RESTARTABLE_SYSCALLS */
+
+/* Define if your struct stat has st_rdev. */
+#define HAVE_ST_RDEV 1
+
+/* Define if you have <sys/wait.h> that is POSIX.1 compatible. */
+/* #define HAVE_SYS_WAIT_H 1 */
+
+/* Define if you don't have tm_zone but do have the external array
+ tzname. */
+#define HAVE_TZNAME 1
+
+/* Define if utime(file, NULL) sets file's timestamp to the present. */
+#define HAVE_UTIME_NULL 1
+
+/* Define if you have the vprintf function. */
+#define HAVE_VPRINTF 1
+
+/* Define as __inline if that's what the C compiler calls it. */
+/* #undef inline */
+
+/* Define to `long' if <sys/types.h> doesn't define. */
+/* #undef off_t */
+
+/* Define as the return type of signal handlers (int or void). */
+#define RETSIGTYPE void
+
+/* Define to `unsigned' if <sys/types.h> doesn't define. */
+/* #undef size_t */
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at run-time.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown
+ */
+#define STACK_DIRECTION -1
+
+/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly. */
+/* #undef STAT_MACROS_BROKEN */
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* Define if your <sys/time.h> declares struct tm. */
+/* #undef TM_IN_SYS_TIME */
+
+/* Define if your processor stores words with the most significant
+ byte first (like Motorola and SPARC, unlike Intel and VAX). */
+/* #undef WORDS_BIGENDIAN */
+
+/* Version of .frm files */
+#define DOT_FRM_VERSION 6
+
+/* READLINE: */
+#define FIONREAD_IN_SYS_IOCTL 1
+
+/* READLINE: Define if your system defines TIOCGWINSZ in sys/ioctl.h. */
+/* #undef GWINSZ_IN_SYS_IOCTL */
+
+/* Do we have FIONREAD */
+#define FIONREAD_IN_SYS_IOCTL 1
+
+/* atomic_add() from <asm/atomic.h> (Linux only) */
+/* #undef HAVE_ATOMIC_ADD */
+
+/* atomic_sub() from <asm/atomic.h> (Linux only) */
+/* #undef HAVE_ATOMIC_SUB */
+
+/* bool is not defined by all C++ compilators */
+#define HAVE_BOOL 1
+
+/* Have berkeley db installed */
+/* #define HAVE_BERKELEY_DB 1 */
+
+/* DSB style signals ? */
+/* #undef HAVE_BSD_SIGNALS */
+
+/* Can netinet be included */
+/* #undef HAVE_BROKEN_NETINET_INCLUDES */
+
+/* READLINE: */
+/* #undef HAVE_BSD_SIGNALS */
+
+/* ZLIB and compress: */
+#define HAVE_COMPRESS 1
+
+/* Define if we are using OSF1 DEC threads */
+/* #undef HAVE_DEC_THREADS */
+
+/* Define if we are using OSF1 DEC threads on 3.2 */
+/* #undef HAVE_DEC_3_2_THREADS */
+
+/* fp_except from ieeefp.h */
+/* #undef HAVE_FP_EXCEPT */
+
+/* READLINE: */
+/* #undef HAVE_GETPW_DECLS */
+
+/* Solaris define gethostbyname_r with 5 arguments. glibc2 defines
+ this with 6 arguments */
+/* #undef HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE */
+
+/* In OSF 4.0f the 3'd argument to gethostname_r is hostent_data * */
+/* #undef HAVE_GETHOSTBYNAME_R_RETURN_INT */
+
+/* Define if int8, int16 and int32 types exist */
+/* #undef HAVE_INT_8_16_32 */
+
+/* Define if have -lwrap */
+/* #undef HAVE_LIBWRAP */
+
+/* Define if we are using Xavier Leroy's LinuxThreads */
+/* #undef HAVE_LINUXTHREADS */
+
+/* Do we use user level threads */
+/* #undef HAVE_mit_thread */
+
+/* For some non posix threads */
+/* #undef HAVE_NONPOSIX_PTHREAD_GETSPECIFIC */
+
+/* For some non posix threads */
+/* #undef HAVE_NONPOSIX_PTHREAD_MUTEX_INIT */
+
+/* READLINE: */
+#define HAVE_POSIX_SIGNALS 0
+
+/* sigwait with one argument */
+/* #undef HAVE_NONPOSIX_SIGWAIT */
+
+/* pthread_attr_setscope */
+#define HAVE_PTHREAD_ATTR_SETSCOPE 1
+
+/* POSIX readdir_r */
+/* #undef HAVE_READDIR_R */
+
+/* POSIX sigwait */
+/* #undef HAVE_SIGWAIT */
+
+/* crypt */
+#define HAVE_CRYPT 1
+
+/* Solaris define gethostbyaddr_r with 7 arguments. glibc2 defines
+ this with 8 arguments */
+/* #undef HAVE_SOLARIS_STYLE_GETHOST */
+
+/* Timespec has a ts_sec instead of tv_sev */
+#define HAVE_TIMESPEC_TS_SEC 1
+
+/* Have the tzname variable */
+#define HAVE_TZNAME 1
+
+/* Define if the system files define uchar */
+/* #undef HAVE_UCHAR */
+
+/* Define if the system files define uint */
+/* #undef HAVE_UINT */
+
+/* Define if the system files define ulong */
+/* #undef HAVE_ULONG */
+
+/* UNIXWARE7 threads are not posix */
+/* #undef HAVE_UNIXWARE7_THREADS */
+
+/* new UNIXWARE7 threads that are not yet posix */
+/* #undef HAVE_UNIXWARE7_POSIX */
+
+/* READLINE: */
+/* #undef HAVE_USG_SIGHOLD */
+
+/* Define if want -lwrap */
+/* #undef LIBWRAP */
+
+/* mysql client protocoll version */
+#define PROTOCOL_VERSION 10
+
+/* Define if qsort returns void */
+#define QSORT_TYPE_IS_VOID 1
+
+/* Define as the return type of qsort (int or void). */
+#define RETQSORTTYPE void
+
+/* Define as the base type of the last arg to accept */
+#define SOCKET_SIZE_TYPE int
+
+/* Last argument to get/setsockopt */
+/* #undef SOCKOPT_OPTLEN_TYPE */
+
+/* #undef SPEED_T_IN_SYS_TYPES */
+/* #undef SPRINTF_RETURNS_PTR */
+#define SPRINTF_RETURNS_INT 1
+/* #undef SPRINTF_RETURNS_GARBAGE */
+
+/* #undef STRUCT_DIRENT_HAS_D_FILENO */
+#define STRUCT_DIRENT_HAS_D_INO 1
+
+/* Define if you want to have threaded code. This may be undef on client code */
+#define THREAD 1
+
+/* Should be client be thread safe */
+/* #undef THREAD_SAFE_CLIENT */
+
+/* READLINE: */
+/* #undef TIOCSTAT_IN_SYS_IOCTL */
+
+/* Use multi-byte character routines */
+/* #undef USE_MB */
+/* #undef USE_MB_IDENT */
+
+/* Use MySQL RAID */
+/* #undef USE_RAID */
+
+/* Use strcoll() functions when comparing and sorting. */
+/* #undef USE_STRCOLL */
+
+/* READLINE: */
+#define VOID_SIGHANDLER 1
+
+/* The number of bytes in a char. */
+#define SIZEOF_CHAR 1
+
+/* The number of bytes in a int. */
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long. */
+#define SIZEOF_LONG 4
+
+/* The number of bytes in a long long. */
+#define SIZEOF_LONG_LONG 8
+
+/* Define if you have the alarm function. */
+#define HAVE_ALARM 1
+
+/* Define if you have the atod function. */
+/* #undef HAVE_ATOD */
+
+/* Define if you have the bcmp function. */
+#define HAVE_BCMP 1
+
+/* Define if you have the bfill function. */
+/* #undef HAVE_BFILL */
+
+/* Define if you have the bmove function. */
+/* #undef HAVE_BMOVE */
+
+/* Define if you have the bzero function. */
+#define HAVE_BZERO 1
+
+/* Define if you have the chsize function. */
+#define HAVE_CHSIZE 1
+
+/* Define if you have the cuserid function. */
+/* #define HAVE_CUSERID 1 */
+
+/* Define if you have the dlerror function. */
+#define HAVE_DLERROR 1
+
+/* Define if you have the dlopen function. */
+#define HAVE_DLOPEN 1
+
+/* Define if you have the fchmod function. */
+/* #undef HAVE_FCHMOD */
+
+/* Define if you have the fcntl function. */
+/* #define HAVE_FCNTL 1 */
+
+/* Define if you have the fconvert function. */
+/* #undef HAVE_FCONVERT */
+
+/* Define if you have the finite function. */
+/* #undef HAVE_FINITE */
+
+/* Define if you have the fpresetsticky function. */
+/* #undef HAVE_FPRESETSTICKY */
+
+/* Define if you have the fpsetmask function. */
+/* #undef HAVE_FPSETMASK */
+
+/* Define if you have the fseeko function. */
+/* #undef HAVE_FSEEKO */
+
+/* Define if you have the ftruncate function. */
+/* #define HAVE_FTRUNCATE 1 */
+
+/* Define if you have the getcwd function. */
+#define HAVE_GETCWD 1
+
+/* Define if you have the gethostbyaddr_r function. */
+/* #undef HAVE_GETHOSTBYADDR_R */
+
+/* Define if you have the gethostbyname_r function. */
+/* #undef HAVE_GETHOSTBYNAME_R */
+
+/* Define if you have the getpagesize function. */
+#define HAVE_GETPAGESIZE 1
+
+/* Define if you have the getpass function. */
+/*#define HAVE_GETPASS 1 */
+
+/* Define if you have the getpassphrase function. */
+/* #undef HAVE_GETPASSPHRASE */
+
+/* Define if you have the getpwnam function. */
+/* #define HAVE_GETPWNAM 1 */
+
+/* Define if you have the getpwuid function. */
+/* #define HAVE_GETPWUID 1 */
+
+/* Define if you have the getrlimit function. */
+/* #undef HAVE_GETRLIMIT */
+
+/* Define if you have the getrusage function. */
+/* #undef HAVE_GETRUSAGE */
+
+/* Define if you have the getwd function. */
+#define HAVE_GETWD 1
+
+/* Define to 1 if you have the `gmtime_r' function. */
+#define HAVE_GMTIME_R 1
+
+/* Define if you have the index function. */
+#define HAVE_INDEX 1
+
+/* Define if you have the initgroups function. */
+/* #undef HAVE_INITGROUPS */
+
+/* Define if you have the localtime_r function. */
+#define HAVE_LOCALTIME_R 1
+
+/* Define if you have the locking function. */
+/* #undef HAVE_LOCKING */
+
+/* Define if you have the longjmp function. */
+#define HAVE_LONGJMP 1
+
+/* Define if you have the lrand48 function. */
+/* #undef HAVE_LRAND48 */
+
+/* Define if you have the lstat function. */
+/* #undef HAVE_LSTAT */
+
+/* Define if you have the madvise function. */
+/* #undef HAVE_MADVISE */
+
+/* Define if you have the memcpy function. */
+#define HAVE_MEMCPY 1
+
+/* Define if you have the memmove function. */
+#define HAVE_MEMMOVE 1
+
+/* Define if you have the mkstemp function. */
+/* #define HAVE_MKSTEMP 1 */
+
+/* Define if you have the mlockall function. */
+/* #undef HAVE_MLOCKALL */
+
+/* Define if you have the perror function. */
+#define HAVE_PERROR 1
+
+/* Define if you have the poll function. */
+/* #undef HAVE_POLL */
+
+/* Define if you have the pread function. */
+/* #undef HAVE_PREAD */
+
+/* Define if you have the pthread_attr_create function. */
+/* #undef HAVE_PTHREAD_ATTR_CREATE */
+
+/* Define if you have the pthread_attr_setprio function. */
+#define HAVE_PTHREAD_ATTR_SETPRIO 1
+
+/* Define if you have the pthread_attr_setschedparam function. */
+/* #undef HAVE_PTHREAD_ATTR_SETSCHEDPARAM */
+
+/* Define if you have the pthread_attr_setstacksize function. */
+#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1
+
+/* Define if you have the pthread_condattr_create function. */
+/* #undef HAVE_PTHREAD_CONDATTR_CREATE */
+
+/* Define if you have the pthread_getsequence_np function. */
+/* #undef HAVE_PTHREAD_GETSEQUENCE_NP */
+
+/* Define if you have the pthread_init function. */
+/* #undef HAVE_PTHREAD_INIT */
+
+/* Define if you have the pthread_rwlock_rdlock function. */
+/* #undef HAVE_PTHREAD_RWLOCK_RDLOCK */
+
+/* Define if you have the pthread_setprio function. */
+#define HAVE_PTHREAD_SETPRIO 1
+
+/* Define if you have the pthread_setprio_np function. */
+/* #undef HAVE_PTHREAD_SETPRIO_NP */
+
+/* Define if you have the pthread_setschedparam function. */
+/* #undef HAVE_PTHREAD_SETSCHEDPARAM */
+
+/* Define if you have the pthread_sigmask function. */
+#define HAVE_PTHREAD_SIGMASK 1
+
+/* Define if you have the putenv function. */
+#define HAVE_PUTENV 1
+
+/* Define if you have the readlink function. */
+/* #undef HAVE_READLINK */
+
+/* Define if you have the realpath function. */
+/* #undef HAVE_REALPATH */
+
+/* Define if you have the rename function. */
+#define HAVE_RENAME 1
+
+/* Define if you have the rint function. */
+#define HAVE_RINT 1
+
+/* Define if you have the rwlock_init function. */
+/* #undef HAVE_RWLOCK_INIT */
+
+/* Define if you have the select function. */
+#define HAVE_SELECT 1
+
+/* Define if you have the setenv function. */
+/* #undef HAVE_SETENV */
+
+/* Define if you have the setlocale function. */
+#define HAVE_SETLOCALE 1
+
+/* Define if you have the setupterm function. */
+/* #undef HAVE_SETUPTERM */
+
+/* Define if you have the sighold function. */
+/* #undef HAVE_SIGHOLD */
+
+/* Define if you have the sigset function. */
+/* #undef HAVE_SIGSET */
+
+/* Define if you have the sigthreadmask function. */
+/* #undef HAVE_SIGTHREADMASK */
+
+/* Define if you have the snprintf function. */
+/* #define HAVE_SNPRINTF 1 */
+
+/* Define if you have the socket function. */
+#define HAVE_SOCKET 1
+
+/* Define if you have the stpcpy function. */
+/* #undef HAVE_STPCPY */
+
+/* Define if you have the strcasecmp function. */
+/* #undef HAVE_STRCASECMP */
+
+/* Define if you have the strcoll function. */
+#define HAVE_STRCOLL 1
+
+/* Define if you have the strerror function. */
+#define HAVE_STRERROR 1
+
+/* Define if you have the strnlen function. */
+/* #undef HAVE_STRNLEN */
+
+/* Define if you have the strpbrk function. */
+#define HAVE_STRPBRK 1
+
+/* Define if you have the strstr function. */
+#define HAVE_STRSTR 1
+
+/* Define if you have the strtok_r function. */
+/* #undef HAVE_STRTOK_R */
+
+/* Define if you have the strtol function. */
+#define HAVE_STRTOL 1
+
+/* Define if you have the strtoul function. */
+#define HAVE_STRTOUL 1
+
+/* Define if you have the strtoull function. */
+/* #undef HAVE_STRTOULL */
+
+/* Define if you have the tcgetattr function. */
+#define HAVE_TCGETATTR 1
+
+/* Define if you have the tell function. */
+#define HAVE_TELL 1
+
+/* Define if you have the tempnam function. */
+#define HAVE_TEMPNAM 1
+
+/* Define if you have the thr_setconcurrency function. */
+/* #undef HAVE_THR_SETCONCURRENCY */
+
+/* Define if you have the vidattr function. */
+/* #undef HAVE_VIDATTR */
+
+/* Define if you have the <alloca.h> header file. */
+/* #define HAVE_ALLOCA_H 1 */
+
+/* Define if you have the <arpa/inet.h> header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define if you have the <asm/termbits.h> header file. */
+/* #undef HAVE_ASM_TERMBITS_H */
+
+/* Define if you have the <crypt.h> header file. */
+#define HAVE_CRYPT_H 1
+
+/* Define if you have the <curses.h> header file. */
+/* #define HAVE_CURSES_H 1 */
+
+/* Define if you have the <dirent.h> header file. */
+/* #define HAVE_DIRENT_H 1 */
+
+/* Define if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define if you have the <float.h> header file. */
+#define HAVE_FLOAT_H 1
+
+/* Define if you have the <floatingpoint.h> header file. */
+/* #undef HAVE_FLOATINGPOINT_H */
+
+/* Define if you have the <grp.h> header file. */
+/* #define HAVE_GRP_H 1 */
+
+/* Define if you have the <ieeefp.h> header file. */
+/* #undef HAVE_IEEEFP_H */
+
+/* Define if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define if you have the <locale.h> header file. */
+#define HAVE_LOCALE_H 1
+
+/* Define if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define if you have the <ndir.h> header file. */
+/* #undef HAVE_NDIR_H */
+
+/* Define if you have the <netinet/in.h> header file. */
+#define HAVE_NETINET_IN_H 1
+
+/* Define if you have the <paths.h> header file. */
+/* #undef HAVE_PATHS_H */
+
+/* Define if you have the <pwd.h> header file. */
+/* #define HAVE_PWD_H 1 */
+
+/* Define if you have the <sched.h> header file. */
+/* #undef HAVE_SCHED_H */
+
+/* Define if you have the <select.h> header file. */
+/* #undef HAVE_SELECT_H */
+
+/* Define if you have the <stdarg.h> header file. */
+#define HAVE_STDARG_H 1
+
+/* Define if you have the <stddef.h> header file. */
+#define HAVE_STDDEF_H 1
+
+/* Define if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define if you have the <strings.h> header file. */
+/* #define HAVE_STRINGS_H 1 */
+
+/* Define if you have the <synch.h> header file. */
+/* #undef HAVE_SYNCH_H */
+
+/* Define if you have the <sys/dir.h> header file. */
+/* #define HAVE_SYS_DIR_H 1 */
+
+/* Define if you have the <sys/file.h> header file. */
+/* #define HAVE_SYS_FILE_H 1 */
+
+/* Define if you have the <sys/ioctl.h> header file. */
+#define HAVE_SYS_IOCTL_H 1
+
+/* Define if you have the <sys/mman.h> header file. */
+/* #undef HAVE_SYS_MMAN_H */
+
+/* Define if you have the <sys/ndir.h> header file. */
+/* #undef HAVE_SYS_NDIR_H */
+
+/* Define if you have the <sys/pte.h> header file. */
+/* #undef HAVE_SYS_PTE_H */
+
+/* Define if you have the <sys/ptem.h> header file. */
+/* #undef HAVE_SYS_PTEM_H */
+
+/* Define if you have the <sys/select.h> header file. */
+#define HAVE_SYS_SELECT_H 1
+
+/* Define if you have the <sys/socket.h> header file. */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define if you have the <sys/stream.h> header file. */
+/* #undef HAVE_SYS_STREAM_H */
+
+/* Define if you have the <sys/timeb.h> header file. */
+#define HAVE_SYS_TIMEB_H 1
+
+/* Define if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define if you have the <sys/un.h> header file. */
+#define HAVE_SYS_UN_H 1
+
+/* Define if you have the <sys/utime.h> header file. */
+#define HAVE_SYS_UTIME_H 1
+
+/* Define if you have the <sys/vadvise.h> header file. */
+/* #undef HAVE_SYS_VADVISE_H */
+
+/* Define if you have the <sys/wait.h> header file. */
+/* #define HAVE_SYS_WAIT_H 1 */
+
+/* Define if you have the <term.h> header file. */
+/* #undef HAVE_TERM_H */
+
+/* Define if you have the <termbits.h> header file. */
+/* #undef HAVE_TERMBITS_H */
+
+/* Define if you have the <termcap.h> header file. */
+/* #define HAVE_TERMCAP_H 1 */
+
+/* Define if you have the <termio.h> header file. */
+/* /#define HAVE_TERMIO_H 1 */
+
+/* Define if you have the <termios.h> header file. */
+/* #define HAVE_TERMIOS_H 1 */
+
+/* Define if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define if you have the <utime.h> header file. */
+#define HAVE_UTIME_H 1
+
+/* Define if you have the <varargs.h> header file. */
+#define HAVE_VARARGS_H 1
+
+/* Define if you have the bind library (-lbind). */
+/* #undef HAVE_LIBBIND */
+
+/* Define if you have the c_r library (-lc_r). */
+/* #undef HAVE_LIBC_R */
+
+/* Define if you have the compat library (-lcompat). */
+/* #undef HAVE_LIBCOMPAT */
+
+/* Define if you have the crypt library (-lcrypt). */
+#define HAVE_LIBCRYPT 1
+
+/* Define if you have the dl library (-ldl). */
+#define HAVE_LIBDL 1
+
+/* Define if you have the gen library (-lgen). */
+/* #undef HAVE_LIBGEN */
+
+/* Define if you have the m library (-lm). */
+#define HAVE_LIBM 1
+
+/* Define if you have the nsl library (-lnsl). */
+/* #undef HAVE_LIBNSL */
+
+/* Define if you have the nsl_r library (-lnsl_r). */
+/* #undef HAVE_LIBNSL_R */
+
+/* Define if you have the pthread library (-lpthread). */
+/* #undef HAVE_LIBPTHREAD */
+
+/* Define if you have the socket library (-lsocket). */
+/* #undef HAVE_LIBSOCKET */
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define to make fseeko etc. visible, on some hosts. */
+/* #undef _LARGEFILE_SOURCE */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+#endif /* __CONFIG_OS2_H__ */
diff --git a/src/terralib/drivers/MySQL/include/config-win.h b/src/terralib/drivers/MySQL/include/config-win.h
new file mode 100644
index 0000000..d28bb25
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/config-win.h
@@ -0,0 +1,396 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/* Defines for Win32 to make it compatible for MySQL */
+
+#ifdef __WIN2000__
+/* We have to do this define before including windows.h to get the AWE API
+functions */
+#define _WIN32_WINNT 0x0500
+#endif
+
+#include <sys/locking.h>
+#include <windows.h>
+#include <math.h> /* Because of rint() */
+#include <fcntl.h>
+#include <io.h>
+#include <malloc.h>
+
+#define HAVE_SMEM 1
+
+#if defined(__NT__)
+#define SYSTEM_TYPE "NT"
+#elif defined(__WIN2000__)
+#define SYSTEM_TYPE "WIN2000"
+#else
+#define SYSTEM_TYPE "Win95/Win98"
+#endif
+
+#if defined(_WIN64) || defined(WIN64)
+#define MACHINE_TYPE "ia64" /* Define to machine type name */
+#else
+#define MACHINE_TYPE "i32" /* Define to machine type name */
+#ifndef _WIN32
+#define _WIN32 /* Compatible with old source */
+#endif
+#ifndef __WIN32__
+#define __WIN32__
+#endif
+#endif /* _WIN64 */
+#ifndef __WIN__
+#define __WIN__ /* To make it easier in VC++ */
+#endif
+
+/* File and lock constants */
+#define O_SHARE 0x1000 /* Open file in sharing mode */
+#ifdef __BORLANDC__
+#define F_RDLCK LK_NBLCK /* read lock */
+#define F_WRLCK LK_NBRLCK /* write lock */
+#define F_UNLCK LK_UNLCK /* remove lock(s) */
+#else
+#define F_RDLCK _LK_NBLCK /* read lock */
+#define F_WRLCK _LK_NBRLCK /* write lock */
+#define F_UNLCK _LK_UNLCK /* remove lock(s) */
+#endif
+
+#define F_EXCLUSIVE 1 /* We have only exclusive locking */
+#define F_TO_EOF (INT_MAX32/2) /* size for lock of all file */
+#define F_OK 0 /* parameter to access() */
+
+#define S_IROTH S_IREAD /* for my_lib */
+
+#ifdef __BORLANDC__
+#define FILE_BINARY O_BINARY /* my_fopen in binary mode */
+#define O_TEMPORARY 0
+#define O_SHORT_LIVED 0
+#define SH_DENYNO _SH_DENYNO
+#else
+#define O_BINARY _O_BINARY /* compability with MSDOS */
+#define FILE_BINARY _O_BINARY /* my_fopen in binary mode */
+#define O_TEMPORARY _O_TEMPORARY
+#define O_SHORT_LIVED _O_SHORT_LIVED
+#define SH_DENYNO _SH_DENYNO
+#endif
+#define NO_OPEN_3 /* For my_create() */
+
+#define SIGQUIT SIGTERM /* No SIGQUIT */
+
+#undef _REENTRANT /* Crashes something for win32 */
+#undef SAFE_MUTEX /* Can't be used on windows */
+
+#define LONGLONG_MIN ((__int64) 0x8000000000000000)
+#define LONGLONG_MAX ((__int64) 0x7FFFFFFFFFFFFFFF)
+#define ULONGLONG_MAX ((unsigned __int64) 0xFFFFFFFFFFFFFFFF)
+#define LL(A) ((__int64) A)
+#define ULL(A) ((unsigned __int64) A)
+
+/* Type information */
+
+typedef unsigned short ushort;
+typedef unsigned int uint;
+typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */
+typedef __int64 longlong;
+typedef int sigset_t;
+#define longlong_defined
+/* off_t should not be __int64 because of conflicts in header files;
+ Use my_off_t or os_off_t instead */
+typedef long off_t;
+typedef __int64 os_off_t;
+#ifdef _WIN64
+typedef UINT_PTR rf_SetTimer;
+#else
+typedef unsigned int size_t;
+typedef uint rf_SetTimer;
+#endif
+
+#define Socket_defined
+#define my_socket SOCKET
+#define bool BOOL
+#define SIGPIPE SIGINT
+#define RETQSORTTYPE void
+#define QSORT_TYPE_IS_VOID
+#define RETSIGTYPE void
+#define SOCKET_SIZE_TYPE int
+#define my_socket_defined
+#define bool_defined
+#define byte_defined
+#define HUGE_PTR
+#define STDCALL __stdcall /* Used by libmysql.dll */
+#define isnan(X) _isnan(X)
+#define finite(X) _finite(X)
+
+#ifndef UNDEF_THREAD_HACK
+#define THREAD
+#endif
+#define VOID_SIGHANDLER
+#define SIZEOF_CHAR 1
+#define SIZEOF_LONG 4
+#define SIZEOF_LONG_LONG 8
+#define SIZEOF_OFF_T 8
+#ifdef _WIN64
+#define SIZEOF_CHARP 8
+#else
+#define SIZEOF_CHARP 4
+#endif
+#define HAVE_BROKEN_NETINET_INCLUDES
+#ifdef __NT__
+#define HAVE_NAMED_PIPE /* We can only create pipes on NT */
+#endif
+
+/* ERROR is defined in wingdi.h */
+#undef ERROR
+
+/* We need to close files to break connections on shutdown */
+#ifndef SIGNAL_WITH_VIO_CLOSE
+#define SIGNAL_WITH_VIO_CLOSE
+#endif
+
+/* Use all character sets in MySQL */
+#define USE_MB 1
+#define USE_MB_IDENT 1
+#define USE_STRCOLL 1
+
+/* All windows servers should support .sym files */
+#undef USE_SYMDIR
+#define USE_SYMDIR
+
+/* If LOAD DATA LOCAL INFILE should be enabled by default */
+#define ENABLED_LOCAL_INFILE 1
+
+/* Convert some simple functions to Posix */
+
+#define sigset(A,B) signal((A),(B))
+#define finite(A) _finite(A)
+#define sleep(A) Sleep((A)*1000)
+
+#ifndef __BORLANDC__
+#define access(A,B) _access(A,B)
+#endif
+
+#if !defined(__cplusplus)
+#define inline __inline
+#endif /* __cplusplus */
+
+inline double rint(double nr)
+{
+ double f = floor(nr);
+ double c = ceil(nr);
+ return (((c-nr) >= (nr-f)) ? f :c);
+}
+
+#ifdef _WIN64
+#define ulonglong2double(A) ((double) (ulonglong) (A))
+#define my_off_t2double(A) ((double) (my_off_t) (A))
+
+#else
+inline double ulonglong2double(ulonglong value)
+{
+ longlong nr=(longlong) value;
+ if (nr >= 0)
+ return (double) nr;
+ return (18446744073709551616.0 + (double) nr);
+}
+#define my_off_t2double(A) ulonglong2double(A)
+#endif /* _WIN64 */
+
+#if SIZEOF_OFF_T > 4
+#define lseek(A,B,C) _lseeki64((A),(longlong) (B),(C))
+#define tell(A) _telli64(A)
+#endif
+
+#define set_timespec(ABSTIME,SEC) { (ABSTIME).tv_sec=time((time_t*)0) + (time_t) (SEC); (ABSTIME).tv_nsec=0; }
+
+#define STACK_DIRECTION -1
+
+/* Optimized store functions for Intel x86 */
+
+#ifndef _WIN64
+#define sint2korr(A) (*((int16 *) (A)))
+#define sint3korr(A) ((int32) ((((uchar) (A)[2]) & 128) ? \
+ (((uint32) 255L << 24) | \
+ (((uint32) (uchar) (A)[2]) << 16) |\
+ (((uint32) (uchar) (A)[1]) << 8) | \
+ ((uint32) (uchar) (A)[0])) : \
+ (((uint32) (uchar) (A)[2]) << 16) |\
+ (((uint32) (uchar) (A)[1]) << 8) | \
+ ((uint32) (uchar) (A)[0])))
+#define sint4korr(A) (*((long *) (A)))
+#define uint2korr(A) (*((uint16 *) (A)))
+/*
+ ATTENTION !
+
+ Please, note, uint3korr reads 4 bytes (not 3) !
+ It means, that you have to provide enough allocated space !
+*/
+#define uint3korr(A) (long) (*((unsigned int *) (A)) & 0xFFFFFF)
+#define uint4korr(A) (*((unsigned long *) (A)))
+#define uint5korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) +\
+ (((uint32) ((uchar) (A)[1])) << 8) +\
+ (((uint32) ((uchar) (A)[2])) << 16) +\
+ (((uint32) ((uchar) (A)[3])) << 24)) +\
+ (((ulonglong) ((uchar) (A)[4])) << 32))
+#define uint8korr(A) (*((ulonglong *) (A)))
+#define sint8korr(A) (*((longlong *) (A)))
+#define int2store(T,A) *((uint16*) (T))= (uint16) (A)
+#define int3store(T,A) { *(T)= (uchar) ((A));\
+ *(T+1)=(uchar) (((uint) (A) >> 8));\
+ *(T+2)=(uchar) (((A) >> 16)); }
+#define int4store(T,A) *((long *) (T))= (long) (A)
+#define int5store(T,A) { *(T)= (uchar)((A));\
+ *((T)+1)=(uchar) (((A) >> 8));\
+ *((T)+2)=(uchar) (((A) >> 16));\
+ *((T)+3)=(uchar) (((A) >> 24)); \
+ *((T)+4)=(uchar) (((A) >> 32)); }
+#define int8store(T,A) *((ulonglong *) (T))= (ulonglong) (A)
+
+#define doubleget(V,M) { *((long *) &V) = *((long*) M); \
+ *(((long *) &V)+1) = *(((long*) M)+1); }
+#define doublestore(T,V) { *((long *) T) = *((long*) &V); \
+ *(((long *) T)+1) = *(((long*) &V)+1); }
+#define float4get(V,M) { *((long *) &(V)) = *((long*) (M)); }
+#define floatstore(T,V) memcpy((byte*)(T), (byte*)(&V), sizeof(float))
+#define float8get(V,M) doubleget((V),(M))
+#define float4store(V,M) memcpy((byte*) V,(byte*) (&M),sizeof(float))
+#define float8store(V,M) doublestore((V),(M))
+#endif /* _WIN64 */
+
+#define HAVE_PERROR
+#define HAVE_VFPRINT
+#define HAVE_RENAME /* Have rename() as function */
+#define HAVE_BINARY_STREAMS /* Have "b" flag in streams */
+#define HAVE_LONG_JMP /* Have long jump function */
+#define HAVE_LOCKING /* have locking() call */
+#define HAVE_ERRNO_AS_DEFINE /* errno is a define */
+#define HAVE_STDLIB /* everything is include in this file */
+#define HAVE_MEMCPY
+#define HAVE_MEMMOVE
+#define HAVE_GETCWD
+#define HAVE_TELL
+#define HAVE_TZNAME
+#define HAVE_PUTENV
+#define HAVE_SELECT
+#define HAVE_SETLOCALE
+#define HAVE_SOCKET /* Giangi */
+#define HAVE_FLOAT_H
+#define HAVE_LIMITS_H
+#define HAVE_STDDEF_H
+#define HAVE_RINT /* defined in this file */
+#define NO_FCNTL_NONBLOCK /* No FCNTL */
+#define HAVE_ALLOCA
+#define HAVE_STRPBRK
+#define HAVE_STRSTR
+#define HAVE_COMPRESS
+#define HAVE_CREATESEMAPHORE
+#define HAVE_ISNAN
+#define HAVE_FINITE
+#define HAVE_QUERY_CACHE
+#define SPRINTF_RETURNS_INT
+#define HAVE_SETFILEPOINTER
+#define HAVE_VIO
+
+#ifdef NOT_USED
+#define HAVE_SNPRINTF /* Gave link error */
+#define _snprintf snprintf
+#endif
+
+#ifdef _MSC_VER
+#define HAVE_LDIV /* The optimizer breaks in zortech for ldiv */
+#define HAVE_ANSI_INCLUDE
+#define HAVE_SYS_UTIME_H
+#define HAVE_STRTOUL
+#endif
+#define my_reinterpret_cast(A) reinterpret_cast <A>
+#define my_const_cast(A) const_cast<A>
+
+
+/* MYSQL OPTIONS */
+
+#ifdef _CUSTOMCONFIG_
+#include <custom_conf.h>
+#else
+#define DEFAULT_MYSQL_HOME "c:\\mysql"
+#define PACKAGE "mysql"
+#define DEFAULT_BASEDIR "C:\\"
+#define SHAREDIR "share"
+#define DEFAULT_CHARSET_HOME "C:/mysql/"
+#endif
+
+/* File name handling */
+
+#define FN_LIBCHAR '\\'
+#define FN_ROOTDIR "\\"
+#define FN_NETWORK_DRIVES /* Uses \\ to indicate network drives */
+#define FN_NO_CASE_SENCE /* Files are not case-sensitive */
+#define OS_FILE_LIMIT 2048
+
+#define DO_NOT_REMOVE_THREAD_WRAPPERS
+#define thread_safe_increment(V,L) InterlockedIncrement((long*) &(V))
+/* The following is only used for statistics, so it should be good enough */
+#ifdef __NT__ /* This should also work on Win98 but .. */
+#define thread_safe_add(V,C,L) InterlockedExchangeAdd((long*) &(V),(C))
+#define thread_safe_sub(V,C,L) InterlockedExchangeAdd((long*) &(V),-(long) (C))
+#define statistic_add(V,C,L) thread_safe_add((V),(C),(L))
+#else
+#define thread_safe_add(V,C,L) \
+ pthread_mutex_lock((L)); (V)+=(C); pthread_mutex_unlock((L));
+#define thread_safe_sub(V,C,L) \
+ pthread_mutex_lock((L)); (V)-=(C); pthread_mutex_unlock((L));
+#define statistic_add(V,C,L) (V)+=(C)
+#endif
+#define statistic_increment(V,L) thread_safe_increment((V),(L))
+
+#define shared_memory_buffer_length 16000
+#define default_shared_memory_base_name "MYSQL"
+#define MYSQL_DEFAULT_CHARSET_NAME "latin1"
+#define MYSQL_DEFAULT_COLLATION_NAME "latin1_swedish_ci"
+
+#define HAVE_SPATIAL 1
+#define HAVE_RTREE_KEYS 1
+
+/* Define charsets you want */
+/* #undef HAVE_CHARSET_armscii8 */
+/* #undef HAVE_CHARSET_ascii */
+#define HAVE_CHARSET_big5 1
+#define HAVE_CHARSET_cp1250 1
+/* #undef HAVE_CHARSET_cp1251 */
+/* #undef HAVE_CHARSET_cp1256 */
+/* #undef HAVE_CHARSET_cp1257 */
+/* #undef HAVE_CHARSET_cp850 */
+/* #undef HAVE_CHARSET_cp852 */
+/* #undef HAVE_CHARSET_cp866 */
+/* #undef HAVE_CHARSET_dec8 */
+#define HAVE_CHARSET_euckr 1
+#define HAVE_CHARSET_gb2312 1
+#define HAVE_CHARSET_gbk 1
+/* #undef HAVE_CHARSET_greek */
+/* #undef HAVE_CHARSET_hebrew */
+/* #undef HAVE_CHARSET_hp8 */
+/* #undef HAVE_CHARSET_keybcs2 */
+/* #undef HAVE_CHARSET_koi8r */
+/* #undef HAVE_CHARSET_koi8u */
+#define HAVE_CHARSET_latin1 1
+#define HAVE_CHARSET_latin2 1
+/* #undef HAVE_CHARSET_latin5 */
+/* #undef HAVE_CHARSET_latin7 */
+/* #undef HAVE_CHARSET_macce */
+/* #undef HAVE_CHARSET_macroman */
+#define HAVE_CHARSET_sjis 1
+/* #undef HAVE_CHARSET_swe7 */
+#define HAVE_CHARSET_tis620 1
+#define HAVE_CHARSET_ucs2 1
+#define HAVE_CHARSET_ujis 1
+#define HAVE_CHARSET_utf8 1
+
diff --git a/src/terralib/drivers/MySQL/include/errmsg.h b/src/terralib/drivers/MySQL/include/errmsg.h
new file mode 100644
index 0000000..6115b24
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/errmsg.h
@@ -0,0 +1,92 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/* Error messages for MySQL clients */
+/* (Error messages for the daemon are in share/language/errmsg.sys) */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+void init_client_errs(void);
+extern const char *client_errors[]; /* Error messages */
+#ifdef __cplusplus
+}
+#endif
+
+#define CR_MIN_ERROR 2000 /* For easier client code */
+#define CR_MAX_ERROR 2999
+#if defined(OS2) && defined(MYSQL_SERVER)
+#define CER(X) client_errors[(X)-CR_MIN_ERROR]
+#elif !defined(ER)
+#define ER(X) client_errors[(X)-CR_MIN_ERROR]
+#endif
+#define CLIENT_ERRMAP 2 /* Errormap used by my_error() */
+
+#define CR_UNKNOWN_ERROR 2000
+#define CR_SOCKET_CREATE_ERROR 2001
+#define CR_CONNECTION_ERROR 2002
+#define CR_CONN_HOST_ERROR 2003
+#define CR_IPSOCK_ERROR 2004
+#define CR_UNKNOWN_HOST 2005
+#define CR_SERVER_GONE_ERROR 2006
+#define CR_VERSION_ERROR 2007
+#define CR_OUT_OF_MEMORY 2008
+#define CR_WRONG_HOST_INFO 2009
+#define CR_LOCALHOST_CONNECTION 2010
+#define CR_TCP_CONNECTION 2011
+#define CR_SERVER_HANDSHAKE_ERR 2012
+#define CR_SERVER_LOST 2013
+#define CR_COMMANDS_OUT_OF_SYNC 2014
+#define CR_NAMEDPIPE_CONNECTION 2015
+#define CR_NAMEDPIPEWAIT_ERROR 2016
+#define CR_NAMEDPIPEOPEN_ERROR 2017
+#define CR_NAMEDPIPESETSTATE_ERROR 2018
+#define CR_CANT_READ_CHARSET 2019
+#define CR_NET_PACKET_TOO_LARGE 2020
+#define CR_EMBEDDED_CONNECTION 2021
+#define CR_PROBE_SLAVE_STATUS 2022
+#define CR_PROBE_SLAVE_HOSTS 2023
+#define CR_PROBE_SLAVE_CONNECT 2024
+#define CR_PROBE_MASTER_CONNECT 2025
+#define CR_SSL_CONNECTION_ERROR 2026
+#define CR_MALFORMED_PACKET 2027
+#define CR_WRONG_LICENSE 2028
+
+/* new 4.1 error codes */
+#define CR_NULL_POINTER 2029
+#define CR_NO_PREPARE_STMT 2030
+#define CR_PARAMS_NOT_BOUND 2031
+#define CR_DATA_TRUNCATED 2032
+#define CR_NO_PARAMETERS_EXISTS 2033
+#define CR_INVALID_PARAMETER_NO 2034
+#define CR_INVALID_BUFFER_USE 2035
+#define CR_UNSUPPORTED_PARAM_TYPE 2036
+
+#define CR_SHARED_MEMORY_CONNECTION 2037
+#define CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR 2038
+#define CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR 2039
+#define CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR 2040
+#define CR_SHARED_MEMORY_CONNECT_MAP_ERROR 2041
+#define CR_SHARED_MEMORY_FILE_MAP_ERROR 2042
+#define CR_SHARED_MEMORY_MAP_ERROR 2043
+#define CR_SHARED_MEMORY_EVENT_ERROR 2044
+#define CR_SHARED_MEMORY_CONNECT_ABANDONED_ERROR 2045
+#define CR_SHARED_MEMORY_CONNECT_SET_ERROR 2046
+#define CR_CONN_UNKNOW_PROTOCOL 2047
+#define CR_INVALID_CONN_HANDLE 2048
+#define CR_SECURE_AUTH 2049
+#define CR_FETCH_CANCELED 2050
+#define CR_NO_DATA 2051
diff --git a/src/terralib/drivers/MySQL/include/libmysql.def b/src/terralib/drivers/MySQL/include/libmysql.def
new file mode 100644
index 0000000..bc91e90
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/libmysql.def
@@ -0,0 +1,147 @@
+LIBRARY LIBMYSQL
+DESCRIPTION 'MySQL 4.1 Client Library'
+VERSION 6.0
+EXPORTS
+ _dig_vec_lower
+ _dig_vec_upper
+ bmove_upp
+ delete_dynamic
+ free_defaults
+ getopt_compare_strings
+ getopt_ull_limit_value
+ handle_options
+ init_dynamic_array
+ insert_dynamic
+ int2str
+ is_prefix
+ list_add
+ list_delete
+ load_defaults
+ my_end
+ my_getopt_print_errors
+ my_init
+ my_malloc
+ my_memdup
+ my_no_flags_free
+ my_path
+ mysql_get_parameters
+ my_print_help
+ my_print_variables
+ my_realloc
+ my_strdup
+ mysql_thread_end
+ mysql_thread_init
+ myodbc_remove_escape
+ mysql_affected_rows
+ mysql_autocommit
+ mysql_stmt_bind_param
+ mysql_stmt_bind_result
+ mysql_change_user
+ mysql_character_set_name
+ mysql_close
+ mysql_commit
+ mysql_data_seek
+ mysql_debug
+ mysql_dump_debug_info
+ mysql_eof
+ mysql_errno
+ mysql_error
+ mysql_escape_string
+ mysql_stmt_execute
+ mysql_stmt_fetch
+ mysql_stmt_fetch_column
+ mysql_fetch_field
+ mysql_fetch_field_direct
+ mysql_fetch_fields
+ mysql_fetch_lengths
+ mysql_fetch_row
+ mysql_field_count
+ mysql_field_seek
+ mysql_field_tell
+ mysql_free_result
+ mysql_get_client_info
+ mysql_get_host_info
+ mysql_get_proto_info
+ mysql_get_server_info
+ mysql_get_client_version
+ mysql_info
+ mysql_init
+ mysql_insert_id
+ mysql_kill
+ mysql_set_server_option
+ mysql_list_dbs
+ mysql_list_fields
+ mysql_list_processes
+ mysql_list_tables
+ mysql_more_results
+ mysql_next_result
+ mysql_num_fields
+ mysql_num_rows
+ mysql_odbc_escape_string
+ mysql_options
+ mysql_stmt_param_count
+ mysql_stmt_param_metadata
+ mysql_ping
+ mysql_stmt_result_metadata
+ mysql_query
+ mysql_read_query_result
+ mysql_real_connect
+ mysql_real_escape_string
+ mysql_real_query
+ mysql_refresh
+ mysql_rollback
+ mysql_row_seek
+ mysql_row_tell
+ mysql_select_db
+ mysql_stmt_send_long_data
+ mysql_send_query
+ mysql_shutdown
+ mysql_ssl_set
+ mysql_stat
+ mysql_stmt_affected_rows
+ mysql_stmt_close
+ mysql_stmt_reset
+ mysql_stmt_data_seek
+ mysql_stmt_errno
+ mysql_stmt_error
+ mysql_stmt_free_result
+ mysql_stmt_num_rows
+ mysql_stmt_row_seek
+ mysql_stmt_row_tell
+ mysql_stmt_store_result
+ mysql_store_result
+ mysql_thread_id
+ mysql_thread_safe
+ mysql_use_result
+ mysql_warning_count
+ mysql_stmt_sqlstate
+ mysql_sqlstate
+ mysql_get_server_version
+ set_dynamic
+ strcend
+ strcont
+ strdup_root
+ strfill
+ strinstr
+ strmake
+ strmov
+ strxmov
+ mysql_stmt_prepare
+ mysql_stmt_init
+ mysql_stmt_insert_id
+ mysql_stmt_attr_get
+ mysql_stmt_attr_set
+ mysql_stmt_field_count
+ client_errors
+ mysql_set_local_infile_default
+ mysql_set_local_infile_handler
+ mysql_disable_reads_from_master
+ mysql_disable_rpl_parse
+ mysql_enable_reads_from_master
+ mysql_enable_rpl_parse
+ mysql_master_query
+ mysql_rpl_parse_enabled
+ mysql_rpl_probe
+ mysql_rpl_query_type
+ mysql_slave_query
+ mysql_embedded
diff --git a/src/terralib/drivers/MySQL/include/libmysqld.def b/src/terralib/drivers/MySQL/include/libmysqld.def
new file mode 100644
index 0000000..14c6725
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/libmysqld.def
@@ -0,0 +1,159 @@
+LIBRARY LIBMYSQLD
+DESCRIPTION 'MySQL 4.1 Embedded Server Library'
+VERSION 4.1
+EXPORTS
+ _dig_vec_upper
+ _dig_vec_lower
+ bmove_upp
+ delete_dynamic
+ free_defaults
+ getopt_compare_strings
+ getopt_ull_limit_value
+ handle_options
+ init_dynamic_array
+ insert_dynamic
+ int2str
+ is_prefix
+ list_add
+ list_delete
+ load_defaults
+ max_allowed_packet
+ my_end
+ my_getopt_print_errors
+ my_init
+ my_malloc
+ my_memdup
+ my_no_flags_free
+ my_path
+ my_print_help
+ my_print_variables
+ my_realloc
+ my_strdup
+ my_thread_end
+ my_thread_init
+ myodbc_remove_escape
+ mysql_affected_rows
+ mysql_autocommit
+ mysql_change_user
+ mysql_character_set_name
+ mysql_close
+ mysql_commit
+ mysql_data_seek
+ mysql_debug
+ mysql_dump_debug_info
+ mysql_eof
+ mysql_errno
+ mysql_error
+ mysql_escape_string
+ mysql_fetch_field
+ mysql_fetch_field_direct
+ mysql_fetch_fields
+ mysql_fetch_lengths
+ mysql_fetch_row
+ mysql_field_count
+ mysql_field_seek
+ mysql_field_tell
+ mysql_free_result
+ mysql_get_client_info
+ mysql_get_host_info
+ mysql_get_proto_info
+ mysql_get_server_info
+ mysql_info
+ mysql_init
+ mysql_insert_id
+ mysql_kill
+ mysql_list_dbs
+ mysql_list_fields
+ mysql_list_processes
+ mysql_list_tables
+ mysql_more_results
+ mysql_next_result
+ mysql_num_fields
+ mysql_num_rows
+ mysql_odbc_escape_string
+ mysql_options
+ mysql_ping
+ mysql_query
+ mysql_read_query_result
+ mysql_real_connect
+ mysql_real_escape_string
+ mysql_real_query
+ mysql_refresh
+ mysql_rollback
+ mysql_row_seek
+ mysql_row_tell
+ mysql_select_db
+ mysql_send_query
+ mysql_shutdown
+ mysql_ssl_set
+ mysql_stat
+ mysql_store_result
+ mysql_sqlstate
+ mysql_thread_id
+ mysql_thread_safe
+ mysql_use_result
+ mysql_warning_count
+ set_dynamic
+ strcend
+ strcont
+ strdup_root
+ strfill
+ strinstr
+ strmake
+ strmov
+ strxmov
+ mysql_server_end
+ mysql_server_init
+ get_tty_password
+ sql_protocol_typelib
+ mysql_get_server_version
+ mysql_sqlstate
+ charsets_dir
+ disabled_my_option
+ my_charset_latin1
+ init_alloc_root
+ my_progname
+ get_charset_by_csname
+ print_defaults
+ find_type
+ strxnmov
+ strend
+ my_fopen
+ my_fclose
+ unpack_filename
+ str2int
+ int10_to_str
+ longlong10_to_str
+ my_snprintf_8bit
+ alloc_root
+ free_root
+ my_read
+ llstr
+ mysql_get_parameters
+ mysql_stmt_bind_param
+ mysql_stmt_bind_result
+ mysql_stmt_execute
+ mysql_stmt_fetch
+ mysql_stmt_fetch_column
+ mysql_stmt_param_count
+ mysql_stmt_param_metadata
+ mysql_stmt_result_metadata
+ mysql_stmt_send_long_data
+ mysql_stmt_affected_rows
+ mysql_stmt_close
+ mysql_stmt_reset
+ mysql_stmt_data_seek
+ mysql_stmt_errno
+ mysql_stmt_error
+ mysql_stmt_free_result
+ mysql_stmt_num_rows
+ mysql_stmt_row_seek
+ mysql_stmt_row_tell
+ mysql_stmt_store_result
+ mysql_stmt_sqlstate
+ mysql_stmt_prepare
+ mysql_stmt_init
+ mysql_stmt_insert_id
+ mysql_stmt_attr_get
+ mysql_stmt_attr_set
+ mysql_stmt_field_count
diff --git a/src/terralib/drivers/MySQL/include/m_ctype.h b/src/terralib/drivers/MySQL/include/m_ctype.h
new file mode 100644
index 0000000..ddc2107
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/m_ctype.h
@@ -0,0 +1,450 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/*
+ A better inplementation of the UNIX ctype(3) library.
+ Notes: my_global.h should be included before ctype.h
+*/
+
+#ifndef _m_ctype_h
+#define _m_ctype_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MY_CS_NAME_SIZE 32
+#define MY_CS_CTYPE_TABLE_SIZE 257
+#define MY_CS_TO_LOWER_TABLE_SIZE 256
+#define MY_CS_TO_UPPER_TABLE_SIZE 256
+#define MY_CS_SORT_ORDER_TABLE_SIZE 256
+#define MY_CS_TO_UNI_TABLE_SIZE 256
+
+#define CHARSET_DIR "charsets/"
+
+#define my_wc_t ulong
+
+typedef struct unicase_info_st
+{
+ uint16 toupper;
+ uint16 tolower;
+ uint16 sort;
+} MY_UNICASE_INFO;
+
+#define MY_CS_ILSEQ 0
+#define MY_CS_ILUNI 0
+#define MY_CS_TOOSMALL -1
+#define MY_CS_TOOFEW(n) (-1-(n))
+
+#define MY_SEQ_INTTAIL 1
+#define MY_SEQ_SPACES 2
+
+ /* My charsets_list flags */
+#define MY_CS_COMPILED 1 /* compiled-in sets */
+#define MY_CS_CONFIG 2 /* sets that have a *.conf file */
+#define MY_CS_INDEX 4 /* sets listed in the Index file */
+#define MY_CS_LOADED 8 /* sets that are currently loaded */
+#define MY_CS_BINSORT 16 /* if binary sort order */
+#define MY_CS_PRIMARY 32 /* if primary collation */
+#define MY_CS_STRNXFRM 64 /* if strnxfrm is used for sort */
+#define MY_CS_UNICODE 128 /* is a charset is full unicode */
+#define MY_CS_READY 256 /* if a charset is initialized */
+#define MY_CS_AVAILABLE 512 /* If either compiled-in or loaded*/
+
+#define MY_CHARSET_UNDEFINED 0
+
+
+typedef struct my_uni_idx_st
+{
+ uint16 from;
+ uint16 to;
+ uchar *tab;
+} MY_UNI_IDX;
+
+typedef struct
+{
+ uint beg;
+ uint end;
+ uint mblen;
+} my_match_t;
+
+enum my_lex_states
+{
+ MY_LEX_START, MY_LEX_CHAR, MY_LEX_IDENT,
+ MY_LEX_IDENT_SEP, MY_LEX_IDENT_START,
+ MY_LEX_REAL, MY_LEX_HEX_NUMBER,
+ MY_LEX_CMP_OP, MY_LEX_LONG_CMP_OP, MY_LEX_STRING, MY_LEX_COMMENT, MY_LEX_END,
+ MY_LEX_OPERATOR_OR_IDENT, MY_LEX_NUMBER_IDENT, MY_LEX_INT_OR_REAL,
+ MY_LEX_REAL_OR_POINT, MY_LEX_BOOL, MY_LEX_EOL, MY_LEX_ESCAPE,
+ MY_LEX_LONG_COMMENT, MY_LEX_END_LONG_COMMENT, MY_LEX_SEMICOLON,
+ MY_LEX_SET_VAR, MY_LEX_USER_END, MY_LEX_HOSTNAME, MY_LEX_SKIP,
+ MY_LEX_USER_VARIABLE_DELIMITER, MY_LEX_SYSTEM_VAR,
+ MY_LEX_IDENT_OR_KEYWORD,
+ MY_LEX_IDENT_OR_HEX, MY_LEX_IDENT_OR_BIN, MY_LEX_IDENT_OR_NCHAR,
+ MY_LEX_STRING_OR_DELIMITER
+};
+
+struct charset_info_st;
+
+typedef struct my_collation_handler_st
+{
+ my_bool (*init)(struct charset_info_st *, void *(*alloc)(uint));
+ /* Collation routines */
+ int (*strnncoll)(struct charset_info_st *,
+ const uchar *, uint, const uchar *, uint, my_bool);
+ int (*strnncollsp)(struct charset_info_st *,
+ const uchar *, uint, const uchar *, uint);
+ int (*strnxfrm)(struct charset_info_st *,
+ uchar *, uint, const uchar *, uint);
+ my_bool (*like_range)(struct charset_info_st *,
+ const char *s, uint s_length,
+ pchar w_prefix, pchar w_one, pchar w_many,
+ uint res_length,
+ char *min_str, char *max_str,
+ uint *min_len, uint *max_len);
+ int (*wildcmp)(struct charset_info_st *,
+ const char *str,const char *str_end,
+ const char *wildstr,const char *wildend,
+ int escape,int w_one, int w_many);
+
+ int (*strcasecmp)(struct charset_info_st *, const char *, const char *);
+
+ uint (*instr)(struct charset_info_st *,
+ const char *b, uint b_length,
+ const char *s, uint s_length,
+ my_match_t *match, uint nmatch);
+
+ /* Hash calculation */
+ void (*hash_sort)(struct charset_info_st *cs, const uchar *key, uint len,
+ ulong *nr1, ulong *nr2);
+} MY_COLLATION_HANDLER;
+
+extern MY_COLLATION_HANDLER my_collation_mb_bin_handler;
+extern MY_COLLATION_HANDLER my_collation_8bit_bin_handler;
+extern MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler;
+extern MY_COLLATION_HANDLER my_collation_ucs2_uca_handler;
+
+
+typedef struct my_charset_handler_st
+{
+ my_bool (*init)(struct charset_info_st *, void *(*alloc)(uint));
+ /* Multibyte routines */
+ int (*ismbchar)(struct charset_info_st *, const char *, const char *);
+ int (*mbcharlen)(struct charset_info_st *, uint);
+ uint (*numchars)(struct charset_info_st *, const char *b, const char *e);
+ uint (*charpos)(struct charset_info_st *, const char *b, const char *e, uint pos);
+ uint (*well_formed_len)(struct charset_info_st *,
+ const char *b,const char *e, uint nchars);
+ uint (*lengthsp)(struct charset_info_st *, const char *ptr, uint length);
+ uint (*numcells)(struct charset_info_st *, const char *b, const char *e);
+
+ /* Unicode convertion */
+ int (*mb_wc)(struct charset_info_st *cs,my_wc_t *wc,
+ const unsigned char *s,const unsigned char *e);
+ int (*wc_mb)(struct charset_info_st *cs,my_wc_t wc,
+ unsigned char *s,unsigned char *e);
+
+ /* Functions for case and sort convertion */
+ void (*caseup_str)(struct charset_info_st *, char *);
+ void (*casedn_str)(struct charset_info_st *, char *);
+ void (*caseup)(struct charset_info_st *, char *, uint);
+ void (*casedn)(struct charset_info_st *, char *, uint);
+
+ /* Charset dependant snprintf() */
+ int (*snprintf)(struct charset_info_st *, char *to, uint n, const char *fmt,
+ ...);
+ int (*long10_to_str)(struct charset_info_st *, char *to, uint n, int radix,
+ long int val);
+ int (*longlong10_to_str)(struct charset_info_st *, char *to, uint n,
+ int radix, longlong val);
+
+ void (*fill)(struct charset_info_st *, char *to, uint len, int fill);
+
+ /* String-to-number convertion routines */
+ long (*strntol)(struct charset_info_st *, const char *s, uint l,
+ int base, char **e, int *err);
+ ulong (*strntoul)(struct charset_info_st *, const char *s, uint l,
+ int base, char **e, int *err);
+ longlong (*strntoll)(struct charset_info_st *, const char *s, uint l,
+ int base, char **e, int *err);
+ ulonglong (*strntoull)(struct charset_info_st *, const char *s, uint l,
+ int base, char **e, int *err);
+ double (*strntod)(struct charset_info_st *, char *s, uint l, char **e,
+ int *err);
+ longlong (*my_strtoll10)(struct charset_info_st *cs,
+ const char *nptr, char **endptr, int *error);
+ ulong (*scan)(struct charset_info_st *, const char *b, const char *e,
+ int sq);
+} MY_CHARSET_HANDLER;
+
+extern MY_CHARSET_HANDLER my_charset_8bit_handler;
+extern MY_CHARSET_HANDLER my_charset_ucs2_handler;
+
+
+typedef struct charset_info_st
+{
+ uint number;
+ uint primary_number;
+ uint binary_number;
+ uint state;
+ const char *csname;
+ const char *name;
+ const char *comment;
+ const char *tailoring;
+ uchar *ctype;
+ uchar *to_lower;
+ uchar *to_upper;
+ uchar *sort_order;
+ uint16 *contractions;
+ uint16 **sort_order_big;
+ uint16 *tab_to_uni;
+ MY_UNI_IDX *tab_from_uni;
+ uchar *state_map;
+ uchar *ident_map;
+ uint strxfrm_multiply;
+ uint mbminlen;
+ uint mbmaxlen;
+ uint16 min_sort_char;
+ uint16 max_sort_char; /* For LIKE optimization */
+
+ MY_CHARSET_HANDLER *cset;
+ MY_COLLATION_HANDLER *coll;
+
+} CHARSET_INFO;
+
+
+extern CHARSET_INFO my_charset_bin;
+extern CHARSET_INFO my_charset_big5_chinese_ci;
+extern CHARSET_INFO my_charset_big5_bin;
+extern CHARSET_INFO my_charset_euckr_korean_ci;
+extern CHARSET_INFO my_charset_euckr_bin;
+extern CHARSET_INFO my_charset_gb2312_chinese_ci;
+extern CHARSET_INFO my_charset_gb2312_bin;
+extern CHARSET_INFO my_charset_gbk_chinese_ci;
+extern CHARSET_INFO my_charset_gbk_bin;
+extern CHARSET_INFO my_charset_latin1;
+extern CHARSET_INFO my_charset_latin1_german2_ci;
+extern CHARSET_INFO my_charset_latin1_bin;
+extern CHARSET_INFO my_charset_latin2_czech_ci;
+extern CHARSET_INFO my_charset_sjis_japanese_ci;
+extern CHARSET_INFO my_charset_sjis_bin;
+extern CHARSET_INFO my_charset_tis620_thai_ci;
+extern CHARSET_INFO my_charset_tis620_bin;
+extern CHARSET_INFO my_charset_ucs2_general_ci;
+extern CHARSET_INFO my_charset_ucs2_bin;
+extern CHARSET_INFO my_charset_ucs2_general_uca;
+extern CHARSET_INFO my_charset_ujis_japanese_ci;
+extern CHARSET_INFO my_charset_ujis_bin;
+extern CHARSET_INFO my_charset_utf8_general_ci;
+extern CHARSET_INFO my_charset_utf8_bin;
+extern CHARSET_INFO my_charset_cp1250_czech_ci;
+
+/* declarations for simple charsets */
+extern int my_strnxfrm_simple(CHARSET_INFO *, uchar *, uint, const uchar *,
+ uint);
+extern int my_strnncoll_simple(CHARSET_INFO *, const uchar *, uint,
+ const uchar *, uint, my_bool);
+
+extern int my_strnncollsp_simple(CHARSET_INFO *, const uchar *, uint,
+ const uchar *, uint);
+
+extern void my_hash_sort_simple(CHARSET_INFO *cs,
+ const uchar *key, uint len,
+ ulong *nr1, ulong *nr2);
+
+extern uint my_lengthsp_8bit(CHARSET_INFO *cs, const char *ptr, uint length);
+
+extern uint my_instr_simple(struct charset_info_st *,
+ const char *b, uint b_length,
+ const char *s, uint s_length,
+ my_match_t *match, uint nmatch);
+
+
+/* Functions for 8bit */
+extern void my_caseup_str_8bit(CHARSET_INFO *, char *);
+extern void my_casedn_str_8bit(CHARSET_INFO *, char *);
+extern void my_caseup_8bit(CHARSET_INFO *, char *, uint);
+extern void my_casedn_8bit(CHARSET_INFO *, char *, uint);
+
+extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *);
+
+int my_mb_wc_8bit(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e);
+int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e);
+
+ulong my_scan_8bit(CHARSET_INFO *cs, const char *b, const char *e, int sq);
+
+int my_snprintf_8bit(struct charset_info_st *, char *to, uint n,
+ const char *fmt, ...);
+
+long my_strntol_8bit(CHARSET_INFO *, const char *s, uint l, int base,
+ char **e, int *err);
+ulong my_strntoul_8bit(CHARSET_INFO *, const char *s, uint l, int base,
+ char **e, int *err);
+longlong my_strntoll_8bit(CHARSET_INFO *, const char *s, uint l, int base,
+ char **e, int *err);
+ulonglong my_strntoull_8bit(CHARSET_INFO *, const char *s, uint l, int base,
+ char **e, int *err);
+double my_strntod_8bit(CHARSET_INFO *, char *s, uint l,char **e,
+ int *err);
+int my_long10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix,
+ long int val);
+int my_longlong10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix,
+ longlong val);
+
+longlong my_strtoll10_8bit(CHARSET_INFO *cs,
+ const char *nptr, char **endptr, int *error);
+longlong my_strtoll10_ucs2(CHARSET_INFO *cs,
+ const char *nptr, char **endptr, int *error);
+
+void my_fill_8bit(CHARSET_INFO *cs, char* to, uint l, int fill);
+
+my_bool my_like_range_simple(CHARSET_INFO *cs,
+ const char *ptr, uint ptr_length,
+ pbool escape, pbool w_one, pbool w_many,
+ uint res_length,
+ char *min_str, char *max_str,
+ uint *min_length, uint *max_length);
+
+my_bool my_like_range_mb(CHARSET_INFO *cs,
+ const char *ptr, uint ptr_length,
+ pbool escape, pbool w_one, pbool w_many,
+ uint res_length,
+ char *min_str, char *max_str,
+ uint *min_length, uint *max_length);
+
+my_bool my_like_range_ucs2(CHARSET_INFO *cs,
+ const char *ptr, uint ptr_length,
+ pbool escape, pbool w_one, pbool w_many,
+ uint res_length,
+ char *min_str, char *max_str,
+ uint *min_length, uint *max_length);
+
+
+int my_wildcmp_8bit(CHARSET_INFO *,
+ const char *str,const char *str_end,
+ const char *wildstr,const char *wildend,
+ int escape, int w_one, int w_many);
+
+uint my_numchars_8bit(CHARSET_INFO *, const char *b, const char *e);
+uint my_numcells_8bit(CHARSET_INFO *, const char *b, const char *e);
+uint my_charpos_8bit(CHARSET_INFO *, const char *b, const char *e, uint pos);
+uint my_well_formed_len_8bit(CHARSET_INFO *, const char *b, const char *e, uint pos);
+int my_mbcharlen_8bit(CHARSET_INFO *, uint c);
+
+
+/* Functions for multibyte charsets */
+extern void my_caseup_str_mb(CHARSET_INFO *, char *);
+extern void my_casedn_str_mb(CHARSET_INFO *, char *);
+extern void my_caseup_mb(CHARSET_INFO *, char *, uint);
+extern void my_casedn_mb(CHARSET_INFO *, char *, uint);
+extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *);
+
+int my_wildcmp_mb(CHARSET_INFO *,
+ const char *str,const char *str_end,
+ const char *wildstr,const char *wildend,
+ int escape, int w_one, int w_many);
+uint my_numchars_mb(CHARSET_INFO *, const char *b, const char *e);
+uint my_numcells_mb(CHARSET_INFO *, const char *b, const char *e);
+uint my_charpos_mb(CHARSET_INFO *, const char *b, const char *e, uint pos);
+uint my_well_formed_len_mb(CHARSET_INFO *, const char *b, const char *e, uint pos);
+uint my_instr_mb(struct charset_info_st *,
+ const char *b, uint b_length,
+ const char *s, uint s_length,
+ my_match_t *match, uint nmatch);
+
+int my_wildcmp_unicode(CHARSET_INFO *cs,
+ const char *str, const char *str_end,
+ const char *wildstr, const char *wildend,
+ int escape, int w_one, int w_many,
+ MY_UNICASE_INFO **weights);
+
+extern my_bool my_parse_charset_xml(const char *bug, uint len,
+ int (*add)(CHARSET_INFO *cs));
+
+#define _MY_U 01 /* Upper case */
+#define _MY_L 02 /* Lower case */
+#define _MY_NMR 04 /* Numeral (digit) */
+#define _MY_SPC 010 /* Spacing character */
+#define _MY_PNT 020 /* Punctuation */
+#define _MY_CTR 040 /* Control character */
+#define _MY_B 0100 /* Blank */
+#define _MY_X 0200 /* heXadecimal digit */
+
+
+#define my_isascii(c) (!((c) & ~0177))
+#define my_toascii(c) ((c) & 0177)
+#define my_tocntrl(c) ((c) & 31)
+#define my_toprint(c) ((c) | 64)
+#define my_toupper(s,c) (char) ((s)->to_upper[(uchar) (c)])
+#define my_tolower(s,c) (char) ((s)->to_lower[(uchar) (c)])
+#define my_isalpha(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L))
+#define my_isupper(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_U)
+#define my_islower(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_L)
+#define my_isdigit(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_NMR)
+#define my_isxdigit(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_X)
+#define my_isalnum(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L | _MY_NMR))
+#define my_isspace(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_SPC)
+#define my_ispunct(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_PNT)
+#define my_isprint(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR | _MY_B))
+#define my_isgraph(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR))
+#define my_iscntrl(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_CTR)
+
+/* Some macros that should be cleaned up a little */
+#define my_isvar(s,c) (my_isalnum(s,c) || (c) == '_')
+#define my_isvar_start(s,c) (my_isalpha(s,c) || (c) == '_')
+
+#define my_binary_compare(s) ((s)->state & MY_CS_BINSORT)
+#define use_strnxfrm(s) ((s)->state & MY_CS_STRNXFRM)
+#define my_strnxfrm(s, a, b, c, d) ((s)->coll->strnxfrm((s), (a), (b), (c), (d)))
+#define my_strnncoll(s, a, b, c, d) ((s)->coll->strnncoll((s), (a), (b), (c), (d), 0))
+#define my_like_range(s, a, b, c, d, e, f, g, h, i, j) \
+ ((s)->coll->like_range((s), (a), (b), (c), (d), (e), (f), (g), (h), (i), (j)))
+#define my_wildcmp(cs,s,se,w,we,e,o,m) ((cs)->coll->wildcmp((cs),(s),(se),(w),(we),(e),(o),(m)))
+#define my_strcasecmp(s, a, b) ((s)->coll->strcasecmp((s), (a), (b)))
+#define my_charpos(cs, b, e, num) (cs)->cset->charpos((cs), (const char*) (b), (const char *)(e), (num))
+
+
+#define use_mb(s) ((s)->cset->ismbchar != NULL)
+#define my_ismbchar(s, a, b) ((s)->cset->ismbchar((s), (a), (b)))
+#ifdef USE_MB
+#define my_mbcharlen(s, a) ((s)->cset->mbcharlen((s),(a)))
+#else
+#define my_mbcharlen(s, a) 1
+#endif
+
+#define my_caseup(s, a, l) ((s)->cset->caseup((s), (a), (l)))
+#define my_casedn(s, a, l) ((s)->cset->casedn((s), (a), (l)))
+#define my_caseup_str(s, a) ((s)->cset->caseup_str((s), (a)))
+#define my_casedn_str(s, a) ((s)->cset->casedn_str((s), (a)))
+#define my_strntol(s, a, b, c, d, e) ((s)->cset->strntol((s),(a),(b),(c),(d),(e)))
+#define my_strntoul(s, a, b, c, d, e) ((s)->cset->strntoul((s),(a),(b),(c),(d),(e)))
+#define my_strntoll(s, a, b, c, d, e) ((s)->cset->strntoll((s),(a),(b),(c),(d),(e)))
+#define my_strntoull(s, a, b, c,d, e) ((s)->cset->strntoull((s),(a),(b),(c),(d),(e)))
+#define my_strntod(s, a, b, c, d) ((s)->cset->strntod((s),(a),(b),(c),(d)))
+
+
+/* XXX: still need to take care of this one */
+#ifdef MY_CHARSET_TIS620
+#error The TIS620 charset is broken at the moment. Tell tim to fix it.
+#define USE_TIS620
+#include "t_ctype.h"
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _m_ctype_h */
diff --git a/src/terralib/drivers/MySQL/include/m_string.h b/src/terralib/drivers/MySQL/include/m_string.h
new file mode 100644
index 0000000..97d3442
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/m_string.h
@@ -0,0 +1,264 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/* There may be prolems include all of theese. Try to test in
+ configure with ones are needed? */
+
+/* This is needed for the definitions of strchr... on solaris */
+
+#ifndef _m_string_h
+#define _m_string_h
+#ifndef __USE_GNU
+#define __USE_GNU /* We want to use stpcpy */
+#endif
+#if defined(HAVE_STRINGS_H)
+#include <strings.h>
+#endif
+#if defined(HAVE_STRING_H)
+#include <string.h>
+#endif
+
+/* need by my_vsnprintf */
+#include <stdarg.h>
+
+/* Correct some things for UNIXWARE7 */
+#ifdef HAVE_UNIXWARE7_THREADS
+#undef HAVE_STRINGS_H
+#undef HAVE_MEMORY_H
+#define HAVE_MEMCPY
+#ifndef HAVE_MEMMOVE
+#define HAVE_MEMMOVE
+#endif
+#undef HAVE_BCMP
+#undef bcopy
+#undef bcmp
+#undef bzero
+#endif /* HAVE_UNIXWARE7_THREADS */
+#ifdef _AIX
+#undef HAVE_BCMP
+#endif
+
+/* This is needed for the definitions of bzero... on solaris */
+#if defined(HAVE_STRINGS_H) && !defined(HAVE_mit_thread)
+#include <strings.h>
+#endif
+
+/* This is needed for the definitions of memcpy... on solaris */
+#if defined(HAVE_MEMORY_H) && !defined(__cplusplus)
+#include <memory.h>
+#endif
+
+#if !defined(HAVE_MEMCPY) && !defined(HAVE_MEMMOVE)
+# define memcpy(d, s, n) bcopy ((s), (d), (n))
+# define memset(A,C,B) bfill((A),(B),(C))
+# define memmove(d, s, n) bmove ((d), (s), (n))
+#elif defined(HAVE_MEMMOVE)
+# define bmove(d, s, n) memmove((d), (s), (n))
+#else
+# define memmove(d, s, n) bmove((d), (s), (n)) /* our bmove */
+#endif
+
+/* Unixware 7 */
+#if !defined(HAVE_BFILL)
+# define bfill(A,B,C) memset((A),(C),(B))
+# define bmove_align(A,B,C) memcpy((A),(B),(C))
+#endif
+
+#if !defined(HAVE_BCMP)
+# define bcopy(s, d, n) memcpy((d), (s), (n))
+# define bcmp(A,B,C) memcmp((A),(B),(C))
+# define bzero(A,B) memset((A),0,(B))
+# define bmove_align(A,B,C) memcpy((A),(B),(C))
+#endif
+
+#if defined(__cplusplus) && !defined(OS2)
+extern "C" {
+#endif
+
+#if defined(HAVE_STPCPY) && !defined(HAVE_mit_thread)
+#define strmov(A,B) stpcpy((A),(B))
+#ifndef stpcpy
+extern char *stpcpy(char *, const char *); /* For AIX with gcc 2.95.3 */
+#endif
+#endif
+
+/* Declared in int2str() */
+extern char NEAR _dig_vec_upper[];
+extern char NEAR _dig_vec_lower[];
+
+#ifdef BAD_STRING_COMPILER
+#define strmov(A,B) (memccpy(A,B,0,INT_MAX)-1)
+#else
+#define strmov_overlapp(A,B) strmov(A,B)
+#define strmake_overlapp(A,B,C) strmake(A,B,C)
+#endif
+
+#ifdef BAD_MEMCPY /* Problem with gcc on Alpha */
+#define memcpy_fixed(A,B,C) bmove((A),(B),(C))
+#else
+#define memcpy_fixed(A,B,C) memcpy((A),(B),(C))
+#endif
+
+#ifdef MSDOS
+#undef bmove_align
+#define bmove512(A,B,C) bmove_align(A,B,C)
+extern void bmove_align(gptr dst,const gptr src,uint len);
+#endif
+
+#if (!defined(USE_BMOVE512) || defined(HAVE_purify)) && !defined(bmove512)
+#define bmove512(A,B,C) memcpy(A,B,C)
+#endif
+
+#ifdef HAVE_purify
+#define memcpy_overlap(A,B,C) \
+DBUG_ASSERT((A) <= (B) || ((B)+(C)) <= (A)); \
+bmove((byte*) (A),(byte*) (B),(size_t) (C));
+#else
+#define memcpy_overlap(A,B,C) memcpy((A), (B), (C))
+#endif /* HAVE_purify */
+
+
+ /* Prototypes for string functions */
+
+#if !defined(bfill) && !defined(HAVE_BFILL)
+extern void bfill(gptr dst,uint len,pchar fill);
+#endif
+
+#if !defined(bzero) && !defined(HAVE_BZERO)
+extern void bzero(gptr dst,uint len);
+#endif
+
+#if !defined(bcmp) && !defined(HAVE_BCMP)
+extern int bcmp(const char *s1,const char *s2,uint len);
+#endif
+#ifdef HAVE_purify
+extern int my_bcmp(const char *s1,const char *s2,uint len);
+#undef bcmp
+#define bcmp(A,B,C) my_bcmp((A),(B),(C))
+#endif
+
+#ifndef bmove512
+extern void bmove512(gptr dst,const gptr src,uint len);
+#endif
+
+#if !defined(HAVE_BMOVE) && !defined(bmove)
+extern void bmove(char *dst, const char *src,uint len);
+#endif
+
+extern void bmove_upp(char *dst,const char *src,uint len);
+extern void bchange(char *dst,uint old_len,const char *src,
+ uint new_len,uint tot_len);
+extern void strappend(char *s,uint len,pchar fill);
+extern char *strend(const char *s);
+extern char *strcend(const char *, pchar);
+extern char *strfield(char *src,int fields,int chars,int blanks,
+ int tabch);
+extern char *strfill(my_string s,uint len,pchar fill);
+extern uint strinstr(const char *str,const char *search);
+extern uint r_strinstr(reg1 my_string str,int from, reg4 my_string search);
+extern char *strkey(char *dst,char *head,char *tail,char *flags);
+extern char *strmake(char *dst,const char *src,uint length);
+#ifndef strmake_overlapp
+extern char *strmake_overlapp(char *dst,const char *src, uint length);
+#endif
+
+#ifndef strmov
+extern char *strmov(char *dst,const char *src);
+#endif
+extern char *strnmov(char *dst,const char *src,uint n);
+extern char *strsuff(const char *src,const char *suffix);
+extern char *strcont(const char *src,const char *set);
+extern char *strxcat _VARARGS((char *dst,const char *src, ...));
+extern char *strxmov _VARARGS((char *dst,const char *src, ...));
+extern char *strxcpy _VARARGS((char *dst,const char *src, ...));
+extern char *strxncat _VARARGS((char *dst,uint len, const char *src, ...));
+extern char *strxnmov _VARARGS((char *dst,uint len, const char *src, ...));
+extern char *strxncpy _VARARGS((char *dst,uint len, const char *src, ...));
+
+/* Prototypes of normal stringfunctions (with may ours) */
+
+#ifdef WANT_STRING_PROTOTYPES
+extern char *strcat(char *, const char *);
+extern char *strchr(const char *, pchar);
+extern char *strrchr(const char *, pchar);
+extern char *strcpy(char *, const char *);
+extern int strcmp(const char *, const char *);
+#ifndef __GNUC__
+extern size_t strlen(const char *);
+#endif
+#endif
+#ifndef HAVE_STRNLEN
+extern uint strnlen(const char *s, uint n);
+#endif
+
+#if !defined(__cplusplus)
+#ifndef HAVE_STRPBRK
+extern char *strpbrk(const char *, const char *);
+#endif
+#ifndef HAVE_STRSTR
+extern char *strstr(const char *, const char *);
+#endif
+#endif
+extern int is_prefix(const char *, const char *);
+
+/* Conversion routines */
+double my_strtod(const char *str, char **end);
+double my_atof(const char *nptr);
+
+extern char *llstr(longlong value,char *buff);
+#ifndef HAVE_STRTOUL
+extern long strtol(const char *str, char **ptr, int base);
+extern ulong strtoul(const char *str, char **ptr, int base);
+#endif
+
+extern char *int2str(long val, char *dst, int radix, int upcase);
+extern char *int10_to_str(long val,char *dst,int radix);
+extern char *str2int(const char *src,int radix,long lower,long upper,
+ long *val);
+longlong my_strtoll10(const char *nptr, char **endptr, int *error);
+#if SIZEOF_LONG == SIZEOF_LONG_LONG
+#define longlong2str(A,B,C) int2str((A),(B),(C),1)
+#define longlong10_to_str(A,B,C) int10_to_str((A),(B),(C))
+#undef strtoll
+#define strtoll(A,B,C) strtol((A),(B),(C))
+#define strtoull(A,B,C) strtoul((A),(B),(C))
+#ifndef HAVE_STRTOULL
+#define HAVE_STRTOULL
+#endif
+#ifndef HAVE_STRTOLL
+#define HAVE_STRTOLL
+#endif
+#else
+#ifdef HAVE_LONG_LONG
+extern char *longlong2str(longlong val,char *dst,int radix);
+extern char *longlong10_to_str(longlong val,char *dst,int radix);
+#if (!defined(HAVE_STRTOULL) || defined(HAVE_mit_thread)) || defined(NO_STRTOLL_PROTO)
+extern longlong strtoll(const char *str, char **ptr, int base);
+extern ulonglong strtoull(const char *str, char **ptr, int base);
+#endif
+#endif
+#endif
+
+/* my_vsnprintf.c */
+
+extern int my_vsnprintf( char *str, size_t n,
+ const char *format, va_list ap );
+extern int my_snprintf(char* to, size_t n, const char* fmt, ...);
+
+#if defined(__cplusplus) && !defined(OS2)
+}
+#endif
+#endif
diff --git a/src/terralib/drivers/MySQL/include/my_alloc.h b/src/terralib/drivers/MySQL/include/my_alloc.h
new file mode 100644
index 0000000..a3dd35d
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_alloc.h
@@ -0,0 +1,52 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/*
+ Data structures for mysys/my_alloc.c (root memory allocator)
+*/
+
+#ifndef _my_alloc_h
+#define _my_alloc_h
+
+#define ALLOC_MAX_BLOCK_TO_DROP 4096
+#define ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP 10
+
+typedef struct st_used_mem
+{ /* struct for once_alloc (block) */
+ struct st_used_mem *next; /* Next block in use */
+ unsigned int left; /* memory left in block */
+ unsigned int size; /* size of block */
+} USED_MEM;
+
+
+typedef struct st_mem_root
+{
+ USED_MEM *free; /* blocks with free memory in it */
+ USED_MEM *used; /* blocks almost without free memory */
+ USED_MEM *pre_alloc; /* preallocated block */
+ /* if block have less memory it will be put in 'used' list */
+ unsigned int min_malloc;
+ unsigned int block_size; /* initial block size */
+ unsigned int block_num; /* allocated blocks counter */
+ /*
+ first free block in queue test counter (if it exceed
+ MAX_BLOCK_USAGE_BEFORE_DROP block will be droped in 'used' list)
+ */
+ unsigned int first_block_usage;
+
+ void (*error_handler)(void);
+} MEM_ROOT;
+#endif
diff --git a/src/terralib/drivers/MySQL/include/my_dbug.h b/src/terralib/drivers/MySQL/include/my_dbug.h
new file mode 100644
index 0000000..9174a8b
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_dbug.h
@@ -0,0 +1,94 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifndef _dbug_h
+#define _dbug_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if !defined(DBUG_OFF) && !defined(_lint)
+extern int _db_on_,_no_db_;
+extern FILE *_db_fp_;
+extern char *_db_process_;
+extern int _db_keyword_(const char *keyword);
+extern void _db_setjmp_(void);
+extern void _db_longjmp_(void);
+extern void _db_push_(const char *control);
+extern void _db_pop_(void);
+extern void _db_enter_(const char *_func_,const char *_file_,uint _line_,
+ const char **_sfunc_,const char **_sfile_,
+ uint *_slevel_, char ***);
+extern void _db_return_(uint _line_,const char **_sfunc_,const char **_sfile_,
+ uint *_slevel_);
+extern void _db_pargs_(uint _line_,const char *keyword);
+extern void _db_doprnt_ _VARARGS((const char *format,...));
+extern void _db_dump_(uint _line_,const char *keyword,const char *memory,
+ uint length);
+extern void _db_lock_file();
+extern void _db_unlock_file();
+
+#define DBUG_ENTER(a) const char *_db_func_, *_db_file_; uint _db_level_; \
+ char **_db_framep_; \
+ _db_enter_ (a,__FILE__,__LINE__,&_db_func_,&_db_file_,&_db_level_, \
+ &_db_framep_)
+#define DBUG_LEAVE \
+ (_db_return_ (__LINE__, &_db_func_, &_db_file_, &_db_level_))
+#define DBUG_RETURN(a1) {DBUG_LEAVE; return(a1);}
+#define DBUG_VOID_RETURN {DBUG_LEAVE; return;}
+#define DBUG_EXECUTE(keyword,a1) \
+ {if (_db_on_) {if (_db_keyword_ (keyword)) { a1 }}}
+#define DBUG_PRINT(keyword,arglist) \
+ {if (_db_on_) {_db_pargs_(__LINE__,keyword); _db_doprnt_ arglist;}}
+#define DBUG_PUSH(a1) _db_push_ (a1)
+#define DBUG_POP() _db_pop_ ()
+#define DBUG_PROCESS(a1) (_db_process_ = a1)
+#define DBUG_FILE (_db_fp_)
+#define DBUG_SETJMP(a1) (_db_setjmp_ (), setjmp (a1))
+#define DBUG_LONGJMP(a1,a2) (_db_longjmp_ (), longjmp (a1, a2))
+#define DBUG_DUMP(keyword,a1,a2)\
+ {if (_db_on_) {_db_dump_(__LINE__,keyword,a1,a2);}}
+#define DBUG_IN_USE (_db_fp_ && _db_fp_ != stderr)
+#define DEBUGGER_OFF _no_db_=1;_db_on_=0;
+#define DEBUGGER_ON _no_db_=0
+#define DBUG_LOCK_FILE { _db_lock_file(); }
+#define DBUG_UNLOCK_FILE { _db_unlock_file(); }
+#define DBUG_ASSERT(A) assert(A)
+#else /* No debugger */
+
+#define DBUG_ENTER(a1)
+#define DBUG_RETURN(a1) return(a1)
+#define DBUG_VOID_RETURN return
+#define DBUG_EXECUTE(keyword,a1) {}
+#define DBUG_PRINT(keyword,arglist) {}
+#define DBUG_PUSH(a1) {}
+#define DBUG_POP() {}
+#define DBUG_PROCESS(a1) {}
+#define DBUG_FILE (stderr)
+#define DBUG_SETJMP setjmp
+#define DBUG_LONGJMP longjmp
+#define DBUG_DUMP(keyword,a1,a2) {}
+#define DBUG_IN_USE 0
+#define DEBUGGER_OFF
+#define DEBUGGER_ON
+#define DBUG_LOCK_FILE
+#define DBUG_UNLOCK_FILE
+#define DBUG_ASSERT(A) {}
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/terralib/drivers/MySQL/include/my_getopt.h b/src/terralib/drivers/MySQL/include/my_getopt.h
new file mode 100644
index 0000000..e6ca113
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_getopt.h
@@ -0,0 +1,77 @@
+/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifndef _my_getopt_h
+#define _my_getopt_h
+
+C_MODE_START
+
+#define GET_NO_ARG 1
+#define GET_BOOL 2
+#define GET_INT 3
+#define GET_UINT 4
+#define GET_LONG 5
+#define GET_ULONG 6
+#define GET_LL 7
+#define GET_ULL 8
+#define GET_STR 9
+#define GET_STR_ALLOC 10
+#define GET_DISABLED 11
+
+#define GET_ASK_ADDR 128
+#define GET_TYPE_MASK 127
+
+enum get_opt_arg_type { NO_ARG, OPT_ARG, REQUIRED_ARG };
+
+struct my_option
+{
+ const char *name; /* Name of the option */
+ int id; /* unique id or short option */
+ const char *comment; /* option comment, for autom. --help */
+ gptr *value; /* The variable value */
+ gptr *u_max_value; /* The user def. max variable value */
+ const char **str_values; /* Pointer to possible values */
+ ulong var_type;
+ enum get_opt_arg_type arg_type;
+ longlong def_value; /* Default value */
+ longlong min_value; /* Min allowed value */
+ longlong max_value; /* Max allowed value */
+ longlong sub_size; /* Subtract this from given value */
+ long block_size; /* Value should be a mult. of this */
+ int app_type; /* To be used by an application */
+};
+
+typedef my_bool (* my_get_one_option) (int, const struct my_option *, char * );
+typedef void (* my_error_reporter) (enum loglevel level, const char *format, ... );
+
+extern char *disabled_my_option;
+extern my_bool my_getopt_print_errors;
+extern my_error_reporter my_getopt_error_reporter;
+
+extern int handle_options (int *argc, char ***argv,
+ const struct my_option *longopts, my_get_one_option);
+extern void my_print_help(const struct my_option *options);
+extern void my_print_variables(const struct my_option *options);
+extern void my_getopt_register_get_addr(gptr* (*func_addr)(const char *, uint,
+ const struct my_option *));
+
+ulonglong getopt_ull_limit_value(ulonglong num, const struct my_option *optp);
+my_bool getopt_compare_strings(const char *s, const char *t, uint length);
+
+C_MODE_END
+
+#endif /* _my_getopt_h */
+
diff --git a/src/terralib/drivers/MySQL/include/my_global.h b/src/terralib/drivers/MySQL/include/my_global.h
new file mode 100644
index 0000000..f620083
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_global.h
@@ -0,0 +1,1191 @@
+/* Copyright (C) 2000-2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/* This is the include file that should be included 'first' in every C file. */
+
+#ifndef _global_h
+#define _global_h
+
+#ifndef EMBEDDED_LIBRARY
+#define HAVE_REPLICATION
+#define HAVE_EXTERNAL_CLIENT
+#endif
+
+#if defined( __EMX__) && !defined( MYSQL_SERVER)
+/* moved here to use below VOID macro redefinition */
+#define INCL_BASE
+#define INCL_NOPMAPI
+#include <os2.h>
+#endif /* __EMX__ */
+
+#ifdef __CYGWIN__
+/* We use a Unix API, so pretend it's not Windows */
+#undef WIN
+#undef WIN32
+#undef _WIN
+#undef _WIN32
+#undef _WIN64
+#undef __WIN__
+#undef __WIN32__
+#define HAVE_ERRNO_AS_DEFINE
+#endif /* __CYGWIN__ */
+
+#if defined(i386) && !defined(__i386__)
+#define __i386__
+#endif
+
+/* Macros to make switching between C and C++ mode easier */
+#ifdef __cplusplus
+#define C_MODE_START extern "C" {
+#define C_MODE_END }
+#else
+#define C_MODE_START
+#define C_MODE_END
+#endif
+
+#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32)
+#include <config-win.h>
+#elif defined(OS2)
+#include <config-os2.h>
+#elif defined(__NETWARE__)
+#include <my_config.h>
+#include <config-netware.h>
+#if defined(__cplusplus) && defined(inline)
+#undef inline /* fix configure problem */
+#endif
+#else
+#include <my_config.h>
+#if defined(__cplusplus) && defined(inline)
+#undef inline /* fix configure problem */
+#endif
+#endif /* _WIN32... */
+
+/* Some defines to avoid ifdefs in the code */
+#ifndef NETWARE_YIELD
+#define NETWARE_YIELD
+#define NETWARE_SET_SCREEN_MODE(A)
+#endif
+
+/*
+ The macros below are borrowed from include/linux/compiler.h in the
+ Linux kernel. Use them to indicate the likelyhood of the truthfulness
+ of a condition. This serves two purposes - newer versions of gcc will be
+ able to optimize for branch predication, which could yield siginficant
+ performance gains in frequently executed sections of the code, and the
+ other reason to use them is for documentation
+*/
+
+#if !defined(__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
+#define __builtin_expect(x, expected_value) (x)
+#endif
+
+#define likely(x) __builtin_expect((x),1)
+#define unlikely(x) __builtin_expect((x),0)
+
+
+/* Fix problem with S_ISLNK() on Linux */
+#if defined(HAVE_LINUXTHREADS)
+#undef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+
+/* The client defines this to avoid all thread code */
+#if defined(UNDEF_THREADS_HACK)
+#undef THREAD
+#undef HAVE_mit_thread
+#undef HAVE_LINUXTHREADS
+#undef HAVE_UNIXWARE7_THREADS
+#endif
+
+#ifdef HAVE_THREADS_WITHOUT_SOCKETS
+/* MIT pthreads does not work with unix sockets */
+#undef HAVE_SYS_UN_H
+#endif
+
+#define __EXTENSIONS__ 1 /* We want some extension */
+#ifndef __STDC_EXT__
+#define __STDC_EXT__ 1 /* To get large file support on hpux */
+#endif
+
+#if defined(THREAD) && !defined(__WIN__) && !defined(OS2)
+#ifndef _POSIX_PTHREAD_SEMANTICS
+#define _POSIX_PTHREAD_SEMANTICS /* We want posix threads */
+#endif
+
+#if !defined(SCO)
+#define _REENTRANT 1 /* Some thread libraries require this */
+#endif
+#if !defined(_THREAD_SAFE) && !defined(_AIX)
+#define _THREAD_SAFE /* Required for OSF1 */
+#endif
+#ifndef HAVE_mit_thread
+#ifdef HAVE_UNIXWARE7_THREADS
+#include <thread.h>
+#else
+#include <pthread.h> /* AIX must have this included first */
+#endif /* HAVE_UNIXWARE7_THREADS */
+#endif /* HAVE_mit_thread */
+#if !defined(SCO) && !defined(_REENTRANT)
+#define _REENTRANT 1 /* Threads requires reentrant code */
+#endif
+#endif /* THREAD */
+
+/* Go around some bugs in different OS and compilers */
+#ifdef _AIX /* By soren at t.dk */
+#define _H_STRINGS
+#define _SYS_STREAM_H
+/* #define _AIX32_CURSES */ /* XXX: this breaks AIX 4.3.3 (others?). */
+#define ulonglong2double(A) my_ulonglong2double(A)
+#define my_off_t2double(A) my_ulonglong2double(A)
+C_MODE_START
+double my_ulonglong2double(unsigned long long A);
+C_MODE_END
+#endif /* _AIX */
+
+#ifdef HAVE_BROKEN_SNPRINTF /* HPUX 10.20 don't have this defined */
+#undef HAVE_SNPRINTF
+#endif
+#ifdef HAVE_BROKEN_PREAD
+/*
+ pread()/pwrite() are not 64 bit safe on HP-UX 11.0 without
+ installing the kernel patch PHKL_20349 or greater
+*/
+#undef HAVE_PREAD
+#undef HAVE_PWRITE
+#endif
+#if defined(HAVE_BROKEN_INLINE) && !defined(__cplusplus)
+#undef inline
+#define inline
+#endif
+
+#ifdef UNDEF_HAVE_GETHOSTBYNAME_R /* For OSF4.x */
+#undef HAVE_GETHOSTBYNAME_R
+#endif
+#ifdef UNDEF_HAVE_INITGROUPS /* For AIX 4.3 */
+#undef HAVE_INITGROUPS
+#endif
+
+/* gcc/egcs issues */
+
+#if defined(__GNUC) && defined(__EXCEPTIONS)
+#error "Please add -fno-exceptions to CXXFLAGS and reconfigure/recompile"
+#endif
+
+
+/* Fix a bug in gcc 2.8.0 on IRIX 6.2 */
+#if SIZEOF_LONG == 4 && defined(__LONG_MAX__)
+#undef __LONG_MAX__ /* Is a longlong value in gcc 2.8.0 ??? */
+#define __LONG_MAX__ 2147483647
+#endif
+
+/* Fix problem when linking c++ programs with gcc 3.x */
+#ifdef DEFINE_CXA_PURE_VIRTUAL
+#define FIX_GCC_LINKING_PROBLEM \
+extern "C" { int __cxa_pure_virtual() {\
+ DBUG_ASSERT("Pure virtual method called." == "Aborted");\
+ return 0;\
+} }
+#else
+#define FIX_GCC_LINKING_PROBLEM
+#endif
+
+/* egcs 1.1.2 has a problem with memcpy on Alpha */
+#if defined(__GNUC__) && defined(__alpha__) && ! (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
+#define BAD_MEMCPY
+#endif
+
+/* In Linux-alpha we have atomic.h if we are using gcc */
+#if defined(HAVE_LINUXTHREADS) && defined(__GNUC__) && defined(__alpha__) && (__GNUC__ > 2 || ( __GNUC__ == 2 && __GNUC_MINOR__ >= 95)) && !defined(HAVE_ATOMIC_ADD)
+#define HAVE_ATOMIC_ADD
+#define HAVE_ATOMIC_SUB
+#endif
+
+/* In Linux-ia64 including atomic.h will give us an error */
+#if (defined(HAVE_LINUXTHREADS) && defined(__GNUC__) && (defined(__ia64__)||defined(__powerpc64__))) || !defined(THREAD)
+#undef HAVE_ATOMIC_ADD
+#undef HAVE_ATOMIC_SUB
+#endif
+
+#if defined(_lint) && !defined(lint)
+#define lint
+#endif
+#if SIZEOF_LONG_LONG > 4 && !defined(_LONG_LONG)
+#define _LONG_LONG 1 /* For AIX string library */
+#endif
+
+#ifndef stdin
+#include <stdio.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+
+#include <math.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#ifdef HAVE_FLOAT_H
+#include <float.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#ifdef HAVE_SYS_TIMEB_H
+#include <sys/timeb.h> /* Avoid warnings on SCO */
+#endif
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif /* TIME_WITH_SYS_TIME */
+#ifdef HAVE_UNISTD_H
+#if defined(HAVE_OPENSSL) && !defined(__FreeBSD__) && !defined(NeXT) && !defined(__OpenBSD__)
+#define crypt unistd_crypt
+#endif
+#include <unistd.h>
+#ifdef HAVE_OPENSSL
+#undef crypt
+#endif
+#endif
+#if defined(__cplusplus) && defined(NO_CPLUSPLUS_ALLOCA)
+#undef HAVE_ALLOCA
+#undef HAVE_ALLOCA_H
+#endif
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
+#ifdef HAVE_ATOMIC_ADD
+#define __SMP__
+#ifdef HAVE_LINUX_CONFIG_H
+#include <linux/config.h> /* May define CONFIG_SMP */
+#endif
+#ifndef CONFIG_SMP
+#define CONFIG_SMP
+#endif
+C_MODE_START
+#include <asm/atomic.h>
+C_MODE_END
+#endif
+#include <errno.h> /* Recommended by debian */
+/* We need the following to go around a problem with openssl on solaris */
+#if defined(HAVE_CRYPT_H)
+#include <crypt.h>
+#endif
+
+/*
+ A lot of our programs uses asserts, so better to always include it
+ This also fixes a problem when people uses DBUG_ASSERT without including
+ assert.h
+*/
+#include <assert.h>
+
+/* Go around some bugs in different OS and compilers */
+#if defined(_HPUX_SOURCE) && defined(HAVE_SYS_STREAM_H)
+#include <sys/stream.h> /* HPUX 10.20 defines ulong here. UGLY !!! */
+#define HAVE_ULONG
+#endif
+#ifdef DONT_USE_FINITE /* HPUX 11.x has is_finite() */
+#undef HAVE_FINITE
+#endif
+#if defined(HPUX10) && defined(_LARGEFILE64_SOURCE) && defined(THREAD)
+/* Fix bug in setrlimit */
+#undef setrlimit
+#define setrlimit cma_setrlimit64
+#endif
+
+#ifdef __QNXNTO__
+/* This has to be after include limits.h */
+#define HAVE_ERRNO_AS_DEFINE
+#define HAVE_FCNTL_LOCK
+#undef HAVE_FINITE
+#undef LONGLONG_MIN /* These get wrongly defined in QNX 6.2 */
+#undef LONGLONG_MAX /* standard system library 'limits.h' */
+#endif
+
+/* We can not live without the following defines */
+
+#define USE_MYFUNC 1 /* Must use syscall indirection */
+#define MASTER 1 /* Compile without unireg */
+#define ENGLISH 1 /* Messages in English */
+#define POSIX_MISTAKE 1 /* regexp: Fix stupid spec error */
+#define USE_REGEX 1 /* We want the use the regex library */
+/* Do not define for ultra sparcs */
+#ifndef OS2
+#define USE_BMOVE512 1 /* Use this unless system bmove is faster */
+#endif
+
+#define QUOTE_ARG(x) #x /* Quote argument (before cpp) */
+#define STRINGIFY_ARG(x) QUOTE_ARG(x) /* Quote argument, after cpp */
+
+/* Paranoid settings. Define I_AM_PARANOID if you are paranoid */
+#ifdef I_AM_PARANOID
+#define DONT_ALLOW_USER_CHANGE 1
+#define DONT_USE_MYSQL_PWD 1
+#endif
+
+/* Does the system remember a signal handler after a signal ? */
+#ifndef HAVE_BSD_SIGNALS
+#define DONT_REMEMBER_SIGNAL
+#endif
+
+/* Define void to stop lint from generating "null effekt" comments */
+#ifndef DONT_DEFINE_VOID
+#ifdef _lint
+int __void__;
+#define VOID(X) (__void__ = (int) (X))
+#else
+#undef VOID
+#define VOID(X) (X)
+#endif
+#endif /* DONT_DEFINE_VOID */
+
+#if defined(_lint) || defined(FORCE_INIT_OF_VARS)
+#define LINT_INIT(var) var=0 /* No uninitialize-warning */
+#else
+#define LINT_INIT(var)
+#endif
+
+/* Define some useful general macros */
+#if defined(__cplusplus) && defined(__GNUC__)
+#define max(a, b) ((a) >? (b))
+#define min(a, b) ((a) <? (b))
+#elif !defined(max)
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+#if defined(__EMX__) || !defined(HAVE_UINT)
+typedef unsigned int uint;
+typedef unsigned short ushort;
+#endif
+
+#define CMP_NUM(a,b) (((a) < (b)) ? -1 : ((a) == (b)) ? 0 : 1)
+#define sgn(a) (((a) < 0) ? -1 : ((a) > 0) ? 1 : 0)
+#define swap_variables(t, a, b) { register t dummy; dummy= a; a= b; b= dummy; }
+#define test(a) ((a) ? 1 : 0)
+#define set_if_bigger(a,b) do { if ((a) < (b)) (a)=(b); } while(0)
+#define set_if_smaller(a,b) do { if ((a) > (b)) (a)=(b); } while(0)
+#define test_all_bits(a,b) (((a) & (b)) == (b))
+#define set_bits(type, bit_count) (sizeof(type)*8 <= (bit_count) ? ~(type) 0 : ((((type) 1) << (bit_count)) - (type) 1))
+#define array_elements(A) ((uint) (sizeof(A)/sizeof(A[0])))
+#ifndef HAVE_RINT
+#define rint(A) floor((A)+(((A) < 0)? -0.5 : 0.5))
+#endif
+
+/* Define some general constants */
+#ifndef TRUE
+#define TRUE (1) /* Logical true */
+#define FALSE (0) /* Logical false */
+#endif
+
+#if defined(__GNUC__)
+#define function_volatile volatile
+#define my_reinterpret_cast(A) reinterpret_cast<A>
+#define my_const_cast(A) const_cast<A>
+#elif !defined(my_reinterpret_cast)
+#define my_reinterpret_cast(A) (A)
+#define my_const_cast(A) (A)
+#endif
+#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
+#define __attribute__(A)
+#endif
+
+/* From old s-system.h */
+
+/*
+ Support macros for non ansi & other old compilers. Since such
+ things are no longer supported we do nothing. We keep then since
+ some of our code may still be needed to upgrade old customers.
+*/
+#define _VARARGS(X) X
+#define _STATIC_VARARGS(X) X
+#define _PC(X) X
+
+#if defined(DBUG_ON) && defined(DBUG_OFF)
+#undef DBUG_OFF
+#endif
+
+#if defined(_lint) && !defined(DBUG_OFF)
+#define DBUG_OFF
+#endif
+
+#include <my_dbug.h>
+
+#define MIN_ARRAY_SIZE 0 /* Zero or One. Gcc allows zero*/
+#define ASCII_BITS_USED 8 /* Bit char used */
+#define NEAR_F /* No near function handling */
+
+/* Some types that is different between systems */
+
+typedef int File; /* File descriptor */
+#ifndef Socket_defined
+typedef int my_socket; /* File descriptor for sockets */
+#define INVALID_SOCKET -1
+#endif
+/* Type for fuctions that handles signals */
+#define sig_handler RETSIGTYPE
+C_MODE_START
+typedef void (*sig_return)();/* Returns type from signal */
+C_MODE_END
+#if defined(__GNUC__) && !defined(_lint)
+typedef char pchar; /* Mixed prototypes can take char */
+typedef char puchar; /* Mixed prototypes can take char */
+typedef char pbool; /* Mixed prototypes can take char */
+typedef short pshort; /* Mixed prototypes can take short int */
+typedef float pfloat; /* Mixed prototypes can take float */
+#else
+typedef int pchar; /* Mixed prototypes can't take char */
+typedef uint puchar; /* Mixed prototypes can't take char */
+typedef int pbool; /* Mixed prototypes can't take char */
+typedef int pshort; /* Mixed prototypes can't take short int */
+typedef double pfloat; /* Mixed prototypes can't take float */
+#endif
+C_MODE_START
+typedef int (*qsort_cmp)(const void *,const void *);
+typedef int (*qsort_cmp2)(void*, const void *,const void *);
+C_MODE_END
+#ifdef HAVE_mit_thread
+#define qsort_t void
+#undef QSORT_TYPE_IS_VOID
+#define QSORT_TYPE_IS_VOID
+#else
+#define qsort_t RETQSORTTYPE /* Broken GCC cant handle typedef !!!! */
+#endif
+#ifdef HAVE_mit_thread
+#define size_socket socklen_t /* Type of last arg to accept */
+#else
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+typedef SOCKET_SIZE_TYPE size_socket;
+#endif
+
+#ifndef SOCKOPT_OPTLEN_TYPE
+#define SOCKOPT_OPTLEN_TYPE size_socket
+#endif
+
+/* file create flags */
+
+#ifndef O_SHARE /* Probably not windows */
+#define O_SHARE 0 /* Flag to my_open for shared files */
+#ifndef O_BINARY
+#define O_BINARY 0 /* Flag to my_open for binary files */
+#endif
+#ifndef FILE_BINARY
+#define FILE_BINARY O_BINARY /* Flag to my_fopen for binary streams */
+#endif
+#ifdef HAVE_FCNTL
+#define HAVE_FCNTL_LOCK
+#define F_TO_EOF 0L /* Param to lockf() to lock rest of file */
+#endif
+#endif /* O_SHARE */
+
+#ifndef O_TEMPORARY
+#define O_TEMPORARY 0
+#endif
+#ifndef O_SHORT_LIVED
+#define O_SHORT_LIVED 0
+#endif
+
+/* #define USE_RECORD_LOCK */
+
+ /* Unsigned types supported by the compiler */
+#define UNSINT8 /* unsigned int8 (char) */
+#define UNSINT16 /* unsigned int16 */
+#define UNSINT32 /* unsigned int32 */
+
+ /* General constants */
+#define SC_MAXWIDTH 256 /* Max width of screen (for error messages) */
+#define FN_LEN 256 /* Max file name len */
+#define FN_HEADLEN 253 /* Max length of filepart of file name */
+#define FN_EXTLEN 20 /* Max length of extension (part of FN_LEN) */
+#define FN_REFLEN 512 /* Max length of full path-name */
+#define FN_EXTCHAR '.'
+#define FN_HOMELIB '~' /* ~/ is used as abbrev for home dir */
+#define FN_CURLIB '.' /* ./ is used as abbrev for current dir */
+#define FN_PARENTDIR ".." /* Parent directory; Must be a string */
+#define FN_DEVCHAR ':'
+
+#ifndef FN_LIBCHAR
+#ifdef __EMX__
+#define FN_LIBCHAR '\\'
+#define FN_ROOTDIR "\\"
+#else
+#define FN_LIBCHAR '/'
+#define FN_ROOTDIR "/"
+#endif
+#endif
+#define MY_NFILE 64 /* This is only used to save filenames */
+#ifndef OS_FILE_LIMIT
+#define OS_FILE_LIMIT 65535
+#endif
+
+/* #define EXT_IN_LIBNAME */
+/* #define FN_NO_CASE_SENCE */
+/* #define FN_UPPER_CASE TRUE */
+
+/*
+ Io buffer size; Must be a power of 2 and a multiple of 512. May be
+ smaller what the disk page size. This influences the speed of the
+ isam btree library. eg to big to slow.
+*/
+#define IO_SIZE 4096
+/*
+ How much overhead does malloc have. The code often allocates
+ something like 1024-MALLOC_OVERHEAD bytes
+*/
+#ifdef SAFEMALLOC
+#define MALLOC_OVERHEAD (8+24+4)
+#else
+#define MALLOC_OVERHEAD 8
+#endif
+ /* get memory in huncs */
+#define ONCE_ALLOC_INIT (uint) (4096-MALLOC_OVERHEAD)
+ /* Typical record cash */
+#define RECORD_CACHE_SIZE (uint) (64*1024-MALLOC_OVERHEAD)
+ /* Typical key cash */
+#define KEY_CACHE_SIZE (uint) (8*1024*1024-MALLOC_OVERHEAD)
+ /* Default size of a key cache block */
+#define KEY_CACHE_BLOCK_SIZE (uint) 1024
+
+
+ /* Some things that this system doesn't have */
+
+#define NO_HASH /* Not needed anymore */
+#ifdef __WIN__
+#define NO_DIR_LIBRARY /* Not standar dir-library */
+#define USE_MY_STAT_STRUCT /* For my_lib */
+#endif
+
+/* Some defines of functions for portability */
+
+#undef remove /* Crashes MySQL on SCO 5.0.0 */
+#ifndef __WIN__
+#ifdef OS2
+#define closesocket(A) soclose(A)
+#else
+#define closesocket(A) close(A)
+#endif
+#ifndef ulonglong2double
+#define ulonglong2double(A) ((double) (ulonglong) (A))
+#define my_off_t2double(A) ((double) (my_off_t) (A))
+#endif
+#endif
+
+#ifndef offsetof
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+#endif
+#define ulong_to_double(X) ((double) (ulong) (X))
+#define SET_STACK_SIZE(X) /* Not needed on real machines */
+
+#if !defined(HAVE_mit_thread) && !defined(HAVE_STRTOK_R)
+#define strtok_r(A,B,C) strtok((A),(B))
+#endif
+
+/* Remove some things that mit_thread break or doesn't support */
+#if defined(HAVE_mit_thread) && defined(THREAD)
+#undef HAVE_PREAD
+#undef HAVE_REALPATH
+#undef HAVE_MLOCK
+#undef HAVE_TEMPNAM /* Use ours */
+#undef HAVE_PTHREAD_SETPRIO
+#undef HAVE_FTRUNCATE
+#undef HAVE_READLINK
+#endif
+
+/* This is from the old m-machine.h file */
+
+#if SIZEOF_LONG_LONG > 4
+#define HAVE_LONG_LONG 1
+#endif
+
+/*
+ Some pre-ANSI-C99 systems like AIX 5.1 and Linux/GCC 2.95 define
+ ULONGLONG_MAX, LONGLONG_MIN, LONGLONG_MAX; we use them if they're defined.
+ Also on Windows we define these constants by hand in config-win.h.
+*/
+
+#if defined(HAVE_LONG_LONG) && !defined(LONGLONG_MIN)
+#define LONGLONG_MIN ((long long) 0x8000000000000000LL)
+#define LONGLONG_MAX ((long long) 0x7FFFFFFFFFFFFFFFLL)
+#endif
+
+#if defined(HAVE_LONG_LONG) && !defined(ULONGLONG_MAX)
+/* First check for ANSI C99 definition: */
+#ifdef ULLONG_MAX
+#define ULONGLONG_MAX ULLONG_MAX
+#else
+#define ULONGLONG_MAX ((unsigned long long)(~0ULL))
+#endif
+#endif /* defined (HAVE_LONG_LONG) && !defined(ULONGLONG_MAX)*/
+
+#define INT_MIN32 (~0x7FFFFFFFL)
+#define INT_MAX32 0x7FFFFFFFL
+#define UINT_MAX32 0xFFFFFFFFL
+#define INT_MIN24 (~0x007FFFFF)
+#define INT_MAX24 0x007FFFFF
+#define UINT_MAX24 0x00FFFFFF
+#define INT_MIN16 (~0x7FFF)
+#define INT_MAX16 0x7FFF
+#define UINT_MAX16 0xFFFF
+#define INT_MIN8 (~0x7F)
+#define INT_MAX8 0x7F
+
+/* From limits.h instead */
+#ifndef DBL_MIN
+#define DBL_MIN 4.94065645841246544e-324
+#define FLT_MIN ((float)1.40129846432481707e-45)
+#endif
+#ifndef DBL_MAX
+#define DBL_MAX 1.79769313486231470e+308
+#define FLT_MAX ((float)3.40282346638528860e+38)
+#endif
+
+#if !defined(HAVE_ISINF) && !defined(isinf)
+#define isinf(X) 0
+#endif
+
+/*
+ Max size that must be added to a so that we know Size to make
+ adressable obj.
+*/
+#if SIZEOF_CHARP == 4
+typedef long my_ptrdiff_t;
+#else
+typedef long long my_ptrdiff_t;
+#endif
+
+#define MY_ALIGN(A,L) (((A) + (L) - 1) & ~((L) - 1))
+#define ALIGN_SIZE(A) MY_ALIGN((A),sizeof(double))
+/* Size to make adressable obj. */
+#define ALIGN_PTR(A, t) ((t*) MY_ALIGN((A),sizeof(t)))
+ /* Offset of field f in structure t */
+#define OFFSET(t, f) ((size_t)(char *)&((t *)0)->f)
+#define ADD_TO_PTR(ptr,size,type) (type) ((byte*) (ptr)+size)
+#define PTR_BYTE_DIFF(A,B) (my_ptrdiff_t) ((byte*) (A) - (byte*) (B))
+
+#define NullS (char *) 0
+/* Nowdays we do not support MessyDos */
+#ifndef NEAR
+#define NEAR /* Who needs segments ? */
+#define FAR /* On a good machine */
+#ifndef HUGE_PTR
+#define HUGE_PTR
+#endif
+#endif
+#if defined(__IBMC__) || defined(__IBMCPP__)
+/* This was _System _Export but caused a lot of warnings on _AIX43 */
+#define STDCALL
+#elif !defined( STDCALL)
+#define STDCALL
+#endif
+
+/* Typdefs for easyier portability */
+
+#if defined(VOIDTYPE)
+typedef void *gptr; /* Generic pointer */
+#else
+typedef char *gptr; /* Generic pointer */
+#endif
+#ifndef HAVE_INT_8_16_32
+typedef signed char int8; /* Signed integer >= 8 bits */
+typedef short int16; /* Signed integer >= 16 bits */
+#endif
+#ifndef HAVE_UCHAR
+typedef unsigned char uchar; /* Short for unsigned char */
+#endif
+typedef unsigned char uint8; /* Short for unsigned integer >= 8 bits */
+typedef unsigned short uint16; /* Short for unsigned integer >= 16 bits */
+
+#if SIZEOF_INT == 4
+#ifndef HAVE_INT_8_16_32
+typedef int int32;
+#endif
+typedef unsigned int uint32; /* Short for unsigned integer >= 32 bits */
+#elif SIZEOF_LONG == 4
+#ifndef HAVE_INT_8_16_32
+typedef long int32;
+#endif
+typedef unsigned long uint32; /* Short for unsigned integer >= 32 bits */
+#else
+error "Neither int or long is of 4 bytes width"
+#endif
+
+#if !defined(HAVE_ULONG) && !defined(HAVE_LINUXTHREADS) && !defined(__USE_MISC)
+typedef unsigned long ulong; /* Short for unsigned long */
+#endif
+#ifndef longlong_defined
+#if defined(HAVE_LONG_LONG) && SIZEOF_LONG != 8
+typedef unsigned long long int ulonglong; /* ulong or unsigned long long */
+typedef long long int longlong;
+#else
+typedef unsigned long ulonglong; /* ulong or unsigned long long */
+typedef long longlong;
+#endif
+#endif
+
+#if defined(NO_CLIENT_LONG_LONG)
+typedef unsigned long my_ulonglong;
+#elif defined (__WIN__)
+typedef unsigned __int64 my_ulonglong;
+#else
+typedef unsigned long long my_ulonglong;
+#endif
+
+#ifdef USE_RAID
+/*
+ The following is done with a if to not get problems with pre-processors
+ with late define evaluation
+*/
+#if SIZEOF_OFF_T == 4
+#define SYSTEM_SIZEOF_OFF_T 4
+#else
+#define SYSTEM_SIZEOF_OFF_T 8
+#endif
+#undef SIZEOF_OFF_T
+#define SIZEOF_OFF_T 8
+#else
+#define SYSTEM_SIZEOF_OFF_T SIZEOF_OFF_T
+#endif /* USE_RAID */
+
+#if SIZEOF_OFF_T > 4
+typedef ulonglong my_off_t;
+#else
+typedef unsigned long my_off_t;
+#endif
+#define MY_FILEPOS_ERROR (~(my_off_t) 0)
+#if !defined(__WIN__) && !defined(OS2)
+typedef off_t os_off_t;
+#endif
+
+#if defined(__WIN__)
+#define socket_errno WSAGetLastError()
+#define SOCKET_EINTR WSAEINTR
+#define SOCKET_EAGAIN WSAEINPROGRESS
+#define SOCKET_EWOULDBLOCK WSAEINPROGRESS
+#define SOCKET_ENFILE ENFILE
+#define SOCKET_EMFILE EMFILE
+#elif defined(OS2)
+#define socket_errno sock_errno()
+#define SOCKET_EINTR SOCEINTR
+#define SOCKET_EAGAIN SOCEINPROGRESS
+#define SOCKET_EWOULDBLOCK SOCEWOULDBLOCK
+#define SOCKET_ENFILE SOCENFILE
+#define SOCKET_EMFILE SOCEMFILE
+#define closesocket(A) soclose(A)
+#else /* Unix */
+#define socket_errno errno
+#define closesocket(A) close(A)
+#define SOCKET_EINTR EINTR
+#define SOCKET_EAGAIN EAGAIN
+#define SOCKET_EWOULDBLOCK EWOULDBLOCK
+#define SOCKET_ENFILE ENFILE
+#define SOCKET_EMFILE EMFILE
+#endif
+
+typedef uint8 int7; /* Most effective integer 0 <= x <= 127 */
+typedef short int15; /* Most effective integer 0 <= x <= 32767 */
+typedef char *my_string; /* String of characters */
+typedef unsigned long size_s; /* Size of strings (In string-funcs) */
+typedef int myf; /* Type of MyFlags in my_funcs */
+#ifndef byte_defined
+typedef char byte; /* Smallest addressable unit */
+#endif
+typedef char my_bool; /* Small bool */
+#if !defined(bool) && !defined(bool_defined) && (!defined(HAVE_BOOL) || !defined(__cplusplus))
+typedef char bool; /* Ordinary boolean values 0 1 */
+#endif
+ /* Macros for converting *constants* to the right type */
+#define INT8(v) (int8) (v)
+#define INT16(v) (int16) (v)
+#define INT32(v) (int32) (v)
+#define MYF(v) (myf) (v)
+
+#ifndef LL
+#ifdef HAVE_LONG_LONG
+#define LL(A) A ## LL
+#else
+#define LL(A) A ## L
+#endif
+#endif
+
+#ifndef ULL
+#ifdef HAVE_LONG_LONG
+#define ULL(A) A ## ULL
+#else
+#define ULL(A) A ## UL
+#endif
+#endif
+
+/*
+ Defines to make it possible to prioritize register assignments. No
+ longer that important with modern compilers.
+*/
+#ifndef USING_X
+#define reg1 register
+#define reg2 register
+#define reg3 register
+#define reg4 register
+#define reg5 register
+#define reg6 register
+#define reg7 register
+#define reg8 register
+#define reg9 register
+#define reg10 register
+#define reg11 register
+#define reg12 register
+#define reg13 register
+#define reg14 register
+#define reg15 register
+#define reg16 register
+#endif
+
+/*
+ Sometimes we want to make sure that the variable is not put into
+ a register in debugging mode so we can see its value in the core
+*/
+
+#ifndef DBUG_OFF
+#define dbug_volatile volatile
+#else
+#define dbug_volatile
+#endif
+
+/* Defines for time function */
+#define SCALE_SEC 100
+#define SCALE_USEC 10000
+#define MY_HOW_OFTEN_TO_ALARM 2 /* How often we want info on screen */
+#define MY_HOW_OFTEN_TO_WRITE 1000 /* How often we want info on screen */
+
+#ifndef set_timespec
+#ifdef HAVE_TIMESPEC_TS_SEC
+#define set_timespec(ABSTIME,SEC) { (ABSTIME).ts_sec=time(0) + (time_t) (SEC); (ABSTIME).ts_nsec=0; }
+#else
+#define set_timespec(ABSTIME,SEC) \
+{\
+ struct timeval tv;\
+ gettimeofday(&tv,0);\
+ (ABSTIME).tv_sec=tv.tv_sec+(time_t) (SEC);\
+ (ABSTIME).tv_nsec=tv.tv_usec*1000;\
+}
+#endif /* HAVE_TIMESPEC_TS_SEC */
+#endif /* set_timespec */
+
+/*
+ Define-funktions for reading and storing in machine independent format
+ (low byte first)
+*/
+
+/* Optimized store functions for Intel x86 */
+#if defined(__i386__) && !defined(_WIN64)
+#define sint2korr(A) (*((int16 *) (A)))
+#define sint3korr(A) ((int32) ((((uchar) (A)[2]) & 128) ? \
+ (((uint32) 255L << 24) | \
+ (((uint32) (uchar) (A)[2]) << 16) |\
+ (((uint32) (uchar) (A)[1]) << 8) | \
+ ((uint32) (uchar) (A)[0])) : \
+ (((uint32) (uchar) (A)[2]) << 16) |\
+ (((uint32) (uchar) (A)[1]) << 8) | \
+ ((uint32) (uchar) (A)[0])))
+#define sint4korr(A) (*((long *) (A)))
+#define uint2korr(A) (*((uint16 *) (A)))
+#ifdef HAVE_purify
+#define uint3korr(A) (uint32) (((uint32) ((uchar) (A)[0])) +\
+ (((uint32) ((uchar) (A)[1])) << 8) +\
+ (((uint32) ((uchar) (A)[2])) << 16))
+#else
+/*
+ ATTENTION !
+
+ Please, note, uint3korr reads 4 bytes (not 3) !
+ It means, that you have to provide enough allocated space !
+*/
+#define uint3korr(A) (long) (*((unsigned int *) (A)) & 0xFFFFFF)
+#endif
+#define uint4korr(A) (*((unsigned long *) (A)))
+#define uint5korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) +\
+ (((uint32) ((uchar) (A)[1])) << 8) +\
+ (((uint32) ((uchar) (A)[2])) << 16) +\
+ (((uint32) ((uchar) (A)[3])) << 24)) +\
+ (((ulonglong) ((uchar) (A)[4])) << 32))
+#define uint8korr(A) (*((ulonglong *) (A)))
+#define sint8korr(A) (*((longlong *) (A)))
+#define int2store(T,A) *((uint16*) (T))= (uint16) (A)
+#define int3store(T,A) do { *(T)= (uchar) ((A));\
+ *(T+1)=(uchar) (((uint) (A) >> 8));\
+ *(T+2)=(uchar) (((A) >> 16)); } while (0)
+#define int4store(T,A) *((long *) (T))= (long) (A)
+#define int5store(T,A) do { *(T)= (uchar)((A));\
+ *((T)+1)=(uchar) (((A) >> 8));\
+ *((T)+2)=(uchar) (((A) >> 16));\
+ *((T)+3)=(uchar) (((A) >> 24)); \
+ *((T)+4)=(uchar) (((A) >> 32)); } while(0)
+#define int8store(T,A) *((ulonglong *) (T))= (ulonglong) (A)
+
+typedef union {
+ double v;
+ long m[2];
+} doubleget_union;
+#define doubleget(V,M) \
+do { doubleget_union _tmp; \
+ _tmp.m[0] = *((long*)(M)); \
+ _tmp.m[1] = *(((long*) (M))+1); \
+ (V) = _tmp.v; } while(0)
+#define doublestore(T,V) do { *((long *) T) = ((doubleget_union *)&V)->m[0]; \
+ *(((long *) T)+1) = ((doubleget_union *)&V)->m[1]; \
+ } while (0)
+#define float4get(V,M) do { *((long *) &(V)) = *((long*) (M)); } while(0)
+#define float8get(V,M) doubleget((V),(M))
+#define float4store(V,M) memcpy((byte*) V,(byte*) (&M),sizeof(float))
+#define floatstore(T,V) memcpy((byte*)(T), (byte*)(&V), sizeof(float))
+#define float8store(V,M) doublestore((V),(M))
+#endif /* __i386__ */
+
+#ifndef sint2korr
+/*
+ We're here if it's not a IA-32 architecture (Win32 and UNIX IA-32 defines
+ were done before)
+*/
+#define sint2korr(A) (int16) (((int16) ((uchar) (A)[0])) +\
+ ((int16) ((int16) (A)[1]) << 8))
+#define sint3korr(A) ((int32) ((((uchar) (A)[2]) & 128) ? \
+ (((uint32) 255L << 24) | \
+ (((uint32) (uchar) (A)[2]) << 16) |\
+ (((uint32) (uchar) (A)[1]) << 8) | \
+ ((uint32) (uchar) (A)[0])) : \
+ (((uint32) (uchar) (A)[2]) << 16) |\
+ (((uint32) (uchar) (A)[1]) << 8) | \
+ ((uint32) (uchar) (A)[0])))
+#define sint4korr(A) (int32) (((int32) ((uchar) (A)[0])) +\
+ (((int32) ((uchar) (A)[1]) << 8)) +\
+ (((int32) ((uchar) (A)[2]) << 16)) +\
+ (((int32) ((int16) (A)[3]) << 24)))
+#define sint8korr(A) (longlong) uint8korr(A)
+#define uint2korr(A) (uint16) (((uint16) ((uchar) (A)[0])) +\
+ ((uint16) ((uchar) (A)[1]) << 8))
+#define uint3korr(A) (uint32) (((uint32) ((uchar) (A)[0])) +\
+ (((uint32) ((uchar) (A)[1])) << 8) +\
+ (((uint32) ((uchar) (A)[2])) << 16))
+#define uint4korr(A) (uint32) (((uint32) ((uchar) (A)[0])) +\
+ (((uint32) ((uchar) (A)[1])) << 8) +\
+ (((uint32) ((uchar) (A)[2])) << 16) +\
+ (((uint32) ((uchar) (A)[3])) << 24))
+#define uint5korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) +\
+ (((uint32) ((uchar) (A)[1])) << 8) +\
+ (((uint32) ((uchar) (A)[2])) << 16) +\
+ (((uint32) ((uchar) (A)[3])) << 24)) +\
+ (((ulonglong) ((uchar) (A)[4])) << 32))
+#define uint8korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) +\
+ (((uint32) ((uchar) (A)[1])) << 8) +\
+ (((uint32) ((uchar) (A)[2])) << 16) +\
+ (((uint32) ((uchar) (A)[3])) << 24)) +\
+ (((ulonglong) (((uint32) ((uchar) (A)[4])) +\
+ (((uint32) ((uchar) (A)[5])) << 8) +\
+ (((uint32) ((uchar) (A)[6])) << 16) +\
+ (((uint32) ((uchar) (A)[7])) << 24))) <<\
+ 32))
+#define int2store(T,A) do { uint def_temp= (uint) (A) ;\
+ *((uchar*) (T))= (uchar)(def_temp); \
+ *((uchar*) (T)+1)=(uchar)((def_temp >> 8)); \
+ } while(0)
+#define int3store(T,A) do { /*lint -save -e734 */\
+ *((uchar*)(T))=(uchar) ((A));\
+ *((uchar*) (T)+1)=(uchar) (((A) >> 8));\
+ *((uchar*)(T)+2)=(uchar) (((A) >> 16)); \
+ /*lint -restore */} while(0)
+#define int4store(T,A) do { *((char *)(T))=(char) ((A));\
+ *(((char *)(T))+1)=(char) (((A) >> 8));\
+ *(((char *)(T))+2)=(char) (((A) >> 16));\
+ *(((char *)(T))+3)=(char) (((A) >> 24)); } while(0)
+#define int5store(T,A) do { *((char *)(T))=((A));\
+ *(((char *)(T))+1)=(((A) >> 8));\
+ *(((char *)(T))+2)=(((A) >> 16));\
+ *(((char *)(T))+3)=(((A) >> 24)); \
+ *(((char *)(T))+4)=(((A) >> 32)); } while(0)
+#define int8store(T,A) do { uint def_temp= (uint) (A), def_temp2= (uint) ((A) >> 32); \
+ int4store((T),def_temp); \
+ int4store((T+4),def_temp2); } while(0)
+#ifdef WORDS_BIGENDIAN
+#define float4store(T,A) do { *(T)= ((byte *) &A)[3];\
+ *((T)+1)=(char) ((byte *) &A)[2];\
+ *((T)+2)=(char) ((byte *) &A)[1];\
+ *((T)+3)=(char) ((byte *) &A)[0]; } while(0)
+
+#define float4get(V,M) do { float def_temp;\
+ ((byte*) &def_temp)[0]=(M)[3];\
+ ((byte*) &def_temp)[1]=(M)[2];\
+ ((byte*) &def_temp)[2]=(M)[1];\
+ ((byte*) &def_temp)[3]=(M)[0];\
+ (V)=def_temp; } while(0)
+#define float8store(T,V) do { *(T)= ((byte *) &V)[7];\
+ *((T)+1)=(char) ((byte *) &V)[6];\
+ *((T)+2)=(char) ((byte *) &V)[5];\
+ *((T)+3)=(char) ((byte *) &V)[4];\
+ *((T)+4)=(char) ((byte *) &V)[3];\
+ *((T)+5)=(char) ((byte *) &V)[2];\
+ *((T)+6)=(char) ((byte *) &V)[1];\
+ *((T)+7)=(char) ((byte *) &V)[0]; } while(0)
+
+#define float8get(V,M) do { double def_temp;\
+ ((byte*) &def_temp)[0]=(M)[7];\
+ ((byte*) &def_temp)[1]=(M)[6];\
+ ((byte*) &def_temp)[2]=(M)[5];\
+ ((byte*) &def_temp)[3]=(M)[4];\
+ ((byte*) &def_temp)[4]=(M)[3];\
+ ((byte*) &def_temp)[5]=(M)[2];\
+ ((byte*) &def_temp)[6]=(M)[1];\
+ ((byte*) &def_temp)[7]=(M)[0];\
+ (V) = def_temp; } while(0)
+#else
+#define float4get(V,M) memcpy_fixed((byte*) &V,(byte*) (M),sizeof(float))
+#define float4store(V,M) memcpy_fixed((byte*) V,(byte*) (&M),sizeof(float))
+
+#if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN)
+#define doublestore(T,V) do { *(T)= ((byte *) &V)[4];\
+ *(((char*)T)+1)=(char) ((byte *) &V)[5];\
+ *(((char*)T)+2)=(char) ((byte *) &V)[6];\
+ *(((char*)T)+3)=(char) ((byte *) &V)[7];\
+ *(((char*)T)+4)=(char) ((byte *) &V)[0];\
+ *(((char*)T)+5)=(char) ((byte *) &V)[1];\
+ *(((char*)T)+6)=(char) ((byte *) &V)[2];\
+ *(((char*)T)+7)=(char) ((byte *) &V)[3]; }\
+ while(0)
+#define doubleget(V,M) do { double def_temp;\
+ ((byte*) &def_temp)[0]=(M)[4];\
+ ((byte*) &def_temp)[1]=(M)[5];\
+ ((byte*) &def_temp)[2]=(M)[6];\
+ ((byte*) &def_temp)[3]=(M)[7];\
+ ((byte*) &def_temp)[4]=(M)[0];\
+ ((byte*) &def_temp)[5]=(M)[1];\
+ ((byte*) &def_temp)[6]=(M)[2];\
+ ((byte*) &def_temp)[7]=(M)[3];\
+ (V) = def_temp; } while(0)
+#endif /* __FLOAT_WORD_ORDER */
+
+#define float8get(V,M) doubleget((V),(M))
+#define float8store(V,M) doublestore((V),(M))
+#endif /* WORDS_BIGENDIAN */
+
+#endif /* sint2korr */
+
+/*
+ Macro for reading 32-bit integer from network byte order (big-endian)
+ from unaligned memory location.
+*/
+#define int4net(A) (int32) (((uint32) ((uchar) (A)[3])) |\
+ (((uint32) ((uchar) (A)[2])) << 8) |\
+ (((uint32) ((uchar) (A)[1])) << 16) |\
+ (((uint32) ((uchar) (A)[0])) << 24))
+/*
+ Define-funktions for reading and storing in machine format from/to
+ short/long to/from some place in memory V should be a (not
+ register) variable, M is a pointer to byte
+*/
+
+#ifdef WORDS_BIGENDIAN
+
+#define ushortget(V,M) do { V = (uint16) (((uint16) ((uchar) (M)[1]))+\
+ ((uint16) ((uint16) (M)[0]) << 8)); } while(0)
+#define shortget(V,M) do { V = (short) (((short) ((uchar) (M)[1]))+\
+ ((short) ((short) (M)[0]) << 8)); } while(0)
+#define longget(V,M) do { int32 def_temp;\
+ ((byte*) &def_temp)[0]=(M)[0];\
+ ((byte*) &def_temp)[1]=(M)[1];\
+ ((byte*) &def_temp)[2]=(M)[2];\
+ ((byte*) &def_temp)[3]=(M)[3];\
+ (V)=def_temp; } while(0)
+#define ulongget(V,M) do { uint32 def_temp;\
+ ((byte*) &def_temp)[0]=(M)[0];\
+ ((byte*) &def_temp)[1]=(M)[1];\
+ ((byte*) &def_temp)[2]=(M)[2];\
+ ((byte*) &def_temp)[3]=(M)[3];\
+ (V)=def_temp; } while(0)
+#define shortstore(T,A) do { uint def_temp=(uint) (A) ;\
+ *(((char*)T)+1)=(char)(def_temp); \
+ *(((char*)T)+0)=(char)(def_temp >> 8); } while(0)
+#define longstore(T,A) do { *(((char*)T)+3)=((A));\
+ *(((char*)T)+2)=(((A) >> 8));\
+ *(((char*)T)+1)=(((A) >> 16));\
+ *(((char*)T)+0)=(((A) >> 24)); } while(0)
+
+#define floatstore(T,V) memcpy_fixed((byte*)(T), (byte*)(&V), sizeof(float))
+#define doubleget(V,M) memcpy_fixed((byte*) &V,(byte*) (M),sizeof(double))
+#define doublestore(T,V) memcpy_fixed((byte*) (T),(byte*) &V,sizeof(double))
+#define longlongget(V,M) memcpy_fixed((byte*) &V,(byte*) (M),sizeof(ulonglong))
+#define longlongstore(T,V) memcpy_fixed((byte*) (T),(byte*) &V,sizeof(ulonglong))
+
+#else
+
+#define ushortget(V,M) do { V = uint2korr(M); } while(0)
+#define shortget(V,M) do { V = sint2korr(M); } while(0)
+#define longget(V,M) do { V = sint4korr(M); } while(0)
+#define ulongget(V,M) do { V = uint4korr(M); } while(0)
+#define shortstore(T,V) int2store(T,V)
+#define longstore(T,V) int4store(T,V)
+#ifndef floatstore
+#define floatstore(T,V) memcpy_fixed((byte*)(T), (byte*)(&V), sizeof(float))
+#endif
+#ifndef doubleget
+#define doubleget(V,M) memcpy_fixed((byte*) &V,(byte*) (M),sizeof(double))
+#define doublestore(T,V) memcpy_fixed((byte*) (T),(byte*) &V,sizeof(double))
+#endif /* doubleget */
+#define longlongget(V,M) memcpy_fixed((byte*) &V,(byte*) (M),sizeof(ulonglong))
+#define longlongstore(T,V) memcpy_fixed((byte*) (T),(byte*) &V,sizeof(ulonglong))
+
+#endif /* WORDS_BIGENDIAN */
+
+/* sprintf does not always return the number of bytes :- */
+#ifdef SPRINTF_RETURNS_INT
+#define my_sprintf(buff,args) sprintf args
+#else
+#ifdef SPRINTF_RETURNS_PTR
+#define my_sprintf(buff,args) ((int)(sprintf args - buff))
+#else
+#define my_sprintf(buff,args) ((ulong) sprintf args, (ulong) strlen(buff))
+#endif
+#endif
+
+#ifndef THREAD
+#define thread_safe_increment(V,L) (V)++
+#define thread_safe_add(V,C,L) (V)+=(C)
+#define thread_safe_sub(V,C,L) (V)-=(C)
+#define statistic_increment(V,L) (V)++
+#define statistic_add(V,C,L) (V)+=(C)
+#endif
+
+#ifdef HAVE_CHARSET_utf8
+#define MYSQL_UNIVERSAL_CLIENT_CHARSET "utf8"
+#else
+#define MYSQL_UNIVERSAL_CLIENT_CHARSET MYSQL_DEFAULT_CHARSET_NAME
+#endif
+
+#if defined(EMBEDDED_LIBRARY) && !defined(HAVE_EMBEDDED_PRIVILEGE_CONTROL)
+#define NO_EMBEDDED_ACCESS_CHECKS
+#endif
+
+#endif /* my_global_h */
diff --git a/src/terralib/drivers/MySQL/include/my_list.h b/src/terralib/drivers/MySQL/include/my_list.h
new file mode 100644
index 0000000..f786621
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_list.h
@@ -0,0 +1,46 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifndef _list_h_
+#define _list_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct st_list {
+ struct st_list *prev,*next;
+ void *data;
+} LIST;
+
+typedef int (*list_walk_action)(void *,void *);
+
+extern LIST *list_add(LIST *root,LIST *element);
+extern LIST *list_delete(LIST *root,LIST *element);
+extern LIST *list_cons(void *data,LIST *root);
+extern LIST *list_reverse(LIST *root);
+extern void list_free(LIST *root,unsigned int free_data);
+extern unsigned int list_length(LIST *);
+extern int list_walk(LIST *,list_walk_action action,gptr argument);
+
+#define rest(a) ((a)->next)
+#define list_push(a,b) (a)=list_cons((b),(a))
+#define list_pop(A) {LIST *old=(A); (A)=list_delete(old,old) ; my_free((gptr) old,MYF(MY_FAE)); }
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/terralib/drivers/MySQL/include/my_pthread.h b/src/terralib/drivers/MySQL/include/my_pthread.h
new file mode 100644
index 0000000..cd0cf49
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_pthread.h
@@ -0,0 +1,700 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/* Defines to make different thread packages compatible */
+
+#ifndef _my_pthread_h
+#define _my_pthread_h
+
+#include <errno.h>
+#ifndef ETIME
+#define ETIME ETIMEDOUT /* For FreeBSD */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#if defined(__WIN__) || defined(OS2)
+
+#ifdef OS2
+typedef ULONG HANDLE;
+typedef ULONG DWORD;
+typedef int sigset_t;
+#endif
+
+#ifdef OS2
+typedef HMTX pthread_mutex_t;
+#else
+typedef CRITICAL_SECTION pthread_mutex_t;
+#endif
+typedef HANDLE pthread_t;
+typedef struct thread_attr {
+ DWORD dwStackSize ;
+ DWORD dwCreatingFlag ;
+ int priority ;
+} pthread_attr_t ;
+
+typedef struct { int dummy; } pthread_condattr_t;
+
+/* Implementation of posix conditions */
+
+typedef struct st_pthread_link {
+ DWORD thread_id;
+ struct st_pthread_link *next;
+} pthread_link;
+
+typedef struct {
+ uint32 waiting;
+#ifdef OS2
+ HEV semaphore;
+#else
+ HANDLE semaphore;
+#endif
+} pthread_cond_t;
+
+
+#ifndef OS2
+struct timespec { /* For pthread_cond_timedwait() */
+ time_t tv_sec;
+ long tv_nsec;
+};
+#endif
+
+typedef int pthread_mutexattr_t;
+#define win_pthread_self my_thread_var->pthread_self
+#ifdef OS2
+#define pthread_handler_decl(A,B) void * _Optlink A(void *B)
+typedef void * (_Optlink *pthread_handler)(void *);
+#else
+#define pthread_handler_decl(A,B) void * __cdecl A(void *B)
+typedef void * (__cdecl *pthread_handler)(void *);
+#endif
+
+void win_pthread_init(void);
+int win_pthread_setspecific(void *A,void *B,uint length);
+int pthread_create(pthread_t *,pthread_attr_t *,pthread_handler,void *);
+int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
+int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
+int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
+ struct timespec *abstime);
+int pthread_cond_signal(pthread_cond_t *cond);
+int pthread_cond_broadcast(pthread_cond_t *cond);
+int pthread_cond_destroy(pthread_cond_t *cond);
+int pthread_attr_init(pthread_attr_t *connect_att);
+int pthread_attr_setstacksize(pthread_attr_t *connect_att,DWORD stack);
+int pthread_attr_setprio(pthread_attr_t *connect_att,int priority);
+int pthread_attr_destroy(pthread_attr_t *connect_att);
+struct tm *localtime_r(const time_t *timep,struct tm *tmp);
+struct tm *gmtime_r(const time_t *timep,struct tm *tmp);
+
+
+void pthread_exit(void *a); /* was #define pthread_exit(A) ExitThread(A)*/
+
+#ifndef OS2
+#define ETIMEDOUT 145 /* Win32 doesn't have this */
+#define getpid() GetCurrentThreadId()
+#endif
+#define pthread_self() win_pthread_self
+#define HAVE_LOCALTIME_R 1
+#define _REENTRANT 1
+#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1
+
+#ifdef USE_TLS /* For LIBMYSQL.DLL */
+#undef SAFE_MUTEX /* This will cause conflicts */
+#define pthread_key(T,V) DWORD V
+#define pthread_key_create(A,B) ((*A=TlsAlloc())==0xFFFFFFFF)
+#define pthread_key_delete(A) TlsFree(A)
+#define pthread_getspecific(A) (TlsGetValue(A))
+#define my_pthread_getspecific(T,A) ((T) TlsGetValue(A))
+#define my_pthread_getspecific_ptr(T,V) ((T) TlsGetValue(V))
+#define my_pthread_setspecific_ptr(T,V) (!TlsSetValue((T),(V)))
+#define pthread_setspecific(A,B) (!TlsSetValue((A),(B)))
+#else
+#define pthread_key(T,V) __declspec(thread) T V
+#define pthread_key_create(A,B) pthread_dummy(0)
+#define pthread_key_delete(A) pthread_dummy(0)
+#define pthread_getspecific(A) (&(A))
+#define my_pthread_getspecific(T,A) (&(A))
+#define my_pthread_getspecific_ptr(T,V) (V)
+#define my_pthread_setspecific_ptr(T,V) ((T)=(V),0)
+#define pthread_setspecific(A,B) win_pthread_setspecific(&(A),(B),sizeof(A))
+#endif /* USE_TLS */
+
+#define pthread_equal(A,B) ((A) == (B))
+#ifdef OS2
+extern int pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *);
+extern int pthread_mutex_lock (pthread_mutex_t *);
+extern int pthread_mutex_unlock (pthread_mutex_t *);
+extern int pthread_mutex_destroy (pthread_mutex_t *);
+#define my_pthread_setprio(A,B) DosSetPriority(PRTYS_THREAD,PRTYC_NOCHANGE, B, A)
+#define pthread_kill(A,B) raise(B)
+#define pthread_exit(A) pthread_dummy()
+#else
+#define pthread_mutex_init(A,B) InitializeCriticalSection(A)
+#define pthread_mutex_lock(A) (EnterCriticalSection(A),0)
+#define pthread_mutex_trylock(A) (WaitForSingleObject((A), 0) == WAIT_TIMEOUT)
+#define pthread_mutex_unlock(A) LeaveCriticalSection(A)
+#define pthread_mutex_destroy(A) DeleteCriticalSection(A)
+#define my_pthread_setprio(A,B) SetThreadPriority(GetCurrentThread(), (B))
+#define pthread_kill(A,B) pthread_dummy(0)
+#endif /* OS2 */
+
+/* Dummy defines for easier code */
+#define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
+#define my_pthread_attr_setprio(A,B) pthread_attr_setprio(A,B)
+#define pthread_attr_setscope(A,B)
+#define pthread_detach_this_thread()
+#define pthread_condattr_init(A)
+#define pthread_condattr_destroy(A)
+
+/*Irena: compiler does not like this: */
+/*#define my_pthread_getprio(pthread_t thread_id) pthread_dummy(0) */
+#define my_pthread_getprio(thread_id) pthread_dummy(0)
+
+#elif defined(HAVE_UNIXWARE7_THREADS)
+
+#include <thread.h>
+#include <synch.h>
+
+#ifndef _REENTRANT
+#define _REENTRANT
+#endif
+
+#define HAVE_NONPOSIX_SIGWAIT
+#define pthread_t thread_t
+#define pthread_cond_t cond_t
+#define pthread_mutex_t mutex_t
+#define pthread_key_t thread_key_t
+typedef int pthread_attr_t; /* Needed by Unixware 7.0.0 */
+
+#define pthread_key_create(A,B) thr_keycreate((A),(B))
+#define pthread_key_delete(A) thr_keydelete(A)
+
+#define pthread_handler_decl(A,B) void *A(void *B)
+#define pthread_key(T,V) pthread_key_t V
+
+void * my_pthread_getspecific_imp(pthread_key_t key);
+#define my_pthread_getspecific(A,B) ((A) my_pthread_getspecific_imp(B))
+#define my_pthread_getspecific_ptr(T,V) my_pthread_getspecific(T,V)
+
+#define pthread_setspecific(A,B) thr_setspecific(A,B)
+#define my_pthread_setspecific_ptr(T,V) pthread_setspecific(T,V)
+
+#define pthread_create(A,B,C,D) thr_create(NULL,65536L,(C),(D),THR_DETACHED,(A))
+#define pthread_cond_init(a,b) cond_init((a),USYNC_THREAD,NULL)
+#define pthread_cond_destroy(a) cond_destroy(a)
+#define pthread_cond_signal(a) cond_signal(a)
+#define pthread_cond_wait(a,b) cond_wait((a),(b))
+#define pthread_cond_timedwait(a,b,c) cond_timedwait((a),(b),(c))
+#define pthread_cond_broadcast(a) cond_broadcast(a)
+
+#define pthread_mutex_init(a,b) mutex_init((a),USYNC_THREAD,NULL)
+#define pthread_mutex_lock(a) mutex_lock(a)
+#define pthread_mutex_unlock(a) mutex_unlock(a)
+#define pthread_mutex_destroy(a) mutex_destroy(a)
+
+#define pthread_self() thr_self()
+#define pthread_exit(A) thr_exit(A)
+#define pthread_equal(A,B) (((A) == (B)) ? 1 : 0)
+#define pthread_kill(A,B) thr_kill((A),(B))
+#define HAVE_PTHREAD_KILL
+
+#define pthread_sigmask(A,B,C) thr_sigsetmask((A),(B),(C))
+
+extern int my_sigwait(const sigset_t *set,int *sig);
+
+#define pthread_detach_this_thread() pthread_dummy(0)
+
+#define pthread_attr_init(A) pthread_dummy(0)
+#define pthread_attr_destroy(A) pthread_dummy(0)
+#define pthread_attr_setscope(A,B) pthread_dummy(0)
+#define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
+#define my_pthread_setprio(A,B) pthread_dummy (0)
+#define my_pthread_getprio(A) pthread_dummy (0)
+#define my_pthread_attr_setprio(A,B) pthread_dummy(0)
+
+#else /* Normal threads */
+
+#ifdef HAVE_rts_threads
+#define sigwait org_sigwait
+#include <signal.h>
+#undef sigwait
+#endif
+#include <pthread.h>
+#ifndef _REENTRANT
+#define _REENTRANT
+#endif
+#ifdef HAVE_THR_SETCONCURRENCY
+#include <thread.h> /* Probably solaris */
+#endif
+#ifdef HAVE_SCHED_H
+#include <sched.h>
+#endif
+#ifdef HAVE_SYNCH_H
+#include <synch.h>
+#endif
+#if defined(__EMX__) && (!defined(EMX_PTHREAD_REV) || (EMX_PTHREAD_REV < 2))
+#error Requires at least rev 2 of EMX pthreads library.
+#endif
+
+#ifdef __NETWARE__
+void my_pthread_exit(void *status);
+#define pthread_exit(A) my_pthread_exit(A)
+#endif
+
+extern int my_pthread_getprio(pthread_t thread_id);
+
+#define pthread_key(T,V) pthread_key_t V
+#define my_pthread_getspecific_ptr(T,V) my_pthread_getspecific(T,(V))
+#define my_pthread_setspecific_ptr(T,V) pthread_setspecific(T,(void*) (V))
+#define pthread_detach_this_thread()
+#define pthread_handler_decl(A,B) void *A(void *B)
+typedef void *(* pthread_handler)(void *);
+
+/* Test first for RTS or FSU threads */
+
+#if defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM)
+#define HAVE_rts_threads
+extern int my_pthread_create_detached;
+#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
+#define PTHREAD_CREATE_DETACHED &my_pthread_create_detached
+#define PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_GLOBAL
+#define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_LOCAL
+#define USE_ALARM_THREAD
+#elif defined(HAVE_mit_thread)
+#define USE_ALARM_THREAD
+#undef HAVE_LOCALTIME_R
+#define HAVE_LOCALTIME_R
+#undef HAVE_GMTIME_R
+#define HAVE_GMTIME_R
+#undef HAVE_PTHREAD_ATTR_SETSCOPE
+#define HAVE_PTHREAD_ATTR_SETSCOPE
+#undef HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE /* If we are running linux */
+#undef HAVE_RWLOCK_T
+#undef HAVE_RWLOCK_INIT
+#undef HAVE_PTHREAD_RWLOCK_RDLOCK
+#undef HAVE_SNPRINTF
+
+#define sigset(A,B) pthread_signal((A),(void (*)(int)) (B))
+#define signal(A,B) pthread_signal((A),(void (*)(int)) (B))
+#define my_pthread_attr_setprio(A,B)
+#endif /* defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM) */
+
+#if defined(_BSDI_VERSION) && _BSDI_VERSION < 199910
+int sigwait(sigset_t *set, int *sig);
+#endif
+
+#if defined(HAVE_UNIXWARE7_POSIX)
+#undef HAVE_NONPOSIX_SIGWAIT
+#define HAVE_NONPOSIX_SIGWAIT /* sigwait takes only 1 argument */
+#endif
+
+#ifndef HAVE_NONPOSIX_SIGWAIT
+#define my_sigwait(A,B) sigwait((A),(B))
+#else
+int my_sigwait(const sigset_t *set,int *sig);
+#endif
+
+#ifdef HAVE_NONPOSIX_PTHREAD_MUTEX_INIT
+#ifndef SAFE_MUTEX
+#define pthread_mutex_init(a,b) my_pthread_mutex_init((a),(b))
+extern int my_pthread_mutex_init(pthread_mutex_t *mp,
+ const pthread_mutexattr_t *attr);
+#endif /* SAFE_MUTEX */
+#define pthread_cond_init(a,b) my_pthread_cond_init((a),(b))
+extern int my_pthread_cond_init(pthread_cond_t *mp,
+ const pthread_condattr_t *attr);
+#endif /* HAVE_NONPOSIX_PTHREAD_MUTEX_INIT */
+
+#if defined(HAVE_SIGTHREADMASK) && !defined(HAVE_PTHREAD_SIGMASK)
+#define pthread_sigmask(A,B,C) sigthreadmask((A),(B),(C))
+#endif
+
+#if !defined(HAVE_SIGWAIT) && !defined(HAVE_mit_thread) && !defined(HAVE_rts_threads) && !defined(sigwait) && !defined(alpha_linux_port) && !defined(HAVE_NONPOSIX_SIGWAIT) && !defined(HAVE_DEC_3_2_THREADS) && !defined(_AIX)
+int sigwait(sigset_t *setp, int *sigp); /* Use our implemention */
+#endif
+#if !defined(HAVE_SIGSET) && !defined(HAVE_mit_thread) && !defined(sigset)
+#define sigset(A,B) do { struct sigaction s; sigset_t set; \
+ sigemptyset(&set); \
+ s.sa_handler = (B); \
+ s.sa_mask = set; \
+ s.sa_flags = 0; \
+ sigaction((A), &s, (struct sigaction *) NULL); \
+ } while (0)
+#endif
+
+#ifndef my_pthread_setprio
+#if defined(HAVE_PTHREAD_SETPRIO_NP) /* FSU threads */
+#define my_pthread_setprio(A,B) pthread_setprio_np((A),(B))
+#elif defined(HAVE_PTHREAD_SETPRIO)
+#define my_pthread_setprio(A,B) pthread_setprio((A),(B))
+#else
+extern void my_pthread_setprio(pthread_t thread_id,int prior);
+#endif
+#endif
+
+#ifndef my_pthread_attr_setprio
+#ifdef HAVE_PTHREAD_ATTR_SETPRIO
+#define my_pthread_attr_setprio(A,B) pthread_attr_setprio((A),(B))
+#else
+extern void my_pthread_attr_setprio(pthread_attr_t *attr, int priority);
+#endif
+#endif
+
+#if !defined(HAVE_PTHREAD_ATTR_SETSCOPE) || defined(HAVE_DEC_3_2_THREADS)
+#define pthread_attr_setscope(A,B)
+#undef HAVE_GETHOSTBYADDR_R /* No definition */
+#endif
+
+#if defined(HAVE_BROKEN_PTHREAD_COND_TIMEDWAIT) && !defined(SAFE_MUTEX)
+extern int my_pthread_cond_timedwait(pthread_cond_t *cond,
+ pthread_mutex_t *mutex,
+ struct timespec *abstime);
+#define pthread_cond_timedwait(A,B,C) my_pthread_cond_timedwait((A),(B),(C))
+#endif
+
+#if defined(OS2)
+#define my_pthread_getspecific(T,A) ((T) &(A))
+#define pthread_setspecific(A,B) win_pthread_setspecific(&(A),(B),sizeof(A))
+#elif !defined( HAVE_NONPOSIX_PTHREAD_GETSPECIFIC)
+#define my_pthread_getspecific(A,B) ((A) pthread_getspecific(B))
+#else
+#define my_pthread_getspecific(A,B) ((A) my_pthread_getspecific_imp(B))
+void *my_pthread_getspecific_imp(pthread_key_t key);
+#endif /* OS2 */
+
+#ifndef HAVE_LOCALTIME_R
+struct tm *localtime_r(const time_t *clock, struct tm *res);
+#endif
+
+#ifndef HAVE_GMTIME_R
+struct tm *gmtime_r(const time_t *clock, struct tm *res);
+#endif
+
+#ifdef HAVE_PTHREAD_CONDATTR_CREATE
+/* DCE threads on HPUX 10.20 */
+#define pthread_condattr_init pthread_condattr_create
+#define pthread_condattr_destroy pthread_condattr_delete
+#endif
+
+/* FSU THREADS */
+#if !defined(HAVE_PTHREAD_KEY_DELETE) && !defined(pthread_key_delete)
+#define pthread_key_delete(A) pthread_dummy(0)
+#endif
+
+#ifdef HAVE_CTHREADS_WRAPPER /* For MacOSX */
+#define pthread_cond_destroy(A) pthread_dummy(0)
+#define pthread_mutex_destroy(A) pthread_dummy(0)
+#define pthread_attr_delete(A) pthread_dummy(0)
+#define pthread_condattr_delete(A) pthread_dummy(0)
+#define pthread_attr_setstacksize(A,B) pthread_dummy(0)
+#define pthread_equal(A,B) ((A) == (B))
+#define pthread_cond_timedwait(a,b,c) pthread_cond_wait((a),(b))
+#define pthread_attr_init(A) pthread_attr_create(A)
+#define pthread_attr_destroy(A) pthread_attr_delete(A)
+#define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
+#define pthread_create(A,B,C,D) pthread_create((A),*(B),(C),(D))
+#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
+#define pthread_kill(A,B) pthread_dummy(0)
+#undef pthread_detach_this_thread
+#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(&tmp); }
+#endif
+
+#ifdef HAVE_DARWIN_THREADS
+#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
+#define pthread_kill(A,B) pthread_dummy(0)
+#define pthread_condattr_init(A) pthread_dummy(0)
+#define pthread_condattr_destroy(A) pthread_dummy(0)
+#define pthread_signal(A,B) pthread_dummy(0)
+#undef pthread_detach_this_thread
+#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(tmp); }
+#undef sigset
+#define sigset(A,B) pthread_signal((A),(void (*)(int)) (B))
+#endif
+
+#if ((defined(HAVE_PTHREAD_ATTR_CREATE) && !defined(HAVE_SIGWAIT)) || defined(HAVE_DEC_3_2_THREADS)) && !defined(HAVE_CTHREADS_WRAPPER)
+/* This is set on AIX_3_2 and Siemens unix (and DEC OSF/1 3.2 too) */
+#define pthread_key_create(A,B) \
+ pthread_keycreate(A,(B) ?\
+ (pthread_destructor_t) (B) :\
+ (pthread_destructor_t) pthread_dummy)
+#define pthread_attr_init(A) pthread_attr_create(A)
+#define pthread_attr_destroy(A) pthread_attr_delete(A)
+#define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
+#define pthread_create(A,B,C,D) pthread_create((A),*(B),(C),(D))
+#ifndef pthread_sigmask
+#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
+#endif
+#define pthread_kill(A,B) pthread_dummy(0)
+#undef pthread_detach_this_thread
+#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(&tmp); }
+#elif !defined(__NETWARE__) /* HAVE_PTHREAD_ATTR_CREATE && !HAVE_SIGWAIT */
+#define HAVE_PTHREAD_KILL
+#endif
+
+#endif /* defined(__WIN__) */
+
+#if defined(HPUX10) && !defined(DONT_REMAP_PTHREAD_FUNCTIONS)
+#undef pthread_cond_timedwait
+#define pthread_cond_timedwait(a,b,c) my_pthread_cond_timedwait((a),(b),(c))
+int my_pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
+ struct timespec *abstime);
+#endif
+
+#if defined(HPUX10)
+#define pthread_attr_getstacksize(A,B) my_pthread_attr_getstacksize(A,B)
+void my_pthread_attr_getstacksize(pthread_attr_t *attrib, size_t *size);
+#endif
+
+#if defined(HAVE_POSIX1003_4a_MUTEX) && !defined(DONT_REMAP_PTHREAD_FUNCTIONS)
+#undef pthread_mutex_trylock
+#define pthread_mutex_trylock(a) my_pthread_mutex_trylock((a))
+int my_pthread_mutex_trylock(pthread_mutex_t *mutex);
+#endif
+
+ /* safe_mutex adds checking to mutex for easier debugging */
+
+#if defined(__NETWARE__) && !defined(SAFE_MUTEX_DETECT_DESTROY)
+#define SAFE_MUTEX_DETECT_DESTROY
+#endif
+
+typedef struct st_safe_mutex_t
+{
+ pthread_mutex_t global,mutex;
+ const char *file;
+ uint line,count;
+ pthread_t thread;
+#ifdef SAFE_MUTEX_DETECT_DESTROY
+ struct st_safe_mutex_info_t *info; /* to track destroying of mutexes */
+#endif
+} safe_mutex_t;
+
+#ifdef SAFE_MUTEX_DETECT_DESTROY
+/*
+ Used to track the destroying of mutexes. This needs to be a seperate
+ structure because the safe_mutex_t structure could be freed before
+ the mutexes are destroyed.
+*/
+
+typedef struct st_safe_mutex_info_t
+{
+ struct st_safe_mutex_info_t *next;
+ struct st_safe_mutex_info_t *prev;
+ const char *init_file;
+ uint32 init_line;
+} safe_mutex_info_t;
+#endif /* SAFE_MUTEX_DETECT_DESTROY */
+
+int safe_mutex_init(safe_mutex_t *mp, const pthread_mutexattr_t *attr,
+ const char *file, uint line);
+int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line);
+int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line);
+int safe_mutex_destroy(safe_mutex_t *mp,const char *file, uint line);
+int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp,const char *file,
+ uint line);
+int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp,
+ struct timespec *abstime, const char *file, uint line);
+void safe_mutex_global_init(void);
+void safe_mutex_end(FILE *file);
+
+ /* Wrappers if safe mutex is actually used */
+#ifdef SAFE_MUTEX
+#undef pthread_mutex_init
+#undef pthread_mutex_lock
+#undef pthread_mutex_unlock
+#undef pthread_mutex_destroy
+#undef pthread_mutex_wait
+#undef pthread_mutex_timedwait
+#undef pthread_mutex_t
+#undef pthread_cond_wait
+#undef pthread_cond_timedwait
+#undef pthread_mutex_trylock
+#define pthread_mutex_init(A,B) safe_mutex_init((A),(B),__FILE__,__LINE__)
+#define pthread_mutex_lock(A) safe_mutex_lock((A),__FILE__,__LINE__)
+#define pthread_mutex_unlock(A) safe_mutex_unlock((A),__FILE__,__LINE__)
+#define pthread_mutex_destroy(A) safe_mutex_destroy((A),__FILE__,__LINE__)
+#define pthread_cond_wait(A,B) safe_cond_wait((A),(B),__FILE__,__LINE__)
+#define pthread_cond_timedwait(A,B,C) safe_cond_timedwait((A),(B),(C),__FILE__,__LINE__)
+#define pthread_mutex_trylock(A) pthread_mutex_lock(A)
+#define pthread_mutex_t safe_mutex_t
+#define safe_mutex_assert_owner(mp) DBUG_ASSERT((mp)->count > 0 && pthread_equal(pthread_self(),(mp)->thread))
+#else
+#define safe_mutex_assert_owner(mp)
+#endif /* SAFE_MUTEX */
+
+ /* READ-WRITE thread locking */
+
+#ifdef HAVE_BROKEN_RWLOCK /* For OpenUnix */
+#undef HAVE_PTHREAD_RWLOCK_RDLOCK
+#undef HAVE_RWLOCK_INIT
+#undef HAVE_RWLOCK_T
+#endif
+
+#if defined(USE_MUTEX_INSTEAD_OF_RW_LOCKS)
+/* use these defs for simple mutex locking */
+#define rw_lock_t pthread_mutex_t
+#define my_rwlock_init(A,B) pthread_mutex_init((A),(B))
+#define rw_rdlock(A) pthread_mutex_lock((A))
+#define rw_wrlock(A) pthread_mutex_lock((A))
+#define rw_tryrdlock(A) pthread_mutex_trylock((A))
+#define rw_trywrlock(A) pthread_mutex_trylock((A))
+#define rw_unlock(A) pthread_mutex_unlock((A))
+#define rwlock_destroy(A) pthread_mutex_destroy((A))
+#elif defined(HAVE_PTHREAD_RWLOCK_RDLOCK)
+#define rw_lock_t pthread_rwlock_t
+#define my_rwlock_init(A,B) pthread_rwlock_init((A),(B))
+#define rw_rdlock(A) pthread_rwlock_rdlock(A)
+#define rw_wrlock(A) pthread_rwlock_wrlock(A)
+#define rw_tryrdlock(A) pthread_rwlock_tryrdlock((A))
+#define rw_trywrlock(A) pthread_rwlock_trywrlock((A))
+#define rw_unlock(A) pthread_rwlock_unlock(A)
+#define rwlock_destroy(A) pthread_rwlock_destroy(A)
+#elif defined(HAVE_RWLOCK_INIT)
+#ifdef HAVE_RWLOCK_T /* For example Solaris 2.6-> */
+#define rw_lock_t rwlock_t
+#endif
+#define my_rwlock_init(A,B) rwlock_init((A),USYNC_THREAD,0)
+#else
+/* Use our own version of read/write locks */
+typedef struct _my_rw_lock_t {
+ pthread_mutex_t lock; /* lock for structure */
+ pthread_cond_t readers; /* waiting readers */
+ pthread_cond_t writers; /* waiting writers */
+ int state; /* -1:writer,0:free,>0:readers */
+ int waiters; /* number of waiting writers */
+} my_rw_lock_t;
+
+#define rw_lock_t my_rw_lock_t
+#define rw_rdlock(A) my_rw_rdlock((A))
+#define rw_wrlock(A) my_rw_wrlock((A))
+#define rw_tryrdlock(A) my_rw_tryrdlock((A))
+#define rw_trywrlock(A) my_rw_trywrlock((A))
+#define rw_unlock(A) my_rw_unlock((A))
+#define rwlock_destroy(A) my_rwlock_destroy((A))
+
+extern int my_rwlock_init(my_rw_lock_t *, void *);
+extern int my_rwlock_destroy(my_rw_lock_t *);
+extern int my_rw_rdlock(my_rw_lock_t *);
+extern int my_rw_wrlock(my_rw_lock_t *);
+extern int my_rw_unlock(my_rw_lock_t *);
+extern int my_rw_tryrdlock(my_rw_lock_t *);
+extern int my_rw_trywrlock(my_rw_lock_t *);
+#endif /* USE_MUTEX_INSTEAD_OF_RW_LOCKS */
+
+#define GETHOSTBYADDR_BUFF_SIZE 2048
+
+#ifndef HAVE_THR_SETCONCURRENCY
+#define thr_setconcurrency(A) pthread_dummy(0)
+#endif
+#if !defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE) && ! defined(pthread_attr_setstacksize)
+#define pthread_attr_setstacksize(A,B) pthread_dummy(0)
+#endif
+
+/* Define mutex types */
+#define MY_MUTEX_INIT_SLOW NULL
+#define MY_MUTEX_INIT_FAST NULL
+#define MY_MUTEX_INIT_ERRCHK NULL
+#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
+extern pthread_mutexattr_t my_fast_mutexattr;
+#undef MY_MUTEX_INIT_FAST
+#define MY_MUTEX_INIT_FAST &my_fast_mutexattr
+#endif
+#ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
+extern pthread_mutexattr_t my_errchk_mutexattr;
+#undef MY_INIT_MUTEX_ERRCHK
+#define MY_INIT_MUTEX_ERRCHK &my_errchk_mutexattr
+#endif
+
+extern my_bool my_thread_global_init(void);
+extern void my_thread_global_end(void);
+extern my_bool my_thread_init(void);
+extern void my_thread_end(void);
+extern const char *my_thread_name(void);
+extern long my_thread_id(void);
+extern int pthread_no_free(void *);
+extern int pthread_dummy(int);
+
+/* All thread specific variables are in the following struct */
+
+#define THREAD_NAME_SIZE 10
+#if defined(__ia64__)
+/*
+ MySQL can survive with 32K, but some glibc libraries require > 128K stack
+ To resolve hostnames
+*/
+#define DEFAULT_THREAD_STACK (192*1024L)
+#else
+#define DEFAULT_THREAD_STACK (192*1024)
+#endif
+
+struct st_my_thread_var
+{
+ int thr_errno;
+ pthread_cond_t suspend;
+ pthread_mutex_t mutex;
+ pthread_mutex_t * volatile current_mutex;
+ pthread_cond_t * volatile current_cond;
+ pthread_t pthread_self;
+ long id;
+ int cmp_length;
+ int volatile abort;
+ my_bool init;
+ struct st_my_thread_var *next,**prev;
+ void *opt_info;
+#ifndef DBUG_OFF
+ gptr dbug;
+ char name[THREAD_NAME_SIZE+1];
+#endif
+};
+
+extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const));
+#define my_thread_var (_my_thread_var())
+#define my_errno my_thread_var->thr_errno
+/*
+ Keep track of shutdown,signal, and main threads so that my_end() will not
+ report errors with them
+*/
+extern pthread_t shutdown_th, main_th, signal_th;
+
+ /* statistics_xxx functions are for not essential statistic */
+
+#ifndef thread_safe_increment
+#ifdef HAVE_ATOMIC_ADD
+#define thread_safe_increment(V,L) atomic_add(1,(atomic_t*) &V);
+#define thread_safe_add(V,C,L) atomic_add((C),(atomic_t*) &V);
+#define thread_safe_sub(V,C,L) atomic_sub((C),(atomic_t*) &V);
+#else
+#define thread_safe_increment(V,L) \
+ pthread_mutex_lock((L)); (V)++; pthread_mutex_unlock((L));
+#define thread_safe_add(V,C,L) \
+ pthread_mutex_lock((L)); (V)+=(C); pthread_mutex_unlock((L));
+#define thread_safe_sub(V,C,L) \
+ pthread_mutex_lock((L)); (V)-=(C); pthread_mutex_unlock((L));
+#endif /* HAVE_ATOMIC_ADD */
+#ifdef SAFE_STATISTICS
+#define statistic_increment(V,L) thread_safe_increment((V),(L))
+#define statistic_add(V,C,L) thread_safe_add((V),(C),(L))
+#else
+#define statistic_increment(V,L) (V)++
+#define statistic_add(V,C,L) (V)+=(C)
+#endif /* SAFE_STATISTICS */
+#endif /* thread_safe_increment */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _my_ptread_h */
diff --git a/src/terralib/drivers/MySQL/include/my_sys.h b/src/terralib/drivers/MySQL/include/my_sys.h
new file mode 100644
index 0000000..01a7482
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_sys.h
@@ -0,0 +1,785 @@
+/* Copyright (C) 2000-2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifndef _my_sys_h
+#define _my_sys_h
+C_MODE_START
+
+#ifdef HAVE_AIOWAIT
+#include <sys/asynch.h> /* Used by record-cache */
+typedef struct my_aio_result {
+ aio_result_t result;
+ int pending;
+} my_aio_result;
+#endif
+
+#ifndef THREAD
+extern int NEAR my_errno; /* Last error in mysys */
+#else
+#include <my_pthread.h>
+#endif
+
+#ifndef _m_ctype_h
+#include <m_ctype.h> /* for CHARSET_INFO */
+#endif
+
+#include <stdarg.h>
+#include <typelib.h>
+
+#define MYSYS_PROGRAM_USES_CURSES() { error_handler_hook = my_message_curses; mysys_uses_curses=1; }
+#define MYSYS_PROGRAM_DONT_USE_CURSES() { error_handler_hook = my_message_no_curses; mysys_uses_curses=0;}
+#define MY_INIT(name); { my_progname= name; my_init(); }
+
+#define MAXMAPS (4) /* Number of error message maps */
+#define ERRMOD (1000) /* Max number of errors in a map */
+#define ERRMSGSIZE (SC_MAXWIDTH) /* Max length of a error message */
+#define NRERRBUFFS (2) /* Buffers for parameters */
+#define MY_FILE_ERROR ((uint) ~0)
+
+ /* General bitmaps for my_func's */
+#define MY_FFNF 1 /* Fatal if file not found */
+#define MY_FNABP 2 /* Fatal if not all bytes read/writen */
+#define MY_NABP 4 /* Error if not all bytes read/writen */
+#define MY_FAE 8 /* Fatal if any error */
+#define MY_WME 16 /* Write message on error */
+#define MY_WAIT_IF_FULL 32 /* Wait and try again if disk full error */
+#define MY_RAID 64 /* Support for RAID (not the "Johnson&Johnson"-s one ;) */
+#define MY_FULL_IO 512 /* For my_read - loop intil I/O
+ is complete
+ */
+#define MY_DONT_CHECK_FILESIZE 128 /* Option to init_io_cache() */
+#define MY_LINK_WARNING 32 /* my_redel() gives warning if links */
+#define MY_COPYTIME 64 /* my_redel() copys time */
+#define MY_DELETE_OLD 256 /* my_create_with_symlink() */
+#define MY_RESOLVE_LINK 128 /* my_realpath(); Only resolve links */
+#define MY_HOLD_ORIGINAL_MODES 128 /* my_copy() holds to file modes */
+#define MY_REDEL_MAKE_BACKUP 256
+#define MY_SEEK_NOT_DONE 32 /* my_lock may have to do a seek */
+#define MY_DONT_WAIT 64 /* my_lock() don't wait if can't lock */
+#define MY_ZEROFILL 32 /* my_malloc(), fill array with zero */
+#define MY_ALLOW_ZERO_PTR 64 /* my_realloc() ; zero ptr -> malloc */
+#define MY_FREE_ON_ERROR 128 /* my_realloc() ; Free old ptr on error */
+#define MY_HOLD_ON_ERROR 256 /* my_realloc() ; Return old ptr on error */
+#define MY_THREADSAFE 128 /* pread/pwrite: Don't allow interrupts */
+#define MY_DONT_OVERWRITE_FILE 1024 /* my_copy; Don't overwrite file */
+
+#define MY_CHECK_ERROR 1 /* Params to my_end; Check open-close */
+#define MY_GIVE_INFO 2 /* Give time info about process*/
+
+#define ME_HIGHBYTE 8 /* Shift for colours */
+#define ME_NOCUR 1 /* Don't use curses message */
+#define ME_OLDWIN 2 /* Use old window */
+#define ME_BELL 4 /* Ring bell then printing message */
+#define ME_HOLDTANG 8 /* Don't delete last keys */
+#define ME_WAITTOT 16 /* Wait for errtime secs of for a action */
+#define ME_WAITTANG 32 /* Wait for a user action */
+#define ME_NOREFRESH 64 /* Dont refresh screen */
+#define ME_NOINPUT 128 /* Dont use the input libary */
+#define ME_COLOUR1 ((1 << ME_HIGHBYTE)) /* Possibly error-colours */
+#define ME_COLOUR2 ((2 << ME_HIGHBYTE))
+#define ME_COLOUR3 ((3 << ME_HIGHBYTE))
+
+ /* Bits in last argument to fn_format */
+#define MY_REPLACE_DIR 1 /* replace dir in name with 'dir' */
+#define MY_REPLACE_EXT 2 /* replace extension with 'ext' */
+#define MY_UNPACK_FILENAME 4 /* Unpack name (~ -> home) */
+#define MY_PACK_FILENAME 8 /* Pack name (home -> ~) */
+#define MY_RESOLVE_SYMLINKS 16 /* Resolve all symbolic links */
+#define MY_RETURN_REAL_PATH 32 /* return full path for file */
+#define MY_SAFE_PATH 64 /* Return NULL if too long path */
+#define MY_RELATIVE_PATH 128 /* name is relative to 'dir' */
+
+ /* My seek flags */
+#define MY_SEEK_SET 0
+#define MY_SEEK_CUR 1
+#define MY_SEEK_END 2
+
+ /* Some constants */
+#define MY_WAIT_FOR_USER_TO_FIX_PANIC 60 /* in seconds */
+#define MY_WAIT_GIVE_USER_A_MESSAGE 10 /* Every 10 times of prev */
+#define MIN_COMPRESS_LENGTH 50 /* Don't compress small bl. */
+#define DFLT_INIT_HITS 3
+
+ /* root_alloc flags */
+#define MY_KEEP_PREALLOC 1
+#define MY_MARK_BLOCKS_FREE 2 /* move used to free list and reuse them */
+
+ /* Internal error numbers (for assembler functions) */
+#define MY_ERRNO_EDOM 33
+#define MY_ERRNO_ERANGE 34
+
+ /* defines when allocating data */
+#ifdef SAFEMALLOC
+#define my_malloc(SZ,FLAG) _mymalloc((SZ), __FILE__, __LINE__, FLAG )
+#define my_malloc_ci(SZ,FLAG) _mymalloc((SZ), sFile, uLine, FLAG )
+#define my_realloc(PTR,SZ,FLAG) _myrealloc((PTR), (SZ), __FILE__, __LINE__, FLAG )
+#define my_checkmalloc() _sanity( __FILE__, __LINE__ )
+#define my_free(PTR,FLAG) _myfree((PTR), __FILE__, __LINE__,FLAG)
+#define my_memdup(A,B,C) _my_memdup((A),(B), __FILE__,__LINE__,C)
+#define my_strdup(A,C) _my_strdup((A), __FILE__,__LINE__,C)
+#define my_strdup_with_length(A,B,C) _my_strdup_with_length((A),(B),__FILE__,__LINE__,C)
+#define QUICK_SAFEMALLOC sf_malloc_quick=1
+#define NORMAL_SAFEMALLOC sf_malloc_quick=0
+extern uint sf_malloc_prehunc,sf_malloc_endhunc,sf_malloc_quick;
+extern ulonglong sf_malloc_mem_limit;
+
+#define CALLER_INFO_PROTO , const char *sFile, uint uLine
+#define CALLER_INFO , __FILE__, __LINE__
+#define ORIG_CALLER_INFO , sFile, uLine
+#else
+#define my_checkmalloc()
+#undef TERMINATE
+#define TERMINATE(A) {}
+#define QUICK_SAFEMALLOC
+#define NORMAL_SAFEMALLOC
+extern gptr my_malloc(uint Size,myf MyFlags);
+#define my_malloc_ci(SZ,FLAG) my_malloc( SZ, FLAG )
+extern gptr my_realloc(gptr oldpoint,uint Size,myf MyFlags);
+extern void my_no_flags_free(gptr ptr);
+extern gptr my_memdup(const byte *from,uint length,myf MyFlags);
+extern char *my_strdup(const char *from,myf MyFlags);
+extern char *my_strdup_with_length(const byte *from, uint length,
+ myf MyFlags);
+#define my_free(PTR,FG) my_no_flags_free(PTR)
+#define CALLER_INFO_PROTO /* nothing */
+#define CALLER_INFO /* nothing */
+#define ORIG_CALLER_INFO /* nothing */
+#endif
+
+#ifdef HAVE_ALLOCA
+#if defined(_AIX) && !defined(__GNUC__) && !defined(_AIX43)
+#pragma alloca
+#endif /* _AIX */
+#if defined(__GNUC__) && !defined(HAVE_ALLOCA_H) && ! defined(alloca)
+#define alloca __builtin_alloca
+#endif /* GNUC */
+#define my_alloca(SZ) alloca((size_t) (SZ))
+#define my_afree(PTR) {}
+#else
+#define my_alloca(SZ) my_malloc(SZ,MYF(0))
+#define my_afree(PTR) my_free(PTR,MYF(MY_WME))
+#endif /* HAVE_ALLOCA */
+
+#ifdef MSDOS
+#ifdef __ZTC__
+void * __CDECL halloc(long count,size_t length);
+void __CDECL hfree(void *ptr);
+#endif
+#if defined(USE_HALLOC)
+#if defined(_VCM_) || defined(M_IC80386)
+#undef USE_HALLOC
+#endif
+#endif
+#ifdef USE_HALLOC
+#define malloc(a) halloc((long) (a),1)
+#define free(a) hfree(a)
+#endif
+#endif /* MSDOS */
+
+#ifdef HAVE_ERRNO_AS_DEFINE
+#include <errno.h> /* errno is a define */
+#else
+extern int errno; /* declare errno */
+#endif
+extern const char ** NEAR my_errmsg[];
+extern char NEAR errbuff[NRERRBUFFS][ERRMSGSIZE];
+extern char *home_dir; /* Home directory for user */
+extern char *my_progname; /* program-name (printed in errors) */
+extern char NEAR curr_dir[]; /* Current directory for user */
+extern int (*error_handler_hook)(uint my_err, const char *str,myf MyFlags);
+extern int (*fatal_error_handler_hook)(uint my_err, const char *str,
+ myf MyFlags);
+extern uint my_file_limit;
+
+/* charsets */
+extern CHARSET_INFO *default_charset_info;
+extern CHARSET_INFO *all_charsets[256];
+extern CHARSET_INFO compiled_charsets[];
+
+/* statistics */
+extern ulong my_cache_w_requests, my_cache_write, my_cache_r_requests,
+ my_cache_read;
+extern ulong my_blocks_used, my_blocks_changed;
+extern ulong my_file_opened,my_stream_opened, my_tmp_file_created;
+extern my_bool my_init_done;
+
+ /* Point to current my_message() */
+extern void (*my_sigtstp_cleanup)(void),
+ /* Executed before jump to shell */
+ (*my_sigtstp_restart)(void),
+ (*my_abort_hook)(int);
+ /* Executed when comming from shell */
+extern int NEAR my_umask, /* Default creation mask */
+ NEAR my_umask_dir,
+ NEAR my_recived_signals, /* Signals we have got */
+ NEAR my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */
+ NEAR my_dont_interrupt; /* call remember_intr when set */
+extern my_bool NEAR mysys_uses_curses, my_use_symdir;
+extern ulong sf_malloc_cur_memory, sf_malloc_max_memory;
+
+extern ulong my_default_record_cache_size;
+extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io,
+ NEAR my_disable_flush_key_blocks, NEAR my_disable_symlinks;
+extern char wild_many,wild_one,wild_prefix;
+extern const char *charsets_dir;
+extern char *defaults_extra_file;
+
+typedef struct wild_file_pack /* Struct to hold info when selecting files */
+{
+ uint wilds; /* How many wildcards */
+ uint not_pos; /* Start of not-theese-files */
+ my_string *wild; /* Pointer to wildcards */
+} WF_PACK;
+
+enum loglevel {
+ ERROR_LEVEL,
+ WARNING_LEVEL,
+ INFORMATION_LEVEL
+};
+
+enum cache_type
+{
+ READ_CACHE,WRITE_CACHE,
+ SEQ_READ_APPEND /* sequential read or append */,
+ READ_FIFO, READ_NET,WRITE_NET};
+
+enum flush_type
+{
+ FLUSH_KEEP, FLUSH_RELEASE, FLUSH_IGNORE_CHANGED, FLUSH_FORCE_WRITE
+};
+
+typedef struct st_record_cache /* Used when cacheing records */
+{
+ File file;
+ int rc_seek,error,inited;
+ uint rc_length,read_length,reclength;
+ my_off_t rc_record_pos,end_of_file;
+ byte *rc_buff,*rc_buff2,*rc_pos,*rc_end,*rc_request_pos;
+#ifdef HAVE_AIOWAIT
+ int use_async_io;
+ my_aio_result aio_result;
+#endif
+ enum cache_type type;
+} RECORD_CACHE;
+
+enum file_type
+{
+ UNOPEN = 0, FILE_BY_OPEN, FILE_BY_CREATE, STREAM_BY_FOPEN, STREAM_BY_FDOPEN,
+ FILE_BY_MKSTEMP, FILE_BY_DUP
+};
+
+struct st_my_file_info
+{
+ my_string name;
+ enum file_type type;
+#if defined(THREAD) && !defined(HAVE_PREAD)
+ pthread_mutex_t mutex;
+#endif
+};
+
+extern struct st_my_file_info *my_file_info;
+
+typedef struct st_my_tmpdir
+{
+ char **list;
+ uint cur, max;
+#ifdef THREAD
+ pthread_mutex_t mutex;
+#endif
+} MY_TMPDIR;
+
+typedef struct st_dynamic_array
+{
+ char *buffer;
+ uint elements,max_element;
+ uint alloc_increment;
+ uint size_of_element;
+} DYNAMIC_ARRAY;
+
+typedef struct st_dynamic_string
+{
+ char *str;
+ uint length,max_length,alloc_increment;
+} DYNAMIC_STRING;
+
+struct st_io_cache;
+typedef int (*IO_CACHE_CALLBACK)(struct st_io_cache*);
+
+#ifdef THREAD
+typedef struct st_io_cache_share
+{
+ /* to sync on reads into buffer */
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+ int count, total;
+ /* actual IO_CACHE that filled the buffer */
+ struct st_io_cache *active;
+#ifdef NOT_YET_IMPLEMENTED
+ /* whether the structure should be free'd */
+ my_bool alloced;
+#endif
+} IO_CACHE_SHARE;
+#endif
+
+typedef struct st_io_cache /* Used when cacheing files */
+{
+ /* Offset in file corresponding to the first byte of byte* buffer. */
+ my_off_t pos_in_file;
+ /*
+ The offset of end of file for READ_CACHE and WRITE_CACHE.
+ For SEQ_READ_APPEND it the maximum of the actual end of file and
+ the position represented by read_end.
+ */
+ my_off_t end_of_file;
+ /* Points to current read position in the buffer */
+ byte *read_pos;
+ /* the non-inclusive boundary in the buffer for the currently valid read */
+ byte *read_end;
+ byte *buffer; /* The read buffer */
+ /* Used in ASYNC_IO */
+ byte *request_pos;
+
+ /* Only used in WRITE caches and in SEQ_READ_APPEND to buffer writes */
+ byte *write_buffer;
+ /*
+ Only used in SEQ_READ_APPEND, and points to the current read position
+ in the write buffer. Note that reads in SEQ_READ_APPEND caches can
+ happen from both read buffer (byte* buffer) and write buffer
+ (byte* write_buffer).
+ */
+ byte *append_read_pos;
+ /* Points to current write position in the write buffer */
+ byte *write_pos;
+ /* The non-inclusive boundary of the valid write area */
+ byte *write_end;
+
+ /*
+ Current_pos and current_end are convenience variables used by
+ my_b_tell() and other routines that need to know the current offset
+ current_pos points to &write_pos, and current_end to &write_end in a
+ WRITE_CACHE, and &read_pos and &read_end respectively otherwise
+ */
+ byte **current_pos, **current_end;
+#ifdef THREAD
+ /*
+ The lock is for append buffer used in SEQ_READ_APPEND cache
+ need mutex copying from append buffer to read buffer.
+ */
+ pthread_mutex_t append_buffer_lock;
+ /*
+ The following is used when several threads are reading the
+ same file in parallel. They are synchronized on disk
+ accesses reading the cached part of the file asynchronously.
+ It should be set to NULL to disable the feature. Only
+ READ_CACHE mode is supported.
+ */
+ IO_CACHE_SHARE *share;
+#endif
+ /*
+ A caller will use my_b_read() macro to read from the cache
+ if the data is already in cache, it will be simply copied with
+ memcpy() and internal variables will be accordinging updated with
+ no functions invoked. However, if the data is not fully in the cache,
+ my_b_read() will call read_function to fetch the data. read_function
+ must never be invoked directly.
+ */
+ int (*read_function)(struct st_io_cache *,byte *,uint);
+ /*
+ Same idea as in the case of read_function, except my_b_write() needs to
+ be replaced with my_b_append() for a SEQ_READ_APPEND cache
+ */
+ int (*write_function)(struct st_io_cache *,const byte *,uint);
+ /*
+ Specifies the type of the cache. Depending on the type of the cache
+ certain operations might not be available and yield unpredicatable
+ results. Details to be documented later
+ */
+ enum cache_type type;
+ /*
+ Callbacks when the actual read I/O happens. These were added and
+ are currently used for binary logging of LOAD DATA INFILE - when a
+ block is read from the file, we create a block create/append event, and
+ when IO_CACHE is closed, we create an end event. These functions could,
+ of course be used for other things
+ */
+ IO_CACHE_CALLBACK pre_read;
+ IO_CACHE_CALLBACK post_read;
+ IO_CACHE_CALLBACK pre_close;
+ /*
+ Counts the number of times, when we were forced to use disk. We use it to
+ increase the binlog_cache_disk_use status variable.
+ */
+ ulong disk_writes;
+ void* arg; /* for use by pre/post_read */
+ char *file_name; /* if used with 'open_cached_file' */
+ char *dir,*prefix;
+ File file; /* file descriptor */
+ /*
+ seek_not_done is set by my_b_seek() to inform the upcoming read/write
+ operation that a seek needs to be preformed prior to the actual I/O
+ error is 0 if the cache operation was successful, -1 if there was a
+ "hard" error, and the actual number of I/O-ed bytes if the read/write was
+ partial.
+ */
+ int seek_not_done,error;
+ /* buffer_length is memory size allocated for buffer or write_buffer */
+ uint buffer_length;
+ /* read_length is the same as buffer_length except when we use async io */
+ uint read_length;
+ myf myflags; /* Flags used to my_read/my_write */
+ /*
+ alloced_buffer is 1 if the buffer was allocated by init_io_cache() and
+ 0 if it was supplied by the user.
+ Currently READ_NET is the only one that will use a buffer allocated
+ somewhere else
+ */
+ my_bool alloced_buffer;
+#ifdef HAVE_AIOWAIT
+ /*
+ As inidicated by ifdef, this is for async I/O, which is not currently
+ used (because it's not reliable on all systems)
+ */
+ uint inited;
+ my_off_t aio_read_pos;
+ my_aio_result aio_result;
+#endif
+} IO_CACHE;
+
+typedef int (*qsort2_cmp)(const void *, const void *, const void *);
+
+ /* defines for mf_iocache */
+
+ /* Test if buffer is inited */
+#define my_b_clear(info) (info)->buffer=0
+#define my_b_inited(info) (info)->buffer
+#define my_b_EOF INT_MIN
+
+#define my_b_read(info,Buffer,Count) \
+ ((info)->read_pos + (Count) <= (info)->read_end ?\
+ (memcpy(Buffer,(info)->read_pos,(size_t) (Count)), \
+ ((info)->read_pos+=(Count)),0) :\
+ (*(info)->read_function)((info),Buffer,Count))
+
+#define my_b_write(info,Buffer,Count) \
+ ((info)->write_pos + (Count) <=(info)->write_end ?\
+ (memcpy((info)->write_pos, (Buffer), (size_t)(Count)),\
+ ((info)->write_pos+=(Count)),0) : \
+ (*(info)->write_function)((info),(Buffer),(Count)))
+
+#define my_b_get(info) \
+ ((info)->read_pos != (info)->read_end ?\
+ ((info)->read_pos++, (int) (uchar) (info)->read_pos[-1]) :\
+ _my_b_get(info))
+
+ /* my_b_write_byte dosn't have any err-check */
+#define my_b_write_byte(info,chr) \
+ (((info)->write_pos < (info)->write_end) ?\
+ ((*(info)->write_pos++)=(chr)) :\
+ (_my_b_write(info,0,0) , ((*(info)->write_pos++)=(chr))))
+
+#define my_b_fill_cache(info) \
+ (((info)->read_end=(info)->read_pos),(*(info)->read_function)(info,0,0))
+
+#define my_b_tell(info) ((info)->pos_in_file + \
+ (uint) (*(info)->current_pos - (info)->request_pos))
+
+/* tell write offset in the SEQ_APPEND cache */
+my_off_t my_b_append_tell(IO_CACHE* info);
+
+#define my_b_bytes_in_cache(info) (uint) (*(info)->current_end - \
+ *(info)->current_pos)
+
+typedef uint32 ha_checksum;
+
+#include <my_alloc.h>
+
+ /* Prototypes for mysys and my_func functions */
+
+extern int my_copy(const char *from,const char *to,myf MyFlags);
+extern int my_append(const char *from,const char *to,myf MyFlags);
+extern int my_delete(const char *name,myf MyFlags);
+extern int my_getwd(my_string buf,uint size,myf MyFlags);
+extern int my_setwd(const char *dir,myf MyFlags);
+extern int my_lock(File fd,int op,my_off_t start, my_off_t length,myf MyFlags);
+extern gptr my_once_alloc(uint Size,myf MyFlags);
+extern void my_once_free(void);
+extern char *my_once_strdup(const char *src,myf myflags);
+extern char *my_once_memdup(const char *src, uint len, myf myflags);
+extern my_string my_tempnam(const char *dir,const char *pfx,myf MyFlags);
+extern File my_open(const char *FileName,int Flags,myf MyFlags);
+extern File my_register_filename(File fd, const char *FileName,
+ enum file_type type_of_file,
+ uint error_message_number, myf MyFlags);
+extern File my_create(const char *FileName,int CreateFlags,
+ int AccsesFlags, myf MyFlags);
+extern int my_close(File Filedes,myf MyFlags);
+extern File my_dup(File file, myf MyFlags);
+extern int my_mkdir(const char *dir, int Flags, myf MyFlags);
+extern int my_readlink(char *to, const char *filename, myf MyFlags);
+extern int my_realpath(char *to, const char *filename, myf MyFlags);
+extern File my_create_with_symlink(const char *linkname, const char *filename,
+ int createflags, int access_flags,
+ myf MyFlags);
+extern int my_delete_with_symlink(const char *name, myf MyFlags);
+extern int my_rename_with_symlink(const char *from,const char *to,myf MyFlags);
+extern int my_symlink(const char *content, const char *linkname, myf MyFlags);
+extern uint my_read(File Filedes,byte *Buffer,uint Count,myf MyFlags);
+extern uint my_pread(File Filedes,byte *Buffer,uint Count,my_off_t offset,
+ myf MyFlags);
+extern int my_rename(const char *from,const char *to,myf MyFlags);
+extern my_off_t my_seek(File fd,my_off_t pos,int whence,myf MyFlags);
+extern my_off_t my_tell(File fd,myf MyFlags);
+extern uint my_write(File Filedes,const byte *Buffer,uint Count,
+ myf MyFlags);
+extern uint my_pwrite(File Filedes,const byte *Buffer,uint Count,
+ my_off_t offset,myf MyFlags);
+extern uint my_fread(FILE *stream,byte *Buffer,uint Count,myf MyFlags);
+extern uint my_fwrite(FILE *stream,const byte *Buffer,uint Count,
+ myf MyFlags);
+extern my_off_t my_fseek(FILE *stream,my_off_t pos,int whence,myf MyFlags);
+extern my_off_t my_ftell(FILE *stream,myf MyFlags);
+extern gptr _mymalloc(uint uSize,const char *sFile,
+ uint uLine, myf MyFlag);
+extern gptr _myrealloc(gptr pPtr,uint uSize,const char *sFile,
+ uint uLine, myf MyFlag);
+extern gptr my_multi_malloc _VARARGS((myf MyFlags, ...));
+extern void _myfree(gptr pPtr,const char *sFile,uint uLine, myf MyFlag);
+extern int _sanity(const char *sFile,unsigned int uLine);
+extern gptr _my_memdup(const byte *from,uint length,
+ const char *sFile, uint uLine,myf MyFlag);
+extern my_string _my_strdup(const char *from, const char *sFile, uint uLine,
+ myf MyFlag);
+extern char *_my_strdup_with_length(const byte *from, uint length,
+ const char *sFile, uint uLine,
+ myf MyFlag);
+
+
+#ifndef TERMINATE
+extern void TERMINATE(FILE *file);
+#endif
+extern void init_glob_errs(void);
+extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags);
+extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags);
+extern int my_fclose(FILE *fd,myf MyFlags);
+extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags);
+extern int my_sync(File fd, myf my_flags);
+extern int my_error _VARARGS((int nr,myf MyFlags, ...));
+extern int my_printf_error _VARARGS((uint my_err, const char *format,
+ myf MyFlags, ...)
+ __attribute__ ((format (printf, 2, 4))));
+extern int my_message(uint my_err, const char *str,myf MyFlags);
+extern int my_message_no_curses(uint my_err, const char *str,myf MyFlags);
+extern int my_message_curses(uint my_err, const char *str,myf MyFlags);
+extern my_bool my_init(void);
+extern void my_end(int infoflag);
+extern int my_redel(const char *from, const char *to, int MyFlags);
+extern int my_copystat(const char *from, const char *to, int MyFlags);
+extern my_string my_filename(File fd);
+
+#ifndef THREAD
+extern void dont_break(void);
+extern void allow_break(void);
+#else
+#define dont_break()
+#define allow_break()
+#endif
+
+extern my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist);
+extern char *my_tmpdir(MY_TMPDIR *tmpdir);
+extern void free_tmpdir(MY_TMPDIR *tmpdir);
+
+extern void my_remember_signal(int signal_number,sig_handler (*func)(int));
+extern uint dirname_part(my_string to,const char *name);
+extern uint dirname_length(const char *name);
+#define base_name(A) (A+dirname_length(A))
+extern int test_if_hard_path(const char *dir_name);
+extern char *convert_dirname(char *to, const char *from, const char *from_end);
+extern void to_unix_path(my_string name);
+extern my_string fn_ext(const char *name);
+extern my_string fn_same(my_string toname,const char *name,int flag);
+extern my_string fn_format(my_string to,const char *name,const char *dir,
+ const char *form, uint flag);
+extern size_s strlength(const char *str);
+extern void pack_dirname(my_string to,const char *from);
+extern uint unpack_dirname(my_string to,const char *from);
+extern uint cleanup_dirname(my_string to,const char *from);
+extern uint system_filename(my_string to,const char *from);
+extern uint unpack_filename(my_string to,const char *from);
+extern my_string intern_filename(my_string to,const char *from);
+extern my_string directory_file_name(my_string dst, const char *src);
+extern int pack_filename(my_string to, const char *name, size_s max_length);
+extern my_string my_path(my_string to,const char *progname,
+ const char *own_pathname_part);
+extern my_string my_load_path(my_string to, const char *path,
+ const char *own_path_prefix);
+extern int wild_compare(const char *str,const char *wildstr,pbool str_is_pattern);
+extern WF_PACK *wf_comp(my_string str);
+extern int wf_test(struct wild_file_pack *wf_pack,const char *name);
+extern void wf_end(struct wild_file_pack *buffer);
+extern size_s strip_sp(my_string str);
+extern void get_date(my_string to,int timeflag,time_t use_time);
+extern void soundex(CHARSET_INFO *, my_string out_pntr, my_string in_pntr,pbool remove_garbage);
+extern int init_record_cache(RECORD_CACHE *info,uint cachesize,File file,
+ uint reclength,enum cache_type type,
+ pbool use_async_io);
+extern int read_cache_record(RECORD_CACHE *info,byte *to);
+extern int end_record_cache(RECORD_CACHE *info);
+extern int write_cache_record(RECORD_CACHE *info,my_off_t filepos,
+ const byte *record,uint length);
+extern int flush_write_cache(RECORD_CACHE *info);
+extern long my_clock(void);
+extern sig_handler sigtstp_handler(int signal_number);
+extern void handle_recived_signals(void);
+
+extern sig_handler my_set_alarm_variable(int signo);
+extern void my_string_ptr_sort(void *base,uint items,size_s size);
+extern void radixsort_for_str_ptr(uchar* base[], uint number_of_elements,
+ size_s size_of_element,uchar *buffer[]);
+extern qsort_t qsort2(void *base_ptr, size_t total_elems, size_t size,
+ qsort2_cmp cmp, void *cmp_argument);
+extern qsort2_cmp get_ptr_compare(uint);
+extern int init_io_cache(IO_CACHE *info,File file,uint cachesize,
+ enum cache_type type,my_off_t seek_offset,
+ pbool use_async_io, myf cache_myflags);
+extern my_bool reinit_io_cache(IO_CACHE *info,enum cache_type type,
+ my_off_t seek_offset,pbool use_async_io,
+ pbool clear_cache);
+extern int _my_b_read(IO_CACHE *info,byte *Buffer,uint Count);
+#ifdef THREAD
+extern int _my_b_read_r(IO_CACHE *info,byte *Buffer,uint Count);
+extern void init_io_cache_share(IO_CACHE *info,
+ IO_CACHE_SHARE *s, uint num_threads);
+extern void remove_io_thread(IO_CACHE *info);
+#endif
+extern int _my_b_seq_read(IO_CACHE *info,byte *Buffer,uint Count);
+extern int _my_b_net_read(IO_CACHE *info,byte *Buffer,uint Count);
+extern int _my_b_get(IO_CACHE *info);
+extern int _my_b_async_read(IO_CACHE *info,byte *Buffer,uint Count);
+extern int _my_b_write(IO_CACHE *info,const byte *Buffer,uint Count);
+extern int my_b_append(IO_CACHE *info,const byte *Buffer,uint Count);
+extern int my_b_safe_write(IO_CACHE *info,const byte *Buffer,uint Count);
+
+extern int my_block_write(IO_CACHE *info, const byte *Buffer,
+ uint Count, my_off_t pos);
+extern int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock);
+
+#define flush_io_cache(info) my_b_flush_io_cache((info),1)
+
+extern int end_io_cache(IO_CACHE *info);
+extern uint my_b_fill(IO_CACHE *info);
+extern void my_b_seek(IO_CACHE *info,my_off_t pos);
+extern uint my_b_gets(IO_CACHE *info, char *to, uint max_length);
+extern my_off_t my_b_filelength(IO_CACHE *info);
+extern uint my_b_printf(IO_CACHE *info, const char* fmt, ...);
+extern uint my_b_vprintf(IO_CACHE *info, const char* fmt, va_list ap);
+extern my_bool open_cached_file(IO_CACHE *cache,const char *dir,
+ const char *prefix, uint cache_size,
+ myf cache_myflags);
+extern my_bool real_open_cached_file(IO_CACHE *cache);
+extern void close_cached_file(IO_CACHE *cache);
+File create_temp_file(char *to, const char *dir, const char *pfx,
+ int mode, myf MyFlags);
+#define my_init_dynamic_array(A,B,C,D) init_dynamic_array(A,B,C,D CALLER_INFO)
+#define my_init_dynamic_array_ci(A,B,C,D) init_dynamic_array(A,B,C,D ORIG_CALLER_INFO)
+extern my_bool init_dynamic_array(DYNAMIC_ARRAY *array,uint element_size,
+ uint init_alloc,uint alloc_increment CALLER_INFO_PROTO);
+extern my_bool insert_dynamic(DYNAMIC_ARRAY *array,gptr element);
+extern byte *alloc_dynamic(DYNAMIC_ARRAY *array);
+extern byte *pop_dynamic(DYNAMIC_ARRAY*);
+extern my_bool set_dynamic(DYNAMIC_ARRAY *array,gptr element,uint array_index);
+extern void get_dynamic(DYNAMIC_ARRAY *array,gptr element,uint array_index);
+extern void delete_dynamic(DYNAMIC_ARRAY *array);
+extern void delete_dynamic_element(DYNAMIC_ARRAY *array, uint array_index);
+extern void freeze_size(DYNAMIC_ARRAY *array);
+#define dynamic_array_ptr(array,array_index) ((array)->buffer+(array_index)*(array)->size_of_element)
+#define dynamic_element(array,array_index,type) ((type)((array)->buffer) +(array_index))
+#define push_dynamic(A,B) insert_dynamic(A,B)
+#define reset_dynamic(array) ((array)->elements= 0)
+
+extern my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str,
+ uint init_alloc,uint alloc_increment);
+extern my_bool dynstr_append(DYNAMIC_STRING *str, const char *append);
+my_bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append,
+ uint length);
+extern my_bool dynstr_set(DYNAMIC_STRING *str, const char *init_str);
+extern my_bool dynstr_realloc(DYNAMIC_STRING *str, ulong additional_size);
+extern void dynstr_free(DYNAMIC_STRING *str);
+#ifdef HAVE_MLOCK
+extern byte *my_malloc_lock(uint length,myf flags);
+extern void my_free_lock(byte *ptr,myf flags);
+#else
+#define my_malloc_lock(A,B) my_malloc((A),(B))
+#define my_free_lock(A,B) my_free((A),(B))
+#endif
+#define alloc_root_inited(A) ((A)->min_malloc != 0)
+#define ALLOC_ROOT_MIN_BLOCK_SIZE (MALLOC_OVERHEAD + sizeof(USED_MEM) + 8)
+#define clear_alloc_root(A) do { (A)->free= (A)->used= (A)->pre_alloc= 0; (A)->min_malloc=0;} while(0)
+extern void init_alloc_root(MEM_ROOT *mem_root, uint block_size,
+ uint pre_alloc_size);
+extern gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size);
+extern void free_root(MEM_ROOT *root, myf MyFLAGS);
+extern void set_prealloc_root(MEM_ROOT *root, char *ptr);
+extern void reset_root_defaults(MEM_ROOT *mem_root, uint block_size,
+ uint prealloc_size);
+extern char *strdup_root(MEM_ROOT *root,const char *str);
+extern char *strmake_root(MEM_ROOT *root,const char *str,uint len);
+extern char *memdup_root(MEM_ROOT *root,const char *str,uint len);
+extern int load_defaults(const char *conf_file, const char **groups,
+ int *argc, char ***argv);
+extern void free_defaults(char **argv);
+extern void print_defaults(const char *conf_file, const char **groups);
+extern my_bool my_compress(byte *, ulong *, ulong *);
+extern my_bool my_uncompress(byte *, ulong *, ulong *);
+extern byte *my_compress_alloc(const byte *packet, ulong *len, ulong *complen);
+extern ha_checksum my_checksum(ha_checksum crc, const byte *mem, uint count);
+extern uint my_bit_log2(ulong value);
+extern uint my_count_bits(ulonglong v);
+extern void my_sleep(ulong m_seconds);
+extern ulong crc32(ulong crc, const uchar *buf, uint len);
+extern uint my_set_max_open_files(uint files);
+void my_free_open_file_info(void);
+
+ulonglong my_getsystime(void);
+my_bool my_gethwaddr(uchar *to);
+
+/* character sets */
+extern uint get_charset_number(const char *cs_name, uint cs_flags);
+extern uint get_collation_number(const char *name);
+extern const char *get_charset_name(uint cs_number);
+
+extern CHARSET_INFO *get_charset(uint cs_number, myf flags);
+extern CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags);
+extern CHARSET_INFO *get_charset_by_csname(const char *cs_name,
+ uint cs_flags, myf my_flags);
+extern void free_charsets(void);
+extern char *get_charsets_dir(char *buf);
+extern my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2);
+extern my_bool init_compiled_charsets(myf flags);
+extern void add_compiled_collation(CHARSET_INFO *cs);
+extern ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to,
+ const char *from, ulong length);
+
+#ifdef __WIN__
+extern my_bool have_tcpip; /* Is set if tcpip is used */
+#endif
+#ifdef __NETWARE__
+void netware_reg_user(const char *ip, const char *user,
+ const char *application);
+#endif
+
+C_MODE_END
+#include "raid.h"
+#endif /* _my_sys_h */
diff --git a/src/terralib/drivers/MySQL/include/mysql.h b/src/terralib/drivers/MySQL/include/mysql.h
new file mode 100644
index 0000000..1c88602
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/mysql.h
@@ -0,0 +1,742 @@
+/* Copyright (C) 2000-2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifndef _mysql_h
+#define _mysql_h
+
+#ifdef __CYGWIN__ /* CYGWIN implements a UNIX API */
+#undef WIN
+#undef _WIN
+#undef _WIN32
+#undef _WIN64
+#undef __WIN__
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _global_h /* If not standard header */
+#include <sys/types.h>
+#ifdef __LCC__
+#include <winsock.h> /* For windows */
+#endif
+typedef char my_bool;
+#if (defined(_WIN32) || defined(_WIN64)) && !defined(__WIN__)
+#define __WIN__
+#endif
+#if !defined(__WIN__)
+#define STDCALL
+#else
+#define STDCALL __stdcall
+#endif
+typedef char * gptr;
+
+#ifndef my_socket_defined
+#ifdef __WIN__
+#define my_socket SOCKET
+#else
+typedef int my_socket;
+#endif /* __WIN__ */
+#endif /* my_socket_defined */
+#endif /* _global_h */
+
+#include "mysql_com.h"
+#include "mysql_time.h"
+#include "mysql_version.h"
+#include "typelib.h"
+
+#include "my_list.h" /* for LISTs used in 'MYSQL' and 'MYSQL_STMT' */
+
+extern unsigned int mysql_port;
+extern char *mysql_unix_port;
+
+#define CLIENT_NET_READ_TIMEOUT 365*24*3600 /* Timeout on read */
+#define CLIENT_NET_WRITE_TIMEOUT 365*24*3600 /* Timeout on write */
+
+#ifdef __NETWARE__
+#pragma pack(push, 8) /* 8 byte alignment */
+#endif
+
+#define IS_PRI_KEY(n) ((n) & PRI_KEY_FLAG)
+#define IS_NOT_NULL(n) ((n) & NOT_NULL_FLAG)
+#define IS_BLOB(n) ((n) & BLOB_FLAG)
+#define IS_NUM(t) ((t) <= FIELD_TYPE_INT24 || (t) == FIELD_TYPE_YEAR)
+#define IS_NUM_FIELD(f) ((f)->flags & NUM_FLAG)
+#define INTERNAL_NUM_FIELD(f) (((f)->type <= FIELD_TYPE_INT24 && ((f)->type != FIELD_TYPE_TIMESTAMP || (f)->length == 14 || (f)->length == 8)) || (f)->type == FIELD_TYPE_YEAR)
+
+
+typedef struct st_mysql_field {
+ char *name; /* Name of column */
+ char *org_name; /* Original column name, if an alias */
+ char *table; /* Table of column if column was a field */
+ char *org_table; /* Org table name, if table was an alias */
+ char *db; /* Database for table */
+ char *catalog; /* Catalog for table */
+ char *def; /* Default value (set by mysql_list_fields) */
+ unsigned long length; /* Width of column (create length) */
+ unsigned long max_length; /* Max width for selected set */
+ unsigned int name_length;
+ unsigned int org_name_length;
+ unsigned int table_length;
+ unsigned int org_table_length;
+ unsigned int db_length;
+ unsigned int catalog_length;
+ unsigned int def_length;
+ unsigned int flags; /* Div flags */
+ unsigned int decimals; /* Number of decimals in field */
+ unsigned int charsetnr; /* Character set */
+ enum enum_field_types type; /* Type of field. See mysql_com.h for types */
+} MYSQL_FIELD;
+
+typedef char **MYSQL_ROW; /* return data as array of strings */
+typedef unsigned int MYSQL_FIELD_OFFSET; /* offset to current field */
+
+#ifndef _global_h
+#if defined(NO_CLIENT_LONG_LONG)
+typedef unsigned long my_ulonglong;
+#elif defined (__WIN__)
+typedef unsigned __int64 my_ulonglong;
+#else
+typedef unsigned long long my_ulonglong;
+#endif
+#endif
+
+#define MYSQL_COUNT_ERROR (~(my_ulonglong) 0)
+
+typedef struct st_mysql_rows {
+ struct st_mysql_rows *next; /* list of rows */
+ MYSQL_ROW data;
+ unsigned long length;
+} MYSQL_ROWS;
+
+typedef MYSQL_ROWS *MYSQL_ROW_OFFSET; /* offset to current row */
+
+#include "my_alloc.h"
+
+typedef struct st_mysql_data {
+ my_ulonglong rows;
+ unsigned int fields;
+ MYSQL_ROWS *data;
+ MEM_ROOT alloc;
+#if !defined(CHECK_EMBEDDED_DIFFERENCES) || defined(EMBEDDED_LIBRARY)
+ MYSQL_ROWS **prev_ptr;
+#endif
+} MYSQL_DATA;
+
+enum mysql_option
+{
+ MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE,
+ MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP,
+ MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE,
+ MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT,
+ MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT,
+ MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
+ MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH
+};
+
+struct st_mysql_options {
+ unsigned int connect_timeout, read_timeout, write_timeout;
+ unsigned int port, protocol;
+ unsigned long client_flag;
+ char *host,*user,*password,*unix_socket,*db;
+ struct st_dynamic_array *init_commands;
+ char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name;
+ char *ssl_key; /* PEM key file */
+ char *ssl_cert; /* PEM cert file */
+ char *ssl_ca; /* PEM CA file */
+ char *ssl_capath; /* PEM directory of CA-s? */
+ char *ssl_cipher; /* cipher to use */
+ char *shared_memory_base_name;
+ unsigned long max_allowed_packet;
+ my_bool use_ssl; /* if to use SSL or not */
+ my_bool compress,named_pipe;
+ /*
+ On connect, find out the replication role of the server, and
+ establish connections to all the peers
+ */
+ my_bool rpl_probe;
+ /*
+ Each call to mysql_real_query() will parse it to tell if it is a read
+ or a write, and direct it to the slave or the master
+ */
+ my_bool rpl_parse;
+ /*
+ If set, never read from a master, only from slave, when doing
+ a read that is replication-aware
+ */
+ my_bool no_master_reads;
+#if !defined(CHECK_EMBEDDED_DIFFERENCES) || defined(EMBEDDED_LIBRARY)
+ my_bool separate_thread;
+#endif
+ enum mysql_option methods_to_use;
+ char *client_ip;
+ /* Refuse client connecting to server if it uses old (pre-4.1.1) protocol */
+ my_bool secure_auth;
+
+ /* function pointers for local infile support */
+ int (*local_infile_init)(void **, const char *, void *);
+ int (*local_infile_read)(void *, char *, unsigned int);
+ void (*local_infile_end)(void *);
+ int (*local_infile_error)(void *, char *, unsigned int);
+ void *local_infile_userdata;
+};
+
+enum mysql_status
+{
+ MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,MYSQL_STATUS_USE_RESULT
+};
+
+enum mysql_protocol_type
+{
+ MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET,
+ MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY
+};
+/*
+ There are three types of queries - the ones that have to go to
+ the master, the ones that go to a slave, and the adminstrative
+ type which must happen on the pivot connectioin
+*/
+enum mysql_rpl_type
+{
+ MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN
+};
+
+struct st_mysql_methods;
+
+typedef struct st_mysql
+{
+ NET net; /* Communication parameters */
+ gptr connector_fd; /* ConnectorFd for SSL */
+ char *host,*user,*passwd,*unix_socket,*server_version,*host_info,*info;
+ char *db;
+ struct charset_info_st *charset;
+ MYSQL_FIELD *fields;
+ MEM_ROOT field_alloc;
+ my_ulonglong affected_rows;
+ my_ulonglong insert_id; /* id if insert on table with NEXTNR */
+ my_ulonglong extra_info; /* Used by mysqlshow */
+ unsigned long thread_id; /* Id for connection in server */
+ unsigned long packet_length;
+ unsigned int port;
+ unsigned long client_flag,server_capabilities;
+ unsigned int protocol_version;
+ unsigned int field_count;
+ unsigned int server_status;
+ unsigned int server_language;
+ unsigned int warning_count;
+ struct st_mysql_options options;
+ enum mysql_status status;
+ my_bool free_me; /* If free in mysql_close */
+ my_bool reconnect; /* set to 1 if automatic reconnect */
+
+ /* session-wide random string */
+ char scramble[SCRAMBLE_LENGTH+1];
+
+ /*
+ Set if this is the original connection, not a master or a slave we have
+ added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave()
+ */
+ my_bool rpl_pivot;
+ /*
+ Pointers to the master, and the next slave connections, points to
+ itself if lone connection.
+ */
+ struct st_mysql* master, *next_slave;
+
+ struct st_mysql* last_used_slave; /* needed for round-robin slave pick */
+ /* needed for send/read/store/use result to work correctly with replication */
+ struct st_mysql* last_used_con;
+
+ LIST *stmts; /* list of all statements */
+ const struct st_mysql_methods *methods;
+ void *thd;
+ /*
+ Points to boolean flag in MYSQL_RES or MYSQL_STMT. We set this flag
+ from mysql_stmt_close if close had to cancel result set of this object.
+ */
+ my_bool *unbuffered_fetch_owner;
+} MYSQL;
+
+typedef struct st_mysql_res {
+ my_ulonglong row_count;
+ MYSQL_FIELD *fields;
+ MYSQL_DATA *data;
+ MYSQL_ROWS *data_cursor;
+ unsigned long *lengths; /* column lengths of current row */
+ MYSQL *handle; /* for unbuffered reads */
+ MEM_ROOT field_alloc;
+ unsigned int field_count, current_field;
+ MYSQL_ROW row; /* If unbuffered read */
+ MYSQL_ROW current_row; /* buffer to current row */
+ my_bool eof; /* Used by mysql_fetch_row */
+ /* mysql_stmt_close() had to cancel this result */
+ my_bool unbuffered_fetch_cancelled;
+ const struct st_mysql_methods *methods;
+} MYSQL_RES;
+
+#define MAX_MYSQL_MANAGER_ERR 256
+#define MAX_MYSQL_MANAGER_MSG 256
+
+#define MANAGER_OK 200
+#define MANAGER_INFO 250
+#define MANAGER_ACCESS 401
+#define MANAGER_CLIENT_ERR 450
+#define MANAGER_INTERNAL_ERR 500
+
+#if !defined(MYSQL_SERVER) && !defined(MYSQL_CLIENT)
+#define MYSQL_CLIENT
+#endif
+
+
+typedef struct st_mysql_manager
+{
+ NET net;
+ char *host,*user,*passwd;
+ unsigned int port;
+ my_bool free_me;
+ my_bool eof;
+ int cmd_status;
+ int last_errno;
+ char* net_buf,*net_buf_pos,*net_data_end;
+ int net_buf_size;
+ char last_error[MAX_MYSQL_MANAGER_ERR];
+} MYSQL_MANAGER;
+
+typedef struct st_mysql_parameters
+{
+ unsigned long *p_max_allowed_packet;
+ unsigned long *p_net_buffer_length;
+} MYSQL_PARAMETERS;
+
+#if !defined(MYSQL_SERVER) && !defined(EMBEDDED_LIBRARY)
+#define max_allowed_packet (*mysql_get_parameters()->p_max_allowed_packet)
+#define net_buffer_length (*mysql_get_parameters()->p_net_buffer_length)
+#endif
+
+/*
+ Set up and bring down the server; to ensure that applications will
+ work when linked against either the standard client library or the
+ embedded server library, these functions should be called.
+*/
+int STDCALL mysql_server_init(int argc, char **argv, char **groups);
+void STDCALL mysql_server_end(void);
+
+MYSQL_PARAMETERS *STDCALL mysql_get_parameters(void);
+
+/*
+ Set up and bring down a thread; these function should be called
+ for each thread in an application which opens at least one MySQL
+ connection. All uses of the connection(s) should be between these
+ function calls.
+*/
+my_bool STDCALL mysql_thread_init(void);
+void STDCALL mysql_thread_end(void);
+
+/*
+ Functions to get information from the MYSQL and MYSQL_RES structures
+ Should definitely be used if one uses shared libraries.
+*/
+
+my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);
+unsigned int STDCALL mysql_num_fields(MYSQL_RES *res);
+my_bool STDCALL mysql_eof(MYSQL_RES *res);
+MYSQL_FIELD *STDCALL mysql_fetch_field_direct(MYSQL_RES *res,
+ unsigned int fieldnr);
+MYSQL_FIELD * STDCALL mysql_fetch_fields(MYSQL_RES *res);
+MYSQL_ROW_OFFSET STDCALL mysql_row_tell(MYSQL_RES *res);
+MYSQL_FIELD_OFFSET STDCALL mysql_field_tell(MYSQL_RES *res);
+
+unsigned int STDCALL mysql_field_count(MYSQL *mysql);
+my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql);
+my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql);
+unsigned int STDCALL mysql_errno(MYSQL *mysql);
+const char * STDCALL mysql_error(MYSQL *mysql);
+const char *STDCALL mysql_sqlstate(MYSQL *mysql);
+unsigned int STDCALL mysql_warning_count(MYSQL *mysql);
+const char * STDCALL mysql_info(MYSQL *mysql);
+unsigned long STDCALL mysql_thread_id(MYSQL *mysql);
+const char * STDCALL mysql_character_set_name(MYSQL *mysql);
+
+MYSQL * STDCALL mysql_init(MYSQL *mysql);
+my_bool STDCALL mysql_ssl_set(MYSQL *mysql, const char *key,
+ const char *cert, const char *ca,
+ const char *capath, const char *cipher);
+my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
+ const char *passwd, const char *db);
+MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
+ const char *user,
+ const char *passwd,
+ const char *db,
+ unsigned int port,
+ const char *unix_socket,
+ unsigned long clientflag);
+int STDCALL mysql_select_db(MYSQL *mysql, const char *db);
+int STDCALL mysql_query(MYSQL *mysql, const char *q);
+int STDCALL mysql_send_query(MYSQL *mysql, const char *q,
+ unsigned long length);
+int STDCALL mysql_real_query(MYSQL *mysql, const char *q,
+ unsigned long length);
+MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
+MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);
+
+/* perform query on master */
+my_bool STDCALL mysql_master_query(MYSQL *mysql, const char *q,
+ unsigned long length);
+my_bool STDCALL mysql_master_send_query(MYSQL *mysql, const char *q,
+ unsigned long length);
+/* perform query on slave */
+my_bool STDCALL mysql_slave_query(MYSQL *mysql, const char *q,
+ unsigned long length);
+my_bool STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q,
+ unsigned long length);
+
+/* local infile support */
+
+#define LOCAL_INFILE_ERROR_LEN 512
+
+void
+mysql_set_local_infile_handler(MYSQL *mysql,
+ int (*local_infile_init)(void **, const char *,
+ void *),
+ int (*local_infile_read)(void *, char *,
+ unsigned int),
+ void (*local_infile_end)(void *),
+ int (*local_infile_error)(void *, char*,
+ unsigned int),
+ void *);
+
+void
+mysql_set_local_infile_default(MYSQL *mysql);
+
+
+/*
+ enable/disable parsing of all queries to decide if they go on master or
+ slave
+*/
+void STDCALL mysql_enable_rpl_parse(MYSQL* mysql);
+void STDCALL mysql_disable_rpl_parse(MYSQL* mysql);
+/* get the value of the parse flag */
+int STDCALL mysql_rpl_parse_enabled(MYSQL* mysql);
+
+/* enable/disable reads from master */
+void STDCALL mysql_enable_reads_from_master(MYSQL* mysql);
+void STDCALL mysql_disable_reads_from_master(MYSQL* mysql);
+/* get the value of the master read flag */
+my_bool STDCALL mysql_reads_from_master_enabled(MYSQL* mysql);
+
+enum mysql_rpl_type STDCALL mysql_rpl_query_type(const char* q, int len);
+
+/* discover the master and its slaves */
+my_bool STDCALL mysql_rpl_probe(MYSQL* mysql);
+
+/* set the master, close/free the old one, if it is not a pivot */
+int STDCALL mysql_set_master(MYSQL* mysql, const char* host,
+ unsigned int port,
+ const char* user,
+ const char* passwd);
+int STDCALL mysql_add_slave(MYSQL* mysql, const char* host,
+ unsigned int port,
+ const char* user,
+ const char* passwd);
+
+int STDCALL mysql_shutdown(MYSQL *mysql,
+ enum mysql_enum_shutdown_level
+ shutdown_level);
+int STDCALL mysql_dump_debug_info(MYSQL *mysql);
+int STDCALL mysql_refresh(MYSQL *mysql,
+ unsigned int refresh_options);
+int STDCALL mysql_kill(MYSQL *mysql,unsigned long pid);
+int STDCALL mysql_set_server_option(MYSQL *mysql,
+ enum enum_mysql_set_option
+ option);
+int STDCALL mysql_ping(MYSQL *mysql);
+const char * STDCALL mysql_stat(MYSQL *mysql);
+const char * STDCALL mysql_get_server_info(MYSQL *mysql);
+const char * STDCALL mysql_get_client_info(void);
+unsigned long STDCALL mysql_get_client_version(void);
+const char * STDCALL mysql_get_host_info(MYSQL *mysql);
+unsigned long STDCALL mysql_get_server_version(MYSQL *mysql);
+unsigned int STDCALL mysql_get_proto_info(MYSQL *mysql);
+MYSQL_RES * STDCALL mysql_list_dbs(MYSQL *mysql,const char *wild);
+MYSQL_RES * STDCALL mysql_list_tables(MYSQL *mysql,const char *wild);
+MYSQL_RES * STDCALL mysql_list_processes(MYSQL *mysql);
+int STDCALL mysql_options(MYSQL *mysql,enum mysql_option option,
+ const char *arg);
+void STDCALL mysql_free_result(MYSQL_RES *result);
+void STDCALL mysql_data_seek(MYSQL_RES *result,
+ my_ulonglong offset);
+MYSQL_ROW_OFFSET STDCALL mysql_row_seek(MYSQL_RES *result,
+ MYSQL_ROW_OFFSET offset);
+MYSQL_FIELD_OFFSET STDCALL mysql_field_seek(MYSQL_RES *result,
+ MYSQL_FIELD_OFFSET offset);
+MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
+unsigned long * STDCALL mysql_fetch_lengths(MYSQL_RES *result);
+MYSQL_FIELD * STDCALL mysql_fetch_field(MYSQL_RES *result);
+MYSQL_RES * STDCALL mysql_list_fields(MYSQL *mysql, const char *table,
+ const char *wild);
+unsigned long STDCALL mysql_escape_string(char *to,const char *from,
+ unsigned long from_length);
+unsigned long STDCALL mysql_real_escape_string(MYSQL *mysql,
+ char *to,const char *from,
+ unsigned long length);
+void STDCALL mysql_debug(const char *debug);
+char * STDCALL mysql_odbc_escape_string(MYSQL *mysql,
+ char *to,
+ unsigned long to_length,
+ const char *from,
+ unsigned long from_length,
+ void *param,
+ char *
+ (*extend_buffer)
+ (void *, char *to,
+ unsigned long *length));
+void STDCALL myodbc_remove_escape(MYSQL *mysql,char *name);
+unsigned int STDCALL mysql_thread_safe(void);
+my_bool STDCALL mysql_embedded(void);
+MYSQL_MANAGER* STDCALL mysql_manager_init(MYSQL_MANAGER* con);
+MYSQL_MANAGER* STDCALL mysql_manager_connect(MYSQL_MANAGER* con,
+ const char* host,
+ const char* user,
+ const char* passwd,
+ unsigned int port);
+void STDCALL mysql_manager_close(MYSQL_MANAGER* con);
+int STDCALL mysql_manager_command(MYSQL_MANAGER* con,
+ const char* cmd, int cmd_len);
+int STDCALL mysql_manager_fetch_line(MYSQL_MANAGER* con,
+ char* res_buf,
+ int res_buf_size);
+my_bool STDCALL mysql_read_query_result(MYSQL *mysql);
+
+
+/*
+ The following definitions are added for the enhanced
+ client-server protocol
+*/
+
+/* statement state */
+enum enum_mysql_stmt_state
+{
+ MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE,
+ MYSQL_STMT_FETCH_DONE
+};
+
+
+/* bind structure */
+typedef struct st_mysql_bind
+{
+ unsigned long *length; /* output length pointer */
+ my_bool *is_null; /* Pointer to null indicator */
+ void *buffer; /* buffer to get/put data */
+ enum enum_field_types buffer_type; /* buffer type */
+ unsigned long buffer_length; /* buffer length, must be set for str/binary */
+
+ /* Following are for internal use. Set by mysql_stmt_bind_param */
+ unsigned char *inter_buffer; /* for the current data position */
+ unsigned long offset; /* offset position for char/binary fetch */
+ unsigned long internal_length; /* Used if length is 0 */
+ unsigned int param_number; /* For null count and error messages */
+ unsigned int pack_length; /* Internal length for packed data */
+ my_bool is_unsigned; /* set if integer type is unsigned */
+ my_bool long_data_used; /* If used with mysql_send_long_data */
+ my_bool internal_is_null; /* Used if is_null is 0 */
+ void (*store_param_func)(NET *net, struct st_mysql_bind *param);
+ void (*fetch_result)(struct st_mysql_bind *, unsigned char **row);
+ void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *,
+ unsigned char **row);
+} MYSQL_BIND;
+
+
+/* statement handler */
+typedef struct st_mysql_stmt
+{
+ MEM_ROOT mem_root; /* root allocations */
+ LIST list; /* list to keep track of all stmts */
+ MYSQL *mysql; /* connection handle */
+ MYSQL_BIND *params; /* input parameters */
+ MYSQL_BIND *bind; /* output parameters */
+ MYSQL_FIELD *fields; /* result set metadata */
+ MYSQL_DATA result; /* cached result set */
+ MYSQL_ROWS *data_cursor; /* current row in cached result */
+ /* copy of mysql->affected_rows after statement execution */
+ my_ulonglong affected_rows;
+ my_ulonglong insert_id; /* copy of mysql->insert_id */
+ /*
+ mysql_stmt_fetch() calls this function to fetch one row (it's different
+ for buffered, unbuffered and cursor fetch).
+ */
+ int (*read_row_func)(struct st_mysql_stmt *stmt,
+ unsigned char **row);
+ unsigned long stmt_id; /* Id for prepared statement */
+ unsigned int last_errno; /* error code */
+ unsigned int param_count; /* input parameter count */
+ unsigned int field_count; /* number of columns in result set */
+ enum enum_mysql_stmt_state state; /* statement state */
+ char last_error[MYSQL_ERRMSG_SIZE]; /* error message */
+ char sqlstate[SQLSTATE_LENGTH+1];
+ /* Types of input parameters should be sent to server */
+ my_bool send_types_to_server;
+ my_bool bind_param_done; /* input buffers were supplied */
+ my_bool bind_result_done; /* output buffers were supplied */
+ /* mysql_stmt_close() had to cancel this result */
+ my_bool unbuffered_fetch_cancelled;
+ /*
+ Is set to true if we need to calculate field->max_length for
+ metadata fields when doing mysql_stmt_store_result.
+ */
+ my_bool update_max_length;
+} MYSQL_STMT;
+
+enum enum_stmt_attr_type
+{
+ /*
+ When doing mysql_stmt_store_result calculate max_length attribute
+ of statement metadata. This is to be consistent with the old API,
+ where this was done automatically.
+ In the new API we do that only by request because it slows down
+ mysql_stmt_store_result sufficiently.
+ */
+ STMT_ATTR_UPDATE_MAX_LENGTH
+};
+
+
+typedef struct st_mysql_methods
+{
+ my_bool (*read_query_result)(MYSQL *mysql);
+ my_bool (*advanced_command)(MYSQL *mysql,
+ enum enum_server_command command,
+ const char *header,
+ unsigned long header_length,
+ const char *arg,
+ unsigned long arg_length,
+ my_bool skip_check);
+ MYSQL_DATA *(*read_rows)(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
+ unsigned int fields);
+ MYSQL_RES * (*use_result)(MYSQL *mysql);
+ void (*fetch_lengths)(unsigned long *to,
+ MYSQL_ROW column, unsigned int field_count);
+ void (*flush_use_result)(MYSQL *mysql);
+#if !defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY)
+ MYSQL_FIELD * (*list_fields)(MYSQL *mysql);
+ my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt);
+ int (*stmt_execute)(MYSQL_STMT *stmt);
+ int (*read_binary_rows)(MYSQL_STMT *stmt);
+ int (*unbuffered_fetch)(MYSQL *mysql, char **row);
+ void (*free_embedded_thd)(MYSQL *mysql);
+ const char *(*read_statistics)(MYSQL *mysql);
+ my_bool (*next_result)(MYSQL *mysql);
+ int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd);
+#endif
+} MYSQL_METHODS;
+
+#ifdef HAVE_DEPRECATED_411_API
+/* Deprecated calls (since MySQL 4.1.2) */
+
+/* Use mysql_stmt_init + mysql_stmt_prepare instead */
+MYSQL_STMT * STDCALL mysql_prepare(MYSQL * mysql, const char *query,
+ unsigned long length);
+#define mysql_execute mysql_stmt_execute
+#define mysql_fetch mysql_stmt_fetch
+#define mysql_fetch_column mysql_stmt_fetch_column
+#define mysql_bind_param mysql_stmt_bind_param
+#define mysql_bind_result mysql_stmt_bind_result
+#define mysql_param_count mysql_stmt_param_count
+#define mysql_param_result mysql_stmt_param_metadata
+#define mysql_get_metadata mysql_stmt_result_metadata
+#define mysql_send_long_data mysql_stmt_send_long_data
+
+#endif /* HAVE_DEPRECATED_411_API */
+
+MYSQL_STMT * STDCALL mysql_stmt_init(MYSQL *mysql);
+int STDCALL mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query,
+ unsigned long length);
+int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_fetch(MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind,
+ unsigned int column,
+ unsigned long offset);
+int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt);
+unsigned long STDCALL mysql_stmt_param_count(MYSQL_STMT * stmt);
+my_bool STDCALL mysql_stmt_attr_set(MYSQL_STMT *stmt,
+ enum enum_stmt_attr_type attr_type,
+ const void *attr);
+my_bool STDCALL mysql_stmt_attr_get(MYSQL_STMT *stmt,
+ enum enum_stmt_attr_type attr_type,
+ void *attr);
+my_bool STDCALL mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
+my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
+my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt);
+my_bool STDCALL mysql_stmt_reset(MYSQL_STMT * stmt);
+my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt);
+my_bool STDCALL mysql_stmt_send_long_data(MYSQL_STMT *stmt,
+ unsigned int param_number,
+ const char *data,
+ unsigned long length);
+MYSQL_RES *STDCALL mysql_stmt_result_metadata(MYSQL_STMT *stmt);
+MYSQL_RES *STDCALL mysql_stmt_param_metadata(MYSQL_STMT *stmt);
+unsigned int STDCALL mysql_stmt_errno(MYSQL_STMT * stmt);
+const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt);
+const char *STDCALL mysql_stmt_sqlstate(MYSQL_STMT * stmt);
+MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_seek(MYSQL_STMT *stmt,
+ MYSQL_ROW_OFFSET offset);
+MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_tell(MYSQL_STMT *stmt);
+void STDCALL mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset);
+my_ulonglong STDCALL mysql_stmt_num_rows(MYSQL_STMT *stmt);
+my_ulonglong STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt);
+my_ulonglong STDCALL mysql_stmt_insert_id(MYSQL_STMT *stmt);
+unsigned int STDCALL mysql_stmt_field_count(MYSQL_STMT *stmt);
+
+my_bool STDCALL mysql_commit(MYSQL * mysql);
+my_bool STDCALL mysql_rollback(MYSQL * mysql);
+my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
+my_bool STDCALL mysql_more_results(MYSQL *mysql);
+int STDCALL mysql_next_result(MYSQL *mysql);
+void STDCALL mysql_close(MYSQL *sock);
+
+
+/* status return codes */
+#define MYSQL_NO_DATA 100
+
+#define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT)
+
+#ifdef USE_OLD_FUNCTIONS
+MYSQL * STDCALL mysql_connect(MYSQL *mysql, const char *host,
+ const char *user, const char *passwd);
+int STDCALL mysql_create_db(MYSQL *mysql, const char *DB);
+int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB);
+#define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT)
+#endif
+#define HAVE_MYSQL_REAL_CONNECT
+
+/*
+ The following functions are mainly exported because of mysqlbinlog;
+ They are not for general usage
+*/
+
+#define simple_command(mysql, command, arg, length, skip_check) \
+ (*(mysql)->methods->advanced_command)(mysql, command, \
+ NullS, 0, arg, length, skip_check)
+unsigned long net_safe_read(MYSQL* mysql);
+
+#ifdef __NETWARE__
+#pragma pack(pop) /* restore alignment */
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _mysql_h */
diff --git a/src/terralib/drivers/MySQL/include/mysql_com.h b/src/terralib/drivers/MySQL/include/mysql_com.h
new file mode 100644
index 0000000..4686acc
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/mysql_com.h
@@ -0,0 +1,402 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/*
+** Common definition between mysql server & client
+*/
+
+#ifndef _mysql_com_h
+#define _mysql_com_h
+
+#define NAME_LEN 64 /* Field/table name length */
+#define HOSTNAME_LENGTH 60
+#define USERNAME_LENGTH 16
+#define SERVER_VERSION_LENGTH 60
+#define SQLSTATE_LENGTH 5
+
+#define LOCAL_HOST "localhost"
+#define LOCAL_HOST_NAMEDPIPE "."
+
+
+#if defined(__WIN__) && !defined( _CUSTOMCONFIG_)
+#define MYSQL_NAMEDPIPE "MySQL"
+#define MYSQL_SERVICENAME "MySQL"
+#endif /* __WIN__ */
+
+enum enum_server_command
+{
+ COM_SLEEP, COM_QUIT, COM_INIT_DB, COM_QUERY, COM_FIELD_LIST,
+ COM_CREATE_DB, COM_DROP_DB, COM_REFRESH, COM_SHUTDOWN, COM_STATISTICS,
+ COM_PROCESS_INFO, COM_CONNECT, COM_PROCESS_KILL, COM_DEBUG, COM_PING,
+ COM_TIME, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP,
+ COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE,
+ COM_PREPARE, COM_EXECUTE, COM_LONG_DATA, COM_CLOSE_STMT,
+ COM_RESET_STMT, COM_SET_OPTION,
+ /* don't forget to update const char *command_name[] in sql_parse.cc */
+
+ /* Must be last */
+ COM_END
+};
+
+
+/*
+ Length of random string sent by server on handshake; this is also length of
+ obfuscated password, recieved from client
+*/
+#define SCRAMBLE_LENGTH 20
+#define SCRAMBLE_LENGTH_323 8
+/* length of password stored in the db: new passwords are preceeded with '*' */
+#define SCRAMBLED_PASSWORD_CHAR_LENGTH (SCRAMBLE_LENGTH*2+1)
+#define SCRAMBLED_PASSWORD_CHAR_LENGTH_323 (SCRAMBLE_LENGTH_323*2)
+
+
+#define NOT_NULL_FLAG 1 /* Field can't be NULL */
+#define PRI_KEY_FLAG 2 /* Field is part of a primary key */
+#define UNIQUE_KEY_FLAG 4 /* Field is part of a unique key */
+#define MULTIPLE_KEY_FLAG 8 /* Field is part of a key */
+#define BLOB_FLAG 16 /* Field is a blob */
+#define UNSIGNED_FLAG 32 /* Field is unsigned */
+#define ZEROFILL_FLAG 64 /* Field is zerofill */
+#define BINARY_FLAG 128 /* Field is binary */
+
+/* The following are only sent to new clients */
+#define ENUM_FLAG 256 /* field is an enum */
+#define AUTO_INCREMENT_FLAG 512 /* field is a autoincrement field */
+#define TIMESTAMP_FLAG 1024 /* Field is a timestamp */
+#define SET_FLAG 2048 /* field is a set */
+#define NUM_FLAG 32768 /* Field is num (for clients) */
+#define PART_KEY_FLAG 16384 /* Intern; Part of some key */
+#define GROUP_FLAG 32768 /* Intern: Group field */
+#define UNIQUE_FLAG 65536 /* Intern: Used by sql_yacc */
+#define BINCMP_FLAG 131072 /* Intern: Used by sql_yacc */
+
+#define REFRESH_GRANT 1 /* Refresh grant tables */
+#define REFRESH_LOG 2 /* Start on new log file */
+#define REFRESH_TABLES 4 /* close all tables */
+#define REFRESH_HOSTS 8 /* Flush host cache */
+#define REFRESH_STATUS 16 /* Flush status variables */
+#define REFRESH_THREADS 32 /* Flush thread cache */
+#define REFRESH_SLAVE 64 /* Reset master info and restart slave
+ thread */
+#define REFRESH_MASTER 128 /* Remove all bin logs in the index
+ and truncate the index */
+
+/* The following can't be set with mysql_refresh() */
+#define REFRESH_READ_LOCK 16384 /* Lock tables for read */
+#define REFRESH_FAST 32768 /* Intern flag */
+
+/* RESET (remove all queries) from query cache */
+#define REFRESH_QUERY_CACHE 65536
+#define REFRESH_QUERY_CACHE_FREE 0x20000L /* pack query cache */
+#define REFRESH_DES_KEY_FILE 0x40000L
+#define REFRESH_USER_RESOURCES 0x80000L
+
+#define CLIENT_LONG_PASSWORD 1 /* new more secure passwords */
+#define CLIENT_FOUND_ROWS 2 /* Found instead of affected rows */
+#define CLIENT_LONG_FLAG 4 /* Get all column flags */
+#define CLIENT_CONNECT_WITH_DB 8 /* One can specify db on connect */
+#define CLIENT_NO_SCHEMA 16 /* Don't allow database.table.column */
+#define CLIENT_COMPRESS 32 /* Can use compression protocol */
+#define CLIENT_ODBC 64 /* Odbc client */
+#define CLIENT_LOCAL_FILES 128 /* Can use LOAD DATA LOCAL */
+#define CLIENT_IGNORE_SPACE 256 /* Ignore spaces before '(' */
+#define CLIENT_PROTOCOL_41 512 /* New 4.1 protocol */
+#define CLIENT_INTERACTIVE 1024 /* This is an interactive client */
+#define CLIENT_SSL 2048 /* Switch to SSL after handshake */
+#define CLIENT_IGNORE_SIGPIPE 4096 /* IGNORE sigpipes */
+#define CLIENT_TRANSACTIONS 8192 /* Client knows about transactions */
+#define CLIENT_RESERVED 16384 /* Old flag for 4.1 protocol */
+#define CLIENT_SECURE_CONNECTION 32768 /* New 4.1 authentication */
+#define CLIENT_MULTI_STATEMENTS 65536 /* Enable/disable multi-stmt support */
+#define CLIENT_MULTI_RESULTS 131072 /* Enable/disable multi-results */
+#define CLIENT_REMEMBER_OPTIONS (((ulong) 1) << 31)
+
+#define SERVER_STATUS_IN_TRANS 1 /* Transaction has started */
+#define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */
+#define SERVER_STATUS_MORE_RESULTS 4 /* More results on server */
+#define SERVER_MORE_RESULTS_EXISTS 8 /* Multi query - next query exists */
+#define SERVER_QUERY_NO_GOOD_INDEX_USED 16
+#define SERVER_QUERY_NO_INDEX_USED 32
+
+#define MYSQL_ERRMSG_SIZE 512
+#define NET_READ_TIMEOUT 30 /* Timeout on read */
+#define NET_WRITE_TIMEOUT 60 /* Timeout on write */
+#define NET_WAIT_TIMEOUT 8*60*60 /* Wait for new query */
+
+struct st_vio; /* Only C */
+typedef struct st_vio Vio;
+
+#define MAX_TINYINT_WIDTH 3 /* Max width for a TINY w.o. sign */
+#define MAX_SMALLINT_WIDTH 5 /* Max width for a SHORT w.o. sign */
+#define MAX_MEDIUMINT_WIDTH 8 /* Max width for a INT24 w.o. sign */
+#define MAX_INT_WIDTH 10 /* Max width for a LONG w.o. sign */
+#define MAX_BIGINT_WIDTH 20 /* Max width for a LONGLONG */
+#define MAX_CHAR_WIDTH 255 /* Max length for a CHAR colum */
+#define MAX_BLOB_WIDTH 8192 /* Default width for blob */
+
+typedef struct st_net {
+#if !defined(CHECK_EMBEDDED_DIFFERENCES) || !defined(EMBEDDED_LIBRARY)
+ Vio* vio;
+ unsigned char *buff,*buff_end,*write_pos,*read_pos;
+ my_socket fd; /* For Perl DBI/dbd */
+ unsigned long max_packet,max_packet_size;
+ unsigned int pkt_nr,compress_pkt_nr;
+ unsigned int write_timeout, read_timeout, retry_count;
+ int fcntl;
+ my_bool compress;
+ /*
+ The following variable is set if we are doing several queries in one
+ command ( as in LOAD TABLE ... FROM MASTER ),
+ and do not want to confuse the client with OK at the wrong time
+ */
+ unsigned long remain_in_buf,length, buf_length, where_b;
+ unsigned int *return_status;
+ unsigned char reading_or_writing;
+ char save_char;
+ my_bool no_send_ok;
+ /*
+ Pointer to query object in query cache, do not equal NULL (0) for
+ queries in cache that have not stored its results yet
+ */
+#endif
+ char last_error[MYSQL_ERRMSG_SIZE], sqlstate[SQLSTATE_LENGTH+1];
+ unsigned int last_errno;
+ unsigned char error;
+ gptr query_cache_query;
+ my_bool report_error; /* We should report error (we have unreported error) */
+ my_bool return_errno;
+} NET;
+
+#define packet_error (~(unsigned long) 0)
+
+enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
+ MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG,
+ MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
+ MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP,
+ MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24,
+ MYSQL_TYPE_DATE, MYSQL_TYPE_TIME,
+ MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
+ MYSQL_TYPE_NEWDATE,
+ MYSQL_TYPE_ENUM=247,
+ MYSQL_TYPE_SET=248,
+ MYSQL_TYPE_TINY_BLOB=249,
+ MYSQL_TYPE_MEDIUM_BLOB=250,
+ MYSQL_TYPE_LONG_BLOB=251,
+ MYSQL_TYPE_BLOB=252,
+ MYSQL_TYPE_VAR_STRING=253,
+ MYSQL_TYPE_STRING=254,
+ MYSQL_TYPE_GEOMETRY=255
+
+};
+
+/* For backward compatibility */
+#define CLIENT_MULTI_QUERIES CLIENT_MULTI_STATEMENTS
+#define FIELD_TYPE_DECIMAL MYSQL_TYPE_DECIMAL
+#define FIELD_TYPE_TINY MYSQL_TYPE_TINY
+#define FIELD_TYPE_SHORT MYSQL_TYPE_SHORT
+#define FIELD_TYPE_LONG MYSQL_TYPE_LONG
+#define FIELD_TYPE_FLOAT MYSQL_TYPE_FLOAT
+#define FIELD_TYPE_DOUBLE MYSQL_TYPE_DOUBLE
+#define FIELD_TYPE_NULL MYSQL_TYPE_NULL
+#define FIELD_TYPE_TIMESTAMP MYSQL_TYPE_TIMESTAMP
+#define FIELD_TYPE_LONGLONG MYSQL_TYPE_LONGLONG
+#define FIELD_TYPE_INT24 MYSQL_TYPE_INT24
+#define FIELD_TYPE_DATE MYSQL_TYPE_DATE
+#define FIELD_TYPE_TIME MYSQL_TYPE_TIME
+#define FIELD_TYPE_DATETIME MYSQL_TYPE_DATETIME
+#define FIELD_TYPE_YEAR MYSQL_TYPE_YEAR
+#define FIELD_TYPE_NEWDATE MYSQL_TYPE_NEWDATE
+#define FIELD_TYPE_ENUM MYSQL_TYPE_ENUM
+#define FIELD_TYPE_SET MYSQL_TYPE_SET
+#define FIELD_TYPE_TINY_BLOB MYSQL_TYPE_TINY_BLOB
+#define FIELD_TYPE_MEDIUM_BLOB MYSQL_TYPE_MEDIUM_BLOB
+#define FIELD_TYPE_LONG_BLOB MYSQL_TYPE_LONG_BLOB
+#define FIELD_TYPE_BLOB MYSQL_TYPE_BLOB
+#define FIELD_TYPE_VAR_STRING MYSQL_TYPE_VAR_STRING
+#define FIELD_TYPE_STRING MYSQL_TYPE_STRING
+#define FIELD_TYPE_CHAR MYSQL_TYPE_TINY
+#define FIELD_TYPE_INTERVAL MYSQL_TYPE_ENUM
+#define FIELD_TYPE_GEOMETRY MYSQL_TYPE_GEOMETRY
+
+
+/* Shutdown/kill enums and constants */
+
+/* Bits for THD::killable. */
+#define MYSQL_SHUTDOWN_KILLABLE_CONNECT (unsigned char)(1 << 0)
+#define MYSQL_SHUTDOWN_KILLABLE_TRANS (unsigned char)(1 << 1)
+#define MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE (unsigned char)(1 << 2)
+#define MYSQL_SHUTDOWN_KILLABLE_UPDATE (unsigned char)(1 << 3)
+
+enum mysql_enum_shutdown_level {
+ /*
+ We want levels to be in growing order of hardness (because we use number
+ comparisons). Note that DEFAULT does not respect the growing property, but
+ it's ok.
+ */
+ SHUTDOWN_DEFAULT = 0,
+ /* wait for existing connections to finish */
+ SHUTDOWN_WAIT_CONNECTIONS= MYSQL_SHUTDOWN_KILLABLE_CONNECT,
+ /* wait for existing trans to finish */
+ SHUTDOWN_WAIT_TRANSACTIONS= MYSQL_SHUTDOWN_KILLABLE_TRANS,
+ /* wait for existing updates to finish (=> no partial MyISAM update) */
+ SHUTDOWN_WAIT_UPDATES= MYSQL_SHUTDOWN_KILLABLE_UPDATE,
+ /* flush InnoDB buffers and other storage engines' buffers*/
+ SHUTDOWN_WAIT_ALL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1),
+ /* don't flush InnoDB buffers, flush other storage engines' buffers*/
+ SHUTDOWN_WAIT_CRITICAL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1) + 1,
+ /* Now the 2 levels of the KILL command */
+#if MYSQL_VERSION_ID >= 50000
+ KILL_QUERY= 254,
+#endif
+ KILL_CONNECTION= 255
+};
+
+/* options for mysql_set_option */
+enum enum_mysql_set_option
+{
+ MYSQL_OPTION_MULTI_STATEMENTS_ON,
+ MYSQL_OPTION_MULTI_STATEMENTS_OFF
+};
+
+#define net_new_transaction(net) ((net)->pkt_nr=0)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+my_bool my_net_init(NET *net, Vio* vio);
+void my_net_local_init(NET *net);
+void net_end(NET *net);
+void net_clear(NET *net);
+my_bool net_realloc(NET *net, unsigned long length);
+
+#ifndef EMBEDDED_LIBRARY /* To be removed by HF */
+my_bool net_flush(NET *net);
+#else
+#define net_flush(A)
+#endif
+
+my_bool my_net_write(NET *net,const char *packet,unsigned long len);
+my_bool net_write_command(NET *net,unsigned char command,
+ const char *header, unsigned long head_len,
+ const char *packet, unsigned long len);
+int net_real_write(NET *net,const char *packet,unsigned long len);
+unsigned long my_net_read(NET *net);
+
+/*
+ The following function is not meant for normal usage
+ Currently it's used internally by manager.c
+*/
+struct sockaddr;
+int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen,
+ unsigned int timeout);
+
+struct rand_struct {
+ unsigned long seed1,seed2,max_value;
+ double max_value_dbl;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* The following is for user defined functions */
+
+enum Item_result {STRING_RESULT, REAL_RESULT, INT_RESULT, ROW_RESULT};
+
+typedef struct st_udf_args
+{
+ unsigned int arg_count; /* Number of arguments */
+ enum Item_result *arg_type; /* Pointer to item_results */
+ char **args; /* Pointer to argument */
+ unsigned long *lengths; /* Length of string arguments */
+ char *maybe_null; /* Set to 1 for all maybe_null args */
+} UDF_ARGS;
+
+ /* This holds information about the result */
+
+typedef struct st_udf_init
+{
+ my_bool maybe_null; /* 1 if function can return NULL */
+ unsigned int decimals; /* for real functions */
+ unsigned long max_length; /* For string functions */
+ char *ptr; /* free pointer for function data */
+ my_bool const_item; /* 0 if result is independent of arguments */
+} UDF_INIT;
+
+ /* Constants when using compression */
+#define NET_HEADER_SIZE 4 /* standard header size */
+#define COMP_HEADER_SIZE 3 /* compression header extra size */
+
+ /* Prototypes to password functions */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ These functions are used for authentication by client and server and
+ implemented in sql/password.c
+*/
+
+void randominit(struct rand_struct *, unsigned long seed1,
+ unsigned long seed2);
+double my_rnd(struct rand_struct *);
+void create_random_string(char *to, unsigned int length, struct rand_struct *rand_st);
+
+void hash_password(unsigned long *to, const char *password, unsigned int password_len);
+void make_scrambled_password_323(char *to, const char *password);
+void scramble_323(char *to, const char *message, const char *password);
+my_bool check_scramble_323(const char *, const char *message,
+ unsigned long *salt);
+void get_salt_from_password_323(unsigned long *res, const char *password);
+void make_password_from_salt_323(char *to, const unsigned long *salt);
+
+void make_scrambled_password(char *to, const char *password);
+void scramble(char *to, const char *message, const char *password);
+my_bool check_scramble(const char *reply, const char *message,
+ const unsigned char *hash_stage2);
+void get_salt_from_password(unsigned char *res, const char *password);
+void make_password_from_salt(char *to, const unsigned char *hash_stage2);
+
+/* end of password.c */
+
+char *get_tty_password(char *opt_message);
+const char *mysql_errno_to_sqlstate(unsigned int mysql_errno);
+
+/* Some other useful functions */
+
+my_bool my_init(void);
+int load_defaults(const char *conf_file, const char **groups,
+ int *argc, char ***argv);
+my_bool my_thread_init(void);
+void my_thread_end(void);
+
+#ifdef _global_h
+ulong STDCALL net_field_length(uchar **packet);
+my_ulonglong net_field_length_ll(uchar **packet);
+char *net_store_length(char *pkg, ulonglong length);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */
+#define MYSQL_STMT_HEADER 4
+#define MYSQL_LONG_DATA_HEADER 6
+
+#endif
diff --git a/src/terralib/drivers/MySQL/include/mysql_embed.h b/src/terralib/drivers/MySQL/include/mysql_embed.h
new file mode 100644
index 0000000..603af8e
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/mysql_embed.h
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/* Defines that are unique to the embedded version of MySQL */
+
+#ifdef EMBEDDED_LIBRARY
+
+/* Things we don't need in the embedded version of MySQL */
+/* TODO HF add #undef HAVE_VIO if we don't want client in embedded library */
+
+#undef HAVE_PSTACK /* No stacktrace */
+#undef HAVE_DLOPEN /* No udf functions */
+#undef HAVE_OPENSSL
+#undef HAVE_ISAM
+#undef HAVE_SMEM /* No shared memory */
+#undef HAVE_NDBCLUSTER_DB /* No NDB cluster */
+
+#define DONT_USE_RAID
+
+#endif /* EMBEDDED_LIBRARY */
diff --git a/src/terralib/drivers/MySQL/include/mysql_time.h b/src/terralib/drivers/MySQL/include/mysql_time.h
new file mode 100644
index 0000000..ec67d60
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/mysql_time.h
@@ -0,0 +1,44 @@
+/* Copyright (C) 2004 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifndef _mysql_time_h_
+#define _mysql_time_h_
+
+/*
+ Time declarations shared between the server and client API:
+ you should not add anything to this header unless it's used
+ (and hence should be visible) in mysql.h.
+ If you're looking for a place to add new time-related declaration,
+ it's most likely my_time.h. See also "C API Handling of Date
+ and Time Values" chapter in documentation.
+*/
+
+enum enum_mysql_timestamp_type
+{
+ MYSQL_TIMESTAMP_NONE= -2, MYSQL_TIMESTAMP_ERROR= -1,
+ MYSQL_TIMESTAMP_DATE= 0, MYSQL_TIMESTAMP_DATETIME= 1, MYSQL_TIMESTAMP_TIME= 2
+};
+
+
+typedef struct st_mysql_time
+{
+ unsigned int year, month, day, hour, minute, second;
+ unsigned long second_part;
+ my_bool neg;
+ enum enum_mysql_timestamp_type time_type;
+} MYSQL_TIME;
+
+#endif /* _mysql_time_h_ */
diff --git a/src/terralib/drivers/MySQL/include/mysql_version.h b/src/terralib/drivers/MySQL/include/mysql_version.h
new file mode 100644
index 0000000..6b53ce0
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/mysql_version.h
@@ -0,0 +1,29 @@
+/* Copyright Abandoned 1996, 1999, 2001 MySQL AB
+ This file is public domain and comes with NO WARRANTY of any kind */
+
+/* Version numbers for protocol & mysqld */
+
+#ifndef _mysql_version_h
+#define _mysql_version_h
+#ifdef _CUSTOMCONFIG_
+#include <custom_conf.h>
+#else
+#define PROTOCOL_VERSION 10
+#define MYSQL_SERVER_VERSION "4.1.7"
+#define MYSQL_BASE_VERSION "mysqld-4.1"
+#define MYSQL_SERVER_SUFFIX_DEF ""
+#define FRM_VER 6
+#define MYSQL_VERSION_ID 40107
+#define MYSQL_PORT 3306
+#define MYSQL_UNIX_ADDR "/tmp/mysql.sock"
+#define MYSQL_CONFIG_NAME "my"
+#define MYSQL_COMPILATION_COMMENT "Source distribution"
+
+/* mysqld compile time options */
+#endif /* _CUSTOMCONFIG_ */
+
+#ifndef LICENSE
+#define LICENSE GPL
+#endif /* LICENSE */
+
+#endif /* _mysql_version_h */
diff --git a/src/terralib/drivers/MySQL/include/mysqld_error.h b/src/terralib/drivers/MySQL/include/mysqld_error.h
new file mode 100644
index 0000000..776869f
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/mysqld_error.h
@@ -0,0 +1,322 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/* Definefile for error messagenumbers */
+
+#define ER_HASHCHK 1000
+#define ER_NISAMCHK 1001
+#define ER_NO 1002
+#define ER_YES 1003
+#define ER_CANT_CREATE_FILE 1004
+#define ER_CANT_CREATE_TABLE 1005
+#define ER_CANT_CREATE_DB 1006
+#define ER_DB_CREATE_EXISTS 1007
+#define ER_DB_DROP_EXISTS 1008
+#define ER_DB_DROP_DELETE 1009
+#define ER_DB_DROP_RMDIR 1010
+#define ER_CANT_DELETE_FILE 1011
+#define ER_CANT_FIND_SYSTEM_REC 1012
+#define ER_CANT_GET_STAT 1013
+#define ER_CANT_GET_WD 1014
+#define ER_CANT_LOCK 1015
+#define ER_CANT_OPEN_FILE 1016
+#define ER_FILE_NOT_FOUND 1017
+#define ER_CANT_READ_DIR 1018
+#define ER_CANT_SET_WD 1019
+#define ER_CHECKREAD 1020
+#define ER_DISK_FULL 1021
+#define ER_DUP_KEY 1022
+#define ER_ERROR_ON_CLOSE 1023
+#define ER_ERROR_ON_READ 1024
+#define ER_ERROR_ON_RENAME 1025
+#define ER_ERROR_ON_WRITE 1026
+#define ER_FILE_USED 1027
+#define ER_FILSORT_ABORT 1028
+#define ER_FORM_NOT_FOUND 1029
+#define ER_GET_ERRNO 1030
+#define ER_ILLEGAL_HA 1031
+#define ER_KEY_NOT_FOUND 1032
+#define ER_NOT_FORM_FILE 1033
+#define ER_NOT_KEYFILE 1034
+#define ER_OLD_KEYFILE 1035
+#define ER_OPEN_AS_READONLY 1036
+#define ER_OUTOFMEMORY 1037
+#define ER_OUT_OF_SORTMEMORY 1038
+#define ER_UNEXPECTED_EOF 1039
+#define ER_CON_COUNT_ERROR 1040
+#define ER_OUT_OF_RESOURCES 1041
+#define ER_BAD_HOST_ERROR 1042
+#define ER_HANDSHAKE_ERROR 1043
+#define ER_DBACCESS_DENIED_ERROR 1044
+#define ER_ACCESS_DENIED_ERROR 1045
+#define ER_NO_DB_ERROR 1046
+#define ER_UNKNOWN_COM_ERROR 1047
+#define ER_BAD_NULL_ERROR 1048
+#define ER_BAD_DB_ERROR 1049
+#define ER_TABLE_EXISTS_ERROR 1050
+#define ER_BAD_TABLE_ERROR 1051
+#define ER_NON_UNIQ_ERROR 1052
+#define ER_SERVER_SHUTDOWN 1053
+#define ER_BAD_FIELD_ERROR 1054
+#define ER_WRONG_FIELD_WITH_GROUP 1055
+#define ER_WRONG_GROUP_FIELD 1056
+#define ER_WRONG_SUM_SELECT 1057
+#define ER_WRONG_VALUE_COUNT 1058
+#define ER_TOO_LONG_IDENT 1059
+#define ER_DUP_FIELDNAME 1060
+#define ER_DUP_KEYNAME 1061
+#define ER_DUP_ENTRY 1062
+#define ER_WRONG_FIELD_SPEC 1063
+#define ER_PARSE_ERROR 1064
+#define ER_EMPTY_QUERY 1065
+#define ER_NONUNIQ_TABLE 1066
+#define ER_INVALID_DEFAULT 1067
+#define ER_MULTIPLE_PRI_KEY 1068
+#define ER_TOO_MANY_KEYS 1069
+#define ER_TOO_MANY_KEY_PARTS 1070
+#define ER_TOO_LONG_KEY 1071
+#define ER_KEY_COLUMN_DOES_NOT_EXITS 1072
+#define ER_BLOB_USED_AS_KEY 1073
+#define ER_TOO_BIG_FIELDLENGTH 1074
+#define ER_WRONG_AUTO_KEY 1075
+#define ER_READY 1076
+#define ER_NORMAL_SHUTDOWN 1077
+#define ER_GOT_SIGNAL 1078
+#define ER_SHUTDOWN_COMPLETE 1079
+#define ER_FORCING_CLOSE 1080
+#define ER_IPSOCK_ERROR 1081
+#define ER_NO_SUCH_INDEX 1082
+#define ER_WRONG_FIELD_TERMINATORS 1083
+#define ER_BLOBS_AND_NO_TERMINATED 1084
+#define ER_TEXTFILE_NOT_READABLE 1085
+#define ER_FILE_EXISTS_ERROR 1086
+#define ER_LOAD_INFO 1087
+#define ER_ALTER_INFO 1088
+#define ER_WRONG_SUB_KEY 1089
+#define ER_CANT_REMOVE_ALL_FIELDS 1090
+#define ER_CANT_DROP_FIELD_OR_KEY 1091
+#define ER_INSERT_INFO 1092
+#define ER_UPDATE_TABLE_USED 1093
+#define ER_NO_SUCH_THREAD 1094
+#define ER_KILL_DENIED_ERROR 1095
+#define ER_NO_TABLES_USED 1096
+#define ER_TOO_BIG_SET 1097
+#define ER_NO_UNIQUE_LOGFILE 1098
+#define ER_TABLE_NOT_LOCKED_FOR_WRITE 1099
+#define ER_TABLE_NOT_LOCKED 1100
+#define ER_BLOB_CANT_HAVE_DEFAULT 1101
+#define ER_WRONG_DB_NAME 1102
+#define ER_WRONG_TABLE_NAME 1103
+#define ER_TOO_BIG_SELECT 1104
+#define ER_UNKNOWN_ERROR 1105
+#define ER_UNKNOWN_PROCEDURE 1106
+#define ER_WRONG_PARAMCOUNT_TO_PROCEDURE 1107
+#define ER_WRONG_PARAMETERS_TO_PROCEDURE 1108
+#define ER_UNKNOWN_TABLE 1109
+#define ER_FIELD_SPECIFIED_TWICE 1110
+#define ER_INVALID_GROUP_FUNC_USE 1111
+#define ER_UNSUPPORTED_EXTENSION 1112
+#define ER_TABLE_MUST_HAVE_COLUMNS 1113
+#define ER_RECORD_FILE_FULL 1114
+#define ER_UNKNOWN_CHARACTER_SET 1115
+#define ER_TOO_MANY_TABLES 1116
+#define ER_TOO_MANY_FIELDS 1117
+#define ER_TOO_BIG_ROWSIZE 1118
+#define ER_STACK_OVERRUN 1119
+#define ER_WRONG_OUTER_JOIN 1120
+#define ER_NULL_COLUMN_IN_INDEX 1121
+#define ER_CANT_FIND_UDF 1122
+#define ER_CANT_INITIALIZE_UDF 1123
+#define ER_UDF_NO_PATHS 1124
+#define ER_UDF_EXISTS 1125
+#define ER_CANT_OPEN_LIBRARY 1126
+#define ER_CANT_FIND_DL_ENTRY 1127
+#define ER_FUNCTION_NOT_DEFINED 1128
+#define ER_HOST_IS_BLOCKED 1129
+#define ER_HOST_NOT_PRIVILEGED 1130
+#define ER_PASSWORD_ANONYMOUS_USER 1131
+#define ER_PASSWORD_NOT_ALLOWED 1132
+#define ER_PASSWORD_NO_MATCH 1133
+#define ER_UPDATE_INFO 1134
+#define ER_CANT_CREATE_THREAD 1135
+#define ER_WRONG_VALUE_COUNT_ON_ROW 1136
+#define ER_CANT_REOPEN_TABLE 1137
+#define ER_INVALID_USE_OF_NULL 1138
+#define ER_REGEXP_ERROR 1139
+#define ER_MIX_OF_GROUP_FUNC_AND_FIELDS 1140
+#define ER_NONEXISTING_GRANT 1141
+#define ER_TABLEACCESS_DENIED_ERROR 1142
+#define ER_COLUMNACCESS_DENIED_ERROR 1143
+#define ER_ILLEGAL_GRANT_FOR_TABLE 1144
+#define ER_GRANT_WRONG_HOST_OR_USER 1145
+#define ER_NO_SUCH_TABLE 1146
+#define ER_NONEXISTING_TABLE_GRANT 1147
+#define ER_NOT_ALLOWED_COMMAND 1148
+#define ER_SYNTAX_ERROR 1149
+#define ER_DELAYED_CANT_CHANGE_LOCK 1150
+#define ER_TOO_MANY_DELAYED_THREADS 1151
+#define ER_ABORTING_CONNECTION 1152
+#define ER_NET_PACKET_TOO_LARGE 1153
+#define ER_NET_READ_ERROR_FROM_PIPE 1154
+#define ER_NET_FCNTL_ERROR 1155
+#define ER_NET_PACKETS_OUT_OF_ORDER 1156
+#define ER_NET_UNCOMPRESS_ERROR 1157
+#define ER_NET_READ_ERROR 1158
+#define ER_NET_READ_INTERRUPTED 1159
+#define ER_NET_ERROR_ON_WRITE 1160
+#define ER_NET_WRITE_INTERRUPTED 1161
+#define ER_TOO_LONG_STRING 1162
+#define ER_TABLE_CANT_HANDLE_BLOB 1163
+#define ER_TABLE_CANT_HANDLE_AUTO_INCREMENT 1164
+#define ER_DELAYED_INSERT_TABLE_LOCKED 1165
+#define ER_WRONG_COLUMN_NAME 1166
+#define ER_WRONG_KEY_COLUMN 1167
+#define ER_WRONG_MRG_TABLE 1168
+#define ER_DUP_UNIQUE 1169
+#define ER_BLOB_KEY_WITHOUT_LENGTH 1170
+#define ER_PRIMARY_CANT_HAVE_NULL 1171
+#define ER_TOO_MANY_ROWS 1172
+#define ER_REQUIRES_PRIMARY_KEY 1173
+#define ER_NO_RAID_COMPILED 1174
+#define ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE 1175
+#define ER_KEY_DOES_NOT_EXITS 1176
+#define ER_CHECK_NO_SUCH_TABLE 1177
+#define ER_CHECK_NOT_IMPLEMENTED 1178
+#define ER_CANT_DO_THIS_DURING_AN_TRANSACTION 1179
+#define ER_ERROR_DURING_COMMIT 1180
+#define ER_ERROR_DURING_ROLLBACK 1181
+#define ER_ERROR_DURING_FLUSH_LOGS 1182
+#define ER_ERROR_DURING_CHECKPOINT 1183
+#define ER_NEW_ABORTING_CONNECTION 1184
+#define ER_DUMP_NOT_IMPLEMENTED 1185
+#define ER_FLUSH_MASTER_BINLOG_CLOSED 1186
+#define ER_INDEX_REBUILD 1187
+#define ER_MASTER 1188
+#define ER_MASTER_NET_READ 1189
+#define ER_MASTER_NET_WRITE 1190
+#define ER_FT_MATCHING_KEY_NOT_FOUND 1191
+#define ER_LOCK_OR_ACTIVE_TRANSACTION 1192
+#define ER_UNKNOWN_SYSTEM_VARIABLE 1193
+#define ER_CRASHED_ON_USAGE 1194
+#define ER_CRASHED_ON_REPAIR 1195
+#define ER_WARNING_NOT_COMPLETE_ROLLBACK 1196
+#define ER_TRANS_CACHE_FULL 1197
+#define ER_SLAVE_MUST_STOP 1198
+#define ER_SLAVE_NOT_RUNNING 1199
+#define ER_BAD_SLAVE 1200
+#define ER_MASTER_INFO 1201
+#define ER_SLAVE_THREAD 1202
+#define ER_TOO_MANY_USER_CONNECTIONS 1203
+#define ER_SET_CONSTANTS_ONLY 1204
+#define ER_LOCK_WAIT_TIMEOUT 1205
+#define ER_LOCK_TABLE_FULL 1206
+#define ER_READ_ONLY_TRANSACTION 1207
+#define ER_DROP_DB_WITH_READ_LOCK 1208
+#define ER_CREATE_DB_WITH_READ_LOCK 1209
+#define ER_WRONG_ARGUMENTS 1210
+#define ER_NO_PERMISSION_TO_CREATE_USER 1211
+#define ER_UNION_TABLES_IN_DIFFERENT_DIR 1212
+#define ER_LOCK_DEADLOCK 1213
+#define ER_TABLE_CANT_HANDLE_FT 1214
+#define ER_CANNOT_ADD_FOREIGN 1215
+#define ER_NO_REFERENCED_ROW 1216
+#define ER_ROW_IS_REFERENCED 1217
+#define ER_CONNECT_TO_MASTER 1218
+#define ER_QUERY_ON_MASTER 1219
+#define ER_ERROR_WHEN_EXECUTING_COMMAND 1220
+#define ER_WRONG_USAGE 1221
+#define ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT 1222
+#define ER_CANT_UPDATE_WITH_READLOCK 1223
+#define ER_MIXING_NOT_ALLOWED 1224
+#define ER_DUP_ARGUMENT 1225
+#define ER_USER_LIMIT_REACHED 1226
+#define ER_SPECIFIC_ACCESS_DENIED_ERROR 1227
+#define ER_LOCAL_VARIABLE 1228
+#define ER_GLOBAL_VARIABLE 1229
+#define ER_NO_DEFAULT 1230
+#define ER_WRONG_VALUE_FOR_VAR 1231
+#define ER_WRONG_TYPE_FOR_VAR 1232
+#define ER_VAR_CANT_BE_READ 1233
+#define ER_CANT_USE_OPTION_HERE 1234
+#define ER_NOT_SUPPORTED_YET 1235
+#define ER_MASTER_FATAL_ERROR_READING_BINLOG 1236
+#define ER_SLAVE_IGNORED_TABLE 1237
+#define ER_INCORRECT_GLOBAL_LOCAL_VAR 1238
+#define ER_WRONG_FK_DEF 1239
+#define ER_KEY_REF_DO_NOT_MATCH_TABLE_REF 1240
+#define ER_OPERAND_COLUMNS 1241
+#define ER_SUBQUERY_NO_1_ROW 1242
+#define ER_UNKNOWN_STMT_HANDLER 1243
+#define ER_CORRUPT_HELP_DB 1244
+#define ER_CYCLIC_REFERENCE 1245
+#define ER_AUTO_CONVERT 1246
+#define ER_ILLEGAL_REFERENCE 1247
+#define ER_DERIVED_MUST_HAVE_ALIAS 1248
+#define ER_SELECT_REDUCED 1249
+#define ER_TABLENAME_NOT_ALLOWED_HERE 1250
+#define ER_NOT_SUPPORTED_AUTH_MODE 1251
+#define ER_SPATIAL_CANT_HAVE_NULL 1252
+#define ER_COLLATION_CHARSET_MISMATCH 1253
+#define ER_SLAVE_WAS_RUNNING 1254
+#define ER_SLAVE_WAS_NOT_RUNNING 1255
+#define ER_TOO_BIG_FOR_UNCOMPRESS 1256
+#define ER_ZLIB_Z_MEM_ERROR 1257
+#define ER_ZLIB_Z_BUF_ERROR 1258
+#define ER_ZLIB_Z_DATA_ERROR 1259
+#define ER_CUT_VALUE_GROUP_CONCAT 1260
+#define ER_WARN_TOO_FEW_RECORDS 1261
+#define ER_WARN_TOO_MANY_RECORDS 1262
+#define ER_WARN_NULL_TO_NOTNULL 1263
+#define ER_WARN_DATA_OUT_OF_RANGE 1264
+#define ER_WARN_DATA_TRUNCATED 1265
+#define ER_WARN_USING_OTHER_HANDLER 1266
+#define ER_CANT_AGGREGATE_2COLLATIONS 1267
+#define ER_DROP_USER 1268
+#define ER_REVOKE_GRANTS 1269
+#define ER_CANT_AGGREGATE_3COLLATIONS 1270
+#define ER_CANT_AGGREGATE_NCOLLATIONS 1271
+#define ER_VARIABLE_IS_NOT_STRUCT 1272
+#define ER_UNKNOWN_COLLATION 1273
+#define ER_SLAVE_IGNORED_SSL_PARAMS 1274
+#define ER_SERVER_IS_IN_SECURE_AUTH_MODE 1275
+#define ER_WARN_FIELD_RESOLVED 1276
+#define ER_BAD_SLAVE_UNTIL_COND 1277
+#define ER_MISSING_SKIP_SLAVE 1278
+#define ER_UNTIL_COND_IGNORED 1279
+#define ER_WRONG_NAME_FOR_INDEX 1280
+#define ER_WRONG_NAME_FOR_CATALOG 1281
+#define ER_WARN_QC_RESIZE 1282
+#define ER_BAD_FT_COLUMN 1283
+#define ER_UNKNOWN_KEY_CACHE 1284
+#define ER_WARN_HOSTNAME_WONT_WORK 1285
+#define ER_UNKNOWN_STORAGE_ENGINE 1286
+#define ER_WARN_DEPRECATED_SYNTAX 1287
+#define ER_NON_UPDATABLE_TABLE 1288
+#define ER_FEATURE_DISABLED 1289
+#define ER_OPTION_PREVENTS_STATEMENT 1290
+#define ER_DUPLICATED_VALUE_IN_TYPE 1291
+#define ER_TRUNCATED_WRONG_VALUE 1292
+#define ER_TOO_MUCH_AUTO_TIMESTAMP_COLS 1293
+#define ER_INVALID_ON_UPDATE 1294
+#define ER_UNSUPPORTED_PS 1295
+#define ER_GET_ERRMSG 1296
+#define ER_GET_TEMPORARY_ERRMSG 1297
+#define ER_UNKNOWN_TIME_ZONE 1298
+#define ER_WARN_INVALID_TIMESTAMP 1299
+#define ER_INVALID_CHARACTER_STRING 1300
+#define ER_WARN_ALLOWED_PACKET_OVERFLOWED 1301
+#define ER_CONFLICTING_DECLARATIONS 1302
+#define ER_ERROR_MESSAGES 303
diff --git a/src/terralib/drivers/MySQL/include/raid.h b/src/terralib/drivers/MySQL/include/raid.h
new file mode 100644
index 0000000..b5a5e66
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/raid.h
@@ -0,0 +1,158 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/* Parser needs these defines always, even if USE_RAID is not defined */
+#define RAID_TYPE_0 1 /* Striping */
+#define RAID_TYPE_x 2 /* Some new modes */
+#define RAID_TYPE_y 3
+
+#define RAID_DEFAULT_CHUNKS 4
+#define RAID_DEFAULT_CHUNKSIZE 256*1024 /* 256kB */
+
+C_MODE_START
+#define my_raid_type(raid_type) raid_type_string[(int)(raid_type)]
+extern const char *raid_type_string[];
+C_MODE_END
+
+#ifdef DONT_USE_RAID
+#undef USE_RAID
+#endif
+#if defined(USE_RAID)
+
+#ifdef __GNUC__
+#pragma interface /* gcc class implementation */
+#endif
+#include "my_dir.h"
+
+/* Trap all occurences of my_...() in source and use our wrapper around this function */
+
+#ifdef MAP_TO_USE_RAID
+#define my_read(A,B,C,D) my_raid_read(A,B,C,D)
+#define my_write(A,B,C,D) my_raid_write(A,B,C,D)
+#define my_pwrite(A,B,C,D,E) my_raid_pwrite(A,B,C,D,E)
+#define my_pread(A,B,C,D,E) my_raid_pread(A,B,C,D,E)
+#define my_chsize(A,B,C,D) my_raid_chsize(A,B,C,D)
+#define my_close(A,B) my_raid_close(A,B)
+#define my_tell(A,B) my_raid_tell(A,B)
+#define my_seek(A,B,C,D) my_raid_seek(A,B,C,D)
+#define my_lock(A,B,C,D,E) my_raid_lock(A,B,C,D,E)
+#define my_fstat(A,B,C) my_raid_fstat(A,B,C)
+#endif /* MAP_TO_USE_RAID */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ void init_raid(void);
+ void end_raid(void);
+
+ bool is_raid(File fd);
+ File my_raid_create(const char *FileName, int CreateFlags, int access_flags,
+ uint raid_type, uint raid_chunks, ulong raid_chunksize,
+ myf MyFlags);
+ File my_raid_open(const char *FileName, int Flags,
+ uint raid_type, uint raid_chunks, ulong raid_chunksize,
+ myf MyFlags);
+ int my_raid_rename(const char *from, const char *to, uint raid_chunks,
+ myf MyFlags);
+ int my_raid_delete(const char *from, uint raid_chunks, myf MyFlags);
+ int my_raid_redel(const char *old_name, const char *new_name,
+ uint raid_chunks, myf MyFlags);
+
+ my_off_t my_raid_seek(File fd, my_off_t pos, int whence, myf MyFlags);
+ my_off_t my_raid_tell(File fd, myf MyFlags);
+
+ uint my_raid_write(File,const byte *Buffer, uint Count, myf MyFlags);
+ uint my_raid_read(File Filedes, byte *Buffer, uint Count, myf MyFlags);
+
+ uint my_raid_pread(File Filedes, byte *Buffer, uint Count, my_off_t offset,
+ myf MyFlags);
+ uint my_raid_pwrite(int Filedes, const byte *Buffer, uint Count,
+ my_off_t offset, myf MyFlags);
+
+ int my_raid_lock(File,int locktype, my_off_t start, my_off_t length,
+ myf MyFlags);
+ int my_raid_chsize(File fd, my_off_t newlength, int filler, myf MyFlags);
+ int my_raid_close(File, myf MyFlags);
+ int my_raid_fstat(int Filedes, struct stat *buf, myf MyFlags);
+
+#ifdef __cplusplus
+}
+
+class RaidName {
+ public:
+ RaidName(const char *FileName);
+ ~RaidName();
+ bool IsRaid();
+ int Rename(const char * from, const char * to, myf MyFlags);
+ private:
+ uint _raid_type; /* RAID_TYPE_0 or RAID_TYPE_1 or RAID_TYPE_5 */
+ uint _raid_chunks; /* 1..n */
+ ulong _raid_chunksize; /* 1..n in bytes */
+};
+
+class RaidFd {
+ public:
+ RaidFd(uint raid_type, uint raid_chunks , ulong raid_chunksize);
+ ~RaidFd();
+ File Create(const char *FileName, int CreateFlags, int access_flags,
+ myf MyFlags);
+ File Open(const char *FileName, int Flags, myf MyFlags);
+ my_off_t Seek(my_off_t pos,int whence,myf MyFlags);
+ my_off_t Tell(myf MyFlags);
+ int Write(const byte *Buffer, uint Count, myf MyFlags);
+ int Read(const byte *Buffer, uint Count, myf MyFlags);
+ int Lock(int locktype, my_off_t start, my_off_t length, myf MyFlags);
+ int Chsize(File fd, my_off_t newlength, int filler, myf MyFlags);
+ int Fstat(int fd, MY_STAT *stat_area, myf MyFlags );
+ int Close(myf MyFlags);
+ static bool IsRaid(File fd);
+ static DYNAMIC_ARRAY _raid_map; /* Map of RaidFD* */
+ private:
+
+ uint _raid_type; /* RAID_TYPE_0 or RAID_TYPE_1 or RAID_TYPE_5 */
+ uint _raid_chunks; /* 1..n */
+ ulong _raid_chunksize; /* 1..n in bytes */
+
+ ulong _total_block; /* We are operating with block no x (can be 0..many). */
+ uint _this_block; /* can be 0.._raid_chunks */
+ uint _remaining_bytes; /* Maximum bytes that can be written in this block */
+
+ my_off_t _position;
+ my_off_t _size; /* Cached file size for faster seek(SEEK_END) */
+ File _fd;
+ File *_fd_vector; /* Array of File */
+ off_t *_seek_vector; /* Array of cached seek positions */
+
+ inline void Calculate()
+ {
+ DBUG_ENTER("RaidFd::_Calculate");
+ DBUG_PRINT("info",("_position: %lu _raid_chunksize: %d, _size: %lu",
+ (ulong) _position, _raid_chunksize, (ulong) _size));
+
+ _total_block = (ulong) (_position / _raid_chunksize);
+ _this_block = _total_block % _raid_chunks; /* can be 0.._raid_chunks */
+ _remaining_bytes = (uint) (_raid_chunksize -
+ (_position - _total_block * _raid_chunksize));
+ DBUG_PRINT("info",
+ ("_total_block: %d this_block: %d _remaining_bytes:%d",
+ _total_block, _this_block, _remaining_bytes));
+ DBUG_VOID_RETURN;
+ }
+};
+
+#endif /* __cplusplus */
+#endif /* USE_RAID */
diff --git a/src/terralib/drivers/MySQL/include/typelib.h b/src/terralib/drivers/MySQL/include/typelib.h
new file mode 100644
index 0000000..1b049d1
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/typelib.h
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+
+#ifndef _typelib_h
+#define _typelib_h
+
+typedef struct st_typelib { /* Different types saved here */
+ unsigned int count; /* How many types */
+ const char *name; /* Name of typelib */
+ const char **type_names;
+} TYPELIB;
+
+extern int find_type(char *x,TYPELIB *typelib,unsigned int full_name);
+extern void make_type(char *to,unsigned int nr,TYPELIB *typelib);
+extern const char *get_type(TYPELIB *typelib,unsigned int nr);
+
+extern TYPELIB sql_protocol_typelib;
+
+#endif /* _typelib_h */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/cdemodp0.h b/src/terralib/drivers/OracleSpatial/OCI/include/cdemodp0.h
new file mode 100644
index 0000000..419543c
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/cdemodp0.h
@@ -0,0 +1,109 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/cdemodp0.h,v 1.2 2002/12/13 13:33:55 karine Exp $
+ */
+
+/* Copyright (c) 1998, 1999, Oracle Corporation. All rights reserved.
+*/
+
+/*
+ NAME
+ cdemodp0.h - C Demo program for Direct Path api
+
+ DESCRIPTION
+ - Internal data structs, macros, & defines for cdemodp driver.
+
+ NOTES
+ Structures, macros, constants used only by cdemodp.c.
+
+ MODIFIED (MM/DD/YY)
+ mjaeger 07/14/99 - bug 808870: OCCS: convert tabs, no long lines
+ abrumm 12/22/98 - lint
+ cmlim 11/17/98 - take away hardcoded MAX_RECLEN; now a session parm
+ cmlim 10/06/98 - correct typo
+ cmlim 10/02/98 - added externref
+ cmlim 09/16/98 - internal data structs, macros, & defines for cdemodp
+ cmlim 09/16/98 - Creation (abrumm 04/07/98)
+
+*/
+
+
+#ifndef cdemodp0_ORACLE
+# define cdemodp0_ORACLE
+
+# include <oratypes.h>
+# include <oci.h>
+
+/* partial field context structure, maintained by field setting function */
+struct pctx
+{
+ ub1 valid_pctx; /* partial context is valid */
+ ub4 pieceCnt_pctx; /* count of partial pieces */
+ ub4 row_pctx; /* which row in column array */
+ ub4 col_pctx; /* which column in column array */
+ ub4 len_pctx; /* length of this column so far */
+ int fd_pctx; /* open file descriptor data is coming from */
+ char *fnm_pctx; /* filename for data source */
+};
+
+/* CLEAR_PCTX(struct pctx pctx)
+ * Macro to clear the partial context state
+ */
+#define CLEAR_PCTX(pctx) \
+ ((pctx).valid_pctx = FALSE, (pctx).pieceCnt_pctx = 0, \
+ (pctx).row_pctx = UB4MAXVAL, (pctx).col_pctx = UB4MAXVAL, \
+ (pctx).len_pctx = 0, (pctx).fd_pctx = -1, \
+ (pctx).fnm_pctx = (char *)0)
+
+#define SET_PCTX(pctx, rowoff, coloff, clen, fd, fnm) \
+ ((pctx).valid_pctx = TRUE, (pctx).pieceCnt_pctx++, \
+ (pctx).row_pctx = (rowoff), (pctx).col_pctx = (coloff), \
+ (pctx).len_pctx += (ub4)(clen), (pctx).fd_pctx = (fd), \
+ (pctx).fnm_pctx = (fnm))
+
+#define LEN_PCTX(pctx) ((pctx).len_pctx)
+
+/* Does the input record correspond to the first piece of a row?
+ * Note that a row which is not pieced is a first piece too.
+ */
+#define FIRST_PIECE(pctx) \
+( (pctx).valid_pctx == FALSE || \
+ ((pctx).valid_pctx == TRUE && ((pctx).pieceCnt_pctx == 1)))
+
+/* return values from field_set() */
+#define FIELD_SET_COMPLETE 0
+#define FIELD_SET_ERROR 1
+#define FIELD_SET_BUF 2
+#define FIELD_SET_PARTIAL 3
+
+/* return values from do_convert() */
+#define CONVERT_SUCCESS 0
+#define CONVERT_ERROR 1
+#define CONVERT_NEED_DATA 2
+#define CONVERT_CONTINUE 3
+
+/* return values from do_load() */
+#define LOAD_SUCCESS 0
+#define LOAD_ERROR 1
+#define LOAD_NEED_DATA 2
+#define LOAD_NO_DATA 3
+
+/* state values for simple_load() */
+#define RESET 1 /* initial state, reset data structures to empty */
+#define GET_RECORD 2 /* get input records */
+#define FIELD_SET 3 /* assign fields of input records to columns */
+#define DO_CONVERT 4 /* convert column array input to stream format */
+#define DO_LOAD 5 /* load the direct stream */
+#define END_OF_INPUT 6 /* no more input data */
+
+/* Secondary buffer sizes for OUTOFLINE fields; no science here, just a WAG */
+#define SECONDARY_BUF_SIZE (1024*1024) /* size of secondary buffer */
+#define SECONDARY_BUF_SLOP (8*1024) /* get another field if this much avail */
+
+#define STATICF
+
+#ifndef externref
+# define externref extern
+#endif
+
+
+#endif /* cdemodp0_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/kusapi.h b/src/terralib/drivers/OracleSpatial/OCI/include/kusapi.h
new file mode 100644
index 0000000..9a51999
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/kusapi.h
@@ -0,0 +1,775 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/kusapi.h,v 1.2 2002/12/13 13:33:55 karine Exp $
+ */
+
+/* Copyright (c) Oracle Corporation 1996, 1997. All Rights Reserved. */
+
+/* NOTE: See 'header_template.doc' in the 'doc' dve under the 'forms'
+ directory for the header file template that includes instructions.
+*/
+
+/*
+ NAME
+ kusapi.h - Kernel Utility Statistics Application Programming Interface
+
+ DESCRIPTION
+ Declarations of types and functions of the API used to retrieve
+ statistics from the SGA
+
+ PUBLIC FUNCTION(S)
+ kusdb_connect - connect to a database
+ kuscx_allocate - allocate continuation context
+ kuscx_free - free continuation context
+ kuscx_init - initialize continuation context
+ kusdb_get_info - retrieve database information
+ kusdb_get_memory - copy SGA contents into user-allocated memory
+ kusdb_disconnect - disconnect from database
+ kusdb_error_text - format message for last error
+ kustv_allocate_handle - allocate a TLV handle
+ kustv_dump - dump a TLV buffer
+ kustv_free_handle - free a TLV handle
+ kustv_get - get next entry in a TLV buffer
+ kustv_offset - return offset for current entry in TLV buffer
+ kussys_get_info - retrieve non-db-related info (noop for Oracle)
+ kussys_error_text - format message for last error (noop for Oracle)
+ kustvp1_put_one_byte - put TLV entry with 1 byte value into TLV buffer
+ kustvp2_put_two_bytes - put TLV entry with 2 byte value into TLV buffer
+ kustvp4_put_four_bytes - put TLV entry with 4 byte value into TLV buffer
+ kustv_put - put TLV entry into TLV buffer
+ kustvptg_put_tag - put TLV entry with empty value into TLV buffer
+ kustv_reinit_handle - reset offset for a TLV handle
+ kustv_buffer_state - return termination state for tlv buffer
+
+ NOTES
+ This interface is subject to change without notice
+
+ MODIFIED (MM/DD/YY)
+ pabingha 03/14/97 - Add get_tagname argument
+ jstenois 11/05/96 - "Make kustv_dump() header CONST"
+ jstenois 11/01/96 - Use oratypes instead of sx.h
+ jstenois 08/15/96 - SGAAPI public include file
+ jstenois 08/15/96 - Creation
+
+*/
+
+
+#ifndef KUSAPI
+# define KUSAPI
+
+# ifndef ORATYPES
+# include <oratypes.h>
+# endif
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+/* values for status code returned by API calls */
+
+typedef enum kusst
+ {
+
+ KUSSTOK = 1, /* Success */
+ KUSSTEOB = 2, /* Cursor at end of buffer. */
+ KUSSTNWR = 3, /* Attempt to write to TLV when no */
+ /* length specified at init time */
+ KUSSTILN = 4, /* Invalid length specified when */
+ /* passing by value */
+ KUSSTTRNC = 5, /* buffer was truncated */
+ KUSSTCONT = 6, /* buffer is continued */
+ KUSSTALLC = 7, /* unable to allocate memory */
+ KUSSTUNKC = 8, /* unknown class tag specified */
+ KUSSTICH = 9, /* Invalid context handle */
+ KUSSTIDH = 10, /* Invalid database handle */
+ KUSSTITH = 11, /* Invalid TLV handle */
+ KUSSTDIS = 12, /* Stats collection disabled for database */
+ KUSSTERR = 13, /* Unexpected error encountered */
+ KUSSTBINF = 14, /* Input buffer contained a bad tag */
+ KUSSTBDKY = 15, /* Bad index value for class tag */
+ KUSSTBFSML = 16, /* Buffer is too small for data */
+ KUSSTIBE = 17, /* Information buffer is empty */
+ KUSSTDBDOWN = 18, /* Database is unavaliable */
+ KUSSTFILACC = 19, /* File cannot be accessed */
+ KUSSTINVDB = 20, /* File is not a db root file (Rdb only)*/
+ KUSSTNODB = 21, /* Db root file doesn't exist (Rdb only)*/
+ KUSSTBADVER = 22, /* Db root file wrong version (Rdb only)*/
+ KUSSTCIU = 23, /* Context is already in use */
+ KUSSTDMPOP = 24, /* Unable to open dump output file */
+ KUSSTDMPCL = 25 /* Unable to close dump output file */
+ } kusst;
+
+
+/* values returned by kustvstate */
+
+typedef enum kustvs
+ {
+ KUSTVS_CONT = 1, /* tlv buffer terminated with KUSSTCONT */
+ KUSTVS_END = 2, /* tlv buffer terminated with KUSSTBEND */
+ KUSTVS_TRUNC = 3, /* tlv buffer terminated with KUSSTTRNC */
+ KUSTVS_UNK = 4 /* handle specified has not been used */
+ /* to read or write a termination tag */
+ } kustvs;
+
+
+/* Type Definitions for handles */
+
+typedef dvoid *kusdb_handle; /* handle for connected database */
+typedef dvoid *kuscx_handle; /* handle for continuation context */
+typedef dvoid *kustv_handle; /* handle for TLV context */
+
+/* Data structure for use by kusdb_get_memory */
+
+typedef struct kusmem
+ {
+ ub1 *sga_address_kusmem; /* SGA memory address */
+ ub4 length_kusmem; /* Number of bytes to copy */
+ ub1 *dest_address_kusmem; /* User-allocated destination for SGA data */
+ } kusmem;
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+/* ---------------------------- kuscx_allocate ----------------------------- */
+/*
+ NAME
+ kuscx_allocate - allocate continuation context
+ DESCRIPTION
+ Allocate space to track information about continuation context for a
+ kusdb_get_info call.
+ PARAMETERS
+ context_handle - handle for the continuation context (in/out)
+ RETURN VALUE
+ status of call
+ NOTES
+ kuscx_init can be used to reinitilize a context that has been allocated
+ and is no longer used for a TLV buffer
+*/
+
+kusst kuscx_allocate (/*_ kuscx_handle *context_handle _*/);
+
+
+
+
+/* ------------------------------ kuscx_free_handle ------------------------ */
+/*
+ NAME
+ kuscx_free_handle - free continuation context
+ DESCRIPTION
+ free space used to track information about continuation context for a
+ kusdb_get_info call.
+ PARAMETERS
+ context_handle - handle for the continuation context (in/out)
+ RETURN VALUE
+ status of call
+ NOTES
+ kuscx_init can be used to reinitilize a context that has been allocated
+ and is no longer used for a TLV buffer
+*/
+
+kusst kuscx_free_handle (/*_ kuscx_handle *context_handle _*/);
+
+
+
+
+/* ------------------------------ kuscx_init ------------------------------- */
+/*
+ NAME
+ kuscx_init - initialize continuation context
+ DESCRIPTION
+ Reinitialize a context handle that has been previously allocated and used.
+ PARAMETERS
+ context_handle - handle for the continuation context (in/out)
+ RETURN VALUE
+ status of call
+ NOTES
+ kuscx_init is the semantic equivalent of freeing a context handle and then
+ allocating a new one.
+*/
+
+kusst kuscx_init (/*_ kuscx_handle *context_handle _*/);
+
+
+
+/* ----------------------------- kusdb_allocate ---------------------------- */
+/*
+ NAME
+ kusdb_allocate - allocate a database handle
+ DESCRIPTION
+ allocate resources for a database handle
+ PARAMETERS
+ db_handle - handle for the database context (in/out)
+ RETURN VALUE
+ kusst - status of attempt to allocate
+*/
+
+kusst kusdb_allocate (/*_ kusdb_handle *db_handle _*/);
+
+
+
+
+/* ----------------------------- kusdb_connect ----------------------------- */
+/*
+ NAME
+ kusdb_connect - connect to a database
+ DESCRIPTION
+ Connects to a database so that statistics for that database can be
+ retrieved.
+ PARAMETERS
+ db_handle - handle for the database context (in/out)
+ database_name_length - number of bytes in database_name parameter
+ database name - name of database
+ security_info_length - number of bytes in security_info parameter
+ security_info - security information used to attach to database
+ RETURN VALUE
+ status of attempt to connect
+ NOTES
+ If the status is not successful, call kusdb_error_text to get more
+ information about the failure.
+ Refer to the documentation for the format of information in the
+ database_name and security_info parameters.
+*/
+
+kusst kusdb_connect (/*_
+ kusdb_handle db_handle,
+ ub4 database_name_length,
+ char *database_name,
+ ub4 security_info_length,
+ char *security_info
+ _*/);
+
+
+
+
+/* ---------------------------- kusdb_disconnect --------------------------- */
+/*
+ NAME
+ kusdb_disconnect - disconnect from a database
+ DESCRIPTION
+ Disconnect from the current database
+ PARAMETERS
+ db_handle - handle for the database (in/out)
+ RETURN VALUE
+ status of call
+ NOTES
+*/
+
+kusst kusdb_disconnect (/*_ kusdb_handle db_handle _*/);
+
+
+
+
+/* ------------------------------- kusdb_free ------------------------------ */
+/*
+ NAME
+ kusdb_free - free a database handle
+ DESCRIPTION
+ free resources for a database handle
+ PARAMETERS
+ db_handle - handle for the database context (in/out)
+ RETURN VALUE
+ kusst - status of attempt to free the handle
+*/
+
+kusst kusdb_free (/*_ kusdb_handle *db_handle _*/);
+
+
+
+
+/* ----------------------------- kusdb_get_info ---------------------------- */
+/*
+ NAME
+ kusdb_get_info - retrieve statistics for a database
+ DESCRIPTION
+ Retrieve requested statistics for the current database
+ PARAMETERS
+ db_handle - handle for the database (in)
+ context_handle - handle for the continuation context (in/out)
+ info_buf - TLV buffer indicating data to be returned (in)
+ info_buf_len - number of bytes in info_buffer (in)
+ result_buf - allocated TLV buffer to hold data returned (in/out)
+ result_buf_len - number of bytes in result_buf (in/out)
+ buffer_termination_status - indicates how buffer was terminated (normally,
+ truncated, or continued) (out)
+ RETURN VALUE
+ status of call
+ NOTES
+ If the status is not successful, call kusdb_error_text to get more
+ information about the failure.
+ Refer to documentation for information on the format of the information
+ buffer and the result buffer
+*/
+
+kusst kusdb_get_info (/*_
+ kusdb_handle db_handle,
+ kuscx_handle ctx_handle,
+ ub1 *info_buffer,
+ ub4 info_buffer_length,
+ ub1 *result_buffer,
+ ub4 *result_buffer_length,
+ kustvs *buffer_termination_status
+ _*/);
+
+
+
+/* ----------------------------- kusdb_get_memory -------------------------- */
+/*
+ NAME
+ kusdb_get_memory - copy SGA contents into user-allocated memory
+ DESCRIPTION
+ Copy SGA memory into user-allocated memory regions. User provides
+ an array of kusmem structures. Each kusmem structure in the array
+ describes a distinct copy to be done by this routine.
+ PARAMETERS
+ db_handle - handle for the database (in)
+ mem_array_length - number of elements in mem_array (in)
+ mem_array - address of an array of kusmem structures (in/out)
+ RETURN VALUE
+ status of call:
+ KUSSTOK - call succeeded, all requested data copied
+ KUSSTIDH - invalid database handle
+ KUSSTDBDOWN - database is down
+ KUSSTERR - unexpected error
+ NOTES
+ User should prepare each kusmem structure in array by filling in
+ values for sga_address_kusmem, length_kusmem and dest_address_kusmem
+ prior to making this call.
+
+ User is reponsible for allocating and deallocating the memory used
+ by mem_array and each region that a dest_address_kusmem points to.
+*/
+
+kusst kusdb_get_memory (/*_
+ kusdb_handle db_handle,
+ ub4 mem_array_length,
+ kusmem *mem_array
+ _*/);
+
+
+
+
+/* ---------------------------- kusdb_error_text --------------------------- */
+/*
+ NAME
+ kusdb_error_text - error text
+ DESCRIPTION
+ Display information about status of last kusdb call
+ PARAMETERS
+ db_ctx - context whose errors are to be returned (in)
+ text_buf - buffer to hold error message (in/out)
+ text_buf_len - number of bytes in text buffer (in)
+ text_len_out - number of bytes written into text_buf
+ RETURN VALUE
+ status of call
+ NOTES
+*/
+
+kusst kusdb_error_text (/*_ kusdb_handle db_ctx, char *text_buf,
+ ub4 text_buf_len, ub4 *text_len_out _*/);
+
+
+
+
+/* ------------------------ kustv_allocate_handle -------------------------- */
+/*
+ NAME
+ kustv_allocate_handle - allocate a handle for a TLV buffer
+ DESCRIPTION
+ allocates and initializes information for a TLV handle
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer (in/out)
+ tlv_buffer - address of the TLV buffer for this handle (in)
+ buf_size - number of bytes in tlv_buffer (in)
+ RETURN VALUE
+ KUSSTALL Unable to allocate memory
+ NOTES
+ kustv_reinit can be used to reinitialize a TLV handle that is no longer
+ needed.
+*/
+
+kusst kustv_allocate_handle (/*_
+ kustv_handle *tlv_handle,
+ ub1 *tlv_buffer,
+ ub4 buf_size
+ _*/);
+
+
+#ifndef _WINDOWS
+
+
+/* ------------------------------- kustv_dump -------------------------------*/
+/*
+ NAME
+ kustv_dump - dump tlv buffer
+ DESCRIPTION
+ Formats the content of a TLV buffer into the file specified by the caller
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer to be dumped (in)
+ header - ASCIZ string to be displayed before dumping the buffer (in)
+ data_flg - flag to indicate if the contents of the value fueld in the TLV
+ should be displayed (in)
+ append_flg - flag to indicate if an existing instance of the output
+ file should be appended to (or replaced)
+ get_tagname - routine to get text associated with tags
+ directory - ASCIZ string containing a directory specification for the
+ output file (if absent, current default directory is used)
+ file_name - ASCIZ string containing a file name for the output file.
+ If absent, stderr is used and append_flg and directory are ignored.
+ If specified without an extension, the Oracle extension for an output
+ file on the given platform is used.
+ RETURN VALUE
+ KUSSTOK Success
+ KUSSTITH invalid tlv handle
+ KUSSTDMPOP can't open dump file
+ KUSSTDMPCL can't close dump file
+ NOTES
+*/
+
+kusst kustv_dump (/*_
+ kustv_handle tlv_handle,
+ CONST char *header,
+ int data_flg,
+ int append_flg,
+ CONST char *(*get_tagname)(ub2),
+ CONST char *directory,
+ CONST char *file_name
+ _*/);
+
+#endif
+
+
+/* ------------------------- kustv_free_handle ----------------------------- */
+/*
+ NAME
+ kustv_free_handle - free a handle for a TLV buffer
+ DESCRIPTION
+ Free a TLV handle that has already been created
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer (in/out)
+ RETURN VALUE
+ status of call
+ NOTES
+ kustv_reinit_handle can be used to reinitialize a handle that is no
+ longer needed.
+*/
+
+kusst kustv_free_handle (/*_ kustv_handle *tlv_handle _*/);
+
+/* ----------------------------- kussys_get_info --------------------------- */
+/*
+ NAME
+ kussys_get_info - retrieve non database specific data
+ DESCRIPTION
+ Retrieve non database specific information
+ PARAMETERS
+ context_handle - handle for the continuation context (in/out)
+ info_buf - TLV buffer indicating data to be returned (in)
+ info_buf_len - number of bytes in info_buffer (in)
+ result_buf - allocated TLV buffer to hold data returned (in/out)
+ result_buf_len - number of bytes in result_buf (in/out)
+ buffer_termination_status - indicates how buffer was terminated (normally,
+ truncated, or continued) (out)
+ RETURN VALUE
+ status of call
+ NOTES
+ This function is a noop for Oracle. It is included for compatability
+ with Rdb only.
+*/
+
+kusst kussys_get_info (/*_
+ kuscx_handle ctx_handle,
+ ub1 *info_buffer,
+ ub4 info_buffer_length,
+ ub1 *result_buffer,
+ ub4 *result_buffer_length,
+ kustvs *buffer_termination_status
+ _*/);
+
+
+
+
+
+/* ---------------------------- kussys_error_text -------------------------- */
+/*
+ NAME
+ kussys_error_text - error text
+ DESCRIPTION
+ Display information about status of last kustv call
+ PARAMETERS
+ text_buf - buffer to hold error message (in/out)
+ text_buf_len - number of bytes in text buffer (in)
+ text_len_out - number of bytes written into text_buf
+ RETURN VALUE
+ status of call
+ NOTES
+ This function is a noop for Oracle. It is included for compatability
+ with Rdb only.
+*/
+
+kusst kussys_error_text (/*_ char *text_buf,
+ ub4 text_buf_len, ub4 *text_len_out _*/);
+
+
+
+
+/* ------------------------------ kustv_get -------------------------------- */
+/*
+ NAME
+ kustv_get - get next entry in tlv buffer
+ DESCRIPTION
+ Retrieves information about next entry in the tlv buffer and advances
+ pointer into the TLV buffer to the following entry.
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer (in)
+ tag - tag for the next entry (out)
+ length - number of bytes in the value for the TLV entry (out)
+ value - pointer to value field for the TLV entry (out)
+ RETURN VALUE
+ KUSSTOK Success
+ KUSSTITH Invalid TLV handle
+ NOTES
+*/
+
+kusst kustv_get (/*_
+ kustv_handle tlv_handle,
+ ub2 *tag,
+ ub2 *length,
+ ub1 **value
+ _*/);
+
+
+
+
+
+/* ------------------------ kustv_reinit_handle ---------------------------- */
+/*
+ NAME
+ kustv_reinit_handle - reinitialize a TLV handle
+ DESCRIPTION
+ Reimitializes a TLV handle so that it can be used to read or write a new
+ TLV buffer.
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer (in/out)
+ buffer - address of the TLV buffer
+ buffer_size - number of bytes in the TLV buffer
+ RETURN VALUE
+ KUSSTOK Success
+ KUSSTITH Invalid TLV handle
+ NOTES
+*/
+
+kusst kustv_reinit_handle (/*_
+ kustv_handle tlv_handle,
+ ub1 *buffer,
+ ub4 buffer_length
+ _*/);
+
+
+
+
+
+/* --------------------------- kustv_length -------------------------------- */
+
+/*
+ NAME
+ kustv_length - return length of a TLV buffer
+ DESCRIPTION
+ return the length of a TLV buffer associated with a TLV handle
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer (in)
+ buffer_length - number of bytes in the buffer (out)
+ RETURN VALUE
+ KUSSTOK Success
+ KUSSTITL Invalid TLV handle
+ NOTES
+*/
+
+kusst kustv_length (/*_
+ kustv_handle tlv_handle,
+ ub4 buffer_length
+ _*/);
+
+
+
+
+/* ---------------------------- kustv_offset ------------------------------- */
+
+/*
+ NAME
+ kustv_offset - return offset of a TLV buffer
+ DESCRIPTION
+ return the current offset of a TLV buffer associated with a TLV handle
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer (in)
+ offset - current offset for TLV buffer (out)
+ RETURN VALUE
+ KUSSTOK - success
+ KUSSTITH - invalid TLV handle
+ NOTES
+*/
+
+kusst kustv_offset (/*_
+ kustv_handle tlv_handle,
+ ub4 *offset
+ _*/);
+
+
+
+
+/* ------------------------ kustvp1_put_one_byte --------------------------- */
+
+/*
+ NAME
+ kustvp1_put_one_byte - Insert a TLV entry with a value field of 1 byte
+ DESCRIPTION
+ Adds a new TLV entry to the end of the current TLV buffer. This entry
+ contains 1 byte.
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer (in/out)
+ tag - tag for the new entry (in)
+ value - value for the new entry (in)
+ RETURN VALUE
+ status of the operation
+ NOTES
+*/
+
+kusst kustvp1_put_one_byte (/*_
+ kustv_handle tlv_handle,
+ ub2 tag,
+ ub1 value
+ _*/);
+
+
+
+
+/* ------------------------- kustvp2_put_two_bytes ------------------------- */
+
+/*
+ NAME
+ kustvp2_put_two_bytes - Insert a TLV entry with a value field of 2 byte
+ DESCRIPTION
+ Adds a new TLV entry to the end of the current TLV buffer. This entry
+ contains 2 bytes.
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer (in/out)
+ tag - tag for the new entry (in)
+ value - value for the new entry (in)
+ RETURN VALUE
+ status of the operation
+ NOTES
+*/
+
+kusst kustvp2_put_two_bytes (/*_
+ kustv_handle tlv_handle,
+ ub2 tag,
+ ub2 value
+ _*/);
+
+
+
+
+/* ----------------------- kustvp4_put_four_bytes -------------------------- */
+
+/*
+ NAME
+ kustvp4_put_four_bytes - Insert a TLV entry with a value field of 4 byte
+ DESCRIPTION
+ Adds a new TLV entry to the end of the current TLV buffer. This entry
+ contains 4 bytes.
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer (in/out)
+ tag - tag for the new entry (in)
+ value - value for the new entry (in)
+ RETURN VALUE
+ status of the operation
+ NOTES
+*/
+
+kusst kustvp4_put_four_bytes (/*_
+ kustv_handle tlv_handle,
+ ub2 tag,
+ ub4 value
+ _*/);
+
+
+
+
+/* ----------------------------- kustv_put --------------------------------- */
+
+/*
+ NAME
+ kustv_put - Insert a TLV entry
+ DESCRIPTION
+ Adds a new TLV entry to the end of the current TLV buffer.
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer (in/out)
+ tag - tag for the new entry (in)
+ length - number of bytes in the new entry (in)
+ value - value for the new entry (in)
+ RETURN VALUE
+ status of the operation
+ NOTES
+*/
+
+kusst kustv_put (/*_
+ kustv_handle tlv_handle,
+ ub2 tag,
+ ub2 length,
+ dvoid *value
+ _*/);
+
+
+
+
+/* -------------------------- kustvptg_put_tag ----------------------------- */
+
+/*
+ NAME
+ kustvptg_put_tag - Insert a TLV entry with no value field
+ DESCRIPTION
+ Adds a new TLV entry to the end of the current TLV buffer. the entry
+ contains a 0-length value field.
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer (in/out)
+ tag - tag for the new entry (in)
+ RETURN VALUE
+ status of the operation
+ NOTES
+*/
+
+kusst kustvptg_put_tag (/*_
+ kustv_handle tlv_handle,
+ ub2 tag
+ _*/);
+
+
+
+
+
+/* -------------------------- kustv_buffer_state --------------------------- */
+
+/*
+ NAME
+ kustv_buffer_state - return termination state of TLV buffer
+ DESCRIPTION
+ Returns informationon how a TLV buffer was terminated. This call returns
+ useful information only if a TLV handle was used to read or write the
+ termination tag. The termination information is preserved
+ PARAMETERS
+ tlv_handle - handle of the TLV buffer (in)
+ state - termination state for the TLV (out)
+ RETURN VALUE
+ status of the operation
+ NOTES
+*/
+
+kusst kustv_buffer_state (/*_
+ kustv_handle tlv_handle,
+ kustvs *state
+ _*/);
+
+
+#endif /* kusapi */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/kustags.h b/src/terralib/drivers/OracleSpatial/OCI/include/kustags.h
new file mode 100644
index 0000000..889e62a
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/kustags.h
@@ -0,0 +1,1034 @@
+/* copyright (c) Oracle Corporation 1995. All Rights Reserved. */
+
+/*
+ NAME
+ kustags.h - definition of tags for statistics API
+ DESCRIPTION
+ Definitions of tags used for Oracle's statistics API.
+ PUBLIC FUNCTIONS
+ none
+ PRIVATE FUNCTIONS
+ none
+ NOTES
+ This file is a generated and should NOT BE EDITTED
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef KUSTAGS
+#define KUSTAGS
+
+/* DISABLE check_macro_naming */
+/* Lint exception approved 9/24/96 by BCCHANG and JMULLER */
+
+/* PUBLIC TYPES AND CONSTANTS */
+#define RMUST_T_ACCESS_MODE 15
+#define RMUST_T_ACTIVE_FLG 16
+#define RMUST_T_AIJ_COMMIT_FLG 17
+#define RMUST_T_AIJ_ENABLED_FLG 18
+#define RMUST_T_AIJ_STATUS 19
+#define RMUST_T_ALARM_ENABLED_FLG 20
+#define RMUST_T_ALLOCATION 21
+#define RMUST_T_ALS_MODE_FLG 22
+#define RMUST_T_ARPMS 23
+#define RMUST_T_ASCII_DEADLOCK 24
+#define RMUST_T_ASCII_STALL 25
+#define RMUST_T_ASCII_TIMEOUT 26
+#define RMUST_T_AUDIT_ENABLED_FLG 27
+#define RMUST_T_AUDIT_FIRST_FLG 28
+#define RMUST_T_AUDIT_FLUSH_FLG 29
+#define RMUST_T_AUTO_BKUP_FLG 30
+#define RMUST_T_FILID_SLOTNUM 31
+#define RMUST_T_BACKUP_DATE_ADT 32
+#define RMUST_T_BACKUP_DATE_FDT 33
+#define RMUST_T_BACKUP_DATE_TDT 34
+#define RMUST_T_BIOCNT 35
+#define RMUST_T_BKUP_ACTIVE_FLG 36
+#define RMUST_T_BKUP_VNO 37
+#define RMUST_T_CACHE_FILENAME 38
+#define RMUST_T_CALC_PNO 39
+#define RMUST_T_CKPT_BLOCKS 40
+#define RMUST_T_CKPT_TIME 41
+#define RMUST_T_CORRUPT_FLG 42
+#define RMUST_T_CPUTIM_RT 43
+#define RMUST_T_CREATE_DATE_ADT 44
+#define RMUST_T_CREATE_DATE_FDT 45
+#define RMUST_T_CREATE_DATE_TDT 46
+#define RMUST_T_CUR_ACTIVE_AIJ 47
+#define RMUST_T_CUR_AIJ_FILENAME 48
+#define RMUST_T_CUR_BKUP_FILENAME 49
+#define RMUST_T_CUR_BKUP_VNO 50
+#define RMUST_T_CUR_RCVR_VNO 51
+#define RMUST_T_DATA_CMIT_FLG 52
+#define RMUST_T_DBID 53
+#define RMUST_T_DBR_ACTIVITY 54
+#define RMUST_T_DBR_BUF_CNT 55
+#define RMUST_T_LSS_LAG_FDT 56
+#define RMUST_T_DB_BKUP_VNO 57
+#define RMUST_T_DEADLOCK_SEQ 58
+#define RMUST_T_DEADLOCK_SINCE_ADT 59
+#define RMUST_T_DEADLOCK_SINCE_TT 60
+#define RMUST_T_DEADLOCK_SINCE_RT 61
+#define RMUST_T_DEFERRED_SNAP_FLG 62
+#define RMUST_T_DEF_AIJ_FILENAME 63
+#define RMUST_T_DEF_ALLOCATION 64
+#define RMUST_T_DEF_BKUP_FILENAME 65
+#define RMUST_T_DEF_BUF_CNT 66
+#define RMUST_T_DEF_EXTENSION 67
+#define RMUST_T_DIOCNT 68
+#define RMUST_T_ENQCNT 69
+#define RMUST_T_EXTENSION 70
+#define RMUST_T_EXT_COUNT 71
+#define RMUST_T_EXT_ENABLED_FLG 72
+#define RMUST_T_EXT_PERCENT 73
+#define RMUST_T_FAST_COMMIT_FLG 74
+#define RMUST_T_FILENAME 75
+#define RMUST_T_FULL_BACKUP_TSN 76
+#define RMUST_T_GB_CNT 77
+#define RMUST_T_GB_ENABLED_FLG 78
+#define RMUST_T_HARD_DATA_LOSS_FLG 79
+#define RMUST_T_IMAGENAME 80
+#define RMUST_T_INCONSISTENT_FLG 81
+#define RMUST_T_INC_RES_DATE_ADT 82
+#define RMUST_T_INC_RES_DATE_FDT 83
+#define RMUST_T_INC_RES_DATE_TDT 84
+#define RMUST_T_INIT_ACTIVE_FLG 85
+#define RMUST_T_IS_STALLED 86
+#define RMUST_T_JOURNAL_CNT 87
+#define RMUST_T_JOURNAL_NAME 88
+#define RMUST_T_JOURNAL_STATUS 89
+#define RMUST_T_LAST_BKUP_VNO 90
+#define RMUST_T_LCKOPT_ENABLED_FLG 91
+#define RMUST_T_LINKAGE_DBID 92
+#define RMUST_T_LKID 93
+#define RMUST_T_LOCK_TIMEOUT 94
+#define RMUST_T_MAX_EXT_PAGCNT 95
+#define RMUST_T_MAX_GB_PER_USER 96
+#define RMUST_T_MAX_NODE_CNT 97
+#define RMUST_T_MAX_PNO 98
+#define RMUST_T_MAX_USER_CNT 99
+#define RMUST_T_MIN_EXT_PAGCNT 100
+#define RMUST_T_MIXED_FMT_FLG 101
+#define RMUST_T_MODIFIED_FLG 102
+#define RMUST_T_NEW_VERSION_FLG 104
+#define RMUST_T_NUMBIO 105
+#define RMUST_T_NUMDIO 106
+#define RMUST_T_OPEN_MODE_FLG 107
+#define RMUST_T_OPER_CLASS 108
+#define RMUST_T_OVERWRITE_FLG 109
+#define RMUST_T_OVERWRITTEN_FLG 110
+#define RMUST_T_PAG_BLKCNT 111
+#define RMUST_T_PGFCNT 112
+#define RMUST_T_PGFLTS 113
+#define RMUST_T_PID 114
+#define RMUST_T_PROCNAME 115
+#define RMUST_T_PSTATE 116
+#define RMUST_T_RESTORED_FLG 117
+#define RMUST_T_RTPMS 118
+#define RMUST_T_SFDB_FLG 119
+#define RMUST_T_SHUTDOWN_TIME 120
+#define RMUST_T_SNAPSHOT_FLG 121
+#define RMUST_T_SNAPS_ALLOWED_FLG 122
+#define RMUST_T_SNAPS_ENABLED_FLG 123
+#define RMUST_T_SOFT_DATA_LOSS_FLG 124
+#define RMUST_T_SPAMS_ENABLED_FLG 125
+#define RMUST_T_SPAMS_FLG 126
+#define RMUST_T_STALL_SINCE_ADT 127
+#define RMUST_T_STALL_SINCE_TT 128
+#define RMUST_T_STALL_SINCE_RT 129
+#define RMUST_T_STALL_THRESHOLD_RT 130
+#define RMUST_T_STAREA_NAME 131
+#define RMUST_T_STATS_ENABLED_FLG 132
+#define RMUST_T_STID 133
+#define RMUST_T_TIMEOUT_SEQ 134
+#define RMUST_T_TIMEOUT_SINCE_ADT 135
+#define RMUST_T_TIMEOUT_SINCE_TT 136
+#define RMUST_T_TIMEOUT_SINCE_RT 137
+#define RMUST_T_TSN_INTERVAL 138
+#define RMUST_T_USERNAME 139
+#define RMUST_T_VBN 140
+#define RMUST_T_VMSIZE 141
+#define RMUST_T_WSSIZE 142
+#define RMUST_T_THRESHOLD 143
+#define RMUST_T_BUF_BLOCK_CNT 144
+#define RMUST_T_FILID_CNT 145
+#define RMUST_T_STALL_INDEX 146
+#define RMUST_T_AIJ_LEOF 147
+#define RMUST_T_AIJ_PEOF 148
+#define RMUST_T_ALS_ACTIVE 149
+#define RMUST_T_CACHE_STATUS 150
+#define RMUST_T_AIJ_SHUTDOWN 151
+#define RMUST_T_RELATION_NAME 152
+#define RMUST_T_ISA_VIEW 153
+#define RMUST_T_FIELD_NAMES 154
+#define RMUST_T_INDEX_NAME 155
+#define RMUST_T_INDEX_UNIQUE 156
+#define RMUST_T_INDEX_TYPE 157
+#define RMUST_T_LSS_AIJ_VNO 158
+#define RMUST_T_LSS_AIJ_VBN 159
+#define RMUST_T_DELTA_HSEC 160
+#define RMUST_T_PLATFORM 161
+#define RMUST_T_LSS_STATE 162
+#define RMUST_T_AIJ_AUTO_SYNC 163
+#define RMUST_T_AIJ_DATA_SYNC 164
+#define RMUST_T_AIJ_VNO 165
+#define RMUST_T_AIJ_SRV_NAME 166
+#define RMUST_T_STBY_RT_FILNAM 167
+#define RMUST_T_AIJ_CUR_MSN 168
+#define RMUST_T_AIJ_STALLED_MSN 169
+#define RMUST_T_LCS_ACTIVE 170
+#define RMUST_T_LRS_STATE 171
+#define RMUST_T_LRS_ACTIVE 172
+#define RMUST_T_LSS_ACTIVE 173
+#define RMUST_T_GOVERNOR_ENABLED 174
+#define RMUST_T_LSS_REF_COUNT 175
+#define RMUST_T_AIJFB_INDEX 176
+#define RMUST_T_PROC_INDEX 177
+#define RMUST_T_DBR_INDEX 178
+#define RMUST_T_SAMPLE_INTERVAL 179
+#define RMUST_T_DBMSROOT 180
+#define RMUST_T_MAJ_VER 181
+#define RMUST_T_MIN_VER 182
+#define RMUST_T_CHECKSUM 183
+#define RMUST_T_VERSION_ADT 184
+#define RMUST_T_VERSION_FDT 185
+#define RMUST_T_VERSION_TDT 186
+#define RMUST_T_LADB_FLG 187
+#define RMUST_T_RUJ_CORRUPT_FLG 188
+#define RMUST_T_ROOT_CORRUPT_FLG 189
+#define RMUST_T_FIB_ENABLED_FLG 190
+#define RMUST_T_APF_ENABLED_FLG 191
+#define RMUST_T_ABW_ENABLED_FLG 192
+#define RMUST_T_PLT_ENABLED_FLG 193
+#define RMUST_T_OPT_ENABLED_FLG 194
+#define RMUST_T_STBY_READ_ONLY_FLG 195
+#define RMUST_T_DAPF_ENABLED_FLG 196
+#define RMUST_T_RCVR_QUIET_POINT_FLG 197
+#define RMUST_T_SSB_ENABLED_FLG 198
+#define RMUST_T_DB_MODIFIED_FLG 199
+#define RMUST_T_ACTIVE_VBN 200
+#define RMUST_T_AIJDB_VBN 201
+#define RMUST_T_AIJFB_VBN 202
+#define RMUST_T_CLIENT_VBN 203
+#define RMUST_T_COSI_VBN 204
+#define RMUST_T_CPT_VBN 205
+#define RMUST_T_FILID_VBN 206
+#define RMUST_T_MEMBIT_VBN 207
+#define RMUST_T_RTUPB_VBN 208
+#define RMUST_T_RUJBLK_VBN 209
+#define RMUST_T_SEQBLK_VBN 210
+#define RMUST_T_TSNBLK_VBN 211
+#define RMUST_T_AIJFB_CNT 212
+#define RMUST_T_RTUPB_BLKCNT 213
+#define RMUST_T_TSNBLK_CNT 214
+#define RMUST_T_ALG_COUNT 215
+#define RMUST_T_ALG_FACTORS 216
+#define RMUST_T_AUDIT_FLAGS 217
+#define RMUST_T_ALARM_NAME 218
+#define RMUST_T_MIN_PAG_BLKCNT 219
+#define RMUST_T_MAX_PAG_BLKCNT 220
+#define RMUST_T_MAX_PIB_COUNT 221
+#define RMUST_T_SEQBLK_CNT 222
+#define RMUST_T_APF_DEPTH 223
+#define RMUST_T_ABW_CLEAN_BUF_CNT 224
+#define RMUST_T_ABW_BATCH_MAX 225
+#define RMUST_T_CLIENT_BLKCNT 226
+#define RMUST_T_COSI_BLKCNT 227
+#define RMUST_T_RMU_CLIENT_VBN 228
+#define RMUST_T_RMU_CLIENT_BLKCNT 229
+#define RMUST_T_CLOSE_MODE 230
+#define RMUST_T_CLOSE_INTERVAL 231
+#define RMUST_T_RCACHE_VBN 232
+#define RMUST_T_RCACHE_CNT 233
+#define RMUST_T_DAPF_DEPTH 234
+#define RMUST_T_DAPF_THRESHOLD 235
+#define RMUST_T_TXN_MODE_FLAGS 236
+#define RMUST_T_RCS_SWEEP_INTERVAL 237
+#define RMUST_T_ACTIVE_BACKUP_TSN 238
+#define RMUST_T_BOOTSTRAP_DBK 239
+#define RMUST_T_HRL_FLG 241
+#define RMUST_T_WRL_FLG 242
+#define RMUST_T_RESTRICT_ACCESS_FLG 243
+#define RMUST_T_ALTER_CNT 244
+#define RMUST_T_ALTER_TAD_ADT 245
+#define RMUST_T_ALTER_TAD_FDT 246
+#define RMUST_T_ALTER_TAD_TDT 247
+#define RMUST_T_INC_RES_TAD_ADT 248
+#define RMUST_T_INC_RES_TAD_FDT 249
+#define RMUST_T_INC_RES_TAD_TDT 250
+#define RMUST_T_FULL_BCK_TAD_ADT 251
+#define RMUST_T_FULL_BCK_TAD_FDT 252
+#define RMUST_T_FULL_BCK_TAD_TDT 253
+#define RMUST_T_LAST_BACKUP_TSN 254
+#define RMUST_T_LAST_BACKUP_CSN 255
+#define RMUST_T_LAST_FULL_BACKUP_TSN 256
+#define RMUST_T_FULL_VER_TAD_ADT 257
+#define RMUST_T_FULL_VER_TAD_FDT 258
+#define RMUST_T_FULL_VER_TAD_TDT 259
+#define RMUST_T_INC_VER_TAD_ADT 260
+#define RMUST_T_INC_VER_TAD_FDT 261
+#define RMUST_T_INC_VER_TAD_TDT 262
+#define RMUST_T_FULL_RES_TAD_ADT 263
+#define RMUST_T_FULL_RES_TAD_FDT 264
+#define RMUST_T_FULL_RES_TAD_TDT 265
+#define RMUST_T_ALT_BOOTSTRAP_DBK 266
+#define RMUST_T_RESTORE_ROOT_TAD_ADT 267
+#define RMUST_T_RESTORE_ROOT_TAD_FDT 268
+#define RMUST_T_RESTORE_ROOT_TAD_TDT 269
+#define RMUST_T_PAG_DBID 271
+#define RMUST_T_RELATED_FLG 272
+#define RMUST_T_COUPLED_FLG 274
+#define RMUST_T_CSM_FLG 275
+#define RMUST_T_SPREAD_FLG 276
+#define RMUST_T_RESTRUCTURED_FLG 277
+#define RMUST_T_WORM_DEVFULL_FLG 278
+#define RMUST_T_2PPL_ENABLED_FLG 279
+#define RMUST_T_WORM_AIJ_ENABLED_FLG 280
+#define RMUST_T_WORM_CORRUPT_FLG 281
+#define RMUST_T_RCACHE_ENABLED_FLG 282
+#define RMUST_T_WORM_LEOF 285
+#define RMUST_T_P0_VBN 286
+#define RMUST_T_CLUMP_PAGCNT 287
+#define RMUST_T_PAGES_PER_SPAM 288
+#define RMUST_T_AIJ_RCVR_VNO 289
+#define RMUST_T_PAG_LEN 290
+#define RMUST_T_PPSP1 291
+#define RMUST_T_SPAM_T1 292
+#define RMUST_T_SPAM_T2 293
+#define RMUST_T_SPAM_T3 294
+#define RMUST_T_SPAMVEC_LEN 295
+#define RMUST_T_PAG_PAD_LEN 296
+#define RMUST_T_MAX_FREE_LEN 297
+#define RMUST_T_MAX_NEW_SEG_LEN 298
+#define RMUST_T_MAX_SEG_LEN 299
+#define RMUST_T_BACKUP_STATS 300
+#define RMUST_T_RCACHE_DBID 301
+#define RMUST_T_SNAPS_ENABLED_TSN 302
+#define RMUST_T_COMMIT_TSN 303
+#define RMUST_T_BACKUP_TSN 304
+#define RMUST_T_INCR_BACKUP_TSN 305
+#define RMUST_T_ABS_QUIET_POINT_FLG 306
+#define RMUST_T_LSS_ACTIVE_FLG 307
+#define RMUST_T_LRS_ACTIVE_FLG 308
+#define RMUST_T_MASTER_DB_FLG 309
+#define RMUST_T_LSS_ONLINE_FLG 310
+#define RMUST_T_LSS_QUIET_POINT_FLG 311
+#define RMUST_T_CUR_RCVR_VBN 312
+#define RMUST_T_LSS_CKPT_INTRVL 313
+#define RMUST_T_LSS_WAIT_INTRVL 314
+#define RMUST_T_LSS_TIMEOUT_INTRVL 315
+#define RMUST_T_LSS_BUFFER_CNT 316
+#define RMUST_T_LSS_ACCESS_MODE 317
+#define RMUST_T_LSS_RESOLVE_2PC 318
+#define RMUST_T_LSS_STARTUP_TAD_ADT 319
+#define RMUST_T_LSS_STARTUP_TAD_FDT 320
+#define RMUST_T_LSS_STARTUP_TAD_TDT 321
+#define RMUST_T_BKUP_EDITNAM 322
+#define RMUST_T_REMOTE_NODENAM 323
+#define RMUST_T_SERVER_NAME 324
+#define RMUST_T_BKUP_FAILED_FLG 325
+#define RMUST_T_EMERGENCY_FLG 326
+#define RMUST_T_ACTIVATE_TAD_ADT 327
+#define RMUST_T_ACTIVATE_TAD_FDT 328
+#define RMUST_T_ACTIVATE_TAD_TDT 329
+#define RMUST_T_RDB_CHECKSUM 330
+#define RMUST_T_MONID 332
+#define RMUST_T_TID 333
+#define RMUST_T_TSNBLK_INDEX 334
+#define RMUST_T_TSNBLK_SLOT 335
+#define RMUST_T_REMOTE_FLG 336
+#define RMUST_T_ALS_FLG 337
+#define RMUST_T_DBR_FLG 338
+#define RMUST_T_SERVER_FLG 339
+#define RMUST_T_UTILITY_FLG 340
+#define RMUST_T_LCS_FLG 341
+#define RMUST_T_LRS_FLG 342
+#define RMUST_T_RCS_FLG 343
+#define RMUST_T_LSS_FLG 344
+#define RMUST_T_CKPT_VNO 345
+#define RMUST_T_CKPT_VBN 346
+#define RMUST_T_QUIET_VNO 347
+#define RMUST_T_VLM_ENABLED_FLG 352
+#define RMUST_T_REPLACE_ENABLED_FLG 353
+#define RMUST_T_SLOT_LEN 354
+#define RMUST_T_SLOT_COUNT 355
+#define RMUST_T_MAX_WS_COUNT 356
+#define RMUST_T_NAME 357
+#define RMUST_T_HASHED_INDEX_FLG 358
+#define RMUST_T_LAPMS_INDEX 359
+#define RMUST_T_VLM_WINDOW_COUNT 360
+#define RMUST_T_CKPT_SEQ 361
+#define RMUST_T_DEVDIR 362
+#define RMUST_T_HASH_LDBID_PRIME 363
+#define RMUST_T_HASH_PNO_PRIME 364
+#define RMUST_T_SWEEP_THRESH_HIGH 365
+#define RMUST_T_SWEEP_THRESH_LOW 366
+#define RMUST_T_SWEEP_FREE_PCT 367
+#define RMUST_T_SWEEP_BATCH_COUNT 368
+#define RMUST_T_MAX_RESERVE_COUNT 369
+#define RMUST_T_ALLOC_BLKCNT 370
+#define RMUST_T_EXTEND_BLKCNT 371
+#define RMUST_T_LIMBO_FLG 373
+#define RMUST_T_PREPARED_FLG 374
+#define RMUST_T_XATM_FLG 375
+#define RMUST_T_RESOLVE_FLG 376
+#define RMUST_T_RESOLUTION_FLG 377
+#define RMUST_T_RUJ_FILNAM 378
+#define RMUST_T_TM_LOG_ID 381
+#define RMUST_T_RM_LOG_ID 382
+#define RMUST_T_RM_NAME 383
+#define RMUST_T_NODE_NAME 384
+#define RMUST_T_PARENT_NODE_NAME 385
+#define RMUST_T_WIPMAP 388
+#define RMUST_T_SIPMAP 389
+#define RMUST_T_OLDEST_TSN 390
+#define RMUST_T_COMMIT_CSN 392
+#define RMUST_T_TSN_VEC 393
+#define RMUST_T_COMMIT_TSN_VEC 394
+#define RMUST_T_NEXT_SEQ 396
+#define RMUST_T_GROUP_SIZE 397
+#define RMUST_T_IGNORE_FLG 399
+#define RMUST_T_RECOVER_FLG 400
+#define RMUST_T_UPTO_AREA_FLG 401
+#define RMUST_T_LAST_COMMIT_TSN 403
+#define RMUST_T_PNO 404
+#define RMUST_T_PDBID 405
+#define RMUST_T_ABM_PNO 406
+#define RMUST_T_LAREA_DBID 407
+#define RMUST_T_PAREA_DBID 408
+#define RMUST_T_LAREA_NAME 409
+#define RMUST_T_REC_LEN 411
+#define RMUST_T_LAREA_EXT_CNT 412
+#define RMUST_T_MODULO_HASH_FLG 414
+#define RMUST_T_DELETED_TID 415
+#define RMUST_T_MOD_HASH_KEY_OFFSET 417
+#define RMUST_T_BITMAP 419
+#define RMUST_T_XID_FORMAT_ID 422
+#define RMUST_T_XID_GTRID_LENGTH 423
+#define RMUST_T_XID_BQUAL_LENGTH 424
+#define RMUST_T_XID_DATA 425
+#define RMUST_T_ACE_SIZE 426
+#define RMUST_T_ACE_TYPE 427
+#define RMUST_T_DEFAULT_FLG 428
+#define RMUST_T_PROTECTED_FLG 429
+#define RMUST_T_HIDDEN_FLG 430
+#define RMUST_T_NOPROPAGATE_FLG 431
+#define RMUST_T_READ_PRV_FLG 432
+#define RMUST_T_WRITE_PRV_FLG 433
+#define RMUST_T_EXECUTE_PRV_FLG 434
+#define RMUST_T_DELETE_PRV_FLG 435
+#define RMUST_T_CONTROL_PRV_FLG 436
+#define RMUST_T_DB_VERSION 437
+#define RMUST_T_NODE 438
+#define RMUST_T_CURRENT_TAD_ADT 439
+#define RMUST_T_CURRENT_TAD_FDT 440
+#define RMUST_T_CURRENT_TAD_TDT 441
+#define RMUST_T_NODE_DATABASES 442
+#define RMUST_T_DATABASE 443
+#define RMUST_T_ACTIVE_USERS 444
+#define RMUST_T_MONITOR_LOG 445
+#define RMUST_T_MONITOR_BUFFERS 446
+#define RMUST_T_USER_ID 448
+#define RMUST_T_USER_STATUS 449
+#define RMUST_T_DEVICE_NAME 450
+#define RMUST_T_DEVICE_STATUS 451
+#define RMUST_T_DEVICE_ERROR_CNT 452
+#define RMUST_T_LABEL 453
+#define RMUST_T_FREE_BLOCKS 454
+#define RMUST_T_TRANSFER_CNT 455
+#define RMUST_T_MOUNT_CNT 456
+#define RMUST_T_DEVICE_TYPE 457
+#define RMUST_T_DEVICE_CHAR 458
+#define RMUST_T_TABLE_NAME 459
+#define RMUST_T_LOGICAL_AREA_ID 460
+#define RMUST_T_TABLE_ID 461
+#define RMUST_T_INDEX_ID 462
+#define RMUST_T_LAPMS 463
+#define RMUST_T_LOGICAL_AREA_COUNT 464
+#define RMUST_T_ALL_LOGICAL_AREA_IDS 465
+#define RMUST_T_ALL_LAPMS 466
+#define RMUST_T_AIJ_MAX_IO_BLKS 468
+#define RMUST_T_AIJ_MIN_IO_BLKS 469
+#define RMUST_T_AIJ_STALL 470
+#define RMUST_T_COMMIT_STALL 471
+#define RMUST_T_DAPF_DEPTH_BUF_CNT 475
+#define RMUST_T_DAPF_START_BUF_CNT 476
+#define RMUST_T_LIVE_BW_MAX 477
+#define RMUST_T_MAX_DBR_CNT 478
+#define RMUST_T_ABS_PRIORITY 479
+#define RMUST_T_ALS_PRIORITY 480
+#define RMUST_T_DBR_PRIORITY 481
+#define RMUST_T_LCS_PRIORITY 482
+#define RMUST_T_LRS_PRIORITY 483
+#define RMUST_T_RCS_PRIORITY 484
+#define RMUST_T_CKPT_TRANS_INTERVAL 487
+#define RMUST_T_CTJ_TSN_INTERVAL 488
+#define RMUST_T_APF_ENABLED 489
+#define RMUST_T_ABW_ENABLED 490
+#define RMUST_T_DAPF_ENABLED 491
+#define RMUST_T_ABS_QUIET_POINT 492
+#define RMUST_T_RCACHE_RCRL_COUNT 493
+#define RMUST_T_RCS_BATCH_COUNT 494
+#define RMUST_T_RCS_CHECKPOINT 495
+#define RMUST_T_HOT_NETWORK_TIMEOUT 496
+#define RMUST_T_RCS_SWP_INT 497
+#define RMUST_T_RCS_COLD_LOW 498
+#define RMUST_T_RCS_COLD_HIGH 499
+#define RMUST_T_RCS_COLD_RECORDS 500
+#define RMUST_T_DBR_BUFFER_CNT 501
+#define RMUST_T_SNAP_QUIET_POINT 502
+#define RMUST_T_LOCK_TIMEOUT_INTERVAL 503
+#define RMUST_T_HRL_ENABLED 504
+#define RMUST_T_CBL_ENABLED 505
+#define RMUST_T_RUJ_EXTEND_BLKCNT 506
+#define RMUST_T_RCACHE_INSERT_ENABLED 507
+#define RMUST_T_RCS_ABORT_SWEEP 508
+#define RMUST_T_AIJ_ARB_COUNT 509
+#define RMUST_T_RCACHE_LATCH_SPIN_COUNT 510
+#define RMUST_T_RCWS_UNMARK_THRESHO 511
+#define RMUST_T_RUJ_ALLOC_BLKCNT 512
+#define RMUST_T_HOT_DATA_SYNC_MODE 513
+#define RMUST_T_HOT_CHECKPOINT 514
+#define RMUST_T_LCS_CONNECT_TIMEOUT 515
+#define RMUST_T_LRS_GAP_TIMEOUT 516
+#define RMUST_T_LRS_GOVERNOR_ENABLED 517
+#define RMUST_T_AIJ_SWITCH_GBL_CKPT 518
+#define RMUST_T_AIJ_CHK_CONTROL_RECS 519
+#define RMUST_T_READY_AREA_SERIALLY 520
+#define RMUST_T_ABS_OVRWRT_ALLOWED 521
+#define RMUST_T_ABS_OVRWRT_IMMEDIATE 522
+#define RMUST_T_ALS_CREATE_AIJ 523
+#define RMUST_T_VNO 524
+#define RMUST_T_AIJ_MAX_IO_BYTES 525
+#define RMUST_T_AIJ_MIN_IO_BYTES 526
+#define RMUST_T_HOT_ABS_SUSPEND 527
+#define RMUST_T_BUF_CNT 529
+#define RMUST_T_RCS_CKPT_BUFFER_CNT 530
+#define RMUST_T_UDASH_INDEX 531
+#define RMUST_T_RCACHE_INDEX 532
+#define RMUST_T_RUJ_INDEX 533
+#define RMUST_T_TSN_INDEX 534
+#define RMUST_T_SEQ_INDEX 535
+#define RMUST_T_CPT_INDEX 536
+#define RMUST_T_CRL_ENABLED 546
+#define RMUST_T_RCWS_UNMARK_THRESHOLD 551
+#define RMUST_T_VOLUME_NAME 555
+#define RMUST_T_MAX_BLOCKS 556
+#define RMUST_T_ACE_FLAGS 557
+#define RMUST_T_ACE_ACCESS 558
+#define RMUST_T_ALTER_PRV_FLG 559
+#define RMUST_T_ANALYSE_PRV_FLG 560
+#define RMUST_T_BACKUP_PRV_FLG 561
+#define RMUST_T_CONVERT_PRV_FLG 562
+#define RMUST_T_COPY_PRV_FLG 563
+#define RMUST_T_DUMP_PRV_FLG 564
+#define RMUST_T_LOAD_PRV_FLG 565
+#define RMUST_T_MOVE_PRV_FLG 566
+#define RMUST_T_OPEN_PRV_FLG 567
+#define RMUST_T_RESTORE_PRV_FLG 568
+#define RMUST_T_SECURITY_PRV_FLG 569
+#define RMUST_T_SHOW_PRV_FLG 570
+#define RMUST_T_UNLOAD_PRV_FLG 571
+#define RMUST_T_VERIFY_PRV_FLG 572
+#define RMUST_T_IDENTIFIER 573
+#define RMUST_T_ACE_TEXT 574
+#define RMUST_T_MONITOR_UP_FLG 575
+#define RMUST_K_TAG_LAST_TAG 575
+#define KUSGTBEND 1000
+#define KUSGTBOG 1001
+#define KUSGTEOG 1002
+#define KUSGTBTRN 1003
+#define KUSGTBCNT 1004
+#define KUSGTBDTG 1005
+#define KUSGTBKEY 1006
+#define KUSGTWCLS 1007
+#define KUSGTUNST 1008
+#define KUSGTMD 1009
+#define KUSGTNP 1010
+#define RMUST_MRT_STAREA_MAPS 2000
+#define RMUST_MRT_RELINFO 2001
+#define RMUST_MRT_IDXINFO 2002
+#define RMUST_CT_AIJINFO 2100
+#define RMUST_CT_AIJJNLS 2101
+#define RMUST_CT_ARPMS_STATS 2102
+#define RMUST_CT_DBINFO 2103
+#define RMUST_CT_DBR 2104
+#define RMUST_CT_FILE 2105
+#define RMUST_CT_PROCESS 2106
+#define RMUST_CT_STALL 2107
+#define RMUST_CT_STALL_ACT 2108
+#define RMUST_CT_RTPMS_STATS 2109
+#define RMUST_CT_FILE_NODUP 2110
+#define RMUST_CT_REC_CACHE 2111
+#define RMUST_CT_RUJINFO 2112
+#define RMUST_CT_TSNINFO 2113
+#define RMUST_CT_SEQINFO 2114
+#define RMUST_CT_CPTINFO 2115
+#define RMUST_CT_AIPINFO 2116
+#define RMUST_CT_ACTIVE 2117
+#define RMUST_CT_CLUSTER 2118
+#define RMUST_CT_RMUACL 2119
+#define RMUST_CT_USERS 2120
+#define RMUST_CT_DATABASES 2121
+#define RMUST_CT_TAPE_DEVICES 2122
+#define RMUST_CT_DISK_DEVICES 2123
+#define RMUST_CT_DASH 2124
+#define RMUST_CT_USER_DASH 2125
+#define RMUST_CT_DB_MONITOR 2126
+#define RMUST_CT_LAPMS_TABLE 2127
+#define RMUST_CT_LAPMS_INDEX 2128
+#define RMUST_CT_LAPMS_TABLE_STATS 2129
+#define RMUST_CT_LAPMS_INDEX_STATS 2130
+#define RMUST_CT_LAPMS_STATS 2131
+#define KUSC2_FILE_ENTRY 2501
+#define KUSC3_FILE_STATS 2502
+#define KUSC4_LIBRARY_CACHE 2503
+#define KUSC5_PARAMETERS 2504
+#define KUSC6_FILE_HEADER 2505
+#define KUSC7_PROCESS 2506
+#define KUSC8_SQL_AREA 2507
+#define KUSC9_SESSIONS 2508
+#define KUSC10_SGA 2509
+#define KUSC11_SQL_TEXT 2510
+#define KUSC12_SESSTAT 2511
+#define KUSC13_SESSIONS_STAT 2512
+#define KUSC14_SYSSTAT 2513
+#define KUSC15_EVENT_DESCRIPTIONS 2514
+#define KUSC16_SESSION_WAIT 2515
+#define KUSC17_OPEN_CURSOR 2516
+#define KUSC18_LATCH_WHERE 2517
+#define KUSC19_LATCH_MISSES 2518
+#define KUSC20_LATCH_HOLDER 2519
+#define KUSC21_LATCH 2520
+#define KUSC23_RESOURCE 2522
+#define KUSC24_LOCKS_1 2523
+#define KUSC25_LOCKS_2 2524
+#define KUSC26_LOCKS_3 2525
+#define KUSC27_LOCKS_4 2526
+#define KUSC28_LOCKS_5 2527
+#define KUSC29_LOCK1_STAT 2528
+#define KUSC30_LOCK2_STAT 2529
+#define KUSC31_LOCK3_STAT 2530
+#define KUSC32_LOCK4_STAT 2531
+#define KUS1_FILE_NUMBER 3000
+#define KUS2_FILE_NAME 3001
+#define KUS4_FILE_STATUS 3003
+#define KUS5_FILE_BLOCK_SIZE 3004
+#define KUS6_FILE_CREATE_BLOCKS 3005
+#define KUS7_SERVER_TYPE 3006
+#define KUS8_CHECKPOINT_CHANGE_NUMBER 3007
+#define KUS9_PHYRDS 3008
+#define KUS10_PHYWRTS 3009
+#define KUS11_READTIM 3010
+#define KUS12_WRITETIM 3011
+#define KUS13_PHYBLKRD 3012
+#define KUS14_PHYBLKWRT 3013
+#define KUS15_LIBRARYCACHE_NDX 3014
+#define KUS16_GETS 3015
+#define KUS17_GETHITS 3016
+#define KUS18_PINS 3017
+#define KUS19_PINHITS 3018
+#define KUS20_RELOADS 3019
+#define KUS21_INVALIDATIONS 3020
+#define KUS22_DLM_LOCK_REQUESTS 3021
+#define KUS23_DLM_PIN_REQUESTS 3022
+#define KUS24_DLM_PIN_RELEASES 3023
+#define KUS25_DLM_INVALIDATION_REQUESTS 3024
+#define KUS26_DLM_INVALIDATIONS 3025
+#define KUS27_PARAM_NUM 3026
+#define KUS28_PARAM_NAME 3027
+#define KUS29_PARAM_TYPE 3028
+#define KUS30_PARAM_VALUE 3029
+#define KUS31_PARAM_IS_DEFAULT 3030
+#define KUS32_PARAM_IS_SESS_MODIFIABLE 3031
+#define KUS33_PARAM_IS_SYS_MODIFIABLE 3032
+#define KUS34_PROC_ADDR 3033
+#define KUS35_PID 3034
+#define KUS36_SPID 3035
+#define KUS37_USERNAME 3036
+#define KUS38_SERIAL_NUMBER 3037
+#define KUS39_TERMINAL 3038
+#define KUS40_PROGRAM 3039
+#define KUS41_PROCESS_BACKGROUND 3040
+#define KUS42_LATCHWAIT 3041
+#define KUS43_LATCHSPIN 3042
+#define KUS44_PROCESS_ACTIVE 3043
+#define KUS45_SQL_TEXT 3044
+#define KUS46_SHARABLE_MEM 3045
+#define KUS47_PERSISTENT_MEM 3046
+#define KUS48_RUNTIME_MEM 3047
+#define KUS49_CURS_SORTS 3048
+#define KUS50_VERSION_COUNT 3049
+#define KUS51_LOADED_VERSIONS 3050
+#define KUS52_OPEN_VERSIONS 3051
+#define KUS53_USERS_OPENING 3052
+#define KUS54_EXECUTIONS 3053
+#define KUS55_USERS_EXECUTING 3054
+#define KUS56_LOADS 3055
+#define KUS57_FIRST_LOAD_TIME 3056
+#define KUS58_INVALIDATIONS 3057
+#define KUS59_PARSE_CALLS 3058
+#define KUS60_DISK_READS 3059
+#define KUS61_BUFFER_GETS 3060
+#define KUS62_COMMAND_TYPE 3061
+#define KUS63_ROWS_PROCESSED 3062
+#define KUS64_OPTIMIZER_MODE 3063
+#define KUS65_PARSING_USER_ID 3064
+#define KUS66_PARSING_SCHEMA_ID 3065
+#define KUS67_KEPT_VERSIONS 3066
+#define KUS68_PARENT_ADDRESS 3067
+#define KUS69_OBJECT_HASH 3068
+#define KUS70_MODULE 3069
+#define KUS71_MODULE_HASH 3070
+#define KUS72_ACTION 3071
+#define KUS73_ACTION_HASH 3072
+#define KUS74_SESSION_ADDR 3073
+#define KUS75_SID 3074
+#define KUS76_SERIAL_NUM 3075
+#define KUS77_AUDSID 3076
+#define KUS78_PADDR 3077
+#define KUS79_USER_NUM 3078
+#define KUS80_USERNAME 3079
+#define KUS81_COMMAND 3080
+#define KUS82_TADDR 3081
+#define KUS83_LOCKWAIT 3082
+#define KUS84_STATUS 3083
+#define KUS85_SERIALIZABLE_ABORTS 3084
+#define KUS86_SCHEMA_NUM 3085
+#define KUS87_SCHEMA_NAME 3086
+#define KUS88_OSUSER 3087
+#define KUS89_PROCESS 3088
+#define KUS90_MACHINE 3089
+#define KUS91_TERMINAL 3090
+#define KUS92_PROGRAM 3091
+#define KUS93_SESSION_TYPE 3092
+#define KUS94_SQL_ADDRESS 3093
+#define KUS95_SQL_HASH_VALUE 3094
+#define KUS96_PREV_SQL_ADDR 3095
+#define KUS97_PREV_HASH_VALUE 3096
+#define KUS98_MODULE 3097
+#define KUS99_MODULE_HASH 3098
+#define KUS100_ACTION 3099
+#define KUS101_ACTION_HASH 3100
+#define KUS102_CLIENT_INFO 3101
+#define KUS103_FIXED_TABLE_SEQUENCE 3102
+#define KUS104_ROW_WAIT_OBJECT 3103
+#define KUS105_ROW_WAIT_FILE 3104
+#define KUS106_ROW_WAIT_BLOCK 3105
+#define KUS107_ROW_WAIT_ROW 3106
+#define KUS108_LOGON_TIME 3107
+#define KUS109_LAST_CALL_ELAPSE_TIME 3108
+#define KUS110_OBJECT_STATE 3109
+#define KUS111_SESSION_FLAGS 3110
+#define KUS112_SGA_NAME 3111
+#define KUS113_SGA_SIZE 3112
+#define KUS114_SQL_TEXT_ADDR 3113
+#define KUS115_HASH_VALUE 3114
+#define KUS116_SQL_TEXT_PIECE 3115
+#define KUS117_SQL_TEXT 3116
+#define KUS118_SESSION_STATS_ARRAY 3117
+#define KUS119_SYS_STATISTIC_NUM 3118
+#define KUS121_SYS_STATISTIC_NAME 3120
+#define KUS122_SYS_STATISTIC_CLASS 3121
+#define KUS123_SYS_STATISTIC_VALUE 3122
+#define KUS124_EVENT_NUMBER 3123
+#define KUS125_EVENT_NAME 3124
+#define KUS126_PARAM_1_TEXT 3125
+#define KUS127_PARAM_2_TEXT 3126
+#define KUS128_PARAM_3_TEXT 3127
+#define KUS129_SESSION_SEQ_NUM 3128
+#define KUS130_P1 3129
+#define KUS131_P1_RAW 3130
+#define KUS132_P2 3131
+#define KUS133_P2_RAW 3132
+#define KUS134_P3 3133
+#define KUS135_P3_RAW 3134
+#define KUS136_WAIT_TIME 3135
+#define KUS137_SECONDS_IN_WAIT 3136
+#define KUS138_OBJECT_STATE_FLAGS 3137
+#define KUS139_LATCH_ADDRESS 3138
+#define KUS140_USER_NAME 3139
+#define KUS141_CURSOR_ADDRESS 3140
+#define KUS142_CURSOR_HASH_VALUE 3141
+#define KUS143_CURSOR_SQL_TEXT 3142
+#define KUS144_CURSOR_OBJ_NAME_SPACE 3143
+#define KUS145_CURSOR_OBJ_HANDLE 3144
+#define KUS146_LATCH_NUMBER 3145
+#define KUS147_LATCH_WHERE 3146
+#define KUS148_LATCH_PARENT_NAME 3147
+#define KUS149_LATCH_NO_WAIT_FAIL_COUNT 3148
+#define KUS150_LATCH_NAME 3149
+#define KUS151_LATCH_LEVEL_NUMBER 3150
+#define KUS152_LATCH_GETS 3151
+#define KUS153_LATCH_MISSES 3152
+#define KUS154_SLEEPS 3153
+#define KUS155_IMMEDIATE_GETS 3154
+#define KUS156_IMMEDIATE_MISSES 3155
+#define KUS157_WAITERS_WOKEN 3156
+#define KUS158_WAITS_HOLDING_LATCH 3157
+#define KUS159_SPIN_GETS 3158
+#define KUS160_SLEEP1 3159
+#define KUS161_SLEEP2 3160
+#define KUS162_SLEEP3 3161
+#define KUS163_SLEEP4 3162
+#define KUS164_SLEEP5 3163
+#define KUS165_SLEEP6 3164
+#define KUS166_SLEEP7 3165
+#define KUS167_SLEEP8 3166
+#define KUS168_SLEEP9 3167
+#define KUS169_SLEEP10 3168
+#define KUS170_SLEEP11 3169
+#define KUS171_SLEEP12 3170
+#define KUS172_SLEEP13 3171
+#define KUS173_RESOURCE_ADDR 3172
+#define KUS174_RESOURCE_TYPE 3173
+#define KUS175_RESOURCE_ID_1 3174
+#define KUS176_RESOURCE_ID_2 3175
+#define KUS177_RESOURCE_FLAG 3176
+#define KUS178_LOCK_STATE_ADDRESS 3177
+#define KUS179_LOCK_ADDRESS 3178
+#define KUS180_LOCK_MODE_HELD 3179
+#define KUS181_LOCK_MODE_REQUESTED 3180
+#define KUS182_LOCK_HELD_TIME 3181
+#define KUS183_BLOCKING 3182
+#define KUS184_LATCH_SLEEP_COUNT 3183
+#define KUS185_CURRENT_FILE_BLOCKS 3184
+#define KUS203_FILE_ENABLED 3202
+#define KUS204_CACHE_NAMESPACE 3203
+#define KUS205_PARAM_IS_MODIFIED 3204
+#define KUS206_PARAM_IS_ADJUSTED 3205
+#define KUS207_PARAM_DESCRIPTION 3206
+#define KUSST1 5000
+#define KUSST2 5001
+#define KUSST3 5002
+#define KUSST4 5003
+#define KUSST5 5004
+#define KUSST6 5005
+#define KUSST7 5006
+#define KUSST8 5007
+#define KUSST9 5008
+#define KUSST10 5009
+#define KUSST11 5010
+#define KUSST12 5011
+#define KUSST13 5012
+#define KUSST14 5013
+#define KUSST15 5014
+#define KUSST16 5015
+#define KUSST17 5016
+#define KUSST18 5017
+#define KUSST19 5018
+#define KUSST20 5019
+#define KUSST21 5020
+#define KUSST22 5021
+#define KUSST23 5022
+#define KUSST24 5023
+#define KUSST25 5024
+#define KUSST26 5025
+#define KUSST27 5026
+#define KUSST28 5027
+#define KUSST29 5028
+#define KUSST30 5029
+#define KUSST31 5030
+#define KUSST32 5031
+#define KUSST33 5032
+#define KUSST34 5033
+#define KUSST35 5034
+#define KUSST36 5035
+#define KUSST37 5036
+#define KUSST38 5037
+#define KUSST39 5038
+#define KUSST40 5039
+#define KUSST41 5040
+#define KUSST42 5041
+#define KUSST43 5042
+#define KUSST44 5043
+#define KUSST45 5044
+#define KUSST46 5045
+#define KUSST47 5046
+#define KUSST48 5047
+#define KUSST49 5048
+#define KUSST50 5049
+#define KUSST51 5050
+#define KUSST52 5051
+#define KUSST53 5052
+#define KUSST54 5053
+#define KUSST55 5054
+#define KUSST56 5055
+#define KUSST57 5056
+#define KUSST58 5057
+#define KUSST59 5058
+#define KUSST60 5059
+#define KUSST61 5060
+#define KUSST62 5061
+#define KUSST63 5062
+#define KUSST64 5063
+#define KUSST65 5064
+#define KUSST66 5065
+#define KUSST67 5066
+#define KUSST68 5067
+#define KUSST69 5068
+#define KUSST70 5069
+#define KUSST71 5070
+#define KUSST72 5071
+#define KUSST73 5072
+#define KUSST74 5073
+#define KUSST75 5074
+#define KUSST76 5075
+#define KUSST77 5076
+#define KUSST78 5077
+#define KUSST79 5078
+#define KUSST80 5079
+#define KUSST81 5080
+#define KUSST82 5081
+#define KUSST83 5082
+#define KUSST84 5083
+#define KUSST85 5084
+#define KUSST86 5085
+#define KUSST87 5086
+#define KUSST88 5087
+#define KUSST89 5088
+#define KUSST90 5089
+#define KUSST91 5090
+#define KUSST92 5091
+#define KUSST93 5092
+#define KUSST94 5093
+#define KUSST95 5094
+#define KUSST96 5095
+#define KUSST97 5096
+#define KUSST98 5097
+#define KUSST99 5098
+#define KUSST100 5099
+#define KUSST101 5100
+#define KUSST102 5101
+#define KUSST103 5102
+#define KUSST104 5103
+#define KUSST105 5104
+#define KUSST106 5105
+#define KUSST107 5106
+#define KUSST108 5107
+#define KUSST109 5108
+#define KUSST110 5109
+#define KUSST111 5110
+#define KUSST112 5111
+#define KUSST113 5112
+#define KUSST114 5113
+#define KUSST115 5114
+#define KUSST116 5115
+#define KUSST117 5116
+#define KUSST118 5117
+#define KUSST119 5118
+#define KUSST120 5119
+#define KUSST121 5120
+#define KUSST122 5121
+#define KUSST123 5122
+#define KUSST124 5123
+#define KUSST125 5124
+#define KUSST126 5125
+#define KUSST127 5126
+#define KUSST128 5127
+#define KUSST129 5128
+#define KUSST130 5129
+#define KUSST131 5130
+#define KUSST132 5131
+#define KUSST133 5132
+#define KUSST134 5133
+#define KUSST135 5134
+#define KUSST136 5135
+#define KUSST137 5136
+#define KUSST138 5137
+#define KUSST139 5138
+#define KUSST140 5139
+#define KUSST141 5140
+#define KUSST142 5141
+#define KUSST143 5142
+#define KUSST144 5143
+#define KUSST145 5144
+#define KUSST146 5145
+#define KUSST147 5146
+#define KUSST148 5147
+#define KUSST149 5148
+#define KUSST150 5149
+#define KUSST151 5150
+#define KUSST152 5151
+#define KUSST153 5152
+#define KUSST154 5153
+#define KUSST155 5154
+#define KUSST156 5155
+#define KUSST157 5156
+#define KUSST158 5157
+#define KUSST159 5158
+#define KUSST160 5159
+#define KUSST161 5160
+#define KUSST162 5161
+#define KUSST163 5162
+#define KUSST164 5163
+#define KUSST165 5164
+#define KUSST166 5165
+#define KUSST167 5166
+#define KUSST168 5167
+#define KUSST169 5168
+#define KUSST170 5169
+#define KUSST171 5170
+#define KUSST172 5171
+#define KUSST173 5172
+#define KUSST174 5173
+#define KUSST175 5174
+#define KUSST176 5175
+#define KUSST177 5176
+#define KUSST178 5177
+#define KUSST179 5178
+#define KUSST180 5179
+#define KUSST181 5180
+#define KUSST182 5181
+#define KUSST183 5182
+#define KUSST184 5183
+#define KUSST185 5184
+#define KUSST186 5185
+#define KUSST187 5186
+#define KUSST188 5187
+#define KUSST189 5188
+#define KUSST190 5189
+#define KUSST191 5190
+#define KUSST192 5191
+#define KUSST193 5192
+#define KUSST194 5193
+#define KUSST195 5194
+#define KUSST196 5195
+#define KUSST197 5196
+#define KUSST198 5197
+#define KUSST199 5198
+
+/* 0-based count of tags */
+
+#define KUSTAGCOUNT 975
+
+/* Oracle Rdb tags (0-999)*/
+
+#define KUSRTAGSTART 0
+#define KUSRTAGEND 999
+
+/* global tags (1000 - 1999) */
+
+#define KUSGTTAGSTART 1000
+#define KUSGTTAGEND 1999
+
+/* Oracle Rdb class tags */
+
+#define KUSRCTAGSTART 2000
+#define KUSRCTAGEND 2499
+
+/* Oracle class tags */
+
+#define KUSOCTAGSTART 2500
+#define KUSOCTAGEND 2999
+
+/* oracle tags (3000 - 9999) */
+
+#define KUSOTAGSTART 3000
+#define KUSOTAGMAX 9999
+
+/* ENABLE check_macro_naming */
+
+#endif
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/nzerror.h b/src/terralib/drivers/OracleSpatial/OCI/include/nzerror.h
new file mode 100644
index 0000000..bd2a63a
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/nzerror.h
@@ -0,0 +1,647 @@
+/* DISABLE check_long_lines */
+
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/nzerror.h,v 1.3 2005/05/06 16:48:55 karine Exp $
+ *
+ * Copyright (c) 1995, 2003, Oracle Corporation. All rights reserved.
+ */
+
+/* ENABLE check_long_lines */
+/*
+ NAME
+ nzerror.h - error numbers for the Oracle Security Server
+ DESCRIPTION
+ None.
+ PUBLIC FUNCTION(S)
+ None.
+ PRIVATE FUNCTION(S)
+ None.
+ NOTES
+ A pragma is used to silence olint about the enum value names not being
+ unique within 7 characters. This limit is being changed to 30.
+ MODIFIED
+ rchahal 10/15/03 - bug 2513821
+ rchahal 08/14/03 - new error range (43000 - 43499)
+ skalyana 08/25/03 - Error changes
+ rchahal 06/27/03 - RSA errors
+ rchahal 05/27/03 - convert wallet
+ skalyana 03/07/03 - Move FIPS errors
+ rchahal 02/28/03 - bug 2648177
+ rchahal 01/20/03 - use sltsky
+ rchahal 11/11/02 - pkcs11 support
+ skalyana 11/29/02 - Add mutex errors
+ akoyfman 11/01/02 - adding crl cache
+ rchahal 10/23/02 - crldp error
+ rchahal 10/15/02 - fetch crl from ldap
+ rchahal 10/07/02 - crl support
+ akoyfman 10/16/02 - Update with SSL PLus 4.2 errors
+ skalyana 10/04/02 - Certicom SSL Plus 4.2 Upgrade changes
+ akoyfman 08/06/02 - adding sso wallet errors
+ akoyfman 07/12/02 - adding secret store errors
+ skalyana 07/07/02 - Add more errors for FIPS self tests
+ skalyana 07/01/02 - Add more errors
+ skalyana 06/03/02 - Add NZ error for self test failure.
+ ajacobs 02/22/01 - Add some entrust errors
+ vle 02/09/01 - add error mesg
+ lkethana 08/11/00 - Extension Errors
+ lkethana 07/30/00 - add pkcs12 errors
+ lkethana 06/17/00 - mult cert errors
+ lkethana 06/11/00 - multiple cert support
+ rturlapa 03/29/00 - Add error meesage for Entrust Login failure.
+ rwessman 07/07/99 - Deleted include of sslerrs.h. It caused the RDBMS bu
+ rwessman 07/02/99 - fixed merge errors
+ rwessman 07/01/99 - moved NZOS errors to nzerror to make them visible
+ supriya 12/16/98 - add new error for cert chain.
+ arswamin 12/04/98 - add NZERROR_NO_MATCHING_PRIVATE_KEY
+ qdinh 11/12/98 - add NZERROR_VALIDITY_EXPIRED.
+ arswamin 06/17/98 - add INIT_FAILED
+ sdange 06/10/98 - change wrong password to bad password
+ amthakur 06/09/98 - adding error messages
+ wliau 03/10/97 - Add new error message for snzdfo.c.
+ rwessman 03/14/97 - Consolidated PL/SQL toolkit errors into generic erro
+ rwessman 02/26/97 - Added NZERROR_UNSUPPORTED. Corrected values of
+ errors outside the valid range.
+ asriniva 03/02/97 - Fix olint warning
+ rwessman 02/26/97 - Added NZERROR_UNSUPPORTED
+ rwessman 01/02/97 - Changed PLSQL package errors to be TK_PLSQL to
+ separate them from the errors generated by the
+ Oracle interface.
+ rwessman 12/30/96 - Merged in PL/SQL toolkit errors
+ sdange 11/14/96 - (Added NZERROR_DECRYPT_FAILED to the enum list)
+ rwessman 12/02/96 -
+ rwessman 11/25/96 - Added error messages for PL/SQL functions.
+ asriniva 10/31/96 - Include oratypes.h
+ asriniva 10/29/96 - Fix numbering.
+ asriniva 10/29/96 - Fix error numbers
+ asriniva 10/29/96 - Correct type-o
+ asriniva 10/28/96 - Add more TK errors
+ asriniva 10/28/96 - Convert OKAPI errors to TK errors.
+ rwessman 10/17/96 - still more OSS TK errors
+ asriniva 10/16/96 - OKAPI errors
+ asriniva 10/15/96 - OSSTK errors
+ rwessman 10/15/96 - Added more OSS TK errors
+ asriniva 10/09/96 - Add OSSTK errors.
+ rwessman 09/05/96 - Added errors for PL/SQL functions.
+ wliau 09/05/96 - correct error numbers.
+ $Log: nzerror.h,v $
+ Revision 1.3 2005/05/06 16:48:55 karine
+ nova versao OCI 10.1.0.2
+
+ * Revision 1.26 1996/07/15 23:07:23 wliau
+ * Added NZERROR_AUTH_SHARED_MEMORY
+ *
+ * Revision 1.25 1996/07/01 20:40:15 asriniva
+ * Finished RSA verify/sign.
+ *
+ * Revision 1.24 1996/06/27 20:39:41 rwessman
+ * Added more errors.
+ *
+ * Revision 1.23 1996/05/31 17:33:40 rwessman
+ * Updated nzerror.h to contain bug # for olint enum bug.
+ *
+ * Revision 1.22 1996/05/31 17:12:30 rwessman
+ * Assigned values to the various errors.
+ *
+ * Revision 1.21 1996/05/13 20:46:58 ggilchri
+ * Added more attribute related error conditions
+ *
+*/
+
+#ifndef NZERROR_ORACLE
+# define NZERROR_ORACLE
+
+#ifndef ORATYPES
+# include <oratypes.h>
+#endif /* ORATYPES */
+
+/*
+** Errors - when an error is added here, a message corresponding to the
+** error number must be added to the message file.
+** New errors must be assigned numbers, otherwise the compiler can assign any
+** value that it wants, which may lead to invalid error numbers being
+** generated.
+** The number range currently assigned to the OSS is 28750 - 29249
+** New number range 43000 - 43499
+*/
+
+typedef enum nzerror
+{
+ NZERROR_OK = 0,
+ NZERROR_GENERIC = 28750, /* A catchall for errors */
+ NZERROR_NO_MEMORY = 28751, /* No more memory */
+ NZERROR_DATA_SOURCE_INIT_FAILED = 28752, /* Failed to init data source */
+ NZERROR_DATA_SOURCE_TERM_FAILED = 28753,/* Failed to terminate data source */
+ NZERROR_OBJECT_STORE_FAILED = 28754, /* Store object in data source failed */
+ NZERROR_OBJECT_GET_FAILED = 28755,
+ /* Failed to obtain object from data source */
+ NZERROR_MEMORY_ALLOC_FAILED = 28756,
+ /* Callback failed to allocate memory */
+ NZERROR_MEMORY_ALLOC_0_BYTES = 28757,
+ /* Attempted to ask for 0 bytes of memory */
+ NZERROR_MEMORY_FREE_FAILED = 28758,
+ /* Callback failed to free memory */
+ NZERROR_FILE_OPEN_FAILED = 28759,
+ /* Open of file failed */
+ NZERROR_LIST_CREATION_FAILED = 28760,
+ /* Creation of list failed */
+ NZERROR_NO_ELEMENT = 28761,
+ /* No list element found */
+ NZERROR_ELEMENT_ADD_FAILED = 28762,
+ /* Addition of list element failed */
+ NZERROR_PARAMETER_BAD_TYPE = 28763,
+ /* Retrieval of an unknown parameter type */
+ NZERROR_PARAMETER_RETRIEVAL = 28764, /* Retrieval of parameter failed */
+
+ NZERROR_NO_LIST = 28765, /* Data method list does not exist */
+ NZERROR_TERMINATE_FAIL = 28766, /* Failed to terminate */
+ NZERROR_BAD_VERSION_NUMBER = 28767, /* Bad version number */
+ NZERROR_BAD_MAGIC_NUMBER = 28768, /* Bad magic number */
+ NZERROR_METHOD_NOT_FOUND = 28769,
+ /* Data retrieval method specified does not exist */
+ NZERROR_ALREADY_INITIALIZED = 28770,
+ /*The data source is already initialized */
+ NZERROR_NOT_INITIALIZED = 28771, /* The data source is not initialized */
+ NZERROR_BAD_FILE_ID = 28772, /* File ID is bad */
+ NZERROR_WRITE_MAGIC_VERSION = 28773, /* Failed to write magic and version */
+ NZERROR_FILE_WRITE_FAILED = 28774, /* Failed to write to file */
+ NZERROR_FILE_CLOSE_FAILED = 28775, /* Failed to close file */
+ NZERROR_OUTPUT_BUFFER_TOO_SMALL = 28776,
+ /* The buffer supplied by the caller is too small */
+ NZERROR_BINDING_CREATION_FAILED = 28777,/* NL failed in creating a binding */
+ NZERROR_PARAMETER_MALFORMED = 28778, /* A parameter was in a bad format */
+ NZERROR_PARAMETER_NO_METHOD = 28779,
+ /* No method was specified for a data type */
+ NZERROR_BAD_PARAMETER_METHOD = 28780, /* Illegal method for data type */
+ NZERROR_PARAMETER_NO_DATA = 28781, /* No method specified when required */
+ NZERROR_NOT_ALLOCATED = 28782, /* Data source is not allocated */
+ NZERROR_INVALID_PARAMETER = 28783, /* Invalid parameter name */
+ NZERROR_FILE_NAME_TRANSLATION = 28784,/* Could not translate OSD file name */
+ NZERROR_NO_SUCH_PARAMETER = 28785, /* Selected parameter is non-existent */
+
+ NZERROR_DECRYPT_FAILED = 28786,
+ /* Encrypted private key decryption failure */
+ NZERROR_ENCRYPT_FAILED = 28787, /* Private key encryption failed */
+
+ NZERROR_INVALID_INPUT = 28788, /* Incorrect input or unknown error */
+
+ NZERROR_NAME_TYPE_NOT_FOUND = 28789,
+ /* Type of name requested is not available */
+ NZERROR_NLS_STRING_OPEN_FAILED = 28790,
+ /* Failure to generate an NLS string */
+ NZERROR_CERTIFICATE_VERIFY = 28791, /* Failed to verify a certificate */
+ NZERROR_OCI_PLSQL_FAILED = 28792,
+ /* an OCI call to process some plsql failed */
+ NZERROR_OCI_BIND_FAILED = 28793,
+ /* an OCI call to bind an internal var. failed */
+ NZERROR_ATTRIBUTE_INIT = 28794, /* failed to init role retrieval */
+ NZERROR_ATTRIBUTE_FINISH_FAILED = 28795,/* Did not complete role retrieval */
+ NZERROR_UNSUPPORTED_METHOD = 28796, /* Data method specified not supported */
+ NZERROR_INVALID_KEY_DATA_TYPE = 28797,
+ /* Invalid data type specified for key */
+ NZEROR_BIND_SUBKEY_COUNT = 28798,
+ /* Number of sub-keys to bind does not match count in initialized key */
+ NZERROR_AUTH_SHARED_MEMORY = 28799,
+ /* Failed to retreieve authentication information from the shared memory */
+ NZERROR_RIO_OPEN = 28800, /* RIO Open Failed */
+ NZERROR_RIO_OBJECT_TYPE = 28801, /* RIO object type invalid */
+ NZERROR_RIO_MODE = 28802, /* RIO mode invalid */
+ NZERROR_RIO_IO = 28803, /* RIO io set or numberinvalid */
+ NZERROR_RIO_CLOSE = 28804, /* RIO close failed */
+ NZERROR_RIO_RETRIEVE = 28805, /* RIO retrieve failed */
+ NZERROR_RIO_STORE = 28806, /* RIO store failed */
+ NZERROR_RIO_UPDATE = 28807, /* RIO update failed */
+ NZERROR_RIO_INFO = 28808, /* RIO info failed */
+ NZERROR_RIO_DELETE = 28809, /* RIO delete failed */
+ NZERROR_KD_CREATE = 28810, /* Key descriptor create failed */
+ NZERROR_RIO_ACCESS_DESCRIPTOR = 28811, /* access descriptor invalid */
+ NZERROR_RIO_RECORD = 28812, /* record invalid */
+ NZERROR_RIO_RECORD_TYPE = 28813, /* record type and AD type not matched */
+ NZERROR_PLSQL_ORACLE_TO_REAL = 28814,
+ /* A number passed to PL/SQL could not be converted to real format */
+ NZERROR_PLSQL_REAL_TO_ORACLE = 28815,
+ /* A number in machine format could not be converted to Oracle format */
+ NZERROR_TK_PLSQL_NO_PASSWORD = 28816,
+ /* A password was not provided to a PL/SQL function */
+ NZERROR_TK_PLSQL_GENERIC = 28817,
+ /* A PL/SQL function returned an error */
+ NZERROR_TK_PLSQL_NO_CONTEXT = 28818,
+ /* The package context was not specified to a PL/SQL function */
+ NZERROR_TK_PLSQL_NO_DIST_NAME = 28819,
+ /* The user's distinguished name was not provided to a PL/SQL function */
+ NZERROR_TK_PLSQL_NO_STATE = 28820,
+/* The state of either a signature or decryption/encryption was not provided */
+ NZERROR_TK_PLSQL_NO_INPUT = 28821,
+ /* An input buffer was specified to a PL/SQL function */
+ NZERROR_TK_PLSQL_NO_SEED = 28822,
+ /* No seed was specified to the PL/SQL seed initialization function */
+ NZERROR_TK_PLSQL_NO_BYTES = 28823,
+ /* Number of bytes was not specified to the PL/SQL random number generator */
+ NZERROR_TK_INVALID_STATE = 28824,
+ /* Invalid encryption/decryption/signature state passed */
+ NZERROR_TK_PLSQL_NO_ENG_FUNC = 28825,
+ /* No crypto engine function was passed in */
+ NZERROR_TK_INV_ENG_FUNC = 28826,
+ /* An invalid crypto engine function was passed in */
+ NZERROR_TK_INV_CIPHR_TYPE = 28827,
+ /* An invalid cipher type was passed in */
+ NZERROR_TK_INV_IDENT_TYPE = 28828,
+ /* An invalid identity type was specified */
+ NZERROR_TK_PLSQL_NO_CIPHER_TYPE = 28829,
+ /* No cipher type was specified */
+ NZERROR_TK_PLSQL_NO_IDENT_TYPE = 28830,
+ /* No identity type was specified */
+ NZERROR_TK_PLSQL_NO_DATA_FMT = 28831,
+ /* No data unit format was specified */
+ NZERROR_TK_INV_DATA_FMT = 28832,
+ /* Invalid data unit format was provided to function */
+ NZERROR_TK_PLSQL_INSUFF_INFO = 28833,
+ /* Not enough info (usually parameters) provided to a PL/SQL function */
+ NZERROR_TK_PLSQL_BUF_TOO_SMALL = 28834,
+ /* Buffer provided by PL/SQL is too small for data to be returned */
+ NZERROR_TK_PLSQL_INV_IDENT_DESC = 28835,
+ /* Identity descriptor not present or too small */
+ NZERROR_TK_PLSQL_WALLET_NOTOPEN = 28836,
+ /* Wallet has not been opened yet */
+ NZERROR_TK_PLSQL_NO_WALLET = 28837,
+ /* No wallet descriptor specified to PL/SQL function */
+ NZERROR_TK_PLSQL_NO_IDENTITY = 28838,
+ /* No identity descriptor specified to PL/SQL function */
+ NZERROR_TK_PLSQL_NO_PERSONA = 28839,
+ /* No persona descriptor was specified to PL/SQL function */
+ NZERROR_TK_PLSQL_WALLET_OPEN = 28840,
+ /* Wallet was already opened */
+ NZERROR_UNSUPPORTED = 28841, /* Operation is not supported */
+ NZERROR_FILE_BAD_PERMISSION = 28842, /* Bad file permission specified */
+ NZERROR_FILE_OSD_ERROR = 28843, /* OSD error when opening file */
+ NZERROR_NO_WALLET = 28844, /* cert + privkey + tp files do not exist */
+ NZERROR_NO_CERTIFICATE_ALERT = 28845, /* no certificate */
+ NZERROR_NO_PRIVATE_KEY = 28846, /* no private-key */
+ NZERROR_NO_CLEAR_PRIVATE_KEY_FILE = 28847, /* no clear key-file */
+ NZERROR_NO_ENCRYPTED_PRIVATE_KEY_FILE = 28848, /* no encrypted priv key */
+ NZERROR_NO_TRUSTPOINTS = 28849, /* no trustpoints */
+ NZERROR_NO_CLEAR_TRUSTPOINT_FILE = 28850, /* no clear trustpoints */
+ NZERROR_NO_ENCRYPTED_TRUSTPOINT_FILE = 28851, /* no encrypted trustpoints */
+ NZERROR_BAD_PASSWORD = 28852, /* bad password */
+ NZERROR_INITIALIZATION_FAILED = 28853, /* init failed or
+ module loading failed */
+ /******************************* SSL ERRORS ********************************/
+ /*
+ * In order to allow SSL errors to be mapped to Oracle errors, space is
+ * provided here. One Oracle error is provided for each SSL error to make
+ * error handling easier. A macro is provided to do the conversion.
+ * NOTE: ANY CHANGE IN SSL ERRORS MUST BE REFLECTED HERE.
+ * To add an SSL error, use the following formula to calculate the Oracle
+ * error:
+ * new_oracle_error = (new_ssl_error - SSLMemoryError) + NZERROR_SSLMemoryErr
+ * or numerically:
+ * new_oracle_error = (new_ssl_error - -7000) + 28854
+ */
+ NZERROR_SSLMemoryErr = 28854,
+ NZERROR_SSLUnsupportedErr = 28855,
+ NZERROR_SSLOverflowErr = 28856,
+ NZERROR_SSLUnknownErr = 28857,
+ NZERROR_SSLProtocolErr = 28858,
+ NZERROR_SSLNegotiationErr = 28859,
+ NZERROR_SSLFatalAlert = 28860,
+ NZERROR_SSLWouldBlockErr = 28861,
+ NZERROR_SSLIOErr = 28862,
+ NZERROR_SSLSessionNotFoundErr = 28863,
+ NZERROR_SSLConnectionClosedGraceful = 28864,
+ NZERROR_SSLConnectionClosedError = 28865,
+ NZERROR_ASNBadEncodingErr = 28866,
+ NZERROR_ASNIntegerTooBigErr = 28867,
+ NZERROR_X509CertChainInvalidErr = 28868,
+ NZERROR_X509CertExpiredErr = 28869,
+ NZERROR_X509NamesNotEqualErr = 28870,
+ NZERROR_X509CertChainIncompleteErr = 28871,
+ NZERROR_X509DataNotFoundErr = 28872,
+ NZERROR_SSLBadParameterErr = 28873,
+ NZERROR_SSLIOClosedOverrideGoodbyeKiss = 28874,
+ NZERROR_X509MozillaSGCErr = 28875,
+ NZERROR_X509IESGCErr = 28876,
+ NZERROR_ImproperServerCredentials = 28877,
+ NZERROR_ImproperClientCredentials = 28878,
+ NZERROR_NoProtocolSideSet = 28879,
+ NZERROR_setPersonaFailed = 28880,
+ NZERROR_setCertFailed = 28881,
+ NZERROR_setVKeyFailed = 28882,
+ NZERROR_setTPFailed = 28883,
+ NZERROR_BadCipherSuite = 28884,
+ NZERROR_NoKeyPairForKeyUsage = 28885,
+
+/* ============>>> ENTRUST ERRORS */
+ NZERROR_EntrustLoginFailed = 28890,
+ NZERROR_EntrustGetInfoFailed = 28891,
+ NZERROR_EntrustLoadCertificateFailed = 28892,
+ NZERROR_EntrustGetNameFailed = 28893,
+
+/* ============>>> NZERRORS CONTINUED */
+ NZERROR_CertNotInstalled = 29000,
+ NZERROR_ServerDNMisMatched = 29002,
+ NZERROR_ServerDNMisConfigured = 29003,
+
+/* ============>>> PKI VENDORS ERRORS 29050 - 29099 */
+
+/* ============>>> SSL Errors CONTINUED */
+ NZERROR_CIC_ERR_SSL_ALERT_CB_FAILURE = 29004,
+ NZERROR_CIC_ERR_SSL_BAD_CERTIFICATE = 29005,
+ NZERROR_CIC_ERR_SSL_BAD_CERTIFICATE_REQUEST = 29006,
+ NZERROR_CIC_ERR_SSL_BAD_CLEAR_KEY_LEN = 29007,
+ NZERROR_CIC_ERR_SSL_BAD_DHPARAM_KEY_LENGTH = 29008,
+ NZERROR_CIC_ERR_SSL_BAD_ENCRYPTED_KEY_LEN = 29009,
+ NZERROR_CIC_ERR_SSL_BAD_EXPORT_KEY_LENGTH = 29010,
+ NZERROR_CIC_ERR_SSL_BAD_FINISHED_MESSAGE = 29011,
+ NZERROR_CIC_ERR_SSL_BAD_KEY_ARG_LEN = 29012,
+ NZERROR_CIC_ERR_SSL_BAD_MAC = 29013,
+ NZERROR_CIC_ERR_SSL_BAD_MAX_FRAGMENT_LENGTH_EXTENSION = 29014,
+ NZERROR_CIC_ERR_SSL_BAD_MESSAGE_LENGTH = 29015,
+ NZERROR_CIC_ERR_SSL_BAD_PKCS1_PADDING = 29016,
+ NZERROR_CIC_ERR_SSL_BAD_PREMASTER_SECRET_LENGTH = 29017,
+ NZERROR_CIC_ERR_SSL_BAD_PREMASTER_SECRET_VERSION = 29018,
+ NZERROR_CIC_ERR_SSL_BAD_PROTOCOL_VERSION = 29019,
+ NZERROR_CIC_ERR_SSL_BAD_RECORD_LENGTH = 29020,
+ NZERROR_CIC_ERR_SSL_BAD_SECRET_KEY_LEN = 29021,
+ NZERROR_CIC_ERR_SSL_BAD_SIDE = 29022,
+ NZERROR_CIC_ERR_SSL_BUFFERS_NOT_EMPTY = 29023,
+ NZERROR_CIC_ERR_SSL_CERTIFICATE_VALIDATE_FAILED = 29024,
+ NZERROR_CIC_ERR_SSL_CERT_CHECK_CALLBACK = 29025,
+ NZERROR_CIC_ERR_SSL_DECRYPT_FAILED = 29026,
+ NZERROR_CIC_ERR_SSL_ENTROPY_COLLECTION = 29027,
+ NZERROR_CIC_ERR_SSL_FAIL_SERVER_VERIFY = 29028,
+ NZERROR_CIC_ERR_SSL_HANDSHAKE_ALREADY_COMPLETED = 29029,
+ NZERROR_CIC_ERR_SSL_HANDSHAKE_REQUESTED = 29030,
+ NZERROR_CIC_ERR_SSL_HANDSHAKE_REQUIRED = 29031,
+ NZERROR_CIC_ERR_SSL_INCOMPLETE_IDENTITY = 29032,
+ NZERROR_CIC_ERR_SSL_INVALID_PFX = 29033,
+ NZERROR_CIC_ERR_SSL_NEEDS_CIPHER_OR_CLIENTAUTH = 29034,
+ NZERROR_CIC_ERR_SSL_NEEDS_PRNG = 29035,
+ NZERROR_CIC_ERR_SSL_NOT_SUPPORTED = 29036,
+ NZERROR_CIC_ERR_SSL_NO_CERTIFICATE = 29037,
+ NZERROR_CIC_ERR_SSL_NO_MATCHING_CERTIFICATES = 29038,
+ NZERROR_CIC_ERR_SSL_NO_MATCHING_CIPHER_SUITES = 29039,
+ NZERROR_CIC_ERR_SSL_NO_SUPPORTED_CIPHER_SUITES = 29040,
+ NZERROR_CIC_ERR_SSL_NULL_CB = 29041,
+ NZERROR_CIC_ERR_SSL_READ_BUFFER_NOT_EMPTY = 29042,
+ NZERROR_CIC_ERR_SSL_READ_REQUIRED = 29043,
+ NZERROR_CIC_ERR_SSL_RENEGOTIATION_ALREADY_REQUESTED = 29044,
+ NZERROR_CIC_ERR_SSL_RENEGOTIATION_REFUSED = 29045,
+ NZERROR_CIC_ERR_SSL_RESUMABLE_SESSION = 29046,
+ NZERROR_CIC_ERR_SSL_TLS_EXTENSION_MISMATCH = 29047,
+ NZERROR_CIC_ERR_SSL_UNEXPECTED_MSG = 29048,
+ NZERROR_CIC_ERR_SSL_UNKNOWN_RECORD = 29049,
+ NZERROR_CIC_ERR_SSL_UNSUPPORTED_CLIENT_AUTH_MODE = 29050,
+ NZERROR_CIC_ERR_SSL_UNSUPPORTED_PUBKEY_TYPE = 29051,
+ NZERROR_CIC_ERR_SSL_WRITE_BUFFER_NOT_EMPTY = 29052,
+ NZERROR_CIC_ERR_PKCS12_MISSING_ALG = 29053,
+ NZERROR_CIC_ERR_PKCS_AUTH_FAILED = 29054,
+ NZERROR_CIC_ERR_PKCS_BAD_CONTENT_TYPE = 29055,
+ NZERROR_CIC_ERR_PKCS_BAD_INPUT = 29056,
+ NZERROR_CIC_ERR_PKCS_BAD_PADDING = 29057,
+ NZERROR_CIC_ERR_PKCS_BAD_SN = 29058,
+ NZERROR_CIC_ERR_PKCS_BAD_SN_LENGTH = 29059,
+ NZERROR_CIC_ERR_PKCS_BAD_VERSION = 29060,
+ NZERROR_CIC_ERR_PKCS_BASE = 29061,
+ NZERROR_CIC_ERR_PKCS_FIELD_NOT_PRESENT = 29062,
+ NZERROR_CIC_ERR_PKCS_NEED_CERTVAL = 29063,
+ NZERROR_CIC_ERR_PKCS_NEED_PASSWORD = 29064,
+ NZERROR_CIC_ERR_PKCS_NEED_PKC = 29065,
+ NZERROR_CIC_ERR_PKCS_NEED_PRV_KEY = 29066,
+ NZERROR_CIC_ERR_PKCS_NEED_TRUSTED = 29067,
+ NZERROR_CIC_ERR_PKCS_UNSUPPORTED_CERT_FORMAT = 29068,
+ NZERROR_CIC_ERR_PKCS_UNSUP_PRVKEY_TYPE = 29069,
+ NZERROR_CIC_ERR_CODING_BAD_PEM = 29070,
+ NZERROR_CIC_ERR_CODING_BASE = 29071,
+ NZERROR_CIC_ERR_DER_BAD_ENCODING = 29072,
+ NZERROR_CIC_ERR_DER_BAD_ENCODING_LENGTH = 29073,
+ NZERROR_CIC_ERR_DER_BASE = 29074,
+ NZERROR_CIC_ERR_DER_ELEMENT_TOO_LONG = 29075,
+ NZERROR_CIC_ERR_DER_INDEFINITE_LENGTH = 29076,
+ NZERROR_CIC_ERR_DER_NO_MORE_ELEMENTS = 29077,
+ NZERROR_CIC_ERR_DER_OBJECT_TOO_LONG = 29078,
+ NZERROR_CIC_ERR_DER_TAG_SIZE = 29079,
+ NZERROR_CIC_ERR_DER_TIME_OUT_OF_RANGE = 29080,
+ NZERROR_CIC_ERR_DER_UNUSED_BITS_IN_BIT_STR = 29081,
+ NZERROR_CIC_ERR_GENERAL_BASE = 29082,
+ NZERROR_CIC_ERR_HASH_BASE = 29083,
+ NZERROR_CIC_ERR_ILLEGAL_PARAM = 29084,
+ NZERROR_CIC_ERR_MEM_NOT_OURS = 29085,
+ NZERROR_CIC_ERR_MEM_OVERRUN = 29086,
+ NZERROR_CIC_ERR_MEM_UNDERRUN = 29087,
+ NZERROR_CIC_ERR_MEM_WAS_FREED = 29088,
+ NZERROR_CIC_ERR_NOT_FOUND = 29090,
+ NZERROR_CIC_ERR_NO_PTR = 29091,
+ NZERROR_CIC_ERR_TIMEOUT = 29092,
+ NZERROR_CIC_ERR_UNIT_MASK = 29093,
+ NZERROR_CIC_ERR_BAD_CTX = 29094,
+ NZERROR_CIC_ERR_BAD_INDEX = 29095,
+ NZERROR_CIC_ERR_BAD_LENGTH = 29096,
+ NZERROR_CIC_ERR_CODING_BAD_ENCODING = 29097,
+
+ /* ============>>> PKCS12 error 29100 - 29149 */
+
+ NZERROR_LOCKEYID_CREATE_FAILED = 29100,
+ NZERROR_P12_ADD_PVTKEY_FAILED = 29101,
+ NZERROR_P12_ADD_CERT_FAILED = 29102,
+ NZERROR_P12_WLT_CREATE_FAILED = 29103,
+ NZERROR_P12_ADD_CERTREQ_FAILED = 29104,
+ NZERROR_P12_WLT_EXP_FAILED = 29105,
+ NZERROR_P12_WLT_IMP_FAILED = 29106,
+ NZERROR_P12_CREATE_FAILED = 29107,
+ NZERROR_P12_DEST_FAILED = 29107,
+ NZERROR_P12_RAND_ERROR = 29108,
+ NZERROR_P12_PVTKEY_CRT_FAILED = 29109,
+ NZERROR_P12_INVALID_BAG = 29110,
+ NZERROR_P12_INVALID_INDEX = 29111,
+ NZERROR_P12_GET_CERT_FAILED = 29112,
+ NZERROR_P12_GET_PVTKEY_FAILED = 29113,
+ NZERROR_P12_IMP_PVTKEY_FAILED = 29114,
+ NZERROR_P12_EXP_PVTKEY_FAILED = 29115,
+ NZERROR_P12_GET_ATTRIB_FAILED = 29116,
+ NZERROR_P12_ADD_ATTRIB_FAILED = 29117,
+ NZERROR_P12_CRT_ATTRIB_FAILED = 29118,
+ NZERROR_P12_IMP_CERT_FAILED = 29119,
+ NZERROR_P12_EXP_CERT_FAILED = 29120,
+ NZERROR_P12_ADD_SECRET_FAILED = 29121,
+ NZERROR_P12_ADD_PKCS11INFO_FAILED = 29122,
+ NZERROR_P12_GET_PKCS11INFO_FAILED = 29123,
+ NZERROR_P12_MULTIPLE_PKCS11_LIBNAME = 29124,
+ NZERROR_P12_MULTIPLE_PKCS11_TOKENLABEL = 29125,
+ NZERROR_P12_MULTIPLE_PKCS11_TOKENPASSPHRASE = 29126,
+ NZERROR_P12_UNKNOWN_PKCS11INFO = 29127,
+ NZERROR_P12_PKCS11_LIBNAME_NOT_SET = 29128,
+ NZERROR_P12_PKCS11_TOKENLABEL_NOT_SET = 29129,
+ NZERROR_P12_PKCS11_TOKENPASSPHRASE_NOT_SET = 29130,
+
+/* ===========>>> SSL Errors CONTINUED 29135 - 29139 */
+ NZERROR_CIC_ERR_RANDOM = 29135,
+ NZERROR_CIC_ERR_SMALL_BUFFER = 29136,
+ NZERROR_CIC_ERR_SSL_BAD_CONTEXT = 29137,
+
+/* ==========>>> Mutex Errors 29138 - 29139 */
+ NZERROR_MUTEX_INITIALIZE_FAILED = 29138,
+ NZERROR_MUTEX_DESTROY_FAILED = 29139,
+
+
+/* ============>>> EXTENSIONS Errors 29140 - 29149 */
+ NZERROR_BS_CERTOBJ_CREAT_FAILED = 29140,
+ NZERROR_BS_DER_IMP_FAILED = 29141,
+
+
+/* ============>>> FIPS ERRORS 29150 - 29175 */
+ NZERROR_DES_SELF_TEST_FAILED = 29150,
+ NZERROR_3DES_SELF_TEST_FAILED = 29151,
+ NZERROR_SHA_SELF_TEST_FAILED = 29152,
+ NZERROR_RSA_SELF_TEST_FAILED = 29153,
+ NZERROR_DRNG_SELF_TEST_FAILED = 29154,
+ NZERROR_CKEYPAIR_SELF_TEST_FAILED = 29155,
+ NZERROR_CRNG_SELF_TEST_FAILED = 29156,
+ NZERROR_FIPS_PATHNAME_ERROR = 29157,
+ NZERROR_FIPS_LIB_OPEN_FAILED = 29158,
+ NZERROR_FIPS_LIB_READ_ERROR = 29159,
+ NZERROR_FIPS_LIB_DIFFERS = 29160,
+ NZERROR_DAC_SELF_TEST_FAILED = 29161,
+ NZERROR_NONFIPS_CIPHERSUITE = 29162,
+ NZERROR_VENDOR_NOT_SUPPORTED_FIPS_MODE = 29163,
+ NZERROR_EXTERNAL_PKCS12_NOT_SUPPORTED_FIPS_MODE = 29164,
+
+/* ============>>> CRL ERRORS 29176 - 29200 */
+ NZERROR_CRL_SIG_VERIFY_FAILED = 29176, /*CRL signature verification failed*/
+ NZERROR_CERT_NOT_IN_CRL = 29177,
+ /*Cert is not in CRL - cert is not revoked*/
+ NZERROR_CERT_IN_CRL = 29178, /*Cert is in CRL - cert is revoked*/
+ NZERROR_CERT_IN_CRL_CHECK_FAILED = 29179, /*Cert revocation check failed */
+ NZERROR_INVALID_CERT_STATUS_PROTOCOL = 29180,
+ NZERROR_LDAP_OPEN_FAILED = 29181, /* ldap_open failed */
+ NZERROR_LDAP_BIND_FAILED = 29182, /* ldap_bind failed */
+ NZERROR_LDAP_SEARCH_FAILED = 29183, /* ldap_search failed */
+ NZERROR_LDAP_RESULT_FAILED = 29184, /* ldap_result failed */
+ NZERROR_LDAP_FIRSTATTR_FAILED = 29185, /* ldap_first_attribute failed */
+ NZERROR_LDAP_GETVALUESLEN_FAILED = 29186, /* ldap_get_values_len failed */
+ NZERROR_LDAP_UNSUPPORTED_VALMEC = 29187,
+ /* unsupported validation mechanism */
+ NZERROR_LDAP_COUNT_ENTRIES_FAILED = 29188,/* ldap_count_entries failed */
+ NZERROR_LDAP_NO_ENTRY_FOUND = 29189, /* No entry found in OID */
+ NZERROR_LDAP_MULTIPLE_ENTRIES_FOUND = 29190, /* Multiple entries in OID*/
+ NZERROR_OID_INFO_NOT_SET = 29191,
+ NZERROR_LDAP_VALMEC_NOT_SET = 29192,
+ /* Validation mechanism not set in OID*/
+ NZERROR_CRLDP_NO_CRL_FOUND = 29193,
+ /* No CRL found using CRLDP mechanism */
+ NZERROR_CRL_NOT_IN_CACHE = 29194, /* No CRL found in the cache*/
+ NZERROR_CRL_EXPIRED = 29195, /* CRL nextUpdate time is in the past */
+
+/* ============>>> ADD ERRORS HERE -- NOTE DECREASING numbers */
+ NZERROR_DN_MATCH = 29222, /* for nztCompareDN */
+ NZERROR_CERT_CHAIN_CREATION = 29223, /* unable to create a cert chain
+ * with the existing TPs for the
+ * cert to be installed.
+ */
+ NZERROR_NO_MATCHING_CERT_REQ = 29224, /* No matching cert_req was
+ * found the corresponding to
+ * the privatekey which
+ * matches the cert to be
+ * installed */
+ NZERROR_CERT_ALREADY_INSTALLED = 29225, /* we are attempting to
+ * install a cert again into
+ * a persona which already
+ * has it installed.
+ */
+ NZERROR_NO_MATCHING_PRIVATE_KEY = 29226, /* could not find a matching
+ * persona-private(privatekey) in
+ * the Persona, for the given
+ * cert(public key).
+ */
+ NZERROR_VALIDITY_EXPIRED = 29227, /* certificate validity date expired */
+ NZERROR_TK_BYTES_NEEDED = 29228, /* Couldn't determine # of bytes needed */
+ NZERROR_TK_BAD_MAGIC_NUMBER = 29229,
+ /* Magic number found in header does not match expected */
+ NZERROR_TK_BAD_HEADER_LENGTH = 29230,
+ /* Header length passed in not sufficient for message header */
+ NZERROR_TK_CE_INIT = 29231, /* Crypto engine failed to initialize */
+ NZERROR_TK_CE_KEYINIT = 29232, /* Crypto engine key initialization failed */
+ NZERROR_TK_CE_ENCODE_KEY = 29233, /* Count not encode key object */
+ NZERROR_TK_CE_DECODE_KEY = 29234, /* Could not decode key into object */
+ NZERROR_TK_CE_GEYKEYINFO = 29235, /* Crypto engine failed to get key info */
+ NZERROR_TK_SEED_RANDOM = 29236, /* Couldn't seed random number generator */
+ NZERROR_TK_CE_ALGFINISH = 29237, /* Couldn't finish algorithm */
+ NZERROR_TK_CE_ALGAPPLY = 29238, /* Couldn't apply algorithm to data */
+ NZERROR_TK_CE_ALGINIT = 29239, /* Couldn't init CE for algorithm */
+ NZERROR_TK_ALGORITHM = 29240, /* Have no idea what algorithm you want */
+ NZERROR_TK_CANNOT_GROW = 29241, /* Cannot grow output buffer block */
+ NZERROR_TK_KEYSIZE = 29242, /* Key not large enough for data */
+ NZERROR_TK_KEYTYPE = 29243, /* Unknown key type. */
+
+ NZERROR_TK_PLSQL_NO_WRL = 29244,
+ /* Wallet resource locator not specified to PL/SQL function */
+
+ NZERROR_TK_CE_FUNC = 29245, /* Unknown crypto engine function */
+ NZERROR_TK_TDU_FORMAT = 29246, /* Unknown TDU format */
+ NZERROR_TK_NOTOPEN = 29247, /* Object must be open */
+ NZERROR_TK_WRLTYPE = 29248, /* Bad WRL type */
+ NZERROR_TK_CE_STATE = 29249, /* Bad state specified for the crypto engine */
+
+ /* After 29249, use error numbers in block 43000 - 43499 */
+ NZERROR_PKCS11_LIBRARY_NOT_FOUND = 43000, /* PKCS #11 library not found */
+ NZERROR_PKCS11_TOKEN_NOT_FOUND = 43001,
+ /* can't find token with given label*/
+ NZERROR_PKCS11_BAD_PASSPHRASE = 43002, /* passphrase is incorrect/expired */
+ NZERROR_PKCS11_GET_FUNC_LIST = 43003, /* C_GetFunctionList returned error */
+ NZERROR_PKCS11_INITIALIZE = 43004, /* C_Initialize returned error */
+ NZERROR_PKCS11_NO_TOKENS_PRESENT = 43005, /* No tokens present */
+ NZERROR_PKCS11_GET_SLOT_LIST = 43006, /* C_GetSlotList returned error */
+
+ NZERROR_PKCS11_GET_TOKEN_INFO = 43008, /* C_GetTokenInfo returned error */
+ NZERROR_PKCS11_SYMBOL_NOT_FOUND = 43009, /* Symbol not found in PKCS11 lib */
+
+ NZERROR_PKCS11_TOKEN_LOGIN_FAILED = 43011, /* Token login failed */
+
+ NZERROR_PKCS11_CHANGE_PROVIDERS_ERROR = 43013, /* Change providers error */
+ NZERROR_PKCS11_GET_PRIVATE_KEY_ERROR = 43014,
+ /* Error trying to find private key on token */
+ NZERROR_PKCS11_CREATE_KEYPAIR_ERROR = 43015, /* Key pair gen error */
+ NZERROR_PKCS11_WALLET_CONTAINS_P11_INFO = 43016, /* Wallet already contains
+ pkcs11 info */
+
+ /* RSA ERRORS 43050 - 43059 */
+ NZERROR_BIND_SERVICE_ERROR = 43050, /* C_BindService returned error */
+ NZERROR_CREATE_KEY_OBJ_ERROR = 43051, /* B_CreateKeyObject returned error */
+ NZERROR_GET_CERT_FIELDS = 43052, /* C_GetCertFields returned error */
+ NZERROR_CREATE_PKCS10_OBJECT = 43053,
+ /* C_CreatePKCS10Object returned error */
+ NZERROR_SET_PKCS10_FIELDS = 43054, /* C_SetPKCS10Fields returned error */
+ NZERROR_SIGN_CERT_REQUEST = 43055, /* C_SignCertRequest returned error */
+ NZERROR_GET_PKCS10_DER = 43056, /* C_GetPKCS10DER returned error */
+ NZERROR_INITIALIZE_CERTC = 43057, /* C_InitializeCertC returned error */
+ NZERROR_INSERT_PRIVATE_KEY = 43058, /* C_InsertPrivateKey returned error */
+ /* slts ERRORS 43060 - 43069 */
+ NZERROR_SLTSCTX_INIT_FAILED = 43060, /* sltsini() returned error */
+ NZERROR_SLTSKYC_FAILED = 43061, /* sltskyc() returned error */
+ NZERROR_SLTSCTX_TERM_FAILED = 43062, /* sltster() returned error */
+ NZERROR_SLTSKYS_FAILED = 43063, /* sltskys() returned error */
+
+ NZERROR_INVALID_HEADER_LENGTH = 43070, /* bad sso header length */
+
+ NZERROR_LAST_ERROR = 43499, /* Last available error */
+ /* MAXIMUM ERROR NUMBER IS 43499 */
+
+ /*
+ * DO NOT JUST INSERT NEW ERRORS IN ANY OLD PLACE. New errors should be
+ * added such the current error retains their integer values. Duplicate
+ * values will cause compiler errors.
+ */
+ NZERROR_THIS_MUST_BE_LAST
+
+} nzerror;
+
+/*
+ * Macro to convert SSL errors to Oracle errors. As SSL errors are negative
+ * and Oracle numbers are positive, the following needs to be done.
+ * 1. The base error number, which is the highest, is added to the
+ * SSL error to get the index into the number range.
+ * 2. The result is added to the base Oracle number to get the Oracle error.
+ */
+#define NZERROR_SSL_TO_ORACLE(ssl_error_) \
+ ((ssl_error_ == SSLNoErr) \
+ ? NZERROR_OK \
+ : (nzerror) ((ssl_error_ - SSLMemoryErr) + (uword) NZERROR_SSLMemoryErr))
+#endif /* NZERROR_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/nzt.h b/src/terralib/drivers/OracleSpatial/OCI/include/nzt.h
new file mode 100644
index 0000000..abf604d
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/nzt.h
@@ -0,0 +1,2750 @@
+/* DISABLE check_long_lines */
+
+/* Copyright (c) 1996, 2003, Oracle Corporation. All rights reserved. */
+/* Copyright (c) 1996, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/nzt.h,v 1.3 2005/05/06 16:48:55 karine Exp $
+ */
+
+/*
+ * NAME
+ * nzt.h
+ *
+ * DESCRIPTION
+ * Toolkit public declarations.
+ *
+ * PUBLIC FUNCTIONS
+ * nztwOpenWallet - Open a wallet based on a WRL and pwd.
+ * nztwCloseWallet - Close a wallet.
+ * + nztwCreateWallet - Create a new wallet.
+ * + nztwDestroyWallet - Destroy an existing wallet.
+ * nztwRetrievePersonaCopy - Retieve a copy of a particular persona.
+ * + nzteStorePersona - Store a persona in the wallet.
+ * nzteOpenPersona - Open a persona.
+ * nzteClosePersona - Close a persona.
+ * + nzteRemovePersona - Remove a persona from a wallet.
+ * + nzteCreatePersona - Create a persona.
+ * nzteDestroyPersona - Destroy a persona.
+ * nztiStoreTrustedIdentity - Store an identity with associated trust.
+ * nzteRetrieveTrustedIdentCopy - Retrieves a trusted identity from persona
+ * + nzteSetProtection - Modify the protection set in a persona.
+ * + nzteGetProtection - Get the protection set in a persona
+ * nztePriKey - Get the Private Key (X509 Only)
+ * nzteMyCert - Get the Certificate (X509 only)
+ * nzteX509CreatePersona - Create a persona given an X509 Certificate.
+ * + nztiRemoveIdentity - Remove an identity from a persona.
+ * nztiCreateIdentity - Create an identity.
+ * nztiDuplicateIdentity - Create a complete copy of an identity.
+ * nztiAbortIdentity - Discard an unstored identity.
+ * nztidGetIdentityDesc - Gets Identity Description from Identity.
+ * nztidFreeIdentityDesc - Frees memory for Identity Desc object.
+ * nztSign - Generate an attached signature.
+ * + nztxSignExpansion - Determine size of signature.
+ * nztVerify - Verify an attached signature.
+ * nztValidate - Validate an identity.
+ * nztsd_SignDetached - Generate a detached signature.
+ * + nztxsd_SignDetachedExpansion - Determine size of detached signature.
+ * nztved_VerifyDetached - Verify a detached signature.
+ * + nztEncrypt - Symmetric key encryption.
+ * + nztxEncryptExpansion - Determine the tdu length for encryption.
+ * + nztDecrypt - Symmetric key decryption.
+ * + nztEnvelope - Sign then encrypt data for recipient(s).
+ * + nztDeEnvelope - Reverse nztEnvelope.
+ * + nztKeyedHash - Generate keyed hash.
+ * + nztxKeyedHashExpansion - Determine size of TDU for keyed hash.
+ * nztHash - Generate hash.
+ * + nztxHashExpansion - Determine the size of the TDU for a hash.
+ * nztSeedRandom - See the random number generator.
+ * nztrb_RandomBytes - Generate a series of random bytes.
+ * nztrn_RandomNumber - Generate a random number.
+ * nztbbInitBlock - Initialize a buffer block.
+ * nztbbReuseBlock - Reuse a buffer block.
+ * nztbbSizeBlock - Find the size of the buffer block.
+ * nztbbGrowBlock - Grow initialized buffer block by 'inc' bytes.
+ * nztbbPurgeBlock - Purge the memory used within a buffer block.
+ * nztbbSetBlock - Set block to known state.
+ * nztkec_PKEncrypt - Encrypt data then encrypt key for recipient.
+ * nztkdc_PKDecrypt - Decrypt PKEncrypt'ed data.
+ * nztific_FreeIdentityContent - Free the contents of an identity.
+ * nztifdn - Create an identity from a distinguished name
+ * nztcts_CipherSpecToStr - Converts the Cipher Spec Code To String
+ * nztiae_IsAuthEnabled - Checks to see if Authentication is Enabled
+ * in the current Cipher Spec.
+ * nztiae_IsEncrEnabled - Checks to see if Encryption is Enabled
+ * in the current Cipher Spec.
+ * nztiae_IsHashEnabled - Checks to see if Hashing is Enabled
+ * in the current Cipher Spec.
+ * nztwGetCertInfo - Get peer certificate info
+ *
+ * NOTE: the '+' indicates that these functions are UNSUPPORTED at this time.
+ *
+ * NOTES
+ *
+ * MODIFIED
+ * srtata 11/10/03 - fix nztSetAppDefaultLocation header
+ * rchahal 10/15/03 - bug 2513821
+ * rchahal 11/11/02 - pkcs11 support
+ * akoyfman 07/05/02 - adding secret store to persona
+ * supriya 10/11/01 - Fix for bug # 2015732
+ * ajacobs 04/04/01 - make NZT_REGISTRY_WRL always available
+ * ajacobs 03/06/01 - olint fix
+ * ajacobs 03/02/01 - Add GetCertInfo
+ * supriya 02/23/01 - Move nzttKPUsage from nzt0.h
+ * rchahal 01/26/01 - olint fixes
+ * supriya 12/07/00 - Change fn name
+ * supriya 12/01/00 - Certificate API's needed for iAS
+ * supriya 06/19/00 - Adding definitions for MCS and ENTR
+ * lkethana 05/31/00 - multiple cert support
+ * skanjila 06/25/99 - Remove nztcts_CipherSpecToStr() to NZOS.
+ * skanjila 06/23/99 - Change API of nztcts_CipherSpecToStr.
+ * lkethana 06/18/99 - rem nztIPrivateAlloc, etc
+ * lkethana 06/10/99 - changing size_t to ub4
+ * lkethana 06/02/99 - add api for getting auth/encry/hash capability of c
+ * arswamin 12/28/98 - add NZT_MAX_MD5.
+ * arswamin 12/21/98 - change signature of compareDN
+ * qdinh 12/21/98 - change size_t to ub4.
+ * inetwork 11/22/98 - Removing NZDEPRECATED definition
+ * amthakur 09/14/98 - deprecating and updating the c-structures.
+ * arswamin 09/24/98 - adding NZTTWRL_NULL for SSO support.
+ * amthakur 07/30/98 - changing the prototype of nztGetCertChain.
+ * qdinh 05/01/98 - add NZTTIDENTTYPE_INVALID_TYPE
+ * qdinh 04/17/98 - add NZTTWRL_ORACLE.
+ * ascott 10/08/97 - implement nztiStoreTrustedIdentity
+ * ascott 10/07/97 - add nztiGetIdentityDesc
+ * ascott 09/28/97 - clarify prototype comments and error codes
+ * ascott 09/05/97 - update identity: create, destroy, duplicate
+ * ascott 08/21/97 - add GetCert and GetPriKey
+ * ascott 08/07/97 - add other WRL settings
+ * asriniva 03/25/97 - Add ANSI prototypes
+ * rwessman 03/19/97 - Added prototypes for nztific_FreeIdentityContent()
+ * asriniva 03/11/97 - Fix olint errors
+ * sdange 02/28/97 - Removed inclusion of nz0decl.h
+ * sdange 02/18/97 - Moved nzt specific declarations from nz0decl.h
+ * asriniva 01/21/97 - Remove prototypes.
+ * asriniva 10/31/96 - Include oratypes.h
+ * asriniva 10/15/96 - Declare buffer block helper functions
+ * asriniva 10/08/96 - First pass at wallet open/close
+ * asriniva 10/04/96 - Add random number seed function
+ * asriniva 10/03/96 - Reorder parameters in nztbbSetBlock
+ * asriniva 10/03/96 - Keep editing.
+ * asriniva 10/03/96 - Continued edits.
+ * asriniva 10/02/96 - Continue editing.
+ * asriniva 09/26/96 -
+ */
+
+/* ENABLE check_long_lines */
+
+#ifndef NZT_ORACLE
+#define NZT_ORACLE
+
+#ifndef ORATYPES
+# include <oratypes.h>
+#endif /* ORATYPES */
+
+#ifndef NZERROR_ORACLE
+# include <nzerror.h> /* NZ error type */
+#endif /* NZERROR_ORACLE */
+
+
+#define NZT_MAX_SHA1 20
+#define NZT_MAX_MD5 16
+
+/***************************************/
+/* PUBLIC CONSTANTS, MACROS, AND TYPES */
+/***************************************/
+
+/*
+ * Wallet Resource Locator Type Strings
+ *
+ * WRL TYPE PARAMETERS BEHAVIOR
+ * ======== ========== =====================================
+ * default: <none> Uses directory defined by the parameter
+ * SNZD_DEFAULT_FILE_DIRECTORY which in
+ * unix is "$HOME/oracle/oss"
+ *
+ * file: file path Find the Oracle wallet in this directory.
+ * example: file:<dir-path>
+ *
+ * sqlnet: <none> In this case, the directory path will be
+ * retrieved from the sqlnet.ora file under
+ * the oss.source.my_wallet parameter.
+ *
+ * mcs: <none> Microsoft WRL.
+ *
+ * entr: dir path Entrust WRL. eg: ENTR:<dir-path>
+ *
+ */
+/* Note that there is no NZT_NULL_WRL. Instead look in snzd.h for DEFAULT_WRP
+ * which is used in our new defaulting mechanism. The NZT_DEFAULT_WRL
+ * should be deprecated.
+ */
+#define NZT_DEFAULT_WRL ((text *)"default:")
+#define NZT_SQLNET_WRL ((text *)"sqlnet:")
+#define NZT_FILE_WRL ((text *)"file:")
+#define NZT_ENTR_WRL ((text *)"entr:")
+#define NZT_MCS_WRL ((text *)"mcs:")
+#define NZT_ORACLE_WRL ((text *)"oracle:")
+#define NZT_REGISTRY_WRL ((text *)"reg:")
+
+enum nzttwrl
+{
+ NZTTWRL_DEFAULT = 1, /* Default, use SNZD_DEFAULT_FILE_DIRECTORY */
+ NZTTWRL_SQLNET, /* Use oss.source.my_wallet in sqlnet.ora file */
+ NZTTWRL_FILE, /* Find the oracle wallet in this directory */
+ NZTTWRL_ENTR, /* Find the entrust profile in this directory */
+ NZTTWRL_MCS, /* WRL for Microsoft */
+ NZTTWRL_ORACLE, /* Get the wallet from OSS db */
+ NZTTWRL_NULL, /* New SSO defaulting mechanism */
+ NZTTWRL_REGISTRY /* Find the wallet in Windows Registry */
+};
+typedef enum nzttwrl nzttwrl;
+
+#ifndef NZ0DECL_ORACLE
+ /*
+ * With the elimination of nz0decl.h from public, we need this
+ * redundant typedef.
+ */
+ typedef struct nzctx nzctx;
+ typedef struct nzstrc nzstrc;
+ typedef struct nzosContext nzosContext;
+#endif /* NZ0DECL_ORACLE */
+
+/* Moved from nz0decl.h */
+
+typedef struct nzttIdentity nzttIdentity;
+typedef struct nzttIdentityPrivate nzttIdentityPrivate;
+typedef struct nzttPersona nzttPersona;
+typedef struct nzttPersonaPrivate nzttPersonaPrivate;
+typedef struct nzttWallet nzttWallet;
+typedef struct nzttWalletPrivate nzttWalletPrivate;
+typedef struct nzttWalletObj nzttWalletObj; /* For wallet object */
+typedef struct nzssEntry nzssEntry; /* For secretstore */
+typedef struct nzpkcs11_Info nzpkcs11_Info;
+
+/*
+ * Crypto Engine State
+ *
+ * Once the crypto engine (CE) has been initialized for a particular
+ * cipher, it is either at the initial state, or it is continuing to
+ * use the cipher. NZTCES_END is used to change the state back to
+ * initialized and flush any remaining output. NZTTCES_RESET can be
+ * used to change the state back to initialized and throw away any
+ * remaining output.
+ */
+enum nzttces
+{
+ NZTTCES_CONTINUE = 1, /* Continue processing input */
+ NZTTCES_END, /* End processing input */
+ NZTTCES_RESET /* Reset processing and skip generating output */
+};
+typedef enum nzttces nzttces;
+
+/*
+ * Crypto Engine Functions
+ *
+ * List of crypto engine categories; used to index into protection
+ * vector.
+ */
+enum nzttcef
+{
+ NZTTCEF_DETACHEDSIGNATURE = 1, /* Signature, detached from content */
+ NZTTCEF_SIGNATURE, /* Signature combined with content */
+ NZTTCEF_ENVELOPING, /* Signature and encryption with content */
+ NZTTCEF_PKENCRYPTION, /* Encryption for one or more recipients */
+ NZTTCEF_ENCRYPTION, /* Symmetric encryption */
+ NZTTCEF_KEYEDHASH, /* Keyed hash/checkusm */
+ NZTTCEF_HASH, /* Hash/checsum */
+ NZTTCEF_RANDOM, /* Random byte generation */
+
+ NZTTCEF_LAST /* Used for array size */
+};
+typedef enum nzttcef nzttcef;
+
+/*
+ * State of the persona.
+ */
+enum nzttState
+{
+ NZTTSTATE_EMPTY = 0, /* is not in any state(senseless???) */
+ NZTTSTATE_REQUESTED, /* cert-request */
+ NZTTSTATE_READY, /* certificate */
+ NZTTSTATE_INVALID, /* certificate */
+ NZTTSTATE_RENEWAL /* renewal-requested */
+};
+typedef enum nzttState nzttState;
+
+/*
+ * Cert-version types
+ *
+ * This is used to quickly look-up the cert-type
+ */
+enum nzttVersion
+{
+ NZTTVERSION_X509v1 = 1, /* X.509v1 */
+ NZTTVERSION_X509v3, /* X.509v3 */
+#ifdef NZDEPRECATED
+ NZTTVERSION_SYMMETRIC, /* Symmetric */
+#endif
+ NZTTVERSION_INVALID_TYPE /* For Initialization */
+};
+typedef enum nzttVersion nzttVersion;
+
+/*
+ * Cipher Types
+ *
+ * List of all cryptographic algorithms, some of which may not be
+ * available.
+ */
+enum nzttCipherType
+{
+ NZTTCIPHERTYPE_RSA = 1, /* RSA public key */
+ NZTTCIPHERTYPE_DES, /* DES */
+ NZTTCIPHERTYPE_RC4, /* RC4 */
+ NZTTCIPHERTYPE_MD5DES, /* DES encrypted MD5 with salt (PBE) */
+ NZTTCIPHERTYPE_MD5RC2, /* RC2 encrypted MD5 with salt (PBE) */
+ NZTTCIPHERTYPE_MD5, /* MD5 */
+ NZTTCIPHERTYPE_SHA /* SHA */
+};
+typedef enum nzttCipherType nzttCipherType;
+
+/*
+ * TDU Formats
+ *
+ * List of possible toolkit data unit (TDU) formats. Depending on the
+ * function and cipher used some may be not be available.
+ */
+enum nztttdufmt
+{
+ NZTTTDUFMT_PKCS7 = 1, /* PKCS7 format */
+ NZTTTDUFMT_RSAPAD, /* RSA padded format */
+ NZTTTDUFMT_ORACLEv1, /* Oracle v1 format */
+ NZTTTDUFMT_LAST /* Used for array size */
+};
+typedef enum nztttdufmt nztttdufmt;
+
+/*
+ * Validate State
+ *
+ * Possible validation states an identity can be in.
+ */
+enum nzttValState
+{
+ NZTTVALSTATE_NONE = 1, /* Needs to be validated */
+ NZTTVALSTATE_GOOD, /* Validated */
+ NZTTVALSTATE_REVOKED /* Failed to validate */
+};
+typedef enum nzttValState nzttValState;
+
+/*
+ * Policy Fields <----NEW (09/14/98)
+ *
+ * Policies enforced
+ */
+enum nzttPolicy
+{
+ NZTTPOLICY_NONE = 0,
+ NZTTPOLICY_RETRY_1, /* number of retries for decryption = 1 */
+ NZTTPOLICY_RETRY_2, /* number of retries for decryption = 2 */
+ NZTTPOLICY_RETRY_3 /* number of retries for decryption = 3 */
+};
+typedef enum nzttPolicy nzttPolicy;
+
+/*
+ * Persona Usage <----NEW (09/14/98)
+ *
+ * what a persona will be used for?
+ */
+
+#ifdef NZDEPRECATED_MULTIPLECERTS
+enum nzttUsage
+{
+ NZTTUSAGE_NONE = 0,
+ NZTTUSAGE_SSL /* persona for SSL usage */
+};
+typedef enum nzttUsage nzttUsage;
+#endif
+
+/*
+ * Personas and identities have unique id's that are represented with
+ * 128 bits.
+ */
+typedef ub1 nzttID[16];
+
+/*
+ * Identity Types
+ *
+ * List of all Identity types..
+ */
+enum nzttIdentType
+{
+ NZTTIDENTITYTYPE_INVALID_TYPE = 0,
+ NZTTIDENTITYTYPE_CERTIFICTAE,
+ NZTTIDENTITYTYPE_CERT_REQ,
+ NZTTIDENTITYTYPE_RENEW_CERT_REQ,
+ NZTTIDENTITYTYPE_CLEAR_ETP,
+ NZTTIDENTITYTYPE_CLEAR_UTP,
+ NZTTIDENTITYTYPE_CLEAR_PTP
+};
+typedef enum nzttIdentType nzttIdentType;
+
+typedef ub4 nzttKPUsage;
+/* IF new types are added nztiMUS should be changed */
+#define NZTTKPUSAGE_NONE 0
+#define NZTTKPUSAGE_SSL 1
+#define NZTTKPUSAGE_SMIME_ENCR 2
+#define NZTTKPUSAGE_SMIME_SIGN 4
+#define NZTTKPUSAGE_CODE_SIGN 8
+#define NZTTKPUSAGE_CERT_SIGN 16
+#define NZTTKPUSAGE_INVALID_USE 0xffff
+
+
+/*
+ * Timestamp as 32 bit quantity in UTC.
+ */
+typedef ub1 nzttTStamp[4];
+
+/*
+ * Buffer Block
+ *
+ * A function that needs to fill (and possibly grow) an output buffer
+ * uses an output parameter block to describe each buffer.
+ *
+ * The flags_nzttBufferBlock member tells the function whether the
+ * buffer can be grown or not. If flags_nzttBufferBlock is 0, then
+ * the buffer will be realloc'ed automatically.
+ *
+ * The buflen_nzttBufferBLock member is set to the length of the
+ * buffer before the function is called and will be the length of the
+ * buffer when the function is finished. If buflen_nzttBufferBlock is
+ * 0, then the initial pointer stored in pobj_nzttBufferBlock is
+ * ignored.
+ *
+ * The objlen_nzttBufferBlock member is set to the length of the
+ * object stored in the buffer when the function is finished. If the
+ * initial buffer had a non-0 length, then it is possible that the
+ * object length is shorter than the buffer length.
+ *
+ * The pobj_nzttBufferBlock member is a pointer to the output object.
+ */
+struct nzttBufferBlock
+{
+# define NZT_NO_AUTO_REALLOC 0x1
+
+ uword flags_nzttBufferBlock; /* Flags */
+ ub4 buflen_nzttBufferBlock; /* Total length of buffer */
+ ub4 usedlen_nzttBufferBlock; /* Length of used buffer part */
+ ub1 *buffer_nzttBufferBlock; /* Pointer to buffer */
+};
+typedef struct nzttBufferBlock nzttBufferBlock;
+
+/*
+ * Wallet.
+ */
+struct nzttWallet
+{
+ ub1 *ldapName_nzttWallet; /* user's LDAP Name */
+ ub4 ldapNamelen_nzttWallet; /* len of user's LDAP Name */
+ nzttPolicy securePolicy_nzttWallet; /* secured-policy of the wallet */
+ nzttPolicy openPolicy_nzttWallet; /* open-policy of the wallet */
+ nzttPersona *persona_nzttWallet; /* List of personas in wallet */
+ nzttWalletPrivate *private_nzttWallet; /* Private wallet information */
+#ifdef NZDEPRECATED
+ ub4 npersona_nzttWallet; /* Number of personas */
+#endif
+};
+
+/*
+ * The wallet contains, one or more personas. A persona always
+ * contains its private key and its identity. It may also contain
+ * other 3rd party identites. All identities qualified with trust
+ * where the qualifier can indicate anything from untrusted to trusted
+ * for specific operations.
+ */
+
+/*
+ * Persona
+ *
+ * Structure containing information about a persona.
+ */
+struct nzttPersona
+{
+ ub1 *genericName_nzttPersona; /* user-friendly persona name */
+ ub4 genericNamelen_nzttPersona; /* persona-name length */
+ nzttPersonaPrivate *private_nzttPersona; /* Opaque part of persona */
+ nzttIdentity *mycertreqs_nzttPersona; /* My cert-requests */
+ nzttIdentity *mycerts_nzttPersona; /* My certificates */
+ nzttIdentity *mytps_nzttPersona; /* List of trusted identities */
+ nzssEntry *mystore_nzttPersona; /* List of secrets */
+ nzpkcs11_Info *mypkcs11Info_nzttPersona; /* PKCS11 token info */
+ struct nzttPersona *next_nzttPersona; /* Next persona */
+#ifdef NZDEPRECATED_MULTIPLECERTS
+ /* As Persona has multiple certs for different
+ usages, Persona Usage does not mean anything. Similarly
+ each key pair has its own state and Persona state itself
+ does not mean anything. - lk 5/31/00
+ */
+ nzttUsage usage_nzttPersona; /* persona usage; SSL/SET/.. */
+ nzttState state_nzttPersona; /* persona state-requested/ready */
+ ub4 ntps_nzttPersona; /* Num of trusted identities */
+#endif
+};
+
+/*
+ * Identity
+ *
+ * Structure containing information about an identity.
+ *
+ * NOTE
+ * -- the next_trustpoint field only applies to trusted identities and
+ * has no meaning (i.e. is NULL) for self identities.
+ */
+struct nzttIdentity
+{
+ text *dn_nzttIdentity; /* Alias */
+ ub4 dnlen_nzttIdentity; /* Length of alias */
+ text *comment_nzttIdentity; /* Comment */
+ ub4 commentlen_nzttIdentity; /* Length of comment */
+ nzttIdentityPrivate *private_nzttIdentity; /* Opaque part of identity */
+ nzttIdentity *next_nzttIdentity; /* next identity in list */
+};
+
+struct nzttB64Cert
+{
+ ub1 *b64Cert_nzttB64Cert;
+ ub4 b64Certlen_nzttB64Cert;
+ struct nzttB64Cert *next_nzttB64Cert;
+};
+typedef struct nzttB64Cert nzttB64Cert;
+
+
+struct nzttPKCS7ProtInfo
+{
+ nzttCipherType mictype_nzttPKCS7ProtInfo; /* Hash cipher */
+ nzttCipherType symmtype_nzttPKCS7ProtInfo; /* Symmetric cipher */
+ ub4 keylen_nzttPKCS7ProtInfo; /* Length of key to use */
+};
+typedef struct nzttPKCS7ProtInfo nzttPKCS7ProtInfo;
+
+/*
+ * Protection Information.
+ *
+ * Information specific to a type of protection.
+ */
+union nzttProtInfo
+{
+ nzttPKCS7ProtInfo pkcs7_nzttProtInfo;
+};
+typedef union nzttProtInfo nzttProtInfo;
+
+/*
+ * A description of a persona so that the toolkit can create one. A
+ * persona can be symmetric or asymmetric and both contain an
+ * identity. The identity for an asymmetric persona will be the
+ * certificate and the identity for the symmetric persona will be
+ * descriptive information about the persona. In either case, an
+ * identity will have been created before the persona is created.
+ *
+ * A persona can be stored separately from the wallet that references
+ * it. By default, a persona is stored with the wallet (it inherits
+ * with WRL used to open the wallet). If a WRL is specified, then it
+ * is used to store the actuall persona and the wallet will have a
+ * reference to it.
+ */
+struct nzttPersonaDesc
+{
+ ub4 privlen_nzttPersonaDesc; /* Length of private info (key)*/
+ ub1 *priv_nzttPersonaDesc; /* Private information */
+ ub4 prllen_nzttPersonaDesc; /* Length of PRL */
+ text *prl_nzttPersonaDesc; /* PRL for storage */
+ ub4 aliaslen_nzttPersonaDesc; /* Length of alias */
+ text *alias_nzttPersonaDesc; /* Alias */
+ ub4 longlen_nzttPersonaDesc; /* Length of longer description*/
+ text *long_nzttPersonaDesc; /* Longer persona description */
+};
+typedef struct nzttPersonaDesc nzttPersonaDesc;
+
+/*
+ * A description of an identity so that the toolkit can create one.
+ * Since an identity can be symmetric or asymmetric, the asymmetric
+ * identity information will not be used when a symmetric identity is
+ * created. This means the publen_nzttIdentityDesc and
+ * pub_nzttIdentityDesc members will not be used when creating a
+ * symmetric identity.
+ */
+struct nzttIdentityDesc
+{
+ ub4 publen_nzttIdentityDesc; /* Length of identity */
+ ub1 *pub_nzttIdentityDesc; /* Type specific identity */
+ ub4 dnlen_nzttIdentityDesc; /* Length of alias */
+ text *dn_nzttIdentityDesc; /* Alias */
+ ub4 longlen_nzttIdentityDesc; /* Length of longer description */
+ text *long_nzttIdentityDesc; /* Longer description */
+ ub4 quallen_nzttIdentityDesc; /* Length of trust qualifier */
+ text *trustqual_nzttIdentityDesc; /* Trust qualifier */
+};
+typedef struct nzttIdentityDesc nzttIdentityDesc;
+
+/********************************/
+/* PUBLIC FUNCTION DECLARATIONS */
+/********************************/
+
+/*---------------------- nztwOpenWallet ----------------------*/
+
+/*
+ * NAME
+ * nztwOpenWallet - Open a wallet based on a wallet Resource Locator (WRL).
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * wrllen {IN} Length of WRL.
+ * wrl {IN} WRL.
+ * pwdlen {IN} Length of password.
+ * pwd {IN} Password.
+ * wallet {IN/OUT} Initialized wallet structure.
+ *
+ * NOTES
+ * The syntax for a WRL is <Wallet Type>:<Wallet Type Parameters>.
+ *
+ * Wallet Type Wallet Type Parameters.
+ * ----------- ----------------------
+ * File Pathname (e.g. "file:/home/asriniva")
+ * Oracle Connect string (e.g. "oracle:scott/tiger at oss")
+ *
+ * There are also defaults. If the WRL is NZT_DEFAULT_WRL, then
+ * the platform specific WRL default is used. If only the wallet
+ * type is specified, then the WRL type specific default is used
+ * (e.g. "oracle:")
+ *
+ * There is an implication with Oracle that should be stated: An
+ * Oracle based wallet can be implemented in a user's private space
+ * or in world readable space.
+ *
+ * When the wallet is opened, the password is verified by hashing
+ * it and comparing against the password hash stored with the
+ * wallet. The list of personas (and their associated identities)
+ * is built and stored into the wallet structure.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_RIO_OPEN RIO could not open wallet (see network trace file).
+ * NZERROR_TK_PASSWORD Password verification failed.
+ * NZERROR_TK_WRLTYPE WRL type is not known.
+ * NZERROR_TK_WRLPARM WRL parm does not match type.
+ */
+#ifdef __STDC__
+nzerror nztwOpenWallet(nzctx *, ub4, text *, ub4, text *,
+ nzttWallet *);
+#else
+nzerror nztwOpenWallet(/*_ nzctx *, ub4, text *, ub4, text *,
+ nzttWallet * _*/);
+#endif /* __STDC __*/
+
+
+/*---------------------- nztwCloseWallet ----------------------*/
+
+/*
+ * NAME
+ * nztwCloseWallet - Close a wallet
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * wallet {IN/OUT} Wallet.
+ *
+ * NOTES
+ * Closing a wallet also closes all personas associated with that
+ * wallet. It does not cause a persona to automatically be saved
+ * if it has changed. The implication is that a persona can be
+ * modified by an application but if it is not explicitly saved it
+ * reverts back to what was in the wallet.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_RIO_CLOSE RIO could not close wallet (see network trace file).
+ */
+#ifdef __STDC__
+nzerror nztwCloseWallet(nzctx *, nzttWallet *);
+#else
+nzerror nztwCloseWallet(/*_ nzctx *, nzttWallet * _*/);
+#endif /* __STDC__ */
+
+/*--------------------nztwGetCertInfo----------------------------*/
+/****NOTE: This function is a temporary hack.****/
+/****DO NOT CALL. It will soon disappear.****/
+nzerror nztwGetCertInfo(/*_ nzctx *nz_context,
+ nzosContext *nzosCtx,
+ nzttWallet *walletRef,
+ void *peerCert _*/);
+
+
+/*------------------------ nztwConstructWallet -----------------------*/
+/*
+ *
+ * nzerror nztwConstructWallet( nzctx *oss_context,
+ * nzttPolicy openPolicy,
+ * nzttPolicy securePolicy,
+ * ub1 *ldapName,
+ * ub4 ldapNamelen,
+ * nzstrc *wrl,
+ * nzttPersona *personas,
+ * nzttWallet **wallet );
+ */
+
+/*---------------------- nztwRetrievePersonaCopy ----------------------*/
+
+/*
+ * NAME
+ * nztwRetrievePersonaCopy - Retrieves a persona based from wallet
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * wallet {IN} Wallet.
+ * index {IN} Which wallet index to remove (first persona is zero).
+ * persona {OUT} Persona found.
+ *
+ * NOTES
+ * Retrieves a persona from the wallet based on the index number passed
+ * in. This persona is a COPY of the one stored in the wallet, therefore
+ * it is perfectly fine for the wallet to be closed after this call is
+ * made.
+ *
+ * The caller is responsible for disposing of the persona when completed.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nztwRetrievePersonaCopy(nzctx *, nzttWallet *, ub4, nzttPersona **);
+#else
+nzerror nztwRetrievePersonaCopy(/*_ nzctx *, nzttWallet *, ub4,
+ nzttPersona ** _*/);
+#endif /* __STDC __*/
+
+
+/*---------------------- nztwRetrievePersonaCopyByName ----------------------*/
+
+/*
+ * NAME
+ * nztwRetrievePersonaCopyByName - Retrieves a persona based on its name.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * wallet {IN} Wallet.
+ * name {IN} Name of the persona
+ * persona {OUT} Persona found.
+ *
+ * NOTES
+ * Retrieves a persona from the wallet based on the name of the persona.
+ * This persona is a COPY of the one stored in the wallet, therefore
+ * it is perfectly fine for the wallet to be closed after this call is
+ * made.
+ *
+ * The caller is responsible for disposing of the persona when completed.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nztwRetrievePersonaCopyByName(nzctx *, nzttWallet *,
+ char *, nzttPersona **);
+#else
+nzerror nztwRetrievePersonaCopyByName(/*_ nzctx *, nzttWallet *, char *,
+ nzttPersona ** _*/);
+#endif /* __STDC __*/
+
+/*---------------------- nzteOpenPersona ----------------------*/
+
+/*
+ * NAME
+ * nzteOpenPersona - Open a persona.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN/OUT} Persona.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_PASSWORD Password failed to decrypt persona.
+ * NZERROR_TK_BADPRL Persona resource locator did not work.
+ * NZERROR_RIO_OPEN Could not open persona (see network trace file).
+ */
+#ifdef __STDC__
+nzerror nzteOpenPersona(nzctx *, nzttPersona *);
+#else
+nzerror nzteOpenPersona(/*_ nzctx *, nzttPersona * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteClosePersona ---------------------*/
+
+/*
+ * NAME
+ * nzteClosePersona - Close a persona.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN/OUT} Persona.
+ *
+ * NOTES
+ * Closing a persona does not store the persona, it simply releases
+ * the memory associated with the crypto engine.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nzteClosePersona(nzctx *, nzttPersona *);
+#else
+nzerror nzteClosePersona(/*_ nzctx *, nzttPersona * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteDestroyPersona ---------------------*/
+
+/*
+ * NAME
+ * nzteDestroyPersona - Destroy a persona.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN/OUT} Persona.
+ *
+ * NOTES
+ * The persona is destroyd in the open state, but it will
+ * not be associated with a wallet.
+ *
+ * The persona parameter is doubly indirect so that at the
+ * conclusion of the function, the pointer can be set to NULL.
+ *
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_TYPE Unsupported itype/ctype combination.
+ * NZERROR_TK_PARMS Error in persona description.
+ */
+#ifdef __STDC__
+nzerror nzteDestroyPersona(nzctx *, nzttPersona **);
+#else
+nzerror nzteDestroyPersona(/*_ nzctx *, nzttPersona ** _*/);
+#endif /* __STDC __*/
+
+/*---------------------- nzteRetrieveTrustedIdentCopy ----------------------*/
+
+/*
+ * NAME
+ * nzteRetrieveTrustedIdentCopy - Retrieves a trusted identity from persona
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * index {IN} Which wallet index to remove (first element is zero).
+ * identity {OUT} Trusted Identity from this persona.
+ *
+ * NOTES
+ * Retrieves a trusted identity from the persona based on the index
+ * number passed in. This identity is a COPY of the one stored in
+ * the persona, therefore it is perfectly fine to close the persona
+ * after this call is made.
+ *
+ * The caller is responsible for freeing the memory of this object
+ * by calling nztiAbortIdentity it is no longer needed
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nzteRetrieveTrustedIdentCopy(nzctx *, nzttPersona *, ub4,
+ nzttIdentity **);
+#else
+nzerror nzteRetrieveTrustedIdentCopy(/*_ nzctx *, nzttPersona *, ub4,
+ nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nztePriKey ---------------------*/
+
+/*
+ * NAME
+ * nztePriKey - Get the decrypted Private Key for the Persona
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * vkey {OUT} Private Key [B_KEY_OBJ]
+ * vkey_len {OUT} Private Key Length
+ *
+ * NOTES
+ * This funiction will only work for X.509 based persona which contain
+ * a private key.
+ * A copy of the private key is returned to the caller so that they do not
+ * have to worry about the key changeing "underneath them".
+ * Memory will be allocated for the vkey and therefore, the CALLER
+ * will be responsible for freeing this memory.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_NO_MEMORY ossctx is null.
+ * NZERROR_TK_BADPRL Persona resource locator did not work.
+ */
+#ifdef __STDC__
+nzerror nztePriKey(nzctx *, nzttPersona *, ub1 **, ub4 *);
+#else
+nzerror nztePriKey(/*_ nzctx *, nzttPersona *, ub1 **, ub4 * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteMyCert ---------------------*/
+
+/*
+ * NAME
+ * nzteMyCert - Get the X.509 Certificate for a persona
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * cert {OUT} X.509 Certificate [BER encoded]
+ * cert_len {OUT} Certificate length
+ *
+ * NOTES
+ * This funiction will only work for X.509 based persona which contain
+ * a certificate for the self identity.
+ * A copy of the certificate is returned to the caller so that they do not
+ * have to worry about the certificate changeing "underneath them".
+ * Memory will be allocated for the cert and therefore, the CALLER
+ * will be responsible for freeing this memory.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_NO_MEMORY ossctx is null.
+ */
+#ifdef __STDC__
+nzerror nzteMyCert(nzctx *, nzttPersona *, ub1 **, ub4 *);
+#else
+nzerror nzteMyCert(/*_ nzctx *, nzttPersona *, ub1 **, ub4 * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteX509CreatePersona ---------------------*/
+
+/*
+ * NAME
+ * nzteX509CreatePersona - Given a BER X.509 cert, create a persona
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * cert {IN} X.509 Certificate [BER encoded]
+ * cert_len {IN} Certificate length
+ * persona {OUT} Persona.
+ *
+ * NOTES
+ * Memory will be allocated for the persona and therefore, the CALLER
+ * will be responsible for freeing this memory.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_NO_MEMORY ossctx is null.
+ */
+#ifdef __STDC__
+nzerror nzteX509CreatePersona(nzctx *, ub1 *, ub4, nzttPersona **);
+#else
+nzerror nzteX509CreatePersona(/*_ nzctx *, ub1 *, ub4, nzttPersona ** _*/);
+#endif /* __STDC __*/
+
+/*-------------------- nztiCreateIdentity --------------------*/
+
+/*
+ * NAME
+ * nztiCreateIdentity - Create an identity.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * itype {IN} Identity type.
+ * desc {IN} Description of identity.
+ * identity {IN/OUT} Identity.
+ *
+ * NOTES
+ * Memory is only allocated for the identity structure. The elements in
+ * the description struct are not copied. Rather their pointers are copied
+ * into the identity structure. Therefore, the caller should not free
+ * the elements referenced by the desc. These elements will be freed
+ * when the nztiDestroyIdentity is called.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_PARMS Error in description.
+ */
+#ifdef __STDC__
+nzerror nztiCreateIdentity(nzctx *, nzttVersion, nzttIdentityDesc *,
+ nzttIdentity **);
+#else
+nzerror nztiCreateIdentity(/*_ nzctx *, nzttVersion, nzttIdentityDesc *,
+ nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+#ifdef NZ_OLD_TOOLS
+/*-------------------- nztiDuplicateIdentity --------------------*/
+
+/*
+ * NAME
+ * nztiDuplicateIdentity - Duplicate an identity.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * identity {IN} Target Identity.
+ * new_identity {IN} New Identity.
+ *
+ * NOTES
+ * Memory for the identity is allocated inside the function, and all
+ * internal identity elements as well.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_NOTFOUND Identity not found.
+ * NZERROR_PARMS Error in description.
+ */
+#ifdef __STDC__
+nzerror nztiDuplicateIdentity(nzctx *, nzttIdentity *,
+ nzttIdentity **);
+#else
+nzerror nztiDuplicateIdentity(/*_ nzctx *, nzttIdentity *,
+ nzttIdentity ** _*/);
+#endif /* __STDC __*/
+#endif /* NZ_OLD_TOOLS */
+
+/*--------------------- nztiAbortIdentity ---------------------*/
+
+/*
+ * NAME
+ * nztiAbortIdentity - Abort an unassociated identity.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * identity {IN/OUT} Identity.
+ *
+ * NOTES
+ * It is an error to try to abort an identity that can be
+ * referenced through a persona.
+ *
+ * The identity pointer is set to NULL at the conclusion.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_CANTABORT Identity is associated with persona.
+ */
+#ifdef __STDC__
+nzerror nztiAbortIdentity(nzctx *, nzttIdentity **);
+#else
+nzerror nztiAbortIdentity(/*_ nzctx *, nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+#ifdef NZ_OLD_TOOLS
+/*----------------- nztidGetIdentityDesc -----------------*/
+
+/*
+ * NAME
+ * nztidGetIdentityDesc - Gets an Identity Description from the identity
+ *
+ * PARAMETERS
+ * osscntxt {IN} Success.
+ * identity {IN} Identity.
+ * description {IN/OUT} Identity Description.
+ *
+ * NOTES
+ * Memory is allocated for the Identity Description. It
+ * is the callers responsibility to free this memory by calling
+ * nztiFreeIdentityDesc.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nztidGetIdentityDesc(nzctx *, nzttIdentity *,
+ nzttIdentityDesc **);
+#else
+nzerror nztidGetIdentityDesc(/*_ nzctx *, nzttIdentity *,
+ nzttIdentityDesc ** _*/);
+#endif /* __STDC __*/
+
+/*----------------- nztidFreeIdentityDesc -----------------*/
+
+/*
+ * NAME
+ * nztidFreeIdentityDesc - Frees memory for Identity Desc object.
+ *
+ * PARAMETERS
+ * osscntxt {IN} oss context.
+ * description {IN/OUT} Identity Description.
+ *
+ * NOTES
+ * Memory is freed for all Identity description elements. Pointer is
+ * then set to null.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nztidFreeIdentityDesc(nzctx *, nzttIdentityDesc **);
+#else
+nzerror nztidFreeIdentityDesc(/*_ nzctx *, nzttIdentityDesc ** _*/);
+#endif /* __STDC __*/
+#endif /* NZ_OLD_TOOLS */
+
+/*---------------- nztific_FreeIdentityContent ----------------*/
+
+/*
+ * NAME
+ * nztific_FreeIdentityContent - free the contents of an identity.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * identity {IN/OUT} freed identity
+ *
+ * NOTES
+ * Free a created identity.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+/*
+ * Free the identity content.
+ */
+#ifdef __STDC__
+nzerror nztific_FreeIdentityContent(nzctx *ossctx,
+ nzttIdentity *identity);
+#else
+nzerror nztific_FreeIdentityContent(/*_ nzctx *ossctx,
+ nzttIdentity *identity _*/);
+#endif /* __STDC __*/
+
+
+/*-------------------------- nztSign --------------------------*/
+
+/*
+ * NAME
+ * nztSign - Create an attached signature.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Open persona acting as signer.
+ * state {IN} State of signature.
+ * inlen {IN} Length of this input part.
+ * in {IN} This input part.
+ * tdubuf {IN/OUT} TDU buffer.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_CANTGROW Needed to grow output buffer but could not.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztSign(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock *);
+#else
+nzerror nztSign(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*------------------------- nztVerify -------------------------*/
+
+/*
+ * NAME
+ * nztVerify - Verify an attached signature.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * state {IN} State of verification.
+ * intdulen {IN} TDU length.
+ * intdu {IN} TDU.
+ * out {IN/OUT} Extracted message.
+ * verified {OUT} TRUE if signature verified.
+ * validated{OUT} TRUE if signing identity validated.
+ * identity {OUT} Identity of signing party.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_CANTGROW Needed to grow outptu buffer but could not.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztVerify(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock *, boolean *, boolean *,
+ nzttIdentity **);
+#else
+nzerror nztVerify(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock *, boolean *, boolean *,
+ nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+/*------------------------ nztValidate ------------------------*/
+
+/*
+ * NAME
+ * nztValidate - Validate an identity.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * identity {IN} Identity.
+ * validated{OUT} TRUE if identity was validated.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztValidate(nzctx *, nzttPersona *, nzttIdentity *, boolean *);
+#else
+nzerror nztValidate(/*_ nzctx *, nzttPersona *, nzttIdentity *, boolean * _*/);
+#endif /* __STDC __*/
+
+/*-------------------- nztsd_SignDetached --------------------*/
+
+/*
+ * NAME
+ * nztsd_SignDetached - Generate a detached signature.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * state {IN} State of signature.
+ * inlen {IN} Length of this input part.
+ * in {IN} This input part.
+ * tdubuf {IN/OUT} TDU buffer.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_CANTGROW Needed to grow output buffer but could not.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztsd_SignDetached(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock *);
+#else
+nzerror nztsd_SignDetached(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*------------------- nztved_VerifyDetached -------------------*/
+
+/*
+ * NAME
+ * nztved_VerifyDetached - Verify a detached signature.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * state {IN} State of verification.
+ * inlen {IN} Length of data.
+ * in {IN} Data.
+ * intdulen {IN} Input TDU length.
+ * tdu {IN} Input TDU.
+ * verified {OUT} TRUE if signature verified.
+ * validated{OUT} TRUE if signing identity validated.
+ * identity {OUT} Identity of signing party.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztved_VerifyDetached(nzctx *, nzttPersona *, nzttces, ub4,
+ ub1 *, ub4, ub1 *, boolean *, boolean *,
+ nzttIdentity **);
+#else
+nzerror nztved_VerifyDetached(/*_ nzctx *, nzttPersona *, nzttces, ub4,
+ ub1 *, ub4, ub1 *, boolean *, boolean *,
+ nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nztkec_PKEncrypt ---------------------*/
+
+/*
+ * NAME
+ * nztkec_PKEncrypt - Encrypt data symmetrically, encrypt key asymmetrically
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * nrecipients {IN} Number of recipients for this encryption.
+ * recipients {IN} List of recipients.
+ * state {IN} State of encryption.
+ * inlen {IN} Length of this input part.
+ * in {IN} This input part.
+ * tdubuf {IN/OUT} TDU buffer.
+ *
+ * NOTES
+ * There is a limitation of 1 recipient (nrecipients = 1) at this
+ * time.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_CANTGROW Needed to grow output buffer but could not.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztkec_PKEncrypt(nzctx *, nzttPersona *, ub4, nzttIdentity *,
+ nzttces, ub4, ub1 *, nzttBufferBlock *);
+#else
+nzerror nztkec_PKEncrypt(/*_ nzctx *, nzttPersona *, ub4, nzttIdentity *,
+ nzttces, ub4, ub1 *, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*---------------- nztxkec_PKEncryptExpansion ----------------*/
+
+/*
+ * NAME
+ * nztxkec_PKEncryptExpansion - Determine the buffer needed for PKEncrypt
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * nrecipients {IN} Number of recipients.
+ * inlen {IN} Length of input.
+ * tdulen {out} Length of buffer need.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztxkec_PKEncryptExpansion(nzctx *, nzttPersona *, ub4, ub4,
+ ub4 *);
+#else
+nzerror nztxkec_PKEncryptExpansion(/*_ nzctx *, nzttPersona *, ub4, ub4,
+ ub4 * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nztkdc_PKDecrypt ---------------------*/
+
+/*
+ * NAME
+ * nztkdc_PKDecrypt - Decrypt a PKEncrypted message.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * state {IN} State of encryption.
+ * inlen {IN} Length of this input part.
+ * in {IN} This input part.
+ * tdubuf {IN/OUT} TDU buffer.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_CANTGROW Needed to grow output buffer but could not.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztkdc_PKDecrypt(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock *);
+#else
+nzerror nztkdc_PKDecrypt(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*-------------------------- nztHash --------------------------*/
+
+/*
+ * NAME
+ * nztHash - Generate a hash.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * state {IN} State of hash.
+ * inlen {IN} Length of this input.
+ * in {IN} This input.
+ * tdu {IN/OUT} Output tdu.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_CANTGROW Needed to grow TDU buffer but could not.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztHash(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock *);
+#else
+nzerror nztHash(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*----------------------- nztSeedRandom -----------------------*/
+
+/*
+ * NAME
+ * nztSeedRandom - Seed the random function
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * seedlen {IN} Length of seed.
+ * seed {IN} Seed.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztSeedRandom(nzctx *, nzttPersona *, ub4, ub1 *);
+#else
+nzerror nztSeedRandom(/*_ nzctx *, nzttPersona *, ub4, ub1 * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nztrb_RandomBytes ---------------------*/
+
+/*
+ * NAME
+ * nztrb_RandomBytes - Generate a buffer random bytes.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * nbytes {IN} Number of bytes desired.
+ * out {IN/OUT} Buffer block for bytes.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_CANTGROW Needed to grow TDU buffer but could not.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztrb_RandomBytes(nzctx *, nzttPersona *, ub4,
+ nzttBufferBlock *);
+#else
+nzerror nztrb_RandomBytes(/*_ nzctx *, nzttPersona *, ub4,
+ nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*-------------------- nztrn_RandomNumber --------------------*/
+
+/*
+ * NAME
+ * nztrn_RandomNumber - Generate a random number
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * num {OUT} Number.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztrn_RandomNumber(nzctx *, nzttPersona *, uword *);
+#else
+nzerror nztrn_RandomNumber(/*_ nzctx *, nzttPersona *, uword * _*/);
+#endif /* __STDC __*/
+
+/*---------------------- nztbbInitBlock ----------------------*/
+
+/*
+ * NAME
+ * nztbbInitBlock - Initialize a buffer block.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * block {IN/OUT} Buffer block.
+ *
+ * NOTES
+ * The buffer block is initialized to be empty (all members are set
+ * to 0/NULL). Such a block will be allocated memory as needed.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nztbbInitBlock(nzctx *, nzttBufferBlock *);
+#else
+nzerror nztbbInitBlock(/*_ nzctx *, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*---------------------- nztbbReuseBlock ----------------------*/
+
+/*
+ * NAME
+ * nztbbReuseBlock - Reuse an already initialized and possibly used block.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * block {IN/OUT} Buffer block.
+ *
+ * NOTES
+ * This function simply sets the used length member of the buffer
+ * block to 0. If the block already has memory allocated to it,
+ * this will cause it to be reused.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nztbbReuseBlock(nzctx *, nzttBufferBlock *);
+#else
+nzerror nztbbReuseBlock(/*_ nzctx *, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*---------------------- nztbbSizeBlock ----------------------*/
+
+/*
+ * NAME
+ * nztbbSizeBlock - Size an initialized block to a particular size.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * len {IN} Minimum number of unused bytes desired.
+ * block {IN/OUT} Buffer block.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nztbbSizeBlock(nzctx *, ub4, nzttBufferBlock *);
+#else
+nzerror nztbbSizeBlock(/*_ nzctx *, ub4, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*----------------------- nztbbGrowBlock -----------------------*/
+
+/*
+ * NAME
+ * nzbbGrowBlock - Increase the size of the buffer block.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * inc {IN} Number of bytes to increase.
+ * block {IN/OUT} Buffer block.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nztbbGrowBlock(nzctx *, ub4, nzttBufferBlock *);
+#else
+nzerror nztbbGrowBlock(/*_ nzctx *, ub4, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*---------------------- nztbbPurgeBlock ----------------------*/
+
+/*
+ * NAME
+ * nztbbPurgeBlock - Purge a buffer block of its memory.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * block {IN/OUT} Buffer block.
+ *
+ * NOTES
+ * The memory used by the buffer block as the buffer is released.
+ * The buffer block itself is not affected.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nztbbPurgeBlock(nzctx *, nzttBufferBlock *);
+#else
+nzerror nztbbPurgeBlock(/*_ nzctx *, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*----------------------- nztbbSetBlock -----------------------*/
+
+/*
+ * NAME
+ * nztbbSetBlock - Set a buffer block to a known state.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * flags {IN} Flags to set.
+ * buflen {IN} Length of buffer.
+ * usedlen {IN} Used length.
+ * buffer {IN} Buffer.
+ * block {IN/OUT} Buffer block
+ *
+ * NOTES
+ * If buflen > 0, objlen == 0, and obj == NULL, then buflen bytes
+ * of memory is allocated and a pointer is stored in the buffer
+ * block.
+ *
+ * The buffer parameter remains unchanged.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nztbbSetBlock(nzctx *, uword, ub4, ub4, ub1 *,
+ nzttBufferBlock *);
+#else
+nzerror nztbbSetBlock(/*_ nzctx *, uword, ub4, ub4, ub1 *,
+ nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+
+/*--------------------- nztiGetSecInfo ---------------------*/
+
+/*
+ * NAME
+ * nztiGetSecInfo - Get some security information for SSL
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ * persona {IN} persona
+ * dname {OUT} distinguished name of the certificate
+ * dnamelen {OUT} length of the distinguished name
+ * issuername {OUT} issuer name of the certificate
+ * certhash {OUT} SHA1 hash of the certificate
+ * certhashlen{OUT} length of the hash
+ * NOTES
+ * This function allocate memories for issuername, certhash, and dname.
+ * To deallocate memory for those params, you should call nztdbuf_DestroyBuf.
+ * RETURNS
+ *
+ */
+#ifdef __STDC__
+nzerror nztiGetSecInfo(nzctx *, nzttPersona *, text **, ub4 *,
+ text **, ub4 *, ub1 **, ub4 *);
+#else
+nzerror nztiGetSecInfo(/*_ nzctx *, nzttPersona *, text **, ub4 *,
+ text **, ub4 *, ub1 **, ub4 * _*/);
+#endif /* __STDC__ */
+
+
+/*---------------------- nztiGetDName ----------------------*/
+
+/*
+ * NAME
+ * nztiGetDName - Get the distinguished name for the given identity
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ * identity {IN} identity need to get dname from
+ * dn {OUT} distinguished name
+ * dnlen {OUT} length of the dname
+ *
+ * NOTES
+ *
+ * RETURNS
+ *
+ */
+
+#ifdef __STDC__
+nzerror nztiGetDName(nzctx *, nzttIdentity *,
+ text **, ub4 *);
+#else
+nzerror nztiGetDName(/*_ nzctx *, nzttIdentity *,
+ text **, ub4 * _*/);
+#endif /* __STDC__ */
+
+/*------------------- nztiGetIssuerName -------------------*/
+
+/*
+ * NAME
+ * nztiGetIssuerName - Get IssuerName for the given identity
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ * identity {IN} identity need to get issuername from
+ * issuername {OUT} issuer's name
+ * issuernamelen {OUT} length of the issuer's name
+ *
+ * NOTES
+ *
+ * RETURNS
+ *
+ */
+#ifdef __STDC__
+nzerror nztiGetIssuerName(nzctx *, nzttIdentity *,
+ text **, ub4 *);
+#else
+nzerror nztiGetIssuerName(/*_ nzctx *, nzttIdentity *,
+ text **, ub4 * _*/);
+#endif /* __STDC__ */
+
+
+/*-------------------- nztgch_GetCertHash --------------------*/
+
+/*
+ * NAME
+ * nztgch_GetCertHash - Get SHA1 hash for the certificate of the identity
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ * identity {IN} identity need to get issuername from
+ * certHash {OUT} certHash buffer
+ * hashLen {OUT} length of the certHash
+ *
+ * NOTES
+ * Need to call nztdbuf_DestroyBuf to deallocate memory for certHash.
+ * RETURNS
+ *
+ */
+#ifdef __STDC__
+nzerror nztgch_GetCertHash(nzctx *, nzttIdentity *,
+ ub1 **, ub4 *);
+#else
+nzerror nztgch_GetCertHash(/*_ nzctx *, nzttIdentity *,
+ ub1 **, ub4 * _*/);
+#endif /* __STDC__ */
+
+/*-------------------- nztdbuf_DestroyBuf --------------------*/
+
+/*
+ * NAME
+ * nztdbuf_DestroyBuf - Deallocation funtions for ub1 and text buffer
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ * buf {IN} Allocated buffer to be destroyed.
+ *
+ * NOTES
+ *
+ * RETURNS
+ *
+ */
+#ifdef __STDC__
+nzerror nztdbuf_DestroyBuf( nzctx *, dvoid **);
+#else
+nzerror nztdbuf_DestroyBuf(/*_ nzctx *, dvoid ** _*/);
+#endif /* __STDC__ */
+
+
+/*----------------------- nztGetCertChain -----------------------*/
+
+/*
+ * NAME
+ * nztGetCertChain -
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ *
+ * NOTES
+ *
+ * RETURNS
+ *
+ */
+#ifdef __STDC__
+nzerror nztGetCertChain(nzctx *, nzttWallet * );
+#else
+nzerror nztGetCertChain(/*_ nzctx *, nzttWallet _*/);
+#endif /* __STDC__ */
+
+/*----------------------- nztCompareDN -----------------------*/
+
+/*
+ * NAME
+ * nztCompareDN -
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ * dn1 {IN} distinguished name 1
+ * dn2 {IN} distinguished name 2
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK succeeded
+ * others failed
+ *
+ */
+#ifdef __STDC__
+nzerror nztCompareDN(nzctx *, ub1 *, ub4, ub1 *, ub4, boolean * );
+#else
+nzerror nztCompareDN(/*_ nzctx *, ub1 *,ub4 , ub1 *, ub4, boolean * _*/);
+#endif/* __STDC__ */
+
+
+#ifdef NZ_OLD_TOOLS
+/*--------------------- nztIdentityAlloc ---------------------*/
+
+/*
+ * NAME
+ * nztIdentityAlloc - Allocate memory for nzttIdentity context
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ * identity {OUT} nzttIdentity context
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK succeeded
+ * others failed
+ *
+ */
+#ifdef __STDC__
+nzerror nztIdentityAlloc(nzctx *, nzttIdentity **);
+#else
+nzerror nztIdentityAlloc(/*_ nzctx *, nzttIdentity ** _*/);
+#endif/* __STDC__ */
+
+/*--------------------- nztIPrivateAlloc ---------------------*/
+
+/*
+ * NAME
+ * nztIPrivateAlloc - Allocate memory for nzttIdentityPrivate
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ *
+ * osscntxt {IN} OSS context.
+ * ipriv {OUT} identityPrivate structure
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK succeeded
+ * others failed
+ *
+ */
+
+#ifdef __STDC__
+nzerror nztIPrivateAlloc( nzctx *, nzttIdentityPrivate **);
+#else
+nzerror nztIPrivateAlloc( nzctx *, nzttIdentityPrivate **);
+#endif /* __STDC__ */
+
+
+/*---------------------- nztIDupContent ----------------------*/
+
+/*
+ * NAME
+ * nztIDupContent -
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ * targetIdentity{OUT} target identity
+ * sourceIdentity {IN} source identity
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK succeeded
+ * others failed
+ *
+ */
+
+#ifdef __STDC__
+nzerror nztIDupContent( nzctx *, nzttIdentity *, nzttIdentity *);
+#else
+nzerror nztIDupContent(/*_ nzctx *, nzttIdentity *, nzttIdentity * _*/);
+#endif
+/*---------------------- nztIPDuplicate ----------------------*/
+
+/*
+ * NAME
+ * nztIPDuplicate -
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ * target_ipriv {OUT} target identityPrivate
+ * source_ipriv {IN} source identityPrivate
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK succeeded
+ * others failed
+ *
+ */
+#ifdef __STDC__
+nzerror nztIPDuplicate( nzctx *, nzttIdentityPrivate **,
+ nzttIdentityPrivate *);
+#else
+nzerror nztIPDuplicate(/*_ nzctx *, nzttIdentityPrivate **,
+ nzttIdentityPrivate * _*/);
+#endif /* __STDC__ */
+
+/*--------------------- nztiDupIdentList ---------------------*/
+
+/*
+ * NAME
+ * nztiDupIdentList -
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ * source_identities {IN} source identity list
+ * numIdent {OUT} number of identity in the list
+ * ppidentity {OUT} Target of identity
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK succeeded
+ * others failed
+ *
+ */
+#ifdef __STDC__
+nzerror nztiDupIdentList( nzctx *, nzttIdentity *, ub4 *,
+ nzttIdentity **);
+#else
+
+nzerror nztiDupIdentList(/*_ nzctx *, nzttIdentity *, ub4 *,
+ nzttIdentity ** _*/);
+#endif
+
+/*--------------------- nztFreeIdentList ---------------------*/
+
+/*
+ * NAME
+ * nztFreeIdentList - Free memory for a list of Identities
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ * identity {IN} identity context
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK succeeded
+ * others failed
+ *
+ */
+#ifdef __STDC__
+nzerror nztFreeIdentList( nzctx *, nzttIdentity **);
+#else
+nzerror nztFreeIdentList(/*_ nzctx *, nzttIdentity ** _*/);
+#endif
+#endif /* NZ_OLD_TOOLS */
+
+/*--------------------- nztCheckVaLidity ---------------------*/
+
+/*
+ * NAME
+ * nztCheckVaLidity - Check the validity of certificate
+ *
+ * PARAMETERS
+ * Name {IN/OUT} Description
+ * osscntxt {IN} OSS context.
+ * start_time Start time of the certificate
+ * end_time End time of the certificate
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK succeeded
+ * others failed
+ *
+ */
+#ifdef __STDC__
+nzerror nztCheckValidity( nzctx *, ub4 , ub4 );
+#else
+nzerror nztCheckValidity(/*_ nzctx *, ub4 , ub4 _*/);
+#endif
+
+/*--------------------- nztwCreateWallet ---------------------*/
+
+/*
+ * NAME
+ * nztwCreateWallet - Create a new wallet.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * wrllen {IN} Length of wallet resource locator.
+ * wrl {IN} WRL.
+ * pwdlen {IN} Length of password (see notes below).
+ * pwd {IN} Password.
+ * wallet {IN/OUT} Wallet.
+ *
+ * NOTES
+ * It is an error to try to create a wallet that already exists.
+ * The previously existing wallet must be destroyed first.
+ *
+ * The wallet itself is not encrypted. Rather, all the personas in
+ * the wallet are encrypted under the same password. A hash of the
+ * password is stored in the wallet.
+ *
+ * Upon success, an empty open wallet is stored in the wallet
+ * parameter.
+ *
+ * RETURNS
+ * NZERROR_OK Sucess.
+ * NZERROR_TK_WALLET_EXISTS Wallet already exists.
+ * NZERROR_RIO_OPEN RIO could not create wallet (see trace file).
+ */
+#ifdef __STDC__
+nzerror nztwCreateWallet(nzctx *, ub4, text *, ub4, text *,
+ nzttWallet *);
+#else
+nzerror nztwCreateWallet(/*_ nzctx *, ub4, text *, ub4, text *,
+ nzttWallet * _*/);
+#endif /* __STDC__ */
+
+
+/*--------------------- nztwDestroyWallet ---------------------*/
+
+/*
+ * NAME
+ * nztwDestroyWallet - Destroy an existing wallet.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * wrllen {IN} Length of wallet resource locator.
+ * wrl {IN} WRL.
+ * pwdlen {IN} Length of password.
+ * pwd {IN} Password.
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_PASSWORD Password verification failed.
+ * NZERROR_RIO_OPEN RIO could not open wallet (see trace file).
+ * NZERROR_RIO_DELETE Delete failed (see trace file).
+ */
+#ifdef __STDC__
+nzerror nztwDestroyWallet(nzctx *, ub4, text *, ub4, text *);
+#else
+nzerror nztwDestroyWallet(/*_ nzctx *, ub4, text *, ub4, text * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteStorePersona ---------------------*/
+
+/*
+ * NAME
+ * nzteStorePersona - Store an open persona in a wallet.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN/OUT} Persona.
+ * wallet {IN/OUT} Wallet.
+ *
+ * NOTES
+ * If the open persona is not associated with any wallet (it was
+ * created via the nzteClosePersona function), then storing the
+ * persona creates that association. The wallet will also have an
+ * updated persona list that reflects this association.
+ *
+ * If the open persona was associated with wallet 'A' (it was
+ * opened via the nztwOpenWallet function), and is stored back into
+ * wallet 'A', then then the old persona is overwritten by the new
+ * persona if the password can be verified. Recall that all
+ * personas have a unique identity id. If that id changes then
+ * storing the persona will put a new persona in the wallet.
+ *
+ * If the open persona was associated with wallet 'A' and is stored
+ * into wallet 'B', and if wallet 'B' does not contain a persona
+ * with that unique identity id, then the persona will be copied
+ * into wallet 'B', wallet 'B''s persona list will be updated, and
+ * the persona structure will be updated to be associated with
+ * wallet 'B'. If wallet 'B' already contained the persona, it
+ * would be overwritten by the new persona.
+ *
+ * The persona parameter is doubly indirect so that at the
+ * conclusion of the function call, the pointer can be directed to
+ * the persona in the wallet.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_PASSWORD Password verification failed.
+ * NZERROR_RIO_STORE Store failed (see network trace file).
+ */
+#ifdef __STDC__
+nzerror nzteStorePersona(nzctx *, nzttPersona **, nzttWallet *);
+#else
+nzerror nzteStorePersona(/*_ nzctx *, nzttPersona **, nzttWallet * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteRemovePersona ---------------------*/
+
+/*
+ * NAME
+ * nzteRemovePersona - Remove a persona from the wallet.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN/OUT} Persona.
+ *
+ * NOTES
+ * The password is verified before trying to remove the persona.
+ *
+ * If the persona is open, it is closed. The persona is removed
+ * from the wallet list and the persona pointer is set to NULL.
+ *
+ * A double indirect pointer to the persona is required so that the
+ * persona pointer can be set to NULL upon completion.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_PASSWORD Password verification failed.
+ * NZERROR_RIO_DELETE Delete failed.
+ */
+#ifdef __STDC__
+nzerror nzteRemovePersona(nzctx *, nzttPersona **);
+#else
+nzerror nzteRemovePersona(/*_ nzctx *, nzttPersona ** _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteCreatePersona ---------------------*/
+
+/*
+ * NAME
+ * nzteCreatePersona - Create a persona.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * itype {IN} Identity type.
+ * ctype {IN} Cipher type.
+ * desc {IN} Persona description.
+ * persona {OUT} Persona.
+ *
+ * NOTES
+ * The resulting persona is created in the open state, but it will
+ * not be associated with a wallet.
+ *
+ * The memory for the persona is allocated by the function.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_TYPE Unsupported itype/ctype combination.
+ * NZERROR_TK_PARMS Error in persona description.
+ */
+#ifdef __STDC__
+nzerror nzteCreatePersona(nzctx *, nzttVersion, nzttCipherType,
+ nzttPersonaDesc *, nzttPersona **);
+#else
+nzerror nzteCreatePersona(/*_ nzctx *, nzttVersion, nzttCipherType,
+ nzttPersonaDesc *, nzttPersona ** _*/);
+#endif /* __STDC __*/
+
+
+/*----------------- nztiStoreTrustedIdentity -----------------*/
+
+/*
+ * NAME
+ * nztiStoreTrustedIdentity - Store an identity into a persona.
+ *
+ * PARAMETERS
+ * osscntxt {IN} Success.
+ * identity {IN/OUT} Trusted Identity.
+ * persona {IN/OUT} Persona.
+ *
+ * NOTES
+ * The identity is not saved with the persona in the wallet until
+ * the persona is stored.
+ *
+ * The identity parameter is double indirect so that it can point
+ * into the persona at the conclusion of the call.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nztiStoreTrustedIdentity(nzctx *, nzttIdentity **,
+ nzttPersona *);
+#else
+nzerror nztiStoreTrustedIdentity(/*_ nzctx *, nzttIdentity **,
+ nzttPersona * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteSetProtection ---------------------*/
+
+/*
+ * NAME
+ * nzteSetProtection - Set the protection type for a CE function.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN/OUT} Persona.
+ * func {IN} CE function.
+ * tdufmt {IN} TDU Format.
+ * protinfo {IN} Protection information specific to this format.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_PROTECTION Unsupported protection.
+ * NZERROR_TK_PARMS Error in protection info.
+ */
+#ifdef __STDC__
+nzerror nzteSetProtection(nzctx *, nzttPersona *, nzttcef, nztttdufmt,
+ nzttProtInfo *);
+#else
+nzerror nzteSetProtection(/*_ nzctx *, nzttPersona *, nzttcef, nztttdufmt,
+ nzttProtInfo * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteGetProtection ---------------------*/
+
+/*
+ * NAME
+ * nzteGetProtection - Get the protection type for a CE function.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * func {IN} CE function.
+ * tdufmt {OUT} TDU format.
+ * protinfo {OUT} Protection information.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nzteGetProtection(nzctx *, nzttPersona *, nzttcef, nztttdufmt *,
+ nzttProtInfo *);
+#else
+nzerror nzteGetProtection(/*_ nzctx *, nzttPersona *, nzttcef, nztttdufmt *,
+ nzttProtInfo * _*/);
+#endif /* __STDC __*/
+
+/*-------------------- nztiRemoveIdentity --------------------*/
+
+/*
+ * NAME
+ * nztiRemoveIdentity - Remove an identity from an open persona.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * identity {IN/OUT} Identity.
+ *
+ * NOTES
+ * If the persona is not stored, this identity will still be in the
+ * persona stored in the wallet.
+ *
+ * The identity parameter is doubly indirect so that at the
+ * conclusion of the function, the pointer can be set to NULL.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_NOTFOUND Identity not found.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ */
+#ifdef __STDC__
+nzerror nztiRemoveIdentity(nzctx *, nzttIdentity **);
+#else
+nzerror nztiRemoveIdentity(/*_ nzctx *, nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+/*----------------- nztifdn -----------------*/
+
+/*
+ * NAME
+ * nztifdn - create an Identity From a Distinguished Name
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * length {IN} Length of the distinguished name
+ * distinguished_name {IN} distinguished name string
+ * ppidentity {OUT} created identity
+ *
+ * NOTES
+ * Given a distinguished name, return the identity that corresponds to it.
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ */
+#ifdef __STDC__
+nzerror nztifdn(nzctx *ossctx,
+ ub4 length,
+ text *distinguished_name,
+ nzttIdentity **ppidentity);
+#else
+nzerror nztifdn(/*_ nzctx *ossctx,
+ ub4 length,
+ text *distinguished_name,
+ nzttIdentity **ppidentity _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nztxSignExpansion ---------------------*/
+
+/*
+ * NAME
+ * nztxSignExpansion - Determine the size of the attached signature buffer.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * inlen {IN} Length of input.
+ * tdulen {OUT} Buffer needed for signature.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztxSignExpansion(nzctx *, nzttPersona *, ub4, ub4 *);
+#else
+nzerror nztxSignExpansion(/*_ nzctx *, nzttPersona *, ub4, ub4 * _*/);
+#endif /* __STDC __*/
+
+/*--------------- nztxsd_SignDetachedExpansion ---------------*/
+
+/*
+ * NAME
+ * nztxsd_SignDetachedExpansion - Determine the size of buffer needed.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * inlen {IN} Length of input.
+ * tdulen {OUT} Buffer needed for signature.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztxsd_SignDetachedExpansion(nzctx *, nzttPersona *, ub4,
+ ub4 *);
+#else
+nzerror nztxsd_SignDetachedExpansion(/*_ nzctx *, nzttPersona *, ub4,
+ ub4 * _*/);
+#endif /* __STDC __*/
+
+/*------------------------ nztEncrypt ------------------------*/
+
+/*
+ * NAME
+ * nztEncrypt - Symmetrically encrypt
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * inlen {IN} Length of this input part.
+ * in {IN} This input part.
+ * tdubuf {IN/OUT} TDU buffer.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_CANTGROW Needed to grow TDU buffer but could not.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztEncrypt(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock *);
+#else
+nzerror nztEncrypt(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*------------------- nztxEncryptExpansion -------------------*/
+
+/*
+ * NAME
+ * nztxEncryptExpansion - Determine the size of the TDU to encrypt.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * inlen {IN} Length of this input part.
+ * tdulen {OUT} Length of TDU.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztxEncryptExpansion(nzctx *, nzttPersona *, ub4, ub4 *);
+#else
+nzerror nztxEncryptExpansion(/*_ nzctx *, nzttPersona *, ub4, ub4 * _*/);
+#endif /* __STDC __*/
+
+/*------------------------ nztDecrypt ------------------------*/
+
+/*
+ * NAME
+ * nztDecrypt - Decrypt an Encrypted message.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * state {IN} State of decryption.
+ * inlen {IN} Length of this input part.
+ * in {IN} This input part.
+ * out {IN/OUT} Cleartext message.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_CANTGROW Needed to grow TDU buffer but could not.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztDecrypt(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock *);
+#else
+nzerror nztDecrypt(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*------------------------ nztEnvelope ------------------------*/
+
+/*
+ * NAME
+ * nztEnvelope - Sign and PKEncrypt a message.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * nrecipients {IN} Number of recipients for this encryption.
+ * recipients {IN} List of recipients.
+ * state {IN} State of encryption.
+ * inlen {IN} Length of this input part.
+ * in {IN} This input part.
+ * tdubuf {IN/OUT} TDU buffer.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_CANTGROW Needed to grow output buffer but could not.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztEnvelope(nzctx *, nzttPersona *, ub4, nzttIdentity *,
+ nzttces, ub4, ub1 *, nzttBufferBlock *);
+#else
+nzerror nztEnvelope(/*_ nzctx *, nzttPersona *, ub4, nzttIdentity *,
+ nzttces, ub4, ub1 *, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*----------------------- nztDeEnvelope -----------------------*/
+
+/*
+ * NAME
+ * nztDeEnvelope - PKDecrypt and verify a message.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * state {IN} State of encryption.
+ * inlen {IN} Length of this input part.
+ * in {IN} This input part.
+ * out {OUT} Message from TDU.
+ * verified {OUT} TRUE if verified.
+ * validated {OUT} TRUE if validated.
+ * sender {OUT} Identity of sender.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_CANTGROW Needed to grow TDU buffer but could not.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztDeEnvelope(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock *, boolean *, boolean *,
+ nzttIdentity **);
+#else
+nzerror nztDeEnvelope(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock *, boolean *, boolean *,
+ nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+/*----------------------- nztKeyedHash -----------------------*/
+
+/*
+ * NAME
+ * nztKeyedHash - Generate a keyed hash.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * state {IN} State of hash.
+ * inlen {IN} Length of this input.
+ * in {IN} This input.
+ * tdu {IN/OUT} Output tdu.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_CANTGROW Needed to grow TDU buffer but could not.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztKeyedHash(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock *);
+#else
+nzerror nztKeyedHash(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+ nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*------------------ nztxKeyedHashExpansion ------------------*/
+
+/*
+ * NAME
+ * nztxKeyedHashExpansion - Determine the space needed for a keyed hash.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * inlen {IN} Length of this input.
+ * tdulen {OUT} TDU length.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztxKeyedHashExpansion(nzctx *, nzttPersona *, ub4,
+ ub4 *);
+#else
+nzerror nztxKeyedHashExpansion(/*_ nzctx *, nzttPersona *, ub4,
+ ub4 * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nztxHashExpansion ---------------------*/
+
+/*
+ * NAME
+ * nztxHashExpansion - Determine the size of the TDU for a hash.
+ *
+ * PARAMETERS
+ * osscntxt {IN} OSS context.
+ * persona {IN} Persona.
+ * inlen {IN} Length of this input.
+ * tdulen {OUT} TDU length.
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK Success.
+ * NZERROR_TK_NOTOPEN Persona is not open.
+ * NZERROR_TK_NOTSUPP Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztxHashExpansion(nzctx *, nzttPersona *, ub4, ub4 *);
+#else
+nzerror nztxHashExpansion(/*_ nzctx *, nzttPersona *, ub4, ub4 * _*/);
+#endif /* __STDC __*/
+
+/*---------------- nztiae_IsAuthEnabled ----------------*/
+
+/*
+ * NAME
+ * nztiae_IsAuthEnabled - Checks to see if Authentication is Enabled
+ * in the current Cipher Spec.
+ *
+ * PARAMETERS
+ * ctx {IN} Oracle SSL Context
+ * ncipher {IN} CipherSuite
+ * authEnabled {OUT} Boolean for is Auth Enabled?
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK on success.
+ * NZERROR_TK_INV_CIPHR_TYPE if Cipher Spec is not Recognized.
+ */
+
+#ifdef __STDC__
+nzerror nztiae_IsAuthEnabled( nzctx *, ub2, boolean *);
+#else
+nzerror nztiae_IsAuthEnabled(/*_ nzctx *ctx,
+ ub2 ncipher,
+ boolean *authEnabled _*/);
+#endif
+
+/*---------------- nztiee_IsEncrEnabled ----------------*/
+/*
+ * NAME
+ * nztiee_IsEncrEnabled - Checks to see if Encryption is Enabled
+ * in the current Cipher Spec.
+ *
+ * PARAMETERS
+ * ctx {IN} Oracle SSL Context
+ * ncipher {IN} CipherSuite
+ * EncrEnabled {OUT} Boolean for is Auth Enabled?
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK on success.
+ * NZERROR_TK_INV_CIPHR_TYPE if Cipher Spec is not Recognized.
+ */
+
+#ifdef __STDC__
+nzerror nztiee_IsEncrEnabled( nzctx *, ub2, boolean *);
+#else
+nzerror nztiee_IsEncrEnabled(/*_ nzctx *ctx,
+ ub2 ncipher,
+ boolean *EncrEnabled _*/);
+#endif
+/*---------------- nztihe_IsHashEnabled ----------------*/
+/*
+ * NAME
+ * nztihe_IsHashEnabled - Checks to see if HAshing is Enabled
+ * in the current Cipher Spec.
+ *
+ * PARAMETERS
+ * ctx {IN} Oracle SSL Context
+ * ncipher {IN} CipherSuite
+ * hashEnabled {OUT} Boolean for is Auth Enabled?
+ *
+ * NOTES
+ *
+ * RETURNS
+ * NZERROR_OK on success.
+ * NZERROR_TK_INV_CIPHR_TYPE if Cipher Spec is not Recognized.
+ */
+
+#ifdef __STDC__
+nzerror nztihe_IsHashEnabled( nzctx *, ub2, boolean *);
+#else
+nzerror nztihe_IsHashEnabled(/*_ nzctx *ctx,
+ ub2 ncipher,
+ boolean *hashEnabled _*/);
+#endif
+
+/*
+ *
+ */
+
+#ifdef _STDC_
+nzerror nztGetIssuerName(nzctx *, nzttIdentity *, ub1 **, ub4 *);
+#else
+nzerror nztGetIssuerName(/*_ nzctx *ctx,
+ nzttIdentity *identity,
+ ub1 **issuername,
+ ub4 *issuernamelen _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztGetSubjectName(nzctx *, nzttIdentity *, ub1 **, ub4 *);
+#else
+nzerror nztGetSubjectName(/*_ nzctx *ctx,
+ nzttIdentity *identity,
+ ub1 **subjectname,
+ ub4 *subjectnamelen _*/);
+#endif
+
+
+#ifdef _STDC_
+nzerror nztGetBase64Cert(nzctx *, nzttIdentity *, ub1 **, ub4 *);
+#else
+nzerror nztGetBase64Cert(/*_ nzctx *ctx,
+ nzttIdentity *identity,
+ ub1 **b64cert,
+ ub4 *b64certlen _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztGetSerialNumber(nzctx *, nzttIdentity *, ub1 **, ub4 *);
+#else
+nzerror nztGetSerialNumber(/*_ nzctx *ctx,
+ nzttIdentity *identity,
+ ub1 **serialnum,
+ ub4 *serialnumlen _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztGetValidDate(nzctx *, nzttIdentity *, ub4 *, ub4 *);
+#else
+nzerror nztGetValidDate(/*_ nzctx *ctx,
+ nzttIdentity *identity,
+ ub4 *startdate,
+ ub4 *enddate _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztGetVersion(nzctx *, nzttIdentity *, nzstrc *);
+#else
+nzerror nztGetVersion(/*_ nzctx *ctx,
+ nzttIdentity *identity,
+ nzstrc *pVerStr _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztGetPublicKey(nzctx *, nzttIdentity *, ub1 **, ub4 *);
+#else
+nzerror nztGetPublicKey(/*_ nzctx *ctx,
+ nzttIdentity *identity,
+ ub1 **pubKey,
+ ub4 *pubKeylen _*/);
+#endif
+
+
+#ifdef _STDC_
+nzerror nztGenericDestroy(nzctx *, ub1 **);
+#else
+nzerror nztGenericDestroy(/*_ nzctx *ctx,
+ ub1 **var _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztSetAppDefaultLocation(nzctx *, text *, size_t);
+#else
+nzerror nztSetAppDefaultLocation(/*_ nzctx *ctx,
+ text *,
+ size_t _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztSearchNZDefault(nzctx *, boolean *);
+#else
+nzerror nztSearchNZDefault(/*_ nzctx *ctx,
+ boolean *search _*/);
+#endif
+
+
+#endif /* NZT_ORACLE */
+
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/occi.h b/src/terralib/drivers/OracleSpatial/OCI/include/occi.h
new file mode 100644
index 0000000..2dca9e6
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/occi.h
@@ -0,0 +1,78 @@
+/* Copyright (c) 2000, 2002, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ occi.h - Oracle C++ Interface header files.
+
+ DESCRIPTION
+ <short description of facility this file declares/defines>
+
+ RELATED DOCUMENTS
+ <note any documents related to this facility>
+
+ EXPORT FUNCTION(S)
+ <external functions declared for use outside package - one-line
+ descriptions>
+
+ INTERNAL FUNCTION(S)
+ <other external functions declared - one-line descriptions>
+
+ EXAMPLES
+
+ NOTES
+ <other useful comments, qualifications, etc.>
+
+ MODIFIED (MM/DD/YY)
+ vvinay 08/19/02 -
+ aahluwal 06/03/02 - bug 2360115
+ gayyappa 01/03/01 - removed inclusions before occiCommon.h
+ kmohan 04/11/00 - include oci.h and occiCommon.h also
+ rkasamse 04/03/00 - header file for all the OCCI classes
+ rkasamse 04/03/00 - Creation
+
+*/
+
+#ifndef OCCI_ORACLE
+# define OCCI_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+#ifndef OCCIDATA_ORACLE
+#include <occiData.h>
+#endif
+
+#ifndef OCCICONTROL_ORACLE
+#include <occiControl.h>
+#endif
+
+#ifndef OCCIOBJECTS_ORACLE
+#include <occiObjects.h>
+#endif
+
+#ifndef OCCIAQ_ORACLE
+#include <occiAQ.h>
+#endif
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ PRIVATE TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ EXPORT FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ INTERNAL FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+#endif /* OCCI_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/occiAQ.h b/src/terralib/drivers/OracleSpatial/OCI/include/occiAQ.h
new file mode 100644
index 0000000..9b68f41
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/occiAQ.h
@@ -0,0 +1,374 @@
+/* Copyright (c) 2002, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ occiAQ.h - Header file for occi AQ classes
+
+ DESCRIPTION
+ Class declarations for Producer, Consumer, Message, Agent
+ Listener, Subscription
+
+ RELATED DOCUMENTS
+ <note any documents related to this facility>
+
+ EXPORT FUNCTION(S)
+ <external functions declared for use outside package - one-line
+ descriptions>
+
+ INTERNAL FUNCTION(S)
+ <other external functions declared - one-line descriptions>
+
+ EXAMPLES
+
+ NOTES
+ <other useful comments, qualifications, etc.>
+
+ MODIFIED (MM/DD/YY)
+ cparampa 10/12/02 - creation
+
+*/
+
+#ifndef _olint /* disable olint check */
+
+#ifndef OCCIAQ_ORACLE
+# define OCCIAQ_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+namespace oracle {
+namespace occi {
+namespace aq{
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+class Message
+{
+ public:
+
+ enum MessageState
+ {
+ MSG_READY = OCI_MSG_READY,
+ MSG_WAITING = OCI_MSG_WAITING,
+ MSG_PROCESSED = OCI_MSG_PROCESSED,
+ MSG_EXPIRED = OCI_MSG_EXPIRED
+ };
+ enum PayloadType
+ {
+ RAW,
+ ANYDATA,
+ OBJECT
+ };
+
+ Message( const Environment *env );
+ Message( const Message& rhs);
+ ~Message();
+
+ void operator=(const Message& rhs);
+ int getAttemptsToDequeue() const ;
+ void setCorrelationId( const OCCI_STD_NAMESPACE::string& corr_id ) ;
+ OCCI_STD_NAMESPACE::string getCorrelationId() const ;
+ void setDelay( int delay ) ;
+ int getDelay() const ;
+ Date getMessageEnqueuedTime() const ;
+ void setExceptionQueueName( const OCCI_STD_NAMESPACE::string& queue ) ;
+ OCCI_STD_NAMESPACE::string getExceptionQueueName() const ;
+ void setExpiration( int exp ) ;
+ int getExpiration() const ;
+ MessageState getMessageState() const ;
+ void setPriority( int priority ) ;
+ int getPriority() const ;
+ void setRecipientList( OCCI_STD_NAMESPACE::vector<Agent>& ag_list ) ;
+ void setSenderId( const Agent& sender ) ;
+ Agent getSenderId() const ;
+ void setOriginalMessageId( const Bytes& queue ) ;
+ Bytes getOriginalMessageId() const ;
+ void setNull();
+ bool isNull() const;
+
+ void setBytes( const Bytes& bytes);
+ void setObject( PObject* pobj);
+ void setAnyData( const AnyData& any);
+
+ Bytes getBytes() const ;
+ PObject *getObject() ;
+ AnyData getAnyData() const ;
+
+ PayloadType getPayloadType( ) const;
+
+ private:
+ Ptr<MessageImpl> ptr;
+ OCIAQMsgProperties* getOCIMsgProperties() const;
+ Message( const Environment *env, const Connection *con,
+ OCIAQMsgProperties *msgprop, void *data, unsigned int dataLen,
+ PayloadType pType);
+ friend class ConsumerImpl;
+ friend class ProducerImpl;
+ friend class NotifyResult;
+};
+
+class Producer
+{
+ public:
+
+ enum EnqueueSequence
+ {
+ ENQ_BEFORE = OCI_ENQ_BEFORE,
+ ENQ_TOP = OCI_ENQ_TOP
+ };
+ enum Visibility
+ {
+ ENQ_IMMEDIATE = OCI_ENQ_IMMEDIATE,
+ ENQ_ON_COMMIT = OCI_ENQ_ON_COMMIT
+ };
+
+ Producer( const Connection *conn );
+ Producer( const Connection *conn,
+ const OCCI_STD_NAMESPACE::string& queue );
+ Producer( const Producer& rhs);
+ ~Producer();
+
+ void operator=(const Producer& prod);
+ void setRelativeMessageId( const Bytes& msgid );
+ Bytes getRelativeMessageId() const;
+ void setSequenceDeviation( EnqueueSequence option );
+ EnqueueSequence getSequenceDeviation() const;
+ void setVisibility( Visibility option );
+ Visibility getVisibility() const;
+ void setQueueName( const OCCI_STD_NAMESPACE::string& queue );
+ OCCI_STD_NAMESPACE::string getQueueName() const;
+ void setTransformation( const OCCI_STD_NAMESPACE::string& fName);
+ OCCI_STD_NAMESPACE::string getTransformation() const;
+ Bytes send( Message& msg, const OCCI_STD_NAMESPACE::string& queue );
+ Bytes send( Message& msg );
+ void setNull();
+ bool isNull() const;
+
+ private:
+ Ptr<ProducerImpl> ptr;
+};
+
+class Consumer
+{
+ public:
+
+ enum DequeueMode
+ {
+ DEQ_BROWSE = OCI_DEQ_BROWSE,
+ DEQ_LOCKED = OCI_DEQ_LOCKED,
+ DEQ_REMOVE = OCI_DEQ_REMOVE,
+ DEQ_REMOVE_NODATA = OCI_DEQ_REMOVE_NODATA
+ };
+ enum Navigation
+ {
+ DEQ_FIRST_MSG = OCI_DEQ_FIRST_MSG,
+ DEQ_NEXT_TRANSACTION = OCI_DEQ_NEXT_TRANSACTION,
+ DEQ_NEXT_MSG = OCI_DEQ_NEXT_MSG
+ };
+ enum Visibility
+ {
+ DEQ_IMMEDIATE = OCI_DEQ_IMMEDIATE,
+ DEQ_ON_COMMIT = OCI_DEQ_ON_COMMIT
+ };
+ enum
+ {
+ DEQ_WAIT_FOREVER = OCI_DEQ_WAIT_FOREVER,
+ DEQ_NO_WAIT = OCI_DEQ_NO_WAIT
+ };
+
+ Consumer( const Connection *conn );
+ Consumer( const Connection * conn, const Agent& agent);
+ Consumer( const Connection *conn,
+ const OCCI_STD_NAMESPACE::string& queue );
+ Consumer(const Consumer& con);
+ ~Consumer();
+
+ void operator=(const Consumer& con);
+ void setAgent(const Agent& agent);
+ void setConsumerName( const OCCI_STD_NAMESPACE::string& name );
+ OCCI_STD_NAMESPACE::string getConsumerName() const;
+ void setCorrelationId( const OCCI_STD_NAMESPACE::string& cor_id );
+ OCCI_STD_NAMESPACE::string getCorrelationId() const;
+ void setDequeueMode( DequeueMode mode );
+ DequeueMode getDequeueMode() const;
+ void setMessageIdToDequeue( const Bytes& msgid );
+ Bytes getMessageIdToDequeue() const;
+ void setPositionOfMessage( Navigation pos );
+ Navigation getPositionOfMessage() const;
+ void setVisibility( Visibility option );
+ Visibility getVisibility() const;
+ void setWaitTime( unsigned int wait );
+ unsigned int getWaitTime() const;
+ void setQueueName( const OCCI_STD_NAMESPACE::string& queue );
+ OCCI_STD_NAMESPACE::string getQueueName() const;
+ void setTransformation( const OCCI_STD_NAMESPACE::string& fName);
+ OCCI_STD_NAMESPACE::string getTransformation() const;
+ Message receive( Message::PayloadType pType,
+ const OCCI_STD_NAMESPACE::string& type="",
+ const OCCI_STD_NAMESPACE::string& schema="");
+ void setNull();
+ bool isNull() const;
+
+ private:
+ Ptr<ConsumerImpl> ptr;
+};
+
+class Agent
+{
+ public:
+ Agent( const Environment *env );
+ Agent( const Environment *env,
+ const OCCI_STD_NAMESPACE::string& name,
+ const OCCI_STD_NAMESPACE::string& address,
+ unsigned int protocol=0 ) ;
+ Agent(const Agent& a);
+ ~Agent() ;
+
+ void operator=(const Agent& a);
+ void setName( const OCCI_STD_NAMESPACE::string& name );
+ OCCI_STD_NAMESPACE::string getName() const;
+ void setAddress( const OCCI_STD_NAMESPACE::string& addr );
+ OCCI_STD_NAMESPACE::string getAddress() const;
+ void setProtocol(unsigned int protocol = 0);
+ unsigned int getProtocol() const;
+ void setNull();
+ bool isNull() const;
+ OCIAQAgent* getOCIAQAgent() const;
+
+ private:
+ Ptr<AgentImpl> ptr;
+ Agent( const Environment *env, OCIAQAgent *rhs, bool toFree = false );
+ friend class Listener;
+ friend class MessageImpl;
+};
+
+class Listener
+{
+ public:
+ Listener( const Connection *conn );
+ Listener( const Connection *conn,
+ OCCI_STD_NAMESPACE::vector<Agent> &agList,
+ int waitTime=0 );
+ ~Listener();
+
+ Agent listen();
+ void setAgentList(OCCI_STD_NAMESPACE::vector<Agent> &agList);
+ void setTimeOutForListen(int waitTime);
+ OCCI_STD_NAMESPACE::vector<Agent> getAgentList() const;
+ int getTimeOutForListen() const;
+
+ private:
+ const ConnectionImpl *conn;
+ OCIAQAgent** agentList;
+ unsigned int numAgents;
+ int timeOut;
+ void *listenerExt;
+};
+
+
+class Subscription
+{
+ public:
+ enum Presentation
+ {
+ PRES_DEFAULT = OCI_SUBSCR_PRES_DEFAULT,
+ PRES_XML = OCI_SUBSCR_PRES_XML
+ };
+ enum Protocol
+ {
+ PROTO_CBK = OCI_SUBSCR_PROTO_OCI,
+ PROTO_MAIL = OCI_SUBSCR_PROTO_MAIL,
+ PROTO_SERVER = OCI_SUBSCR_PROTO_SERVER,
+ PROTO_HTTP = OCI_SUBSCR_PROTO_HTTP
+ };
+ enum Namespace
+ {
+ NS_ANONYMOUS = OCI_SUBSCR_NAMESPACE_ANONYMOUS,
+ NS_AQ = OCI_SUBSCR_NAMESPACE_AQ
+ };
+
+ Subscription(const Environment* env);
+ Subscription(const Environment* env, OCISubscription* sub);
+ Subscription(const Subscription& sub);
+ ~Subscription();
+
+ void operator=(const Subscription& sub);
+ unsigned int getDatabaseServersCount() const;
+ void setDatabaseServerNames(
+ const OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string>& dbsrv);
+ OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string>
+ getDatabaseServerNames() const ;
+ void setNotifyCallback(unsigned int (*callback)(Subscription& sub,
+ NotifyResult *nr));
+ unsigned int (*getNotifyCallback() const)(Subscription& sub,
+ NotifyResult *nr);
+ void setCallbackContext(void* ctx);
+ void* getCallbackContext() const;
+ void setSubscriptionName(const OCCI_STD_NAMESPACE::string& name);
+ OCCI_STD_NAMESPACE::string getSubscriptionName() const ;
+ void setSubscriptionNamespace(Namespace nameSpace);
+ Namespace getSubscriptionNamespace() const ;
+ void setPayload(const Bytes& payload);
+ Bytes getPayload() const ;
+ void setRecipientName( const OCCI_STD_NAMESPACE::string& name);
+ OCCI_STD_NAMESPACE::string getRecipientName() const;
+ void setPresentation( Presentation pres) ;
+ Presentation getPresentation() const ;
+ void setProtocol( Protocol prot) ;
+ Protocol getProtocol() const ;
+ OCISubscription* getOCISubscription() const;
+ void setNull();
+ bool isNull() const;
+ Environment* getEnvironment() const;
+
+ private:
+ Ptr<SubscriptionImpl> ptr;
+};
+
+class NotifyResult
+{
+ public:
+ Bytes getPayload() const;
+ Message getMessage() const;
+ Bytes getMessageId() const;
+ OCCI_STD_NAMESPACE::string getConsumerName() const;
+ OCCI_STD_NAMESPACE::string getQueueName() const;
+
+ private:
+ const EnvironmentImpl *env;
+ void *payload;
+ unsigned int payloadLen;
+ dvoid *desc;
+ ub4 mode;
+ void *notifyResultExt;
+
+ //private constructor
+ NotifyResult(const Environment *env, void *payload, ub4 payloadLen,
+ void *pdescriptor, ub4 mode);
+
+ friend class SubscriptionImpl;
+};
+
+/*---------------------------------------------------------------------------
+ PRIVATE TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ EXPORT FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ INTERNAL FUNCTIONS
+ ---------------------------------------------------------------------------*/
+} /* end of namespace aq */
+} /* end of namespace occi */
+} /* end of namespace oracle */
+
+#endif /* OCCIAQ_ORACLE */
+
+#endif /* _olint */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/occiCommon.h b/src/terralib/drivers/OracleSpatial/OCI/include/occiCommon.h
new file mode 100644
index 0000000..91a796c
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/occiCommon.h
@@ -0,0 +1,872 @@
+/* Copyright (c) 2000, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ occiCommon.h - header file for doing forward references
+
+ DESCRIPTION
+ Just declare all the classes
+
+ RELATED DOCUMENTS
+ <note any documents related to this facility>
+
+ EXPORT FUNCTION(S)
+ <external functions declared for use outside package - one-line
+ descriptions>
+
+ INTERNAL FUNCTION(S)
+ <other external functions declared - one-line descriptions>
+
+ EXAMPLES
+
+ NOTES
+ <other useful comments, qualifications, etc.>
+
+ MODIFIED (MM/DD/YY)
+ cparampa 09/03/03 - Added NotifyResult
+ rvallam 02/12/03 - modified BFloat/BDouble interface - BFloat/BDouble
+ type is now a struct
+ shiyer 01/02/03 - add setVector(vector<UString>,string schema/type)
+ rvallam 11/19/02 - added objects support for interval classes
+ cparampa 12/11/02 - removed declaration for Payload
+ srseshad 11/14/02 - Add OCCIIBFLOAT/OCCIIBDOUBLE
+ cparampa 10/17/02 - prototypes for getVectorOf BDouble and BFloat taking
+ anydata.
+ cparampa 10/09/02 - Declarations for AQ classes
+ rvallam 10/12/02 - added new method for array pin - pinVectorOfRefs
+ rvallam 10/10/02 - objects performance enhancement - modified
+ getObject and getVector<T *> to take the
+ schName and typeName of the object
+ rvallam 10/11/02 - added native float/double API - get(set)vector
+ methods, added the enum values for BFLOAT and
+ BDOUBLE and typecodes for the same
+ shiyer 07/31/02 - 10iR1, OCCI Globalization support
+ cparampa 08/27/02 - Added forward reference for StatelessConnnectionPool
+ and StatelessConnectionPoolImpl
+ vvinay 06/25/02 - fix #2415021:const of string changed
+ aahluwal 06/03/02 - bug 2360115
+ gayyappa 12/27/01 - fix bug 2073482 - remove include <map>
+ gayyappa 10/29/01 - removed CharSet - bug 1853748
+ gayyappa 09/21/01 - #include <map>
+ rratnam 06/18/01 - fixed bug1777042 -- HP support for "std"
+ rvallam 06/11/01 - fixed NT porting problem with template functions-
+ added generic method get(set)VectorOfRefs
+ rratnam 04/25/01 - fixed NT porting bug1673780
+ rvallam 04/12/01 - added dummy parameter in getVector of AnyData
+ for PObject *
+ rratnam 04/10/01 - removed references to wstring
+ rvallam 04/02/01 - fixed linux porting bug 1654670
+ gayyappa 03/29/01 - remove get/set vector methods for int/float/double/
+ unsigned int for anydata.
+ rvallam 03/20/01 - added dummy parameter for Type in getVector for
+ void * in statement and ResultSet
+ added setVector of Ref<T> and Number prototype
+ for statement
+ gayyappa 03/15/01 - added parameter to getvector on anydata with void*.
+ rratnam 03/13/01 - added virtual destructor to RefCounted
+ rkasamse 03/15/01 - add an arg, Type, to getVector of void*
+ rratnam 03/06/01 - removed references() from RefCounted
+ slari 02/15/01 - suppress lint warnings
+ rratnam 02/12/01 - removed #include <iostream.h>
+ rvallam 02/07/01 - added enum OCCI_MAX_PREFETCH_DEPTH
+ gayyappa 01/15/01 - change ub4 to unsigned int for
+ get/set vector methods..
+ gayyappa 01/03/01 - put "using namespace std" in a ifndef
+ gayyappa 12/14/00 - add forward declaration for ResultSetImpl
+ and StatementImpl.
+ Remove commented #defines
+ gayyappa 11/17/00 - change Session to Connection
+ gayyappa 09/12/00 - remove OCCI_SQLT_INT, OCCI_SQLT_FLT
+ remove OCCIUNSIGNED_CHAR, OCCISHORT,
+ OCCIUNSIGNED_SHORT, OCCILONG ,OCCI_LONGDOUBLE,
+ OCCI_UNSIGNEDLONG from enum Type.
+ gayyappa 08/25/00 - add const to get/set vector mthds of anydata.
+ rvallam 08/10/00 - updated Type enum
+ slari 08/04/00 - add OCCIROWID and OCCICURSOR
+ rkasamse 08/04/00 - add setVector methods
+ slari 07/24/00 - add BytesImpl
+ rratnam 07/25/00 - Added forward declarations for LobStreamImpl,
+ ConnectionPool[Impl], removed those for
+ Connection[Impl]
+ rkasamse 07/28/00 - add getVector(ResultSet*...) methods
+ rratnam 06/14/00 - Added forward declaration for RefImpl,
+ added DefaultCharSet to the CharSet
+ enum
+ rratnam 06/13/00 - Added DefaultCharSet to the CharSet enum
+ kmohan 05/31/00 - RefCounted no more templated
+ rratnam 22/05/00 - Added forward declaration of ConnectionImpl, and the
+ LobOpenMode enum
+ kmohan 05/05/00 - Added global routine prototypes
+ rkasamse 05/23/00 -
+ slari 04/28/00 - add forward declaration of SQLExceptionImpl
+ kmohan 04/19/00 - Added enums Type,CharSet,CharSetForm
+ gayyappa 04/18/00 - removed checkStatus. added checkOCICall and
+ createSQLEXception functions
+ kmohan 04/11/00 - Creation
+
+*/
+
+
+#ifndef OCCICOMMON_ORACLE
+# define OCCICOMMON_ORACLE
+
+#ifndef _olint
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORASTRINGSTL
+#define ORASTRINGSTL
+#include <string>
+#endif
+
+#ifndef ORAVECTORSTL
+#include <vector>
+#define ORAVECTORSTL
+#endif
+
+#ifndef ORALISTSTL
+#include <list>
+#define ORALISTSTL
+#endif
+
+#define OCCI_STD_NAMESPACE std
+#define OCCI_HAVE_STD_NAMESPACE 1
+
+namespace oracle {
+namespace occi {
+
+//UString is the class for UTF16 characterset
+typedef OCCI_STD_NAMESPACE::basic_string<utext> UString;
+
+class Environment;
+class EnvironmentImpl;
+class Connection;
+class ConnectionImpl;
+class ConnectionPool;
+class ConnectionPoolImpl;
+class StatelessConnectionPool;
+class StatelessConnectionPoolImpl;
+class Statement;
+class StatementImpl;
+class ResultSet;
+class ResultSetImpl;
+class SQLException;
+class SQLExceptionImpl;
+class Stream;
+class PObject;
+class Number;
+class Bytes;
+class BytesImpl;
+class Date;
+class Timestamp;
+
+class MetaData;
+class MetaDataImpl;
+template <class T> class Ref;
+class RefImpl;
+class RefAny;
+class Blob;
+class Bfile;
+class Clob;
+class LobStreamImpl;
+class AnyData;
+class AnyDataImpl;
+class Map;
+class IntervalDS;
+class IntervalYM;
+
+namespace aq {
+class Message;
+class MessageImpl;
+class Agent;
+class AgentImpl;
+class Producer;
+class ProducerImpl;
+class Consumer;
+class ConsumerImpl;
+class Listener;
+class Subscription;
+class SubscriptionImpl;
+class NotifyResult;
+}
+
+typedef struct BFloat BFloat;
+typedef struct BDouble BDouble;
+
+/*---------------------------------------------------------------------------
+ ENUMERATORS
+ ---------------------------------------------------------------------------*/
+enum Type
+{
+ OCCI_SQLT_CHR=SQLT_CHR,
+ OCCI_SQLT_NUM=SQLT_NUM,
+ OCCIINT = SQLT_INT,
+ OCCIFLOAT = SQLT_FLT,
+ OCCIBFLOAT = SQLT_BFLOAT,
+ OCCIBDOUBLE = SQLT_BDOUBLE,
+ OCCIIBFLOAT = SQLT_IBFLOAT,
+ OCCIIBDOUBLE = SQLT_IBDOUBLE,
+ OCCI_SQLT_STR=SQLT_STR,
+ OCCI_SQLT_VNU=SQLT_VNU,
+ OCCI_SQLT_PDN=SQLT_PDN,
+ OCCI_SQLT_LNG=SQLT_LNG,
+ OCCI_SQLT_VCS=SQLT_VCS,
+ OCCI_SQLT_NON=SQLT_NON,
+ OCCI_SQLT_RID=SQLT_RID,
+ OCCI_SQLT_DAT=SQLT_DAT,
+ OCCI_SQLT_VBI=SQLT_VBI,
+ OCCI_SQLT_BIN=SQLT_BIN,
+ OCCI_SQLT_LBI=SQLT_LBI,
+ OCCIUNSIGNED_INT = SQLT_UIN,
+ OCCI_SQLT_SLS=SQLT_SLS,
+ OCCI_SQLT_LVC=SQLT_LVC,
+ OCCI_SQLT_LVB=SQLT_LVB,
+ OCCI_SQLT_AFC=SQLT_AFC,
+ OCCI_SQLT_AVC=SQLT_AVC,
+ OCCI_SQLT_CUR=SQLT_CUR,
+ OCCI_SQLT_RDD=SQLT_RDD,
+ OCCI_SQLT_LAB=SQLT_LAB,
+ OCCI_SQLT_OSL=SQLT_OSL,
+ OCCI_SQLT_NTY=SQLT_NTY,
+ OCCI_SQLT_REF=SQLT_REF,
+ OCCI_SQLT_CLOB=SQLT_CLOB,
+ OCCI_SQLT_BLOB=SQLT_BLOB,
+ OCCI_SQLT_BFILEE=SQLT_BFILEE,
+ OCCI_SQLT_CFILEE=SQLT_CFILEE,
+ OCCI_SQLT_RSET=SQLT_RSET,
+ OCCI_SQLT_NCO=SQLT_NCO,
+ OCCI_SQLT_VST=SQLT_VST,
+ OCCI_SQLT_ODT=SQLT_ODT,
+ OCCI_SQLT_DATE=SQLT_DATE,
+ OCCI_SQLT_TIME=SQLT_TIME,
+ OCCI_SQLT_TIME_TZ=SQLT_TIME_TZ,
+ OCCI_SQLT_TIMESTAMP=SQLT_TIMESTAMP,
+ OCCI_SQLT_TIMESTAMP_TZ=SQLT_TIMESTAMP_TZ,
+ OCCI_SQLT_INTERVAL_YM=SQLT_INTERVAL_YM,
+ OCCI_SQLT_INTERVAL_DS=SQLT_INTERVAL_DS,
+ OCCI_SQLT_TIMESTAMP_LTZ=SQLT_TIMESTAMP_LTZ,
+ OCCI_SQLT_FILE=SQLT_FILE,
+ OCCI_SQLT_CFILE=SQLT_CFILE,
+ OCCI_SQLT_BFILE=SQLT_BFILE,
+
+ OCCICHAR = 32 *1024,
+ OCCIDOUBLE,
+ OCCIBOOL,
+ OCCIANYDATA ,
+ OCCINUMBER,
+ OCCIBLOB,
+ OCCIBFILE,
+ OCCIBYTES,
+ OCCICLOB ,
+ OCCIVECTOR,
+ OCCIMETADATA,
+ OCCIPOBJECT,
+ OCCIREF ,
+ OCCIREFANY,
+ OCCISTRING ,
+ OCCISTREAM ,
+ OCCIDATE ,
+ OCCIINTERVALDS ,
+ OCCIINTERVALYM ,
+ OCCITIMESTAMP,
+ OCCIROWID,
+ OCCICURSOR
+
+
+};
+
+enum LockOptions {OCCI_LOCK_NONE = OCI_LOCK_NONE,
+ OCCI_LOCK_X = OCI_LOCK_X,
+ OCCI_LOCK_X_NOWAIT = OCI_LOCK_X_NOWAIT
+ };
+
+enum {OCCI_MAX_PREFETCH_DEPTH = UB4MAXVAL};
+
+enum TypeCode
+{
+
+OCCI_TYPECODE_REF = OCI_TYPECODE_REF,
+OCCI_TYPECODE_DATE = OCI_TYPECODE_DATE,
+OCCI_TYPECODE_REAL = OCI_TYPECODE_REAL,
+OCCI_TYPECODE_DOUBLE = OCI_TYPECODE_DOUBLE,
+OCCI_TYPECODE_BDOUBLE = OCI_TYPECODE_BDOUBLE,
+OCCI_TYPECODE_FLOAT = OCI_TYPECODE_FLOAT,
+OCCI_TYPECODE_BFLOAT = OCI_TYPECODE_BFLOAT,
+OCCI_TYPECODE_NUMBER = OCI_TYPECODE_NUMBER,
+OCCI_TYPECODE_DECIMAL = OCI_TYPECODE_DECIMAL,
+OCCI_TYPECODE_OCTET = OCI_TYPECODE_OCTET,
+OCCI_TYPECODE_INTEGER = OCI_TYPECODE_INTEGER,
+OCCI_TYPECODE_SMALLINT= OCI_TYPECODE_SMALLINT,
+OCCI_TYPECODE_RAW = OCI_TYPECODE_RAW,
+OCCI_TYPECODE_VARCHAR2 = OCI_TYPECODE_VARCHAR2,
+OCCI_TYPECODE_VARCHAR = OCI_TYPECODE_VARCHAR,
+OCCI_TYPECODE_CHAR = OCI_TYPECODE_CHAR,
+OCCI_TYPECODE_VARRAY= OCI_TYPECODE_VARRAY,
+OCCI_TYPECODE_TABLE = OCI_TYPECODE_TABLE,
+OCCI_TYPECODE_CLOB = OCI_TYPECODE_CLOB,
+OCCI_TYPECODE_BLOB = OCI_TYPECODE_BLOB,
+OCCI_TYPECODE_BFILE = OCI_TYPECODE_BFILE,
+OCCI_TYPECODE_OBJECT = OCI_TYPECODE_OBJECT,
+OCCI_TYPECODE_NAMEDCOLLECTION = OCI_TYPECODE_NAMEDCOLLECTION
+};
+
+enum CharSetForm
+{
+ OCCI_SQLCS_IMPLICIT = SQLCS_IMPLICIT // use local db char set
+ ,OCCI_SQLCS_NCHAR = SQLCS_NCHAR // use local db nchar set
+ ,OCCI_SQLCS_EXPLICIT = SQLCS_EXPLICIT // char set explicitly specified
+ ,OCCI_SQLCS_FLEXIBLE = SQLCS_FLEXIBLE // pl/sql flexible parameter
+};
+
+enum LobOpenMode
+{ OCCI_LOB_READONLY = OCI_LOB_READONLY
+ ,OCCI_LOB_READWRITE = OCI_LOB_READWRITE
+};
+
+class RefCounted {
+public:
+ RefCounted();
+ virtual ~RefCounted(){}
+ const RefCounted * newRef() const;
+ void deleteRef() const;
+
+private:
+
+ void onZeroReferences();
+ unsigned long references_;
+ };
+
+template <class T>
+class ConstPtr
+{
+
+public:
+
+ConstPtr( const T* ptr = 0 );
+ConstPtr( const ConstPtr<T>& mp );
+~ConstPtr();
+const T * operator->() const;
+const T* rawPtr() const;
+
+#ifdef MEMBER_TEMPLATE
+template<class OtherType> operator ConstPtr<OtherType>();
+#endif
+
+protected:
+
+void operator=( const ConstPtr<T>& mp );
+const T* rawPtr_;
+
+};
+
+template <class T>
+class Ptr : public ConstPtr<T> {
+
+public:
+
+Ptr( T* ptr = 0 );
+Ptr( const Ptr<T>& mp );
+void operator=( const Ptr<T>& mp );
+const T * operator->() const;
+T * operator->();
+T* rawPtr() ;
+const T* rawPtr() const;
+
+
+
+#ifdef MEMBER_TEMPLATE
+ template<class OtherType>
+ operator Ptr<OtherType>();
+#endif
+
+};
+
+/*---------------------------------------------------------------------------
+ EXPORT FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+ void getVector(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect);
+ void getVector(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<UString> &vect);
+ void getVector( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<Blob> &vect) ;
+ void getVector( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<Clob> &vect) ;
+ void getVector( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<Bfile> &vect) ;
+ void getVector( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+ void getVector( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<BFloat> &vect);
+ void getVector(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<BDouble> &vect);
+ void getVector( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<Bytes> &vect) ;
+ void getVector( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+ void getVector( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+ void getVector( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+ void getVector( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+ template <class T>
+ void getVectorOfRefs( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) ;
+ #ifndef WIN32COMMON
+ template <class T>
+ void getVector(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) ;
+ #endif
+ #ifdef WIN32COMMON
+ template <class T>
+ void getVector(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<T> &vect,
+ void *(*rSQL)(void *));
+ #else
+ template <class T>
+ void getVector(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<T *> &vect,
+ void *(*rSQL)(void *));
+ #endif
+
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect) ;
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<UString> &vect) ;
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<Blob> &vect) ;
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<Clob> &vect) ;
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<Bfile> &vect) ;
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<BFloat> &vect) ;
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<BDouble> &vect) ;
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<Bytes> &vect) ;
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+ template <class T>
+ void setVectorOfRefs( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) ;
+ #ifndef WIN32COMMON
+ template <class T>
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) ;
+ #endif
+ #ifdef WIN32COMMON
+ template <class T>
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector< T > &vect) ;
+ #else
+ template <class T>
+ void setVector( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector< T* > &vect) ;
+ #endif
+
+ void getVector( ResultSet *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector<int> &vect) ;
+ void getVector( ResultSet *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect) ;
+ void getVector( ResultSet *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector<UString> &vect) ;//UTF16 support
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<unsigned int> &vect) ;
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<float> &vect);
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<BFloat> &vect);
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<double> &vect);
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<BDouble> &vect);
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<RefAny> &vect) ;
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Blob> &vect) ;
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Clob> &vect) ;
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Bfile> &vect) ;
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+ template <class T>
+ void getVectorOfRefs(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) ;
+ #ifndef WIN32COMMON
+ template <class T>
+ void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) ;
+ #endif
+ #ifdef WIN32COMMON
+ template <class T>
+ void getVector( ResultSet *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector< T > &vect) ;
+ #else
+ template <class T>
+ void getVector( ResultSet *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector< T* > &vect) ;
+ #endif
+
+
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<RefAny> &vect) ;
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Blob> &vect) ;
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Clob> &vect) ;
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Bfile> &vect) ;
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+ void getVector( Statement *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector<int> &vect) ;
+ void getVector( Statement *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect) ;
+ void getVector( Statement *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector<UString> &vect) ;//UTF16 support
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<unsigned int> &vect) ;
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<float> &vect) ;
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<BFloat> &vect) ;
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<double> &vect) ;
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<BDouble> &vect) ;
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+ template <class T>
+ void getVectorOfRefs(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) ;
+ #ifndef WIN32COMMON
+ template <class T>
+ void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) ;
+ #endif
+ #ifdef WIN32COMMON
+ template <class T>
+ void getVector( Statement *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector< T > &vect) ;
+ #else
+ template <class T>
+ void getVector( Statement *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector< T* > &vect) ;
+ #endif
+
+
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<int> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<unsigned int> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<double> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<BDouble> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<float> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<BFloat> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Number> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype);
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<RefAny> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Blob> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Clob> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Bfile> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Timestamp> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Date> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ template <class T>
+ void setVectorOfRefs(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ #ifndef WIN32COMMON
+ template <class T>
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ #endif
+ #ifdef WIN32COMMON
+ template <class T>
+ void setVector( Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector< T > &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ #else
+ template <class T>
+ void setVector( Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<T* > &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ #endif
+
+/* -----------------------------------------------------------------------------------
+ Statement setVector functions, schema & type separate arguments - multibyte support
+ -----------------------------------------------------------------------------------
+*/
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<int> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<unsigned int> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<double> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<BDouble> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<float> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<BFloat> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Number> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName);
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<RefAny> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Blob> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Clob> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Bfile> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Timestamp> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Date> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ template <class T>
+ void setVectorOfRefs(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+
+ #ifndef WIN32COMMON
+ template <class T>
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ #endif
+
+ #ifdef WIN32COMMON
+ template <class T>
+ void setVector( Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector< T > &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ #else
+ template <class T>
+ void setVector( Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<T* > &vect, const OCCI_STD_NAMESPACE::string
+ &schemaName, const OCCI_STD_NAMESPACE::string &typeName) ;
+ #endif
+
+/*-------------------------------------------------------------------------
+ Statement setVector function - UTF16 support
+ -------------------------------------------------------------------------
+*/
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<int> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<unsigned int> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<double> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<BDouble> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<float> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<BFloat> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Number> &vect,
+ const UString &schemaName,
+ const UString &typeName);
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<UString> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<UString> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<RefAny> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Blob> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Clob> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Bfile> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Timestamp> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Date> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ template <class T>
+ void setVectorOfRefs(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+
+ #ifndef WIN32COMMON
+ template <class T>
+ void setVector(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ #endif
+
+ #ifdef WIN32COMMON
+ template <class T>
+ void setVector( Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector< T > &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ #else
+ template <class T>
+ void setVector( Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<T* > &vect, const UString
+ &schemaName, const UString &typeName) ;
+ #endif
+
+
+/* Global method for array pins */
+template <class T>
+void pinVectorOfRefs( const Connection *conn,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+OCCI_STD_NAMESPACE::vector<T* > &vectObj,
+LockOptions lockOpt = OCCI_LOCK_NONE );
+
+template <class T>
+void pinVectorOfRefs( const Connection *conn,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+LockOptions lockOpt = OCCI_LOCK_NONE );
+
+/*---------------------------------------------------------------------------
+ INTERNAL FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+} /* end of namespace occi */
+} /* end of namespace oracle */
+#endif /* _olint */
+
+#endif /* OCCICOMMON_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/occiControl.h b/src/terralib/drivers/OracleSpatial/OCI/include/occiControl.h
new file mode 100644
index 0000000..aaeee82
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/occiControl.h
@@ -0,0 +1,2060 @@
+/* Copyright Oracle Corporation 2000, 2001. All Rights Reserved. */
+
+/*
+ NAME
+ occiControl.h - header file for OCCI control classes
+
+ DESCRIPTION
+ Class definitions for MetaData,SQLException,Environment,
+ Connection,Statement, ConnectionPool, StatelessConnectionPool
+
+ RELATED DOCUMENTS
+ <note any documents related to this facility>
+
+ EXPORT FUNCTION(S)
+ <external functions declared for use outside package - one-line
+ descriptions>
+
+ INTERNAL FUNCTION(S)
+ <other external functions declared - one-line descriptions>
+
+ EXAMPLES
+
+ NOTES
+ <other useful comments, qualifications, etc.>
+
+ MODIFIED (MM/DD/YY)
+ rvadraha 09/30/03 - New Binary/CharacterStreamMode for Statement class
+ rvallam 02/12/03 - modify BFloat/BDouble interface to use the new
+ BFloat/BDouble type
+ shiyer 01/21/03 - add getPoolNameUString to ConnectionPool
+ shiyer 12/19/02 - Add cache sorted flush get/set to Environment
+ shiyer 12/31/02 - added OCI_ATTR_CHAR_SIZE to typeattr attrs
+ shiyer 12/09/02 - ensure new virtual interfaces are in order
+ cparampa 10/12/02 - AQ Additions
+ rvallam 10/12/02 - added new methods for array pin
+ shiyer 10/09/02 - Statement caching, Stateless Connection
+ Pooling - UTF16 support. Added NLS versions
+ of getErrorMessage in SQLException
+ rvallam 10/11/02 - added native float/double API - get(set) methods
+ for Statement and ResultSet class
+ cparampa 09/23/02 - added methods for statement caching
+ shiyer 10/01/02 - setVector versions for Windows
+ shiyer 07/31/02 - 10iR1, OCCI Globalization support
+ cparampa 09/23/02 - added methods for statement caching
+ praghuna 09/23/02 - 2333038:Fwd merge to 10i/MAIN
+ cparampa 08/26/02 - added class StatelessConnectionPool
+ added create/terminateStatelessConnnectionPool in Env
+ vvinay 08/06/02 - XA additions
+ vvinay 06/25/02 - fix #2415021: math moved to occiHeapAlloc.h
+ aahluwal 06/04/02 - bug 2360115
+ vvinay 02/21/02 - operator= added for SQLException
+ gayyappa 12/27/01 - add set/getDatabaseNCharParam
+ gayyappa 11/22/01 - modify interface to use strings for CharSet
+ gayyappa 10/01/01 - call reserve() on vector in set/getVector
+ rkasamse 07/30/01 -
+ rkasamse 07/26/01 - add env handle attrs - cache max/opt size
+ rvallam 07/23/01 - bug 1891228 - added throw() in destructor
+ of SQLException
+ rvallam 06/14/01 - replace call to get(set)VectorOfRefs in
+ get(set)Vector for Ref<T> with code in
+ get(set)VectorOfRefs
+ rvallam 11/06/01 - renamed internal methods in get/setVector to
+ get(set)VectorOfPObjects/get(set)VectorOfOCIRefs
+ as part of NT porting fix
+ added destructors to SQLException and MetaData
+ rvallam 05/03/01 - added const to the vector parameter in setVector
+ of Statement for Ref<T>
+ rratnam 04/10/01 - removed references to wstring
+ kmohan 04/04/01 - include math.h for WIN32COMMON
+ rvallam 04/02/01 - fixed linux porting bug 1654670
+ gayyappa 03/27/01 - add code for templated getVector on stmt for objects.
+ rvallam 03/20/01 - passed dummy parameter for Type in getVector for
+ void * in statement and ResultSet
+ rratnam 03/15/01 - fixed set and getRef / get and setVector for NULL
+ Refs
+ rkasamse 03/19/01 - 1676579: HP compilation errors
+ rratnam 03/07/01 - derived SQLException from exception, added what()
+ chliang 03/05/01 - disable olint
+ rvallam 02/23/01 - made getReadSQL/getWriteSQL methods const
+ rratnam 01/29/01 - add closeStream() to Statement/ResultSet
+ rvallam 01/30/01 - added private method getListType() to
+ MetaData
+ rratnam 01/03/01 - removed preTruncationLength() and isTruncated(),
+ added setBinary/CharacterStreamMode()
+ rratnam 01/03/01 - added new method setErrorOnBusy in ConnectionPool
+ rratnam 12/29/00 - added a createProxyConnection without roles
+ gayyappa 12/14/00 - add virtual functions getStatement/getConnection
+ to resultset and statement (fix bug# 1529888)
+ gayyappa 12/13/00 - remove setErrorOnTruncate from Statement/resultset.
+ rvallam 11/30/00 - removed #define NEVER
+ gayyappa 11/17/00 - split get method in Map to getReadSQL
+ and getWriteSQL
+ rvallam 10/20/00 - modify cacheflush() to flushCache()
+ added enums to MetaData
+ rvallam 09/14/00 - uncomment result set getMetaData method
+ rename it to getColumnListMetaData.
+ add get/set interval methods to stmt.
+ add getinterval methods to resultset.
+ gayyappa 08/30/00 - added virtual destructor to occiconnection.
+ add default values to registerOutParam in
+ occistatement.
+ removed get/set vector and anydata in statement.
+ removed Stream header in ifdef directive.
+ rvallam 08/10/00 - uncomment gets(), update occiConnection, update
+ Stream
+ slari 08/06/00 - add statement stream methods
+ slari 08/04/00 - add Statement::getXXX methods
+ slari 08/02/00 - add Stream
+ rratnam 08/04/00 - put in connection-cloning, proxy connections
+ rvallam 08/04/00 - changed metadata header - method signatures
+ rkasamse 08/04/00 - add setObject,setRef methods on Statement
+ slari 07/27/00 - add Statement::setNull
+ slari 07/26/00 - disable getBytes
+ slari 07/25/00 - enable getBytes and getRowid
+ rratnam 07/25/00 - Conn Pooling changes - added ConnectionPool,
+ Connection, removed Session
+ modified Environment (made getOCIEnvironment(),
+ getMap() and getMode() const,
+ added create/terminateConnectionPool(),
+ added userName and password to createConnection() )
+ rkasamse 07/26/00 - uncomment getObject methods
+ slari 07/10/00 - enable getString
+ slari 07/05/00 - add result set methods
+ rkasamse 07/17/00 - add get function to Map
+ rratnam 06/16/00 - updated Session::getMetaData() to take the
+ parameter type
+ rvallam 06/13/00 - updated MetaData
+ rratnam 06/13/00 - added getRef() to Statement
+ and ResultSet,
+ made getOCIError(), getOCIEnvironment()
+ and getOCIServiceContext() in
+ Connection const
+ kmohan 05/31/00 - Datamember Session * changed to
+ SessionImpl *
+ in the class MetaData
+ change ORASTRINGSTL to ORASTRING
+ slari 05/26/00 - change ORAVECTOR to ORAVECTORSTL
+ slari 05/22/00 - add initial Statement class methods
+ slari 05/10/00 - enable Connection and Session methods
+ slari 04/21/00 - provide trivial implementation for
+ ~Connection
+ slari 04/17/00 - make Environment methods abstract
+ slari 04/13/00 - add Environment
+ gayyappa 04/18/00 - changed defn of SQLException
+ kmohan 04/11/00 - added class definitions
+ rkasamse 04/03/00 - header (interface) files for OCCI
+ control classes.
+ rkasamse 04/03/00 - Creation
+
+*/
+
+#ifndef _olint /* disable olint check */
+
+#ifndef OCCICONTROL_ORACLE
+# define OCCICONTROL_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+#ifndef ORAEXCEPTION
+#define ORAEXCEPTION
+#include <exception>
+#endif
+
+namespace oracle {
+namespace occi {
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+class MetaData
+{
+ public :
+
+ enum AttrId
+ {ATTR_PTYPE = OCI_ATTR_PTYPE,
+ ATTR_TIMESTAMP = OCI_ATTR_TIMESTAMP,
+ ATTR_OBJ_ID = OCI_ATTR_OBJ_ID,
+ ATTR_OBJ_NAME = OCI_ATTR_OBJ_NAME,
+ ATTR_OBJ_SCHEMA = OCI_ATTR_OBJ_SCHEMA,
+ ATTR_OBJID = OCI_ATTR_OBJID,
+ ATTR_NUM_COLS = OCI_ATTR_NUM_COLS,
+ ATTR_LIST_COLUMNS = OCI_ATTR_LIST_COLUMNS,
+ ATTR_REF_TDO = OCI_ATTR_REF_TDO,
+ ATTR_IS_TEMPORARY = OCI_ATTR_IS_TEMPORARY,
+ ATTR_IS_TYPED = OCI_ATTR_IS_TYPED,
+ ATTR_DURATION = OCI_ATTR_DURATION,
+ ATTR_COLLECTION_ELEMENT = OCI_ATTR_COLLECTION_ELEMENT,
+ ATTR_RDBA = OCI_ATTR_RDBA,
+ ATTR_TABLESPACE = OCI_ATTR_TABLESPACE,
+ ATTR_CLUSTERED = OCI_ATTR_CLUSTERED,
+ ATTR_PARTITIONED = OCI_ATTR_PARTITIONED,
+ ATTR_INDEX_ONLY = OCI_ATTR_INDEX_ONLY,
+ ATTR_LIST_ARGUMENTS = OCI_ATTR_LIST_ARGUMENTS,
+ ATTR_IS_INVOKER_RIGHTS = OCI_ATTR_IS_INVOKER_RIGHTS,
+ ATTR_LIST_SUBPROGRAMS = OCI_ATTR_LIST_SUBPROGRAMS,
+ ATTR_NAME = OCI_ATTR_NAME,
+ ATTR_OVERLOAD_ID = OCI_ATTR_OVERLOAD_ID,
+ ATTR_TYPECODE = OCI_ATTR_TYPECODE,
+ ATTR_COLLECTION_TYPECODE = OCI_ATTR_COLLECTION_TYPECODE,
+ ATTR_VERSION = OCI_ATTR_VERSION,
+ ATTR_IS_INCOMPLETE_TYPE = OCI_ATTR_IS_INCOMPLETE_TYPE,
+ ATTR_IS_SYSTEM_TYPE = OCI_ATTR_IS_SYSTEM_TYPE,
+ ATTR_IS_PREDEFINED_TYPE = OCI_ATTR_IS_PREDEFINED_TYPE,
+ ATTR_IS_TRANSIENT_TYPE = OCI_ATTR_IS_TRANSIENT_TYPE,
+ ATTR_IS_SYSTEM_GENERATED_TYPE =
+ OCI_ATTR_IS_SYSTEM_GENERATED_TYPE,
+ ATTR_HAS_NESTED_TABLE = OCI_ATTR_HAS_NESTED_TABLE,
+ ATTR_HAS_LOB = OCI_ATTR_HAS_LOB,
+ ATTR_HAS_FILE = OCI_ATTR_HAS_FILE,
+ ATTR_NUM_TYPE_ATTRS = OCI_ATTR_NUM_TYPE_ATTRS,
+ ATTR_LIST_TYPE_ATTRS = OCI_ATTR_LIST_TYPE_ATTRS,
+ ATTR_NUM_TYPE_METHODS = OCI_ATTR_NUM_TYPE_METHODS,
+ ATTR_LIST_TYPE_METHODS = OCI_ATTR_LIST_TYPE_METHODS,
+ ATTR_MAP_METHOD = OCI_ATTR_MAP_METHOD,
+ ATTR_ORDER_METHOD = OCI_ATTR_ORDER_METHOD,
+ ATTR_DATA_SIZE = OCI_ATTR_DATA_SIZE,
+ ATTR_DATA_TYPE = OCI_ATTR_DATA_TYPE,
+ ATTR_PRECISION = OCI_ATTR_PRECISION,
+ ATTR_SCALE = OCI_ATTR_SCALE,
+ ATTR_TYPE_NAME = OCI_ATTR_TYPE_NAME,
+ ATTR_SCHEMA_NAME = OCI_ATTR_SCHEMA_NAME,
+ ATTR_CHARSET_ID = OCI_ATTR_CHARSET_ID,
+ ATTR_CHARSET_FORM = OCI_ATTR_CHARSET_FORM,
+ ATTR_ENCAPSULATION = OCI_ATTR_ENCAPSULATION,
+ ATTR_IS_CONSTRUCTOR = OCI_ATTR_IS_CONSTRUCTOR,
+ ATTR_IS_DESTRUCTOR = OCI_ATTR_IS_DESTRUCTOR,
+ ATTR_IS_OPERATOR = OCI_ATTR_IS_OPERATOR,
+ ATTR_IS_SELFISH = OCI_ATTR_IS_SELFISH,
+ ATTR_IS_MAP = OCI_ATTR_IS_MAP,
+ ATTR_IS_ORDER = OCI_ATTR_IS_ORDER,
+ ATTR_IS_RNDS = OCI_ATTR_IS_RNDS,
+ ATTR_IS_RNPS = OCI_ATTR_IS_RNPS,
+ ATTR_IS_WNDS = OCI_ATTR_IS_WNDS,
+ ATTR_IS_WNPS = OCI_ATTR_IS_WNPS,
+ ATTR_NUM_ELEMS = OCI_ATTR_NUM_ELEMS,
+ ATTR_LINK = OCI_ATTR_LINK,
+ ATTR_MIN = OCI_ATTR_MIN,
+ ATTR_MAX = OCI_ATTR_MAX,
+ ATTR_INCR = OCI_ATTR_INCR,
+ ATTR_CACHE = OCI_ATTR_CACHE,
+ ATTR_ORDER = OCI_ATTR_ORDER,
+ ATTR_HW_MARK = OCI_ATTR_HW_MARK,
+ ATTR_IS_NULL = OCI_ATTR_IS_NULL,
+ ATTR_POSITION = OCI_ATTR_POSITION,
+ ATTR_HAS_DEFAULT = OCI_ATTR_HAS_DEFAULT,
+ ATTR_LEVEL = OCI_ATTR_LEVEL,
+ ATTR_IOMODE = OCI_ATTR_IOMODE,
+ ATTR_RADIX = OCI_ATTR_RADIX,
+ ATTR_SUB_NAME = OCI_ATTR_SUB_NAME,
+ ATTR_LIST_OBJECTS = OCI_ATTR_LIST_OBJECTS,
+ ATTR_NCHARSET_ID = OCI_ATTR_NCHARSET_ID,
+ ATTR_LIST_SCHEMAS = OCI_ATTR_LIST_SCHEMAS,
+ ATTR_MAX_PROC_LEN = OCI_ATTR_MAX_PROC_LEN,
+ ATTR_MAX_COLUMN_LEN = OCI_ATTR_MAX_COLUMN_LEN,
+ ATTR_CURSOR_COMMIT_BEHAVIOR =
+ OCI_ATTR_CURSOR_COMMIT_BEHAVIOR,
+ ATTR_MAX_CATALOG_NAMELEN = OCI_ATTR_MAX_CATALOG_NAMELEN,
+ ATTR_CATALOG_LOCATION = OCI_ATTR_CATALOG_LOCATION,
+ ATTR_SAVEPOINT_SUPPORT = OCI_ATTR_SAVEPOINT_SUPPORT,
+ ATTR_NOWAIT_SUPPORT = OCI_ATTR_NOWAIT_SUPPORT,
+ ATTR_AUTOCOMMIT_DDL = OCI_ATTR_AUTOCOMMIT_DDL,
+ ATTR_LOCKING_MODE = OCI_ATTR_LOCKING_MODE,
+ ATTR_IS_FINAL_TYPE = OCI_ATTR_IS_FINAL_TYPE,
+ ATTR_IS_INSTANTIABLE_TYPE = OCI_ATTR_IS_INSTANTIABLE_TYPE,
+ ATTR_IS_SUBTYPE = OCI_ATTR_IS_SUBTYPE,
+ ATTR_SUPERTYPE_SCHEMA_NAME = OCI_ATTR_SUPERTYPE_SCHEMA_NAME,
+ ATTR_SUPERTYPE_NAME = OCI_ATTR_SUPERTYPE_NAME,
+ ATTR_FSPRECISION = OCI_ATTR_FSPRECISION,
+ ATTR_LFPRECISION = OCI_ATTR_LFPRECISION,
+ ATTR_IS_FINAL_METHOD = OCI_ATTR_IS_FINAL_METHOD,
+ ATTR_IS_INSTANTIABLE_METHOD = OCI_ATTR_IS_INSTANTIABLE_METHOD,
+ ATTR_IS_OVERRIDING_METHOD = OCI_ATTR_IS_OVERRIDING_METHOD,
+ ATTR_CHAR_USED = OCI_ATTR_CHAR_USED,
+ ATTR_CHAR_SIZE = OCI_ATTR_CHAR_SIZE
+ };
+
+ enum ParamType
+ {
+ PTYPE_TABLE = OCI_PTYPE_TABLE
+ ,PTYPE_VIEW = OCI_PTYPE_VIEW
+ ,PTYPE_PROC = OCI_PTYPE_PROC
+ ,PTYPE_FUNC = OCI_PTYPE_FUNC
+ ,PTYPE_PKG = OCI_PTYPE_PKG
+ ,PTYPE_TYPE = OCI_PTYPE_TYPE
+ ,PTYPE_TYPE_ATTR = OCI_PTYPE_TYPE_ATTR
+ ,PTYPE_TYPE_COLL = OCI_PTYPE_TYPE_COLL
+ ,PTYPE_TYPE_METHOD = OCI_PTYPE_TYPE_METHOD
+ ,PTYPE_SYN = OCI_PTYPE_SYN
+ ,PTYPE_SEQ = OCI_PTYPE_SEQ
+ ,PTYPE_COL = OCI_PTYPE_COL
+ ,PTYPE_ARG = OCI_PTYPE_ARG
+ ,PTYPE_TYPE_ARG = OCI_PTYPE_TYPE_ARG
+ ,PTYPE_TYPE_RESULT = OCI_PTYPE_TYPE_RESULT
+ ,PTYPE_SCHEMA = OCI_PTYPE_SCHEMA
+ ,PTYPE_DATABASE = OCI_PTYPE_DATABASE
+ ,PTYPE_UNK = OCI_PTYPE_UNK
+ };
+
+
+ enum { DURATION_SESSION = OCI_DURATION_SESSION
+ ,DURATION_TRANS = OCI_DURATION_TRANS
+ ,DURATION_NULL = OCI_DURATION_NULL
+ ,TYPEENCAP_PRIVATE = OCI_TYPEENCAP_PRIVATE
+ ,TYPEENCAP_PUBLIC = OCI_TYPEENCAP_PUBLIC
+ ,TYPEPARAM_IN = OCI_TYPEPARAM_IN
+ ,TYPEPARAM_OUT = OCI_TYPEPARAM_OUT
+ ,TYPEPARAM_INOUT = OCI_TYPEPARAM_INOUT
+ ,CURSOR_OPEN = OCI_CURSOR_OPEN
+ ,CURSOR_CLOSED = OCI_CURSOR_CLOSED
+ ,CL_START = OCI_CL_START
+ ,CL_END = OCI_CL_END
+ ,SP_SUPPORTED = OCI_SP_SUPPORTED
+ ,SP_UNSUPPORTED = OCI_SP_UNSUPPORTED
+ ,NW_SUPPORTED = OCI_NW_SUPPORTED
+ ,NW_UNSUPPORTED = OCI_NW_UNSUPPORTED
+ ,AC_DDL = OCI_AC_DDL
+ ,NO_AC_DDL = OCI_NO_AC_DDL
+ ,LOCK_IMMEDIATE = OCI_LOCK_IMMEDIATE
+ ,LOCK_DELAYED = OCI_LOCK_DELAYED
+ };
+
+ MetaData(const MetaData &omd);
+ unsigned int getAttributeCount() const
+ ;
+ AttrId getAttributeId(unsigned int attributenum) const
+ ;
+ Type getAttributeType(unsigned int attributenum) const
+ ;
+ int getInt(MetaData::AttrId attrid) const
+ ;
+ bool getBoolean(MetaData::AttrId attrid) const
+ ;
+ unsigned int getUInt(MetaData::AttrId attrid) const
+ ;
+ OCCI_STD_NAMESPACE::string getString(MetaData::AttrId attrid) const
+ ;
+ UString getUString(MetaData::AttrId attrid) const
+ ;
+ Number getNumber(MetaData::AttrId attrid) const
+ ;
+ RefAny getRef(MetaData::AttrId attrid) const
+ ;
+ Timestamp getTimestamp(MetaData::AttrId attrid) const
+ ;
+ MetaData getMetaData(MetaData::AttrId attrid) const
+ ;
+ OCCI_STD_NAMESPACE::vector<MetaData> getVector(MetaData::AttrId attrid)
+ const ;
+ void operator =(const MetaData &omd);
+
+ ~MetaData();
+
+ private:
+
+ enum ociAttrType { OCI_UB1,
+ OCI_UB2,
+ OCI_UB4,
+ OCI_SB1,
+ OCI_WORD,
+ OCI_UB1_BOOL,
+ OCI_UB1PTR_TIMESTAMP,
+ OCI_UB1PTR_NUMBER,
+ OCI_TEXTPTR,
+ OCI_DVOIDPTR_PARAM,
+ OCI_DVOIDPTR_PARAMLIST,
+ OCI_OCIREFPTR,
+ OCI_OCIDURATION,
+ OCI_OCITYPECODE,
+ OCI_OCITYPEENCAP,
+ OCI_OCITYPEPARAMMODE,
+ OCI_OCIPRECISION
+ };
+
+ enum AttrCount {COMMON_ATTR_COUNT = 5,
+ TABLE_ATTR_COUNT = 12,
+ VIEW_ATTR_COUNT = 7,
+ FUNCPROC_ATTR_COUNT = 4,
+ PKG_ATTR_COUNT = 2,
+ TYP_ATTR_COUNT = 27,
+ TYPEATTR_ATTR_COUNT = 14,
+ TYPEMTHD_ATTR_COUNT = 16,
+ COLL_ATTR_COUNT = 12,
+ SYN_ATTR_COUNT = 4,
+ SEQ_ATTR_COUNT = 7,
+ COL_ATTR_COUNT = 13,
+ ARG_TYPARG_TYPRES_ATTR_COUNT = 20,
+ SCHEMA_ATTR_COUNT = 1,
+ DATABASE_ATTR_COUNT = 13,
+ UNK_ATTR_COUNT = 0
+ };
+
+ static const AttrId commonAttrId[COMMON_ATTR_COUNT];
+ static const ociAttrType commonAttrType[COMMON_ATTR_COUNT];
+ static const AttrId tableAttrId[TABLE_ATTR_COUNT];
+ static const ociAttrType tableAttrType[TABLE_ATTR_COUNT];
+ static const AttrId viewAttrId[VIEW_ATTR_COUNT];
+ static const ociAttrType viewAttrType[VIEW_ATTR_COUNT];
+ static const AttrId funcprocAttrId[FUNCPROC_ATTR_COUNT];
+ static const ociAttrType funcprocAttrType[FUNCPROC_ATTR_COUNT];
+ static const AttrId pkgAttrId[PKG_ATTR_COUNT];
+ static const ociAttrType pkgAttrType[PKG_ATTR_COUNT];
+ static const AttrId typAttrId[TYP_ATTR_COUNT];
+ static const ociAttrType typAttrType[TYP_ATTR_COUNT];
+ static const AttrId typeattrAttrId[TYPEATTR_ATTR_COUNT];
+ static const ociAttrType typeattrAttrType[TYPEATTR_ATTR_COUNT];
+ static const AttrId typmethdAttrId[TYPEMTHD_ATTR_COUNT];
+ static const ociAttrType typemthdAttrType[TYPEMTHD_ATTR_COUNT];
+ static const AttrId collAttrId[COLL_ATTR_COUNT];
+ static const ociAttrType collAttrType[COLL_ATTR_COUNT];
+ static const AttrId synAttrId[SYN_ATTR_COUNT];
+ static const ociAttrType synAttrType[SYN_ATTR_COUNT];
+ static const AttrId seqAttrId[SEQ_ATTR_COUNT];
+ static const ociAttrType seqAttrType[SEQ_ATTR_COUNT];
+ static const AttrId colAttrId[COL_ATTR_COUNT];
+ static const ociAttrType colAttrType[COL_ATTR_COUNT];
+ static const AttrId argtargtresAttrId[ARG_TYPARG_TYPRES_ATTR_COUNT];
+ static const ociAttrType argtargtresAttrType[
+ ARG_TYPARG_TYPRES_ATTR_COUNT];
+ static const AttrId schemaAttrId[SCHEMA_ATTR_COUNT];
+ static const ociAttrType schemaAttrType[SCHEMA_ATTR_COUNT];
+ static const AttrId databaseAttrId[DATABASE_ATTR_COUNT];
+ static const ociAttrType databaseAttrType[DATABASE_ATTR_COUNT];
+
+ Ptr<MetaDataImpl> metaDataImplPtr;
+ const OCIParam* paramhp;
+ const ConnectionImpl* sesn;
+ const AttrId* attrIdArray;
+ const ociAttrType* attrTypeArray;
+ AttrCount attrCount;
+
+ MetaData(const Connection *sessp, const OCCI_STD_NAMESPACE::string& objName,
+ ParamType prmtyp ) ;
+ MetaData(const Connection *sessp, const UString& objName,
+ ParamType prmtyp ) ;
+ MetaData(const Connection *sessp,
+ const RefAny& ref) ;
+ MetaData(const Connection *sessp, MetaDataImpl *implPtr,
+ OCIParam* parm) ;
+ MetaData(const Connection *sessp, MetaDataImpl *implPtr,
+ OCIParam *parm, ub1 parmTyp) ;
+ ub1 getParamType(OCIParam* prm) const ;
+ const AttrId* getAttrIdArrayAddr(ub1 prmTyp) const;
+ const ociAttrType* getAttrTypeArrayAddr(ub1 prmTyp) const;
+ AttrCount getAttrCount(ub1 prmTyp) const;
+ Type getType(ociAttrType typ) const;
+ bool isListTypeAttribute(AttrId attrid,ub1 ptyp) const;
+ boolean isInvalidAttrId(AttrId attrid,sb4* pos,
+ boolean* isTypeSpecificAttrPtr) const;
+ ociAttrType getValidAttrType(sb4 index, boolean isTypeSpecificAttr)
+ const;
+
+ int getListType (const OCIParam *plist) const;
+ unsigned int getLowerBound(int ltype) const;
+ unsigned int getUpperBound(unsigned int ltype,
+ unsigned int paramnum) const;
+ friend class ConnectionImpl;
+ friend class ResultSetImpl;
+
+};
+
+class Connection
+{
+ public :
+
+ // specifies the type of proxy to be created,
+ // used for future enhancements
+ enum ProxyType
+ {PROXY_DEFAULT
+ };
+
+ virtual ~Connection() { }
+ virtual Statement* createStatement(
+ const OCCI_STD_NAMESPACE::string &sql = "")
+ =0;
+ virtual void terminateStatement(Statement *statement) =0;
+ virtual void commit() =0;
+ virtual void rollback() =0;
+ virtual MetaData getMetaData(const OCCI_STD_NAMESPACE::string &object,
+ MetaData::ParamType prmtyp
+ = MetaData::PTYPE_UNK) const
+ =0;
+ virtual MetaData getMetaData(const RefAny &ref) const
+ =0;
+ virtual OCCI_STD_NAMESPACE::string getClientCharSet() const
+ =0;
+ virtual OCCI_STD_NAMESPACE::string getClientNCHARCharSet() const
+ =0;
+ virtual void changePassword(const OCCI_STD_NAMESPACE::string &user,
+ const OCCI_STD_NAMESPACE::string &oldPassword,
+ const OCCI_STD_NAMESPACE::string &newPassword)
+ =0;
+ virtual void flushCache() =0;
+
+ virtual OCIServer* getOCIServer() const =0;
+ virtual OCISvcCtx* getOCIServiceContext() const =0;
+ virtual OCISession* getOCISession() const =0;
+
+ //new interfaces
+
+ virtual Statement* createStatement(const UString &sql) = 0;
+ virtual MetaData getMetaData(const UString &object,
+ MetaData::ParamType prmtyp
+ = MetaData::PTYPE_UNK) const
+ =0;
+ virtual UString getClientCharSetUString() const
+ =0;
+ virtual UString getClientNCHARCharSetUString() const
+ =0;
+ virtual void changePassword(const UString &user,
+ const UString &oldPassword,
+ const UString &newPassword)
+ =0;
+ virtual OCCI_STD_NAMESPACE::string getTag() const =0;
+ virtual void setStmtCacheSize(unsigned int cacheSize) = 0;
+ virtual unsigned int getStmtCacheSize() const =0;
+ virtual Statement* createStatement(const OCCI_STD_NAMESPACE::string &sql,
+ const OCCI_STD_NAMESPACE::string &tag) = 0;
+ virtual void terminateStatement(Statement* stmt,
+ const OCCI_STD_NAMESPACE::string &tag) = 0;
+ virtual bool isCached(const OCCI_STD_NAMESPACE::string &sql,
+ const OCCI_STD_NAMESPACE::string &tag = "") = 0;
+ virtual void registerSubscriptions(
+ const OCCI_STD_NAMESPACE::vector<aq::Subscription>& sub) =0;
+ virtual void unregisterSubscription(const aq::Subscription& sub) =0;
+ virtual void postToSubscriptions(
+ const OCCI_STD_NAMESPACE::vector<aq::Subscription>& sub) =0;
+ virtual Statement* createStatement(const UString &sql,
+ const UString &tag) = 0;
+ virtual void terminateStatement(Statement* stmt,
+ const UString &tag) = 0;
+ virtual bool isCached(const UString &sql,
+ const UString &tag) = 0;
+};
+
+class StatelessConnectionPool
+{
+ public :
+
+ enum PoolType
+ {
+ HETEROGENEOUS = OCI_DEFAULT,
+ HOMOGENEOUS = OCI_SPC_HOMOGENEOUS
+ };
+
+ enum BusyOption
+ {
+ WAIT = OCI_SPOOL_ATTRVAL_WAIT,
+ NOWAIT = OCI_SPOOL_ATTRVAL_NOWAIT,
+ FORCEGET = OCI_SPOOL_ATTRVAL_FORCEGET
+ };
+
+ enum DestroyMode
+ {
+ DEFAULT = OCI_DEFAULT,
+ SPD_FORCE = OCI_SPD_FORCE
+ };
+
+ virtual ~StatelessConnectionPool() {}
+ virtual unsigned int getBusyConnections() const =0;
+ virtual unsigned int getOpenConnections() const =0;
+ virtual unsigned int getMinConnections() const =0;
+ virtual unsigned int getMaxConnections() const =0;
+ virtual unsigned int getIncrConnections() const =0;
+ virtual OCCI_STD_NAMESPACE::string getPoolName() const =0;
+ virtual unsigned int getTimeOut() const =0;
+ virtual void setBusyOption(BusyOption busyOption) =0;
+ virtual BusyOption getBusyOption() const =0;
+ virtual void setTimeOut(unsigned int connTimeOut =0) =0;
+ virtual void setPoolSize(unsigned int maxConn =1,
+ unsigned int minConn =0, unsigned int incrConn =1) =0;
+ virtual Connection* getConnection(
+ const OCCI_STD_NAMESPACE::string &tag ="") =0;
+ virtual Connection* getConnection(
+ const OCCI_STD_NAMESPACE::string &userName,
+ const OCCI_STD_NAMESPACE::string &password,
+ const OCCI_STD_NAMESPACE::string &tag = "") =0;
+ virtual Connection* getAnyTaggedConnection(
+ const OCCI_STD_NAMESPACE::string &tag = "") =0;
+ virtual Connection* getAnyTaggedConnection(
+ const OCCI_STD_NAMESPACE::string &userName,
+ const OCCI_STD_NAMESPACE::string &Password,
+ const OCCI_STD_NAMESPACE::string &tag = "") =0;
+ virtual Connection* getProxyConnection(
+ const OCCI_STD_NAMESPACE::string &name,
+ OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+ const OCCI_STD_NAMESPACE::string &tag = "",
+ Connection::ProxyType proxyType = Connection::PROXY_DEFAULT) =0;
+ virtual Connection* getProxyConnection(
+ const OCCI_STD_NAMESPACE::string &name,
+ const OCCI_STD_NAMESPACE::string &tag = "" ,
+ Connection::ProxyType proxyType = Connection::PROXY_DEFAULT) =0;
+ virtual Connection* getAnyTaggedProxyConnection(
+ const OCCI_STD_NAMESPACE::string &name,
+ OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+ const OCCI_STD_NAMESPACE::string &tag = "",
+ Connection::ProxyType proxyType = Connection::PROXY_DEFAULT) =0;
+ virtual Connection* getAnyTaggedProxyConnection(
+ const OCCI_STD_NAMESPACE::string &name,
+ const OCCI_STD_NAMESPACE::string &tag="",
+ Connection::ProxyType proxyType = Connection::PROXY_DEFAULT ) =0;
+ virtual void releaseConnection (Connection *connection,
+ const OCCI_STD_NAMESPACE::string &tag = "") =0;
+ virtual void terminateConnection (Connection *connection) =0;
+ virtual void setStmtCacheSize(unsigned int cacheSize) =0;
+ virtual unsigned int getStmtCacheSize() const =0;
+
+ virtual Connection* getConnection(const UString &tag)=0;
+ virtual Connection* getConnection(const UString &userName,
+ const UString &password,
+ const UString &tag)=0;
+ virtual Connection* getAnyTaggedConnection(const UString &tag)=0;
+ virtual Connection* getAnyTaggedConnection( const UString &userName,
+ const UString &Password, const UString &tag)=0 ;
+ virtual Connection* getProxyConnection(const UString &name,
+ OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+ const UString &tag,
+ Connection::ProxyType proxyType = Connection::PROXY_DEFAULT)=0;
+ virtual Connection* getProxyConnection(const UString &name,
+ const UString &tag, Connection::ProxyType
+ proxyType = Connection::PROXY_DEFAULT)=0;
+ virtual Connection* getAnyTaggedProxyConnection(const UString &name,
+ OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+ const UString &tag,
+ Connection::ProxyType proxyType = Connection::PROXY_DEFAULT)=0;
+ virtual Connection* getAnyTaggedProxyConnection(const UString &name,
+ const UString &tag,
+ Connection::ProxyType proxyType = Connection::PROXY_DEFAULT )=0;
+ virtual void releaseConnection(Connection *connection,
+ const UString &tag)=0;
+
+};
+
+
+class ConnectionPool
+{
+ public :
+
+ virtual ~ConnectionPool() {}
+ virtual unsigned int getBusyConnections() const
+ =0;
+ virtual unsigned int getOpenConnections() const
+ =0;
+ virtual unsigned int getMinConnections() const
+ =0;
+ virtual unsigned int getMaxConnections() const
+ =0;
+ virtual unsigned int getIncrConnections() const
+ =0;
+ virtual OCCI_STD_NAMESPACE::string getPoolName() const
+ =0;
+ virtual unsigned int getTimeOut() const
+ =0;
+ virtual void setErrorOnBusy()
+ =0;
+ virtual void setTimeOut(unsigned int connTimeOut =0)
+ =0;
+ virtual void setPoolSize(unsigned int minConn =0,
+ unsigned int maxConn =1, unsigned int incrConn =1)
+ =0;
+ virtual Connection* createConnection(
+ const OCCI_STD_NAMESPACE::string &userName,
+ const OCCI_STD_NAMESPACE::string &password) =0;
+
+ virtual Connection* createProxyConnection(
+ const OCCI_STD_NAMESPACE::string &name,
+ OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+ Connection::ProxyType proxyType =
+ Connection::PROXY_DEFAULT) =0;
+
+ virtual Connection* createProxyConnection(
+ const OCCI_STD_NAMESPACE::string &name,
+ Connection::ProxyType proxyType =
+ Connection::PROXY_DEFAULT) =0;
+
+ virtual void terminateConnection
+ (Connection *connection) =0;
+
+ //new interfaces
+
+ virtual Connection* createConnection(
+ const UString &userName,
+ const UString &password) =0;
+
+ virtual Connection* createProxyConnection(const UString &name,
+ OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+ Connection::ProxyType proxyType =
+ Connection::PROXY_DEFAULT) =0;
+
+ virtual Connection* createProxyConnection(const UString &name,
+ Connection::ProxyType proxyType =
+ Connection::PROXY_DEFAULT) =0;
+
+ virtual void setStmtCacheSize(unsigned int cacheSize) =0;
+ virtual unsigned int getStmtCacheSize() const =0;
+
+ virtual UString getPoolNameUString() const
+ =0;
+};
+
+class Environment
+{
+ public:
+ // class constants
+
+ enum Mode
+ {
+ DEFAULT = OCI_DEFAULT,
+ OBJECT = OCI_OBJECT,
+ SHARED = OCI_SHARED,
+ NO_USERCALLBACKS = OCI_NO_UCB,
+ THREADED_MUTEXED = OCI_THREADED,
+ THREADED_UNMUTEXED = OCI_THREADED | OCI_ENV_NO_MUTEX,
+ EVENTS = OCI_EVENTS,
+ USE_LDAP = OCI_USE_LDAP
+ };
+
+ virtual ~Environment(){}
+
+ // public methods
+
+ static Environment * createEnvironment(
+ Mode mode = DEFAULT,
+ void *ctxp = 0,
+ void *(*malocfp)(void *ctxp, size_t size) = 0,
+ void *(*ralocfp)(void *ctxp, void *memptr,
+ size_t newsize) = 0,
+ void (*mfreefp)(void *ctxp, void *memptr) = 0);
+
+ static Environment * createEnvironment(
+ const OCCI_STD_NAMESPACE::string &charset,
+ const OCCI_STD_NAMESPACE::string &ncharset,
+ Mode mode = DEFAULT,
+ void *ctxp = 0,
+ void *(*malocfp)(void *ctxp, size_t size) = 0,
+ void *(*ralocfp)(void *ctxp, void *memptr,
+ size_t newsize) = 0,
+ void (*mfreefp)(void *ctxp, void *memptr) = 0);
+
+ static void terminateEnvironment(Environment *env);
+
+ static Environment* getXAEnvironment(const
+ OCCI_STD_NAMESPACE::string& dbname);
+
+ static void releaseXAEnvironment(Environment *env);
+
+ virtual Connection * createConnection(
+ const OCCI_STD_NAMESPACE::string &userName,
+ const OCCI_STD_NAMESPACE::string &password,
+ const OCCI_STD_NAMESPACE::string &connectString = "") = 0;
+
+ virtual void terminateConnection(Connection *connection) = 0;
+
+ virtual ConnectionPool* createConnectionPool(
+ const OCCI_STD_NAMESPACE::string &poolUserName,
+ const OCCI_STD_NAMESPACE::string &poolPassword,
+ const OCCI_STD_NAMESPACE::string &connectString ="",
+ unsigned int minConn =0,
+ unsigned int maxConn =1, unsigned int incrConn =1) = 0;
+
+ virtual void terminateConnectionPool(ConnectionPool *poolp) = 0;
+
+ virtual unsigned int getCurrentHeapSize() const = 0;
+
+ virtual OCIEnv * getOCIEnvironment() const = 0;
+
+ virtual Map *getMap() const = 0;
+
+ virtual void setCacheMaxSize(unsigned int maxSize) = 0;
+
+ virtual unsigned int getCacheMaxSize() const = 0;
+
+ virtual void setCacheOptSize(unsigned int OptSize) = 0;
+
+ virtual unsigned int getCacheOptSize() const = 0;
+
+
+ //new interfaces
+
+ virtual Connection * createConnection(const UString &userName,
+ const UString &password, const UString &connectString) = 0;
+
+ virtual ConnectionPool* createConnectionPool(
+ const UString &poolUserName,
+ const UString &poolPassword, const UString &connectString,
+ unsigned int minConn =0,
+ unsigned int maxConn =1, unsigned int incrConn =1) = 0;
+
+ virtual Connection* getXAConnection(const
+ OCCI_STD_NAMESPACE::string& dbname) = 0;
+
+ virtual void releaseXAConnection(Connection* conn) =0;
+
+ virtual StatelessConnectionPool* createStatelessConnectionPool(
+ const OCCI_STD_NAMESPACE::string &poolUserName,
+ const OCCI_STD_NAMESPACE::string &poolPassword,
+ const OCCI_STD_NAMESPACE::string &connectString = "",
+ unsigned int maxConn = 1, unsigned int minConn = 0,
+ unsigned int incrConn = 1,
+ StatelessConnectionPool::PoolType pType
+ = StatelessConnectionPool::HETEROGENEOUS) = 0;
+
+ virtual StatelessConnectionPool* createStatelessConnectionPool(
+ const UString &poolUserName,
+ const UString &poolPassword,
+ const UString &connectString,
+ unsigned int maxConn = 1, unsigned int minConn = 0,
+ unsigned int incrConn = 1,
+ StatelessConnectionPool::PoolType pType
+ = StatelessConnectionPool::HETEROGENEOUS) = 0;
+
+ virtual void terminateStatelessConnectionPool(StatelessConnectionPool *poolp,
+ StatelessConnectionPool::DestroyMode mode = StatelessConnectionPool::DEFAULT)
+ = 0;
+ virtual void setLDAPAuthentication(unsigned int mode) =0;
+
+ virtual unsigned int getLDAPAuthentication() const =0;
+
+ virtual void setLDAPLoginNameAndPassword(
+ const OCCI_STD_NAMESPACE::string &login,
+ const OCCI_STD_NAMESPACE::string &passwd) =0;
+
+ virtual void setLDAPAdminContext(const OCCI_STD_NAMESPACE::string &ctx)=0;
+
+ virtual OCCI_STD_NAMESPACE::string getLDAPAdminContext() const =0;
+
+ virtual void setLDAPHostAndPort(const OCCI_STD_NAMESPACE::string &host,
+ unsigned int port) =0;
+
+ virtual OCCI_STD_NAMESPACE::string getLDAPHost() const =0;
+
+ virtual unsigned int getLDAPPort() const =0;
+
+ virtual void registerSubscriptions(
+ const OCCI_STD_NAMESPACE::vector<aq::Subscription>& sub) =0;
+
+ virtual void unregisterSubscription(const aq::Subscription& sub) =0;
+
+ virtual void enableSubscription(const aq::Subscription& sub) =0;
+
+ virtual void disableSubscription(const aq::Subscription& sub) =0;
+
+ virtual bool getCacheSortedFlush() const = 0;
+
+ virtual void setCacheSortedFlush(bool flag) = 0;
+
+ private:
+
+};
+
+
+
+class Map
+{
+ public:
+
+ virtual ~Map(){}
+ virtual void put(const OCCI_STD_NAMESPACE::string&, void *(*)(void *),
+ void (*)(void *, void *)) = 0;
+ virtual void getReadSQL(
+ void *, unsigned int, void *, unsigned int, void **) const = 0;
+ virtual void getWriteSQL(
+ void *, unsigned int, void *, unsigned int, void **) const = 0;
+ virtual void put(const OCCI_STD_NAMESPACE::string&,
+ const OCCI_STD_NAMESPACE::string&, void *(*)(void *),
+ void (*)(void *, void *)) = 0;
+ virtual void putUTF16(const OCCI_STD_NAMESPACE::string&,
+ const OCCI_STD_NAMESPACE::string&, void *(*)(void *),
+ void (*)(void *, void *)) = 0;
+
+ private:
+};
+
+
+
+class SQLException : public OCCI_STD_NAMESPACE::exception
+{
+ public:
+
+ virtual int getErrorCode() const;
+
+ virtual OCCI_STD_NAMESPACE::string getMessage() const;
+
+ const char *what() const throw();
+
+ virtual void setErrorCtx(void *ctx);
+
+ SQLException();
+
+ SQLException(const SQLException &e);
+
+ void operator=(const SQLException &other);
+
+ virtual ~SQLException() throw();
+
+ virtual int getXAErrorCode(const OCCI_STD_NAMESPACE::string& dbname) const;
+
+ virtual UString getUStringMessage() const;
+
+ virtual OCCI_STD_NAMESPACE::string getNLSMessage(Environment *env) const;
+
+ virtual UString getNLSUStringMessage(Environment *env) const;
+
+ private:
+
+ Ptr<SQLExceptionImpl> ptr_;
+ SQLException(SQLExceptionImpl *ptr);
+ friend SQLException SQLExceptionCreate(int errorCode);
+ friend SQLException SQLExceptionCreate(dvoid *handle,
+ int handleType);
+
+};
+
+
+class Statement
+{
+ public:
+ // class constants
+
+ virtual ~Statement() {}
+
+ enum Status
+ {
+ UNPREPARED,
+ PREPARED,
+ RESULT_SET_AVAILABLE,
+ UPDATE_COUNT_AVAILABLE,
+ NEEDS_STREAM_DATA,
+ STREAM_DATA_AVAILABLE
+ };
+
+ // common methods
+
+ virtual void setSQL(const OCCI_STD_NAMESPACE::string &sql) = 0;
+
+ virtual OCCI_STD_NAMESPACE::string getSQL() const = 0;
+
+ virtual Status execute(const OCCI_STD_NAMESPACE::string &sql = "") = 0;
+
+ virtual ResultSet * getResultSet() = 0;
+
+ virtual unsigned int getUpdateCount() const = 0;
+
+ virtual ResultSet * executeQuery(
+ const OCCI_STD_NAMESPACE::string &sql = "") = 0;
+
+ virtual unsigned int executeUpdate(
+ const OCCI_STD_NAMESPACE::string &sql = "") = 0;
+
+ virtual Status status() const = 0;
+
+ virtual void closeResultSet(ResultSet *resultSet) = 0;
+
+ virtual void setPrefetchRowCount(unsigned int rowCount) = 0;
+
+ virtual void setPrefetchMemorySize(unsigned int bytes) = 0;
+
+ virtual void setAutoCommit(bool autoCommit) = 0;
+
+ virtual bool getAutoCommit() const = 0;
+
+ virtual OCIStmt * getOCIStatement() const = 0;
+
+
+ // methods for prepared statements with IN
+ // parameters
+
+ virtual void setMaxParamSize(unsigned int paramIndex,unsigned int maxSize)=0;
+
+ virtual unsigned int getMaxParamSize(unsigned int paramIndex) const = 0;
+
+ virtual void setNull(unsigned int paramIndex, Type type) = 0;
+
+ virtual void setInt(unsigned int paramIndex, int x) = 0;
+
+ virtual void setUInt(unsigned int paramIndex, unsigned int x) = 0;
+
+ virtual void setFloat(unsigned int paramIndex, float x) = 0;
+
+ virtual void setDouble(unsigned int paramIndex, double x) = 0;
+
+ virtual void setNumber(unsigned int paramIndex, const Number &x) = 0;
+
+ virtual void setString(unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::string &x) = 0;
+
+ virtual void setBytes(unsigned int paramIndex, const Bytes &x) = 0;
+
+ virtual void setDate(unsigned int paramIndex, const Date &x) = 0;
+
+ virtual void setTimestamp(unsigned int paramIndex, const Timestamp &x) = 0;
+
+ virtual void setBlob(unsigned int paramIndex, const Blob &x) = 0;
+
+ virtual void setClob(unsigned int paramIndex, const Clob &x) = 0;
+
+ virtual void setBfile(unsigned int paramIndex, const Bfile &x) = 0;
+
+ virtual void setIntervalYM(unsigned int paramIndex, const IntervalYM &x) = 0;
+
+ virtual void setIntervalDS(unsigned int paramIndex, const IntervalDS &x) = 0;
+
+ virtual void setRowid(unsigned int paramIndex, const Bytes &x) = 0;
+
+ virtual void setRef(unsigned int paramIndex, const RefAny &x) = 0;
+
+ virtual void setObject(unsigned int paramIndex, PObject * x) = 0;
+
+ virtual void setDataBuffer(unsigned int paramIndex, void *buffer,
+ Type type,
+ sb4 size, ub2 *length, sb2 *ind = NULL,
+ ub2 *rc = NULL) = 0;
+
+ virtual void setDataBufferArray(unsigned int paramIndex, void *buffer,
+ Type type,
+ ub4 arraySize, ub4 *arrayLength,
+ sb4 elementSize,
+ ub2 *elementLength, sb2 *ind = NULL,
+ ub2 *rc = NULL) = 0;
+
+ virtual void setCharSet(unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::string & charSet) = 0;
+
+ virtual OCCI_STD_NAMESPACE::string getCharSet(unsigned int paramIndex)
+ const = 0;
+
+ virtual void setDatabaseNCHARParam(
+ unsigned int paramIndex, bool isNCHAR) = 0;
+
+ virtual bool getDatabaseNCHARParam(unsigned int paramIndex) const = 0;
+
+ virtual void closeStream(Stream *stream) =0;
+
+ virtual Stream * getStream(unsigned int paramIndex) = 0;
+
+ virtual unsigned int getCurrentStreamParam() const = 0;
+
+ virtual unsigned int getCurrentStreamIteration() const = 0;
+
+ virtual void setBinaryStreamMode(unsigned int colIndex,
+ unsigned int size) =0;
+
+ virtual void setCharacterStreamMode(unsigned int colIndex,
+ unsigned int size) =0;
+
+ virtual void setMaxIterations(unsigned int maxIterations) = 0;
+
+ virtual unsigned int getMaxIterations() const = 0;
+
+ virtual void addIteration() = 0;
+
+ virtual unsigned int getCurrentIteration() const = 0;
+
+ virtual Status executeArrayUpdate(unsigned int arrayLength) = 0;
+
+
+ // methods for Callable Statements
+
+ virtual void registerOutParam(unsigned int paramIndex, Type type,
+ unsigned int maxSize=0, const OCCI_STD_NAMESPACE::string &sqltype="") = 0;
+
+ virtual bool isNull(unsigned int paramIndex) const = 0;
+
+ virtual bool isTruncated(unsigned int paramIndex) const
+ =0;
+
+
+ virtual void setErrorOnNull(unsigned int paramIndex,
+ bool causeException) = 0;
+
+ virtual void setErrorOnTruncate(unsigned int paramIndex,
+ bool causeException) = 0;
+
+ virtual int preTruncationLength(unsigned int paramIndex) const
+ =0;
+
+
+ virtual int getInt(unsigned int paramIndex) = 0;
+
+ virtual unsigned int getUInt(unsigned int paramIndex) = 0;
+
+ virtual float getFloat(unsigned int paramIndex) = 0;
+
+ virtual double getDouble(unsigned int paramIndex) = 0;
+
+ virtual Number getNumber(unsigned int paramIndex) = 0;
+
+ virtual OCCI_STD_NAMESPACE::string getString(unsigned int paramIndex) = 0;
+
+ virtual Bytes getBytes(unsigned int paramIndex) = 0;
+
+ virtual Date getDate(unsigned int paramIndex) = 0;
+
+ virtual Timestamp getTimestamp(unsigned int paramIndex) = 0;
+
+ virtual Bytes getRowid(unsigned int paramIndex) = 0;
+
+ virtual PObject * getObject(unsigned int paramIndex) = 0;
+
+ virtual Blob getBlob(unsigned int paramIndex) = 0;
+
+ virtual Clob getClob(unsigned int paramIndex) = 0;
+
+ virtual Bfile getBfile(unsigned int paramIndex) = 0;
+
+ virtual IntervalYM getIntervalYM(unsigned int paramIndex) = 0;
+
+ virtual IntervalDS getIntervalDS(unsigned int paramIndex) = 0;
+
+ virtual RefAny getRef(unsigned int paramIndex) = 0;
+
+ virtual ResultSet * getCursor(unsigned int paramIndex) = 0;
+
+ virtual Connection* getConnection() const =0;
+
+ //new interfaces
+
+ virtual void setRef(unsigned int paramIndex, const RefAny &x,
+ const OCCI_STD_NAMESPACE::string &typName,
+ const OCCI_STD_NAMESPACE::string &schName = "") = 0;
+
+ virtual void setSQLUString(const UString &sql) = 0;
+
+ virtual UString getSQLUString() const = 0;
+
+ virtual Status execute(const UString &sql) = 0;
+
+ virtual ResultSet * executeQuery(
+ const UString &sql) = 0;
+
+ virtual unsigned int executeUpdate(
+ const UString &sql) = 0;
+
+ virtual void setBFloat(unsigned int paramIndex, const BFloat &fval) = 0;
+
+ virtual void setBDouble(unsigned int paramIndex, const BDouble &dval) = 0;
+
+ virtual void setUString(unsigned int paramIndex,
+ const UString &x) = 0;
+
+ virtual void setCharSetUString(unsigned int paramIndex,
+ const UString & charSet) = 0;
+
+ virtual UString getCharSetUString(unsigned int paramIndex)
+ const = 0;
+
+ virtual void registerOutParam(unsigned int paramIndex, Type type,
+ unsigned int maxSize, const OCCI_STD_NAMESPACE::string &typName,
+ const OCCI_STD_NAMESPACE::string &schName) = 0;
+
+ virtual void registerOutParam(unsigned int paramIndex, Type type,
+ unsigned int maxSize, const UString &typName,
+ const UString &schName) = 0;
+
+ virtual BFloat getBFloat(unsigned int paramIndex) = 0;
+
+ virtual BDouble getBDouble(unsigned int paramIndex) = 0;
+
+ virtual UString getUString(unsigned int paramIndex) = 0;
+
+ virtual void disableCaching() =0;
+
+ virtual void setRef(unsigned int paramIndex, const RefAny &x,
+ const UString &typName,
+ const UString &schName) = 0;
+
+ virtual void setBinaryStreamMode(unsigned int colIndex,
+ unsigned int size, bool INArg) =0;
+
+ virtual void setCharacterStreamMode(unsigned int colIndex,
+ unsigned int size, bool INArg) =0;
+
+};
+
+
+
+class ResultSet
+{
+ public:
+ // class constants
+
+ enum Status
+ {
+ END_OF_FETCH = 0,
+ DATA_AVAILABLE,
+ STREAM_DATA_AVAILABLE
+ };
+ virtual ~ResultSet(){}
+
+ // public methods
+
+ virtual Status next(unsigned int numRows = 1) = 0;
+
+ virtual Status status() const = 0;
+
+ virtual unsigned int getNumArrayRows() const = 0;
+
+ virtual void cancel() = 0;
+
+ virtual void setMaxColumnSize(unsigned int colIndex, unsigned int max) = 0;
+
+ virtual unsigned int getMaxColumnSize(unsigned int colIndex) const = 0;
+
+ virtual bool isNull(unsigned int colIndex) const = 0;
+
+ virtual bool isTruncated(unsigned int paramIndex) const
+ =0;
+
+ virtual void setErrorOnNull(unsigned int colIndex, bool causeException) = 0;
+ virtual void setErrorOnTruncate(unsigned int paramIndex,
+ bool causeException) =0;
+
+ virtual int preTruncationLength(unsigned int paramIndex) const
+ =0;
+
+ virtual int getInt(unsigned int colIndex) = 0;
+
+ virtual unsigned int getUInt(unsigned int colIndex) = 0;
+
+ virtual float getFloat(unsigned int colIndex) = 0;
+
+ virtual double getDouble(unsigned int colIndex) = 0;
+
+ virtual Number getNumber(unsigned int colIndex) = 0;
+
+ virtual OCCI_STD_NAMESPACE::string getString(unsigned int colIndex) = 0;
+
+ virtual Bytes getBytes(unsigned int colIndex) = 0;
+
+ virtual Date getDate(unsigned int colIndex) = 0;
+
+ virtual Timestamp getTimestamp(unsigned int colIndex) = 0;
+
+ virtual Bytes getRowid(unsigned int colIndex) = 0;
+
+ virtual PObject * getObject(unsigned int colIndex) = 0;
+
+ virtual Blob getBlob(unsigned int colIndex) = 0;
+
+ virtual Clob getClob(unsigned int colIndex) =0;
+
+ virtual Bfile getBfile(unsigned int colIndex) = 0;
+
+ virtual IntervalYM getIntervalYM(unsigned int colIndex) =0;
+
+ virtual IntervalDS getIntervalDS(unsigned int colIndex) =0;
+
+ virtual RefAny getRef(unsigned int colIndex) = 0;
+
+ virtual Bytes getRowPosition() const = 0;
+
+ virtual ResultSet * getCursor(unsigned int colIndex) = 0;
+
+ virtual void setDataBuffer(unsigned int colIndex, void *buffer, Type type,
+ sb4 size = 0, ub2 *length = NULL,
+ sb2 *ind = NULL, ub2 *rc = NULL) = 0;
+
+ virtual void setCharSet(unsigned int colIndex,
+ const OCCI_STD_NAMESPACE::string & charSet) = 0;
+
+ virtual OCCI_STD_NAMESPACE::string getCharSet(unsigned int colIndex)
+ const = 0;
+
+ virtual void setBinaryStreamMode(unsigned int colIndex, unsigned int size)
+ = 0;
+
+ virtual void setCharacterStreamMode(unsigned int colIndex, unsigned int size)
+ = 0;
+
+ virtual void setDatabaseNCHARParam(unsigned int paramIndex,
+ bool isNCHAR) = 0;
+
+ virtual bool getDatabaseNCHARParam(unsigned int paramIndex) const = 0;
+
+ virtual Stream * getStream(unsigned int colIndex) = 0;
+
+ virtual void closeStream(Stream *stream) =0;
+
+ virtual unsigned int getCurrentStreamColumn() const= 0;
+
+ virtual unsigned int getCurrentStreamRow() const= 0;
+
+ virtual OCCI_STD_NAMESPACE::vector<MetaData> getColumnListMetaData() const
+ = 0;
+
+ virtual Statement* getStatement() const=0;
+
+ //new interfaces
+
+ virtual BFloat getBFloat(unsigned int colIndex) = 0;
+
+ virtual BDouble getBDouble(unsigned int colIndex) = 0;
+
+ virtual UString getUString(unsigned int colIndex) = 0;
+
+ virtual void setCharSetUString(unsigned int colIndex,
+ const UString & charSet) = 0;
+
+ virtual UString getCharSetUString(unsigned int colIndex)
+ const = 0;
+
+};
+
+
+class Stream
+{
+ public :
+
+ enum Status {READY_FOR_READ, READY_FOR_WRITE, INACTIVE};
+
+ virtual ~Stream(){}
+ virtual int readBuffer(char *buffer, unsigned int size)
+ =0;
+ virtual int readLastBuffer(char *buffer, unsigned int size)
+ =0;
+ virtual void writeBuffer(char *buffer, unsigned int size)
+ =0;
+ virtual void writeLastBuffer(char *buffer, unsigned int size)
+ =0;
+ virtual Status status() const =0;
+
+};
+
+/*---------------------------------------------------------------------------
+ PROTOTYPES USED BY FUNCTION TEMPLATES
+ -------------------------------------------------------------------------*/
+ void getVectorOfPObjects( ResultSet *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector<PObject *> &vect) ;
+ void getVectorOfOCIRefs(ResultSet *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector<void *> &vect) ;
+ void getVectorOfPObjects( Statement *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector<PObject *> &vect) ;
+ void getVectorOfOCIRefs(Statement *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector<void *> &vect) ;
+ void setVectorOfPObjects( Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<PObject *> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVectorOfPObjects( Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<PObject *> &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVectorOfPObjects( Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<PObject *> &vect,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void setVectorOfOCIRefs(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<void *> &vect,
+ const OCCI_STD_NAMESPACE::vector<OCIInd> &vecind,
+ const OCCI_STD_NAMESPACE::string &sqltype) ;
+ void setVectorOfOCIRefs(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<void *> &vect,
+ const OCCI_STD_NAMESPACE::vector<OCIInd> &vecind,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName) ;
+ void setVectorOfOCIRefs(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<void *> &vect,
+ const OCCI_STD_NAMESPACE::vector<OCIInd> &vecind,
+ const UString &schemaName,
+ const UString &typeName) ;
+ void pinVectorOfOCIRefs(const Connection *conn,
+ OCCI_STD_NAMESPACE::vector<void *> & vecRef,
+ OCCI_STD_NAMESPACE::vector<void *> & vecCor,
+ OCCI_STD_NAMESPACE::vector<PObject *> &vecPObj,LockOptions &lockOpt );
+
+
+/*---------------------------------------------------------------------------
+ EXPORT FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+/*------------------------ getVector for objects ---------------------------*/
+/*
+ NAME
+ getVector - overloaded function. Retrieves the attribute in the current
+position as a vector of objects
+
+ PARAMETERS
+ rs - ResultSet
+ vect- reference to vector of objects(OUT parameter).
+
+ DESCRIPTION
+ Retrieves the column in the specified position as a vector of RefAny.
+ The attribute at the current position should be a collection type (varray or
+ nested table). The SQL type of the elements in the collection should be
+ compatible with objects.
+
+ RETURNS
+ nothing
+
+ NOTES
+ compatible SQL types : NTY
+
+ will call getVector(..., vector<PObject*>)
+*/
+#ifdef WIN32COMMON
+// and other platforms that do not support
+// partial function template specialization
+
+template <class T>
+void getVector( ResultSet *rs, unsigned int index,OCCI_STD_NAMESPACE::vector<T>
+& vect)
+{
+ OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+ getVectorOfPObjects(rs, index, vec_pobj);
+
+ vect.clear();
+ unsigned int size = vec_pobj.size();
+ vect.reserve( size );
+ for ( unsigned int i=0; i< size; i++)
+ vect.push_back((T)vec_pobj[i]);
+}
+
+#else
+template <class T>
+void getVector( ResultSet *rs, unsigned int index, OCCI_STD_NAMESPACE::vector<T
+ *> &vect)
+{
+ OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+ getVectorOfPObjects(rs, index, vec_pobj);
+
+ vect.clear();
+ unsigned int size = vec_pobj.size();
+ vect.reserve( size );
+ for (unsigned int i=0; i< size; i++)
+ vect.push_back((T *)vec_pobj[i]);
+}
+#endif
+
+/*------------------------ getVector for objects ---------------------------*/
+/*
+ NAME
+ getVector - overloaded function. Retrieves the attribute in the current
+position as a vector of objects
+
+ PARAMETERS
+ stmt - Statement
+ vect- reference to vector of objects(OUT parameter).
+
+ DESCRIPTION
+ Retrieves the column in the specified position as a vector of RefAny.
+ The attribute at the current position should be a collection type (varray or
+ nested table). The SQL type of the elements in the collection should be
+ compatible with objects.
+
+ RETURNS
+ nothing
+
+ NOTES
+ compatible SQL types : NTY
+
+ will call getVector(..., vector<PObject*>)
+*/
+#ifdef WIN32COMMON
+// and other platforms that do not support
+// partial function template specialization
+
+template <class T>
+void getVector( Statement *stmt, unsigned int index,
+OCCI_STD_NAMESPACE::vector<T> &vect)
+{
+ OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+ getVectorOfPObjects(stmt, index, vec_pobj);
+ vect.clear();
+ unsigned int size = vec_pobj.size();
+ vect.reserve( size );
+ for (unsigned int i=0; i< size; i++)
+ vect.push_back((T)vec_pobj[i]);
+}
+#else
+template <class T>
+void getVector( Statement *stmt, unsigned int index,
+OCCI_STD_NAMESPACE::vector<T *> &vect)
+{
+ OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+ getVectorOfPObjects(stmt, index, vec_pobj);
+ vect.clear();
+ unsigned int size = vec_pobj.size();
+ vect.reserve( size );
+ for (unsigned int i=0; i< size; i++)
+ vect.push_back((T *)vec_pobj[i]);
+}
+#endif
+
+/*------------------------ getVector for Ref<T> ---------------------------*/
+/*
+ NAME
+ getVector - overloaded function. Retrieves the attribute in the current
+position as a vector of Ref<T>
+
+ PARAMETERS
+ rs - ResultSet
+ vect- reference to vector of Ref<T>(OUT parameter).
+
+ DESCRIPTION
+ Retrieves the column in the specified position as a vector of Ref<T>.
+ The attribute at the current position should be a collection type (varray or
+ nested table). The SQL type of the elements in the collection should be
+ compatible with Ref<T>.
+
+ RETURNS
+ nothing
+
+ NOTES
+ compatible SQL types : REF
+*/
+#ifndef WIN32COMMON
+template <class T>
+void getVector( ResultSet *rs, unsigned int index,
+ OCCI_STD_NAMESPACE::vector<Ref<T> > &vect)
+{
+ OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+ getVectorOfOCIRefs(rs, index, vec_ref);
+
+ const Connection *sess = rs->getStatement()->getConnection();
+
+ vect.clear();
+ unsigned int size = vec_ref.size();
+ vect.reserve( size );
+ for (unsigned int i=0; i< size; i++)
+ {
+ if (vec_ref[i] == (OCIRef *)0)
+ vect.push_back(Ref<T>()); // pushing a default-constructed Ref
+ else
+ vect.push_back(Ref<T>(sess, (OCIRef *)vec_ref[i], FALSE));
+ }
+}
+#endif
+
+/*------------------------ setVector for PObject*---------------------------*/
+/*
+ NAME
+ SetVector - overloaded function. Binds the attribute in the current
+ position with a vector of objects.
+
+ PARAMETERS
+ rs - ResultSet
+ vect- reference to vector of objects(OUT parameter).
+
+ DESCRIPTION
+ Binds the column in the specified position with a vector of signed int .
+ The column at the current position should be a collection type (varray or
+ nested table). The SQL type of the elements in the collection should be
+ compatible with objects .
+
+ RETURNS
+ nothing
+
+ NOTES
+ compatible SQL types : SQLT_NTY
+
+ This will be calling setVector(..., vector<PObject*>,..)
+
+*/
+#ifdef WIN32COMMON
+// and other platforms that do not support
+// partial function template specialization
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index,
+ const OCCI_STD_NAMESPACE::vector<T> &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype)
+{
+ OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+ unsigned int size = vect.size();
+ vec_pobj.reserve( size );
+
+ for (unsigned int i = 0; i < size; i++)
+ vec_pobj.push_back((PObject *)vect[i]);
+
+ setVectorOfPObjects(stmt, index, vec_pobj, sqltype);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T> &vect, const OCCI_STD_NAMESPACE::string &schemaName,
+const OCCI_STD_NAMESPACE::string &typeName)
+{
+ OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+ unsigned int size = vect.size();
+ vec_pobj.reserve( size );
+
+ for (unsigned int i = 0; i < size; i++)
+ vec_pobj.push_back((PObject *)vect[i]);
+
+ setVectorOfPObjects(stmt, index, vec_pobj, schemaName, typeName);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T> &vect, const UString &schemaName,
+const UString &typeName)
+{
+ OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+ unsigned int size = vect.size();
+ vec_pobj.reserve( size );
+
+ for (unsigned int i = 0; i < size; i++)
+ vec_pobj.push_back((PObject *)vect[i]);
+
+ setVectorOfPObjects(stmt, index, vec_pobj, schemaName, typeName);
+}
+#else
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T *> &vect, const OCCI_STD_NAMESPACE::string &sqltype)
+{
+ OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+ unsigned int size = vect.size();
+ vec_pobj.reserve( size );
+
+ for (unsigned int i = 0; i < size; i++)
+ vec_pobj.push_back((PObject *)vect[i]);
+
+ setVectorOfPObjects(stmt, index, vec_pobj, sqltype);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T *> &vect, const OCCI_STD_NAMESPACE::string &schemaName,
+const OCCI_STD_NAMESPACE::string &typeName)
+{
+ OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+ unsigned int size = vect.size();
+ vec_pobj.reserve( size );
+
+ for (unsigned int i = 0; i < size; i++)
+ vec_pobj.push_back((PObject *)vect[i]);
+
+ setVectorOfPObjects(stmt, index, vec_pobj, schemaName, typeName);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T *> &vect, const UString &schemaName,
+const UString &typeName)
+{
+ OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+ unsigned int size = vect.size();
+ vec_pobj.reserve( size );
+
+ for (unsigned int i = 0; i < size; i++)
+ vec_pobj.push_back((PObject *)vect[i]);
+
+ setVectorOfPObjects(stmt, index, vec_pobj, schemaName, typeName);
+}
+#endif
+
+/*------------------------ setVector for Ref<T>---------------------------*/
+/*
+ NAME
+ setVector - overloaded function. Binds the attribute in the current
+ position with a vector of Ref<T>.
+
+ PARAMETERS
+ rs - ResultSet
+ vect- reference to vector of REF
+
+ DESCRIPTION
+ Binds the column in the specified position with a vector of signed int .
+ The column at the current position should be a collection type (varray or
+ nested table). The SQL type of the elements in the collection should be
+ compatible with OCIRef* .
+
+ RETURNS
+ nothing
+
+ NOTES
+ compatible SQL types : REF
+
+ This will just call setVector(..., vector<OCIRef*>,..)
+
+
+*/
+#ifndef WIN32COMMON
+template <class T>
+void setVector( Statement *stmt, unsigned int index,
+ const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+ const OCCI_STD_NAMESPACE::string &sqltype)
+{
+ OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+ OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+ unsigned int size = vect.size();
+ vec_ref.reserve( size );
+ vec_ind.reserve( size );
+
+ for (unsigned int i = 0; i < size; i++)
+ {
+ vec_ref.push_back((void *)vect[i].getRef());
+ vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+ }
+
+ setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, sqltype);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index,
+ const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+ const OCCI_STD_NAMESPACE::string &schemaName,
+ const OCCI_STD_NAMESPACE::string &typeName)
+{
+ OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+ OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+ unsigned int size = vect.size();
+ vec_ref.reserve( size );
+ vec_ind.reserve( size );
+
+ for (unsigned int i = 0; i < size; i++)
+ {
+ vec_ref.push_back((void *)vect[i].getRef());
+ vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+ }
+
+ setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, schemaName, typeName);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index,
+ const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+ const UString &schemaName,
+ const UString &typeName)
+{
+ OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+ OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+ unsigned int size = vect.size();
+ vec_ref.reserve( size );
+ vec_ind.reserve( size );
+
+ for (unsigned int i = 0; i < size; i++)
+ {
+ vec_ref.push_back((void *)vect[i].getRef());
+ vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+ }
+
+ setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, schemaName, typeName);
+}
+#endif
+
+/*------------------------ getVector for Ref<T> ---------------------------*/
+/*
+ NAME
+ getVector - overloaded function. Retrieves the attribute in the current
+position as a vector of Ref<T>
+
+ PARAMETERS
+ stmt - Statement
+ vect- reference to vector of Ref<T>(OUT parameter).
+
+ DESCRIPTION
+ Retrieves the column in the specified position as a vector of Ref<T>.
+ The attribute at the current position should be a collection type (varray or
+ nested table). The SQL type of the elements in the collection should be
+ compatible with Ref<T>.
+
+ RETURNS
+ nothing
+
+ NOTES
+ compatible SQL types : REF
+*/
+#ifndef WIN32COMMON
+template <class T>
+void getVector( Statement *stmt, unsigned int index,
+ OCCI_STD_NAMESPACE::vector<Ref<T> > &vect)
+{
+ OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+ getVectorOfOCIRefs(stmt, index, vec_ref);
+
+ const Connection *sess = stmt->getConnection();
+
+ vect.clear();
+ unsigned int size = vec_ref.size();
+ vect.reserve( size );
+ for (unsigned int i=0; i< size; i++)
+ {
+ if (vec_ref[i] == (OCIRef *)0)
+ vect.push_back(Ref <T>()); // pushing a default-constructed Ref
+ else
+ vect.push_back(Ref<T> (sess, (OCIRef *)vec_ref[i], FALSE));
+ }
+
+}
+#endif
+
+// Platform independent get/setVectorOfRefs method added
+// get(set)Vector of Ref<T> and get(set)VectorOfRefs are identical
+// in functionality.
+
+/*------------------------ getVectorOfRefs for Ref<T> ----------------------*/
+/*
+ NAME
+ getVectorOfRefs - overloaded function. Retrieves the attribute in the
+ current position as a vector of Ref<T>
+
+ PARAMETERS
+ rs - ResultSet
+ vect- reference to vector of Ref<T>(OUT parameter).
+
+ DESCRIPTION
+ Retrieves the column in the specified position as a vector of Ref<T>.
+ The attribute at the current position should be a collection type (varray or
+ nested table). The SQL type of the elements in the collection should be
+ compatible with Ref<T>.
+
+ RETURNS
+ nothing
+
+ NOTES
+ compatible SQL types : REF
+*/
+
+template <class T>
+void getVectorOfRefs( ResultSet *rs, unsigned int index,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect)
+{
+ OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+ getVectorOfOCIRefs(rs, index, vec_ref);
+
+ const Connection *sess = rs->getStatement()->getConnection();
+
+ vect.clear();
+ unsigned int size = vec_ref.size();
+ vect.reserve( size );
+ for (unsigned int i=0; i< size; i++)
+ {
+ if (vec_ref[i] == (OCIRef *)0)
+ vect.push_back(Ref<T>()); // pushing a default-constructed Ref
+ else
+ vect.push_back(Ref<T>(sess, (OCIRef *)vec_ref[i], FALSE));
+ }
+}
+
+/*------------------------ setVectorOfRefs for Ref<T>-----------------------*/
+/*
+ NAME
+ setVectorOfRefs - overloaded function. Binds the attribute in the current
+ position with a vector of Ref<T>.
+
+ PARAMETERS
+ rs - ResultSet
+ vect- reference to vector of REF
+
+ DESCRIPTION
+ Binds the column in the specified position with a vector of signed int .
+ The column at the current position should be a collection type (varray or
+ nested table). The SQL type of the elements in the collection should be
+ compatible with OCIRef* .
+
+ RETURNS
+ nothing
+
+ NOTES
+ compatible SQL types : REF
+
+ This will just call setVector(..., vector<OCIRef*>,..)
+
+
+*/
+
+template <class T>
+void setVectorOfRefs( Statement *stmt, unsigned int index,
+const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+const OCCI_STD_NAMESPACE::string &sqltype)
+{
+ OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+ OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+ unsigned int size = vect.size();
+ vec_ref.reserve( size );
+ vec_ind.reserve( size );
+
+ for (unsigned int i = 0; i < size; i++)
+ {
+ vec_ref.push_back((void *)vect[i].getRef());
+ vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+ }
+
+ setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, sqltype);
+}
+
+template <class T>
+void setVectorOfRefs( Statement *stmt, unsigned int index,
+const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+const OCCI_STD_NAMESPACE::string &schemaName,
+const OCCI_STD_NAMESPACE::string &typeName)
+{
+ OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+ OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+ unsigned int size = vect.size();
+ vec_ref.reserve( size );
+ vec_ind.reserve( size );
+
+ for (unsigned int i = 0; i < size; i++)
+ {
+ vec_ref.push_back((void *)vect[i].getRef());
+ vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+ }
+
+ setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, schemaName, typeName);
+}
+
+template <class T>
+void setVectorOfRefs( Statement *stmt, unsigned int index,
+const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+const UString &schemaName,
+const UString &typeName)
+{
+ OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+ OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+ unsigned int size = vect.size();
+ vec_ref.reserve( size );
+ vec_ind.reserve( size );
+
+ for (unsigned int i = 0; i < size; i++)
+ {
+ vec_ref.push_back((void *)vect[i].getRef());
+ vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+ }
+
+ setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, schemaName, typeName);
+}
+
+/*------------------------ getVectorOfRefs for Ref<T> ----------------------*/
+/*
+ NAME
+ getVectorOfRefs - overloaded function. Retrieves the attribute in the
+ current position as a vector of Ref<T>
+
+ PARAMETERS
+ stmt - Statement
+ vect- reference to vector of Ref<T>(OUT parameter).
+
+ DESCRIPTION
+ Retrieves the column in the specified position as a vector of Ref<T>.
+ The attribute at the current position should be a collection type (varray or
+ nested table). The SQL type of the elements in the collection should be
+ compatible with Ref<T>.
+
+ RETURNS
+ nothing
+
+ NOTES
+ compatible SQL types : REF
+*/
+
+template <class T>
+void getVectorOfRefs( Statement *stmt, unsigned int index,
+OCCI_STD_NAMESPACE::vector <Ref<T> > &vect)
+{
+ OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+ getVectorOfOCIRefs(stmt, index, vec_ref);
+
+ const Connection *sess = stmt->getConnection();
+
+ vect.clear();
+ unsigned int size = vec_ref.size();
+ vect.reserve( size );
+ for (unsigned int i=0; i< size; i++)
+ {
+ if (vec_ref[i] == (OCIRef *)0)
+ vect.push_back(Ref <T>()); // pushing a default-constructed Ref
+ else
+ vect.push_back(Ref<T> (sess, (OCIRef *)vec_ref[i], FALSE));
+ }
+}
+/*----------------------------- pinVectorOfRefs---------------------*/
+/*
+ NAME
+ pinVectorOfRefs - array pin implementation
+
+ PARAMETERS
+ conn- Connection object
+ vecRef - vector of OCIRefs *
+ vecCor - vector of OCIComplexObject *
+ vecPOBj - vector of PObject * ( OUT )
+
+ DESCRIPTION
+ implements the array pin of refs passed and returns the corresponding
+ PObject s
+
+ RETURNS
+
+ NOTES
+*/
+template <class T>
+void pinVectorOfRefs( const Connection *conn,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+OCCI_STD_NAMESPACE::vector<T* > &vectObj, LockOptions lockOpt)
+{
+
+ OCCI_STD_NAMESPACE::vector<void *> vecRef;
+ OCCI_STD_NAMESPACE::vector<void *> vecCor;
+ OCCI_STD_NAMESPACE::vector<PObject *> vecPObj;
+ unsigned int sz = vect.size();
+ vecRef.reserve( sz );
+ vecCor.reserve( sz );
+
+ for ( unsigned int i=0; i < sz; i++)
+ {
+ vecRef.push_back((void *)vect[i].getRef());
+ vecCor.push_back((void *)vect[i].getCor());
+ }
+ pinVectorOfOCIRefs(conn, vecRef, vecCor, vecPObj, lockOpt);
+ for ( unsigned int k=0; k < sz; k++)
+ {
+ vectObj.push_back((T *)vecPObj[k]);
+ vect[k].setPinnedObject(vecPObj[k]);
+ }
+}
+
+/*----------------------------- pinVectorOfRefs---------------------*/
+/*
+ NAME
+ pinVectorOfRefs - array pin implementation
+
+ PARAMETERS
+ conn- Connection object
+ vecRef - vector of OCIRefs *
+ vecCor - vector of OCIComplexObject *
+
+ DESCRIPTION
+ implements the array pin of refs passed
+
+ RETURNS
+
+ NOTES
+*/
+template <class T>
+void pinVectorOfRefs( const Connection *conn,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+LockOptions lockOpt)
+{
+
+ OCCI_STD_NAMESPACE::vector<void *> vecRef;
+ OCCI_STD_NAMESPACE::vector<void *> vecCor;
+ OCCI_STD_NAMESPACE::vector<PObject *> vecPObj;
+ unsigned int sz = vect.size();
+ vecRef.reserve( sz );
+ vecCor.reserve( sz );
+
+ for ( unsigned int i=0; i < sz; i++)
+ {
+ vecRef.push_back((void *)vect[i].getRef());
+ vecCor.push_back((void *)vect[i].getCor());
+ }
+ pinVectorOfOCIRefs(conn, vecRef, vecCor,vecPObj, lockOpt);
+ for ( unsigned int k=0; k < sz; k++)
+ vect[k].setPinnedObject(vecPObj[k]);
+}
+
+
+
+/*---------------------------------------------------------------------------
+ INTERNAL FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+} /* end of namespace occi */
+} /* end of namespace oracle */
+#endif /* OCCICONTROL_ORACLE */
+
+#endif /* _olint */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/occiData.h b/src/terralib/drivers/OracleSpatial/OCI/include/occiData.h
new file mode 100644
index 0000000..fe76fe4
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/occiData.h
@@ -0,0 +1,936 @@
+/* Copyright (c) 2000, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ occiData.h - header file for OCCI data classes
+
+ DESCRIPTION
+ Class definitions for Stream, Blob, Clob ,Bfile,
+ Number, Date, IntervalYM, IntervalDS, Time,
+ Timestamp
+
+ RELATED DOCUMENTS
+ <note any documents related to this facility>
+
+ EXPORT FUNCTION(S)
+ <external functions declared for use outside package - one-line descriptions>
+
+ INTERNAL FUNCTION(S)
+ <other external functions declared - one-line descriptions>
+
+ EXAMPLES
+
+ NOTES
+ <other useful comments, qualifications, etc.>
+
+ MODIFIED (MM/DD/YY)
+ shiyer 10/31/03 - Timestamp constructors issue
+ rvallam 10/07/03 - bug 3089939 - add private method in Date to compute
+ hour and min component in daysBetween to be passed
+ to set method of IntervalDS.
+ cparampa 08/21/03 - added toCopy to IntervalDS and IntervalYM
+ cparampa 07/14/03 - make SubscriptionImpl friend of Bytes class.
+ rvallam 02/12/03 - modified BFloat/BDouble interface - BFloat/BDouble
+ type is now a struct
+ cparampa 01/20/03 - made ProducerImpl friend of Bytes class
+ rvallam 11/19/02 - objects support for interval class
+ shiyer 11/15/02 - Add UTF16 support to IntervalYM & IntervalDS
+ cparampa 12/11/02 - removed references to class Payload
+ cparampa 10/12/02 - AQ additions
+ shiyer 10/12/02 - Added UTF16 version of get/set CharsetId in Clob
+ shiyer 09/06/02 - OCCI globalization support
+ aahluwal 06/04/02 - bug 2360115
+ vvinay 02/21/02 - operator= added for Bytes
+ gayyappa 10/23/01 - fix bug 2073327 , use string instead of enum CharSet
+ vvinay 12/21/01 - signed char constructor and cast operator
+ (bug 2073334)
+ binary operator methods not friends any more
+ gayyappa 15/10/01 - add parameter toCopy to Lob/Timestamp private
+ constructors
+ rvallam 04/09/01 - change private constructor in Number to pass
+ parameter by reference and made it const
+ chliang 03/05/01 - disable olint
+ rvallam 01/27/02 - remove #include <ostream>
+ gayyappa 01/17/01 - add methods/operators to Interval and
+ timestamp classes..
+ gayyappa 12/15/00 - interface changes in set methods
+ rvallam 11/29/00 - change method signature in Bytes
+ added 3 new methods in Number
+ rvallam 10/20/00 - change method signatures in Date
+ rvallam 09/15/00 - make StmtImpl/ResultSetImpl friend to
+ interval classes
+ gayyappa 08/21/00 - modified timestamp, interval headers.
+ add OCIEnv to constructor of Bytes.,
+ removed getOCIRaw from Bytes.
+ add const to setVector mthds of anydata.
+ add dvoid* data member to Timestamp/Interval.
+ rvallam 08/10/00 - modified CORE class headers to add friends ,
+ added private constructor in Bytes
+ slari 08/02/00 - comment out Stream
+ rratnam 08/04/00 - updated the LOB stream interface
+ rkasamse 08/07/00 - make getVector friend of Time
+ slari 07/31/00 - add const to Bytes methods
+ slari 07/25/00 - disable Bytes(Bytes *)
+ slari 07/23/00 - add Bytes
+ gayyappa 07/26/00 - update Timestamp, IntervalYM, IntervalDS.
+ gayyappa 07/04/00 - for fixing a problem in occiNumber
+ rratnam 06/13/00 - Updated LOB class headers
+ kmohan 05/31/00 - Change Environment to Environment * in
+ Date constructor
+ kmohan 05/29/00 - No string
+ rkasamse 04/25/00 - Added string class header
+ etucker 04/19/00 - Added CORE class headers
+ kmohan 04/11/00 - Creation
+
+*/
+
+#ifndef _olint /* disable olint check */
+
+#ifndef OCCIDATA_ORACLE
+# define OCCIDATA_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+#ifndef OCCICONTROL_ORACLE
+#include <occiControl.h>
+#endif
+
+namespace oracle {
+namespace occi {
+class Bytes
+{
+
+ public:
+
+ Bytes(const Environment *env = NULL); // default constructor
+
+ Bytes(unsigned char *value, unsigned int count,
+ unsigned int offset = 0, const Environment *env = NULL);
+
+ Bytes(const Bytes &e); // copy constructor
+
+
+ // public methods
+
+ void getBytes(unsigned char *dst, unsigned int count,
+ unsigned int srcBegin = 0,
+ unsigned int dstBegin = 0) const;
+
+ unsigned int length() const;
+
+ unsigned char byteAt(unsigned int index) const;
+
+ bool isNull() const;
+
+ void setNull();
+
+ void operator=(const Bytes &other);
+
+ ~Bytes();
+
+private:
+ // private data members
+ Bytes(OCIEnv *,OCIRaw *) ;
+ Bytes(Ptr<BytesImpl> bytesPtr) ;
+ Ptr<BytesImpl> ptr_;
+ friend class AnyDataImpl;
+ friend class aq::MessageImpl;
+ friend class aq::ProducerImpl;
+ friend class aq::SubscriptionImpl;
+ friend void getVector(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<Bytes> &vect) ;
+ friend void setVector(AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<Bytes> &vect) ;
+
+};
+
+class Bfile
+{
+ public :
+
+ Bfile();
+ Bfile(const Connection *connectionp) ;
+ Bfile(const Bfile &srcBfile) ;
+ ~Bfile();
+ unsigned int length() const ;
+ OCCI_STD_NAMESPACE::string getDirAlias() const ;
+ UString getUStringDirAlias() const ;
+ OCCI_STD_NAMESPACE::string getFileName() const ;
+ UString getUStringFileName() const ;
+ void setName(const OCCI_STD_NAMESPACE::string &dirAlias,
+ const OCCI_STD_NAMESPACE::string &fileName) ;
+ void setName(const UString &dirAlias, const UString &fileName) ;
+ bool fileExists() const ;
+ Bfile& operator =(const Bfile &srcBfile) ;
+ bool operator ==(const Bfile &srcBfile) const ;
+ bool operator !=(const Bfile &srcBfile) const ;
+ void setNull() ;
+ bool isNull() const ;
+ bool isInitialized() const;
+ void open() ;
+ void close() ;
+ bool isOpen() const ;
+ unsigned int read(unsigned int amt, unsigned char *buffer,
+ unsigned int bufsize, unsigned int offset = 1) const ;
+ Stream* getStream(unsigned int offset = 1,
+ unsigned int amount =0) ;
+ void closeStream(Stream *stream);
+
+ private:
+
+ //Data Members:
+
+ // pointer to the FILE locator
+ OCIBFileLocator *filep;
+
+ // pointer to the ConnectionImpl instance
+ const ConnectionImpl *connp;
+
+ // pointer to the LobStreamImpl instance obtained from this FILE
+ LobStreamImpl *streamp;
+
+ void *bfileExt;
+
+ //Enumerations:
+ enum {MAXDIRNAMELEN = 32, MAXFILENAMELEN = 256};
+
+ //Constructor:
+ Bfile(const Connection *connectionp,
+ OCIBFileLocator *locatorp, bool toCopy = true) ;
+
+ //Methods:
+ OCIBFileLocator* getLocator() const;
+ void do_getDirAlias( void * dirAlias, ub2 * dirAliasLen) const ;
+ void do_getFileName( void * fileName, ub2 * fileNameLen) const ;
+ void do_setName( void * alias, ub2 aliasLen,
+ void *fileName, ub2 fileNameLen);
+ // Friends
+ friend class AnyDataImpl;
+ friend class StatementImpl;
+ friend class ResultSetImpl;
+ friend class Blob;
+ friend class Clob;
+ friend class aq::MessageImpl;
+
+ friend void getVector(const AnyData&, OCCI_STD_NAMESPACE::vector<Bfile>&) ;
+ friend void getVector(Statement*, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Bfile>&) ;
+ friend void getVector(ResultSet*, unsigned int ,
+ OCCI_STD_NAMESPACE::vector<Bfile>&) ;
+ friend void setVector(AnyData&, const OCCI_STD_NAMESPACE::vector<Bfile>&) ;
+ friend void do_setVectorOfBfile(Statement*, unsigned int,
+ const OCCI_STD_NAMESPACE::vector<Bfile>&, void *, unsigned int, void *, unsigned int ) ;
+};
+
+class Blob
+{
+ public:
+
+ Blob();
+ Blob(const Connection *connectionp) ;
+ Blob(const Blob &srcBlob) ;
+ ~Blob();
+ unsigned int getChunkSize() const ;
+ unsigned int length() const ;
+ Blob& operator =(const Blob &srcBlob) ;
+ bool operator ==(const Blob &srcBlob) const ;
+ bool operator !=(const Blob &srcBlob) const ;
+ void setNull() ;
+ bool isNull() const ;
+ void setEmpty() ;
+ void setEmpty(const Connection *connectionp) ;
+ bool isInitialized() const;
+ void open(LobOpenMode mode=OCCI_LOB_READWRITE) ;
+ void close() ;
+ bool isOpen() const ;
+ void copy(const Blob &srcBlob, unsigned int numBytes,
+ unsigned int dstOffset =1, unsigned int srcOffset =1) ;
+ void copy(const Bfile &srcBfile, unsigned int numBytes,
+ unsigned int dstOffset =1, unsigned int srcOffset =1) ;
+ void append(const Blob &srcBlob) ;
+ unsigned int read(unsigned int amt, unsigned char *buffer,
+ unsigned int bufsize, unsigned int offset = 1) const ;
+ unsigned int write(unsigned int amt, unsigned char *buffer,
+ unsigned int bufsize, unsigned int offset = 1) ;
+ unsigned int writeChunk(unsigned int amt, unsigned char *buffer,
+ unsigned int bufsize, unsigned int offset = 1) ;
+ void trim(unsigned int newlen) ;
+ Stream* getStream(unsigned int offset = 1,
+ unsigned int amount =0) ;
+ void closeStream(Stream *stream);
+
+ private:
+
+ //Data Members:
+
+ // pointer to the BLOB locator
+ OCIBlobLocator *lobp;
+
+ // pointer to the ConnectionImpl instance
+ const ConnectionImpl *connp;
+
+ // pointer to the LobStreamImpl instance obtained from this LOB
+ LobStreamImpl *streamp;
+
+ //for future use !
+ void *blobExt;
+
+ //Constructor:
+ Blob(const Connection *connectionp,
+ OCIBlobLocator *locatorp, bool toCopy=true) ;
+
+ //Methods:
+ OCIBlobLocator* getLocator() const;
+
+ // Friends
+ friend class AnyDataImpl;
+ friend class StatementImpl;
+ friend class ResultSetImpl;
+
+ friend void getVector(const AnyData&, OCCI_STD_NAMESPACE::vector<Blob>&) ;
+ friend void getVector(Statement*, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Blob>&) ;
+ friend void getVector(ResultSet*, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Blob>&) ;
+ friend void setVector(AnyData&, const OCCI_STD_NAMESPACE::vector<Blob>&) ;
+ friend void do_setVectorOfBlob(Statement*, unsigned int,
+ const OCCI_STD_NAMESPACE::vector<Blob>&, void *, unsigned int, void *, unsigned int ) ;
+};
+
+class Clob
+{
+ public:
+
+ Clob();
+ Clob(const Connection *connectionp) ;
+ Clob(const Clob &srcClob) ;
+ ~Clob();
+ unsigned int getChunkSize() const ;
+ unsigned int length() const ;
+ OCCI_STD_NAMESPACE::string getCharSetId() const;
+ CharSetForm getCharSetForm() const;
+ void setCharSetId( const OCCI_STD_NAMESPACE::string &charset) ;
+ void setCharSetForm( CharSetForm csfrm) ;
+ Clob& operator =(const Clob &srcClob) ;
+ bool operator ==(const Clob &srcClob) const ;
+ bool operator !=(const Clob &srcClob) const ;
+ void setNull() ;
+ bool isNull() const ;
+ void setEmpty() ;
+ void setEmpty(const Connection *connectionp) ;
+ bool isInitialized() const;
+ void open(LobOpenMode mode=OCCI_LOB_READWRITE) ;
+ void close() ;
+ bool isOpen() const ;
+ void copy(const Clob &srcClob, unsigned int numBytes,
+ unsigned int dstOffset = 1, unsigned int srcOffset = 1) ;
+ void copy(const Bfile &srcBfile, unsigned int numBytes,
+ unsigned int dstOffset = 1, unsigned int srcOffset = 1) ;
+ void append(const Clob &srcClob) ;
+ unsigned int read(unsigned int amt, unsigned char *buffer,
+ unsigned int bufsize, unsigned int offset = 1) const;
+ unsigned int read(unsigned int amt, utext *buffer,
+ unsigned int bufsize, unsigned int offset = 1) const;
+ unsigned int write(unsigned int amt, unsigned char *buffer,
+ unsigned int bufsize, unsigned int offset = 1 );
+ unsigned int write(unsigned int amt, utext *buffer,
+ unsigned int bufsize, unsigned int offset = 1 );
+ unsigned int writeChunk(unsigned int amt, unsigned char *buffer,
+ unsigned int bufsize, unsigned int offset = 1 );
+ unsigned int writeChunk(unsigned int amt, utext *buffer,
+ unsigned int bufsize, unsigned int offset = 1 );
+ void trim(unsigned int newlen) ;
+ Stream* getStream(unsigned int offset = 1,
+ unsigned int amount =0 );
+ void closeStream(Stream *stream);
+
+ UString getCharSetIdUString() const;
+ void setCharSetIdUString( const UString &charset) ;
+
+ private:
+
+ //Data Members:
+
+ // pointer to the CLOB locator
+ OCIClobLocator *lobp;
+
+ // pointer to the ConnectionImpl instance
+ const ConnectionImpl *connp;
+
+ // pointer to the LobStreamImpl instance obtained from this LOB
+ LobStreamImpl *streamp;
+
+ //charset id
+ ub2 charsetId;
+
+ //charset form
+ CharSetForm charsetForm;
+
+ //for future use !
+ void *clobExt;
+
+ //Constructor:
+ Clob(const Connection *connectionp,
+ OCIClobLocator *locatorp, bool toCopy =true ) ;
+
+ //Methods:
+ OCIClobLocator* getLocator() const;
+ unsigned int do_read( unsigned int amt, void *buffer,
+ unsigned int bufsize, unsigned int offset) const;
+ unsigned int do_write( unsigned int amt, void *buffer,
+ unsigned int bufsize, unsigned int offset) ;
+ unsigned int do_writeChunk( unsigned int amt, void *buffer,
+ unsigned int bufsize, unsigned int offset) ;
+
+ // Friends
+ friend class AnyDataImpl;
+ friend class StatementImpl;
+ friend class ResultSetImpl;
+
+ friend void getVector(const AnyData&, OCCI_STD_NAMESPACE::vector<Clob>&) ;
+ friend void getVector(Statement*, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Clob>&) ;
+ friend void getVector(ResultSet*, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Clob>&) ;
+ friend void setVector(AnyData&, const OCCI_STD_NAMESPACE::vector<Clob>&) ;
+ friend void do_setVectorOfClob(Statement*, unsigned int,
+ const OCCI_STD_NAMESPACE::vector<Clob>&, void *, unsigned int, void *, unsigned int ) ;
+};
+
+class Number
+{
+
+ public:
+
+ // Constructors
+ /* default constructor added */
+ Number();
+ Number(const Number &srcNum);
+ Number(long double val) ;
+ Number(double val) ;
+ Number(float val) ;
+ Number(long val) ;
+ Number(int val) ;
+ Number(short val) ;
+ Number(char val) ;
+ Number(signed char val);
+ Number(unsigned long val) ;
+ Number(unsigned int val) ;
+ Number(unsigned short val) ;
+ Number(unsigned char val) ;
+
+ ~Number();
+ // Methods
+ const Number abs() const ;
+ // unary negate
+ const Number operator-() ;
+ // unary increment
+ Number& operator++() ;
+ const Number operator++(int) ;
+ // unary decrement
+ Number& operator--() ;
+ const Number operator--(int) ;
+ // assigment operator
+ Number& operator=(const Number &a);
+ // add and assign
+ Number& operator+=(const Number &a) ;
+ // subtract and assign
+ Number& operator-=(const Number &a) ;
+ // Mulitply an assign
+ Number& operator*=(const Number &a) ;
+ // divide and assign
+ Number& operator/=(const Number &a) ;
+ // Modulo and assign
+ Number& operator%=(const Number &a) ;
+ // casting operators
+ operator long() const;
+ operator int() const;
+ operator short() const;
+ operator char() const;
+ operator signed char() const;
+ operator unsigned long() const;
+ operator unsigned int() const;
+ operator unsigned short() const;
+ operator unsigned char() const;
+ operator long double() const;
+ operator double() const;
+ operator float() const;
+ // Decimal shift
+ const Number shift(int val) const ;
+ // Integer Power
+ const Number intPower(int val) const ;
+ const Number ceil() const ;
+ const Number floor() const ;
+ const Number squareroot() const ;
+ const int sign() const ;
+ // conversion routines
+ // Format Number and return as a OCCI_STD_NAMESPACE::string
+ OCCI_STD_NAMESPACE::string toText(const Environment *envp,
+ const OCCI_STD_NAMESPACE::string &fmt,const OCCI_STD_NAMESPACE::string &nlsParam="") const
+ ;
+ UString toText(const Environment *envp,
+ const UString &fmt,const UString &nlsParam) const
+ ;
+ // Create an Number from formatted text
+ void fromText(const Environment *envp,const OCCI_STD_NAMESPACE::string &number,
+ const OCCI_STD_NAMESPACE::string &fmt, const OCCI_STD_NAMESPACE::string &nlsParam = "")
+ ;
+ void fromText(const Environment *envp,
+ const UString &number,
+ const UString &fmt, const UString &nlsParam);
+ void fromBytes(const Bytes &s) ;
+ Bytes toBytes() const;
+ // truncate digits
+ const Number trunc(int decplace) const ;
+ // round to the decplace place.
+ const Number round(int decplace) const ;
+ // returns an Number with digits decimal digits
+ const Number prec(int digits) const ;
+ const Number sin() const ;
+ const Number cos() const ;
+ const Number tan() const ;
+ const Number hypSin() const ;
+ const Number hypCos() const ;
+ const Number hypTan() const ;
+ const Number arcSin() const ;
+ const Number arcCos() const ;
+ const Number arcTan() const ;
+ const Number arcTan2(const Number &val) const;
+ const Number power(const Number &val) const;
+ const Number exp() const ;
+ const Number ln() const ;
+ const Number log(const Number &val) const;
+ bool isNull() const;
+ void setNull();
+ private:
+ /* Private constructor for constructing number from methods inside */
+ Number(const OCINumber &result);
+ OCINumber getOCINumber() const;
+
+ OCINumber data;
+ /* a flag to indicate if the Number is null */
+ bool numberIsNull;
+ void *numberExt;
+
+ // a >= b
+ friend bool operator>=(const Number &a, const Number &b);
+ // a < = b
+ friend bool operator<=(const Number &a, const Number &b);
+ // a > b
+ friend bool operator>(const Number &a, const Number &b);
+ // a < b
+ friend bool operator<(const Number &a, const Number &b);
+
+ friend class IntervalDS;
+ friend class IntervalYM;
+ friend const IntervalYM operator*(const IntervalYM &a,
+ const Number& factor) ;
+ friend const IntervalDS operator*(const IntervalDS &a,
+ const Number& factor) ;
+ friend const IntervalYM operator/(const IntervalYM &a,
+ const Number &factor) ;
+ friend const IntervalDS operator/(const IntervalDS &a,
+ const Number &factor) ;
+ friend class ResultSetImpl;
+ friend class StatementImpl;
+ friend class AnyDataImpl;
+ friend void getVector(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<Number> &vect);
+ friend void setVector(AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+ friend Number MetaData::getNumber(MetaData::AttrId attrid) const ;
+ friend void getVector(Statement *stmt, unsigned int paramIndex,
+ OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+ friend void do_setVectorOfNumber(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Number> &vect, void *schemaName, unsigned int schemaNameLen,
+ void *typeName, unsigned int typeNameLen);
+ friend void getVector(ResultSet *rs, unsigned int colIndex,
+ OCCI_STD_NAMESPACE::vector<Number> &vect);
+
+};
+
+class Date
+{
+ public:
+
+ // Constructors
+ Date();
+ Date(const Date &a);
+ Date(const Environment *envp,int year = 1,unsigned int month = 1,
+ unsigned int day = 1,unsigned int hour = 0,
+ unsigned int minute = 0, unsigned int seconds = 0);
+ ~Date();
+ // Methods
+
+ void setDate(int year = 1,unsigned int month = 1,unsigned int day = 1,
+ unsigned int hour = 0,unsigned int minute = 0,
+ unsigned int seconds = 0);
+ void getDate(int &year,unsigned int &month,unsigned int &day,
+ unsigned int &hour ,unsigned int &min ,unsigned int &sec) const;
+ Bytes toBytes() const ;
+ void fromBytes(const Bytes &byteStream,
+ const Environment *envp = NULL);
+ OCCI_STD_NAMESPACE::string toText(
+ const OCCI_STD_NAMESPACE::string &fmt = "",
+ const OCCI_STD_NAMESPACE::string &nlsParam = "") const;
+ UString toText(
+ const UString &fmt ,
+ const UString &nlsParam ) const;
+ void fromText(const OCCI_STD_NAMESPACE::string &datestr,
+ const OCCI_STD_NAMESPACE::string &fmt = "",
+ const OCCI_STD_NAMESPACE::string &nlsParam = "",
+ const Environment *envp = NULL);
+ void fromText(const UString &datestr,
+ const UString &fmt , const UString &nlsParam ,
+ const Environment *envp = NULL);
+ Date toZone(const OCCI_STD_NAMESPACE::string &zone1, const OCCI_STD_NAMESPACE::string &zone2) const;
+ Date& operator=(const Date &d);
+ Date addMonths(int i) const;
+ Date addDays(int i) const ;
+ Date lastDay() const ;
+ IntervalDS daysBetween(const Date &d) const;
+ Date nextDay(const OCCI_STD_NAMESPACE::string &dow) const;
+ Date nextDay(const UString &dow) const;
+ bool isNull() const;
+ void setNull();
+ static Date getSystemDate(const Environment *envp) ;
+
+ private:
+ OCIDate date;
+ OCIEnv *envhp;
+ bool dateIsNull;
+ void *dateExt;
+
+ /* private constructor */
+ Date(OCIEnv *envp,OCIDate dateval);
+ OCIDate getOCIDate() const;
+ void do_toText( void * fmt, ub1 fmtLen, void * nlsParam,
+ ub4 nlsParamLen, void * buf, ub4 * bufLen,
+ bool isUTF16) const;
+ void do_fromText( void * datestr, ub4 datestrLen,
+ void * fmt, ub1 fmtLen,
+ void * nlsParam, ub4 nlsParamLen,
+ const Environment * envp,
+ bool isUTF16);
+ Date do_nextDay( void * dow, size_t dowLen, bool isUTF16) const;
+ void constructHourAndMinute(sb4 &seconds, sb4 &hours, sb4 &minutes) const;
+ friend bool operator==(const Date &a,const Date &b);
+ friend bool operator>(const Date &a,const Date &b);
+ friend bool operator<(const Date &a,const Date &b);
+ friend bool operator!=(const Date &a,const Date &b);
+ friend bool operator>=(const Date &a,const Date &b);
+ friend bool operator<=(const Date &a,const Date &b);
+ friend class ResultSetImpl;
+ friend class StatementImpl;
+ friend class AnyDataImpl;
+ friend class aq::MessageImpl;
+ friend void getVector(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+ friend void setVector(AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<Date> &vect);
+ friend void getVector(Statement *stmt, unsigned int paramIndex,
+ OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+ friend void do_setVectorOfDate(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Date> &vect, void *schemaName, unsigned int schemaNameLen,
+ void *typeName, unsigned int typeNameLen) ;
+ friend void getVector(ResultSet *rs, unsigned int colIndex,
+ OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+
+}; //class Date
+
+class Timestamp
+{
+ public:
+ Timestamp() ;
+
+ Timestamp( const Environment *env, int year=1,
+ unsigned int month=1, unsigned int day=1, unsigned int hour=0,
+ unsigned int min=0 ,unsigned int sec=0, unsigned int fs=0,
+ int tzhour=0, int tzmin=0) ;
+ Timestamp( const Environment *env, int year,
+ unsigned int month, unsigned int day, unsigned int hour,
+ unsigned int min ,unsigned int sec, unsigned int fs,
+ const OCCI_STD_NAMESPACE::string &timezone);
+ Timestamp( const Environment *env, int year,
+ unsigned int month, unsigned int day, unsigned int hour,
+ unsigned int min ,unsigned int sec, unsigned int fs,
+ const UString &timezone);
+ Timestamp( const Timestamp &src) ;
+ ~Timestamp();
+
+ void getTimeZoneOffset( int &hour, int &minute) const ;
+ void getTime( unsigned int &hour, unsigned int &minute,
+ unsigned int &second, unsigned int &fs) const ;
+ void getDate( int &year, unsigned int &month, unsigned int &day )const ;
+ OCCI_STD_NAMESPACE::string toText(const OCCI_STD_NAMESPACE::string &fmt,
+ unsigned int fsprec,
+ const OCCI_STD_NAMESPACE::string &nlsParam ="") const ;
+ UString toText(const UString &fmt,
+ unsigned int fsprec, const UString &nlsParam ) const ;
+ void setTimeZoneOffset( int hour, int minute) ;
+ void setTime( unsigned int hour, unsigned int minute,
+ unsigned int second, unsigned int fs) ;
+ void setDate( int year, unsigned int month, unsigned int day ) ;
+ void setNull() ;
+ void fromText( const OCCI_STD_NAMESPACE::string ×tmpStr,
+ const OCCI_STD_NAMESPACE::string &fmt ,
+ const OCCI_STD_NAMESPACE::string &nlsParam= "",
+ const Environment *env =NULL);
+ void fromText( const UString ×tmpStr,
+ const UString &fmt , const UString &nlsParam,
+ const Environment *env =NULL);
+ bool isNull() const;
+ Timestamp & operator =( const Timestamp &src) ;
+ const IntervalYM subYM(const Timestamp& val) const ;
+ const IntervalDS subDS(const Timestamp& val) const ;
+ const Timestamp intervalAdd(const IntervalDS& val) const ;
+ const Timestamp intervalSub(const IntervalDS& val) const ;
+ const Timestamp intervalAdd(const IntervalYM& val) const ;
+ const Timestamp intervalSub(const IntervalYM& val) const ;
+
+ friend bool operator==(const Timestamp &a,const Timestamp &b);
+ friend bool operator>(const Timestamp &a,const Timestamp &b);
+ friend bool operator<(const Timestamp &a,const Timestamp &b);
+ friend bool operator !=(const Timestamp &a,const Timestamp &b);
+ friend bool operator >=(const Timestamp &a,const Timestamp &b);
+ friend bool operator <=(const Timestamp &a,const Timestamp &b);
+
+ friend class ResultSetImpl;
+ friend class StatementImpl;
+ friend class AnyDataImpl;
+
+ private:
+ OCIDateTime *ocidatetime;
+ OCIEnv *ocienv;
+ void *timestampExt;
+
+ OCIDateTime *getOCIDateTime() const;
+ Timestamp( OCIEnv *env, OCIDateTime *dt, bool toCopy = true) ;
+ void allocateDataMembers( OCIEnv *env) ;
+ void do_TimestampConstruct( const Environment *env, int year,
+ unsigned int month, unsigned int day, unsigned int hour, unsigned int min,
+ unsigned int sec, unsigned int fs, void *tzinter);
+
+ friend void getVector(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<Timestamp> &vect);
+ friend void setVector(AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+ friend Timestamp MetaData::getTimestamp(
+ MetaData::AttrId attrid) const ;
+ friend void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+ friend void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+ friend void do_setVectorOfTimestamp(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<Timestamp> &vect, void *schemaName, unsigned int schemaNameLen,
+ void *typeName, unsigned int typeNameLen) ;
+}; // class Timestamp
+
+class IntervalDS
+{
+
+ public:
+ IntervalDS() ;
+ IntervalDS( const Environment *env,int day=0,
+ int hour=0, int minute=0, int second=0,
+ int fs=0) ;
+ IntervalDS( const IntervalDS &src) ;
+
+ ~IntervalDS();
+
+ int getDay () const ;
+ int getHour () const ;
+ int getMinute () const ;
+ int getSecond() const ;
+ int getFracSec () const ;
+ void set( int day, int hour, int minute, int second, int fracsec) ;
+ void setNull() ;
+ void fromText( const OCCI_STD_NAMESPACE::string &inpstr, const OCCI_STD_NAMESPACE::string &nlsParam ="",
+ const Environment *env=NULL) ;
+ OCCI_STD_NAMESPACE::string toText( unsigned int lfprec, unsigned int fsprec,
+ const OCCI_STD_NAMESPACE::string &nlsParam="") const ;
+ bool isNull() const;
+ IntervalDS& operator =( const IntervalDS &src) ;
+ IntervalDS& operator +=( const IntervalDS &a);
+ IntervalDS& operator -=( const IntervalDS &a);
+ IntervalDS& operator *=( const Number &factor);
+ IntervalDS& operator /=( const Number &factor);
+
+ friend bool operator>(const IntervalDS &a,
+ const IntervalDS &b) ;
+ friend bool operator<(const IntervalDS &a,
+ const IntervalDS &b) ;
+ friend bool operator >=( const IntervalDS &a,
+ const IntervalDS &b);
+ friend bool operator <=( const IntervalDS &a,
+ const IntervalDS &b);
+
+ //UTF16 support
+ void fromUText( const UString &inpstr, const Environment *env=NULL );
+ UString toUText( unsigned int lfprec, unsigned int fsprec) const;
+
+ private:
+ OCIInterval *ociinter;
+ OCIEnv *ocienv;
+ void *intervalDSExt;
+
+ IntervalDS( OCIEnv *env, OCIInterval *inter, bool toCopy = true) ;
+ OCIInterval * getOCIInterval() const;
+
+ void allocateDataMembers( OCIEnv *env) ;
+ friend const IntervalDS Timestamp::subDS(
+ const Timestamp& val) const ;
+ friend const Timestamp Timestamp::intervalAdd(
+ const IntervalDS& val) const ;
+ friend const Timestamp Timestamp::intervalSub(
+ const IntervalDS& val) const ;
+ friend class Date;
+ friend void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+ friend void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+ friend void do_setVectorOfIntervalDS(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect, void *schemaName, unsigned int schemaNameLen,
+ void *typeName, unsigned int typeNameLen) ;
+ friend class StatementImpl;
+ friend class ResultSetImpl;
+ friend class AnyDataImpl;
+ friend void getVector(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<IntervalDS> &vect);
+ friend void setVector(AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+
+
+}; //class IntervalDS
+
+class IntervalYM
+{
+
+ public:
+ IntervalYM() ;
+ IntervalYM( const Environment *env,int year=0, int month=0) ;
+ IntervalYM( const IntervalYM &src) ;
+ ~IntervalYM();
+
+ int getYear() const ;
+ int getMonth() const ;
+
+ void set( int year, int month) ;
+ void setNull() ;
+ void fromText( const OCCI_STD_NAMESPACE::string &inpstr, const OCCI_STD_NAMESPACE::string &nlsParam="",
+ const Environment *env=NULL) ;
+ OCCI_STD_NAMESPACE::string toText( unsigned int lfprec, const OCCI_STD_NAMESPACE::string &nlsParam="") const;
+ bool isNull() const;
+ IntervalYM & operator =( const IntervalYM &src) ;
+ IntervalYM& operator +=( const IntervalYM &a);
+ IntervalYM& operator -=( const IntervalYM &a);
+ IntervalYM& operator *=( const Number &factor);
+ IntervalYM& operator /=( const Number &factor);
+
+ friend bool operator>(const IntervalYM &a, const IntervalYM &b) ;
+ friend bool operator<( const IntervalYM &a, const IntervalYM &b) ;
+ friend bool operator >=(const IntervalYM &a, const IntervalYM &b);
+ friend bool operator <=(const IntervalYM &a, const IntervalYM &b);
+
+ //UTF16 support
+ void fromUText( const UString &inpstr, const Environment *env=NULL );
+ UString toUText( unsigned int lfprec ) const;
+
+ private:
+ OCIInterval *ociinter;
+ OCIEnv *ocienv;
+ void *intervalYMExt;
+
+ IntervalYM( OCIEnv *env, OCIInterval *inter, bool toCopy = true) ;
+ OCIInterval *getOCIInterval() const;
+ void allocateDataMembers( OCIEnv *env) ;
+ friend const IntervalYM Timestamp :: subYM(
+ const Timestamp& val) const ;
+ friend const Timestamp Timestamp::intervalAdd(
+ const IntervalYM &val) const ;
+ friend const Timestamp Timestamp::intervalSub(
+ const IntervalYM &val) const ;
+
+ friend void getVector(ResultSet *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+ friend void getVector(Statement *rs, unsigned int,
+ OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+ friend void do_setVectorOfIntervalYM(Statement *stmt, unsigned int paramIndex,
+ const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect, void *schemaName, unsigned int schemaNameLen,
+ void *typeName, unsigned int typeNameLen) ;
+
+ friend class StatementImpl;
+ friend class ResultSetImpl;
+ friend class AnyDataImpl;
+ friend void getVector(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<IntervalYM> &vect);
+ friend void setVector(AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+
+}; //class IntervalYM
+
+
+Number operator+(const Number &a, const Number &b) ;
+Number operator/(const Number ÷nd, const Number &divisor) ;
+Number operator*(const Number &a, const Number &b) ;
+Number operator%(const Number &a, const Number &b) ;
+Number operator-(const Number &subtrahend, const Number &subtractor) ;
+bool operator==(const Number &a, const Number &b);
+bool operator!=(const Number &a, const Number &b);
+
+const IntervalYM operator+(const IntervalYM &a, const IntervalYM &b) ;
+const IntervalYM operator-(const IntervalYM &a, const IntervalYM &b) ;
+const IntervalYM operator*(const IntervalYM &a, const Number& factor);
+const IntervalYM operator/(const IntervalYM &a, const Number &factor);
+bool operator==(const IntervalYM &a, const IntervalYM &b) ;
+bool operator!=(const IntervalYM &a, const IntervalYM &b) ;
+
+const IntervalDS operator+(const IntervalDS &a, const IntervalDS &b) ;
+const IntervalDS operator-(const IntervalDS &a, const IntervalDS &b) ;
+const IntervalDS operator*(const IntervalDS &a, const Number& factor);
+const IntervalDS operator/(const IntervalDS &a, const Number &factor);
+bool operator==(const IntervalDS &a, const IntervalDS &b) ;
+bool operator!=(const IntervalDS &a, const IntervalDS &b) ;
+
+
+typedef struct BFloat
+{
+ float value;
+ bool isNull;
+
+ BFloat()
+ {
+ isNull = false;
+ value = 0.;
+ }
+} BFloat;
+
+typedef struct BDouble
+{
+ double value;
+ bool isNull;
+
+ BDouble()
+ {
+ isNull = false;
+ value = 0.;
+ }
+} BDouble;
+
+/*---------------------------------------------------------------------------
+ EXPORT FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ INTERNAL FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+} /* end of namespace occi */
+} /* end of namespace oracle */
+#endif /* OCCIDATA_ORACLE */
+
+#endif /* _olint */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/occiObjects.h b/src/terralib/drivers/OracleSpatial/OCI/include/occiObjects.h
new file mode 100644
index 0000000..35d0c0e
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/occiObjects.h
@@ -0,0 +1,990 @@
+/* Copyright (c) 2000, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ occiObjects.h - header file for OCCI object classes
+
+ DESCRIPTION
+ Class definitions for Ref, RefAny, AnyData
+
+ RELATED DOCUMENTS
+ <note any documents related to this facility>
+
+ EXPORT FUNCTION(S)
+ <external functions declared for use outside package - one-line
+ descriptions>
+
+ INTERNAL FUNCTION(S)
+ <other external functions declared - one-line descriptions>
+
+ EXAMPLES
+
+ NOTES
+ <other useful comments, qualifications, etc.>
+
+ MODIFIED (MM/DD/YY)
+ cparampa 10/28/03 - add PObject::getSQLTypeName
+ shiyer 01/01/03 - add PObject::refresh
+ cparampa 02/19/03 - bug2732941-setFromRef takes schema and typename
+ rvallam 02/12/03 - modify Bfloat/Bdouble interface to use the new
+ Bfloat/Bdouble type
+ rvallam 11/19/02 - objects support for interval classes
+ cparampa 12/26/02 - Added getType for AnyData,
+ removed getAs/setFrom methods for Blob/Clob
+ cparampa 10/12/02 - making AnyData a public type
+ rvallam 10/12/02 - added method getCor to get the COR handle and the
+ setPinnedObject method - arrayPin
+ rvallam 10/10/02 - objects performance enhancement - modified
+ getObject and getVector<T *> to take the
+ schName and typeName of the object
+ rvallam 10/11/02 - added native float/double API - get(set) methods
+ for AnyData class
+ shiyer 09/17/02 - Refs performance improvement
+ shiyer 08/14/02 - 10iR1, OCCI Globalization support
+ aahluwal 06/04/02 - bug 2360115
+ vvinay 12/24/01 - declarations for setNull() and isClear() in RefImpl
+ rvallam 11/17/01 - implemented transactional consistency of refs
+ gayyappa 10/01/01 - reserve memory for vectors in set/getVector
+ rkasamse 07/31/01 - add PObject::new(size_t, void*)
+ gayyappa 07/17/01 - use C style comment in end of #ifdef WIN32COMMON.
+ gayyappa 06/20/01 - fix linux porting bug 1801312.
+ rvallam 06/14/01 - replace call to get(set)VectorOfRefs in
+ get(set)Vector for Ref<T> with code in
+ get(set)VectorOfRefs
+ rvallam 11/06/01 - renamed internal methods in get/setVector to
+ get(set)VectorOfPObjects/get(set)VectorOfOCIRefs
+ as part of NT porting fix
+ added destructor to AnyData
+ rratnam 06/07/01 - fixed bug 1816387.
+ rvallam 06/07/01 - fixed bug 1811749 :replaced .data() to .c_str()
+ for string to char* conversion.
+ rvallam 04/30/01 - modified const methods in Ref (->, *, ptr)
+ rvallam 04/12/01 - passed dummy argument OCCIPOBJECT in getVector
+ of AnyData for PObject *
+ rvallam 04/09/01 - fixed bug 1721365- call RefAny default constructor
+ for a NULL Ref in operator RefAny
+ gayyappa 03/29/01 - remove methods for get/set int/float/double/unsigned
+ int , wasLastAttrNull, setAttrNull , geSQLTypeName
+ from AnyData
+ as OTT does not use them.
+ gayyappa 03/15/01 - add OCCItype parameter to getVector for OCCIRef.
+ rratnam 03/15/01 - fixed set and getRef / get and setVector for NULL
+ Refs, fixed NT compilation errors
+ rratnam 03/13/01 - changed AnyData constructor to take a freeImg flag,
+ rkasamse 03/15/01 - pass OCCI_SQLT_REF to getVector
+ chliang 03/05/01 - disable olint.
+ rvallam 03/01/01 - changed getSessionPtr() to getConnection()
+ added const methods for dereferencing in Ref
+ gayyappa 02/23/01 - correct template code for setVector
+ gayyappa 12/13/00 - remove allocator from list member for PObject.
+ bug#1529973
+ nullify object pointer in clear method of Ref
+ rvallam 11/08/00 - make RefAny constructor public
+ gayyappa 08/21/00 - replace objPtr by objptr.
+ move templated get/set vector code of anydata
+ to header.
+ rkasamse 08/07/00 - make getVector friend of RefAny
+ rkasamse 07/11/00 - take void* instead of AnyDataCtx*
+ rkasamse 07/26/00 - make ResultSetImp friend of RefAny
+ rratnam 06/19/00 - added getConnection in PObject
+ rvallam 06/13/00 - added Ref<T> and occiRefImpl code
+ rvallam 06/05/00 - to add the Ref<T> code
+ kmohan 06/02/00 -
+ kmohan 05/31/00 - Datamember Connection * changed to ConnectionImpl *
+ in class RefAny
+ kmohan 04/11/00 - Ref, RefAny, AnyData class definitions
+ added
+ rkasamse 04/03/00 - header (interface) files for OCCI Objects clases
+ rkasamse 04/03/00 - Creation
+
+*/
+
+#ifndef _olint /* disable olint check */
+
+#ifndef OCCIOBJECTS_ORACLE
+# define OCCIOBJECTS_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+namespace oracle {
+namespace occi {
+struct AnyDataCtx {
+ ConnectionImpl *occiSession;
+ OCIAnyData *anyData;
+ dvoid *objHeader;
+ ub4 errNum;
+};
+typedef struct AnyDataCtx AnyDataCtx;
+
+class PObject
+{
+ public:
+ enum LockOption {OCCI_LOCK_WAIT, OCCI_LOCK_NOWAIT};
+ enum UnpinOption {OCCI_PINCOUNT_DECR, OCCI_PINCOUNT_RESET};
+ static void destroy(void *);
+ static void refresh(void *);
+ PObject();
+ PObject(const void *ctx);
+ PObject(const PObject& obj);
+ virtual ~PObject();
+ PObject& operator=(const PObject& obj);
+ void *operator new(size_t size);
+ void *operator new(size_t size, const Connection *x,
+ const OCCI_STD_NAMESPACE::string& tablename,
+ const char *typeName);
+ void *operator new(size_t size, const Connection *sess,
+ const OCCI_STD_NAMESPACE::string& tablename,
+ const OCCI_STD_NAMESPACE::string& typName ,
+ const OCCI_STD_NAMESPACE::string& schTabName="",
+ const OCCI_STD_NAMESPACE::string& schTypName = "");
+ void *operator new(size_t size, const Connection *sess,
+ const UString& tablename, const UString &typName,
+ const UString& schTabName, const UString& schTypName);
+ void *operator new(size_t size, void *adctx);
+ void operator delete(void *obj, size_t size);
+ RefAny getRef() const;
+ bool isLocked() const;
+ void unpin(UnpinOption mode=OCCI_PINCOUNT_DECR);
+ void pin();
+ void lock(PObject::LockOption lock_option);
+ void unmark();
+ void flush();
+ void markDelete();
+ void markModified();
+ bool isNull() const;
+ void setNull();
+ const Connection *getConnection() const;
+ virtual OCCI_STD_NAMESPACE::string getSQLTypeName() const = 0;
+ virtual void getSQLTypeName(Environment *env, void **schName,
+ unsigned int &schNameLen, void **typeName,
+ unsigned int &typeNameLen) const = 0;
+ void getSQLTypeName(Environment *env, void *(*rSQL)(void *),
+ void **schname, unsigned int &schnamelen,
+ void **typname, unsigned int &typnamelen) const;
+ virtual void writeSQL(AnyData& stream) = 0;
+ virtual void readSQL(AnyData& stream) = 0;
+ private:
+ static void initialise( void * obj, const Connection * sess,
+ void *schTabName, unsigned int schTabLen,
+ void *tableName, unsigned int tabLen,
+ void *schTypName, unsigned int schTypLen,
+ void *typeName, unsigned int typLen);
+
+ ConnectionImpl *occiSession_;
+ dvoid *objHeader_;
+ ub2 customNewed_;
+ enum {CUSTOM_NEWED = 0x5cde};
+ ub2 flags_;
+ enum {NULL_INFO = 0x0001, GARBAGE_COLLECTED = 0x0002,
+ REFRESH_OBJECT = 0x0004};
+ // for future use
+ void *pobjectExt;
+ friend class RefImpl;
+};
+
+class AnyData
+{
+ public:
+ ~AnyData();
+ AnyData(void *any) ;
+ AnyData(const Connection *sessp);
+ AnyData(const Connection *sessp, OCIAnyData *any, bool freeImg = true) ;
+
+ AnyData(const AnyData &src);
+ AnyData& operator = (const AnyData &src);
+
+ OCIAnyData* getOCIAnyData() const;
+ const Connection* getConnection() const;
+
+
+ bool isNull() const ;
+ void setNull() ;
+ OCCI_STD_NAMESPACE::string getString() const ;
+ UString getUString() const ;
+ Blob getBlob() const ;
+ Clob getClob() const ;
+ Bfile getBfile() const ;
+ BFloat getBFloat() const ;
+ BDouble getBDouble() const ;
+ Number getNumber() const ;
+ Bytes getBytes() const ;
+ Date getDate() const ;
+ Timestamp getTimestamp() const ;
+ IntervalYM getIntervalYM() const ;
+ IntervalDS getIntervalDS() const ;
+ PObject *getObject(void *(*rSQL)(void *)) const ;
+ RefAny getRef() const ;
+
+ void setString(const OCCI_STD_NAMESPACE::string &str) ;
+ void setUString(const UString &str) ;
+ void setBlob(const Blob &blob) ;
+ void setClob(const Clob &clob) ;
+ void setBfile(const Bfile &bfile) ;
+ void setBFloat(const BFloat &n) ;
+ void setBDouble(const BDouble &n) ;
+ void setNumber(const Number &n) ;
+ void setBytes(const Bytes &bytes) ;
+ void setDate(const Date &date) ;
+ void setTimestamp(const Timestamp ×tamp) ;
+ void setIntervalYM(const IntervalYM &intervalym) ;
+ void setIntervalDS(const IntervalDS &intervalds) ;
+ void setObject(const PObject *objptr) ;
+ void setRef(const RefAny &ref) ;
+
+ void setFromString(const OCCI_STD_NAMESPACE::string &str) ;
+ void setFromBfile(const Bfile &bfile) ;
+ void setFromBFloat(const BFloat &n) ;
+ void setFromBDouble(const BDouble &n) ;
+ void setFromNumber(const Number &n) ;
+ void setFromBytes(const Bytes &bytes) ;
+ void setFromDate(const Date &date) ;
+ void setFromTimestamp(const Timestamp ×tamp) ;
+ void setFromIntervalYM(const IntervalYM &intervalym) ;
+ void setFromIntervalDS(const IntervalDS &intervalds) ;
+ void setFromObject(const PObject *objptr) ;
+ void setFromRef(const RefAny &ref,
+ const OCCI_STD_NAMESPACE::string &typname,
+ const OCCI_STD_NAMESPACE::string &schname) ;
+
+ OCCI_STD_NAMESPACE::string getAsString() const ;
+ Bfile getAsBfile() const ;
+ BFloat getAsBFloat() const ;
+ BDouble getAsBDouble() const ;
+ Number getAsNumber() const ;
+ Bytes getAsBytes() const ;
+ Date getAsDate() const ;
+ Timestamp getAsTimestamp() const ;
+ IntervalYM getAsIntervalYM() const ;
+ IntervalDS getAsIntervalDS() const ;
+ PObject *getAsObject() const ;
+ RefAny getAsRef() const ;
+
+ TypeCode getType() const;
+
+ private:
+
+
+ // private data members
+ Ptr<AnyDataImpl> anyDataImplPtr;
+
+
+};
+
+template <class T>
+class Ref
+{
+ public:
+
+ Ref();
+ Ref(const T *obj) ;
+ Ref(const RefAny &refAny) ;
+ Ref(const Ref<T> &src) ;
+ Ref(const Connection *sessp, OCIRef *tref, bool copy=TRUE)
+ ;
+ ~Ref();
+ Ref<T>& operator=(const Ref<T> &src)
+ ;
+ Ref<T>& operator=(const T *obj) ;
+ Ref<T>& operator=(const RefAny &src);
+ T * operator->() ;
+ T * ptr() ;
+ T & operator *() ;
+ const T * operator->() const;
+ const T * ptr() const;
+ const T & operator *() const ;
+ void markDelete() ;
+ void unmarkDelete() ;
+ void setNull();
+ bool isNull() const;
+ void clear() ;
+ bool isClear() const;
+ void setPrefetch(const OCCI_STD_NAMESPACE::string &typeName,
+ unsigned int depth);
+ void setPrefetch(const OCCI_STD_NAMESPACE::string &schName,
+ const OCCI_STD_NAMESPACE::string &typeName,
+ unsigned int depth);
+ void setPrefetch(const UString &schName,
+ const UString &typeName,
+ unsigned int depth);
+ void setPrefetch(unsigned int depth) ;
+ void setLock(LockOptions );
+ operator RefAny() const;
+ OCIRef *getRef() const;
+ const Connection *getConnection() const;
+ bool operator == (const Ref<T> &ref) const;
+ bool operator != (const Ref<T> &ref) const;
+ bool operator == (const RefAny &refAnyR) const ;
+ bool operator != (const RefAny &refAnyR) const ;
+ OCIComplexObject *getCor() const;
+ void destroy();
+ void setPinnedObject(PObject *objPtr);
+ private:
+
+ RefImpl *rimplPtr;
+};
+
+
+class RefImpl
+{
+ public:
+
+ RefImpl();
+ RefImpl(PObject *obj) ;
+ RefImpl(const RefAny &refAny) ;
+ RefImpl(const RefImpl &src) ;
+ RefImpl(const Connection *sessp, OCIRef *tref,
+ bool copy=TRUE) ;
+ ~RefImpl();
+ bool isNull() const ;
+ void setNull() ;
+ void markDelete() ;
+ void unmarkDelete() ;
+ void clear() ;
+ bool isClear() const ;
+ void setPrefetch(const OCCI_STD_NAMESPACE::string &typeName,
+ unsigned int depth) ;
+ void setPrefetch(const OCCI_STD_NAMESPACE::string &schName,
+ const OCCI_STD_NAMESPACE::string &typeName,
+ unsigned int depth);
+ void setPrefetch(const UString &schName,
+ const UString &typeName,
+ unsigned int depth);
+ void setPrefetch(unsigned int depth) ;
+ void setLock(LockOptions lckOption) ;
+ PObject *pin() ;
+ void unpin(PObject *obj) ;
+ void setRefFromObjPtr(const PObject *obj) ;
+ OCIRef* getRef() const;
+ void setRefImpl(RefImpl *rptr);
+ const Connection * getConnection() const;
+ bool operator == (const RefImpl &refI) const ;
+ bool operator == (const RefAny &refAnyR) const ;
+ void assignObj(PObject *newObjPtr) ;
+ void assignRefAny(const RefAny &src) ;
+ // added following methods
+ bool isEqual(PObject *obj);
+ void operator = ( const RefImpl &src);
+ void destroy();
+ OCIComplexObject *getCor() const;
+ void setPinnedObject( PObject *objPtr);
+ private:
+
+ OCIRef *ref;
+ const ConnectionImpl *sessp;
+ OCIComplexObject *corhp;
+ OCCI_STD_NAMESPACE::list<void *> descriptorList;
+ LockOptions lockOption;
+ // added data member for object header
+ dvoid *objHeader;
+ //common implementation function for setPrefetch
+ void do_setPrefetch(void *schName, unsigned int schNameLen,
+ void *typeName, unsigned int typeNameLen,
+ unsigned int depth);
+};
+
+
+class RefAny
+{
+ public:
+
+ RefAny();
+ RefAny (const Connection *sessptr, const OCIRef *ref);
+ RefAny (const Connection *sessptr, const OCIRef *ref, bool isowner);
+ ~RefAny() ;
+ RefAny(const RefAny& src) ;
+ RefAny& operator=(const RefAny& src) ;
+ void markDelete() ;
+ void unmarkDelete() ;
+ void clear() ;
+ bool isNull() const;
+ OCIRef * getRef() const;
+ const Connection * getConnection() const;
+ bool operator == (const RefAny &refAnyR) const;
+ bool operator != (const RefAny &refAnyR) const;
+ bool isOwner() const;
+
+ private:
+
+ OCIRef *ref;
+ const ConnectionImpl *sessp;
+ // for future use
+ void *refanyExt;
+ bool owner;
+
+ friend RefAny MetaData::getRef(MetaData::AttrId) const;
+ friend RefAny PObject::getRef() const;
+ friend class AnyDataImpl;
+ friend class ResultSetImpl;
+ friend class StatementImpl;
+ friend void getVector(const ResultSet *rs,
+ unsigned int colIndex,
+ OCCI_STD_NAMESPACE::vector<RefAny> &vect) ;
+ friend void getVector(const Statement *stmt,
+ unsigned int colIndex,
+ OCCI_STD_NAMESPACE::vector<RefAny> &vect) ;
+};
+
+template <class T>
+Ref<T>::Ref()
+{
+ rimplPtr = new RefImpl();
+}
+
+template <class T>
+Ref<T>::Ref(const T *obj)
+{
+ rimplPtr = new RefImpl((PObject *)obj);
+}
+
+template <class T>
+Ref<T>::Ref(const RefAny &refAny)
+
+{
+ rimplPtr = new RefImpl(refAny);
+}
+
+template <class T>
+Ref<T>::Ref(const Ref<T>& src)
+
+{
+ rimplPtr = new RefImpl(*(src.rimplPtr));
+}
+
+template <class T>
+Ref<T>::Ref(const Connection *sessp, OCIRef *tref, bool copy)
+
+{
+ rimplPtr = new RefImpl(sessp, tref, copy);
+}
+
+template <class T>
+Ref<T>::~Ref()
+{
+ delete rimplPtr;
+}
+
+
+template <class T>
+Ref<T>& Ref<T>::operator=(const Ref<T> &src)
+{
+ if (&src == this)
+ return *this;
+ *rimplPtr = *(src.rimplPtr);
+ return *this;
+}
+
+template <class T>
+Ref<T>& Ref<T>::operator=(const T *obj)
+{
+ if (rimplPtr->isEqual((PObject *)obj))
+ return *this;
+ rimplPtr->assignObj((PObject *)obj);
+ return *this;
+}
+
+template <class T>
+Ref<T>& Ref<T>::operator=(const RefAny &src)
+{
+ rimplPtr->assignRefAny(src);
+ return *this;
+}
+
+template <class T>
+T* Ref<T>::operator->()
+{
+ return ((T *)rimplPtr->pin());
+}
+
+template <class T>
+T* Ref<T>::ptr()
+{
+ return ((T *)rimplPtr->pin());
+}
+
+template <class T>
+T& Ref<T>::operator * ()
+{
+ return ((T &)(*(rimplPtr->pin())));
+}
+
+template <class T>
+const T* Ref<T>::operator->() const
+{
+ return ((const T *)rimplPtr->pin());
+}
+
+template <class T>
+const T* Ref<T>::ptr() const
+{
+ return ((const T *)rimplPtr->pin());
+}
+
+template <class T>
+const T& Ref<T>::operator * () const
+{
+ return ((const T &)(*(rimplPtr->pin())));
+}
+
+template <class T>
+void Ref<T>::markDelete ()
+{
+ rimplPtr->markDelete();
+}
+
+template <class T>
+void Ref<T>::unmarkDelete ()
+{
+ rimplPtr->unmarkDelete();
+}
+
+template <class T>
+void Ref<T>::setNull()
+{
+ rimplPtr->setNull();
+}
+
+template <class T>
+bool Ref<T>::isNull() const
+{
+ return rimplPtr->isNull();
+}
+
+template <class T>
+void Ref<T>::clear ()
+{
+ rimplPtr->clear();
+}
+
+template <class T>
+bool Ref<T>::isClear() const
+{
+ return rimplPtr->isClear();
+}
+
+template <class T>
+void Ref<T>::setPrefetch (const OCCI_STD_NAMESPACE::string &typeName,
+unsigned int depth)
+
+{
+ rimplPtr->setPrefetch(typeName,depth);
+}
+
+template <class T>
+void Ref<T>::setPrefetch (const OCCI_STD_NAMESPACE::string &schemaName,
+const OCCI_STD_NAMESPACE::string &typeName,
+unsigned int depth)
+
+{
+ rimplPtr->setPrefetch(schemaName,typeName,depth);
+}
+
+template <class T>
+void Ref<T>::setPrefetch (const UString &schemaName,
+const UString &typeName,
+unsigned int depth)
+
+{
+ rimplPtr->setPrefetch(schemaName,typeName,depth);
+}
+
+template <class T>
+void Ref<T>::setPrefetch (unsigned int depth)
+
+{
+ rimplPtr->setPrefetch(depth);
+}
+
+template <class T>
+void Ref<T>::setLock (LockOptions lckOption)
+{
+ rimplPtr->setLock(lckOption);
+}
+
+template <class T>
+OCIRef* Ref<T>::getRef() const
+{
+ return (rimplPtr->getRef());
+}
+
+template<class T>
+const Connection* Ref<T>::getConnection () const
+{
+ return (rimplPtr->getConnection());
+}
+
+template <class T>
+Ref<T>::operator RefAny () const
+{
+ if (isNull())
+ return RefAny();
+ return (RefAny(rimplPtr->getConnection(), rimplPtr->getRef()));
+}
+
+template <class T>
+bool Ref<T>::operator ==(const Ref<T> &ref) const
+
+{
+ return ( (*rimplPtr) == (*(ref.rimplPtr)) );
+}
+
+template <class T>
+bool Ref<T>::operator !=(const Ref<T> &ref) const
+
+{
+ return ( !((*rimplPtr) == (*(ref.rimplPtr))) );
+}
+
+template <class T>
+bool Ref<T>::operator == (const RefAny & refAnyR) const
+
+{
+ return ( (*rimplPtr) == refAnyR );
+}
+
+template <class T>
+bool Ref<T>::operator != (const RefAny & refAnyR) const
+
+{
+ return ( !((*rimplPtr) == refAnyR ));
+}
+
+template <class T>
+void Ref<T>::destroy()
+{
+ rimplPtr->destroy();
+}
+
+template <class T>
+OCIComplexObject * Ref<T>::getCor() const
+{
+ return (rimplPtr->getCor());
+}
+
+template < class T>
+void Ref<T>::setPinnedObject( PObject *objPtr)
+{
+ rimplPtr->setPinnedObject(objPtr);
+}
+
+/*---------------------------------------------------------------------------
+ PROTOTYPES USED BY FUNCTION TEMPLATES
+ ---------------------------------------------------------------------------*/
+ void getVectorOfOCIRefs( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector<void *> &vect);
+ void getVectorOfPObjects( const AnyData &any,
+ OCCI_STD_NAMESPACE::vector< PObject* > &vect,
+ void *(*rSQL)(void *)) ;
+ void setVectorOfOCIRefs( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector<void *> &vect,
+ const OCCI_STD_NAMESPACE::vector< OCIInd> &vec_ind) ;
+ void setVectorOfPObjects( AnyData &any,
+ const OCCI_STD_NAMESPACE::vector< PObject* > &vect) ;
+
+/*---------------------------------------------------------------------------
+ EXPORT FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+/*------------------- getVector for POBject----------------------------*/
+/*
+ NAME
+ getVector - overloaded function. Retrieves the attribute in the
+ current position as a vector of PObject
+
+ PARAMETERS
+ any - AnyData
+ vect- reference to vector of PObject (OUT parameter).
+
+ DESCRIPTION
+ Retrieves the attribute in the current position as a vector
+ of PObject
+ The attribute at the current position should be a collection
+ type (varray or nested table). The SQL type of the elements in
+ the collection should be compatible with PObject
+
+ RETURNS
+ nothing
+
+ NOTES
+ compatible SQL types : user defined types (SQLT_NTY) etc.
+*/
+
+#ifdef WIN32COMMON
+// and other platforms that do not support
+// partial function template specialization
+ template <class T>
+ void getVector(const AnyData &any, OCCI_STD_NAMESPACE::vector<T> &vect,
+ void *(*rSQL)(void *))
+ {
+ OCCI_STD_NAMESPACE::vector< PObject *> vec_pobj;
+ getVectorOfPObjects( any, vec_pobj, rSQL);
+
+ vect.clear();
+ unsigned int size= vec_pobj.size();
+ vect.reserve( size );
+ for( unsigned int i=0; i< size; i++)
+ vect.push_back( (T)vec_pobj[i] );
+ }
+#else
+ template <class T>
+ void getVector(const AnyData &any, OCCI_STD_NAMESPACE::vector<T*> &vect,
+ void *(*rSQL)(void *))
+ {
+ OCCI_STD_NAMESPACE::vector< PObject *> vec_pobj;
+ getVectorOfPObjects( any, vec_pobj, rSQL);
+
+ vect.clear();
+ unsigned int size= vec_pobj.size();
+ vect.reserve( size );
+ for( unsigned int i=0; i< size; i++)
+ vect.push_back( (T*)vec_pobj[i] );
+ }
+#endif /* end of #ifdef WIN32COMMON */
+
+ /*------------------- getVector for Ref<T>----------------------------*/
+/*
+ NAME
+ getVector - overloaded function. Retrieves the attribute in the
+ current position as a vector of PObject
+
+ PARAMETERS
+ any - AnyData
+ vect- reference to vector of PObject (OUT parameter).
+
+ DESCRIPTION
+ Retrieves the attribute in the current position as a vector
+ of PObject
+ The attribute at the current position should be a collection
+ type (varray or nested table). The SQL type of the elements in
+ the collection should be compatible with PObject
+
+ RETURNS
+ nothing
+
+ NOTES
+ compatible SQL types : user defined types (SQLT_NTY) etc.
+*/
+#ifndef WIN32COMMON
+ template <class T>
+ void getVector(const AnyData &any,OCCI_STD_NAMESPACE::vector< Ref<T> > &vect)
+ {
+ OCCI_STD_NAMESPACE::vector< void *> vec_ref;
+ getVectorOfOCIRefs( any, vec_ref);
+
+ vect.clear();
+ unsigned int size = vec_ref.size();
+ vect.reserve( size );
+ const Connection *sess = any.getConnection();
+
+ for (unsigned int i=0; i< size; i++)
+ {
+ if (vec_ref[i] == (OCIRef *)0)
+ vect.push_back(Ref<T>()); // pushing a default-constructed Ref
+ else
+ vect.push_back(Ref<T>(sess, (OCIRef *)vec_ref[i], FALSE));
+ }
+ }
+#endif /* end of #ifndef WIN32COMMON */
+
+/*-----------------------setVector for PObject--------------------------*/
+/*
+ NAME
+ setVector - overloaded function. sets the attribute in the current
+ position of anydata with the vector elements.
+
+ PARAMETERS
+ none.
+
+ DESCRIPTION
+ sets the attribute in the current position in anydata with the
+ vector elements.
+ The attribute in the current position of anydata should be a
+ collection type. If the collection type is a varray, the input vector
+ size should be equal to the size of the varray. Also the SQL type of
+ the collection's elements should be compatible with PObject.
+
+ RETURNS
+ nothing.
+
+ NOTES
+ compatible SQL types : SQLT_NTY (user defined types).
+*/
+#ifdef WIN32COMMON
+// and other platforms that do not support
+// partial function template specialization
+
+ template <class T>
+ void setVector(AnyData &any, const OCCI_STD_NAMESPACE::vector<T> &vect)
+ {
+ OCCI_STD_NAMESPACE::vector< PObject *> vec_pobj;
+ unsigned int size= vect.size();
+ vec_pobj.reserve( size );
+ for( unsigned int i=0; i< size; i++)
+ vec_pobj.push_back( vect[i] );
+ setVectorOfPObjects( any, vec_pobj);
+
+ }
+
+#else
+
+ template <class T>
+ void setVector(AnyData &any, const OCCI_STD_NAMESPACE::vector<T*> &vect)
+ {
+ OCCI_STD_NAMESPACE::vector< PObject *> vec_pobj;
+ unsigned int size= vect.size();
+ vec_pobj.reserve( size );
+ for( unsigned int i=0; i< size; i++)
+ vec_pobj.push_back( vect[i] );
+ setVectorOfPObjects( any, vec_pobj);
+
+ }
+#endif /* end of #ifdef WIN32COMMON */
+
+/*-----------------------setVector for Ref<T>--------------------------*/
+/*
+ NAME
+ setVector - overloaded function. sets the attribute in the current
+ position of anydata with the vector elements.
+
+ PARAMETERS
+ none.
+
+ DESCRIPTION
+ sets the attribute in the current position in anydata with the
+ vector elements.
+ The attribute in the current position of anydata should be a
+ collection type. If the collection type is a varray, the input vector
+ size should be equal to the size of the varray. Also the SQL type of
+ the collection's elements should be compatible with PObject.
+
+ RETURNS
+ nothing.
+
+ NOTES
+ compatible SQL types : SQLT_NTY (user defined types).
+*/
+#ifndef WIN32COMMON
+ template <class T>
+ void setVector(AnyData &any, const OCCI_STD_NAMESPACE::vector< Ref<T> > &vect)
+ {
+ OCCI_STD_NAMESPACE::vector< void *> vec_ref;
+ OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+
+ unsigned int size= vect.size();
+ vec_ref.reserve( size );
+ vec_ind.reserve( size );
+ for( unsigned int i=0; i< size; i++)
+ {
+ vec_ref.push_back( vect[i].getRef() );
+ vec_ind.push_back(vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+ }
+ setVectorOfOCIRefs( any, vec_ref, vec_ind);
+
+ }
+#endif /* end of #ifndef WIN32COMMON */
+
+// Platform independent get/setVectorOfRefs method added
+// get(set)Vector of Ref<T> and get(set)VectorOfRefs are identical
+// in functionality.
+
+ /*------------------- getVectorOfRefs for Ref<T>----------------------------*/
+/*
+ NAME
+ getVectorOfRefs - overloaded function. Retrieves the attribute in the
+ current position as a vector of PObject
+
+ PARAMETERS
+ any - AnyData
+ vect- reference to vector of PObject (OUT parameter).
+
+ DESCRIPTION
+ Retrieves the attribute in the current position as a vector
+ of PObject
+ The attribute at the current position should be a collection
+ type (varray or nested table). The SQL type of the elements in
+ the collection should be compatible with PObject
+
+ RETURNS
+ nothing
+
+ NOTES
+ compatible SQL types : user defined types (SQLT_NTY) etc.
+*/
+
+ template <class T>
+ void getVectorOfRefs(const AnyData &any,
+ OCCI_STD_NAMESPACE::vector< Ref<T> > &vect)
+ {
+ OCCI_STD_NAMESPACE::vector< void *> vec_ref;
+ getVectorOfOCIRefs( any, vec_ref);
+
+ vect.clear();
+ unsigned int size = vec_ref.size();
+ vect.reserve( size );
+ const Connection *sess = any.getConnection();
+
+ for (unsigned int i=0; i< size; i++)
+ {
+ if (vec_ref[i] == (OCIRef *)0)
+ vect.push_back(Ref<T>()); // pushing a default-constructed Ref
+ else
+ vect.push_back(Ref<T>(sess, (OCIRef *)vec_ref[i], FALSE));
+ }
+ }
+
+/*-----------------------setVectorOfRefs for Ref<T>--------------------------*/
+/*
+ NAME
+ setVectorOfRefs - overloaded function. sets the attribute in the current
+ position of anydata with the vector elements.
+
+ PARAMETERS
+ none.
+
+ DESCRIPTION
+ sets the attribute in the current position in anydata with the
+ vector elements.
+ The attribute in the current position of anydata should be a
+ collection type. If the collection type is a varray, the input vector
+ size should be equal to the size of the varray. Also the SQL type of
+ the collection's elements should be compatible with PObject.
+
+ RETURNS
+ nothing.
+
+ NOTES
+ compatible SQL types : SQLT_NTY (user defined types).
+*/
+
+ template <class T>
+ void setVectorOfRefs(AnyData &any,
+ const OCCI_STD_NAMESPACE::vector< Ref<T> > &vect)
+
+ {
+ OCCI_STD_NAMESPACE::vector< void *> vec_ref;
+ OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+
+ unsigned int size= vect.size();
+ vec_ref.reserve( size );
+ vec_ind.reserve( size );
+ for( unsigned int i=0; i< size; i++)
+ {
+ vec_ref.push_back( vect[i].getRef() );
+ vec_ind.push_back(vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+ }
+ setVectorOfOCIRefs( any, vec_ref, vec_ind);
+
+ }
+
+
+/*---------------------------------------------------------------------------
+ INTERNAL FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+} /* end of namespace occi */
+} /* end of namespace oracle */
+#endif /* OCCIOBJECTS_ORACLE */
+
+#endif /* _olint */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/oci.h b/src/terralib/drivers/OracleSpatial/OCI/include/oci.h
new file mode 100644
index 0000000..a5d8b01
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/oci.h
@@ -0,0 +1,2366 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/oci.h,v 1.3 2005/05/06 16:48:55 karine Exp $
+ */
+
+/* Copyright (c) 1995, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ oci.h - V8 Oracle Call Interface public definitions
+
+ DESCRIPTION
+ This file defines all the constants and structures required by a V8
+ OCI programmer.
+
+ RELATED DOCUMENTS
+ V8 OCI Functional Specification
+ Oracle Call Interface Programmer's Guide Vol 1 and 2
+
+ INSPECTION STATUS
+ Inspection date:
+ Inspection status:
+ Estimated increasing cost defects per page:
+ Rule sets:
+
+ ACCEPTANCE REVIEW STATUS
+ Review date:
+ Review status:
+ Reviewers:
+
+ PUBLIC FUNCTION(S)
+ None
+
+ PRIVATE FUNCTION(S)
+ None
+
+ EXAMPLES
+
+ NOTES
+
+
+ MODIFIED (MM/DD/YY)
+ chliang 11/26/03 - add OCI_ATTR_RESERVED_19
+ preilly 10/23/03 - Make OCI_ATTR_DIRPATH_METADATA_BUF private
+ chliang 08/07/03 - add OCI_ATTR_SKIP_BUFFER
+ srseshad 03/12/03 - convert public oci api to ansi
+ weiwang 05/14/03 - remove iot creation for rule sets
+ rkoti 04/15/03 - [2746515] add fntcodes for Unlimited size LOB 6003
+ tcruanes 05/13/03 - add slave SQL OCI execution mode
+ rkoti 02/21/03 - [2761455] add OCI_FNCODE_AQENQARRAY,
+ OCI_FNCODE_AQDEQARRAY and update OCI_FNCODE_MAXFCN
+ tkeefe 01/29/03 - bug-2773794: Add new interface for setting Kerb attrs
+ aahluwal 02/06/03 - add OCI_ATTR_TRANSFORMATION_NO
+ weiwang 12/05/02 - add OCI_ATTR_USER_PROPERTY
+ ataracha 01/03/03 - include ocixmldb.h
+ preilly 12/05/02 - Add wait attribute for locking when using dir path
+ tkeefe 01/03/03 - bug-2623771: Added OCI_ATTR_KERBEROS_KEY
+ lchidamb 12/13/02 - end-to-end tracing attributes
+ msakayed 10/28/02 - Bug #2643907: add OCI_ATTR_DIRPATH_SKIPINDEX_METHOD
+ rphillip 11/13/02 - Add OCIP_ATTR_DIRPATH_INDEX
+ sagrawal 10/13/02 - liniting
+ sagrawal 10/03/02 - PL/SQL Compiler warnings
+ jstenois 11/07/02 - remove ocixad.h
+ chliang 10/21/02 - add OCI_ATTR_RESERVED_16,17
+ hsbedi 10/30/02 - grabtrans 'jstenois_fix_xt_convert'
+ aahluwal 10/12/02 - add OCI_ATTR_AQ_NUM_E_ERRORS/OCI_ATTR_AQ_ERROR_INDEX
+ bdagevil 10/21/02 - add SQL analyze internal exec mode
+ csteinba 10/11/02 - add OCI_ATTR_RESERVED_16
+ chliang 10/12/02 - add bind row callback attributes
+ preilly 10/25/02 - Add new reserved parameters
+ tkeefe 10/31/02 - bug-2623771: Added OCI_ATTR_AUDIT_SESSION_ID
+ csteinba 10/04/02 - Add OCI_ATTR_RESERVED_15
+ mhho 10/11/02 - add new credential constant
+ thoang 09/25/02 - Add OCI_XMLTYPE_CREATE_CLOB
+ skaluska 10/07/02 - describe rules objects
+ csteinba 09/16/02 - Remove OCI_CACHE
+ gtarora 10/03/02 - OCI_ATTR_COL_SUBS => OCI_ATTR_OBJ_SUBS
+ msakayed 09/09/02 - Bug #2482469: add OCI_ATTR_DIRPATH_RESERVED_[3-6]
+ aahluwal 08/30/02 - adding dequeue across txn group
+ srseshad 04/24/02 - Add attribute OCI_ATTR_SPOOL_STMTCACHESIZE.
+ ebatbout 07/22/02 - Remove OCI_ATTR_RESERVED_11.
+ abande 01/17/02 - Bug 1788921; Add external attribute.
+ aahluwal 06/04/02 - bug 2360115
+ pbagal 05/24/02 - Incorporate review comments
+ pbagal 05/22/02 - Introduce instance type attribute.
+ whe 07/01/02 - add OCI_BIND_DEFINE_SOFT flags
+ gtarora 07/01/02 - Add OCI_ATTR_COL_SUBS
+ tkeefe 05/30/02 - Add support for new proxy authentication credentials
+ dgprice 12/18/01 - bug 2102779 add reserved force describe
+ schandir 11/19/01 - add/modify modes.
+ schandir 11/15/01 - add OCI_SPC_STMTCACHE.
+ schandir 12/06/01 - change mode value of OCI_SPOOL.
+ msakayed 11/02/01 - Bug #2094292: add OCI_ATTR_DIRPATH_INPUT
+ dsaha 11/09/01 - add OCI_DTYPE_RESERVED1
+ skabraha 11/05/01 - new method flag
+ skabraha 10/25/01 - another flag for XML
+ skabraha 10/11/01 - describe flags for subtypes
+ nbhatt 09/18/01 - new reserved AQ flags
+ celsbern 10/19/01 - merge LOG to MAIN
+ ksurlake 10/12/01 - add OCI_ATTR_RESERVED_13
+ ksurlake 08/13/01 - add OCI_ATTR_RESERVED_12
+ schandir 09/24/01 - Adding stmt caching
+ abande 09/04/01 - Adding session pooling
+ sagrawal 10/23/01 - add new bit for OCIPHandleFree
+ preilly 10/25/01 - Add support for specifying metadata on DirPathCtx
+ skabraha 09/24/01 - describe flags for XML type
+ schandir 09/24/01 - Adding stmt caching
+ abande 09/04/01 - Adding session pooling
+ stakeda 09/17/01 - add OCI_NLS_CHARSET_ID
+ whe 09/19/01 - add OCIXMLType create options
+ rpingte 09/11/01 - add OCI_MUTEX_ENV_ONLY and OCI_NO_MUTEX_STMT
+ cmlim 08/28/01 - mod datecache attrs to use same naming as dpapi attrs
+ wzhang 08/24/01 - Add new keywords for OCINlsNameMap.
+ rphillip 05/02/01 - Add date cache attributes
+ rphillip 08/22/01 - Add new stream version
+ ebatbout 04/13/01 - add definition, OCI_ATTR_RESERVED_11
+ chliang 04/12/01 - add shortnames for newer oci funcation
+ wzhang 04/11/01 - Add new OCI NLS constants.
+ cmlim 04/13/01 - remove attrs not used by dpapi (151 & 152 avail)
+ rkambo 03/23/01 - bugfix 1421793
+ cmlim 04/02/01 - remove OCI_ATTR_DIRPATH_{NESTED_TBL, SUBST_OBJ_TBL}
+ - note: attribute #s 186 & 205 available
+ whe 03/28/01 - add OCI_AFC_PAD_ON/OFF mode
+ preilly 03/05/01 - Add stream versioning support to DirPath context
+ schandir 12/18/00 - remove attr CONN_INCR_DELAY.
+ schandir 12/12/00 - change mode from OCI_POOL to OCI_CPOOL.
+ cbarclay 01/12/01 - add atribute for OCIP_ATTR_TMZ
+ whe 01/07/01 - add attributes related to UTF16 env mode
+ slari 12/29/00 - add blank line
+ slari 12/28/00 - OCI_ATTR_RESERVED_10
+ whe 12/19/00 - add OCI_ENVCR_RESERVED3
+ rpang 11/29/00 - Added OCI_ATTR_ORA_DEBUG_JDWP attribute
+ cmlim 11/28/00 - support substitutable object tables in dpapi
+ akatti 10/09/00 - [198379]:add OCIRowidToChar
+ sgollapu 10/11/00 - Add OCI_PREP_RESERVED_1
+ sgollapu 08/27/00 - add attribute to get erroneous column
+ sgollapu 07/29/00 - Add snapshot attributes
+ kmohan 09/18/00 - add OCI_FNCODE_LOGON2
+ abrumm 10/08/00 - include ocixad.h
+ mbastawa 10/04/00 - add OCI_ATTR_ROWS_FETCHED
+ nbhatt 08/24/00 - add transformation attribute
+ dmwong 08/22/00 - OCI_ATTR_CID_VALUE -> OCI_ATTR_CLIENT_IDENTIFIER.
+ cmlim 08/30/00 - add OCI_ATTR_DIRPATH_SID
+ dsaha 08/18/00 - add OCI_ATTR_RESERVED_5
+ amangal 08/17/00 - Merge into 8.2 : 1194361
+ slari 08/03/00 - add OCI_ATTR_HANDLE_POSITION
+ dsaha 07/20/00 - 2rt exec
+ sgollapu 07/04/00 - Add virtual session flag
+ cmlim 07/07/00 - add OCI_ATTR_DIRPATH_OID, OCI_ATTR_DIRPATH_NESTED_TBL
+ etucker 07/28/00 - add OCIIntervalFromTZ
+ rwessman 06/26/00 - N-tier: added new credential attributes
+ whe 07/27/00 - add OCI_UTF16 mode
+ vjayaram 07/18/00 - add connection pooling changes
+ etucker 07/12/00 - add dls apis
+ cmlim 07/07/00 - add OCI_ATTR_DIRPATH_OID, OCI_ATTR_DIRPATH_NESTED_TBL
+ sgollapu 07/04/00 - Add virtual session flag
+ najain 05/01/00 - AQ Signature support
+ sgollapu 06/14/00 - Add reserved OCI mode
+ rkambo 06/08/00 - notification presentation support
+ sagrawal 06/04/00 - ref cursor to c
+ ksurlake 06/07/00 - define OCI_POOL
+ mbastawa 06/05/00 - added scrollable cursor attributes
+ weiwang 03/31/00 - add LDAP support
+ whe 05/30/00 - add OCI_ATTR_MAXCHAR_SIZE
+ whe 05/23/00 - validate OCI_NO_CACHE mode
+ dsaha 02/02/00 - Add no-cache attr in statement handle
+ whe 05/23/00 - add OCIP_ICACHE
+ allee 05/17/00 - describe support for JAVA implmented TYPE
+ preilly 05/30/00 - Continue adding support for objects in direct path lo
+ cmlim 05/16/00 - 8.2 dpapi support of ADTs
+ rxgovind 05/04/00 - OCIAnyDataSet changes
+ rkasamse 05/25/00 - add OCIAnyDataCtx
+ rmurthy 04/26/00 - describe support for inheritance
+ ksurlake 04/18/00 - Add credential type
+ whe 05/24/00 - add OCI_ATTR_CHAR_ attrs
+ rkambo 04/19/00 - subscription enhancement
+ rmurthy 04/26/00 - describe support for inheritance
+ delson 03/28/00 - add OCI_ATTR_RESERVED_2
+ abrumm 03/31/00 - external table support
+ rkasamse 03/13/00 - add declarations for OCIAnyData
+ najain 02/24/00 - support for dequeue as select
+ dsaha 03/10/00 - Add OCI_ALWAYS_BLOCKING
+ esoyleme 04/25/00 - separated transactions
+ sgollapu 12/23/99 - OCIServerAttach extensions
+ slari 08/23/99 - add OCI_DTYPE_UCB
+ slari 08/20/99 - add OCI_UCBTYPE_REPLACE
+ hsbedi 08/31/99 - Memory Stats .
+ sgollapu 08/02/99 - oci sql routing
+ slari 08/06/99 - rename values for OCI_SERVER_STATUS
+ slari 08/02/99 - add OCI_ATTR_SERVER_STATUS
+ tnbui 07/28/99 - Remove OCI_DTYPE_TIMESTAMP_ITZ
+ amangal 07/19/99 - Merge into 8.1.6 : bug 785797
+ tnbui 07/07/99 - Change ADJUSTMENT modes
+ dsaha 07/07/99 - OCI_SAHRED_EXT
+ dmwong 06/08/99 - add OCI_ATTR_APPCTX_*
+ vyanaman 06/23/99 -
+ vyanaman 06/21/99 - Add new OCI Datetime and Interval descriptors
+ esoyleme 06/29/99 - expose MTS performance enhancements
+ rshaikh 04/23/99 - add OCI_SQL_VERSION_*
+ tnbui 05/24/99 - Remove OCIAdjStr
+ dsaha 05/21/99 - Add OCI_ADJUST_UNK
+ mluong 05/17/99 - fix merge
+ tnbui 04/05/99 - ADJUSTMENT values
+ abrumm 04/16/99 - dpapi: more attributes
+ dsaha 02/24/99 - Add OCI_SHOW_DML_WARNINGS
+ jiyang 12/07/98 - Add OCI_NLS_DUAL_CURRENCY
+ slari 12/07/98 - change OCI_NOMUTEX to OCI_NO_MUTEX
+ aroy 11/30/98 - change OCI_NOCALLBACK to OCI_NO_UCB
+ aroy 11/13/98 - add env modes to process modes
+ slari 09/08/98 - add OCI_FNCODE_SVC2HST and _SVCRH
+ aroy 09/04/98 - Add OCI_ATTR_MIGSESSION
+ skray 08/14/98 - server groups for session switching
+ mluong 08/11/98 - add back OCI_HTYPE_LAST.
+ aroy 05/25/98 - add process handle type
+ aroy 04/06/98 - add shared mode
+ slari 07/13/98 - merge forward to 8.1.4
+ slari 07/09/98 - add OCI_BIND_RESERVED_2
+ slari 07/08/98 - add OCI_EXACT_FETCH_RESERVED_1
+ dsaha 07/07/98 - Add OCI_PARSE_ONLY
+ dsaha 06/29/98 - Add OCI_PARSE_ONLY
+ slari 07/01/98 - add OCI_BIND_RESERVED_2
+ sgollapu 06/25/98 - Fix bug 683565
+ slari 06/17/98 - remove OC_FETCH_RESERVED_2
+ slari 06/11/98 - add OCI_FETCH_RESERVED_1 and 2
+ jhasenbe 05/27/98 - Remove definitions for U-Calls (Unicode)
+ jiyang 05/18/98 - remove OCI_ATTR_CARTLANG
+ nbhatt 05/20/98 - OCI_DEQ_REMOVE_NODATA
+ nbhatt 05/19/98 - correct AQ opcode
+ skmishra 05/06/98 - Add precision attribute to Attributes list
+ aroy 04/20/98 - merge forward 8.0.5 -> 8.1.3
+ schandra 05/01/98 - OCI sender id
+ sgollapu 02/19/98 - enhanced array DML
+ nbhatt 05/15/98 - AQ listen call
+ sgollapu 04/27/98 - more attributes
+ skaluska 04/06/98 - Add OCI_PTYPE_SCHEMA, OCI_PTYPE_DATABASE
+ slari 04/28/98 - add OCI_ATTR_PDPRC
+ lchidamb 05/05/98 - change OCI_NAMESPACE_AQ to 1
+ nbhatt 04/27/98 - AQ Notification Descriptor
+ abrumm 06/24/98 - more direct path attributes
+ abrumm 05/27/98 - OCI direct path interface support
+ abrumm 05/08/98 - OCI direct path interface support
+ lchidamb 03/02/98 - client notification additions
+ kkarun 04/17/98 - Add more Interval functions
+ vyanaman 04/16/98 - Add get/set TZ
+ kkarun 04/14/98 - Add OCI Datetime shortnames
+ vyanaman 04/13/98 - Add OCI DateTime and Interval check error codes
+ kkarun 04/07/98 - Add OCI_DTYPE_DATETIME and OCI_DTYPE_INTERVAL
+ esoyleme 12/15/97 - support failover callback retry
+ esoyleme 04/22/98 - merge support for failover callback retry
+ mluong 04/16/98 - add OCI_FNCODE_LOBLOCATORASSIGN
+ rkasamse 04/17/98 - add short names for OCIPickler(Memory/Ctx) cart servi
+ slari 04/10/98 - add OCI_FNCODE_SVCCTXTOLDA
+ slari 04/09/98 - add OCI_FNCODE_RESET
+ slari 04/07/98 - add OCI_FNCODE_LOBFILEISOPEN
+ slari 04/06/98 - add OCI_FNCODE_LOBOPEN
+ slari 03/20/98 - change OCI_CBTYPE_xxx to OCI_UCBTYPE_xxx
+ slari 03/18/98 - add OCI_FNCODE_MAXFCN
+ slari 02/12/98 - add OCI_ENV_NO_USRCB
+ skabraha 04/09/98 - adding shortnames for OCIFile
+ rhwu 04/03/98 - Add short names for the OCIThread package
+ tanguyen 04/03/98 - add OCI_ATTR_xxxx for type inheritance
+ rkasamse 04/02/98 - add OCI_ATTR_UCI_REFRESH
+ nramakri 04/01/98 - Add short names for the OCIExtract package
+ ewaugh 03/31/98 - Add short names for the OCIFormat package.
+ jhasenbe 04/06/98 - Add definitions for U-Calls (Unicode)
+ (OCI_TEXT, OCI_UTEXT, OCI_UTEXT4)
+ skmishra 03/03/98 - Add OCI_ATTR_PARSE_ERROR_OFFSET
+ rwessman 03/11/98 - Added OCI_CRED_PROXY for proxy authentication
+ abrumm 03/31/98 - OCI direct path interface support
+ nmallava 03/03/98 - add constants for temp lob apis
+ skotsovo 03/05/98 - resolve merge conflicts
+ skotsovo 02/24/98 - add OCI_DTYPE_LOC
+ skaluska 01/21/98 - Add OCI_ATTR_LTYPE
+ rkasamse 01/06/98 - add OCI_ATTR* for obj cache enhancements
+ dchatter 01/08/98 - more comments
+ skabraha 12/02/97 - moved oci1.h to the front of include files.
+ jiyang 12/18/97 - Add OCI_NLS_MAX_BUFSZ
+ rhwu 12/02/97 - move oci1.h up
+ ewaugh 12/15/97 - Add short names for the OCIFormat package.
+ rkasamse 12/02/97 - Add a constant for memory cartridge services -- OCI_M
+ nmallava 12/31/97 - open/close for internal lobs
+ khnguyen 11/27/97 - add OCI_ATTR_LFPRECISION, OCI_ATTR_FSPRECISION
+ rkasamse 11/03/97 - add types for pickler cartridge services
+ mluong 11/20/97 - changed ubig_ora to ub4 per skotsovo
+ ssamu 11/14/97 - add oci1.h
+ jiyang 11/13/97 - Add NLS service for cartridge
+ esoyleme 12/15/97 - support failover callback retry
+ jwijaya 10/21/97 - change OCILobOffset/Length from ubig_ora to ub4
+ cxcheng 07/28/97 - fix compile with SLSHORTNAME
+ schandra 06/25/97 - AQ OCI interface
+ sgollapu 07/25/97 - Add OCI_ATTR_DESC_PUBLIC
+ cxcheng 06/16/97 - add OCI_ATTR_TDO
+ skotsovo 06/05/97 - add fntcodes for lob buffering subsystem
+ esoyleme 05/13/97 - move failover callback prototype
+ skmishra 05/06/97 - stdc compiler fixes
+ skmishra 04/22/97 - Provide C++ compatibility
+ lchidamb 04/19/97 - add OCI_ATTR_SESSLANG
+ ramkrish 04/15/97 - Add OCI_LOB_BUFFER_(NO)FREE
+ sgollapu 04/18/97 - Add OCI_ATTR_TABLESPACE
+ skaluska 04/17/97 - Add OCI_ATTR_SUB_NAME
+ schandra 04/10/97 - Use long OCI names
+ aroy 03/27/97 - add OCI_DTYPE_FILE
+ sgollapu 03/26/97 - Add OCI_OTYPEs
+ skmishra 04/09/97 - Added constant OCI_ROWID_LEN
+ dchatter 03/21/97 - add attr OCI_ATTR_IN_V8_MODE
+ lchidamb 03/21/97 - add OCI_COMMIT_ON_SUCCESS execution mode
+ skmishra 03/20/97 - Added OCI_ATTR_LOBEMPTY
+ sgollapu 03/19/97 - Add OCI_ATTR_OVRLD_ID
+ aroy 03/17/97 - add postprocessing callback
+ sgollapu 03/15/97 - Add OCI_ATTR_PARAM
+ cxcheng 02/07/97 - change OCI_PTYPE codes for type method for consistenc
+ cxcheng 02/05/97 - add OCI_PTYPE_TYPE_RESULT
+ cxcheng 02/04/97 - rename OCI_PTYPE constants to be more consistent
+ cxcheng 02/03/97 - add OCI_ATTR, OCI_PTYPE contants for describe type
+ esoyleme 01/23/97 - merge neerja callback
+ sgollapu 12/30/96 - Remove OCI_DTYPE_SECURITY
+ asurpur 12/26/96 - CHanging OCI_NO_AUTH to OCI_AUTH
+ sgollapu 12/23/96 - Add more attrs to COL, ARG, and SEQ
+ sgollapu 12/12/96 - Add OCI_DESCRIBE_ONLY
+ slari 12/11/96 - change prototype of OCICallbackInBind
+ nbhatt 12/05/96 - "callback"
+ lchidamb 11/19/96 - handle subclassing
+ sgollapu 11/09/96 - OCI_PATTR_*
+ dchatter 11/04/96 - add attr OCI_ATTR_CHRCNT
+ mluong 11/01/96 - test
+ cxcheng 10/31/96 - add #defines for OCILobLength etc
+ dchatter 10/31/96 - add lob read write call back fp defs
+ dchatter 10/30/96 - more changes
+ rhari 10/30/96 - Include ociextp.h at the very end
+ lchidamb 10/22/96 - add fdo attribute for bind/server handle
+ dchatter 10/22/96 - change attr defn for prefetch parameters & lobs/file
+ calls
+ slari 10/21/96 - add OCI_ENV_NO_MUTEX
+ rhari 10/25/96 - Include ociextp.h
+ rxgovind 10/25/96 - add OCI_LOBMAXSIZE, remove OCI_FILE_READWRITE
+ sgollapu 10/24/96 - Correct OCILogon and OCILogoff
+ sgollapu 10/24/96 - Correct to OCILogon and OCILogoff
+ sgollapu 10/21/96 - Add ocilon and ociloff
+ skaluska 10/31/96 - Add OCI_PTYPE values
+ sgollapu 10/17/96 - correct OCI_ATTR_SVCCTX to OCI_ATTR_SERVER
+ rwessman 10/16/96 - Added security functions and fixed olint errors.
+ sthakur 10/14/96 - add more COR attributes
+ cxcheng 10/14/96 - re-enable LOB functions
+ sgollapu 10/10/96 - Add ocibdp and ocibdn
+ slari 10/07/96 - add back OCIRowid
+ aroy 10/08/96 - add typedef ocibfill for PRO*C
+ mluong 10/11/96 - replace OCI_ATTR_CHARSET* with OCI_ATTR_CHARSET_*
+ cxcheng 10/10/96 - temporarily take out #define for lob functions
+ sgollapu 10/02/96 - Rename OCI functions and datatypes
+ skotsovo 10/01/96 - move orl lob fnts to oci
+ aroy 09/10/96 - fix merge errors
+ aroy 08/19/96 - NCHAR support
+ jboonleu 09/05/96 - add OCI attributes for object cache
+ dchatter 08/20/96 - HTYPE ranges from 1-50; DTYPE from 50-255
+ slari 08/06/96 - define OCI_DTYPE_ROWID
+ sthakur 08/14/96 - complex object support
+ schandra 06/17/96 - Convert XA to use new OCI
+ abrik 08/15/96 - OCI_ATTR_HEAPALLOC added
+ aroy 07/17/96 - terminology change: ocilobd => ocilobl
+ aroy 07/03/96 - add lob typedefs for Pro*C
+ slari 06/28/96 - add OCI_ATTR_STMT_TYPE
+ lchidamb 06/26/96 - reorg #ifndef
+ schandra 05/31/96 - attribute types for internal and external client name
+ asurpur 05/30/96 - Changing the value of mode
+ schandra 05/18/96 - OCI_TRANS_TWOPHASE -> 0x00000001 to 0x00100000
+ slari 05/30/96 - add callback function prototypes
+ jbellemo 05/23/96 - remove ociisc
+ schandra 04/23/96 - loosely-coupled branches
+ asurpur 05/15/96 - New mode for ocicpw
+ aroy 04/24/96 - making ocihandles opaque
+ slari 04/18/96 - add missing defines
+ schandra 03/27/96 - V8OCI - add transaction related calls
+ dchatter 04/01/96 - add OCI_FILE options
+ dchatter 03/21/96 - add oci2lda conversion routines
+ dchatter 03/07/96 - add OCI piece definition
+ slari 03/12/96 - add describe attributes
+ slari 03/12/96 - add OCI_OTYPE_QUERY
+ aroy 02/28/96 - Add column attributes
+ slari 02/09/96 - add OCI_OBJECT
+ slari 02/07/96 - add OCI_HYTPE_DSC
+ aroy 01/10/96 - adding function code defines...
+ dchatter 01/03/96 - define OCI_NON_BLOCKING
+ dchatter 01/02/96 - Add Any descriptor
+ dchatter 01/02/96 - Add Select List descriptor
+ dchatter 12/29/95 - V8 OCI definitions
+ dchatter 12/29/95 - Creation
+
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef OCI_ORACLE
+# define OCI_ORACLE
+
+
+/*---------------------------------------------------------------------------
+ Short names provided for platforms which do not allow extended symbolic names
+ ---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+/* Translation of the long function/type names to short names for IBM only */
+/* maybe lint will use this too */
+#define OCISessionEnd ocitac
+#define OCIResultSetToStmt ocirs2sh
+#define OCISessionBegin ociauth
+#define OCIServerAttach ociatch
+#define OCIDescriptorAlloc ocigdesc
+#define OCIServerDetach ocidtch
+#define OCIDescriptorFree ocifdesc
+#define OCIServerVersion ocivers
+#define OCIDescribeAny ocidsca
+#define OCIBindDynamic ocibda
+#define OCIBindByName ocibdn
+#define OCIBindByPos ocibdp
+#define OCIErrorGet ocigdr
+#define OCIBindArrayOfStruct ocibsa
+#define OCIEnvInit ociinit
+#define OCIBindObject ocibndt
+#define OCIHandleAlloc ocighndl
+#define OCIHandleFree ocifhndl
+#define OCIRowidToChar ociri2c
+#ifdef NEVER
+#define OCIStmtBindByPos ocibndp
+#define OCIStmtBindByName ocibndn
+#endif
+#define OCIAttrGet ocigattr
+#define OCIDefineByPos ocidfne
+#define OCIAttrSet ocisattr
+#define OCIDefineDynamic ociddf
+#define OCILdaToSvcCtx ocild2sv
+#define OCIDefineArrayOfStruct ocidarr
+#define OCIInitialize ocipi
+#define OCIDefineObject ocidndt
+#define OCIStmtExecute ociexec
+#define OCILobAppend ocilfap
+#define OCILobOpenFile ocifopn
+#define OCILobCloseFile ocifcls
+#define OCILobLocator ocilobd
+#define OCILobCopy ocilfcp
+#define OCILobFileCreate ocifcrt
+#define OCILobFileDelete ocifdel
+#define OCILobGetLength ocilfln
+#define OCILobWrite ocilfwr
+#define OCILobRead ocilfrd
+#define OCILobErase ocilfer
+#define OCILobTrim ocilftr
+
+#define OCIStmtFetch ocifch
+#define OCIStmtGetBindInfo ocigbp
+#define OCIStmtGetPieceInfo ocigpi
+#define OCIStmtPrepare ocireq
+#define OCIStmtSetPieceInfo ocispi
+#define OCISvcCtxToLda ocisv2ld
+#define OCITransCommit ocitxcm
+#define OCITransDetach ocitxdt
+#define OCITransForget ocitxfgt
+#define OCITransPrepare ocitxpre
+#define OCITransRollback ocitxrl
+#define OCIPasswordChange ocicpw
+#define OCITransStart ocitxst
+#define OCITransMultiPrepare ocitxmp
+
+#define OCIBreak ocibreak
+#define OCIParamGet ocigparm
+#define OCIParamSet ocisparm
+
+#define OCISecurityOpenWallet ocizwOpenWallet
+#define OCISecurityCloseWallet ocizwCloseWallet
+#define OCISecurityCreateWallet ocizwCreateWallet
+#define OCISecurityDestroyWallet ocizwDestroyWallet
+#define OCISecurityStorePersona ocizeStorePersona
+#define OCISecurityOpenPersona ocizeOpenPersona
+#define OCISecurityClosePersona ocizeClosePersona
+#define OCISecurityRemovePersona ocizeRemovePersona
+#define OCISecurityCreatePersona ocizeCreatePersona
+#define OCISecuritySetProtection ocizeSetProtection
+#define OCISecurityGetProtection ocizeGetProtection
+#define OCISecurityRemoveIdentity ociziRemoveIdentity
+#define OCISecurityCreateIdentity ociziCreateIdentity
+#define OCISecurityAbortIdentity ociziAbortIdentity
+#define OCISecurityFreeIdentity ociziFreeIdentity
+#define OCISecurityStoreTrustedIdentity ociziStoreTrustedIdentity
+#define OCISecuritySign ocizSign
+#define OCISecuritySignExpansion ocizxSignExpansion
+#define OCISecurityVerify ocizVerify
+#define OCISecurityValidate ocizValidate
+#define OCISecuritySignDetached ocizsd_SignDetached
+#define OCISecuritySignDetExpansion ocizxsd_SignDetachedExpansion
+#define OCISecurityVerifyDetached ocizved_VerifyDetached
+#define OCISecurity_PKEncrypt ocizkec_PKEncrypt
+#define OCISecurityPKEncryptExpansion ocizxkec_PKEncryptExpansion
+#define OCISecurityPKDecrypt ocizkdc_PKDecrypt
+#define OCISecurityEncrypt ocizEncrypt
+#define OCISecurityEncryptExpansion ocizxEncryptExpansion
+#define OCISecurityDecrypt ocizDecrypt
+#define OCISecurityEnvelope ocizEnvelope
+#define OCISecurityDeEnvelope ocizDeEnvelope
+#define OCISecurityKeyedHash ocizKeyedHash
+#define OCISecurityKeyedHashExpansion ocizxKeyedHashExpansion
+#define OCISecurityHash ocizHash
+#define OCISecurityHashExpansion ocizxHashExpansion
+#define OCISecuritySeedRandom ocizSeedRandom
+#define OCISecurityRandomBytes ocizrb_RandomBytes
+#define OCISecurityRandomNumber ocizrn_RandomNumber
+#define OCISecurityInitBlock ocizibInitBlock
+#define OCISecurityReuseBlock ocizrbReuseBlock
+#define OCISecurityPurgeBlock ocizpbPurgeBlock
+#define OCISecuritySetBlock ocizsbSetBlock
+#define OCISecurityGetIdentity ocizgi_GetIdentity
+
+#define OCIExtractInit ocixeini
+#define OCIExtractTerm ocixetrm
+#define OCIExtractReset ocixerst
+#define OCIExtractSetNumKeys ocixesnk
+#define OCIExtractSetKey ocixesk
+#define OCIExtractFromFile ocixeff
+#define OCIExtractFromStr ocixefs
+#define OCIExtractToInt ocixeti
+#define OCIExtractToBool ocixetb
+#define OCIExtractToStr ocixets
+#define OCIExtractToOCINum ocixeton
+#define OCIExtractToList ocixetl
+#define OCIExtractFromList ocixefl
+
+#define OCIDateTimeGetTime ocidt01_GetTime
+#define OCIDateTimeGetDate ocidt02_GetDate
+#define OCIDateTimeGetTimeZoneOffset ocidt03_GetTZ
+#define OCIDateTimeSysTimeStamp ocidt07_SysTS
+#define OCIDateTimeAssign ocidt08_Assign
+#define OCIDateTimeToText ocidt09_ToText
+#define OCIDateTimeFromText ocidt10_FromText
+#define OCIDateTimeCompare ocidt11_Compare
+#define OCIDateTimeCheck ocidt12_Check
+#define OCIDateTimeConvert ocidt13_Convert
+#define OCIDateTimeSubtract ocidt14_Subtract
+#define OCIDateTimeIntervalAdd ocidt15_IntervalAdd
+#define OCIDateTimeIntervalSub ocidt16_IntervalSub
+#define OCIDateTimeGetTimeZoneName ocidt17_Gettzname
+#define OCIDateTimeToArray ocidt18_ToArray
+#define OCIDateTimeFromArray ocidt19_FromArray
+
+#define OCIIntervalSubtract ociint01_Subtract
+#define OCIIntervalAdd ociint02_Add
+#define OCIIntervalMultiply ociint03_Multiply
+#define OCIIntervalDivide ociint04_Divide
+#define OCIIntervalCompare ociint05_Compare
+#define OCIIntervalFromText ociint06_FromText
+#define OCIIntervalToText ociint07_ToText
+#define OCIIntervalToNumber ociint08_ToNumber
+#define OCIIntervalCheck ociint09_Check
+#define OCIIntervalAssign ociint10_Assign
+#define OCIIntervalGetYearMonth ociint11_GetYearMonth
+#define OCIIntervalSetYearMonth ociint12_SetYearMonth
+#define OCIIntervalGetDaySecond ociint13_GetDaySecond
+#define OCIIntervalSetDaySecond ociint14_SetDaySecond
+#define OCIIntervalFromNumber ociint15_FromNumber
+#define OCIIntervalFromTZ ociint16_FromTZ
+
+#define OCIFormatInit ocixs01_Init
+#define OCIFormatString ocixs02_Format
+#define OCIFormatTerm ocixs03_Term
+#define OCIFormatTUb1 ocixs04_TUb1
+#define OCIFormatTUb2 ocixs05_TUb2
+#define OCIFormatTUb4 ocixs06_TUb4
+#define OCIFormatTUword ocixs07_TUword
+#define OCIFormatTUbig_ora ocixs08_TUbig_ora
+#define OCIFormatTSb1 ocixs09_TSb1
+#define OCIFormatTSb2 ocixs10_TSb2
+#define OCIFormatTSb4 ocixs11_TSb4
+#define OCIFormatTSword ocixs12_TSword
+#define OCIFormatTSbig_ora ocixs13_TSbig_ora
+#define OCIFormatTEb1 ocixs14_TEb1
+#define OCIFormatTEb2 ocixs15_TEb2
+#define OCIFormatTEb4 ocixs16_TEb4
+#define OCIFormatTEword ocixs17_TEword
+#define OCIFormatTChar ocixs18_TChar
+#define OCIFormatTText ocixs19_TText
+#define OCIFormatTDouble ocixs20_TDouble
+#define OCIFormatTDvoid ocixs21_TDvoid
+#define OCIFormatTEnd ocixs22_TEnd
+
+#define OCIFileInit ocifinit
+#define OCIFileTerm ocifterm
+#define OCIFileOpen ocifopen
+#define OCIFileClose ocifclose
+#define OCIFileRead ocifread
+#define OCIFileWrite ocifwrite
+#define OCIFileSeek ocifseek
+#define OCIFileExists ocifexists
+#define OCIFileGetLength ocifglen
+#define OCIFileFlush ocifflush
+
+
+/* OCIThread short name */
+#define OCIThreadProcessInit ocitt01_ProcessInit
+#define OCIThreadInit ocitt02_Init
+#define OCIThreadTerm ocitt03_Term
+#define OCIThreadIsMulti ocitt04_IsMulti
+#define OCIThreadMutexInit ocitt05_MutexInit
+#define OCIThreadMutexDestroy ocitt06_MutexDestroy
+#define OCIThreadMutexAcquire ocitt07_MutexAcquire
+#define OCIThreadMutexRelease ocitt08_MutexRelease
+#define OCIThreadKeyInit ocitt09_KeyInit
+#define OCIThreadKeyDestroy ocitt10_KeyDestroy
+#define OCIThreadKeyGet ocitt11_KeyGet
+#define OCIThreadKeySet ocitt12_KeySet
+#define OCIThreadIdInit ocitt13_IdInit
+#define OCIThreadIdDestroy ocitt14_IdDestroy
+#define OCIThreadIdSet ocitt15_IdSet
+#define OCIThreadIdSetNull ocitt16_IdSetNull
+#define OCIThreadIdGet ocitt17_IdGet
+#define OCIThreadIdSame ocitt18_IdSame
+#define OCIThreadIdNull ocitt19_IdNull
+#define OCIThreadHndInit ocitt20_HndInit
+#define OCIThreadHndDestroy ocitt21_HndDestroy
+#define OCIThreadCreate ocitt22_Create
+#define OCIThreadJoin ocitt23_Join
+#define OCIThreadClose ocitt24_Close
+#define OCIThreadHandleGet ocitt25_HandleGet
+
+/* Translation between the old and new datatypes */
+
+#define OCISession ociusrh
+#define OCIBind ocibndh
+#define OCIDescribe ocidsch
+#define OCIDefine ocidfnh
+#define OCIEnv ocienvh
+#define OCIError ocierrh
+
+#define OCICPool ocicpool
+
+#define OCISPool ocispool
+#define OCIAuthInfo ociauthinfo
+
+
+#define OCILob ocilobd
+#define OCILobLength ocillen
+#define OCILobMode ocilmo
+#define OCILobOffset ociloff
+
+#define OCILobLocator ocilobd
+#define OCIBlobLocator ociblobl
+#define OCIClobLocator ociclobl
+#define OCIBFileLocator ocibfilel
+
+#define OCIParam ocipard
+#define OCIResult ocirstd
+#define OCISnapshot ocisnad
+#define OCIServer ocisrvh
+#define OCIStmt ocistmh
+#define OCISvcCtx ocisvch
+#define OCITrans ocitxnh
+#define OCICallbackInBind ocibicfp
+#define OCICallbackOutBind ocibocfp
+#define OCICallbackDefine ocidcfp
+#define OCICallbackLobRead ocilrfp
+#define OCICallbackLobWrite ocilwfp
+#define OCISecurity ociossh
+#define OCIComplexObject ocicorh
+#define OCIComplexObjectComp ocicord
+#define OCIRowid ociridd
+
+#define OCIAQDeq ociaqdeq
+#define OCIAQEnq ociaqenq
+#define OCIConnectionPoolCreate ociconpc
+#define OCIConnectionPoolDestroy ociconpd
+#define OCIEnvCreate ocienvct
+#define OCILobAssign ociloass
+#define OCILobCharSetForm ocilocfm
+#define OCILobCharSetId ocilocid
+#define OCILobDisableBuffering ocilodbf
+#define OCILobEnableBuffering ociloebf
+#define OCILobFileClose ocilofcl
+#define OCILobFileCloseAll ocilofca
+#define OCILobFileExists ocilofex
+#define OCILobFileGetName ocilofgn
+#define OCILobFileIsOpen ocifiopn
+#define OCILobFileOpen ocilofop
+#define OCILobFileSetName ocilofsn
+#define OCILobFlushBuffer ocilofbf
+#define OCILobIsEqual ociloieq
+#define OCILobLoadFromFile ocilolff
+#define OCILobLocatorIsInit ocilolii
+#define OCILobLocatorAssign ocilolas
+#define OCILogon ocilogon
+#define OCILogon2 ocilgon2
+#define OCILogoff ocilgoff
+#endif /* ifdef SLSHORTNAME */
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+/*-----------------------------Handle Types----------------------------------*/
+ /* handle types range from 1 - 49 */
+#define OCI_HTYPE_FIRST 1 /* start value of handle type */
+#define OCI_HTYPE_ENV 1 /* environment handle */
+#define OCI_HTYPE_ERROR 2 /* error handle */
+#define OCI_HTYPE_SVCCTX 3 /* service handle */
+#define OCI_HTYPE_STMT 4 /* statement handle */
+#define OCI_HTYPE_BIND 5 /* bind handle */
+#define OCI_HTYPE_DEFINE 6 /* define handle */
+#define OCI_HTYPE_DESCRIBE 7 /* describe handle */
+#define OCI_HTYPE_SERVER 8 /* server handle */
+#define OCI_HTYPE_SESSION 9 /* authentication handle */
+#define OCI_HTYPE_AUTHINFO OCI_HTYPE_SESSION /* SessionGet auth handle */
+#define OCI_HTYPE_TRANS 10 /* transaction handle */
+#define OCI_HTYPE_COMPLEXOBJECT 11 /* complex object retrieval handle */
+#define OCI_HTYPE_SECURITY 12 /* security handle */
+#define OCI_HTYPE_SUBSCRIPTION 13 /* subscription handle */
+#define OCI_HTYPE_DIRPATH_CTX 14 /* direct path context */
+#define OCI_HTYPE_DIRPATH_COLUMN_ARRAY 15 /* direct path column array */
+#define OCI_HTYPE_DIRPATH_STREAM 16 /* direct path stream */
+#define OCI_HTYPE_PROC 17 /* process handle */
+#define OCI_HTYPE_DIRPATH_FN_CTX 18 /* direct path function context */
+#define OCI_HTYPE_DIRPATH_FN_COL_ARRAY 19 /* dp object column array */
+#define OCI_HTYPE_XADSESSION 20 /* access driver session */
+#define OCI_HTYPE_XADTABLE 21 /* access driver table */
+#define OCI_HTYPE_XADFIELD 22 /* access driver field */
+#define OCI_HTYPE_XADGRANULE 23 /* access driver granule */
+#define OCI_HTYPE_XADRECORD 24 /* access driver record */
+#define OCI_HTYPE_XADIO 25 /* access driver I/O */
+#define OCI_HTYPE_CPOOL 26 /* connection pool handle */
+#define OCI_HTYPE_SPOOL 27 /* session pool handle */
+
+#define OCI_HTYPE_LAST 27 /* last value of a handle type */
+
+/*---------------------------------------------------------------------------*/
+
+
+/*-------------------------Descriptor Types----------------------------------*/
+ /* descriptor values range from 50 - 255 */
+#define OCI_DTYPE_FIRST 50 /* start value of descriptor type */
+#define OCI_DTYPE_LOB 50 /* lob locator */
+#define OCI_DTYPE_SNAP 51 /* snapshot descriptor */
+#define OCI_DTYPE_RSET 52 /* result set descriptor */
+#define OCI_DTYPE_PARAM 53 /* a parameter descriptor obtained from ocigparm */
+#define OCI_DTYPE_ROWID 54 /* rowid descriptor */
+#define OCI_DTYPE_COMPLEXOBJECTCOMP 55
+ /* complex object retrieval descriptor */
+#define OCI_DTYPE_FILE 56 /* File Lob locator */
+#define OCI_DTYPE_AQENQ_OPTIONS 57 /* enqueue options */
+#define OCI_DTYPE_AQDEQ_OPTIONS 58 /* dequeue options */
+#define OCI_DTYPE_AQMSG_PROPERTIES 59 /* message properties */
+#define OCI_DTYPE_AQAGENT 60 /* aq agent */
+#define OCI_DTYPE_LOCATOR 61 /* LOB locator */
+#define OCI_DTYPE_INTERVAL_YM 62 /* Interval year month */
+#define OCI_DTYPE_INTERVAL_DS 63 /* Interval day second */
+#define OCI_DTYPE_AQNFY_DESCRIPTOR 64 /* AQ notify descriptor */
+#define OCI_DTYPE_DATE 65 /* Date */
+#define OCI_DTYPE_TIME 66 /* Time */
+#define OCI_DTYPE_TIME_TZ 67 /* Time with timezone */
+#define OCI_DTYPE_TIMESTAMP 68 /* Timestamp */
+#define OCI_DTYPE_TIMESTAMP_TZ 69 /* Timestamp with timezone */
+#define OCI_DTYPE_TIMESTAMP_LTZ 70 /* Timestamp with local tz */
+#define OCI_DTYPE_UCB 71 /* user callback descriptor */
+#define OCI_DTYPE_SRVDN 72 /* server DN list descriptor */
+#define OCI_DTYPE_SIGNATURE 73 /* signature */
+#define OCI_DTYPE_RESERVED_1 74 /* reserved for internal use */
+#define OCI_DTYPE_LAST 74 /* last value of a descriptor type */
+
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------------LOB types ---------------------------------*/
+#define OCI_TEMP_BLOB 1 /* LOB type - BLOB ------------------ */
+#define OCI_TEMP_CLOB 2 /* LOB type - CLOB ------------------ */
+/*---------------------------------------------------------------------------*/
+
+/*-------------------------Object Ptr Types----------------------------------*/
+#define OCI_OTYPE_NAME 1 /* object name */
+#define OCI_OTYPE_REF 2 /* REF to TDO */
+#define OCI_OTYPE_PTR 3 /* PTR to TDO */
+/*---------------------------------------------------------------------------*/
+
+/*=============================Attribute Types===============================*/
+/*
+ Note: All attributes are global. New attibutes should be added to the end
+ of the list. Before you add an attribute see if an existing one can be
+ used for your handle.
+
+ If you see any holes please use the holes first.
+
+*/
+/*===========================================================================*/
+
+
+#define OCI_ATTR_FNCODE 1 /* the OCI function code */
+#define OCI_ATTR_OBJECT 2 /* is the environment initialized in object mode */
+#define OCI_ATTR_NONBLOCKING_MODE 3 /* non blocking mode */
+#define OCI_ATTR_SQLCODE 4 /* the SQL verb */
+#define OCI_ATTR_ENV 5 /* the environment handle */
+#define OCI_ATTR_SERVER 6 /* the server handle */
+#define OCI_ATTR_SESSION 7 /* the user session handle */
+#define OCI_ATTR_TRANS 8 /* the transaction handle */
+#define OCI_ATTR_ROW_COUNT 9 /* the rows processed so far */
+#define OCI_ATTR_SQLFNCODE 10 /* the SQL verb of the statement */
+#define OCI_ATTR_PREFETCH_ROWS 11 /* sets the number of rows to prefetch */
+#define OCI_ATTR_NESTED_PREFETCH_ROWS 12 /* the prefetch rows of nested table*/
+#define OCI_ATTR_PREFETCH_MEMORY 13 /* memory limit for rows fetched */
+#define OCI_ATTR_NESTED_PREFETCH_MEMORY 14 /* memory limit for nested rows */
+#define OCI_ATTR_CHAR_COUNT 15
+ /* this specifies the bind and define size in characters */
+#define OCI_ATTR_PDSCL 16 /* packed decimal scale */
+#define OCI_ATTR_FSPRECISION OCI_ATTR_PDSCL
+ /* fs prec for datetime data types */
+#define OCI_ATTR_PDPRC 17 /* packed decimal format */
+#define OCI_ATTR_LFPRECISION OCI_ATTR_PDPRC
+ /* fs prec for datetime data types */
+#define OCI_ATTR_PARAM_COUNT 18 /* number of column in the select list */
+#define OCI_ATTR_ROWID 19 /* the rowid */
+#define OCI_ATTR_CHARSET 20 /* the character set value */
+#define OCI_ATTR_NCHAR 21 /* NCHAR type */
+#define OCI_ATTR_USERNAME 22 /* username attribute */
+#define OCI_ATTR_PASSWORD 23 /* password attribute */
+#define OCI_ATTR_STMT_TYPE 24 /* statement type */
+#define OCI_ATTR_INTERNAL_NAME 25 /* user friendly global name */
+#define OCI_ATTR_EXTERNAL_NAME 26 /* the internal name for global txn */
+#define OCI_ATTR_XID 27 /* XOPEN defined global transaction id */
+#define OCI_ATTR_TRANS_LOCK 28 /* */
+#define OCI_ATTR_TRANS_NAME 29 /* string to identify a global transaction */
+#define OCI_ATTR_HEAPALLOC 30 /* memory allocated on the heap */
+#define OCI_ATTR_CHARSET_ID 31 /* Character Set ID */
+#define OCI_ATTR_CHARSET_FORM 32 /* Character Set Form */
+#define OCI_ATTR_MAXDATA_SIZE 33 /* Maximumsize of data on the server */
+#define OCI_ATTR_CACHE_OPT_SIZE 34 /* object cache optimal size */
+#define OCI_ATTR_CACHE_MAX_SIZE 35 /* object cache maximum size percentage */
+#define OCI_ATTR_PINOPTION 36 /* object cache default pin option */
+#define OCI_ATTR_ALLOC_DURATION 37
+ /* object cache default allocation duration */
+#define OCI_ATTR_PIN_DURATION 38 /* object cache default pin duration */
+#define OCI_ATTR_FDO 39 /* Format Descriptor object attribute */
+#define OCI_ATTR_POSTPROCESSING_CALLBACK 40
+ /* Callback to process outbind data */
+#define OCI_ATTR_POSTPROCESSING_CONTEXT 41
+ /* Callback context to process outbind data */
+#define OCI_ATTR_ROWS_RETURNED 42
+ /* Number of rows returned in current iter - for Bind handles */
+#define OCI_ATTR_FOCBK 43 /* Failover Callback attribute */
+#define OCI_ATTR_IN_V8_MODE 44 /* is the server/service context in V8 mode */
+#define OCI_ATTR_LOBEMPTY 45 /* empty lob ? */
+#define OCI_ATTR_SESSLANG 46 /* session language handle */
+
+#define OCI_ATTR_VISIBILITY 47 /* visibility */
+#define OCI_ATTR_RELATIVE_MSGID 48 /* relative message id */
+#define OCI_ATTR_SEQUENCE_DEVIATION 49 /* sequence deviation */
+
+#define OCI_ATTR_CONSUMER_NAME 50 /* consumer name */
+#define OCI_ATTR_DEQ_MODE 51 /* dequeue mode */
+#define OCI_ATTR_NAVIGATION 52 /* navigation */
+#define OCI_ATTR_WAIT 53 /* wait */
+#define OCI_ATTR_DEQ_MSGID 54 /* dequeue message id */
+
+#define OCI_ATTR_PRIORITY 55 /* priority */
+#define OCI_ATTR_DELAY 56 /* delay */
+#define OCI_ATTR_EXPIRATION 57 /* expiration */
+#define OCI_ATTR_CORRELATION 58 /* correlation id */
+#define OCI_ATTR_ATTEMPTS 59 /* # of attempts */
+#define OCI_ATTR_RECIPIENT_LIST 60 /* recipient list */
+#define OCI_ATTR_EXCEPTION_QUEUE 61 /* exception queue name */
+#define OCI_ATTR_ENQ_TIME 62 /* enqueue time (only OCIAttrGet) */
+#define OCI_ATTR_MSG_STATE 63/* message state (only OCIAttrGet) */
+ /* NOTE: 64-66 used below */
+#define OCI_ATTR_AGENT_NAME 64 /* agent name */
+#define OCI_ATTR_AGENT_ADDRESS 65 /* agent address */
+#define OCI_ATTR_AGENT_PROTOCOL 66 /* agent protocol */
+#define OCI_ATTR_USER_PROPERTY 67 /* user property */
+#define OCI_ATTR_SENDER_ID 68 /* sender id */
+#define OCI_ATTR_ORIGINAL_MSGID 69 /* original message id */
+
+#define OCI_ATTR_QUEUE_NAME 70 /* queue name */
+#define OCI_ATTR_NFY_MSGID 71 /* message id */
+#define OCI_ATTR_MSG_PROP 72 /* message properties */
+
+#define OCI_ATTR_NUM_DML_ERRORS 73 /* num of errs in array DML */
+#define OCI_ATTR_DML_ROW_OFFSET 74 /* row offset in the array */
+
+ /* AQ array error handling uses DML method of accessing errors */
+#define OCI_ATTR_AQ_NUM_ERRORS OCI_ATTR_NUM_DML_ERRORS
+#define OCI_ATTR_AQ_ERROR_INDEX OCI_ATTR_DML_ROW_OFFSET
+
+#define OCI_ATTR_DATEFORMAT 75 /* default date format string */
+#define OCI_ATTR_BUF_ADDR 76 /* buffer address */
+#define OCI_ATTR_BUF_SIZE 77 /* buffer size */
+#define OCI_ATTR_DIRPATH_MODE 78 /* mode of direct path operation */
+#define OCI_ATTR_DIRPATH_NOLOG 79 /* nologging option */
+#define OCI_ATTR_DIRPATH_PARALLEL 80 /* parallel (temp seg) option */
+#define OCI_ATTR_NUM_ROWS 81 /* number of rows in column array */
+ /* NOTE that OCI_ATTR_NUM_COLS is a column
+ * array attribute too.
+ */
+#define OCI_ATTR_COL_COUNT 82 /* columns of column array
+ processed so far. */
+#define OCI_ATTR_STREAM_OFFSET 83 /* str off of last row processed */
+#define OCI_ATTR_SHARED_HEAPALLOC 84 /* Shared Heap Allocation Size */
+
+#define OCI_ATTR_SERVER_GROUP 85 /* server group name */
+
+#define OCI_ATTR_MIGSESSION 86 /* migratable session attribute */
+
+#define OCI_ATTR_NOCACHE 87 /* Temporary LOBs */
+
+#define OCI_ATTR_MEMPOOL_SIZE 88 /* Pool Size */
+#define OCI_ATTR_MEMPOOL_INSTNAME 89 /* Instance name */
+#define OCI_ATTR_MEMPOOL_APPNAME 90 /* Application name */
+#define OCI_ATTR_MEMPOOL_HOMENAME 91 /* Home Directory name */
+#define OCI_ATTR_MEMPOOL_MODEL 92 /* Pool Model (proc,thrd,both)*/
+#define OCI_ATTR_MODES 93 /* Modes */
+
+#define OCI_ATTR_SUBSCR_NAME 94 /* name of subscription */
+#define OCI_ATTR_SUBSCR_CALLBACK 95 /* associated callback */
+#define OCI_ATTR_SUBSCR_CTX 96 /* associated callback context */
+#define OCI_ATTR_SUBSCR_PAYLOAD 97 /* associated payload */
+#define OCI_ATTR_SUBSCR_NAMESPACE 98 /* associated namespace */
+
+#define OCI_ATTR_PROXY_CREDENTIALS 99 /* Proxy user credentials */
+#define OCI_ATTR_INITIAL_CLIENT_ROLES 100 /* Initial client role list */
+
+#define OCI_ATTR_UNK 101 /* unknown attribute */
+#define OCI_ATTR_NUM_COLS 102 /* number of columns */
+#define OCI_ATTR_LIST_COLUMNS 103 /* parameter of the column list */
+#define OCI_ATTR_RDBA 104 /* DBA of the segment header */
+#define OCI_ATTR_CLUSTERED 105 /* whether the table is clustered */
+#define OCI_ATTR_PARTITIONED 106 /* whether the table is partitioned */
+#define OCI_ATTR_INDEX_ONLY 107 /* whether the table is index only */
+#define OCI_ATTR_LIST_ARGUMENTS 108 /* parameter of the argument list */
+#define OCI_ATTR_LIST_SUBPROGRAMS 109 /* parameter of the subprogram list */
+#define OCI_ATTR_REF_TDO 110 /* REF to the type descriptor */
+#define OCI_ATTR_LINK 111 /* the database link name */
+#define OCI_ATTR_MIN 112 /* minimum value */
+#define OCI_ATTR_MAX 113 /* maximum value */
+#define OCI_ATTR_INCR 114 /* increment value */
+#define OCI_ATTR_CACHE 115 /* number of sequence numbers cached */
+#define OCI_ATTR_ORDER 116 /* whether the sequence is ordered */
+#define OCI_ATTR_HW_MARK 117 /* high-water mark */
+#define OCI_ATTR_TYPE_SCHEMA 118 /* type's schema name */
+#define OCI_ATTR_TIMESTAMP 119 /* timestamp of the object */
+#define OCI_ATTR_NUM_ATTRS 120 /* number of sttributes */
+#define OCI_ATTR_NUM_PARAMS 121 /* number of parameters */
+#define OCI_ATTR_OBJID 122 /* object id for a table or view */
+#define OCI_ATTR_PTYPE 123 /* type of info described by */
+#define OCI_ATTR_PARAM 124 /* parameter descriptor */
+#define OCI_ATTR_OVERLOAD_ID 125 /* overload ID for funcs and procs */
+#define OCI_ATTR_TABLESPACE 126 /* table name space */
+#define OCI_ATTR_TDO 127 /* TDO of a type */
+#define OCI_ATTR_LTYPE 128 /* list type */
+#define OCI_ATTR_PARSE_ERROR_OFFSET 129 /* Parse Error offset */
+#define OCI_ATTR_IS_TEMPORARY 130 /* whether table is temporary */
+#define OCI_ATTR_IS_TYPED 131 /* whether table is typed */
+#define OCI_ATTR_DURATION 132 /* duration of temporary table */
+#define OCI_ATTR_IS_INVOKER_RIGHTS 133 /* is invoker rights */
+#define OCI_ATTR_OBJ_NAME 134 /* top level schema obj name */
+#define OCI_ATTR_OBJ_SCHEMA 135 /* schema name */
+#define OCI_ATTR_OBJ_ID 136 /* top level schema object id */
+
+#define OCI_ATTR_DIRPATH_SORTED_INDEX 137 /* index that data is sorted on */
+
+ /* direct path index maint method (see oci8dp.h) */
+#define OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD 138
+
+ /* parallel load: db file, initial and next extent sizes */
+
+#define OCI_ATTR_DIRPATH_FILE 139 /* DB file to load into */
+#define OCI_ATTR_DIRPATH_STORAGE_INITIAL 140 /* initial extent size */
+#define OCI_ATTR_DIRPATH_STORAGE_NEXT 141 /* next extent size */
+
+
+#define OCI_ATTR_TRANS_TIMEOUT 142 /* transaction timeout */
+#define OCI_ATTR_SERVER_STATUS 143/* state of the server handle */
+#define OCI_ATTR_STATEMENT 144 /* statement txt in stmt hdl */
+
+ /* direct path index maint method (see oci8dp.h) */
+#define OCI_ATTR_DIRPATH_SKIPINDEX_METHOD 145
+
+#define OCI_ATTR_DEQCOND 146 /* dequeue condition */
+#define OCI_ATTR_RESERVED_2 147 /* reserved */
+
+
+#define OCI_ATTR_SUBSCR_RECPT 148 /* recepient of subscription */
+#define OCI_ATTR_SUBSCR_RECPTPROTO 149 /* protocol for recepient */
+
+ /* 8.2 dpapi support of ADTs */
+#define OCI_ATTR_DIRPATH_EXPR_TYPE 150 /* expr type of OCI_ATTR_NAME */
+
+#define OCI_ATTR_DIRPATH_INPUT 151 /* input in text or stream format */
+#define OCI_DIRPATH_INPUT_TEXT 0x01
+#define OCI_DIRPATH_INPUT_STREAM 0x02
+#define OCI_DIRPATH_INPUT_UNKNOWN 0x04
+
+#define OCI_ATTR_LDAP_HOST 153 /* LDAP host to connect to */
+#define OCI_ATTR_LDAP_PORT 154 /* LDAP port to connect to */
+#define OCI_ATTR_BIND_DN 155 /* bind DN */
+#define OCI_ATTR_LDAP_CRED 156 /* credentials to connect to LDAP */
+#define OCI_ATTR_WALL_LOC 157 /* client wallet location */
+#define OCI_ATTR_LDAP_AUTH 158 /* LDAP authentication method */
+#define OCI_ATTR_LDAP_CTX 159 /* LDAP adminstration context DN */
+#define OCI_ATTR_SERVER_DNS 160 /* list of registration server DNs */
+
+#define OCI_ATTR_DN_COUNT 161 /* the number of server DNs */
+#define OCI_ATTR_SERVER_DN 162 /* server DN attribute */
+
+#define OCI_ATTR_MAXCHAR_SIZE 163 /* max char size of data */
+
+#define OCI_ATTR_CURRENT_POSITION 164 /* for scrollable result sets*/
+
+/* Added to get attributes for ref cursor to statement handle */
+#define OCI_ATTR_RESERVED_3 165 /* reserved */
+#define OCI_ATTR_RESERVED_4 166 /* reserved */
+#define OCI_ATTR_DIRPATH_FN_CTX 167 /* fn ctx ADT attrs or args */
+#define OCI_ATTR_DIGEST_ALGO 168 /* digest algorithm */
+#define OCI_ATTR_CERTIFICATE 169 /* certificate */
+#define OCI_ATTR_SIGNATURE_ALGO 170 /* signature algorithm */
+#define OCI_ATTR_CANONICAL_ALGO 171 /* canonicalization algo. */
+#define OCI_ATTR_PRIVATE_KEY 172 /* private key */
+#define OCI_ATTR_DIGEST_VALUE 173 /* digest value */
+#define OCI_ATTR_SIGNATURE_VAL 174 /* signature value */
+#define OCI_ATTR_SIGNATURE 175 /* signature */
+
+/* attributes for setting OCI stmt caching specifics in svchp */
+#define OCI_ATTR_STMTCACHESIZE 176 /* size of the stm cache */
+
+/* --------------------------- Connection Pool Attributes ------------------ */
+#define OCI_ATTR_CONN_NOWAIT 178
+#define OCI_ATTR_CONN_BUSY_COUNT 179
+#define OCI_ATTR_CONN_OPEN_COUNT 180
+#define OCI_ATTR_CONN_TIMEOUT 181
+#define OCI_ATTR_STMT_STATE 182
+#define OCI_ATTR_CONN_MIN 183
+#define OCI_ATTR_CONN_MAX 184
+#define OCI_ATTR_CONN_INCR 185
+
+#define OCI_ATTR_DIRPATH_OID 187 /* loading into an OID col */
+
+#define OCI_ATTR_NUM_OPEN_STMTS 188 /* open stmts in session */
+#define OCI_ATTR_DESCRIBE_NATIVE 189 /* get native info via desc */
+
+#define OCI_ATTR_BIND_COUNT 190 /* number of bind postions */
+#define OCI_ATTR_HANDLE_POSITION 191 /* pos of bind/define handle */
+#define OCI_ATTR_RESERVED_5 192 /* reserverd */
+#define OCI_ATTR_SERVER_BUSY 193 /* call in progress on server*/
+
+#define OCI_ATTR_DIRPATH_SID 194 /* loading into an SID col */
+/* notification presentation for recipient */
+#define OCI_ATTR_SUBSCR_RECPTPRES 195
+#define OCI_ATTR_TRANSFORMATION 196 /* AQ message transformation */
+
+#define OCI_ATTR_ROWS_FETCHED 197 /* rows fetched in last call */
+
+/* --------------------------- Snapshot attributes ------------------------- */
+#define OCI_ATTR_SCN_BASE 198 /* snapshot base */
+#define OCI_ATTR_SCN_WRAP 199 /* snapshot wrap */
+
+/* --------------------------- Miscellanous attributes --------------------- */
+#define OCI_ATTR_RESERVED_6 200 /* reserved */
+#define OCI_ATTR_READONLY_TXN 201 /* txn is readonly */
+#define OCI_ATTR_RESERVED_7 202 /* reserved */
+#define OCI_ATTR_ERRONEOUS_COLUMN 203 /* position of erroneous col */
+#define OCI_ATTR_RESERVED_8 204 /* reserved */
+
+/* -------------------- 8.2 dpapi support of ADTs continued ---------------- */
+#define OCI_ATTR_DIRPATH_OBJ_CONSTR 206 /* obj type of subst obj tbl */
+#define OCI_ATTR_INST_TYPE 207 /* oracle instance type */
+/******USED attribute 208 for OCI_ATTR_SPOOL_STMTCACHESIZE*******************/
+
+#define OCI_ATTR_ENV_UTF16 209 /* is env in utf16 mode? */
+#define OCI_ATTR_RESERVED_9 210 /* reserved for TMZ */
+#define OCI_ATTR_RESERVED_10 211 /* reserved */
+
+/* Attr to allow setting of the stream version PRIOR to calling Prepare */
+#define OCI_ATTR_DIRPATH_STREAM_VERSION 212 /* version of the stream*/
+
+#define OCIP_ATTR_DIRPATH_VARRAY_INDEX 213 /* varray index column */
+
+#define OCI_ATTR_RESERVED_12 214 /* reserved */
+#define OCI_ATTR_RESERVED_13 215 /* reserved */
+#define OCI_ATTR_IS_EXTERNAL 216 /* whether table is external */
+
+
+/* -------------------------- Statement Handle Attributes ------------------ */
+
+#define OCI_ATTR_RESERVED_15 217 /* reserved */
+#define OCI_ATTR_STMT_IS_RETURNING 218 /* stmt has returning clause */
+#define OCI_ATTR_RESERVED_16 219 /* reserved */
+#define OCI_ATTR_RESERVED_17 220 /* reserved */
+#define OCI_ATTR_RESERVED_18 221 /* reserved */
+
+/* --------------------------- session attributes ---------------------------*/
+#define OCI_ATTR_RESERVED_19 222 /* reserved */
+
+/*------------- Supported Values for Direct Path Stream Version -------------*/
+#define OCI_DIRPATH_STREAM_VERSION_1 100
+#define OCI_DIRPATH_STREAM_VERSION_2 200
+#define OCI_DIRPATH_STREAM_VERSION_3 300 /* default */
+
+/* ----------------------- row callback attributes ------------------------- */
+#define OCI_ATTR_BIND_ROWCBK 301 /* bind row callback */
+#define OCI_ATTR_BIND_ROWCTX 302 /* ctx for bind row callback */
+#define OCI_ATTR_SKIP_BUFFER 303 /* skip buffer in array ops */
+
+/* -------- client side character and national character set ids ----------- */
+#define OCI_ATTR_ENV_CHARSET_ID OCI_ATTR_CHARSET_ID /* charset id in env */
+#define OCI_ATTR_ENV_NCHARSET_ID OCI_ATTR_NCHARSET_ID /* ncharset id in env */
+
+
+/*------------- Supported Values for protocol for recepient -----------------*/
+#define OCI_SUBSCR_PROTO_OCI 0 /* oci */
+#define OCI_SUBSCR_PROTO_MAIL 1 /* mail */
+#define OCI_SUBSCR_PROTO_SERVER 2 /* server */
+#define OCI_SUBSCR_PROTO_HTTP 3 /* http */
+#define OCI_SUBSCR_PROTO_MAX 4 /* max current protocols */
+
+/*------------- Supported Values for presentation for recepient -------------*/
+#define OCI_SUBSCR_PRES_DEFAULT 0 /* default */
+#define OCI_SUBSCR_PRES_XML 1 /* xml */
+#define OCI_SUBSCR_PRES_MAX 2 /* max current presentations */
+
+
+/* ----- Temporary attribute value for UCS2/UTF16 character set ID -------- */
+#define OCI_UCS2ID 1000 /* UCS2 charset ID */
+#define OCI_UTF16ID 1000 /* UTF16 charset ID */
+
+/*============================== End OCI Attribute Types ====================*/
+
+/*---------------- Server Handle Attribute Values ---------------------------*/
+
+/* OCI_ATTR_SERVER_STATUS */
+#define OCI_SERVER_NOT_CONNECTED 0x0
+#define OCI_SERVER_NORMAL 0x1
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------- Supported Namespaces ---------------------------*/
+#define OCI_SUBSCR_NAMESPACE_ANONYMOUS 0 /* Anonymous Namespace */
+#define OCI_SUBSCR_NAMESPACE_AQ 1 /* Advanced Queues */
+#define OCI_SUBSCR_NAMESPACE_MAX 2 /* Max Name Space Number */
+
+
+/*-------------------------Credential Types----------------------------------*/
+#define OCI_CRED_RDBMS 1 /* database username/password */
+#define OCI_CRED_EXT 2 /* externally provided credentials */
+#define OCI_CRED_PROXY 3 /* proxy authentication */
+#define OCI_CRED_RESERVED_1 4 /* reserved */
+#define OCI_CRED_RESERVED_2 5 /* reserved */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Error Return Values--------------------------------*/
+#define OCI_SUCCESS 0 /* maps to SQL_SUCCESS of SAG CLI */
+#define OCI_SUCCESS_WITH_INFO 1 /* maps to SQL_SUCCESS_WITH_INFO */
+#define OCI_RESERVED_FOR_INT_USE 200 /* reserved */
+#define OCI_NO_DATA 100 /* maps to SQL_NO_DATA */
+#define OCI_ERROR -1 /* maps to SQL_ERROR */
+#define OCI_INVALID_HANDLE -2 /* maps to SQL_INVALID_HANDLE */
+#define OCI_NEED_DATA 99 /* maps to SQL_NEED_DATA */
+#define OCI_STILL_EXECUTING -3123 /* OCI would block error */
+/*---------------------------------------------------------------------------*/
+
+/*--------------------- User Callback Return Values -------------------------*/
+#define OCI_CONTINUE -24200 /* Continue with the body of the OCI function */
+#define OCI_ROWCBK_DONE -24201 /* done with user row callback */
+/*---------------------------------------------------------------------------*/
+
+/*------------------DateTime and Interval check Error codes------------------*/
+
+/* DateTime Error Codes used by OCIDateTimeCheck() */
+#define OCI_DT_INVALID_DAY 0x1 /* Bad day */
+#define OCI_DT_DAY_BELOW_VALID 0x2 /* Bad DAy Low/high bit (1=low)*/
+#define OCI_DT_INVALID_MONTH 0x4 /* Bad MOnth */
+#define OCI_DT_MONTH_BELOW_VALID 0x8 /* Bad MOnth Low/high bit (1=low) */
+#define OCI_DT_INVALID_YEAR 0x10 /* Bad YeaR */
+#define OCI_DT_YEAR_BELOW_VALID 0x20 /* Bad YeaR Low/high bit (1=low) */
+#define OCI_DT_INVALID_HOUR 0x40 /* Bad HouR */
+#define OCI_DT_HOUR_BELOW_VALID 0x80 /* Bad HouR Low/high bit (1=low) */
+#define OCI_DT_INVALID_MINUTE 0x100 /* Bad MiNute */
+#define OCI_DT_MINUTE_BELOW_VALID 0x200 /*Bad MiNute Low/high bit (1=low) */
+#define OCI_DT_INVALID_SECOND 0x400 /* Bad SeCond */
+#define OCI_DT_SECOND_BELOW_VALID 0x800 /*bad second Low/high bit (1=low)*/
+#define OCI_DT_DAY_MISSING_FROM_1582 0x1000
+ /* Day is one of those "missing" from 1582 */
+#define OCI_DT_YEAR_ZERO 0x2000 /* Year may not equal zero */
+#define OCI_DT_INVALID_TIMEZONE 0x4000 /* Bad Timezone */
+#define OCI_DT_INVALID_FORMAT 0x8000 /* Bad date format input */
+
+
+/* Interval Error Codes used by OCIInterCheck() */
+#define OCI_INTER_INVALID_DAY 0x1 /* Bad day */
+#define OCI_INTER_DAY_BELOW_VALID 0x2 /* Bad DAy Low/high bit (1=low) */
+#define OCI_INTER_INVALID_MONTH 0x4 /* Bad MOnth */
+#define OCI_INTER_MONTH_BELOW_VALID 0x8 /*Bad MOnth Low/high bit (1=low) */
+#define OCI_INTER_INVALID_YEAR 0x10 /* Bad YeaR */
+#define OCI_INTER_YEAR_BELOW_VALID 0x20 /*Bad YeaR Low/high bit (1=low) */
+#define OCI_INTER_INVALID_HOUR 0x40 /* Bad HouR */
+#define OCI_INTER_HOUR_BELOW_VALID 0x80 /*Bad HouR Low/high bit (1=low) */
+#define OCI_INTER_INVALID_MINUTE 0x100 /* Bad MiNute */
+#define OCI_INTER_MINUTE_BELOW_VALID 0x200
+ /*Bad MiNute Low/high bit(1=low) */
+#define OCI_INTER_INVALID_SECOND 0x400 /* Bad SeCond */
+#define OCI_INTER_SECOND_BELOW_VALID 0x800
+ /*bad second Low/high bit(1=low) */
+#define OCI_INTER_INVALID_FRACSEC 0x1000 /* Bad Fractional second */
+#define OCI_INTER_FRACSEC_BELOW_VALID 0x2000
+ /* Bad fractional second Low/High */
+
+
+/*------------------------Parsing Syntax Types-------------------------------*/
+#define OCI_V7_SYNTAX 2 /* V815 language - for backwards compatibility */
+#define OCI_V8_SYNTAX 3 /* V815 language - for backwards compatibility */
+#define OCI_NTV_SYNTAX 1 /* Use what so ever is the native lang of server */
+ /* these values must match the values defined in kpul.h */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Scrollable Cursor Fetch Options-------------------
+ * For non-scrollable cursor, the only valid (and default) orientation is
+ * OCI_FETCH_NEXT
+ */
+#define OCI_FETCH_CURRENT 0x01 /* refetching current position */
+#define OCI_FETCH_NEXT 0x02 /* next row */
+#define OCI_FETCH_FIRST 0x04 /* first row of the result set */
+#define OCI_FETCH_LAST 0x08 /* the last row of the result set */
+#define OCI_FETCH_PRIOR 0x10 /* the previous row relative to current */
+#define OCI_FETCH_ABSOLUTE 0x20 /* absolute offset from first */
+#define OCI_FETCH_RELATIVE 0x40 /* offset relative to current */
+#define OCI_FETCH_RESERVED_1 0x80 /* reserved */
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Bind and Define Options----------------------------*/
+#define OCI_SB2_IND_PTR 0x00000001 /* unused */
+#define OCI_DATA_AT_EXEC 0x00000002 /* data at execute time */
+#define OCI_DYNAMIC_FETCH 0x00000002 /* fetch dynamically */
+#define OCI_PIECEWISE 0x00000004 /* piecewise DMLs or fetch */
+#define OCI_DEFINE_RESERVED_1 0x00000008 /* reserved */
+#define OCI_BIND_RESERVED_2 0x00000010 /* reserved */
+#define OCI_DEFINE_RESERVED_2 0x00000020 /* reserved */
+#define OCI_BIND_SOFT 0x00000040 /* soft bind or define */
+#define OCI_DEFINE_SOFT 0x00000080 /* soft bind or define */
+/*---------------------------------------------------------------------------*/
+
+/*----------------------------- Various Modes ------------------------------*/
+#define OCI_DEFAULT 0x00000000
+ /* the default value for parameters and attributes */
+/*-------------OCIInitialize Modes / OCICreateEnvironment Modes -------------*/
+#define OCI_THREADED 0x00000001 /* appl. in threaded environment */
+#define OCI_OBJECT 0x00000002 /* application in object environment */
+#define OCI_EVENTS 0x00000004 /* application is enabled for events */
+#define OCI_RESERVED1 0x00000008 /* reserved */
+#define OCI_SHARED 0x00000010 /* the application is in shared mode */
+#define OCI_RESERVED2 0x00000020 /* reserved */
+/* The following *TWO* are only valid for OCICreateEnvironment call */
+#define OCI_NO_UCB 0x00000040 /* No user callback called during ini */
+#define OCI_NO_MUTEX 0x00000080 /* the environment handle will not be */
+ /* protected by a mutex internally */
+#define OCI_SHARED_EXT 0x00000100 /* Used for shared forms */
+/************************** 0x00000200 free **********************************/
+#define OCI_ALWAYS_BLOCKING 0x00000400 /* all connections always blocking */
+/************************** 0x00000800 free **********************************/
+#define OCI_USE_LDAP 0x00001000 /* allow LDAP connections */
+#define OCI_REG_LDAPONLY 0x00002000 /* only register to LDAP */
+#define OCI_UTF16 0x00004000 /* mode for all UTF16 metadata */
+#define OCI_AFC_PAD_ON 0x00008000
+ /* turn on AFC blank padding when rlenp present */
+#define OCI_ENVCR_RESERVED3 0x00010000 /* reserved */
+#define OCI_NEW_LENGTH_SEMANTICS 0x00020000 /* adopt new length semantics */
+ /* the new length semantics, always bytes, is used by OCIEnvNlsCreate */
+#define OCI_NO_MUTEX_STMT 0x00040000 /* Do not mutex stmt handle */
+#define OCI_MUTEX_ENV_ONLY 0x00080000 /* Mutex only the environment handle */
+#define OCI_STM_RESERVED4 0x00100000 /* reserved */
+
+/*---------------------------------------------------------------------------*/
+/*------------------------OCIConnectionpoolCreate Modes----------------------*/
+
+#define OCI_CPOOL_REINITIALIZE 0x111
+
+/*---------------------------------------------------------------------------*/
+/*--------------------------------- OCILogon2 Modes -------------------------*/
+
+#define OCI_LOGON2_SPOOL 0x0001 /* Use session pool */
+#define OCI_LOGON2_CPOOL OCI_CPOOL /* Use connection pool */
+#define OCI_LOGON2_STMTCACHE 0x0004 /* Use Stmt Caching */
+#define OCI_LOGON2_PROXY 0x0008 /* Proxy authentiaction */
+
+/*---------------------------------------------------------------------------*/
+/*------------------------- OCISessionPoolCreate Modes ----------------------*/
+
+#define OCI_SPC_REINITIALIZE 0x0001 /* Reinitialize the session pool */
+#define OCI_SPC_HOMOGENEOUS 0x0002 /* Session pool is homogeneneous */
+#define OCI_SPC_STMTCACHE 0x0004 /* Session pool has stmt cache */
+
+/*---------------------------------------------------------------------------*/
+/*--------------------------- OCISessionGet Modes ---------------------------*/
+
+#define OCI_SESSGET_SPOOL 0x0001 /* SessionGet called in SPOOL mode */
+#define OCI_SESSGET_CPOOL OCI_CPOOL /* SessionGet called in CPOOL mode */
+#define OCI_SESSGET_STMTCACHE 0x0004 /* Use statement cache */
+#define OCI_SESSGET_CREDPROXY 0x0008 /* SessionGet called in proxy mode */
+#define OCI_SESSGET_CREDEXT 0x0010
+#define OCI_SESSGET_SPOOL_MATCHANY 0x0020
+/*---------------------------------------------------------------------------*/
+/*------------------------ATTR Values for Session Pool-----------------------*/
+/* Attribute values for OCI_ATTR_SPOOL_GETMODE */
+#define OCI_SPOOL_ATTRVAL_WAIT 0 /* block till you get a session */
+#define OCI_SPOOL_ATTRVAL_NOWAIT 1 /* error out if no session avaliable */
+#define OCI_SPOOL_ATTRVAL_FORCEGET 2 /* get session even if max is exceeded */
+
+/*---------------------------------------------------------------------------*/
+/*--------------------------- OCISessionRelease Modes -----------------------*/
+
+#define OCI_SESSRLS_DROPSESS 0x0001 /* Drop the Session */
+#define OCI_SESSRLS_RETAG 0x0002 /* Retag the session */
+
+/*---------------------------------------------------------------------------*/
+/*----------------------- OCISessionPoolDestroy Modes -----------------------*/
+
+#define OCI_SPD_FORCE 0x0001 /* Force the sessions to terminate.
+ Even if there are some busy
+ sessions close them */
+
+/*---------------------------------------------------------------------------*/
+/*----------------------------- Statement States ----------------------------*/
+
+#define OCI_STMT_STATE_INITIALIZED 0x0001
+#define OCI_STMT_STATE_EXECUTED 0x0002
+#define OCI_STMT_STATE_END_OF_FETCH 0x0003
+
+/*---------------------------------------------------------------------------*/
+
+/*----------------------------- OCIMemStats Modes ---------------------------*/
+#define OCI_MEM_INIT 0x01
+#define OCI_MEM_CLN 0x02
+#define OCI_MEM_FLUSH 0x04
+#define OCI_DUMP_HEAP 0x80
+
+#define OCI_CLIENT_STATS 0x10
+#define OCI_SERVER_STATS 0x20
+
+/*----------------------------- OCIEnvInit Modes ----------------------------*/
+/* NOTE: NO NEW MODES SHOULD BE ADDED HERE BECAUSE THE RECOMMENDED METHOD
+ * IS TO USE THE NEW OCICreateEnvironment MODES.
+ */
+#define OCI_ENV_NO_UCB 0x01 /* A user callback will not be called in
+ OCIEnvInit() */
+#define OCI_ENV_NO_MUTEX 0x08 /* the environment handle will not be protected
+ by a mutex internally */
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Prepare Modes ------------------------------------*/
+#define OCI_NO_SHARING 0x01 /* turn off statement handle sharing */
+#define OCI_PREP_RESERVED_1 0x02 /* reserved */
+#define OCI_PREP_AFC_PAD_ON 0x04 /* turn on blank padding for AFC */
+#define OCI_PREP_AFC_PAD_OFF 0x08 /* turn off blank padding for AFC */
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------*/
+
+/*----------------------- Execution Modes -----------------------------------*/
+#define OCI_BATCH_MODE 0x01 /* batch the oci statement for execution */
+#define OCI_EXACT_FETCH 0x02 /* fetch the exact rows specified */
+#define OCI_KEEP_FETCH_STATE 0x04 /* unused */
+#define OCI_STMT_SCROLLABLE_READONLY 0x08 /* if result set is scrollable */
+#define OCI_DESCRIBE_ONLY 0x10 /* only describe the statement */
+#define OCI_COMMIT_ON_SUCCESS 0x20 /* commit, if successful execution */
+#define OCI_NON_BLOCKING 0x40 /* non-blocking */
+#define OCI_BATCH_ERRORS 0x80 /* batch errors in array dmls */
+#define OCI_PARSE_ONLY 0x100 /* only parse the statement */
+#define OCI_EXACT_FETCH_RESERVED_1 0x200 /* reserved */
+#define OCI_SHOW_DML_WARNINGS 0x400
+ /* return OCI_SUCCESS_WITH_INFO for delete/update w/no where clause */
+#define OCI_EXEC_RESERVED_2 0x800 /* reserved */
+#define OCI_DESC_RESERVED_1 0x1000 /* reserved */
+#define OCI_EXEC_RESERVED_3 0x2000 /* reserved */
+#define OCI_EXEC_RESERVED_4 0x4000 /* reserved */
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Authentication Modes-------------------------------*/
+#define OCI_MIGRATE 0x0001 /* migratable auth context */
+#define OCI_SYSDBA 0x0002 /* for SYSDBA authorization */
+#define OCI_SYSOPER 0x0004 /* for SYSOPER authorization */
+#define OCI_PRELIM_AUTH 0x0008 /* for preliminary authorization */
+#define OCIP_ICACHE 0x0010 /* Private OCI cache mode to notify cache */
+#define OCI_AUTH_RESERVED_1 0x0020 /* reserved */
+#define OCI_STMT_CACHE 0x0040 /* enable OCI Stmt Caching */
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Session End Modes----------------------------------*/
+#define OCI_SESSEND_RESERVED_1 0x0001 /* reserved */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Attach Modes---------------------------------------*/
+
+/* The following attach modes are the same as the UPI modes defined in
+ * UPIDEF.H. Do not use these values externally.
+ */
+
+#define OCI_FASTPATH 0x0010 /* Attach in fast path mode */
+#define OCI_ATCH_RESERVED_1 0x0020 /* reserved */
+#define OCI_ATCH_RESERVED_2 0x0080 /* reserved */
+#define OCI_ATCH_RESERVED_3 0x0100 /* reserved */
+#define OCI_CPOOL 0x0200 /* Attach using server handle from pool */
+#define OCI_ATCH_RESERVED_4 0x0400 /* reserved */
+
+/*---------------------OCIStmtPrepare2 Modes---------------------------------*/
+#define OCI_PREP2_CACHE_SEARCHONLY 0x0010 /* ONly Search */
+#define OCI_PREP2_GET_PLSQL_WARNINGS 0x0020 /* Get PL/SQL warnings */
+
+/*---------------------OCIStmtRelease Modes----------------------------------*/
+#define OCI_STRLS_CACHE_DELETE 0x0010 /* Delete from Cache */
+
+/*-----------------------------End Various Modes ----------------------------*/
+
+/*------------------------Piece Information----------------------------------*/
+#define OCI_PARAM_IN 0x01 /* in parameter */
+#define OCI_PARAM_OUT 0x02 /* out parameter */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Transaction Start Flags --------------------------*/
+/* NOTE: OCI_TRANS_JOIN and OCI_TRANS_NOMIGRATE not supported in 8.0.X */
+#define OCI_TRANS_NEW 0x00000001 /* starts a new transaction branch */
+#define OCI_TRANS_JOIN 0x00000002 /* join an existing transaction */
+#define OCI_TRANS_RESUME 0x00000004 /* resume this transaction */
+#define OCI_TRANS_STARTMASK 0x000000ff
+
+#define OCI_TRANS_READONLY 0x00000100 /* starts a readonly transaction */
+#define OCI_TRANS_READWRITE 0x00000200 /* starts a read-write transaction */
+#define OCI_TRANS_SERIALIZABLE 0x00000400
+ /* starts a serializable transaction */
+#define OCI_TRANS_ISOLMASK 0x0000ff00
+
+#define OCI_TRANS_LOOSE 0x00010000 /* a loosely coupled branch */
+#define OCI_TRANS_TIGHT 0x00020000 /* a tightly coupled branch */
+#define OCI_TRANS_TYPEMASK 0x000f0000
+
+#define OCI_TRANS_NOMIGRATE 0x00100000 /* non migratable transaction */
+#define OCI_TRANS_SEPARABLE 0x00200000 /* separable transaction (8.1.6+) */
+
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Transaction End Flags ----------------------------*/
+#define OCI_TRANS_TWOPHASE 0x01000000 /* use two phase commit */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------- AQ Constants ------------------------------------
+ * NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+ * The following constants must match the PL/SQL dbms_aq constants
+ * NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+ */
+/* ------------------------- Visibility flags -------------------------------*/
+#define OCI_ENQ_IMMEDIATE 1 /* enqueue is an independent transaction */
+#define OCI_ENQ_ON_COMMIT 2 /* enqueue is part of current transaction */
+
+/* ----------------------- Dequeue mode flags -------------------------------*/
+#define OCI_DEQ_BROWSE 1 /* read message without acquiring a lock */
+#define OCI_DEQ_LOCKED 2 /* read and obtain write lock on message */
+#define OCI_DEQ_REMOVE 3 /* read the message and delete it */
+#define OCI_DEQ_REMOVE_NODATA 4 /* delete message w'o returning payload */
+#define OCI_DEQ_GETSIG 5 /* get signature only */
+
+/* ----------------- Dequeue navigation flags -------------------------------*/
+#define OCI_DEQ_FIRST_MSG 1 /* get first message at head of queue */
+#define OCI_DEQ_NEXT_MSG 3 /* next message that is available */
+#define OCI_DEQ_NEXT_TRANSACTION 2 /* get first message of next txn group */
+#define OCI_DEQ_MULT_TRANSACTION 5 /* array dequeue across txn groups */
+
+/* ----------------- Dequeue Option Reserved flags ------------------------- */
+#define OCI_DEQ_RESERVED_1 0x000001
+
+/* --------------------- Message states -------------------------------------*/
+#define OCI_MSG_WAITING 1 /* the message delay has not yet completed */
+#define OCI_MSG_READY 0 /* the message is ready to be processed */
+#define OCI_MSG_PROCESSED 2 /* the message has been processed */
+#define OCI_MSG_EXPIRED 3 /* message has moved to exception queue */
+
+/* --------------------- Sequence deviation ---------------------------------*/
+#define OCI_ENQ_BEFORE 2 /* enqueue message before another message */
+#define OCI_ENQ_TOP 3 /* enqueue message before all messages */
+
+/* ------------------------- Visibility flags -------------------------------*/
+#define OCI_DEQ_IMMEDIATE 1 /* dequeue is an independent transaction */
+#define OCI_DEQ_ON_COMMIT 2 /* dequeue is part of current transaction */
+
+/* ------------------------ Wait --------------------------------------------*/
+#define OCI_DEQ_WAIT_FOREVER -1 /* wait forever if no message available */
+#define OCI_DEQ_NO_WAIT 0 /* do not wait if no message is available */
+
+/* ------------------------ Delay -------------------------------------------*/
+#define OCI_MSG_NO_DELAY 0 /* message is available immediately */
+
+/* ------------------------- Expiration -------------------------------------*/
+#define OCI_MSG_NO_EXPIRATION -1 /* message will never expire */
+
+/* ------------------------- Reserved ---------------------------------------*/
+#define OCI_AQ_RESERVED_1 0x0002
+#define OCI_AQ_RESERVED_2 0x0004
+#define OCI_AQ_RESERVED_3 0x0008
+
+/* -------------------------- END AQ Constants ----------------------------- */
+
+/* --------------------END DateTime and Interval Constants ------------------*/
+
+/*-----------------------Object Types----------------------------------------*/
+/*-----------Object Types **** Not to be Used **** --------------------------*/
+/* Deprecated */
+#define OCI_OTYPE_UNK 0
+#define OCI_OTYPE_TABLE 1
+#define OCI_OTYPE_VIEW 2
+#define OCI_OTYPE_SYN 3
+#define OCI_OTYPE_PROC 4
+#define OCI_OTYPE_FUNC 5
+#define OCI_OTYPE_PKG 6
+#define OCI_OTYPE_STMT 7
+/*---------------------------------------------------------------------------*/
+
+/*=======================Describe Handle Parameter Attributes ===============*/
+/*
+ These attributes are orthogonal to the other set of attributes defined
+ above. These attrubutes are tobe used only for the desscribe handle
+*/
+/*===========================================================================*/
+/* Attributes common to Columns and Stored Procs */
+#define OCI_ATTR_DATA_SIZE 1 /* maximum size of the data */
+#define OCI_ATTR_DATA_TYPE 2 /* the SQL type of the column/argument */
+#define OCI_ATTR_DISP_SIZE 3 /* the display size */
+#define OCI_ATTR_NAME 4 /* the name of the column/argument */
+#define OCI_ATTR_PRECISION 5 /* precision if number type */
+#define OCI_ATTR_SCALE 6 /* scale if number type */
+#define OCI_ATTR_IS_NULL 7 /* is it null ? */
+#define OCI_ATTR_TYPE_NAME 8
+ /* name of the named data type or a package name for package private types */
+#define OCI_ATTR_SCHEMA_NAME 9 /* the schema name */
+#define OCI_ATTR_SUB_NAME 10 /* type name if package private type */
+#define OCI_ATTR_POSITION 11
+ /* relative position of col/arg in the list of cols/args */
+/* complex object retrieval parameter attributes */
+#define OCI_ATTR_COMPLEXOBJECTCOMP_TYPE 50
+#define OCI_ATTR_COMPLEXOBJECTCOMP_TYPE_LEVEL 51
+#define OCI_ATTR_COMPLEXOBJECT_LEVEL 52
+#define OCI_ATTR_COMPLEXOBJECT_COLL_OUTOFLINE 53
+
+/* Only Columns */
+#define OCI_ATTR_DISP_NAME 100 /* the display name */
+
+/*Only Stored Procs */
+#define OCI_ATTR_OVERLOAD 210 /* is this position overloaded */
+#define OCI_ATTR_LEVEL 211 /* level for structured types */
+#define OCI_ATTR_HAS_DEFAULT 212 /* has a default value */
+#define OCI_ATTR_IOMODE 213 /* in, out inout */
+#define OCI_ATTR_RADIX 214 /* returns a radix */
+#define OCI_ATTR_NUM_ARGS 215 /* total number of arguments */
+
+/* only named type attributes */
+#define OCI_ATTR_TYPECODE 216 /* object or collection */
+#define OCI_ATTR_COLLECTION_TYPECODE 217 /* varray or nested table */
+#define OCI_ATTR_VERSION 218 /* user assigned version */
+#define OCI_ATTR_IS_INCOMPLETE_TYPE 219 /* is this an incomplete type */
+#define OCI_ATTR_IS_SYSTEM_TYPE 220 /* a system type */
+#define OCI_ATTR_IS_PREDEFINED_TYPE 221 /* a predefined type */
+#define OCI_ATTR_IS_TRANSIENT_TYPE 222 /* a transient type */
+#define OCI_ATTR_IS_SYSTEM_GENERATED_TYPE 223 /* system generated type */
+#define OCI_ATTR_HAS_NESTED_TABLE 224 /* contains nested table attr */
+#define OCI_ATTR_HAS_LOB 225 /* has a lob attribute */
+#define OCI_ATTR_HAS_FILE 226 /* has a file attribute */
+#define OCI_ATTR_COLLECTION_ELEMENT 227 /* has a collection attribute */
+#define OCI_ATTR_NUM_TYPE_ATTRS 228 /* number of attribute types */
+#define OCI_ATTR_LIST_TYPE_ATTRS 229 /* list of type attributes */
+#define OCI_ATTR_NUM_TYPE_METHODS 230 /* number of type methods */
+#define OCI_ATTR_LIST_TYPE_METHODS 231 /* list of type methods */
+#define OCI_ATTR_MAP_METHOD 232 /* map method of type */
+#define OCI_ATTR_ORDER_METHOD 233 /* order method of type */
+
+/* only collection element */
+#define OCI_ATTR_NUM_ELEMS 234 /* number of elements */
+
+/* only type methods */
+#define OCI_ATTR_ENCAPSULATION 235 /* encapsulation level */
+#define OCI_ATTR_IS_SELFISH 236 /* method selfish */
+#define OCI_ATTR_IS_VIRTUAL 237 /* virtual */
+#define OCI_ATTR_IS_INLINE 238 /* inline */
+#define OCI_ATTR_IS_CONSTANT 239 /* constant */
+#define OCI_ATTR_HAS_RESULT 240 /* has result */
+#define OCI_ATTR_IS_CONSTRUCTOR 241 /* constructor */
+#define OCI_ATTR_IS_DESTRUCTOR 242 /* destructor */
+#define OCI_ATTR_IS_OPERATOR 243 /* operator */
+#define OCI_ATTR_IS_MAP 244 /* a map method */
+#define OCI_ATTR_IS_ORDER 245 /* order method */
+#define OCI_ATTR_IS_RNDS 246 /* read no data state method */
+#define OCI_ATTR_IS_RNPS 247 /* read no process state */
+#define OCI_ATTR_IS_WNDS 248 /* write no data state method */
+#define OCI_ATTR_IS_WNPS 249 /* write no process state */
+
+#define OCI_ATTR_DESC_PUBLIC 250 /* public object */
+
+/* Object Cache Enhancements : attributes for User Constructed Instances */
+#define OCI_ATTR_CACHE_CLIENT_CONTEXT 251
+#define OCI_ATTR_UCI_CONSTRUCT 252
+#define OCI_ATTR_UCI_DESTRUCT 253
+#define OCI_ATTR_UCI_COPY 254
+#define OCI_ATTR_UCI_PICKLE 255
+#define OCI_ATTR_UCI_UNPICKLE 256
+#define OCI_ATTR_UCI_REFRESH 257
+
+/* for type inheritance */
+#define OCI_ATTR_IS_SUBTYPE 258
+#define OCI_ATTR_SUPERTYPE_SCHEMA_NAME 259
+#define OCI_ATTR_SUPERTYPE_NAME 260
+
+/* for schemas */
+#define OCI_ATTR_LIST_OBJECTS 261 /* list of objects in schema */
+
+/* for database */
+#define OCI_ATTR_NCHARSET_ID 262 /* char set id */
+#define OCI_ATTR_LIST_SCHEMAS 263 /* list of schemas */
+#define OCI_ATTR_MAX_PROC_LEN 264 /* max procedure length */
+#define OCI_ATTR_MAX_COLUMN_LEN 265 /* max column name length */
+#define OCI_ATTR_CURSOR_COMMIT_BEHAVIOR 266 /* cursor commit behavior */
+#define OCI_ATTR_MAX_CATALOG_NAMELEN 267 /* catalog namelength */
+#define OCI_ATTR_CATALOG_LOCATION 268 /* catalog location */
+#define OCI_ATTR_SAVEPOINT_SUPPORT 269 /* savepoint support */
+#define OCI_ATTR_NOWAIT_SUPPORT 270 /* nowait support */
+#define OCI_ATTR_AUTOCOMMIT_DDL 271 /* autocommit DDL */
+#define OCI_ATTR_LOCKING_MODE 272 /* locking mode */
+
+/* for externally initialized context */
+#define OCI_ATTR_APPCTX_SIZE 273 /* count of context to be init*/
+#define OCI_ATTR_APPCTX_LIST 274 /* count of context to be init*/
+#define OCI_ATTR_APPCTX_NAME 275 /* name of context to be init*/
+#define OCI_ATTR_APPCTX_ATTR 276 /* attr of context to be init*/
+#define OCI_ATTR_APPCTX_VALUE 277 /* value of context to be init*/
+
+/* for client id propagation */
+#define OCI_ATTR_CLIENT_IDENTIFIER 278 /* value of client id to set*/
+
+/* for inheritance - part 2 */
+#define OCI_ATTR_IS_FINAL_TYPE 279 /* is final type ? */
+#define OCI_ATTR_IS_INSTANTIABLE_TYPE 280 /* is instantiable type ? */
+#define OCI_ATTR_IS_FINAL_METHOD 281 /* is final method ? */
+#define OCI_ATTR_IS_INSTANTIABLE_METHOD 282 /* is instantiable method ? */
+#define OCI_ATTR_IS_OVERRIDING_METHOD 283 /* is overriding method ? */
+
+/* slot 284 available */
+
+#define OCI_ATTR_CHAR_USED 285 /* char length semantics */
+#define OCI_ATTR_CHAR_SIZE 286 /* char length */
+
+/* SQLJ support */
+#define OCI_ATTR_IS_JAVA_TYPE 287 /* is java implemented type ? */
+
+/* N-Tier support */
+#define OCI_ATTR_DISTINGUISHED_NAME 300 /* use DN as user name */
+#define OCI_ATTR_KERBEROS_TICKET 301 /* Kerberos ticket as cred. */
+
+/* for multilanguage debugging */
+#define OCI_ATTR_ORA_DEBUG_JDWP 302 /* ORA_DEBUG_JDWP attribute */
+
+#define OCI_ATTR_RESERVED_14 303 /* reserved */
+
+
+/*---------------------------End Describe Handle Attributes -----------------*/
+
+/*------------- Supported Values for Direct Path Date cache -----------------*/
+#define OCI_ATTR_DIRPATH_DCACHE_NUM 303 /* date cache entries */
+#define OCI_ATTR_DIRPATH_DCACHE_SIZE 304 /* date cache limit */
+#define OCI_ATTR_DIRPATH_DCACHE_MISSES 305 /* date cache misses */
+#define OCI_ATTR_DIRPATH_DCACHE_HITS 306 /* date cache hits */
+#define OCI_ATTR_DIRPATH_DCACHE_DISABLE 307 /* on set: disable datecache
+ * on overflow.
+ * on get: datecache disabled?
+ * could be due to overflow
+ * or others */
+
+/* ----------------------- Session Pool Attributes ------------------------- */
+#define OCI_ATTR_SPOOL_TIMEOUT 308 /* session timeout */
+#define OCI_ATTR_SPOOL_GETMODE 309 /* session get mode */
+#define OCI_ATTR_SPOOL_BUSY_COUNT 310 /* busy session count */
+#define OCI_ATTR_SPOOL_OPEN_COUNT 311 /* open session count */
+#define OCI_ATTR_SPOOL_MIN 312 /* min session count */
+#define OCI_ATTR_SPOOL_MAX 313 /* max session count */
+#define OCI_ATTR_SPOOL_INCR 314 /* session increment count */
+#define OCI_ATTR_SPOOL_STMTCACHESIZE 208 /*Stmt cache size of pool */
+/*------------------------------End Session Pool Attributes -----------------*/
+/*---------------------------- For XML Types ------------------------------- */
+/* For table, view and column */
+#define OCI_ATTR_IS_XMLTYPE 315 /* Is the type an XML type? */
+#define OCI_ATTR_XMLSCHEMA_NAME 316 /* Name of XML Schema */
+#define OCI_ATTR_XMLELEMENT_NAME 317 /* Name of XML Element */
+#define OCI_ATTR_XMLSQLTYPSCH_NAME 318 /* SQL type's schema for XML Ele */
+#define OCI_ATTR_XMLSQLTYPE_NAME 319 /* Name of SQL type for XML Ele */
+#define OCI_ATTR_XMLTYPE_STORED_OBJ 320 /* XML type stored as object? */
+
+/*---------------------------- For Subtypes ------------------------------- */
+/* For type */
+#define OCI_ATTR_HAS_SUBTYPES 321 /* Has subtypes? */
+#define OCI_ATTR_NUM_SUBTYPES 322 /* Number of subtypes */
+#define OCI_ATTR_LIST_SUBTYPES 323 /* List of subtypes */
+
+/* XML flag */
+#define OCI_ATTR_XML_HRCHY_ENABLED 324 /* hierarchy enabled? */
+
+/* Method flag */
+#define OCI_ATTR_IS_OVERRIDDEN_METHOD 325 /* Method is overridden? */
+
+/*------------- Attributes for 10i Updates to the DirPath API ---------------*/
+#define OCI_ATTR_DIRPATH_RESERVED_7 326 /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_8 327 /* reserved */
+#define OCI_ATTR_DIRPATH_CONVERT 328 /* stream conversion needed? */
+#define OCI_ATTR_DIRPATH_BADROW 329 /* info about bad row */
+#define OCI_ATTR_DIRPATH_BADROW_LENGTH 330 /* length of bad row info */
+#define OCI_ATTR_DIRPATH_WRITE_ORDER 331 /* column fill order */
+#define OCI_ATTR_DIRPATH_GRANULE_SIZE 332 /* granule size for unload */
+#define OCI_ATTR_DIRPATH_GRANULE_OFFSET 333 /* offset to last granule */
+#define OCI_ATTR_DIRPATH_RESERVED_1 334 /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_2 335 /* reserved */
+
+/*------------- Attributes for 10i Distributed Objects ----------------------*/
+#define OCI_ATTR_OBJ_SUBS 336 /* obj col/tab substitutable */
+
+/*------ Attributes for 10i DirPathAPI conversion (NLS lang, terr, cs) ------*/
+#define OCI_ATTR_DIRPATH_RESERVED_3 337 /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_4 338 /* reserved */
+
+
+/*---------- Attributes for 10i XADFIELD (NLS language, territory -----------*/
+#define OCI_ATTR_XADFIELD_RESERVED_1 339 /* reserved */
+#define OCI_ATTR_XADFIELD_RESERVED_2 340 /* reserved */
+/*------------- Kerberos Secure Client Identifier ---------------------------*/
+#define OCI_ATTR_KERBEROS_CID 341 /* Kerberos db service ticket*/
+
+
+/*------------------------ Attributes for Rules objects ---------------------*/
+#define OCI_ATTR_CONDITION 342 /* rule condition */
+#define OCI_ATTR_COMMENT 343 /* comment */
+#define OCI_ATTR_VALUE 344 /* Anydata value */
+#define OCI_ATTR_EVAL_CONTEXT_OWNER 345 /* eval context owner */
+#define OCI_ATTR_EVAL_CONTEXT_NAME 346 /* eval context name */
+#define OCI_ATTR_EVALUATION_FUNCTION 347 /* eval function name */
+#define OCI_ATTR_VAR_TYPE 348 /* variable type */
+#define OCI_ATTR_VAR_VALUE_FUNCTION 349 /* variable value function */
+#define OCI_ATTR_VAR_METHOD_FUNCTION 350 /* variable method function */
+#define OCI_ATTR_ACTION_CONTEXT 351 /* action context */
+#define OCI_ATTR_LIST_TABLE_ALIASES 352 /* list of table aliases */
+#define OCI_ATTR_LIST_VARIABLE_TYPES 353 /* list of variable types */
+#define OCI_ATTR_TABLE_NAME 356 /* table name */
+
+#define OCI_ATTR_DIRPATH_RESERVED_5 357 /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_6 358 /* reserved */
+
+#define OCI_ATTR_DIRPATH_LOCK_WAIT 359 /* wait for lock in dpapi */
+
+#define OCI_ATTR_MESSAGE_CSCN 360 /* message cscn */
+#define OCI_ATTR_MESSAGE_DSCN 361 /* message dscn */
+
+/*--------------------- Audit Session ID ------------------------------------*/
+#define OCI_ATTR_AUDIT_SESSION_ID 362 /* Audit session ID */
+
+/*--------------------- Kerberos TGT Keys -----------------------------------*/
+#define OCI_ATTR_KERBEROS_KEY 363 /* n-tier Kerberos cred key */
+#define OCI_ATTR_KERBEROS_CID_KEY 364 /* SCID Kerberos cred key */
+
+
+#define OCI_ATTR_TRANSACTION_NO 365 /* AQ enq txn number */
+
+/*----------------------- Attributes for End To End Tracing -----------------*/
+#define OCI_ATTR_MODULE 366 /* module for tracing */
+#define OCI_ATTR_ACTION 367 /* action for tracing */
+#define OCI_ATTR_CLIENT_INFO 368 /* client info */
+#define OCI_ATTR_COLLECT_CALL_TIME 369 /* collect call time */
+#define OCI_ATTR_CALL_TIME 370 /* extract call time */
+#define OCI_ATTR_ECONTEXT_ID 371 /* execution-id context */
+#define OCI_ATTR_ECONTEXT_SEQ 372 /*execution-id sequence num */
+
+
+/*---------------- Describe Handle Parameter Attribute Values ---------------*/
+
+/* OCI_ATTR_CURSOR_COMMIT_BEHAVIOR */
+#define OCI_CURSOR_OPEN 0
+#define OCI_CURSOR_CLOSED 1
+
+/* OCI_ATTR_CATALOG_LOCATION */
+#define OCI_CL_START 0
+#define OCI_CL_END 1
+
+/* OCI_ATTR_SAVEPOINT_SUPPORT */
+#define OCI_SP_SUPPORTED 0
+#define OCI_SP_UNSUPPORTED 1
+
+/* OCI_ATTR_NOWAIT_SUPPORT */
+#define OCI_NW_SUPPORTED 0
+#define OCI_NW_UNSUPPORTED 1
+
+/* OCI_ATTR_AUTOCOMMIT_DDL */
+#define OCI_AC_DDL 0
+#define OCI_NO_AC_DDL 1
+
+/* OCI_ATTR_LOCKING_MODE */
+#define OCI_LOCK_IMMEDIATE 0
+#define OCI_LOCK_DELAYED 1
+
+/* ------------------- Instance type attribute values -----------------------*/
+#define OCI_INSTANCE_TYPE_UNKNOWN 0
+#define OCI_INSTANCE_TYPE_RDBMS 1
+#define OCI_INSTANCE_TYPE_OSM 2
+
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------OCIPasswordChange-------------------------------*/
+#define OCI_AUTH 0x08 /* Change the password but do not login */
+
+
+/*------------------------Other Constants------------------------------------*/
+#define OCI_MAX_FNS 100 /* max number of OCI Functions */
+#define OCI_SQLSTATE_SIZE 5
+#define OCI_ERROR_MAXMSG_SIZE 1024 /* max size of an error message */
+#define OCI_LOBMAXSIZE MINUB4MAXVAL /* maximum lob data size */
+#define OCI_ROWID_LEN 23
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Fail Over Events ---------------------------------*/
+#define OCI_FO_END 0x00000001
+#define OCI_FO_ABORT 0x00000002
+#define OCI_FO_REAUTH 0x00000004
+#define OCI_FO_BEGIN 0x00000008
+#define OCI_FO_ERROR 0x00000010
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Fail Over Callback Return Codes ------------------*/
+#define OCI_FO_RETRY 25410
+/*---------------------------------------------------------------------------*/
+
+/*------------------------- Fail Over Types ---------------------------------*/
+#define OCI_FO_NONE 0x00000001
+#define OCI_FO_SESSION 0x00000002
+#define OCI_FO_SELECT 0x00000004
+#define OCI_FO_TXNAL 0x00000008
+/*---------------------------------------------------------------------------*/
+
+/*-----------------------Function Codes--------------------------------------*/
+#define OCI_FNCODE_INITIALIZE 1 /* OCIInitialize */
+#define OCI_FNCODE_HANDLEALLOC 2 /* OCIHandleAlloc */
+#define OCI_FNCODE_HANDLEFREE 3 /* OCIHandleFree */
+#define OCI_FNCODE_DESCRIPTORALLOC 4 /* OCIDescriptorAlloc */
+#define OCI_FNCODE_DESCRIPTORFREE 5 /* OCIDescriptorFree */
+#define OCI_FNCODE_ENVINIT 6 /* OCIEnvInit */
+#define OCI_FNCODE_SERVERATTACH 7 /* OCIServerAttach */
+#define OCI_FNCODE_SERVERDETACH 8 /* OCIServerDetach */
+/* unused 9 */
+#define OCI_FNCODE_SESSIONBEGIN 10 /* OCISessionBegin */
+#define OCI_FNCODE_SESSIONEND 11 /* OCISessionEnd */
+#define OCI_FNCODE_PASSWORDCHANGE 12 /* OCIPasswordChange */
+#define OCI_FNCODE_STMTPREPARE 13 /* OCIStmtPrepare */
+ /* unused 14- 16 */
+#define OCI_FNCODE_BINDDYNAMIC 17 /* OCIBindDynamic */
+#define OCI_FNCODE_BINDOBJECT 18 /* OCIBindObject */
+ /* 19 unused */
+#define OCI_FNCODE_BINDARRAYOFSTRUCT 20 /* OCIBindArrayOfStruct */
+#define OCI_FNCODE_STMTEXECUTE 21 /* OCIStmtExecute */
+ /* unused 22-24 */
+#define OCI_FNCODE_DEFINEOBJECT 25 /* OCIDefineObject */
+#define OCI_FNCODE_DEFINEDYNAMIC 26 /* OCIDefineDynamic */
+#define OCI_FNCODE_DEFINEARRAYOFSTRUCT 27 /* OCIDefineArrayOfStruct */
+#define OCI_FNCODE_STMTFETCH 28 /* OCIStmtFetch */
+#define OCI_FNCODE_STMTGETBIND 29 /* OCIStmtGetBindInfo */
+ /* 30, 31 unused */
+#define OCI_FNCODE_DESCRIBEANY 32 /* OCIDescribeAny */
+#define OCI_FNCODE_TRANSSTART 33 /* OCITransStart */
+#define OCI_FNCODE_TRANSDETACH 34 /* OCITransDetach */
+#define OCI_FNCODE_TRANSCOMMIT 35 /* OCITransCommit */
+ /* 36 unused */
+#define OCI_FNCODE_ERRORGET 37 /* OCIErrorGet */
+#define OCI_FNCODE_LOBOPENFILE 38 /* OCILobFileOpen */
+#define OCI_FNCODE_LOBCLOSEFILE 39 /* OCILobFileClose */
+ /* 40 was LOBCREATEFILE, unused */
+ /* 41 was OCILobFileDelete, unused */
+#define OCI_FNCODE_LOBCOPY 42 /* OCILobCopy */
+#define OCI_FNCODE_LOBAPPEND 43 /* OCILobAppend */
+#define OCI_FNCODE_LOBERASE 44 /* OCILobErase */
+#define OCI_FNCODE_LOBLENGTH 45 /* OCILobGetLength */
+#define OCI_FNCODE_LOBTRIM 46 /* OCILobTrim */
+#define OCI_FNCODE_LOBREAD 47 /* OCILobRead */
+#define OCI_FNCODE_LOBWRITE 48 /* OCILobWrite */
+ /* 49 unused */
+#define OCI_FNCODE_SVCCTXBREAK 50 /* OCIBreak */
+#define OCI_FNCODE_SERVERVERSION 51 /* OCIServerVersion */
+
+#define OCI_FNCODE_KERBATTRSET 52 /* OCIKerbAttrSet */
+
+/* unused 53 */
+
+#define OCI_FNCODE_ATTRGET 54 /* OCIAttrGet */
+#define OCI_FNCODE_ATTRSET 55 /* OCIAttrSet */
+#define OCI_FNCODE_PARAMSET 56 /* OCIParamSet */
+#define OCI_FNCODE_PARAMGET 57 /* OCIParamGet */
+#define OCI_FNCODE_STMTGETPIECEINFO 58 /* OCIStmtGetPieceInfo */
+#define OCI_FNCODE_LDATOSVCCTX 59 /* OCILdaToSvcCtx */
+ /* 60 unused */
+#define OCI_FNCODE_STMTSETPIECEINFO 61 /* OCIStmtSetPieceInfo */
+#define OCI_FNCODE_TRANSFORGET 62 /* OCITransForget */
+#define OCI_FNCODE_TRANSPREPARE 63 /* OCITransPrepare */
+#define OCI_FNCODE_TRANSROLLBACK 64 /* OCITransRollback */
+#define OCI_FNCODE_DEFINEBYPOS 65 /* OCIDefineByPos */
+#define OCI_FNCODE_BINDBYPOS 66 /* OCIBindByPos */
+#define OCI_FNCODE_BINDBYNAME 67 /* OCIBindByName */
+#define OCI_FNCODE_LOBASSIGN 68 /* OCILobAssign */
+#define OCI_FNCODE_LOBISEQUAL 69 /* OCILobIsEqual */
+#define OCI_FNCODE_LOBISINIT 70 /* OCILobLocatorIsInit */
+
+#define OCI_FNCODE_LOBENABLEBUFFERING 71 /* OCILobEnableBuffering */
+#define OCI_FNCODE_LOBCHARSETID 72 /* OCILobCharSetID */
+#define OCI_FNCODE_LOBCHARSETFORM 73 /* OCILobCharSetForm */
+#define OCI_FNCODE_LOBFILESETNAME 74 /* OCILobFileSetName */
+#define OCI_FNCODE_LOBFILEGETNAME 75 /* OCILobFileGetName */
+#define OCI_FNCODE_LOGON 76 /* OCILogon */
+#define OCI_FNCODE_LOGOFF 77 /* OCILogoff */
+#define OCI_FNCODE_LOBDISABLEBUFFERING 78 /* OCILobDisableBuffering */
+#define OCI_FNCODE_LOBFLUSHBUFFER 79 /* OCILobFlushBuffer */
+#define OCI_FNCODE_LOBLOADFROMFILE 80 /* OCILobLoadFromFile */
+
+#define OCI_FNCODE_LOBOPEN 81 /* OCILobOpen */
+#define OCI_FNCODE_LOBCLOSE 82 /* OCILobClose */
+#define OCI_FNCODE_LOBISOPEN 83 /* OCILobIsOpen */
+#define OCI_FNCODE_LOBFILEISOPEN 84 /* OCILobFileIsOpen */
+#define OCI_FNCODE_LOBFILEEXISTS 85 /* OCILobFileExists */
+#define OCI_FNCODE_LOBFILECLOSEALL 86 /* OCILobFileCloseAll */
+#define OCI_FNCODE_LOBCREATETEMP 87 /* OCILobCreateTemporary */
+#define OCI_FNCODE_LOBFREETEMP 88 /* OCILobFreeTemporary */
+#define OCI_FNCODE_LOBISTEMP 89 /* OCILobIsTemporary */
+
+#define OCI_FNCODE_AQENQ 90 /* OCIAQEnq */
+#define OCI_FNCODE_AQDEQ 91 /* OCIAQDeq */
+#define OCI_FNCODE_RESET 92 /* OCIReset */
+#define OCI_FNCODE_SVCCTXTOLDA 93 /* OCISvcCtxToLda */
+#define OCI_FNCODE_LOBLOCATORASSIGN 94 /* OCILobLocatorAssign */
+
+#define OCI_FNCODE_UBINDBYNAME 95
+
+#define OCI_FNCODE_AQLISTEN 96 /* OCIAQListen */
+
+#define OCI_FNCODE_SVC2HST 97 /* reserved */
+#define OCI_FNCODE_SVCRH 98 /* reserved */
+ /* 97 and 98 are reserved for Oracle internal use */
+
+#define OCI_FNCODE_TRANSMULTIPREPARE 99 /* OCITransMultiPrepare */
+
+#define OCI_FNCODE_CPOOLCREATE 100 /* OCIConnectionPoolCreate */
+#define OCI_FNCODE_CPOOLDESTROY 101 /* OCIConnectionPoolDestroy */
+#define OCI_FNCODE_LOGON2 102 /* OCILogon2 */
+#define OCI_FNCODE_ROWIDTOCHAR 103 /* OCIRowidToChar */
+
+#define OCI_FNCODE_SPOOLCREATE 104 /* OCISessionPoolCreate */
+#define OCI_FNCODE_SPOOLDESTROY 105 /* OCISessionPoolDestroy */
+#define OCI_FNCODE_SESSIONGET 106 /* OCISessionGet */
+#define OCI_FNCODE_SESSIONRELEASE 107 /* OCISessionRelease */
+#define OCI_FNCODE_STMTPREPARE2 108 /* OCIStmtPrepare2 */
+#define OCI_FNCODE_STMTRELEASE 109 /* OCIStmtRelease */
+#define OCI_FNCODE_AQENQARRAY 110 /* OCIAQEnqArray */
+#define OCI_FNCODE_AQDEQARRAY 111 /* OCIAQDeqArray */
+#define OCI_FNCODE_LOBCOPY2 112 /* OCILobCopy2 */
+#define OCI_FNCODE_LOBERASE2 113 /* OCILobErase2 */
+#define OCI_FNCODE_LOBLENGTH2 114 /* OCILobGetLength2 */
+#define OCI_FNCODE_LOBLOADFROMFILE2 115 /* OCILobLoadFromFile2 */
+#define OCI_FNCODE_LOBREAD2 116 /* OCILobRead2 */
+#define OCI_FNCODE_LOBTRIM2 117 /* OCILobTrim2 */
+#define OCI_FNCODE_LOBWRITE2 118 /* OCILobWrite2 */
+#define OCI_FNCODE_LOBGETSTORAGELIMIT 119 /* OCILobGetStorageLimit */
+
+#define OCI_FNCODE_MAXFCN 119 /* maximum OCI function code */
+
+
+/*---------------------------------------------------------------------------*/
+
+/*-----------------------Handle Definitions----------------------------------*/
+typedef struct OCIEnv OCIEnv; /* OCI environment handle */
+typedef struct OCIError OCIError; /* OCI error handle */
+typedef struct OCISvcCtx OCISvcCtx; /* OCI service handle */
+typedef struct OCIStmt OCIStmt; /* OCI statement handle */
+typedef struct OCIBind OCIBind; /* OCI bind handle */
+typedef struct OCIDefine OCIDefine; /* OCI Define handle */
+typedef struct OCIDescribe OCIDescribe; /* OCI Describe handle */
+typedef struct OCIServer OCIServer; /* OCI Server handle */
+typedef struct OCISession OCISession; /* OCI Authentication handle */
+typedef struct OCIComplexObject OCIComplexObject; /* OCI COR handle */
+typedef struct OCITrans OCITrans; /* OCI Transaction handle */
+typedef struct OCISecurity OCISecurity; /* OCI Security handle */
+typedef struct OCISubscription OCISubscription; /* subscription handle */
+
+typedef struct OCICPool OCICPool; /* connection pool handle */
+typedef struct OCISPool OCISPool; /* session pool handle */
+typedef struct OCIAuthInfo OCIAuthInfo; /* auth handle */
+
+/*-----------------------Descriptor Definitions------------------------------*/
+typedef struct OCISnapshot OCISnapshot; /* OCI snapshot descriptor */
+typedef struct OCIResult OCIResult; /* OCI Result Set Descriptor */
+typedef struct OCILobLocator OCILobLocator; /* OCI Lob Locator descriptor */
+typedef struct OCIParam OCIParam; /* OCI PARameter descriptor */
+typedef struct OCIComplexObjectComp OCIComplexObjectComp;
+ /* OCI COR descriptor */
+typedef struct OCIRowid OCIRowid; /* OCI ROWID descriptor */
+
+typedef struct OCIDateTime OCIDateTime; /* OCI DateTime descriptor */
+typedef struct OCIInterval OCIInterval; /* OCI Interval descriptor */
+
+typedef struct OCIUcb OCIUcb; /* OCI User Callback descriptor */
+typedef struct OCIServerDNs OCIServerDNs; /* OCI server DN descriptor */
+
+/*-------------------------- AQ Descriptors ---------------------------------*/
+typedef struct OCIAQEnqOptions OCIAQEnqOptions; /* AQ Enqueue Options hdl */
+typedef struct OCIAQDeqOptions OCIAQDeqOptions; /* AQ Dequeue Options hdl */
+typedef struct OCIAQMsgProperties OCIAQMsgProperties; /* AQ Mesg Properties */
+typedef struct OCIAQAgent OCIAQAgent; /* AQ Agent descriptor */
+typedef struct OCIAQNfyDescriptor OCIAQNfyDescriptor; /* AQ Nfy descriptor */
+typedef struct OCIAQSignature OCIAQSignature; /* AQ Siganture */
+/*---------------------------------------------------------------------------*/
+
+/* Lob typedefs for Pro*C */
+typedef struct OCILobLocator OCIClobLocator; /* OCI Character LOB Locator */
+typedef struct OCILobLocator OCIBlobLocator; /* OCI Binary LOB Locator */
+typedef struct OCILobLocator OCIBFileLocator; /* OCI Binary LOB File Locator */
+/*---------------------------------------------------------------------------*/
+
+/* Undefined value for tz in interval types*/
+#define OCI_INTHR_UNK 24
+
+ /* These defined adjustment values */
+#define OCI_ADJUST_UNK 10
+#define OCI_ORACLE_DATE 0
+#define OCI_ANSI_DATE 1
+
+/*------------------------ Lob-specific Definitions -------------------------*/
+
+/*
+ * ociloff - OCI Lob OFFset
+ *
+ * The offset in the lob data. The offset is specified in terms of bytes for
+ * BLOBs and BFILes. Character offsets are used for CLOBs, NCLOBs.
+ * The maximum size of internal lob data is 4 gigabytes. FILE LOB
+ * size is limited by the operating system.
+ */
+typedef ub4 OCILobOffset;
+
+/*
+ * ocillen - OCI Lob LENgth (of lob data)
+ *
+ * Specifies the length of lob data in bytes for BLOBs and BFILes and in
+ * characters for CLOBs, NCLOBs. The maximum length of internal lob
+ * data is 4 gigabytes. The length of FILE LOBs is limited only by the
+ * operating system.
+ */
+typedef ub4 OCILobLength;
+/*
+ * ocilmo - OCI Lob open MOdes
+ *
+ * The mode specifies the planned operations that will be performed on the
+ * FILE lob data. The FILE lob can be opened in read-only mode only.
+ *
+ * In the future, we may include read/write, append and truncate modes. Append
+ * is equivalent to read/write mode except that the FILE is positioned for
+ * writing to the end. Truncate is equivalent to read/write mode except that
+ * the FILE LOB data is first truncated to a length of 0 before use.
+ */
+enum OCILobMode
+{
+ OCI_LOBMODE_READONLY = 1, /* read-only */
+ OCI_LOBMODE_READWRITE = 2 /* read_write for internal lobs only */
+};
+typedef enum OCILobMode OCILobMode;
+
+/*---------------------------------------------------------------------------*/
+
+
+/*----------------------------Piece Definitions------------------------------*/
+
+/* if ocidef.h is being included in the app, ocidef.h should precede oci.h */
+
+/*
+ * since clients may use oci.h, ocidef.h and ocidfn.h the following defines
+ * need to be guarded, usually internal clients
+ */
+
+#ifndef OCI_FLAGS
+#define OCI_FLAGS
+#define OCI_ONE_PIECE 0 /* one piece */
+#define OCI_FIRST_PIECE 1 /* the first piece */
+#define OCI_NEXT_PIECE 2 /* the next of many pieces */
+#define OCI_LAST_PIECE 3 /* the last piece */
+#endif
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- FILE open modes -------------------------------*/
+#define OCI_FILE_READONLY 1 /* readonly mode open for FILE types */
+/*---------------------------------------------------------------------------*/
+/*--------------------------- LOB open modes --------------------------------*/
+#define OCI_LOB_READONLY 1 /* readonly mode open for ILOB types */
+#define OCI_LOB_READWRITE 2 /* read write mode open for ILOBs */
+
+/*----------------------- LOB Buffering Flush Flags -------------------------*/
+#define OCI_LOB_BUFFER_FREE 1
+#define OCI_LOB_BUFFER_NOFREE 2
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- OCI Statement Types ---------------------------*/
+
+#define OCI_STMT_SELECT 1 /* select statement */
+#define OCI_STMT_UPDATE 2 /* update statement */
+#define OCI_STMT_DELETE 3 /* delete statement */
+#define OCI_STMT_INSERT 4 /* Insert Statement */
+#define OCI_STMT_CREATE 5 /* create statement */
+#define OCI_STMT_DROP 6 /* drop statement */
+#define OCI_STMT_ALTER 7 /* alter statement */
+#define OCI_STMT_BEGIN 8 /* begin ... (pl/sql statement)*/
+#define OCI_STMT_DECLARE 9 /* declare .. (pl/sql statement ) */
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- OCI Parameter Types ---------------------------*/
+#define OCI_PTYPE_UNK 0 /* unknown */
+#define OCI_PTYPE_TABLE 1 /* table */
+#define OCI_PTYPE_VIEW 2 /* view */
+#define OCI_PTYPE_PROC 3 /* procedure */
+#define OCI_PTYPE_FUNC 4 /* function */
+#define OCI_PTYPE_PKG 5 /* package */
+#define OCI_PTYPE_TYPE 6 /* user-defined type */
+#define OCI_PTYPE_SYN 7 /* synonym */
+#define OCI_PTYPE_SEQ 8 /* sequence */
+#define OCI_PTYPE_COL 9 /* column */
+#define OCI_PTYPE_ARG 10 /* argument */
+#define OCI_PTYPE_LIST 11 /* list */
+#define OCI_PTYPE_TYPE_ATTR 12 /* user-defined type's attribute */
+#define OCI_PTYPE_TYPE_COLL 13 /* collection type's element */
+#define OCI_PTYPE_TYPE_METHOD 14 /* user-defined type's method */
+#define OCI_PTYPE_TYPE_ARG 15 /* user-defined type method's arg */
+#define OCI_PTYPE_TYPE_RESULT 16/* user-defined type method's result */
+#define OCI_PTYPE_SCHEMA 17 /* schema */
+#define OCI_PTYPE_DATABASE 18 /* database */
+#define OCI_PTYPE_RULE 19 /* rule */
+#define OCI_PTYPE_RULE_SET 20 /* rule set */
+#define OCI_PTYPE_EVALUATION_CONTEXT 21 /* evaluation context */
+#define OCI_PTYPE_TABLE_ALIAS 22 /* table alias */
+#define OCI_PTYPE_VARIABLE_TYPE 23 /* variable type */
+#define OCI_PTYPE_NAME_VALUE 24 /* name value pair */
+
+/*---------------------------------------------------------------------------*/
+
+/*----------------------------- OCI List Types ------------------------------*/
+#define OCI_LTYPE_UNK 0 /* unknown */
+#define OCI_LTYPE_COLUMN 1 /* column list */
+#define OCI_LTYPE_ARG_PROC 2 /* procedure argument list */
+#define OCI_LTYPE_ARG_FUNC 3 /* function argument list */
+#define OCI_LTYPE_SUBPRG 4 /* subprogram list */
+#define OCI_LTYPE_TYPE_ATTR 5 /* type attribute */
+#define OCI_LTYPE_TYPE_METHOD 6 /* type method */
+#define OCI_LTYPE_TYPE_ARG_PROC 7 /* type method w/o result argument list */
+#define OCI_LTYPE_TYPE_ARG_FUNC 8 /* type method w/result argument list */
+#define OCI_LTYPE_SCH_OBJ 9 /* schema object list */
+#define OCI_LTYPE_DB_SCH 10 /* database schema list */
+#define OCI_LTYPE_TYPE_SUBTYPE 11 /* subtype list */
+#define OCI_LTYPE_TABLE_ALIAS 12 /* table alias list */
+#define OCI_LTYPE_VARIABLE_TYPE 13 /* variable type list */
+#define OCI_LTYPE_NAME_VALUE 14 /* name value list */
+
+/*---------------------------------------------------------------------------*/
+
+/*-------------------------- Memory Cartridge Services ---------------------*/
+#define OCI_MEMORY_CLEARED 1
+
+/*-------------------------- Pickler Cartridge Services ---------------------*/
+typedef struct OCIPicklerTdsCtx OCIPicklerTdsCtx;
+typedef struct OCIPicklerTds OCIPicklerTds;
+typedef struct OCIPicklerImage OCIPicklerImage;
+typedef struct OCIPicklerFdo OCIPicklerFdo;
+typedef ub4 OCIPicklerTdsElement;
+
+typedef struct OCIAnyData OCIAnyData;
+
+typedef struct OCIAnyDataSet OCIAnyDataSet;
+typedef struct OCIAnyDataCtx OCIAnyDataCtx;
+
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- User Callback Constants -----------------------*/
+#define OCI_UCBTYPE_ENTRY 1 /* entry callback */
+#define OCI_UCBTYPE_EXIT 2 /* exit callback */
+#define OCI_UCBTYPE_REPLACE 3 /* replacement callback */
+
+/*---------------------------------------------------------------------------*/
+
+/*--------------------- NLS service type and constance ----------------------*/
+#define OCI_NLS_DAYNAME1 1 /* Native name for Monday */
+#define OCI_NLS_DAYNAME2 2 /* Native name for Tuesday */
+#define OCI_NLS_DAYNAME3 3 /* Native name for Wednesday */
+#define OCI_NLS_DAYNAME4 4 /* Native name for Thursday */
+#define OCI_NLS_DAYNAME5 5 /* Native name for Friday */
+#define OCI_NLS_DAYNAME6 6 /* Native name for for Saturday */
+#define OCI_NLS_DAYNAME7 7 /* Native name for for Sunday */
+#define OCI_NLS_ABDAYNAME1 8 /* Native abbreviated name for Monday */
+#define OCI_NLS_ABDAYNAME2 9 /* Native abbreviated name for Tuesday */
+#define OCI_NLS_ABDAYNAME3 10 /* Native abbreviated name for Wednesday */
+#define OCI_NLS_ABDAYNAME4 11 /* Native abbreviated name for Thursday */
+#define OCI_NLS_ABDAYNAME5 12 /* Native abbreviated name for Friday */
+#define OCI_NLS_ABDAYNAME6 13 /* Native abbreviated name for for Saturday */
+#define OCI_NLS_ABDAYNAME7 14 /* Native abbreviated name for for Sunday */
+#define OCI_NLS_MONTHNAME1 15 /* Native name for January */
+#define OCI_NLS_MONTHNAME2 16 /* Native name for February */
+#define OCI_NLS_MONTHNAME3 17 /* Native name for March */
+#define OCI_NLS_MONTHNAME4 18 /* Native name for April */
+#define OCI_NLS_MONTHNAME5 19 /* Native name for May */
+#define OCI_NLS_MONTHNAME6 20 /* Native name for June */
+#define OCI_NLS_MONTHNAME7 21 /* Native name for July */
+#define OCI_NLS_MONTHNAME8 22 /* Native name for August */
+#define OCI_NLS_MONTHNAME9 23 /* Native name for September */
+#define OCI_NLS_MONTHNAME10 24 /* Native name for October */
+#define OCI_NLS_MONTHNAME11 25 /* Native name for November */
+#define OCI_NLS_MONTHNAME12 26 /* Native name for December */
+#define OCI_NLS_ABMONTHNAME1 27 /* Native abbreviated name for January */
+#define OCI_NLS_ABMONTHNAME2 28 /* Native abbreviated name for February */
+#define OCI_NLS_ABMONTHNAME3 29 /* Native abbreviated name for March */
+#define OCI_NLS_ABMONTHNAME4 30 /* Native abbreviated name for April */
+#define OCI_NLS_ABMONTHNAME5 31 /* Native abbreviated name for May */
+#define OCI_NLS_ABMONTHNAME6 32 /* Native abbreviated name for June */
+#define OCI_NLS_ABMONTHNAME7 33 /* Native abbreviated name for July */
+#define OCI_NLS_ABMONTHNAME8 34 /* Native abbreviated name for August */
+#define OCI_NLS_ABMONTHNAME9 35 /* Native abbreviated name for September */
+#define OCI_NLS_ABMONTHNAME10 36 /* Native abbreviated name for October */
+#define OCI_NLS_ABMONTHNAME11 37 /* Native abbreviated name for November */
+#define OCI_NLS_ABMONTHNAME12 38 /* Native abbreviated name for December */
+#define OCI_NLS_YES 39 /* Native string for affirmative response */
+#define OCI_NLS_NO 40 /* Native negative response */
+#define OCI_NLS_AM 41 /* Native equivalent string of AM */
+#define OCI_NLS_PM 42 /* Native equivalent string of PM */
+#define OCI_NLS_AD 43 /* Native equivalent string of AD */
+#define OCI_NLS_BC 44 /* Native equivalent string of BC */
+#define OCI_NLS_DECIMAL 45 /* decimal character */
+#define OCI_NLS_GROUP 46 /* group separator */
+#define OCI_NLS_DEBIT 47 /* Native symbol of debit */
+#define OCI_NLS_CREDIT 48 /* Native sumbol of credit */
+#define OCI_NLS_DATEFORMAT 49 /* Oracle date format */
+#define OCI_NLS_INT_CURRENCY 50 /* International currency symbol */
+#define OCI_NLS_LOC_CURRENCY 51 /* Locale currency symbol */
+#define OCI_NLS_LANGUAGE 52 /* Language name */
+#define OCI_NLS_ABLANGUAGE 53 /* Abbreviation for language name */
+#define OCI_NLS_TERRITORY 54 /* Territory name */
+#define OCI_NLS_CHARACTER_SET 55 /* Character set name */
+#define OCI_NLS_LINGUISTIC_NAME 56 /* Linguistic name */
+#define OCI_NLS_CALENDAR 57 /* Calendar name */
+#define OCI_NLS_DUAL_CURRENCY 78 /* Dual currency symbol */
+#define OCI_NLS_WRITINGDIR 79 /* Language writing direction */
+#define OCI_NLS_ABTERRITORY 80 /* Territory Abbreviation */
+#define OCI_NLS_DDATEFORMAT 81 /* Oracle default date format */
+#define OCI_NLS_DTIMEFORMAT 82 /* Oracle default time format */
+#define OCI_NLS_SFDATEFORMAT 83 /* Local string formatted date format */
+#define OCI_NLS_SFTIMEFORMAT 84 /* Local string formatted time format */
+#define OCI_NLS_NUMGROUPING 85 /* Number grouping fields */
+#define OCI_NLS_LISTSEP 86 /* List separator */
+#define OCI_NLS_MONDECIMAL 87 /* Monetary decimal character */
+#define OCI_NLS_MONGROUP 88 /* Monetary group separator */
+#define OCI_NLS_MONGROUPING 89 /* Monetary grouping fields */
+#define OCI_NLS_INT_CURRENCYSEP 90 /* International currency separator */
+#define OCI_NLS_CHARSET_MAXBYTESZ 91 /* Maximum character byte size */
+#define OCI_NLS_CHARSET_FIXEDWIDTH 92 /* Fixed-width charset byte size */
+#define OCI_NLS_CHARSET_ID 93 /* Character set id */
+#define OCI_NLS_NCHARSET_ID 94 /* NCharacter set id */
+
+#define OCI_NLS_MAXBUFSZ 100 /* Max buffer size may need for OCINlsGetInfo */
+
+#define OCI_NLS_BINARY 0x1 /* for the binary comparison */
+#define OCI_NLS_LINGUISTIC 0x2 /* for linguistic comparison */
+#define OCI_NLS_CASE_INSENSITIVE 0x10 /* for case-insensitive comparison */
+
+#define OCI_NLS_UPPERCASE 0x20 /* convert to uppercase */
+#define OCI_NLS_LOWERCASE 0x40 /* convert to lowercase */
+
+#define OCI_NLS_CS_IANA_TO_ORA 0 /* Map charset name from IANA to Oracle */
+#define OCI_NLS_CS_ORA_TO_IANA 1 /* Map charset name from Oracle to IANA */
+#define OCI_NLS_LANG_ISO_TO_ORA 2 /* Map language name from ISO to Oracle */
+#define OCI_NLS_LANG_ORA_TO_ISO 3 /* Map language name from Oracle to ISO */
+#define OCI_NLS_TERR_ISO_TO_ORA 4 /* Map territory name from ISO to Oracle*/
+#define OCI_NLS_TERR_ORA_TO_ISO 5 /* Map territory name from Oracle to ISO*/
+#define OCI_NLS_TERR_ISO3_TO_ORA 6 /* Map territory name from 3-letter ISO */
+ /* abbreviation to Oracle */
+#define OCI_NLS_TERR_ORA_TO_ISO3 7 /* Map territory name from Oracle to */
+ /* 3-letter ISO abbreviation */
+
+typedef struct OCIMsg OCIMsg;
+typedef ub4 OCIWchar;
+
+#define OCI_XMLTYPE_CREATE_OCISTRING 1
+#define OCI_XMLTYPE_CREATE_CLOB 2
+#define OCI_XMLTYPE_CREATE_BLOB 3
+
+/*------------------------- Kerber Authentication Modes ---------------------*/
+#define OCI_KERBCRED_PROXY 1 /* Apply Kerberos Creds for Proxy */
+#define OCI_KERBCRED_CLIENT_IDENTIFIER 2/*Apply Creds for Secure Client ID */
+
+/*---------------------------------------------------------------------------
+ PRIVATE TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+/* None */
+
+/*---------------------------------------------------------------------------
+ PUBLIC FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+/* see ociap.h or ocikp.h */
+
+/*---------------------------------------------------------------------------
+ PRIVATE FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+/* None */
+
+
+#endif /* OCI_ORACLE */
+
+
+/* more includes */
+
+#ifndef OCI1_ORACLE
+#include <oci1.h>
+#endif
+
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+
+#ifndef ORI_ORACLE
+#include <ori.h>
+#endif
+
+#ifndef ORL_ORACLE
+#include <orl.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+#ifndef OCIEXTP_ORACLE
+#include <ociextp.h>
+#endif
+
+#include <ociapr.h>
+#include <ociap.h>
+
+#ifndef OCIXMLDB_ORACLE
+#include <ocixmldb.h>
+#endif
+
+#ifndef OCI8DP_ORACLE
+#include <oci8dp.h> /* interface definitions for the direct path api */
+#endif
+
+#ifndef OCIEXTP_ORACLE
+#include <ociextp.h>
+#endif
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/oci1.h b/src/terralib/drivers/OracleSpatial/OCI/include/oci1.h
new file mode 100644
index 0000000..21a86b9
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/oci1.h
@@ -0,0 +1,183 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/oci1.h,v 1.3 2005/05/06 16:48:55 karine Exp $
+ */
+
+/* Copyright (c) Oracle Corporation 1997, 1998. All Rights Reserved. */
+
+/* NOTE: See 'header_template.doc' in the 'doc' dve under the 'forms'
+ directory for the header file template that includes instructions.
+*/
+
+/*
+ NAME
+ oci1.h - Cartridge Service definitions
+
+ DESCRIPTION
+ <short description of component this file declares/defines>
+
+ RELATED DOCUMENTS
+
+ INSPECTION STATUS
+ Inspection date:
+ Inspection status:
+ Estimated increasing cost defects per page:
+ Rule sets:
+
+ ACCEPTANCE REVIEW STATUS
+ Review date:
+ Review status:
+ Reviewers:
+
+ PUBLIC FUNCTION(S)
+ <list of external functions declared/defined - with one-line descriptions>
+
+ PRIVATE FUNCTION(S)
+ <list of static functions defined in .c file - with one-line descriptions>
+
+ EXAMPLES
+
+ NOTES
+ <other useful comments, qualifications, etc.>
+
+ MODIFIED (MM/DD/YY)
+ nramakri 01/16/98 - remove #ifdef NEVER clause
+ ewaugh 12/18/97 - Turn type wrappers into functions.
+ skabraha 12/02/97 - Adding data structures & constants for OCIFile
+ rhwu 12/02/97 - OCI Thread
+ nramakri 12/15/97 - move to core4
+ ewaugh 12/11/97 - add OCIFormat package constants
+ ssamu 12/10/97 - do not include s.h
+ nramakri 11/19/97 - add OCIExtract definitions
+ ssamu 11/14/97 - creation
+
+*/
+
+
+#ifndef OCI1_ORACLE
+# define OCI1_ORACLE
+
+# ifndef ORATYPES
+# include <oratypes.h>
+# endif
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+/* Constants required by the OCIFormat package. */
+
+#define OCIFormatUb1(variable) OCIFormatTUb1(), &(variable)
+#define OCIFormatUb2(variable) OCIFormatTUb2(), &(variable)
+#define OCIFormatUb4(variable) OCIFormatTUb4(), &(variable)
+#define OCIFormatUword(variable) OCIFormatTUword(), &(variable)
+#define OCIFormatUbig_ora(variable) OCIFormatTUbig_ora(), &(variable)
+#define OCIFormatSb1(variable) OCIFormatTSb1(), &(variable)
+#define OCIFormatSb2(variable) OCIFormatTSb2(), &(variable)
+#define OCIFormatSb4(variable) OCIFormatTSb4(), &(variable)
+#define OCIFormatSword(variable) OCIFormatTSword(), &(variable)
+#define OCIFormatSbig_ora(variable) OCIFormatTSbig_ora(), &(variable)
+#define OCIFormatEb1(variable) OCIFormatTEb1(), &(variable)
+#define OCIFormatEb2(variable) OCIFormatTEb2(), &(variable)
+#define OCIFormatEb4(variable) OCIFormatTEb4(), &(variable)
+#define OCIFormatEword(variable) OCIFormatTEword(), &(variable)
+#define OCIFormatChar(variable) OCIFormatTChar(), &(variable)
+#define OCIFormatText(variable) OCIFormatTText(), (variable)
+#define OCIFormatDouble(variable) OCIFormatTDouble(), &(variable)
+#define OCIFormatDvoid(variable) OCIFormatTDvoid(), (variable)
+#define OCIFormatEnd OCIFormatTEnd()
+
+#define OCIFormatDP 6
+
+
+/*----------------- Public Constants for OCIFile -------------------------*/
+
+/* flags for open.*/
+/* flags for mode */
+#define OCI_FILE_READ_ONLY 1 /* open for read only */
+#define OCI_FILE_WRITE_ONLY 2 /* open for write only */
+#define OCI_FILE_READ_WRITE 3 /* open for read & write */
+/* flags for create */
+#define OCI_FILE_EXIST 0 /* the file should exist */
+#define OCI_FILE_CREATE 1 /* create if the file doesn't exist */
+#define OCI_FILE_EXCL 2 /* the file should not exist */
+#define OCI_FILE_TRUNCATE 4 /* create if the file doesn't exist,
+ else truncate file the file to 0 */
+#define OCI_FILE_APPEND 8 /* open the file in append mode */
+
+/* flags for seek */
+#define OCI_FILE_SEEK_BEGINNING 1 /* seek from the beginning of the file */
+#define OCI_FILE_SEEK_CURRENT 2 /* seek from the current position */
+#define OCI_FILE_SEEK_END 3 /* seek from the end of the file */
+
+#define OCI_FILE_FORWARD 1 /* seek forward */
+#define OCI_FILE_BACKWARD 2 /* seek backward */
+
+/* file type */
+#define OCI_FILE_BIN 0 /* binary file */
+#define OCI_FILE_TEXT 1 /* text file */
+#define OCI_FILE_STDIN 2 /* standard i/p */
+#define OCI_FILE_STDOUT 3 /* standard o/p */
+#define OCI_FILE_STDERR 4 /* standard error */
+
+/* Represents an open file */
+typedef struct OCIFileObject OCIFileObject;
+
+
+/*--------------------- OCI Thread Object Definitions------------------------*/
+
+/* OCIThread Context */
+typedef struct OCIThreadContext OCIThreadContext;
+
+/* OCIThread Mutual Exclusion Lock */
+typedef struct OCIThreadMutex OCIThreadMutex;
+
+/* OCIThread Key for Thread-Specific Data */
+typedef struct OCIThreadKey OCIThreadKey;
+
+/* OCIThread Thread ID */
+typedef struct OCIThreadId OCIThreadId;
+
+/* OCIThread Thread Handle */
+typedef struct OCIThreadHandle OCIThreadHandle;
+
+
+/*-------------------- OCI Thread Callback Function Pointers ----------------*/
+
+/* OCIThread Key Destructor Function Type */
+typedef void (*OCIThreadKeyDestFunc)(/*_ dvoid * _*/);
+
+
+/* Flags passed into OCIExtractFromXXX routines to direct processing */
+#define OCI_EXTRACT_CASE_SENSITIVE 0x1 /* matching is case sensitive */
+#define OCI_EXTRACT_UNIQUE_ABBREVS 0x2 /* unique abbreviations for keys
+ are allowed */
+#define OCI_EXTRACT_APPEND_VALUES 0x4 /* if multiple values for a key
+ exist, this determines if the
+ new value should be appended
+ to (or replace) the current
+ list of values */
+
+/* Constants passed into OCIExtractSetKey routine */
+#define OCI_EXTRACT_MULTIPLE 0x8 /* key can accept multiple values */
+#define OCI_EXTRACT_TYPE_BOOLEAN 1 /* key type is boolean */
+#define OCI_EXTRACT_TYPE_STRING 2 /* key type is string */
+#define OCI_EXTRACT_TYPE_INTEGER 3 /* key type is integer */
+#define OCI_EXTRACT_TYPE_OCINUM 4 /* key type is ocinum */
+
+/*---------------------------------------------------------------------------
+ PRIVATE TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ PRIVATE FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+#endif /* OCI1_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/oci8dp.h b/src/terralib/drivers/OracleSpatial/OCI/include/oci8dp.h
new file mode 100644
index 0000000..eea652f
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/oci8dp.h
@@ -0,0 +1,315 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/oci8dp.h,v 1.3 2005/05/06 16:48:55 karine Exp $
+ */
+
+/* Copyright (c) 1998, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ oci8dp.h - OCI: Direct Path API interface prototypes.
+
+ DESCRIPTION
+ Public types, constants, and interfaces to the direct path API.
+
+ RELATED DOCUMENTS
+
+ NOTES
+ This file is not directly included by the application, this file
+ is included by "oci.h", which the application should include.
+
+ MODIFIED (MM/DD/YY)
+ srseshad 03/12/03 - convert oci public api to ansi
+ msakayed 10/28/02 - Bug #2643907: add OCI_ATTR_DIRPATH_SKIPINDEX_METHOD
+ cmlim 04/13/01 - remove OCIDirPathStreamToStream - not used by dpapi
+ cmlim 04/02/01 - OCI_DIRPATH_EXPR_OPQ_SQL_FN to OCI_DIRPATH_EXPR_SQL
+ ebatbout 01/22/01 - PARTIAL value for OCIDirPathDataSave action parameter
+ cmlim 07/20/00 - support opaques/sql strings in 8.2 dpapi
+ cmlim 08/14/00 - support refs in 8.2 dpapi
+ cmlim 04/17/00 - add defines for OCIDirPathFuncCtx handle & OCI_ATTR_D
+ whe 09/01/99 - 976457:check __cplusplus for C++ code
+ abrumm 04/16/99 - dpapi: more attributes
+ abrumm 02/26/99 - add defines for DataSave action
+ abrumm 10/04/98 - clen must be a ub4
+ abrumm 05/27/98 - add column array flag values
+ abrumm 05/12/98 - direct path api support
+ abrumm 03/31/98 - OCI direct path interface support
+ abrumm 03/18/98 - Creation
+
+*/
+
+#ifndef OCI8DP_ORACLE
+# define OCI8DP_ORACLE
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+/*----- Handles and descriptors for direct path operations (OCIDirPath*) ----*/
+
+typedef struct OCIDirPathCtx OCIDirPathCtx; /* context */
+typedef struct OCIDirPathFuncCtx OCIDirPathFuncCtx; /* function context */
+typedef struct OCIDirPathColArray OCIDirPathColArray; /* column array */
+typedef struct OCIDirPathStream OCIDirPathStream; /* stream */
+typedef struct OCIDirPathDesc OCIDirPathDesc; /* direct path descriptor */
+
+ /*----- Defines for Direct Path Options -----*/
+
+ /* values for OCI_ATTR_DIRPATH_MODE attribute */
+#define OCI_DIRPATH_LOAD 1 /* direct path load operation */
+#define OCI_DIRPATH_UNLOAD 2 /* direct path unload operation */
+#define OCI_DIRPATH_CONVERT 3 /* direct path convert only operation */
+
+ /*----- values for OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD attribute -----*/
+#define OCI_DIRPATH_INDEX_MAINT_SINGLE_ROW 1
+
+/* Note that there are two attributes dealing with index maintenance -
+ * OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD and OCI_ATTR_DIRPATH_SKIPINDEX_METHOD.
+ * OCI_ATTR_DIRPATH_SKIPINDEX_METHOD exists to isolate the behavior for
+ * skipping index maintenance since maintenance of unusable indexes is
+ * orthogonal to that of single row insertion.
+ * For backwards compatibility we still allow users to specify skip
+ * methods in OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD so make sure the
+ * enumerations for the two attributes are distinct.
+ */
+ /*----- values for OCI_ATTR_DIRPATH_SKIPINDEX_METHOD attribute -----*/
+#define OCI_DIRPATH_INDEX_MAINT_SKIP_UNUSABLE 2
+#define OCI_DIRPATH_INDEX_MAINT_DONT_SKIP_UNUSABLE 3
+#define OCI_DIRPATH_INDEX_MAINT_SKIP_ALL 4
+
+ /* values for OCI_ATTR_STATE attribute of OCIDirPathCtx */
+#define OCI_DIRPATH_NORMAL 1 /* can accept rows, last row complete */
+#define OCI_DIRPATH_PARTIAL 2 /* last row was partial */
+#define OCI_DIRPATH_NOT_PREPARED 3 /* direct path context is not prepared */
+
+ /*----- values for cflg argument to OCIDirpathColArrayEntrySet -----*/
+#define OCI_DIRPATH_COL_COMPLETE 0 /* column data is complete */
+#define OCI_DIRPATH_COL_NULL 1 /* column is null */
+#define OCI_DIRPATH_COL_PARTIAL 2 /* column data is partial */
+
+ /*----- values for action parameter to OCIDirPathDataSave -----*/
+#define OCI_DIRPATH_DATASAVE_SAVEONLY 0 /* data save point only */
+#define OCI_DIRPATH_DATASAVE_FINISH 1 /* execute finishing logic */
+/* save portion of input data (before space error occurred) and finish */
+#define OCI_DIRPATH_DATASAVE_PARTIAL 2
+
+ /*- OCI_ATTR_DIRPATH_EXPR_TYPE values (describes OCI_ATTR_NAME expr type) -*/
+#define OCI_DIRPATH_EXPR_OBJ_CONSTR 1 /* NAME is an object constructor */
+#define OCI_DIRPATH_EXPR_SQL 2 /* NAME is an opaque or sql function */
+#define OCI_DIRPATH_EXPR_REF_TBLNAME 3 /* NAME is table name if ref is scoped*/
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+/*------------------------ OCIDirPathCtx Operations -------------------------*/
+
+/*
+ NAME
+ OCIDirPathAbort - OCI: Abort a direct path operation.
+
+ DESCRIPTION
+ Aborts a direct path operation. Upon successful completion
+ the direct path context is no longer valid.
+
+ RETURNS
+ An OCI error code, Oracle errors are returned via the error handle.
+ NOTES
+ */
+sword
+OCIDirPathAbort( OCIDirPathCtx *dpctx, OCIError *errhp );
+
+/*
+ NAME
+ OCIDirPathDataSave - OCI: Execute a data save point.
+
+ DESCRIPTION
+ Successful return of this function indicates that a data save
+ point has been executed.
+
+ RETURNS
+ An OCI error code, Oracle errors are returned via the error handle.
+ NOTES
+ */
+sword
+OCIDirPathDataSave( OCIDirPathCtx *dpctx, OCIError *errhp, ub4 action );
+
+/*
+ NAME
+ OCIDirPathFinish - OCI: Finish a direct path operation.
+
+ DESCRIPTION
+ Finishes a direct path operation.
+
+ RETURNS
+ An OCI error code, Oracle errors are returned via the error handle.
+ NOTES
+ */
+sword
+OCIDirPathFinish( OCIDirPathCtx *dpctx, OCIError *errhp );
+
+/*
+ NAME
+ OCIDirPathFlushRow - OCI: Flush a partial row from the server.
+
+ DESCRIPTION
+ Flushes a partially loaded row from the server.
+
+ RETURNS
+ An OCI error code, Oracle errors are returned via the error handle.
+ NOTES
+ */
+sword
+OCIDirPathFlushRow( OCIDirPathCtx *dpctx, OCIError *errhp );
+
+/*
+ NAME
+ OCIDirPathPrepare - OCI: Prepare a direct path operation.
+
+ DESCRIPTION
+ Prepares a table/partition for a direct path operation.
+
+ RETURNS
+ An OCI error code, Oracle errors are returned via the error handle.
+ NOTES
+ */
+sword
+OCIDirPathPrepare( OCIDirPathCtx *dpctx, OCISvcCtx *svchp,
+ OCIError *errhp );
+
+/*
+ NAME
+ OCIDirPathLoadStream - OCI: Load a direct path stream.
+
+ DESCRIPTION
+ Load a direct path stream to the object associated with
+ the direct path context.
+
+ RETURNS
+ An OCI error code, Oracle errors are returned via the error handle.
+ NOTES
+ */
+sword
+OCIDirPathLoadStream( OCIDirPathCtx *dpctx, OCIDirPathStream *dpstr,
+ OCIError *errhp );
+
+
+/*---------------------- OCIDirPathColArray Operations ----------------------*/
+
+/*
+ NAME
+ OCIDirPathColArrayEntryGet - OCI: Get column array entry.
+
+ DESCRIPTION
+ Column array function which is used to get a specified entry in
+ a column array.
+
+ RETURNS
+ An OCI error code, Oracle errors are returned via the error handle.
+ NOTES
+ */
+sword
+OCIDirPathColArrayEntryGet( OCIDirPathColArray *dpca, OCIError *errhp,
+ ub4 rownum, ub2 colIdx, ub1 **cvalpp, ub4 *clenp,
+ ub1 *cflgp );
+
+/*
+ NAME
+ OCIDirPathColArrayEntrySet - OCI: Set column array entry.
+
+ DESCRIPTION
+ Column array function which is used to set a specified entry in
+ a column array.
+
+ RETURNS
+ An OCI error code, Oracle errors are returned via the error handle.
+ NOTES
+ */
+sword
+OCIDirPathColArrayEntrySet( OCIDirPathColArray *dpca, OCIError *errhp,
+ ub4 rownum, ub2 colIdx, ub1 *cvalp, ub4 clen,
+ ub1 cflg );
+
+/*
+ NAME
+ OCIDirPathColArrayRowGet - OCI: Get column array row pointers.
+
+ DESCRIPTION
+ Column array function which is used to get the base row pointers
+ for a specified row in a column array.
+ To be used in lieu of OCIDirPathColArrayEntryGet() and
+ OCIDirPathColArrayEntrySet().
+
+ RETURNS
+ An OCI error code, Oracle errors are returned via the error handle.
+ NOTES
+ */
+sword
+OCIDirPathColArrayRowGet( OCIDirPathColArray *dpca, OCIError *errhp,
+ ub4 rownum, ub1 ***cvalppp, ub4 **clenpp,
+ ub1 **cflgpp );
+
+/*
+ NAME
+ OCIDirPathColArrayReset - OCI: Reset Column Array State
+
+ DESCRIPTION
+ Function which resets the column array state.
+
+ RETURNS
+ An OCI error code, Oracle errors are returned via the error handle.
+ NOTES
+ Resetting the column array state is necessary when piecing in a large
+ column and an error occurs in the middle of loading the column.
+ */
+sword
+OCIDirPathColArrayReset( OCIDirPathColArray *dpca, OCIError *errhp );
+
+/*
+ NAME
+ OCIDirPathColArrayToStream - OCI: Convert Column Array to Stream Format.
+
+ DESCRIPTION
+ Convert from column array format to stream format which is suitable
+ for loading via OCIDirPathLoadStream().
+
+ RETURNS
+ An OCI error code, Oracle errors are returned via the error handle.
+ NOTES
+ */
+sword
+OCIDirPathColArrayToStream( OCIDirPathColArray *dpca, OCIDirPathCtx *dpctx,
+ OCIDirPathStream *dpstr, OCIError *errhp,
+ ub4 rowcnt, ub4 rowoff );
+
+
+
+/*----------------------- OCIDirPathStream Operations -----------------------*/
+
+/*
+ NAME
+ OCIDirPathStreamReset - OCI:
+
+ DESCRIPTION
+
+ RETURNS
+ An OCI error code, Oracle errors are returned via the error handle.
+ NOTES
+ */
+sword
+OCIDirPathStreamReset( OCIDirPathStream *dpstr, OCIError *errhp );
+
+#endif /* OCI8DP_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ociap.h b/src/terralib/drivers/OracleSpatial/OCI/include/ociap.h
new file mode 100644
index 0000000..3132df7
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ociap.h
@@ -0,0 +1,10240 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ociap.h,v 1.3 2005/05/06 16:48:55 karine Exp $
+ */
+
+/* Copyright (c) 1996, 2003, Oracle Corporation. All rights reserved. */
+
+/* NOTE: See 'header_template.doc' in the 'doc' dve under the 'forms'
+ directory for the header file template that includes instructions.
+*/
+
+/*
+ NAME
+ ociap.h - Oracle Call Interface - Ansi Prototypes
+
+ DESCRIPTION
+ <short description of component this file declares/defines>
+
+ RELATED DOCUMENTS
+
+ INSPECTION STATUS
+ Inspection date:
+ Inspection status:
+ Estimated increasing cost defects per page:
+ Rule sets:
+
+ ACCEPTANCE REVIEW STATUS
+ Review date:
+ Review status:
+ Reviewers:
+
+ PUBLIC FUNCTION(S)
+ <list of external functions declared/defined - with one-line descriptions>
+
+ PRIVATE FUNCTION(S)
+ <list of static functions defined in .c file - with one-line descriptions>
+
+ EXAMPLES
+
+ NOTES
+ <other useful comments, qualifications, etc.>
+
+ MODIFIED (MM/DD/YY)
+ debanerj 08/26/03 - 6003: Lob interface changes
+ sgollapu 06/23/03 - Add OCIPing
+ debanerj 01/16/03 - Bug 2753018: Lob Locator parameter for
+ OCILobGetStorageLimit
+ tkeefe 02/17/03 - bug-2773794: Add new interface for setting Kerb attrs
+ ataracha 01/03/03 - Move OCIXMLType functions to ocixml.h
+ akatti 11/28/02 - [2521361]:add OCIRowidToChar prototype
+ chliang 10/23/02 - add OCIFetchRowCallback
+ cparampa 10/13/02 - Fix the prototype of OCIAQListen(ansi prototype)
+ chliang 10/12/02 - add OCIBindRowCallback
+ debanerj 09/30/02 - Unlimited size LOB 6003
+ thoang 09/25/02 - Add csid to XMLType create functions
+ thoang 04/19/02 - Add OCIXMLTypeGetNS
+ aahluwal 08/09/02 - adding OCIAQDeqArray
+ aahluwal 06/03/02 - bug 2360115
+ skabraha 04/16/02 - fix compiler warnings
+ sichandr 02/12/02 - fix OCIXMLTypeExists
+ gayyappa 02/01/02 - fix 2210776 : change Dom to DOM
+ sichandr 10/24/01 - OCISvcCtx for XMLType create routines
+ schandir 09/14/01 - Add prototypes for Stmt Caching
+ abande 09/04/01 - Add Prototypes for Session Pooling Methods
+ stakeda 09/12/01 - add OCINlsCharSetConvert
+ whe 08/28/01 - add OCIEnvNlsCreate
+ wzhang 08/22/01 - Add OCINlsCharSetNameToId.
+ whe 10/05/01 - add prototype for OCIXMLType functions
+ mdmehta 04/06/01 - Bug 1683763, OCIDateTimeToText: buf_size to ub4*
+ schandir 12/12/00 - modify the ociconnectionpoolcreate() interface.
+ porangas 12/04/00 - Forward merge bug#974710 to 9i
+ rpingte 11/29/00 - Fix bug# 1485795.
+ gtarora 11/30/00 - fix comment for OCILobIsTemporary
+ akatti 11/07/00 - [1198379]:add OCIRowidToChar
+ bpalaval 10/15/00 - Forward merge 892654.
+ kmohan 09/18/00 - add OCILogon2
+ etucker 07/28/00 - add OCIIntervalFromTZ
+ vjayaram 07/18/00 - add connection pooling changes
+ etucker 07/13/00 - add dls apis for oci
+ hmasaki 07/05/00 - fix 1230846: forward merge into 8.2
+ mbastawa 06/05/00 - add OCIStmtFetch2
+ rxgovind 06/07/00 - update OCIAnyData interfaces
+ rxgovind 05/04/00 - add OCIAnyDataSet interfaces
+ rkasamse 05/01/00 - remove attrno from OCIAnyDataAttrGet
+ rkasamse 03/13/00 - add prototype s for OCCIAnyData
+ slari 09/01/99 - remove OCIEnvCallback
+ slari 08/23/99 - add OCIUcb in user callback functions
+ dsaha 07/07/99 - Add OCIFEnvCreate for forms
+ vyanaman 06/21/99 - Change OCI DateTime/Interval APIs.
+ esoyleme 07/01/99 - expose MTS performance enhancements
+ whe 06/14/99 - bug727872:add CONST to match definitions
+ kkarun 02/23/99 - Fix OCIDateTime APIs
+ jiyang 12/07/98 - Add comments for OCI_NLS_DUAL_CURRENCY
+ aroy 12/01/98 - add OCIEnvCreate
+ slari 11/23/98 - use ORASTDARG
+ slari 11/21/98 - replace ellipsis by arglist in OCIUserCallback
+ thchang 10/20/98 - correct comment on OCILobCreateTemporary
+ slari 09/08/98 - allow envh to receive error info also in CallbackReg/
+ kkarun 09/02/98 - Change const to CONST
+ aroy 08/04/98 - add OCITerminate calls
+ nramakri 06/25/98 - remove CONST from some OCIPickler APIs
+ jiyang 06/22/98 - Fix a lint error
+ nmallava 06/08/98 - ociistemporary -> envhp
+ jhasenbe 05/27/98 - Remove definitions for U-Calls (Unicode)
+ nmallava 05/18/98 - add comments
+ sgollapu 05/19/98 - Change text to OraText
+ aroy 04/20/98 - merge forward 8.0.5 -> 8.1.3
+ nbhatt 05/14/98 - aq listen call
+ lchidamb 03/02/98 - Client Notification prototypes
+ vyanaman 04/19/98 - System Timestamp
+ kkarun 04/17/98 - Add more Interval functions
+ vyanaman 04/17/98 - Fix min (proc error)
+ vyanaman 04/16/98 - Add get/set TZ
+ kkarun 04/13/98 - Add Datetime prototypes
+ rkasamse 04/13/98 - change OCIEnv* to dvoid* for context/memory cart serv
+ rkasamse 04/15/98 - chage pickler cart interface
+ slari 03/20/98 - change proto of OCIUserCallback
+ slari 02/17/98 - add OCIUserCallback
+ jiyang 04/02/98 - Accept both env and user handles for NLS
+ rkasamse 03/20/98 - remove prototypes for OCIMemoryDuration* functions.
+ tsaulys 03/20/98 - use environment or session handle
+ nmallava 04/09/98 - OCILobLocatorAssign
+ nmallava 04/07/98 - lobgetchunksize and writeappend apis
+ jhasenbe 04/06/98 - Add new interfaces for Unicode support
+ nmallava 03/17/98 - add interfaces
+ nmallava 03/16/98 - add open/close apis
+ nmallava 03/10/98 - add temporary lobs apis
+ sgollapu 07/10/97 - Add OCIReset
+ sgollapu 02/09/98 - OCI non-blocking
+ nramakri 01/16/98 - remove #ifdef NEVER clause for OCIExtract
+ rmurthy 01/08/98 - OCIContextGenerateKey: change ub1 to ub4
+ ewaugh 12/18/97 - Turn type wrappers into functions.
+ skabraha 12/02/97 - adding OCIFile functions
+ rhwu 12/02/97 - add OCI Thread
+ nramakri 12/15/97 - move to core4
+ nramakri 12/11/97 - modify OCIExtract prototype
+ ewaugh 12/10/97 - add OCIFormat prototypes
+ nmallava 12/17/97 - Add ilob open and close apis
+ rkasamse 12/03/97 - Change some of the function names for pickler cartrid
+ nramakri 11/12/97 - add OCIExtract prototypes
+ rkasamse 11/21/97 - add prototypes for memory cartridge services and cont
+ rkasamse 11/03/97 - Add pickler cartridge interfaces.
+ jiyang 11/11/97 - Add NLS service for cartridge
+ tanguyen 08/19/97 -
+ cxcheng 07/30/97 - replace OCISvcCtx with OCISvcCtx
+ schandra 06/25/97 - AQ OCI interface
+ bnainani 07/21/97 - add prototypes for Oracle XA extensions
+ esoyleme 05/13/97 - move failover callback prototype
+ skmishra 05/06/97 - stdc compiler fixes
+ skmishra 04/24/97 - C++ Compatibility changes
+ skotsovo 04/21/97 - make lob parameter names consistent
+ rwhitman 04/16/97 - Fix LOB prototypes - Olint OCI 8.0.3
+ ramkrish 04/15/97 - Add free flag to OCILobFlushBuffer
+ dchatter 04/10/97 - add nzt.h inclusion
+ cxcheng 04/09/97 - change objnamp from CONST text* to dvoid*
+ cxcheng 04/08/97 - fix prototype of OCIDescribeAny()
+ skotsovo 03/31/97 - remove OCILobLocatorSize
+ skotsovo 03/27/97 - add OCILobLoadFromFile
+ bcchang 02/18/97 - Fix syntax error
+ dchatter 01/13/97 - fix comments on LOB calls
+ aroy 01/10/97 - remove ocilobfilecreate delete
+ sgollapu 12/27/96 - Correct OCILogon prototype
+ dchatter 01/04/97 - comments to describe the functions
+ sgollapu 11/25/96 - Change OCILobFileIsExistent
+ schandra 11/18/96 - Remove xa.h include
+ sgollapu 11/09/96 - Change prototype of OCIDescribeAny
+ dchatter 10/31/96 - delete CONST from lob write cb fn
+ dchatter 10/30/96 - more changes
+ dchatter 10/26/96 - lob/file long name corrections
+ slari 10/16/96 - delete unused calls
+ rwessman 10/29/96 - Fixed OCISecurityGetIdentity prototype
+ bcchang 10/25/96 - Fix syntax error
+ sgollapu 10/22/96 - Add OCILogon and OCILogoff
+ rwessman 10/16/96 - Added cryptographic and digital signature functions
+ sgollapu 10/10/96 - Add ocibdp and ocibdn
+ rxgovind 10/07/96 - add oci file calls
+ skotsovo 10/01/96 - move orl lob fnts to oci
+ skotsovo 09/20/96 - in OCILobGetLength(), remove the 'isnull' parameter.
+ aroy 08/29/96 - change prototype for Nchar Lob support
+ dchatter 08/21/96 - OCIResultSetToStmt prototype change
+ sthakur 08/14/96 - add OCIParamSet
+ schandra 07/26/96 - TX OCI return values - sb4->sword
+ aroy 07/17/96 - terminology change: OCILobLocator => OCILobLocator
+ dchatter 07/01/96 - create ANSI prototypes
+ dchatter 07/01/96 - Creation
+
+*/
+
+
+#ifndef OCIAP_ORACLE
+# define OCIAP_ORACLE
+
+# ifndef ORATYPES
+# include <oratypes.h>
+# endif
+
+#ifndef ORASTDARG
+#include <stdarg.h>
+#define ORASTDARG
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef NZT_ORACLE
+#include <nzt.h>
+#endif /* NZT_ORACLE */
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ PRIVATE TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+/*****************************************************************************
+ DESCRIPTION
+******************************************************************************
+Note: the descriptions of the functions are alphabetically arranged. Please
+maintain the arrangement when adding a new function description. The actual
+prototypes are below this comment section and donot follow any alphabetical
+ordering.
+
+
+--------------------------------OCIAttrGet------------------------------------
+
+OCIAttrGet()
+Name
+OCI Attribute Get
+Purpose
+This call is used to get a particular attribute of a handle.
+Syntax
+sword OCIAttrGet ( CONST dvoid *trgthndlp,
+ ub4 trghndltyp,
+ dvoid *attributep,
+ ub4 *sizep,
+ ub4 attrtype,
+ OCIError *errhp );
+Comments
+This call is used to get a particular attribute of a handle.
+See Appendix B, "Handle Attributes", for a list of handle types and their
+readable attributes.
+Parameters
+trgthndlp (IN) - is the pointer to a handle type.
+trghndltyp (IN) - is the handle type.
+attributep (OUT) - is a pointer to the storage for an attribute value. The
+attribute value is filled in.
+sizep (OUT) - is the size of the attribute value.
+This can be passed in as NULL for most parameters as the size is well known.
+For text* parameters, a pointer to a ub4 must be passed in to get the length
+of the string.
+attrtype (IN) - is the type of attribute.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+OCIAttrSet()
+
+--------------------------------OCIAttrSet------------------------------------
+
+
+OCIAttrSet()
+Name
+OCI Attribute Set
+Purpose
+This call is used to set a particular attribute of a handle or a descriptor.
+Syntax
+sword OCIAttrSet ( dvoid *trgthndlp,
+ ub4 trghndltyp,
+ dvoid *attributep,
+ ub4 size,
+ ub4 attrtype,
+ OCIError *errhp );
+Comments
+This call is used to set a particular attribute of a handle or a descriptor.
+See Appendix B for a list of handle types and their writeable attributes.
+Parameters
+trghndlp (IN/OUT) - the pointer to a handle type whose attribute gets
+modified.
+trghndltyp (IN/OUT) - is the handle type.
+attributep (IN) - a pointer to an attribute value.
+The attribute value is copied into the target handle. If the attribute value
+is a pointer, then only the pointer is copied, not the contents of the pointer.
+size (IN) - is the size of an attribute value. This can be passed in as 0 for
+most attributes as the size is already known by the OCI library. For text*
+attributes, a ub4 must be passed in set to the length of the string.
+attrtype (IN) - the type of attribute being set.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+OCIAttrGet()
+
+
+
+--------------------------------OCIBindArrayOfStruct--------------------------
+
+
+
+OCIBindArrayOfStruct()
+Name
+OCI Bind for Array of Structures
+Purpose
+This call sets up the skip parameters for a static array bind.
+Syntax
+sword OCIBindArrayOfStruct ( OCIBind *bindp,
+ OCIError *errhp,
+ ub4 pvskip,
+ ub4 indskip,
+ ub4 alskip,
+ ub4 rcskip );
+Comments
+This call sets up the skip parameters necessary for a static array bind.
+This call follows a call to OCIBindByName() or OCIBindByPos(). The bind
+handle returned by that initial bind call is used as a parameter for the
+OCIBindArrayOfStruct() call.
+For information about skip parameters, see the section "Arrays of Structures"
+on page 4-16.
+Parameters
+bindp (IN) - the handle to a bind structure.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value.
+indskip (IN) - skip parameter for the next indicator value or structure.
+alskip (IN) - skip parameter for the next actual length value.
+rcskip (IN) - skip parameter for the next column-level return code value.
+Related Functions
+OCIAttrGet()
+
+
+--------------------------------OCIBindByName---------------------------------
+
+OCIBindByName()
+Name
+OCI Bind by Name
+Purpose
+Creates an association between a program variable and a placeholder in a SQL
+statement or PL/SQL block.
+Syntax
+sword OCIBindByName (
+ OCIStmt *stmtp,
+ OCIBind **bindp,
+ OCIError *errhp,
+ CONST OraText *placeholder,
+ sb4 placeh_len,
+ dvoid *valuep,
+ sb4 value_sz,
+ ub2 dty,
+ dvoid *indp,
+ ub2 *alenp,
+ ub2 *rcodep,
+ ub4 maxarr_len,
+ ub4 *curelep,
+ ub4 mode );
+Description
+This call is used to perform a basic bind operation. The bind creates an
+association between the address of a program variable and a placeholder in a
+SQL statement or PL/SQL block. The bind call also specifies the type of data
+which is being bound, and may also indicate the method by which data will be
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp
+parameter.
+Data in an OCI application can be bound to placeholders statically or
+dynamically. Binding is static when all the IN bind data and the OUT bind
+buffers are well-defined just before the execute. Binding is dynamic when the
+IN bind data and the OUT bind buffers are provided by the application on
+demand at execute time to the client library. Dynamic binding is indicated by
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see
+the section "Runtime Data Allocation and Piecewise Operations" on
+page 5-16.
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle,
+which is implicitly allocated by the bind call A separate bind handle is
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes
+necessary when binding certain data types or handling input data in certain
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application
+will be using user-defined callback functions, OCIBindDynamic() must
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly
+allocated by this call. The bind handle maintains all the bind information
+for this particular input value. The handle is feed implicitly when the
+statement handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+placeholder (IN) - the placeholder attributes are specified by name if
+ocibindn() is being called.
+placeh_len (IN) - the length of the placeholder name specified in placeholder.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the
+type specified in the dty parameter. An array of data values can be specified
+for mapping into a PL/SQL table or for providing data for SQL multiple-row
+operations. When an array of bind values is provided, this is called an array
+bind in OCI terms. Additional attributes of the array bind (not bind to a
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call.
+For a REF, named data type bind, the valuep parameter is used only for IN
+bind data. The pointers to OUT buffers are set in the pgvpp parameter
+initialized by OCIBindObject(). For named data type and REF binds, the bind
+values are unpickled into the Object Cache. The OCI object navigational calls
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and
+OCIBindDynamic() must be invoked to provide callback functions if desired.
+value_sz (IN) - the size of a data value. In the case of an array bind, this is
+the maximum size of any element possible with the actual sizes being specified
+in the alenp parameter.
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum
+size of the data that can be ever provided at runtime for data types other than
+named data types or REFs.
+dty (IN) - the data type of the value(s) being bound. Named data types
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been
+initialized in object mode. For named data types, or REFs, additional calls
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data
+types, this is a pointer to sb2 or an array of sb2s. For named data types,
+this pointer is ignored and the actual pointer to the indicator structure or
+an array of indicator structures is initialized by OCIBindObject().
+Ignored for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each
+element in alenp is the length of the data in the corresponding element in the
+bind value array before and after the execute. This parameter is ignored for
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If
+maxarr_len is non-zero, then either OCIBindDynamic() or
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes.
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz
+parameter defines the maximum size of the data that can be ever
+provided at runtime. The application must be ready to provide the OCI
+library runtime IN data buffers at any time and any number of times.
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered
+with a subsequent call to OCIBindDynamic().
+a polling mechanism using calls supplied by the OCI. This mode
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see
+the section "Runtime Data Allocation and Piecewise Operations" on
+page 5-16.
+When the allocated buffers are not required any more, they should be
+freed by the client.
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+
+-------------------------------OCIBindByPos-----------------------------------
+
+
+OCIBindByPos()
+Name
+OCI Bind by Position
+Purpose
+Creates an association between a program variable and a placeholder in a SQL
+statement or PL/SQL block.
+Syntax
+sword OCIBindByPos (
+ OCIStmt *stmtp,
+ OCIBind **bindp,
+ OCIError *errhp,
+ ub4 position,
+ dvoid *valuep,
+ sb4 value_sz,
+ ub2 dty,
+ dvoid *indp,
+ ub2 *alenp,
+ ub2 *rcodep,
+ ub4 maxarr_len,
+ ub4 *curelep,
+ ub4 mode);
+
+Description
+This call is used to perform a basic bind operation. The bind creates an
+association between the address of a program variable and a placeholder in a
+SQL statement or PL/SQL block. The bind call also specifies the type of data
+which is being bound, and may also indicate the method by which data will be
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp
+parameter.
+Data in an OCI application can be bound to placeholders statically or
+dynamically. Binding is static when all the IN bind data and the OUT bind
+buffers are well-defined just before the execute. Binding is dynamic when the
+IN bind data and the OUT bind buffers are provided by the application on
+demand at execute time to the client library. Dynamic binding is indicated by
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see
+the section "Runtime Data Allocation and Piecewise Operations" on
+page 5-16
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle,
+which is implicitly allocated by the bind call A separate bind handle is
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes
+necessary when binding certain data types or handling input data in certain
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application
+will be using user-defined callback functions, OCIBindDynamic() must
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly
+allocated by this call. The bind handle maintains all the bind information
+for this particular input value. The handle is feed implicitly when the
+statement handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+position (IN) - the placeholder attributes are specified by position if
+ocibindp() is being called.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the
+type specified in the dty parameter. An array of data values can be specified
+for mapping into a PL/SQL table or for providing data for SQL multiple-row
+operations. When an array of bind values is provided, this is called an array
+bind in OCI terms. Additional attributes of the array bind (not bind to a
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call.
+For a REF, named data type bind, the valuep parameter is used only for IN
+bind data. The pointers to OUT buffers are set in the pgvpp parameter
+initialized by OCIBindObject(). For named data type and REF binds, the bind
+values are unpickled into the Object Cache. The OCI object navigational calls
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and
+OCIBindDynamic() must be invoked to provide callback functions if desired.
+value_sz (IN) - the size of a data value. In the case of an array bind, this is
+the maximum size of any element possible with the actual sizes being specified
+in the alenp parameter.
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum
+size of the data that can be ever provided at runtime for data types other than
+named data types or REFs.
+dty (IN) - the data type of the value(s) being bound. Named data types
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been
+initialized in object mode. For named data types, or REFs, additional calls
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data
+types, this is a pointer to sb2 or an array of sb2s. For named data types,
+this pointer is ignored and the actual pointer to the indicator structure or
+an array of indicator structures is initialized by OCIBindObject(). Ignored
+for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each
+element in alenp is the length of the data in the corresponding element in the
+bind value array before and after the execute. This parameter is ignored for
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If
+maxarr_len is non-zero, then either OCIBindDynamic() or
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes.
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz
+parameter defines the maximum size of the data that can be ever
+provided at runtime. The application must be ready to provide the OCI
+library runtime IN data buffers at any time and any number of times.
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered
+with a subsequent call to OCIBindDynamic() .
+a polling mechanism using calls supplied by the OCI. This mode
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see
+the section "Runtime Data Allocation and Piecewise Operations" on
+page 5-16.
+When the allocated buffers are not required any more, they should be
+freed by the client.
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+
+-------------------------------OCIBindDynamic---------------------------------
+
+OCIBindDynamic()
+Name
+OCI Bind Dynamic Attributes
+Purpose
+This call is used to register user callbacks for dynamic data allocation.
+Syntax
+sword OCIBindDynamic( OCIBind *bindp,
+ OCIError *errhp,
+ dvoid *ictxp,
+ OCICallbackInBind (icbfp)(
+ dvoid *ictxp,
+ OCIBind *bindp,
+ ub4 iter,
+ ub4 index,
+ dvoid **bufpp,
+ ub4 *alenp,
+ ub1 *piecep,
+ dvoid **indp ),
+ dvoid *octxp,
+ OCICallbackOutBind (ocbfp)(
+ dvoid *octxp,
+ OCIBind *bindp,
+ ub4 iter,
+ ub4 index,
+ dvoid **bufp,
+ ub4 **alenpp,
+ ub1 *piecep,
+ dvoid **indpp,
+ ub2 **rcodepp) );
+Comments
+This call is used to register user-defined callback functions for providing
+data for an UPDATE or INSERT if OCI_DATA_AT_EXEC mode was specified in a
+previous call to OCIBindByName() or OCIBindByPos().
+The callback function pointers must return OCI_CONTINUE if it the call is
+successful. Any return code other than OCI_CONTINUE signals that the client
+wishes to abort processing immediately.
+For more information about the OCI_DATA_AT_EXEC mode, see the section
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+bindp (IN/OUT) - a bind handle returned by a call to OCIBindByName() or
+OCIBindByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+ictxp (IN) - the context pointer required by the call back function icbfp.
+icbfp (IN) - the callback function which returns a pointer to the IN bind
+value or piece at run time. The callback takes in the following parameters.
+ictxp (IN/OUT) - the context pointer for this callback function.
+bindp (IN) - the bind handle passed in to uniquely identify this bind
+variable.
+iter (IN) - 1-based execute iteration value.
+index (IN) - index of the current array, for an array bind. 1 based not
+greater than curele parameter of the bind call.
+index (IN) - index of the current array, for an array bind. This parameter
+is 1-based, and may not be greater than curele parameter of the bind call.
+bufpp (OUT) - the pointer to the buffer.
+piecep (OUT) - which piece of the bind value. This can be one of the
+following values - OCI_ONE_PIECE, OCI_FIRST_PIECE,
+OCI_NEXT_PIECE and OCI_LAST_PIECE.
+indp (OUT) - contains the indicator value. This is apointer to either an
+sb2 value or a pointer to an indicator structure for binding named data
+types.
+indszp (OUT) - contains the indicator value size. A pointer containing
+the size of either an sb2 or an indicator structure pointer.
+octxp (IN) - the context pointer required by the callback function ocbfp.
+ocbfp (IN) - the callback function which returns a pointer to the OUT bind
+value or piece at run time. The callback takes in the following parameters.
+octxp (IN/OUT) - the context pointer for this call back function.
+bindp (IN) - the bind handle passed in to uniquely identify this bind
+variable.
+iter (IN) - 1-based execute iteration value.
+index (IN) - index of the current array, for an array bind. This parameter
+is 1-based, and must not be greater than curele parameter of the bind call.
+bufpp (OUT) - a pointer to a buffer to write the bind value/piece.
+buflp (OUT) - returns the buffer size.
+alenpp (OUT) - a pointer to a storage for OCI to fill in the size of the bind
+value/piece after it has been read.
+piecep (IN/OUT) - which piece of the bind value. It will be set by the
+library to be one of the following values - OCI_ONE_PIECE or
+OCI_NEXT_PIECE. The callback function can leave it unchanged or set
+it to OCI_FIRST_PIECE or OCI_LAST_PIECE. By default -
+OCI_ONE_PIECE.
+indpp (OUT) - returns a pointer to contain the indicator value which
+either an sb2 value or a pointer to an indicator structure for named data
+types.
+indszpp (OUT) - returns a pointer to return the size of the indicator
+value which is either size of an sb2 or size of an indicator structure.
+rcodepp (OUT) - returns a pointer to contains the return code.
+Related Functions
+OCIAttrGet()
+
+
+---------------------------------OCIBindObject--------------------------------
+
+
+OCIBindObject()
+Name
+OCI Bind Object
+Purpose
+This function sets up additional attributes which are required for a named
+data type (object) bind.
+Syntax
+sword OCIBindObject ( OCIBind *bindp,
+ OCIError *errhp,
+ CONST OCIType *type,
+ dvoid **pgvpp,
+ ub4 *pvszsp,
+ dvoid **indpp,
+ ub4 *indszp, );
+Comments
+This function sets up additional attributes which binding a named data type
+or a REF. An error will be returned if this function is called when the OCI
+environment has been initialized in non-object mode.
+This call takes as a paramter a type descriptor object (TDO) of datatype
+OCIType for the named data type being defined. The TDO can be retrieved
+with a call to OCITypeByName().
+If the OCI_DATA_AT_EXEC mode was specified in ocibindn() or ocibindp(), the
+pointers to the IN buffers are obtained either using the callback icbfp
+registered in the OCIBindDynamic() call or by the OCIStmtSetPieceInfo() call.
+The buffers are dynamically allocated for the OUT data and the pointers to
+these buffers are returned either by calling ocbfp() registered by the
+OCIBindDynamic() or by setting the pointer to the buffer in the buffer passed
+in by OCIStmtSetPieceInfo() called when OCIStmtExecute() returned
+OCI_NEED_DATA. The memory of these client library- allocated buffers must be
+freed when not in use anymore by using the OCIObjectFreee() call.
+Parameters
+bindp ( IN/OUT) - the bind handle returned by the call to OCIBindByName()
+or OCIBindByPos().
+errhp ( IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+type ( IN) - points to the TDO which describes the type of the program
+variable being bound. Retrieved by calling OCITypeByName().
+pgvpp ( IN/OUT) - points to a pointer to the program variable buffer. For an
+array, pgvpp points to an array of pointers. When the bind variable is also an
+OUT variable, the OUT Named Data Type value or REF is allocated
+(unpickled) in the Object Cache, and a pointer to the value or REF is returned,
+At the end of execute, when all OUT values have been received, pgvpp points
+to an array of pointer(s) to these newly allocated named data types in the
+object cache.
+pgvpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the Named
+Data Type buffers are requested at runtime. For static array binds, skip
+factors may be specified using the OCIBindArrayOfStruct() call. The skip
+factors are used to compute the address of the next pointer to the value, the
+indicator structure and their sizes.
+pvszsp ( IN/OUT) - points to the size of the program variable. The size of the
+named data type is not required on input. For an array, pvszsp is an array of
+ub4s. On return, for OUT bind variables, this points to size(s) of the Named
+Data Types and REFs received. pvszsp is ignored if the OCI_DATA_AT_EXEC
+mode is set. Then the size of the buffer is taken at runtime.
+indpp ( IN/OUT) - points to a pointer to the program variable buffer
+containing the parallel indicator structure. For an array, points to an array
+of pointers. When the bind variable is also an OUT bind variable, memory is
+allocated in the object cache, to store the unpickled OUT indicator values. At
+the end of the execute when all OUT values have been received, indpp points
+to the pointer(s) to these newly allocated indicator structure(s).
+indpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator
+is requested at runtime.
+indszp ( IN/OUT) - points to the size of the IN indicator structure program
+variable. For an array, it is an array of sb2s. On return for OUT bind
+variables, this points to size(s) of the received OUT indicator structures.
+indszp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator
+size is requested at runtime.
+Related Functions
+OCIAttrGet()
+
+
+
+----------------------------------OCIBreak------------------------------------
+
+
+OCIBreak()
+Name
+OCI Break
+Purpose
+This call performs an immediate (asynchronous) abort of any currently
+executing OCI function that is associated with a server .
+Syntax
+sword OCIBreak ( dvoid *hndlp,
+ OCIError *errhp);
+Comments
+This call performs an immediate (asynchronous) abort of any currently
+executing OCI function that is associated with a server. It is normally used
+to stop a long-running OCI call being processed on the server.
+This call can take either the service context handle or the server context
+handle as a parameter to identify the function to be aborted.
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+
+-----------------------------OCIConnectionPoolCreate --------------------------
+Name:
+OCIConnectionPoolCreate
+
+Purpose:
+Creates the connections in the pool
+
+Syntax:
+OCIConnectionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp,
+ OraText **poolName, sb4 *poolNameLen,
+ CONST Oratext *dblink, sb4 dblinkLen,
+ ub4 connMin, ub4 connMax, ub4 connIncr,
+ CONST OraText *poolUsername, sb4 poolUserLen,
+ CONST OraText *poolPassword, sb4 poolPassLen,
+ ub4 mode)
+Comments:
+This call is used to create a connection pool. conn_min connections
+to the database are started on calling OCIConnectionPoolCreate.
+
+Parameters:
+envhp (IN/OUT) - A pointer to the environment where the Conencton Pool
+ is to be created
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+poolhp (IN/OUT) - An uninitialiazed pool handle.
+poolName (OUT) - The connection pool name.
+poolNameLen (OUT) - The length of the connection pool name
+dblink (IN/OUT) - Specifies the database(server) to connect. This will also
+ be used as the default pool name.
+dblinkLen (IN) - The length of the string pointed to by dblink.
+connMin (IN) - Specifies the minimum number of connections in the
+ Connection Pool at any instant.
+ connMin number of connections are started when
+ OCIConnectionPoolCreate() is called.
+connMax (IN) - Specifies the maximum number of connections that can be
+ opened to the database. Once this value is reached, no
+ more connections are opened.
+connIncr (IN) - Allows application to set the next increment for
+ connections to be opened to the database if the current
+ number of connections are less than conn_max.
+poolUsername (IN/OUT) - Connection pooling requires an implicit proxy
+ session and this attribute provides a username
+ for that session.
+poolUserLen (IN) - This represents the length of pool_username.
+poolPassword (IN/OUT) - The password for the parameter pool_username passed
+ above.
+poolPassLen (IN) - This represents the length of pool_password.
+
+mode (IN) - The modes supported are OCI_DEFAULT and
+OCI_CPOOL_REINITIALIZE
+
+Related Functions
+OCIConnectionPoolDestroy()
+
+---------------------------------------------------------------------------
+
+----------------------------OCIConnectionPoolDestroy-------------------------
+Name:
+OCIConnectionPoolDestroy
+
+Purpose:
+Terminates the connections in the pool
+
+Syntax:
+OCIConnectionPoolDestroy (OCICPool *poolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+On calling OCIConnectionPoolDestroy, all the open connections in the pool
+are closed and the pool is destroyed.
+
+Parameters:
+poolhp (IN/OUT) - An initialiazed pool handle.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+mode (IN) - Currently, OCIConnectionPoolDestroy() will support only
+ the OCI_DEFAULT mode.
+
+Related Functions:
+OCIConnectionPoolCreate()
+
+-----------------------------------------------------------------------------
+----------------------------OCISessionPoolCreate-----------------------------
+Name:
+OCISessionPoolCreate
+
+Purpose:
+Creates the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCISpool *spoolhp,
+ OraText **poolName, ub4 *poolNameLen,
+ CONST OraText *connStr, ub4 connStrLen,
+ ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+ OraText *userid, ub4 useridLen,
+ OraText *password, ub4 passwordLen,
+ ub4 mode)
+
+Comments:
+When OCISessionPoolCreate is called, a session pool is initialized for
+the associated environment and the database specified by the
+connStr parameter. This pool is named uniquely and the name
+is returned to the user in the poolname parameter.
+
+Parameters:
+envhp (IN/OUT) - A pointer to the environment handle in which the session
+ pool needs to be created.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+spoolhp (IN/OUT) - A pointer to the session pool handle that is created.
+poolName (OUT) - Session pool name returned to the user.
+poolNameLen (OUT) - Length of the PoolName
+connStr (IN) - The TNS alias of the database to connect to.
+connStrLen (IN) - Length of the connStr.
+sessMin (IN) - Specifies the minimum number of sessions in the Session Pool.
+ These are the number of sessions opened in the beginning, if
+ in Homogeneous mode. Else, the parameter is ignored.
+sessMax (IN) - Specifies the maximum number of sessions in the Session Pool.
+ Once this value is reached, no more sessions are opened,
+ unless the OCI_ATTR_SPOOL_FORCEGET is set.
+userid (IN) - Specifies the userid with which to start up the sessions.
+useridLen (IN) - Length of userid.
+password (IN) - Specifies the password for the corresponding userid.
+passwordLen (IN) - Specifies the length of the password
+mode(IN) - May be OCI_DEFAULT, OCI_SPC_SPOOL_REINITIALIZE, or
+ OCI_SPC_SPOOL_HOMOGENEOUS.
+
+Returns:
+SUCCESS - If pool could be allocated and created successfully.
+ERROR - If above conditions could not be met.
+
+Related Functions:
+OCISessionPoolDestroy()
+-----------------------------------------------------------------------------
+-----------------------------OCISessionPoolDestroy---------------------------
+Name:
+OCISessionPoolDestroy
+
+Purpose:
+Terminates all the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolDestroy (OCISPool *spoolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+spoolhp (IN/OUT) - The pool handle of the session pool to be destroyed.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+mode (IN) - Currently only OCI_DEFAULT mode is supported.
+
+Returns:
+SUCCESS - All the sessions could be closed.
+ERROR - If the above condition is not met.
+
+Related Functions:
+OCISessionPoolCreate()
+-----------------------------------------------------------------------------
+-------------------------------OCISessionGet---------------------------------
+Name:
+OCISessionGet
+
+Purpose:
+Get a session. This could be from a session pool, connection pool or
+a new standalone session.
+
+Syntax:
+sword OCISessionGet(OCIenv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+ OCIAuthInfo *authhp,
+ OraText *poolName, ub4 poolName_len,
+ CONST OraText *tagInfo, ub4 tagInfo_len,
+ OraText **retTagInfo, ub4 *retTagInfo_len,
+ boolean *found,
+ ub4 mode)
+
+Comments:
+envhp (IN/OUT) - OCI environment handle.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+svchp (IN/OUT) - Address of an OCI service context pointer. This will be
+ filled with a server and session handle, attached to the
+ pool.
+authhp (IN/OUT) - OCI Authentication Information handle.
+poolName (IN) - This indicates the session/connection pool to get the
+ session/connection from in the OCI_SPOOL/OCI_CPOOL mode.
+ In the OCI_DEFAULT mode it refers to the connect string.
+poolName_len (IN) - length of poolName.
+tagInfo (IN) - indicates the tag of the session that the user wants. If the
+ user wants a default session, he must specify a NULL here.
+ Only used for Session Pooling.
+tagInfo_len (IN) - the length of tagInfo.
+retTagInfo (OUT) - This indicates the type of session that is returned to
+ the user. Only used for Session Pooling.
+retTagInfo_len (OUT) - the length of retTagInfo.
+found (OUT) - set to true if the user gets a session he had requested, else
+ set to false. Only used for Session Pooling.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_CRED_PROXY and
+ OCI_GET_SPOOL_MATCHANY, OCI_SPOOL and OCI_CPOOL. OCI_SPOOL and
+ OCI_CPOOL are mutually exclusive.
+
+Returns:
+SUCCESS - if a session was successfully returned into svchp.
+SUCCESS_WITH_INFO - if a session was successfully returned into svchp and the
+ total number of sessions > maxsessions. Only valid for
+ Session Pooling.
+ERROR - If a session could not be retrieved.
+
+Related Functions:
+OCISessionRelease()
+-----------------------------------------------------------------------------
+---------------------------OCISessionRelease---------------------------------
+Name:
+OCISessionRelease
+
+Purpose:
+Release the session.
+
+Syntax:
+sword OCISessionRelease ( OCISvcCtx *svchp, OCIError *errhp,
+ OraText *tag, ub4 tag_len,
+ ub4 mode);
+
+Comments:
+svchp (IN/OUT) - The service context associated with the session/connection.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+tag (IN) - Only used for Session Pooling.
+ This parameter will be ignored unless mode OCI_RLS_SPOOL_RETAG is
+ specified. In this case, the session is labelled with this tag and
+ returned to the pool. If this is NULL, then the session is untagged.
+tag_len (IN) - Length of the tag. This is ignored unless mode
+ OCI_RLS_SPOOL_RETAG is set.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_RLS_SPOOL_DROPSESS,
+ OCI_RLS_SPOOL_RETAG. The last 2 are only valid for Session Pooling.
+ When OCI_RLS_SPOOL_DROPSESS is specified, the session
+ will be removed from the session pool. If OCI_RLS_SPOOL_RETAG
+ is set, the tag on the session will be altered. If this mode is
+ not set, the tag and tag_len parameters will be ignored.
+
+Returns:
+ERROR - If the session could not be released successfully.
+SUCCESS - In all other cases.
+
+Related Functions:
+OCISessionGet().
+-----------------------------------------------------------------------------
+------------------------------OCIDateTimeAssign --------------------------
+sword OCIDateTimeAssign(dvoid *hndl, OCIError *err, CONST OCIDateTime *from,
+ OCIDateTime *to);
+NAME: OCIDateTimeAssign - OCIDateTime Assignment
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+from (IN) - datetime to be assigned
+to (OUT) - lhs of assignment
+DESCRIPTION:
+ Performs date assignment. The type of the output will be same as that
+ of input
+
+------------------------------OCIDateTimeCheck----------------------------
+sword OCIDateTimeCheck(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ ub4 *valid );
+NAME: OCIDateTimeCheck - OCIDateTime CHecK if the given date is valid
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+date (IN) - date to be checked
+valid (OUT) - returns zero for a valid date, otherwise
+ the ORed combination of all error bits specified below:
+ Macro name Bit number Error
+ ---------- ---------- -----
+ OCI_DATE_INVALID_DAY 0x1 Bad day
+ OCI_DATE_DAY_BELOW_VALID 0x2 Bad DAy Low/high bit (1=low)
+ OCI_DATE_INVALID_MONTH 0x4 Bad MOnth
+ OCI_DATE_MONTH_BELOW_VALID 0x8 Bad MOnth Low/high bit (1=low)
+ OCI_DATE_INVALID_YEAR 0x10 Bad YeaR
+ OCI_DATE_YEAR_BELOW_VALID 0x20 Bad YeaR Low/high bit (1=low)
+ OCI_DATE_INVALID_HOUR 0x40 Bad HouR
+ OCI_DATE_HOUR_BELOW_VALID 0x80 Bad HouR Low/high bit (1=low)
+ OCI_DATE_INVALID_MINUTE 0x100 Bad MiNute
+ OCI_DATE_MINUTE_BELOW_VALID 0x200 Bad MiNute Low/high bit (1=low)
+ OCI_DATE_INVALID_SECOND 0x400 Bad SeCond
+ OCI_DATE_SECOND_BELOW_VALID 0x800 bad second Low/high bit (1=low)
+ OCI_DATE_DAY_MISSING_FROM_1582 0x1000 Day is one of those "missing"
+ from 1582
+ OCI_DATE_YEAR_ZERO 0x2000 Year may not equal zero
+ OCI_DATE_INVALID_TIMEZONE 0x4000 Bad Timezone
+ OCI_DATE_INVALID_FORMAT 0x8000 Bad date format input
+
+ So, for example, if the date passed in was 2/0/1990 25:61:10 in
+ (month/day/year hours:minutes:seconds format), the error returned
+ would be OCI_DATE_INVALID_DAY | OCI_DATE_DAY_BELOW_VALID |
+ OCI_DATE_INVALID_HOUR | OCI_DATE_INVALID_MINUTE
+
+DESCRIPTION:
+ Check if the given date is valid.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'date' and 'valid' pointers are NULL pointers
+
+------------------------------- OCIDateTimeCompare----------------------------
+sword OCIDateTimeCompare(dvoid *hndl, OCIError *err, CONST OCIDateTime *date1,
+ CONST OCIDateTime *date2, sword *result );
+NAME: OCIDateTimeCompare - OCIDateTime CoMPare dates
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+date1, date2 (IN) - dates to be compared
+result (OUT) - comparison result, 0 if equal, -1 if date1 < date2,
+ 1 if date1 > date2
+DESCRIPTION:
+The function OCIDateCompare compares two dates. It returns -1 if
+date1 is smaller than date2, 0 if they are equal, and 1 if date1 is
+greater than date2.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid date
+ input dates are not mutually comparable
+
+------------------------------OCIDateTimeConvert----------------------
+sword OCIDateTimeConvert(dvoid *hndl, OCIError *err, OCIDateTime *indate,
+ OCIDateTime *outdate);
+NAME: OCIDateTimeConvert - Conversion between different DATETIME types
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+indate (IN) - pointer to input date
+outdate (OUT) - pointer to output datetime
+DESCRIPTION: Converts one datetime type to another. The result type is
+ the type of the 'outdate' descriptor.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ conversion not possible.
+
+---------------------------- OCIDateTimeFromText-----------------------
+sword OCIDateTimeFromText(dvoid *hndl, OCIError *err, CONST OraText *date_str,
+ size_t d_str_length, CONST OraText *fmt, ub1 fmt_length,
+ CONST OraText *lang_name, size_t lang_length, OCIDateTime *date );
+NAME: OCIDateTimeFromText - OCIDateTime convert String FROM Date
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the
+ conversion takes place in session NLS_LANGUAGE and
+ session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+date_str (IN) - input string to be converted to Oracle date
+d_str_length (IN) - size of the input string, if the length is -1
+ then 'date_str' is treated as a null terminated string
+fmt (IN) - conversion format; if 'fmt' is a null pointer, then
+ the string is expected to be in the default format for
+ the datetime type.
+fmt_length (IN) - length of the 'fmt' parameter
+lang_name (IN) - language in which the names and abbreviations of
+ days and months are specified, if null i.e. (OraText *)0,
+ the default language of session is used,
+lang_length (IN) - length of the 'lang_name' parameter
+date (OUT) - given string converted to date
+DESCRIPTION:
+ Converts the given string to Oracle datetime type set in the
+ OCIDateTime descriptor according to the specified format. Refer to
+ "TO_DATE" conversion function described in "Oracle SQL Language
+ Reference Manual" for a description of format.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid format
+ unknown language
+ invalid input string
+
+--------------------------- OCIDateTimeGetDate-------------------------
+sword OCIDateTimeGetDate(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ sb2 *year, ub1 *month, ub1 *day );
+NAME: OCIDateTimeGetDate - OCIDateTime Get Date (year, month, day)
+ portion of DATETIME.
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime
+year (OUT) - year value
+month (OUT) - month value
+day (OUT) - day value
+
+--------------------------- OCIDateTimeGetTime ------------------------
+sword OCIDateTimeGetTime(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ ub1 *hour, ub1 *minute, ub1 *sec, ub4 *fsec);
+NAME: OCIDateTimeGetTime - OCIDateTime Get Time (hour, min, second,
+ fractional second) of DATETIME.
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime
+hour (OUT) - hour value
+minute (OUT) - minute value
+sec (OUT) - second value
+fsec (OUT) - Fractional Second value
+
+--------------------------- OCIDateTimeGetTimeZoneOffset ----------------------
+sword OCIDateTimeGetTimeZoneOffset(dvoid *hndl,OCIError *err,CONST
+ OCIDateTime *datetime,sb1 *hour,sb1 *minute);
+
+NAME: OCIDateTimeGetTimeZoneOffset - OCIDateTime Get TimeZone (hour, minute)
+ portion of DATETIME.
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime
+hour (OUT) - TimeZone Hour value
+minute (OUT) - TimeZone Minute value
+
+--------------------------- OCIDateTimeSysTimeStamp---------------------
+sword OCIDateTimeSysTimeStamp(dvoid *hndl, OCIError *err,
+ OCIDateTime *sys_date );
+
+NAME: OCIDateTimeSysTimeStamp - Returns system date/time as a TimeStamp with
+ timezone
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+sys_date (OUT) - Pointer to output timestamp
+
+DESCRIPTION:
+ Gets the system current date and time as a timestamp with timezone
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+------------------------------OCIDateTimeIntervalAdd----------------------
+sword OCIDateTimeIntervalAdd(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalAdd - Adds an interval to datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter (IN) - pointer to interval
+outdatetime (IN) - pointer to output datetime. The output datetime
+ will be of same type as input datetime
+DESCRIPTION:
+ Adds an interval to a datetime to produce a resulting datetime
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if:
+ resulting date is before Jan 1, -4713
+ resulting date is after Dec 31, 9999
+
+------------------------------OCIDateTimeIntervalSub----------------------
+sword OCIDateTimeIntervalSub(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalSub - Subtracts an interval from a datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter (IN) - pointer to interval
+outdatetime (IN) - pointer to output datetime. The output datetime
+ will be of same type as input datetime
+DESCRIPTION:
+ Subtracts an interval from a datetime and stores the result in a
+ datetime
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if:
+ resulting date is before Jan 1, -4713
+ resulting date is after Dec 31, 9999
+
+--------------------------- OCIDateTimeConstruct-------------------------
+sword OCIDateTimeConstruct(dvoid *hndl,OCIError *err,OCIDateTime *datetime,
+ sb2 year,ub1 month,ub1 day,ub1 hour,ub1 min,ub1 sec,ub4 fsec,
+ OraText *timezone,size_t timezone_length);
+
+NAME: OCIDateTimeConstruct - Construct an OCIDateTime. Only the relevant
+ fields for the OCIDateTime descriptor types are used.
+PARAMETERS:
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ datetime (IN) - Pointer to OCIDateTime
+ year (IN) - year value
+ month (IN) - month value
+ day (IN) - day value
+ hour (IN) - hour value
+ min (IN) - minute value
+ sec (IN) - second value
+ fsec (IN) - Fractional Second value
+ timezone (IN) - Timezone string
+ timezone_length(IN) - Length of timezone string
+
+DESCRIPTION:
+ Constructs a DateTime descriptor. The type of the datetime is the
+ type of the OCIDateTime descriptor. Only the relevant fields based
+ on the type are used. For Types with timezone, the date and time
+ fields are assumed to be in the local time of the specified timezone.
+ If timezone is not specified, then session default timezone is
+ assumed.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_ERROR if datetime is not valid.
+
+------------------------------OCIDateTimeSubtract-----------------------
+sword OCIDateTimeSubtract(dvoid *hndl, OCIError *err, OCIDateTime *indate1,
+ OCIDateTime *indate2, OCIInterval *inter);
+NAME: OCIDateTimeSubtract - subtracts two datetimes to return an interval
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+indate1(IN) - pointer to subtrahend
+indate2(IN) - pointer to minuend
+inter (OUT) - pointer to output interval
+DESCRIPTION:
+ Takes two datetimes as input and stores their difference in an
+ interval. The type of the interval is the type of the 'inter'
+ descriptor.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ datetimes are not comparable.
+
+--------------------------- OCIDateTimeToText--------------------------
+sword OCIDateTimeToText(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ CONST OraText *fmt, ub1 fmt_length, ub1 fsprec,
+ CONST OraText *lang_name, size_t lang_length,
+ ub4 *buf_size, OraText *buf );
+NAME: OCIDateTimeToText - OCIDateTime convert date TO String
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the
+ conversion takes place in session NLS_LANGUAGE and
+ session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+date (IN) - Oracle datetime to be converted
+fmt (IN) - conversion format, if null string pointer (OraText*)0, then
+ the date is converted to a character string in the
+ default format for that type.
+fmt_length (IN) - length of the 'fmt' parameter
+fsprec (IN) - specifies the fractional second precision in which the
+ fractional seconds is returned.
+lang_name (IN) - specifies the language in which the names and
+ abbreviations of months and days are returned;
+ default language of session is used if 'lang_name'
+ is null i.e. (OraText *)0
+lang_length (IN) - length of the 'nls_params' parameter
+buf_size (IN/OUT) - size of the buffer; size of the resulting string
+ is returned via this parameter
+buf (OUT) - buffer into which the converted string is placed
+DESCRIPTION:
+ Converts the given date to a string according to the specified format.
+ Refer to "TO_DATE" conversion function described in
+ "Oracle SQL Language Reference Manual" for a description of format
+ and NLS arguments. The converted null-terminated date string is
+ stored in the buffer 'buf'.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ invalid format
+ unknown language
+ overflow error
+
+----------------------------OCIDateTimeGetTimeZoneName------------------------
+sword OCIDateTimeGetTimeZoneName(dvoid *hndl,
+ OCIError *err,
+ CONST OCIDateTime *datetime,
+ ub1 *buf,
+ ub4 *buflen);
+NAME OCIDateTimeGetTimeZoneName - OCI DateTime Get the Time Zone Name
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to an OCIDateTime.
+buf (OUT) - User allocated storage for name string.
+buflen (IN/OUT) - length of buf on input, length of name on out
+DESCRIPTION:
+ Returns either the timezone region name or the absolute hour and minute
+ offset. If the DateTime was created with a region id then the region
+ name will be returned in the buf. If the region id is zero, then the
+ hour and minute offset is returned as "[-]HH:MM".
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ error retrieving timezone data
+ invalid region
+ invalid LdiDateTime type
+
+---------------------------------OCIDateTimeToArray----------------------------
+sword OCIDateTimeToArray(dvoid *hndl,
+ OCIError *err,
+ CONST OCIDateTime *datetime,
+ CONST OCIInterval *reftz,
+ ub1 *outarray,
+ ub4 *len
+ ub1 *fsprec);
+NAME OCIDateTimeToArray - OCI DateTime convert To Array format
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime to be converted.
+outarray (OUT) - Result array storage
+len (OUT) - pointer to length of outarray.
+fsprec (IN) - Number of fractional seconds digits.
+DESCRIPTION:
+ Returns an array representing the input DateTime descriptor.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ error retrieving timezone data
+ invalid region
+ invalid LdiDateTime type
+
+--------------------------------OCIDateTimeFromArray---------------------------
+sword OCIDateTimeFromArray(dvoid *hndl,
+ OCIError *err,
+ ub1 *inarray,
+ ub4 len
+ ub1 type
+ OCIDateTime *datetime,
+ OCIInterval *reftz,
+ ub1 fsprec);
+NAME OCIDateTimeFromArray - OCI DateTime convert From Array format
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+inarray (IN) - Pointer to input array representtion of DateTime
+len (IN) - len of inarray.
+type (IN) - One of SQLT_DATE, SQLT_TIME, SQLT_TIME_TZ, SQLT_TIMESTAMP,
+ SQLT_TIMESTAMP_TZ, or SQLT_TIMESTAMP_LTZ.
+datetime (OUT) - Pointer to the result OCIDateTime.
+reftz (IN) - timezone interval used with SQLT_TIMESTAMP_LTZ.
+fsprec (IN) - fractionl seconds digits of precision (0-9).
+DESCRIPTION:
+ Returns a pointer to an OCIDateTime of type type converted from
+ the inarray.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ error retrieving timezone data
+ invalid region
+ invalid LdiDateTime type
+
+----------------------------------OCIRowidToChar-----------------------------
+Name
+OCIRowidToChar
+
+Purpose
+Converts physical/logical (universal) ROWID to chracter extended (Base 64)
+representation into user provided buffer outbfp of length outbflp. After
+execution outbflp contains amount of bytes converted.In case of truncation
+error, outbflp contains required size to make this conversion successful
+and returns ORA-1405.
+
+Syntax
+sword OCIRowidToChar( OCIRowid *rowidDesc,
+ OraText *outbfp,
+ ub2 *outbflp,
+ OCIError *errhp)
+
+Comments
+After this conversion, ROWID in character format can be bound using
+OCIBindByPos or OCIBindByName call and used to query a row at a
+desired ROWID.
+
+Parameters
+rowidDesc (IN) - rowid DESCriptor which is allocated from OCIDescritorAlloc
+ and populated by a prior SQL statement execution
+outbfp (OUT) - pointer to the buffer where converted rowid in character
+ representation is stored after successful execution.
+outbflp (IN/OUT) - pointer to output buffer length variable.
+ Before execution (IN mode) *outbflp contains the size of
+ outbfp, after execution (OUT mode) *outbflp contains amount
+ of bytes converted. In an event of truncation during
+ conversion *outbflp contains the required length to make
+ conversion successful.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+ diagnostic information in the event of an error.
+
+------------------------------OCIDefineArrayOfStruct--------------------------
+
+
+OCIDefineArrayOfStruct()
+Name
+OCI Define for Array of Structures
+Purpose
+This call specifies additional attributes necessary for a static array define.
+Syntax
+sword OCIDefineArrayOfStruct ( OCIDefine *defnp,
+ OCIError *errhp,
+ ub4 pvskip,
+ ub4 indskip,
+ ub4 rlskip,
+ ub4 rcskip );
+Comments
+This call specifies additional attributes necessary for an array define,
+used in an array of structures (multi-row, multi-column) fetch.
+For more information about skip parameters, see the section "Skip Parameters"
+on page 4-17.
+Parameters
+defnp (IN) - the handle to the define structure which was returned by a call
+to OCIDefineByPos().
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value.
+indskip (IN) - skip parameter for the next indicator location.
+rlskip (IN) - skip parameter for the next return length value.
+rcskip (IN) - skip parameter for the next return code.
+Related Functions
+OCIAttrGet()
+
+
+
+
+
+OCIDefineByPos()
+Name
+OCI Define By Position
+Purpose
+Associates an item in a select-list with the type and output data buffer.
+Syntax
+sb4 OCIDefineByPos (
+ OCIStmt *stmtp,
+ OCIDefine **defnp,
+ OCIError *errhp,
+ ub4 position,
+ dvoid *valuep,
+ sb4 value_sz,
+ ub2 dty,
+ dvoid *indp,
+ ub2 *rlenp,
+ ub2 *rcodep,
+ ub4 mode );
+Comments
+This call defines an output buffer which will receive data retreived from
+Oracle. The define is a local step which is necessary when a SELECT statement
+returns data to your OCI application.
+This call also implicitly allocates the define handle for the select-list item.
+Defining attributes of a column for a fetch is done in one or more calls. The
+first call is to OCIDefineByPos(), which defines the minimal attributes
+required to specify the fetch.
+This call takes as a parameter a define handle, which must have been
+previously allocated with a call to OCIHandleAlloc().
+Following the call to OCIDefineByPos() additional define calls may be
+necessary for certain data types or fetch modes:
+A call to OCIDefineArrayOfStruct() is necessary to set up skip parameters
+for an array fetch of multiple columns.
+A call to OCIDefineObject() is necessary to set up the appropriate
+attributes of a named data type fetch. In this case the data buffer pointer
+in ocidefn() is ignored.
+Both OCIDefineArrayOfStruct() and OCIDefineObject() must be called
+after ocidefn() in order to fetch multiple rows with a column of named
+data types.
+For a LOB define, the buffer pointer must be a lob locator of type
+OCILobLocator , allocated by the OCIDescAlloc() call. LOB locators, and not
+LOB values, are always returned for a LOB column. LOB values can then be
+fetched using OCI LOB calls on the fetched locator.
+For NCHAR (fixed and varying length), the buffer pointer must point to an
+array of bytes sufficient for holding the required NCHAR characters.
+Nested table columns are defined and fetched like any other named data type.
+If the mode parameter is this call is set to OCI_DYNAMIC_FETCH, the client
+application can fetch data dynamically at runtime.
+Runtime data can be provided in one of two ways:
+callbacks using a user-defined function which must be registered with a
+subsequent call to OCIDefineDynamic(). When the client library needs a
+buffer to return the fetched data, the callback will be invoked and the
+runtime buffers provided will return a piece or the whole data.
+a polling mechanism using calls supplied by the OCI. This mode is
+assumed if no callbacks are defined. In this case, the fetch call returns the
+OCI_NEED_DATA error code, and a piecewise polling method is used
+to provide the data.
+Related Functions: For more information about using the
+OCI_DYNAMIC_FETCH mode, see the section "Runtime Data
+Allocation and Piecewise Operations" on page 5-16 of Volume 1..
+For more information about the define step, see the section "Defining"
+on page 2-30.
+Parameters
+stmtp (IN) - a handle to the requested SQL query operation.
+defnp (IN/OUT) - a pointer to a pointer to a define handle which is implicitly
+allocated by this call. This handle is used to store the define information
+for this column.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+position (IN) - the position of this value in the select list. Positions are
+1-based and are numbered from left to right. For example, in the SELECT
+statement
+SELECT empno, ssn, mgrno FROM employees;
+empno is at position 1, ssn is at position 2, and mgrno is at position 3.
+valuep (IN/OUT) - a pointer to a buffer or an array of buffers of the type
+specified in the dty parameter. A number of buffers can be specified when
+results for more than one row are desired in a single fetch call.
+value_sz (IN) - the size of each valuep buffer in bytes. If the data is stored
+internally in VARCHAR2 format, the number of characters desired, if different
+from the buffer size in bytes, may be additionally specified by the using
+OCIAttrSet().
+In an NLS conversion environment, a truncation error will be generated if the
+number of bytes specified is insufficient to handle the number of characters
+desired.
+dty (IN) - the data type. Named data type (SQLT_NTY) and REF (SQLT_REF)
+are valid only if the environment has been intialized with in object mode.
+indp - pointer to an indicator variable or array. For scalar data types,
+pointer to sb2 or an array of sb2s. Ignored for named data types. For named
+data types, a pointer to a named data type indicator structure or an array of
+named data type indicator structures is associated by a subsequent
+OCIDefineObject() call.
+See the section "Indicator Variables" on page 2-43 for more information about
+indicator variables.
+rlenp (IN/OUT) - pointer to array of length of data fetched. Each element in
+rlenp is the length of the data in the corresponding element in the row after
+the fetch.
+rcodep (OUT) - pointer to array of column-level return codes
+mode (IN) - the valid modes are:
+OCI_DEFAULT. This is the default mode.
+OCI_DYNAMIC_FETCH. For applications requiring dynamically
+allocated data at the time of fetch, this mode must be used. The user may
+additionally call OCIDefineDynamic() to set up a callback function that
+will be invoked to receive the dynamically allocated buffers and to set
+up the memory allocate/free callbacks and the context for the callbacks.
+valuep and value_sz are ignored in this mode.
+Related Functions
+OCIDefineArrayOfStruct(), OCIDefineDynamic(), OCIDefineObject()
+
+
+
+
+OCIDefineDynamic()
+Name
+OCI Define Dynamic Fetch Attributes
+Purpose
+This call is used to set the additional attributes required if the
+OCI_DYNAMIC_FETCH mode was selected in OCIDefineByPos().
+Syntax
+sword OCIDefineDynamic( OCIDefine *defnp,
+ OCIError *errhp,
+ dvoid *octxp,
+ OCICallbackDefine (ocbfp)(
+ dvoid *octxp,
+ OCIDefine *defnp,
+ ub4 iter,
+ dvoid **bufpp,
+ ub4 **alenpp,
+ ub1 *piecep,
+ dvoid **indpp,
+ ub2 **rcodep) );
+Comments
+This call is used to set the additional attributes required if the
+OCI_DYNAMIC_FETCH mode has been selected in a call to
+OCIDefineByPos().
+When the OCI_DYNAMIC_FETCH mode is selected, buffers will be
+dynamically allocated for REF, and named data type, values to receive the
+data. The pointers to these buffers will be returned.
+If OCI_DYNAMIC_FETCH mode was selected, and the call to
+OCIDefineDynamic() is skipped, then the application can fetch data piecewise
+using OCI calls.
+For more information about OCI_DYNAMIC_FETCH mode, see the section
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+defnp (IN/OUT) - the handle to a define structure returned by a call to
+OCIDefineByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+octxp (IN) - points to a context for the callback function.
+ocbfp (IN) - points to a callback function. This is invoked at runtime to get
+a pointer to the buffer into which the fetched data or a piece of it will be
+retreived. The callback also specifies the indicator, the return code and the
+lengths of the data piece and indicator. The callback has the following
+parameters:
+octxp (IN) - a context pointer passed as an argument to all the callback
+functions.
+defnp (IN) - the define handle.
+iter (IN) - which row of this current fetch.
+bufpp (OUT) - returns a pointer to a buffer to store the column value, ie.
+*bufp points to some appropriate storage for the column value.
+alenpp (OUT) - returns a pointer to the length of the buffer. *alenpp
+contains the size of the buffer after return from callback. Gets set to
+actual data size after fetch.
+piecep (IN/OUT) - returns a piece value, as follows:
+The IN value can be OCI_ONE_PIECE, OCI_FIRST_PIECE or
+OCI_NEXT_PIECE.
+The OUT value can be OCI_ONE_PIECE if the IN value was
+OCI_ONE_PIECE.
+The OUT value can be OCI_ONE_PIECE or OCI_FIRST_PIECE if
+the IN value was OCI_FIRST_PIECE.
+The OUT value can only be OCI_NEXT_PIECE or
+OCI_LAST_PIECE if the IN value was OCI_NEXT_PIECE.
+indpp (IN) - indicator variable pointer
+rcodep (IN) - return code variable pointer
+Related Functions
+OCIAttrGet()
+OCIDefineObject()
+
+
+
+
+OCIDefineObject()
+Name
+OCI Define Named Data Type attributes
+Purpose
+Sets up additional attributes necessary for a Named Data Type define.
+Syntax
+sword OCIDefineObject ( OCIDefine *defnp,
+ OCIError *errhp,
+ CONST OCIType *type,
+ dvoid **pgvpp,
+ ub4 *pvszsp,
+ dvoid **indpp,
+ ub4 *indszp );
+Comments
+This call sets up additional attributes necessary for a Named Data Type define.
+An error will be returned if this function is called when the OCI environment
+has been initialized in non-Object mode.
+This call takes as a paramter a type descriptor object (TDO) of datatype
+OCIType for the named data type being defined. The TDO can be retrieved
+with a call to OCITypeByName().
+See the description of OCIInitialize() on page 13 - 43 for more information
+about initializing the OCI process environment.
+Parameters
+defnp (IN/OUT) - a define handle previously allocated in a call to
+OCIDefineByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+type (IN, optional) - points to the Type Descriptor Object (TDO) which
+describes the type of the program variable. Only used for program variables
+of type SQLT_NTY. This parameter is optional, and may be passed as NULL
+if it is not being used.
+pgvpp (IN/OUT) - points to a pointer to a program variable buffer. For an
+array, pgvpp points to an array of pointers. Memory for the fetched named data
+type instance(s) is dynamically allocated in the object cache. At the end of
+the fetch when all the values have been received, pgvpp points to the
+pointer(s) to these newly allocated named data type instance(s). The
+application must call OCIObjectMarkDel() to deallocate the named data type
+instance(s) when they are no longer needed.
+pvszsp (IN/OUT) - points to the size of the program variable. For an array, it
+is an array of ub4s. On return points to the size(s) of unpickled fetched
+values.
+indpp (IN/OUT) - points to a pointer to the program variable buffer
+containing the parallel indicator structure. For an array, points to an array
+of pointers. Memory is allocated to store the indicator structures in the
+object cache. At the end of the fetch when all values have been received,
+indpp points to the pointer(s) to these newly allocated indicator structure(s).
+indszp (IN/OUT) - points to the size(s) of the indicator structure program
+variable. For an array, it is an array of ub4s. On return points to the size(s)
+of the unpickled fetched indicator values.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIDescAlloc()
+Name
+OCI Get DESCriptor or lob locator
+Purpose
+Allocates storage to hold certain data types. The descriptors can be used as
+bind or define variables.
+Syntax
+sword OCIDescAlloc ( CONST dvoid *parenth,
+ dvoid **descpp,
+ ub4 type,
+ size_t xtramem_sz,
+ dvoid **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to
+the type specified in type. A non-NULL descriptor or LOB locator is returned
+on success. No diagnostics are available on error.
+This call returns OCI_SUCCESS if successful, or OCI_INVALID_HANDLE if
+an out-of-memory error occurs.
+Parameters
+parenth (IN) - an environment handle.
+descpp (OUT) - returns a descriptor or LOB locator of desired type.
+type (IN) - specifies the type of descriptor or LOB locator to be allocated.
+The specific types are:
+OCI_DTYPE_SNAP - specifies generation of snapshot descriptor of C
+type - OCISnapshot
+OCI_DTYPE_LOB - specifies generation of a LOB data type locator of C
+type - OCILobLocator
+OCI_DTYPE_RSET - specifies generation of a descriptor of C type
+OCIResult that references a result set (a number of rows as a result of a
+query). This descriptor is bound to a bind variable of data type
+SQLT_RSET (result set). The descriptor has to be converted into a
+statement handle using a function - OCIResultSetToStmt() - which can
+then be passed to OCIDefineByPos() and OCIStmtFetch() to retrieve the
+rows of the result set.
+OCI_DTYPE_ROWID - specifies generation of a ROWID descriptor of C
+type OCIRowid.
+OCI_DTYPE_COMPLEXOBJECTCOMP - specifies generation of a
+complex object retrieval descriptor of C type
+OCIComplexObjectComp.
+xtramemsz (IN) - specifies an amount of user memory to be allocated for use
+by the application.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz
+allocated by the call for the user.
+Related Functions
+OCIDescFree()
+
+
+
+
+OCIDescFree()
+Name
+OCI Free DESCriptor
+Purpose
+Deallocates a previously allocated descriptor.
+Syntax
+sword OCIDescFree ( dvoid *descp,
+ ub4 type);
+Comments
+This call frees up storage associated with the descriptor, corresponding to the
+type specified in type. Returns OCI_SUCCESS or OCI_INVALID_HANDLE.
+All descriptors must be explicitly deallocated. OCI will not deallocate a
+descriptor if the environment handle is deallocated.
+Parameters
+descp (IN) - an allocated descriptor.
+type (IN) - specifies the type of storage to be freed. The specific types are:
+OCI_DTYPE_SNAP - snapshot descriptor
+OCI_DTYPE_LOB - a LOB data type descriptor
+OCI_DTYPE_RSET - a descriptor that references a result set (a number
+of rows as a result of a query).
+OCI_DTYPE_ROWID - a ROWID descriptor
+OCI_DTYPE_COMPLEXOBJECTCOMP - a complex object retrieval
+descriptor
+Related Functions
+OCIDescAlloc()
+
+
+
+OCIDescribeAny()
+Name
+OCI DeSCribe Any
+Purpose
+Describes existing schema objects.
+Syntax
+sword OCIDescribeAny ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ dvoid *objptr,
+ ub4 objnm_len,
+ ub1 objptr_typ,
+ ub1 info_level,
+ ub1 objtype,
+ OCIDesc *dschp );
+Comments
+This is a generic describe call that describes existing schema objects: tables,
+views, synonyms, procedures, functions, packages, sequences, and types. As a
+result of this call, the describe handle is populated with the object-specific
+attributes which can be obtained through an OCIAttrGet() call.
+An OCIParamGet() on the describe handle returns a parameter descriptor for a
+specified position. Parameter positions begin with 1. Calling OCIAttrGet() on
+the parameter descriptor returns the specific attributes of a stored procedure
+or function parameter or a table column descriptor as the case may be.
+These subsequent calls do not need an extra round trip to the server because
+the entire schema object description cached on the client side by
+OCIDescribeAny(). Calling OCIAttrGet() on the describe handle can also return
+the total number of positions.
+See the section "Describing" on page 2-33 for more information about describe
+operations.
+Parameters
+TO BE UPDATED
+svchp (IN/OUT) - a service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+objptr (IN) - the name of the object (a null-terminated string) to be
+described. Only procedure or function names are valid when connected to an
+Oracle7 Server.
+objptr_len (IN) - the length of the string. Must be non-zero.
+objptr_typ (IN) - Must be OCI_OTYPE_NAME, OCI_OTYPE_REF, or OCI_OTYPE_PTR.
+info_level (IN) - reserved for future extensions. Pass OCI_DEFAULT.
+objtype (IN/OUT) - object type.
+dschp (IN/OUT) - a describe handle that is populated with describe
+information about the object after the call.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIEnvCreate()
+Name
+OCI ENVironment CREATE
+Purpose
+This function creates and initializes an environment for the rest of
+the OCI functions to work under. This call is a replacement for both
+the OCIInitialize and OCIEnvInit calls.
+Syntax
+sword OCIEnvCreate ( OCIEnv **envhpp,
+ ub4 mode,
+ CONST dvoid *ctxp,
+ CONST dvoid *(*malocfp)
+ (dvoid *ctxp,
+ size_t size),
+ CONST dvoid *(*ralocfp)
+ (dvoid *ctxp,
+ dvoid *memptr,
+ size_t newsize),
+ CONST void (*mfreefp)
+ ( dvoid *ctxp,
+ dvoid *memptr))
+ size_t xtramemsz,
+ dvoid **usrmempp );
+
+Comments
+This call creates an environment for all the OCI calls using the modes
+specified by the user. This call can be used instead of the two calls
+OCIInitialize and OCIEnvInit. This function returns an environment handle
+which is then used by the remaining OCI functions. There can be multiple
+environments in OCI each with its own environment modes. This function
+also performs any process level initialization if required by any mode.
+For example if the user wants to initialize an environment as OCI_THREADED,
+then all libraries that are used by OCI are also initialized in the
+threaded mode.
+
+This call should be invoked before anny other OCI call and should be used
+instead of the OCIInitialize and OCIEnvInit calls. This is the recommended
+call, although OCIInitialize and OCIEnvInit calls will still be supported
+for backward compatibility.
+
+envpp (OUT) - a pointer to a handle to the environment.
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data
+structures are protected from concurrent accesses by multiple threads.
+OCI_OBJECT - will use navigational object interface.
+ctxp (IN) - user defined context for the memory call back routines.
+malocfp (IN) - user-defined memory allocation function. If mode is
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+xtramemsz (IN) - specifies the amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz
+allocated by the call for the user.
+
+Example
+
+Related Functions
+OCIInitialize, OCIEnvInit
+
+OCIEnvNlsCreate()
+Name
+OCI ENVironment CREATE with NLS info
+Purpose
+This function does almost everything OCIEnvCreate does, plus enabling setting
+of charset and ncharset programmatically, except OCI_UTF16 mode.
+Syntax
+sword OCIEnvNlsCreate(OCIEnv **envhpp,
+ ub4 mode,
+ dvoid *ctxp,
+ dvoid *(*malocfp)
+ (dvoid *ctxp,
+ size_t size),
+ dvoid *(*ralocfp)
+ (dvoid *ctxp,
+ dvoid *memptr,
+ size_t newsize),
+ void (*mfreefp)
+ (dvoid *ctxp,
+ dvoid *memptr),
+ size_t xtramemsz,
+ dvoid **usrmempp,
+ ub2 charset,
+ ub2 ncharset)
+Comments
+The charset and ncharset must be both zero or non-zero.
+The parameters have the same meaning as the ones in OCIEnvCreate().
+When charset or ncharset is non-zero, the corresponding character set will
+be used to replace the ones specified in NLS_LANG or NLS_NCHAR. Moreover,
+OCI_UTF16ID is allowed to be set as charset and ncharset.
+On the other hand, OCI_UTF16 mode is deprecated with this function.
+Applications can achieve the same effects by setting
+both charset and ncharset as OCI_UTF16ID.
+
+
+OCIEnvInit()
+Name
+OCI INITialize environment
+Purpose
+This call initializes the OCI environment handle.
+Syntax
+sword OCIEnvInit ( OCIEnv **envp,
+ ub4 mode,
+ size_t xtramemsz,
+ dvoid **usrmempp );
+Comments
+Initializes the OCI environment handle. No changes are done on an initialized
+handle. If OCI_ERROR or OCI_SUCCESS_WITH_INFO is returned, the
+environment handle can be used to obtain ORACLE specific errors and
+diagnostics.
+This call is processed locally, without a server round-trip.
+Parameters
+envpp (OUT) - a pointer to a handle to the environment.
+mode (IN) - specifies initialization of an environment mode. The only valid
+mode is OCI_DEFAULT for default mode
+xtramemsz (IN) - specifies the amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz
+allocated by the call for the user.
+Example
+See the description of OCISessionBegin() on page 13-84 for an example showing
+the use of OCIEnvInit().
+Related Functions
+
+
+
+
+OCIErrorGet()
+Name
+OCI Get Diagnostic Record
+Purpose
+Returns an error message in the buffer provided and an ORACLE error.
+Syntax
+sword OCIErrorGet ( dvoid *hndlp,
+ ub4 recordno,
+ OraText *sqlstate,
+ ub4 *errcodep,
+ OraText *bufp,
+ ub4 bufsiz,
+ ub4 type );
+Comments
+Returns an error message in the buffer provided and an ORACLE error.
+Currently does not support SQL state. This call can be called a multiple
+number of times if there are more than one diagnostic record for an error.
+The error handle is originally allocated with a call to OCIHandleAlloc().
+Parameters
+hndlp (IN) - the error handle, in most cases, or the environment handle (for
+errors on OCIEnvInit(), OCIHandleAlloc()).
+recordno (IN) - indicates the status record from which the application seeks
+info. Starts from 1.
+sqlstate (OUT) - Not supported in Version 8.0.
+errcodep (OUT) - an ORACLE Error is returned.
+bufp (OUT) - the error message text is returned.
+bufsiz (IN) - the size of the buffer provide to get the error message.
+type (IN) - the type of the handle.
+Related Functions
+OCIHandleAlloc()
+
+OCIExtractInit
+Name
+OCI Extract Initialize
+Purpose
+This function initializes the parameter manager.
+Syntax
+sword OCIExtractInit(dvoid *hndl, OCIError *err);
+Comments
+It must be called before calling any other parameter manager routine. The NLS
+information is stored inside the parameter manager context and used in
+subsequent calls to OCIExtract routines.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractTerm()
+
+OCIExtractTerm
+Name
+OCI Extract Terminate
+Purpose
+This function releases all dynamically allocated storage and may perform
+other internal bookkeeping functions.
+Syntax
+sword OCIExtractTerm(dvoid *hndl, OCIError *err);
+Comments
+It must be called when the parameter manager is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractInit()
+
+OCIExtractReset
+Name
+OCI Extract Reset
+Purpose
+The memory currently used for parameter storage, key definition storage, and
+parameter value lists is freed and the structure is reinitialized.
+Syntax
+sword OCIExtractReset(dvoid *hndl, OCIError *err);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+Related Functions
+
+OCIExtractSetNumKeys
+Name
+OCI Extract Set Number of Keys
+Purpose
+Informs the parameter manager of the number of keys that will be registered.
+Syntax
+sword OCIExtractSetNumKeys(dvoid *hndl, OCIError *err, uword numkeys);
+Comments
+This routine must be called prior to the first call of OCIExtractSetKey().
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+numkeys (IN) - The number of keys that will be registered with
+ OCIExtractSetKey().
+Related Functions
+OCIExtractSetKey()
+
+OCIExtractSetKey
+Name
+OCI Extract Set Key definition
+Purpose
+Registers information about a key with the parameter manager.
+Syntax
+sword OCIExtractSetKey(dvoid *hndl, OCIError *err, CONST OraText *name,
+ ub1 type, ub4 flag, CONST dvoid *defval,
+ CONST sb4 *intrange, CONST OraText *CONST *strlist);
+Comments
+This routine must be called after calling OCIExtractSetKey() and before
+calling OCIExtractFromFile() or OCIExtractFromStr().
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+name (IN) - The name of the key.
+type (IN) - The type of the key (OCI_EXTRACT_TYPE_INTEGER,
+ OCI_EXTRACT_TYPE_OCINUM, OCI_EXTRACT_TYPE_STRING, or
+ OCI_EXTRACT_TYPE_BOOLEAN).
+flag (IN) - Set to OCI_EXTRACT_MULTIPLE if the key can take multiple values
+ or 0 otherwise.
+defval (IN) - Set to the default value for the key. May be NULL if there is
+ no default. A string default must be a (text*) type, an
+ integer default must be an (sb4*) type, and a boolean default
+ must be a (ub1*) type.
+intrange (IN) - Starting and ending values for the allowable range of integer
+ values. May be NULL if the key is not an integer type or if
+ all integer values are acceptable.
+strlist (IN) - List of all acceptable text strings for the key. May be NULL
+ if the key is not a string type or if all text values are
+ acceptable.
+Related Functions
+OCIExtractSetNumKeys()
+
+OCIExtractFromFile
+Name
+OCI Extract parameters From File
+Purpose
+The keys and their values in the given file are processed.
+Syntax
+sword OCIExtractFromFile(dvoid *hndl, OCIError *err, ub4 flag,
+ OraText *filename);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set:
+ OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or
+ OCI_EXTRACT_APPEND_VALUES.
+filename (IN) - Null-terminated filename string.
+Related Functions
+
+OCIExtractFromStr
+Name
+OCI Extract parameters From String
+Purpose
+The keys and their values in the given string are processed.
+Syntax
+sword OCIExtractFromStr(dvoid *hndl, OCIError *err, ub4 flag, OraText *input);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set:
+ OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or
+ OCI_EXTRACT_APPEND_VALUES.
+input (IN) - Null-terminated input string.
+Related Functions
+
+OCIExtractToInt
+Name
+OCI Extract To Integer
+Purpose
+Gets the integer value for the specified key.
+Syntax
+sword OCIExtractToInt(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, sb4 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR.
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual integer value.
+Related Functions
+
+OCIExtractToBool
+Name
+OCI Extract To Boolean
+Purpose
+Gets the boolean value for the specified key.
+Syntax
+sword OCIExtractToBool(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, ub1 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR.
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual boolean value.
+Related Functions
+
+OCIExtractToStr
+Name
+OCI Extract To String
+Purpose
+Gets the string value for the specified key.
+Syntax
+sword OCIExtractToStr(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, OraText *retval, uword buflen);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR.
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual null-terminated string value.
+buflen (IN) - The length of the buffer for retval.
+Related Functions
+
+Note: The following OCIExtract functions are unavailable in this release
+
+OCIExtractToOCINum
+Name
+OCI Extract To OCI Number
+Purpose
+Gets the OCINumber value for the specified key.
+Syntax
+sword OCIExtractToOCINum(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, OCINumber *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR.
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual OCINumber value.
+Related Functions
+
+OCIExtractToList
+Name
+OCI Extract To parameter List
+Purpose
+Generates a list of parameters from the parameter structures that are stored
+in memory.
+Syntax
+sword OCIExtractToList(dvoid *hndl, OCIError *err, uword *numkeys);
+Comments
+Must be called before OCIExtractValues() is called.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+numkeys (OUT) - Number of distinct keys stored in memory.
+Related Functions
+OCIExtractFromList()
+
+OCIExtractFromList
+Name
+OCI Extract From parameter List
+Purpose
+Generates a list of values for the a parameter in the parameter list.
+Syntax
+sword OCIExtractFromList(dvoid *hndl, OCIError *err, uword index,
+ OraText *name, ub1 *type, uword *numvals,
+ dvoid ***values);
+Comments
+Parameters are specified by an index. OCIExtractToList() must be called prior
+to calling this routine to generate the parameter list from the parameter
+structures that are stored in memory.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+name (OUT) - Name of the key for the current parameter.
+type (OUT) - Type of the current parameter (OCI_EXTRACT_TYPE_STRING,
+ OCI_EXTRACT_TYPE_INTEGER, OCI_EXTRACT_TYPE_OCINUM, or
+ OCI_EXTRACT_TYPE_BOOLEAN)
+numvals (OUT) - Number of values for this parameter.
+values (OUT) - The values for this parameter.
+Related Functions
+OCIExtractToList()
+
+
+************************ OCIFileClose() ***********************************
+
+Name
+ OCIFileClose - Oracle Call Interface FILE i/o CLOSE
+
+Purpose
+ Close a previously opened file.
+
+Syntax
+ sword OCIFileClose ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep )
+
+Comments
+ This function will close a previously opened file. If the function succeeds
+ then OCI_SUCCESS will be returned, else OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen.
+
+
+
+********************* OCIFileExists() **************************************
+
+Name
+ OCIFileExists - Oracle Call Interface FILE i/o EXIST
+
+Purpose
+ Check to see if the file exists.
+
+Syntax
+ sword OCIFileExists ( dvoid *hndl,
+ OCIError *err,
+ OraText *filename,
+ OraText *path,
+ ub1 *flag )
+
+Comments
+ This function will set the flag to TRUE if the file exists else it will
+ be set to FALSE.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl(IN) - OCI environment or session handle
+ err(OUT) - OCI error handle
+ filename(IN) - filename
+ path(IN) - path of the file
+ flag(OUT) - whether the file exists or not
+
+Related Functions.
+ None.
+
+
+ **************************** OCIFileFlush() ******************************
+
+
+Name
+ OCIFileFlush - Oracle Call Interface File i/o FLUSH
+
+Purpose
+ Flush the buffers associated with the file to the disk.
+
+Syntax
+ sword OCIFileFlush ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep )
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen, OCIFileWrite
+
+
+
+ *************************** OCIFileGetLength() ****************************
+
+Name
+ OCIFileGetLength - Oracle Call Interface FILE i/o GET file LENGTH
+
+Purpose
+ Get the length of a file.
+
+Syntax
+ OCIFileGetLength(dvoid *hndl,
+ OCIError *err,
+ OraText *filename,
+ OraText *path,
+ ubig_ora *lenp )
+
+Comments
+ The length of the file will be returned in lenp.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filename (IN) - file name.
+ path (IN) - path of the file.
+ lenp (OUT) - On output, it is the length of the file in bytes.
+ is the number of bytes in the file.
+
+Related Functions
+ None.
+
+
+
+******************************** OCIFileInit() *****************************
+
+Name
+ OCIFileInit - Oracle Call Interface FILE i/o INITialize
+
+Purpose
+ Initialize the OCI File I/O package and create the OCIFile context.
+
+Syntax
+ sword OCIFileInit ( dvoid *hndl,
+ OCIError *err)
+
+Comments
+ This function should be called before any of the OCIFile functions are
+ used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure.
+
+Related Functions
+ OCIFileTerm
+
+
+
+********************************* OCIFileOpen() *****************************
+
+Name
+ OCIFileOpen - Oracle Call Interface File i/o OPEN
+
+Purpose
+ Open a file.
+
+Syntax
+ sword OCIFileOpen ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject **filep,
+ OraText *filename,
+ OraText *path,
+ ub4 mode,
+ ub4 create,
+ ub4 type )
+
+Comments
+ OCIFileOpen returns a handle to the open file in filep if the file is
+ successfully opened.
+ If one wants to use the standard file objects (stdin, stdout & stderr)
+ then OCIFileOpen whould be called with the type filed containing the
+ appropriate type (see the parameter type). If any of the standard files
+ are specified then filename, path, mode and create are ignored.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (OUT) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filep (OUT) - the file object to be returned.
+ filename (IN) - file name (NULL terminated string).
+ path (IN) - path of the file (NULL terminated string).
+ mode - mode in which to open the file (valid modes are OCI_FILE_READONLY,
+ OCI_FILE_WRITEONLY, OCI_FILE_READ_WRITE).
+ create - should the file be created if it does not exist. Valid values
+ are:
+ OCI_FILE_TRUNCATE - create a file regardless of whether or not it exists.
+ If the file already exists overwrite it.
+ OCI_FILE_EXIST - open it if it exists, else fail.
+ OCI_FILE_EXCL - fail if the file exists, else create.
+ OCI_FILE_CREATE - open the file if it exists, and create it if it doesn't.
+ OCI_FILE_APPEND - set the file pointer to the end of the file prior to
+ writing(this flag can be OR'ed with OCI_FILE_EXIST or
+ OCI_FILE_CREATE).
+type - file type. Valid values are OCI_FILE_TEXT, OCI_FILE_BIN,
+ OCI_FILE_STDIN, OCI_FILE_STDOUT and OCI_FILE_STDERR.
+ If any of the standard files are specified then filename, path, mode
+ and create are ignored.
+
+Related Functions.
+ OCIFileClose
+
+
+
+************************** OCIFileRead() ************************************
+
+Name
+ OCIFileRead - Oracle Call Interface FILE i/o READ
+
+Purpose
+ Read from a file into a buffer.
+
+Syntax
+ sword OCIFileRead ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep,
+ dvoid *bufp,
+ ub4 bufl,
+ ub4 *bytesread )
+
+Comments
+ Upto bufl bytes from the file will be read into bufp. The user should
+ allocate memory for the buffer.
+ The number of bytes read would be in bytesread.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a File Object that uniquely references the file.
+ bufp (IN) - the pointer to a buffer into which the data will be read. The
+ length of the allocated memory is assumed to be bufl.
+ bufl - the length of the buffer in bytes.
+ bytesread (OUT) - the number of bytes read.
+
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileWrite
+
+
+
+****************************** OCIFileSeek() ******************************
+
+Name
+ OCIFileSeek - Oracle Call Interface FILE i/o SEEK
+
+Purpose
+ Perfom a seek to a byte position.
+
+Syntax
+ sword OCIFileSeek ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep,
+ uword origin,
+ ubig_ora offset,
+ sb1 dir)
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ origin - The starting point we want to seek from. NOTE: The starting
+ point may be OCI_FILE_SEEK_BEGINNING (beginning), OCI_FILE_SEEK_CURRENT
+ (current position), or OCI_FILE_SEEK_END (end of file).
+ offset - The number of bytes from the origin we want to start reading from.
+ dir - The direction we want to go from the origin. NOTE: The direction
+ can be either OCI_FILE_FORWARD or OCI_FILE_BACKWARD.
+
+Related Function
+ OCIFileOpen, OCIFileRead, OCIFileWrite
+
+
+
+*************************** OCIFileTerm() **********************************
+
+Name
+ OCIFileTerm - Oracle Call Interface FILE i/o TERMinate
+
+Purpose
+ Terminate the OCI File I/O package and destroy the OCI File context.
+
+Syntax
+ sword OCIFileTerm ( dvoid *hndl,
+ OCIError *err )
+
+Comments
+ After this function has been called no OCIFile function should be used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure.
+
+Related Functions
+ OCIFileInit
+
+
+********************************* OCIFileWrite() ****************************
+
+Name
+ OCIFileWrite - Oracle Call Interface FILE i/o WRITE
+
+Purpose
+ Write data from buffer into a file.
+
+Syntax
+ sword OCIFileWrite ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep,
+ dvoid *bufp,
+ ub4 buflen
+ ub4 *byteswritten )
+
+Comments
+ The number of bytes written will be in *byteswritten.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ bufp (IN) - the pointer to a buffer from which the data will be written.
+ The length of the allocated memory is assumed to be the value passed
+ in bufl.
+ bufl - the length of the buffer in bytes.
+ byteswritten (OUT) - the number of bytes written.
+
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileRead
+
+
+
+
+
+OCIHandleAlloc()
+Name
+OCI Get HaNDLe
+Purpose
+This call returns a pointer to an allocated and initialized handle.
+Syntax
+sword OCIHandleAlloc ( CONST dvoid *parenth,
+ dvoid **hndlpp,
+ ub4 type,
+ size_t xtramem_sz,
+ dvoid **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to
+the type specified in type. A non-NULL handle is returned on success. Bind
+handle and define handles are allocated with respect to a statement handle. All
+other handles are allocated with respect to an environment handle which is
+passed in as a parent handle.
+No diagnostics are available on error. This call returns OCI_SUCCESS if
+successful, or OCI_INVALID_HANDLE if an out-of-memory error occurs.
+Handles must be allocated using OCIHandleAlloc() before they can be passed
+into an OCI call.
+Parameters
+parenth (IN) - an environment or a statement handle.
+hndlpp (OUT) - returns a handle to a handle type.
+type (IN) - specifies the type of handle to be allocated. The specific types
+are:
+OCI_HTYPE_ERROR - specifies generation of an error report handle of
+C type OCIError
+OCI_HTYPE_SVCCTX - specifies generation of a service context handle
+of C type OCISvcCtx
+OCI_HTYPE_STMT - specifies generation of a statement (application
+request) handle of C type OCIStmt
+OCI_HTYPE_BIND - specifies generation of a bind information handle
+of C type OCIBind
+OCI_HTYPE_DEFINE - specifies generation of a column definition
+handle of C type OCIDefine
+OCI_HTYPE_DESCRIBE - specifies generation of a select list
+description handle of C type OCIDesc
+OCI_HTYPE_SERVER - specifies generation of a server context handle
+of C type OCIServer
+OCI_HTYPE_SESSION - specifies generation of an authentication
+context handle of C type OCISession
+OCI_HTYPE_TRANS - specifies generation of a transaction context
+handle of C type OCITrans
+OCI_HTYPE_COMPLEXOBJECT - specifies generation of a complex
+object retrieval handle of C type OCIComplexObject
+OCI_HTYPE_SECURITY - specifies generation of a security handle of C
+type OCISecurity
+xtramem_sz (IN) - specifies an amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz
+allocated by the call for the user.
+Related Functions
+OCIHandleFree()
+
+
+
+OCIHandleFree()
+Name
+OCI Free HaNDLe
+Purpose
+This call explicitly deallocates a handle.
+Syntax
+sword OCIHandleFree ( dvoid *hndlp,
+ ub4 type);
+Comments
+This call frees up storage associated with a handle, corresponding to the type
+specified in the type parameter.
+This call returns either OCI_SUCCESS or OCI_INVALID_HANDLE.
+All handles must be explicitly deallocated. OCI will not deallocate a child
+handle if the parent is deallocated.
+Parameters
+hndlp (IN) - an opaque pointer to some storage.
+type (IN) - specifies the type of storage to be allocated. The specific types
+are:
+OCI_HTYPE_ENV - an environment handle
+OCI_HTYPE_ERROR - an error report handle
+OCI_HTYPE_SVCCTX - a service context handle
+OCI_HTYPE_STMT - a statement (application request) handle
+OCI_HTYPE_BIND - a bind information handle
+OCI_HTYPE_DEFINE - a column definition handle
+OCI_HTYPE_DESCRIBE - a select list description handle
+OCI_HTYPE_SERVER - a server handle
+OCI_HTYPE_SESSION - a user authentication handle
+OCI_HTYPE_TRANS - a transaction handle
+OCI_HTYPE_COMPLEXOBJECT - a complex object retrieval handle
+OCI_HTYPE_SECURITY - a security handle
+Related Functions
+OCIHandleAlloc()
+
+
+
+
+OCIInitialize()
+Name
+OCI Process Initialize
+Purpose
+Initializes the OCI process environment.
+Syntax
+sword OCIInitialize ( ub4 mode,
+ CONST dvoid *ctxp,
+ CONST dvoid *(*malocfp)
+ ( dvoid *ctxp,
+ size_t size ),
+ CONST dvoid *(*ralocfp)
+ ( dvoid *ctxp,
+ dvoid *memp,
+ size_t newsize ),
+ CONST void (*mfreefp)
+ ( dvoid *ctxp,
+ dvoid *memptr ));
+Comments
+This call initializes the OCI process environment.
+OCIInitialize() must be invoked before any other OCI call.
+Parameters
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data
+structures are protected from concurrent accesses by multiple threads.
+OCI_OBJECT - will use navigational object interface.
+ctxp (IN) - user defined context for the memory call back routines.
+malocfp (IN) - user-defined memory allocation function. If mode is
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing
+the use of OCIInitialize().
+Related Functions
+
+-------------------------------OCITerminate------------------------------------
+
+OCITerminate()
+Name
+OCI process Terminate
+Purpose
+Do cleanup before process termination
+Syntax
+sword OCITerminate (ub4 mode);
+
+Comments
+This call performs OCI related clean up before the OCI process terminates.
+If the process is running in shared mode then the OCI process is disconnected
+from the shared memory subsystem.
+
+OCITerminate() should be the last OCI call in any process.
+
+Parameters
+mode (IN) - specifies different termination modes.
+
+OCI_DEFAULT - default mode.
+
+Example
+
+Related Functions
+OCIInitialize()
+
+---------------------- OCIIntervalAssign ---------------------------------
+sword OCIIntervalAssign(dvoid *hndl, OCIError *err,
+ CONST OCIInterval *inpinter, OCIInterval *outinter );
+
+ DESCRIPTION
+ Copies one interval to another to create a replica
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) inpinter - Input Interval
+ (OUT) outinter - Output Interval
+ RETURNS
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_SUCCESS otherwise
+
+ ---------------------- OCIIntervalCheck ------------------------------------
+sword OCIIntervalCheck(dvoid *hndl, OCIError *err, CONST OCIInterval *interval,
+ ub4 *valid );
+
+ DESCRIPTION
+ Checks the validity of an interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) interval - Interval to be checked
+ (OUT) valid - Zero if the interval is valid, else returns an Ored
+ combination of the following codes.
+
+ Macro name Bit number Error
+ ---------- ---------- -----
+ OCI_INTER_INVALID_DAY 0x1 Bad day
+ OCI_INTER_DAY_BELOW_VALID 0x2 Bad DAy Low/high bit (1=low)
+ OCI_INTER_INVALID_MONTH 0x4 Bad MOnth
+ OCI_INTER_MONTH_BELOW_VALID 0x8 Bad MOnth Low/high bit (1=low)
+ OCI_INTER_INVALID_YEAR 0x10 Bad YeaR
+ OCI_INTER_YEAR_BELOW_VALID 0x20 Bad YeaR Low/high bit (1=low)
+ OCI_INTER_INVALID_HOUR 0x40 Bad HouR
+ OCI_INTER_HOUR_BELOW_VALID 0x80 Bad HouR Low/high bit (1=low)
+ OCI_INTER_INVALID_MINUTE 0x100 Bad MiNute
+ OCI_INTER_MINUTE_BELOW_VALID 0x200 Bad MiNute Low/high bit(1=low)
+ OCI_INTER_INVALID_SECOND 0x400 Bad SeCond
+ OCI_INTER_SECOND_BELOW_VALID 0x800 bad second Low/high bit(1=low)
+ OCI_INTER_INVALID_FRACSEC 0x1000 Bad Fractional second
+ OCI_INTER_FRACSEC_BELOW_VALID 0x2000 Bad fractional second Low/High
+
+
+ RETURNS
+ OCI_SUCCESS if interval is okay
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalCompare -----------------------------------
+sword OCIIntervalCompare(dvoid *hndl, OCIError *err, OCIInterval *inter1,
+ OCIInterval *inter2, sword *result );
+
+ DESCRIPTION
+ Compares two intervals, returns 0 if equal, -1 if inter1 < inter2,
+ 1 if inter1 > inter2
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ inter1 (IN) - Interval to be compared
+ inter2 (IN) - Interval to be compared
+ result (OUT) - comparison result, 0 if equal, -1 if inter1 < inter2,
+ 1 if inter1 > inter2
+
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ the two input datetimes are not mutually comparable.
+
+---------------------- OCIIntervalDivide ------------------------------------
+sword OCIIntervalDivide(dvoid *hndl, OCIError *err, OCIInterval *dividend,
+ OCINumber *divisor, OCIInterval *result );
+
+ DESCRIPTION
+ Divides an interval by an Oracle Number to produce an interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ dividend (IN) - Interval to be divided
+ divisor (IN) - Oracle Number dividing `dividend'
+ result (OUT) - resulting interval (dividend / divisor)
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalFromNumber --------------------
+sword OCIIntervalFromNumber(dvoid *hndl, OCIError *err,
+ OCIInterval *inter, OCINumber *number);
+ DESCRIPTION
+ Converts an interval to an Oracle Number
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (OUT) interval - Interval to be converted
+ (IN) number - Oracle number result (in years for YEARMONTH interval
+ and in days for DAYSECOND)
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR on error.
+ NOTES
+ Fractional portions of the date (for instance, minutes and seconds if
+ the unit chosen is hours) will be included in the Oracle number produced.
+ Excess precision will be truncated.
+
+ ---------------------- OCIIntervalFromText ---------------------------------
+sword OCIIntervalFromText( dvoid *hndl, OCIError *err, CONST OraText *inpstr,
+ size_t str_len, OCIInterval *result );
+
+ DESCRIPTION
+ Given an interval string produce the interval represented by the string.
+ The type of the interval is the type of the 'result' descriptor.
+ PARAMETERS
+
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) inpstr - Input string
+ (IN) str_len - Length of input string
+ (OUT) result - Resultant interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ there are too many fields in the literal string
+ the year is out of range (-4713 to 9999)
+ if the month is out of range (1 to 12)
+ if the day of month is out of range (1 to 28...31)
+ if hour is not in range (0 to 23)
+ if hour is not in range (0 to 11)
+ if minute is not in range (0 to 59)
+ if seconds in minute not in range (0 to 59)
+ if seconds in day not in range (0 to 86399)
+ if the interval is invalid
+
+
+ ---------------------- OCIIntervalGetDaySecond --------------------
+
+ DESCRIPTION
+ Gets values of day second interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ day (OUT) - number of days
+ hour (OUT) - number of hours
+ min (OUT) - number of mins
+ sec (OUT) - number of secs
+ fsec (OUT) - number of fractional seconds
+ result (IN) - resulting interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+ ---------------------- OCIIntervalGetYearMonth --------------------
+
+ DESCRIPTION
+ Gets year month from an interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ year (OUT) - year value
+ month (OUT) - month value
+ result (IN) - resulting interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+
+-------------------------- OCIIntervalAdd ------------------------------
+sword OCIIntervalAdd(dvoid *hndl, OCIError *err, OCIInterval *addend1,
+ OCIInterval *addend2, OCIInterval *result );
+NAME OCIIntervalAdd - Adds two intervals
+PARAMETERS
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+addend1 (IN) - Interval to be added
+addend2 (IN) - Interval to be added
+result (OUT) - resulting interval (addend1 + addend2)
+DESCRIPTION
+ Adds two intervals to produce a resulting interval
+RETURNS
+ OCI_SUCCESS on success
+ OCI_ERROR if:
+ the two input intervals are not mutually comparable.
+ the resulting year would go above SB4MAXVAL
+ the resulting year would go below SB4MINVAL
+ OCI_INVALID_HANDLE if 'err' is NULL.
+NOTES
+ The two input intervals must be mutually comparable
+
+ ---------------------- OCIIntervalSubtract -------------------------------
+sword OCIIntervalSubtract(dvoid *hndl, OCIError *err, OCIInterval *minuend,
+ OCIInterval *subtrahend, OCIInterval *result );
+NAME - OCIIntervalSubtract - subtracts two intervals
+PARAMETERS
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+minuend (IN) - interval to be subtracted from
+subtrahend (IN) - interval subtracted from minuend
+result (OUT) - resulting interval (minuend - subtrahend)
+DESCRIPTION
+ Subtracts two intervals and stores the result in an interval
+RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if:
+ the two input intervals are not mutually comparable.
+ the resulting leading field would go below SB4MINVAL
+ the resulting leading field would go above SB4MAXVAL
+
+---------------------- OCIIntervalMultiply ---------------------------------
+sword OCIIntervalMultiply(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ OCINumber *nfactor, OCIInterval *result );
+
+ DESCRIPTION
+ Multiplies an interval by an Oracle Number to produce an interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ inter (IN) - Interval to be multiplied
+ nfactor (IN) - Oracle Number to be multiplied
+ result (OUT) - resulting interval (ifactor * nfactor)
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if:
+ the resulting year would go above SB4MAXVAL
+ the resulting year would go below SB4MINVAL
+
+
+ ---------------------- OCIIntervalSetDaySecond --------------------
+
+ DESCRIPTION
+ Sets day second interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ day (IN) - number of days
+ hour (IN) - number of hours
+ min (IN) - number of mins
+ sec (IN) - number of secs
+ fsec (IN) - number of fractional seconds
+ result (OUT) - resulting interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+ ---------------------- OCIIntervalSetYearMonth --------------------
+
+ DESCRIPTION
+ Sets year month interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ year (IN) - year value
+ month (IN) - month value
+ result (OUT) - resulting interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+----------------------- OCIIntervalToNumber ---------------------------------
+sword OCIIntervalToNumber(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ OCINumber *number);
+
+ DESCRIPTION
+ Converts an interval to an Oracle Number
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) inter - Interval to be converted
+ (OUT) number - Oracle number result (in years for YEARMONTH interval
+ and in days for DAYSECOND)
+ RETURNS
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_SUCCESS on success
+ NOTES
+ Fractional portions of the date (for instance, minutes and seconds if
+ the unit chosen is hours) will be included in the Oracle number produced.
+ Excess precision will be truncated.
+
+------------------------------- OCIIntervalToText -------------------------
+sword OCIIntervalToText( dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ ub1 lfprec, ub1 fsprec, OraText *buffer,
+ size_t buflen, size_t *resultlen );
+
+ DESCRIPTION
+ Given an interval, produces a string representing the interval.
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) inter - Interval to be converted
+ (IN) lfprec - Leading field precision. Number of digits used to
+ represent the leading field.
+ (IN) fsprec - Fractional second precision of the interval. Number of
+ digits used to represent the fractional seconds.
+ (OUT) buffer - buffer to hold result
+ (IN) buflen - length of above buffer
+ (OUT) resultlen - length of result placed into buffer
+
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR
+ if the buffer is not large enough to hold the result
+ NOTES
+ The interval literal will be output as `year' or `[year-]month' for
+ YEAR-MONTH intervals and as `seconds' or `minutes[:seconds]' or
+ `hours[:minutes[:seconds]]' or `days[ hours[:minutes[:seconds]]]' for
+ DAY-TIME intervals (where optional fields are surrounded by brackets).
+
+ ---------------------- OCIIntervalFromTZ --------------------
+sword OCIIntervalFromTZ(dvoid *hndl, OCIError *err, CONST oratext *inpstring,
+ size_t str_len, OCIInterval *result);
+
+ DESCRIPTION
+ Retuns an OCI_DTYPE_INTERVAL_DS OCIInterval with the region id (if
+ the region is specified in the input string) set and the current
+ absolute offset or an absolut offset with the region id set to 0.
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ inpstring (IN) - pointer to the input string
+ str_len (IN) - inpstring length
+ result - Output Interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR on error
+ Bad interval type
+ Timezone errors
+ NOTES
+ The input string must be of the form [+/-]TZH:TZM or 'TZR [TZD]'
+
+ ----------------------- OCIKerbAttrSet ---------------------
+sword OCIKerbAttrSet(OCISession *trgthndlp, ub4 auth_mode,
+ ub1 *ftgt_ticket, ub4 ftgt_ticket_len,
+ ub1 *ftgt_sesskey, ub4 ftgt_sesskey_len,
+ ub2 ftgt_keytype, ub4 ftgt_ticket_flags,
+ sb4 ftgt_auth_time, sb4 ftgt_start_time,
+ sb4 ftgt_end_time, sb4 ftgt_renew_time,
+ text *ftgt_principal, ub4 ftgt_principal_len,
+ text *ftgt_realm, ub4 ftgt_realm_len,
+ OCIError *errhp);
+
+ DESCRIPTION
+ This call sets the attributes required for Kerberos authentication
+ on the user handle.
+
+ PARAMETERS
+ trgthndlp (IN) - The pointer to a user handle.
+ auth_mode (IN) - Indicates what type of Kerberos credentials should
+ be set. Options are:
+
+ OCI_KERBCRED_PROXY
+ - Set Kerberos credentials for use with
+ proxy authentication.
+ OCI_KERBCRED_CLIENT_IDENTIFIER
+ - Set Kerberos credentials for use
+ with secure client identifier.
+
+ ftgt_ticket (IN) - Forwardable Ticket Granting Ticket (FTGT).
+ ftgt_ticket_len (IN) - Length of FTGT.
+ ftgt_sesskey(IN) - Session Key associated with FTGT.
+ ftgt_sesskey_len (IN) - Length of session key.
+ ftgt_keytype (IN) - Type of encryption key used to encrypt FTGT.
+ ftgt_ticket_flags (IN) - Flags associated with encryption of FTGT.
+ ftgt_auth_time (IN) - Authentication time compatible with that in FTGT.
+ ftgt_start_time (IN) - Start time compatible with that indicated in FTGT.
+ ftgt_end_time (IN) - End time compatible with that indicated in FTGT.
+ ftgt_renew_time (IN) - Renew time compatible with that indicated in FTGT.
+ ftgt_principal (IN) - Client principal name from FTGT.
+ ftgt_principal_len (IN) - Length of client principal name.
+ ftgt_realm (IN) - Client realm name from FTGT.
+ ftgt_realm_len (IN) - Client realm name length.
+ errhp (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_ERROR on error
+ NOTES
+
+OCILdaToSvcCtx()
+Name
+OCI toggle version 7 Lda_Def to SerVice context handle
+Purpose
+Converts a V7 Lda_Def to a V8 service context handle.
+Syntax
+sword OCILdaToSvcCtx ( OCISvcCtx **svchpp,
+ OCIError *errhp,
+ Lda_Def *ldap );
+Comments
+Converts a V7 Lda_Def to a V8 service context handle. The action of this call
+can be reversed by passing the resulting service context handle to the
+OCISvcCtxToLda() function.
+Parameters
+svchpp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+ldap (IN/OUT) - the V7 logon data area returned by OCISvcCtxToLda() from
+this service context.
+Related Functions
+OCISvcCtxToLda()
+
+
+
+
+OCILobAppend()
+
+Name
+OCI Lob APpend
+
+Purpose
+Appends a LOB value at the end of another LOB.
+
+Syntax
+sword OCILobAppend ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_locp );
+Comments
+Appends a LOB value at the end of LOB. The data is
+copied from the source to the destination at the end of the destination. The
+source and the destination must already exist. The destination LOB is
+extended to accommodate the newly written data.
+
+It is an error to extend the destination LOB beyond the maximum length
+allowed or to try to copy from a NULL LOB.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB.
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB.
+
+Related Functions
+OCILobTrim()
+OCIErrorGet()
+OCILobWrite()
+OCILobCopy()
+
+
+
+OCILobAssign()
+
+Name
+OCI Lob ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobAssign ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *src_locp,
+ OCILobLocator **dst_locpp );
+
+Comments
+Assign source locator to destination locator. After the assignment, both
+locators refer to the same LOB data. For internal LOBs, the source locator's
+LOB data gets copied to the destination locator's LOB data only when the
+destination locator gets stored in the table. Therefore, issuing a flush of
+the object containing the destination locator will copy the LOB data. For
+FILEs only the locator that refers to the OS file is copied to the table. The
+OS file is not copied.
+Note: The only difference between this and OCILobLocatorAssign is that this
+takes an environment handle whereas OCILobLocatorAssign takes an OCI service
+handle
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded
+in errhp and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to. The caller must allocate space
+for the OCILobLocator by calling OCIDescriptorAlloc().
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobLocatorAssign()
+
+
+OCILobCharSetForm()
+
+Name
+OCI Lob Get Character Set Form
+
+Purpose
+Gets the LOB locator's character set fpr,, if any.
+
+Syntax
+sword OCILobCharSetForm ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *locp,
+ ub1 *csfrm );
+
+Comments
+Returns the character set form of the input LOB locator in the csfrm output
+parameter.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it
+is recorded in err and this function returns OCI_ERROR. Diagnostic
+information can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set form.
+csfrm(OUT) - character set form of the input LOB locator. If the input
+locator is for a BLOB or a BFILE, csfrm is set to 0 since there is no concept
+of a character set for binary LOBs/FILEs. The caller must allocate space for
+the csfrm (ub1) and not write into the space.
+See also
+OCIErrorGet(), OCILobCharSetId(), OCILobLocatorIsInit
+
+
+
+OCILobCharSetId()
+
+Name
+OCI Lob get Character Set IDentifier
+
+Purpose
+Gets the LOB locator's character set ID, if any.
+
+Syntax
+sword OCILobCharSetId ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *locp,
+ ub2 *csid );
+
+Comments
+Returns the character set ID of the input LOB locator in the cid output
+parameter.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it
+is recorded in err and this function returns OCI_ERROR. Diagnostic
+information can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set ID.
+csid (OUT) - character set ID of the input LOB locator. If the input locator
+is for a BLOB or a BFILE, csid is set to 0 since there is no concept of a
+character set for binary LOBs/FILEs. The caller must allocate space for the
+character set id of type ub2 and not write into the space.
+
+See also
+OCIErrorGet(), OCILobCharSetForm(), OCILobLocatorIsInit()
+
+
+
+OCILobCopy()
+
+Name
+OCI Lob Copy
+
+Purpose
+Copies a portion of a LOB value into another LOB value.
+
+Syntax
+sword OCILobCopy ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_locp,
+ ub4 amount,
+ ub4 dst_offset,
+ ub4 src_offset );
+
+Comments
+Copies a portion of a LOB value into another LOB as specified. The data
+is copied from the source to the destination. The source (src_locp) and the
+destination (dlopb) LOBs must already exist.
+If the data already exists at the destination's start position, it is
+overwritten with the source data. If the destination's start position is
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination
+LOB is extended to accommodate the newly written data if it extends
+beyond the current length of the destination LOB.
+It is an error to extend the destination LOB beyond the maximum length
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB.
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB.
+amount (IN) - the number of character or bytes, as appropriate, to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB.
+For character LOBs it is the number of characters from the beginning of the
+LOB at which to begin writing. For binary LOBs it is the number of bytes from
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source LOB.
+For character LOBs it is the number of characters from the beginning of the
+LOB, for binary LOBs it is the number of bytes. Starts at 1.
+
+See Also
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim()
+
+OCILobCreateTemporary()
+
+Name
+OCI Lob Create Temporary
+
+Purpose
+Create a Temporary Lob
+
+Syntax
+sword OCILobCreateTemporary(OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub2 csid,
+ ub1 csfrm,
+ ub1 lobtype,
+ boolean cache,
+ OCIDuration duration);
+
+
+Comments
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator which points to the temporary Lob
+csid (IN) - the character set id
+csfrm(IN) - the character set form
+lobtype (IN) - the lob type - one of the three constants OCI_TEMP_BLOB,
+ OCI_TEMP_CLOB and OCI_TEMP_NCLOB
+cache(IN)- TRUE if the temporary LOB goes through the cache; FALSE, if not.
+duration(IN)- duration of the temporary LOB; Can be a valid duration id or one
+ of the values: OCI_DURATION_SESSION, OCI_DURATION_CALL
+ Note: OCI_DURATION_TRANSACTION is NOT supported in 8.1
+Related functions
+OCILobFreeTemporary()
+OCILobIsTemporary()
+
+OCILobDisableBuffering()
+
+Name
+OCI Lob Disable Buffering
+
+Purpose
+Disable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobDisableBuffering ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+Comments
+
+Disable lob buffering for the input locator. The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is *not* used. Note that this call does *not*
+implicitly flush the changes made in the buffering subsystem. The
+user must explicitly call OCILobFlushBuffer() to do this.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator uniquely referencing the LOB.
+
+Related Functions
+OCILobEnableBuffering()
+OCIErrorGet()
+OCILobFlushBuffer()
+
+
+
+
+OCILobEnableBuffering()
+
+Name
+OCI Lob Enable Buffering
+
+Purpose
+Enable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobEnableBuffering ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+Comments
+
+Enable lob buffering for the input locator. The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is used.
+
+Once lob buffering is enabled for a locator, if that locator is passed to
+one of the following routines, an error is returned:
+ OCILobCopy, OCILobAppend, OCILobErase, OCILobGetLength, OCILobTrim
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator uniquely referencing the LOB.
+
+Related Functions
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+OCILobFlushBuffer()
+
+
+
+
+OCILobErase()
+
+Name
+OCI Lob ERase
+
+Purpose
+Erases a specified portion of the LOB data starting at a specified offset.
+
+Syntax
+sword OCILobErase ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *amount,
+ ub4 offset );
+
+Comments
+Erases a specified portion of the LOB data starting at a specified offset.
+The actual number of characters/bytes erased is returned. The actual number
+of characters/bytes and the requested number of characters/bytes will differ
+if the end of the LOB data is reached before erasing the requested number of
+characters/bytes.
+If a section of data from the middle of the LOB data is erased, a hole is
+created. When data from that hole is read, 0's are returned. If the LOB is
+NULL, this routine will indicate that 0 characters/bytes were erased.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - the LOB for which to erase a section of data.
+amount (IN/OUT) - On IN, the number of characters/bytes to erase. On OUT,
+the actual number of characters/bytes erased.
+offset (IN) - absolute offset from the beginning of the LOB data from which
+to start erasing data. Starts at 1.
+
+See Also
+OCIErrorGet(), OCILobRead(), OCILobWrite()
+
+OCILobOpen()
+
+Name
+OCI Lob Open
+
+Purpose
+Opens an internal or external Lob.
+
+Syntax
+sword OCILobOpen( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub1 mode );
+
+Comments
+It is an error if the same lob is opened more than once in
+the same transaction. Lobs are opened implicitly if they are
+not opened before using them. A LOB has to be closed before
+the transaction commits else the transaction is rolled back.
+Open locators are closed if the transaction aborts. Multiple
+users can open the same lob on different locators.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - locator points to the LOB to be opened
+mode (IN) - mode in which to open the lob. The valid modes are
+read-only - OCI_FILE_READONLY, read-write - OCI_FILE_READWRITE
+
+OCILobClose()
+
+Name
+OCI Lob Close
+
+Purpose
+Closes an open internal or external Lob.
+
+Syntax
+sword OCILobClose( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp );
+
+
+Comments
+It is an error if the lob is not open at this time. All LOBs
+that have been opened in a transaction have to be closed
+before the transaction commits, else the transaction gets
+rolled back.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN) - A locator that was opened using OCILobOpen()
+
+
+OCILobFileClose()
+
+Name
+OCI Lob File CLoSe
+
+Purpose
+Closes a previously opened FILE.
+
+Syntax
+sword OCILobFileClose ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *filep );
+
+Comments
+Closes a previously opened FILE. It is an error if this function is called for
+an internal LOB. No error is returned if the FILE exists but is not opened.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+filep (IN/OUT) - a pointer to a FILE locator to be closed.
+
+See Also
+OCIErrorGet(), OCILobFileOpen(), OCILobFileCloseAll(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+OCILobFileCloseAll()
+
+Name
+OCI LOB FILE Close All
+
+Purpose
+Closes all open FILEs on a given service context.
+
+Syntax
+sword OCILobFileCLoseAll ( OCISvcCtx *svchp,
+ OCIError *errhp );
+
+Comments
+Closes all open FILEs on a given service context.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+
+See also
+OCILobFileClose(),
+OCIErrorGet(), OCILobFileOpen(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+OCILobFileExists()
+
+Name
+OCI LOB FILE exists
+
+Purpose
+Tests to see if the FILE exists on the server
+
+Syntax
+sword OCILobFileExists ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *filep,
+ boolean *flag );
+
+Comments
+Checks to see if a FILE exists for on the server.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error,
+it is recorded in err and this function returns OCI_ERROR. Diagnostic
+information can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator that refers to the file.
+flag (OUT) - returns TRUE if the FILE exists; FALSE if it does not.
+
+See also
+OCIErrorGet, CREATE DIRECTORY (DDL)
+
+
+
+
+OCILobFileGetName()
+
+Name
+OCI LOB FILE Get file Name
+
+Purpose
+Gets the FILE locator's directory alias and file name.
+
+Syntax
+sword OCILobFileGetName ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *filep,
+ OraText *dir_alias,
+ ub2 *d_length,
+ OraText *filename,
+ ub2 *f_length );
+
+Comments
+Returns the directory alias and file name associated with this file locator.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) -The OCI error handle. If there is an error, it is recorded in
+errhp and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+filep (IN) - FILE locator for which to get the directory alias and file name.
+dir_alias (OUT) - buffer into which the directory alias name is placed. The
+caller must allocate enough space for the directory alias name and must not
+write into the space.
+d_length (IN/OUT)
+ - IN: length of the input dir_alias string;
+ - OUT: length of the returned dir_alias string.
+filename (OUT) - buffer into which the file name is placed. The caller must
+allocate enough space for the file name and must not write into the space.
+f_length (IN/OUT)
+ - IN: length of the input filename string;
+ - OUT: lenght of the returned filename string.
+
+See also
+OCILobFileSetName(), OCIErrorGet()
+
+
+
+
+OCILobFileIsOpen()
+
+Name
+OCI LOB FILE Is Open?
+
+Purpose
+Tests to see if the FILE is open
+
+Syntax
+sword OCILobFileIsOpen ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *filep,
+ boolean *flag );
+
+Comments
+Checks to see if the FILE on the server is open for a given LobLocator.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it
+is recorded in err and this function returns OCI_ERROR. Diagnostic
+information can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator being examined. If the input file
+locator was never passed to OCILobFileOpen(), the file is considered not to
+be opened by this locator. However, a different locator may have opened the
+file. More than one file opens can be performed on the same file using
+different locators.
+flag (OUT) - returns TRUE if the FILE is opened using this locator; FALSE if
+it is not.
+
+See also
+OCIErrorGet, OCILobFileOpen, OCILobFileClose, OCILobFileCloseAll, CREATE
+DIRECTORY SQL command
+
+
+OCILobFileOpen()
+
+Name
+OCI LOB FILE open
+
+Purpose
+Opens a FILE for read-only access
+
+Syntax
+sword OCILobFileOpen ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *filep,
+ ub1 mode );
+
+Comments
+Opens a FILE. The FILE can be opened for read-only access only. FILEs may not
+be written to throough ORACLE.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+filep (IN/OUT) - the FILE to open. Error if the locator does not refer to a
+FILE.
+mode (IN) - mode in which to open the file. The only valid mode is
+read-only - OCI_FILE_READONLY.
+
+See Also
+OCILobFileClose, OCIErrorGet, OCILobFileCloseAll, OCILobFileIsOpen,
+OCILobFileSetName, CREATE DIRECTORY
+
+
+
+
+OCILobFileSetName()
+
+Name
+OCI Lob File Set NaMe
+
+Purpose
+Sets directory alias and file name in the FILE locator.
+
+Syntax
+sword OCILobFileSetName ( OCIEnv *envhp,
+ OCIError *errhp,
+ OCILobLocator **filepp,
+ OraText *dir_alias,
+ ub2 d_length,
+ OraText *filename,
+ ub2 f_length );
+Comments
+Sets the directory alias and file name in the LOB file locator.
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded
+in errhp and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+filepp (IN/OUT) - FILE locator for which to set the directory alias name.
+The caller must have already allocated space for the locator by calling
+OCIDescriptorAlloc().
+dir_alias (IN) - buffer that contains the directory alias name to set in the
+locator.
+d_length (IN) - length of the input dir_alias parameter.
+filename (IN) - buffer that contains the file name is placed.
+f_length (IN) - length of the input filename parameter.
+See also
+OCILobFileGetName, OCIErrorGet, CREATE DIRECTORY
+
+
+
+
+OCILobFlushBuffer()
+
+Name
+OCI Lob Flush all Buffers for this lob.
+
+Purpose
+Flush/write all buffers for this lob to the server.
+
+
+Syntax
+sword OCILobFlushBuffer ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 flag);
+
+Comments
+
+Flushes to the server, changes made to the buffering subsystem that
+are associated with the lob referenced by the input locator. This
+routine will actually write the data in the buffer to the lob in
+the database. Lob buffering must have already been enabled for the
+input lob locator.
+
+This routine, by default, does not free the buffer resources for
+reallocation to another buffered LOB operation. However, if you
+want to free the buffer explicitly, you can set the flag parameter
+to OCI_LOB_BUFFER_FREE.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator uniquely referencing the LOB.
+flag (IN) - to indicate if the buffer resources need to be freed
+ after a flush. Default value is OCI_LOB_BUFFER_NOFREE.
+ Set it to OCI_LOB_BUFFER_FREE if you want the buffer
+ resources to be freed.
+Related Functions
+OCILobEnableBuffering()
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+
+
+OCILobFreeTemporary()
+
+Name
+OCI Lob Free Temporary
+
+Purpose
+Free a temporary LOB
+
+Syntax
+sword OCILobFreeTemporary(OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+Comments
+ Frees the contents of the temporary Lob this locator is pointing to. Note
+ that the locator itself is not freed until a OCIDescriptorFree is done.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator uniquely referencing the LOB
+
+Related functions
+OCILobCreateTemporary()
+OCILobIsTemporary()
+
+
+Name
+OCI Lob/File Get Chunk Size
+
+Purpose
+When creating the table, the user can specify the chunking factor, which can
+be a multiple of Oracle blocks. This corresponds to the chunk size used by the
+LOB data layer when accessing/modifying the LOB value. Part of the chunk is
+used to store system-related information and the rest stores the LOB value.
+This function returns the amount of space used in the LOB chunk to store
+the LOB value.
+
+Syntax
+sword OCILobGetChunkSize ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *chunksizep );
+
+Comments
+ Performance will be improved if the user issues read/write
+requests using a multiple of this chunk size. For writes, there is an added
+benefit since LOB chunks are versioned and, if all writes are done on chunk
+basis, no extra/excess versioning is done nor duplicated. Users could batch
+up the write until they have enough for a chunk instead of issuing several
+write calls for the same chunk.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+chunksizep (OUT) - On output, it is the length of the LOB if not NULL - for
+character LOBs it is the number of characters, for binary LOBs it is the
+number of bytes in the LOB.
+
+Related Functions
+
+OCILobGetLength()
+
+Name
+OCI Lob/File Length
+
+Purpose
+Gets the length of a LOB/FILE.
+
+Syntax
+sword OCILobGetLength ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *lenp );
+
+Comments
+Gets the length of a LOB/FILE. If the LOB/FILE is NULL, the length is
+undefined.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+lenp (OUT) - On output, it is the length of the LOB if not NULL - for
+character LOBs it is the number of characters, for binary LOBs it is the
+number of bytes in the LOB.
+
+Related Functions
+OCIErrorGet, OCIFileSetName
+
+
+
+OCILobIsEqual()
+
+Name
+
+OCI Lob Is Equal
+
+Purpose
+Compares two LOB locators for equality.
+
+Syntax
+sword OCILobIsEqual ( OCIEnv *envhp,
+ CONST OCILobLocator *x,
+ CONST OCILobLocator *y,
+ boolean *is_equal );
+
+Comments
+Compares the given LOB locators for equality. Two LOB locators are equal if
+and only if they both refer to the same LOB data.
+Two NULL locators are considered not equal by this function.
+Parameters
+envhp (IN) - the OCI environment handle.
+x (IN) - LOB locator to compare.
+y (IN) - LOB locator to compare.
+is_equal (OUT) - TRUE, if the LOB locators are equal; FALSE if they are not.
+
+See also
+OCILobAssign, OCILobLocatorIsInit
+OCILobLocatorAssign,
+OCILobIsOpen()
+
+Name
+
+OCI Lob Is Open
+sword OCILobIsOpen(svchp, errhp, locp, flag)
+OCISvcCtx *svchp;
+OCIError *errhp;
+OCILobLocator *locp;
+boolean *flag;
+
+Comments
+ Checks if the LOB locator was opened before. flag is set to TRUE
+ if opened; FALSE otherwise
+
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN) - the locator to test for temporary LOB
+flag(OUT) - TRUE, if the LOB locator points to is open
+ FALSE, if not.
+
+OCILobIsTemporary()
+
+Name
+
+OCI Lob Is Temporary
+
+Purpose
+ Tests if this locator points to a temporary LOB
+
+Syntax
+sword OCILobIsTemporary(OCIEnv *envhp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ boolean *is_temporary);
+
+Comments
+Tests the locator to determine if it points to a temporary LOB.
+If so, is_temporary is set to TRUE. If not, is_temporary is set
+to FALSE.
+
+Parameters
+envhp (IN) - the environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN) - the locator to test for temporary LOB
+is_temporary(OUT) - TRUE, if the LOB locator points to a temporary LOB;
+ FALSE, if not.
+
+See Also
+OCILobCreateTemporary, OCILobFreeTemporary
+
+
+OCILobLoadFromFile()
+
+Name
+OCI Lob Load From File
+
+Purpose
+Load/copy all or a portion of the file into an internal LOB.
+
+Syntax
+sword OCILobLoadFromFile ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_filep,
+ ub4 amount,
+ ub4 dst_offset,
+ ub4 src_offset );
+
+Comments
+Loads/copies a portion or all of a file value into an internal LOB as
+specified. The data is copied from the source file to the destination
+internal LOB (BLOB/CLOB). No character set conversions are performed
+when copying the bfile data to a clob/nclob. The bfile data must already
+be in the same character set as the clob/nclob in the database. No
+error checking is performed to verify this.
+The source (src_filep) and the destination (dst_locp) LOBs must already exist.
+If the data already exists at the destination's start position, it is
+overwritten with the source data. If the destination's start position is
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination
+LOB is extended to accommodate the newly written data if it extends
+beyond the current length of the destination LOB.
+It is an error to extend the destination LOB beyond the maximum length
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+dst_locp (IN/OUT) - a locator uniquely referencing the destination internal
+LOB which may be of type blob, clob, or nclob.
+src_filep (IN/OUT) - a locator uniquely referencing the source BFILE.
+amount (IN) - the number of bytes to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB.
+For character LOBs it is the number of characters from the beginning of the
+LOB at which to begin writing. For binary LOBs it is the number of bytes from
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source BFILE. It is
+the number of bytes from the beginning of the LOB. The offset starts at 1.
+
+See Also
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim(), OCILobCopy()
+
+OCILobLocatorAssign()
+
+Name
+OCI Lob LOCATOR ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobLocatorAssign ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ CONST OCILobLocator *src_locp,
+ OCILobLocator **dst_locpp );
+
+Comments
+Assign source locator to destination locator. After the assignment, both
+locators refer to the same LOB data. For internal LOBs, the source locator's
+LOB data gets copied to the destination locator's LOB data only when the
+destination locator gets stored in the table. Therefore, issuing a flush of
+the object containing the destination locator will copy the LOB data. For
+FILEs only the locator that refers to the OS file is copied to the table. The
+OS file is not copied.
+Note : the only difference between this and OCILobAssign is that this takes
+a OCI service handle pointer instead of a OCI environment handle pointer
+
+Parameters
+svchp (IN/OUT) - OCI service handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded
+in errhp and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to. The caller must allocate space
+for the OCILobLocator by calling OCIDescriptorAlloc().
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobAssign()
+
+
+
+
+OCILobLocatorIsInit()
+
+Name
+OCI LOB locator is initialized?
+
+Purpose
+Tests to see if a given LOB locator is initialized.
+
+Syntax
+sword OCILobLocatorIsInit ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *locp,
+ boolean *is_initialized );
+
+Comments
+Tests to see if a given LOB locator is initialized.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it
+is recorded in err and this function returns OCI_ERROR. Diagnostic
+information can be obtained by calling OCIErrorGet().
+locp (IN) - the LOB locator being tested
+is_initialized (OUT) - returns TRUE if the given LOB locator is initialized;
+FALSE if it is not.
+
+See also
+OCIErrorGet, OCILobIsEqual
+
+
+
+
+OCILobRead()
+
+Name
+OCI Lob/File ReaD
+
+Purpose
+Reads a portion of a LOB/FILE as specified by the call into a buffer.
+
+Syntax
+sword OCILobRead ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 offset,
+ ub4 *amtp,
+ dvoid *bufp,
+ ub4 bufl,
+ dvoid *ctxp,
+ OCICallbackLobRead cbfp,
+ ub2 csid,
+ ub1 csfrm );
+
+Comments
+Reads a portion of a LOB/FILE as specified by the call into a buffer. Data
+read from a hole is returned as 0s. It is an error to try to read from a NULL
+LOB/FILE. The OS FILE must already exist on the server and must have been
+opened using the input locator. Oracle must hav epermission to read the OS
+file and user must have read permission on the directory object.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB.
+offset (IN) - On input, it is the absolute offset, for character LOBs in the
+number of characters from the beginning of the LOB, for binary LOBs it is the
+number of bytes. Starts from 1.
+amtp (IN/OUT) - On input, the number of character or bytes to be read. On
+output, the actual number of bytes or characters read.
+If the amount of bytes to be read is larger than the buffer length it is
+assumed that the LOB is being read in a streamed mode. On input if this value
+is 0, then the data shall be read in streamed mode from the LOB until the end
+of LOB. If the data is read in pieces, *amtp always contains the length of
+the last piece read. If a callback function is defined, then this callback
+function will be invoked each time bufl bytes are read off the pipe. Each
+piece will be written into bufp.
+If the callback function is not defined, then OCI_NEED_DATA error code will
+be returned. The application must invoke the LOB read over and over again to
+read more pieces of the LOB until the OCI_NEED_DATA error code is not
+returned. The buffer pointer and the length can be different in each call
+if the pieces are being read into different sizes and location.
+bufp (IN) - the pointer to a buffer into which the piece will be read. The
+length of the allocated memory is assumed to be bufl.
+bufl (IN) - the length of the buffer in octets.
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece. If
+this is NULL, then OCI_NEED_DATA will be returned for each piece.
+The callback function must return OCI_CONTINUE for the read to continue.
+If any other error code is returned, the LOB read is aborted.
+ ctxp (IN) - the context for the call back function. Can be NULL.
+ bufp (IN) - a buffer pointer for the piece.
+ len (IN) - the length of length of current piece in bufp.
+ piece (IN) - which piece - OCI_FIRST_PIECE, OCI_NEXT_PIECE or
+ OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCILobFileOpen, OCILobFileSetName, CREATE DIRECTORY
+
+
+
+
+OCILobTrim()
+
+Name
+
+OCI Lob Trim
+
+Purpose
+Trims the lob value to a shorter length
+
+Syntax
+sword OCILobTrim ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 newlen );
+
+Comments
+Truncates LOB data to a specified shorter length.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. This locator
+must be a locator that was obtained from the server specified by svchp.
+newlen (IN) - the new length of the LOB data, which must be less than or equal
+to the current length.
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCiLobErase, OCILobAppend, OCILobCopy
+
+
+
+
+
+OCILobWrite()
+
+Name
+OCI Lob Write
+
+Purpose
+Writes a buffer into a LOB
+
+Syntax
+sword OCILobWrite ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 offset,
+ ub4 *amtp,
+ dvoid *bufp,
+ ub4 buflen,
+ ub1 piece,
+ dvoid *ctxp,
+ OCICallbackLobWrite (cbfp)
+ (
+ dvoid *ctxp,
+ dvoid *bufp,
+ ub4 *lenp,
+ ub1 *piecep )
+ ub2 csid
+ ub1 csfrm );
+
+
+Comments
+Writes a buffer into a LOB as specified. If LOB data already exists
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback
+function will be invoked to get the next piece after a piece is written to
+the pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWrite() returns the
+OCI_NEED_DATA error code. The application must all OCILobWrite() again
+to write more pieces of the LOB. In this mode, the buffer pointer and the
+length can be different in each call if the pieces are of different sizes and
+from different locations. A piece value of OCI_LAST_PIECE terminates the
+piecewise write.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB.
+offset (IN) - On input, it is the absolute offset, for character LOBs in
+the number of characters from the beginning of the LOB, for binary LOBs it
+is the number of bytes. Starts at 1.
+bufp (IN) - the pointer to a buffer from which the piece will be written. The
+length of the allocated memory is assumed to be the value passed in bufl.
+Even if the data is being written in pieces, bufp must contain the first
+piece of the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a
+single piece.
+The following other values are also possible for piecewise or callback mode:
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be
+written. On output, returns the actual number of bytes or characters written.
+If the data is written in pieces, *amtp will contain the total length of the
+pieces written at the end of the call (last piece written) and is undefined in
+between.
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in
+a piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue.
+If any other error code is returned, the LOB write is aborted. The
+callback takes the following parameters:
+ ctxp (IN) - the context for the call back function. Can be NULL.
+ bufp (IN/OUT) - a buffer pointer for the piece.
+ lenp (IN/OUT) - the length of the buffer (in octets) and the length of
+ current piece in bufp (out octets).
+ piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+OCILobWriteAppend()
+
+Name
+OCI Lob Write Append
+
+Purpose
+Writes data to the end of a LOB value. This call provides the ability
+to get the length of the data and append it to the end of the LOB in
+a single round trip to the server.
+
+Syntax
+sword OCILobWriteAppend ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *amtp,
+ dvoid *bufp,
+ ub4 buflen,
+ ub1 piece,
+ dvoid *ctxp,
+ OCICallbackLobWrite (cbfp)
+ (
+ dvoid *ctxp,
+ dvoid *bufp,
+ ub4 *lenp,
+ ub1 *piecep )
+ ub2 csid
+ ub1 csfrm );
+
+
+Comments
+Writes a buffer to the end of a LOB as specified. If LOB data already exists
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback
+function will be invoked to get the next piece after a piece is written to the
+pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWriteAppend() returns the
+OCI_NEED_DATA error code. The application must all OCILobWriteAppend() again
+to write more pieces of the LOB. In this mode, the buffer pointer and the
+length can be different in each call if the pieces are of different sizes and
+from different locations. A piece value of OCI_LAST_PIECE terminates the
+piecewise write.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB.
+bufp (IN) - the pointer to a buffer from which the piece will be written. The
+length of the allocated memory is assumed to be the value passed in bufl. Even
+if the data is being written in pieces, bufp must contain the first piece of
+the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a
+single piece.
+The following other values are also possible for piecewise or callback mode:
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be
+written. On output, returns the actual number of bytes or characters written.
+If the data is written in pieces, *amtp will contain the total length of the
+pieces written at the end of the call (last piece written) and is undefined in
+between.
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in a
+piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue.
+If any other error code is returned, the LOB write is aborted. The
+callback takes the following parameters:
+ ctxp (IN) - the context for the call back function. Can be NULL.
+ bufp (IN/OUT) - a buffer pointer for the piece.
+ lenp (IN/OUT) - the length of the buffer (in octets) and the length of
+ current piece in bufp (out octets).
+ piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+
+
+
+OCILobGetStorageLimit()
+
+Name
+OCI Lob Get Storage Limit
+
+Purpose
+To get the maximum Length of a LOB in bytes that can be stored in the database.
+
+Syntax
+sword OCILobGetStorageLimit ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ oraub8 *limitp);
+
+
+Comments
+With unlimited size LOB support the limit for a LOB is no longer restricted to 4GB.
+This interface should be used to get the actual limit for storing data for a specific
+LOB locator. Note that if the compatibality is set to 9.2 or older the limit would still
+be 4GB.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB.
+limitp (OUT) - The storage limit for a LOB in bytes.
+Related Functions
+
+
+
+
+OCILogoff()
+Name
+OCI simplified Logoff
+Purpose
+This function is used to terminate a session created with OCILogon() or
+OCILogon2().
+Syntax
+sword OCILogoff ( OCISvcCtx *svchp
+ OCIError *errhp );
+Comments
+This call is used to terminate a session which was created with OCILogon() or
+OCILogon2().
+This call implicitly deallocates the server, authentication, and service
+context handles.
+Note: For more information on logging on and off in an application,
+refer to the section "Application Initialization, Connection, and
+Authorization" on page 2-16.
+Parameters
+svchp (IN) - the service context handle which was used in the call to
+OCILogon() or OCILogon2().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+See Also
+OCILogon(), OCILogon2().
+
+
+
+
+
+
+OCILogon()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a simple logon session.
+Syntax
+sword OCILogon ( OCIEnv *envhp,
+ OCIError *errhp,
+ OCISvcCtx *svchp,
+ CONST OraText *username,
+ ub4 uname_len,
+ CONST OraText *password,
+ ub4 passwd_len,
+ CONST OraText *dbname,
+ ub4 dbname_len );
+Comments
+This function is used to create a simple logon session for an application.
+Note: Users requiring more complex session (e.g., TP monitor
+applications) should refer to the section "Application Initialization,
+Connection, and Authorization" on page 2-16.
+This call allocates the error and service context handles which are passed to
+it. This call also implicitly allocates server and authentication handles
+associated with the session. These handles can be retrieved by calling
+OCIAttrGet() on the service context handle.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+See Also
+OCILogoff()
+
+
+
+
+
+OCILogon2()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a logon session in connection pooling mode.
+Syntax
+sword OCILogon2 ( OCIEnv *envhp,
+ OCIError *errhp,
+ OCISvcCtx **svchp,
+ CONST OraText *username,
+ ub4 uname_len,
+ CONST OraText *password,
+ ub4 passwd_len,
+ CONST OraText *dbname,
+ ub4 dbname_len,
+ ub4 mode);
+Comments
+This function is used to create a simple logon session for an application in
+Connection Pooling mode. The valid values for mode are currently OCI_POOL and
+OCI_DEFAULT. Call to this function with OCI_DEFAULT mode is equivalent to
+OCILogon() call.
+This call allocates the error and service context handles which are passed to
+it. This call also implicitly allocates server and authentication handles
+associated with the session. These handles can be retrieved by calling
+OCIAttrGet() on the service context handle. This call assumes that
+OCIConnectionPoolCreate() has already been called for the same dbname.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password. If this is null, it is assumed that a
+ proxy session has to be created and the required grants on
+ the database are already done.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+mode (IN) - the mode for doing the server attach. Should be OCI_POOL for
+ using Connection Pooling.
+
+
+See Also
+OCILogoff()
+
+
+
+
+
+OCIMemoryFree()
+Name
+OCI FREE Memory
+Purpose
+Frees up storage associated with the pointer.
+Syntax
+void OCIMemoryFree ( CONST OCIStmt *stmhp,
+ dvoid *memptr);
+Comments
+Frees up dynamically allocated data pointers associated with the pointer using
+either the default memory free function or the registered memory free
+function, as the case may be.
+A user-defined memory free function can be registered during the initial call
+to OCIInitialize().
+This call is always successful.
+Parameters
+stmhp (IN) - statement handle which returned this data buffer.
+memptr (IN) - pointer to data allocated by the client library.
+Related Functions
+OCIInitialize()
+
+
+
+
+
+OCIParamGet()
+Name
+OCI Get PARaMeter
+Purpose
+Returns a descriptor of a parameter specified by position in the describe
+handle or statement handle.
+Syntax
+sword OCIParamGet ( CONST dvoid *hndlp,
+ ub4 htype,
+ OCIError *errhp,
+ dvoid **parmdpp,
+ ub4 pos );
+Comments
+This call returns a descriptor of a parameter specified by position in the
+describe handle or statement handle. Parameter descriptors are always
+allocated internally by the OCI library. They are read-only.
+OCI_NO_DATA may be returned if there are no parameter descriptors for this
+position.
+See Appendix B for more detailed information about parameter descriptor
+attributes.
+Parameters
+hndlp (IN) - a statement handle or describe handle. The OCIParamGet()
+function will return a parameter descriptor for this handle.
+htype (IN) - the type of the handle passed in the handle parameter. Valid
+types are OCI_HTYPE_DESCRIBE, for a describe handle OCI_HTYPE_STMT, for a
+statement handle
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+parmdpp (OUT) - a descriptor of the parameter at the position given in the pos
+parameter.
+pos (IN) - position number in the statement handle or describe handle. A
+parameter descriptor will be returned for this position.
+Note: OCI_NO_DATA may be returned if there are no parameter
+descriptors for this position.
+Related Functions
+OCIAttrGet(), OCIAttrSet()
+
+
+
+
+
+OCIParamSet()
+Name
+OCI Parameter Set in handle
+Purpose
+Used to set a complex object retrieval descriptor into a complex object
+retrieval handle.
+Syntax
+sword OCIParamGet ( dvoid *hndlp,
+ ub4 htyp,
+ OCIError *errhp,
+ CONST dvoid *dscp,
+ ub4 dtyp,
+ ub4 pos );
+Comments
+This call sets a given complex object retrieval descriptor into a complex
+object retrieval handle.
+The handle must have been previously allocated using OCIHandleAlloc(), and
+the descriptor must have been previously allocated using OCIDescAlloc().
+Attributes of the descriptor are set using OCIAttrSet().
+Parameters
+hndlp (IN/OUT) - handle pointer.
+htype (IN) - handle type.
+errhp (IN/OUT) - error handle.
+dscp (IN) - complex object retrieval descriptor pointer.
+dtyp (IN) -
+pos (IN) - position number.
+See Also
+
+
+
+
+
+OCIPasswordChange()
+Name
+OCI Change PassWord
+Purpose
+This call allows the password of an account to be changed.
+Syntax
+sword OCIPasswordChange ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ CONST OraText *user_name,
+ ub4 usernm_len,
+ CONST OraText *opasswd,
+ ub4 opasswd_len,
+ CONST OraText *npasswd,
+ sb4 npasswd_len,
+ ub4 mode);
+Comments
+This call allows the password of an account to be changed. This call is
+similar to OCISessionBegin() with the following differences:
+If the user authentication is already established, it authenticates
+the account using the old password and then changes the
+password to the new password
+If the user authentication is not established, it establishes a user
+authentication and authenticates the account using the old
+password, then changes the password to the new password.
+This call is useful when the password of an account is expired and
+OCISessionBegin() returns an error or warning which indicates that the
+password has expired.
+Parameters
+svchp (IN/OUT) - a handle to a service context. The service context handle
+must be initialized and have a server context handle associated with it.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+user_name (IN) - specifies the user name. It points to a character string,
+whose length is specified in usernm_len. This parameter must be NULL if the
+service context has been initialized with an authentication handle.
+usernm_len (IN) - the length of the user name string specified in user_name.
+For a valid user name string, usernm_len must be non-zero.
+opasswd (IN) - specifies the user's old password. It points to a character
+string, whose length is specified in opasswd_len .
+opasswd_len (IN) - the length of the old password string specified in opasswd.
+For a valid password string, opasswd_len must be non-zero.
+npasswd (IN) - specifies the user's new password. It points to a character
+string, whose length is specified in npasswd_len which must be non-zero for a
+valid password string. If the password complexity verification routine is
+specified in the user's profile to verify the new password's complexity, the
+new password must meet the complexity requirements of the verification
+function.
+npasswd_len (IN) - then length of the new password string specified in
+npasswd. For a valid password string, npasswd_len must be non-zero.
+mode - pass as OCI_DEFAULT.
+Related Functions
+OCISessionBegin()
+
+
+----------------------------------OCIReset------------------------------------
+
+
+OCIReset()
+Name
+OCI Reset
+Purpose
+Resets the interrupted asynchronous operation and protocol. Must be called
+if a OCIBreak call had been issued while a non-blocking operation was in
+progress.
+Syntax
+sword OCIReset ( dvoid *hndlp,
+ OCIError *errhp);
+Comments
+This call is called in non-blocking mode ONLY. Resets the interrupted
+asynchronous operation and protocol. Must be called if a OCIBreak call
+had been issued while a non-blocking operation was in progress.
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+
+
+OCIResultSetToStmt()
+Name
+OCI convert Result Set to Statement Handle
+Purpose
+Converts a descriptor to statement handle for fetching rows.
+Syntax
+sword OCIResultSetToStmt ( OCIResult *rsetdp,
+ OCIError *errhp );
+Comments
+Converts a descriptor to statement handle for fetching rows.
+A result set descriptor can be allocated with a call to OCIDescAlloc().
+Parameters
+rsetdp (IN/OUT) - a result set descriptor pointer.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+OCIDescAlloc()
+
+
+
+
+OCIServerAttach()
+Name
+OCI ATtaCH to server
+Purpose
+Creates an access path to a data source for OCI operations.
+Syntax
+sword OCIServerAttach ( OCIServer *srvhp,
+ OCIError *errhp,
+ CONST OraText *dblink,
+ sb4 dblink_len,
+ ub4 mode);
+Comments
+This call is used to create an association between an OCI application and a
+particular server.
+This call initializes a server context handle, which must have been previously
+allocated with a call to OCIHandleAlloc().
+The server context handle initialized by this call can be associated with a
+service context through a call to OCIAttrSet(). Once that association has been
+made, OCI operations can be performed against the server.
+If an application is operating against multiple servers, multiple server
+context handles can be maintained. OCI operations are performed against
+whichever server context is currently associated with the service context.
+Parameters
+srvhp (IN/OUT) - an uninitialized server context handle, which gets
+initialized by this call. Passing in an initialized server handle causes an
+error.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+dblink (IN) - specifies the database (server) to use. This parameter points to
+a character string which specifies a connect string or a service point. If the
+connect string is NULL, then this call attaches to the default host. The length
+of connstr is specified in connstr_len. The connstr pointer may be freed by the
+caller on return.
+dblink_len (IN) - the length of the string pointed to by connstr. For a valid
+connect string name or alias, connstr_len must be non-zero.
+mode (IN) - specifies the various modes of operation. For release 8.0, pass as
+OCI_DEFAULT - in this mode, calls made to the server on this server context
+are made in blocking mode.
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing
+the use of OCIServerAttach().
+Related Functions
+OCIServerDetach()
+
+
+
+OCIServerDetach()
+Name
+OCI DeTaCH server
+Purpose
+Deletes an access to a data source for OCI operations.
+Syntax
+sword OCIServerDetach ( OCIServer *svrhp,
+ OCIError *errhp,
+ ub4 mode);
+Comments
+This call deletes an access to data source for OCI operations, which was
+established by a call to OCIServerAttach().
+Parameters
+srvhp (IN) - a handle to an initialized server context, which gets reset to
+uninitialized state. The handle is not de-allocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+mode (IN) - specifies the various modes of operation. The only valid mode is
+OCI_DEFAULT for the default mode.
+Related Functions
+OCIServerAttach()
+
+
+
+OCIServerVersion()
+Name
+OCI VERSion
+Purpose
+Returns the version string of the Oracle server.
+Syntax
+sword OCIServerVersion ( dvoid *hndlp,
+ OCIError *errhp,
+ OraText *bufp,
+ ub4 bufsz
+ ub1 hndltype );
+Comments
+This call returns the version string of the Oracle server.
+For example, the following might be returned as the version string if your
+application is running against a 7.3.2 server:
+Oracle7 Server Release 7.3.2.0.0 - Production Release
+PL/SQL Release 2.3.2.0.0 - Production
+CORE Version 3.5.2.0.0 - Production
+TNS for SEQUENT DYNIX/ptx: Version 2.3.2.0.0 - Production
+NLSRTL Version 3.2.2.0.0 - Production
+
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+bufp (IN) - the buffer in which the version information is returned.
+bufsz (IN) - the length of the buffer.
+hndltype (IN) - the type of handle passed to the function.
+Related Functions
+
+
+
+
+
+OCISessionBegin()
+Name
+OCI Session Begin and authenticate user
+Purpose
+Creates a user authentication and begins a user session for a given server.
+Syntax
+sword OCISessionBegin ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCISession *usrhp,
+ ub4 credt,
+ ub4 mode);
+
+Comments
+For Oracle8, OCISessionBegin() must be called for any given server handle
+before requests can be made against it. Also, OCISessionBegin() only supports
+authenticating the user for access to the Oracle server specified by the
+server handle in the service context. In other words, after OCIServerAttach()
+is called to initialize a server handle, OCISessionBegin() must be called to
+authenticate the user for that given server.
+When OCISessionBegin() is called for the first time for the given server
+handle, the initialized authentication handle is called a primary
+authentication context. A primary authentication context may not be created
+with the OCI_MIGRATE mode. Also, only one primary authentication context can
+be created for a given server handle and the primary authentication context c
+an only ever be used with that server handle. If the primary authentication
+context is set in a service handle with a different server handle, then an
+error will result.
+After OCISessionBegin() has been called for the server handle, and the primary
+authentication context is set in the service handle, OCISessionBegin() may be
+called again to initialize another authentication handle with different (or
+the same) credentials. When OCISessionBegin() is called with a service handle
+set with a primary authentication context, the returned authentication context
+in authp is called a user authentication context. As many user authentication
+contexts may be initialized as desired.
+User authentication contexts may be created with the OCI_MIGRATE mode.
+If the OCI_MIGRATE mode is not specified, then the user authentication
+context can only ever be used with the same server handle set in svchp. If
+OCI_MIGRATE mode is specified, then the user authentication may be set
+with different server handles. However, the user authentication context is
+restricted to use with only server handles which resolve to the same database
+instance and that have equivalent primary authentication contexts. Equivalent
+authentication contexts are those which were authenticated as the same
+database user.
+OCI_SYSDBA, OCI_SYSOPER, and OCI_PRELIM_AUTH may only be used
+with a primary authentication context.
+To provide credentials for a call to OCISessionBegin(), one of two methods are
+supported. The first is to provide a valid username and password pair for
+database authentication in the user authentication handle passed to
+OCISessionBegin(). This involves using OCIAttrSet() to set the
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD attributes on the
+authentication handle. Then OCISessionBegin() is called with
+OCI_CRED_RDBMS.
+Note: When the authentication handle is terminated using
+OCISessionEnd(), the username and password attributes remain
+unchanged and thus can be re-used in a future call to OCISessionBegin().
+Otherwise, they must be reset to new values before the next
+OCISessionBegin() call.
+The second type of credentials supported are external credentials. No
+attributes need to be set on the authentication handle before calling
+OCISessionBegin(). The credential type is OCI_CRED_EXT. This is equivalent
+to the Oracle7 `connect /' syntax. If values have been set for
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD, then these are
+ignored if OCI_CRED_EXT is used.
+Parameters
+svchp (IN) - a handle to a service context. There must be a valid server
+handle set in svchp.
+errhp (IN) - an error handle to the retrieve diagnostic information.
+usrhp (IN/OUT) - a handle to an authentication context, which is initialized
+by this call.
+credt (IN) - specifies the type of credentials to use for authentication.
+Valid values for credt are:
+OCI_CRED_RDBMS - authenticate using a database username and
+password pair as credentials. The attributes OCI_ATTR_USERNAME
+and OCI_ATTR_PASSWORD should be set on the authentication
+context before this call.
+OCI_CRED_EXT - authenticate using external credentials. No username
+or password is provided.
+mode (IN) - specifies the various modes of operation. Valid modes are:
+OCI_DEFAULT - in this mode, the authentication context returned may
+only ever be set with the same server context specified in svchp. This
+establishes the primary authentication context.
+OCI_MIGRATE - in this mode, the new authentication context may be
+set in a service handle with a different server handle. This mode
+establishes the user authentication context.
+OCI_SYSDBA - in this mode, the user is authenticated for SYSDBA
+access.
+OCI_SYSOPER - in this mode, the user is authenticated for SYSOPER
+access.
+OCI_PRELIM_AUTH - this mode may only be used with OCI_SYSDBA
+or OCI_SYSOPER to authenticate for certain administration tasks.
+Related Functions
+OCISessionEnd()
+
+
+
+
+
+
+OCISessionEnd()
+Name
+OCI Terminate user Authentication Context
+Purpose
+Terminates a user authentication context created by OCISessionBegin()
+Syntax
+sword OCISessionEnd ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCISession *usrhp,
+ ub4 mode);
+
+Comments
+The user security context associated with the service context is invalidated
+by this call. Storage for the authentication context is not freed. The
+transaction specified by the service context is implicitly committed. The
+transaction handle, if explicitly allocated, may be freed if not being used.
+Resources allocated on the server for this user are freed.
+The authentication handle may be reused in a new call to OCISessionBegin().
+Parameters
+svchp (IN/OUT) - the service context handle. There must be a valid server
+handle and user authentication handle associated with svchp.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+usrhp (IN) - de-authenticate this user. If this parameter is passed as NULL,
+the user in the service context handle is de-authenticated.
+mode (IN) - the only valid mode is OCI_DEFAULT.
+Example
+In this example, an authentication context is destroyed.
+Related Functions
+OCISessionBegin()
+
+
+
+
+OCIStmtExecute()
+Name
+OCI EXECute
+Purpose
+This call associates an application request with a server.
+Syntax
+sword OCIStmtExecute ( OCISvcCtx *svchp,
+ OCIStmt *stmtp,
+ OCIError *errhp,
+ ub4 iters,
+ ub4 rowoff,
+ CONST OCISnapshot *snap_in,
+ OCISnapshot *snap_out,
+ ub4 mode );
+Comments
+This function is used to execute a prepared SQL statement.
+Using an execute call, the application associates a request with a server. On
+success, OCI_SUCCESS is returned.
+If a SELECT statement is executed, the description of the select list follows
+implicitly as a response. This description is buffered on the client side for
+describes, fetches and define type conversions. Hence it is optimal to
+describe a select list only after an execute.
+Also for SELECT statements, some results are available implicitly. Rows will
+be received and buffered at the end of the execute. For queries with small row
+count, a prefetch causes memory to be released in the server if the end of
+fetch is reached, an optimization that may result in memory usage reduction.
+Set attribute call has been defined to set the number of rows to be prefetched
+per result set.
+For SELECT statements, at the end of the execute, the statement handle
+implicitly maintains a reference to the service context on which it is
+executed. It is the user's responsibility to maintain the integrity of the
+service context. If the attributes of a service context is changed for
+executing some operations on this service context, the service context must
+be restored to have the same attributes, that a statement was executed with,
+prior to a fetch on the statement handle. The implicit reference is maintained
+until the statement handle is freed or the fetch is cancelled or an end of
+fetch condition is reached.
+Note: If output variables are defined for a SELECT statement before a
+call to OCIStmtExecute(), the number of rows specified by iters will be
+fetched directly into the defined output buffers and additional rows
+equivalent to the prefetch count will be prefetched. If there are no
+additional rows, then the fetch is complete without calling
+OCIStmtFetch().
+The execute call will return errors if the statement has bind data types that
+are not supported in an Oracle7 server.
+Parameters
+svchp (IN/OUT) - service context handle.
+stmtp (IN/OUT) - an statement handle - defines the statement and the
+associated data to be executed at the server. It is invalid to pass in a
+statement handle that has bind of data types only supported in release 8.0
+when srvchp points to an Oracle7 server.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error. If the statement is being
+batched and it is successful, then this handle will contain this particular
+statement execution specific errors returned from the server when the batch is
+flushed.
+iters (IN) - the number of times this statement is executed for non-Select
+statements. For Select statements, if iters is non-zero, then defines must
+have been done for the statement handle. The execution fetches iters rows into
+these predefined buffers and prefetches more rows depending upon the prefetch
+row count. This function returns an error if iters=0 for non-SELECT
+statements.
+rowoff (IN) - the index from which the data in an array bind is relevant for
+this multiple row execution.
+snap_in (IN) - this parameter is optional. if supplied, must point to a
+snapshot descriptor of type OCI_DTYPE_SNAP. The contents of this descriptor
+must be obtained from the snap_out parameter of a previous call. The
+descriptor is ignored if the SQL is not a SELECT. This facility allows
+multiple service contexts to ORACLE to see the same consistent snapshot of the
+database's committed data. However, uncommitted data in one context is not
+visible to another context even using the same snapshot.
+snap_out (OUT) - this parameter optional. if supplied, must point to a
+descriptor of type OCI_DTYPE_SNAP. This descriptor is filled in with an
+opaque representation which is the current ORACLE "system change
+number" suitable as a snap_in input to a subsequent call to OCIStmtExecute().
+This descriptor should not be used any longer than necessary in order to avoid
+"snapshot too old" errors.
+mode (IN) - The modes are:
+If OCI_DEFAULT_MODE, the default mode, is selected, the request is
+immediately executed. Error handle contains diagnostics on error if any.
+OCI_EXACT_FETCH - if the statement is a SQL SELECT, this mode is
+only valid if the application has set the prefetch row count prior to this
+call. In this mode, the OCI library will get up to the number of rows
+specified (i.e., prefetch row count plus iters). If the number of rows
+returned by the query is greater than this value, OCI_ERROR will be
+returned with ORA-01422 as the implementation specific error in a
+diagnostic record. If the number of rows returned by the query is
+smaller than the prefetch row count, OCI_SUCCESS_WITH_INFO will
+be returned with ORA-01403 as the implementation specific error. The
+prefetch buffer size is ignored and the OCI library tries to allocate all the
+space required to contain the prefetched rows. The exact fetch semantics
+apply to only the top level rows. No more rows can be fetched for this
+query at the end of the call.
+OCI_KEEP_FETCH_STATE - the result set rows (not yet fetched) of this
+statement executed in this transaction will be maintained when the
+transaction is detached for migration. By default, a query is cancelled
+when a transaction is detached for migration. This mode is the default
+mode when connected to a V7 server.
+Related Functions
+OCIStmtPrepare()
+
+
+
+
+
+OCIStmtFetch()
+Name
+OCI FetCH
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch ( OCIStmt *stmtp,
+ OCIError *errhp,
+ ub4 nrows,
+ ub2 orientation,
+ ub4 mode);
+Comments
+The fetch call is a local call, if prefetched rows suffice. However, this is
+transparent to the application. If LOB columns are being read, LOB locators
+are fetched for subsequent LOB operations to be performed on these locators.
+Prefetching is turned off if LONG columns are involved.
+A fetch with nrows set to 0 rows effectively cancels the fetch for this
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+orientation (IN) - for release 8.0, the only acceptable value is
+OCI_FETCH_NEXT, which is also the default value.
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set.
+If nrows is non-zero, setting this mode effectively cancels fetching after
+retrieving nrows, otherwise it cancels fetching immediately.
+Related Functions
+OCIAttrGet()
+
+OCIStmtFetch2()
+Name
+OCI FetCH2
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch2 ( OCIStmt *stmtp,
+ OCIError *errhp,
+ ub4 nrows,
+ ub2 orientation,
+ ub4 scrollOffset,
+ ub4 mode);
+Comments
+The fetch call works similar to the OCIStmtFetch call with the
+addition of the fetchOffset parameter. It can be used on any
+statement handle, whether it is scrollable or not. For a
+non-scrollable statement handle, the only acceptable value
+will be OCI_FETCH_NEXT, and the fetchOffset parameter will be
+ignored. Applications are encouraged to use this new call.
+
+A fetchOffset with OCI_FETCH_RELATIVE is equivalent to
+OCI_FETCH_CURRENT with a value of 0, is equivalent to
+OCI_FETCH_NEXT with a value of 1, and equivalent to
+OCI_FETCH_PRIOR with a value of -1. Note that the range of
+accessible rows is [1,OCI_ATTR_ROW_COUNT] beyond which an
+error could be raised if sufficient rows do not exist in
+
+The fetch call is a local call, if prefetched rows suffice. However, this is
+transparent to the application. If LOB columns are being read, LOB locators
+are fetched for subsequent LOB operations to be performed on these locators.
+Prefetching is turned off if LONG columns are involved.
+A fetch with nrows set to 0 rows effectively cancels the fetch for this
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+It defaults to 1 for orientation OCI_FETCH_LAST.
+orientation (IN) - The acceptable values are as follows, with
+OCI_FETCH_NEXT being the default value.
+OCI_FETCH_CURRENT gets the current row,
+OCI_FETCH_NEXT gets the next row from the current position,
+OCI_FETCH_FIRST gets the first row in the result set,
+OCI_FETCH_LAST gets the last row in the result set,
+OCI_FETCH_PRIOR gets the previous row from the current row in the result set,
+OCI_FETCH_ABSOLUTE will fetch the row number (specified by fetchOffset
+parameter) in the result set using absolute positioning,
+OCI_FETCH_RELATIVE will fetch the row number (specified by fetchOffset
+parameter) in the result set using relative positioning.
+scrollOffset(IN) - offset used with the OCI_FETCH_ABSOLUTE and
+OCI_FETCH_RELATIVE orientation parameters only. It specify
+the new current position for scrollable result set. It is
+ignored for non-scrollable result sets.
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set.
+If nrows is non-zero, setting this mode effectively cancels fetching after
+retrieving nrows, otherwise it cancels fetching immediately.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIStmtGetPieceInfo()
+Name
+OCI Get Piece Information
+Purpose
+Returns piece information for a piecewise operation.
+Syntax
+sword OCIStmtGetPieceInfo( CONST OCIStmt *stmtp,
+ OCIError *errhp,
+ dvoid **hndlpp,
+ ub4 *typep,
+ ub1 *in_outp,
+ ub4 *iterp,
+ ub4 *idxp,
+ ub1 *piecep );
+
+Comments
+When an execute/fetch call returns OCI_NEED_DATA to get/return a
+dynamic bind/define value or piece, OCIStmtGetPieceInfo() returns the
+relevant information: bind/define handle, iteration or index number and
+which piece.
+See the section "Runtime Data Allocation and Piecewise Operations" on page
+5-16 for more information about using OCIStmtGetPieceInfo().
+Parameters
+stmtp (IN) - the statement when executed returned OCI_NEED_DATA.
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+hndlpp (OUT) - returns a pointer to the bind or define handle of the bind or
+define whose runtime data is required or is being provided.
+typep (OUT) - the type of the handle pointed to by hndlpp: OCI_HTYPE_BIND
+(for a bind handle) or OCI_HTYPE_DEFINE (for a define handle).
+in_outp (OUT) - returns OCI_PARAM_IN if the data is required for an IN bind
+value. Returns OCI_PARAM_OUT if the data is available as an OUT bind
+variable or a define position value.
+iterp (OUT) - returns the row number of a multiple row operation.
+idxp (OUT) - the index of an array element of a PL/SQL array bind operation.
+piecep (OUT) - returns one of the following defined values -
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE and
+OCI_LAST_PIECE. The default value is always OCI_ONE_PIECE.
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(),
+OCIStmtSetPieceInfo()
+
+
+
+
+OCIStmtPrepare()
+Name
+OCI Statement REQuest
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare ( OCIStmt *stmtp,
+ OCIError *errhp,
+ CONST OraText *stmt,
+ ub4 stmt_len,
+ ub4 language,
+ ub4 mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The
+OCIStmtPrepare() call defines an application request.
+This is a purely local call. Data values for this statement initialized in
+subsequent bind calls will be stored in a bind handle which will hang off this
+statement handle.
+This call does not create an association between this statement handle and any
+particular server.
+See the section "Preparing Statements" on page 2-21 for more information
+about using this call.
+Parameters
+stmtp (IN) - a statement handle.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-terminated
+string. The pointer to the OraText of the statement must be available as long
+as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server.
+mode (IN) - the only defined mode is OCI_DEFAULT for default mode.
+Example
+This example demonstrates the use of OCIStmtPrepare(), as well as the OCI
+application initialization calls.
+Related Functions
+OCIAttrGet(), OCIStmtExecute()
+
+
+OCIStmtPrepare2()
+Name
+OCI Statement REQuest with (a) early binding to svchp and/or
+(b) stmt caching
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare2 ( OCISvcCtx *svchp,
+ OCIStmt **stmtp,
+ OCIError *errhp,
+ CONST OraText *stmt,
+ ub4 stmt_len,
+ CONST OraText *key,
+ ub4 key_len,
+ ub4 language,
+ ub4 mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The
+OCIStmtPrepare() call defines an application request.
+This is a purely local call. Data values for this statement initialized in
+subsequent bind calls will be stored in a bind handle which will hang off this
+statement handle.
+This call creates an association between the statement handle and a service
+context. It differs from OCIStmtPrepare in that respect.It also supports
+stmt caching. The stmt will automatically be cached if the authp of the stmt
+has enabled stmt caching.
+Parameters
+svchp (IN) - the service context handle that contains the session that
+ this stmt handle belongs to.
+stmtp (OUT) - an unallocated stmt handle must be pased in. An allocated
+ and prepared statement handle will be returned.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-
+ terminated string. The pointer to the OraText of the statement
+ must be available as long as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+ key to search with. It thus optimizes the search in the cache.
+key_len (IN) - the length of the key. This, too, is onlly valid for stmt
+ caching.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server.
+mode (IN) - the defined modes are OCI_DEFAULT and OCI_PREP2_CACHE_SEARCHONLY.
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtRelease()
+
+
+OCIStmtRelease()
+Name
+OCI Statement Release. This call is used to relesae the stmt that
+was retreived using OCIStmtPrepare2(). If the stmt is release
+using this call, OCIHandleFree() must not be called on the stmt
+handle.
+Purpose
+This call releases the statement obtained by OCIStmtPrepare2
+Syntax
+sword OCIStmtRelease ( OCIStmt *stmtp,
+ OCIError *errhp,
+ cONST OraText *key,
+ ub4 key_len,
+ ub4 mode);
+Comments
+This call is used to release a handle obtained via OCIStmtPrepare2().
+It also frees the memory associated with the handle.
+This is a purely local call.
+Parameters
+stmtp (IN/OUT) - The statement handle to be released/freed.
+errhp (IN) - an error handle to retrieve diagnostic information.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+ key to tag the stmt with.
+key_len (IN) - the length of the key. This, too, is only valid for stmt
+ caching.
+mode (IN) - the defined modes are OCI_DEFAULT for default mode and
+ OCI_STRLS_CACHE_DELETE (only used for Stmt Caching).
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtPrepare2()
+
+
+OCIStmtSetPieceInfo()
+Name
+OCI Set Piece Information
+Purpose
+Sets piece information for a piecewise operation.
+Syntax
+sword OCIStmtSetPieceInfo ( dvoid *hndlp,
+ ub4 type,
+ OCIError *errhp,
+ CONST dvoid *bufp,
+ ub4 *alenp,
+ ub1 piece,
+ CONST dvoid *indp,
+ ub2 *rcodep );
+Comments
+When an execute call returns OCI_NEED_DATA to get a dynamic IN/OUT
+bind value or piece, OCIStmtSetPieceInfo() sets the piece information: the
+buffer, the length, the indicator and which piece is currently being processed.
+For more information about using OCIStmtSetPieceInfo() see the section
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+hndlp (IN/OUT) - the bind/define handle.
+type (IN) - type of the handle.
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+bufp (IN/OUT) - bufp is a pointer to a storage containing the data value or
+the piece when it is an IN bind variable, otherwise bufp is a pointer to
+storage for getting a piece or a value for OUT binds and define variables. For
+named data types or REFs, a pointer to the object or REF is returned.
+alenp (IN/OUT) - the length of the piece or the value.
+piece (IN) - the piece parameter. The following are valid values:
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE, or
+OCI_LAST_PIECE.
+The default value is OCI_ONE_PIECE. This parameter is used for IN bind
+variables only.
+indp (IN/OUT) - indicator. A pointer to a sb2 value or pointer to an indicator
+structure for named data types (SQLT_NTY) and REFs (SQLT_REF), i.e., *indp
+is either an sb2 or a dvoid * depending upon the data type.
+rcodep (IN/OUT) - return code.
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(),
+OCIStmtGetPieceInfo()
+
+
+OCIFormatInit
+Name
+OCIFormat Package Initialize
+Purpose
+Initializes the OCIFormat package.
+Syntax
+sword OCIFormatInit(dvoid *hndl, OCIError *err);
+Comments
+This routine must be called before calling any other OCIFormat routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatTerm()
+
+
+OCIFormatString
+Name
+OCIFormat Package Format String
+Purpose
+Writes a text string into the supplied text buffer using the argument
+list submitted to it and in accordance with the format string given.
+Syntax
+sword OCIFormatString(dvoid *hndl, OCIError *err, OraText *buffer,
+ sbig_ora bufferLength, sbig_ora *returnLength,
+ CONST OraText *formatString, ...);
+Comments
+The first call to this routine must be preceded by a call to the
+OCIFormatInit routine that initializes the OCIFormat package
+for use. When this routine is no longer needed then terminate
+the OCIFormat package by a call to the OCIFormatTerm routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+buffer (OUT) - text buffer for the string
+bufferLength (IN) - length of the text buffer
+returnLength (OUT) - length of the formatted string
+formatString (IN) - format specification string
+... (IN) - variable argument list
+Related Functions
+
+
+OCIFormatTerm
+Name
+OCIFormat Package Terminate
+Purpose
+Terminates the OCIFormat package.
+Syntax
+sword OCIFormatTerm(dvoid *hndl, OCIError *err);
+Comments
+It must be called after the OCIFormat package is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatInit()
+
+
+OCIFormatTUb1
+Name
+OCIFormat Package ub1 Type
+Purpose
+Return the type value for the ub1 type.
+Syntax
+sword OCIFormatTUb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb2
+Name
+OCIFormat Package ub2 Type
+Purpose
+Return the type value for the ub2 type.
+Syntax
+sword OCIFormatTUb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb4
+Name
+OCIFormat Package ub4 Type
+Purpose
+Return the type value for the ub4 type.
+Syntax
+sword OCIFormatTUb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUword
+Name
+OCIFormat Package uword Type
+Purpose
+Return the type value for the uword type.
+Syntax
+sword OCIFormatTUword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUbig_ora
+Name
+OCIFormat Package ubig_ora Type
+Purpose
+Return the type value for the ubig_ora type.
+Syntax
+sword OCIFormatTUbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb1
+Name
+OCIFormat Package sb1 Type
+Purpose
+Return the type value for the sb1 type.
+Syntax
+sword OCIFormatTSb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb2
+Name
+OCIFormat Package sb2 Type
+Purpose
+Return the type value for the sb2 type.
+Syntax
+sword OCIFormatTSb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb4
+Name
+OCIFormat Package sb4 Type
+Purpose
+Return the type value for the sb4 type.
+Syntax
+sword OCIFormatTSb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSword
+Name
+OCIFormat Package sword Type
+Purpose
+Return the type value for the sword type.
+Syntax
+sword OCIFormatTSword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSbig_ora
+Name
+OCIFormat Package sbig_ora Type
+Purpose
+Return the type value for the sbig_ora type.
+Syntax
+sword OCIFormatTSbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb1
+Name
+OCIFormat Package eb1 Type
+Purpose
+Return the type value for the eb1 type.
+Syntax
+sword OCIFormatTEb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb2
+Name
+OCIFormat Package eb2 Type
+Purpose
+Return the type value for the eb2 type.
+Syntax
+sword OCIFormatTEb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb4
+Name
+OCIFormat Package eb4 Type
+Purpose
+Return the type value for the eb4 type.
+Syntax
+sword OCIFormatTEb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEword
+Name
+OCIFormat Package eword Type
+Purpose
+Return the type value for the eword type.
+Syntax
+sword OCIFormatTEword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTChar
+Name
+OCIFormat Package text Type
+Purpose
+Return the type value for the text type.
+Syntax
+sword OCIFormatTChar(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTText
+Name
+OCIFormat Package *text Type
+Purpose
+Return the type value for the *text type.
+Syntax
+sword OCIFormatTText(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTDouble
+Name
+OCIFormat Package double Type
+Purpose
+Return the type value for the double type.
+Syntax
+sword OCIFormatTDouble(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatDvoid
+Name
+OCIFormat Package dvoid Type
+Purpose
+Return the type value for the dvoid type.
+Syntax
+sword OCIFormatTDvoid(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEnd
+Name
+OCIFormat Package end Type
+Purpose
+Return the list terminator's "type".
+Syntax
+sword OCIFormatTEnd(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCISvcCtxToLda()
+Name
+OCI toggle SerVice context handle to Version 7 Lda_Def
+Purpose
+Toggles between a V8 service context handle and a V7 Lda_Def.
+Syntax
+sword OCISvcCtxToLda ( OCISvcCtx *srvhp,
+ OCIError *errhp,
+ Lda_Def *ldap );
+Comments
+Toggles between an Oracle8 service context handle and an Oracle7 Lda_Def.
+This function can only be called after a service context has been properly
+initialized.
+Once the service context has been translated to an Lda_Def, it can be used in
+release 7.x OCI calls (e.g., obindps(), ofen()).
+Note: If there are multiple service contexts which share the same server
+handle, only one can be in V7 mode at any time.
+The action of this call can be reversed by passing the resulting Lda_Def to
+the OCILdaToSvcCtx() function.
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+ldap (IN/OUT) - a Logon Data Area for V7-style OCI calls which is initialized
+by this call.
+Related Functions
+OCILdaToSvcCtx()
+
+
+
+
+OCITransCommit()
+Name
+OCI TX (transaction) CoMmit
+Purpose
+Commits the transaction associated with a specified service context.
+Syntax
+sword OCITransCommit ( OCISvcCtx *srvcp,
+ OCIError *errhp,
+ ub4 flags );
+Comments
+The transaction currently associated with the service context is committed. If
+it is a distributed transaction that the server cannot commit, this call
+additionally retrieves the state of the transaction from the database to be
+returned to the user in the error handle.
+If the application has defined multiple transactions, this function operates
+on the transaction currently associated with the service context. If the
+application is working with only the implicit local transaction created when
+database changes are made, that implicit transaction is committed.
+If the application is running in the object mode, then the modified or updated
+objects in the object cache for this transaction are also committed.
+The flags parameter is used for one-phase commit optimization in distributed
+transactions. If the transaction is non-distributed, the flags parameter is
+ignored, and OCI_DEFAULT can be passed as its value. OCI applications
+managing global transactions should pass a value of
+OCI_TRANS_TWOPHASE to the flags parameter for a two-phase commit. The
+default is one-phase commit.
+Under normal circumstances, OCITransCommit() returns with a status
+indicating that the transaction has either been committed or rolled back. With
+distributed transactions, it is possible that the transaction is now in-doubt
+(i.e., neither committed nor aborted). In this case, OCITransCommit()
+attempts to retrieve the status of the transaction from the server.
+The status is returned.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags -see the "Comments" section above.
+Related Functions
+OCITransRollback()
+
+
+
+
+OCITransDetach()
+Name
+OCI TX (transaction) DeTach
+Purpose
+Detaches a transaction.
+Syntax
+sword OCITransDetach ( OCISvcCtx *srvcp,
+ OCIError *errhp,
+ ub4 flags);
+Comments
+Detaches a global transaction from the service context handle. The transaction
+currently attached to the service context handle becomes inactive at the end
+of this call. The transaction may be resumed later by calling OCITransStart(),
+specifying a flags value of OCI_TRANS_RESUME.
+When a transaction is detached, the value which was specified in the timeout
+parameter of OCITransStart() when the transaction was started is used to
+determine the amount of time the branch can remain inactive before being
+deleted by the server's PMON process.
+Note: The transaction can be resumed by a different process than the one
+that detached it, provided that the transaction has the same
+authorization.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags (IN) - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransStart()
+
+
+
+OCITransForget()
+Name
+OCI TX (transaction) ForGeT
+Purpose
+Causes the server to forget a heuristically completed global transaction.
+Syntax
+sword OCITransForget ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ ub4 flags);
+
+Comments
+
+Forgets a heuristically completed global transaction. The server deletes the
+status of the transaction from the system's pending transaction table.
+The XID of the transaction to be forgotten is set as an attribute of the
+transaction handle (OCI_ATTR_XID).
+Parameters
+srvcp (IN) - the service context handle - the transaction is rolled back.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransRollback()
+
+
+OCITransMultiPrepare()
+Name
+OCI Trans(action) Multi-Branch Prepare
+Purpose
+Prepares a transaction with multiple branches in a single call.
+Syntax
+sword OCITransMultiPrepare ( OCISvcCtx *svchp,
+ ub4 numBranches,
+ OCITrans **txns,
+ OCIError **errhp);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+This call is an advanced performance feature intended for use only in
+situations where the caller is responsible for preparing all the branches
+in a transaction.
+Parameters
+srvcp (IN) - the service context handle.
+numBranches (IN) - This is the number of branches expected. It is also the
+array size for the next two parameters.
+txns (IN) - This is the array of transaction handles for the branches to
+prepare. They should all have the OCI_ATTR_XID set. The global transaction
+ID should be the same.
+errhp (IN) - This is the array of error handles. If OCI_SUCCESS is not
+returned, then these will indicate which branches received which errors.
+Related Functions
+OCITransPrepare()
+
+
+OCITransPrepare()
+Name
+OCI TX (transaction) PREpare
+Purpose
+Prepares a transaction for commit.
+Syntax
+sword OCITransPrepare ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ ub4 flags);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+The call returns OCI_SUCCESS_WITH_INFO if the transaction has not made
+any changes. The error handle will indicate that the transaction is read-only.
+The flag parameter is not currently used.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransForget()
+
+
+
+
+OCITransRollback()
+Name
+OCI TX (transaction) RoLlback
+Purpose
+Rolls back the current transaction.
+Syntax
+sword OCITransRollback ( dvoid *svchp,
+ OCIError *errhp,
+ ub4 flags );
+Comments
+The current transaction- defined as the set of statements executed since the
+last OCITransCommit() or since OCISessionBegin()-is rolled back.
+If the application is running under object mode then the modified or updated
+objects in the object cache for this transaction are also rolled back.
+An error is returned if an attempt is made to roll back a global transaction
+that is not currently active.
+Parameters
+svchp (IN) - a service context handle. The transaction currently set in the
+service context handle is rolled back.
+errhp -(IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit()
+
+
+
+
+OCITransStart()
+Name
+OCI TX (transaction) STart
+Purpose
+Sets the beginning of a transaction.
+Syntax
+sword OCITransStart ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ uword timeout,
+ ub4 flags);
+
+Comments
+This function sets the beginning of a global or serializable transaction. The
+transaction context currently associated with the service context handle is
+initialized at the end of the call if the flags parameter specifies that a new
+transaction should be started.
+The XID of the transaction is set as an attribute of the transaction handle
+(OCI_ATTR_XID)
+Parameters
+svchp (IN/OUT) - the service context handle. The transaction context in the
+service context handle is initialized at the end of the call if the flag
+specified a new transaction to be started.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+err and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+timeout (IN) - the time, in seconds, to wait for a transaction to become
+available for resumption when OCI_TRANS_RESUME is specified. When
+OCI_TRANS_NEW is specified, this value is stored and may be used later by
+OCITransDetach().
+flags (IN) - specifies whether a new transaction is being started or an
+existing transaction is being resumed. Also specifies serializiability or
+read-only status. More than a single value can be specified. By default,
+a read/write transaction is started. The flag values are:
+OCI_TRANS_NEW - starts a new transaction branch. By default starts a
+tightly coupled and migratable branch.
+OCI_TRANS_TIGHT - explicitly specifies a tightly coupled branch
+OCI_TRANS_LOOSE - specifies a loosely coupled branch
+OCI_TRANS_RESUME - resumes an existing transaction branch.
+OCI_TRANS_READONLY - start a readonly transaction
+OCI_TRANS_SERIALIZABLE - start a serializable transaction
+Related Functions
+OCITransDetach()
+
+
+
+
+
+******************************************************************************/
+/*-----------------------Dynamic Callback Function Pointers------------------*/
+
+
+typedef sb4 (*OCICallbackInBind)(dvoid *ictxp, OCIBind *bindp, ub4 iter,
+ ub4 index, dvoid **bufpp, ub4 *alenp,
+ ub1 *piecep, dvoid **indp);
+
+typedef sb4 (*OCICallbackOutBind)(dvoid *octxp, OCIBind *bindp, ub4 iter,
+ ub4 index, dvoid **bufpp, ub4 **alenp,
+ ub1 *piecep, dvoid **indp,
+ ub2 **rcodep);
+
+typedef sb4 (*OCICallbackDefine)(dvoid *octxp, OCIDefine *defnp, ub4 iter,
+ dvoid **bufpp, ub4 **alenp, ub1 *piecep,
+ dvoid **indp, ub2 **rcodep);
+
+typedef sword (*OCIUserCallback)(dvoid *ctxp, dvoid *hndlp, ub4 type,
+ ub4 fcode, ub4 when, sword returnCode,
+ sb4 *errnop, va_list arglist);
+
+typedef sword (*OCIEnvCallbackType)(OCIEnv *env, ub4 mode,
+ size_t xtramem_sz, dvoid *usrmemp,
+ OCIUcb *ucbDesc);
+
+typedef sb4 (*OCICallbackLobRead)(dvoid *ctxp, CONST dvoid *bufp,
+ ub4 len, ub1 piece);
+
+typedef sb4 (*OCICallbackLobWrite)(dvoid *ctxp, dvoid *bufp,
+ ub4 *lenp, ub1 *piece);
+
+#ifdef ORAXB8_DEFINED
+
+typedef sb4 (*OCICallbackLobRead2)(dvoid *ctxp, CONST dvoid *bufp, oraub8 len,
+ ub1 piece, dvoid **changed_bufpp,
+ oraub8 *changed_lenp);
+
+typedef sb4 (*OCICallbackLobWrite2)(dvoid *ctxp, dvoid *bufp, oraub8 *lenp,
+ ub1 *piece, dvoid **changed_bufpp,
+ oraub8 *changed_lenp);
+#endif
+
+typedef sb4 (*OCICallbackAQEnq)(dvoid *ctxp, dvoid **payload,
+ dvoid **payload_ind);
+
+typedef sb4 (*OCICallbackAQDeq)(dvoid *ctxp, dvoid **payload,
+ dvoid **payload_ind);
+
+/*--------------------------Failover Callback Structure ---------------------*/
+typedef sb4 (*OCICallbackFailover)(dvoid *svcctx, dvoid *envctx,
+ dvoid *fo_ctx, ub4 fo_type,
+ ub4 fo_event);
+
+typedef struct
+{
+ OCICallbackFailover callback_function;
+ dvoid *fo_ctx;
+}
+OCIFocbkStruct;
+
+/*****************************************************************************
+ ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+
+sword OCIInitialize (ub4 mode, dvoid *ctxp,
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr) );
+
+sword OCITerminate( ub4 mode);
+
+sword OCIEnvCreate (OCIEnv **envp, ub4 mode, dvoid *ctxp,
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+ size_t xtramem_sz, dvoid **usrmempp);
+
+sword OCIEnvNlsCreate (OCIEnv **envp, ub4 mode, dvoid *ctxp,
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+ size_t xtramem_sz, dvoid **usrmempp,
+ ub2 charset, ub2 ncharset);
+
+sword OCIFEnvCreate (OCIEnv **envp, ub4 mode, dvoid *ctxp,
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+ size_t xtramem_sz, dvoid **usrmempp, dvoid *fupg);
+
+sword OCIHandleAlloc(CONST dvoid *parenth, dvoid **hndlpp, CONST ub4 type,
+ CONST size_t xtramem_sz, dvoid **usrmempp);
+
+sword OCIHandleFree(dvoid *hndlp, CONST ub4 type);
+
+
+sword OCIDescriptorAlloc(CONST dvoid *parenth, dvoid **descpp,
+ CONST ub4 type, CONST size_t xtramem_sz,
+ dvoid **usrmempp);
+
+sword OCIDescriptorFree(dvoid *descp, CONST ub4 type);
+
+sword OCIEnvInit (OCIEnv **envp, ub4 mode,
+ size_t xtramem_sz, dvoid **usrmempp);
+
+sword OCIServerAttach (OCIServer *srvhp, OCIError *errhp,
+ CONST OraText *dblink, sb4 dblink_len, ub4 mode);
+
+sword OCIServerDetach (OCIServer *srvhp, OCIError *errhp, ub4 mode);
+
+sword OCISessionBegin (OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp,
+ ub4 credt, ub4 mode);
+
+sword OCISessionEnd (OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp,
+ ub4 mode);
+
+sword OCILogon (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+ CONST OraText *username, ub4 uname_len,
+ CONST OraText *password, ub4 passwd_len,
+ CONST OraText *dbname, ub4 dbname_len);
+
+sword OCILogon2 (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+ CONST OraText *username, ub4 uname_len,
+ CONST OraText *password, ub4 passwd_len,
+ CONST OraText *dbname, ub4 dbname_len,
+ ub4 mode);
+
+sword OCILogoff (OCISvcCtx *svchp, OCIError *errhp);
+
+
+sword OCIPasswordChange (OCISvcCtx *svchp, OCIError *errhp,
+ CONST OraText *user_name, ub4 usernm_len,
+ CONST OraText *opasswd, ub4 opasswd_len,
+ CONST OraText *npasswd, ub4 npasswd_len,
+ ub4 mode);
+
+sword OCIStmtPrepare (OCIStmt *stmtp, OCIError *errhp, CONST OraText *stmt,
+ ub4 stmt_len, ub4 language, ub4 mode);
+
+sword OCIStmtPrepare2 ( OCISvcCtx *svchp, OCIStmt **stmtp, OCIError *errhp,
+ CONST OraText *stmt, ub4 stmt_len, CONST OraText *key,
+ ub4 key_len, ub4 language, ub4 mode);
+
+sword OCIStmtRelease ( OCIStmt *stmtp, OCIError *errhp, CONST OraText *key,
+ ub4 key_len, ub4 mode);
+
+sword OCIBindByPos (OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+ ub4 position, dvoid *valuep, sb4 value_sz,
+ ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+ ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword OCIBindByName (OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+ CONST OraText *placeholder, sb4 placeh_len,
+ dvoid *valuep, sb4 value_sz, ub2 dty,
+ dvoid *indp, ub2 *alenp, ub2 *rcodep,
+ ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword OCIBindObject (OCIBind *bindp, OCIError *errhp, CONST OCIType *type,
+ dvoid **pgvpp, ub4 *pvszsp, dvoid **indpp,
+ ub4 *indszp);
+
+sword OCIBindDynamic (OCIBind *bindp, OCIError *errhp, dvoid *ictxp,
+ OCICallbackInBind icbfp, dvoid *octxp,
+ OCICallbackOutBind ocbfp);
+
+sword OCIBindArrayOfStruct (OCIBind *bindp, OCIError *errhp,
+ ub4 pvskip, ub4 indskip,
+ ub4 alskip, ub4 rcskip);
+
+sword OCIStmtGetPieceInfo (OCIStmt *stmtp, OCIError *errhp,
+ dvoid **hndlpp, ub4 *typep,
+ ub1 *in_outp, ub4 *iterp, ub4 *idxp,
+ ub1 *piecep);
+
+sword OCIStmtSetPieceInfo (dvoid *hndlp, ub4 type, OCIError *errhp,
+ CONST dvoid *bufp, ub4 *alenp, ub1 piece,
+ CONST dvoid *indp, ub2 *rcodep);
+
+sword OCIStmtExecute (OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp,
+ ub4 iters, ub4 rowoff, CONST OCISnapshot *snap_in,
+ OCISnapshot *snap_out, ub4 mode);
+
+sword OCIDefineByPos (OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
+ ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+ dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode);
+
+sword OCIDefineObject (OCIDefine *defnp, OCIError *errhp,
+ CONST OCIType *type, dvoid **pgvpp,
+ ub4 *pvszsp, dvoid **indpp, ub4 *indszp);
+
+sword OCIDefineDynamic (OCIDefine *defnp, OCIError *errhp, dvoid *octxp,
+ OCICallbackDefine ocbfp);
+
+sword OCIRowidToChar (OCIRowid *rowidDesc, OraText *outbfp, ub2 *outbflp,
+ OCIError *errhp);
+
+sword OCIDefineArrayOfStruct (OCIDefine *defnp, OCIError *errhp, ub4 pvskip,
+ ub4 indskip, ub4 rlskip, ub4 rcskip);
+
+sword OCIStmtFetch (OCIStmt *stmtp, OCIError *errhp, ub4 nrows,
+ ub2 orientation, ub4 mode);
+
+sword OCIStmtFetch2 (OCIStmt *stmtp, OCIError *errhp, ub4 nrows,
+ ub2 orientation, sb4 scrollOffset, ub4 mode);
+
+sword OCIStmtGetBindInfo (OCIStmt *stmtp, OCIError *errhp, ub4 size,
+ ub4 startloc,
+ sb4 *found, OraText *bvnp[], ub1 bvnl[],
+ OraText *invp[], ub1 inpl[], ub1 dupl[],
+ OCIBind **hndl);
+
+sword OCIDescribeAny (OCISvcCtx *svchp, OCIError *errhp,
+ dvoid *objptr,
+ ub4 objnm_len, ub1 objptr_typ, ub1 info_level,
+ ub1 objtyp, OCIDescribe *dschp);
+
+sword OCIParamGet (CONST dvoid *hndlp, ub4 htype, OCIError *errhp,
+ dvoid **parmdpp, ub4 pos);
+
+sword OCIParamSet(dvoid *hdlp, ub4 htyp, OCIError *errhp, CONST dvoid *dscp,
+ ub4 dtyp, ub4 pos);
+
+sword OCITransStart (OCISvcCtx *svchp, OCIError *errhp,
+ uword timeout, ub4 flags );
+
+sword OCITransDetach (OCISvcCtx *svchp, OCIError *errhp, ub4 flags );
+
+sword OCITransCommit (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword OCITransRollback (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword OCITransPrepare (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword OCITransMultiPrepare (OCISvcCtx *svchp, ub4 numBranches,
+ OCITrans **txns, OCIError **errhp);
+
+sword OCITransForget (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword OCIErrorGet (dvoid *hndlp, ub4 recordno, OraText *sqlstate,
+ sb4 *errcodep, OraText *bufp, ub4 bufsiz, ub4 type);
+
+sword OCILobAppend (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_locp);
+
+sword OCILobAssign (OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *src_locp,
+ OCILobLocator **dst_locpp);
+
+sword OCILobCharSetForm (OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *locp, ub1 *csfrm);
+
+sword OCILobCharSetId (OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *locp, ub2 *csid);
+
+sword OCILobCopy (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+ OCILobLocator *src_locp, ub4 amount, ub4 dst_offset,
+ ub4 src_offset);
+
+sword OCILobCreateTemporary(OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub2 csid,
+ ub1 csfrm,
+ ub1 lobtype,
+ boolean cache,
+ OCIDuration duration);
+
+
+sword OCILobClose( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp );
+
+
+sword OCILobDisableBuffering (OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+sword OCILobEnableBuffering (OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+sword OCILobErase (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+ ub4 *amount, ub4 offset);
+
+sword OCILobFileClose (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *filep);
+
+sword OCILobFileCloseAll (OCISvcCtx *svchp, OCIError *errhp);
+
+sword OCILobFileExists (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *filep,
+ boolean *flag);
+
+sword OCILobFileGetName (OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *filep,
+ OraText *dir_alias, ub2 *d_length,
+ OraText *filename, ub2 *f_length);
+
+sword OCILobFileIsOpen (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *filep,
+ boolean *flag);
+
+sword OCILobFileOpen (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *filep,
+ ub1 mode);
+
+sword OCILobFileSetName (OCIEnv *envhp, OCIError *errhp,
+ OCILobLocator **filepp,
+ CONST OraText *dir_alias, ub2 d_length,
+ CONST OraText *filename, ub2 f_length);
+
+sword OCILobFlushBuffer (OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 flag);
+
+sword OCILobFreeTemporary(OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+sword OCILobGetChunkSize(OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *chunksizep);
+
+sword OCILobGetLength (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *lenp);
+
+sword OCILobIsEqual (OCIEnv *envhp, CONST OCILobLocator *x,
+ CONST OCILobLocator *y,
+ boolean *is_equal);
+
+sword OCILobIsOpen( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ boolean *flag);
+
+sword OCILobIsTemporary(OCIEnv *envp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ boolean *is_temporary);
+
+sword OCILobLoadFromFile (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_filep,
+ ub4 amount, ub4 dst_offset,
+ ub4 src_offset);
+
+sword OCILobLocatorAssign (OCISvcCtx *svchp, OCIError *errhp,
+ CONST OCILobLocator *src_locp,
+ OCILobLocator **dst_locpp);
+
+
+sword OCILobLocatorIsInit (OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *locp,
+ boolean *is_initialized);
+
+sword OCILobOpen( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub1 mode );
+
+sword OCILobRead (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+ ub4 *amtp, ub4 offset, dvoid *bufp, ub4 bufl, dvoid *ctxp,
+ OCICallbackLobRead cbfp, ub2 csid, ub1 csfrm);
+
+sword OCILobTrim (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+ ub4 newlen);
+
+sword OCILobWrite (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+ ub4 *amtp, ub4 offset, dvoid *bufp, ub4 buflen, ub1 piece,
+ dvoid *ctxp, OCICallbackLobWrite cbfp, ub2 csid,
+ ub1 csfrm);
+
+sword OCILobWriteAppend(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *lobp,
+ ub4 *amtp, dvoid *bufp, ub4 bufl, ub1 piece, dvoid *ctxp,
+ OCICallbackLobWrite cbfp, ub2 csid, ub1 csfrm);
+
+sword OCIBreak (dvoid *hndlp, OCIError *errhp);
+
+sword OCIReset (dvoid *hndlp, OCIError *errhp);
+
+sword OCIServerVersion (dvoid *hndlp, OCIError *errhp, OraText *bufp,
+ ub4 bufsz,
+ ub1 hndltype);
+
+sword OCIServerRelease (dvoid *hndlp, OCIError *errhp, OraText *bufp,
+ ub4 bufsz,
+ ub1 hndltype, ub4 *version);
+
+sword OCIAttrGet (CONST dvoid *trgthndlp, ub4 trghndltyp,
+ dvoid *attributep, ub4 *sizep, ub4 attrtype,
+ OCIError *errhp);
+
+sword OCIAttrSet (dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep,
+ ub4 size, ub4 attrtype, OCIError *errhp);
+
+sword OCISvcCtxToLda (OCISvcCtx *svchp, OCIError *errhp, Lda_Def *ldap);
+
+sword OCILdaToSvcCtx (OCISvcCtx **svchpp, OCIError *errhp, Lda_Def *ldap);
+
+sword OCIResultSetToStmt (OCIResult *rsetdp, OCIError *errhp);
+
+sword OCIFileClose ( dvoid *hndl, OCIError *err, OCIFileObject *filep );
+
+sword OCIUserCallbackRegister(dvoid *hndlp, ub4 type, dvoid *ehndlp,
+ OCIUserCallback callback, dvoid *ctxp,
+ ub4 fcode, ub4 when, OCIUcb *ucbDesc);
+
+sword OCIUserCallbackGet(dvoid *hndlp, ub4 type, dvoid *ehndlp,
+ ub4 fcode, ub4 when, OCIUserCallback *callbackp,
+ dvoid **ctxpp, OCIUcb *ucbDesc);
+
+sword OCISharedLibInit(dvoid *metaCtx, dvoid *libCtx, ub4 argfmt, sword argc,
+ dvoid **argv, OCIEnvCallbackType envCallback);
+
+sword OCIFileExists ( dvoid *hndl, OCIError *err, OraText *filename,
+ OraText *path, ub1 *flag );
+
+sword OCIFileFlush( dvoid *hndl, OCIError *err, OCIFileObject *filep );
+
+
+sword OCIFileGetLength( dvoid *hndl, OCIError *err, OraText *filename,
+ OraText *path, ubig_ora *lenp );
+
+sword OCIFileInit ( dvoid *hndl, OCIError *err );
+
+sword OCIFileOpen ( dvoid *hndl, OCIError *err, OCIFileObject **filep,
+ OraText *filename, OraText *path, ub4 mode, ub4 create,
+ ub4 type );
+
+sword OCIFileRead ( dvoid *hndl, OCIError *err, OCIFileObject *filep,
+ dvoid *bufp, ub4 bufl, ub4 *bytesread );
+
+sword OCIFileSeek ( dvoid *hndl, OCIError *err, OCIFileObject *filep,
+ uword origin, ubig_ora offset, sb1 dir );
+
+sword OCIFileTerm ( dvoid *hndl, OCIError *err );
+
+
+sword OCIFileWrite ( dvoid *hndl, OCIError *err, OCIFileObject *filep,
+ dvoid *bufp, ub4 buflen, ub4 *byteswritten );
+
+
+#ifdef ORAXB8_DEFINED
+
+sword OCILobCopy2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+ OCILobLocator *src_locp, oraub8 amount, oraub8 dst_offset,
+ oraub8 src_offset);
+
+sword OCILobErase2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+ oraub8 *amount, oraub8 offset);
+
+sword OCILobGetLength2 (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *locp, oraub8 *lenp);
+
+sword OCILobLoadFromFile2 (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_filep,
+ oraub8 amount, oraub8 dst_offset,
+ oraub8 src_offset);
+
+sword OCILobRead2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+ oraub8 *byte_amtp, oraub8 *char_amtp, oraub8 offset,
+ dvoid *bufp, oraub8 bufl, ub1 piece, dvoid *ctxp,
+ OCICallbackLobRead2 cbfp, ub2 csid, ub1 csfrm);
+
+sword OCILobTrim2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+ oraub8 newlen);
+
+sword OCILobWrite2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+ oraub8 *byte_amtp, oraub8 *char_amtp, oraub8 offset,
+ dvoid *bufp, oraub8 buflen, ub1 piece, dvoid *ctxp,
+ OCICallbackLobWrite2 cbfp, ub2 csid, ub1 csfrm);
+
+sword OCILobWriteAppend2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *lobp,
+ oraub8 *byte_amtp, oraub8 *char_amtp, dvoid *bufp,
+ oraub8 bufl, ub1 piece, dvoid *ctxp,
+ OCICallbackLobWrite2 cbfp, ub2 csid, ub1 csfrm);
+
+sword OCILobGetStorageLimit (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *lobp, oraub8 *limitp);
+
+#endif
+
+/*
+ ** Initialize the security package
+ */
+sword OCISecurityInitialize (OCISecurity *sechandle, OCIError *error_handle);
+
+sword OCISecurityTerminate (OCISecurity *sechandle, OCIError *error_handle);
+
+sword OCISecurityOpenWallet(OCISecurity *osshandle,
+ OCIError *error_handle,
+ size_t wrllen,
+ OraText *wallet_resource_locator,
+ size_t pwdlen,
+ OraText *password,
+ nzttWallet *wallet);
+
+sword OCISecurityCloseWallet(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttWallet *wallet);
+
+sword OCISecurityCreateWallet(OCISecurity *osshandle,
+ OCIError *error_handle,
+ size_t wrllen,
+ OraText *wallet_resource_locator,
+ size_t pwdlen,
+ OraText *password,
+ nzttWallet *wallet);
+
+sword OCISecurityDestroyWallet(OCISecurity *osshandle,
+ OCIError *error_handle,
+ size_t wrllen,
+ OraText *wallet_resource_locator,
+ size_t pwdlen,
+ OraText *password);
+
+sword OCISecurityStorePersona(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona **persona,
+ nzttWallet *wallet);
+
+sword OCISecurityOpenPersona(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona);
+
+sword OCISecurityClosePersona(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona);
+
+sword OCISecurityRemovePersona(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona **persona);
+
+sword OCISecurityCreatePersona(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentType identity_type,
+ nzttCipherType cipher_type,
+ nzttPersonaDesc *desc,
+ nzttPersona **persona);
+
+sword OCISecuritySetProtection(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttcef crypto_engine_function,
+ nztttdufmt data_unit_format,
+ nzttProtInfo *protection_info);
+
+sword OCISecurityGetProtection(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttcef crypto_engine_function,
+ nztttdufmt * data_unit_format_ptr,
+ nzttProtInfo *protection_info);
+
+sword OCISecurityRemoveIdentity(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentity **identity_ptr);
+
+sword OCISecurityCreateIdentity(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentType type,
+ nzttIdentityDesc *desc,
+ nzttIdentity **identity_ptr);
+
+sword OCISecurityAbortIdentity(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentity **identity_ptr);
+
+sword OCISecurityFreeIdentity(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentity **identity_ptr);
+
+
+sword OCISecurityStoreTrustedIdentity(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentity **identity_ptr,
+ nzttPersona *persona);
+
+sword OCISecuritySign(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces signature_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *buffer_block);
+
+sword OCISecuritySignExpansion(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t inputlen,
+ size_t *signature_length);
+
+sword OCISecurityVerify(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces signature_state,
+ size_t siglen,
+ ub1 *signature,
+ nzttBufferBlock *extracted_message,
+ boolean *verified,
+ boolean *validated,
+ nzttIdentity **signing_party_identity);
+
+sword OCISecurityValidate(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttIdentity *identity,
+ boolean *validated);
+
+sword OCISecuritySignDetached(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces signature_state,
+ size_t input_length,
+ ub1 * input,
+ nzttBufferBlock *signature);
+
+sword OCISecuritySignDetExpansion(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t input_length,
+ size_t *required_buffer_length);
+
+sword OCISecurityVerifyDetached(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces signature_state,
+ size_t data_length,
+ ub1 *data,
+ size_t siglen,
+ ub1 *signature,
+ boolean *verified,
+ boolean *validated,
+ nzttIdentity **signing_party_identity);
+
+sword OCISecurity_PKEncrypt(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t number_of_recipients,
+ nzttIdentity *recipient_list,
+ nzttces encryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *encrypted_data);
+
+sword OCISecurityPKEncryptExpansion(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t number_recipients,
+ size_t input_length,
+ size_t *buffer_length_required);
+
+sword OCISecurityPKDecrypt(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces encryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *encrypted_data);
+
+sword OCISecurityEncrypt(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces encryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *encrypted_data);
+
+sword OCISecurityEncryptExpansion(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t input_length,
+ size_t *encrypted_data_length);
+
+sword OCISecurityDecrypt(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces decryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *decrypted_data);
+
+sword OCISecurityEnvelope(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t number_of_recipients,
+ nzttIdentity *identity,
+ nzttces encryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *enveloped_data);
+
+sword OCISecurityDeEnvelope(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces decryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *output_message,
+ boolean *verified,
+ boolean *validated,
+ nzttIdentity **sender_identity);
+
+sword OCISecurityKeyedHash(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces hash_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *keyed_hash);
+
+sword OCISecurityKeyedHashExpansion(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t input_length,
+ size_t *required_buffer_length);
+
+sword OCISecurityHash(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces hash_state,
+ size_t input,
+ ub1 *input_length,
+ nzttBufferBlock *hash);
+
+sword OCISecurityHashExpansion(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t input_length,
+ size_t *required_buffer_length);
+
+sword OCISecuritySeedRandom(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t seed_length,
+ ub1 *seed);
+
+sword OCISecurityRandomBytes(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t number_of_bytes_desired,
+ nzttBufferBlock *random_bytes);
+
+sword OCISecurityRandomNumber(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ uword *random_number_ptr);
+
+sword OCISecurityInitBlock(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttBufferBlock *buffer_block);
+
+sword OCISecurityReuseBlock(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttBufferBlock *buffer_block);
+
+sword OCISecurityPurgeBlock(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttBufferBlock *buffer_block);
+
+sword OCISecuritySetBlock(OCISecurity *osshandle,
+ OCIError *error_handle,
+ uword flags_to_set,
+ size_t buffer_length,
+ size_t used_buffer_length,
+ ub1 *buffer,
+ nzttBufferBlock *buffer_block);
+
+sword OCISecurityGetIdentity(OCISecurity *osshandle,
+ OCIError *error_handle,
+ size_t namelen,
+ OraText *distinguished_name,
+ nzttIdentity **identity);
+
+sword OCIAQEnq(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+ OCIAQEnqOptions *enqopt, OCIAQMsgProperties *msgprop,
+ OCIType *payload_tdo, dvoid **payload, dvoid **payload_ind,
+ OCIRaw **msgid, ub4 flags);
+
+sword OCIAQDeq(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+ OCIAQDeqOptions *deqopt, OCIAQMsgProperties *msgprop,
+ OCIType *payload_tdo, dvoid **payload, dvoid **payload_ind,
+ OCIRaw **msgid, ub4 flags);
+
+sword OCIAQEnqArray(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+ OCIAQEnqOptions *enqopt, ub4 *iters,
+ OCIAQMsgProperties **msgprop, OCIType *payload_tdo,
+ dvoid **payload, dvoid **payload_ind, OCIRaw **msgid,
+ dvoid *ctxp, OCICallbackAQEnq enqcbfp, ub4 flags);
+
+sword OCIAQDeqArray(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+ OCIAQDeqOptions *deqopt, ub4 *iters,
+ OCIAQMsgProperties **msgprop, OCIType *payload_tdo,
+ dvoid **payload, dvoid **payload_ind, OCIRaw **msgid,
+ dvoid *ctxp, OCICallbackAQDeq deqcbfp, ub4 flags);
+
+sword OCIAQListen(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAQAgent **agent_list, ub4 num_agents,
+ sb4 wait, OCIAQAgent **agent,
+ ub4 flags);
+
+sword OCIExtractInit(dvoid *hndl, OCIError *err);
+
+sword OCIExtractTerm(dvoid *hndl, OCIError *err);
+
+sword OCIExtractReset(dvoid *hndl, OCIError *err);
+
+sword OCIExtractSetNumKeys(dvoid *hndl, OCIError *err, uword numkeys);
+
+sword OCIExtractSetKey(dvoid *hndl, OCIError *err, CONST OraText *name,
+ ub1 type, ub4 flag, CONST dvoid *defval,
+ CONST sb4 *intrange, CONST OraText *CONST *strlist);
+
+sword OCIExtractFromFile(dvoid *hndl, OCIError *err, ub4 flag,
+ OraText *filename);
+
+sword OCIExtractFromStr(dvoid *hndl, OCIError *err, ub4 flag, OraText *input);
+
+sword OCIExtractToInt(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, sb4 *retval);
+
+sword OCIExtractToBool(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, ub1 *retval);
+
+sword OCIExtractToStr(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, OraText *retval, uword buflen);
+
+sword OCIExtractToOCINum(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, OCINumber *retval);
+
+sword OCIExtractToList(dvoid *hndl, OCIError *err, uword *numkeys);
+
+sword OCIExtractFromList(dvoid *hndl, OCIError *err, uword index,
+ OraText **name,
+ ub1 *type, uword *numvals, dvoid ***values);
+
+/* Memory Related Service Interfaces */
+
+sword OCIMemoryAlloc(dvoid *hdl, OCIError *err, dvoid **mem,
+ OCIDuration dur, ub4 size, ub4 flags);
+
+sword OCIMemoryResize(dvoid *hdl, OCIError *err, dvoid **mem,
+ ub4 newsize, ub4 flags);
+
+sword OCIMemoryFree(dvoid *hdl, OCIError *err, dvoid *mem);
+
+sword OCIContextSetValue(dvoid *hdl, OCIError *err, OCIDuration duration,
+ ub1 *key, ub1 keylen, dvoid *ctx_value);
+
+sword OCIContextGetValue(dvoid *hdl, OCIError *err, ub1 *key,
+ ub1 keylen, dvoid **ctx_value);
+
+sword OCIContextClearValue(dvoid *hdl, OCIError *err, ub1 *key,
+ ub1 keylen);
+
+sword OCIContextGenerateKey(dvoid *hdl, OCIError *err, ub4 *key);
+
+sword OCIMemorySetCurrentIDs(dvoid *hdl, OCIError *err,
+ ub4 curr_session_id, ub4 curr_trans_id,
+ ub4 curr_stmt_id);
+
+sword OCIPicklerTdsCtxInit(OCIEnv *env, OCIError *err,
+ OCIPicklerTdsCtx **tdsc);
+
+sword OCIPicklerTdsCtxFree(OCIEnv *env, OCIError *err, OCIPicklerTdsCtx *tdsc);
+
+sword OCIPicklerTdsInit(OCIEnv *env, OCIError *err, OCIPicklerTdsCtx *tdsc,
+ OCIPicklerTds **tdsh);
+
+sword OCIPicklerTdsFree(OCIEnv *env, OCIError *err, OCIPicklerTds *tdsh);
+
+sword OCIPicklerTdsCreateElementNumber(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, ub1 prec,
+ sb1 scale, OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementChar(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, ub2 len,
+ OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementVarchar(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, ub2 len,
+ OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementRaw(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, ub2 len,
+ OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElement(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, OCITypeCode dty,
+ OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsAddAttr(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, OCIPicklerTdsElement elt);
+
+sword OCIPicklerTdsGenerate(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh);
+
+sword OCIPicklerTdsGetAttr(OCIEnv *env, OCIError *err,
+ CONST OCIPicklerTds *tdsh, ub1 attrno,
+ OCITypeCode *typ, ub2 *len);
+
+sword OCIPicklerFdoInit(OCIEnv *env, OCIError *err,
+ OCIPicklerFdo **fdoh);
+
+sword OCIPicklerFdoFree(OCIEnv *env, OCIError *err,
+ OCIPicklerFdo *fdoh);
+
+sword OCIPicklerImageInit(OCIEnv *env, OCIError *err,
+ OCIPicklerFdo *fdoh,
+ OCIPicklerTds *tdsh,
+ OCIPicklerImage **imgh);
+
+sword OCIPicklerImageFree(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh);
+
+sword OCIPicklerImageAddScalar(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh,
+ dvoid *scalar, ub4 len);
+
+sword OCIPicklerImageAddNullScalar(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh);
+
+sword OCIPicklerImageGenerate(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh);
+
+sword OCIPicklerImageGetScalarSize(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh,
+ ub4 attrno, ub4 *size);
+
+sword OCIPicklerImageGetScalar(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, ub4 attrno,
+ dvoid *buf, ub4 *len, OCIInd *ind);
+
+sword OCIPicklerImageCollBegin(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, CONST OCIPicklerTds *colltdsh);
+
+sword OCIPicklerImageCollAddScalar( OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, dvoid *scalar,
+ ub4 buflen, OCIInd ind);
+
+sword OCIPicklerImageCollEnd(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh);
+
+/* should take svcctx for locator stuff */
+sword OCIPicklerImageCollBeginScan(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, CONST OCIPicklerTds *coll_tdsh,
+ ub4 attrnum, ub4 startidx, OCIInd *ind);
+
+sword OCIPicklerImageCollGetScalarSize(OCIEnv *env, OCIError *err,
+ CONST OCIPicklerTds *coll_tdsh, ub4 *size);
+
+sword OCIPicklerImageCollGetScalar(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, dvoid *buf,
+ ub4 *buflen, OCIInd *ind);
+
+sword OCIAnyDataGetType(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode *tc, OCIType **type);
+
+sword OCIAnyDataIsNull(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ boolean *isnull);
+
+sword OCIAnyDataConvert(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+ OCIType *type, OCIDuration dur, dvoid *ind, dvoid *data_val,
+ ub4 len, OCIAnyData **sdata);
+
+sword OCIAnyDataBeginCreate(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+ OCIType *type, OCIDuration dur, OCIAnyData **sdata);
+
+sword OCIAnyDataDestroy(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata);
+
+sword OCIAnyDataAttrSet(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+ ub4 length, boolean is_any);
+
+sword OCIAnyDataCollAddElem(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyData *sdata, OCITypeCode tc, OCIType *type, dvoid *ind,
+ dvoid *attr_val, ub4 length, boolean is_any, boolean last_elem);
+
+sword OCIAnyDataEndCreate(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyData *sdata);
+
+sword OCIAnyDataAccess(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+ ub4 *length);
+
+sword OCIAnyDataGetCurrAttrNum(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyData *sdata, ub4 *attrnum);
+
+sword OCIAnyDataAttrGet(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+ ub4 *length, boolean is_any);
+
+sword OCIAnyDataCollGetElem(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyData *sdata,
+ OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *celem_val,
+ ub4 *length, boolean is_any);
+
+
+/*------------------------ OCIAnyDataSet interfaces -------------------------*/
+
+/*
+ NAME
+ OCIAnyDataSetBeginCreate - OCIAnyDataSet Begin Creation
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+ recorded in errhp and this function returns OCI_ERROR.
+ Diagnostic information can be obtained by calling
+ OCIErrorGet().
+ typecode - typecode corresponding to the OCIAnyDataSet.
+ type (IN) - type corresponding to the OCIAnyDataSet. If the typecode
+ corresponds to a built-in type (OCI_TYPECODE_NUMBER etc.)
+ , this parameter can be NULL. It should be non NULL for
+ user defined types (OCI_TYPECODE_OBJECT,
+ OCI_TYPECODE_REF, collection types etc.)
+ dur (IN) - duration for which OCIAnyDataSet is allocated.
+ data_set (OUT) - Initialized OCIAnyDataSet.
+ RETURNS - error code
+ NOTES
+ This call allocates an OCIAnyDataSet for the duration of dur and
+ initializes it with the type information. The OCIAnyDataSet can hold
+ multiple instances of the given type. For performance reasons, the
+ OCIAnyDataSet will end up pointing to the passed in OCIType parameter.
+ It is the responsibility of the caller to ensure that the OCIType is
+ longer lived (has allocation duration >= the duration of the OCIAnyData
+ if the OCIType is a transient one, allocation/pin duration >= duration of
+ the OCIAnyData if the OCIType is a persistent one).
+
+*/
+sword OCIAnyDataSetBeginCreate(OCISvcCtx *svchp, OCIError *errhp,
+ OCITypeCode typecode, CONST OCIType *type, OCIDuration dur,
+ OCIAnyDataSet ** data_set);
+
+/*
+ NAME
+ OCIAnyDataSetDestroy - OCIAnyDataSet Destroy
+ DESCRIPTION
+ This call frees the OCIAnyDataSet allocated using
+ OCIAnyDataSetBeginCreate().
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI Error handle.
+ data_set (IN/OUT) - OCIAnyDataSet to be freed.
+*/
+sword OCIAnyDataSetDestroy(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set);
+
+
+/*
+ NAME
+ OCIAnyDataSetAddInstance - OCIAnyDataSet Add an instance
+ DESCRIPTION
+ This call adds a new skeleton instance to the OCIAnyDataSet and all the
+ attributes of the instance are set to NULL. It returns this skeleton
+ instance through the OCIAnyData parameter which can be constructed
+ subsequently by invoking the OCIAnyData API.
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI Error handle.
+ data_set (IN/OUT) - OCIAnyDataSet to which a new instance is added.
+ data (IN/OUT) - OCIAnyData corresponding to the newly added
+ instance. If (*data) is NULL, a new OCIAnyData will
+ be allocated for same duration as the OCIAnyDataSet.
+ If (*data) is not NULL, it will get reused. This
+ OCIAnyData can be subseqently constructed using the
+ OCIAnyDataConvert() call or it can be constructed
+ piece-wise using the OCIAnyDataAttrSet and
+ OCIAnyDataCollAddElem calls.
+ NOTES
+ No Destruction of the old value is done here. It is the responsibility of
+ the caller to destroy the old value pointed to by (*data) and set (*data)
+ to a null pointer before beginning to make a sequence of this call. No
+ deep copying (of OCIType information nor the data part.) is done in the
+ returned OCIAnyData. This OCIAnyData cannot be used beyond the allocation
+ duration of the OCIAnyDataSet (it is like a reference into the
+ OCIAnyDataSet). The returned OCIAnyData can be reused on subsequent calls
+ to this function, to sequentially add new data instances to the
+ OCIAnyDataSet.
+*/
+sword OCIAnyDataSetAddInstance(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set, OCIAnyData **data);
+
+/*
+ NAME
+ OCIAnyDataSetEndCreate - OCIAnyDataSet End Creation process.
+ DESCRIPTION
+ This call marks the end of OCIAnyDataSet creation. It should be called
+ after constructing all of its instance(s).
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+ recorded in errhp and this function returns
+ OCI_ERROR. Diagnostic information can be obtained
+ by calling OCIErrorGet().
+ data_set (IN/OUT) - OCIAnyDataSet that has been fully constructed.
+*/
+sword OCIAnyDataSetEndCreate(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set);
+
+/*
+ NAME
+ OCIAnyDataSetGetType - OCIAnyDataSet Get Type of an OCIAnyDataSet
+ DESCRIPTION
+ Gets the Type corresponding to an OCIAnyDataSet. It returns the actual
+ pointer to the type maintained inside an OCIAnyDataSet. No copying is
+ done for performance reasons. The client is responsible for not using
+ this type once the OCIAnyDataSet is freed (or its duration ends).
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI Error handle.
+ data_set (IN) - Initialized OCIAnyDataSet.
+ tc (OUT) - The typecode of the type.
+ type (OUT) - The type corresponding to the OCIAnyDataSet. This
+ could be null if the OCIAnyData corresponds to a
+ built-in type.
+*/
+sword OCIAnyDataSetGetType (OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set, OCITypeCode *tc, OCIType **type);
+
+/*
+ NAME
+ OCIAnyDataSetGetCount - OCIAnyDataSet Get Count of instances.
+ DESCRIPTION
+ This call gets the number of instances in the OCIAnyDataSet.
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - OCI Service Context
+ errhp (IN/OUT) - OCI Error handle
+ data_set (IN) - Well formed OCIAnyDataSet.
+ count (OUT) - number of instances in OCIAnyDataSet
+*/
+sword OCIAnyDataSetGetCount(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set, ub4 *count);
+
+/*
+ NAME
+ OCIAnyDataSetGetInstance - OCIAnyDataSet Get next instance.
+ DESCRIPTION
+ Only sequential access to the instances in an OCIAnyDataSet is allowed.
+ This call returns the OCIAnyData corresponding to an instance at the
+ current position and updates the current position. Subsequently, the
+ OCIAnyData access routines may be used to access the instance.
+ RETURNS
+ error code. Returns OCI_NO_DATA if the current position is at the end of
+ the set, OCI_SUCCESS otherwise.
+ PARAMETERS
+ svchp (IN/OUT) - OCI Service Context
+ errhp (IN/OUT) - OCI Error handle
+ data_set (IN) - Well formed OCIAnyDataSet
+ data (IN/OUT) - OCIAnyData corresponding to the instance. If (*data)
+ is NULL, a new OCIAnyData will be allocated for same
+ duration as the OCIAnyDataSet. If (*data) is not NULL
+ , it will get reused. This OCIAnyData can be
+ subsequently accessed using the OCIAnyDataAccess()
+ call or piece-wise by using the OCIAnyDataAttrGet()
+ call.
+ NOTE
+ No Destruction of the old value is done here. It is the responsibility of
+ the caller to destroy the old value pointed to by (*data) and set (*data)
+ to a null pointer before beginning to make a sequence of this call. No deep
+ copying (of OCIType information nor the data part.) is done in the returned
+ OCIAnyData. This OCIAnyData cannot be used beyond the allocation duration
+ of the OCIAnyDataSet (it is like a reference into the OCIAnyDataSet). The
+ returned OCIAnyData can be reused on subsequent calls to this function to
+ sequentially access the OCIAnyDataSet.
+*/
+sword OCIAnyDataSetGetInstance(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set, OCIAnyData **data);
+
+/*--------------------- End of OCIAnyDataSet interfaces ---------------------*/
+
+sword OCIFormatInit(dvoid *hndl, OCIError *err);
+
+sword OCIFormatString(dvoid *hndl, OCIError *err, OraText *buffer,
+ sbig_ora bufferLength, sbig_ora *returnLength,
+ CONST OraText *formatString, ...);
+
+sword OCIFormatTerm(dvoid *hndl, OCIError *err);
+
+sword OCIFormatTUb1(void);
+sword OCIFormatTUb2(void);
+sword OCIFormatTUb4(void);
+sword OCIFormatTUword(void);
+sword OCIFormatTUbig_ora(void);
+sword OCIFormatTSb1(void);
+sword OCIFormatTSb2(void);
+sword OCIFormatTSb4(void);
+sword OCIFormatTSword(void);
+sword OCIFormatTSbig_ora(void);
+sword OCIFormatTEb1(void);
+sword OCIFormatTEb2(void);
+sword OCIFormatTEb4(void);
+sword OCIFormatTEword(void);
+sword OCIFormatTChar(void);
+sword OCIFormatTText(void);
+sword OCIFormatTDouble(void);
+sword OCIFormatTDvoid(void);
+sword OCIFormatTEnd(void);
+
+/*-------------------------- Extensions to XA interface ---------------------*/
+/* ------------------------- xaosvch ----------------------------------------*/
+/*
+ NAME
+ xaosvch - XA Oracle get SerViCe Handle
+ DESCRIPTION
+ Given a database name return the service handle that is used by the
+ XA library
+ NOTE
+ This macro has been provided for backward compatibilty with 8.0.2
+*/
+OCISvcCtx *xaosvch(OraText *dbname);
+
+/* ------------------------- xaoSvcCtx --------------------------------------*/
+/*
+ NAME
+ xaoSvcCtx - XA Oracle get SerViCe ConTeXt
+ DESCRIPTION
+ Given a database name return the service handle that is used by the
+ XA library
+ NOTE
+ This routine has been provided for APs to get access to the service
+ handle that XA library uses. Without this routine APs must use SQLLIB
+ routine sqlld2 to get access to the Logon data area registered by the
+ XA library
+*/
+OCISvcCtx *xaoSvcCtx(OraText *dbname);
+
+/* ------------------------- xaoEnv -----------------------------------------*/
+/*
+ NAME
+ xaoEnv - XA Oracle get ENvironment Handle
+ DESCRIPTION
+ Given a database name return the environment handle that is used by the
+ XA library
+ NOTE
+ This routine has been provided for APs to get access to the environment
+ handle that XA library uses. Without this routine APs must use SQLLIB
+ routine sqlld2 to get access to the Logon data area registered by the
+ XA library
+*/
+OCIEnv *xaoEnv(OraText *dbname);
+
+/* ------------------------- xaosterr ---------------------------------------*/
+/*
+ NAME
+ xaosterr - XA Oracle get xa STart ERRor code
+ DESCRIPTION
+ Given an oracle error code return the XA error code
+ */
+int xaosterr(OCISvcCtx *svch, sb4 error);
+/*-------------------------- End Extensions ---------------------------------*/
+/*---------------------- Extensions to NLS cartridge service ----------------*/
+/* ----------------------- OCINlsGetInfo ------------------------------------*/
+/*
+ NAME
+ OCINlsGetInfo - Get NLS info from OCI environment handle
+ REMARKS
+ This function generates language information specified by item from OCI
+ environment handle envhp into an array pointed to by buf within size
+ limitation as buflen.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+ envhp(IN/OUT)
+ OCI environment handle.
+ errhp(IN/OUT)
+ The OCI error handle. If there is an error, it is record in errhp and
+ this function returns a NULL pointer. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ buf(OUT)
+ Pointer to the destination buffer.
+ buflen(IN)
+ The size of destination buffer. The maximum length for each information
+ is 32 bytes.
+ item(IN)
+ It specifies to get which item in OCI environment handle and can be one
+ of following values:
+ OCI_NLS_DAYNAME1 : Native name for Monday.
+ OCI_NLS_DAYNAME2 : Native name for Tuesday.
+ OCI_NLS_DAYNAME3 : Native name for Wednesday.
+ OCI_NLS_DAYNAME4 : Native name for Thursday.
+ OCI_NLS_DAYNAME5 : Native name for Friday.
+ OCI_NLS_DAYNAME6 : Native name for for Saturday.
+ OCI_NLS_DAYNAME7 : Native name for for Sunday.
+ OCI_NLS_ABDAYNAME1 : Native abbreviated name for Monday.
+ OCI_NLS_ABDAYNAME2 : Native abbreviated name for Tuesday.
+ OCI_NLS_ABDAYNAME3 : Native abbreviated name for Wednesday.
+ OCI_NLS_ABDAYNAME4 : Native abbreviated name for Thursday.
+ OCI_NLS_ABDAYNAME5 : Native abbreviated name for Friday.
+ OCI_NLS_ABDAYNAME6 : Native abbreviated name for for Saturday.
+ OCI_NLS_ABDAYNAME7 : Native abbreviated name for for Sunday.
+ OCI_NLS_MONTHNAME1 : Native name for January.
+ OCI_NLS_MONTHNAME2 : Native name for February.
+ OCI_NLS_MONTHNAME3 : Native name for March.
+ OCI_NLS_MONTHNAME4 : Native name for April.
+ OCI_NLS_MONTHNAME5 : Native name for May.
+ OCI_NLS_MONTHNAME6 : Native name for June.
+ OCI_NLS_MONTHNAME7 : Native name for July.
+ OCI_NLS_MONTHNAME8 : Native name for August.
+ OCI_NLS_MONTHNAME9 : Native name for September.
+ OCI_NLS_MONTHNAME10 : Native name for October.
+ OCI_NLS_MONTHNAME11 : Native name for November.
+ OCI_NLS_MONTHNAME12 : Native name for December.
+ OCI_NLS_ABMONTHNAME1 : Native abbreviated name for January.
+ OCI_NLS_ABMONTHNAME2 : Native abbreviated name for February.
+ OCI_NLS_ABMONTHNAME3 : Native abbreviated name for March.
+ OCI_NLS_ABMONTHNAME4 : Native abbreviated name for April.
+ OCI_NLS_ABMONTHNAME5 : Native abbreviated name for May.
+ OCI_NLS_ABMONTHNAME6 : Native abbreviated name for June.
+ OCI_NLS_ABMONTHNAME7 : Native abbreviated name for July.
+ OCI_NLS_ABMONTHNAME8 : Native abbreviated name for August.
+ OCI_NLS_ABMONTHNAME9 : Native abbreviated name for September.
+ OCI_NLS_ABMONTHNAME10 : Native abbreviated name for October.
+ OCI_NLS_ABMONTHNAME11 : Native abbreviated name for November.
+ OCI_NLS_ABMONTHNAME12 : Native abbreviated name for December.
+ OCI_NLS_YES : Native string for affirmative response.
+ OCI_NLS_NO : Native negative response.
+ OCI_NLS_AM : Native equivalent string of AM.
+ OCI_NLS_PM : Native equivalent string of PM.
+ OCI_NLS_AD : Native equivalent string of AD.
+ OCI_NLS_BC : Native equivalent string of BC.
+ OCI_NLS_DECIMAL : decimal character.
+ OCI_NLS_GROUP : group separator.
+ OCI_NLS_DEBIT : Native symbol of debit.
+ OCI_NLS_CREDIT : Native sumbol of credit.
+ OCI_NLS_DATEFORMAT : Oracle date format.
+ OCI_NLS_INT_CURRENCY: International currency symbol.
+ OCI_NLS_LOC_CURRENCY : Locale currency symbol.
+ OCI_NLS_LANGUAGE : Language name.
+ OCI_NLS_ABLANGUAGE : Abbreviation for language name.
+ OCI_NLS_TERRITORY : Territory name.
+ OCI_NLS_CHARACTER_SET : Character set name.
+ OCI_NLS_LINGUISTIC : Linguistic name.
+ OCI_NLS_CALENDAR : Calendar name.
+ OCI_NLS_DUAL_CURRENCY : Dual currency symbol.
+*/
+sword OCINlsGetInfo(dvoid *envhp, OCIError *errhp, OraText *buf,
+ size_t buflen, ub2 item);
+
+/* ----------------------- OCINlsNumericInfoGet -----------------------------*/
+/*
+ NAME
+ OCINlsNumericInfoGet - Get NLS numeric info from OCI environment handle
+ REMARKS
+ This function generates numeric language information specified by item
+ from OCI environment handle envhp into an output number variable.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+ envhp(IN/OUT)
+ OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+ errhp(IN/OUT)
+ The OCI error handle. If there is an error, it is record in errhp and
+ this function returns a NULL pointer. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ val(OUT)
+ Pointer to the output number variable. On OCI_SUCCESS return, it will
+ contain the requested NLS numeric info.
+ item(IN)
+ It specifies to get which item in OCI environment handle and can be one
+ of following values:
+ OCI_NLS_CHARSET_MAXBYTESZ : Maximum character byte size for OCI
+ environment or session handle charset
+ OCI_NLS_CHARSET_FIXEDWIDTH: Character byte size for fixed-width charset;
+ 0 for variable-width charset
+*/
+sword OCINlsNumericInfoGet(dvoid *envhp, OCIError *errhp, sb4 *val, ub2 item);
+
+/* ----------------------- OCINlsCharSetNameToId ----------------------------*/
+/*
+ NAME
+ OCINlsCharSetNameToId - Get Oracle charset id given Oracle charset name
+ REMARKS
+ This function will get the Oracle character set id corresponding to
+ the given Oracle character set name.
+ RETURNS
+ Oracle character set id for the given Oracle character set name if
+ character set name and OCI handle are valid; otherwise returns 0.
+ envhp(IN/OUT)
+ OCI environment handle.
+ name(IN)
+ Pointer to a null-terminated Oracle character set name whose id
+ will be returned.
+*/
+ub2 OCINlsCharSetNameToId(dvoid *envhp, const oratext *name);
+
+/* ----------------------- OCINlsCharSetIdToName ----------------------------*/
+/*
+ NAME
+ OCINlsCharSetIdToName - Get Oracle charset name given Oracle charset id
+ REMARKS
+ This function will get the Oracle character set name corresponding to
+ the given Oracle character set id.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+ buf(OUT)
+ Pointer to the destination buffer. On OCI_SUCCESS return, it will contain
+ the null-terminated string for character set name.
+ buflen(IN)
+ Size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ for
+ guarantee to store an Oracle character set name. If it's smaller than
+ the length of the character set name, the function will return OCI_ERROR.
+ id(IN)
+ Oracle character set id.
+*/
+sword OCINlsCharSetIdToName(dvoid *envhp, oratext *buf, size_t buflen, ub2 id);
+
+/* ----------------------- OCINlsNameMap ------------------------------------*/
+/*
+ NAME
+ OCINlsNameMap - Map NLS naming from Oracle to other standards and vice
+ versa
+ REMARKS
+ This function will map NLS naming from Oracle to other standards (such
+ as ISO, IANA) and vice versa.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+ buf(OUT)
+ Pointer to the destination buffer. On OCI_SUCCESS return, it will
+ contain null-terminated string for requested mapped name.
+ buflen(IN)
+ The size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ
+ for guarantee to store an NLS name. If it is smaller than the length
+ of the name, the function will return OCI_ERROR.
+ srcbuf(IN)
+ Pointer to null-terminated NLS name. If it is not a valid name in its
+ define scope, the function will return OCI_ERROR.
+ flag(IN)
+ It specifies name mapping direction and can take the following values:
+ OCI_NLS_CS_IANA_TO_ORA : Map character set name from IANA to Oracle
+ OCI_NLS_CS_ORA_TO_IANA : Map character set name from Oracle to IANA
+ OCI_NLS_LANG_ISO_TO_ORA : Map language name from ISO to Oracle
+ OCI_NLS_LANG_ORA_TO_ISO : Map language name from Oracle to ISO
+ OCI_NLS_TERR_ISO_TO_ORA : Map territory name from ISO to Oracle
+ OCI_NLS_TERR_ORA_TO_ISO : Map territory name from Oracle to ISO
+ OCI_NLS_TERR_ISO3_TO_ORA : Map territory name from 3-letter ISO
+ abbreviation to Oracle
+ OCI_NLS_TERR_ORA_TO_ISO3 : Map territory name from Oracle to 3-letter
+ ISO abbreviation
+*/
+sword OCINlsNameMap(dvoid *envhp, oratext *buf, size_t buflen,
+ const oratext *srcbuf, ub4 flag);
+
+/* -------------------- OCIMultiByteToWideChar ------------------------------*/
+/*
+ NAME
+ OCIMultiByteToWideChar - Convert a null terminated multibyte string into
+ wchar
+ REMARKS
+ This routine converts an entire null-terminated string into the wchar
+ format. The wchar output buffer will be null-terminated.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set of string.
+ dst (OUT)
+ Destination buffer for wchar.
+ src (IN)
+ Source string to be converted.
+ rsize (OUT)
+ Number of characters converted including null-terminator.
+ If it is a NULL pointer, no number return
+*/
+sword OCIMultiByteToWideChar(dvoid *envhp, OCIWchar *dst, CONST OraText *src,
+ size_t *rsize);
+
+
+/* --------------------- OCIMultiByteInSizeToWideChar -----------------------*/
+/*
+ NAME
+ OCIMultiByteInSizeToWideChar - Convert a mulitbyte string in length into
+ wchar
+ REMARKS
+ This routine converts part of string into the wchar format. It will
+ convert as many complete characters as it can until it reaches output
+ buffer size or input buffer size or it reaches a null-terminator in
+ source string. The output buffer will be null-terminated if space permits.
+ If dstsz is zero, this function will only return number of characters not
+ including ending null terminator for converted string.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set of string.
+ dst (OUT)
+ Pointer to a destination buffer for wchar. It can be NULL pointer when
+ dstsz is zero.
+ dstsz(IN)
+ Destination buffer size in character. If it is zero, this function just
+ returns number of characters will be need for the conversion.
+ src (IN)
+ Source string to be converted.
+ srcsz(IN)
+ Length of source string in byte.
+ rsize(OUT)
+ Number of characters written into destination buffer, or number of
+ characters for converted string is dstsz is zero.
+ If it is NULL pointer, nothing to return.
+*/
+sword OCIMultiByteInSizeToWideChar(dvoid *envhp, OCIWchar *dst,
+ size_t dstsz, CONST OraText *src,
+ size_t srcsz, size_t *rsize);
+
+
+/* ---------------------- OCIWideCharToMultiByte ----------------------------*/
+/*
+ NAME
+ OCIWideCharToMultiByte - Convert a null terminated wchar string into
+ multibyte
+ REMARKS
+ This routine converts an entire null-terminated wide character string into
+ multi-byte string. The output buffer will be null-terminated.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set of string.
+ dst (OUT)
+ Destination buffer for multi-byte string.
+ src (IN)
+ Source wchar string to be converted.
+ rsize (OUT)
+ Number of bytes written into the destination buffer.
+ If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharToMultiByte(dvoid *envhp, OraText *dst, CONST OCIWchar *src,
+ size_t *rsize);
+
+
+/* ---------------------- OCIWideCharInSizeToMultiByte ----------------------*/
+/*
+ NAME
+ OCIWideCharInSizeToMultiByte - Convert a wchar string in length into
+ mulitbyte
+ REMARKS
+ This routine converts part of wchar string into the multi-byte format.
+ It will convert as many complete characters as it can until it reaches
+ output buffer size or input buffer size or it reaches a null-terminator
+ in source string. The output buffer will be null-terminated if space
+ permits. If dstsz is zero, the function just returns the size of byte not
+ including ending null-terminator need to store the converted string.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set of string.
+ dst (OUT)
+ Destination buffer for multi-byte. It can be NULL pointer if dstsz is
+ zero.
+ dstsz(IN)
+ Destination buffer size in byte. If it is zero, it just returns the size
+ of bytes need for converted string.
+ src (IN)
+ Source wchar string to be converted.
+ srcsz(IN)
+ Length of source string in character.
+ rsize(OUT)
+ Number of bytes written into destination buffer, or number of bytes need
+ to store the converted string if dstsz is zero.
+ If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharInSizeToMultiByte(dvoid *envhp, OraText *dst,
+ size_t dstsz, CONST OCIWchar *src,
+ size_t srcsz, size_t *rsize);
+
+
+
+/* ----------------------- OCIWideCharIsAlnum -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsAlnum - test whether wc is a letter or decimal digit
+ REMARKS
+ It tests whether wc is a letter or decimal digit.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsAlnum(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsAlpha -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsAlpha - test whether wc is an alphabetic letter
+ REMARKS
+ It tests whether wc is an alphabetic letter
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsAlpha(dvoid *envhp, OCIWchar wc);
+
+
+/* --------------------- OCIWideCharIsCntrl ---------------------------------*/
+/*
+ NAME
+ OCIWideCharIsCntrl - test whether wc is a control character
+ REMARKS
+ It tests whether wc is a control character.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsCntrl(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsDigit -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsDigit - test whether wc is a decimal digit character
+ REMARKS
+ It tests whether wc is a decimal digit character.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsDigit(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsGraph -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsGraph - test whether wc is a graph character
+ REMARKS
+ It tests whether wc is a graph character. A graph character is character
+ with a visible representation and normally includes alphabetic letter,
+ decimal digit, and punctuation.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsGraph(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsLower -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsLower - test whether wc is a lowercase letter
+ REMARKS
+ It tests whether wc is a lowercase letter.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsLower(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsPrint -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsPrint - test whether wc is a printable character
+ REMARKS
+ It tests whether wc is a printable character.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsPrint(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsPunct -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsPunct - test whether wc is a punctuation character
+ REMARKS
+ It tests whether wc is a punctuation character.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsPunct(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsSpace -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsSpace - test whether wc is a space character
+ REMARKS
+ It tests whether wc is a space character. A space character only causes
+ white space in displayed text(for example, space, tab, carriage return,
+ newline, vertical tab or form feed).
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsSpace(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsUpper -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsUpper - test whether wc is a uppercase letter
+ REMARKS
+ It tests whether wc is a uppercase letter.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsUpper(dvoid *envhp, OCIWchar wc);
+
+
+/*----------------------- OCIWideCharIsXdigit -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsXdigit - test whether wc is a hexadecimal digit
+ REMARKS
+ It tests whether wc is a hexadecimal digit ( 0-9, A-F, a-f ).
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsXdigit(dvoid *envhp, OCIWchar wc);
+
+
+/* --------------------- OCIWideCharIsSingleByte ----------------------------*/
+/*
+ NAME
+ OCIWideCharIsSingleByte - test whether wc is a single-byte character
+ REMARKS
+ It tests whether wc is a single-byte character when converted into
+ multi-byte.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsSingleByte(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharToLower -------------------------------*/
+/*
+ NAME
+ OCIWideCharToLower - Convert a wchar into the lowercase
+ REMARKS
+ If there is a lower-case character mapping for wc in the specified locale,
+ it will return the lower-case in wchar, else return wc itself.
+ RETURNS
+ A wchar
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for lowercase mapping.
+*/
+OCIWchar OCIWideCharToLower(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharToUpper -------------------------------*/
+/*
+ NAME
+ OCIWideCharToUpper - Convert a wchar into the uppercase
+ REMARKS
+ If there is a upper-case character mapping for wc in the specified locale,
+ it will return the upper-case in wchar, else return wc itself.
+ RETURNS
+ A wchar
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for uppercase mapping.
+*/
+OCIWchar OCIWideCharToUpper(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharStrcmp --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrcmp - compare two null terminated wchar string
+ REMARKS
+ It compares two wchar string in binary ( based on wchar encoding value ),
+ linguistic, or case-insensitive.
+ RETURNS
+ 0, if wstr1 == wstr2.
+ Positive, if wstr1 > wstr2.
+ Negative, if wstr1 < wstr2.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set.
+ wstr1(IN)
+ Pointer to a null-terminated wchar string.
+ wstr2(IN)
+ Pointer to a null-terminated wchar string.
+ flag(IN)
+ It is used to decide the comparison method. It can be taken one of the
+ following values:
+ OCI_NLS_BINARY : for the binary comparison, this is default value.
+ OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+ This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+ comparison.
+*/
+int OCIWideCharStrcmp(dvoid *envhp, CONST OCIWchar *wstr1,
+ CONST OCIWchar *wstr2, int flag);
+
+
+/* ----------------------- OCIWideCharStrncmp -------------------------------*/
+/*
+ NAME
+ OCIWideCharStrncmp - compare twe wchar string in length
+ REMARKS
+ This function is similar to OCIWideCharStrcmp(), except that at most len1
+ characters from wstr1 and len2 characters from wstr1 are compared. The
+ null-terminator will be taken into the comparison.
+ RETURNS
+ 0, if wstr1 = wstr2
+ Positive, if wstr1 > wstr2
+ Negative, if wstr1 < wstr2
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wstr1(IN)
+ Pointer to the first wchar string
+ len1(IN)
+ The length for the first string for comparison
+ wstr2(IN)
+ Pointer to the second wchar string
+ len2(IN)
+ The length for the second string for comparison.
+ flag(IN)
+ It is used to decide the comparison method. It can be taken one of the
+ following values:
+ OCI_NLS_BINARY : for the binary comparison, this is default value.
+ OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+ This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+ comparison.
+*/
+int OCIWideCharStrncmp(dvoid *envhp, CONST OCIWchar *wstr1, size_t len1,
+ CONST OCIWchar *wstr2, size_t len2, int flag);
+
+
+/* ----------------------- OCIWideCharStrcat --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrcat - concatenate two wchar strings
+ REMARKS
+ This function appends a copy of the wchar string pointed to by wsrcstr,
+ including the null-terminator to the end of wchar string pointed to by
+ wdststr. It returns the number of character in the result string not
+ including the ending null-terminator.
+ RETURNS
+ number of characters in the result string not including the ending
+ null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wdststr(IN/OUT)
+ Pointer to the destination wchar string for appending.
+ wsrcstr(IN)
+ Pointer to the source wchar string to append.
+*/
+size_t OCIWideCharStrcat(dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr);
+
+
+/* ----------------------- OCIWideCharStrchr --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrchr - Search the first occurrence of wchar in a wchar string
+ REMARKS
+ This function searchs for the first occurrence of wc in the wchar string
+ pointed to by wstr. It returns a pointer to the whcar if successful, or
+ a null pointer.
+ RETURNS
+ wchar pointer if successful, otherwise a null pointer.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wstr(IN)
+ Pointer to the wchar string to search
+ wc(IN)
+ Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrchr(dvoid *envhp, CONST OCIWchar *wstr,
+ OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharStrcpy --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrcpy - copy a wchar string
+ REMARKS
+ This function copies the wchar string pointed to by wsrcstr, including the
+ null-terminator, into the array pointed to by wdststr. It returns the
+ number of character copied not including the ending null-terminator.
+ RETURNS
+ number of characters copied not including the ending null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wdststr(OUT)
+ Pointer to the destination wchar buffer.
+ wsrcstr(IN)
+ Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrcpy(dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr);
+
+
+/* ----------------------- OCIWideCharStrlen --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrlen - Return number of character in a wchar string
+ REMARKS
+ This function computes the number of characters in the wchar string
+ pointed to by wstr, not including the null-terminator, and returns
+ this number.
+ RETURNS
+ number of characters not including ending null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wstr(IN)
+ Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrlen(dvoid *envhp, CONST OCIWchar *wstr);
+
+
+/* ----------------------- OCIWideCharStrncat -------------------------------*/
+/*
+ NAME
+ OCIWideCharStrncat - Concatenate wchar string in length
+ REMARKS
+ This function is similar to OCIWideCharStrcat(), except that at most n
+ characters from wsrcstr are appended to wdststr. Note that the
+ null-terminator in wsrcstr will stop appending. wdststr will be
+ null-terminated..
+ RETURNS
+ Number of characters in the result string not including the ending
+ null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wdststr(IN/OUT)
+ Pointer to the destination wchar string for appending.
+ wsrcstr(IN)
+ Pointer to the source wchar string to append.
+ n(IN)
+ Number of characters from wsrcstr to append.
+*/
+size_t OCIWideCharStrncat(dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr, size_t n);
+
+
+/* ----------------------- OCIWideCharStrncpy -------------------------------*/
+/*
+ NAME
+ OCIWideCharStrncpy - Copy wchar string in length
+ REMARKS
+ This function is similar to OCIWideCharStrcpy(), except that at most n
+ characters are copied from the array pointed to by wsrcstr to the array
+ pointed to by wdststr. Note that the null-terminator in wdststr will
+ stop coping and result string will be null-terminated.
+ RETURNS
+ number of characters copied not including the ending null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wdststr(OUT)
+ Pointer to the destination wchar buffer.
+ wsrcstr(IN)
+ Pointer to the source wchar string.
+ n(IN)
+ Number of characters from wsrcstr to copy.
+*/
+size_t OCIWideCharStrncpy(dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr, size_t n);
+
+
+/* ----------------------- OCIWideCharStrrchr -------------------------------*/
+/*
+ NAME
+ OCIWideCharStrrchr - search the last occurrence of a wchar in wchar string
+ REMARKS
+ This function searchs for the last occurrence of wc in the wchar string
+ pointed to by wstr. It returns a pointer to the whcar if successful, or
+ a null pointer.
+ RETURNS
+ wchar pointer if successful, otherwise a null pointer.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wstr(IN)
+ Pointer to the wchar string to search
+ wc(IN)
+ Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrrchr(dvoid *envhp, CONST OCIWchar *wstr,
+ OCIWchar wc);
+
+
+/* --------------------- OCIWideCharStrCaseConversion -----------------------*/
+/*
+ NAME
+ OCIWideCharStrCaseConversion - convert a wchar string into lowercase or
+ uppercase
+ REMARKS
+ This function convert the wide char string pointed to by wsrcstr into the
+ uppercase or lowercase specified by flag and copies the result into the
+ array pointed to by wdststr. The result string will be null-terminated.
+ RETURNS
+ number of characters for result string not including null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle.
+ wdststr(OUT)
+ Pointer to destination array.
+ wsrcstr(IN)
+ Pointer to source string.
+ flag(IN)
+ Specify the case to convert:
+ OCI_NLS_UPPERCASE : convert to uppercase.
+ OCI_NLS_LOWERCASE: convert to lowercase.
+ This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the
+ linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIWideCharStrCaseConversion(dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr, ub4 flag);
+
+
+/*---------------------- OCIWideCharDisplayLength ---------------------------*/
+/*
+ NAME
+ OCIWideCharDisplayLength - Calculate the display length for a wchar
+ REMARKS
+ This function determines the number of column positions required for wc
+ in display. It returns number of column positions, or 0 if wc is
+ null-terminator.
+ RETURNS
+ Number of display positions.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar character.
+*/
+size_t OCIWideCharDisplayLength(dvoid *envhp, OCIWchar wc );
+
+
+/*---------------------- OCIWideCharMultiByteLength -------------------------*/
+/*
+ NAME
+ OCIWideCharMultiByteLength - Determine byte size in multi-byte encoding
+ REMARKS
+ This function determines the number of byte required for wc in multi-byte
+ encoding. It returns number of bytes in multi-byte for wc.
+ RETURNS
+ Number of bytes.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar character.
+*/
+size_t OCIWideCharMultiByteLength(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIMultiByteStrcmp -------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrcmp - Compare two multi-byte strings
+ REMARKS
+ It compares two multi-byte strings in binary ( based on encoding value ),
+ linguistic, or case-insensitive.
+ RETURNS
+ 0, if str1 == str2.
+ Positive, if str1 > str2.
+ Negative, if str1 < str2.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set.
+ str1(IN)
+ Pointer to a null-terminated string.
+ str2(IN)
+ Pointer to a null-terminated string.
+ flag(IN)
+ It is used to decide the comparison method. It can be taken one of the
+ following values:
+ OCI_NLS_BINARY: for the binary comparison, this is default value.
+ OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+ This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+ comparison.
+*/
+int OCIMultiByteStrcmp(dvoid *envhp, CONST OraText *str1,
+ CONST OraText *str2, int flag);
+
+
+/*----------------------- OCIMultiByteStrncmp -------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrncmp - compare two strings in length
+ REMARKS
+ This function is similar to OCIMultiBytestrcmp(), except that at most
+ len1 bytes from str1 and len2 bytes from str2 are compared. The
+ null-terminator will be taken into the comparison.
+ RETURNS
+ 0, if str1 = str2
+ Positive, if str1 > str2
+ Negative, if str1 < str2
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set.
+ str1(IN)
+ Pointer to the first string
+ len1(IN)
+ The length for the first string for comparison
+ str2(IN)
+ Pointer to the second string
+ len2(IN)
+ The length for the second string for comparison.
+ flag(IN)
+ It is used to decide the comparison method. It can be taken one of the
+ following values:
+ OCI_NLS_BINARY: for the binary comparison, this is default value.
+ OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+ This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+ comparison.
+*/
+int OCIMultiByteStrncmp(dvoid *envhp, CONST OraText *str1, size_t len1,
+ OraText *str2, size_t len2, int flag);
+
+
+/*----------------------- OCIMultiByteStrcat --------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrcat - concatenate multibyte strings
+ REMARKS
+ This function appends a copy of the multi-byte string pointed to by
+ srcstr, including the null-terminator to the end of string pointed to by
+ dststr. It returns the number of bytes in the result string not including
+ the ending null-terminator.
+ RETURNS
+ number of bytes in the result string not including the ending
+ null-terminator.
+ envhp(IN/OUT)
+ Pointer to OCI environment handle
+ dststr(IN/OUT)
+ Pointer to the destination multi-byte string for appending.
+ srcstr(IN)
+ Pointer to the source string to append.
+*/
+size_t OCIMultiByteStrcat(dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr);
+
+
+/*------------------------- OCIMultiByteStrcpy ------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrcpy - copy multibyte string
+ REMARKS
+ This function copies the multi-byte string pointed to by srcstr,
+ including the null-terminator, into the array pointed to by dststr. It
+ returns the number of bytes copied not including the ending
+ null-terminator.
+ RETURNS
+ number of bytes copied not including the ending null-terminator.
+ envhp(IN/OUT)
+ Pointer to the OCI environment handle.
+ srcstr(OUT)
+ Pointer to the destination buffer.
+ dststr(IN)
+ Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrcpy(dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr);
+
+
+/*----------------------- OCIMultiByteStrlen --------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrlen - Calculate multibyte string length
+ REMARKS
+ This function computes the number of bytes in the multi-byte string
+ pointed to by str, not including the null-terminator, and returns this
+ number.
+ RETURNS
+ number of bytes not including ending null-terminator.
+ str(IN)
+ Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrlen(dvoid *envhp, CONST OraText *str);
+
+
+/*----------------------- OCIMultiByteStrncat -------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrncat - concatenate string in length
+ REMARKS
+ This function is similar to OCIMultiBytestrcat(), except that at most n
+ bytes from srcstr are appended to dststr. Note that the null-terminator in
+ srcstr will stop appending and the function will append as many character
+ as possible within n bytes. dststr will be null-terminated.
+ RETURNS
+ Number of bytes in the result string not including the ending
+ null-terminator.
+ envhp(IN/OUT)
+ Pointer to OCI environment handle.
+ srcstr(IN/OUT)
+ Pointer to the destination multi-byte string for appending.
+ dststr(IN)
+ Pointer to the source multi-byte string to append.
+ n(IN)
+ Number of bytes from srcstr to append.
+*/
+size_t OCIMultiByteStrncat(dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr, size_t n);
+
+
+/*----------------------- OCIMultiByteStrncpy -------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrncpy - copy multibyte string in length
+ REMARKS
+ This function is similar to OCIMultiBytestrcpy(), except that at most n
+ bytes are copied from the array pointed to by srcstr to the array pointed
+ to by dststr. Note that the null-terminator in srcstr will stop coping and
+ the function will copy as many character as possible within n bytes. The
+ result string will be null-terminated.
+ RETURNS
+ number of bytes copied not including the ending null-terminator.
+ envhp(IN/OUT)
+ Pointer to a OCI environment handle.
+ dststr(IN)
+ Pointer to the source multi-byte string.
+ srcstr(OUT)
+ Pointer to the destination buffer.
+ n(IN)
+ Number of bytes from srcstr to copy.
+*/
+size_t OCIMultiByteStrncpy(dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr, size_t n);
+
+
+/*----------------------- OCIMultiByteStrnDisplayLength ---------------------*/
+/*
+ NAME
+ OCIMultiByteStrnDisplayLength - calculate the display length for a
+ multibyt string
+ REMARKS
+ This function returns the number of display positions occupied by the
+ complete characters within the range of n bytes.
+ RETURNS
+ number of display positions.
+ envhp(IN/OUT)
+ OCI environment handle.
+ str(IN)
+ Pointer to a multi-byte string.
+ n(IN)
+ Number of bytes to examine.
+*/
+size_t OCIMultiByteStrnDisplayLength(dvoid *envhp, CONST OraText *str1,
+ size_t n);
+
+
+/*---------------------- OCIMultiByteStrCaseConversion ---------------------*/
+/*
+ NAME
+ OCIMultiByteStrCaseConversion
+ REMARKS
+ This function convert the multi-byte string pointed to by srcstr into the
+ uppercase or lowercase specified by flag and copies the result into the
+ array pointed to by dststr. The result string will be null-terminated.
+ RETURNS
+ number of bytes for result string not including null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle.
+ dststr(OUT)
+ Pointer to destination array.
+ srcstr(IN)
+ Pointer to source string.
+ flag(IN)
+ Specify the case to convert:
+ OCI_NLS_UPPERCASE: convert to uppercase.
+ OCI_NLS_LOWERCASE: convert to lowercase.
+ This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the
+ linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIMultiByteStrCaseConversion(dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr, ub4 flag);
+
+
+/*------------------------- OCICharSetToUnicode -----------------------------*/
+/*
+ NAME
+ OCICharSetToUnicode - convert multibyte string into Unicode as UCS2
+ REMARKS
+ This function converts a multi-byte string pointed to by src to Unicode
+ into the array pointed to by dst. The conversion will stop when it reach
+ to the source limitation or destination limitation.
+ The function will return number of characters converted into Unicode.
+ If dstlen is zero, it will just return the number of characters for the
+ result without real conversion.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ Pointer to an OCI environment handle
+ dst(OUT)
+ Pointer to a destination buffer
+ dstlen(IN)
+ Size of destination buffer in character
+ src(IN)
+ Pointer to multi-byte source string.
+ srclen(IN)
+ Size of source string in bytes.
+ rsize(OUT)
+ Number of characters converted.
+ If it is a NULL pointer, nothing to return.
+*/
+sword OCICharSetToUnicode(dvoid *envhp, ub2 *dst, size_t dstlen,
+ CONST OraText *src, size_t srclen, size_t *rsize);
+
+
+/*------------------------- OCIUnicodeToCharSet -----------------------------*/
+/*
+ NAME
+ OCIUnicodeToCharSet - convert Unicode into multibyte
+ REMARKS
+ This function converts a Unicode string pointed to by src to multi-byte
+ into the array pointed to by dst. The conversion will stop when it reach
+ to the source limitation or destination limitation. The function will
+ return number of bytes converted into multi-byte. If dstlen is zero, it
+ will just return the number of bytes for the result without real
+ conversion. If a Unicode character is not convertible for the character
+ set specified in OCI environment handle, a replacement character will be
+ used for it. In this case, OCICharSetConversionIsReplacementUsed() will
+ return ture.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ Pointer to an OCI environment handle.
+ dst(OUT)
+ Pointer to a destination buffer.
+ dstlen(IN)
+ Size of destination buffer in byte.
+ src(IN)
+ Pointer to a Unicode string.
+ srclen(IN)
+ Size of source string in characters.
+ rsize(OUT)
+ Number of bytes converted.
+ If it is a NULL pointer, nothing to return.
+*/
+sword OCIUnicodeToCharSet(dvoid *envhp, OraText *dst, size_t dstlen,
+ CONST ub2 *src, size_t srclen, size_t *rsize);
+
+/*----------------------- OCINlsCharSetConvert ------------------------------*/
+/*
+ NAME
+ OCINlsCharSetConvert - convert between any two character set.
+ REMARKS
+ This function converts a string pointed to by src in the character set
+ specified with srcid to the array pointed to by dst in the character set
+ specified with dstid. The conversion will stop when it reaches the source
+ limitation or destination limitation. The function will return the number
+ of bytes converted into the destination buffer. Even though either source
+ or destination character set id is OCI_UTF16ID, given and return data
+ length will be represented with the byte length as this function is
+ intended for generic purpose. Note the conversion will not stop at null
+ data.
+ To get character set id from name, OCINlsCharSetNameToId can be used.
+ To check if derived data in the destination buffer contains any
+ replacement character resulting from conversion failure,
+ OCICharSetConversionIsReplacementUsed can be used to get the status.
+ Data alignment should be guaranteed by a caller. For example, UTF-16 data
+ should be aligned to ub2 type.
+
+ RETURNS
+ OCI_SUCCESS or OCI_ERROR.
+ errhp(IN/OUT)
+ OCI error handle. If there is an error, it is recorded in errhp and this
+ function returns a NULL pointer. Diagnostic information can be obtained
+ by calling OCIErrorGet().
+ dstid(IN)
+ Character set id for the destination buffer.
+ dstp(OUT)
+ Pointer to the destination buffer.
+ dstlen(IN)
+ The maximum byte size of destination buffer.
+ srcid(IN)
+ Character set id for the source buffer.
+ srcp(IN)
+ Pointer to the source buffer.
+ srclen(IN)
+ The length byte size of source buffer.
+ rsize(OUT)
+ The number of characters converted. If it is a NULL pointer, nothing to
+ return.
+*/
+sword OCINlsCharSetConvert(dvoid *envhp, OCIError *errhp,
+ ub2 dstid, dvoid *dstp, size_t dstlen,
+ ub2 srcid, CONST dvoid *srcp, size_t srclen,
+ size_t *rsize);
+
+
+/* ------------------- OCICharsetConversionIsReplacementUsed ----------------*/
+/*
+ NAME
+ OCICharsetConversionIsReplacementUsed - chech if replacement is used in
+ conversion
+ REMARKS
+ This function indicates whether or not the replacement character was used
+ for nonconvertible characters in character set conversion in last invoke
+ of OCICharsetUcs2ToMb().
+ RETURNS
+ TRUE is the replacement character was used in last OCICharsetUcs2ToMb()
+ invoking, else FALSE.
+ envhp(IN/OUT)
+ OCI environment handle. This should be the first handle passed to
+ OCICharsetUcs2ToMb().
+*/
+boolean OCICharSetConversionIsReplacementUsed(dvoid *envhp);
+
+/*------------------- OCINlsEnvironmentVariableGet -----------------*/
+/*
+ NAME
+ OCINlsEnvironmentVariableGet - get a value of NLS environment variable.
+
+ DESCRIPTION
+ This function retrieves a value of NLS environment variable to the buffer
+ pointed to by val. Data type is determined by the parameter specified by
+ item. Either numeric data or string data can be retrieved.
+
+ RETURNS
+ OCI_SUCCESS or OCI_ERROR.
+
+ PARAMETERS
+ valp(OUT) -
+ Pointer to the buffer.
+ size(IN) -
+ Size of the buffer. This argument is only applicable to string data type,
+ but not to numerical data, in such case, it is ignored.
+ item(IN) -
+ NLS item value, which can be one of following values:
+ OCI_NLS_CHARSET_ID - NLS_LANG character set id in ub2 data type.
+ OCI_NLS_NCHARSET_ID - NLS_NCHAR character set id in ub2 data type.
+ charset(IN) -
+ Character set id for retrieved string data. If it is 0, NLS_LANG will be
+ used. OCI_UTF16ID is a valid id. In case of numeric data, this argument
+ is ignored.
+ rsize(OUT) -
+ Size of return value.
+
+ NOTE
+ This functions is mainly used for retrieving character set id from either
+ NLS_LANG or NLS_NCHAR environment variables. If NLS_LANG is not set,
+ the default character set id is returned.
+ For future extension, the buffer is capable for storing other data types.
+*/
+sword OCINlsEnvironmentVariableGet(dvoid *valp, size_t size, ub2 item,
+ ub2 charset, size_t *rsize);
+
+
+/*------------------------- OCIMessageOpen ----------------------------------*/
+/*
+ NAME
+ OCIMessageOpen - open a locale message file
+ REMARKS
+ This function opens a message handle for facility of product in a language
+ pointed to by envhp. It first try to open the message file corresponding
+ to envhp for the facility. If it successes, it will use that file to
+ initialize a message handle, else it will use the default message file
+ which is for American language for the facility. The function return a
+ pointer pointed to a message handle into msghp parameter.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ A pointer to OCI environment handle for message language.
+ errhp(IN/OUT)
+ The OCI error handle. If there is an error, it is record in errhp and this
+ function returns a NULL pointer. Diagnostic information can be obtained by
+ calling OCIErrorGet().
+ msghp(OUT)
+ a message handle for return
+ product(IN)
+ A pointer to a product name. Product name is used to locate the directory
+ for message in a system dependent way. For example, in Solaris, the
+ directory of message files for the product `rdbms' is
+ `${ORACLE_HOME}/rdbms'.
+ facility(IN)
+ A pointer to a facility name in the product. It is used to construct a
+ message file name. A message file name follows the conversion with
+ facility as prefix. For example, the message file name for facility
+ `img' in American language will be `imgus.msb' where `us' is the
+ abbreviation of American language and `msb' as message binary file
+ extension.
+ dur(IN)
+ Duration for memory allocation for the return message handle. It can be
+ the following values:
+ OCI_DURATION_CALL
+ OCI_DURATION_STATEMENT
+ OCI_DURATION_SESSION
+ OCI_DURATION_TRANSACTION
+ For the detail description, please refer to Memory Related Service
+ Interfaces section.
+*/
+sword OCIMessageOpen(dvoid *envhp, OCIError *errhp, OCIMsg **msghp,
+ CONST OraText *product, CONST OraText *facility,
+ OCIDuration dur);
+
+
+/*------------------------- OCIMessageGet -----------------------------------*/
+/*
+ NAME
+ OCIMessageGet - get a locale message from a message handle
+ REMARKS
+ This function will get message with message number identified by msgno and
+ if buflen is not zero, the function will copy the message into the buffer
+ pointed to by msgbuf. If buflen is zero, the message will be copied into
+ a message buffer inside the message handle pointed to by msgh. For both
+ cases. it will return the pointer to the null-terminated message string.
+ If it cannot get the message required, it will return a NULL pointer.
+ RETURNS
+ A pointer to a null-terminated message string on success, otherwise a NULL
+ pointer.
+ msgh(IN/OUT)
+ Pointer to a message handle which was previously opened by
+ OCIMessageOpen().
+ msgno(IN)
+ The message number for getting message.
+ msgbuf(OUT)
+ Pointer to a destination buffer to the message retrieved. If buflen is
+ zero, it can be NULL pointer.
+ buflen(IN)
+ The size of the above destination buffer.
+*/
+OraText *OCIMessageGet(OCIMsg *msgh, ub4 msgno, OraText *msgbuf,
+ size_t buflen);
+
+/*------------------------- OCIMessageClose ---------------------------------*/
+/*
+ NAME
+ OCIMessageClose - close a message handle
+ REMARKS
+ This function closes a message handle pointed to by msgh and frees any
+ memory associated with this handle.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ A pointer to OCI environment handle for message language.
+ errhp(IN/OUT)
+ The OCI error handle. If there is an error, it is record in errhp and this
+ function returns a NULL pointer. Diagnostic information can be obtained by
+ calling OCIErrorGet().
+ msghp(IN/OUT)
+ A pointer to a message handle which was previously opened by
+ OCIMessageOpen().
+*/
+sword OCIMessageClose(dvoid *envhp, OCIError *errhp, OCIMsg *msghp);
+
+/*--------------- End of Extensions to NLS cartridge service ----------------*/
+
+
+/*----------------- Extensions to OCI Thread interface ---------------------*/
+/*****************************************************************************
+ DESCRIPTION
+******************************************************************************
+1 Threads Interface
+
+The OCIThread package provides a number of commonly used threading
+primitives for use by Oracle customers. It offers a portable interface to
+threading capabilities native to various platforms. It does not implement
+threading on platforms which do not have native threading capability.
+
+OCIThread does not provide a portable implementation of multithreaded
+facilities. It only serves as a set of portable covers for native
+multithreaded facilities. Therefore, platforms that do not have native
+support for multi-threading will only be able to support a limited
+implementation of OCIThread. As a result, products that rely on all of
+OCIThread's functionality will not port to all platforms. Products that must
+port to all platforms must use only a subset of OCIThread's functionality.
+This issue is discussed further in later sections of this document.
+
+The OCIThread API is split into four main parts. Each part is described
+briefly here. The following subsections describe each in greater detail.
+
+ 1. Initialization and Termination Calls
+
+ These calls deal with the initialization and termination of OCIThread.
+ Initialization of OCIThread initializes the OCIThread context which is
+ a member of the OCI environment or session handle. This context is
+ required for other OCIThread calls.
+
+ 2. Passive Threading Primitives
+
+ The passive threading primitives include primitives to manipulate mutual
+ exclusion (mutex) locks, thread ID's, and thread-specific data keys.
+
+ The reason that these primitives are described as 'passive' is that while
+ their specifications allow for the existence of multiple threads, they do
+ not require it. This means that it is possible for these primitives to
+ be implemented according to specification in both single-threaded and
+ multi-threaded environments.
+
+ As a result, OCIThread clients that use only these primitives will not
+ require the existence of multiple threads in order to work correctly,
+ i.e., they will be able to work in single-threaded environments without
+ branching code.
+
+ 3. Active Threading Primitives
+
+ Active threading primitives include primitives dealing with the creation,
+ termination, and other manipulation of threads.
+
+ The reason that these primitives are described as 'active' is that they
+ can only be used in true multi-threaded environments. Their
+ specifications explicitly require that it be possible to have multiple
+ threads. If you need to determine at runtime whether or not you are in a
+ multi-threaded environment, call OCIThreadIsMulti() before calling an
+ OCIThread active primitive.
+
+
+1.1 Initialization & Termination
+==================================
+
+The types and functions described in this section are associated with the
+initialization and termination of the OCIThread package. OCIThread must
+be properly initialized before any of its functionality can be used.
+OCIThread's process initialization function, 'OCIThreadProcessInit()',
+must be called with care; see below.
+
+The observed behavior of the initialization and termination functions is the
+same regardless of whether OCIThread is in single-threaded or multi-threaded
+environment. It is OK to call the initialization functions from both generic
+and operating system specific (OSD) code.
+
+1.1.1 Types
+
+ OCIThreadContext - OCIThread Context
+ -------------------------------------
+
+ Most calls to OCIThread functions take the OCI environment or session
+ handle as a parameter. The OCIThread context is part of the OCI
+ environment or session handle and it must be initialized by calling
+ 'OCIThreadInit()'. Termination of the OCIThread context occurs by calling
+ 'OCIThreadTerm()'.
+
+ The OCIThread context is a private data structure. Clients must NEVER
+ attempt to examine the contents of the context.
+
+1.1.2 OCIThreadProcessInit
+
+ OCIThreadProcessInit - OCIThread Process INITialization
+ --------------------------------------------------------
+
+ Description
+
+ This function should be called to perform OCIThread process
+ initialization.
+
+ Prototype
+
+ void OCIThreadProcessInit();
+
+ Returns
+
+ Nothing.
+
+ Notes
+
+ Whether or not this function needs to be called depends on how OCI
+ Thread is going to be used.
+
+ * In a single-threaded application, calling this function is optional.
+ If it is called at all, the first call to it must occur before calls
+ to any other OCIThread functions. Subsequent calls can be made
+ without restriction; they will not have any effect.
+
+ * In a multi-threaded application, this function MUST be called. The
+ first call to it MUST occur 'strictly before' any other OCIThread
+ calls; i.e., no other calls to OCIThread functions (including other
+ calls to this one) can be concurrent with the first call.
+ Subsequent calls to this function can be made without restriction;
+ they will not have any effect.
+
+
+1.1.3 OCIThreadInit
+
+ OCIThreadInit - OCIThread INITialize
+ -------------------------------------
+
+ Description
+
+ This initializes OCIThread context.
+
+ Prototype
+
+ sword OCIThreadInit(dvoid *hndl, OCIError *err);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal for OCIThread clients to try an examine the memory
+ pointed to by the returned pointer.
+
+ It is safe to make concurrent calls to 'OCIThreadInit()'. Unlike
+ 'OCIThreadProcessInit()', there is no need to have a first call
+ that occurs before all the others.
+
+ The first time 'OCIThreadInit()' is called, it initilaizes the OCI
+ Thread context. It also saves a pointer to the context in some system
+ dependent manner. Subsequent calls to 'OCIThreadInit()' will return
+ the same context.
+
+ Each call to 'OCIThreadInit()' must eventually be matched by a call to
+ 'OCIThreadTerm()'.
+
+ OCIThreadTerm - OCIThread TERMinate
+ ------------------------------------
+
+ Description
+
+ This should be called to release the OCIThread context. It should be
+ called exactly once for each call made to 'OCIThreadInit()'.
+
+ Prototype
+
+ sword OCIThreadTerm(dvoid *hndl, OCIError *err);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is safe to make concurrent calls to 'OCIThreadTerm()'.
+
+ 'OCIThreadTerm()' will not do anything until it has been called as
+ many times as 'OCIThreadInit()' has been called. When that happens,
+ it terminates the OCIThread layer and frees the memory allocated for
+ the context. Once this happens, the context should not be re-used.
+ It will be necessary to obtain a new one by calling 'OCIThreadInit()'.
+
+
+ OCIThreadIsMulti - OCIThread Is Multi-Threaded?
+ ------------------------------------------------
+
+ Description
+
+ This tells the caller whether the application is running in a
+ multi-threaded environment or a single-threaded environment.
+
+ Prototype
+ boolean OCIThreadIsMulti(void);
+
+ Returns
+
+ TRUE if the environment is multi-threaded;
+ FALSE if the environment is single-threaded.
+
+
+1.2 Passive Threading Primitives
+==================================
+
+1.2.1 Types
+
+The passive threading primitives deal with the manipulation of mutex,
+thread ID's, and thread-specific data. Since the specifications of these
+primitives do not require the existence of multiple threads, they can be
+used both on multithreaded and single-threaded platforms.
+
+1.2.1.1 OCIThreadMutex - OCIThread Mutual Exclusion Lock
+-----------------------------------------------------------
+
+ The type 'OCIThreadMutex' is used to represent a mutual exclusion lock
+ (mutex). A mutex is typically used for one of two purposes: (i) to
+ ensure that only one thread accesses a given set of data at a time, or
+ (ii) to ensure that only one thread executes a given critical section of
+ code at a time.
+
+ Mutexes pointer can be declared as parts of client structures or as
+ stand-alone variables. Before they can be used, they must be initialized
+ using 'OCIThreadMutexInit()'. Once they are no longer needed, they must be
+ destroyed using 'OCIThreadMutexDestroy()'. A mutex pointer must NOT be
+ used after it is destroyed.
+
+ A thread can acquire a mutex by using either 'OCIThreadMutexAcquire()' or
+ 'OCIThreadMutexTry()'. They both ensure that only one thread at a time is
+ allowed to hold a given mutex. A thread that holds a mutex can release it
+ by calling 'OCIThreadMutexRelease()'.
+
+
+1.2.1.2 OCIThreadKey - OCIThread Key for Thread-Specific Data
+----------------------------------------------------------------
+
+ A key can be thought of as a process-wide variable that has a
+ thread-specific value. What this means is that all the threads in a
+ process can use any given key. However, each thread can examine or modify
+ that key independently of the other threads. The value that a thread sees
+ when it examines the key will always be the same as the value that it last
+ set for the key. It will not see any values set for the key by the other
+ threads.
+
+ The type of the value held by a key is a 'dvoid *' generic pointer.
+
+ Keys can be created using 'OCIThreadKeyInit()'. When a key is created, its
+ value is initialized to 'NULL' for all threads.
+
+ A thread can set a key's value using 'OCIThreadKeySet()'. A thread can
+ get a key's value using 'OCIThreadKeyGet()'.
+
+ The OCIThread key functions will save and retrieve data SPECIFIC TO THE
+ THREAD. When clients maintain a pool of threads and assign the threads to
+ different tasks, it *may not* be appropriate for a task to use OCIThread
+ key functions to save data associated with it. Here is a scenario of how
+ things can fail: A thread is assigned to execute the initialization of a
+ task. During the initialization, the task stored some data related to it
+ in the thread using OCIThread key functions. After the initialization,
+ the thread is returned back to the threads pool. Later, the threads pool
+ manager assigned another thread to perform some operations on the task,
+ and the task needs to retrieve those data it stored earlier in
+ initialization. Since the task is running in another thread, it will not
+ be able to retrieve the same data back! Applications that use thread
+ pools should be aware of this and be cautious when using OCIThread key
+ functions.
+
+
+1.2.1.3 OCIThreadKeyDestFunc - OCIThread Key Destructor Function Type
+------------------------------------------------------------------------
+
+ This is the type of a pointer to a key's destructor routine. Keys can be
+ associated with a destructor routine when they are created (see
+ 'OCIThreadKeyInit()').
+
+ A key's destructor routine will be called whenever a thread that has a
+ non-NULL value for the key terminates.
+
+ The destructor routine returns nothing and takes one parameter. The
+ parameter will be the value that was set for key when the thread
+ terminated.
+
+ The destructor routine is guaranteed to be called on a thread's value
+ in the key after the termination of the thread and before process
+ termination. No more precise guarantee can be made about the timing
+ of the destructor routine call; thus no code in the process may assume
+ any post-condition of the destructor routine. In particular, the
+ destructor is not guaranteed to execute before a join call on the
+ terminated thread returns.
+
+
+1.2.1.4 OCIThreadId - OCIThread Thread ID
+--------------------------------------------
+
+ Type 'OCIThreadId' is the type that will be used to identify a thread.
+ At any given time, no two threads will ever have the same 'OCIThreadId'.
+ However, 'OCIThreadId' values can be recycled; i.e., once a thread dies,
+ a new thread may be created that has the same 'OCIThreadId' as the one
+ that died. In particular, the thread ID must uniquely identify a thread
+ T within a process, and it must be consistent and valid in all threads U
+ of the process for which it can be guaranteed that T is running
+ concurrently with U. The thread ID for a thread T must be retrievable
+ within thread T. This will be done via OCIThreadIdGet().
+
+ The 'OCIThreadId' type supports the concept of a NULL thread ID: the NULL
+ thread ID will never be the same as the ID of an actual thread.
+
+
+
+1.2.2 Function prototypes for passive primitives
+--------------------------------------------------
+
+1.2.2.1 Mutex functions
+-------------------------
+
+ OCIThreadMutexInit - OCIThread MuteX Initialize
+ -----------------------------------------------
+
+ Description
+
+ This allocate and initializes a mutex. All mutexes must be
+ initialized prior to use.
+
+ Prototype
+
+ sword OCIThreadMutexInit(dvoid *hndl, OCIError *err,
+ OCIThreadMutex **mutex);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ mutex(OUT): The mutex to initialize.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ Multiple threads must not initialize the same mutex simultaneously.
+ Also, a mutex must not be reinitialized until it has been destroyed (see
+ 'OCIThreadMutexDestroy()').
+
+ OCIThreadMutexDestroy - OCIThread MuteX Destroy
+ -----------------------------------------------
+
+ Description
+
+ This destroys and deallocate a mutex. Each mutex must be destroyed
+ once it is no longer needed.
+
+ Prototype
+
+ sword OCIThreadMutexDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadMutex **mutex);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ mutex(IN/OUT): The mutex to destroy.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is not legal to destroy a mutex that is uninitialized or is currently
+ held by a thread. The destruction of a mutex must not occur concurrently
+ with any other operations on the mutex. A mutex must not be used after
+ it has been destroyed.
+
+
+ OCIThreadMutexAcquire - OCIThread MuteX Acquire
+ -----------------------------------------------
+
+ Description
+
+ This acquires a mutex for the thread in which it is called. If the mutex
+ is held by another thread, the calling thread is blocked until it can
+ acquire the mutex.
+
+ Prototype
+
+ sword OCIThreadMutexAcquire(dvoid *hndl, OCIError *err,
+ OCIThreadMutex *mutex);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error, it is
+ recorded in err and this function returns OCI_ERROR.
+ Diagnostic information can be obtained by calling
+ OCIErrorGet().
+
+ mutex(IN/OUT): The mutex to acquire.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal to attempt to acquire an uninitialized mutex.
+
+ This function's behavior is undefined if it is used by a thread to
+ acquire a mutex that is already held by that thread.
+
+
+
+ OCIThreadMutexRelease - OCIThread MuteX Release
+ -----------------------------------------------
+
+ Description
+
+ This releases a mutex. If there are any threads blocked on the mutex,
+ one of them will acquire it and become unblocked.
+
+ Prototype
+
+ sword OCIThreadMutexRelease(dvoid *hndl, OCIError *err,
+ OCIThreadMutex *mutex);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ mutex(IN/OUT): The mutex to release.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal to attempt to release an uninitialized mutex. It is also
+ illegal for a thread to release a mutex that it does not hold.
+
+
+ OCIThreadKeyInit - OCIThread KeY Initialize
+ -------------------------------------------
+
+ Description
+
+ This creates a key. Each call to this routine allocate and generates
+ a new key that is distinct from all other keys.
+
+ Prototype
+
+ sword OCIThreadKeyInit(dvoid *hndl, OCIError *err, OCIThreadKey **key,
+ OCIThreadKeyDestFunc destFn);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ key(OUT): The 'OCIThreadKey' in which to create the new key.
+
+ destFn(IN): The destructor for the key. NULL is permitted.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ Once this function executes successfully, a pointer to an allocated and
+ initialized key is return. That key can be used with 'OCIThreadKeyGet()'
+ and 'OCIThreadKeySet()'. The initial value of the key will be 'NULL' for
+ all threads.
+
+ It is illegal for this function to be called more than once to create the
+ same key (i.e., to be called more than once with the same value for the
+ 'key' parameter).
+
+ If the 'destFn' parameter is not NULL, the routine pointed to by 'destFn'
+ will be called whenever a thread that has a non-NULL value for the key
+ terminates. The routine will be called with one parameter. The
+ parameter will be the key's value for the thread at the time at which the
+ thread terminated.
+ If the key does not need a destructor function, pass NULL for 'destFn'.
+
+
+ OCIThreadKeyDestroy - OCIThread KeY DESTROY
+ -------------------------------------------
+
+ Description
+
+ Destroy and deallocate the key pointed to by 'key'.
+
+ Prototype
+
+ sword OCIThreadKeyDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadKey **key);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ key(IN/OUT): The 'OCIThreadKey' in which to destroy the key.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ This is different from the destructor function callback passed to the
+ key create routine. This new destroy function 'OCIThreadKeyDestroy' is
+ used to terminate any resources OCI THREAD acquired when it created
+ 'key'. [The 'OCIThreadKeyDestFunc' callback type is a key VALUE
+ destructor; it does in no way operate on the key itself.]
+
+ This must be called once the user has finished using the key. Not
+ calling the key destroy function may result in memory leaks.
+
+
+
+
+1.2.2.2 Thread Key operations
+-------------------------------
+
+ OCIThreadKeyGet - OCIThread KeY Get value
+ -----------------------------------------
+
+ Description
+
+ This gets the calling thread's current value for a key.
+
+ Prototype
+
+ sword OCIThreadKeyGet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+ dvoid **pValue);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ key(IN): The key.
+
+ pValue(IN/OUT): The location in which to place the thread-specific
+ key value.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal to use this function on a key that has not been created
+ using 'OCIThreadKeyInit()'.
+
+ If the calling thread has not yet assigned a value to the key, 'NULL' is
+ placed in the location pointed to by 'pValue'.
+
+
+ OCIThreadKeySet - OCIThread KeY Set value
+ -----------------------------------------
+
+ Description
+
+ This sets the calling thread's value for a key.
+
+ Prototype
+
+ sword OCIThreadKeySet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+ dvoid *value);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ key(IN/OUT): The key.
+
+ value(IN): The thread-specific value to set in the key.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal to use this function on a key that has not been created
+ using 'OCIThreadKeyInit()'.
+
+1.2.2.3 Thread Id
+--------------------
+
+ OCIThreadIdInit - OCIThread Thread Id INITialize
+ --------------------------------------------------
+
+ Description
+
+ Allocate and initialize the thread id 'tid'.
+
+ Prototype
+
+ sword OCIThreadIdInit(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid (OUT): Pointer to the thread ID to initialize.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+ OCIThreadIdDestroy - OCIThread Thread Id DESTROY
+ --------------------------------------------------
+
+ Description
+
+ Destroy and deallocate the thread id 'tid'.
+
+ Prototype
+
+ sword OCIThreadIdDestroy(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid(IN/OUT): Pointer to the thread ID to destroy.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Note
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+
+ OCIThreadIdSet - OCIThread Thread Id Set
+ -----------------------------------------
+
+ Description
+
+ This sets one 'OCIThreadId' to another.
+
+ Prototype
+
+ sword OCIThreadIdSet(dvoid *hndl, OCIError *err,
+ OCIThreadId *tidDest,
+ OCIThreadId *tidSrc);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tidDest(OUT): This should point to the location of the 'OCIThreadId'
+ to be set to.
+
+ tidSrc(IN): This should point to the 'OCIThreadId' to set from.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+
+ OCIThreadIdSetNull - OCIThread Thread Id Set Null
+ ---------------------------------------------------------
+
+ Description
+
+ This sets the NULL thread ID to a given 'OCIThreadId'.
+
+ Prototype
+
+ sword OCIThreadIdSetNull(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error, it is
+ recorded in err and this function returns OCI_ERROR.
+ Diagnostic information can be obtained by calling
+ OCIErrorGet().
+
+ tid(OUT): This should point to the 'OCIThreadId' in which to put
+ the NULL thread ID.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+
+ OCIThreadIdGet - OCIThread Thread Id Get
+ ------------------------------------------
+
+ Description
+
+ This retrieves the 'OCIThreadId' of the thread in which it is called.
+
+ Prototype
+
+ sword OCIThreadIdGet(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid(OUT): This should point to the location in which to place the
+ ID of the calling thread.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+ When OCIThread is used in a single-threaded environment,
+ OCIThreadIdGet() will always place the same value in the location
+ pointed to by 'tid'. The exact value itself is not important. The
+ important thing is that it is not the same as the NULL thread ID and
+ that it is always the same value.
+
+
+ OCIThreadIdSame - OCIThread Thread Ids Same?
+ ----------------------------------------------
+
+ Description
+
+ This determines whether or not two 'OCIThreadId's represent the same
+ thread.
+
+ Prototype
+
+ sword OCIThreadIdSame(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid1, OCIThreadId *tid2,
+ boolean *result);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid1(IN): Pointer to the first 'OCIThreadId'.
+
+ tid2(IN): Pointer to the second 'OCIThreadId'.
+
+ result(IN/OUT): Pointer to the result.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ If 'tid1' and 'tid2' represent the same thread, 'result' is set to TRUE.
+ Otherwise, 'result' is set to FALSE.
+
+ 'result' is set to TRUE if both 'tid1' and 'tid2' are the NULL thread ID.
+
+ 'ti1d' and 'tid2' should be initialized by OCIThreadIdInit().
+
+
+ OCIThreadIdNull - OCIThread Thread Id NULL?
+ ---------------------------------------------
+
+ Description
+
+ This determines whether or not a given 'OCIThreadId' is the NULL thread
+ ID.
+
+ Prototype
+
+ sword OCIThreadIdNull(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid,
+ boolean *result);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid(IN): Pointer to the 'OCIThreadId' to check.
+
+ result(IN/OUT): Pointer to the result.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ If 'tid' is the NULL thread ID, 'result' is set to TRUE. Otherwise,
+ 'result' is set to FALSE.
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+
+1.3 Active Threading Primitives
+=================================
+
+The active threading primitives deal with the manipulation of actual
+threads. Because the specifications of most of these primitives require
+that it be possible to have multiple threads, they work correctly only in
+the enabled OCIThread; In the disabled OCIThread, they always return
+failure. The exception is OCIThreadHandleGet(); it may be called in a
+single-threaded environment, in which case it will have no effect.
+
+Active primitives should only be called by code running in a multi-threaded
+environment. You can call OCIThreadIsMulti() to determine whether the
+environment is multi-threaded or single-threaded.
+
+
+1.3.1 Types
+--------------
+
+1.3.1.1 OCIThreadHandle - OCIThread Thread Handle
+------------------------------------------------------
+
+ Type 'OCIThreadHandle' is used to manipulate a thread in the active
+ primitives: OCIThreadJoin()and OCIThreadClose(). A thread handle opened by
+ OCIThreadCreate() must be closed in a matching call to
+ OCIThreadClose(). A thread handle is invalid after the call to
+ OCIThreadClose().
+
+ The distinction between a thread ID and a thread handle in OCIThread usage
+ follows the distinction between the thread ID and the thread handle on
+ Windows NT. On many platforms, the underlying native types are the same.
+
+
+1.3.2 Functions
+------------------
+
+ OCIThreadHndInit - OCIThread HaNDle Initialize
+ ----------------------------------------------
+
+ Description
+
+ Allocate and initialize the thread handle.
+
+ Prototype
+
+ sword OCIThreadHndInit(dvoid *hndl, OCIError *err,
+ OCIThreadHandle **thnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ thnd(OUT): The address of pointer to the thread handle to initialize.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+ OCIThreadHndDestroy - OCIThread HaNDle Destroy
+ ----------------------------------------------
+
+ Description
+
+ Destroy and deallocate the thread handle.
+
+ Prototype
+
+ sword OCIThreadHndDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadHandle **thnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ thnd(IN/OUT): The address of pointer to the thread handle to destroy.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+
+ OCIThreadCreate - OCIThread Thread Create
+ -----------------------------------------
+
+ Description
+
+ This creates a new thread.
+
+ Prototype
+
+ sword OCIThreadCreate(dvoid *hndl, OCIError *err,
+ void (*start)(dvoid *), dvoid *arg,
+ OCIThreadId *tid, OCIThreadHandle *tHnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ start(IN): The function in which the new thread should begin
+ execution.
+
+ arg(IN): The argument to give the function pointed to by 'start'.
+
+ tid(IN/OUT): If not NULL, gets the ID for the new thread.
+
+ tHnd(IN/OUT): If not NULL, gets the handle for the new thread.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ The new thread will start by executing a call to the function pointed
+ to by 'start' with the argument given by 'arg'. When that function
+ returns, the new thread will terminate. The function should not
+ return a value and should accept one parameter, a 'dvoid *'.
+
+ The call to OCIThreadCreate() must be matched by a call to
+ OCIThreadClose() if and only if tHnd is non-NULL.
+
+ If tHnd is NULL, a thread ID placed in *tid will not be valid in the
+ calling thread because the timing of the spawned thread's termination
+ is unknown.
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+
+
+ OCIThreadJoin - OCIThread Thread Join
+ -------------------------------------
+
+ Description
+
+ This function allows the calling thread to 'join' with another thread.
+ It blocks the caller until the specified thread terminates.
+
+ Prototype
+
+ sword OCIThreadJoin(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tHnd(IN): The 'OCIThreadHandle' of the thread to join with.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+ The result of multiple threads all trying to join with the same thread is
+ undefined.
+
+
+ OCIThreadClose - OCIThread Thread Close
+ ---------------------------------------
+
+ Description
+
+ This function should be called to close a thread handle.
+
+ Prototype
+
+ sword OCIThreadClose(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tHnd(IN/OUT): The OCIThread thread handle to close.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+ Both thread handle and the thread ID that was returned by the same call
+ to OCIThreadCreate() are invalid after the call to OCIThreadClose().
+
+
+
+ OCIThreadHandleGet - OCIThread Thread Get Handle
+ ------------------------------------------------
+
+ Description
+
+ Retrieve the 'OCIThreadHandle' of the thread in which it is called.
+
+ Prototype
+
+ sword OCIThreadHandleGet(dvoid *hndl, OCIError *err,
+ OCIThreadHandle *tHnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tHnd(IN/OUT): If not NULL, the location to place the thread
+ handle for the thread.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+ The thread handle 'tHnd' retrieved by this function must be closed
+ with OCIThreadClose() and destroyed by OCIThreadHndDestroy() after it
+ is used.
+
+
+
+
+1.4 Using OCIThread
+=====================
+
+This section summarizes some of the more important details relating to the use
+of OCIThread.
+
+ * Process initialization
+
+ OCIThread only requires that the process initialization function
+ ('OCIThreadProcessInit()') be called when OCIThread is being used in a
+ multi-threaded application. Failing to call 'OCIThreadProcessInit()' in
+ a single-threaded application is not an error.
+
+ * OCIThread initialization
+
+ Separate calls to 'OCIThreadInit()' will all return the same OCIThread
+ context.
+
+ Also, remember that each call to 'OCIThreadInit()' must eventually be
+ matched by a call to 'OCIThreadTerm()'.
+
+ * Active vs. Passive Threading primitives
+
+ OCIThread client code written without using any active primitives can be
+ compiled and used without change on both single-threaded and
+ multi-threaded platforms.
+
+ OCIThread client code written using active primitives will only work
+ correctly on multi-threaded platforms. In order to write a version of the
+ same application to run on single-threaded platform, it is necessary to
+ branch the your code, whether by branching versions of the source file or
+ by branching at runtime with the OCIThreadIsMulti() call.
+
+******************************************************************************/
+
+/*****************************************************************************
+ ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+
+void OCIThreadProcessInit();
+
+sword OCIThreadInit(dvoid *hndl, OCIError *err);
+
+sword OCIThreadTerm(dvoid *hndl, OCIError *err);
+
+boolean OCIThreadIsMulti();
+
+sword OCIThreadMutexInit(dvoid *hndl, OCIError *err,
+ OCIThreadMutex **mutex);
+
+sword OCIThreadMutexDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadMutex **mutex);
+
+sword OCIThreadMutexAcquire(dvoid *hndl, OCIError *err,
+ OCIThreadMutex *mutex);
+
+sword OCIThreadMutexRelease(dvoid *hndl, OCIError *err,
+ OCIThreadMutex *mutex);
+
+sword OCIThreadKeyInit(dvoid *hndl, OCIError *err, OCIThreadKey **key,
+ OCIThreadKeyDestFunc destFn);
+
+sword OCIThreadKeyDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadKey **key);
+
+sword OCIThreadKeyGet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+ dvoid **pValue);
+
+sword OCIThreadKeySet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+ dvoid *value);
+
+sword OCIThreadIdInit(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+sword OCIThreadIdDestroy(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+sword OCIThreadIdSet(dvoid *hndl, OCIError *err,
+ OCIThreadId *tidDest, OCIThreadId *tidSrc);
+
+sword OCIThreadIdSetNull(dvoid *hndl, OCIError *err, OCIThreadId *tid);
+
+sword OCIThreadIdGet(dvoid *hndl, OCIError *err, OCIThreadId *tid);
+
+sword OCIThreadIdSame(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid1, OCIThreadId *tid2,
+ boolean *result);
+
+sword OCIThreadIdNull(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid, boolean *result);
+
+sword OCIThreadHndInit(dvoid *hndl, OCIError *err, OCIThreadHandle **thnd);
+
+sword OCIThreadHndDestroy(dvoid *hndl, OCIError *err, OCIThreadHandle **thnd);
+
+sword OCIThreadCreate(dvoid *hndl, OCIError *err,
+ void (*start)(dvoid *), dvoid *arg,
+ OCIThreadId *tid, OCIThreadHandle *tHnd);
+
+sword OCIThreadJoin(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+sword OCIThreadClose(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+sword OCIThreadHandleGet(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+/*----------------- End OCI Thread interface Extensions ---------------------*/
+
+/*------------------ Begin OCI Row Callback Interfaces ----------------------*/
+
+typedef sword (*OCIBindRowCallback)(dvoid *ctx);
+typedef sword (*OCIFetchRowCallback)(dvoid *ctx);
+
+/*------------------ Begin OCI Row Callback Interfaces ----------------------*/
+
+/*--------------- Begin OCI Client Notification Interfaces ------------------*/
+
+typedef ub4 (*OCISubscriptionNotify)(dvoid *ctx, OCISubscription *subscrhp,
+ dvoid *pay, ub4 payl,
+ dvoid *desc, ub4 mode);
+
+sword OCISubscriptionRegister(OCISvcCtx *svchp, OCISubscription **subscrhpp,
+ ub2 count, OCIError *errhp, ub4 mode);
+
+
+sword OCISubscriptionPost(OCISvcCtx *svchp, OCISubscription **subscrhpp,
+ ub2 count, OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionUnRegister(OCISvcCtx *svchp, OCISubscription *subscrhp,
+ OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionDisable(OCISubscription *subscrhp,
+ OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionEnable(OCISubscription *subscrhp,
+ OCIError *errhp, ub4 mode);
+
+/*------------------- End OCI Publish/Subscribe Interfaces ------------------*/
+
+/*----------------- Extensions to Datetime interfaces -----------------------*/
+/*--------------------- Actual Prototypes -----------------------------------*/
+sword OCIDateTimeGetTime(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ ub1 *hr, ub1 *mm, ub1 *ss, ub4 *fsec);
+
+sword OCIDateTimeGetDate(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ sb2 *yr, ub1 *mnth, ub1 *dy );
+
+sword OCIDateTimeGetTimeZoneOffset(dvoid *hndl,OCIError *err,
+ CONST OCIDateTime *datetime,
+ sb1 *hr,sb1 *mm);
+
+sword OCIDateTimeConstruct(dvoid *hndl,OCIError *err,OCIDateTime *datetime,
+ sb2 yr,ub1 mnth,ub1 dy,ub1 hr,ub1 mm,ub1 ss,ub4 fsec,
+ OraText *timezone,size_t timezone_length);
+
+sword OCIDateTimeSysTimeStamp(dvoid *hndl, OCIError *err,
+ OCIDateTime *sys_date );
+
+sword OCIDateTimeAssign(dvoid *hndl, OCIError *err, CONST OCIDateTime *from,
+ OCIDateTime *to);
+
+sword OCIDateTimeToText(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ CONST OraText *fmt, ub1 fmt_length, ub1 fsprec,
+ CONST OraText *lang_name, size_t lang_length,
+ ub4 *buf_size, OraText *buf );
+
+sword OCIDateTimeFromText(dvoid *hndl, OCIError *err, CONST OraText *date_str,
+ size_t dstr_length, CONST OraText *fmt, ub1 fmt_length,
+ CONST OraText *lang_name, size_t lang_length, OCIDateTime *date );
+
+sword OCIDateTimeCompare(dvoid *hndl, OCIError *err, CONST OCIDateTime *date1,
+ CONST OCIDateTime *date2, sword *result );
+
+sword OCIDateTimeCheck(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ ub4 *valid );
+
+sword OCIDateTimeConvert(dvoid *hndl, OCIError *err, OCIDateTime *indate,
+ OCIDateTime *outdate);
+
+sword OCIDateTimeSubtract(dvoid *hndl, OCIError *err, OCIDateTime *indate1,
+ OCIDateTime *indate2, OCIInterval *inter);
+
+sword OCIDateTimeIntervalAdd(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ OCIInterval *inter, OCIDateTime *outdatetime);
+
+sword OCIDateTimeIntervalSub(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ OCIInterval *inter, OCIDateTime *outdatetime);
+
+sword OCIIntervalSubtract(dvoid *hndl, OCIError *err, OCIInterval *minuend,
+ OCIInterval *subtrahend, OCIInterval *result );
+
+sword OCIIntervalAdd(dvoid *hndl, OCIError *err, OCIInterval *addend1,
+ OCIInterval *addend2, OCIInterval *result );
+
+sword OCIIntervalMultiply(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ OCINumber *nfactor, OCIInterval *result );
+
+sword OCIIntervalDivide(dvoid *hndl, OCIError *err, OCIInterval *dividend,
+ OCINumber *divisor, OCIInterval *result );
+
+sword OCIIntervalCompare(dvoid *hndl, OCIError *err, OCIInterval *inter1,
+ OCIInterval *inter2, sword *result );
+
+sword OCIIntervalFromNumber(dvoid *hndl, OCIError *err, OCIInterval *inter,
+ OCINumber *number);
+
+sword OCIIntervalFromText( dvoid *hndl, OCIError *err, CONST OraText *inpstr,
+ size_t str_len, OCIInterval *result );
+
+sword OCIIntervalToText( dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ ub1 lfprec, ub1 fsprec,
+ OraText *buffer, size_t buflen, size_t *resultlen );
+
+sword OCIIntervalToNumber(dvoid *hndl, OCIError *err,CONST OCIInterval *inter,
+ OCINumber *number);
+
+sword OCIIntervalCheck(dvoid *hndl, OCIError *err, CONST OCIInterval *interval,
+ ub4 *valid );
+
+sword OCIIntervalAssign(dvoid *hndl, OCIError *err, CONST OCIInterval *ininter,
+ OCIInterval *outinter );
+
+sword OCIIntervalSetYearMonth(dvoid *hndl, OCIError *err, sb4 yr, sb4 mnth,
+ OCIInterval *result );
+
+sword OCIIntervalGetYearMonth(dvoid *hndl, OCIError *err, sb4 *yr, sb4 *mnth,
+ CONST OCIInterval *result );
+
+sword OCIIntervalSetDaySecond(dvoid *hndl, OCIError *err, sb4 dy, sb4 hr,
+ sb4 mm, sb4 ss, sb4 fsec, OCIInterval *result );
+
+sword OCIIntervalGetDaySecond(dvoid *hndl, OCIError *err, sb4 *dy, sb4 *hr,
+ sb4 *mm, sb4 *ss, sb4 *fsec, CONST OCIInterval *result );
+
+sword OCIDateTimeToArray(dvoid *hndl, OCIError *err,
+ CONST OCIDateTime *datetime, CONST OCIInterval *reftz,
+ ub1 *outarray, ub4 *len, ub1 fsprec);
+
+sword OCIDateTimeFromArray(dvoid *hndl, OCIError *err, ub1 *inarray, ub4 len,
+ ub1 type, OCIDateTime *datetime,
+ CONST OCIInterval *reftz, ub1 fsprec);
+
+sword OCIDateTimeGetTimeZoneName(dvoid *hndl, OCIError *err,
+ CONST OCIDateTime *datetime,
+ ub1 *buf, ub4 *buflen);
+
+sword OCIIntervalFromTZ(dvoid *hndl, OCIError *err, CONST oratext *inpstring,
+ size_t str_len, OCIInterval *result);
+
+/*----------------- End Datetime interface Extensions -----------------------*/
+
+/*----------------- Connection Pooling prototypes ---------------------------*/
+sword OCIConnectionPoolCreate(OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp,
+ OraText **poolName, sb4 *poolNameLen,
+ CONST OraText *dblink, sb4 dblinkLen,
+ ub4 connMin, ub4 connMax, ub4 connIncr,
+ CONST OraText *poolUserName, sb4 poolUserLen,
+ CONST OraText *poolPassword, sb4 poolPassLen,
+ ub4 mode);
+
+sword OCIConnectionPoolDestroy(OCICPool *poolhp,
+ OCIError *errhp, ub4 mode);
+
+/*----------------- End Connection Pooling prototypes -----------------------*/
+
+/*-------------------- Session Pooling prototypes ---------------------------*/
+
+sword OCISessionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCISPool *spoolhp,
+ OraText **poolName, ub4 *poolNameLen,
+ CONST OraText *connStr, ub4 connStrLen,
+ ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+ OraText *userid, ub4 useridLen,
+ OraText *password, ub4 passwordLen,
+ ub4 mode);
+
+sword OCISessionPoolDestroy (OCISPool *spoolhp,
+ OCIError *errhp,
+ ub4 mode);
+
+sword OCISessionGet (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+ OCIAuthInfo *authhp,
+ OraText *poolName, ub4 poolName_len,
+ CONST OraText *tagInfo, ub4 tagInfo_len,
+ OraText **retTagInfo, ub4 *retTagInfo_len,
+ boolean *found, ub4 mode);
+
+sword OCISessionRelease (OCISvcCtx *svchp, OCIError *errhp,
+ OraText *tag, ub4 tag_len,
+ ub4 mode);
+
+/*-------------------- End Session Pooling prototypes -----------------------*/
+
+/*-------------------------------- OCIPing ----------------------------------*/
+sword OCIPing (OCISvcCtx *svchp, OCIError *errhp);
+
+
+/*----------------- Kerberos Authentication prototypes ----------------------*/
+
+sword OCIKerbAttrSet(OCISession *trgthndlp, ub4 cred_use, ub1 *ftgt_ticket,
+ ub4 ticket_len, ub1 *session_key, ub4 skey_len,
+ ub2 ftgt_keytype, ub4 ftgt_ticket_flags,
+ sb4 ftgt_auth_time, sb4 ftgt_start_time,
+ sb4 ftgt_end_time, sb4 ftgt_renew_time,
+ text *ftgt_client_principal,
+ ub4 ftgt_client_principal_len, text *ftgt_client_realm,
+ ub4 ftgt_client_realm_len, OCIError *errhp);
+
+/*------------------- End Kerberos Authentication prototypes ----------------*/
+
+/*---------------------------------------------------------------------------
+ PRIVATE FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+ /* the following functions are depracated and should not be used */
+#ifdef NEVER
+sword OCIStmtBindByPos (OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+ ub4 position, dvoid *valuep, sb4 value_sz,
+ ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+ ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+
+sword OCIStmtBindByName (OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+ CONST OraText *placeholder, sb4 placeh_len, dvoid *valuep,
+ sb4 value_sz, ub2 dty, dvoid *indp, ub2 *alenp,
+ ub2 *rcodep, ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword ocidefn (OCIStmt *stmtp, OCIDefine *defnp, OCIError *errhp,
+ ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+ dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode);
+#endif /* NEVER */
+
+#endif /* OCIAP_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ociapr.h b/src/terralib/drivers/OracleSpatial/OCI/include/ociapr.h
new file mode 100644
index 0000000..c1e6978
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ociapr.h
@@ -0,0 +1,157 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ociapr.h,v 1.3 2005/05/06 16:48:56 karine Exp $
+ */
+
+/* Copyright (c) 1991, 1996, 1998, 2000 by Oracle Corporation */
+/*
+ NAME
+ ociapr.h
+ MODIFIED (MM/DD/YY)
+ dsaha 05/19/00 - Fix lint
+ sgollapu 05/19/98 - Change text to OraText
+ dchatter 11/10/95 - add ognfd() - get native fd
+ lchidamb 04/06/95 - drop maxdsz from obindps/odefinps
+ slari 04/07/95 - add opinit
+ dchatter 03/08/95 - osetpi and ogetpi
+ lchidamb 12/09/94 - add obindps() and odefinps()
+ dchatter 03/06/95 - merge changes from branch 1.1.720.2
+ dchatter 11/14/94 - merge changes from branch 1.1.720.1
+ dchatter 02/08/95 - olog call; drop onblon
+ dchatter 10/31/94 - new functions for non-blocking oci
+ rkooi2 11/27/92 - Changing datatypes to agree with ocidef.h
+ rkooi2 10/26/92 - More portability mods
+ rkooi2 10/18/92 - Changed to agree with oci.c
+ sjain 03/16/92 - Creation
+*/
+/*
+ * Declare the OCI functions.
+ * Prototype information is included.
+ * Use this header for ANSI C compilers.
+ */
+
+#ifndef OCIAPR
+#define OCIAPR
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+/*
+ * Oci BIND (Piecewise or with Skips)
+ */
+sword obindps(struct cda_def *cursor, ub1 opcode, OraText *sqlvar,
+ sb4 sqlvl, ub1 *pvctx, sb4 progvl,
+ sword ftype, sword scale,
+ sb2 *indp, ub2 *alen, ub2 *arcode,
+ sb4 pv_skip, sb4 ind_skip, sb4 alen_skip, sb4 rc_skip,
+ ub4 maxsiz, ub4 *cursiz,
+ OraText *fmt, sb4 fmtl, sword fmtt);
+sword obreak(struct cda_def *lda);
+sword ocan (struct cda_def *cursor);
+sword oclose(struct cda_def *cursor);
+sword ocof (struct cda_def *lda);
+sword ocom (struct cda_def *lda);
+sword ocon (struct cda_def *lda);
+
+
+/*
+ * Oci DEFINe (Piecewise or with Skips)
+ */
+sword odefinps(struct cda_def *cursor, ub1 opcode, sword pos,ub1 *bufctx,
+ sb4 bufl, sword ftype, sword scale,
+ sb2 *indp, OraText *fmt, sb4 fmtl, sword fmtt,
+ ub2 *rlen, ub2 *rcode,
+ sb4 pv_skip, sb4 ind_skip, sb4 alen_skip, sb4 rc_skip);
+sword odessp(struct cda_def *cursor, OraText *objnam, size_t onlen,
+ ub1 *rsv1, size_t rsv1ln, ub1 *rsv2, size_t rsv2ln,
+ ub2 *ovrld, ub2 *pos, ub2 *level, OraText **argnam,
+ ub2 *arnlen, ub2 *dtype, ub1 *defsup, ub1* mode,
+ ub4 *dtsiz, sb2 *prec, sb2 *scale, ub1 *radix,
+ ub4 *spare, ub4 *arrsiz);
+sword odescr(struct cda_def *cursor, sword pos, sb4 *dbsize,
+ sb2 *dbtype, sb1 *cbuf, sb4 *cbufl, sb4 *dsize,
+ sb2 *prec, sb2 *scale, sb2 *nullok);
+sword oerhms (struct cda_def *lda, sb2 rcode, OraText *buf,
+ sword bufsiz);
+sword oermsg (sb2 rcode, OraText *buf);
+sword oexec (struct cda_def *cursor);
+sword oexfet (struct cda_def *cursor, ub4 nrows,
+ sword cancel, sword exact);
+sword oexn (struct cda_def *cursor, sword iters, sword rowoff);
+sword ofen (struct cda_def *cursor, sword nrows);
+sword ofetch (struct cda_def *cursor);
+sword oflng (struct cda_def *cursor, sword pos, ub1 *buf,
+ sb4 bufl, sword dtype, ub4 *retl, sb4 offset);
+sword ogetpi (struct cda_def *cursor, ub1 *piecep, dvoid **ctxpp,
+ ub4 *iterp, ub4 *indexp);
+sword oopt (struct cda_def *cursor, sword rbopt, sword waitopt);
+sword opinit (ub4 mode);
+sword olog (struct cda_def *lda, ub1* hda,
+ OraText *uid, sword uidl,
+ OraText *pswd, sword pswdl,
+ OraText *conn, sword connl,
+ ub4 mode);
+sword ologof (struct cda_def *lda);
+sword oopen (struct cda_def *cursor, struct cda_def *lda,
+ OraText *dbn, sword dbnl, sword arsize,
+ OraText *uid, sword uidl);
+sword oparse (struct cda_def *cursor, OraText *sqlstm, sb4 sqllen,
+ sword defflg, ub4 lngflg);
+sword orol (struct cda_def *lda);
+sword osetpi (struct cda_def *cursor, ub1 piece, dvoid *bufp, ub4 *lenp);
+
+void sqlld2 (struct cda_def *lda, OraText *cname, sb4 *cnlen);
+void sqllda (struct cda_def *lda);
+
+/* non-blocking functions */
+sword onbset (struct cda_def *lda );
+sword onbtst (struct cda_def *lda );
+sword onbclr (struct cda_def *lda );
+sword ognfd (struct cda_def *lda, dvoid *fdp);
+
+
+/*
+ * OBSOLETE CALLS
+ */
+
+/*
+ * OBSOLETE BIND CALLS
+ */
+sword obndra(struct cda_def *cursor, OraText *sqlvar, sword sqlvl,
+ ub1 *progv, sword progvl, sword ftype, sword scale,
+ sb2 *indp, ub2 *alen, ub2 *arcode, ub4 maxsiz,
+ ub4 *cursiz, OraText *fmt, sword fmtl, sword fmtt);
+sword obndrn(struct cda_def *cursor, sword sqlvn, ub1 *progv,
+ sword progvl, sword ftype, sword scale, sb2 *indp,
+ OraText *fmt, sword fmtl, sword fmtt);
+sword obndrv(struct cda_def *cursor, OraText *sqlvar, sword sqlvl,
+ ub1 *progv, sword progvl, sword ftype, sword scale,
+ sb2 *indp, OraText *fmt, sword fmtl, sword fmtt);
+
+/*
+ * OBSOLETE DEFINE CALLS
+ */
+sword odefin(struct cda_def *cursor, sword pos, ub1 *buf,
+ sword bufl, sword ftype, sword scale, sb2 *indp,
+ OraText *fmt, sword fmtl, sword fmtt, ub2 *rlen, ub2 *rcode);
+
+/* older calls ; preferred equivalent calls above */
+
+sword oname (struct cda_def *cursor, sword pos, sb1 *tbuf,
+ sb2 *tbufl, sb1 *buf, sb2 *bufl);
+sword orlon (struct cda_def *lda, ub1 *hda,
+ OraText *uid, sword uidl,
+ OraText *pswd, sword pswdl,
+ sword audit);
+sword olon (struct cda_def *lda, OraText *uid, sword uidl,
+ OraText *pswd, sword pswdl, sword audit);
+sword osql3 (struct cda_def *cda, OraText *sqlstm, sword sqllen);
+sword odsc (struct cda_def *cursor, sword pos, sb2 *dbsize,
+ sb2 *fsize, sb2 *rcode, sb2 *dtype, sb1 *buf,
+ sb2 *bufl, sb2 *dsize);
+
+#endif /* OCIAPR */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocidef.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocidef.h
new file mode 100644
index 0000000..1fde105
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocidef.h
@@ -0,0 +1,888 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ocidef.h,v 1.3 2005/05/06 16:48:56 karine Exp $ ocidef.h
+ */
+
+/* Copyright (c) 1981, 2003, Oracle Corporation. All rights reserved. */
+/* Copyright (c) 1984, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+NAME
+ ocidef
+CONTENTS
+ Oracle Call Interface cursor area and LDA definitions
+NOTES
+ none
+OWNER
+ Oates
+DATE
+ 09/07/82
+MODIFIED
+ srseshad 03/25/03 - convert oci public api to ansi
+ csteinba 11/05/02 - bug 2521931: redefine OTYACL
+ aahluwal 06/03/02 - bug 2360115
+ bpalaval 02/08/01 - Change text to oratext.
+ chliang 02/01/01 - fix olint error.
+ bpalaval 11/16/00 - Bug 1244685 : Fix ALTER CLUSTER issue..
+ slari 11/08/00 - remove functions duplicated in ociapr.h
+ whe 09/01/99 - 976457:check __cplusplus for C++ code
+ skmishra 04/23/97 - Provide C++ compatibility
+ lchidamb 06/26/96 - put upidef.h, riddef.h within #ifndef
+ slari 06/12/96 - add ocigft_getFcnType
+ dchatter 11/10/95 - ocignfd - oci get native file descriptor
+ slari 05/11/95 - change OCIEVDEF/OCIEVTSF to UPIEVDEF/UPIEVTSF
+ dchatter 04/06/95 - add ifdef flags around OCI_flags
+ lchidamb 04/06/95 - drop maxdsz from ocibndps/ocidfnps
+ slari 04/07/95 - rename opinit to ocipin
+ slari 03/13/95 - thread safety changes
+ dchatter 03/08/95 - piece definitions OCI_*_PIECE
+ lchidamb 12/06/94 - add support for binding/defining with skips
+ dchatter 03/06/95 - merge changes from branch 1.12.720.1
+ dchatter 02/06/95 - add defines for login mode parameters
+ dchatter 07/06/94 - Deleting CRSCHK, with refcursor, no way to set this
+ dchatter 06/13/94 - add a new LDA flag LDANBL
+ rkooi 11/18/92 - update ocidpr interface
+ mmoore 10/31/92 - add ocidpr
+ gpongrac 11/17/92 - fix oexfet prototype
+ sjain 01/03/92 - Add ocibra
+ rjenkins 11/04/91 - adding prototypes for oparse and oexfet
+ sjain 04/15/91 - Change ocistf proto
+ sjain 04/01/91 - Rearrange oty codes. Add new ones
+ Jain 12/03/90 - Add #define for new describe call
+ Jain 11/29/90 - Add new function code for the new oci calls
+ Mendels 01/20/89 - fix 19170: make ocitbl CONST_DATA
+ Kabcene 01/27/88 - change interfaces to match V5
+ Navab 12/09/87 - add a parameter to ocierr call
+ Navab 11/30/87 - add ocierr, rename ocioer
+ Navab 10/08/87 - add prototypes for procedure declarations
+ Howard 09/07/87 - endif blah
+ Howard 05/11/87 - Add OTY types
+ Howard 04/27/87 - move ocldef defines here
+ Oates 10/15/85 - Add OCANCEL
+ Oates 09/30/85 - Implement ORA*Net
+ Oates 06/27/85 - Make datatype compatible with upidef.h
+ Andy 05/07/85 - delete CSRFBPIC
+*/
+
+#ifndef UPIDEF
+#include <upidef.h>
+#endif
+
+#ifndef RIDDEF
+#include <riddef.h>
+#endif
+
+#include <ociapr.h>
+
+#ifndef OCIDEF
+#define OCIDEF
+
+
+#define CSRCHECK 172 /* csrdef is a cursor */
+#define LDACHECK 202 /* csrdef is a login data area */
+struct csrdef
+{
+ b2 csrrc; /* return code: v2 codes, v4 codes negative */
+ ub2 csrft; /* function type */
+ ub4 csrrpc; /* rows processed count */
+ ub2 csrpeo; /* parse error offset */
+ ub1 csrfc; /* function code */
+ ub1 csrlfl; /* lda flag to indicate type of login */
+ ub2 csrarc; /* actual untranslated return code */
+ ub1 csrwrn; /* warning flags */
+ ub1 csrflg; /* error action */
+ word csrcn; /* cursor number */
+ riddef csrrid; /* rowid structure */
+ word csrose; /* os dependent error code */
+ ub1 csrchk; /* check byte = CSRCHECK - in cursor */
+ /* check byte = LDACHECK - in LDA */
+ struct hstdef *csrhst; /* pointer to the hst */
+};
+typedef struct csrdef csrdef;
+typedef struct csrdef ldadef; /* lda is the same as a csr */
+
+
+/* values for csrlfl */
+#define LDAFLG 1 /* ...via ologon */
+#define LDAFLO 2 /* ...via olon or orlon */
+#define LDANBL 3 /* ...nb logon in progress */
+
+/* valuses for crsfc */
+#define csrfpa 2 /* ...OSQL */
+#define csrfex 4 /* ...OEXEC */
+#define csrfbi 6 /* ...OBIND */
+#define csrfdb 8 /* ...ODFINN */
+#define csrfdi 10 /* ...ODSRBN */
+#define csrffe 12 /* ...OFETCH */
+#define csrfop 14 /* ...OOPEN */
+#define csrfcl 16 /* ...OCLOSE */
+#define csrfds 22 /* ...ODSC */
+#define csrfnm 24 /* ...ONAME */
+#define csrfp3 26 /* ...OSQL3 */
+#define csrfbr 28 /* ...OBNDRV */
+#define csrfbx 30 /* ...OBNDRN */
+/*#defe csrfdf 32*/ /* ???? */
+#define csrfso 34 /* ...OOPT */
+#define csrfre 36 /* ...ORESUM */
+#define csrfbn 50 /* ...OBINDN */
+#define csrfca 52 /* ..OCANCEL */
+#define csrfsd 54 /* ..OSQLD */
+#define csrfef 56 /* ..OEXFEN */
+#define csrfln 58 /* ..OFLNG */
+#define csrfdp 60 /* ..ODSCSP */
+#define csrfba 62 /* ..OBNDRA */
+#define csrfbps 63 /*..OBINDPS */
+#define csrfdps 64 /*..ODEFINPS */
+#define csrfgpi 65 /* ...OGETPI */
+#define csrfspi 66 /* ...OSETPI */
+
+/* values for csrwrn */
+#define CSRWANY 0x01 /* there is a warning flag set */
+#define CSRWTRUN 0x02 /* a data item was truncated */
+#define CSRWNVIC 0x04 /* NULL values were used in an aggregate function */
+#define CSRWITCE 0x08 /* column count not equal to into list count */
+#define CSRWUDNW 0x10 /* update or delete without where clause */
+#define CSRWRSV0 0x20
+#define CSRWROLL 0x40 /* rollback required */
+#define CSRWRCHG 0x80 /* change after query start on select for update */
+
+/* values fro csrflg */
+#define CSRFSPND 0x01 /* current operation suspended */
+#define CSRFATAL 0x02 /* fatal operation: transaction rolled back */
+#define CSRFBROW 0x04 /* current row backed out */
+#define CSRFREFC 0x08 /* ref cursor type CRSCHK disabled for this cursor */
+#define CSRFNOAR 0x10 /* ref cursor type binds, so no array bind/execute */
+
+/* define function codes; in order of octdef.h */
+#define OTYCTB 1 /* CREATE TABLE */
+#define OTYSER 2 /* set role */
+#define OTYINS 3 /* INSERT */
+#define OTYSEL 4 /* SELECT */
+#define OTYUPD 5 /* UPDATE */
+#define OTYDRO 6 /* drop role */
+#define OTYDVW 7 /* DROP VIEW */
+ /* once was validate index */
+ /* once was create partition */
+ /* once was alter partition */
+#define OTYDTB 8 /* DROP TABLE */
+ /* once was alter space */
+ /* once was drop space */
+#define OTYDEL 9 /* DELETE */
+#define OTYCVW 10 /* create view */
+#define OTYDUS 11 /* drop user */
+#define OTYCRO 12 /* create role */
+#define OTYCSQ 13 /* create sequence */
+#define OTYASQ 14 /* alter sequence */
+#define OTYACL 15 /* alter cluster */
+#define OTYDSQ 16 /* drop sequence */
+#define OTYCSC 17 /* create schema */
+#define OTYCCL 18 /* CREATE CLUSTER */
+ /* once was alter cluster */
+#define OTYCUS 19 /* create user */
+#define OTYCIX 20 /* CREATE INDEX */
+#define OTYDIX 21 /* DROP INDEX */
+#define OTYDCL 22 /* DROP CLUSTER */
+#define OTYVIX 23 /* validate index */
+#define OTYCPR 24 /* create procedure */
+#define OTYAPR 25 /* alter procedure */
+#define OTYATB 26 /* alter table */
+ /* once was evaluate */
+#define OTYXPL 27 /* explain */
+#define OTYGRA 28 /* grant */
+#define OTYREV 29 /* revoke */
+#define OTYCSY 30 /* create synonym */
+#define OTYDSY 31 /* drop synonym */
+#define OTYASY 32 /* alter system switch log */
+#define OTYSET 33 /* set transaction */
+#define OTYPLS 34 /* pl/sql execute */
+#define OTYLTB 35 /* lock */
+#define OTYNOP 36 /* noop */
+#define OTYRNM 37 /* rename */
+#define OTYCMT 38 /* comment */
+#define OTYAUD 39 /* audit */
+#define OTYNOA 40 /* no audit */
+#define OTYAIX 41 /* ALTER INDEX */
+#define OTYCED 42 /* create external database */
+#define OTYDED 43 /* drop external database */
+#define OTYCDB 44 /* create database */
+#define OTYADB 45 /* alter database */
+#define OTYCRS 46 /* create rollback segment */
+#define OTYARS 47 /* alter rollback segment */
+#define OTYDRS 48 /* drop rollback segment */
+#define OTYCTS 49 /* create tablespace */
+#define OTYATS 50 /* alter tablespace */
+#define OTYDTS 51 /* drop tablespace */
+#define OTYASE 52 /* alter session */
+#define OTYAUR 53 /* alter user */
+#define OTYCWK 54 /* commit (work) */
+#define OTYROL 55 /* rollback */
+#define OTYSPT 56 /* savepoint */
+
+/* For number greater than 56 the the type is the same as defined in
+** octdef.h for that number. So for completion look at octdef.h
+*/
+
+#define OTYDEV OTYCVW /* old DEFINE VIEW = create view */
+
+/* FUNCTION CODES */
+#define OCLFPA 2 /* parse - OSQL */
+#define OCLFEX 4 /* execute - OEXEC */
+#define OCLFBI 6 /* BIND by name - OBIND */
+#define OCLFDB 8 /* define buffer - ODEFIN */
+#define OCLFDI 10 /* describe item - ODSC */
+#define OCLFFE 12 /* fetch - OFETCH */
+#define OCLFOC 14 /* open cursor - OOPEN */
+# define OCLFLI OCLFOC /* old name for open cursor - OOPEN */
+#define OCLFCC 16 /* close cursor - OCLOSE */
+# define OCLFLO OCLFCC /* old name for close cursor - OCLOSE */
+#define OCLFDS 22 /* describe - ODSC */
+#define OCLFON 24 /* get table and column names - ONAME */
+#define OCLFP3 26 /* parse - OSQL3 */
+#define OCLFBR 28 /* bind reference by name - OBNDRV */
+#define OCLFBX 30 /* bind referecne numeric - OBNDRN */
+#define OCLFSO 34 /* special function - OOPT */
+#define OCLFRE 36 /* resume - ORESUM */
+#define OCLFBN 50 /* bindn */
+#define OCLFMX 52 /* maximum function number */
+
+#ifdef NEVER /* unused codes */
+# define OCLFLK 18 /* open for kernel operations */
+# define OCLFEK 20 /* execute kernel operations */
+# define OCLFOK 22 /* kernel close */
+# define OCLFIN 28 /* logon to oracle */
+# define OCLFOF 30 /* logoff from oracle */
+# define OCLFAX 32 /* allocate a context area */
+# define OCLFPI 34 /* page in context area */
+# define OCLFIS 36 /* special system logon */
+# define OCLFCO 38 /* cancel the current operation */
+# define OCLFGI 40 /* get database id */
+# define OCLFJN 42 /* journal operation */
+# define OCLFCL 44 /* cleanup prior execute operation */
+# define OCLFMC 46 /* map a cursor area */
+# define OCLFUC 48 /* unmap cursor and restore user maping */
+#endif /*NEVER *//* obsolete codes */
+
+
+/* values for ocimode in ocipin call */
+
+#define OCIEVDEF UPIEVDEF /* default : non-thread safe enivronment */
+#define OCIEVTSF UPIEVTSF /* thread-safe environment */
+
+
+/* OCIL* flags used to determine the mode of login, using ocilog().
+** Currently defined only for non-blocking and thread-safe logins.
+*/
+
+#define OCILMDEF UPILMDEF /* default, regular login */
+#define OCILMNBL UPILMNBL /* non-blocking logon */
+#define OCILMESY UPILMESY /* thread safe but external sync */
+#define OCILMISY UPILMISY /* internal sync, we do it */
+#define OCILMTRY UPILMTRY /* try to, but do not block on mutex */
+
+
+/*
+ * since sqllib uses both ocidef and ocidfn the following defines
+ * need to be guarded
+ */
+#ifndef OCI_FLAGS
+#define OCI_FLAGS
+
+/* OCI_*_PIECE defines the piece types that are returned or set
+*/
+
+#define OCI_ONE_PIECE UPI_ONE_PIECE /* there or this is the only piece */
+#define OCI_FIRST_PIECE UPI_FIRST_PIECE /* the first of many pieces */
+#define OCI_NEXT_PIECE UPI_NEXT_PIECE /* the next of many pieces */
+#define OCI_LAST_PIECE UPI_LAST_PIECE /* the last piece of this column */
+#endif
+
+/*
+** OCITAB: define return code pairs for version 2 to 3 conversions
+*/
+struct ocitab
+{
+ b2 ocitv3; /* Version 3/4 return code */
+ b2 ocitv2; /* Version 2 equivalent return code */
+};
+typedef struct ocitab ocitab;
+
+externref CONST_DATA ocitab ocitbl[];
+
+/* macros to check cursors and LDA's. */
+/* macros to set error codes */
+
+# define CRSCHK(c) if ((c->csrchk != CSRCHECK)\
+ && !bit(c->csrflg, CSRFREFC))\
+ return(ocir32(c, OER(1001)))
+# define ldaerr(l, e) ( l->csrrc = (b2)(-( l->csrarc = (ub2)(e)) ) )
+# define LDACHK(l) if (l->csrchk != LDACHECK) \
+ return(ldaerr(l, OER(1001)))
+
+
+/************************************************/
+/* OCI PROCEDURE DECLARATIONS */
+/************************************************/
+
+
+
+
+/*****************************/
+/* Database logon/logout */
+/*****************************/
+sword ocilog( /*_ ldadef *lda, struct hstdef *hst, oratext *uid, sword uidl,
+ oratext *psw, sword pswl, oratext* conn, sword connl,
+ ub4 mode _*/);
+sword ocilon( /*_ ldadef *lda, oratext *uid, word uidl, oratext *psw,
+ word pswl, word audit _*/);
+sword ocilgi( /*_ ldadef *lda, b2 areacount _*/ );
+sword ocirlo( /*_ ldadef *lda, struct hstdef *hst, oratext *uid, word uidl,
+ oratext *psw, word pswl, word audit _*/ );
+ /* ocilon - logon to oracle
+ ** ocilgi - version 2 compatible ORACLE logon call.
+ ** no login to ORACLE is performed: the LDA is initialized
+ ** ocirlo - version 5 compatible ORACLE Remote Login call,
+ ** oracle login is executed.
+ ** lda - pointer to ldadef
+ ** uid - user id [USER[/PASSWORD]]
+ ** uidl - length of uid, if -1 strlen(uid) is used
+ ** psw - password string; ignored if specified in uid
+ ** pswl - length of psw, if -1 strlen(psw) is used
+ ** audit - is not supported; the only permissible value is 0
+ ** areacount - unused
+ */
+
+sword ocilof( /*_ ldadef *lda _*/ );
+ /*
+ ** ocilof - disconnect from ORACLE
+ ** lda - pointer to ldadef
+ */
+
+
+/*********************/
+/* Error Messages */
+/*********************/
+sword ocierr( /*_ ldadef *lda, b2 rcode, oratext *buffer, word bufl _*/ );
+sword ocidhe( /*_ b2 rcode, oratext *buffer _*/ );
+ /*
+ ** Move the text explanation for an ORACLE error to a user defined buffer
+ ** ocierr - will return the message associated with the hstdef stored
+ ** in the lda.
+ ** ocidhe - will return the message associated with the default host.
+ ** lda - lda associated with the login session
+ ** rcode - error code as returned by V3 call interface
+ ** buffer - address of a user buffer of at least 132 characters
+ */
+
+
+/***********************/
+/* Cursor Open/Close */
+/***********************/
+sword ociope( /*_ struct csrdef *cursor, ldadef *lda, oratext *dbn, word dbnl,
+ word areasize, oratext *uid, word uidl _*/ );
+
+sword ociclo( /*_ struct csrdef *cursor _*/ );
+ /*
+ ** open or close a cursor.
+ ** cursor - pointer to csrdef
+ ** ldadef - pointer to ldadef
+ ** dbn - unused
+ ** dbnl - unused
+ ** areasize - if (areasize == -1) areasize <- system default initial size
+ ** else if (areasize IN [1..256]) areasize <- areasize * 1024;
+ ** most applications should use the default size since context
+ ** areas are extended as needed until memory is exhausted.
+ ** uid - user id
+ ** uidl - userid length
+ */
+
+/***********************************/
+/* CONTROL AND OPTIONS */
+/***********************************/
+sword ocibre( /*_ ldadef *lda _*/ );
+ /*
+ ** ocibrk - Oracle Call Interface send BReaK Sends a break to
+ ** oracle. If oracle is active, the current operation is
+ ** cancelled. May be called asynchronously. DOES NOT SET
+ ** OERRCD in the hst. This is because ocibrk may be called
+ ** asynchronously. Callers must test the return code.
+ ** lda - pointer to a ldadef
+ */
+
+sword ocican( /*_ struct csrdef *cursor _*/ );
+ /*
+ ** cancel the operation on the cursor, no additional OFETCH calls
+ ** will be issued for the existing cursor without an intervening
+ ** OEXEC call.
+ ** cursor - pointer to csrdef
+ */
+
+sword ocisfe( /*_ struct csrdef *cursor, word erropt, word waitopt _*/ );
+ /*
+ ** ocisfe - user interface set error options
+ ** set the error and cursor options.
+ ** allows user to set the options for dealing with fatal dml errors
+ ** and other cursor related options
+ ** see oerdef for valid settings
+ ** cursor - pointer to csrdef
+ ** erropt - error optionsn
+ ** waitopr - wait options
+ */
+
+
+/***************************************/
+/* COMMIT/ROLLBACK/AUTOCOMMIT */
+/***************************************/
+sword ocicom( /*_ ldadef *lda _*/ );
+sword ocirol( /*_ ldadef *lda _*/ );
+ /*
+ ** ocicom - commit the current transaction
+ ** ocirol - roll back the current transaction
+ */
+
+sword ocicon( /*_ ldadef *lda _*/ );
+sword ocicof( /*_ ldadef *lda _*/ );
+ /*
+ ** ocicon - auto Commit ON
+ ** ocicof - auto Commit OFf
+ */
+
+
+
+/************************/
+/* parsing */
+/************************/
+sword ocisq3( /*_ struct csrdef *cursor, oratext *sqlstm, word sqllen _*/ );
+ /*
+ ** ocisq3 - user interface parse sql statement
+ ** cursor - pointer to csrdef
+ ** sqlstm - pointer to SQL statement
+ ** sqllen - length of SQL statement. if -1, strlen(sqlstm) is used
+ */
+
+
+
+/***************************/
+/* BINDING */
+/***************************/
+/* these are for the opcode in ocibndps, ocidfnps */
+#define OCI_PCWS 0
+#define OCI_SKIP 1
+
+sword ocibin( /*_ struct csrdef *cursor, oratext *sqlvar, word sqlvl,
+ ub1 *progv, word progvl, word ftype, word scale,
+ oratext *fmt, word fmtl, word fmtt _*/ );
+sword ocibrv( /*_ struct csrdef *cursor, oratext *sqlvar, word sqlvl,
+ ub1 *progv, word progvl, word ftype, word scale, b2 *indp,
+ oratext *fmt, word fmtl, word fmtt _*/ );
+sword ocibra( /*_ struct csrdef *cursor, oratext *sqlvar, word sqlvl,
+ ub1 *progv, word progvl, word ftype, word scale,
+ b2 *indp, ub2 *aln, ub2 *rcp, ub4 mal, ub4 *cal,
+ oratext *fmt, word fmtl, word fmtt _*/ );
+sword ocibndps( /*_ struct csrdef *cursor, ub1 opcode, oratext *sqlvar,
+ sb4 sqlvl, ub1 *progv, sb4 progvl, word ftype,
+ word scale, b2 *indp, ub2 *aln, ub2 *rcp, sb4 pv_skip,
+ sb4 ind_skip, sb4 len_skip, sb4 rc_skip, ub4 mal,
+ ub4 *cal, oratext *fmt, sb4 fmtl, word fmtt _*/ );
+sword ocibnn ( /*_ struct csrdef *cursor, ub2 sqlvn, ub1 *progv, word progvl,
+ word ftype, word scale, oratext *fmt, word fmtl,
+ word fmtt _*/ );
+sword ocibrn( /*_ struct csrdef *cursor, word sqlvn, ub1 *progv, word progvl,
+ word ftype, word scale, b2 *indp, oratext *fmt, word fmtl,
+ word fmtt _*/ );
+ /*
+ ** ocibin - bind by value by name
+ ** ocibrv - bind by reference by name
+ ** ocibra - bind by reference by name (array)
+ ** ocibndps - bind by reference by name (array) piecewise or with skips
+ ** ocibnn - bind by value numeric
+ ** ocibrn - bind by reference numeric
+ **
+ ** the contents of storage specified in bind-by-value calls are
+ ** evaluated immediately.
+ ** the addresses of storage specified in bind-by-reference calls are
+ ** remembered, and the contents are examined at every execute.
+ **
+ ** cursor - pointer to csrdef
+ ** sqlvn - the number represented by the name of the bind variables
+ ** for variables of the form :n or &n for n in [1..256)
+ ** (i.e. &1, :234). unnecessarily using larger numbers
+ ** in the range wastes space.
+ ** sqlvar - the name of the bind variable (:name or &name)
+ ** sqlval - the length of the name;
+ ** in bindif -1, strlen(bvname) is used
+ ** progv - pointer to the object to bind.
+ ** progvl - length of object to bind.
+ ** in bind-by-value if specified as -1 then strlen(bfa) is
+ ** used (really only makes sends with character types)
+ ** in bind-by-value, if specified as -1 then UB2MAXVAL
+ ** is used. Again this really makes sense only with
+ ** SQLT_STR.
+ ** ftype - datatype of object
+ ** indp - pointer to indicator variable.
+ ** -1 means to ignore bfa/bfl and bind NULL;
+ ** not -1 means to bind the contents of bfa/bfl
+ ** bind the contents pointed to by bfa
+ ** aln - Alternate length pointer
+ ** rcp - Return code pointer
+ ** mal - Maximum array length
+ ** cal - Current array length pointer
+ ** fmt - format string
+ ** fmtl - length of format string; if -1, strlen(fmt) is used
+ ** fmtt - desired output type after applying forat mask. Not
+ ** really yet implemented
+ ** scale - number of decimal digits in a cobol packed decimal (type 7)
+ **
+ ** Note that the length of bfa when bound as SQLT_STR is reduced
+ ** to strlen(bfa).
+ ** Note that trailing blanks are stripped of storage of SQLT_STR.
+ */
+
+/***************************/
+/* DESCRIBING */
+/***************************/
+sword ocidsc ( /*_ struct csrdef *cursor, word pos, b2 *dbsize, b2 *fsize,
+ b2 *rcode, b2 *dtype, b1 *buf, b2 *bufl, b2 *dsize _*/ );
+sword ocidsr( /*_ struct csrdef *cursor, word pos, b2 *dbsize, b2 *dtype,
+ b2 *fsize _*/ );
+sword ocinam( /*_ struct csrdef *cursor, word pos, b1 *tbuf, b2 *tbufl,
+ b1 *buf, b2 *bufl _*/);
+ /*
+ ** ocidsc, ocidsr: Obtain information about a column
+ ** ocinam : get the name of a column
+ ** cursor - pointer to csrdef
+ ** pos - position in select list from [1..N]
+ ** dbsize - place to store the database size
+ ** fsize - place to store the fetched size
+ ** rcode - place to store the fetched column returned code
+ ** dtype - place to store the data type
+ ** buf - array to store the column name
+ ** bufl - place to store the column name length
+ ** dsize - maximum display size
+ ** tbuf - place to store the table name
+ ** tbufl - place to store the table name length
+ */
+
+sword ocidsp ( /*_ struct csrdef *cursor, word pos, sb4 *dbsize, sb2 *dbtype,
+ sb1 *cbuf, sb4 *cbufl, sb4 *dsize, sb2 *pre, sb2 *scl,
+ sb2 *nul _*/);
+
+sword ocidpr(/*_ ldadef *lda, oratext *object_name, size_t object_length,
+ ptr_t reserved1, size_t reserved1_length, ptr_t reserved2,
+ size_t reserved2_length, ub2 *overload, ub2 *position,
+ ub2 *level, oratext **argument_name, ub2 *argument_length,
+ ub2 *datatype, ub1 *default_supplied, ub1 *in_out,
+ ub4 *length, sb2 *precision, sb2 *scale, ub1 *radix,
+ ub4 *spare, ub4 *total_elements _*/);
+ /*
+ ** OCIDPR - User Program Interface: Describe Stored Procedure
+ **
+ ** This routine is used to obtain information about the calling
+ ** arguments of a stored procedure. The client provides the
+ ** name of the procedure using "object_name" and "database_name"
+ ** (database name is optional). The client also supplies the
+ ** arrays for OCIDPR to return the values and indicates the
+ ** length of array via the "total_elements" parameter. Upon return
+ ** the number of elements used in the arrays is returned in the
+ ** "total_elements" parameter. If the array is too small then
+ ** an error will be returned and the contents of the return arrays
+ ** are invalid.
+ **
+ **
+ ** EXAMPLE :
+ **
+ ** Client provides -
+ **
+ ** object_name - SCOTT.ACCOUNT_UPDATE at BOSTON
+ ** total_elements - 100
+ **
+ **
+ ** ACCOUNT_UPDATE is an overloaded function with specification :
+ **
+ ** type number_table is table of number index by binary_integer;
+ ** table account (account_no number, person_id number,
+ ** balance number(7,2))
+ ** table person (person_id number(4), person_nm varchar2(10))
+ **
+ ** function ACCOUNT_UPDATE (account number,
+ ** person person%rowtype, amounts number_table,
+ ** trans_date date) return accounts.balance%type;
+ **
+ ** function ACCOUNT_UPDATE (account number,
+ ** person person%rowtype, amounts number_table,
+ ** trans_no number) return accounts.balance%type;
+ **
+ **
+ ** Values returned -
+ **
+ ** overload position argument level datatype length prec scale rad
+ ** -------------------------------------------------------------------
+ ** 0 0 0 NUMBER 22 7 2 10
+ ** 0 1 ACCOUNT 0 NUMBER 22 0 0 0
+ ** 0 2 PERSON 0 RECORD 0 0 0 0
+ ** 0 2 PERSON_ID 1 NUMBER 22 4 0 10
+ ** 0 2 PERSON_NM 1 VARCHAR2 10 0 0 0
+ ** 0 3 AMOUNTS 0 TABLE 0 0 0 0
+ ** 0 3 1 NUMBER 22 0 0 0
+ ** 0 4 TRANS_NO 0 NUMBER 22 0 0 0
+ **
+ ** 1 0 0 NUMBER 22 7 2 10
+ ** 1 1 ACCOUNT 0 NUMBER 22 0 0 0
+ ** 1 2 PERSON 0 RECORD 0 0 0 0
+ ** 1 2 PERSON_ID 1 NUMBER 22 4 0 10
+ ** 1 2 PERSON_NM 1 VARCHAR2 10 0 0 0
+ ** 1 3 AMOUNTS 0 TABLE 0 0 0 0
+ ** 1 3 1 NUMBER 22 0 0 0
+ ** 1 4 TRANS_DATE 0 NUMBER 22 0 0 0
+ **
+ **
+ ** OCIDPR Argument Descriptions -
+ **
+ ** ldadef - pointer to ldadef
+ ** object_name - object name, synonyms are also accepted and will
+ ** be translate, currently only procedure and function
+ ** names are accepted, also NLS names are accepted.
+ ** Currently, the accepted format of a name is
+ ** [[part1.]part2.]part3[@dblink] (required)
+ ** object_length - object name length (required)
+ ** reserved1 - reserved for future use
+ ** reserved1_length - reserved for future use
+ ** reserved2 - reserved for future use
+ ** reserved2_length - reserved for future use
+ ** overload - array indicating overloaded procedure # (returned)
+ ** position - array of argument positions, position 0 is a
+ ** function return argument (returned)
+ ** level - array of argument type levels, used to describe
+ ** sub-datatypes of data structures like records
+ ** and arrays (returned)
+ ** argument_name - array of argument names, only returns first
+ ** 30 characters of argument names, note storage
+ ** for 30 characters is allocated by client (returned)
+ ** argument_length - array of argument name lengths (returned)
+ ** datatype - array of oracle datatypes (returned)
+ ** default_supplied - array indicating parameter has default (returned)
+ ** 0 = no default, 1 = default supplied
+ ** in_out - array indicating if argument is IN or OUT (returned
+ ** 0 = IN param, 1 = OUT param, 2 = IN/OUT param
+ ** length - array of argument lengths (returned)
+ ** precision - array of precisions (if number type)(returned)
+ ** scale - array of scales (if number type)(returned)
+ ** radix - array of radix (if number type)(returned)
+ ** spare - array of spares.
+ ** total_elements - size of arrays supplied by client (required),
+ ** total number of elements filled (returned)
+ */
+
+/*************************************/
+/* DEFINING */
+/*************************************/
+sword ocidfi( /*_ struct csrdef *cursor, word pos, ub1 *buf, word bufl,
+ word ftype, b2 *rc, word scale _*/ );
+sword ocidfn( /*_ struct csrdef *cursor, word pos, ub1 *buf, word bufl,
+ word ftype, word scale, b2 *indp, oratext *fmt, word fmtl,
+ word fmtt, ub2 *rl, ub2 *rc _*/ );
+sword ocidfnps( /*_ struct csrdef *cursor, ub1 opcode, word pos, ub1 *buf,
+ sb4 bufl, word ftype, word scale,
+ b2 *indp, oratext *fmt, sb4 fmtl,
+ word fmtt, ub2 *rl, ub2 *rc,
+ sb4 pv_skip, sb4 ind_skip, sb4 len_skip,
+ sb4 rc_skip _*/ );
+
+
+ /* Define a user data buffer using upidfn
+ ** cursor - pointer to csrdef
+ ** pos - position of a field or exp in the select list of a query
+ ** bfa/bfl - address and length of client-supplied storage
+ to receive data
+ ** ftype - user datatype
+ ** scale - number of fractional digits for cobol packed decimals
+ ** indp - place to store the length of the returned value. If returned
+ ** value is:
+ ** negative, the field fetched was NULL
+ ** zero , the field fetched was same length or shorter than
+ ** the buffer provided
+ ** positive, the field fetched was truncated
+ ** fmt - format string
+ ** fmtl - length of format string, if -1 strlent(fmt) used
+ ** rl - place to store column length after each fetch
+ ** rc - place to store column error code after each fetch
+ ** fmtt - fomat type
+ */
+
+/********************************/
+/* PIECE INFORMATION GET/SET */
+/********************************/
+sword ocigetpi( /*_ struct csrdef *cursor, ub1 *piecep,
+ dvoid **ctxpp, ub4 *iterp, ub4 *indexp _*/ );
+sword ocisetpi( /*_ struct csrdef *cursor, ub1 piece,
+ dvoid *bufp, ub4 *lenp _*/ );
+
+
+/********************************/
+/* EXECUTE */
+/********************************/
+sword ociexe( /*_ struct csrdef *cursor _*/ );
+sword ociexn( /*_ struct csrdef *cursor, word iters, word roff _*/ );
+sword ociefn( /*_ struct csrdef *cursor, ub4 nrows, word can, word exact _*/);
+ /*
+ ** ociexe - execute a cursor
+ ** ociexn - execute a cursosr N times
+ ** cursor - pointer to a csrdef
+ ** iters - number of times to execute cursor
+ ** roff - offset within the bind variable array at which to begin
+ ** operations.
+ */
+
+
+/*********************************/
+/* FETCHING */
+/*********************************/
+sword ocifet( /*_ struct csrdef *cursor _*/ );
+sword ocifen( /*_ struct csrdef *cursor, word nrows _*/ );
+ /* ocifet - fetch the next row
+ ** ocifen - fetch n rows
+ ** cursor - pointer to csrdef
+ ** nrows - number of rows to be fetched
+ */
+
+sword ocilng(/*_ struct csrdef *cursor, word posit, ub1 *bfa, sb4 bfl,
+ word dty, ub4 *rln, sb4 off _*/);
+
+/*********************************/
+/* CONVERSION */
+/*********************************/
+sword ocic32( /*_ struct csrdef *cursor _*/ );
+ /*
+ ** Convert selected version 3 return codes to the equivalent
+ ** version 2 code.
+ ** csrdef->csrrc is set to the converted code
+ ** csrdef->csrft is set to v2 oracle statment type
+ ** csrdef->csrrpc is set to the rows processed count
+ ** csrdef->csrpeo is set to error postion
+ **
+ ** cursor - pointer to csrdef
+ */
+
+
+sword ocir32( /*_ struct csrdef *cursor, word retcode _*/ );
+ /*
+ ** Convert selected version 3 return codes to the equivalent version 2
+ ** code.
+ **
+ ** cursor - pointer to csrdef
+ ** retcode - place to store the return code
+ */
+
+
+VOID ociscn( /*_ word **arglst, char *mask_addr, word **newlst _*/ );
+ /*
+ ** Convert call-by-ref to call-by-value:
+ ** takes an arg list and a mask address, determines which args need
+ ** conversion to a value, and creates a new list begging at the address
+ ** of newlst.
+ **
+ ** arglst - list of arguments
+ ** mast_addr _ mask address determines args needing conversion
+ ** newlst - new list of args
+ */
+
+word ocistf ( /*_ word typ, word bufl, word rdig, oratext *fmt,
+ struct csrdef *cursor, sword *err _*/ );
+/* Convert a packed decimal buffer length (bytes) and scale to a format
+** string of the form mm.+/-nn, where mm is the number of packed
+** decimal digits, and nn is the scaling factor. A positive scale name
+** nn digits to the rights of the decimal; a negative scale means nn zeros
+** should be supplied to the left of the decimal.
+** bufl - length of the packed decimal buffer
+** rdig - number of fractional digits
+** fmt - pointer to a string holding the conversion format
+** cursor - pointer to csrdef
+** err - pointer to word storing error code
+*/
+
+
+/******************************************/
+/* Non-blocking operations */
+/******************************************/
+sword ocinbs( /*_ ldadef *lda _*/ ); /* set a connection to non-blocking */
+sword ocinbt( /*_ ldadef *lda _*/ ); /* test if connection is non-blocking */
+sword ocinbc( /*_ ldadef *lda _*/ ); /* clear a connection to blocking */
+sword ocinlo( /*_ ldadef *lda, struct hstdef *hst, oratext *conn,
+ sword connl, oratext *uid, sword uidl,
+ oratext *psw, sword pswl, sword audit _*/ );
+ /* logon in non-blocking fashion */
+/* ocinlo allows an application to logon in non-blocking fashion.
+** lda - pointer to ldadef
+** hst - pointer to a 256 byte area, must be cleared to zero before call
+** conn - the database link (if specified @LINK in uid will be ignored)
+** connl - length of conn; if -1 strlen(conn) is used
+** uid - user id [USER[/PASSWORD][@LINK]]
+** uidl - length of uid, if -1 strlen(uid) is used
+** psw - password string; ignored if specified in uid
+** pswl - length of psw, if -1 strlen(psw) is used
+** audit - is not supported; the only permissible value is 0
+*/
+
+/***************************************************/
+/* Procedure Declaration for Pro*C */
+/***************************************************/
+/* Note: The following routines are used in Pro*C and have the
+ same interface as their couterpart in OCI.
+ Althought the interface follows for more details please refer
+ to the above routines */
+
+/******************************************/
+/* initialization/logon/logof */
+/******************************************/
+sword ocipin( /*_ ub4 mode _*/ );
+
+sword ologin( /*_ ldadef *lda, b2 areacount _*/ );
+sword ologon( /*_ ldadef *lda, b2 areacount _*/ );
+
+/*****************************************/
+/* Open/Close/Parse Cursor */
+/*****************************************/
+
+/*
+** ocisqd - oci delayed parse (Should be used only with deferred upi/oci)
+** FUNCTION: Call upidpr to delay the parse of the sql statement till the
+** time that a call needs to be made to the kernel (execution or
+** describe time )
+** RETURNS: Oracle return code.
+*/
+sword ocisq7(/*_ struct csrdef *cursor, oratext *sqlstm, sb4 sqllen,
+ word defflg, ub4 sqlt _*/);
+
+/*****************************************/
+/* Bind */
+/*****************************************/
+sword obind( /*_ struct csrdef *cursor, oratext *sqlvar, word sqlvl,
+ ub1 *progv, word progvl, word ftype, word scale,
+ oratext *fmt, word fmtl, word fmtt _*/ );
+sword obindn( /*_ struct csrdef *cursor, ub2 sqlvn, ub1 *progv, word progvl,
+ word ftype, word scale, oratext *fmt, word fmtl,
+ word fmtt _*/ );
+
+/**********************************************/
+/* Define */
+/**********************************************/
+sword odfinn( /*_ struct csrdef *cursor, word pos, ub1 *buf, word bufl,
+ word ftype, b2 *rc, word scale _*/ );
+
+/**********************************************/
+/* Describe */
+/**********************************************/
+sword odsrbn( /*_ struct csrdef *cursor, word pos, b2 *dbsize, b2 *dtype,
+ b2 *fsize _*/ );
+
+
+/******************************************/
+/* Non-blocking operations */
+/******************************************/
+sword onblon( /*_ ldadef *lda, struct hstdef *hst, oratext *conn,
+ sword connl, oratext *uid, sword uidl,
+ oratext *psw, sword pswl, sword audit _*/ );
+ /* logon in non-blocking fashion */
+sword ocignfd( /*_ ldadef *lda, dvoid *nfdp _*/); /* get native fd */
+
+ub2 ocigft_getFcnType( /*_ ub2 oertyp _*/ ); /* get sql function code */
+
+#endif
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocidem.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocidem.h
new file mode 100644
index 0000000..1826876
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocidem.h
@@ -0,0 +1,112 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ocidem.h,v 1.3 2005/05/06 16:48:56 karine Exp $
+ */
+
+/* Copyright (c) 1991, 1996, 1997, 1999 by Oracle Corporation */
+/* Copyright (c) 1991, 1997, 1999 by Oracle Corporation */
+/*
+ NAME
+ ocidem.h - OCI demo header
+ MODIFIED (MM/DD/YY)
+ whe 04/07/99 - bug#810071
+ whe 03/19/99 - lrg 32079 etc.: putting static back for oci_func_tab
+ nmacnaug 02/02/99 - static declarations should not be in header files
+ mygopala 09/22/97 - Fix for bug 550351
+ surman 03/14/97 - Merge 413362 to 8.0.3
+ surman 11/08/96 - 413362: Add SS_64BIT_SERVER macro
+ emendez 04/07/94 - merge changes from branch 1.6.710.1
+ emendez 02/02/94 - Fix for bug 157576
+ jnlee 01/05/93 - include oratypes.h once, make oci_func_tab static
+ rkooi2 10/26/92 - More portability mods
+ rkooi2 10/22/92 - Change text back to char to avoid casts
+ rkooi2 10/20/92 - Changes to make it portable
+ sjain 03/16/92 - Creation
+*/
+
+/*
+ * ocidem.h
+ *
+ * Declares additional functions and data structures
+ * used in the OCI C sample programs.
+ */
+
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif /* ORATYPES */
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif /* OCIDFN */
+
+#ifndef OCIDEM
+#define OCIDEM
+
+
+/* internal/external datatype codes */
+#define VARCHAR2_TYPE 1
+#define NUMBER_TYPE 2
+#define INT_TYPE 3
+#define FLOAT_TYPE 4
+#define STRING_TYPE 5
+#define ROWID_TYPE 11
+#define DATE_TYPE 12
+
+/* ORACLE error codes used in demonstration programs */
+#define VAR_NOT_IN_LIST 1007
+#ifndef NO_DATA_FOUND
+# define NO_DATA_FOUND 1403
+#endif
+#define NULL_VALUE_RETURNED 1405
+
+/* some SQL and OCI function codes */
+#define FT_INSERT 3
+#define FT_SELECT 4
+#define FT_UPDATE 5
+#define FT_DELETE 9
+
+#define FC_OOPEN 14
+
+/*
+ * OCI function code labels,
+ * corresponding to the fc numbers
+ * in the cursor data area.
+ */
+static CONST text *oci_func_tab[] = {(text *) "not used",
+/* 1-2 */ (text *) "not used", (text *) "OSQL",
+/* 3-4 */ (text *) "not used", (text *) "OEXEC, OEXN",
+/* 5-6 */ (text *) "not used", (text *) "OBIND",
+/* 7-8 */ (text *) "not used", (text *) "ODEFIN",
+/* 9-10 */ (text *) "not used", (text *) "ODSRBN",
+/* 11-12 */ (text *) "not used", (text *) "OFETCH, OFEN",
+/* 13-14 */ (text *) "not used", (text *) "OOPEN",
+/* 15-16 */ (text *) "not used", (text *) "OCLOSE",
+/* 17-18 */ (text *) "not used", (text *) "not used",
+/* 19-20 */ (text *) "not used", (text *) "not used",
+/* 21-22 */ (text *) "not used", (text *) "ODSC",
+/* 23-24 */ (text *) "not used", (text *) "ONAME",
+/* 25-26 */ (text *) "not used", (text *) "OSQL3",
+/* 27-28 */ (text *) "not used", (text *) "OBNDRV",
+/* 29-30 */ (text *) "not used", (text *) "OBNDRN",
+/* 31-32 */ (text *) "not used", (text *) "not used",
+/* 33-34 */ (text *) "not used", (text *) "OOPT",
+/* 35-36 */ (text *) "not used", (text *) "not used",
+/* 37-38 */ (text *) "not used", (text *) "not used",
+/* 39-40 */ (text *) "not used", (text *) "not used",
+/* 41-42 */ (text *) "not used", (text *) "not used",
+/* 43-44 */ (text *) "not used", (text *) "not used",
+/* 45-46 */ (text *) "not used", (text *) "not used",
+/* 47-48 */ (text *) "not used", (text *) "not used",
+/* 49-50 */ (text *) "not used", (text *) "not used",
+/* 51-52 */ (text *) "not used", (text *) "OCAN",
+/* 53-54 */ (text *) "not used", (text *) "OPARSE",
+/* 55-56 */ (text *) "not used", (text *) "OEXFET",
+/* 57-58 */ (text *) "not used", (text *) "OFLNG",
+/* 59-60 */ (text *) "not used", (text *) "ODESCR",
+/* 61-62 */ (text *) "not used", (text *) "OBNDRA",
+/* 63-64 */ (text *) "OBINDPS", (text *) "ODEFINPS",
+/* 65-66 */ (text *) "OGETPI", (text *) "OSETPI"
+};
+
+#endif /* OCIDEM */
+
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocidfn.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocidfn.h
new file mode 100644
index 0000000..0364eec
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocidfn.h
@@ -0,0 +1,251 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ocidfn.h,v 1.3 2005/05/06 16:48:56 karine Exp $
+ */
+
+/* Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved. */
+/* Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved. */
+/*
+ NAME
+ ocidfn.h - OCI Definations
+ NOTES
+ Shipped to users.
+ MODIFIED (MM/DD/YY)
+ srseshad 11/25/02 - change binary float/double codes
+ srseshad 11/14/02 - Add SQLT_IBFLOAT, SQLT_IBDOUBLE
+ mxyang 09/17/02 - grabtrans 'mmorsi_obj_float'
+ srseshad 09/06/02 - Add binary float/double
+ aahluwal 06/04/02 - bug 2360115
+ kmuthukk 05/02/00 - add SQLT_PNTY
+ amangal 07/30/99 - Merge into 8.1.6 : Bug 879031
+ tnbui 07/28/99 - Remove SQLT_TIMESTAMP_ITZ
+ tnbui 07/21/99 - SQLT_TIMESTAMP_LTZ
+ tnbui 06/16/99 - TIMESTAMP WITH IMPLICIT TIME ZONE
+ whe 04/07/99 - bug#810075
+ whe 03/19/99 - lrg 32079 etc.: move HDA def from ocidem.h to ocidfn.
+ skmishra 05/10/98 -
+ vyanaman 04/16/98 - update sql92 datatypes
+ khnguyen 01/16/98 -
+ khnguyen 12/23/97 - SQLT* for datetimes and intervals
+ tanguyen 08/19/97 -
+ dchatter 03/18/97 - porting exception 390897
+ dchatter 05/02/97 - merge porting exception
+ dalpern 12/04/96 - SQLCS_LIT_NULL added
+ cxcheng 11/14/96 - add SQLT_BFILE/SQLT_CFILE to fix compile prob
+ cxcheng 11/12/96 - add SQLT_NCO for named collection
+ lchidamb 10/17/96 - add SQLT_VST and SQLT_ODT
+ sgollapu 10/14/96 - Mutual exclusion of ocidfn and sqldef
+ sgollapu 10/07/96 - OCI Simplification
+ aroy 09/09/96 - add SQLCS* definitions
+ slari 08/07/96 - add SQLT_RDD, rowid descriptor
+ slari 06/12/96 - remove SQLT_TTBL
+ dchatter 04/21/96 - prepare for merge into main
+ slari 08/24/95 - b299432, define CDA_SIZE
+ zwalcott 02/28/96 - add SQLT_BFILEE and SQLT_CFILEE.
+ lchidamb 02/22/96 - make dtys consistent with dtydef.h
+ lchidamb 02/16/96 - add SQLT_BFILEE and SQLT_CFILEE
+ lchidamb 01/30/96 - rename new datatypes for v8
+ lchidamb 09/06/95 - add new datatypes
+ slari 05/11/95 - add OCI_EV_DEF and OCI_EV_TSF
+ dchatter 04/06/95 - add ifdef flags around OCI_flags
+ dchatter 03/08/95 - piece values
+ dchatter 03/06/95 - merge changes from branch 1.2.720.3
+ jfbrown 02/17/95 - merge changes from branch 1.2.720.2
+ dchatter 02/08/95 - olog call modes
+ jfbrown 02/03/95 - remove non-printable characters
+ lchidamb 12/06/94 - merge changes from branch 1.2.720.1
+ lchidamb 10/04/94 - added field chk to cda_head, cda_def
+ dchatter 07/05/94 - SQLT_CUR added
+ rkooi2 11/27/92 - Changing e* datatypes to s*
+ rkooi2 10/26/92 - More portability mods
+ rkooi2 10/22/92 - Added #ifndef ORATYPES ...
+ rkooi2 10/18/92 - Changes to make it portable.
+ sjain 03/16/92 - Creation
+*/
+
+/*
+ * ocidfn.h
+ *
+ * Common header file for OCI C sample programs.
+ * This header declares the cursor and logon data area structure.
+ * The types used are defined in <oratypes.h>.
+ *
+ */
+
+#ifndef OCIDFN
+#define OCIDFN
+
+#include <oratypes.h>
+
+/* The cda_head struct is strictly PRIVATE. It is used
+ internally only. Do not use this struct in OCI programs. */
+
+struct cda_head {
+ sb2 v2_rc;
+ ub2 ft;
+ ub4 rpc;
+ ub2 peo;
+ ub1 fc;
+ ub1 rcs1;
+ ub2 rc;
+ ub1 wrn;
+ ub1 rcs2;
+ sword rcs3;
+ struct {
+ struct {
+ ub4 rcs4;
+ ub2 rcs5;
+ ub1 rcs6;
+ } rd;
+ ub4 rcs7;
+ ub2 rcs8;
+ } rid;
+ sword ose;
+ ub1 chk;
+ dvoid *rcsp;
+};
+
+/*
+** Size of HDA area:
+** 512 for 64 bit arquitectures
+** 256 for 32 bit arquitectures
+*/
+
+#if defined(SS_64BIT_SERVER) || defined(__64BIT__)
+# define HDA_SIZE 512
+#else
+# define HDA_SIZE 256
+#endif
+
+#if defined(SS_64BIT_SERVER) || defined(__64BIT__)
+#define CDA_SIZE 88
+#else
+# define CDA_SIZE 64
+#endif
+
+/* the real CDA, padded to CDA_SIZE bytes in size */
+struct cda_def {
+ sb2 v2_rc; /* V2 return code */
+ ub2 ft; /* SQL function type */
+ ub4 rpc; /* rows processed count */
+ ub2 peo; /* parse error offset */
+ ub1 fc; /* OCI function code */
+ ub1 rcs1; /* filler area */
+ ub2 rc; /* V7 return code */
+ ub1 wrn; /* warning flags */
+ ub1 rcs2; /* reserved */
+ sword rcs3; /* reserved */
+ struct { /* rowid structure */
+ struct {
+ ub4 rcs4;
+ ub2 rcs5;
+ ub1 rcs6;
+ } rd;
+ ub4 rcs7;
+ ub2 rcs8;
+ } rid;
+ sword ose; /* OSD dependent error */
+ ub1 chk;
+ dvoid *rcsp; /* pointer to reserved area */
+ ub1 rcs9[CDA_SIZE - sizeof (struct cda_head)]; /* filler */
+};
+
+typedef struct cda_def Cda_Def;
+
+/* the logon data area (LDA)
+ is the same shape as the CDA */
+typedef struct cda_def Lda_Def;
+
+/* OCI Environment Modes for opinit call */
+#define OCI_EV_DEF 0 /* default single-threaded environment */
+#define OCI_EV_TSF 1 /* thread-safe environment */
+
+/* OCI Logon Modes for olog call */
+#define OCI_LM_DEF 0 /* default login */
+#define OCI_LM_NBL 1 /* non-blocking logon */
+
+/*
+ * since sqllib uses both ocidef and ocidfn the following defines
+ * need to be guarded
+ */
+#ifndef OCI_FLAGS
+#define OCI_FLAGS
+
+/* OCI_*_PIECE defines the piece types that are returned or set
+*/
+#define OCI_ONE_PIECE 0 /* there or this is the only piece */
+#define OCI_FIRST_PIECE 1 /* the first of many pieces */
+#define OCI_NEXT_PIECE 2 /* the next of many pieces */
+#define OCI_LAST_PIECE 3 /* the last piece of this column */
+#endif
+
+#ifndef SQLDEF
+
+/* input data types */
+#define SQLT_CHR 1 /* (ORANET TYPE) character string */
+#define SQLT_NUM 2 /* (ORANET TYPE) oracle numeric */
+#define SQLT_INT 3 /* (ORANET TYPE) integer */
+#define SQLT_FLT 4 /* (ORANET TYPE) Floating point number */
+#define SQLT_STR 5 /* zero terminated string */
+#define SQLT_VNU 6 /* NUM with preceding length byte */
+#define SQLT_PDN 7 /* (ORANET TYPE) Packed Decimal Numeric */
+#define SQLT_LNG 8 /* long */
+#define SQLT_VCS 9 /* Variable character string */
+#define SQLT_NON 10 /* Null/empty PCC Descriptor entry */
+#define SQLT_RID 11 /* rowid */
+#define SQLT_DAT 12 /* date in oracle format */
+#define SQLT_VBI 15 /* binary in VCS format */
+#define SQLT_BFLOAT 21 /* Native Binary float*/
+#define SQLT_BDOUBLE 22 /* NAtive binary double */
+#define SQLT_BIN 23 /* binary data(DTYBIN) */
+#define SQLT_LBI 24 /* long binary */
+#define SQLT_UIN 68 /* unsigned integer */
+#define SQLT_SLS 91 /* Display sign leading separate */
+#define SQLT_LVC 94 /* Longer longs (char) */
+#define SQLT_LVB 95 /* Longer long binary */
+#define SQLT_AFC 96 /* Ansi fixed char */
+#define SQLT_AVC 97 /* Ansi Var char */
+#define SQLT_IBFLOAT 100 /* binary float canonical */
+#define SQLT_IBDOUBLE 101 /* binary double canonical */
+#define SQLT_CUR 102 /* cursor type */
+#define SQLT_RDD 104 /* rowid descriptor */
+#define SQLT_LAB 105 /* label type */
+#define SQLT_OSL 106 /* oslabel type */
+
+#define SQLT_NTY 108 /* named object type */
+#define SQLT_REF 110 /* ref type */
+#define SQLT_CLOB 112 /* character lob */
+#define SQLT_BLOB 113 /* binary lob */
+#define SQLT_BFILEE 114 /* binary file lob */
+#define SQLT_CFILEE 115 /* character file lob */
+#define SQLT_RSET 116 /* result set type */
+#define SQLT_NCO 122 /* named collection type (varray or nested table) */
+#define SQLT_VST 155 /* OCIString type */
+#define SQLT_ODT 156 /* OCIDate type */
+
+/* datetimes and intervals */
+#define SQLT_DATE 184 /* ANSI Date */
+#define SQLT_TIME 185 /* TIME */
+#define SQLT_TIME_TZ 186 /* TIME WITH TIME ZONE */
+#define SQLT_TIMESTAMP 187 /* TIMESTAMP */
+#define SQLT_TIMESTAMP_TZ 188 /* TIMESTAMP WITH TIME ZONE */
+#define SQLT_INTERVAL_YM 189 /* INTERVAL YEAR TO MONTH */
+#define SQLT_INTERVAL_DS 190 /* INTERVAL DAY TO SECOND */
+#define SQLT_TIMESTAMP_LTZ 232 /* TIMESTAMP WITH LOCAL TZ */
+
+#define SQLT_PNTY 241 /* pl/sql representation of named types */
+
+/* cxcheng: this has been added for backward compatibility -
+ it needs to be here because ocidfn.h can get included ahead of sqldef.h */
+#define SQLT_FILE SQLT_BFILEE /* binary file lob */
+#define SQLT_CFILE SQLT_CFILEE
+#define SQLT_BFILE SQLT_BFILEE
+
+/* CHAR/NCHAR/VARCHAR2/NVARCHAR2/CLOB/NCLOB char set "form" information */
+#define SQLCS_IMPLICIT 1 /* for CHAR, VARCHAR2, CLOB w/o a specified set */
+#define SQLCS_NCHAR 2 /* for NCHAR, NCHAR VARYING, NCLOB */
+#define SQLCS_EXPLICIT 3 /* for CHAR, etc, with "CHARACTER SET ..." syntax */
+#define SQLCS_FLEXIBLE 4 /* for PL/SQL "flexible" parameters */
+#define SQLCS_LIT_NULL 5 /* for typecheck of NULL and empty_clob() lits */
+
+#endif /* SQLDEF */
+#endif /* OCIDFN */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ociextp.h b/src/terralib/drivers/OracleSpatial/OCI/include/ociextp.h
new file mode 100644
index 0000000..e20a832
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ociextp.h
@@ -0,0 +1,281 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ociextp.h,v 1.3 2005/05/06 16:48:56 karine Exp $
+ */
+
+/* Copyright (c) 1996, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ ociextp.h - Interface Definitions for PL/SQL External Procedures
+
+ DESCRIPTION
+ This header file contains C language callable interface from
+ PL/SQL External Procedures.
+
+ PUBLIC FUNCTION(S)
+ OCIExtProcAllocCallMemory - Allocate Call memory
+ OCIExtProcRaiseExcp - Raise Exception
+ OCIExtProcRaiseExcpWithMsg - Raise Exception with message
+ OCIExtProcGetEnv - Get OCI Environment
+
+ PRIVATE FUNCTION(S)
+ <list of static functions defined in .c file - with one-line descriptions>
+
+ EXAMPLES
+
+ NOTES
+ <other useful comments, qualifications, etc.>
+
+ MODIFIED (MM/DD/YY)
+ srseshad 03/12/03 - convert oci public api to ansi
+ rdecker 01/10/02 - change 32k to MAX_OEN for error numbers
+ sagrawal 07/20/01 - Statement Handle to safe cal outs
+ abrumm 04/19/01 - move include of oci.h after defines/typedef
+ rdecker 02/22/01 - lint fix
+ bpalaval 02/08/01 - Change text to oratext.
+ sagrawal 06/16/00 - ref cursor in callouts
+ whe 09/01/99 - 976457:check __cplusplus for C++ code
+ asethi 04/15/99 - Created (by moving ociextp.h from /vobs/plsql/public)
+ rhari 03/25/97 - Use ifndef
+ rhari 12/18/96 - Include oratypes.h
+ rhari 12/11/96 - #416977, Flip values of return codes
+ rhari 12/02/96 - Define Return Code Macros
+ rhari 11/18/96 - Error number is int
+ rhari 10/30/96 - Fix OCIExtProcRaiseExcpWithMsg
+ rhari 10/30/96 - Get rid of warnings
+ rhari 10/04/96 - Fix OCIExtProcRaiseExcpWithMsg
+ rhari 09/23/96 - Creation
+
+*/
+
+
+#ifndef OCIEXTP_ORACLE
+# define OCIEXTP_ORACLE
+
+# ifndef ORATYPES
+# include <oratypes.h>
+# endif
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/* ----------------------------- Return Codes ----------------------------- */
+/* Success and Error return codes for certain external procedure interface
+ * functions. If a particular interface function returns OCIEXTPROC_SUCCESS
+ * or OCIEXTPROC_ERROR, then applications must use these macros to check
+ * for return values.
+ *
+ * OCIEXTPROC_SUCCESS -- External Procedure Success Return Code
+ * OCIEXTPROC_ERROR -- External Procedure Failure Return Code
+ */
+#define OCIEXTPROC_SUCCESS 0
+#define OCIEXTPROC_ERROR 1
+
+
+/* --------------------------- With-Context Type --------------------------- */
+/*
+ * The C callable interface to PL/SQL External Procedures require the
+ * With-Context parameter to be passed. The type of this structure is
+ * OCIExtProcContext is is opaque to the user.
+ *
+ * The user can declare the With-Context parameter in the application as
+ *
+ * OCIExtProcContext *with_context;
+ */
+typedef struct OCIExtProcContext OCIExtProcContext;
+
+/* NOTE: OCIExtProcContext must be visible prior to including <oci.h> */
+
+# ifndef OCI_ORACLE
+# include <oci.h>
+# endif
+
+
+/* ----------------------- OCIExtProcAllocCallMemory ----------------------- */
+/* OCIExtProcAllocCallMemory
+ * Allocate N bytes of memory for the duration of the External Procedure.
+ *
+ * Memory thus allocated will be freed by PL/SQL upon return from the
+ * External Procedure. You must not use any kind of 'free' function on
+ * memory allocated by OCIExtProcAllocCallMemory.
+ * Use this function to allocate memory for function returns.
+ *
+ * PARAMETERS
+ * Input :
+ * with_context - The with_context pointer that is passed to the C
+ * External Procedure.
+ * Type of with_context : OCIExtProcContext *
+ * amount - The number of bytes to allocate.
+ * Type of amount : size_t
+ *
+ * Output :
+ * Nothing
+ *
+ * Return :
+ * An untyped (opaque) Pointer to the allocated memory.
+ *
+ * Errors :
+ * A 0 return value should be treated as an error
+ *
+ * EXAMPLE
+ * text *ptr = (text *)OCIExtProcAllocCallMemory(wctx, 1024)
+ *
+ */
+#define OCIExtProcAllocCallMemory(with_context, amount) \
+ociepacm(with_context, (size_t)amount)
+
+
+
+
+/* -------------------------- OCIExtProcRaiseExcp -------------------------- */
+/* OCIExtProcRaiseExcp
+ * Raise an Exception to PL/SQL.
+ *
+ * Calling this function signalls an exception back to PL/SQL. After a
+ * successful return from this function, the External Procedure must start
+ * its exit handling and return back to PL/SQL. Once an exception is
+ * signalled to PL/SQL, INOUT and OUT arguments, if any, are not processed
+ * at all.
+ *
+ * PARAMETERS
+ * Input :
+ * with_context - The with_context pointer that is passed to the C
+ * External Procedure.
+ * Type of with_context : OCIExtProcContext *
+ * errnum - Oracle Error number to signal to PL/SQL. errnum
+ * must be a positive number and in the range 1 to MAX_OEN
+ * Type of errnum : int
+ * Output :
+ * Nothing
+ *
+ * Return :
+ * OCIEXTPROC_SUCCESS - If the call was successful.
+ * OCIEXTPROC_ERROR - If the call failed.
+ *
+ */
+#define OCIExtProcRaiseExcp(with_context, errnum) \
+ocieperr(with_context, (int)errnum)
+
+
+
+
+
+/* ---------------------- OCIExtProcRaiseExcpWithMsg ---------------------- */
+/* OCIExtProcRaiseExcpWithMsg
+ * Raise an exception to PL/SQL. In addition, substitute the
+ * following error message string within the standard Oracle error
+ * message string. See note for OCIExtProcRaiseExcp
+ *
+ * PARAMETERS
+ * Input :
+ * with_context - The with_context pointer that is passed to the C
+ * External Procedure.
+ * Type of with_context : OCIExtProcContext *
+ * errnum - Oracle Error number to signal to PL/SQL. errnum
+ * must be a positive number and in the range 1 to MAX_OEN
+ * Type of errnum : int
+ * errmsg - The error message associated with the errnum.
+ * Type of errmsg : char *
+ * len - The length of the error message. 0 if errmsg is
+ * null terminated string.
+ * Type of len : size_t
+ * Output :
+ * Nothing
+ *
+ * Return :
+ * OCIEXTPROC_SUCCESS - If the call was successful.
+ * OCIEXTPROC_ERROR - If the call failed.
+ *
+ */
+#define OCIExtProcRaiseExcpWithMsg(with_context, errnum, errmsg, msglen) \
+ociepmsg(with_context, (int)errnum, errmsg, (size_t)msglen)
+
+
+
+/* --------------------------- OCIExtProcGetEnv --------------------------- */
+/* OCIExtProcGetEnv
+ * Get OCI Environment
+ *
+ * PARAMETERS
+ * Input :
+ * with_context - The with_context pointer that is passed to the C
+ * External Procedure.
+ *
+ * Output :
+ * envh - The OCI Environment handle.
+ * svch - The OCI Service handle.
+ * errh - The OCI Error handle.
+ *
+ * Return :
+ * OCI_SUCCESS - Successful completion of the function.
+ * OCI_ERROR - Error.
+ *
+ */
+#define OCIExtProcGetEnv(with_context, envh, svch, errh) \
+ociepgoe(with_context, envh, svch, errh)
+
+
+
+/* ------------------------ OCIInitializeStatementHandle ------------------- */
+/* OCIreateStatementHandle
+ * Initialize Statement Handle
+ *
+ * PARAMETERS
+ * Input :
+ * wctx - The
+ * cursorno - The cursor number for which we need to initialize
+ * the statement handle
+ * svch - The OCI Service handle.
+ *
+ * Output :
+ * stmthp - The OCI Statement handle.
+ * errh - The OCI Error handle.
+ *
+ * Return :
+ * OCI_SUCCESS - Successful completion of the function.
+ * OCI_ERROR - Error.
+ *
+ */
+#define OCIInitializeStatementHandle(wctx, cursorno, svch, stmthp, errh) \
+ociepish(wctx, cursor, svch, stmthp, errh)
+
+
+
+
+/*---------------------------------------------------------------------------
+ PRIVATE TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ PRIVATE FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+
+dvoid *ociepacm(OCIExtProcContext *with_context, size_t amount);
+
+
+
+size_t ocieperr(OCIExtProcContext *with_context, int error_number);
+
+
+
+size_t ociepmsg(OCIExtProcContext *with_context, int error_number,
+ oratext *error_message, size_t len );
+
+
+
+sword ociepgoe(OCIExtProcContext *with_context, OCIEnv **envh,
+ OCISvcCtx **svch, OCIError **errh);
+
+
+#endif /* OCIEXTP_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocikp.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocikp.h
new file mode 100644
index 0000000..f6de3db
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocikp.h
@@ -0,0 +1,10223 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ocikp.h,v 1.2 2002/12/13 13:33:58 karine Exp $
+ */
+/* Copyright (c) 1996, 2002, Oracle Corporation. All rights reserved. */
+
+/* NOTE: See 'header_template.doc' in the 'doc' dve under the 'forms'
+ directory for the header file template that includes instructions.
+*/
+
+/*
+ NAME
+ ocikp.h - Prototypes of V8 OCI functions in K&R style
+
+ DESCRIPTION
+ defines the prototypes of V8 OCI functions in K&R style
+
+ RELATED DOCUMENTS
+
+ INSPECTION STATUS
+ Inspection date:
+ Inspection status:
+ Estimated increasing cost defects per page:
+ Rule sets:
+
+ ACCEPTANCE REVIEW STATUS
+ Review date:
+ Review status:
+ Reviewers:
+
+ PUBLIC FUNCTION(S)
+ <list of external functions declared/defined - with one-line descriptions>
+
+ PRIVATE FUNCTION(S)
+ <list of static functions defined in .c file - with one-line descriptions>
+
+ EXAMPLES
+
+ NOTES
+ <other useful comments, qualifications, etc.>
+
+ MODIFIED (MM/DD/YY)
+ sichandr 02/12/02 - fix OCIXMLTypeExists
+ gayyappa 02/01/02 - fix 2210776 : change Dom to DOM
+ sichandr 10/24/01 - OCISvcCtx for XMLType create routines
+ schandir 09/24/01 - Add prototypes for Stmt Caching
+ abande 09/04/01 - Add Prototypes for Session Pooling Methods
+ stakeda 09/24/01 - add OCINlsCharSetConvert and
+ OCINlsEnvironmentVariableGet.
+ whe 08/28/01 - add OCIEnvNlsCreate
+ wzhang 08/22/01 - Add OCINlsCharSetNameToId.
+ whe 10/05/01 - add prototype for OCIXMLType functions
+ mdmehta 04/06/01 - Bug 1683763, OCIDateTimeToText: buf_size to ub4*
+ schandir 12/12/00 - modify the ociconnectionpoolcreate() interface.
+ porangas 12/04/00 - Forward merge bug#974710 to 9i
+ gtarora 11/30/00 - fix comment for OCILobIsTemporary
+ akatti 11/07/00 - [1198379]:add OCIRowidToChar
+ bpalaval 10/15/00 - Forward merge 892654.
+ kmohan 09/18/00 - add OCILogon2
+ etucker 07/28/00 - add OCIIntervalFromTZ
+ vjayaram 07/18/00 - add connection pooling changes
+ etucker 07/13/00 - add dls apis for oci
+ hmasaki 07/05/00 - fix 1230846: forward merge into 8.2
+ mbastawa 06/05/00 - add OCIStmtFetch2
+ rxgovind 06/07/00 - update OCIAnyData interfaces
+ rxgovind 05/04/00 - add OCIAnyDataSet interfaces
+ rkasamse 05/01/00 - add ocianydata i/f
+ slari 09/01/99 - remove OCIEnvCallback
+ slari 08/23/99 - add OCIUcb in user callback functions
+ whe 09/01/99 - 976457:check __cplusplus for C++ code
+ dsaha 07/07/99 - Add OCIFEnvCreate for forms
+ vyanaman 06/21/99 - Change OCI DateTime/Interval APIs.
+ esoyleme 07/01/99 - expose MTS performance enhancements
+ whe 06/14/99 - bug727872:add CONST to match definitions
+ kkarun 02/23/99 - Fix OCIDateTime APIs
+ jiyang 12/07/98 - Add comments for OCI_NLS_DUAL_CURRENCY
+ aroy 12/01/98 - add OCIEnvCreate
+ slari 11/23/98 - use ORASTDARG
+ slari 11/22/98 - use arglist in OCIUserCallback
+ slari 11/21/98 - replace ellipsis by arglist in OCIUserCallback
+ thchang 10/20/98 - correct comment on OCILobCreateTemporary
+ sgollapu 09/30/98 - Fix bug 725473
+ slari 09/08/98 - allow envh to receive error info also in CallbackReg/
+ lchidamb 07/07/98 - change comments
+ aroy 08/04/98 - add OCITerminate calls
+ sgollapu 06/30/98 - Add OCISubscription* prototypes
+ nramakri 06/25/98 - remove CONST from some OCIPickler APIs
+ jiyang 06/22/98 - Fix a lint error
+ nmallava 06/08/98 - ociistemporary -> envhp
+ jhasenbe 05/27/98 - Remove definitions for U-Calls (Unicode)
+ nmallava 05/18/98 - correct comment
+ sgollapu 05/19/98 - Change text to OraText
+ aroy 04/20/98 - merge forward 8.0.5 -> 8.1.3
+ nbhatt 05/14/98 - aq listen call
+ vyanaman 04/19/98 - system timestamp
+ kkarun 04/17/98 - Add more Interval functions
+ vyanaman 04/16/98 - Add get/set TZ
+ kkarun 04/13/98 - add datetime prototypes
+ rkasamse 04/13/98 - change OCIEnv* to dvoid* for context/memory cart serv
+ rkasamse 04/15/98 - chage pickler cart interface
+ slari 03/20/98 - change proto of OCIUserCallback
+ slari 02/17/98 - add OCIEnvCallback
+ jiyang 04/02/98 - Accept both env and user handles for NLS
+ nmallava 04/09/98 - OCILobLocatorAssign
+ nmallava 04/07/98 - fix compiler warnings
+ jhasenbe 04/06/98 - Add new interfaces for Unicode support
+ skabraha 03/24/98 - fixing prototype mismatch
+ tsaulys 03/20/98 - use environment or session handle
+ rkasamse 03/20/98 - remove prototypes for OCIMemoryDuration* functions
+ nmallava 03/17/98 - add interfaces
+ nmallava 03/16/98 - add open/close apis
+ nmallava 03/10/98 - add temporary lobs apis
+ sgollapu 07/10/97 - Add OCIReset
+ sgollapu 02/09/98 - OCI non-blocking
+ nramakri 01/16/98 - remove #ifdef NEVER clause for OCIExtract
+ rmurthy 01/08/98 - OCIContextGenerateKey: change ub1 to ub4
+ ewaugh 01/02/98 - remove VAFP from OCIFormatString prototype
+ ewaugh 12/18/97 - Turn type wrappers into functions.
+ rtaranto 12/17/97 - Resolve merge conflicts
+ jiyang 11/13/97 - Add NLS service for cartridge
+ rhwu 12/02/97 - add OCI Thread
+ nramakri 12/15/97 - move to core4
+ nramakri 12/11/97 - modify OCIExtract prototype
+ ewaugh 12/10/97 - add OCIFormat prototypes
+ skabraha 12/02/97 - adding OCIFile functions
+ nramakri 11/12/97 - add OCIExtract prototypes
+ rkasamse 11/21/97 - add prototypes for memory cartridge services and cont
+ rkasamse 11/03/97 - Add pickler cartridge service interfaces
+ tanguyen 08/19/97 -
+ schandra 06/25/97 - AQ OCI interface
+ bnainani 07/21/97 - add prototypes for Oracle XA extensions
+ rtaranto 05/20/97 - remove OCILobLocatorSize (again)
+ esoyleme 05/13/97 - move failover callback prototype
+ skmishra 05/06/97 - stdc compiler fixes
+ skmishra 04/23/97 - Provide C++ compatibility
+ skotsovo 04/21/97 - make lob parameter names consistent
+ rwhitman 04/16/97 - Fix LOB prototypes - Olint OCI 8.0.3
+ ramkrish 04/15/97 - Add free flag to OCILobFlushBuffer
+ cxcheng 04/09/97 - change objnamp from CONST text* to dvoid*
+ cxcheng 04/08/97 - fix prototype for OCIDescribeAny
+ skotsovo 03/31/97 - remove OCILobLocatorSize
+ skotsovo 03/27/97 - add OCILobLoadFromFile
+ sgollapu 03/26/97 - Change OCIDescribeAny prototype
+ skotsovo 03/26/97 - add svchp to ocienablebuffering
+ skotsovo 03/26/97 - change OCILobFlushBuffers to OCILobFlushBuffer
+ skotsovo 03/18/97 - add interface for lob buffering.
+ dchatter 01/13/97 - fix comments on LOB calls
+ aroy 01/10/97 - remove ocilobfilecreate delete
+ sgollapu 12/27/96 - Correct OCILogon prototype
+ dchatter 01/04/97 - comments to describe the functions
+ sgollapu 11/25/96 - Change OCILobFileIsExistent
+ schandra 11/18/96 - Remove xa.h include
+ sgollapu 11/09/96 - Change prototype of OCIDescribeAny
+ dchatter 11/01/96 - lint error
+ dchatter 10/31/96 - delete CONST from lob write cb fn
+ dchatter 10/30/96 - more changes
+ dchatter 10/26/96 - lob/file long name corrections
+ slari 10/16/96 - delete unused calls
+ rwessman 10/29/96 - Fixed OCISecurityGetIdentity prototype
+ sgollapu 10/22/96 - Add OCILogon and OCILogoff prototypes
+ rwessman 10/16/96 - Added cryptographic and digital signature functions
+ rxgovind 10/07/96 - add oci file calls
+ skotsovo 09/20/96 - in OCILobGetLength(), remove the 'isnull' parameter.
+ skotsovo 10/01/96 - move orl lob fnts to oci
+ skotsovo 09/20/96 - in OCILobGetLength(), remove the 'isnull' parameter.
+ aroy 08/29/96 - change prototype for Nchar Lob support
+ dchatter 08/21/96 - OCIResultSetToStmt prototype change
+ sthakur 08/14/96 - add OCIParamSet
+ schandra 06/17/96 - Convert XA to use new OCI
+ aroy 07/17/96 - terminology change: OCILobLocator => OCILobLocator
+ dchatter 07/01/96 - drop prototypes not in beta1
+ dchatter 06/29/96 - OCIParamGet prototype change
+ dchatter 06/19/96 - add OCISvcCtxBreak, OCILdaToSvcCtx
+ slari 06/12/96 - inlcude oratypes.h instead of s.h
+ schandra 05/31/96 - remove client DBID parameters from OCITransStart
+ asurpur 06/05/96 - Changing the prototype for OCIPasswordChange
+ dchatter 05/30/96 - change OCIStmtGetBind prototype
+ schandra 05/29/96 - Add timeout parameter to OCITransDetach
+ slari 05/30/96 - add OCIBindDynamic/OCIDefineDynamic
+ slari 05/28/96 - fix gpi/spi protos
+ slari 05/28/96 - change proto for OCIParamGet
+ jbellemo 05/23/96 - remove ociisc
+ schandra 05/15/96 - Remove ocitgti type
+ schandra 04/18/96 - OCITransCommitt -> OCITransCommit
+ schandra 03/27/96 - V8OCI - add transaction related calls
+ dchatter 04/01/96 - change return types to sword to be compatible with oo
+ dchatter 03/21/96 - add oci2lda conversion routines
+ aroy 03/12/96 - change parameter order for lob functions
+ dchatter 03/08/96 - minor parameter renaming for lob calls
+ slari 03/14/96 - change proto of OCITransRollback
+ slari 03/12/96 - remove ocidqry
+ slari 03/01/96 - change proto for OCIInitialize
+ slari 02/07/96 - update prototypes
+ slari 02/06/96 - add OCITransCommit()
+ slari 02/02/96 - ociisc: rm dblink info
+ dchatter 01/08/96 - V8 OCI K&R prototype file
+ dchatter 01/08/96 - Creation
+
+*/
+
+#ifndef OCIKP_ORACLE
+# define OCIKP_ORACLE
+
+# ifndef ORATYPES
+# include <oratypes.h>
+# endif
+
+#ifndef ORASTDARG
+#include <stdarg.h>
+#define ORASTDARG
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef NZT_ORACLE
+#include <nzt.h>
+#endif /* NZT_ORACLE */
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+ PRIVATE TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+/*------------------Oracle Version 8 Call Interface--------------------------*/
+
+
+/*****************************************************************************
+ DESCRIPTION
+******************************************************************************
+Note: the descriptions of the functions are alphabetically arranged. Please
+maintain the arrangement when adding a new function description. The actual
+prototypes are below this comment section and donot follow any alphabetical
+ordering.
+
+
+--------------------------------OCIAttrGet------------------------------------
+
+OCIAttrGet()
+Name
+OCI Attribute Get
+Purpose
+This call is used to get a particular attribute of a handle.
+Syntax
+sword OCIAttrGet ( CONST dvoid *trgthndlp,
+ ub4 trghndltyp,
+ dvoid *attributep,
+ ub4 *sizep,
+ ub4 attrtype,
+ OCIError *errhp );
+Comments
+This call is used to get a particular attribute of a handle.
+See Appendix B, "Handle Attributes", for a list of handle types and their
+readable attributes.
+Parameters
+trgthndlp (IN) - is the pointer to a handle type.
+trghndltyp (IN) - is the handle type.
+attributep (OUT) - is a pointer to the storage for an attribute value. The
+attribute value is filled in.
+sizep (OUT) - is the size of the attribute value.
+This can be passed in as NULL for most parameters as the size is well known.
+For OraText* parameters, a pointer to a ub4 must be passed in to get the length
+of the string.
+attrtype (IN) - is the type of attribute.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+OCIAttrSet()
+
+--------------------------------OCIAttrSet------------------------------------
+
+
+OCIAttrSet()
+Name
+OCI Attribute Set
+Purpose
+This call is used to set a particular attribute of a handle or a descriptor.
+Syntax
+sword OCIAttrSet ( dvoid *trgthndlp,
+ ub4 trghndltyp,
+ dvoid *attributep,
+ ub4 size,
+ ub4 attrtype,
+ OCIError *errhp );
+Comments
+This call is used to set a particular attribute of a handle or a descriptor.
+See Appendix B for a list of handle types and their writeable attributes.
+Parameters
+trghndlp (IN/OUT) - the pointer to a handle type whose attribute gets
+modified.
+trghndltyp (IN/OUT) - is the handle type.
+attributep (IN) - a pointer to an attribute value.
+The attribute value is copied into the target handle. If the attribute value
+is a pointer, then only the pointer is copied, not the contents of the pointer.
+size (IN) - is the size of an attribute value. This can be passed in as 0 for
+most attributes as the size is already known by the OCI library. For OraText*
+attributes, a ub4 must be passed in set to the length of the string.
+attrtype (IN) - the type of attribute being set.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+OCIAttrGet()
+
+
+
+--------------------------------OCIBindArrayOfStruct--------------------------
+
+
+
+OCIBindArrayOfStruct()
+Name
+OCI Bind for Array of Structures
+Purpose
+This call sets up the skip parameters for a static array bind.
+Syntax
+sword OCIBindArrayOfStruct ( OCIBind *bindp,
+ OCIError *errhp,
+ ub4 pvskip,
+ ub4 indskip,
+ ub4 alskip,
+ ub4 rcskip );
+Comments
+This call sets up the skip parameters necessary for a static array bind.
+This call follows a call to OCIBindByName() or OCIBindByPos(). The bind
+handle returned by that initial bind call is used as a parameter for the
+OCIBindArrayOfStruct() call.
+For information about skip parameters, see the section "Arrays of Structures"
+on page 4-16.
+Parameters
+bindp (IN) - the handle to a bind structure.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value.
+indskip (IN) - skip parameter for the next indicator value or structure.
+alskip (IN) - skip parameter for the next actual length value.
+rcskip (IN) - skip parameter for the next column-level return code value.
+Related Functions
+OCIAttrGet()
+
+
+--------------------------------OCIBindByName---------------------------------
+
+
+OCIBindByName()
+Name
+OCI Bind by Name
+Purpose
+Creates an association between a program variable and a placeholder in a SQL
+statement or PL/SQL block.
+Syntax
+sword OCIBindByName (
+ OCIStmt *stmtp,
+ OCIBind **bindp,
+ OCIError *errhp,
+ CONST OraText *placeholder,
+ sb4 placeh_len,
+ dvoid *valuep,
+ sb4 value_sz,
+ ub2 dty,
+ dvoid *indp,
+ ub2 *alenp,
+ ub2 *rcodep,
+ ub4 maxarr_len,
+ ub4 *curelep,
+ ub4 mode );
+Description
+This call is used to perform a basic bind operation. The bind creates an
+association between the address of a program variable and a placeholder in a
+SQL statement or PL/SQL block. The bind call also specifies the type of data
+which is being bound, and may also indicate the method by which data will be
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp
+parameter.
+Data in an OCI application can be bound to placeholders statically or
+dynamically. Binding is static when all the IN bind data and the OUT bind
+buffers are well-defined just before the execute. Binding is dynamic when the
+IN bind data and the OUT bind buffers are provided by the application on
+demand at execute time to the client library. Dynamic binding is indicated by
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see
+the section "Runtime Data Allocation and Piecewise Operations" on
+page 5-16.
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle,
+which is implicitly allocated by the bind call A separate bind handle is
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes
+necessary when binding certain data types or handling input data in certain
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application
+will be using user-defined callback functions, OCIBindDynamic() must
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly
+allocated by this call. The bind handle maintains all the bind information for
+this particular input value. The handle is feed implicitly when the statement
+handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+placeholder (IN) - the placeholder attributes are specified by name if ocibindn()
+is being called.
+placeh_len (IN) - the length of the placeholder name specified in placeholder.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the
+type specified in the dty parameter. An array of data values can be specified
+for mapping into a PL/SQL table or for providing data for SQL multiple-row
+operations. When an array of bind values is provided, this is called an array
+bind in OCI terms. Additional attributes of the array bind (not bind to a
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call.
+For a REF, named data type bind, the valuep parameter is used only for IN
+bind data. The pointers to OUT buffers are set in the pgvpp parameter
+initialized by OCIBindObject(). For named data type and REF binds, the bind
+values are unpickled into the Object Cache. The OCI object navigational calls
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and
+OCIBindDynamic() must be invoked to provide callback functions if desired.
+value_sz (IN) - the size of a data value. In the case of an array bind, this is the
+maximum size of any element possible with the actual sizes being specified in
+the alenp parameter.
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum
+size of the data that can be ever provided at runtime for data types other than
+named data types or REFs.
+dty (IN) - the data type of the value(s) being bound. Named data types
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been
+initialized in object mode. For named data types, or REFs, additional calls
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data
+types, this is a pointer to sb2 or an array of sb2s. For named data types,
+this pointer is ignored and the actual pointer to the indicator structure or
+an array of indicator structures is initialized by OCIBindObject().
+Ignored for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each
+element in alenp is the length of the data in the corresponding element in the
+bind value array before and after the execute. This parameter is ignored for
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If
+maxarr_len is non-zero, then either OCIBindDynamic() or
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes.
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz
+parameter defines the maximum size of the data that can be ever
+provided at runtime. The application must be ready to provide the OCI
+library runtime IN data buffers at any time and any number of times.
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered
+with a subsequent call to OCIBindDynamic().
+a polling mechanism using calls supplied by the OCI. This mode
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see
+the section "Runtime Data Allocation and Piecewise Operations" on
+page 5-16.
+When the allocated buffers are not required any more, they should be
+freed by the client.
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+-------------------------------OCIBindByPos----------------------------------
+
+
+OCIBindByPos()
+Name
+OCI Bind by Position
+Purpose
+Creates an association between a program variable and a placeholder in a SQL
+statement or PL/SQL block.
+Syntax
+sword OCIBindByPos (
+ OCIStmt *stmtp,
+ OCIBind **bindp,
+ OCIError *errhp,
+ ub4 position,
+ dvoid *valuep,
+ sb4 value_sz,
+ ub2 dty,
+ dvoid *indp,
+ ub2 *alenp,
+ ub2 *rcodep,
+ ub4 maxarr_len,
+ ub4 *curelep,
+ ub4 mode);
+
+Description
+This call is used to perform a basic bind operation. The bind creates an
+association between the address of a program variable and a placeholder in a
+SQL statement or PL/SQL block. The bind call also specifies the type of data
+which is being bound, and may also indicate the method by which data will be
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp
+parameter.
+Data in an OCI application can be bound to placeholders statically or
+dynamically. Binding is static when all the IN bind data and the OUT bind
+buffers are well-defined just before the execute. Binding is dynamic when the
+IN bind data and the OUT bind buffers are provided by the application on
+demand at execute time to the client library. Dynamic binding is indicated by
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see
+the section "Runtime Data Allocation and Piecewise Operations" on
+page 5-16
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle,
+which is implicitly allocated by the bind call A separate bind handle is
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes
+necessary when binding certain data types or handling input data in certain
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application
+will be using user-defined callback functions, OCIBindDynamic() must
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly
+allocated by this call. The bind handle maintains all the bind information for
+this particular input value. The handle is feed implicitly when the statement
+handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+position (IN) - the placeholder attributes are specified by position if ocibindp()
+is being called.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the
+type specified in the dty parameter. An array of data values can be specified
+for mapping into a PL/SQL table or for providing data for SQL multiple-row
+operations. When an array of bind values is provided, this is called an array
+bind in OCI terms. Additional attributes of the array bind (not bind to a
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call.
+For a REF, named data type bind, the valuep parameter is used only for IN
+bind data. The pointers to OUT buffers are set in the pgvpp parameter
+initialized by OCIBindObject(). For named data type and REF binds, the bind
+values are unpickled into the Object Cache. The OCI object navigational calls
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and
+OCIBindDynamic() must be invoked to provide callback functions if desired.
+value_sz (IN) - the size of a data value. In the case of an array bind, this is the
+maximum size of any element possible with the actual sizes being specified in
+the alenp parameter.
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum
+size of the data that can be ever provided at runtime for data types other than
+named data types or REFs.
+dty (IN) - the data type of the value(s) being bound. Named data types
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been
+initialized in object mode. For named data types, or REFs, additional calls
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data
+types, this is a pointer to sb2 or an array of sb2s. For named data types,
+this pointer is ignored and the actual pointer to the indicator structure or
+an array of indicator structures is initialized by OCIBindObject(). Ignored
+for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each
+element in alenp is the length of the data in the corresponding element in the
+bind value array before and after the execute. This parameter is ignored for
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If
+maxarr_len is non-zero, then either OCIBindDynamic() or
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes.
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz
+parameter defines the maximum size of the data that can be ever
+provided at runtime. The application must be ready to provide the OCI
+library runtime IN data buffers at any time and any number of times.
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered
+with a subsequent call to OCIBindDynamic() .
+a polling mechanism using calls supplied by the OCI. This mode
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see
+the section "Runtime Data Allocation and Piecewise Operations" on
+page 5-16.
+When the allocated buffers are not required any more, they should be
+freed by the client.
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+
+-------------------------------OCIBindDynamic---------------------------------
+
+
+OCIBindDynamic()
+Name
+OCI Bind Dynamic Attributes
+Purpose
+This call is used to register user callbacks for dynamic data allocation.
+Syntax
+sword OCIBindDynamic( OCIBind *bindp,
+ OCIError *errhp,
+ dvoid *ictxp,
+ OCICallbackInBind (icbfp)(
+ dvoid *ictxp,
+ OCIBind *bindp,
+ ub4 iter,
+ ub4 index,
+ dvoid **bufpp,
+ ub4 *alenp,
+ ub1 *piecep,
+ dvoid **indp ),
+ dvoid *octxp,
+ OCICallbackOutBind (ocbfp)(
+ dvoid *octxp,
+ OCIBind *bindp,
+ ub4 iter,
+ ub4 index,
+ dvoid **bufp,
+ ub4 **alenpp,
+ ub1 *piecep,
+ dvoid **indpp,
+ ub2 **rcodepp) );
+Comments
+This call is used to register user-defined callback functions for providing data
+for an UPDATE or INSERT if OCI_DATA_AT_EXEC mode was specified in a
+previous call to OCIBindByName() or OCIBindByPos().
+The callback function pointers must return OCI_CONTINUE if it the call is
+successful. Any return code other than OCI_CONTINUE signals that the client
+wishes to abort processing immediately.
+For more information about the OCI_DATA_AT_EXEC mode, see the section
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+bindp (IN/OUT) - a bind handle returned by a call to OCIBindByName() or
+OCIBindByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+ictxp (IN) - the context pointer required by the call back function icbfp.
+icbfp (IN) - the callback function which returns a pointer to the IN bind
+value or piece at run time. The callback takes in the following parameters.
+ictxp (IN/OUT) - the context pointer for this callback function.
+bindp (IN) - the bind handle passed in to uniquely identify this bind
+variable.
+iter (IN) - 1-based execute iteration value.
+index (IN) - index of the current array, for an array bind. 1 based not
+greater than curele parameter of the bind call.
+index (IN) - index of the current array, for an array bind. This parameter
+is 1-based, and may not be greater than curele parameter of the bind call.
+bufpp (OUT) - the pointer to the buffer.
+piecep (OUT) - which piece of the bind value. This can be one of the
+following values - OCI_ONE_PIECE, OCI_FIRST_PIECE,
+OCI_NEXT_PIECE and OCI_LAST_PIECE.
+indp (OUT) - contains the indicator value. This is apointer to either an
+sb2 value or a pointer to an indicator structure for binding named data
+types.
+indszp (OUT) - contains the indicator value size. A pointer containing
+the size of either an sb2 or an indicator structure pointer.
+octxp (IN) - the context pointer required by the callback function ocbfp.
+ocbfp (IN) - the callback function which returns a pointer to the OUT bind
+value or piece at run time. The callback takes in the following parameters.
+octxp (IN/OUT) - the context pointer for this call back function.
+bindp (IN) - the bind handle passed in to uniquely identify this bind
+variable.
+iter (IN) - 1-based execute iteration value.
+index (IN) - index of the current array, for an array bind. This parameter
+is 1-based, and must not be greater than curele parameter of the bind call.
+bufpp (OUT) - a pointer to a buffer to write the bind value/piece.
+buflp (OUT) - returns the buffer size.
+alenpp (OUT) - a pointer to a storage for OCI to fill in the size of the bind
+value/piece after it has been read.
+piecep (IN/OUT) - which piece of the bind value. It will be set by the
+library to be one of the following values - OCI_ONE_PIECE or
+OCI_NEXT_PIECE. The callback function can leave it unchanged or set
+it to OCI_FIRST_PIECE or OCI_LAST_PIECE. By default -
+OCI_ONE_PIECE.
+indpp (OUT) - returns a pointer to contain the indicator value which
+either an sb2 value or a pointer to an indicator structure for named data
+types.
+indszpp (OUT) - returns a pointer to return the size of the indicator
+value which is either size of an sb2 or size of an indicator structure.
+rcodepp (OUT) - returns a pointer to contains the return code.
+Related Functions
+OCIAttrGet()
+
+
+
+---------------------------------OCIBindObject--------------------------------
+
+
+OCIBindObject()
+Name
+OCI Bind Object
+Purpose
+This function sets up additional attributes which are required for a named
+data type (object) bind.
+Syntax
+sword OCIBindObject ( OCIBind *bindp,
+ OCIError *errhp,
+ CONST OCIType *type,
+ dvoid **pgvpp,
+ ub4 *pvszsp,
+ dvoid **indpp,
+ ub4 *indszp, );
+Comments
+This function sets up additional attributes which binding a named data type
+or a REF. An error will be returned if this function is called when the OCI
+environment has been initialized in non-object mode.
+This call takes as a paramter a type descriptor object (TDO) of datatype
+OCIType for the named data type being defined. The TDO can be retrieved
+with a call to OCITypeByName().
+If the OCI_DATA_AT_EXEC mode was specified in ocibindn() or ocibindp(), the
+pointers to the IN buffers are obtained either using the callback icbfp
+registered in the OCIBindDynamic() call or by the OCIStmtSetPieceInfo() call.
+The buffers are dynamically allocated for the OUT data and the pointers to
+these buffers are returned either by calling ocbfp() registered by the
+OCIBindDynamic() or by setting the pointer to the buffer in the buffer passed
+in by OCIStmtSetPieceInfo() called when OCIStmtExecute() returned
+OCI_NEED_DATA. The memory of these client library- allocated buffers must be
+freed when not in use anymore by using the OCIObjectFreee() call.
+Parameters
+bindp ( IN/OUT) - the bind handle returned by the call to OCIBindByName()
+or OCIBindByPos().
+errhp ( IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+type ( IN) - points to the TDO which describes the type of the program
+variable being bound. Retrieved by calling OCITypeByName().
+pgvpp ( IN/OUT) - points to a pointer to the program variable buffer. For an
+array, pgvpp points to an array of pointers. When the bind variable is also an
+OUT variable, the OUT Named Data Type value or REF is allocated
+(unpickled) in the Object Cache, and a pointer to the value or REF is returned,
+At the end of execute, when all OUT values have been received, pgvpp points
+to an array of pointer(s) to these newly allocated named data types in the
+object cache.
+pgvpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the Named
+Data Type buffers are requested at runtime. For static array binds, skip
+factors may be specified using the OCIBindArrayOfStruct() call. The skip
+factors are used to compute the address of the next pointer to the value, the
+indicator structure and their sizes.
+pvszsp ( IN/OUT) - points to the size of the program variable. The size of the
+named data type is not required on input. For an array, pvszsp is an array of
+ub4s. On return, for OUT bind variables, this points to size(s) of the Named
+Data Types and REFs received. pvszsp is ignored if the OCI_DATA_AT_EXEC
+mode is set. Then the size of the buffer is taken at runtime.
+indpp ( IN/OUT) - points to a pointer to the program variable buffer
+containing the parallel indicator structure. For an array, points to an array of
+pointers. When the bind variable is also an OUT bind variable, memory is
+allocated in the object cache, to store the unpickled OUT indicator values. At
+the end of the execute when all OUT values have been received, indpp points
+to the pointer(s) to these newly allocated indicator structure(s).
+indpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator
+is requested at runtime.
+indszp ( IN/OUT) - points to the size of the IN indicator structure program
+variable. For an array, it is an array of sb2s. On return for OUT bind variables,
+this points to size(s) of the received OUT indicator structures.
+indszp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator
+size is requested at runtime.
+Related Functions
+OCIAttrGet()
+
+
+
+----------------------------------OCIBreak------------------------------------
+
+
+
+OCIBreak()
+Name
+OCI Break
+Purpose
+This call performs an immediate (asynchronous) abort of any currently
+executing OCI function that is associated with a server .
+Syntax
+sword OCIBreak ( dvoid *hndlp,
+ OCIError *errhp);
+Comments
+This call performs an immediate (asynchronous) abort of any currently
+executing OCI function that is associated with a server. It is normally used
+to stop a long-running OCI call being processed on the server.
+This call can take either the service context handle or the server context
+handle as a parameter to identify the function to be aborted.
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+
+-----------------------------OCIConnectionPoolCreate --------------------------
+Name:
+OCIConnectionPoolCreate
+
+Purpose:
+Initializes the Connection Pool
+
+Syntax:
+OCIConnectionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp,
+ OraText **poolName, sb4 *poolNameLen,
+ CONST Oratext *dblink, sb4 dblinkLen,
+ ub4 connMin, ub4 connMax, ub4 connIncr,
+ CONST OraText *poolUsername, sb4 poolUserLen,
+ CONST OraText *poolPassword, sb4 poolPassLen, ub4 mode)
+Comments:
+This call is used to create a connection pool. conn_min connections
+to the database are started on calling OCIConnectionPoolCreate.
+
+Parameters:
+envhp (IN/OUT) - A pointer to the environment where the Conencton Pool
+ is to be created
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+poolhp (IN/OUT) - An uninitialiazed pool handle.
+poolName (OUT) - The connection pool name.
+poolNameLen (OUT) - The length of the connection pool name
+dblink (IN/OUT) - Specifies the database(server) to connect. This will also
+ be used as the default pool name.
+dblinkLen (IN) - The length of the string pointed to by dblink.
+connMin (IN) - Specifies the minimum number of connections in the
+ Connection Pool at any instant.
+ connMin number of connections are started when
+ OCIConnectionPoolCreate() is called.
+connMax (IN) - Specifies the maximum number of connections that can be
+ opened to the database. Once this value is reached, no
+ more connections are opened.
+connIncr (IN) - Allows application to set the next increment for
+ connections to be opened to the database if the current
+ number of connections are less than conn_max.
+poolUsername (IN/OUT) - Connection pooling requires an implicit proxy
+ session and this attribute provides a username
+ for that session.
+poolUserLen (IN) - This represents the length of pool_username.
+poolPassword (IN/OUT) - The password for the parameter pool_username passed
+ above.
+poolPassLen (IN) - This represents the length of pool_password.
+
+mode (IN) - The modes supported are OCI_DEFAULT and OCI_REINITIALIZE
+
+Related Functions
+OCIConnectionPoolDestroy()
+---------------------------------------------------------------------------
+
+----------------------------OCIConnectionPoolDestroy-------------------------
+Name:
+OCIConnectionPoolDestroy
+
+Purpose:
+Destroys the Connection Pool.
+
+Syntax:
+OCIConnectionPoolDestroy (OCICPool *poolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+On calling OCIConnectionPoolDestroy, all the open connections in the pool
+are closed and the pool is destroyed.
+
+Parameters:
+poolhp (IN/OUT) - An uninitialiazed pool handle.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+mode (IN) - Currently, OCIConnectionPoolDestroy() will support only
+ the OCI_DEFAULT mode.
+
+Related Functions:
+OCIConnectionPoolCreate()
+
+-----------------------------------------------------------------------------
+----------------------------OCISessionPoolCreate-----------------------------
+Name:
+OCISessionPoolCreate
+
+Purpose:
+Creates the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCISpool *spoolhp,
+ OraText **poolName, ub4 *poolNameLen,
+ CONST OraText *connStr, ub4 connStrLen,
+ ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+ OraText *userid, ub4 useridLen,
+ OraText *password, ub4 passwordLen,
+ ub4 mode)
+
+Comments:
+When OCISessionPoolCreate is called, a session pool is initialized for
+the associated environment and the database specified by the
+connStr parameter. This pool is named uniquely and the name
+is returned to the user in the poolname parameter.
+
+Parameters:
+envhp (IN/OUT) - A pointer to the environment handle in which the session
+ pool needs to be created.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+spoolhp (IN/OUT) - A pointer to the session pool handle that is created.
+poolName (OUT) - Session pool name returned to the user.
+poolNameLen (OUT) - Length of the PoolName
+connStr (IN) - The TNS alias of the database to connect to.
+connStrLen (IN) - Length of the connStr.
+sessMin (IN) - Specifies the minimum number of sessions in the Session Pool.
+ These are the number of sessions opened in the beginning, if
+ in Homogeneous mode. Else, the parameter is ignored.
+sessMax (IN) - Specifies the maximum number of sessions in the Session Pool.
+ Once this value is reached, no more sessions are opened,
+ unless the OCI_ATTR_SPOOL_FORCEGET is set.
+userid (IN) - Specifies the userid with which to start up the sessions.
+useridLen (IN) - Length of userid.
+password (IN) - Specifies the password for the corresponding userid.
+passwordLen (IN) - Specifies the length of the password
+mode(IN) - May be OCI_DEFAULT, OCI_SPC_SPOOL_REINITIALIZE, or
+ OCI_SPC_SPOOL_HOMOGENEOUS.
+
+Returns:
+SUCCESS - If pool could be allocated and created successfully.
+ERROR - If above conditions could not be met.
+
+Related Functions:
+OCISessionPoolDestroy()
+-----------------------------------------------------------------------------
+-----------------------------OCISessionPoolDestroy---------------------------
+Name:
+OCISessionPoolDestroy
+
+Purpose:
+Terminates all the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolDestroy (OCISPool *spoolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+spoolhp (IN/OUT) - The pool handle of the session pool to be destroyed.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+mode (IN) - Currently only OCI_DEFAULT mode is supported.
+
+Returns:
+SUCCESS - All the sessions could be closed.
+ERROR - If the above condition is not met.
+
+Related Functions:
+OCISessionPoolCreate()
+-----------------------------------------------------------------------------
+-------------------------------OCISessionGet---------------------------------
+Name:
+OCISessionGet
+
+Purpose:
+Get a session. This could be from a session pool, connection pool or
+a new standalone session.
+
+Syntax:
+sword OCISessionGet(OCIenv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+ OCIAuthInfo *authhp,
+ OraText *poolName, ub4 poolName_len,
+ CONST OraText *tagInfo, ub4 tagInfo_len,
+ OraText **retTagInfo, ub4 *retTagInfo_len,
+ boolean *found,
+ ub4 mode)
+
+Comments:
+envhp (IN/OUT) - OCI environment handle.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+svchp (IN/OUT) - Address of an OCI service context pointer. This will be
+ filled with a server and session handle, attached to the
+ pool.
+authhp (IN/OUT) - OCI Authentication Information handle.
+poolName (IN) - This indicates the session/connection pool to get the
+ session/connection from in the OCI_SPOOL/OCI_CPOOL mode.
+ In the OCI_DEFAULT mode it refers to the connect string.
+poolName_len (IN) - length of poolName.
+tagInfo (IN) - indicates the tag of the session that the user wants. If the
+ user wants a default session, he must specify a NULL here.
+ Only used for Session Pooling.
+tagInfo_len (IN) - the length of tagInfo.
+retTagInfo (OUT) - This indicates the type of session that is returned to
+ the user. Only used for Session Pooling.
+retTagInfo_len (OUT) - the length of retTagInfo.
+found (OUT) - set to true if the user gets a session he had requested, else
+ set to false. Only used for Session Pooling.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_CRED_PROXY and
+ OCI_GET_SPOOL_MATCHANY, OCI_SPOOL and OCI_CPOOL. OCI_SPOOL and
+ OCI_CPOOL are mutually exclusive.
+
+Returns:
+SUCCESS - if a session was successfully returned into svchp.
+SUCCESS_WITH_INFO - if a session was successfully returned into svchp and the
+ total number of sessions > maxsessions. Only valid for
+ Session Pooling.
+ERROR - If a session could not be retrieved.
+
+Related Functions:
+OCISessionRelease()
+-----------------------------------------------------------------------------
+---------------------------OCISessionRelease---------------------------------
+Name:
+OCISessionRelease
+
+Purpose:
+Release the session.
+
+Syntax:
+sword OCISessionRelease ( OCISvcCtx *svchp, OCIError *errhp,
+ OraText *tag, ub4 tag_len,
+ ub4 mode);
+
+Comments:
+svchp (IN/OUT) - The service context associated with the session/connection.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+tag (IN) - Only used for Session Pooling.
+ This parameter will be ignored unless mode OCI_RLS_SPOOL_RETAG is
+ specified. In this case, the session is labelled with this tag and
+ returned to the pool. If this is NULL, then the session is untagged.
+tag_len (IN) - Length of the tag. This is ignored unless mode
+ OCI_RLS_SPOOL_RETAG is set.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_RLS_SPOOL_DROPSESS,
+ OCI_RLS_SPOOL_RETAG. The last 2 are only valid for Session Pooling.
+ When OCI_RLS_SPOOL_DROPSESS is specified, the session
+ will be removed from the session pool. If OCI_RLS_SPOOL_RETAG is
+ set, the tag on the session will be altered. If this mode is not
+ set, the tag and tag_len parameters will be ignored.
+
+Returns:
+ERROR - If the session could not be released successfully.
+SUCCESS - In all other cases.
+
+Related Functions:
+OCISessionGet().
+
+-----------------------------------------------------------------------------
+------------------------------OCIDateTimeAssign --------------------------
+sword OCIDateTimeAssign(dvoid *hndl, OCIError *err, CONST OCIDateTime *from,
+ OCIDateTime *to);
+NAME: OCIDateTimeAssign - OCIDateTime Assignment
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+from (IN) - datetime to be assigned
+to (OUT) - lhs of assignment
+DESCRIPTION:
+ Performs date assignment. The type of the output will be same as that
+ of input
+
+------------------------------OCIDateTimeCheck--------------------
+sword OCIDateTimeCheck(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ ub4 *valid );
+NAME: OCIDateTimeCheck - OCIDateTime CHecK if the given date is valid
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+date (IN) - date to be checked
+type (IN) - type of the input datetime(OCI_DATE, OCI_TIME,
+ OCI_TIMESTAMP, OCI_TZTIMESTAMP, OCI_TZTIME)
+valid (OUT) - returns zero for a valid date, otherwise
+ the ORed combination of all error bits specified below:
+ Macro name Bit number Error
+ ---------- ---------- -----
+ OCI_DATE_INVALID_DAY 0x1 Bad day
+ OCI_DATE_DAY_BELOW_VALID 0x2 Bad DAy Low/high bit (1=low)
+ OCI_DATE_INVALID_MONTH 0x4 Bad MOnth
+ OCI_DATE_MONTH_BELOW_VALID 0x8 Bad MOnth Low/high bit (1=low)
+ OCI_DATE_INVALID_YEAR 0x10 Bad YeaR
+ OCI_DATE_YEAR_BELOW_VALID 0x20 Bad YeaR Low/high bit (1=low)
+ OCI_DATE_INVALID_HOUR 0x40 Bad HouR
+ OCI_DATE_HOUR_BELOW_VALID 0x80 Bad HouR Low/high bit (1=low)
+ OCI_DATE_INVALID_MINUTE 0x100 Bad MiNute
+ OCI_DATE_MINUTE_BELOW_VALID 0x200 Bad MiNute Low/high bit (1=low)
+ OCI_DATE_INVALID_SECOND 0x400 Bad SeCond
+ OCI_DATE_SECOND_BELOW_VALID 0x800 bad second Low/high bit (1=low)
+ OCI_DATE_DAY_MISSING_FROM_1582 0x1000 Day is one of those "missing"
+ from 1582
+ OCI_DATE_YEAR_ZERO 0x2000 Year may not equal zero
+ OCI_DATE_INVALID_TIMEZONE 0x4000 Bad Timezone
+ OCI_DATE_INVALID_FORMAT 0x8000 Bad date format input
+
+ So, for example, if the date passed in was 2/0/1990 25:61:10 in
+ (month/day/year hours:minutes:seconds format), the error returned
+ would be OCI_DATE_INVALID_DAY | OCI_DATE_DAY_BELOW_VALID |
+ OCI_DATE_INVALID_HOUR | OCI_DATE_INVALID_MINUTE
+
+DESCRIPTION:
+ Check if the given date is valid.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'date' and 'valid' pointers are NULL pointers
+
+------------------------------- OCIDateTimeCompare-------------------------
+sword OCIDateTimeCompare(dvoid *hndl, OCIError *err, CONST OCIDateTime *date1,
+ CONST OCIDateTime *date2, sword *result );
+NAME: OCIDateTimeCompare - OCIDateTime CoMPare dates
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+date1, date2 (IN) - dates to be compared
+type (IN) - Type of datetime to be compared. Both input datetimes
+ should be of same type.(OCI_DATE, OCI_TIME,
+ OCI_TIMESTAMP, OCI_TZTIMESTAMP, OCI_TZTIME)
+result (OUT) - comparison result, 0 if equal, -1 if date1 < date2,
+ 1 if date1 > date2
+DESCRIPTION:
+The function OCIDateCompare compares two dates. It returns -1 if
+date1 is smaller than date2, 0 if they are equal, and 1 if date1 is
+greater than date2.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid date
+ input dates are not mutually comparable
+
+------------------------------OCIDateTimeConvert----------------------
+sword OCIDateTimeConvert(dvoid *hndl, OCIError *err, OCIDateTime *indate,
+ OCIDateTime *outdate);
+NAME: OCIDateTimeConvert - Conversion between different DATETIME types
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+indate (IN) - pointer to input date
+outdate (OUT) - pointer to output datetime
+DESCRIPTION: Converts one datetime type to another. The result type is
+ the type of the 'outdate' descriptor.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ conversion not possible.
+
+---------------------------- OCIDateTimeFromText-----------------------
+sword OCIDateTimeFromText(dvoid *hndl, OCIError *err, CONST OraText *date_str,
+ size_t d_str_length, CONST OraText *fmt, ub1 fmt_length,
+ CONST OraText *lang_name, size_t lang_length,
+ OCIDateTime *date );
+NAME: OCIDateTimeFromText - OCIDateTime convert String FROM Date
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the
+ conversion takes place in session NLS_LANGUAGE and
+ session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+date_str (IN) - input string to be converted to Oracle date
+d_str_length (IN) - size of the input string, if the length is -1
+ then 'date_str' is treated as a null terminated string
+fmt (IN) - conversion format; if 'fmt' is a null pointer, then
+ the string is expected to be in the default format for
+ the datetime type.
+fmt_length (IN) - length of the 'fmt' parameter
+lang_name (IN) - language in which the names and abbreviations of
+ days and months are specified, if null i.e. (OraText *)0,
+ the default language of session is used,
+lang_length (IN) - length of the 'lang_name' parameter
+date (OUT) - given string converted to date
+DESCRIPTION:
+ Converts the given string to Oracle datetime type set in the
+ OCIDateTime descriptor according to the specified format. Refer to
+ "TO_DATE" conversion function described in "Oracle SQL Language
+ Reference Manual" for a description of format.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid format
+ unknown language
+ invalid input string
+
+--------------------------- OCIDateTimeGetDate-------------------------
+void OCIDateTimeGetDate(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ sb2 *year, ub1 *month, ub1 *day );
+NAME: OCIDateTimeGetDate - OCIDateTime Get Date (year, month, day)
+ portion of DATETIME.
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime
+year (OUT) - year value
+month (OUT) - month value
+day (OUT) - day value
+
+--------------------------- OCIDateTimeGetTime ------------------------
+void OCIDateTimeGetTime(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ ub1 *hour, ub1 *min, ub1 *sec, ub4 *fsec);
+NAME: OCIDateTimeGetTime - OCIDateTime Get Time (hour, min, second,
+ fractional second) of DATETIME.
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime
+hour (OUT) - hour value
+min (OUT) - minute value
+sec (OUT) - second value
+fsec (OUT) - Fractional Second value
+
+--------------------------- OCIDateTimeGetTimeZoneOffset ----------------------
+sword OCIDateTimeGetTimeZoneOffset(dvoid *hndl,OCIError *err,CONST
+ OCIDateTime *datetime,sb1 *hour,sb1 *minute);
+
+NAME: OCIDateTimeGetTimeZoneOffset - OCIDateTime Get TimeZone (hour, minute)
+ portion of DATETIME.
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime
+hour (OUT) - TimeZone Hour value
+minute (OUT) - TimeZone Minute value
+
+
+------------------------------OCIDateTimeIntervalAdd----------------------
+sword OCIDateTimeIntervalAdd(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalAdd - Adds an interval to datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter (IN) - pointer to interval
+outdatetime (IN) - pointer to output datetime. The output datetime
+ will be of same type as input datetime
+DESCRIPTION:
+ Adds an interval to a datetime to produce a resulting datetime
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if:
+ resulting date is before Jan 1, -4713
+ resulting date is after Dec 31, 9999
+
+------------------------------OCIDateTimeIntervalSub----------------------
+sword OCIDateTimeIntervalSub(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalSub - Subtracts an interval from a datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter (IN) - pointer to interval
+outdatetime (IN) - pointer to output datetime. The output datetime
+ will be of same type as input datetime
+DESCRIPTION:
+ Subtracts an interval from a datetime and stores the result in a
+ datetime
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if:
+ resulting date is before Jan 1, -4713
+ resulting date is after Dec 31, 9999
+
+--------------------------- OCIDateTimeConstruct-------------------------
+sword OCIDateTimeConstruct(dvoid *hndl,OCIError *err,OCIDateTime *datetime,
+ sb2 year,ub1 month,ub1 day,ub1 hour,ub1 min,ub1 sec,ub4 fsec,
+ OraText *timezone,size_t timezone_length);
+
+ NAME: OCIDateTimeConstruct - Construct an OCIDateTime. Only the relevant
+ fields for the OCIDateTime descriptor types are used.
+ PARAMETERS:
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ datetime (IN) - Pointer to OCIDateTime
+ year (IN) - year value
+ month (IN) - month value
+ day (IN) - day value
+ hour (IN) - hour value
+ min (IN) - minute value
+ sec (IN) - second value
+ fsec (IN) - Fractional Second value
+ timezone (IN) - Timezone string
+ timezone_length(IN) - Length of timezone string
+DESCRIPTION:
+ Constructs a DateTime descriptor. The type of the datetime is the
+ type of the OCIDateTime descriptor. Only the relevant fields based
+ on the type are used. For Types with timezone, the date and time
+ fields are assumed to be in the local time of the specified timezone.
+ If timezone is not specified, then session default timezone is
+ assumed.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_ERROR if datetime is not valid.
+--------------------------- OCIDateTimeSysTimeStamp---------------------
+sword OCIDateTimeSysTimeStamp(dvoid *hndl, OCIError *err,
+ OCIDateTime *sys_date );
+
+NAME: OCIDateTimeSysTimeStamp - Returns system date/time as a TimeStamp with
+ timezone
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+sys_date (OUT) - Pointer to output timestamp
+
+DESCRIPTION:
+ Gets the system current date and time as a timestamp with timezone
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+------------------------------OCIDateTimeSubtract-----------------------
+sword OCIDateTimeSubtract(dvoid *hndl, OCIError *err, OCIDateTime *indate1,
+ OCIDateTime *indate2, OCIInterval *inter);
+NAME: OCIDateTimeSubtract - subtracts two datetimes to return an interval
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+indate1(IN) - pointer to subtrahend
+indate2(IN) - pointer to minuend
+inter (OUT) - pointer to output interval
+DESCRIPTION:
+ Takes two datetimes as input and stores their difference in an
+ interval. The type of the result interval is the type of the
+ 'inter' descriptor.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ datetimes are not comparable.
+
+--------------------------- OCIDateTimeToText--------------------------
+sword OCIDateTimeToText(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ CONST OraText *fmt, ub1 fmt_length, ub1 fsprec,
+ CONST OraText *lang_name, size_t lang_length,
+ ub4 *buf_size, OraText *buf );
+NAME: OCIDateTimeToText - OCIDateTime convert date TO String
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the
+ conversion takes place in session NLS_LANGUAGE and
+ session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+date (IN) - Oracle datetime to be converted
+fmt (IN) - conversion format, if null string pointer (OraText*)0, then
+ the date is converted to a character string in the
+ default format for that type.
+fmt_length (IN) - length of the 'fmt' parameter
+fsprec (IN) - specifies the fractional second precision in which the
+ fractional seconds is returned.
+lang_name (IN) - specifies the language in which the names and
+ abbreviations of months and days are returned;
+ default language of session is used if 'lang_name'
+ is null i.e. (OraText *)0
+lang_length (IN) - length of the 'nls_params' parameter
+buf_size (IN/OUT) - size of the buffer; size of the resulting string
+ is returned via this parameter
+buf (OUT) - buffer into which the converted string is placed
+DESCRIPTION:
+ Converts the given date to a string according to the specified format.
+ Refer to "TO_DATE" conversion function described in
+ "Oracle SQL Language Reference Manual" for a description of format
+ and NLS arguments. The converted null-terminated date string is
+ stored in the buffer 'buf'.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ invalid format
+ unknown language
+ overflow error
+
+----------------------------OCIDateTimeGetTimeZoneName------------------------
+sword OCIDateTimeGetTimeZoneName(dvoid *hndl,
+ OCIError *err,
+ CONST OCIDateTime *datetime,
+ ub1 *buf,
+ ub4 *buflen);
+NAME OCIDateTimeGetTimeZoneName - OCI DateTime Get the Time Zone Name
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to an OCIDateTime.
+buf (OUT) - User allocated storage for name string.
+buflen (IN/OUT) - length of buf on input, length of name on out
+DESCRIPTION:
+ Returns either the timezone region name or the absolute hour and minute
+ offset. If the DateTime was created with a region id then the region
+ name will be returned in the buf. If the region id is zero, then the
+ hour and minute offset is returned as "[-]HH:MM".
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ error retrieving timezone data
+ invalid region
+ invalid LdiDateTime type
+
+----------------------------OCIDateTimeFromArray-------------------------------
+sword OCIDateTimeFromArray(dvoid *hndl,
+ OCIError *err,
+ ub1 *inarray,
+ ub4 len
+ ub1 type
+ OCIDateTime *datetime,
+ OCIInterval *reftz,
+ ub1 fsprec);
+NAME OCIDateTimeFromArray - OCI DateTime convert From Array format
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+inarray (IN) - Pointer to input array representtion of DateTime
+len (IN) - len of inarray.
+type (IN) - One of SQLT_DATE, SQLT_TIME, SQLT_TIME_TZ, SQLT_TIMESTAMP,
+ SQLT_TIMESTAMP_TZ, or SQLT_TIMESTAMP_LTZ.
+datetime (OUT) - Pointer to the result OCIDateTime.
+reftz (IN) - timezone interval used with SQLT_TIMESTAMP_LTZ.
+fsprec (IN) - fractionl seconds digits of precision (0-9).
+DESCRIPTION:
+ Returns a pointer to an OCIDateTime of type type converted from
+ the inarray.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ error retrieving timezone data
+ invalid region
+ invalid LdiDateTime type
+
+-----------------------------OCIDateTimeToArray------------------------------
+sword OCIDateTimeToArray(dvoid *hndl,
+ OCIError *err,
+ CONST OCIDateTime *datetime,
+ CONST OCIInterval *reftz,
+ ub1 *outarray,
+ ub4 len,
+ ub1 fsprec);
+NAME OCIDateTimeToArray - OCI DateTime convert To Array format
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to the OCIDateTime to convert.
+reftz (IN) - Interval defining the timezone for SQLT_TIMESTAMP_LTZ.
+outarray (OUT) - result array.
+len (IN) - length of outarray.
+fsprec (IN) - number of fractional seconds digits.
+DESCRIPTION:
+ Returns an array representing the input DateTime descriptor.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ error retrieving timezone data
+ invalid region
+ invalid LdiDateTime type
+
+----------------------------------OCIRowidToChar-----------------------------
+Name
+OCIRowidToChar
+
+Purpose
+Converts physical/logical (universal) ROWID to chracter extended (Base 64)
+representation into user provided buffer outbfp of length outbflp. After
+execution outbflp contains amount of bytes converted.In case of truncation
+error, outbflp contains required size to make this conversion successful
+and returns ORA-1405.
+
+Syntax
+sword OCIRowidToChar( OCIRowid *rowidDesc,
+ OraText *outbfp,
+ ub2 *outbflp,
+ OCIError *errhp)
+
+Comments
+After this conversion, ROWID in character format can be bound using
+OCIBindByPos or OCIBindByName call and used to query a row at a
+desired ROWID.
+
+Parameters
+rowidDesc (IN) - rowid DESCriptor which is allocated from OCIDescritorAlloc
+ and populated by a prior SQL statement execution
+outbfp (OUT) - pointer to the buffer where converted rowid in character
+ representation is stored after successful execution.
+outbflp (IN/OUT) - pointer to output buffer length variable.
+ Before execution (IN mode) *outbflp contains the size of
+ outbfp, after execution (OUT mode) *outbflp contains amount
+ of bytes converted. In an event of truncation during
+ conversion *outbflp contains the required length to make
+ conversion successful.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+ diagnostic information in the event of an error.
+
+------------------------------OCIDefineArrayOfStruct--------------------------
+
+
+OCIDefineArrayOfStruct()
+Name
+OCI Define for Array of Structures
+Purpose
+This call specifies additional attributes necessary for a static array define.
+Syntax
+sword OCIDefineArrayOfStruct ( OCIDefine *defnp,
+ OCIError *errhp,
+ ub4 pvskip,
+ ub4 indskip,
+ ub4 rlskip,
+ ub4 rcskip );
+Comments
+This call specifies additional attributes necessary for an array define, used in
+an array of structures (multi-row, multi-column) fetch.
+For more information about skip parameters, see the section "Skip Parameters"
+on page 4-17.
+Parameters
+defnp (IN) - the handle to the define structure which was returned by a call
+to OCIDefineByPos().
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value.
+indskip (IN) - skip parameter for the next indicator location.
+rlskip (IN) - skip parameter for the next return length value.
+rcskip (IN) - skip parameter for the next return code.
+Related Functions
+OCIAttrGet()
+
+
+
+
+
+OCIDefineByPos()
+Name
+OCI Define By Position
+Purpose
+Associates an item in a select-list with the type and output data buffer.
+Syntax
+sb4 OCIDefineByPos (
+ OCIStmt *stmtp,
+ OCIDefine **defnp,
+ OCIError *errhp,
+ ub4 position,
+ dvoid *valuep,
+ sb4 value_sz,
+ ub2 dty,
+ dvoid *indp,
+ ub2 *rlenp,
+ ub2 *rcodep,
+ ub4 mode );
+Comments
+This call defines an output buffer which will receive data retreived from
+Oracle. The define is a local step which is necessary when a SELECT statement
+returns data to your OCI application.
+This call also implicitly allocates the define handle for the select-list item.
+Defining attributes of a column for a fetch is done in one or more calls. The
+first call is to OCIDefineByPos(), which defines the minimal attributes
+required to specify the fetch.
+This call takes as a parameter a define handle, which must have been
+previously allocated with a call to OCIHandleAlloc().
+Following the call to OCIDefineByPos() additional define calls may be
+necessary for certain data types or fetch modes:
+A call to OCIDefineArrayOfStruct() is necessary to set up skip parameters
+for an array fetch of multiple columns.
+A call to OCIDefineObject() is necessary to set up the appropriate
+attributes of a named data type fetch. In this case the data buffer pointer
+in ocidefn() is ignored.
+Both OCIDefineArrayOfStruct() and OCIDefineObject() must be called
+after ocidefn() in order to fetch multiple rows with a column of named
+data types.
+For a LOB define, the buffer pointer must be a lob locator of type
+OCILobLocator , allocated by the OCIDescAlloc() call. LOB locators, and not
+LOB values, are always returned for a LOB column. LOB values can then be
+fetched using OCI LOB calls on the fetched locator.
+For NCHAR (fixed and varying length), the buffer pointer must point to an
+array of bytes sufficient for holding the required NCHAR characters.
+Nested table columns are defined and fetched like any other named data type.
+If the mode parameter is this call is set to OCI_DYNAMIC_FETCH, the client
+application can fetch data dynamically at runtime.
+Runtime data can be provided in one of two ways:
+callbacks using a user-defined function which must be registered with a
+subsequent call to OCIDefineDynamic(). When the client library needs a
+buffer to return the fetched data, the callback will be invoked and the
+runtime buffers provided will return a piece or the whole data.
+a polling mechanism using calls supplied by the OCI. This mode is
+assumed if no callbacks are defined. In this case, the fetch call returns the
+OCI_NEED_DATA error code, and a piecewise polling method is used
+to provide the data.
+Related Functions: For more information about using the
+OCI_DYNAMIC_FETCH mode, see the section "Runtime Data
+Allocation and Piecewise Operations" on page 5-16 of Volume 1..
+For more information about the define step, see the section "Defining"
+on page 2-30.
+Parameters
+stmtp (IN) - a handle to the requested SQL query operation.
+defnp (IN/OUT) - a pointer to a pointer to a define handle which is implicitly
+allocated by this call. This handle is used to store the define information
+for this column.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+position (IN) - the position of this value in the select list. Positions are
+1-based and are numbered from left to right. For example, in the SELECT
+statement
+SELECT empno, ssn, mgrno FROM employees;
+empno is at position 1, ssn is at position 2, and mgrno is at position 3.
+valuep (IN/OUT) - a pointer to a buffer or an array of buffers of the type
+specified in the dty parameter. A number of buffers can be specified when
+results for more than one row are desired in a single fetch call.
+value_sz (IN) - the size of each valuep buffer in bytes. If the data is stored
+internally in VARCHAR2 format, the number of characters desired, if different
+from the buffer size in bytes, may be additionally specified by the using
+OCIAttrSet().
+In an NLS conversion environment, a truncation error will be generated if the
+number of bytes specified is insufficient to handle the number of characters
+desired.
+dty (IN) - the data type. Named data type (SQLT_NTY) and REF (SQLT_REF)
+are valid only if the environment has been intialized with in object mode.
+indp - pointer to an indicator variable or array. For scalar data types,
+pointer to sb2 or an array of sb2s. Ignored for named data types. For named
+data types, a pointer to a named data type indicator structure or an array of
+named data type indicator structures is associated by a subsequent
+OCIDefineObject() call.
+See the section "Indicator Variables" on page 2-43 for more information about
+indicator variables.
+rlenp (IN/OUT) - pointer to array of length of data fetched. Each element in
+rlenp is the length of the data in the corresponding element in the row after
+the fetch.
+rcodep (OUT) - pointer to array of column-level return codes
+mode (IN) - the valid modes are:
+OCI_DEFAULT. This is the default mode.
+OCI_DYNAMIC_FETCH. For applications requiring dynamically
+allocated data at the time of fetch, this mode must be used. The user may
+additionally call OCIDefineDynamic() to set up a callback function that
+will be invoked to receive the dynamically allocated buffers and to set
+up the memory allocate/free callbacks and the context for the callbacks.
+valuep and value_sz are ignored in this mode.
+Related Functions
+OCIDefineArrayOfStruct(), OCIDefineDynamic(), OCIDefineObject()
+
+
+
+
+OCIDefineDynamic()
+Name
+OCI Define Dynamic Fetch Attributes
+Purpose
+This call is used to set the additional attributes required if the
+OCI_DYNAMIC_FETCH mode was selected in OCIDefineByPos().
+Syntax
+sword OCIDefineDynamic( OCIDefine *defnp,
+ OCIError *errhp,
+ dvoid *octxp,
+ OCICallbackDefine (ocbfp)(
+ dvoid *octxp,
+ OCIDefine *defnp,
+ ub4 iter,
+ dvoid **bufpp,
+ ub4 **alenpp,
+ ub1 *piecep,
+ dvoid **indpp,
+ ub2 **rcodep) );
+Comments
+This call is used to set the additional attributes required if the
+OCI_DYNAMIC_FETCH mode has been selected in a call to
+OCIDefineByPos().
+When the OCI_DYNAMIC_FETCH mode is selected, buffers will be
+dynamically allocated for REF, and named data type, values to receive the
+data. The pointers to these buffers will be returned.
+If OCI_DYNAMIC_FETCH mode was selected, and the call to
+OCIDefineDynamic() is skipped, then the application can fetch data piecewise
+using OCI calls.
+For more information about OCI_DYNAMIC_FETCH mode, see the section
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+defnp (IN/OUT) - the handle to a define structure returned by a call to
+OCIDefineByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+octxp (IN) - points to a context for the callback function.
+ocbfp (IN) - points to a callback function. This is invoked at runtime to get
+a pointer to the buffer into which the fetched data or a piece of it will be
+retreived. The callback also specifies the indicator, the return code and the
+lengths of the data piece and indicator. The callback has the following
+parameters:
+octxp (IN) - a context pointer passed as an argument to all the callback
+functions.
+defnp (IN) - the define handle.
+iter (IN) - which row of this current fetch.
+bufpp (OUT) - returns a pointer to a buffer to store the column value, ie.
+*bufp points to some appropriate storage for the column value.
+alenpp (OUT) - returns a pointer to the length of the buffer. *alenpp
+contains the size of the buffer after return from callback. Gets set to
+actual data size after fetch.
+piecep (IN/OUT) - returns a piece value, as follows:
+The IN value can be OCI_ONE_PIECE, OCI_FIRST_PIECE or
+OCI_NEXT_PIECE.
+The OUT value can be OCI_ONE_PIECE if the IN value was
+OCI_ONE_PIECE.
+The OUT value can be OCI_ONE_PIECE or OCI_FIRST_PIECE if
+the IN value was OCI_FIRST_PIECE.
+The OUT value can only be OCI_NEXT_PIECE or
+OCI_LAST_PIECE if the IN value was OCI_NEXT_PIECE.
+indpp (IN) - indicator variable pointer
+rcodep (IN) - return code variable pointer
+Related Functions
+OCIAttrGet()
+OCIDefineObject()
+
+
+
+
+OCIDefineObject()
+Name
+OCI Define Named Data Type attributes
+Purpose
+Sets up additional attributes necessary for a Named Data Type define.
+Syntax
+sword OCIDefineObject ( OCIDefine *defnp,
+ OCIError *errhp,
+ CONST OCIType *type,
+ dvoid **pgvpp,
+ ub4 *pvszsp,
+ dvoid **indpp,
+ ub4 *indszp );
+Comments
+This call sets up additional attributes necessary for a Named Data Type define.An error will be returned if this function is called when the OCI environment
+has been initialized in non-Object mode.
+This call takes as a paramter a type descriptor object (TDO) of datatype
+OCIType for the named data type being defined. The TDO can be retrieved
+with a call to OCITypeByName().
+See the description of OCIInitialize() on page 13 - 43 for more information
+about initializing the OCI process environment.
+Parameters
+defnp (IN/OUT) - a define handle previously allocated in a call to
+OCIDefineByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+type (IN, optional) - points to the Type Descriptor Object (TDO) which
+describes the type of the program variable. Only used for program variables
+of type SQLT_NTY. This parameter is optional, and may be passed as NULL
+if it is not being used.
+pgvpp (IN/OUT) - points to a pointer to a program variable buffer. For an
+array, pgvpp points to an array of pointers. Memory for the fetched named data
+type instance(s) is dynamically allocated in the object cache. At the end of the
+fetch when all the values have been received, pgvpp points to the pointer(s) to
+these newly allocated named data type instance(s). The application must call
+OCIObjectMarkDel() to deallocate the named data type instance(s) when they
+are no longer needed.
+pvszsp (IN/OUT) - points to the size of the program variable. For an array, it
+is an array of ub4s. On return points to the size(s) of unpickled fetched
+values.
+indpp (IN/OUT) - points to a pointer to the program variable buffer
+containing the parallel indicator structure. For an array, points to an array
+of pointers. Memory is allocated to store the indicator structures in the
+object cache. At the end of the fetch when all values have been received,
+indpp points to the pointer(s) to these newly allocated indicator structure(s).
+indszp (IN/OUT) - points to the size(s) of the indicator structure program
+variable. For an array, it is an array of ub4s. On return points to the size(s)
+of the unpickled fetched indicator values.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIDescAlloc()
+Name
+OCI Get DESCriptor or lob locator
+Purpose
+Allocates storage to hold certain data types. The descriptors can be used as
+bind or define variables.
+Syntax
+sword OCIDescAlloc ( CONST dvoid *parenth,
+ dvoid **descpp,
+ ub4 type,
+ size_t xtramem_sz,
+ dvoid **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to
+the type specified in type. A non-NULL descriptor or LOB locator is returned
+on success. No diagnostics are available on error.
+This call returns OCI_SUCCESS if successful, or OCI_INVALID_HANDLE if
+an out-of-memory error occurs.
+Parameters
+parenth (IN) - an environment handle.
+descpp (OUT) - returns a descriptor or LOB locator of desired type.
+type (IN) - specifies the type of descriptor or LOB locator to be allocated.
+The specific types are:
+OCI_DTYPE_SNAP - specifies generation of snapshot descriptor of C
+type - OCISnapshot
+OCI_DTYPE_LOB - specifies generation of a LOB data type locator of C
+type - OCILobLocator
+OCI_DTYPE_RSET - specifies generation of a descriptor of C type
+OCIResult that references a result set (a number of rows as a result of a
+query). This descriptor is bound to a bind variable of data type
+SQLT_RSET (result set). The descriptor has to be converted into a
+statement handle using a function - OCIResultSetToStmt() - which can
+then be passed to OCIDefineByPos() and OCIStmtFetch() to retrieve the
+rows of the result set.
+OCI_DTYPE_ROWID - specifies generation of a ROWID descriptor of C
+type OCIRowid.
+OCI_DTYPE_COMPLEXOBJECTCOMP - specifies generation of a
+complex object retrieval descriptor of C type
+OCIComplexObjectComp.
+xtramemsz (IN) - specifies an amount of user memory to be allocated for use
+by the application.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz
+allocated by the call for the user.
+Related Functions
+OCIDescFree()
+
+
+
+
+OCIDescFree()
+Name
+OCI Free DESCriptor
+Purpose
+Deallocates a previously allocated descriptor.
+Syntax
+sword OCIDescFree ( dvoid *descp,
+ ub4 type);
+Comments
+This call frees up storage associated with the descriptor, corresponding to the
+type specified in type. Returns OCI_SUCCESS or OCI_INVALID_HANDLE.
+All descriptors must be explicitly deallocated. OCI will not deallocate a
+descriptor if the environment handle is deallocated.
+Parameters
+descp (IN) - an allocated descriptor.
+type (IN) - specifies the type of storage to be freed. The specific types are:
+OCI_DTYPE_SNAP - snapshot descriptor
+OCI_DTYPE_LOB - a LOB data type descriptor
+OCI_DTYPE_RSET - a descriptor that references a result set (a number
+of rows as a result of a query).
+OCI_DTYPE_ROWID - a ROWID descriptor
+OCI_DTYPE_COMPLEXOBJECTCOMP - a complex object retrieval
+descriptor
+Related Functions
+OCIDescAlloc()
+
+
+
+OCIDescribeAny()
+Name
+OCI DeSCribe Any
+Purpose
+Describes existing schema objects.
+Syntax
+sword OCIDescribeAny ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ dvoid *objptr,
+ ub4 objptr_len,
+ ub1 objptr_typ,
+ ub1 info_level,
+ ub1 objtype,
+ OCIDesc *dschp );
+Comments
+This is a generic describe call that describes existing schema objects: tables,
+views, synonyms, procedures, functions, packages, sequences, and types. As a
+result of this call, the describe handle is populated with the object-specific
+attributes which can be obtained through an OCIAttrGet() call.
+An OCIParamGet() on the describe handle returns a parameter descriptor for a
+specified position. Parameter positions begin with 1. Calling OCIAttrGet() on
+the parameter descriptor returns the specific attributes of a stored procedure
+or function parameter or a table column descriptor as the case may be.
+These subsequent calls do not need an extra round trip to the server because
+the entire schema object description cached on the client side by
+OCIDescribeAny(). Calling OCIAttrGet() on the describe handle can also return
+the total number of positions.
+See the section "Describing" on page 2-33 for more information about describe
+operations.
+Parameters
+TO BE UPDATED
+svchp (IN/OUT) - a service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+objptr (IN) - the name of the object (a null-terminated string) to be
+described. Only procedure or function names are valid when connected to an
+Oracle7 Server.
+objptr_len (IN) - the length of the string. Must be non-zero.
+objptr_typ (IN) - Must be OCI_OTYPE_NAME, OCI_OTYPE_REF, or OCI_OTYPE_PTR.
+info_level (IN) - reserved for future extensions. Pass OCI_DEFAULT.
+objtype (IN/OUT) - Object type.
+dschp (IN/OUT) - a describe handle that is populated with describe
+information about the object after the call.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIEnvCreate()
+Name
+OCI ENVironment CREATE
+Purpose
+This function creates and initializes an environment for the rest of
+the OCI functions to work under. This call is a replacement for both
+the OCIInitialize and OCIEnvInit calls.
+Syntax
+sword OCIEnvCreate ( OCIEnv **envhpp,
+ ub4 mode,
+ dvoid *ctxp,
+ dvoid *(*malocfp)
+ (dvoid *ctxp,
+ size_t size),
+ dvoid *(*ralocfp)
+ (dvoid *ctxp,
+ dvoid *memptr,
+ size_t newsize),
+ void (*mfreefp)
+ (dvoid *ctxp,
+ dvoid *memptr))
+ size_t xtramemsz,
+ dvoid **usrmempp );
+
+Comments
+This call creates an environment for all the OCI calls using the modes
+specified by the user. This call can be used instead of the two calls
+OCIInitialize and OCIEnvInit. This function returns an environment handle
+which is then used by the remaining OCI functions. There can be multiple
+environments in OCI each with its own environment modes. This function
+also performs any process level initialization if required by any mode.
+For example if the user wants to initialize an environment as OCI_THREADED,
+then all libraries that are used by OCI are also initialized in the
+threaded mode.
+
+This call should be invoked before anny other OCI call and should be used
+instead of the OCIInitialize and OCIEnvInit calls. This is the recommended
+call, although OCIInitialize and OCIEnvInit calls will still be supported
+for backward compatibility.
+
+envpp (OUT) - a pointer to a handle to the environment.
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data
+structures are protected from concurrent accesses by multiple threads.
+OCI_OBJECT - will use navigational object interface.
+ctxp (IN) - user defined context for the memory call back routines.
+malocfp (IN) - user-defined memory allocation function. If mode is
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+xtramemsz (IN) - specifies the amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz
+allocated by the call for the user.
+
+Example
+
+Related Functions
+OCIInitialize, OCIEnvInit
+
+
+OCIEnvNlsCreate()
+Name
+OCI ENVironment CREATE with NLS info
+Purpose
+This function does almost everything OCIEnvCreate does, plus enabling setting
+of charset and ncharset programmatically, except OCI_UTF16 mode.
+Syntax
+sword OCIEnvNlsCreate(OCIEnv **envhpp,
+ ub4 mode,
+ dvoid *ctxp,
+ dvoid *(*malocfp)
+ (dvoid *ctxp,
+ size_t size),
+ dvoid *(*ralocfp)
+ (dvoid *ctxp,
+ dvoid *memptr,
+ size_t newsize),
+ void (*mfreefp)
+ (dvoid *ctxp,
+ dvoid *memptr),
+ size_t xtramemsz,
+ dvoid **usrmempp,
+ ub2 charset,
+ ub2 ncharset)
+Comments
+The parameters have the same meaning as the ones in OCIEnvCreate().
+The charset and ncharset must be both zero or non-zero.
+When charset or ncharset is non-zero, the corresponding character set will
+be used to replace the ones specified in NLS_LANG or NLS_NCHAR. Moreover,
+OCI_UTF16ID is allowed to be set as charset and ncharset.
+On the other hand, OCI_UTF16 mode is deprecated with this function.
+Applications can achieve the same effects by setting
+both charset and ncharset as OCI_UTF16ID.
+
+
+OCIEnvInit()
+Name
+OCI INITialize environment
+Purpose
+This call initializes the OCI environment handle.
+Syntax
+sword OCIEnvInit ( OCIEnv **envp,
+ ub4 mode,
+ size_t xtramemsz,
+ dvoid **usrmempp );
+Comments
+Initializes the OCI environment handle. No changes are done on an initialized
+handle. If OCI_ERROR or OCI_SUCCESS_WITH_INFO is returned, the
+environment handle can be used to obtain ORACLE specific errors and
+diagnostics.
+This call is processed locally, without a server round-trip.
+Parameters
+envpp (OUT) - a pointer to a handle to the environment.
+mode (IN) - specifies initialization of an environment mode. The only valid
+mode is OCI_DEFAULT for default mode
+xtramemsz (IN) - specifies the amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz
+allocated by the call for the user.
+Example
+See the description of OCISessionBegin() on page 13-84 for an example showing
+the use of OCIEnvInit().
+Related Functions
+
+
+
+
+OCIErrorGet()
+Name
+OCI Get Diagnostic Record
+Purpose
+Returns an error message in the buffer provided and an ORACLE error.
+Syntax
+sword OCIErrorGet ( dvoid *hndlp,
+ ub4 recordno,
+ OraText *sqlstate,
+ ub4 *errcodep,
+ OraText *bufp,
+ ub4 bufsiz,
+ ub4 type );
+Comments
+Returns an error message in the buffer provided and an ORACLE error.
+Currently does not support SQL state. This call can be called a multiple
+number of times if there are more than one diagnostic record for an error.
+The error handle is originally allocated with a call to OCIHandleAlloc().
+Parameters
+hndlp (IN) - the error handle, in most cases, or the environment handle (for
+errors on OCIEnvInit(), OCIHandleAlloc()).
+recordno (IN) - indicates the status record from which the application seeks
+info. Starts from 1.
+sqlstate (OUT) - Not supported in Version 8.0.
+errcodep (OUT) - an ORACLE Error is returned.
+bufp (OUT) - the error message text is returned.
+bufsiz (IN) - the size of the buffer provide to get the error message.
+type (IN) - the type of the handle.
+Related Functions
+OCIHandleAlloc()
+
+OCIExtractInit
+Name
+OCI Extract Initialize
+Purpose
+This function initializes the parameter manager.
+Syntax
+sword OCIExtractInit(dvoid *hndl, OCIError *err);
+Comments
+It must be called before calling any other parameter manager routine. The NLS
+information is stored inside the parameter manager context and used in
+subsequent calls to OCIExtract routines.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractTerm()
+
+OCIExtractTerm
+Name
+OCI Extract Terminate
+Purpose
+This function releases all dynamically allocated storage and may perform
+other internal bookkeeping functions.
+Syntax
+sword OCIExtractTerm(dvoid *hndl, OCIError *err);
+Comments
+It must be called when the parameter manager is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractInit()
+
+OCIExtractReset
+Name
+OCI Extract Reset
+Purpose
+The memory currently used for parameter storage, key definition storage, and
+parameter value lists is freed and the structure is reinitialized.
+Syntax
+sword OCIExtractReset(dvoid *hndl, OCIError *err);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+Related Functions
+
+OCIExtractSetNumKeys
+Name
+OCI Extract Set Number of Keys
+Purpose
+Informs the parameter manager of the number of keys that will be registered.
+Syntax
+sword OCIExtractSetNumKeys(dvoid *hndl, OCIError *err, uword numkeys);
+Comments
+This routine must be called prior to the first call of OCIExtractSetKey().
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+numkeys (IN) - The number of keys that will be registered with
+ OCIExtractSetKey().
+Related Functions
+OCIExtractSetKey()
+
+OCIExtractSetKey
+Name
+OCI Extract Set Key definition
+Purpose
+Registers information about a key with the parameter manager.
+Syntax
+sword OCIExtractSetKey(dvoid *hndl, OCIError *err, CONST OraText *name, ub1 type,
+ ub4 flag, CONST dvoid *defval, CONST sb4 *intrange,
+ CONST OraText *CONST *strlist);
+Comments
+This routine must be called after calling OCIExtractSetKey() and before
+calling OCIExtractFromFile() or OCIExtractFromStr().
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+name (IN) - The name of the key.
+type (IN) - The type of the key (OCI_EXTRACT_TYPE_INTEGER,
+ OCI_EXTRACT_TYPE_OCINUM, OCI_EXTRACT_TYPE_STRING, or
+ OCI_EXTRACT_TYPE_BOOLEAN).
+flag (IN) - Set to OCI_EXTRACT_MULTIPLE if the key can take multiple values
+ or 0 otherwise.
+defval (IN) - Set to the default value for the key. May be NULL if there is
+ no default. A string default must be a (text*) type, an
+ integer default must be an (sb4*) type, and a boolean default
+ must be a (ub1*) type.
+intrange (IN) - Starting and ending values for the allowable range of integer
+ values. May be NULL if the key is not an integer type or if
+ all integer values are acceptable.
+strlist (IN) - List of all acceptable text strings for the key. May be NULL
+ if the key is not a string type or if all text values are
+ acceptable.
+Related Functions
+OCIExtractSetNumKeys()
+
+OCIExtractFromFile
+Name
+OCI Extract parameters From File
+Purpose
+The keys and their values in the given file are processed.
+Syntax
+sword OCIExtractFromFile(dvoid *hndl, OCIError *err, ub4 flag, OraText *filename);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set:
+ OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or
+ OCI_EXTRACT_APPEND_VALUES.
+filename (IN) - Null-terminated filename string.
+Related Functions
+
+OCIExtractFromStr
+Name
+OCI Extract parameters From String
+Purpose
+The keys and their values in the given string are processed.
+Syntax
+sword OCIExtractFromStr(dvoid *hndl, OCIError *err, ub4 flag, OraText *input);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set:
+ OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or
+ OCI_EXTRACT_APPEND_VALUES.
+input (IN) - Null-terminated input string.
+Related Functions
+
+OCIExtractToInt
+Name
+OCI Extract To Integer
+Purpose
+Gets the integer value for the specified key.
+Syntax
+sword OCIExtractToInt(dvoid *hndl, OCIError *err, OraText *keyname, uword valno,
+ sb4 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR.
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual integer value.
+Related Functions
+
+OCIExtractToBool
+Name
+OCI Extract To Boolean
+Purpose
+Gets the boolean value for the specified key.
+Syntax
+sword OCIExtractToBool(dvoid *hndl, OCIError *err, OraText *keyname, uword valno,
+ ub1 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR.
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual boolean value.
+Related Functions
+
+OCIExtractToStr
+Name
+OCI Extract To String
+Purpose
+Gets the string value for the specified key.
+Syntax
+sword OCIExtractToStr(dvoid *hndl, OCIError *err, OraText *keyname, uword valno,
+ OraText *retval, uword buflen);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR.
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual null-terminated string value.
+buflen (IN) - The length of the buffer for retval.
+Related Functions
+
+Note: The following OCIExtract functions are unavailable in this release
+
+OCIExtractToOCINum
+Name
+OCI Extract To OCI Number
+Purpose
+Gets the OCINumber value for the specified key.
+Syntax
+sword OCIExtractToOCINum(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, OCINumber *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR.
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual OCINumber value.
+Related Functions
+
+OCIExtractToList
+Name
+OCI Extract To parameter List
+Purpose
+Generates a list of parameters from the parameter structures that are stored
+in memory.
+Syntax
+sword OCIExtractToList(dvoid *hndl, OCIError *err, uword *numkeys);
+Comments
+Must be called before OCIExtractValues() is called.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+numkeys (OUT) - Number of distinct keys stored in memory.
+Related Functions
+OCIExtractFromList()
+
+OCIExtractFromList
+Name
+OCI Extract From parameter List
+Purpose
+Generates a list of values for the a parameter in the parameter list.
+Syntax
+sword OCIExtractFromList(dvoid *hndl, OCIError *err, uword index, OraText *name,
+ ub1 *type, uword *numvals, dvoid ***values);
+Comments
+Parameters are specified by an index. OCIExtractToList() must be called prior
+to calling this routine to generate the parameter list from the parameter
+structures that are stored in memory.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+name (OUT) - Name of the key for the current parameter.
+type (OUT) - Type of the current parameter (OCI_EXTRACT_TYPE_STRING,
+ OCI_EXTRACT_TYPE_INTEGER, OCI_EXTRACT_TYPE_OCINUM, or
+ OCI_EXTRACT_TYPE_BOOLEAN)
+numvals (OUT) - Number of values for this parameter.
+values (OUT) - The values for this parameter.
+Related Functions
+OCIExtractToList()
+
+
+************************ OCIFileClose() ***********************************
+
+Name
+ OCIFileClose - Oracle Call Interface FILE i/o CLOSE
+
+Purpose
+ Close a previously opened file.
+
+Syntax
+ sword OCIFileClose ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep )
+
+Comments
+ This function will close a previously opened file. If the function succeeds
+ then OCI_SUCCESS will be returned, else OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen.
+
+
+
+********************* OCIFileExists() **************************************
+
+Name
+ OCIFileExists - Oracle Call Interface FILE i/o EXIST
+
+Purpose
+ Check to see if the file exists.
+
+Syntax
+ sword OCIFileExists ( dvoid *hndl,
+ OCIError *err,
+ OraText *filename,
+ OraText *path,
+ ub1 *flag )
+
+Comments
+ This function will set the flag to TRUE if the file exists else it will
+ be set to FALSE.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl(IN) - OCI environment or session handleenv
+ err(OUT) - OCI error handle
+ filename(IN) - filename
+ path(IN) - path of the file
+ flag(OUT) - whether the file exists or not
+
+Related Functions.
+ None.
+
+
+ **************************** OCIFileFlush() ******************************
+
+
+Name
+ OCIFileFlush - Oracle Call Interface File i/o FLUSH
+
+Purpose
+ Flush the buffers associated with the file to the disk.
+
+Syntax
+ sword OCIFileFlush ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep )
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen, OCIFileWrite
+
+
+
+ *************************** OCIFileGetLength() ****************************
+
+Name
+ OCIFileGetLength - Oracle Call Interface FILE i/o GET file LENGTH
+
+Purpose
+ Get the length of a file.
+
+Syntax
+ OCIFileGetLength(dvoid *hndl,
+ OCIError *err,
+ OraText *filename,
+ OraText *path,
+ ubig_ora *lenp )
+
+Comments
+ The length of the file will be returned in lenp.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filename (IN) - file name.
+ path (IN) - path of the file.
+ lenp (OUT) - On output, it is the length of the file in bytes.
+ is the number of bytes in the file.
+
+Related Functions
+ None.
+
+
+
+******************************** OCIFileInit() *****************************
+
+Name
+ OCIFileInit - Oracle Call Interface FILE i/o INITialize
+
+Purpose
+ Initialize the OCI File I/O package and create the OCIFile context.
+
+Syntax
+ sword OCIFileInit ( dvoid *hndl,
+ OCIError *err)
+
+Comments
+ This function should be called before any of the OCIFile functions are
+ used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure.
+
+Related Functions
+ OCIFileTerm
+
+
+
+********************************* OCIFileOpen() *****************************
+
+Name
+ OCIFileOpen - Oracle Call Interface File i/o OPEN
+
+Purpose
+ Open a file.
+
+Syntax
+ sword OCIFileOpen ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject **filep,
+ OraText *filename,
+ OraText *path,
+ ub4 mode,
+ ub4 create,
+ ub4 type )
+
+Comments
+ OCIFileOpen returns a handle to the open file in filep if the file is
+ successfully opened.
+ If one wants to use the standard file objects (stdin, stdout & stderr)
+ then OCIFileOpen whould be called with the type filed containing the
+ appropriate type (see the parameter type). If any of the standard files
+ are specified then filename, path, mode and create are ignored.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (OUT) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filep (OUT) - the file object to be returned.
+ filename (IN) - file name (NULL terminated string).
+ path (IN) - path of the file (NULL terminated string).
+ mode - mode in which to open the file (valid modes are OCI_FILE_READONLY,
+ OCI_FILE_WRITEONLY, OCI_FILE_READ_WRITE).
+ create - should the file be created if it does not exist. Valid values
+ are:
+ OCI_FILE_TRUNCATE - create a file regardless of whether or not it exists.
+ If the file already exists overwrite it.
+ OCI_FILE_EXCL - fail if the file exists, else create.
+ OCI_FILE_EXIST - open it if it exists, else fail.
+ OCI_FILE_CREATE - open the file if it exists, and create it if it doesn't.
+ OCI_FILE_APPEND - set the file pointer to the end of the file prior to
+ writing(this flag can be OR'ed with OCI_FILE_EXIST or
+ OCI_FILE_CREATE).
+type - file type. Valid values are OCI_FILE_TEXT, OCI_FILE_BIN,
+ OCI_FILE_STDIN, OCI_FILE_STDOUT and OCI_FILE_STDERR.
+ If any of the standard files are specified then filename, path, mode
+ and create are ignored.
+
+Related Functions.
+ OCIFileClose
+
+
+
+************************** OCIFileRead() ************************************
+
+Name
+ OCIFileRead - Oracle Call Interface FILE i/o READ
+
+Purpose
+ Read from a file into a buffer.
+
+Syntax
+ sword OCIFileRead ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep,
+ dvoid *bufp,
+ ub4 bufl,
+ ub4 *bytesread )
+
+Comments
+ Upto bufl bytes from the file will be read into bufp. The user should
+ allocate memory for the buffer.
+ The number of bytes read would be in bytesread.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a File Object that uniquely references the file.
+ bufp (IN) - the pointer to a buffer into which the data will be read. The
+ length of the allocated memory is assumed to be bufl.
+ bufl - the length of the buffer in bytes.
+ bytesread (OUT) - the number of bytes read.
+
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileWrite
+
+
+
+****************************** OCIFileSeek() ******************************
+
+Name
+ OCIFileSeek - Oracle Call Interface FILE i/o SEEK
+
+Purpose
+ Perfom a seek to a byte position.
+
+Syntax
+ sword OCIFileSeek ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep,
+ uword origin,
+ ubig_ora offset,
+ sb1 dir)
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ origin - The starting point we want to seek from. NOTE: The starting
+ point may be OCI_FILE_SEEK_BEGINNING (beginning), OCI_FILE_SEEK_CURRENT
+ (current position), or OCI_FILE_SEEK_END (end of file).
+ offset - The number of bytes from the origin we want to start reading from.
+ dir - The direction we want to go from the origin. NOTE: The direction
+ can be either OCI_FILE_FORWARD or OCI_FILE_BACKWARD.
+
+Related Function
+ OCIFileOpen, OCIFileRead, OCIFileWrite
+
+
+
+*************************** OCIFileTerm() **********************************
+
+Name
+ OCIFileTerm - Oracle Call Interface FILE i/o TERMinate
+
+Purpose
+ Terminate the OCI File I/O package and destroy the OCI File context.
+
+Syntax
+ sword OCIFileTerm ( dvoid *hndl,
+ OCIError *err )
+
+Comments
+ After this function has been called no OCIFile function should be used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure.
+
+Related Functions
+ OCIFileInit
+
+
+********************************* OCIFileWrite() ****************************
+
+Name
+ OCIFileWrite - Oracle Call Interface FILE i/o WRITE
+
+Purpose
+ Write data from buffer into a file.
+
+Syntax
+ sword OCIFileWrite ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep,
+ dvoid *bufp,
+ ub4 buflen
+ ub4 *byteswritten )
+
+Comments
+ The number of bytes written will be in *byteswritten.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ bufp (IN) - the pointer to a buffer from which the data will be written.
+ The length of the allocated memory is assumed to be the value passed
+ in bufl.
+ bufl - the length of the buffer in bytes.
+ byteswritten (OUT) - the number of bytes written.
+
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileRead
+
+
+
+OCIHandleAlloc()
+Name
+OCI Get HaNDLe
+Purpose
+This call returns a pointer to an allocated and initialized handle.
+Syntax
+sword OCIHandleAlloc ( CONST dvoid *parenth,
+ dvoid **hndlpp,
+ ub4 type,
+ size_t xtramem_sz,
+ dvoid **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to
+the type specified in type. A non-NULL handle is returned on success. Bind
+handle and define handles are allocated with respect to a statement handle. All
+other handles are allocated with respect to an environment handle which is
+passed in as a parent handle.
+No diagnostics are available on error. This call returns OCI_SUCCESS if
+successful, or OCI_INVALID_HANDLE if an out-of-memory error occurs.
+Handles must be allocated using OCIHandleAlloc() before they can be passed
+into an OCI call.
+Parameters
+parenth (IN) - an environment or a statement handle.
+hndlpp (OUT) - returns a handle to a handle type.
+type (IN) - specifies the type of handle to be allocated. The specific types
+are:
+OCI_HTYPE_ERROR - specifies generation of an error report handle of
+C type OCIError
+OCI_HTYPE_SVCCTX - specifies generation of a service context handle
+of C type OCISvcCtx
+OCI_HTYPE_STMT - specifies generation of a statement (application
+request) handle of C type OCIStmt
+OCI_HTYPE_BIND - specifies generation of a bind information handle
+of C type OCIBind
+OCI_HTYPE_DEFINE - specifies generation of a column definition
+handle of C type OCIDefine
+OCI_HTYPE_DESCRIBE - specifies generation of a select list
+description handle of C type OCIDesc
+OCI_HTYPE_SERVER - specifies generation of a server context handle
+of C type OCIServer
+OCI_HTYPE_SESSION - specifies generation of an authentication
+context handle of C type OCISession
+OCI_HTYPE_TRANS - specifies generation of a transaction context
+handle of C type OCITrans
+OCI_HTYPE_COMPLEXOBJECT - specifies generation of a complex
+object retrieval handle of C type OCIComplexObject
+OCI_HTYPE_SECURITY - specifies generation of a security handle of C
+type OCISecurity
+xtramem_sz (IN) - specifies an amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz
+allocated by the call for the user.
+Related Functions
+OCIHandleFree()
+
+
+
+OCIHandleFree()
+Name
+OCI Free HaNDLe
+Purpose
+This call explicitly deallocates a handle.
+Syntax
+sword OCIHandleFree ( dvoid *hndlp,
+ ub4 type);
+Comments
+This call frees up storage associated with a handle, corresponding to the type
+specified in the type parameter.
+This call returns either OCI_SUCCESS or OCI_INVALID_HANDLE.
+All handles must be explicitly deallocated. OCI will not deallocate a child
+handle if the parent is deallocated.
+Parameters
+hndlp (IN) - an opaque pointer to some storage.
+type (IN) - specifies the type of storage to be allocated. The specific types are:
+OCI_HTYPE_ENV - an environment handle
+OCI_HTYPE_ERROR - an error report handle
+OCI_HTYPE_SVCCTX - a service context handle
+OCI_HTYPE_STMT - a statement (application request) handle
+OCI_HTYPE_BIND - a bind information handle
+OCI_HTYPE_DEFINE - a column definition handle
+OCI_HTYPE_DESCRIBE - a select list description handle
+OCI_HTYPE_SERVER - a server handle
+OCI_HTYPE_SESSION - a user authentication handle
+OCI_HTYPE_TRANS - a transaction handle
+OCI_HTYPE_COMPLEXOBJECT - a complex object retrieval handle
+OCI_HTYPE_SECURITY - a security handle
+Related Functions
+OCIHandleAlloc()
+
+
+
+
+OCIInitialize()
+Name
+OCI Process Initialize
+Purpose
+Initializes the OCI process environment.
+Syntax
+sword OCIInitialize ( ub4 mode,
+ CONST dvoid *ctxp,
+ CONST dvoid *(*malocfp)
+ ( dvoid *ctxp,
+ size_t size ),
+ CONST dvoid *(*ralocfp)
+ ( dvoid *ctxp,
+ dvoid *memp,
+ size_t newsize ),
+ CONST void (*mfreefp)
+ ( dvoid *ctxp,
+ dvoid *memptr ));
+Comments
+This call initializes the OCI process environment.
+OCIInitialize() must be invoked before any other OCI call.
+Parameters
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data
+structures are protected from concurrent accesses by multiple threads.
+OCI_OBJECT - will use navigational object interface.
+ctxp (IN) - user defined context for the memory call back routines.
+malocfp (IN) - user-defined memory allocation function. If mode is
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing
+the use of OCIInitialize().
+Related Functions
+
+
+--------------------------------OCITerminate------------------------------------
+
+OCITerminate()
+Name
+OCI process Terminate
+Purpose
+Do cleanup before process termination
+Syntax
+sword OCITerminate ( ub4 mode);
+
+Comments
+This call performs OCI related clean up before the OCI process terminates.
+If the process is running in shared mode then the OCI process is disconnected
+from the shared memory subsystem.
+
+OCITerminate() should be the last OCI call in any process.
+
+Parameters
+mode (IN) - specifies different termination modes.
+
+OCI_DEFAULT - default mode.
+
+Example
+
+Related Functions
+OCIInitialize()
+
+ ---------------------- OCIIntervalAssign --------------------
+void OCIIntervalAssign(dvoid *hndl, OCIError *err, CONST OCIInterval *inpinter,
+ OCIInterval *outinter );
+
+ DESCRIPTION
+ Copies one interval to another to create a replica
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) inpinter - Input Interval
+ (OUT) outinter - Output Interval
+ RETURNS
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_SUCCESS otherwise
+
+ ---------------------- OCIIntervalCheck --------------------
+sword OCIIntervalCheck(dvoid *hndl, OCIError *err, CONST OCIInterval *interval,
+ ub4 *valid );
+
+ DESCRIPTION
+ Checks the validity of an interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) interval - Interval to be checked
+ (OUT) valid - Zero if the interval is valid, else returns an Ored
+ combination of the following codes.
+
+ Macro name Bit number Error
+ ---------- ---------- -----
+ OCI_INTER_INVALID_DAY 0x1 Bad day
+ OCI_INTER_DAY_BELOW_VALID 0x2 Bad DAy Low/high bit (1=low)
+ OCI_INTER_INVALID_MONTH 0x4 Bad MOnth
+ OCI_INTER_MONTH_BELOW_VALID 0x8 Bad MOnth Low/high bit (1=low)
+ OCI_INTER_INVALID_YEAR 0x10 Bad YeaR
+ OCI_INTER_YEAR_BELOW_VALID 0x20 Bad YeaR Low/high bit (1=low)
+ OCI_INTER_INVALID_HOUR 0x40 Bad HouR
+ OCI_INTER_HOUR_BELOW_VALID 0x80 Bad HouR Low/high bit (1=low)
+ OCI_INTER_INVALID_MINUTE 0x100 Bad MiNute
+ OCI_INTER_MINUTE_BELOW_VALID 0x200 Bad MiNute Low/high bit(1=low)
+ OCI_INTER_INVALID_SECOND 0x400 Bad SeCond
+ OCI_INTER_SECOND_BELOW_VALID 0x800 bad second Low/high bit(1=low)
+ OCI_INTER_INVALID_FRACSEC 0x1000 Bad Fractional second
+ OCI_INTER_FRACSEC_BELOW_VALID 0x2000 Bad fractional second Low/High
+
+
+ RETURNS
+ OCI_SUCCESS if interval is okay
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalCompare --------------------
+sword OCIIntervalCompare(dvoid *hndl, OCIError *err, OCIInterval *inter1,
+ OCIInterval *inter2, sword *result );
+
+ DESCRIPTION
+ Compares two intervals, returns 0 if equal, -1 if inter1 < inter2,
+ 1 if inter1 > inter2
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ inter1 (IN) - Interval to be compared
+ inter2 (IN) - Interval to be compared
+ result (OUT) - comparison result, 0 if equal, -1 if inter1 < inter2,
+ 1 if inter1 > inter2
+
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ the two input datetimes are not mutually comparable.
+
+---------------------- OCIIntervalDivide --------------------
+sword OCIIntervalDivide(dvoid *hndl, OCIError *err, OCIInterval *dividend,
+ OCINumber *divisor, OCIInterval *result );
+
+ DESCRIPTION
+ Divides an interval by an Oracle Number to produce an interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ dividend (IN) - Interval to be divided
+ divisor (IN) - Oracle Number dividing `dividend'
+ result (OUT) - resulting interval (dividend / divisor)
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalFromNumber --------------------
+sword OCIIntervalFromNumber(dvoid *hndl, OCIError *err,
+ OCIInterval *inter, OCINumber *number);
+ DESCRIPTION
+ Converts an interval to an Oracle Number
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (OUT) interval - Interval to be converted
+ (IN) number - Oracle number result (in years for YEARMONTH interval
+ and in days for DAYSECOND)
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR on error.
+ NOTES
+ Fractional portions of the date (for instance, minutes and seconds if
+ the unit chosen is hours) will be included in the Oracle number produced.
+ Excess precision will be truncated.
+
+ ---------------------- OCIIntervalFromText --------------------
+sword OCIIntervalFromText(dvoid *hndl, OCIError *err, CONST OraText *inpstring,
+ size_t str_len, OCIInterval *result );
+
+ DESCRIPTION
+ Given an interval string produce the interval represented by the string.
+ The type of the interval is the type of the 'result' descriptor.
+ PARAMETERS
+
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) inpstring - Input string
+ (IN) str_len - Length of input string
+ (OUT) result - Resultant interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ there are too many fields in the literal string
+ the year is out of range (-4713 to 9999)
+ if the month is out of range (1 to 12)
+ if the day of month is out of range (1 to 28...31)
+ if hour is not in range (0 to 23)
+ if hour is not in range (0 to 11)
+ if minute is not in range (0 to 59)
+ if seconds in minute not in range (0 to 59)
+ if seconds in day not in range (0 to 86399)
+ if the interval is invalid
+
+ ---------------------- OCIIntervalGetDaySecond --------------------
+
+ DESCRIPTION
+ Gets values of day second interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ day (OUT) - number of days
+ hour (OUT) - number of hours
+ min (OUT) - number of mins
+ sec (OUT) - number of secs
+ fsec (OUT) - number of fractional seconds
+ result (IN) - resulting interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalGetYearMonth --------------------
+
+ DESCRIPTION
+ Gets year month from an interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ year (OUT) - year value
+ month (OUT) - month value
+ result (IN) - resulting interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+---------------------- OCIIntervalAdd --------------------
+sword OCIIntervalAdd(dvoid *hndl, OCIError *err, OCIInterval *addend1,
+ OCIInterval *addend2, OCIInterval *result );
+NAME OCIIntervalAdd - Adds two intervals
+PARAMETERS
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+addend1 (IN) - Interval to be added
+addend2 (IN) - Interval to be added
+result (OUT) - resulting interval (addend1 + addend2)
+DESCRIPTION
+ Adds two intervals to produce a resulting interval
+RETURNS
+ OCI_SUCCESS on success
+ OCI_ERROR if:
+ the two input intervals are not mutually comparable.
+ the resulting year would go above SB4MAXVAL
+ the resulting year would go below SB4MINVAL
+ OCI_INVALID_HANDLE if 'err' is NULL.
+NOTES
+ The two input intervals must be mutually comparable
+
+ ---------------------- OCIIntervalSubtract --------------------
+sword OCIIntervalSubtract(dvoid *hndl, OCIError *err, OCIInterval *minuend,
+ OCIInterval *subtrahend, OCIInterval *result );
+NAME - OCIIntervalSubtract - subtracts two intervals
+PARAMETERS
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+minuend (IN) - interval to be subtracted from
+subtrahend (IN) - interval subtracted from minuend
+result (OUT) - resulting interval (minuend - subtrahend)
+DESCRIPTION
+ Subtracts two intervals and stores the result in an interval
+RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if:
+ the two input intervals are not mutually comparable.
+ the resulting leading field would go below SB4MINVAL
+ the resulting leading field would go above SB4MAXVAL
+
+---------------------- OCIIntervalMultiply --------------------
+sword OCIIntervalMultiply(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ OCINumber *nfactor, OCIInterval *result );
+
+ DESCRIPTION
+ Multiplies an interval by an Oracle Number to produce an interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ ifactor (IN) - Interval to be multiplied
+ nfactor (IN) - Oracle Number to be multiplied
+ result (OUT) - resulting interval (ifactor * nfactor)
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if:
+ the resulting year would go above SB4MAXVAL
+ the resulting year would go below SB4MINVAL
+
+
+ ---------------------- OCIIntervalSetDaySecond --------------------
+
+ DESCRIPTION
+ Sets day second interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ day (IN) - number of days
+ hour (IN) - number of hours
+ min (IN) - number of mins
+ sec (IN) - number of secs
+ fsec (IN) - number of fractional seconds
+ result (OUT) - resulting interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalSetYearMonth --------------------
+
+ DESCRIPTION
+ Sets year month interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ year (IN) - year value
+ month (IN) - month value
+ result (OUT) - resulting interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+ ---------------------- OCIIntervalToNumber --------------------
+sword OCIIntervalToNumber(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ OCINumber *number, uword units );
+
+ DESCRIPTION
+ Converts an interval to an Oracle Number
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) interval - Interval to be converted
+ (OUT) number - Oracle number result (in years for YEARMONTH interval
+ and in days for DAYSECOND)
+ RETURNS
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_SUCCESS on success
+ NOTES
+ Fractional portions of the date (for instance, minutes and seconds if
+ the unit chosen is hours) will be included in the Oracle number produced.
+ Excess precision will be truncated.
+
+ ---------------------- OCIIntervalToText --------------------
+sword OCIIntervalToText( dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ ub1 lfprec, ub1 fsprec, OraText *buffer,
+ size_t buflen, size_t *resultlen );
+
+ DESCRIPTION
+ Given an interval, produces a string representing the interval.
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) interval - Interval to be converted
+ (IN) lfprec - Leading field precision. Number of digits used to
+ represent the leading field.
+ (IN) fsprec - Fractional second precision of the interval. Number of
+ digits used to represent the fractional seconds.
+ (OUT) buffer - buffer to hold result
+ (IN) buflen - length of above buffer
+ (OUT) resultlen - length of result placed into buffer
+
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR
+ if the buffer is not large enough to hold the result
+ NOTES
+ The interval literal will be output as `year' or `[year-]month' for
+ YEAR-MONTH intervals and as `seconds' or `minutes[:seconds]' or
+ `hours[:minutes[:seconds]]' or `days[ hours[:minutes[:seconds]]]' for
+ DAY-TIME intervals (where optional fields are surrounded by brackets).
+
+ ----------------------- OCIIntervalFromTZ ---------------------
+sword OCIIntervalFromTZ(dvoid *hndl, OCIError *err, CONST oratext *inpstring,
+ size_t str_len, OCIInterval *results );
+
+ DESCRIPTION
+ Returns am OCIInmterval of type OCI_DTYPE_INTERVAL_DS with the region id
+ set and the current region offset or an absolute offset with the region id
+ set to 0.
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ inpstring (IN) - pointer to the input string
+ str_len (IN) - inpstring length
+ result - Output Interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR on error
+ Bad interval type
+ Timezone errors
+ NOTES
+ The input string must be of the form [+/-]TZH:TZM or 'TZR [TZD]'
+
+OCILdaToSvcCtx()
+Name
+OCI toggle version 7 Lda_Def to SerVice context handle
+Purpose
+Converts a V7 Lda_Def to a V8 service context handle.
+Syntax
+sword OCILdaToSvcCtx ( OCISvcCtx **svchpp,
+ OCIError *errhp,
+ Lda_Def *ldap );
+Comments
+Converts a V7 Lda_Def to a V8 service context handle. The action of this call
+can be reversed by passing the resulting service context handle to the
+OCISvcCtxToLda() function.
+Parameters
+svchpp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+ldap (IN/OUT) - the V7 logon data area returned by OCISvcCtxToLda() from
+this service context.
+Related Functions
+OCISvcCtxToLda()
+
+
+
+
+OCILobAppend()
+
+Name
+OCI Lob APpend
+
+Purpose
+Appends a LOB value at the end of another LOB.
+
+Syntax
+sword OCILobAppend ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_locp );
+Comments
+Appends a LOB value at the end of LOB. The data is
+copied from the source to the destination at the end of the destination. The
+source and the destination must already exist. The destination LOB is
+extended to accommodate the newly written data.
+
+It is an error to extend the destination LOB beyond the maximum length
+allowed or to try to copy from a NULL LOB.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB.
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB.
+
+Related Functions
+OCILobTrim()
+OCIErrorGet()
+OCILobWrite()
+OCILobCopy()
+
+
+
+
+
+OCILobAssign()
+
+Name
+OCI Lob ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobAssign ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *src_locp,
+ OCILobLocator **dst_locpp );
+
+Comments
+Assign source locator to destination locator. After the assignment, both
+locators refer to the same LOB data. For internal LOBs, the source locator's
+LOB data gets copied to the destination locator's LOB data only when the
+destination locator gets stored in the table. Therefore, issuing a flush of
+the object containing the destination locator will copy the LOB data. For FILEs
+only the locator that refers to the OS file is copied to the table. The OS file
+is not copied.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+errhp and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to. The caller must allocate space
+for the OCILobLocator by calling OCIDescriptorAlloc().
+Note: The only difference between this and OCILobLocatorAssign is that this
+takes an environment handle whereas OCILobLocatorAssign takes an OCI service
+handle
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobLocatorAssign()
+
+
+
+OCILobCharSetForm()
+
+Name
+OCI Lob Get Character Set Form
+
+Purpose
+Gets the LOB locator's character set fpr,, if any.
+
+Syntax
+sword OCILobCharSetForm ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *locp,
+ ub1 *csfrm );
+
+Comments
+Returns the character set form of the input LOB locator in the csfrm output
+parameter.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it
+is recorded in err and this function returns OCI_ERROR. Diagnostic information
+can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set form.
+csfrm(OUT) - character set form of the input LOB locator. If the input
+locator is for a BLOB or a BFILE, csfrm is set to 0 since there is no concept
+of a character set for binary LOBs/FILEs. The caller must allocate space for
+the csfrm (ub1) and not write into the space.
+See also
+OCIErrorGet(), OCILobCharSetId(), OCILobLocatorIsInit
+
+
+
+
+OCILobCharSetId()
+
+Name
+OCI Lob get Character Set IDentifier
+
+Purpose
+Gets the LOB locator's character set ID, if any.
+
+Syntax
+sword OCILobCharSetId ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *locp,
+ ub2 *csid );
+
+Comments
+Returns the character set ID of the input LOB locator in the cid output
+parameter.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it
+is recorded in err and this function returns OCI_ERROR. Diagnostic information
+can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set ID.
+csid (OUT) - character set ID of the input LOB locator. If the input locator
+is for a BLOB or a BFILE, csid is set to 0 since there is no concept of a
+character set for binary LOBs/FILEs. The caller must allocate space for the character set id of type ub2 and not write into the space.
+
+See also
+OCIErrorGet(), OCILobCharSetForm(), OCILobLocatorIsInit()
+
+
+
+
+OCILobCopy()
+
+Name
+OCI Lob Copy
+
+Purpose
+Copies a portion of a LOB value into another LOB value.
+
+Syntax
+sword OCILobCopy ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_locp,
+ ub4 amount,
+ ub4 dst_offset,
+ ub4 src_offset );
+
+Comments
+Copies a portion of a LOB value into another LOB as specified. The data
+is copied from the source to the destination. The source (src_locp) and the
+destination (dlopb) LOBs must already exist.
+If the data already exists at the destination's start position, it is
+overwritten with the source data. If the destination's start position is
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination
+LOB is extended to accommodate the newly written data if it extends
+beyond the current length of the destination LOB.
+It is an error to extend the destination LOB beyond the maximum length
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB.
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB.
+amount (IN) - the number of character or bytes, as appropriate, to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB.
+For character LOBs it is the number of characters from the beginning of the
+LOB at which to begin writing. For binary LOBs it is the number of bytes from
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source LOB.
+For character LOBs it is the number of characters from the beginning of the
+LOB, for binary LOBs it is the number of bytes. Starts at 1.
+
+See Also
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim()
+
+OCILobCreateTemporary()
+
+Name
+OCI Lob Create Temporary
+
+Purpose
+Create a Temporary Lob
+
+Syntax
+sword OCILobCreateTemporary(OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub2 csid,
+ ub1 csfrm,
+ ub1 lobtype,
+ boolean cache,
+ OCIDuration duration);
+
+
+Comments
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator which points to the temporary Lob
+csid (IN) - the character set id
+csfrm(IN) - the character set form
+lobtype (IN) - the lob type - one of the three constants OCI_TEMP_BLOB,
+ OCI_TEMP_CLOB and OCI_TEMP_NCLOB
+cache(IN)- TRUE if the temporary LOB goes through the cache; FALSE, if not.
+duration(IN)- duration of the temporary LOB; Can be a valid duration id or one
+ of the values: OCI_DURATION_SESSION, OCI_DURATION_CALL
+ Note: OCI_DURATION_TRANSACTION is not supported in 8.1.
+Related functions
+OCILobFreeTemporary()
+OCILobIsTemporary()
+
+OCILobDisableBuffering()
+
+Name
+OCI Lob Disable Buffering
+
+Purpose
+Disable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobDisableBuffering ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+Comments
+
+Disable lob buffering for the input locator. The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is *not* used.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator uniquely referencing the LOB.
+
+Related Functions
+OCILobEnableBuffering()
+OCIErrorGet()
+OCILobFlush()
+
+
+
+
+OCILobEnableBuffering()
+
+Name
+OCI Lob Enable Buffering
+
+Purpose
+Enable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobEnableBuffering ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+Comments
+
+Enable lob buffering for the input locator. The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is used.
+
+Once lob buffering is enabled for a locator, if that locator is passed to
+one of the following routines, an error is returned:
+ OCILobCopy, OCILobAppend, OCILobErase, OCILobGetLength, OCILobTrim
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator uniquely referencing the LOB.
+
+Related Functions
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+OCILobFlush()
+
+
+
+
+OCILobErase()
+
+Name
+OCI Lob ERase
+
+Purpose
+Erases a specified portion of the LOB data starting at a specified offset.
+
+Syntax
+sword OCILobErase ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *amount,
+ ub4 offset );
+
+Comments
+Erases a specified portion of the LOB data starting at a specified offset.
+The actual number of characters/bytes erased is returned. The actual number
+of characters/bytes and the requested number of characters/bytes will differ
+if the end of the LOB data is reached before erasing the requested number of
+characters/bytes.
+If a section of data from the middle of the LOB data is erased, a hole is
+created. When data from that hole is read, 0's are returned. If the LOB is
+NULL, this routine will indicate that 0 characters/bytes were erased.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - the LOB for which to erase a section of data.
+amount (IN/OUT) - On IN, the number of characters/bytes to erase. On OUT,
+the actual number of characters/bytes erased.
+offset (IN) - absolute offset from the beginning of the LOB data from which to
+start erasing data. Starts at 1.
+
+See Also
+OCIErrorGet(), OCILobRead(), OCILobWrite()
+
+
+
+
+OCILobFileClose()
+
+Name
+OCI Lob File CLoSe
+
+Purpose
+Closes a previously opened FILE.
+
+Syntax
+sword OCILobFileClose ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *filep );
+
+Comments
+Closes a previously opened FILE. It is an error if this function is called for
+an internal LOB. No error is returned if the FILE exists but is not opened.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+filep (IN/OUT) - a pointer to a FILE locator to be closed.
+
+See Also
+OCIErrorGet(), OCILobFileOpen(), OCILobFileCloseAll(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+
+
+OCILobFileCloseAll()
+
+Name
+OCI LOB FILE Close All
+
+Purpose
+Closes all open FILEs on a given service context.
+
+Syntax
+sword OCILobFileCLoseAll ( OCISvcCtx *svchp,
+ OCIError *errhp );
+
+Comments
+Closes all open FILEs on a given service context.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+
+See also
+OCILobFileClose(),
+OCIErrorGet(), OCILobFileOpen(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+
+
+OCILobFileExists()
+
+Name
+OCI LOB FILE exists
+
+Purpose
+Tests to see if the FILE exists on the server
+
+Syntax
+sword OCILobFileExists ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *filep,
+ boolean *flag );
+
+Comments
+Checks to see if a FILE exists for on the server.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error,
+it is recorded in err and this function returns OCI_ERROR. Diagnostic
+information can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator that refers to the file.
+flag (OUT) - returns TRUE if the FILE exists; FALSE if it does not.
+
+See also
+OCIErrorGet, CREATE DIRECTORY (DDL)
+
+
+
+
+OCILobFileGetName()
+
+Name
+OCI LOB FILE Get file Name
+
+Purpose
+Gets the FILE locator's directory alias and file name.
+
+Syntax
+sword OCILobFileGetName ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *filep,
+ OraText *dir_alias,
+ ub2 *d_length,
+ OraText *filename,
+ ub2 *f_length );
+
+Comments
+Returns the directory alias and file name associated with this file locator.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) -The OCI error handle. If there is an error, it is recorded in
+errhp and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+filep (IN) - FILE locator for which to get the directory alias and file name.
+dir_alias (OUT) - buffer into which the directory alias name is placed. The
+caller must allocate enough space for the directory alias name and must not
+write into the space.
+d_length (IN/OUT)
+ - IN: length of the input dir_alias string;
+ - OUT: length of the returned dir_alias string.
+filename (OUT) - buffer into which the file name is placed. The caller must
+allocate enough space for the file name and must not write into the space.
+f_length (IN/OUT)
+ - IN: length of the input filename string;
+ - OUT: lenght of the returned filename string.
+
+See also
+OCILobFileSetName(), OCIErrorGet()
+
+
+
+
+OCILobFileIsOpen()
+
+Name
+OCI LOB FILE Is Open?
+
+Purpose
+Tests to see if the FILE is open
+
+Syntax
+sword OCILobFileIsOpen ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *filep,
+ boolean *flag );
+
+Comments
+Checks to see if the FILE on the server is open for a given LobLocator.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it
+is recorded in err and this function returns OCI_ERROR. Diagnostic information
+can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator being examined. If the input file
+locator was never passed to OCILobFileOpen(), the file is considered not to
+be opened by this locator. However, a different locator may have opened the
+file. More than one file opens can be performed on the same file using
+different locators.
+flag (OUT) - returns TRUE if the FILE is opened using this locator; FALSE if
+it is not.
+
+See also
+OCIErrorGet, OCILobFileOpen, OCILobFileClose, OCILobFileCloseAll, CREATE
+DIRECTORY SQL command
+
+
+OCILobFileOpen()
+
+Name
+OCI LOB FILE open
+
+Purpose
+Opens a FILE for read-only access
+
+Syntax
+sword OCILobFileOpen ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *filep,
+ ub1 mode );
+
+Comments
+Opens a FILE. The FILE can be opened for read-only access only. FILEs may not
+be written to throough ORACLE.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+filep (IN/OUT) - the FILE to open. Error if the locator does not refer to a
+FILE.
+mode (IN) - mode in which to open the file. The only valid mode is read-only -
+OCI_FILE_READONLY.
+
+See Also
+OCILobFileClose, OCIErrorGet, OCILobFileCloseAll, OCILobFileIsOpen,
+OCILobFileSetName, CREATE DIRECTORY
+
+
+
+
+OCILobFileSetName()
+
+Name
+OCI Lob File Set NaMe
+
+Purpose
+Sets directory alias and file name in the FILE locator.
+
+Syntax
+sword OCILobFileSetName ( OCIEnv *envhp,
+ OCIError *errhp,
+ OCILobLocator **filepp,
+ OraText *dir_alias,
+ ub2 d_length,
+ OraText *filename,
+ ub2 f_length );
+Comments
+Sets the directory alias and file name in the LOB file locator.
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+errhp and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+filepp (IN/OUT) - FILE locator for which to set the directory alias name.
+The caller must have already allocated space for the locator by
+calling OCIDescriptorAlloc().
+dir_alias (IN) - buffer that contains the directory alias name to set in the
+locator.
+d_length (IN) - length of the input dir_alias parameter.
+filename (IN) - buffer that contains the file name is placed.
+f_length (IN) - length of the input filename parameter.
+See also
+OCILobFileGetName, OCIErrorGet, CREATE DIRECTORY
+
+
+
+
+OCILobFlushBuffer()
+
+Name
+OCI Lob Flush all Buffers for this lob.
+
+Purpose
+Flush/write all buffers for this lob to the server.
+
+
+Syntax
+sword OCILobFlushBuffer ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 flag);
+
+Comments
+
+Flushes all buffers, associated with the lob referenced by the input
+locator, to the server. This routine will actually write the data in
+the buffer to the lob in the database. Lob buffering must have been
+enabled for the input lob locator.
+
+This routine, by default, does not free the buffer resources for
+reallocation to another buffered LOB operation. However, if you
+want to free the buffer explicitly, you can set the flag parameter
+to OCI_LOB_BUFFER_FREE.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator uniquely referencing the LOB.
+flag (IN) - to indicate if the buffer resources need to be freed
+ after a flush. Default value is OCI_LOB_BUFFER_NOFREE.
+ Set it to OCI_LOB_BUFFER_FREE if you want the buffer
+ resources to be freed.
+
+Related Functions
+OCILobEnableBuffering()
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+
+OCILobFreeTemporary()
+
+Name
+OCI Lob Free Temporary
+
+Purpose
+Free a temporary LOB
+
+Syntax
+sword OCILobFreeTemporary(OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+
+Comments
+ Frees the contents of the temporary Lob this locator is pointing to. Note
+ that the locator itself is not freed until a OCIDescriptorFree is done.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator uniquely referencing the LOB
+
+Related functions
+OCILobCreateTemporary()
+OCILobIsTemporary()
+
+Name
+OCI Lob/File Get Chunk Size
+
+Purpose
+When creating the table, the user can specify the chunking factor, which can
+be a multiple of Oracle blocks. This corresponds to the chunk size used by the
+LOB data layer when accessing/modifying the LOB value. Part of the chunk is
+used to store system-related information and the rest stores the LOB value.
+This function returns the amount of space used in the LOB chunk to store
+the LOB value.
+
+Syntax
+sword OCILobGetChunkSize ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *chunksizep );
+
+Comments
+ Performance will be improved if the user issues read/write
+requests using a multiple of this chunk size. For writes, there is an added
+benefit since LOB chunks are versioned and, if all writes are done on chunk
+basis, no extra/excess versioning is done nor duplicated. Users could batch
+up the write until they have enough for a chunk instead of issuing several
+write calls for the same chunk.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+chunksizep (OUT) - On output, it is the length of the LOB if not NULL - for
+character LOBs it is the number of characters, for binary LOBs it is the
+number of bytes in the LOB.
+
+Related Functions
+
+
+OCILobGetLength()
+
+Name
+OCI Lob/File Length
+
+Purpose
+Gets the length of a LOB/FILE.
+
+Syntax
+sword OCILobGetLength ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *lenp );
+
+Comments
+Gets the length of a LOB/FILE. If the LOB/FILE is NULL, the length is
+undefined.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+lenp (OUT) - On output, it is the length of the LOB if not NULL - for
+character LOBs it is the number of characters, for binary LOBs it is the
+number of bytes in the LOB.
+
+Related Functions
+OCIErrorGet, OCIFileSetName
+
+
+
+
+OCILobIsEqual()
+
+Name
+
+OCI Lob Is Equal
+
+Purpose
+Compares two LOB locators for equality.
+
+Syntax
+sword OCILobIsEqual ( OCIEnv *envhp,
+ CONST OCILobLocator *x,
+ CONST OCILobLocator *y,
+ boolean *is_equal );
+
+Comments
+Compares the given LOB locators for equality. Two LOB locators are equal if
+and only if they both refer to the same LOB data.
+Two NULL locators are considered not equal by this function.
+Parameters
+envhp (IN) - the OCI environment handle.
+x (IN) - LOB locator to compare.
+y (IN) - LOB locator to compare.
+is_equal (OUT) - TRUE, if the LOB locators are equal; FALSE if they are not.
+
+See also
+OCILobAssign, OCILobLocatorIsInit
+OCILobLocatorAssign()
+OCILobIsTemporary()
+
+Name
+
+OCI Lob Is Temporary
+
+Purpose
+ Tests if this locator points to a temporary LOB
+
+Syntax
+sword OCILobIsTemporary(OCIEnv *envp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ boolean *is_temporary);
+
+Comments
+Tests the locator to determine if it points to a temporary LOB.
+If so, is_temporary is set to TRUE. If not, is_temporary is set
+to FALSE.
+
+Parameters
+envp (IN) - the environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN) - the locator to test for temporary LOB
+is_temporary(OUT) - TRUE, if the LOB locator points to a temporary LOB;
+ FALSE, if not.
+
+See Also
+OCILobCreateTemporary, OCILobFreeTemporary
+
+
+
+OCILobLoadFromFile()
+
+Name
+OCI Lob Load From File
+
+Purpose
+Load/copy all or a portion of the file into an internal LOB.
+
+Syntax
+sword OCILobLoadFromFile ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_filep,
+ ub4 amount,
+ ub4 dst_offset,
+ ub4 src_offset );
+
+Comments
+Loads/copies a portion or all of a file value into an internal LOB as
+specified. The data is copied from the source file to the destination
+internal LOB (BLOB/CLOB). No character set conversions are performed
+when copying the bfile data to a clob/nclob. The bfile data must already
+be in the same character set as the clob/nclob in the database. No
+error checking is performed to verify this.
+The source (src_filep) and the destination (dlopb) LOBs must already exist.
+If the data already exists at the destination's start position, it is
+overwritten with the source data. If the destination's start position is
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination
+LOB is extended to accommodate the newly written data if it extends
+beyond the current length of the destination LOB.
+It is an error to extend the destination LOB beyond the maximum length
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+dst_locp (IN/OUT) - a locator uniquely referencing the destination internal
+LOB which may be of type blob, clob, or nclob.
+src_filep (IN/OUT) - a locator uniquely referencing the source BFILE.
+amount (IN) - the number of bytes to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB.
+For character LOBs it is the number of characters from the beginning of the
+LOB at which to begin writing. For binary LOBs it is the number of bytes from
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source BFILE. It is the
+number of bytes from the beginning of the LOB. The offset starts at 1.
+
+See Also
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim(), OCILobCopy()
+
+
+Name
+OCI Lob LOCATOR ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobLocatorAssign ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ CONST OCILobLocator *src_locp,
+ OCILobLocator **dst_locpp );
+
+Comments
+Assign source locator to destination locator. After the assignment, both
+locators refer to the same LOB data. For internal LOBs, the source locator's
+LOB data gets copied to the destination locator's LOB data only when the
+destination locator gets stored in the table. Therefore, issuing a flush of
+the object containing the destination locator will copy the LOB data. For
+FILEs only the locator that refers to the OS file is copied to the table. The
+OS file is not copied.
+Note : the only difference between this and OCILobAssign is that this takes
+a OCI service handle pointer instead of a OCI environment handle pointer
+
+Parameters
+svchp (IN/OUT) - OCI service handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded
+in errhp and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to. The caller must allocate space
+for the OCILobLocator by calling OCIDescriptorAlloc().
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobAssign()
+
+
+OCILobLocatorIsInit()
+
+Name
+OCI LOB locator is initialized?
+
+Purpose
+Tests to see if a given LOB locator is initialized.
+
+Syntax
+sword OCILobLocatorIsInit ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *locp,
+ boolean *is_initialized );
+
+Comments
+Tests to see if a given LOB locator is initialized.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it
+is recorded in err and this function returns OCI_ERROR. Diagnostic information
+can be obtained by calling OCIErrorGet().
+locp (IN) - the LOB locator being tested
+is_initialized (OUT) - returns TRUE if the given LOB locator is initialized;
+FALSE if it is not.
+
+See also
+OCIErrorGet, OCILobIsEqual
+
+
+OCILobOpen()
+
+Name
+OCI Lob Open
+Purpose
+ Open an internal LOB or BFILE locator.
+Syntax
+sword OCILobOpen( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub1 mode);
+
+Comments
+Opens an internal LOB or a Bfile. A LOB can be opened only once in a
+transaction. A LOB opened in a transaction has to be closed before
+committing the transaction. Otherwise, the transaction is rolled back.
+A LOB cannot be opened in read_write mode without starting a transaction.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB.
+mode(IN) - mode can be OCI_LOB_READONLY, OCI_LOB_READWRITE
+
+Related functions
+OCILobClose(), OCIIsLobOpen()
+
+OCILobRead()
+
+Name
+OCI Lob/File ReaD
+
+Purpose
+Reads a portion of a LOB/FILE as specified by the call into a buffer.
+
+Syntax
+sword OCILobRead ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 offset,
+ ub4 *amtp,
+ dvoid *bufp,
+ ub4 bufl,
+ dvoid *ctxp,
+ OCICallbackLobRead (cbfp)
+ (
+ dvoid *ctxp,
+ CONST dvoid *bufp,
+ ub4 len,
+ ub1 piece )
+ ub2 csid,
+ ub1 csfrm );
+
+Comments
+Reads a portion of a LOB/FILE as specified by the call into a buffer. Data read
+from a hole is returned as 0s. It is an error to try to read from a NULL LOB/
+FILE. The OS FILE must already exist on the server and must have been opened
+using the input locator. Oracle must hav epermission to read the OS file and
+user must have read permission on the directory object.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB.
+offset (IN) - On input, it is the absolute offset, for character LOBs in the
+number of characters from the beginning of the LOB, for binary LOBs it is the
+number of bytes. Starts from 1.
+amtp (IN/OUT) - On input, the number of character or bytes to be read. On
+output, the actual number of bytes or characters read.
+If the amount of bytes to be read is larger than the buffer length it is
+assumed that the LOB is being read in a streamed mode. On input if this value
+is 0, then the data shall be read in streamed mode from the LOB until the end
+of LOB. If the data is read in pieces, *amtp always contains the length of the last piece read.
+If a callback function is defined, then this callback function will be invoked
+each time bufl bytes are read off the pipe. Each piece will be written into
+bufp.
+If the callback function is not defined, then OCI_NEED_DATA error code will
+be returned. The application must invoke the LOB read over and over again to
+read more pieces of the LOB until the OCI_NEED_DATA error code is not
+returned. The buffer pointer and the length can be different in each call
+if the pieces are being read into different sizes and location.
+bufp (IN) - the pointer to a buffer into which the piece will be read. The
+length of the allocated memory is assumed to be bufl.
+bufl (IN) - the length of the buffer in octets.
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece. If
+this is NULL, then OCI_NEED_DATA will be returned for each piece.
+The callback function must return OCI_CONTINUE for the read to continue.
+If any other error code is returned, the LOB read is aborted.
+ ctxp (IN) - the context for the call back function. Can be NULL.
+ bufp (IN) - a buffer pointer for the piece.
+ len (IN) - the length of length of current piece in bufp.
+ piece (IN) - which piece - OCI_FIRST_PIECE, OCI_NEXT_PIECE or
+ OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCILobFileOpen, OCILobFileSetName, CREATE DIRECTORY
+
+
+
+
+OCILobTrim()
+
+Name
+
+OCI Lob Trim
+
+Purpose
+Trims the lob value to a shorter length
+
+Syntax
+sword OCILobTrim ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 newlen );
+
+Comments
+Truncates LOB data to a specified shorter length.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. This locator
+must be a locator that was obtained from the server specified by svchp.
+newlen (IN) - the new length of the LOB data, which must be less than or equal
+to the current length.
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCiLobErase, OCILobAppend, OCILobCopy
+
+
+
+
+
+OCILobWrite()
+
+Name
+OCI Lob Write
+
+Purpose
+Writes a buffer into a LOB
+
+Syntax
+sword OCILobWrite ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 offset,
+ ub4 *amtp,
+ dvoid *bufp,
+ ub4 buflen,
+ ub1 piece,
+ dvoid *ctxp,
+ OCICallbackLobWrite (cbfp)
+ (
+ dvoid *ctxp,
+ dvoid *bufp,
+ ub4 *lenp,
+ ub1 *piecep )
+ ub2 csid
+ ub1 csfrm );
+
+
+Comments
+Writes a buffer into a LOB as specified. If LOB data already exists
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback
+function will be invoked to get the next piece after a piece is written to the
+pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWrite() returns the
+OCI_NEED_DATA error code. The application must all OCILobWrite() again
+to write more pieces of the LOB. In this mode, the buffer pointer and the
+length can be different in each call if the pieces are of different sizes and
+from different locations. A piece value of OCI_LAST_PIECE terminates the
+piecewise write.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB.
+offset (IN) - On input, it is the absolute offset, for character LOBs in
+the number of characters from the beginning of the LOB, for binary LOBs it
+is the number of bytes. Starts at 1.
+bufp (IN) - the pointer to a buffer from which the piece will be written. The
+length of the allocated memory is assumed to be the value passed in bufl. Even
+if the data is being written in pieces, bufp must contain the first piece of
+the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a
+single piece.
+The following other values are also possible for piecewise or callback mode:
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be
+written. On output, returns the actual number of bytes or characters written.
+If the data is written in pieces, *amtp will contain the total length of the
+pieces written at the end of the call (last piece written) and is undefined in
+between.
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in a
+piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue.
+If any other error code is returned, the LOB write is aborted. The
+callback takes the following parameters:
+ ctxp (IN) - the context for the call back function. Can be NULL.
+ bufp (IN/OUT) - a buffer pointer for the piece.
+ lenp (IN/OUT) - the length of the buffer (in octets) and the length of
+ current piece in bufp (out octets).
+ piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+
+
+
+
+
+OCILobWriteAppend()
+
+Name
+OCI Lob Write Append
+
+Purpose
+Writes data to the end of a LOB value. This call provides the ability
+to get the length of the data and append it to the end of the LOB in
+a single round trip to the server.
+
+
+Syntax
+sword OCILobWriteAppend ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *amtp,
+ dvoid *bufp,
+ ub4 buflen,
+ ub1 piece,
+ dvoid *ctxp,
+ OCICallbackLobWrite (cbfp)
+ (
+ dvoid *ctxp,
+ dvoid *bufp,
+ ub4 *lenp,
+ ub1 *piecep )
+ ub2 csid
+ ub1 csfrm );
+
+
+Comments
+Writes a buffer to the end of a LOB as specified. If LOB data already exists
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback
+function will be invoked to get the next piece after a piece is written to the
+pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWriteAppend() returns the
+OCI_NEED_DATA error code. The application must all OCILobWriteAppend() again
+to write more pieces of the LOB. In this mode, the buffer pointer and the
+length can be different in each call if the pieces are of different sizes and
+from different locations. A piece value of OCI_LAST_PIECE terminates the
+piecewise write.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB.
+offset (IN) - On input, it is the absolute offset, for character LOBs in
+the number of characters from the beginning of the LOB, for binary LOBs it
+is the number of bytes. Starts at 1.
+bufp (IN) - the pointer to a buffer from which the piece will be written. The
+length of the allocated memory is assumed to be the value passed in bufl. Even
+if the data is being written in pieces, bufp must contain the first piece of
+the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a
+single piece.
+The following other values are also possible for piecewise or callback mode:
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be
+written. On output, returns the actual number of bytes or characters written.
+If the data is written in pieces, *amtp will contain the total length of the
+pieces written at the end of the call (last piece written) and is undefined in
+between.
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in a
+piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue.
+If any other error code is returned, the LOB write is aborted. The
+callback takes the following parameters:
+ ctxp (IN) - the context for the call back function. Can be NULL.
+ bufp (IN/OUT) - a buffer pointer for the piece.
+ lenp (IN/OUT) - the length of the buffer (in octets) and the length of
+ current piece in bufp (out octets).
+ piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+
+
+
+
+OCILogoff()
+Name
+OCI simplified Logoff
+Purpose
+This function is used to terminate a session created with OCILogon() or
+OCILogon2().
+Syntax
+sword OCILogoff ( OCISvcCtx *svchp
+ OCIError *errhp );
+Comments
+This call is used to terminate a session which was created with OCILogon() or
+OCILogon2().
+This call implicitly deallocates the server, authentication, and service
+context handles.
+Note: For more information on logging on and off in an application,
+refer to the section "Application Initialization, Connection, and
+Authorization" on page 2-16.
+Parameters
+svchp (IN) - the service context handle which was used in the call to
+OCILogon() or OCILogon2().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+See Also
+OCILogon(), OCILogon2().
+
+
+
+
+
+
+OCILogon()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a simple logon session.
+Syntax
+sword OCILogon ( OCIEnv *envhp,
+ OCIError *errhp,
+ OCISvcCtx *svchp,
+ CONST OraText *username,
+ ub4 uname_len,
+ CONST OraText *password,
+ ub4 passwd_len,
+ CONST OraText *dbname,
+ ub4 dbname_len );
+Comments
+This function is used to create a simple logon session for an application.
+Note: Users requiring more complex session (e.g., TP monitor
+applications) should refer to the section "Application Initialization,
+Connection, and Authorization" on page 2-16.
+This call allocates the error and service context handles which are passed to
+it. This call also implicitly allocates server and authentication handles
+associated with the session. These handles can be retrieved by calling
+OCIAttrGet() on the service context handle.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+See Also
+OCILogoff()
+
+
+
+
+
+OCILogon2()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a logon session in connection pooling mode.
+Syntax
+sword OCILogon2 ( OCIEnv *envhp,
+ OCIError *errhp,
+ OCISvcCtx **svchp,
+ CONST OraText *username,
+ ub4 uname_len,
+ CONST OraText *password,
+ ub4 passwd_len,
+ CONST OraText *dbname,
+ ub4 dbname_len,
+ ub4 mode);
+Comments
+This function is used to create a simple logon session for an application in
+Connection Pooling mode. The valid values for mode are currently OCI_POOL and
+OCI_DEFAULT. Call to this function with OCI_DEFAULT mode is equivalent to
+OCILogon() call.
+This call allocates the error and service context handles which are passed to
+it. This call also implicitly allocates server and authentication handles
+associated with the session. These handles can be retrieved by calling
+OCIAttrGet() on the service context handle. This call assumes that
+OCIConnectionPoolCreate() has already been called for the same dbname.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password. If this is null, it is assumed that a
+ proxy session has to be created and the required grants on
+ the database are already done.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+mode (IN) - the mode for doing the server attach. Should be OCI_POOL for
+ using Connection Pooling.
+
+
+See Also
+OCILogoff()
+
+
+
+
+
+OCIMemoryFree()
+Name
+OCI FREE Memory
+Purpose
+Frees up storage associated with the pointer.
+Syntax
+void OCIMemoryFree ( CONST OCIStmt *stmhp,
+ dvoid *memptr);
+Comments
+Frees up dynamically allocated data pointers associated with the pointer using
+either the default memory free function or the registered memory free
+function, as the case may be.
+A user-defined memory free function can be registered during the initial call
+to OCIInitialize().
+This call is always successful.
+Parameters
+stmhp (IN) - statement handle which returned this data buffer.
+memptr (IN) - pointer to data allocated by the client library.
+Related Functions
+OCIInitialize()
+
+
+
+
+
+OCIParamGet()
+Name
+OCI Get PARaMeter
+Purpose
+Returns a descriptor of a parameter specified by position in the describe
+handle or statement handle.
+Syntax
+sword OCIParamGet ( CONST dvoid *hndlp,
+ ub4 htype,
+ OCIError *errhp,
+ dvoid **parmdpp,
+ ub4 pos );
+Comments
+This call returns a descriptor of a parameter specified by position in the
+describe handle or statement handle. Parameter descriptors are always
+allocated internally by the OCI library. They are read-only.
+OCI_NO_DATA may be returned if there are no parameter descriptors for this
+position.
+See Appendix B for more detailed information about parameter descriptor
+attributes.
+Parameters
+hndlp (IN) - a statement handle or describe handle. The OCIParamGet()
+function will return a parameter descriptor for this handle.
+htype (IN) - the type of the handle passed in the handle parameter. Valid
+types are OCI_HTYPE_DESCRIBE, for a describe handle OCI_HTYPE_STMT, for a
+statement handle
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+parmdpp (OUT) - a descriptor of the parameter at the position given in the pos
+parameter.
+pos (IN) - position number in the statement handle or describe handle. A
+parameter descriptor will be returned for this position.
+Note: OCI_NO_DATA may be returned if there are no parameter
+descriptors for this position.
+Related Functions
+OCIAttrGet(), OCIAttrSet()
+
+
+
+
+
+OCIParamSet()
+Name
+OCI Parameter Set in handle
+Purpose
+Used to set a complex object retrieval descriptor into a complex object
+retrieval handle.
+Syntax
+sword OCIParamGet ( dvoid *hndlp,
+ ub4 htyp,
+ OCIError *errhp,
+ CONST dvoid *dscp,
+ ub4 dtyp,
+ ub4 pos );
+Comments
+This call sets a given complex object retrieval descriptor into a complex
+object retrieval handle.
+The handle must have been previously allocated using OCIHandleAlloc(), and
+the descriptor must have been previously allocated using OCIDescAlloc().
+Attributes of the descriptor are set using OCIAttrSet().
+Parameters
+hndlp (IN/OUT) - handle pointer.
+htype (IN) - handle type.
+errhp (IN/OUT) - error handle.
+dscp (IN) - complex object retrieval descriptor pointer.
+dtyp (IN) -
+pos (IN) - position number.
+See Also
+
+
+
+
+
+OCIPasswordChange()
+Name
+OCI Change PassWord
+Purpose
+This call allows the password of an account to be changed.
+Syntax
+sword OCIPasswordChange ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ CONST OraText *user_name,
+ ub4 usernm_len,
+ CONST OraText *opasswd,
+ ub4 opasswd_len,
+ CONST OraText *npasswd,
+ sb4 npasswd_len,
+ ub4 mode);
+Comments
+This call allows the password of an account to be changed. This call is
+similar to OCISessionBegin() with the following differences:
+If the user authentication is already established, it authenticates
+the account using the old password and then changes the
+password to the new password
+If the user authentication is not established, it establishes a user
+authentication and authenticates the account using the old
+password, then changes the password to the new password.
+This call is useful when the password of an account is expired and
+OCISessionBegin() returns an error or warning which indicates that the
+password has expired.
+Parameters
+svchp (IN/OUT) - a handle to a service context. The service context handle
+must be initialized and have a server context handle associated with it.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+user_name (IN) - specifies the user name. It points to a character string,
+whose length is specified in usernm_len. This parameter must be NULL if the
+service context has been initialized with an authentication handle.
+usernm_len (IN) - the length of the user name string specified in user_name.
+For a valid user name string, usernm_len must be non-zero.
+opasswd (IN) - specifies the user's old password. It points to a character
+string, whose length is specified in opasswd_len .
+opasswd_len (IN) - the length of the old password string specified in opasswd.
+For a valid password string, opasswd_len must be non-zero.
+npasswd (IN) - specifies the user's new password. It points to a character
+string, whose length is specified in npasswd_len which must be non-zero for a
+valid password string. If the password complexity verification routine is
+specified in the user's profile to verify the new password's complexity, the
+new password must meet the complexity requirements of the verification
+function.
+npasswd_len (IN) - then length of the new password string specified in
+npasswd. For a valid password string, npasswd_len must be non-zero.
+mode - pass as OCI_DEFAULT.
+Related Functions
+OCISessionBegin()
+
+
+----------------------------------OCIReset------------------------------------
+
+
+OCIReset()
+Name
+OCI Reset
+Purpose
+Resets the interrupted asynchronous operation and protocol. Must be called
+if a OCIBreak call had been issued while a non-blocking operation was in
+progress.
+Syntax
+sword OCIReset ( dvoid *hndlp,
+ OCIError *errhp);
+Comments
+This call is called in non-blocking mode ONLY. Resets the interrupted
+asynchronous operation and protocol. Must be called if a OCIBreak call
+had been issued while a non-blocking operation was in progress.
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+
+
+OCIResultSetToStmt()
+Name
+OCI convert Result Set to Statement Handle
+Purpose
+Converts a descriptor to statement handle for fetching rows.
+Syntax
+sword OCIResultSetToStmt ( OCIResult *rsetdp,
+ OCIError *errhp );
+Comments
+Converts a descriptor to statement handle for fetching rows.
+A result set descriptor can be allocated with a call to OCIDescAlloc().
+Parameters
+rsetdp (IN/OUT) - a result set descriptor pointer.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+OCIDescAlloc()
+
+
+
+
+OCIServerAttach()
+Name
+OCI ATtaCH to server
+Purpose
+Creates an access path to a data source for OCI operations.
+Syntax
+sword OCIServerAttach ( OCIServer *srvhp,
+ OCIError *errhp,
+ CONST OraText *dblink,
+ sb4 dblink_len,
+ ub4 mode);
+Comments
+This call is used to create an association between an OCI application and a
+particular server.
+This call initializes a server context handle, which must have been previously
+allocated with a call to OCIHandleAlloc().
+The server context handle initialized by this call can be associated with a
+service context through a call to OCIAttrSet(). Once that association has been
+made, OCI operations can be performed against the server.
+If an application is operating against multiple servers, multiple server
+context handles can be maintained. OCI operations are performed against
+whichever server context is currently associated with the service context.
+Parameters
+srvhp (IN/OUT) - an uninitialized server context handle, which gets
+initialized by this call. Passing in an initialized server handle causes an
+error.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+dblink (IN) - specifies the database (server) to use. This parameter points to
+a character string which specifies a connect string or a service point. If the
+connect string is NULL, then this call attaches to the default host. The length
+of connstr is specified in connstr_len. The connstr pointer may be freed by the
+caller on return.
+dblink_len (IN) - the length of the string pointed to by connstr. For a valid
+connect string name or alias, connstr_len must be non-zero.
+mode (IN) - specifies the various modes of operation. For release 8.0, pass as
+OCI_DEFAULT - in this mode, calls made to the server on this server context
+are made in blocking mode.
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing
+the use of OCIServerAttach().
+Related Functions
+OCIServerDetach()
+
+
+
+OCIServerDetach()
+Name
+OCI DeTaCH server
+Purpose
+Deletes an access to a data source for OCI operations.
+Syntax
+sword OCIServerDetach ( OCIServer *svrhp,
+ OCIError *errhp,
+ ub4 mode);
+Comments
+This call deletes an access to data source for OCI operations, which was
+established by a call to OCIServerAttach().
+Parameters
+srvhp (IN) - a handle to an initialized server context, which gets reset to
+uninitialized state. The handle is not de-allocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+mode (IN) - specifies the various modes of operation. The only valid mode is
+OCI_DEFAULT for the default mode.
+Related Functions
+OCIServerAttach()
+
+
+
+OCIServerVersion()
+Name
+OCI VERSion
+Purpose
+Returns the version string of the Oracle server.
+Syntax
+sword OCIServerVersion ( dvoid *hndlp,
+ OCIError *errhp,
+ OraText *bufp,
+ ub4 bufsz
+ ub1 hndltype );
+Comments
+This call returns the version string of the Oracle server.
+For example, the following might be returned as the version string if your
+application is running against a 7.3.2 server:
+Oracle7 Server Release 7.3.2.0.0 - Production Release
+PL/SQL Release 2.3.2.0.0 - Production
+CORE Version 3.5.2.0.0 - Production
+TNS for SEQUENT DYNIX/ptx: Version 2.3.2.0.0 - Production
+NLSRTL Version 3.2.2.0.0 - Production
+
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+bufp (IN) - the buffer in which the version information is returned.
+bufsz (IN) - the length of the buffer.
+hndltype (IN) - the type of handle passed to the function.
+Related Functions
+
+
+
+
+
+OCISessionBegin()
+Name
+OCI Session Begin and authenticate user
+Purpose
+Creates a user authentication and begins a user session for a given server.
+Syntax
+sword OCISessionBegin ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCISession *usrhp,
+ ub4 credt,
+ ub4 mode);
+
+Comments
+For Oracle8, OCISessionBegin() must be called for any given server handle
+before requests can be made against it. Also, OCISessionBegin() only supports
+authenticating the user for access to the Oracle server specified by the
+server handle in the service context. In other words, after OCIServerAttach()
+is called to initialize a server handle, OCISessionBegin() must be called to
+authenticate the user for that given server.
+When OCISessionBegin() is called for the first time for the given server
+handle, the initialized authentication handle is called a primary
+authentication context. A primary authentication context may not be created
+with the OCI_MIGRATE mode. Also, only one primary authentication context can
+be created for a given server handle and the primary authentication context c
+an only ever be used with that server handle. If the primary authentication
+context is set in a service handle with a different server handle, then an
+error will result.
+After OCISessionBegin() has been called for the server handle, and the primary
+authentication context is set in the service handle, OCISessionBegin() may be
+called again to initialize another authentication handle with different (or
+the same) credentials. When OCISessionBegin() is called with a service handle
+set with a primary authentication context, the returned authentication context
+in authp is called a user authentication context. As many user authentication
+contexts may be initialized as desired.
+User authentication contexts may be created with the OCI_MIGRATE mode.
+If the OCI_MIGRATE mode is not specified, then the user authentication
+context can only ever be used with the same server handle set in svchp. If
+OCI_MIGRATE mode is specified, then the user authentication may be set
+with different server handles. However, the user authentication context is
+restricted to use with only server handles which resolve to the same database
+instance and that have equivalent primary authentication contexts. Equivalent
+authentication contexts are those which were authenticated as the same
+database user.
+OCI_SYSDBA, OCI_SYSOPER, and OCI_PRELIM_AUTH may only be used
+with a primary authentication context.
+To provide credentials for a call to OCISessionBegin(), one of two methods are
+supported. The first is to provide a valid username and password pair for
+database authentication in the user authentication handle passed to
+OCISessionBegin(). This involves using OCIAttrSet() to set the
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD attributes on the
+authentication handle. Then OCISessionBegin() is called with
+OCI_CRED_RDBMS.
+Note: When the authentication handle is terminated using
+OCISessionEnd(), the username and password attributes remain
+unchanged and thus can be re-used in a future call to OCISessionBegin().
+Otherwise, they must be reset to new values before the next
+OCISessionBegin() call.
+The second type of credentials supported are external credentials. No
+attributes need to be set on the authentication handle before calling
+OCISessionBegin(). The credential type is OCI_CRED_EXT. This is equivalent
+to the Oracle7 `connect /' syntax. If values have been set for
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD, then these are
+ignored if OCI_CRED_EXT is used.
+Parameters
+svchp (IN) - a handle to a service context. There must be a valid server
+handle set in svchp.
+errhp (IN) - an error handle to the retrieve diagnostic information.
+usrhp (IN/OUT) - a handle to an authentication context, which is initialized
+by this call.
+credt (IN) - specifies the type of credentials to use for authentication.
+Valid values for credt are:
+OCI_CRED_RDBMS - authenticate using a database username and
+password pair as credentials. The attributes OCI_ATTR_USERNAME
+and OCI_ATTR_PASSWORD should be set on the authentication
+context before this call.
+OCI_CRED_EXT - authenticate using external credentials. No username
+or password is provided.
+mode (IN) - specifies the various modes of operation. Valid modes are:
+OCI_DEFAULT - in this mode, the authentication context returned may
+only ever be set with the same server context specified in svchp. This
+establishes the primary authentication context.
+OCI_MIGRATE - in this mode, the new authentication context may be
+set in a service handle with a different server handle. This mode
+establishes the user authentication context.
+OCI_SYSDBA - in this mode, the user is authenticated for SYSDBA
+access.
+OCI_SYSOPER - in this mode, the user is authenticated for SYSOPER
+access.
+OCI_PRELIM_AUTH - this mode may only be used with OCI_SYSDBA
+or OCI_SYSOPER to authenticate for certain administration tasks.
+Related Functions
+OCISessionEnd()
+
+
+
+
+
+
+OCISessionEnd()
+Name
+OCI Terminate user Authentication Context
+Purpose
+Terminates a user authentication context created by OCISessionBegin()
+Syntax
+sword OCISessionEnd ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCISession *usrhp,
+ ub4 mode);
+
+Comments
+The user security context associated with the service context is invalidated
+by this call. Storage for the authentication context is not freed. The
+transaction specified by the service context is implicitly committed. The
+transaction handle, if explicitly allocated, may be freed if not being used.
+Resources allocated on the server for this user are freed.
+The authentication handle may be reused in a new call to OCISessionBegin().
+Parameters
+svchp (IN/OUT) - the service context handle. There must be a valid server
+handle and user authentication handle associated with svchp.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+usrhp (IN) - de-authenticate this user. If this parameter is passed as NULL, the
+user in the service context handle is de-authenticated.
+mode (IN) - the only valid mode is OCI_DEFAULT.
+Example
+In this example, an authentication context is destroyed.
+Related Functions
+OCISessionBegin()
+
+
+
+
+OCIStmtExecute()
+Name
+OCI EXECute
+Purpose
+This call associates an application request with a server.
+Syntax
+sword OCIStmtExecute ( OCISvcCtx *svchp,
+ OCIStmt *stmtp,
+ OCIError *errhp,
+ ub4 iters,
+ ub4 rowoff,
+ CONST OCISnapshot *snap_in,
+ OCISnapshot *snap_out,
+ ub4 mode );
+Comments
+This function is used to execute a prepared SQL statement.
+Using an execute call, the application associates a request with a server. On
+success, OCI_SUCCESS is returned.
+If a SELECT statement is executed, the description of the select list follows
+implicitly as a response. This description is buffered on the client side for
+describes, fetches and define type conversions. Hence it is optimal to
+describe a select list only after an execute.
+Also for SELECT statements, some results are available implicitly. Rows will
+be received and buffered at the end of the execute. For queries with small row
+count, a prefetch causes memory to be released in the server if the end of
+fetch is reached, an optimization that may result in memory usage reduction.
+Set attribute call has been defined to set the number of rows to be prefetched
+per result set.
+For SELECT statements, at the end of the execute, the statement handle
+implicitly maintains a reference to the service context on which it is
+executed. It is the user's responsibility to maintain the integrity of the
+service context. If the attributes of a service context is changed for
+executing some operations on this service context, the service context must
+be restored to have the same attributes, that a statement was executed with,
+prior to a fetch on the statement handle. The implicit reference is maintained
+until the statement handle is freed or the fetch is cancelled or an end of
+fetch condition is reached.
+Note: If output variables are defined for a SELECT statement before a
+call to OCIStmtExecute(), the number of rows specified by iters will be
+fetched directly into the defined output buffers and additional rows
+equivalent to the prefetch count will be prefetched. If there are no
+additional rows, then the fetch is complete without calling
+OCIStmtFetch().
+The execute call will return errors if the statement has bind data types that
+are not supported in an Oracle7 server.
+Parameters
+svchp (IN/OUT) - service context handle.
+stmtp (IN/OUT) - an statement handle - defines the statement and the
+associated data to be executed at the server. It is invalid to pass in a
+statement handle that has bind of data types only supported in release 8.0
+when srvchp points to an Oracle7 server.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error. If the statement is being
+batched and it is successful, then this handle will contain this particular
+statement execution specific errors returned from the server when the batch is
+flushed.
+iters (IN) - the number of times this statement is executed for non-Select
+statements. For Select statements, if iters is non-zero, then defines must
+have been done for the statement handle. The execution fetches iters rows into
+these predefined buffers and prefetches more rows depending upon the prefetch
+row count. This function returns an error if iters=0 for non-SELECT
+statements.
+rowoff (IN) - the index from which the data in an array bind is relevant for
+this multiple row execution.
+snap_in (IN) - this parameter is optional. if supplied, must point to a
+snapshot descriptor of type OCI_DTYPE_SNAP. The contents of this descriptor
+must be obtained from the snap_out parameter of a previous call. The
+descriptor is ignored if the SQL is not a SELECT. This facility allows
+multiple service contexts to ORACLE to see the same consistent snapshot of the
+database's committed data. However, uncommitted data in one context is not
+visible to another context even using the same snapshot.
+snap_out (OUT) - this parameter optional. if supplied, must point to a
+descriptor of type OCI_DTYPE_SNAP. This descriptor is filled in with an
+opaque representation which is the current ORACLE "system change
+number" suitable as a snap_in input to a subsequent call to OCIStmtExecute().
+This descriptor should not be used any longer than necessary in order to avoid
+"snapshot too old" errors.
+mode (IN) - The modes are:
+If OCI_DEFAULT_MODE, the default mode, is selected, the request is
+immediately executed. Error handle contains diagnostics on error if any.
+OCI_EXACT_FETCH - if the statement is a SQL SELECT, this mode is
+only valid if the application has set the prefetch row count prior to this
+call. In this mode, the OCI library will get up to the number of rows
+specified (i.e., prefetch row count plus iters). If the number of rows
+returned by the query is greater than this value, OCI_ERROR will be
+returned with ORA-01422 as the implementation specific error in a
+diagnostic record. If the number of rows returned by the query is
+smaller than the prefetch row count, OCI_SUCCESS_WITH_INFO will
+be returned with ORA-01403 as the implementation specific error. The
+prefetch buffer size is ignored and the OCI library tries to allocate all the
+space required to contain the prefetched rows. The exact fetch semantics
+apply to only the top level rows. No more rows can be fetched for this
+query at the end of the call.
+OCI_KEEP_FETCH_STATE - the result set rows (not yet fetched) of this
+statement executed in this transaction will be maintained when the
+transaction is detached for migration. By default, a query is cancelled
+when a transaction is detached for migration. This mode is the default
+mode when connected to a V7 server.
+Related Functions
+OCIStmtPrepare()
+
+
+
+
+
+OCIStmtFetch()
+Name
+OCI FetCH
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch ( OCIStmt *stmtp,
+ OCIError *errhp,
+ ub4 nrows,
+ ub2 orientation,
+ ub4 mode);
+Comments
+The fetch call is a local call, if prefetched rows suffice. However, this is
+transparent to the application. If LOB columns are being read, LOB locators
+are fetched for subsequent LOB operations to be performed on these locators.
+Prefetching is turned off if LONG columns are involved.
+A fetch with nrows set to 0 rows effectively cancels the fetch for this
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+orientation (IN) - for release 8.0, the only acceptable value is
+OCI_FETCH_NEXT, which is also the default value.
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set.
+If nrows is non-zero, setting this mode effectively cancels fetching after
+retrieving nrows, otherwise it cancels fetching immediately.
+Related Functions
+OCIAttrGet()
+
+
+OCIStmtFetch2()
+Name
+OCI FetCH2
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch2 ( OCIStmt *stmtp,
+ OCIError *errhp,
+ ub4 nrows,
+ ub2 orientation,
+ ub4 scrollOffset,
+ ub4 mode);
+Comments
+The fetch call works similar to the OCIStmtFetch call with the
+addition of the fetchOffset parameter. It can be used on any
+statement handle, whether it is scrollable or not. For a
+non-scrollable statement handle, the only acceptable value
+will be OCI_FETCH_NEXT, and the fetchOffset parameter will be
+ignored. Applications are encouraged to use this new call.
+
+A fetchOffset with OCI_FETCH_RELATIVE is equivalent to
+OCI_FETCH_CURRENT with a value of 0, is equivalent to
+OCI_FETCH_NEXT with a value of 1, and equivalent to
+OCI_FETCH_PRIOR with a value of -1. Note that the range of
+accessible rows is [1,OCI_ATTR_ROW_COUNT] beyond which an
+error could be raised if sufficient rows do not exist in
+
+The fetch call is a local call, if prefetched rows suffice. However, this is
+transparent to the application. If LOB columns are being read, LOB locators
+are fetched for subsequent LOB operations to be performed on these locators.
+Prefetching is turned off if LONG columns are involved.
+A fetch with nrows set to 0 rows effectively cancels the fetch for this
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+It defaults to 1 for orientation OCI_FETCH_LAST.
+orientation (IN) - The acceptable values are as follows, with
+OCI_FETCH_NEXT being the default value.
+OCI_FETCH_CURRENT gets the current row,
+OCI_FETCH_NEXT gets the next row from the current position,
+OCI_FETCH_FIRST gets the first row in the result set,
+OCI_FETCH_LAST gets the last row in the result set,
+OCI_FETCH_PRIOR gets the previous row from the current row in the result set,
+OCI_FETCH_ABSOLUTE will fetch the row number (specified by fetchOffset
+parameter) in the result set using absolute positioning,
+OCI_FETCH_RELATIVE will fetch the row number (specified by fetchOffset
+parameter) in the result set using relative positioning.
+scrollOffset(IN) - offset used with the OCI_FETCH_ABSOLUTE and
+OCI_FETCH_RELATIVE orientation parameters only. It specify
+the new current position for scrollable result set. It is
+ignored for non-scrollable result sets.
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set.
+If nrows is non-zero, setting this mode effectively cancels fetching after
+retrieving nrows, otherwise it cancels fetching immediately.
+Related Functions
+OCIAttrGet()
+
+
+OCIStmtGetBindInfo()
+Name
+OCI Get Bind Parameters
+Purpose
+Gets the bind and indicator variable names.
+Syntax
+sword OCIStmtGetBindInfo ( OCIStmt *stmtp,
+ OCIError *errhp,
+ ub4 size,
+ ub4 startloc,
+ sb4 *found,
+ OraText *bvnp[],
+ ub1 bvnl[],
+ OraText *invp[],
+ ub1 inpl[],
+ ub1 dupl[],
+ OCIBind *hndl[] );
+
+Comments
+Gets the bind and indicator variable names. It returns the information for all
+the bind variables (even the duplicate ones) and sets the found parameter to
+the total number of bind variables and not just the number of distinct bind
+variables.
+The statement must have been prepared with a call to OCIStmtPrepare() prior
+to this call.
+This call is processed locally.
+Parameters
+stmtp (IN) - the statement handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+size (IN) - the number of elements in each array.
+startloc (IN) - position of the bind variable at which to start getting bind
+information.
+found (IN) - abs(found) gives the total number of bind variables in the
+statement irrespective of the start position. Positive value if the number of
+bind variables returned is less than the size provided, otherwise negative.
+bvnp (OUT) - array of pointers to hold bind variable names.
+bvnl (OUT) - array to hold the length of the each bvnp element.
+invp (OUT) - array of pointers to hold indicator variable names.
+inpl (OUT) - array of pointers to hold the length of the each invp element.
+dupl (OUT) - an array whose element value is 0 or 1 depending on whether the
+bind position is duplicate of another.
+hndl (OUT) - an array which returns the bind handle if binds have been done
+for the bind position. No handle is returned for duplicates.
+Related Functions
+OCIStmtPrepare()
+
+
+
+OCIStmtGetPieceInfo()
+Name
+OCI Get Piece Information
+Purpose
+Returns piece information for a piecewise operation.
+Syntax
+sword OCIStmtGetPieceInfo( CONST OCIStmt *stmtp,
+ OCIError *errhp,
+ dvoid **hndlpp,
+ ub4 *typep,
+ ub1 *in_outp,
+ ub4 *iterp,
+ ub4 *idxp,
+ ub1 *piecep );
+
+Comments
+When an execute/fetch call returns OCI_NEED_DATA to get/return a
+dynamic bind/define value or piece, OCIStmtGetPieceInfo() returns the
+relevant information: bind/define handle, iteration or index number and
+which piece.
+See the section "Runtime Data Allocation and Piecewise Operations" on page
+5-16 for more information about using OCIStmtGetPieceInfo().
+Parameters
+stmtp (IN) - the statement when executed returned OCI_NEED_DATA.
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+hndlpp (OUT) - returns a pointer to the bind or define handle of the bind or
+define whose runtime data is required or is being provided.
+typep (OUT) - the type of the handle pointed to by hndlpp: OCI_HTYPE_BIND
+(for a bind handle) or OCI_HTYPE_DEFINE (for a define handle).
+in_outp (OUT) - returns OCI_PARAM_IN if the data is required for an IN bind
+value. Returns OCI_PARAM_OUT if the data is available as an OUT bind
+variable or a define position value.
+iterp (OUT) - returns the row number of a multiple row operation.
+idxp (OUT) - the index of an array element of a PL/SQL array bind operation.
+piecep (OUT) - returns one of the following defined values -
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE and
+OCI_LAST_PIECE. The default value is always OCI_ONE_PIECE.
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(),
+OCIStmtSetPieceInfo()
+
+
+
+
+OCIStmtPrepare()
+Name
+OCI Statement REQuest
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare ( OCIStmt *stmtp,
+ OCIError *errhp,
+ CONST OraText *stmt,
+ ub4 stmt_len,
+ ub4 language,
+ ub4 mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The
+OCIStmtPrepare() call defines an application request.
+This is a purely local call. Data values for this statement initialized in
+subsequent bind calls will be stored in a bind handle which will hang off this
+statement handle.
+This call does not create an association between this statement handle and any
+particular server.
+See the section "Preparing Statements" on page 2-21 for more information
+about using this call.
+Parameters
+stmtp (IN) - a statement handle.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-
+terminated string. The pointer to the text of the statement must be available
+as long as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server.
+mode (IN) - the only defined mode is OCI_DEFAULT for default mode.
+Example
+This example demonstrates the use of OCIStmtPrepare(), as well as the OCI
+application initialization calls.
+Related Functions
+OCIAttrGet(), OCIStmtExecute()
+
+
+OCIStmtPrepare2()
+Name
+OCI Statement REQuest with (a) early binding to svchp and/or
+(b) stmt caching
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare2 ( OCISvcCtx *svchp,
+ OCIStmt **stmtp,
+ OCIError *errhp,
+ CONST OraText *stmt,
+ ub4 stmt_len,
+ CONST OraText *key,
+ ub4 key_len,
+ ub4 language,
+ ub4 mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The
+OCIStmtPrepare() call defines an application request.
+This is a purely local call. Data values for this statement initialized in
+subsequent bind calls will be stored in a bind handle which will hang off this
+statement handle.
+This call creates an association between the statement handle and a service
+context. It differs from OCIStmtPrepare in that respect. It also supports
+stmt caching. The stmt will automatically be cached if the authp of the stmt
+has enabled stmt caching.
+Parameters
+svchp (IN) - the service context handle that contains the session that
+ this stmt handle belongs to.
+stmtp (OUT) - an unallocated stmt handle must be pased in. An allocated
+ and prepared statement handle will be returned.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-
+ terminated string. The pointer to the OraText of the statement
+ must be available as long as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+ key to search with. It thus optimizes the search in the cache.
+key_len (IN) - the length of the key. This, too, is onlly valid for stmt
+ caching.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server.
+mode (IN) - the defined modes are OCI_DEFAULT and OCI_PREP2_CACHE_SEARCHONLY.
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtRelease()
+
+
+OCIStmtRelease()
+Name
+OCI Statement Release. This call is used to relesae the stmt that
+was retreived using OCIStmtPrepare2(). If the stmt is release
+using this call, OCIHandleFree() must not be called on the stmt
+handle.
+Purpose
+This call releases the statement obtained by OCIStmtPrepare2
+Syntax
+sword OCIStmtRelease ( OCIStmt *stmtp,
+ OCIError *errhp,
+ cONST OraText *key,
+ ub4 key_len,
+ ub4 mode);
+Comments
+This call is used to release a handle obtained via OCIStmtPrepare2().
+It also frees the memory associated with the handle.
+This is a purely local call.
+Parameters
+stmtp (IN/OUT) - The statement handle to be released/freed.
+errhp (IN) - an error handle to retrieve diagnostic information.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+ key to tag the stmt with.
+key_len (IN) - the length of the key. This, too, is only valid for stmt
+ caching.
+mode (IN) - the defined modes are OCI_DEFAULT for default mode and
+ OCI_STRLS_CACHE_DELETE (only used for Stmt Caching).
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtPrepare2()
+
+
+OCIStmtSetPieceInfo()
+Name
+OCI Set Piece Information
+Purpose
+Sets piece information for a piecewise operation.
+Syntax
+sword OCIStmtSetPieceInfo ( dvoid *hndlp,
+ ub4 type,
+ OCIError *errhp,
+ CONST dvoid *bufp,
+ ub4 *alenp,
+ ub1 piece,
+ CONST dvoid *indp,
+ ub2 *rcodep );
+Comments
+When an execute call returns OCI_NEED_DATA to get a dynamic IN/OUT
+bind value or piece, OCIStmtSetPieceInfo() sets the piece information: the
+buffer, the length, the indicator and which piece is currently being processed.
+For more information about using OCIStmtSetPieceInfo() see the section
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+hndlp (IN/OUT) - the bind/define handle.
+type (IN) - type of the handle.
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+bufp (IN/OUT) - bufp is a pointer to a storage containing the data value or
+the piece when it is an IN bind variable, otherwise bufp is a pointer to
+storage for getting a piece or a value for OUT binds and define variables. For
+named data types or REFs, a pointer to the object or REF is returned.
+alenp (IN/OUT) - the length of the piece or the value.
+piece (IN) - the piece parameter. The following are valid values:
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE, or
+OCI_LAST_PIECE.
+The default value is OCI_ONE_PIECE. This parameter is used for IN bind
+variables only.
+indp (IN/OUT) - indicator. A pointer to a sb2 value or pointer to an indicator
+structure for named data types (SQLT_NTY) and REFs (SQLT_REF), i.e., *indp
+is either an sb2 or a dvoid * depending upon the data type.
+rcodep (IN/OUT) - return code.
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(),
+OCIStmtGetPieceInfo()
+
+
+OCIFormatInit
+Name
+OCIFormat Package Initialize
+Purpose
+Initializes the OCIFormat package.
+Syntax
+sword OCIFormatInit(dvoid *hndl, OCIError *err);
+Comments
+This routine must be called before calling any other OCIFormat routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatTerm()
+
+
+OCIFormatString
+Name
+OCIFormat Package Format String
+Purpose
+Writes a text string into the supplied text buffer using the argument
+list submitted to it and in accordance with the format string given.
+Syntax
+sword OCIFormatString(dvoid *hndl, OCIError *err, text *buffer,
+ sbig_ora bufferLength, sbig_ora *returnLength,
+ CONST OraText *formatString, ...);
+Comments
+The first call to this routine must be preceded by a call to the
+OCIFormatInit routine that initializes the OCIFormat package
+for use. When this routine is no longer needed then terminate
+the OCIFormat package by a call to the OCIFormatTerm routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+buffer (OUT) - text buffer for the string
+bufferLength (IN) - length of the text buffer
+returnLength (OUT) - length of the formatted string
+formatString (IN) - format specification string
+... (IN) - variable argument list
+Related Functions
+
+
+OCIFormatTerm
+Name
+OCIFormat Package Terminate
+Purpose
+Terminates the OCIFormat package.
+Syntax
+sword OCIFormatTerm(dvoid *hndl, OCIError *err);
+Comments
+It must be called after the OCIFormat package is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatInit()
+
+
+OCIFormatTUb1
+Name
+OCIFormat Package ub1 Type
+Purpose
+Return the type value for the ub1 type.
+Syntax
+sword OCIFormatTUb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb2
+Name
+OCIFormat Package ub2 Type
+Purpose
+Return the type value for the ub2 type.
+Syntax
+sword OCIFormatTUb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb4
+Name
+OCIFormat Package ub4 Type
+Purpose
+Return the type value for the ub4 type.
+Syntax
+sword OCIFormatTUb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUword
+Name
+OCIFormat Package uword Type
+Purpose
+Return the type value for the uword type.
+Syntax
+sword OCIFormatTUword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUbig_ora
+Name
+OCIFormat Package ubig_ora Type
+Purpose
+Return the type value for the ubig_ora type.
+Syntax
+sword OCIFormatTUbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb1
+Name
+OCIFormat Package sb1 Type
+Purpose
+Return the type value for the sb1 type.
+Syntax
+sword OCIFormatTSb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb2
+Name
+OCIFormat Package sb2 Type
+Purpose
+Return the type value for the sb2 type.
+Syntax
+sword OCIFormatTSb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb4
+Name
+OCIFormat Package sb4 Type
+Purpose
+Return the type value for the sb4 type.
+Syntax
+sword OCIFormatTSb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSword
+Name
+OCIFormat Package sword Type
+Purpose
+Return the type value for the sword type.
+Syntax
+sword OCIFormatTSword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSbig_ora
+Name
+OCIFormat Package sbig_ora Type
+Purpose
+Return the type value for the sbig_ora type.
+Syntax
+sword OCIFormatTSbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb1
+Name
+OCIFormat Package eb1 Type
+Purpose
+Return the type value for the eb1 type.
+Syntax
+sword OCIFormatTEb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb2
+Name
+OCIFormat Package eb2 Type
+Purpose
+Return the type value for the eb2 type.
+Syntax
+sword OCIFormatTEb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb4
+Name
+OCIFormat Package eb4 Type
+Purpose
+Return the type value for the eb4 type.
+Syntax
+sword OCIFormatTEb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEword
+Name
+OCIFormat Package eword Type
+Purpose
+Return the type value for the eword type.
+Syntax
+sword OCIFormatTEword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTChar
+Name
+OCIFormat Package text Type
+Purpose
+Return the type value for the text type.
+Syntax
+sword OCIFormatTChar(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTText
+Name
+OCIFormat Package *text Type
+Purpose
+Return the type value for the *text type.
+Syntax
+sword OCIFormatTText(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTDouble
+Name
+OCIFormat Package double Type
+Purpose
+Return the type value for the double type.
+Syntax
+sword OCIFormatTDouble(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatDvoid
+Name
+OCIFormat Package dvoid Type
+Purpose
+Return the type value for the dvoid type.
+Syntax
+sword OCIFormatTDvoid(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEnd
+Name
+OCIFormat Package end Type
+Purpose
+Return the list terminator's "type".
+Syntax
+sword OCIFormatTEnd(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCISvcCtxToLda()
+Name
+OCI toggle SerVice context handle to Version 7 Lda_Def
+Purpose
+Toggles between a V8 service context handle and a V7 Lda_Def.
+Syntax
+sword OCISvcCtxToLda ( OCISvcCtx *srvhp,
+ OCIError *errhp,
+ Lda_Def *ldap );
+Comments
+Toggles between an Oracle8 service context handle and an Oracle7 Lda_Def.
+This function can only be called after a service context has been properly
+initialized.
+Once the service context has been translated to an Lda_Def, it can be used in
+release 7.x OCI calls (e.g., obindps(), ofen()).
+Note: If there are multiple service contexts which share the same server
+handle, only one can be in V7 mode at any time.
+The action of this call can be reversed by passing the resulting Lda_Def to
+the OCILdaToSvcCtx() function.
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+ldap (IN/OUT) - a Logon Data Area for V7-style OCI calls which is initialized
+by this call.
+Related Functions
+OCILdaToSvcCtx()
+
+
+
+
+OCITransCommit()
+Name
+OCI TX (transaction) CoMmit
+Purpose
+Commits the transaction associated with a specified service context.
+Syntax
+sword OCITransCommit ( OCISvcCtx *srvcp,
+ OCIError *errhp,
+ ub4 flags );
+Comments
+The transaction currently associated with the service context is committed. If
+it is a distributed transaction that the server cannot commit, this call
+additionally retrieves the state of the transaction from the database to be
+returned to the user in the error handle.
+If the application has defined multiple transactions, this function operates
+on the transaction currently associated with the service context. If the
+application is working with only the implicit local transaction created when
+database changes are made, that implicit transaction is committed.
+If the application is running in the object mode, then the modified or updated
+objects in the object cache for this transaction are also committed.
+The flags parameter is used for one-phase commit optimization in distributed
+transactions. If the transaction is non-distributed, the flags parameter is
+ignored, and OCI_DEFAULT can be passed as its value. OCI applications
+managing global transactions should pass a value of
+OCI_TRANS_TWOPHASE to the flags parameter for a two-phase commit. The
+default is one-phase commit.
+Under normal circumstances, OCITransCommit() returns with a status
+indicating that the transaction has either been committed or rolled back. With
+distributed transactions, it is possible that the transaction is now in-doubt
+(i.e., neither committed nor aborted). In this case, OCITransCommit()
+attempts to retrieve the status of the transaction from the server.
+The status is returned.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags -see the "Comments" section above.
+Related Functions
+OCITransRollback()
+
+
+
+
+OCITransDetach()
+Name
+OCI TX (transaction) DeTach
+Purpose
+Detaches a transaction.
+Syntax
+sword OCITransDetach ( OCISvcCtx *srvcp,
+ OCIError *errhp,
+ ub4 flags);
+Comments
+Detaches a global transaction from the service context handle. The transaction
+currently attached to the service context handle becomes inactive at the end
+of this call. The transaction may be resumed later by calling OCITransStart(),
+specifying a flags value of OCI_TRANS_RESUME.
+When a transaction is detached, the value which was specified in the timeout
+parameter of OCITransStart() when the transaction was started is used to
+determine the amount of time the branch can remain inactive before being
+deleted by the server's PMON process.
+Note: The transaction can be resumed by a different process than the one
+that detached it, provided that the transaction has the same
+authorization.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags (IN) - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransStart()
+
+
+
+OCITransForget()
+Name
+OCI TX (transaction) ForGeT
+Purpose
+Causes the server to forget a heuristically completed global transaction.
+Syntax
+sword OCITransForget ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ ub4 flags);
+
+Comments
+
+Forgets a heuristically completed global transaction. The server deletes the
+status of the transaction from the system's pending transaction table.
+The XID of the transaction to be forgotten is set as an attribute of the
+transaction handle (OCI_ATTR_XID).
+Parameters
+srvcp (IN) - the service context handle - the transaction is rolled back.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransRollback()
+
+
+
+OCITransMultiPrepare()
+Name
+OCI Trans(action) Multi-Branch Prepare
+Purpose
+Prepares a transaction with multiple branches in a single call.
+Syntax
+sword OCITransMultiPrepare ( OCISvcCtx *svchp,
+ ub4 numBranches,
+ OCITrans **txns,
+ OCIError **errhp);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+This call is an advanced performance feature intended for use only in
+situations where the caller is responsible for preparing all the branches
+in a transaction.
+Parameters
+srvcp (IN) - the service context handle.
+numBranches (IN) - This is the number of branches expected. It is also the
+array size for the next two parameters.
+txns (IN) - This is the array of transaction handles for the branches to
+prepare. They should all have the OCI_ATTR_XID set. The global transaction
+ID should be the same.
+errhp (IN) - This is the array of error handles. If OCI_SUCCESS is not
+returned, then these will indicate which branches received which errors.
+Related Functions
+OCITransPrepare()
+
+
+OCITransPrepare()
+Name
+OCI TX (transaction) PREpare
+Purpose
+Prepares a transaction for commit.
+Syntax
+sword OCITransPrepare ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ ub4 flags);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+The call returns OCI_SUCCESS_WITH_INFO if the transaction has not made
+any changes. The error handle will indicate that the transaction is read-only.
+The flag parameter is not currently used.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransForget()
+
+
+
+
+OCITransRollback()
+Name
+OCI TX (transaction) RoLlback
+Purpose
+Rolls back the current transaction.
+Syntax
+sword OCITransRollback ( dvoid *svchp,
+ OCIError *errhp,
+ ub4 flags );
+Comments
+The current transaction- defined as the set of statements executed since the
+last OCITransCommit() or since OCISessionBegin()-is rolled back.
+If the application is running under object mode then the modified or updated
+objects in the object cache for this transaction are also rolled back.
+An error is returned if an attempt is made to roll back a global transaction
+that is not currently active.
+Parameters
+svchp (IN) - a service context handle. The transaction currently set in the
+service context handle is rolled back.
+errhp -(IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit()
+
+
+
+
+OCITransStart()
+Name
+OCI TX (transaction) STart
+Purpose
+Sets the beginning of a transaction.
+Syntax
+sword OCITransStart ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ uword timeout,
+ ub4 flags);
+
+Comments
+This function sets the beginning of a global or serializable transaction. The
+transaction context currently associated with the service context handle is
+initialized at the end of the call if the flags parameter specifies that a new
+transaction should be started.
+The XID of the transaction is set as an attribute of the transaction handle
+(OCI_ATTR_XID)
+Parameters
+svchp (IN/OUT) - the service context handle. The transaction context in the
+service context handle is initialized at the end of the call if the flag
+specified a new transaction to be started.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+err and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+timeout (IN) - the time, in seconds, to wait for a transaction to become
+available for resumption when OCI_TRANS_RESUME is specified. When
+OCI_TRANS_NEW is specified, this value is stored and may be used later by
+OCITransDetach().
+flags (IN) - specifies whether a new transaction is being started or an
+existing transaction is being resumed. Also specifies serializiability or
+read-only status. More than a single value can be specified. By default,
+a read/write transaction is started. The flag values are:
+OCI_TRANS_NEW - starts a new transaction branch. By default starts a
+tightly coupled and migratable branch.
+OCI_TRANS_TIGHT - explicitly specifies a tightly coupled branch
+OCI_TRANS_LOOSE - specifies a loosely coupled branch
+OCI_TRANS_RESUME - resumes an existing transaction branch.
+OCI_TRANS_READONLY - start a readonly transaction
+OCI_TRANS_SERIALIZABLE - start a serializable transaction
+Related Functions
+OCITransDetach()
+
+
+******************************************************************************/
+
+/*****************************************************************************
+ ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+/*-----------------------Dynamic Callback Function Pointers------------------*/
+typedef sb4 (*OCICallbackInBind)(/*_ dvoid *ictxp, OCIBind *bindp, ub4 iter,
+ ub4 index, dvoid **bufpp, ub4 *alenp,
+ ub1 *piecep, dvoid **indp _*/);
+
+typedef sb4 (*OCICallbackOutBind)(/*_ dvoid *octxp, OCIBind *bindp, ub4 iter,
+ ub4 index, dvoid **bufpp, ub4 **alenp,
+ ub1 *piecep, dvoid **indp,
+ ub2 **rcodep _*/);
+
+typedef sb4 (*OCICallbackDefine)(/*_ dvoid *octxp, OCIDefine *defnp, ub4 iter,
+ dvoid **bufpp, ub4 **alenp, ub1 *piecep,
+ dvoid **indp, ub2 **rcodep _*/);
+
+typedef sword (*OCIUserCallback)(/*_ dvoid *ctxp, dvoid *hndlp, ub4 type,
+ ub4 fcode, ub4 when, sword returnCode,
+ sb4 *errnop, va_list arglist _*/);
+
+typedef sword (*OCIEnvCallbackType)(/*_ OCIEnv *env, ub4 mode,
+ size_t xtramem_sz, dvoid *usrmemp,
+ OCIUcb *ucbDesc _*/);
+
+typedef sb4 (*OCICallbackLobRead)(/*_ dvoid *ctxp,
+ CONST dvoid *bufp,
+ ub4 len,
+ ub1 piece _*/);
+
+/*
+ * Called multiple times when the data is being read from the pipe
+ * ctxp (IN) - is the context passed in by the user in OCILobRead call
+ * bufp (IN) - the buffer containing the read data
+ * len (IN) - the length of the data in the buffer that is relevant
+ * piece (IN) - one of the following, OCI_FIRST_PIECE, OCI_NEXT_PIECE
+ */
+
+typedef sb4 (*OCICallbackLobWrite)(/*_ dvoid *ctxp,
+ dvoid *bufp,
+ ub4 *lenp,
+ ub1 *piece _*/);
+
+/*
+ * Called multiple times when the data is being written to the pipe
+ * ctxp (IN) - is the context passed in by the user in OCILobRead call
+ * bufp (IN/OUT) - the buffer into which the data to be written is copied
+ * lenp (OUT) - the length of the data in the buffer that is relevant
+ * piece (OUT) - one of the following, OCI_NEXT_PIECE or OCI_LAST_PIECE
+ */
+
+/*--------------------------Failover Callback Structure ---------------------*/
+typedef sb4 (*OCICallbackFailover)(/*_ dvoid *svcctx, dvoid *envctx,
+ dvoid *fo_ctx, ub4 fo_type,
+ ub4 fo_event _*/);
+/* Called at failover time if client has registered it. */
+typedef struct
+{
+ OCICallbackFailover callback_function;
+ dvoid *fo_ctx;
+}
+OCIFocbkStruct;
+
+
+
+sword OCIInitialize(/*_ ub4 mode, dvoid *ctxp,
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr,
+ size_t newsize),
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr) _*/);
+
+sword OCITerminate(ub4 mode);
+
+sword OCIEnvCreate (/*_ OCIEnv **envp, ub4 mode, dvoid *ctxp,
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+ size_t xtramem_sz, dvoid **usrmempp _*/);
+
+sword OCIEnvNlsCreate (/*_ OCIEnv **envp, ub4 mode, dvoid *ctxp,
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+ size_t xtramem_sz, dvoid **usrmempp,
+ ub2 charset, ub2 ncharset _*/);
+
+sword OCIFEnvCreate (/*_ OCIEnv **envp, ub4 mode, dvoid *ctxp,
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+ size_t xtramem_sz, dvoid **usrmempp, dvoid *fupg _*/);
+
+sword OCIHandleAlloc(/*_ CONST dvoid *parenth, dvoid **hndlpp,
+ CONST ub4 type, CONST size_t xtramem_sz,
+ dvoid **usrmempp _*/);
+
+sword OCIHandleFree(/*_ dvoid *hndlp, CONST ub4 type _*/);
+
+sword OCIDescriptorAlloc(/*_ CONST dvoid *parenth, dvoid **descpp,
+ CONST ub4 type, CONST size_t xtramem_sz,
+ dvoid **usrmempp _*/);
+
+sword OCIDescriptorFree(/*_ dvoid *descp, CONST ub4 type _*/);
+
+sword OCIEnvInit(/*_ OCIEnv **envp, ub4 mode,
+ size_t xtramem_sz, dvoid **usrmempp _*/);
+
+sword OCIServerAttach(/*_ OCIServer *srvhp, OCIError *errhp,
+ CONST OraText *dblink, sb4 dblink_len,
+ ub4 mode _*/);
+
+sword OCIServerDetach(/*_ OCIServer *srvhp, OCIError *errhp, ub4 mode _*/);
+
+sword OCISessionBegin(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCISession *usrhp, ub4 credt, ub4 mode _*/);
+
+sword OCISessionEnd(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCISession *usrhp, ub4 mode _*/);
+
+sword OCILogon (/*_ OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+ CONST OraText *username, ub4 uname_len,
+ CONST OraText *password, ub4 passwd_len,
+ CONST OraText *dbname, ub4 dbname_len _*/);
+
+sword OCILogon2 (/*_ OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+ CONST OraText *username, ub4 uname_len,
+ CONST OraText *password, ub4 passwd_len,
+ CONST OraText *dbname, ub4 dbname_len,
+ ub4 mode _*/);
+
+sword OCILogoff (/*_ OCISvcCtx *svchp, OCIError *errhp _*/);
+
+sword OCIPasswordChange (/*_ OCISvcCtx *svchp, OCIError *errhp,
+ CONST OraText *user_name, ub4 usernm_len,
+ CONST OraText *opasswd, ub4 opasswd_len,
+ CONST OraText *npasswd, ub4 npasswd_len,
+ ub4 mode _*/);
+
+sword OCIStmtPrepare(/*_ OCIStmt *stmtp, OCIError *errhp, CONST OraText *stmt,
+ ub4 stmt_len, ub4 language, ub4 mode _*/);
+
+sword OCIStmtPrepare2 (/*_ OCISvcCtx *svchp, OCIStmt **stmtp, OCIError *errhp,
+ CONST OraText *stmt, ub4 stmt_len, CONST OraText *key,
+ ub4 key_len, ub4 language, ub4 mode _*/);
+
+sword OCIStmtRelease (/*_ OCIStmt *stmtp, OCIError *errhp, CONST OraText *key,
+ ub4 key_len, ub4 mode _*/);
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCIBindByPos (/*_ OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+ ub4 position, dvoid *valuep, sb4 value_sz,
+ ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+ ub4 maxarr_len, ub4 *curelep, ub4 mode _*/);
+#endif /* __STDC__ */
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCIBindByName (/*_ OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+ CONST OraText *placeholder, sb4 placeh_len,
+ dvoid *valuep, sb4 value_sz, ub2 dty,
+ dvoid *indp, ub2 *alenp, ub2 *rcodep,
+ ub4 maxarr_len, ub4 *curelep, ub4 mode _*/);
+#endif /* __STDC__ */
+
+sword OCIBindObject(/*_ OCIBind *bindp, OCIError *errhp,
+ CONST OCIType *type, dvoid **pgvpp,
+ ub4 *pvszsp, dvoid **indpp, ub4 *indszp _*/);
+
+sword OCIBindDynamic(/*_ OCIBind *bindp, OCIError *errhp,
+ dvoid *ictxp, OCICallbackInBind icbfp,
+ dvoid *octxp, OCICallbackOutBind ocbfp _*/);
+
+sword OCIBindArrayOfStruct(/*_ OCIBind *bindp, OCIError *errhp, ub4 pvskip,
+ ub4 indskip, ub4 alskip, ub4 rcskip _*/);
+
+sword OCIStmtGetPieceInfo(/*_ OCIStmt *stmtp, OCIError *errhp,
+ dvoid **hndlpp, ub4 *typep, ub1 *in_outp,
+ ub4 *iterp, ub4 *idxp, ub1 *piecep _*/);
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCIStmtSetPieceInfo(/*_ dvoid *hndlp, ub4 type, OCIError *errhp,
+ CONST dvoid *bufp, ub4 *alenp, ub1 piece,
+ CONST dvoid *indp, ub2 *rcodep _*/);
+#endif /* __STDC__ */
+
+sword OCIStmtExecute(/*_ OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp,
+ ub4 iters, ub4 rowoff, CONST OCISnapshot *snap_in,
+ OCISnapshot *snap_out, ub4 mode _*/);
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCIDefineByPos (/*_ OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
+ ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+ dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode _*/);
+#endif /* __STDC__ */
+
+sword OCIDefineObject(/*_ OCIDefine *defnp, OCIError *errhp,
+ CONST OCIType *type, dvoid **pgvpp,
+ ub4 *pvszsp, dvoid **indpp, ub4 *indszp _*/);
+
+sword OCIDefineDynamic(/*_ OCIDefine *defnp, OCIError *errhp,
+ dvoid *octxp, OCICallbackDefine ocbfp _*/);
+
+sword OCIDefineArrayOfStruct(/*_ OCIDefine *defnp, OCIError *errhp,
+ ub4 pvskip, ub4 indskip, ub4 rlskip,
+ ub4 rcskip _*/);
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCIStmtFetch(/*_ OCIStmt *stmtp, OCIError *errhp,
+ ub4 nrows, ub2 orientation, ub4 mode _*/);
+#endif /* __STDC__ */
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCIStmtFetch2(/*_ OCIStmt *stmtp, OCIError *errhp,
+ ub4 nrows, ub2 orientation, sb4 scrollOffset, ub4 mode _*/);
+#endif /* __STDC__ */
+
+sword OCIStmtGetBindInfo(/*_ OCIStmt *stmtp, OCIError *errhp, ub4 size,
+ ub4 startloc, sb4 *found,
+ OraText *bvnp[], ub1 bvnl[], OraText *invp[],
+ ub1 inpl[], ub1 dupl[], OCIBind *hndl[] _*/);
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCIDescribeAny(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ dvoid *objptr, ub4 objnm_len, ub1 objptr_typ,
+ ub1 info_level, ub1 objtyp, OCIDescribe *dschp _*/);
+#endif /* __STDC__ */
+
+sword OCIParamGet(/*_ CONST dvoid *hndlp, ub4 htype, OCIError *errhp,
+ dvoid **parmdpp, ub4 pos _*/);
+
+sword OCIParamSet(/*_ dvoid *hdlp, ub4 htyp, OCIError *errhp,
+ CONST dvoid *dscp, ub4 dtyp, ub4 pos _*/);
+
+sword OCITransStart(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ uword timeout, ub4 flags _*/);
+
+sword OCITransDetach(/*_ OCISvcCtx *svchp, OCIError *errhp, ub4 flags _*/);
+
+sword OCITransCommit(/*_ OCISvcCtx *svchp, OCIError *errhp, ub4 flags _*/);
+
+sword OCITransRollback(/*_ OCISvcCtx *svchp, OCIError *errhp, ub4 flags _*/);
+
+sword OCITransPrepare (/*_ OCISvcCtx *svchp, OCIError *errhp, ub4 flags _*/);
+
+sword OCITransMultiPrepare (/*_ OCISvcCtx *svchp, ub4 numBranches,
+ OCITrans **txns, OCIError **errhp _*/);
+
+sword OCITransForget ( /*_ OCISvcCtx *svchp, OCIError *errhp, ub4 flags _*/);
+
+sword OCIErrorGet ( /*_ dvoid *hndlp, ub4 recordno, OraText *sqlstate,
+ sb4 *errcodep, OraText *bufp, ub4 bufsiz,
+ ub4 type _*/ );
+
+sword OCILobAppend ( /*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_locp _*/ );
+
+sword OCILobAssign ( /*_ OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *src_locp,
+ OCILobLocator **dst_locpp _*/ );
+
+sword OCILobCharSetForm ( /*_ OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *locp,
+ ub1 *csfrm _*/ );
+
+sword OCILobCharSetId ( /*_ OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *locp, ub2 *csid _*/ );
+
+sword OCILobCopy ( /*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_locp,
+ ub4 amount, ub4 dst_offset,
+ ub4 src_offset _*/ );
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCILobCreateTemporary(/*_ OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub2 csid,
+ ub1 csfrm,
+ ub1 lobtype,
+ boolean cache,
+ OCIDuration duration _*/);
+#endif /* __STDC__ */
+
+sword OCILobClose( /*_ OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp _*/);
+
+
+sword OCILobDisableBuffering ( /*_ OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp _*/ );
+
+sword OCILobEnableBuffering ( /*_ OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp _*/ );
+
+sword OCILobErase ( /*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *amount, ub4 offset _*/ );
+
+sword OCILobFileClose ( /*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *filep _*/ );
+
+sword OCILobFileCloseAll (/*_ OCISvcCtx *svchp, OCIError *errhp _*/);
+
+sword OCILobFileExists (/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *filep,
+ boolean *flag _*/);
+
+sword OCILobFileGetName ( /*_ OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *filep,
+ OraText *dir_alias, ub2 *d_length,
+ OraText *filename, ub2 *f_length _*/ );
+
+sword OCILobFileIsOpen (/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *filep,
+ boolean *flag _*/);
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCILobFileOpen ( /*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *filep, ub1 mode _*/ );
+#endif /* __STDC__ */
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCILobFileSetName ( /*_ OCIEnv *envhp, OCIError *errhp,
+ OCILobLocator **filepp,
+ CONST OraText *dir_alias, ub2 d_length,
+ CONST OraText *filename, ub2 f_length _*/ );
+#endif /* __STDC__ */
+
+sword OCILobFlushBuffer ( /*_ OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 flag _*/ );
+
+sword OCILobFreeTemporary(/*_ OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp _*/);
+
+
+sword OCILobGetChunkSize(/*_ OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *chunksizep _*/);
+
+sword OCILobGetLength ( /*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *lenp _*/ );
+
+sword OCILobIsEqual ( /*_ OCIEnv *envhp, CONST OCILobLocator *x,
+ CONST OCILobLocator *y, boolean *is_equal _*/ );
+
+sword OCILobIsOpen(/*_ OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ boolean *flag _*/);
+
+sword OCILobIsTemporary(/*_ OCIEnv *envp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ boolean *is_temporary _*/);
+
+sword OCILobLoadFromFile ( /*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_filep,
+ ub4 amount, ub4 dst_offset,
+ ub4 src_offset _*/ );
+
+sword OCILobLocatorAssign ( /*_ OCISvcCtx *svchp, OCIError *errhp,
+ CONST OCILobLocator *src_locp,
+ OCILobLocator **dst_locpp _*/ );
+
+
+sword OCILobLocatorIsInit ( /*_ OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *locp,
+ boolean *is_initialized _*/ );
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCILobOpen(/*_ OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub1 mode _*/);
+#endif /* __STDC__ */
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCILobRead ( /*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *amtp, ub4 offset, dvoid *bufp, ub4 bufl,
+ dvoid *ctxp,
+ sb4 (*cbfp)( dvoid *ctxp,
+ CONST dvoid *bufp,
+ ub4 len,
+ ub1 piece),
+ ub2 csid, ub1 csfrm _*/ );
+#endif /* __STDC__ */
+
+sword OCILobTrim ( /*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 newlen _*/ );
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCILobWrite ( /*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *amtp, ub4 offset, dvoid *bufp, ub4 buflen,
+ ub1 piece, dvoid *ctxp,
+ sb4 (*cbfp)(dvoid *ctxp,
+ dvoid *bufp,
+ ub4 *len,
+ ub1 *piece),
+ ub2 csid, ub1 csfrm _*/ );
+#endif /* __STDC__ */
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCILobWriteAppend(/*_
+OCISvcCtx *svchp,
+OCIError *errhp,
+OCILobLocator *lobp,
+ub4 *amtp,
+dvoid *bufp,
+ub4 bufl,
+ub1 piece,
+dvoid *ctxp,
+sb4 (*cbfp)(dvoid *ctxp,
+ dvoid *bufp,
+ ub4 *len,
+ ub1 *piece),
+ub2 csid,
+ub1 csfrm _*/);
+#endif /* __STDC__ */
+
+sword OCIBreak ( /*_ dvoid *hndlp, OCIError *errhp _*/ );
+
+sword OCIReset ( /*_ dvoid *hndlp, OCIError *errhp _*/ );
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCIServerVersion ( /*_ dvoid *hndlp, OCIError *errhp, OraText *bufp,
+ ub4 bufsz, ub1 hndltype _*/ );
+
+sword OCIServerRelease ( /*_ dvoid *hndlp, OCIError *errhp, OraText *bufp,
+ ub4 bufsz, ub1 hndltype, ub4 *version _*/ );
+
+#endif /* __STDC__ */
+
+sword OCIAttrGet ( /*_ CONST dvoid *trgthndlp, ub4 trghndltyp,
+ dvoid *attributep, ub4 *sizep, ub4 attrtype,
+ OCIError *errhp _*/ );
+
+sword OCIAttrSet ( /*_ dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep,
+ ub4 size, ub4 attrtype, OCIError *errhp _*/ );
+
+sword OCISvcCtxToLda ( /*_ OCISvcCtx *svchp, OCIError *errhp,
+ Lda_Def *ldap _*/ );
+
+sword OCILdaToSvcCtx ( /*_ OCISvcCtx **svchpp, OCIError *errhp,
+ Lda_Def *ldap _*/ );
+
+sword OCIResultSetToStmt ( /*_ OCIResult *rsetdp, OCIError *errhp _*/ );
+
+
+sword OCIUserCallbackRegister(/*_ dvoid *hndlp, ub4 type, dvoid *ehndlp,
+ OCIUserCallback callback, dvoid *ctxp,
+ ub4 fcode, ub4 when, OCIUcb *ucbDesc _*/);
+
+sword OCIUserCallbackGet(/*_ dvoid *hndlp, ub4 type, dvoid *ehndlp,
+ ub4 fcode, ub4 when, OCIUserCallback *callbackp,
+ dvoid **ctxpp, OCIUcb *ucbDesc _*/);
+
+sword OCISharedLibInit(/*_ dvoid *metaCtx, dvoid *libCtx, ub4 argfmt,
+ sword argc, dvoid *argv[],
+ OCIEnvCallbackType envCallback _*/);
+
+sword OCISecurityInitialize (/*_ OCISecurity *osshandle,
+ OCIError *error_handle _*/);
+
+sword OCISecurityTerminate (/*_ OCISecurity *osshandle,
+ OCIError *error_handle _*/);
+
+sword OCISecurityOpenWallet(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ size_t wrllen,
+ OraText *wallet_resource_locator,
+ size_t pwdlen,
+ OraText *password,
+ nzttWallet *wallet _*/);
+
+sword OCISecurityCloseWallet(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttWallet *wallet _*/);
+
+sword OCISecurityCreateWallet(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ size_t wrllen,
+ OraText *wallet_resource_locator,
+ size_t pwdlen,
+ OraText *password,
+ nzttWallet *wallet _*/);
+
+sword OCISecurityDestroyWallet(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ size_t wrllen,
+ OraText *wallet_resource_locator,
+ size_t pwdlen,
+ OraText *password _*/);
+
+sword OCISecurityStorePersona(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona **persona,
+ nzttWallet *wallet _*/);
+
+sword OCISecurityOpenPersona(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona _*/);
+
+sword OCISecurityClosePersona(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona _*/);
+
+sword OCISecurityRemovePersona(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona **persona _*/);
+
+sword OCISecurityCreatePersona(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentType identity_type,
+ nzttCipherType cipher_type,
+ nzttPersonaDesc *desc,
+ nzttPersona **persona _*/);
+
+sword OCISecuritySetProtection(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttcef crypto_engine_function,
+ nztttdufmt data_unit_format,
+ nzttProtInfo *protection_info _*/);
+
+sword OCISecurityGetProtection(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttcef crypto_engine_function,
+ nztttdufmt * data_unit_format_ptr,
+ nzttProtInfo *protection_info _*/);
+
+sword OCISecurityRemoveIdentity(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentity **identity_ptr _*/);
+
+sword OCISecurityCreateIdentity(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentType type,
+ nzttIdentityDesc *desc,
+ nzttIdentity **identity_ptr _*/);
+
+sword OCISecurityAbortIdentity(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentity **identity_ptr _*/);
+
+sword OCISecurityFreeIdentity(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentity **identity_ptr _*/);
+
+sword OCISecurityStoreTrustedIdentity(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentity **identity_ptr,
+ nzttPersona *persona _*/);
+
+sword OCISecuritySign(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces signature_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *buffer_block _*/);
+
+sword OCISecuritySignExpansion(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t inputlen,
+ size_t *signature_length _*/);
+
+sword OCISecurityVerify(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces signature_state,
+ size_t siglen,
+ ub1 *signature,
+ nzttBufferBlock *extracted_message,
+ boolean *verified,
+ boolean *validated,
+ nzttIdentity **signing_party_identity _*/);
+
+sword OCISecurityValidate(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttIdentity *identity,
+ boolean *validated _*/);
+
+sword OCISecuritySignDetached(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces signature_state,
+ size_t input_length,
+ ub1 * input,
+ nzttBufferBlock *signature _*/);
+
+sword OCISecuritySignDetExpansion(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t input_length,
+ size_t *required_buffer_length _*/);
+
+sword OCISecurityVerifyDetached(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces signature_state,
+ size_t data_length,
+ ub1 *data,
+ size_t siglen,
+ ub1 *signature,
+ boolean *verified,
+ boolean *validated,
+ nzttIdentity **signing_party_identity _*/);
+
+sword OCISecurity_PKEncrypt(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t number_of_recipients,
+ nzttIdentity *recipient_list,
+ nzttces encryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *encrypted_data _*/);
+
+sword OCISecurityPKEncryptExpansion(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t number_recipients,
+ size_t input_length,
+ size_t *buffer_length_required _*/);
+
+sword OCISecurityPKDecrypt(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces encryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *encrypted_data _*/);
+
+sword OCISecurityEncrypt(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces encryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *encrypted_data _*/);
+
+sword OCISecurityEncryptExpansion(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t input_length,
+ size_t *encrypted_data_length _*/);
+
+sword OCISecurityDecrypt(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces decryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *decrypted_data _*/);
+
+sword OCISecurityEnvelope(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t number_of_recipients,
+ nzttIdentity *identity,
+ nzttces encryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *enveloped_data _*/);
+
+sword OCISecurityDeEnvelope(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces decryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *output_message,
+ boolean *verified,
+ boolean *validated,
+ nzttIdentity **sender_identity _*/);
+
+sword OCISecurityKeyedHash(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces hash_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *keyed_hash _*/);
+
+sword OCISecurityKeyedHashExpansion(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t input_length,
+ size_t *required_buffer_length _*/);
+
+sword OCISecurityHash(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces hash_state,
+ size_t input,
+ ub1 *input_length,
+ nzttBufferBlock *hash _*/);
+
+sword OCISecurityHashExpansion(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t input_length,
+ size_t *required_buffer_length _*/);
+
+sword OCISecuritySeedRandom(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t seed_length,
+ ub1 *seed _*/);
+
+sword OCISecurityRandomBytes(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t number_of_bytes_desired,
+ nzttBufferBlock *random_bytes _*/);
+
+sword OCISecurityRandomNumber(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ uword *random_number_ptr _*/);
+
+sword OCISecurityInitBlock(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttBufferBlock *buffer_block _*/);
+
+sword OCISecurityReuseBlock(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttBufferBlock *buffer_block _*/);
+
+sword OCISecurityPurgeBlock(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttBufferBlock *buffer_block _*/);
+
+sword OCISecuritySetBlock(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ uword flags_to_set,
+ size_t buffer_length,
+ size_t used_buffer_length,
+ ub1 *buffer,
+ nzttBufferBlock *buffer_block _*/);
+
+sword OCISecurityGetIdentity(/*_ OCISecurity *osshandle,
+ OCIError *error_handle,
+ size_t namelen,
+ OraText *distinguished_name,
+ nzttIdentity **identity _*/);
+
+sword OCIAQEnq(/*_ OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+ OCIAQEnqOptions *enqopt, OCIAQMsgProperties *msgprop,
+ OCIType *payload_tdo,dvoid **payload, dvoid **payload_ind,
+ OCIRaw **msgid, ub4 flags _*/);
+
+sword OCIAQDeq(/*_ OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+ OCIAQDeqOptions *deqopt, OCIAQMsgProperties *msgprop,
+ OCIType *payload_tdo,dvoid **payload, dvoid **payload_ind,
+ OCIRaw **msgid, ub4 flags _*/);
+
+sword OCIAQListen(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCIAQAgent **agent_list, ub4 num_agents,
+ sb4 wait, OCIAQAgent **agent,
+ ub4 flags _*/);
+
+sword OCIExtractInit(/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIExtractTerm(/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIExtractReset(/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIExtractSetNumKeys(/*_ dvoid *hndl, OCIError *err, uword numkeys _*/);
+
+sword OCIExtractSetKey(/*_ dvoid *hndl, OCIError *err, CONST OraText *name,
+ ub1 type, ub4 flag, CONST dvoid *defval,
+ CONST sb4 *intrange,
+ CONST OraText *CONST *strlist _*/);
+
+sword OCIExtractFromFile(/*_ dvoid *hndl, OCIError *err, ub4 flag,
+ OraText *filename _*/);
+
+sword OCIExtractFromStr(/*_ dvoid *hndl, OCIError *err, ub4 flag,
+ OraText *input _*/);
+
+sword OCIExtractToInt(/*_ dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, sb4 *retval _*/);
+
+sword OCIExtractToBool(/*_ dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, ub1 *retval _*/);
+
+sword OCIExtractToStr(/*_ dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, OraText *retval, uword buflen _*/);
+
+sword OCIExtractToOCINum(/*_ dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, OCINumber *retval _*/);
+
+sword OCIExtractToList(/*_ dvoid *hndl, OCIError *err, uword *numkeys _*/);
+
+sword OCIExtractFromList(/*_ dvoid *hndl, OCIError *err, uword index,
+ OraText **name, ub1 *type, uword *numvals,
+ dvoid ***values _*/);
+
+/* Memory Related Service Interfaces */
+
+sword OCIMemoryAlloc(/*_ dvoid *hdl, OCIError *err, dvoid **mem,
+ OCIDuration dur, ub4 size, ub4 flags _*/);
+
+sword OCIMemoryResize(/*_ dvoid *hdl, OCIError *err, dvoid **mem,
+ ub4 newsize, ub4 flags _*/);
+
+sword OCIMemoryFree(/*_ dvoid *hdl, OCIError *err, dvoid *mem _*/);
+
+sword OCIContextSetValue(/*_ dvoid *hdl, OCIError *err, OCIDuration duration,
+ ub1 *key, ub1 keylen, dvoid *ctx_value _*/);
+
+sword OCIContextGetValue(/*_ dvoid *hdl, OCIError *err, ub1 *key,
+ ub1 keylen, dvoid **ctx_value _*/);
+
+sword OCIContextClearValue(/*_ dvoid *hdl, OCIError *err, ub1 *key,
+ ub1 keylen _*/);
+
+sword OCIContextGenerateKey(/*_ dvoid *hdl, OCIError *err, ub4 *key _*/);
+
+sword OCIMemorySetCurrentIDs(/*_ dvoid *hdl, OCIError *err,
+ ub4 curr_session_id, ub4 curr_trans_id, ub4 curr_stmt_id _*/);
+
+sword OCIPicklerTdsCtxInit(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerTdsCtx **tdsc _*/);
+
+sword OCIPicklerTdsCtxFree(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerTdsCtx *tdsc _*/);
+
+sword OCIPicklerTdsInit(/*_ OCIEnv *env, OCIError *err, OCIPicklerTdsCtx *tdsc,
+ OCIPicklerTds **tdsh _*/);
+
+sword OCIPicklerTdsFree(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh _*/);
+
+sword OCIPicklerTdsCreateElementNumber(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, ub1 prec,
+ sb1 scale,
+ OCIPicklerTdsElement *elt _*/);
+
+sword OCIPicklerTdsCreateElementChar(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, ub2 len,
+ OCIPicklerTdsElement *elt _*/);
+
+sword OCIPicklerTdsCreateElementVarchar(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, ub2 len,
+ OCIPicklerTdsElement *elt _*/);
+
+sword OCIPicklerTdsCreateElementRaw(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, ub2 len,
+ OCIPicklerTdsElement *elt _*/);
+
+sword OCIPicklerTdsCreateElement(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, OCITypeCode dty,
+ OCIPicklerTdsElement *elt _*/);
+
+sword OCIPicklerTdsAddAttr(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh,
+ OCIPicklerTdsElement elt _*/);
+
+sword OCIPicklerTdsGenerate(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh _*/);
+
+sword OCIPicklerTdsGetAttr(/*_ OCIEnv *env, OCIError *err,
+ CONST OCIPicklerTds *tdsh, ub1 attrno,
+ OCITypeCode *typ, ub2 *len _*/);
+
+sword OCIPicklerFdoInit(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerFdo **fdoh _*/);
+
+sword OCIPicklerFdoFree(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerFdo *fdoh _*/);
+
+sword OCIPicklerImageInit(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerFdo *fdoh, OCIPicklerTds *tdsh,
+ OCIPicklerImage **imgh _*/);
+
+sword OCIPicklerImageFree(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh _*/);
+
+sword OCIPicklerImageAddScalar(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, dvoid *scalar,
+ ub4 len _*/);
+
+sword OCIPicklerImageAddNullScalar(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh _*/);
+
+sword OCIPicklerImageGenerate(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh _*/);
+
+sword OCIPicklerImageGetScalarSize(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh,
+ ub4 attrno, ub4 *size _*/);
+
+sword OCIPicklerImageGetScalar(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, ub4 attrno,
+ dvoid *buf, ub4 *len, OCIInd *ind _*/);
+
+sword OCIPicklerImageCollBegin(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, CONST OCIPicklerTds *colltdsh _*/);
+
+sword OCIPicklerImageCollAddScalar(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, dvoid *scalar,
+ ub4 buflen, OCIInd ind _*/);
+
+sword OCIPicklerImageCollEnd(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh _*/);
+
+/* should take svcctx for locator stuff */
+sword OCIPicklerImageCollBeginScan(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, CONST OCIPicklerTds *coll_tdsh,
+ ub4 attrnum, ub4 startidx, OCIInd *ind _*/);
+
+sword OCIPicklerImageCollGetScalarSize(/*_ OCIEnv *env, OCIError *err,
+ CONST OCIPicklerTds *coll_tdsh, ub4 *size _*/);
+
+sword OCIPicklerImageCollGetScalar(/*_ OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, dvoid *buf,
+ ub4 *buflen, OCIInd *ind _*/);
+
+sword OCIAnyDataGetType(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode *tc, OCIType **type _*/);
+
+sword OCIAnyDataIsNull(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ boolean *isnull _*/);
+
+sword OCIAnyDataConvert(/*_ OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+ OCIType *type, OCIDuration dur, dvoid *ind, dvoid *data_val,
+ ub4 len, OCIAnyData **sdata _*/);
+
+sword OCIAnyDataBeginCreate(/*_ OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+ OCIType *type, OCIDuration dur, OCIAnyData **sdata _*/);
+
+sword OCIAnyDataDestroy(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata _*/);
+
+sword OCIAnyDataAttrSet(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+ ub4 length, boolean is_any _*/);
+
+sword OCIAnyDataCollAddElem(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyData *sdata, OCITypeCode tc, OCIType *type, dvoid *ind,
+ dvoid *attr_val, ub4 length, boolean is_any, boolean last_elem _*/);
+
+sword OCIAnyDataEndCreate(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata _*/);
+
+sword OCIAnyDataAccess(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode tc, OCIType *type, dvoid *ind, dvoid **attr_val,
+ ub4 *length _*/);
+
+sword OCIAnyDataGetCurrAttrNum(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyData *sdata, ub4 *attrnum _*/);
+
+sword OCIAnyDataAttrGet(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode tc, OCIType *type, dvoid *ind, dvoid **attr_val,
+ ub4 *length, boolean is_any _*/);
+
+sword OCIAnyDataCollGetElem(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode tc, OCIType *type, dvoid *ind, dvoid **celem_val,
+ ub4 *length, boolean is_any _*/);
+
+sword OCIFormatInit(/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIFormatString(/*_ dvoid *hndl, OCIError *err, OraText *buffer,
+ sbig_ora bufferLength, sbig_ora *returnLength,
+ CONST OraText *formatString, ... _*/);
+
+sword OCIFormatTerm(/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIFormatTUb1(/*_ void _*/);
+sword OCIFormatTUb2(/*_ void _*/);
+sword OCIFormatTUb4(/*_ void _*/);
+sword OCIFormatTUword(/*_ void _*/);
+sword OCIFormatTUbig_ora(/*_ void _*/);
+sword OCIFormatTSb1(/*_ void _*/);
+sword OCIFormatTSb2(/*_ void _*/);
+sword OCIFormatTSb4(/*_ void _*/);
+sword OCIFormatTSword(/*_ void _*/);
+sword OCIFormatTSbig_ora(/*_ void _*/);
+sword OCIFormatTEb1(/*_ void _*/);
+sword OCIFormatTEb2(/*_ void _*/);
+sword OCIFormatTEb4(/*_ void _*/);
+sword OCIFormatTEword(/*_ void _*/);
+sword OCIFormatTChar(/*_ void _*/);
+sword OCIFormatTText(/*_ void _*/);
+sword OCIFormatTDouble(/*_ void _*/);
+sword OCIFormatTDvoid(/*_ void _*/);
+sword OCIFormatTEnd(/*_ void _*/);
+
+sword OCIFileClose (/*_ dvoid *hndl, OCIError *err, OCIFileObject *filep _*/);
+
+
+sword OCIFileExists (/*_ dvoid *hndl, OCIError *err, OraText *filename,
+ OraText *path, ub1 *flag _*/ );
+
+sword OCIFileFlush(/*_ dvoid *hndl, OCIError *err, OCIFileObject *filep _*/ );
+
+sword OCIFileGetLength(/*_ dvoid *hndl, OCIError *err, OraText *filename,
+ OraText *path, ubig_ora *lenp _*/ );
+
+sword OCIFileInit (/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIFileOpen (/*_ dvoid *hndl, OCIError *err, OCIFileObject **filep,
+ OraText *filename, OraText *path, ub4 mode, ub4 create,
+ ub4 type _*/);
+
+sword OCIFileRead (/*_ dvoid *hndl, OCIError *err, OCIFileObject *filep,
+ dvoid *bufp, ub4 bufl, ub4 *bytesread _*/);
+
+sword OCIFileSeek (/*_ dvoid *hndl, OCIError *err, OCIFileObject *filep,
+ uword origin, ubig_ora offset, sb1 dir _*/);
+
+sword OCIFileTerm (/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIFileWrite (/*_ dvoid *hndl, OCIError *err, OCIFileObject *filep,
+ dvoid *bufp, ub4 buflen, ub4 *byteswritten _*/);
+
+
+/*-------------------------- Extensions to XA interface ---------------------*/
+/* ------------------------- xaosvch ----------------------------------------*/
+/*
+ NAME
+ xaosvch - XA Oracle get SerViCe Handle
+ DESCRIPTION
+ Given a database name return the service handle that is used by the
+ XA library
+ NOTE
+ This macro has been provided for backward compatibilty with 8.0.2
+*/
+OCISvcCtx *xaosvch(/*_ OraText *dbname _*/);
+
+/* ------------------------- xaoSvcCtx --------------------------------------*/
+/*
+ NAME
+ xaoSvcCtx - XA Oracle get SerViCe ConTeXt
+ DESCRIPTION
+ Given a database name return the service handle that is used by the
+ XA library
+ NOTE
+ This routine has been provided for APs to get access to the service
+ handle that XA library uses. Without this routine APs must use SQLLIB
+ routine sqlld2 to get access to the Logon data area registered by the
+ XA library
+*/
+OCISvcCtx *xaoSvcCtx(/*_ OraText *dbname _*/);
+
+/* ------------------------- xaoEnv -----------------------------------------*/
+/*
+ NAME
+ xaoEnv - XA Oracle get ENvironment Handle
+ DESCRIPTION
+ Given a database name return the environment handle that is used by the
+ XA library
+ NOTE
+ This routine has been provided for APs to get access to the environment
+ handle that XA library uses. Without this routine APs must use SQLLIB
+ routine sqlld2 to get access to the Logon data area registered by the
+ XA library
+*/
+OCIEnv *xaoEnv(/*_ OraText *dbname _*/);
+
+/* ------------------------- xaosterr ---------------------------------------*/
+/*
+ NAME
+ xaosterr - XA Oracle get xa STart ERRor code
+ DESCRIPTION
+ Given an oracle error code return the XA error code
+ */
+int xaosterr(/*_ OCISvcCtx *svch, sb4 error _*/);
+/*-------------------------- End Extensions ---------------------------------*/
+
+/*---------------------- Extensions to NLS cartridge service ----------------*/
+/* ----------------------- OCINlsGetInfo ------------------------------------*/
+/*
+ NAME
+ OCINlsGetInfo - Get NLS info from OCI environment handle
+ REMARKS
+ This function generates language information specified by item from OCI
+ environment handle envhp into an array pointed to by buf within size
+ limitation as buflen.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+ envhp(IN/OUT)
+ OCI environment handle.
+ errhp(IN/OUT)
+ The OCI error handle. If there is an error, it is record in errhp and
+ this function returns a NULL pointer. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ buf(OUT)
+ Pointer to the destination buffer.
+ buflen(IN)
+ The size of destination buffer. The maximum length for each information
+ is 32 bytes.
+ item(IN)
+ It specifies to get which item in OCI environment handle and can be one
+ of following values:
+ OCI_NLS_DAYNAME1 : Native name for Monday.
+ OCI_NLS_DAYNAME2 : Native name for Tuesday.
+ OCI_NLS_DAYNAME3 : Native name for Wednesday.
+ OCI_NLS_DAYNAME4 : Native name for Thursday.
+ OCI_NLS_DAYNAME5 : Native name for Friday.
+ OCI_NLS_DAYNAME6 : Native name for for Saturday.
+ OCI_NLS_DAYNAME7 : Native name for for Sunday.
+ OCI_NLS_ABDAYNAME1 : Native abbreviated name for Monday.
+ OCI_NLS_ABDAYNAME2 : Native abbreviated name for Tuesday.
+ OCI_NLS_ABDAYNAME3 : Native abbreviated name for Wednesday.
+ OCI_NLS_ABDAYNAME4 : Native abbreviated name for Thursday.
+ OCI_NLS_ABDAYNAME5 : Native abbreviated name for Friday.
+ OCI_NLS_ABDAYNAME6 : Native abbreviated name for for Saturday.
+ OCI_NLS_ABDAYNAME7 : Native abbreviated name for for Sunday.
+ OCI_NLS_MONTHNAME1 : Native name for January.
+ OCI_NLS_MONTHNAME2 : Native name for February.
+ OCI_NLS_MONTHNAME3 : Native name for March.
+ OCI_NLS_MONTHNAME4 : Native name for April.
+ OCI_NLS_MONTHNAME5 : Native name for May.
+ OCI_NLS_MONTHNAME6 : Native name for June.
+ OCI_NLS_MONTHNAME7 : Native name for July.
+ OCI_NLS_MONTHNAME8 : Native name for August.
+ OCI_NLS_MONTHNAME9 : Native name for September.
+ OCI_NLS_MONTHNAME10 : Native name for October.
+ OCI_NLS_MONTHNAME11 : Native name for November.
+ OCI_NLS_MONTHNAME12 : Native name for December.
+ OCI_NLS_ABMONTHNAME1 : Native abbreviated name for January.
+ OCI_NLS_ABMONTHNAME2 : Native abbreviated name for February.
+ OCI_NLS_ABMONTHNAME3 : Native abbreviated name for March.
+ OCI_NLS_ABMONTHNAME4 : Native abbreviated name for April.
+ OCI_NLS_ABMONTHNAME5 : Native abbreviated name for May.
+ OCI_NLS_ABMONTHNAME6 : Native abbreviated name for June.
+ OCI_NLS_ABMONTHNAME7 : Native abbreviated name for July.
+ OCI_NLS_ABMONTHNAME8 : Native abbreviated name for August.
+ OCI_NLS_ABMONTHNAME9 : Native abbreviated name for September.
+ OCI_NLS_ABMONTHNAME10 : Native abbreviated name for October.
+ OCI_NLS_ABMONTHNAME11 : Native abbreviated name for November.
+ OCI_NLS_ABMONTHNAME12 : Native abbreviated name for December.
+ OCI_NLS_YES : Native string for affirmative response.
+ OCI_NLS_NO : Native negative response.
+ OCI_NLS_AM : Native equivalent string of AM.
+ OCI_NLS_PM : Native equivalent string of PM.
+ OCI_NLS_AD : Native equivalent string of AD.
+ OCI_NLS_BC : Native equivalent string of BC.
+ OCI_NLS_DECIMAL : decimal character.
+ OCI_NLS_GROUP : group separator.
+ OCI_NLS_DEBIT : Native symbol of debit.
+ OCI_NLS_CREDIT : Native sumbol of credit.
+ OCI_NLS_DATEFORMAT : Oracle date format.
+ OCI_NLS_INT_CURRENCY: International currency symbol.
+ OCI_NLS_LOC_CURRENCY : Locale currency symbol.
+ OCI_NLS_LANGUAGE : Language name.
+ OCI_NLS_ABLANGUAGE : Abbreviation for language name.
+ OCI_NLS_TERRITORY : Territory name.
+ OCI_NLS_CHARACTER_SET : Character set name.
+ OCI_NLS_LINGUISTIC : Linguistic name.
+ OCI_NLS_CALENDAR : Calendar name.
+ OCI_NLS_DUAL_CURRENCY : Dual currency symbol.
+*/
+sword OCINlsGetInfo(/*_ dvoid *envhp, OCIError *errhp, OraText *buf,
+ size_t buflen, ub2 item _*/);
+
+/* ----------------------- OCINlsNumericInfoGet ----------------------------*/
+/*
+ NAME
+ OCINlsNumericInfoGet - Get NLS numeric info from OCI environment handle
+ REMARKS
+ This function generates numeric language information specified by item
+ from OCI environment handle envhp into an output number variable.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+ envhp(IN/OUT)
+ OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+ errhp(IN/OUT)
+ The OCI error handle. If there is an error, it is record in errhp and
+ this function returns a NULL pointer. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ val(OUT)
+ Pointer to the output number variable. On OCI_SUCCESS return, it will
+ contain the requested NLS numeric info.
+ item(IN)
+ It specifies to get which item in OCI environment handle and can be one
+ of following values:
+ OCI_NLS_CHARSET_MAXBYTESZ : Maximum character byte size for OCI
+ environment or session handle charset
+ OCI_NLS_CHARSET_FIXEDWIDTH: Character byte size for fixed-width charset;
+ 0 for variable-width charset
+*/
+sword OCINlsNumericInfoGet(/*_ dvoid *envhp, OCIError *errhp, sb4 *val,
+ ub2 item _*/);
+
+/* ----------------------- OCINlsCharSetNameToId -----------------------------*/
+/*
+ NAME
+ OCINlsCharSetNameToId - Get Oracle charset id given Oracle charset name
+ REMARKS
+ This function will get the Oracle character set id corresponding to
+ the given Oracle character set name.
+ RETURNS
+ Oracle character set id for the given Oracle character set name if
+ character set name and OCI handle are valid; otherwise returns 0.
+ envhp(IN/OUT)
+ OCI environment handle.
+ name(IN)
+ Pointer to a null-terminated Oracle character set name whose id
+ will be returned.
+*/
+ub2 OCINlsCharSetNameToId(/*_ dvoid *envhp, const oratext *name _*/);
+
+/* ----------------------- OCINlsCharSetIdToName -----------------------------*/
+/*
+ NAME
+ OCINlsCharSetIdToName - Get Oracle charset name given Oracle charset id
+ REMARKS
+ This function will get the Oracle character set name corresponding to
+ the given Oracle character set id.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+ buf(OUT)
+ Pointer to the destination buffer. On OCI_SUCCESS return, it will contain
+ the null-terminated string for character set name.
+ buflen(IN)
+ Size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ for
+ guarantee to store an Oracle character set name. If it's smaller than
+ the length of the character set name, the function will return OCI_ERROR.
+ id(IN)
+ Oracle character set id.
+*/
+sword OCINlsCharSetIdToName(/*_ dvoid *envhp, oratext *buf, size_t buflen,
+ ub2 id _*/);
+
+/* ----------------------- OCINlsNameMap ------------------------------------*/
+/*
+ NAME
+ OCINlsNameMap - Map NLS naming from Oracle to other standards and vice
+ versa
+ REMARKS
+ This function will map NLS naming from Oracle to other standards (such
+ as ISO, IANA) and vice versa.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+ buf(OUT)
+ Pointer to the destination buffer. On OCI_SUCCESS return, it will
+ contain null-terminated string for requested mapped name.
+ buflen(IN)
+ The size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ
+ for guarantee to store an NLS name. If it is smaller than the length
+ of the name, the function will return OCI_ERROR.
+ srcbuf(IN)
+ Pointer to null-terminated NLS name. If it is not a valid name in its
+ define scope, the function will return OCI_ERROR.
+ flag(IN)
+ It specifies name mapping direction and can take the following values:
+ OCI_NLS_CS_IANA_TO_ORA : Map character set name from IANA to Oracle
+ OCI_NLS_CS_ORA_TO_IANA : Map character set name from Oracle to IANA
+ OCI_NLS_LANG_ISO_TO_ORA : Map language name from ISO to Oracle
+ OCI_NLS_LANG_ORA_TO_ISO : Map language name from Oracle to ISO
+ OCI_NLS_TERR_ISO_TO_ORA : Map territory name from ISO to Oracle
+ OCI_NLS_TERR_ORA_TO_ISO : Map territory name from Oracle to ISO
+ OCI_NLS_TERR_ISO3_TO_ORA : Map territory name from 3-letter ISO
+ abbreviation to Oracle
+ OCI_NLS_TERR_ORA_TO_ISO3 : Map territory name from Oracle to 3-letter
+ ISO abbreviation
+*/
+sword OCINlsNameMap(/*_ dvoid *envhp, oratext *buf, size_t buflen,
+ const oratext *srcbuf, ub4 flag _*/);
+
+/* -------------------- OCIMultiByteToWideChar ------------------------------*/
+/*
+ NAME
+ OCIMultiByteToWideChar - Convert a null terminated multibyte string into
+ wchar
+ REMARKS
+ This routine converts an entire null-terminated string into the wchar
+ format. The wchar output buffer will be null-terminated.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set of string.
+ dst (OUT)
+ Destination buffer for wchar.
+ src (IN)
+ Source string to be converted.
+ rsize (OUT)
+ Number of characters converted including null-terminator.
+ If it is a NULL pointer, no number return
+*/
+sword OCIMultiByteToWideChar(/*_ dvoid *envhp, OCIWchar *dst,
+ CONST OraText *src, size_t *rsize _*/);
+
+
+/* --------------------- OCIMultiByteInSizeToWideChar -----------------------*/
+/*
+ NAME
+ OCIMultiByteInSizeToWideChar - Convert a mulitbyte string in length into
+ wchar
+ REMARKS
+ This routine converts part of string into the wchar format. It will
+ convert as many complete characters as it can until it reaches output
+ buffer size or input buffer size or it reaches a null-terminator in
+ source string. The output buffer will be null-terminated if space permits.
+ If dstsz is zero, this function will only return number of characters not
+ including ending null terminator for converted string.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set of string.
+ dst (OUT)
+ Pointer to a destination buffer for wchar. It can be NULL pointer when
+ dstsz is zero.
+ dstsz(IN)
+ Destination buffer size in character. If it is zero, this function just
+ returns number of characters will be need for the conversion.
+ src (IN)
+ Source string to be converted.
+ srcsz(IN)
+ Length of source string in byte.
+ rsize(OUT)
+ Number of characters written into destination buffer, or number of
+ characters for converted string is dstsz is zero.
+ If it is NULL pointer, nothing to return.
+*/
+sword OCIMultiByteInSizeToWideChar(/*_ dvoid *envhp, OCIWchar *dst,
+ size_t dstsz, CONST OraText *src,
+ size_t srcsz, size_t *rsize _*/);
+
+
+/* ---------------------- OCIWideCharToMultiByte ----------------------------*/
+/*
+ NAME
+ OCIWideCharToMultiByte - Convert a null terminated wchar string into
+ multibyte
+ REMARKS
+ This routine converts an entire null-terminated wide character string into
+ multi-byte string. The output buffer will be null-terminated.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set of string.
+ dst (OUT)
+ Destination buffer for multi-byte string.
+ src (IN)
+ Source wchar string to be converted.
+ rsize (OUT)
+ Number of bytes written into the destination buffer.
+ If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharToMultiByte(/*_ dvoid *envhp, OraText *dst,
+ CONST OCIWchar *src, size_t *rsize _*/);
+
+
+/* ---------------------- OCIWideCharInSizeToMultiByte ----------------------*/
+/*
+ NAME
+ OCIWideCharInSizeToMultiByte - Convert a wchar string in length into
+ mulitbyte
+ REMARKS
+ This routine converts part of wchar string into the multi-byte format.
+ It will convert as many complete characters as it can until it reaches
+ output buffer size or input buffer size or it reaches a null-terminator
+ in source string. The output buffer will be null-terminated if space
+ permits. If dstsz is zero, the function just returns the size of byte not
+ including ending null-terminator need to store the converted string.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set of string.
+ dst (OUT)
+ Destination buffer for multi-byte. It can be NULL pointer if dstsz is zero.
+ dstsz(IN)
+ Destination buffer size in byte. If it is zero, it just returns the size
+ of bytes need for converted string.
+ src (IN)
+ Source wchar string to be converted.
+ srcsz(IN)
+ Length of source string in character.
+ rsize(OUT)
+ Number of bytes written into destination buffer, or number of bytes need
+ to store the converted string if dstsz is zero.
+ If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharInSizeToMultiByte(/*_ dvoid *envhp, OraText *dst,
+ size_t dstsz, CONST OCIWchar *src,
+ size_t srcsz, size_t *rsize _*/);
+
+
+
+/* ----------------------- OCIWideCharIsAlnum -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsAlnum - test whether wc is a letter or decimal digit
+ REMARKS
+ It tests whether wc is a letter or decimal digit.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsAlnum(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsAlpha -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsAlpha - test whether wc is an alphabetic letter
+ REMARKS
+ It tests whether wc is an alphabetic letter
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsAlpha(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* --------------------- OCIWideCharIsCntrl ---------------------------------*/
+/*
+ NAME
+ OCIWideCharIsCntrl - test whether wc is a control character
+ REMARKS
+ It tests whether wc is a control character.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsCntrl(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsDigit -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsDigit - test whether wc is a decimal digit character
+ REMARKS
+ It tests whether wc is a decimal digit character.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsDigit(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsGraph -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsGraph - test whether wc is a graph character
+ REMARKS
+ It tests whether wc is a graph character. A graph character is character
+ with a visible representation and normally includes alphabetic letter,
+ decimal digit, and punctuation.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsGraph(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsLower -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsLower - test whether wc is a lowercase letter
+ REMARKS
+ It tests whether wc is a lowercase letter.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsLower(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsPrint -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsPrint - test whether wc is a printable character
+ REMARKS
+ It tests whether wc is a printable character.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsPrint(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsPunct -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsPunct - test whether wc is a punctuation character
+ REMARKS
+ It tests whether wc is a punctuation character.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsPunct(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsSpace -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsSpace - test whether wc is a space character
+ REMARKS
+ It tests whether wc is a space character. A space character only causes
+ white space in displayed text(for example, space, tab, carriage return,
+ newline, vertical tab or form feed).
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsSpace(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsUpper -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsUpper - test whether wc is a uppercase letter
+ REMARKS
+ It tests whether wc is a uppercase letter.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsUpper(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/*----------------------- OCIWideCharIsXdigit -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsXdigit - test whether wc is a hexadecimal digit
+ REMARKS
+ It tests whether wc is a hexadecimal digit ( 0-9, A-F, a-f ).
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsXdigit(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* --------------------- OCIWideCharIsSingleByte ----------------------------*/
+/*
+ NAME
+ OCIWideCharIsSingleByte - test whether wc is a single-byte character
+ REMARKS
+ It tests whether wc is a single-byte character when converted into
+ multi-byte.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsSingleByte(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharToLower -------------------------------*/
+/*
+ NAME
+ OCIWideCharToLower - Convert a wchar into the lowercase
+ REMARKS
+ If there is a lower-case character mapping for wc in the specified locale,
+ it will return the lower-case in wchar, else return wc itself.
+ RETURNS
+ A wchar
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for lowercase mapping.
+*/
+OCIWchar OCIWideCharToLower(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharToUpper -------------------------------*/
+/*
+ NAME
+ OCIWideCharToUpper - Convert a wchar into the uppercase
+ REMARKS
+ If there is a upper-case character mapping for wc in the specified locale,
+ it will return the upper-case in wchar, else return wc itself.
+ RETURNS
+ A wchar
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for uppercase mapping.
+*/
+OCIWchar OCIWideCharToUpper(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharStrcmp --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrcmp - compare two null terminated wchar string
+ REMARKS
+ It compares two wchar string in binary ( based on wchar encoding value ),
+ linguistic, or case-insensitive.
+ RETURNS
+ 0, if wstr1 == wstr2.
+ Positive, if wstr1 > wstr2.
+ Negative, if wstr1 < wstr2.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set.
+ wstr1(IN)
+ Pointer to a null-terminated wchar string.
+ wstr2(IN)
+ Pointer to a null-terminated wchar string.
+ flag(IN)
+ It is used to decide the comparison method. It can be taken one of the
+ following values:
+ OCI_NLS_BINARY : for the binary comparison, this is default value.
+ OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+ This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+ comparison.
+*/
+int OCIWideCharStrcmp(/*_ dvoid *envhp, CONST OCIWchar *wstr1,
+ CONST OCIWchar *wstr2, int flag _*/);
+
+
+/* ----------------------- OCIWideCharStrncmp -------------------------------*/
+/*
+ NAME
+ OCIWideCharStrncmp - compare twe wchar string in length
+ REMARKS
+ This function is similar to OCIWideCharStrcmp(), except that at most len1
+ characters from wstr1 and len2 characters from wstr1 are compared. The
+ null-terminator will be taken into the comparison.
+ RETURNS
+ 0, if wstr1 = wstr2
+ Positive, if wstr1 > wstr2
+ Negative, if wstr1 < wstr2
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wstr1(IN)
+ Pointer to the first wchar string
+ len1(IN)
+ The length for the first string for comparison
+ wstr2(IN)
+ Pointer to the second wchar string
+ len2(IN)
+ The length for the second string for comparison.
+ flag(IN)
+ It is used to decide the comparison method. It can be taken one of the
+ following values:
+ OCI_NLS_BINARY : for the binary comparison, this is default value.
+ OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+ This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+ comparison.
+*/
+int OCIWideCharStrncmp(/*_ dvoid *envhp, CONST OCIWchar *wstr1, size_t len1,
+ CONST OCIWchar *wstr2, size_t len2, int flag _*/);
+
+
+/* ----------------------- OCIWideCharStrcat --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrcat - concatenate two wchar strings
+ REMARKS
+ This function appends a copy of the wchar string pointed to by wsrcstr,
+ including the null-terminator to the end of wchar string pointed to by
+ wdststr. It returns the number of character in the result string not
+ including the ending null-terminator.
+ RETURNS
+ number of characters in the result string not including the ending
+ null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wdststr(IN/OUT)
+ Pointer to the destination wchar string for appending.
+ wsrcstr(IN)
+ Pointer to the source wchar string to append.
+*/
+size_t OCIWideCharStrcat(/*_ dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr _*/);
+
+
+/* ----------------------- OCIWideCharStrchr --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrchr - Search the first occurrence of wchar in a wchar string
+ REMARKS
+ This function searchs for the first occurrence of wc in the wchar string
+ pointed to by wstr. It returns a pointer to the whcar if successful, or
+ a null pointer.
+ RETURNS
+ wchar pointer if successful, otherwise a null pointer.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wstr(IN)
+ Pointer to the wchar string to search
+ wc(IN)
+ Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrchr(/*_ dvoid *envhp, CONST OCIWchar *wstr,
+ OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharStrcpy --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrcpy - copy a wchar string
+ REMARKS
+ This function copies the wchar string pointed to by wsrcstr, including the
+ null-terminator, into the array pointed to by wdststr. It returns the
+ number of character copied not including the ending null-terminator.
+ RETURNS
+ number of characters copied not including the ending null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wdststr(OUT)
+ Pointer to the destination wchar buffer.
+ wsrcstr(IN)
+ Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrcpy(/*_ dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr _*/);
+
+
+/* ----------------------- OCIWideCharStrlen --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrlen - Return number of character in a wchar string
+ REMARKS
+ This function computes the number of characters in the wchar string
+ pointed to by wstr, not including the null-terminator, and returns
+ this number.
+ RETURNS
+ number of characters not including ending null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wstr(IN)
+ Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrlen(/*_ dvoid *envhp, CONST OCIWchar *wstr _*/);
+
+
+/* ----------------------- OCIWideCharStrncat -------------------------------*/
+/*
+ NAME
+ OCIWideCharStrncat - Concatenate wchar string in length
+ REMARKS
+ This function is similar to OCIWideCharStrcat(), except that at most n
+ characters from wsrcstr are appended to wdststr. Note that the
+ null-terminator in wsrcstr will stop appending. wdststr will be
+ null-terminated..
+ RETURNS
+ Number of characters in the result string not including the ending
+ null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wdststr(IN/OUT)
+ Pointer to the destination wchar string for appending.
+ wsrcstr(IN)
+ Pointer to the source wchar string to append.
+ n(IN)
+ Number of characters from wsrcstr to append.
+*/
+size_t OCIWideCharStrncat(/*_ dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr, size_t n _*/);
+
+
+/* ----------------------- OCIWideCharStrncpy -------------------------------*/
+/*
+ NAME
+ OCIWideCharStrncpy - Copy wchar string in length
+ REMARKS
+ This function is similar to OCIWideCharStrcpy(), except that at most n
+ characters are copied from the array pointed to by wsrcstr to the array
+ pointed to by wdststr. Note that the null-terminator in wdststr will
+ stop coping and result string will be null-terminated.
+ RETURNS
+ number of characters copied not including the ending null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wdststr(OUT)
+ Pointer to the destination wchar buffer.
+ wsrcstr(IN)
+ Pointer to the source wchar string.
+ n(IN)
+ Number of characters from wsrcstr to copy.
+*/
+size_t OCIWideCharStrncpy(/*_ dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr, size_t n _*/);
+
+
+/* ----------------------- OCIWideCharStrrchr -------------------------------*/
+/*
+ NAME
+ OCIWideCharStrrchr - search the last occurrence of a wchar in wchar string
+ REMARKS
+ This function searchs for the last occurrence of wc in the wchar string
+ pointed to by wstr. It returns a pointer to the whcar if successful, or
+ a null pointer.
+ RETURNS
+ wchar pointer if successful, otherwise a null pointer.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wstr(IN)
+ Pointer to the wchar string to search
+ wc(IN)
+ Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrrchr(/*_ dvoid *envhp, CONST OCIWchar *wstr,
+ OCIWchar wc _*/);
+
+
+/* --------------------- OCIWideCharStrCaseConversion -----------------------*/
+/*
+ NAME
+ OCIWideCharStrCaseConversion - convert a wchar string into lowercase or
+ uppercase
+ REMARKS
+ This function convert the wide char string pointed to by wsrcstr into the
+ uppercase or lowercase specified by flag and copies the result into the
+ array pointed to by wdststr. The result string will be null-terminated.
+ RETURNS
+ number of characters for result string not including null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle.
+ wdststr(OUT)
+ Pointer to destination array.
+ wsrcstr(IN)
+ Pointer to source string.
+ flag(IN)
+ Specify the case to convert:
+ OCI_NLS_UPPERCASE : convert to uppercase.
+ OCI_NLS_LOWERCASE: convert to lowercase.
+ This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the
+ linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIWideCharStrCaseConversion(/*_ dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr, ub4 flag _*/);
+
+
+/*---------------------- OCIWideCharDisplayLength ---------------------------*/
+/*
+ NAME
+ OCIWideCharDisplayLength - Calculate the display length for a wchar
+ REMARKS
+ This function determines the number of column positions required for wc
+ in display. It returns number of column positions, or 0 if wc is
+ null-terminator.
+ RETURNS
+ Number of display positions.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar character.
+*/
+size_t OCIWideCharDisplayLength(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/*---------------------- OCIWideCharMultiByteLength -------------------------*/
+/*
+ NAME
+ OCIWideCharMultiByteLength - Determine byte size in multi-byte encoding
+ REMARKS
+ This function determines the number of byte required for wc in multi-byte
+ encoding. It returns number of bytes in multi-byte for wc.
+ RETURNS
+ Number of bytes.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar character.
+*/
+size_t OCIWideCharMultiByteLength(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIMultiByteStrcmp -------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrcmp - Compare two multi-byte strings
+ REMARKS
+ It compares two multi-byte strings in binary ( based on encoding value ),
+ linguistic, or case-insensitive.
+ RETURNS
+ 0, if str1 == str2.
+ Positive, if str1 > str2.
+ Negative, if str1 < str2.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set.
+ str1(IN)
+ Pointer to a null-terminated string.
+ str2(IN)
+ Pointer to a null-terminated string.
+ flag(IN)
+ It is used to decide the comparison method. It can be taken one of the
+ following values:
+ OCI_NLS_BINARY: for the binary comparison, this is default value.
+ OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+ This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+ comparison.
+*/
+int OCIMultiByteStrcmp(/*_ dvoid *envhp, CONST OraText *str1,
+ CONST OraText *str2, int flag _*/);
+
+
+/*----------------------- OCIMultiByteStrncmp -------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrncmp - compare two strings in length
+ REMARKS
+ This function is similar to OCIMultiBytestrcmp(), except that at most len1 bytes
+ from str1 and len2 bytes from str2 are compared. The null-terminator will
+ be taken into the comparison.
+ RETURNS
+ 0, if str1 = str2
+ Positive, if str1 > str2
+ Negative, if str1 < str2
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set.
+ str1(IN)
+ Pointer to the first string
+ len1(IN)
+ The length for the first string for comparison
+ str2(IN)
+ Pointer to the second string
+ len2(IN)
+ The length for the second string for comparison.
+ flag(IN)
+ It is used to decide the comparison method. It can be taken one of the
+ following values:
+ OCI_NLS_BINARY: for the binary comparison, this is default value.
+ OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+ This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+ comparison.
+*/
+int OCIMultiByteStrncmp(/*_ dvoid *envhp, CONST OraText *str1, size_t len1,
+ OraText *str2, size_t len2, int flag _*/);
+
+
+/*----------------------- OCIMultiByteStrcat --------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrcat - concatenate multibyte strings
+ REMARKS
+ This function appends a copy of the multi-byte string pointed to by
+ srcstr, including the null-terminator to the end of string pointed to by
+ dststr. It returns the number of bytes in the result string not including
+ the ending null-terminator.
+ RETURNS
+ number of bytes in the result string not including the ending
+ null-terminator.
+ envhp(IN/OUT)
+ Pointer to OCI environment handle
+ dststr(IN/OUT)
+ Pointer to the destination multi-byte string for appending.
+ srcstr(IN)
+ Pointer to the source string to append.
+*/
+size_t OCIMultiByteStrcat(/*_ dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr _*/);
+
+
+/*------------------------- OCIMultiByteStrcpy ------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrcpy - copy multibyte string
+ REMARKS
+ This function copies the multi-byte string pointed to by srcstr,
+ including the null-terminator, into the array pointed to by dststr. It
+ returns the number of bytes copied not including the ending
+ null-terminator.
+ RETURNS
+ number of bytes copied not including the ending null-terminator.
+ envhp(IN/OUT)
+ Pointer to the OCI environment handle.
+ srcstr(OUT)
+ Pointer to the destination buffer.
+ dststr(IN)
+ Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrcpy(/*_ dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr _*/);
+
+
+/*----------------------- OCIMultiByteStrlen --------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrlen - Calculate multibyte string length
+ REMARKS
+ This function computes the number of bytes in the multi-byte string
+ pointed to by str, not including the null-terminator, and returns this
+ number.
+ RETURNS
+ number of bytes not including ending null-terminator.
+ str(IN)
+ Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrlen(/*_ dvoid *envhp, CONST OraText *str _*/);
+
+
+/*----------------------- OCIMultiByteStrncat -------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrncat - concatenate string in length
+ REMARKS
+ This function is similar to OCIMultiBytestrcat(), except that at most n
+ bytes from srcstr are appended to dststr. Note that the null-terminator in
+ srcstr will stop appending and the function will append as many character
+ as possible within n bytes. dststr will be null-terminated.
+ RETURNS
+ Number of bytes in the result string not including the ending
+ null-terminator.
+ envhp(IN/OUT)
+ Pointer to OCI environment handle.
+ srcstr(IN/OUT)
+ Pointer to the destination multi-byte string for appending.
+ dststr(IN)
+ Pointer to the source multi-byte string to append.
+ n(IN)
+ Number of bytes from srcstr to append.
+*/
+size_t OCIMultiByteStrncat(/*_ dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr, size_t n _*/);
+
+
+/*----------------------- OCIMultiByteStrncpy -------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrncpy - copy multibyte string in length
+ REMARKS
+ This function is similar to OCIMultiBytestrcpy(), except that at most n
+ bytes are copied from the array pointed to by srcstr to the array pointed
+ to by dststr. Note that the null-terminator in srcstr will stop coping and
+ the function will copy as many character as possible within n bytes. The
+ result string will be null-terminated.
+ RETURNS
+ number of bytes copied not including the ending null-terminator.
+ envhp(IN/OUT)
+ Pointer to a OCI environment handle.
+ dststr(IN)
+ Pointer to the source multi-byte string.
+ srcstr(OUT)
+ Pointer to the destination buffer.
+ n(IN)
+ Number of bytes from srcstr to copy.
+*/
+size_t OCIMultiByteStrncpy(/*_ dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr, size_t n _*/);
+
+
+/*----------------------- OCIMultiByteStrnDisplayLength ---------------------*/
+/*
+ NAME
+ OCIMultiByteStrnDisplayLength - calculate the display length for a
+ multibyt string
+ REMARKS
+ This function returns the number of display positions occupied by the
+ complete characters within the range of n bytes.
+ RETURNS
+ number of display positions.
+ envhp(IN/OUT)
+ OCI environment handle.
+ str(IN)
+ Pointer to a multi-byte string.
+ n(IN)
+ Number of bytes to examine.
+*/
+size_t OCIMultiByteStrnDisplayLength(/*_ dvoid *envhp, CONST OraText *str1,
+ size_t n _*/);
+
+
+/*---------------------- OCIMultiByteStrCaseConversion ---------------------*/
+/*
+ NAME
+ OCIMultiByteStrCaseConversion
+ REMARKS
+ This function convert the multi-byte string pointed to by srcstr into the
+ uppercase or lowercase specified by flag and copies the result into the
+ array pointed to by dststr. The result string will be null-terminated.
+ RETURNS
+ number of bytes for result string not including null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle.
+ dststr(OUT)
+ Pointer to destination array.
+ srcstr(IN)
+ Pointer to source string.
+ flag(IN)
+ Specify the case to convert:
+ OCI_NLS_UPPERCASE: convert to uppercase.
+ OCI_NLS_LOWERCASE: convert to lowercase.
+ This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the
+ linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIMultiByteStrCaseConversion(/*_ dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr, ub4 flag _*/);
+
+
+/*------------------------- OCICharSetToUnicode -----------------------------*/
+/*
+ NAME
+ OCICharSetToUnicode - convert multibyte string into Unicode as UCS2
+ REMARKS
+ This function converts a multi-byte string pointed to by src to Unicode
+ into the array pointed to by dst. The conversion will stop when it reach
+ to the source limitation or destination limitation.
+ The function will return number of characters converted into Unicode.
+ If dstlen is zero, it will just return the number of characters for the
+ result without real conversion.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ Pointer to an OCI environment handle
+ dst(OUT)
+ Pointer to a destination buffer
+ dstlen(IN)
+ Size of destination buffer in character
+ src(IN)
+ Pointer to multi-byte source string.
+ srclen(IN)
+ Size of source string in bytes.
+ rsize(OUT)
+ Number of characters converted.
+ If it is a NULL pointer, nothing to return.
+*/
+sword OCICharSetToUnicode(/*_ dvoid *envhp, ub2 *dst, size_t dstlen,
+ CONST OraText *src, size_t srclen, size_t *rsize _*/);
+
+
+/*------------------------- OCIUnicodeToCharSet -----------------------------*/
+/*
+ NAME
+ OCIUnicodeToCharSet - convert Unicode into multibyte
+ REMARKS
+ This function converts a Unicode string pointed to by src to multi-byte
+ into the array pointed to by dst. The conversion will stop when it reach
+ to the source limitation or destination limitation. The function will
+ return number of bytes converted into multi-byte. If dstlen is zero, it
+ will just return the number of bytes for the result without real
+ conversion. If a Unicode character is not convertible for the character
+ set specified in OCI environment handle, a replacement character will be
+ used for it. In this case, OCICharSetConversionIsReplacementUsed() will
+ return ture.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ Pointer to an OCI environment handle.
+ dst(OUT)
+ Pointer to a destination buffer.
+ dstlen(IN)
+ Size of destination buffer in byte.
+ src(IN)
+ Pointer to a Unicode string.
+ srclen(IN)
+ Size of source string in characters.
+ rsize(OUT)
+ Number of bytes converted.
+ If it is a NULL pointer, nothing to return.
+*/
+sword OCIUnicodeToCharSet(/*_ dvoid *envhp, OraText *dst, size_t dstlen,
+ CONST ub2 *src, size_t srclen, size_t *rsize _*/);
+
+
+/*----------------------- OCINlsCharSetConvert ------------------------------*/
+/*
+ NAME
+ OCINlsCharSetConvert - convert between any two character set.
+ REMARKS
+ This function converts a string pointed to by src in the character set
+ specified with srcid to the array pointed to by dst in the character set
+ specified with dstid. The conversion will stop when it reaches the source
+ limitation or destination limitation. The function will return the number
+ of bytes converted into the destination buffer. Even though either source
+ or destination character set id is OCI_UTF16ID, given and return data
+ length will be represented with the byte length as this function is
+ intended for generic purpose. Note the conversion will not stop at null
+ data.
+ To get character set id from name, OCINlsCharSetNameToId can be used.
+ To check if derived data in the destination buffer contains any
+ replacement character resulting from conversion failure,
+ OCICharSetConversionIsReplacementUsed can be used to get the status.
+ Data alignment should be guaranteed by a caller. For example, UTF-16 data
+ should be aligned to ub2 type.
+
+ RETURNS
+ OCI_SUCCESS or OCI_ERROR.
+ errhp(IN/OUT)
+ OCI error handle. If there is an error, it is recorded in errhp and this
+ function returns a NULL pointer. Diagnostic information can be obtained
+ by calling OCIErrorGet().
+ dstid(IN)
+ Character set id for the destination buffer.
+ dstp(OUT)
+ Pointer to the destination buffer.
+ dstlen(IN)
+ The maximum byte size of destination buffer.
+ srcid(IN)
+ Character set id for the source buffer.
+ srcp(IN)
+ Pointer to the source buffer.
+ srclen(IN)
+ The length byte size of source buffer.
+ rsize(OUT)
+ The number of characters converted. If it is a NULL pointer, nothing to
+ return.
+*/
+sword OCINlsCharSetConvert(/*_ dvoid *envhp, OCIError *errhp,
+ ub2 dstid, dvoid *dstp, size_t dstlen,
+ ub2 srcid, CONST dvoid *srcp, size_t srclen,
+ size_t *rsize _*/);
+
+/* ------------------- OCICharsetConversionIsReplacementUsed ----------------*/
+/*
+ NAME
+ OCICharsetConversionIsReplacementUsed - chech if replacement is used in
+ conversion
+ REMARKS
+ This function indicates whether or not the replacement character was used
+ for nonconvertible characters in character set conversion in last invoke
+ of OCICharsetUcs2ToMb().
+ RETURNS
+ TRUE is the replacement character was used in last OCICharsetUcs2ToMb()
+ invoking, else FALSE.
+ envhp(IN/OUT)
+ OCI environment handle. This should be the first handle passed to
+ OCICharsetUcs2ToMb().
+*/
+boolean OCICharSetConversionIsReplacementUsed(/*_ dvoid *envhp _*/);
+
+/*------------------- OCINlsEnvironmentVariableGet -----------------*/
+/*
+ NAME
+ OCINlsEnvironmentVariableGet - get a value of NLS environment variable.
+
+ DESCRIPTION
+ This function retrieves a value of NLS environment variable to the buffer
+ pointed to by val. Data type is determined by the parameter specified by
+ item. Either numeric data or string data can be retrieved.
+
+ RETURNS
+ OCI_SUCCESS or OCI_ERROR.
+
+ PARAMETERS
+ valp(OUT) -
+ Pointer to the buffer.
+ size(IN) -
+ Size of the buffer. This argument is only applicable to string data type,
+ but not to numerical data, in such case, it is ignored.
+ item(IN) -
+ NLS item value, which can be one of following values:
+ OCI_NLS_CHARSET_ID - NLS_LANG character set id in ub2 data type.
+ OCI_NLS_NCHARSET_ID - NLS_NCHAR character set id in ub2 data type.
+ charset(IN) -
+ Character set id for retrieved string data. If it is 0, NLS_LANG will be
+ used. OCI_UTF16ID is a valid id. In case of numeric data, this argument
+ is ignored.
+ rsize(OUT) -
+ Size of return value.
+
+ NOTE
+ This functions is mainly used for retrieving character set id from either
+ NLS_LANG or NLS_NCHAR environment variables. If NLS_LANG is not set,
+ the default character set id is returned.
+ For future extension, the buffer is capable for storing other data types.
+*/
+sword OCINlsEnvironmentVariableGet(/*_ dvoid *valp, size_t size, ub2 item,
+ ub2 charset, size_t *rsize _*/);
+
+
+/*------------------------- OCIMessageOpen ----------------------------------*/
+/*
+ NAME
+ OCIMessageOpen - open a locale message file
+ REMARKS
+ This function opens a message handle for facility of product in a language
+ pointed to by envhp. It first try to open the message file corresponding
+ to envhp for the facility. If it successes, it will use that file to
+ initialize a message handle, else it will use the default message file
+ which is for American language for the facility. The function return a
+ pointer pointed to a message handle into msghp parameter.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ A pointer to OCI environment handle for message language.
+ errhp(IN/OUT)
+ The OCI error handle. If there is an error, it is record in errhp and this
+ function returns a NULL pointer. Diagnostic information can be obtained by
+ calling OCIErrorGet().
+ msghp(OUT)
+ a message handle for return
+ product(IN)
+ A pointer to a product name. Product name is used to locate the directory
+ for message in a system dependent way. For example, in Solaris, the
+ directory of message files for the product `rdbms' is
+ `${ORACLE_HOME}/rdbms'.
+ facility(IN)
+ A pointer to a facility name in the product. It is used to construct a
+ message file name. A message file name follows the conversion with
+ facility as prefix. For example, the message file name for facility
+ `img' in American language will be `imgus.msb' where `us' is the
+ abbreviation of American language and `msb' as message binary file
+ extension.
+ dur(IN)
+ Duration for memory allocation for the return message handle. It can be
+ the following values:
+ OCI_DURATION_CALL
+ OCI_DURATION_STATEMENT
+ OCI_DURATION_SESSION
+ OCI_DURATION_TRANSACTION
+ For the detail description, please refer to Memory Related Service
+ Interfaces section.
+*/
+sword OCIMessageOpen(/*_ dvoid *envhp, OCIError *errhp, OCIMsg **msghp,
+ CONST OraText *product, CONST OraText *facility,
+ OCIDuration dur _*/);
+
+
+/*------------------------- OCIMessageGet -----------------------------------*/
+/*
+ NAME
+ OCIMessageGet - get a locale message from a message handle
+ REMARKS
+ This function will get message with message number identified by msgno and
+ if buflen is not zero, the function will copy the message into the buffer
+ pointed to by msgbuf. If buflen is zero, the message will be copied into
+ a message buffer inside the message handle pointed to by msgh. For both
+ cases. it will return the pointer to the null-terminated message string.
+ If it cannot get the message required, it will return a NULL pointer.
+ RETURNS
+ A pointer to a null-terminated message string on success, otherwise a NULL
+ pointer.
+ msgh(IN/OUT)
+ Pointer to a message handle which was previously opened by OCIMessageOpen().
+ msgno(IN)
+ The message number for getting message.
+ msgbuf(OUT)
+ Pointer to a destination buffer to the message retrieved. If buflen is
+ zero, it can be NULL pointer.
+ buflen(IN)
+ The size of the above destination buffer.
+*/
+OraText *OCIMessageGet(/*_ OCIMsg *msgh, ub4 msgno, OraText *msgbuf,
+ size_t buflen _*/);
+
+
+/*------------------------- OCIMessageClose ---------------------------------*/
+/*
+ NAME
+ OCIMessageClose - close a message handle
+ REMARKS
+ This function closes a message handle pointed to by msgh and frees any
+ memory associated with this handle.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ A pointer to OCI environment handle for message language.
+ errhp(IN/OUT)
+ The OCI error handle. If there is an error, it is record in errhp and this
+ function returns a NULL pointer. Diagnostic information can be obtained by
+ calling OCIErrorGet().
+ msghp(IN/OUT)
+ A pointer to a message handle which was previously opened by
+ OCIMessageOpen().
+*/
+sword OCIMessageClose(/*_ dvoid *envhp, OCIError *errhp, OCIMsg *msghp _*/);
+
+/*--------------- End of Extensions to NLS cartridge service ----------------*/
+
+/*----------------- Extensions to OCI Thread interface ---------------------*/
+/*****************************************************************************
+ DESCRIPTION
+******************************************************************************
+1 Threads Interface
+
+The OCIThread package provides a number of commonly used threading
+primitives for use by Oracle customers. It offers a portable interface to
+threading capabilities native to various platforms. It does not implement
+threading on platforms which do not have native threading capability.
+
+OCIThread does not provide a portable implementation of multithreaded
+facilities. It only serves as a set of portable covers for native
+multithreaded facilities. Therefore, platforms that do not have native
+support for multi-threading will only be able to support a limited
+implementation of OCIThread. As a result, products that rely on all of
+OCIThread's functionality will not port to all platforms. Products that must
+port to all platforms must use only a subset of OCIThread's functionality.
+This issue is discussed further in later sections of this document.
+
+The OCIThread API is split into four main parts. Each part is described
+briefly here. The following subsections describe each in greater detail.
+
+ 1. Initialization and Termination Calls
+
+ These calls deal with the initialization and termination of OCIThread.
+ Initialization of OCIThread initializes the OCIThread context which is
+ a member of the OCI environment or session handle. This context is
+ required for other OCIThread calls.
+
+ 2. Passive Threading Primitives
+
+ The passive threading primitives include primitives to manipulate mutual
+ exclusion (mutex) locks, thread ID's, and thread-specific data keys.
+
+ The reason that these primitives are described as 'passive' is that while
+ their specifications allow for the existence of multiple threads, they do
+ not require it. This means that it is possible for these primitives to
+ be implemented according to specification in both single-threaded and
+ multi-threaded environments.
+
+ As a result, OCIThread clients that use only these primitives will not
+ require the existence of multiple threads in order to work correctly,
+ i.e., they will be able to work in single-threaded environments without
+ branching code.
+
+ 3. Active Threading Primitives
+
+ Active threading primitives include primitives dealing with the creation,
+ termination, and other manipulation of threads.
+
+ The reason that these primitives are described as 'active' is that they
+ can only be used in true multi-threaded environments. Their
+ specifications explicitly require that it be possible to have multiple
+ threads. If you need to determine at runtime whether or not you are in a
+ multi-threaded environment, call OCIThreadIsMulti() before calling an
+ OCIThread active primitive.
+
+
+1.1 Initialization & Termination
+==================================
+
+The types and functions described in this section are associated with the
+initialization and termination of the OCIThread package. OCIThread must
+be properly initialized before any of its functionality can be used.
+OCIThread's process initialization function, 'OCIThreadProcessInit()',
+must be called with care; see below.
+
+The observed behavior of the initialization and termination functions is the
+same regardless of whether OCIThread is in single-threaded or multi-threaded
+environment. It is OK to call the initialization functions from both generic
+and operating system specific (OSD) code.
+
+1.1.1 Types
+
+ OCIThreadContext - OCIThread Context
+ -------------------------------------
+
+ Most calls to OCIThread functions take the OCI environment or session
+ handle as a parameter. The OCIThread context is part of the OCI
+ environment or session handle and it must be initialized by calling
+ 'OCIThreadInit()'. Termination of the OCIThread context occurs by calling
+ 'OCIThreadTerm()'.
+
+ The OCIThread context is a private data structure. Clients must NEVER
+ attempt to examine the contents of the context.
+
+1.1.2 OCIThreadProcessInit
+
+ OCIThreadProcessInit - OCIThread Process INITialization
+ --------------------------------------------------------
+
+ Description
+
+ This function should be called to perform OCIThread process
+ initialization.
+
+ Prototype
+
+ void OCIThreadProcessInit();
+
+ Returns
+
+ Nothing.
+
+ Notes
+
+ Whether or not this function needs to be called depends on how OCI
+ Thread is going to be used.
+
+ * In a single-threaded application, calling this function is optional.
+ If it is called at all, the first call to it must occur before calls
+ to any other OCIThread functions. Subsequent calls can be made
+ without restriction; they will not have any effect.
+
+ * In a multi-threaded application, this function MUST be called. The
+ first call to it MUST occur 'strictly before' any other OCIThread
+ calls; i.e., no other calls to OCIThread functions (including other
+ calls to this one) can be concurrent with the first call.
+ Subsequent calls to this function can be made without restriction;
+ they will not have any effect.
+
+
+1.1.3 OCIThreadInit
+
+ OCIThreadInit - OCIThread INITialize
+ -------------------------------------
+
+ Description
+
+ This initializes OCIThread context.
+
+ Prototype
+
+ sword OCIThreadInit(dvoid *hndl, OCIError *err);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal for OCIThread clients to try an examine the memory
+ pointed to by the returned pointer.
+
+ It is safe to make concurrent calls to 'OCIThreadInit()'. Unlike
+ 'OCIThreadProcessInit()', there is no need to have a first call
+ that occurs before all the others.
+
+ The first time 'OCIThreadInit()' is called, it initilaizes the OCI
+ Thread context. It also saves a pointer to the context in some system
+ dependent manner. Subsequent calls to 'OCIThreadInit()' will return
+ the same context.
+
+ Each call to 'OCIThreadInit()' must eventually be matched by a call to
+ 'OCIThreadTerm()'.
+
+ OCIThreadTerm - OCIThread TERMinate
+ ------------------------------------
+
+ Description
+
+ This should be called to release the OCIThread context. It should be
+ called exactly once for each call made to 'OCIThreadInit()'.
+
+ Prototype
+
+ sword OCIThreadTerm(dvoid *hndl, OCIError *err);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is safe to make concurrent calls to 'OCIThreadTerm()'.
+
+ 'OCIThreadTerm()' will not do anything until it has been called as
+ many times as 'OCIThreadInit()' has been called. When that happens,
+ it terminates the OCIThread layer and frees the memory allocated for
+ the context. Once this happens, the context should not be re-used.
+ It will be necessary to obtain a new one by calling 'OCIThreadInit()'.
+
+
+ OCIThreadIsMulti - OCIThread Is Multi-Threaded?
+ ------------------------------------------------
+
+ Description
+
+ This tells the caller whether the application is running in a
+ multi-threaded environment or a single-threaded environment.
+
+ Prototype
+ boolean OCIThreadIsMulti(void);
+
+ Returns
+
+ TRUE if the environment is multi-threaded;
+ FALSE if the environment is single-threaded.
+
+
+1.2 Passive Threading Primitives
+==================================
+
+1.2.1 Types
+
+The passive threading primitives deal with the manipulation of mutex,
+thread ID's, and thread-specific data. Since the specifications of these
+primitives do not require the existence of multiple threads, they can be
+used both on multithreaded and single-threaded platforms.
+
+1.2.1.1 OCIThreadMutex - OCIThread Mutual Exclusion Lock
+-----------------------------------------------------------
+
+ The type 'OCIThreadMutex' is used to represent a mutual exclusion lock
+ (mutex). A mutex is typically used for one of two purposes: (i) to
+ ensure that only one thread accesses a given set of data at a time, or
+ (ii) to ensure that only one thread executes a given critical section of
+ code at a time.
+
+ Mutexes pointer can be declared as parts of client structures or as
+ stand-alone variables. Before they can be used, they must be initialized
+ using 'OCIThreadMutexInit()'. Once they are no longer needed, they must be
+ destroyed using 'OCIThreadMutexDestroy()'. A mutex pointer must NOT be
+ used after it is destroyed.
+
+ A thread can acquire a mutex by using either 'OCIThreadMutexAcquire()' or
+ 'OCIThreadMutexTry()'. They both ensure that only one thread at a time is
+ allowed to hold a given mutex. A thread that holds a mutex can release it
+ by calling 'OCIThreadMutexRelease()'.
+
+
+1.2.1.2 OCIThreadKey - OCIThread Key for Thread-Specific Data
+----------------------------------------------------------------
+
+ A key can be thought of as a process-wide variable that has a
+ thread-specific value. What this means is that all the threads in a
+ process can use any given key. However, each thread can examine or modify
+ that key independently of the other threads. The value that a thread sees
+ when it examines the key will always be the same as the value that it last
+ set for the key. It will not see any values set for the key by the other
+ threads.
+
+ The type of the value held by a key is a 'dvoid *' generic pointer.
+
+ Keys can be created using 'OCIThreadKeyInit()'. When a key is created, its
+ value is initialized to 'NULL' for all threads.
+
+ A thread can set a key's value using 'OCIThreadKeySet()'. A thread can
+ get a key's value using 'OCIThreadKeyGet()'.
+
+ The OCIThread key functions will save and retrieve data SPECIFIC TO THE
+ THREAD. When clients maintain a pool of threads and assign the threads to
+ different tasks, it *may not* be appropriate for a task to use OCIThread
+ key functions to save data associated with it. Here is a scenario of how
+ things can fail: A thread is assigned to execute the initialization of a
+ task. During the initialization, the task stored some data related to it
+ in the thread using OCIThread key functions. After the initialization,
+ the thread is returned back to the threads pool. Later, the threads pool
+ manager assigned another thread to perform some operations on the task,
+ and the task needs to retrieve those data it stored earlier in
+ initialization. Since the task is running in another thread, it will not
+ be able to retrieve the same data back! Applications that use thread
+ pools should be aware of this and be cautious when using OCIThread key
+ functions.
+
+
+1.2.1.3 OCIThreadKeyDestFunc - OCIThread Key Destructor Function Type
+------------------------------------------------------------------------
+
+ This is the type of a pointer to a key's destructor routine. Keys can be
+ associated with a destructor routine when they are created (see
+ 'OCIThreadKeyInit()').
+
+ A key's destructor routine will be called whenever a thread that has a
+ non-NULL value for the key terminates.
+
+ The destructor routine returns nothing and takes one parameter. The
+ parameter will be the value that was set for key when the thread
+ terminated.
+
+ The destructor routine is guaranteed to be called on a thread's value
+ in the key after the termination of the thread and before process
+ termination. No more precise guarantee can be made about the timing
+ of the destructor routine call; thus no code in the process may assume
+ any post-condition of the destructor routine. In particular, the
+ destructor is not guaranteed to execute before a join call on the
+ terminated thread returns.
+
+
+1.2.1.4 OCIThreadId - OCIThread Thread ID
+--------------------------------------------
+
+ Type 'OCIThreadId' is the type that will be used to identify a thread.
+ At any given time, no two threads will ever have the same 'OCIThreadId'.
+ However, 'OCIThreadId' values can be recycled; i.e., once a thread dies,
+ a new thread may be created that has the same 'OCIThreadId' as the one
+ that died. In particular, the thread ID must uniquely identify a thread
+ T within a process, and it must be consistent and valid in all threads U
+ of the process for which it can be guaranteed that T is running
+ concurrently with U. The thread ID for a thread T must be retrievable
+ within thread T. This will be done via OCIThreadIdGet().
+
+ The 'OCIThreadId' type supports the concept of a NULL thread ID: the NULL
+ thread ID will never be the same as the ID of an actual thread.
+
+
+
+1.2.2 Function prototypes for passive primitives
+--------------------------------------------------
+
+1.2.2.1 Mutex functions
+-------------------------
+
+ OCIThreadMutexInit - OCIThread MuteX Initialize
+ -----------------------------------------------
+
+ Description
+
+ This allocate and initializes a mutex. All mutexes must be
+ initialized prior to use.
+
+ Prototype
+
+ sword OCIThreadMutexInit(dvoid *hndl, OCIError *err,
+ OCIThreadMutex **mutex);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ mutex(OUT): The mutex to initialize.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ Multiple threads must not initialize the same mutex simultaneously.
+ Also, a mutex must not be reinitialized until it has been destroyed (see
+ 'OCIThreadMutexDestroy()').
+
+ OCIThreadMutexDestroy - OCIThread MuteX Destroy
+ -----------------------------------------------
+
+ Description
+
+ This destroys and deallocate a mutex. Each mutex must be destroyed
+ once it is no longer needed.
+
+ Prototype
+
+ sword OCIThreadMutexDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadMutex **mutex);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ mutex(IN/OUT): The mutex to destroy.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is not legal to destroy a mutex that is uninitialized or is currently
+ held by a thread. The destruction of a mutex must not occur concurrently
+ with any other operations on the mutex. A mutex must not be used after
+ it has been destroyed.
+
+
+ OCIThreadMutexAcquire - OCIThread MuteX Acquire
+ -----------------------------------------------
+
+ Description
+
+ This acquires a mutex for the thread in which it is called. If the mutex
+ is held by another thread, the calling thread is blocked until it can
+ acquire the mutex.
+
+ Prototype
+
+ sword OCIThreadMutexAcquire(dvoid *hndl, OCIError *err,
+ OCIThreadMutex *mutex);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error, it is
+ recorded in err and this function returns OCI_ERROR.
+ Diagnostic information can be obtained by calling
+ OCIErrorGet().
+
+ mutex(IN/OUT): The mutex to acquire.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal to attempt to acquire an uninitialized mutex.
+
+ This function's behavior is undefined if it is used by a thread to
+ acquire a mutex that is already held by that thread.
+
+
+
+ OCIThreadMutexRelease - OCIThread MuteX Release
+ -----------------------------------------------
+
+ Description
+
+ This releases a mutex. If there are any threads blocked on the mutex,
+ one of them will acquire it and become unblocked.
+
+ Prototype
+
+ sword OCIThreadMutexRelease(dvoid *hndl, OCIError *err,
+ OCIThreadMutex *mutex);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ mutex(IN/OUT): The mutex to release.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal to attempt to release an uninitialized mutex. It is also
+ illegal for a thread to release a mutex that it does not hold.
+
+
+ OCIThreadKeyInit - OCIThread KeY Initialize
+ -------------------------------------------
+
+ Description
+
+ This creates a key. Each call to this routine allocate and generates
+ a new key that is distinct from all other keys.
+
+ Prototype
+
+ sword OCIThreadKeyInit(dvoid *hndl, OCIError *err, OCIThreadKey **key,
+ OCIThreadKeyDestFunc destFn);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ key(OUT): The 'OCIThreadKey' in which to create the new key.
+
+ destFn(IN): The destructor for the key. NULL is permitted.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ Once this function executes successfully, a pointer to an allocated and
+ initialized key is return. That key can be used with 'OCIThreadKeyGet()'
+ and 'OCIThreadKeySet()'. The initial value of the key will be 'NULL' for
+ all threads.
+
+ It is illegal for this function to be called more than once to create the
+ same key (i.e., to be called more than once with the same value for the
+ 'key' parameter).
+
+ If the 'destFn' parameter is not NULL, the routine pointed to by 'destFn'
+ will be called whenever a thread that has a non-NULL value for the key
+ terminates. The routine will be called with one parameter. The
+ parameter will be the key's value for the thread at the time at which the
+ thread terminated.
+ If the key does not need a destructor function, pass NULL for 'destFn'.
+
+
+ OCIThreadKeyDestroy - OCIThread KeY DESTROY
+ -------------------------------------------
+
+ Description
+
+ Destroy and deallocate the key pointed to by 'key'.
+
+ Prototype
+
+ sword OCIThreadKeyDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadKey **key);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ key(IN/OUT): The 'OCIThreadKey' in which to destroy the key.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ This is different from the destructor function callback passed to the
+ key create routine. This new destroy function 'OCIThreadKeyDestroy' is
+ used to terminate any resources OCI THREAD acquired when it created
+ 'key'. [The 'OCIThreadKeyDestFunc' callback type is a key VALUE
+ destructor; it does in no way operate on the key itself.]
+
+ This must be called once the user has finished using the key. Not
+ calling the key destroy function may result in memory leaks.
+
+
+
+
+1.2.2.2 Thread Key operations
+-------------------------------
+
+ OCIThreadKeyGet - OCIThread KeY Get value
+ -----------------------------------------
+
+ Description
+
+ This gets the calling thread's current value for a key.
+
+ Prototype
+
+ sword OCIThreadKeyGet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+ dvoid **pValue);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ key(IN): The key.
+
+ pValue(IN/OUT): The location in which to place the thread-specific
+ key value.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal to use this function on a key that has not been created
+ using 'OCIThreadKeyInit()'.
+
+ If the calling thread has not yet assigned a value to the key, 'NULL' is
+ placed in the location pointed to by 'pValue'.
+
+
+ OCIThreadKeySet - OCIThread KeY Set value
+ -----------------------------------------
+
+ Description
+
+ This sets the calling thread's value for a key.
+
+ Prototype
+
+ sword OCIThreadKeySet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+ dvoid *value);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ key(IN/OUT): The key.
+
+ value(IN): The thread-specific value to set in the key.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal to use this function on a key that has not been created
+ using 'OCIThreadKeyInit()'.
+
+1.2.2.3 Thread Id
+--------------------
+
+ OCIThreadIdInit - OCIThread Thread Id INITialize
+ --------------------------------------------------
+
+ Description
+
+ Allocate and initialize the thread id 'tid'.
+
+ Prototype
+
+ sword OCIThreadIdInit(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid (OUT): Pointer to the thread ID to initialize.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+ OCIThreadIdDestroy - OCIThread Thread Id DESTROY
+ --------------------------------------------------
+
+ Description
+
+ Destroy and deallocate the thread id 'tid'.
+
+ Prototype
+
+ sword OCIThreadIdDestroy(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid(IN/OUT): Pointer to the thread ID to destroy.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Note
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+
+ OCIThreadIdSet - OCIThread Thread Id Set
+ -----------------------------------------
+
+ Description
+
+ This sets one 'OCIThreadId' to another.
+
+ Prototype
+
+ sword OCIThreadIdSet(dvoid *hndl, OCIError *err,
+ OCIThreadId *tidDest,
+ OCIThreadId *tidSrc);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tidDest(OUT): This should point to the location of the 'OCIThreadId'
+ to be set to.
+
+ tidSrc(IN): This should point to the 'OCIThreadId' to set from.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+
+ OCIThreadIdSetNull - OCIThread Thread Id Set Null
+ ---------------------------------------------------------
+
+ Description
+
+ This sets the NULL thread ID to a given 'OCIThreadId'.
+
+ Prototype
+
+ sword OCIThreadIdSetNull(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error, it is
+ recorded in err and this function returns OCI_ERROR.
+ Diagnostic information can be obtained by calling
+ OCIErrorGet().
+
+ tid(OUT): This should point to the 'OCIThreadId' in which to put
+ the NULL thread ID.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+
+ OCIThreadIdGet - OCIThread Thread Id Get
+ ------------------------------------------
+
+ Description
+
+ This retrieves the 'OCIThreadId' of the thread in which it is called.
+
+ Prototype
+
+ sword OCIThreadIdGet(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid(OUT): This should point to the location in which to place the
+ ID of the calling thread.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+ When OCIThread is used in a single-threaded environment,
+ OCIThreadIdGet() will always place the same value in the location
+ pointed to by 'tid'. The exact value itself is not important. The
+ important thing is that it is not the same as the NULL thread ID and
+ that it is always the same value.
+
+
+ OCIThreadIdSame - OCIThread Thread Ids Same?
+ ----------------------------------------------
+
+ Description
+
+ This determines whether or not two 'OCIThreadId's represent the same
+ thread.
+
+ Prototype
+
+ sword OCIThreadIdSame(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid1, OCIThreadId *tid2,
+ boolean *result);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid1(IN): Pointer to the first 'OCIThreadId'.
+
+ tid2(IN): Pointer to the second 'OCIThreadId'.
+
+ result(IN/OUT): Pointer to the result.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ If 'tid1' and 'tid2' represent the same thread, 'result' is set to TRUE.
+ Otherwise, 'result' is set to FALSE.
+
+ 'result' is set to TRUE if both 'tid1' and 'tid2' are the NULL thread ID.
+
+ 'ti1d' and 'tid2' should be initialized by OCIThreadIdInit().
+
+
+ OCIThreadIdNull - OCIThread Thread Id NULL?
+ ---------------------------------------------
+
+ Description
+
+ This determines whether or not a given 'OCIThreadId' is the NULL thread
+ ID.
+
+ Prototype
+
+ sword OCIThreadIdNull(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid,
+ boolean *result);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid(IN): Pointer to the 'OCIThreadId' to check.
+
+ result(IN/OUT): Pointer to the result.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ If 'tid' is the NULL thread ID, 'result' is set to TRUE. Otherwise,
+ 'result' is set to FALSE.
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+
+1.3 Active Threading Primitives
+=================================
+
+The active threading primitives deal with the manipulation of actual
+threads. Because the specifications of most of these primitives require
+that it be possible to have multiple threads, they work correctly only in
+the enabled OCIThread; In the disabled OCIThread, they always return
+failure. The exception is OCIThreadHandleGet(); it may be called in a
+single-threaded environment, in which case it will have no effect.
+
+Active primitives should only be called by code running in a multi-threaded
+environment. You can call OCIThreadIsMulti() to determine whether the
+environment is multi-threaded or single-threaded.
+
+
+1.3.1 Types
+--------------
+
+1.3.1.1 OCIThreadHandle - OCIThread Thread Handle
+------------------------------------------------------
+
+ Type 'OCIThreadHandle' is used to manipulate a thread in the active
+ primitives: OCIThreadJoin()and OCIThreadClose(). A thread handle opened by
+ OCIThreadCreate() must be closed in a matching call to
+ OCIThreadClose(). A thread handle is invalid after the call to
+ OCIThreadClose().
+
+ The distinction between a thread ID and a thread handle in OCIThread usage
+ follows the distinction between the thread ID and the thread handle on
+ Windows NT. On many platforms, the underlying native types are the same.
+
+
+1.3.2 Functions
+------------------
+
+ OCIThreadHndInit - OCIThread HaNDle Initialize
+ ----------------------------------------------
+
+ Description
+
+ Allocate and initialize the thread handle.
+
+ Prototype
+
+ sword OCIThreadHndInit(dvoid *hndl, OCIError *err,
+ OCIThreadHandle **thnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ thnd(OUT): The address of pointer to the thread handle to initialize.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+ OCIThreadHndDestroy - OCIThread HaNDle Destroy
+ ----------------------------------------------
+
+ Description
+
+ Destroy and deallocate the thread handle.
+
+ Prototype
+
+ sword OCIThreadHndDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadHandle **thnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ thnd(IN/OUT): The address of pointer to the thread handle to destroy.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+
+ OCIThreadCreate - OCIThread Thread Create
+ -----------------------------------------
+
+ Description
+
+ This creates a new thread.
+
+ Prototype
+
+ sword OCIThreadCreate(dvoid *hndl, OCIError *err,
+ void (*start)(dvoid *), dvoid *arg,
+ OCIThreadId *tid, OCIThreadHandle *tHnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ start(IN): The function in which the new thread should begin
+ execution.
+
+ arg(IN): The argument to give the function pointed to by 'start'.
+
+ tid(IN/OUT): If not NULL, gets the ID for the new thread.
+
+ tHnd(IN/OUT): If not NULL, gets the handle for the new thread.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ The new thread will start by executing a call to the function pointed
+ to by 'start' with the argument given by 'arg'. When that function
+ returns, the new thread will terminate. The function should not
+ return a value and should accept one parameter, a 'dvoid *'.
+
+ The call to OCIThreadCreate() must be matched by a call to
+ OCIThreadClose() if and only if tHnd is non-NULL.
+
+ If tHnd is NULL, a thread ID placed in *tid will not be valid in the
+ calling thread because the timing of the spawned thread's termination
+ is unknown.
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+
+
+ OCIThreadJoin - OCIThread Thread Join
+ -------------------------------------
+
+ Description
+
+ This function allows the calling thread to 'join' with another thread.
+ It blocks the caller until the specified thread terminates.
+
+ Prototype
+
+ sword OCIThreadJoin(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tHnd(IN): The 'OCIThreadHandle' of the thread to join with.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+ The result of multiple threads all trying to join with the same thread is
+ undefined.
+
+
+ OCIThreadClose - OCIThread Thread Close
+ ---------------------------------------
+
+ Description
+
+ This function should be called to close a thread handle.
+
+ Prototype
+
+ sword OCIThreadClose(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tHnd(IN/OUT): The OCIThread thread handle to close.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+ Both thread handle and the thread ID that was returned by the same call
+ to OCIThreadCreate() are invalid after the call to OCIThreadClose().
+
+
+
+ OCIThreadHandleGet - OCIThread Thread Get Handle
+ ------------------------------------------------
+
+ Description
+
+ Retrieve the 'OCIThreadHandle' of the thread in which it is called.
+
+ Prototype
+
+ sword OCIThreadHandleGet(dvoid *hndl, OCIError *err,
+ OCIThreadHandle *tHnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tHnd(IN/OUT): If not NULL, the location to place the thread
+ handle for the thread.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+ The thread handle 'tHnd' retrieved by this function must be closed
+ with OCIThreadClose() and destroyed by OCIThreadHndDestroy() after it
+ is used.
+
+
+
+
+1.4 Using OCIThread
+=====================
+
+This section summarizes some of the more important details relating to the use
+of OCIThread.
+
+ * Process initialization
+
+ OCIThread only requires that the process initialization function
+ ('OCIThreadProcessInit()') be called when OCIThread is being used in a
+ multi-threaded application. Failing to call 'OCIThreadProcessInit()' in
+ a single-threaded application is not an error.
+
+ * OCIThread initialization
+
+ Separate calls to 'OCIThreadInit()' will all return the same OCIThread
+ context.
+
+ Also, remember that each call to 'OCIThreadInit()' must eventually be
+ matched by a call to 'OCIThreadTerm()'.
+
+ * Active vs. Passive Threading primitives
+
+ OCIThread client code written without using any active primitives can be
+ compiled and used without change on both single-threaded and
+ multi-threaded platforms.
+
+ OCIThread client code written using active primitives will only work
+ correctly on multi-threaded platforms. In order to write a version of the
+ same application to run on single-threaded platform, it is necessary to
+ branch the your code, whether by branching versions of the source file or
+ by branching at runtime with the OCIThreadIsMulti() call.
+******************************************************************************/
+
+/*****************************************************************************
+ ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+
+void OCIThreadProcessInit(/*_ _*/);
+
+sword OCIThreadInit(/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIThreadTerm(/*_ dvoid *hndl, OCIError *err _*/);
+
+boolean OCIThreadIsMulti(/*_ void _*/);
+
+sword OCIThreadMutexInit(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadMutex **mutex _*/);
+
+sword OCIThreadMutexDestroy(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadMutex **mutex _*/);
+
+sword OCIThreadMutexAcquire(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadMutex *mutex _*/);
+
+sword OCIThreadMutexRelease(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadMutex *mutex _*/);
+
+sword OCIThreadKeyInit(/*_ dvoid *hndl, OCIError *err, OCIThreadKey **key,
+ OCIThreadKeyDestFunc destFn _*/);
+
+sword OCIThreadKeyDestroy(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadKey **key _*/);
+
+sword OCIThreadKeyGet(/*_ dvoid *hndl, OCIError *err, OCIThreadKey *key,
+ dvoid **pValue _*/);
+
+sword OCIThreadKeySet(/*_ dvoid *hndl, OCIError *err, OCIThreadKey *key,
+ dvoid *value _*/);
+
+sword OCIThreadIdInit(/*_ dvoid *hndl, OCIError *err, OCIThreadId **tid _*/);
+
+sword OCIThreadIdDestroy(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadId **tid _*/);
+
+sword OCIThreadIdSet(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadId *tidDest, OCIThreadId *tidSrc _*/);
+
+sword OCIThreadIdSetNull(/*_ dvoid *hndl, OCIError *err, OCIThreadId *tid _*/);
+
+sword OCIThreadIdGet(/*_ dvoid *hndl, OCIError *err, OCIThreadId *tid _*/);
+
+sword OCIThreadIdSame(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadId *tid1, OCIThreadId *tid2,
+ boolean *result _*/);
+
+sword OCIThreadIdNull(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadId *tid, boolean *result _*/);
+
+sword OCIThreadHndInit(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadHandle **thnd _*/);
+
+sword OCIThreadHndDestroy(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadHandle **thnd _*/);
+
+sword OCIThreadCreate(/*_ dvoid *hndl, OCIError *err,
+ void (*start)(dvoid *), dvoid *arg,
+ OCIThreadId *tid, OCIThreadHandle *tHnd _*/);
+
+sword OCIThreadJoin(/*_ dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd _*/);
+
+sword OCIThreadClose(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadHandle *tHnd _*/);
+
+sword OCIThreadHandleGet(/*_ dvoid *hndl, OCIError *err,
+ OCIThreadHandle *tHnd _*/);
+/*----------------- End OCI Thread interface Extensions ---------------------*/
+
+/*--------------- Begin OCI Client Notification Interfaces ------------------*/
+
+typedef ub4 (*OCISubscriptionNotify)(/*_ dvoid *ctx, OCISubscription *subscrhp,
+ dvoid *pay, ub4 payl,
+ dvoid *desc, ub4 mode _*/);
+
+sword OCISubscriptionRegister (/*_ OCISvcCtx *svchp,
+ OCISubscription **subscrhpp, ub2 count,
+ OCIError *errhp, ub4 mode _*/);
+
+sword OCISubscriptionPost (/*_ OCISvcCtx *svchp, OCISubscription **subscrhpp,
+ ub2 count, OCIError *errhp, ub4 mode _*/);
+
+sword OCISubscriptionUnRegister (/*_ OCISvcCtx *svchp,
+ OCISubscription *subscrhp, OCIError *errhp,
+ ub4 mode _*/);
+
+sword OCISubscriptionDisable (/*_ OCISubscription *subscrhp,
+ OCIError *errhp, ub4 mode _*/);
+
+sword OCISubscriptionEnable (/*_ OCISubscription *subscrhp,
+ OCIError *errhp, ub4 mode _*/);
+
+/*------------------- End OCI Client Notification Interfaces ----------------*/
+
+/*----------------- Extensions to Datetime interfaces -----------------------*/
+
+sword OCIDateTimeGetTime(/*_ dvoid *hndl, OCIError *err,
+ OCIDateTime *datetime, ub1 *hour, ub1 *min,
+ ub1 *sec, ub4 *fsec_*/);
+
+sword OCIDateTimeGetDate(/*_dvoid *hndl, OCIError *err,
+ CONST OCIDateTime *date,
+ sb2 *year, ub1 *month, ub1 *day _*/);
+
+sword OCIDateTimeGetTimeZoneOffset(/*_ dvoid *hndl,OCIError *err,
+ CONST OCIDateTime *datetime,sb1 *hour,sb1 *minute _*/);
+
+sword OCIDateTimeConstruct(/*_ dvoid *hndl,OCIError *err,
+ OCIDateTime *datetime,
+ sb2 yr,ub1 mnth,ub1 dy,ub1 hr,ub1 mm,ub1 ss,ub4 fsec,
+ OraText *timezone,size_t timezone_length _*/);
+
+sword OCIDateTimeSysTimeStamp(/*_ dvoid *hndl, OCIError *err,
+ OCIDateTime *sys_date _*/);
+
+sword OCIDateTimeAssign(/*_dvoid *hndl, OCIError *err, CONST OCIDateTime *from,
+ OCIDateTime *to_*/);
+
+sword OCIDateTimeToText(/*_ dvoid *hndl, OCIError *err,
+ CONST OCIDateTime *date, CONST OraText *fmt,
+ ub1 fmt_length, ub1 fsprec, CONST OraText *lang_name,
+ size_t lang_length,
+ ub4 *buf_size, OraText *buf _*/);
+
+sword OCIDateTimeFromText(/*_ dvoid *hndl, OCIError *err, CONST OraText *dstr,
+ size_t d_str_length, CONST OraText *fmt, ub1 fmt_length,
+ CONST OraText *lang_name, size_t lang_length,
+ OCIDateTime *date _*/);
+
+sword OCIDateTimeCompare(/*_ dvoid *hndl, OCIError *err,
+ CONST OCIDateTime *date1, CONST OCIDateTime *date2,
+ sword *result _*/);
+
+sword OCIDateTimeCheck(/*_ dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ ub4 *valid _*/);
+
+sword OCIDateTimeConvert(/*_ dvoid *hndl, OCIError *err, OCIDateTime *indate,
+ OCIDateTime *outdate_*/);
+
+sword OCIDateTimeSubtract(/*_ dvoid *hndl, OCIError *err, OCIDateTime *indate1,
+ OCIDateTime *indate2, OCIInterval *inter_*/);
+
+sword OCIDateTimeIntervalAdd(/*_ dvoid *hndl, OCIError *err,
+ OCIDateTime *datetime, OCIInterval *inter,
+ OCIDateTime *outdatetime_*/);
+
+sword OCIDateTimeIntervalSub(/*_ dvoid *hndl, OCIError *err,
+ OCIDateTime *datetime, OCIInterval *inter,
+ OCIDateTime *outdatetime_*/);
+
+sword OCIIntervalSubtract(/*_ dvoid *hndl, OCIError *err,
+ OCIInterval *minuend, OCIInterval *subtrahend, OCIInterval *result _*/);
+
+sword OCIIntervalAdd(/*_ dvoid *hndl, OCIError *err, OCIInterval *addend1,
+ OCIInterval *addend2, OCIInterval *result _*/);
+
+sword OCIIntervalMultiply(/*_ dvoid *hndl, OCIError *err,
+ CONST OCIInterval *ifactor, OCINumber *nfactor,
+ OCIInterval *result _*/);
+
+sword OCIIntervalDivide(/*_ dvoid *hndl, OCIError *err, OCIInterval *dividend,
+ OCINumber *divisor, OCIInterval *result _*/);
+
+sword OCIIntervalCompare(/*_ dvoid *hndl, OCIError *err, OCIInterval *inter1,
+ OCIInterval *inter2, sword *result _*/);
+
+sword OCIIntervalFromNumber(/*_ dvoid *hndl, OCIError *err,
+ OCIInterval *interval, OCINumber *number _*/);
+
+sword OCIIntervalFromText(/*_dvoid *hndl, OCIError *err, CONST OraText *inpstr,
+ size_t str_len, OCIInterval *result _*/);
+
+sword OCIIntervalToText(/*_ dvoid *hndl, OCIError *err,
+ CONST OCIInterval *interval, ub1 lfprec, ub1 fsprec,
+ OraText *buffer, size_t buflen, size_t *resultlen _*/);
+
+sword OCIIntervalToNumber(/*_ dvoid *hndl, OCIError *err,
+ CONST OCIInterval *interval, OCINumber *number _*/);
+
+sword OCIIntervalCheck(/*_dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ ub4 *valid _*/);
+
+sword OCIIntervalAssign(/*_ dvoid *hndl, OCIError *err,
+ CONST OCIInterval *inpinter, OCIInterval *outinter _*/);
+
+sword OCIIntervalSetYearMonth(/*_dvoid *hndl, OCIError *err, sb4 yr, sb4 mnth,
+ OCIInterval *result _*/);
+
+sword OCIIntervalGetYearMonth(/*_dvoid *hndl, OCIError *err, sb4 *yr, sb4 *mnt,
+ CONST OCIInterval *result _*/);
+
+sword OCIIntervalSetDaySecond(/*_dvoid *hndl, OCIError *err, sb4 dy, sb4 hr,
+ sb4 mm, sb4 ss, sb4 fsec, OCIInterval *result _*/);
+
+sword OCIIntervalGetDaySecond(/*_dvoid *hndl, OCIError *err, sb4 *dy, sb4 *hr,
+ sb4 *mm, sb4 *ss, sb4 *fsec, CONST OCIInterval *result _*/);
+
+sword OCIDateTimeToArray(/*_dvoid *hndl, OCIError *err,
+ CONST OCIDateTime *datetime, CONST OCIInterval *reftz,
+ ub1 *outarray, ub4 len, ub1 fsprec _*/);
+
+sword OCIDateTimeFromArray(/*_dvoid *hndl, OCIError *err, ub1 *inarray,
+ ub4 len, ub1 type, OCIDateTime *datetime,
+ CONST OCIInterval *reftz, ub1 fsprec _*/);
+
+sword OCIDateTimeGetTimeZoneName(/*_dvoid *hndl, OCIError *err,
+ CONST OCIDateTime *datetime,
+ ub1 *buf, ub4 *buflen _*/);
+
+sword OCIIntervalFromTZ(/*_ dvoid *hndl, OCIError *err,
+ CONST oratext *inpstring, size_t str_len,
+ OCIInterval *result _*/);
+
+/*----------------- End Datetime interface Extensions -----------------------*/
+
+/*------------------------ OCIAnyDataSet interfaces -------------------------*/
+
+/*
+ NAME
+ OCIAnyDataSetBeginCreate - OCIAnyDataSet Begin Creation
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+ recorded in errhp and this function returns OCI_ERROR.
+ Diagnostic information can be obtained by calling
+ OCIErrorGet().
+ typecode - typecode corresponding to the OCIAnyDataSet.
+ type (IN) - type corresponding to the OCIAnyDataSet. If the typecode
+ corresponds to a built-in type (OCI_TYPECODE_NUMBER etc.)
+ , this parameter can be NULL. It should be non NULL for
+ user defined types (OCI_TYPECODE_OBJECT,
+ OCI_TYPECODE_REF, collection types etc.)
+ dur (IN) - duration for which OCIAnyDataSet is allocated.
+ data_set (OUT) - Initialized OCIAnyDataSet.
+ RETURNS - error code
+ NOTES
+ This call allocates an OCIAnyDataSet for the duration of dur and
+ initializes it with the type information. The OCIAnyDataSet can hold
+ multiple instances of the given type. For performance reasons, the
+ OCIAnyDataSet will end up pointing to the passed in OCIType parameter.
+ It is the responsibility of the caller to ensure that the OCIType is
+ longer lived (has allocation duration >= the duration of the OCIAnyData
+ if the OCIType is a transient one, allocation/pin duration >= duration of
+ the OCIAnyData if the OCIType is a persistent one).
+
+*/
+sword OCIAnyDataSetBeginCreate(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCITypeCode typecode, CONST OCIType *type, OCIDuration dur,
+ OCIAnyDataSet ** data_set _*/);
+
+/*
+ NAME
+ OCIAnyDataSetDestroy - OCIAnyDataSet Destroy
+ DESCRIPTION
+ This call frees the OCIAnyDataSet allocated using
+ OCIAnyDataSetBeginCreate().
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI Error handle.
+ data_set (IN/OUT) - OCIAnyDataSet to be freed.
+*/
+sword OCIAnyDataSetDestroy(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set _*/);
+
+/*
+ NAME
+ OCIAnyDataSetAddInstance - OCIAnyDataSet Add an instance
+ DESCRIPTION
+ This call adds a new skeleton instance to the OCIAnyDataSet and all the
+ attributes of the instance are set to NULL. It returns this skeleton
+ instance through the OCIAnyData parameter which can be constructed
+ subsequently by invoking the OCIAnyData API.
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI Error handle.
+ data_set (IN/OUT) - OCIAnyDataSet to which a new instance is added.
+ data (IN/OUT) - OCIAnyData corresponding to the newly added
+ instance. If (*data) is NULL, a new OCIAnyData will
+ be allocated for same duration as the OCIAnyDataSet.
+ If (*data) is not NULL, it will get reused. This
+ OCIAnyData can be subseqently constructed using the
+ OCIAnyDataConvert() call or it can be constructed
+ piece-wise using the OCIAnyDataAttrSet and
+ OCIAnyDataCollAddElem calls.
+ NOTES
+ No Destruction of the old value is done here. It is the responsibility of
+ the caller to destroy the old value pointed to by (*data) and set (*data)
+ to a null pointer before beginning to make a sequence of this call. No
+ deep copying (of OCIType information nor the data part.) is done in the
+ returned OCIAnyData. This OCIAnyData cannot be used beyond the allocation
+ duration of the OCIAnyDataSet (it is like a reference into the
+ OCIAnyDataSet). The returned OCIAnyData can be reused on subsequent calls
+ to this function, to sequentially add new data instances to the
+ OCIAnyDataSet.
+*/
+sword OCIAnyDataSetAddInstance(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set, OCIAnyData **data _*/);
+
+/*
+ NAME
+ OCIAnyDataSetEndCreate - OCIAnyDataSet End Creation process.
+ DESCRIPTION
+ This call marks the end of OCIAnyDataSet creation. It should be called
+ after constructing all of its instance(s).
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+ recorded in errhp and this function returns
+ OCI_ERROR. Diagnostic information can be obtained
+ by calling OCIErrorGet().
+ data_set (IN/OUT) - OCIAnyDataSet that has been fully constructed.
+*/
+sword OCIAnyDataSetEndCreate(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set _*/);
+
+/*
+ NAME
+ OCIAnyDataSetGetType - OCIAnyDataSet Get Type of an OCIAnyDataSet
+ DESCRIPTION
+ Gets the Type corresponding to an OCIAnyDataSet. It returns the actual
+ pointer to the type maintained inside an OCIAnyDataSet. No copying is
+ done for performance reasons. The client is responsible for not using
+ this type once the OCIAnyDataSet is freed (or its duration ends).
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI Error handle.
+ data_set (IN) - Initialized OCIAnyDataSet.
+ tc (OUT) - The typecode of the type.
+ type (OUT) - The type corresponding to the OCIAnyDataSet. This
+ could be null if the OCIAnyData corresponds to a
+ built-in type.
+*/
+sword OCIAnyDataSetGetType (/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set, OCITypeCode *tc, OCIType **type _*/);
+
+/*
+ NAME
+ OCIAnyDataSetGetCount - OCIAnyDataSet Get Count of instances.
+ DESCRIPTION
+ This call gets the number of instances in the OCIAnyDataSet.
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - OCI Service Context
+ errhp (IN/OUT) - OCI Error handle
+ data_set (IN) - Well formed OCIAnyDataSet.
+ count (OUT) - number of instances in OCIAnyDataSet
+*/
+sword OCIAnyDataSetGetCount(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set, ub4 *count _*/);
+
+/*
+ NAME
+ OCIAnyDataSetGetInstance - OCIAnyDataSet Get next instance.
+ DESCRIPTION
+ Only sequential access to the instances in an OCIAnyDataSet is allowed.
+ This call returns the OCIAnyData corresponding to an instance at the
+ current position and updates the current position. Subsequently, the
+ OCIAnyData access routines may be used to access the instance.
+ RETURNS
+ error code. Returns OCI_NO_DATA if the current position is at the end of
+ the set, OCI_SUCCESS otherwise.
+ PARAMETERS
+ svchp (IN/OUT) - OCI Service Context
+ errhp (IN/OUT) - OCI Error handle
+ data_set (IN) - Well formed OCIAnyDataSet
+ data (IN/OUT) - OCIAnyData corresponding to the instance. If (*data)
+ is NULL, a new OCIAnyData will be allocated for same
+ duration as the OCIAnyDataSet. If (*data) is not NULL
+ , it will get reused. This OCIAnyData can be
+ subsequently accessed using the OCIAnyDataAccess()
+ call or piece-wise by using the OCIAnyDataAttrGet()
+ call.
+ NOTE
+ No Destruction of the old value is done here. It is the responsibility of
+ the caller to destroy the old value pointed to by (*data) and set (*data)
+ to a null pointer before beginning to make a sequence of this call. No deep
+ copying (of OCIType information nor the data part.) is done in the returned
+ OCIAnyData. This OCIAnyData cannot be used beyond the allocation duration
+ of the OCIAnyDataSet (it is like a reference into the OCIAnyDataSet). The
+ returned OCIAnyData can be reused on subsequent calls to this function to
+ sequentially access the OCIAnyDataSet.
+*/
+sword OCIAnyDataSetGetInstance(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set, OCIAnyData **data _*/);
+
+/*--------------------- End of OCIAnyDataSet interfaces ---------------------*/
+
+/*--------------------- Connection Pooling prototypes -----------------------*/
+sword OCIConnectionPoolCreate(/*_ OCIEnv *envhp, OCIError *errhp,
+ OCICPool *poolhp,
+ OraText **poolName, sb4 *poolNameLen,
+ CONST OraText *dblink, sb4 dblinkLen,
+ ub4 connMin, ub4 connMax, ub4 connIncr,
+ CONST OraText *poolUserName, sb4 poolUserLen,
+ CONST OraText *poolPassword, sb4 poolPassLen,
+ ub4 mode _*/);
+
+sword OCIConnectionPoolDestroy(/*_ OCICPool *poolhp,
+ OCIError *errhp, ub4 mode _*/);
+
+/*----------------- End of Connection Pooling prototypes --------------------*/
+
+/*-------------------- Session Pooling prototypes ---------------------------*/
+
+sword OCISessionPoolCreate (/*_ OCIEnv *envhp, OCIError *errhp,
+ OCISPool *spoolhp,
+ OraText **poolName, ub4 *poolNameLen,
+ CONST OraText *connStr, ub4 connStrLen,
+ ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+ OraText *userid, ub4 useridLen,
+ OraText *password, ub4 passwordLen,
+ ub4 mode _*/);
+
+sword OCISessionPoolDestroy (/*_ OCISPool *spoolhp,
+ OCIError *errhp,
+ ub4 mode _*/);
+
+sword OCISessionGet (/*_ OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+ OCIAuthInfo *authhp,
+ OraText *poolName, ub4 poolName_len,
+ CONST OraText *tagInfo, ub4 tagInfo_len,
+ OraText **retTagInfo, ub4 *retTagInfo_len,
+ boolean *found, ub4 mode _*/);
+
+sword OCISessionRelease (/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OraText *tag, ub4 tag_len,
+ ub4 mode _*/);
+
+/*-------------------- End Session Pooling prototypes -----------------------*/
+
+sword OCIXMLTypeNew(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIDuration dur,
+ OraText *elname, ub4 elname_Len,
+ OraText *schemaURL, ub4 schemaURL_Len,
+ OCIXMLType **retInstance _*/);
+
+sword OCIXMLTypeCreateFromSrc(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCIDuration dur, ub1 src_type, dvoid *src_ptr,
+ sb4 ind, OCIXMLType **retInstance _*/);
+
+sword OCIXMLTypeExtract(/*_ OCIError *errhp,
+ OCIXMLType *doc, OCIDuration dur,
+ OraText *xpathexpr, ub4 xpathexpr_Len,
+ OraText *nsmap, ub4 nsmap_Len,
+ OCIXMLType **retDoc _*/);
+
+sword OCIXMLTypeTransform(/*_ OCIError *errhp, OCIDuration dur,
+ OCIXMLType *doc, OCIXMLType *xsldoc,
+ OCIXMLType **retDoc _*/);
+
+sword OCIXMLTypeExists(/*_ OCIError *errhp, OCIXMLType *doc,
+ OraText *xpathexpr, ub4 xpathexpr_Len,
+ OraText *nsmap, ub4 nsmap_Len,
+ boolean *retval _*/);
+
+sword OCIXMLTypeIsSchemaBased(/*_ OCIError *errhp,
+ OCIXMLType *doc, boolean *retval _*/);
+
+sword OCIXMLTypeGetSchema(/*_ OCIError *errhp, OCIXMLType *doc,
+ OCIXMLType **schemadoc,
+ OraText **schemaURL, ub4 *schemaURL_Len,
+ OraText **rootelem, ub4 *rootelem_Len _*/);
+
+sword OCIXMLTypeValidate(/*_ OCIError *errhp, OCIXMLType *doc,
+ OraText *schemaURL, ub4 schemaURL_Len, boolean *retval _*/);
+
+sword OCIXMLTypeGetDOM(/*_ OCIError *errhp, OCIXMLType *doc, OCIDuration dur,
+ OCIDOMDocument **retDom _*/);
+
+sword OCIXMLTypeGetFromDOM(/*_ OCIError *errhp, OCIDOMDocument *domdoc,
+ OCIXMLType **retXMLType _*/);
+
+sword OCIDOMFree(/*_ OCIError *errhp, OCIDOMDocument *domdoc _*/);
+
+/*---------------------------------------------------------------------------
+ PRIVATE FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+/* these calls are deprecated and should not be used */
+#ifdef NEVER
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCIStmtBindByPos (/*_ OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+ ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+ dvoid *indp, ub2 *alenp, ub2 *rcodep,
+ ub4 maxarr_len, ub4 *curelep, ub4 mode _*/);
+
+sword OCIStmtBindByName(/*_ OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+ CONST OraText *placeholder, sb4 placeh_len, dvoid *valuep,
+ sb4 value_sz, ub2 dty, dvoid *indp, ub2 *alenp,
+ ub2 *rcodep, ub4 maxarr_len, ub4 *curelep, ub4 mode _*/);
+
+sword ocidefn(/*_ OCIStmt *stmtp, OCIDefine *defnp, OCIError *errhp,
+ ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+ dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode _*/);
+
+#endif /* __STDC__ */
+#endif /* NEVER */
+
+#endif /* ocikp */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocikpr.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocikpr.h
new file mode 100644
index 0000000..b86b389
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocikpr.h
@@ -0,0 +1,168 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ocikpr.h,v 1.3 2005/05/06 16:48:56 karine Exp $
+ */
+
+/* Copyright (c) 1991, 1995, 1996, 1998 by Oracle Corporation */
+/*
+ NAME
+ ocikpr.h - header of K & R compilers
+ MODIFIED (MM/DD/YY)
+ porangas 12/04/00 - Forward merge bug#974710 to 9i
+ sgollapu 05/19/98 - Change text to OraText
+ dchatter 04/21/96 -
+ dchatter 11/10/95 - add ognfd() - get native fd
+ lchidamb 04/06/95 - drop maxdsz from obindps/odefinps
+ slari 04/07/95 - add opinit
+ dchatter 03/08/95 - osetpi and ogetpi
+ lchidamb 12/09/94 - add obindps() and odefinps()
+ dchatter 03/06/95 - merge changes from branch 1.1.720.2
+ dchatter 11/14/94 - merge changes from branch 1.1.720.1
+ dchatter 02/08/95 - olog call; drop onblon
+ dchatter 10/31/94 - new functions for non-blocking oci
+ rkooi2 11/27/92 - Changing datatypes (in comments) and return types
+ rkooi2 10/26/92 - More portability mods
+ rkooi2 10/18/92 - Changed to agree with oci.c
+ sjain 03/16/92 - Creation
+*/
+
+/*
+ * Declare the OCI functions.
+ * Prototype information is commented out.
+ * Use this header for non-ANSI C compilers.
+ * Note that you will need to include ocidfn.h in the .c files
+ * to get the definition for cda_def.
+ */
+
+#ifndef OCIKPR
+#define OCIKPR
+
+#include <oratypes.h>
+
+/*
+ * Oci BIND (Piecewise or with Skips)
+ */
+sword obindps( /*_ struct cda_def *cursor, ub1 opcode, OraText *sqlvar,
+ sb4 sqlvl, ub1 *pvctx, sb4 progvl,
+ sword ftype, sword scale,
+ sb2 *indp, ub2 *alen, ub2 *arcode,
+ sb4 pv_skip, sb4 ind_skip, sb4 alen_skip, sb4 rc_skip,
+ ub4 maxsiz, ub4 *cursiz,
+ OraText *fmt, sb4 fmtl, sword fmtt _*/ );
+sword obreak( /*_ struct cda_def *lda _*/ );
+sword ocan ( /*_ struct cda_def *cursor _*/ );
+sword oclose( /*_ struct cda_def *cursor _*/ );
+sword ocof ( /*_ struct cda_def *lda _*/ );
+sword ocom ( /*_ struct cda_def *lda _*/ );
+sword ocon ( /*_ struct cda_def *lda _*/ );
+
+
+/*
+ * Oci DEFINe (Piecewise or with Skips)
+ */
+sword odefinps( /*_ struct cda_def *cursor, ub1 opcode, sword pos,ub1 *bufctx,
+ sb4 bufl, sword ftype, sword scale,
+ sb2 *indp, OraText *fmt, sb4 fmtl, sword fmtt,
+ ub2 *rlen, ub2 *rcode,
+ sb4 pv_skip, sb4 ind_skip, sb4 alen_skip, sb4 rc_skip _*/ );
+sword odescr( /*_ struct cda_def *cursor, sword pos, sb4 *dbsize,
+ sb2 *dbtype, sb1 *cbuf, sb4 *cbufl, sb4 *dsize,
+ sb2 *prec, sb2 *scale, sb2 *nullok _*/ );
+sword odessp( /*_ struct cda_def *cursor, OraText *objnam, size_t onlen,
+ ub1 *rsv1, size_t rsv1ln, ub1 *rsv2, size_t rsv2ln,
+ ub2 *ovrld, ub2 *pos, ub2 *level, OraText **argnam,
+ ub2 *arnlen, ub2 *dtype, ub1 *defsup, ub1* mode,
+ ub4 *dtsiz, sb2 *prec, sb2 *scale, ub1 *radix,
+ ub4 *spare, ub4 *arrsiz _*/ );
+sword oerhms( /*_ struct cda_def *lda, sb2 rcode, OraText *buf,
+ sword bufsiz _*/ );
+sword oermsg( /*_ sb2 rcode, OraText *buf _*/ );
+sword oexec ( /*_ struct cda_def *cursor _*/ );
+sword oexfet( /*_ struct cda_def *cursor, ub4 nrows,
+ sword cancel, sword exact _*/ );
+sword oexn ( /*_ struct cda_def *cursor, sword iters, sword rowoff _*/ );
+sword ofen ( /*_ struct cda_def *cursor, sword nrows _*/ );
+sword ofetch( /*_ struct cda_def *cursor _*/ );
+sword oflng ( /*_ struct cda_def *cursor, sword pos, ub1 *buf,
+ sb4 bufl, sword dtype, ub4 *retl, sb4 offset _*/ );
+sword ogetpi( /*_ struct cda_def *cursor, ub1 *piecep, dvoid **ctxpp,
+ ub4 *iterp, ub4 *indexp _*/ );
+sword opinit( /*_ ub4 mode _*/ );
+sword olog ( /*_ struct cda_def *lda, ub1 *hst,
+ OraText *uid, sword uidl,
+ OraText *psw, sword pswl,
+ OraText *conn, sword connl,
+ ub4 mode _*/ );
+sword ologof( /*_ struct cda_def *lda _*/ );
+sword oopen ( /*_ struct cda_def *cursor, struct cda_def *lda,
+ OraText *dbn, sword dbnl, sword arsize,
+ OraText *uid, sword uidl _*/ );
+sword oopt ( /*_ struct cda_def *cursor, sword rbopt, sword waitopt _*/ );
+sword oparse( /*_ struct cda_def *cursor, OraText *sqlstm, sb4 sqllen,
+ sword defflg, ub4 lngflg _*/ );
+sword orol ( /*_ struct cda_def *lda _*/ );
+sword osetpi( /*_ struct cda_def *cursor, ub1 piece, dvoid *bufp,
+ ub4 *lenp _*/ );
+void sqlld2 ( /*_ struct cda_def *lda, OraText *cname, sb4 *cnlen _*/ );
+void sqllda ( /*_ struct cda_def *lda _*/ );
+
+/* non-blocking functions */
+sword onbset( /*_ struct cda_def *lda _*/ );
+sword onbtst( /*_ struct cda_def *lda _*/ );
+sword onbclr( /*_ struct cda_def *lda _*/ );
+sword ognfd ( /*_ struct cda_def *lda, dvoid *fdp _*/ );
+
+
+
+/*
+ * OBSOLETE FUNCTIONS
+ */
+
+/*
+ * OBSOLETE BIND CALLS-- use obindps()
+ */
+sword obndra( /*_ struct cda_def *cursor, OraText *sqlvar, sword sqlvl,
+ ub1 *progv, sword progvl, sword ftype, sword scale,
+ sb2 *indp, ub2 *alen, ub2 *arcode, ub4 maxsiz,
+ ub4 *cursiz, OraText *fmt, sword fmtl, sword fmtt _*/ );
+sword obndrn( /*_ struct cda_def *cursor, sword sqlvn, ub1 *progv,
+ sword progvl, sword ftype, sword scale, sb2 *indp,
+ OraText *fmt, sword fmtl, sword fmtt _*/ );
+sword obndrv( /*_ struct cda_def *cursor, OraText *sqlvar, sword sqlvl,
+ ub1 *progv, sword progvl, sword ftype, sword scale,
+ sb2 *indp, OraText *fmt, sword fmtl, sword fmtt _*/ );
+
+/*
+ * OBSOLETE DEFINE CALLS-- use odefinps()
+ */
+sword odefin( /*_ struct cda_def *cursor, sword pos, ub1 *buf,
+ sword bufl, sword ftype, sword scale, sb2 *indp,
+ OraText *fmt, sword fmtl, sword fmtt, ub2 *rlen,
+ ub2 *rcode _*/ );
+
+
+/* older calls ; preferred equivalent calls above */
+sword odsc ( /*_ struct cda_def *cursor, sword pos, sb2 *dbsize,
+ sb2 *fsize, sb2 *rcode, sb2 *dtype, sb1 *buf,
+ sb2 *bufl, sb2 *dsize _*/ );
+sword oname ( /*_ struct cda_def *cursor, sword pos, sb1 *tbuf,
+ sb2 *tbufl, sb1 *buf, sb2 *bufl _*/ );
+sword olon ( /*_ struct cda_def *lda, OraText *uid, sword uidl,
+ OraText *pswd, sword pswdl, sword audit _*/ );
+sword orlon ( /*_ struct cda_def *lda, ub1 *hda, OraText *uid,
+ sword uidl, OraText *pswd, sword pswdl, sword audit _*/ );
+sword osql3 ( /*_ struct cda_def *cda, OraText *sqlstm, sword sqllen _*/ );
+
+
+
+
+
+
+
+#endif /* OCIKPR */
+
+
+
+
+
+
+
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocixad.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocixad.h
new file mode 100644
index 0000000..3f1eefa
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocixad.h
@@ -0,0 +1,316 @@
+/* Copyright (c) 1999, 2001, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ ocixad.h - OCI eXtensible Access Driver (for external tables)
+
+ DESCRIPTION
+ Provides handles for XAD support.
+
+ RELATED DOCUMENTS
+ External Tables Design specification (external_tab_ds.doc)
+
+ EXPORT FUNCTION(S)
+
+ INTERNAL FUNCTION(S)
+
+ EXAMPLES
+
+ NOTES
+ Currently these interfaces are for Oracle internal use only.
+
+ MODIFIED (MM/DD/YY)
+ cmlim 08/10/01 - date cache: add XADSESSION attrs: DCACHE_SIZE
+ abrumm 04/18/01 - define interface method signatures in OCIXAD
+ abrumm 02/20/01 - add attributes for ACCESS_PARM_TYPE
+ abrumm 01/18/01 - more OCI_ATTR_XADSESSION attributes
+ abrumm 10/09/00 - use oratypes.h, not s.h
+ abrumm 03/30/00 - external table support
+ abrumm 03/30/00 - Creation
+
+*/
+
+#ifndef OCIXAD_ORACLE
+#define OCIXAD_ORACLE
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef OCIEXTP_ORACLE
+#include <ociextp.h>
+#endif
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+/*----- Handles and descriptors for access driver operations (OCIXAD*) -----*/
+typedef struct OCIXADSession OCIXADSession; /* session handle */
+typedef struct OCIXADTable OCIXADTable; /* table handle */
+typedef struct OCIXADField OCIXADField; /* field handle */
+typedef struct OCIXADGranule OCIXADGranule; /* granule handle */
+
+/*---------------- Access Driver method interface signatures ----------------*/
+
+/* Each of the following access driver methods are logically member functions
+ * of the OCIXADSession handle. As such, the first argument to the method is
+ * the OCIXADSession handle (i.e. "this").
+ *
+ * An access driver writer must provide these entry points at configure
+ * time via the OCIXADMethodEntry structure.
+ */
+
+typedef sword (*OCIXADMethodOpen)(OCIXADSession *xadses,
+ OCIExtProcContext *withCtx,
+ OCIXADTable *xadtbl,
+ OCILobLocator *accessParm);
+
+typedef sword (*OCIXADMethodFetchInit)(OCIXADSession *xadses,
+ OCIExtProcContext *withCtx,
+ OCIXADTable *xadtbl,
+ OCINumber *gnum, ub4 maxRowCnt);
+
+typedef sword (*OCIXADMethodFetch)(OCIXADSession *xadses,
+ OCIExtProcContext *withCtx,
+ OCIXADTable *xadtbl, void *opaqueCtx,
+ ub4 rowCnt, sb4 rejctLmt,
+ sb4 *rejctCntp);
+
+typedef void (*OCIXADMethodPopulateInit)(OCIXADSession *xadses,
+ OCIExtProcContext *withCtx);
+
+typedef void (*OCIXADMethodPopulate)(OCIXADSession *xadses,
+ OCIExtProcContext *withCtx);
+
+typedef void (*OCIXADMethodPopulateTerm)(OCIXADSession *xadses,
+ OCIExtProcContext *withCtx);
+
+typedef sword (*OCIXADMethodClose)(OCIXADSession *xadses,
+ OCIExtProcContext *withCtx,
+ OCIXADTable *xadtbl);
+
+typedef void (*OCIXADMethodErrorCallback)(OCIXADSession *xadses,
+ OCIExtProcContext *withCtx,
+ void *opaqueCtx, OCIError *errhp,
+ ub4 rowidx, ub2 colIdx);
+
+/* Access Driver Method Entry points provided at "configure" time. */
+struct OCIXADMethodEntry
+{
+ ub4 Version_OCIXADMethodEntry;
+#define OCIXAD_METHOD_ENTRY_VERSION_1 100
+#define OCIXAD_METHOD_ENTRY_VERSION_CUR OCIXAD_METHOD_ENTRY_VERSION_1
+
+ OCIXADMethodOpen Open_OCIXADMethodEntry;
+ OCIXADMethodFetchInit FetchInit_OCIXADMethodEntry;
+ OCIXADMethodFetch Fetch_OCIXADMethodEntry;
+ OCIXADMethodPopulateInit PopulateInit_OCIXADMethodEntry;
+ OCIXADMethodPopulate Populate_OCIXADMethodEntry;
+ OCIXADMethodPopulateTerm PopulateTerm_OCIXADMethodEntry;
+ OCIXADMethodClose Close_OCIXADMethodEntry;
+ OCIXADMethodErrorCallback ErrorCallback_OCIXADMethodEntry;
+};
+typedef struct OCIXADMethodEntry OCIXADMethodEntry;
+
+/* Each access driver type (e.g. "ORACLE_LOADER") must provide a
+ * configure function (currently via the kpxdconf[] array).
+ * The configure function must set the
+ * OCI_ATTR_XADSESSION_METHOD_ENTRY_POINTS attribute of the passed in
+ * 'hndl' argument. The OCI_ATTR_XADSESSION_METHOD_ENTRY_POINTS attribute
+ * is a pointer to an OCIXADMethodEntry structure.
+ */
+typedef sword (*OCIXADConfig)(OraText *driverType, /* driver type name */
+ void *hndl, /* OCIXADSession handle */
+ ub4 hndlType, /* handle type */
+ OCIError *errhp); /* OCI error handle */
+
+/* Granule handle client callback prototypes for external tables.
+ * The granulesPerSrc vector is allocated with numsrc_kpxg entries.
+ * The access drivers granule info method (if present) should populate
+ * each entry of the granulesPerSrc vector with the number of granules
+ * for the corresponding source number.
+ */
+typedef void (*OCIXADMethodGranuleInfo)(OCIXADGranule *xadgran,
+ OCIExtProcContext *withCtx,
+ ub4 *granulesPerSrc);
+
+/*------------------------------ OCIXADSession ------------------------------*/
+ /*----- Defines for OCIXADSession Attributes -----*/
+#define OCI_ATTR_XADSESSION_TABLE 1
+#define OCI_ATTR_XADSESSION_LOCATIONS 2
+#define OCI_ATTR_XADSESSION_NAMES 2 /* synonym for locations */
+#define OCI_ATTR_XADSESSION_DIRECTORIES 3
+#define OCI_ATTR_XADSESSION_GRANULE 4
+#define OCI_ATTR_XADSESSION_OPCODE 5
+#define OCI_ATTR_XADSESSION_CALLERID 6
+#define OCI_ATTR_XADSESSION_GRANULESIZE 7
+#define OCI_ATTR_XADSESSION_DATAMODE 8
+#define OCI_ATTR_XADSESSION_AGENT_NUMBER 9
+#define OCI_ATTR_XADSESSION_OPAQUECTX 10
+
+ /*----- OCIXADSession virtual methods (methods as attributes) -----*/
+#define OCI_ATTR_XADSESSION_METHOD_ENTRY_POINTS 11
+ /* type for GET, SET */
+ /* (OCIXADMethodEntry **, OCIXADMethodEntry *) */
+
+ /* more OCIXADSession Attributes (numbering starts after entry points) */
+ /* type for GET, SET */
+#define OCI_ATTR_XADSESSION_DEFAULT_DIRECTORY 12 /* (text **, text *) */
+#define OCI_ATTR_XADSESSION_DRIVER_TYPE 13 /* (text **, text *) */
+#define OCI_ATTR_XADSESSION_SAMPLE_TYPE 14 /* (ub4 *, ub4 *) */
+#define OCI_ATTR_XADSESSION_SAMPLE_PERCENT 15 /* (ub4 *, ub4 *) */
+#define OCI_ATTR_XADSESSION_ACCESS_PARM_TYPE 16 /* (ub1 *, ub1 *) */
+#define OCI_ATTR_XADSESSION_DCACHE_SIZE 17 /* (ub4 *, ub4 *) */
+#define OCI_ATTR_XADSESSION_DCACHE_NUM 18 /* (ub4 *), n/a ) */
+#define OCI_ATTR_XADSESSION_DCACHE_DISABLE 19 /* (ub1 *), n/a ) */
+#define OCI_ATTR_XADSESSION_DCACHE_HITS 20 /* (ub4 *), n/a ) */
+#define OCI_ATTR_XADSESSION_DCACHE_MISSES 21 /* (ub4 *), n/a ) */
+
+
+ /*----- Values for OCI_ATTR_XADSESSION_OPCODE -----*/
+#define OCI_XADSESSION_OPCODE_FETCH 1
+#define OCI_XADSESSION_OPCODE_POPULATE 2
+
+ /*----- Values for OCI_ATTR_XADSESSION_CALLERID -----*/
+#define OCI_XADSESSION_CALLERID_QC 1 /* query coordinator */
+#define OCI_XADSESSION_CALLERID_SHADOW 2
+#define OCI_XADSESSION_CALLERID_SLAVE 3
+
+ /*----- Values for OCI_ATTR_XADSESSION_DATAMODE -----*/
+#define OCI_XADSESSION_DATAMODE_STREAM 1
+#define OCI_XADSESSION_DATAMODE_FIELD 2
+
+ /*----- Values for OCI_ATTR_XADSESSION_SAMPLE_TYPE -----*/
+#define OCI_XADSESSION_SAMPLE_NONE 0 /* not sampling */
+#define OCI_XADSESSION_SAMPLE_ROW 1 /* row level sampling */
+#define OCI_XADSESSION_SAMPLE_BLOCK 2 /* block level sampling */
+
+ /*----- Values for OCI_ATTR_XADSESSION_ACCESS_PARM_TYPE -----*/
+#define OCI_XADSESSION_ACCESS_PARM_TYPE_CLOB 1 /* accessParm is CLOB */
+#define OCI_XADSESSION_ACCESS_PARM_TYPE_BLOB 2 /* accessParm is BLOB */
+
+/*------------------------------- OCIXADTable -------------------------------*/
+ /*----- Defines for OCIXADTable Attributes -----*/
+#define OCI_ATTR_XADTABLE_SESSION 1
+#define OCI_ATTR_XADTABLE_NAME 2
+#define OCI_ATTR_XADTABLE_COLUMNS 3
+#define OCI_ATTR_XADTABLE_REF_COLUMNS 4
+#define OCI_ATTR_XADTABLE_FIELDS 5
+#define OCI_ATTR_XADTABLE_NUM_FIELDS 6
+#define OCI_ATTR_XADTABLE_OPAQUECTX 7
+#define OCI_ATTR_XADTABLE_NUM_COLS 8
+#define OCI_ATTR_XADTABLE_NUM_REF_COLS 9
+#define OCI_ATTR_XADTABLE_SCHEMA 10
+
+/*------------------------------- OCIXADField -------------------------------*/
+ /*----- Defines for OCIXADField Attributes -----*/
+#define OCI_ATTR_XADFIELD_COLUMN_NUM 1
+#define OCI_ATTR_XADFIELD_DATA_TYPE 2
+#define OCI_ATTR_XADFIELD_PRECISION 3
+#define OCI_ATTR_XADFIELD_SCALE 4
+#define OCI_ATTR_XADFIELD_CHARSET_ID 5
+#define OCI_ATTR_XADFIELD_FORMAT_MASK 6
+#define OCI_ATTR_XADFIELD_ADDR 7
+#define OCI_ATTR_XADFIELD_LENGTH 8
+#define OCI_ATTR_XADFIELD_ISNULL 9
+#define OCI_ATTR_XADFIELD_ISPARTIAL 10
+#define OCI_ATTR_XADFIELD_OPAQUECTX 11
+
+/*------------------------------ OCIXADGranule ------------------------------*/
+ /*----- Defines for OCIXADGranule Attributes -----*/
+#define OCI_ATTR_XADGRANULE_NUM_GRANULES 1
+#define OCI_ATTR_XADGRANULE_NUM_SRC 2
+#define OCI_ATTR_XADGRANULE_INTRA_SRC_CONCURRENCY 3
+#define OCI_ATTR_XADGRANULE_OPAQUECTX 4
+
+ /*----- OCIXADGranule virtual methods (methods as attributes) -----*/
+#define OCI_ATTR_XADGRANULE_INFO_METHOD 5
+
+
+/*---------------------------------------------------------------------------
+ PRIVATE TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+/* NONE */
+
+/*---------------------------------------------------------------------------
+ EXPORT FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+/*-------------------------- OCIXADSession Methods --------------------------*/
+/* NONE */
+
+/*--------------------------- OCIXADTable Methods ---------------------------*/
+/*
+ NAME
+ OCIXADTableSetRowValues
+
+ DESCRIPTION
+ To set the individual column values for a row by iterating through the
+ OCIXADField handle vector which is attached to the passed in OCIXADTable
+ handle. The OCIXADTableSetRowValues method is called once for complete
+ rows, multiple times for pieced rows.
+ The column array row index is returned as an OUT parameter (*rowIdxp).
+
+ RETURNS
+ OCI_SUCCESS: all column array entries set.
+ OCI_CONTINUE: a partial Field was encountered.
+ OCI_ERROR: a partial field encountered for a column which
+ does not allow partial fields (partials are only allowed
+ for LOB and LONG columns).
+ NOTES
+ */
+sword
+#if defined(__STDC__) || defined(__cplusplus)
+OCIXADTableSetRowValues(OCIXADTable *tblhp, ub4 *rowIdxp,OCIError *errhp);
+#else
+OCIXADTableSetRowValues(/*_ OCIXADTable *tblhp, ub4 *rowIdxp ,
+ OCIError *errhp _*/);
+#endif
+
+
+/*--------------------------- OCIXADField Methods ---------------------------*/
+/*
+ NAME
+ OCIXADFieldSet
+
+ DESCRIPTION
+ Sets run-time (data dependent) attributes of the OCIXADField handle.
+
+ RETURNS
+ OCI_SUCCESS: Field attributes successfully set.
+ OCI_ERROR: Invalid combination of flags,
+ or NULL addr value for a non-NULL field,
+ or length of zero for a non-NULL field,
+ NOTES
+ Basically for convenience and efficiency, so the application does
+ not have to do four OCIAttrSet calls to set these attributes.
+ */
+sword
+#if defined(__STDC__) || defined(__cplusplus)
+OCIXADFieldSet(OCIXADField *fldhp, ub1 *addr, ub4 length, ub1 isnull,
+ ub1 ispartial);
+#else
+OCIXADFieldSet(/*_ OCIXADField *fldhp, ub1 *addr, ub4 length, ub1 isnull,
+ ub1 ispartial _*/);
+#endif
+
+/*-------------------------- OCIXADGranule Methods --------------------------*/
+/* NONE */
+
+
+/*---------------------------------------------------------------------------
+ INTERNAL FUNCTIONS
+ ---------------------------------------------------------------------------*/
+/* NONE */
+
+
+#endif /* OCIXAD_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocixmldb.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocixmldb.h
new file mode 100644
index 0000000..3057831
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocixmldb.h
@@ -0,0 +1,139 @@
+/* Copyright (c) 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ ocixmldb.h - XDB public functions
+
+ DESCRIPTION
+ This file contains XDB specific public functions required for DOM C-API.
+
+ RELATED DOCUMENTS
+
+
+ EXPORT FUNCTION(S)
+ struct xmlctx *OCIXmlDbInitXmlCtx(OCIEnv *, OCISvcCtx *, OCIError *,
+ ocixmldbparam *params, int num_params);
+
+ void OCIXmlDbFreeXmlCtx(struct xmlctx *xctx);
+
+
+ ------------------------------------------------------------------------
+ EXAMPLES
+
+ NOTES
+
+ MODIFIED (MM/DD/YY)
+ ataracha 05/28/03 - change names
+ ataracha 02/18/03 - add oratypes, remove XMLERR_*
+ imacky 02/01/03 - remove xml.h; xdbs fix
+ ataracha 01/24/03 - use "struct xmlctx" instead of xmlctx
+ imacky 01/28/03 - fix XMLERR defs
+ ataracha 01/21/03 - ataracha_uni_capi_cleanup
+ ataracha 01/09/03 - Creation
+
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef OCI_ORACLE
+# include <oci.h>
+#endif
+
+#ifndef OCIXMLDB_ORACLE
+# define OCIXMLDB_ORACLE
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+#ifndef XMLCTX_DEFINED
+# define XMLCTX_DEFINED
+/* DATATYPE xmlctx - XML top-level context
+*/
+struct xmlctx; typedef struct xmlctx xmlctx;
+#endif
+
+typedef enum
+{
+ XCTXINIT_OCIDUR = 1,
+ XCTXINIT_ERRHDL = 2
+} ocixmldbpname;
+
+typedef struct ocixmldbparam
+{
+ ocixmldbpname name_ocixmldbparam;
+ void *value_ocixmldbparam;
+} ocixmldbparam;
+
+#define NUM_OCIXMLDBPARAMS 2
+
+/*---------------------------------------------------------------------------
+ PRIVATE TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ EXPORT FUNCTIONS
+ ---------------------------------------------------------------------------*/
+/*****************************************************************************
+ DESCRIPTION
+
+-----------------------------OCIXmlDbInitXmlCtx---------------------------------
+Name
+OCIXmlDbInitXmlCtx
+Purpose
+To get a xmlctx structure initialized with error-handler and XDB callbacks.
+Syntax
+struct xmlctx *OCIXmlDbInitXmlCtx (OCIEnv *envhp,
+ OCISvcCtx *svchp,
+ OCIError *err,
+ params_ocixmldb *params,
+ int num_params);
+Parameters
+envhp (IN) - The OCI environment handle
+svchp (IN) - The OCI service handle
+errhp (IN) - The OCI error handle
+params (IN)- This contains the following optional parameters :
+ (a) OCIDuration dur (IN - The OCI Duration (Default: OCI_DURATION_SESSION)
+ (b) void (*err_handler) (sword, (const oratext *) (IN) -
+ Pointer to the error handling function (Default: null)
+num_params (IN) - Number of parameters to be read from parameter params.
+ If the value of num_params exceeds the size of array
+ "params", unexpected behavior will result.
+
+Returns
+A pointer to xmlctx structure, with xdb context, error handler and callbacks
+populated with appropriate values. This is later used for all API calls. NULL
+if no database connection available.
+
+-----------------------------OCIXmlDbFreeXmlCtx----------------------------
+Name
+OCIXmlDbFreeXmlCtx
+Pupose
+To free any allocations done during OCIXmlDbInitXmlCtx.
+Syntax
+void OCIXmlDbFreeXmlCtx (struct xmlctx *xctx)
+Parameters
+xctx (IN) - The xmlctx to terminate
+Returns
+-
+******************************************************************************/
+
+struct xmlctx *OCIXmlDb_CtxInit(OCIEnv *, OCISvcCtx *, OCIError *,
+ ocixmldbparam *, int);
+
+void OCIXmlDb_CtxFree(struct xmlctx *xctx);
+
+struct xmlctx *OCIXmlDbInitXmlCtx(OCIEnv *, OCISvcCtx *, OCIError *,
+ ocixmldbparam *, int);
+
+void OCIXmlDbFreeXmlCtx(struct xmlctx *xctx);
+/*---------------------------------------------------------------------------
+ INTERNAL FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+#endif /* OCIXMLDB_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/odci.h b/src/terralib/drivers/OracleSpatial/OCI/include/odci.h
new file mode 100644
index 0000000..550ee8f
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/odci.h
@@ -0,0 +1,657 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/odci.h,v 1.3 2005/05/06 16:48:56 karine Exp $
+ */
+
+/* Copyright (c) 1998, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ odci.h - Oracle Data Cartridge Interface definitions
+
+ DESCRIPTION
+ This file contains Oracle Data Cartridge Interface definitions. These
+ include the ODCI Types and Constants.
+
+ RELATED DOCUMENTS
+
+ INSPECTION STATUS
+ Inspection date:
+ Inspection status:
+ Estimated increasing cost defects per page:
+ Rule sets:
+
+ ACCEPTANCE REVIEW STATUS
+ Review date:
+ Review status:
+ Reviewers:
+
+ PUBLIC FUNCTION(S)
+ None.
+
+ PRIVATE FUNCTION(S)
+ None.
+
+ EXAMPLES
+
+ NOTES
+ - The constants defined here are replica of the constants defined
+ in ODCIConst Package defined as part of catodci.sql. If you change
+ these do make the similar change in catodci.sql.
+
+ MODIFIED (MM/DD/YY)
+ ayoaz 04/21/03 - add CursorNum to ODCIEnv
+ abrumm 12/30/02 - Bug #2223225: add define for
+ ODCI_ARG_DESC_LIST_MAXSIZE
+ ayoaz 10/14/02 - Add Cardinality to ODCIArgDesc
+ ayoaz 09/11/02 - add ODCIQueryInfo to ODCIIndexCtx
+ yhu 09/19/02 - add ODCI_DEBUGGING_ON for ODCIEnv.EnvFlags
+ hsbedi 10/10/02 - add object number into ODCIExtTableInfo
+ ayoaz 08/30/02 - add ODCITable2 types
+ tchorma 07/29/02 - Add ODCIFuncCallInfo type for WITH COLUMN CONTEXT
+ hsbedi 06/29/02 - External table populate
+ yhu 07/20/01 - add parallel degree in ODCIIndexInfo.
+ abrumm 02/20/01 - ODCIExtTableInfo: add AccessParmBlob attribute
+ abrumm 01/18/01 - ODCIExtTableInfo: add default directory
+ spsundar 08/24/00 - Update attrbiute positions
+ abrumm 08/04/00 - external tables changes: ODCIExtTableInfo, constants
+ tchorma 09/11/00 - Add return code ODCI_FATAL
+ tchorma 08/08/00 - Add Update Block References Option for Alter Index
+ ayoaz 08/01/00 - Add ODCI_AGGREGATE_REUSE_CTX
+ spsundar 06/19/00 - add ODCIEnv type
+ abrumm 06/27/00 - add defines for ODCIExtTable flags
+ abrumm 06/04/00 - external tables: ODCIExtTableInfo change; add ODCIEnv
+ ddas 04/28/00 - extensible optimizer enhancements for 8.2
+ yhu 06/05/00 - add a bit in IndexInfoFlags for trans. tblspc
+ yhu 04/10/00 - add ODCIPartInfo & remove ODCIIndexPartList
+ abrumm 03/29/00 - external table support
+ spsundar 02/14/00 - update odci definitions for 8.2
+ nagarwal 03/07/99 - bug# 838308 - set estimate_stats=1
+ rmurthy 11/09/98 - add blocking flag
+ ddas 10/31/98 - add ODCI_QUERY_SORT_ASC and ODCI_QUERY_SORT_DESC
+ ddas 05/26/98 - fix ODCIPredInfo flag bits
+ rmurthy 06/03/98 - add macro for RegularCall
+ spsundar 05/08/98 - add constants related to ODCIIndexAlter options
+ rmurthy 04/30/98 - remove include s.h
+ rmurthy 04/20/98 - name fixes
+ rmurthy 04/13/98 - add C mappings for odci types
+ alsrivas 04/10/98 - adding defines for ODCI_INDEX1
+ jsriniva 04/04/98 - Creation
+
+*/
+
+#ifndef OCI_ORACLE
+# include <oci.h>
+#endif
+#ifndef ODCI_ORACLE
+# define ODCI_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/* SHORT NAMES SUPPORT SECTION */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* The following are short names that are only supported on IBM mainframes
+ * with the SLSHORTNAME defined.
+ * With this all subsequent long names will actually be substituted with
+ * the short names here
+ */
+
+#define ODCIColInfo_ref odcicir
+#define ODCIColInfoList odcicil
+#define ODCIColInfoList2 odcicil2
+#define ODCIIndexInfo_ref odciiir
+#define ODCIPredInfo_ref odcipir
+#define ODCIRidList odcirl
+#define ODCIIndexCtx_ref odciicr
+#define ODCIObject_ref odcior
+#define ODCIObjectList odciol
+#define ODCIQueryInfo_ref odciqir
+#define ODCIFuncInfo_ref odcifir
+#define ODCICost_ref odcicr
+#define ODCIArgDesc_ref odciadr
+#define ODCIArgDescList odciadl
+#define ODCIStatsOptions_ref odcisor
+#define ODCIColInfo odcici
+#define ODCIColInfo_ind odcicii
+#define ODCIIndexInfo odciii
+#define ODCIIndexInfo_ind odciiii
+#define ODCIPredInfo odcipi
+#define ODCIPredInfo_ind odcipii
+#define ODCIIndexCtx odciic
+#define ODCIIndexCtx_ind odciici
+#define ODCIObject odcio
+#define ODCIObject_ind odcioi
+#define ODCIQueryInfo odciqi
+#define ODCIQueryInfo_ind odciqii
+#define ODCIFuncInfo odcifi
+#define ODCIFuncInfo_infd odcifii
+#define ODCICost odcic
+#define ODCICost_ind odcici
+#define ODCIArgDesc odciad
+#define ODCIArgDesc_ind odciadi
+#define ODCIStatsOptions odciso
+#define ODCIStatsOptions_ind odcisoi
+#define ODCIPartInfo odcipti
+#define ODCIPartInfo_ind odciptii
+#define ODCIPartInfo_ref odciptir
+#define ODCIExtTableInfo odcixt
+#define ODCIExtTableInfo_ind odcixti
+#define ODCIExtTableInfo_ref odcixtr
+#define ODCIExtTableQCInfo odcixq
+#define ODCIExtTableQCInfo_ind odcixqi
+#define ODCIExtTableQCInfo_ref odcixqr
+#define ODCIFuncCallInfo odcifc
+#define ODCIFuncCall_ind odcifci
+#define ODCIFuncCall_ref odcifcr
+
+#endif /* SLSHORTNAME */
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+/* Constants for Return Status */
+#define ODCI_SUCCESS 0
+#define ODCI_ERROR 1
+#define ODCI_WARNING 2
+#define ODCI_ERROR_CONTINUE 3
+#define ODCI_FATAL 4
+
+/* Constants for ODCIPredInfo.Flags */
+#define ODCI_PRED_EXACT_MATCH 0x0001
+#define ODCI_PRED_PREFIX_MATCH 0x0002
+#define ODCI_PRED_INCLUDE_START 0x0004
+#define ODCI_PRED_INCLUDE_STOP 0x0008
+#define ODCI_PRED_OBJECT_FUNC 0x0010
+#define ODCI_PRED_OBJECT_PKG 0x0020
+#define ODCI_PRED_OBJECT_TYPE 0x0040
+#define ODCI_PRED_MULTI_TABLE 0x0080
+
+/* Constants for QueryInfo.Flags */
+#define ODCI_QUERY_FIRST_ROWS 0x01
+#define ODCI_QUERY_ALL_ROWS 0x02
+#define ODCI_QUERY_SORT_ASC 0x04
+#define ODCI_QUERY_SORT_DESC 0x08
+#define ODCI_QUERY_BLOCKING 0x10
+
+/* Constants for ScnFlg(Func /w Index Context) */
+#define ODCI_CLEANUP_CALL 1
+#define ODCI_REGULAR_CALL 2
+
+/* Constants for ODCIFuncInfo.Flags */
+#define ODCI_OBJECT_FUNC 0x01
+#define ODCI_OBJECT_PKG 0x02
+#define ODCI_OBJECT_TYPE 0x04
+
+/* Constants for ODCIArgDesc.ArgType */
+#define ODCI_ARG_OTHER 1
+#define ODCI_ARG_COL 2 /* column */
+#define ODCI_ARG_LIT 3 /* literal */
+#define ODCI_ARG_ATTR 4 /* object attribute */
+#define ODCI_ARG_NULL 5
+#define ODCI_ARG_CURSOR 6
+
+/* Maximum size of ODCIArgDescList array */
+#define ODCI_ARG_DESC_LIST_MAXSIZE 32767
+
+/* Constants for ODCIStatsOptions.Options */
+#define ODCI_PERCENT_OPTION 1
+#define ODCI_ROW_OPTION 2
+
+/* Constants for ODCIStatsOptions.Flags */
+#define ODCI_ESTIMATE_STATS 0x01
+#define ODCI_COMPUTE_STATS 0x02
+#define ODCI_VALIDATE 0x04
+
+/* Constants for ODCIIndexAlter parameter alter_option */
+#define ODCI_ALTIDX_NONE 0
+#define ODCI_ALTIDX_RENAME 1
+#define ODCI_ALTIDX_REBUILD 2
+#define ODCI_ALTIDX_REBUILD_ONL 3
+#define ODCI_ALTIDX_MODIFY_COL 4
+#define ODCI_ALTIDX_UPDATE_BLOCK_REFS 5
+
+/* Constants for ODCIIndexInfo.IndexInfoFlags */
+#define ODCI_INDEX_LOCAL 0x0001
+#define ODCI_INDEX_RANGE_PARTN 0x0002
+#define ODCI_INDEX_HASH_PARTN 0x0004
+#define ODCI_INDEX_ONLINE 0x0008
+#define ODCI_INDEX_PARALLEL 0x0010
+#define ODCI_INDEX_UNUSABLE 0x0020
+#define ODCI_INDEX_ONIOT 0x0040
+#define ODCI_INDEX_TRANS_TBLSPC 0x0080
+#define ODCI_INDEX_FUNCTION_IDX 0x0100
+
+/* Constants for ODCIIndexInfo.IndexParaDegree */
+#define ODCI_INDEX_DEFAULT_DEGREE 32767
+
+/* Constants for ODCIEnv.EnvFlags */
+#define ODCI_DEBUGGING_ON 0x01
+
+/* Constants for ODCIEnv.CallProperty */
+#define ODCI_CALL_NONE 0
+#define ODCI_CALL_FIRST 1
+#define ODCI_CALL_INTERMEDIATE 2
+#define ODCI_CALL_FINAL 3
+
+/* Constants for ODCIExtTableInfo.OpCode */
+#define ODCI_EXTTABLE_INFO_OPCODE_FETCH 1
+#define ODCI_EXTTABLE_INFO_OPCODE_POPULATE 2
+
+/* Constants (bit definitions) for ODCIExtTableInfo.Flag */
+ /* sampling type: row or block */
+#define ODCI_EXTTABLE_INFO_FLAG_SAMPLE 0x00000001
+#define ODCI_EXTTABLE_INFO_FLAG_SAMPLE_BLOCK 0x00000002
+ /* AccessParmClob, AccessParmBlob discriminator */
+#define ODCI_EXTTABLE_INFO_FLAG_ACCESS_PARM_CLOB 0x00000004
+#define ODCI_EXTTABLE_INFO_FLAG_ACCESS_PARM_BLOB 0x00000008
+
+/* Constants for ODCIExtTableInfo.IntraSourceConcurrency */
+#define ODCI_TRUE 1
+#define ODCI_FALSE 0
+
+/* Constants (bit definitions) for ODCIExtTable{Open,Fetch,Populate,Close}
+ * Flag argument.
+ */
+#define ODCI_EXTTABLE_OPEN_FLAGS_QC 0x00000001 /* caller is Query Coord */
+#define ODCI_EXTTABLE_OPEN_FLAGS_SHADOW 0x00000002 /* caller is shadow proc */
+#define ODCI_EXTTABLE_OPEN_FLAGS_SLAVE 0x00000004 /* caller is slave proc */
+
+#define ODCI_EXTTABLE_FETCH_FLAGS_EOS 0x00000001 /* end-of-stream on fetch */
+
+/* Constants for Flags argument to ODCIAggregateTerminate */
+#define ODCI_AGGREGATE_REUSE_CTX 1
+
+/*---------------------------------------------------------------------------
+ ODCI TYPES
+ ---------------------------------------------------------------------------*/
+/*
+ * These are C mappings for the OTS types defined in catodci.sql
+ */
+
+typedef OCIRef ODCIColInfo_ref;
+typedef OCIArray ODCIColInfoList;
+typedef OCIArray ODCIColInfoList2;
+typedef OCIRef ODCIIndexInfo_ref;
+typedef OCIRef ODCIPredInfo_ref;
+typedef OCIArray ODCIRidList;
+typedef OCIRef ODCIIndexCtx_ref;
+typedef OCIRef ODCIObject_ref;
+typedef OCIArray ODCIObjectList;
+typedef OCIRef ODCIQueryInfo_ref;
+typedef OCIRef ODCIFuncInfo_ref;
+typedef OCIRef ODCICost_ref;
+typedef OCIRef ODCIArgDesc_ref;
+typedef OCIArray ODCIArgDescList;
+typedef OCIRef ODCIStatsOptions_ref;
+typedef OCIRef ODCIPartInfo_ref;
+typedef OCIRef ODCIEnv_ref;
+typedef OCIRef ODCIExtTableInfo_ref; /* external table support */
+typedef OCIArray ODCIGranuleList; /* external table support */
+typedef OCIRef ODCIExtTableQCInfo_ref; /* external table support */
+typedef OCIRef ODCIFuncCallInfo_ref;
+typedef OCIArray ODCINumberList;
+
+struct ODCIColInfo
+{
+ OCIString* TableSchema;
+ OCIString* TableName;
+ OCIString* ColName;
+ OCIString* ColTypName;
+ OCIString* ColTypSchema;
+ OCIString* TablePartition;
+};
+typedef struct ODCIColInfo ODCIColInfo;
+
+struct ODCIColInfo_ind
+{
+ OCIInd atomic;
+ OCIInd TableSchema;
+ OCIInd TableName;
+ OCIInd ColName;
+ OCIInd ColTypName;
+ OCIInd ColTypSchema;
+ OCIInd TablePartition;
+};
+typedef struct ODCIColInfo_ind ODCIColInfo_ind;
+
+struct ODCIFuncCallInfo
+{
+ struct ODCIColInfo ColInfo;
+};
+
+struct ODCIFuncCallInfo_ind
+{
+ struct ODCIColInfo_ind ColInfo;
+};
+
+struct ODCIIndexInfo
+{
+ OCIString* IndexSchema;
+ OCIString* IndexName;
+ ODCIColInfoList* IndexCols;
+ OCIString* IndexPartition;
+ OCINumber IndexInfoFlags;
+ OCINumber IndexParaDegree;
+};
+typedef struct ODCIIndexInfo ODCIIndexInfo;
+
+struct ODCIIndexInfo_ind
+{
+ OCIInd atomic;
+ OCIInd IndexSchema;
+ OCIInd IndexName;
+ OCIInd IndexCols;
+ OCIInd IndexPartition;
+ OCIInd IndexInfoFlags;
+ OCIInd IndexParaDegree;
+};
+typedef struct ODCIIndexInfo_ind ODCIIndexInfo_ind;
+
+struct ODCIPredInfo
+{
+ OCIString* ObjectSchema;
+ OCIString* ObjectName;
+ OCIString* MethodName;
+ OCINumber Flags;
+};
+typedef struct ODCIPredInfo ODCIPredInfo;
+
+struct ODCIPredInfo_ind
+{
+ OCIInd atomic;
+ OCIInd ObjectSchema;
+ OCIInd ObjectName;
+ OCIInd MethodName;
+ OCIInd Flags;
+};
+typedef struct ODCIPredInfo_ind ODCIPredInfo_ind;
+
+struct ODCIObject
+{
+ OCIString* ObjectSchema;
+ OCIString* ObjectName;
+};
+typedef struct ODCIObject ODCIObject;
+
+struct ODCIObject_ind
+{
+ OCIInd atomic;
+ OCIInd ObjectSchema;
+ OCIInd ObjectName;
+};
+typedef struct ODCIObject_ind ODCIObject_ind;
+
+struct ODCIQueryInfo
+{
+ OCINumber Flags;
+ ODCIObjectList* AncOps;
+};
+typedef struct ODCIQueryInfo ODCIQueryInfo;
+
+
+struct ODCIQueryInfo_ind
+{
+ OCIInd atomic;
+ OCIInd Flags;
+ OCIInd AncOps;
+};
+typedef struct ODCIQueryInfo_ind ODCIQueryInfo_ind;
+
+struct ODCIIndexCtx
+{
+ struct ODCIIndexInfo IndexInfo;
+ OCIString* Rid;
+ struct ODCIQueryInfo QueryInfo;
+};
+typedef struct ODCIIndexCtx ODCIIndexCtx;
+
+struct ODCIIndexCtx_ind
+{
+ OCIInd atomic;
+ struct ODCIIndexInfo_ind IndexInfo;
+ OCIInd Rid;
+ struct ODCIQueryInfo_ind QueryInfo;
+};
+typedef struct ODCIIndexCtx_ind ODCIIndexCtx_ind;
+
+struct ODCIFuncInfo
+{
+ OCIString* ObjectSchema;
+ OCIString* ObjectName;
+ OCIString* MethodName;
+ OCINumber Flags;
+};
+typedef struct ODCIFuncInfo ODCIFuncInfo;
+
+struct ODCIFuncInfo_ind
+{
+ OCIInd atomic;
+ OCIInd ObjectSchema;
+ OCIInd ObjectName;
+ OCIInd MethodName;
+ OCIInd Flags;
+};
+typedef struct ODCIFuncInfo_ind ODCIFuncInfo_ind;
+
+struct ODCICost
+{
+ OCINumber CPUcost;
+ OCINumber IOcost;
+ OCINumber NetworkCost;
+ OCIString* IndexCostInfo;
+};
+typedef struct ODCICost ODCICost;
+
+struct ODCICost_ind
+{
+ OCIInd atomic;
+ OCIInd CPUcost;
+ OCIInd IOcost;
+ OCIInd NetworkCost;
+ OCIInd IndexCostInfo;
+};
+typedef struct ODCICost_ind ODCICost_ind;
+
+struct ODCIArgDesc
+{
+ OCINumber ArgType;
+ OCIString* TableName;
+ OCIString* TableSchema;
+ OCIString* ColName;
+ OCIString* TablePartitionLower;
+ OCIString* TablePartitionUpper;
+ OCINumber Cardinality;
+};
+typedef struct ODCIArgDesc ODCIArgDesc;
+
+struct ODCIArgDesc_ind
+{
+ OCIInd atomic;
+ OCIInd ArgType;
+ OCIInd TableName;
+ OCIInd TableSchema;
+ OCIInd ColName;
+ OCIInd TablePartitionLower;
+ OCIInd TablePartitionUpper;
+ OCIInd Cardinality;
+};
+typedef struct ODCIArgDesc_ind ODCIArgDesc_ind;
+
+struct ODCIStatsOptions
+{
+ OCINumber Sample;
+ OCINumber Options;
+ OCINumber Flags;
+};
+typedef struct ODCIStatsOptions ODCIStatsOptions;
+
+struct ODCIStatsOptions_ind
+{
+ OCIInd atomic;
+ OCIInd Sample;
+ OCIInd Options;
+ OCIInd Flags;
+};
+typedef struct ODCIStatsOptions_ind ODCIStatsOptions_ind;
+
+struct ODCIEnv
+{
+ OCINumber EnvFlags;
+ OCINumber CallProperty;
+ OCINumber DebugLevel;
+ OCINumber CursorNum;
+};
+typedef struct ODCIEnv ODCIEnv;
+
+struct ODCIEnv_ind
+{
+ OCIInd _atomic;
+ OCIInd EnvFlags;
+ OCIInd CallProperty;
+ OCIInd DebugLevel;
+ OCIInd CursorNum;
+};
+typedef struct ODCIEnv_ind ODCIEnv_ind;
+
+struct ODCIPartInfo
+{
+ OCIString* TablePartition;
+ OCIString* IndexPartition;
+};
+typedef struct ODCIPartInfo ODCIPartInfo;
+
+struct ODCIPartInfo_ind
+{
+ OCIInd atomic;
+ OCIInd TablePartition;
+ OCIInd IndexPartition;
+};
+typedef struct ODCIPartInfo_ind ODCIPartInfo_ind;
+
+/*---------- External Tables ----------*/
+struct ODCIExtTableInfo
+{
+ OCIString* TableSchema;
+ OCIString* TableName;
+ ODCIColInfoList* RefCols;
+ OCIClobLocator* AccessParmClob;
+ OCIBlobLocator* AccessParmBlob;
+ ODCIArgDescList* Locations;
+ ODCIArgDescList* Directories;
+ OCIString* DefaultDirectory;
+ OCIString* DriverType;
+ OCINumber OpCode;
+ OCINumber AgentNum;
+ OCINumber GranuleSize;
+ OCINumber Flag;
+ OCINumber SamplePercent;
+ OCINumber MaxDoP;
+ OCIRaw* SharedBuf;
+ OCIString* MTableName;
+ OCIString* MTableSchema;
+ OCINumber TableObjNo;
+};
+typedef struct ODCIExtTableInfo ODCIExtTableInfo;
+
+struct ODCIExtTableInfo_ind
+{
+ OCIInd _atomic;
+ OCIInd TableSchema;
+ OCIInd TableName;
+ OCIInd RefCols;
+ OCIInd AccessParmClob;
+ OCIInd AccessParmBlob;
+ OCIInd Locations;
+ OCIInd Directories;
+ OCIInd DefaultDirectory;
+ OCIInd DriverType;
+ OCIInd OpCode;
+ OCIInd AgentNum;
+ OCIInd GranuleSize;
+ OCIInd Flag;
+ OCIInd SamplePercent;
+ OCIInd MaxDoP;
+ OCIInd SharedBuf;
+ OCIInd MTableName;
+ OCIInd MTableSchema;
+ OCIInd TableObjNo;
+};
+typedef struct ODCIExtTableInfo_ind ODCIExtTableInfo_ind;
+
+struct ODCIExtTableQCInfo
+{
+ OCINumber NumGranules;
+ OCINumber NumLocations;
+ ODCIGranuleList* GranuleInfo;
+ OCINumber IntraSourceConcurrency;
+ OCINumber MaxDoP;
+ OCIRaw* SharedBuf;
+};
+typedef struct ODCIExtTableQCInfo ODCIExtTableQCInfo;
+
+struct ODCIExtTableQCInfo_ind
+{
+ OCIInd _atomic;
+ OCIInd NumGranules;
+ OCIInd NumLocations;
+ OCIInd GranuleInfo;
+ OCIInd IntraSourceConcurrency;
+ OCIInd MaxDoP;
+ OCIInd SharedBuf;
+};
+typedef struct ODCIExtTableQCInfo_ind ODCIExtTableQCInfo_ind;
+
+/*********************************************************/
+/* Table Function Info types (used by ODCITablePrepare) */
+/*********************************************************/
+
+struct ODCITabFuncInfo
+{
+ ODCINumberList* Attrs;
+ OCIType* RetType;
+};
+typedef struct ODCITabFuncInfo ODCITabFuncInfo;
+
+struct ODCITabFuncInfo_ind
+{
+ OCIInd _atomic;
+ OCIInd Attrs;
+ OCIInd RetType;
+};
+typedef struct ODCITabFuncInfo_ind ODCITabFuncInfo_ind;
+
+/*********************************************************************/
+/* Table Function Statistics types (used by ODCIStatsTableFunction) */
+/*********************************************************************/
+
+struct ODCITabFuncStats
+{
+ OCINumber num_rows;
+};
+typedef struct ODCITabFuncStats ODCITabFuncStats;
+
+struct ODCITabFuncStats_ind
+{
+ OCIInd _atomic;
+ OCIInd num_rows;
+};
+typedef struct ODCITabFuncStats_ind ODCITabFuncStats_ind;
+
+/*---------------------------------------------------------------------------
+ PRIVATE TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ PRIVATE FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+
+#endif /* ODCI_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/oratypes.h b/src/terralib/drivers/OracleSpatial/OCI/include/oratypes.h
new file mode 100644
index 0000000..4cd47bb
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/oratypes.h
@@ -0,0 +1,307 @@
+/*
+ Copyright (c) 1982, 2003, Oracle. All rights reserved.
+*/
+
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/oratypes.h,v 1.3 2005/05/06 16:48:56 karine Exp $
+ */
+
+
+
+#ifndef ORATYPES
+# define ORATYPES
+# define SX_ORACLE
+# define SX3_ORACLE
+
+
+#ifndef ORASTDDEF
+# include <stddef.h>
+# define ORASTDDEF
+#endif
+
+#ifndef ORALIMITS
+# include <limits.h>
+# define ORALIMITS
+#endif
+
+
+#ifndef TRUE
+# define TRUE 1
+# define FALSE 0
+#endif
+
+
+#ifndef lint
+typedef unsigned char ub1;
+typedef signed char sb1;
+#else
+#define ub1 unsigned char
+#define sb1 signed char
+#endif
+
+#define UB1MAXVAL ((ub1)UCHAR_MAX)
+#define UB1MINVAL ((ub1) 0)
+#define SB1MAXVAL ((sb1)SCHAR_MAX)
+#define SB1MINVAL ((sb1)SCHAR_MIN)
+#define MINUB1MAXVAL ((ub1) 255)
+#define MAXUB1MINVAL ((ub1) 0)
+#define MINSB1MAXVAL ((sb1) 127)
+#define MAXSB1MINVAL ((sb1) -127)
+
+
+
+
+#ifndef lint
+typedef unsigned short ub2;
+typedef signed short sb2;
+#else
+#define ub2 unsigned short
+#define sb2 signed short
+#endif
+
+#define UB2MAXVAL ((ub2)USHRT_MAX)
+#define UB2MINVAL ((ub2) 0)
+#define SB2MAXVAL ((sb2) SHRT_MAX)
+#define SB2MINVAL ((sb2) SHRT_MIN)
+#define MINUB2MAXVAL ((ub2) 65535)
+#define MAXUB2MINVAL ((ub2) 0)
+#define MINSB2MAXVAL ((sb2) 32767)
+#define MAXSB2MINVAL ((sb2)-32767)
+
+
+
+
+#ifndef lint
+typedef unsigned int ub4;
+typedef signed int sb4;
+#else
+#define eb4 int
+#define ub4 unsigned int
+#define sb4 signed int
+#endif
+
+#define UB4MAXVAL ((ub4)UINT_MAX)
+#define UB4MINVAL ((ub4) 0)
+#define SB4MAXVAL ((sb4) INT_MAX)
+#define SB4MINVAL ((sb4) INT_MIN)
+#define MINUB4MAXVAL ((ub4) 4294967295)
+#define MAXUB4MINVAL ((ub4) 0)
+#define MINSB4MAXVAL ((sb4) 2147483647)
+#define MAXSB4MINVAL ((sb4)-2147483647)
+
+
+/* --- Signed/Unsigned eight-byte scalar (orasb8/oraub8) --- */
+
+#define ORAXB8_DEFINED
+#ifndef lint
+ typedef unsigned _int64 oraub8;
+ typedef signed _int64 orasb8;
+ typedef oraub8 ub8;
+ typedef orasb8 sb8;
+#else
+# define ub8 oraub8
+# define sb8 orasb8
+# define oraub8 unsigned _int64
+# define orasb8 signed _int64
+#endif /* !lint */
+
+#define ORAUB8MINVAL ((oraub8)0)
+#define ORAUB8MAXVAL ((oraub8)18446744073709551615)
+#define ORASB8MINVAL ((orasb8)-9223372036854775808)
+#define ORASB8MAXVAL ((orasb8) 9223372036854775807)
+
+#define MAXORAUB8MINVAL ((oraub8)0)
+#define MINORAUB8MAXVAL ((oraub8)18446744073709551615)
+#define MAXORASB8MINVAL ((orasb8)-9223372036854775807)
+#define MINORASB8MAXVAL ((orasb8) 9223372036854775807)
+
+
+#define UB1BITS CHAR_BIT
+#define UB1MASK ((1 << ((uword)CHAR_BIT)) - 1)
+
+
+#ifdef lint
+# define oratext unsigned char
+#else
+ typedef unsigned char oratext;
+#endif
+
+
+#ifndef lint
+typedef char eb1;
+typedef short eb2;
+typedef int eb4;
+#else
+# define eb1 char
+# define eb2 short
+# define eb4 int
+#endif
+
+#define EB1MAXVAL ((eb1)SCHAR_MAX)
+#define EB1MINVAL ((eb1) 0)
+#define MINEB1MAXVAL ((eb1) 127)
+#define MAXEB1MINVAL ((eb1) 0)
+#define EB2MAXVAL ((eb2) SHRT_MAX)
+#define EB2MINVAL ((eb2) 0)
+#define MINEB2MAXVAL ((eb2) 32767)
+#define MAXEB2MINVAL ((eb2) 0)
+#define EB4MAXVAL ((eb4) INT_MAX)
+#define EB4MINVAL ((eb4) 0)
+#define MINEB4MAXVAL ((eb4) 2147483647)
+#define MAXEB4MINVAL ((eb4) 0)
+
+
+
+
+#ifndef lint
+typedef sb1 b1;
+#else
+#define b1 sb1
+#endif
+#define B1MAXVAL SB1MAXVAL
+#define B1MINVAL SB1MINVAL
+
+#ifndef lint
+typedef sb2 b2;
+#else
+#define b2 sb2
+#endif
+#define B2MAXVAL SB2MAXVAL
+#define B2MINVAL SB2MINVAL
+
+#ifndef lint
+typedef sb4 b4;
+#else
+#define b4 sb4
+#endif
+# define B4MAXVAL SB4MAXVAL
+# define B4MINVAL SB4MINVAL
+
+
+#if !defined(LUSEMFC)
+# ifdef lint
+# define text unsigned char
+# else
+ typedef oratext text;
+# endif
+#endif
+
+#ifdef lint
+# define OraText unsigned char
+#else
+ typedef oratext OraText;
+#endif
+
+#ifndef lint
+typedef int eword;
+typedef unsigned int uword;
+typedef signed int sword;
+#else
+#define eword int
+#define uword unsigned int
+#define sword signed int
+#endif
+
+#define EWORDMAXVAL ((eword) INT_MAX)
+#define EWORDMINVAL ((eword) 0)
+#define UWORDMAXVAL ((uword)UINT_MAX)
+#define UWORDMINVAL ((uword) 0)
+#define SWORDMAXVAL ((sword) INT_MAX)
+#define SWORDMINVAL ((sword) INT_MIN)
+#define MINEWORDMAXVAL ((eword) 2147483647)
+#define MAXEWORDMINVAL ((eword) 0)
+#define MINUWORDMAXVAL ((uword) 4294967295)
+#define MAXUWORDMINVAL ((uword) 0)
+#define MINSWORDMAXVAL ((sword) 2147483647)
+#define MAXSWORDMINVAL ((sword) -2147483647)
+
+
+#ifdef _WIN64
+
+#ifndef lint
+typedef unsigned _int64 ubig_ora;
+typedef signed _int64 sbig_ora;
+#else
+#define ubig_ora unsigned _int64
+#define sbig_ora signed _int64
+#endif
+
+#define UBIG_ORAMAXVAL ((ubig_ora)_UI64_MAX)
+#define UBIG_ORAMINVAL ((ubig_ora) 0)
+#define SBIG_ORAMAXVAL ((sbig_ora) _I64_MAX)
+#define SBIG_ORAMINVAL ((sbig_ora) _I64_MIN)
+#define MINUBIG_ORAMAXVAL ((ubig_ora) 4294967295)
+#define MAXUBIG_ORAMINVAL ((ubig_ora) 0)
+#define MINSBIG_ORAMAXVAL ((sbig_ora) 2147483647)
+#define MAXSBIG_ORAMINVAL ((sbig_ora)-2147483647)
+
+#else
+
+#ifndef lint
+typedef unsigned long ubig_ora;
+typedef signed long sbig_ora;
+#else
+#define ubig_ora unsigned long
+#define sbig_ora signed long
+#endif
+
+#define UBIG_ORAMAXVAL ((ubig_ora)ULONG_MAX)
+#define UBIG_ORAMINVAL ((ubig_ora) 0)
+#define SBIG_ORAMAXVAL ((sbig_ora) LONG_MAX)
+#define SBIG_ORAMINVAL ((sbig_ora) LONG_MIN)
+#define MINUBIG_ORAMAXVAL ((ubig_ora) 4294967295)
+#define MAXUBIG_ORAMINVAL ((ubig_ora) 0)
+#define MINSBIG_ORAMAXVAL ((sbig_ora) 2147483647)
+#define MAXSBIG_ORAMINVAL ((sbig_ora)-2147483647)
+
+#endif /* _WIN64 */
+
+#define UBIGORABITS (UB1BITS * sizeof(ubig_ora))
+
+
+#undef CONST
+#define CONST const
+
+
+#define dvoid void
+
+
+typedef void (*lgenfp_t)( void );
+
+
+
+#ifndef ORASYS_TYPES
+# include <sys/types.h>
+# define ORASYS_TYPES
+#endif
+
+
+
+#ifndef boolean
+# define boolean int
+#endif
+
+
+
+#ifdef sparc
+# define SIZE_TMAXVAL SB4MAXVAL
+#else
+# define SIZE_TMAXVAL UB4MAXVAL
+#endif
+
+#define MINSIZE_TMAXVAL (size_t)4294967295
+
+
+#if !defined(MOTIF) && !defined(LISPL) && !defined(__cplusplus) && !defined(LUSEMFC)
+typedef oratext *string;
+#endif
+
+#ifndef lint
+typedef unsigned short utext;
+#else
+#define utext unsigned short
+#endif
+
+
+#endif
+
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ori.h b/src/terralib/drivers/OracleSpatial/OCI/include/ori.h
new file mode 100644
index 0000000..8a19577
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ori.h
@@ -0,0 +1,2094 @@
+/* Copyright (c) 1994, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ ORI - OCI navigational interface
+
+ DESCRIPTION
+
+ This section is intended to give a brief introduction to the navigational
+ interfaces. Readers can refer to the documents listed in the section
+ 'RELATED DOCUMENTS' for more information.
+
+ PURPOSE
+ The Oracle Call Interface (OCI) supports navigational access of objects.
+ In the navigational paradigm, data is represented as a graph of objects
+ connected by references. Objects in the graph are reached by following
+ the references.
+
+ OBJECT ENVIRONMENT
+
+ The object environment is initialized when the OCI environment handle is
+ initialized with the object option. An object environment contains a
+ heap which buffers type instances in memory. The object environment also
+ contains an object cache which keeps track of the objects in the object
+ environment. Readers can refer to the "Functional Specification for
+ Programmatic Interface" for more information about the object
+ environment.
+
+ INSTANCE, OBJECT AND VALUE
+
+ An OTS instance is an occurence of a type specified by the Oracle Type
+ System (OTS). This section describes how an OTS instance can be
+ represented in OCI. In OCI, an OTS instance can be classified based on
+ the type, the lifetime and referencability (see the figure below):
+
+ 1) A persistent object is an instance of an object type. A persistent
+ object resides in a row of a table in the server and can exist longer
+ than the duration of a session (connection). Persistent objects can be
+ identified by object references which contain the object identifiers.
+ A persistent object is obtained by pinning its object reference.
+
+ 2) A transient object is an instance of an object type. A transient
+ object cannot exist longer than the duration of a session, and it is
+ used to contain temporary computing results. Transient objects can
+ also be identified by references which contain transient object
+ identifiers.
+
+ 3) A value is an instance of an user-defined type (object type or
+ collection type) or any built-in OTS type. Unlike objects, values of
+ object types are identified by memory pointers, rather than by
+ references.
+
+ A value can be standalone or embbeded. A standalone value is usually
+ obtained by issuing a select statement. OCI also allows the client
+ program to select a row of object table into a value by issuing a SQL
+ statement. Thus, a referenceable object (in the database) can be
+ represented as a value (which cannot be identified by a reference).
+ A standalone value can also be an out-of-line attribute in an object
+ (e.g varchar, raw) or an out-of-line element in a collection (e.g.
+ varchar, raw, object).
+
+ An embedded value is phyiscally included in a containing instance.
+ An embedded value can be an in-line attribute in an object (e.g.
+ number, nested object) or an in-line element in a collection.
+
+ All values are considered to be transient by OCI, e.g. OCI does not
+ support automatic flushing a value to the database, and the client has
+ to explicitly execute a SQL statement to store a value into the
+ database. For embedded values, they are flushed when their containing
+ instance are flushed.
+
+
+ OTS instance
+ | |
+ v v
+ object value (type)
+ | |
+ v v
+ persistent transient (lifetime)
+
+
+ persistent obj transient obj value
+ ---------------------------------------------------------------
+ | | | | object type, |
+ | type | object type | object type | built-in, |
+ | | | | collection |
+ ---------------------------------------------------------------
+ | maximum | until object | session | session |
+ | lifetime | is deleted | | |
+ ---------------------------------------------------------------
+ | referencable | yes | yes | no |
+ ---------------------------------------------------------------
+ | embeddable | no | no | yes |
+ ---------------------------------------------------------------
+
+ REFERENCEABLE OBJECT, STANDALONE OBJECT, EMBEDDED OBJECT
+
+ In the reminding of this include file, the following term will be used:
+ 1) The term 'object' can be generally referred to a persistent object,
+ a transient object, a standalone value of object type, or an embedded
+ value of object type.
+ 2) The term 'referenceable object' refers to a persistent object or a
+ transient object.
+ 3) The term 'standalone object' refers to a persistent object, a
+ transient object or a standalone value of object type.
+ 4) The term 'embedded object' referes to a embbeded value of object
+ type.
+
+ META ATTRIBUTES
+
+ There is a set of meta-attributes that are defined for standalone
+ objects. A meta-attribute can be transient or persistent. A
+ transient meta-attribute is applicable to an instance only when it is
+ in memory. A persistent meta-attribute can be applicable to an instance
+ that is in the disk.
+
+ The set of user visible meta-attributes for persistent objects are:
+ 1) existent (persistent) : Does the object exist?
+ 2) nullness (persistent) : Null information of the instance
+ 3) locked (persistent) : Is the object locked?
+ 4) pinned (transient) : Is the object being accessed by the client?
+ 5) dirty (transient) : Has the object been modified?
+ 6) allocation duration (transient) : see below
+ 7) pin duration (transient) : see below
+
+ The set of user visible meta-attributes for transient objects are:
+ 1) existent (transient) : Does the object exist?
+ 2) nullness (transient) : Null information of the instance
+ 3) pinned (transient) : Is the object being accessed by the client?
+ 4) dirty (transient) : Has the object been modified?
+ 4) allocation duration (transient) : see below
+ 5) pin duration (transient) : see below
+
+ The set of user visible meta-attributes for standalone values of object
+ type or collections are:
+ 1) allocation duration (transient) : see below
+ 2) nullness (transient) : Null information of the instance
+ (of an object type)
+
+ NULLNESS OF AN INSTANCE
+
+ Each standalone object is associated with a null structure which keeps
+ the null information about the object. A null indicates the absence of
+ data. The null structure itself contains null indicators that represent:
+ 1) atomic nullness : a null value that pertains to the whole object
+ 2) null status of the individual attribute in the object
+
+ The layout of a null structure in memory resembles that of the object,
+ except that the null structure has additional indicators to represent
+ the atomic nullness for each object.
+
+ An non-existent object is different than an object that is atomically
+ null. A atomically null object is an existing object that has no data.
+
+ MEMORY LAYOUT OF AN OBJECT
+
+ A standalone object in memory is composed of a top level memory chunk,
+ a null structure and optionally, a number of secondary memory chunks.
+ For a DEPARTMENT object type,
+
+ OBJECT TYPE department
+ {
+ dep_name varchar2(20),
+ budget number,
+ manager person, /o person is an object type o/
+ employees collection of person
+ }
+
+ Each instance of DEPARTMENT will has a top level memory chunk which
+ contains the top level attributes such as dep_name, budget, manager and
+ employees. The attributes dep_name and employees are themselves pointers
+ to the additional memory (the secondary memory chunks). The secondary
+ memory is for the out-of-line attribute (e.g. varray).
+
+ CONSISTENCY MODEL
+
+ Each pin operation behaves like a distinct SQL select. Thus, the object
+ cache does not guarantee consistency for a graph of objects. In order to
+ retrieve a consistent graph of objects, the user has to explicitly start
+ a serializable transaction or a read-only transaction.
+
+ DURATION
+ In OCI, a duration is used to specify
+
+ 1) the length of memory allocation of an instance
+ When each instance is allocated, it is associate with an allocation
+ duration. The memory occupied by the object is freed automatically
+ at the end of its allocation duration. The allocation duration of an
+ instance cannot be changed.
+
+ 2) the length of pinning of an object
+ When each object is pinned, the client has to give a pin duration
+ which specify the length of time that the object is intended to be
+ used. It is an user error to specify a pin duration longer than an
+ allocation duration of the object. An object is completely unpinned
+ at the end of its pin duration (see OCIObjectUnpin()).
+
+ An OCI program can use the allocation duration and the pin duration to
+ automatically free the memory of the instances:
+ 1) Transient objects and values are freed at the end of the allocation
+ duration.
+ 2) Persistent objects ARE freed at the end of the allocation duration.
+ Persistent objects CAN be freed at the end of the pin duration when
+ the objects are completely unpinned. The persistent objects are said
+ to be aged out. See OCIObjectUnpin() for more details.
+
+ There are 3 predefined duration: session, transaction, call. The time
+ spans of these durations are defined based on the programming model
+ presented by OCI. The call duration is mapped to the transaction
+ duration in the client-side environment. See oro.h for the macros defined
+ for these 3 durations.
+
+ A pin duration can be promoted. For example, if an object is pinned with
+ duration 1, and the object is later pinned with duration 2, the pin
+ routine will try to find a duration that is longer or equal to the
+ length of both duration 1 and duration 2. The pin duration of the object
+ is set to the that duration. The object is automatically unpinned only
+ after both duration 1 and duration 2 are terminated.
+
+ RELATED DOCUMENTS
+ "Functional Specification for Oracle Object RDBMS"
+ "Functional Specification for Programmatic Interfaces"
+ "Functional Specification for the Oracle Type System (OTS)"
+
+ INSPECTION STATUS
+ Inspection date:
+ Inspection status:
+ Estimated increasing cost defects per page:
+ Rule sets:
+
+ ACCEPTANCE REVIEW STATUS
+ Review date:
+ Review status:
+ Reviewers:
+
+ PUBLIC FUNCTIONS
+ OCIObjectNew - OCI new a standalone instance
+ OCIObjectPin - OCI pin an object by reference
+ OCIObjectUnpin - OCI unpin a referenceable object
+ OCIObjectPinCountReset - OCI reset the pin count of a referenceable object
+ OCIObjectLock - OCI lock a persistent object
+ OCIObjectLockNoWait - OCI lock a persistent object
+ OCIObjectMarkUpdate - OCI mark a referenceable object as updated
+ OCIObjectUnmark - OCI unmark a dirtied referenceable object
+ OCIObjectUnmarkByRef - OCI unmark a dirtied object by reference
+ OCIObjectFree - OCI free a standalone instance
+ OCIObjectMarkDelete - OCI mark a referenceable object as deleted
+ OCIObjectMarkDeleteByRef - OCI mark a referenceable object as deleted by
+ giving a reference
+ OCIObjectFlush - OCI flush a persistent object
+ OCIObjectRefresh - OCI refresh a persistent object
+ OCIObjectCopy - OCI CoPy one object to another
+ OCIObjectGetTypeRef - OCI get the Type Reference of a standalone object
+ OCIObjectGetObjectRef - OCI get the Object's Reference
+ OCIObjectGetInd - OCI get Null Structure of an standalone object
+ OCIObjectExists - OCI get the existence of a referenceable object
+ OCIObjectGetProperty - get object property
+ OCIObjectIsLocked - OCI get the lock status of a referenceable object
+ OCIObjectIsDirty - OCI get the dirty status of a referenceable object
+ OCIObjectPinTable - OCI get Table object
+ OCIObjectArrayPin - OCI pin array of objects
+ OCIObjectGetPrimayKeyTypeRef - OCI get the Ref for the primary key OID's
+ type
+ OCIObjectMakeObjectRef - OCI Create a pk or sys generated REF
+
+ OCIObjectGetNewOID - OCI Create a new Object ID
+
+ OCICacheFlush - OCI flsuh the modified persistent objects in the cache
+ OCICacheRefresh - OCI refresh persistent objects in the cache
+ OCICacheUnpin - OCI unpin referenceable objects in the cache
+ OCICacheFree - OCI free all instances in the environment
+ OCICacheUnmark - OCI unmark all dirty referenceable objects in the cache
+
+ PRIVATE FUNCTIONS
+ None
+
+ EXAMPLES
+
+ The following types will be used in the examples in this section:
+
+ OBJECT TYPE professor
+ (
+ varchar2 name;
+ number department;
+ number num_of_students;
+ );
+
+ OBJECT TYPE course
+ (
+ varchar2 name;
+ number grade;
+ );
+
+ OBJECT TYPE student
+ (
+ vstring name;
+ number department;
+ ref advisor; /o advisor is a professor o/
+ collection courses;
+ );
+
+ EXAMPLE 1
+
+ Here is a set of examples to illustrate the usages of some of the
+ orio and oric functions.
+
+ OCIenv *env; /o OCI environment handle o/
+ OCIError *err; /o OCI error handle o/
+ OCISvcCtx *svc; /o OCI service handle o/
+
+ dvoid *stu_tbl; /o pointer to the student table o/
+ OCIType *stu_tdo; /o student type tdo o/
+
+ OCIRef *stu2_ref; /o object reference to student object o/
+ student *stu1; /o pointer to the student object o/
+ student *stu2; /o pointer to the student object o/
+ professor *pro; /o pointer to the professor object o/
+
+ /o Initialize the OCI environment handle, error handle and service
+ handle and login to the database o/
+ ...
+
+ /o CREATE A PERSISTENT OBJECT o/
+
+ /o get the table object of student o/
+ if (OCIObjectPinTable(env, err, svc, "ORACLEU", sizeof("ORACLEU"),
+ "STUDENT_TABLE", sizeof("STUDENT_TABLE"), (OCIRef *)0,
+ OCI_DURATION_NULL, &stu_tbl) != OCI_SUCCESS)
+ /o error handling code o/
+
+ /o get type object of student o/
+ if (OCITypeByName(env, err, svc, "ORACLEU", sizeof("ORACLEU"),
+ "STUDENT", sizeof("STUDENT"), OCI_DURATION_NULL, OCI_TYPEGET_HEADER,
+ &stu_tdo) != OCI_SUCCESS)
+ /o error handling code o/
+
+ /o create a persistent object 'mark' (of type student) o/
+ if (OCIObjectNew(env, err, svc, OCI_TYPECODE_ADT, stu_tdo, stu_tbl,
+ OCI_DURATION_TRANS, (ub1)FALSE, (dvoid **)&stu1) != OCI_SUCCESS)
+ /o error handling code o/
+
+ /o RETRIEVE OBJECTS IN PERSISTENT STORES o/
+
+ /o Use OCI to retrieve a reference to student object 'joe'.
+ o The retrieved reference is bound to the variable stu2_ref.
+ o/
+
+ /o pin/retrieve the student "joe" by reference o/
+ if (OCIObjectPin(env, err, &stu2_ref, (OCIComplexObject *)0, OCI_PIN_ANY,
+ OCI_DURATION_TRANS, OCI_LOCK_X, &stu2) != OCI_SUCCESS)
+ /o error handling code o/
+
+ /o pin/retrieve the advisor of student "joe" by reference o/
+ if (OCIObjectPin(env, err, &stu2->advisor, (OCIComplexObject *)0,
+ OCI_PIN_ANY, OCI_DURATION_TRANS, OCI_LOCK_X, &pro) != OCI_SUCCESS)
+ /o error handling code o/
+
+ /o MODIFY OBJECTS o/
+
+ /o initialize the newly created object "mark" o/
+ DISCARD OCIStringAssignText(env, err, "mark", sizeof("mark"),
+ &stu1->name);
+ department = 522;
+ DISCARD OCINumberFromInt(err, &department, sizeof(department),
+ OCI_NUMBER_UNSIGNED, &stu1->department);
+
+ /o assign advisor to student "mark" o/
+ DISCARD OCIRefAssign(env, err, &stu2->advisor, &stu1->advisor);
+
+ /o update student "joe". o/
+ department = 533;
+ DISCARD OCINumberFromInt(err, &department, sizeof(department),
+ OCI_NUMBER_UNSIGNED, &stu2->department);
+ DISCARD OCIObjectMarkUpdate(env, err, stu2);
+
+ /o UNPIN OBJECTS AFTER FINSIHED PROCESSING THEM o/
+
+ /o unpin the student object "mark" o/
+ if (OCIObjectUnpin(env, err, stu1) != OCI_SUCCESS)
+ /o error handling code o/
+
+ /o unpin the student object "joe" o/
+ if (OCIObjectUnpin(env, err, stu2) != OCI_SUCCESS)
+ /o error handling code o/
+
+ /o unpin the professor object o/
+ if (OCIObjectUnpin(env, err, pro) != OCI_SUCCESS)
+ /o error handling code o/
+
+ /o unpin the type object o/
+ if (OCIObjectUnpin(env, err, stu_tdo) != OCI_SUCCESS)
+ /o error handling code o/
+
+ /o unpin the table object o/
+ if (OCIObjectUnpin(env, err, stu_tbl) != OCI_SUCCESS)
+ /o error handling code o/
+
+ /o FLUSH MODIFIED OBJECTS BACK TO PERSISTENT STORE o/
+
+ if (OCICacheFlush(env, err, svc, (dvoid *)0, ((OCIRef*)(*)())0,
+ (OCIRef *)0) != OCI_SUCCESS)
+ /o error handling code o/
+
+ /o commit transaction o/
+
+ END OF EXAMPLE 1
+
+ NOTES
+ This file has been subsetted to contain only the routines that will
+ be in the first release.
+
+ MODIFIED
+ srseshad 03/12/03 - convert oci public api to ansi
+ aahluwal 06/03/02 - bug 2360115
+ bpalaval 02/09/01 - Change text to oratext.
+ rkasamse 06/21/00 - add ociobjectgetnewoid
+ rkasamse 05/24/00 - add OCIObjectSetData
+ whe 09/01/99 - 976457:check __cplusplus for C++ code
+ smuralid 10/29/98 - add comments for OCIObjectMakeObjectRef
+ mkrishna 08/19/98 - change OCIGetPkTypeRef to OCIObjectGetPrimaryKeyTypeR
+ mkrishna 08/10/98 - add OCIObjectMakeObjectRef & OCIObjectGetPkTypeRef
+ rkasamse 06/22/98 - add comments for OCIDurationBegin(End)
+ pmitra 04/01/98 - OCIObjectLockNoWait added
+ pmitra 11/05/97 - [573769] OCIObjectArrayPin pos parameter cannot be NU
+ cxcheng 07/29/97 - fix compile for short names
+ skrishna 07/14/97 - add OCIObjectGetProperty
+ skrishna 04/30/97 - OCIObjectFlushRefresh: remove duplicate declaration
+ skrishna 04/24/97 - flag unsupported functions
+ sthakur 03/20/97 - modify flag argument to OCIObjectFree
+ skrishna 03/18/97 - fix ifdef for supporting ansi and k&r proto-types
+ cxcheng 02/19/97 - remove short names support
+ cxcheng 02/06/97 - take out short name support except with SLSHORTNAME
+ sthakur 12/20/96 - fix a typepo in OCIOBjectArrayPin
+ jboonleu 11/07/96 - modify comments
+ cxcheng 10/28/96 - more beautification changes
+ jboonleu 10/24/96 - add flag to OCIObjectFree
+ jboonleu 10/22/96 - change interface of OCICacheFlush
+ cxcheng 10/18/96 - rename OCIObjectPinArray to OCIObjectArrayPin
+ cxcheng 10/14/96 - more renaming of types
+ jboonleu 10/09/96 - add new interfaces
+ cxcheng 10/09/96 - more lint fixes
+ cxcheng 10/08/96 - more lint fixes
+ jboonleu 09/27/96 - fix lint errors
+ jboonleu 10/07/96 - beautify ori.h after conversion to long names
+ cxcheng 10/04/96 - replace short names with long names
+ sthakur 08/20/96 - add COR context to OCIObjectPin
+ mluong 07/17/96 - add back orioglk, oriogdr, oriogiv, and oriocur.
+ jboonleu 07/17/96 - rename refresh option to conherency option
+ jboonleu 07/16/96 - change comment for cache consistency
+ jwijaya 07/03/96 - add ANSI prototypes
+ jboonleu 06/12/96 - update comment
+ jboonleu 05/08/96 - change description of OCIDurationGetParent
+ jboonleu 05/01/96 - add OROOCOSFN
+ skrishna 04/08/96 - change ori*() to take OCIEnv* and OCIError* instead
+ of oroenv*
+ jboonleu 01/04/96 - interface change
+ jboonleu 10/24/95 - support of variable ref
+ jboonleu 02/15/95 - new interface
+ sthakur 01/05/95 - pass username to origrgc
+ skotsovo 12/07/94 - update example
+ jwijaya 11/15/94 - rename ORONSPTAB to ORONSPEXT
+ jwijaya 10/06/94 - add namespace to oriopnm()
+ jwijaya 10/02/94 - connection handle -> connection number
+ jboonleu 08/16/94 - fix lint errors
+ jboonleu 07/20/94 - change interface of OCICacheFlush
+ tanguyen 07/18/94 - add oriocpe, change OCIObjectCopy to oriocps
+ tcheng 07/15/94 - add init param maximum_sga_heap_size
+ tcheng 07/13/94 - change origini to get param string
+ jboonleu 07/05/94 - change sccs string from sccid to a comment
+ jboonleu 07/01/94 - Add examples to ORIO* and ORIC* functions
+ tanguyen 06/30/94 - Fix the ORI_ORACLE ifdef
+ skotsovo 06/27/94 - include all public functions in public functions
+ list at top of header file
+ tcheng 06/27/94 - modify comments according to new template
+ tanguyen 06/24/94 - fix comments for OCIObjectCopy
+ tcheng 06/24/94 - fix comments in origrgc()
+ tanguyen 06/21/94 - fix comments and format
+ tcheng 06/20/94 - commenting origini/trm/err/rgc/urg() functions
+ tanguyen 06/16/94 - fix descriptions of ref operations
+ tanguyen 06/16/94 - clarifies refs comparison
+ tanguyen 05/12/94 - adds more interfaces (OCIObjectMarkUpdate)
+ jwijaya 05/10/94 - fix examples, add origurg, change origcon to origrgc
+ tanguyen 05/03/94 - remove unnecessary 'type' argument from
+ 'OCIObjectCopy'
+ tanguyen 03/08/94 - clarifies comments
+ jwijaya 02/16/94 - more questions
+ jwijaya 02/11/94 - more comments
+ jwijaya 02/10/94 - identify optional arguments
+ jwijaya 02/07/94 - Creation
+*/
+
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+#ifndef ORI_ORACLE
+#define ORI_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/* SHORT NAMES SUPPORT SECTION */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+ with the SLSHORTNAME defined.
+ With this all subsequent long names will actually be substituted with
+ the short names here */
+
+#define OCIDurationBegin origbgu
+#define OCIDurationEnd origedu
+#define OCIDurationGetParent origpdr
+#define OCICacheFlushRefresh oricfrh
+#define OCICacheUnpin oricunp
+#define OCICacheFree oricfre
+#define OCICacheUnmark oricumk
+#define OCICacheGetObjects oricgpr
+#define OCICacheRegister oricscb
+#define OCIObjectUnpin oriounp
+#define OCIObjectPinCountReset orioupz
+#define OCIObjectLock oriolck
+#define OCIObjectLockNoWait oriolnw
+#define OCIObjectMarkUpdate orioupd
+#define OCIObjectUnmark orioumk
+#define OCIObjectUnmarkByRef orioumr
+#define OCIObjectAlwaysLatest oriomkl
+#define OCIObjectNotAlwaysLatest oriouml
+#define OCIObjectMarkDeleteByRef oriordl
+#define OCIObjectMarkDelete oriopdl
+#define OCIObjectFlush oriofls
+#define OCIObjectFlushRefresh oriofrh
+#define OCIObjectCopy oriocpy
+#define OCIObjectGetTypeRef oriogtr
+#define OCIObjectGetObjectRef oriogor
+#define OCIObjectGetInd oriogns
+#define OCIObjectExists oriogex
+#define OCIObjectGetProperty oriogpr
+#define OCIObjectRefresh oriorfs
+#define OCIObjectPinTable oriogtb
+#define OCIObjectGetPrimaryKeyTypeRef oriogpf
+#define OCIObjectMakeObjectRef oriomrf
+
+#define OCIObjectNew orionew
+#define OCIObjectPin oriopin
+#define OCIObjectFree oriofre
+#define OCIObjectArrayPin orioapn
+#define OCIObjectIsDirty oriodrt
+#define OCIObjectIsDirtied oriodrd
+#define OCIObjectIsLoaded orioldd
+#define OCICacheFlush oricfls
+#define OCICacheRefresh oricrfs
+
+#endif /* SLSHORTNAME */
+
+/*---------------------------------------------------------------------------*/
+/* PUBLIC TYPES AND CONSTANTS */
+/*---------------------------------------------------------------------------*/
+
+/* Also see oro.h. */
+
+/*---------------------------------------------------------------------------*/
+/* PUBLIC FUNCTIONS */
+/*---------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/* OBJECT/INSTANCE OPERATIONS */
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- OCIObjectNew ----------------------------------*/
+sword OCIObjectNew( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+ OCITypeCode typecode, OCIType *tdo, dvoid *table,
+ OCIDuration duration, boolean value,
+ dvoid **instance );
+/*
+ NAME: OCIObjectNew - OCI new (create) a standalone instance
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ svc (IN) - OCI service handle.
+ typecode (IN) - the typecode of the type of the instance.
+ tdo (IN, optional) - pointer to the type descriptor object. The
+ TDO describes the type of the instance that is to be
+ created. Refer to OCITypeByName() for obtaining a TDO.
+ The TDO is required for creating a named type (e.g. an
+ object or a collection).
+ table (IN, optional) - pointer to a table object which specifies a
+ table in the server. This parameter can be set to NULL
+ if no table is given. See the description below to find
+ out how the table object and the TDO are used together
+ to determine the kind of instances (persistent,
+ transient, value) to be created. Also see
+ OCIObjectPinTable() for retrieving a table object.
+ duration (IN) - this is an overloaded parameter. The use of this
+ parameter is based on the kind of the instance that is
+ to be created.
+ a) persistent object. This parameter specifies the
+ pin duration.
+ b) transient object. This parameter specififes the
+ allocation duration and pin duration.
+ c) value. This parameter specifies the allocation
+ duration.
+ value (IN) - specifies whether the created object is a value.
+ If TRUE, then a value is created. Otherwise, a
+ referenceable object is created. If the instance is
+ not an object, then this parameter is ignored.
+ instance (OUT) - address of the newly created instance
+
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ DESCRIPTION:
+ This function creates a new instance of the type specified by the
+ typecode or the TDO. Based on the parameters 'typecode' (or 'tdo'),
+ 'value' and 'table', different kinds of instances can be created:
+
+ The parameter 'table' is not NULL?
+
+ yes no
+ ----------------------------------------------------------------
+ | object type (value=TRUE) | value | value |
+ ----------------------------------------------------------------
+ | object type (value=FALSE) | persistent obj | transient obj |
+ type ----------------------------------------------------------------
+ | built-in type | value | value |
+ ----------------------------------------------------------------
+ | collection type | value | value |
+ ----------------------------------------------------------------
+
+ This function allocates the top level memory chunk of an OTS instance.
+ The attributes in the top level memory are initialized (e.g. an
+ attribute of varchar2 is initialized to a vstring of 0 length).
+
+ If the instance is an object, the object is marked existed but is
+ atomically null.
+
+ FOR PERSISTENT OBJECTS:
+ The object is marked dirty and existed. The allocation duration for
+ the object is session. The object is pinned and the pin duration is
+ specified by the given parameter 'duration'.
+
+ FOR TRANSIENT OBJECTS:
+ The object is pinned. The allocation duration and the pin duration are
+ specified by the given parameter 'duration'.
+
+ FOR VALUES:
+ The allocation duration is specified by the given parameter 'duration'.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCIObjectPin ----------------------------------*/
+sword OCIObjectPin( OCIEnv *env, OCIError *err, OCIRef *object_ref,
+ OCIComplexObject *corhdl, OCIPinOpt pin_option,
+ OCIDuration pin_duration,
+ OCILockOpt lock_option, dvoid **object );
+/*
+ NAME: OCIObjectPin - OCI pin a referenceable object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ object_ref (IN) - the reference to the object.
+ corhdl (IN) - handle for complex object retrieval.
+ pin_option (IN) - See description below.
+ pin_duration (IN) - The duration of which the object is being accesed
+ by a client. The object is implicitly unpinned at
+ the end of the pin duration.
+ If OCI_DURATION_NULL is passed, there is no pin
+ promotion if the object is already loaded into
+ the cache. If the object is not yet loaded, then
+ the pin duration is set to OCI_DURATION_DEFAULT.
+ lock_option (IN) - lock option (e.g., exclusive). If a lock option
+ is specified, the object is locked in the server.
+ See 'oro.h' for description about lock option.
+ object (OUT) - the pointer to the pinned object.
+
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ DESCRIPTION:
+
+ This function pins a referenceable object instance given the object
+ reference. The process of pinning serves three purposes:
+
+ 1) locate an object given its reference. This is done by the object
+ cache which keeps track of the objects in the object heap.
+
+ 2) notify the object cache that an object is being in use. An object
+ can be pinned many times. A pinned object will remain in memory
+ until it is completely unpinned (see OCIObjectUnpin()).
+
+ 3) notify the object cache that a persistent object is being in use
+ such that the persistent object cannot be aged out. Since a
+ persistent object can be loaded from the server whenever is needed,
+ the memory utilization can be increased if a completely unpinned
+ persistent object can be freed (aged out), even before the
+ allocation duration is expired.
+
+ Also see OCIObjectUnpin() for more information about unpinning.
+
+ FOR PERSISTENT OBJECTS:
+
+ When pinning a persistent object, if it is not in the cache, the object
+ will be fetched from the persistent store. The allocation duration of
+ the object is session. If the object is already in the cache, it is
+ returned to the client. The object will be locked in the server if a
+ lock option is specified.
+
+ This function will return an error for a non-existent object.
+
+ A pin option is used to specify the copy of the object that is to be
+ retrieved:
+
+ 1) If option is OCI_PIN_ANY (pin any), if the object is already
+ in the environment heap, return this object. Otherwise, the object
+ is retrieved from the database. This option is useful when the
+ client knows that he has the exclusive access to the data in a
+ session.
+
+ 2) If option is OCI_PIN_LATEST (pin latest), if the object is
+ not cached, it is retrieved from the database. If the object is
+ cached, it is refreshed with the latest version. See
+ OCIObjectRefresh() for more information about refreshing.
+
+ 3) If option is OCI_PIN_RECENT (pin recent), if the object is loaded
+ into the cache in the current transaction, the object is returned.
+ If the object is not loaded in the current transaction, the object
+ is refreshed from the server.
+
+ FOR TRANSIENT OBJECTS:
+
+ This function will return an error if the transient object has already
+ been freed. This function does not return an error if an exclusive
+ lock is specified in the lock option.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*------------------------------ OCIObjectUnpin -----------------------------*/
+sword OCIObjectUnpin( OCIEnv *env, OCIError *err, dvoid *object );
+/*
+ NAME: OCIObjectUnpin - OCI unpin a referenceable object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by
+ calling OCIErrorGet().
+ object (IN) - pointer to an object
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The specified object must be pinned.
+ DESCRIPTION:
+ This function unpins an object. An object is completely unpinned when
+ 1) the object was unpinned N times after it has been pinned N times
+ (by calling OCIObjectPin()).
+ 2) it is the end of the pin duration
+ 3) the function OCIObjectPinCountReset() is called
+
+ There is a pin count associated with each object which is incremented
+ whenever an object is pinned. When the pin count of the object is zero,
+ the object is said to be completely unpinned. An unpinned object can
+ be freed without error.
+
+ FOR PERSISTENT OBJECTS:
+ When a persistent object is completely unpinned, it becomes a candidate
+ for aging. The memory of an object is freed when it is aged out. Aging
+ is used to maximize the utilization of memory. An dirty object cannot
+ be aged out unless it is flushed.
+
+ FOR TRANSIENT OBJECTS:
+ The pin count of the object is decremented. A transient can be freed
+ only at the end of its allocation duration or when it is explicitly
+ deleted by calling OCIObjectFree().
+
+ FOR VALUE:
+ This function will return an error for value.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*---------------------------- OCIObjectPinCountReset -----------------------*/
+sword OCIObjectPinCountReset( OCIEnv *env, OCIError *err, dvoid *object );
+/*
+ NAME: OCIObjectPinCountReset - OCI resets the pin count of a referenceable
+ object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by
+ calling OCIErrorGet().
+ object (IN) - pointer to an object
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The specified object must be pinned.
+ DESCRIPTION:
+ This function completely unpins an object. When an object is
+ completely unpinned, it can be freed without error.
+
+ FOR PERSISTENT OBJECTS:
+ When a persistent object is completely unpinned, it becomes a candidate
+ for aging. The memory of an object is freed when it is aged out. Aging
+ is used to maximize the utilization of memory. An dirty object cannot
+ be aged out unless it is flushed.
+
+ FOR TRANSIENT OBJECTS:
+ The pin count of the object is decremented. A transient can be freed
+ only at the end of its allocation duration or when it is explicitly
+ freed by calling OCIObjectFree().
+
+ FOR VALUE:
+ This function will return an error for value.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCIObjectLock ---------------------------------*/
+sword OCIObjectLock( OCIEnv *env, OCIError *err, dvoid *object );
+/*
+ NAME: OCIObjectLock - OCI lock a persistent object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by
+ calling OCIErrorGet().
+ object (IN) - pointer to the persistent object
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The specified object must be pinned.
+ DESCRIPTION:
+ This function locks a persistent object at the server. Unlike
+ OCIObjectLockNoWait() this function waits if another user currently
+ holds a lock on the desired object. This function
+ returns an error if:
+ 1) the object is non-existent.
+
+ This function will return an error for transient objects and values.
+ The lock of an object is released at the end of a transaction.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+*/
+
+/*------------------------ OCIObjectLockNoWait ------------------------------*/
+sword OCIObjectLockNoWait( OCIEnv *env, OCIError *err, dvoid *object );
+/*
+ NAME: OCIObjectLockNoWait - OCI lock a persistent object, do not wait for
+ the lock, return error if lock not available
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by
+ calling OCIErrorGet().
+ object (IN) - pointer to the persistent object
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The specified object must be pinned.
+ DESCRIPTION:
+ This function locks a persistent object at the server. Unlike
+ OCIObjectLock() this function will not wait if another user holds
+ the lock on the desired object. This function returns an error if:
+ 1) the object is non-existent.
+ 2) the object is currently locked by another user in which
+ case this function returns with an error.
+
+ This function will return an error for transient objects and values.
+ The lock of an object is released at the end of a transaction.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+*/
+
+/*--------------------------- OCIObjectMarkUpdate ---------------------------*/
+sword OCIObjectMarkUpdate( OCIEnv *env, OCIError *err, dvoid *object );
+/*
+ NAME: OCIObjectMarkUpdate - OCI marks an object as updated
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by
+ calling OCIErrorGet().
+ object (IN) - pointer to the persistent object
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The specified object must be pinned.
+ DESCRIPTION:
+ FOR PERSISTENT OBJECTS:
+ This function marks the specified persistent object as updated. The
+ persistent objects will be written to the server when the object cache
+ is flushed. The object is not locked or flushed by this function. It
+ is an error to update a deleted object.
+
+ After an object is marked updated and flushed, this function must be
+ called again to mark the object as updated if it has been dirtied
+ after it is being flushed.
+
+ FOR TRANSIENT OBJECTS:
+ This function marks the specified transient object as updated. The
+ transient objects will NOT be written to the server. It is an error
+ to update a deleted object.
+
+ FOR VALUES:
+ It is an no-op for values.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*----------------------------- OCIObjectUnmark -----------------------------*/
+sword OCIObjectUnmark( OCIEnv *env, OCIError *err, dvoid *object );
+/*
+ NAME: OCIObjectUnmark - OCI unmarks an object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by
+ calling OCIErrorGet().
+ object (IN) - pointer to the persistent object
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The specified object must be pinned.
+ DESCRIPTION:
+ FOR PERSISTENT OBJECTS AND TRANSIENT OBJECTS:
+ This function unmarks the specified persistent object as dirty. Changes
+ that are made to the object will not be written to the server. If the
+ object is marked locked, it remains marked locked. The changes that
+ have already made to the object will not be undone implicitly.
+
+ FOR VALUES:
+ It is an no-op for values.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*----------------------------- OCIObjectUnmarkByRef ------------------------*/
+sword OCIObjectUnmarkByRef( OCIEnv *env, OCIError *err, OCIRef *ref );
+/*
+ NAME: OCIObjectUnmarkByRef - OCI unmarks an object by Ref
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by
+ calling OCIErrorGet().
+ ref (IN) - reference of the object
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The specified object must be pinned.
+ DESCRIPTION:
+ FOR PERSISTENT OBJECTS AND TRANSIENT OBJECTS:
+ This function unmarks the specified persistent object as dirty. Changes
+ that are made to the object will not be written to the server. If the
+ object is marked locked, it remains marked locked. The changes that
+ have already made to the object will not be undone implicitly.
+
+ FOR VALUES:
+ It is an no-op for values.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCIObjectFree ---------------------------------*/
+sword OCIObjectFree( OCIEnv *env, OCIError *err, dvoid *instance,
+ ub2 flags );
+/*
+ NAME: OCIObjectFree - OCI free (and unpin) an standalone instance
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ instance (IN) - pointer to a standalone instance.
+ flags (IN) - If OCI_OBJECT_FREE_FORCE is set, free the object
+ even if it is pinned or dirty.
+ If OCI_OBJECT_FREE_NONULL is set, the null
+ structure will not be freed.
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The instance to be freed must be standalone.
+ - If the instance is a referenceable object, the object must be pinned.
+ DESCRIPTION:
+ This function deallocates all the memory allocated for an OTS instance,
+ including the null structure.
+
+ FOR PERSISTENT OBJECTS:
+ This function will return an error if the client is attempting to free
+ a dirty persistent object that has not been flushed. The client should
+ either flush the persistent object or set the parameter 'flag' to
+ OCI_OBJECT_FREE_FORCE.
+
+ This function will call OCIObjectUnpin() once to check if the object
+ can be completely unpin. If it succeeds, the rest of the function will
+ proceed to free the object. If it fails, then an error is returned
+ unless the parameter 'flag' is set to OCI_OBJECT_FREE_FORCE.
+
+ Freeing a persistent object in memory will not change the persistent
+ state of that object at the server. For example, the object will
+ remain locked after the object is freed.
+
+ FOR TRANSIENT OBJECTS:
+
+ This function will call OCIObjectUnpin() once to check if the object
+ can be completely unpin. If it succeeds, the rest of the function will
+ proceed to free the object. If it fails, then an error is returned
+ unless the parameter 'flag' is set to OCI_OBJECT_FREE_FORCE.
+
+ FOR VALUES:
+ The memory of the object is freed immediately.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+*/
+
+/*----------------------- OCIObjectMarkDeleteByRef --------------------------*/
+sword OCIObjectMarkDeleteByRef( OCIEnv *env, OCIError *err,
+ OCIRef *object_ref);
+/*
+ NAME: OCIObjectMarkDeleteByRef - OCI "delete" (and unpin) an object given
+ a reference
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ object_ref (IN) - ref of the object to be deleted
+
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ DESCRIPTION:
+ This function marks the object designated by 'object_ref' as deleted.
+
+ FOR PERSISTENT OBJECTS:
+ If the object is not loaded, then a temporary object is created and is
+ marked deleted. Otherwise, the object is marked deleted.
+
+ The object is deleted in the server when the object is flushed.
+
+ FOR TRANSIENT OBJECTS:
+ The object is marked deleted. The object is not freed until it is
+ unpinned.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCIObjectMarkDelete ---------------------------*/
+sword OCIObjectMarkDelete( OCIEnv *env, OCIError *err, dvoid *instance );
+/*
+ NAME: OCIObjectMarkDelete - OCI "delete" an instance given a Pointer
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ instance (IN) - pointer to the instance
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The instance must be standalone.
+ - If the instance is a referenceable object, then it must be pinned.
+ DESCRIPTION:
+
+ FOR PERSISTENT OBJECTS:
+ The object is marked deleted. The memory of the object is not freed.
+ The object is deleted in the server when the object is flushed.
+
+ FOR TRANSIENT OBJECTS:
+ The object is marked deleted. The memory of the object is not freed.
+
+ FOR VALUES:
+ This function frees a value immediately.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*---------------------------- OCIObjectFlush -------------------------------*/
+sword OCIObjectFlush( OCIEnv *env, OCIError *err, dvoid *object );
+/*
+ NAME: OCIObjectFlush - OCI flush a persistent object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ object (IN) - pointer to the persistent object
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The specified object must be pinned.
+ DESCRIPTION:
+ This function flushes a modified persistent object to the server.
+ An exclusive lock is obtained implicitly for the object when flushed.
+
+ When the object is written to the server, triggers may be fired.
+ Objects can be modified by the triggers at the server. To keep the
+ objects in the object cache being coherent with the database, the
+ clients can free or refresh the objects in the cache.
+
+ This function will return an error for transient objects and values.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*------------------------ OCIObjectRefresh ---------------------------------*/
+sword OCIObjectRefresh( OCIEnv *env, OCIError *err, dvoid *object );
+/*
+ NAME: OCIObjectRefresh - OCI refresh a persistent object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ object (IN) - pointer to the persistent object
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The specified object must be pinned.
+ DESCRIPTION:
+ This function refreshes an unmarked object with data retrieved from the
+ latest snapshot in the server. An object should be refreshed when the
+ objects in the cache are inconsistent with the objects at
+ the server:
+ 1) When an object is flushed to the server, triggers can be fired to
+ modify more objects in the server. The same objects (modified by
+ the triggers) in the object cache become obsolete.
+ 2) When the user issues a SQL or executes a PL/SQL procedure to modify
+ any object in the server, the same object in the cache becomes
+ obsolete.
+
+ The object that is refreshed will be 'replaced-in-place'. When an
+ object is 'replaced-in-place', the top level memory of the object will
+ be reused so that new data can be loaded into the same memory address.
+ The top level memory of the null structre is also reused. Unlike the
+ top level memory chunk, the secondary memory chunks may be resized and
+ reallocated. The client should be careful when holding onto a pointer
+ to the secondary memory chunk (e.g. assigning the address of a
+ secondary memory to a local variable), since this pointer can become
+ invalid after the object is refreshed.
+
+ The object state will be modified as followed after being refreshed:
+ - existent : set to appropriate value
+ - pinned : unchanged
+ - allocation duration : unchanged
+ - pin duration : unchanged
+
+ This function is an no-op for transient objects or values.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*---------------------------- OCIObjectCopy --------------------------------*/
+sword OCIObjectCopy( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+ dvoid *source, dvoid *null_source,
+ dvoid *target, dvoid *null_target, OCIType *tdo,
+ OCIDuration duration, ub1 option );
+/*
+ NAME: OCIObjectCopy - OCI copy one instance to another
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ svc (IN) - OCI service context handle
+ source (IN) - pointer to the source instance
+ null_source (IN) - pointer to the null structure of the source
+ target (IN) - pointer to the target instance
+ null_target (IN) - pointer to the null structure of the target
+ tdo (IN) - the TDO for both source and target
+ duration (IN) - allocation duration of the target memory
+ option (IN) - specify the copy option:
+ OROOCOSFN - Set Reference to Null. All references
+ in the source will not be copied to the target. The
+ references in the target are set to null.
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - If source or target is referenceable, it must be pinned.
+ - The target or the containing instance of the target must be already
+ be instantiated (e.g. created by OCIObjectNew()).
+ - The source and target instances must be of the same type. If the
+ source and target are located in a different databases, then the
+ same type must exist in both databases.
+ DESCRIPTION:
+ This function copies the contents of the 'source' instance to the
+ 'target' instance. This function performs a deep-copy such that the
+ data that is copied/duplicated include:
+ a) all the top level attributes (see the exceptions below)
+ b) all the secondary memory (of the source) that is reachable from the
+ top level attributes.
+ c) the null structure of the instance
+
+ Memory is allocated with the specified allocation duration.
+
+ Certain data items are not copied:
+ a) If the option OCI_OBJECTCOPY_NOREF is specified, then all references
+ in the source are not copied. Instead, the references in the target
+ are set to null.
+ b) If the attribute is a LOB, then it is set to null.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*---------------------------- OCIObjectGetTypeRef --------------------------*/
+sword OCIObjectGetTypeRef( OCIEnv *env, OCIError *err, dvoid *instance,
+ OCIRef *type_ref );
+/*
+ NAME: OCIObjectGetTypeRef - get the type reference of a standalone object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ instance (IN) - pointer to an standalone instance
+ type_ref (OUT) - reference to the type of the object. The reference
+ must already be allocated.
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The instance must be standalone.
+ - If the object is referenceable, the specified object must be pinned.
+ - The reference must already be allocated.
+ DESCRIPTION:
+ This function returns a reference to the TDO of a standalone instance.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCIObjectGetObjectRef -------------------------*/
+sword OCIObjectGetObjectRef( OCIEnv *env, OCIError *err, dvoid *object,
+ OCIRef *object_ref );
+/*
+ NAME: OCIObjectGetObjectRef - OCI get the object reference of an
+ referenceable object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ object (IN) - pointer to a persistent object
+ object_ref (OUT) - reference of the given object. The reference must
+ already be allocated.
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The specified object must be pinned.
+ - The reference must already be allocated.
+ DESCRIPTION:
+ This function returns a reference to the given object. It returns an
+ error for values.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCIObjectMakeObjectRef -----------------------*/
+sword OCIObjectMakeObjectRef( OCIEnv *env, OCIError *err,
+ CONST OCISvcCtx *svc, dvoid * table,
+ dvoid **values, ub4 array_len,
+ OCIRef *object_ref );
+/*
+ NAME: OCIObjectMakeObjectRef - OCI Create an object reference to a
+ referenceable object.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ svc (IN) - the service context
+ table (IN) - A pointer to the table object (must be pinned)
+ attrlist (IN) - A list of values (OCI type values) from which
+ the ref is to be created.
+ attrcnt (IN) - The length of the attrlist array.
+ object_ref (OUT) - reference of the given object. The reference must
+ already be allocated.
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The specified table object must be pinned.
+ - The reference must already be allocated.
+ DESCRIPTION:
+ This function creates a reference given the values that make up the
+ reference and also a pointer to the table object.
+ Based on the table's OID property, whether it is a pk based OID or
+ a system generated OID, the function creates a sys-generated REF or
+ a pk based REF.
+ In case of system generated REFs pass in a OCIRaw which is 16 bytes
+ long contatining the sys generated OID.
+ In case of PK refs pass in the OCI equivalent for numbers, chars etc..
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCIObjectGetPrimaryKeyTypeRef --------------- */
+sword OCIObjectGetPrimaryKeyTypeRef( OCIEnv *env, OCIError *err,
+ CONST OCISvcCtx *svc, dvoid *table,
+ OCIRef *type_ref );
+/*
+ NAME: OCIObjectGetPrimaryKeyTypeRef - OCI get the REF to the pk OID type
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ svc (IN) - the service context
+ table (IN) - pointer to the table object
+ type_ref (OUT) - reference of the pk type. The reference must
+ already be allocated.
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The specified table object must be pinned.
+ - The reference must already be allocated.
+ DESCRIPTION:
+ This function returns a reference to the pk type. It returns an
+ error for values. If the table is not a Pk oid table/view, then
+ it returns error.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*-------------------------- OCIObjectGetInd --------------------------------*/
+sword OCIObjectGetInd( OCIEnv *env, OCIError *err, dvoid *instance,
+ dvoid **null_struct );
+/*
+ NAME: OCIObjectGetInd - OCI get the null structure of a standalone object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ instance (IN) - pointer to the instance
+ null_struct (OUT) - null structure
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The object must be standalone.
+ - If the object is referenceable, the specified object must be pinned.
+ DESCRIPTION:
+ This function returns the null structure of an instance. This function
+ will allocate the top level memory of the null structure if it is not
+ already allocated. If an null structure cannot be allocated for the
+ instance, then an error is returned. This function only works for
+ ADT or row type instance.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*------------------------- OCIObjectExists --------------------------------*/
+sword OCIObjectExists(OCIEnv *env, OCIError *err, dvoid *ins, boolean *exist);
+/*
+ NAME: OCIObjectExist - OCI checks if the object exists
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ ins (IN) - pointer to an instance
+ exist (OUT) - return TRUE if the object exists
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The object must be standalone.
+ - if object is a referenceable, it must be pinned.
+ DESCRIPTION:
+ This function returns the existence of an instance. If the instance
+ is a value, this function always returns TRUE.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*------------------------- OCIObjectGetProperty ---------------------------*/
+sword OCIObjectGetProperty(OCIEnv *envh, OCIError *errh, CONST dvoid *obj,
+ OCIObjectPropId propertyId,
+ dvoid *property, ub4 *size );
+/*
+ NAME: OCIObjectGetProperty - OCIObject Get Property of given object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ obj (IN) - object whose property is returned
+ propertyId (IN) - id which identifies the desired property
+ property (OUT) - buffer into which the desired property is
+ copied
+ size (IN/OUT) - on input specifies the size of the property buffer
+ passed by caller, on output will contain the
+ size in bytes of the property returned.
+ This parameter is required for string type
+ properties only (e.g OCI_OBJECTPROP_SCHEMA,
+ OCI_OBJECTPROP_TABLE). For non-string
+ properties this parameter is ignored since
+ the size is fixed.
+ DESCRIPTION:
+ This function returns the specified property of the object.
+ The desired property is identified by 'propertyId'. The property
+ value is copied into 'property' and for string typed properties
+ the string size is returned via 'size'.
+
+ Objects are classified as persistent, transient and value
+ depending upon the lifetime and referenceability of the object.
+ Some of the properties are applicable only to persistent
+ objects and some others only apply to persistent and
+ transient objects. An error is returned if the user tries to
+ get a property which in not applicable to the given object.
+ To avoid such an error, the user should first check whether
+ the object is persistent or transient or value
+ (OCI_OBJECTPROP_LIFETIME property) and then appropriately
+ query for other properties.
+
+ The different property ids and the corresponding type of
+ 'property' argument is given below.
+
+ OCI_OBJECTPROP_LIFETIME
+ This identifies whether the given object is a persistent
+ object (OCI_OBJECT_PERSISTENT) or a
+ transient object (OCI_OBJECT_TRANSIENT) or a
+ value instance (OCI_OBJECT_VALUE).
+ 'property' argument must be a pointer to a variable of
+ type OCIObjectLifetime.
+
+ OCI_OBJECTPROP_SCHEMA
+ This returns the schema name of the table in which the
+ object exists. An error is returned if the given object
+ points to a transient instance or a value. If the input
+ buffer is not big enough to hold the schema name an error
+ is returned, the error message will communicate the
+ required size. Upon success, the size of the returned
+ schema name in bytes is returned via 'size'.
+ 'property' argument must be an array of type text and 'size'
+ should be set to size of array in bytes by the caller.
+
+ OCI_OBJECTPROP_TABLE
+ This returns the table name in which the object exists. An
+ error is returned if the given object points to a
+ transient instance or a value. If the input buffer is not
+ big enough to hold the table name an error is returned,
+ the error message will communicate the required size. Upon
+ success, the size of the returned table name in bytes is
+ returned via 'size'. 'property' argument must be an array
+ of type text and 'size' should be set to size of array in
+ bytes by the caller.
+
+ OCI_OBJECTPROP_PIN_DURATION
+ This returns the pin duration of the object.
+ An error is returned if the given object points to a value
+ instance. Valid pin durations are: OCI_DURATION_SESSION and
+ OCI_DURATION_TRANS.
+ 'property' argument must be a pointer to a variable of type
+ OCIDuration.
+
+ OCI_OBJECTPROP_ALLOC_DURATION
+ This returns the allocation duration of the object.
+ Valid allocation durations are: OCI_DURATION_SESSION and
+ OCI_DURATION_TRANS.
+ 'property' argument must be a pointer to a variable of type
+ OCIDuration.
+
+ OCI_OBJECTPROP_LOCK
+ This returns the lock status of the
+ object. The possible lock status is enumerated by OCILockOpt.
+ An error is returned if the given object points to a transient
+ or value instance.
+ 'property' argument must be a pointer to a variable of
+ type OCILockOpt.
+ Note, the lock status of an object can also be retrieved by
+ calling OCIObjectIsLocked().
+
+ OCI_OBJECTPROP_MARKSTATUS
+ This returns the status flag which indicates whether the
+ object is a new object, updated object and/or deleted object.
+ The following macros can be used to test the mark status
+ flag:
+
+ OCI_OBJECT_IS_UPDATED(flag)
+ OCI_OBJECT_IS_DELETED(flag)
+ OCI_OBJECT_IS_NEW(flag)
+ OCI_OBJECT_IS_DIRTY(flag)
+
+ An object is dirty if it is a new object or marked deleted or
+ marked updated.
+ An error is returned if the given object points to a transient
+ or value instance. 'property' argument must be of type
+ OCIObjectMarkStatus.
+
+ OCI_OBJECTPROP_VIEW
+ This identifies whether the specified object is a view object
+ or not. If property value returned is TRUE, it indicates the
+ object is a view otherwise it is not.
+ 'property' argument must be of type boolean.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR. Possible errors are TBD
+ */
+
+/*---------------------------- OCIObjectIsLocked --------------------------*/
+sword OCIObjectIsLocked( OCIEnv *env, OCIError *err, dvoid *ins,
+ boolean *lock);
+/*
+ NAME: OCIObjectIsLocked - OCI get the lock status of a standalone object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ ins (IN) - pointer to an instance
+ lock (OUT) - return value for the lock status.
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The instance must be standalone.
+ - If the object is referenceable, the specified object must be pinned.
+ DESCRIPTION:
+ This function returns the lock status of an instance. If the instance
+ is a value, this function always returns FALSE.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*------------------------- OCIObjectIsDirty ------------------------------*/
+sword OCIObjectIsDirty( OCIEnv *env, OCIError *err, dvoid *ins,
+ boolean *dirty);
+/*
+ NAME: OCIObjectIsDirty - OCI get the dirty status of a standalone object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ ins (IN) - pointer to an instance
+ dirty (OUT) - return value for the dirty status.
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ - The instance must be standalone.
+ - if instance is an object, the instance must be pinned.
+ DESCRIPTION:
+ This function returns the dirty status of an instance. If the instance
+ is a value, this function always returns FALSE.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCIObjectPinTable -----------------------------*/
+sword OCIObjectPinTable( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+ CONST oratext *schema_name,
+ ub4 s_n_length, CONST oratext *object_name, ub4 o_n_length,
+ CONST OCIRef *scope_obj_ref, OCIDuration pin_duration,
+ dvoid** object );
+/*
+ NAME: OCIObjectPinTable - OCI get table object
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ svc (IN) - OCI service context handle
+ schema_name (IN, optional) - schema name of the table
+ s_n_length (IN, optional) - length of the schema name
+ object_name (IN) - name of the table
+ o_n_length (IN) - length of the table name
+ scope_obj_ref (IN, optional) - reference of the scoping object
+ pin_duration (IN) - pin duration. See description in OCIObjectPin().
+ object (OUT) - the pinned table object
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ DESCRIPTION:
+ This function pin a table object with the specified pin duration.
+ The client can unpin the object by calling OCIObjectUnpin(). See
+ OCIObjectPin() and OCIObjectUnpin() for more information about pinning
+ and unpinning.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*------------------------- OCIObjectArrayPin -------------------------------*/
+sword OCIObjectArrayPin(OCIEnv *env, OCIError *err, OCIRef **ref_array,
+ ub4 array_size, OCIComplexObject **cor_array,
+ ub4 cor_array_size, OCIPinOpt pin_option,
+ OCIDuration pin_duration, OCILockOpt lock,
+ dvoid **obj_array, ub4 *pos );
+/*
+ NAME: OCIObjectArrayPin - ORIO array pin
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ ref_array (IN) - array of references to be pinned
+ array_size (IN) - number of elements in the array of references
+ pin_option (IN) - pin option. See OCIObjectPin().
+ pin_duration (IN) - pin duration. See OCIObjectPin().
+ lock_option (IN) - lock option. See OCIObjectPin().
+ obj_array (OUT) - If this argument is not NULL, the pinned objects
+ will be returned in the array. The user must
+ allocate this array with element type being
+ 'dvoid *'. The size of this array is identical to
+ 'array'.
+ pos (OUT) - If there is an error, this argument will contain
+ the element that is causing the error. Note that
+ this argument is set to 1 for the first element in
+ the ref_array.
+ REQUIRE:
+ - a valid OCI environment handle must be given.
+ - If 'obj_array' is not NULL, then it must already be allocated and
+ the size of 'obj_array' is 'array_size'.
+ DESCRIPTION:
+ This function pin an array of references. All the pinned objects are
+ retrieved from the database in one network roundtrip. If the user
+ specifies an output array ('obj_array'), then the address of the
+ pinned objects will be assigned to the elements in the array. See
+ OCIObjectPin() for more information about pinning.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*---------------------------------------------------------------------------*/
+/* HEAP/CACHE OPERATIONS */
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- OCICacheFlush ---------------------------------*/
+sword OCICacheFlush( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+ dvoid *context, OCIRef *(*get)(dvoid *context, ub1 *last),
+ OCIRef **ref );
+/*
+ NAME: OCICacheFlush - OCI flush persistent objects
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ svc (IN) [optional] - OCI service context. If null pointer is
+ specified, then the dirty objects in all connections
+ will be flushed.
+ context (IN) [optional] - specifies an user context that is an
+ argument to the client callback function 'get'. This
+ parameter is set to NULL if there is no user context.
+ get (IN) [optional] - an client-defined function which acts an
+ iterator to retrieve a batch of dirty objects that need
+ to be flushed. If the function is not NULL, this function
+ will be called to get a reference of a dirty object.
+ This is repeated until a null reference is returned by
+ the client function or the parameter 'last' is set to
+ TRUE. The parameter 'context' is passed to get()
+ for each invocation of the client function. This
+ parameter should be NULL if user callback is not given.
+ If the object that is returned by the client function is
+ not a dirtied persistent object, the object is ignored.
+ All the objects that are returned from the client
+ function must be from newed or pinned the same service
+ context, otherwise, an error is signalled. Note that the
+ returned objects are flushed in the order in which they
+ are marked dirty.
+ ref (OUT) [optional] - if there is an error in flushing the
+ objects, (*ref) will point to the object that
+ is causing the error. If 'ref' is NULL, then the object
+ will not be returned. If '*ref' is NULL, then a
+ reference will be allocated and set to point to the
+ object. If '*ref' is not NULL, then the reference of
+ the object is copied into the given space. If the
+ error is not caused by any of the dirtied object,
+ the given ref is initalized to be a NULL reference
+ (OCIRefIsNull(*ref) is TRUE).
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ DESCRIPTION:
+ This function flushes the modified persistent objects from the
+ environment heap to the server. The objects are flushed in the order
+ that they are marked updated or deleted.
+
+ See OCIObjectFlush() for more information about flushing.
+
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCICacheRefresh -------------------------------*/
+sword OCICacheRefresh(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+ OCIRefreshOpt option, dvoid *context,
+ OCIRef *(*get)(dvoid *context), OCIRef **ref);
+/*
+ NAME: OCICacheRefresh - OCI ReFreSh persistent objects
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ svc (IN) [optional] - OCI service context. If null pointer is
+ specified, then the persistent objects in all connections
+ will be refreshed.
+ option (IN) [optional] - if OCI_REFRESH_LOAD is specified, all
+ objects that is loaded within the transaction are
+ refreshed. If the option is OCI_REFERSH_LOAD and the
+ parameter 'get' is not NULL, this function will ignore
+ the parameter.
+ context (IN) [optional] - specifies an user context that is an
+ argument to the client callback function 'get'. This
+ parameter is set to NULL if there is no user context.
+ get (IN) [optional] - an client-defined function which acts an
+ iterator to retrieve a batch of objects that need to be
+ refreshed. If the function is not NULL, this function
+ will be called to get a reference of an object. If
+ the reference is not NULL, then the object will be
+ refreshed. These steps are repeated until a null
+ reference is returned by this function. The parameter
+ 'context' is passed to get() for each invocation of the
+ client function. This parameter should be NULL if user
+ callback is not given.
+ ref (OUT) [optional] - if there is an error in refreshing the
+ objects, (*ref) will point to the object that
+ is causing the error. If 'ref' is NULL, then the object
+ will not be returned. If '*ref' is NULL, then a
+ reference will be allocated and set to point to the
+ object. If '*ref' is not NULL, then the reference of
+ the object is copied into the given space. If the
+ error is not caused by any of the object,
+ the given ref is initalized to be a NULL reference
+ (OCIRefIsNull(*ref) is TRUE).
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ DESCRIPTION:
+ This function refreshes all pinned persistent objects. All unpinned
+ persistent objects are freed. See OCIObjectRefresh() for more
+ information about refreshing.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*---------------------------- OCICacheUnpin --------------------------------*/
+sword OCICacheUnpin( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc );
+/*
+ NAME: OCICacheUnpin - OCI UNPin objects
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ svc (IN) [optional] - OCI service context. If null pointer is
+ specified, then the objects in all connections
+ will be unpinned.
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ DESCRIPTION:
+ If a connection is specified, this function completely unpins the
+ persistent objects in that connection. Otherwise, all persistent
+ objects in the heap are completely unpinned. All transient objects in
+ the heap are also completely unpinned. See OCIObjectUnpin() for more
+ information about unpinning.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/*----------------------------- OCICacheFree --------------------------------*/
+sword OCICacheFree( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc );
+/*
+ NAME: OCICacheFree - OCI FREe instances
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ svc (IN) [optional] - OCI service context. If null pointer is
+ specified, then the objects in all connections
+ will be freed.
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ DESCRIPTION:
+ If a connection is specified, this function frees the persistent
+ objects, transient objects and values allocated for that connection.
+ Otherwise, all persistent objects, transient objects and values in the
+ heap are freed. Objects are freed regardless of their pin count. See
+ OCIObjectFree() for more information about freeing an instance.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+*/
+
+/*---------------------------- OCICacheUnmark -------------------------------*/
+sword OCICacheUnmark( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc );
+/*
+ NAME: OCICacheUnmark - OCI Unmark all dirty objects
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns
+ OCI_ERROR. The error recorded in 'err' can be
+ retrieved by calling OCIErrorGet().
+ svc (IN) [optional] - OCI service context. If null pointer is
+ specified, then the objects in all connections
+ will be unmarked.
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ DESCRIPTION:
+ If a connection is specified, this function unmarks all dirty objects
+ in that connection. Otherwise, all dirty objects in the cache are
+ unmarked. See OCIObjectUnmark() for more information about unmarking
+ an object.
+ RETURNS:
+ if environment handle or error handle is null, return
+ OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+
+sword OCIDurationBegin( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+ OCIDuration parent, OCIDuration *dur );
+/*
+ NAME: OCIDurationBegin - OCI DURATION BEGIN
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ This should be passed NULL, when cartridge services
+ are to be used.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ svc (IN/OUT) - OCI service handle.
+ parent (IN) - parent for the duration to be started.
+ dur (OUT) - newly created user duration
+ REQUIRES:
+ - a valid OCI environment handle must be given for non-cartridge
+ services.
+ - For cartridge services, NULL should be given for environment handle
+ - A valid service handle must be given in all cases.
+ DESCRIPTION:
+ This function starts a new user duration. A user can have multiple
+ active user durations simultaneously. The user durations do not have
+ to be nested.
+
+ The object subsystem predefines 3 durations :
+ 1) session - memory allocated with session duration comes from
+ the UGA heap (OCI_DURATION_SESSION). A session
+ duration terminates at the end of the user session.
+ 2) transaction - memory allocated with transaction duration comes
+ from the UGA heap (OCI_DURATION_TRANS). A trans-
+ action duration terminates at the end of the user
+ transaction.
+ 3) call - memory allocated with call duration comes from PGA
+ heap (OCI_DURATION_CALL). A call duration terminates
+ at the end of the user call.
+
+ Each user duration has a parent duration. A parent duration can be a
+ predefined duration or another user duration. The relationship between
+ a user duration and its parent duration (child duration) are:
+
+ 1) An user duration is nested within the parent duration. When its
+ parent duration terminates, the user duration will also terminate.
+ 2) The memory allocated with an user duration comes from the heap of
+ its parent duration. For example, if the parent duration of an
+ user duration is call, then the memory allocated with the user
+ duration will also come from the PGA heap.
+
+ This function can be used as both part of cartridge services as well
+ as without cartridge services.
+ The difference in the function in the case of cartridge and
+ non-cartridge services is:
+ In case of cartridge services, as descibed above a new user
+ duration is created as a child of the "parent" duration.
+ But when used for non-cartridge purposes, when a pre-defined
+ duration is passed in as parent, it is mapped to the cache duration
+ for that connection (which is created if not already present) and
+ the new user duration will be child of the cache duration.
+
+ RETURNS:
+ if environment handle and service handle is null or if error
+ handle is null return OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+
+sword OCIDurationEnd( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+ OCIDuration duration );
+/*
+ NAME: OCIDurationEnd - OCI DURATION END
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ This should be passed NULL, when cartridge services
+ are to be used.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ svc (IN/OUT) - OCI service handle.
+ dur (OUT) - a previously created user duration using
+ OCIDurationBegin()
+ REQUIRES:
+ - a valid OCI environment handle must be given for non-cartridge
+ services.
+ - For cartridge services, NULL should be given for environment handle
+ - A valid service handle must be given in all cases.
+ DESCRIPTION:
+ This function terminates a user duration. All memory allocated for
+ this duration is freed.
+
+ This function can be used as both part of cartridge services as well
+ as without cartridge services. In both cased, the heap duration
+ is freed and all the allocated memory for that duration is freed.
+ The difference in the function in the case of cartridge and
+ non-cartridge services is:
+ In case of non-cartridge services, if the duration is pre-
+ defined, the associated cache duration (see OCIDurationBegin())
+ is also terminated and the following is done.
+ 1) The child durations are terminated.
+ 2) All objects pinned for this duration are unpinned.
+ 3) All instances allocated for this duration are freed.
+
+ In case of cartridge services, only the heap duration is
+ freed. All the context entries allocated for that duration are
+ freed from the context hash table..
+
+ RETURNS:
+ if environment handle and service handle is null or if error
+ handle is null return OCI_INVALID_HANDLE.
+ if operation suceeds, return OCI_SUCCESS.
+ if operation fails, return OCI_ERROR.
+ */
+
+/******************************************************************************
+** DO NOT USE THE FUNCTIONS BELOW! **
+** UNSUPPORTED INTERFACE **
+** WILL BE REMOVED/CHANGED IN A FUTURE RELEASE **
+******************************************************************************/
+
+sword OCIDurationGetParent( OCIEnv *env, OCIError *err,
+ OCIDuration duration, OCIDuration *parent );
+
+sword OCIObjectAlwaysLatest( OCIEnv *env, OCIError *err, dvoid *object );
+
+sword OCIObjectNotAlwaysLatest( OCIEnv *env, OCIError *err,
+ dvoid *object );
+
+sword OCIObjectFlushRefresh( OCIEnv *env, OCIError *err, dvoid *object);
+
+sword OCIObjectIsLoaded( OCIEnv *env, OCIError *err, dvoid *ins,
+ boolean *load);
+
+sword OCIObjectIsDirtied( OCIEnv *env, OCIError *err, dvoid *ins,
+ boolean *dirty);
+
+sword OCICacheGetObjects( OCIEnv *env, OCIError *err,
+ CONST OCISvcCtx *svc,
+ OCIObjectProperty property,
+ dvoid *client_context,
+ void (*client_callback)(
+ dvoid *client_context,
+ dvoid *object ));
+
+sword OCICacheRegister( OCIEnv *env, OCIError *err,
+ OCIObjectEvent event,
+ dvoid *client_context,
+ void (*client_callback)(
+ dvoid *client_context,
+ OCIObjectEvent event,
+ dvoid *object));
+
+sword OCICacheFlushRefresh( OCIEnv *env, OCIError *err,
+ CONST OCISvcCtx *svc, dvoid *context,
+ OCIRef *(*get)(dvoid *context, ub1 *last),
+ OCIRef **ref );
+
+sword OCIObjectSetData(OCIEnv *env, OCIError *err, dvoid *obj_hdr,
+ dvoid *data);
+
+sword OCIObjectGetNewOID(OCIEnv *env, OCIError *err, OCISvcCtx *svc,
+ ub1 *oid);
+
+
+#endif /* ORI_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/orid.h b/src/terralib/drivers/OracleSpatial/OCI/include/orid.h
new file mode 100644
index 0000000..c78bf96
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/orid.h
@@ -0,0 +1,372 @@
+/* Copyright (c) 1994, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ Author: Tin Nguyen
+ Date: 02/07/94
+ Source documents: "Functional Specification for C Object Interface, Object
+ Management Subsystem", "Oracle C Coding Standards
+ version 2.2", and the header file template
+ Rule sets: the generic and .h file rule sets
+ Quality status: not exited
+ Identification tag: [ one or more letters to identify the .h file ]
+ Revision code: [ date of the last revision of the .h file ]
+
+ Note to the user of this header file:
+
+ Anything in this header file that is marked private is not supported and
+ must not be used. Private sections are included in the header file to
+ improve internal maintenance.
+
+ NAME
+
+ ORID - Oracle Object Interface for Dynamic Data Access
+
+ DESCRIPTION
+
+ This file contains declarations for C object interface functions including
+ the dynamic object data access operations that allow callers to dynamically
+ access and manipulate objects; these operations include getting and setting
+ attributes of an object. These dynamic object operations are for accessing
+ and manipulation objects whose types are not known at compile-time.
+
+ RELATED DOCUMENTS
+
+ Functional Specification for C Object Interface / Object Management System
+
+ PUBLIC FUNCTIONS
+
+ OCIObjectSetAttr - ORID SET attribute value
+ OCIObjectGetAttr - ORID GET attribute value
+
+ PRIVATE FUNCTIONS
+
+ None
+
+ EXAMPLES
+
+ EXAMPLE 1
+
+ /o
+ o This example illustrates how an interative program can use the dynamic
+ o attribute access to display and modify attributes of an ADT instance.
+ o The interactive program does not know the type of the object at
+ o compile time.
+ o/
+
+ void display(adt_ref, object, null_struct, names, names_count,
+ names_length, indexes, indexes_count)
+ {
+ /o Pin the ADT o/
+ if (OCIObjectPin(env, &adt_ref, OROOPOCUR, OROOPDTRA, OROOLMNON, &adt)
+ != OROSTASUC)
+ /o error handling code o/
+
+ /o
+ o Call the type manager to obtain all the attributes in the object.
+ o Display the content of each attribute in the ADT instance. If the
+ o attribute is an array, display each element of the array. If the
+ o attribute is an ADT instance, recursively call this routine to
+ o display the embedded ADT instance.
+ o/
+ numAttrs = OCITypeAttrs(env, adt);
+ for (i= 1; i <= numAttrs; i++)
+ {
+ /o get attribute descriptor o/
+ if (ortgabp(env, adt, i, &ado_ref, &ado) != OROSTASUC)
+ /o error handling code o/
+
+ /o get attribute name o/
+ names[names_count] = OCITypeElemName(env, ado,
+ &names_length[names_count]);
+
+ /o dynamically get the attr o/
+ if (OCIObjectGetAttr(env, object, null_struct, 0, adt_ref, names,
+ names_length, names_count+1, indexes, indexes_count, 0,
+ &null, &null_info, &attr) != OROSTASUC)
+ /o error handling code o/
+
+ /o check if attribute is null o/
+ if (null) continue;
+
+ /o get typecode of attribute o/
+ typecode = OCITypeElemTypeCode(env, ado);
+
+ /o if attribute is a varray, display each element in varray o/
+ if (typecode == OCI_TYPECODE_VARRAY)
+ {
+ /o get the reference to the type of the element of the array o/
+ if (OCITypeElemParameterizedTyper(env, ado, &attr_type_ref)
+ != OROSTASUC)
+ /o error handling code o/
+
+ /o get the size of array o/
+ if (orlasiz(env, &attr_type_ref, (orlva *)attr,
+ &numElm) != OROSTASUC)
+ /o error handling code o/
+
+ /o get the typecode of the element of the array o/
+ if (ortty2r(env, attr_type_ref, &typecode) != OROSTASUC)
+ /o error handling code o/
+
+ /o iterate the array o/
+ for (j=0; j < numElm; j++)
+ {
+ /o get an element in the array o/
+ if (OCIObjectGetAttr(env, attr, null_info, j+1, attr_type_ref,
+ names, names_length, 0, indexes, 0, 0, &null, &null_info,
+ &element) != OROSTASUC)
+ /o error handling code o/
+
+ /o check if element is null o/
+ if (null) continue;
+
+ /o if attr is an ADT instance, recursively call this routine o/
+ if (typecode == OCI_TYPECODE_ADT || typecode ==
+ OCI_TYPECODE_UNNAMEDADT)
+ {
+ /o display the element as an adt o/
+ display(attr_type_ref, element, null_info, names, lengths,
+ 0, indexes, 0);
+ }
+
+ /o if attribute is scalar, print the value to the screen o/
+ else output_to_screen(element, typecode);
+ }
+ }
+
+ /o if attribute is an ADT instance, recursively call this routine o/
+ else if (typecode == OCI_TYPECODE_ADT || typecode ==
+ OCI_TYPECODE_UNNAMEDADT)
+ {
+ /o get the type ref of the attribute o/
+ if (ortgarf(env, ado, &attr_type_ref) != OROSTASUC)
+ /o error handling code o/
+
+ display(attr_type_ref, attr, null_info, 0, names, 0, names_length,
+ indexes, 0);
+ }
+
+ /o if attribute is scalar, print the value to the screen o/
+ else output_to_screen(attr, typecode);
+ }
+ }
+
+ /o ******** main routine *********** o/
+ ....
+
+ /o
+ o Allocate the arrays for storing the path expression
+ o/
+
+ /o get the tdo of type 'long' o/
+ if (orttypget(&env, con, "SYS", sizeof("SYS"), "SINT32", sizeof("SINT32"),
+ OROOPDSES, &long_ref, &long_tdo) != OROSTASUC)
+ /o error handling code o/
+
+ /o get the tdo of type 'varchar' o/
+ if (orttypget(&env, con, "SYS", sizeof("SYS"), "SQL_VARCHAR2",
+ sizeof("SQL_VARCHAR2"), OROOPDSES, &vchar_ref, &vchar_tdo)
+ != OROSTASUC)
+ /o error handling code o/
+
+ /o allocate the varrays for the path expression o/
+ if (orlalloc(env, &vchar_ref, MAX_ARR_SIZE, &attr_names) != OROSTASUC)
+ /o error handling code o/
+
+ if (orlalloc(env, &long_ref, MAX_ARR_SIZE, &attr_name_lengths)
+ != OROSTASUC)
+ /o error handling code o/
+
+ if (orlalloc(env, &long_ref, MAX_ARR_SIZE, &attr_name_indexes)
+ != OROSTASUC)
+ /o error handling code o/
+
+ /o
+ o Get an ADT instance. The ref to the ADT instance can be obtained
+ o by through ORI or OSCI.
+ o/
+ if (OCIObjectPin(env, &obj_ref, OROOPOCUR, OROOPDTRA, OROOLMUPD, &object)
+ != OROSTASUC)
+ /o error handling code o/
+
+ /o get the null structure of the ADT instance o/
+ if (OCIObjectGetInd(gp, object, &null_struct) != OROSTASUC)
+ /o error handling code o/
+
+ /o
+ o Get the type of the ADT instance
+ o/
+
+ /o find out the type of the ADT instance o/
+ if (oriogto(env, object, &adt_ref) != OROSTASUC)
+ /o error handling code o/
+
+ /o display the object o/
+ display(adt_ref, object, null_struct, attr_names, 0, attr_names_lengths,
+ attr_names_indexes, 0);
+
+ /o After the object is displayed, the program waits for the user to
+ o respond. The user modifies the values of an attribute and the
+ o program generates a path expression for the attribute and calls
+ o OCIObjectSetAttr() to set the value.
+ o/
+
+ if (OCIObjectSetAttr(env, object, null_struct, adt_ref,
+ (text **)attr_names, (ub4 *)attr_name_lengths,
+ attr_names_count, (ub4 *)attr_array_indexes,
+ attr_array_indexes_count,
+ (dvoid *)0, FALSE, (dvoid *)value) != OROSTASUC)
+ /o error handling code o/
+
+ END OF EXAMPLE 1
+
+ NOTES
+
+ This file has been subsetted to contain only the routines that will
+ be in the first release.
+
+ MODIFIED
+ srseshad 03/12/03 - convert oci public api to ansi
+ aahluwal 06/03/02 - bug 2360115
+ bpalaval 02/09/01 - Change text to oratext.
+ whe 09/01/99 - 976457:check __cplusplus for C++ code
+ sthakur 09/18/97 - collection indexing not supported
+ cxcheng 08/05/97 - fix compile with short names
+ skrishna 03/18/97 - fix ifdef for supporting ansi and k&r proto-types
+ cxcheng 02/06/97 - take out short name support except with SLSHORTNAME
+ cxcheng 10/17/96 - final renaming of functions
+ jboonleu 10/07/96 - beautify with OCI long names
+ cxcheng 10/07/96 - change short names to long names for readability
+ jboonleu 09/27/96 - fix lint
+ jwijaya 07/03/96 - add ANSI prototypes
+ jboonleu 04/13/95 - new interface
+ jwijaya 10/11/94 - fix the sccs header and add namespace
+ tanguyen 08/22/94 - fix example
+ tanguyen 08/09/94 - remove Sccsid declaration
+ tanguyen 07/20/94 - fix OCIObjectSetAttr and OCIObjectGetAttr to
+ use position descriptor
+ tanguyen 07/18/94 - change 'object' type to become ptr to object
+ tanguyen 06/30/94 - Fix the ORID_ORACLE ifdef
+ tanguyen 06/27/94 - update to template format
+ skotsovo 05/12/94 - replace ado with attribute position
+ jweisz 05/11/94 - test new checkin facility
+ jwijaya 05/05/94 - orienv/ref/typ -> oroenv/ref/typ
+ jwijaya 02/07/94 - Creation
+
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORID_ORACLE
+#define ORID_ORACLE
+
+#ifdef SLSHORTNAME
+
+#define OCIObjectSetAttr oridset
+#define OCIObjectGetAttr oridget
+
+#endif /* SLSHORTNAME */
+
+/*---------------------------------------------------------------------------*/
+/* PUBLIC FUNCTIONS */
+/*---------------------------------------------------------------------------*/
+
+/*-------------------------- OCIObjectSetAttr ----------------------------*/
+sword OCIObjectSetAttr( OCIEnv *env, OCIError *err, dvoid *instance,
+ dvoid *null_struct, struct OCIType *tdo,
+ CONST oratext **names, CONST ub4 *lengths,
+ CONST ub4 name_count, CONST ub4 *indexes,
+ CONST ub4 index_count, CONST OCIInd null_status,
+ CONST dvoid *attr_null_struct, CONST dvoid *attr_value );
+/*
+ NAME: OCIObjectSetAttr - ORID SET value
+ PARAMETERS:
+ env (IN) - OCI environment handle initialized in object mode
+ err (IN) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ instance (IN) - pointer to an ADT instance
+ null_struct (IN) - the null structure of the ADT instance or array
+ tdo (IN) - pointer to the TDO
+ names (IN) - array of attribute names. This is used to specify
+ the names of the attributes in the path expression.
+ lengths (IN) - array of lengths of attribute names.
+ name_count (IN) - number of element in the array 'names'.
+ indexes (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4 *)0.
+ index_count (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4)0.
+ attr_null_status (IN) - the null status of the attribute if the type of
+ attribute is primitive.
+ attr_null_struct (IN) - the null structure of an ADT or collection
+ attribute.
+ attr_value (IN) - pointer to the attribute value.
+ REQUIRES:
+ DESCRIPTION:
+ This function set the attribute of the given object with the given
+ value. The position of the attribute is specified as a path
+ expression which is an array of names and an array of indexes.
+ RETURNS:
+ one of OROSTA*
+ EXAMPLES:
+ For path expression stanford.cs.stu[5].addr, the arrays will look like
+ names = {"stanford", "cs", "stu", "addr"}
+ lengths = {8, 2, 3, 4}
+ indexes = {5}
+
+ Also see the above example.
+ */
+
+/*-------------------------- OCIObjectGetAttr ----------------------------*/
+sword OCIObjectGetAttr( OCIEnv *env, OCIError *err, dvoid *instance,
+ dvoid *null_struct, struct OCIType *tdo,
+ CONST oratext **names, CONST ub4 *lengths,
+ CONST ub4 name_count, CONST ub4 *indexes,
+ CONST ub4 index_count, OCIInd *attr_null_status,
+ dvoid **attr_null_struct, dvoid **attr_value,
+ struct OCIType **attr_tdo );
+/*
+ NAME: OCIObjectGetAttr - ORID GET value
+ PARAMETERS:
+ env (IN) - OCI environment handle initialized in object mode
+ err (IN) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ instance (IN) - pointer to an ADT instance
+ null_struct (IN) - the null structure of the ADT instance or array
+ tdo (IN) - pointer to the TDO
+ names (IN) - array of attribute names. This is used to specify
+ the names of the attributes in the path expression.
+ lengths (IN) - array of lengths of attribute names.
+ name_count (IN) - number of element in the array 'names'.
+ indexes (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4 *)0.
+ index_count (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4)0.
+ attr_null_status (OUT) - the null status of the attribute if the type
+ of attribute is primitive.
+ attr_null_struct (OUT) - the null structure of an ADT or collection
+ attribute.
+ attr_value (OUT) - pointer to the attribute value.
+ attr_tdo (OUT) - pointer to the TDO of the attribute.
+ REQUIRES:
+ - a valid OCI environment handle must be given.
+ DESCRIPTION:
+ This function gets a value from an ADT instance or from an array.
+ If the parameter 'instance' points to an ADT instance, then the path
+ expression specifies the location of the attribute in the ADT.
+ It is assumed that the object is pinned and that the value returned
+ is valid until the object is unpinned.
+ RETURNS:
+ one of OROSTA*
+ EXAMPLES:
+ See example in OCIObjectSetAttr(). Also see the above example.
+ */
+
+#endif /* ORID_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/orl.h b/src/terralib/drivers/OracleSpatial/OCI/include/orl.h
new file mode 100644
index 0000000..f55d466
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/orl.h
@@ -0,0 +1,3628 @@
+/* Copyright (c) 1993, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ Author: Srinath Krishnaswamy
+ Date: 11/24/93
+ Source documents: "Functional Specification for C Language Mapping of
+ OTS Types, Object Management Subsystem", "Oracle C
+ Coding Standards version 2.2", and the header file
+ template
+ Rule sets: the generic and .h file rule sets
+ Quality status: not exited
+ Identification tag: [ one or more letters to identify the .h file ]
+ Revision code: 11/24/93
+
+ NAME
+
+ ORL - ORacle's external C Language interface to primitive OTS types
+
+ DESCRIPTION
+
+ This header file contains C langauge interface to the OTS primitive
+ types. The interface includes C mapping of OTS primitive types and
+ the prototype of the pre-defined operations on the primitive types.
+
+ ***********************************************************************
+ *** NOTE: The OCI functions for objects requires the ***
+ *** application to be running in OBJECT mode. That is, during ***
+ *** process initialization OCIInitialize(), the mode ***
+ *** specified should be OBJECT mode. ***
+ ** OCIInitialize(OCI_OBJECT, ..); ***
+ ***********************************************************************
+
+ RELATED DOCUMENTS
+
+ [1] Krishnaswamy, Srinath and Nguyen, Tin A., "Functional Specification
+ for C Language Mapping of OTS Types, Object Management Subsystem",
+ March 1994.
+ [2] Nguyen, Tin A., "The Open Type System", Oracle Corporation,
+ February 1994.
+ [3] Klein, Jonathan D., "Large Field Management", Oracle Corporation,
+ October 1993.
+
+ PUBLIC FUNCTIONS
+
+ OCI - OCI functions to manipulate Oracle Number, float and decimal
+ ARITHMETIC
+ OCINumberInc - OCINumber INCrement (optimized)
+ OCINumberDec - OCINumber DECrement (optimized)
+ OCINumberAdd - OCINumber ADD numbers
+ OCINumberSub - OCINumber SUBtract numbers
+ OCINumberMul - OCINumber MULtiply numbers
+ OCINumberDiv - OCINumber DIVide numbers
+ OCINumberMod - OCINumber MODulo division
+ OCINumberIntPower - OCINumber integer PoWeR
+ OCINumberShift - OCINumber decimal ShiFT number
+ OCINumberNeg - OCINumber NEGate number
+ OCINumberAbs - OCINumber ABSolute value
+ OCINumberCeil - OCINumber CEiling of number
+ OCINumberFloor - OCINumber FLooR of number
+ OCINumberSqrt - OCINumber SQuare Root of number
+ OCINumberSign - OCINumber get SIGN of number
+ NATIVE TYPE CONVERSION
+ OCINumberToInt - OCINumber convert number TO machine-format Integer
+ OCINumberFromInt - OCINumber convert machine-format Integer TO Number
+ OCINumberToReal - OCINumber convert number TO machine-format Real
+ OCINumberToRealArray - OCINumber convert array of numbers TO
+ machine-format Real
+ OCINumberFromReal - OCINumber convert machine-format Real TO Number
+ TEXT STRING CONVERSION
+ OCINumberToText - OCINumber convert number TO String
+ OCINumberFromText - OCINumber convert String TO Number
+ COMPARISON
+ OCINumberCmp - OCINumber CoMPare numbers
+ OCINumberIsZero - OCINumber comparison with ZERo
+ OCINumberIsInt - OCINumber Is an Integer
+ ASSIGNMENT
+ OCINumberAssign - OCINumber ASsiGn number
+ OCINumberSetZero - OCINumber Set number to Zero value
+ OCINumberSetPi - OCINumber Set number to Pi
+ ROUNDING
+ OCINumberTrunc - OCINumber TRUncate an Oracle number
+ OCINumberRound - OCINumber ROUnd number
+ OCINumberPrec - OCINumber round to Precision digits
+ TRANSCENDENTAL
+ OCINumberSin - OCINumber SINe
+ OCINumberArcSin - OCINumber Arc SINe
+ OCINumberHypSin - OCINumber SiNe Hyperbolic
+ OCINumberCos - OCINumber COSine
+ OCINumberArcCos - OCINumber Arc COSine
+ OCINumberHypCos - OCINumber CoSine Hyperbolic
+ OCINumberTan - OCINumber TANgent
+ OCINumberArcTan - OCINumber Arc TANgent
+ OCINumberArcTan2 - OCINumber Arc TaNgent 2
+ OCINumberHypTan - OCINumber TaNgent Hyperbolic
+ OCINumberPower - OCINumber arbitrary Base EXponentiation
+ OCINumberExp - OCINumber EXPonentiation to base e
+ OCINumberLn - OCINumber Logarithm Natural
+ OCINumberLog - OCINumber LOGarithm to arbitrary base
+
+ OCIDate - OCI functions to manipulate OCI Date
+ OCIDateToExternal - OCIDate convert date to external form
+ OCIDateFromExternal - OCIDate convert external form of date into OCIDate
+ OCIDateAssign - OCIDate Assignment
+ OCIDateToText - OCIDate convert date TO String
+ OCIDateFromText - OCIDate convert String TO Date
+ OCIDateZoneToZone - OCIDate convert date from one time
+ Zone TO another Zone
+ OCIDateCompare - OCIDate CoMPare dates
+ OCIDateAddMonths - OCIDate ADd or subtract Months
+ OCIDateAddDays - OCIDate ADd or subtract Days
+ OCIDateLastDay - OCIDate get date of LaST day of month
+ OCIDateDaysBetween - OCIDate get number of days BeTWeen two dates
+ OCIDateNextDay - OCIDate get date of Next DaY
+ OCIDateCheck - OCIDate CHecK if the given date is valid
+ OCIDateSysDate - OCIDate get current SYStem date and time
+
+ OCIString - OCI String functions to manipulate Variable-length string
+ OCIStringAssign - OCIString Assign string to string
+ OCIStringAssignText - OCIString Assign Text string to string
+ OCIStringResize - OCIString ReSiZe string
+ OCIStringSize - OCIString get String Size
+ OCIStringPtr - OCIString get String PoinTeR
+ OCIStringAllocSize - OCIString get Allocated SiZe
+
+ OCIRaw - OCI Raw functions to manipulate variable-length raW
+ OCIRawAssignRaw - OCIRaw Assign Raw (of type OCIRaw*) to raw
+ (of type OCIRaw*)
+ OCIRawResize - OCIRaw Resize raw
+ OCIRawSize - OCIRaw get Raw Size
+ OCIRawPtr - OCIRaw get Raw data Pointer
+ OCIRawAllocSize - OCIRaw get Allocated Size
+
+ OCIColl - OCI Collection generic functions. These functions can be
+ used to manipulate both variable-length array (varray) and
+ nested table.
+ OCICollSize - OCIColl return current SIZe of the given collection
+ (in number of elements)
+ OCICollMax - OCIColl return the MAXimum number of elements in the
+ collection (i.e. upper-bound)
+ OCICollGetElem - OCIColl GET pointer to the element at the given
+ position
+ OCICollAssignElem - OCIColl assign to element at given index
+ OCICollAssign - OCIColl ASsiGn collection; perform deep-copy of source
+ collection to target collection
+ OCICollAppend - OCIColl aPPend the given element to the end of the
+ collection
+ OCICollTrim - OCIColl trim (delete) the given number of elements
+ from the end of the collection
+ OCICollIsLocator - OCIColl indicates whether a collection is locator
+ based or not.
+ OCIIterCreate - OCIColl Create an ITerator to scan the collection
+ elements
+ OCIIterDelete - OCIColl Delete ITerator
+ OCIIterInit - OCIColl Initialize ITerator to scan the given collection
+ OCIIterGetCurrent - OCIColl Iterator based, get CURrent
+ collection element
+ OCIIterNext - OCIColl Iterator based, get NeXT collection element
+ OCIIterPrev - OCIColl Iterator based, get PReVious collection element
+
+ OCITable - OCI functions to manipulate nested Table. The OCIColl*() and
+ OCITable*() functions can be used to manipulate nested table
+ OCITableDelete(i) - OCITable if element(i) exists then the element is
+ marked as deleted else the function returns false. So
+ delete's create "holes".
+ OCITableExists(i) - OCITable return true iff an element at
+ position i EXIsts
+ OCITableFirst - OCITable return the smallest value of i for which
+ exists(i) is true.
+ OCITableLast - OCITable return the largest value of i for which
+ exists(i) is true.
+ OCITableNext(i) - OCITable return pointer to the smallest position j,
+ greater than i, such that OCITableExists(j) is true
+ OCITablePrev(i) - OCITable return pointer to the largest position j,
+ less than i, such that OCITableExists(j) is true
+ OCITableSize - OCITable return current SIZe of the given nested table not
+ including deleted elements
+
+ OCIRef - OCI functions to manipulate object Reference
+ OCIRefClear - OCIRef CLeaR or nullify a ref
+ OCIRefAssign - OCIRef ASsiGn a ref to another
+ OCIRefIsEqual - OCIRef compare two refs for EQUality
+ OCIRefIsNull - OCIRef test if a ref is NULl
+ OCIRefFromHex - OCIRef convert a Hexadecimal string TO a Ref
+ OCIRefToHex - OCIRef convert a ref to a Hexadecimal string
+ OCIRefHexSize - OCIRef get size of buffer in bytes to store hexadecimal
+ string
+
+ OBSOLETE: to be replaced by functions from oci.h:
+
+ ORLL - ORL functions to manipulate lob Locators
+ orllasg - ORLL AsiGn one locator to another
+ orllequ - ORLL compare two locators for EQUality
+ orlliini - ORLL Is the locator INItialized?
+ orllgsz - ORLL Get locator SiZe
+ orllgcid - ORLL Get Character set ID
+
+ NOTE: The following are specific to FILE lobs:
+
+ orllsnm - ORLL Set directory alias and file NaMe in the locator
+ orllgnm - ORLL Get directory alias and file NaMe from the locator
+
+ EXAMPLES
+
+ Examples are given in the description of each function where
+ relevant.
+
+ NOTES
+
+ This file has been subsetted to contain ONLY the routines that will
+ be in the first release.
+
+ QUESTIONS
+
+ MODIFIED
+ srseshad 03/12/03 - convert oci public api to ansi
+ rpingte 11/21/02 - Add OCICollGetElemArray and OCINumberToRealArray
+ aahluwal 06/03/02 - bug 2360115
+ gayyappa 02/01/02 - fix 2210776 : change Dom to DOM
+ whe 09/25/01 - add OCIXMLType & OCIDomDocument opaque types
+ bpalaval 02/09/01 - Change text to oratext.
+ rkasamse 09/20/99 - lint changes
+ whe 09/01/99 - 976457:check __cplusplus for C++ code
+ hsbedi 08/11/99 - Add macro
+ rxgovind 10/14/98 - make non exposed calls (OCIRowType etc) private
+ rxgovind 06/09/98 - update OCIRowTypeCreate
+ nmantrav 05/11/98 - add OCIRowTypeGetCount
+ rxgovind 03/29/98 - add OCIRowType and OCIRowData interfaces
+ jwijaya 05/06/98 - add OCICollIsLocator
+ rxgovind 03/18/98 - opaque types: move to kolo.h
+ etucker 02/02/98 - add comments for Dec and Inc
+ etucker 01/29/98 - Finish core5 integration
+ rxgovind 11/11/97 - opaque types
+ etucker 10/28/97 - add ORLN functions for SDK
+ cxcheng 07/28/97 - remove OCILobLocator #define
+ skmishra 05/13/97 - stdcc compatibility changes
+ skrishna 04/25/97 - rename OCINumber*(): Exp Power TanHyp Zero Init
+ TanToArc Sqr Truncate and Compare
+ skotsovo 03/31/97 - remove OCILobLocatorSize
+ skrishna 03/25/97 - remove orld2i and orldi2d
+ skrishna 03/18/97 - fix ifdef for supporting ansi and k&r proto-types
+ cxcheng 02/06/97 - take out short name support except with SLSHORTNAME
+ skrishna 01/06/97 - update OCITableSize() comments
+ skrishna 12/27/96 - fix OCIDateGet/OCIDateSet
+ skrishna 12/12/96 - update OCICollGelElem comments
+ skrishna 11/07/96 - OCICollGetElem: interface change
+ skrishna 11/05/96 - add OCIDate Get/Set and OCIDateAssign
+ cxcheng 10/31/96 - change OCINumberTanHyp to OCINumberHypTan
+ cxcheng 10/30/96 - #define orll short names to long names
+ dchatter 10/26/96 - fix some OCI file long names
+ cxcheng 10/24/96 - remove unnecessary comment in front
+ cxcheng 10/14/96 - disable long name mapping for LOB functions
+ skrishna 10/13/96 - continue beautification
+ skotsovo 10/16/96 - update ocilob names
+ cxcheng 10/09/96 - add structure members in #define for date/time
+ cxcheng 10/09/96 - more lint fixes
+ skrishna 10/09/96 - continue beautification
+ cxcheng 10/09/96 - more fixes
+ skrishna 10/09/96 - change fixed-char rep. to orlvstr*
+ jwijaya 10/08/96 - continue beautification
+ jwijaya 10/07/96 - beautify
+ cxcheng 10/07/96 - more changes
+ cxcheng 10/04/96 - replace short names with long names
+ skrishna 10/01/96 - orlcsiz, orltsiz: change prototype to take errhdl
+ skrishna 09/23/96 - fix lint errors
+ skotsovo 09/23/96 - remove orllmkcur().
+ jwijaya 09/17/96 - comments on null ref
+ skrishna 09/19/96 - change orlraw format
+ skotsovo 09/19/96 - add orlliini and remove orllnul
+ skrishna 08/14/96 - orlvstr: change format to ub4 followed by text
+ jboonleu 08/06/96 - update comment
+ skotsovo 08/08/96 - revert to locators instead of descriptors as input t
+ jboonleu 07/23/96 - remove orlrcur
+ skrishna 07/06/96 - add orltsiz
+ skrishna 07/05/96 - add orld2i and orldi2d
+ jwijaya 07/03/96 - add ANSI prototypes
+ skrishna 06/27/96 - document default string format in orlds2d & orld2s
+ skrishna 06/25/96 - change max date value
+ skrishna 06/18/96 - modify orld2s() comments
+ skotsovo 06/13/96 - orll functions take lob descriptors instead of locat
+ rxgovind 06/05/96 - change prototype of orlrcur to take ocienvh
+ skrishna 05/30/96 - support collection trimming
+ skrishna 05/30/96 - remove orlralo/fre and orllalo/fre instead use
+ orionew/fre
+ skrishna 05/28/96 - add orlt*() and modify orla*()
+ skotsovo 05/23/96 - add orlbl typedefs for pro*c
+ jboonleu 05/14/96 - add orlrcur
+ rxgovind 05/08/96 - changes for 3gl callbacks
+ skotsovo 05/01/96 - in orllasg, no need to alloc orlbl*
+ skrishna 04/21/96 - merge changes from 960418 object branch into big
+ skrishna 04/17/96 - rename orlrcpy to orlrasg
+ skrishna 04/12/96 - add orlr2h and orlrh2r functions
+ skotsovo 04/15/96 - add fnt to make the lob locator current
+ skrishna 04/08/96 - change orl*() to take ocienvh* and ocierrh* instead
+ of oroenv*
+ skotsovo 03/22/96 - add locator functions
+ skotsovo 03/22/96 - add locator functions
+ skrishna 02/27/96 - remove mlslabel interface
+ skotsovo 02/20/96 - remove orlbty and use dty type instead.
+ skotsovo 02/14/96 - add text file lobs.
+ skrishna 01/31/96 - update comments of orln2r, orldchk, orlds2d & orld2s
+ skrishna 01/31/96 - change orld2s() and orln2s() to return string length
+ skrishna 01/21/96 - remove old raw interface
+ skrishna 12/14/95 - add raw interface
+ skotsovo 01/03/96 - change LOB offsets and lengths from ub4 to ubig_ora
+ to support 64 bit machines.
+ skotsovo 10/30/95 - add orlblsiz() to get lob locator size
+ skrishna 10/24/95 - move ref functions from ori and update the ref
+ functions to support variable-length ref
+ cxcheng 10/20/95 - add more comments on number versions
+ cxcheng 10/13/95 - add more number functions
+ cxcheng 08/29/95 - Support for segmented varrays
+ cxcheng 08/18/95 - modifiy orlmls structure
+ skrishna 06/06/95 - rename orln, orld, orlvs and orlva to orlnum,
+ orldat, orlvstr and orlvary respectively
+ skrishna 11/15/94 - remove orlnget() function
+ skrishna 09/20/94 - modify orldbtw() to return number of days only
+ skrishna 08/24/94 - change format string length type from ub4 to ub1
+ skrishna 07/19/94 - Rename orln2c & orlnc2n to orln2s & orlns2n
+ skrishna 06/29/94 - Add blob interface; add examples
+ skrishna 06/23/94 - Update comments and format
+ skrishna 05/19/94 - update varray append comments
+ skrishna 05/05/94 - Subsetting
+ skrishna 11/24/93 - Creation
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORL_ORACLE
+#define ORL_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/* SHORT NAMES SUPPORT SECTION */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+ with the SLSHORTNAME defined.
+ With this all subsequent long names will actually be substituted with
+ the short names here */
+
+#define OCIArray orlvary
+#define OCIColl orlcol
+#define OCICollAppend orlcapp
+#define OCICollAssign orlcasg
+#define OCICollAssignElem orlcase
+#define OCICollGetElem orlcget
+#define OCICollGetElemArray orlcgeta
+#define OCICollMax orlcmax
+#define OCICollSize orlcsiz
+#define OCICollTrim orlctrm
+#define OCICollIsLocator orlcilc
+#define OCIDate orldat
+#define OCIDateAddDays orldadd
+#define OCIDateAddMonths orldadm
+#define OCIDateCheck orldchk
+#define OCIDateCompare orldcmp
+#define OCIDateDD day_orldat
+#define OCIDateDaysBetween orldbtw
+#define OCIDateFromText orlds2d
+#define OCIDateLastDay orldlst
+#define OCIDateMM mon_orldat
+#define OCIDateNextDay orldndy
+#define OCIDateSysDate orldsys
+#define OCIDateTime time_orldat
+#define OCIDateYYYY gye_orldat
+#define OCIDateZoneToZone orldz2z
+#define OCIIter orlcitr
+#define OCIIterCreate orlccit
+#define OCIIterDelete orlcdit
+#define OCIIterGetCurrent orlcicur
+#define OCIIterInit orlciit
+#define OCIIterNext orlcinxt
+#define OCIIterPrev orlciprv
+#define OCINumber orlnum
+#define OCINumberAbs orlnabs
+#define OCINumberAdd orlnadd
+#define OCINumberArcCos orlnacos
+#define OCINumberArcSin orlnasin
+#define OCINumberArcTan orlnatan
+#define OCINumberAssign orlnasg
+#define OCINumberCeil orlncel
+#define OCINumberCos orlncos
+#define OCINumberDiv orlndiv
+#define OCINumberPower orlnbex
+#define OCINumberFloor orlnflr
+#define OCINumberFromInt orlni2n
+#define OCINumberFromReal orlnr2n
+#define OCINumberFromText orlns2n
+#define OCINumberHypCos orlncsh
+#define OCINumberHypSin orlnsnh
+#define OCINumberSetZero orlnini
+#define OCINumberSetPi orlnspi
+#define OCINumberInc orlninc
+#define OCINumberDec orlndec
+#define OCINumberIntPower orlnpwr
+#define OCINumberLn orlnln
+#define OCINumberLog orlnlog
+#define OCINumberMod orlnmod
+#define OCINumberMul orlnmul
+#define OCINumberNeg orlnneg
+#define OCINumberPart orlnpart
+#define OCINumberExp orlnexp
+#define OCINumberRound orlnrou
+#define OCINumberPrec orlnpre
+#define OCINumberShift orlnsft
+#define OCINumberSign orlnsgn
+#define OCINumberSin orlnsin
+#define OCINumberSqrt orlnsqr
+#define OCINumberSub orlnsub
+#define OCINumberTan orlntan
+#define OCINumberHypTan orlntnh
+#define OCINumberArcTan2 orlnatn2
+#define OCINumberToInt orln2i
+#define OCINumberToReal orln2r
+#define OCINumberToRealArray orln2ra
+#define OCINumberToText orln2s
+#define OCINumberTrunc orlntru
+#define OCINumberCmp orlncmp
+#define OCINumberIsZero orlnzer
+#define OCINumberIsInt orlnint
+#define OCIRaw orlraw
+#define OCIRawAllocSize orlwasz
+#define OCIRawAssignBytes orlwabr
+#define OCIRawAssignRaw orlwarr
+#define OCIRawPtr orlwgrp
+#define OCIRawResize orlwrsz
+#define OCIRawSize orlwgsz
+#define OCIRefAssign orlrasg
+#define OCIRefClear orlrclr
+#define OCIRefFromHex orlrh2r
+#define OCIRefHexSize orlrhsz
+#define OCIRefIsEqual orlrequ
+#define OCIRefIsNull orlrnul
+#define OCIRefToHex orlr2h
+#define OCIString orlvstr
+#define OCIStringAllocSize orlvasz
+#define OCIStringAssign orlvass
+#define OCIStringAssignText orlvats
+#define OCIStringPtr orlvgsp
+#define OCIStringResize orlvrsz
+#define OCIStringSize orlvgsz
+#define OCITable orltbl
+#define OCITableDelete orltdel
+#define OCITableExists orltexi
+#define OCITableFirst orltfst
+#define OCITableLast orltlst
+#define OCITableNext orltnxt
+#define OCITablePrev orltprv
+#define OCITableSize orltsiz
+#define OCITime orldtm
+#define OCITimeHH orldtmhh
+#define OCITimeMI orldtmmm
+#define OCITimeSS orldtmss
+#define OCI_LOBMODE_READONLY ORLBMORO
+#define OCI_LOBMODE_READWRITE ORLBMORW
+
+#endif /* SLSHORTNAME */
+
+/*****************************************************************************/
+/* NUMBER/FLOAT/DECIMAL TYPE */
+/*****************************************************************************/
+
+#define OCI_NUMBER_SIZE 22
+struct OCINumber
+{
+ ub1 OCINumberPart[OCI_NUMBER_SIZE];
+};
+typedef struct OCINumber OCINumber;
+
+/*
+ * OCINumber - OCI Number mapping in c
+ *
+ * The OTS types: NUMBER, NUMERIC, INT, SHORTINT, REAL, DOUBLE PRECISION,
+ * FLOAT and DECIMAL are represented by OCINumber.
+ * The contents of OCINumber is opaque to clients.
+ *
+ * For binding variables of type OCINumber in OCI calls (OCIBindByName(),
+ * OCIBindByPos(), and OCIDefineByPos()) use the type code SQLT_VNU.
+ */
+
+/*
+ EXAMPLE
+
+ The following example shows how to manipulate an attribute of type
+ oracle number.
+
+ struct person
+ {
+ OCINumber sal;
+ };
+ typedef struct person person;
+
+ OCIError *err;
+ person* joe;
+ person* tom;
+ person* debbie;
+ OCINumber *joesal;
+ OCINumber *tomsal;
+ OCINumber *debsal;
+ sword status;
+ int inum;
+ double dnum;
+ OCINumber ornum;
+ char buffer[21];
+ ub4 buflen;
+ sword result;
+
+ /o See oci.h for an example of how to initialize OCIError.
+ o For this example, assume the OCIEnv and OCIError has been
+ o initialized.
+ o/
+
+ /o Pin joe, tom and debbie person objects in the object cache. See ori.h
+ o for an example on pinning objects. For this example, assume that
+ o joe, tom and debbie are pointing to pinned objects.
+ o/
+ joesal = &joe->sal;
+ tomsal = &tom->sal;
+ debsal = &debbie->sal;
+
+ /o initialize joe's salary to be $12,000 o/
+ inum = 12000;
+ status = OCINumberFromInt(err, &inum, sizeof(inum), OCI_NUMBER_SIGNED,
+ joesal);
+ if (status != OCI_SUCCESS)
+ /o goto to handle error from OCINumberFromInt o/;
+
+ /o initialize tom's salary to be same as joe o/
+ OCINumberAssign(err, joesal, tomsal);
+
+ /o initialize debbie's salary to be 20% more than joe's o/
+ dnum = 1.2;
+ status = OCINumberFromReal(err, &dnum, sizeof(double), &ornum);
+ if (status != OCI_SUCCESS)
+ /o goto to handle error from OCINumberFromReal o/;
+ status = OCINumberMul(err, joesal, &ornum, debsal);
+ if (status != OCI_SUCCESS) /o goto to handle error from OCINumberMul o/;
+
+ /o give tom a 50% raise o/
+ dnum = 1.5;
+ status = OCINumberFromReal(err, &dnum, sizeof(double), &ornum);
+ if (status != OCI_SUCCESS)
+ /o goto to handle error from OCINumberFromReal o/;
+ status = OCINumberMul(err, tomsal, &ornum, tomsal);
+ if (status != OCI_SUCCESS) /o goto to handle error from OCINumberMul o/;
+
+ /o double joe's salary o/
+ status = OCINumberAdd(err, joesal, joesal, joesal);
+ if (status != OCI_SUCCESS) /o goto to handle error from OCINumberAdd o/;
+
+ /o get joe's salary in integer o/
+ status = OCINumberToInt(err, joesal, sizeof(inum), OCI_NUMBER_SIGNED,
+ &inum);
+ if (status != OCI_SUCCESS)/o goto to handle error from OCINumberToInt o/;
+ /o inum is set to 24000 o/
+
+ /o get debbie's salary in double o/
+ status = OCINumberToReal(err, debsal, sizeof(dnum), &dnum);
+ if (status != OCI_SUCCESS)/o goto to handle error from OCINumberToReal o/;
+ /o dnum is set to 14400 o/
+
+ /o print tom's salary as DEM0001`8000.00 o/
+ buflen = sizeof(buffer);
+ status = OCINumberToText(err, tomsal, "C0999G9999D99", 13,
+ "NLS_NUMERIC_CHARACTERS='.`' NLS_ISO_CURRENCY='Germany'", 54,
+ &buflen, buffer);
+ if (status != OCI_SUCCESS)/o goto to handle error from OCINumberToText o/;
+ printf("tom's salary = %s\n", buffer);
+
+ /o compare joe and tom's salary o/
+ status = OCINumberCmp(err, joesal, tomsal, &result);
+ if (status != OCI_SUCCESS) /o goto to handle error from OCINumberCmp o/;
+ /o result is positive o/
+
+ /o read debbie's new salary from string o/
+ status = OCINumberFromText(err, "48`000.00", 9, "99G999D99", 9,
+ "NLS_NUMERIC_CHARACTERS='.`'", 27, debsal);
+ if (status != OCI_SUCCESS)
+ /o goto to handle error from OCINumberFromText o/;
+ /o debbie's salary is now 48000.00 o/
+
+*/
+
+/*----------------------------- OCINumberInc --------------------------------*/
+
+sword OCINumberInc( OCIError *err, OCINumber *number );
+/*
+ NAME: OCINumberInc - OCINumber INCrement numbers
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN/OUT) a positive Oracle number to be incremented
+ DESCRIPTION:
+ Increment Oracle number in place. It is assumed that the input is
+ an integer between 0 and 100^21-2. If the is input too large, it will
+ be treated as 0 - the result will be an Oracle number 1. If the input
+ is not a positive integer, the result will be unpredictable.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberDec --------------------------------*/
+
+sword OCINumberDec( OCIError *err, OCINumber *number );
+/*
+ NAME: OCINumberDec - OCINumber DECrement numbers
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN/OUT) - a positive Oracle number to be decremented
+ DESCRIPTION:
+ Decrement Oracle number in place. It is assumed that the input is an
+ integer between 1 and 100^21-2. If the input is too large, it will be
+ treated as 1 - the result will be an Oracle number 0. If the input is
+ not a positive integer, the result will be unpredictable.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberSetZero -------------------------------*/
+
+void OCINumberSetZero( OCIError *err, OCINumber *num );
+/*
+ NAME: OCINumberSetZero - OCINumber Set number to Zero value
+ PARAMETERS:
+ err (IN/OUT) - pointer to OCI error handle
+ num (OUT) - set to zero value
+ DESCRIPTION:
+ Initialize the given number to value 0.
+ */
+
+/*--------------------------- OCINumberSetPi --------------------------------*/
+
+void OCINumberSetPi( OCIError *err, OCINumber *num );
+/*
+ NAME: OCINumberSetPi - OCINumber Set number to Pi
+ err (IN/OUT) - pointer to OCI error handle
+ num (OUT) - set to zero value
+ DESCRIPTION:
+ Initialize the given number to value Pi.
+ */
+
+/*----------------------------- OCINumberAdd --------------------------------*/
+
+sword OCINumberAdd( OCIError *err, CONST OCINumber *number1,
+ CONST OCINumber *number2, OCINumber *result );
+/*
+ NAME: OCINumberAdd - OCINumber ADD numbers
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number1, number2 (IN) - numbers to be added
+ result (OUT) - result of adding 'number1' with 'number2'
+ DESCRIPTION:
+ Add 'number1' with 'number2' and return result in 'result'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberSub --------------------------------*/
+
+sword OCINumberSub( OCIError *err, CONST OCINumber *number1,
+ CONST OCINumber *number2, OCINumber *result );
+/*
+ NAME: OCINumberSub - OCINumber SUBtract numbers
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number1, number2 (IN) - 'number2' subtracted from 'number1'
+ result (OUT) - subtraction result
+ DESCRIPTION:
+ Subtract 'number2' from 'number1' and return result in 'result'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberMul --------------------------------*/
+
+sword OCINumberMul( OCIError *err, CONST OCINumber *number1,
+ CONST OCINumber *number2, OCINumber *result );
+/*
+ NAME: OCINumberMul - OCINumber MULtiply numbers
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number1, number2 (IN) - numbers to be multiplied
+ result (OUT) - multiplication result
+ DESCRIPTION:
+ Multiply 'number1' with 'number2' and return result in 'result'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberDiv --------------------------------*/
+
+sword OCINumberDiv( OCIError *err, CONST OCINumber *number1,
+ CONST OCINumber *number2, OCINumber *result );
+/*
+ NAME: OCINumberDiv - OCINumber DIVide numbers
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number1 (IN) - pointer to the numerator
+ number2 (IN) - pointer to the denominator
+ result (OUT) - division result
+ DESCRIPTION:
+ Divide 'number1' by 'number2' and return result in 'result'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ underflow errorr
+ overflow errorr
+ divide by zero errorr
+ */
+
+/*----------------------------- OCINumberMod --------------------------------*/
+
+sword OCINumberMod( OCIError *err, CONST OCINumber *number1,
+ CONST OCINumber *number2, OCINumber *result );
+/*
+ NAME: OCINumberMod - OCINumber MODulous
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number1 (IN) - pointer to the numerator
+ number2 (IN) - pointer to the denominator
+ result (OUT) - remainder of the result
+ DESCRIPTION:
+ Finds the remainder of the division of two Oracle numbers.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ divide by zero errorr
+ */
+
+/*------------------------ OCINumberIntPower --------------------------------*/
+
+sword OCINumberIntPower( OCIError *err, CONST OCINumber *base,
+ CONST sword exp, OCINumber *result );
+/*
+ NAME: OCINumberIntPower - OCINumber takes an arbitary base to an arbitary
+ integer PoWeR
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ base (IN) - base of the exponentiation
+ exp (IN) - exponent to which the base is to be raised
+ result (OUT) - output of exponentiation
+ DESCRIPTION:
+ Takes an arbitary base to an arbitary integer power.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberShift ---------------------------------*/
+
+sword OCINumberShift( OCIError *err, CONST OCINumber *number,
+ CONST sword nDig, OCINumber *result );
+/*
+ NAME: OCINumberShift - OCINumber multiplies by a power of 10.
+
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - Oracle Number to be shifted.
+ nDig (IN) - number of decimal places to shift.
+ result (OUT) - shift result.
+ DESCRIPTION:
+ Multiplies number by 10^NDig and sets product to the result.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberNeg --------------------------------*/
+
+sword OCINumberNeg( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberNeg - OCINumber NEGate number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - number to be negated
+ result (OUT) - will contain negated value of 'number'
+ DESCRIPTION:
+ Negates an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*------------------------- OCINumberToText ---------------------------------*/
+
+sword OCINumberToText( OCIError *err, CONST OCINumber *number,
+ CONST oratext *fmt, ub4 fmt_length,
+ CONST oratext *nls_params, ub4 nls_p_length,
+ ub4 *buf_size, oratext *buf );
+/*
+ NAME: OCINumberToText - OCINumber convert number TO String
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - Oracle number to be converted
+ fmt (IN) - conversion format
+ fmt_length (IN) - length of the 'fmt' parameter
+ nls_params (IN) - nls format specification, if null string
+ i.e. (oratext *)0, then the default parameters for the
+ session is used
+ nls_p_length (IN) - length of the 'nls_params' parameter
+ buf_size (IN/OUT) - size of the buffer must be passed as input by
+ the caller, this function will return the length of the
+ resulting string in bytes via this parameter. The length
+ does not include the terminating null ('\0').
+ buf (OUT) - buffer into which the converted string is placed. The
+ resulting string is null terminated.
+ DESCRIPTION:
+ Converts the given number to a character string
+ according to the specified format. Refer to "TO_NUMBER" conversion
+ function described in "Oracle SQL Language Reference Manual" for a
+ description of format and NLS parameters.
+ The converted number string is stored in the buffer 'buf', up to
+ a max of '*buf_size' bytes. Length of the resulting string is
+ returned via 'buf_size'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'number' or 'buf' is null
+ buffer too small
+ invalid format
+ invalid nls format
+ number to text translation for the given format causes overflow
+ */
+
+/*-------------------------- OCINumberFromText ------------------------------*/
+
+sword OCINumberFromText( OCIError *err, CONST oratext *str,
+ ub4 str_length, CONST oratext *fmt, ub4 fmt_length,
+ CONST oratext *nls_params, ub4 nls_p_length,
+ OCINumber *number );
+/*
+ NAME: OCINumberFromText - OCINumber convert String TO Number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ str (IN) - input string to be converted to Oracle number
+ str_length (IN) - size of the input string
+ fmt (IN) - conversion format
+ fmt_length (IN) - length of the 'fmt' parameter
+ nls_params (IN) - nls format specification, if null string
+ i.e. (oratext *)0, then the default parameters for the
+ session is used
+ nls_p_length (IN) - length of the 'nls_params' parameter
+ number (OUT) - given string converted to number
+ DESCRIPTION:
+ Converts the given string to a number
+ according to the specified format. Refer to "TO_NUMBER" conversion
+ function described in "Oracle SQL Language Reference Manual" for a
+ description of format and NLS parameters.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'number' or 'str' is null
+ 'str_length' is 0
+ invalid format
+ invalid nls format
+ invalid input string
+ */
+
+/*-------------------------- OCINumberToInt ---------------------------------*/
+
+#define OCI_NUMBER_UNSIGNED 0 /* Unsigned type -- ubX */
+#define OCI_NUMBER_SIGNED 2 /* Signed type -- sbX */
+
+sword OCINumberToInt( OCIError *err, CONST OCINumber *number,
+ uword rsl_length, uword rsl_flag, dvoid *rsl );
+/*
+ NAME: OCINumberToInt - OCINumber convert number TO Integer
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - number to be converted
+ rsl_length (IN) - size of the desired result
+ rsl_s_flag (IN) - flag denoting the desired sign of the output; valid
+ values are OCI_NUMBER_UNSIGNED, OCI_NUMBER_SIGNED
+ rsl (OUT) - pointer to space for the result
+ DESCRIPTION:
+ Native type conversion function.
+ Converts the given Oracle number into an xbx (e.g. ub2, ub4, sb2 etc.)
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'number' or 'rsl' is null
+ integer value of 'number' is too big -- overflow
+ integer value of 'number' is too small -- underflow
+ invalid sign flag value ('rsl_s_flag')
+ */
+
+/*--------------------------- OCINumberFromInt ------------------------------*/
+
+sword OCINumberFromInt( OCIError *err, CONST dvoid *inum, uword inum_length,
+ uword inum_s_flag, OCINumber *number );
+/*
+ NAME: OCINumberFromInt - OCINumber convert Integer TO Number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ inum (IN) - pointer to the integer to be converted
+ inum_length (IN) - size of the integer
+ inum_s_flag (IN) - flag that designates the sign of the integer; valid
+ values are OCI_NUMBER_UNSIGNED, OCI_NUMBER_SIGNED
+ number (OUT) - given integer converted to Oracle number
+ DESCRIPTION:
+ Native type conversion function. Converts any Oracle standard
+ machine-native integer type (xbx) to an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'number' or 'inum' is null
+ integer too BIG -- the number is too large to fit into an Oracle
+ number
+ invalid sign flag value ('inum_s_flag')
+ */
+
+/*------------------------- OCINumberToReal ---------------------------------*/
+
+sword OCINumberToReal( OCIError *err, CONST OCINumber *number,
+ uword rsl_length, dvoid *rsl );
+/*
+ NAME: OCINumberToReal - OCINumber convert number TO Real
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - number to be converted
+ rsl_length (IN) - is the size of the desired result,
+ sizeof( float | double | long double)
+ rsl (OUT) - pointer to space for storing the result
+ DESCRIPTION:
+ Native type conversion function. Converts an Oracle number into a
+ machine-native real type. This function only converts numbers up to
+ LDBL_DIG, DBL_DIG, or FLT_DIG digits of precision and removes
+ trailing zeroes. The above constants are defined in float.h
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'number' or 'rsl' is null
+ 'rsl_length' is 0
+ */
+
+/*------------------------- OCINumberToRealArray ----------------------------*/
+
+sword OCINumberToRealArray( OCIError *err, CONST OCINumber **number,
+ uword elems, uword rsl_length, dvoid *rsl );
+/*
+ NAME: OCINumberToRealArray - OCINumber convert array of numbers TO Real
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - Pointer to array of number to be converted
+ elems (IN) - Upper bound of number array
+ rsl_length (IN) - is the size of the desired result,
+ sizeof( float | double | long double)
+ rsl (OUT) - pointer to array of space for storing the result
+ DESCRIPTION:
+ Native type conversion function. Converts an Oracle number into a
+ machine-native real type. This function only converts numbers up to
+ LDBL_DIG, DBL_DIG, or FLT_DIG digits of precision and removes
+ trailing zeroes. The above constants are defined in float.h
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'number' or 'rsl' is null
+ 'rsl_length' is 0
+ */
+
+/*-------------------------- OCINumberFromReal ------------------------------*/
+
+sword OCINumberFromReal( OCIError *err, CONST dvoid *rnum,
+ uword rnum_length, OCINumber *number );
+/*
+ NAME: OCINumberFromReal - OCINumber convert Real TO Number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ rnum (IN) - pointer to the floating point number to be converted
+ rnum_length (IN) - size of the desired result, i.e.
+ sizeof({float | double | long double})
+ number (OUT) - given float converted to Oracle number
+ DESCRIPTION:
+ Native type conversion function. Converts a machine-native floating
+ point type to an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'number' or 'rnum' is null
+ 'rnum_length' is 0
+ */
+
+/*----------------------------- OCINumberCmp --------------------------------*/
+
+sword OCINumberCmp( OCIError *err, CONST OCINumber *number1,
+ CONST OCINumber *number2, sword *result );
+/*
+ NAME: OCINumberCmp - OCINumber CoMPare numbers
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number1, number2 (IN) - numbers to be compared
+ result (OUT) - 0 if equal, negative if number1 < number2,
+ positive if number1 > number2
+ DESCRIPTION:
+ The function OCINumberCmp compares two numbers.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'number1' or 'number2' or 'result' is null
+ */
+
+/*---------------------------- OCINumberSign --------------------------------*/
+
+sword OCINumberSign( OCIError *err, CONST OCINumber *number,
+ sword *result );
+/*
+ NAME: OCINumberSign - OCINumber obtains SiGN of an Oracle number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - number whose sign is returned
+ result (OUT) - 0 if number == 0, -1 if number < 0,
+ 1 if number > 0
+ DESCRIPTION:
+ Obtains sign of an Oracle number
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'number' or 'result' is null
+ */
+
+/*---------------------------- OCINumberIsZero ------------------------------*/
+
+sword OCINumberIsZero( OCIError *err, CONST OCINumber *number,
+ boolean *result );
+/*
+ NAME: OCINumberIsZero - OCINumber comparison with ZERo
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - numbers to be compared
+ result (OUT) - set to TRUE if equal to zero else FALSE
+ DESCRIPTION:
+ Test if the given number is equal to zero.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'number' or 'result' is null
+ */
+
+/*---------------------------- OCINumberIsInt -------------------------------*/
+
+sword OCINumberIsInt( OCIError *err, CONST OCINumber *number,
+ boolean *result );
+/*
+ NAME: OCINumberIsInt - OCINumber Is Integer value.
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - number to be tested
+ result (OUT) - set to TRUE if integer value else FALSE
+ DESCRIPTION:
+ Test if the given number is an integer value.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'number' or 'result' is null
+ */
+
+/*-------------------------- OCINumberAssign --------------------------------*/
+
+sword OCINumberAssign( OCIError *err, CONST OCINumber *from,
+ OCINumber *to );
+/*
+ NAME: OCINumberAssign - OCINumber ASsiGn number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ from (IN) - number to be assigned
+ to (OUT) - number copied into
+ DESCRIPTION:
+ Assign number 'from' to 'to'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'from' or 'to' is null
+ */
+
+/*----------------------------- OCINumberAbs --------------------------------*/
+
+sword OCINumberAbs( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberAbs - OCINumber compute ABSolute value
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - input number
+ result (OUT) - output which will contain the absolue value of the
+ input number
+ DESCRIPTION:
+ Computes the absolute value of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*---------------------------- OCINumberCeil --------------------------------*/
+
+sword OCINumberCeil( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberCeil - OCINumber compute the CEiL value of an Oracle number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - input number
+ result (OUT) - output which will contain the ceil value of the
+ input number
+ DESCRIPTION:
+ Computes the ceil value of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*--------------------------- OCINumberFloor --------------------------------*/
+
+sword OCINumberFloor( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberFloor - OCINumber compute the FLooR value of an Oracle number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - input number
+ result (OUT) - output which will contain the floor value of the
+ input number
+ DESCRIPTION:
+ Computes the floor value of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberSqrt -------------------------------*/
+
+sword OCINumberSqrt( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberSqrt - OCINumber compute the SQuare Root of an Oracle number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - input number
+ result (OUT) - output which will contain the square root of the
+ input number
+ DESCRIPTION:
+ Computes the square root of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ 'number' is negative
+ */
+
+/*--------------------------- OCINumberTrunc --------------------------------*/
+
+sword OCINumberTrunc( OCIError *err, CONST OCINumber *number,
+ sword decplace, OCINumber *result );
+/*
+ NAME: OCINumberTrunc - OCINumber TRUncate an Oracle number at a
+ specified decimal place
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - input number
+ decplace (IN) - number of decimal digits to the right of the
+ decimal point to truncate at. Negative values are allowed.
+ result (OUT) - output of truncation
+ DESCRIPTION:
+ Truncate an Oracle number at a specified decimal place
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberPower ------------------------------*/
+
+sword OCINumberPower( OCIError *err, CONST OCINumber *base,
+ CONST OCINumber *number, OCINumber *result );
+/*
+ NAME: OCINumberPower - OCINumber takes an arbitary Base to an
+ arbitary Power
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ base (IN) - base of the exponentiation
+ number (IN) - exponent to which the base is to be raised
+ result (OUT) - output of exponentiation
+ DESCRIPTION:
+ Takes an arbitary base to an arbitary power.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*--------------------------- OCINumberRound --------------------------------*/
+
+sword OCINumberRound( OCIError *err, CONST OCINumber *number,
+ sword decplace, OCINumber *result );
+/*
+ NAME: OCINumberRound - OCINumber ROUnds an Oracle number to a specified
+ decimal place
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - round this number and return result in 'result'
+ decplace (IN) - number of decimal digits to the right of the
+ decimal point to round to. Negative values are allowed.
+ result (OUT) - output of rounding
+ DESCRIPTION:
+ Rounds an Oracle number to a specified decimal place
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*--------------------------- OCINumberPrec ---------------------------------*/
+
+sword OCINumberPrec( OCIError *err, CONST OCINumber *number,
+ eword nDigs, OCINumber *result );
+/*
+ NAME: OCINumberPrec - Rounds an Oracle number to a specified number of
+ decimal digits.
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - number for which to set precision.
+ nDig (IN) - number of decimal digits desired in the result.
+ result (OUT) - result.
+ DESCRIPTION:
+ Performs a floating point round with respect to the number
+ of digits.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberSin --------------------------------*/
+
+sword OCINumberSin( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberSin - OCINumber takes the SINe of an Oracle number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - argument of the sine in radians
+ result (OUT) - result of the sine
+ DESCRIPTION:
+ Takes the sine in radians of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberArcSin --------------------------------*/
+
+sword OCINumberArcSin( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberArcSin - OCINumber takes the Arc SINe of an Oracle number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - argument of the arc sine
+ result (OUT) - result of the arc sine in radians
+ DESCRIPTION:
+ Takes the arc sine in radians of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ 'number' is < -1 or 'number' is > 1.
+ */
+
+/*-------------------------- OCINumberHypSin --------------------------------*/
+
+sword OCINumberHypSin( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberHypSin - OCINumber takes the SiNe Hyperbolic of an
+ Oracle number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - argument of the sine hyperbolic
+ result (OUT) - result of the sine hyperbolic
+ DESCRIPTION:
+ Takes the hyperbolic sine of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ NOTES:
+ An Oracle number overflow causes an unpredictable result value.
+ */
+
+/*----------------------------- OCINumberCos --------------------------------*/
+
+sword OCINumberCos( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberCos - OCINumber takes the COSine of an Oracle number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - argument of the cosine in radians
+ result (OUT) - result of the cosine
+ DESCRIPTION:
+ Takes the cosine in radians of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberArcCos --------------------------------*/
+
+sword OCINumberArcCos( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberArcCos - OCINumber takes the Arc COSine of an Oracle number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - argument of the arc cosine
+ result (OUT) - result of the arc cosine in radians
+ DESCRIPTION:
+ Takes the arc cosine in radians of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ 'number' is < -1 or 'number' is > 1.
+ */
+
+/*-------------------------- OCINumberHypCos --------------------------------*/
+
+sword OCINumberHypCos( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberHypCos - OCINumber takes the CoSine Hyperbolic of an
+ Oracle number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - argument of the cosine hyperbolic
+ result (OUT) - result of the cosine hyperbolic
+ DESCRIPTION:
+ Takes the hyperbolic cosine of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ NOTES:
+ An Oracle number overflow causes an unpredictable result value.
+ */
+
+/*----------------------------- OCINumberTan --------------------------------*/
+
+sword OCINumberTan( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberTan - OCINumber takes the TANgent of an Oracle number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - argument of the tangent in radians
+ result (OUT) - result of the tangent
+ DESCRIPTION:
+ Takes the tangent in radians of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberArcTan --------------------------------*/
+
+sword OCINumberArcTan( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberArcTan - OCINumber takes the Arc TANgent of an Oracle number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - argument of the arc tangent
+ result (OUT) - result of the arc tangent in radians
+ DESCRIPTION:
+ Takes the arc tangent in radians of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*------------------------ OCINumberArcTan2 ---------------------------------*/
+
+sword OCINumberArcTan2( OCIError *err, CONST OCINumber *number1,
+ CONST OCINumber *number2, OCINumber *result );
+/*
+ NAME: OCINumberArcTan2 - OCINumber takes the ATan2 of 2 Oracle numbers
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number1 (IN) - first argument of atan2(y,x) function which
+ corresponds to 'y' parameter in the function
+ number2 (IN) - second argument of atan2(y,x) function which
+ corresponds to 'x' parameter in the function
+ result (OUT) - result of the atan2() in radians
+ DESCRIPTION:
+ Takes the atan2(number1, number2).
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ 'number2' is 0
+ */
+
+/*----------------------------- OCINumberHypTan -----------------------------*/
+
+sword OCINumberHypTan( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberHypTan - OCINumber takes the TaNgent Hyperbolic of an Oracle
+ number
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - argument of the tangent hyperbolic
+ result (OUT) - result of the tangent hyperbolic
+ DESCRIPTION:
+ Takes the hyperbolic tangent of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ NOTES:
+ An Oracle number overflow causes an unpredictable result value.
+ */
+
+/*--------------------------- OCINumberExp ----------------------------------*/
+
+sword OCINumberExp( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberExp - OCINumber EXPonential
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - e raised to this Oracle number power
+ result (OUT) - output of exponentiation
+ DESCRIPTION:
+ Raises e to the specified Oracle number power
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberLn ---------------------------------*/
+
+sword OCINumberLn( OCIError *err, CONST OCINumber *number,
+ OCINumber *result );
+/*
+ NAME: OCINumberLn - OCINumber Logarithm Natural
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ number (IN) - logarithm of this number is computed
+ result (OUT) - logarithm result
+ DESCRIPTION:
+ Takes the logarithm of the given Oracle number with respect
+ to the given base.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ 'number' is <= 0
+ */
+
+/*----------------------------- OCINumberLog --------------------------------*/
+
+sword OCINumberLog( OCIError *err, CONST OCINumber *base,
+ CONST OCINumber *number, OCINumber *result );
+/*
+ NAME: OCINumberLog - OCINumber LOGarithm any base
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ base (IN) - base of the logarithm
+ number (IN) - opearnd
+ result (OUT) - logarithm result
+ DESCRIPTION:
+ Takes the logarithm with the specified base of an Oracle number.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ any of the number arguments is null
+ 'number' is <= 0
+ 'base' is <= 0
+ */
+
+/*****************************************************************************/
+/* ORACLE DATE TYPE */
+/*****************************************************************************/
+
+struct OCITime
+{
+ ub1 OCITimeHH; /* hours; range is 0 <= hours <=23 */
+ ub1 OCITimeMI; /* minutes; range is 0 <= minutes <= 59 */
+ ub1 OCITimeSS; /* seconds; range is 0 <= seconds <= 59 */
+};
+typedef struct OCITime OCITime;
+
+/*
+ * OCITime - OCI TiMe portion of date
+ *
+ * This structure should be treated as an opaque structure as the format
+ * of this structure may change. Use OCIDateGetTime/OCIDateSetTime
+ * to manipulate time portion of OCIDate.
+ */
+
+struct OCIDate
+{
+ sb2 OCIDateYYYY; /* gregorian year; range is -4712 <= year <= 9999 */
+ ub1 OCIDateMM; /* month; range is 1 <= month < 12 */
+ ub1 OCIDateDD; /* day; range is 1 <= day <= 31 */
+ OCITime OCIDateTime; /* time */
+};
+typedef struct OCIDate OCIDate;
+
+/*
+ * OCIDate - OCI oracle Date representation in C
+ *
+ * OCIDate represents the C mapping of Oracle date.
+ *
+ * This structure should be treated as an opaque structure as the format
+ * of this structure may change. Use OCIDateGetDate/OCIDateSetDate
+ * to access/initialize OCIDate.
+ *
+ * For binding variables of type OCIDate in OCI calls (OCIBindByName(),
+ * OCIBindByPos(), and OCIDefineByPos()) use the type code SQLT_ODT.
+ */
+
+/*
+ EXAMPLE
+
+ The following example shows how to manipulate an attribute of type
+ oracle date.
+
+ #define FMT "Month dd, YYYY, HH:MI A.M."
+ #define LANG "American"
+
+ struct person
+ {
+ OCIDate start_date;
+ };
+ typedef struct person person;
+
+ OCIError *err;
+ person *joe;
+ sword status; /o error status o/
+
+ /o See oci.h for an example of how to initialize OCIError.
+ o For this example, assume the OCIEnv and OCIError has been
+ o initialized.
+ o/
+
+ /o Pin joe person object in the object cache. See ori.h
+ o for an example on pinning objects. For this example, assume that
+ o joe is pointing to the pinned object.
+ o/
+
+ /o set the start date of joe o/
+ OCIDateSetTime(&joe->start_date, 8, 0, 0);
+ OCIDateSetDate(&joe->start_date, 1990, 10, 5);
+
+ /o check if the date is valid o/
+ uword invalid;
+ if (OCIDateCheck(err, &joe->start_date, &invalid) != OCI_SUCCESS)
+ /o error handling code o/
+ if (invalid)
+ /o error handling code o/
+
+ /o convert date for display purposes o/
+ char str[100];
+ ub4 strlen = sizeof(str);
+ if (OCIDateToText(err, &joe->start_date, FMT, sizeof(FMT)-1, LANG,
+ sizeof(LANG)-1, &strlen, str) != OCI_SUCCESS)
+ /o error handling code o/
+
+ */
+
+/*--------------------------- OCIDateGetTime --------------------------------*/
+/* void OCIDateGetTime(/o_ CONST OCIDate *date, ub1 *hour, ub1 *min,
+ ub1 *sec _o/); */
+#define OCIDateGetTime(date, hour, min, sec) \
+ { \
+ *hour = (date)->OCIDateTime.OCITimeHH; \
+ *min = (date)->OCIDateTime.OCITimeMI; \
+ *sec = (date)->OCIDateTime.OCITimeSS; \
+ }
+/*
+ NAME: OCIDateGetTime - OCIDate Get Time portion of date
+ PARAMETERS:
+ date (IN) - Oracle date whose time data is retrieved
+ hour (OUT) - hour value returned
+ min (OUT) - minute value returned
+ sec (OUT) - second value returned
+ DESCRIPTION:
+ Return time inforamtion stored in the given date. The time
+ information returned is: hour, minute and seconds.
+ RETURNS:
+ NONE
+ */
+
+/*--------------------------- OCIDateGetDate --------------------------------*/
+/* void OCIDateGetDate(/o_ CONST OCIDate *date, sb2 *year, ub1 *month,
+ ub1 *day _o/); */
+#define OCIDateGetDate(date, year, month, day) \
+ { \
+ *year = (date)->OCIDateYYYY; \
+ *month = (date)->OCIDateMM; \
+ *day = (date)->OCIDateDD; \
+ }
+/*
+ NAME: OCIDateGetDate - OCIDate Get Date (year, month, day) portion of date
+ PARAMETERS:
+ date (IN) - Oracle date whose year, month, day data is retrieved
+ year (OUT) - year value returned
+ month (OUT) - month value returned
+ day (OUT) - day value returned
+ DESCRIPTION:
+ Return year, month, day inforamtion stored in the given date.
+ RETURNS:
+ NONE
+ */
+
+/*--------------------------- OCIDateSetTime --------------------------------*/
+/* void OCIDateSetTime(/o_ OCIDate *date, ub1 hour, ub1 min,
+ ub1 sec _o/); */
+#define OCIDateSetTime(date, hour, min, sec) \
+ { \
+ (date)->OCIDateTime.OCITimeHH = hour; \
+ (date)->OCIDateTime.OCITimeMI = min; \
+ (date)->OCIDateTime.OCITimeSS = sec; \
+ }
+/*
+ NAME: OCIDateSetTime - OCIDate Set Time portion of date
+ PARAMETERS:
+ date (OUT) - Oracle date whose time data is set
+ hour (IN) - hour value to be set
+ min (IN) - minute value to be set
+ sec (IN) - second value to be set
+ DESCRIPTION:
+ Set the date with the given time inforamtion.
+ RETURNS:
+ NONE
+ */
+
+/*--------------------------- OCIDateSetDate --------------------------------*/
+/* void OCIDateSetDate(/o_ OCIDate *date, sb2 year, ub1 month, ub1 day _o/); */
+#define OCIDateSetDate(date, year, month, day) \
+ { \
+ (date)->OCIDateYYYY = year; \
+ (date)->OCIDateMM = month; \
+ (date)->OCIDateDD = day; \
+ }
+/*
+ NAME: OCIDateSetDate - OCIDate Set Date (year, month, day) portion of date
+ PARAMETERS:
+ date (IN) - Oracle date whose year, month, day data is set
+ year (OUT) - year value to be set
+ month (OUT) - month value to be set
+ day (OUT) - day value to be set
+ DESCRIPTION:
+ Set the date with the given year, month, day inforamtion.
+ RETURNS:
+ NONE
+ */
+
+/*--------------------------- OCIDateAssign ---------------------------------*/
+
+sword OCIDateAssign( OCIError *err, CONST OCIDate *from,
+ OCIDate *to );
+/*
+ NAME: OCIDateAssign - OCIDate Assignment
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ from (IN) - date to be assigned
+ to (OUT) - lhs of assignment
+ DESCRIPTION:
+ Performs date assignment.
+ RETURNS:
+ OCI_SUCCESS
+ */
+
+/*--------------------------- OCIDateToText ---------------------------------*/
+
+sword OCIDateToText( OCIError *err, CONST OCIDate *date,
+ CONST oratext *fmt, ub1 fmt_length,
+ CONST oratext *lang_name, ub4 lang_length,
+ ub4 *buf_size, oratext *buf );
+/*
+ NAME: OCIDateToText - OCIDate convert date TO String
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ date (IN) - Oracle date to be converted
+ fmt (IN) - conversion format, if null string pointer (oratext*)0, then
+ the date is converted to a character string in the
+ date format "DD-MON-YY".
+ fmt_length (IN) - length of the 'fmt' parameter
+ lang_name (IN) - specifies the language in which the names and
+ abbreviations of months and days are returned;
+ default language of session is used if 'lang_name'
+ is null i.e. (oratext *)0
+ lang_length (IN) - length of the 'nls_params' parameter
+ buf_size (IN/OUT) - size of the buffer; size of the resulting string
+ is returned via this parameter
+ buf (OUT) - buffer into which the converted string is placed
+ DESCRIPTION:
+ Converts the given date to a string according to the specified format.
+ Refer to "TO_DATE" conversion function described in
+ "Oracle SQL Language Reference Manual" for a description of format
+ and NLS arguments. The converted null-terminated date string is
+ stored in the buffer 'buf'.
+
+ An error is reported upon overflow, e.g. trying to convert a number
+ of value 10 using format '9' causes an overflow.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ invalid format
+ unknown language
+ overflow error
+ */
+
+/*---------------------------- OCIDateFromText ------------------------------*/
+
+sword OCIDateFromText( OCIError *err, CONST oratext *date_str,
+ ub4 d_str_length, CONST oratext *fmt, ub1 fmt_length,
+ CONST oratext *lang_name, ub4 lang_length,
+ OCIDate *date );
+/*
+ NAME: OCIDateFromText - OCIDate convert String TO Date
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ date_str (IN) - input string to be converted to Oracle date
+ d_str_length (IN) - size of the input string, if the length is -1
+ then 'date_str' is treated as a null terminated string
+ fmt (IN) - conversion format; if 'fmt' is a null pointer, then
+ the string is expected to be in 'DD-MON-YY' format.
+ fmt_length (IN) - length of the 'fmt' parameter
+ lang_name (IN) - language in which the names and abbreviations of
+ days and months are specified, if null i.e. (oratext *)0,
+ the default language of session is used,
+ lang_length (IN) - length of the 'lang_name' parameter
+ date (OUT) - given string converted to date
+ DESCRIPTION:
+ Converts the given string to Oracle date
+ according to the specified format. Refer to "TO_DATE" conversion
+ function described in "Oracle SQL Language Reference Manual" for a
+ description of format.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid format
+ unknown language
+ invalid input string
+ <to be discovered>
+ */
+
+/*----------------------------- OCIDateCompare ------------------------------*/
+
+sword OCIDateCompare( OCIError *err, CONST OCIDate *date1,
+ CONST OCIDate *date2, sword *result );
+/*
+ NAME: OCIDateCompare - OCIDate CoMPare dates
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ date1, date2 (IN) - dates to be compared
+ result (OUT) - comparison result, 0 if equal, -1 if date1 < date2,
+ 1 if date1 > date2
+ DESCRIPTION:
+ The function OCIDateCompare compares two dates. It returns -1 if date1
+ is smaller than date2, 0 if they are equal, and 1 if date1 is greater
+ than date2.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid date
+ <to be discovered>
+ */
+
+/*------------------------- OCIDateAddMonths --------------------------------*/
+
+sword OCIDateAddMonths( OCIError *err, CONST OCIDate *date, sb4 num_months,
+ OCIDate *result );
+/*
+ NAME: OCIDateAddMonths - OCIDate ADd or subtract Months
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ date (IN) - 'num_months' added or subtracted from 'date'
+ num_months (IN) - number of months to be added or subtracted
+ (a negative value will be subtracted)
+ result (IN/OUT) - result of adding or subtracting to 'date'
+ DESCRIPTION:
+ The function OCIDateAddDays adds or subtracts num_months from the
+ date 'date'.
+ If the input 'date' is the last day of a month, then
+ appropriate adjustments are made to ensure that the output date is
+ also the last day of the month. For example, Feb. 28 + 1 month =
+ March 31, and November 30 - 3 months = August 31. Otherwise the
+ 'result' date has the same day component as 'date'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid date
+ <to be discovered>
+ */
+
+/*--------------------------- OCIDateAddDays --------------------------------*/
+
+sword OCIDateAddDays( OCIError *err, CONST OCIDate *date, sb4 num_days,
+ OCIDate *result );
+/*
+ NAME: OCIDateAddDays - OCIDate ADd or subtract Days
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ date (IN) - 'num_days' added or subtracted from 'date'
+ num_days (IN) - number of days to be added or subtracted
+ (a negative value will be subtracted)
+ result (IN/OUT) - result of adding or subtracting to 'date'
+ DESCRIPTION:
+ The function OCIDateAddDays adds or subtracts num_days from the
+ date 'date'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid date
+ <to be discovered>
+ */
+
+/*--------------------------- OCIDateLastDay --------------------------------*/
+
+sword OCIDateLastDay( OCIError *err, CONST OCIDate *date,
+ OCIDate *last_day );
+/*
+ NAME: OCIDateLastDay - OCIDate get date of the LaST day of the month
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ date (IN) - input date
+ last_day (OUT) - last day of the month in date 'date'
+ DESCRIPTION:
+ The function OCIDateLastDay returns the date of the last day of the
+ month in date 'date'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid date
+ <to be discovered>
+ */
+
+/*----------------------- OCIDateDaysBetween --------------------------------*/
+
+sword OCIDateDaysBetween( OCIError *err, CONST OCIDate *date1,
+ CONST OCIDate *date2, sb4 *num_days );
+/*
+ NAME: OCIDateDaysBetween - OCIDate get number of days BeTWeen two dates
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ date1, date2 (IN) - input dates
+ num_days (OUT) - number of days between date1 and date2
+ DESCRIPTION:
+ The function OCIDateDaysBetween returns the number of days between
+ date1 and date2. The time is ignored in this computation.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid date
+ <to be discovered>
+ */
+
+/*------------------------ OCIDateZoneToZone --------------------------------*/
+
+sword OCIDateZoneToZone( OCIError *err, CONST OCIDate *date1,
+ CONST oratext *zon1,
+ ub4 zon1_length, CONST oratext *zon2,
+ ub4 zon2_length, OCIDate *date2 );
+/*
+ NAME: OCIDateZoneToZone - OCIDate convert date from one Zone TO another Zone
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ date1 (IN) - date to be converted
+ zon1 (IN) - zone of input date
+ zon1_length (IN) - length in bytes of string 'zon1'
+ zon2 (IN) - zone to be converted to
+ zon2_length (IN) - length in bytes of string 'zon2'
+ date2 (OUT) - converted date (in 'zon2')
+ DESCRIPTION:
+ Converts date from one time zone to another. Given date 'date1'
+ in time zone 'zon1' returns date 'date2' in time zone 'zon2'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invlid date
+ invald input time zone
+ invald output time zone
+ <to be discovered>
+ */
+
+/*--------------------------- OCIDateNextDay --------------------------------*/
+
+sword OCIDateNextDay( OCIError *err, CONST OCIDate *date,
+ CONST oratext *day_p, ub4 day_length,
+ OCIDate *next_day );
+/*
+ NAME: OCIDateNextDay - OCIDate get date of Next DaY
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ date (IN) - returned date should be later than this date
+ day (IN) - first day of week named by this is returned
+ day_length (IN) - length in bytes of string 'day'
+ next_day (OUT) - first day of the week named by 'day' later than 'date'
+ DESCRIPTION:
+ Returns the date of the first day of the
+ week named by 'day' that is later than date 'date'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid date
+ invalid day
+ <to be discovered>
+ */
+
+/*----------------------------- OCIDateCheck --------------------------------*/
+
+/* Listing of error bits used by OCIDateCheck() */
+#define OCI_DATE_INVALID_DAY 0x1 /* Bad DAy */
+#define OCI_DATE_DAY_BELOW_VALID 0x2 /* Bad DAy Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_MONTH 0x4 /* Bad MOnth */
+#define OCI_DATE_MONTH_BELOW_VALID 0x8 /* Bad MOnth Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_YEAR 0x10 /* Bad YeaR */
+#define OCI_DATE_YEAR_BELOW_VALID 0x20 /* Bad YeaR Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_HOUR 0x40 /* Bad HouR */
+#define OCI_DATE_HOUR_BELOW_VALID 0x80 /* Bad HouR Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_MINUTE 0x100 /* Bad MiNute */
+#define OCI_DATE_MINUTE_BELOW_VALID 0x200
+ /* Bad MiNute Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_SECOND 0x400 /* Bad SeCond */
+#define OCI_DATE_SECOND_BELOW_VALID 0x800
+ /* bad second Low/high bit (1=low)*/
+#define OCI_DATE_DAY_MISSING_FROM_1582 0x1000
+ /* Day is one of those "missing" from 1582 */
+#define OCI_DATE_YEAR_ZERO 0x2000 /* Year may not equal zero */
+#define OCI_DATE_INVALID_FORMAT 0x8000 /* Bad date format input */
+
+sword OCIDateCheck( OCIError *err, CONST OCIDate *date, uword *valid );
+/*
+ NAME: OCIDateCheck - OCIDate CHecK if the given date is valid
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ date (IN) - date to be checked
+ valid (OUT) - returns zero for a valid date, otherwise
+ the ORed combination of all error bits specified below:
+
+ Macro name Bit number Error
+ ---------- ---------- -----
+ OCI_DATE_INVALID_DAY 0x1 Bad day
+ OCI_DATE_DAY_BELOW_VALID 0x2 Bad DAy Low/high bit (1=low)
+ OCI_DATE_INVALID_MONTH 0x4 Bad MOnth
+ OCI_DATE_MONTH_BELOW_VALID 0x8 Bad MOnth Low/high bit (1=low)
+ OCI_DATE_INVALID_YEAR 0x10 Bad YeaR
+ OCI_DATE_YEAR_BELOW_VALID 0x20 Bad YeaR Low/high bit (1=low)
+ OCI_DATE_INVALID_HOUR 0x40 Bad HouR
+ OCI_DATE_HOUR_BELOW_VALID 0x80 Bad HouR Low/high bit (1=low)
+ OCI_DATE_INVALID_MINUTE 0x100 Bad MiNute
+ OCI_DATE_MINUTE_BELOW_VALID 0x200 Bad MiNute Low/high bit (1=low)
+ OCI_DATE_INVALID_SECOND 0x400 Bad SeCond
+ OCI_DATE_SECOND_BELOW_VALID 0x800 bad second Low/high bit (1=low)
+ OCI_DATE_DAY_MISSING_FROM_1582 0x1000 Day is one of those "missing"
+ from 1582
+ OCI_DATE_YEAR_ZERO 0x2000 Year may not equal zero
+ OCI_DATE_INVALID_FORMAT 0x8000 Bad date format input
+
+ So, for example, if the date passed in was 2/0/1990 25:61:10 in
+ (month/day/year hours:minutes:seconds format), the erroor returned
+ would be OCI_DATE_INVALID_DAY | OCI_DATE_DAY_BELOW_VALID |
+ OCI_DATE_INVALID_HOUR | OCI_DATE_INVALID_MINUTE
+
+ DESCRIPTION:
+ Check if the given date is valid.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'date' and 'valid' pointers are NULL pointers
+ */
+
+/*--------------------------- OCIDateSysDate --------------------------------*/
+
+sword OCIDateSysDate( OCIError *err, OCIDate *sys_date );
+/*
+ NAME: OCIDateSysDate - OCIDate get current SYStem date and time
+ PARAMETERS:
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ sys_date (OUT) - current system date and time
+ DESCRIPTION:
+ Returns the current system date and time.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ <to be discovered>
+ */
+
+/*****************************************************************************/
+/* FIXED-LENGTH STRING - CHAR (N) */
+/*****************************************************************************/
+
+/*
+ * An ADT attribute declared as "x CHAR(n)" is mapped to "OCIString *x;".
+ * The representation of OCIString * is shown below.
+ */
+
+/*****************************************************************************/
+/* VARIABLE-LENGTH STRING */
+/*****************************************************************************/
+
+/*
+ * The variable-length string is represented in C as a pointer to OCIString
+ * structure. The OCIString structure is opaque to the user. Functions are
+ * provided to allow the user to manipulate a variable-length string.
+ *
+ * A variable-length string can be declared as:
+ *
+ * OCIString *vstr;
+ *
+ * For binding variables of type OCIString* in OCI calls (OCIBindByName(),
+ * OCIBindByPos() and OCIDefineByPos()) use the external type code SQLT_VST.
+ */
+typedef struct OCIString OCIString;
+
+/*-------------------------- OCIStringAssign --------------------------------*/
+
+sword OCIStringAssign( OCIEnv *env, OCIError *err, CONST OCIString *rhs,
+ OCIString **lhs );
+/*
+ NAME: OCIStringAssign - OCIString Assign String to String
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ rhs (IN) - RHS of the assignment, the type of rhs is also OCIString
+ lhs (IN/OUT) - LHS of the assignment
+ DESCRIPTION:
+ Assign 'rhs' string to 'lhs' string. The 'lhs' string may be
+ resized depending upon the size of the 'rhs'. The assigned string is
+ null-terminated. The 'length' field will not include the extra byte
+ needed for null termination.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ out of space error
+ */
+
+/*---------------------- OCIStringAssignText --------------------------------*/
+
+sword OCIStringAssignText( OCIEnv *env, OCIError *err, CONST oratext *rhs,
+ ub4 rhs_len, OCIString **lhs );
+/*
+ NAME: OCIStringAssignText - OCIString Assign Text string to String
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ rhs (IN) - RHS of the assignment, the type of rhs is a text string
+ rhs_len (IN) - length of the 'rhs' string
+ lhs (IN/OUT) - LHS of the assignment
+ DESCRIPTION:
+ Assign 'rhs' string to 'lhs' string. The 'lhs' string may be
+ resized depending upon the size of the 'rhs'. The assigned string is
+ null-terminated. The 'length' field will not include the extra byte
+ needed for null termination.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ out of space error
+ */
+
+/*-------------------------- OCIStringResize --------------------------------*/
+
+sword OCIStringResize( OCIEnv *env, OCIError *err, ub4 new_size,
+ OCIString **str );
+/*
+ NAME: OCIStringResize - OCIString ReSiZe string memory
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ new_size (IN) - new memory size of the string in bytes
+ str (IN/OUT) - allocated memory for the string is freed from the
+ OOCI heap
+ DESCRIPTION:
+ This function resizes the memory of the given variable-length string in
+ the object cache. The contents of the string are NOT preserved.
+ This function may allocate the string in a new memory region in
+ which case the original memory occupied by the given string will
+ be freed. If the input string is null (str == NULL), then this
+ function will allocate memory for the string.
+
+ If the new_size is 0, then this function frees the memory occupied
+ by 'str' and a null pointer value is returned.
+
+ NOTE: The caller must compute 'new_size' taking into account space
+ for the null character ('\0').
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ out of space error
+ */
+
+/*---------------------------- OCIStringSize --------------------------------*/
+
+ub4 OCIStringSize( OCIEnv *env, CONST OCIString *vs );
+/*
+ NAME: OCIStringSize - OCIString Get String siZe
+ PARAMETERS:
+ env(IN) - pointer to OCI environment handle
+ vs (IN) - string whose size is returned
+ DESCRIPTION:
+ Return the size of the given string.
+ RETURNS:
+ size of the string in bytes is returned
+ */
+
+/*----------------------------- OCIStringPtr --------------------------------*/
+
+oratext *OCIStringPtr( OCIEnv *env, CONST OCIString *vs );
+/*
+ NAME: OCIStringPtr - OCIString Get String Pointer
+ PARAMETERS:
+ env(IN) - pointer to OCI environment handle
+ vs (IN) - pointer to the text of this string is returned
+ DESCRIPTION:
+ Return the pointer to the text of the given string.
+ RETURNS:
+ pointer to the text of the string is returned
+ */
+
+/*----------------------- OCIStringAllocSize --------------------------------*/
+
+sword OCIStringAllocSize( OCIEnv *env, OCIError *err, CONST OCIString *vs,
+ ub4 *allocsize );
+/*
+ NAME: OCIStringAllocSize - OCIString get Allocated SiZe of string memory
+ in bytes
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ vs (IN) - string whose allocated size in bytes is returned
+ allocsize (OUT) - allocated size of string memory in bytes is returned
+ DESCRIPTION:
+ Return the allocated size of the string memory in bytes. The
+ allocated size is >= actual string size.
+ REQUIRES:
+ vs is a non-null pointer
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR on error
+ */
+
+/*****************************************************************************/
+/* VARIABLE-LENGTH RAW */
+/*****************************************************************************/
+
+/*
+ * The variable-length raw is represented in C as a pointer to OCIRaw
+ * structure. The OCIRaw structure is opaque to the user. Functions are
+ * provided to allow the user to manipulate a variable-length raw.
+ *
+ * A variable-length raw can be declared as:
+ *
+ * OCIRaw *raw;
+ *
+ * For binding variables of type OCIRaw* in OCI calls (OCIBindByName(),
+ * OCIBindByPos() and OCIDefineByPos()) use the external type code SQLT_LVB.
+ */
+typedef struct OCIRaw OCIRaw;
+
+/*-------------------------- OCIRawAssignRaw --------------------------------*/
+
+sword OCIRawAssignRaw( OCIEnv *env, OCIError *err, CONST OCIRaw *rhs,
+ OCIRaw **lhs );
+/*
+ NAME: OCIRawAssignRaw - OCIRaw Assign Raw (of type OCIRaw*) to
+ Raw (of type OCIRaw*)
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ rhs (IN) - RHS of the assignment, the type of rhs is also OCIRaw
+ lhs (IN/OUT) - LHS of the assignment
+ DESCRIPTION:
+ Assign 'rhs' raw to 'lhs' raw. The 'lhs' raw may be
+ resized depending upon the size of the 'rhs'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ out of space error
+ */
+
+/*------------------------ OCIRawAssignBytes --------------------------------*/
+
+sword OCIRawAssignBytes( OCIEnv *env, OCIError *err, CONST ub1 *rhs,
+ ub4 rhs_len, OCIRaw **lhs );
+/*
+ NAME: OCIRawAssignBytes - OCIRaw Assign raw Bytes (of type ub1*) to Raw
+ (of type OCIRaw*)
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ rhs (IN) - RHS of the assignment, the type of rhs is ub1 *
+ rhs_len (IN) - length of the 'rhs' raw
+ lhs (IN/OUT) - LHS of the assignment
+ DESCRIPTION:
+ Assign 'rhs' raw to 'lhs' raw. The 'lhs' raw may be
+ resized depending upon the size of the 'rhs'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ out of space error
+ */
+
+/*---------------------------- OCIRawResize ---------------------------------*/
+
+sword OCIRawResize( OCIEnv *env, OCIError *err, ub4 new_size,
+ OCIRaw **raw );
+/*
+ NAME: OCIRawResize - OCIRaw ReSiZe memory of variable-length raw
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ new_size (IN) - new size of the raw data in bytes
+ raw (IN) - variable-length raw pointer; the raw is
+ resized to 'new_size'
+ DESCRIPTION:
+ This function resizes the memory of the given variable-length raw in
+ the object cache.
+ The previous contents of the raw are NOT preserved.
+ This function may allocate the raw in a new memory region in
+ which case the original memory occupied by the given raw will
+ be freed. If the input raw is null (raw == NULL), then this
+ function will allocate memory for the raw data.
+
+ If the new_size is 0, then this function frees the memory occupied
+ by 'raw' and a null pointer value is returned.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ out of space error
+ */
+
+/*------------------------------- OCIRawSize --------------------------------*/
+
+ub4 OCIRawSize( OCIEnv * env, CONST OCIRaw *raw );
+/*
+ NAME: OCIRawSize - OCIRaw Get Raw siZe
+ PARAMETERS:
+ env (IN) - pointer to OCI environment handle
+ raw (INT) - raw whose size is returned
+ DESCRIPTION:
+ Return the size of the given raw.
+ RETURNS:
+ size of the raw in bytes is returned
+ */
+
+/*--------------------------------- OCIRawPtr -------------------------------*/
+ub1 *OCIRawPtr( OCIEnv * env, CONST OCIRaw *raw );
+/*
+ NAME: OCIRawPtr - OCIRaw Get Raw data Pointer
+ PARAMETERS:
+ env (IN) - pointer to OCI environment handle
+ raw (IN) - pointer to the data of this raw is returned
+ DESCRIPTION:
+ Return the pointer to the data of the given raw.
+ RETURNS:
+ pointer to the data of the raw is returned
+ */
+
+/*------------------------------ OCIRawAllocSize ----------------------------*/
+
+sword OCIRawAllocSize( OCIEnv *env, OCIError *err, CONST OCIRaw *raw,
+ ub4 *allocsize );
+/*
+ NAME: OCIRawAllocSize - OCIRaw get Allocated SiZe of raw memory in bytes
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ raw (IN) - raw whose allocated size in bytes is returned
+ allocsize (OUT) - allocated size of raw memory in bytes is returned
+ DESCRIPTION:
+ Return the allocated size of the raw memory in bytes. The
+ allocated size is >= actual raw size.
+ REQUIRES:
+ raw is a non-null pointer
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR upon error
+ */
+
+/*****************************************************************************/
+/* OBJECT REFERENCE OPERATIONS */
+/*****************************************************************************/
+
+/*
+ * See the definition of OCIRef in oro.h.
+ *
+ * For binding variables of type OCIRef* in OCI calls (OCIBindByName(),
+ * OCIBindByPos() and OCIDefineByPos()) use the code SQLT_REF.
+ *
+ */
+
+/*---------------------------- OCIRefClear ----------------------------------*/
+void OCIRefClear( OCIEnv *env, OCIRef *ref );
+/*
+ NAME: OCIRefClear - OCIRef CLeaR or nullify a ref
+ PARAMETERS:
+ env (IN) - pointer to OCI environment handle
+ ref (IN/OUT) - ref to clear
+ DESCRIPTION:
+ Clear or nullify the given ref. A ref is considered to be a null ref
+ if it does not contain a valid OID (and thus doesn't point to an
+ object). Logically, a null ref is a dangling ref.
+
+ Note that a null ref is still a valid SQL value and is not SQL-ly null.
+ It can be used as a valid non-null constant ref value for NOT NULL
+ column or attribute of a row in a table.
+
+ If a null pointer value is passed as a ref,
+ then this function is a no-op.
+ */
+
+/*--------------------------- OCIRefAssign ----------------------------------*/
+sword OCIRefAssign( OCIEnv *env, OCIError *err, CONST OCIRef *source,
+ OCIRef **target );
+/*
+ NAME: OCIRefAssign - OCIRef CoPY a ref to another
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ source (IN) - ref to copy from
+ target (IN/OUT) - ref to copy to
+ DESCRIPTION:
+ Copy 'source' ref to 'target' ref; both then reference the same
+ object. If the target ref pointer is null (i.e. *target == NULL)
+ then the copy function will allocate memory for the target ref
+ in OOCI heap prior to the copy.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ 1) out of memory
+ */
+
+/*-------------------------- OCIRefIsEqual ----------------------------------*/
+boolean OCIRefIsEqual( OCIEnv *env, CONST OCIRef *x, CONST OCIRef *y );
+/*
+ NAME: OCIRefIsEqual - OCIRef compare two refs for EQUality
+ PARAMETERS:
+ env (IN) - pointer to OCI environment handle
+ x (IN) - ref to compare
+ y (IN) - ref to compare
+ DESCRIPTION:
+ Compare the given refs for equality.
+ Two refs are equal if and only if:
+ - they are both referencing the same persistent object, or
+ - they are both referencing the same transient object.
+
+ NOTE THAT TWO NULL REFS ARE CONSIDERED NOT EQUAL BY THIS FUNCTION.
+ RETURNS:
+ TRUE if the two refs are equal
+ FALSE if the two refs are not equal, or X is NULL, or Y is NULL
+ */
+
+/*--------------------------- OCIRefIsNull ----------------------------------*/
+boolean OCIRefIsNull( OCIEnv *env, CONST OCIRef *ref );
+/*
+ NAME: OCIRefIsNull - OCIRef test if a ref is NULl
+ PARAMETERS:
+ env (IN) - pointer to OCI environment handle
+ ref (IN) - ref to test for null
+ DESCRIPTION:
+ Return TRUE if the given ref is null; otherwise, return FALSE.
+ A ref is null if and only if:
+ - it is supposed to be referencing a persistent object, but
+ its OID is null, or
+ - it is supposed to be referencing a transient object, but it is
+ currently not pointing to an object.
+ A ref is a dangling ref if the object that it points to does not
+ exist.
+ RETURNS:
+ TRUE if the given ref is NULL
+ FALSE if the given ref is not NULL
+ */
+
+/*-------------------------- OCIRefHexSize ----------------------------------*/
+ub4 OCIRefHexSize( OCIEnv *env, CONST OCIRef *ref );
+/*
+ NAME: OCIRefHexSize - OCIRef Hexadecimal buffer SiZe in bytes
+ PARAMETERS:
+ env (IN) - pointer to OCI environment handle
+ ref (IN) - ref whose size in hexadecimal representation in bytes is
+ returned
+ DESCRIPTION:
+ Return the size of the buffer in bytes required for the hexadecimal
+ representation of the ref. A buffer of at-least this size must be
+ passed to ref-to-hex (OCIRefToHex) conversion function.
+ RETURNS:
+ size of hexadecimal representation of ref
+ */
+
+/*-------------------------- OCIRefFromHex ---------------------------------*/
+sword OCIRefFromHex( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+ CONST oratext *hex, ub4 length, OCIRef **ref );
+/*
+ NAME:
+ OCIRefFromHex - OCIRef convert a Hexadecimal string TO a Ref
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by
+ calling OCIErrorGet().
+ svc (IN) - OCI service context handle; if the resulting ref is
+ initialized with this service context
+ hex (IN) - hexadecimal string (that was produced by 'OCIRefToHex()"
+ previously) to be convert into a ref
+ length (IN) - length of the hexadecimal string
+ ref (IN/OUT) - ref is initialized with the given value ('hex').
+ If *ref is null, then space for the ref is allocated in the
+ object cache, otherwise the memory occupied by the given ref
+ is re-used.
+ DESCRIPTION:
+ Convert the given hexadecimal string into a ref. This function
+ ensures that the resulting ref is well formed. It does NOT ensure
+ that the object pointed to by the resulting ref exists or not.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ */
+
+/*--------------------------- OCIRefToHex -----------------------------------*/
+sword OCIRefToHex( OCIEnv *env, OCIError *err, CONST OCIRef *ref,
+ oratext *hex, ub4 *hex_length );
+/*
+ NAME:
+ OCIRefToHex - OCIRef convert ref to a Hexadecimal string
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by
+ calling OCIErrorGet().
+ ref (IN) - ref to be converted into a hexadecimal string; if the
+ ref is a null ref (i.e. OCIRefIsNull(ref) == TRUE) then
+ a zero hex_length value is returned
+ hex (OUT) - buffer that is large enough to contain the resulting
+ hexadecimal string; the contents of the string is opaque
+ to the caller
+ hex_length (IN/OUT) - on input specifies the size of the 'hex' buffer,
+ on output specifies the actual size of the hexadecimal
+ string being returned in 'hex'
+ DESCRIPTION:
+ Convert the given ref into a hexadecimal string, and return the length
+ of the string. The resulting string is opaque to the caller.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ the given buffer is not big enough to hold the resulting string
+ */
+
+
+/*****************************************************************************/
+/* COLLECTION FUNCTIONS */
+/*****************************************************************************/
+
+/*
+ The generic collection is represented by the type 'OCIColl'. The following
+ operations OCIColl*() are provided on a generic collection:
+ - get current size of collection
+ - get upper bound of collection
+ - get pointer to an element given its index
+ - set element at given index (assign element)
+ - append an element
+ - trim the given number of elements from the end of the collection
+ - collection assignment
+
+ The following iterator based scanning functions are also provided on a
+ generic collection. These functions make use of an iterator which is
+ defined to be of type OCIIter.
+
+ - create an iterator for scanning collection
+ - destroy iterator
+ - reset iterator to the beginning of collection
+ - get pointer to current element pointed by iterator
+ - get pointer to next element
+ - get pointer to previous element
+
+ The collections variable-length array (varray) and nested table
+ are sub-types of generic collection. This means that the OCIColl*()
+ functions can also be used to manipulate varray and nested table.
+
+ The varray is represented by OCIArray type and nested table by OCITable.
+ Besides OCIColl*() functions no additional functions are provided for
+ manipulating varrays. The OCIColl*() functions are a complete set of
+ functions to manipulate varrays.
+
+ Besides OCIColl*() functions, the following functions OCITable*() can be
+ used to manipulate nested table. The OCITable*() functions operate on
+ nested tables only and should not be used on a varray.
+
+ - delete an element at index i. Note that the position
+ ordinals of the remaining elements of the table is not changed by the
+ delete operation. So delete creates "holes" in the table.
+ - check if an element exists at the given index i
+ - return the smallest value of i for which exists(i) is true
+ - return the largest value of i for which exists(i) is true
+ - return pointer to the smallest position j, greater than i, such that
+ OCITableExists(j) is true
+ - return pointer to the largest position j, less than i, such that
+ OCITableExists(j) is true
+
+ For binding variables of type OCIColl* or OCITable* in OCI calls
+ (OCIBindByName(), OCIBindByPos() and OCIDefineByPos()) use the external
+ type code SQLT_NTY.
+ */
+
+/* OCIColl - generic collection type */
+typedef struct OCIColl OCIColl;
+
+/* OCIArray - varray collection type */
+typedef OCIColl OCIArray;
+
+/* OCITable - nested table collection type */
+typedef OCIColl OCITable;
+
+/* OCIIter - collection iterator */
+typedef struct OCIIter OCIIter;
+
+/*----------------------------- OCICollSize ---------------------------------*/
+
+sword OCICollSize( OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+ sb4 *size );
+/*
+ NAME: OCICollSize - OCIColl return current SIZe of the given collection
+ PARAMETERS:
+ env(IN) - pointer to OCI environment handle
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ coll (IN) - collection whose number of elements is returned
+ size (OUT) - current number of elements in the collection
+ DESCRIPTION:
+ Returns the current number of elements in the given collection.
+
+ For collections of type nested table wherein 'delete element'
+ operation is allowed, the count returned by OCICollSize() will
+ NOT be decremented upon deleting elements. For example:
+
+ OCICollSize(...);
+ // assume 'size' returned is equal to 5
+ OCITableDelete(...); // delete one element
+ OCICollSize(...);
+ // 'size' returned will still be 5
+
+ To get the count minus the deleted elements use OCITableSize().
+ Continuing the above example,
+
+ OCITableSize(...)
+ // 'size' returned will be equal to 4
+
+ Note, a trim operation (OCICollTrim) will decrement the count
+ by the number of trimmed elements. Continuing the above example,
+
+ OCICollTrim(..,1..); // trim one element
+ OCICollSize(...);
+ // 'size' returned will be equal to 4
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ error during loading of collection into object cache
+ any of the input parameters is null
+ */
+
+/*------------------------------ OCICollMax ---------------------------------*/
+
+sb4 OCICollMax( OCIEnv *env, CONST OCIColl *coll );
+/*
+ NAME: OCICollMax - OCIColl return MAXimum size (upper-bound) of the
+ given collection (in number of elements)
+ PARAMETERS:
+ env(IN) - pointer to OCI environment handle
+ coll (IN) - collection whose upper-bound in number of elements
+ is returned
+ DESCRIPTION:
+ Returns the max number of elements that the given collection can hold.
+ A value 0 indicates that the collection has no upper-bound.
+ REQUIRES:
+ coll must point to a valid collection descriptor
+ RETURNS:
+ upper-bound of the given collection
+ */
+
+/*-------------------------- OCICollGetElem ---------------------------------*/
+
+sword OCICollGetElem( OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+ sb4 index, boolean *exists, dvoid **elem,
+ dvoid **elemind );
+/*
+ NAME: OCICollGetElem - OCIColl GET pointer to the element at the given index
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ coll (IN) - pointer to the element in this collection is returned
+ index (IN) - index of the element whose pointer is returned
+ exists (OUT) - set to FALSE if element at the specified index does
+ not exist else TRUE
+ elem (OUT) - address of the desired element is returned
+ elemind (OUT) [optional] - address of the null indicator information
+ is returned; if (elemind == NULL) then the null indicator
+ information will NOT be returned
+ DESCRIPTION:
+ Get the address of the element at the given position. Optionally
+ this function also returns the address of the element's null indicator
+ information.
+
+ The following table describes for each collection element type
+ what the corresponding element pointer type is. The element pointer
+ is returned via the 'elem' parameter of OCICollGetElem().
+
+ Element Type *elem is set to
+ ----------------------- ---------------
+ Oracle Number (OCINumber) OCINumber*
+ Date (OCIDate) OCIDate*
+ Variable-length string (OCIString*) OCIString**
+ Variable-length raw (OCIRaw*) OCIRaw**
+ object reference (OCIRef*) OCIRef**
+ lob locator (OCILobLocator*) OCILobLocator**
+ object type (e.g. person) person*
+
+ The element pointer returned by OCICollGetElem() is in a form
+ such that it can not only be used to access the
+ element data but also is in a form that can be used as the target
+ (i.e left-hand-side) of an assignment statement.
+
+ For example, assume the user is iterating over the elements of
+ a collection whose element type is object reference (OCIRef*). A call
+ to OCICollGetElem() returns pointer to a reference handle
+ (i.e. OCIRef**). After getting, the pointer to the collection
+ element, the user may wish to modify it by assigning a new reference.
+ This can be accomplished via the ref assignment function shown below:
+
+ sword OCIRefAssign( OCIEnv *env, OCIError *err, CONST OCIRef *source,
+ OCIRef **target );
+
+ Note that the 'target' parameter of OCIRefAssign() is of type
+ 'OCIRef**'. Hence OCICollGetElem() returns 'OCIRef**'.
+ If '*target == NULL' a new ref will be allocated by OCIRefAssign()
+ and returned via the 'target' parameter.
+
+ Similarly, if the collection element was of type string (OCIString*),
+ OCICollGetElem() returns pointer to string handle
+ (i.e. OCIString**). If a new string is assigned, via
+ OCIStringAssign() or OCIStringAssignText() the type of the target
+ must be 'OCIString **'.
+
+ If the collection element is of type Oracle number, OCICollGetElem()
+ returns OCINumber*. The prototype of OCINumberAssign() is shown below:
+
+ sword OCINumberAssign(OCIError *err, CONST OCINumber *from,
+ OCINumber *to);
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ */
+
+/*------------------------- OCICollGetElemArray -----------------------------*/
+
+sword OCICollGetElemArray( OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+ sb4 index, boolean *exists, dvoid **elem,
+ dvoid **elemind, uword *nelems);
+/*
+ NAME: OCICollGetElemArray - OCIColl GET pointers to elements from given index
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ coll (IN) - pointers to the elements in this collection is returned
+ index (IN) - starting index of the element
+ exists (OUT) - set to FALSE if element at the specified index does
+ not exist else TRUE
+ elem (OUT) - address of the desired elements is returned
+ elemind (OUT) [optional] - address of the null indicators information
+ is returned; if (elemind == NULL) then the null indicator
+ information will NOT be returned
+ nelems(IN/OUT) - Upper bound of elem and/or elemind array
+ DESCRIPTION:
+ Get the address of the elements from the given position. Optionally
+ this function also returns the address of the element's null indicator
+ information.
+
+ The following table describes for each collection element type
+ what the corresponding element pointer type is. The element pointer
+ is returned via the 'elem' parameter of OCICollGetElem().
+
+ Element Type *elem is set to
+ ----------------------- ---------------
+ Oracle Number (OCINumber) OCINumber*
+ Date (OCIDate) OCIDate*
+ Variable-length string (OCIString*) OCIString**
+ Variable-length raw (OCIRaw*) OCIRaw**
+ object reference (OCIRef*) OCIRef**
+ lob locator (OCILobLocator*) OCILobLocator**
+ object type (e.g. person) person*
+
+ The element pointer returned by OCICollGetElem() is in a form
+ such that it can not only be used to access the
+ element data but also is in a form that can be used as the target
+ (i.e left-hand-side) of an assignment statement.
+
+ For example, assume the user is iterating over the elements of
+ a collection whose element type is object reference (OCIRef*). A call
+ to OCICollGetElem() returns pointer to a reference handle
+ (i.e. OCIRef**). After getting, the pointer to the collection
+ element, the user may wish to modify it by assigning a new reference.
+ This can be accomplished via the ref assignment function shown below:
+
+ sword OCIRefAssign( OCIEnv *env, OCIError *err, CONST OCIRef *source,
+ OCIRef **target );
+
+ Note that the 'target' parameter of OCIRefAssign() is of type
+ 'OCIRef**'. Hence OCICollGetElem() returns 'OCIRef**'.
+ If '*target == NULL' a new ref will be allocated by OCIRefAssign()
+ and returned via the 'target' parameter.
+
+ Similarly, if the collection element was of type string (OCIString*),
+ OCICollGetElem() returns pointer to string handle
+ (i.e. OCIString**). If a new string is assigned, via
+ OCIStringAssign() or OCIStringAssignText() the type of the target
+ must be 'OCIString **'.
+
+ If the collection element is of type Oracle number, OCICollGetElem()
+ returns OCINumber*. The prototype of OCINumberAssign() is shown below:
+
+ sword OCINumberAssign(OCIError *err, CONST OCINumber *from,
+ OCINumber *to);
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ */
+
+/*----------------------- OCICollAssignElem ---------------------------------*/
+
+sword OCICollAssignElem( OCIEnv *env, OCIError *err, sb4 index,
+ CONST dvoid *elem,
+ CONST dvoid *elemind, OCIColl *coll );
+/*
+ NAME: OCICollAssignElem - OCIColl ASsign Element
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ index (IN) - index of the element whose is assigned to
+ elem (IN) - element which is assigned from (source element)
+ elemind (IN) [optional] - pointer to the element's null indicator
+ information; if (elemind == NULL) then the null indicator
+ information of the assigned element will be set to non-null.
+ coll (IN/OUT) - collection to be updated
+ DESCRIPTION:
+ Assign the given element value 'elem' to the element at coll[index].
+ If the collection is of type nested table, the element at the given
+ index may not exist (i.e. may have been deleted). In this case, the
+ given element is inserted at index 'index'.
+ Otherwise, the element at index 'index' is updated with the value
+ of 'elem'.
+
+ Note that the given element is deep-copied and
+ 'elem' is strictly an input parameter.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ out of memory error
+ given index is out of bounds of the given collection
+ */
+
+/*--------------------------- OCICollAssign ---------------------------------*/
+
+sword OCICollAssign( OCIEnv *env, OCIError *err, CONST OCIColl *rhs,
+ OCIColl *lhs );
+/*
+ NAME: OCICollAssign - OCIColl ASsiGn collection
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ rhs (IN) - collection to be assigned from
+ lhs (OUT) - collection to be assigned to
+ DESCRIPTION:
+ Assign 'rhs' to 'lhs'. The 'lhs' collection may be decreased or
+ increased depending upon the size of 'rhs'. If the 'lhs' contains
+ any elements then the elements will be deleted prior to the
+ assignment. This function performs a deep-copy. The memory for the
+ elements comes from the object cache.
+
+ An error is returned if the element types of the lhs and rhs
+ collections do not match. Also, an error is returned if the
+ upper-bound of the lhs collection is less than the current number of
+ elements in the rhs collection.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ out of memory error
+ type mis-match of lhs and rhs collections
+ upper-bound of lhs collection is less than the current number of
+ elements in the rhs collection
+ */
+
+/*--------------------------- OCICollAppend ---------------------------------*/
+
+sword OCICollAppend( OCIEnv *env, OCIError *err, CONST dvoid *elem,
+ CONST dvoid *elemind, OCIColl *coll );
+/*
+ NAME: OCICollAppend - OCIColl APPend collection
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the element which is appended to the end
+ of the given collection
+ elemind (IN) [optional] - pointer to the element's null indicator
+ information; if (elemind == NULL) then the null indicator
+ information of the appended element will be set to non-null.
+ coll (IN/OUT) - updated collection
+ DESCRIPTION:
+ Append the given element to the end of the given collection.
+ Appending an element is equivalent to:
+ - increasing the size of the collection by 1 element
+ - updating (deep-copying) the last element's data with the given
+ element's data
+
+ Note that the pointer to the given element 'elem' will not be saved
+ by this function. So 'elem' is strictly an input parameter.
+ An error is returned if the current size of the collection
+ is equal to the max size (upper-bound) of the collection prior to
+ appending the element.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ out of memory error
+ current size of collection == max size of the collection
+ */
+
+/*----------------------------- OCICollTrim ---------------------------------*/
+
+sword OCICollTrim( OCIEnv *env, OCIError *err, sb4 trim_num,
+ OCIColl *coll );
+/*
+ NAME: OCICollTrim - OCIColl Trim elements from the end of the collection
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ trim_num (IN) - number of elements to trim
+ coll (IN/OUT) - 'trim_num' of elements are removed (freed) from the
+ end of the collection
+ DESCRIPTION:
+ Trim the collection by the given number of elements. The elements are
+ removed from the end of the collection.
+
+ An error is returned if the 'trim_num' is greater than the current
+ size of the collection.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ 'trim_num' is greater than the current size of the collection.
+ */
+
+/*--------------------------- OCICollIsLocator ------------------------------*/
+
+sword OCICollIsLocator(OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+ boolean *result );
+/*
+Name: OCICollIsLocator - OCIColl indicates whether a collection is locator
+ based or not.
+Parameters:
+ env(IN) - pointer to OCI environment handle
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ coll (IN) - collection item.
+ result (OUT) - TRUE if the collection item is a locator, FALSE
+ otherwise
+Description:
+ Returns TRUE in the result OUT parameter if the collection item is a
+ locator, otherwise returns FALSE.
+Returns:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+*/
+
+/*---------------------------- OCIIterCreate --------------------------------*/
+
+sword OCIIterCreate( OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+ OCIIter **itr );
+/*
+ NAME: OCIIterCreate - OCIColl Create an ITerator to scan the collection
+ elements
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ coll (IN) - collection which will be scanned; the different
+ collection types are varray and nested table
+ itr (OUT) - address to the allocated collection iterator is
+ returned by this function
+ DESCRIPTION:
+ Create an iterator to scan the elements of the collection. The
+ iterator is created in the object cache. The iterator is initialized
+ to point to the beginning of the collection.
+
+ If the next function (OCIIterNext) is called immediately
+ after creating the iterator then the first element of the collection
+ is returned.
+ If the previous function (OCIIterPrev) is called immediately after
+ creating the iterator then "at beginning of collection" error is
+ returned.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ out of memory error
+ */
+
+/*----------------------------- OCIIterDelete ------------------------------*/
+
+sword OCIIterDelete( OCIEnv *env, OCIError *err, OCIIter **itr );
+/*
+ NAME: OCIIterDelete - OCIColl Delete ITerator
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ itr (IN/OUT) - the allocated collection iterator is destroyed and
+ the 'itr' is set to NULL prior to returning
+ DESCRIPTION:
+ Delete the iterator which was previously created by a call to
+ OCIIterCreate.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ to be discovered
+ */
+
+/*----------------------------- OCIIterInit ---------------------------------*/
+
+sword OCIIterInit( OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+ OCIIter *itr );
+/*
+ NAME: OCIIterInit - OCIColl Initialize ITerator to scan the given
+ collection
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ coll (IN) - collection which will be scanned; the different
+ collection types are varray and nested table
+ itr (IN/OUT) - pointer to an allocated collection iterator
+ DESCRIPTION:
+ Initializes the given iterator to point to the beginning of the
+ given collection. This function can be used to:
+
+ a. reset an iterator to point back to the beginning of the collection
+ b. reuse an allocated iterator to scan a different collection
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ */
+
+/*------------------------ OCIIterGetCurrent --------------------------------*/
+
+sword OCIIterGetCurrent( OCIEnv *env, OCIError *err, CONST OCIIter *itr,
+ dvoid **elem, dvoid **elemind );
+/*
+ NAME: OCIIterGetCurrent - OCIColl Iterator based, get CURrent collection
+ element
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ itr (IN) - iterator which points to the current element
+ elem (OUT) - address of the element pointed by the iterator is returned
+ elemind (OUT) [optional] - address of the element's null indicator
+ information is returned; if (elemind == NULL) then the null
+ indicator information will NOT be returned
+ DESCRIPTION:
+ Returns pointer to the current element and its corresponding null
+ information.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ */
+
+/*------------------------------ OCIIterNext --------------------------------*/
+
+sword OCIIterNext( OCIEnv *env, OCIError *err, OCIIter *itr,
+ dvoid **elem, dvoid **elemind, boolean *eoc );
+/*
+ NAME: OCIIterNext - OCIColl Iterator based, get NeXT collection element
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ itr (IN/OUT) - iterator is updated to point to the next element
+ elem (OUT) - after updating the iterator to point to the next element,
+ address of the element is returned
+ elemind (OUT) [optional] - address of the element's null indicator
+ information is returned; if (elemind == NULL) then the null
+ indicator information will NOT be returned
+ eoc (OUT) - TRUE if iterator is at End Of Collection (i.e. next
+ element does not exist) else FALSE
+ DESCRIPTION:
+ Returns pointer to the next element and its corresponding null
+ information. The iterator is updated to point to the next element.
+
+ If the iterator is pointing to the last element of the collection
+ prior to executing this function, then calling this function will
+ set eoc flag to TRUE. The iterator will be left unchanged in this
+ situation.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ */
+
+/*------------------------------ OCIIterPrev --------------------------------*/
+
+sword OCIIterPrev( OCIEnv *env, OCIError *err, OCIIter *itr,
+ dvoid **elem, dvoid **elemind, boolean *boc );
+/*
+ NAME: OCIIterPrev - OCIColl Iterator based, get PReVious collection element
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ itr (IN/OUT) - iterator is updated to point to the previous
+ element
+ elem (OUT) - after updating the iterator to point to the previous
+ element, address of the element is returned
+ elemind (OUT) [optional] - address of the element's null indicator
+ information is returned; if (elemind == NULL) then the null
+ indicator information will NOT be returned
+ boc (OUT) - TRUE if iterator is at Beginning Of Collection (i.e.
+ previous element does not exist) else FALSE.
+ DESCRIPTION:
+ Returns pointer to the previous element and its corresponding null
+ information. The iterator is updated to point to the previous element.
+
+ If the iterator is pointing to the first element of the collection
+ prior to executing this function, then calling this function will
+ set 'boc' to TRUE. The iterator will be left unchanged in this
+ situation.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ */
+
+/*****************************************************************************/
+/* FUNCTIONS WHICH OPERATE ONLY ON NESTED TABLE OCITable*() */
+/*****************************************************************************/
+
+/*---------------------------- OCITableSize ---------------------------------*/
+
+sword OCITableSize( OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+ sb4 *size);
+/*
+ NAME: OCITableSize - OCITable return current SIZe of the given
+ nested table (not including deleted elements)
+ PARAMETERS:
+ env(IN) - pointer to OCI environment handle
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tbl (IN) - nested table whose number of elements is returned
+ size (OUT) - current number of elements in the nested table. The count
+ does not include deleted elements.
+ DESCRIPTION:
+ Returns the count of elements in the given nested table.
+
+ The count returned by OCITableSize() will be decremented upon
+ deleting elements from the nested table. So, this count DOES NOT
+ includes any "holes" created by deleting elements.
+ For example:
+
+ OCITableSize(...);
+ // assume 'size' returned is equal to 5
+ OCITableDelete(...); // delete one element
+ OCITableSize(...);
+ // 'size' returned will be equal to 4
+
+ To get the count plus the count of deleted elements use
+ OCICollSize(). Continuing the above example,
+
+ OCICollSize(...)
+ // 'size' returned will still be equal to 5
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ error during loading of nested table into object cache
+ any of the input parameters is null
+ */
+
+/*---------------------- OCITableExists ---------------------------------*/
+
+sword OCITableExists( OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+ sb4 index, boolean *exists );
+/*
+ NAME: OCITableExists - OCITable test whether element at the given index
+ EXIsts
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tbl (IN) - table in which the given index is checked
+ index (IN) - index of the element which is checked for existence
+ exists (OUT) - set to TRUE if element at given 'index' exists
+ else set to FALSE
+ DESCRIPTION:
+ Test whether an element exists at the given 'index'.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ */
+
+/*--------------------------- OCITableDelete -------------------------------*/
+
+sword OCITableDelete( OCIEnv *env, OCIError *err, sb4 index,
+ OCITable *tbl );
+/*
+ NAME: OCITableDelete - OCITable DELete element at the specified index
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ index (IN) - index of the element which must be deleted
+ tbl (IN) - table whose element is deleted
+ DESCRIPTION:
+ Delete the element at the given 'index'. Note that the position
+ ordinals of the remaining elements of the table is not changed by the
+ delete operation. So delete creates "holes" in the table.
+
+ An error is returned if the element at the specified 'index' has
+ been previously deleted.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ any of the input parameters is null
+ given index is not valid
+ */
+
+/*--------------------------- OCITableFirst ---------------------------------*/
+
+sword OCITableFirst( OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+ sb4 *index );
+/*
+ NAME: OCITableFirst - OCITable return FirST index of table
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tbl (IN) - table which is scanned
+ index (OUT) - first index of the element which exists in the given
+ table is returned
+ DESCRIPTION:
+ Return the first index of the element which exists in the given
+ table.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ table is empty
+ */
+
+/*---------------------------- OCITableLast ---------------------------------*/
+
+sword OCITableLast( OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+ sb4 *index );
+/*
+ NAME: OCITableFirst - OCITable return LaST index of table
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tbl (IN) - table which is scanned
+ index (OUT) - last index of the element which exists in the given
+ table is returned
+ DESCRIPTION:
+ Return the last index of the element which exists in the given
+ table.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ table is empty
+ */
+
+/*---------------------------- OCITableNext ---------------------------------*/
+
+sword OCITableNext( OCIEnv *env, OCIError *err, sb4 index,
+ CONST OCITable *tbl, sb4 *next_index,
+ boolean *exists );
+/*
+ NAME: OCITableNext - OCITable return NeXT available index of table
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ index (IN) - starting at 'index' the index of the next element
+ which exists is returned
+ tbl (IN) - table which is scanned
+ next_index (OUT) - index of the next element which exists
+ is returned
+ exists (OUT) - FALSE if no next index available else TRUE
+ DESCRIPTION:
+ Return the smallest position j, greater than 'index', such that
+ exists(j) is TRUE.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ no next index available
+ */
+
+/*---------------------------- OCITablePrev ---------------------------------*/
+
+sword OCITablePrev( OCIEnv *env, OCIError *err, sb4 index,
+ CONST OCITable *tbl, sb4 *prev_index,
+ boolean *exists );
+/*
+ NAME: OCITablePrev - OCITable return PReVious available index of table
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ index (IN) - starting at 'index' the index of the previous element
+ which exists is returned
+ tbl (IN) - table which is scanned
+ prev_index (OUT) - index of the previous element which exists
+ is returned
+ exists (OUT) - FALSE if no next index available else TRUE
+ DESCRIPTION:
+ Return the largest position j, less than 'index', such that
+ exists(j) is TRUE.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+ OCI_ERROR if
+ no previous index available
+ */
+
+/*------------------------ OCINumberToLnx -----------------------------------*/
+/* void OCINumberToLnx(/o_ OCINumber *num _o/); */
+
+#define OCINumberToLnx(num) ((lnxnum_t *)num)
+
+/*
+ NAME: OCINumberToLnx
+ PARAMETERS:
+ num (IN) - OCINumber to convert ;
+ DESCRIPTION:
+ Converts OCINumber to its internal lnx format
+ This is not to be used in Public interfaces , but
+ has been provided due to special requirements from
+ SQLPLUS development group as they require to call
+ Core funtions directly .
+*/
+
+/* OCI representation of XMLType */
+typedef struct OCIXMLType OCIXMLType;
+
+/* OCI representation of OCIDomDocument */
+typedef struct OCIDOMDocument OCIDOMDocument;
+
+#endif /* ORL_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/oro.h b/src/terralib/drivers/OracleSpatial/OCI/include/oro.h
new file mode 100644
index 0000000..e825a5c
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/oro.h
@@ -0,0 +1,883 @@
+/* Copyright (c) 1994, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+ OCI - Oracle Object Interface for External/Internal/Kernel Clients
+
+ DESCRIPTION
+ This header file contains Oracle object interface definitions which
+ can be included by external user applications, tools, as well as
+ the kernel. It defines types and constants that are common to all
+ object interface which is being defined in several other header files
+ (e.g., ori.h, ort.h, and orl.h).
+
+ RELATED DOCUMENTS
+ TBD
+
+ INSPECTION STATUS [[ deletable if no inspection ]]
+ Inspection date: [[ date of the last logging meeting ]]
+ Inspection status: [[ exited, not exited, or N/A if exit is not a goal ]]
+ Estimated increasing cost defects per page:
+ Rule sets: [[ rule sets inspected against or planned to be
+ inspected against ]]
+
+ ACCEPTANCE REVIEW STATUS [[ deletable if no approval review ]]
+ Review date: [[ date of the meeting where issues were logged and the
+ approval status was decided ]]
+ Review status: [[ current status: accepted, conditionally accepted,
+ major revision required, rejected ]]
+ Reviewers: [[ names of the members on the review team ]]
+
+ PUBLIC FUNCTIONS
+
+ EXAMPLES
+ Examples are given in the description of each function or macro where
+ relevant.
+
+ MODIFIED
+ mnanal 06/09/03 - backout of fix 2836388
+ mnanal 05/14/03 - bug-2836388
+ srseshad 11/27/02 - Change OCI_TYPECODE_BFLOAT/BDOUBLE codes
+ rxgovind 10/09/02 - add OCI_TYPECODE_UROWID
+ mxyang 09/17/02 - grabtrans 'mmorsi_obj_float'
+ srseshad 09/11/02 -
+ srseshad 09/01/02 -
+ aahluwal 06/03/02 - bug 2360115
+ celsbern 10/19/01 - merge LOG to MAIN
+ rxgovind 10/16/01 - update typecodes
+ rxgovind 09/19/01 - add typecodes
+ rkasamse 08/15/01 - add OCI_DURATION_USER_CALLBACK
+ jchai 09/24/01 - add type code for PLS_INTEGER
+ porangas 08/22/01 - Fix bug#1776434
+ schatter 04/09/01 - merge 1456235: define OCI_DURATION_INVALID
+ rdani 10/12/00 - 1449943 NOCOPY and PIPELINE
+ ciyer 05/26/00 - short names for abstract, overriding
+ rkasamse 05/25/00 - OCCI enhancements
+ smuralid 05/11/00 - OCITypeMethodFlags - add NOT INSTANTIABLE, OVERRIDING
+ rxgovind 05/09/00 - add OCI_TYPECODE_NONE
+ tnbui 07/28/99 - Remove OCI_TYPECODE_TIMESTAMP_ITZ
+ tnbui 07/21/99 - TS LOCAL TZ
+ thoang 06/21/99 - Add OCI_TYPECODE_TIMESTAMP_ITZ
+ thoang 03/04/99 - Add datetime datatypes
+ rkasamse 10/20/98 - add OCI_ATTR_CACHE_ARRAYFLUSH
+ rkasamse 10/29/98 - add OCI_DURATION_CALLOUT
+ rkasamse 04/28/98 - OCI_OBJECT_DETECTCHANGE -> OCI_ATTR_OBJECT_DETECTCHAN
+ rkasamse 04/28/98 - OCI_OBJECT_NEWNOTNULL -> OCI_ATTR_OBJECT_NEWNOTNULL
+ rkasamse 04/23/98 - add OCI_OBJECT_DETECTCHANGE
+ rkasamse 04/03/98 - add OCI_OBJECT_NEWNOTNULL
+ pmitra 04/01/98 - OCI_LOCK_X_NOWAIT added
+ rxgovind 02/18/98 - add OCI_TYPECODE_OPAQUE
+ rkasamse 02/13/98 - Add OCI_DURATION_PROCESS
+ cxcheng 07/28/97 - fix compile with SLSHORTNAME
+ skrishna 07/14/97 - add OCIObjectGetProperty
+ cxcheng 04/30/97 - make OCITypeParamMode values consistent with PL/SQL
+ skrishna 04/28/97 - undocument OCIObjectProperty & OCIObjectEvent
+ cxcheng 03/29/97 - remove all remaining short names
+ sthakur 03/20/97 - add casts to constants
+ cxcheng 02/21/97 - temporarily put SLSHORTNAME for PL/SQL
+ cxcheng 02/06/97 - take out short name support except with SLSHORTNAME
+ lchidamb 01/20/97 - update OCIRef comments
+ sgollapu 11/19/96 - Add OCI type codes for BOOL,REC,and TAB
+ cxcheng 11/19/96 - more typecode changes
+ cxcheng 11/13/96 - add #include for ocidfn.h
+ cxcheng 11/13/96 - add OCI_TYPECODE_ADT for compatibility
+ cxcheng 11/12/96 - add SQLT_NCO for named collection
+ cxcheng 11/11/96 - more changes to typecodes
+ cxcheng 11/07/96 - #define OCI_TYPECODE_MLSLABEL to SQLT_LAB
+ cxcheng 11/06/96 - fix #define omission for OROTCNAT
+ cxcheng 10/30/96 - move OCI_TYPECODE_* to ocidfn.h as SQLT_*
+ cxcheng 10/28/96 - more beautification changes
+ jboonleu 10/29/96 - add flags for freeing object
+ dchatter 10/26/96 - delete redef of OCISvcCtx, OCIError, OCIEnv
+ cxcheng 10/15/96 - more changes
+ cxcheng 10/14/96 - more final fixes to constants
+ mluong 10/11/96 -
+ mluong 10/11/96 - KOCON and KONSP are in lowercase
+ mluong 10/11/96 - add some define per Calvin
+ cxcheng 10/09/96 - add #define for OROOCOSFN to OCI_COPY_NOREF
+ jboonleu 10/08/96 - change OROOCOSFN to OCICopyFlag
+ jboonleu 10/07/96 - use new OCI names for cache options
+ cxcheng 10/07/96 - add OROTCS02 for KOTTCBRI and OROTCS03 as spare
+ cxcheng 10/07/96 - more lint fixes
+ cxcheng 10/02/96 - move oronsp to ko.h as konsp
+ cxcheng 10/01/96 - add long names for readability
+ cxcheng 10/01/96 - remove orotty and orotal
+ rjenkins 09/28/96 - 2k char 4k varchar2
+ jboonleu 09/27/96 - add macro used only in beta2
+ cxcheng 09/27/96 - move oroenv to oroenv.h
+ cxcheng 09/24/96 - remove unnecessary orotyp
+ cxcheng 09/25/96 - add typecode OROTCS01 as placeholder for lob pointer
+ cxcheng 09/20/96 - add TDO load option orotgo
+ jboonleu 09/18/96 - add OROOPOREC
+ jboonleu 09/10/96 - add OROOPODFL
+ jweisz 08/27/96 - add SQL internal typecode OROTCS00
+ cxcheng 08/02/96 - add PLSQL internal typecodes OROTCP..
+ cxcheng 08/01/96 - add OROTCFAR to fill up space left by OROTCCAR
+ jboonleu 07/16/96 - new pin option
+ cxcheng 06/18/96 - add casts to OROTNOPRE and OROTNOSCL
+ cxcheng 05/29/96 - change OROTCNPT back to OROTCDOM
+ vkrishna 05/27/96 - add OROTCCAR
+ cxcheng 05/17/96 - replace OROTCFAR with OROTCCAR
+ cxcheng 05/08/96 - change orotmf from ub1 to ub2
+ cxcheng 05/07/96 - fix public defines for method types
+ cxcheng 04/30/96 - change OROTCDOM to OROTCNPT
+ cxcheng 04/15/96 - remove obsolete OROTTYICT
+ jboonleu 04/12/96 - add new pin option
+ sthakur 04/12/96 - add indicator type and indicator status
+ cxcheng 04/10/96 - add function parameter codes for ORT/KOT
+ cxcheng 04/03/96 - replace OROTCFAR as OROTCCAR
+ jwijaya 03/29/96 - add OROTTCCAR
+ jwijaya 03/27/96 - better comments for orotc
+ cxcheng 02/23/96 - add typecodes for SMALLINT and VARCHAR2
+ skrishna 02/22/96 - add oroind - null indicator type
+ cxcheng 02/21/96 - change lob character codes to OROTCCLB, OROTCBLB...
+ jboonleu 02/06/96 - new value for predefined duration
+ cxcheng 01/12/96 - add OROTCCLO, OROTCBLO, OROTCFIL to orotc
+ cxcheng 12/05/95 - add OROTCDOM and OROTCAAT to orotc
+ skotsovo 10/30/95 - reserve space for internal 'oid' type
+ jwijaya 10/20/95 - support variable-length ref
+ cxcheng 10/03/95 - add OROTMFOR for ordering function to orotmf
+ cxcheng 10/03/95 - Adding the ordering function type to orotmf
+ jboonleu 09/28/95 - set OROODTPRE
+ jboonleu 09/25/95 - add oroodt
+ skotsovo 03/10/95 - update to only include release 1
+ jboonleu 02/15/95 - add OROOPOREC, remove orocro, oroolo
+ skotsovo 01/30/95 - add default max lengths for varrays and vstrings
+ skotsovo 01/24/95 - categorize sint32, double, and real as number types
+ (with precision and scale) instead of scalar types.
+ skotsovo 12/20/94 - add release 1 types
+ skotsovo 12/12/94 - update according to new ots doc
+ skotsovo 12/01/94 - add default precision and scale
+ jwijaya 11/15/94 - rename ORONSPTAB to ORONSPEXT
+ jwijaya 10/25/94 - tint
+ jwijaya 10/06/94 - add namespace
+ jwijaya 10/02/94 - connection handle -> connection number
+ skotsovo 09/12/94 - keep 0 as uninitialized value for ORT consts
+ skotsovo 08/24/94 - fix orotec
+ skotsovo 08/17/94 - modify type code names
+ skotsovo 08/12/94 - fix 141 lint errors
+ skotsovo 07/25/94 - modify categorization of complex types (orotc)
+ skotsovo 07/07/94 - change typecode enum values & add decimal type
+ skotsovo 07/01/94 - change order of typecodes
+ jwijaya 06/15/94 - review
+ jboonleu 06/13/94 - add comments for the object cache options
+ jwijaya 06/13/94 - adhere to the header file template
+ skotsovo 06/09/94 - make ots scalar type names consistent with the ots
+ document
+ jwijaya 06/07/94 - include oratypes.h instead of s.h
+ skotsovo 05/24/94 - change typecodes
+ jwijaya 05/23/94 - fix comments of ororef
+ skotsovo 05/19/94 - remove type composition
+ skotsovo 05/09/94 - modified orotc according to new OTS document
+ jwijaya 05/03/94 - oroid and ororef
+ jwijaya 01/26/94 - Creation
+*/
+
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef OCIDFN_ORACLE
+#include <ocidfn.h>
+#endif
+
+#ifndef ORO_ORACLE
+#define ORO_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/* SHORT NAMES SUPPORT SECTION */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+ with the SLSHORTNAME defined.
+ With this all subsequent long names will actually be substituted with
+ the short names here */
+
+#define OCIDuration oroodt
+#define OCIInd oroind
+#define OCILockOpt oroolm
+#define OCIMarkOpt oroomo
+#define OCIObjectEvent orocev
+#define OCIObjectProperty oroopr
+#define OCIPinOpt oroopo
+#define OCIRef ororef
+#define OCIRefreshOpt orooro
+#define OCITypeCode orotc
+#define OCITypeEncap orotec
+#define OCITypeGetOpt orotgo
+#define OCITypeMethodFlag orotmf
+#define OCITypeParamMode orotpm
+#define OCIObjectPropId oroopi
+#define OCIObjectLifetime oroolft
+#define OCIObjectMarkstatus oroomst
+#define OCI_LOCK_NONE OROOLMNUL
+#define OCI_LOCK_X OROOLMX
+#define OCI_LOCK_X_NOWAIT OROOLMXNW
+#define OCI_MARK_DEFAULT OROOMODFL
+#define OCI_MARK_NONE OROOMONON
+#define OCI_MARK_UPDATE OROOMOUPD
+#define OCI_OBJECTEVENT_AFTER_FLUSH OROCEVAFL
+#define OCI_OBJECTEVENT_AFTER_REFRESH OROCEVARF
+#define OCI_OBJECTEVENT_BEFORE_FLUSH OROCEVBFL
+#define OCI_OBJECTEVENT_BEFORE_REFRESH OROCEVBRF
+#define OCI_OBJECTEVENT_WHEN_LOCK OROCEVWLK
+#define OCI_OBJECTEVENT_WHEN_MARK_DELETED OROCEVWDL
+#define OCI_OBJECTEVENT_WHEN_MARK_UPDATED OROCEVWUP
+#define OCI_OBJECTEVENT_WHEN_UNMARK OROCEVWUM
+#define OCI_OBJECTPROP_DIRTIED OROOPRDRT
+#define OCI_OBJECTPROP_LOADED OROOPRLOD
+#define OCI_OBJECTPROP_LOCKED OROOPRLCK
+#define OCI_PIN_ANY OROOPOANY
+#define OCI_PIN_DEFAULT OROOPODFL
+#define OCI_PIN_LATEST OROOPOLST
+#define OCI_PIN_RECENT OROOPOREC
+#define OCI_REFRESH_LOADED OROOROLOD
+#define OCI_TYPEENCAP_PRIVATE OROTECPVT
+#define OCI_TYPEENCAP_PUBLIC OROTECPUB
+#define OCI_TYPEGET_ALL OROTGOALL
+#define OCI_TYPEGET_HEADER OROTGOHDR
+#define OCI_TYPEMETHOD_CONSTANT OROTMCON
+#define OCI_TYPEMETHOD_CONSTRUCTOR OROTMCSTR
+#define OCI_TYPEMETHOD_DESTRUCTOR OROTMDSTR
+#define OCI_TYPEMETHOD_INLINE OROTMINL
+#define OCI_TYPEMETHOD_MAP OROTMMAP
+#define OCI_TYPEMETHOD_OPERATOR OROTMOP
+#define OCI_TYPEMETHOD_ORDER OROTMOR
+#define OCI_TYPEMETHOD_RNDS OROTMRDS
+#define OCI_TYPEMETHOD_RNPS OROTMRPS
+#define OCI_TYPEMETHOD_SELFISH OROTMSLF
+#define OCI_TYPEMETHOD_VIRTUAL OROTMVRT
+#define OCI_TYPEMETHOD_WNDS OROTMWDS
+#define OCI_TYPEMETHOD_WNPS OROTMWPS
+#define OCI_TYPEMETHOD_ABSTRACT OROTMABSTRACT
+#define OCI_TYPEMETHOD_OVERRIDING OROTMOVERRIDING
+#define OCI_TYPEMETHOD_PIPELINED OROTMPIPELINED
+#define OCI_TYPEPARAM_BYREF OROTPMREF
+#define OCI_TYPEPARAM_IN OROTPMIN
+#define OCI_TYPEPARAM_INOUT OROTPMIO
+#define OCI_TYPEPARAM_OUT OROTPMOUT
+#define OCI_TYPEPARAM_OUTNCPY OROTPMOUTNCPY
+#define OCI_TYPEPARAM_INOUTNCPY OROTPMIONCPY
+
+#endif /* SLSHORTNAME */
+
+
+/*---------------------------------------------------------------------------*/
+/* PUBLIC TYPES, CONSTANTS AND MACROS */
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------*/
+/* GENERAL OBJECT TYPES, CONSTANTS, MACROS */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------- OBJECT REFERENCE (REF) --------------------------*/
+
+typedef struct OCIRef OCIRef;
+/*
+ * OCIRef - OCI object REFerence
+ *
+ * In the Oracle object runtime environment, an object is identified by an
+ * object reference (ref) which contains the object identifier plus other
+ * runtime information. The contents of a ref is opaque to clients. Use
+ * OCIObjectNew() to construct a ref.
+ */
+
+
+/*--------------------------- OBJECT INDICATOR ------------------------------*/
+
+typedef sb2 OCIInd;
+/*
+ * OCIInd -- a variable of this type contains (null) indicator information
+ */
+
+#define OCI_IND_NOTNULL (OCIInd)0 /* not NULL */
+#define OCI_IND_NULL (OCIInd)(-1) /* NULL */
+#define OCI_IND_BADNULL (OCIInd)(-2) /* BAD NULL */
+#define OCI_IND_NOTNULLABLE (OCIInd)(-3) /* not NULLable */
+
+/*---------------------------------------------------------------------------*/
+/* OBJECT CACHE */
+/*---------------------------------------------------------------------------*/
+
+/* To enable object change detection mode, set this to TRUE */
+#define OCI_ATTR_OBJECT_DETECTCHANGE 0x00000020
+
+/* To enable object creation with non-NULL attributes by default, set the
+ following to TRUE.
+ By default, object is created with NULL attributes
+*/
+#define OCI_ATTR_OBJECT_NEWNOTNULL 0x00000010
+
+/* To enable sorting of the objects that belong to the same table
+ before being flushed through OCICacheFlush.
+ Please note that by enabling this object cache will not be flushing
+ the objects in the same order they were dirtied */
+#define OCI_ATTR_CACHE_ARRAYFLUSH 0x00000040
+
+/*--------------------------- OBJECT PIN OPTION -----------------------------*/
+
+enum OCIPinOpt
+{
+ /* 0 = uninitialized */
+ OCI_PIN_DEFAULT = 1, /* default pin option */
+ OCI_PIN_ANY = 3, /* pin any copy of the object */
+ OCI_PIN_RECENT = 4, /* pin recent copy of the object */
+ OCI_PIN_LATEST = 5 /* pin latest copy of the object */
+};
+typedef enum OCIPinOpt OCIPinOpt;
+
+/*
+ * OCIPinOpt - OCI object Pin Option
+ *
+ * In the Oracle object runtime environment, the program has the option to
+ * specify which copy of the object to pin.
+ *
+ * OCI_PINOPT_DEFAULT pins an object using the default pin option. The default
+ * pin option can be set as an attribute of the OCI environment handle
+ * (OCI_ATTR_PINTOPTION). The value of the default pin option can be
+ * OCI_PINOPT_ANY, OCI_PINOPT_RECENT, or OCI_PIN_LATEST. The default option
+ * is initialized to OCI_PINOPT_ANY.
+ *
+ * OCI_PIN_ANY pins any copy of the object. The object is pinned
+ * using the following criteria:
+ * If the object copy is not loaded, load it from the persistent store.
+ * Otherwise, the loaded object copy is returned to the program.
+ *
+ * OCI_PIN_RECENT pins the latest copy of an object. The object is
+ * pinned using the following criteria:
+ * If the object is not loaded, load the object from the persistent store
+ * from the latest version.
+ * If the object is not loaded in the current transaction and it is not
+ * dirtied, the object is refreshed from the latest version.
+ * Otherwise, the loaded object copy is returned to the program.
+ *
+ * OCI_PINOPT_LATEST pins the latest copy of an object. The object copy is
+ * pinned using the following criteria:
+ * If the object copy is not loaded, load it from the persistent store.
+ * If the object copy is loaded and dirtied, it is returned to the program.
+ * Otherwise, the loaded object copy is refreshed from the persistent store.
+ */
+
+
+
+/*--------------------------- OBJECT LOCK OPTION ----------------------------*/
+
+enum OCILockOpt
+{
+ /* 0 = uninitialized */
+ OCI_LOCK_NONE = 1, /* null (same as no lock) */
+ OCI_LOCK_X = 2, /* exclusive lock */
+ OCI_LOCK_X_NOWAIT = 3 /* exclusive lock, do not wait */
+};
+typedef enum OCILockOpt OCILockOpt;
+/*
+ * OCILockOpt - OCI object LOCK Option
+ *
+ * This option is used to specify the locking preferences when an object is
+ * loaded from the server.
+ */
+
+
+/*------------------------- OBJECT MODIFYING OPTION -------------------------*/
+
+enum OCIMarkOpt
+{
+ /* 0 = uninitialized */
+ OCI_MARK_DEFAULT = 1, /* default (the same as OCI_MARK_NONE) */
+ OCI_MARK_NONE = OCI_MARK_DEFAULT, /* object has not been modified */
+ OCI_MARK_UPDATE /* object is to be updated */
+};
+typedef enum OCIMarkOpt OCIMarkOpt;
+/*
+ * OCIMarkOpt - OCI object Mark option
+ *
+ * When the object is marked updated, the client has to specify how the
+ * object is intended to be changed.
+ */
+
+/*-------------------------- OBJECT Duration --------------------------------*/
+
+typedef ub2 OCIDuration;
+
+#define OCI_DURATION_INVALID 0xFFFF /* Invalid duration */
+#define OCI_DURATION_BEGIN (OCIDuration)10
+ /* beginning sequence of duration */
+#define OCI_DURATION_NULL (OCIDuration)(OCI_DURATION_BEGIN-1)
+ /* null duration */
+#define OCI_DURATION_DEFAULT (OCIDuration)(OCI_DURATION_BEGIN-2) /* default */
+#define OCI_DURATION_USER_CALLBACK (OCIDuration)(OCI_DURATION_BEGIN-3)
+#define OCI_DURATION_NEXT (OCIDuration)(OCI_DURATION_BEGIN-4)
+ /* next special duration */
+#define OCI_DURATION_SESSION (OCIDuration)(OCI_DURATION_BEGIN)
+ /* the end of user session */
+#define OCI_DURATION_TRANS (OCIDuration)(OCI_DURATION_BEGIN+1)
+ /* the end of user transaction */
+/******************************************************************************
+** DO NOT USE OCI_DURATION_CALL. IT IS UNSUPPORTED **
+** WILL BE REMOVED/CHANGED IN A FUTURE RELEASE **
+******************************************************************************/
+#define OCI_DURATION_CALL (OCIDuration)(OCI_DURATION_BEGIN+2)
+ /* the end of user client/server call */
+#define OCI_DURATION_STATEMENT (OCIDuration)(OCI_DURATION_BEGIN+3)
+
+/* This is to be used only during callouts. It is similar to that
+of OCI_DURATION_CALL, but lasts only for the duration of a callout.
+Its heap is from PGA */
+#define OCI_DURATION_CALLOUT (OCIDuration)(OCI_DURATION_BEGIN+4)
+
+#define OCI_DURATION_LAST OCI_DURATION_CALLOUT
+ /* last of predefined durations */
+
+/* This is not being treated as other predefined durations such as
+ SESSION, CALL etc, because this would not have an entry in the duration
+ table and its functionality is primitive such that only allocate, free,
+ resize memory are allowed, but one cannot create subduration out of this
+*/
+#define OCI_DURATION_PROCESS (OCIDuration)(OCI_DURATION_BEGIN-5)
+
+/*
+ * OCIDuration - OCI object duration
+ *
+ * A client can specify the duration of which an object is pinned (pin
+ * duration) and the duration of which the object is in memory (allocation
+ * duration). If the objects are still pinned at the end of the pin duration,
+ * the object cache manager will automatically unpin the objects for the
+ * client. If the objects still exist at the end of the allocation duration,
+ * the object cache manager will automatically free the objects for the client.
+ *
+ * Objects that are pinned with the option OCI_DURATION_TRANS will get unpinned
+ * automatically at the end of the current transaction.
+ *
+ * Objects that are pinned with the option OCI_DURATION_SESSION will get
+ * unpinned automatically at the end of the current session (connection).
+ *
+ * The option OCI_DURATION_NULL is used when the client does not want to set
+ * the pin duration. If the object is already loaded into the cache, then the
+ * pin duration will remain the same. If the object is not yet loaded, the
+ * pin duration of the object will be set to OCI_DURATION_DEFAULT.
+ */
+
+/*----------------------------- OBJECT PROPERTY -----------------------------*/
+
+/******************************************************************************
+** DO NOT USE OCIObjectProperty. IT IS UNSUPPORTED **
+** WILL BE REMOVED/CHANGED IN A FUTURE RELEASE **
+******************************************************************************/
+enum OCIObjectProperty
+{
+ /* 0 = uninitialized */
+ OCI_OBJECTPROP_DIRTIED = 1, /* dirty objects */
+ OCI_OBJECTPROP_LOADED, /* objects loaded in the transaction */
+ OCI_OBJECTPROP_LOCKED /* locked objects */
+};
+typedef enum OCIObjectProperty OCIObjectProperty;
+/*
+ * OCIObjectProperty -- OCI Object Property
+ * This specifies the properties of objects in the object cache.
+ */
+
+/*------------------------- CACHE REFRESH OPTION ---------------------------*/
+
+enum OCIRefreshOpt
+{
+ /* 0 = uninitialized */
+ OCI_REFRESH_LOADED = 1 /* refresh objects loaded in the transaction */
+};
+typedef enum OCIRefreshOpt OCIRefreshOpt;
+/*
+ * OCIRefreshOpt - OCI cache Refresh Option
+ * This option is used to specify the set of objects to be refreshed.
+ *
+ * OCI_REFRESH_LOAD refreshes the objects that are loaded in the current
+ * transaction.
+ */
+
+/*-------------------------------- OBJECT EVENT -----------------------------*/
+
+/******************************************************************************
+** DO NOT USE OCIObjectEvent. IT IS UNSUPPORTED **
+** WILL BE REMOVED/CHANGED IN A FUTURE RELEASE **
+******************************************************************************/
+enum OCIObjectEvent
+{
+ /* 0 = uninitialized */
+ OCI_OBJECTEVENT_BEFORE_FLUSH = 1, /* before flushing the cache */
+ OCI_OBJECTEVENT_AFTER_FLUSH, /* after flushing the cache */
+ OCI_OBJECTEVENT_BEFORE_REFRESH, /* before refreshing the cache */
+ OCI_OBJECTEVENT_AFTER_REFRESH, /* after refreshing the cache */
+ OCI_OBJECTEVENT_WHEN_MARK_UPDATED, /* when an object is marked updated */
+ OCI_OBJECTEVENT_WHEN_MARK_DELETED, /* when an object is marked deleted */
+ OCI_OBJECTEVENT_WHEN_UNMARK, /* when an object is being unmarked */
+ OCI_OBJECTEVENT_WHEN_LOCK /* when an object is being locked */
+};
+typedef enum OCIObjectEvent OCIObjectEvent;
+/*
+ * OCIObjectEvent -- OCI Object Event
+ * This specifies the kind of event that is supported by the object
+ * cache. The program can register a callback that is invoked when the
+ * specified event occurs.
+ */
+
+/*----------------------------- OBJECT COPY OPTION --------------------------*/
+#define OCI_OBJECTCOPY_NOREF (ub1)0x01
+/*
+ * OCIObjectCopyFlag - Object copy flag
+ *
+ * If OCI_OBJECTCOPY_NOREF is specified when copying an instance, the
+ * reference and lob will not be copied to the target instance.
+ */
+
+/*----------------------------- OBJECT FREE OPTION --------------------------*/
+#define OCI_OBJECTFREE_FORCE (ub2)0x0001
+#define OCI_OBJECTFREE_NONULL (ub2)0x0002
+#define OCI_OBJECTFREE_HEADER (ub2)0x0004
+/*
+ * OCIObjectFreeFlag - Object free flag
+ *
+ * If OCI_OBJECTCOPY_FORCE is specified when freeing an instance, the instance
+ * is freed regardless it is pinned or diritied.
+ * If OCI_OBJECTCOPY_NONULL is specified when freeing an instance, the null
+ * structure is not freed.
+ */
+
+/*----------------------- OBJECT PROPERTY ID -------------------------------*/
+
+typedef ub1 OCIObjectPropId;
+#define OCI_OBJECTPROP_LIFETIME 1 /* persistent or transient or value */
+#define OCI_OBJECTPROP_SCHEMA 2 /* schema name of table containing object */
+#define OCI_OBJECTPROP_TABLE 3 /* table name of table containing object */
+#define OCI_OBJECTPROP_PIN_DURATION 4 /* pin duartion of object */
+#define OCI_OBJECTPROP_ALLOC_DURATION 5 /* alloc duartion of object */
+#define OCI_OBJECTPROP_LOCK 6 /* lock status of object */
+#define OCI_OBJECTPROP_MARKSTATUS 7 /* mark status of object */
+#define OCI_OBJECTPROP_VIEW 8 /* is object a view object or not? */
+
+/*
+ * OCIObjectPropId - OCI Object Property Id
+ * Identifies the different properties of objects.
+ */
+
+/*----------------------- OBJECT LIFETIME ----------------------------------*/
+
+enum OCIObjectLifetime
+{
+ /* 0 = uninitialized */
+ OCI_OBJECT_PERSISTENT = 1, /* persistent object */
+ OCI_OBJECT_TRANSIENT, /* transient object */
+ OCI_OBJECT_VALUE /* value object */
+};
+typedef enum OCIObjectLifetime OCIObjectLifetime;
+/*
+ * OCIObjectLifetime - OCI Object Lifetime
+ * Classifies objects depending upon the lifetime and referenceability
+ * of the object.
+ */
+
+/*----------------------- OBJECT MARK STATUS -------------------------------*/
+
+typedef uword OCIObjectMarkStatus;
+#define OCI_OBJECT_NEW 0x0001 /* new object */
+#define OCI_OBJECT_DELETED 0x0002 /* object marked deleted */
+#define OCI_OBJECT_UPDATED 0x0004 /* object marked updated */
+/*
+ * OCIObjectMarkStatus - OCI Object Mark Status
+ * Status of the object - new or updated or deleted
+ */
+
+/* macros to test the object mark status */
+#define OCI_OBJECT_IS_UPDATED(flag) bit((flag), OCI_OBJECT_UPDATED)
+#define OCI_OBJECT_IS_DELETED(flag) bit((flag), OCI_OBJECT_DELETED)
+#define OCI_OBJECT_IS_NEW(flag) bit((flag), OCI_OBJECT_NEW)
+#define OCI_OBJECT_IS_DIRTY(flag) \
+ bit((flag), OCI_OBJECT_UPDATED|OCI_OBJECT_NEW|OCI_OBJECT_DELETED)
+
+/*---------------------------------------------------------------------------*/
+/* TYPE MANAGER */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------------ TYPE CODE ----------------------------------*/
+
+/*
+ * Type manager typecodes
+ *
+ * These are typecodes designed to be used with the type manager;
+ * they also include longer, more readable versions of existing SQLT names.
+ * Those types that are directly related to existing SQLT types are #define'd
+ * to their SQLT equivalents.
+ *
+ * The type manager typecodes are designed to be useable for all OCI calls.
+ * They are in the range from 192 to 320 for typecodes, so as not to conflict
+ * with existing OCI SQLT typecodes (see ocidfn.h).
+ */
+
+#define OCI_TYPECODE_REF SQLT_REF /* SQL/OTS OBJECT REFERENCE */
+#define OCI_TYPECODE_DATE SQLT_DAT /* SQL DATE OTS DATE */
+#define OCI_TYPECODE_SIGNED8 27 /* SQL SIGNED INTEGER(8) OTS SINT8 */
+#define OCI_TYPECODE_SIGNED16 28 /* SQL SIGNED INTEGER(16) OTS SINT16 */
+#define OCI_TYPECODE_SIGNED32 29 /* SQL SIGNED INTEGER(32) OTS SINT32 */
+#define OCI_TYPECODE_REAL 21 /* SQL REAL OTS SQL_REAL */
+#define OCI_TYPECODE_DOUBLE 22 /* SQL DOUBLE PRECISION OTS SQL_DOUBLE */
+#define OCI_TYPECODE_BFLOAT SQLT_IBFLOAT /* Binary float */
+#define OCI_TYPECODE_BDOUBLE SQLT_IBDOUBLE /* Binary double */
+#define OCI_TYPECODE_FLOAT SQLT_FLT /* SQL FLOAT(P) OTS FLOAT(P) */
+#define OCI_TYPECODE_NUMBER SQLT_NUM/* SQL NUMBER(P S) OTS NUMBER(P S) */
+#define OCI_TYPECODE_DECIMAL SQLT_PDN
+ /* SQL DECIMAL(P S) OTS DECIMAL(P S) */
+#define OCI_TYPECODE_UNSIGNED8 SQLT_BIN
+ /* SQL UNSIGNED INTEGER(8) OTS UINT8 */
+#define OCI_TYPECODE_UNSIGNED16 25 /* SQL UNSIGNED INTEGER(16) OTS UINT16 */
+#define OCI_TYPECODE_UNSIGNED32 26 /* SQL UNSIGNED INTEGER(32) OTS UINT32 */
+#define OCI_TYPECODE_OCTET 245 /* SQL ??? OTS OCTET */
+#define OCI_TYPECODE_SMALLINT 246 /* SQL SMALLINT OTS SMALLINT */
+#define OCI_TYPECODE_INTEGER SQLT_INT /* SQL INTEGER OTS INTEGER */
+#define OCI_TYPECODE_RAW SQLT_LVB /* SQL RAW(N) OTS RAW(N) */
+#define OCI_TYPECODE_PTR 32 /* SQL POINTER OTS POINTER */
+#define OCI_TYPECODE_VARCHAR2 SQLT_VCS
+ /* SQL VARCHAR2(N) OTS SQL_VARCHAR2(N) */
+#define OCI_TYPECODE_CHAR SQLT_AFC /* SQL CHAR(N) OTS SQL_CHAR(N) */
+#define OCI_TYPECODE_VARCHAR SQLT_CHR
+ /* SQL VARCHAR(N) OTS SQL_VARCHAR(N) */
+#define OCI_TYPECODE_MLSLABEL SQLT_LAB /* OTS MLSLABEL */
+#define OCI_TYPECODE_VARRAY 247 /* SQL VARRAY OTS PAGED VARRAY */
+#define OCI_TYPECODE_TABLE 248 /* SQL TABLE OTS MULTISET */
+#define OCI_TYPECODE_OBJECT SQLT_NTY /* SQL/OTS NAMED OBJECT TYPE */
+#define OCI_TYPECODE_OPAQUE 58 /* SQL/OTS Opaque Types */
+#define OCI_TYPECODE_NAMEDCOLLECTION SQLT_NCO
+ /* SQL/OTS NAMED COLLECTION TYPE */
+#define OCI_TYPECODE_BLOB SQLT_BLOB /* SQL/OTS BINARY LARGE OBJECT */
+#define OCI_TYPECODE_BFILE SQLT_BFILE /* SQL/OTS BINARY FILE OBJECT */
+#define OCI_TYPECODE_CLOB SQLT_CLOB /* SQL/OTS CHARACTER LARGE OBJECT */
+#define OCI_TYPECODE_CFILE SQLT_CFILE /* SQL/OTS CHARACTER FILE OBJECT */
+
+/* the following are ANSI datetime datatypes added in 8.1 */
+#define OCI_TYPECODE_TIME SQLT_TIME /* SQL/OTS TIME */
+#define OCI_TYPECODE_TIME_TZ SQLT_TIME_TZ /* SQL/OTS TIME_TZ */
+#define OCI_TYPECODE_TIMESTAMP SQLT_TIMESTAMP /* SQL/OTS TIMESTAMP */
+#define OCI_TYPECODE_TIMESTAMP_TZ SQLT_TIMESTAMP_TZ /* SQL/OTS TIMESTAMP_TZ */
+
+#define OCI_TYPECODE_TIMESTAMP_LTZ SQLT_TIMESTAMP_LTZ /* TIMESTAMP_LTZ */
+
+#define OCI_TYPECODE_INTERVAL_YM SQLT_INTERVAL_YM /* SQL/OTS INTRVL YR-MON */
+#define OCI_TYPECODE_INTERVAL_DS SQLT_INTERVAL_DS /* SQL/OTS INTRVL DAY-SEC */
+#define OCI_TYPECODE_UROWID SQLT_RDD /* Urowid type */
+
+
+#define OCI_TYPECODE_OTMFIRST 228 /* first Open Type Manager typecode */
+#define OCI_TYPECODE_OTMLAST 320 /* last OTM typecode */
+#define OCI_TYPECODE_SYSFIRST 228 /* first OTM system type (internal) */
+#define OCI_TYPECODE_SYSLAST 235 /* last OTM system type (internal) */
+#define OCI_TYPECODE_PLS_INTEGER 266 /* type code for PLS_INTEGER */
+
+/* the following are PL/SQL-only internal. They should not be used */
+#define OCI_TYPECODE_ITABLE SQLT_TAB /* PLSQL indexed table */
+#define OCI_TYPECODE_RECORD SQLT_REC /* PLSQL record */
+#define OCI_TYPECODE_BOOLEAN SQLT_BOL /* PLSQL boolean */
+
+/* NOTE : The following NCHAR related codes are just short forms for saying
+ OCI_TYPECODE_VARCHAR2 with a charset form of SQLCS_NCHAR. These codes are
+ intended for use in the OCIAnyData API only and nowhere else. */
+#define OCI_TYPECODE_NCHAR 286
+#define OCI_TYPECODE_NVARCHAR2 287
+#define OCI_TYPECODE_NCLOB 288
+
+
+/* To indicate absence of typecode being specified */
+#define OCI_TYPECODE_NONE 0
+/* To indicate error has to be taken from error handle - reserved for
+ sqlplus use */
+#define OCI_TYPECODE_ERRHP 283
+
+/* The OCITypeCode type is interchangeable with the existing SQLT type
+ which is a ub2 */
+typedef ub2 OCITypeCode;
+
+
+/*----------------------- GET OPTIONS FOR TDO ------------------------------*/
+
+enum OCITypeGetOpt
+{
+ OCI_TYPEGET_HEADER,
+ /* load only the header portion of the TDO when getting type */
+ OCI_TYPEGET_ALL /* load all attribute and method descriptors as well */
+};
+typedef enum OCITypeGetOpt OCITypeGetOpt;
+
+/*
+ * OCITypeGetOpt
+ *
+ * This is the flag passed to OCIGetTypeArray() to indicate how the TDO is
+ * going to be loaded into the object cache.
+ * OCI_TYPEGET_HEADER implies that only the header portion is to be loaded
+ * initially, with the rest loaded in on a 'lazy' basis. Only the header is
+ * needed for PL/SQL and OCI operations. OCI_TYPEGET_ALL implies that ALL
+ * the attributes and methods belonging to a TDO will be loaded into the
+ * object cache in one round trip. Hence it will take much longer to execute,
+ * but will ensure that no more loading needs to be done when pinning ADOs
+ * etc. This is only needed if your code needs to examine and manipulate
+ * attribute and method information.
+ *
+ * The default is OCI_TYPEGET_HEADER.
+ */
+
+
+/*------------------------ TYPE ENCAPSULTATION LEVEL ------------------------*/
+
+enum OCITypeEncap
+{
+ /* 0 = uninitialized */
+ OCI_TYPEENCAP_PRIVATE, /* private: only internally visible */
+ OCI_TYPEENCAP_PUBLIC /* public: visible to both internally and externally */
+};
+typedef enum OCITypeEncap OCITypeEncap;
+/*
+ * OCITypeEncap - OCI Encapsulation Level
+ */
+
+
+/*---------------------------- TYPE METHOD FLAGS ----------------------------*/
+
+enum OCITypeMethodFlag
+{
+ OCI_TYPEMETHOD_INLINE = 0x0001, /* inline */
+ OCI_TYPEMETHOD_CONSTANT = 0x0002, /* constant */
+ OCI_TYPEMETHOD_VIRTUAL = 0x0004, /* virtual */
+ OCI_TYPEMETHOD_CONSTRUCTOR = 0x0008, /* constructor */
+ OCI_TYPEMETHOD_DESTRUCTOR = 0x0010, /* destructor */
+ OCI_TYPEMETHOD_OPERATOR = 0x0020, /* operator */
+ OCI_TYPEMETHOD_SELFISH = 0x0040, /* selfish method (generic otherwise) */
+
+ OCI_TYPEMETHOD_MAP = 0x0080, /* map (relative ordering) */
+ OCI_TYPEMETHOD_ORDER = 0x0100, /* order (relative ordering) */
+ /* OCI_TYPEMETHOD_MAP and OCI_TYPEMETHOD_ORDER are mutually exclusive */
+
+ OCI_TYPEMETHOD_RNDS= 0x0200, /* Read no Data State (default) */
+ OCI_TYPEMETHOD_WNDS= 0x0400, /* Write no Data State */
+ OCI_TYPEMETHOD_RNPS= 0x0800, /* Read no Process State */
+ OCI_TYPEMETHOD_WNPS= 0x1000, /* Write no Process State */
+ OCI_TYPEMETHOD_ABSTRACT = 0x2000, /* abstract (not instantiable) method */
+ OCI_TYPEMETHOD_OVERRIDING = 0x4000, /* overriding method */
+ OCI_TYPEMETHOD_PIPELINED = 0x8000 /* method is pipelined */
+};
+typedef enum OCITypeMethodFlag OCITypeMethodFlag;
+
+/* macros to test the type method flags */
+#define OCI_METHOD_IS_INLINE(flag) bit((flag), OCI_TYPEMETHOD_INLINE)
+#define OCI_METHOD_IS_CONSTANT(flag) bit((flag), OCI_TYPEMETHOD_CONSTANT)
+#define OCI_METHOD_IS_VIRTUAL(flag) bit((flag), OCI_TYPEMETHOD_VIRTUAL)
+#define OCI_METHOD_IS_CONSTRUCTOR(flag) bit((flag), OCI_TYPEMETHOD_CONSTRUCTOR)
+#define OCI_METHOD_IS_DESTRUCTOR(flag) bit((flag), OCI_TYPEMETHOD_DESTRUCTOR)
+#define OCI_METHOD_IS_OPERATOR(flag) bit((flag), OCI_TYPEMETHOD_OPERATOR)
+#define OCI_METHOD_IS_SELFISH(flag) bit((flag), OCI_TYPEMETHOD_SELFISH)
+#define OCI_METHOD_IS_MAP(flag) bit((flag), OCI_TYPEMETHOD_MAP)
+#define OCI_METHOD_IS_ORDER(flag) bit((flag), OCI_TYPEMETHOD_ORDER)
+#define OCI_METHOD_IS_RNDS(flag) bit((flag), OCI_TYPEMETHOD_RNDS)
+#define OCI_METHOD_IS_WNDS(flag) bit((flag), OCI_TYPEMETHOD_WNDS)
+#define OCI_METHOD_IS_RNPS(flag) bit((flag), OCI_TYPEMETHOD_RNPS)
+#define OCI_METHOD_IS_WNPS(flag) bit((flag), OCI_TYPEMETHOD_WNPS)
+#define OCI_METHOD_IS_ABSTRACT(flag) bit((flag), OCI_TYPEMETHOD_ABSTRACT)
+#define OCI_METHOD_IS_OVERRIDING(flag) bit((flag), OCI_TYPEMETHOD_OVERRIDING)
+#define OCI_METHOD_IS_PIPELINED(flag) bit((flag), OCI_TYPEMETHOD_PIPELINED)
+
+#define OCI_TYPEMETHOD_IS_INLINE(flag) bit((flag), OCI_TYPEMETHOD_INLINE)
+#define OCI_TYPEMETHOD_IS_CONSTANT(flag) bit((flag), OCI_TYPEMETHOD_CONSTANT)
+#define OCI_TYPEMETHOD_IS_VIRTUAL(flag) bit((flag), OCI_TYPEMETHOD_VIRTUAL)
+#define OCI_TYPEMETHOD_IS_CONSTRUCTOR(flag) \
+ bit((flag), OCI_TYPEMETHOD_CONSTRUCTOR)
+#define OCI_TYPEMETHOD_IS_DESTRUCTOR(flag) \
+ bit((flag), OCI_TYPEMETHOD_DESTRUCTOR)
+#define OCI_TYPEMETHOD_IS_OPERATOR(flag) bit((flag), OCI_TYPEMETHOD_OPERATOR)
+#define OCI_TYPEMETHOD_IS_SELFISH(flag) bit((flag), OCI_TYPEMETHOD_SELFISH)
+#define OCI_TYPEMETHOD_IS_MAP(flag) bit((flag), OCI_TYPEMETHOD_MAP)
+#define OCI_TYPEMETHOD_IS_ORDER(flag) bit((flag), OCI_TYPEMETHOD_ORDER)
+#define OCI_TYPEMETHOD_IS_RNDS(flag) bit((flag), OCI_TYPEMETHOD_RNDS)
+#define OCI_TYPEMETHOD_IS_WNDS(flag) bit((flag), OCI_TYPEMETHOD_WNDS)
+#define OCI_TYPEMETHOD_IS_RNPS(flag) bit((flag), OCI_TYPEMETHOD_RNPS)
+#define OCI_TYPEMETHOD_IS_WNPS(flag) bit((flag), OCI_TYPEMETHOD_WNPS)
+#define OCI_TYPEMETHOD_IS_ABSTRACT(flag) bit((flag), OCI_TYPEMETHOD_ABSTRACT)
+#define OCI_TYPEMETHOD_IS_OVERRIDING(flag) \
+ bit((flag), OCI_TYPEMETHOD_OVERRIDING)
+#define OCI_TYPEMETHOD_IS_PIPELINED(flag) bit((flag), OCI_TYPEMETHOD_PIPELINED)
+
+/* macros to set the type method flags */
+#define OCI_TYPEMETHOD_SET_INLINE(flag) bis((flag), OCI_TYPEMETHOD_INLINE)
+#define OCI_TYPEMETHOD_SET_CONSTANT(flag) bis((flag), OCI_TYPEMETHOD_CONSTANT)
+#define OCI_TYPEMETHOD_SET_VIRTUAL(flag) bis((flag), OCI_TYPEMETHOD_VIRTUAL)
+#define OCI_TYPEMETHOD_SET_CONSTRUCTOR(flag) \
+ bis((flag), OCI_TYPEMETHOD_CONSTRUCTOR)
+#define OCI_TYPEMETHOD_SET_DESTRUCTOR(flag) \
+ bis((flag), OCI_TYPEMETHOD_DESTRUCTOR)
+#define OCI_TYPEMETHOD_SET_OPERATOR(flag) bis((flag), OCI_TYPEMETHOD_OPERATOR)
+#define OCI_TYPEMETHOD_SET_SELFISH(flag) bis((flag), OCI_TYPEMETHOD_SELFISH)
+#define OCI_TYPEMETHOD_SET_MAP(flag) bis((flag), OCI_TYPEMETHOD_MAP)
+#define OCI_TYPEMETHOD_SET_ORDER(flag) bis((flag), OCI_TYPEMETHOD_ORDER)
+#define OCI_TYPEMETHOD_SET_RNDS(flag) bis((flag), OCI_TYPEMETHOD_RNDS)
+#define OCI_TYPEMETHOD_SET_WNDS(flag) bis((flag), OCI_TYPEMETHOD_WNDS)
+#define OCI_TYPEMETHOD_SET_RNPS(flag) bis((flag), OCI_TYPEMETHOD_RNPS)
+#define OCI_TYPEMETHOD_SET_WNPS(flag) bis((flag), OCI_TYPEMETHOD_WNPS)
+
+/* macros to clear the type method flags */
+#define OCI_TYPEMETHOD_CLEAR_INLINE(flag) bic((flag), OCI_TYPEMETHOD_INLINE)
+#define OCI_TYPEMETHOD_CLEAR_CONSTANT(flag) \
+ bic((flag), OCI_TYPEMETHOD_CONSTANT)
+#define OCI_TYPEMETHOD_CLEAR_VIRTUAL(flag) bic((flag), OCI_TYPEMETHOD_VIRTUAL)
+#define OCI_TYPEMETHOD_CLEAR_CONSTRUCTOR(flag) \
+ bic((flag), OCI_TYPEMETHOD_CONSTRUCTOR)
+#define OCI_TYPEMETHOD_CLEAR_DESTRUCTOR(flag) \
+ bic((flag), OCI_TYPEMETHOD_DESTRUCTOR)
+#define OCI_TYPEMETHOD_CLEAR_OPERATOR(flag) \
+ bic((flag), OCI_TYPEMETHOD_OPERATOR)
+#define OCI_TYPEMETHOD_CLEAR_SELFISH(flag) bic((flag), OCI_TYPEMETHOD_SELFISH)
+#define OCI_TYPEMETHOD_CLEAR_MAP(flag) bic((flag), OCI_TYPEMETHOD_MAP)
+#define OCI_TYPEMETHOD_CLEAR_ORDER(flag) bic((flag), OCI_TYPEMETHOD_ORDER)
+#define OCI_TYPEMETHOD_CLEAR_RNDS(flag) bic((flag), OCI_TYPEMETHOD_RNDS)
+#define OCI_TYPEMETHOD_CLEAR_WNDS(flag) bic((flag), OCI_TYPEMETHOD_WNDS)
+#define OCI_TYPEMETHOD_CLEAR_RNPS(flag) bic((flag), OCI_TYPEMETHOD_RNPS)
+#define OCI_TYPEMETHOD_CLEAR_WNPS(flag) bic((flag), OCI_TYPEMETHOD_WNPS)
+
+/*--------------------------- TYPE PARAMETER MODE ---------------------------*/
+
+enum OCITypeParamMode
+{
+ /* PL/SQL starts this from 0 */
+ OCI_TYPEPARAM_IN = 0, /* in */
+ OCI_TYPEPARAM_OUT, /* out */
+ OCI_TYPEPARAM_INOUT, /* in-out */
+ OCI_TYPEPARAM_BYREF, /* call by reference (implicitly in-out) */
+ OCI_TYPEPARAM_OUTNCPY, /* OUT with NOCOPY modifier */
+ OCI_TYPEPARAM_INOUTNCPY /* IN OUT with NOCOPY modifier */
+};
+typedef enum OCITypeParamMode OCITypeParamMode;
+
+
+/*-------------------------------- DEFAULTS ---------------------------------*/
+
+/* default binary and decimal precision and scale */
+
+#define OCI_NUMBER_DEFAULTPREC ((ub1)0) /* no precision specified */
+#define OCI_NUMBER_DEFAULTSCALE ((sb1)MAXSB1MINVAL)
+ /* no binary/decimal scale specified */
+
+/* default maximum length for varrays and vstrings (used in sql.bsq) */
+
+#define OCI_VARRAY_MAXSIZE 4000
+ /* default maximum number of elements for a varray */
+#define OCI_STRING_MAXLEN 4000 /* default maximum length of a vstring */
+
+/*---------------------------------------------------------------------------*/
+/* This set of macro is used only in beta2. They should be removed as soon as
+ * PLSQL has made the changes of not using these macros.
+ */
+
+/* Special duration for allocating memory only. No instance can be allocated
+ * given these durations.
+ */
+#define OCICoherency OCIRefreshOpt
+#define OCI_COHERENCY_NONE (OCIRefreshOpt)2
+#define OCI_COHERENCY_NULL (OCIRefreshOpt)4
+#define OCI_COHERENCY_ALWAYS (OCIRefreshOpt)5
+
+#endif /* ORO_ORACLE */
+
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ort.h b/src/terralib/drivers/OracleSpatial/OCI/include/ort.h
new file mode 100644
index 0000000..3dda9fc
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ort.h
@@ -0,0 +1,2593 @@
+/* @(#)ort.h 1.44 95/07/07 */
+
+/* Copyright (c) 1994, 2003, Oracle Corporation. All rights reserved. */
+
+/*
+ NAME
+
+ ORT - ORacle's external open Type interface to the open type manager (OTM)
+
+ DESCRIPTION
+
+ The open type manager interface includes dynamic type operations to
+ create, delete, update, and access types. See the "Functional
+ Specification for Oracle Object Call Interface (Objects Project),
+ Version 1.0" for a user level description of the OTM. For a more
+ detailed description, see the "Component Document for the Open Type
+ Manager, Version 1.0".
+
+ NOTE: MOST Of the functions in this header file are being desupported.
+ Please use the OCIDescribeAny interface as described in oci.h
+ instead.
+ The OCIType, OCITypeElem, OCITypeMethod abstract types continue
+ to be supported. The only two functions that remain to be documented
+ are OCITypeArrayByName and OCITypeArrayByRef.
+ All obsolete types/functions are marked accordingly below.
+
+ RELATED DOCUMENTS
+
+ For the functional specification for the OTM, see:
+ [1] Kotsovolos, Susan, "Functional Specification for Oracle Object
+ Call Interface (Objects Project), Version 1.0", Oracle
+ Corporation, February 1995.
+ For the internal design of the OTM, see the following:
+ [2] Kotsovolos, Susan, "Component Document for the Open Type Manager",
+ Oracle Corporation, November 1994.
+ [3] Kotsovolos, Susan, "Design for The Open Type Manager, Oracle
+ Object Management Subsystem Version 1.0", Oracle Corporation,
+ March 1994.
+ [4] Kotsovolos, Susan and Tin A. Nguyen, "The Open Type Manager",
+ Oracle Corporation, March 1994.
+ [5] Kotsovolos, Susan and Tin A. Nguyen, "Schema Evolution",
+ Oracle Corporation, March 1994.
+ For a description of the types the OTM must support, see:
+ [6] Nguyen, Tin A., "The Open Type System", Oracle Corporation,
+ February 1994.
+
+ INSPECTION STATUS
+
+ Inspection date:
+ Inspection status:
+ Estimated increasing cost defects per page:
+ Rule sets:
+
+ ACCEPTANCE REVIEW STATUS
+
+ Review date:
+ Review status:
+ Reviewers:
+
+
+ **** ALL OBSOLETE FUNCTIONS/TYPES ARE MARKED ACCORDINGLY ***
+
+ EXPORT FUNCTIONS
+
+ None
+
+ PUBLIC DATA STRUCTURES
+
+ OCIType - type descriptor in the object cache
+ OCITypeElem - type element descriptor in the object cache
+ (used for attributes and paramters)
+ OCITypeCode - Open Type System type code.
+ OCITypeMethod - method descriptor in the object cache
+ OCITypeParamMode - parameter modes (ie. IN, IN-OUT etc)
+
+ PUBLIC FUNCTIONS
+
+ ITERATOR (for OCITypeAttrNext and OCITypeMethodNext)
+
+ OCITypeIterNew - ** OBSOLETE ** Create new instance of an iteraton.
+ OCITypeIterSet - ** OBSOLETE ** Initialize iterator.
+ OCITypeIterFree - ** OBSOLETE ** Free instance of iterator.
+
+ TYPE GET
+
+ OCITypeByName - ** OBSOLETE ** Get a type by name.
+ OCITypeArrayByName - Get an array of types by their names.
+ OCITypeByRef - ** OBSOLETE ** Get a type by its CREF.
+ OCITypeArrayByRef - Get an array of types by their CREFs.
+
+ TYPE ACCESSORS
+
+ OCITypeName - ** OBSOLETE ** OCI Get a type's name.
+ OCITypeSchema - ** OBSOLETE ** OCI Get a type's schema name.
+ OCITypeTypeCode - ** OBSOLETE ** OCI Get a type's type code.
+ OCITypeVersion - ** OBSOLETE ** OCI Get a Type's user-readable Version.
+ OCITypeAttrs - ** OBSOLETE ** OCI Get a Type's Number of Attributes.
+ OCITypeMethods - ** OBSOLETE ** OCI Get a Type's Number of Methods.
+
+ TYPE ELEMENT ACCESSORS (they represent attributes/parameters/results)
+
+ OCITypeElemName - ** OBSOLETE ** Get a type element's (only for
+ attributes) name.
+ OCITypeElemType - ** OBSOLETE ** Get a type element's type
+ descriptor.
+ OCITypeElemTypeCode - ** OBSOLETE ** Get a type element's typecode.
+ OCITypeElemParameterizedType - ** OBSOLETE ** Get a type element's
+ parameterized type's type descriptor.
+ OCITypeElemNumPrec - ** OBSOLETE ** Get a number's precision.
+ OCITypeElemNumScale - ** OBSOLETE ** Get a decimal or oracle Number's
+ Scale
+ OCITypeElemCharSetID - ** OBSOLETE ** Get a fixed or variable length
+ string's character set ID.
+ OCITypeElemCharSetForm - ** OBSOLETE ** Get a fixed or variable length
+ string's character set form (how
+ character set information has
+ been specified).
+ OCITypeElemLength - ** OBSOLETE ** Get a raw, fixed or variable
+ length string's length.
+ OCITypeElemParamMode - ** OBSOLETE ** Get element's parameter's mode
+ (only valid for parameter).
+ OCITypeElemDefaultValue - ** OBSOLETE ** Get element's Default Value.
+
+ ATTRIBUTE ACCESSORS
+
+ OCITypeAttrByName - ** OBSOLETE ** Get an Attribute by Name.
+ OCITypeAttrNext - ** OBSOLETE ** Get an Attribute by Iteration.
+
+ COLLECTION ACCESSORS
+
+ OCITypeCollTypeCode - ** OBSOLETE ** Get a named collection's typecode.
+ OCITypeCollElem - ** OBSOLETE ** Get a named collection's element's
+ type element information.
+ OCITypeCollSize - ** OBSOLETE ** Get a named collection's size in
+ number of elements.
+
+ METHOD ACCESSORS
+
+ OCITypeMethodOverload - ** OBSOLETE ** Get number of overloaded methods
+ with the given method name.
+ (no direct equivalent for
+ OCIDescribe interface)
+ OCITypeMethodByName - ** OBSOLETE ** Get one or more methods by name.
+ OCITypeMethodNext - ** OBSOLETE ** Iterate to the next method to
+ retrieve.
+ OCITypeMethodName - ** OBSOLETE ** Get method's name.
+ OCITypeMethodEncap - ** OBSOLETE ** Get method's encapsulation level.
+ OCITypeMethodFlags - ** OBSOLETE ** et method's flags.
+ OCITypeMethodMap - ** OBSOLETE ** Get type's map function.
+ OCITypeMethodOrder - ** OBSOLETE ** Get type's order function.
+ OCITypeMethodParams - ** OBSOLETE ** Get a method's number of
+ parameters.
+
+ RESULT ACCESSORS
+
+ OCITypeResult - ** OBSOLETE ** OCI Get a method's Result.
+
+ See also ATTRIBUTE/PARAMETER/RESULT TYPE ACCESSORS.
+
+ PARAMETER ACCESSORS
+
+ OCITypeParamByPos - ** OBSOLETE ** Get a Parameter in a method By
+ Position.
+ OCITypeParamByName - ** OBSOLETE ** Get a Parameter in a method By Name.
+ OCITypeParamPos - ** OBSOLETE ** Get a Parameter's PoSition in a
+ method.
+
+ CALL GRAPHS:
+
+ Only type accessors are supported for 8.0.
+ ** OBSOLETE ** please use OCIDescribe interface
+
+ TYPE ACCESSOR EXAMPLE
+
+ CREATE TYPE CAR
+ (
+ name vstring,
+ age number,
+ number car_age; /o Oracle number o/
+ weight car_weight; /o abstract type o/
+
+ PUBLIC:
+
+ /o methods o/
+ car(orlvs a_name, number an_age, WEIGHT a_weight);
+ ~car();
+ inline number get_age() const;
+
+ /o relative ordering (map) functions o/
+ number car_map
+ );
+
+ /o the following code accesses the type created above o/
+
+ ub1 meth_flags;
+ ub4 i, j;
+ ub4 text_len, position;
+ ub4 count;
+ ub4 length;
+ OCITypeCode typecode;
+ OCIRef *attr_ref;
+ OCIRef *param_ref;
+ OCIType *tdo, new_tdo, final_tdo;
+ OCITypeElem *elem;
+ OCITypeIter *iterator_ort;
+ oratext (*names)[];
+ ub4 lengths[];
+ ub4 *positions;
+ oratext *name;
+ oratext name_buffer[M_IDEN];
+
+ /o initialize the references o/
+ DISCARD orlrini(env, err, (dvoid *)&attr_ref);
+ DISCARD orlrini(env, err, (dvoid *)¶m_ref);
+
+ /o ----------------- GET INFORMATION ABOUT A TYPE ----------------- o/
+
+ /o start a transaction o/
+
+ /o Pin the type until the end of the transaction. Pinning the type is
+ o required before using any type accessors.
+ o/
+ if (OCITypeByName(env, err, svc, (oratext *)0, 0, "CAR", strlen("CAR"),
+ OCI_DURATION_TRANS, &car_ref, &car_tdo) != OCI_SUCCESS)
+ /o error o/ ;
+
+ /o get the type's name o/
+ if (!memcmp(OCITypeName(env, err, car_tdo, &text_len), "person",
+ text_len))
+ /o do something o/ ;
+
+ /o get the type's schema name o/
+ if (!memcmp(OCITypeSchema(env, err, car_tdo, &text_len), "john",
+ text_len))
+ /o do something o/ ;
+
+ /o get the type code of the type o/
+ if (OCITypeTypeCode(env, err, car_tdo) == OCI_TYPECODE_ADT)
+ /o do something o/ ;
+
+ /o get the type version o/
+ if (!memcmp(OCITypeVersion(env, err, car_tdo, &text_len), "1", text_len))
+ /o do something o/ ;
+
+ /o ------- GET FLATTENED POSITION OF AN ATTRIBUTES IN A TYPE ------- o/
+
+ names = malloc(sizeof(oratext *) * 2);
+ names[0] = malloc(strlen("car_weight"));
+ names[1] = malloc(strlen("ounces"));
+ memcpy(names[0], "car_weight", strlen("car_weight"));
+ memcpy(names[1], "ounces", strlen("ounces"));
+
+ lengths = malloc(sizeof(ub4) * 2);
+ lengths[0] = strlen("car_weight");
+ lengths[1] = strlen("ounces");
+
+ /o ---------- GET IMMEDIATE ATTRIBUTES IN A TYPE ---------- o/
+
+ /o loop through all attributes in the type with iterator o/
+ if (OCITypeIterNew(env, err, car_tdo, &iterator_ort) != OCI_SUCCESS)
+ /o do something o/
+
+ while (OCITypeAttrNext(env, err, iterator_ort, &ado) != OCI_NO_DATA)
+ {
+ /o get the attribute's name o/
+ if (!memcmp(OCITypeElemName(env, err, ado, &text_len),
+ "tiger", text_len))
+ /o do something o/ ;
+
+ /o get the attribute's type descriptor o/
+ if (OCITypeElemType(env, err, ado, &tdo) != OCI_SUCCESS)
+ /o error o/ ;
+
+ /o get the attribute's type code o/
+ typecode = OCITypeElemTypeCode(env, err, ado);
+
+ switch (typecode)
+ {
+ /o scalar types o/
+ case OCI_TYPECODE_DATE: /o date o/
+ case OCI_TYPECODE_SIGNED8: /o byte o/
+ case OCI_TYPECODE_SIGNED16: /o short o/
+ case OCI_TYPECODE_UNSIGNED8: /o unsigned byte o/
+ case OCI_TYPECODE_UNSIGNED16: /o unsigned short o/
+ case OCI_TYPECODE_OCTET: /o octet o/
+ case OCI_TYPECODE_TABLE: /o nested table o/
+ case OCI_TYPECODE_CLOB: /o character lob o/
+ case OCI_TYPECODE_BLOB: /o binary lob o/
+ case OCI_TYPECODE_CFILE: /o character file object o/
+ case OCI_TYPECODE_BFILE: /o binary file object o/
+
+ /o do something o/
+ break;
+
+ /o number types o/
+ case OCI_TYPECODE_NUMBER: /o oracle number o/
+ case OCI_TYPECODE_DECIMAL: /o decimal o/
+ {
+ /o get the scale of the number o/
+ if (OCITypeElemNumScale(env, err, ado) == 3)
+ /o do something o/ ;
+ }
+ /o fall through to get the precision o/
+
+ case OCI_TYPECODE_FLOAT: /o float o/
+ case OCI_TYPECODE_SIGNED32: /o long o/
+ case OCI_TYPECODE_UNSIGNED32: /o unsigned long o/
+ case OCI_TYPECODE_REAL: /o real o/
+ case OCI_TYPECODE_DOUBLE: /o double o/
+ {
+ /o get the precision of the number o/
+ if (OCITypeElemNumPrec(env, err, ado) == 2)
+ /o do something o/ ;
+ }
+ break;
+
+ /o string types o/
+ case OCI_TYPECODE_CHAR: /o fixed length string o/
+ case OCI_TYPECODE_VARCHAR2: /o variable length string o/
+ case OCI_TYPECODE_RAW: /o raw o/
+ {
+ /o get the length of the fixed or variable length string o/
+ if (OCITypeElemLength(env, err, ado) < 100)
+ /o do something o/
+ }
+ break;
+
+ /o parameterized types o/
+ case OCI_TYPECODE_REF: /o reference o/
+ case OCI_TYPECODE_PTR: /o pointer o/
+ {
+ /o get the type stored in the parameterized type o/
+ if (OCITypeElemParameterizedType(env, err, ado, &tdo)
+ != OCI_SUCCESS)
+ /o error o/ ;
+
+ /o do something o/
+ if (OCI_TYPEELEM_IS_REF(OCITypeElemFlags(env, err, ado)))...
+ }
+ break;
+
+ /o domain type o/
+ case OCI_TYPECODE_NAMEDCOLLECTION:
+ switch (OCITypeCollTypeCode(env, err, tdo))
+ {
+ case OCI_TYPECODE_VARRAY: /o variable array o/
+ ub4 num_elems;
+ OCIType *element_type;
+
+ /o get the number of elements in the farray or the maximum number
+ o of elements in the varray.
+ o/
+ OCITypeCollSize(env, err, tdo, &num_elems);
+
+ /o get the type of the array o/
+ OCITypeElemType(env, err, tdo, &element_type);
+ }
+ break;
+
+ case OCI_TYPECODE_TABLE: /o multiset o/
+ {
+ OCIType *table_type;
+
+ /o get the type of the multiset o/
+ OCITypeElemType(env, err, tdo, &table_type);
+
+ /o do something o/
+ }
+ }
+
+ /o abstract type o/
+ case OCI_TYPECODE_ADT: /o abstract data type o/
+ {
+ /o get the adt information o/
+ if (OCITypeElemType(env, err, ado, &tdo) != OCI_SUCCESS)
+ /o error o/ ;
+
+ /o do something o/
+ }
+ break;
+
+ default:
+ DISCARD printf("Error: invalid type code\n");
+
+ } /o end of typecode switch o/
+
+ } /o end of loop through all attributes in a type o/
+
+
+ /o ------------ GET THE IMMEDIATE METHODS OF A TYPE ------------ o/
+
+ /o loop through all methods in the type by reusing iterator o/
+ if (OCITypeIterSet(env, err, car_tdo, iterator_ort) != OCI_SUCCESS)
+ /o do something o/
+
+ while (OCITypeMethodNext(env, err, iterator_ort) != OCI_NO_DATA)
+ {
+ /o get the method's name o/
+ if (!memcmp(OCITypeMethodName(env, err, mdo, &text_len), "car",
+ text_len))
+ /o do something o/ ;
+
+ /o get the method's encapsulation o/
+ if (OCITypeMethodEncap(env, err, mdo) == OCI_TYPEENCAP_PUBLIC)
+ /o do something o/ ;
+
+ /o get the method's flags o/
+ meth_flags = OCITypeMethodFlags(env, err, mdo);
+ if (meth_flags & OCI_TYPEMETHOD_VIRTUAL)
+ /o do something o/ ;
+
+
+ /o ------------ GET THE PARAMETERS IN A METHOD ------------ o/
+
+ /o loop through all parameters in the method o/
+ count = OCITypeMethodParams(env, err, mdo);
+ for (j = 1; j <= count; j++)
+ {
+ /o get the parameter information by position o/
+ if (OCITypeParamByPos(env, err, mdo, i, &elem) != OCI_SUCCESS)
+ /o error o/ ;
+
+ /o get the parameter's name o/
+ if (!memcmp(OCITypeElemName(env, err, elem, &text_len), "an_age",
+ text_len))
+ /o do something o/ ;
+
+ /o get the parameter's mode o/
+ if (OCITypeElemMode(env, err, elem) == OCI_PARAM_OUT)
+ /o do something o/ ;
+
+ /o get the parameter's required flag o/
+ if (ortgprq(env, err, elem))
+ /o do something o/ ;
+ }
+ }
+
+ /o get a method by name o/
+ if (OCITypeMethodByName(env, err, car_tdo, "car_constructor",
+ strlen("car_constructor"), NULLP(OCIRef), &mdo)
+ != OCI_SUCCESS)
+ /o error o/ ;
+
+ /o get a parameter in a method by name o/
+ if (OCITypeParamByName(env, err, mdo, "an_age", strlen("an_age"), &elem)
+ != OCI_SUCCESS)
+ /o error o/ ;
+
+ /o get a parameter's typecode o/
+ typecode = OCITypeElemTypeCode(env, err, elem);
+
+ /o get a parameter's type object o/
+ if (OCITypeElemType(env, err, elem, &tdo)) != OCI_SUCCESS)
+ /o error o/ ;
+
+ /o get a parameter's position in a method o/
+ if (ortgpps(env, err, mdo, "an_age", strlen("an_age"),
+ &position, NULLP(OCIRef), NULLP(OCITypeElem)) != OCI_SUCCESS)
+ /o error o/ ;
+
+ /o ------------ GET THE METHOD's RESULT ------------ o/
+
+ /o get a method by name o/
+ if (OCITypeMethodByName(env, err, car_tdo, "get_age", strlen("get_age"),
+ &mdo) != OCI_SUCCESS)
+ /o error o/ ;
+
+ /o get the typecode of the method's result o/
+ typecode = OCITypeElemTypeCode(env, err, mdo);
+
+
+ /o ----------------- END ---------------- o/
+
+ /o free the references implicitly allocated o/
+ DISCARD orlrfre(env, err, (dvoid *)&attr_ref);
+ DISCARD orlrfre(env, err, (dvoid *)¶m_ref);
+
+ NOTES
+
+ MODIFIED
+ srseshad 03/12/03 - convert oci public api to ansi
+ aahluwal 06/03/02 - bug 2360115
+ skabraha 04/16/02 - fix compiler warnings
+ rkasamse 03/02/01 - do not use iterator : keyword in MSVB
+ bpalaval 02/09/01 - Change text to oratext.
+ rxgovind 01/31/00 - add OCIType interfaces for transient types
+ whe 09/01/99 - 976457:check __cplusplus for C++ code
+ cxcheng 05/06/97 - make OCI_TYPE?? test macros return either 1 or 0
+ cxcheng 04/22/97 - add comment on desupporting OCIType functions
+ skrishna 03/18/97 - fix ifdef for supporting ansi and k&r proto-types
+ cxcheng 02/26/97 - fix lint problem with oro names
+ cxcheng 02/06/97 - take out short name support except with SLSHORTNAME
+ cxcheng 01/15/97 - change prototype of OCITypeElemParameterizedType()
+ cxcheng 01/03/97 - replace bit in OCI_TYPEPARAM_IS_REQUIRED with bitwis
+ cxcheng 12/31/96 - replace OCI_PARAM_IS_REQUIRED with OCI_TYPEPARAM_IS_
+ cxcheng 12/09/96 - add prototype for OCITypeElemExtTypeCode and OCIType
+ cxcheng 11/25/96 - add schema name parameter to OCITypeVTInsert()
+ cxcheng 11/20/96 - fix prototype for OCITypeByName()
+ cxcheng 11/11/96 - fix prototype for OCITypeByName()
+ cxcheng 11/05/96 - remove OCITypeElemExtTypeCode and OCITypeCollExtType
+ dchatter 10/28/96 - change ortgatyp to be OCITypeArrayByName
+ cxcheng 10/25/96 - fix problem with ortgatyp at end
+ cxcheng 10/22/96 - add OCITypeByRef and OCITypeArrayByRef
+ cxcheng 10/20/96 - remove ortgtyp() from #define section at end
+ cxcheng 10/18/96 - rename OCITypeGetArray to OCITypeArrayByName
+ cxcheng 10/17/96 - final change to prototype for OCI_TYPEPARAM_IS_REQUI
+ cxcheng 10/15/96 - rename OCIEncapLevel and OCIMethodFlag
+ cxcheng 10/14/96 - change prototype of OCITypeResult
+ mluong 10/11/96 - fix compile error
+ jwijaya 10/10/96 - fix bug on OCI_PARAM_IS_REQUIRED
+ cxcheng 10/09/96 - more lint and link fixes
+ cxcheng 10/08/96 - more lint fixes
+ cxcheng 10/07/96 - more changes
+ cxcheng 10/04/96 - replace short names with long names
+ cxcheng 10/01/96 - change to long names for readability
+ cxcheng 09/27/96 - rename ortgatyp() to ortgtya() for lint
+ cxcheng 09/20/96 - add ortgatyp() for array get type
+ cxcheng 09/18/96 - add array pin and iterator functions
+ cxcheng 08/09/96 - add version table calls
+ cxcheng 07/22/96 - add OCITypeElemType() to top
+ jwijaya 07/03/96 - add ANSI prototypes
+ cxcheng 06/28/96 - add OCITypeElemCharSetForm()
+ cxcheng 06/26/96 - fix comment on OCITypeParamByPos()/ortgpps()
+ cxcheng 06/18/96 - fix comments on OCITypeResult()
+ cxcheng 06/17/96 - improve comments
+ skrishna 06/03/96 - change OCITypeCollElem() prototype
+ vkrishna 05/29/96 - replace OROTCFAR with OROTCCAR
+ cxcheng 05/28/96 - fix comments, remove non-beta1 functions
+ cxcheng 05/02/96 - fix prototype bugs
+ cxcheng 04/29/96 - rename OCITypeElemm() to ortanct()
+ cxcheng 04/26/96 - add ortgrbp and ortftyi,
+ fix comments and examples
+ cxcheng 04/22/96 - big merge to main branch
+ cxcheng 04/17/96 - fix syntax
+ cxcheng 04/08/96 - change prototype to ortaty()
+ skrishna 04/08/96 - change ort*() to take OCIEnv* and OCIError* instead
+ of oroenv*
+ cxcheng 03/28/96 - add ortslob(), change ortsstr() prototype
+ cxcheng 03/13/96 - change alter type interface
+ cxcheng 03/11/96 - ORT interface changes
+ cxcheng 02/27/96 - correct comments
+ jboonleu 02/09/96 - rename oroopd to OCIDuration
+ cxcheng 01/19/96 - change ORTCTYVAL to ORTCTYEMB for embedded ADT
+ cxcheng 02/14/96 - add more comments
+ jboonleu 02/09/96 - rename oroopd to OCIDuration
+ cxcheng 02/07/96 - fix comments and examples
+ cxcheng 01/19/96 - new ORT interface without korfc's
+ cxcheng 01/08/96 - consolidate collection functions
+ cxcheng 12/14/95 - remove obsolete ortgcol() and ortrelease()
+ jweisz 12/12/95 - merge screwup: ortdth twice
+ cxcheng 12/05/95 - change multiset interface for new standard
+ skotsovo 12/01/95 - merge from /vobs/rdbms/public/ort.h@@/main/
+ st_rdbms_big_dev/st_rdbms_obj/
+ st_rdbms_jwijaya_variable_ref
+ cxcheng 11/13/95 - add ortaty()/orteaty()
+ cxcheng 11/13/95 - add new collection type accessors
+ skotsovo 10/30/95 - add 'oid' type b/c extent type uses it.
+ skotsovo 10/24/95 - update according to new variable length ref
+ cxcheng 10/05/95 - add null support, change prototypes to calls
+ cxcheng 10/03/95 - add OCITypeMethodOrder() to get ORDER method
+ cxcheng 09/28/95 - add OCITypeElemm() for collection types support
+ skotsovo 06/05/95 - add adt_type parameter to ortsab()
+ skotsovo 05/10/95 - ifdef'd out ortgafp()
+ skotsovo 03/07/95 - update interface to only include release 1
+ skotsovo 02/22/95 - add multiset accessors
+ skotsovo 02/09/95 - update according to new ots doc
+ skotsovo 01/31/95 - add rest of release 1 types
+ skotsovo 01/24/95 - categorize sint32, double, and real as number types
+ (with precision and scale) instead of scalar types.
+ skotsovo 01/12/95 - remove dependency from ortdty interface
+ skotsovo 01/03/95 - remove orotyp accessors
+ skotsovo 12/12/94 - update comments
+ skotsovo 12/05/94 - change OCITypeElemParameterizedTyper interface
+ skotsovo 10/26/94 - add type version table
+ skotsovo 10/17/94 - fix ortgafp() comments
+ skotsovo 10/14/94 - modify ortgafp() parameters
+ skotsovo 10/14/94 - add examples
+ skotsovo 10/13/94 - add a few new routines
+ jwijaya 10/07/94 - add namespace to pin by name
+ jwijaya 10/02/94 - connection handle -> connection number
+ skotsovo 09/13/94 - modify example to use updated oririni interface
+ skotsovo 08/25/94 - change scale to sb1 from sb2
+ skotsovo 07/28/94 - add ortbeg() and ortend()
+ skotsovo 07/14/94 - add decimal type & call graph
+ skotsovo 06/28/94 - subset by removing miscellaneous functions
+ skotsovo 06/28/94 - consistently put comments before typedefs
+ skotsovo 06/27/94 - modify according to new header file template, add
+ more examples, and change ortcty() to return a
+ reference to the type
+ skotsovo 06/24/94 - add functions to get type information from orotyp
+ skotsovo 06/20/94 - finish modifying according to header template
+ skotsovo 06/09/94 - modify according to header file template
+ skotsovo 06/08/94 - replace s.h with oratypes.h
+ skotsovo 05/24/94 - modify comments & update example
+ skotsovo 05/23/94 - modify fnt names for create, alter and drop type
+ skotsovo 05/18/94 - remove ortdme() -- delete a method
+ skotsovo 05/17/94 - add tdo parameter to all type modifiers
+ skotsovo 05/11/94 - return text* instead of including it in arglist
+ skotsovo 11/16/93 - creation
+
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORT_ORACLE
+#define ORT_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/* SHORT NAMES SUPPORT SECTION */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+ with the SLSHORTNAME defined.
+ With this all subsequent long names will actually be substituted with
+ the short names here */
+
+#define OCITypeArrayByName ortgatyp
+#define OCITypeAttrByName ortgabn
+#define OCITypeAttrNext ortgabi
+#define OCITypeAttrs ortgtna
+#define OCITypeByRef ortgtbrf
+#define OCITypeCollElem ortgcel
+#define OCITypeCollExtTypeCode ortgcsqt
+#define OCITypeCollSize ortgcne
+#define OCITypeCollTypeCode ortgdttc
+#define OCITypeElem ortado
+#define OCITypeElemCharSetForm ortgscform
+#define OCITypeElemCharSetID ortgscid
+#define OCITypeElemDefaultValue ortgpdv
+#define OCITypeElemExtTypeCode ortgasqt
+#define OCITypeElemLength ortgsl
+#define OCITypeElemName ortganm
+#define OCITypeElemNumPrec ortgnp
+#define OCITypeElemNumScale ortgns
+#define OCITypeElemParamMode ortgpmo
+#define OCITypeElemParameterizedType ortgpa
+#define OCITypeElemType ortgaty
+#define OCITypeElemTypeCode ortgatc
+#define OCITypeIter ortitr
+#define OCITypeIterFree ortifre
+#define OCITypeIterNew ortinew
+#define OCITypeIterSet ortiset
+#define OCITypeMethod ortmdo
+#define OCITypeMethodByName ortgmbn
+#define OCITypeMethodEncap ortgmen
+#define OCITypeMethodFlags ortgmfl
+#define OCITypeMethodMap ortgmmap
+#define OCITypeMethodName ortgmnm
+#define OCITypeMethodNext ortgmbi
+#define OCITypeMethodOrder ortgmor
+#define OCITypeMethodOverload ortgmno
+#define OCITypeMethodParams ortgmnp
+#define OCITypeMethods ortgtnm
+#define OCITypeName ortgtme
+#define OCITypeParamByName ortgpbn
+#define OCITypeParamPos ortgpps
+#define OCITypeSchema ortgtsch
+#define OCITypeTypeCode ortgttc
+#define OCITypeVTInit ortvini
+#define OCITypeVTInsert ortvins
+#define OCITypeVTSelect ortvsel
+#define OCITypeVersion ortgtvn
+
+#endif /* SLSHORTNAME */
+
+
+/*============================*/
+/* PUBLIC TYPES AND CONSTANTS */
+/*============================*/
+
+/*----------------------------- TYPE DESCRIPTION ----------------------------*/
+
+/*
+ * OCIType - OCI Type Description Object
+ *
+ * The contents of an 'OCIType' is private/opaque to clients. Clients just
+ * need to declare and pass 'OCIType' pointers in to the type manage
+ * functions.
+ * The pointer points to the type in the object cache. Thus, clients don't
+ * need to allocate space for this type and must NEVER free the pointer to the
+ * 'OCIType'.
+ */
+
+typedef struct OCIType OCIType;
+
+/*------------------------- TYPE ELEMENT DESCRIPTION ------------------------*/
+
+
+/*
+ * OCITypeElem - OCI Type Element object
+ *
+ * The contents of an 'OCITypeElem' is private/opaque to clients. Clients just
+ * need to declare and pass 'OCITypeElem' pointers in to the type manager
+ * functions.
+ *
+ * 'OCITypeElem' objects contains type element information such as the numeric
+ * precision for example, for number objects, and the number of elements for
+ * arrays.
+ * They ARE used to describe type attributes, collection elements,
+ * method parameters, and method results. Hence they are pass in or returned
+ * by attribute, collection, and method parameter/result accessors.
+ */
+
+typedef struct OCITypeElem OCITypeElem;
+
+
+/*--------------------------- METHOD DESCRIPTION ---------------------------*/
+
+
+/*
+ * OCITypeMethod - OCI Method Description object
+ *
+ * The contents of an 'OCITypeMethod' is private/opaque to clients. Clients
+ * just need to declare and pass 'OCITypeMethod' pointers in to the type
+ * manager functions.
+ * The pointer points to the method in the object cache. Thus, clients don't
+ * need to allocate space for this type and must NEVER free the pointer to
+ * the 'OCITypeMethod'.
+ */
+
+typedef struct OCITypeMethod OCITypeMethod;
+
+
+/*--------------------------- TYPE ACCESS ITERATOR --------------------------*/
+
+/*
+ * OCITypeIter- OCI Type Iterator
+ *
+ * The contents of an 'orti' is private/opaque to clients. Clients just
+ * need to declare and pass 'orti' pointers in to the type manager functions.
+ * The iterator is used to retreive MDO's and ADO's that belong to the TDO
+ * one at a time. It needs to be allocated by the 'OCITypeIterNew()' function
+ * call and deallocated with the 'OCITypeIterFree()' function call.
+ */
+
+typedef struct OCITypeIter OCITypeIter;
+
+
+/*==================*/
+/* PUBLIC FUNCTIONS */
+/*==================*/
+
+/*--------------------------------------------------------------------------*/
+/* ITERATOR */
+/*--------------------------------------------------------------------------*/
+
+/*-----------------------_- OCITypeIterNew ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeIterNew( OCIEnv *env, OCIError *err, OCIType *tdo,
+ OCITypeIter **iterator_ort );
+
+/*
+ NAME: OCITypeIterNew - OCI Iterator NEW
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to the pinned type in the object cache to
+ initialize the iterator with
+ iterator_ort (OUT) - pointer to the pointer to the new iterator created
+ DESCRIPTION:
+ Create a new instance of a method/attribute iterator and initalize
+ it's values.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ 2) error while allocating space for the iterator.
+*/
+
+/*------------------------ OCITypeIterSet ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeIterSet( OCIEnv *env, OCIError *err, OCIType *tdo,
+ OCITypeIter *iterator_ort );
+
+/*
+ NAME: OCITypeIterSet - OCI Iterator SET
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to the pinned type in the object cache to
+ initialize the iterator with
+ iterator_ort (IN/OUT) - pointer to the iterator to set
+ DESCRIPTION:
+ Initializes the iterator. This is used to reset the state of the
+ iterator.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+*/
+
+/*------------------------ OCITypeIterFree ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeIterFree( OCIEnv *env, OCIError *err, OCITypeIter
+ *iterator_ort );
+
+/*
+ NAME: OCITypeIterFree - OCI Iterator FREe
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ iterator_ort (IN/OUT) - pointer to the iterator to free
+ DESCRIPTION:
+ Free space allocated for the iterator.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ 2) error while freeing the iterator, probably bad iterator pointer.
+*/
+
+
+/*--------------------------------------------------------------------------*/
+/* TYPE GET */
+/*--------------------------------------------------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeByName( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+ CONST oratext *schema_name, ub4 s_length,
+ CONST oratext *type_name, ub4 t_length,
+ CONST oratext *version_name, ub4 v_length,
+ OCIDuration pin_duration, OCITypeGetOpt get_option,
+ OCIType **tdo );
+/*
+ NAME: OCITypeByName - OCI Get the most current version of an existing TYPe
+ by name.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ svc (IN) - OCI service handle
+ schema_name (IN, optional) - name of schema associated with the
+ type. By default, the user's schema name is used.
+ s_length (IN) - length of the 'schema_name' parameter
+ type_name (IN) - name of the type to get
+ t_length (IN) - length of the 'type_name' parameter
+ version_name (IN, optional) - user readable version of the type.
+ Pass (oratext *)0 for the most current version.
+ v_length (IN) - length of version_name in bytes. Should be 0 if
+ the most current version is to be retrieved.
+ pin_duration (IN) - pin duration (e.g. until the end of current
+ transaction). See 'oro.h' for a description of
+ each option.
+ get_option (IN) - options for loading the types. It can be one of two
+ values:
+ OCI_TYPEGET_HEADER for only the header to be loaded, or
+ OCI_TYPEGET_ALL for the TDO and all ADO and MDOs to be
+ loaded.
+ tdo (OUT) - pointer to the pinned type in the object cache
+ DESCRIPTION:
+ Get a pointer to a version of the existing type associated
+ with schema/type name.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ 2) the adt type associated with schema/type name does not exist.
+ NOTE:
+ Schema and type names are CASE-SENSITIVE. If they have been created
+ via SQL, you need to use uppercase names.
+*/
+
+sword OCITypeArrayByName( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+ ub4 array_len,
+ CONST oratext *schema_name[], ub4 s_length[],
+ CONST oratext *type_name[], ub4 t_length[],
+ CONST oratext *version_name[], ub4 v_length[],
+ OCIDuration pin_duration,
+ OCITypeGetOpt get_option, OCIType **tdo );
+
+/*
+ NAME: OCITypeArrayByName - OCI Get array of TYPes by name.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ svc (IN) - OCI service handle
+ array_len (IN) - number of schema_name/type_name/version_name entries to
+ be retrieved.
+ schema_name (IN, optional) - array of schema names associated with the
+ types to be retrieved. The array must have array_len
+ elements if specified.
+ If 0 is supplied, the default schema is assumed, otherwise
+ it MUST have array_len number of elements.
+ 0 can be supplied for one or more of the entries to indicate
+ that the default schema is desired for those entries.
+ s_length (IN) - array of schema_name lengths with each entry
+ corresponding to the length of the corresponding schema_name
+ entry in the schema_name array in bytes.
+ The array must either have array_len number of elements or
+ it MUST be 0 if schema_name is not specified.
+ type_name (IN) - array of the names of the types to retrieve. This
+ MUST have array_len number of elements.
+ t_length (IN) - array of the lengths of type names in the type_name
+ array in bytes.
+ version_name (IN) - array of the version names of the types to retrieve
+ corresponding. This can be 0 to indicate retrieval of the
+ most current versions, or it MUST have array_len number of
+ elements.
+ If 0 is supplied, the most current version is assumed,
+ otherwise it MUST have array_len number of elements.
+ 0 can be supplied for one or more of the entries to indicate
+ that the current version is desired for those entries.
+ v_length (IN) - array of the lengths of version names in the
+ version_name array in bytes.
+ pin_duration (IN) - pin duration (e.g. until the end of current
+ transaction) for the types retreieve. See 'oro.h' for a
+ description of each option.
+ get_option (IN) - options for loading the types. It can be one of two
+ values:
+ OCI_TYPEGET_HEADER for only the header to be loaded, or
+ OCI_TYPEGET_ALL for the TDO and all ADO and MDOs to be
+ loaded.
+ tdo (OUT) - output array for the pointers to each pinned type in the
+ object cache. It must have space for array_len pointers.
+ Use OCIObjectGetObjectRef() to obtain the CREF to each
+ pinned type descriptor.
+ DESCRIPTION:
+ Get pointers to the existing types associated with the schema/type name
+ array. This is similar to OCITypeByName() except that all the TDO's are
+ retreived via a single network roundtrip.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ 2) one or more adt types associated with a schema/type name entry
+ does not exist.
+*/
+
+sword OCITypeByRef( OCIEnv *env, OCIError *err,
+ CONST OCIRef *type_ref, OCIDuration pin_duration,
+ OCITypeGetOpt get_option, OCIType **tdo );
+
+/*
+ NAME: OCITypeArrayByRef - OCI Get array of TYPes by REF.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ type_ref (IN) - OCIRef * pointing to the particular version of
+ the type descriptor object to obtain.
+ The array must have array_len elements if specified.
+ pin_duration (IN) - pin duration (e.g. until the end of current
+ transaction) for the type to retreieve. See 'oro.h' for a
+ description of each option.
+ get_option (IN) - options for loading the type. It can be one of two
+ values:
+ OCI_TYPEGET_HEADER for only the header to be loaded, or
+ OCI_TYPEGET_ALL for the TDO and all ADO and MDOs to be
+ loaded.
+ tdo (OUT) - pointer to the pinned type in the object cache
+ DESCRIPTION:
+ Get pointers to the
+ with the schema/type name array. This is similar to OCITypeByName()
+ except that all the TDO's are retreived via a single network roundtrip.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ 2) one or more adt types associated with a schema/type name entry
+ does not exist.
+*/
+
+sword OCITypeArrayByRef( OCIEnv *env, OCIError *err,
+ ub4 array_len, CONST OCIRef **type_ref,
+ OCIDuration pin_duration,
+ OCITypeGetOpt get_option, OCIType **tdo );
+
+/*
+ NAME: OCITypeArrayByRef - OCI Get array of TYPes by REF.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ array_len (IN) - number of schema_name/type_name/version_name entries to
+ be retrieved.
+ type_ref (IN) - array of OCIRef * pointing to the particular version of
+ the type descriptor object to obtain.
+ The array must have array_len elements if specified.
+ pin_duration (IN) - pin duration (e.g. until the end of current
+ transaction) for the types retreieve. See 'oro.h' for a
+ description of each option.
+ get_option (IN) - options for loading the types. It can be one of two
+ values:
+ OCI_TYPEGET_HEADER for only the header to be loaded, or
+ OCI_TYPEGET_ALL for the TDO and all ADO and MDOs to be
+ loaded.
+ tdo (OUT) - output array for the pointers to each pinned type in the
+ object cache. It must have space for array_len pointers.
+ Use OCIObjectGetObjectRef() to obtain the CREF to each
+ pinned type descriptor.
+ DESCRIPTION:
+ Get pointers to the
+ with the schema/type name array. This is similar to OCITypeByName()
+ except that all the TDO's are retreived via a single network roundtrip.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ 2) one or more adt types associated with a schema/type name entry
+ does not exist.
+*/
+
+
+/*--------------------------------------------------------------------------*/
+/* TYPE ACCESSORS */
+/*--------------------------------------------------------------------------*/
+
+/*---------------------------- OCITypeName ---------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeName( OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+ ub4 *n_length );
+/*
+ NAME: OCITypeName - ORT Get a Type's naME.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to to the type descriptor in the object cache
+ n_length (OUT) - length (in bytes) of the returned type name. The
+ caller must allocate space for the ub4 before calling this
+ routine.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ 3) 'n_length' must point to an allocated ub4.
+ DESCRIPTION:
+ Get the name of the type.
+ RETURNS:
+ the name of the type
+ NOTES:
+ The type descriptor, 'tdo', must be unpinned when the accessed
+ information is no longer needed.
+ */
+
+/*------------------------ OCITypeSchema ---------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeSchema( OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+ ub4 *n_length );
+/*
+ NAME: OCITypeSchema - ORT Get a Type's SCHema name.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to to the type descriptor in the object cache
+ n_length (OUT) - length (in bytes) of the returned schema name. The
+ caller must allocate space for the ub4 before calling this
+ routine.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ 3) 'n_length' must point to an allocated ub4.
+ DESCRIPTION:
+ Get the schema name of the type.
+ RETURNS:
+ the schema name of the type
+ NOTES:
+ The type descriptor, 'tdo', must be unpinned when the accessed
+ information is no longer needed.
+ */
+
+/*------------------------ OCITypeTypeCode ---------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeCode OCITypeTypeCode( OCIEnv *env, OCIError *err,
+ CONST OCIType *tdo );
+/*
+ NAME: OCITypeTypeCode - OCI Get a Type's Type Code.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to to the type descriptor in the object cache
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the type code of the type.
+ RETURNS:
+ The type code of the type.
+ NOTES:
+ The type descriptor, 'tdo', must be unpinned when the accessed
+ information is no longer needed.
+ */
+
+/*----------------------- OCITypeCollTypeCode -------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeCode OCITypeCollTypeCode( OCIEnv *env, OCIError *err,
+ CONST OCIType *tdo );
+/*
+ NAME: OCITypeCollTypeCode - OCI Get a Domain Type's Type Code.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to to the type descriptor in the object cache
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ 3) 'tdo' MUST point to a named collection type.
+ DESCRIPTION:
+ Get the type code of the named collection type. For V8.0, named
+ collection types can only be variable length arrays and nested tables.
+ RETURNS:
+ OCI_TYPECODE_VARRAY for variable length array, and
+ OCI_TYPECODE_TABLE for nested tables.
+ NOTES:
+ The type descriptor, 'tdo', should be unpinned when the accessed
+ information is no longer needed.
+ */
+
+/*------------------------- OCITypeVersion ---------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeVersion( OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+ ub4 *v_length );
+/*
+ NAME: OCITypeVersion - OCI Get a Type's user-readable VersioN.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to to the type descriptor in the object cache
+ v_length (OUT) - length (in bytes) of the returned user-readable
+ version. The caller must allocate space for the ub4 before
+ calling this routine.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ 3) 'v_length' must point to an allocated ub4.
+ DESCRIPTION:
+ Get the user-readable version of the type.
+ RETURNS:
+ The user-readable version of the type
+ NOTES:
+ The type descriptor, 'tdo', must be unpinned when the accessed
+ information is no longer needed.
+ */
+
+/*--------------------------- OCITypeAttrs ---------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeAttrs( OCIEnv *env, OCIError *err, CONST OCIType *tdo );
+/*
+ NAME: OCITypeAttrs - OCI Get a Type's Number of Attributes.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to to the type descriptor in the object cache
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the number of attributes in the type.
+ RETURNS:
+ The number of attributes in the type. 0 for ALL non-ADTs.
+ NOTES:
+ The type descriptor, 'tdo', must be unpinned when the accessed
+ information is no longer needed.
+ */
+
+/*------------------------- OCITypeMethods ---------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeMethods( OCIEnv *env, OCIError *err, CONST OCIType *tdo );
+/*
+ NAME: OCITypeMethods - OCI Get a Type's Number of Methods.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to to the type descriptor in the object cache
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the number of methods in a type.
+ RETURNS:
+ The number of methods in the type
+ NOTES:
+ The type descriptor, 'tdo', must be unpinned when the accessed
+ information is no longer needed.
+ */
+
+
+/*--------------------------------------------------------------------------*/
+/* TYPE ELEMENT INFORMATION ACCESSORS */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------ OCITypeElemName ---------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeElemName( OCIEnv *env, OCIError *err,
+ CONST OCITypeElem *elem, ub4 *n_length );
+/*
+ NAME: OCITypeElemName - OCI Get an Attribute's NaMe.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the type element descriptor in the object cache
+ n_length (OUT) - length (in bytes) of the returned attribute name.
+ The caller must allocate space for the ub4 before calling this
+ routine.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ 3) 'n_length' must point to an allocated ub4.
+ DESCRIPTION:
+ Get the name of the attribute.
+ RETURNS:
+ the name of the attribute and the length in n_length
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*------------------------ OCITypeElemTypeCode ------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeCode OCITypeElemTypeCode( OCIEnv *env, OCIError *err,
+ CONST OCITypeElem *elem );
+/*
+ NAME: OCITypeElemTypeCode - OCI Get an Attribute's TypeCode.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the type element descriptor in the object cache
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the typecode of an attribute's type.
+ RETURNS:
+ the typecode of the attribute's type. If this is a scalar type, the
+ typecode sufficiently describes the scalar type and no further calls
+ need to be made. Valid scalar types include: OCI_TYPECODE_SIGNED8,
+ OCI_TYPECODE_UNSIGNED8, OCI_TYPECODE_SIGNED16, OCI_TYPECODE_UNSIGNED16,
+ OCI_TYPECODE_SIGNED32, OCI_TYPECODE_UNSIGNED32, OCI_TYPECODE_REAL,
+ OCI_TYPECODE_DOUBLE, OCI_TYPECODE_DATE,
+ OCI_TYPECODE_MLSLABEL, OROTCOID, OCI_TYPECODE_OCTET, or OROTCLOB.
+ This function converts the CREF (stored in the attribute) into a
+ typecode.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*------------------------ OCITypeElemType ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeElemType( OCIEnv *env, OCIError *err, CONST OCITypeElem *elem,
+ OCIType **elem_tdo );
+/*
+ PARAMETERS
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the type element descriptor in the object cache
+ elem_tdo (OUT) - If the function completes successfully, 'elem_tdo'
+ points to the type descriptor (in the object cache) of the type of
+ the element.
+
+ REQUIRES
+ 1) All type accessors require that the type be pinned before calling
+ any accessor. This can be done by calling 'OCITypeByName()'.
+ 2) if 'elem' is not null, it must point to a valid type element descriptor
+ in the object cache.
+
+ DESCRIPTION
+ Get the type tdo of the type of this element.
+ RETURNS
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the parameters is null.
+
+ NOTES
+ The type must be unpinned when the accessed information is no
+ longer needed. This can be done by calling 'OCIObjectUnpin()'.
+ */
+
+/*------------------------- OCITypeElemFlags -------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeElemFlags( OCIEnv *env, OCIError *err,
+ CONST OCITypeElem *elem );
+/*
+ NAME: OCITypeElemFlags - OCI Get a Elem's FLags
+ (inline, constant, virtual, constructor,
+ destructor).
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the type element descriptor in the object cache
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the flags of a type element (attribute, parameter).
+ RETURNS:
+ The flags of the type element.
+ NOTES:
+ The flag bits are not externally documented. Use only the macros
+ in the last section (ie. OCI_TYPEPARAM_IS_REQUIRED, and
+ OCI_TYPEELEM_IS_REF) to test for them only. The type must be unpinned
+ when the accessed information is no longer needed.
+ */
+
+/*------------------------ OCITypeElemNumPrec ------------------------------*/
+
+/* ** OBSOLETE ** */
+ub1 OCITypeElemNumPrec( OCIEnv *env, OCIError *err,
+ CONST OCITypeElem *elem );
+/*
+ NAME: OCITypeElemNumPrec - Get a Number's Precision. This includes float,
+ decimal, real, double, and oracle number.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the type element descriptor in the object cache
+ REQUIRES:
+ All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the precision of a float, decimal, long, unsigned long, real,
+ double, or Oracle number type.
+ RETURNS:
+ the precision of the float, decimal, long, unsigned long, real, double,
+ or Oracle number
+ */
+
+/*------------------------- OCITypeElemNumScale -----------------------------*/
+
+/* ** OBSOLETE ** */
+sb1 OCITypeElemNumScale( OCIEnv *env, OCIError *err,
+ CONST OCITypeElem *elem );
+/*
+ NAME: OCITypeElemNumScale - Get a decimal or oracle Number's Scale
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the type element descriptor in the object cache
+ REQUIRES:
+ All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the scale of a decimal, or Oracle number type.
+ RETURNS:
+ the scale of the decimal, or Oracle number
+ */
+
+/*------------------------ OCITypeElemLength -------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeElemLength( OCIEnv *env, OCIError *err,
+ CONST OCITypeElem *elem );
+/*
+ NAME: OCITypeElemLength - Get a raw, fixed or variable length String's
+ length in bytes.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the type element descriptor in the object cache
+ REQUIRES:
+ All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the length of a raw, fixed or variable length string type.
+ RETURNS:
+ length of the raw, fixed or variable length string
+ */
+
+/*----------------------- OCITypeElemCharSetID -----------------------------*/
+
+/* ** OBSOLETE ** */
+ub2 OCITypeElemCharSetID( OCIEnv *env, OCIError *err,
+ CONST OCITypeElem *elem );
+/*
+ NAME: OCITypeElemCharSetID - Get a fixed or variable length String's
+ character set ID
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the type element descriptor in the object cache
+ REQUIRES:
+ All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the character set ID of a fixed or variable length string type.
+ RETURNS:
+ character set ID of the fixed or variable length string
+ */
+
+/*---------------------- OCITypeElemCharSetForm ----------------------------*/
+
+/* ** OBSOLETE ** */
+ub2 OCITypeElemCharSetForm( OCIEnv *env, OCIError *err,
+ CONST OCITypeElem *elem );
+/*
+ NAME: OCITypeElemCharSetForm - Get a fixed or variable length String's
+ character set specification form.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the attribute information in the object cache
+ REQUIRES:
+ All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the character form of a fixed or variable length string type.
+ The character form is an enumerated value that can be one of the
+ 4 values below:
+ SQLCS_IMPLICIT for CHAR, VARCHAR2, CLOB w/o a specified set
+ SQLCS_NCHAR for NCHAR, NCHAR VARYING, NCLOB
+ SQLCS_EXPLICIT for CHAR, etc, with "CHARACTER SET ..." syntax
+ SQLCS_FLEXIBLE for PL/SQL "flexible" parameters
+ RETURNS:
+ character form of the fixed or variable string
+ */
+
+/*--------------------- OCITypeElemParameterizedType ------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeElemParameterizedType( OCIEnv *env, OCIError *err,
+ CONST OCITypeElem *elem,
+ OCIType **type_stored );
+/*
+ NAME: OCITypeElemParameterizedType
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the type element descriptor in the object cache
+ type_stored (OUT) - If the function completes successfully,
+ and the parameterized type is complex, 'type_stored' is NULL.
+ Otherwise, 'type_stored' points to the type descriptor (in the
+ object cache) of the type that is stored in the parameterized
+ type. The caller must allocate space for the OCIType*
+ before calling this routine and must not write into the space.
+ REQUIRES:
+ All input parameters must be valid.
+ DESCRIPTION:
+ Get a descriptor to the parameter type of a parameterized type.
+ Parameterized types are types of the form:
+ REF T
+ VARRAY (n) OF T
+ etc, where T is the parameter in the parameterized type.
+ Additionally is_ref is set if the parameter is a PTR or REF.
+ For example, it is set for REF T or VARRAY(n) OF REF T.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the parameters is null.
+ 2) 'type_stored' is not NULL but points to NULL data.
+ NOTES:
+ Complex parameterized types will be in a future release (once
+ typedefs are supported. When setting the parameterized type
+ information, the user must typedef the contents if it's a
+ complex parameterized type. Ex. for varray<varray<car>>, use
+ 'typedef varray<car> varcar' and then use varray<varcar>.
+ */
+
+/*----------------------- OCITypeElemExtTypeCode ----------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeCode OCITypeElemExtTypeCode( OCIEnv *env, OCIError *err,
+ CONST OCITypeElem *elem );
+/*
+ NAME: OCITypeElemExtTypeCode - OCI Get an element's SQLT constant.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the type element descriptor in the object cache
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the internal Oracle typecode associated with an attribute's type.
+ This is the actual typecode for the attribute when it gets mapped
+ to a column in the Oracle database.
+ RETURNS:
+ The Oracle typecode associated with the attribute's type.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*--------------------------------------------------------------------------*/
+/* ATTRIBUTE ACCESSORS */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------ OCITypeAttrByName -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeAttrByName( OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+ CONST oratext *name, ub4 n_length,
+ OCITypeElem **elem );
+/*
+ NAME: OCITypeAttrByName - OCI Get an Attribute By Name.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to to the type descriptor in the object cache
+ name (IN) - the attribute's name
+ n_length (IN) - length (in bytes) of the 'name' parameter
+ elem (OUT) - If this function completes successfully, 'elem' points to
+ the selected type element descriptor pertaining to the
+ attributein the object cache.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) if 'tdo' is not null, it must point to a valid type descriptor
+ in the object cache.
+ DESCRIPTION:
+ Get an attribute given its name.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ 2) the type does not contain an attribute with the input 'name'.
+ 3) 'name' is NULL.
+ NOTES:
+ The type descriptor, 'tdo', must be unpinned when the accessed
+ information is no longer needed.
+ Schema and type names are CASE-SENSITIVE. If they have been created
+ via SQL, you need to use uppercase names.
+ */
+
+/*------------------------ OCITypeAttrNext ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeAttrNext( OCIEnv *env, OCIError *err,
+ OCITypeIter *iterator_ort, OCITypeElem **elem );
+
+/*
+ NAME: OCITypeAttrNext - OCI Get an Attribute By Iteration.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ iterator_ort (IN/OUT) - iterator for retrieving the next attribute;
+ see OCITypeIterNew() to initialize iterator.
+ elem (OUT) - If this function completes successfully, 'elem' points to
+ the selected type element descriptor pertaining to the
+ attributein the object cache.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) if 'tdo' is not null, it must point to a valid type descriptor
+ in the object cache.
+ DESCRIPTION:
+ Iterate to the next attribute to retrieve.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_NO_DATA if there are no more attributes to iterate on; use
+ OCITypeIterSet() to reset the iterator if necessary.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*--------------------------------------------------------------------------*/
+/* COLLECTION ACCESSORS */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------ OCITypeCollElem ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeCollElem( OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+ OCITypeElem **element );
+/*
+ NAME: OCITypeCollElem
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to the type descriptor in the object cache
+ element (IN/OUT) - If the function completes successfully, this
+ points to the descriptor for the collection's element.
+ It is stored in the same format as an ADT attribute's
+ descriptor.
+ If *element is NULL, OCITypeCollElem() implicitly allocates a
+ new instance of OCITypeElem in the object cache. This instance
+ will be
+ automatically freed at the end of the session, and does not have
+ to be freed explicitly.
+ If *element is not NULL, OCITypeCollElem() assumes that it
+ points to a valid OCITypeElem descriptor and will copy the
+ results into it.
+ REQUIRES:
+ All input parameters must be valid.
+ DESCRIPTION:
+ Get a pointer to the descriptor (OCITypeElem) of the element of an
+ array or the rowtype of a nested table.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the parameters is null.
+ 2) the type TDO does not point to a valid collection's type.
+ NOTES:
+ Complex parameterized types will be in a future release (once
+ typedefs are supported. When setting the parameterized type
+ information, the user must typedef the contents if it's a
+ complex parameterized type. Ex. for varray<varray<car>>, use
+ 'typedef varray<car> varcar' and then use varray<varcar>.
+ */
+
+/*------------------------ OCITypeCollSize ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeCollSize( OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+ ub4 *num_elems );
+/*
+ NAME: OCITypeCollSize - OCI Get a Collection's Number of Elements.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to the type descriptor in the object cache
+ num_elems (OUT) - number of elements in collection
+ REQUIRES:
+ All input parameters must be valid. tdo points to an array type
+ defined as a domain.
+ DESCRIPTION:
+ Get the number of elements stored in a fixed array or the maximum
+ number of elements in a variable array.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the parameters is null.
+ 2) 'tdo' does not point to a domain with a collection type.
+ NOTES:
+ Complex parameterized types will be in a future release (once
+ typedefs are supported. When setting the parameterized type
+ information, the user must typedef the contents if it's a
+ complex parameterized type. Ex. for varray<varray<car>>, use
+ 'typedef varray<car> varcar' and then use varray<varcar>.
+ */
+
+/*------------------------ OCITypeCollExtTypeCode ---------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeCollExtTypeCode( OCIEnv *env, OCIError *err,
+ CONST OCIType *tdo, OCITypeCode *sqt_code );
+/*
+ NAME: ortcsqt - OCI Get a Collection element's DTY constant.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to the type descriptor in the object cache
+ sqt_code (OUT) - SQLT code of type element.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the SQLT constant associated with an domain's element type.
+ The SQLT codes are defined in <sqldef.h> and are needed for OCI/OOCI
+ use.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the parameters is null.
+ 2) 'tdo' does not point to a domain with a collection type.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+
+/*--------------------------------------------------------------------------*/
+/* METHOD ACCESSORS */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------- OCITypeMethodOverload --------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeMethodOverload( OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+ CONST oratext *method_name, ub4 m_length );
+/*
+ NAME: OCITypeMethodOverload - OCI Get type's Number of Overloaded names
+ for the given method name.
+ PARAMETERS:
+ gp (IN/OUT) - pga environment handle. Any errors are recorded here.
+ tdo (IN) - pointer to to the type descriptor in the object cache
+ method_name (IN) - the method's name
+ m_length (IN) - length (in bytes) of the 'method_name' parameter
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) if 'tdo' is not null, it must point to a valid type descriptor
+ in the object cache.
+ DESCRIPTION:
+ Overloading of methods implies that more than one method may have the
+ same method name. This routine returns the number of methods that
+ have the given method name. If there are no methods with the input
+ method name, 'num_methods' is 0. The caller uses this information when
+ allocating space for the array of mdo and/or position pointers before
+ calling 'OCITypeMethodByName()' or 'ortgmps()'.
+ RETURNS:
+ The number of methods with the given name. 0 if none contains the
+ name.
+ NOTES:
+ Schema and type names are CASE-SENSITIVE. If they have been created
+ via SQL, you need to use uppercase names.
+ */
+
+/*------------------------ OCITypeMethodByName ------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeMethodByName( OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+ CONST oratext *method_name, ub4 m_length,
+ OCITypeMethod **mdos );
+/*
+ NAME: OCITypeMethodByName - OCI Get one or more Methods with Name.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to to the type descriptor in the object cache
+ method_name (IN) - the methods' name
+ m_length (IN) - length (in bytes) of the 'name' parameter
+ mdos (OUT) - If this function completes successfully, 'mdos' points to
+ the selected methods in the object cache. The caller must
+ allocate space for the array of OCITypeMethod pointers before
+ calling this routine and must not write into the space.
+ The number of OCITypeMethod pointers that will be returned can
+ be obtained by calling 'OCITypeMethodOverload()'.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) if 'tdo' is not null, it must point to a valid type descriptor
+ in the object cache.
+ DESCRIPTION:
+ Get one or more methods given the name.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ 2) No methods in type has name 'name'.
+ 3) 'mdos' is not NULL but points to NULL data.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ Schema and type names are CASE-SENSITIVE. If they have been created
+ via SQL, you need to use uppercase names.
+ */
+
+/*------------------------ OCITypeMethodNext --------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeMethodNext( OCIEnv *env, OCIError *err,
+ OCITypeIter *iterator_ort,
+ OCITypeMethod **mdo );
+
+/*
+ NAME: OCITypeMethodNext - OCI Get a Method By Iteration.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ iterator_ort (IN/OUT) - iterator for retrieving the next method;
+ see OCITypeIterNew() to set iterator.
+ mdo (OUT) - If this function completes successfully, 'mdo' points to
+ the selected method descriptor in the object cache. Positions
+ start at 1. The caller must allocate space for the
+ OCITypeMethod* before calling this routine and must not write
+ nto the space.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) if 'tdo' is not null, it must point to a valid type descriptor
+ in the object cache.
+ DESCRIPTION:
+ Iterate to the next method to retrieve.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_NO_DATA if there are no more attributes to iterate on; use
+ OCITypeIterSet() to reset the iterator if necessary.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ 2) 'mdo' is not NULL but points to NULL data.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*------------------------ OCITypeMethodName --------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext *OCITypeMethodName( OCIEnv *env, OCIError *err,
+ CONST OCITypeMethod *mdo, ub4 *n_length );
+/*
+ NAME: OCITypeMethodName - OCI Get a Method's NaMe.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ mdo (IN) - pointer to the method descriptor in the object cache
+ n_length (OUT) - length (in bytes) of the 'name' parameter. The caller
+ must allocate space for the ub4 before calling this routine.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the (non-unique) real name of the method.
+ RETURNS:
+ the non-unique name of the method or NULL if there is an error.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*------------------------ OCITypeMethodEncap -------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeEncap OCITypeMethodEncap( OCIEnv *env, OCIError *err,
+ CONST OCITypeMethod *mdo );
+/*
+ NAME: OCITypeMethodEncap - Get a Method's ENcapsulation (private/public).
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ mdo (IN) - pointer to the method descriptor in the object cache
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the encapsulation (private, or public) of a method.
+ RETURNS:
+ the encapsulation (private, or public) of the method
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*------------------------ OCITypeMethodFlags -------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeMethodFlag OCITypeMethodFlags( OCIEnv *env, OCIError *err,
+ CONST OCITypeMethod *mdo );
+/*
+ NAME: OCITypeMethodFlags - OCI Get a Method's FLags
+ (inline, constant, virtual, constructor,
+ destructor).
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ mdo (IN) - pointer to the method descriptor in the object cache
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the flags (inline, constant, virutal, constructor, destructor) of
+ a method.
+ RETURNS:
+ the flags (inline, constant, virutal, constructor, destructor) of
+ the method
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*------------------------ OCITypeMethodMap ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeMethodMap( OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+ OCITypeMethod **mdo );
+/*
+ NAME: OCITypeMethodMap - OCI Get the Method's MAP function.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to to the type descriptor in the object cache
+ mdo (OUT) - If this function completes successfully, and there is a
+ map function for this type, 'mdo' points to the selected method
+ descriptor in the object cache. Otherwise, 'mdo' is null.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All required input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ A type may have only one map function. 'OCITypeMethodMap()' finds
+ this function, if it exists, and returns a reference and a pointer to
+ the method descriptor in the object cache. If the type does not have a
+ map (relative ordering) function, then 'mdo_ref' and 'mdo' are set
+ to null and an error is returned.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ the type does not contain a map function.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*------------------------ OCITypeMethodOrder -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeMethodOrder( OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+ OCITypeMethod **mdo );
+/*
+ NAME: OCITypeMethodOrder - OCI Get the Method's ORder function.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ tdo (IN) - pointer to to the type descriptor in the object cache
+ mdo (OUT) - If this function completes successfully, and there is a
+ map function for this type, 'mdo' points to the selected method
+ descriptor in the object cache. Otherwise, 'mdo' is null.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All required input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ A type may have only one ORder or MAP function. 'OCITypeMethodOrder()'
+ finds this function, if it exists, and returns a ref and a pointer
+ to the method descriptor in the object cache. If the type does not
+ have a map (relative ordering) function, then 'mdo_ref' and 'mdo' are
+ set to null and an error is returned.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ the type does not contain a map function.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*------------------------ OCITypeMethodParams ------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeMethodParams( OCIEnv *env, OCIError *err,
+ CONST OCITypeMethod *mdo );
+/*
+ NAME: OCITypeMethodParams - OCI Get a Method's Number of Parameters.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ mdo (IN) - pointer to the method descriptor in the object cache
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the number of parameters in a method.
+ RETURNS:
+ the number of parameters in the method
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+
+/*--------------------------------------------------------------------------*/
+/* RESULT ACCESSORS */
+/*--------------------------------------------------------------------------*/
+
+/*-------------------------- OCITypeResult ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeResult( OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo,
+ OCITypeElem **elem );
+/*
+ NAME: OCITypeResult - OCI Get a method's result type descriptor.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ mdo (IN) - pointer to the method descriptor in the object cache
+ elem (OUT) - If this function completes successfully, 'rdo' points to
+ the selected result (parameter) descriptor in the object cache.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) 'elem' MUST be the address of an OCITypeElem pointer.
+ DESCRIPTION:
+ Get the result of a method.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ 2) method returns no results.
+ NOTES:
+ The method must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+
+/*--------------------------------------------------------------------------*/
+/* PARAMETER ACCESSORS */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------ OCITypeParamByPos -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeParamByPos( OCIEnv *env, OCIError *err,
+ CONST OCITypeMethod *mdo, ub4 position,
+ OCITypeElem **elem );
+/*
+ NAME: OCITypeParamByPos - OCI Get a Parameter in a method By Position.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ mdo (IN) - pointer to the method descriptor in the object cache
+ position (IN) - the parameter's position. Positions start at 1.
+ elem (OUT) - If this function completes successfully, 'elem' points to
+ the selected parameter descriptor in the object cache.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ DESCRIPTION:
+ Get a parameter given its position in the method. Positions start
+ at 1.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ 2) 'position' is not >= 1 and <= the number of parameters in the
+ method.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*------------------------ OCITypeParamByName -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeParamByName( OCIEnv *env, OCIError *err,
+ CONST OCITypeMethod *mdo,
+ CONST oratext *name, ub4 n_length,
+ OCITypeElem **elem );
+/*
+ NAME: OCITypeParamByName - OCI Get a Parameter in a method By Name.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ mdo (IN) - pointer to the method descriptor in the object cache
+ name (IN) - the parameter's name
+ n_length (IN) - length (in bytes) of the 'name' parameter
+ elem (OUT) - If this function completes successfully, 'elem' points to
+ the selected parameter descriptor in the object cache.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) if 'mdo' is not null, it must point to a valid method descriptor
+ in the object cache.
+ DESCRIPTION:
+ Get a parameter given its name.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the required parameters is null.
+ 2) the method does not contain a parameter with the input 'name'.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*------------------------ OCITypeParamPos ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeParamPos( OCIEnv *env, OCIError *err,
+ CONST OCITypeMethod *mdo,
+ CONST oratext *name, ub4 n_length, ub4 *position,
+ OCITypeElem **elem );
+/*
+ NAME: OCITypeParamPos - OCI Get a parameter's position in a method
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ mdo (IN) - pointer to the method descriptor in the object cache
+ name (IN) - the parameter's name
+ n_length (IN) - length (in bytes) of the 'name' parameter
+ position (OUT) - If this function completes successfully, 'position'
+ points to the position of the parameter in the method starting
+ at position 1. position MUST point to space for a ub4.
+ elem (OUT) - If this function completes successfully, and
+ the input 'elem' is not NULL, 'elem' points to the selected
+ parameter descriptor in the object cache.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) if 'mdo' is not null, it must point to a valid method descriptor
+ in the object cache.
+ DESCRIPTION:
+ Get the position of a parameter in a method. Positions start at 1.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the parameters is null.
+ 2) the method does not contain a parameter with the input 'name'.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*------------------------ OCITypeParamElemMode -----------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeParamMode OCITypeElemParamMode( OCIEnv *env, OCIError *err,
+ CONST OCITypeElem *elem );
+/*
+ NAME: OCITypeElemParamMode - OCI Get a parameter's mode
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the parameter descriptor in the object cache
+ (represented by an OCITypeElem)
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the mode (in, out, or in/out) of the parameter.
+ RETURNS:
+ the mode (in, out, or in/out) of the parameter
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+/*------------------------- OCITypeElemDefaultValue -------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeElemDefaultValue( OCIEnv *env, OCIError *err,
+ CONST OCITypeElem *elem,
+ ub4 *d_v_length );
+/*
+ NAME: OCITypeElemDefaultValue - OCI Get the element's Default Value.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ elem (IN) - pointer to the parameter descriptor in the object cache
+ (represented by an OCITypeElem)
+ d_v_length (OUT) - length (in bytes) of the returned default value.
+ The caller must allocate space for the ub4 before calling this
+ routine.
+ REQUIRES:
+ 1) All type accessors require that the type be pinned before calling
+ any accessor.
+ 2) All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Get the default value in text form (PL/SQL) of an element. For V8.0,
+ this only makes sense for a method parameter.
+ RETURNS:
+ The default value (text) of the parameter.
+ NOTES:
+ The type must be unpinned when the accessed information is no
+ longer needed.
+ */
+
+
+/*--------------------------------------------------------------------------*/
+/* TYPE VERSION TABLE */
+/*--------------------------------------------------------------------------*/
+
+/* For V8.0, the type version table is meant to be an internal data structure
+ only for Oracle clients for type version maintanence purposes. A more
+ general version of the API may be made public in subsequent releases. */
+
+
+/*--------------------------- OCITypeVTInit --------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeVTInit( OCIEnv *env, OCIError *err );
+/*
+ NAME: OCITypeVTInit - OCI type Version table INItialize
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ REQUIRES:
+ none
+ DESCRIPTION:
+ Allocate space for and initialize the type version table and the type
+ version table's index.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if internal errors occurrs during initialization.
+ */
+
+/*--------------------------- OCITypeVTInsert -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeVTInsert( OCIEnv *env, OCIError *err,
+ CONST oratext *schema_name, ub4 s_n_length,
+ CONST oratext *type_name, ub4 t_n_length,
+ CONST oratext *user_version, ub4 u_v_length );
+/*
+ NAME: OCITypeVTInsert - OCI type Version table INSert entry.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ schema_name (IN, optional) - name of schema associated with the
+ type. By default, the user's schema name is used.
+ s_n_length (IN) - length of the 'schema_name' parameter
+ type_name (IN) - type name to insert
+ t_n_length (IN) - length (in bytes) of the 'type_name' parameter
+ user_version (IN) - user readable version of the type
+ u_v_length (IN) - length (in bytes) of the 'user_version' parameter
+ REQUIRES:
+ none
+ DESCRIPTION:
+ Insert an entry into the type version table and the type version
+ table's index. The entry's type name and user readable version
+ fields are updated with the input values. All other fields are
+ initialized to null.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the parameters is invalid.
+ 2) an entry for 'type_name' has already been registered in the
+ type version table.
+ */
+
+/*------------------------------ OCITypeVTSelect ----------------------------*/
+
+/* OCITypeVTSelect - OCI type VERSion table SELECT entry */
+/* ** OBSOLETE ** */
+sword OCITypeVTSelect( OCIEnv *env, OCIError *err,
+ CONST oratext *schema_name, ub4 s_n_length,
+ CONST oratext *type_name, ub4 t_n_length,
+ oratext **user_version, ub4 *u_v_length,
+ ub2 *version );
+/*
+ NAME: OCITypeVTSelect - OCI type Version table SELect entry.
+ PARAMETERS:
+ env (IN/OUT) - OCI environment handle initialized in object mode
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ schema_name (IN, optional) - name of schema associated with the
+ type. By default, the user's schema name is used.
+ s_n_length (IN) - length of the 'schema_name' parameter
+ type_name (IN) - type name to select
+ t_n_length (IN) - length (in bytes) of the 'type_name' parameter
+ user_version (OUT, optional) - pointer to user readable version of the
+ type
+ u_v_length (OUT, optional) - length (in bytes) of the 'user_version'
+ parameter
+ version (OUT, optional) - internal type version
+ REQUIRES:
+ All input parameters must not be NULL and must be valid.
+ DESCRIPTION:
+ Select an entry in the type version table by name.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'env' or 'err' is null.
+ OCI_ERROR if
+ 1) any of the parameters is invalid.
+ 2) an entry with 'type_name' does not exist.
+ */
+
+/* Compatibility function - following function prototype retained for
+ compatibility only */
+sword ortgcty( OCIEnv *env, OCIError *err, OCIType *coll_tdo,
+ OCIType **collelem_tdo );
+
+/*---------------------------------------------------------------------------*/
+/* Transient Type Construction functions */
+/*---------------------------------------------------------------------------*/
+
+sword OCITypeBeginCreate(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+ OCIDuration dur, OCIType **type);
+/*
+ NAME: OCITypeBeginCreate - OCI Type Begin Creation of a transient type.
+ REMARKS
+ Begins the construction process for a transient type. The type will be
+ anonymous (no name). To create a persistent named type, the CREATE TYPE
+ statement should be used from SQL. Transient types have no identity.
+ They are pure values.
+ PARAMETERS:
+ svchp (IN) - The OCI Service Context.
+ errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+ recorded in errhp and this function returns
+ OCI_ERROR. Diagnostic information can be obtained by
+ calling OCIErrorGet().
+ tc - The TypeCode for the type. The Typecode could
+ correspond to a User Defined Type or a Built-in type.
+ Currently, the permissible values for User Defined
+ Types are OCI_TYPECODE_OBJECT for an Object Type
+ (structured), OCI_TYPECODE_VARRAY for a VARRAY
+ collection type or OCI_TYPECODE_TABLE for a nested
+ table collection type. For Object types,
+ OCITypeAddAttr() needs to be called to add each of
+ the attribute types. For Collection types,
+ OCITypeSetCollection() needs to be called.
+ Subsequently, OCITypeEndCreate() needs to be called
+ to finish the creation process.
+ The permissible values for Built-in type codes are
+ specified in the user manual. Additional information
+ on built-ins if any (like precision, scale for
+ numbers, character set info for VARCHAR2s etc.) must
+ be set with a subsequent call to OCITypeSetBuiltin().
+ Subsequently OCITypeEndCreate() needs to be called
+ to finish the creation process.
+ dur - The allocation duration for the Type. Could be a
+ predefined or a user defined duration.
+ type(OUT) - The OCIType (Type Descriptor) that is being
+ constructed.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_ERROR on error.
+*/
+
+
+sword OCITypeSetCollection(OCISvcCtx *svchp, OCIError *errhp, OCIType *type,
+ OCIParam *collelem_info, ub4 coll_count);
+/*
+ NAME: OCITypeSetCollection - OCI Type Set Collection information
+ REMARKS :
+ Set Collection type information. This call can be called only if the
+ OCIType has been constructed with a collection typecode.
+ PARAMETERS:
+ svchp (IN) - The OCI Service Context.
+ errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+ recorded in errhp and this function returns
+ OCI_ERROR. Diagnostic information can be obtained by
+ calling OCIErrorGet().
+ type(IN OUT) - The OCIType (Type Descriptor) that is being
+ constructed.
+ collelem_info - collelem_info provides information on the collection
+ element. It is obtained by allocating an OCIParam
+ (parameter handle) and setting type information in
+ the OCIParam using OCIAttrSet() calls.
+ coll_count - The count of elements in the collection. Pass 0 for
+ a nested table (unbounded).
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_ERROR on error.
+*/
+
+sword OCITypeSetBuiltin(OCISvcCtx *svchp, OCIError *errhp, OCIType *type,
+ OCIParam *builtin_info);
+/*
+ NAME: OCITypeSetBuiltin - OCI Type Set Builtin information.
+ REMARKS:
+ Set Built-in type information. This call can be called only if the
+ OCIType has been constructed with a built-in typecode
+ (OCI_TYPECODE_NUMBER etc.).
+ PARAMETERS:
+ svchp (IN) - The OCI Service Context.
+ errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+ recorded in errhp and this function returns
+ OCI_ERROR. Diagnostic information can be obtained by
+ calling OCIErrorGet().
+ type(IN OUT) - The OCIType (Type Descriptor) that is being
+ constructed.
+ builtin_info - builtin_info provides information on the built-in
+ (like precision, scale, charater set etc.). It is
+ obtained by allocating an OCIParam (parameter handle)
+ and setting type information in the OCIParam using
+ OCIAttrSet() calls.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_ERROR on error.
+*/
+
+sword OCITypeAddAttr(OCISvcCtx *svchp, OCIError *errhp, OCIType *type,
+ CONST oratext *a_name, ub4 a_length,
+ OCIParam *attr_info);
+/*
+ NAME: OCITypeAddAttr - OCI Type Add Attribute to an Object Type.
+ REMARKS:
+ Adds an attribute to an Object type (that was constructed earlier with
+ typecode OCI_TYPECODE_OBJECT).
+ PARAMETERS:
+ svchp (IN) - The OCI Service Context
+ errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+ recorded in errhp and this function returns
+ OCI_ERROR. Diagnostic information can be obtained by
+ calling OCIErrorGet().
+ type (IN/OUT) - The Type description that is being constructed.
+ a_name(IN) - Optional. gives the name of the attribute.
+ a_length - Optional. gives length of attribute name.
+ attr_info - Information on the attribute. It is obtained by
+ allocating an OCIParam (parameter handle) and setting
+ type information in the OCIParam using OCIAttrSet()
+ calls.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_ERROR on error.
+*/
+
+sword OCITypeEndCreate(OCISvcCtx *svchp, OCIError *errhp, OCIType *type);
+/*
+ NAME: OCITypeEndCreate - OCI Type End Creation
+ REMARKS:
+ Finishes construction of a type description.Subsequently, only access
+ will be allowed.
+ PARAMETERS:
+ svchp (IN) - The OCI Service Context
+ errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+ recorded in errhp and this function returns
+ OCI_ERROR. Diagnostic information can be obtained by
+ calling OCIErrorGet().
+ type (IN/OUT) - The Type description that is being constructed.
+ RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_ERROR on error.
+*/
+
+/*=========================*/
+/* PUBLIC MACROS AND FLAGS */
+/*=========================*/
+
+/*--------------------------------------------------------------------------*/
+/* TYPE ELEMENT FLAGS */
+/*--------------------------------------------------------------------------*/
+
+#define OCI_TYPEELEM_REF 0x8000 /* element is a REF */
+#define OCI_TYPEPARAM_REQUIRED 0x0800 /* parameter is required */
+
+/* macros to test flags */
+#define OCI_TYPEELEM_IS_REF(elem_flag) \
+ (((elem_flag) & OCI_TYPEELEM_REF)!=0)
+#define OCI_TYPEPARAM_IS_REQUIRED(param_flag) \
+ (((param_flag) & OCI_TYPEPARAM_REQUIRED)!=0)
+
+
+#endif /* ORT_ORACLE */
+
diff --git a/src/terralib/drivers/OracleSpatial/TeOracleSpatial.cpp b/src/terralib/drivers/OracleSpatial/TeOracleSpatial.cpp
new file mode 100644
index 0000000..95938a9
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/TeOracleSpatial.cpp
@@ -0,0 +1,6810 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeOracleSpatial.h"
+
+#include <zlib.h>
+#include <jpeg.h>
+#include <sys/stat.h>
+#include "TeSpatialOperations.h"
+#include "TeGeometryAlgorithms.h"
+
+
+#define MAX(a,b) a>b?a:b
+#define MIN(a,b) a<b?a:b
+
+string
+getOracleSpatialRelation(int relation)
+{
+ string spatialRel="";
+ switch (relation)
+ {
+ case TeDISJOINT:
+ case TeINTERSECTS:
+ spatialRel = "ANYINTERACT";
+ break;
+
+ case TeTOUCHES:
+ spatialRel = "TOUCH";
+ break;
+
+ case TeOVERLAPS:
+ spatialRel = "OVERLAPBDYINTERSECT";
+ break;
+
+ case TeCOVERS:
+ spatialRel = "COVERS";
+ break;
+
+ case TeCOVEREDBY:
+ spatialRel = "COVEREDBY";
+ break;
+
+ case TeCONTAINS:
+ spatialRel = "CONTAINS";
+ break;
+
+ case TeWITHIN:
+ spatialRel = "INSIDE";
+ break;
+
+ case TeEQUALS:
+ spatialRel = "EQUAL";
+ break;
+
+ case TeCROSSES:
+ spatialRel = "OVERLAPBDYDISJOINT";
+ break;
+ default:
+ spatialRel = "";
+ break;
+ }
+
+ return spatialRel;
+}
+
+
+TeOracleSpatial::TeOracleSpatial()
+{
+ Conn = new OCIConnection();
+ dbmsName_ = "OracleSpatial";
+}
+
+
+TeOracleSpatial::~TeOracleSpatial()
+{
+ delete (Conn); //disconnect
+ Conn = NULL;
+}
+
+void
+TeOracleSpatial::close ()
+{
+ clear();
+ Conn->Disconnect();
+ isConnected_ = false;
+}
+
+
+bool
+TeOracleSpatial::connect(const string& host, const string& user, const string& password, const string& database, int port)
+{
+ if (Conn->IsConnected())
+ {
+ delete (Conn);
+ Conn = new OCIConnection();
+ }
+
+ isConnected_ = false;
+ if (Conn->Connect(host.c_str(),user.c_str(),password.c_str()))
+ {
+ isConnected_ = true;
+ host_ = host;
+ user_ = user;
+ password_ = password;
+ database_ = database;
+ portNumber_ = port;
+ return true;
+ }
+ else
+ {
+ isConnected_ = false;
+ errorMessage_ = "Error connecting to database server!";
+ delete (Conn); //disconect
+ return false;
+ }
+}
+
+
+bool
+TeOracleSpatial::tableExist(const string& table)
+{
+ bool status;
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string exist = " SELECT table_name FROM all_tables WHERE";
+ exist += " TABLE_NAME = '" + TeConvertToUpperCase(table) + "'";
+ exist += " AND OWNER = '" + TeConvertToUpperCase(user_) + "'";
+
+ if(!ocip->query(exist))
+ {
+ delete ocip;
+ return false;
+ }
+
+ if(ocip->fetchRow())
+ status = true;
+ else
+ status = false;
+
+ delete ocip;
+ return (status);
+}
+
+
+bool
+TeOracleSpatial::columnExist(const string& table, const string& column, TeAttribute& attr)
+{
+ bool status = false;
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string exist = " SELECT DATA_TYPE, DATA_LENGTH, DATA_SCALE FROM ALL_TAB_COLUMNS WHERE";
+ exist += " TABLE_NAME = '" + TeConvertToUpperCase(table) + "'";
+ exist += " AND COLUMN_NAME = '" + TeConvertToUpperCase(column) + "'";
+ exist += " AND OWNER = '" + TeConvertToUpperCase(user_) + "'";
+
+ if(!ocip->query(exist))
+ {
+ delete ocip;
+ return false;
+ }
+
+ if(ocip->fetchRow())
+ {
+ attr.rep_.name_ = column;
+
+ string dataType = string(ocip->getData(0));
+ int dataLength = atoi(ocip->getData(1));
+ int dataScale = atoi(ocip->getData(2));
+ bool number = false;
+
+ if(dataType=="VARCHAR2")
+ {
+ attr.rep_.type_ = TeSTRING;
+ attr.rep_.numChar_ = dataLength;
+ }
+ else if (dataType=="BLOB")
+ {
+ attr.rep_.type_ = TeBLOB;
+ attr.rep_.numChar_ = dataLength;
+ }
+ else if (dataType=="NUMBER")
+ {
+ number = true;
+ }
+ else if (dataType=="SDO_GEOMETRY")
+ {
+ attr.rep_.type_ = TeOBJECT;
+ attr.rep_.numChar_ = dataLength;
+ }
+ else if (dataType== "CHAR")
+ {
+ attr.rep_.type_ = TeCHARACTER;
+ attr.rep_.numChar_ = dataLength;
+ }
+ else if (dataType=="DATE")
+ {
+ attr.rep_.type_ = TeDATETIME;
+ }
+ else
+ {
+ attr.rep_.type_ = TeSTRING;
+ attr.rep_.numChar_ = dataLength;
+ }
+
+ if(number)
+ {
+ if(dataScale > 0)
+ attr.rep_.type_ = TeREAL;
+ else
+ attr.rep_.type_ = TeINT;
+ }
+ status = true;
+ }
+
+ delete ocip;
+ return (status);
+}
+
+bool
+TeOracleSpatial::execute (const string &q)
+{
+ bool result = Conn->Execute(q);
+
+ if(!result)
+ errorMessage_ = Conn->getErrorMessage();
+
+ return result;
+}
+
+
+bool
+TeOracleSpatial::createTable(const string& table, TeAttributeList &attr)
+{
+ short cont=0;
+ string pkeys ="";
+ bool hasAutoNumber=false;
+ string fieldName="";
+
+ if(tableExist(table))
+ {
+ errorMessage_= "Table already exist!";
+ return false;
+ }
+
+ TeAttributeList::iterator it = attr.begin();
+ string tablec;
+ tablec = "CREATE TABLE " + table +" (";
+
+ while ( it != attr.end())
+ {
+ if (cont)
+ tablec += ", ";
+
+ switch ((*it).rep_.type_)
+ {
+ case TeSTRING:
+ tablec += (*it).rep_.name_ + " VARCHAR2(" + Te2String((*it).rep_.numChar_) + ")";
+ break;
+
+ case TeREAL:
+ if((*it).rep_.decimals_>0)
+ tablec += (*it).rep_.name_ +" NUMBER(*,"+ Te2String((*it).rep_.decimals_) +") ";
+ else
+ tablec += (*it).rep_.name_ +" NUMBER(*,38) ";
+ break;
+
+ case TeINT:
+ tablec += (*it).rep_.name_ + " NUMBER(32) ";
+ if((*it).rep_.isAutoNumber_)
+ {
+ hasAutoNumber=true;
+ fieldName=(*it).rep_.name_;
+ }
+ break;
+
+ case TeDATETIME:
+ tablec += (*it).rep_.name_ + " DATE ";
+ break;
+
+ case TeCHARACTER:
+ tablec += (*it).rep_.name_ + " CHAR ";
+ break;
+
+ case TeBLOB:
+ tablec += (*it).rep_.name_ + " BLOB ";
+ break;
+
+ default:
+ tablec += (*it).rep_.name_ + " VARCHAR2(255) ";
+ break;
+ }
+
+ // check if column is part of primary key
+ if ((*it).rep_.isPrimaryKey_ && (*it).rep_.type_ != TeBLOB )
+ {
+ if (!pkeys.empty())
+ pkeys += ", ";
+ pkeys += (*it).rep_.name_;
+ tablec += " NOT NULL";
+ }
+
+ ++it;
+ cont++;
+ }
+
+ if(!pkeys.empty())
+ tablec += ", PRIMARY KEY (" + pkeys + ") ";
+
+ tablec += ")";
+
+ if(!execute(tablec))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error creating table " + table;
+
+ return false;
+ }
+
+ if(hasAutoNumber)
+ {
+ string dropSql = " DROP TRIGGER "+ getNameTrigger(table);
+ execute(dropSql);
+ dropSql = " DROP SEQUENCE "+ getNameSequence(table);
+ execute(dropSql);
+
+ if(!createSequence(table))
+ {
+ deleteTable(table);
+ return false;
+ }
+
+ if(!createAutoIncrementTrigger(table,fieldName))
+ {
+ deleteTable(table);
+ string sql= "DROP SEQUENCE "+ getNameSequence(table);
+ execute(sql);
+ return false;
+ }
+ }
+ return true;
+}
+
+
+TeDatabasePortal*
+TeOracleSpatial::getPortal ()
+{
+ TeOracleSpatialPortal* ocip = new TeOracleSpatialPortal (this);
+ return ocip;
+}
+
+
+bool
+TeOracleSpatial::addColumn (const string& table, TeAttributeRep &rep)
+{
+ if(!tableExist(table))
+ return false;
+
+ string field = TeGetExtension(rep.name_.c_str());
+ if(field.empty())
+ field = rep.name_;
+
+ string tab;
+ tab = " ALTER TABLE " + table + " ADD ( ";
+ tab += field + " ";
+
+ switch (rep.type_)
+ {
+ case TeSTRING:
+ tab += "VARCHAR2(" + Te2String(rep.numChar_) + ") ";
+ break;
+
+ case TeREAL:
+ tab += "NUMBER(*,38)";
+ break;
+
+ case TeINT:
+ tab += "NUMBER(32)";
+ break;
+
+ case TeDATETIME:
+ tab += "DATE";
+
+ case TeCHARACTER:
+ tab += "CHAR";
+
+ case TeBLOB:
+ tab += "BLOB";
+
+ default:
+ tab += "VARCHAR2(" + Te2String(rep.numChar_) + ") ";
+ break;
+ }
+
+ tab += " ) ";
+
+ if(!Conn->Execute(tab))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting a column to table " + table + " !";
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeOracleSpatial::deleteTable (const string& table)
+{
+ int f = table.find ("te_collection", std::string::npos);
+
+ if( table=="te_theme" ||
+ table=="te_layer" ||
+ table=="te_representation" ||
+ table=="te_tables_relation" ||
+ table=="te_layer_table" ||
+ table=="te_color_scheme" ||
+ table=="te_raster_metadata" ||
+ table=="te_projection" ||
+ table=="te_view" ||
+ table=="te_chart_params" ||
+ table=="te_legend" ||
+ table=="te_visual" ||
+ f == 0)
+ {
+ errorMessage_ = "N�o � poss�vel deletar tabelas do modelo!";
+ return false;
+ }
+
+ string del = "DROP TABLE " + table;
+ if(!execute(del))
+ return false;
+
+ string seq = "DROP SEQUENCE " + getNameSequence(table);
+ if(!execute(seq))
+ return false;
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createViewTable ()
+{
+ string table;
+ table = "CREATE TABLE te_view ( ";
+ table += "view_id ";
+ table += "NUMBER(32) NOT NULL";
+ table += ", projection_id ";
+ table += "NUMBER(32) NOT NULL";
+ table += " CONSTRAINT view_proj UNIQUE ";
+ table += ", name ";
+ table += "VARCHAR2(255) NOT NULL";
+ table += ", user_name ";
+ table += "VARCHAR2(255) ";
+ table += ", visibility ";
+ table += "NUMBER(32) ";
+
+ table += ", PRIMARY KEY(view_id))";
+
+ if(!execute(table))
+ {
+ errorMessage_ = "Error creating table te_view!";
+ return false;
+ }
+
+ //creates a sequence to table
+ if(!createSequence("te_view"))
+ {
+ errorMessage_ = "Error creating sequence to table te_view!";
+ return false;
+ }
+
+ //creates index
+ createIndex ("te_view", "view_index", "name, user_name");
+ return true;
+}
+
+bool
+TeOracleSpatial::createThemeTable ()
+{
+ string table;
+ table = "CREATE TABLE te_theme (";
+ table += "theme_id ";
+ table += "NUMBER(32) NOT NULL";
+ table += ", layer_id ";
+ table += "NUMBER(32) NULL";
+ table += ", view_id ";
+ table += "NUMBER(32) NULL";
+ table += ", name ";
+ table += "VARCHAR2(255) NOT NULL";
+ table += ", parent_id ";
+ table += "NUMBER(32) ";
+ table += ", priority ";
+ table += "NUMBER(32) ";
+ table += ", node_type ";
+ table += "NUMBER(32) NOT NULL";
+
+ table += ", min_scale ";
+ table += "NUMBER(*,38)";
+ table += ", max_scale ";
+ table += "NUMBER(*,38)";
+
+ table += ", generate_attribute_where ";
+ table += "VARCHAR2(500)";
+ table += ", generate_spatial_where ";
+ table += "VARCHAR2(500)";
+ table += ", generate_temporal_where ";
+ table += "VARCHAR2(500)";
+
+ table += ", collection_table ";
+ table += "VARCHAR2(255)";
+
+ table += ", visible_rep ";
+ table += "NUMBER(32) NULL";
+ table += ", enable_visibility ";
+ table += "NUMBER(32) NULL";
+
+ table += ", PRIMARY KEY (theme_id))";
+
+ if(!execute(table))
+ {
+ errorMessage_ = "Error creating table te_theme!";
+ return false;
+ }
+
+ //creates a sequence to the tabela
+ if(!createSequence("te_theme"))
+ {
+ errorMessage_ = "Error creating sequence to table te_theme!";
+ return false;
+ }
+
+ //creates index
+ createIndex ("te_theme", "theme_view_index", "view_id");
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createGroupingTable()
+{
+ string table;
+ table = "CREATE TABLE te_grouping (";
+ table += "theme_id ";
+ table += "NUMBER(32) NOT NULL";
+ table += ", grouping_number ";
+ table += "NUMBER(32)";
+ table += ", grouping_attr ";
+ table += "VARCHAR2(255)";
+ table += ", grouping_attr_type ";
+ table += "NUMBER(32)";
+ table += ", grouping_mode ";
+ table += "NUMBER(32)";
+ table += ", grouping_norm_attr ";
+ table += "VARCHAR2(255)";
+ table += ", grouping_std_dev ";
+ table += "NUMBER(*,38) DEFAULT 0.0";
+ table += ", grouping_precision ";
+ table += "NUMBER(32)";
+ table += ", grouping_function ";
+ table += "VARCHAR2(20)";
+ table += ", PRIMARY KEY (theme_id))";
+
+ if(!execute(table))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error creating table te_grouping!";
+ return false;
+ }
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createThemeTablesTable()
+{
+ string table = "CREATE TABLE te_theme_table (";
+ table += " theme_table_id ";
+ table += " NUMBER(32) NOT NULL";
+ table += ", theme_id ";
+ table += " NUMBER(32) NOT NULL ";
+ table += ", table_id ";
+ table += " NUMBER(32) NOT NULL ";
+ table += ", relation_id ";
+ table += " NUMBER(32)";
+ table += ", table_order ";
+ table += " NUMBER(32) ";
+ table += ", PRIMARY KEY (theme_table_id) ";
+ table += ")";
+
+ if(!execute(table))
+ {
+ errorMessage_ = "Error creating table te_theme_table!";
+ return false;
+ }
+
+ //creates a sequence to the tabela
+ if(!createSequence("te_theme_table"))
+ {
+ errorMessage_ = "Error creating sequence to table te_theme_table!";
+ return false;
+ }
+
+ //creates index
+ createIndex ("te_theme_table", "theme_table_index", "theme_id");
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createLayerTable()
+{
+ string table;
+ table = "CREATE TABLE te_layer (";
+ table += "layer_id ";
+ table += "NUMBER(32) NOT NULL ";
+ table += ", projection_id ";
+ table += "NUMBER(32) NOT NULL ";
+ table += "CONSTRAINT layer_proj UNIQUE ";
+ table += ", name ";
+ table += "VARCHAR2(255) NOT NULL ";
+ table += ", lower_x ";
+ table += "NUMBER(*,38)";
+ table += ", lower_y ";
+ table += "NUMBER(*,38)";
+ table += ", upper_x ";
+ table += "NUMBER(*,38) ";
+ table += ", upper_y ";
+ table += "NUMBER(*,38) ";
+ table += ", initial_time ";
+ table += "DATE ";
+ table += ", final_time ";
+ table += "DATE ";
+
+ table += ", PRIMARY KEY (layer_id))";
+
+ if(!execute(table))
+ {
+ errorMessage_ = "Error creating table te_layer!";
+ return false;
+ }
+
+ //creates a sequence to table
+ if(!createSequence("te_layer"))
+ {
+ errorMessage_ = "Error creating sequence to table te_layer!";
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createLayerTableTable()
+{
+ string table;
+ table = "CREATE TABLE te_layer_table (";
+ table += "table_id ";
+ table += " NUMBER(32) NOT NULL ";
+ table += ", layer_id ";
+ table += "NUMBER(32) ";
+ table += ", attr_table ";
+ table += "VARCHAR2(255) NOT NULL ";
+ table += ", unique_id ";
+ table += "VARCHAR2(255) ";
+ table += ", attr_link ";
+ table += "VARCHAR2(255) ";
+ table += ", attr_initial_time ";
+ table += "VARCHAR2(255) ";
+ table += ", attr_final_time ";
+ table += "VARCHAR2(255) ";
+ table += ", attr_time_unit ";
+ table += "NUMBER(32) ";
+ table += ", attr_table_type ";
+ table += "NUMBER(32) ";
+ table += ", user_name ";
+ table += "VARCHAR2(255) ";
+ table += ", initial_time ";
+ table += "DATE ";
+ table += ", final_time ";
+ table += "DATE ";
+
+ table += ", PRIMARY KEY (table_id))";
+
+ if(!execute(table))
+ {
+ errorMessage_ = "Error creating table te_layer_table!";
+ return false;
+ }
+
+ //creates a sequence to table
+ if(!createSequence("te_layer_table"))
+ {
+ errorMessage_ = "Error creating sequence to table te_layer_table!";
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createTablesRelationTable()
+{
+ string table;
+ table = "CREATE TABLE te_tables_relation (";
+ table += "relation_id ";
+ table += "NUMBER(32) NOT NULL ";
+ table += ", related_table_id ";
+ table += "NUMBER(32) NOT NULL ";
+ table += ", related_attr ";
+ table += "VARCHAR2(255) NOT NULL";
+ table += ", external_table_name ";
+ table += "VARCHAR2(255) NOT NULL";
+ table += ", external_attr ";
+ table += "VARCHAR2(255) NOT NULL ";
+
+ table += ", PRIMARY KEY (relation_id))";
+
+ if(!execute(table))
+ {
+ errorMessage_ = "Error creating table te_tables_relation!";
+ return false;
+ }
+
+ //creates a sequence to table
+ if(!createSequence("te_tables_relation"))
+ {
+ errorMessage_ = "Error creating sequence to table te_tables_relation!";
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createRepresentationTable ()
+{
+ string table;
+ table = "CREATE TABLE te_representation (";
+ table += " repres_id ";
+ table += " NUMBER(32) NOT NULL ";
+ table += ", layer_id ";
+ table += "NUMBER(32) NOT NULL";
+ table += ", geom_type ";
+ table += "NUMBER(32) NOT NULL";
+ table += ", geom_table ";
+ table += "VARCHAR2(255) ";
+ table += ", description ";
+ table += "VARCHAR2(255) ";
+ table += ", lower_x ";
+ table += "NUMBER(*,38) ";
+ table += ", lower_y ";
+ table += "NUMBER(*,38) ";
+ table += ", upper_x ";
+ table += "NUMBER(*,38) ";
+ table += ", upper_y ";
+ table += "NUMBER(*,38) ";
+ table += ", res_x ";
+ table += "NUMBER(*,38) ";
+ table += ", res_y ";
+ table += "NUMBER(*,38) ";
+ table += ", num_cols ";
+ table += "NUMBER(32)";
+ table += ", num_rows ";
+ table += "NUMBER(32)";
+ table += ", initial_time ";
+ table += "DATE";
+ table += ", final_time ";
+ table += "DATE";
+
+ table += ", PRIMARY KEY (repres_id))";
+
+ if(!execute(table))
+ {
+ errorMessage_ = "Error creating table te_representation!";
+ return false;
+ }
+ //creates a sequence to table
+ if(!createSequence("te_representation"))
+ {
+ errorMessage_ = "Error creating sequence to table te_representation!";
+ return false;
+ }
+
+ //creates index
+ createIndex ("te_representation", "representation_index", "layer_id, geom_type");
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createLegendTable ()
+{
+ string table;
+ table = "CREATE TABLE te_legend (";
+ table += " legend_id ";
+ table += "NUMBER(32) NOT NULL";
+ table += ", theme_id ";
+ table += "NUMBER(32) NOT NULL";
+ table += ", group_id ";
+ table += "NUMBER(32)";
+ table += ", num_objs ";
+ table += "NUMBER(32)";
+ table += ", lower_value ";
+ table += "VARCHAR2(255)";
+ table += ", upper_value ";
+ table += "VARCHAR2(255)";
+ table += ", label ";
+ table += "VARCHAR2(255)";
+
+ table += ", PRIMARY KEY (legend_id))";
+
+ if(!execute(table))
+ {
+ errorMessage_ = "Error creating table te_legend!";
+ return false;
+ }
+
+ //creates a sequence to the table
+ if(!createSequence("te_legend"))
+ {
+ errorMessage_ = "Error creating sequence to table te_legend!";
+ return false;
+ }
+
+ //creates index
+ createIndex ("te_legend", "legend_index", "theme_id");
+ return true;
+}
+
+
+
+bool
+TeOracleSpatial::createVisualTable()
+{
+ string table;
+ table = "CREATE TABLE te_visual (";
+ table += " legend_id ";
+ table += "NUMBER(32) NOT NULL";
+ table += ", geom_type ";
+ table += "NUMBER(32) NOT NULL";
+
+ table += ", lib_name ";
+ table += "VARCHAR2(255) ";
+ table += ", symb_id ";
+ table += "NUMBER(32) ";
+ table += ", red ";
+ table += "NUMBER(32) ";
+ table += ", green ";
+ table += "NUMBER(32) ";
+ table += ", blue ";
+ table += "NUMBER(32) ";
+ table += ", transparency ";
+ table += "NUMBER(32) ";
+ table += ", width ";
+ table += "NUMBER(32) ";
+
+ table += ", contour_lib_name ";
+ table += "VARCHAR2(255) ";
+ table += ", contour_symb_id ";
+ table += "NUMBER(32) ";
+ table += ", contour_red ";
+ table += "NUMBER(32) ";
+ table += ", contour_green ";
+ table += "NUMBER(32) ";
+ table += ", contour_blue ";
+ table += "NUMBER(32) ";
+ table += ", contour_transp ";
+ table += "NUMBER(32) ";
+ table += ", contour_width ";
+ table += "NUMBER(32) ";
+
+ table += ", size_value ";
+ table += "NUMBER(32) ";
+ table += ", pt_angle ";
+ table += "NUMBER(32) ";
+
+ table += ", family ";
+ table += "VARCHAR2(100)";
+ table += ", bold ";
+ table += "NUMBER(32) ";
+ table += ", italic ";
+ table += "NUMBER(32) ";
+ table += ", alignment_vert ";
+ table += "NUMBER(*,38)";
+ table += ", alignment_horiz ";
+ table += "NUMBER(*,38)";
+ table += ", tab_size ";
+ table += "NUMBER(32) ";
+ table += ", line_space ";
+ table += "NUMBER(32) ";
+ table += ", fixed_size ";
+ table += "NUMBER(32) ";
+
+ table += ", PRIMARY KEY (legend_id, geom_type))";
+
+ if(!execute(table))
+ {
+ errorMessage_ = "Error creating table te_visual!";
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeOracleSpatial::createVisualRasterTable()
+{
+ string create = "CREATE TABLE te_visual_raster (";
+ create += " theme_id NUMBER(32) NOT NULL,";
+ create += " band_in NUMBER(32) NOT NULL,";
+ create += " band_out NUMBER(32), ";
+ create += " transf_type NUMBER(32), ";
+ create += " param1 FLOAT,";
+ create += " param2 FLOAT,";
+ create += " lut_table VARCHAR2(255), ";
+ create += " PRIMARY KEY (theme_id, band_in))";
+
+ if(!execute(create))
+ {
+ errorMessage_ = "Error creating table te_visual_raster!";
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeOracleSpatial::createDatabaseTable()
+{
+ string create = "CREATE TABLE te_database (";
+ create += "db_version VARCHAR(50) NOT NULL,";
+ create += "db_creation DATE,";
+ create += "PRIMARY KEY (db_version))";
+ return (execute (create));
+}
+
+bool
+TeOracleSpatial::createProjectionTable ()
+{
+ string table;
+ table = "CREATE TABLE te_projection (";
+ table += "projection_id ";
+ table += "NUMBER(32) NOT NULL";
+ table += ", name ";
+ table += "VARCHAR2(255) NOT NULL";
+ table += ", long0 ";
+ table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+ table += ", lat0 ";
+ table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+ table += ", offx ";
+ table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+ table += ", offy ";
+ table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+ table += ", stlat1 ";
+ table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+ table += ", stlat2 ";
+ table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+ table += ", unit ";
+ table += "VARCHAR2(100) ";
+ table += ", scale ";
+ table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+ table += ", hemis ";
+ table += "NUMBER(32) ";
+ table += ", datum ";
+ table += "VARCHAR2(100) ";
+ table += ", radius ";
+ table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+ table += ", flattening ";
+ table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+ table += ", dx ";
+ table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+ table += ", dy ";
+ table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+ table += ", dz ";
+ table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+
+ table += ", PRIMARY KEY (projection_id))";
+
+ if(!execute(table))
+ {
+ errorMessage_ = "Error creating table te_projection!";
+ return false;
+ }
+
+ //creates a sequence to table
+ if(!createSequence("te_projection"))
+ {
+ errorMessage_ = "Error creating sequence to table te_projection!";
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeOracleSpatial::createRasterMetadataTable(const string& tableName)
+{
+ if(tableExist(tableName))
+ {
+ errorMessage_= "Table already exist!";
+ return false;
+ }
+
+ string table;
+ table = "CREATE TABLE "+ tableName +" (";
+ table += " geom_id ";
+ table += "NUMBER(32) NOT NULL";
+ table += ", band_id ";
+ table += "NUMBER(32) NOT NULL";
+ table += ", min_value ";
+ table += "NUMBER(*,38) DEFAULT 0.0 ";
+ table += ", max_value ";
+ table += "NUMBER(*,38) DEFAULT 0.0 ";
+ table += ", num_bits ";
+ table += "NUMBER(32)";
+ table += ", data_type ";
+ table += "NUMBER(32)";
+ table += ", photometric_type ";
+ table += "NUMBER(32)";
+ table += ", compression_type ";
+ table += "NUMBER(32)";
+ table += ", dummy ";
+ table += "NUMBER(*,38) DEFAULT 0.0";
+
+ table += ", PRIMARY KEY (geom_id, band_id))";
+
+ if(!execute(table))
+ {
+ errorMessage_ = "Error creating table "+ tableName +"!";
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createLUTTable(const string& table)
+{
+
+ if(tableExist(table))
+ {
+ errorMessage_= "Table already exist!";
+ return false;
+ }
+
+ string tab;
+ tab = "CREATE TABLE " + table + " ( ";
+ tab += "index_id ";
+ tab += "NUMBER(32) NOT NULL ";
+ tab += ", r_val ";
+ tab += "NUMBER(32) NOT NULL ";
+ tab += ", g_val ";
+ tab += "NUMBER(32) NOT NULL ";
+ tab += ", b_val ";
+ tab += "NUMBER(32) NOT NULL ";
+
+ tab += ", PRIMARY KEY (index_id))";
+
+ if(!execute(tab))
+ {
+ errorMessage_ = "Error creating table " + table ;
+ return false;
+ }
+
+ //creates a sequence to table
+ if(!createSequence(table))
+ {
+ deleteTable(table);
+ return false;
+ }
+
+ if(!createAutoIncrementTrigger(table,"index_id"))
+ {
+ deleteTable(table);
+ string sql= "DROP SEQUENCE "+ getNameSequence(table);
+ execute(sql);
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createCollectionTable(const string& tableName)
+{
+
+ if(tableExist(tableName))
+ {
+ errorMessage_= "Table already exist!";
+ return false;
+ }
+
+ string table = "CREATE TABLE "+ tableName +" (";
+ table += " c_object_id ";
+ table += "VARCHAR2(255) NOT NULL";
+ table += ", c_legend_id ";
+ table += "NUMBER(32) ";
+ table += ", label_x ";
+ table += "NUMBER(*,38) ";
+ table += ", label_y ";
+ table += "NUMBER(*,38) ";
+ table += ", c_legend_own ";
+ table += "NUMBER(32) ";
+ table += ", c_object_status ";
+ table += "NUMBER(32) ";
+
+ table += ", PRIMARY KEY (c_object_id))";
+
+ if(!execute(table))
+ {
+ errorMessage_ = "Error creating table " + tableName + "!";
+ return false;
+ }
+
+ createIndex (tableName, tableName+"_index_1", "c_legend_id");
+ createIndex (tableName, tableName+"_index_2", "c_legend_own");
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createCellGeometry (const string& table)
+{
+
+ if(tableExist(table))
+ {
+ errorMessage_= "Table already exist!";
+ return false;
+ }
+
+ string tab;
+ tab = "CREATE TABLE " + table + "(";
+ tab += "geom_id ";
+ tab += "NUMBER(32) NOT NULL";
+ tab += ", object_id ";
+ tab += "VARCHAR2(255) NULL";
+ tab += ", col_number ";
+ tab += "NUMBER(32) NOT NULL";
+ tab += ", row_number ";
+ tab += "NUMBER(32) NOT NULL";
+ tab += ", spatial_data ";
+ tab += "MDSYS.SDO_GEOMETRY";
+ tab += ", PRIMARY KEY (geom_id))";
+
+ if (!execute(tab))
+ {
+ errorMessage_ = "Error creating table " + table + " !" ;
+ return false;
+ }
+
+ //creates indexes
+ createIndex (table, table + "obj_idx", "object_id");
+ createIndex(table, table + "rc_idx", "row_number, col_number");
+
+ //creates a sequence to table
+ if(!createSequence(table))
+ {
+ deleteTable(table);
+ return false;
+ }
+
+ if(!createAutoIncrementTrigger(table,"geom_id"))
+ {
+ deleteTable(table);
+ string sql= "DROP SEQUENCE "+ getNameSequence(table);
+ execute(sql);
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createTextGeometry (const string& table)
+{
+
+ if(tableExist(table))
+ {
+ errorMessage_= "Table already exist!";
+ return false;
+ }
+
+ string tab;
+ tab = "CREATE TABLE " + table +"(";
+ tab += "geom_id ";
+ tab += "NUMBER(32) NOT NULL";
+ tab += ", object_id ";
+ tab += "VARCHAR2(255) ";
+ tab += ", x ";
+ tab += "NUMBER(*,38) NULL";
+ tab += ", y ";
+ tab += "NUMBER(*,38) NULL";
+ tab += ", text_value ";
+ tab += "VARCHAR2(255) NULL";
+ tab += ", angle ";
+ tab += "NUMBER(*,38) ";
+ tab += ", height ";
+ tab += "NUMBER(*,38) ";
+ tab += ", alignment_vert ";
+ tab += "NUMBER(*,38) ";
+ tab += ", alignment_horiz ";
+ tab += "NUMBER(*,38) ";
+
+ tab += ", PRIMARY KEY (geom_id))";
+
+ if(!execute(tab))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error creating table " + table + " !";
+ return false;
+ }
+
+ //creates indexes
+ createIndex(table, table + "obj_idx", "object_id");
+ createIndex(table, table + "xy_idx", "x,y");
+
+ //creates a sequence to table
+ if(!createSequence(table))
+ {
+ deleteTable(table);
+ return false;
+ }
+
+ if(!createAutoIncrementTrigger(table, "geom_id"))
+ {
+ deleteTable(table);
+ string sql= "DROP SEQUENCE "+ getNameSequence(table);
+ execute(sql);
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createArcGeometry (const string& table)
+{
+
+ if(tableExist(table))
+ {
+ errorMessage_= "Table already exist!";
+ return false;
+ }
+
+ string tab;
+ tab = "CREATE TABLE " + table +"(";
+ tab += "geom_id ";
+ tab += "NUMBER(32) NOT NULL";
+ tab += ", object_id ";
+ tab += "VARCHAR2(255) NULL";
+ tab += ", from_node ";
+ tab += "NUMBER(32) NOT NULL";
+ tab += ", to_node ";
+ tab += "NUMBER(32) NOT NULL";
+
+ tab += ", PRIMARY KEY (geom_id))";
+
+ if(!execute(tab))
+ {
+ errorMessage_ = "Error creating table " + table ;
+ return false;
+ }
+
+ //creates indexes
+ createIndex(table, table + "obj_idx", "object_id");
+ createIndex(table, table + "fn_idx", "from_node");
+ createIndex(table, table + "tn_idx", "to_node");
+
+ //creates a sequence to table
+ if(!createSequence(table))
+ {
+ deleteTable(table);
+ return false;
+ }
+
+ if(!createAutoIncrementTrigger(table,"geom_id"))
+ {
+ deleteTable(table);
+ string sql= "DROP SEQUENCE "+ getNameSequence(table);
+ execute(sql);
+ return false;
+ }
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createNodeGeometry (const string& table)
+{
+ if(tableExist(table))
+ {
+ errorMessage_= "Table already exist!";
+ return false;
+ }
+
+ string tab;
+ tab = "CREATE TABLE " + table + " (";
+ tab += "geom_id ";
+ tab += "NUMBER(32) NOT NULL ";
+ tab += ", object_id ";
+ tab += "VARCHAR2(255) NULL";
+ tab += ", spatial_data ";
+ tab += "MDSYS.SDO_GEOMETRY";
+ tab += ", PRIMARY KEY (geom_id))";
+
+ if(!execute(tab))
+ {
+ errorMessage_ = "Error creating table " + table + " !";
+ return false;
+ }
+
+ //creates indexes
+ createIndex(table, table + "obj_idx", "object_id");
+
+ ///creates a sequence to table
+ if(!createSequence(table))
+ {
+ deleteTable(table);
+ return false;
+ }
+
+ if(!createAutoIncrementTrigger(table,"geom_id"))
+ {
+ deleteTable(table);
+ string sql= "DROP SEQUENCE "+ getNameSequence(table);
+ execute(sql);
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createRasterGeometry (const string& table)
+{
+
+ if(tableExist(table))
+ {
+ errorMessage_= "Table already exist!";
+ return false;
+ }
+
+ string create = "CREATE TABLE " + table + " (";
+ create += "geom_id NUMBER(32) NOT NULL,";
+ create += "object_id VARCHAR2(255) NOT NULL,";
+ create += "raster_table VARCHAR2(255) NOT NULL,";
+ create += "lut_table VARCHAR2(255) ,";
+ create += "res_x NUMBER(*,38) DEFAULT 0.0,";
+ create += "res_y NUMBER(*,38) DEFAULT 0.0,";
+ create += "num_bands NUMBER(32),";
+ create += "num_cols NUMBER(32),";
+ create += "num_rows NUMBER(32),";
+ create += "block_height NUMBER(32),";
+ create += "block_width NUMBER(32),";
+ create += "lower_x NUMBER(*,38) DEFAULT 0.0,";
+ create += "lower_y NUMBER(*,38) DEFAULT 0.0,";
+ create += "upper_x NUMBER(*,38) DEFAULT 0.0,";
+ create += "upper_y NUMBER(*,38) DEFAULT 0.0,";
+ create += "tiling_type NUMBER(32),";
+ create += "PRIMARY KEY (geom_id))";
+
+ if(!execute (create))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error creating table " + table + " !" ;
+ return false;
+ }
+
+ createIndex(table, table + "obj_idx", "object_id");
+
+ if(!createSequence(table))
+ {
+ deleteTable(table);
+ return false;
+ }
+
+ if(!createAutoIncrementTrigger(table,"geom_id"))
+ {
+ deleteTable(table);
+ string sql= "DROP SEQUENCE "+ getNameSequence(table);
+ execute(sql);
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeOracleSpatial::createRasterTable (const string& tableName)
+{
+ string tab;
+ tab = "CREATE TABLE "+ tableName + " ( ";
+ tab += "block_id ";
+ tab += " VARCHAR2(50) NOT NULL";
+ tab += ", band_id ";
+ tab += "NUMBER(32) NOT NULL";
+ tab += ", resolution_factor ";
+ tab += "NUMBER(32) ";
+ tab += ", subband ";
+ tab += "NUMBER(32) ";
+ tab += ", block_box ";
+ tab += "MDSYS.SDO_GEOMETRY ";
+ tab += ", block_size ";
+ tab += "NUMBER(32) ";
+ tab += ", spatial_data ";
+ tab += "BLOB ";
+
+ tab += ", PRIMARY KEY (block_id))";
+
+ if(!execute(tab))
+ {
+ errorMessage_ = "Error creating table " + tableName ;
+ return false;
+ }
+
+ createIndex(tableName, tableName + "band_idx", "band_id");
+ createIndex(tableName, tableName + "sbnd_idx", "subband");
+ createIndex(tableName, tableName + "rf_idx", "resolution_factor");
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createPolygonGeometry (const string& table)
+{
+
+ if(tableExist(table))
+ {
+ errorMessage_= "Table already exist!";
+ return false;
+ }
+
+ string tab;
+ tab = "CREATE TABLE " + table + " ( ";
+ tab += "geom_id ";
+ tab += "NUMBER(32) NOT NULL ";
+ tab += ", object_id ";
+ tab += "VARCHAR2(255) NULL";
+ tab += ", spatial_data ";
+ tab += "MDSYS.SDO_GEOMETRY";
+
+ tab += ", PRIMARY KEY (geom_id))";
+
+ if(!execute(tab))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error creating table " + table ;
+ return false;
+ }
+
+ //creates indexes
+ createIndex(table, table + "obj_idx", "object_id");
+
+ //creates a sequence to table
+ if(!createSequence(table))
+ {
+ deleteTable(table);
+ return false;
+ }
+
+ //creates trigger
+ if(!createAutoIncrementTrigger(table, "geom_id"))
+ {
+ deleteTable(table);
+ string sql= "DROP SEQUENCE "+ getNameSequence(table);
+ execute(sql);
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createLineGeometry (const string& table)
+{
+
+ if(tableExist(table))
+ {
+ errorMessage_= "Table already exist!";
+ return false;
+ }
+
+ string tab;
+ tab = "CREATE TABLE " + table + " ( ";
+ tab += "geom_id ";
+ tab += "NUMBER(32) NOT NULL";
+ tab += ", object_id ";
+ tab += "VARCHAR2(255) NULL";
+ tab += ", spatial_data ";
+ tab += "MDSYS.SDO_GEOMETRY";
+
+ tab += ", PRIMARY KEY (geom_id))";
+
+ if(!execute(tab))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error creating table " + table + " !" ;
+ return false;
+ }
+
+ //creates indexes
+ createIndex(table, table + "obj_idx", "object_id");
+
+ //creates a sequence to table
+ if(!createSequence(table))
+ {
+ deleteTable(table);
+ return false;
+ }
+
+ //creates trigger
+ if(!createAutoIncrementTrigger(table, "geom_id"))
+ {
+ deleteTable(table);
+ string sql= "DROP SEQUENCE "+ getNameSequence(table);
+ execute(sql);
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createPointGeometry (const string& table)
+{
+
+ if(tableExist(table))
+ {
+ errorMessage_= "Table already exist!";
+ return false;
+ }
+
+ string tab;
+ tab = "CREATE TABLE " + table + " ( ";
+ tab += "geom_id ";
+ tab += "NUMBER(32) NOT NULL";
+ tab += ", object_id ";
+ tab += "VARCHAR2(255) NULL";
+ tab += ", spatial_data ";
+ tab += "MDSYS.SDO_GEOMETRY";
+
+ tab += ", PRIMARY KEY (geom_id))";
+
+ if(!execute(tab))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error creating table " + table + " !" ;
+ return false;
+ }
+
+ //creates indexes
+ createIndex(table, table + "obj_idx", "object_id");
+
+ //creates a sequence to table
+ if(!createSequence(table))
+ {
+ deleteTable(table);
+ return false;
+ }
+
+ if(!createAutoIncrementTrigger(table,"geom_id"))
+ {
+ deleteTable(table);
+ string sql= "DROP SEQUENCE "+ getNameSequence(table);
+ execute(sql);
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeOracleSpatial::insertRelationInfo(const int tableId, const string& tField,
+ const string& rName, const string& rField, int& relId)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ relId = -1;
+ string sel = "SELECT relation_id FROM te_tables_relation WHERE";
+ sel += " table_id = " + Te2String(tableId);
+ sel += " AND attr_link = '" + tField + "'";
+ sel += " AND related_table = '" + rName + "'";
+ sel += " AND related_link = '" + rField + "'";
+ if (!ocip->query(sel))
+ {
+ delete ocip;
+ return false;
+ }
+
+ if (ocip->fetchRow())
+ {
+ relId = atoi(ocip->getData(0));
+ delete ocip;
+ return true;
+ }
+
+ string seq, ins;
+ seq = getNameSequence("te_tables_relation");
+ ins = " INSERT INTO te_tables_relation ( ";
+ ins += " relation_id, attr_link, table_id, ";
+ ins += " related_table, related_link) VALUES ( ";
+ ins += seq +".NEXTVAL ";
+ ins += ", " + Te2String(tableId);
+ ins += ", '" + escapeSequence(tField) + "'";
+ ins += ", '" + escapeSequence(rName) + "'";
+ ins += ", '" + escapeSequence(rField) + "'";
+ ins += ")";
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting tables information!";
+ delete ocip;
+ return false;
+ }
+
+ ins = "SELECT "+ seq +".CURRVAL FROM DUAL";
+ if (!ocip->query(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence te_table_relation_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ relId = atoi((const char*)ocip->getData(0));
+ delete ocip;
+ return true;
+}
+
+bool
+TeOracleSpatial::insertTableInfo (int layerId, TeTable &table, const string& user)
+{
+ string ins, seq;
+
+ seq = getNameSequence("te_layer_table");
+ ins = "INSERT INTO te_layer_table ( ";
+ ins += " table_id, layer_id, attr_table, unique_id, attr_link, ";
+ ins += " attr_initial_time, attr_final_time, attr_time_unit, ";
+ ins += " attr_table_type, user_name) VALUES ( ";
+ ins += seq + ".NEXTVAL ";
+
+ if(layerId>0)
+ ins += ", " + Te2String(layerId);
+ else
+ ins += ", " + NULL;
+
+ ins += ", '" + escapeSequence(table.name()) + "'";
+ ins += ", '" + escapeSequence(table.uniqueName()) + "'";
+ ins += ", '" + escapeSequence(table.linkName()) + "'";
+ ins += ", '" + escapeSequence(table.attInitialTime()) + "'";
+ ins += ", '" + escapeSequence(table.attFinalTime()) + "'";
+ ins += ", " + Te2String(table.attTimeUnit());
+ ins += ", " + Te2String(table.tableType());
+ ins += ", '" + escapeSequence(user) + "'";
+ ins += ")";
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting tables information!";
+ return false;
+ }
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ ins = "SELECT "+ seq +".CURRVAL FROM DUAL";
+ if (!ocip->query(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence te_layer_table_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ table.setId(index);
+ delete ocip;
+ return true;
+}
+
+
+TeDBRelationType
+TeOracleSpatial::existRelation(const string& tableName, const string& relName)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return TeNoRelation;
+
+ string integ = " SELECT DELETE_RULE ";
+ integ += " FROM all_constraints ";
+ integ += " WHERE CONSTRAINT_TYPE = 'R'";
+ integ += " AND OWNER = '" + TeConvertToUpperCase(user_) + "'";
+ integ += " AND CONSTRAINT_NAME = '" + TeConvertToUpperCase(relName) + "'";
+
+ string temp = " AND TABLE_NAME = '" + TeConvertToUpperCase(tableName) + "' ";
+ integ += temp;
+
+ if(!ocip->query(integ))
+ {
+ delete ocip;
+ return TeNoRelation;
+ }
+
+ string cascade;
+ if(ocip->fetchRow())
+ {
+ cascade = string(ocip->getData(0));
+ if(cascade== "CASCADE")
+ {
+ delete ocip;
+ return TeRICascadeDeletion;
+ }
+
+ delete ocip;
+ return TeRINoCascadeDeletion;
+ }
+
+ delete ocip;
+ return TeNoRelation;
+}
+
+
+bool
+TeOracleSpatial::createRelation (const string& name, const string& table, const string& fieldName, const string& relatedTable, const string& relatedField, bool cascadeDeletion)
+{
+ string relation = "ALTER TABLE " + table + " ADD ";
+ relation += " CONSTRAINT " + name;
+ relation += " FOREIGN KEY ( " + fieldName + ") ";
+ relation += " REFERENCES " + relatedTable + "(" + relatedField + ")";
+
+ if (cascadeDeletion)
+ relation += " ON DELETE CASCADE ";
+
+ if(!execute(relation))
+ return false;
+
+ return true;
+}
+
+string
+TeOracleSpatial::getSQLBoxWhere (TeBox &box, TeGeomRep rep)
+{
+ string wherebox;
+ string colname = "spatial_data";
+
+ if(rep == TeRASTER)
+ colname = "block_box";
+
+ if(rep == TeTEXT)
+ {
+ wherebox = TeDatabase::getSQLBoxWhere (box, rep);
+ return wherebox;
+ }
+
+ wherebox = "mdsys.sdo_filter (" + colname +",";
+ wherebox += "mdsys.sdo_geometry(2003,null,null,";
+ wherebox += "mdsys.sdo_elem_info_array(1,1003,3),";
+ wherebox += "mdsys.sdo_ordinate_array(";
+ wherebox += Te2String(box.x1(),10) + ", " + Te2String(box.y1(),10);
+ wherebox += ", " + Te2String(box.x2(),10) + ", " + Te2String(box.y2(),10) + ")),";
+ wherebox += "'mask=anyinteract querytype = window') = 'TRUE'";
+
+ return wherebox;
+}
+
+
+string
+TeOracleSpatial::getSQLBoxWhere (const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep rep1)
+{
+ string wherebox;
+ string colname1, colname2;
+ colname1 = colname2 = "spatial_data";
+
+ if(rep1 == TeRASTER)
+ colname1 = "block_box";
+
+ if(rep2 == TeRASTER)
+ colname2 = "block_box";
+
+ wherebox = "MDSYS.SDO_FILTER ("+ table1 +"."+ colname1 +",";
+ wherebox += table2 +"."+ colname2 +", 'querytype = window') = 'TRUE'";
+
+ return wherebox;
+}
+
+
+string
+TeOracleSpatial::getSQLBoxSelect (const string& tableName, TeGeomRep rep)
+{
+
+ string select;
+ string colname = "spatial_data";
+
+ if(rep == TeRASTER)
+ colname = "block_box";
+
+ select = tableName +".* , ";
+ select += " SDO_GEOM.SDO_MIN_MBR_ORDINATE("+ tableName +"."+ colname +", 1) as lower_x,";
+ select += " SDO_GEOM.SDO_MIN_MBR_ORDINATE("+ tableName +"."+ colname +", 2) as lower_y,";
+ select += " SDO_GEOM.SDO_MAX_MBR_ORDINATE("+ tableName +"."+ colname +", 1) as upper_x,";
+ select += " SDO_GEOM.SDO_MAX_MBR_ORDINATE("+ tableName +"."+ colname +", 2) as upper_y ";
+ return select;
+}
+
+bool
+TeOracleSpatial::getMBRSelectedObjects(string geomTable,string colGeom, string fromClause, string whereClause, string afterWhereClause, TeGeomRep /* repType */,TeBox &bout, const double& tol)
+{
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+ if (!portal)
+ return false;
+
+ string sql = "SELECT SDO_AGGR_MBR(" + colGeom + ") ";
+ sql += " FROM " + fromClause;
+
+ if(!whereClause.empty())
+ sql += " WHERE " + whereClause;
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ if(!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ try
+ {
+ TeCoord2D coord1,coord2;
+ portal->GetCoordinates (1, coord1);
+ portal->GetCoordinates (2, coord2);
+ TeBox b(coord1.x()-tol, coord1.y()-tol, coord2.x()+tol, coord2.y()+tol);
+ bout = b;
+ }
+
+ catch(...)
+ {
+ delete portal;
+ return false;
+ }
+
+ delete portal;
+ return true;
+}
+
+
+string
+TeOracleSpatial::getSQLStatistics (TeGroupingAttr& attrs)
+{
+ string sql = "";
+ string virg = "";
+
+ TeGroupingAttr::iterator it = attrs.begin();
+ int count = 0;
+ while(it != attrs.end())
+ {
+ if(count>0)
+ virg = ",";
+
+ switch ((*it).second)
+ {
+ case TeSUM:
+ sql += virg +" SUM( "+ (*it).first.name_ +") AS SUM_"+ Te2String(count);
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeMAXVALUE:
+ sql += virg +" MAX( "+ (*it).first.name_ +") AS MAX_"+ Te2String(count);
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeMINVALUE:
+ sql += virg +" MIN( "+ (*it).first.name_ +") AS MIN_"+ Te2String(count);
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeCOUNT:
+ sql += virg +" COUNT( "+ (*it).first.name_ +") AS COUNT_"+ Te2String(count);
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeMEAN:
+ sql += virg +" AVG( "+ (*it).first.name_ +") AS AVG_"+ Te2String(count);
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeSTANDARDDEVIATION:
+ sql += virg +" STDDEV( "+ (*it).first.name_ +") AS STDDEV_"+ Te2String(count);
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeVARIANCE:
+ sql += virg +" VARIANCE( "+ (*it).first.name_ +") AS VAR_"+ Te2String(count);
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ default:
+ break;
+ }
+ ++it;
+ }
+ return sql;
+}
+
+string
+TeOracleSpatial::getSQLAutoNumber(const string& table)
+{
+ string aut = getNameSequence(table) +".NEXTVAL";
+ return aut;
+}
+
+bool
+TeOracleSpatial::getMBRGeom(string tableGeom, string object_id, TeBox& box, string colGeom)
+{
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+ if (!portal)
+ return false;
+
+ string sql = "SELECT SDO_GEOM.SDO_MBR(" + tableGeom + "." + colGeom + ") ";
+ sql += " FROM " + tableGeom;
+ sql += " WHERE object_id = '" + object_id + "'";
+
+ if((!portal->query(sql)) || (!portal->fetchRow()))
+ {
+ delete portal;
+ return false;
+ }
+
+ TeCoord2D coord1,coord2;
+ portal->GetCoordinates (1, coord1);
+ portal->GetCoordinates (2, coord2);
+ TeBox b(coord1.x(), coord1.y(), coord2.x(), coord2.y());
+ box = b;
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur,
+ unsigned char *buf,unsigned long size, int band, unsigned int res, unsigned int subband)
+{
+
+ if (blockId.empty()) // no block identifier provided
+ {
+ errorMessage_ = "bloco sem identificador";
+ return false;
+ }
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) this->getPortal();
+ if (!portal)
+ return false;
+
+ bool update = false;
+ string q ="SELECT * FROM " + table;
+ q += " WHERE block_id='" + blockId + "' FOR UPDATE ";
+
+ if (!portal->query (q))
+ {
+ delete portal;
+ return false;
+ }
+ // check if this block is alread in the database
+ if (portal->fetchRow())
+ update = true;
+
+ string sdo_geom = " MDSYS.SDO_GEOMETRY(2003, NULL, NULL";
+ sdo_geom += ", MDSYS.SDO_ELEM_INFO_ARRAY( 1, 1003, 3 )";
+ sdo_geom += ", MDSYS.SDO_ORDINATE_ARRAY( " ;
+ sdo_geom += Te2String(ll.x());
+ sdo_geom += ", " + Te2String(ll.y());
+ sdo_geom += ", " + Te2String(ur.x());
+ sdo_geom += ", " + Te2String(ur.y());
+ sdo_geom += ")) ";
+
+ try
+ {
+ if (!update)
+ {
+ portal->freeResult();
+
+ q = "INSERT INTO "+ table +" (block_id, band_id, subband, ";
+ q += " resolution_factor, block_box, block_size, spatial_data) VALUES ( ";
+ q += "'" + blockId + "'";
+ q += ", " + Te2String(band);
+ q += ", " + Te2String(subband);
+ q += ", " + Te2String(res);
+ q += ", " + sdo_geom;
+ q += ", " + Te2String(size);
+ q += ", EMPTY_BLOB()";
+ q += ")";
+
+ if (!this->Conn->Execute(q))
+ return false;
+
+ q = "SELECT * FROM " + table;
+ q += " WHERE block_id= '" + blockId + "' FOR UPDATE ";
+
+ if((!portal->query(q)) || (!portal->fetchRow()))
+ {
+ delete portal;
+ return false;
+ }
+ }
+
+ portal->getCursor()->WriteBlob(buf, size);
+ portal->freeResult();
+ }
+ catch(...)
+ {
+ errorMessage_ = "Oppps !";
+ delete portal;
+ return false;
+ }
+ delete portal;
+ return true;
+
+}
+
+bool
+TeOracleSpatial::insertBlob (const string& tableName, const string& /* columnBlob */, TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size)
+{
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+ if (!portal)
+ return false;
+
+ try
+ {
+ string q = "SELECT * FROM "+ tableName +" WHERE "+ columnId.name_ +" = ";
+
+ switch (columnId.type_ )
+ {
+ case TeSTRING:
+ q += "'"+ valueId + "'";
+ break;
+ default:
+ q += valueId;
+ break;
+ }
+ q += " FOR UPDATE ";
+
+ if((!portal->query(q)) || (!portal->fetchRow()))
+ {
+ delete portal;
+ return false;
+ }
+
+ portal->getCursor()->WriteBlob(data, size);
+ portal->freeResult();
+ }
+
+ catch(...)
+ {
+ errorMessage_ = "Error!";
+ delete portal;
+ return false;
+ }
+
+ delete portal;
+ if(data)
+ delete []data;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName)
+{
+ unsigned char *cdata = 0;
+ int size;
+ FILE *fp = 0;
+
+ struct _stat stat;
+ int result;
+
+ result = _stat(fileName.c_str(), &stat);
+
+ if( result != 0 )
+ return false;
+
+ size = stat.st_size;
+
+ cdata = new unsigned char[size];
+ fp = fopen(fileName.c_str(), "rb");
+ fread(cdata, sizeof(unsigned char), size, fp);
+
+ bool status = insertBlob (tableName, columnBlob, columnId, valueId, cdata, size);
+
+ if(fp)
+ fclose(fp);
+
+ return status;
+}
+
+
+bool
+TeOracleSpatial::dropConceptualModel()
+{
+ //drop tables
+ string drop = " DROP TABLE te_raster_metadata";
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP TABLE te_representation";
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP TABLE te_tables_relation";
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP TABLE te_layer_table";
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP TABLE te_visual";
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP TABLE te_legend";
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP TABLE te_theme";
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP TABLE te_theme_table";
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP TABLE te_view";
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP TABLE te_layer";
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP TABLE te_projection";
+ if(!execute(drop))
+ return false;
+
+ //drop sequences
+ drop = "DROP SEQUENCE "+ getNameSequence("te_tables_relation");
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP SEQUENCE "+ getNameSequence("te_layer_table");
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP SEQUENCE "+ getNameSequence("te_legend");
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP SEQUENCE "+ getNameSequence("te_theme");
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP SEQUENCE "+ getNameSequence("te_theme_table");
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP SEQUENCE "+ getNameSequence("te_view");
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP SEQUENCE "+ getNameSequence("te_layer");
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP SEQUENCE "+ getNameSequence("te_projection");
+ if(!execute(drop))
+ return false;
+
+ drop = "DROP SEQUENCE "+ getNameSequence("te_representation");
+ if(!execute(drop))
+ return false;
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)this->getPortal();
+
+ //tabelas geometricas com SDO_GEOMETRY
+ string sql = "SELECT TABLE_NAME FROM USER_SDO_GEOM_METADATA ";
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ string tableName = portal->getData(0);
+ string del = "drop table " + tableName;
+ this->execute (del);
+ }
+
+ portal->freeResult();
+
+ sql = "DELETE USER_SDO_GEOM_METADATA ";
+ this->execute(sql);
+
+ //spatial index
+ sql = "SELECT INDEX_NAME FROM USER_SDO_INDEX_INFO";
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ string indexName = portal->getData(0);
+ string del = "drop index " + indexName;
+ this->execute(del);
+ }
+
+ delete portal;
+ return true;
+}
+
+TeOracleSpatialPortal::TeOracleSpatialPortal ( TeOracleSpatial* pDatabase)
+{
+ cursor = new OCICursor(pDatabase->Conn);
+ db_ = pDatabase;
+}
+
+
+TeOracleSpatialPortal::~TeOracleSpatialPortal ()
+{
+ delete cursor;
+ cursor = NULL;
+}
+
+
+bool TeOracleSpatialPortal::isConnected()
+{
+ return (cursor->Conn()->IsConnected());
+}
+
+
+bool TeOracleSpatialPortal::isEOF()
+{
+ if (!isConnected())
+ return true;
+
+ return false;
+}
+
+
+bool
+TeOracleSpatialPortal::moveFirst()
+{
+ if (cursor->MoveFirst())
+ return true;
+ else
+ return false;
+}
+
+
+bool
+TeOracleSpatialPortal::moveNext()
+{
+ if(cursor->MoveNext())
+ return true;
+ return false;
+}
+
+
+bool TeOracleSpatialPortal::query (const string &q,TeCursorLocation /* l */ , TeCursorType /* t */, TeCursorEditType /* e */, TeCursorDataType /* dt */) //Ok
+{
+ errorMessage_.clear ();
+
+ if (!cursor->isOpen())
+ {
+ if(!cursor->Open())
+ {
+ numRows_ = 0;
+ return false;
+ }
+ }
+
+ if (!cursor->Query(q))
+ {
+ this->errorMessage_ = cursor->getErrorMessage();
+ numRows_ = 0;
+ return false;
+ }
+
+ numFields_= this->cursor->NumCol();
+
+ attList_.clear ();
+ int i;
+ for(i = 1; i <= numFields_ ; i++)
+ {
+ TeAttribute attribute;
+
+ switch (cursor->ColType(i))
+ {
+ case 3: //INTEGER
+ attribute.rep_.type_ = TeINT;
+ break;
+
+ case 2: //NUMBER
+ case 4: //FLOAT DOUBLE
+ attribute.rep_.type_ = TeREAL;
+ break;
+
+ case 12: //Date
+ attribute.rep_.type_ = TeDATETIME;
+ attribute.dateChronon_ = TeSECOND;
+ attribute.dateTimeFormat_ = "DD/MM/YYYY HH24:MI:SS";
+ break;
+
+ case 113: //Blob
+ attribute.rep_.type_ = TeBLOB;
+ break;
+
+ case 96: //CHAR
+ case 9: //VARCHAR:
+ case 1: //VARCHAR2:
+ attribute.rep_.type_ = TeSTRING;
+ break;
+
+ case 108: //OBJECT: // SDO_GEOMETRY
+ attribute.rep_.type_ = TeOBJECT;
+ break;
+ default :
+ attribute.rep_.type_ = TeUNKNOWN;
+ break;
+ }
+
+ //attribute.rep_.name_ = TeConvertToLowerCase(cursor->ColName(i));
+ attribute.rep_.name_ = cursor->ColName(i);
+ attribute.rep_.numChar_ = cursor->ColSize(i);
+ attList_.push_back ( attribute );
+
+ }
+
+ curRow_=-1;
+ return true;
+}
+
+
+
+bool TeOracleSpatialPortal::querySDO (const string &q)
+{
+ errorMessage_.clear ();
+
+ if (!cursor->isOpen())
+ {
+ if(!cursor->Open())
+ {
+ numRows_ = 0;
+ return false;
+ }
+ }
+
+ if (!cursor->QuerySDO(q))
+ {
+ this->errorMessage_ = cursor->getErrorMessage();
+ numRows_ = 0;
+ return false;
+ }
+
+ numFields_= this->cursor->NumCol();
+
+ attList_.clear ();
+ int i;
+ for(i = 1; i <= numFields_ ; i++)
+ {
+ TeAttribute attribute;
+
+ switch (cursor->ColType(i))
+ {
+ case 3: //INTEGER
+ attribute.rep_.type_ = TeINT;
+ break;
+
+ case 2: //NUMBER
+ case 4: //FLOAT DOUBLE
+ attribute.rep_.type_ = TeREAL;
+ break;
+
+ case 12: //Date
+ attribute.rep_.type_ = TeDATETIME;
+ break;
+
+ case 113: //Blob
+ attribute.rep_.type_ = TeBLOB;
+ break;
+
+ case 96: //CHAR
+ case 9: //VARCHAR:
+ case 1: //VARCHAR2:
+ attribute.rep_.type_ = TeSTRING;
+ break;
+
+ case 108: //OBJECT: // SDO_GEOMETRY
+ attribute.rep_.type_ = TeOBJECT;
+ break;
+ default :
+ attribute.rep_.type_ = TeUNKNOWN;
+ break;
+ }
+
+ attribute.rep_.name_ = cursor->ColName(i);
+ attribute.rep_.numChar_ = cursor->ColSize(i);
+ attList_.push_back ( attribute );
+ }
+
+ curRow_=-1;
+ return true;
+}
+
+
+void TeOracleSpatialPortal::freeResult ()
+{
+ cursor->FreeResult();
+}
+
+
+bool TeOracleSpatialPortal::fetchRow ()
+{
+ try
+ {
+ if( !isConnected() )
+ return false;
+ if( numFields_ == 0/* || numRows_ < 1*/)
+ return false;
+
+ if (curRow_ == -1)
+ {
+ if(moveFirst())
+ curRow_++;
+ else
+ return false;
+ }
+ else
+ if (moveNext())
+ {
+ curRow_++;
+ return true;
+ }
+ else
+ return false;
+ }
+
+ catch(...) //_com_error &e)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+bool TeOracleSpatialPortal ::fetchRow (int i)
+{
+
+ if(curRow_ == i)
+ return true;
+
+ if (cursor->MoveTo(i))
+ {
+ curRow_ = cursor->CurrentRow()
+ ;
+ return true;
+ }
+
+ return false;
+}
+
+string
+TeOracleSpatial::escapeSequence (const string& from)
+{
+ string aux = "";
+ unsigned int size = from.length ();
+ unsigned int i;
+
+ for(i=0; i < size; i++)
+ {
+ if(from[i] == 39)
+ aux += from[i] + unsigned char(39);
+ else
+ aux += from[i];
+ }
+ return aux;
+}
+
+bool
+TeOracleSpatial::insertTable(TeTable &table)
+{
+ string tableName = table.name();
+ int size = table.size();
+ TeAttributeList att = table.attributeList();
+ TeAttributeList::iterator it = att.begin();
+ TeAttributeList::iterator itEnd = att.end();
+
+ TeTableRow row;
+ int i;
+ unsigned int j;
+ for ( i = 0; i < size; i++ )
+ {
+ row = table[i];
+ it = att.begin();
+ string q = "INSERT INTO "+tableName+" VALUES(";
+ j = 1;
+ int jj = 0;
+ while ( it != itEnd )
+ {
+ if (j != 1)
+ q += ", ";
+
+ string oracleFormat="";
+ string dateTime="";
+ if(((*it).rep_.type_==TeDATETIME) && (!row[jj].empty()))
+ {
+ TeTime t (row[jj], (*it).dateChronon_, (*it).dateTimeFormat_, (*it).dateSeparator_,
+ (*it).timeSeparator_, (*it).indicatorPM_);
+
+ dateTime = t.getDateTime("DDsMMsYYYYsHHsmmsSS");
+ oracleFormat = " TO_DATE('" + dateTime + "', 'DD/MM/YYYY HH24:MI:SS')";
+ }
+
+ switch ((*it).rep_.type_)
+ {
+ case TeSTRING:
+ q += "'"+ escapeSequence(row[jj]) +"'";
+ break;
+ case TeREAL:
+ q += row[jj];
+ break;
+ case TeINT:
+ q += row[jj];
+ break;
+ case TeDATETIME:
+ q += oracleFormat;
+ break;
+ case TeCHARACTER:
+ q += "'" + escapeSequence(row[jj]) + "'";
+ break;
+ case TeBLOB:
+ q += " EMPTY_BLOB() ";
+ break;
+ default:
+ q += "'"+ escapeSequence(row[jj]) +"'";
+ break;
+ }
+ ++it;
+ j++;
+ jj++;
+ }
+ q += ")";
+
+ if (!execute(q))
+ continue;
+ }
+ return true;
+}
+
+
+bool
+TeOracleSpatial::updateTable (TeTable &table)
+{
+ string tableName = table.name();
+ TeAttributeList att = table.attributeList();
+ TeAttributeList::iterator it = att.begin();
+
+ TeTableRow row;
+ unsigned int i;
+ unsigned int j;
+ string uniqueName = table.uniqueName();
+ string uniqueVal;
+ for ( i = 0; i < table.size(); i++ )
+ {
+ row = table[i];
+ it = att.begin();
+ string q = "UPDATE "+tableName+" SET ";
+ j = 1;
+ int jj = 0;
+ while ( it != att.end() )
+ {
+ string oracleFormat;
+ string dateTime;
+ if((*it).rep_.type_==TeDATETIME)
+ {
+ TeTime t (row[jj], (*it).dateChronon_, (*it).dateTimeFormat_, (*it).dateSeparator_,
+ (*it).timeSeparator_, (*it).indicatorPM_);
+
+ dateTime = t.getDateTime();
+ oracleFormat = "DD/MM/YYYY HH24:MI:SS";
+ }
+
+ if (uniqueName != (*it).rep_.name_)
+ {
+ q += (*it).rep_.name_ + "=";
+ switch ((*it).rep_.type_)
+ {
+ case TeSTRING:
+ q += "'"+escapeSequence(row[jj])+"'";
+ break;
+ case TeREAL:
+ q += row[jj];
+ break;
+ case TeINT:
+ q += row[jj];
+ break;
+ case TeDATETIME:
+ q += " TO_DATE('" + dateTime + "', '"+ oracleFormat +"')";
+ break;
+ case TeCHARACTER:
+ q += "'" + escapeSequence(row[jj]) + "'";
+ break;
+ default:
+ q += "'"+escapeSequence(row[jj])+"'";
+ break;
+ }
+ if (j<att.size())
+ q+= ",";
+ }
+ else
+ uniqueVal = row[jj];
+
+ ++it;
+ j++;
+ jj++;
+ }
+ q += " WHERE " + uniqueName + " = " + uniqueVal;
+ if (!execute(q))
+ continue;
+ }
+ return true;
+}
+
+
+bool
+TeOracleSpatial::insertProjection (TeProjection *proj)
+{
+ string insert = "INSERT INTO te_projection (projection_id, name, long0, lat0,";
+ insert += " offx, offy, stlat1, stlat2, unit, scale, hemis, datum, ";
+ insert += " radius, flattening, dx , dy, dz ) VALUES ( ";
+ insert += "te_projection_seq.NEXTVAL";
+ insert += ", '" + escapeSequence(proj->name()) + "'";
+ insert += ", " + Te2String(proj->params().lon0*TeCRD,10);
+ insert += ", " + Te2String(proj->params().lat0*TeCRD,10);
+ insert += ", " + Te2String(proj->params().offx,10);
+ insert += ", " + Te2String(proj->params().offy,10);
+ insert += ", " + Te2String(proj->params().stlat1*TeCRD,10);
+ insert += ", " + Te2String(proj->params().stlat2*TeCRD,10);
+ insert += ", '" + escapeSequence(proj->params().units) + "'";
+ insert += ", " + Te2String(proj->params().scale,10);
+ insert += ", " + Te2String(proj->params().hemisphere);
+ insert += ", '" + escapeSequence(proj->params().datum.name()) + "'";
+ insert += ", " + Te2String(proj->params().datum.radius(),10);
+ insert += ", " + Te2String(proj->params().datum.flattening(),10);
+ insert += ", " + Te2String(proj->params().datum.xShift(),10);
+ insert += ", " + Te2String(proj->params().datum.yShift(),10);
+ insert += ", " + Te2String(proj->params().datum.zShift(),10);
+ insert += ")";
+
+ if(!execute(insert))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table te_projection!";
+ return false;
+ }
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*) getPortal();
+ if(!ocip)
+ return false;
+
+ string seq = "SELECT te_projection_seq.CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence te_projection_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ proj->id(atoi((const char*)ocip->getData(0)));
+ delete ocip;
+
+ return true;
+}
+
+
+
+bool
+TeOracleSpatial::insertRepresentation (int layerId, TeRepresentation& rep)
+{
+ if (layerId <= 0)
+ return false;
+
+ string ins;
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*) getPortal();
+ if(!ocip)
+ return false;
+
+ try
+ {
+ ins = " INSERT INTO te_representation (repres_id, layer_id, geom_type, geom_table, ";
+ ins += " description, lower_x, lower_y, upper_x, upper_y, res_x, res_y, num_cols, ";
+ ins += " num_rows) VALUES (";
+ ins += " te_representation_seq.NEXTVAL ";
+ ins += ", " + Te2String(layerId);
+ ins += ", " + Te2String(static_cast<int>(rep.geomRep_));
+ ins += ", '" + escapeSequence(rep.tableName_) + "'";
+ ins += ", '" + escapeSequence(rep.description_) + "'";
+ ins += ", " + Te2String(rep.box_.x1(),10);
+ ins += ", " + Te2String(rep.box_.y1(),10);
+ ins += ", " + Te2String(rep.box_.x2(),10);
+ ins += ", " + Te2String(rep.box_.y2(),10);
+ ins += ", " + Te2String(rep.resX_,10);
+ ins += ", " + Te2String(rep.resY_,10);
+ ins += ", " + Te2String(rep.nCols_);
+ ins += ", " + Te2String(rep.nLins_);
+ ins += ")";
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table te_representation!";
+ return false;
+ }
+
+ string seq = "SELECT te_representation_seq.CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence te_representation_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int id = atoi((const char*)ocip->getData(0));
+ rep.id_ = id;
+ }
+
+ catch(...)
+ {
+ errorMessage_ = "Error inserting in the table te_representation!";
+ delete ocip;
+ return false;
+ }
+
+ delete ocip;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::insertLegend (TeLegendEntry* leg)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ try
+ {
+ string ins = "INSERT INTO te_legend (legend_id, theme_id, group_id, ";
+ ins += " num_objs, lower_value, upper_value, label) VALUES ( ";
+ ins += "te_legend_seq.NEXTVAL";
+ ins += ", " + Te2String(leg->theme());
+ ins += ", " + Te2String(leg->group());
+ ins += ", " + Te2String(leg->count());
+ ins += ", '" + escapeSequence(leg->from()) + "'";
+ ins += ", '" + escapeSequence(leg->to()) + "'";
+ ins += ", '" + escapeSequence(leg->label()) + "'";
+ ins += ")";
+
+ if (!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table te_legend!";
+ return false;
+ }
+
+ string seq = "SELECT te_legend_seq.CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence te_theme_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";;
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ leg->id(index);
+ }
+ catch(...)
+ {
+ errorMessage_ = "Error inserting in the table te_legend!";
+ delete ocip;
+ return false;
+ }
+
+ delete ocip;
+ legendMap_[leg->id()] = leg;
+ return insertVisual(leg);
+}
+
+
+bool
+TeOracleSpatial::AllocateOrdinatesObject(TePolygon &poly, string& elInfo, OCICursor* cursor)
+{
+ int totalsize, ni, size;
+ double xult, yult;
+ short orient;
+
+ ni = poly.size () - 1;
+
+ xult = -9999.99;
+ yult = -9999.99;
+
+ totalsize = 0;
+
+ try
+ {
+ //OCI: create the ordinates array
+ if(!cursor)
+ Conn->AllocateObjectOrdinates();
+
+ for (int k = 0; k <= ni; k++ )
+ {
+ TeLinearRing ring ( poly[k] );
+ totalsize += ring.size();
+ size = ring.size();
+ orient = TeOrientation(ring);
+
+ if (k==0) //external polygon: UNCLOCKWISE
+ {
+ elInfo = "1, 1003, 1";
+ if(orient == TeCOUNTERCLOCKWISE)
+ {
+ for (int i=0;i<size;i++)
+ {
+ if(xult != ring[i].x() || yult != ring[i].y())
+ {
+ if(cursor)
+ {
+ cursor->AppendOrdinates(ring[i].x());
+ cursor->AppendOrdinates (ring[i].y());
+ }
+ else
+ {
+ Conn->AppendOrdinates(ring[i].x());
+ Conn->AppendOrdinates (ring[i].y());
+ }
+
+ xult = ring[i].x();
+ yult = ring[i].y();
+ }
+ }
+ }
+ //keep UNCLOCKWISE ring
+ else
+ {
+ for (int i=0;i<size;i++)
+ {
+ if(xult != ring[size-1-i].x() || yult != ring[size-1-i].y())
+ {
+ if(cursor)
+ {
+ cursor->AppendOrdinates(ring[size-1-i].x());
+ cursor->AppendOrdinates (ring[size-1-i].y());
+ }
+ else
+ {
+ Conn->AppendOrdinates(ring[size-1-i].x());
+ Conn->AppendOrdinates (ring[size-1-i].y());
+ }
+
+ xult = ring[size-1-i].x();
+ yult = ring[size-1-i].y();
+ }
+ }
+ }
+ }
+
+ else //internal polygon: CLOCKWISE
+ {
+ int pos = ((totalsize - size) * 2) + 1;
+ elInfo += ", " + Te2String(pos) + ", 2003, 1";
+
+ if(orient == TeCLOCKWISE)
+ {
+ for (int i=0;i<size;i++)
+ {
+ if(xult != ring[i].x() || yult != ring[i].y())
+ {
+ if(cursor)
+ {
+ cursor->AppendOrdinates(ring[i].x());
+ cursor->AppendOrdinates (ring[i].y());
+ }
+ else
+ {
+ Conn->AppendOrdinates(ring[i].x());
+ Conn->AppendOrdinates (ring[i].y());
+ }
+
+ xult = ring[i].x();
+ yult = ring[i].y();
+ }
+ }
+ }
+ //keep CLOCKWISE ring
+ else
+ {
+ for (int i=0;i<size;i++)
+ {
+ if(xult != ring[size-1-i].x() || yult != ring[size-1-i].y())
+ {
+ Conn->AppendOrdinates(ring[size-1-i].x());
+ Conn->AppendOrdinates (ring[size-1-i].y());
+
+ xult = ring[size-1-i].x();
+ yult = ring[size-1-i].y();
+ }
+ }
+ }
+ }
+ }//for all rings
+ }
+ catch(...)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeOracleSpatial::AllocateOrdinatesObject(TeLine2D &line, OCICursor* cursor)
+{
+ int size = line.size();
+ double xult, yult;
+ xult = -9999.99;
+ yult = -9999.99;
+
+ try
+ {
+ //OCI: create the ordinates array
+ if(!cursor)
+ Conn->AllocateObjectOrdinates ();
+
+ for (int i=0;i<size;i++)
+ {
+ if(xult != line[i].x() || yult != line[i].y())
+ {
+ if(cursor)
+ {
+ cursor->AppendOrdinates(line[i].x());
+ cursor->AppendOrdinates(line[i].y());
+ }
+ else
+ {
+ Conn->AppendOrdinates(line[i].x());
+ Conn->AppendOrdinates(line[i].y());
+ }
+ xult = line[i].x();
+ yult = line[i].y();
+ }
+ }
+ }
+ catch(...)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::insertPolygon (const string& table, TePolygon &poly)
+{
+
+ string elinfo;
+
+ if(!AllocateOrdinatesObject(poly, elinfo))
+ return false;
+
+
+ string ins = "INSERT INTO " + table + " ( ";
+ ins += " geom_id, object_id, spatial_data) VALUES ( ";
+ ins += getNameSequence(table) +".NEXTVAL";
+ ins += ", '" + escapeSequence(poly.objectId()) + "'";
+ ins += ", MDSYS.SDO_GEOMETRY(2003, NULL, NULL";
+ ins += ", MDSYS.SDO_ELEM_INFO_ARRAY( " + elinfo + " )";
+ ins += ", :ordinates) ";
+ ins += " )";
+
+ if(!Conn->ExecuteSDOSTM(ins))
+ {
+ errorMessage_ = "Error inserting in the table " + table + "!";
+ return false;
+ }
+
+ /*
+ string seq = "SELECT "+ getNameSequence(table) +".CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence " + table + "_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ poly.geomId(index);
+ delete ocip;
+ */
+
+ return true;
+}
+
+bool
+TeOracleSpatial::updatePolygon (const string& table, TePolygon &poly)
+{
+ if(!tableExist(table))
+ {
+ errorMessage_ = "Table not exist!";
+ return false;
+ }
+
+ string elinfo;
+
+ if(!AllocateOrdinatesObject(poly, elinfo))
+ return false;
+
+ string sql;
+ sql = "UPDATE " + table + " SET ";
+ sql += ", object_id = '" + poly.objectId() + "'";
+ sql += ", spatial_data = ";
+ sql += " MDSYS.SDO_GEOMETRY(2003, NULL, NULL";
+ sql += ", MDSYS.SDO_ELEM_INFO_ARRAY( " + elinfo + " )";
+ sql += ", :ordinates) ";
+ sql += " WHERE geom_id = " + poly.geomId();
+
+ //OCI
+ if(!Conn->ExecuteSDOSTM(sql))
+ {
+ errorMessage_ = "Error updating in the table " + table + "!";
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeOracleSpatial::selectPolygonSet (const string& table, const string& criteria, TePolygonSet &ps)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string sql ="SELECT * FROM " + table;
+ if (!criteria.empty())
+ sql += " WHERE " + criteria;
+ sql += " ORDER BY object_id ASC ";
+
+ if (!ocip->query(sql) || !ocip->fetchRow())
+ {
+ delete ocip;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = ocip->fetchGeometry(poly);
+ ps.add(poly);
+ }
+ while (flag);
+
+ delete ocip;
+ return true;
+}
+
+bool
+TeOracleSpatial::loadPolygonSet (const string& table, const string& geoid, TePolygonSet &ps)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string q ="SELECT * FROM " + table;
+
+ if (geoid != "")
+ q += " WHERE object_id = '" + geoid +"'";
+
+ if (!ocip->query(q) || !ocip->fetchRow())
+ {
+ delete ocip;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = ocip->fetchGeometry(poly);
+ ps.add(poly);
+ }
+ while (flag);
+ delete ocip;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::loadPolygonSet (const string& table, TeBox &box, TePolygonSet &ps)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string q = "SELECT * FROM " + table;
+ q += this->getSQLBoxWhere (box, TePOLYGONS);
+ q += " ORDER BY object_id ";
+
+ if (!ocip->query(q) || !ocip->fetchRow())
+ {
+ delete ocip;
+ return false;
+ }
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = ocip->fetchGeometry(poly);
+ ps.add(poly);
+ }
+ while (flag);
+ delete ocip;
+ return true;
+}
+
+bool
+TeOracleSpatial::loadPolygonSet(TeTheme* theme, TePolygonSet &ps)
+{
+ string collTable = theme->collectionTable();
+ if (collTable.empty())
+ return false;
+
+ TeLayer* themeLayer = theme->layer();
+ if (!themeLayer->hasGeometry(TePOLYGONS))
+ return false;
+
+ string polygonTable = themeLayer->tableName(TePOLYGONS);
+ if (polygonTable.empty())
+ return false;
+
+ string sql = "SELECT * FROM (" + polygonTable + " RIGHT JOIN " + collTable;
+ sql += " ON " + polygonTable + ".object_id = " + collTable + ".object_id)";
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ if (!ocip->query(sql) || !ocip->fetchRow())
+ {
+ delete ocip;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = ocip->fetchGeometry(poly);
+ ps.add ( poly );
+ }
+ while (flag);
+ delete ocip;
+ return true;
+}
+
+TeDatabasePortal*
+TeOracleSpatial::loadPolygonSet(const string& table, TeBox &box)
+{
+ TeOracleSpatialPortal *portal = (TeOracleSpatialPortal*)this->getPortal();
+ if (!portal)
+ return 0;
+
+ string q;
+ q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere (box, TePOLYGONS);
+ q += " ORDER BY object_id ";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return 0;
+ }
+ else
+ return portal;
+}
+
+
+//Spatial query
+//retornam um portal
+bool
+TeOracleSpatial::spatialRelation(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIdsIn, TeDatabasePortal *portal, int relate, const string& actCollTable)
+{
+ string Ids = getStringIds(actIdsIn);
+ string actGeomColl = "spatial_data";
+
+ string spatialRel = getOracleSpatialRelation(relate);
+
+ //Montar a sql para passar para o Oracle
+ string sql = "SELECT geomTable1.* ";
+ sql += " FROM "+ actGeomTable +" geomTable1,";
+ sql += actGeomTable + " geomTable2 ";
+
+ if(!actCollTable.empty())
+ {
+ sql += ", "+ actCollTable +" collTable ";
+ sql += " WHERE geomTable1.object_id = collTable.c_object_id AND ";
+ }
+ else
+ sql += " WHERE ";
+
+ sql += " geomTable2.object_id IN (" + Ids + ") AND ";
+
+ if(relate==TeEQUALS)
+ sql += " geomTable1.object_id NOT IN (" + Ids + ") AND ";
+
+ if(relate==TeDISJOINT)
+ sql += " NOT "; // NOT ANYINTERACT
+
+ sql += " SDO_RELATE(geomTable1."+ actGeomColl +", geomTable2."+ actGeomColl +", 'mask= ";
+ sql += spatialRel + " querytype=WINDOW') = 'TRUE'";
+
+ portal->freeResult();
+ if(!((TeOracleSpatialPortal*)portal)->querySDO (sql))
+ return false;
+
+ return (portal->fetchRow());
+}
+
+bool
+TeOracleSpatial::spatialRelation(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIdsIn, const string& visGeomTable, TeGeomRep /* visRep */, TeDatabasePortal *portal, int relate, const string& visCollTable)
+{
+ string Ids = getStringIds(actIdsIn);
+ string spatialRel = getOracleSpatialRelation(relate);
+ string actGeomColl = "spatial_data";
+ string visGeomColl = "spatial_data";
+
+ //Montar a sql para passar para o Oracle
+ string sql = "SELECT geomTable1.* ";
+ sql += " FROM "+ visGeomTable +" geomTable1,";
+ sql += actGeomTable + " geomTable2 ";
+
+ if(!visCollTable.empty())
+ {
+ sql += ", "+ visCollTable +" collTable";
+ sql += " WHERE geomTable1.object_id = collTable.c_object_id AND ";
+ }
+ else
+ sql += " WHERE ";
+
+ sql += " geomTable2.object_id IN (" + Ids + ") AND ";
+
+ if(relate==TeDISJOINT)
+ sql += " NOT "; // NOT ANYINTERACT
+
+ sql += " SDO_RELATE(geomTable1."+ visGeomColl +", geomTable2."+ actGeomColl +", 'mask= ";
+ sql += spatialRel + " querytype=WINDOW') = 'TRUE'";
+
+ portal->freeResult();
+ if(!((TeOracleSpatialPortal*)portal)->querySDO(sql))
+ return false;
+
+ return (portal->fetchRow());
+
+}
+
+bool
+TeOracleSpatial::spatialRelation(const string& actGeomTable, TeGeomRep /* actRep */, TeGeometry* geom, TeDatabasePortal *portal, int relate, const string& actCollTable)
+{
+ portal->freeResult();
+ string elinfo, sdo;
+
+ OCICursor *cursor = ((TeOracleSpatialPortal*)portal)->getCursor();
+ string spatialRel = getOracleSpatialRelation(relate);
+ string actGeomColl = "spatial_data";
+
+ if(geom->elemType()==TePOLYGONS)
+ {
+ TePolygon poly, *pPoly;
+ pPoly = new TePolygon();
+ pPoly = (TePolygon*)geom;
+ poly = *pPoly;
+
+ if(!AllocateOrdinatesObject(poly, elinfo, cursor))
+ {
+ delete cursor;
+ return false;
+ }
+
+ sdo = " MDSYS.SDO_GEOMETRY(2003, NULL, NULL, ";
+ sdo += " MDSYS.SDO_ELEM_INFO_ARRAY(" + elinfo + "), ";
+ sdo += " :ordinates)";
+
+ //delete pPoly; //delete tamb�m o geom, talvez deixar para aplicacao
+ }
+
+ else if (geom->elemType()==TeLINES)
+ {
+ TeLine2D line, *pLine;
+ pLine = new TeLine2D();
+ pLine = (TeLine2D*)geom;
+ line = *pLine;
+
+ if(!AllocateOrdinatesObject(line, cursor))
+ {
+ delete cursor;
+ return false;
+ }
+
+ elinfo = "1, 2, 1";
+
+ sdo = " MDSYS.SDO_GEOMETRY(2002, NULL, NULL, ";
+ sdo += " MDSYS.SDO_ELEM_INFO_ARRAY(" + elinfo + "), ";
+ sdo += " :ordinates)";
+
+ //delete pLine; //delete tamb�m o geom
+ }
+
+ else if (geom->elemType()==TePOINTS)
+ {
+ TePoint point, *pPoint;
+ pPoint = new TePoint();
+ pPoint = (TePoint*)geom;
+ point = *pPoint;
+
+ sdo = " MDSYS.SDO_GEOMETRY(2001, NULL, ";
+ sdo += " MDSYS.SDO_POINT_TYPE( ";
+ sdo += Te2String(point.location().x());
+ sdo += ", " + Te2String(point.location().y());
+ sdo += ", NULL )";
+ sdo += ", NULL, NULL))";
+
+ //delete pPoint;
+ }
+
+ else if (geom->elemType()==TeCELLS)
+ {
+ TeCell cell, *pCell;
+ pCell = new TeCell();
+ pCell = (TeCell*)geom;
+ cell = *pCell;
+
+ TeBox b = cell.box();
+
+ sdo = " MDSYS.SDO_GEOMETRY(2003, NULL, NULL ";
+ sdo += ", MDSYS.SDO_ELEM_INFO_ARRAY( 1, 1003, 3 )";
+ sdo += ", MDSYS.SDO_ORDINATE_ARRAY( " ;
+ sdo += Te2String(b.lowerLeft().x());
+ sdo += ", " + Te2String(b.lowerLeft().y());
+ sdo += ", " + Te2String(b.upperRight().x());
+ sdo += ", " + Te2String(b.upperRight().y());
+ sdo += ")) ";
+
+ //delete pCell;
+ }
+
+ //Montar a sql para passar para o Oracle
+ string sql = "SELECT geomTable.* ";
+ sql += " FROM " + actGeomTable + " geomTable ";
+
+ if(!actCollTable.empty())
+ {
+ sql += ", "+ actCollTable +" collTable ";
+ sql += " WHERE geomTable.object_id = collTable.c_object_id AND ";
+ }
+ else
+ sql += " WHERE ";
+
+
+ if(relate==TeDISJOINT)
+ sql += " NOT "; // NOT ANYINTERACT
+
+ sql += " MDSYS.SDO_RELATE(geomTable."+ actGeomColl +", "+ sdo +", 'mask= ";
+ sql += spatialRel + " querytype=WINDOW') = 'TRUE'";
+
+ if(!((TeOracleSpatialPortal*)portal)->querySDO(sql))
+ return false;
+
+ return (portal->fetchRow());
+
+}
+
+
+//retornam um vetor de object_ids resultantes da consulta
+bool
+TeOracleSpatial::spatialRelation(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIdsIn, Keys& actIdsOut, int relate, const string& actCollTable)
+{
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) getPortal();
+
+ string Ids = getStringIds(actIdsIn);
+ string spatialRel = getOracleSpatialRelation(relate);
+ string actGeomColl = "spatial_data";
+
+ //Montar a sql para passar para o Oracle
+ string sql = "SELECT geomTable1.object_id ";
+ sql += " FROM "+ actGeomTable +" geomTable1,";
+ sql += actGeomTable + " geomTable2 ";
+
+ if(!actCollTable.empty())
+ {
+ sql += ", "+ actCollTable +" collTable ";
+ sql += " WHERE geomTable1.object_id = collTable.c_object_id AND ";
+ }
+ else
+ sql += " WHERE ";
+
+ sql += " geomTable2.object_id IN (" + Ids + ") AND ";
+
+ if(relate==TeEQUALS)
+ sql += " geomTable1.object_id NOT IN (" + Ids + ") AND ";
+
+ if(relate==TeDISJOINT)
+ sql += " NOT "; // NOT ANYINTERACT
+
+ sql += " SDO_RELATE(geomTable1."+ actGeomColl +", geomTable2."+ actGeomColl +", 'mask= ";
+ sql += spatialRel + " querytype=WINDOW') = 'TRUE'";
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ actIdsOut.clear();
+ while(portal->fetchRow())
+ {
+ string objId = portal->getData (0);
+ actIdsOut.push_back(objId);
+ }
+
+ sort(actIdsOut.begin(), actIdsOut.end());
+ unique(actIdsOut.begin(), actIdsOut.end());
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::spatialRelation(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIdsIn, const string& visGeomTable, TeGeomRep /* visRep */, Keys& visIdsOut, int relate, const string& visCollTable)
+{
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) getPortal();
+
+ string Ids = getStringIds(actIdsIn);
+ string spatialRel = getOracleSpatialRelation(relate);
+ string actGeomColl = "spatial_data";
+ string visGeomColl = "spatial_data";
+
+ //Montar a sql para passar para o Oracle
+ string sql = "SELECT geomTable1.object_id ";
+ sql += " FROM "+ visGeomTable +" geomTable1,";
+ sql += actGeomTable + " geomTable2 ";
+
+ if(!visCollTable.empty())
+ {
+ sql += ", "+ visCollTable +" collTable";
+ sql += " WHERE geomTable1.object_id = collTable.c_object_id AND ";
+ }
+ else
+ sql += " WHERE ";
+
+ sql += " geomTable2.object_id IN (" + Ids + ") AND ";
+
+ if(relate==TeDISJOINT)
+ sql += " NOT "; // NOT ANYINTERACT
+
+ sql += " SDO_RELATE(geomTable1."+ visGeomColl +", geomTable2."+ actGeomColl +", 'mask= ";
+ sql += spatialRel + " querytype=WINDOW') = 'TRUE'";
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ visIdsOut.clear();
+ while(portal->fetchRow())
+ {
+ string objId = portal->getData (0);
+ visIdsOut.push_back(objId);
+ }
+
+ sort(visIdsOut.begin(), visIdsOut.end());
+ unique(visIdsOut.begin(), visIdsOut.end());
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, Keys& actIdsOut, int relate, const string& actCollTable)
+{
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) getPortal();
+
+ if(!spatialRelation(actGeomTable, actRep, geom, portal, relate, actCollTable))
+ {
+ delete portal;
+ return false;
+ }
+
+ actIdsOut.clear();
+ do
+ {
+ string objId = portal->getData ("object_id");
+ actIdsOut.push_back(objId);
+ }while(portal->fetchRow());
+
+ sort(actIdsOut.begin(), actIdsOut.end());
+ unique(actIdsOut.begin(), actIdsOut.end());
+
+ delete portal;
+ return true;
+}
+
+// metric functions
+bool
+TeOracleSpatial::calculateArea(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIdsIn, double &area)
+{
+ string Ids = getStringIds(actIdsIn);
+ string actGeomColl = "spatial_data";
+
+ string sql = "SELECT SUM(SDO_GEOM.SDO_AREA(g."+ actGeomColl +", m.diminfo))";
+ sql += " FROM "+ actGeomTable +" g, USER_SDO_GEOM_METADATA m";
+ sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND object_id IN ("+ Ids +")";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ area = portal->getDouble(0);
+ delete portal;
+ return true;
+}
+
+bool
+TeOracleSpatial::calculateLength(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIdsIn, double &length)
+{
+ string Ids = getStringIds(actIdsIn);
+ string actGeomColl = "spatial_data";
+
+ string sql = "SELECT SUM(SDO_GEOM.SDO_LENGTH(g."+ actGeomColl +", m.diminfo))";
+ sql += " FROM "+ actGeomTable +" g, USER_SDO_GEOM_METADATA m";
+ sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND object_id IN ("+ Ids +")";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ length = portal->getDouble(0);
+ delete portal;
+ return true;
+}
+
+
+//distancia entre objetos de um mesma tabela
+bool
+TeOracleSpatial::calculateDistance(const string& actGeomTable, TeGeomRep /* actRep */, Keys& Ids, double& distance)
+{
+ string Id1 = Ids[0];
+ string Id2 = Ids[1];
+ string actGeomColl = "spatial_data";
+
+ string sql = "SELECT MIN(SDO_GEOM.SDO_DISTANCE(g1."+ actGeomColl +", m.diminfo, ";
+ sql += " g2."+ actGeomColl +", m.diminfo))";
+ sql += " FROM "+ actGeomTable +" g1,"+ actGeomTable +" g2, USER_SDO_GEOM_METADATA m";
+ sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND g1.object_id = '"+ Id1 +"'";
+ sql += " AND g2.object_id = '"+ Id2 +"'";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ distance = portal->getDouble(0);
+ delete portal;
+ return true;
+}
+
+
+//distancia entre objetos de duas tabelas distintas
+bool
+TeOracleSpatial::calculateDistance(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& visGeomTable, TeGeomRep /* visRep */, const string& objId2, double& distance)
+{
+ string actGeomColl = "spatial_data";
+ string visGeomColl = "spatial_data";
+
+ string sql = "SELECT MIN(SDO_GEOM.SDO_DISTANCE(g1."+ actGeomColl +", m1.diminfo, ";
+ sql += " g2."+ visGeomColl +", m2.diminfo))";
+ sql += " FROM "+ actGeomTable +" g1,"+ visGeomTable +" g2, ";
+ sql += " USER_SDO_GEOM_METADATA m1, USER_SDO_GEOM_METADATA m2 ";
+ sql += " WHERE m1.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m1.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND m2.table_name = '"+ TeConvertToUpperCase(visGeomTable) +"'";
+ sql += " AND m2.column_name = '"+ TeConvertToUpperCase(visGeomColl) +"'";
+ sql += " AND g1.object_id = '"+ objId1 +"'";
+ sql += " AND g2.object_id = '"+ objId2 +"'";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ distance = portal->getDouble(0);
+ delete portal;
+ return true;
+}
+
+/*
+bool
+TeOracleSpatial::withinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& point, KeysToDist& IdsDistOut, const double& max_distance, const string& actCollTable)
+{
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) getPortal();
+
+ string Ids = getStringIds(actIdsIn);
+ string actGeomColl = "spatial_data";
+
+ //Montar a sql para passar para o Oracle
+ string sql = "SELECT geomTable1.object_id ";
+ sql += " FROM "+ actGeomTable +" geomTable1,";
+ sql += actGeomTable + " geomTable2 ";
+
+ if(!actCollTable.empty())
+ {
+ sql += ", "+ actCollTable +" collTable ";
+ sql += " WHERE geomTable1.object_id = collTable.c_object_id AND ";
+ }
+ else
+ sql += " WHERE ";
+
+ sql += " geomTable2.object_id IN (" + Ids + ") AND ";
+ sql += " SDO_WITHIN_DISTANCE(geomTable1."+ actGeomColl +", geomTable2."+ actGeomColl +", 'distance= ";
+ sql += Te2String(max_distance) + " querytype=WINDOW') = 'TRUE'";
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ actIdsOut.clear();
+ while(portal->fetchRow())
+ {
+ string objId = portal->getData (0);
+ actIdsOut.push_back(objId);
+ }
+
+ sort(actIdsOut.begin(), actIdsOut.end());
+ unique(actIdsOut.begin(), actIdsOut.end());
+
+ delete portal;
+ return true;
+}
+*/
+
+// functions that return a new geometry
+
+//Euclidean distance value: dist
+bool
+TeOracleSpatial::Buffer(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIds, TePolygonSet& bufferSet, double dist)
+{
+ string Ids = getStringIds(actIds);
+ string actGeomColl = "spatial_data";
+
+ string sql = "SELECT g.geom_id, g.object_id,";
+ sql += " SDO_GEOM.SDO_BUFFER(g."+ actGeomColl +", m.diminfo, "+ Te2String(dist) +")";
+ sql += " FROM "+ actGeomTable +" g, USER_SDO_GEOM_METADATA m";
+ sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND object_id IN ("+ Ids +")";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ bool flag = true;
+ do
+ {
+ TePolygonSet polySet;
+ flag = portal->fetchGeometry(polySet);
+ //teste c/ buffer com filhos
+ for(unsigned int i=0; i<polySet.size(); i++)
+ bufferSet.add(polySet[i]);
+
+ }while(flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeOracleSpatial::ConvexHull(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIds, TePolygonSet& convexHullSet)
+{
+ string Ids = getStringIds(actIds);
+ string actGeomColl = "spatial_data";
+
+ string sql = "SELECT g.geom_id, g.object_id,";
+ sql += " SDO_GEOM.SDO_CONVEXHULL(g."+ actGeomColl +", m.diminfo )";
+ sql += " FROM "+ actGeomTable +" g, USER_SDO_GEOM_METADATA m";
+ sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND object_id IN ("+ Ids +")";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ convexHullSet.add(poly);
+ }while(flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeOracleSpatial::Centroid(const string& actGeomTable , TeGeomRep /* actRep */, TePointSet& centroidSet, Keys actIds, const string& /* actCollTable */)
+{
+ string Ids = getStringIds(actIds);
+ string actGeomColl = "spatial_data";
+
+ string sql = "SELECT g.geom_id, g.object_id,";
+ sql += " SDO_GEOM.SDO_CENTROID(g."+ actGeomColl +", m.diminfo )";
+ sql += " FROM "+ actGeomTable +" g, USER_SDO_GEOM_METADATA m";
+ sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+
+ //if empty it calculates the centroids to all geometries
+ if(!Ids.empty())
+ sql += " AND object_id IN ("+ Ids +")";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TePoint point;
+ flag = portal->fetchGeometry(point);
+ centroidSet.add(point);
+ }while(flag);
+
+ delete portal;
+ return true;
+
+}
+
+bool
+TeOracleSpatial::nearestNeighbors(const string& actGeomTable, const string& actCollTable, TeGeomRep actRep, const string& objId1, Keys& actIdsOut, int numRes)
+{
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) getPortal();
+
+ if(!nearestNeighbors(actGeomTable, actCollTable, actRep, objId1, portal, numRes))
+ {
+ delete portal;
+ return false;
+ }
+
+ actIdsOut.clear();
+ while(portal->fetchRow())
+ {
+ string objId = portal->getData ("object_id");
+ actIdsOut.push_back(objId);
+ }
+
+ sort(actIdsOut.begin(), actIdsOut.end());
+ unique(actIdsOut.begin(), actIdsOut.end());
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::nearestNeighbors(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, const string& visCollTable, TeGeomRep visRep, Keys& visIdsOut, int numRes)
+{
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) getPortal();
+
+ if(!nearestNeighbors(actGeomTable, actRep, objId1, visGeomTable, visCollTable, visRep, portal, numRes))
+ {
+ delete portal;
+ return false;
+ }
+
+ visIdsOut.clear();
+ while(portal->fetchRow())
+ {
+ string objId = portal->getData ("object_id");
+ visIdsOut.push_back(objId);
+ }
+
+ sort(visIdsOut.begin(), visIdsOut.end());
+ unique(visIdsOut.begin(), visIdsOut.end());
+
+ delete portal;
+ return true;
+}
+
+bool
+TeOracleSpatial::nearestNeighbors(const string& actGeomTable, const string& actCollTable, TeGeomRep /* actRep */, const string& objId1, TeDatabasePortal* portal, int numRes)
+{
+ string actGeomColl = "spatial_data";
+
+ //select the spatial index
+ string index = " SELECT INDEX_NAME FROM USER_SDO_INDEX_INFO";
+ index += " WHERE TABLE_NAME = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+
+ portal->freeResult();
+ if(!portal->query(index) || !portal->fetchRow())
+ return false;
+
+ string indexName = string(portal->getData(0));
+ string perf = "/*+ INDEX("+ TeConvertToUpperCase(actGeomTable) +" "+ indexName +") */ ";
+
+ string sql = "SELECT "+ perf +" geomTable1.* ";
+ sql += " FROM "+ actGeomTable +" geomTable1,";
+ sql += actGeomTable + " geomTable2 ";
+
+ if(!actCollTable.empty())
+ {
+ sql += ", "+ actCollTable +" collTable ";
+ sql += " WHERE ";
+ sql += " geomTable1.object_id = collTable.c_object_id AND ";
+ }
+ else
+ sql += " WHERE ";
+
+ sql += " SDO_NN(geomTable1."+ actGeomColl +", geomTable2."+ actGeomColl +", 'sdo_batch_size=10')='TRUE' AND ";
+ sql += " geomTable2.object_id = '" + objId1 + "' AND ";
+ sql += " geomTable1.object_id <> '"+ objId1 +"' AND ";
+ sql += " ROWNUM <= "+ Te2String(numRes);
+
+ portal->freeResult();
+ if(!((TeOracleSpatialPortal*)portal)->querySDO(sql))
+ return false;
+
+ return true;
+}
+
+bool
+TeOracleSpatial::nearestNeighbors(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& visGeomTable, const string& visCollTable, TeGeomRep /* visRep */, TeDatabasePortal* portal, int numRes)
+{
+ string actGeomColl = "spatial_data";
+ string visGeomColl = "spatial_data";
+
+ //select the spatial index
+ string index = " SELECT INDEX_NAME FROM USER_SDO_INDEX_INFO";
+ index += " WHERE TABLE_NAME = '"+ TeConvertToUpperCase(visGeomTable) +"'";
+
+ portal->freeResult();
+ if(!portal->query(index) || !portal->fetchRow())
+ return false;
+
+ string indexName = string(portal->getData(0));
+ string perf = "/*+ INDEX("+ TeConvertToUpperCase(visGeomTable) +" "+ indexName +") */ ";
+ string nres = " ROWNUM <= "+ numRes;
+
+ string sql = "SELECT "+ perf +" geomTable1.* ";
+ sql += " FROM "+ visGeomTable +" geomTable1,";
+ sql += actGeomTable + " geomTable2 ";
+
+ if(!visCollTable.empty())
+ {
+ sql += ", "+ visCollTable +" collTable";
+ sql += " WHERE ";
+ sql += " geomTable1.object_id = collTable.c_object_id AND ";
+ }
+ else
+ sql += " WHERE ";
+
+ sql += " SDO_NN(geomTable1."+ actGeomColl +", geomTable2."+ actGeomColl;
+ sql += ", 'sdo_batch_size=10') = 'TRUE' AND ";
+ sql += " geomTable2.object_id = '" + objId1 + "' AND ";
+ sql += " ROWNUM <= "+ Te2String(numRes);
+
+ portal->freeResult();
+ if(!((TeOracleSpatialPortal*)portal)->querySDO(sql))
+ return false;
+
+ return true;
+}
+
+
+//Intersection entre dois objetos geogr�ficos de uma mesma tabela
+
+
+bool
+TeOracleSpatial::geomIntersection(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIds, TeGeometryVect& geomVect)
+{
+ string actGeomColl = "spatial_data";
+ string Ids = getStringIds(actIds);
+
+ string sql = "SELECT SDO_GEOM.SDO_INTERSECTION(g1."+ actGeomColl +", m.diminfo, ";
+ sql += " g2."+ actGeomColl +", m.diminfo)";
+ sql += " FROM "+ actGeomTable +" g1,"+ actGeomTable +" g2, USER_SDO_GEOM_METADATA m";
+ sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND object_id IN ("+ Ids +")";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if((!portal->query(sql))||(!portal->fetchRow()))
+ return false;
+
+ bool flag = true;
+ do
+ {
+ bool result=false;
+ TeGeometry* geom = new TeGeometry();
+ TeGeometry* geom2 = geom;
+ flag = portal->getGeometry(&geom, result);
+ if(result)
+ geomVect.push_back (geom);
+ delete geom2;
+ }while(flag);
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::geomIntersection(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& visGeomTable, TeGeomRep /* visRep */, const string& objId2, TeGeometryVect& geomVect)
+{
+ string actGeomColl = "spatial_data";
+ string visGeomColl = "spatial_data";
+
+ string sql = "SELECT SDO_GEOM.SDO_INTERSECTION(g1."+ actGeomColl +", m1.diminfo, ";
+ sql += " g2."+ visGeomColl +", m2.diminfo)";
+ sql += " FROM "+ actGeomTable +" g1,"+ visGeomTable +" g2, ";
+ sql += " USER_SDO_GEOM_METADATA m1, USER_SDO_GEOM_METADATA m2 ";
+ sql += " WHERE m1.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m1.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND m2.table_name = '"+ TeConvertToUpperCase(visGeomTable) +"'";
+ sql += " AND m2.column_name = '"+ TeConvertToUpperCase(visGeomColl) +"'";
+ sql += " AND g1.object_id = '"+ objId1 +"'";
+ sql += " AND g2.object_id = '"+ objId2 +"'";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ bool flag = true;
+ do
+ {
+ bool result=false;
+ TeGeometry* geom = new TeGeometry();
+ TeGeometry* geom2 = geom;
+ flag = portal->getGeometry(&geom, result);
+ if(result)
+ geomVect.push_back (geom);
+ delete geom2;
+ }while(flag);
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::geomDifference(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& visGeomTable, TeGeomRep /* visRep */, const string& objId2, TeGeometryVect& geomVect)
+{
+ string actGeomColl = "spatial_data";
+ string visGeomColl = "spatial_data";
+
+ string sql = "SELECT SDO_GEOM.SDO_DIFFERENCE(g1."+ actGeomColl +", m1.diminfo, ";
+ sql += " g2."+ visGeomColl +", m2.diminfo)";
+ sql += " FROM "+ actGeomTable +" g1,"+ visGeomTable +" g2, ";
+ sql += " USER_SDO_GEOM_METADATA m1, USER_SDO_GEOM_METADATA m2 ";
+ sql += " WHERE m1.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m1.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND m2.table_name = '"+ TeConvertToUpperCase(visGeomTable) +"'";
+ sql += " AND m2.column_name = '"+ TeConvertToUpperCase(visGeomColl) +"'";
+ sql += " AND g1.object_id = '"+ objId1 +"'";
+ sql += " AND g2.object_id = '"+ objId2 +"'";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ bool flag = true;
+ do
+ {
+ bool result=false;
+ TeGeometry* geom = new TeGeometry();
+ TeGeometry* geom2 = geom;
+ flag = portal->getGeometry(&geom, result);
+ if(result)
+ geomVect.push_back (geom);
+ delete geom2;
+ }while(flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeOracleSpatial::geomDifference(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& objId2, TeGeometryVect& geomVect)
+{
+ string actGeomColl = "spatial_data";
+
+ string sql = "SELECT SDO_GEOM.SDO_DIFFERENCE(g1."+ actGeomColl +", m.diminfo, ";
+ sql += " g2."+ actGeomColl +", m.diminfo)";
+ sql += " FROM "+ actGeomTable +" g1,"+ actGeomTable +" g2, USER_SDO_GEOM_METADATA m";
+ sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND g1.object_id = '"+ objId1 +"'";
+ sql += " AND g2.object_id = '"+ objId2 +"'";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ bool flag = true;
+ do
+ {
+ bool result=false;
+ TeGeometry* geom = new TeGeometry();
+ TeGeometry* geom2 = geom;
+ flag = portal->getGeometry(&geom, result);
+ if(result)
+ geomVect.push_back (geom);
+ delete geom2;
+ }while(flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeOracleSpatial::geomXOr(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& objId2, TeGeometryVect& geomVect)
+{
+ string actGeomColl = "spatial_data";
+
+ string sql = "SELECT SDO_GEOM.SDO_XOR(g1."+ actGeomColl +", m.diminfo, ";
+ sql += " g2."+ actGeomColl +", m.diminfo)";
+ sql += " FROM "+ actGeomTable +" g1,"+ actGeomTable +" g2, USER_SDO_GEOM_METADATA m";
+ sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND g1.object_id = '"+ objId1 +"'";
+ sql += " AND g2.object_id = '"+ objId2 +"'";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ bool flag = true;
+ do
+ {
+ bool result=false;
+ TeGeometry* geom = new TeGeometry();
+ TeGeometry* geom2 = geom;
+ flag = portal->getGeometry(&geom, result);
+ if(result)
+ geomVect.push_back (geom);
+ delete geom2;
+ }while(flag);
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::geomXOr(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& visGeomTable, TeGeomRep /* visRep */, const string& objId2, TeGeometryVect& geomVect)
+{
+ string actGeomColl = "spatial_data";
+ string visGeomColl = "spatial_data";
+
+ string sql = "SELECT SDO_GEOM.SDO_XOR(g1."+ actGeomColl +", m1.diminfo, ";
+ sql += " g2."+ visGeomColl +", m2.diminfo)";
+ sql += " FROM "+ actGeomTable +" g1,"+ visGeomTable +" g2, ";
+ sql += " USER_SDO_GEOM_METADATA m1, USER_SDO_GEOM_METADATA m2 ";
+ sql += " WHERE m1.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m1.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND m2.table_name = '"+ TeConvertToUpperCase(visGeomTable) +"'";
+ sql += " AND m2.column_name = '"+ TeConvertToUpperCase(visGeomColl) +"'";
+ sql += " AND g1.object_id = '"+ objId1 +"'";
+ sql += " AND g2.object_id = '"+ objId2 +"'";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ bool flag = true;
+ do
+ {
+ bool result=false;
+ TeGeometry* geom = new TeGeometry();
+ TeGeometry* geom2 = geom;
+ flag = portal->getGeometry(&geom, result);
+ if(result)
+ geomVect.push_back (geom);
+ delete geom2;
+ }while(flag);
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::geomUnion(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIds, TeGeometryVect& geomVect)
+{
+ string actGeomColl = "spatial_data";
+ string Ids = getStringIds(actIds);
+
+ string sql = "SELECT SDO_GEOM.SDO_UNION(g1."+ actGeomColl +", m.diminfo, ";
+ sql += " g2."+ actGeomColl +", m.diminfo)";
+ sql += " FROM "+ actGeomTable +" g1,"+ actGeomTable +" g2, USER_SDO_GEOM_METADATA m";
+ sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND object_id IN ("+ Ids +")";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ bool flag = true;
+ do
+ {
+ bool result=false;
+ TeGeometry* geom = new TeGeometry();
+ TeGeometry* geom2 = geom;
+ flag = portal->getGeometry(&geom, result);
+ if(result)
+ geomVect.push_back (geom);
+ delete geom2;
+ }while(flag);
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::geomUnion(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& visGeomTable, TeGeomRep /* visRep */, const string& objId2, TeGeometryVect& geomVect)
+{
+ string actGeomColl = "spatial_data";
+ string visGeomColl = "spatial_data";
+
+ string sql = "SELECT SDO_GEOM.SDO_UNION(g1."+ actGeomColl +", m1.diminfo, ";
+ sql += " g2."+ visGeomColl +", m2.diminfo)";
+ sql += " FROM "+ actGeomTable +" g1,"+ visGeomTable +" g2, ";
+ sql += " USER_SDO_GEOM_METADATA m1, USER_SDO_GEOM_METADATA m2 ";
+ sql += " WHERE m1.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+ sql += " AND m1.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'";
+ sql += " AND m2.table_name = '"+ TeConvertToUpperCase(visGeomTable) +"'";
+ sql += " AND m2.column_name = '"+ TeConvertToUpperCase(visGeomColl) +"'";
+ sql += " AND g1.object_id = '"+ objId1 +"'";
+ sql += " AND g2.object_id = '"+ objId2 +"'";
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ bool flag = true;
+ do
+ {
+ bool result=false;
+ TeGeometry* geom = new TeGeometry();
+ TeGeometry* geom2 = geom;
+ flag = portal->getGeometry(&geom, result);
+ if(result)
+ geomVect.push_back (geom);
+ delete geom2;
+ }while(flag);
+
+ delete portal;
+ return true;
+}
+
+
+//End Spatial Query
+
+
+bool
+TeOracleSpatialPortal::fetchGeometry (TePolygon& poly)
+{
+ int elem,elemnext,i,k,elemType, sdoInterp;
+
+ try
+ {
+ int ndim = GetDimArraySize();
+
+ if(ndim==0)
+ return false;
+
+ vector<TeCoord2D> coordinates;
+ if(!cursor->GetCoordinates (coordinates))
+ return false;
+
+ //number of the oordinates in the SDO_GEOMETRY
+ int noords = NumberOfOrdinates();
+
+ //Indicates the type of the SDO_GEOMETRY
+ int sdoEType;
+ GetDimElement(2,sdoEType);
+
+ int geomId = atoi(getData("geom_id"));
+ string objId = string(getData("object_id"));
+
+ // 1005: compound polygon: Compound polygon with some vertices connected by straight
+ //line segments and some by circular arcs.
+ if((sdoEType==1005) || (sdoEType==2005))
+ {
+ TeLine2D lin;
+ //nelem: number of elemnts
+ int nelem;
+ GetDimElement(3,nelem);
+
+ //posinit is initial position in the vector
+ int posinit=0; //1;
+ //ipoxmax: second element position in the ordinates array
+ int iposmax=7;
+
+ int posmax;
+ bool thisElemArc = false;
+
+ //keep the last point of the element
+ //TePoint lastPoint;
+
+ //for each element
+ for(elem=1; elem<=nelem; elem++)
+ {
+ //to catch the last position of the element: iposmax
+ if(elem==nelem)
+ posmax = noords+1;
+ else
+ GetDimElement(iposmax, posmax);
+
+ //verify if the element is a arc
+ GetDimElement((iposmax-1), elemType);
+ if(elemType == 2)
+ thisElemArc = true;
+ else
+ thisElemArc = false;
+
+ //ptSet: ordinates of the element
+ TePointSet ptSet;
+
+ //to catch all coords of the element
+ int pos=0;
+
+ for(pos=posinit; pos<((posmax-1)/2);++pos)
+ {
+ TePoint pt(coordinates[pos]);
+ ptSet.add(pt);
+ }
+
+ if(thisElemArc)
+ {
+ //pegar o pr�ximo
+ if(elem!=nelem)
+ {
+ TePoint pt(coordinates[pos]);
+ ptSet.add(pt);
+ }
+
+ int size = ptSet.size();
+ for(int s=1; (s+1)<size; s=s+2)
+ {
+ TeLine2D arc;
+ TeGenerateArc (ptSet[s-1], ptSet[s], ptSet[s+1], arc, 10);
+
+ int sz = arc.size();
+ for(int i=0; i<sz; i++)
+ lin.add(arc[i]);
+ }
+ }
+
+ else //line segment
+ {
+ int size = ptSet.size();
+ for(int s=0; s<size; s++)
+ lin.add(ptSet[s].location());
+ }
+
+ iposmax+=3;
+ posinit=pos; //skip first coordinate: equal last point of previous element
+
+ } //for each element
+
+ TeLinearRing rg(lin);
+ rg.objectId(objId);
+ rg.geomId(geomId);
+ poly.add(rg);
+ }
+
+ else if((sdoEType==1003)||(sdoEType==2003)) //no complex
+ {
+ for(i=1;i<=ndim;i+=3)
+ {
+ TeLine2D line;
+ GetDimElement(i,elem); // oordinate position
+ if((i+3) > ndim)
+ elemnext = noords+1;
+ else
+ GetDimElement(i+3,elemnext);
+
+ GetDimElement(i+2,sdoInterp); // sdo interpretation
+ // sdoInterp = 3: Rectangle type
+ // sdoInterp = 2: Polygon made up of a connected sequence of circular arcs
+
+ if(sdoInterp==2)
+ {
+ //para gerar o arco
+ TePoint pt1;
+ TePoint pt2;
+ TePoint pt3;
+
+ int cont=0;
+ int k = elem/2;
+ while (k<(elemnext/2))
+ {
+ for(int i=0; i<3; i++)
+ {
+ TeCoord2D pt = coordinates[k];
+
+ if(i==0)
+ {
+ if(!cont)
+ pt1.add(pt);
+ else
+ {
+ pt1.add(pt3.location());
+ pt2.add(pt);
+ ++i;
+ }
+ }
+ else if (i==1)
+ pt2.add(pt);
+ else if (i==2)
+ pt3.add(pt);
+
+ ++cont;
+ ++k;
+ }
+
+ TeLine2D arc;
+ TeGenerateArc (pt1, pt2, pt3, arc, 20);
+
+ int s = arc.size();
+ for(int j=0; j<s; j++)
+ line.add(arc[j]);
+ }
+ }
+ else
+ {
+ // ler os pontos
+ for(k=(elem/2);k<(elemnext/2);k++)
+ {
+ TeCoord2D pt = coordinates[k];
+ line.add(pt);
+ }
+
+ if(sdoInterp==3) // rectangle
+ {
+ double xmin,ymin, xmax, ymax;
+ xmin = line.box().x1();
+ ymin = line.box().y1();
+ xmax = line.box().x2();
+ ymax = line.box().y2();
+
+ line.clear();
+ TeCoord2D pt1(xmin,ymin);
+ line.add(pt1);
+ TeCoord2D pt2(xmin,ymax);
+ line.add(pt2);
+ TeCoord2D pt3(xmax,ymax);
+ line.add(pt3);
+ TeCoord2D pt4(xmax,ymin);
+ line.add(pt4);
+ line.add(pt1);
+ }
+ }
+
+ TeLinearRing ring(line);
+ ring.objectId (objId);
+ ring.geomId(geomId);
+ poly.add(ring);
+ }
+ }
+ poly.objectId(objId);
+ poly.geomId(geomId);
+ return(this->fetchRow());
+ }
+ catch(...)
+ {
+ errorMessage_ = cursor->getErrorMessage();
+ return false;
+ }
+}
+
+
+bool
+TeOracleSpatialPortal::getGeometry (TeGeometry** geom, bool& result)
+{
+ TeSDOGType gType;
+ bool flag=true;
+
+ try
+ {
+ this->GetGeometryType(gType);
+
+ if(gType==TeSDOPOLYGON)
+ {
+ TePolygon poly, *pol;
+ flag = this->fetchGeometry(poly);
+ pol = new TePolygon();
+ *pol = poly;
+ *geom = pol;
+ result = true;
+ return flag;
+ }
+ else if(gType==TeSDOLINE)
+ {
+ TeLine2D line, *lin;
+ flag = this->fetchGeometry(line);
+ lin = new TeLine2D();
+ *lin = line;
+ *geom = lin;
+ result = true;
+ return flag;
+ }
+ else if(gType==TeSDOPOINT)
+ {
+ TePoint point, *pnt;
+ flag = this->fetchGeometry(point);
+ pnt = new TePoint();
+ *pnt = point;
+ *geom = pnt;
+ result = true;
+ return flag;
+ }
+
+ else if(gType==TeSDOMULTIPOLYGON)
+ {
+ TePolygonSet polySet, *polSet;
+ flag = this->fetchGeometry(polySet);
+ polSet = new TePolygonSet();
+ *polSet = polySet;
+ *geom = polSet;
+ result = true;
+ return flag;
+ }
+ else if(gType==TeSDOMULTILINE)
+ {
+ TeLineSet lineSet, *linSet;
+ flag = this->fetchGeometry(lineSet);
+ linSet = new TeLineSet();
+ *linSet = lineSet;
+ *geom = linSet;
+ result = true;
+ return flag;
+ }
+ else if(gType==TeSDOMULTIPOINT)
+ {
+ TePointSet pointSet, *pntSet;
+ flag = this->fetchGeometry(pointSet);
+ pntSet = new TePointSet();
+ *pntSet = pointSet;
+ *geom = pntSet;
+ result = true;
+ return flag;
+ }
+
+ }
+ catch(...)
+ {
+ result = false;
+ return false;
+ }
+
+ result = false;
+ return (this->fetchRow());
+}
+
+
+bool
+TeOracleSpatialPortal::fetchGeometry (TePolygonSet& polySet)
+{
+ int elem,elemnext,i,k,sdoInterp;
+ vector<TeCoord2D> coordinates;
+
+ try
+ {
+ int ndim = GetDimArraySize();
+ if(ndim==0)
+ return false;
+
+ TePolygonSet polyHoles;
+ TeSDOGType gType;
+
+ GetGeometryType(gType);
+
+ if(gType==TeSDOPOLYGON)
+ {
+ TePolygon poly;
+ bool res = fetchGeometry(poly);
+ polySet.add(poly);
+ return res;
+ }
+
+ if(!cursor->GetCoordinates(coordinates))
+ return false;
+
+ int noords = NumberOfOrdinates();
+
+ int geomId = atoi(getData("geom_id"));
+ string objId = string(getData("object_id"));
+
+ bool hasHole = false;
+
+ for(i=1;i<=ndim;i+=3)
+ {
+ int eType;
+ TeLine2D line;
+ TePolygon poly;
+ GetDimElement(i,elem); // oordinate position
+ if((i+3) > ndim)
+ elemnext = noords+1;
+ else
+ GetDimElement(i+3,elemnext);
+
+ GetDimElement(i+1, eType); // sdo_etype do proximo elemento
+ GetDimElement(i+2,sdoInterp); // sdo_interpretation
+
+ if(eType==2003)
+ poly = polyHoles.last();
+
+ // ler os pontos
+ for(k=(elem/2);k<(elemnext/2);k++)
+ {
+ TeCoord2D pt(coordinates[k]);
+ line.add(pt);
+ }
+
+ if(sdoInterp == 3) // rectangle
+ {
+
+ double xmin,ymin, xmax, ymax;
+ xmin = line.box().x1();
+ ymin = line.box().y1();
+ xmax = line.box().x2();
+ ymax = line.box().y2();
+
+ line.clear();
+ TeCoord2D pt1(xmin,ymin);
+ line.add(pt1);
+ TeCoord2D pt2(xmin,ymax);
+ line.add(pt2);
+ TeCoord2D pt3(xmax,ymax);
+ line.add(pt3);
+ TeCoord2D pt4(xmax,ymin);
+ line.add(pt4);
+ line.add(pt1);
+ }
+ TeLinearRing ring(line);
+ ring.objectId (objId);
+ ring.geomId(geomId);
+
+ poly.add(ring);
+
+ //verificar se o proximo � hole
+ hasHole=false;
+ if(i+4<ndim)
+ {
+ GetDimElement(i+4, eType); // sdo_etype do proximo elemento
+ if(eType == 2003)
+ hasHole = true;
+ }
+ poly.objectId(objId);
+ poly.geomId(geomId);
+
+ if(!hasHole)
+ polySet.add(poly);
+ else
+ polyHoles.add(poly);
+ } //for
+
+ polySet.objectId(objId);
+ polySet.geomId(geomId);
+
+ return(this->fetchRow());
+ }
+ catch(...)
+ {
+ errorMessage_ = cursor->getErrorMessage();
+ return false;
+ }
+}
+
+
+bool
+TeOracleSpatial::insertLine (const string& table, TeLine2D &line)
+{
+
+ string elinfo = "1, 2, 1";
+
+ if(!AllocateOrdinatesObject(line))
+ return false;
+
+ string ins = "INSERT INTO " + table + " ( ";
+ ins += " geom_id, object_id, spatial_data) VALUES ( ";
+ ins += getNameSequence(table) +".NEXTVAL";
+ ins += ", '" + escapeSequence(line.objectId()) + "'";
+ ins += ", MDSYS.SDO_GEOMETRY(2002, NULL, NULL";
+ ins += ", MDSYS.SDO_ELEM_INFO_ARRAY( " + elinfo + " )";
+ ins += ", :ordinates) ";
+ ins += " )";
+
+ //OCI
+ if(!Conn->ExecuteSDOSTM(ins))
+ {
+ errorMessage_ = "Error inserting in the table " + table + "!";
+ return false;
+ }
+
+ /*
+ string seq = "SELECT "+ getNameSequence(table) +".CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence " + table + "_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ line.geomId(index);
+ delete ocip;
+ */
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::updateLine(const string& table, TeLine2D &line)
+{
+ string elinfo = "1, 2, 1";
+
+ if(!AllocateOrdinatesObject(line))
+ return false;
+
+ string sql;
+ sql = "UPDATE " + table + " SET ";
+ sql += " object_id= '" + line.objectId() + "'";
+ sql += ", spatial_data = ";
+ sql += " MDSYS.SDO_GEOMETRY(2002, NULL, NULL";
+ sql += ", MDSYS.SDO_ELEM_INFO_ARRAY( " + elinfo + " )";
+ sql += ", :ordinates) ";
+ sql += " WHERE geom_id = " + line.geomId ();
+
+ //OCI
+ if(!Conn->ExecuteSDOSTM(sql))
+ {
+ errorMessage_ = "Error updating in the table " + table + "!";
+ return false;
+ }
+ return true;
+}
+
+
+bool
+TeOracleSpatial::loadLineSet (const string& table, const string& geoid, TeLineSet &ls)
+{
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string q ="SELECT * FROM " + table;
+ if (geoid != "")
+ q += " WHERE object_id = '" + geoid +"'";
+
+ if (!ocip->query(q) || !ocip->fetchRow())
+ {
+ delete ocip;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TeLine2D line;
+ flag = ocip->fetchGeometry(line);
+ ls.add ( line );
+ }while(flag);
+
+ delete ocip;
+ return true;
+}
+
+bool
+TeOracleSpatial::loadLineSet (const string& table, TeBox &bb, TeLineSet &linSet)
+{
+ TeOracleSpatialPortal *portal = (TeOracleSpatialPortal*)getPortal();
+ if (!portal)
+ return false;
+
+ string q;
+ q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere (bb, TeLINES);
+ q += " ORDER BY object_id";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ bool flag = true;
+ do
+ {
+ TeLine2D lin;
+ flag = portal->fetchGeometry(lin);
+ linSet.add(lin);
+ }
+ while (flag);
+ delete portal;
+ return true;
+}
+
+TeDatabasePortal*
+TeOracleSpatial::loadLineSet (const string& table, TeBox &box)
+{
+ TeOracleSpatialPortal *portal = (TeOracleSpatialPortal*) getPortal();
+ if (!portal)
+ return 0;
+
+ string q;
+ q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere (box, TeLINES);
+ q += " ORDER BY object_id";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return 0;
+ }
+ return portal;
+}
+
+bool
+TeOracleSpatialPortal::fetchGeometry (TeLine2D& line)
+{
+ int i;
+ vector<TeCoord2D> coordinates;
+
+ try
+ {
+ if(!cursor->GetCoordinates(coordinates))
+ return false;
+
+ int noords = NumberOfOrdinates();
+ if(noords==0)
+ return false;
+
+ for(i=0;i<noords/2;i++)
+ line.add(coordinates[i]);
+
+ line.geomId (atoi(getData("geom_id")));
+ line.objectId(string(getData("object_id")));
+ return (this->fetchRow());
+ }
+ catch(...)
+ {
+ errorMessage_ = cursor->getErrorMessage();
+ return false;
+ }
+}
+
+
+bool
+TeOracleSpatialPortal::fetchGeometry (TeLineSet& lineSet)
+{
+ vector<TeCoord2D> coordinates;
+ int elem,elemnext,i,k;
+
+ try
+ {
+ int ndim = GetDimArraySize();
+ if(ndim==0)
+ return false;
+
+ int noords = NumberOfOrdinates();
+ int geomId = atoi(getData("geom_id"));
+ string objId = string(getData("object_id"));
+
+ TeSDOGType gType;
+ GetGeometryType(gType);
+
+ if(gType==TeSDOLINE)
+ {
+ TeLine2D line;
+ fetchGeometry(line);
+ lineSet.add(line);
+ return true;
+ }
+
+ if(!cursor->GetCoordinates(coordinates))
+ return false;
+
+ for(i=1;i<=ndim;i+=3)
+ {
+ TeLine2D line;
+ GetDimElement(i,elem); // oordinate position
+ if((i+3) > ndim)
+ elemnext = noords+1;
+ else
+ GetDimElement(i+3,elemnext);
+
+ // ler os pontos
+ for(k=(elem/2);k<(elemnext/2);k++)
+ {
+ TeCoord2D pt(coordinates[k]);
+ line.add(pt);
+ }
+ line.objectId (objId);
+ line.geomId(geomId);
+ lineSet.add(line);
+ }
+
+ lineSet.objectId(objId);
+ lineSet.geomId(geomId);
+
+ return (this->fetchRow());
+ }
+ catch(...)
+ {
+ errorMessage_ = cursor->getErrorMessage();
+ return false;
+ }
+}
+
+
+bool
+TeOracleSpatial::insertPoint(const string& table, TePoint &point)
+{
+
+ string ins = "INSERT INTO " + table + " ( ";
+ ins += " geom_id, object_id, spatial_data) ";
+ ins += " VALUES ( ";
+ ins += getNameSequence(table) +".NEXTVAL";
+ ins += ", '" + escapeSequence(point.objectId()) + "'";
+ ins += ", MDSYS.SDO_GEOMETRY(2001, NULL, ";
+ ins += "MDSYS.SDO_POINT_TYPE( ";
+ ins += Te2String(point.location().x());
+ ins += ", " + Te2String(point.location().y());
+ ins += ", NULL )";
+ ins += ", NULL, NULL)";
+ ins += " ) ";
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table " + table + "!";
+ return false;
+ }
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string seq = "SELECT "+ getNameSequence(table) +".CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence " + table + "_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ point.geomId(index);
+ delete ocip;
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::updatePoint (const string& table, TePoint &point)
+{
+ string sql;
+ sql = "UPDATE " + table + " SET ";
+ sql += "object_id = '" + point.objectId() + "'";
+ sql += ", spatial_data = ";
+ sql += " MDSYS.SDO_GEOMETRY(2001, NULL";
+ sql += ", MDSYS.SDO_POINT_TYPE( ";
+ sql += Te2String(point.location ().x());
+ sql += ", " + Te2String(point.location ().y());
+ sql += ", NULL )";
+ sql += ", NULL, NULL)";
+ sql += " WHERE geom_id = " + Te2String(point.geomId());
+
+ if(!execute(sql))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error updating in the table " + table + "!";
+ return false;
+ }
+
+ return true;
+}
+
+
+bool
+TeOracleSpatialPortal::fetchGeometry(TePoint& p)
+{
+ double x,y;
+
+ try
+ {
+ if(!GetPointXYZ(x,y))
+ return false; //point in SDO_POINT
+
+ TeCoord2D c(x,y);
+ p.add(c);
+ p.objectId(string(getData("object_id")));
+ p.geomId(atoi(getData("geom_id")));
+ return(this->fetchRow());
+ }
+ catch(...)
+ {
+ errorMessage_ = cursor->getErrorMessage();
+ return false;
+ }
+}
+
+
+
+bool
+TeOracleSpatial::insertText (const string& table, TeText &text)
+{
+
+ string ins = "INSERT INTO " + table + " (geom_id, ";
+ ins += " object_id, x, y, text_value, angle, height, alignment_vert, ";
+ ins += " alignment_horiz) VALUES ( ";
+ ins += getNameSequence(table) +".NEXTVAL";
+ ins += ", '" + escapeSequence(text.objectId()) + "'";
+ ins += ", " + Te2String(text.location().x(),10);
+ ins += ", " + Te2String(text.location().y(),10);
+ ins += ", '" + escapeSequence(text.textValue()) + "'";
+ ins += ", " + Te2String(text.angle(),10);
+ ins += ", " + Te2String(text.height(),10);
+ ins += ", " + Te2String(text.alignmentVert(),10);
+ ins += ", " + Te2String(text.alignmentHoriz(),10);
+ ins += " )";
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table " + table + "!";
+ return false;
+ }
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string seq = "SELECT "+ getNameSequence(table) +".CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence " + table + "_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ text.geomId(index);
+ delete ocip;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::insertArc (const string& table, TeArc &arc)
+{
+
+ string ins = "INSERT INTO " + table + " (geom_id, ";
+ ins += " object_id, from_node, to_node ) ";
+ ins += " VALUES ( ";
+ ins += getNameSequence(table) +".NEXTVAL";
+ ins += ", '" + escapeSequence(arc.objectId()) + "'";
+ ins += ", " + Te2String(arc.fromNode().geomId());
+ ins += ", " + Te2String(arc.toNode().geomId());
+ ins += " )";
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table " + table + "!";
+ return false;
+ }
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string seq = "SELECT "+ getNameSequence(table) +".CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence " + table + "_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ arc.geomId(index);
+ delete ocip;
+
+ return true;
+}
+
+bool
+TeOracleSpatialPortal::fetchGeometry(TePointSet& pointSet)
+{
+ double x,y;
+ vector<TeCoord2D> coordinates;
+
+ x=y=-99999.;
+ try
+ {
+ int noords = NumberOfOrdinates();
+ if(noords==0)
+ return false;
+
+ TeSDOGType gType;
+ GetGeometryType(gType);
+
+ if(gType==TeSDOPOINT)
+ {
+ TePoint point;
+ fetchGeometry(point);
+ pointSet.add(point);
+ return true;
+ }
+
+ if(!cursor->GetCoordinates(coordinates))
+ return false;
+
+ int geomId = atoi(getData("geom_id"));
+ string objId = string(getData("object_id"));
+
+ for(int i=1;i<=noords/2;i++)
+ {
+ TePoint pt(coordinates[i-1]);
+ pt.geomId (geomId);
+ pt.objectId (objId);
+ pointSet.add(pt);
+ }
+
+ pointSet.objectId(objId);
+ pointSet.geomId(geomId);
+
+ return(this->fetchRow());
+ }
+ catch(...)
+ {
+ errorMessage_ = cursor->getErrorMessage();
+ return false;
+ }
+}
+
+
+bool
+TeOracleSpatial::insertNode (const string& table, TeNode &node)
+{
+ string ins = "INSERT INTO " + table + " ( ";
+ ins += " geom_id, object_id, spatial_data) ";
+ ins += " VALUES ( ";
+ ins += getNameSequence(table) +".NEXTVAL";
+ ins += ", '" + escapeSequence(node.objectId()) + "'";
+ ins += ", MDSYS.SDO_GEOMETRY(2001, NULL, ";
+ ins += "MDSYS.SDO_POINT_TYPE( ";
+ ins += Te2String(node.location().x());
+ ins += ", " + Te2String(node.location ().y());
+ ins += ", NULL )";
+ ins += ", NULL, NULL)";
+ ins += " ) ";
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table " + table + "!";
+ return false;
+ }
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string seq = "SELECT "+ getNameSequence(table) + ".CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence " + table + "_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ node.geomId(index);
+ delete ocip;
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::updateNode (const string& table, TeNode &node)
+{
+ string sql;
+ sql = "UPDATE " + table + " SET ";
+ sql += " object_id = '" + node.objectId() + "'";
+ sql += ", spatial_data = ";
+ sql += " MDSYS.SDO_GEOMETRY(2001, NULL";
+ sql += ", MDSYS.SDO_POINT_TYPE( ";
+ sql += Te2String(node.location ().x());
+ sql += ", " + Te2String(node.location ().y());
+ sql += ", NULL )";
+ sql += ", NULL, NULL)";
+ sql += " WHERE geom_id = " + Te2String(node.geomId());
+
+ if(!execute(sql))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error updating in the table " + table + "!";
+ return false;
+ }
+ return true;
+}
+
+bool
+TeOracleSpatialPortal::fetchGeometry(TeNode& n)
+{
+ double x,y;
+ x=y=-99999.;
+ try
+ {
+ if(!GetPointXYZ(x,y))
+ return false;
+
+ TeCoord2D point(x,y);
+ n.add(point);
+ n.geomId(atoi(getData("geom_id")));
+ n.objectId(string(getData("object_id")));
+ return(this->fetchRow());
+ }
+ catch(...)
+ {
+ errorMessage_ = cursor->getErrorMessage();
+ return false;
+ }
+}
+
+
+
+bool
+TeOracleSpatial::insertCell (const string& table, TeCell &cell )
+{
+
+ TeBox b = cell.box();
+
+ string ins = "INSERT INTO " + table + " ( ";
+ ins += " geom_id, object_id, col_number, row_number, spatial_data) ";
+ ins += " VALUES ( ";
+ ins += getNameSequence(table) +".NEXTVAL";
+ ins += ", '" + escapeSequence(cell.objectId ()) + "'";
+ ins += ", " + Te2String(cell.column ());
+ ins += ", " + Te2String(cell.line ());
+ ins += ", MDSYS.SDO_GEOMETRY(2003, NULL, NULL";
+ ins += ", MDSYS.SDO_ELEM_INFO_ARRAY( 1, 1003, 3 )";
+ ins += ", MDSYS.SDO_ORDINATE_ARRAY( " ;
+ ins += Te2String(b.lowerLeft().x());
+ ins += ", " + Te2String(b.lowerLeft().y());
+ ins += ", " + Te2String(b.upperRight().x());
+ ins += ", " + Te2String(b.upperRight().y());
+ ins += ")) ";
+ ins += " )";
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table " + table + "!";
+ return false;
+ }
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string seq = "SELECT "+ getNameSequence(table) +".CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence " + table + "_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ cell.geomId(index);
+ delete ocip;
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::updateCell(const string& table, TeCell &cell)
+{
+ TeBox b = cell.box ();
+
+ string sql;
+ sql = "UPDATE " + table + " SET ";
+ sql += " object_id= '" + cell.objectId() + "'";
+ sql += " col_number= " + Te2String(cell.column ());
+ sql += " row_number= " + Te2String(cell.line ());
+ sql += " spatial_data= ";
+ sql += " MDSYS.SDO_GEOMETRY(2003, NULL, NULL";
+ sql += ", MDSYS.SDO_ELEM_INFO_ARRAY( 1, 1003, 3 )";
+ sql += ", MDSYS.SDO_ORDINATE_ARRAY( " ;
+ sql += Te2String(b.lowerLeft().x());
+ sql += ", " + Te2String(b.lowerLeft().y());
+ sql += ", " + Te2String(b.upperRight().x());
+ sql += ", " + Te2String(b.upperRight().y());
+ sql += ")) ";
+ sql += " WHERE geom_id = " + cell.geomId ();
+
+ if(!execute(sql))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error updating in the table " + table + "!";
+ return false;
+ }
+
+ return true;
+}
+
+
+char* TeOracleSpatialPortal ::getData (int i)
+{
+
+ char* result;
+ if (i > numFields_ || i < 0)
+ return "";
+
+ try
+ {
+ result = cursor->GetFieldValue(i+1);
+ }
+ catch(...)
+ {
+ errorMessage_ = "Error!";
+ return "";
+ }
+ return result;
+
+}
+
+char* TeOracleSpatialPortal ::getData (const string &s)
+{
+ string attstr;
+ char* result;
+
+ string fieldName;
+ size_t pos = s.find(".", string::npos,1);
+ if (pos != string::npos)
+ fieldName = s.substr(pos+1);
+ else
+ fieldName = s;
+
+ attstr = strupr((char*)(fieldName.c_str()));
+ int index = getColumnIndex (attstr);
+ if(index == -1)
+ return "";
+ else
+ result = getData(index);
+
+ return result;
+}
+
+
+int TeOracleSpatialPortal ::getInt (int i)
+{
+ double field;
+ char* fieldChar;
+
+ fieldChar = cursor->GetFieldValue(i+1);
+ field = atoi((const char*)fieldChar);
+
+ return (int)field;
+}
+
+int
+TeOracleSpatialPortal::getInt (const string& s)
+{
+ string attstr;
+
+ attstr = strupr((char*)(s.c_str()));
+ int index = getColumnIndex (attstr);
+ if(index == -1)
+ return (int)-1.;
+
+ return (getInt(index));
+}
+
+double TeOracleSpatialPortal ::getDouble (int i)
+{
+ double field;
+ char* fieldChar;
+
+ fieldChar = cursor->GetFieldValue(i+1);
+ field = atof((const char*)fieldChar);
+
+ return field;
+}
+
+double
+TeOracleSpatialPortal::getDouble (const string& s)
+{
+ string attstr;
+
+ attstr = strupr((char*)(s.c_str()));
+ int index = getColumnIndex (attstr);
+ if(index == -1)
+ return -1.;
+
+ return (getDouble(index));
+}
+
+
+bool
+TeOracleSpatialPortal::getBool(int i)
+{
+ char* fieldChar=0;
+
+ fieldChar = cursor->GetFieldValue(i+1);
+ if(fieldChar == 0)
+ return false;
+
+ return true;
+}
+
+
+bool
+TeOracleSpatialPortal::getBool (const string& s)
+{
+ string attstr;
+
+ attstr = strupr((char*)(s.c_str()));
+ int index = getColumnIndex (attstr);
+ if(index == -1)
+ return 0;
+
+ return (getBool(index));
+}
+
+bool
+TeOracleSpatial::insertMetadata(const string &table, const string &column, double tolx,double toly,TeBox &box,short /* srid */)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string check = "SELECT * FROM USER_SDO_GEOM_METADATA ";
+ check += " WHERE TABLE_NAME = '" + TeConvertToUpperCase(table);
+ check += "' AND COLUMN_NAME = '" + TeConvertToUpperCase(column) + "'";
+ if(!ocip->query(check))
+ {
+ delete ocip;
+ return false;
+ }
+
+ if(ocip->fetchRow())
+ {
+ delete ocip;
+ return false;
+ }
+
+ delete ocip;
+
+ double xmin = box.x1();
+ double ymin = box.y1();
+ double xmax = box.x2();
+ double ymax = box.y2();
+
+ string inser = "INSERT INTO USER_SDO_GEOM_METADATA VALUES ( ";
+ inser += "'" + TeConvertToUpperCase(table) + "' ," ;
+ inser += "'" + TeConvertToUpperCase(column) + "' ," ;
+ inser += " MDSYS.SDO_DIM_ARRAY(";
+ inser += " MDSYS.SDO_DIM_ELEMENT('X',";
+ inser += Te2String(xmin) + "," + Te2String(xmax,10) + "," + Te2String(tolx,10) + "), ";
+ inser += " MDSYS.SDO_DIM_ELEMENT('Y',";
+ inser += Te2String(ymin) + "," + Te2String(ymax,10) + "," + Te2String(toly,10) + ")), ";
+ inser += " NULL ) ";
+
+ if(!(execute(inser.c_str())))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table USER_SDO_GEOM_METADATA! ";
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeOracleSpatial::DeleteMetadata(const string &table, const string &column)
+{
+ string del = "DELETE FROM USER_SDO_GEOM_METADATA ";
+ del += " WHERE TABLE_NAME = '" + TeConvertToUpperCase(table);
+ del += "' AND COLUMN_NAME = '" + TeConvertToUpperCase(column) + "'";
+ if(!(execute(del.c_str ())))
+ return false;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::createSpatialIndex(const string &table, const string &column,TeSpatialIndexType type, short level, short tile)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+
+ string name;
+ if(table.size()>21)
+ name = TeConvertToUpperCase(table.substr(0,20)) + "_IDX";
+ else
+ name = TeConvertToUpperCase(table) + "_IDX";
+
+
+ string index = "SELECT * FROM USER_SDO_INDEX_INFO";
+ index += " WHERE table_name = '" + TeConvertToUpperCase(table) + "'";
+ if(!ocip->query(index))
+ {
+ delete ocip;
+ return false;
+ }
+
+ if(ocip->fetchRow())
+ {
+ errorMessage_ = "Spatial Index table already exist!";
+ delete ocip;
+ return false;
+ }
+
+ delete ocip;
+
+ index = " CREATE INDEX " + name;
+ index += " ON " + table + "(" + column + ")";
+ index += " INDEXTYPE IS MDSYS.SPATIAL_INDEX ";
+
+ if(type == TeQUADTREE)
+ {
+ if(level==0)
+ return false;
+
+ index += " PARAMETERS ('";
+ index += "SDO_LEVEL = " + Te2String(level);
+ index += " SDO_NUMTILES = " + Te2String(tile) + "'";
+ }
+
+ if(!execute(index))
+ return false;
+
+ return true;
+}
+
+bool
+TeOracleSpatial::RebuildSpatialIndex(const string &table)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string tabIndex;
+
+ string ind = "SELECT index_name FROM USER_SDO_INDEX_INFO";
+ ind += " WHERE table_name = '" + TeConvertToUpperCase(table) + "'";
+ if (!ocip->query(ind))
+ {
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ delete ocip;
+ return false;
+ }
+
+ tabIndex = string(ocip->getData(0));
+ delete ocip;
+
+ string reb = "ALTER INDEX ";
+ reb += tabIndex + " REBUILD";
+ if(!execute(reb))
+ return false;
+
+ return true;
+}
+
+bool
+TeOracleSpatial::DeleteSpatialIndex(const string &table)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string tabIndex;
+
+ string ind = "SELECT index_name FROM USER_SDO_INDEX_INFO";
+ ind += " WHERE table_name = '"+ TeConvertToUpperCase(table) +"'";
+ if (!ocip->query(ind))
+ {
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ delete ocip;
+ return false;
+ }
+
+ tabIndex = string(ocip->getData(0));
+ ocip->freeResult();
+ delete ocip;
+
+ string drop = "DROP INDEX "+ tabIndex;
+ if (!(execute(drop.c_str ())))
+ return false;
+ return true;
+}
+
+bool
+TeOracleSpatial::createSequence(const string &tableName)
+{
+ string nameSeq = getNameSequence(tableName);
+
+ string seq = " CREATE SEQUENCE " + nameSeq;
+ seq += " START WITH 1 INCREMENT BY 1 ORDER ";
+ if (!execute(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error creating sequence to table " + tableName + " !";
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeOracleSpatial::createAutoIncrementTrigger(const string &tableName, const string &fieldName)
+{
+ string nameTri = getNameTrigger(tableName);
+ string nameSeq = getNameSequence(tableName);
+
+ string tri;
+ tri = "CREATE TRIGGER " + nameTri;
+ tri += " BEFORE INSERT ON "+tableName;
+ tri += " for each row";
+ tri += " begin";
+ tri += " select "+nameSeq+".nextval";
+ tri += " into :new."+fieldName;
+ tri += " from dual;";
+ tri += " end;";
+
+ if(!execute(tri))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error creating trigger to table " + tableName + " !";
+ return false;
+ }
+ return true;
+}
+
+string
+TeOracleSpatial::getNameSequence(const string &tableName)
+{
+ string name;
+ if(tableName.size()>21)
+ name = tableName.substr(0,20) + "_seq";
+ else
+ name = tableName + "_seq";
+
+ return name;
+}
+
+string
+TeOracleSpatial::getNameTrigger(const string &tableName)
+{
+ string name;
+ if(tableName.size()>21)
+ name = tableName.substr(0,20) + "_tri";
+ else
+ name = tableName + "_tri";
+
+ return name;
+}
+
+
+int
+TeOracleSpatialPortal::GetDimArraySize()
+{
+ if(!cursor)
+ return 0;
+
+ return(cursor->GetDimArraySize());
+}
+
+bool
+TeOracleSpatialPortal::GetDimElement(int i,int &elem)
+{
+ if(!cursor)
+ return false;
+
+ return (cursor->GetDimElement(i,elem));
+}
+
+int
+TeOracleSpatialPortal::NumberOfOrdinates()
+{
+ if(!cursor)
+ return 0;
+
+ return(cursor->GetNumberOrdinates());
+}
+
+bool
+TeOracleSpatialPortal::GetCoordinates(int i,TeCoord2D& coord)
+{
+ if(!cursor)
+ return false;
+
+ return (cursor->GetCoordinates((i*2)-1,coord));
+}
+
+bool
+TeOracleSpatialPortal::GetGeometryType(TeSDOGType& gType)
+{
+ if(!cursor)
+ return false;
+
+ int type = cursor->GetGeometryType();
+
+ switch(type)
+ {
+ case 2000:
+ gType=TeSDOUNKNOWN;
+ break;
+
+ case 2001:
+ gType=TeSDOPOINT;
+ break;
+
+ case 2002:
+ gType=TeSDOLINE;
+ break;
+
+ case 2003:
+ gType=TeSDOPOLYGON;
+ break;
+
+ case 2004:
+ gType=TeSDOCOLLECTION;
+ break;
+
+ case 2005:
+ gType=TeSDOMULTIPOINT;
+ break;
+
+ case 2006:
+ gType=TeSDOMULTILINE;
+ break;
+
+ case 2007:
+ gType=TeSDOMULTIPOLYGON;
+ break;
+ default:
+ return false;
+ };
+ return true;
+}
+
+int
+TeOracleSpatialPortal::GetSpatialReferenceId()
+{
+ if(!cursor)
+ return -1;
+
+ return (cursor->GetSpatialReferenceId());
+}
+
+bool
+TeOracleSpatialPortal::GetPointXYZ (double& x,double& y)
+{
+ if(!cursor)
+ return false;
+
+ return (cursor->GetXYZcoord(x,y));
+}
+
+
+bool
+TeOracleSpatial::insertLayer(TeLayer* layer)
+{
+ int index;
+ TeProjection* proj = layer->projection();
+ if (!proj || !insertProjection(proj))
+ {
+ errorMessage_ = "N�o � poss�vel inserir layer sem proje��o";
+ return false;
+ }
+ string ins = "INSERT INTO te_layer (layer_id, projection_id, name ";
+ ins += ", lower_x, lower_y, upper_x, upper_y) ";
+ ins += " VALUES ( ";
+ ins += "te_layer_seq.NEXTVAL";
+ ins += ", " + Te2String(proj->id());
+ ins += ", '" + escapeSequence(layer->name()) + "'";
+ ins += ", " + Te2String(layer->box().x1(),10);
+ ins += ", " + Te2String(layer->box().y1(),10);
+ ins += ", " + Te2String(layer->box().x2(),10);
+ ins += ", " + Te2String(layer->box().y2(),10);
+ ins += ")";
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table te_layer!";
+ return false;
+ }
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ ins = "SELECT te_layer_seq.CURRVAL FROM DUAL";
+ if (!ocip->query(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence te_layer_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ index = atoi((const char*)ocip->getData(0));
+ layer->id(index);
+ delete ocip;
+ layerMap_[layer->id()] = layer;
+ return true;
+}
+
+bool
+TeOracleSpatial::deleteLayer (int layerId)
+{
+ //Delete attributes tables
+ if(!deleteLayerTable(layerId))
+ return false;
+
+ TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) this->getPortal();
+ if (!portal)
+ return false;
+
+ string geomTable;
+ string sql = "SELECT projection_id FROM te_layer WHERE layer_id = ";
+ sql += Te2String(layerId);
+
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ string projId = portal->getData("projection_id");
+ portal->freeResult();
+
+ // Get all representations that are associated to this layer
+ sql = "SELECT * FROM te_representation WHERE layer_id = "+ Te2String(layerId);
+ if (!portal->query (sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ while (portal->fetchRow())
+ { // Delete the geometry tables
+ geomTable = portal->getData("geom_table");
+
+ // Delete lut table
+ TeGeomRep rep = TeGeomRep(atoi(portal->getData("geom_type")));
+ if (rep == TeRASTER)
+ {
+ TeOracleSpatialPortal* portal2 = (TeOracleSpatialPortal*)this->getPortal();
+ sql = "SELECT lut_table, raster_table FROM " + geomTable;
+ string tabName;
+ if (!portal2->query (sql))
+ {
+ delete portal2;
+ continue;
+ }
+
+ while (portal2->fetchRow())
+ {
+ // remove lut table
+ tabName = portal2->getData(0);
+ if (!tabName.empty() && this->tableExist(tabName))
+ {
+ sql = "DROP TABLE " + tabName;
+ this->execute(sql);
+
+ sql= "DROP SEQUENCE "+ getNameSequence(tabName);
+ this->execute(sql);
+ }
+ // remove raster table
+ tabName = portal2->getData(1);
+ if (!tabName.empty() && this->tableExist(tabName))
+ {
+ sql = "DROP TABLE " + tabName;
+ this->execute(sql);
+
+ DeleteMetadata(tabName, "block_box");
+ DeleteSpatialIndex(tabName);
+ }
+ }
+ delete portal2;
+ // remove raster metadata table
+ tabName = geomTable + "_metadata";
+ if (!tabName.empty() && this->tableExist(tabName))
+ {
+ sql = "DROP TABLE " + tabName;
+ this->execute(sql);
+ }
+ }
+ if (this->tableExist(geomTable))
+ {
+ sql = "DROP TABLE " + geomTable;
+ if (!this->execute(sql) )
+ {
+ delete portal;
+ return false;
+ }
+
+ sql= "DROP SEQUENCE "+ getNameSequence(geomTable);
+ this->execute(sql);
+ DeleteMetadata(geomTable, "spatial_data");
+ DeleteSpatialIndex(geomTable);
+ }
+ }
+
+ portal->freeResult();
+ if (existRelation("te_representation","fk_rep_layer_id") != TeRICascadeDeletion)
+ {
+ // Delete entries into representations table
+ sql = "DELETE FROM te_representation WHERE layer_id = " +Te2String(layerId);
+ if (!this->execute(sql) )
+ {
+ delete portal;
+ return false;
+ }
+ }
+
+ // delete layer themes
+ sql = "SELECT theme_id FROM te_theme WHERE layer_id=" + Te2String(layerId);
+ if (!portal->query (sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ int themeId;
+ while (portal->fetchRow())
+ {
+ themeId = atoi(portal->getData("theme_id"));
+ this->deleteTheme(themeId);
+ }
+
+ sql = "DELETE FROM te_layer WHERE layer_id=" + Te2String(layerId);
+ if (!this->execute(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ // delete layer projection
+ sql = "DELETE FROM te_projection WHERE projection_id = "+ projId;
+ if (!this->execute(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ // remove all the items� themes associated to the layer to be removed
+ TeThemeMap::iterator it;
+ for (it = themeMap_.begin(); it != themeMap_.end(); ++it)
+ {
+ TeTheme *theme = it->second;
+ if (theme->layer()->id() == layerId)
+ {
+ themeMap_.erase(theme->id());
+ delete theme;
+ }
+ }
+
+ // Delete layer and its entry in the layer map
+ TeLayer* layer = layerMap_[layerId];
+ layerMap_.erase(layerId);
+ delete layer;
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeOracleSpatial::insertTheme (TeTheme *theme)
+{
+ double maxScale = theme->maxScale ();
+ if(maxScale==TeMAXFLOAT)
+ maxScale = 0.;
+
+ string ins = "INSERT INTO te_theme (theme_id, layer_id, view_id, name, ";
+ ins += " parent_id, priority, node_type, min_scale, max_scale, ";
+ ins += " generate_attribute_where, generate_spatial_where, generate_temporal_where, ";
+ ins += " collection_table, visible_rep, enable_visibility) VALUES (";
+ ins += "te_theme_seq.NEXTVAL";
+ ins += ", " + Te2String(theme->layerId());
+ ins += ", " + Te2String(theme->view());
+ ins += ", '" + escapeSequence(theme->name()) + "'";
+ ins += ", " + Te2String(theme->parentId ());
+ ins += ", " + Te2String(theme->priority());
+ ins += ", " + Te2String(theme->type ());
+ ins += ", " + Te2String (theme->minScale(),9);
+ ins += ", " + Te2String (maxScale);
+ ins += ", '" + escapeSequence(theme->attributeRest()) + "'";
+ ins += ", '" + escapeSequence(theme->spatialRest()) + "'";
+ ins += ", '" + escapeSequence(theme->temporalRest()) + "'";
+ ins += ", '" + escapeSequence(theme->collectionTable()) + "'";
+ ins += ", " + Te2String(theme->visibleRep());
+ ins += ", " + Te2String(theme->visibility());
+ ins += ")";
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table te_theme!";
+ return false;
+ }
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string seq = "SELECT te_theme_seq.CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence te_theme_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ theme->id(index);
+ delete ocip;
+ string colName = theme->collectionTable();
+
+ //insert collection name
+ if(colName.empty())
+ {
+ colName = "te_collection_" + Te2String(index);
+ theme->collectionTable(colName);
+
+ ins = "UPDATE te_theme SET ";
+ ins += " collection_table = '" + escapeSequence(colName) + "'";
+ ins += " WHERE theme_id = " + Te2String (index);
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table te_theme!";
+ return false;
+ }
+ }
+
+ bool status;
+
+ // insert grouping
+ int numSlices = 0;
+ if(theme->grouping())
+ {
+ if(!insertGrouping (theme->id(), theme->grouping()))
+ return false;
+ numSlices = theme->grouping()->groupNumSlices_;
+ }
+
+ // insert legend
+ theme->outOfCollectionLegend().group(-1);
+ theme->outOfCollectionLegend().theme(theme->id());
+ status = insertLegend (&(theme->outOfCollectionLegend()));
+ if (!status)
+ return status;
+
+ theme->withoutDataConnectionLegend().group(-2);
+ theme->withoutDataConnectionLegend().theme(theme->id());
+ status = insertLegend (&(theme->withoutDataConnectionLegend()));
+ if (!status)
+ return status;
+
+ theme->defaultLegend().group(-3);
+ theme->defaultLegend().theme(theme->id());
+ status = insertLegend (&(theme->defaultLegend()));
+ if (!status)
+ return status;
+
+ theme->pointingLegend().group(-4);
+ theme->pointingLegend().theme(theme->id());
+ status = insertLegend (&(theme->pointingLegend()));
+ if (!status)
+ return status;
+
+ theme->queryLegend().group(-5);
+ theme->queryLegend().theme(theme->id());
+ status = insertLegend (&(theme->queryLegend()));
+ if (!status)
+ return status;
+
+ theme->queryAndPointingLegend().group(-6);
+ theme->queryAndPointingLegend().theme(theme->id());
+ status = insertLegend (&(theme->queryAndPointingLegend()));
+ if (!status)
+ return status;
+
+ for (int i = 0; i < numSlices; i++)
+ {
+ theme->legend()[i].group(i);
+ theme->legend()[i].theme(theme->id());
+ status = insertLegend (&(theme->legend()[i]));
+ if (!status)
+ return status;
+ }
+ if (!status)
+ return status;
+
+ themeMap_[theme->id()] = theme;
+ return updateThemeTable(theme);
+}
+
+
+bool
+TeOracleSpatial::insertThemeTable (int themeId, int tableId, int relationId, int tableOrder)
+{
+ string ins = "INSERT INTO te_theme_table ";
+ ins += " (theme_table_id, theme_id, table_id, relation_id, table_order)";
+ ins += " VALUES ( ";
+ ins += getNameSequence("te_theme_table") +".NEXTVAL ";
+ ins += ", "+ Te2String(themeId);
+ ins += ", "+ Te2String(tableId);
+
+ if(relationId>0)
+ ins += ", "+ Te2String(relationId);
+ else
+ ins += ", null ";
+
+ ins += ", "+ Te2String(tableOrder);
+ ins += ")";
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table te_theme_table!";
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeOracleSpatial::insertThemeGroup(TeViewTree* tree)
+{
+ string ins = "INSERT INTO te_theme (theme_id, view_id, name, ";
+ ins += " parent_id, priority, node_type ) VALUES (";
+ ins += "te_theme_seq.NEXTVAL";
+ ins += ", " + Te2String(tree->view());
+ ins += ", '" + escapeSequence(tree->name()) + "'";
+ ins += ", " + Te2String(tree->parentId ());
+ ins += ", " + Te2String(tree->priority());
+ ins += ", " + Te2String(1);
+ ins += ")";
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ try
+ {
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table te_theme!";
+ return false;
+ }
+
+ string seq = "SELECT te_theme_seq.CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence te_theme_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ tree->id(index);
+
+ }
+ catch(...)
+ {
+ errorMessage_ = "Error inserting in the table te_theme!";
+ if(ocip)
+ delete ocip;
+ return false;
+ }
+
+ delete ocip;
+ return true;
+}
+
+bool
+TeOracleSpatial::generateLabelPositions (TeTheme *theme)
+{
+
+ string geomTable, upd;
+ string collTable = theme->collectionTable();
+
+ if((collTable.empty()) || (!tableExist(collTable)))
+ return false;
+
+ if( theme->layer()->hasGeometry(TeCELLS) ||
+ theme->layer()->hasGeometry(TePOLYGONS) ||
+ theme->layer()->hasGeometry(TeLINES) )
+ {
+ geomTable = theme->layer()->tableName(TeCELLS);
+
+ if(geomTable.empty())
+ {
+ geomTable = theme->layer()->tableName(TePOLYGONS);
+ if(geomTable.empty())
+ geomTable = theme->layer()->tableName(TeLINES);
+ }
+
+ upd= " UPDATE " + collTable + " SET ";
+ upd += " label_x = (SELECT MAX(SDO_GEOM.SDO_MIN_MBR_ORDINATE( ";
+ upd += geomTable + ".spatial_data, 1) + (SDO_GEOM.SDO_MAX_MBR_ORDINATE( ";
+ upd += geomTable + ".spatial_data, 1) - SDO_GEOM.SDO_MIN_MBR_ORDINATE( ";
+ upd += geomTable + ".spatial_data, 1))/2) ";
+ upd += "FROM " + geomTable + " WHERE object_id = c_object_id), ";
+
+ upd += " label_y = (SELECT MAX(SDO_GEOM.SDO_MIN_MBR_ORDINATE( ";
+ upd += geomTable + ".spatial_data, 2) + (SDO_GEOM.SDO_MAX_MBR_ORDINATE( ";
+ upd += geomTable + ".spatial_data, 2) - SDO_GEOM.SDO_MIN_MBR_ORDINATE( ";
+ upd += geomTable + ".spatial_data, 2))/2) ";
+ upd += "FROM " + geomTable + " WHERE object_id = c_object_id) ";
+
+ upd += " WHERE label_x IS NULL OR label_y IS NULL";
+
+ }
+
+ else if (theme->layer()->hasGeometry(TePOINTS))
+ {
+ geomTable = theme->layer()->tableName(TePOINTS);
+
+ upd= " UPDATE "+ collTable +" SET ";
+ upd += " label_x = (SELECT MAX(p.spatial_data.SDO_POINT.X) ";
+ upd += " FROM " + geomTable + " p WHERE object_id = c_object_id), ";
+
+ upd += " label_y = (SELECT MAX(p.spatial_data.SDO_POINT.Y) ";
+ upd += " FROM " + geomTable + " p WHERE object_id = c_object_id) ";
+ upd += " WHERE label_x IS NULL OR label_y IS NULL";
+ }
+
+ if(!execute(upd))
+ return false;
+
+ return true;
+}
+
+
+bool
+TeOracleSpatial::insertView(TeView *view)
+{
+ // save it�s projection
+ TeProjection* proj = view->projection();
+ if ( !proj || !insertProjection(proj))
+ {
+ errorMessage_ = "N�o � poss�vel inserir vista sem proje��o";
+ return false;
+ }
+
+ string ins = "INSERT INTO te_view (view_id, projection_id, name, user_name, visibility)";
+ ins += " VALUES (";
+ ins += "te_view_seq.NEXTVAL";
+ ins += ", " + Te2String(proj->id());
+ ins += ", '" + escapeSequence(view->name ()) + "'";
+ ins += ", '" + escapeSequence(view->user ()) + "'";
+ ins += ", " + Te2String((int)view->isVisible());
+ ins += " )";
+
+ if(!execute (ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table te_view!";
+ return false;
+ }
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ ins = "SELECT te_view_seq.CURRVAL FROM DUAL";
+ if (!ocip->query(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence te_view_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ view->id(index);
+ delete ocip;
+
+ int size = view->size();
+
+ for (int th=0; th<size; th++)
+ {
+ TeViewNode* node = view->get(th);
+ if (node->type() == TeTHEME)
+ {
+ TeTheme *theme = (TeTheme*) node;
+ insertTheme (theme);
+ }
+ else
+ {
+ TeViewTree* tree = (TeViewTree*)node;
+ insertViewTree (tree);
+ }
+ }
+
+ // Insert view in the view map
+ viewMap_[view->id()] = view;
+ return true;
+}
+
+
+
+bool
+TeOracleSpatial::insertViewTree (TeViewTree *tree)
+{
+
+ string ins = "INSERT INTO te_theme (theme_id, view_id, name, ";
+ ins += " parent_id, node_type, priority) VALUES (";
+ ins += " te_theme_seq.NEXTVAL";
+ ins += ", " + Te2String(tree->view());
+ ins += ", '" + escapeSequence(tree->name()) + "'";
+ ins += ", " + Te2String(tree->parentId());
+ ins += ", " + Te2String(tree->type());
+ ins += ", " + Te2String(tree->priority());
+ ins += ")";
+
+ if(!execute(ins))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error inserting in the table te_theme!";
+ return false;
+ }
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string seq = "SELECT te_theme_seq.CURRVAL FROM DUAL";
+ if(!ocip->query(seq))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error in the sequence te_theme_seq!";
+ delete ocip;
+ return false;
+ }
+
+ if(!ocip->fetchRow())
+ {
+ errorMessage_ = "Sequence value not found!";
+ delete ocip;
+ return false;
+ }
+
+ int index = atoi((const char*)ocip->getData(0));
+ tree->id(index);
+ delete ocip;
+
+ return true;
+}
+
+bool
+TeOracleSpatial::locatePolygon (const string& table, TeCoord2D &pt, TePolygon & /* polygon */, const double& /* tol */)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string q = "SELECT * FROM " + table;
+ q += " WHERE MDSYS.SDO_RELATE (spatial_data,";
+ q += "MDSYS.SDO_GEOMETRY(2001,NULL, MDSYS.SDO_POINT_TYPE(";
+ q += Te2String(pt.x(),10) + ", " + Te2String(pt.y(), 10);
+ q += ", NULL), NULL, NULL), ";
+ q += " 'mask=contains querytype = window') = 'TRUE'";
+
+ if (!ocip->query(q) || !ocip->fetchRow())
+ {
+ delete ocip;
+ return false;
+ }
+
+// bool flag = ocip->fetchGeometry(polygon);
+ delete ocip;
+ return true;
+}
+
+bool
+TeOracleSpatial::locateLine (const string& table, TeCoord2D &pt, TeLine2D & /* line */, const double& tol)
+{
+
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+ string sdoGeom = "mdsys.sdo_geometry(2003,null,null,";
+ sdoGeom += "mdsys.sdo_elem_info_array(1,1003,3),";
+ sdoGeom += "mdsys.sdo_ordinate_array(";
+ sdoGeom += Te2String(box.x1(),10) + ", " + Te2String(box.y1(),10);
+ sdoGeom += ", " + Te2String(box.x2(),10) + ", " + Te2String(box.y2(),10) + "))";
+
+ string q = "SELECT * FROM " + table;
+ q += " WHERE MDSYS.SDO_RELATE (spatial_data,";
+ q += sdoGeom +",";
+ q += "'mask=anyinteract querytype = window') = 'TRUE'";
+
+ if (!ocip->query(q) || !ocip->fetchRow())
+ {
+ delete ocip;
+ return false;
+ }
+
+// bool flag = ocip->fetchGeometry(line);
+ delete ocip;
+ return true;
+}
+
+bool
+TeOracleSpatial::locatePoint (const string& table, TeCoord2D &pt, TePoint & /* point */, const double& tol)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+ string sdoGeom = "mdsys.sdo_geometry(2003,null,null,";
+ sdoGeom += "mdsys.sdo_elem_info_array(1,1003,3),";
+ sdoGeom += "mdsys.sdo_ordinate_array(";
+ sdoGeom += Te2String(box.x1(),10) + ", " + Te2String(box.y1(),10);
+ sdoGeom += ", " + Te2String(box.x2(),10) + ", " + Te2String(box.y2(),10) + "))";
+
+ string q = "SELECT * FROM " + table;
+ q += " WHERE MDSYS.SDO_RELATE (spatial_data,";
+ q += sdoGeom +",";
+ q += "'mask=anyinteract querytype = window') = 'TRUE'";
+
+ if (!ocip->query(q) || !ocip->fetchRow())
+ {
+ delete ocip;
+ return false;
+ }
+
+// bool flag = ocip->fetchGeometry(point);
+ delete ocip;
+ return true;
+}
+
+bool
+TeOracleSpatialPortal::fetchGeometry (TeCell& cell)
+{
+ TeCoord2D coord1,coord2;
+ try
+ {
+ GetCoordinates (1, coord1);
+ GetCoordinates (2, coord2);
+ TeBox b(coord1.x(), coord1.y(), coord2.x(), coord2.y());
+
+ cell.setBox (b);
+ cell.geomId(atoi(getData("geom_id")));
+ cell.objectId (string(getData("object_id")));
+ cell.column(atoi(getData("col_number")));
+ cell.line(atoi(getData("row_number")));
+ return(this->fetchRow());
+ }
+ catch(...)
+ {
+ errorMessage_ = cursor->getErrorMessage();
+ return false;
+ }
+}
+
+bool
+TeOracleSpatial::locateCell(const string& table, TeCoord2D &pt, TeCell & /* cell */, const double& /* tol */)
+{
+ TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+ if(!ocip)
+ return false;
+
+ string q = "SELECT * FROM " + table;
+ q += " WHERE MDSYS.SDO_RELATE (spatial_data,";
+ q += "MDSYS.SDO_GEOMETRY(2001,NULL,MDSYS.SDO_POINT_TYPE(";
+ q += Te2String(pt.x(),10) + ", " + Te2String(pt.y(), 10);
+ q += ", NULL), NULL, NULL), ";
+ q += " 'mask=contains querytype = window') = 'TRUE'";
+
+ if (!ocip->query(q) || !ocip->fetchRow())
+ {
+ delete ocip;
+ return false;
+ }
+
+// bool flag = ocip->fetchGeometry(cell);
+ delete ocip;
+ return true;
+}
+
+
+bool
+TeOracleSpatialPortal::getBlob(const string& /* s */, unsigned char* &data, long& size)
+{
+ try
+ {
+ size = getCursor()->SizeBlob();
+ if(size>0)
+ {
+ data = new unsigned char[size];
+ cursor->ReadBlob((unsigned char*)data, size);
+ }
+ }
+ catch(...)
+ {
+ errorMessage_ = "Error getting media!";
+ return false;
+ }
+ return true;
+}
+
+
+TeTime
+TeOracleSpatialPortal::getDate (int i)
+{
+ TeTime temp;
+ string result;
+
+ if (i > numFields_ || i < 0)
+ return temp;
+
+ try
+ {
+ result = cursor->GetFieldValue(i+1);
+ }
+ catch(...)
+ {
+ errorMessage_ = "Error!";
+ return temp;
+ }
+
+ TeTime t(result, TeSECOND, "DDsMMsYYYYsHHsmmsSS");
+ return t;
+}
+
+
+TeTime
+TeOracleSpatialPortal::getDate (const string& s)
+{
+ string attstr;
+ string result;
+ TeTime temp;
+
+ string fieldName;
+ size_t pos = s.find(".", string::npos,1);
+ if (pos != string::npos)
+ fieldName = s.substr(pos+1);
+ else
+ fieldName = s;
+
+ attstr = strupr((char*)(fieldName.c_str()));
+ int index = getColumnIndex (attstr);
+ if(index == -1)
+ return temp;
+ else
+ result = getData(index);
+
+ TeTime t(result, TeSECOND, "DDsMMsYYYYsHHsmmsSS") ;
+ return t;
+}
+
+string
+TeOracleSpatialPortal::getDateAsString(int i)
+{
+ TeTime t = this->getDate(i);
+ string date = t.getDateTime ();
+
+ if (!date.empty())
+ { string tval = " TO_DATE ('"+ date +"','DDsMMsYYYYsHHsmmsSS') ";
+ return tval;
+ }
+ else
+ return "";
+}
+
+string
+TeOracleSpatialPortal::getDateAsString(const string& s)
+{
+ TeTime t = this->getDate(s);
+ string date = t.getDateTime ();
+
+ if (!date.empty())
+ { string tval = " TO_DATE ('"+ date +"','DDsMMsYYYYsHHsmmsSS') ";
+ return tval;
+ }
+ else
+ return "";
+}
+
+
+bool
+TeOracleSpatialPortal::getRasterBlock(unsigned long& size, unsigned char* ptData)
+{
+ // gets the spatial data
+ // expects that the data size will be a block of double maximum
+ unsigned long len;
+ try
+ {
+ // get the actual length of the compressed data
+ len = getCursor()->SizeBlob();
+ size = len;
+ if(len > 0)
+ getCursor()->ReadBlob(ptData, len);
+ }
+ catch(...)
+ {
+ size = 0;
+ errorMessage_ = "ERRO!";
+ return false;
+ }
+ return true;
+}
+
+string TeOracleSpatial::concatValues(vector<string>& values, const string& unionString)
+{
+ string concat = "";
+
+ for(unsigned int i = 0; i < values.size(); ++i)
+ {
+ if(i != 0)
+ {
+ concat += " || ";
+
+ if(!unionString.empty())
+ {
+ concat += "'";
+ concat += unionString;
+ concat += "'";
+ concat += " || ";
+ }
+ }
+
+ concat += values[i];
+ }
+
+ return concat;
+}
+
+string TeOracleSpatial::toUpper(const string& value)
+{
+ string result = "upper(";
+ result += value;
+ result += ")";
+
+ return result;
+}
\ No newline at end of file
diff --git a/src/terralib/drivers/OracleSpatial/TeOracleSpatial.h b/src/terralib/drivers/OracleSpatial/TeOracleSpatial.h
new file mode 100644
index 0000000..9fa3fd8
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/TeOracleSpatial.h
@@ -0,0 +1,392 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_ORACLESPATIAL_H
+#define __TERRALIB_INTERNAL_ORACLESPATIAL_H
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#include "connect.h"
+#include "cursor.h"
+#include <TeDatabase.h>
+
+#ifndef COMMIT
+#define COMMIT 1
+#define ROLLBACK 2
+#endif
+
+#ifdef AFX_DLL
+#define EXPORT_WIN __declspec( dllexport )
+#else
+#define EXPORT_WIN
+#endif
+
+//SDO_GEOMETRY types (number of dimensions=2 and LRS=0)
+enum TeSDOGType
+{ TeSDOUNKNOWN, TeSDOPOINT, TeSDOLINE, TeSDOPOLYGON,TeSDOCOLLECTION,
+ TeSDOMULTIPOINT, TeSDOMULTILINE, TeSDOMULTIPOLYGON};
+
+//! A concrete implementation of a driver to the Oracle Spatial SGDB
+class EXPORT_WIN TeOracleSpatial : public TeDatabase
+{
+
+friend class TeOracleSpatialPortal;
+
+private:
+
+ //! Inserting geometric table in the metadata table USER_SDO_GEOM_METADATA
+ bool insertMetadata(const string &table, const string &column, double tolx,double toly,TeBox &box,short srid=0);
+
+ //! Deleting geometric table in the metadata table USER_SDO_GEOM_METADATA
+ bool DeleteMetadata(const string &table, const string &column);
+
+ //! Create/Rebuild/Delete spatial index
+ bool createSpatialIndex(const string &table, const string &column,TeSpatialIndexType type= TeRTREE,short level=0,short tile=0);
+ bool RebuildSpatialIndex(const string &table);
+ bool DeleteSpatialIndex(const string &table);
+
+ bool createSequence(const string &seqName);
+ bool createAutoIncrementTrigger(const string &tableName, const string &fieldName);
+ string getNameSequence(const string &tableName);
+ string getNameTrigger(const string &tableName);
+
+ //! Connection to ORACLE database
+ OCIConnection *Conn;
+
+public:
+
+ TeOracleSpatial();
+
+ ~TeOracleSpatial();
+
+
+ string escapeSequence(const string& from);
+
+ bool newDatabase(const string& /*database*/, const string& /*user*/, const string& /*password*/, const string& /*host*/, const int& /*port=0*/, bool /*terralibModel=true*/) { return false; }
+
+ bool connect (const string& host, const string& user, const string& password, const string& database, int port = 0);
+
+ void close();
+
+ bool tableExist(const string& table);
+
+ bool columnExist(const string& table, const string& column, TeAttribute& attr);
+
+ bool createTable (const string& table, TeAttributeList &attr);
+
+ bool addColumn (const string& table,TeAttributeRep &rep);
+
+ bool deleteTable (const string& table);
+
+ bool execute (const string &sql);
+
+ TeDatabasePortal* getPortal ();
+
+ TeDBRelationType existRelation(const string& tableName, const string& relName);
+
+ bool createRelation (const string& name, const string& table, const string& fieldName, const string& relatedTable, const string& relatedField, bool cascadeDeletion);
+
+ // --- create metadata tables
+ bool createViewTable ();
+
+ bool createThemeTable ();
+
+ bool createGroupingTable();
+
+ bool createThemeTablesTable();
+
+ bool createLayerTable ();
+
+ bool createLayerTableTable ();
+
+ bool createTablesRelationTable();
+
+ bool createRepresentationTable();
+
+ bool createLegendTable();
+
+ bool createVisualRasterTable();
+
+ bool createVisualTable();
+
+ bool createDatabaseTable();
+
+ bool createProjectionTable ();
+
+ bool createRasterMetadataTable(const string& tableName);
+
+ bool createLUTTable(const string& table);
+
+ bool createCollectionTable(const string& tableName);
+ // ---
+
+ // --- create geometry tables
+ bool createCellGeometry (const string& table);
+
+ bool createTextGeometry (const string& table);
+
+ bool createArcGeometry (const string& table);
+
+ bool createNodeGeometry (const string& table);
+
+ bool createRasterGeometry (const string& table);
+
+ bool createRasterTable (const string& tableName);
+
+ bool createPolygonGeometry (const string& table);
+
+ bool createLineGeometry (const string& table);
+
+ bool createPointGeometry (const string& table);
+ // -----
+
+ // ----- Insert/Update/Delete metadata tables
+ bool insertTableInfo (int layerId, TeTable &table, const string& user="");
+ bool insertRelationInfo(const int tableId, const string& tField, const string& rName, const string& rField, int& relId);
+
+ bool insertTable (TeTable &table);
+ bool updateTable (TeTable &table);
+
+ bool insertProjection (TeProjection *proj);
+
+ bool insertView (TeView *view);
+ bool insertViewTree (TeViewTree *tree);
+
+ bool insertTheme (TeTheme *theme);
+ bool insertThemeTable (int themeId, int tableId, int relationId, int tableOrder);
+ bool insertThemeGroup (TeViewTree* tree);
+ bool generateLabelPositions (TeTheme *theme);
+
+ bool insertLayer (TeLayer *layer);
+ bool deleteLayer (int layerId);
+
+ bool insertRepresentation (int layerId, TeRepresentation& rep);
+
+ bool insertLegend (TeLegendEntry *legend);
+ // ----------------
+
+ // ----- Insert/Update/Delete geometry tables
+ //polygon
+ bool insertPolygon (const string& table, TePolygon &p);
+ bool updatePolygon (const string& table, TePolygon &p);
+ bool locatePolygon (const string& table, TeCoord2D &pt, TePolygon &polygon, const double& tol = 0.0);
+
+ bool selectPolygonSet (const string& table, const string& criteria, TePolygonSet &ps);
+ bool loadPolygonSet (const string& table, const string& geoid, TePolygonSet &ps);
+ bool loadPolygonSet (const string& table, TeBox &box, TePolygonSet &ps);
+ bool loadPolygonSet (TeTheme* theme, TePolygonSet &ps);
+ TeDatabasePortal* loadPolygonSet(const string& table, TeBox &box);
+
+ bool AllocateOrdinatesObject(TePolygon &poly, string& elInfo, OCICursor* cursor=0);
+
+ //line
+ bool insertLine (const string& table, TeLine2D &l);
+ bool updateLine (const string& table, TeLine2D &l);
+ bool locateLine (const string& table, TeCoord2D &pt, TeLine2D &line, const double& tol = 0.0);
+
+ bool loadLineSet (const string& table, const string& geoid, TeLineSet &ls);
+ bool loadLineSet (const string& table, TeBox &box, TeLineSet &linSet);
+ TeDatabasePortal* loadLineSet (const string& table, TeBox &box);
+
+ bool AllocateOrdinatesObject(TeLine2D &line, OCICursor* cursor=0);
+
+ //point
+ bool insertPoint (const string& table, TePoint &p);
+ bool updatePoint (const string& table, TePoint &p);
+ bool locatePoint (const string& table, TeCoord2D &pt, TePoint &point, const double& tol = 0.0);
+
+ //text
+ bool insertText (const string& table, TeText &t);
+
+ //arc
+ bool insertArc (const string& table,TeArc &arc);
+
+ //node
+ bool insertNode (const string& table, TeNode &node);
+ bool updateNode (const string& table, TeNode &node);
+
+ //cell
+ bool insertCell (const string& table, TeCell &c);
+ bool updateCell (const string& table, TeCell &c);
+ bool locateCell (const string& table, TeCoord2D &pt, TeCell &cell, const double& tol = 0.0);
+
+ //raster
+ bool insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, unsigned char *buf,unsigned long size, int band=0, unsigned int res=1, unsigned int subband=0);
+ // ----------
+
+ // ----- blob
+ bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size);
+ bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName);
+ // -----
+
+ //---------- SQLs
+ string getSQLBoxWhere (TeBox &box, TeGeomRep rep);
+
+ string getSQLBoxWhere (const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep rep1);
+
+ string getSQLBoxSelect (const string& tableName, TeGeomRep rep);
+
+ string getSQLStatistics (TeGroupingAttr& attrs);
+
+ string getSQLAutoNumber(const string& table);
+ // ------
+
+ bool getMBRSelectedObjects(string geomTable,string colGeom, string fromClause, string whereClause, string afterWhereClause, TeGeomRep repType,TeBox &bout, const double& tol = 0.0);
+
+ bool dropConceptualModel();
+
+ bool getMBRGeom(string tableGeom, string object_id, TeBox& box, string colGeom);
+
+ //Spatial query
+ //spatial relate between a set of geometry of the table actTable and all other geometry
+ //return a portal
+ bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabasePortal *portal, int relate, const string& actCollTable="");
+ bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, const string& visGeomTable, TeGeomRep visRep, TeDatabasePortal *portal, int relate, const string& visCollTable="");
+ bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, TeDatabasePortal *portal, int relate, const string& actCollTable="");
+
+ //spatial relate between a set of geometry of the table actTable and all other geometry
+ //return a object_id vector
+ bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, Keys& actIdsOut, int relate, const string& actCollTable="");
+ bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, const string& visGeomTable, TeGeomRep visRep, Keys& visIdsOut, int relate, const string& visCollTable="");
+ bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, Keys& actIdsOut, int relate, const string& actCollTable="");
+
+ //metric functions
+ bool calculateArea(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsOut, double &area);
+ bool calculateLength(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, double &length);
+
+ bool calculateDistance(const string& actGeomTable, TeGeomRep actRep, Keys& Ids, double& distance);
+ bool calculateDistance(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, TeGeomRep visRep, const string& objId2, double& distance);
+
+ //fazer para TeGeometry*
+ //bool withinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& point, KeysToDist& IdsDistOut, const double& max_distance, const string& actCollTable="");
+
+ // functions that generate new geometry
+ bool Buffer(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& bufferSet, double dist);
+ bool ConvexHull(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& convexHullSet);
+ bool Centroid(const string& actGeomTable , TeGeomRep actRep, TePointSet& centroidSet, Keys actIds = vector<string>(), const string& actCollTable = "");
+
+ //return the objects identificators of the nearest neighbors
+ bool nearestNeighbors(const string& actGeomTable, const string& actCollTable, TeGeomRep actRep, const string& objId1, Keys& actIdsOut, int numRes=1);
+ bool nearestNeighbors(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, const string& visCollTable, TeGeomRep visRep, Keys& visIdsOut, int numRes=1);
+
+ //return a portal with the nearest neighbors
+ bool nearestNeighbors(const string& actGeomTable, const string& actCollTable, TeGeomRep actRep, const string& objId1, TeDatabasePortal* portal, int numRes=1);
+ bool nearestNeighbors(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, const string& visCollTable, TeGeomRep visRep, TeDatabasePortal* portal, int numRes=1);
+
+ bool geomIntersection(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect);
+ bool geomIntersection(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+ bool geomDifference(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& objId2, TeGeometryVect& geomVect);
+ bool geomDifference(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+ bool geomUnion(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect);
+ bool geomUnion(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+ bool geomXOr(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& objId2, TeGeometryVect& geomVect);
+ bool geomXOr(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+ //! Concat values in a vector using unionString as the join between each value
+ string concatValues(vector<string>& values, const string& unionString);
+
+ //! Returns the SQL function for upper case
+ string toUpper(const string& value);
+
+};
+
+//! A concrete implementation of a portal to a Oracle Spatial database
+class EXPORT_WIN TeOracleSpatialPortal : public TeDatabasePortal
+{
+private:
+ OCICursor *cursor;
+ string Value_;
+ long curRow_;
+
+ bool isConnected ();
+ bool isEOF();
+
+
+public:
+
+ TeOracleSpatialPortal(TeOracleSpatial *pDatabase);
+ ~TeOracleSpatialPortal();
+
+ OCICursor* getCursor() { return cursor; }
+
+ //! Move operations
+ bool moveFirst();
+ bool moveNext();
+
+ bool query ( const string &q,TeCursorLocation l = TeSERVERSIDE, TeCursorType t = TeUNIDIRECTIONAL, TeCursorEditType e = TeREADONLY, TeCursorDataType dt = TeTEXTCURSOR );
+ bool querySDO (const string &q);
+
+ bool fetchRow ();
+ bool fetchRow (int i);
+
+ void freeResult ();
+
+ char* getData (int i);
+ char* getData (const string& s);
+
+ double getDouble (int i);
+ double getDouble (const string& s);
+ int getInt (int i);
+ int getInt (const string& s);
+
+ bool getBool (const string& s);
+ bool getBool (int i);
+
+ bool getGeometry (TeGeometry** geom, bool& result);
+ bool fetchGeometry (TePolygon& poly);
+ bool fetchGeometry (TePolygonSet& polySet);
+ bool fetchGeometry (TeLine2D& line);
+ bool fetchGeometry (TeLineSet& lineSet);
+ bool fetchGeometry (TeNode& n);
+ bool fetchGeometry (TePoint& p);
+ bool fetchGeometry (TePointSet& pointSet);
+ bool fetchGeometry (TeCell& cell);
+
+ bool getRasterBlock(unsigned long& size, unsigned char*);
+
+ bool getBlob(const string& s, unsigned char* &data, long& size);
+
+ TeTime getDate (int i);
+ TeTime getDate (const string& s);
+
+ string getDateAsString(int i);
+ string getDateAsString(const string& s);
+
+ //! Oci geometry methods: Get SDO_GEOMETRY informations
+ int GetDimArraySize();
+ bool GetDimElement(int i,int &elem);
+ int NumberOfOrdinates();
+ bool GetCoordinates(int i,TeCoord2D& coord);
+ bool GetGeometryType(TeSDOGType& gType);
+ int GetSpatialReferenceId();
+ bool GetPointXYZ (double& x,double& y);
+};
+
+#endif
+
+
+
diff --git a/src/terralib/drivers/OracleSpatial/connect.cpp b/src/terralib/drivers/OracleSpatial/connect.cpp
new file mode 100644
index 0000000..4187f64
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/connect.cpp
@@ -0,0 +1,425 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "connect.h"
+#include "sdo_oci.h"
+
+
+OCIConnection::OCIConnection()
+{
+ connected = false;
+
+ envhp = 0;
+ errhp = 0;
+ srvhp = 0;
+ svchp = 0;
+ usrhp = 0;
+ txnhp = 0;
+ stmthp = 0;
+ tdo_geometry = 0;
+ tdo_ordinates = 0;
+ ordinates = 0;
+}
+
+
+bool OCIConnection::Connect(const char* dblink, const char* username, const char* password)
+{
+ sword status;
+
+ int mode = OCI_THREADED|OCI_OBJECT;
+
+
+ //create and initialize the environment
+ status = SDO_OCIEnvCreate(&envhp, (ub4)mode, (dvoid *)0,
+ (dvoid*(*)(dvoid *ctxp, size_t size))0,
+ (dvoid*(*)(dvoid *ctxp, dvoid *memptr, size_t newsize))0,
+ (void (*)(dvoid *ctxp, dvoid *memptr))0,
+ (size_t)0, (dvoid**)0);
+ if(!CheckError(errhp, status))
+ return false;
+
+ // Allocate handles - errhp(OCIError) and srvhp (OCIServer)
+ status = SDO_OCIHandleAlloc((dvoid*)envhp, (dvoid**)&errhp, (ub4)OCI_HTYPE_ERROR,
+ (size_t)0, (dvoid**)0);
+ if(!CheckError(errhp, status))
+ return false;
+
+ status = SDO_OCIHandleAlloc((dvoid*)envhp, (dvoid**)&srvhp, (ub4)OCI_HTYPE_SERVER,
+ (size_t)0, (dvoid**)0);
+ if(!CheckError(errhp, status))
+ return false;
+
+ // Multiple Sessions or Connections
+ status = SDO_OCIServerAttach(srvhp, errhp, (text*)dblink,
+ (sb4)strlen(dblink), (ub4)OCI_DEFAULT);
+ if(!CheckError(errhp, status))
+ return false;
+
+ // Allocate handles: svchp(OCISvcCtx)
+ status = SDO_OCIHandleAlloc((dvoid*)envhp, (dvoid**)&svchp, (ub4)OCI_HTYPE_SVCCTX,
+ (size_t)0, (dvoid**)0);
+ if(!CheckError(errhp, status))
+ return false;
+
+ // Set the server attribute in the service context handle
+ status = SDO_OCIAttrSet((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid*)srvhp, (ub4)0,
+ (ub4)OCI_ATTR_SERVER, errhp);
+ if(!CheckError(errhp, status))
+ return false;
+
+ /// Allocate a user session handle
+ status = SDO_OCIHandleAlloc((dvoid*)envhp, (dvoid**)&usrhp, (ub4)OCI_HTYPE_SESSION,
+ (size_t)0, (dvoid**)0);
+ if(!CheckError(errhp, status))
+ return false;
+
+ // set user name attribute in user session handle
+ status = SDO_OCIAttrSet((dvoid*)usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid*)username,
+ (ub4)strlen(username), (ub4)OCI_ATTR_USERNAME, errhp);
+ if(!CheckError(errhp, status))
+ return false;
+
+ // set password attribute in user session handle
+ status = SDO_OCIAttrSet((dvoid*)usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid*)password,
+ (ub4)strlen(password), (ub4)OCI_ATTR_PASSWORD, errhp);
+ if(!CheckError(errhp, status))
+ return false;
+
+ // Session begins - establishes a session for a user against a particular
+ // server. This call is required for the user to execute operations on the server.
+ status = SDO_OCISessionBegin(svchp, errhp, usrhp, OCI_CRED_RDBMS,
+ OCI_DEFAULT);
+ if(!CheckError(errhp, status))
+ return false;
+
+ // set the user session attribute in the service context handle
+ status = SDO_OCIAttrSet((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid*)usrhp, (ub4)0,
+ (ub4)OCI_ATTR_SESSION, errhp);
+ if(!CheckError(errhp, status))
+ return false;
+
+ // allocate transaction handle 1 and set it in the service handle (OCITrans)
+ status = OCIHandleAlloc((dvoid *)envhp, (dvoid **)&txnhp, OCI_HTYPE_TRANS, 0, 0);
+ if(!CheckError(errhp, status))
+ return false;
+
+ status = OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)txnhp, 0,OCI_ATTR_TRANS, errhp);
+ if(!CheckError(errhp, status))
+ return false;
+
+ // locate stmthp
+ status = SDO_OCIHandleAlloc((dvoid*)envhp, (dvoid**)&stmthp,
+ (ub4)OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);
+ if(!CheckError(errhp, status))
+ return false;
+
+ //load the tdo type to sdo_geometry (OCIType)
+ status = OCITypeByName(envhp, errhp, svchp, (const text *)
+ "MDSYS", (ub4) strlen((char *)"MDSYS"),
+ (const text *) "SDO_GEOMETRY", (ub4) strlen((char *)"SDO_GEOMETRY"),
+ (text *)0, 0, OCI_DURATION_SESSION, OCI_TYPEGET_HEADER, &tdo_geometry);
+ if(!CheckError(errhp, status))
+ return false;
+
+ //load the tdo type to sdo_ordinates (OCIType)
+ status = OCITypeByName(envhp, errhp, svchp, (const text *)
+ "MDSYS", (ub4) strlen((char *)"MDSYS"),
+ (const text *) "SDO_ORDINATE_ARRAY", (ub4) strlen((char *)"SDO_ORDINATE_ARRAY"),
+ (text *)0, 0, OCI_DURATION_SESSION, OCI_TYPEGET_HEADER, &tdo_ordinates);
+ if(!CheckError(errhp, status))
+ return false;
+
+ connected = true;
+ return true;
+}
+
+
+void OCIConnection::Disconnect()
+{
+ // Session ends
+ SDO_OCISessionEnd(svchp, errhp, usrhp, (ub4)OCI_DEFAULT);
+ SDO_OCIServerDetach(srvhp, errhp, (ub4)OCI_DEFAULT);
+
+ // Finalize svchp, srvhp, errhp and stmthp
+ SDO_OCIHandleFree((dvoid*)txnhp, (ub4)OCI_HTYPE_TRANS);
+ SDO_OCIHandleFree((dvoid*)srvhp, (ub4)OCI_HTYPE_SERVER);
+ SDO_OCIHandleFree((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX);
+ SDO_OCIHandleFree((dvoid*)errhp, (ub4)OCI_HTYPE_ERROR);
+ SDO_OCIHandleFree((dvoid*)usrhp, (ub4)OCI_HTYPE_SESSION);
+ SDO_OCIHandleFree((dvoid*)stmthp, (ub4)OCI_HTYPE_STMT);
+
+ connected = false;
+ envhp = 0;
+ errhp = 0;
+ srvhp = 0;
+ svchp = 0;
+ usrhp = 0;
+ txnhp = 0;
+ tdo_geometry = 0;
+ tdo_ordinates = 0;
+ ordinates = 0;
+ stmthp = 0;
+}
+
+
+bool OCIConnection::Prepare(const string& stmt)
+{
+ if (!connected)
+ return false;
+
+ ub4 size = stmt.size();
+ sword status = SDO_OCIStmtPrepare(svchp, (OCIStmt *)stmthp, errhp, (text*)stmt.c_str(), (ub4)size,
+ (text*)0, (ub4)0, (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);
+ if(!CheckError(errhp, status))
+ return false;
+
+ return true;
+}
+
+
+bool OCIConnection::BindByPos(int pos, void* value, int size, void* indicator, int type)
+{
+ if (!connected)
+ return false;
+
+ OCIBind *bindp = NULL;
+
+ sword status = SDO_OCIBindByPos(stmthp, &bindp, errhp, pos, (dvoid *)value,
+ (sb4)size, type, (dvoid *)indicator, (ub2 *)0,
+ (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT);
+ if(!CheckError(errhp, status))
+ return false;
+ return true;
+}
+
+
+bool OCIConnection::BindByName(char* name, void* value, int size, void* indicator, int type)
+{
+ if (!connected)
+ return false;
+
+ OCIBind *bindp = NULL;
+ sword status = SDO_OCIBindByName(stmthp, &bindp, errhp, (text*)name,
+ (sb4)-1, (dvoid *)value, (sb4)size, type,
+ (dvoid *)indicator, (ub2 *)0, (ub2 *)0,
+ (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT);
+ if(!CheckError(errhp, status))
+ return false;
+ return true;
+}
+
+bool OCIConnection::BindOrdinates()
+{
+ OCIBind *bnd1p = NULL;
+
+ /* bind coordinate varray object */
+ sword status = OCIBindByName(stmthp, &bnd1p, errhp,
+ (text *)":ordinates", (sb4)-1, (dvoid *)0, (sb4)0, SQLT_NTY, (dvoid *)0,
+ (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT);
+ if(!CheckError(errhp, status))
+ return false;
+
+ status = OCIBindObject(bnd1p, errhp, tdo_ordinates, (dvoid **)&ordinates, (ub4 *)0,
+ (dvoid **)0, (ub4 *)0);
+ if(!CheckError(errhp, status))
+ return false;
+
+ return true;
+}
+
+
+int OCIConnection::QueryType()
+{
+ ub2 querytype_;
+
+ sword status = OCIAttrGet((dvoid *)stmthp, (ub4)OCI_HTYPE_STMT, (ub2 *)&querytype_,
+ (ub4*)NULL, (ub4)OCI_ATTR_STMT_TYPE, (OCIError *)errhp);
+ if(!CheckError(errhp, status))
+ return -1;
+ return (querytype_);
+}
+
+
+bool OCIConnection::AllocateObjectOrdinates()
+{
+ sword status = SDO_OCIObjectNew(envhp, errhp, svchp, OCI_TYPECODE_VARRAY, tdo_ordinates, (dvoid*)NULL,
+ OCI_DURATION_SESSION, TRUE, (dvoid**)&ordinates);
+
+ if(!CheckError(errhp, status))
+ return false;
+
+ return true;
+}
+
+
+bool OCIConnection::AppendOrdinates(const double& val)
+{
+
+ OCINumber oci_number;
+ sword status;
+
+ status = OCINumberFromReal(errhp, (dvoid *)&(val),
+ (uword)sizeof(double),&oci_number);
+
+ status = OCICollAppend(envhp, errhp,
+ (dvoid *) &oci_number,
+ (dvoid *)0, (OCIColl *)ordinates);
+
+ if(!CheckError(errhp, status))
+ return false;
+
+ return true;
+}
+
+bool OCIConnection::TransStart()
+{
+ sword status = OCITransStart (svchp, errhp, 60, OCI_TRANS_NEW);
+ if(!CheckError(errhp, status))
+ return false;
+
+ return true;
+}
+
+bool OCIConnection::TransRollback()
+{
+ sword status = OCITransRollback(svchp, errhp, (ub4) 0);
+ if(!CheckError(errhp, status))
+ return false;
+
+ return true;
+}
+
+bool OCIConnection::TransCommit()
+{
+ sword status = OCITransCommit(svchp, errhp, (ub4) 0);
+ if(!CheckError(errhp, status))
+ return false;
+
+ return true;
+}
+
+bool OCIConnection::Execute(const string& stm)
+{
+ if(!Prepare(stm))
+ return false;
+
+ if ((QueryType()<0) || (QueryType()==1))
+ return false; //return records (query)
+
+ TransStart();
+ sword status = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (OCISnapshot *)NULL,
+ (OCISnapshot *)NULL, (ub4)OCI_DEFAULT);
+
+ if(!CheckError(errhp, status))
+ {
+ TransRollback();
+ return false;
+ }
+
+ TransCommit();
+ return true;
+}
+
+
+bool OCIConnection::ExecuteSDOSTM(const string& stm)
+{
+ if(!Prepare(stm))
+ return false;
+
+ if(!BindOrdinates())
+ return false;
+
+ if((QueryType()<0) || (QueryType()==1))
+ return false; //return records (query)
+
+ TransStart();
+ sword status = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (OCISnapshot *)NULL,
+ (OCISnapshot *)NULL, (ub4)OCI_DEFAULT);
+
+ if(!CheckError(errhp, status))
+ {
+ OCIObjectFree(envhp, errhp, (dvoid *)ordinates, (ub2)OCI_OBJECTFREE_FORCE);
+ TransRollback();
+ return false;
+ }
+
+ TransCommit();
+ OCIObjectFree(envhp, errhp, (dvoid *)ordinates, (ub2)OCI_OBJECTFREE_FORCE);
+ return true;
+}
+
+
+bool OCIConnection::CheckError(OCIError* errhp, int status)
+{
+ char errbuf[512];
+ sb4 errcode = 0;
+ bool returnedVal = false;
+
+ if (status == OCI_ERROR)
+ {
+ SDO_OCIErrorGet((dvoid*)errhp, (ub4)1, (text*)NULL, &errcode,
+ (text*)errbuf, (ub4)sizeof(errbuf), OCI_HTYPE_ERROR);
+ errorMess = errbuf;
+ return false;
+ }
+
+ switch (status)
+ {
+ case OCI_SUCCESS:
+ errorMess = "Success!";
+ returnedVal = true;
+ break;
+
+ case OCI_SUCCESS_WITH_INFO:
+ errorMess = "Success with information!";
+ returnedVal = true;
+ break;
+
+ case OCI_NEED_DATA:
+ errorMess = "Need data!";
+ break;
+
+ case OCI_NO_DATA:
+ errorMess = "No data!";
+ break;
+
+ //An invalid handle was passed as a parameter or a user callback is passed an
+ //invalid handle or invalid context. No further diagnostics are available.
+ case OCI_INVALID_HANDLE:
+ errorMess = "Invalid handle!";
+ break;
+
+ case OCI_STILL_EXECUTING:
+ errorMess = "Still executing!";
+ break;
+
+ case OCI_CONTINUE:
+ errorMess = "Continue!";
+ break;
+ default:
+ break;
+ }
+
+ return returnedVal;
+}
diff --git a/src/terralib/drivers/OracleSpatial/connect.h b/src/terralib/drivers/OracleSpatial/connect.h
new file mode 100644
index 0000000..14108f9
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/connect.h
@@ -0,0 +1,111 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef CONNECT_H
+#define CONNECT_H
+
+#include <oci.h>
+#include <string>
+
+using namespace std;
+
+//! This class represents a connection to ORACLE database.
+class OCIConnection
+{
+protected:
+ bool connected; // if it is connected or not
+ string errorMess; // error message
+
+public:
+ // OCI connection handles
+ OCIEnv* envhp; //environment handle - ambiente
+ OCIError* errhp; //environment handle - error handle
+
+ OCIServer* srvhp; //service context handle - identifica uma conexao com o banco
+ OCISvcCtx* svchp; //service context handle
+ OCISession* usrhp; //service context handle - define as permissoes e privilegios dos usuarios
+ OCITrans* txnhp; //service context handle - transacao
+
+ OCIStmt* stmthp; // environment handle - statement handle
+
+ OCIType* tdo_geometry; //describe the sdo_geometry type
+ OCIType* tdo_ordinates; //describe the sdo_ordinates type
+ OCIArray* ordinates; //store the ordinates to insert into database (bind)
+
+public:
+
+ //! Connection constructor
+ OCIConnection();
+
+ //! Connection destructor
+ ~OCIConnection() { Disconnect(); }
+
+ //! Connect to ORACLE
+ bool Connect(const char* dblink, const char* username, const char* password);
+
+ //! Disconnect to ORACLE
+ void Disconnect();
+
+ //! Prepare the statement to be executed
+ bool Prepare(const string& stmt);
+
+ //! Bind
+ bool BindByPos(int pos, void* value, int size, void* indicator, int type);
+ bool BindByName(char* name, void* value, int size, void* indicator, int type);
+ bool BindOrdinates();
+
+ //! Append ordinates to be inserted or updated
+ bool AppendOrdinates(const double& val);
+
+ //! Locate memory to ordinates
+ bool AllocateObjectOrdinates();
+
+ //! Return query type
+ int QueryType(void);
+
+ //! Starts a transaction
+ bool TransStart();
+
+ //! Returns a transaction
+ bool TransRollback();
+
+ //! Commits a transaction
+ bool TransCommit();
+
+ //! Execute only commands that do not return rows (INSERT, UPDATE, DELETE, etc)
+ bool Execute(const string& stm);
+
+ //! Execute only commands that insert or update rows with SDO Objects
+ bool ExecuteSDOSTM(const string& stm);
+
+ //! Check if there is an opened conection
+ bool IsConnected() { return connected; }
+
+ //! Check OCI error
+ bool CheckError(OCIError* errhp, int status);
+
+ //! Gets the error message
+ string getErrorMessage() { return errorMess; }
+};
+
+#endif
diff --git a/src/terralib/drivers/OracleSpatial/cursor.cpp b/src/terralib/drivers/OracleSpatial/cursor.cpp
new file mode 100644
index 0000000..fae9b56
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/cursor.cpp
@@ -0,0 +1,1172 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "cursor.h"
+#include "sdo_oci.h"
+#include "TeUtils.h"
+
+
+//Given a string, remove all blanks and tabs (rigth)
+char* StrClean(char *name)
+{
+ int j;
+
+ if ((name == NULL)) /*SGError.Handler(NULLPOINTER,FATAL);*/
+ return 0;
+
+ for (j = strlen(name)-1; j>=0; j--)
+ {
+ if ( !((name[j]==' ') || (name[j]=='\t') || (name[j]== '\0')) )
+ break;
+ }
+
+ name[j+1] = '\0';
+
+ return name;
+}
+
+
+OCICursor::OCICursor(OCIConnection* connec)
+{
+ int i;
+ conn = connec;
+ stmthpToQuery = NULL;
+ dschp = NULL;
+ fieldValue = "";
+ ordinates = 0;
+
+ isOpen_ = false;
+ for(i=0;i<MAX_ROWS;i++)
+ {
+ global_geom_obj[i] = NULL;
+ global_geom_ind[i] = NULL;
+ lobp[i] = NULL;
+ }
+
+ row_Index = -1;
+ rows_Fetched = 0;
+ rows_Mem = 0;
+ row_Cur = -1;
+ last_Row = false;
+ errorMessage = "";
+ numColls_ = -1;
+}
+
+bool OCICursor::Open()
+{
+
+ sword status;
+ if(isOpen_)
+ this->Close();
+
+ isOpen_ = false;
+
+ // Initialize statement handle
+ status = SDO_OCIHandleAlloc((dvoid*)conn->envhp, (dvoid**)&stmthpToQuery,
+ (ub4)OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);
+ if(!CheckError(status))
+ return false;
+
+ // describe spatial object types (OCIDescribe)
+ status = SDO_OCIHandleAlloc((dvoid*)conn->envhp, (dvoid**)&dschp,
+ (ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0);
+ if(!CheckError(status))
+ return false;
+
+ status = SDO_OCIObjectNew(conn->envhp, conn->errhp, conn->svchp, OCI_TYPECODE_VARRAY,
+ conn->tdo_ordinates, (dvoid*)NULL, OCI_DURATION_SESSION, TRUE,
+ (dvoid**)&ordinates);
+
+ if(!CheckError(status))
+ return false;
+
+ isOpen_ = true;
+ return true;
+}
+
+void OCICursor::Close()
+{
+ // Finalize stmthpToQuery and dschp
+ if(isOpen_)
+ {
+ SDO_OCIHandleFree((dvoid *)stmthpToQuery, (ub4)OCI_HTYPE_STMT);
+ SDO_OCIHandleFree((dvoid*)dschp, (ub4)OCI_HTYPE_DESCRIBE);
+ FreeResult();
+ isOpen_ = false;
+ }
+ numColls_ = -1;
+ stmthpToQuery = NULL;
+ dschp = NULL;
+}
+
+void OCICursor::FreeResult()
+{
+ int i;
+ if(global_geom_obj)
+ {
+ for(i=0;i<rows_Mem;i++) // O que est� em mem�ria ou max rows??????
+ {
+ /// free the spatial object instance
+ CheckError(OCIObjectFree(conn->envhp, conn->errhp, (dvoid *)global_geom_obj[i],
+ (ub2)OCI_OBJECTFREE_FORCE));
+
+ global_geom_obj[i] = NULL;
+ global_geom_ind[i] = NULL;
+ }
+ }
+
+ if (lobp)
+ {
+ for(i=0;i<MAX_ROWS;i++)
+ {
+ CheckError(OCIDescriptorFree((dvoid *) lobp, (ub4) OCI_DTYPE_LOB));
+ lobp[i] = NULL;
+ }
+ }
+
+ OCIObjectFree(conn->envhp, conn->errhp, (dvoid *)ordinates, (ub2)OCI_OBJECTFREE_FORCE);
+ ordinates = 0;
+
+ vector<void *>::iterator itb = buffers.begin();
+ for (itb; itb!=buffers.end(); itb++)
+ delete(*(itb));
+
+ buffers.clear();
+ defines.clear(); // ver se o freestmtp desaloca os OCIDefines
+ ind.clear();
+ colType_.clear();
+ colSize_.clear();
+ colScale_.clear();
+ colName_.clear();
+ numColls_ = -1;
+}
+
+
+void OCICursor::DefineByPos(int pos, void* value, int size, void* indicator,
+ int type)
+{
+ OCIDefine *defnp = NULL;
+
+ CheckError(SDO_OCIDefineByPos(stmthpToQuery, &defnp, conn->errhp, (ub4)pos,
+ (dvoid *)value, (sb4)size, type,
+ (dvoid *)indicator, (ub2 *)0, (ub2 *)0,
+ (ub4)OCI_DEFAULT));
+}
+
+
+bool OCICursor::Fetch(int rows)
+{
+ sword status;
+ status = OCIStmtFetch(stmthpToQuery, conn->errhp, (ub4) rows, (ub4) OCI_FETCH_NEXT,
+ (ub4) OCI_DEFAULT);
+
+ CheckError(status);
+
+ if (status == OCI_SUCCESS || status == OCI_SUCCESS_WITH_INFO)
+ return true;
+ else
+ return false;
+
+}
+
+bool OCICursor::AppendOrdinates(const double& val)
+{
+
+ OCINumber oci_number;
+ sword status;
+
+ if(!ordinates)
+ {
+ status = SDO_OCIObjectNew(conn->envhp, conn->errhp, conn->svchp, OCI_TYPECODE_VARRAY,
+ conn->tdo_ordinates, (dvoid*)NULL, OCI_DURATION_SESSION, TRUE,
+ (dvoid**)&ordinates);
+
+ if(!CheckError(status))
+ return false;
+ }
+
+ status = OCINumberFromReal(conn->errhp, (dvoid *)&(val),
+ (uword)sizeof(double),&oci_number);
+
+ status = OCICollAppend(conn->envhp, conn->errhp,
+ (dvoid *) &oci_number,
+ (dvoid *)0, (OCIColl *)ordinates);
+
+ if(!CheckError(status))
+ return false;
+
+ return true;
+}
+
+bool OCICursor::BindOrdinates()
+{
+ OCIBind *bnd1p = NULL;
+ sword status;
+
+ if(!ordinates)
+ {
+ status = SDO_OCIObjectNew(conn->envhp, conn->errhp, conn->svchp, OCI_TYPECODE_VARRAY,
+ conn->tdo_ordinates, (dvoid*)NULL, OCI_DURATION_SESSION, TRUE,
+ (dvoid**)&ordinates);
+
+ if(!CheckError(status))
+ return false;
+ }
+
+ /* bind coordinate varray object */
+ status = OCIBindByName(stmthpToQuery, &bnd1p, conn->errhp,
+ (text *)":ordinates", (sb4)-1, (dvoid *)0, (sb4)0, SQLT_NTY, (dvoid *)0,
+ (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT);
+ if(!CheckError(status))
+ return false;
+
+ status = OCIBindObject(bnd1p, conn->errhp, conn->tdo_ordinates, (dvoid **)&ordinates, (ub4 *)0,
+ (dvoid **)0, (ub4 *)0);
+ if(!CheckError(status))
+ return false;
+
+ return true;
+}
+
+bool OCICursor::MoveFirst()
+{
+ // this is for scroolable cursor
+ sword status = OCIStmtFetch2(stmthpToQuery, conn->errhp, (ub4)MAX_ROWS, OCI_FETCH_FIRST, (sb4) 0, OCI_DEFAULT);
+
+ if (status == OCI_SUCCESS || status == OCI_SUCCESS_WITH_INFO || status == OCI_NO_DATA)
+ {
+ OCIAttrGet((dvoid *)stmthpToQuery, (ub4)OCI_HTYPE_STMT,
+ (dvoid *)&rows_Fetched, (ub4 *)0,
+ (ub4)OCI_ATTR_ROW_COUNT, conn->errhp);
+
+ if(!rows_Fetched)
+ return false;
+
+ if(status == OCI_NO_DATA)
+ last_Row = true;
+
+ row_Index = 0;
+
+ if(rows_Fetched < MAX_ROWS)
+ rows_Mem = rows_Fetched;
+ else
+ rows_Mem = MAX_ROWS;
+
+ row_Cur = 0;
+ return true;
+ }
+
+ return false;
+}
+
+bool OCICursor::MoveNext()
+{
+ sword status;
+
+ if((row_Index+1) >= rows_Mem)
+ {
+ if(last_Row)
+ return false;
+
+ // this is for scroolable cursor
+ status = OCIStmtFetch2(stmthpToQuery, conn->errhp, (ub4) MAX_ROWS, /*OCI_DEFAULT*/ OCI_FETCH_NEXT, (sb4) 0, OCI_DEFAULT);
+
+ if (status == OCI_SUCCESS || status == OCI_SUCCESS_WITH_INFO || status == OCI_NO_DATA)
+ {
+
+ OCIAttrGet((dvoid *)stmthpToQuery, (ub4)OCI_HTYPE_STMT,
+ (dvoid *)&rows_Fetched, (ub4 *)0,
+ (ub4)OCI_ATTR_ROWS_FETCHED, conn->errhp);
+
+ if(!rows_Fetched)
+ return false;
+
+ if(status == OCI_NO_DATA)
+ {
+ if(last_Row)
+ return false;
+ else
+ last_Row = true;
+ }
+
+ row_Index = 0;
+
+ if(rows_Fetched < MAX_ROWS)
+ rows_Mem = rows_Fetched;
+ else
+ rows_Mem = MAX_ROWS;
+
+ row_Cur++;
+ return true;
+ }
+ else
+ return false;
+ }
+ else
+ row_Index++;
+
+ row_Cur++;
+ return true;
+}
+
+bool OCICursor::MoveLast()
+{
+
+ sword status = OCIStmtFetch2(stmthpToQuery, conn->errhp, (ub4) 1,
+ OCI_FETCH_LAST, (sb4) 0, OCI_DEFAULT);
+ //podemos pegar informacao da ultima linha
+
+ if (status == OCI_SUCCESS || status == OCI_SUCCESS_WITH_INFO)
+ {
+ last_Row = true;
+ return true;
+ }
+ else
+ return false;
+
+}
+
+bool OCICursor::MoveTo(int pos) //begin in 0
+{
+
+ sword status;
+ int auxPos = MAX_ROWS*int(pos/MAX_ROWS);
+
+ // row_Cur = absolute current row
+ // row_Index = relative current row - client side
+ if(int(row_Cur/MAX_ROWS) == int(pos/MAX_ROWS))
+ {
+ row_Index = pos - (MAX_ROWS*int(pos/MAX_ROWS));
+ row_Cur = pos;
+ return true;
+ }
+
+ if(pos<row_Cur)
+ {
+ if(!MoveFirst())
+ return false;
+ }
+
+ status = OCIStmtFetch2(stmthpToQuery, conn->errhp, (ub4) MAX_ROWS, OCI_FETCH_ABSOLUTE, (sb4)auxPos+1, OCI_DEFAULT);
+ row_Index = pos-auxPos;
+ row_Cur = pos;
+
+ CheckError(status);
+
+ if (status == OCI_SUCCESS || status == OCI_SUCCESS_WITH_INFO || status == OCI_NO_DATA)
+ {
+ OCIAttrGet((dvoid *)stmthpToQuery, (ub4)OCI_HTYPE_STMT,
+ (dvoid *)&rows_Fetched, (ub4 *)0,
+ (ub4)OCI_ATTR_ROWS_FETCHED, conn->errhp);
+
+ if(!rows_Fetched)
+ return false;
+
+ if(status == OCI_NO_DATA)
+ last_Row = true;
+ return true;
+ }
+
+ return false;
+
+ /* // funciona mas fica lento
+ sword status;
+ // this part is for scroolable cursor
+ if(pos >= 0)
+ {
+ status = OCIStmtFetch2(stmthpToQuery, conn->errhp, (ub4) MAX_ROWS,
+ OCI_FETCH_ABSOLUTE, (sb4) pos+1, OCI_DEFAULT);
+ }
+ else
+ {
+ status = OCIStmtFetch2(stmthpToQuery, conn->errhp, (ub4) MAX_ROWS,
+ OCI_FETCH_RELATIVE, (sb4) pos+1, OCI_DEFAULT);
+ }
+
+ */
+}
+
+// Throw CCursorException if OCI error found
+bool OCICursor::CheckError(sword status)
+{
+ sb4 errcode = 0;
+ char message[256];
+ bool returnedVal = false;
+
+ if (status == OCI_ERROR)
+ {
+ SDO_OCIErrorGet((dvoid*)conn->errhp, (ub4)1, (text*)NULL, &errcode,
+ (text*)message, (ub4)256, OCI_HTYPE_ERROR);
+
+ errorMessage = message;
+ return false;
+ }
+
+ switch (status)
+ {
+ case OCI_SUCCESS:
+ errorMessage = "Success!";
+ returnedVal = true;
+ break;
+
+ case OCI_SUCCESS_WITH_INFO:
+ errorMessage = "Success with information!";
+ returnedVal = true;
+ break;
+
+ case OCI_NEED_DATA:
+ errorMessage = "Need data!";
+ break;
+
+ case OCI_NO_DATA:
+ errorMessage = "No data!";
+ break;
+
+ //An invalid handle was passed as a parameter or a user callback is passed an
+ //invalid handle or invalid context. No further diagnostics are available.
+ case OCI_INVALID_HANDLE:
+ errorMessage = "Invalid handle!";
+ break;
+
+ case OCI_STILL_EXECUTING:
+ errorMessage = "Still executing!";
+ break;
+
+ case OCI_CONTINUE:
+ errorMessage = "Continue!";
+ break;
+ default:
+ break;
+ }
+
+ return returnedVal;
+
+}
+
+
+bool OCICursor::Prepare(const string& stmt)
+{
+ ub4 size = stmt.size();
+ sword status = SDO_OCIStmtPrepare(conn->svchp, (OCIStmt *)stmthpToQuery, conn->errhp, (text*)stmt.c_str(), (ub4)size,
+ (text*)0, (ub4)0, (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);
+ if(!CheckError(status))
+ return false;
+
+ return true;
+}
+
+
+int OCICursor::QueryType()
+{
+ ub2 querytype_;
+
+ sword status = OCIAttrGet((dvoid *)stmthpToQuery, (ub4)OCI_HTYPE_STMT, (ub2 *)&querytype_,
+ (ub4*)NULL, (ub4)OCI_ATTR_STMT_TYPE, (OCIError *)conn->errhp);
+ if(!CheckError(status))
+ return -1;
+ return (querytype_);
+}
+
+bool OCICursor::Query(const string& query)
+{
+ if (!isOpen_)
+ Open();
+
+ row_Index = -1;
+ rows_Fetched = 0;
+ rows_Mem = 0;
+ row_Cur = -1;
+ last_Row = false;
+
+ if(!Prepare(query))
+ return false;
+
+ // query type equal to 1 = OCI_STMT_SELECT
+ if(QueryType()!=1)
+ return false;
+
+ //iters equal to zero because the defines (OCIDefines) have not located yet
+ sword status = OCIStmtExecute(conn->svchp, stmthpToQuery, conn->errhp, (ub4)0, (ub4)0, (OCISnapshot *)NULL,
+ (OCISnapshot *)NULL, OCI_STMT_SCROLLABLE_READONLY);
+ if (!CheckError(status))
+ return false;
+
+ loadCollDescription(); // load columns description
+ if(!AllocateCursor())
+ return false;
+
+ return true;
+}
+
+
+bool OCICursor::QuerySDO(const string& query)
+{
+ if (!isOpen_)
+ Open();
+
+ row_Index = -1;
+ rows_Fetched = 0;
+ rows_Mem = 0;
+ row_Cur = -1;
+ last_Row = false;
+
+ if(!Prepare(query))
+ return false;
+
+ if(!BindOrdinates())
+ return false;
+
+ // query type equal to 1 = OCI_STMT_SELECT
+ if (QueryType() != 1) //must be executed by OCIConnection->execute()
+ return false;
+
+ //iters equal to zero because the defines (OCIDefines) have not located yet
+ sword status = OCIStmtExecute(conn->svchp, stmthpToQuery, conn->errhp, (ub4)0, (ub4)0, (OCISnapshot *)NULL,
+ (OCISnapshot *)NULL, OCI_STMT_SCROLLABLE_READONLY);
+
+ if (!CheckError(status))
+ return false;
+
+ loadCollDescription(); // load columns description
+ if(!AllocateCursor())
+ return false;
+
+ return true;
+}
+
+
+int OCICursor::NumCol()
+{
+ if(numColls_>=0)
+ return numColls_;
+
+ int numcols_;
+
+ /* Get the number of columns in the query */
+ CheckError(OCIAttrGet(stmthpToQuery, OCI_HTYPE_STMT, &numcols_,
+ 0, OCI_ATTR_PARAM_COUNT, conn->errhp));
+ return (numcols_);
+}
+
+
+int OCICursor::NumRows()
+{
+ int numrows_ = 0;
+
+ /* Get the number of rows in the query */
+ CheckError(SDO_OCIAttrGet((dvoid*)stmthpToQuery, (ub4)OCI_HTYPE_STMT, (dvoid*)&numrows_,
+ (ub4*)0, (ub4)OCI_ATTR_ROW_COUNT, (OCIError*)conn->errhp));
+ return (numrows_);
+
+}
+
+
+void OCICursor::loadCollDescription()
+{
+ OCIParam* colhd=NULL;
+ //int dtype;
+ ub2 dtype = 0;
+ string colname;
+ //int colsize;
+ ub2 colsize = (ub2) 0;
+ //int colscale;
+ sb1 colscale = (sb1) 0;
+
+ numColls_ = NumCol();
+
+ int i;
+ for(i=1; i<=numColls_; ++i)
+ {
+
+ // get parameter for i-th column
+ CheckError(SDO_OCIParamGet((dvoid*)stmthpToQuery, (ub4)OCI_HTYPE_STMT, (OCIError *)conn->errhp, (dvoid**)&colhd, (ub4)i));
+
+ // get data type
+ CheckError(SDO_OCIAttrGet((dvoid *)colhd, (ub4)OCI_DTYPE_PARAM, (dvoid *)&dtype, (ub4*)0, (ub4)OCI_ATTR_DATA_TYPE, (OCIError *)conn->errhp));
+
+ // get coll name
+ text *colname_ = NULL;
+ ub4 colnamesz_;
+
+ CheckError(OCIAttrGet((dvoid *)colhd, (ub4)OCI_DTYPE_PARAM, (dvoid **)&colname_, (ub4*)&colnamesz_, (ub4)OCI_ATTR_NAME, (OCIError *)conn->errhp ));
+
+ char temp[100];
+ for(i=0;i<(int)colnamesz_;i++)
+ temp[i] = colname_[i];
+ temp[colnamesz_] = '\0';
+ colname = temp;
+
+ // retrieve the column size attribute
+ CheckError(SDO_OCIAttrGet((dvoid *)colhd, (ub4)OCI_DTYPE_PARAM, (dvoid *)&colsize, (ub4*)0, (ub4)OCI_ATTR_DATA_SIZE, (OCIError *)conn->errhp ));
+
+ // retrieve the column scale attribute
+ CheckError(SDO_OCIAttrGet((dvoid *)colhd, (ub4)OCI_DTYPE_PARAM, (dvoid *)&colscale, (ub4*)0, (ub4)OCI_ATTR_SCALE, (OCIError *)conn->errhp ));
+
+ colName_.push_back(colname);
+ colType_.push_back((int)dtype);
+ colSize_.push_back((int)colsize);
+ colScale_.push_back((int)colscale);
+ }
+}
+
+
+int OCICursor::ColType (int colnumber)
+{
+ //first coll number is 1
+ if((colnumber==0) || (colnumber>(int)colType_.size()))
+ return 0;
+
+ return colType_[colnumber-1];
+}
+
+
+string OCICursor::ColName (int colnumber)
+{
+ //first coll number is 1
+ if((colnumber==0) || (colnumber>(int)colName_.size()))
+ return "";
+
+ return colName_[colnumber-1];
+}
+
+
+int OCICursor::ColSize (int colnumber)
+{
+ //first coll number is 1
+ if((colnumber==0) || (colnumber>(int)colSize_.size()))
+ return 0;
+
+ return colSize_[colnumber-1];
+}
+
+
+int OCICursor::ColScale (int colnumber)
+{
+ //first coll number is 1
+ if((colnumber==0) || (colnumber>(int)colScale_.size()))
+ return 0;
+
+ return colScale_[colnumber-1];
+}
+
+
+ bool OCICursor::AllocateCursor()
+ {
+
+ int size;
+ int coltype=0;
+ int colsize=0;
+ int colscale=0;
+
+ try
+ {
+ ind.resize(numColls_);
+
+ for(int nc=0; nc<numColls_; ++nc)
+ {
+ defines.push_back (0);
+ buffers.push_back (0);
+ }
+
+ for(int i=1; i<=numColls_;i++)
+ {
+ coltype = colType_[i-1];
+ colsize = colSize_[i-1];
+ colscale = colScale_[i-1];
+
+ switch (coltype)
+ {
+ case 3: //INTEGER
+
+ buffers[i-1] = new signed int[MAX_ROWS];
+ colsize = sizeof(signed int);
+
+ if(!CheckError(SDO_OCIDefineByPos(stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i,
+ (dvoid *)(signed int*)buffers[i-1], (sb4)colsize, coltype,
+ (dvoid *)&ind[i-1], (ub2 *)0, (ub2 *)0,(ub4)OCI_DEFAULT)))
+ return false;
+
+ break;
+
+
+ case 2: //NUMBER
+
+ buffers[i-1] = (OCINumber *) new OCINumber[MAX_ROWS]; //();
+ if(!CheckError(OCIDefineByPos(stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i,
+ (dvoid *)buffers[i-1], sizeof(OCINumber), SQLT_VNU,
+ (dvoid *)&ind[i-1], (ub2 *)0, (ub2 *)0,(ub4)OCI_DEFAULT)))
+ return false;
+
+ break;
+
+
+ case 4: //FLOAT DOUBLE
+
+ buffers[i-1] = new double[MAX_ROWS];
+ colsize = sizeof(double);
+ coltype = 4;
+
+ if(!CheckError(SDO_OCIDefineByPos(stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i,
+ (dvoid *)(double*)buffers[i-1], (sb4)colsize, coltype,
+ (dvoid *)&ind[i-1], (ub2 *)0, (ub2 *)0, (ub4)OCI_DEFAULT)))
+ return false;
+
+
+ break;
+
+ case 96: //CHAR
+ case 9: //VARCHAR:
+ case 1: //VARCHAR2:
+ buffers[i-1] = (char *) new char[MAX_ROWS*(colsize+1)];
+
+ if(!CheckError(SDO_OCIDefineByPos(stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i,
+ (dvoid *)buffers[i-1], (sb4)(colsize+1), SQLT_STR,
+ (dvoid *)&ind[i-1], (ub2 *)0, (ub2 *)0,(ub4)OCI_DEFAULT)))
+ return false;
+
+ break;
+
+ case 12: //Date
+ buffers[i-1] = (OCIDate *) new OCIDate[MAX_ROWS]; //();
+ if(!CheckError(OCIDefineByPos(stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i,
+ (dvoid *)buffers[i-1], sizeof(OCIDate), SQLT_ODT,
+ (dvoid *)&ind[i-1], (ub2 *)0, (ub2 *)0,(ub4)OCI_DEFAULT)))
+ return false;
+
+ break;
+
+
+ case 108: //OBJECT SDO_GEOMETRY
+
+ if(!CheckError(SDO_OCIObjectNew(conn->envhp, conn->errhp, conn->svchp,
+ OCI_TYPECODE_OBJECT, conn->tdo_geometry, (dvoid*)NULL,
+ OCI_DURATION_SESSION, TRUE,
+ (dvoid**)global_geom_obj)))
+ return false;
+
+ defines[i-1] = NULL;
+
+ if(!CheckError(SDO_OCIDefineByPos(stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i,
+ (dvoid *)0, (sb4)0, SQLT_NTY, (dvoid *)&ind[i-1],
+ (ub2 *)0, (ub2 *)0, (ub4)OCI_DEFAULT)))
+ return false;
+
+ if(!CheckError(OCIDefineObject(defines[i-1], conn->errhp, conn->tdo_geometry,
+ (dvoid **)global_geom_obj, (ub4 *)0,
+ (dvoid **)global_geom_ind, (ub4 *)0)))
+ return false;
+
+ break;
+
+ case 113 : //SQLT_BLOB
+
+ // Allocate lob descriptors.
+ for(size=0;size<MAX_ROWS;size++)
+ {
+ if(!CheckError(OCIDescriptorAlloc((dvoid *) conn->envhp, (dvoid **) &lobp[size],
+ (ub4) OCI_DTYPE_LOB,
+ (size_t) 0, (dvoid **) 0)))
+ return false;
+ }
+ if(!CheckError(OCIDefineByPos (stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i,
+ (dvoid *)lobp, 0 , SQLT_BLOB,
+ (dvoid *)&ind[i-1], (ub2 *)0, (ub2 *)0, OCI_DEFAULT)))
+
+ return false;
+ break;
+
+ default:
+ break;
+
+ } //switch
+
+ } //for
+ }//try
+
+ catch(...)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+char* OCICursor::GetFieldValue(int i) //inicia em 1
+{
+
+ int tempInt;
+ double tempDouble;
+ char str[30];
+ unsigned int size;
+ string tempDate;
+
+ if(i < 1)
+ return (char*)0;
+
+ int coltype = colType_[i-1];
+ int colsize = colSize_[i-1];
+
+ //OBS: When the SQL use grouping functions (MAX, MIN, etc), the returned value always has
+ // colscale equal to zero, even when it is double
+// int colscale = colScale_[i-1];
+
+ int indica = ind[i-1].sbind[row_Index];
+
+ switch (coltype)
+ {
+ case 3: //INTEGER
+
+ if(indica == -1)
+ return "0";
+
+ tempInt = *((int*)buffers[i-1]+row_Index);
+ fieldValue = Te2String(tempInt);
+ return ((char*)fieldValue.c_str());
+ break;
+
+ case 2: //NUMBER
+
+ if(indica == -1)
+ return "0";
+
+ if(!CheckError(OCINumberToReal(conn->errhp, ((OCINumber *)buffers[i-1]+row_Index),
+ (uword)sizeof(double), (dvoid *)&tempDouble)))
+ return "0";
+
+ fieldValue = Te2String(tempDouble);
+ return ((char*)fieldValue.c_str());
+ break;
+
+
+ case 4: //FLOAT DOUBLE
+
+ if(indica == -1)
+ return "0";
+
+ tempDouble = *((const double*)buffers[i-1]+row_Index);
+ fieldValue = Te2String(tempDouble);
+ return ((char*)fieldValue.c_str());
+ break;
+
+ case 96: //CHAR
+ case 9: //VARCHAR:
+ case 1: //VARCHAR2:
+
+ if(indica == -1)
+ return "";
+
+ fieldValue = ((char*)buffers[i-1]+((colsize+1)*row_Index));
+ fieldValue = StrClean((char*)fieldValue.c_str());
+ return ((char*)fieldValue.c_str());
+ break;
+
+ case 12: //Date
+
+ if(indica == -1)
+ return "";
+
+ fieldValue = "";
+ size = sizeof(OCIDate);
+
+ if(!CheckError(OCIDateToText(conn->errhp, ((OCIDate *)buffers[i-1]+row_Index),
+ NULL, 0, NULL, 0, &size, (unsigned char*)tempDate.c_str())))
+ return "";
+ memcpy(str, tempDate.c_str(), size);
+ strncat((char*)fieldValue.c_str(), str, size);
+
+ return ((char*)fieldValue.c_str());
+ break;
+
+ case 108: //OBJECT SDO_GEOMETRY
+ default:
+ break;
+
+ } //switch
+
+ return (char*)0;
+}
+
+int OCICursor::GetDimArraySize()
+{
+ int ndim=-1;
+
+ // Get the size of the elem info array
+ CheckError(OCICollSize(conn->envhp, conn->errhp,
+ (OCIColl *)(global_geom_obj[row_Index]->sdo_elem_info),
+ &ndim));
+
+ return(ndim);
+}
+
+bool OCICursor::GetDimElement(int i,int &elem)
+{
+ int exists;
+ OCINumber *oci_number;
+ double el;
+
+
+ OCICollGetElem(conn->envhp, conn->errhp,
+ (OCIColl *)(global_geom_obj[row_Index]->sdo_elem_info),
+ (sb4)i-1, (int *)&exists,
+ (dvoid **)&oci_number, (dvoid **)0);
+
+ OCINumberToReal(conn->errhp, oci_number, (uword)sizeof(double),
+ (dvoid *)&el);
+
+ elem = (int)el;
+ return true;
+}
+
+
+int OCICursor::GetNumberOrdinates()
+{
+ int nOrds=-1;
+
+ /* Get the size of the ordinates array */
+ CheckError(OCICollSize(conn->envhp, conn->errhp,
+ (OCIColl *)(global_geom_obj[row_Index]->sdo_ordinates),
+ &nOrds));
+
+ return(nOrds);
+}
+
+bool OCICursor::GetCoordinates(int i, TeCoord2D& coord)
+{
+ int exists;
+ OCINumber *oci_number;
+ double coor_x;
+ double coor_y;
+
+ int pos = i;
+
+ OCICollGetElem(conn->envhp, conn->errhp,
+ (OCIColl *)(global_geom_obj[row_Index]->sdo_ordinates),
+ (sb4)(pos-1), (int *)&exists,
+ (dvoid **)&oci_number, (dvoid **)0);
+
+ OCINumberToReal(conn->errhp, oci_number, (uword)sizeof(double),
+ (dvoid *)&coor_x);
+
+ pos++;
+
+ OCICollGetElem(conn->envhp, conn->errhp,
+ (OCIColl *)(global_geom_obj[row_Index]->sdo_ordinates),
+ (sb4)(pos-1), (int *)&exists,
+ (dvoid **)&oci_number, (dvoid **)0);
+
+ OCINumberToReal(conn->errhp, oci_number, (uword)sizeof(double),
+ (dvoid *)&coor_y);
+
+ coord.x(coor_x);
+ coord.y(coor_y);
+
+ return true;
+}
+
+
+bool OCICursor::GetCoordinates(vector<TeCoord2D>& result)
+{
+
+ OCIIter *iterator;
+ dvoid *elem;
+ OCIInd *elemind ;
+ double ordinate1, ordinate2;
+ OCINumber *aux1;
+ OCINumber *aux2;
+ boolean eoc;
+
+ sword status = OCIIterCreate(conn->envhp, conn->errhp,
+ (OCIArray *)(global_geom_obj[row_Index]->sdo_ordinates), &iterator);
+ if (status != OCI_SUCCESS)
+ return false;
+
+ /* Get the first and second element of the clients varray */
+ status = OCIIterNext(conn->envhp, conn->errhp, iterator, &elem,
+ (dvoid **) &elemind, &eoc);
+ if (status != OCI_SUCCESS)
+ {
+ OCIIterDelete(conn->envhp, conn->errhp, &iterator);
+ return false;
+ }
+
+ aux1 = (OCINumber *)elem;
+ OCINumberToReal(conn->errhp, (OCINumber *)aux1, (uword)sizeof(double),
+ (dvoid *)&ordinate1);
+
+ status = OCIIterNext(conn->envhp, conn->errhp, iterator, &elem,
+ (dvoid **)&elemind, &eoc);
+ if (status != OCI_SUCCESS)
+ {
+ OCIIterDelete(conn->envhp, conn->errhp, &iterator);
+ return false;
+ }
+
+ aux2 = (OCINumber *)elem;
+ OCINumberToReal(conn->errhp, (OCINumber *) aux2, (uword)sizeof(double),
+ (dvoid *)&ordinate2);
+
+ TeCoord2D coord(ordinate1, ordinate2);
+ result.push_back (coord);
+
+ while (!eoc && (status == OCI_SUCCESS))
+ {
+ status = OCIIterNext(conn->envhp, conn->errhp, iterator, &elem,
+ (dvoid **)&elemind, &eoc);
+ if (status != OCI_SUCCESS)
+ {
+ OCIIterDelete(conn->envhp, conn->errhp, &iterator);
+ return false;
+ }
+
+ aux1 = (OCINumber *)elem;
+ OCINumberToReal(conn->errhp, (OCINumber *)aux1, (uword)sizeof(double),
+ (dvoid *)&ordinate1);
+
+ status = OCIIterNext(conn->envhp, conn->errhp, iterator, &elem,
+ (dvoid **)&elemind, &eoc);
+ if (status != OCI_SUCCESS)
+ {
+ OCIIterDelete(conn->envhp, conn->errhp, &iterator);
+ return false;
+ }
+
+ aux2 = (OCINumber *)elem;
+ OCINumberToReal(conn->errhp, (OCINumber *) aux2, (uword)sizeof(double),
+ (dvoid *)&ordinate2);
+
+ TeCoord2D coord(ordinate1, ordinate2);
+ result.push_back (coord);
+ }
+
+ /* destroy the iterator */
+ status = OCIIterDelete(conn->envhp, conn->errhp, &iterator);
+ return true;
+}
+
+
+int
+OCICursor::GetGeometryType()
+{
+ int gtype=-1;
+
+ CheckError(OCINumberToInt(conn->errhp, &(global_geom_obj[row_Index]->sdo_gtype),
+ (uword)sizeof(int), OCI_NUMBER_SIGNED,
+ (dvoid *)>ype));
+
+ return gtype;
+}
+
+int
+OCICursor::GetSpatialReferenceId()
+{
+ int srid=-1;
+
+ CheckError(OCINumberToInt(conn->errhp, &(global_geom_obj[row_Index]->sdo_srid),
+ (uword)sizeof(int), OCI_NUMBER_SIGNED,
+ (dvoid *)&srid));
+
+ return srid;
+}
+
+bool
+OCICursor::GetXYZcoord(double& x, double& y)
+{
+ if (global_geom_ind[row_Index]->sdo_point._atomic == OCI_IND_NOTNULL)
+ {
+ if (global_geom_ind[row_Index]->sdo_point.x == OCI_IND_NOTNULL)
+ {
+ if(!CheckError(OCINumberToReal(conn->errhp, &(global_geom_obj[row_Index]->sdo_point.x),
+ (uword)sizeof(double),(dvoid *)&x)))
+
+ return false;
+ }
+
+ if (global_geom_ind[row_Index]->sdo_point.y == OCI_IND_NOTNULL)
+ {
+ if(!CheckError(OCINumberToReal(conn->errhp, &(global_geom_obj[row_Index]->sdo_point.y),
+ (uword)sizeof(double),(dvoid *)&y)))
+ return false;
+ }
+
+ /*
+ if (z && (global_geom_ind[row_Index]->sdo_point.z == OCI_IND_NOTNULL))
+ {
+ if(!CheckError(OCINumberToReal(conn->errhp, &(global_geom_obj[row_Index]->sdo_point.z),
+ (uword)sizeof(double),(dvoid *)&z)))
+ return false;
+ }*/
+
+ return true;
+ }
+ else
+ return false;
+}
+
+
+bool
+OCICursor::WriteBlob(const unsigned char* buffer, unsigned int bufsize)
+{
+
+ int offset = 1;
+ sword status;
+
+ status = SDO_OCILobWrite(conn->svchp, conn->errhp, *lobp, &bufsize, offset,
+ (dvoid *) buffer, (ub4) bufsize, OCI_ONE_PIECE,
+ (dvoid *)0, (sb4 (*)(dvoid *, dvoid *, ub4 *, ub1 *)) 0,
+ (ub2) 0, (ub1) SQLCS_IMPLICIT);
+
+ CheckError(status);
+ if (status == OCI_SUCCESS)
+ return true;
+
+ return false;
+}
+
+int
+OCICursor::SizeBlob()
+{
+ ub4 lenp=0;
+ CheckError(OCILobGetLength(conn->svchp, conn->errhp, lobp[row_Index], &lenp));
+ return lenp;
+}
+
+
+bool
+OCICursor::ReadBlob(unsigned char* buffer, unsigned int bufsize)
+{
+ sword status;
+ int offset = 1;
+
+ status = SDO_OCILobRead(conn->svchp, conn->errhp, lobp[row_Index], &bufsize, offset,
+ (dvoid *) buffer, (ub4)bufsize , (dvoid *) 0, 0, (ub2) 0,
+ (ub1) SQLCS_IMPLICIT);
+
+ if (status == OCI_SUCCESS )
+ return true;
+
+ return false;
+}
+
+
+
diff --git a/src/terralib/drivers/OracleSpatial/cursor.h b/src/terralib/drivers/OracleSpatial/cursor.h
new file mode 100644
index 0000000..f7e3864
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/cursor.h
@@ -0,0 +1,225 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef OCICursor_H
+#define OCICursor_H
+
+#include <connect.h>
+#include <vector>
+#include <TeCoord2D.h>
+
+using namespace std;
+
+// Object SDO_GEOMETRY - Oracle Spatial
+#define TYPE_OWNER "MDSYS"
+#define SDO_ORDINATE_ARRAY TYPE_OWNER".SDO_ORDINATE_ARRAY"
+#define SDO_ELEM_INFO_ARRAY TYPE_OWNER".SDO_ELEM_INFO_ARRAY"
+#define SDO_GEOMETRY TYPE_OWNER".SDO_GEOMETRY"
+
+#define MAX_ROWS 500 // number of lines to be fetched into memory
+
+// type point in Oracle Spatial
+struct sdo_point_type
+{
+ OCINumber x;
+ OCINumber y;
+ OCINumber z;
+};
+
+typedef struct sdo_point_type sdo_point_type;
+
+//type geometry in oracle spatial
+struct sdo_geometry
+{
+ OCINumber sdo_gtype;
+ OCINumber sdo_srid;
+ sdo_point_type sdo_point;
+ OCIArray *sdo_elem_info;
+ OCIArray *sdo_ordinates;
+};
+
+typedef struct sdo_geometry SDO_GEOMETRY_TYPE;
+
+
+//Indicator structures for SDO_GEOMETRY_TYPE
+struct sdo_point_type_ind
+{
+ OCIInd _atomic;
+ OCIInd x;
+ OCIInd y;
+ OCIInd z;
+};
+
+typedef struct sdo_point_type_ind sdo_point_type_ind;
+
+struct SDO_GEOMETRY_ind
+{
+ OCIInd _atomic;
+ OCIInd sdo_gtype;
+ OCIInd sdo_srid;
+ struct sdo_point_type_ind sdo_point;
+ OCIInd sdo_elem_info;
+ OCIInd sdo_ordinates;
+};
+
+typedef struct SDO_GEOMETRY_ind SDO_GEOMETRY_ind;
+
+struct sb2ind
+{
+ sb2 sbind[MAX_ROWS];
+};
+typedef struct sb2ind indarray;
+
+
+//! Oracle generic Cursor class
+
+class OCICursor
+{
+protected:
+ OCIConnection* conn; // pointer to connection, environment, etc
+ OCIStmt* stmthpToQuery; // OCI statement handle to query
+ OCIDescribe* dschp; //environment describe handle - contem informacoes sobre esquemas de objetos
+ bool isOpen_; // if the cursor is open or not (if the stmthpToQuery was allocated)
+ string errorMessage;
+
+
+ //-------- buffers to store data in memory - client side
+ vector<void *> buffers; // buffer to store simple data type (varchar, number, date, etc)
+ vector <indarray> ind; // buffer to store null indicator
+
+ SDO_GEOMETRY_TYPE* global_geom_obj[MAX_ROWS]; // buffer to store spatial object
+ SDO_GEOMETRY_ind* global_geom_ind[MAX_ROWS]; // buffer to store spatial object indicator
+
+ OCILobLocator* lobp[MAX_ROWS]; // buffer to store blob
+
+ vector<OCIDefine *> defines; // OCIDefine to link buffers in client side and the statement handle
+
+ string fieldValue;
+
+ OCIArray* ordinates; //store the ordinates to be used in a query (bind)
+
+ //-------- information to handle the cursor
+ short row_Index; // relative current row index in the memory buffer
+ int row_Cur; // absolute current cursor row
+ int rows_Fetched; // rows fetched from database
+ int rows_Mem; // rows on memory buffer - client side
+ bool last_Row; // if is last row
+
+
+ //-------- information about columns of the cursor
+ int numColls_; // number of columns
+ vector<string> colName_; // name of columns
+ vector<int> colType_; // type of columns
+ vector<int> colSize_; // size of columns
+ vector<int> colScale_; // sclae of columns
+
+public:
+
+ //! Cursor constructor
+ OCICursor(OCIConnection* conn);
+
+ //! Cursor destructor
+ ~OCICursor() { Close(); }
+
+ //! Open the Cursor
+ bool Open();
+
+
+ //! return the error message
+ string getErrorMessage() { return errorMessage;}
+ //! Check if the cursor is open
+ bool isOpen() { return isOpen_; }
+ OCIConnection* Conn() { return conn; }
+ //! Return the current row
+ int CurrentRow() { return row_Cur; }
+
+
+ //! Close the Cursor
+ void Close();
+
+ //! Define
+ void DefineByPos(int pos, void* value, int size, void* indicator, int type);
+
+ //! Execute and Fetch
+ bool Execute();
+ bool Fetch(int rows);
+
+ bool Query(const string& query);
+ bool QuerySDO(const string& query);
+
+ //! Move operations
+ bool MoveFirst();
+ bool MoveNext();
+ bool MoveTo(int pos);
+ bool MoveLast();
+
+ //! Return the columns number
+ int NumCol(void);
+
+ //! Return the rows number
+ int NumRows(void);
+
+ //! Load all column descriptions (name, type, size and scale)
+ void loadCollDescription ();
+
+ //! Return the column type (SQLT)
+ int ColType (int colnumber);
+
+ //! Return the column name
+ string ColName (int colnumber);
+
+ //! Return the column size
+ int ColSize (int colnumber);
+
+ //! Return the column scale (number of digits after decimal point)
+ int ColScale (int colnumber);
+
+ bool AppendOrdinates(const double& val);
+ bool BindOrdinates();
+
+ bool Prepare(const string& stmt);
+ int QueryType();
+
+ bool AllocateCursor(void);
+ char* GetFieldValue(int i);
+ int GetDimArraySize();
+ bool GetDimElement(int i,int &elem);
+ int GetNumberOrdinates(void);
+ bool GetCoordinates(int i,TeCoord2D& coord);
+ bool GetCoordinates(vector<TeCoord2D>& result);
+ int GetGeometryType();
+ int GetSpatialReferenceId();
+ bool GetXYZcoord (double& x, double& y);
+ void FreeResult(void);
+
+ bool WriteBlob(const unsigned char* buffer, unsigned int bufsize);
+ int SizeBlob();
+ bool ReadBlob(unsigned char* buffer, unsigned int bufsize);
+
+protected:
+ // Throws exception if error found
+ bool CheckError(sword status);
+};
+
+#endif // OCICursor_H
+
diff --git a/src/terralib/drivers/OracleSpatial/ociap.h b/src/terralib/drivers/OracleSpatial/ociap.h
new file mode 100644
index 0000000..56ff182
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/ociap.h
@@ -0,0 +1,10097 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/ociap.h,v 1.2 2002/12/13 13:35:48 karine Exp $
+ */
+
+/* Copyright (c) 1996, 2002, Oracle Corporation. All rights reserved. */
+
+/* NOTE: See 'header_template.doc' in the 'doc' dve under the 'forms'
+ directory for the header file template that includes instructions.
+*/
+
+/*
+ NAME
+ ociap.h - Oracle Call Interface - Ansi Prototypes
+
+ DESCRIPTION
+ <short description of component this file declares/defines>
+
+ RELATED DOCUMENTS
+
+ INSPECTION STATUS
+ Inspection date:
+ Inspection status:
+ Estimated increasing cost defects per page:
+ Rule sets:
+
+ ACCEPTANCE REVIEW STATUS
+ Review date:
+ Review status:
+ Reviewers:
+
+ PUBLIC FUNCTION(S)
+ <list of external functions declared/defined - with one-line descriptions>
+
+ PRIVATE FUNCTION(S)
+ <list of static functions defined in .c file - with one-line descriptions>
+
+ EXAMPLES
+
+ NOTES
+ <other useful comments, qualifications, etc.>
+
+ MODIFIED (MM/DD/YY)
+ sichandr 02/12/02 - fix OCIXMLTypeExists
+ gayyappa 02/01/02 - fix 2210776 : change Dom to DOM
+ sichandr 10/24/01 - OCISvcCtx for XMLType create routines
+ schandir 09/14/01 - Add prototypes for Stmt Caching
+ abande 09/04/01 - Add Prototypes for Session Pooling Methods
+ stakeda 09/12/01 - add OCINlsCharSetConvert
+ whe 08/28/01 - add OCIEnvNlsCreate
+ wzhang 08/22/01 - Add OCINlsCharSetNameToId.
+ whe 10/05/01 - add prototype for OCIXMLType functions
+ mdmehta 04/06/01 - Bug 1683763, OCIDateTimeToText: buf_size to ub4*
+ schandir 12/12/00 - modify the ociconnectionpoolcreate() interface.
+ porangas 12/04/00 - Forward merge bug#974710 to 9i
+ rpingte 11/29/00 - Fix bug# 1485795.
+ gtarora 11/30/00 - fix comment for OCILobIsTemporary
+ akatti 11/07/00 - [1198379]:add OCIRowidToChar
+ bpalaval 10/15/00 - Forward merge 892654.
+ kmohan 09/18/00 - add OCILogon2
+ etucker 07/28/00 - add OCIIntervalFromTZ
+ vjayaram 07/18/00 - add connection pooling changes
+ etucker 07/13/00 - add dls apis for oci
+ hmasaki 07/05/00 - fix 1230846: forward merge into 8.2
+ mbastawa 06/05/00 - add OCIStmtFetch2
+ rxgovind 06/07/00 - update OCIAnyData interfaces
+ rxgovind 05/04/00 - add OCIAnyDataSet interfaces
+ rkasamse 05/01/00 - remove attrno from OCIAnyDataAttrGet
+ rkasamse 03/13/00 - add prototype s for OCCIAnyData
+ slari 09/01/99 - remove OCIEnvCallback
+ slari 08/23/99 - add OCIUcb in user callback functions
+ dsaha 07/07/99 - Add OCIFEnvCreate for forms
+ vyanaman 06/21/99 - Change OCI DateTime/Interval APIs.
+ esoyleme 07/01/99 - expose MTS performance enhancements
+ whe 06/14/99 - bug727872:add CONST to match definitions
+ kkarun 02/23/99 - Fix OCIDateTime APIs
+ jiyang 12/07/98 - Add comments for OCI_NLS_DUAL_CURRENCY
+ aroy 12/01/98 - add OCIEnvCreate
+ slari 11/23/98 - use ORASTDARG
+ slari 11/21/98 - replace ellipsis by arglist in OCIUserCallback
+ thchang 10/20/98 - correct comment on OCILobCreateTemporary
+ slari 09/08/98 - allow envh to receive error info also in CallbackReg/
+ kkarun 09/02/98 - Change const to CONST
+ aroy 08/04/98 - add OCITerminate calls
+ nramakri 06/25/98 - remove CONST from some OCIPickler APIs
+ jiyang 06/22/98 - Fix a lint error
+ nmallava 06/08/98 - ociistemporary -> envhp
+ jhasenbe 05/27/98 - Remove definitions for U-Calls (Unicode)
+ nmallava 05/18/98 - add comments
+ sgollapu 05/19/98 - Change text to OraText
+ aroy 04/20/98 - merge forward 8.0.5 -> 8.1.3
+ nbhatt 05/14/98 - aq listen call
+ lchidamb 03/02/98 - Client Notification prototypes
+ vyanaman 04/19/98 - System Timestamp
+ kkarun 04/17/98 - Add more Interval functions
+ vyanaman 04/17/98 - Fix min (proc error)
+ vyanaman 04/16/98 - Add get/set TZ
+ kkarun 04/13/98 - Add Datetime prototypes
+ rkasamse 04/13/98 - change OCIEnv* to dvoid* for context/memory cart serv
+ rkasamse 04/15/98 - chage pickler cart interface
+ slari 03/20/98 - change proto of OCIUserCallback
+ slari 02/17/98 - add OCIUserCallback
+ jiyang 04/02/98 - Accept both env and user handles for NLS
+ rkasamse 03/20/98 - remove prototypes for OCIMemoryDuration* functions.
+ tsaulys 03/20/98 - use environment or session handle
+ nmallava 04/09/98 - OCILobLocatorAssign
+ nmallava 04/07/98 - lobgetchunksize and writeappend apis
+ jhasenbe 04/06/98 - Add new interfaces for Unicode support
+ nmallava 03/17/98 - add interfaces
+ nmallava 03/16/98 - add open/close apis
+ nmallava 03/10/98 - add temporary lobs apis
+ sgollapu 07/10/97 - Add OCIReset
+ sgollapu 02/09/98 - OCI non-blocking
+ nramakri 01/16/98 - remove #ifdef NEVER clause for OCIExtract
+ rmurthy 01/08/98 - OCIContextGenerateKey: change ub1 to ub4
+ ewaugh 12/18/97 - Turn type wrappers into functions.
+ skabraha 12/02/97 - adding OCIFile functions
+ rhwu 12/02/97 - add OCI Thread
+ nramakri 12/15/97 - move to core4
+ nramakri 12/11/97 - modify OCIExtract prototype
+ ewaugh 12/10/97 - add OCIFormat prototypes
+ nmallava 12/17/97 - Add ilob open and close apis
+ rkasamse 12/03/97 - Change some of the function names for pickler cartrid
+ nramakri 11/12/97 - add OCIExtract prototypes
+ rkasamse 11/21/97 - add prototypes for memory cartridge services and cont
+ rkasamse 11/03/97 - Add pickler cartridge interfaces.
+ jiyang 11/11/97 - Add NLS service for cartridge
+ tanguyen 08/19/97 -
+ cxcheng 07/30/97 - replace OCISvcCtx with OCISvcCtx
+ schandra 06/25/97 - AQ OCI interface
+ bnainani 07/21/97 - add prototypes for Oracle XA extensions
+ esoyleme 05/13/97 - move failover callback prototype
+ skmishra 05/06/97 - stdc compiler fixes
+ skmishra 04/24/97 - C++ Compatibility changes
+ skotsovo 04/21/97 - make lob parameter names consistent
+ rwhitman 04/16/97 - Fix LOB prototypes - Olint OCI 8.0.3
+ ramkrish 04/15/97 - Add free flag to OCILobFlushBuffer
+ dchatter 04/10/97 - add nzt.h inclusion
+ cxcheng 04/09/97 - change objnamp from CONST text* to dvoid*
+ cxcheng 04/08/97 - fix prototype of OCIDescribeAny()
+ skotsovo 03/31/97 - remove OCILobLocatorSize
+ skotsovo 03/27/97 - add OCILobLoadFromFile
+ bcchang 02/18/97 - Fix syntax error
+ dchatter 01/13/97 - fix comments on LOB calls
+ aroy 01/10/97 - remove ocilobfilecreate delete
+ sgollapu 12/27/96 - Correct OCILogon prototype
+ dchatter 01/04/97 - comments to describe the functions
+ sgollapu 11/25/96 - Change OCILobFileIsExistent
+ schandra 11/18/96 - Remove xa.h include
+ sgollapu 11/09/96 - Change prototype of OCIDescribeAny
+ dchatter 10/31/96 - delete CONST from lob write cb fn
+ dchatter 10/30/96 - more changes
+ dchatter 10/26/96 - lob/file long name corrections
+ slari 10/16/96 - delete unused calls
+ rwessman 10/29/96 - Fixed OCISecurityGetIdentity prototype
+ bcchang 10/25/96 - Fix syntax error
+ sgollapu 10/22/96 - Add OCILogon and OCILogoff
+ rwessman 10/16/96 - Added cryptographic and digital signature functions
+ sgollapu 10/10/96 - Add ocibdp and ocibdn
+ rxgovind 10/07/96 - add oci file calls
+ skotsovo 10/01/96 - move orl lob fnts to oci
+ skotsovo 09/20/96 - in OCILobGetLength(), remove the 'isnull' parameter.
+ aroy 08/29/96 - change prototype for Nchar Lob support
+ dchatter 08/21/96 - OCIResultSetToStmt prototype change
+ sthakur 08/14/96 - add OCIParamSet
+ schandra 07/26/96 - TX OCI return values - sb4->sword
+ aroy 07/17/96 - terminology change: OCILobLocator => OCILobLocator
+ dchatter 07/01/96 - create ANSI prototypes
+ dchatter 07/01/96 - Creation
+
+*/
+
+
+#ifndef OCIAP_ORACLE
+# define OCIAP_ORACLE
+
+# ifndef ORATYPES
+# include <oratypes.h>
+# endif
+
+#ifndef ORASTDARG
+#include <stdarg.h>
+#define ORASTDARG
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef NZT_ORACLE
+#include <nzt.h>
+#endif /* NZT_ORACLE */
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ PRIVATE TYPES AND CONSTANTS
+ ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ PUBLIC FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+/*****************************************************************************
+ DESCRIPTION
+******************************************************************************
+Note: the descriptions of the functions are alphabetically arranged. Please
+maintain the arrangement when adding a new function description. The actual
+prototypes are below this comment section and donot follow any alphabetical
+ordering.
+
+
+--------------------------------OCIAttrGet------------------------------------
+
+OCIAttrGet()
+Name
+OCI Attribute Get
+Purpose
+This call is used to get a particular attribute of a handle.
+Syntax
+sword OCIAttrGet ( CONST dvoid *trgthndlp,
+ ub4 trghndltyp,
+ dvoid *attributep,
+ ub4 *sizep,
+ ub4 attrtype,
+ OCIError *errhp );
+Comments
+This call is used to get a particular attribute of a handle.
+See Appendix B, "Handle Attributes", for a list of handle types and their
+readable attributes.
+Parameters
+trgthndlp (IN) - is the pointer to a handle type.
+trghndltyp (IN) - is the handle type.
+attributep (OUT) - is a pointer to the storage for an attribute value. The
+attribute value is filled in.
+sizep (OUT) - is the size of the attribute value.
+This can be passed in as NULL for most parameters as the size is well known.
+For text* parameters, a pointer to a ub4 must be passed in to get the length
+of the string.
+attrtype (IN) - is the type of attribute.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+OCIAttrSet()
+
+--------------------------------OCIAttrSet------------------------------------
+
+
+OCIAttrSet()
+Name
+OCI Attribute Set
+Purpose
+This call is used to set a particular attribute of a handle or a descriptor.
+Syntax
+sword OCIAttrSet ( dvoid *trgthndlp,
+ ub4 trghndltyp,
+ dvoid *attributep,
+ ub4 size,
+ ub4 attrtype,
+ OCIError *errhp );
+Comments
+This call is used to set a particular attribute of a handle or a descriptor.
+See Appendix B for a list of handle types and their writeable attributes.
+Parameters
+trghndlp (IN/OUT) - the pointer to a handle type whose attribute gets
+modified.
+trghndltyp (IN/OUT) - is the handle type.
+attributep (IN) - a pointer to an attribute value.
+The attribute value is copied into the target handle. If the attribute value
+is a pointer, then only the pointer is copied, not the contents of the pointer.
+size (IN) - is the size of an attribute value. This can be passed in as 0 for
+most attributes as the size is already known by the OCI library. For text*
+attributes, a ub4 must be passed in set to the length of the string.
+attrtype (IN) - the type of attribute being set.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+OCIAttrGet()
+
+
+
+--------------------------------OCIBindArrayOfStruct--------------------------
+
+
+
+OCIBindArrayOfStruct()
+Name
+OCI Bind for Array of Structures
+Purpose
+This call sets up the skip parameters for a static array bind.
+Syntax
+sword OCIBindArrayOfStruct ( OCIBind *bindp,
+ OCIError *errhp,
+ ub4 pvskip,
+ ub4 indskip,
+ ub4 alskip,
+ ub4 rcskip );
+Comments
+This call sets up the skip parameters necessary for a static array bind.
+This call follows a call to OCIBindByName() or OCIBindByPos(). The bind
+handle returned by that initial bind call is used as a parameter for the
+OCIBindArrayOfStruct() call.
+For information about skip parameters, see the section "Arrays of Structures"
+on page 4-16.
+Parameters
+bindp (IN) - the handle to a bind structure.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value.
+indskip (IN) - skip parameter for the next indicator value or structure.
+alskip (IN) - skip parameter for the next actual length value.
+rcskip (IN) - skip parameter for the next column-level return code value.
+Related Functions
+OCIAttrGet()
+
+
+--------------------------------OCIBindByName---------------------------------
+
+OCIBindByName()
+Name
+OCI Bind by Name
+Purpose
+Creates an association between a program variable and a placeholder in a SQL
+statement or PL/SQL block.
+Syntax
+sword OCIBindByName (
+ OCIStmt *stmtp,
+ OCIBind **bindp,
+ OCIError *errhp,
+ CONST OraText *placeholder,
+ sb4 placeh_len,
+ dvoid *valuep,
+ sb4 value_sz,
+ ub2 dty,
+ dvoid *indp,
+ ub2 *alenp,
+ ub2 *rcodep,
+ ub4 maxarr_len,
+ ub4 *curelep,
+ ub4 mode );
+Description
+This call is used to perform a basic bind operation. The bind creates an
+association between the address of a program variable and a placeholder in a
+SQL statement or PL/SQL block. The bind call also specifies the type of data
+which is being bound, and may also indicate the method by which data will be
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp
+parameter.
+Data in an OCI application can be bound to placeholders statically or
+dynamically. Binding is static when all the IN bind data and the OUT bind
+buffers are well-defined just before the execute. Binding is dynamic when the
+IN bind data and the OUT bind buffers are provided by the application on
+demand at execute time to the client library. Dynamic binding is indicated by
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see
+the section "Runtime Data Allocation and Piecewise Operations" on
+page 5-16.
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle,
+which is implicitly allocated by the bind call A separate bind handle is
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes
+necessary when binding certain data types or handling input data in certain
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application
+will be using user-defined callback functions, OCIBindDynamic() must
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly
+allocated by this call. The bind handle maintains all the bind information for
+this particular input value. The handle is feed implicitly when the statement
+handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+placeholder (IN) - the placeholder attributes are specified by name if ocibindn()
+is being called.
+placeh_len (IN) - the length of the placeholder name specified in placeholder.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the
+type specified in the dty parameter. An array of data values can be specified
+for mapping into a PL/SQL table or for providing data for SQL multiple-row
+operations. When an array of bind values is provided, this is called an array
+bind in OCI terms. Additional attributes of the array bind (not bind to a
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call.
+For a REF, named data type bind, the valuep parameter is used only for IN
+bind data. The pointers to OUT buffers are set in the pgvpp parameter
+initialized by OCIBindObject(). For named data type and REF binds, the bind
+values are unpickled into the Object Cache. The OCI object navigational calls
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and
+OCIBindDynamic() must be invoked to provide callback functions if desired.
+value_sz (IN) - the size of a data value. In the case of an array bind, this is the
+maximum size of any element possible with the actual sizes being specified in
+the alenp parameter.
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum
+size of the data that can be ever provided at runtime for data types other than
+named data types or REFs.
+dty (IN) - the data type of the value(s) being bound. Named data types
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been
+initialized in object mode. For named data types, or REFs, additional calls
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data
+types, this is a pointer to sb2 or an array of sb2s. For named data types,
+this pointer is ignored and the actual pointer to the indicator structure or
+an array of indicator structures is initialized by OCIBindObject().
+Ignored for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each
+element in alenp is the length of the data in the corresponding element in the
+bind value array before and after the execute. This parameter is ignored for
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If
+maxarr_len is non-zero, then either OCIBindDynamic() or
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes.
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz
+parameter defines the maximum size of the data that can be ever
+provided at runtime. The application must be ready to provide the OCI
+library runtime IN data buffers at any time and any number of times.
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered
+with a subsequent call to OCIBindDynamic().
+a polling mechanism using calls supplied by the OCI. This mode
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see
+the section "Runtime Data Allocation and Piecewise Operations" on
+page 5-16.
+When the allocated buffers are not required any more, they should be
+freed by the client.
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+
+-------------------------------OCIBindByPos-----------------------------------
+
+
+OCIBindByPos()
+Name
+OCI Bind by Position
+Purpose
+Creates an association between a program variable and a placeholder in a SQL
+statement or PL/SQL block.
+Syntax
+sword OCIBindByPos (
+ OCIStmt *stmtp,
+ OCIBind **bindp,
+ OCIError *errhp,
+ ub4 position,
+ dvoid *valuep,
+ sb4 value_sz,
+ ub2 dty,
+ dvoid *indp,
+ ub2 *alenp,
+ ub2 *rcodep,
+ ub4 maxarr_len,
+ ub4 *curelep,
+ ub4 mode);
+
+Description
+This call is used to perform a basic bind operation. The bind creates an
+association between the address of a program variable and a placeholder in a
+SQL statement or PL/SQL block. The bind call also specifies the type of data
+which is being bound, and may also indicate the method by which data will be
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp
+parameter.
+Data in an OCI application can be bound to placeholders statically or
+dynamically. Binding is static when all the IN bind data and the OUT bind
+buffers are well-defined just before the execute. Binding is dynamic when the
+IN bind data and the OUT bind buffers are provided by the application on
+demand at execute time to the client library. Dynamic binding is indicated by
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see
+the section "Runtime Data Allocation and Piecewise Operations" on
+page 5-16
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle,
+which is implicitly allocated by the bind call A separate bind handle is
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes
+necessary when binding certain data types or handling input data in certain
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application
+will be using user-defined callback functions, OCIBindDynamic() must
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly
+allocated by this call. The bind handle maintains all the bind information for
+this particular input value. The handle is feed implicitly when the statement
+handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+position (IN) - the placeholder attributes are specified by position if ocibindp()
+is being called.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the
+type specified in the dty parameter. An array of data values can be specified
+for mapping into a PL/SQL table or for providing data for SQL multiple-row
+operations. When an array of bind values is provided, this is called an array
+bind in OCI terms. Additional attributes of the array bind (not bind to a
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call.
+For a REF, named data type bind, the valuep parameter is used only for IN
+bind data. The pointers to OUT buffers are set in the pgvpp parameter
+initialized by OCIBindObject(). For named data type and REF binds, the bind
+values are unpickled into the Object Cache. The OCI object navigational calls
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and
+OCIBindDynamic() must be invoked to provide callback functions if desired.
+value_sz (IN) - the size of a data value. In the case of an array bind, this is the
+maximum size of any element possible with the actual sizes being specified in
+the alenp parameter.
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum
+size of the data that can be ever provided at runtime for data types other than
+named data types or REFs.
+dty (IN) - the data type of the value(s) being bound. Named data types
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been
+initialized in object mode. For named data types, or REFs, additional calls
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data
+types, this is a pointer to sb2 or an array of sb2s. For named data types,
+this pointer is ignored and the actual pointer to the indicator structure or
+an array of indicator structures is initialized by OCIBindObject(). Ignored
+for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each
+element in alenp is the length of the data in the corresponding element in the
+bind value array before and after the execute. This parameter is ignored for
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If
+maxarr_len is non-zero, then either OCIBindDynamic() or
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes.
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz
+parameter defines the maximum size of the data that can be ever
+provided at runtime. The application must be ready to provide the OCI
+library runtime IN data buffers at any time and any number of times.
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered
+with a subsequent call to OCIBindDynamic() .
+a polling mechanism using calls supplied by the OCI. This mode
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see
+the section "Runtime Data Allocation and Piecewise Operations" on
+page 5-16.
+When the allocated buffers are not required any more, they should be
+freed by the client.
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+
+-------------------------------OCIBindDynamic---------------------------------
+
+OCIBindDynamic()
+Name
+OCI Bind Dynamic Attributes
+Purpose
+This call is used to register user callbacks for dynamic data allocation.
+Syntax
+sword OCIBindDynamic( OCIBind *bindp,
+ OCIError *errhp,
+ dvoid *ictxp,
+ OCICallbackInBind (icbfp)(
+ dvoid *ictxp,
+ OCIBind *bindp,
+ ub4 iter,
+ ub4 index,
+ dvoid **bufpp,
+ ub4 *alenp,
+ ub1 *piecep,
+ dvoid **indp ),
+ dvoid *octxp,
+ OCICallbackOutBind (ocbfp)(
+ dvoid *octxp,
+ OCIBind *bindp,
+ ub4 iter,
+ ub4 index,
+ dvoid **bufp,
+ ub4 **alenpp,
+ ub1 *piecep,
+ dvoid **indpp,
+ ub2 **rcodepp) );
+Comments
+This call is used to register user-defined callback functions for providing
+data for an UPDATE or INSERT if OCI_DATA_AT_EXEC mode was specified in a
+previous call to OCIBindByName() or OCIBindByPos().
+The callback function pointers must return OCI_CONTINUE if it the call is
+successful. Any return code other than OCI_CONTINUE signals that the client
+wishes to abort processing immediately.
+For more information about the OCI_DATA_AT_EXEC mode, see the section
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+bindp (IN/OUT) - a bind handle returned by a call to OCIBindByName() or
+OCIBindByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+ictxp (IN) - the context pointer required by the call back function icbfp.
+icbfp (IN) - the callback function which returns a pointer to the IN bind
+value or piece at run time. The callback takes in the following parameters.
+ictxp (IN/OUT) - the context pointer for this callback function.
+bindp (IN) - the bind handle passed in to uniquely identify this bind
+variable.
+iter (IN) - 1-based execute iteration value.
+index (IN) - index of the current array, for an array bind. 1 based not
+greater than curele parameter of the bind call.
+index (IN) - index of the current array, for an array bind. This parameter
+is 1-based, and may not be greater than curele parameter of the bind call.
+bufpp (OUT) - the pointer to the buffer.
+piecep (OUT) - which piece of the bind value. This can be one of the
+following values - OCI_ONE_PIECE, OCI_FIRST_PIECE,
+OCI_NEXT_PIECE and OCI_LAST_PIECE.
+indp (OUT) - contains the indicator value. This is apointer to either an
+sb2 value or a pointer to an indicator structure for binding named data
+types.
+indszp (OUT) - contains the indicator value size. A pointer containing
+the size of either an sb2 or an indicator structure pointer.
+octxp (IN) - the context pointer required by the callback function ocbfp.
+ocbfp (IN) - the callback function which returns a pointer to the OUT bind
+value or piece at run time. The callback takes in the following parameters.
+octxp (IN/OUT) - the context pointer for this call back function.
+bindp (IN) - the bind handle passed in to uniquely identify this bind
+variable.
+iter (IN) - 1-based execute iteration value.
+index (IN) - index of the current array, for an array bind. This parameter
+is 1-based, and must not be greater than curele parameter of the bind call.
+bufpp (OUT) - a pointer to a buffer to write the bind value/piece.
+buflp (OUT) - returns the buffer size.
+alenpp (OUT) - a pointer to a storage for OCI to fill in the size of the bind
+value/piece after it has been read.
+piecep (IN/OUT) - which piece of the bind value. It will be set by the
+library to be one of the following values - OCI_ONE_PIECE or
+OCI_NEXT_PIECE. The callback function can leave it unchanged or set
+it to OCI_FIRST_PIECE or OCI_LAST_PIECE. By default -
+OCI_ONE_PIECE.
+indpp (OUT) - returns a pointer to contain the indicator value which
+either an sb2 value or a pointer to an indicator structure for named data
+types.
+indszpp (OUT) - returns a pointer to return the size of the indicator
+value which is either size of an sb2 or size of an indicator structure.
+rcodepp (OUT) - returns a pointer to contains the return code.
+Related Functions
+OCIAttrGet()
+
+
+---------------------------------OCIBindObject--------------------------------
+
+
+OCIBindObject()
+Name
+OCI Bind Object
+Purpose
+This function sets up additional attributes which are required for a named
+data type (object) bind.
+Syntax
+sword OCIBindObject ( OCIBind *bindp,
+ OCIError *errhp,
+ CONST OCIType *type,
+ dvoid **pgvpp,
+ ub4 *pvszsp,
+ dvoid **indpp,
+ ub4 *indszp, );
+Comments
+This function sets up additional attributes which binding a named data type
+or a REF. An error will be returned if this function is called when the OCI
+environment has been initialized in non-object mode.
+This call takes as a paramter a type descriptor object (TDO) of datatype
+OCIType for the named data type being defined. The TDO can be retrieved
+with a call to OCITypeByName().
+If the OCI_DATA_AT_EXEC mode was specified in ocibindn() or ocibindp(), the
+pointers to the IN buffers are obtained either using the callback icbfp
+registered in the OCIBindDynamic() call or by the OCIStmtSetPieceInfo() call.
+The buffers are dynamically allocated for the OUT data and the pointers to
+these buffers are returned either by calling ocbfp() registered by the
+OCIBindDynamic() or by setting the pointer to the buffer in the buffer passed
+in by OCIStmtSetPieceInfo() called when OCIStmtExecute() returned
+OCI_NEED_DATA. The memory of these client library- allocated buffers must be
+freed when not in use anymore by using the OCIObjectFreee() call.
+Parameters
+bindp ( IN/OUT) - the bind handle returned by the call to OCIBindByName()
+or OCIBindByPos().
+errhp ( IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+type ( IN) - points to the TDO which describes the type of the program
+variable being bound. Retrieved by calling OCITypeByName().
+pgvpp ( IN/OUT) - points to a pointer to the program variable buffer. For an
+array, pgvpp points to an array of pointers. When the bind variable is also an
+OUT variable, the OUT Named Data Type value or REF is allocated
+(unpickled) in the Object Cache, and a pointer to the value or REF is returned,
+At the end of execute, when all OUT values have been received, pgvpp points
+to an array of pointer(s) to these newly allocated named data types in the
+object cache.
+pgvpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the Named
+Data Type buffers are requested at runtime. For static array binds, skip
+factors may be specified using the OCIBindArrayOfStruct() call. The skip
+factors are used to compute the address of the next pointer to the value, the
+indicator structure and their sizes.
+pvszsp ( IN/OUT) - points to the size of the program variable. The size of the
+named data type is not required on input. For an array, pvszsp is an array of
+ub4s. On return, for OUT bind variables, this points to size(s) of the Named
+Data Types and REFs received. pvszsp is ignored if the OCI_DATA_AT_EXEC
+mode is set. Then the size of the buffer is taken at runtime.
+indpp ( IN/OUT) - points to a pointer to the program variable buffer
+containing the parallel indicator structure. For an array, points to an array of
+pointers. When the bind variable is also an OUT bind variable, memory is
+allocated in the object cache, to store the unpickled OUT indicator values. At
+the end of the execute when all OUT values have been received, indpp points
+to the pointer(s) to these newly allocated indicator structure(s).
+indpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator
+is requested at runtime.
+indszp ( IN/OUT) - points to the size of the IN indicator structure program
+variable. For an array, it is an array of sb2s. On return for OUT bind variables,
+this points to size(s) of the received OUT indicator structures.
+indszp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator
+size is requested at runtime.
+Related Functions
+OCIAttrGet()
+
+
+
+----------------------------------OCIBreak------------------------------------
+
+
+OCIBreak()
+Name
+OCI Break
+Purpose
+This call performs an immediate (asynchronous) abort of any currently
+executing OCI function that is associated with a server .
+Syntax
+sword OCIBreak ( dvoid *hndlp,
+ OCIError *errhp);
+Comments
+This call performs an immediate (asynchronous) abort of any currently
+executing OCI function that is associated with a server. It is normally used
+to stop a long-running OCI call being processed on the server.
+This call can take either the service context handle or the server context
+handle as a parameter to identify the function to be aborted.
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+
+-----------------------------OCIConnectionPoolCreate --------------------------
+Name:
+OCIConnectionPoolCreate
+
+Purpose:
+Creates the connections in the pool
+
+Syntax:
+OCIConnectionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp,
+ OraText **poolName, sb4 *poolNameLen,
+ CONST Oratext *dblink, sb4 dblinkLen,
+ ub4 connMin, ub4 connMax, ub4 connIncr,
+ CONST OraText *poolUsername, sb4 poolUserLen,
+ CONST OraText *poolPassword, sb4 poolPassLen, ub4 mode)
+Comments:
+This call is used to create a connection pool. conn_min connections
+to the database are started on calling OCIConnectionPoolCreate.
+
+Parameters:
+envhp (IN/OUT) - A pointer to the environment where the Conencton Pool
+ is to be created
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+poolhp (IN/OUT) - An uninitialiazed pool handle.
+poolName (OUT) - The connection pool name.
+poolNameLen (OUT) - The length of the connection pool name
+dblink (IN/OUT) - Specifies the database(server) to connect. This will also
+ be used as the default pool name.
+dblinkLen (IN) - The length of the string pointed to by dblink.
+connMin (IN) - Specifies the minimum number of connections in the
+ Connection Pool at any instant.
+ connMin number of connections are started when
+ OCIConnectionPoolCreate() is called.
+connMax (IN) - Specifies the maximum number of connections that can be
+ opened to the database. Once this value is reached, no
+ more connections are opened.
+connIncr (IN) - Allows application to set the next increment for
+ connections to be opened to the database if the current
+ number of connections are less than conn_max.
+poolUsername (IN/OUT) - Connection pooling requires an implicit proxy
+ session and this attribute provides a username
+ for that session.
+poolUserLen (IN) - This represents the length of pool_username.
+poolPassword (IN/OUT) - The password for the parameter pool_username passed
+ above.
+poolPassLen (IN) - This represents the length of pool_password.
+
+mode (IN) - The modes supported are OCI_DEFAULT and
+OCI_CPOOL_REINITIALIZE
+
+Related Functions
+OCIConnectionPoolDestroy()
+
+---------------------------------------------------------------------------
+
+----------------------------OCIConnectionPoolDestroy-------------------------
+Name:
+OCIConnectionPoolDestroy
+
+Purpose:
+Terminates the connections in the pool
+
+Syntax:
+OCIConnectionPoolDestroy (OCICPool *poolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+On calling OCIConnectionPoolDestroy, all the open connections in the pool
+are closed and the pool is destroyed.
+
+Parameters:
+poolhp (IN/OUT) - An initialiazed pool handle.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+mode (IN) - Currently, OCIConnectionPoolDestroy() will support only
+ the OCI_DEFAULT mode.
+
+Related Functions:
+OCIConnectionPoolCreate()
+
+-----------------------------------------------------------------------------
+----------------------------OCISessionPoolCreate-----------------------------
+Name:
+OCISessionPoolCreate
+
+Purpose:
+Creates the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCISpool *spoolhp,
+ OraText **poolName, ub4 *poolNameLen,
+ CONST OraText *connStr, ub4 connStrLen,
+ ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+ OraText *userid, ub4 useridLen,
+ OraText *password, ub4 passwordLen,
+ ub4 mode)
+
+Comments:
+When OCISessionPoolCreate is called, a session pool is initialized for
+the associated environment and the database specified by the
+connStr parameter. This pool is named uniquely and the name
+is returned to the user in the poolname parameter.
+
+Parameters:
+envhp (IN/OUT) - A pointer to the environment handle in which the session
+ pool needs to be created.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+spoolhp (IN/OUT) - A pointer to the session pool handle that is created.
+poolName (OUT) - Session pool name returned to the user.
+poolNameLen (OUT) - Length of the PoolName
+connStr (IN) - The TNS alias of the database to connect to.
+connStrLen (IN) - Length of the connStr.
+sessMin (IN) - Specifies the minimum number of sessions in the Session Pool.
+ These are the number of sessions opened in the beginning, if
+ in Homogeneous mode. Else, the parameter is ignored.
+sessMax (IN) - Specifies the maximum number of sessions in the Session Pool.
+ Once this value is reached, no more sessions are opened,
+ unless the OCI_ATTR_SPOOL_FORCEGET is set.
+userid (IN) - Specifies the userid with which to start up the sessions.
+useridLen (IN) - Length of userid.
+password (IN) - Specifies the password for the corresponding userid.
+passwordLen (IN) - Specifies the length of the password
+mode(IN) - May be OCI_DEFAULT, OCI_SPC_SPOOL_REINITIALIZE, or
+ OCI_SPC_SPOOL_HOMOGENEOUS.
+
+Returns:
+SUCCESS - If pool could be allocated and created successfully.
+ERROR - If above conditions could not be met.
+
+Related Functions:
+OCISessionPoolDestroy()
+-----------------------------------------------------------------------------
+-----------------------------OCISessionPoolDestroy---------------------------
+Name:
+OCISessionPoolDestroy
+
+Purpose:
+Terminates all the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolDestroy (OCISPool *spoolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+spoolhp (IN/OUT) - The pool handle of the session pool to be destroyed.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+mode (IN) - Currently only OCI_DEFAULT mode is supported.
+
+Returns:
+SUCCESS - All the sessions could be closed.
+ERROR - If the above condition is not met.
+
+Related Functions:
+OCISessionPoolCreate()
+-----------------------------------------------------------------------------
+-------------------------------OCISessionGet---------------------------------
+Name:
+OCISessionGet
+
+Purpose:
+Get a session. This could be from a session pool, connection pool or
+a new standalone session.
+
+Syntax:
+sword OCISessionGet(OCIenv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+ OCIAuthInfo *authhp,
+ OraText *poolName, ub4 poolName_len,
+ CONST OraText *tagInfo, ub4 tagInfo_len,
+ OraText **retTagInfo, ub4 *retTagInfo_len,
+ boolean *found,
+ ub4 mode)
+
+Comments:
+envhp (IN/OUT) - OCI environment handle.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+svchp (IN/OUT) - Address of an OCI service context pointer. This will be
+ filled with a server and session handle, attached to the
+ pool.
+authhp (IN/OUT) - OCI Authentication Information handle.
+poolName (IN) - This indicates the session/connection pool to get the
+ session/connection from in the OCI_SPOOL/OCI_CPOOL mode.
+ In the OCI_DEFAULT mode it refers to the connect string.
+poolName_len (IN) - length of poolName.
+tagInfo (IN) - indicates the tag of the session that the user wants. If the
+ user wants a default session, he must specify a NULL here.
+ Only used for Session Pooling.
+tagInfo_len (IN) - the length of tagInfo.
+retTagInfo (OUT) - This indicates the type of session that is returned to
+ the user. Only used for Session Pooling.
+retTagInfo_len (OUT) - the length of retTagInfo.
+found (OUT) - set to true if the user gets a session he had requested, else
+ set to false. Only used for Session Pooling.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_CRED_PROXY and
+ OCI_GET_SPOOL_MATCHANY, OCI_SPOOL and OCI_CPOOL. OCI_SPOOL and
+ OCI_CPOOL are mutually exclusive.
+
+Returns:
+SUCCESS - if a session was successfully returned into svchp.
+SUCCESS_WITH_INFO - if a session was successfully returned into svchp and the
+ total number of sessions > maxsessions. Only valid for
+ Session Pooling.
+ERROR - If a session could not be retrieved.
+
+Related Functions:
+OCISessionRelease()
+-----------------------------------------------------------------------------
+---------------------------OCISessionRelease---------------------------------
+Name:
+OCISessionRelease
+
+Purpose:
+Release the session.
+
+Syntax:
+sword OCISessionRelease ( OCISvcCtx *svchp, OCIError *errhp,
+ OraText *tag, ub4 tag_len,
+ ub4 mode);
+
+Comments:
+svchp (IN/OUT) - The service context associated with the session/connection.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+tag (IN) - Only used for Session Pooling.
+ This parameter will be ignored unless mode OCI_RLS_SPOOL_RETAG is
+ specified. In this case, the session is labelled with this tag and
+ returned to the pool. If this is NULL, then the session is untagged.
+tag_len (IN) - Length of the tag. This is ignored unless mode
+ OCI_RLS_SPOOL_RETAG is set.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_RLS_SPOOL_DROPSESS,
+ OCI_RLS_SPOOL_RETAG. The last 2 are only valid for Session Pooling.
+ When OCI_RLS_SPOOL_DROPSESS is specified, the session
+ will be removed from the session pool. If OCI_RLS_SPOOL_RETAG
+ is set, the tag on the session will be altered. If this mode is
+ not set, the tag and tag_len parameters will be ignored.
+
+Returns:
+ERROR - If the session could not be released successfully.
+SUCCESS - In all other cases.
+
+Related Functions:
+OCISessionGet().
+-----------------------------------------------------------------------------
+------------------------------OCIDateTimeAssign --------------------------
+sword OCIDateTimeAssign(dvoid *hndl, OCIError *err, CONST OCIDateTime *from,
+ OCIDateTime *to);
+NAME: OCIDateTimeAssign - OCIDateTime Assignment
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+from (IN) - datetime to be assigned
+to (OUT) - lhs of assignment
+DESCRIPTION:
+ Performs date assignment. The type of the output will be same as that
+ of input
+
+------------------------------OCIDateTimeCheck----------------------------
+sword OCIDateTimeCheck(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ ub4 *valid );
+NAME: OCIDateTimeCheck - OCIDateTime CHecK if the given date is valid
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+date (IN) - date to be checked
+valid (OUT) - returns zero for a valid date, otherwise
+ the ORed combination of all error bits specified below:
+ Macro name Bit number Error
+ ---------- ---------- -----
+ OCI_DATE_INVALID_DAY 0x1 Bad day
+ OCI_DATE_DAY_BELOW_VALID 0x2 Bad DAy Low/high bit (1=low)
+ OCI_DATE_INVALID_MONTH 0x4 Bad MOnth
+ OCI_DATE_MONTH_BELOW_VALID 0x8 Bad MOnth Low/high bit (1=low)
+ OCI_DATE_INVALID_YEAR 0x10 Bad YeaR
+ OCI_DATE_YEAR_BELOW_VALID 0x20 Bad YeaR Low/high bit (1=low)
+ OCI_DATE_INVALID_HOUR 0x40 Bad HouR
+ OCI_DATE_HOUR_BELOW_VALID 0x80 Bad HouR Low/high bit (1=low)
+ OCI_DATE_INVALID_MINUTE 0x100 Bad MiNute
+ OCI_DATE_MINUTE_BELOW_VALID 0x200 Bad MiNute Low/high bit (1=low)
+ OCI_DATE_INVALID_SECOND 0x400 Bad SeCond
+ OCI_DATE_SECOND_BELOW_VALID 0x800 bad second Low/high bit (1=low)
+ OCI_DATE_DAY_MISSING_FROM_1582 0x1000 Day is one of those "missing"
+ from 1582
+ OCI_DATE_YEAR_ZERO 0x2000 Year may not equal zero
+ OCI_DATE_INVALID_TIMEZONE 0x4000 Bad Timezone
+ OCI_DATE_INVALID_FORMAT 0x8000 Bad date format input
+
+ So, for example, if the date passed in was 2/0/1990 25:61:10 in
+ (month/day/year hours:minutes:seconds format), the error returned
+ would be OCI_DATE_INVALID_DAY | OCI_DATE_DAY_BELOW_VALID |
+ OCI_DATE_INVALID_HOUR | OCI_DATE_INVALID_MINUTE
+
+DESCRIPTION:
+ Check if the given date is valid.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ 'date' and 'valid' pointers are NULL pointers
+
+------------------------------- OCIDateTimeCompare----------------------------
+sword OCIDateTimeCompare(dvoid *hndl, OCIError *err, CONST OCIDateTime *date1,
+ CONST OCIDateTime *date2, sword *result );
+NAME: OCIDateTimeCompare - OCIDateTime CoMPare dates
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+date1, date2 (IN) - dates to be compared
+result (OUT) - comparison result, 0 if equal, -1 if date1 < date2,
+ 1 if date1 > date2
+DESCRIPTION:
+The function OCIDateCompare compares two dates. It returns -1 if
+date1 is smaller than date2, 0 if they are equal, and 1 if date1 is
+greater than date2.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid date
+ input dates are not mutually comparable
+
+------------------------------OCIDateTimeConvert----------------------
+sword OCIDateTimeConvert(dvoid *hndl, OCIError *err, OCIDateTime *indate,
+ OCIDateTime *outdate);
+NAME: OCIDateTimeConvert - Conversion between different DATETIME types
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+indate (IN) - pointer to input date
+outdate (OUT) - pointer to output datetime
+DESCRIPTION: Converts one datetime type to another. The result type is
+ the type of the 'outdate' descriptor.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ conversion not possible.
+
+---------------------------- OCIDateTimeFromText-----------------------
+sword OCIDateTimeFromText(dvoid *hndl, OCIError *err, CONST OraText *date_str,
+ size_t d_str_length, CONST OraText *fmt, ub1 fmt_length,
+ CONST OraText *lang_name, size_t lang_length, OCIDateTime *date );
+NAME: OCIDateTimeFromText - OCIDateTime convert String FROM Date
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the
+ conversion takes place in session NLS_LANGUAGE and
+ session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+date_str (IN) - input string to be converted to Oracle date
+d_str_length (IN) - size of the input string, if the length is -1
+ then 'date_str' is treated as a null terminated string
+fmt (IN) - conversion format; if 'fmt' is a null pointer, then
+ the string is expected to be in the default format for
+ the datetime type.
+fmt_length (IN) - length of the 'fmt' parameter
+lang_name (IN) - language in which the names and abbreviations of
+ days and months are specified, if null i.e. (OraText *)0,
+ the default language of session is used,
+lang_length (IN) - length of the 'lang_name' parameter
+date (OUT) - given string converted to date
+DESCRIPTION:
+ Converts the given string to Oracle datetime type set in the
+ OCIDateTime descriptor according to the specified format. Refer to
+ "TO_DATE" conversion function described in "Oracle SQL Language
+ Reference Manual" for a description of format.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ invalid format
+ unknown language
+ invalid input string
+
+--------------------------- OCIDateTimeGetDate-------------------------
+sword OCIDateTimeGetDate(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ sb2 *year, ub1 *month, ub1 *day );
+NAME: OCIDateTimeGetDate - OCIDateTime Get Date (year, month, day)
+ portion of DATETIME.
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime
+year (OUT) - year value
+month (OUT) - month value
+day (OUT) - day value
+
+--------------------------- OCIDateTimeGetTime ------------------------
+sword OCIDateTimeGetTime(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ ub1 *hour, ub1 *minute, ub1 *sec, ub4 *fsec);
+NAME: OCIDateTimeGetTime - OCIDateTime Get Time (hour, min, second,
+ fractional second) of DATETIME.
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime
+hour (OUT) - hour value
+minute (OUT) - minute value
+sec (OUT) - second value
+fsec (OUT) - Fractional Second value
+
+--------------------------- OCIDateTimeGetTimeZoneOffset ----------------------
+sword OCIDateTimeGetTimeZoneOffset(dvoid *hndl,OCIError *err,CONST
+ OCIDateTime *datetime,sb1 *hour,sb1 *minute);
+
+NAME: OCIDateTimeGetTimeZoneOffset - OCIDateTime Get TimeZone (hour, minute)
+ portion of DATETIME.
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime
+hour (OUT) - TimeZone Hour value
+minute (OUT) - TimeZone Minute value
+
+--------------------------- OCIDateTimeSysTimeStamp---------------------
+sword OCIDateTimeSysTimeStamp(dvoid *hndl, OCIError *err,
+ OCIDateTime *sys_date );
+
+NAME: OCIDateTimeSysTimeStamp - Returns system date/time as a TimeStamp with
+ timezone
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+sys_date (OUT) - Pointer to output timestamp
+
+DESCRIPTION:
+ Gets the system current date and time as a timestamp with timezone
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+------------------------------OCIDateTimeIntervalAdd----------------------
+sword OCIDateTimeIntervalAdd(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalAdd - Adds an interval to datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter (IN) - pointer to interval
+outdatetime (IN) - pointer to output datetime. The output datetime
+ will be of same type as input datetime
+DESCRIPTION:
+ Adds an interval to a datetime to produce a resulting datetime
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if:
+ resulting date is before Jan 1, -4713
+ resulting date is after Dec 31, 9999
+
+------------------------------OCIDateTimeIntervalSub----------------------
+sword OCIDateTimeIntervalSub(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalSub - Subtracts an interval from a datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter (IN) - pointer to interval
+outdatetime (IN) - pointer to output datetime. The output datetime
+ will be of same type as input datetime
+DESCRIPTION:
+ Subtracts an interval from a datetime and stores the result in a
+ datetime
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if:
+ resulting date is before Jan 1, -4713
+ resulting date is after Dec 31, 9999
+
+--------------------------- OCIDateTimeConstruct-------------------------
+sword OCIDateTimeConstruct(dvoid *hndl,OCIError *err,OCIDateTime *datetime,
+ sb2 year,ub1 month,ub1 day,ub1 hour,ub1 min,ub1 sec,ub4 fsec,
+ OraText *timezone,size_t timezone_length);
+
+NAME: OCIDateTimeConstruct - Construct an OCIDateTime. Only the relevant
+ fields for the OCIDateTime descriptor types are used.
+PARAMETERS:
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ datetime (IN) - Pointer to OCIDateTime
+ year (IN) - year value
+ month (IN) - month value
+ day (IN) - day value
+ hour (IN) - hour value
+ min (IN) - minute value
+ sec (IN) - second value
+ fsec (IN) - Fractional Second value
+ timezone (IN) - Timezone string
+ timezone_length(IN) - Length of timezone string
+
+DESCRIPTION:
+ Constructs a DateTime descriptor. The type of the datetime is the
+ type of the OCIDateTime descriptor. Only the relevant fields based
+ on the type are used. For Types with timezone, the date and time
+ fields are assumed to be in the local time of the specified timezone.
+ If timezone is not specified, then session default timezone is
+ assumed.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_ERROR if datetime is not valid.
+
+------------------------------OCIDateTimeSubtract-----------------------
+sword OCIDateTimeSubtract(dvoid *hndl, OCIError *err, OCIDateTime *indate1,
+ OCIDateTime *indate2, OCIInterval *inter);
+NAME: OCIDateTimeSubtract - subtracts two datetimes to return an interval
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+indate1(IN) - pointer to subtrahend
+indate2(IN) - pointer to minuend
+inter (OUT) - pointer to output interval
+DESCRIPTION:
+ Takes two datetimes as input and stores their difference in an
+ interval. The type of the interval is the type of the 'inter'
+ descriptor.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ datetimes are not comparable.
+
+--------------------------- OCIDateTimeToText--------------------------
+sword OCIDateTimeToText(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ CONST OraText *fmt, ub1 fmt_length, ub1 fsprec,
+ CONST OraText *lang_name, size_t lang_length,
+ ub4 *buf_size, OraText *buf );
+NAME: OCIDateTimeToText - OCIDateTime convert date TO String
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the
+ conversion takes place in session NLS_LANGUAGE and
+ session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+date (IN) - Oracle datetime to be converted
+fmt (IN) - conversion format, if null string pointer (OraText*)0, then
+ the date is converted to a character string in the
+ default format for that type.
+fmt_length (IN) - length of the 'fmt' parameter
+fsprec (IN) - specifies the fractional second precision in which the
+ fractional seconds is returned.
+lang_name (IN) - specifies the language in which the names and
+ abbreviations of months and days are returned;
+ default language of session is used if 'lang_name'
+ is null i.e. (OraText *)0
+lang_length (IN) - length of the 'nls_params' parameter
+buf_size (IN/OUT) - size of the buffer; size of the resulting string
+ is returned via this parameter
+buf (OUT) - buffer into which the converted string is placed
+DESCRIPTION:
+ Converts the given date to a string according to the specified format.
+ Refer to "TO_DATE" conversion function described in
+ "Oracle SQL Language Reference Manual" for a description of format
+ and NLS arguments. The converted null-terminated date string is
+ stored in the buffer 'buf'.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ invalid format
+ unknown language
+ overflow error
+
+----------------------------OCIDateTimeGetTimeZoneName------------------------
+sword OCIDateTimeGetTimeZoneName(dvoid *hndl,
+ OCIError *err,
+ CONST OCIDateTime *datetime,
+ ub1 *buf,
+ ub4 *buflen);
+NAME OCIDateTimeGetTimeZoneName - OCI DateTime Get the Time Zone Name
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to an OCIDateTime.
+buf (OUT) - User allocated storage for name string.
+buflen (IN/OUT) - length of buf on input, length of name on out
+DESCRIPTION:
+ Returns either the timezone region name or the absolute hour and minute
+ offset. If the DateTime was created with a region id then the region
+ name will be returned in the buf. If the region id is zero, then the
+ hour and minute offset is returned as "[-]HH:MM".
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ error retrieving timezone data
+ invalid region
+ invalid LdiDateTime type
+
+---------------------------------OCIDateTimeToArray----------------------------
+sword OCIDateTimeToArray(dvoid *hndl,
+ OCIError *err,
+ CONST OCIDateTime *datetime,
+ CONST OCIInterval *reftz,
+ ub1 *outarray,
+ ub4 *len
+ ub1 *fsprec);
+NAME OCIDateTimeToArray - OCI DateTime convert To Array format
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime to be converted.
+outarray (OUT) - Result array storage
+len (OUT) - pointer to length of outarray.
+fsprec (IN) - Number of fractional seconds digits.
+DESCRIPTION:
+ Returns an array representing the input DateTime descriptor.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ error retrieving timezone data
+ invalid region
+ invalid LdiDateTime type
+
+--------------------------------OCIDateTimeFromArray---------------------------
+sword OCIDateTimeFromArray(dvoid *hndl,
+ OCIError *err,
+ ub1 *inarray,
+ ub4 len
+ ub1 type
+ OCIDateTime *datetime,
+ OCIInterval *reftz,
+ ub1 fsprec);
+NAME OCIDateTimeFromArray - OCI DateTime convert From Array format
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+inarray (IN) - Pointer to input array representtion of DateTime
+len (IN) - len of inarray.
+type (IN) - One of SQLT_DATE, SQLT_TIME, SQLT_TIME_TZ, SQLT_TIMESTAMP,
+ SQLT_TIMESTAMP_TZ, or SQLT_TIMESTAMP_LTZ.
+datetime (OUT) - Pointer to the result OCIDateTime.
+reftz (IN) - timezone interval used with SQLT_TIMESTAMP_LTZ.
+fsprec (IN) - fractionl seconds digits of precision (0-9).
+DESCRIPTION:
+ Returns a pointer to an OCIDateTime of type type converted from
+ the inarray.
+RETURNS:
+ OCI_SUCCESS if the function completes successfully.
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ buffer too small
+ error retrieving timezone data
+ invalid region
+ invalid LdiDateTime type
+
+----------------------------------OCIRowidToChar-----------------------------
+Name
+OCIRowidToChar
+
+Purpose
+Converts physical/logical (universal) ROWID to chracter extended (Base 64)
+representation into user provided buffer outbfp of length outbflp. After
+execution outbflp contains amount of bytes converted.In case of truncation
+error, outbflp contains required size to make this conversion successful
+and returns ORA-1405.
+
+Syntax
+sword OCIRowidToChar( OCIRowid *rowidDesc,
+ OraText *outbfp,
+ ub2 *outbflp,
+ OCIError *errhp)
+
+Comments
+After this conversion, ROWID in character format can be bound using
+OCIBindByPos or OCIBindByName call and used to query a row at a
+desired ROWID.
+
+Parameters
+rowidDesc (IN) - rowid DESCriptor which is allocated from OCIDescritorAlloc
+ and populated by a prior SQL statement execution
+outbfp (OUT) - pointer to the buffer where converted rowid in character
+ representation is stored after successful execution.
+outbflp (IN/OUT) - pointer to output buffer length variable.
+ Before execution (IN mode) *outbflp contains the size of
+ outbfp, after execution (OUT mode) *outbflp contains amount
+ of bytes converted. In an event of truncation during
+ conversion *outbflp contains the required length to make
+ conversion successful.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+ diagnostic information in the event of an error.
+
+------------------------------OCIDefineArrayOfStruct--------------------------
+
+
+OCIDefineArrayOfStruct()
+Name
+OCI Define for Array of Structures
+Purpose
+This call specifies additional attributes necessary for a static array define.
+Syntax
+sword OCIDefineArrayOfStruct ( OCIDefine *defnp,
+ OCIError *errhp,
+ ub4 pvskip,
+ ub4 indskip,
+ ub4 rlskip,
+ ub4 rcskip );
+Comments
+This call specifies additional attributes necessary for an array define, used in
+an array of structures (multi-row, multi-column) fetch.
+For more information about skip parameters, see the section "Skip Parameters"
+on page 4-17.
+Parameters
+defnp (IN) - the handle to the define structure which was returned by a call
+to OCIDefineByPos().
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value.
+indskip (IN) - skip parameter for the next indicator location.
+rlskip (IN) - skip parameter for the next return length value.
+rcskip (IN) - skip parameter for the next return code.
+Related Functions
+OCIAttrGet()
+
+
+
+
+
+OCIDefineByPos()
+Name
+OCI Define By Position
+Purpose
+Associates an item in a select-list with the type and output data buffer.
+Syntax
+sb4 OCIDefineByPos (
+ OCIStmt *stmtp,
+ OCIDefine **defnp,
+ OCIError *errhp,
+ ub4 position,
+ dvoid *valuep,
+ sb4 value_sz,
+ ub2 dty,
+ dvoid *indp,
+ ub2 *rlenp,
+ ub2 *rcodep,
+ ub4 mode );
+Comments
+This call defines an output buffer which will receive data retreived from
+Oracle. The define is a local step which is necessary when a SELECT statement
+returns data to your OCI application.
+This call also implicitly allocates the define handle for the select-list item.
+Defining attributes of a column for a fetch is done in one or more calls. The
+first call is to OCIDefineByPos(), which defines the minimal attributes
+required to specify the fetch.
+This call takes as a parameter a define handle, which must have been
+previously allocated with a call to OCIHandleAlloc().
+Following the call to OCIDefineByPos() additional define calls may be
+necessary for certain data types or fetch modes:
+A call to OCIDefineArrayOfStruct() is necessary to set up skip parameters
+for an array fetch of multiple columns.
+A call to OCIDefineObject() is necessary to set up the appropriate
+attributes of a named data type fetch. In this case the data buffer pointer
+in ocidefn() is ignored.
+Both OCIDefineArrayOfStruct() and OCIDefineObject() must be called
+after ocidefn() in order to fetch multiple rows with a column of named
+data types.
+For a LOB define, the buffer pointer must be a lob locator of type
+OCILobLocator , allocated by the OCIDescAlloc() call. LOB locators, and not
+LOB values, are always returned for a LOB column. LOB values can then be
+fetched using OCI LOB calls on the fetched locator.
+For NCHAR (fixed and varying length), the buffer pointer must point to an
+array of bytes sufficient for holding the required NCHAR characters.
+Nested table columns are defined and fetched like any other named data type.
+If the mode parameter is this call is set to OCI_DYNAMIC_FETCH, the client
+application can fetch data dynamically at runtime.
+Runtime data can be provided in one of two ways:
+callbacks using a user-defined function which must be registered with a
+subsequent call to OCIDefineDynamic(). When the client library needs a
+buffer to return the fetched data, the callback will be invoked and the
+runtime buffers provided will return a piece or the whole data.
+a polling mechanism using calls supplied by the OCI. This mode is
+assumed if no callbacks are defined. In this case, the fetch call returns the
+OCI_NEED_DATA error code, and a piecewise polling method is used
+to provide the data.
+Related Functions: For more information about using the
+OCI_DYNAMIC_FETCH mode, see the section "Runtime Data
+Allocation and Piecewise Operations" on page 5-16 of Volume 1..
+For more information about the define step, see the section "Defining"
+on page 2-30.
+Parameters
+stmtp (IN) - a handle to the requested SQL query operation.
+defnp (IN/OUT) - a pointer to a pointer to a define handle which is implicitly
+allocated by this call. This handle is used to store the define information
+for this column.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+position (IN) - the position of this value in the select list. Positions are
+1-based and are numbered from left to right. For example, in the SELECT
+statement
+SELECT empno, ssn, mgrno FROM employees;
+empno is at position 1, ssn is at position 2, and mgrno is at position 3.
+valuep (IN/OUT) - a pointer to a buffer or an array of buffers of the type
+specified in the dty parameter. A number of buffers can be specified when
+results for more than one row are desired in a single fetch call.
+value_sz (IN) - the size of each valuep buffer in bytes. If the data is stored
+internally in VARCHAR2 format, the number of characters desired, if different
+from the buffer size in bytes, may be additionally specified by the using
+OCIAttrSet().
+In an NLS conversion environment, a truncation error will be generated if the
+number of bytes specified is insufficient to handle the number of characters
+desired.
+dty (IN) - the data type. Named data type (SQLT_NTY) and REF (SQLT_REF)
+are valid only if the environment has been intialized with in object mode.
+indp - pointer to an indicator variable or array. For scalar data types,
+pointer to sb2 or an array of sb2s. Ignored for named data types. For named
+data types, a pointer to a named data type indicator structure or an array of
+named data type indicator structures is associated by a subsequent
+OCIDefineObject() call.
+See the section "Indicator Variables" on page 2-43 for more information about
+indicator variables.
+rlenp (IN/OUT) - pointer to array of length of data fetched. Each element in
+rlenp is the length of the data in the corresponding element in the row after
+the fetch.
+rcodep (OUT) - pointer to array of column-level return codes
+mode (IN) - the valid modes are:
+OCI_DEFAULT. This is the default mode.
+OCI_DYNAMIC_FETCH. For applications requiring dynamically
+allocated data at the time of fetch, this mode must be used. The user may
+additionally call OCIDefineDynamic() to set up a callback function that
+will be invoked to receive the dynamically allocated buffers and to set
+up the memory allocate/free callbacks and the context for the callbacks.
+valuep and value_sz are ignored in this mode.
+Related Functions
+OCIDefineArrayOfStruct(), OCIDefineDynamic(), OCIDefineObject()
+
+
+
+
+OCIDefineDynamic()
+Name
+OCI Define Dynamic Fetch Attributes
+Purpose
+This call is used to set the additional attributes required if the
+OCI_DYNAMIC_FETCH mode was selected in OCIDefineByPos().
+Syntax
+sword OCIDefineDynamic( OCIDefine *defnp,
+ OCIError *errhp,
+ dvoid *octxp,
+ OCICallbackDefine (ocbfp)(
+ dvoid *octxp,
+ OCIDefine *defnp,
+ ub4 iter,
+ dvoid **bufpp,
+ ub4 **alenpp,
+ ub1 *piecep,
+ dvoid **indpp,
+ ub2 **rcodep) );
+Comments
+This call is used to set the additional attributes required if the
+OCI_DYNAMIC_FETCH mode has been selected in a call to
+OCIDefineByPos().
+When the OCI_DYNAMIC_FETCH mode is selected, buffers will be
+dynamically allocated for REF, and named data type, values to receive the
+data. The pointers to these buffers will be returned.
+If OCI_DYNAMIC_FETCH mode was selected, and the call to
+OCIDefineDynamic() is skipped, then the application can fetch data piecewise
+using OCI calls.
+For more information about OCI_DYNAMIC_FETCH mode, see the section
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+defnp (IN/OUT) - the handle to a define structure returned by a call to
+OCIDefineByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+octxp (IN) - points to a context for the callback function.
+ocbfp (IN) - points to a callback function. This is invoked at runtime to get
+a pointer to the buffer into which the fetched data or a piece of it will be
+retreived. The callback also specifies the indicator, the return code and the
+lengths of the data piece and indicator. The callback has the following
+parameters:
+octxp (IN) - a context pointer passed as an argument to all the callback
+functions.
+defnp (IN) - the define handle.
+iter (IN) - which row of this current fetch.
+bufpp (OUT) - returns a pointer to a buffer to store the column value, ie.
+*bufp points to some appropriate storage for the column value.
+alenpp (OUT) - returns a pointer to the length of the buffer. *alenpp
+contains the size of the buffer after return from callback. Gets set to
+actual data size after fetch.
+piecep (IN/OUT) - returns a piece value, as follows:
+The IN value can be OCI_ONE_PIECE, OCI_FIRST_PIECE or
+OCI_NEXT_PIECE.
+The OUT value can be OCI_ONE_PIECE if the IN value was
+OCI_ONE_PIECE.
+The OUT value can be OCI_ONE_PIECE or OCI_FIRST_PIECE if
+the IN value was OCI_FIRST_PIECE.
+The OUT value can only be OCI_NEXT_PIECE or
+OCI_LAST_PIECE if the IN value was OCI_NEXT_PIECE.
+indpp (IN) - indicator variable pointer
+rcodep (IN) - return code variable pointer
+Related Functions
+OCIAttrGet()
+OCIDefineObject()
+
+
+
+
+OCIDefineObject()
+Name
+OCI Define Named Data Type attributes
+Purpose
+Sets up additional attributes necessary for a Named Data Type define.
+Syntax
+sword OCIDefineObject ( OCIDefine *defnp,
+ OCIError *errhp,
+ CONST OCIType *type,
+ dvoid **pgvpp,
+ ub4 *pvszsp,
+ dvoid **indpp,
+ ub4 *indszp );
+Comments
+This call sets up additional attributes necessary for a Named Data Type define.An error will be returned if this function is called when the OCI environment
+has been initialized in non-Object mode.
+This call takes as a paramter a type descriptor object (TDO) of datatype
+OCIType for the named data type being defined. The TDO can be retrieved
+with a call to OCITypeByName().
+See the description of OCIInitialize() on page 13 - 43 for more information
+about initializing the OCI process environment.
+Parameters
+defnp (IN/OUT) - a define handle previously allocated in a call to
+OCIDefineByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+type (IN, optional) - points to the Type Descriptor Object (TDO) which
+describes the type of the program variable. Only used for program variables
+of type SQLT_NTY. This parameter is optional, and may be passed as NULL
+if it is not being used.
+pgvpp (IN/OUT) - points to a pointer to a program variable buffer. For an
+array, pgvpp points to an array of pointers. Memory for the fetched named data
+type instance(s) is dynamically allocated in the object cache. At the end of the
+fetch when all the values have been received, pgvpp points to the pointer(s) to
+these newly allocated named data type instance(s). The application must call
+OCIObjectMarkDel() to deallocate the named data type instance(s) when they
+are no longer needed.
+pvszsp (IN/OUT) - points to the size of the program variable. For an array, it
+is an array of ub4s. On return points to the size(s) of unpickled fetched
+values.
+indpp (IN/OUT) - points to a pointer to the program variable buffer
+containing the parallel indicator structure. For an array, points to an array
+of pointers. Memory is allocated to store the indicator structures in the
+object cache. At the end of the fetch when all values have been received,
+indpp points to the pointer(s) to these newly allocated indicator structure(s).
+indszp (IN/OUT) - points to the size(s) of the indicator structure program
+variable. For an array, it is an array of ub4s. On return points to the size(s)
+of the unpickled fetched indicator values.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIDescAlloc()
+Name
+OCI Get DESCriptor or lob locator
+Purpose
+Allocates storage to hold certain data types. The descriptors can be used as
+bind or define variables.
+Syntax
+sword OCIDescAlloc ( CONST dvoid *parenth,
+ dvoid **descpp,
+ ub4 type,
+ size_t xtramem_sz,
+ dvoid **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to
+the type specified in type. A non-NULL descriptor or LOB locator is returned
+on success. No diagnostics are available on error.
+This call returns OCI_SUCCESS if successful, or OCI_INVALID_HANDLE if
+an out-of-memory error occurs.
+Parameters
+parenth (IN) - an environment handle.
+descpp (OUT) - returns a descriptor or LOB locator of desired type.
+type (IN) - specifies the type of descriptor or LOB locator to be allocated.
+The specific types are:
+OCI_DTYPE_SNAP - specifies generation of snapshot descriptor of C
+type - OCISnapshot
+OCI_DTYPE_LOB - specifies generation of a LOB data type locator of C
+type - OCILobLocator
+OCI_DTYPE_RSET - specifies generation of a descriptor of C type
+OCIResult that references a result set (a number of rows as a result of a
+query). This descriptor is bound to a bind variable of data type
+SQLT_RSET (result set). The descriptor has to be converted into a
+statement handle using a function - OCIResultSetToStmt() - which can
+then be passed to OCIDefineByPos() and OCIStmtFetch() to retrieve the
+rows of the result set.
+OCI_DTYPE_ROWID - specifies generation of a ROWID descriptor of C
+type OCIRowid.
+OCI_DTYPE_COMPLEXOBJECTCOMP - specifies generation of a
+complex object retrieval descriptor of C type
+OCIComplexObjectComp.
+xtramemsz (IN) - specifies an amount of user memory to be allocated for use
+by the application.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz
+allocated by the call for the user.
+Related Functions
+OCIDescFree()
+
+
+
+
+OCIDescFree()
+Name
+OCI Free DESCriptor
+Purpose
+Deallocates a previously allocated descriptor.
+Syntax
+sword OCIDescFree ( dvoid *descp,
+ ub4 type);
+Comments
+This call frees up storage associated with the descriptor, corresponding to the
+type specified in type. Returns OCI_SUCCESS or OCI_INVALID_HANDLE.
+All descriptors must be explicitly deallocated. OCI will not deallocate a
+descriptor if the environment handle is deallocated.
+Parameters
+descp (IN) - an allocated descriptor.
+type (IN) - specifies the type of storage to be freed. The specific types are:
+OCI_DTYPE_SNAP - snapshot descriptor
+OCI_DTYPE_LOB - a LOB data type descriptor
+OCI_DTYPE_RSET - a descriptor that references a result set (a number
+of rows as a result of a query).
+OCI_DTYPE_ROWID - a ROWID descriptor
+OCI_DTYPE_COMPLEXOBJECTCOMP - a complex object retrieval
+descriptor
+Related Functions
+OCIDescAlloc()
+
+
+
+OCIDescribeAny()
+Name
+OCI DeSCribe Any
+Purpose
+Describes existing schema objects.
+Syntax
+sword OCIDescribeAny ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ dvoid *objptr,
+ ub4 objnm_len,
+ ub1 objptr_typ,
+ ub1 info_level,
+ ub1 objtype,
+ OCIDesc *dschp );
+Comments
+This is a generic describe call that describes existing schema objects: tables,
+views, synonyms, procedures, functions, packages, sequences, and types. As a
+result of this call, the describe handle is populated with the object-specific
+attributes which can be obtained through an OCIAttrGet() call.
+An OCIParamGet() on the describe handle returns a parameter descriptor for a
+specified position. Parameter positions begin with 1. Calling OCIAttrGet() on
+the parameter descriptor returns the specific attributes of a stored procedure
+or function parameter or a table column descriptor as the case may be.
+These subsequent calls do not need an extra round trip to the server because
+the entire schema object description cached on the client side by
+OCIDescribeAny(). Calling OCIAttrGet() on the describe handle can also return
+the total number of positions.
+See the section "Describing" on page 2-33 for more information about describe
+operations.
+Parameters
+TO BE UPDATED
+svchp (IN/OUT) - a service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+objptr (IN) - the name of the object (a null-terminated string) to be
+described. Only procedure or function names are valid when connected to an
+Oracle7 Server.
+objptr_len (IN) - the length of the string. Must be non-zero.
+objptr_typ (IN) - Must be OCI_OTYPE_NAME, OCI_OTYPE_REF, or OCI_OTYPE_PTR.
+info_level (IN) - reserved for future extensions. Pass OCI_DEFAULT.
+objtype (IN/OUT) - object type.
+dschp (IN/OUT) - a describe handle that is populated with describe
+information about the object after the call.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIEnvCreate()
+Name
+OCI ENVironment CREATE
+Purpose
+This function creates and initializes an environment for the rest of
+the OCI functions to work under. This call is a replacement for both
+the OCIInitialize and OCIEnvInit calls.
+Syntax
+sword OCIEnvCreate ( OCIEnv **envhpp,
+ ub4 mode,
+ CONST dvoid *ctxp,
+ CONST dvoid *(*malocfp)
+ (dvoid *ctxp,
+ size_t size),
+ CONST dvoid *(*ralocfp)
+ (dvoid *ctxp,
+ dvoid *memptr,
+ size_t newsize),
+ CONST void (*mfreefp)
+ ( dvoid *ctxp,
+ dvoid *memptr))
+ size_t xtramemsz,
+ dvoid **usrmempp );
+
+Comments
+This call creates an environment for all the OCI calls using the modes
+specified by the user. This call can be used instead of the two calls
+OCIInitialize and OCIEnvInit. This function returns an environment handle
+which is then used by the remaining OCI functions. There can be multiple
+environments in OCI each with its own environment modes. This function
+also performs any process level initialization if required by any mode.
+For example if the user wants to initialize an environment as OCI_THREADED,
+then all libraries that are used by OCI are also initialized in the
+threaded mode.
+
+This call should be invoked before anny other OCI call and should be used
+instead of the OCIInitialize and OCIEnvInit calls. This is the recommended
+call, although OCIInitialize and OCIEnvInit calls will still be supported
+for backward compatibility.
+
+envpp (OUT) - a pointer to a handle to the environment.
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data
+structures are protected from concurrent accesses by multiple threads.
+OCI_OBJECT - will use navigational object interface.
+ctxp (IN) - user defined context for the memory call back routines.
+malocfp (IN) - user-defined memory allocation function. If mode is
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+xtramemsz (IN) - specifies the amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz
+allocated by the call for the user.
+
+Example
+
+Related Functions
+OCIInitialize, OCIEnvInit
+
+OCIEnvNlsCreate()
+Name
+OCI ENVironment CREATE with NLS info
+Purpose
+This function does almost everything OCIEnvCreate does, plus enabling setting
+of charset and ncharset programmatically, except OCI_UTF16 mode.
+Syntax
+sword OCIEnvNlsCreate(OCIEnv **envhpp,
+ ub4 mode,
+ dvoid *ctxp,
+ dvoid *(*malocfp)
+ (dvoid *ctxp,
+ size_t size),
+ dvoid *(*ralocfp)
+ (dvoid *ctxp,
+ dvoid *memptr,
+ size_t newsize),
+ void (*mfreefp)
+ (dvoid *ctxp,
+ dvoid *memptr),
+ size_t xtramemsz,
+ dvoid **usrmempp,
+ ub2 charset,
+ ub2 ncharset)
+Comments
+The charset and ncharset must be both zero or non-zero.
+The parameters have the same meaning as the ones in OCIEnvCreate().
+When charset or ncharset is non-zero, the corresponding character set will
+be used to replace the ones specified in NLS_LANG or NLS_NCHAR. Moreover,
+OCI_UTF16ID is allowed to be set as charset and ncharset.
+On the other hand, OCI_UTF16 mode is deprecated with this function.
+Applications can achieve the same effects by setting
+both charset and ncharset as OCI_UTF16ID.
+
+
+OCIEnvInit()
+Name
+OCI INITialize environment
+Purpose
+This call initializes the OCI environment handle.
+Syntax
+sword OCIEnvInit ( OCIEnv **envp,
+ ub4 mode,
+ size_t xtramemsz,
+ dvoid **usrmempp );
+Comments
+Initializes the OCI environment handle. No changes are done on an initialized
+handle. If OCI_ERROR or OCI_SUCCESS_WITH_INFO is returned, the
+environment handle can be used to obtain ORACLE specific errors and
+diagnostics.
+This call is processed locally, without a server round-trip.
+Parameters
+envpp (OUT) - a pointer to a handle to the environment.
+mode (IN) - specifies initialization of an environment mode. The only valid
+mode is OCI_DEFAULT for default mode
+xtramemsz (IN) - specifies the amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz
+allocated by the call for the user.
+Example
+See the description of OCISessionBegin() on page 13-84 for an example showing
+the use of OCIEnvInit().
+Related Functions
+
+
+
+
+OCIErrorGet()
+Name
+OCI Get Diagnostic Record
+Purpose
+Returns an error message in the buffer provided and an ORACLE error.
+Syntax
+sword OCIErrorGet ( dvoid *hndlp,
+ ub4 recordno,
+ OraText *sqlstate,
+ ub4 *errcodep,
+ OraText *bufp,
+ ub4 bufsiz,
+ ub4 type );
+Comments
+Returns an error message in the buffer provided and an ORACLE error.
+Currently does not support SQL state. This call can be called a multiple
+number of times if there are more than one diagnostic record for an error.
+The error handle is originally allocated with a call to OCIHandleAlloc().
+Parameters
+hndlp (IN) - the error handle, in most cases, or the environment handle (for
+errors on OCIEnvInit(), OCIHandleAlloc()).
+recordno (IN) - indicates the status record from which the application seeks
+info. Starts from 1.
+sqlstate (OUT) - Not supported in Version 8.0.
+errcodep (OUT) - an ORACLE Error is returned.
+bufp (OUT) - the error message text is returned.
+bufsiz (IN) - the size of the buffer provide to get the error message.
+type (IN) - the type of the handle.
+Related Functions
+OCIHandleAlloc()
+
+OCIExtractInit
+Name
+OCI Extract Initialize
+Purpose
+This function initializes the parameter manager.
+Syntax
+sword OCIExtractInit(dvoid *hndl, OCIError *err);
+Comments
+It must be called before calling any other parameter manager routine. The NLS
+information is stored inside the parameter manager context and used in
+subsequent calls to OCIExtract routines.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractTerm()
+
+OCIExtractTerm
+Name
+OCI Extract Terminate
+Purpose
+This function releases all dynamically allocated storage and may perform
+other internal bookkeeping functions.
+Syntax
+sword OCIExtractTerm(dvoid *hndl, OCIError *err);
+Comments
+It must be called when the parameter manager is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractInit()
+
+OCIExtractReset
+Name
+OCI Extract Reset
+Purpose
+The memory currently used for parameter storage, key definition storage, and
+parameter value lists is freed and the structure is reinitialized.
+Syntax
+sword OCIExtractReset(dvoid *hndl, OCIError *err);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+Related Functions
+
+OCIExtractSetNumKeys
+Name
+OCI Extract Set Number of Keys
+Purpose
+Informs the parameter manager of the number of keys that will be registered.
+Syntax
+sword OCIExtractSetNumKeys(dvoid *hndl, OCIError *err, uword numkeys);
+Comments
+This routine must be called prior to the first call of OCIExtractSetKey().
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+numkeys (IN) - The number of keys that will be registered with
+ OCIExtractSetKey().
+Related Functions
+OCIExtractSetKey()
+
+OCIExtractSetKey
+Name
+OCI Extract Set Key definition
+Purpose
+Registers information about a key with the parameter manager.
+Syntax
+sword OCIExtractSetKey(dvoid *hndl, OCIError *err, CONST OraText *name,
+ ub1 type, ub4 flag, CONST dvoid *defval, CONST sb4 *intrange, CONST OraText *CONST *strlist);
+Comments
+This routine must be called after calling OCIExtractSetKey() and before
+calling OCIExtractFromFile() or OCIExtractFromStr().
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+name (IN) - The name of the key.
+type (IN) - The type of the key (OCI_EXTRACT_TYPE_INTEGER,
+ OCI_EXTRACT_TYPE_OCINUM, OCI_EXTRACT_TYPE_STRING, or
+ OCI_EXTRACT_TYPE_BOOLEAN).
+flag (IN) - Set to OCI_EXTRACT_MULTIPLE if the key can take multiple values
+ or 0 otherwise.
+defval (IN) - Set to the default value for the key. May be NULL if there is
+ no default. A string default must be a (text*) type, an
+ integer default must be an (sb4*) type, and a boolean default
+ must be a (ub1*) type.
+intrange (IN) - Starting and ending values for the allowable range of integer
+ values. May be NULL if the key is not an integer type or if
+ all integer values are acceptable.
+strlist (IN) - List of all acceptable text strings for the key. May be NULL
+ if the key is not a string type or if all text values are
+ acceptable.
+Related Functions
+OCIExtractSetNumKeys()
+
+OCIExtractFromFile
+Name
+OCI Extract parameters From File
+Purpose
+The keys and their values in the given file are processed.
+Syntax
+sword OCIExtractFromFile(dvoid *hndl, OCIError *err, ub4 flag,
+ OraText *filename);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set:
+ OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or
+ OCI_EXTRACT_APPEND_VALUES.
+filename (IN) - Null-terminated filename string.
+Related Functions
+
+OCIExtractFromStr
+Name
+OCI Extract parameters From String
+Purpose
+The keys and their values in the given string are processed.
+Syntax
+sword OCIExtractFromStr(dvoid *hndl, OCIError *err, ub4 flag, OraText *input);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set:
+ OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or
+ OCI_EXTRACT_APPEND_VALUES.
+input (IN) - Null-terminated input string.
+Related Functions
+
+OCIExtractToInt
+Name
+OCI Extract To Integer
+Purpose
+Gets the integer value for the specified key.
+Syntax
+sword OCIExtractToInt(dvoid *hndl, OCIError *err, OraText *keyname, uword valno,
+ sb4 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR.
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual integer value.
+Related Functions
+
+OCIExtractToBool
+Name
+OCI Extract To Boolean
+Purpose
+Gets the boolean value for the specified key.
+Syntax
+sword OCIExtractToBool(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, ub1 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR.
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual boolean value.
+Related Functions
+
+OCIExtractToStr
+Name
+OCI Extract To String
+Purpose
+Gets the string value for the specified key.
+Syntax
+sword OCIExtractToStr(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, OraText *retval, uword buflen);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR.
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual null-terminated string value.
+buflen (IN) - The length of the buffer for retval.
+Related Functions
+
+Note: The following OCIExtract functions are unavailable in this release
+
+OCIExtractToOCINum
+Name
+OCI Extract To OCI Number
+Purpose
+Gets the OCINumber value for the specified key.
+Syntax
+sword OCIExtractToOCINum(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, OCINumber *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR.
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual OCINumber value.
+Related Functions
+
+OCIExtractToList
+Name
+OCI Extract To parameter List
+Purpose
+Generates a list of parameters from the parameter structures that are stored
+in memory.
+Syntax
+sword OCIExtractToList(dvoid *hndl, OCIError *err, uword *numkeys);
+Comments
+Must be called before OCIExtractValues() is called.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+numkeys (OUT) - Number of distinct keys stored in memory.
+Related Functions
+OCIExtractFromList()
+
+OCIExtractFromList
+Name
+OCI Extract From parameter List
+Purpose
+Generates a list of values for the a parameter in the parameter list.
+Syntax
+sword OCIExtractFromList(dvoid *hndl, OCIError *err, uword index, OraText *name,
+ ub1 *type, uword *numvals, dvoid ***values);
+Comments
+Parameters are specified by an index. OCIExtractToList() must be called prior
+to calling this routine to generate the parameter list from the parameter
+structures that are stored in memory.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+ err and this function returns OCI_ERROR. Diagnostic information
+ can be obtained by calling OCIErrorGet().
+name (OUT) - Name of the key for the current parameter.
+type (OUT) - Type of the current parameter (OCI_EXTRACT_TYPE_STRING,
+ OCI_EXTRACT_TYPE_INTEGER, OCI_EXTRACT_TYPE_OCINUM, or
+ OCI_EXTRACT_TYPE_BOOLEAN)
+numvals (OUT) - Number of values for this parameter.
+values (OUT) - The values for this parameter.
+Related Functions
+OCIExtractToList()
+
+
+************************ OCIFileClose() ***********************************
+
+Name
+ OCIFileClose - Oracle Call Interface FILE i/o CLOSE
+
+Purpose
+ Close a previously opened file.
+
+Syntax
+ sword OCIFileClose ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep )
+
+Comments
+ This function will close a previously opened file. If the function succeeds
+ then OCI_SUCCESS will be returned, else OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen.
+
+
+
+********************* OCIFileExists() **************************************
+
+Name
+ OCIFileExists - Oracle Call Interface FILE i/o EXIST
+
+Purpose
+ Check to see if the file exists.
+
+Syntax
+ sword OCIFileExists ( dvoid *hndl,
+ OCIError *err,
+ OraText *filename,
+ OraText *path,
+ ub1 *flag )
+
+Comments
+ This function will set the flag to TRUE if the file exists else it will
+ be set to FALSE.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl(IN) - OCI environment or session handle
+ err(OUT) - OCI error handle
+ filename(IN) - filename
+ path(IN) - path of the file
+ flag(OUT) - whether the file exists or not
+
+Related Functions.
+ None.
+
+
+ **************************** OCIFileFlush() ******************************
+
+
+Name
+ OCIFileFlush - Oracle Call Interface File i/o FLUSH
+
+Purpose
+ Flush the buffers associated with the file to the disk.
+
+Syntax
+ sword OCIFileFlush ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep )
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen, OCIFileWrite
+
+
+
+ *************************** OCIFileGetLength() ****************************
+
+Name
+ OCIFileGetLength - Oracle Call Interface FILE i/o GET file LENGTH
+
+Purpose
+ Get the length of a file.
+
+Syntax
+ OCIFileGetLength(dvoid *hndl,
+ OCIError *err,
+ OraText *filename,
+ OraText *path,
+ ubig_ora *lenp )
+
+Comments
+ The length of the file will be returned in lenp.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filename (IN) - file name.
+ path (IN) - path of the file.
+ lenp (OUT) - On output, it is the length of the file in bytes.
+ is the number of bytes in the file.
+
+Related Functions
+ None.
+
+
+
+******************************** OCIFileInit() *****************************
+
+Name
+ OCIFileInit - Oracle Call Interface FILE i/o INITialize
+
+Purpose
+ Initialize the OCI File I/O package and create the OCIFile context.
+
+Syntax
+ sword OCIFileInit ( dvoid *hndl,
+ OCIError *err)
+
+Comments
+ This function should be called before any of the OCIFile functions are
+ used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure.
+
+Related Functions
+ OCIFileTerm
+
+
+
+********************************* OCIFileOpen() *****************************
+
+Name
+ OCIFileOpen - Oracle Call Interface File i/o OPEN
+
+Purpose
+ Open a file.
+
+Syntax
+ sword OCIFileOpen ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject **filep,
+ OraText *filename,
+ OraText *path,
+ ub4 mode,
+ ub4 create,
+ ub4 type )
+
+Comments
+ OCIFileOpen returns a handle to the open file in filep if the file is
+ successfully opened.
+ If one wants to use the standard file objects (stdin, stdout & stderr)
+ then OCIFileOpen whould be called with the type filed containing the
+ appropriate type (see the parameter type). If any of the standard files
+ are specified then filename, path, mode and create are ignored.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (OUT) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filep (OUT) - the file object to be returned.
+ filename (IN) - file name (NULL terminated string).
+ path (IN) - path of the file (NULL terminated string).
+ mode - mode in which to open the file (valid modes are OCI_FILE_READONLY,
+ OCI_FILE_WRITEONLY, OCI_FILE_READ_WRITE).
+ create - should the file be created if it does not exist. Valid values
+ are:
+ OCI_FILE_TRUNCATE - create a file regardless of whether or not it exists.
+ If the file already exists overwrite it.
+ OCI_FILE_EXIST - open it if it exists, else fail.
+ OCI_FILE_EXCL - fail if the file exists, else create.
+ OCI_FILE_CREATE - open the file if it exists, and create it if it doesn't.
+ OCI_FILE_APPEND - set the file pointer to the end of the file prior to
+ writing(this flag can be OR'ed with OCI_FILE_EXIST or
+ OCI_FILE_CREATE).
+type - file type. Valid values are OCI_FILE_TEXT, OCI_FILE_BIN,
+ OCI_FILE_STDIN, OCI_FILE_STDOUT and OCI_FILE_STDERR.
+ If any of the standard files are specified then filename, path, mode
+ and create are ignored.
+
+Related Functions.
+ OCIFileClose
+
+
+
+************************** OCIFileRead() ************************************
+
+Name
+ OCIFileRead - Oracle Call Interface FILE i/o READ
+
+Purpose
+ Read from a file into a buffer.
+
+Syntax
+ sword OCIFileRead ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep,
+ dvoid *bufp,
+ ub4 bufl,
+ ub4 *bytesread )
+
+Comments
+ Upto bufl bytes from the file will be read into bufp. The user should
+ allocate memory for the buffer.
+ The number of bytes read would be in bytesread.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a File Object that uniquely references the file.
+ bufp (IN) - the pointer to a buffer into which the data will be read. The
+ length of the allocated memory is assumed to be bufl.
+ bufl - the length of the buffer in bytes.
+ bytesread (OUT) - the number of bytes read.
+
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileWrite
+
+
+
+****************************** OCIFileSeek() ******************************
+
+Name
+ OCIFileSeek - Oracle Call Interface FILE i/o SEEK
+
+Purpose
+ Perfom a seek to a byte position.
+
+Syntax
+ sword OCIFileSeek ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep,
+ uword origin,
+ ubig_ora offset,
+ sb1 dir)
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ origin - The starting point we want to seek from. NOTE: The starting
+ point may be OCI_FILE_SEEK_BEGINNING (beginning), OCI_FILE_SEEK_CURRENT
+ (current position), or OCI_FILE_SEEK_END (end of file).
+ offset - The number of bytes from the origin we want to start reading from.
+ dir - The direction we want to go from the origin. NOTE: The direction
+ can be either OCI_FILE_FORWARD or OCI_FILE_BACKWARD.
+
+Related Function
+ OCIFileOpen, OCIFileRead, OCIFileWrite
+
+
+
+*************************** OCIFileTerm() **********************************
+
+Name
+ OCIFileTerm - Oracle Call Interface FILE i/o TERMinate
+
+Purpose
+ Terminate the OCI File I/O package and destroy the OCI File context.
+
+Syntax
+ sword OCIFileTerm ( dvoid *hndl,
+ OCIError *err )
+
+Comments
+ After this function has been called no OCIFile function should be used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure.
+
+Related Functions
+ OCIFileInit
+
+
+********************************* OCIFileWrite() ****************************
+
+Name
+ OCIFileWrite - Oracle Call Interface FILE i/o WRITE
+
+Purpose
+ Write data from buffer into a file.
+
+Syntax
+ sword OCIFileWrite ( dvoid *hndl,
+ OCIError *err,
+ OCIFileObject *filep,
+ dvoid *bufp,
+ ub4 buflen
+ ub4 *byteswritten )
+
+Comments
+ The number of bytes written will be in *byteswritten.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle. If there is an error, it is recorded
+ in err and this function returns OCI_ERROR. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ bufp (IN) - the pointer to a buffer from which the data will be written.
+ The length of the allocated memory is assumed to be the value passed
+ in bufl.
+ bufl - the length of the buffer in bytes.
+ byteswritten (OUT) - the number of bytes written.
+
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileRead
+
+
+
+
+
+OCIHandleAlloc()
+Name
+OCI Get HaNDLe
+Purpose
+This call returns a pointer to an allocated and initialized handle.
+Syntax
+sword OCIHandleAlloc ( CONST dvoid *parenth,
+ dvoid **hndlpp,
+ ub4 type,
+ size_t xtramem_sz,
+ dvoid **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to
+the type specified in type. A non-NULL handle is returned on success. Bind
+handle and define handles are allocated with respect to a statement handle. All
+other handles are allocated with respect to an environment handle which is
+passed in as a parent handle.
+No diagnostics are available on error. This call returns OCI_SUCCESS if
+successful, or OCI_INVALID_HANDLE if an out-of-memory error occurs.
+Handles must be allocated using OCIHandleAlloc() before they can be passed
+into an OCI call.
+Parameters
+parenth (IN) - an environment or a statement handle.
+hndlpp (OUT) - returns a handle to a handle type.
+type (IN) - specifies the type of handle to be allocated. The specific types
+are:
+OCI_HTYPE_ERROR - specifies generation of an error report handle of
+C type OCIError
+OCI_HTYPE_SVCCTX - specifies generation of a service context handle
+of C type OCISvcCtx
+OCI_HTYPE_STMT - specifies generation of a statement (application
+request) handle of C type OCIStmt
+OCI_HTYPE_BIND - specifies generation of a bind information handle
+of C type OCIBind
+OCI_HTYPE_DEFINE - specifies generation of a column definition
+handle of C type OCIDefine
+OCI_HTYPE_DESCRIBE - specifies generation of a select list
+description handle of C type OCIDesc
+OCI_HTYPE_SERVER - specifies generation of a server context handle
+of C type OCIServer
+OCI_HTYPE_SESSION - specifies generation of an authentication
+context handle of C type OCISession
+OCI_HTYPE_TRANS - specifies generation of a transaction context
+handle of C type OCITrans
+OCI_HTYPE_COMPLEXOBJECT - specifies generation of a complex
+object retrieval handle of C type OCIComplexObject
+OCI_HTYPE_SECURITY - specifies generation of a security handle of C
+type OCISecurity
+xtramem_sz (IN) - specifies an amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz
+allocated by the call for the user.
+Related Functions
+OCIHandleFree()
+
+
+
+OCIHandleFree()
+Name
+OCI Free HaNDLe
+Purpose
+This call explicitly deallocates a handle.
+Syntax
+sword OCIHandleFree ( dvoid *hndlp,
+ ub4 type);
+Comments
+This call frees up storage associated with a handle, corresponding to the type
+specified in the type parameter.
+This call returns either OCI_SUCCESS or OCI_INVALID_HANDLE.
+All handles must be explicitly deallocated. OCI will not deallocate a child
+handle if the parent is deallocated.
+Parameters
+hndlp (IN) - an opaque pointer to some storage.
+type (IN) - specifies the type of storage to be allocated. The specific types are:
+OCI_HTYPE_ENV - an environment handle
+OCI_HTYPE_ERROR - an error report handle
+OCI_HTYPE_SVCCTX - a service context handle
+OCI_HTYPE_STMT - a statement (application request) handle
+OCI_HTYPE_BIND - a bind information handle
+OCI_HTYPE_DEFINE - a column definition handle
+OCI_HTYPE_DESCRIBE - a select list description handle
+OCI_HTYPE_SERVER - a server handle
+OCI_HTYPE_SESSION - a user authentication handle
+OCI_HTYPE_TRANS - a transaction handle
+OCI_HTYPE_COMPLEXOBJECT - a complex object retrieval handle
+OCI_HTYPE_SECURITY - a security handle
+Related Functions
+OCIHandleAlloc()
+
+
+
+
+OCIInitialize()
+Name
+OCI Process Initialize
+Purpose
+Initializes the OCI process environment.
+Syntax
+sword OCIInitialize ( ub4 mode,
+ CONST dvoid *ctxp,
+ CONST dvoid *(*malocfp)
+ ( dvoid *ctxp,
+ size_t size ),
+ CONST dvoid *(*ralocfp)
+ ( dvoid *ctxp,
+ dvoid *memp,
+ size_t newsize ),
+ CONST void (*mfreefp)
+ ( dvoid *ctxp,
+ dvoid *memptr ));
+Comments
+This call initializes the OCI process environment.
+OCIInitialize() must be invoked before any other OCI call.
+Parameters
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data
+structures are protected from concurrent accesses by multiple threads.
+OCI_OBJECT - will use navigational object interface.
+ctxp (IN) - user defined context for the memory call back routines.
+malocfp (IN) - user-defined memory allocation function. If mode is
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing
+the use of OCIInitialize().
+Related Functions
+
+--------------------------------OCITerminate------------------------------------
+
+OCITerminate()
+Name
+OCI process Terminate
+Purpose
+Do cleanup before process termination
+Syntax
+sword OCITerminate (ub4 mode);
+
+Comments
+This call performs OCI related clean up before the OCI process terminates.
+If the process is running in shared mode then the OCI process is disconnected
+from the shared memory subsystem.
+
+OCITerminate() should be the last OCI call in any process.
+
+Parameters
+mode (IN) - specifies different termination modes.
+
+OCI_DEFAULT - default mode.
+
+Example
+
+Related Functions
+OCIInitialize()
+
+---------------------- OCIIntervalAssign ---------------------------------
+sword OCIIntervalAssign(dvoid *hndl, OCIError *err,
+ CONST OCIInterval *inpinter, OCIInterval *outinter );
+
+ DESCRIPTION
+ Copies one interval to another to create a replica
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) inpinter - Input Interval
+ (OUT) outinter - Output Interval
+ RETURNS
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_SUCCESS otherwise
+
+ ---------------------- OCIIntervalCheck ------------------------------------
+sword OCIIntervalCheck(dvoid *hndl, OCIError *err, CONST OCIInterval *interval,
+ ub4 *valid );
+
+ DESCRIPTION
+ Checks the validity of an interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) interval - Interval to be checked
+ (OUT) valid - Zero if the interval is valid, else returns an Ored
+ combination of the following codes.
+
+ Macro name Bit number Error
+ ---------- ---------- -----
+ OCI_INTER_INVALID_DAY 0x1 Bad day
+ OCI_INTER_DAY_BELOW_VALID 0x2 Bad DAy Low/high bit (1=low)
+ OCI_INTER_INVALID_MONTH 0x4 Bad MOnth
+ OCI_INTER_MONTH_BELOW_VALID 0x8 Bad MOnth Low/high bit (1=low)
+ OCI_INTER_INVALID_YEAR 0x10 Bad YeaR
+ OCI_INTER_YEAR_BELOW_VALID 0x20 Bad YeaR Low/high bit (1=low)
+ OCI_INTER_INVALID_HOUR 0x40 Bad HouR
+ OCI_INTER_HOUR_BELOW_VALID 0x80 Bad HouR Low/high bit (1=low)
+ OCI_INTER_INVALID_MINUTE 0x100 Bad MiNute
+ OCI_INTER_MINUTE_BELOW_VALID 0x200 Bad MiNute Low/high bit(1=low)
+ OCI_INTER_INVALID_SECOND 0x400 Bad SeCond
+ OCI_INTER_SECOND_BELOW_VALID 0x800 bad second Low/high bit(1=low)
+ OCI_INTER_INVALID_FRACSEC 0x1000 Bad Fractional second
+ OCI_INTER_FRACSEC_BELOW_VALID 0x2000 Bad fractional second Low/High
+
+
+ RETURNS
+ OCI_SUCCESS if interval is okay
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalCompare -----------------------------------
+sword OCIIntervalCompare(dvoid *hndl, OCIError *err, OCIInterval *inter1,
+ OCIInterval *inter2, sword *result );
+
+ DESCRIPTION
+ Compares two intervals, returns 0 if equal, -1 if inter1 < inter2,
+ 1 if inter1 > inter2
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ inter1 (IN) - Interval to be compared
+ inter2 (IN) - Interval to be compared
+ result (OUT) - comparison result, 0 if equal, -1 if inter1 < inter2,
+ 1 if inter1 > inter2
+
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ the two input datetimes are not mutually comparable.
+
+---------------------- OCIIntervalDivide ------------------------------------
+sword OCIIntervalDivide(dvoid *hndl, OCIError *err, OCIInterval *dividend,
+ OCINumber *divisor, OCIInterval *result );
+
+ DESCRIPTION
+ Divides an interval by an Oracle Number to produce an interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ dividend (IN) - Interval to be divided
+ divisor (IN) - Oracle Number dividing `dividend'
+ result (OUT) - resulting interval (dividend / divisor)
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalFromNumber --------------------
+sword OCIIntervalFromNumber(dvoid *hndl, OCIError *err,
+ OCIInterval *inter, OCINumber *number);
+ DESCRIPTION
+ Converts an interval to an Oracle Number
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (OUT) interval - Interval to be converted
+ (IN) number - Oracle number result (in years for YEARMONTH interval
+ and in days for DAYSECOND)
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR on error.
+ NOTES
+ Fractional portions of the date (for instance, minutes and seconds if
+ the unit chosen is hours) will be included in the Oracle number produced.
+ Excess precision will be truncated.
+
+ ---------------------- OCIIntervalFromText ---------------------------------
+sword OCIIntervalFromText( dvoid *hndl, OCIError *err, CONST OraText *inpstr,
+ size_t str_len, OCIInterval *result );
+
+ DESCRIPTION
+ Given an interval string produce the interval represented by the string.
+ The type of the interval is the type of the 'result' descriptor.
+ PARAMETERS
+
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) inpstr - Input string
+ (IN) str_len - Length of input string
+ (OUT) result - Resultant interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if
+ there are too many fields in the literal string
+ the year is out of range (-4713 to 9999)
+ if the month is out of range (1 to 12)
+ if the day of month is out of range (1 to 28...31)
+ if hour is not in range (0 to 23)
+ if hour is not in range (0 to 11)
+ if minute is not in range (0 to 59)
+ if seconds in minute not in range (0 to 59)
+ if seconds in day not in range (0 to 86399)
+ if the interval is invalid
+
+
+ ---------------------- OCIIntervalGetDaySecond --------------------
+
+ DESCRIPTION
+ Gets values of day second interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ day (OUT) - number of days
+ hour (OUT) - number of hours
+ min (OUT) - number of mins
+ sec (OUT) - number of secs
+ fsec (OUT) - number of fractional seconds
+ result (IN) - resulting interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+ ---------------------- OCIIntervalGetYearMonth --------------------
+
+ DESCRIPTION
+ Gets year month from an interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ year (OUT) - year value
+ month (OUT) - month value
+ result (IN) - resulting interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+
+-------------------------- OCIIntervalAdd ------------------------------
+sword OCIIntervalAdd(dvoid *hndl, OCIError *err, OCIInterval *addend1,
+ OCIInterval *addend2, OCIInterval *result );
+NAME OCIIntervalAdd - Adds two intervals
+PARAMETERS
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+addend1 (IN) - Interval to be added
+addend2 (IN) - Interval to be added
+result (OUT) - resulting interval (addend1 + addend2)
+DESCRIPTION
+ Adds two intervals to produce a resulting interval
+RETURNS
+ OCI_SUCCESS on success
+ OCI_ERROR if:
+ the two input intervals are not mutually comparable.
+ the resulting year would go above SB4MAXVAL
+ the resulting year would go below SB4MINVAL
+ OCI_INVALID_HANDLE if 'err' is NULL.
+NOTES
+ The two input intervals must be mutually comparable
+
+ ---------------------- OCIIntervalSubtract -------------------------------
+sword OCIIntervalSubtract(dvoid *hndl, OCIError *err, OCIInterval *minuend,
+ OCIInterval *subtrahend, OCIInterval *result );
+NAME - OCIIntervalSubtract - subtracts two intervals
+PARAMETERS
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+minuend (IN) - interval to be subtracted from
+subtrahend (IN) - interval subtracted from minuend
+result (OUT) - resulting interval (minuend - subtrahend)
+DESCRIPTION
+ Subtracts two intervals and stores the result in an interval
+RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if:
+ the two input intervals are not mutually comparable.
+ the resulting leading field would go below SB4MINVAL
+ the resulting leading field would go above SB4MAXVAL
+
+---------------------- OCIIntervalMultiply ---------------------------------
+sword OCIIntervalMultiply(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ OCINumber *nfactor, OCIInterval *result );
+
+ DESCRIPTION
+ Multiplies an interval by an Oracle Number to produce an interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ inter (IN) - Interval to be multiplied
+ nfactor (IN) - Oracle Number to be multiplied
+ result (OUT) - resulting interval (ifactor * nfactor)
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR if:
+ the resulting year would go above SB4MAXVAL
+ the resulting year would go below SB4MINVAL
+
+
+ ---------------------- OCIIntervalSetDaySecond --------------------
+
+ DESCRIPTION
+ Sets day second interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ day (IN) - number of days
+ hour (IN) - number of hours
+ min (IN) - number of mins
+ sec (IN) - number of secs
+ fsec (IN) - number of fractional seconds
+ result (OUT) - resulting interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+ ---------------------- OCIIntervalSetYearMonth --------------------
+
+ DESCRIPTION
+ Sets year month interval
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ year (IN) - year value
+ month (IN) - month value
+ result (OUT) - resulting interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+----------------------- OCIIntervalToNumber ---------------------------------
+sword OCIIntervalToNumber(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ OCINumber *number);
+
+ DESCRIPTION
+ Converts an interval to an Oracle Number
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) inter - Interval to be converted
+ (OUT) number - Oracle number result (in years for YEARMONTH interval
+ and in days for DAYSECOND)
+ RETURNS
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_SUCCESS on success
+ NOTES
+ Fractional portions of the date (for instance, minutes and seconds if
+ the unit chosen is hours) will be included in the Oracle number produced.
+ Excess precision will be truncated.
+
+------------------------------- OCIIntervalToText -------------------------
+sword OCIIntervalToText( dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ ub1 lfprec, ub1 fsprec, OraText *buffer,
+ size_t buflen, size_t *resultlen );
+
+ DESCRIPTION
+ Given an interval, produces a string representing the interval.
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ (IN) inter - Interval to be converted
+ (IN) lfprec - Leading field precision. Number of digits used to
+ represent the leading field.
+ (IN) fsprec - Fractional second precision of the interval. Number of
+ digits used to represent the fractional seconds.
+ (OUT) buffer - buffer to hold result
+ (IN) buflen - length of above buffer
+ (OUT) resultlen - length of result placed into buffer
+
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR
+ if the buffer is not large enough to hold the result
+ NOTES
+ The interval literal will be output as `year' or `[year-]month' for
+ YEAR-MONTH intervals and as `seconds' or `minutes[:seconds]' or
+ `hours[:minutes[:seconds]]' or `days[ hours[:minutes[:seconds]]]' for
+ DAY-TIME intervals (where optional fields are surrounded by brackets).
+
+ ---------------------- OCIIntervalFromTZ --------------------
+sword OCIIntervalFromTZ(dvoid *hndl, OCIError *err, CONST oratext *inpstring,
+ size_t str_len, OCIInterval *result);
+
+ DESCRIPTION
+ Retuns an OCI_DTYPE_INTERVAL_DS OCIInterval with the region id (if
+ the region is specified in the input string) set and the current
+ absolute offset or an absolut offset with the region id set to 0.
+ PARAMETERS
+ hndl (IN) - Session/Env handle.
+ err (IN/OUT) - error handle. If there is an error, it is
+ recorded in 'err' and this function returns OCI_ERROR.
+ The error recorded in 'err' can be retrieved by calling
+ OCIErrorGet().
+ inpstring (IN) - pointer to the input string
+ str_len (IN) - inpstring length
+ result - Output Interval
+ RETURNS
+ OCI_SUCCESS on success
+ OCI_INVALID_HANDLE if 'err' is NULL.
+ OCI_ERROR on error
+ Bad interval type
+ Timezone errors
+ NOTES
+ The input string must be of the form [+/-]TZH:TZM or 'TZR [TZD]'
+
+OCILdaToSvcCtx()
+Name
+OCI toggle version 7 Lda_Def to SerVice context handle
+Purpose
+Converts a V7 Lda_Def to a V8 service context handle.
+Syntax
+sword OCILdaToSvcCtx ( OCISvcCtx **svchpp,
+ OCIError *errhp,
+ Lda_Def *ldap );
+Comments
+Converts a V7 Lda_Def to a V8 service context handle. The action of this call
+can be reversed by passing the resulting service context handle to the
+OCISvcCtxToLda() function.
+Parameters
+svchpp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+ldap (IN/OUT) - the V7 logon data area returned by OCISvcCtxToLda() from
+this service context.
+Related Functions
+OCISvcCtxToLda()
+
+
+
+
+OCILobAppend()
+
+Name
+OCI Lob APpend
+
+Purpose
+Appends a LOB value at the end of another LOB.
+
+Syntax
+sword OCILobAppend ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_locp );
+Comments
+Appends a LOB value at the end of LOB. The data is
+copied from the source to the destination at the end of the destination. The
+source and the destination must already exist. The destination LOB is
+extended to accommodate the newly written data.
+
+It is an error to extend the destination LOB beyond the maximum length
+allowed or to try to copy from a NULL LOB.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB.
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB.
+
+Related Functions
+OCILobTrim()
+OCIErrorGet()
+OCILobWrite()
+OCILobCopy()
+
+
+
+OCILobAssign()
+
+Name
+OCI Lob ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobAssign ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *src_locp,
+ OCILobLocator **dst_locpp );
+
+Comments
+Assign source locator to destination locator. After the assignment, both
+locators refer to the same LOB data. For internal LOBs, the source locator's
+LOB data gets copied to the destination locator's LOB data only when the
+destination locator gets stored in the table. Therefore, issuing a flush of
+the object containing the destination locator will copy the LOB data. For
+FILEs only the locator that refers to the OS file is copied to the table. The
+OS file is not copied.
+Note: The only difference between this and OCILobLocatorAssign is that this
+takes an environment handle whereas OCILobLocatorAssign takes an OCI service
+handle
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded
+in errhp and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to. The caller must allocate space
+for the OCILobLocator by calling OCIDescriptorAlloc().
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobLocatorAssign()
+
+
+OCILobCharSetForm()
+
+Name
+OCI Lob Get Character Set Form
+
+Purpose
+Gets the LOB locator's character set fpr,, if any.
+
+Syntax
+sword OCILobCharSetForm ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *locp,
+ ub1 *csfrm );
+
+Comments
+Returns the character set form of the input LOB locator in the csfrm output
+parameter.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it
+is recorded in err and this function returns OCI_ERROR. Diagnostic
+information can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set form.
+csfrm(OUT) - character set form of the input LOB locator. If the input
+locator is for a BLOB or a BFILE, csfrm is set to 0 since there is no concept
+of a character set for binary LOBs/FILEs. The caller must allocate space for
+the csfrm (ub1) and not write into the space.
+See also
+OCIErrorGet(), OCILobCharSetId(), OCILobLocatorIsInit
+
+
+
+OCILobCharSetId()
+
+Name
+OCI Lob get Character Set IDentifier
+
+Purpose
+Gets the LOB locator's character set ID, if any.
+
+Syntax
+sword OCILobCharSetId ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *locp,
+ ub2 *csid );
+
+Comments
+Returns the character set ID of the input LOB locator in the cid output
+parameter.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it
+is recorded in err and this function returns OCI_ERROR. Diagnostic
+information can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set ID.
+csid (OUT) - character set ID of the input LOB locator. If the input locator
+is for a BLOB or a BFILE, csid is set to 0 since there is no concept of a
+character set for binary LOBs/FILEs. The caller must allocate space for the
+character set id of type ub2 and not write into the space.
+
+See also
+OCIErrorGet(), OCILobCharSetForm(), OCILobLocatorIsInit()
+
+
+
+OCILobCopy()
+
+Name
+OCI Lob Copy
+
+Purpose
+Copies a portion of a LOB value into another LOB value.
+
+Syntax
+sword OCILobCopy ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_locp,
+ ub4 amount,
+ ub4 dst_offset,
+ ub4 src_offset );
+
+Comments
+Copies a portion of a LOB value into another LOB as specified. The data
+is copied from the source to the destination. The source (src_locp) and the
+destination (dlopb) LOBs must already exist.
+If the data already exists at the destination's start position, it is
+overwritten with the source data. If the destination's start position is
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination
+LOB is extended to accommodate the newly written data if it extends
+beyond the current length of the destination LOB.
+It is an error to extend the destination LOB beyond the maximum length
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB.
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB.
+amount (IN) - the number of character or bytes, as appropriate, to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB.
+For character LOBs it is the number of characters from the beginning of the
+LOB at which to begin writing. For binary LOBs it is the number of bytes from
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source LOB.
+For character LOBs it is the number of characters from the beginning of the
+LOB, for binary LOBs it is the number of bytes. Starts at 1.
+
+See Also
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim()
+
+OCILobCreateTemporary()
+
+Name
+OCI Lob Create Temporary
+
+Purpose
+Create a Temporary Lob
+
+Syntax
+sword OCILobCreateTemporary(OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub2 csid,
+ ub1 csfrm,
+ ub1 lobtype,
+ boolean cache,
+ OCIDuration duration);
+
+
+Comments
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator which points to the temporary Lob
+csid (IN) - the character set id
+csfrm(IN) - the character set form
+lobtype (IN) - the lob type - one of the three constants OCI_TEMP_BLOB,
+ OCI_TEMP_CLOB and OCI_TEMP_NCLOB
+cache(IN)- TRUE if the temporary LOB goes through the cache; FALSE, if not.
+duration(IN)- duration of the temporary LOB; Can be a valid duration id or one
+ of the values: OCI_DURATION_SESSION, OCI_DURATION_CALL
+ Note: OCI_DURATION_TRANSACTION is NOT supported in 8.1
+Related functions
+OCILobFreeTemporary()
+OCILobIsTemporary()
+
+OCILobDisableBuffering()
+
+Name
+OCI Lob Disable Buffering
+
+Purpose
+Disable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobDisableBuffering ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+Comments
+
+Disable lob buffering for the input locator. The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is *not* used. Note that this call does *not*
+implicitly flush the changes made in the buffering subsystem. The
+user must explicitly call OCILobFlushBuffer() to do this.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator uniquely referencing the LOB.
+
+Related Functions
+OCILobEnableBuffering()
+OCIErrorGet()
+OCILobFlushBuffer()
+
+
+
+
+OCILobEnableBuffering()
+
+Name
+OCI Lob Enable Buffering
+
+Purpose
+Enable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobEnableBuffering ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+Comments
+
+Enable lob buffering for the input locator. The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is used.
+
+Once lob buffering is enabled for a locator, if that locator is passed to
+one of the following routines, an error is returned:
+ OCILobCopy, OCILobAppend, OCILobErase, OCILobGetLength, OCILobTrim
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator uniquely referencing the LOB.
+
+Related Functions
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+OCILobFlushBuffer()
+
+
+
+
+OCILobErase()
+
+Name
+OCI Lob ERase
+
+Purpose
+Erases a specified portion of the LOB data starting at a specified offset.
+
+Syntax
+sword OCILobErase ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *amount,
+ ub4 offset );
+
+Comments
+Erases a specified portion of the LOB data starting at a specified offset.
+The actual number of characters/bytes erased is returned. The actual number
+of characters/bytes and the requested number of characters/bytes will differ
+if the end of the LOB data is reached before erasing the requested number of
+characters/bytes.
+If a section of data from the middle of the LOB data is erased, a hole is
+created. When data from that hole is read, 0's are returned. If the LOB is
+NULL, this routine will indicate that 0 characters/bytes were erased.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - the LOB for which to erase a section of data.
+amount (IN/OUT) - On IN, the number of characters/bytes to erase. On OUT,
+the actual number of characters/bytes erased.
+offset (IN) - absolute offset from the beginning of the LOB data from which
+to start erasing data. Starts at 1.
+
+See Also
+OCIErrorGet(), OCILobRead(), OCILobWrite()
+
+OCILobOpen()
+
+Name
+OCI Lob Open
+
+Purpose
+Opens an internal or external Lob.
+
+Syntax
+sword OCILobOpen( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub1 mode );
+
+Comments
+It is an error if the same lob is opened more than once in
+the same transaction. Lobs are opened implicitly if they are
+not opened before using them. A LOB has to be closed before
+the transaction commits else the transaction is rolled back.
+Open locators are closed if the transaction aborts. Multiple
+users can open the same lob on different locators.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - locator points to the LOB to be opened
+mode (IN) - mode in which to open the lob. The valid modes are
+read-only - OCI_FILE_READONLY, read-write - OCI_FILE_READWRITE
+
+OCILobClose()
+
+Name
+OCI Lob Close
+
+Purpose
+Closes an open internal or external Lob.
+
+Syntax
+sword OCILobClose( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp );
+
+
+Comments
+It is an error if the lob is not open at this time. All LOBs
+that have been opened in a transaction have to be closed
+before the transaction commits, else the transaction gets
+rolled back.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN) - A locator that was opened using OCILobOpen()
+
+
+OCILobFileClose()
+
+Name
+OCI Lob File CLoSe
+
+Purpose
+Closes a previously opened FILE.
+
+Syntax
+sword OCILobFileClose ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *filep );
+
+Comments
+Closes a previously opened FILE. It is an error if this function is called for
+an internal LOB. No error is returned if the FILE exists but is not opened.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+filep (IN/OUT) - a pointer to a FILE locator to be closed.
+
+See Also
+OCIErrorGet(), OCILobFileOpen(), OCILobFileCloseAll(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+OCILobFileCloseAll()
+
+Name
+OCI LOB FILE Close All
+
+Purpose
+Closes all open FILEs on a given service context.
+
+Syntax
+sword OCILobFileCLoseAll ( OCISvcCtx *svchp,
+ OCIError *errhp );
+
+Comments
+Closes all open FILEs on a given service context.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+
+See also
+OCILobFileClose(),
+OCIErrorGet(), OCILobFileOpen(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+OCILobFileExists()
+
+Name
+OCI LOB FILE exists
+
+Purpose
+Tests to see if the FILE exists on the server
+
+Syntax
+sword OCILobFileExists ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *filep,
+ boolean *flag );
+
+Comments
+Checks to see if a FILE exists for on the server.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error,
+it is recorded in err and this function returns OCI_ERROR. Diagnostic
+information can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator that refers to the file.
+flag (OUT) - returns TRUE if the FILE exists; FALSE if it does not.
+
+See also
+OCIErrorGet, CREATE DIRECTORY (DDL)
+
+
+
+
+OCILobFileGetName()
+
+Name
+OCI LOB FILE Get file Name
+
+Purpose
+Gets the FILE locator's directory alias and file name.
+
+Syntax
+sword OCILobFileGetName ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *filep,
+ OraText *dir_alias,
+ ub2 *d_length,
+ OraText *filename,
+ ub2 *f_length );
+
+Comments
+Returns the directory alias and file name associated with this file locator.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) -The OCI error handle. If there is an error, it is recorded in
+errhp and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+filep (IN) - FILE locator for which to get the directory alias and file name.
+dir_alias (OUT) - buffer into which the directory alias name is placed. The
+caller must allocate enough space for the directory alias name and must not
+write into the space.
+d_length (IN/OUT)
+ - IN: length of the input dir_alias string;
+ - OUT: length of the returned dir_alias string.
+filename (OUT) - buffer into which the file name is placed. The caller must
+allocate enough space for the file name and must not write into the space.
+f_length (IN/OUT)
+ - IN: length of the input filename string;
+ - OUT: lenght of the returned filename string.
+
+See also
+OCILobFileSetName(), OCIErrorGet()
+
+
+
+
+OCILobFileIsOpen()
+
+Name
+OCI LOB FILE Is Open?
+
+Purpose
+Tests to see if the FILE is open
+
+Syntax
+sword OCILobFileIsOpen ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *filep,
+ boolean *flag );
+
+Comments
+Checks to see if the FILE on the server is open for a given LobLocator.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it
+is recorded in err and this function returns OCI_ERROR. Diagnostic
+information can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator being examined. If the input file
+locator was never passed to OCILobFileOpen(), the file is considered not to
+be opened by this locator. However, a different locator may have opened the
+file. More than one file opens can be performed on the same file using
+different locators.
+flag (OUT) - returns TRUE if the FILE is opened using this locator; FALSE if
+it is not.
+
+See also
+OCIErrorGet, OCILobFileOpen, OCILobFileClose, OCILobFileCloseAll, CREATE
+DIRECTORY SQL command
+
+
+OCILobFileOpen()
+
+Name
+OCI LOB FILE open
+
+Purpose
+Opens a FILE for read-only access
+
+Syntax
+sword OCILobFileOpen ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *filep,
+ ub1 mode );
+
+Comments
+Opens a FILE. The FILE can be opened for read-only access only. FILEs may not
+be written to throough ORACLE.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+filep (IN/OUT) - the FILE to open. Error if the locator does not refer to a
+FILE.
+mode (IN) - mode in which to open the file. The only valid mode is
+read-only - OCI_FILE_READONLY.
+
+See Also
+OCILobFileClose, OCIErrorGet, OCILobFileCloseAll, OCILobFileIsOpen,
+OCILobFileSetName, CREATE DIRECTORY
+
+
+
+
+OCILobFileSetName()
+
+Name
+OCI Lob File Set NaMe
+
+Purpose
+Sets directory alias and file name in the FILE locator.
+
+Syntax
+sword OCILobFileSetName ( OCIEnv *envhp,
+ OCIError *errhp,
+ OCILobLocator **filepp,
+ OraText *dir_alias,
+ ub2 d_length,
+ OraText *filename,
+ ub2 f_length );
+Comments
+Sets the directory alias and file name in the LOB file locator.
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded
+in errhp and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+filepp (IN/OUT) - FILE locator for which to set the directory alias name.
+The caller must have already allocated space for the locator by calling
+OCIDescriptorAlloc().
+dir_alias (IN) - buffer that contains the directory alias name to set in the
+locator.
+d_length (IN) - length of the input dir_alias parameter.
+filename (IN) - buffer that contains the file name is placed.
+f_length (IN) - length of the input filename parameter.
+See also
+OCILobFileGetName, OCIErrorGet, CREATE DIRECTORY
+
+
+
+
+OCILobFlushBuffer()
+
+Name
+OCI Lob Flush all Buffers for this lob.
+
+Purpose
+Flush/write all buffers for this lob to the server.
+
+
+Syntax
+sword OCILobFlushBuffer ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 flag);
+
+Comments
+
+Flushes to the server, changes made to the buffering subsystem that
+are associated with the lob referenced by the input locator. This
+routine will actually write the data in the buffer to the lob in
+the database. Lob buffering must have already been enabled for the
+input lob locator.
+
+This routine, by default, does not free the buffer resources for
+reallocation to another buffered LOB operation. However, if you
+want to free the buffer explicitly, you can set the flag parameter
+to OCI_LOB_BUFFER_FREE.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator uniquely referencing the LOB.
+flag (IN) - to indicate if the buffer resources need to be freed
+ after a flush. Default value is OCI_LOB_BUFFER_NOFREE.
+ Set it to OCI_LOB_BUFFER_FREE if you want the buffer
+ resources to be freed.
+Related Functions
+OCILobEnableBuffering()
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+
+
+OCILobFreeTemporary()
+
+Name
+OCI Lob Free Temporary
+
+Purpose
+Free a temporary LOB
+
+Syntax
+sword OCILobFreeTemporary(OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+Comments
+ Frees the contents of the temporary Lob this locator is pointing to. Note
+ that the locator itself is not freed until a OCIDescriptorFree is done.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a locator uniquely referencing the LOB
+
+Related functions
+OCILobCreateTemporary()
+OCILobIsTemporary()
+
+
+Name
+OCI Lob/File Get Chunk Size
+
+Purpose
+When creating the table, the user can specify the chunking factor, which can
+be a multiple of Oracle blocks. This corresponds to the chunk size used by the
+LOB data layer when accessing/modifying the LOB value. Part of the chunk is
+used to store system-related information and the rest stores the LOB value.
+This function returns the amount of space used in the LOB chunk to store
+the LOB value.
+
+Syntax
+sword OCILobGetChunkSize ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *chunksizep );
+
+Comments
+ Performance will be improved if the user issues read/write
+requests using a multiple of this chunk size. For writes, there is an added
+benefit since LOB chunks are versioned and, if all writes are done on chunk
+basis, no extra/excess versioning is done nor duplicated. Users could batch
+up the write until they have enough for a chunk instead of issuing several
+write calls for the same chunk.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+chunksizep (OUT) - On output, it is the length of the LOB if not NULL - for
+character LOBs it is the number of characters, for binary LOBs it is the
+number of bytes in the LOB.
+
+Related Functions
+
+OCILobGetLength()
+
+Name
+OCI Lob/File Length
+
+Purpose
+Gets the length of a LOB/FILE.
+
+Syntax
+sword OCILobGetLength ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *lenp );
+
+Comments
+Gets the length of a LOB/FILE. If the LOB/FILE is NULL, the length is
+undefined.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+lenp (OUT) - On output, it is the length of the LOB if not NULL - for
+character LOBs it is the number of characters, for binary LOBs it is the
+number of bytes in the LOB.
+
+Related Functions
+OCIErrorGet, OCIFileSetName
+
+
+
+OCILobIsEqual()
+
+Name
+
+OCI Lob Is Equal
+
+Purpose
+Compares two LOB locators for equality.
+
+Syntax
+sword OCILobIsEqual ( OCIEnv *envhp,
+ CONST OCILobLocator *x,
+ CONST OCILobLocator *y,
+ boolean *is_equal );
+
+Comments
+Compares the given LOB locators for equality. Two LOB locators are equal if
+and only if they both refer to the same LOB data.
+Two NULL locators are considered not equal by this function.
+Parameters
+envhp (IN) - the OCI environment handle.
+x (IN) - LOB locator to compare.
+y (IN) - LOB locator to compare.
+is_equal (OUT) - TRUE, if the LOB locators are equal; FALSE if they are not.
+
+See also
+OCILobAssign, OCILobLocatorIsInit
+OCILobLocatorAssign,
+OCILobIsOpen()
+
+Name
+
+OCI Lob Is Open
+sword OCILobIsOpen(svchp, errhp, locp, flag)
+OCISvcCtx *svchp;
+OCIError *errhp;
+OCILobLocator *locp;
+boolean *flag;
+
+Comments
+ Checks if the LOB locator was opened before. flag is set to TRUE
+ if opened; FALSE otherwise
+
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN) - the locator to test for temporary LOB
+flag(OUT) - TRUE, if the LOB locator points to is open
+ FALSE, if not.
+
+OCILobIsTemporary()
+
+Name
+
+OCI Lob Is Temporary
+
+Purpose
+ Tests if this locator points to a temporary LOB
+
+Syntax
+sword OCILobIsTemporary(OCIEnv *envhp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ boolean *is_temporary);
+
+Comments
+Tests the locator to determine if it points to a temporary LOB.
+If so, is_temporary is set to TRUE. If not, is_temporary is set
+to FALSE.
+
+Parameters
+envhp (IN) - the environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN) - the locator to test for temporary LOB
+is_temporary(OUT) - TRUE, if the LOB locator points to a temporary LOB;
+ FALSE, if not.
+
+See Also
+OCILobCreateTemporary, OCILobFreeTemporary
+
+
+OCILobLoadFromFile()
+
+Name
+OCI Lob Load From File
+
+Purpose
+Load/copy all or a portion of the file into an internal LOB.
+
+Syntax
+sword OCILobLoadFromFile ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_filep,
+ ub4 amount,
+ ub4 dst_offset,
+ ub4 src_offset );
+
+Comments
+Loads/copies a portion or all of a file value into an internal LOB as
+specified. The data is copied from the source file to the destination
+internal LOB (BLOB/CLOB). No character set conversions are performed
+when copying the bfile data to a clob/nclob. The bfile data must already
+be in the same character set as the clob/nclob in the database. No
+error checking is performed to verify this.
+The source (src_filep) and the destination (dst_locp) LOBs must already exist.
+If the data already exists at the destination's start position, it is
+overwritten with the source data. If the destination's start position is
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination
+LOB is extended to accommodate the newly written data if it extends
+beyond the current length of the destination LOB.
+It is an error to extend the destination LOB beyond the maximum length
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+dst_locp (IN/OUT) - a locator uniquely referencing the destination internal
+LOB which may be of type blob, clob, or nclob.
+src_filep (IN/OUT) - a locator uniquely referencing the source BFILE.
+amount (IN) - the number of bytes to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB.
+For character LOBs it is the number of characters from the beginning of the
+LOB at which to begin writing. For binary LOBs it is the number of bytes from
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source BFILE. It is
+the number of bytes from the beginning of the LOB. The offset starts at 1.
+
+See Also
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim(), OCILobCopy()
+
+OCILobLocatorAssign()
+
+Name
+OCI Lob LOCATOR ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobLocatorAssign ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ CONST OCILobLocator *src_locp,
+ OCILobLocator **dst_locpp );
+
+Comments
+Assign source locator to destination locator. After the assignment, both
+locators refer to the same LOB data. For internal LOBs, the source locator's
+LOB data gets copied to the destination locator's LOB data only when the
+destination locator gets stored in the table. Therefore, issuing a flush of
+the object containing the destination locator will copy the LOB data. For
+FILEs only the locator that refers to the OS file is copied to the table. The
+OS file is not copied.
+Note : the only difference between this and OCILobAssign is that this takes
+a OCI service handle pointer instead of a OCI environment handle pointer
+
+Parameters
+svchp (IN/OUT) - OCI service handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded
+in errhp and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to. The caller must allocate space
+for the OCILobLocator by calling OCIDescriptorAlloc().
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobAssign()
+
+
+
+
+OCILobLocatorIsInit()
+
+Name
+OCI LOB locator is initialized?
+
+Purpose
+Tests to see if a given LOB locator is initialized.
+
+Syntax
+sword OCILobLocatorIsInit ( OCIEnv *envhp,
+ OCIError *errhp,
+ CONST OCILobLocator *locp,
+ boolean *is_initialized );
+
+Comments
+Tests to see if a given LOB locator is initialized.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it
+is recorded in err and this function returns OCI_ERROR. Diagnostic
+information can be obtained by calling OCIErrorGet().
+locp (IN) - the LOB locator being tested
+is_initialized (OUT) - returns TRUE if the given LOB locator is initialized;
+FALSE if it is not.
+
+See also
+OCIErrorGet, OCILobIsEqual
+
+
+
+
+OCILobRead()
+
+Name
+OCI Lob/File ReaD
+
+Purpose
+Reads a portion of a LOB/FILE as specified by the call into a buffer.
+
+Syntax
+sword OCILobRead ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 offset,
+ ub4 *amtp,
+ dvoid *bufp,
+ ub4 bufl,
+ dvoid *ctxp,
+ OCICallbackLobRead (cbfp)
+ (
+ dvoid *ctxp,
+ CONST dvoid *bufp,
+ ub4 len,
+ ub1 piece )
+ ub2 csid,
+ ub1 csfrm );
+
+Comments
+Reads a portion of a LOB/FILE as specified by the call into a buffer. Data
+read from a hole is returned as 0s. It is an error to try to read from a NULL
+LOB/FILE. The OS FILE must already exist on the server and must have been
+opened using the input locator. Oracle must hav epermission to read the OS
+file and user must have read permission on the directory object.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB.
+offset (IN) - On input, it is the absolute offset, for character LOBs in the
+number of characters from the beginning of the LOB, for binary LOBs it is the
+number of bytes. Starts from 1.
+amtp (IN/OUT) - On input, the number of character or bytes to be read. On
+output, the actual number of bytes or characters read.
+If the amount of bytes to be read is larger than the buffer length it is
+assumed that the LOB is being read in a streamed mode. On input if this value
+is 0, then the data shall be read in streamed mode from the LOB until the end
+of LOB. If the data is read in pieces, *amtp always contains the length of
+the last piece read. If a callback function is defined, then this callback
+function will be invoked each time bufl bytes are read off the pipe. Each
+piece will be written into bufp.
+If the callback function is not defined, then OCI_NEED_DATA error code will
+be returned. The application must invoke the LOB read over and over again to
+read more pieces of the LOB until the OCI_NEED_DATA error code is not
+returned. The buffer pointer and the length can be different in each call
+if the pieces are being read into different sizes and location.
+bufp (IN) - the pointer to a buffer into which the piece will be read. The
+length of the allocated memory is assumed to be bufl.
+bufl (IN) - the length of the buffer in octets.
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece. If
+this is NULL, then OCI_NEED_DATA will be returned for each piece.
+The callback function must return OCI_CONTINUE for the read to continue.
+If any other error code is returned, the LOB read is aborted.
+ ctxp (IN) - the context for the call back function. Can be NULL.
+ bufp (IN) - a buffer pointer for the piece.
+ len (IN) - the length of length of current piece in bufp.
+ piece (IN) - which piece - OCI_FIRST_PIECE, OCI_NEXT_PIECE or
+ OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCILobFileOpen, OCILobFileSetName, CREATE DIRECTORY
+
+
+
+
+OCILobTrim()
+
+Name
+
+OCI Lob Trim
+
+Purpose
+Trims the lob value to a shorter length
+
+Syntax
+sword OCILobTrim ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 newlen );
+
+Comments
+Truncates LOB data to a specified shorter length.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. This locator
+must be a locator that was obtained from the server specified by svchp.
+newlen (IN) - the new length of the LOB data, which must be less than or equal
+to the current length.
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCiLobErase, OCILobAppend, OCILobCopy
+
+
+
+
+
+OCILobWrite()
+
+Name
+OCI Lob Write
+
+Purpose
+Writes a buffer into a LOB
+
+Syntax
+sword OCILobWrite ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 offset,
+ ub4 *amtp,
+ dvoid *bufp,
+ ub4 buflen,
+ ub1 piece,
+ dvoid *ctxp,
+ OCICallbackLobWrite (cbfp)
+ (
+ dvoid *ctxp,
+ dvoid *bufp,
+ ub4 *lenp,
+ ub1 *piecep )
+ ub2 csid
+ ub1 csfrm );
+
+
+Comments
+Writes a buffer into a LOB as specified. If LOB data already exists
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback
+function will be invoked to get the next piece after a piece is written to
+the pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWrite() returns the
+OCI_NEED_DATA error code. The application must all OCILobWrite() again
+to write more pieces of the LOB. In this mode, the buffer pointer and the
+length can be different in each call if the pieces are of different sizes and
+from different locations. A piece value of OCI_LAST_PIECE terminates the
+piecewise write.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB.
+offset (IN) - On input, it is the absolute offset, for character LOBs in
+the number of characters from the beginning of the LOB, for binary LOBs it
+is the number of bytes. Starts at 1.
+bufp (IN) - the pointer to a buffer from which the piece will be written. The
+length of the allocated memory is assumed to be the value passed in bufl.
+Even if the data is being written in pieces, bufp must contain the first
+piece of the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a
+single piece.
+The following other values are also possible for piecewise or callback mode:
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be
+written. On output, returns the actual number of bytes or characters written.
+If the data is written in pieces, *amtp will contain the total length of the
+pieces written at the end of the call (last piece written) and is undefined in
+between.
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in
+a piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue.
+If any other error code is returned, the LOB write is aborted. The
+callback takes the following parameters:
+ ctxp (IN) - the context for the call back function. Can be NULL.
+ bufp (IN/OUT) - a buffer pointer for the piece.
+ lenp (IN/OUT) - the length of the buffer (in octets) and the length of
+ current piece in bufp (out octets).
+ piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+OCILobWriteAppend()
+
+Name
+OCI Lob Write Append
+
+Purpose
+Writes data to the end of a LOB value. This call provides the ability
+to get the length of the data and append it to the end of the LOB in
+a single round trip to the server.
+
+Syntax
+sword OCILobWriteAppend ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *amtp,
+ dvoid *bufp,
+ ub4 buflen,
+ ub1 piece,
+ dvoid *ctxp,
+ OCICallbackLobWrite (cbfp)
+ (
+ dvoid *ctxp,
+ dvoid *bufp,
+ ub4 *lenp,
+ ub1 *piecep )
+ ub2 csid
+ ub1 csfrm );
+
+
+Comments
+Writes a buffer to the end of a LOB as specified. If LOB data already exists
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback
+function will be invoked to get the next piece after a piece is written to the
+pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWriteAppend() returns the
+OCI_NEED_DATA error code. The application must all OCILobWriteAppend() again
+to write more pieces of the LOB. In this mode, the buffer pointer and the
+length can be different in each call if the pieces are of different sizes and
+from different locations. A piece value of OCI_LAST_PIECE terminates the
+piecewise write.
+
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB.
+bufp (IN) - the pointer to a buffer from which the piece will be written. The
+length of the allocated memory is assumed to be the value passed in bufl. Even
+if the data is being written in pieces, bufp must contain the first piece of
+the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a
+single piece.
+The following other values are also possible for piecewise or callback mode:
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be
+written. On output, returns the actual number of bytes or characters written.
+If the data is written in pieces, *amtp will contain the total length of the
+pieces written at the end of the call (last piece written) and is undefined in
+between.
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in a
+piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue.
+If any other error code is returned, the LOB write is aborted. The
+callback takes the following parameters:
+ ctxp (IN) - the context for the call back function. Can be NULL.
+ bufp (IN/OUT) - a buffer pointer for the piece.
+ lenp (IN/OUT) - the length of the buffer (in octets) and the length of
+ current piece in bufp (out octets).
+ piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+
+
+
+OCILogoff()
+Name
+OCI simplified Logoff
+Purpose
+This function is used to terminate a session created with OCILogon() or
+OCILogon2().
+Syntax
+sword OCILogoff ( OCISvcCtx *svchp
+ OCIError *errhp );
+Comments
+This call is used to terminate a session which was created with OCILogon() or
+OCILogon2().
+This call implicitly deallocates the server, authentication, and service
+context handles.
+Note: For more information on logging on and off in an application,
+refer to the section "Application Initialization, Connection, and
+Authorization" on page 2-16.
+Parameters
+svchp (IN) - the service context handle which was used in the call to
+OCILogon() or OCILogon2().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+See Also
+OCILogon(), OCILogon2().
+
+
+
+
+
+
+OCILogon()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a simple logon session.
+Syntax
+sword OCILogon ( OCIEnv *envhp,
+ OCIError *errhp,
+ OCISvcCtx *svchp,
+ CONST OraText *username,
+ ub4 uname_len,
+ CONST OraText *password,
+ ub4 passwd_len,
+ CONST OraText *dbname,
+ ub4 dbname_len );
+Comments
+This function is used to create a simple logon session for an application.
+Note: Users requiring more complex session (e.g., TP monitor
+applications) should refer to the section "Application Initialization,
+Connection, and Authorization" on page 2-16.
+This call allocates the error and service context handles which are passed to
+it. This call also implicitly allocates server and authentication handles
+associated with the session. These handles can be retrieved by calling
+OCIAttrGet() on the service context handle.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+See Also
+OCILogoff()
+
+
+
+
+
+OCILogon2()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a logon session in connection pooling mode.
+Syntax
+sword OCILogon2 ( OCIEnv *envhp,
+ OCIError *errhp,
+ OCISvcCtx **svchp,
+ CONST OraText *username,
+ ub4 uname_len,
+ CONST OraText *password,
+ ub4 passwd_len,
+ CONST OraText *dbname,
+ ub4 dbname_len,
+ ub4 mode);
+Comments
+This function is used to create a simple logon session for an application in
+Connection Pooling mode. The valid values for mode are currently OCI_POOL and
+OCI_DEFAULT. Call to this function with OCI_DEFAULT mode is equivalent to
+OCILogon() call.
+This call allocates the error and service context handles which are passed to
+it. This call also implicitly allocates server and authentication handles
+associated with the session. These handles can be retrieved by calling
+OCIAttrGet() on the service context handle. This call assumes that
+OCIConnectionPoolCreate() has already been called for the same dbname.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password. If this is null, it is assumed that a
+ proxy session has to be created and the required grants on
+ the database are already done.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+mode (IN) - the mode for doing the server attach. Should be OCI_POOL for
+ using Connection Pooling.
+
+
+See Also
+OCILogoff()
+
+
+
+
+
+OCIMemoryFree()
+Name
+OCI FREE Memory
+Purpose
+Frees up storage associated with the pointer.
+Syntax
+void OCIMemoryFree ( CONST OCIStmt *stmhp,
+ dvoid *memptr);
+Comments
+Frees up dynamically allocated data pointers associated with the pointer using
+either the default memory free function or the registered memory free
+function, as the case may be.
+A user-defined memory free function can be registered during the initial call
+to OCIInitialize().
+This call is always successful.
+Parameters
+stmhp (IN) - statement handle which returned this data buffer.
+memptr (IN) - pointer to data allocated by the client library.
+Related Functions
+OCIInitialize()
+
+
+
+
+
+OCIParamGet()
+Name
+OCI Get PARaMeter
+Purpose
+Returns a descriptor of a parameter specified by position in the describe
+handle or statement handle.
+Syntax
+sword OCIParamGet ( CONST dvoid *hndlp,
+ ub4 htype,
+ OCIError *errhp,
+ dvoid **parmdpp,
+ ub4 pos );
+Comments
+This call returns a descriptor of a parameter specified by position in the
+describe handle or statement handle. Parameter descriptors are always
+allocated internally by the OCI library. They are read-only.
+OCI_NO_DATA may be returned if there are no parameter descriptors for this
+position.
+See Appendix B for more detailed information about parameter descriptor
+attributes.
+Parameters
+hndlp (IN) - a statement handle or describe handle. The OCIParamGet()
+function will return a parameter descriptor for this handle.
+htype (IN) - the type of the handle passed in the handle parameter. Valid
+types are OCI_HTYPE_DESCRIBE, for a describe handle OCI_HTYPE_STMT, for a
+statement handle
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+parmdpp (OUT) - a descriptor of the parameter at the position given in the pos
+parameter.
+pos (IN) - position number in the statement handle or describe handle. A
+parameter descriptor will be returned for this position.
+Note: OCI_NO_DATA may be returned if there are no parameter
+descriptors for this position.
+Related Functions
+OCIAttrGet(), OCIAttrSet()
+
+
+
+
+
+OCIParamSet()
+Name
+OCI Parameter Set in handle
+Purpose
+Used to set a complex object retrieval descriptor into a complex object
+retrieval handle.
+Syntax
+sword OCIParamGet ( dvoid *hndlp,
+ ub4 htyp,
+ OCIError *errhp,
+ CONST dvoid *dscp,
+ ub4 dtyp,
+ ub4 pos );
+Comments
+This call sets a given complex object retrieval descriptor into a complex
+object retrieval handle.
+The handle must have been previously allocated using OCIHandleAlloc(), and
+the descriptor must have been previously allocated using OCIDescAlloc().
+Attributes of the descriptor are set using OCIAttrSet().
+Parameters
+hndlp (IN/OUT) - handle pointer.
+htype (IN) - handle type.
+errhp (IN/OUT) - error handle.
+dscp (IN) - complex object retrieval descriptor pointer.
+dtyp (IN) -
+pos (IN) - position number.
+See Also
+
+
+
+
+
+OCIPasswordChange()
+Name
+OCI Change PassWord
+Purpose
+This call allows the password of an account to be changed.
+Syntax
+sword OCIPasswordChange ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ CONST OraText *user_name,
+ ub4 usernm_len,
+ CONST OraText *opasswd,
+ ub4 opasswd_len,
+ CONST OraText *npasswd,
+ sb4 npasswd_len,
+ ub4 mode);
+Comments
+This call allows the password of an account to be changed. This call is
+similar to OCISessionBegin() with the following differences:
+If the user authentication is already established, it authenticates
+the account using the old password and then changes the
+password to the new password
+If the user authentication is not established, it establishes a user
+authentication and authenticates the account using the old
+password, then changes the password to the new password.
+This call is useful when the password of an account is expired and
+OCISessionBegin() returns an error or warning which indicates that the
+password has expired.
+Parameters
+svchp (IN/OUT) - a handle to a service context. The service context handle
+must be initialized and have a server context handle associated with it.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+user_name (IN) - specifies the user name. It points to a character string,
+whose length is specified in usernm_len. This parameter must be NULL if the
+service context has been initialized with an authentication handle.
+usernm_len (IN) - the length of the user name string specified in user_name.
+For a valid user name string, usernm_len must be non-zero.
+opasswd (IN) - specifies the user's old password. It points to a character
+string, whose length is specified in opasswd_len .
+opasswd_len (IN) - the length of the old password string specified in opasswd.
+For a valid password string, opasswd_len must be non-zero.
+npasswd (IN) - specifies the user's new password. It points to a character
+string, whose length is specified in npasswd_len which must be non-zero for a
+valid password string. If the password complexity verification routine is
+specified in the user's profile to verify the new password's complexity, the
+new password must meet the complexity requirements of the verification
+function.
+npasswd_len (IN) - then length of the new password string specified in
+npasswd. For a valid password string, npasswd_len must be non-zero.
+mode - pass as OCI_DEFAULT.
+Related Functions
+OCISessionBegin()
+
+
+----------------------------------OCIReset------------------------------------
+
+
+OCIReset()
+Name
+OCI Reset
+Purpose
+Resets the interrupted asynchronous operation and protocol. Must be called
+if a OCIBreak call had been issued while a non-blocking operation was in
+progress.
+Syntax
+sword OCIReset ( dvoid *hndlp,
+ OCIError *errhp);
+Comments
+This call is called in non-blocking mode ONLY. Resets the interrupted
+asynchronous operation and protocol. Must be called if a OCIBreak call
+had been issued while a non-blocking operation was in progress.
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+
+
+OCIResultSetToStmt()
+Name
+OCI convert Result Set to Statement Handle
+Purpose
+Converts a descriptor to statement handle for fetching rows.
+Syntax
+sword OCIResultSetToStmt ( OCIResult *rsetdp,
+ OCIError *errhp );
+Comments
+Converts a descriptor to statement handle for fetching rows.
+A result set descriptor can be allocated with a call to OCIDescAlloc().
+Parameters
+rsetdp (IN/OUT) - a result set descriptor pointer.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+Related Functions
+OCIDescAlloc()
+
+
+
+
+OCIServerAttach()
+Name
+OCI ATtaCH to server
+Purpose
+Creates an access path to a data source for OCI operations.
+Syntax
+sword OCIServerAttach ( OCIServer *srvhp,
+ OCIError *errhp,
+ CONST OraText *dblink,
+ sb4 dblink_len,
+ ub4 mode);
+Comments
+This call is used to create an association between an OCI application and a
+particular server.
+This call initializes a server context handle, which must have been previously
+allocated with a call to OCIHandleAlloc().
+The server context handle initialized by this call can be associated with a
+service context through a call to OCIAttrSet(). Once that association has been
+made, OCI operations can be performed against the server.
+If an application is operating against multiple servers, multiple server
+context handles can be maintained. OCI operations are performed against
+whichever server context is currently associated with the service context.
+Parameters
+srvhp (IN/OUT) - an uninitialized server context handle, which gets
+initialized by this call. Passing in an initialized server handle causes an
+error.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+dblink (IN) - specifies the database (server) to use. This parameter points to
+a character string which specifies a connect string or a service point. If the
+connect string is NULL, then this call attaches to the default host. The length
+of connstr is specified in connstr_len. The connstr pointer may be freed by the
+caller on return.
+dblink_len (IN) - the length of the string pointed to by connstr. For a valid
+connect string name or alias, connstr_len must be non-zero.
+mode (IN) - specifies the various modes of operation. For release 8.0, pass as
+OCI_DEFAULT - in this mode, calls made to the server on this server context
+are made in blocking mode.
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing
+the use of OCIServerAttach().
+Related Functions
+OCIServerDetach()
+
+
+
+OCIServerDetach()
+Name
+OCI DeTaCH server
+Purpose
+Deletes an access to a data source for OCI operations.
+Syntax
+sword OCIServerDetach ( OCIServer *svrhp,
+ OCIError *errhp,
+ ub4 mode);
+Comments
+This call deletes an access to data source for OCI operations, which was
+established by a call to OCIServerAttach().
+Parameters
+srvhp (IN) - a handle to an initialized server context, which gets reset to
+uninitialized state. The handle is not de-allocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+mode (IN) - specifies the various modes of operation. The only valid mode is
+OCI_DEFAULT for the default mode.
+Related Functions
+OCIServerAttach()
+
+
+
+OCIServerVersion()
+Name
+OCI VERSion
+Purpose
+Returns the version string of the Oracle server.
+Syntax
+sword OCIServerVersion ( dvoid *hndlp,
+ OCIError *errhp,
+ OraText *bufp,
+ ub4 bufsz
+ ub1 hndltype );
+Comments
+This call returns the version string of the Oracle server.
+For example, the following might be returned as the version string if your
+application is running against a 7.3.2 server:
+Oracle7 Server Release 7.3.2.0.0 - Production Release
+PL/SQL Release 2.3.2.0.0 - Production
+CORE Version 3.5.2.0.0 - Production
+TNS for SEQUENT DYNIX/ptx: Version 2.3.2.0.0 - Production
+NLSRTL Version 3.2.2.0.0 - Production
+
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+bufp (IN) - the buffer in which the version information is returned.
+bufsz (IN) - the length of the buffer.
+hndltype (IN) - the type of handle passed to the function.
+Related Functions
+
+
+
+
+
+OCISessionBegin()
+Name
+OCI Session Begin and authenticate user
+Purpose
+Creates a user authentication and begins a user session for a given server.
+Syntax
+sword OCISessionBegin ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCISession *usrhp,
+ ub4 credt,
+ ub4 mode);
+
+Comments
+For Oracle8, OCISessionBegin() must be called for any given server handle
+before requests can be made against it. Also, OCISessionBegin() only supports
+authenticating the user for access to the Oracle server specified by the
+server handle in the service context. In other words, after OCIServerAttach()
+is called to initialize a server handle, OCISessionBegin() must be called to
+authenticate the user for that given server.
+When OCISessionBegin() is called for the first time for the given server
+handle, the initialized authentication handle is called a primary
+authentication context. A primary authentication context may not be created
+with the OCI_MIGRATE mode. Also, only one primary authentication context can
+be created for a given server handle and the primary authentication context c
+an only ever be used with that server handle. If the primary authentication
+context is set in a service handle with a different server handle, then an
+error will result.
+After OCISessionBegin() has been called for the server handle, and the primary
+authentication context is set in the service handle, OCISessionBegin() may be
+called again to initialize another authentication handle with different (or
+the same) credentials. When OCISessionBegin() is called with a service handle
+set with a primary authentication context, the returned authentication context
+in authp is called a user authentication context. As many user authentication
+contexts may be initialized as desired.
+User authentication contexts may be created with the OCI_MIGRATE mode.
+If the OCI_MIGRATE mode is not specified, then the user authentication
+context can only ever be used with the same server handle set in svchp. If
+OCI_MIGRATE mode is specified, then the user authentication may be set
+with different server handles. However, the user authentication context is
+restricted to use with only server handles which resolve to the same database
+instance and that have equivalent primary authentication contexts. Equivalent
+authentication contexts are those which were authenticated as the same
+database user.
+OCI_SYSDBA, OCI_SYSOPER, and OCI_PRELIM_AUTH may only be used
+with a primary authentication context.
+To provide credentials for a call to OCISessionBegin(), one of two methods are
+supported. The first is to provide a valid username and password pair for
+database authentication in the user authentication handle passed to
+OCISessionBegin(). This involves using OCIAttrSet() to set the
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD attributes on the
+authentication handle. Then OCISessionBegin() is called with
+OCI_CRED_RDBMS.
+Note: When the authentication handle is terminated using
+OCISessionEnd(), the username and password attributes remain
+unchanged and thus can be re-used in a future call to OCISessionBegin().
+Otherwise, they must be reset to new values before the next
+OCISessionBegin() call.
+The second type of credentials supported are external credentials. No
+attributes need to be set on the authentication handle before calling
+OCISessionBegin(). The credential type is OCI_CRED_EXT. This is equivalent
+to the Oracle7 `connect /' syntax. If values have been set for
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD, then these are
+ignored if OCI_CRED_EXT is used.
+Parameters
+svchp (IN) - a handle to a service context. There must be a valid server
+handle set in svchp.
+errhp (IN) - an error handle to the retrieve diagnostic information.
+usrhp (IN/OUT) - a handle to an authentication context, which is initialized
+by this call.
+credt (IN) - specifies the type of credentials to use for authentication.
+Valid values for credt are:
+OCI_CRED_RDBMS - authenticate using a database username and
+password pair as credentials. The attributes OCI_ATTR_USERNAME
+and OCI_ATTR_PASSWORD should be set on the authentication
+context before this call.
+OCI_CRED_EXT - authenticate using external credentials. No username
+or password is provided.
+mode (IN) - specifies the various modes of operation. Valid modes are:
+OCI_DEFAULT - in this mode, the authentication context returned may
+only ever be set with the same server context specified in svchp. This
+establishes the primary authentication context.
+OCI_MIGRATE - in this mode, the new authentication context may be
+set in a service handle with a different server handle. This mode
+establishes the user authentication context.
+OCI_SYSDBA - in this mode, the user is authenticated for SYSDBA
+access.
+OCI_SYSOPER - in this mode, the user is authenticated for SYSOPER
+access.
+OCI_PRELIM_AUTH - this mode may only be used with OCI_SYSDBA
+or OCI_SYSOPER to authenticate for certain administration tasks.
+Related Functions
+OCISessionEnd()
+
+
+
+
+
+
+OCISessionEnd()
+Name
+OCI Terminate user Authentication Context
+Purpose
+Terminates a user authentication context created by OCISessionBegin()
+Syntax
+sword OCISessionEnd ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCISession *usrhp,
+ ub4 mode);
+
+Comments
+The user security context associated with the service context is invalidated
+by this call. Storage for the authentication context is not freed. The
+transaction specified by the service context is implicitly committed. The
+transaction handle, if explicitly allocated, may be freed if not being used.
+Resources allocated on the server for this user are freed.
+The authentication handle may be reused in a new call to OCISessionBegin().
+Parameters
+svchp (IN/OUT) - the service context handle. There must be a valid server
+handle and user authentication handle associated with svchp.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+usrhp (IN) - de-authenticate this user. If this parameter is passed as NULL, the
+user in the service context handle is de-authenticated.
+mode (IN) - the only valid mode is OCI_DEFAULT.
+Example
+In this example, an authentication context is destroyed.
+Related Functions
+OCISessionBegin()
+
+
+
+
+OCIStmtExecute()
+Name
+OCI EXECute
+Purpose
+This call associates an application request with a server.
+Syntax
+sword OCIStmtExecute ( OCISvcCtx *svchp,
+ OCIStmt *stmtp,
+ OCIError *errhp,
+ ub4 iters,
+ ub4 rowoff,
+ CONST OCISnapshot *snap_in,
+ OCISnapshot *snap_out,
+ ub4 mode );
+Comments
+This function is used to execute a prepared SQL statement.
+Using an execute call, the application associates a request with a server. On
+success, OCI_SUCCESS is returned.
+If a SELECT statement is executed, the description of the select list follows
+implicitly as a response. This description is buffered on the client side for
+describes, fetches and define type conversions. Hence it is optimal to
+describe a select list only after an execute.
+Also for SELECT statements, some results are available implicitly. Rows will
+be received and buffered at the end of the execute. For queries with small row
+count, a prefetch causes memory to be released in the server if the end of
+fetch is reached, an optimization that may result in memory usage reduction.
+Set attribute call has been defined to set the number of rows to be prefetched
+per result set.
+For SELECT statements, at the end of the execute, the statement handle
+implicitly maintains a reference to the service context on which it is
+executed. It is the user's responsibility to maintain the integrity of the
+service context. If the attributes of a service context is changed for
+executing some operations on this service context, the service context must
+be restored to have the same attributes, that a statement was executed with,
+prior to a fetch on the statement handle. The implicit reference is maintained
+until the statement handle is freed or the fetch is cancelled or an end of
+fetch condition is reached.
+Note: If output variables are defined for a SELECT statement before a
+call to OCIStmtExecute(), the number of rows specified by iters will be
+fetched directly into the defined output buffers and additional rows
+equivalent to the prefetch count will be prefetched. If there are no
+additional rows, then the fetch is complete without calling
+OCIStmtFetch().
+The execute call will return errors if the statement has bind data types that
+are not supported in an Oracle7 server.
+Parameters
+svchp (IN/OUT) - service context handle.
+stmtp (IN/OUT) - an statement handle - defines the statement and the
+associated data to be executed at the server. It is invalid to pass in a
+statement handle that has bind of data types only supported in release 8.0
+when srvchp points to an Oracle7 server.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error. If the statement is being
+batched and it is successful, then this handle will contain this particular
+statement execution specific errors returned from the server when the batch is
+flushed.
+iters (IN) - the number of times this statement is executed for non-Select
+statements. For Select statements, if iters is non-zero, then defines must
+have been done for the statement handle. The execution fetches iters rows into
+these predefined buffers and prefetches more rows depending upon the prefetch
+row count. This function returns an error if iters=0 for non-SELECT
+statements.
+rowoff (IN) - the index from which the data in an array bind is relevant for
+this multiple row execution.
+snap_in (IN) - this parameter is optional. if supplied, must point to a
+snapshot descriptor of type OCI_DTYPE_SNAP. The contents of this descriptor
+must be obtained from the snap_out parameter of a previous call. The
+descriptor is ignored if the SQL is not a SELECT. This facility allows
+multiple service contexts to ORACLE to see the same consistent snapshot of the
+database's committed data. However, uncommitted data in one context is not
+visible to another context even using the same snapshot.
+snap_out (OUT) - this parameter optional. if supplied, must point to a
+descriptor of type OCI_DTYPE_SNAP. This descriptor is filled in with an
+opaque representation which is the current ORACLE "system change
+number" suitable as a snap_in input to a subsequent call to OCIStmtExecute().
+This descriptor should not be used any longer than necessary in order to avoid
+"snapshot too old" errors.
+mode (IN) - The modes are:
+If OCI_DEFAULT_MODE, the default mode, is selected, the request is
+immediately executed. Error handle contains diagnostics on error if any.
+OCI_EXACT_FETCH - if the statement is a SQL SELECT, this mode is
+only valid if the application has set the prefetch row count prior to this
+call. In this mode, the OCI library will get up to the number of rows
+specified (i.e., prefetch row count plus iters). If the number of rows
+returned by the query is greater than this value, OCI_ERROR will be
+returned with ORA-01422 as the implementation specific error in a
+diagnostic record. If the number of rows returned by the query is
+smaller than the prefetch row count, OCI_SUCCESS_WITH_INFO will
+be returned with ORA-01403 as the implementation specific error. The
+prefetch buffer size is ignored and the OCI library tries to allocate all the
+space required to contain the prefetched rows. The exact fetch semantics
+apply to only the top level rows. No more rows can be fetched for this
+query at the end of the call.
+OCI_KEEP_FETCH_STATE - the result set rows (not yet fetched) of this
+statement executed in this transaction will be maintained when the
+transaction is detached for migration. By default, a query is cancelled
+when a transaction is detached for migration. This mode is the default
+mode when connected to a V7 server.
+Related Functions
+OCIStmtPrepare()
+
+
+
+
+
+OCIStmtFetch()
+Name
+OCI FetCH
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch ( OCIStmt *stmtp,
+ OCIError *errhp,
+ ub4 nrows,
+ ub2 orientation,
+ ub4 mode);
+Comments
+The fetch call is a local call, if prefetched rows suffice. However, this is
+transparent to the application. If LOB columns are being read, LOB locators
+are fetched for subsequent LOB operations to be performed on these locators.
+Prefetching is turned off if LONG columns are involved.
+A fetch with nrows set to 0 rows effectively cancels the fetch for this
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+orientation (IN) - for release 8.0, the only acceptable value is
+OCI_FETCH_NEXT, which is also the default value.
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set.
+If nrows is non-zero, setting this mode effectively cancels fetching after
+retrieving nrows, otherwise it cancels fetching immediately.
+Related Functions
+OCIAttrGet()
+
+OCIStmtFetch2()
+Name
+OCI FetCH2
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch2 ( OCIStmt *stmtp,
+ OCIError *errhp,
+ ub4 nrows,
+ ub2 orientation,
+ ub4 scrollOffset,
+ ub4 mode);
+Comments
+The fetch call works similar to the OCIStmtFetch call with the
+addition of the fetchOffset parameter. It can be used on any
+statement handle, whether it is scrollable or not. For a
+non-scrollable statement handle, the only acceptable value
+will be OCI_FETCH_NEXT, and the fetchOffset parameter will be
+ignored. Applications are encouraged to use this new call.
+
+A fetchOffset with OCI_FETCH_RELATIVE is equivalent to
+OCI_FETCH_CURRENT with a value of 0, is equivalent to
+OCI_FETCH_NEXT with a value of 1, and equivalent to
+OCI_FETCH_PRIOR with a value of -1. Note that the range of
+accessible rows is [1,OCI_ATTR_ROW_COUNT] beyond which an
+error could be raised if sufficient rows do not exist in
+
+The fetch call is a local call, if prefetched rows suffice. However, this is
+transparent to the application. If LOB columns are being read, LOB locators
+are fetched for subsequent LOB operations to be performed on these locators.
+Prefetching is turned off if LONG columns are involved.
+A fetch with nrows set to 0 rows effectively cancels the fetch for this
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+It defaults to 1 for orientation OCI_FETCH_LAST.
+orientation (IN) - The acceptable values are as follows, with
+OCI_FETCH_NEXT being the default value.
+OCI_FETCH_CURRENT gets the current row,
+OCI_FETCH_NEXT gets the next row from the current position,
+OCI_FETCH_FIRST gets the first row in the result set,
+OCI_FETCH_LAST gets the last row in the result set,
+OCI_FETCH_PRIOR gets the previous row from the current row in the result set,
+OCI_FETCH_ABSOLUTE will fetch the row number (specified by fetchOffset
+parameter) in the result set using absolute positioning,
+OCI_FETCH_RELATIVE will fetch the row number (specified by fetchOffset
+parameter) in the result set using relative positioning.
+scrollOffset(IN) - offset used with the OCI_FETCH_ABSOLUTE and
+OCI_FETCH_RELATIVE orientation parameters only. It specify
+the new current position for scrollable result set. It is
+ignored for non-scrollable result sets.
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set.
+If nrows is non-zero, setting this mode effectively cancels fetching after
+retrieving nrows, otherwise it cancels fetching immediately.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIStmtGetPieceInfo()
+Name
+OCI Get Piece Information
+Purpose
+Returns piece information for a piecewise operation.
+Syntax
+sword OCIStmtGetPieceInfo( CONST OCIStmt *stmtp,
+ OCIError *errhp,
+ dvoid **hndlpp,
+ ub4 *typep,
+ ub1 *in_outp,
+ ub4 *iterp,
+ ub4 *idxp,
+ ub1 *piecep );
+
+Comments
+When an execute/fetch call returns OCI_NEED_DATA to get/return a
+dynamic bind/define value or piece, OCIStmtGetPieceInfo() returns the
+relevant information: bind/define handle, iteration or index number and
+which piece.
+See the section "Runtime Data Allocation and Piecewise Operations" on page
+5-16 for more information about using OCIStmtGetPieceInfo().
+Parameters
+stmtp (IN) - the statement when executed returned OCI_NEED_DATA.
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+hndlpp (OUT) - returns a pointer to the bind or define handle of the bind or
+define whose runtime data is required or is being provided.
+typep (OUT) - the type of the handle pointed to by hndlpp: OCI_HTYPE_BIND
+(for a bind handle) or OCI_HTYPE_DEFINE (for a define handle).
+in_outp (OUT) - returns OCI_PARAM_IN if the data is required for an IN bind
+value. Returns OCI_PARAM_OUT if the data is available as an OUT bind
+variable or a define position value.
+iterp (OUT) - returns the row number of a multiple row operation.
+idxp (OUT) - the index of an array element of a PL/SQL array bind operation.
+piecep (OUT) - returns one of the following defined values -
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE and
+OCI_LAST_PIECE. The default value is always OCI_ONE_PIECE.
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(),
+OCIStmtSetPieceInfo()
+
+
+
+
+OCIStmtPrepare()
+Name
+OCI Statement REQuest
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare ( OCIStmt *stmtp,
+ OCIError *errhp,
+ CONST OraText *stmt,
+ ub4 stmt_len,
+ ub4 language,
+ ub4 mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The
+OCIStmtPrepare() call defines an application request.
+This is a purely local call. Data values for this statement initialized in
+subsequent bind calls will be stored in a bind handle which will hang off this
+statement handle.
+This call does not create an association between this statement handle and any
+particular server.
+See the section "Preparing Statements" on page 2-21 for more information
+about using this call.
+Parameters
+stmtp (IN) - a statement handle.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-
+terminated string. The pointer to the OraText of the statement must be available
+as long as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server.
+mode (IN) - the only defined mode is OCI_DEFAULT for default mode.
+Example
+This example demonstrates the use of OCIStmtPrepare(), as well as the OCI
+application initialization calls.
+Related Functions
+OCIAttrGet(), OCIStmtExecute()
+
+
+OCIStmtPrepare2()
+Name
+OCI Statement REQuest with (a) early binding to svchp and/or
+(b) stmt caching
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare2 ( OCISvcCtx *svchp,
+ OCIStmt **stmtp,
+ OCIError *errhp,
+ CONST OraText *stmt,
+ ub4 stmt_len,
+ CONST OraText *key,
+ ub4 key_len,
+ ub4 language,
+ ub4 mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The
+OCIStmtPrepare() call defines an application request.
+This is a purely local call. Data values for this statement initialized in
+subsequent bind calls will be stored in a bind handle which will hang off this
+statement handle.
+This call creates an association between the statement handle and a service
+context. It differs from OCIStmtPrepare in that respect.It also supports
+stmt caching. The stmt will automatically be cached if the authp of the stmt
+has enabled stmt caching.
+Parameters
+svchp (IN) - the service context handle that contains the session that
+ this stmt handle belongs to.
+stmtp (OUT) - an unallocated stmt handle must be pased in. An allocated
+ and prepared statement handle will be returned.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-
+ terminated string. The pointer to the OraText of the statement
+ must be available as long as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+ key to search with. It thus optimizes the search in the cache.
+key_len (IN) - the length of the key. This, too, is onlly valid for stmt
+ caching.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server.
+mode (IN) - the defined modes are OCI_DEFAULT and OCI_PREP2_CACHE_SEARCHONLY.
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtRelease()
+
+
+OCIStmtRelease()
+Name
+OCI Statement Release. This call is used to relesae the stmt that
+was retreived using OCIStmtPrepare2(). If the stmt is release
+using this call, OCIHandleFree() must not be called on the stmt
+handle.
+Purpose
+This call releases the statement obtained by OCIStmtPrepare2
+Syntax
+sword OCIStmtRelease ( OCIStmt *stmtp,
+ OCIError *errhp,
+ cONST OraText *key,
+ ub4 key_len,
+ ub4 mode);
+Comments
+This call is used to release a handle obtained via OCIStmtPrepare2().
+It also frees the memory associated with the handle.
+This is a purely local call.
+Parameters
+stmtp (IN/OUT) - The statement handle to be released/freed.
+errhp (IN) - an error handle to retrieve diagnostic information.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+ key to tag the stmt with.
+key_len (IN) - the length of the key. This, too, is only valid for stmt
+ caching.
+mode (IN) - the defined modes are OCI_DEFAULT for default mode and
+ OCI_STRLS_CACHE_DELETE (only used for Stmt Caching).
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtPrepare2()
+
+
+OCIStmtSetPieceInfo()
+Name
+OCI Set Piece Information
+Purpose
+Sets piece information for a piecewise operation.
+Syntax
+sword OCIStmtSetPieceInfo ( dvoid *hndlp,
+ ub4 type,
+ OCIError *errhp,
+ CONST dvoid *bufp,
+ ub4 *alenp,
+ ub1 piece,
+ CONST dvoid *indp,
+ ub2 *rcodep );
+Comments
+When an execute call returns OCI_NEED_DATA to get a dynamic IN/OUT
+bind value or piece, OCIStmtSetPieceInfo() sets the piece information: the
+buffer, the length, the indicator and which piece is currently being processed.
+For more information about using OCIStmtSetPieceInfo() see the section
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+hndlp (IN/OUT) - the bind/define handle.
+type (IN) - type of the handle.
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+bufp (IN/OUT) - bufp is a pointer to a storage containing the data value or
+the piece when it is an IN bind variable, otherwise bufp is a pointer to
+storage for getting a piece or a value for OUT binds and define variables. For
+named data types or REFs, a pointer to the object or REF is returned.
+alenp (IN/OUT) - the length of the piece or the value.
+piece (IN) - the piece parameter. The following are valid values:
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE, or
+OCI_LAST_PIECE.
+The default value is OCI_ONE_PIECE. This parameter is used for IN bind
+variables only.
+indp (IN/OUT) - indicator. A pointer to a sb2 value or pointer to an indicator
+structure for named data types (SQLT_NTY) and REFs (SQLT_REF), i.e., *indp
+is either an sb2 or a dvoid * depending upon the data type.
+rcodep (IN/OUT) - return code.
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(),
+OCIStmtGetPieceInfo()
+
+
+OCIFormatInit
+Name
+OCIFormat Package Initialize
+Purpose
+Initializes the OCIFormat package.
+Syntax
+sword OCIFormatInit(dvoid *hndl, OCIError *err);
+Comments
+This routine must be called before calling any other OCIFormat routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatTerm()
+
+
+OCIFormatString
+Name
+OCIFormat Package Format String
+Purpose
+Writes a text string into the supplied text buffer using the argument
+list submitted to it and in accordance with the format string given.
+Syntax
+sword OCIFormatString(dvoid *hndl, OCIError *err, OraText *buffer,
+ sbig_ora bufferLength, sbig_ora *returnLength,
+ CONST OraText *formatString, ...);
+Comments
+The first call to this routine must be preceded by a call to the
+OCIFormatInit routine that initializes the OCIFormat package
+for use. When this routine is no longer needed then terminate
+the OCIFormat package by a call to the OCIFormatTerm routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+buffer (OUT) - text buffer for the string
+bufferLength (IN) - length of the text buffer
+returnLength (OUT) - length of the formatted string
+formatString (IN) - format specification string
+... (IN) - variable argument list
+Related Functions
+
+
+OCIFormatTerm
+Name
+OCIFormat Package Terminate
+Purpose
+Terminates the OCIFormat package.
+Syntax
+sword OCIFormatTerm(dvoid *hndl, OCIError *err);
+Comments
+It must be called after the OCIFormat package is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatInit()
+
+
+OCIFormatTUb1
+Name
+OCIFormat Package ub1 Type
+Purpose
+Return the type value for the ub1 type.
+Syntax
+sword OCIFormatTUb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb2
+Name
+OCIFormat Package ub2 Type
+Purpose
+Return the type value for the ub2 type.
+Syntax
+sword OCIFormatTUb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb4
+Name
+OCIFormat Package ub4 Type
+Purpose
+Return the type value for the ub4 type.
+Syntax
+sword OCIFormatTUb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUword
+Name
+OCIFormat Package uword Type
+Purpose
+Return the type value for the uword type.
+Syntax
+sword OCIFormatTUword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUbig_ora
+Name
+OCIFormat Package ubig_ora Type
+Purpose
+Return the type value for the ubig_ora type.
+Syntax
+sword OCIFormatTUbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb1
+Name
+OCIFormat Package sb1 Type
+Purpose
+Return the type value for the sb1 type.
+Syntax
+sword OCIFormatTSb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb2
+Name
+OCIFormat Package sb2 Type
+Purpose
+Return the type value for the sb2 type.
+Syntax
+sword OCIFormatTSb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb4
+Name
+OCIFormat Package sb4 Type
+Purpose
+Return the type value for the sb4 type.
+Syntax
+sword OCIFormatTSb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSword
+Name
+OCIFormat Package sword Type
+Purpose
+Return the type value for the sword type.
+Syntax
+sword OCIFormatTSword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSbig_ora
+Name
+OCIFormat Package sbig_ora Type
+Purpose
+Return the type value for the sbig_ora type.
+Syntax
+sword OCIFormatTSbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb1
+Name
+OCIFormat Package eb1 Type
+Purpose
+Return the type value for the eb1 type.
+Syntax
+sword OCIFormatTEb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb2
+Name
+OCIFormat Package eb2 Type
+Purpose
+Return the type value for the eb2 type.
+Syntax
+sword OCIFormatTEb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb4
+Name
+OCIFormat Package eb4 Type
+Purpose
+Return the type value for the eb4 type.
+Syntax
+sword OCIFormatTEb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEword
+Name
+OCIFormat Package eword Type
+Purpose
+Return the type value for the eword type.
+Syntax
+sword OCIFormatTEword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTChar
+Name
+OCIFormat Package text Type
+Purpose
+Return the type value for the text type.
+Syntax
+sword OCIFormatTChar(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTText
+Name
+OCIFormat Package *text Type
+Purpose
+Return the type value for the *text type.
+Syntax
+sword OCIFormatTText(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTDouble
+Name
+OCIFormat Package double Type
+Purpose
+Return the type value for the double type.
+Syntax
+sword OCIFormatTDouble(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatDvoid
+Name
+OCIFormat Package dvoid Type
+Purpose
+Return the type value for the dvoid type.
+Syntax
+sword OCIFormatTDvoid(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEnd
+Name
+OCIFormat Package end Type
+Purpose
+Return the list terminator's "type".
+Syntax
+sword OCIFormatTEnd(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCISvcCtxToLda()
+Name
+OCI toggle SerVice context handle to Version 7 Lda_Def
+Purpose
+Toggles between a V8 service context handle and a V7 Lda_Def.
+Syntax
+sword OCISvcCtxToLda ( OCISvcCtx *srvhp,
+ OCIError *errhp,
+ Lda_Def *ldap );
+Comments
+Toggles between an Oracle8 service context handle and an Oracle7 Lda_Def.
+This function can only be called after a service context has been properly
+initialized.
+Once the service context has been translated to an Lda_Def, it can be used in
+release 7.x OCI calls (e.g., obindps(), ofen()).
+Note: If there are multiple service contexts which share the same server
+handle, only one can be in V7 mode at any time.
+The action of this call can be reversed by passing the resulting Lda_Def to
+the OCILdaToSvcCtx() function.
+Parameters
+svchp (IN/OUT) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+ldap (IN/OUT) - a Logon Data Area for V7-style OCI calls which is initialized
+by this call.
+Related Functions
+OCILdaToSvcCtx()
+
+
+
+
+OCITransCommit()
+Name
+OCI TX (transaction) CoMmit
+Purpose
+Commits the transaction associated with a specified service context.
+Syntax
+sword OCITransCommit ( OCISvcCtx *srvcp,
+ OCIError *errhp,
+ ub4 flags );
+Comments
+The transaction currently associated with the service context is committed. If
+it is a distributed transaction that the server cannot commit, this call
+additionally retrieves the state of the transaction from the database to be
+returned to the user in the error handle.
+If the application has defined multiple transactions, this function operates
+on the transaction currently associated with the service context. If the
+application is working with only the implicit local transaction created when
+database changes are made, that implicit transaction is committed.
+If the application is running in the object mode, then the modified or updated
+objects in the object cache for this transaction are also committed.
+The flags parameter is used for one-phase commit optimization in distributed
+transactions. If the transaction is non-distributed, the flags parameter is
+ignored, and OCI_DEFAULT can be passed as its value. OCI applications
+managing global transactions should pass a value of
+OCI_TRANS_TWOPHASE to the flags parameter for a two-phase commit. The
+default is one-phase commit.
+Under normal circumstances, OCITransCommit() returns with a status
+indicating that the transaction has either been committed or rolled back. With
+distributed transactions, it is possible that the transaction is now in-doubt
+(i.e., neither committed nor aborted). In this case, OCITransCommit()
+attempts to retrieve the status of the transaction from the server.
+The status is returned.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags -see the "Comments" section above.
+Related Functions
+OCITransRollback()
+
+
+
+
+OCITransDetach()
+Name
+OCI TX (transaction) DeTach
+Purpose
+Detaches a transaction.
+Syntax
+sword OCITransDetach ( OCISvcCtx *srvcp,
+ OCIError *errhp,
+ ub4 flags);
+Comments
+Detaches a global transaction from the service context handle. The transaction
+currently attached to the service context handle becomes inactive at the end
+of this call. The transaction may be resumed later by calling OCITransStart(),
+specifying a flags value of OCI_TRANS_RESUME.
+When a transaction is detached, the value which was specified in the timeout
+parameter of OCITransStart() when the transaction was started is used to
+determine the amount of time the branch can remain inactive before being
+deleted by the server's PMON process.
+Note: The transaction can be resumed by a different process than the one
+that detached it, provided that the transaction has the same
+authorization.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags (IN) - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransStart()
+
+
+
+OCITransForget()
+Name
+OCI TX (transaction) ForGeT
+Purpose
+Causes the server to forget a heuristically completed global transaction.
+Syntax
+sword OCITransForget ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ ub4 flags);
+
+Comments
+
+Forgets a heuristically completed global transaction. The server deletes the
+status of the transaction from the system's pending transaction table.
+The XID of the transaction to be forgotten is set as an attribute of the
+transaction handle (OCI_ATTR_XID).
+Parameters
+srvcp (IN) - the service context handle - the transaction is rolled back.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransRollback()
+
+
+OCITransMultiPrepare()
+Name
+OCI Trans(action) Multi-Branch Prepare
+Purpose
+Prepares a transaction with multiple branches in a single call.
+Syntax
+sword OCITransMultiPrepare ( OCISvcCtx *svchp,
+ ub4 numBranches,
+ OCITrans **txns,
+ OCIError **errhp);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+This call is an advanced performance feature intended for use only in
+situations where the caller is responsible for preparing all the branches
+in a transaction.
+Parameters
+srvcp (IN) - the service context handle.
+numBranches (IN) - This is the number of branches expected. It is also the
+array size for the next two parameters.
+txns (IN) - This is the array of transaction handles for the branches to
+prepare. They should all have the OCI_ATTR_XID set. The global transaction
+ID should be the same.
+errhp (IN) - This is the array of error handles. If OCI_SUCCESS is not
+returned, then these will indicate which branches received which errors.
+Related Functions
+OCITransPrepare()
+
+
+OCITransPrepare()
+Name
+OCI TX (transaction) PREpare
+Purpose
+Prepares a transaction for commit.
+Syntax
+sword OCITransPrepare ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ ub4 flags);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+The call returns OCI_SUCCESS_WITH_INFO if the transaction has not made
+any changes. The error handle will indicate that the transaction is read-only.
+The flag parameter is not currently used.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransForget()
+
+
+
+
+OCITransRollback()
+Name
+OCI TX (transaction) RoLlback
+Purpose
+Rolls back the current transaction.
+Syntax
+sword OCITransRollback ( dvoid *svchp,
+ OCIError *errhp,
+ ub4 flags );
+Comments
+The current transaction- defined as the set of statements executed since the
+last OCITransCommit() or since OCISessionBegin()-is rolled back.
+If the application is running under object mode then the modified or updated
+objects in the object cache for this transaction are also rolled back.
+An error is returned if an attempt is made to roll back a global transaction
+that is not currently active.
+Parameters
+svchp (IN) - a service context handle. The transaction currently set in the
+service context handle is rolled back.
+errhp -(IN) - an error handle which can be passed to OCIErrorGet() for
+diagnostic information in the event of an error.
+flags - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit()
+
+
+
+
+OCITransStart()
+Name
+OCI TX (transaction) STart
+Purpose
+Sets the beginning of a transaction.
+Syntax
+sword OCITransStart ( OCISvcCtx *svchp,
+ OCIError *errhp,
+ uword timeout,
+ ub4 flags);
+
+Comments
+This function sets the beginning of a global or serializable transaction. The
+transaction context currently associated with the service context handle is
+initialized at the end of the call if the flags parameter specifies that a new
+transaction should be started.
+The XID of the transaction is set as an attribute of the transaction handle
+(OCI_ATTR_XID)
+Parameters
+svchp (IN/OUT) - the service context handle. The transaction context in the
+service context handle is initialized at the end of the call if the flag
+specified a new transaction to be started.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded in
+err and this function returns OCI_ERROR. Diagnostic information can be
+obtained by calling OCIErrorGet().
+timeout (IN) - the time, in seconds, to wait for a transaction to become
+available for resumption when OCI_TRANS_RESUME is specified. When
+OCI_TRANS_NEW is specified, this value is stored and may be used later by
+OCITransDetach().
+flags (IN) - specifies whether a new transaction is being started or an
+existing transaction is being resumed. Also specifies serializiability or
+read-only status. More than a single value can be specified. By default,
+a read/write transaction is started. The flag values are:
+OCI_TRANS_NEW - starts a new transaction branch. By default starts a
+tightly coupled and migratable branch.
+OCI_TRANS_TIGHT - explicitly specifies a tightly coupled branch
+OCI_TRANS_LOOSE - specifies a loosely coupled branch
+OCI_TRANS_RESUME - resumes an existing transaction branch.
+OCI_TRANS_READONLY - start a readonly transaction
+OCI_TRANS_SERIALIZABLE - start a serializable transaction
+Related Functions
+OCITransDetach()
+
+
+
+
+
+******************************************************************************/
+/*-----------------------Dynamic Callback Function Pointers------------------*/
+
+
+typedef sb4 (*OCICallbackInBind)(dvoid *ictxp, OCIBind *bindp, ub4 iter,
+ ub4 index, dvoid **bufpp, ub4 *alenp,
+ ub1 *piecep, dvoid **indp);
+
+typedef sb4 (*OCICallbackOutBind)(dvoid *octxp, OCIBind *bindp, ub4 iter,
+ ub4 index, dvoid **bufpp, ub4 **alenp,
+ ub1 *piecep, dvoid **indp,
+ ub2 **rcodep);
+
+typedef sb4 (*OCICallbackDefine)(dvoid *octxp, OCIDefine *defnp, ub4 iter,
+ dvoid **bufpp, ub4 **alenp, ub1 *piecep,
+ dvoid **indp, ub2 **rcodep);
+
+typedef sword (*OCIUserCallback)(dvoid *ctxp, dvoid *hndlp, ub4 type,
+ ub4 fcode, ub4 when, sword returnCode,
+ sb4 *errnop, va_list arglist);
+
+typedef sword (*OCIEnvCallbackType)(OCIEnv *env, ub4 mode,
+ size_t xtramem_sz, dvoid *usrmemp,
+ OCIUcb *ucbDesc);
+
+typedef sb4 (*OCICallbackLobRead)(dvoid *ctxp, CONST dvoid *bufp,
+ ub4 len, ub1 piece);
+
+typedef sb4 (*OCICallbackLobWrite)(dvoid *ctxp, dvoid *bufp,
+ ub4 *lenp, ub1 *piece);
+
+/*--------------------------Failover Callback Structure ---------------------*/
+typedef sb4 (*OCICallbackFailover)(dvoid *svcctx, dvoid *envctx,
+ dvoid *fo_ctx, ub4 fo_type,
+ ub4 fo_event);
+
+typedef struct
+{
+ OCICallbackFailover callback_function;
+ dvoid *fo_ctx;
+}
+OCIFocbkStruct;
+
+/*****************************************************************************
+ ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+
+sword OCIInitialize (ub4 mode, dvoid *ctxp,
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr) );
+
+sword OCITerminate( ub4 mode);
+
+sword OCIEnvCreate (OCIEnv **envp, ub4 mode, dvoid *ctxp,
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+ size_t xtramem_sz, dvoid **usrmempp);
+
+sword OCIEnvNlsCreate (OCIEnv **envp, ub4 mode, dvoid *ctxp,
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+ size_t xtramem_sz, dvoid **usrmempp,
+ ub2 charset, ub2 ncharset);
+
+sword OCIFEnvCreate (OCIEnv **envp, ub4 mode, dvoid *ctxp,
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+ size_t xtramem_sz, dvoid **usrmempp, dvoid *fupg);
+
+sword OCIHandleAlloc(CONST dvoid *parenth, dvoid **hndlpp, CONST ub4 type,
+ CONST size_t xtramem_sz, dvoid **usrmempp);
+
+sword OCIHandleFree(dvoid *hndlp, CONST ub4 type);
+
+
+sword OCIDescriptorAlloc(CONST dvoid *parenth, dvoid **descpp,
+ CONST ub4 type, CONST size_t xtramem_sz,
+ dvoid **usrmempp);
+
+sword OCIDescriptorFree(dvoid *descp, CONST ub4 type);
+
+sword OCIEnvInit (OCIEnv **envp, ub4 mode,
+ size_t xtramem_sz, dvoid **usrmempp);
+
+sword OCIServerAttach (OCIServer *srvhp, OCIError *errhp,
+ CONST OraText *dblink, sb4 dblink_len, ub4 mode);
+
+sword OCIServerDetach (OCIServer *srvhp, OCIError *errhp, ub4 mode);
+
+sword OCISessionBegin (OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp,
+ ub4 credt, ub4 mode);
+
+sword OCISessionEnd (OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp,
+ ub4 mode);
+
+sword OCILogon (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+ CONST OraText *username, ub4 uname_len,
+ CONST OraText *password, ub4 passwd_len,
+ CONST OraText *dbname, ub4 dbname_len);
+
+sword OCILogon2 (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+ CONST OraText *username, ub4 uname_len,
+ CONST OraText *password, ub4 passwd_len,
+ CONST OraText *dbname, ub4 dbname_len,
+ ub4 mode);
+
+sword OCILogoff (OCISvcCtx *svchp, OCIError *errhp);
+
+
+sword OCIPasswordChange (OCISvcCtx *svchp, OCIError *errhp,
+ CONST OraText *user_name, ub4 usernm_len,
+ CONST OraText *opasswd, ub4 opasswd_len,
+ CONST OraText *npasswd, ub4 npasswd_len, ub4 mode);
+
+sword OCIStmtPrepare (OCIStmt *stmtp, OCIError *errhp, CONST OraText *stmt,
+ ub4 stmt_len, ub4 language, ub4 mode);
+
+sword OCIStmtPrepare2 ( OCISvcCtx *svchp, OCIStmt **stmtp, OCIError *errhp,
+ CONST OraText *stmt, ub4 stmt_len, CONST OraText *key,
+ ub4 key_len, ub4 language, ub4 mode);
+
+sword OCIStmtRelease ( OCIStmt *stmtp, OCIError *errhp, CONST OraText *key,
+ ub4 key_len, ub4 mode);
+
+sword OCIBindByPos (OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+ ub4 position, dvoid *valuep, sb4 value_sz,
+ ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+ ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword OCIBindByName (OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+ CONST OraText *placeholder, sb4 placeh_len,
+ dvoid *valuep, sb4 value_sz, ub2 dty,
+ dvoid *indp, ub2 *alenp, ub2 *rcodep,
+ ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword OCIBindObject (OCIBind *bindp, OCIError *errhp, CONST OCIType *type,
+ dvoid **pgvpp, ub4 *pvszsp, dvoid **indpp,
+ ub4 *indszp);
+
+sword OCIBindDynamic (OCIBind *bindp, OCIError *errhp, dvoid *ictxp,
+ OCICallbackInBind icbfp, dvoid *octxp,
+ OCICallbackOutBind ocbfp);
+
+sword OCIBindArrayOfStruct (OCIBind *bindp, OCIError *errhp,
+ ub4 pvskip, ub4 indskip,
+ ub4 alskip, ub4 rcskip);
+
+sword OCIStmtGetPieceInfo (OCIStmt *stmtp, OCIError *errhp,
+ dvoid **hndlpp, ub4 *typep,
+ ub1 *in_outp, ub4 *iterp, ub4 *idxp,
+ ub1 *piecep);
+
+sword OCIStmtSetPieceInfo (dvoid *hndlp, ub4 type, OCIError *errhp,
+ CONST dvoid *bufp, ub4 *alenp, ub1 piece,
+ CONST dvoid *indp, ub2 *rcodep);
+
+sword OCIStmtExecute (OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp,
+ ub4 iters, ub4 rowoff, CONST OCISnapshot *snap_in,
+ OCISnapshot *snap_out, ub4 mode);
+
+sword OCIDefineByPos (OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
+ ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+ dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode);
+
+sword OCIDefineObject (OCIDefine *defnp, OCIError *errhp,
+ CONST OCIType *type, dvoid **pgvpp,
+ ub4 *pvszsp, dvoid **indpp, ub4 *indszp);
+
+sword OCIDefineDynamic (OCIDefine *defnp, OCIError *errhp, dvoid *octxp,
+ OCICallbackDefine ocbfp);
+
+sword OCIDefineArrayOfStruct (OCIDefine *defnp, OCIError *errhp, ub4 pvskip,
+ ub4 indskip, ub4 rlskip, ub4 rcskip);
+
+sword OCIStmtFetch (OCIStmt *stmtp, OCIError *errhp, ub4 nrows,
+ ub2 orientation, ub4 mode);
+
+sword OCIStmtFetch2 (OCIStmt *stmtp, OCIError *errhp, ub4 nrows,
+ ub2 orientation, sb4 scrollOffset, ub4 mode);
+
+sword OCIStmtGetBindInfo (OCIStmt *stmtp, OCIError *errhp, ub4 size,
+ ub4 startloc,
+ sb4 *found, OraText *bvnp[], ub1 bvnl[],
+ OraText *invp[], ub1 inpl[], ub1 dupl[],
+ OCIBind *hndl[]);
+
+sword OCIDescribeAny (OCISvcCtx *svchp, OCIError *errhp,
+ dvoid *objptr,
+ ub4 objnm_len, ub1 objptr_typ, ub1 info_level,
+ ub1 objtyp, OCIDescribe *dschp);
+
+sword OCIParamGet (CONST dvoid *hndlp, ub4 htype, OCIError *errhp,
+ dvoid **parmdpp, ub4 pos);
+
+sword OCIParamSet(dvoid *hdlp, ub4 htyp, OCIError *errhp, CONST dvoid *dscp,
+ ub4 dtyp, ub4 pos);
+
+sword OCITransStart (OCISvcCtx *svchp, OCIError *errhp,
+ uword timeout, ub4 flags );
+
+sword OCITransDetach (OCISvcCtx *svchp, OCIError *errhp, ub4 flags );
+
+sword OCITransCommit (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword OCITransRollback (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword OCITransPrepare (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword OCITransMultiPrepare (OCISvcCtx *svchp, ub4 numBranches,
+ OCITrans **txns, OCIError **errhp);
+
+sword OCITransForget (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword OCIErrorGet (dvoid *hndlp, ub4 recordno, OraText *sqlstate,
+ sb4 *errcodep, OraText *bufp, ub4 bufsiz, ub4 type);
+
+sword OCILobAppend (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_locp);
+
+sword OCILobAssign (OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *src_locp,
+ OCILobLocator **dst_locpp);
+
+sword OCILobCharSetForm (OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *locp, ub1 *csfrm);
+
+sword OCILobCharSetId (OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *locp, ub2 *csid);
+
+sword OCILobCopy (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+ OCILobLocator *src_locp, ub4 amount, ub4 dst_offset,
+ ub4 src_offset);
+
+sword OCILobCreateTemporary(OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub2 csid,
+ ub1 csfrm,
+ ub1 lobtype,
+ boolean cache,
+ OCIDuration duration);
+
+
+sword OCILobClose( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp );
+
+
+sword OCILobDisableBuffering (OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+sword OCILobEnableBuffering (OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+sword OCILobErase (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+ ub4 *amount, ub4 offset);
+
+sword OCILobFileClose (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *filep);
+
+sword OCILobFileCloseAll (OCISvcCtx *svchp, OCIError *errhp);
+
+sword OCILobFileExists (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *filep,
+ boolean *flag);
+
+sword OCILobFileGetName (OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *filep,
+ OraText *dir_alias, ub2 *d_length,
+ OraText *filename, ub2 *f_length);
+
+sword OCILobFileIsOpen (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *filep,
+ boolean *flag);
+
+sword OCILobFileOpen (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *filep,
+ ub1 mode);
+
+sword OCILobFileSetName (OCIEnv *envhp, OCIError *errhp,
+ OCILobLocator **filepp,
+ CONST OraText *dir_alias, ub2 d_length,
+ CONST OraText *filename, ub2 f_length);
+
+sword OCILobFlushBuffer (OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 flag);
+
+sword OCILobFreeTemporary(OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp);
+
+sword OCILobGetChunkSize(OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *chunksizep);
+
+sword OCILobGetLength (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *locp,
+ ub4 *lenp);
+
+sword OCILobIsEqual (OCIEnv *envhp, CONST OCILobLocator *x,
+ CONST OCILobLocator *y,
+ boolean *is_equal);
+
+sword OCILobIsOpen( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ boolean *flag);
+
+sword OCILobIsTemporary(OCIEnv *envp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ boolean *is_temporary);
+
+sword OCILobLoadFromFile (OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *dst_locp,
+ OCILobLocator *src_filep,
+ ub4 amount, ub4 dst_offset,
+ ub4 src_offset);
+
+sword OCILobLocatorAssign (OCISvcCtx *svchp, OCIError *errhp,
+ CONST OCILobLocator *src_locp,
+ OCILobLocator **dst_locpp);
+
+
+sword OCILobLocatorIsInit (OCIEnv *envhp, OCIError *errhp,
+ CONST OCILobLocator *locp,
+ boolean *is_initialized);
+
+sword OCILobOpen( OCISvcCtx *svchp,
+ OCIError *errhp,
+ OCILobLocator *locp,
+ ub1 mode );
+
+sword OCILobRead (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+ ub4 *amtp, ub4 offset, dvoid *bufp, ub4 bufl,
+ dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp,
+ CONST dvoid *bufp,
+ ub4 len,
+ ub1 piece),
+ ub2 csid, ub1 csfrm);
+
+sword OCILobTrim (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+ ub4 newlen);
+
+sword OCILobWrite (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+ ub4 *amtp, ub4 offset, dvoid *bufp, ub4 buflen,
+ ub1 piece, dvoid *ctxp,
+ sb4 (*cbfp)(dvoid *ctxp,
+ dvoid *bufp,
+ ub4 *len,
+ ub1 *piece),
+ ub2 csid, ub1 csfrm);
+
+sword OCILobWriteAppend(OCISvcCtx *svchp, OCIError *errhp,
+ OCILobLocator *lobp, ub4 *amtp,
+ dvoid *bufp, ub4 bufl, ub1 piece, dvoid *ctxp,
+ sb4 (*cbfp)(dvoid *ctxp, dvoid *bufp, ub4 *len,
+ ub1 *piece),
+ ub2 csid, ub1 csfrm);
+
+sword OCIBreak (dvoid *hndlp, OCIError *errhp);
+
+sword OCIReset (dvoid *hndlp, OCIError *errhp);
+
+sword OCIServerVersion (dvoid *hndlp, OCIError *errhp, OraText *bufp,
+ ub4 bufsz,
+ ub1 hndltype);
+
+sword OCIServerRelease (dvoid *hndlp, OCIError *errhp, OraText *bufp,
+ ub4 bufsz,
+ ub1 hndltype, ub4 *version);
+
+sword OCIAttrGet (CONST dvoid *trgthndlp, ub4 trghndltyp,
+ dvoid *attributep, ub4 *sizep, ub4 attrtype,
+ OCIError *errhp);
+
+sword OCIAttrSet (dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep,
+ ub4 size, ub4 attrtype, OCIError *errhp);
+
+sword OCISvcCtxToLda (OCISvcCtx *svchp, OCIError *errhp, Lda_Def *ldap);
+
+sword OCILdaToSvcCtx (OCISvcCtx **svchpp, OCIError *errhp, Lda_Def *ldap);
+
+sword OCIResultSetToStmt (OCIResult *rsetdp, OCIError *errhp);
+
+sword OCIFileClose ( dvoid *hndl, OCIError *err, OCIFileObject *filep );
+
+sword OCIUserCallbackRegister(dvoid *hndlp, ub4 type, dvoid *ehndlp,
+ OCIUserCallback callback, dvoid *ctxp,
+ ub4 fcode, ub4 when, OCIUcb *ucbDesc);
+
+sword OCIUserCallbackGet(dvoid *hndlp, ub4 type, dvoid *ehndlp,
+ ub4 fcode, ub4 when, OCIUserCallback *callbackp,
+ dvoid **ctxpp, OCIUcb *ucbDesc);
+
+sword OCISharedLibInit(dvoid *metaCtx, dvoid *libCtx, ub4 argfmt, sword argc,
+ dvoid *argv[], OCIEnvCallbackType envCallback);
+
+sword OCIFileExists ( dvoid *hndl, OCIError *err, OraText *filename,
+ OraText *path, ub1 *flag );
+
+sword OCIFileFlush( dvoid *hndl, OCIError *err, OCIFileObject *filep );
+
+
+sword OCIFileGetLength( dvoid *hndl, OCIError *err, OraText *filename,
+ OraText *path, ubig_ora *lenp );
+
+sword OCIFileInit ( dvoid *hndl, OCIError *err );
+
+sword OCIFileOpen ( dvoid *hndl, OCIError *err, OCIFileObject **filep,
+ OraText *filename, OraText *path, ub4 mode, ub4 create,
+ ub4 type );
+
+sword OCIFileRead ( dvoid *hndl, OCIError *err, OCIFileObject *filep,
+ dvoid *bufp, ub4 bufl, ub4 *bytesread );
+
+sword OCIFileSeek ( dvoid *hndl, OCIError *err, OCIFileObject *filep,
+ uword origin, ubig_ora offset, sb1 dir );
+
+sword OCIFileTerm ( dvoid *hndl, OCIError *err );
+
+
+sword OCIFileWrite ( dvoid *hndl, OCIError *err, OCIFileObject *filep,
+ dvoid *bufp, ub4 buflen, ub4 *byteswritten );
+
+
+/*
+ ** Initialize the security package
+ */
+sword OCISecurityInitialize (OCISecurity *sechandle, OCIError *error_handle);
+
+sword OCISecurityTerminate (OCISecurity *sechandle, OCIError *error_handle);
+
+sword OCISecurityOpenWallet(OCISecurity *osshandle,
+ OCIError *error_handle,
+ size_t wrllen,
+ OraText *wallet_resource_locator,
+ size_t pwdlen,
+ OraText *password,
+ nzttWallet *wallet);
+
+sword OCISecurityCloseWallet(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttWallet *wallet);
+
+sword OCISecurityCreateWallet(OCISecurity *osshandle,
+ OCIError *error_handle,
+ size_t wrllen,
+ OraText *wallet_resource_locator,
+ size_t pwdlen,
+ OraText *password,
+ nzttWallet *wallet);
+
+sword OCISecurityDestroyWallet(OCISecurity *osshandle,
+ OCIError *error_handle,
+ size_t wrllen,
+ OraText *wallet_resource_locator,
+ size_t pwdlen,
+ OraText *password);
+
+sword OCISecurityStorePersona(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona **persona,
+ nzttWallet *wallet);
+
+sword OCISecurityOpenPersona(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona);
+
+sword OCISecurityClosePersona(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona);
+
+sword OCISecurityRemovePersona(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona **persona);
+
+sword OCISecurityCreatePersona(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentType identity_type,
+ nzttCipherType cipher_type,
+ nzttPersonaDesc *desc,
+ nzttPersona **persona);
+
+sword OCISecuritySetProtection(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttcef crypto_engine_function,
+ nztttdufmt data_unit_format,
+ nzttProtInfo *protection_info);
+
+sword OCISecurityGetProtection(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttcef crypto_engine_function,
+ nztttdufmt * data_unit_format_ptr,
+ nzttProtInfo *protection_info);
+
+sword OCISecurityRemoveIdentity(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentity **identity_ptr);
+
+sword OCISecurityCreateIdentity(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentType type,
+ nzttIdentityDesc *desc,
+ nzttIdentity **identity_ptr);
+
+sword OCISecurityAbortIdentity(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentity **identity_ptr);
+
+sword OCISecurityFreeIdentity(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentity **identity_ptr);
+
+
+sword OCISecurityStoreTrustedIdentity(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttIdentity **identity_ptr,
+ nzttPersona *persona);
+
+sword OCISecuritySign(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces signature_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *buffer_block);
+
+sword OCISecuritySignExpansion(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t inputlen,
+ size_t *signature_length);
+
+sword OCISecurityVerify(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces signature_state,
+ size_t siglen,
+ ub1 *signature,
+ nzttBufferBlock *extracted_message,
+ boolean *verified,
+ boolean *validated,
+ nzttIdentity **signing_party_identity);
+
+sword OCISecurityValidate(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttIdentity *sidentity,
+ boolean *validated);
+
+sword OCISecuritySignDetached(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces signature_state,
+ size_t input_length,
+ ub1 * input,
+ nzttBufferBlock *signature);
+
+sword OCISecuritySignDetExpansion(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t input_length,
+ size_t *required_buffer_length);
+
+sword OCISecurityVerifyDetached(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces signature_state,
+ size_t data_length,
+ ub1 *data,
+ size_t siglen,
+ ub1 *signature,
+ boolean *verified,
+ boolean *validated,
+ nzttIdentity **signing_party_identity);
+
+sword OCISecurity_PKEncrypt(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t number_of_recipients,
+ nzttIdentity *recipient_list,
+ nzttces encryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *encrypted_data);
+
+sword OCISecurityPKEncryptExpansion(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t number_recipients,
+ size_t input_length,
+ size_t *buffer_length_required);
+
+sword OCISecurityPKDecrypt(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces encryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *encrypted_data);
+
+sword OCISecurityEncrypt(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces encryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *encrypted_data);
+
+sword OCISecurityEncryptExpansion(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t input_length,
+ size_t *encrypted_data_length);
+
+sword OCISecurityDecrypt(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces decryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *decrypted_data);
+
+sword OCISecurityEnvelope(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t number_of_recipients,
+ nzttIdentity *sidentity,
+ nzttces encryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *enveloped_data);
+
+sword OCISecurityDeEnvelope(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces decryption_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *output_message,
+ boolean *verified,
+ boolean *validated,
+ nzttIdentity **sender_identity);
+
+sword OCISecurityKeyedHash(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces hash_state,
+ size_t input_length,
+ ub1 *input,
+ nzttBufferBlock *keyed_hash);
+
+sword OCISecurityKeyedHashExpansion(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t input_length,
+ size_t *required_buffer_length);
+
+sword OCISecurityHash(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ nzttces hash_state,
+ size_t input,
+ ub1 *input_length,
+ nzttBufferBlock *shash);
+
+sword OCISecurityHashExpansion(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t input_length,
+ size_t *required_buffer_length);
+
+sword OCISecuritySeedRandom(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t seed_length,
+ ub1 *seed);
+
+sword OCISecurityRandomBytes(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ size_t number_of_bytes_desired,
+ nzttBufferBlock *random_bytes);
+
+sword OCISecurityRandomNumber(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttPersona *persona,
+ uword *random_number_ptr);
+
+sword OCISecurityInitBlock(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttBufferBlock *buffer_block);
+
+sword OCISecurityReuseBlock(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttBufferBlock *buffer_block);
+
+sword OCISecurityPurgeBlock(OCISecurity *osshandle,
+ OCIError *error_handle,
+ nzttBufferBlock *buffer_block);
+
+sword OCISecuritySetBlock(OCISecurity *osshandle,
+ OCIError *error_handle,
+ uword flags_to_set,
+ size_t buffer_length,
+ size_t used_buffer_length,
+ ub1 *buffer,
+ nzttBufferBlock *buffer_block);
+
+sword OCISecurityGetIdentity(OCISecurity *osshandle,
+ OCIError *error_handle,
+ size_t namelen,
+ OraText *distinguished_name,
+ nzttIdentity **sidentity);
+
+sword OCIAQEnq(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+ OCIAQEnqOptions *enqopt, OCIAQMsgProperties *msgprop,
+ OCIType *payload_tdo, dvoid **payload, dvoid **payload_ind,
+ OCIRaw **msgid, ub4 flags);
+
+sword OCIAQDeq(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+ OCIAQDeqOptions *deqopt, OCIAQMsgProperties *msgprop,
+ OCIType *payload_tdo, dvoid **payload, dvoid **payload_ind,
+ OCIRaw **msgid, ub4 flags);
+
+sword OCIAQListen(/*_ OCISvcCtx *svchp, OCIError *errhp,
+ OCIAQAgent **agent_list, ub4 num_agents,
+ sb4 wait, OCIAQAgent **agent,
+ ub4 flags _*/);
+
+sword OCIExtractInit(dvoid *hndl, OCIError *err);
+
+sword OCIExtractTerm(dvoid *hndl, OCIError *err);
+
+sword OCIExtractReset(dvoid *hndl, OCIError *err);
+
+sword OCIExtractSetNumKeys(dvoid *hndl, OCIError *err, uword numkeys);
+
+sword OCIExtractSetKey(dvoid *hndl, OCIError *err, CONST OraText *name,
+ ub1 type, ub4 flag, CONST dvoid *defval,
+ CONST sb4 *intrange, CONST OraText *CONST *strlist);
+
+sword OCIExtractFromFile(dvoid *hndl, OCIError *err, ub4 flag,
+ OraText *filename);
+
+sword OCIExtractFromStr(dvoid *hndl, OCIError *err, ub4 flag, OraText *input);
+
+sword OCIExtractToInt(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, sb4 *retval);
+
+sword OCIExtractToBool(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, ub1 *retval);
+
+sword OCIExtractToStr(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, OraText *retval, uword buflen);
+
+sword OCIExtractToOCINum(dvoid *hndl, OCIError *err, OraText *keyname,
+ uword valno, OCINumber *retval);
+
+sword OCIExtractToList(dvoid *hndl, OCIError *err, uword *numkeys);
+
+sword OCIExtractFromList(dvoid *hndl, OCIError *err, uword index,
+ OraText **name,
+ ub1 *type, uword *numvals, dvoid ***values);
+
+/* Memory Related Service Interfaces */
+
+sword OCIMemoryAlloc(dvoid *hdl, OCIError *err, dvoid **mem,
+ OCIDuration dur, ub4 size, ub4 flags);
+
+sword OCIMemoryResize(dvoid *hdl, OCIError *err, dvoid **mem,
+ ub4 newsize, ub4 flags);
+
+sword OCIMemoryFree(dvoid *hdl, OCIError *err, dvoid *mem);
+
+sword OCIContextSetValue(dvoid *hdl, OCIError *err, OCIDuration duration,
+ ub1 *key, ub1 keylen, dvoid *ctx_value);
+
+sword OCIContextGetValue(dvoid *hdl, OCIError *err, ub1 *key,
+ ub1 keylen, dvoid **ctx_value);
+
+sword OCIContextClearValue(dvoid *hdl, OCIError *err, ub1 *key,
+ ub1 keylen);
+
+sword OCIContextGenerateKey(dvoid *hdl, OCIError *err, ub4 *key);
+
+sword OCIMemorySetCurrentIDs(dvoid *hdl, OCIError *err,
+ ub4 curr_session_id, ub4 curr_trans_id, ub4 curr_stmt_id);
+
+sword OCIPicklerTdsCtxInit(OCIEnv *env, OCIError *err,
+ OCIPicklerTdsCtx **tdsc);
+
+sword OCIPicklerTdsCtxFree(OCIEnv *env, OCIError *err, OCIPicklerTdsCtx *tdsc);
+
+sword OCIPicklerTdsInit(OCIEnv *env, OCIError *err, OCIPicklerTdsCtx *tdsc,
+ OCIPicklerTds **tdsh);
+
+sword OCIPicklerTdsFree(OCIEnv *env, OCIError *err, OCIPicklerTds *tdsh);
+
+sword OCIPicklerTdsCreateElementNumber(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, ub1 prec,
+ sb1 scale, OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementChar(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, ub2 len,
+ OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementVarchar(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, ub2 len,
+ OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementRaw(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, ub2 len,
+ OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElement(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, OCITypeCode dty,
+ OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsAddAttr(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh, OCIPicklerTdsElement elt);
+
+sword OCIPicklerTdsGenerate(OCIEnv *env, OCIError *err,
+ OCIPicklerTds *tdsh);
+
+sword OCIPicklerTdsGetAttr(OCIEnv *env, OCIError *err,
+ CONST OCIPicklerTds *tdsh, ub1 attrno,
+ OCITypeCode *typ, ub2 *len);
+
+sword OCIPicklerFdoInit(OCIEnv *env, OCIError *err,
+ OCIPicklerFdo **fdoh);
+
+sword OCIPicklerFdoFree(OCIEnv *env, OCIError *err,
+ OCIPicklerFdo *fdoh);
+
+sword OCIPicklerImageInit(OCIEnv *env, OCIError *err,
+ OCIPicklerFdo *fdoh,
+ OCIPicklerTds *tdsh,
+ OCIPicklerImage **imgh);
+
+sword OCIPicklerImageFree(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh);
+
+sword OCIPicklerImageAddScalar(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, dvoid *scalar, ub4 len);
+
+sword OCIPicklerImageAddNullScalar(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh);
+
+sword OCIPicklerImageGenerate(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh);
+
+sword OCIPicklerImageGetScalarSize(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh,
+ ub4 attrno, ub4 *size);
+
+sword OCIPicklerImageGetScalar(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, ub4 attrno,
+ dvoid *buf, ub4 *len, OCIInd *ind);
+
+sword OCIPicklerImageCollBegin(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, CONST OCIPicklerTds *colltdsh);
+
+sword OCIPicklerImageCollAddScalar( OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, dvoid *scalar,
+ ub4 buflen, OCIInd ind);
+
+sword OCIPicklerImageCollEnd(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh);
+
+/* should take svcctx for locator stuff */
+sword OCIPicklerImageCollBeginScan(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, CONST OCIPicklerTds *coll_tdsh,
+ ub4 attrnum, ub4 startidx, OCIInd *ind);
+
+sword OCIPicklerImageCollGetScalarSize(OCIEnv *env, OCIError *err,
+ CONST OCIPicklerTds *coll_tdsh, ub4 *size);
+
+sword OCIPicklerImageCollGetScalar(OCIEnv *env, OCIError *err,
+ OCIPicklerImage *imgh, dvoid *buf,
+ ub4 *buflen, OCIInd *ind);
+
+sword OCIAnyDataGetType(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode *tc, OCIType **type);
+
+sword OCIAnyDataIsNull(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ boolean *isnull);
+
+sword OCIAnyDataConvert(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+ OCIType *type, OCIDuration dur, dvoid *ind, dvoid *data_val,
+ ub4 len, OCIAnyData **sdata);
+
+sword OCIAnyDataBeginCreate(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+ OCIType *type, OCIDuration dur, OCIAnyData **sdata);
+
+sword OCIAnyDataDestroy(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata);
+
+sword OCIAnyDataAttrSet(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+ ub4 length, boolean is_any);
+
+sword OCIAnyDataCollAddElem(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyData *sdata, OCITypeCode tc, OCIType *type, dvoid *ind,
+ dvoid *attr_val, ub4 length, boolean is_any, boolean last_elem);
+
+sword OCIAnyDataEndCreate(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyData *sdata);
+
+sword OCIAnyDataAccess(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+ ub4 *length);
+
+sword OCIAnyDataGetCurrAttrNum(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ ub4 *attrnum);
+
+sword OCIAnyDataAttrGet(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+ OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+ ub4 *length, boolean is_any);
+
+sword OCIAnyDataCollGetElem(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyData *sdata,
+ OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *celem_val,
+ ub4 *length, boolean is_any);
+
+
+/*------------------------ OCIAnyDataSet interfaces -------------------------*/
+
+/*
+ NAME
+ OCIAnyDataSetBeginCreate - OCIAnyDataSet Begin Creation
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+ recorded in errhp and this function returns OCI_ERROR.
+ Diagnostic information can be obtained by calling
+ OCIErrorGet().
+ typecode - typecode corresponding to the OCIAnyDataSet.
+ type (IN) - type corresponding to the OCIAnyDataSet. If the typecode
+ corresponds to a built-in type (OCI_TYPECODE_NUMBER etc.)
+ , this parameter can be NULL. It should be non NULL for
+ user defined types (OCI_TYPECODE_OBJECT,
+ OCI_TYPECODE_REF, collection types etc.)
+ dur (IN) - duration for which OCIAnyDataSet is allocated.
+ data_set (OUT) - Initialized OCIAnyDataSet.
+ RETURNS - error code
+ NOTES
+ This call allocates an OCIAnyDataSet for the duration of dur and
+ initializes it with the type information. The OCIAnyDataSet can hold
+ multiple instances of the given type. For performance reasons, the
+ OCIAnyDataSet will end up pointing to the passed in OCIType parameter.
+ It is the responsibility of the caller to ensure that the OCIType is
+ longer lived (has allocation duration >= the duration of the OCIAnyData
+ if the OCIType is a transient one, allocation/pin duration >= duration of
+ the OCIAnyData if the OCIType is a persistent one).
+
+*/
+sword OCIAnyDataSetBeginCreate(OCISvcCtx *svchp, OCIError *errhp,
+ OCITypeCode typecode, CONST OCIType *type, OCIDuration dur,
+ OCIAnyDataSet ** data_set);
+
+/*
+ NAME
+ OCIAnyDataSetDestroy - OCIAnyDataSet Destroy
+ DESCRIPTION
+ This call frees the OCIAnyDataSet allocated using
+ OCIAnyDataSetBeginCreate().
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI Error handle.
+ data_set (IN/OUT) - OCIAnyDataSet to be freed.
+*/
+sword OCIAnyDataSetDestroy(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set);
+
+
+/*
+ NAME
+ OCIAnyDataSetAddInstance - OCIAnyDataSet Add an instance
+ DESCRIPTION
+ This call adds a new skeleton instance to the OCIAnyDataSet and all the
+ attributes of the instance are set to NULL. It returns this skeleton
+ instance through the OCIAnyData parameter which can be constructed
+ subsequently by invoking the OCIAnyData API.
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI Error handle.
+ data_set (IN/OUT) - OCIAnyDataSet to which a new instance is added.
+ data (IN/OUT) - OCIAnyData corresponding to the newly added
+ instance. If (*data) is NULL, a new OCIAnyData will
+ be allocated for same duration as the OCIAnyDataSet.
+ If (*data) is not NULL, it will get reused. This
+ OCIAnyData can be subseqently constructed using the
+ OCIAnyDataConvert() call or it can be constructed
+ piece-wise using the OCIAnyDataAttrSet and
+ OCIAnyDataCollAddElem calls.
+ NOTES
+ No Destruction of the old value is done here. It is the responsibility of
+ the caller to destroy the old value pointed to by (*data) and set (*data)
+ to a null pointer before beginning to make a sequence of this call. No
+ deep copying (of OCIType information nor the data part.) is done in the
+ returned OCIAnyData. This OCIAnyData cannot be used beyond the allocation
+ duration of the OCIAnyDataSet (it is like a reference into the
+ OCIAnyDataSet). The returned OCIAnyData can be reused on subsequent calls
+ to this function, to sequentially add new data instances to the
+ OCIAnyDataSet.
+*/
+sword OCIAnyDataSetAddInstance(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set, OCIAnyData **data);
+
+/*
+ NAME
+ OCIAnyDataSetEndCreate - OCIAnyDataSet End Creation process.
+ DESCRIPTION
+ This call marks the end of OCIAnyDataSet creation. It should be called
+ after constructing all of its instance(s).
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+ recorded in errhp and this function returns
+ OCI_ERROR. Diagnostic information can be obtained
+ by calling OCIErrorGet().
+ data_set (IN/OUT) - OCIAnyDataSet that has been fully constructed.
+*/
+sword OCIAnyDataSetEndCreate(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set);
+
+/*
+ NAME
+ OCIAnyDataSetGetType - OCIAnyDataSet Get Type of an OCIAnyDataSet
+ DESCRIPTION
+ Gets the Type corresponding to an OCIAnyDataSet. It returns the actual
+ pointer to the type maintained inside an OCIAnyDataSet. No copying is
+ done for performance reasons. The client is responsible for not using
+ this type once the OCIAnyDataSet is freed (or its duration ends).
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - The OCI service context.
+ errhp (IN/OUT) - The OCI Error handle.
+ data_set (IN) - Initialized OCIAnyDataSet.
+ tc (OUT) - The typecode of the type.
+ type (OUT) - The type corresponding to the OCIAnyDataSet. This
+ could be null if the OCIAnyData corresponds to a
+ built-in type.
+*/
+sword OCIAnyDataSetGetType (OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set, OCITypeCode *tc, OCIType **type);
+
+/*
+ NAME
+ OCIAnyDataSetGetCount - OCIAnyDataSet Get Count of instances.
+ DESCRIPTION
+ This call gets the number of instances in the OCIAnyDataSet.
+ RETURNS
+ error code.
+ PARAMETERS
+ svchp (IN/OUT) - OCI Service Context
+ errhp (IN/OUT) - OCI Error handle
+ data_set (IN) - Well formed OCIAnyDataSet.
+ count (OUT) - number of instances in OCIAnyDataSet
+*/
+sword OCIAnyDataSetGetCount(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set, ub4 *count);
+
+/*
+ NAME
+ OCIAnyDataSetGetInstance - OCIAnyDataSet Get next instance.
+ DESCRIPTION
+ Only sequential access to the instances in an OCIAnyDataSet is allowed.
+ This call returns the OCIAnyData corresponding to an instance at the
+ current position and updates the current position. Subsequently, the
+ OCIAnyData access routines may be used to access the instance.
+ RETURNS
+ error code. Returns OCI_NO_DATA if the current position is at the end of
+ the set, OCI_SUCCESS otherwise.
+ PARAMETERS
+ svchp (IN/OUT) - OCI Service Context
+ errhp (IN/OUT) - OCI Error handle
+ data_set (IN) - Well formed OCIAnyDataSet
+ data (IN/OUT) - OCIAnyData corresponding to the instance. If (*data)
+ is NULL, a new OCIAnyData will be allocated for same
+ duration as the OCIAnyDataSet. If (*data) is not NULL
+ , it will get reused. This OCIAnyData can be
+ subsequently accessed using the OCIAnyDataAccess()
+ call or piece-wise by using the OCIAnyDataAttrGet()
+ call.
+ NOTE
+ No Destruction of the old value is done here. It is the responsibility of
+ the caller to destroy the old value pointed to by (*data) and set (*data)
+ to a null pointer before beginning to make a sequence of this call. No deep
+ copying (of OCIType information nor the data part.) is done in the returned
+ OCIAnyData. This OCIAnyData cannot be used beyond the allocation duration
+ of the OCIAnyDataSet (it is like a reference into the OCIAnyDataSet). The
+ returned OCIAnyData can be reused on subsequent calls to this function to
+ sequentially access the OCIAnyDataSet.
+*/
+sword OCIAnyDataSetGetInstance(OCISvcCtx *svchp, OCIError *errhp,
+ OCIAnyDataSet *data_set, OCIAnyData **data);
+
+/*--------------------- End of OCIAnyDataSet interfaces ---------------------*/
+
+sword OCIFormatInit(dvoid *hndl, OCIError *err);
+
+sword OCIFormatString(dvoid *hndl, OCIError *err, OraText *buffer,
+ sbig_ora bufferLength, sbig_ora *returnLength,
+ CONST OraText *formatString, ...);
+
+sword OCIFormatTerm(dvoid *hndl, OCIError *err);
+
+sword OCIFormatTUb1(void);
+sword OCIFormatTUb2(void);
+sword OCIFormatTUb4(void);
+sword OCIFormatTUword(void);
+sword OCIFormatTUbig_ora(void);
+sword OCIFormatTSb1(void);
+sword OCIFormatTSb2(void);
+sword OCIFormatTSb4(void);
+sword OCIFormatTSword(void);
+sword OCIFormatTSbig_ora(void);
+sword OCIFormatTEb1(void);
+sword OCIFormatTEb2(void);
+sword OCIFormatTEb4(void);
+sword OCIFormatTEword(void);
+sword OCIFormatTChar(void);
+sword OCIFormatTText(void);
+sword OCIFormatTDouble(void);
+sword OCIFormatTDvoid(void);
+sword OCIFormatTEnd(void);
+
+/*-------------------------- Extensions to XA interface ---------------------*/
+/* ------------------------- xaosvch ----------------------------------------*/
+/*
+ NAME
+ xaosvch - XA Oracle get SerViCe Handle
+ DESCRIPTION
+ Given a database name return the service handle that is used by the
+ XA library
+ NOTE
+ This macro has been provided for backward compatibilty with 8.0.2
+*/
+OCISvcCtx *xaosvch(OraText *dbname);
+
+/* ------------------------- xaoSvcCtx --------------------------------------*/
+/*
+ NAME
+ xaoSvcCtx - XA Oracle get SerViCe ConTeXt
+ DESCRIPTION
+ Given a database name return the service handle that is used by the
+ XA library
+ NOTE
+ This routine has been provided for APs to get access to the service
+ handle that XA library uses. Without this routine APs must use SQLLIB
+ routine sqlld2 to get access to the Logon data area registered by the
+ XA library
+*/
+OCISvcCtx *xaoSvcCtx(OraText *dbname);
+
+/* ------------------------- xaoEnv -----------------------------------------*/
+/*
+ NAME
+ xaoEnv - XA Oracle get ENvironment Handle
+ DESCRIPTION
+ Given a database name return the environment handle that is used by the
+ XA library
+ NOTE
+ This routine has been provided for APs to get access to the environment
+ handle that XA library uses. Without this routine APs must use SQLLIB
+ routine sqlld2 to get access to the Logon data area registered by the
+ XA library
+*/
+OCIEnv *xaoEnv(OraText *dbname);
+
+/* ------------------------- xaosterr ---------------------------------------*/
+/*
+ NAME
+ xaosterr - XA Oracle get xa STart ERRor code
+ DESCRIPTION
+ Given an oracle error code return the XA error code
+ */
+int xaosterr(OCISvcCtx *svch, sb4 error);
+/*-------------------------- End Extensions ---------------------------------*/
+/*---------------------- Extensions to NLS cartridge service ----------------*/
+/* ----------------------- OCINlsGetInfo ------------------------------------*/
+/*
+ NAME
+ OCINlsGetInfo - Get NLS info from OCI environment handle
+ REMARKS
+ This function generates language information specified by item from OCI
+ environment handle envhp into an array pointed to by buf within size
+ limitation as buflen.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+ envhp(IN/OUT)
+ OCI environment handle.
+ errhp(IN/OUT)
+ The OCI error handle. If there is an error, it is record in errhp and
+ this function returns a NULL pointer. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ buf(OUT)
+ Pointer to the destination buffer.
+ buflen(IN)
+ The size of destination buffer. The maximum length for each information
+ is 32 bytes.
+ item(IN)
+ It specifies to get which item in OCI environment handle and can be one
+ of following values:
+ OCI_NLS_DAYNAME1 : Native name for Monday.
+ OCI_NLS_DAYNAME2 : Native name for Tuesday.
+ OCI_NLS_DAYNAME3 : Native name for Wednesday.
+ OCI_NLS_DAYNAME4 : Native name for Thursday.
+ OCI_NLS_DAYNAME5 : Native name for Friday.
+ OCI_NLS_DAYNAME6 : Native name for for Saturday.
+ OCI_NLS_DAYNAME7 : Native name for for Sunday.
+ OCI_NLS_ABDAYNAME1 : Native abbreviated name for Monday.
+ OCI_NLS_ABDAYNAME2 : Native abbreviated name for Tuesday.
+ OCI_NLS_ABDAYNAME3 : Native abbreviated name for Wednesday.
+ OCI_NLS_ABDAYNAME4 : Native abbreviated name for Thursday.
+ OCI_NLS_ABDAYNAME5 : Native abbreviated name for Friday.
+ OCI_NLS_ABDAYNAME6 : Native abbreviated name for for Saturday.
+ OCI_NLS_ABDAYNAME7 : Native abbreviated name for for Sunday.
+ OCI_NLS_MONTHNAME1 : Native name for January.
+ OCI_NLS_MONTHNAME2 : Native name for February.
+ OCI_NLS_MONTHNAME3 : Native name for March.
+ OCI_NLS_MONTHNAME4 : Native name for April.
+ OCI_NLS_MONTHNAME5 : Native name for May.
+ OCI_NLS_MONTHNAME6 : Native name for June.
+ OCI_NLS_MONTHNAME7 : Native name for July.
+ OCI_NLS_MONTHNAME8 : Native name for August.
+ OCI_NLS_MONTHNAME9 : Native name for September.
+ OCI_NLS_MONTHNAME10 : Native name for October.
+ OCI_NLS_MONTHNAME11 : Native name for November.
+ OCI_NLS_MONTHNAME12 : Native name for December.
+ OCI_NLS_ABMONTHNAME1 : Native abbreviated name for January.
+ OCI_NLS_ABMONTHNAME2 : Native abbreviated name for February.
+ OCI_NLS_ABMONTHNAME3 : Native abbreviated name for March.
+ OCI_NLS_ABMONTHNAME4 : Native abbreviated name for April.
+ OCI_NLS_ABMONTHNAME5 : Native abbreviated name for May.
+ OCI_NLS_ABMONTHNAME6 : Native abbreviated name for June.
+ OCI_NLS_ABMONTHNAME7 : Native abbreviated name for July.
+ OCI_NLS_ABMONTHNAME8 : Native abbreviated name for August.
+ OCI_NLS_ABMONTHNAME9 : Native abbreviated name for September.
+ OCI_NLS_ABMONTHNAME10 : Native abbreviated name for October.
+ OCI_NLS_ABMONTHNAME11 : Native abbreviated name for November.
+ OCI_NLS_ABMONTHNAME12 : Native abbreviated name for December.
+ OCI_NLS_YES : Native string for affirmative response.
+ OCI_NLS_NO : Native negative response.
+ OCI_NLS_AM : Native equivalent string of AM.
+ OCI_NLS_PM : Native equivalent string of PM.
+ OCI_NLS_AD : Native equivalent string of AD.
+ OCI_NLS_BC : Native equivalent string of BC.
+ OCI_NLS_DECIMAL : decimal character.
+ OCI_NLS_GROUP : group separator.
+ OCI_NLS_DEBIT : Native symbol of debit.
+ OCI_NLS_CREDIT : Native sumbol of credit.
+ OCI_NLS_DATEFORMAT : Oracle date format.
+ OCI_NLS_INT_CURRENCY: International currency symbol.
+ OCI_NLS_LOC_CURRENCY : Locale currency symbol.
+ OCI_NLS_LANGUAGE : Language name.
+ OCI_NLS_ABLANGUAGE : Abbreviation for language name.
+ OCI_NLS_TERRITORY : Territory name.
+ OCI_NLS_CHARACTER_SET : Character set name.
+ OCI_NLS_LINGUISTIC : Linguistic name.
+ OCI_NLS_CALENDAR : Calendar name.
+ OCI_NLS_DUAL_CURRENCY : Dual currency symbol.
+*/
+sword OCINlsGetInfo(dvoid *envhp, OCIError *errhp, OraText *buf,
+ size_t buflen, ub2 item);
+
+/* ----------------------- OCINlsNumericInfoGet -----------------------------*/
+/*
+ NAME
+ OCINlsNumericInfoGet - Get NLS numeric info from OCI environment handle
+ REMARKS
+ This function generates numeric language information specified by item
+ from OCI environment handle envhp into an output number variable.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+ envhp(IN/OUT)
+ OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+ errhp(IN/OUT)
+ The OCI error handle. If there is an error, it is record in errhp and
+ this function returns a NULL pointer. Diagnostic information can be
+ obtained by calling OCIErrorGet().
+ val(OUT)
+ Pointer to the output number variable. On OCI_SUCCESS return, it will
+ contain the requested NLS numeric info.
+ item(IN)
+ It specifies to get which item in OCI environment handle and can be one
+ of following values:
+ OCI_NLS_CHARSET_MAXBYTESZ : Maximum character byte size for OCI
+ environment or session handle charset
+ OCI_NLS_CHARSET_FIXEDWIDTH: Character byte size for fixed-width charset;
+ 0 for variable-width charset
+*/
+sword OCINlsNumericInfoGet(dvoid *envhp, OCIError *errhp, sb4 *val, ub2 item);
+
+/* ----------------------- OCINlsCharSetNameToId -----------------------------*/
+/*
+ NAME
+ OCINlsCharSetNameToId - Get Oracle charset id given Oracle charset name
+ REMARKS
+ This function will get the Oracle character set id corresponding to
+ the given Oracle character set name.
+ RETURNS
+ Oracle character set id for the given Oracle character set name if
+ character set name and OCI handle are valid; otherwise returns 0.
+ envhp(IN/OUT)
+ OCI environment handle.
+ name(IN)
+ Pointer to a null-terminated Oracle character set name whose id
+ will be returned.
+*/
+ub2 OCINlsCharSetNameToId(dvoid *envhp, const oratext *name);
+
+/* ----------------------- OCINlsCharSetIdToName -----------------------------*/
+/*
+ NAME
+ OCINlsCharSetIdToName - Get Oracle charset name given Oracle charset id
+ REMARKS
+ This function will get the Oracle character set name corresponding to
+ the given Oracle character set id.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+ buf(OUT)
+ Pointer to the destination buffer. On OCI_SUCCESS return, it will contain
+ the null-terminated string for character set name.
+ buflen(IN)
+ Size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ for
+ guarantee to store an Oracle character set name. If it's smaller than
+ the length of the character set name, the function will return OCI_ERROR.
+ id(IN)
+ Oracle character set id.
+*/
+sword OCINlsCharSetIdToName(dvoid *envhp, oratext *buf, size_t buflen, ub2 id);
+
+/* ----------------------- OCINlsNameMap ------------------------------------*/
+/*
+ NAME
+ OCINlsNameMap - Map NLS naming from Oracle to other standards and vice
+ versa
+ REMARKS
+ This function will map NLS naming from Oracle to other standards (such
+ as ISO, IANA) and vice versa.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+ buf(OUT)
+ Pointer to the destination buffer. On OCI_SUCCESS return, it will
+ contain null-terminated string for requested mapped name.
+ buflen(IN)
+ The size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ
+ for guarantee to store an NLS name. If it is smaller than the length
+ of the name, the function will return OCI_ERROR.
+ srcbuf(IN)
+ Pointer to null-terminated NLS name. If it is not a valid name in its
+ define scope, the function will return OCI_ERROR.
+ flag(IN)
+ It specifies name mapping direction and can take the following values:
+ OCI_NLS_CS_IANA_TO_ORA : Map character set name from IANA to Oracle
+ OCI_NLS_CS_ORA_TO_IANA : Map character set name from Oracle to IANA
+ OCI_NLS_LANG_ISO_TO_ORA : Map language name from ISO to Oracle
+ OCI_NLS_LANG_ORA_TO_ISO : Map language name from Oracle to ISO
+ OCI_NLS_TERR_ISO_TO_ORA : Map territory name from ISO to Oracle
+ OCI_NLS_TERR_ORA_TO_ISO : Map territory name from Oracle to ISO
+ OCI_NLS_TERR_ISO3_TO_ORA : Map territory name from 3-letter ISO
+ abbreviation to Oracle
+ OCI_NLS_TERR_ORA_TO_ISO3 : Map territory name from Oracle to 3-letter
+ ISO abbreviation
+*/
+sword OCINlsNameMap(dvoid *envhp, oratext *buf, size_t buflen,
+ const oratext *srcbuf, ub4 flag);
+
+/* -------------------- OCIMultiByteToWideChar ------------------------------*/
+/*
+ NAME
+ OCIMultiByteToWideChar - Convert a null terminated multibyte string into
+ wchar
+ REMARKS
+ This routine converts an entire null-terminated string into the wchar
+ format. The wchar output buffer will be null-terminated.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set of string.
+ dst (OUT)
+ Destination buffer for wchar.
+ src (IN)
+ Source string to be converted.
+ rsize (OUT)
+ Number of characters converted including null-terminator.
+ If it is a NULL pointer, no number return
+*/
+sword OCIMultiByteToWideChar(dvoid *envhp, OCIWchar *dst, CONST OraText *src,
+ size_t *rsize);
+
+
+/* --------------------- OCIMultiByteInSizeToWideChar -----------------------*/
+/*
+ NAME
+ OCIMultiByteInSizeToWideChar - Convert a mulitbyte string in length into
+ wchar
+ REMARKS
+ This routine converts part of string into the wchar format. It will
+ convert as many complete characters as it can until it reaches output
+ buffer size or input buffer size or it reaches a null-terminator in
+ source string. The output buffer will be null-terminated if space permits.
+ If dstsz is zero, this function will only return number of characters not
+ including ending null terminator for converted string.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set of string.
+ dst (OUT)
+ Pointer to a destination buffer for wchar. It can be NULL pointer when
+ dstsz is zero.
+ dstsz(IN)
+ Destination buffer size in character. If it is zero, this function just
+ returns number of characters will be need for the conversion.
+ src (IN)
+ Source string to be converted.
+ srcsz(IN)
+ Length of source string in byte.
+ rsize(OUT)
+ Number of characters written into destination buffer, or number of
+ characters for converted string is dstsz is zero.
+ If it is NULL pointer, nothing to return.
+*/
+sword OCIMultiByteInSizeToWideChar(dvoid *envhp, OCIWchar *dst,
+ size_t dstsz, CONST OraText *src,
+ size_t srcsz, size_t *rsize);
+
+
+/* ---------------------- OCIWideCharToMultiByte ----------------------------*/
+/*
+ NAME
+ OCIWideCharToMultiByte - Convert a null terminated wchar string into
+ multibyte
+ REMARKS
+ This routine converts an entire null-terminated wide character string into
+ multi-byte string. The output buffer will be null-terminated.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set of string.
+ dst (OUT)
+ Destination buffer for multi-byte string.
+ src (IN)
+ Source wchar string to be converted.
+ rsize (OUT)
+ Number of bytes written into the destination buffer.
+ If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharToMultiByte(dvoid *envhp, OraText *dst, CONST OCIWchar *src,
+ size_t *rsize);
+
+
+/* ---------------------- OCIWideCharInSizeToMultiByte ----------------------*/
+/*
+ NAME
+ OCIWideCharInSizeToMultiByte - Convert a wchar string in length into
+ mulitbyte
+ REMARKS
+ This routine converts part of wchar string into the multi-byte format.
+ It will convert as many complete characters as it can until it reaches
+ output buffer size or input buffer size or it reaches a null-terminator
+ in source string. The output buffer will be null-terminated if space
+ permits. If dstsz is zero, the function just returns the size of byte not
+ including ending null-terminator need to store the converted string.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set of string.
+ dst (OUT)
+ Destination buffer for multi-byte. It can be NULL pointer if dstsz is
+ zero.
+ dstsz(IN)
+ Destination buffer size in byte. If it is zero, it just returns the size
+ of bytes need for converted string.
+ src (IN)
+ Source wchar string to be converted.
+ srcsz(IN)
+ Length of source string in character.
+ rsize(OUT)
+ Number of bytes written into destination buffer, or number of bytes need
+ to store the converted string if dstsz is zero.
+ If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharInSizeToMultiByte(dvoid *envhp, OraText *dst,
+ size_t dstsz, CONST OCIWchar *src,
+ size_t srcsz, size_t *rsize);
+
+
+
+/* ----------------------- OCIWideCharIsAlnum -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsAlnum - test whether wc is a letter or decimal digit
+ REMARKS
+ It tests whether wc is a letter or decimal digit.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsAlnum(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsAlpha -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsAlpha - test whether wc is an alphabetic letter
+ REMARKS
+ It tests whether wc is an alphabetic letter
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsAlpha(dvoid *envhp, OCIWchar wc);
+
+
+/* --------------------- OCIWideCharIsCntrl ---------------------------------*/
+/*
+ NAME
+ OCIWideCharIsCntrl - test whether wc is a control character
+ REMARKS
+ It tests whether wc is a control character.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsCntrl(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsDigit -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsDigit - test whether wc is a decimal digit character
+ REMARKS
+ It tests whether wc is a decimal digit character.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsDigit(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsGraph -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsGraph - test whether wc is a graph character
+ REMARKS
+ It tests whether wc is a graph character. A graph character is character
+ with a visible representation and normally includes alphabetic letter,
+ decimal digit, and punctuation.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsGraph(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsLower -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsLower - test whether wc is a lowercase letter
+ REMARKS
+ It tests whether wc is a lowercase letter.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsLower(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsPrint -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsPrint - test whether wc is a printable character
+ REMARKS
+ It tests whether wc is a printable character.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsPrint(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsPunct -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsPunct - test whether wc is a punctuation character
+ REMARKS
+ It tests whether wc is a punctuation character.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsPunct(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsSpace -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsSpace - test whether wc is a space character
+ REMARKS
+ It tests whether wc is a space character. A space character only causes
+ white space in displayed text(for example, space, tab, carriage return,
+ newline, vertical tab or form feed).
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsSpace(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsUpper -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsUpper - test whether wc is a uppercase letter
+ REMARKS
+ It tests whether wc is a uppercase letter.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsUpper(dvoid *envhp, OCIWchar wc);
+
+
+/*----------------------- OCIWideCharIsXdigit -------------------------------*/
+/*
+ NAME
+ OCIWideCharIsXdigit - test whether wc is a hexadecimal digit
+ REMARKS
+ It tests whether wc is a hexadecimal digit ( 0-9, A-F, a-f ).
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsXdigit(dvoid *envhp, OCIWchar wc);
+
+
+/* --------------------- OCIWideCharIsSingleByte ----------------------------*/
+/*
+ NAME
+ OCIWideCharIsSingleByte - test whether wc is a single-byte character
+ REMARKS
+ It tests whether wc is a single-byte character when converted into
+ multi-byte.
+ RETURNS
+ TRUE or FLASE.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for testing.
+*/
+boolean OCIWideCharIsSingleByte(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharToLower -------------------------------*/
+/*
+ NAME
+ OCIWideCharToLower - Convert a wchar into the lowercase
+ REMARKS
+ If there is a lower-case character mapping for wc in the specified locale,
+ it will return the lower-case in wchar, else return wc itself.
+ RETURNS
+ A wchar
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for lowercase mapping.
+*/
+OCIWchar OCIWideCharToLower(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharToUpper -------------------------------*/
+/*
+ NAME
+ OCIWideCharToUpper - Convert a wchar into the uppercase
+ REMARKS
+ If there is a upper-case character mapping for wc in the specified locale,
+ it will return the upper-case in wchar, else return wc itself.
+ RETURNS
+ A wchar
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar for uppercase mapping.
+*/
+OCIWchar OCIWideCharToUpper(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharStrcmp --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrcmp - compare two null terminated wchar string
+ REMARKS
+ It compares two wchar string in binary ( based on wchar encoding value ),
+ linguistic, or case-insensitive.
+ RETURNS
+ 0, if wstr1 == wstr2.
+ Positive, if wstr1 > wstr2.
+ Negative, if wstr1 < wstr2.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set.
+ wstr1(IN)
+ Pointer to a null-terminated wchar string.
+ wstr2(IN)
+ Pointer to a null-terminated wchar string.
+ flag(IN)
+ It is used to decide the comparison method. It can be taken one of the
+ following values:
+ OCI_NLS_BINARY : for the binary comparison, this is default value.
+ OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+ This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+ comparison.
+*/
+int OCIWideCharStrcmp(dvoid *envhp, CONST OCIWchar *wstr1,
+ CONST OCIWchar *wstr2, int flag);
+
+
+/* ----------------------- OCIWideCharStrncmp -------------------------------*/
+/*
+ NAME
+ OCIWideCharStrncmp - compare twe wchar string in length
+ REMARKS
+ This function is similar to OCIWideCharStrcmp(), except that at most len1
+ characters from wstr1 and len2 characters from wstr1 are compared. The
+ null-terminator will be taken into the comparison.
+ RETURNS
+ 0, if wstr1 = wstr2
+ Positive, if wstr1 > wstr2
+ Negative, if wstr1 < wstr2
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wstr1(IN)
+ Pointer to the first wchar string
+ len1(IN)
+ The length for the first string for comparison
+ wstr2(IN)
+ Pointer to the second wchar string
+ len2(IN)
+ The length for the second string for comparison.
+ flag(IN)
+ It is used to decide the comparison method. It can be taken one of the
+ following values:
+ OCI_NLS_BINARY : for the binary comparison, this is default value.
+ OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+ This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+ comparison.
+*/
+int OCIWideCharStrncmp(dvoid *envhp, CONST OCIWchar *wstr1, size_t len1,
+ CONST OCIWchar *wstr2, size_t len2, int flag);
+
+
+/* ----------------------- OCIWideCharStrcat --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrcat - concatenate two wchar strings
+ REMARKS
+ This function appends a copy of the wchar string pointed to by wsrcstr,
+ including the null-terminator to the end of wchar string pointed to by
+ wdststr. It returns the number of character in the result string not
+ including the ending null-terminator.
+ RETURNS
+ number of characters in the result string not including the ending
+ null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wdststr(IN/OUT)
+ Pointer to the destination wchar string for appending.
+ wsrcstr(IN)
+ Pointer to the source wchar string to append.
+*/
+size_t OCIWideCharStrcat(dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr);
+
+
+/* ----------------------- OCIWideCharStrchr --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrchr - Search the first occurrence of wchar in a wchar string
+ REMARKS
+ This function searchs for the first occurrence of wc in the wchar string
+ pointed to by wstr. It returns a pointer to the whcar if successful, or
+ a null pointer.
+ RETURNS
+ wchar pointer if successful, otherwise a null pointer.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wstr(IN)
+ Pointer to the wchar string to search
+ wc(IN)
+ Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrchr(dvoid *envhp, CONST OCIWchar *wstr,
+ OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharStrcpy --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrcpy - copy a wchar string
+ REMARKS
+ This function copies the wchar string pointed to by wsrcstr, including the
+ null-terminator, into the array pointed to by wdststr. It returns the
+ number of character copied not including the ending null-terminator.
+ RETURNS
+ number of characters copied not including the ending null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wdststr(OUT)
+ Pointer to the destination wchar buffer.
+ wsrcstr(IN)
+ Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrcpy(dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr);
+
+
+/* ----------------------- OCIWideCharStrlen --------------------------------*/
+/*
+ NAME
+ OCIWideCharStrlen - Return number of character in a wchar string
+ REMARKS
+ This function computes the number of characters in the wchar string
+ pointed to by wstr, not including the null-terminator, and returns
+ this number.
+ RETURNS
+ number of characters not including ending null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wstr(IN)
+ Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrlen(dvoid *envhp, CONST OCIWchar *wstr);
+
+
+/* ----------------------- OCIWideCharStrncat -------------------------------*/
+/*
+ NAME
+ OCIWideCharStrncat - Concatenate wchar string in length
+ REMARKS
+ This function is similar to OCIWideCharStrcat(), except that at most n
+ characters from wsrcstr are appended to wdststr. Note that the
+ null-terminator in wsrcstr will stop appending. wdststr will be
+ null-terminated..
+ RETURNS
+ Number of characters in the result string not including the ending
+ null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wdststr(IN/OUT)
+ Pointer to the destination wchar string for appending.
+ wsrcstr(IN)
+ Pointer to the source wchar string to append.
+ n(IN)
+ Number of characters from wsrcstr to append.
+*/
+size_t OCIWideCharStrncat(dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr, size_t n);
+
+
+/* ----------------------- OCIWideCharStrncpy -------------------------------*/
+/*
+ NAME
+ OCIWideCharStrncpy - Copy wchar string in length
+ REMARKS
+ This function is similar to OCIWideCharStrcpy(), except that at most n
+ characters are copied from the array pointed to by wsrcstr to the array
+ pointed to by wdststr. Note that the null-terminator in wdststr will
+ stop coping and result string will be null-terminated.
+ RETURNS
+ number of characters copied not including the ending null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wdststr(OUT)
+ Pointer to the destination wchar buffer.
+ wsrcstr(IN)
+ Pointer to the source wchar string.
+ n(IN)
+ Number of characters from wsrcstr to copy.
+*/
+size_t OCIWideCharStrncpy(dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr, size_t n);
+
+
+/* ----------------------- OCIWideCharStrrchr -------------------------------*/
+/*
+ NAME
+ OCIWideCharStrrchr - search the last occurrence of a wchar in wchar string
+ REMARKS
+ This function searchs for the last occurrence of wc in the wchar string
+ pointed to by wstr. It returns a pointer to the whcar if successful, or
+ a null pointer.
+ RETURNS
+ wchar pointer if successful, otherwise a null pointer.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wstr(IN)
+ Pointer to the wchar string to search
+ wc(IN)
+ Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrrchr(dvoid *envhp, CONST OCIWchar *wstr,
+ OCIWchar wc);
+
+
+/* --------------------- OCIWideCharStrCaseConversion -----------------------*/
+/*
+ NAME
+ OCIWideCharStrCaseConversion - convert a wchar string into lowercase or
+ uppercase
+ REMARKS
+ This function convert the wide char string pointed to by wsrcstr into the
+ uppercase or lowercase specified by flag and copies the result into the
+ array pointed to by wdststr. The result string will be null-terminated.
+ RETURNS
+ number of characters for result string not including null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle.
+ wdststr(OUT)
+ Pointer to destination array.
+ wsrcstr(IN)
+ Pointer to source string.
+ flag(IN)
+ Specify the case to convert:
+ OCI_NLS_UPPERCASE : convert to uppercase.
+ OCI_NLS_LOWERCASE: convert to lowercase.
+ This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the
+ linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIWideCharStrCaseConversion(dvoid *envhp, OCIWchar *wdststr,
+ CONST OCIWchar *wsrcstr, ub4 flag);
+
+
+/*---------------------- OCIWideCharDisplayLength ---------------------------*/
+/*
+ NAME
+ OCIWideCharDisplayLength - Calculate the display length for a wchar
+ REMARKS
+ This function determines the number of column positions required for wc
+ in display. It returns number of column positions, or 0 if wc is
+ null-terminator.
+ RETURNS
+ Number of display positions.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar character.
+*/
+size_t OCIWideCharDisplayLength(dvoid *envhp, OCIWchar wc );
+
+
+/*---------------------- OCIWideCharMultiByteLength -------------------------*/
+/*
+ NAME
+ OCIWideCharMultiByteLength - Determine byte size in multi-byte encoding
+ REMARKS
+ This function determines the number of byte required for wc in multi-byte
+ encoding. It returns number of bytes in multi-byte for wc.
+ RETURNS
+ Number of bytes.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set .
+ wc(IN)
+ Wchar character.
+*/
+size_t OCIWideCharMultiByteLength(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIMultiByteStrcmp -------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrcmp - Compare two multi-byte strings
+ REMARKS
+ It compares two multi-byte strings in binary ( based on encoding value ),
+ linguistic, or case-insensitive.
+ RETURNS
+ 0, if str1 == str2.
+ Positive, if str1 > str2.
+ Negative, if str1 < str2.
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set.
+ str1(IN)
+ Pointer to a null-terminated string.
+ str2(IN)
+ Pointer to a null-terminated string.
+ flag(IN)
+ It is used to decide the comparison method. It can be taken one of the
+ following values:
+ OCI_NLS_BINARY: for the binary comparison, this is default value.
+ OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+ This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+ comparison.
+*/
+int OCIMultiByteStrcmp(dvoid *envhp, CONST OraText *str1,
+ CONST OraText *str2, int flag);
+
+
+/*----------------------- OCIMultiByteStrncmp -------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrncmp - compare two strings in length
+ REMARKS
+ This function is similar to OCIMultiBytestrcmp(), except that at most
+ len1 bytes from str1 and len2 bytes from str2 are compared. The
+ null-terminator will be taken into the comparison.
+ RETURNS
+ 0, if str1 = str2
+ Positive, if str1 > str2
+ Negative, if str1 < str2
+ envhp(IN/OUT)
+ OCI environment handle to determine the character set.
+ str1(IN)
+ Pointer to the first string
+ len1(IN)
+ The length for the first string for comparison
+ str2(IN)
+ Pointer to the second string
+ len2(IN)
+ The length for the second string for comparison.
+ flag(IN)
+ It is used to decide the comparison method. It can be taken one of the
+ following values:
+ OCI_NLS_BINARY: for the binary comparison, this is default value.
+ OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+ This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+ comparison.
+*/
+int OCIMultiByteStrncmp(dvoid *envhp, CONST OraText *str1, size_t len1,
+ OraText *str2, size_t len2, int flag);
+
+
+/*----------------------- OCIMultiByteStrcat --------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrcat - concatenate multibyte strings
+ REMARKS
+ This function appends a copy of the multi-byte string pointed to by
+ srcstr, including the null-terminator to the end of string pointed to by
+ dststr. It returns the number of bytes in the result string not including
+ the ending null-terminator.
+ RETURNS
+ number of bytes in the result string not including the ending
+ null-terminator.
+ envhp(IN/OUT)
+ Pointer to OCI environment handle
+ dststr(IN/OUT)
+ Pointer to the destination multi-byte string for appending.
+ srcstr(IN)
+ Pointer to the source string to append.
+*/
+size_t OCIMultiByteStrcat(dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr);
+
+
+/*------------------------- OCIMultiByteStrcpy ------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrcpy - copy multibyte string
+ REMARKS
+ This function copies the multi-byte string pointed to by srcstr,
+ including the null-terminator, into the array pointed to by dststr. It
+ returns the number of bytes copied not including the ending
+ null-terminator.
+ RETURNS
+ number of bytes copied not including the ending null-terminator.
+ envhp(IN/OUT)
+ Pointer to the OCI environment handle.
+ srcstr(OUT)
+ Pointer to the destination buffer.
+ dststr(IN)
+ Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrcpy(dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr);
+
+
+/*----------------------- OCIMultiByteStrlen --------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrlen - Calculate multibyte string length
+ REMARKS
+ This function computes the number of bytes in the multi-byte string
+ pointed to by str, not including the null-terminator, and returns this
+ number.
+ RETURNS
+ number of bytes not including ending null-terminator.
+ str(IN)
+ Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrlen(dvoid *envhp, CONST OraText *str);
+
+
+/*----------------------- OCIMultiByteStrncat -------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrncat - concatenate string in length
+ REMARKS
+ This function is similar to OCIMultiBytestrcat(), except that at most n
+ bytes from srcstr are appended to dststr. Note that the null-terminator in
+ srcstr will stop appending and the function will append as many character
+ as possible within n bytes. dststr will be null-terminated.
+ RETURNS
+ Number of bytes in the result string not including the ending
+ null-terminator.
+ envhp(IN/OUT)
+ Pointer to OCI environment handle.
+ srcstr(IN/OUT)
+ Pointer to the destination multi-byte string for appending.
+ dststr(IN)
+ Pointer to the source multi-byte string to append.
+ n(IN)
+ Number of bytes from srcstr to append.
+*/
+size_t OCIMultiByteStrncat(dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr, size_t n);
+
+
+/*----------------------- OCIMultiByteStrncpy -------------------------------*/
+/*
+ NAME
+ OCIMultiByteStrncpy - copy multibyte string in length
+ REMARKS
+ This function is similar to OCIMultiBytestrcpy(), except that at most n
+ bytes are copied from the array pointed to by srcstr to the array pointed
+ to by dststr. Note that the null-terminator in srcstr will stop coping and
+ the function will copy as many character as possible within n bytes. The
+ result string will be null-terminated.
+ RETURNS
+ number of bytes copied not including the ending null-terminator.
+ envhp(IN/OUT)
+ Pointer to a OCI environment handle.
+ dststr(IN)
+ Pointer to the source multi-byte string.
+ srcstr(OUT)
+ Pointer to the destination buffer.
+ n(IN)
+ Number of bytes from srcstr to copy.
+*/
+size_t OCIMultiByteStrncpy(dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr, size_t n);
+
+
+/*----------------------- OCIMultiByteStrnDisplayLength ---------------------*/
+/*
+ NAME
+ OCIMultiByteStrnDisplayLength - calculate the display length for a
+ multibyt string
+ REMARKS
+ This function returns the number of display positions occupied by the
+ complete characters within the range of n bytes.
+ RETURNS
+ number of display positions.
+ envhp(IN/OUT)
+ OCI environment handle.
+ str(IN)
+ Pointer to a multi-byte string.
+ n(IN)
+ Number of bytes to examine.
+*/
+size_t OCIMultiByteStrnDisplayLength(dvoid *envhp, CONST OraText *str1,
+ size_t n);
+
+
+/*---------------------- OCIMultiByteStrCaseConversion ---------------------*/
+/*
+ NAME
+ OCIMultiByteStrCaseConversion
+ REMARKS
+ This function convert the multi-byte string pointed to by srcstr into the
+ uppercase or lowercase specified by flag and copies the result into the
+ array pointed to by dststr. The result string will be null-terminated.
+ RETURNS
+ number of bytes for result string not including null-terminator.
+ envhp(IN/OUT)
+ OCI environment handle.
+ dststr(OUT)
+ Pointer to destination array.
+ srcstr(IN)
+ Pointer to source string.
+ flag(IN)
+ Specify the case to convert:
+ OCI_NLS_UPPERCASE: convert to uppercase.
+ OCI_NLS_LOWERCASE: convert to lowercase.
+ This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the
+ linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIMultiByteStrCaseConversion(dvoid *envhp, OraText *dststr,
+ CONST OraText *srcstr, ub4 flag);
+
+
+/*------------------------- OCICharSetToUnicode -----------------------------*/
+/*
+ NAME
+ OCICharSetToUnicode - convert multibyte string into Unicode as UCS2
+ REMARKS
+ This function converts a multi-byte string pointed to by src to Unicode
+ into the array pointed to by dst. The conversion will stop when it reach
+ to the source limitation or destination limitation.
+ The function will return number of characters converted into Unicode.
+ If dstlen is zero, it will just return the number of characters for the
+ result without real conversion.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ Pointer to an OCI environment handle
+ dst(OUT)
+ Pointer to a destination buffer
+ dstlen(IN)
+ Size of destination buffer in character
+ src(IN)
+ Pointer to multi-byte source string.
+ srclen(IN)
+ Size of source string in bytes.
+ rsize(OUT)
+ Number of characters converted.
+ If it is a NULL pointer, nothing to return.
+*/
+sword OCICharSetToUnicode(dvoid *envhp, ub2 *dst, size_t dstlen,
+ CONST OraText *src, size_t srclen, size_t *rsize);
+
+
+/*------------------------- OCIUnicodeToCharSet -----------------------------*/
+/*
+ NAME
+ OCIUnicodeToCharSet - convert Unicode into multibyte
+ REMARKS
+ This function converts a Unicode string pointed to by src to multi-byte
+ into the array pointed to by dst. The conversion will stop when it reach
+ to the source limitation or destination limitation. The function will
+ return number of bytes converted into multi-byte. If dstlen is zero, it
+ will just return the number of bytes for the result without real
+ conversion. If a Unicode character is not convertible for the character
+ set specified in OCI environment handle, a replacement character will be
+ used for it. In this case, OCICharSetConversionIsReplacementUsed() will
+ return ture.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ Pointer to an OCI environment handle.
+ dst(OUT)
+ Pointer to a destination buffer.
+ dstlen(IN)
+ Size of destination buffer in byte.
+ src(IN)
+ Pointer to a Unicode string.
+ srclen(IN)
+ Size of source string in characters.
+ rsize(OUT)
+ Number of bytes converted.
+ If it is a NULL pointer, nothing to return.
+*/
+sword OCIUnicodeToCharSet(dvoid *envhp, OraText *dst, size_t dstlen,
+ CONST ub2 *src, size_t srclen, size_t *rsize);
+
+/*----------------------- OCINlsCharSetConvert ------------------------------*/
+/*
+ NAME
+ OCINlsCharSetConvert - convert between any two character set.
+ REMARKS
+ This function converts a string pointed to by src in the character set
+ specified with srcid to the array pointed to by dst in the character set
+ specified with dstid. The conversion will stop when it reaches the source
+ limitation or destination limitation. The function will return the number
+ of bytes converted into the destination buffer. Even though either source
+ or destination character set id is OCI_UTF16ID, given and return data
+ length will be represented with the byte length as this function is
+ intended for generic purpose. Note the conversion will not stop at null
+ data.
+ To get character set id from name, OCINlsCharSetNameToId can be used.
+ To check if derived data in the destination buffer contains any
+ replacement character resulting from conversion failure,
+ OCICharSetConversionIsReplacementUsed can be used to get the status.
+ Data alignment should be guaranteed by a caller. For example, UTF-16 data
+ should be aligned to ub2 type.
+
+ RETURNS
+ OCI_SUCCESS or OCI_ERROR.
+ errhp(IN/OUT)
+ OCI error handle. If there is an error, it is recorded in errhp and this
+ function returns a NULL pointer. Diagnostic information can be obtained
+ by calling OCIErrorGet().
+ dstid(IN)
+ Character set id for the destination buffer.
+ dstp(OUT)
+ Pointer to the destination buffer.
+ dstlen(IN)
+ The maximum byte size of destination buffer.
+ srcid(IN)
+ Character set id for the source buffer.
+ srcp(IN)
+ Pointer to the source buffer.
+ srclen(IN)
+ The length byte size of source buffer.
+ rsize(OUT)
+ The number of characters converted. If it is a NULL pointer, nothing to
+ return.
+*/
+sword OCINlsCharSetConvert(dvoid *envhp, OCIError *errhp,
+ ub2 dstid, dvoid *dstp, size_t dstlen,
+ ub2 srcid, CONST dvoid *srcp, size_t srclen,
+ size_t *rsize);
+
+
+/* ------------------- OCICharsetConversionIsReplacementUsed ----------------*/
+/*
+ NAME
+ OCICharsetConversionIsReplacementUsed - chech if replacement is used in
+ conversion
+ REMARKS
+ This function indicates whether or not the replacement character was used
+ for nonconvertible characters in character set conversion in last invoke
+ of OCICharsetUcs2ToMb().
+ RETURNS
+ TRUE is the replacement character was used in last OCICharsetUcs2ToMb()
+ invoking, else FALSE.
+ envhp(IN/OUT)
+ OCI environment handle. This should be the first handle passed to
+ OCICharsetUcs2ToMb().
+*/
+boolean OCICharSetConversionIsReplacementUsed(dvoid *envhp);
+
+/*------------------- OCINlsEnvironmentVariableGet -----------------*/
+/*
+ NAME
+ OCINlsEnvironmentVariableGet - get a value of NLS environment variable.
+
+ DESCRIPTION
+ This function retrieves a value of NLS environment variable to the buffer
+ pointed to by val. Data type is determined by the parameter specified by
+ item. Either numeric data or string data can be retrieved.
+
+ RETURNS
+ OCI_SUCCESS or OCI_ERROR.
+
+ PARAMETERS
+ valp(OUT) -
+ Pointer to the buffer.
+ size(IN) -
+ Size of the buffer. This argument is only applicable to string data type,
+ but not to numerical data, in such case, it is ignored.
+ item(IN) -
+ NLS item value, which can be one of following values:
+ OCI_NLS_CHARSET_ID - NLS_LANG character set id in ub2 data type.
+ OCI_NLS_NCHARSET_ID - NLS_NCHAR character set id in ub2 data type.
+ charset(IN) -
+ Character set id for retrieved string data. If it is 0, NLS_LANG will be
+ used. OCI_UTF16ID is a valid id. In case of numeric data, this argument
+ is ignored.
+ rsize(OUT) -
+ Size of return value.
+
+ NOTE
+ This functions is mainly used for retrieving character set id from either
+ NLS_LANG or NLS_NCHAR environment variables. If NLS_LANG is not set,
+ the default character set id is returned.
+ For future extension, the buffer is capable for storing other data types.
+*/
+sword OCINlsEnvironmentVariableGet(dvoid *valp, size_t size, ub2 item,
+ ub2 charset, size_t *rsize);
+
+
+/*------------------------- OCIMessageOpen ----------------------------------*/
+/*
+ NAME
+ OCIMessageOpen - open a locale message file
+ REMARKS
+ This function opens a message handle for facility of product in a language
+ pointed to by envhp. It first try to open the message file corresponding
+ to envhp for the facility. If it successes, it will use that file to
+ initialize a message handle, else it will use the default message file
+ which is for American language for the facility. The function return a
+ pointer pointed to a message handle into msghp parameter.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ A pointer to OCI environment handle for message language.
+ errhp(IN/OUT)
+ The OCI error handle. If there is an error, it is record in errhp and this
+ function returns a NULL pointer. Diagnostic information can be obtained by
+ calling OCIErrorGet().
+ msghp(OUT)
+ a message handle for return
+ product(IN)
+ A pointer to a product name. Product name is used to locate the directory
+ for message in a system dependent way. For example, in Solaris, the
+ directory of message files for the product `rdbms' is
+ `${ORACLE_HOME}/rdbms'.
+ facility(IN)
+ A pointer to a facility name in the product. It is used to construct a
+ message file name. A message file name follows the conversion with
+ facility as prefix. For example, the message file name for facility
+ `img' in American language will be `imgus.msb' where `us' is the
+ abbreviation of American language and `msb' as message binary file
+ extension.
+ dur(IN)
+ Duration for memory allocation for the return message handle. It can be
+ the following values:
+ OCI_DURATION_CALL
+ OCI_DURATION_STATEMENT
+ OCI_DURATION_SESSION
+ OCI_DURATION_TRANSACTION
+ For the detail description, please refer to Memory Related Service
+ Interfaces section.
+*/
+sword OCIMessageOpen(dvoid *envhp, OCIError *errhp, OCIMsg **msghp,
+ CONST OraText *product, CONST OraText *facility,
+ OCIDuration dur);
+
+
+/*------------------------- OCIMessageGet -----------------------------------*/
+/*
+ NAME
+ OCIMessageGet - get a locale message from a message handle
+ REMARKS
+ This function will get message with message number identified by msgno and
+ if buflen is not zero, the function will copy the message into the buffer
+ pointed to by msgbuf. If buflen is zero, the message will be copied into
+ a message buffer inside the message handle pointed to by msgh. For both
+ cases. it will return the pointer to the null-terminated message string.
+ If it cannot get the message required, it will return a NULL pointer.
+ RETURNS
+ A pointer to a null-terminated message string on success, otherwise a NULL
+ pointer.
+ msgh(IN/OUT)
+ Pointer to a message handle which was previously opened by
+ OCIMessageOpen().
+ msgno(IN)
+ The message number for getting message.
+ msgbuf(OUT)
+ Pointer to a destination buffer to the message retrieved. If buflen is
+ zero, it can be NULL pointer.
+ buflen(IN)
+ The size of the above destination buffer.
+*/
+OraText *OCIMessageGet(OCIMsg *msgh, ub4 msgno, OraText *msgbuf,
+ size_t buflen);
+
+/*------------------------- OCIMessageClose ---------------------------------*/
+/*
+ NAME
+ OCIMessageClose - close a message handle
+ REMARKS
+ This function closes a message handle pointed to by msgh and frees any
+ memory associated with this handle.
+ RETURNS
+ OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+ envhp(IN/OUT)
+ A pointer to OCI environment handle for message language.
+ errhp(IN/OUT)
+ The OCI error handle. If there is an error, it is record in errhp and this
+ function returns a NULL pointer. Diagnostic information can be obtained by
+ calling OCIErrorGet().
+ msghp(IN/OUT)
+ A pointer to a message handle which was previously opened by
+ OCIMessageOpen().
+*/
+sword OCIMessageClose(dvoid *envhp, OCIError *errhp, OCIMsg *msghp);
+
+/*--------------- End of Extensions to NLS cartridge service ----------------*/
+
+
+/*----------------- Extensions to OCI Thread interface ---------------------*/
+/*****************************************************************************
+ DESCRIPTION
+******************************************************************************
+1 Threads Interface
+
+The OCIThread package provides a number of commonly used threading
+primitives for use by Oracle customers. It offers a portable interface to
+threading capabilities native to various platforms. It does not implement
+threading on platforms which do not have native threading capability.
+
+OCIThread does not provide a portable implementation of multithreaded
+facilities. It only serves as a set of portable covers for native
+multithreaded facilities. Therefore, platforms that do not have native
+support for multi-threading will only be able to support a limited
+implementation of OCIThread. As a result, products that rely on all of
+OCIThread's functionality will not port to all platforms. Products that must
+port to all platforms must use only a subset of OCIThread's functionality.
+This issue is discussed further in later sections of this document.
+
+The OCIThread API is split into four main parts. Each part is described
+briefly here. The following subsections describe each in greater detail.
+
+ 1. Initialization and Termination Calls
+
+ These calls deal with the initialization and termination of OCIThread.
+ Initialization of OCIThread initializes the OCIThread context which is
+ a member of the OCI environment or session handle. This context is
+ required for other OCIThread calls.
+
+ 2. Passive Threading Primitives
+
+ The passive threading primitives include primitives to manipulate mutual
+ exclusion (mutex) locks, thread ID's, and thread-specific data keys.
+
+ The reason that these primitives are described as 'passive' is that while
+ their specifications allow for the existence of multiple threads, they do
+ not require it. This means that it is possible for these primitives to
+ be implemented according to specification in both single-threaded and
+ multi-threaded environments.
+
+ As a result, OCIThread clients that use only these primitives will not
+ require the existence of multiple threads in order to work correctly,
+ i.e., they will be able to work in single-threaded environments without
+ branching code.
+
+ 3. Active Threading Primitives
+
+ Active threading primitives include primitives dealing with the creation,
+ termination, and other manipulation of threads.
+
+ The reason that these primitives are described as 'active' is that they
+ can only be used in true multi-threaded environments. Their
+ specifications explicitly require that it be possible to have multiple
+ threads. If you need to determine at runtime whether or not you are in a
+ multi-threaded environment, call OCIThreadIsMulti() before calling an
+ OCIThread active primitive.
+
+
+1.1 Initialization & Termination
+==================================
+
+The types and functions described in this section are associated with the
+initialization and termination of the OCIThread package. OCIThread must
+be properly initialized before any of its functionality can be used.
+OCIThread's process initialization function, 'OCIThreadProcessInit()',
+must be called with care; see below.
+
+The observed behavior of the initialization and termination functions is the
+same regardless of whether OCIThread is in single-threaded or multi-threaded
+environment. It is OK to call the initialization functions from both generic
+and operating system specific (OSD) code.
+
+1.1.1 Types
+
+ OCIThreadContext - OCIThread Context
+ -------------------------------------
+
+ Most calls to OCIThread functions take the OCI environment or session
+ handle as a parameter. The OCIThread context is part of the OCI
+ environment or session handle and it must be initialized by calling
+ 'OCIThreadInit()'. Termination of the OCIThread context occurs by calling
+ 'OCIThreadTerm()'.
+
+ The OCIThread context is a private data structure. Clients must NEVER
+ attempt to examine the contents of the context.
+
+1.1.2 OCIThreadProcessInit
+
+ OCIThreadProcessInit - OCIThread Process INITialization
+ --------------------------------------------------------
+
+ Description
+
+ This function should be called to perform OCIThread process
+ initialization.
+
+ Prototype
+
+ void OCIThreadProcessInit();
+
+ Returns
+
+ Nothing.
+
+ Notes
+
+ Whether or not this function needs to be called depends on how OCI
+ Thread is going to be used.
+
+ * In a single-threaded application, calling this function is optional.
+ If it is called at all, the first call to it must occur before calls
+ to any other OCIThread functions. Subsequent calls can be made
+ without restriction; they will not have any effect.
+
+ * In a multi-threaded application, this function MUST be called. The
+ first call to it MUST occur 'strictly before' any other OCIThread
+ calls; i.e., no other calls to OCIThread functions (including other
+ calls to this one) can be concurrent with the first call.
+ Subsequent calls to this function can be made without restriction;
+ they will not have any effect.
+
+
+1.1.3 OCIThreadInit
+
+ OCIThreadInit - OCIThread INITialize
+ -------------------------------------
+
+ Description
+
+ This initializes OCIThread context.
+
+ Prototype
+
+ sword OCIThreadInit(dvoid *hndl, OCIError *err);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal for OCIThread clients to try an examine the memory
+ pointed to by the returned pointer.
+
+ It is safe to make concurrent calls to 'OCIThreadInit()'. Unlike
+ 'OCIThreadProcessInit()', there is no need to have a first call
+ that occurs before all the others.
+
+ The first time 'OCIThreadInit()' is called, it initilaizes the OCI
+ Thread context. It also saves a pointer to the context in some system
+ dependent manner. Subsequent calls to 'OCIThreadInit()' will return
+ the same context.
+
+ Each call to 'OCIThreadInit()' must eventually be matched by a call to
+ 'OCIThreadTerm()'.
+
+ OCIThreadTerm - OCIThread TERMinate
+ ------------------------------------
+
+ Description
+
+ This should be called to release the OCIThread context. It should be
+ called exactly once for each call made to 'OCIThreadInit()'.
+
+ Prototype
+
+ sword OCIThreadTerm(dvoid *hndl, OCIError *err);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is safe to make concurrent calls to 'OCIThreadTerm()'.
+
+ 'OCIThreadTerm()' will not do anything until it has been called as
+ many times as 'OCIThreadInit()' has been called. When that happens,
+ it terminates the OCIThread layer and frees the memory allocated for
+ the context. Once this happens, the context should not be re-used.
+ It will be necessary to obtain a new one by calling 'OCIThreadInit()'.
+
+
+ OCIThreadIsMulti - OCIThread Is Multi-Threaded?
+ ------------------------------------------------
+
+ Description
+
+ This tells the caller whether the application is running in a
+ multi-threaded environment or a single-threaded environment.
+
+ Prototype
+ boolean OCIThreadIsMulti(void);
+
+ Returns
+
+ TRUE if the environment is multi-threaded;
+ FALSE if the environment is single-threaded.
+
+
+1.2 Passive Threading Primitives
+==================================
+
+1.2.1 Types
+
+The passive threading primitives deal with the manipulation of mutex,
+thread ID's, and thread-specific data. Since the specifications of these
+primitives do not require the existence of multiple threads, they can be
+used both on multithreaded and single-threaded platforms.
+
+1.2.1.1 OCIThreadMutex - OCIThread Mutual Exclusion Lock
+-----------------------------------------------------------
+
+ The type 'OCIThreadMutex' is used to represent a mutual exclusion lock
+ (mutex). A mutex is typically used for one of two purposes: (i) to
+ ensure that only one thread accesses a given set of data at a time, or
+ (ii) to ensure that only one thread executes a given critical section of
+ code at a time.
+
+ Mutexes pointer can be declared as parts of client structures or as
+ stand-alone variables. Before they can be used, they must be initialized
+ using 'OCIThreadMutexInit()'. Once they are no longer needed, they must be
+ destroyed using 'OCIThreadMutexDestroy()'. A mutex pointer must NOT be
+ used after it is destroyed.
+
+ A thread can acquire a mutex by using either 'OCIThreadMutexAcquire()' or
+ 'OCIThreadMutexTry()'. They both ensure that only one thread at a time is
+ allowed to hold a given mutex. A thread that holds a mutex can release it
+ by calling 'OCIThreadMutexRelease()'.
+
+
+1.2.1.2 OCIThreadKey - OCIThread Key for Thread-Specific Data
+----------------------------------------------------------------
+
+ A key can be thought of as a process-wide variable that has a
+ thread-specific value. What this means is that all the threads in a
+ process can use any given key. However, each thread can examine or modify
+ that key independently of the other threads. The value that a thread sees
+ when it examines the key will always be the same as the value that it last
+ set for the key. It will not see any values set for the key by the other
+ threads.
+
+ The type of the value held by a key is a 'dvoid *' generic pointer.
+
+ Keys can be created using 'OCIThreadKeyInit()'. When a key is created, its
+ value is initialized to 'NULL' for all threads.
+
+ A thread can set a key's value using 'OCIThreadKeySet()'. A thread can
+ get a key's value using 'OCIThreadKeyGet()'.
+
+ The OCIThread key functions will save and retrieve data SPECIFIC TO THE
+ THREAD. When clients maintain a pool of threads and assign the threads to
+ different tasks, it *may not* be appropriate for a task to use OCIThread
+ key functions to save data associated with it. Here is a scenario of how
+ things can fail: A thread is assigned to execute the initialization of a
+ task. During the initialization, the task stored some data related to it
+ in the thread using OCIThread key functions. After the initialization,
+ the thread is returned back to the threads pool. Later, the threads pool
+ manager assigned another thread to perform some operations on the task,
+ and the task needs to retrieve those data it stored earlier in
+ initialization. Since the task is running in another thread, it will not
+ be able to retrieve the same data back! Applications that use thread
+ pools should be aware of this and be cautious when using OCIThread key
+ functions.
+
+
+1.2.1.3 OCIThreadKeyDestFunc - OCIThread Key Destructor Function Type
+------------------------------------------------------------------------
+
+ This is the type of a pointer to a key's destructor routine. Keys can be
+ associated with a destructor routine when they are created (see
+ 'OCIThreadKeyInit()').
+
+ A key's destructor routine will be called whenever a thread that has a
+ non-NULL value for the key terminates.
+
+ The destructor routine returns nothing and takes one parameter. The
+ parameter will be the value that was set for key when the thread
+ terminated.
+
+ The destructor routine is guaranteed to be called on a thread's value
+ in the key after the termination of the thread and before process
+ termination. No more precise guarantee can be made about the timing
+ of the destructor routine call; thus no code in the process may assume
+ any post-condition of the destructor routine. In particular, the
+ destructor is not guaranteed to execute before a join call on the
+ terminated thread returns.
+
+
+1.2.1.4 OCIThreadId - OCIThread Thread ID
+--------------------------------------------
+
+ Type 'OCIThreadId' is the type that will be used to identify a thread.
+ At any given time, no two threads will ever have the same 'OCIThreadId'.
+ However, 'OCIThreadId' values can be recycled; i.e., once a thread dies,
+ a new thread may be created that has the same 'OCIThreadId' as the one
+ that died. In particular, the thread ID must uniquely identify a thread
+ T within a process, and it must be consistent and valid in all threads U
+ of the process for which it can be guaranteed that T is running
+ concurrently with U. The thread ID for a thread T must be retrievable
+ within thread T. This will be done via OCIThreadIdGet().
+
+ The 'OCIThreadId' type supports the concept of a NULL thread ID: the NULL
+ thread ID will never be the same as the ID of an actual thread.
+
+
+
+1.2.2 Function prototypes for passive primitives
+--------------------------------------------------
+
+1.2.2.1 Mutex functions
+-------------------------
+
+ OCIThreadMutexInit - OCIThread MuteX Initialize
+ -----------------------------------------------
+
+ Description
+
+ This allocate and initializes a mutex. All mutexes must be
+ initialized prior to use.
+
+ Prototype
+
+ sword OCIThreadMutexInit(dvoid *hndl, OCIError *err,
+ OCIThreadMutex **mutex);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ mutex(OUT): The mutex to initialize.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ Multiple threads must not initialize the same mutex simultaneously.
+ Also, a mutex must not be reinitialized until it has been destroyed (see
+ 'OCIThreadMutexDestroy()').
+
+ OCIThreadMutexDestroy - OCIThread MuteX Destroy
+ -----------------------------------------------
+
+ Description
+
+ This destroys and deallocate a mutex. Each mutex must be destroyed
+ once it is no longer needed.
+
+ Prototype
+
+ sword OCIThreadMutexDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadMutex **mutex);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ mutex(IN/OUT): The mutex to destroy.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is not legal to destroy a mutex that is uninitialized or is currently
+ held by a thread. The destruction of a mutex must not occur concurrently
+ with any other operations on the mutex. A mutex must not be used after
+ it has been destroyed.
+
+
+ OCIThreadMutexAcquire - OCIThread MuteX Acquire
+ -----------------------------------------------
+
+ Description
+
+ This acquires a mutex for the thread in which it is called. If the mutex
+ is held by another thread, the calling thread is blocked until it can
+ acquire the mutex.
+
+ Prototype
+
+ sword OCIThreadMutexAcquire(dvoid *hndl, OCIError *err,
+ OCIThreadMutex *mutex);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error, it is
+ recorded in err and this function returns OCI_ERROR.
+ Diagnostic information can be obtained by calling
+ OCIErrorGet().
+
+ mutex(IN/OUT): The mutex to acquire.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal to attempt to acquire an uninitialized mutex.
+
+ This function's behavior is undefined if it is used by a thread to
+ acquire a mutex that is already held by that thread.
+
+
+
+ OCIThreadMutexRelease - OCIThread MuteX Release
+ -----------------------------------------------
+
+ Description
+
+ This releases a mutex. If there are any threads blocked on the mutex,
+ one of them will acquire it and become unblocked.
+
+ Prototype
+
+ sword OCIThreadMutexRelease(dvoid *hndl, OCIError *err,
+ OCIThreadMutex *mutex);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ mutex(IN/OUT): The mutex to release.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal to attempt to release an uninitialized mutex. It is also
+ illegal for a thread to release a mutex that it does not hold.
+
+
+ OCIThreadKeyInit - OCIThread KeY Initialize
+ -------------------------------------------
+
+ Description
+
+ This creates a key. Each call to this routine allocate and generates
+ a new key that is distinct from all other keys.
+
+ Prototype
+
+ sword OCIThreadKeyInit(dvoid *hndl, OCIError *err, OCIThreadKey **key,
+ OCIThreadKeyDestFunc destFn);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ key(OUT): The 'OCIThreadKey' in which to create the new key.
+
+ destFn(IN): The destructor for the key. NULL is permitted.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ Once this function executes successfully, a pointer to an allocated and
+ initialized key is return. That key can be used with 'OCIThreadKeyGet()'
+ and 'OCIThreadKeySet()'. The initial value of the key will be 'NULL' for
+ all threads.
+
+ It is illegal for this function to be called more than once to create the
+ same key (i.e., to be called more than once with the same value for the
+ 'key' parameter).
+
+ If the 'destFn' parameter is not NULL, the routine pointed to by 'destFn'
+ will be called whenever a thread that has a non-NULL value for the key
+ terminates. The routine will be called with one parameter. The
+ parameter will be the key's value for the thread at the time at which the
+ thread terminated.
+ If the key does not need a destructor function, pass NULL for 'destFn'.
+
+
+ OCIThreadKeyDestroy - OCIThread KeY DESTROY
+ -------------------------------------------
+
+ Description
+
+ Destroy and deallocate the key pointed to by 'key'.
+
+ Prototype
+
+ sword OCIThreadKeyDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadKey **key);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ key(IN/OUT): The 'OCIThreadKey' in which to destroy the key.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ This is different from the destructor function callback passed to the
+ key create routine. This new destroy function 'OCIThreadKeyDestroy' is
+ used to terminate any resources OCI THREAD acquired when it created
+ 'key'. [The 'OCIThreadKeyDestFunc' callback type is a key VALUE
+ destructor; it does in no way operate on the key itself.]
+
+ This must be called once the user has finished using the key. Not
+ calling the key destroy function may result in memory leaks.
+
+
+
+
+1.2.2.2 Thread Key operations
+-------------------------------
+
+ OCIThreadKeyGet - OCIThread KeY Get value
+ -----------------------------------------
+
+ Description
+
+ This gets the calling thread's current value for a key.
+
+ Prototype
+
+ sword OCIThreadKeyGet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+ dvoid **pValue);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ key(IN): The key.
+
+ pValue(IN/OUT): The location in which to place the thread-specific
+ key value.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal to use this function on a key that has not been created
+ using 'OCIThreadKeyInit()'.
+
+ If the calling thread has not yet assigned a value to the key, 'NULL' is
+ placed in the location pointed to by 'pValue'.
+
+
+ OCIThreadKeySet - OCIThread KeY Set value
+ -----------------------------------------
+
+ Description
+
+ This sets the calling thread's value for a key.
+
+ Prototype
+
+ sword OCIThreadKeySet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+ dvoid *value);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ key(IN/OUT): The key.
+
+ value(IN): The thread-specific value to set in the key.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ It is illegal to use this function on a key that has not been created
+ using 'OCIThreadKeyInit()'.
+
+1.2.2.3 Thread Id
+--------------------
+
+ OCIThreadIdInit - OCIThread Thread Id INITialize
+ --------------------------------------------------
+
+ Description
+
+ Allocate and initialize the thread id 'tid'.
+
+ Prototype
+
+ sword OCIThreadIdInit(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid (OUT): Pointer to the thread ID to initialize.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+ OCIThreadIdDestroy - OCIThread Thread Id DESTROY
+ --------------------------------------------------
+
+ Description
+
+ Destroy and deallocate the thread id 'tid'.
+
+ Prototype
+
+ sword OCIThreadIdDestroy(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid(IN/OUT): Pointer to the thread ID to destroy.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Note
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+
+ OCIThreadIdSet - OCIThread Thread Id Set
+ -----------------------------------------
+
+ Description
+
+ This sets one 'OCIThreadId' to another.
+
+ Prototype
+
+ sword OCIThreadIdSet(dvoid *hndl, OCIError *err,
+ OCIThreadId *tidDest,
+ OCIThreadId *tidSrc);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tidDest(OUT): This should point to the location of the 'OCIThreadId'
+ to be set to.
+
+ tidSrc(IN): This should point to the 'OCIThreadId' to set from.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+
+ OCIThreadIdSetNull - OCIThread Thread Id Set Null
+ ---------------------------------------------------------
+
+ Description
+
+ This sets the NULL thread ID to a given 'OCIThreadId'.
+
+ Prototype
+
+ sword OCIThreadIdSetNull(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error, it is
+ recorded in err and this function returns OCI_ERROR.
+ Diagnostic information can be obtained by calling
+ OCIErrorGet().
+
+ tid(OUT): This should point to the 'OCIThreadId' in which to put
+ the NULL thread ID.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+
+ OCIThreadIdGet - OCIThread Thread Id Get
+ ------------------------------------------
+
+ Description
+
+ This retrieves the 'OCIThreadId' of the thread in which it is called.
+
+ Prototype
+
+ sword OCIThreadIdGet(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid(OUT): This should point to the location in which to place the
+ ID of the calling thread.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+ When OCIThread is used in a single-threaded environment,
+ OCIThreadIdGet() will always place the same value in the location
+ pointed to by 'tid'. The exact value itself is not important. The
+ important thing is that it is not the same as the NULL thread ID and
+ that it is always the same value.
+
+
+ OCIThreadIdSame - OCIThread Thread Ids Same?
+ ----------------------------------------------
+
+ Description
+
+ This determines whether or not two 'OCIThreadId's represent the same
+ thread.
+
+ Prototype
+
+ sword OCIThreadIdSame(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid1, OCIThreadId *tid2,
+ boolean *result);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid1(IN): Pointer to the first 'OCIThreadId'.
+
+ tid2(IN): Pointer to the second 'OCIThreadId'.
+
+ result(IN/OUT): Pointer to the result.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ If 'tid1' and 'tid2' represent the same thread, 'result' is set to TRUE.
+ Otherwise, 'result' is set to FALSE.
+
+ 'result' is set to TRUE if both 'tid1' and 'tid2' are the NULL thread ID.
+
+ 'ti1d' and 'tid2' should be initialized by OCIThreadIdInit().
+
+
+ OCIThreadIdNull - OCIThread Thread Id NULL?
+ ---------------------------------------------
+
+ Description
+
+ This determines whether or not a given 'OCIThreadId' is the NULL thread
+ ID.
+
+ Prototype
+
+ sword OCIThreadIdNull(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid,
+ boolean *result);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tid(IN): Pointer to the 'OCIThreadId' to check.
+
+ result(IN/OUT): Pointer to the result.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ If 'tid' is the NULL thread ID, 'result' is set to TRUE. Otherwise,
+ 'result' is set to FALSE.
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+
+1.3 Active Threading Primitives
+=================================
+
+The active threading primitives deal with the manipulation of actual
+threads. Because the specifications of most of these primitives require
+that it be possible to have multiple threads, they work correctly only in
+the enabled OCIThread; In the disabled OCIThread, they always return
+failure. The exception is OCIThreadHandleGet(); it may be called in a
+single-threaded environment, in which case it will have no effect.
+
+Active primitives should only be called by code running in a multi-threaded
+environment. You can call OCIThreadIsMulti() to determine whether the
+environment is multi-threaded or single-threaded.
+
+
+1.3.1 Types
+--------------
+
+1.3.1.1 OCIThreadHandle - OCIThread Thread Handle
+------------------------------------------------------
+
+ Type 'OCIThreadHandle' is used to manipulate a thread in the active
+ primitives: OCIThreadJoin()and OCIThreadClose(). A thread handle opened by
+ OCIThreadCreate() must be closed in a matching call to
+ OCIThreadClose(). A thread handle is invalid after the call to
+ OCIThreadClose().
+
+ The distinction between a thread ID and a thread handle in OCIThread usage
+ follows the distinction between the thread ID and the thread handle on
+ Windows NT. On many platforms, the underlying native types are the same.
+
+
+1.3.2 Functions
+------------------
+
+ OCIThreadHndInit - OCIThread HaNDle Initialize
+ ----------------------------------------------
+
+ Description
+
+ Allocate and initialize the thread handle.
+
+ Prototype
+
+ sword OCIThreadHndInit(dvoid *hndl, OCIError *err,
+ OCIThreadHandle **thnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ thnd(OUT): The address of pointer to the thread handle to initialize.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+ OCIThreadHndDestroy - OCIThread HaNDle Destroy
+ ----------------------------------------------
+
+ Description
+
+ Destroy and deallocate the thread handle.
+
+ Prototype
+
+ sword OCIThreadHndDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadHandle **thnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ thnd(IN/OUT): The address of pointer to the thread handle to destroy.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+
+ OCIThreadCreate - OCIThread Thread Create
+ -----------------------------------------
+
+ Description
+
+ This creates a new thread.
+
+ Prototype
+
+ sword OCIThreadCreate(dvoid *hndl, OCIError *err,
+ void (*start)(dvoid *), dvoid *arg,
+ OCIThreadId *tid, OCIThreadHandle *tHnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ start(IN): The function in which the new thread should begin
+ execution.
+
+ arg(IN): The argument to give the function pointed to by 'start'.
+
+ tid(IN/OUT): If not NULL, gets the ID for the new thread.
+
+ tHnd(IN/OUT): If not NULL, gets the handle for the new thread.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ The new thread will start by executing a call to the function pointed
+ to by 'start' with the argument given by 'arg'. When that function
+ returns, the new thread will terminate. The function should not
+ return a value and should accept one parameter, a 'dvoid *'.
+
+ The call to OCIThreadCreate() must be matched by a call to
+ OCIThreadClose() if and only if tHnd is non-NULL.
+
+ If tHnd is NULL, a thread ID placed in *tid will not be valid in the
+ calling thread because the timing of the spawned thread's termination
+ is unknown.
+
+ 'tid' should be initialized by OCIThreadIdInit().
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+
+
+ OCIThreadJoin - OCIThread Thread Join
+ -------------------------------------
+
+ Description
+
+ This function allows the calling thread to 'join' with another thread.
+ It blocks the caller until the specified thread terminates.
+
+ Prototype
+
+ sword OCIThreadJoin(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tHnd(IN): The 'OCIThreadHandle' of the thread to join with.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+ The result of multiple threads all trying to join with the same thread is
+ undefined.
+
+
+ OCIThreadClose - OCIThread Thread Close
+ ---------------------------------------
+
+ Description
+
+ This function should be called to close a thread handle.
+
+ Prototype
+
+ sword OCIThreadClose(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tHnd(IN/OUT): The OCIThread thread handle to close.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+ Both thread handle and the thread ID that was returned by the same call
+ to OCIThreadCreate() are invalid after the call to OCIThreadClose().
+
+
+
+ OCIThreadHandleGet - OCIThread Thread Get Handle
+ ------------------------------------------------
+
+ Description
+
+ Retrieve the 'OCIThreadHandle' of the thread in which it is called.
+
+ Prototype
+
+ sword OCIThreadHandleGet(dvoid *hndl, OCIError *err,
+ OCIThreadHandle *tHnd);
+
+ hndl(IN/OUT): The OCI environment or session handle.
+
+ err(IN/OUT): The OCI error handle. If there is an error and OCI_ERROR
+ is returned, the error is recorded in err and diagnostic
+ information can be obtained by calling OCIErrorGet().
+
+ tHnd(IN/OUT): If not NULL, the location to place the thread
+ handle for the thread.
+
+ Returns
+
+ OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+ Notes
+
+ 'thnd' should be initialized by OCIThreadHndInit().
+
+ The thread handle 'tHnd' retrieved by this function must be closed
+ with OCIThreadClose() and destroyed by OCIThreadHndDestroy() after it
+ is used.
+
+
+
+
+1.4 Using OCIThread
+=====================
+
+This section summarizes some of the more important details relating to the use
+of OCIThread.
+
+ * Process initialization
+
+ OCIThread only requires that the process initialization function
+ ('OCIThreadProcessInit()') be called when OCIThread is being used in a
+ multi-threaded application. Failing to call 'OCIThreadProcessInit()' in
+ a single-threaded application is not an error.
+
+ * OCIThread initialization
+
+ Separate calls to 'OCIThreadInit()' will all return the same OCIThread
+ context.
+
+ Also, remember that each call to 'OCIThreadInit()' must eventually be
+ matched by a call to 'OCIThreadTerm()'.
+
+ * Active vs. Passive Threading primitives
+
+ OCIThread client code written without using any active primitives can be
+ compiled and used without change on both single-threaded and
+ multi-threaded platforms.
+
+ OCIThread client code written using active primitives will only work
+ correctly on multi-threaded platforms. In order to write a version of the
+ same application to run on single-threaded platform, it is necessary to
+ branch the your code, whether by branching versions of the source file or
+ by branching at runtime with the OCIThreadIsMulti() call.
+
+******************************************************************************/
+
+/*****************************************************************************
+ ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+
+void OCIThreadProcessInit();
+
+sword OCIThreadInit(dvoid *hndl, OCIError *err);
+
+sword OCIThreadTerm(dvoid *hndl, OCIError *err);
+
+boolean OCIThreadIsMulti();
+
+sword OCIThreadMutexInit(dvoid *hndl, OCIError *err,
+ OCIThreadMutex **mutex);
+
+sword OCIThreadMutexDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadMutex **mutex);
+
+sword OCIThreadMutexAcquire(dvoid *hndl, OCIError *err,
+ OCIThreadMutex *mutex);
+
+sword OCIThreadMutexRelease(dvoid *hndl, OCIError *err,
+ OCIThreadMutex *mutex);
+
+sword OCIThreadKeyInit(dvoid *hndl, OCIError *err, OCIThreadKey **key,
+ OCIThreadKeyDestFunc destFn);
+
+sword OCIThreadKeyDestroy(dvoid *hndl, OCIError *err,
+ OCIThreadKey **key);
+
+sword OCIThreadKeyGet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+ dvoid **pValue);
+
+sword OCIThreadKeySet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+ dvoid *value);
+
+sword OCIThreadIdInit(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+sword OCIThreadIdDestroy(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+sword OCIThreadIdSet(dvoid *hndl, OCIError *err,
+ OCIThreadId *tidDest, OCIThreadId *tidSrc);
+
+sword OCIThreadIdSetNull(dvoid *hndl, OCIError *err, OCIThreadId *tid);
+
+sword OCIThreadIdGet(dvoid *hndl, OCIError *err, OCIThreadId *tid);
+
+sword OCIThreadIdSame(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid1, OCIThreadId *tid2,
+ boolean *result);
+
+sword OCIThreadIdNull(dvoid *hndl, OCIError *err,
+ OCIThreadId *tid, boolean *result);
+
+sword OCIThreadHndInit(dvoid *hndl, OCIError *err, OCIThreadHandle **thnd);
+
+sword OCIThreadHndDestroy(dvoid *hndl, OCIError *err, OCIThreadHandle **thnd);
+
+sword OCIThreadCreate(dvoid *hndl, OCIError *err,
+ void (*start)(dvoid *), dvoid *arg,
+ OCIThreadId *tid, OCIThreadHandle *tHnd);
+
+sword OCIThreadJoin(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+sword OCIThreadClose(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+sword OCIThreadHandleGet(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+/*----------------- End OCI Thread interface Extensions ---------------------*/
+
+/*--------------- Begin OCI Client Notification Interfaces ------------------*/
+
+typedef ub4 (*OCISubscriptionNotify)(dvoid *ctx, OCISubscription *subscrhp,
+ dvoid *pay, ub4 payl,
+ dvoid *desc, ub4 mode);
+
+sword OCISubscriptionRegister(OCISvcCtx *svchp, OCISubscription **subscrhpp,
+ ub2 count, OCIError *errhp, ub4 mode);
+
+
+sword OCISubscriptionPost(OCISvcCtx *svchp, OCISubscription **subscrhpp,
+ ub2 count, OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionUnRegister(OCISvcCtx *svchp, OCISubscription *subscrhp,
+ OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionDisable(OCISubscription *subscrhp,
+ OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionEnable(OCISubscription *subscrhp,
+ OCIError *errhp, ub4 mode);
+
+/*------------------- End OCI Publish/Subscribe Interfaces ------------------*/
+
+/*----------------- Extensions to Datetime interfaces -----------------------*/
+/*--------------------- Actual Prototypes -----------------------------------*/
+sword OCIDateTimeGetTime(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ ub1 *hr, ub1 *mm, ub1 *ss, ub4 *fsec);
+
+sword OCIDateTimeGetDate(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ sb2 *yr, ub1 *mnth, ub1 *dy );
+
+sword OCIDateTimeGetTimeZoneOffset(dvoid *hndl,OCIError *err,
+ CONST OCIDateTime *datetime,sb1 *hr,sb1 *mm);
+
+sword OCIDateTimeConstruct(dvoid *hndl,OCIError *err,OCIDateTime *datetime,
+ sb2 yr,ub1 mnth,ub1 dy,ub1 hr,ub1 mm,ub1 ss,ub4 fsec,
+ OraText *timezone,size_t timezone_length);
+
+sword OCIDateTimeSysTimeStamp(dvoid *hndl, OCIError *err,
+ OCIDateTime *sys_date );
+
+sword OCIDateTimeAssign(dvoid *hndl, OCIError *err, CONST OCIDateTime *from,
+ OCIDateTime *to);
+
+sword OCIDateTimeToText(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ CONST OraText *fmt, ub1 fmt_length, ub1 fsprec,
+ CONST OraText *lang_name, size_t lang_length,
+ ub4 *buf_size, OraText *buf );
+
+sword OCIDateTimeFromText(dvoid *hndl, OCIError *err, CONST OraText *date_str,
+ size_t dstr_length, CONST OraText *fmt, ub1 fmt_length,
+ CONST OraText *lang_name, size_t lang_length, OCIDateTime *date );
+
+sword OCIDateTimeCompare(dvoid *hndl, OCIError *err, CONST OCIDateTime *date1,
+ CONST OCIDateTime *date2, sword *result );
+
+sword OCIDateTimeCheck(dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+ ub4 *valid );
+
+sword OCIDateTimeConvert(dvoid *hndl, OCIError *err, OCIDateTime *indate,
+ OCIDateTime *outdate);
+
+sword OCIDateTimeSubtract(dvoid *hndl, OCIError *err, OCIDateTime *indate1,
+ OCIDateTime *indate2, OCIInterval *inter);
+
+sword OCIDateTimeIntervalAdd(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ OCIInterval *inter, OCIDateTime *outdatetime);
+
+sword OCIDateTimeIntervalSub(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+ OCIInterval *inter, OCIDateTime *outdatetime);
+
+sword OCIIntervalSubtract(dvoid *hndl, OCIError *err, OCIInterval *minuend,
+ OCIInterval *subtrahend, OCIInterval *result );
+
+sword OCIIntervalAdd(dvoid *hndl, OCIError *err, OCIInterval *addend1,
+ OCIInterval *addend2, OCIInterval *result );
+
+sword OCIIntervalMultiply(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ OCINumber *nfactor, OCIInterval *result );
+
+sword OCIIntervalDivide(dvoid *hndl, OCIError *err, OCIInterval *dividend,
+ OCINumber *divisor, OCIInterval *result );
+
+sword OCIIntervalCompare(dvoid *hndl, OCIError *err, OCIInterval *inter1,
+ OCIInterval *inter2, sword *result );
+
+sword OCIIntervalFromNumber(dvoid *hndl, OCIError *err, OCIInterval *inter,
+ OCINumber *number);
+
+sword OCIIntervalFromText( dvoid *hndl, OCIError *err, CONST OraText *inpstr,
+ size_t str_len, OCIInterval *result );
+
+sword OCIIntervalToText( dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+ ub1 lfprec, ub1 fsprec,
+ OraText *buffer, size_t buflen, size_t *resultlen );
+
+sword OCIIntervalToNumber(dvoid *hndl, OCIError *err,CONST OCIInterval *inter,
+ OCINumber *number);
+
+sword OCIIntervalCheck(dvoid *hndl, OCIError *err, CONST OCIInterval *interval,
+ ub4 *valid );
+
+sword OCIIntervalAssign(dvoid *hndl, OCIError *err, CONST OCIInterval *ininter,
+ OCIInterval *outinter );
+
+sword OCIIntervalSetYearMonth(dvoid *hndl, OCIError *err, sb4 yr, sb4 mnth,
+ OCIInterval *result );
+
+sword OCIIntervalGetYearMonth(dvoid *hndl, OCIError *err, sb4 *yr, sb4 *mnth,
+ CONST OCIInterval *result );
+
+sword OCIIntervalSetDaySecond(dvoid *hndl, OCIError *err, sb4 dy, sb4 hr,
+ sb4 mm, sb4 ss, sb4 fsec, OCIInterval *result );
+
+sword OCIIntervalGetDaySecond(dvoid *hndl, OCIError *err, sb4 *dy, sb4 *hr,
+ sb4 *mm, sb4 *ss, sb4 *fsec, CONST OCIInterval *result );
+
+sword OCIDateTimeToArray(dvoid *hndl, OCIError *err,
+ CONST OCIDateTime *datetime, CONST OCIInterval *reftz,
+ ub1 *outarray, ub4 *len, ub1 fsprec);
+
+sword OCIDateTimeFromArray(dvoid *hndl, OCIError *err, ub1 *inarray, ub4 len,
+ ub1 type, OCIDateTime *datetime,
+ CONST OCIInterval *reftz, ub1 fsprec);
+
+sword OCIDateTimeGetTimeZoneName(dvoid *hndl, OCIError *err,
+ CONST OCIDateTime *datetime,
+ ub1 *buf, ub4 *buflen);
+
+sword OCIIntervalFromTZ(dvoid *hndl, OCIError *err, CONST oratext *inpstring,
+ size_t str_len, OCIInterval *result);
+
+/*----------------- End Datetime interface Extensions -----------------------*/
+
+/*----------------- Connection Pooling prototypes ---------------------------*/
+sword OCIConnectionPoolCreate(OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp,
+ OraText **poolName, sb4 *poolNameLen,
+ CONST OraText *dblink, sb4 dblinkLen,
+ ub4 connMin, ub4 connMax, ub4 connIncr,
+ CONST OraText *poolUserName, sb4 poolUserLen,
+ CONST OraText *poolPassword, sb4 poolPassLen,
+ ub4 mode);
+
+sword OCIConnectionPoolDestroy(OCICPool *poolhp,
+ OCIError *errhp, ub4 mode);
+
+/*----------------- End Connection Pooling prototypes -----------------------*/
+
+/*-------------------- Session Pooling prototypes ---------------------------*/
+
+sword OCISessionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCISPool *spoolhp,
+ OraText **poolName, ub4 *poolNameLen,
+ CONST OraText *connStr, ub4 connStrLen,
+ ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+ OraText *userid, ub4 useridLen,
+ OraText *password, ub4 passwordLen,
+ ub4 mode);
+
+sword OCISessionPoolDestroy (OCISPool *spoolhp,
+ OCIError *errhp,
+ ub4 mode);
+
+sword OCISessionGet (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+ OCIAuthInfo *authhp,
+ OraText *poolName, ub4 poolName_len,
+ CONST OraText *tagInfo, ub4 tagInfo_len,
+ OraText **retTagInfo, ub4 *retTagInfo_len,
+ boolean *found, ub4 mode);
+
+sword OCISessionRelease (OCISvcCtx *svchp, OCIError *errhp,
+ OraText *tag, ub4 tag_len,
+ ub4 mode);
+
+/*-------------------- End Session Pooling prototypes -----------------------*/
+
+sword OCIXMLTypeNew(OCISvcCtx *svchp, OCIError *errhp, OCIDuration dur,
+ OraText *elname, ub4 elname_Len,
+ OraText *schemaURL, ub4 schemaURL_Len,
+ OCIXMLType **retInstance);
+
+sword OCIXMLTypeCreateFromSrc(OCISvcCtx *svchp, OCIError *errhp,
+ OCIDuration dur, ub1 src_type, dvoid *src_ptr,
+ sb4 ind, OCIXMLType **retInstance);
+
+sword OCIXMLTypeExtract(OCIError *errhp,
+ OCIXMLType *doc, OCIDuration dur,
+ OraText *xpathexpr, ub4 xpathexpr_Len,
+ OraText *nsmap, ub4 nsmap_Len,
+ OCIXMLType **retDoc);
+
+sword OCIXMLTypeTransform(OCIError *errhp, OCIDuration dur,
+ OCIXMLType *doc, OCIXMLType *xsldoc,
+ OCIXMLType **retDoc);
+
+sword OCIXMLTypeExists(OCIError *errhp, OCIXMLType *doc,
+ OraText *xpathexpr, ub4 xpathexpr_Len,
+ OraText *nsmap, ub4 nsmap_Len,
+ boolean *retval);
+
+sword OCIXMLTypeIsSchemaBased(OCIError *errhp,
+ OCIXMLType *doc, boolean *retval);
+
+sword OCIXMLTypeGetSchema(OCIError *errhp, OCIXMLType *doc,
+ OCIXMLType **schemadoc,
+ OraText **schemaURL, ub4 *schemaURL_Len,
+ OraText **rootelem, ub4 *rootelem_Len);
+
+sword OCIXMLTypeValidate(OCIError *errhp, OCIXMLType *doc,
+ OraText *schemaURL, ub4 schemaURL_Len, boolean *retval);
+
+sword OCIXMLTypeGetDOM(OCIError *errhp, OCIXMLType *doc, OCIDuration dur,
+ OCIDOMDocument **retDom);
+
+sword OCIXMLTypeGetFromDOM(OCIError *errhp, OCIDOMDocument *domdoc,
+ OCIXMLType **retXMLType);
+
+sword OCIDOMFree(OCIError *errhp, OCIDOMDocument *domdoc);
+
+
+/*---------------------------------------------------------------------------
+ PRIVATE FUNCTIONS
+ ---------------------------------------------------------------------------*/
+
+ /* the following functions are depracated and should not be used */
+#ifdef NEVER
+sword OCIStmtBindByPos (OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+ ub4 position, dvoid *valuep, sb4 value_sz,
+ ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+ ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+
+sword OCIStmtBindByName (OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+ CONST OraText *placeholder, sb4 placeh_len, dvoid *valuep,
+ sb4 value_sz, ub2 dty, dvoid *indp, ub2 *alenp,
+ ub2 *rcodep, ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword ocidefn (OCIStmt *stmtp, OCIDefine *defnp, OCIError *errhp,
+ ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+ dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode);
+#endif /* NEVER */
+
+#endif /* OCIAP_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/sdo_oci.cpp b/src/terralib/drivers/OracleSpatial/sdo_oci.cpp
new file mode 100644
index 0000000..36194d2
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/sdo_oci.cpp
@@ -0,0 +1,3097 @@
+/* Delegate OCI calls -- Ran Wei, Oracle SDO, 9/10/1998
+ Copyright 1998, Oracle Corp. */
+
+
+
+#include <oci.h>
+#include <sdo_oci.h>
+
+//extern "C"
+//{
+// #include <oci.h>
+// #include "sdo_oci.h"
+//}
+
+
+
+
+
+/********************************************************************************/
+
+/* Part I -- OCI fundamental interfaces */
+
+/********************************************************************************/
+
+/*
+Note: OCIEnvCreate() should be used instead of the
+OCIInitialize() and OCIEnvInit() calls.
+OCIInitialize() and OCIEnvInit() calls will be supported
+for backward compatibility.
+*/
+
+sword SDO_OCIEnvCreate(OCIEnv **envhpp, ub4 mode, dvoid *ctxp,
+
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+
+ size_t xtramensz, dvoid **usrmempp)
+
+{
+
+ return OCIEnvCreate (envhpp, mode, ctxp, malocfp, ralocfp, mfreefp, xtramensz, usrmempp);
+}
+
+
+
+sword SDO_OCIInitialize(ub4 mode, dvoid *ctxp,
+
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr))
+
+{
+
+ return OCIInitialize(mode, ctxp, malocfp, ralocfp, mfreefp);
+
+}
+
+
+
+sword SDO_OCIHandleAlloc(CONST dvoid *parenth, dvoid **hndlpp, ub4 type,
+
+ size_t xtramem_sz, dvoid **usrmempp)
+
+{
+
+ //aloca todas as handles do ambiente passado como parametro
+ return OCIHandleAlloc(parenth, hndlpp, type, xtramem_sz, usrmempp);
+
+}
+
+
+
+sword SDO_OCIHandleFree(dvoid *hndlp, ub4 type)
+
+{
+
+ return OCIHandleFree(hndlp, type);
+
+}
+
+
+
+sword SDO_OCIDescriptorAlloc(CONST dvoid *parenth, dvoid **descpp, ub4 type,
+
+ size_t xtramem_sz, dvoid **usrmempp)
+
+{
+
+ return OCIDescriptorAlloc(parenth, descpp, type, xtramem_sz, usrmempp);
+
+}
+
+
+
+sword SDO_OCIDescriptorFree(dvoid *descp, ub4 type)
+
+{
+
+ return OCIDescriptorFree(descp, type);
+
+}
+
+
+
+sword SDO_OCIEnvInit(OCIEnv **envp, ub4 mode, size_t xtramem_sz,
+
+ dvoid **usrmempp)
+
+{
+
+ return OCIEnvInit(envp, mode, xtramem_sz, usrmempp);
+
+}
+
+
+
+sword SDO_OCIServerAttach(OCIServer *srvhp, OCIError *errhp,
+
+ CONST text *dblink, sb4 dblink_len, ub4 mode)
+
+{
+
+ return OCIServerAttach(srvhp, errhp, dblink, dblink_len, mode);
+
+}
+
+
+
+sword SDO_OCIServerDetach(OCIServer *srvhp, OCIError *errhp, ub4 mode)
+
+{
+
+ return OCIServerDetach(srvhp, errhp, mode);
+
+}
+
+
+
+sword SDO_OCISessionBegin(OCISvcCtx *svchp, OCIError *errhp,
+
+ OCISession *usrhp, ub4 credt, ub4 mode)
+
+{
+
+ return OCISessionBegin(svchp, errhp, usrhp, credt, mode);
+
+}
+
+
+
+sword SDO_OCISessionEnd(OCISvcCtx *svchp, OCIError *errhp,
+
+ OCISession *usrhp, ub4 mode)
+
+{
+
+ return OCISessionEnd(svchp, errhp, usrhp, mode);
+
+}
+
+
+
+sword SDO_OCILogon(OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+
+ CONST text *username, ub4 uname_len, CONST text *password,
+
+ ub4 passwd_len, CONST text *dbname, ub4 dbname_len)
+
+{
+
+ return OCILogon(envhp, errhp, svchp, username, uname_len, password,
+
+ passwd_len, dbname, dbname_len);
+
+}
+
+
+
+sword SDO_OCILogoff(OCISvcCtx *svchp, OCIError *errhp)
+
+{
+
+ return OCILogoff(svchp, errhp);
+
+}
+
+
+
+sword SDO_OCIPasswordChange(OCISvcCtx *svchp, OCIError *errhp,
+
+ CONST text *user_name, ub4 usernm_len,
+
+ CONST text *opasswd, ub4 opasswd_len,
+
+ CONST text *npasswd, ub4 npasswd_len, ub4 mode)
+
+{
+
+ return OCIPasswordChange(svchp, errhp, user_name, usernm_len,
+
+ opasswd, opasswd_len, npasswd, npasswd_len, mode);
+
+}
+
+
+
+sword SDO_OCIStmtPrepare(OCISvcCtx * /* svchp */, OCIStmt *stmtp, OCIError *errhp, CONST OraText *stmt,
+
+ ub4 stmt_len, CONST OraText * /* key */, ub4 /* keylen */, ub4 language, ub4 mode)
+
+{
+ //return OCIStmtPrepare2 (svchp, stmtp, errhp, stmt, stmt_len, key, keylen, language, mode );
+
+ return OCIStmtPrepare(stmtp, errhp, stmt, stmt_len, language, mode);
+}
+
+
+
+sword SDO_OCIBindByPos(OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+
+ ub4 position, dvoid *valuep, sb4 value_sz,
+
+ ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+
+ ub4 maxarr_len, ub4 *curelep, ub4 mode)
+
+{
+
+ return OCIBindByPos(stmtp, bindp, errhp, position, valuep, value_sz,
+
+ dty, indp, alenp, rcodep, maxarr_len, curelep, mode);
+
+}
+
+
+
+sword SDO_OCIBindByName(OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+
+ CONST text *placeholder, sb4 placeh_len,
+
+ dvoid *valuep, sb4 value_sz, ub2 dty,
+
+ dvoid *indp, ub2 *alenp, ub2 *rcodep,
+
+ ub4 maxarr_len, ub4 *curelep, ub4 mode)
+
+{
+
+ return OCIBindByName(stmtp, bindp, errhp, placeholder, placeh_len,
+
+ valuep, value_sz, dty, indp, alenp, rcodep,
+
+ maxarr_len, curelep, mode);
+
+}
+
+
+
+sword SDO_OCIBindObject(OCIBind *bindp, OCIError *errhp, CONST OCIType *type,
+
+ dvoid **pgvpp, ub4 *pvszsp, dvoid **indpp, ub4 *indszp)
+
+{
+
+ return OCIBindObject(bindp, errhp, type, pgvpp, pvszsp, indpp, indszp);
+
+}
+
+
+
+sword SDO_OCIBindDynamic(OCIBind *bindp, OCIError *errhp, dvoid *ictxp,
+
+ OCICallbackInBind icbfp, dvoid *octxp,
+
+ OCICallbackOutBind ocbfp)
+
+{
+
+ return OCIBindDynamic(bindp, errhp, ictxp, icbfp, octxp, ocbfp);
+
+}
+
+
+
+sword SDO_OCIBindArrayOfStruct(OCIBind *bindp, OCIError *errhp,
+
+ ub4 pvskip, ub4 indskip, ub4 alskip, ub4 rcskip)
+
+{
+
+ return OCIBindArrayOfStruct(bindp, errhp, pvskip, indskip, alskip, rcskip);
+
+}
+
+
+
+sword SDO_OCIStmtGetPieceInfo(OCIStmt *stmtp, OCIError *errhp,
+
+ dvoid **hndlpp, ub4 *typep, ub1 *in_outp,
+
+ ub4 *iterp, ub4 *idxp, ub1 *piecep)
+
+{
+
+ return OCIStmtGetPieceInfo(stmtp, errhp, hndlpp, typep, in_outp, iterp,
+
+ idxp, piecep);
+
+}
+
+
+
+sword SDO_OCIStmtSetPieceInfo(dvoid *hndlp, ub4 type, OCIError *errhp,
+
+ CONST dvoid *bufp, ub4 *alenp, ub1 piece,
+
+ CONST dvoid *indp, ub2 *rcodep)
+
+{
+
+ return OCIStmtSetPieceInfo(hndlp, type, errhp, bufp, alenp, piece,
+
+ indp, rcodep);
+
+}
+
+
+
+sword SDO_OCIStmtExecute(OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp,
+
+ ub4 iters, ub4 rowoff, CONST OCISnapshot *snap_in,
+
+ OCISnapshot *snap_out, ub4 mode)
+
+{
+
+ return OCIStmtExecute(svchp, stmtp, errhp, iters, rowoff, snap_in,
+
+ snap_out, mode);
+
+}
+
+
+
+sword SDO_OCIDefineByPos(OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
+
+ ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+
+ dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode)
+
+{
+
+ return OCIDefineByPos(stmtp, defnp, errhp, position, valuep, value_sz, dty,
+
+ indp, rlenp, rcodep, mode);
+
+}
+
+
+
+sword SDO_OCIDefineObject(OCIDefine *defnp, OCIError *errhp,
+
+ CONST OCIType *type, dvoid **pgvpp,
+
+ ub4 *pvszsp, dvoid **indpp, ub4 *indszp)
+
+{
+
+ return OCIDefineObject(defnp, errhp, type, pgvpp, pvszsp, indpp, indszp);
+
+}
+
+
+
+sword SDO_OCIDefineDynamic(OCIDefine *defnp, OCIError *errhp, dvoid *octxp,
+
+ OCICallbackDefine ocbfp)
+
+{
+
+ return OCIDefineDynamic(defnp, errhp, octxp, ocbfp);
+
+}
+
+
+
+sword SDO_OCIDefineArrayOfStruct(OCIDefine *defnp, OCIError *errhp, ub4 pvskip,
+
+ ub4 indskip, ub4 rlskip, ub4 rcskip)
+
+{
+
+ return OCIDefineArrayOfStruct(defnp, errhp, pvskip, indskip, rlskip, rcskip);
+
+}
+
+
+
+sword SDO_OCIStmtFetch(OCIStmt *stmtp, OCIError *errhp, ub4 nrows,
+
+ ub2 orientation, ub4 mode)
+
+{
+
+ return OCIStmtFetch(stmtp, errhp, nrows, orientation, mode);
+
+}
+
+
+
+sword SDO_OCIStmtGetBindInfo(OCIStmt *stmtp, OCIError *errhp, ub4 size,
+
+ ub4 startloc, sb4 *found, text *bvnp[], ub1 bvnl[],
+
+ text *invp[], ub1 inpl[], ub1 dupl[], OCIBind *hndl[])
+
+{
+
+ return OCIStmtGetBindInfo(stmtp, errhp, size, startloc, found, bvnp, bvnl,
+
+ invp, inpl, dupl, hndl);
+
+}
+
+
+
+sword SDO_OCIDescribeAny(OCISvcCtx *svchp, OCIError *errhp, dvoid *objptr,
+
+ ub4 objnm_len, ub1 objptr_typ, ub1 info_level,
+
+ ub1 objtyp, OCIDescribe *dschp)
+
+{
+
+ return OCIDescribeAny(svchp, errhp, objptr, objnm_len, objptr_typ, info_level,
+
+ objtyp, dschp);
+
+}
+
+
+
+sword SDO_OCIParamGet(CONST dvoid *hndlp, ub4 htype, OCIError *errhp,
+
+ dvoid **parmdpp, ub4 pos)
+
+{
+
+ return OCIParamGet(hndlp, htype, errhp, parmdpp, pos);
+
+}
+
+
+
+sword SDO_OCIParamSet(dvoid *hdlp, ub4 htyp, OCIError *errhp, CONST dvoid *dscp,
+
+ ub4 dtyp, ub4 pos)
+
+{
+
+ return OCIParamSet(hdlp, htyp, errhp, dscp, dtyp, pos);
+
+}
+
+
+
+sword SDO_OCITransStart(OCISvcCtx *svchp, OCIError *errhp, uword timeout, ub4 flags)
+
+{
+
+ return OCITransStart(svchp, errhp, timeout, flags);
+
+}
+
+
+
+sword SDO_OCITransDetach(OCISvcCtx *svchp, OCIError *errhp, ub4 flags)
+
+{
+
+ return OCITransDetach(svchp, errhp, flags);
+
+}
+
+
+
+sword SDO_OCITransCommit(OCISvcCtx *svchp, OCIError *errhp, ub4 flags)
+
+{
+
+ return OCITransCommit(svchp, errhp, flags);
+
+}
+
+
+
+sword SDO_OCITransRollback(OCISvcCtx *svchp, OCIError *errhp, ub4 flags)
+
+{
+
+ return OCITransRollback(svchp, errhp, flags);
+
+}
+
+
+
+sword SDO_OCITransPrepare(OCISvcCtx *svchp, OCIError *errhp, ub4 flags)
+
+{
+
+ return OCITransPrepare(svchp, errhp, flags);
+
+}
+
+
+
+sword SDO_OCITransForget(OCISvcCtx *svchp, OCIError *errhp, ub4 flags)
+
+{
+
+ return OCITransForget(svchp, errhp, flags);
+
+}
+
+
+
+sword SDO_OCIErrorGet(dvoid *hndlp, ub4 recordno, text *sqlstate,
+
+ sb4 *errcodep, text *bufp, ub4 bufsiz, ub4 type)
+
+{
+
+ return OCIErrorGet(hndlp, recordno, sqlstate, errcodep, bufp, bufsiz, type);
+
+}
+
+
+
+sword SDO_OCILobAppend(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+
+ OCILobLocator *src_locp)
+
+{
+
+ return OCILobAppend(svchp, errhp, dst_locp, src_locp);
+
+}
+
+
+
+sword SDO_OCILobAssign(OCIEnv *envhp, OCIError *errhp, CONST OCILobLocator *src_locp,
+
+ OCILobLocator **dst_locpp)
+
+{
+
+ return OCILobAssign(envhp, errhp, src_locp, dst_locpp);
+
+}
+
+
+
+sword SDO_OCILobCharSetForm(OCIEnv *envhp, OCIError *errhp,
+
+ CONST OCILobLocator *locp, ub1 *csfrm)
+
+{
+
+ return OCILobCharSetForm(envhp, errhp, locp, csfrm);
+
+}
+
+
+
+sword SDO_OCILobCharSetId(OCIEnv *envhp, OCIError *errhp,
+
+ CONST OCILobLocator *locp, ub2 *csid)
+
+{
+
+ return OCILobCharSetId(envhp, errhp, locp, csid);
+
+}
+
+
+
+sword SDO_OCILobCopy(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+
+ OCILobLocator *src_locp, ub4 amount, ub4 dst_offset,
+
+ ub4 src_offset)
+
+{
+
+ return OCILobCopy(svchp, errhp, dst_locp, src_locp, amount, dst_offset,
+
+ src_offset);
+
+}
+
+
+
+sword SDO_OCILobDisableBuffering(OCISvcCtx *svchp, OCIError *errhp,
+
+ OCILobLocator *locp)
+
+{
+
+ return OCILobDisableBuffering(svchp, errhp, locp);
+
+}
+
+
+
+sword SDO_OCILobEnableBuffering(OCISvcCtx *svchp, OCIError *errhp,
+
+ OCILobLocator *locp)
+
+{
+
+ return OCILobEnableBuffering(svchp, errhp, locp);
+
+}
+
+
+
+sword SDO_OCILobErase(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+ ub4 *amount, ub4 offset)
+
+{
+
+ return OCILobErase(svchp, errhp, locp, amount, offset);
+
+}
+
+
+
+sword SDO_OCILobFileClose(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep)
+
+{
+
+ return OCILobFileClose(svchp, errhp, filep);
+
+}
+
+
+
+sword SDO_OCILobFileCloseAll(OCISvcCtx *svchp, OCIError *errhp)
+
+{
+
+ return OCILobFileCloseAll(svchp, errhp);
+
+}
+
+
+
+sword SDO_OCILobFileExists(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep,
+
+ boolean *flag)
+
+{
+
+ return OCILobFileExists(svchp, errhp, filep, flag);
+
+}
+
+
+
+sword SDO_OCILobFileGetName(OCIEnv *envhp, OCIError *errhp,
+
+ CONST OCILobLocator *filep, text *dir_alias,
+
+ ub2 *d_length, text *filename, ub2 *f_length)
+
+{
+
+ return OCILobFileGetName(envhp, errhp, filep, dir_alias, d_length,
+
+ filename, f_length);
+
+}
+
+
+
+sword SDO_OCILobFileIsOpen(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep,
+
+ boolean *flag)
+
+{
+
+ return OCILobFileIsOpen(svchp, errhp, filep, flag);
+
+}
+
+
+
+sword SDO_OCILobFileOpen(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep,
+
+ ub1 mode)
+
+{
+
+ return OCILobFileOpen(svchp, errhp, filep, mode);
+
+}
+
+
+
+sword SDO_OCILobFileSetName(OCIEnv *envhp, OCIError *errhp, OCILobLocator **filepp,
+
+ CONST text *dir_alias, ub2 d_length,
+
+ CONST text *filename, ub2 f_length)
+
+{
+
+ return OCILobFileSetName(envhp, errhp, filepp, dir_alias, d_length,
+
+ filename, f_length);
+
+}
+
+
+
+sword SDO_OCILobFlushBuffer(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+ ub4 flag)
+
+{
+
+ return OCILobFlushBuffer(svchp, errhp, locp, flag);
+
+}
+
+
+
+sword SDO_OCILobGetLength(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+ ub4 *lenp)
+
+{
+
+ return OCILobGetLength(svchp, errhp, locp, lenp);
+
+}
+
+
+
+sword SDO_OCILobIsEqual(OCIEnv *envhp, CONST OCILobLocator *x,
+
+ CONST OCILobLocator *y, boolean *is_equal)
+
+{
+
+ return OCILobIsEqual(envhp, x, y, is_equal);
+
+}
+
+
+
+sword SDO_OCILobLoadFromFile(OCISvcCtx *svchp, OCIError *errhp,
+
+ OCILobLocator *dst_locp, OCILobLocator *src_filep,
+
+ ub4 amount, ub4 dst_offset, ub4 src_offset)
+
+{
+
+ return OCILobLoadFromFile(svchp, errhp, dst_locp, src_filep, amount,
+
+ dst_offset, src_offset);
+
+}
+
+
+
+sword SDO_OCILobLocatorIsInit(OCIEnv *envhp, OCIError *errhp,
+
+ CONST OCILobLocator *locp, boolean *is_initialized)
+
+{
+
+ return OCILobLocatorIsInit(envhp, errhp, locp, is_initialized);
+
+}
+
+
+
+sword SDO_OCILobRead(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+ ub4 *amtp, ub4 offset, dvoid *bufp, ub4 bufl,
+
+ dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, CONST dvoid *bufp,
+
+ ub4 len, ub1 piece), ub2 csid, ub1 csfrm)
+
+{
+
+ return OCILobRead(svchp, errhp, locp, amtp, offset, bufp, bufl,
+
+ ctxp, cbfp, csid, csfrm);
+
+}
+
+
+
+sword SDO_OCILobTrim(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+ ub4 newlen)
+
+{
+
+ return OCILobTrim(svchp, errhp, locp, newlen);
+
+}
+
+
+
+sword SDO_OCILobWrite(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+ ub4 *amtp, ub4 offset, dvoid *bufp, ub4 buflen, ub1 piece,
+
+ dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, dvoid *bufp, ub4 *len,
+
+ ub1 *piece), ub2 csid, ub1 csfrm)
+
+{
+
+ return OCILobWrite(svchp, errhp, locp, amtp, offset, bufp, buflen, piece,
+
+ ctxp, cbfp, csid, csfrm);
+
+}
+
+
+
+sword SDO_OCIBreak(dvoid *hndlp, OCIError *errhp)
+
+{
+
+ return OCIBreak(hndlp, errhp);
+
+}
+
+
+
+sword SDO_OCIServerVersion(dvoid *hndlp, OCIError *errhp, text *bufp, ub4 bufsz,
+
+ ub1 hndltype)
+
+{
+
+ return OCIServerVersion(hndlp, errhp, bufp, bufsz, hndltype);
+
+}
+
+
+
+sword SDO_OCIAttrGet(CONST dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep,
+
+ ub4 *sizep, ub4 attrtype, OCIError *errhp)
+
+{
+
+ return OCIAttrGet(trgthndlp, trghndltyp, attributep, sizep, attrtype, errhp);
+
+}
+
+
+
+sword SDO_OCIAttrSet(dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep,
+
+ ub4 size, ub4 attrtype, OCIError *errhp)
+
+{
+
+ return OCIAttrSet(trgthndlp, trghndltyp, attributep, size, attrtype, errhp);
+
+}
+
+
+
+sword SDO_OCISvcCtxToLda(OCISvcCtx *svchp, OCIError *errhp, Lda_Def *ldap)
+
+{
+
+ return OCISvcCtxToLda(svchp, errhp, ldap);
+
+}
+
+
+
+sword SDO_OCILdaToSvcCtx(OCISvcCtx **svchpp, OCIError *errhp, Lda_Def *ldap)
+
+{
+
+ return OCILdaToSvcCtx(svchpp, errhp, ldap);
+
+}
+
+
+
+sword SDO_OCIResultSetToStmt(OCIResult *rsetdp, OCIError *errhp)
+
+{
+
+ return OCIResultSetToStmt(rsetdp, errhp);
+
+}
+
+
+
+
+
+/********************************************************************************/
+
+/* Part II -- OCI navigational interfaces */
+
+/********************************************************************************/
+
+sword SDO_OCIObjectNew(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ OCITypeCode typecode, OCIType *tdo, dvoid *table,
+
+ OCIDuration duration, boolean value, dvoid **instance)
+
+{
+
+ return OCIObjectNew(env, err, svc, typecode, tdo, table, duration,
+
+ value, instance);
+
+}
+
+
+
+sword SDO_OCIObjectPin(OCIEnv *env, OCIError *err, OCIRef *object_ref,
+
+ OCIComplexObject *corhdl, OCIPinOpt pin_option,
+
+ OCIDuration pin_duration, OCILockOpt lock_option,
+
+ dvoid **object)
+
+{
+
+ return OCIObjectPin(env, err, object_ref, corhdl, pin_option,
+
+ pin_duration, lock_option, object);
+
+}
+
+
+
+sword SDO_OCIObjectUnpin(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+ return OCIObjectUnpin(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectPinCountReset(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+ return OCIObjectPinCountReset(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectLock(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+ return OCIObjectLock(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectMarkUpdate(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+ return OCIObjectMarkUpdate(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectUnmark(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+ return OCIObjectUnmark(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectUnmarkByRef(OCIEnv *env, OCIError *err, OCIRef *ref)
+
+{
+
+ return OCIObjectUnmarkByRef(env, err, ref);
+
+}
+
+
+
+sword SDO_OCIObjectFree(OCIEnv *env, OCIError *err, dvoid *instance,
+
+ ub2 flags)
+
+{
+
+ return OCIObjectFree(env, err, instance, flags);
+
+}
+
+
+
+sword SDO_OCIObjectMarkDeleteByRef(OCIEnv *env, OCIError *err, OCIRef *object_ref)
+
+{
+
+ return OCIObjectMarkDeleteByRef(env, err, object_ref);
+
+}
+
+
+
+sword SDO_OCIObjectMarkDelete(OCIEnv *env, OCIError *err, dvoid *instance)
+
+{
+
+ return OCIObjectMarkDelete(env, err, instance);
+
+}
+
+
+
+sword SDO_OCIObjectFlush(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+ return OCIObjectFlush(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectRefresh(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+ return OCIObjectRefresh(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectCopy(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ dvoid *source, dvoid *null_source, dvoid *target,
+
+ dvoid *null_target, OCIType *tdo, OCIDuration duration,
+
+ ub1 option)
+
+{
+
+ return OCIObjectCopy(env, err, svc, source, null_source, target,
+
+ null_target, tdo, duration, option);
+
+}
+
+
+
+sword SDO_OCIObjectGetTypeRef(OCIEnv *env, OCIError *err, dvoid *instance,
+
+ OCIRef *type_ref)
+
+{
+
+ return OCIObjectGetTypeRef(env, err, instance, type_ref);
+
+}
+
+
+
+sword SDO_OCIObjectGetObjectRef(OCIEnv *env, OCIError *err, dvoid *object,
+
+ OCIRef *object_ref)
+
+{
+
+ return OCIObjectGetObjectRef(env, err, object, object_ref);
+
+}
+
+
+
+sword SDO_OCIObjectGetInd(OCIEnv *env, OCIError *err, dvoid *instance,
+
+ dvoid **null_struct)
+
+{
+
+ return OCIObjectGetInd(env, err, instance, null_struct);
+
+}
+
+
+
+sword SDO_OCIObjectExists(OCIEnv *env, OCIError *err, dvoid *ins, boolean *exist)
+
+{
+
+ return OCIObjectExists(env, err, ins, exist);
+
+}
+
+
+
+sword SDO_OCIObjectGetProperty(OCIEnv *envh, OCIError *errh, CONST dvoid *obj,
+
+ OCIObjectPropId propertyId, dvoid *property,
+
+ ub4 *size)
+
+{
+
+ return OCIObjectGetProperty(envh, errh, obj, propertyId, property, size);
+
+}
+
+
+
+sword SDO_OCIObjectIsLocked(OCIEnv *env, OCIError *err, dvoid *ins, boolean *lock)
+
+{
+
+ return OCIObjectIsLocked(env, err, ins, lock);
+
+}
+
+
+
+sword SDO_OCIObjectIsDirty(OCIEnv *env, OCIError *err, dvoid *ins, boolean *dirty)
+
+{
+
+ return OCIObjectIsDirty(env, err, ins, dirty);
+
+}
+
+
+
+sword SDO_OCIObjectPinTable(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ CONST text *schema_name, ub4 s_n_length,
+
+ CONST text *object_name, ub4 o_n_length,
+
+ CONST OCIRef *scope_obj_ref, OCIDuration pin_duration,
+
+ dvoid** object)
+
+{
+
+ return OCIObjectPinTable(env, err, svc, schema_name, s_n_length,
+
+ object_name, o_n_length, scope_obj_ref, pin_duration,
+
+ object);
+
+}
+
+
+
+sword SDO_OCIObjectArrayPin(OCIEnv *env, OCIError *err, OCIRef **ref_array,
+
+ ub4 array_size, OCIComplexObject **cor_array,
+
+ ub4 cor_array_size, OCIPinOpt pin_option,
+
+ OCIDuration pin_duration, OCILockOpt lock,
+
+ dvoid **obj_array, ub4 *pos)
+
+{
+
+ return OCIObjectArrayPin(env, err, ref_array, array_size, cor_array,
+
+ cor_array_size, pin_option, pin_duration, lock,
+
+ obj_array, pos);
+
+}
+
+
+
+sword SDO_OCICacheFlush(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ dvoid *context, OCIRef *(*get)(dvoid *context, ub1 *last),
+
+ OCIRef **ref)
+
+{
+
+ return OCICacheFlush(env, err, svc, context, get, ref);
+
+}
+
+
+
+sword SDO_OCICacheRefresh(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ OCIRefreshOpt option, dvoid *context,
+
+ OCIRef *(*get)(dvoid *context), OCIRef **ref)
+
+{
+
+ return OCICacheRefresh(env, err, svc, option, context, get, ref);
+
+}
+
+
+
+sword SDO_OCICacheUnpin(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc)
+
+{
+
+ return OCICacheUnpin(env, err, svc);
+
+}
+
+
+
+sword SDO_OCICacheFree(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc)
+
+{
+
+ return OCICacheFree(env, err, svc);
+
+}
+
+
+
+sword SDO_OCICacheUnmark(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc)
+
+{
+
+ return OCICacheUnmark(env, err, svc);
+
+}
+
+
+
+sword SDO_OCIDurationBegin(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ OCIDuration parent, OCIDuration *dur)
+
+{
+
+ return OCIDurationBegin(env, err, svc, parent, dur);
+
+}
+
+
+
+sword SDO_OCIDurationEnd(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ OCIDuration duration)
+
+{
+
+ return OCIDurationEnd(env, err, svc, duration);
+
+}
+
+
+
+sword SDO_OCIDurationGetParent(OCIEnv *env, OCIError *err,
+
+ OCIDuration duration, OCIDuration *parent)
+
+{
+
+ return OCIDurationGetParent(env, err, duration, parent);
+
+}
+
+
+
+sword SDO_OCIObjectAlwaysLatest(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+ return OCIObjectAlwaysLatest(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectNotAlwaysLatest(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+ return OCIObjectNotAlwaysLatest(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectFlushRefresh(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+ return OCIObjectFlushRefresh(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectIsLoaded(OCIEnv *env, OCIError *err, dvoid *ins,
+
+ boolean *load)
+
+{
+
+ return OCIObjectIsLoaded(env, err, ins, load);
+
+}
+
+
+
+sword SDO_OCIObjectIsDirtied(OCIEnv *env, OCIError *err, dvoid *ins,
+
+ boolean *dirty)
+
+{
+
+ return OCIObjectIsDirtied(env, err, ins, dirty);
+
+}
+
+
+
+sword SDO_OCICacheGetObjects(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ OCIObjectProperty property, dvoid *client_context,
+
+ void (*client_callback)(dvoid *client_context,
+
+ dvoid *object))
+
+{
+
+ return OCICacheGetObjects(env, err, svc, property, client_context,
+
+ client_callback);
+
+}
+
+
+
+sword SDO_OCICacheRegister(OCIEnv *env, OCIError *err, OCIObjectEvent event,
+
+ dvoid *client_context, void (*client_callback)(
+
+ dvoid *client_context, OCIObjectEvent event,
+
+ dvoid *object))
+
+{
+
+ return OCICacheRegister(env, err, event, client_context, client_callback);
+
+}
+
+
+
+sword SDO_OCICacheFlushRefresh(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ dvoid *context, OCIRef *(*get)(dvoid *context,
+
+ ub1 *last), OCIRef **ref)
+
+{
+
+ return OCICacheFlushRefresh(env, err, svc, context, get, ref);
+
+}
+
+
+
+
+
+/********************************************************************************/
+
+/* Part III -- OCI primitive OTS interfaces */
+
+/********************************************************************************/
+
+void SDO_OCINumberSetZero(OCIError *err, OCINumber *num)
+
+{
+
+ OCINumberSetZero(err, num);
+
+}
+
+
+
+sword SDO_OCINumberAdd(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, OCINumber *result)
+
+{
+
+ return OCINumberAdd(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberSub(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, OCINumber *result)
+
+{
+
+ return OCINumberSub(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberMul(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, OCINumber *result)
+
+{
+
+ return OCINumberMul(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberDiv(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, OCINumber *result)
+
+{
+
+ return OCINumberDiv(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberMod(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, OCINumber *result)
+
+{
+
+ return OCINumberMod(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberIntPower(OCIError *err, CONST OCINumber *base,
+
+ CONST sword exp, OCINumber *result)
+
+{
+
+ return OCINumberIntPower(err, base, exp, result);
+
+}
+
+
+
+sword SDO_OCINumberNeg(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberNeg(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberToText(OCIError *err, CONST OCINumber *number,
+
+ CONST text *fmt, ub4 fmt_length,
+
+ CONST text *nls_params, ub4 nls_p_length,
+
+ ub4 *buf_size, text *buf)
+
+{
+
+ return OCINumberToText(err, number, fmt, fmt_length, nls_params,
+
+ nls_p_length, buf_size, buf);
+
+}
+
+
+
+sword SDO_OCINumberFromText(OCIError *err, CONST text *str, ub4 str_length,
+
+ CONST text *fmt, ub4 fmt_length,
+
+ CONST text *nls_params, ub4 nls_p_length,
+
+ OCINumber *number)
+
+{
+
+ return OCINumberFromText(err, str, str_length, fmt, fmt_length,
+
+ nls_params, nls_p_length, number);
+
+}
+
+
+
+sword SDO_OCINumberToInt(OCIError *err, CONST OCINumber *number,
+
+ uword rsl_length, uword rsl_flag, dvoid *rsl)
+
+{
+
+ return OCINumberToInt(err, number, rsl_length, rsl_flag, rsl);
+
+}
+
+
+
+sword SDO_OCINumberFromInt(OCIError *err, CONST dvoid *inum, uword inum_length,
+
+ uword inum_s_flag, OCINumber *number)
+
+{
+
+ return OCINumberFromInt(err, inum, inum_length, inum_s_flag, number);
+
+}
+
+
+
+sword SDO_OCINumberToReal(OCIError *err, CONST OCINumber *number,
+
+ uword rsl_length, dvoid *rsl)
+
+{
+
+ return OCINumberToReal(err, number, rsl_length, rsl);
+
+}
+
+
+
+sword SDO_OCINumberFromReal(OCIError *err, CONST dvoid *rnum,
+
+ uword rnum_length, OCINumber *number)
+
+{
+
+ return OCINumberFromReal(err, rnum, rnum_length, number);
+
+}
+
+
+
+sword SDO_OCINumberCmp(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, sword *result)
+
+{
+
+ return OCINumberCmp(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberSign(OCIError *err, CONST OCINumber *number,
+
+ sword *result)
+
+{
+
+ return OCINumberSign(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberIsZero(OCIError *err, CONST OCINumber *number,
+
+ boolean *result)
+
+{
+
+ return OCINumberIsZero(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberAssign(OCIError *err, CONST OCINumber *from,
+
+ OCINumber *to)
+
+{
+
+ return OCINumberAssign(err, from, to);
+
+}
+
+
+
+sword SDO_OCINumberAbs(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberAbs(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberCeil(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberCeil(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberFloor(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberFloor(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberSqrt(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberSqrt(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberTrunc(OCIError *err, CONST OCINumber *number,
+
+ sword decplace, OCINumber *result)
+
+{
+
+ return OCINumberTrunc(err, number, decplace, result);
+
+}
+
+
+
+sword SDO_OCINumberPower(OCIError *err, CONST OCINumber *base,
+
+ CONST OCINumber *number, OCINumber *result)
+
+{
+
+ return OCINumberPower(err, base, number, result);
+
+}
+
+
+
+sword SDO_OCINumberRound(OCIError *err, CONST OCINumber *number,
+
+ sword decplace, OCINumber *result)
+
+{
+
+ return OCINumberRound(err, number, decplace, result);
+
+}
+
+
+
+sword SDO_OCINumberSin(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberSin(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberArcSin(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberArcSin(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberHypSin(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberHypSin(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberCos(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberCos(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberArcCos(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberArcCos(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberHypCos(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberHypCos(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberTan(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberTan(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberArcTan(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberArcTan(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberArcTan2(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, OCINumber *result)
+
+{
+
+ return OCINumberArcTan2(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberHypTan(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberHypTan(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberExp(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberExp(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberLn(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result)
+
+{
+
+ return OCINumberLn(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberLog(OCIError *err, CONST OCINumber *base,
+
+ CONST OCINumber *number, OCINumber *result)
+
+{
+
+ return OCINumberLog(err, base, number, result);
+
+}
+
+
+
+sword SDO_OCIDateAssign(OCIError *err, CONST OCIDate *from, OCIDate *to)
+
+{
+
+ return OCIDateAssign(err, from, to);
+
+}
+
+
+
+sword SDO_OCIDateToText(OCIError *err, CONST OCIDate *date,
+
+ CONST text *fmt, ub1 fmt_length,
+
+ CONST text *lang_name, ub4 lang_length,
+
+ ub4 *buf_size, text *buf)
+
+{
+
+ return OCIDateToText(err, date, fmt, fmt_length, lang_name, lang_length,
+
+ buf_size, buf);
+
+}
+
+
+
+sword SDO_OCIDateFromText(OCIError *err, CONST text *date_str,
+
+ ub4 d_str_length, CONST text *fmt, ub1 fmt_length,
+
+ CONST text *lang_name, ub4 lang_length,
+
+ OCIDate *date)
+
+{
+
+ return OCIDateFromText(err, date_str, d_str_length, fmt, fmt_length,
+
+ lang_name, lang_length, date);
+
+}
+
+
+
+sword SDO_OCIDateCompare(OCIError *err, CONST OCIDate *date1,
+
+ CONST OCIDate *date2, sword *result)
+
+{
+
+ return OCIDateCompare(err, date1, date2, result);
+
+}
+
+
+
+sword SDO_OCIDateAddMonths(OCIError *err, CONST OCIDate *date, sb4 num_months,
+
+ OCIDate *result)
+
+{
+
+ return OCIDateAddMonths(err, date, num_months, result);
+
+}
+
+
+
+sword SDO_OCIDateAddDays(OCIError *err, CONST OCIDate *date, sb4 num_days,
+
+ OCIDate *result)
+
+{
+
+ return OCIDateAddDays(err, date, num_days, result);
+
+}
+
+
+
+sword SDO_OCIDateLastDay(OCIError *err, CONST OCIDate *date,
+
+ OCIDate *last_day)
+
+{
+
+ return OCIDateLastDay(err, date, last_day);
+
+}
+
+
+
+sword SDO_OCIDateDaysBetween(OCIError *err, CONST OCIDate *date1,
+
+ CONST OCIDate *date2, sb4 *num_days)
+
+{
+
+ return OCIDateDaysBetween(err, date1, date2, num_days);
+
+}
+
+
+
+sword SDO_OCIDateZoneToZone(OCIError *err, CONST OCIDate *date1,
+
+ CONST text *zon1, ub4 zon1_length,
+
+ CONST text *zon2, ub4 zon2_length, OCIDate *date2)
+
+{
+
+ return OCIDateZoneToZone(err, date1, zon1, zon1_length, zon2,
+
+ zon2_length, date2);
+
+}
+
+
+
+sword SDO_OCIDateNextDay(OCIError *err, CONST OCIDate *date, CONST text *day_p,
+
+ ub4 day_length, OCIDate *next_day)
+
+{
+
+ return OCIDateNextDay(err, date, day_p, day_length, next_day);
+
+}
+
+
+
+
+
+sword SDO_OCIDateCheck(OCIError *err, CONST OCIDate *date, uword *valid)
+
+{
+
+ return OCIDateCheck(err, date, valid);
+
+}
+
+
+
+sword SDO_OCIDateSysDate(OCIError *err, OCIDate *sys_date)
+
+{
+
+ return OCIDateSysDate(err, sys_date);
+
+}
+
+
+
+sword SDO_OCIStringAssign(OCIEnv *env, OCIError *err, CONST OCIString *rhs,
+
+ OCIString **lhs)
+
+{
+
+ return OCIStringAssign(env, err, rhs, lhs);
+
+}
+
+
+
+sword SDO_OCIStringAssignText(OCIEnv *env, OCIError *err, CONST text *rhs,
+
+ ub4 rhs_len, OCIString **lhs)
+
+{
+
+ return OCIStringAssignText(env, err, rhs, rhs_len, lhs);
+
+}
+
+
+
+sword SDO_OCIStringResize(OCIEnv *env, OCIError *err, ub4 new_size,
+
+ OCIString **str)
+
+{
+
+ return OCIStringResize(env, err, new_size, str);
+
+}
+
+
+
+ub4 SDO_OCIStringSize(OCIEnv *env, CONST OCIString *vs)
+
+{
+
+ return OCIStringSize(env, vs);
+
+}
+
+
+
+text *SDO_OCIStringPtr(OCIEnv *env, CONST OCIString *vs)
+
+{
+
+ return OCIStringPtr(env, vs);
+
+}
+
+
+
+sword SDO_OCIStringAllocSize(OCIEnv *env, OCIError *err, CONST OCIString *vs,
+
+ ub4 *allocsize)
+
+{
+
+ return OCIStringAllocSize(env, err, vs, allocsize);
+
+}
+
+
+
+sword SDO_OCIRawAssignRaw(OCIEnv *env, OCIError *err, CONST OCIRaw *rhs,
+
+ OCIRaw **lhs)
+
+{
+
+ return OCIRawAssignRaw(env, err, rhs, lhs);
+
+}
+
+
+
+sword SDO_OCIRawAssignBytes(OCIEnv *env, OCIError *err, CONST ub1 *rhs,
+
+ ub4 rhs_len, OCIRaw **lhs)
+
+{
+
+ return OCIRawAssignBytes(env, err, rhs, rhs_len, lhs);
+
+}
+
+
+
+sword SDO_OCIRawResize(OCIEnv *env, OCIError *err, ub4 new_size, OCIRaw **raw)
+
+{
+
+ return OCIRawResize(env, err, new_size, raw);
+
+}
+
+
+
+ub4 SDO_OCIRawSize(OCIEnv *env, CONST OCIRaw *raw)
+
+{
+
+ return OCIRawSize(env, raw);
+
+}
+
+
+
+ub1 *SDO_OCIRawPtr(OCIEnv *env, CONST OCIRaw *raw)
+
+{
+
+ return OCIRawPtr(env, raw);
+
+}
+
+
+
+sword SDO_OCIRawAllocSize(OCIEnv *env, OCIError *err, CONST OCIRaw *raw,
+
+ ub4 *allocsize)
+
+{
+
+ return OCIRawAllocSize(env, err, raw, allocsize);
+
+}
+
+
+
+void SDO_OCIRefClear(OCIEnv *env, OCIRef *ref)
+
+{
+
+ OCIRefClear(env, ref);
+
+}
+
+
+
+sword SDO_OCIRefAssign(OCIEnv *env, OCIError *err, CONST OCIRef *source,
+
+ OCIRef **target)
+
+{
+
+ return OCIRefAssign(env, err, source, target);
+
+}
+
+
+
+boolean SDO_OCIRefIsEqual(OCIEnv *env, CONST OCIRef *x, CONST OCIRef *y)
+
+{
+
+ return OCIRefIsEqual(env, x, y);
+
+}
+
+
+
+boolean SDO_OCIRefIsNull(OCIEnv *env, CONST OCIRef *ref)
+
+{
+
+ return OCIRefIsNull(env, ref);
+
+}
+
+
+
+ub4 SDO_OCIRefHexSize(OCIEnv *env, CONST OCIRef *ref)
+
+{
+
+ return OCIRefHexSize(env, ref);
+
+}
+
+
+
+sword SDO_OCIRefFromHex(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ CONST text *hex, ub4 length, OCIRef **ref)
+
+{
+
+ return OCIRefFromHex(env, err, svc, hex, length, ref);
+
+}
+
+
+
+sword SDO_OCIRefToHex(OCIEnv *env, OCIError *err, CONST OCIRef *ref,
+
+ text *hex, ub4 *hex_length)
+
+{
+
+ return OCIRefToHex(env, err, ref, hex, hex_length);
+
+}
+
+
+
+sword SDO_OCICollSize(OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+
+ sb4 *size)
+
+{
+
+ return OCICollSize(env, err, coll, size);
+
+}
+
+
+
+sb4 SDO_OCICollMax(OCIEnv *env, CONST OCIColl *coll)
+
+{
+
+ return OCICollMax(env, coll);
+
+}
+
+
+
+sword SDO_OCICollGetElem(OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+
+ sb4 index, boolean *exists, dvoid **elem,
+
+ dvoid **elemind)
+
+{
+
+ return OCICollGetElem(env, err, coll, index, exists, elem, elemind);
+
+}
+
+
+
+sword SDO_OCICollAssignElem(OCIEnv *env, OCIError *err, sb4 index,
+
+ CONST dvoid *elem,
+
+ CONST dvoid *elemind, OCIColl *coll)
+
+{
+
+ return OCICollAssignElem(env, err, index, elem, elemind, coll);
+
+}
+
+
+
+sword SDO_OCICollAssign(OCIEnv *env, OCIError *err, CONST OCIColl *rhs,
+
+ OCIColl *lhs)
+
+{
+
+ return OCICollAssign(env, err, rhs, lhs);
+
+}
+
+
+
+sword SDO_OCICollAppend(OCIEnv *env, OCIError *err, CONST dvoid *elem,
+
+ CONST dvoid *elemind, OCIColl *coll)
+
+{
+
+ return OCICollAppend(env, err, elem, elemind, coll);
+
+}
+
+
+
+sword SDO_OCICollTrim(OCIEnv *env, OCIError *err, sb4 trim_num,
+
+ OCIColl *coll)
+
+{
+
+ return OCICollTrim(env, err, trim_num, coll);
+
+}
+
+
+
+sword SDO_OCIIterCreate(OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+
+ OCIIter **itr)
+
+{
+
+ return OCIIterCreate(env, err, coll, itr);
+
+}
+
+
+
+sword SDO_OCIIterDelete(OCIEnv *env, OCIError *err, OCIIter **itr)
+
+{
+
+ return OCIIterDelete(env, err, itr);
+
+}
+
+
+
+sword SDO_OCIIterInit(OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+
+ OCIIter *itr)
+
+{
+
+ return OCIIterInit(env, err, coll, itr);
+
+}
+
+
+
+sword SDO_OCIIterGetCurrent(OCIEnv *env, OCIError *err, CONST OCIIter *itr,
+
+ dvoid **elem, dvoid **elemind)
+
+{
+
+ return OCIIterGetCurrent(env, err, itr, elem, elemind);
+
+}
+
+
+
+sword SDO_OCIIterNext(OCIEnv *env, OCIError *err, OCIIter *itr,
+
+ dvoid **elem, dvoid **elemind, boolean *eoc)
+
+{
+
+ return OCIIterNext(env, err, itr, elem, elemind, eoc);
+
+}
+
+
+
+sword SDO_OCIIterPrev(OCIEnv *env, OCIError *err, OCIIter *itr,
+
+ dvoid **elem, dvoid **elemind, boolean *boc)
+
+{
+
+ return OCIIterPrev(env, err, itr, elem, elemind, boc);
+
+}
+
+
+
+sword SDO_OCITableSize(OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+
+ sb4 *size)
+
+{
+
+ return OCITableSize(env, err, tbl, size);
+
+}
+
+
+
+sword SDO_OCITableExists(OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+
+ sb4 index, boolean *exists)
+
+{
+
+ return OCITableExists(env, err, tbl, index, exists);
+
+}
+
+
+
+sword SDO_OCITableDelete(OCIEnv *env, OCIError *err, sb4 index, OCITable *tbl)
+
+{
+
+ return OCITableDelete(env, err, index, tbl);
+
+}
+
+
+
+sword SDO_OCITableFirst(OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+
+ sb4 *index)
+
+{
+
+ return OCITableFirst(env, err, tbl, index);
+
+}
+
+
+
+sword SDO_OCITableLast(OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+
+ sb4 *index)
+
+{
+
+ return OCITableLast(env, err, tbl, index);
+
+}
+
+
+
+sword SDO_OCITableNext(OCIEnv *env, OCIError *err, sb4 index,
+
+ CONST OCITable *tbl, sb4 *next_index, boolean *exists)
+
+{
+
+ return OCITableNext(env, err, index, tbl, next_index, exists);
+
+}
+
+
+
+sword SDO_OCITablePrev(OCIEnv *env, OCIError *err, sb4 index,
+
+ CONST OCITable *tbl, sb4 *prev_index, boolean *exists)
+
+{
+
+ return OCITablePrev(env, err, index, tbl, prev_index, exists);
+
+}
+
+
+
+
+
+/********************************************************************************/
+
+/* Part IV -- OCI open type manager interfaces */
+
+/********************************************************************************/
+
+sword SDO_OCITypeIterNew(OCIEnv *env, OCIError *err, OCIType *tdo,
+
+ OCITypeIter **iteratorOCI)
+
+{
+
+ return OCITypeIterNew(env, err, tdo, iteratorOCI);
+
+}
+
+
+
+sword SDO_OCITypeIterSet(OCIEnv *env, OCIError *err, OCIType *tdo,
+
+ OCITypeIter *iteratorOCI)
+
+{
+
+ return OCITypeIterSet(env, err, tdo, iteratorOCI);
+
+}
+
+
+
+sword SDO_OCITypeIterFree(OCIEnv *env, OCIError *err, OCITypeIter *iteratorOCI)
+
+{
+
+ return OCITypeIterFree(env, err, iteratorOCI);
+
+}
+
+
+
+sword SDO_OCITypeByName(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ CONST text *schema_name, ub4 s_length,
+
+ CONST text *type_name, ub4 t_length,
+
+ CONST text *version_name, ub4 v_length,
+
+ OCIDuration pin_duration, OCITypeGetOpt get_option,
+
+ OCIType **tdo)
+
+{
+
+ return OCITypeByName(env, err, svc, schema_name, s_length, type_name,
+
+ t_length, version_name, v_length, pin_duration,
+
+ get_option, tdo);
+
+}
+
+
+
+sword SDO_OCITypeArrayByName(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ ub4 array_len, CONST text *schema_name[],
+
+ ub4 s_length[], CONST text *type_name[],
+
+ ub4 t_length[], CONST text *version_name[],
+
+ ub4 v_length[], OCIDuration pin_duration,
+
+ OCITypeGetOpt get_option, OCIType *tdo[])
+
+{
+
+ return OCITypeArrayByName(env, err, svc, array_len, schema_name, s_length,
+
+ type_name, t_length, version_name, v_length,
+
+ pin_duration, get_option, tdo);
+
+}
+
+
+
+sword SDO_OCITypeByRef(OCIEnv *env, OCIError *err, CONST OCIRef *type_ref,
+
+ OCIDuration pin_duration,OCITypeGetOpt get_option,
+
+ OCIType **tdo)
+
+{
+
+ return OCITypeByRef(env, err, type_ref, pin_duration, get_option, tdo);
+
+}
+
+
+
+sword SDO_OCITypeArrayByRef(OCIEnv *env, OCIError *err, ub4 array_len,
+
+ CONST OCIRef *type_ref[], OCIDuration pin_duration,
+
+ OCITypeGetOpt get_option, OCIType *tdo[])
+
+{
+
+ return OCITypeArrayByRef(env, err, array_len, type_ref, pin_duration,
+
+ get_option, tdo);
+
+}
+
+
+
+text* SDO_OCITypeName(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ ub4 *n_length)
+
+{
+
+ return OCITypeName(env, err, tdo, n_length);
+
+}
+
+
+
+text* SDO_OCITypeSchema(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ ub4 *n_length)
+
+{
+
+ return OCITypeSchema(env, err, tdo, n_length);
+
+}
+
+
+
+OCITypeCode SDO_OCITypeTypeCode(OCIEnv *env, OCIError *err, CONST OCIType *tdo)
+
+{
+
+ return OCITypeTypeCode(env, err, tdo);
+
+}
+
+
+
+OCITypeCode SDO_OCITypeCollTypeCode(OCIEnv *env, OCIError *err,
+
+ CONST OCIType *tdo)
+
+{
+
+ return OCITypeCollTypeCode(env, err, tdo);
+
+}
+
+
+
+text* SDO_OCITypeVersion(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ ub4 *v_length)
+
+{
+
+ return OCITypeVersion(env, err, tdo, v_length);
+
+}
+
+
+
+ub4 SDO_OCITypeAttrs(OCIEnv *env, OCIError *err, CONST OCIType *tdo)
+
+{
+
+ return OCITypeAttrs(env, err, tdo);
+
+}
+
+
+
+ub4 SDO_OCITypeMethods(OCIEnv *env, OCIError *err, CONST OCIType *tdo)
+
+{
+
+ return OCITypeMethods(env, err, tdo);
+
+}
+
+
+
+text* SDO_OCITypeElemName(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem,
+
+ ub4 *n_length)
+
+{
+
+ return OCITypeElemName(env, err, elem, n_length);
+
+}
+
+
+
+OCITypeCode SDO_OCITypeElemTypeCode(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeElem *elem)
+
+{
+
+ return OCITypeElemTypeCode(env, err, elem);
+
+}
+
+
+
+sword SDO_OCITypeElemType(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem,
+
+ OCIType **elem_tdo)
+
+{
+
+ return OCITypeElemType(env, err, elem, elem_tdo);
+
+}
+
+
+
+ub4 SDO_OCITypeElemFlags(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem)
+
+{
+
+ return OCITypeElemFlags(env, err, elem);
+
+}
+
+
+
+ub1 SDO_OCITypeElemNumPrec(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem)
+
+{
+
+ return OCITypeElemNumPrec(env, err, elem);
+
+}
+
+
+
+sb1 SDO_OCITypeElemNumScale(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem)
+
+{
+
+ return OCITypeElemNumScale(env, err, elem);
+
+}
+
+
+
+ub4 SDO_OCITypeElemLength(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem)
+
+{
+
+ return OCITypeElemLength(env, err, elem);
+
+}
+
+
+
+ub2 SDO_OCITypeElemCharSetID(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem)
+
+{
+
+ return OCITypeElemCharSetID(env, err, elem);
+
+}
+
+
+
+ub2 SDO_OCITypeElemCharSetForm(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem)
+
+{
+
+ return OCITypeElemCharSetForm(env, err, elem);
+
+}
+
+
+
+sword SDO_OCITypeElemParameterizedType(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeElem *elem,
+
+ OCIType **type_stored)
+
+{
+
+ return OCITypeElemParameterizedType(env, err, elem, type_stored);
+
+}
+
+
+
+OCITypeCode SDO_OCITypeElemExtTypeCode(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeElem *elem)
+
+{
+
+ return OCITypeElemExtTypeCode(env, err, elem);
+
+}
+
+
+
+sword SDO_OCITypeAttrByName(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ CONST text *name, ub4 n_length, OCITypeElem **elem)
+
+{
+
+ return OCITypeAttrByName(env, err, tdo, name, n_length, elem);
+
+}
+
+
+
+sword SDO_OCITypeAttrNext(OCIEnv *env, OCIError *err, OCITypeIter *iteratorOCI,
+
+ OCITypeElem **elem)
+
+{
+
+ return OCITypeAttrNext(env, err, iteratorOCI, elem);
+
+}
+
+
+
+sword SDO_OCITypeCollElem(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ OCITypeElem **element)
+
+{
+
+ return OCITypeCollElem(env, err, tdo, element);
+
+}
+
+
+
+sword SDO_OCITypeCollSize(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ ub4 *num_elems)
+
+{
+
+ return OCITypeCollSize(env, err, tdo, num_elems);
+
+}
+
+
+
+sword SDO_OCITypeCollExtTypeCode(OCIEnv *env, OCIError *err,
+
+ CONST OCIType *tdo, OCITypeCode *sqt_code)
+
+{
+
+ return OCITypeCollExtTypeCode(env, err, tdo, sqt_code);
+
+}
+
+
+
+ub4 SDO_OCITypeMethodOverload(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ CONST text *method_name, ub4 m_length)
+
+{
+
+ return OCITypeMethodOverload(env, err, tdo, method_name, m_length);
+
+}
+
+
+
+sword SDO_OCITypeMethodByName(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ CONST text *method_name, ub4 m_length,
+
+ OCITypeMethod **mdos)
+
+{
+
+ return OCITypeMethodByName(env, err, tdo, method_name, m_length, mdos);
+
+}
+
+
+
+sword SDO_OCITypeMethodNext(OCIEnv *env, OCIError *err, OCITypeIter *iteratorOCI,
+
+ OCITypeMethod **mdo)
+
+{
+
+ return OCITypeMethodNext(env, err, iteratorOCI, mdo);
+
+}
+
+
+
+text *SDO_OCITypeMethodName(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeMethod *mdo, ub4 *n_length)
+
+{
+
+ return OCITypeMethodName(env, err, mdo, n_length);
+
+}
+
+
+
+OCITypeEncap SDO_OCITypeMethodEncap(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeMethod *mdo)
+
+{
+
+ return OCITypeMethodEncap(env, err, mdo);
+
+}
+
+
+
+OCITypeMethodFlag SDO_OCITypeMethodFlags(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeMethod *mdo)
+
+{
+
+ return OCITypeMethodFlags(env, err, mdo);
+
+}
+
+
+
+sword SDO_OCITypeMethodMap(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ OCITypeMethod **mdo)
+
+{
+
+ return OCITypeMethodMap(env, err, tdo, mdo);
+
+}
+
+
+
+sword SDO_OCITypeMethodOrder(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ OCITypeMethod **mdo)
+
+{
+
+ return OCITypeMethodOrder(env, err, tdo, mdo);
+
+}
+
+
+
+ub4 SDO_OCITypeMethodParams(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeMethod *mdo)
+
+{
+
+ return OCITypeMethodParams(env, err, mdo);
+
+}
+
+
+
+sword SDO_OCITypeResult(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo,
+
+ OCITypeElem **elem)
+
+{
+
+ return OCITypeResult(env, err, mdo, elem);
+
+}
+
+
+
+sword SDO_OCITypeParamByPos(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo,
+
+ ub4 position, OCITypeElem **elem)
+
+{
+
+ return OCITypeParamByPos(env, err, mdo, position, elem);
+
+}
+
+
+
+sword SDO_OCITypeParamByName(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo,
+
+ CONST text *name, ub4 n_length, OCITypeElem **elem)
+
+{
+
+ return OCITypeParamByName(env, err, mdo, name, n_length, elem);
+
+}
+
+
+
+sword SDO_OCITypeParamPos(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo,
+
+ CONST text *name, ub4 n_length, ub4 *position,
+
+ OCITypeElem **elem)
+
+{
+
+ return OCITypeParamPos(env, err, mdo, name, n_length, position, elem);
+
+}
+
+
+
+OCITypeParamMode SDO_OCITypeElemParamMode(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeElem *elem)
+
+{
+
+ return OCITypeElemParamMode(env, err, elem);
+
+}
+
+
+
+text* SDO_OCITypeElemDefaultValue(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeElem *elem, ub4 *d_v_length)
+
+{
+
+ return OCITypeElemDefaultValue(env, err, elem, d_v_length);
+
+}
+
+
+
+sword SDO_OCITypeVTInit(OCIEnv *env, OCIError *err)
+
+{
+
+ return OCITypeVTInit(env, err);
+
+}
+
+
+
+sword SDO_OCITypeVTInsert(OCIEnv *env, OCIError *err, CONST text *schema_name,
+
+ ub4 s_n_length, CONST text *type_name, ub4 t_n_length,
+
+ CONST text *user_version, ub4 u_v_length)
+
+{
+
+ return OCITypeVTInsert(env, err, schema_name, s_n_length, type_name,
+
+ t_n_length, user_version, u_v_length);
+
+}
+
+
+
+sword SDO_OCITypeVTSelect(OCIEnv *env, OCIError *err, CONST text *schema_name,
+
+ ub4 s_n_length, CONST text *type_name, ub4 t_n_length,
+
+ text **user_version, ub4 *u_v_length, ub2 *version)
+
+{
+
+ return OCITypeVTSelect(env, err, schema_name, s_n_length, type_name,
+
+ t_n_length, user_version, u_v_length, version);
+
+}
+
+
+
+
+
diff --git a/src/terralib/drivers/OracleSpatial/sdo_oci.h b/src/terralib/drivers/OracleSpatial/sdo_oci.h
new file mode 100644
index 0000000..b030637
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/sdo_oci.h
@@ -0,0 +1,1541 @@
+/* sdo_oci.c -- delegate OCI calls ranwei 9/10/1998 */
+
+/* Copyright 1998, Oracle SDO */
+
+
+
+#ifndef SDO_OCI_H
+
+#define SDO_OCI_H
+
+
+
+/********************************************************************************/
+
+/* Part I -- OCI fundamental interfaces */
+
+/********************************************************************************/
+
+//Creates and initializes an environment for OCI functions to work under.
+sword SDO_OCIEnvCreate(OCIEnv **envhpp, ub4 mode, dvoid *ctxp,
+
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+
+ size_t xtramensz, dvoid **usrmempp);
+
+
+
+sword SDO_OCIInitialize(ub4 mode, dvoid *ctxp,
+
+ dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+
+ dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+
+ void (*mfreefp)(dvoid *ctxp, dvoid *memptr));
+
+
+
+sword SDO_OCIHandleAlloc(CONST dvoid *parenth, dvoid **hndlpp, ub4 type,
+
+ size_t xtramem_sz, dvoid **usrmempp);
+
+
+
+sword SDO_OCIHandleFree(dvoid *hndlp, ub4 type);
+
+
+
+sword SDO_OCIDescriptorAlloc(CONST dvoid *parenth, dvoid **descpp, ub4 type,
+
+ size_t xtramem_sz, dvoid **usrmempp);
+
+
+
+sword SDO_OCIDescriptorFree(dvoid *descp, ub4 type);
+
+
+
+sword SDO_OCIEnvInit(OCIEnv **envp, ub4 mode, size_t xtramem_sz,
+
+ dvoid **usrmempp);
+
+
+
+sword SDO_OCIServerAttach(OCIServer *srvhp, OCIError *errhp,
+
+ CONST text *dblink, sb4 dblink_len, ub4 mode);
+
+
+
+sword SDO_OCIServerDetach(OCIServer *srvhp, OCIError *errhp, ub4 mode);
+
+
+
+sword SDO_OCISessionBegin(OCISvcCtx *svchp, OCIError *errhp,
+
+ OCISession *usrhp, ub4 credt, ub4 mode);
+
+
+
+sword SDO_OCISessionEnd(OCISvcCtx *svchp, OCIError *errhp,
+
+ OCISession *usrhp, ub4 mode);
+
+
+
+sword SDO_OCILogon(OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+
+ CONST text *username, ub4 uname_len, CONST text *password,
+
+ ub4 passwd_len, CONST text *dbname, ub4 dbname_len);
+
+
+
+sword SDO_OCILogoff(OCISvcCtx *svchp, OCIError *errhp);
+
+
+
+sword SDO_OCIPasswordChange(OCISvcCtx *svchp, OCIError *errhp,
+
+ CONST text *user_name, ub4 usernm_len,
+
+ CONST text *opasswd, ub4 opasswd_len,
+
+ CONST text *npasswd, ub4 npasswd_len, ub4 mode);
+
+
+
+sword SDO_OCIStmtPrepare(OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp, CONST OraText *stmt,
+
+ ub4 stmt_len, CONST OraText *key, ub4 keylen, ub4 language, ub4 mode);
+
+
+
+sword SDO_OCIBindByPos(OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+
+ ub4 position, dvoid *valuep, sb4 value_sz,
+
+ ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+
+ ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+
+
+sword SDO_OCIBindByName(OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+
+ CONST text *placeholder, sb4 placeh_len,
+
+ dvoid *valuep, sb4 value_sz, ub2 dty,
+
+ dvoid *indp, ub2 *alenp, ub2 *rcodep,
+
+ ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+
+
+sword SDO_OCIBindObject(OCIBind *bindp, OCIError *errhp, CONST OCIType *type,
+
+ dvoid **pgvpp, ub4 *pvszsp, dvoid **indpp, ub4 *indszp);
+
+
+
+sword SDO_OCIBindDynamic(OCIBind *bindp, OCIError *errhp, dvoid *ictxp,
+
+ OCICallbackInBind icbfp, dvoid *octxp,
+
+ OCICallbackOutBind ocbfp);
+
+
+
+sword SDO_OCIBindArrayOfStruct(OCIBind *bindp, OCIError *errhp,
+
+ ub4 pvskip, ub4 indskip, ub4 alskip, ub4 rcskip);
+
+
+
+sword SDO_OCIStmtGetPieceInfo(OCIStmt *stmtp, OCIError *errhp,
+
+ dvoid **hndlpp, ub4 *typep, ub1 *in_outp,
+
+ ub4 *iterp, ub4 *idxp, ub1 *piecep);
+
+
+
+sword SDO_OCIStmtSetPieceInfo(dvoid *hndlp, ub4 type, OCIError *errhp,
+
+ CONST dvoid *bufp, ub4 *alenp, ub1 piece,
+
+ CONST dvoid *indp, ub2 *rcodep);
+
+
+
+sword SDO_OCIStmtExecute(OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp,
+
+ ub4 iters, ub4 rowoff, CONST OCISnapshot *snap_in,
+
+ OCISnapshot *snap_out, ub4 mode);
+
+
+
+sword SDO_OCIDefineByPos(OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
+
+ ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+
+ dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode);
+
+
+
+sword SDO_OCIDefineObject(OCIDefine *defnp, OCIError *errhp,
+
+ CONST OCIType *type, dvoid **pgvpp,
+
+ ub4 *pvszsp, dvoid **indpp, ub4 *indszp);
+
+
+
+sword SDO_OCIDefineDynamic(OCIDefine *defnp, OCIError *errhp, dvoid *octxp,
+
+ OCICallbackDefine ocbfp);
+
+
+
+sword SDO_OCIDefineArrayOfStruct(OCIDefine *defnp, OCIError *errhp, ub4 pvskip,
+
+ ub4 indskip, ub4 rlskip, ub4 rcskip);
+
+
+
+sword SDO_OCIStmtFetch(OCIStmt *stmtp, OCIError *errhp, ub4 nrows,
+
+ ub2 orientation, ub4 mode);
+
+
+
+sword SDO_OCIStmtGetBindInfo(OCIStmt *stmtp, OCIError *errhp, ub4 size,
+
+ ub4 startloc, sb4 *found, text *bvnp[], ub1 bvnl[],
+
+ text *invp[], ub1 inpl[], ub1 dupl[], OCIBind *hndl[]);
+
+
+
+sword SDO_OCIDescribeAny(OCISvcCtx *svchp, OCIError *errhp, dvoid *objptr,
+
+ ub4 objnm_len, ub1 objptr_typ, ub1 info_level,
+
+ ub1 objtyp, OCIDescribe *dschp);
+
+
+
+sword SDO_OCIParamGet(CONST dvoid *hndlp, ub4 htype, OCIError *errhp,
+
+ dvoid **parmdpp, ub4 pos);
+
+
+
+sword SDO_OCIParamSet(dvoid *hdlp, ub4 htyp, OCIError *errhp, CONST dvoid *dscp,
+
+ ub4 dtyp, ub4 pos);
+
+
+
+sword SDO_OCITransStart(OCISvcCtx *svchp, OCIError *errhp, uword timeout, ub4 flags);
+
+
+
+sword SDO_OCITransDetach(OCISvcCtx *svchp, OCIError *errhp, ub4 flags );
+
+
+
+sword SDO_OCITransCommit(OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+
+
+sword SDO_OCITransRollback(OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+
+
+sword SDO_OCITransPrepare(OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+
+
+sword SDO_OCITransForget(OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+
+
+sword SDO_OCIErrorGet(dvoid *hndlp, ub4 recordno, text *sqlstate,
+
+ sb4 *errcodep, text *bufp, ub4 bufsiz, ub4 type);
+
+
+
+sword SDO_OCILobAppend(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+
+ OCILobLocator *src_locp);
+
+
+
+sword SDO_OCILobAssign(OCIEnv *envhp, OCIError *errhp, CONST OCILobLocator *src_locp,
+
+ OCILobLocator **dst_locpp);
+
+
+
+sword SDO_OCILobCharSetForm(OCIEnv *envhp, OCIError *errhp,
+
+ CONST OCILobLocator *locp, ub1 *csfrm);
+
+
+
+sword SDO_OCILobCharSetId(OCIEnv *envhp, OCIError *errhp,
+
+ CONST OCILobLocator *locp, ub2 *csid);
+
+
+
+sword SDO_OCILobCopy(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+
+ OCILobLocator *src_locp, ub4 amount, ub4 dst_offset,
+
+ ub4 src_offset);
+
+
+
+sword SDO_OCILobDisableBuffering(OCISvcCtx *svchp, OCIError *errhp,
+
+ OCILobLocator *locp);
+
+
+
+sword SDO_OCILobEnableBuffering(OCISvcCtx *svchp, OCIError *errhp,
+
+ OCILobLocator *locp);
+
+
+
+sword SDO_OCILobErase(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+ ub4 *amount, ub4 offset);
+
+
+
+sword SDO_OCILobFileClose(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep);
+
+
+
+sword SDO_OCILobFileCloseAll(OCISvcCtx *svchp, OCIError *errhp);
+
+
+
+sword SDO_OCILobFileExists(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep,
+
+ boolean *flag);
+
+
+
+sword SDO_OCILobFileGetName(OCIEnv *envhp, OCIError *errhp,
+
+ CONST OCILobLocator *filep, text *dir_alias,
+
+ ub2 *d_length, text *filename, ub2 *f_length);
+
+
+
+sword SDO_OCILobFileIsOpen(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep,
+
+ boolean *flag);
+
+
+
+sword SDO_OCILobFileOpen(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep,
+
+ ub1 mode);
+
+
+
+sword SDO_OCILobFileSetName(OCIEnv *envhp, OCIError *errhp, OCILobLocator **filepp,
+
+ CONST text *dir_alias, ub2 d_length,
+
+ CONST text *filename, ub2 f_length);
+
+
+
+sword SDO_OCILobFlushBuffer(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+ ub4 flag);
+
+
+
+sword SDO_OCILobGetLength(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+ ub4 *lenp);
+
+
+
+sword SDO_OCILobIsEqual(OCIEnv *envhp, CONST OCILobLocator *x,
+
+ CONST OCILobLocator *y, boolean *is_equal);
+
+
+
+sword SDO_OCILobLoadFromFile(OCISvcCtx *svchp, OCIError *errhp,
+
+ OCILobLocator *dst_locp, OCILobLocator *src_filep,
+
+ ub4 amount, ub4 dst_offset, ub4 src_offset);
+
+
+
+sword SDO_OCILobLocatorIsInit(OCIEnv *envhp, OCIError *errhp,
+
+ CONST OCILobLocator *locp, boolean *is_initialized);
+
+
+
+sword SDO_OCILobRead(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+ ub4 *amtp, ub4 offset, dvoid *bufp, ub4 bufl,
+
+ dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, CONST dvoid *bufp,
+
+ ub4 len, ub1 piece), ub2 csid, ub1 csfrm);
+
+
+
+sword SDO_OCILobTrim(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+ ub4 newlen);
+
+
+
+sword SDO_OCILobWrite(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+ ub4 *amtp, ub4 offset, dvoid *bufp, ub4 buflen, ub1 piece,
+
+ dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, dvoid *bufp, ub4 *len,
+
+ ub1 *piece), ub2 csid, ub1 csfrm);
+
+
+
+sword SDO_OCIBreak(dvoid *hndlp, OCIError *errhp);
+
+
+
+sword SDO_OCIServerVersion(dvoid *hndlp, OCIError *errhp, text *bufp, ub4 bufsz,
+
+ ub1 hndltype);
+
+
+
+sword SDO_OCIAttrGet(CONST dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep,
+
+ ub4 *sizep, ub4 attrtype, OCIError *errhp);
+
+
+
+sword SDO_OCIAttrSet(dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep,
+
+ ub4 size, ub4 attrtype, OCIError *errhp);
+
+
+
+sword SDO_OCISvcCtxToLda(OCISvcCtx *svchp, OCIError *errhp, Lda_Def *ldap);
+
+
+
+sword SDO_OCILdaToSvcCtx(OCISvcCtx **svchpp, OCIError *errhp, Lda_Def *ldap);
+
+
+
+sword SDO_OCIResultSetToStmt(OCIResult *rsetdp, OCIError *errhp);
+
+
+
+
+
+/********************************************************************************/
+
+/* Part II -- OCI navigational interfaces */
+
+/********************************************************************************/
+
+sword SDO_OCIObjectNew(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ OCITypeCode typecode, OCIType *tdo, dvoid *table,
+
+ OCIDuration duration, boolean value, dvoid **instance);
+
+
+
+sword SDO_OCIObjectPin(OCIEnv *env, OCIError *err, OCIRef *object_ref,
+
+ OCIComplexObject *corhdl, OCIPinOpt pin_option,
+
+ OCIDuration pin_duration, OCILockOpt lock_option,
+
+ dvoid **object);
+
+
+
+sword SDO_OCIObjectUnpin(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectPinCountReset(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectLock(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectMarkUpdate(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectUnmark(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectUnmarkByRef(OCIEnv *env, OCIError *err, OCIRef *ref);
+
+
+
+sword SDO_OCIObjectFree(OCIEnv *env, OCIError *err, dvoid *instance,
+
+ ub2 flags);
+
+
+
+sword SDO_OCIObjectMarkDeleteByRef(OCIEnv *env, OCIError *err, OCIRef *object_ref);
+
+
+
+sword SDO_OCIObjectMarkDelete(OCIEnv *env, OCIError *err, dvoid *instance);
+
+
+
+sword SDO_OCIObjectFlush(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectRefresh(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectCopy(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ dvoid *source, dvoid *null_source, dvoid *target,
+
+ dvoid *null_target, OCIType *tdo, OCIDuration duration,
+
+ ub1 option);
+
+
+
+sword SDO_OCIObjectGetTypeRef(OCIEnv *env, OCIError *err, dvoid *instance,
+
+ OCIRef *type_ref);
+
+
+
+sword SDO_OCIObjectGetObjectRef(OCIEnv *env, OCIError *err, dvoid *object,
+
+ OCIRef *object_ref);
+
+
+
+sword SDO_OCIObjectGetInd(OCIEnv *env, OCIError *err, dvoid *instance,
+
+ dvoid **null_struct);
+
+
+
+sword SDO_OCIObjectExists(OCIEnv *env, OCIError *err, dvoid *ins, boolean *exist);
+
+
+
+sword SDO_OCIObjectGetProperty(OCIEnv *envh, OCIError *errh, CONST dvoid *obj,
+
+ OCIObjectPropId propertyId, dvoid *property,
+
+ ub4 *size);
+
+
+
+sword SDO_OCIObjectIsLocked(OCIEnv *env, OCIError *err, dvoid *ins, boolean *lock);
+
+
+
+sword SDO_OCIObjectIsDirty(OCIEnv *env, OCIError *err, dvoid *ins, boolean *dirty);
+
+
+
+sword SDO_OCIObjectPinTable(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ CONST text *schema_name, ub4 s_n_length,
+
+ CONST text *object_name, ub4 o_n_length,
+
+ CONST OCIRef *scope_obj_ref, OCIDuration pin_duration,
+
+ dvoid** object);
+
+
+
+sword SDO_OCIObjectArrayPin(OCIEnv *env, OCIError *err, OCIRef **ref_array,
+
+ ub4 array_size, OCIComplexObject **cor_array,
+
+ ub4 cor_array_size, OCIPinOpt pin_option,
+
+ OCIDuration pin_duration, OCILockOpt lock,
+
+ dvoid **obj_array, ub4 *pos);
+
+
+
+sword SDO_OCICacheFlush(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ dvoid *context, OCIRef *(*get)(dvoid *context, ub1 *last),
+
+ OCIRef **ref);
+
+
+
+sword SDO_OCICacheRefresh(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ OCIRefreshOpt option, dvoid *context,
+
+ OCIRef *(*get)(dvoid *context), OCIRef **ref);
+
+
+
+sword SDO_OCICacheUnpin(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc);
+
+
+
+sword SDO_OCICacheFree(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc);
+
+
+
+sword SDO_OCICacheUnmark(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc);
+
+
+
+sword SDO_OCIDurationBegin(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ OCIDuration parent, OCIDuration *dur);
+
+
+
+sword SDO_OCIDurationEnd(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ OCIDuration duration);
+
+
+
+sword SDO_OCIDurationGetParent(OCIEnv *env, OCIError *err,
+
+ OCIDuration duration, OCIDuration *parent);
+
+
+
+sword SDO_OCIObjectAlwaysLatest(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectNotAlwaysLatest(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectFlushRefresh(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectIsLoaded(OCIEnv *env, OCIError *err, dvoid *ins,
+
+ boolean *load);
+
+
+
+sword SDO_OCIObjectIsDirtied(OCIEnv *env, OCIError *err, dvoid *ins,
+
+ boolean *dirty);
+
+
+
+sword SDO_OCICacheGetObjects(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ OCIObjectProperty property, dvoid *client_context,
+
+ void (*client_callback)(dvoid *client_context,
+
+ dvoid *object));
+
+
+
+sword SDO_OCICacheRegister(OCIEnv *env, OCIError *err, OCIObjectEvent event,
+
+ dvoid *client_context, void (*client_callback)(
+
+ dvoid *client_context, OCIObjectEvent event,
+
+ dvoid *object));
+
+
+
+sword SDO_OCICacheFlushRefresh(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ dvoid *context, OCIRef *(*get)(dvoid *context,
+
+ ub1 *last), OCIRef **ref);
+
+
+
+
+
+/********************************************************************************/
+
+/* Part III -- OCI primitive OTS interfaces */
+
+/********************************************************************************/
+
+void SDO_OCINumberSetZero(OCIError *err, OCINumber *num);
+
+
+
+sword SDO_OCINumberAdd(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, OCINumber *result);
+
+
+
+sword SDO_OCINumberSub(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, OCINumber *result);
+
+
+
+sword SDO_OCINumberMul(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, OCINumber *result);
+
+
+
+sword SDO_OCINumberDiv(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, OCINumber *result);
+
+
+
+sword SDO_OCINumberMod(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, OCINumber *result);
+
+
+
+sword SDO_OCINumberIntPower(OCIError *err, CONST OCINumber *base,
+
+ CONST sword exp, OCINumber *result);
+
+
+
+sword SDO_OCINumberNeg(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberToText(OCIError *err, CONST OCINumber *number,
+
+ CONST text *fmt, ub4 fmt_length,
+
+ CONST text *nls_params, ub4 nls_p_length,
+
+ ub4 *buf_size, text *buf);
+
+
+
+sword SDO_OCINumberFromText(OCIError *err, CONST text *str, ub4 str_length,
+
+ CONST text *fmt, ub4 fmt_length,
+
+ CONST text *nls_params, ub4 nls_p_length,
+
+ OCINumber *number);
+
+
+
+sword SDO_OCINumberToInt(OCIError *err, CONST OCINumber *number,
+
+ uword rsl_length, uword rsl_flag, dvoid *rsl);
+
+
+
+sword SDO_OCINumberFromInt(OCIError *err, CONST dvoid *inum, uword inum_length,
+
+ uword inum_s_flag, OCINumber *number);
+
+
+
+sword SDO_OCINumberToReal(OCIError *err, CONST OCINumber *number,
+
+ uword rsl_length, dvoid *rsl);
+
+
+
+sword SDO_OCINumberFromReal(OCIError *err, CONST dvoid *rnum,
+
+ uword rnum_length, OCINumber *number);
+
+
+
+sword SDO_OCINumberCmp(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, sword *result);
+
+
+
+sword SDO_OCINumberSign(OCIError *err, CONST OCINumber *number,
+
+ sword *result);
+
+
+
+sword SDO_OCINumberIsZero(OCIError *err, CONST OCINumber *number,
+
+ boolean *result);
+
+
+
+sword SDO_OCINumberAssign(OCIError *err, CONST OCINumber *from,
+
+ OCINumber *to);
+
+
+
+sword SDO_OCINumberAbs(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberCeil(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberFloor(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberSqrt(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberTrunc(OCIError *err, CONST OCINumber *number,
+
+ sword decplace, OCINumber *result);
+
+
+
+sword SDO_OCINumberPower(OCIError *err, CONST OCINumber *base,
+
+ CONST OCINumber *number, OCINumber *result);
+
+
+
+sword SDO_OCINumberRound(OCIError *err, CONST OCINumber *number,
+
+ sword decplace, OCINumber *result);
+
+
+
+sword SDO_OCINumberSin(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberArcSin(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberHypSin(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberCos(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberArcCos(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberHypCos(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberTan(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberArcTan(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberArcTan2(OCIError *err, CONST OCINumber *number1,
+
+ CONST OCINumber *number2, OCINumber *result);
+
+
+
+sword SDO_OCINumberHypTan(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberExp(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberLn(OCIError *err, CONST OCINumber *number,
+
+ OCINumber *result);
+
+
+
+sword SDO_OCINumberLog(OCIError *err, CONST OCINumber *base,
+
+ CONST OCINumber *number, OCINumber *result);
+
+
+
+sword SDO_OCIDateAssign(OCIError *err, CONST OCIDate *from, OCIDate *to);
+
+
+
+sword SDO_OCIDateToText(OCIError *err, CONST OCIDate *date,
+
+ CONST text *fmt, ub1 fmt_length,
+
+ CONST text *lang_name, ub4 lang_length,
+
+ ub4 *buf_size, text *buf);
+
+
+
+sword SDO_OCIDateFromText(OCIError *err, CONST text *date_str,
+
+ ub4 d_str_length, CONST text *fmt, ub1 fmt_length,
+
+ CONST text *lang_name, ub4 lang_length,
+
+ OCIDate *date);
+
+
+
+sword SDO_OCIDateCompare(OCIError *err, CONST OCIDate *date1,
+
+ CONST OCIDate *date2, sword *result);
+
+
+
+sword SDO_OCIDateAddMonths(OCIError *err, CONST OCIDate *date, sb4 num_months,
+
+ OCIDate *result);
+
+
+
+sword SDO_OCIDateAddDays(OCIError *err, CONST OCIDate *date, sb4 num_days,
+
+ OCIDate *result);
+
+
+
+sword SDO_OCIDateLastDay(OCIError *err, CONST OCIDate *date,
+
+ OCIDate *last_day);
+
+
+
+sword SDO_OCIDateDaysBetween(OCIError *err, CONST OCIDate *date1,
+
+ CONST OCIDate *date2, sb4 *num_days);
+
+
+
+sword SDO_OCIDateZoneToZone(OCIError *err, CONST OCIDate *date1,
+
+ CONST text *zon1, ub4 zon1_length,
+
+ CONST text *zon2, ub4 zon2_length, OCIDate *date2);
+
+
+
+sword SDO_OCIDateNextDay(OCIError *err, CONST OCIDate *date, CONST text *day_p,
+
+ ub4 day_length, OCIDate *next_day);
+
+
+
+
+
+sword SDO_OCIDateCheck(OCIError *err, CONST OCIDate *date, uword *valid);
+
+
+
+sword SDO_OCIDateSysDate(OCIError *err, OCIDate *sys_date);
+
+
+
+sword SDO_OCIStringAssign(OCIEnv *env, OCIError *err, CONST OCIString *rhs,
+
+ OCIString **lhs);
+
+
+
+sword SDO_OCIStringAssignText(OCIEnv *env, OCIError *err, CONST text *rhs,
+
+ ub4 rhs_len, OCIString **lhs);
+
+
+
+sword SDO_OCIStringResize(OCIEnv *env, OCIError *err, ub4 new_size,
+
+ OCIString **str);
+
+
+
+ub4 SDO_OCIStringSize(OCIEnv *env, CONST OCIString *vs);
+
+
+
+text *SDO_OCIStringPtr(OCIEnv *env, CONST OCIString *vs);
+
+
+
+sword SDO_OCIStringAllocSize(OCIEnv *env, OCIError *err, CONST OCIString *vs,
+
+ ub4 *allocsize);
+
+
+
+sword SDO_OCIRawAssignRaw(OCIEnv *env, OCIError *err, CONST OCIRaw *rhs,
+
+ OCIRaw **lhs);
+
+
+
+sword SDO_OCIRawAssignBytes(OCIEnv *env, OCIError *err, CONST ub1 *rhs,
+
+ ub4 rhs_len, OCIRaw **lhs);
+
+
+
+sword SDO_OCIRawResize(OCIEnv *env, OCIError *err, ub4 new_size, OCIRaw **raw);
+
+
+
+ub4 SDO_OCIRawSize(OCIEnv *env, CONST OCIRaw *raw);
+
+
+
+ub1 *SDO_OCIRawPtr(OCIEnv *env, CONST OCIRaw *raw);
+
+
+
+sword SDO_OCIRawAllocSize(OCIEnv *env, OCIError *err, CONST OCIRaw *raw,
+
+ ub4 *allocsize);
+
+
+
+void SDO_OCIRefClear(OCIEnv *env, OCIRef *ref);
+
+
+
+sword SDO_OCIRefAssign(OCIEnv *env, OCIError *err, CONST OCIRef *source,
+
+ OCIRef **target);
+
+
+
+boolean SDO_OCIRefIsEqual(OCIEnv *env, CONST OCIRef *x, CONST OCIRef *y);
+
+
+
+boolean SDO_OCIRefIsNull(OCIEnv *env, CONST OCIRef *ref);
+
+
+
+ub4 SDO_OCIRefHexSize(OCIEnv *env, CONST OCIRef *ref);
+
+
+
+sword SDO_OCIRefFromHex(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ CONST text *hex, ub4 length, OCIRef **ref);
+
+
+
+sword SDO_OCIRefToHex(OCIEnv *env, OCIError *err, CONST OCIRef *ref,
+
+ text *hex, ub4 *hex_length);
+
+
+
+sword SDO_OCICollSize(OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+
+ sb4 *size);
+
+
+
+sb4 SDO_OCICollMax(OCIEnv *env, CONST OCIColl *coll);
+
+
+
+sword SDO_OCICollGetElem(OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+
+ sb4 index, boolean *exists, dvoid **elem,
+
+ dvoid **elemind);
+
+
+
+sword SDO_OCICollAssignElem(OCIEnv *env, OCIError *err, sb4 index,
+
+ CONST dvoid *elem,
+
+ CONST dvoid *elemind, OCIColl *coll);
+
+
+
+sword SDO_OCICollAssign(OCIEnv *env, OCIError *err, CONST OCIColl *rhs,
+
+ OCIColl *lhs);
+
+
+
+sword SDO_OCICollAppend(OCIEnv *env, OCIError *err, CONST dvoid *elem,
+
+ CONST dvoid *elemind, OCIColl *coll);
+
+
+
+sword SDO_OCICollTrim(OCIEnv *env, OCIError *err, sb4 trim_num,
+
+ OCIColl *coll);
+
+
+
+sword SDO_OCIIterCreate(OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+
+ OCIIter **itr);
+
+
+
+sword SDO_OCIIterDelete(OCIEnv *env, OCIError *err, OCIIter **itr);
+
+
+
+sword SDO_OCIIterInit(OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+
+ OCIIter *itr);
+
+
+
+sword SDO_OCIIterGetCurrent(OCIEnv *env, OCIError *err, CONST OCIIter *itr,
+
+ dvoid **elem, dvoid **elemind);
+
+
+
+sword SDO_OCIIterNext(OCIEnv *env, OCIError *err, OCIIter *itr,
+
+ dvoid **elem, dvoid **elemind, boolean *eoc);
+
+
+
+sword SDO_OCIIterPrev(OCIEnv *env, OCIError *err, OCIIter *itr,
+
+ dvoid **elem, dvoid **elemind, boolean *boc);
+
+
+
+sword SDO_OCITableSize(OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+
+ sb4 *size);
+
+
+
+sword SDO_OCITableExists(OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+
+ sb4 index, boolean *exists);
+
+
+
+sword SDO_OCITableDelete(OCIEnv *env, OCIError *err, sb4 index, OCITable *tbl);
+
+
+
+sword SDO_OCITableFirst(OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+
+ sb4 *index);
+
+
+
+sword SDO_OCITableLast(OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+
+ sb4 *index);
+
+
+
+sword SDO_OCITableNext(OCIEnv *env, OCIError *err, sb4 index,
+
+ CONST OCITable *tbl, sb4 *next_index, boolean *exists);
+
+
+
+sword SDO_OCITablePrev(OCIEnv *env, OCIError *err, sb4 index,
+
+ CONST OCITable *tbl, sb4 *prev_index, boolean *exists);
+
+
+
+
+
+/********************************************************************************/
+
+/* Part IV -- OCI open type manager interfaces */
+
+/********************************************************************************/
+
+sword SDO_OCITypeIterNew(OCIEnv *env, OCIError *err, OCIType *tdo,
+
+ OCITypeIter **iteratorOCI);
+
+
+
+sword SDO_OCITypeIterSet(OCIEnv *env, OCIError *err, OCIType *tdo,
+
+ OCITypeIter *iteratorOCI);
+
+
+
+sword SDO_OCITypeIterFree(OCIEnv *env, OCIError *err, OCITypeIter *iteratorOCI);
+
+
+
+sword SDO_OCITypeByName(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ CONST text *schema_name, ub4 s_length,
+
+ CONST text *type_name, ub4 t_length,
+
+ CONST text *version_name, ub4 v_length,
+
+ OCIDuration pin_duration, OCITypeGetOpt get_option,
+
+ OCIType **tdo);
+
+
+
+sword SDO_OCITypeArrayByName(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+ ub4 array_len, CONST text *schema_name[],
+
+ ub4 s_length[], CONST text *type_name[],
+
+ ub4 t_length[], CONST text *version_name[],
+
+ ub4 v_length[], OCIDuration pin_duration,
+
+ OCITypeGetOpt get_option, OCIType *tdo[]);
+
+
+
+sword SDO_OCITypeByRef(OCIEnv *env, OCIError *err, CONST OCIRef *type_ref,
+
+ OCIDuration pin_duration,OCITypeGetOpt get_option,
+
+ OCIType **tdo);
+
+
+
+sword SDO_OCITypeArrayByRef(OCIEnv *env, OCIError *err, ub4 array_len,
+
+ CONST OCIRef *type_ref[], OCIDuration pin_duration,
+
+ OCITypeGetOpt get_option, OCIType *tdo[]);
+
+
+
+text* SDO_OCITypeName(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ ub4 *n_length);
+
+
+
+text* SDO_OCITypeSchema(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ ub4 *n_length);
+
+
+
+OCITypeCode SDO_OCITypeTypeCode(OCIEnv *env, OCIError *err, CONST OCIType *tdo);
+
+
+
+OCITypeCode SDO_OCITypeCollTypeCode(OCIEnv *env, OCIError *err,
+
+ CONST OCIType *tdo);
+
+
+
+text* SDO_OCITypeVersion(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ ub4 *v_length);
+
+
+
+ub4 SDO_OCITypeAttrs(OCIEnv *env, OCIError *err, CONST OCIType *tdo);
+
+
+
+ub4 SDO_OCITypeMethods(OCIEnv *env, OCIError *err, CONST OCIType *tdo);
+
+
+
+text* SDO_OCITypeElemName(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem,
+
+ ub4 *n_length);
+
+
+
+OCITypeCode SDO_OCITypeElemTypeCode(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeElem *elem);
+
+
+
+sword SDO_OCITypeElemType(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem,
+
+ OCIType **elem_tdo);
+
+
+
+ub4 SDO_OCITypeElemFlags(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem);
+
+
+
+ub1 SDO_OCITypeElemNumPrec(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem);
+
+
+
+sb1 SDO_OCITypeElemNumScale(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem);
+
+
+
+ub4 SDO_OCITypeElemLength(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem);
+
+
+
+ub2 SDO_OCITypeElemCharSetID(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem);
+
+
+
+ub2 SDO_OCITypeElemCharSetForm(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem);
+
+
+
+sword SDO_OCITypeElemParameterizedType(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeElem *elem,
+
+ OCIType **type_stored);
+
+
+
+OCITypeCode SDO_OCITypeElemExtTypeCode(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeElem *elem);
+
+
+
+sword SDO_OCITypeAttrByName(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ CONST text *name, ub4 n_length, OCITypeElem **elem);
+
+
+
+sword SDO_OCITypeAttrNext(OCIEnv *env, OCIError *err, OCITypeIter *iteratorOCI,
+
+ OCITypeElem **elem);
+
+
+
+sword SDO_OCITypeCollElem(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ OCITypeElem **element);
+
+
+
+sword SDO_OCITypeCollSize(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ ub4 *num_elems);
+
+
+
+sword SDO_OCITypeCollExtTypeCode(OCIEnv *env, OCIError *err,
+
+ CONST OCIType *tdo, OCITypeCode *sqt_code);
+
+
+
+ub4 SDO_OCITypeMethodOverload(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ CONST text *method_name, ub4 m_length);
+
+
+
+sword SDO_OCITypeMethodByName(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ CONST text *method_name, ub4 m_length,
+
+ OCITypeMethod **mdos);
+
+
+
+sword SDO_OCITypeMethodNext(OCIEnv *env, OCIError *err, OCITypeIter *iteratorOCI,
+
+ OCITypeMethod **mdo);
+
+
+
+text *SDO_OCITypeMethodName(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeMethod *mdo, ub4 *n_length);
+
+
+
+OCITypeEncap SDO_OCITypeMethodEncap(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeMethod *mdo);
+
+
+
+OCITypeMethodFlag SDO_OCITypeMethodFlags(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeMethod *mdo);
+
+
+
+sword SDO_OCITypeMethodMap(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ OCITypeMethod **mdo);
+
+
+
+sword SDO_OCITypeMethodOrder(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+ OCITypeMethod **mdo);
+
+
+
+ub4 SDO_OCITypeMethodParams(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeMethod *mdo);
+
+
+
+sword SDO_OCITypeResult(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo,
+
+ OCITypeElem **elem);
+
+
+
+sword SDO_OCITypeParamByPos(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo,
+
+ ub4 position, OCITypeElem **elem);
+
+
+
+sword SDO_OCITypeParamByName(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo,
+
+ CONST text *name, ub4 n_length, OCITypeElem **elem);
+
+
+
+sword SDO_OCITypeParamPos(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo,
+
+ CONST text *name, ub4 n_length, ub4 *position,
+
+ OCITypeElem **elem);
+
+
+
+OCITypeParamMode SDO_OCITypeElemParamMode(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeElem *elem);
+
+
+
+text* SDO_OCITypeElemDefaultValue(OCIEnv *env, OCIError *err,
+
+ CONST OCITypeElem *elem, ub4 *d_v_length);
+
+
+
+sword SDO_OCITypeVTInit(OCIEnv *env, OCIError *err);
+
+
+
+sword SDO_OCITypeVTInsert(OCIEnv *env, OCIError *err, CONST text *schema_name,
+
+ ub4 s_n_length, CONST text *type_name, ub4 t_n_length,
+
+ CONST text *user_version, ub4 u_v_length);
+
+
+
+sword SDO_OCITypeVTSelect(OCIEnv *env, OCIError *err, CONST text *schema_name,
+
+ ub4 s_n_length, CONST text *type_name, ub4 t_n_length,
+
+ text **user_version, ub4 *u_v_length, ub2 *version);
+
+
+#endif /* SDO_OCI_H */
+
+
diff --git a/src/terralib/drivers/PostgreSQL/TePGInterface.cpp b/src/terralib/drivers/PostgreSQL/TePGInterface.cpp
new file mode 100644
index 0000000..78ae72d
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePGInterface.cpp
@@ -0,0 +1,1581 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ * TODO: 1. N�O PEGAR O DOBRO DE REGISTROS NA VOLTA (MOVE PREVIOUS) NO FUTURO!!!!
+ *
+ */
+
+#include "TePGInterface.h"
+#include "TePGUtils.h"
+#include <stdexcept>
+#include <string>
+
+
+
+#include "TeUtils.h"
+
+/*
+ * Read/write mode flags for inversion (large object) calls
+ */
+
+#define INV_WRITE 0x00020000
+#define INV_READ 0x00040000
+
+/*
+ * Read buffer size
+ */
+#define BUFFSIZE 1024
+
+/*
+ * PostgreSQL Geometric Types
+ */
+typedef struct
+{
+ double x, y;
+} BIN_PG_POINT;
+
+using namespace std;
+
+/*******************************
+ * FUN��ES AUXILIARES *
+ *******************************/
+// This function is the same parse_hex function in PostGIS rc3 source code.
+inline unsigned char parse_hex(char *str)
+{
+ //do this a little brute force to make it faster
+
+ unsigned char result_high = 0;
+ unsigned char result_low = 0;
+
+ switch (str[0])
+ {
+ case '0' :
+ result_high = 0;
+ break;
+ case '1' :
+ result_high = 1;
+ break;
+ case '2' :
+ result_high = 2;
+ break;
+ case '3' :
+ result_high = 3;
+ break;
+ case '4' :
+ result_high = 4;
+ break;
+ case '5' :
+ result_high = 5;
+ break;
+ case '6' :
+ result_high = 6;
+ break;
+ case '7' :
+ result_high = 7;
+ break;
+ case '8' :
+ result_high = 8;
+ break;
+ case '9' :
+ result_high = 9;
+ break;
+ case 'A' :
+ result_high = 10;
+ break;
+ case 'B' :
+ result_high = 11;
+ break;
+ case 'C' :
+ result_high = 12;
+ break;
+ case 'D' :
+ result_high = 13;
+ break;
+ case 'E' :
+ result_high = 14;
+ break;
+ case 'F' :
+ result_high = 15;
+ break;
+ }
+ switch (str[1])
+ {
+ case '0' :
+ result_low = 0;
+ break;
+ case '1' :
+ result_low = 1;
+ break;
+ case '2' :
+ result_low = 2;
+ break;
+ case '3' :
+ result_low = 3;
+ break;
+ case '4' :
+ result_low = 4;
+ break;
+ case '5' :
+ result_low = 5;
+ break;
+ case '6' :
+ result_low = 6;
+ break;
+ case '7' :
+ result_low = 7;
+ break;
+ case '8' :
+ result_low = 8;
+ break;
+ case '9' :
+ result_low = 9;
+ break;
+ case 'A' :
+ result_low = 10;
+ break;
+ case 'B' :
+ result_low = 11;
+ break;
+ case 'C' :
+ result_low = 12;
+ break;
+ case 'D' :
+ result_low = 13;
+ break;
+ case 'E' :
+ result_low = 14;
+ break;
+ case 'F' :
+ result_low = 15;
+ break;
+ }
+ return (unsigned char) ((result_high<<4) + result_low);
+}
+
+
+/*******************************
+ * Definicao de TePGConnection *
+ *******************************/
+bool TePGConnection::open(const string& str_connection)
+{
+ close();
+
+ pg_connection_ = PQconnectdb(str_connection.c_str());
+
+ if(this->state())
+ {
+ int_connection_ = 1;
+ return true;
+ }
+ else
+ return false;
+}
+
+void TePGConnection::close(void)
+{
+ if(int_connection_)
+ {
+ if(pg_connection_)
+ {
+ PQfinish(pg_connection_);
+ }
+ pg_connection_ = 0;
+ int_connection_ = 0;
+ }
+ return;
+}
+
+
+int TePGConnection::exec_cmd(const string& str_qry)
+{
+ PGresult *result_temp;
+ int resp = -1;
+ result_temp = PQexec(pg_connection_, str_qry.c_str());
+
+ switch (PQresultStatus(result_temp))
+ {
+ case PGRES_EMPTY_QUERY: // The string sent to the backend was empty.
+ break;
+ case PGRES_COMMAND_OK: // Successful completion of a command returning no data
+ resp = atoi(PQcmdTuples(result_temp));
+ last_oid_ = PQoidValue(result_temp);
+ break;
+ case PGRES_TUPLES_OK: // The query successfully executed
+ break;
+
+ case PGRES_COPY_OUT: // Copy Out (from server) data transfer started
+ case PGRES_COPY_IN: // Copy In (to server) data transfer started
+ break;
+
+ case PGRES_BAD_RESPONSE: // The server's response was not understood
+ case PGRES_NONFATAL_ERROR: // TODO: Is this one really an error?
+ case PGRES_FATAL_ERROR:
+ throw runtime_error("The server's response was not understood");
+
+ default:
+ throw logic_error("Internal lib TePGInterface error: ");
+ }
+
+ PQclear(result_temp);
+ result_temp = 0;
+ return resp;
+}
+
+Oid TePGConnection::insertBlob(char* buff, const int& blobSize)
+{
+ if(!buff)
+ return 0;
+
+ Oid obj_oid = lo_creat(pg_connection_, INV_READ | INV_WRITE);
+
+ int fd = lo_open(pg_connection_, obj_oid, INV_READ);
+
+ if(fd < 0)
+ return 0;
+
+ int nbwrite = 0;
+
+ int size_tmp = blobSize;
+
+ while(size_tmp > 0)
+ {
+ if((size_tmp - BUFFSIZE) >= 0)
+ nbwrite = lo_write(pg_connection_, fd, buff, BUFFSIZE);
+ else
+ nbwrite = lo_write(pg_connection_, fd, buff, size_tmp);
+
+ if(nbwrite <= 0)
+ return 0;
+
+ buff += nbwrite;
+ size_tmp -= nbwrite;
+ }
+
+ if(lo_close(pg_connection_, fd) == 0)
+ return obj_oid;
+
+ return 0;
+}
+
+int TePGConnection::getBlob(const Oid& blobId, char *&buff)
+{
+ int fd = lo_open(pg_connection_, blobId, INV_READ);
+
+ if(fd < 0)
+ return -1;
+
+ int len = lo_lseek(pg_connection_, fd, 0, SEEK_END);
+
+ lo_lseek(pg_connection_, fd, 0, SEEK_SET);
+
+ if(len <= 0)
+ return len;
+
+ if(!buff)
+ buff = new char[len];
+
+ char* buffAux = buff;
+
+ int nbread = 0;
+
+ while((nbread = lo_read(pg_connection_, fd, buffAux, BUFFSIZE)) > 0)
+ buffAux += nbread;
+
+ return len;
+}
+
+bool TePGConnection::beginTransaction(void)
+{
+ if(inTransaction_)
+ return true;
+
+ if(exec_cmd("BEGIN TRANSACTION") == 0)
+ {
+ inTransaction_ = true;
+
+ return true;
+ }
+
+ return false;
+}
+
+
+bool TePGConnection::commitTransaction(void)
+{
+ if(exec_cmd("COMMIT TRANSACTION") == 0)
+ {
+ inTransaction_ = false;
+
+ return true;
+ }
+
+ return false;
+}
+
+bool TePGConnection::rollBackTransaction(void)
+{
+ if(exec_cmd("ROLLBACK TRANSACTION") == 0)
+ {
+ inTransaction_ = false;
+
+ return true;
+ }
+
+ return false;
+}
+
+
+/******************************
+ * Definicao de TePGRecordset *
+ ******************************/
+const int TePGRecordset::int_bof_ = -1;
+int TePGRecordset::openRecordSets_ = 0;
+set<int> TePGRecordset::freeCursorNumbers_;
+//const int TePGRecordset::numRowsToRetrieve_ = 2000;
+
+TePGRecordset::TePGRecordset(const string& str_qry, TePGConnection* con_x,
+ const TeCursorType& cursorType,
+ const TeCursorLocation& cursorLocation,
+ const TeCursorDataType& cursorDataType,
+ const int& numRowsToRetrieve)
+ : pg_recordset_(0), conn_(con_x), cursorDeclared_(false), int_index_current_(-1),
+ int_eof_(-1), cursorType_(cursorType), cursorLocation_(cursorLocation),
+ cursorDataType_(cursorDataType), numRowsToRetrieve_(numRowsToRetrieve)
+{
+ // endianness test
+ if(((unsigned int) 1) == htonl((unsigned int) 1))
+ isLittleEndian_ = false;
+ else
+ isLittleEndian_ = true;
+
+ if(freeCursorNumbers_.empty())
+ { // Se n�o houver cursores livres aberto => criar novo id
+ ++openRecordSets_;
+ recordSetId_ = openRecordSets_;
+ }
+ else
+ {
+ set<int>::iterator it = freeCursorNumbers_.begin();
+ recordSetId_ = *it;
+ freeCursorNumbers_.erase(it);
+ }
+
+ if(!str_qry.empty() && conn_)
+ open(str_qry, conn_, cursorType_, cursorLocation_, cursorDataType_);
+}
+
+TePGRecordset::~TePGRecordset()
+{
+ // Deixa o id livre
+ freeCursorNumbers_.insert(recordSetId_);
+
+ close();
+}
+
+void TePGRecordset::close(void)
+{
+ if(cursorDeclared_ && conn_)
+ {
+ string sqlCloseCursor = "CLOSE CURSOR_";
+ sqlCloseCursor += Te2String(recordSetId_);
+
+ conn_->exec_cmd(sqlCloseCursor.c_str());
+ }
+
+ freeRecordSet();
+
+ cursorDeclared_ = false;
+
+ conn_ = 0;
+
+ return;
+}
+
+bool TePGRecordset::moveFirst(void)
+{
+ if(!cursorDeclared_)
+ return false;
+
+ if(cursorLocation_ == TeCLIENTESIDE)
+ {
+ if(recordCount() > 0)
+ {
+ int_index_current_ = 0;
+ return true;
+ }
+ else
+ return false;
+ }
+
+ firstFetch = false;
+ lastFetch = false;
+
+ string moveFirstSQL = "MOVE ABSOLUTE 0 IN CURSOR_";
+ moveFirstSQL += Te2String(recordSetId_);
+
+ int res = conn_->exec_cmd(moveFirstSQL.c_str());
+
+ if(res == 0)
+ {
+ freeRecordSet();
+
+ string fetchSQL = "FETCH FORWARD " + Te2String(numRowsToRetrieve_);
+ fetchSQL += " FROM CURSOR_";
+ fetchSQL += Te2String(recordSetId_);
+
+ pg_recordset_ = conn_->exec(fetchSQL.c_str());
+
+ if(PQresultStatus(pg_recordset_) == PGRES_TUPLES_OK)
+ {
+ if(recordCount() > 0)
+ {
+ int_eof_ = recordCount();
+ int_index_current_ = 0;
+ return true;
+ }
+ }
+
+ freeRecordSet();
+ return false;
+ }
+
+ return false;
+}
+
+bool TePGRecordset::movePrevious(void)
+{
+ //if(!cursorDeclared_ || (cursorType_ == TeUNIDIRECTIONAL))
+ if(!cursorDeclared_)
+ return false;
+
+ if(cursorLocation_ == TeCLIENTESIDE)
+ {
+ if(bof())
+ return false;
+ else
+ {
+ --int_index_current_;
+ return true;
+ }
+ }
+
+ if(recordCount() > 0)
+ {
+ string move = "";
+ string fetchSQL = "";
+
+ if(!movingBackward_)
+ {
+ if(bof())
+ return false;
+
+ --int_index_current_;
+
+ if(bof())
+ {
+ movingBackward_ = true;
+
+ int val = recordCount() - 1;
+
+ if(lastFetch)
+ {
+ ++val;
+ }
+
+ move = " MOVE BACKWARD "+Te2String(val)+" FROM CURSOR_"+Te2String(recordSetId_)+";";
+
+ fetchSQL = move;
+ fetchSQL += " FETCH BACKWARD ";
+ fetchSQL += Te2String(numRowsToRetrieve_);
+ fetchSQL += " FROM CURSOR_";
+ fetchSQL += Te2String(recordSetId_);
+ }
+ else
+ {
+ return true;
+ }
+ }
+ else
+ {
+ if(eof())
+ return false;
+
+ ++int_index_current_;
+
+ if(eof())
+ {
+ fetchSQL = "FETCH BACKWARD ";
+ fetchSQL += Te2String(numRowsToRetrieve_);
+ fetchSQL += " FROM CURSOR_";
+ fetchSQL += Te2String(recordSetId_);
+ }
+ else
+ {
+ return true;
+ }
+ }
+ pg_recordset_ = conn_->exec(fetchSQL.c_str());
+
+ if(PQresultStatus(pg_recordset_) == PGRES_TUPLES_OK)
+ {
+ firstFetch = false;
+ lastFetch = false;
+
+ if(this->recordCount() > 0)
+ {
+ int_eof_ = recordCount();
+ int_index_current_ = 0;
+
+ if(this->recordCount() > 0 != numRowsToRetrieve_)
+ {
+ firstFetch = true;
+ }
+
+
+ return true;
+ }
+
+ }
+
+ freeRecordSet();
+ }
+
+ return false;
+}
+
+bool TePGRecordset::moveNext(void)
+{
+ if(!cursorDeclared_)
+ return false;
+
+ if(cursorLocation_ == TeCLIENTESIDE)
+ {
+ if(eof())
+ return false;
+
+ ++int_index_current_;
+
+ return true;
+ }
+
+ if((recordCount() > 0))
+ {
+ string move = "";
+ string fetchSQL = "";
+
+ if(!movingBackward_)
+ {
+ if(!eof())
+ {
+ ++int_index_current_;
+
+ if(eof())
+ {
+ fetchSQL = "FETCH FORWARD ";
+ fetchSQL += Te2String(numRowsToRetrieve_);
+ fetchSQL += " FROM CURSOR_";
+ fetchSQL += Te2String(recordSetId_);
+ }
+ else
+ {
+ return true;
+ }
+ }
+ }
+ else
+ {
+ if(!bof())
+ {
+ --int_index_current_;
+
+ if(bof())
+ {
+ movingBackward_ = false;
+ int val = recordCount() -1;
+ if(firstFetch)
+ {
+ ++val;
+ }
+ move = " MOVE FORWARD "+Te2String(val)+" FROM CURSOR_"+Te2String(recordSetId_)+";";
+
+ fetchSQL = move;
+
+ fetchSQL += "FETCH FORWARD ";
+ fetchSQL += Te2String(numRowsToRetrieve_);
+ fetchSQL += " FROM CURSOR_";
+ fetchSQL += Te2String(recordSetId_);
+ }
+ else
+ {
+ return true;
+ }
+ }
+ }
+ freeRecordSet();
+
+ pg_recordset_ = conn_->exec(fetchSQL.c_str());
+
+ if(PQresultStatus(pg_recordset_) == PGRES_TUPLES_OK)
+ {
+ firstFetch = false;
+ lastFetch = false;
+
+ if(recordCount() > 0)
+ {
+ int_eof_ = recordCount();
+ int_index_current_ = 0;
+
+ if(this->recordCount() > 0 != numRowsToRetrieve_)
+ {
+ lastFetch = true;
+ }
+
+ return true;
+ }
+ }
+
+ freeRecordSet();
+ }
+
+ return false;
+}
+
+bool TePGRecordset::moveLast(void)
+{
+ //if(!cursorDeclared_ || (cursorType_ == TeUNIDIRECTIONAL))
+ if(!cursorDeclared_)
+ return false;
+
+ if(cursorLocation_ == TeCLIENTESIDE)
+ {
+ if(recordCount() > 0)
+ {
+ int_index_current_ = recordCount() - 1;
+ return true;
+ }
+
+ return false;
+ }
+
+ firstFetch = false;
+ lastFetch = false;
+
+ freeRecordSet();
+
+ string fetchSQL = "FETCH LAST FROM CURSOR_";
+ fetchSQL += Te2String(recordSetId_);
+
+ pg_recordset_ = conn_->exec(fetchSQL.c_str());
+
+ if(PQresultStatus(pg_recordset_) == PGRES_TUPLES_OK)
+ {
+ if(this->recordCount() > 0)
+ {
+ int_eof_ = recordCount();
+ int_index_current_ = 0;
+ return true;
+ }
+ }
+
+ freeRecordSet();
+
+ return false;
+
+}
+
+bool TePGRecordset::moveTo(const int& lin_number)
+{
+ //if(!cursorDeclared_ || (cursorType_ == TeUNIDIRECTIONAL))
+ if(!cursorDeclared_)
+ return false;
+
+ if(cursorLocation_ == TeCLIENTESIDE)
+ {
+ if((lin_number > int_bof_) && (lin_number < int_eof_))
+ {
+ int_index_current_ = lin_number;
+ return true;
+ }
+
+ return false;
+ }
+
+ firstFetch = false;
+ lastFetch = false;
+
+ freeRecordSet();
+
+ string fetchSQL = "FETCH ABSOLUTE ";
+ fetchSQL += Te2String(lin_number);
+ fetchSQL += " FROM CURSOR_";
+ fetchSQL += Te2String(recordSetId_);
+
+ pg_recordset_ = conn_->exec(fetchSQL.c_str());
+
+ if(PQresultStatus(pg_recordset_) == PGRES_TUPLES_OK)
+ {
+ if(this->recordCount() > 0)
+ {
+ int_eof_ = recordCount();
+ int_index_current_ = 0;
+ return true;
+ }
+ }
+
+ freeRecordSet();
+
+ return false;
+}
+
+bool TePGRecordset::open(const string& str_qry, TePGConnection* con_x,
+ const TeCursorType& cursorType,
+ const TeCursorLocation& cursorLocation,
+ const TeCursorDataType& cursorDataType,
+ const int& numRowsToRetrieve)
+{
+ close();
+
+ if(str_qry.empty() || !con_x)
+ return false;
+
+ cursorType_ = cursorType;
+ cursorLocation_ = cursorLocation;
+ cursorDataType_ = cursorDataType;
+ numRowsToRetrieve_ = numRowsToRetrieve;
+ cursorDeclared_ = false;
+ conn_ = con_x;
+ movingBackward_ = false;
+ lastFetch = false;
+ firstFetch = false;
+
+ string sqlCursor = "DECLARE CURSOR_";
+ sqlCursor += Te2String(recordSetId_);
+ sqlCursor += (cursorDataType_ == TeBINARYCURSOR) ? " BINARY " : " ";
+ //sqlCursor += (cursorType_ == TeUNIDIRECTIONAL) ? " NO " : " ";
+ sqlCursor += "SCROLL CURSOR WITH HOLD FOR ";
+ sqlCursor += str_qry;
+
+ pg_recordset_ = conn_->exec(sqlCursor.c_str());
+
+ if(PQresultStatus(pg_recordset_) == PGRES_COMMAND_OK)
+ {
+ cursorDeclared_ = true;
+
+ string numRows = (cursorLocation_ == TeSERVERSIDE) ? Te2String(numRowsToRetrieve_) : string("ALL");
+
+ string fetchSQL = "FETCH FORWARD " + numRows;
+ fetchSQL += " FROM CURSOR_";
+ fetchSQL += Te2String(recordSetId_);
+
+ pg_recordset_ = conn_->exec(fetchSQL.c_str());
+
+ if(PQresultStatus(pg_recordset_) == PGRES_TUPLES_OK)
+ {
+ if(recordCount() > 0)
+ {
+ int_eof_ = recordCount();
+ int_index_current_ = 0;
+ }
+
+ return true;
+ }
+ }
+
+ freeRecordSet();
+
+ return false;
+}
+
+int TePGRecordset::getBytea(const int& field_num, char*& buff) const
+{
+ if(cursorDataType_ == TeTEXTCURSOR)
+ {
+ size_t newLen;
+
+ unsigned char* ptData = PQunescapeBytea((unsigned char*)(value(field_num)), &newLen);
+
+ if(newLen <= 0)
+ return newLen;
+
+ if(!buff)
+ buff = new char[newLen];
+
+ memcpy(buff, ptData, newLen);
+
+ TePGConnection::freeMem(ptData);
+
+ return newLen;
+ }
+ else // TeBINARYCURSOR
+ {
+ char* ptData = value(field_num);
+
+ unsigned int numBytes;
+ memcpy(&numBytes, ptData, sizeof(int));
+ numBytes = ntohl(numBytes);
+
+ if(!buff)
+ buff = new char[numBytes];
+
+ memcpy(buff, ptData + sizeof(int), numBytes);
+
+ return numBytes;
+ }
+}
+
+void TePGRecordset::getPGLine2D(const int& field_num, TeLine2D& l) const
+{
+ char* polygon = value(field_num);
+
+ if(cursorDataType_ == TeBINARYCURSOR)
+ {
+ unsigned int numPts;
+ memcpy(&numPts, polygon, sizeof(int));
+ numPts = ntohl(numPts);
+
+ l.reserve(numPts);
+
+ // POINT ARRAY IS SUPPOSED ALWAYS IN BIG ENDIAN
+ BIN_PG_POINT* pts = (BIN_PG_POINT*)(polygon + sizeof(int));
+
+ // endianness test
+ if(isLittleEndian_)
+ {
+ union
+ {
+ double dWord_;
+ unsigned int aux_[2];
+ } swapx1, swapy1, swapx2, swapy2;
+
+ // little-endian
+ for(unsigned int i = 0; i < numPts ; ++i)
+ {
+ swapx1.dWord_ = pts[i].x;
+ swapy1.dWord_ = pts[i].y;
+
+ swapx2.aux_[1] = ntohl(swapx1.aux_[0]);
+ swapx2.aux_[0] = ntohl(swapx1.aux_[1]);
+
+ swapy2.aux_[1] = ntohl(swapy1.aux_[0]);
+ swapy2.aux_[0] = ntohl(swapy1.aux_[1]);
+
+ l.add(TeCoord2D(swapx2.dWord_, swapy2.dWord_));
+ }
+
+ }
+ else
+ {
+ // big-endian!
+ for(unsigned int i = 0; i < numPts ; ++i)
+ l.add(TeCoord2D(pts[i].x, pts[i].y));
+
+ }
+ }
+ else //TeTEXTCURSOR
+ l = PgGeomPolygon2Te(polygon);
+}
+
+char* TePGRecordset::getWKBHeader(char* v, unsigned char &byteOrder, unsigned int &wkbType, unsigned int &numGeometries) const
+{
+ const int byteOrderPlusGeomType = sizeof(unsigned char) + sizeof(unsigned int);
+
+ if(cursorDataType_ == TeTEXTCURSOR)
+ {
+ unsigned char header [byteOrderPlusGeomType];
+
+ for (int t = 0; t < byteOrderPlusGeomType; ++t)
+ {
+ header[t] =(unsigned char) parse_hex(v) ;
+ v += 2;
+ }
+
+ memcpy(&byteOrder, header, sizeof(unsigned char));
+ memcpy(&wkbType, header + sizeof(unsigned char), sizeof(unsigned int));
+ }
+ else
+ {
+ memcpy(&byteOrder, v, sizeof(unsigned char));
+ memcpy(&wkbType, v + sizeof(unsigned char), sizeof(unsigned int));
+
+ v += byteOrderPlusGeomType;
+ }
+
+
+ // 0 = Big Endian (wkbXDR) e 1 = Little Endian (wkbNDR)
+ if((byteOrder == 0) && isLittleEndian_)
+ {
+ wkbType = ntohl(wkbType);
+ }
+ else if((byteOrder == 1) && !isLittleEndian_)
+ {
+ wkbType = htonl(wkbType);
+ }
+
+ numGeometries = 0;
+
+ if(wkbType > 1 && wkbType <= 7)
+ {
+ if(cursorDataType_ == TeTEXTCURSOR)
+ {
+ unsigned char qtd[sizeof(unsigned int)];
+
+ for(unsigned int t = 0; t < sizeof(unsigned int); ++t)
+ {
+ qtd[t] = (unsigned char)parse_hex(v);
+ v += 2;
+ }
+
+ memcpy(&numGeometries, qtd, sizeof(unsigned int));
+ }
+ else
+ {
+ memcpy(&numGeometries, v, sizeof(unsigned int));
+ v += sizeof(unsigned int);
+ }
+
+ // 0 = Big Endian (wkbXDR) e 1 = Little Endian (wkbNDR)
+ if((byteOrder == 0) && isLittleEndian_)
+ {
+ numGeometries = ntohl(numGeometries);
+ }
+ else if((byteOrder == 1) && !isLittleEndian_)
+ {
+ numGeometries = htonl(numGeometries);
+ }
+ }
+
+ return v;
+}
+
+char* TePGRecordset::getWKBPoint(char* v, TeCoord2D& c) const
+{
+ unsigned char byteOrder;
+ unsigned int wkbType;
+ unsigned int numGeometries;
+
+ v = getWKBHeader(v, byteOrder, wkbType, numGeometries);
+
+ if(wkbType != 1)
+ throw logic_error("Binary data doesn't supported!");
+
+
+ union
+ {
+ double dWord_;
+ unsigned int aux_[2];
+ } swapx1, swapy1;
+
+ if(cursorDataType_ == TeTEXTCURSOR)
+ {
+
+ const int double2Size = 2 * sizeof(double);
+ unsigned char data[double2Size];
+
+ for(int t = 0; t < double2Size; ++t) // len/2
+ {
+ data[t] = (unsigned char)parse_hex(v);
+ v += 2;
+ }
+
+
+ memcpy(&swapx1.dWord_, data , sizeof(double));
+ memcpy(&swapy1.dWord_, data + sizeof(double), sizeof(double));
+ }
+ else
+ {
+ memcpy(&swapx1.dWord_, v , sizeof(double));
+ memcpy(&swapy1.dWord_, v + sizeof(double), sizeof(double));
+
+ v += (sizeof(double) + sizeof(double)); // x + y
+ }
+
+ // 0 = Big Endian (wkbXDR)
+ if((byteOrder == 0) && isLittleEndian_)
+ {
+ union
+ {
+ double dWord_;
+ unsigned int aux_[2];
+ } swapx2, swapy2;
+
+ swapx2.aux_[1] = ntohl(swapx1.aux_[0]);
+ swapx2.aux_[0] = ntohl(swapx1.aux_[1]);
+
+ swapy2.aux_[1] = ntohl(swapy1.aux_[0]);
+ swapy2.aux_[0] = ntohl(swapy1.aux_[1]);
+
+ c.x(swapx2.dWord_);
+ c.y(swapy2.dWord_);
+
+ return v;
+ }
+ else if((byteOrder == 1) && !isLittleEndian_)
+ {
+ union
+ {
+ double dWord_;
+ unsigned int aux_[2];
+ } swapx2, swapy2;
+
+ swapx2.aux_[1] = htonl(swapx1.aux_[0]);
+ swapx2.aux_[0] = htonl(swapx1.aux_[1]);
+
+ swapy2.aux_[1] = htonl(swapy1.aux_[0]);
+ swapy2.aux_[0] = htonl(swapy1.aux_[1]);
+
+ c.x(swapx2.dWord_);
+ c.y(swapy2.dWord_);
+
+ return v;
+
+ }
+
+ c.x(swapx1.dWord_);
+ c.y(swapy1.dWord_);
+
+ return v;
+}
+
+char* TePGRecordset::getWKBLinearRing(char* v, int byteOrder, TeLine2D &line) const
+{
+ unsigned int numPoints;
+
+ const int size2Double = sizeof(double) + sizeof(double); // x + y
+
+ if(cursorDataType_ == TeTEXTCURSOR)
+ {
+ unsigned char data[size2Double];
+
+ for(unsigned int n = 0; n < sizeof(unsigned int); ++n)
+ {
+ data[n] = (unsigned char)parse_hex(v);
+ v += 2;
+ }
+
+ memcpy(&numPoints, data , sizeof(unsigned int));
+ }
+ else
+ {
+ memcpy(&numPoints, v , sizeof(unsigned int));
+ v += sizeof(unsigned int);
+ }
+
+ // 0 = Big Endian (wkbXDR) e 1 = Little Endian (wkbNDR)
+ if((byteOrder == 0) && isLittleEndian_)
+ {
+ numPoints = ntohl(numPoints);
+ }
+ else if((byteOrder == 1) && !isLittleEndian_)
+ {
+ numPoints = htonl(numPoints);
+ }
+
+ for(unsigned int i = 0; i < numPoints; ++i)
+ {
+ union
+ {
+ double dWord_;
+ unsigned int aux_[2];
+ } swapx1, swapy1;
+
+ if(cursorDataType_ == TeTEXTCURSOR)
+ {
+ unsigned char data[size2Double];
+
+ for(int t = 0; t < size2Double; ++t) // len/2
+ {
+ data[t] = (unsigned char)parse_hex(v);
+ v += 2;
+ }
+
+ memcpy(&swapx1.dWord_, data , sizeof(double));
+ memcpy(&swapy1.dWord_, data + sizeof(double), sizeof(double));
+ }
+ else
+ {
+ memcpy(&swapx1.dWord_, v , sizeof(double));
+ memcpy(&swapy1.dWord_, v + sizeof(double), sizeof(double));
+ v += size2Double;
+ }
+
+ // 0 = Big Endian (wkbXDR)
+ if((byteOrder == 0) && isLittleEndian_)
+ {
+ union
+ {
+ double dWord_;
+ unsigned int aux_[2];
+ } swapx2, swapy2;
+
+ swapx2.aux_[1] = ntohl(swapx1.aux_[0]);
+ swapx2.aux_[0] = ntohl(swapx1.aux_[1]);
+
+ swapy2.aux_[1] = ntohl(swapy1.aux_[0]);
+ swapy2.aux_[0] = ntohl(swapy1.aux_[1]);
+
+ line.add(TeCoord2D(swapx2.dWord_, swapy2.dWord_));
+ }
+ else if((byteOrder == 1) && !isLittleEndian_) //1 = Little Endian (wkbNDR)
+ {
+ union
+ {
+ double dWord_;
+ unsigned int aux_[2];
+ } swapx2, swapy2;
+
+ swapx2.aux_[1] = htonl(swapx1.aux_[0]);
+ swapx2.aux_[0] = htonl(swapx1.aux_[1]);
+
+ swapy2.aux_[1] = htonl(swapy1.aux_[0]);
+ swapy2.aux_[0] = htonl(swapy1.aux_[1]);
+
+ line.add(TeCoord2D(swapx2.dWord_, swapy2.dWord_));
+ }
+ else
+ {
+ line.add(TeCoord2D(swapx1.dWord_, swapy1.dWord_));
+ }
+ }
+
+ return v;
+
+}
+
+char* TePGRecordset::getWKBLine(char* v, TeLine2D& l) const
+{
+ unsigned char byteOrder;
+ unsigned int wkbType;
+ unsigned int numPoints;
+
+ v = getWKBHeader(v, byteOrder, wkbType, numPoints);
+
+ if(wkbType != 2)
+ throw logic_error("Binary data doesn't supported!");
+
+ if(cursorDataType_ == TeTEXTCURSOR)
+ {
+ // Volta duas vezes o n�mero de bytes do n�mero de geometrias lidos ao chamar getWKBHeader
+ v = getWKBLinearRing(v - (sizeof(unsigned int) + sizeof(unsigned int)), byteOrder, l);
+ }
+ else
+ {
+ // Volta o n�mero de bytes do n�mero de geometrias lidos ao chamar getWKBHeader
+ v = getWKBLinearRing(v - sizeof(unsigned int), byteOrder, l);
+ }
+
+ return v;
+
+}
+
+char* TePGRecordset::getWKBPolygon(char* v, TePolygon& p) const
+{
+ unsigned char byteOrder;
+ unsigned int wkbType;
+ unsigned int numRings;
+
+ v = getWKBHeader(v, byteOrder, wkbType, numRings);
+
+ if(wkbType != 3)
+ throw logic_error("Binary data doesn't supported!");
+
+ for(unsigned int i = 0; i < numRings; ++i)
+ {
+ TeLine2D line;
+ v = getWKBLinearRing(v, byteOrder, line);
+ p.add(line);
+ }
+
+ return v;
+
+}
+
+char* TePGRecordset::getWKBMultiPoint(char* v, TePointSet &ps) const
+{
+ unsigned char byteOrder;
+ unsigned int wkbType;
+ unsigned int num_wkbPoints;
+
+ v = getWKBHeader(v, byteOrder, wkbType, num_wkbPoints);
+
+ if(wkbType != 4)
+ throw logic_error("Binary data doesn't supported!");
+
+ for(unsigned int i = 0; i < num_wkbPoints; ++i)
+ {
+ TeCoord2D coord;
+ v = getWKBPoint(v, coord);
+ ps.add(coord);
+ }
+
+ return v;
+}
+
+char* TePGRecordset::getWKBMultiLine(char* v, TeLineSet &ls) const
+{
+ unsigned char byteOrder;
+ unsigned int wkbType;
+ unsigned int num_wkbLineStrings;
+
+ v = getWKBHeader(v, byteOrder, wkbType, num_wkbLineStrings);
+
+ if(wkbType != 5)
+ throw logic_error("Binary data doesn't supported!");
+
+ for(unsigned int i = 0; i < num_wkbLineStrings; ++i)
+ {
+ TeLine2D line;
+ v = getWKBLine(v, line);
+ ls.add(line);
+ }
+
+ return v;
+}
+
+char* TePGRecordset::getWKBMultiPolygon(char* v, TePolygonSet &ps) const
+{
+ unsigned char byteOrder;
+ unsigned int wkbType;
+ unsigned int num_wkbPolygons;
+
+ v = getWKBHeader(v, byteOrder, wkbType, num_wkbPolygons);
+
+ if(wkbType != 6)
+ throw logic_error("Binary data doesn't supported!");
+
+ for(unsigned int i = 0; i < num_wkbPolygons; ++i)
+ {
+ TePolygon poly;
+ v = getWKBPolygon(v, poly);
+ ps.add(poly);
+ }
+
+ return v;
+}
+
+void TePGRecordset::getWKBGeomColl(char* v, TeMultiGeometry &mg) const
+{
+ unsigned char byteOrder;
+ unsigned int wkbType;
+ unsigned int num_wkbGeometries;
+
+ v = getWKBHeader(v, byteOrder, wkbType, num_wkbGeometries);
+
+ if(wkbType != 7)
+ throw logic_error("Binary data doesn't supported!");
+
+ for(unsigned int i = 0; i < num_wkbGeometries; ++i)
+ {
+ unsigned int geomType;
+ unsigned char geomByteOrder;
+ unsigned int num_geometries;
+
+ getWKBHeader(v, geomByteOrder, geomType, num_geometries);
+
+ if(geomType == 1)
+ {
+ TeCoord2D coord;
+
+ v = getWKBPoint(v, coord);
+
+ mg.addGeometry(coord);
+ }
+ else if(geomType == 2)
+ {
+ TeLine2D line;
+
+ v = getWKBLine(v, line);
+
+ mg.addGeometry(line);
+ }
+ else if(geomType == 3)
+ {
+ TePolygon poly;
+
+ v = getWKBPolygon(v, poly);
+
+ mg.addGeometry(poly);
+ }
+ else if(geomType == 4)
+ {
+ TePointSet pointSet;
+
+ v = getWKBMultiPoint(v, pointSet);
+
+ for(unsigned int a = 0; a < pointSet.size(); ++a)
+ {
+ TePoint point = pointSet[a];
+ mg.addGeometry(point);
+ }
+ }
+ else if(geomType == 5)
+ {
+ TeLineSet lineSet;
+
+ v = getWKBMultiLine(v, lineSet);
+
+ for(unsigned int a = 0; a < lineSet.size(); ++a)
+ {
+ TeLine2D coord = lineSet[a];
+
+ mg.addGeometry(coord);
+ }
+ }
+ else if(geomType == 6)
+ {
+ TePolygonSet polygonSet;
+
+ v = getWKBMultiPolygon(v, polygonSet);
+
+ for(unsigned int a = 0; a < polygonSet.size(); ++a)
+ {
+ TePolygon poly = polygonSet[a];
+
+ mg.addGeometry(poly);
+ }
+ }
+ else
+ {
+ throw logic_error("The data couldn't be decoded as a valid WKB geometry!");
+ }
+ }
+
+}
+
+
+void TePGRecordset::getPGISPoint(const int& field_num, TePoint& p) const
+{
+ TeCoord2D c;
+ getWKBPoint(value(field_num), c);
+ p.add(c);
+}
+
+
+void TePGRecordset::getPGISLine(const int& field_num, TeLine2D& l) const
+{
+ getWKBLine(value(field_num), l);
+}
+
+
+void TePGRecordset::getPGISPolygon(const int& field_num, TePolygon& p) const
+{
+ getWKBPolygon(value(field_num), p);
+}
+
+
+void TePGRecordset::getPGISMultiPoint(const int& field_num, TePointSet& ps) const
+{
+ getWKBMultiPoint(value(field_num), ps);
+}
+
+
+void TePGRecordset::getPGISMultiLine(const int& field_num, TeLineSet& ls) const
+{
+ getWKBMultiLine(value(field_num), ls);
+}
+
+
+void TePGRecordset::getPGISMultiPolygon(const int& field_num, TePolygonSet& ps) const
+{
+ getWKBMultiPolygon(value(field_num), ps);
+}
+
+
+void TePGRecordset::getPGISGeomColl(const int& field_num, TeMultiGeometry& m) const
+{
+ getWKBGeomColl(value(field_num), m);
+}
+
+
+
+char* TePGRecordset::getData(const int& field_num)
+{
+ data_ = "";
+
+ if(cursorDataType_ == TeTEXTCURSOR)
+ return value(field_num);
+ else
+ {
+ // chamar o conversor de tipo de dado de bin�rio p/ string p/ cada tipo!
+ switch(fieldType(field_num))
+ {
+ case PG_BOOL_TYPE :
+ case PG_BYTEA_TYPE :
+ case PG_CHAR_TYPE :
+ case PG_INT8_TYPE :
+ case PG_INT2_TYPE : break;
+
+ case PG_INT4_TYPE : data_ = Te2String(getInt(field_num));
+ break;
+
+ case PG_TEXT_TYPE :
+ case PG_OID_TYPE :
+ case PG_POINT_TYPE :
+ case PG_LSEG_TYPE :
+ case PG_PATH_TYPE :
+ case PG_BOX_TYPE :
+ case PG_POLYGON_TYPE :
+ case PG_LINE_TYPE :
+ case PG_PG_FLOAT4_TYPE : break;
+
+ case PG_FLOAT8_TYPE : data_ = Te2String(getDouble(field_num));
+ break;
+
+ case PG_CIRCLE_TYPE :
+ case PG_MONEY_TYPE :
+ case PG_BPCHAR_TYPE :
+ case PG_VARCHAR_TYPE :
+ case PG_DATE_TYPE :
+ case PG_TIME_TYPE :
+ case PG_TIMESTAMP_TYPE :
+ case PG_TIMESTAMPTZ_TYPE :
+ case PG_INTERVAL_TYPE :
+ case PG_TIMETZ_TYPE :
+ case PG_BIT_TYPE :
+ case PG_VARBIT_TYPE :
+ case PG_NUMERIC_TYPE :
+ default : break;
+ }
+
+ return (char*)data_.c_str();
+ }
+}
+
+int TePGRecordset::fieldSize(const int& field_num)
+{
+ Oid field_t = this->fieldType(field_num);
+ Oid field_m = PQfmod(pg_recordset_, field_num);
+ PGresult *result_temp;
+ char str_int[5]; //integer part if DECIMAL(p,s) or NUMERIC(p,s)
+ //int size = -1;
+ int size = 0;
+ char str_field_t[50];
+ char str_field_m[50];
+ sprintf(str_field_t,"%d", field_t);
+ sprintf(str_field_m,"%d", field_m);
+ string str_qry = "SELECT format_type(";
+ str_qry += str_field_t;
+ str_qry += ",";
+ str_qry += str_field_m;
+ str_qry += ")";
+ switch(field_t)
+ {
+ case 1043: //VARCHAR(s) or CHARACTER VARYING(s)
+ case 1700: //NUMERIC(p,s) or DECIMAL(p,s)
+ result_temp = PQexec(conn_->c_ptr(), str_qry.c_str());
+ if(PQresultStatus(result_temp) == PGRES_TUPLES_OK)
+ {
+ char *lin = PQgetvalue(result_temp, 0, 0); //Don't free lin because the return of PQgetvalue is in the struct PGResult
+ int i = 0;
+ while(*lin != '\0' && *lin != ',')
+ {
+ if(*lin >= '0' && *lin <= '9' && i < 4)
+ {
+ str_int[i] = *lin;
+ i++;
+ }
+ lin++;
+ }
+ str_int[i]='\0';
+ size = atoi(str_int);
+ }
+ PQclear(result_temp);
+ break;
+ default: //The size of fixed size or for other variable size -1
+ return PQfsize(pg_recordset_, field_num);
+ }
+ result_temp = 0;
+ return size;
+}
+
+int TePGRecordset::fieldSizeFractionaryPart(const int& field_num)
+{
+ Oid field_t = this->fieldType(field_num);
+ Oid field_m = PQfmod(pg_recordset_, field_num);
+ PGresult *result_temp;
+ char str_frac[5]; //fractionary part if DECIMAL(p,s) or NUMERIC(p,s)
+ //int size = -1;
+ int size = 0;
+ char str_field_t[50];
+ char str_field_m[50];
+ sprintf(str_field_t,"%d", field_t);
+ sprintf(str_field_m,"%d", field_m);
+ string str_qry = "SELECT format_type(";
+ str_qry += str_field_t;
+ str_qry += ",";
+ str_qry += str_field_m;
+ str_qry += ")";
+ switch(field_t)
+ {
+ case 1700: //NUMERIC(p,s) or DECIMAL(p,s)
+ result_temp = PQexec(conn_->c_ptr(), str_qry.c_str());
+ if(PQresultStatus(result_temp) == PGRES_TUPLES_OK)
+ {
+ char *lin = PQgetvalue(result_temp, 0, 0); //Don't free lin because the return of PQgetvalue is in the struct PGResult
+ int i = 0;
+ while(*lin != '\0' && *lin != ',')
+ {
+ lin++;
+ }
+ if(*lin == ',')
+ {
+ lin++;
+ }
+ while(*lin != '\0')
+ {
+ if(*lin >= '0' && *lin <= '9' && i < 4)
+ {
+ str_frac[i] = *lin;
+ i++;
+ }
+ lin++;
+ }
+ str_frac[i]='\0';
+ size = atoi(str_frac);
+ }
+ PQclear(result_temp);
+ break;
+ default: //Others doesn't have a fractionary part
+ break;
+
+ }
+ result_temp = 0;
+ return size;
+}
+
+void TePGRecordset::freeRecordSet()
+{
+ if(pg_recordset_)
+ PQclear(pg_recordset_);
+
+
+ pg_recordset_ = 0;
+ int_index_current_ = -1;
+ int_eof_ = -1;
+ return;
+}
+
+
+
+
+
diff --git a/src/terralib/drivers/PostgreSQL/TePGInterface.h b/src/terralib/drivers/PostgreSQL/TePGInterface.h
new file mode 100644
index 0000000..48e2a10
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePGInterface.h
@@ -0,0 +1,429 @@
+//**************************************************************************
+// Copyright � 2002 Gilberto Ribeiro de Queiroz - gribeiro at dpi.inpe.br
+// Image Processing Division (DPI)
+// National Institute of Spatial Research (INPE) - S�o Jos� dos Campos - Brazil
+//
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TePGInterface.h
+ This file contains a database recordset and connection class to PostgreSQL.
+ */
+
+/**
+ *@author Gilberto Ribeiro de Queiroz - gribeiro at dpi.inpe.br
+ */
+
+/**
+ *@description Este arquivo cont�m classes para navegar em resultados de consultas
+ * e para estabelecimento de conex�o com o banco de dados.
+ */
+#ifndef __TERRALIB_INTERNAL_PGINTERFACE_H
+#define __TERRALIB_INTERNAL_PGINTERFACE_H
+
+/**
+ * TODO: 1. O caminhamento para tr�s est� na ordem errada.
+ * 2. Terminar a fun��o getData
+ *
+ */
+//extern "C"
+//{
+#include "libpq-fe.h"
+//}
+
+#ifdef WIN32
+#include <winsock.h>
+#else
+#include <netinet/in.h>
+#endif
+
+
+#include <stdlib.h>
+#include <string>
+
+#include "TeDatabase.h"
+#include "TeMultiGeometry.h"
+
+using namespace std;
+
+/***************************************************************************
+ * Constantes num�ricas dos tipos de dados do PostgreSQL *
+ ***************************************************************************/
+const Oid PG_BOOL_TYPE = 16;
+const Oid PG_BYTEA_TYPE = 17;
+const Oid PG_CHAR_TYPE = 18;
+const Oid PG_INT8_TYPE = 20;
+const Oid PG_INT2_TYPE = 21;
+const Oid PG_INT4_TYPE = 23;
+const Oid PG_TEXT_TYPE = 25;
+const Oid PG_OID_TYPE = 26;
+const Oid PG_POINT_TYPE = 600;
+const Oid PG_LSEG_TYPE = 601;
+const Oid PG_PATH_TYPE = 602;
+const Oid PG_BOX_TYPE = 603;
+const Oid PG_POLYGON_TYPE = 604;
+const Oid PG_LINE_TYPE = 628;
+const Oid PG_PG_FLOAT4_TYPE = 700;
+const Oid PG_FLOAT8_TYPE = 701;
+const Oid PG_CIRCLE_TYPE = 718;
+const Oid PG_MONEY_TYPE = 790;
+const Oid PG_BPCHAR_TYPE = 1042;
+const Oid PG_VARCHAR_TYPE = 1043;
+const Oid PG_DATE_TYPE = 1082;
+const Oid PG_TIME_TYPE = 1083;
+const Oid PG_TIMESTAMP_TYPE = 1114;
+const Oid PG_TIMESTAMPTZ_TYPE = 1184;
+const Oid PG_INTERVAL_TYPE = 1186;
+const Oid PG_TIMETZ_TYPE = 1266;
+const Oid PG_BIT_TYPE = 1560;
+const Oid PG_VARBIT_TYPE = 1562;
+const Oid PG_NUMERIC_TYPE = 1700;
+
+
+
+/***************************************************************************
+ * Classe respons�vel pela abertura e fechamento de uma conex�o com o *
+ * banco de dados. Al�m de abrir e fechar uma conex�o, permite que uma *
+ * consulta seja executada, retornando um conjunto de registros, ou que um *
+ * comando - insert, update, delete - seja executado diretamente, *
+ * retornando o n�mero de registros afetados pelo comando. *
+ ***************************************************************************/
+class TePGConnection
+{
+ protected:
+
+ PGconn *pg_connection_; // A pointer to a connection
+ int int_connection_; // A flag that indicates the state of a connection
+ Oid last_oid_; // Always stores the last OID resulted of a command
+ bool inTransaction_;
+
+ public:
+
+ // Constructor / Destructor
+ TePGConnection(const string& str_connection = "")
+ : pg_connection_(0), int_connection_(0), last_oid_(0), inTransaction_(false)
+ {
+ if(!str_connection.empty())
+ open(str_connection);
+ }
+
+ virtual ~TePGConnection() { close(); }
+
+ // Basic database methods
+ bool open(const string& str_connection);
+
+ bool state(void) const { return (PQstatus(pg_connection_) == CONNECTION_OK); }
+ void close(void);
+ const char* dbname(void) const { return PQdb(pg_connection_); }
+ const char* err_msg(void) const { return PQerrorMessage(pg_connection_); }
+ PGresult* exec(const string& str_qry) { return PQexec(pg_connection_, str_qry.c_str()); }
+ int exec_cmd(const string& str_qry);
+ Oid getOID(void) const { return last_oid_; }
+ PGconn* c_ptr(void) { return pg_connection_; }
+
+ // Utilities functions - You must destroy the return string
+ static char* escapeString(const char* from, const size_t& fromLen, size_t& newLen)
+ {
+ char *sql = new char[2 * fromLen + 1];
+
+ newLen = PQescapeString(sql, from, fromLen);
+
+ return sql;
+ }
+
+ static void freeMem(void* ptr) { PQfreemem(ptr); }
+
+ static unsigned char* escapeBytea(const unsigned char *from, size_t from_length, size_t* to_length) { return PQescapeBytea(from, from_length, to_length); }
+
+ Oid insertBlob(char* buff, const int& blobSize); // Returns 0 on error
+ int getBlob(const Oid& blobId, char *&buff); // return -1 on error otherwise returns bytes read
+ bool removeBlob(const Oid& blobId) { return lo_unlink(pg_connection_, blobId) == 1; }
+
+ bool beginTransaction(void);
+ bool commitTransaction(void);
+ bool rollBackTransaction(void);
+
+ protected:
+
+ // don't support copying of TePGConnection objects,
+ // so make copy constructor and assignment op private.
+ TePGConnection(const TePGConnection& c);
+ TePGConnection& operator=(const TePGConnection& c);
+};
+
+/***************************************************************************
+ * Classe resposns�vel pela manipula��o de dados resultantes de uma *
+ * consulta. *
+ ***************************************************************************/
+class TePGRecordset
+{
+ protected:
+
+ static const int int_bof_;
+ static int openRecordSets_;
+ static set<int> freeCursorNumbers_;
+
+ PGresult *pg_recordset_;
+ TePGConnection* conn_;
+ bool cursorDeclared_;
+ int int_index_current_;
+ int int_eof_;
+ TeCursorType cursorType_;
+ TeCursorLocation cursorLocation_;
+ TeCursorDataType cursorDataType_;
+ int numRowsToRetrieve_;
+
+ int recordSetId_;
+ bool isLittleEndian_;
+
+ string data_;
+
+ bool movingBackward_; // M�rio
+ bool lastFetch; // M�rio
+ bool firstFetch; // M�rio
+
+
+ public:
+
+ // Constructor / Destructor
+ TePGRecordset(const string& str_qry = string(""), TePGConnection* con_x = 0,
+ const TeCursorType& cursorType = TeUNIDIRECTIONAL,
+ const TeCursorLocation& cursorLocation = TeSERVERSIDE,
+ const TeCursorDataType& cursorDataType = TeTEXTCURSOR,
+ const int& numRowsToRetrieve = 2000);
+ virtual ~TePGRecordset();
+
+ // Basic database methods
+ void close(void);
+
+ int recordCount(void) const
+ {
+ if(pg_recordset_)
+ return PQntuples(pg_recordset_);
+
+ return 0;
+ }
+
+ int getFieldCount(void) const { return PQnfields(pg_recordset_); }
+
+ bool state(void) const
+ {
+ if(pg_recordset_)
+ return true;
+ else
+ return false;
+ }
+
+ bool eof(void) const { return int_index_current_ == int_eof_; }
+ bool bof(void) const { return int_index_current_ == int_bof_; }
+
+ bool moveFirst(void);
+ bool movePrevious(void);
+ bool moveNext(void);
+ bool moveLast(void);
+ bool moveTo(const int& lin_number); // first index == 0
+
+ int index(void) const
+ {
+ if(!(this->bof() || this->eof()))
+ return int_index_current_;
+
+ return -1;
+ }
+
+ bool open(const string& str_qry, TePGConnection* con_x,
+ const TeCursorType& cursorType = TeUNIDIRECTIONAL,
+ const TeCursorLocation& cursorLocation = TeSERVERSIDE,
+ const TeCursorDataType& cursorDataType = TeTEXTCURSOR,
+ const int& numRowsToRetrieve = 2000);
+
+
+
+ // Functions tha apllies to columns
+ char *fieldName(const int& field_num) const { return PQfname(pg_recordset_, field_num); }
+
+ int fieldNum(const string& field_name) const
+ {
+ string fieldName(field_name);
+
+ size_t pos = field_name.find(".", string::npos, 1);
+
+ if(pos != string::npos)
+ fieldName = field_name.substr(pos + 1);
+
+ return PQfnumber(pg_recordset_, fieldName.c_str());
+ }
+
+ Oid fieldType(const int& field_num) const { return PQftype(pg_recordset_, field_num); }
+ Oid fieldType(const string& field_name) const { return fieldType(fieldNum(field_name)); }
+
+ bool isNull(const int& field_num) const { return PQgetisnull(pg_recordset_, index(), field_num) == 1; }
+ bool isNull(const string& field_name) const { return isNull(fieldNum(field_name)); }
+
+ int fieldSize(const int& field_num);
+ int fieldSize(const string& field_name) { return fieldSize(fieldNum(field_name)); }
+
+ int fieldSizeFractionaryPart(const int& field_num);
+ int fieldSizeFractionaryPart(const string& field_name) { return fieldSizeFractionaryPart(fieldNum(field_name)); }
+
+
+ // Datatype functions
+ char* value(const int& field_num) const { return PQgetvalue(pg_recordset_, int_index_current_, field_num); }
+ char* value(const string& field_name) const { return value(fieldNum(field_name)); }
+
+ int getBytea(const int& field_num, char*& buff) const;
+ int getBytea(const string& field_name, char*& buff) const { return getBytea(fieldNum(field_name), buff); }
+
+ int getInt(const int& field_num) const
+ {
+ if(cursorDataType_ == TeTEXTCURSOR)
+ return atol(value(field_num));
+ else
+ {
+ unsigned int number;
+ memcpy(&number, value(field_num), sizeof(int));
+
+ if(isLittleEndian_)
+ number = ntohl(number);
+
+ return number;
+ }
+ }
+
+ int getInt(const string& field_name) const { return getInt(fieldNum(field_name)); }
+
+ bool getBool(const int& field_num) const
+ {
+ if(cursorDataType_ == TeTEXTCURSOR)
+ {
+ string t = "t";
+
+ return (t == value(field_num));
+ }
+ else
+ {
+ unsigned char v = value(field_num)[0];
+ int v1 = v;
+ return v1 != 0;
+ }
+ }
+
+ bool getBool(const string& field_name) const { return getBool(fieldNum(field_name)); }
+
+ double getDouble(const int& field_num) const
+ {
+ if(cursorDataType_ == TeTEXTCURSOR)
+ return atof(value(field_num));
+ else
+ {
+ union
+ {
+ double dWord_;
+ unsigned int aux_[2];
+ } swapDouble1, swapDouble2;
+
+
+ // endianness test
+ if(isLittleEndian_)
+ {
+ // little-endian!
+ memcpy(&swapDouble1.dWord_, value(field_num), sizeof(double));
+
+ swapDouble2.aux_[1] = ntohl(swapDouble1.aux_[0]);
+ swapDouble2.aux_[0] = ntohl(swapDouble1.aux_[1]);
+
+ return swapDouble2.dWord_;
+ }
+ else
+ {
+ // big-endian!
+ memcpy(&swapDouble1.dWord_, value(field_num), sizeof(double));
+
+ swapDouble2.aux_[0] = ntohl(swapDouble1.aux_[0]);
+ swapDouble2.aux_[1] = ntohl(swapDouble1.aux_[1]);
+
+ return swapDouble2.dWord_;
+ }
+
+ }
+ }
+
+ double getDouble(const string& field_name) const { return getDouble(fieldNum(field_name)); }
+
+ char* getData(const int& field_num);
+ char* getData(const string& field_name) { return getData(fieldNum(field_name)); }
+
+ // PostgreSQL Geometric types
+ void getPGLine2D(const int& field_num, TeLine2D& l) const;
+ void getPGLine2D(const string& field_name, TeLine2D& l) const { getPGLine2D(fieldNum(field_name), l); }
+
+ // PostGIS Methods
+ void getPGISPoint(const int& field_num, TePoint& p) const;
+ void getPGISPoint(const string& field_name, TePoint& p) const { getPGISPoint(fieldNum(field_name), p); }
+
+ void getPGISLine(const int& field_num, TeLine2D& l) const;
+ void getPGISLine(const string& field_name, TeLine2D& l) const { getPGISLine(fieldNum(field_name), l); }
+
+ void getPGISPolygon(const int& field_num, TePolygon& p) const;
+ void getPGISPolygon(const string& field_name, TePolygon& p) const { getPGISPolygon(fieldNum(field_name), p); }
+
+ void getPGISMultiPoint(const int& field_num, TePointSet& ps) const;
+ void getPGISMultiPoint(const string& field_name, TePointSet& ps) const { getPGISMultiPoint(fieldNum(field_name), ps); }
+
+ void getPGISMultiLine(const int& field_num, TeLineSet& ls) const;
+ void getPGISMultiLine(const string& field_name, TeLineSet& ls) const { getPGISMultiLine(fieldNum(field_name), ls); }
+
+ void getPGISMultiPolygon(const int& field_num, TePolygonSet& ps) const;
+ void getPGISMultiPolygon(const string& field_name, TePolygonSet& ps) const { getPGISMultiPolygon(fieldNum(field_name), ps); }
+
+ void getPGISGeomColl(const int& field_num, TeMultiGeometry& m) const;
+ void getPGISGeomColl(const string& field_name, TeMultiGeometry& m) const { getPGISGeomColl(fieldNum(field_name), m); }
+
+ protected:
+
+ // don't support copying of TePGRecordset objects,
+ // so make copy constructor and assignment op private.
+ TePGRecordset(const TePGRecordset& c);
+ TePGRecordset& operator=(const TePGRecordset& c);
+
+
+ void freeRecordSet();
+
+ char* getWKBHeader(char* v, unsigned char &byteOrder, unsigned int& wkbType, unsigned int &numGeometries) const;
+
+ char* getWKBPoint(char* v, TeCoord2D& c) const;
+ char* getWKBLine(char* v, TeLine2D& l) const;
+ char* getWKBPolygon(char* v, TePolygon& p) const;
+
+ char* getWKBMultiPoint(char* v, TePointSet &ps) const;
+ char* getWKBMultiLine(char* v, TeLineSet &ls) const;
+ char* getWKBMultiPolygon(char* v, TePolygonSet &ps) const;
+
+ void getWKBGeomColl(char* v, TeMultiGeometry &mg) const;
+
+
+
+ char* getWKBLinearRing(char* v, int byteOrder, TeLine2D &line) const;
+};
+
+#endif // __TERRALIB_INTERNAL_PGINTERFACE_H
diff --git a/src/terralib/drivers/PostgreSQL/TePGUtils.cpp b/src/terralib/drivers/PostgreSQL/TePGUtils.cpp
new file mode 100644
index 0000000..162f4cd
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePGUtils.cpp
@@ -0,0 +1,470 @@
+#include "TePGUtils.h"
+#include <stdexcept>
+
+using namespace std;
+
+TeCoord2D PgGeomPolygonCoordDecode(char *str, char* *s)
+{
+
+ char *cp; // I use this pointer to get the pointer address
+ // that strtod store in the second parameter.
+ // It is used to know if the conversion of a string
+ // to double ocurried normally
+
+ if(!str)
+ throw runtime_error("Invalid Coordinate!");
+
+ // SKIP WHITE SPACES
+ while(isspace((unsigned char)*str))
+ ++str;
+
+ // SKIP THE FIRST '(' an go to number begin
+ if(*str != '(')
+ throw runtime_error("Invalid Coordinate!");
+
+ ++str;
+
+ while(isspace((unsigned char)*str))
+ ++str;
+
+ double x = strtod(str, &cp);
+
+ if(cp <= str) // If no conversion or there aren't more characters
+ throw runtime_error("Invalid format!"); // Error, because the coord y will not be extracted
+ // Otherwise, cp will point to the next caracter, that begin the list conversion of coord y
+
+ // SKIP WHITE SPACES AFTER X COORDINATE AND JUMP ',' AND WHITE SPACES
+ while(isspace((unsigned char) *cp))
+ ++cp;
+
+ if(*cp != ',')
+ throw runtime_error("Invalid Coordinate!");
+
+ ++cp;
+
+ while(isspace((unsigned char) *cp))
+ ++cp;
+
+ double y = strtod(cp, &str);
+
+ if(str <= cp)
+ throw runtime_error("Invalid format!");
+
+ while(isspace((unsigned char) *str))
+ ++str;
+
+ if(*str != ')')
+ throw runtime_error("Invalid Coordinate!");
+
+ ++str;
+
+ while(isspace((unsigned char) *str))
+ ++str;
+
+ if(s != 0)
+ *s = str;
+
+ return TeCoord2D(x, y);
+}
+
+void Te2PgGeomPolygon(const TeLine2D& l, string& strPolygon)
+{
+ strPolygon = "(";
+
+ unsigned int nVertex = l.size();
+ for(unsigned int i = 0u; i < nVertex; ++i)
+ {
+ if(i != 0u)
+ strPolygon += ",";
+
+ strPolygon += Te2String(l[i].x_);
+ strPolygon += ",";
+ strPolygon += Te2String(l[i].y_);
+ }
+
+ strPolygon += ")";
+
+ return;
+}
+
+TeLine2D PgGeomPolygon2Te(char* strPolygon)
+{
+ char *s = strPolygon;
+
+ while(isspace((unsigned char) *s))
+ ++s;
+
+ if(*s != LDELIM_PGGEOMPOLYGON)
+ throw runtime_error("Invalid line format!");
+
+ ++s;
+
+ TeLine2D l;
+
+ while(true)
+ {
+ TeCoord2D coord = PgGeomPolygonCoordDecode(s, &s);
+ l.add(coord);
+
+ if(*s == PGGEOMPOLYGON_COORDS_DELIM)
+ ++s;
+ else
+ if(*s == RDELIM_PGGEOMPOLYGON)
+ {
+ ++s;
+ break;
+ }
+ }
+
+ while(isspace((unsigned char) *s))
+ ++s;
+
+ if((*s != '\0'))
+ throw runtime_error("Invalid line format!");
+
+ return l;
+}
+
+
+
+
+
+/*
+ * Codificadores e decodificadores PostGIS
+ *
+ */
+
+TeCoord2D PGCoord_decode(char *str, char* *s)
+{
+ char *cp; // I use this pointer to get the pointer address
+ // that strtod store in the second parameter.
+ // It is used to know if the conversion of a string
+ // to double ocurried normally
+
+ if(!str)
+ throw runtime_error("Invalid Coordinate!");
+
+ while(isspace((unsigned char)*str))
+ ++str;
+
+ double x = strtod(str, &cp);
+
+ if(cp <= str) // If no conversion or there aren't more characters
+ throw runtime_error("Invalid format!"); // Error, because the coord y will not be extracted
+ // Otherwise, cp will point to the next caracter, that begin the list conversion of coord y
+
+ while(isspace((unsigned char) *cp))
+ ++cp;
+
+ double y = strtod(cp, &str);
+
+ if(str <= cp)
+ throw runtime_error("Invalid format!");
+
+ while(isspace((unsigned char) *str))
+ ++str;
+
+ if(s != 0)
+ *s = str;
+
+ return TeCoord2D(x, y);
+}
+
+string PGCoord_encode(const TeCoord2D& c)
+{
+ string str_p = Te2String(c.x());
+ str_p += " ";
+ str_p += Te2String(c.y());
+
+ return str_p;
+}
+
+TePoint PGPoint_decode(char *str)
+{
+ if(!str)
+ throw runtime_error("Invalid point format!");
+
+ char *s;
+
+ while(*str != ';')
+ ++str;
+
+ if(*str == ';')
+ ++str;
+
+ while(isspace((unsigned char) *str))
+ ++str;
+
+ str+=6; // Jump text "POINT(" and go to number.
+
+ TeCoord2D c = PGCoord_decode(str, &s);
+
+ if(*s != ')')
+ throw logic_error("Invalid point format!");
+
+ TePoint p;
+
+ p.add(c);
+
+ return p;
+}
+
+string PGPoint_encode(const TePoint& p)
+{
+ string result = "POINT(";
+ result += PGCoord_encode(p.location());
+ result += ")";
+
+ return result;
+}
+
+string PGNode_encode(const TeNode& p)
+{
+ string result = "POINT(";
+ result += PGCoord_encode(p.location());
+ result += ")";
+
+ return result;
+}
+
+TeLine2D PGLine_decode(char *str, char* *sd)
+{
+ char *s;
+
+ s = str;
+
+ while(isspace((unsigned char) *s))
+ ++s;
+
+ if(*s != LDELIM_LINESTRING)
+ throw runtime_error("Invalid line format!");
+
+ ++s;
+
+ TeLine2D l;
+
+ double xmin, ymin, xmax, ymax;
+
+ xmin = ymin = +TeMAXFLOAT;
+ xmax = ymax = -TeMAXFLOAT;
+
+ while(true)
+ {
+ TeCoord2D coord = PGCoord_decode(s, &s);
+ l.add(coord);
+
+ if(xmin > coord.x())
+ xmin = coord.x();
+
+ if(xmax < coord.x())
+ xmax = coord.x();
+
+ if(ymin > coord.y())
+ ymin = coord.y();
+
+ if(ymax < coord.y())
+ ymax = coord.y();
+
+ if(*s == COORDS_DELIM)
+ ++s;
+ else
+ if(*s == RDELIM_LINESTRING)
+ {
+ ++s;
+ break;
+ }
+ }
+
+ while(isspace((unsigned char) *s))
+ ++s;
+
+ if((*s != '\0') && (*s != RDELIM_LINESTRING) && (*s != LINES_DELIM))
+ throw runtime_error("Invalid line format!");
+
+ l.setBox(TeBox(xmin, ymin, xmax, ymax));
+
+ *sd = s;
+
+ return l;
+}
+
+TeLine2D PGLinestring_decode(char *str)
+{
+ if(!str)
+ throw runtime_error("Invalid point format!");
+
+ char *s;
+
+ s = str;
+
+ while(*s != ';')
+ ++s;
+
+ if(*s == ';')
+ ++s;
+
+ while(isspace((unsigned char) *s))
+ ++s;
+
+ s += 10; // Jump text "LINESTRING(" and go to number.
+
+ return PGLine_decode(s, &s);
+}
+
+TePolygon PGPolygon_decode(char *str)
+{
+ if(!str)
+ throw runtime_error("Invalid polygon format!");
+
+ char *s;
+
+ while(*str != ';')
+ ++str;
+
+ if(*str == ';')
+ ++str;
+
+ while(isspace((unsigned char) *str))
+ ++str;
+
+ str += 8; // Jump text "POLYGON(" and go to first line.
+
+
+ s = str;
+
+ TePolygon pol;
+ while(true)
+ {
+ TeLine2D l = PGLine_decode(s, &s);
+ TeLinearRing r(l);
+ pol.add(r);
+
+ if(*s == COORDS_DELIM)
+ ++s;
+ else
+ if(*s == RDELIM_LINESTRING)
+ {
+ ++s;
+ break;
+ }
+ }
+
+ while(isspace((unsigned char) *s))
+ ++s;
+
+ if(*s != '\0')
+ throw runtime_error("Invalid polygon format!");
+
+ pol.setBox(pol[0].box());
+
+ return pol;
+}
+
+TeBox PGBox_decode(char *str)
+{
+ char *s;
+
+ s = str;
+
+ while(isspace((unsigned char) *s))
+ ++s;
+
+ s+=6;
+
+ TeCoord2D coord1 = PGCoord_decode(s, &s);
+
+ while(*s != ',')
+ ++s;
+
+ ++s;
+
+ //if(*s != COORDS_DELIM)
+ // throw runtime_error("Invalid box format!");
+
+ //++s;
+
+ TeCoord2D coord2 = PGCoord_decode(s, &s);
+
+ //if(*s != RDELIM_BOX)
+ // throw runtime_error("Invalid box format!");
+
+ //++s;
+
+ //while(isspace((unsigned char) *s))
+ // ++s;
+
+ //if(*s != '\0')
+ // throw runtime_error("Invalid box format!");
+
+ return TeBox(coord1, coord2);
+}
+
+string PGBox_encode(TeBox& b)
+{
+ string str_b = "BOX3D(";
+ str_b += PGCoord_encode(b.upperRight());
+ str_b += ",";
+ str_b += PGCoord_encode(b.lowerLeft());
+ str_b += ")";
+
+ return str_b;
+}
+
+
+
+void PGConcatLineString(const TeLine2D& l, string& concatString)
+{
+ register unsigned int i = 0;
+ register unsigned int nStep = l.size();
+
+ concatString += "(";
+ for(; i < nStep; ++i)
+ {
+ if(i != 0)
+ {
+ concatString += ", ";
+ }
+
+ concatString += PGCoord_encode(l[i]);
+ }
+
+ concatString += ")";
+
+ return;
+}
+
+TeBox PGBoxFromPolygon(char *str)
+{
+ TePolygon pol = PGPolygon_decode(str);
+
+ return pol.box();
+}
+
+string PGMakePolygon(const TeBox& box)
+{
+ string result = "POLYGON((";
+ result += Te2String(box.x1());
+ result += " ";
+ result += Te2String(box.y1());
+ result += ", ";
+ result += Te2String(box.x1());
+ result += " ";
+ result += Te2String(box.y2());
+ result += ", ";
+ result += Te2String(box.x2());
+ result += " ";
+ result += Te2String(box.y2());
+ result += ", ";
+ result += Te2String(box.x2());
+ result += " ";
+ result += Te2String(box.y1());
+ result += ", ";
+ result += Te2String(box.x1());
+ result += " ";
+ result += Te2String(box.y1());
+ result += "))";
+
+ return result;
+}
+
+
diff --git a/src/terralib/drivers/PostgreSQL/TePGUtils.h b/src/terralib/drivers/PostgreSQL/TePGUtils.h
new file mode 100644
index 0000000..9d42a16
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePGUtils.h
@@ -0,0 +1,114 @@
+//**************************************************************************
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TePGUtils.h
+ This file contains a database driver to access PostGIS extension.
+ */
+
+/**
+ *@author Gilberto Ribeiro de Queiroz - gribeiro at dpi.inpe.br
+ */
+
+/**
+ *@description Este arquivo cont�m rotinas �teis que desenvolvi para convers�o
+ * entre os tipos de dados do PostGIS e da TerraLib. Estas fun��es
+ * s�o parsers simples.
+ */
+
+#ifndef __TERRALIB_INTERNAL_TePOSTGRESQLUTILS_H
+#define __TERRALIB_INTERNAL_TePOSTGRESQLUTILS_H
+
+#include "TeGeometry.h"
+
+#define COORDS_DELIM ','
+
+#define COORD_DELIM ' '
+
+#define LINES_DELIM ','
+
+#define LDELIM_POINT '('
+#define RDELIM_POINT ')'
+
+#define LDELIM_LINESTRING '('
+#define RDELIM_LINESTRING ')'
+
+#define LDELIM_POLYGON '('
+#define RDELIM_POLYGON ')'
+
+#define LDELIM_BOX '('
+#define RDELIM_BOX ')'
+
+// DELIMITADORES PARA TIPOS GEOM�TRICOS DO POSTGRESQL
+#define LDELIM_PGGEOMPOLYGON '('
+#define RDELIM_PGGEOMPOLYGON ')'
+
+#define PGGEOMPOLYGON_COORDS_DELIM ','
+
+/*
+ * Codificadores e decodificadores de tipos geom�tricos do PostgreSQL.
+ * Essas fun��es s�o para o driver sem extens�o espacial.
+ *
+ */
+
+//! Decodifica uma coordenada no formato pol�gono dos tipos geom�tricos do PostgreSQL: (x1, y1)
+TeCoord2D PgGeomPolygonCoordDecode(char *str, char* *s);
+
+//! Transaforma a linha l em um pol�gono texto strPolygon
+void Te2PgGeomPolygon(const TeLine2D& l, string& strPolygon);
+
+//! Transaforma um pol�gono texto strPolygon em uma linha
+TeLine2D PgGeomPolygon2Te(char* strPolygon);
+
+/*
+ * Codificadores e decodificadores PostGIS - Texto
+ *
+ */
+TeCoord2D PGCoord_decode(char *str, char* *s);
+
+string PGCoord_encode(const TeCoord2D& c);
+
+TePoint PGPoint_decode(char *str);
+
+string PGPoint_encode(const TePoint& p);
+
+string PGNode_encode(const TeNode& p);
+
+TeLine2D PGLine_decode(char *str, char* *sd);
+
+TeLine2D PGLinestring_decode(char *str);
+
+TePolygon PGPolygon_decode(char *str);
+
+TeBox PGBox_decode(char *str);
+
+string PGBox_encode(TeBox& b);
+
+void PGConcatLineString(const TeLine2D& l, string& concatString);
+
+TeBox PGBoxFromPolygon(char *str);
+
+string PGMakePolygon(const TeBox& box);
+
+
+#endif // __TERRALIB_INTERNAL_TePOSTGRESQLUTILS_H
+
diff --git a/src/terralib/drivers/PostgreSQL/TePostGIS.cpp b/src/terralib/drivers/PostgreSQL/TePostGIS.cpp
new file mode 100644
index 0000000..5579907
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePostGIS.cpp
@@ -0,0 +1,1233 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TePostGIS.h"
+#include "TePGUtils.h"
+
+#define BUFFSIZE 1024
+
+TePostGIS::TePostGIS()
+{
+ dbmsName_ = "PostGIS";
+}
+
+bool TePostGIS::connect(const string& host, const string& user, const string& password, const string& database, int port)
+{
+ if(!realConnect(host, user, password, database, port))
+ return false;
+
+ // See if PostGIS is present
+ TePGRecordset rec;
+
+ string sql = "SELECT postgis_version()";
+
+ if(!rec.open(sql.c_str(), &tepg_connection_) || rec.recordCount() <= 0)
+ {
+ rec.close();
+
+ this->close();
+
+ errorMessage_ = "Couldn't find PostGIS extension! You may use the PostgreSQL driver!";
+
+ return false;
+ }
+
+ return true;
+}
+
+bool TePostGIS::showDatabases(const string& host, const string& user, const string& password, vector<string>& dbNames, int port)
+{
+ errorMessage_ = "";
+
+ if(TePostgreSQL::realConnect(host, user, password, "template1", port))
+ {
+ string sql = "SELECT datname FROM pg_database WHERE datname NOT IN ('template0', 'template1') ORDER BY datname";
+
+ TePostGISPortal p(this);
+
+ if(p.query(sql) && p.fetchRow())
+ {
+ do
+ {
+ dbNames.push_back(p.getData("datname"));
+ }while(p.fetchRow());
+
+ return true;
+ }
+ else
+ errorMessage_ = "Didn't find any database!";
+ }
+
+ return false;
+}
+
+TeDatabasePortal* TePostGIS::getPortal()
+{
+ errorMessage_ = "";
+
+ TeDatabasePortal *portal = new TePostGISPortal(this);
+
+ return portal;
+}
+
+bool TePostGIS::createPolygonGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ create = "SELECT AddGeometryColumn('";
+ create += database_;
+ create += "', '";
+ create += TeConvertToLowerCase(tableName);
+ create += "', 'spatial_data',";
+ create += " -1, 'POLYGON', 2)";
+
+
+ if(!execute(create))
+ return false;
+
+ //creates indexes
+ return createIndex(tableName, tableName + "obj_idx", "object_id");
+}
+
+bool TePostGIS::createLineGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ create = "SELECT AddGeometryColumn('";
+ create += database_;
+ create += "', '";
+ create += TeConvertToLowerCase(tableName);
+ create += "', 'spatial_data',";
+ create += " -1, 'LINESTRING', 2)";
+
+ if(!this->execute(create))
+ return false;
+
+ //creates indexes
+ return createIndex(tableName, tableName + "obj_idx", "object_id");
+}
+
+bool TePostGIS::createPointGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ create = "SELECT AddGeometryColumn('";
+ create += database_;
+ create += "', '";
+ create += TeConvertToLowerCase(tableName);
+ create += "', 'spatial_data', ";
+ create += " -1, 'POINT', 2)";
+
+ if(!this->execute(create))
+ return false;
+
+ //creates indexes
+ return createIndex(tableName, tableName + "obj_idx", "object_id");
+}
+
+bool TePostGIS::createCellGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " col_number INT NOT NULL,";
+ create += " row_number INT NOT NULL,";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ create = "SELECT AddGeometryColumn('";
+ create += database_;
+ create += "', '";
+ create += TeConvertToLowerCase(tableName);
+ create += "', 'spatial_data',";
+ create += " -1, 'POLYGON', 2)";
+
+ if(!this->execute(create))
+ return false;
+
+ //creates indexes
+ if(!createIndex(tableName, tableName + "obj_idx", "object_id"))
+ return false;
+
+ return createIndex(tableName, tableName + "rc_idx", "row_number, col_number");
+}
+
+
+bool TePostGIS::createNodeGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ create = "SELECT AddGeometryColumn('";
+ create += database_;
+ create += "', '";
+ create += TeConvertToLowerCase(tableName);
+ create += "', 'spatial_data',";
+ create += " -1, 'POINT', 2)";
+
+ if(!this->execute(create))
+ return false;
+
+ //creates indexes
+ return createIndex(tableName, tableName + "obj_idx", "object_id");
+}
+
+bool TePostGIS::generateLabelPositions(TeTheme *theme)
+{
+ string geomTable, upd;
+ string collTable = theme->collectionTable();
+
+ if((collTable.empty()) || (!tableExist(collTable)))
+ return false;
+
+ if(theme->layer()->hasGeometry(TeCELLS) ||
+ theme->layer()->hasGeometry(TePOLYGONS) ||
+ theme->layer()->hasGeometry(TeLINES) ||
+ theme->layer()->hasGeometry(TePOINTS))
+ {
+ geomTable = theme->layer()->tableName(TeCELLS);
+
+ if(geomTable.empty())
+ {
+ geomTable = theme->layer()->tableName(TePOLYGONS);
+ if(geomTable.empty())
+ {
+ geomTable = theme->layer()->tableName(TeLINES);
+
+ if(geomTable.empty())
+ geomTable = theme->layer()->tableName(TePOINTS);
+ }
+ }
+
+ upd= " UPDATE " + collTable + " SET ";
+ upd += " label_x = (SELECT MAX(xmin(spatial_data::box3d) + (xmax(spatial_data::box3d)";
+ upd += " - xmin(spatial_data::box3d)) / 2.0) ";
+ upd += "FROM " + geomTable + " WHERE object_id = c_object_id), ";
+
+ upd += " label_y = (SELECT MAX(ymin(spatial_data::box3d) + (ymax(spatial_data::box3d)";
+ upd += " - ymin(spatial_data::box3d)) / 2.0) ";
+ upd += "FROM " + geomTable + " WHERE object_id = c_object_id) ";
+
+ upd += " WHERE (label_x IS NULL) OR (label_y IS NULL)";
+ }
+
+ return execute(upd);
+}
+
+
+bool TePostGIS::selectPolygonSet(const string& table, const string& criteria, TePolygonSet& ps)
+{
+ TeDatabasePortal *portal = this->getPortal();
+
+ string sql ="SELECT * FROM " + table;
+
+ if(!criteria.empty())
+ sql += " WHERE " + criteria;
+
+ sql += " ORDER BY object_id ASC";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ ps.add(poly);
+ }
+ while(flag);
+
+ delete portal;
+
+ return true;
+}
+
+bool TePostGIS::loadPolygonSet(TeTheme* theme, TePolygonSet& ps)
+{
+ string collTable = theme->collectionTable();
+
+ if(collTable.empty())
+ return false;
+
+ TeLayer* themeLayer = theme->layer();
+
+ if(!themeLayer->hasGeometry(TePOLYGONS))
+ return false;
+
+ string polygonTable = themeLayer->tableName(TePOLYGONS);
+
+ if(polygonTable.empty())
+ return false;
+
+ string sql = "SELECT * FROM (" + polygonTable + " RIGHT JOIN " + collTable;
+ sql += " ON " + polygonTable + ".object_id = " + collTable + ".object_id)";
+
+ TeDatabasePortal *portal = this->getPortal();
+
+ if(!portal)
+ return false;
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ ps.add ( poly );
+ }
+ while(flag);
+
+ delete portal;
+
+ return true;
+}
+
+bool TePostGIS::loadPolygonSet(const string& table, const string& geoid, TePolygonSet& ps)
+{
+ TeDatabasePortal *portal = this->getPortal();
+
+ string q ="SELECT * FROM " + table;
+
+ if (!geoid.empty())
+ q += " WHERE object_id = '" + geoid +"'";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ ps.add(poly);
+ }
+ while (flag);
+
+ delete portal;
+
+ return true;
+}
+
+bool TePostGIS::loadPolygonSet(const string& table, TeBox& box, TePolygonSet& ps)
+{
+ TeDatabasePortal *portal = this->getPortal();
+
+ if(!portal)
+ return false;
+
+ string q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere (box, TePOLYGONS);
+ q += " ORDER BY object_id ASC";
+
+ if(!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ ps.add(poly);
+ }
+ while (flag);
+
+ delete portal;
+
+ return true;
+}
+
+TeDatabasePortal* TePostGIS::loadPolygonSet(const string& table, TeBox& box)
+{
+ TeDatabasePortal *portal = this->getPortal();
+
+ if(!portal)
+ return 0;
+
+ string q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere(box, TePOLYGONS);
+ q += " ORDER BY object_id ASC";
+
+ if(!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return 0;
+ }
+ else
+ return portal;
+}
+
+bool TePostGIS::locatePolygon(const string& table, TeCoord2D& pt, TePolygon& polygon, const double& tol)
+{
+ TeDatabasePortal *portal = this->getPortal();
+
+ if (!portal)
+ return false;
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+
+ string sql = "SELECT * FROM ";
+ sql += table;
+ sql += " WHERE ";
+ sql += getSQLBoxWhere(box, TePOLYGONS);
+ //sql += " WHERE GeometryFromText('";
+ //sql += PGPoint_encode(TePoint(pt));
+ //sql += "', -1) && spatial_data) ";
+ //AND intersects(GeometryFromText('";
+ //sql += PGPoint_encode(TePoint(pt));
+ //sql += "', -1), spatial_data)";
+
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+
+ do
+ {
+ TePolygon poly;
+
+ flag = portal->fetchGeometry(poly);
+
+ if(TeWithin(TePoint(pt), poly))
+ {
+ polygon = poly;
+ delete portal;
+ return true;
+ }
+ }
+ while(flag);
+
+ delete portal;
+
+ return false;
+}
+
+bool TePostGIS::locatePolygonSet(const string& table, TeCoord2D &pt, double tol, TePolygonSet &polygons)
+{
+ TeDatabasePortal *portal = this->getPortal();
+
+ if (!portal)
+ return false;
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+
+ string sql = "SELECT * FROM ";
+ sql += table;
+ sql += " WHERE ";
+ sql += getSQLBoxWhere(box, TePOLYGONS);
+
+ //GeometryFromText('";
+ //sql += PGPoint_encode(TePoint(pt));
+ //sql += "', -1') && spatial_data) ";
+ //AND intersects(GeometryFromText('";
+ //sql += PGPoint_encode(TePoint(pt));
+ //sql += "', -1), spatial_data)";
+
+ if (!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+
+ polygons.clear();
+
+ do
+ {
+ TePolygon poly;
+
+ flag = portal->fetchGeometry(poly);
+
+ if(TeWithin(TePoint(pt), poly))
+ polygons.add(poly);
+ }
+ while (flag);
+
+ delete portal;
+
+ if(polygons.size())
+ return (true);
+
+ return false;
+}
+
+bool TePostGIS::insertPolygon(const string& table, TePolygon &p)
+{
+ errorMessage_ = "";
+
+ //TeRemoveDuplicatedCoordinates(p);
+
+ string sql = "INSERT INTO " + table + " (object_id, spatial_data) VALUES('";
+ sql += p.objectId();
+ sql += "', ";
+
+ sql += "GeometryFromText('POLYGON(";
+
+
+ for(register unsigned int i = 0; i < p.size(); ++i)
+ {
+ if(i != 0)
+ {
+ sql += ", ";
+ }
+
+ PGConcatLineString(p[i], sql);
+ }
+
+ sql += ")', -1)"; // end POLYGON
+ sql += ")"; // end SQL
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('" + table + "_geom_id_seq')";
+
+ TePGRecordset rec;
+ rec.open(sql.c_str(), &tepg_connection_);
+ if(rec.recordCount() > 0)
+ {
+ for(register unsigned int i = 0; i < p.size(); ++i)
+ {
+ p[i].geomId(atoi(rec.value(0)));
+ }
+ }
+
+ rec.close();
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool TePostGIS::updatePolygon(const string& table, TePolygon &p)
+{
+ errorMessage_ = "";
+
+ //TeRemoveDuplicatedCoordinates(p);
+
+ TePolygon::iterator it = p.begin();
+ TePolygon::iterator it_end = p.end();
+
+ string sql = "UPDATE " + table + " SET object_id = '";
+ sql += p.objectId();
+ sql += "', spatial_data = ";
+
+
+ sql += "GeometryFromText('POLYGON(";
+
+ for(; it != it_end; ++it)
+ {
+ PGConcatLineString(*it, sql);
+ }
+
+ sql += ")', -1)"; // end POLYGON
+ sql += " WHERE geom_id = ";
+ sql += Te2String(it->geomId());
+
+ return this->execute(sql);
+}
+
+bool TePostGIS::loadLineSet(const string& table, const string& geoid, TeLineSet& ls)
+{
+ TeDatabasePortal *portal = this->getPortal();
+
+ string q ="SELECT * FROM " + table;
+
+ if(!geoid.empty())
+ q += " WHERE object_id = '" + geoid +"'";
+
+ if(!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+
+ do
+ {
+ TeLine2D line;
+ flag = portal->fetchGeometry(line);
+ ls.add (line);
+ }while(flag);
+
+ delete portal;
+
+ return true;
+}
+
+bool TePostGIS::loadLineSet(const string& table, TeBox& box, TeLineSet& linSet)
+{
+ TeDatabasePortal *portal = this->getPortal();
+
+ if(!portal)
+ return false;
+
+ string q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere (box, TeLINES);
+ q += " ORDER BY object_id DESC";
+
+ if(!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+
+ do
+ {
+ TeLine2D lin;
+ flag = portal->fetchGeometry(lin);
+ linSet.add(lin);
+ }
+ while (flag);
+
+ delete portal;
+
+ return true;
+}
+
+TeDatabasePortal* TePostGIS::loadLineSet(const string& table, TeBox& box)
+{
+ TeDatabasePortal *portal = this->getPortal();
+
+ if(!portal)
+ return 0;
+
+ string q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere (box, TeLINES);
+ q += " ORDER BY object_id DESC";
+
+ if(!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+
+ return 0;
+ }
+
+ return portal;
+}
+
+bool TePostGIS::insertLine(const string& table, TeLine2D& l)
+{
+ errorMessage_ = "";
+
+ //TeRemoveDuplicatedCoordinates(l);
+
+ string sql = "INSERT INTO " + table + " (object_id, spatial_data) ";
+ sql += "VALUES('";
+ sql += l.objectId();
+ sql += "', GeometryFromText('LINESTRING";
+
+ PGConcatLineString(l, sql);
+
+ sql += "', -1))";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('" + table + "_geom_id_seq')";
+
+ TePGRecordset rec;
+ rec.open(sql.c_str(), &tepg_connection_);
+
+ if(rec.recordCount() > 0)
+ l.geomId(atoi(rec.value(0)));
+
+ rec.close();
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool TePostGIS::updateLine(const string& table, TeLine2D& l)
+{
+ errorMessage_ = "";
+
+ //TeRemoveDuplicatedCoordinates(l);
+
+ string sql = "UPDATE " + table + " SET object_id = '";
+ sql += l.objectId();
+ sql += "', spatial_data = GeometryFromText('LINESTRING";
+
+ PGConcatLineString(l, sql);
+
+ sql += "', -1) WHERE geom_id = ";
+ sql += Te2String(l.geomId());
+
+ return this->execute(sql);
+}
+
+bool TePostGIS::locateLine(const string& table, TeCoord2D &pt, TeLine2D &line, const double& tol)
+{
+ TeDatabasePortal* portal = this->getPortal();
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+ //string geom = "GeometryFromText('POLYGON((";
+ // geom += Te2String(box.x1()) + " " + Te2String(box.y1()) + ", ";
+ // geom += Te2String(box.x2()) + " " + Te2String(box.y1()) + ", ";
+ // geom += Te2String(box.x2()) + " " + Te2String(box.y2()) + ", ";
+ // geom += Te2String(box.x1()) + " " + Te2String(box.y2()) + ", ";
+ // geom += Te2String(box.x1()) + " " + Te2String(box.y1());
+ // geom += "))', -1)";
+
+ string sql = "SELECT * FROM ";
+ sql += table;
+ sql += " WHERE ";
+ sql += this->getSQLBoxWhere(box, TeLINES);
+ // sql +=
+ //(" + geom + " && spatial_data) ";
+ //AND intersects(";
+ //sql += geom;
+ //sql += ", spatial_data)";
+
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ // Get all lines
+ TeLineSet ls;
+ int k;
+ bool flag = true;
+ do
+ {
+ TeLine2D l;
+ flag = portal->fetchGeometry( l );
+ ls.add ( l );
+ } while(flag);
+
+ delete portal;
+
+ TeCoord2D paux;
+
+ if(TeNearest(pt, ls, k, paux, tol))
+ {
+ line = ls[k];
+ return true;
+ }
+
+ return false;
+}
+
+bool TePostGIS::insertPoint(const string& table, TePoint &p)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO " + table + " (object_id, spatial_data) VALUES('";
+ sql += p.objectId();
+ sql += "', GeometryFromText('";
+ sql += PGPoint_encode(p);
+ sql += "', -1))";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('" + table + "_geom_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql.c_str(), &tepg_connection_);
+ if(rec.recordCount() > 0)
+ p.geomId(atoi(rec.value(0)));
+
+ rec.close();
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool TePostGIS::updatePoint(const string& table, TePoint &p)
+{
+ errorMessage_ = "";
+
+ string sql = "UPDATE " + table + " SET object_id = '";
+ sql += p.objectId();
+ sql += "', spatial_data = GeometryFromText('";
+ sql += PGPoint_encode(p);
+ sql += "', -1) WHERE geom_id = ";
+ sql += Te2String(p.geomId());
+
+ return this->execute(sql);
+}
+
+bool TePostGIS::locatePoint(const string& table, TeCoord2D& pt, TePoint& point, const double& tol)
+{
+ TeDatabasePortal* portal = this->getPortal();
+
+ TeBox bbox(pt.x() - tol, pt.y() - tol, pt.x() + tol, pt.y() + tol);
+
+ string sql = "SELECT * FROM ";
+ sql += table;
+ sql += " WHERE ";
+ sql += this->getSQLBoxWhere(bbox, TePOINTS);
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ TePointSet ps;
+
+ bool flag = true;
+
+ do
+ {
+ TePoint point;
+ flag = portal->fetchGeometry(point);
+ ps.add(point);
+ }while(flag);
+
+ delete portal;
+ int k;
+ if(TeNearest(pt, ps, k, tol))
+ {
+ point = ps[k];
+ return true;
+ }
+ return false;
+}
+
+bool TePostGIS::insertNode(const string& table, TeNode& node)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO " + table + " (object_id, spatial_data) VALUES('";
+ sql += node.objectId();
+ sql += "', GeometryFromText('";
+ sql += PGNode_encode(node);
+ sql += "', -1))";
+
+ if(!this->execute(sql))
+ return false;
+
+ sql = "SELECT currval('" + table + "_geom_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql.c_str(), &tepg_connection_);
+ if(rec.recordCount() > 0)
+ node.geomId(atoi(rec.value(0)));
+
+ rec.close();
+
+ return true;
+}
+
+bool TePostGIS::updateNode(const string& table, TeNode& node)
+{
+ errorMessage_ = "";
+
+ string sql = "UPDATE " + table + " SET object_id = '";
+ sql += node.objectId();
+ sql += "', spatial_data = GeometryFromText('";
+ sql += PGNode_encode(node);
+ sql += "', -1) WHERE geom_id = ";
+ sql += Te2String(node.geomId());
+
+ return this->execute(sql);
+}
+
+bool TePostGIS::insertCell(const string& table, TeCell &c)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO " + table + " (object_id, spatial_data, col_number, row_number) VALUES('";
+ sql += c.objectId();
+ sql += "', GeometryFromText('";
+ sql += PGMakePolygon(c.box());
+ sql += "', -1), ";
+ sql += Te2String(c.column());
+ sql += ", ";
+ sql += Te2String(c.line());
+ sql += ")";
+
+ if(!this->execute(sql))
+ return false;
+
+ sql = "SELECT currval('" + table + "_geom_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql.c_str(), &tepg_connection_);
+ if(rec.recordCount() > 0)
+ c.geomId(atoi(rec.value(0)));
+
+ rec.close();
+
+ return true;
+}
+
+bool TePostGIS::updateCell(const string& table, TeCell &c)
+{
+ errorMessage_ = "";
+
+ string sql = "UPDATE " + table + " SET object_id = '";
+ sql += c.objectId();
+ sql += "', spatial_data = GeometryFromText('";
+ sql += PGMakePolygon(c.box());
+ sql += "', -1), col_number = ";
+ sql += Te2String(c.column());
+ sql += ", row_number = ";
+ sql += Te2String(c.line());
+ sql += " WHERE geom_id = ";
+ sql += Te2String(c.geomId());
+
+ return this->execute(sql);
+}
+
+bool TePostGIS::locateCell(const string& table, TeCoord2D& pt, TeCell& c, const double& tol)
+{
+ TeDatabasePortal* portal = this->getPortal();
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+
+ string sql ="SELECT * FROM ";
+ sql += table;
+ sql += "WHERE ";
+ sql += this->getSQLBoxWhere(box, TeCELLS);
+
+ //sql += " WHERE (GeometryFromText('";
+ //sql += PGPoint_encode(TePoint(pt));
+ //sql += "', -1) && spatial_data) AND intersects(GeometryFromText('";
+ //sql += PGPoint_encode(TePoint(pt));
+ //sql += ", spatial_data)";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ portal->fetchGeometry(c);
+
+ delete portal;
+
+ return true;
+}
+
+bool TePostGIS::createSpatialIndex(const string& table, const string& column, TeSpatialIndexType /*type*/, short /*level*/, short /*tile*/)
+{
+ string create = "CREATE INDEX sp_idx_" + table + " ON " + table + " USING GIST (" + column + " GIST_GEOMETRY_OPS)";
+
+ return this->execute(create);
+}
+
+string TePostGIS::getSQLBoxWhere(TeBox& box, TeGeomRep rep)
+{
+ if(rep == TeTEXT || rep == TeRASTER)
+ {
+ string wherebox = TeDatabase::getSQLBoxWhere (box, rep);
+ return wherebox;
+ }
+
+ string colname = "spatial_data";
+
+ string wherebox = "('" + PGBox_encode(box) + "'::box3d";
+ wherebox += " && " + colname + ")";
+
+ return wherebox;
+}
+
+string TePostGIS::getSQLBoxWhere(const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep rep1)
+{
+ if(rep1 == TeRASTER || rep2 == TeRASTER || rep1 == TeTEXT || rep2 == TeTEXT)
+ {
+ string wherebox = TeDatabase::getSQLBoxWhere(table1, table2, rep2, rep1);
+
+ return wherebox;
+ }
+
+ string colname1 = "spatial_data";
+ string colname2 = "spatial_data";
+
+ if(rep1 == TeRASTER)
+ colname1 = "block_box";
+
+ if(rep2 == TeRASTER)
+ colname2 = "block_box";
+
+ string wherebox = table1;
+ wherebox += "." + colname1 + " && ";
+ wherebox += table2;
+ wherebox += "." + colname2 + "";
+
+ return wherebox;
+}
+
+string TePostGIS::getSQLBoxSelect (const string& tableName, TeGeomRep rep)
+{
+ string colname = "spatial_data";
+
+ if(rep != TeRASTER)
+ {
+
+ string select = tableName +".* , ";
+ select += "xmin(" + colname + ") as lower_x, ";
+ select += "ymin(" + colname + ") as lower_y, ";
+ select += "xmax(" + colname + ") as upper_x, ";
+ select += "ymax(" + colname + ") as upper_y ";
+
+ return select;
+ }
+ else // RASTER
+ {
+ string select = tableName +".* , ";
+ select += "xmin(lower_x) as lower_x, ";
+ select += "ymin(lower_y) as lower_y, ";
+ select += "xmax(upper_x) as upper_x, ";
+ select += "ymax(upper_y) as upper_y ";
+
+ return select;
+ }
+}
+
+bool TePostGIS::getMBRGeom(string tableGeom, string object_id, TeBox& box, string /*colGeom*/)
+{
+ TeDatabasePortal* portal = getPortal();
+ if(!portal)
+ return false;
+
+ string sel = "SELECT extent(spatial_data) FROM " + tableGeom;
+ sel += " WHERE object_id = '" + object_id + "'";
+
+ if(!portal->query(sel))
+ {
+ delete portal;
+ return false;
+ }
+
+ bool b = portal->fetchRow();
+ if(!b)
+ {
+ delete portal;
+ return false;
+ }
+
+ box = PGBox_decode(portal->getData(0));
+
+ delete portal;
+ return true;
+}
+
+bool TePostGIS::getMBRSelectedObjects(string /*geomTable*/, string /*colGeom*/, string fromClause, string whereClause, string afterWhereClause, TeGeomRep repType, TeBox& bout, const double& /*tol*/)
+{
+ string colname = "spatial_data";
+
+ if(repType != TeRASTER)
+ {
+ string fields = "extent(" + colname + ")";
+ string query = " SELECT " + fields;
+ query += " FROM " + fromClause;
+ query += " WHERE " + whereClause;
+ query += afterWhereClause;
+
+ TeDatabasePortal* portal = this->getPortal();
+
+ if(portal->query(query) && portal->fetchRow())
+ {
+ TeBox aux(PGBox_decode(portal->getData(0)));
+ bout = aux;
+
+ delete portal;
+ return true;
+ }
+
+ delete portal;
+ }
+ else
+ {
+ string fields = "MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y)";
+ string query = " SELECT " + fields;
+ query += " FROM " + fromClause;
+ query += " WHERE " + whereClause;
+ query += afterWhereClause;
+
+ TeDatabasePortal* portal = this->getPortal();
+
+ if(portal->query(query) && portal->fetchRow())
+ {
+ double x1 = portal->getDouble(0);
+ double y1 = portal->getDouble(1);
+ double x2 = portal->getDouble(2);
+ double y2 = portal->getDouble(3);
+
+ TeBox aux(x1, y1, x2, y2);
+ bout = aux;
+
+ delete portal;
+ return true;
+ }
+
+ delete portal;
+ }
+
+ return false;
+}
+
+
+
+TePostGISPortal::TePostGISPortal(TeDatabase *pDatabase)
+{
+ db_ = pDatabase;
+ con_ = &((static_cast<TePostGIS*>(pDatabase))->tepg_connection_);
+}
+
+bool TePostGISPortal::fetchGeometry(TePolygon& pol)
+{
+ errorMessage_ = "";
+
+ tepg_recordset_.getPGISPolygon("spatial_data", pol);
+ pol.geomId(tepg_recordset_.getInt("geom_id"));
+ pol.objectId(tepg_recordset_.value("object_id"));
+
+ return fetchRow();
+}
+
+bool TePostGISPortal::fetchGeometry(TeLine2D& line)
+{
+ errorMessage_ = "";
+
+ tepg_recordset_.getPGISLine("spatial_data", line);
+ line.geomId(tepg_recordset_.getInt("geom_id"));
+ line.objectId(tepg_recordset_.value("object_id"));
+
+ return fetchRow();
+}
+
+bool TePostGISPortal::fetchGeometry(TeNode& n)
+{
+ errorMessage_ = "";
+
+ TePoint p;
+ tepg_recordset_.getPGISPoint("spatial_data", p);
+ n.add(p.location());
+ n.geomId(tepg_recordset_.getInt("geom_id"));
+ n.objectId(tepg_recordset_.value("object_id"));
+
+ //n.add(PGPoint_decode(getData("spatial_data")).location());
+ //n.geomId(atoi(getData("geom_id")));
+ //n.objectId(string(getData("object_id")));
+
+ return fetchRow();
+}
+
+bool TePostGISPortal::fetchGeometry(TePoint& p)
+{
+ errorMessage_ = "";
+
+ tepg_recordset_.getPGISPoint("spatial_data", p);
+ p.geomId(tepg_recordset_.getInt("geom_id"));
+ p.objectId(tepg_recordset_.value("object_id"));
+
+ return fetchRow();
+}
+
+bool TePostGISPortal::fetchGeometry(TeCell& cell)
+{
+ errorMessage_ = "";
+
+ TePolygon pol;
+ tepg_recordset_.getPGISPolygon("spatial_data", pol);
+
+ cell.geomId(tepg_recordset_.getInt("geom_id"));
+ cell.objectId(tepg_recordset_.value("object_id"));
+ cell.setBox (pol.box());
+ cell.column(tepg_recordset_.getInt("col_number"));
+ cell.line(tepg_recordset_.getInt("row_number"));
+
+
+ return fetchRow();
+}
diff --git a/src/terralib/drivers/PostgreSQL/TePostGIS.h b/src/terralib/drivers/PostgreSQL/TePostGIS.h
new file mode 100644
index 0000000..ad23b3f
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePostGIS.h
@@ -0,0 +1,213 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TePostGIS.h
+ This file contains a database driver to access PostgreSQL server using PostGIS extension.
+ */
+
+/**
+ *@author Gilberto Ribeiro de Queiroz - gribeiro at dpi.inpe.br
+ */
+
+/**
+ *@description This file contains the especifics routines of PostgreSQL.
+ */
+
+/*
+ * TODO:
+ *
+ *
+ *
+ */
+
+#ifndef __TERRALIB_INTERNAL_POSTGIS_H
+#define __TERRALIB_INTERNAL_POSTGIS_H
+
+#include "TePostgreSQL.h"
+
+
+class TePostGISPortal;
+
+//! PostgreSQL with PostGIS extension database access class.
+/*!
+ This class contains the implementation of common methods for TerraLib access PostgreSQL using a PostGIS extension.
+ */
+class TePostGIS : public TePostgreSQL
+{
+ friend class TePostGISPortal;
+
+ public:
+
+ //! Constructor
+ TePostGIS();
+
+ //! Destructor
+ virtual ~TePostGIS()
+ {
+ }
+
+ //! Opens a conection to a database server
+ bool connect(const string& host, const string& user, const string& password, const string& database, int port = 0);
+
+ bool showDatabases(const string& host, const string& user, const string& password, vector<string>& dbNames, int port = 0);
+
+ //! Returns a portal associated to this database
+ TeDatabasePortal* getPortal();
+
+ //! Show the server databases (only for MySQL, Oracle and PostgreSQL)
+ //bool showDatabases(const string& host, const string& user, const string& password, vector<string>& dbNames, int port = 0);
+
+ //! Creates a table for a polygon geometries
+ bool createPolygonGeometry(const string& tableName);
+
+ //! Creates a table for line geometries
+ bool createLineGeometry(const string& tableName);
+
+ //! Creates a table for point geometries
+ bool createPointGeometry(const string& tableName);
+
+ //! Creates a table for cell geometries
+ bool createCellGeometry(const string& tableName);
+
+ //! Creates a table for a node geometries
+ bool createNodeGeometry(const string& tableName);
+
+ //! Generate the label position (x,y) to each object of a theme
+ bool generateLabelPositions(TeTheme *theme);
+
+ //! Returns all polygons in a table given a criteria expressed as an SQL where statement
+ bool selectPolygonSet(const string& table, const string& criteria, TePolygonSet& ps);
+
+ //! Returns all polygons that represents objects of a particular theme
+ bool loadPolygonSet(TeTheme* theme, TePolygonSet& ps);
+
+ //! Returns all polygons that represents objects of a particular geoid
+ bool loadPolygonSet(const string& table, const string& geoid, TePolygonSet& ps);
+
+ //! Returns all polygons inside a given box
+ bool loadPolygonSet(const string& table, TeBox& box, TePolygonSet& ps);
+
+ //! Returns a database portal to iterate over the polygons that are inside a given box
+ TeDatabasePortal* loadPolygonSet(const string& table, TeBox& box);
+
+ //! Returns the first polygon that contais a given coordinate
+ bool locatePolygon(const string& table, TeCoord2D& pt, TePolygon& polygon, const double& tol = 0.0);
+
+ //! Returns the polygons that contains a give coordinate
+ bool locatePolygonSet (const string& table, TeCoord2D &pt, double tol, TePolygonSet &polygons);
+
+ //! Inserts a polygon
+ bool insertPolygon(const string& table, TePolygon& p);
+
+ //! Updates a polygon
+ bool updatePolygon(const string& table, TePolygon& p);
+
+ bool loadLineSet(const string& table, const string& geoid, TeLineSet& ls);
+
+ bool loadLineSet(const string& table, TeBox& box, TeLineSet& linSet);
+
+ TeDatabasePortal* loadLineSet(const string& table, TeBox& box);
+
+ //! Inserts a line
+ bool insertLine(const string& table, TeLine2D& l);
+
+ //! Updates a line
+ bool updateLine(const string& table, TeLine2D& l);
+
+ //! Locates a line
+ bool locateLine(const string& table, TeCoord2D& pt, TeLine2D& line, const double& tol = 0.0);
+
+ //! Inserts a point
+ bool insertPoint(const string& table, TePoint& p);
+
+ //! Updates a point
+ bool updatePoint(const string& table, TePoint& p);
+
+ //! Locates a point
+ bool locatePoint(const string& table, TeCoord2D& pt, TePoint& point, const double& tol = 0.0);
+
+ //! Inserts a node
+ bool insertNode(const string& table, TeNode& node);
+
+ //! Updates a node
+ bool updateNode(const string& table, TeNode& node);
+
+ //! Inserts a cell
+ bool insertCell(const string& table, TeCell& c);
+
+ //! Updates a cell
+ bool updateCell(const string& table, TeCell& c);
+
+ // Locates a cell
+ bool locateCell(const string& table, TeCoord2D& pt, TeCell& c, const double& tol = 0.0);
+
+ //! Creates a spatial index on column table
+ bool createSpatialIndex(const string& table, const string& column, TeSpatialIndexType type = TeRTREE, short level = 0, short tile = 0);
+
+ //! Return a string that describes a where clause to return the geometries inside the box
+ string getSQLBoxWhere(TeBox &box, TeGeomRep rep);
+
+ //! Returns a string that describes a where clause to return the geometries of the table2 that are inside the geometries box of the table1
+ string getSQLBoxWhere(const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep rep1 = TePOLYGONS);
+
+ //! Return a string SQL to be used in the clause SELECT to select the box (lower_x, lower_y, upper_x, upper_y)
+ string getSQLBoxSelect(const string& tableName, TeGeomRep rep);
+
+ //! Returns the box of a specific geometry (object_id)
+ bool getMBRGeom(string tableGeom, string object_id, TeBox& box, string colGeom);
+
+ //! Return the box of a select objects set
+ bool getMBRSelectedObjects(string geomTable, string colGeom, string fromClause, string whereClause, string afterWhereClause, TeGeomRep repType, TeBox& bout, const double& tol = 0.0);
+};
+
+
+//! PostgreSQL with PostGIS extension data navigation functionalities.
+/*!
+ This class contains the implementation of common methods for TerraLib navigate throw data.
+ */
+class TePostGISPortal : public TePostgreSQLPortal
+{
+ public:
+
+ //! Constructor
+ TePostGISPortal()
+ {
+ }
+
+ //! Constructor
+ TePostGISPortal(TeDatabase *pDatabase);
+
+ //! Virtual Destructor
+ virtual ~TePostGISPortal()
+ {
+ };
+
+ bool fetchGeometry(TePolygon& pol);
+ bool fetchGeometry(TeLine2D& line);
+ bool fetchGeometry(TeNode& n);
+ bool fetchGeometry(TePoint& p);
+ bool fetchGeometry(TeCell& cell);
+};
+
+#endif // __TERRALIB_INTERNAL_POSTGIS_H
+
diff --git a/src/terralib/drivers/PostgreSQL/TePostgreSQL.cpp b/src/terralib/drivers/PostgreSQL/TePostgreSQL.cpp
new file mode 100644
index 0000000..67bbb10
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePostgreSQL.cpp
@@ -0,0 +1,3304 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TePostgreSQL.h"
+#include "TePGUtils.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+
+
+
+
+
+
+
+#include "TeSpatialOperations.h"
+#include "TeGeometryAlgorithms.h"
+#include <string>
+using namespace std;
+
+
+//----- TePostgreSQL methods ---
+TePostgreSQL::TePostgreSQL()
+{
+ errorMessage_ = "";
+ dbmsName_ = "PostgreSQL";
+}
+
+TePostgreSQL::~TePostgreSQL()
+{
+ if(isConnected_)
+ close();
+}
+
+string TePostgreSQL::errorMessage()
+{
+ if(errorMessage_.empty())
+ return tepg_connection_.err_msg();
+ else
+ return errorMessage_;
+
+}
+
+bool TePostgreSQL::newDatabase(const string& database, const string& user, const string& password, const string& host, const int& port, bool terralibModel)
+{
+ errorMessage_ = "";
+
+ string createDB = "CREATE DATABASE ";
+ createDB += database;
+
+ //if(!realConnect(host, user, password, "template1", port))
+ // return false;
+
+ if(!connect(host, user, password, "template1", port))
+ return false;
+
+
+ bool connected = false;
+
+ if(execute(createDB))
+ connected = connect(host, user, password, database, port);
+ else
+ return false;
+
+ if(terralibModel)
+ {
+ //create conceptual model
+ if(connected)
+ {
+ if(!createConceptualModel())
+ return false;
+ }
+ else
+ return false;
+ }
+
+ return true;
+}
+
+
+bool TePostgreSQL::connect(const string& host, const string& user, const string& password, const string& database, int port)
+{
+ if(TePostgreSQL::realConnect(host, user, password, database, port))
+ {
+ // See if PostGIS is present
+ TePGRecordset rec;
+
+ string sql = "SELECT postgis_version()";
+
+ if(rec.open(sql.c_str(), &tepg_connection_) && rec.recordCount() > 0)
+ {
+ rec.close();
+
+ this->close();
+
+ errorMessage_ = "PostGIS extension found! Please use a PostGIS driver!";
+
+ return false;
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+bool TePostgreSQL::realConnect(const string& host, const string& user, const string& password, const string& database, int port)
+{
+ errorMessage_ = "";
+
+ host_ = (host == "") ? (string("")) : (" host = " + host + " ");
+ user_ = (user == "") ? (string("")) : (" user = " + user + " ");
+ password_ = (password == "") ? (string("")) : (" password = " + password + " ");
+ database_ = (database == "") ? (string("")) : (" dbname = " + database + " ");
+ string portNumber = (port == 0) ? (string("")) : (" port = " + Te2String(port) + " ");
+
+ portNumber_ = port;
+
+ string connInfo = host_ + user_ + password_ + database_ + portNumber;
+
+ this->close();
+
+ if(!tepg_connection_.open(connInfo))
+ {
+ errorMessage_ = "Could not connect to the database server!";
+ return false;
+ }
+
+ isConnected_ = true;
+
+ host_ = host;
+ user_ = user;
+ password_ = password;
+ database_ = database;
+
+ return true;
+}
+
+bool TePostgreSQL::showDatabases(const string& host, const string& user, const string& password, vector<string>& dbNames, int port)
+{
+ errorMessage_ = "";
+
+ if(realConnect(host, user, password, "template1", port))
+ {
+ string sql = "SELECT datname FROM pg_database WHERE datname NOT IN ('template0', 'template1') ORDER BY datname";
+
+ TePostgreSQLPortal p(this);
+
+ if(p.query(sql) && p.fetchRow())
+ {
+ do
+ {
+ dbNames.push_back(p.getData("datname"));
+ }while(p.fetchRow());
+
+ return true;
+ }
+ else
+ errorMessage_ = "Didn't find any database!";
+ }
+
+ return false;
+}
+
+void TePostgreSQL::close(void)
+{
+ clear();
+
+ errorMessage_ = "";
+
+ tepg_connection_.close();
+ isConnected_ = false;
+
+ return;
+}
+
+bool TePostgreSQL::listTables(vector<string>& tableList)
+{
+ errorMessage_ = "";
+
+ TePGRecordset rec;
+
+ string sql = "SELECT tablename FROM pg_table WHERE schemaname = 'public' ORDER BY tablename";
+
+ if(!rec.open(sql, &tepg_connection_) || rec.recordCount() <= 0)
+ return false;
+
+ while(!rec.eof())
+ {
+ tableList.push_back(rec.getData(0));
+ rec.moveNext();
+ }
+
+ return true;
+
+}
+
+bool TePostgreSQL::tableExist(const string& table)
+{
+ errorMessage_ = "";
+
+ TePGRecordset rec;
+
+ string sql = "SELECT relname FROM pg_class WHERE lower(relname) = lower('" + table + "')";
+
+ if(!rec.open(sql, &tepg_connection_))
+ return false;
+
+ return (rec.recordCount() > 0);
+}
+
+bool TePostgreSQL::columnExist(const string& table, const string& column, TeAttribute& attr)
+{
+ errorMessage_ = "";
+
+ TePGRecordset rec;
+
+ string sql = "SELECT atttypid, attname, atttypmod, attlen FROM pg_class, pg_attribute ";
+ sql += "WHERE lower(pg_class.relname) = lower('" + table + "') AND ";
+ sql += " pg_class.oid = pg_attribute.attrelid AND ";
+ sql += " pg_attribute.attname = lower('" + column + "')";
+
+ if(!rec.open(sql, &tepg_connection_))
+ return false;
+
+ if(rec.recordCount() > 0)
+ {
+ attr.rep_.name_ = rec.getData("attname");
+
+ Oid nType = static_cast<Oid>(rec.getInt("atttypid"));
+ switch(nType)
+ {
+ case 16: //BOOL
+ case 20: //INT8
+ case 21: //INT2
+ case 23: //INT4
+ case 26: //OID
+ attr.rep_.type_ = TeINT;
+ attr.rep_.numChar_ = 15;
+ break;
+
+ case 700 : //float4 -> float(p)
+ case 701 : //float8 -> float(p)
+ case 790 : //money -> decimal(9, 2)
+ case 1700: //numeric -> numeric(p, s)
+ attr.rep_.type_ = TeREAL;
+ attr.rep_.numChar_ = 15;
+ break;
+
+ case 1082: //date -> date
+ case 1083: //time -> time
+ case 1114: //timestamp
+ case 1186: //interval
+ case 1266: //
+ attr.rep_.type_ = TeDATETIME;
+ attr.rep_.numChar_ = rec.getInt("attlen");
+ break;
+
+ //case 26: //OID
+ case 17: //bytea
+ attr.rep_.type_ = TeBLOB;
+ attr.rep_.numChar_ = 0;
+ break;
+ case 1042:
+ attr.rep_.type_ = TeCHARACTER;
+ attr.rep_.numChar_ = rec.getInt("atttypmod") - 4;
+
+ case 1043: //varchar(n)
+ case 25: //text
+ attr.rep_.type_ = TeSTRING;
+ attr.rep_.numChar_ = rec.getInt("atttypmod") - 4;
+ break;
+
+ default:
+ attr.rep_.type_ = TeUNKNOWN;
+ attr.rep_.numChar_ = 0;
+ break;
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+bool TePostgreSQL::createTable(const string& table, TeAttributeList &attr)
+{
+ errorMessage_ = "";
+
+ bool first = true;
+
+ TeAttributeList::iterator it = attr.begin();
+
+ string createTable ="CREATE TABLE " + table +" (";
+
+ string type;
+ char size[8];
+
+ string pkeys;
+
+ while(it != attr.end())
+ {
+ switch ((*it).rep_.type_)
+ {
+ case TeSTRING: type = "VARCHAR ";
+ sprintf (size, "(%d)", (*it).rep_.numChar_);
+ type += string(size);
+ break;
+
+ case TeREAL: type = "FLOAT8";
+ break;
+
+ case TeINT: type = ((*it).rep_.isAutoNumber_) ? "SERIAL" : "INT";
+ break;
+
+ case TeBLOB: //type = "OID";
+ type = "BYTEA";
+ break;
+
+ case TeDATETIME: type = "TIMESTAMP(0)";
+ break;
+
+ case TeCHARACTER: type = "CHAR ";
+ sprintf (size, "(%d)", (*it).rep_.numChar_);
+ type += string (size);
+ break;
+
+ default: type = "VARCHAR ";
+ sprintf (size, "(%d)", (*it).rep_.numChar_);
+ type += string (size);
+ break;
+ }
+
+ if(!first)
+ createTable += ", ";
+ else
+ first = false;
+
+ createTable += (*it).rep_.name_ + " ";
+ createTable += type;
+
+ // check if column is part of primary key
+ if((*it).rep_.isPrimaryKey_ && (*it).rep_.type_ != TeBLOB )
+ {
+ if(!pkeys.empty())
+ pkeys += ", ";
+
+ pkeys += (*it).rep_.name_;
+ }
+ else
+ createTable += " NULL ";
+
+ ++it;
+ }
+
+ if(!pkeys.empty())
+ { string pk = ", PRIMARY KEY(";
+ pk += pkeys;
+ pk += ")";
+
+ createTable += pk;
+ }
+
+
+ createTable += ");";
+
+ return execute(createTable);
+}
+
+bool TePostgreSQL::addColumn(const string& table, TeAttributeRep &rep)
+{
+ errorMessage_ = "";
+
+ string field = TeGetExtension(rep.name_.c_str());
+ if(field.empty())
+ field = rep.name_;
+
+ string new_column = "ALTER TABLE " + table + " ADD COLUMN " + field + " ";
+
+ switch(rep.type_)
+ {
+ case TeSTRING: new_column += "VARCHAR(" + Te2String(rep.numChar_) + ")";
+ break;
+ case TeREAL: new_column += "FLOAT8";
+ break;
+ case TeINT: new_column += "INTEGER";
+ break;
+ case TeBLOB: //new_column += "OID";
+ new_column += "BYTEA";
+ break;
+ default: new_column += "VARCHAR";
+ break;
+ }
+
+ return this->execute(new_column);
+}
+
+bool TePostgreSQL::createRelation(const string& relName, const string& table, const string& fieldName, const string& relatedTable, const string& relatedField, bool cascadeDeletion)
+{
+ errorMessage_ = "";
+
+ string alter = "ALTER TABLE " + table + " ADD CONSTRAINT " + relName + " ";
+ alter += "FOREIGN KEY (" + fieldName + ") ";
+ alter += "REFERENCES " + relatedTable + "(" + relatedField + ") ";
+
+ if(cascadeDeletion)
+ alter += " ON DELETE CASCADE";
+
+ return execute(alter);
+}
+
+TeDBRelationType TePostgreSQL::existRelation(const string& /*tableName*/, const string& relName)
+{
+ errorMessage_ = "";
+
+ string sql = "SELECT proname FROM pg_trigger, pg_proc WHERE tgconstrname = '" + relName + "' AND pg_trigger.tgfoid = pg_proc.oid AND pg_proc.proname LIKE 'RI_FKey_cascade_del%'";
+ TeDBRelationType resp = TeNoRelation;
+
+ TePGRecordset r(sql, &tepg_connection_);
+ if(r.recordCount() > 0)
+ resp = TeRICascadeDeletion;
+ else
+ {
+ sql = "SELECT proname FROM pg_trigger, pg_proc WHERE tgconstrname = '" + relName + "' AND pg_trigger.tgfoid = pg_proc.oid AND pg_proc.proname LIKE 'RI_FKey_check_ins%'";
+ r.open(sql, &tepg_connection_);
+ if(r.recordCount() > 0)
+ resp = TeRINoCascadeDeletion;
+ }
+
+ r.close();
+
+ return resp;
+}
+
+bool TePostgreSQL::execute(const string &sql)
+{
+ try
+ {
+ //TeWriteToFile("EXECS.SQL", sql + "\n", "aw");
+
+ this->tepg_connection_.exec_cmd(sql);
+
+
+ }
+
+ catch(...)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+TeDatabasePortal* TePostgreSQL::getPortal()
+{
+ errorMessage_ = "";
+
+ TeDatabasePortal *portal = new TePostgreSQLPortal(this);
+
+ return portal;
+}
+
+bool TePostgreSQL::createDatabaseTable()
+{
+ string create = "CREATE TABLE te_database ";
+ create += "(";
+ create += " db_version VARCHAR(50) NOT NULL,";
+ create += " db_creation TIMESTAMP NULL,";
+ create += " PRIMARY KEY (db_version)";
+ create += ")";
+
+ if(!this->execute(create))
+ {
+ errorMessage_ = "Erro na cria��o da tabela database! Message: " + string(this->tepg_connection_.err_msg());
+ return false;
+ }
+
+ return true;
+}
+
+bool TePostgreSQL::createProjectionTable()
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE te_projection ";
+ create += "(";
+ create += " projection_id SERIAL,";
+ create += " name VARCHAR(255) NOT NULL,";
+ create += " long0 FLOAT8 NOT NULL,";
+ create += " lat0 FLOAT8 NOT NULL,";
+ create += " offx FLOAT8 NOT NULL,";
+ create += " offy FLOAT8 NOT NULL,";
+ create += " stlat1 FLOAT8 NOT NULL,";
+ create += " stlat2 FLOAT8 NOT NULL,";
+ create += " unit VARCHAR(50) NOT NULL,";
+ create += " scale FLOAT8 NOT NULL,";
+ create += " hemis INTEGER NOT NULL,";
+ create += " datum VARCHAR(255) NOT NULL,";
+ create += " radius FLOAT8 NOT NULL,";
+ create += " flattening FLOAT8 NOT NULL,";
+ create += " dx FLOAT8 NOT NULL,";
+ create += " dy FLOAT8 NOT NULL,";
+ create += " dz FLOAT8 NOT NULL,";
+ create += " PRIMARY KEY (projection_id)";
+ create += ")";
+
+ return this->execute(create);
+}
+
+bool TePostgreSQL::createLayerTable()
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE te_layer ";
+ create += "(";
+ create += " layer_id SERIAL,";
+ create += " projection_id INTEGER NOT NULL,";
+ create += " name VARCHAR(255) NOT NULL,";
+ create += " lower_x FLOAT8 NULL,";
+ create += " lower_y FLOAT8 NULL,";
+ create += " upper_x FLOAT8 NULL,";
+ create += " upper_y FLOAT8 NULL,";
+ create += " initial_time TIMESTAMP(0) NULL,";
+ create += " final_time TIMESTAMP(0) NULL,";
+ create += " PRIMARY KEY (layer_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ return createIndex("te_layer", "layer_projection_idx", "projection_id");
+}
+
+bool TePostgreSQL::createRepresentationTable()
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE te_representation ";
+ create += "(";
+ create += " repres_id SERIAL,";
+ create += " layer_id INTEGER NOT NULL,";
+ create += " geom_type INTEGER NOT NULL,";
+ create += " geom_table VARCHAR(255) NOT NULL,";
+ create += " description VARCHAR(255) NULL,";
+ create += " lower_x FLOAT8 NOT NULL,";
+ create += " lower_y FLOAT8 NOT NULL,";
+ create += " upper_x FLOAT8 NOT NULL,";
+ create += " upper_y FLOAT8 NOT NULL,";
+ create += " res_x FLOAT8 NULL,";
+ create += " res_y FLOAT8 NULL,";
+ create += " num_cols INTEGER NULL ,";
+ create += " num_rows INTEGER NULL,";
+ create += " initial_time TIMESTAMP(0) NULL,";
+ create += " final_time TIMESTAMP(0) NULL,";
+ create += " PRIMARY KEY (repres_id)";
+ create += ")";
+
+ if(!execute(create))
+ return false;
+
+ return createIndex("te_representation", "repres_layer_geom_type_idx", "layer_id, geom_type");
+}
+
+bool TePostgreSQL::createViewTable()
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE te_view ";
+ create += "(";
+ create += " view_id SERIAL,";
+ create += " projection_id INTEGER NULL,";
+ create += " name VARCHAR(255) NOT NULL,";
+ create += " user_name VARCHAR(255) NULL,";
+ create += " visibility INTEGER NULL,";
+ create += " PRIMARY KEY (view_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ return createIndex("te_view", "view_index", "name, user_name");
+}
+
+bool TePostgreSQL::createThemeTable()
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE te_theme ";
+ create += "(";
+ create += " theme_id SERIAL,";
+ create += " layer_id INTEGER NULL,";
+ create += " view_id INTEGER NOT NULL,";
+ create += " name VARCHAR(255) NOT NULL,";
+ create += " parent_id INTEGER NULL,";
+ create += " priority INTEGER NULL,";
+ create += " node_type INTEGER NULL,";
+ create += " min_scale FLOAT8 NULL,";
+ create += " max_scale FLOAT8 NULL,";
+ create += " generate_attribute_where VARCHAR(500) NULL,";
+ create += " generate_spatial_where VARCHAR(500) NULL,";
+ create += " generate_temporal_where VARCHAR(255) NULL,";
+ create += " collection_table VARCHAR(255) NULL,";
+ create += " visible_rep INTEGER NULL,";
+ create += " enable_visibility INTEGER NULL,";
+ create += " PRIMARY KEY (theme_id)";
+ create += ")";
+
+ if(!execute(create))
+ return false;
+
+ if(!createIndex("te_theme", "theme_layer_idx", "layer_id"))
+ return false;
+
+ return createIndex("te_theme", "theme_view_idx", "view_id");
+}
+
+bool TePostgreSQL::createGroupingTable()
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE te_grouping ";
+ create += "(";
+ create += " theme_id INTEGER NOT NULL,";
+ create += " grouping_number INTEGER NULL,";
+ create += " grouping_attr VARCHAR(255) NULL,";
+ create += " grouping_attr_type INTEGER NULL,";
+ create += " grouping_mode INTEGER NULL,";
+ create += " grouping_norm_attr VARCHAR(255) NULL,";
+ create += " grouping_std_dev FLOAT8 DEFAULT 0.0,";
+ create += " grouping_precision INTEGER NULL,";
+ create += " grouping_function VARCHAR(50) NULL,";
+ create += " PRIMARY KEY (theme_id)";
+ create += ")";
+
+ return execute(create);
+}
+
+bool TePostgreSQL::createThemeTablesTable()
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE te_theme_table ";
+ create += "(";
+ create += " theme_table_id SERIAL,";
+ create += " theme_id INTEGER NOT NULL,";
+ create += " table_id INTEGER NOT NULL,";
+ create += " relation_id INTEGER NULL,";
+ create += " table_order INTEGER NOT NULL,";
+ create += " PRIMARY KEY (theme_table_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ //creates indexes
+ if(!createIndex("te_theme_table", "te_theme_table_theme_idx", "theme_id"))
+ return false;
+
+ if(!createIndex("te_theme_table", "te_theme_table_table_idx", "table_id"))
+ return false;
+
+ return createIndex("te_theme_table", "te_theme_table_relation_idx", "relation_id");
+}
+
+bool TePostgreSQL::createLegendTable()
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE te_legend ";
+ create += "(";
+ create += " legend_id SERIAL,";
+ create += " theme_id INT NOT NULL,";
+ create += " group_id INT NULL,";
+ create += " num_objs INT NULL,";
+ create += " lower_value VARCHAR(255) NULL,";
+ create += " upper_value VARCHAR(255) NULL,";
+ create += " label VARCHAR(255) NULL,";
+ create += " PRIMARY KEY (legend_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ return createIndex("te_legend", "te_legend_theme_idx", "theme_id");
+}
+
+bool TePostgreSQL::createVisualTable()
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE te_visual";
+ create += "(";
+ create += " legend_id INT NOT NULL,";
+ create += " geom_type INT NOT NULL,";
+ create += " lib_name VARCHAR(255) NULL,";
+ create += " symb_id INTEGER NULL,";
+ create += " red INT NULL,";
+ create += " green INT NULL,";
+ create += " blue INT NULL,";
+ create += " transparency INT NULL,";
+ create += " width INT NULL,";
+ create += " contour_lib_name VARCHAR(255) NULL,";
+ create += " contour_symb_id INTEGER NULL,";
+ create += " contour_red INT NULL,";
+ create += " contour_green INT NULL,";
+ create += " contour_blue INT NULL,";
+ create += " contour_transp INT NULL,";
+ create += " contour_width INT NULL,";
+ create += " size_value INT NULL,";
+ create += " pt_angle INT NULL,";
+ create += " family VARCHAR(255) NULL,";
+ create += " bold INT NULL,";
+ create += " italic INT NULL,";
+ create += " alignment_vert FLOAT8 NULL,";
+ create += " alignment_horiz FLOAT8 NULL,";
+ create += " tab_size INT NULL,";
+ create += " line_space INT NULL,";
+ create += " fixed_size INT NULL,";
+ create += " PRIMARY KEY (legend_id, geom_type)";
+ create += ")";
+
+ return this->execute(create);
+}
+
+bool TePostgreSQL::createVisualRasterTable()
+{
+ string create = "CREATE TABLE te_visual_raster (";
+ create += " theme_id INT NOT NULL,";
+ create += " band_in INT NOT NULL,";
+ create += " band_out INT,";
+ create += " transf_type INT,";
+ create += " param1 FLOAT8,";
+ create += " param2 FLOAT8,";
+ create += " lut_table VARCHAR(255),";
+ create += " PRIMARY KEY (theme_id, band_in))";
+
+ return execute(create);
+}
+
+bool TePostgreSQL::createLayerTableTable()
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE te_layer_table ";
+ create += "(";
+ create += " table_id SERIAL,";
+ create += " layer_id INT NULL,";
+ create += " attr_table VARCHAR(255) NOT NULL,";
+ create += " unique_id VARCHAR(255) NULL,";
+ create += " attr_link VARCHAR(255) NULL,";
+ create += " attr_initial_time VARCHAR(255) NULL,";
+ create += " attr_final_time VARCHAR(255) NULL,";
+ create += " attr_time_unit INT NULL,";
+ create += " attr_table_type INT NULL,";
+ create += " user_name VARCHAR(255) NULL,";
+ create += " initial_time TIMESTAMP(0) NULL,";
+ create += " final_time TIMESTAMP(0) NULL,";
+ create += " PRIMARY KEY (table_id)";
+ create += ")";
+
+ if(!execute(create))
+ return false;
+
+ return createIndex("te_layer_table", "te_layer_table_layer_idx", "layer_id");
+}
+
+bool TePostgreSQL::createTablesRelationTable()
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE te_tables_relation ";
+ create += "(";
+ create += " relation_id SERIAL,";
+ create += " related_table_id INTEGER NOT NULL,";
+ create += " related_attr VARCHAR(255) NOT NULL,";
+ create += " external_table_name VARCHAR(255) NOT NULL,";
+ create += " external_attr VARCHAR(255) NOT NULL,";
+ create += " PRIMARY KEY (relation_id)";
+ create += ")";
+
+ return this->execute(create);
+}
+
+bool TePostgreSQL::createPolygonGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " num_coords INTEGER NOT NULL,";
+ create += " num_holes INTEGER NOT NULL,";
+ create += " parent_id INTEGER NOT NULL,";
+ create += " lower_x FLOAT8 NOT NULL,";
+ create += " lower_y FLOAT8 NOT NULL,";
+ create += " upper_x FLOAT8 NOT NULL,";
+ create += " upper_y FLOAT8 NOT NULL,";
+ create += " ext_max FLOAT8 NOT NULL,";
+ create += " spatial_data POLYGON,";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ //creates indexes
+ if(!createIndex(tableName, tableName + "_idx_obj_id", "object_id"))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_ext_max", "ext_max"))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_box", "lower_x, lower_y, upper_x, upper_y"))
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::createLineGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " num_coords INTEGER NOT NULL,";
+ create += " lower_x FLOAT8 NOT NULL,";
+ create += " lower_y FLOAT8 NOT NULL,";
+ create += " upper_x FLOAT8 NOT NULL,";
+ create += " upper_y FLOAT8 NOT NULL,";
+ create += " ext_max FLOAT8 NOT NULL,";
+ create += " spatial_data POLYGON,";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_obj_id", "object_id"))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_ext_max", "ext_max"))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_box", "lower_x, lower_y, upper_x, upper_y"))
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::createPointGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " x FLOAT8 DEFAULT 0.0,";
+ create += " y FLOAT8 DEFAULT 0.0,";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+
+ if(!this->execute(create))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_obj_id", "object_id"))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_xy", "x, y"))
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::createCellGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " lower_x FLOAT8 NOT NULL,";
+ create += " lower_y FLOAT8 NOT NULL,";
+ create += " upper_x FLOAT8 NOT NULL,";
+ create += " upper_y FLOAT8 NOT NULL,";
+ create += " col_number INTEGER NOT NULL,";
+ create += " row_number INTEGER NOT NULL,";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_obj_id", "object_id"))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_box", "lower_x, lower_y, upper_x, upper_y"))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_rc", "row_number, col_number"))
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::createTextGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " x FLOAT8 DEFAULT 0.0,";
+ create += " y FLOAT8 DEFAULT 0.0,";
+ create += " text_value VARCHAR(255) NULL,";
+ create += " height FLOAT8 DEFAULT 0.0,";
+ create += " angle FLOAT8 DEFAULT 0.0,";
+ create += " alignment_vert FLOAT8 NULL,";
+ create += " alignment_horiz FLOAT8 NULL,";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ //creates indexes
+ if(!createIndex(tableName, tableName + "_idx_obj", "object_id"))
+ return false;
+
+ return createIndex(tableName, tableName + "_idx_xy", "x, y");
+}
+
+bool TePostgreSQL::createArcGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " from_node INT NOT NULL,";
+ create += " to_node INT NOT NULL,";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ //creates indexes
+ if(!createIndex(tableName, tableName + "obj_idx", "object_id"))
+ return false;
+
+ if(!createIndex(tableName, tableName + "fn_idx", "from_node"))
+ return false;
+
+ return createIndex(tableName, tableName + "tn_idx", "to_node");
+}
+
+bool TePostgreSQL::createNodeGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " x FLOAT8 DEFAULT 0.0,";
+ create += " y FLOAT8 DEFAULT 0.0,";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_obj_id", "object_id"))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_xy", "x, y"))
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::createRasterGeometry(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " geom_id SERIAL,";
+ create += " object_id VARCHAR(255) NULL,";
+ create += " raster_table VARCHAR(255) NULL,";
+ create += " lut_table VARCHAR(255) NULL,";
+ create += " res_x FLOAT8 DEFAULT 0.0,";
+ create += " res_y FLOAT8 DEFAULT 0.0,";
+ create += " num_bands INTEGER NULL,";
+ create += " num_cols INTEGER NULL,";
+ create += " num_rows INTEGER NULL,";
+ create += " block_height INTEGER NULL,";
+ create += " block_width INTEGER NULL,";
+ create += " lower_x FLOAT8 NOT NULL,";
+ create += " lower_y FLOAT8 NOT NULL,";
+ create += " upper_x FLOAT8 NOT NULL,";
+ create += " upper_y FLOAT8 NOT NULL,";
+ create += " tiling_type INTEGER, ";
+ create += " PRIMARY KEY (geom_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ //creates indexes
+ return createIndex(tableName, tableName + "_idx_obj", "object_id");
+}
+
+bool TePostgreSQL::createRasterMetadataTable(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName;
+ create += "(";
+ create += " geom_id INTEGER NOT NULL,";
+ create += " band_id INTEGER NOT NULL,";
+ create += " min_value FLOAT8 DEFAULT 0.0,";
+ create += " max_value FLOAT8 DEFAULT 0.0,";
+ create += " num_bits INTEGER NULL,";
+ create += " data_type INTEGER NULL,";
+ create += " photometric_type INTEGER NULL,";
+ create += " compression_type INTEGER NULL,";
+ create += " dummy FLOAT8 DEFAULT 0.0,";
+ create += " PRIMARY KEY (geom_id, band_id)";
+ create += ")";
+
+ return this->execute(create);
+}
+
+bool TePostgreSQL::createRasterTable(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " block_id VARCHAR(50) NOT NULL,";
+ create += " lower_x FLOAT8 NOT NULL,";
+ create += " lower_y FLOAT8 NOT NULL,";
+ create += " upper_x FLOAT8 NOT NULL,";
+ create += " upper_y FLOAT8 NOT NULL,";
+ create += " band_id INTEGER NOT NULL,";
+ create += " resolution_factor INTEGER NOT NULL,";
+ create += " subband INTEGER NOT NULL,";
+ //create += " spatial_data OID,";
+ create += " spatial_data BYTEA,";
+ create += " block_size INTEGER NOT NULL,";
+ create += " PRIMARY KEY (block_id)";
+ create += ")";
+
+
+ if(!execute(create))
+ return false;
+
+ //creates indexes
+ if(!createIndex(tableName, tableName + "_idx_band", "band_id"))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_subband", "subband"))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_resfactor", "resolution_factor"))
+ return false;
+
+ if(!createIndex(tableName, tableName + "_idx_box", "lower_x, lower_y, upper_x, upper_y"))
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::createCollectionTable(const string& tableName)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + tableName + " ";
+ create += "(";
+ create += " c_object_id VARCHAR(255) NOT NULL,";
+ create += " c_legend_id INT NULL,";
+ create += " label_x FLOAT8 NULL,";
+ create += " label_y FLOAT8 NULL,";
+ create += " c_legend_own INT NULL,";
+ create += " c_object_status INT NULL,";
+ create += " PRIMARY KEY (c_object_id)";
+ create += ")";
+
+ if(!this->execute(create))
+ return false;
+
+ //creates indexes
+
+ return createIndex(tableName, tableName + "_idx_legend", "c_legend_id");
+}
+
+bool TePostgreSQL::insertRelationInfo(const int tableId, const string& tField, const string& rTable, const string& rField, int& relId)
+{
+ // check if relation already exists
+ TePostgreSQLPortal* portal = (TePostgreSQLPortal*)this->getPortal();
+
+ if(!portal)
+ return false;
+
+ relId = -1;
+
+ string sel = "SELECT relation_id FROM te_tables_relation WHERE";
+ sel += " related_table_id = " + Te2String(tableId);
+ sel += " AND related_attr = '" + tField + "'";
+ sel += " AND external_table_name = '" + rTable + "'";
+ sel += " AND external_attr = '" + rField + "'";
+
+ if(!portal->query(sel))
+ {
+ delete portal;
+ return false;
+ }
+
+ if(portal->fetchRow())
+ {
+ relId = atoi(portal->getData("relation_id"));
+ delete portal;
+ return true;
+ }
+
+ delete portal;
+
+ string sql = "INSERT INTO te_tables_relation (related_table_id, related_attr, external_table_name, external_attr) VALUES(";
+ sql += Te2String(tableId);
+ sql += ", '";
+ sql += tField;
+ sql += "', '";
+ sql += rTable;
+ sql += "', '";
+ sql += rField;
+ sql += "')";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('te_tables_relation_relation_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+
+ if(rec.recordCount() > 0)
+ relId = rec.getInt(0);
+
+ rec.close();
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::insertTableInfo(int layerId, TeTable& table, const string& user)
+{
+ errorMessage_ = "";
+
+ if(table.name().empty())
+ return false;
+
+ if(table.id() <= 0)
+ {
+ string sql = "INSERT INTO te_layer_table (";
+
+ if(layerId > 0)
+ {
+ sql += "layer_id, ";
+ }
+
+ sql += "attr_table, unique_id, attr_link, attr_initial_time, attr_final_time, ";
+ sql += "attr_time_unit, attr_table_type, user_name) VALUES(";
+
+ if(layerId > 0)
+ {
+ sql += Te2String(layerId) + ", ";
+ }
+
+ sql += "'" + table.name();
+ sql += "', '" + table.uniqueName();
+ sql += "', '";
+ sql += table.linkName();
+ sql += "', '";
+ sql += table.attInitialTime();
+ sql += "', '";
+ sql += table.attFinalTime();
+ sql += "', ";
+ sql += Te2String(table.attTimeUnit());
+ sql += ", ";
+ sql += Te2String(table.tableType());
+ sql += ", '";
+ sql += user;
+ sql += "')";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('te_layer_table_table_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+
+ if(rec.recordCount() > 0)
+ table.setId(rec.getInt(0));
+
+ rec.close();
+ }
+ else
+ return false;
+ }
+
+ return true;
+}
+
+bool TePostgreSQL::insertTable(TeTable &table)
+{
+ string tableName = table.name();
+ TeAttributeList att = table.attributeList();
+ TeAttributeList::iterator it = att.begin();
+
+ TeTableRow row;
+ unsigned int i;
+ unsigned int j;
+ for ( i = 0; i < table.size(); i++ )
+ {
+ row = table[i];
+ it = att.begin();
+ string q = "INSERT INTO "+tableName+" values(";
+ j = 1;
+ int jj = 0;
+ string dt = "";
+ while ( it != att.end() )
+ {
+ if(((*it).rep_.type_==TeDATETIME) && (!row[jj].empty()))
+ {
+ const string temp_dt = string(row[jj].c_str());
+ TeTime t(temp_dt, (*it).dateChronon_, (*it).dateTimeFormat_, (*it).dateSeparator_, (*it).timeSeparator_, (*it).indicatorPM_);
+ dt=t.getDateTime("YYYYsMMsDDsHHsmmsSS", "-");
+ }
+
+ switch ((*it).rep_.type_)
+ {
+ case TeSTRING:
+ q += "'"+this->escapeSequence(row[jj])+"'";
+ break;
+ case TeREAL:
+ q += "'"+row[jj]+"'";
+ break;
+ case TeINT:
+ q += "'"+row[jj]+"'";
+ break;
+ case TeDATETIME:
+ q += "'"+dt+"'";
+ break;
+ default:
+ q += "'"+this->escapeSequence(row[jj])+"'";
+ break;
+ }
+ if (j<att.size())
+ q+= ",";
+ ++it;
+ j++;
+ jj++;
+ }
+ q += ")";
+ if (!this->execute(q))
+// return false;
+ continue;
+ }
+ return true;
+}
+
+bool TePostgreSQL::alterTable(const string& tableName, TeAttributeRep& rep, const string& oldColName)
+{
+ if(!tableExist(tableName))
+ return false;
+
+ string tab;
+
+ if(!oldColName.empty())
+ {
+ tab = " ALTER TABLE " + tableName + " RENAME COLUMN ";
+ tab += oldColName + " TO " + rep.name_;
+ }
+ else
+ {
+ tab = " ALTER TABLE " + tableName + " ALTER COLUMN ";
+ tab += rep.name_ + " TYPE ";
+
+ switch (rep.type_)
+ {
+ case TeSTRING:
+ tab += "VARCHAR(" + Te2String(rep.numChar_) + ") ";
+ break;
+
+ case TeREAL:
+ tab += "FLOAT8";
+ break;
+
+ case TeINT:
+ tab += "INTEGER";
+ break;
+
+ case TeDATETIME:
+ tab += "TIMESTAMP(0)";
+ break;
+
+ case TeCHARACTER:
+ tab += "CHAR";
+ break;
+
+ case TeBLOB:
+ tab += "BYTEA";
+ break;
+
+ default:
+ tab += "VARCHAR(" + Te2String(rep.numChar_) + ") ";
+ break;
+ }
+ }
+
+
+
+ if(!execute(tab))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error alter table " + tableName + " !";
+
+ return false;
+ }
+
+ string tableId;
+ TeDatabasePortal* portal = getPortal();
+ string sql = "SELECT table_id FROM te_layer_table WHERE attr_table = '" + tableName + "'";
+ if(portal->query(sql) && portal->fetchRow())
+ tableId = portal->getData(0);
+
+ delete portal;
+
+ if(tableId.empty() == false)
+ {
+ if(oldColName.empty() == false) // column name changed
+ {
+ // update relation
+ sql = "UPDATE te_tables_relation SET related_attr = '" + rep.name_ + "'";
+ sql += " WHERE related_table_id = " + tableId;
+ sql += " AND related_attr = '" + oldColName + "'";
+ if(execute(sql) == false)
+ return false;
+
+ sql = "UPDATE te_tables_relation SET external_attr = '" + rep.name_ + "'";
+ sql += " WHERE external_table_name = '" + tableName + "'";
+ sql += " AND external_attr = '" + oldColName + "'";
+ if(execute(sql) == false)
+ return false;
+
+ // update grouping
+ sql = "UPDATE te_grouping SET grouping_attr = '" + tableName + "." + rep.name_ + "'";
+ sql += " WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
+ if(execute(sql) == false)
+ return false;
+ }
+ else // column type changed
+ {
+ // delete relation
+ sql = "DELETE FROM te_tables_relation WHERE (related_table_id = " + tableId;
+ sql += " AND related_attr = '" + rep.name_ + "')";
+ sql += " OR (external_table_name = '" + tableName + "'";
+ sql += " AND external_attr = '" + rep.name_ + "')";
+ if(execute(sql) == false)
+ return false;
+
+ // delete grouping
+ TeDatabasePortal* portal = getPortal();
+ sql = "SELECT theme_id FROM te_grouping WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
+ if(portal->query(sql) && portal->fetchRow())
+ {
+ string themeId = portal->getData(0);
+
+ sql = "DELETE FROM te_legend WHERE theme_id = " + themeId + " AND group_id >= 0";
+ if(execute(sql) == false)
+ {
+ delete portal;
+ return false;
+ }
+ }
+ delete portal;
+
+ sql = "DELETE FROM te_grouping";
+ sql += " WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
+ if(execute(sql) == false)
+ return false;
+ }
+ }
+ return true;
+}
+
+
+
+bool TePostgreSQL::insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size)
+{
+ errorMessage_ = "";
+
+ TePostgreSQLPortal* portal = static_cast<TePostgreSQLPortal*>(this->getPortal());
+
+ if(!portal)
+ return false;
+
+ string q = "SELECT * FROM "+ tableName +" WHERE "+ columnId.name_ +" = ";
+
+ switch(columnId.type_ )
+ {
+ case TeSTRING:
+ q += "'"+ valueId + "'";
+ break;
+ default:
+ q += valueId;
+ break;
+ }
+
+ if((!portal->query(q)) || (!portal->fetchRow()))
+ {
+ delete portal;
+ return false;
+ }
+
+// int exist = portal->getInt(columnBlob);
+
+ delete portal;
+
+ size_t newLen = 0;
+
+ unsigned char* newbuf = TePGConnection::escapeBytea(data, size, &newLen);
+
+ string sql = "UPDATE ";
+ sql += tableName;
+ sql += " SET ";
+ sql += columnBlob;
+ sql += " = '";
+ sql += (char*)newbuf;
+ sql += "' WHERE ";
+ sql += columnId.name_;
+ sql += " = ";
+
+ switch (columnId.type_ )
+ {
+ case TeSTRING: sql += "'"+ valueId + "'";
+ break;
+
+ default: sql += valueId;
+ }
+
+ if(!execute(sql))
+ {
+ TePGConnection::freeMem(newbuf);
+
+ errorMessage_ = "Couldn't update blob!";
+
+ return false;
+ }
+
+ TePGConnection::freeMem(newbuf);
+
+ return true;
+}
+
+bool TePostgreSQL::insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName)
+{
+ unsigned char *cdata = 0;
+ int size;
+ FILE *fp = 0;
+
+ struct stat buf;
+ int result;
+
+ result = stat(fileName.c_str(), &buf);
+
+ if(result != 0)
+ return false;
+
+ size = buf.st_size;
+
+ cdata = new unsigned char[size];
+ fp = fopen(fileName.c_str(), "rb");
+ fread(cdata, sizeof(unsigned char), size, fp);
+
+ bool status = insertBlob(tableName, columnBlob, columnId, valueId, cdata, size);
+
+ if(fp)
+ fclose(fp);
+
+ if(cdata)
+ delete [] cdata;
+
+ return status;
+}
+
+bool TePostgreSQL::insertProjection(TeProjection *proj)
+{
+ errorMessage_ = "";
+
+ TeProjectionParams par = proj->params();
+
+ string sql = "INSERT INTO te_projection (name, long0, lat0, offx, ";
+ sql += "offy, stlat1, stlat2, unit, scale, ";
+ sql += "hemis, datum, radius, flattening, ";
+ sql += "dx, dy, dz) VALUES('";
+ sql += proj->name();
+ sql += "', ";
+ sql += Te2String(par.lon0*TeCRD);
+ sql += ", ";
+ sql += Te2String(par.lat0*TeCRD);
+ sql += ", ";
+ sql += Te2String(par.offx);
+ sql += ", ";
+ sql += Te2String(par.offy);
+ sql += ", ";
+ sql += Te2String(par.stlat1*TeCRD);
+ sql += ", ";
+ sql += Te2String(par.stlat2*TeCRD);
+ sql += ", '";
+ sql += par.units;
+ sql += "', ";
+ sql += Te2String(par.scale);
+ sql += ", ";
+ sql += Te2String(par.hemisphere);
+ sql += ", '";
+ sql += proj->datum().name();
+ sql += "', ";
+ sql += Te2String(proj->datum().radius());
+ sql += ", ";
+ sql += Te2String(proj->datum().flattening());
+ sql += ", ";
+ sql += Te2String(proj->datum().xShift());
+ sql += ", ";
+ sql += Te2String(proj->datum().yShift());
+ sql += ", ";
+ sql += Te2String(proj->datum().zShift());
+ sql += ")";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('te_projection_projection_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ proj->id(rec.getInt(0));
+
+ rec.close();
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::insertLayer(TeLayer *layer)
+{
+ errorMessage_ = "";
+
+ TeProjection* proj = layer->projection();
+ if (!proj || !insertProjection(proj))
+ {
+ errorMessage_ = "N�o � poss�vel inserir layer sem proje��o";
+ return false;
+ }
+
+ string sql = "INSERT INTO te_layer (projection_id, name, lower_x, lower_y, upper_x, ";
+ sql += "upper_y) VALUES(";
+ sql += Te2String(proj->id());
+ sql += ", '";
+ sql += layer->name();
+ sql += "', ";
+ sql += Te2String(layer->box().x1());
+ sql += ", ";
+ sql += Te2String(layer->box().y1());
+ sql += ", ";
+ sql += Te2String(layer->box().x2());
+ sql += ", ";
+ sql += Te2String(layer->box().y2());
+ sql += ")";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('te_layer_layer_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ {
+ layer->id(rec.getInt(0));
+ }
+ rec.close();
+ }
+ else
+ return false;
+
+ layerMap_[layer->id()] = layer;
+
+ return true;
+}
+
+bool TePostgreSQL::insertRepresentation(int layerId, TeRepresentation& rep)
+{
+ errorMessage_ = "";
+
+ if(layerId <= 0)
+ return false;
+
+
+ string sql = "INSERT INTO te_representation (layer_id, geom_type, geom_table, description, lower_x, ";
+ sql += "lower_y, upper_x, upper_y, res_x, res_y, num_cols, num_rows) VALUES(";
+ sql += Te2String(layerId);
+ sql += ", ";
+ sql += Te2String(static_cast<long>(rep.geomRep_));
+ sql += ", '";
+ sql += rep.tableName_;
+ sql += "', '";
+ sql += rep.description_;
+ sql += "', ";
+ sql += Te2String(rep.box_.x1());
+ sql += ", ";
+ sql += Te2String(rep.box_.y1());
+ sql += ", ";
+ sql += Te2String(rep.box_.x2());
+ sql += ", ";
+ sql += Te2String(rep.box_.y2());
+ sql += ", ";
+ sql += Te2String(rep.resX_);
+ sql += ", ";
+ sql += Te2String(rep.resY_);
+ sql += ", ";
+ sql += Te2String(static_cast<long>(rep.nCols_));
+ sql += ", ";
+ sql += Te2String(static_cast<long>(rep.nLins_));
+ sql += ")";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('te_representation_repres_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ rep.id_ = rec.getInt(0);
+
+ rec.close();
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::insertView(TeView *view)
+{
+ errorMessage_ = "";
+
+ // save it�s projection
+ TeProjection* proj = view->projection();
+ if ( !proj || !insertProjection(proj))
+ {
+ errorMessage_ = "N�o � poss�vel inserir vista sem proje��o";
+ return false;
+ }
+
+ string sql = "INSERT INTO te_view (projection_id, name, user_name, visibility) VALUES(";
+ sql += Te2String(proj->id());
+ sql += ", '";
+ sql += view->name();
+ sql += "', '";
+ sql += view->user();
+ sql += "', ";
+ sql += Te2String(view->isVisible());
+ sql += ")";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('te_view_view_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ {
+ view->id(rec.getInt(0));
+ }
+ rec.close();
+ }
+ else
+ return false;
+
+ for(unsigned int th = 0; th < view->size(); ++th)
+ {
+ TeViewNode* node = view->get (th);
+ if (node->type() == TeTHEME)
+ {
+ TeTheme *theme = (TeTheme*) node;
+ insertTheme (theme);
+ }
+ else
+ {
+ TeViewTree* tree = (TeViewTree*)node;
+ insertViewTree (tree);
+ }
+ }
+
+ viewMap_[view->id()] = view;
+
+ return true;
+}
+
+bool TePostgreSQL::insertViewTree(TeViewTree *tree)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO te_theme (view_id, name, parent_id, priority, node_type) VALUES(";
+
+ sql += Te2String(tree->view());
+ sql += ", '";
+ sql += tree->name();
+ sql += "', ";
+ sql += Te2String(tree->parentId());
+ sql += ", ";
+ sql += Te2String(tree->priority());
+ sql += ", ";
+ sql += Te2String(tree->type());
+ sql += ", ";
+
+ sql += ")";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('te_theme_theme_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ tree->id(rec.getInt(0));
+
+ rec.close();
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::insertThemeGroup(TeViewTree* tree)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO te_theme (layer_id, view_id, name, parent_id, priority, node_type) VALUES(";
+ sql += "1";
+ sql += ", ";
+ sql += Te2String(tree->view());
+ sql += ", '";
+ sql += tree->name();
+ sql += "', ";
+ sql += Te2String(tree->parentId());
+ sql += ", ";
+ sql += Te2String(tree->priority());
+ sql += ", ";
+ sql += "1";
+ sql += ", ";
+
+ sql += ")";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('te_theme_theme_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ tree->id(rec.getInt(0));
+
+ rec.close();
+ }
+ else
+ return false;
+
+ return true;
+
+}
+
+bool TePostgreSQL::insertTheme(TeTheme *theme)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO te_theme (layer_id, view_id, name, parent_id, priority, node_type, ";
+ sql += "min_scale, max_scale, generate_attribute_where, generate_spatial_where, ";
+ sql += "generate_temporal_where, collection_table, visible_rep, enable_visibility) VALUES(";
+ sql += Te2String(theme->layerId());
+ sql += ", ";
+ sql += Te2String(theme->view());
+ sql += ", '";
+ sql += theme->name();
+ sql += "', ";
+ sql += Te2String(theme->parentId());
+ sql += ", ";
+ sql += Te2String(theme->priority());
+ sql += ", ";
+ sql += Te2String(theme->type());
+ sql += ", ";
+ sql += Te2String(theme->minScale());
+ sql += ", ";
+ sql += Te2String(theme->maxScale());
+ sql += ", '";
+ sql += escapeSequence(theme->attributeRest());
+ sql += "', '";
+ sql += escapeSequence(theme->spatialRest());
+ sql += "', '";
+ sql += escapeSequence(theme->temporalRest());
+ sql += "', '";
+ sql += theme->collectionTable();
+ sql += "', ";
+ sql += Te2String(theme->visibleRep());
+ sql += ", ";
+ sql += Te2String(theme->visibility());
+ sql += " )";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('te_theme_theme_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ {
+ theme->id(rec.getInt(0));
+ }
+ rec.close();
+ }
+ else
+ return false;
+
+
+ if(theme->collectionTable().empty())
+ {
+ sql = "UPDATE te_theme SET collection_table = '";
+ sql += "te_collection_";
+ sql += Te2String(theme->id());
+ sql += "' WHERE theme_id = ";
+ sql += Te2String(theme->id());
+
+ theme->collectionTable(string("te_collection_") + Te2String(theme->id()));
+
+ if(!this->execute(sql))
+ return false;
+ }
+
+
+ bool status;
+
+ // insert grouping
+ int numSlices = 0;
+ if(theme->grouping())
+ {
+ if(!insertGrouping (theme->id(), theme->grouping()))
+ return false;
+ numSlices = theme->grouping()->groupNumSlices_;
+ }
+
+ // insert legend
+ theme->outOfCollectionLegend().group(-1);
+ theme->outOfCollectionLegend().theme(theme->id());
+ status = insertLegend (&(theme->outOfCollectionLegend()));
+ if (!status)
+ return status;
+
+ theme->withoutDataConnectionLegend().group(-2);
+ theme->withoutDataConnectionLegend().theme(theme->id());
+ status = insertLegend (&(theme->withoutDataConnectionLegend()));
+ if (!status)
+ return status;
+
+ theme->defaultLegend().group(-3);
+ theme->defaultLegend().theme(theme->id());
+ status = insertLegend (&(theme->defaultLegend()));
+ if (!status)
+ return status;
+
+ theme->pointingLegend().group(-4);
+ theme->pointingLegend().theme(theme->id());
+ status = insertLegend (&(theme->pointingLegend()));
+ if (!status)
+ return status;
+
+ theme->queryLegend().group(-5);
+ theme->queryLegend().theme(theme->id());
+ status = insertLegend (&(theme->queryLegend()));
+ if (!status)
+ return status;
+
+ theme->queryAndPointingLegend().group(-6);
+ theme->queryAndPointingLegend().theme(theme->id());
+ status = insertLegend (&(theme->queryAndPointingLegend()));
+ if (!status)
+ return status;
+
+ for (int i = 0; i < numSlices; i++)
+ {
+ theme->legend()[i].group(i);
+ theme->legend()[i].theme(theme->id());
+ status = insertLegend (&(theme->legend()[i]));
+ if (!status)
+ return status;
+ }
+ if (!status)
+ return status;
+
+ themeMap_[theme->id()] = theme;
+ return updateThemeTable(theme);
+}
+
+bool TePostgreSQL::insertThemeTable(int themeId, int tableId, int relationId, int tableOrder)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO te_theme_table (theme_id, table_id, ";
+
+ if(relationId > 0)
+ sql += "relation_id, ";
+
+ sql += "table_order) VALUES(";
+ sql += Te2String(themeId);
+ sql += ", ";
+ sql += Te2String(tableId);
+ sql += ", ";
+
+ if(relationId > 0)
+ {
+ sql += Te2String(relationId);
+ sql += ", ";
+ }
+
+ sql += Te2String(tableOrder);
+ sql += ")";
+
+ if(this->execute(sql))
+ {
+ //sql = "SELECT currval('te_theme_table_theme_table_id_seq')";
+ //TePGRecordset rec;
+ //rec.open(sql, &tepg_connection_);
+ //if(rec.recordCount() > 0)
+ //{
+ // tree->id(atoi(rec.value(0)));
+ //}
+ //rec.close();
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::generateLabelPositions(TeTheme *theme)
+{
+ string geomTable, upd;
+ string collTable = theme->collectionTable();
+
+ if((collTable.empty()) || (!tableExist(collTable)))
+ return false;
+
+ if(theme->layer()->hasGeometry(TeCELLS) ||
+ theme->layer()->hasGeometry(TePOLYGONS) ||
+ theme->layer()->hasGeometry(TeLINES))
+ {
+ geomTable = theme->layer()->tableName(TeCELLS);
+
+ if(geomTable.empty())
+ {
+ geomTable = theme->layer()->tableName(TePOLYGONS);
+ if(geomTable.empty())
+ {
+ geomTable = theme->layer()->tableName(TeLINES);
+
+ if(geomTable.empty())
+ geomTable = theme->layer()->tableName(TePOINTS);
+ }
+ }
+
+ upd = " UPDATE " + collTable + " SET ";
+ upd += " label_x = (SELECT MAX(lower_x + (upper_x";
+ upd += " - lower_x) / 2.0) ";
+ upd += "FROM " + geomTable + " WHERE object_id = c_object_id), ";
+
+ upd += " label_y = (SELECT MAX(lower_y + (upper_y";
+ upd += " - lower_y) / 2.0) ";
+ upd += "FROM " + geomTable + " WHERE object_id = c_object_id) ";
+
+ upd += " WHERE (label_x IS NULL) OR (label_y IS NULL)";
+ }
+ else
+ if(theme->layer()->hasGeometry(TePOINTS))
+ {
+ geomTable = theme->layer()->tableName(TePOINTS);
+
+ upd = " UPDATE " + collTable + " SET ";
+ upd += " label_x = (SELECT MAX(x)";
+ upd += " FROM " + geomTable + " WHERE object_id = c_object_id), ";
+
+ upd += " label_y = (SELECT MAX(y)";
+ upd += " FROM " + geomTable + " WHERE object_id = c_object_id) ";
+
+ upd += " WHERE (label_x IS NULL) OR (label_y IS NULL)";
+ }
+
+ return execute(upd);
+}
+
+bool TePostgreSQL::insertLegend(TeLegendEntry *legend)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO te_legend (theme_id, group_id, num_objs, lower_value, upper_value, ";
+ sql += "label) VALUES(";
+ sql += Te2String(legend->theme());
+ sql += ", ";
+ sql += Te2String(legend->group());
+ sql += ", ";
+ sql += Te2String(legend->count());
+ sql += ", '";
+ sql += legend->from();
+ sql += "', '";
+ sql += legend->to();
+ sql += "', '";
+ sql += legend->label();
+ sql += "')";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('te_legend_legend_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ {
+ legend->id(rec.getInt(0));
+ }
+ rec.close();
+ }
+ else
+ return false;
+
+ legendMap_[legend->id()] = legend;
+
+ return insertVisual(legend);
+}
+
+bool TePostgreSQL::insertPolygon(const string& table, TePolygon &p)
+{
+ errorMessage_ = "";
+
+ //TeRemoveDuplicatedCoordinates(p);
+
+ int parentId = 0;
+
+ for(unsigned int k = 0u; k < p.size(); ++k)
+ {
+ TeLinearRing ring = p[k];
+
+ TeBox b = ring.box();
+
+ unsigned int ringSize = ring.size();
+
+ double extMax = MAX(b.width(), b.height());
+
+ unsigned int numberOfHoles = 0u;
+
+ if(k == 0u)
+ numberOfHoles = p.size() - 1u;
+
+ string strPol = "";
+
+ Te2PgGeomPolygon(ring, strPol);
+
+ string sql = "INSERT INTO ";
+ sql += table;
+ sql += " (object_id, num_coords, num_holes, parent_id, lower_x, lower_y, upper_x, upper_y, ext_max, spatial_data) VALUES ('";
+ sql += p.objectId();
+ sql += "', ";
+ sql += Te2String(ringSize);
+ sql += ", ";
+ sql += Te2String(numberOfHoles);
+ sql += ", ";
+ sql += Te2String(parentId);
+ sql += ", ";
+ sql += Te2String(b.lowerLeft().x());
+ sql += ", ";
+ sql += Te2String(b.lowerLeft().y());
+ sql += ", ";
+ sql += Te2String(b.upperRight().x());
+ sql += ", ";
+ sql += Te2String(b.upperRight().y());
+ sql += ", ";
+ sql += Te2String(extMax);
+ sql += ", '";
+ sql += strPol;
+ sql += "')";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('" + table + "_geom_id_seq')";
+
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+
+ if(rec.recordCount() > 0)
+ ring.geomId(rec.getInt(0));
+
+ if(k == 0u)
+ {
+ parentId = ring.geomId();
+
+ string newSQL = "UPDATE " + table + " SET parent_id = ";
+ newSQL += Te2String(parentId);
+ newSQL += " WHERE geom_id = ";
+ newSQL += Te2String(parentId);
+
+ if(!this->execute(newSQL))
+ return false;
+ }
+
+ rec.close();
+ }
+ else
+ return false;
+ }
+
+ return true;
+}
+
+bool TePostgreSQL::updatePolygon(const string& table, TePolygon &p)
+{
+ errorMessage_ = "";
+
+ //TeRemoveDuplicatedCoordinates(p);
+
+ int parentId = 0;
+
+ for(unsigned int k = 0u; k < p.size(); ++k)
+ {
+ TeLinearRing ring = p[k];
+
+ TeBox b = ring.box();
+
+ unsigned int ringSize = ring.size();
+
+ double extMax = MAX(b.width(), b.height());
+
+ unsigned int numberOfHoles = 0u;
+
+ if(k == 0u)
+ numberOfHoles = p.size() - 1u;
+
+ string strPol = "";
+
+ Te2PgGeomPolygon(ring, strPol);
+
+ string sql = "UPDATE " + table + " SET object_id = '";
+ sql += p.objectId();
+ sql += "', num_coords = ";
+ sql += Te2String(ringSize);
+ sql += ", num_holes = ";
+ sql += Te2String(numberOfHoles);
+ sql += ", parent_id = ";
+ sql += Te2String(parentId);
+ sql += ", lower_x = ";
+ sql += Te2String(b.x1_);
+ sql += ", lower_y = ";
+ sql += Te2String(b.y1_);
+ sql += ", upper_x = ";
+ sql += Te2String(b.x2_);
+ sql += ", upper_y = ";
+ sql += Te2String(b.y2_);
+ sql += ", ext_max = ";
+ sql += Te2String(extMax);
+ sql += ", spatial_data = '";
+ sql += strPol;
+ sql += "' WHERE geom_id = ";
+ sql += Te2String(ring.geomId());
+
+ if(!this->execute(sql))
+ return false;
+ }
+
+ return true;
+}
+
+bool TePostgreSQL::insertLine(const string& table, TeLine2D& l)
+{
+ errorMessage_ = "";
+
+ //TeRemoveDuplicatedCoordinates(l);
+
+ string strLine = "";
+
+ Te2PgGeomPolygon(l, strLine);
+
+ double extMax = MAX(l.box().width(), l.box().height());
+
+ string sql = "INSERT INTO " + table + " (object_id, num_coords, lower_x, lower_y, upper_x, upper_y, ext_max, spatial_data) ";
+ sql += "VALUES('";
+ sql += l.objectId();
+ sql += "', ";
+ sql += Te2String(l.size());
+ sql += ", ";
+ sql += Te2String(l.box().x1_);
+ sql += ", ";
+ sql += Te2String(l.box().y1_);
+ sql += ", ";
+ sql += Te2String(l.box().x2_);
+ sql += ", ";
+ sql += Te2String(l.box().y2_);
+ sql += ", ";
+ sql += Te2String(extMax);
+ sql += ", '";
+ sql += strLine;
+ sql += "')";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('" + table + "_geom_id_seq')";
+
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+
+ if(rec.recordCount() > 0)
+ l.geomId(rec.getInt(0));
+
+ rec.close();
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::updateLine(const string& table, TeLine2D& l)
+{
+ errorMessage_ = "";
+
+ //TeRemoveDuplicatedCoordinates(l);
+
+ string strLine = "";
+
+ Te2PgGeomPolygon(l, strLine);
+
+ double extMax = MAX(l.box().width(), l.box().height());
+
+ string sql = "UPDATE " + table + " SET object_id = '";
+ sql += l.objectId();
+ sql += "', num_coords = ";
+ sql += Te2String(l.size());
+ sql += ", lower_x = ";
+ sql += Te2String(l.box().x1_);
+ sql += ", lower_y = ";
+ sql += Te2String(l.box().y1_);
+ sql += ", upper_x = ";
+ sql += Te2String(l.box().x2_);
+ sql += ", upper_y = ";
+ sql += Te2String(l.box().y2_);
+ sql += ", ext_max = ";
+ sql += Te2String(extMax);
+ sql += ", '";
+ sql += strLine;
+ sql += "' WHERE geom_id = ";
+ sql += Te2String(l.geomId());
+
+ return this->execute(sql);
+}
+
+bool TePostgreSQL::insertPoint(const string& table, TePoint &p)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO " + table + " (object_id, x, y) VALUES('";
+ sql += p.objectId();
+ sql += "', ";
+ sql += Te2String(p.location().x_);
+ sql += ", ";
+ sql += Te2String(p.location().y_);
+ sql += ")";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('" + table + "_geom_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ p.geomId(rec.getInt(0));
+
+ rec.close();
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::insertText(const string& table, TeText& t)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO " + table + " (object_id, x, y, text_value, angle, height, alignment_vert, alignment_horiz) VALUES('";
+ sql += t.objectId();
+ sql += "', ";
+ sql += Te2String(t.location().x());
+ sql += ", ";
+ sql += Te2String(t.location().y());
+ sql += ", '";
+ sql += escapeSequence(t.textValue());
+ sql += "', ";
+ sql += Te2String(t.angle());
+ sql += ", ";
+ sql += Te2String(t.height());
+ sql += ", ";
+ sql += Te2String(t.alignmentVert());
+ sql += ", ";
+ sql += Te2String(t.alignmentHoriz());
+ sql += ")";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('" + table + "_geom_id_seq')";
+
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ t.geomId(rec.getInt(0));
+
+ rec.close();
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool TePostgreSQL::insertArc(const string& table, TeArc& arc)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO " + table + " (object_id, from_node, to_node) VALUES('";
+ sql += arc.objectId();
+ sql += "', ";
+ sql += Te2String(arc.fromNode().geomId());
+ sql += ", ";
+ sql += Te2String(arc.toNode().geomId());
+ sql += ")";
+
+ if(this->execute(sql))
+ {
+ sql = "SELECT currval('" + table + "_geom_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ arc.geomId(rec.getInt(0));
+
+ rec.close();
+ }
+ else
+ return false;
+
+
+ return true;
+}
+
+bool TePostgreSQL::insertNode(const string& table, TeNode& node)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO " + table + " (object_id, x, y) VALUES('";
+ sql += node.objectId();
+ sql += "', ";
+ sql += Te2String(node.location().x_);
+ sql += ", ";
+ sql += Te2String(node.location().y_);
+ sql += ")";
+
+ if(!this->execute(sql))
+ return false;
+
+ sql = "SELECT currval('" + table + "_geom_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ node.geomId(rec.getInt(0));
+
+ rec.close();
+
+ return true;
+}
+
+bool TePostgreSQL::insertCell(const string& table, TeCell &c)
+{
+ errorMessage_ = "";
+
+ string sql = "INSERT INTO " + table + " (object_id, lower_x, lower_y, upper_x, upper_y, col_number, row_number) VALUES('";
+ sql += c.objectId();
+ sql += "', ";
+ sql += Te2String(c.box().x1_);
+ sql += ", ";
+ sql += Te2String(c.box().y1_);
+ sql += ", ";
+ sql += Te2String(c.box().x2_);
+ sql += ", ";
+ sql += Te2String(c.box().y2_);
+ sql += ", ";
+ sql += Te2String(c.column());
+ sql += ", ";
+ sql += Te2String(c.line());
+ sql += ")";
+
+ if(!this->execute(sql))
+ return false;
+
+ sql = "SELECT currval('" + table + "_geom_id_seq')";
+ TePGRecordset rec;
+ rec.open(sql, &tepg_connection_);
+ if(rec.recordCount() > 0)
+ c.geomId(rec.getInt(0));
+
+ rec.close();
+
+ return true;
+}
+
+bool TePostgreSQL::insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, unsigned char* buf, unsigned long size, int band, unsigned int res, unsigned int subband)
+{
+ errorMessage_ = "";
+
+ if (blockId.empty())
+ {
+ errorMessage_ = "No block identifier provided!";
+ return false;
+ }
+
+ TePostgreSQLPortal* portal = static_cast<TePostgreSQLPortal*>(this->getPortal());
+ if(!portal)
+ return false;
+
+ bool update = false;
+ string q ="SELECT * FROM " + table;
+ q += " WHERE block_id='" + blockId + "'";
+
+ if (!portal->query(q))
+ {
+ delete portal;
+ return false;
+ }
+
+ // check if this block is alread in the database
+ if(portal->fetchRow())
+ update = true;
+
+ delete portal;
+
+
+ string sql = "";
+
+ size_t newLen = 0;
+
+ unsigned char* newbuf = TePGConnection::escapeBytea(buf, size, &newLen);
+
+ if(!update)
+ getInsertRasterBlock(table, blockId, ll, ur, band, res, subband, (char*)newbuf, size, sql);
+ else
+ getUpdateRasterBlock(table, blockId, ll, ur, band, res, subband, (char*)newbuf, size, sql);
+
+
+ if(!execute(sql))
+ {
+ TePGConnection::freeMem(newbuf);
+ errorMessage_ = "Couldn't insert/update a rasterblock!";
+ return false;
+ }
+
+ TePGConnection::freeMem(newbuf);
+
+ return true;
+}
+
+bool TePostgreSQL::createLUTTable(const string& name)
+{
+ errorMessage_ = "";
+
+ string create = "CREATE TABLE " + name + "(";
+ create += "index_id SERIAL,";
+ create += "r_val INTEGER NOT NULL,";
+ create += "g_val INTEGER NOT NULL,";
+ create += "b_val INTEGER NOT NULL,";
+ create += "PRIMARY KEY (index_id))";
+
+ return execute(create);
+}
+
+string TePostgreSQL::getSQLStatistics(TeGroupingAttr& attrs)
+{
+ string sql = "";
+ string virg = "";
+
+ TeGroupingAttr::iterator it = attrs.begin();
+ int count = 0;
+ while(it != attrs.end())
+ {
+ if(count > 0)
+ virg = ",";
+
+ string strAux = (*it).first.name_;
+ size_t pos = strAux.find(".");
+ if(pos != string::npos)
+ strAux[pos] = '_';
+
+ switch((*it).second)
+ {
+ case TeSUM:
+ sql += virg +" SUM( "+ (*it).first.name_ +") AS SUM_"+ strAux;
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeMAXVALUE:
+ sql += virg +" MAX( "+ (*it).first.name_ +") AS MAX_"+ strAux;
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeMINVALUE:
+ sql += virg +" MIN( "+ (*it).first.name_ +") AS MIN_"+ strAux;
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeCOUNT:
+ sql += virg +" COUNT( "+ (*it).first.name_ +") AS COUNT_"+ strAux;
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeMEAN:
+ sql += virg +" AVG( "+ (*it).first.name_ +") AS AVG_"+ strAux;
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeSTANDARDDEVIATION:
+ sql += virg +" STDDEV( "+ (*it).first.name_ +") AS STDDEV_"+ strAux;
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeVARIANCE:
+ sql += virg +" VARIANCE( "+ (*it).first.name_ +") AS VAR_"+ strAux;
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ default:
+ break;
+ }
+ ++it;
+
+ }
+
+ return sql;
+}
+
+string TePostgreSQL::getSQLTemporalWhere(TeTimeInterval& timeInterval, TeTemporalRelation timeOperator, const string& initialTime, const string& finalTime)
+{
+ string sql;
+
+ string t1 = timeInterval.getInitialDateTime("YYYYsMMsDDsHHsmmsSS");
+ string t2 = timeInterval.getFinalDateTime ("YYYYsMMsDDsHHsmmsSS");
+
+ switch(timeOperator)
+ {
+ case TeTIMEBEFORE: sql = finalTime +" < '"+ t1 +"'";
+ break;
+
+ case TeTIMEAFTER: sql = initialTime +" > '"+ t2 +"'";
+ break;
+
+ case TeTIMEEQUAL: sql = "("+ initialTime +" >= '"+ t1 +"'";
+ sql += " AND "+ initialTime +" <= '"+ t2 +"')";
+ sql += " AND ";
+ sql += "("+ finalTime +" >= '"+ t1 +"'";
+ sql += " AND "+ finalTime +" <= '"+ t2 +"')";
+ break;
+
+ case TeTIMEMEETS: sql = finalTime +" = '"+ t1 +"'";
+ sql += " OR "+ initialTime +" = '"+ t2 +"'";
+ break;
+
+ case TeTIMEDURING: sql = initialTime +" > '"+ t1 +"'";
+ sql += " AND "+ initialTime +" < '"+ t2 +"'";
+ sql += " AND "+ finalTime +" > '"+ t1 +"'";
+ sql += " AND "+ finalTime +" < '"+ t2 +"'";
+ break;
+
+ case TeTIMEOVERLAPS: sql = "("+ initialTime +" < '"+ t1 +"'";
+ sql += " AND "+ finalTime +" > '"+ t1 +"'";
+ sql += " AND "+ finalTime +" < '"+ t2 +"')";
+ sql += " OR ";
+ sql += "("+ initialTime + " > '"+ t1 +"'";
+ sql += " AND "+ initialTime +" < '"+ t2 +"'";
+ sql += " AND "+ finalTime +" > '"+ t2 +"')";
+ break;
+
+ case TeTIMEENDS: sql = finalTime +" = '"+ t2 +"'";
+ break;
+
+ case TeTIMESTARTS: sql = initialTime +" = '"+ t1 +"'";
+ break;
+ case TeTIMEUNDEFINED:
+ return sql;
+ }
+
+ return sql;
+}
+
+string TePostgreSQL::getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel, const string& initialTime, const string& finalTime)
+{
+ string func = " EXTRACT(";
+ string sql;
+
+ switch(chr)
+ {
+ case TeSECOND: func = "second FROM ";
+ break;
+
+ case TeMINUTE: func = "minute FROM ";
+ break;
+
+ case TeHOUR: func = "hour FROM ";
+ break;
+
+ case TeDAY: func = "day FROM ";
+ break;
+
+ case TeMONTH: func = "month FROM ";
+ break;
+
+ case TeYEAR: func = "year FROM ";
+ break;
+ default: return "";
+ }
+
+ switch(rel)
+ {
+ case TeTIMEBEFORE: sql = func + finalTime + ") < " + Te2String(time1);
+ break;
+
+ case TeTIMEAFTER: sql = func + initialTime + ") > " + Te2String(time2);
+ break;
+
+ case TeTIMEEQUAL: sql = func + initialTime + ") = " + Te2String(time1);
+ sql += " AND "+ func + finalTime +") = " + Te2String(time2);
+ break;
+
+ case TeTIMEMEETS: sql = func + finalTime + ") = " + Te2String(time1);
+ sql += " OR "+ func + initialTime +") = " + Te2String(time2);
+ break;
+
+ case TeTIMEDURING: sql = func + initialTime + ") >= " + Te2String(time1);
+ sql += " AND " + func + initialTime + ") <= " + Te2String(time2);
+ sql += " AND " + func + finalTime + ") >= " + Te2String(time1);
+ sql += " AND " + func + finalTime + ") <= " + Te2String(time2);
+ break;
+
+ case TeTIMEOVERLAPS: sql = "("+ func + initialTime + ") <= " + Te2String(time1);
+ sql += " AND " + func + finalTime + ") >= " + Te2String(time1);
+ sql += " AND " + func + finalTime + ") <= " + Te2String(time2) + ")";
+ sql += " OR ";
+ sql += "(" + func + initialTime + ") >= " + Te2String(time1);
+ sql += " AND " + func + initialTime + ") <= " + Te2String(time2);
+ sql += " AND " + func + finalTime + ") >= " + Te2String(time2) +")";
+ break;
+
+ case TeTIMEENDS: sql = func + finalTime + ") = " + Te2String(time2);
+ break;
+
+ case TeTIMESTARTS: sql = func + initialTime + ") = " + Te2String(time1);
+ break;
+ case TeTIMEUNDEFINED:
+ return sql;
+ }
+
+ return sql;
+}
+
+string TePostgreSQL::getAutoNumberSQL(const string& table)
+{
+ errorMessage_ = "";
+
+ TePGRecordset rec;
+
+ string sql = "SELECT adsrc FROM pg_class, pg_attrdef WHERE lower(pg_class.relname) = lower('" + table + "') AND pg_attrdef.adnum = 1 AND pg_class.oid = pg_attrdef.adrelid";
+
+ if(!rec.open(sql, &tepg_connection_))
+ return false;
+
+ if(rec.recordCount() > 0)
+ {
+ return rec.getData(0);
+ }
+ else
+ return "";
+}
+
+string TePostgreSQL::concatValues(vector<string>& values, const string& unionString)
+{
+ string concat = "";
+
+ for(unsigned int i = 0; i < values.size(); ++i)
+ {
+ if(i != 0)
+ {
+ concat += " || ";
+
+ if(!unionString.empty())
+ {
+ concat += "'";
+ concat += unionString;
+ concat += "'";
+ concat += " || ";
+ }
+ }
+
+ concat += values[i];
+ }
+
+ return concat;
+}
+
+string TePostgreSQL::toUpper(const string& value)
+{
+ string result = "upper(";
+ result += value;
+ result += ")";
+
+ return result;
+}
+
+void TePostgreSQL::getInsertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, const int& band, const unsigned int& res, const unsigned int& subband, char* buf, const unsigned long& size, string& sql)
+{
+ sql += "INSERT INTO " + table + " (block_id, lower_x, lower_y, upper_x, upper_y, band_id, resolution_factor, subband, spatial_data, block_size) VALUES('";
+ sql += blockId;
+ sql += "', ";
+ sql += Te2String(ll.x_);
+ sql += ", ";
+ sql += Te2String(ll.y_);
+ sql += ", ";
+ sql += Te2String(ur.x_);
+ sql += ", ";
+ sql += Te2String(ur.y_);
+ sql += ", ";
+ sql += Te2String(band);
+ sql += ", ";
+ sql += Te2String(res);
+ sql += ", ";
+ sql += Te2String(subband);
+ sql += ", '";
+ //sql += Te2String(obj_oid);
+ sql += buf;
+ sql += "', ";
+ sql += Te2String(size);
+ sql += ")";
+
+ return;
+}
+
+void TePostgreSQL::getUpdateRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, const int& band, const unsigned int& res, const unsigned int& subband, char* buf, const unsigned long& size, string& sql)
+{
+ sql += "UPDATE ";
+ sql += table;
+ sql += " SET lower_x = ";
+ sql += Te2String(ll.x_);
+ sql += ", lower_y = ";
+ sql += Te2String(ll.y_);
+ sql += ", upper_x = ";
+ sql += Te2String(ur.x_);
+ sql += ", upper_y = ";
+ sql += Te2String(ur.y_);
+ sql += ", band_id = ";
+ sql += Te2String(band);
+ sql += ", resolution_factor = ";
+ sql += Te2String(res);
+ sql += ", subband = ";
+ sql += Te2String(subband);
+ sql += ", spatial_data = '";
+ //sql += Te2String(static_cast<long>(obj_oid));;
+ sql += buf;
+ sql += "', block_size = ";
+ sql += Te2String(size);
+ sql += " WHERE block_id = '";
+ sql += blockId;
+ sql += "'";
+
+ return;
+}
+
+
+string TePostgreSQL::escapeSequence(const string& from)
+{
+ size_t newLen = 0;
+
+
+ char* aux = TePGConnection::escapeString(from.c_str(), from.length(), newLen);
+
+ string str = aux;
+
+ delete [] aux;
+
+ return str;
+}
+
+
+//----- TePostgreSQLPortal methods ---
+TePostgreSQLPortal::TePostgreSQLPortal() : con_(0), curRow_(-1)
+{
+}
+
+TePostgreSQLPortal::TePostgreSQLPortal(TeDatabase *pDatabase) : curRow_(-1)
+{
+ db_ = pDatabase;
+ con_ = &((static_cast<TePostgreSQL*>(pDatabase))->tepg_connection_);
+}
+
+TePostgreSQLPortal::~TePostgreSQLPortal()
+{
+ this->freeResult();
+ con_ = 0;
+}
+
+bool TePostgreSQLPortal::query(const string &qry, TeCursorLocation l, TeCursorType t, TeCursorEditType /*e*/, TeCursorDataType dt)
+{
+ errorMessage_ = "";
+
+ freeResult();
+
+
+ if(!tepg_recordset_.open(qry, con_, t, l, dt))
+ //{
+ // TeWriteToFile("QUERYS.SQL", qry + "\n", "a");
+
+ return false;
+ //}
+
+
+ numRows_ = tepg_recordset_.recordCount();
+
+ numFields_ = tepg_recordset_.getFieldCount();
+
+ attList_.clear ();
+
+ for(int i = 0; i < numFields_; ++i)
+ {
+ TeAttribute attribute;
+
+ Oid nType = tepg_recordset_.fieldType(i);
+
+ switch(nType)
+ {
+ case 16: //BOOL
+ case 20: //INT8
+ case 21: //INT2
+ case 23: //INT4
+ case 26: //OID
+ attribute.rep_.type_ = TeINT;
+ break;
+ case 700 : //float4 -> float(p)
+ case 701 : //float8 -> float(p)
+ case 790 : //money -> decimal(9, 2)
+ case 1700: //numeric -> numeric(p, s)
+ attribute.rep_.type_ = TeREAL;
+ break;
+
+ case 1082: //date -> date
+ case 1083: //time -> time
+ case 1114: //timestamp
+ case 1186: //interval
+ case 1266: //
+ attribute.rep_.type_ = TeDATETIME;
+ break;
+
+ //case 26: //OID
+ case 17: //bytea
+ attribute.rep_.type_ = TeBLOB;
+ break;
+ case 1042:
+ attribute.rep_.type_ = TeCHARACTER;
+
+ case 1043: //varchar(n)
+ case 25: //text
+ attribute.rep_.type_ = TeSTRING;
+ break;
+
+ default:
+ attribute.rep_.type_ = TeUNKNOWN;
+ break;
+ }
+
+ attribute.rep_.name_ = tepg_recordset_.fieldName(i);
+ pair<int, int> len(tepg_recordset_.fieldSize(i), tepg_recordset_.fieldSizeFractionaryPart(i));
+ attribute.rep_.numChar_ = len.first + len.second;
+ attList_.push_back(attribute);
+ }
+
+ curRow_ = 0;
+
+ return true;
+}
+
+bool TePostgreSQLPortal::fetchRow()
+{
+ errorMessage_ = "";
+
+ if(numFields_ <= 0)
+ {
+ errorMessage_ = "The PostgreSQL portal is empty!";
+ return false;
+ }
+
+ if(curRow_ > 0)
+ tepg_recordset_.moveNext();
+
+ if(tepg_recordset_.eof())
+ return false;
+
+ ++curRow_;
+
+ return true;
+}
+
+bool TePostgreSQLPortal::fetchRow(int i)
+{
+ errorMessage_ = "";
+
+ //if(tepg_recordset_.recordCount() == 0)
+ //{
+ // errorMessage_ = "The PostgreSQL portal is empty!";
+ // return false;
+ //}
+
+ curRow_ = i;
+ return tepg_recordset_.moveTo(i + 1);
+ //return true;
+}
+
+void TePostgreSQLPortal::freeResult()
+{
+ tepg_recordset_.close();
+
+ return;
+}
+
+string TePostgreSQLPortal::errorMessage()
+{
+ if(errorMessage_.empty())
+ return con_->err_msg();
+ else
+ return errorMessage_;
+}
+
+char* TePostgreSQLPortal::getData(int i)
+{
+ errorMessage_ = "";
+
+ try
+ {
+ return tepg_recordset_.getData(i);
+ }
+
+ catch(...)
+ {
+ return "";
+ }
+
+ return "";
+
+}
+
+char* TePostgreSQLPortal::getData(const string& s)
+{
+ errorMessage_ = "";
+
+ try
+ {
+ return tepg_recordset_.getData(s);
+ }
+
+ catch(...)
+ {
+ return "";
+ }
+
+ return "";
+}
+
+double TePostgreSQLPortal::getDouble(int i)
+{
+ errorMessage_ = "";
+
+ try
+ {
+ return tepg_recordset_.getDouble(i);
+ }
+
+ catch(...)
+ {
+ return 0.0;
+ }
+
+ return 0.0;
+}
+
+double TePostgreSQLPortal::getDouble(const string& s)
+{
+ errorMessage_ = "";
+
+ try
+ {
+ return tepg_recordset_.getDouble(s);
+ }
+
+ catch(...)
+ {
+ return 0.0;
+ }
+
+ return 0.0;
+}
+
+int TePostgreSQLPortal::getInt(int i)
+{
+ errorMessage_ = "";
+
+ try
+ {
+ return tepg_recordset_.getInt(i);
+ }
+
+ catch(...)
+ {
+ return 0;
+ }
+
+ return 0;
+}
+
+int TePostgreSQLPortal::getInt(const string& s)
+{
+ errorMessage_ = "";
+
+ try
+ {
+ return tepg_recordset_.getInt(s);
+ }
+
+ catch(...)
+ {
+ return 0;
+ }
+
+ return 0;
+}
+
+bool TePostgreSQLPortal::getBool(const string& s)
+{
+ errorMessage_ = "";
+
+ try
+ {
+ if(tepg_recordset_.getInt(s))
+ return true;
+ else
+ return false;
+ }
+
+ catch(...)
+ {
+ return false;
+ }
+
+ return false;
+}
+
+bool TePostgreSQLPortal::getBool(int i)
+{
+ errorMessage_ = "";
+
+ try
+ {
+ if(tepg_recordset_.getInt(i))
+ return true;
+ else
+ return false;
+ }
+
+ catch(...)
+ {
+ return false;
+ }
+
+ return false;
+}
+
+TeTime TePostgreSQLPortal::getDate(int i)
+{
+ string s = getData(i);
+
+ TeTime t(s, TeSECOND, "YYYYsMMsDDsHHsmmsSS");
+
+ return t;
+}
+
+TeTime TePostgreSQLPortal::getDate(const string& s)
+{
+ string ss = getData(s);
+
+ TeTime t(ss, TeSECOND, "YYYYsMMsDDsHHsmmsSS");
+
+ return t;
+}
+
+string TePostgreSQLPortal::getDateAsString(int i)
+{
+ return getData(i);
+}
+
+string TePostgreSQLPortal::getDateAsString(const string& s)
+{
+ return getData(s);
+}
+
+bool TePostgreSQLPortal::getBlob(const string& s, unsigned char*& data, long& size)
+{
+ errorMessage_ = "";
+
+ data = 0;
+
+ char* ptDataAux = (char*)data;
+
+ unsigned long newLen = tepg_recordset_.getBytea(s, ptDataAux);
+
+ if(newLen > 0)
+ {
+ size = newLen;
+ data = (unsigned char*)ptDataAux;
+ return true;
+ }
+
+ errorMessage_ = "Couldn't read blob! Blob size error!";
+
+ if(data)
+ {
+ delete [] data;
+ data = 0;
+ }
+
+ return false;
+}
+
+bool TePostgreSQLPortal::getRasterBlock(unsigned long& size, unsigned char* ptData)
+{
+ errorMessage_ = "";
+
+ // get the actual length of the compressed data
+ size = tepg_recordset_.getInt("block_size");
+
+
+ if(size > 0)
+ {
+ char* ptDataAux = (char*)ptData;
+
+ unsigned long newLen = tepg_recordset_.getBytea("spatial_data", ptDataAux);
+
+ if(newLen == size)
+ {
+ ptData = (unsigned char*)ptDataAux;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+bool TePostgreSQLPortal::fetchGeometry(TePolygon& pol)
+{
+ errorMessage_ = "";
+
+ int numberOfHoles;
+
+ TeLinearRing ring = this->getLinearRing(numberOfHoles);
+
+ pol.objectId(ring.objectId());
+ pol.geomId(ring.geomId());
+ pol.add(ring);
+ int parentId = pol.geomId();
+
+ while(fetchRow())
+ {
+ if(atoi(this->getData("parent_id")) == parentId)
+ {
+ int dummy;
+
+ TeLinearRing ring = getLinearRing(dummy);
+ pol.add(ring);
+ }
+ else
+ return true;
+ }
+
+ return false;
+}
+
+bool TePostgreSQLPortal::fetchGeometry(TeLine2D& line)
+{
+ errorMessage_ = "";
+
+ tepg_recordset_.getPGLine2D("spatial_data", line);
+
+ int geomId = tepg_recordset_.getInt("geom_id");
+
+ string objectId = tepg_recordset_.value("object_id");
+
+ line.objectId(objectId);
+
+ line.geomId(geomId);
+
+ return fetchRow();
+}
+
+bool TePostgreSQLPortal::fetchGeometry(TeNode& n)
+{
+ errorMessage_ = "";
+
+ TeCoord2D pt(getDouble("x"), getDouble("y"));
+
+ n.add(pt);
+ n.geomId(atoi(getData("geom_id")));
+ n.objectId(string(getData("object_id")));
+
+ return fetchRow();
+}
+
+bool TePostgreSQLPortal::fetchGeometry(TePoint& p)
+{
+ errorMessage_ = "";
+
+ p.location().setXY(getDouble("x"), getDouble("y"));
+ p.geomId(atoi(getData("geom_id")));
+ p.objectId(string(getData("object_id")));
+
+ return fetchRow();
+}
+
+TeLinearRing TePostgreSQLPortal::getLinearRing(int& numberOfHoles)
+{
+ int geomId = tepg_recordset_.getInt("geom_id");
+ string objectId = tepg_recordset_.value("object_id");
+
+ numberOfHoles = tepg_recordset_.getInt("num_holes");
+
+ TeLine2D line;
+
+ tepg_recordset_.getPGLine2D("spatial_data", line);
+
+ TeLinearRing ring = line;
+
+ ring.objectId(objectId);
+
+ ring.geomId(geomId);
+
+ return ring;
+}
+
+string TePostgreSQLPortal::escapeSequence(const string& from)
+{
+ size_t newLen = 0;
+
+ char* aux = TePGConnection::escapeString(from.c_str(), from.length(), newLen);
+
+ string str = aux;
+
+ delete [] aux;
+
+ return str;
+}
diff --git a/src/terralib/drivers/PostgreSQL/TePostgreSQL.h b/src/terralib/drivers/PostgreSQL/TePostgreSQL.h
new file mode 100644
index 0000000..30f108f
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePostgreSQL.h
@@ -0,0 +1,396 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TePostgreSQL.h
+ This file contains a database driver to access PostgreSQL server.
+ */
+
+/**
+ *@author Gilberto Ribeiro de Queiroz - gribeiro at dpi.inpe.br
+ */
+
+/**
+ *@description This file contains the especifics routines of PostgreSQL.
+ */
+
+/*
+ * TODO: 01. Implementar o alterTable que n�o pode simplesmente alterar o tipo da coluna
+ * 02. No m�todo query do portal, determinar os campos que fazem parte da chave prim�ria
+ * 03. Insert Blob
+ *
+ */
+
+#ifndef __TERRALIB_INTERNAL_POSTGRESQL_H
+#define __TERRALIB_INTERNAL_POSTGRESQL_H
+
+#include "TeDatabase.h"
+#include "TePGInterface.h"
+
+
+class TePostgreSQLPortal;
+
+//! PostgreSQL database access class.
+/*!
+ This class contains the implementation of common methods for TerraLib access PostgreSQL.
+ */
+class TePostgreSQL : public TeDatabase
+{
+ friend class TePostgreSQLPortal;
+
+ public:
+
+ //! Constructor
+ TePostgreSQL();
+
+ //! Destructor
+ virtual ~TePostgreSQL();
+
+ //! Returns the error message from the server
+ string errorMessage();
+
+ //! Creates a new database based on "template1" and open a connection to the new one
+ virtual bool newDatabase(const string& database, const string& user, const string& password, const string& host, const int& port = 0, bool terralibModel=true);
+
+ //! Opens a conection to a database server
+ virtual bool connect(const string& host, const string& user, const string& password, const string& database, int port = 0);
+
+ //! Show the server databases (only for MySQL, Oracle and PostgreSQL)
+ virtual bool showDatabases(const string& host, const string& user, const string& password, vector<string>& dbNames, int port = 0);
+
+ //! Closes the conection
+ void close(void);
+
+ bool listTables(vector<string>& tableList);
+
+ //! Verifies if a table exist
+ bool tableExist(const string& table);
+
+ //! Verifies if a table has a column
+ bool columnExist(const string& table, const string& column, TeAttribute& attr);
+
+ //! Creates a generic table
+ bool createTable(const string& table, TeAttributeList &attr);
+
+ //! Adds an attribute field
+ bool addColumn(const string& table, TeAttributeRep &rep);
+
+ //! Creates a reationship between two tables
+ bool createRelation(const string& relName, const string& table, const string& fieldName, const string& relatedTable, const string& relatedField, bool cascadeDeletion);
+
+ //! Checks if a relation exist
+ TeDBRelationType existRelation(const string& tableName, const string& relName);
+
+ //! Executes a SQL command that doesn�t return a record set tipically a data definition comand
+ bool execute(const string &sql);
+
+ //! Returns a portal associated to this database
+ virtual TeDatabasePortal* getPortal();
+
+ //! Creates a table to store version database information
+ virtual bool createDatabaseTable();
+
+ //! Creates a table to stores projections
+ bool createProjectionTable();
+
+ //! Creates a table to store Layers information
+ bool createLayerTable();
+
+ //! Creates a table to store Representations information
+ bool createRepresentationTable();
+
+ //! Creates a table to store Views information
+ bool createViewTable();
+
+ //! Creates a table to store Themes information
+ bool createThemeTable();
+
+ //! Creates a table to store the groupings associated with a theme
+ bool createGroupingTable();
+
+ //! Creates a table to store information about the attribute tables used by a theme
+ bool createThemeTablesTable();
+
+ //! Creates a table to store legends
+ bool createLegendTable();
+
+ //! Creates a table to store visual definitions
+ bool createVisualTable();
+
+ //! Creates a table to store raster visual definitions
+ bool createVisualRasterTable();
+
+ //! Creates a table to store information about the non-spatial tables associated to this layer
+ bool createLayerTableTable();
+
+ //! Creates a table to store information about the external tables related to non-spatial tables of layers
+ bool createTablesRelationTable();
+
+ //! Creates a table for a polygon geometries
+ virtual bool createPolygonGeometry(const string& tableName);
+
+ //! Creates a table for line geometries
+ virtual bool createLineGeometry(const string& tableName);
+
+ //! Creates a table for point geometries
+ virtual bool createPointGeometry(const string& tableName);
+
+ //! Creates a table for cell geometries
+ virtual bool createCellGeometry(const string& tableName);
+
+ //! Creates a table for a text geometries
+ bool createTextGeometry(const string& tableName);
+
+ //! Creates a table for a arc geometries
+ bool createArcGeometry(const string& tableName);
+
+ //! Creates a table for a node geometries
+ virtual bool createNodeGeometry(const string& tableName);
+
+ //! Creates a table for raster geometries
+ virtual bool createRasterGeometry(const string& tableName);
+
+ //! Creates a table to store information about raster representation
+ bool createRasterMetadataTable(const string& tableName);
+
+ //! Creates a table for raster geometries
+ virtual bool createRasterTable(const string& tableName);
+
+ //! Creates a table to store information about objects in a theme
+ bool createCollectionTable(const string& tableName);
+
+ //! Inserts information about a link to an external table
+ bool insertRelationInfo(const int tableId, const string& tField, const string& rTable, const string& rField, int& relId);
+
+ //! Insert information about a table related to a layer
+ bool insertTableInfo(int layerId, TeTable& table, const string& user = "");
+
+ //! Saves a table and its contents in the database
+ bool insertTable(TeTable &table);
+
+ //! Alter a property of a table
+ bool alterTable(const string& tableName, TeAttributeRep& rep, const string& oldColName="");
+
+ //! Saves a large binary objects (BLOB) in a row table
+ bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size);
+
+ //! Saves a large binary objects (BLOB) in a row table
+ bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName);
+
+ //! Insert information about a geographical projection
+ bool insertProjection(TeProjection *proj);
+
+ //! Insert information about a layer
+ bool insertLayer(TeLayer *layer);
+
+ //! Insert information about a geometrical representation
+ bool insertRepresentation(int layerId, TeRepresentation& rep);
+
+ //! Inserts information about a view
+ bool insertView(TeView *view);
+
+ //! Inserts view tree information
+ bool insertViewTree(TeViewTree *tree);
+
+ //! Inserts a theme group
+ bool insertThemeGroup(TeViewTree* tree);
+
+ //! Inserts theme information
+ bool insertTheme(TeTheme *theme);
+
+ //! Inserts information about a table used by a theme
+ bool insertThemeTable(int themeId, int tableId, int relationId, int tableOrder);
+
+ //! Generate the label position (x,y) to each object of a theme
+ virtual bool generateLabelPositions(TeTheme *theme);
+
+ //! Inserts legend information
+ bool insertLegend(TeLegendEntry *legend);
+
+ //! Inserts a polygon
+ virtual bool insertPolygon(const string& table, TePolygon& p);
+
+ //! Updates a polygon
+ virtual bool updatePolygon(const string& table, TePolygon& p);
+
+ //! Inserts a line
+ virtual bool insertLine(const string& table, TeLine2D& l);
+
+ //! Updates a line
+ virtual bool updateLine(const string& table, TeLine2D& l);
+
+ //! Inserts a point
+ virtual bool insertPoint(const string& table, TePoint& p);
+
+ //! Inserts text
+ bool insertText(const string& table, TeText& t);
+
+ //! Inserts an arc
+ bool insertArc(const string& table,TeArc& arc);
+
+ //! Inserts a node
+ virtual bool insertNode(const string& table, TeNode& node);
+
+ //! Inserts a cell
+ virtual bool insertCell(const string& table, TeCell& c);
+
+ //! Insert a raster block into the database
+ virtual bool insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, unsigned char* buf,unsigned long size, int band = 0, unsigned int res = 1, unsigned int subband = 0);
+
+ //! Creates a lookup table (used for pallete raster representations)
+ bool createLUTTable(const string& name);
+
+ //! Return a string SQL to calculate the statistics to each cell through database functions
+ string getSQLStatistics(TeGroupingAttr& attrs);
+
+ //! Return a string SQL to temporal where
+ string getSQLTemporalWhere(TeTimeInterval& timeInterval, TeTemporalRelation timeOperator, const string& initialTime, const string& finalTime);
+
+ //! Return a string SQL to temporal where
+ string getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel, const string& initialTime, const string& finalTime);
+
+ //! Return the database function to generate autonumber values
+ string getAutoNumberSQL(const string& table);
+
+ //! Concat values in a vector using unionString as the join between each value
+ string concatValues(vector<string>& values, const string& unionString);
+
+ //! Returns the SQL function for upper case
+ string toUpper(const string& value);
+
+ protected:
+
+ //! Returns a string with insert of a raster block
+ virtual void getInsertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, const int& band, const unsigned int& res, const unsigned int& subband, char* buf, const unsigned long& size, string& sql);
+
+ //! Returns a string with update of a raster block
+ virtual void getUpdateRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, const int& band, const unsigned int& res, const unsigned int& subband, char* buf, const unsigned long& size, string& sql);
+
+ //! Escape special characters in a string to be used in a SQL statement
+ string escapeSequence(const string& from);
+
+ //! Opens a conection to a database server
+ bool realConnect(const string& host, const string& user, const string& password, const string& database, int port = 0);
+
+ //! Connection to a PostgreSQL server
+ TePGConnection tepg_connection_;
+
+};
+
+
+//! PostgreSQL data navigation functionalities.
+/*!
+ This class contains the implementation of common methods for TerraLib navigate throw data.
+ */
+class TePostgreSQLPortal : public TeDatabasePortal
+{
+ public:
+
+ //! Constructor
+ TePostgreSQLPortal();
+
+ //! Constructor
+ TePostgreSQLPortal(TeDatabase *pDatabase);
+
+ //! Virtual Destructor
+ virtual ~TePostgreSQLPortal();
+
+ //! Executes a SQL query that opens a record set
+ virtual bool query(const string &qry, TeCursorLocation l = TeSERVERSIDE, TeCursorType t = TeUNIDIRECTIONAL, TeCursorEditType e = TeREADONLY, TeCursorDataType dt = TeTEXTCURSOR);
+
+ //! Fetchs the next row in a record set that should�ve been previously opened
+ bool fetchRow();
+
+ //! Fetchs a particular row
+ bool fetchRow(int i);
+
+ //! Frees the current record set
+ void freeResult();
+
+ //! Gets the last error message
+ string errorMessage();
+
+ //! Gets the value of the i-th attribute as a literal
+ char* getData(int i);
+
+ //! Gets the value of a named attribute as a literal
+ char* getData(const string& s);
+
+ //! Gets the value of the i-th attribute a double
+ double getDouble(int i);
+
+ //! Gets the value of a named attribute as a double
+ double getDouble(const string& s);
+
+ //! Gets the value of the i-th attribute as an integer
+ int getInt(int i);
+
+ //! Gets the value of a named attribute as an integer
+ int getInt(const string& s);
+
+ //! Gets the value of a named attribute as a boolean
+ bool getBool(const string& s);
+
+ //! Gets the value of the i-th attribute as a boolean
+ bool getBool(int i);
+
+ //! Gets the value of the i-th attribute as a date
+ TeTime getDate(int i);
+
+ //! Gets the value of a named attribute as a date
+ TeTime getDate(const string& s);
+
+ //! Gets the of a date/time attribute as a string formatted as accepted in further SQL statements
+ string getDateAsString(int i);
+
+ //! Gets the of a date/time attribute as a string formatted as accepted in further SQL statements
+ string getDateAsString(const string& s);
+
+ //! Gets the value of a named BLOB attribute
+ bool getBlob(const string& s, unsigned char*& data, long& size);
+
+ virtual bool getRasterBlock(unsigned long& size, unsigned char* ptData);
+
+ virtual bool fetchGeometry(TePolygon& pol);
+ virtual bool fetchGeometry(TeLine2D& line);
+ virtual bool fetchGeometry(TeNode& n);
+ virtual bool fetchGeometry(TePoint& p);
+
+
+ protected:
+
+ //! Return a linear ring and the number of holes in case of external ring
+ TeLinearRing getLinearRing(int& numberOfHoles);
+
+ //! Escape special characters in a string to be used in a SQL statement
+ string escapeSequence(const string& from);
+
+ // Protected data members
+ TePGConnection *con_;
+ TePGRecordset tepg_recordset_;
+
+ long curRow_;
+
+};
+
+#endif // __TERRALIB_INTERNAL_TePOSTGRESQL_H
+
diff --git a/src/terralib/drivers/PostgreSQL/includepg/ecpg_informix.h b/src/terralib/drivers/PostgreSQL/includepg/ecpg_informix.h
new file mode 100644
index 0000000..3e3fcfc
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/ecpg_informix.h
@@ -0,0 +1,90 @@
+/*
+ * This file contains stuff needed to be as compatible to Informix as possible.
+ *
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/include/ecpg_informix.h,v 1.16 2004/08/29 05:06:59 momjian Exp $
+ */
+#ifndef _ECPG_INFORMIX_H
+#define _ECPG_INFORMIX_H
+
+#include <ecpglib.h>
+#include <pgtypes_date.h>
+#include <pgtypes_interval.h>
+#include <pgtypes_numeric.h>
+#include <pgtypes_timestamp.h>
+
+#define SQLNOTFOUND 100
+
+#define ECPG_INFORMIX_NUM_OVERFLOW -1200
+#define ECPG_INFORMIX_NUM_UNDERFLOW -1201
+#define ECPG_INFORMIX_DIVIDE_ZERO -1202
+#define ECPG_INFORMIX_BAD_YEAR -1204
+#define ECPG_INFORMIX_BAD_MONTH -1205
+#define ECPG_INFORMIX_BAD_DAY -1206
+#define ECPG_INFORMIX_ENOSHORTDATE -1209
+#define ECPG_INFORMIX_DATE_CONVERT -1210
+#define ECPG_INFORMIX_OUT_OF_MEMORY -1211
+#define ECPG_INFORMIX_ENOTDMY -1212
+#define ECPG_INFORMIX_BAD_NUMERIC -1213
+#define ECPG_INFORMIX_BAD_EXPONENT -1216
+#define ECPG_INFORMIX_BAD_DATE -1218
+#define ECPG_INFORMIX_EXTRA_CHARS -1264
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+extern int rdatestr(date, char *);
+extern void rtoday(date *);
+extern int rjulmdy(date, short *);
+extern int rdefmtdate(date *, char *, char *);
+extern int rfmtdate(date, char *, char *);
+extern int rmdyjul(short *, date *);
+extern int rstrdate(char *, date *);
+extern int rdayofweek(date);
+
+extern int rfmtlong(long, char *, char *);
+extern int rgetmsg(int, char *, int);
+extern int risnull(int, char *);
+extern int rsetnull(int, char *);
+extern int rtypalign(int, int);
+extern int rtypmsize(int, int);
+extern int rtypwidth(int, int);
+extern void rupshift(char *);
+
+extern int byleng(char *, int);
+extern void ldchar(char *, int, char *);
+
+extern void ECPG_informix_set_var(int, void *, int);
+extern void *ECPG_informix_get_var(int);
+
+/* Informix defines these in decimal.h */
+int decadd(decimal *, decimal *, decimal *);
+int deccmp(decimal *, decimal *);
+void deccopy(decimal *, decimal *);
+int deccvasc(char *, int, decimal *);
+int deccvdbl(double, decimal *);
+int deccvint(int, decimal *);
+int deccvlong(long, decimal *);
+int decdiv(decimal *, decimal *, decimal *);
+int decmul(decimal *, decimal *, decimal *);
+int decsub(decimal *, decimal *, decimal *);
+int dectoasc(decimal *, char *, int, int);
+int dectodbl(decimal *, double *);
+int dectoint(decimal *, int *);
+int dectolong(decimal *, long *);
+
+/* Informix defines these in datetime.h */
+extern void dtcurrent(timestamp *);
+extern int dtcvasc(char *, timestamp *);
+extern int dtsub(timestamp *, timestamp *, interval *);
+extern int dttoasc(timestamp *, char *);
+extern int dttofmtasc(timestamp *, char *, int, char *);
+extern int intoasc(interval *, char *);
+extern int dtcvfmtasc(char *, char *, timestamp *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ndef _ECPG_INFORMIX_H */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/ecpgerrno.h b/src/terralib/drivers/PostgreSQL/includepg/ecpgerrno.h
new file mode 100644
index 0000000..87a30ef
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/ecpgerrno.h
@@ -0,0 +1,77 @@
+#ifndef _ECPG_ERRNO_H
+#define _ECPG_ERRNO_H
+
+#include <errno.h>
+
+/* This is a list of all error codes the embedded SQL program can return */
+#define ECPG_NO_ERROR 0
+#define ECPG_NOT_FOUND 100
+
+/* system error codes returned by ecpglib get the correct number,
+ * but are made negative
+ */
+#define ECPG_OUT_OF_MEMORY -ENOMEM
+
+/* first we have a set of ecpg messages, they start at 200 */
+#define ECPG_UNSUPPORTED -200
+#define ECPG_TOO_MANY_ARGUMENTS -201
+#define ECPG_TOO_FEW_ARGUMENTS -202
+#define ECPG_TOO_MANY_MATCHES -203
+#define ECPG_INT_FORMAT -204
+#define ECPG_UINT_FORMAT -205
+#define ECPG_FLOAT_FORMAT -206
+#define ECPG_NUMERIC_FORMAT -207
+#define ECPG_INTERVAL_FORMAT -208
+#define ECPG_DATE_FORMAT -209
+#define ECPG_TIMESTAMP_FORMAT -210
+#define ECPG_CONVERT_BOOL -211
+#define ECPG_EMPTY -212
+#define ECPG_MISSING_INDICATOR -213
+#define ECPG_NO_ARRAY -214
+#define ECPG_DATA_NOT_ARRAY -215
+#define ECPG_ARRAY_INSERT -216
+
+#define ECPG_NO_CONN -220
+#define ECPG_NOT_CONN -221
+
+#define ECPG_INVALID_STMT -230
+
+/* dynamic SQL related */
+#define ECPG_UNKNOWN_DESCRIPTOR -240
+#define ECPG_INVALID_DESCRIPTOR_INDEX -241
+#define ECPG_UNKNOWN_DESCRIPTOR_ITEM -242
+#define ECPG_VAR_NOT_NUMERIC -243
+#define ECPG_VAR_NOT_CHAR -244
+
+/* finally the backend error messages, they start at 400 */
+#define ECPG_PGSQL -400
+#define ECPG_TRANS -401
+#define ECPG_CONNECT -402
+#define ECPG_DUPLICATE_KEY -403
+#define ECPG_SUBSELECT_NOT_ONE -404
+
+/* for compatibility we define some different error codes for the same error
+ * if adding a new one make sure to not double define it */
+#define ECPG_INFORMIX_DUPLICATE_KEY -239
+#define ECPG_INFORMIX_SUBSELECT_NOT_ONE -284
+
+/* backend WARNINGs, starting at 600 */
+#define ECPG_WARNING_UNRECOGNIZED -600
+ /* WARNING: (transaction aborted): queries ignored until END */
+
+ /*
+ * WARNING: current transaction is aborted, queries ignored until end of
+ * transaction block
+ */
+#define ECPG_WARNING_QUERY_IGNORED -601
+ /* WARNING: PerformPortalClose: portal "*" not found */
+#define ECPG_WARNING_UNKNOWN_PORTAL -602
+ /* WARNING: BEGIN: already a transaction in progress */
+#define ECPG_WARNING_IN_TRANSACTION -603
+ /* WARNING: AbortTransaction and not in in-progress state */
+ /* WARNING: COMMIT: no transaction in progress */
+#define ECPG_WARNING_NO_TRANSACTION -604
+ /* WARNING: BlankPortalAssignName: portal * already exists */
+#define ECPG_WARNING_PORTAL_EXISTS -605
+
+#endif /* !_ECPG_ERRNO_H */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/ecpglib.h b/src/terralib/drivers/PostgreSQL/includepg/ecpglib.h
new file mode 100644
index 0000000..6145e79
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/ecpglib.h
@@ -0,0 +1,94 @@
+/*
+ * this is a small part of c.h since we don't want to leak all postgres
+ * definitions into ecpg programs
+ */
+
+#ifndef _ECPGLIB_H
+#define _ECPGLIB_H
+
+#include "libpq-fe.h"
+#include "ecpgtype.h"
+#include <string.h>
+
+#ifndef __BEOS__
+#ifndef __cplusplus
+#ifndef bool
+#define bool char
+#endif /* ndef bool */
+
+#ifndef true
+#define true ((bool) 1)
+#endif /* ndef true */
+#ifndef false
+#define false ((bool) 0)
+#endif /* ndef false */
+#endif /* not C++ */
+#else /* __BEOS__ */
+#include <SupportDefs.h>
+#endif /* __BEOS__ */
+
+#ifndef TRUE
+#define TRUE 1
+#endif /* TRUE */
+
+#ifndef FALSE
+#define FALSE 0
+#endif /* FALSE */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+struct sqlca_t;
+
+void ECPGinit_sqlca(struct sqlca_t * sqlca);
+void ECPGdebug(int, FILE *);
+bool ECPGstatus(int, const char *);
+bool ECPGsetcommit(int, const char *, const char *);
+bool ECPGsetconn(int, const char *);
+bool ECPGconnect(int, int, const char *, const char *, const char *, const char *, int);
+bool ECPGdo(int, int, int, const char *, char *,...);
+bool ECPGtrans(int, const char *, const char *);
+bool ECPGdisconnect(int, const char *);
+bool ECPGprepare(int, char *, char *);
+bool ECPGdeallocate(int, int, char *);
+bool ECPGdeallocate_one(int, char *);
+bool ECPGdeallocate_all(int);
+char *ECPGprepared_statement(const char *);
+
+void ECPGlog(const char *format,...);
+char *ECPGerrmsg(void);
+
+ /* print an error message */
+void sqlprint(void);
+
+/* define this for simplicity as well as compatibility */
+
+#define SQLCODE sqlca.sqlcode
+
+/* dynamic SQL */
+
+bool ECPGdo_descriptor(int line, const char *connection,
+ const char *descriptor, const char *query);
+bool ECPGdeallocate_desc(int line, const char *name);
+bool ECPGallocate_desc(int line, const char *name);
+void ECPGraise(int line, int code, const char *sqlstate, const char *str);
+void ECPGraise_backend(int line, PGresult *result, PGconn *conn, int compat);
+bool ECPGget_desc_header(int, char *, int *);
+bool ECPGget_desc(int, char *, int,...);
+bool ECPGset_desc_header(int, char *, int);
+bool ECPGset_desc(int, char *, int,...);
+
+void ECPGset_noind_null(enum ECPGttype, void *);
+bool ECPGis_noind_null(enum ECPGttype, void *);
+bool ECPGdescribe(int, bool, const char *,...);
+
+/* dynamic result allocation */
+void ECPGfree_auto_mem(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ECPGLIB_H */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/ecpgtype.h b/src/terralib/drivers/PostgreSQL/includepg/ecpgtype.h
new file mode 100644
index 0000000..3d54402
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/ecpgtype.h
@@ -0,0 +1,93 @@
+/*
+ * This file implements a data structure that is built and maintained by the
+ * preprocessor.
+ *
+ * All types that can be handled for host variable declarations has to
+ * be handled eventually.
+ */
+
+/*
+ * Here are all the types that we are to handle. Note that it is the type
+ * that is registered and that has nothing whatsoever to do with the storage
+ * class.
+ *
+ * Simple types
+ * integers: char, short, int, long (signed and unsigned)
+ * floats: float, double
+ *
+ * Complex types:
+ * VARCHAR, VARCHAR2 - Strings with length (maxlen is given in the declaration)
+ * Arrays of simple types and of VARCHAR, VARCHAR2 (size given in declaration)
+ * Records build of simple types, arrays and other structs.
+ *
+ * Complicating things:
+ * typedefs and struct names!
+ *
+ * Conclusion:
+ * This is a typically recursive definition. A structure of typed list elements
+ * would probably work fine:
+ */
+
+#ifndef _ECPGTYPE_H
+#define _ECPGTYPE_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+enum ECPGttype
+{
+ ECPGt_char = 1, ECPGt_unsigned_char, ECPGt_short, ECPGt_unsigned_short,
+ ECPGt_int, ECPGt_unsigned_int, ECPGt_long, ECPGt_unsigned_long,
+ ECPGt_long_long, ECPGt_unsigned_long_long,
+ ECPGt_bool,
+ ECPGt_float, ECPGt_double,
+ ECPGt_varchar, ECPGt_varchar2,
+ ECPGt_numeric, /* this is a decimal that stores its
+ * digits in a malloced array */
+ ECPGt_decimal, /* this is a decimal that stores its
+ * digits in a fixed array */
+ ECPGt_date,
+ ECPGt_timestamp,
+ ECPGt_interval,
+ ECPGt_array,
+ ECPGt_struct,
+ ECPGt_union,
+ ECPGt_descriptor, /* sql descriptor, no C variable */
+ ECPGt_char_variable,
+ ECPGt_const, /* a constant is needed sometimes */
+ ECPGt_EOIT, /* End of insert types. */
+ ECPGt_EORT, /* End of result types. */
+ ECPGt_NO_INDICATOR /* no indicator */
+};
+
+ /* descriptor items */
+enum ECPGdtype
+{
+ ECPGd_count = 1,
+ ECPGd_data,
+ ECPGd_di_code,
+ ECPGd_di_precision,
+ ECPGd_indicator,
+ ECPGd_key_member,
+ ECPGd_length,
+ ECPGd_name,
+ ECPGd_nullable,
+ ECPGd_octet,
+ ECPGd_precision,
+ ECPGd_ret_length,
+ ECPGd_ret_octet,
+ ECPGd_scale,
+ ECPGd_type,
+ ECPGd_EODT, /* End of descriptor types. */
+ ECPGd_cardinality
+};
+
+#define IS_SIMPLE_TYPE(type) ((type) >= ECPGt_char && (type) <= ECPGt_interval)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ECPGTYPE_H */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/libpq-fe.h b/src/terralib/drivers/PostgreSQL/includepg/libpq-fe.h
new file mode 100644
index 0000000..f7f3797
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/libpq-fe.h
@@ -0,0 +1,503 @@
+/*-------------------------------------------------------------------------
+ *
+ * libpq-fe.h
+ * This file contains definitions for structures and
+ * externs for functions used by frontend postgres applications.
+ *
+ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * $PostgreSQL: pgsql/src/interfaces/libpq/libpq-fe.h,v 1.116 2004/12/31 22:03:50 pgsql Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef LIBPQ_FE_H
+#define LIBPQ_FE_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdio.h>
+
+/*
+ * postgres_ext.h defines the backend's externally visible types,
+ * such as Oid.
+ */
+#include "postgres_ext.h"
+
+/* SSL type is needed here only to declare PQgetssl() */
+#ifdef USE_SSL
+#include <openssl/ssl.h>
+#endif
+
+/* Application-visible enum types */
+
+typedef enum
+{
+ /*
+ * Although it is okay to add to this list, values which become unused
+ * should never be removed, nor should constants be redefined - that
+ * would break compatibility with existing code.
+ */
+ CONNECTION_OK,
+ CONNECTION_BAD,
+ /* Non-blocking mode only below here */
+
+ /*
+ * The existence of these should never be relied upon - they should
+ * only be used for user feedback or similar purposes.
+ */
+ CONNECTION_STARTED, /* Waiting for connection to be made. */
+ CONNECTION_MADE, /* Connection OK; waiting to send. */
+ CONNECTION_AWAITING_RESPONSE, /* Waiting for a response from the
+ * postmaster. */
+ CONNECTION_AUTH_OK, /* Received authentication; waiting for
+ * backend startup. */
+ CONNECTION_SETENV, /* Negotiating environment. */
+ CONNECTION_SSL_STARTUP, /* Negotiating SSL. */
+ CONNECTION_NEEDED /* Internal state: connect() needed */
+} ConnStatusType;
+
+typedef enum
+{
+ PGRES_POLLING_FAILED = 0,
+ PGRES_POLLING_READING, /* These two indicate that one may */
+ PGRES_POLLING_WRITING, /* use select before polling again. */
+ PGRES_POLLING_OK,
+ PGRES_POLLING_ACTIVE /* unused; keep for awhile for backwards
+ * compatibility */
+} PostgresPollingStatusType;
+
+typedef enum
+{
+ PGRES_EMPTY_QUERY = 0, /* empty query string was executed */
+ PGRES_COMMAND_OK, /* a query command that doesn't return
+ * anything was executed properly by the
+ * backend */
+ PGRES_TUPLES_OK, /* a query command that returns tuples was
+ * executed properly by the backend,
+ * PGresult contains the result tuples */
+ PGRES_COPY_OUT, /* Copy Out data transfer in progress */
+ PGRES_COPY_IN, /* Copy In data transfer in progress */
+ PGRES_BAD_RESPONSE, /* an unexpected response was recv'd from
+ * the backend */
+ PGRES_NONFATAL_ERROR, /* notice or warning message */
+ PGRES_FATAL_ERROR /* query failed */
+} ExecStatusType;
+
+typedef enum
+{
+ PQTRANS_IDLE, /* connection idle */
+ PQTRANS_ACTIVE, /* command in progress */
+ PQTRANS_INTRANS, /* idle, within transaction block */
+ PQTRANS_INERROR, /* idle, within failed transaction */
+ PQTRANS_UNKNOWN /* cannot determine status */
+} PGTransactionStatusType;
+
+typedef enum
+{
+ PQERRORS_TERSE, /* single-line error messages */
+ PQERRORS_DEFAULT, /* recommended style */
+ PQERRORS_VERBOSE /* all the facts, ma'am */
+} PGVerbosity;
+
+/* PGconn encapsulates a connection to the backend.
+ * The contents of this struct are not supposed to be known to applications.
+ */
+typedef struct pg_conn PGconn;
+
+/* PGresult encapsulates the result of a query (or more precisely, of a single
+ * SQL command --- a query string given to PQsendQuery can contain multiple
+ * commands and thus return multiple PGresult objects).
+ * The contents of this struct are not supposed to be known to applications.
+ */
+typedef struct pg_result PGresult;
+
+/* PGcancel encapsulates the information needed to cancel a running
+ * query on an existing connection.
+ * The contents of this struct are not supposed to be known to applications.
+ */
+typedef struct pg_cancel PGcancel;
+
+/* PGnotify represents the occurrence of a NOTIFY message.
+ * Ideally this would be an opaque typedef, but it's so simple that it's
+ * unlikely to change.
+ * NOTE: in Postgres 6.4 and later, the be_pid is the notifying backend's,
+ * whereas in earlier versions it was always your own backend's PID.
+ */
+typedef struct pgNotify
+{
+ char *relname; /* notification condition name */
+ int be_pid; /* process ID of server process */
+ char *extra; /* notification parameter */
+ /* Fields below here are private to libpq; apps should not use 'em */
+ struct pgNotify *next; /* list link */
+} PGnotify;
+
+/* Function types for notice-handling callbacks */
+typedef void (*PQnoticeReceiver) (void *arg, const PGresult *res);
+typedef void (*PQnoticeProcessor) (void *arg, const char *message);
+
+/* Print options for PQprint() */
+typedef char pqbool;
+
+typedef struct _PQprintOpt
+{
+ pqbool header; /* print output field headings and row
+ * count */
+ pqbool align; /* fill align the fields */
+ pqbool standard; /* old brain dead format */
+ pqbool html3; /* output html tables */
+ pqbool expanded; /* expand tables */
+ pqbool pager; /* use pager for output if needed */
+ char *fieldSep; /* field separator */
+ char *tableOpt; /* insert to HTML <table ...> */
+ char *caption; /* HTML <caption> */
+ char **fieldName; /* null terminated array of repalcement
+ * field names */
+} PQprintOpt;
+
+/* ----------------
+ * Structure for the conninfo parameter definitions returned by PQconndefaults
+ *
+ * All fields except "val" point at static strings which must not be altered.
+ * "val" is either NULL or a malloc'd current-value string. PQconninfoFree()
+ * will release both the val strings and the PQconninfoOption array itself.
+ * ----------------
+ */
+typedef struct _PQconninfoOption
+{
+ char *keyword; /* The keyword of the option */
+ char *envvar; /* Fallback environment variable name */
+ char *compiled; /* Fallback compiled in default value */
+ char *val; /* Option's current value, or NULL */
+ char *label; /* Label for field in connect dialog */
+ char *dispchar; /* Character to display for this field in
+ * a connect dialog. Values are: ""
+ * Display entered value as is "*"
+ * Password field - hide value "D" Debug
+ * option - don't show by default */
+ int dispsize; /* Field size in characters for dialog */
+} PQconninfoOption;
+
+/* ----------------
+ * PQArgBlock -- structure for PQfn() arguments
+ * ----------------
+ */
+typedef struct
+{
+ int len;
+ int isint;
+ union
+ {
+ int *ptr; /* can't use void (dec compiler barfs) */
+ int integer;
+ } u;
+} PQArgBlock;
+
+/* ----------------
+ * Exported functions of libpq
+ * ----------------
+ */
+
+/* === in fe-connect.c === */
+
+/* make a new client connection to the backend */
+/* Asynchronous (non-blocking) */
+extern PGconn *PQconnectStart(const char *conninfo);
+extern PostgresPollingStatusType PQconnectPoll(PGconn *conn);
+
+/* Synchronous (blocking) */
+extern PGconn *PQconnectdb(const char *conninfo);
+extern PGconn *PQsetdbLogin(const char *pghost, const char *pgport,
+ const char *pgoptions, const char *pgtty,
+ const char *dbName,
+ const char *login, const char *pwd);
+
+#define PQsetdb(M_PGHOST,M_PGPORT,M_PGOPT,M_PGTTY,M_DBNAME) \
+ PQsetdbLogin(M_PGHOST, M_PGPORT, M_PGOPT, M_PGTTY, M_DBNAME, NULL, NULL)
+
+/* close the current connection and free the PGconn data structure */
+extern void PQfinish(PGconn *conn);
+
+/* get info about connection options known to PQconnectdb */
+extern PQconninfoOption *PQconndefaults(void);
+
+/* free the data structure returned by PQconndefaults() */
+extern void PQconninfoFree(PQconninfoOption *connOptions);
+
+/*
+ * close the current connection and restablish a new one with the same
+ * parameters
+ */
+/* Asynchronous (non-blocking) */
+extern int PQresetStart(PGconn *conn);
+extern PostgresPollingStatusType PQresetPoll(PGconn *conn);
+
+/* Synchronous (blocking) */
+extern void PQreset(PGconn *conn);
+
+/* request a cancel structure */
+extern PGcancel *PQgetCancel(PGconn *conn);
+
+/* free a cancel structure */
+extern void PQfreeCancel(PGcancel *cancel);
+
+/* issue a cancel request */
+extern int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);
+
+/* backwards compatible version of PQcancel; not thread-safe */
+extern int PQrequestCancel(PGconn *conn);
+
+/* Accessor functions for PGconn objects */
+extern char *PQdb(const PGconn *conn);
+extern char *PQuser(const PGconn *conn);
+extern char *PQpass(const PGconn *conn);
+extern char *PQhost(const PGconn *conn);
+extern char *PQport(const PGconn *conn);
+extern char *PQtty(const PGconn *conn);
+extern char *PQoptions(const PGconn *conn);
+extern ConnStatusType PQstatus(const PGconn *conn);
+extern PGTransactionStatusType PQtransactionStatus(const PGconn *conn);
+extern const char *PQparameterStatus(const PGconn *conn,
+ const char *paramName);
+extern int PQprotocolVersion(const PGconn *conn);
+extern int PQserverVersion(const PGconn *conn);
+extern char *PQerrorMessage(const PGconn *conn);
+extern int PQsocket(const PGconn *conn);
+extern int PQbackendPID(const PGconn *conn);
+extern int PQclientEncoding(const PGconn *conn);
+extern int PQsetClientEncoding(PGconn *conn, const char *encoding);
+
+#ifdef USE_SSL
+/* Get the SSL structure associated with a connection */
+extern SSL *PQgetssl(PGconn *conn);
+#else
+extern void *PQgetssl(PGconn *conn);
+#endif
+
+/* Tell libpq whether it needs to initialize OpenSSL */
+extern void PQinitSSL(int do_init);
+
+/* Set verbosity for PQerrorMessage and PQresultErrorMessage */
+extern PGVerbosity PQsetErrorVerbosity(PGconn *conn, PGVerbosity verbosity);
+
+/* Enable/disable tracing */
+extern void PQtrace(PGconn *conn, FILE *debug_port);
+extern void PQuntrace(PGconn *conn);
+
+/* Override default notice handling routines */
+extern PQnoticeReceiver PQsetNoticeReceiver(PGconn *conn,
+ PQnoticeReceiver proc,
+ void *arg);
+extern PQnoticeProcessor PQsetNoticeProcessor(PGconn *conn,
+ PQnoticeProcessor proc,
+ void *arg);
+
+/*
+ * Used to set callback that prevents concurrent access to
+ * non-thread safe functions that libpq needs.
+ * The default implementation uses a libpq internal mutex.
+ * Only required for multithreaded apps that use kerberos
+ * both within their app and for postgresql connections.
+ */
+typedef void (*pgthreadlock_t) (int acquire);
+
+extern pgthreadlock_t PQregisterThreadLock(pgthreadlock_t newhandler);
+
+/* === in fe-exec.c === */
+
+/* Simple synchronous query */
+extern PGresult *PQexec(PGconn *conn, const char *query);
+extern PGresult *PQexecParams(PGconn *conn,
+ const char *command,
+ int nParams,
+ const Oid *paramTypes,
+ const char *const * paramValues,
+ const int *paramLengths,
+ const int *paramFormats,
+ int resultFormat);
+extern PGresult *PQprepare(PGconn *conn, const char *stmtName,
+ const char *query, int nParams,
+ const Oid *paramTypes);
+extern PGresult *PQexecPrepared(PGconn *conn,
+ const char *stmtName,
+ int nParams,
+ const char *const * paramValues,
+ const int *paramLengths,
+ const int *paramFormats,
+ int resultFormat);
+
+/* Interface for multiple-result or asynchronous queries */
+extern int PQsendQuery(PGconn *conn, const char *query);
+extern int PQsendQueryParams(PGconn *conn,
+ const char *command,
+ int nParams,
+ const Oid *paramTypes,
+ const char *const * paramValues,
+ const int *paramLengths,
+ const int *paramFormats,
+ int resultFormat);
+extern int PQsendPrepare(PGconn *conn, const char *stmtName,
+ const char *query, int nParams,
+ const Oid *paramTypes);
+extern int PQsendQueryPrepared(PGconn *conn,
+ const char *stmtName,
+ int nParams,
+ const char *const * paramValues,
+ const int *paramLengths,
+ const int *paramFormats,
+ int resultFormat);
+extern PGresult *PQgetResult(PGconn *conn);
+
+/* Routines for managing an asynchronous query */
+extern int PQisBusy(PGconn *conn);
+extern int PQconsumeInput(PGconn *conn);
+
+/* LISTEN/NOTIFY support */
+extern PGnotify *PQnotifies(PGconn *conn);
+
+/* Routines for copy in/out */
+extern int PQputCopyData(PGconn *conn, const char *buffer, int nbytes);
+extern int PQputCopyEnd(PGconn *conn, const char *errormsg);
+extern int PQgetCopyData(PGconn *conn, char **buffer, int async);
+
+/* Deprecated routines for copy in/out */
+extern int PQgetline(PGconn *conn, char *string, int length);
+extern int PQputline(PGconn *conn, const char *string);
+extern int PQgetlineAsync(PGconn *conn, char *buffer, int bufsize);
+extern int PQputnbytes(PGconn *conn, const char *buffer, int nbytes);
+extern int PQendcopy(PGconn *conn);
+
+/* Set blocking/nonblocking connection to the backend */
+extern int PQsetnonblocking(PGconn *conn, int arg);
+extern int PQisnonblocking(const PGconn *conn);
+
+/* Force the write buffer to be written (or at least try) */
+extern int PQflush(PGconn *conn);
+
+/*
+ * "Fast path" interface --- not really recommended for application
+ * use
+ */
+extern PGresult *PQfn(PGconn *conn,
+ int fnid,
+ int *result_buf,
+ int *result_len,
+ int result_is_int,
+ const PQArgBlock *args,
+ int nargs);
+
+/* Accessor functions for PGresult objects */
+extern ExecStatusType PQresultStatus(const PGresult *res);
+extern char *PQresStatus(ExecStatusType status);
+extern char *PQresultErrorMessage(const PGresult *res);
+extern char *PQresultErrorField(const PGresult *res, int fieldcode);
+extern int PQntuples(const PGresult *res);
+extern int PQnfields(const PGresult *res);
+extern int PQbinaryTuples(const PGresult *res);
+extern char *PQfname(const PGresult *res, int field_num);
+extern int PQfnumber(const PGresult *res, const char *field_name);
+extern Oid PQftable(const PGresult *res, int field_num);
+extern int PQftablecol(const PGresult *res, int field_num);
+extern int PQfformat(const PGresult *res, int field_num);
+extern Oid PQftype(const PGresult *res, int field_num);
+extern int PQfsize(const PGresult *res, int field_num);
+extern int PQfmod(const PGresult *res, int field_num);
+extern char *PQcmdStatus(PGresult *res);
+extern char *PQoidStatus(const PGresult *res); /* old and ugly */
+extern Oid PQoidValue(const PGresult *res); /* new and improved */
+extern char *PQcmdTuples(PGresult *res);
+extern char *PQgetvalue(const PGresult *res, int tup_num, int field_num);
+extern int PQgetlength(const PGresult *res, int tup_num, int field_num);
+extern int PQgetisnull(const PGresult *res, int tup_num, int field_num);
+
+/* Delete a PGresult */
+extern void PQclear(PGresult *res);
+
+/* For freeing other alloc'd results, such as PGnotify structs */
+extern void PQfreemem(void *ptr);
+
+/* Exists for backward compatibility. bjm 2003-03-24 */
+#define PQfreeNotify(ptr) PQfreemem(ptr)
+
+/* Define the string so all uses are consistent. */
+#define PQnoPasswordSupplied "fe_sendauth: no password supplied\n"
+
+/*
+ * Make an empty PGresult with given status (some apps find this
+ * useful). If conn is not NULL and status indicates an error, the
+ * conn's errorMessage is copied.
+ */
+extern PGresult *PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);
+
+
+/* Quoting strings before inclusion in queries. */
+extern size_t PQescapeString(char *to, const char *from, size_t length);
+extern unsigned char *PQescapeBytea(const unsigned char *bintext, size_t binlen,
+ size_t *bytealen);
+extern unsigned char *PQunescapeBytea(const unsigned char *strtext,
+ size_t *retbuflen);
+
+
+
+/* === in fe-print.c === */
+
+extern void
+PQprint(FILE *fout, /* output stream */
+ const PGresult *res,
+ const PQprintOpt *ps); /* option structure */
+
+/*
+ * really old printing routines
+ */
+extern void
+PQdisplayTuples(const PGresult *res,
+ FILE *fp, /* where to send the output */
+ int fillAlign, /* pad the fields with spaces */
+ const char *fieldSep, /* field separator */
+ int printHeader, /* display headers? */
+ int quiet);
+
+extern void
+PQprintTuples(const PGresult *res,
+ FILE *fout, /* output stream */
+ int printAttName, /* print attribute names */
+ int terseOutput, /* delimiter bars */
+ int width); /* width of column, if 0, use variable
+ * width */
+
+
+/* === in fe-lobj.c === */
+
+/* Large-object access routines */
+extern int lo_open(PGconn *conn, Oid lobjId, int mode);
+extern int lo_close(PGconn *conn, int fd);
+extern int lo_read(PGconn *conn, int fd, char *buf, size_t len);
+extern int lo_write(PGconn *conn, int fd, char *buf, size_t len);
+extern int lo_lseek(PGconn *conn, int fd, int offset, int whence);
+extern Oid lo_creat(PGconn *conn, int mode);
+extern int lo_tell(PGconn *conn, int fd);
+extern int lo_unlink(PGconn *conn, Oid lobjId);
+extern Oid lo_import(PGconn *conn, const char *filename);
+extern int lo_export(PGconn *conn, Oid lobjId, const char *filename);
+
+/* === in fe-misc.c === */
+
+/* Determine length of multibyte encoded char at *s */
+extern int PQmblen(const unsigned char *s, int encoding);
+
+/* Determine display length of multibyte encoded char at *s */
+extern int PQdsplen(const unsigned char *s, int encoding);
+
+/* Get encoding id from environment variable PGCLIENTENCODING */
+extern int PQenv2encoding(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBPQ_FE_H */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pg_config.h b/src/terralib/drivers/PostgreSQL/includepg/pg_config.h
new file mode 100644
index 0000000..4e87245
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pg_config.h
@@ -0,0 +1,685 @@
+/* src/include/pg_config.h. Generated by configure. */
+/* src/include/pg_config.h.in. Generated from configure.in by autoheader. */
+
+/* Define to the type of arg 1 of 'accept' */
+#define ACCEPT_TYPE_ARG1 unsigned int
+
+/* Define to the type of arg 2 of 'accept' */
+#define ACCEPT_TYPE_ARG2 struct sockaddr *
+
+/* Define to the type of arg 3 of 'accept' */
+#define ACCEPT_TYPE_ARG3 int
+
+/* Define to the return type of 'accept' */
+#define ACCEPT_TYPE_RETURN unsigned int PASCAL
+
+/* The alignment requirement of a `double'. */
+#define ALIGNOF_DOUBLE 8
+
+/* The alignment requirement of a `int'. */
+#define ALIGNOF_INT 4
+
+/* The alignment requirement of a `long'. */
+#define ALIGNOF_LONG 4
+
+/* The alignment requirement of a `long long int'. */
+#define ALIGNOF_LONG_LONG_INT 8
+
+/* The alignment requirement of a `short'. */
+#define ALIGNOF_SHORT 2
+
+/* Define to the default TCP port number on which the server listens and to
+ which clients will try to connect. This can be overridden at run-time, but
+ it's convenient if your clients have the right default compiled in.
+ (--with-pgport=PORTNUM) */
+#define DEF_PGPORT 5432
+
+/* Define to the default TCP port number as a string constant. */
+#define DEF_PGPORT_STR "5432"
+
+/* Define to 1 if you want National Language Support. (--enable-nls) */
+#define ENABLE_NLS 1
+
+/* Define to 1 to build client libraries as thread-safe code.
+ (--enable-thread-safety) */
+/* #undef ENABLE_THREAD_SAFETY */
+
+/* Define to 1 if getpwuid_r() takes a 5th argument. */
+/* #undef GETPWUID_R_5ARG */
+
+/* Define to 1 if gettimeofday() takes only 1 argument. */
+/* #undef GETTIMEOFDAY_1ARG */
+
+#ifdef GETTIMEOFDAY_1ARG
+# define gettimeofday(a,b) gettimeofday(a)
+#endif
+
+/* Define to 1 if you have the `atexit' function. */
+#define HAVE_ATEXIT 1
+
+/* Define to 1 if you have the `cbrt' function. */
+#define HAVE_CBRT 1
+
+/* Define to 1 if you have the `class' function. */
+/* #undef HAVE_CLASS */
+
+/* Define to 1 if you have the `crypt' function. */
+/* #undef HAVE_CRYPT */
+
+/* Define to 1 if you have the <crypt.h> header file. */
+/* #undef HAVE_CRYPT_H */
+
+/* Define to 1 if you have the declaration of `fdatasync', and to 0 if you
+ don't. */
+#define HAVE_DECL_FDATASYNC 0
+
+/* Define to 1 if you have the declaration of `snprintf', and to 0 if you
+ don't. */
+#define HAVE_DECL_SNPRINTF 1
+
+/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you
+ don't. */
+#define HAVE_DECL_VSNPRINTF 1
+
+/* Define to 1 if you have the <dld.h> header file. */
+/* #undef HAVE_DLD_H */
+
+/* Define to 1 if you have the `dlopen' function. */
+/* #undef HAVE_DLOPEN */
+
+/* Define to 1 if you have the <editline/history.h> header file. */
+/* #undef HAVE_EDITLINE_HISTORY_H */
+
+/* Define to 1 if you have the <editline/readline.h> header file. */
+/* #undef HAVE_EDITLINE_READLINE_H */
+
+/* Define to 1 if you have the <endian.h> header file. */
+/* #undef HAVE_ENDIAN_H */
+
+/* Define to 1 if you have the `fcvt' function. */
+#define HAVE_FCVT 1
+
+/* Define to 1 if you have the `fdatasync' function. */
+/* #undef HAVE_FDATASYNC */
+
+/* Define to 1 if you have finite(). */
+#define HAVE_FINITE 1
+
+/* Define to 1 if you have the `fpclass' function. */
+/* #undef HAVE_FPCLASS */
+
+/* Define to 1 if you have the `fp_class' function. */
+/* #undef HAVE_FP_CLASS */
+
+/* Define to 1 if you have the `fp_class_d' function. */
+/* #undef HAVE_FP_CLASS_D */
+
+/* Define to 1 if you have the <fp_class.h> header file. */
+/* #undef HAVE_FP_CLASS_H */
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+/* #undef HAVE_FSEEKO */
+
+/* Define to 1 if your compiler understands __func__. */
+#define HAVE_FUNCNAME__FUNC 1
+
+/* Define to 1 if your compiler understands __FUNCTION__. */
+/* #undef HAVE_FUNCNAME__FUNCTION */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+/* #undef HAVE_GETADDRINFO */
+
+/* Define to 1 if you have the `gethostbyname_r' function. */
+/* #undef HAVE_GETHOSTBYNAME_R */
+
+/* Define to 1 if you have the `gethostname' function. */
+/* #undef HAVE_GETHOSTNAME */
+
+/* Define to 1 if you have the `getopt' function. */
+#define HAVE_GETOPT 1
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#define HAVE_GETOPT_H 1
+
+/* Define to 1 if you have the `getopt_long' function. */
+#define HAVE_GETOPT_LONG 1
+
+/* Define to 1 if you have the `getpeereid' function. */
+/* #undef HAVE_GETPEEREID */
+
+/* Define to 1 if you have the `getpwuid_r' function. */
+/* #undef HAVE_GETPWUID_R */
+
+/* Define to 1 if you have the `getrusage' function. */
+/* #undef HAVE_GETRUSAGE */
+
+/* Define to 1 if you have the <history.h> header file. */
+/* #undef HAVE_HISTORY_H */
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+/* #undef HAVE_IEEEFP_H */
+
+/* Define to 1 if you have the `inet_aton' function. */
+/* #undef HAVE_INET_ATON */
+
+/* Define to 1 if the system has the type `int64'. */
+/* #undef HAVE_INT64 */
+
+/* Define to 1 if the system has the type `int8'. */
+/* #undef HAVE_INT8 */
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the global variable 'int optreset'. */
+#define HAVE_INT_OPTRESET 1
+
+/* Define to 1 if you have the global variable 'int timezone'. */
+#define HAVE_INT_TIMEZONE
+
+/* Define to 1 if you have support for IPv6. */
+/* #undef HAVE_IPV6 */
+
+/* Define to 1 if you have isinf(). */
+#define HAVE_ISINF 1
+
+/* Define to 1 if you have the <kernel/image.h> header file. */
+/* #undef HAVE_KERNEL_IMAGE_H */
+
+/* Define to 1 if you have the <kernel/OS.h> header file. */
+/* #undef HAVE_KERNEL_OS_H */
+
+/* Define to 1 if `e_data' is member of `krb5_error'. */
+/* #undef HAVE_KRB5_ERROR_E_DATA */
+
+/* Define to 1 if `text.data' is member of `krb5_error'. */
+/* #undef HAVE_KRB5_ERROR_TEXT_DATA */
+
+/* Define to 1 if `client' is member of `krb5_ticket'. */
+/* #undef HAVE_KRB5_TICKET_CLIENT */
+
+/* Define to 1 if `enc_part2' is member of `krb5_ticket'. */
+/* #undef HAVE_KRB5_TICKET_ENC_PART2 */
+
+/* Define to 1 if you have the <langinfo.h> header file. */
+/* #undef HAVE_LANGINFO_H */
+
+/* Define to 1 if you have the `bind' library (-lbind). */
+/* #undef HAVE_LIBBIND */
+
+/* Define to 1 if you have the `BSD' library (-lBSD). */
+/* #undef HAVE_LIBBSD */
+
+/* Define to 1 if you have the `compat' library (-lcompat). */
+/* #undef HAVE_LIBCOMPAT */
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+/* #undef HAVE_LIBCRYPTO */
+
+/* Define to 1 if you have the `cygipc' library (-lcygipc). */
+/* #undef HAVE_LIBCYGIPC */
+
+/* Define to 1 if you have the `des' library (-ldes). */
+/* #undef HAVE_LIBDES */
+
+/* Define to 1 if you have the `dl' library (-ldl). */
+/* #undef HAVE_LIBDL */
+
+/* Define to 1 if you have the `dld' library (-ldld). */
+/* #undef HAVE_LIBDLD */
+
+/* Define to 1 if you have the `eay32' library (-leay32). */
+#define HAVE_LIBEAY32 1
+
+/* Define to 1 if you have the `gen' library (-lgen). */
+/* #undef HAVE_LIBGEN */
+
+/* Define to 1 if you have the `IPC' library (-lIPC). */
+/* #undef HAVE_LIBIPC */
+
+/* Define to 1 if you have the `krb' library (-lkrb). */
+/* #undef HAVE_LIBKRB */
+
+/* Define to 1 if you have the `lc' library (-llc). */
+/* #undef HAVE_LIBLC */
+
+/* Define to 1 if you have the `ld' library (-lld). */
+/* #undef HAVE_LIBLD */
+
+/* Define to 1 if you have the `m' library (-lm). */
+#define HAVE_LIBM 1
+
+/* Define to 1 if you have the `nsl' library (-lnsl). */
+/* #undef HAVE_LIBNSL */
+
+/* Define to 1 if you have the `pam' library (-lpam). */
+/* #undef HAVE_LIBPAM */
+
+/* Define to 1 if you have the `PW' library (-lPW). */
+/* #undef HAVE_LIBPW */
+
+/* Define if you have a function readline library */
+/* #undef HAVE_LIBREADLINE */
+
+/* Define to 1 if you have the `resolv' library (-lresolv). */
+/* #undef HAVE_LIBRESOLV */
+
+/* Define to 1 if you have the `socket' library (-lsocket). */
+/* #undef HAVE_LIBSOCKET */
+
+/* Define to 1 if you have the `ssl' library (-lssl). */
+/* #undef HAVE_LIBSSL */
+
+/* Define to 1 if you have the `ssleay32' library (-lssleay32). */
+#define HAVE_LIBSSLEAY32 1
+
+/* Define to 1 if you have the `unix' library (-lunix). */
+/* #undef HAVE_LIBUNIX */
+
+/* Define to 1 if you have the `util' library (-lutil). */
+/* #undef HAVE_LIBUTIL */
+
+/* Define to 1 if you have the `wsock32' library (-lwsock32). */
+#define HAVE_LIBWSOCK32 1
+
+/* Define to 1 if you have the `z' library (-lz). */
+#define HAVE_LIBZ 1
+
+/* Define to 1 if constants of type 'long long int' should have the suffix LL.
+ */
+#define HAVE_LL_CONSTANTS 1
+
+/* Define to 1 if `long int' works and is 64 bits. */
+/* #undef HAVE_LONG_INT_64 */
+
+/* Define to 1 if `long long int' works and is 64 bits. */
+#define HAVE_LONG_LONG_INT_64
+
+/* Define to 1 if you have the `memmove' function. */
+#define HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#define HAVE_NETINET_IN_H 1
+
+/* Define to 1 if you have the <netinet/tcp.h> header file. */
+/* #undef HAVE_NETINET_TCP_H */
+
+/* Define to 1 if you have the `on_exit' function. */
+/* #undef HAVE_ON_EXIT */
+
+/* Define to 1 if you have the <pam/pam_appl.h> header file. */
+/* #undef HAVE_PAM_PAM_APPL_H */
+
+/* Define to 1 if you have the `poll' function. */
+/* #undef HAVE_POLL */
+
+/* Define to 1 if you have the <poll.h> header file. */
+/* #undef HAVE_POLL_H */
+
+/* Define to 1 if you have the POSIX signal interface. */
+/* #undef HAVE_POSIX_SIGNALS */
+
+/* Define to 1 if you have the `pstat' function. */
+/* #undef HAVE_PSTAT */
+
+/* Define to 1 if the PS_STRINGS thing exists. */
+/* #undef HAVE_PS_STRINGS */
+
+/* Define if you have POSIX threads libraries and header files. */
+/* #undef HAVE_PTHREAD */
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#define HAVE_PWD_H 1
+
+/* Define to 1 if you have the `random' function. */
+/* #undef HAVE_RANDOM */
+
+/* Define to 1 if you have the <readline.h> header file. */
+/* #undef HAVE_READLINE_H */
+
+/* Define to 1 if you have the <readline/history.h> header file. */
+/* #undef HAVE_READLINE_HISTORY_H */
+
+/* Define to 1 if you have the <readline/readline.h> header file. */
+/* #undef HAVE_READLINE_READLINE_H */
+
+/* Define to 1 if you have the `readlink' function. */
+/* #undef HAVE_READLINK */
+
+/* Define to 1 if you have the `replace_history_entry' function. */
+/* #undef HAVE_REPLACE_HISTORY_ENTRY */
+
+/* Define to 1 if you have the `rint' function. */
+#define HAVE_RINT 1
+
+/* Define to 1 if you have the global variable
+ 'rl_completion_append_character'. */
+/* #undef HAVE_RL_COMPLETION_APPEND_CHARACTER */
+
+/* Define to 1 if you have the `rl_completion_matches' function. */
+/* #undef HAVE_RL_COMPLETION_MATCHES */
+
+/* Define to 1 if you have the `rl_filename_completion_function' function. */
+/* #undef HAVE_RL_FILENAME_COMPLETION_FUNCTION */
+
+/* Define to 1 if you have the <security/pam_appl.h> header file. */
+/* #undef HAVE_SECURITY_PAM_APPL_H */
+
+/* Define to 1 if you have the `setproctitle' function. */
+/* #undef HAVE_SETPROCTITLE */
+
+/* Define to 1 if you have the `setsid' function. */
+/* #undef HAVE_SETSID */
+
+/* Define to 1 if you have the `sigprocmask' function. */
+/* #undef HAVE_SIGPROCMASK */
+
+/* Define to 1 if you have sigsetjmp(). */
+/* #undef HAVE_SIGSETJMP */
+
+/* Define to 1 if the system has the type `sig_atomic_t'. */
+#define HAVE_SIG_ATOMIC_T 1
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have spinlocks. */
+#define HAVE_SPINLOCKS 1
+
+/* Define to 1 if you have the `srandom' function. */
+/* #undef HAVE_SRANDOM */
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strdup' function. */
+#define HAVE_STRDUP 1
+
+/* Define to 1 if you have the `strerror' function. */
+#define HAVE_STRERROR 1
+
+/* Define to 1 if you have the `strerror_r' function. */
+/* #undef HAVE_STRERROR_R */
+
+/* Define to 1 if cpp supports the ANSI # stringizing operator. */
+#define HAVE_STRINGIZE 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strtol' function. */
+#define HAVE_STRTOL 1
+
+/* Define to 1 if you have the `strtoll' function. */
+#define HAVE_STRTOLL 1
+
+/* Define to 1 if you have the `strtoq' function. */
+/* #undef HAVE_STRTOQ */
+
+/* Define to 1 if you have the `strtoul' function. */
+#define HAVE_STRTOUL 1
+
+/* Define to 1 if you have the `strtoull' function. */
+#define HAVE_STRTOULL 1
+
+/* Define to 1 if you have the `strtouq' function. */
+/* #undef HAVE_STRTOUQ */
+
+/* Define to 1 if the system has the type `struct addrinfo'. */
+/* #undef HAVE_STRUCT_ADDRINFO */
+
+/* Define to 1 if the system has the type `struct cmsgcred'. */
+/* #undef HAVE_STRUCT_CMSGCRED */
+
+/* Define to 1 if the system has the type `struct fcred'. */
+/* #undef HAVE_STRUCT_FCRED */
+
+/* Define to 1 if the system has the type `struct option'. */
+#define HAVE_STRUCT_OPTION 1
+
+/* Define to 1 if `sa_len' is member of `struct sockaddr'. */
+/* #undef HAVE_STRUCT_SOCKADDR_SA_LEN */
+
+/* Define to 1 if the system has the type `struct sockaddr_storage'. */
+#define HAVE_STRUCT_SOCKADDR_STORAGE 1
+
+/* Define to 1 if `ss_family' is member of `struct sockaddr_storage'. */
+#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1
+
+/* Define to 1 if `ss_len' is member of `struct sockaddr_storage'. */
+/* #undef HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN */
+
+/* Define to 1 if `__ss_family' is member of `struct sockaddr_storage'. */
+/* #undef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY */
+
+/* Define to 1 if `__ss_len' is member of `struct sockaddr_storage'. */
+/* #undef HAVE_STRUCT_SOCKADDR_STORAGE___SS_LEN */
+
+/* Define to 1 if the system has the type `struct sockaddr_un'. */
+/* #undef HAVE_STRUCT_SOCKADDR_UN */
+
+/* Define to 1 if the system has the type `struct sockcred'. */
+/* #undef HAVE_STRUCT_SOCKCRED */
+
+/* Define to 1 if `tm_zone' is member of `struct tm'. */
+/* #undef HAVE_STRUCT_TM_TM_ZONE */
+
+/* Define to 1 if you have the <SupportDefs.h> header file. */
+/* #undef HAVE_SUPPORTDEFS_H */
+
+/* Define to 1 if you have the `symlink' function. */
+#define HAVE_SYMLINK 1
+
+/* Define to 1 if you have the `sysconf' function. */
+/* #undef HAVE_SYSCONF */
+
+/* Define to 1 if you have the syslog interface. */
+/* #undef HAVE_SYSLOG */
+
+/* Define to 1 if you have the <sys/ipc.h> header file. */
+/* #undef HAVE_SYS_IPC_H */
+
+/* Define to 1 if you have the <sys/poll.h> header file. */
+/* #undef HAVE_SYS_POLL_H */
+
+/* Define to 1 if you have the <sys/pstat.h> header file. */
+/* #undef HAVE_SYS_PSTAT_H */
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+/* #undef HAVE_SYS_SELECT_H */
+
+/* Define to 1 if you have the <sys/sem.h> header file. */
+/* #undef HAVE_SYS_SEM_H */
+
+/* Define to 1 if you have the <sys/shm.h> header file. */
+/* #undef HAVE_SYS_SHM_H */
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/un.h> header file. */
+/* #undef HAVE_SYS_UN_H */
+
+/* Define to 1 if you have the <termios.h> header file. */
+/* #undef HAVE_TERMIOS_H */
+
+/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use
+ `HAVE_STRUCT_TM_TM_ZONE' instead. */
+/* #undef HAVE_TM_ZONE */
+
+/* Define to 1 if you have the `towlower' function. */
+#define HAVE_TOWLOWER 1
+
+/* Define to 1 if you have the external array `tzname'. */
+/* #undef HAVE_TZNAME */
+
+/* Define to 1 if the system has the type `uint64'. */
+/* #undef HAVE_UINT64 */
+
+/* Define to 1 if the system has the type `uint8'. */
+/* #undef HAVE_UINT8 */
+
+/* Define to 1 if the system has the type `union semun'. */
+/* #undef HAVE_UNION_SEMUN */
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have unix sockets. */
+/* #undef HAVE_UNIX_SOCKETS */
+
+/* Define to 1 if you have the `unsetenv' function. */
+/* #undef HAVE_UNSETENV */
+
+/* Define to 1 if you have the `utime' function. */
+#define HAVE_UTIME 1
+
+/* Define to 1 if you have the `utimes' function. */
+/* #undef HAVE_UTIMES */
+
+/* Define to 1 if you have the <utime.h> header file. */
+#define HAVE_UTIME_H 1
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `waitpid' function. */
+/* #undef HAVE_WAITPID */
+
+/* Define to 1 if you have the <wchar.h> header file. */
+#define HAVE_WCHAR_H 1
+
+/* Define to 1 if you have the `wcstombs' function. */
+#define HAVE_WCSTOMBS 1
+
+/* Define to 1 if you have the <wctype.h> header file. */
+#define HAVE_WCTYPE_H 1
+
+/* Define to the appropriate snprintf format for 64-bit ints, if any. */
+#define INT64_FORMAT "%I64d"
+
+/* Define to build with Kerberos 4 support. (--with-krb4) */
+/* #undef KRB4 */
+
+/* Define to build with Kerberos 5 support. (--with-krb5) */
+/* #undef KRB5 */
+
+/* Define to the location of locale files. */
+#define LOCALEDIR "/usr/local/pgsql/share/locale"
+
+/* Define as the maximum alignment requirement of any C data type. */
+#define MAXIMUM_ALIGNOF 8
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "pgsql-bugs at postgresql.org"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "PostgreSQL"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "PostgreSQL 8.0.1"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "postgresql"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "8.0.1"
+
+/* Define to the name of the PostgreSQL service principal in Kerberos.
+ (--with-krb-srvnam=NAME) */
+#define PG_KRB_SRVNAM "postgres"
+
+/* PostgreSQL version */
+#define PG_VERSION "8.0.1"
+
+/* A string containing the version number, platform, and C compiler */
+#define PG_VERSION_STR "PostgreSQL 8.0.1 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special)"
+
+/* Define to the necessary symbol if this constant uses a non-standard name on
+ your system. */
+/* #undef PTHREAD_CREATE_JOINABLE */
+
+/* The size of a `unsigned long', as computed by sizeof. */
+#define SIZEOF_UNSIGNED_LONG 4
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if strerror_r() returns a int. */
+/* #undef STRERROR_R_INT */
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+/* #undef TM_IN_SYS_TIME */
+
+/* Define to the appropriate snprintf format for unsigned 64-bit ints, if any.
+ */
+#define UINT64_FORMAT "%I64u"
+
+/* Define to 1 to build with assertion checks. (--enable-cassert) */
+/* #undef USE_ASSERT_CHECKING */
+
+/* Define to 1 if you want 64-bit integer timestamp and interval support.
+ (--enable-integer-datetimes) */
+/* #undef USE_INTEGER_DATETIMES */
+
+/* Define to select named POSIX semaphores. */
+/* #undef USE_NAMED_POSIX_SEMAPHORES */
+
+/* Define to 1 to build with PAM support. (--with-pam) */
+/* #undef USE_PAM */
+
+/* Define to 1 to build with Rendezvous support. (--with-rendezvous) */
+/* #undef USE_RENDEZVOUS */
+
+/* Define to build with (Open)SSL support. (--with-openssl) */
+#define USE_SSL 1
+
+/* Define to select SysV-style semaphores. */
+#define USE_SYSV_SEMAPHORES 1
+
+/* Define to select SysV-style shared memory. */
+#define USE_SYSV_SHARED_MEMORY 1
+
+/* Define to select unnamed POSIX semaphores. */
+/* #undef USE_UNNAMED_POSIX_SEMAPHORES */
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+/* #undef _LARGEFILE_SOURCE */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define as `__inline' if that's what the C compiler calls it, or to nothing
+ if it is not supported. */
+/* #undef inline */
+
+/* Define to empty if the C compiler does not understand signed types. */
+/* #undef signed */
+
+/* Define to empty if the keyword `volatile' does not work. Warning: valid
+ code using `volatile' can become incorrect without. Disable with care. */
+/* #undef volatile */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pg_config_manual.h b/src/terralib/drivers/PostgreSQL/includepg/pg_config_manual.h
new file mode 100644
index 0000000..040651f
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pg_config_manual.h
@@ -0,0 +1,229 @@
+/*------------------------------------------------------------------------
+ * PostgreSQL manual configuration settings
+ *
+ * This file contains various configuration symbols and limits. In
+ * all cases, changing them is only useful in very rare situations or
+ * for developers. If you edit any of these, be sure to do a *full*
+ * rebuild (and an initdb if noted).
+ *
+ * $PostgreSQL: pgsql/src/include/pg_config_manual.h,v 1.15 2004/09/10 14:27:37 momjian Exp $
+ *------------------------------------------------------------------------
+ */
+
+/*
+ * Size of a disk block --- this also limits the size of a tuple. You
+ * can set it bigger if you need bigger tuples (although TOAST should
+ * reduce the need to have large tuples, since fields can be spread
+ * across multiple tuples).
+ *
+ * BLCKSZ must be a power of 2. The maximum possible value of BLCKSZ
+ * is currently 2^15 (32768). This is determined by the 15-bit widths
+ * of the lp_off and lp_len fields in ItemIdData (see
+ * include/storage/itemid.h).
+ *
+ * Changing BLCKSZ requires an initdb.
+ */
+#define BLCKSZ 8192
+
+/*
+ * RELSEG_SIZE is the maximum number of blocks allowed in one disk
+ * file. Thus, the maximum size of a single file is RELSEG_SIZE *
+ * BLCKSZ; relations bigger than that are divided into multiple files.
+ *
+ * RELSEG_SIZE * BLCKSZ must be less than your OS' limit on file size.
+ * This is often 2 GB or 4GB in a 32-bit operating system, unless you
+ * have large file support enabled. By default, we make the limit 1
+ * GB to avoid any possible integer-overflow problems within the OS.
+ * A limit smaller than necessary only means we divide a large
+ * relation into more chunks than necessary, so it seems best to err
+ * in the direction of a small limit. (Besides, a power-of-2 value
+ * saves a few cycles in md.c.)
+ *
+ * Changing RELSEG_SIZE requires an initdb.
+ */
+#define RELSEG_SIZE (0x40000000 / BLCKSZ)
+
+/*
+ * XLOG_SEG_SIZE is the size of a single WAL file. This must be a power of 2
+ * and larger than BLCKSZ (preferably, a great deal larger than BLCKSZ).
+ *
+ * Changing XLOG_SEG_SIZE requires an initdb.
+ */
+#define XLOG_SEG_SIZE (16*1024*1024)
+
+/*
+ * Maximum number of columns in an index and maximum number of
+ * arguments to a function. They must be the same value.
+ *
+ * The minimum value is 8 (index creation uses 8-argument functions).
+ * There is no specific upper limit, although large values will waste
+ * system-table space and processing time.
+ *
+ * Changing these requires an initdb.
+ */
+#define INDEX_MAX_KEYS 32
+#define FUNC_MAX_ARGS INDEX_MAX_KEYS
+
+/*
+ * Define this to make libpgtcl's "pg_result -assign" command process
+ * C-style backslash sequences in returned tuple data and convert
+ * PostgreSQL array values into Tcl lists. CAUTION: This conversion
+ * is *wrong* unless you install the routines in
+ * contrib/string/string_io to make the server produce C-style
+ * backslash sequences in the first place.
+ */
+/* #define TCL_ARRAYS */
+
+/*
+ * User locks are handled totally on the application side as long term
+ * cooperative locks which extend beyond the normal transaction
+ * boundaries. Their purpose is to indicate to an application that
+ * someone is `working' on an item. Define this flag to enable user
+ * locks. You will need the loadable module user-locks.c to use this
+ * feature.
+ */
+#define USER_LOCKS
+
+/*
+ * Define this if you want psql to _always_ ask for a username and a
+ * password for password authentication.
+ */
+/* #define PSQL_ALWAYS_GET_PASSWORDS */
+
+/*
+ * Define this if you want to allow the lo_import and lo_export SQL
+ * functions to be executed by ordinary users. By default these
+ * functions are only available to the Postgres superuser. CAUTION:
+ * These functions are SECURITY HOLES since they can read and write
+ * any file that the PostgreSQL server has permission to access. If
+ * you turn this on, don't say we didn't warn you.
+ */
+/* #define ALLOW_DANGEROUS_LO_FUNCTIONS */
+
+/*
+ * MAXPGPATH: standard size of a pathname buffer in PostgreSQL (hence,
+ * maximum usable pathname length is one less).
+ *
+ * We'd use a standard system header symbol for this, if there weren't
+ * so many to choose from: MAXPATHLEN, MAX_PATH, PATH_MAX are all
+ * defined by different "standards", and often have different values
+ * on the same platform! So we just punt and use a reasonably
+ * generous setting here.
+ */
+#define MAXPGPATH 1024
+
+/*
+ * PG_SOMAXCONN: maximum accept-queue length limit passed to
+ * listen(2). You'd think we should use SOMAXCONN from
+ * <sys/socket.h>, but on many systems that symbol is much smaller
+ * than the kernel's actual limit. In any case, this symbol need be
+ * twiddled only if you have a kernel that refuses large limit values,
+ * rather than silently reducing the value to what it can handle
+ * (which is what most if not all Unixen do).
+ */
+#define PG_SOMAXCONN 10000
+
+/*
+ * You can try changing this if you have a machine with bytes of
+ * another size, but no guarantee...
+ */
+#define BITS_PER_BYTE 8
+
+/*
+ * Preferred alignment for disk I/O buffers. On some CPUs, copies between
+ * user space and kernel space are significantly faster if the user buffer
+ * is aligned on a larger-than-MAXALIGN boundary. Ideally this should be
+ * a platform-dependent value, but for now we just hard-wire it.
+ */
+#define ALIGNOF_BUFFER 32
+
+/*
+ * Disable UNIX sockets for those operating system.
+ */
+#if defined(__QNX__) || defined(__BEOS__) || defined(WIN32)
+#undef HAVE_UNIX_SOCKETS
+#endif
+
+/*
+ * Define this if your operating system supports link()
+ */
+#if !defined(__QNX__) && !defined(__BEOS__) && \
+ !defined(WIN32) && !defined(__CYGWIN__)
+#define HAVE_WORKING_LINK 1
+#endif
+
+/*
+ * This is the default directory in which AF_UNIX socket files are
+ * placed. Caution: changing this risks breaking your existing client
+ * applications, which are likely to continue to look in the old
+ * directory. But if you just hate the idea of sockets in /tmp,
+ * here's where to twiddle it. You can also override this at runtime
+ * with the postmaster's -k switch.
+ */
+#define DEFAULT_PGSOCKET_DIR "/tmp"
+
+/*
+ * The random() function is expected to yield values between 0 and
+ * MAX_RANDOM_VALUE. Currently, all known implementations yield
+ * 0..2^31-1, so we just hardwire this constant. We could do a
+ * configure test if it proves to be necessary. CAUTION: Think not to
+ * replace this with RAND_MAX. RAND_MAX defines the maximum value of
+ * the older rand() function, which is often different from --- and
+ * considerably inferior to --- random().
+ */
+#define MAX_RANDOM_VALUE (0x7FFFFFFF)
+
+
+/*
+ *------------------------------------------------------------------------
+ * The following symbols are for enabling debugging code, not for
+ * controlling user-visible features or resource limits.
+ *------------------------------------------------------------------------
+ */
+
+/*
+ * Define this to cause pfree()'d memory to be cleared immediately, to
+ * facilitate catching bugs that refer to already-freed values. XXX
+ * Right now, this gets defined automatically if --enable-cassert. In
+ * the long term it probably doesn't need to be on by default.
+ */
+#ifdef USE_ASSERT_CHECKING
+#define CLOBBER_FREED_MEMORY
+#endif
+
+/*
+ * Define this to check memory allocation errors (scribbling on more
+ * bytes than were allocated). Right now, this gets defined
+ * automatically if --enable-cassert. In the long term it probably
+ * doesn't need to be on by default.
+ */
+#ifdef USE_ASSERT_CHECKING
+#define MEMORY_CONTEXT_CHECKING
+#endif
+
+/*
+ * Define this to force all parse and plan trees to be passed through
+ * copyObject(), to facilitate catching errors and omissions in
+ * copyObject().
+ */
+/* #define COPY_PARSE_PLAN_TREES */
+
+/*
+ * Enable debugging print statements for lock-related operations.
+ */
+/* #define LOCK_DEBUG */
+
+/*
+ * Enable debugging print statements for WAL-related operations; see
+ * also the wal_debug GUC var.
+ */
+/* #define WAL_DEBUG */
+
+/*
+ * Other debug #defines (documentation, anyone?)
+ */
+/* #define IPORTAL_DEBUG */
+/* #define HEAPDEBUGALL */
+/* #define ACLDEBUG */
+/* #define RTDEBUG */
+/* #define GISTDEBUG */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pg_config_os.h b/src/terralib/drivers/PostgreSQL/includepg/pg_config_os.h
new file mode 100644
index 0000000..9049fb4
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pg_config_os.h
@@ -0,0 +1,244 @@
+/* $PostgreSQL: pgsql/src/include/port/win32.h,v 1.42 2004/12/26 19:20:33 tgl Exp $ */
+
+/* undefine and redefine after #include */
+#undef mkdir
+
+#undef ERROR
+#include <windows.h>
+#include <winsock.h>
+#include <process.h>
+#include <signal.h>
+#include <errno.h>
+
+#undef near
+
+/* Must be here to avoid conflicting with prototype in windows.h */
+#define mkdir(a,b) mkdir(a)
+
+
+#define fsync(a) _commit(a)
+#define ftruncate(a,b) chsize(a,b)
+
+#define USES_WINSOCK
+
+/* defines for dynamic linking on Win32 platform */
+#if defined(__MINGW32__) || defined(__CYGWIN__)
+
+#if __GNUC__ && ! defined (__declspec)
+#error You need egcs 1.1 or newer for compiling!
+#endif
+
+#ifdef BUILDING_DLL
+#define DLLIMPORT __declspec (dllexport)
+#else /* not BUILDING_DLL */
+#define DLLIMPORT __declspec (dllimport)
+#endif
+
+#elif defined(WIN32_CLIENT_ONLY)
+
+#if defined(_DLL)
+#define DLLIMPORT __declspec (dllexport)
+#else /* not _DLL */
+#define DLLIMPORT __declspec (dllimport)
+#endif
+
+#else /* not CYGWIN, not MSVC, not MingW */
+
+#define DLLIMPORT
+#endif
+
+/*
+ * IPC defines
+ */
+#undef HAVE_UNION_SEMUN
+#define HAVE_UNION_SEMUN 1
+
+#define IPC_RMID 256
+#define IPC_CREAT 512
+#define IPC_EXCL 1024
+#define IPC_PRIVATE 234564
+#define IPC_NOWAIT 2048
+#define IPC_STAT 4096
+
+#define EACCESS 2048
+#define EIDRM 4096
+
+#define SETALL 8192
+#define GETNCNT 16384
+#define GETVAL 65536
+#define SETVAL 131072
+#define GETPID 262144
+
+/*
+ * Shared memory
+ */
+struct shmid_ds
+{
+ int dummy;
+ int shm_nattch;
+};
+
+int shmdt(const void *shmaddr);
+void *shmat(int memId, void *shmaddr, int flag);
+int shmctl(int shmid, int flag, struct shmid_ds * dummy);
+int shmget(int memKey, int size, int flag);
+
+
+/*
+ * Semaphores
+ */
+union semun
+{
+ int val;
+ struct semid_ds *buf;
+ unsigned short *array;
+};
+
+struct sembuf
+{
+ int sem_flg;
+ int sem_op;
+ int sem_num;
+};
+
+int semctl(int semId, int semNum, int flag, union semun);
+int semget(int semKey, int semNum, int flags);
+int semop(int semId, struct sembuf * sops, int flag);
+
+
+/*
+ * Signal stuff
+ */
+#define WEXITSTATUS(w) (((w) >> 8) & 0xff)
+#define WIFEXITED(w) (((w) & 0xff) == 0)
+#define WIFSIGNALED(w) (((w) & 0x7f) > 0 && (((w) & 0x7f) < 0x7f))
+#define WTERMSIG(w) ((w) & 0x7f)
+
+#define sigmask(sig) ( 1 << ((sig)-1) )
+
+/* Signal function return values */
+#undef SIG_DFL
+#undef SIG_ERR
+#undef SIG_IGN
+#define SIG_DFL ((pqsigfunc)0)
+#define SIG_ERR ((pqsigfunc)-1)
+#define SIG_IGN ((pqsigfunc)1)
+
+/* Some extra signals */
+#define SIGHUP 1
+#define SIGQUIT 3
+#define SIGTRAP 5
+#define SIGABRT 22 /* Set to match W32 value -- not UNIX
+ * value */
+#define SIGKILL 9
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGSTOP 17
+#define SIGTSTP 18
+#define SIGCONT 19
+#define SIGCHLD 20
+#define SIGTTIN 21
+#define SIGTTOU 22 /* Same as SIGABRT -- no problem, I hope */
+#define SIGWINCH 28
+#define SIGUSR1 30
+#define SIGUSR2 31
+
+struct timezone
+{
+ int tz_minuteswest; /* Minutes west of GMT. */
+ int tz_dsttime; /* Nonzero if DST is ever in effect. */
+};
+
+/* for setitimer in backend/port/win32/timer.c */
+#define ITIMER_REAL 0
+struct itimerval
+{
+ struct timeval it_interval;
+ struct timeval it_value;
+};
+int setitimer(int which, const struct itimerval * value, struct itimerval * ovalue);
+
+
+/*
+ * Supplement to <sys/types.h>.
+ *
+ * Perl already has conflicting defines for uid_t and gid_t.
+ */
+#ifndef PLPERL_HAVE_UID_GID
+typedef int uid_t;
+typedef int gid_t;
+#else
+/* These are redefined by perl. */
+#define uid_t int
+#define gid_t int
+#endif
+typedef long key_t;
+
+#ifdef WIN32_CLIENT_ONLY
+typedef int pid_t;
+#endif
+
+/*
+ * Supplement to <sys/stat.h>.
+ */
+#define lstat(path, sb) stat((path), (sb))
+
+/*
+ * Supplement to <errno.h>.
+ */
+#undef EAGAIN
+#undef EINTR
+#define EINTR WSAEINTR
+#define EAGAIN WSAEWOULDBLOCK
+#define EMSGSIZE WSAEMSGSIZE
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#define ECONNRESET WSAECONNRESET
+#define EINPROGRESS WSAEINPROGRESS
+#define ENOBUFS WSAENOBUFS
+#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
+#define ECONNREFUSED WSAECONNREFUSED
+#define EBADFD WSAENOTSOCK
+#define EOPNOTSUPP WSAEOPNOTSUPP
+
+
+/* In backend/port/win32/signal.c */
+extern DLLIMPORT HANDLE pgwin32_signal_event;
+extern HANDLE pgwin32_initial_signal_pipe;
+
+void pgwin32_signal_initialize(void);
+HANDLE pgwin32_create_signal_listener(pid_t pid);
+void pgwin32_dispatch_queued_signals(void);
+void pg_queue_signal(int signum);
+
+#ifndef FRONTEND
+#define pg_usleep(t) pgwin32_backend_usleep(t)
+void pgwin32_backend_usleep(long microsec);
+#endif
+
+/* In backend/port/win32/socket.c */
+#ifndef FRONTEND
+#define socket(af, type, protocol) pgwin32_socket(af, type, protocol)
+#define accept(s, addr, addrlen) pgwin32_accept(s, addr, addrlen)
+#define connect(s, name, namelen) pgwin32_connect(s, name, namelen)
+#define select(n, r, w, e, timeout) pgwin32_select(n, r, w, e, timeout)
+#define recv(s, buf, len, flags) pgwin32_recv(s, buf, len, flags)
+#define send(s, buf, len, flags) pgwin32_send(s, buf, len, flags)
+
+SOCKET pgwin32_socket(int af, int type, int protocol);
+SOCKET pgwin32_accept(SOCKET s, struct sockaddr * addr, int *addrlen);
+int pgwin32_connect(SOCKET s, const struct sockaddr * name, int namelen);
+int pgwin32_select(int nfds, fd_set *readfs, fd_set *writefds, fd_set *exceptfds, const struct timeval * timeout);
+int pgwin32_recv(SOCKET s, char *buf, int len, int flags);
+int pgwin32_send(SOCKET s, char *buf, int len, int flags);
+
+const char *pgwin32_socket_strerror(int err);
+int pgwin32_waitforsinglesocket(SOCKET s, int what);
+
+/* in backend/port/win32/security.c */
+extern int pgwin32_is_admin(void);
+extern int pgwin32_is_service(void);
+#endif
+
+/* in backend/port/win32/error.c */
+extern void _dosmaperr(unsigned long);
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pgtypes_date.h b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_date.h
new file mode 100644
index 0000000..8a98c71
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_date.h
@@ -0,0 +1,27 @@
+#ifndef PGTYPES_DATETIME
+#define PGTYPES_DATETIME
+
+#include <pgtypes_timestamp.h>
+
+typedef long date;
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+extern date PGTYPESdate_from_asc(char *, char **);
+extern char *PGTYPESdate_to_asc(date);
+extern date PGTYPESdate_from_timestamp(timestamp);
+extern void PGTYPESdate_julmdy(date, int *);
+extern void PGTYPESdate_mdyjul(int *, date *);
+extern int PGTYPESdate_dayofweek(date);
+extern void PGTYPESdate_today(date *);
+extern int PGTYPESdate_defmt_asc(date *, char *, char *);
+extern int PGTYPESdate_fmt_asc(date, char *, char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PGTYPES_DATETIME */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pgtypes_error.h b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_error.h
new file mode 100644
index 0000000..4a1008a
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_error.h
@@ -0,0 +1,15 @@
+#define PGTYPES_NUM_OVERFLOW 301
+#define PGTYPES_NUM_BAD_NUMERIC 302
+#define PGTYPES_NUM_DIVIDE_ZERO 303
+
+#define PGTYPES_DATE_BAD_DATE 310
+#define PGTYPES_DATE_ERR_EARGS 311
+#define PGTYPES_DATE_ERR_ENOSHORTDATE 312
+#define PGTYPES_DATE_ERR_ENOTDMY 313
+#define PGTYPES_DATE_BAD_DAY 314
+#define PGTYPES_DATE_BAD_MONTH 315
+
+#define PGTYPES_TS_BAD_TIMESTAMP 320
+#define PGTYPES_TS_ERR_EINFTIME 321
+
+#define PGTYPES_INTVL_BAD_INTERVAL 330
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pgtypes_interval.h b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_interval.h
new file mode 100644
index 0000000..fba723f
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_interval.h
@@ -0,0 +1,30 @@
+#ifndef PGTYPES_INTERVAL
+#define PGTYPES_INTERVAL
+
+typedef struct
+{
+#ifdef HAVE_INT64_TIMESTAMP
+ int64 time; /* all time units other than months and
+ * years */
+#else
+ double time; /* all time units other than months and
+ * years */
+#endif
+ long month; /* months and years, after time for
+ * alignment */
+} interval;
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+extern interval *PGTYPESinterval_from_asc(char *, char **);
+extern char *PGTYPESinterval_to_asc(interval *);
+extern int PGTYPESinterval_copy(interval *, interval *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PGTYPES_INTERVAL */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pgtypes_numeric.h b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_numeric.h
new file mode 100644
index 0000000..7085672
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_numeric.h
@@ -0,0 +1,68 @@
+#ifndef PGTYPES_NUMERIC
+#define PGTYPES_NUMERIC
+
+#define NUMERIC_POS 0x0000
+#define NUMERIC_NEG 0x4000
+#define NUMERIC_NAN 0xC000
+#define NUMERIC_MAX_PRECISION 1000
+#define NUMERIC_MAX_DISPLAY_SCALE NUMERIC_MAX_PRECISION
+#define NUMERIC_MIN_DISPLAY_SCALE 0
+#define NUMERIC_MIN_SIG_DIGITS 16
+
+#define DECSIZE 30
+
+typedef unsigned char NumericDigit;
+typedef struct
+{
+ int ndigits; /* number of digits in digits[] - can be
+ * 0! */
+ int weight; /* weight of first digit */
+ int rscale; /* result scale */
+ int dscale; /* display scale */
+ int sign; /* NUMERIC_POS, NUMERIC_NEG, or
+ * NUMERIC_NAN */
+ NumericDigit *buf; /* start of alloc'd space for digits[] */
+ NumericDigit *digits; /* decimal digits */
+} numeric;
+
+typedef struct
+{
+ int ndigits; /* number of digits in digits[] - can be
+ * 0! */
+ int weight; /* weight of first digit */
+ int rscale; /* result scale */
+ int dscale; /* display scale */
+ int sign; /* NUMERIC_POS, NUMERIC_NEG, or
+ * NUMERIC_NAN */
+ NumericDigit digits[DECSIZE]; /* decimal digits */
+} decimal;
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+numeric *PGTYPESnumeric_new(void);
+void PGTYPESnumeric_free(numeric *);
+numeric *PGTYPESnumeric_from_asc(char *, char **);
+char *PGTYPESnumeric_to_asc(numeric *, int);
+int PGTYPESnumeric_add(numeric *, numeric *, numeric *);
+int PGTYPESnumeric_sub(numeric *, numeric *, numeric *);
+int PGTYPESnumeric_mul(numeric *, numeric *, numeric *);
+int PGTYPESnumeric_div(numeric *, numeric *, numeric *);
+int PGTYPESnumeric_cmp(numeric *, numeric *);
+int PGTYPESnumeric_from_int(signed int, numeric *);
+int PGTYPESnumeric_from_long(signed long int, numeric *);
+int PGTYPESnumeric_copy(numeric *, numeric *);
+int PGTYPESnumeric_from_double(double, numeric *);
+int PGTYPESnumeric_to_double(numeric *, double *);
+int PGTYPESnumeric_to_int(numeric *, int *);
+int PGTYPESnumeric_to_long(numeric *, long *);
+int PGTYPESnumeric_to_decimal(numeric *, decimal *);
+int PGTYPESnumeric_from_decimal(decimal *, numeric *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PGTYPES_NUMERIC */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pgtypes_timestamp.h b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_timestamp.h
new file mode 100644
index 0000000..8b3bf94
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_timestamp.h
@@ -0,0 +1,33 @@
+#ifndef PGTYPES_TIMESTAMP
+#define PGTYPES_TIMESTAMP
+
+#include <pgtypes_interval.h>
+
+#ifdef HAVE_INT64_TIMESTAMP
+typedef int64 timestamp;
+typedef int64 TimestampTz;
+
+#else
+typedef double timestamp;
+typedef double TimestampTz;
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+extern timestamp PGTYPEStimestamp_from_asc(char *, char **);
+extern char *PGTYPEStimestamp_to_asc(timestamp);
+extern int PGTYPEStimestamp_sub(timestamp *, timestamp *, interval *);
+extern int PGTYPEStimestamp_fmt_asc(timestamp *, char *, int, char *);
+extern void PGTYPEStimestamp_current(timestamp *);
+extern int PGTYPEStimestamp_defmt_asc(char *, char *, timestamp *);
+extern int PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout);
+extern int PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PGTYPES_TIMESTAMP */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/postgres_ext.h b/src/terralib/drivers/PostgreSQL/includepg/postgres_ext.h
new file mode 100644
index 0000000..efffad2
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/postgres_ext.h
@@ -0,0 +1,69 @@
+/*-------------------------------------------------------------------------
+ *
+ * postgres_ext.h
+ *
+ * This file contains declarations of things that are visible everywhere
+ * in PostgreSQL *and* are visible to clients of frontend interface libraries.
+ * For example, the Oid type is part of the API of libpq and other libraries.
+ *
+ * Declarations which are specific to a particular interface should
+ * go in the header file for that interface (such as libpq-fe.h). This
+ * file is only for fundamental Postgres declarations.
+ *
+ * User-written C functions don't count as "external to Postgres."
+ * Those function much as local modifications to the backend itself, and
+ * use header files that are otherwise internal to Postgres to interface
+ * with the backend.
+ *
+ * $PostgreSQL: pgsql/src/include/postgres_ext.h,v 1.16 2004/08/29 05:06:55 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef POSTGRES_EXT_H
+#define POSTGRES_EXT_H
+
+/*
+ * Object ID is a fundamental type in Postgres.
+ */
+typedef unsigned int Oid;
+
+#ifdef __cplusplus
+#define InvalidOid (Oid(0))
+#else
+#define InvalidOid ((Oid) 0)
+#endif
+
+#define OID_MAX UINT_MAX
+/* you will need to include <limits.h> to use the above #define */
+
+
+/*
+ * NAMEDATALEN is the max length for system identifiers (e.g. table names,
+ * attribute names, function names, etc). It must be a multiple of
+ * sizeof(int) (typically 4).
+ *
+ * NOTE that databases with different NAMEDATALEN's cannot interoperate!
+ */
+#define NAMEDATALEN 64
+
+
+/*
+ * Identifiers of error message fields. Kept here to keep common
+ * between frontend and backend, and also to export them to libpq
+ * applications.
+ */
+#define PG_DIAG_SEVERITY 'S'
+#define PG_DIAG_SQLSTATE 'C'
+#define PG_DIAG_MESSAGE_PRIMARY 'M'
+#define PG_DIAG_MESSAGE_DETAIL 'D'
+#define PG_DIAG_MESSAGE_HINT 'H'
+#define PG_DIAG_STATEMENT_POSITION 'P'
+#define PG_DIAG_INTERNAL_POSITION 'p'
+#define PG_DIAG_INTERNAL_QUERY 'q'
+#define PG_DIAG_CONTEXT 'W'
+#define PG_DIAG_SOURCE_FILE 'F'
+#define PG_DIAG_SOURCE_LINE 'L'
+#define PG_DIAG_SOURCE_FUNCTION 'R'
+
+#endif
diff --git a/src/terralib/drivers/PostgreSQL/includepg/sql3types.h b/src/terralib/drivers/PostgreSQL/includepg/sql3types.h
new file mode 100644
index 0000000..6909f2c
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/sql3types.h
@@ -0,0 +1,48 @@
+#ifndef _ECPG_SQL3TYPES_H
+#define _ECPG_SQL3TYPES_H
+
+/* SQL3 dynamic type codes
+ *
+ * Copyright (c) 2000, Christof Petig <christof.petig at wtal.de>
+ *
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/include/sql3types.h,v 1.10 2004/08/29 05:06:59 momjian Exp $
+ */
+
+/* chapter 13.1 table 2: Codes used for SQL data types in Dynamic SQL */
+
+enum
+{
+ SQL3_CHARACTER = 1,
+ SQL3_NUMERIC,
+ SQL3_DECIMAL,
+ SQL3_INTEGER,
+ SQL3_SMALLINT,
+ SQL3_FLOAT,
+ SQL3_REAL,
+ SQL3_DOUBLE_PRECISION,
+ SQL3_DATE_TIME_TIMESTAMP,
+ SQL3_INTERVAL, /* 10 */
+ SQL3_CHARACTER_VARYING = 12,
+ SQL3_ENUMERATED,
+ SQL3_BIT,
+ SQL3_BIT_VARYING,
+ SQL3_BOOLEAN,
+ SQL3_abstract
+ /* the rest is xLOB stuff */
+};
+
+/* chapter 13.1 table 3: Codes associated with datetime data types in Dynamic SQL */
+
+enum
+{
+ SQL3_DDT_DATE = 1,
+ SQL3_DDT_TIME,
+ SQL3_DDT_TIMESTAMP,
+ SQL3_DDT_TIME_WITH_TIME_ZONE,
+ SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE,
+
+ SQL3_DDT_ILLEGAL /* not a datetime data type (not part of
+ * standard) */
+};
+
+#endif /* !_ECPG_SQL3TYPES_H */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/sqlca.h b/src/terralib/drivers/PostgreSQL/includepg/sqlca.h
new file mode 100644
index 0000000..aaf97d0
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/sqlca.h
@@ -0,0 +1,66 @@
+#ifndef POSTGRES_SQLCA_H
+#define POSTGRES_SQLCA_H
+
+#ifndef DLLIMPORT
+#if defined(WIN32) || defined(__CYGWIN__)
+#define DLLIMPORT __declspec (dllimport)
+#else
+#define DLLIMPORT
+#endif /* __CYGWIN__ */
+#endif /* DLLIMPORT */
+
+#define SQLERRMC_LEN 70
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+struct sqlca_t
+{
+ char sqlcaid[8];
+ long sqlabc;
+ long sqlcode;
+ struct
+ {
+ int sqlerrml;
+ char sqlerrmc[SQLERRMC_LEN];
+ } sqlerrm;
+ char sqlerrp[8];
+ long sqlerrd[6];
+ /* Element 0: empty */
+ /* 1: OID of processed tuple if applicable */
+ /* 2: number of rows processed */
+ /* after an INSERT, UPDATE or */
+ /* DELETE statement */
+ /* 3: empty */
+ /* 4: empty */
+ /* 5: empty */
+ char sqlwarn[8];
+ /* Element 0: set to 'W' if at least one other is 'W' */
+ /* 1: if 'W' at least one character string */
+ /* value was truncated when it was */
+ /* stored into a host variable. */
+
+ /*
+ * 2: if 'W' a (hopefully) non-fatal notice occurred
+ */ /* 3: empty */
+ /* 4: empty */
+ /* 5: empty */
+ /* 6: empty */
+ /* 7: empty */
+
+ char sqlstate[5];
+};
+
+struct sqlca_t *ECPGget_sqlca(void);
+
+#ifndef POSTGRES_ECPG_INTERNAL
+#define sqlca (*ECPGget_sqlca())
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/terralib/functions/TeAddressLocator.cpp b/src/terralib/functions/TeAddressLocator.cpp
new file mode 100644
index 0000000..5d32a15
--- /dev/null
+++ b/src/terralib/functions/TeAddressLocator.cpp
@@ -0,0 +1,3357 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ * TODO: 1. Usar os 5 primeiros d�gitos do CEP para desempatar, pois eles levam
+ * ao bairro.
+ */
+
+#include "TeAddressLocator.h"
+#include "TeUtils.h"
+
+#include "TeProgress.h"
+#include "TeAsciiFile.h"
+#include "TeVectorRemap.h"
+
+#include <string>
+
+using namespace std;
+
+double TeSimilarity(const char* streetname, const char* rotuloname);
+
+void validColumnName(TeAttributeRep& rep, TeAttributeList& attrList)
+{
+ unsigned int nStep = attrList.size();
+
+ string repName = TeConvertToUpperCase(rep.name_);
+
+ bool alter = true;
+
+ while(alter)
+ {
+ alter = false;
+
+ for(unsigned int i = 0; i < nStep; ++i)
+ {
+ if(TeConvertToUpperCase(attrList[i].rep_.name_) == repName)
+ {
+ rep.name_ += "_";
+ alter = true;
+ repName = TeConvertToUpperCase(rep.name_);
+ }
+ }
+ }
+}
+
+void tokenize(const string& name, vector<string>& tokens)
+{
+ unsigned int nStep = name.size();
+
+ string token = "";
+
+ unsigned int i = 0;
+
+ for(i = 0; i < nStep; ++i)
+ {
+ if(name[i] != ' ')
+ token += name[i];
+ else
+ {
+ if(!token.empty())
+ {
+ tokens.push_back(token);
+ token = "";
+ }
+ }
+ }
+
+ if(!token.empty())
+ tokens.push_back(token);
+}
+
+//---- TeAddressLocator methods
+
+bool TeAddressLocator::createAddressMetadataTable(void)
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ if(db_->tableExist("te_address_locator"))
+ {
+ // Verificar se a coluna com o nome completo existe.
+ // Nas vers�es anteriores essa coluna n�o era usada.
+
+ TeAttribute attr;
+
+ if(!db_->columnExist("te_address_locator", "location_full_name", attr))
+ {
+ // Se a coluna n�o existe, tenta adicionar a coluna � tabela de metadado
+ TeAttribute at10;
+ at10.rep_.type_ = TeSTRING;
+ at10.rep_.name_ = "location_full_name";
+ at10.rep_.numChar_ = 255;
+
+ if(!db_->addColumn("te_address_locator", at10.rep_))
+ {
+ errMsg_ = "Couldn't add location_full_name column to te_address_locator table!";
+
+ return false;
+ }
+ }
+
+
+ errMsg_ = "The te_address_locator table already exist!";
+
+ return false;
+ }
+
+ TeAttributeList attList;
+
+ TeAttribute at1;
+ at1.rep_.type_ = TeINT;
+ at1.rep_.name_ = "table_id";
+ at1.rep_.isPrimaryKey_ = true;
+ at1.rep_.isAutoNumber_ = false;
+ attList.push_back(at1);
+
+ TeAttribute at2;
+ at2.rep_.type_ = TeSTRING;
+ at2.rep_.name_ = "initial_left_number";
+ at2.rep_.numChar_ = 255;
+ attList.push_back(at2);
+
+ TeAttribute at3;
+ at3.rep_.type_ = TeSTRING;
+ at3.rep_.name_ = "final_left_number";
+ at3.rep_.numChar_ = 255;
+ attList.push_back(at3);
+
+ TeAttribute at4;
+ at4.rep_.type_ = TeSTRING;
+ at4.rep_.name_ = "initial_right_number";
+ at4.rep_.numChar_ = 255;
+ attList.push_back(at4);
+
+ TeAttribute at5;
+ at5.rep_.type_ = TeSTRING;
+ at5.rep_.name_ = "final_right_number";
+ at5.rep_.numChar_ = 255;
+ attList.push_back(at5);
+
+ TeAttribute at6;
+ at6.rep_.type_ = TeSTRING;
+ at6.rep_.name_ = "location_type";
+ at6.rep_.numChar_ = 255;
+ attList.push_back(at6);
+
+ TeAttribute at7;
+ at7.rep_.type_ = TeSTRING;
+ at7.rep_.name_ = "location_title";
+ at7.rep_.numChar_ = 255;
+ attList.push_back(at7);
+
+ TeAttribute at8;
+ at8.rep_.type_ = TeSTRING;
+ at8.rep_.name_ = "location_preposition";
+ at8.rep_.numChar_ = 255;
+ attList.push_back(at8);
+
+ TeAttribute at9;
+ at9.rep_.type_ = TeSTRING;
+ at9.rep_.name_ = "location_name";
+ at9.rep_.numChar_ = 255;
+ attList.push_back(at9);
+
+ TeAttribute at10;
+ at10.rep_.type_ = TeSTRING;
+ at10.rep_.name_ = "location_full_name";
+ at10.rep_.numChar_ = 255;
+ attList.push_back(at10);
+
+
+ TeAttribute at11;
+ at11.rep_.type_ = TeSTRING;
+ at11.rep_.name_ = "left_neighborhood";
+ at11.rep_.numChar_ = 255;
+ attList.push_back(at11);
+
+ TeAttribute at12;
+ at12.rep_.type_ = TeSTRING;
+ at12.rep_.name_ = "right_neighborhood";
+ at12.rep_.numChar_ = 255;
+ attList.push_back(at12);
+
+ TeAttribute at13;
+ at13.rep_.type_ = TeSTRING;
+ at13.rep_.name_ = "left_zip_code";
+ at13.rep_.numChar_ = 255;
+ attList.push_back(at13);
+
+ TeAttribute at14;
+ at14.rep_.type_ = TeSTRING;
+ at14.rep_.name_ = "right_zip_code";
+ at14.rep_.numChar_ = 255;
+ attList.push_back(at14);
+
+ if(!db_->createTable("te_address_locator", attList))
+ {
+ errMsg_ = "Could not create te_address_locator table!";
+
+ return false;
+ }
+
+ if(!db_->createRelation("address_locator_relation", "te_address_locator", "table_id", "te_layer_table", "table_id", true))
+ {
+ errMsg_ = "Referential integrity could not be stabilished beteween te_address_locator and te_layer_table tables!";
+
+ return false;
+ }
+
+ return true;
+}
+
+bool TeAddressLocator::insertAddressMetadata(const TeAddressMetadata& metadata)
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ string sql = "INSERT INTO te_address_locator (table_id, initial_left_number, ";
+ sql += "final_left_number, initial_right_number, final_right_number, ";
+ sql += "location_type, location_title, location_preposition, location_name, location_full_name, left_neighborhood, right_neighborhood, ";
+ sql += "left_zip_code, right_zip_code) VALUES(";
+ sql += Te2String(metadata.tableId_);
+ sql += ", '";
+ sql += metadata.initialLeftNumber_;
+ sql += "', '";
+ sql += metadata.finalLeftNumber_;
+ sql += "', '";
+ sql += metadata.initialRightNumber_;
+ sql += "', '";
+ sql += metadata.finalRightNumber_;
+ sql += "', '";
+ sql += metadata.locationType_;
+ sql += "', '";
+ sql += metadata.locationTitle_;
+ sql += "', '";
+ sql += metadata.locationPreposition_;
+ sql += "', '";
+ sql += metadata.locationName_;
+ sql += "', '";
+ sql += metadata.locationCompleteName_;
+ sql += "', '";
+ sql += metadata.leftNeighborhood_;
+ sql += "', '";
+ sql += metadata.rightNeighborhood_;
+ sql += "', '";
+ sql += metadata.leftZipCode_;
+ sql += "', '";
+ sql += metadata.rightZipCode_;
+ sql += "')";
+
+ if(!db_->execute(sql))
+ {
+ errMsg_ = "Could not insert metadata information about geocoding base table!";
+
+ return false;
+ }
+
+ return loadAddressMetadata(metadata.tableId_);
+
+ //if(!metadata.leftZipCode_.empty())
+ // removeHifen_ = verifyHifen(metadata_.tableName_, metadata.leftZipCode_);
+
+ //return true;
+}
+
+bool TeAddressLocator::updateAddressMetadata(const TeAddressMetadata& metadata)
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ //if(metadata_.tableId_ != metadata.tableId_)
+ // return false; // Doesn't update a diferent attribute table....
+
+ string sql = "UPDATE te_address_locator SET initial_left_number = '";
+ sql += metadata.initialLeftNumber_;
+ sql += "', final_left_number = '";
+ sql += metadata.finalLeftNumber_;
+ sql += "', initial_right_number = '";
+ sql += metadata.initialRightNumber_;
+ sql += "', final_right_number = '";
+ sql += metadata.finalRightNumber_;
+ sql += "', location_type = '";
+ sql += metadata.locationType_;
+ sql += "', location_title = '";
+ sql += metadata.locationTitle_;
+ sql += "', location_preposition = '";
+ sql += metadata.locationPreposition_;
+ sql += "', location_name = '";
+ sql += metadata.locationName_;
+ sql += "', location_full_name = '";
+ sql += metadata.locationCompleteName_;
+ sql += "', left_neighborhood = '";
+ sql += metadata.leftNeighborhood_;
+ sql += "', right_neighborhood = '";
+ sql += metadata.rightNeighborhood_;
+ sql += "', left_zip_code = '";
+ sql += metadata.leftZipCode_;
+ sql += "', right_zip_code = '";
+ sql += metadata.rightZipCode_;
+ sql += "' WHERE table_id = ";
+ sql += Te2String(metadata.tableId_);
+
+ if(!db_->execute(sql))
+ {
+ errMsg_ = "Could not update metadata information about geocoding base table!";
+
+ return false;
+ }
+
+ return loadAddressMetadata(metadata.tableId_);
+
+ //if(!metadata.leftZipCode_.empty())
+ // removeHifen_ = verifyHifen(metadata_.tableName_, metadata.leftZipCode_);
+
+ //return true;
+}
+
+bool TeAddressLocator::deleteAddressMetadata(const int& tableId)
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ string sql = "DELETE FROM te_address_locator WHERE table_id = ";
+ sql += Te2String(tableId);
+
+ if(db_->execute(sql))
+ return true;
+ else
+ {
+ errMsg_ = "Could not remove metadata information about geocoding base table!";
+
+ return false;
+ }
+}
+
+bool TeAddressLocator::loadAddressMetadata(const int& tableId)
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ isMetadataLoaded_ = false;
+
+ TeDatabasePortal* portal = db_->getPortal();
+
+ if(!portal)
+ return false;
+
+ string sql = "SELECT te_address_locator.*, te_layer_table.attr_table, te_layer_table.attr_link, te_layer.layer_id";
+ sql += " FROM te_address_locator, te_layer_table, te_layer ";
+ sql += " WHERE te_layer_table.layer_id = te_layer.layer_id ";
+ sql += " AND ";
+ sql += " te_address_locator.table_id = te_layer_table.table_id ";
+ sql += " AND ";
+ sql += " te_address_locator.table_id = ";
+ sql += Te2String(tableId);
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+
+ errMsg_ = "Could not find metadata for geocoding base table!";
+
+ return false;
+ }
+
+ fillAddressMetadata(metadata_, portal);
+
+ int layerId = portal->getInt("layer_id");
+
+ referenceLayer_ = db_->layerMap()[layerId];
+
+ delete portal;
+
+ if(referenceLayer_ == 0)
+ {
+ errMsg_ = "Could not find infolayer to be used as base for geocoding!";
+
+ return false;
+ }
+
+ isMetadataLoaded_ = true;
+
+
+ if(!metadata_.leftZipCode_.empty())
+ removeHifen_ = !verifyHifen(metadata_.tableName_, metadata_.leftZipCode_);
+
+ return true;
+}
+
+bool TeAddressLocator::setAddressLocatorMetadata(const TeAddressMetadata& m)
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ TeDatabasePortal* portal = db_->getPortal();
+
+ if(!portal)
+ return false;
+
+ string sql = "SELECT te_layer.layer_id";
+ sql += " FROM te_layer_table, te_layer ";
+ sql += " WHERE te_layer_table.layer_id = te_layer.layer_id ";
+ sql += " AND ";
+ sql += " te_layer_table.table_id = ";
+ sql += Te2String(m.tableId_);
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+
+ errMsg_ = "Could not find layer for geocoding base table!";
+
+ return false;
+ }
+
+ int layerId = portal->getInt("layer_id");
+
+ referenceLayer_ = db_->layerMap()[layerId];
+
+ if(referenceLayer_ == 0)
+ {
+ errMsg_ = "Could not find infolayer to be used as base for geocoding!";
+
+ return false;
+ }
+
+ metadata_ = m;
+
+ isMetadataLoaded_ = true;
+
+ if(!metadata_.leftZipCode_.empty())
+ removeHifen_ = !verifyHifen(metadata_.tableName_, metadata_.leftZipCode_);
+
+ return true;
+}
+
+bool TeAddressLocator::getAllAddressMetadataLayer(const int& layerId, vector<TeAddressMetadata>& addVec)
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ TeDatabasePortal* portal = db_->getPortal();
+
+ if(!portal)
+ return false;
+
+ string sql = "SELECT te_address_locator.*, te_layer_table.attr_table, te_layer_table.attr_link, te_layer.layer_id ";
+ sql += " FROM te_address_locator, te_layer_table, te_layer ";
+ sql += " WHERE te_layer_table.layer_id = te_layer.layer_id ";
+ sql += " AND ";
+ sql += " te_address_locator.table_id = te_layer_table.table_id ";
+ sql += " AND ";
+ sql += " te_layer_table.layer_id = ";
+ sql += Te2String(layerId);
+ sql += " ORDER BY te_layer_table.table_id";
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ TeAddressMetadata m;
+
+ this->fillAddressMetadata(m, portal);
+
+ addVec.push_back(m);
+ }
+
+ delete portal;
+
+ return true;
+}
+
+bool TeAddressLocator::getAllAddressMetadataTheme(const int& themeId, vector<TeAddressMetadata>& addVec)
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ TeDatabasePortal* portal = db_->getPortal();
+
+ if(!portal)
+ return false;
+
+ string sql = "SELECT te_address_locator.*, te_layer_table.attr_table, te_layer_table.attr_link, te_layer.layer_id";
+ sql += " FROM te_theme_table, te_layer_table, te_address_locator, te_layer ";
+ sql += " WHERE te_layer_table.layer_id = te_layer.layer_id ";
+ sql += " AND ";
+ sql += " te_layer_table.table_id = te_address_locator.table_id ";
+ sql += " AND ";
+ sql += " te_theme_table.table_id = te_layer_table.table_id ";
+ sql += " AND ";
+ sql += " te_theme_table.theme_id = ";
+ sql += Te2String(themeId);
+ sql += " ORDER BY te_theme_table.table_id";
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ TeAddressMetadata m;
+
+ this->fillAddressMetadata(m, portal);
+
+ addVec.push_back(m);
+ }
+
+ delete portal;
+
+ return true;
+}
+
+bool TeAddressLocator::getAddressLocatorLayers(vector<pair<int, string> >& layerNameVec)
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ TeDatabasePortal* portal = db_->getPortal();
+
+ if(!portal)
+ return false;
+
+ string sql = "SELECT DISTINCT te_layer.layer_id, te_layer.name ";
+ sql += " FROM te_address_locator, te_layer_table, te_layer ";
+ sql += " WHERE te_layer.layer_id = te_layer_table.layer_id ";
+ sql += " AND ";
+ sql += " te_address_locator.table_id = te_layer_table.table_id ";
+ sql += " ORDER BY te_layer.name ASC";
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ pair<int, string> d(atoi(portal->getData(0)), portal->getData(1));
+ layerNameVec.push_back(d);
+ }
+
+ delete portal;
+
+ return true;
+}
+
+bool TeAddressLocator::getAddressLocatorLayerTables(vector<pair<int, string> >& tableNameVec, const int& layerId)
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ TeDatabasePortal* portal = db_->getPortal();
+
+ if(!portal)
+ return false;
+
+ string sql = "SELECT te_layer_table.table_id, te_layer_table.attr_table ";
+ sql += " FROM te_address_locator, te_layer_table ";
+ sql += " WHERE te_layer_table.table_id = te_address_locator.table_id";
+ sql += " AND ";
+ sql += " te_layer_table.layer_id = ";
+ sql += Te2String(layerId);
+ sql += " ORDER BY te_layer_table.attr_table ASC";
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ pair<int, string> d(atoi(portal->getData(0)), portal->getData(1));
+ tableNameVec.push_back(d);
+ }
+
+ delete portal;
+
+ return true;
+}
+
+bool TeAddressLocator::findGeocodingTables(vector<pair<int, string> >& tableNames)
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ string sql = "SELECT * FROM te_layer_table WHERE attr_table_type = ";
+ sql += Te2String(TeGeocodingData);
+ sql += " ORDER BY attr_table";
+
+ TeDatabasePortal* portal = db_->getPortal();
+
+ if(!portal)
+ return false;
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ pair<int, string> d(atoi(portal->getData("table_id")), portal->getData("attr_table"));
+ tableNames.push_back(d);
+ }
+
+ delete portal;
+
+ return true;
+}
+
+
+// 8 -> Found by similar search
+// 9 -> Found by neighborhood or zip code
+
+// 10 -> Found by name location and number without type
+// 11 -> Found multiples by name location and number without type
+// 12 -> Found by name location without number and type
+// 13 -> Found multiples by name location without number and type
+
+// 14 -> Found by name location and number without type and title
+// 15 -> Found multiples by name location and number without type and title
+// 16 -> Found by name location without number and type and title
+// 17 -> Found multiples by name location without number and type and title
+
+// 18 -> Found by name location and number without type, title and preposition
+// 19 -> Found multiples by name location and number without type, title and preposition
+// 20 -> Found by name location without number and type, title and preposition
+// 21 -> Found multiples by name location without number and type, title and preposition
+
+
+
+int TeAddressLocator::findAddress(const TeAddress& address, vector<TeAddressDescription>& addressesFound, const bool& doExaustiveSearch)
+{
+ TeAddress addAux = address;
+
+ string fullName = "";
+
+ normalizeAddress(addAux, fullName);
+
+ if(fullName.empty())
+ return 2;
+
+ // Encontra exato com n�mero
+ int result = findExact(addAux, fullName, true, addressesFound);
+
+ if(result > 3)
+ return result;
+
+ // Encontra exato sem n�mero
+ result = findExact(addAux, fullName, false, addressesFound);
+
+ if(result > 3)
+ return result;
+
+ // Encontrar com a ajuda do dicion�rio sem n�mero
+ if(!dictionary_.empty())
+ {
+ // Dicion�rio com n�mero
+ result = findWithDictionary(addAux, fullName, true, addressesFound);
+
+ if(result > 3)
+ return result;
+
+
+ // Dicion�rio sem n�mero
+ result = findWithDictionary(addAux, fullName, false, addressesFound);
+
+ if(result > 3)
+ return result;
+ }
+
+ // ***********************************
+ // * Try to search by a similar name *
+ // ***********************************
+ TeAddressDescription descript;
+
+ if((addAux.locationNumber_ != 0) && findSimilarAddress(addAux, fullName, descript))
+ {
+ addressesFound.clear();
+ addressesFound.push_back(descript);
+
+ return 8;
+ }
+
+ if(doExaustiveSearch)
+ {
+ // Tenta remover o tipo
+ if(!typesVector_.empty())
+ {
+ result = findWithoutAllName(addAux, fullName, addressesFound, true);
+
+ switch(result)
+ {
+ case 4 : return 10;
+ case 5 : return 11;
+ case 6 : return 12;
+ case 7 : return 13;
+ }
+ }
+
+
+ // Tenta remover titulo
+ if(!titlesVector_.empty())
+ {
+ result = findWithoutAllName(addAux, fullName, addressesFound, true, true);
+
+ switch(result)
+ {
+ case 4 : return 14;
+ case 5 : return 15;
+ case 6 : return 16;
+ case 7 : return 17;
+ }
+ }
+
+
+ // Tenta remover preposicao
+ if(!prepositionsVector_.empty())
+ {
+ result = findWithoutAllName(addAux, fullName, addressesFound, true, true, true);
+
+ switch(result)
+ {
+ case 4 : return 18;
+ case 5 : return 19;
+ case 6 : return 20;
+ case 7 : return 21;
+ }
+ }
+ }
+
+
+ // *****************************************
+ // * Try to match zip code or neighborhood *
+ // *****************************************
+ if(cmetadata_.centroidLayer_)
+ {
+ if(findByCentroid(addAux, addressesFound))
+ {
+ if(addressesFound.size() > 1)
+ return 1;
+ else
+ return 9;
+ }
+ }
+
+ return result;
+}
+
+
+int TeAddressLocator::findWithDictionary(const TeAddress& address, const string& fullName, const bool& withNumber, vector<TeAddressDescription>& addressesFound)
+{
+ // Quebrar o nome em tokens
+ vector<string> tokens;
+ tokenize(fullName, tokens);
+
+
+ // Para cada token, procurar um sin�nimo
+ for(unsigned int i = 0; i < tokens.size(); ++i)
+ {
+ pair<TeGeocoderDictionary::iterator, TeGeocoderDictionary::iterator> itRange = dictionary_.equal_range(tokens[i]);
+
+ while(itRange.first != itRange.second)
+ {
+ // Monta o nome para pesquisa
+ string str = "";
+
+ for(unsigned int j = 0; j < tokens.size(); ++j)
+ {
+ if(j != 0)
+ str += " ";
+
+ if(j == i)
+ str += (itRange.first)->second;
+ else
+ str += tokens[j];
+ }
+
+ // Fazer a pesquisa exata
+ int res = findExact(address, str, withNumber, addressesFound);
+
+ if(res > 3)
+ return res;
+
+ ++(itRange.first);
+ }
+ }
+
+ return 1;
+}
+
+int TeAddressLocator::findWithoutAllName(const TeAddress& address, const string& fullName, vector<TeAddressDescription>& addressesFound, const bool& disabletype, const bool& disabletitle, const bool& disablepreposition)
+{
+ // Quebrar o nome em tokens
+ vector<string> tokens;
+ tokenize(fullName, tokens);
+
+ string str = "";
+
+ bool typeYetDisabled = false;
+ bool titleYetDisabled = false;
+ bool prepositionYetDisabled = false;
+
+ unsigned int i = 0;
+
+ // Ve se precisa eliminar algum token e j� tenta sem usar dicion�rio
+ for(i = 0; i < tokens.size(); ++i)
+ {
+ string aux = tokens[i];
+
+ // verifica se o string ser� eliminado caso o tipo esteja desabilitado
+ if(disabletype)
+ {
+ if(binary_search(typesVector_.begin(), typesVector_.end(), aux))
+ {
+ aux = "";
+ typeYetDisabled = true;
+ continue;
+ }
+ }
+
+ if(disabletitle)
+ {
+ if(binary_search(titlesVector_.begin(), titlesVector_.end(), aux))
+ {
+ aux = "";
+ titleYetDisabled = true;
+ continue;
+ }
+
+ }
+
+ if(disablepreposition && !prepositionYetDisabled)
+ {
+ if(binary_search(prepositionsVector_.begin(), prepositionsVector_.end(), aux))
+ {
+ aux = "";
+ prepositionYetDisabled = true;
+ continue;
+ }
+ }
+
+ if(!str.empty())
+ str += " ";
+
+ str += aux;
+ }
+
+ int res = 1;
+
+ if(typeYetDisabled || titleYetDisabled || prepositionYetDisabled)
+ {
+ res = findPattern(address, str, true, addressesFound, disabletype, disabletitle, disablepreposition);
+
+ if(res > 3)
+ return res;
+ }
+
+ if(typeYetDisabled || titleYetDisabled || prepositionYetDisabled)
+ {
+ res = findPattern(address, str, false, addressesFound, disabletype, disabletitle, disablepreposition);
+
+ if(res > 3)
+ return res;
+ }
+
+ if(dictionary_.empty())
+ return 1;
+
+ // Para cada token, procurar um sin�nimo
+ for(i = 0; i < tokens.size(); ++i)
+ {
+ pair<TeGeocoderDictionary::iterator, TeGeocoderDictionary::iterator> itRange = dictionary_.equal_range(tokens[i]);
+
+
+ while(itRange.first != itRange.second)
+ {
+ // Monta o nome para pesquisa
+ str = "";
+ typeYetDisabled = false;
+ titleYetDisabled = false;
+ prepositionYetDisabled = false;
+
+
+ for(unsigned int j = 0; j < tokens.size(); ++j)
+ {
+ string aux = "";
+
+ if(j == i)
+ {
+ aux = (itRange.first)->second;
+ }
+ else
+ {
+ aux = tokens[j];
+ }
+
+ // verifica se o string ser� eliminado caso o tipo esteja desabilitado
+ if(disabletype)
+ {
+ if(binary_search(typesVector_.begin(), typesVector_.end(), aux))
+ {
+ aux = "";
+ typeYetDisabled = true;
+ continue;
+ }
+ }
+
+ if(disabletitle)
+ {
+ if(binary_search(titlesVector_.begin(), titlesVector_.end(), aux))
+ {
+ aux = "";
+ titleYetDisabled = true;
+ continue;
+ }
+
+ }
+
+ if(disablepreposition && !prepositionYetDisabled)
+ {
+ if(binary_search(prepositionsVector_.begin(), prepositionsVector_.end(), aux))
+ {
+ aux = "";
+ prepositionYetDisabled = true;
+ continue;
+ }
+ }
+
+ if(!str.empty())
+ str += " ";
+
+ str += aux;
+ }
+
+ if(typeYetDisabled || titleYetDisabled || prepositionYetDisabled)
+ {
+ res = findPattern(address, str, true, addressesFound, disabletype, disabletitle, disablepreposition);
+
+ if(res > 3)
+ return res;
+ }
+
+ if(typeYetDisabled || titleYetDisabled || prepositionYetDisabled)
+ {
+ res = findPattern(address, str, false, addressesFound, disabletype, disabletitle, disablepreposition);
+
+ if(res > 3)
+ return res;
+ }
+
+ ++(itRange.first);
+ }
+ }
+
+ return 1;
+}
+
+// 0 -> Database connection problem
+// 1 -> Address not found
+// 3 -> Error on query the database
+// 4 -> Found by name location and number
+// 5 -> Found multiples by name location and number
+// 6 -> Found by name location without number
+// 7 -> Found multiples by name location without number
+int TeAddressLocator::findExact(const TeAddress& address, const string& fullName, const bool& withNumber, vector<TeAddressDescription>& addressesFound)
+{
+ TeAddress addressToFind = address;
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return 0;
+ }
+
+ // The status of a query
+ bool executeQuery = false;
+
+ // String with the result query expression
+ string strSQL = "";
+
+ // String with the select...from clause
+ string strSelect = "SELECT * FROM ";
+ strSelect += metadata_.tableName_;
+
+ // String with the where clause;
+ string strWhere = " WHERE ";
+
+ // **************************************************
+ // * Try to match name an number *
+ // **************************************************
+ {
+ int auxNumber = addressToFind.locationNumber_ ;
+
+ if(!withNumber)
+ addressToFind.locationNumber_ = 0;
+
+ strWhere += mountExactWhereSQL(addressToFind, fullName);
+
+ strSQL = strSelect + strWhere;
+
+ queryAddresses(strSQL, executeQuery, addressesFound);
+
+ if(addressesFound.size() > 0)
+ {
+ if((addressesFound.size() > 1) && (!addressToFind.zipCode_.empty()))
+ this->refineFoundedLocationsByZipCode(addressToFind, addressesFound);
+
+ if((addressesFound.size() > 1) && (!addressToFind.neighborhood_.empty()))
+ this->refineFoundedLocationsByNeighBorhood(addressToFind, addressesFound);
+
+ if((addressesFound.size() > 1) && (!metadata_.leftZipCode_.empty() || !metadata_.rightZipCode_.empty()) && (addressToFind.locationNumber_ == 0))
+ {
+ addressToFind.locationNumber_ = auxNumber;
+
+ refineFoundedLocationsByNumberZipCode(addressToFind, addressesFound);
+
+ addressToFind.locationNumber_ = 0;
+ }
+ else if((addressesFound.size() > 1) && (addressToFind.locationNumber_ == 0))
+ {
+ addressToFind.locationNumber_ = auxNumber;
+
+ refineFoundedLocationsByNumberNeighboor(addressToFind, addressesFound);
+
+ addressToFind.locationNumber_ = 0;
+ }
+
+
+ if(addressesFound.size() > 1)
+ {
+ if(addressToFind.locationNumber_ == 0)
+ return 7;
+ else
+ return 5;
+ }
+ else
+ {
+ if(addressToFind.locationNumber_ == 0)
+ return 6;
+ else
+ return 4;
+ }
+ }
+ }
+
+ // ***************************************************************************
+ // * If we are here so we did not find any address or the queries were wrong *
+ // ***************************************************************************
+ if(executeQuery)
+ return 1; // If at leat one query was executed, return not found any address
+ else
+ return 3; // Otherwise return an error on all queries
+}
+
+int TeAddressLocator::findPattern(const TeAddress& address, const string& fullName, const bool& withNumber, vector<TeAddressDescription>& addressesFound, const bool& disabletype, const bool& disabletitle, const bool& disablepreposition)
+{
+ TeAddress addressToFind = address;
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return 0;
+ }
+
+ // The status of a query
+ bool executeQuery = false;
+
+ // String with the result query expression
+ string strSQL = "";
+
+ // String with the select...from clause
+ string strSelect = "SELECT * FROM ";
+ strSelect += metadata_.tableName_;
+
+ // String with the where clause;
+ string strWhere = " WHERE ";
+
+ // **************************************************
+ // * Try to match name an number *
+ // **************************************************
+ {
+ int auxNumber = addressToFind.locationNumber_ ;
+
+ if(!withNumber)
+ addressToFind.locationNumber_ = 0;
+
+ if(!metadata_.locationType_.empty() || !metadata_.locationTitle_.empty() || !metadata_.locationPreposition_.empty())
+ strWhere += mountPatternWhereSQL(addressToFind, fullName, disabletype, disabletitle, disablepreposition);
+ else
+ strWhere += mountLikeWhereSQL(addressToFind, fullName);
+
+ strSQL = strSelect + strWhere;
+
+ queryAddresses(strSQL, executeQuery, addressesFound);
+
+ if(addressesFound.size() > 0)
+ {
+ if(!metadata_.locationType_.empty() || !metadata_.locationTitle_.empty() || !metadata_.locationPreposition_.empty())
+ cleanAddressesFound(fullName, addressesFound, disabletype, disabletitle, disablepreposition);
+
+ if(addressesFound.size() > 0)
+ {
+ if((addressesFound.size() > 1) && (!addressToFind.zipCode_.empty()))
+ this->refineFoundedLocationsByZipCode(addressToFind, addressesFound);
+
+ if((addressesFound.size() > 1) && (!addressToFind.neighborhood_.empty()))
+ this->refineFoundedLocationsByNeighBorhood(addressToFind, addressesFound);
+
+ if((addressesFound.size() > 1) && (!metadata_.leftZipCode_.empty() || !metadata_.rightZipCode_.empty()) && (addressToFind.locationNumber_ == 0))
+ {
+ addressToFind.locationNumber_ = auxNumber;
+
+ refineFoundedLocationsByNumberZipCode(addressToFind, addressesFound);
+
+ addressToFind.locationNumber_ = 0;
+ }
+ else if((addressesFound.size() > 1) && (addressToFind.locationNumber_ == 0))
+ {
+ addressToFind.locationNumber_ = auxNumber;
+
+ refineFoundedLocationsByNumberNeighboor(addressToFind, addressesFound);
+
+ addressToFind.locationNumber_ = 0;
+ }
+
+
+ if(addressesFound.size() > 1)
+ {
+ if(addressToFind.locationNumber_ == 0)
+ return 7;
+ else
+ return 5;
+ }
+ else
+ {
+ if(addressToFind.locationNumber_ == 0)
+ return 6;
+ else
+ return 4;
+ }
+ }
+ }
+ }
+
+ // ***************************************************************************
+ // * If we are here so we did not find any address or the queries were wrong *
+ // ***************************************************************************
+ if(executeQuery)
+ return 1; // If at leat one query was executed, return not found any address
+ else
+ return 3; // Otherwise return an error on all queries
+}
+
+
+bool TeAddressLocator::addressGeocode(TeGeocodeTableMetadata& tableMetadata,
+ const string& newLayerName,
+ const string& reportName,
+ const string& reportDir,
+ const bool& doExaustive,
+ TeAbstractAddressNotifyFunctor* /* notifyFunction */)
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return 0;
+ }
+
+ if(tableMetadata.locationNameColumnName_.empty())
+ {
+ errMsg_ = "The name field must be filled!";
+
+ return false;
+ }
+
+ // Verifica se o metadado para o processo de espacializa��o foi previamente carregado
+ if(!isMetadataLoaded())
+ {
+ errMsg_ = "Load metadata for geocoding layer before!";
+
+ return false;
+ }
+
+ // Verifica se o metadado para o processo de espacializa��o foi previamente carregado
+ if(metadata_.locationCompleteName_.empty())
+ {
+ errMsg_ = "Please, check the configuration for geocoding layer before! The complete name is empty!";
+
+ return false;
+ }
+
+
+
+ // Carrega os tipos, preposi��es e t�tulos existentes na base para poder
+ // realizar substitui��es nos nomes de endere�os no caso da pesquisa alternativa
+ if(!loadAddressCompoundNames())
+ {
+ return false;
+ }
+
+ // Verifica se os metadados dos layers foram carregados
+ if(db_->layerMap().empty())
+ {
+ if(!db_->loadLayerSet())
+ {
+ errMsg_ = "Could not load infolayers metadata!";
+
+ return false;
+ }
+ }
+
+ // Verifica se j� existe um layer com o nome escolhido
+ if(db_->layerExist(newLayerName))
+ {
+ errMsg_ = "There is another infolayer with the same name!";
+
+ return false;
+ }
+
+ // Tenta acrescentar as duas colunas de relat�rio
+ pair<string, string> newCols;
+ if(!addReportColumn(tableMetadata, newCols))
+ return false;
+
+ // Recupera as informa��es da tabela a ser geocodificada
+ if(!findTableMetadata(tableMetadata))
+ return false;
+
+ // Tenta pegar o portal para a tabela a ser geocodificada
+ int nlo = 0;
+ TeDatabasePortal* portal = getAddressTablePortal(tableMetadata, nlo);
+
+ if(!portal)
+ return false;
+
+ // Cria um novo layer baseado no layer selecionado
+ TeLayer* newLayer = new TeLayer(newLayerName, db_, referenceLayer_->box(), referenceLayer_->projection());
+
+ // Se n�o conseguir criar a representa��o de pontos, aborta a opera��o.
+ if(!newLayer->addGeometry(TePOINTS))
+ {
+ errMsg_ = "Could not add point representation for new layer!";
+
+ db_->deleteLayer(newLayer->id());
+
+ //delete newLayer;
+
+ delete portal;
+
+ return false;
+ }
+
+ // Navega pelos registros da tabela a ser espacializada determinando os endere�os
+ TePointSet pSet;
+
+ int lo = 0;
+
+ if(TeProgress::instance())
+ {
+ TeProgress::instance()->setTotalSteps(nlo);
+ TeProgress::instance()->setCaption("Address Geocoding");
+ TeProgress::instance()->setMessage("Geocoding addresses... ");
+ }
+
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+ t2 = clock();
+ t0 = t1 = t2;
+
+ string reportText = "===> FINAL REPORT OF ADDRESS GEOCODING PROCESS <===\n";
+ reportText += " ========================================= \n";
+ reportText += "\n\n\n";
+
+ reportText += " ---------------------------------\n\n";
+ reportText += "SEARCHED ADDRESS|FOUND ADDRESS\n";
+ reportText += "--------------------------------------------------------------------------------\n";
+ reportText += "GEOCODING RESULT|UNIQUE ID|TYPE|TITLE|PREPOSITION|LOCATION NAME|NUMBER|NEIGHBOR|ZIPCODE|FOUND ADDRESS====>|UNIQUE ID|TYPE|TITLE|PREPOSITION|LOCATION NAME|INITIAL LEFT|FINAL LEFT|INITIAL RIGHT|FINAL RIGHT|FOUND LEFT NEIGHBOOR|FOUND RIGHT NEIGHBOR|FOUND LEFT ZIPCODE|FOUND RIGHT ZIPCODE\n";
+
+ string reportSummary = "===> FINAL REPORT OF ADDRESS GEOCODING PROCESS <===\n";
+ reportSummary += " ========================================= \n";
+ reportSummary += "\n\n\n";
+
+
+ string reportFileSummary = reportDir + "/" + reportName + "_summary.txt";
+ string reportFile = reportDir + "/" + reportName + ".txt";
+
+ TeWriteToFile(reportFile, reportText, "w");
+ TeWriteToFile(reportFileSummary, reportSummary, "w");
+
+ vector<int> summarySum;
+ unsigned int summaryLen = 22;
+ for(unsigned int i = 0; i < summaryLen; ++i)
+ summarySum.push_back(0);
+
+
+ do
+ {
+ if(TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ errMsg_ = "The process was canceled by user!";
+
+ db_->deleteLayer(newLayer->id());
+
+ delete portal;
+
+ return false;
+ }
+
+ TeAddress add;
+
+ fillAddress(add, tableMetadata, portal);
+
+ ++lo;
+
+ vector<TeAddressDescription> addressesFound;
+
+ int status = findAddress(add, addressesFound, doExaustive);
+
+ summarySum[status] = summarySum[status] + 1;
+
+ string reportLine = Te2String(status);
+ reportLine += "|";
+
+ // SEARCHED LOCATION
+ reportLine += add.locationLink_;
+ reportLine += "|";
+ reportLine += add.locationType_;
+ reportLine += "|";
+ reportLine += add.locationTitle_;
+ reportLine += "|";
+ reportLine += add.locationPreposition_;
+ reportLine += "|";
+ reportLine += add.locationName_;
+ reportLine += "|";
+ reportLine += Te2String(add.locationNumber_);
+ reportLine += "|";
+ reportLine += add.neighborhood_;
+ reportLine += "|";
+ reportLine += add.zipCode_;
+ reportLine += "|***********|";
+
+
+ if(status >= 4) // Encontrou algum endere�o?
+ {
+ TeAddressDescription addDescSimilar = addressesFound[0];
+
+ if(status != 9)
+ findCoordinate(add, addDescSimilar);
+
+ // REPORT LINE
+
+
+ // FOUNDED LOCATION
+ reportLine += addDescSimilar.locationLink_;
+ reportLine += "|";
+ reportLine += addDescSimilar.locationType_;
+ reportLine += "|";
+ reportLine += addDescSimilar.locationTitle_;
+ reportLine += "|";
+ reportLine += addDescSimilar.locationPreposition_;
+ reportLine += "|";
+ reportLine += (addDescSimilar.locationName_.empty()) ? addDescSimilar.locationCompleteName_ : addDescSimilar.locationName_ ;
+ reportLine += "|";
+ reportLine += Te2String(addDescSimilar.initialLeftNumber_);
+ reportLine += "|";
+ reportLine += Te2String(addDescSimilar.finalLeftNumber_);
+ reportLine += "|";
+ reportLine += Te2String(addDescSimilar.initialRightNumber_);
+ reportLine += "|";
+ reportLine += Te2String(addDescSimilar.finalRightNumber_);
+ reportLine += "|";
+ reportLine += addDescSimilar.leftNeighborhood_;
+ reportLine += "|";
+ reportLine += addDescSimilar.rightNeighborhood_;
+ reportLine += "|";
+ reportLine += addDescSimilar.leftZipCode_;
+ reportLine += "|";
+ reportLine += addDescSimilar.rightZipCode_;
+ reportLine += "\n";
+
+ if(addDescSimilar.isValid_)
+ {
+ // Cria um ponto e o adiciona no pointset
+ TePoint pt;
+ pt.add(addDescSimilar.pt_);
+ pt.objectId(add.locationLink_);
+ pSet.add(pt);
+ }
+ else
+ status = -1;
+ }
+ else
+ {
+ reportLine += " | | | | | | | | | | | | \n";
+ }
+
+ TeWriteToFile(reportFile, reportLine, "a");
+
+ this->updateAddressTable(newCols.first, status, tableMetadata, add.locationLink_);
+
+ if(pSet.size() > 100)
+ {
+ if(!newLayer->addPoints(pSet))
+ {
+ errMsg_ = "Could not insert generated points!";
+
+ db_->deleteLayer(newLayer->id());
+
+ delete portal;
+
+ return false;
+ }
+
+ pSet.clear();
+ }
+
+ if(TeProgress::instance())
+ {
+ t2 = clock();
+ if(int(t2-t1) > dt)
+ {
+ t1 = t2;
+
+ if((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(lo);
+ }
+ }
+ }while(portal->fetchRow()); // Vai para o pr�ximo registro
+
+ if((pSet.size() > 0) && !newLayer->addPoints(pSet))
+ {
+ errMsg_ = "Could not insert generated points!";
+
+ db_->deleteLayer(newLayer->id());
+
+ delete portal;
+
+ return false;
+ }
+
+
+ delete portal;
+
+ string summary = "\n=================";
+ summary += "\n===> SUMMARY <===";
+ summary += "\n=================\n";
+ summary += "\nNumber of ocurrences of each code:\n";
+
+ int sum = 0;
+ for(unsigned int j = 0; j < summarySum.size(); ++j)
+ {
+ summary += "CODE " + Te2String(j);
+ summary += " => ";
+ summary += Te2String(summarySum[j]);
+ summary += " - ";
+ summary += Te2String((double(summarySum[j]) / double(lo)) * 100.0);
+ summary += "\n";
+
+ if(j > 3)
+ sum = sum + summarySum[j];
+ }
+
+ summary += "=================\n";
+ summary += "TOTAL DE ENDERECOS: " + Te2String(lo) + "\n";
+ summary += "TOTAL DE ENCONTRADOS: " + Te2String(sum) + "\n";
+ summary += "Resultado = " + Te2String((double(sum) / double(lo)) * 100.0) + "\n\n";
+ summary += "LEGEND:\n";
+ summary += "0 -> Database connection problem\n";
+ summary += "1 -> Address not found\n";
+ summary += "2 -> full name empty\n";
+ summary += "3 -> Error on query the database\n";
+ summary += "4 -> Found by name location and number\n";
+ summary += "5 -> Found multiples by name location and number\n";
+ summary += "6 -> Found by name location without number\n";
+ summary += "7 -> Found multiples by name location without number\n";
+ summary += "8 -> Found by similar search\n";
+ summary += "9 -> Found by neighborhood or zip code\n";
+ summary += "10 -> Found by name location and number without type\n";
+ summary += "11 -> Found multiples by name location and number without type\n";
+ summary += "12 -> Found by name location without number and type\n";
+ summary += "13 -> Found multiples by name location without number and type\n";
+ summary += "14 -> Found by name location and number without type and title\n";
+ summary += "15 -> Found multiples by name location and number without type and title\n";
+ summary += "16 -> Found by name location without number and type and title\n";
+ summary += "17 -> Found multiples by name location without number and type and title\n";
+ summary += "18 -> Found by name location and number without type, title and preposition\n";
+ summary += "19 -> Found multiples by name location and number without type, title and preposition\n";
+ summary += "20 -> Found by name location without number and type, title and preposition\n";
+ summary += "21 -> Found multiples by name location without number and type, title and preposition\n";
+
+
+ TeWriteToFile(reportFileSummary, summary, "a");
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ // If the table is registered as an geocoding table, so we remove its information from te_layer_table
+ string deleteGeocodingTable = "DELETE FROM te_layer_table WHERE (layer_id IS NULL) AND table_id = ";
+ deleteGeocodingTable += Te2String(tableMetadata.tableId_);
+
+ db_->execute(deleteGeocodingTable);
+
+ // Tenta registrar a tabela selecionada no metadado do novo layer
+ TeTable attTable(tableMetadata.tableName_);
+
+ attTable.setTableType(TeAttrStatic);
+ attTable.setLinkName(tableMetadata.linkColumnName_);
+ attTable.setUniqueName(tableMetadata.keyColumnName_);
+
+ if(!newLayer->createAttributeTable(attTable))
+ {
+ errMsg_ = "N�o foi poss�vel atualizar as informa��es da tabela de atributos para o novo layer";
+
+ db_->deleteLayer(newLayer->id());
+
+ return false;
+ }
+
+ delete newLayer;
+
+ return true;
+}
+
+bool TeAddressLocator::loadDictionary(const string& dictionaryFileName)
+{
+ errMsg_ = "";
+
+ dictionary_.clear();
+
+ if(dictionaryFileName.empty())
+ {
+ errMsg_ = "Enter with a valid dictionary file name and location!";
+
+ return false;
+ }
+
+ try
+ {
+ TeAsciiFile dicFile(dictionaryFileName);
+
+ while(dicFile.isNotAtEOF())
+ {
+ vector<string> strList;
+
+ dicFile.readStringListCSV(strList, ',');
+
+ dicFile.findNewLine();
+
+ if(strList.size() <= 1)
+ continue;
+
+ string str1 = TeConvertToUpperCase(strList[0]);
+
+ str1.erase(0, 1);
+ str1.erase(str1.size() - 1, 1);
+
+ for(unsigned int i = 1; i < strList.size(); ++i)
+ {
+ string str2 = TeConvertToUpperCase(strList[i]);
+ str2.erase(0, 1);
+ str2.erase(str2.size() - 1, 1);
+
+ dictionary_.insert(TeGeocoderDictionary::value_type(str2, str1));
+ }
+ }
+
+ }
+ catch(...)
+ {
+ errMsg_ = "Could open file: " + dictionaryFileName;
+
+ return false;
+ }
+
+ return true;
+}
+
+
+
+//PROTECTED MEMBERS
+bool TeAddressLocator::findSimilarAddress(const TeAddress& address, const string& fullName, TeAddressDescription& descript)
+{
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return 0;
+ }
+
+ // String with the result query expression
+ string strSQL = "";
+
+ // String with the select...from clause
+ string strSelect = "SELECT * FROM ";
+ strSelect += metadata_.tableName_;
+
+ // Order by of the result query
+ string strOrderBy = " ORDER BY ";
+ strOrderBy += metadata_.linkColumnName_;
+
+ // String with the where clause;
+ string strWhere = " WHERE ";
+
+ strWhere += mountSimilarWhereSQL(address);
+
+ strSQL = strSelect + strWhere + strOrderBy;
+
+ TeDatabasePortal* portal = db_->getPortal();
+
+ if(!portal)
+ return false;
+
+ bool found = false;
+
+ // Check if there is a segment that satisfies the clause
+ if(portal->query(strSQL))
+ {
+ double simil, similmax = 75.0;
+
+ while(portal->fetchRow() && similmax < 100.0)
+ {
+
+ string label = portal->getData(metadata_.locationCompleteName_);
+
+ simil = TeSimilarity(fullName.c_str(), label.c_str());
+
+ if(simil > similmax)
+ {
+ found = true;
+
+ fillAddressDescription(descript, portal);
+
+ similmax = simil;
+ }
+ }
+ }
+
+ delete portal;
+
+ portal = 0;
+
+ return found;
+}
+
+
+
+bool TeAddressLocator::findByCentroid(const TeAddress& addressToFind, vector<TeAddressDescription>& addressesFound)
+{
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ if(!cmetadata_.centroidLayer_ || cmetadata_.centroidName_.empty() || cmetadata_.attributeTableName_.empty())
+ return false;
+
+ string strValue = (cmetadata_.fieldType_ == TeNEIGHBORHOOD) ? (addressToFind.neighborhood_) : (addressToFind.zipCode_);
+
+ if(strValue.empty())
+ return false;
+
+ strValue = TeConvertToUpperCase(strValue);
+
+ if(removeHifenFromCentroid_ && cmetadata_.fieldType_ == TeZIPCODE)
+ removeHifen(strValue);
+ else if(!removeHifenFromCentroid_ && cmetadata_.fieldType_ == TeZIPCODE)
+ insertHifen(strValue);
+
+
+ string likeSQL = " = '";
+ likeSQL += strValue;
+ likeSQL += "'";
+
+ TeTable table;
+
+ if(!cmetadata_.centroidLayer_->getAttrTablesByName(cmetadata_.attributeTableName_, table))
+ return false;
+
+ // String with the result query expression
+ string strSQL = "SELECT ";
+ strSQL += table.linkName();
+ strSQL += ", ";
+ strSQL += cmetadata_.centroidName_;
+ strSQL += " FROM ";
+ strSQL += cmetadata_.attributeTableName_;
+ strSQL += " WHERE ";
+ strSQL += db_->toUpper(cmetadata_.centroidName_);
+ strSQL += likeSQL;
+
+ TeDatabasePortal* p = db_->getPortal();
+
+ if(!p)
+ return false;
+
+ if(!p->query(strSQL))
+ {
+ delete p;
+
+ return false;
+ }
+
+ while(p->fetchRow())
+ {
+ TeAddressDescription add;
+
+ if(cmetadata_.centroidLayer_->hasGeometry(TePOINTS))
+ {
+ TePointSet pset;
+
+ if(cmetadata_.centroidLayer_->loadGeometrySet(p->getData(0), pset))
+ {
+ add.pt_ = TeFindCentroid(pset);
+ add.isValid_ = true;
+ }
+ else
+ continue;
+ }
+ else if(cmetadata_.centroidLayer_->hasGeometry(TeLINES))
+ {
+ TeLineSet lset;
+
+ if(cmetadata_.centroidLayer_->loadGeometrySet(p->getData(0), lset))
+ {
+ add.pt_ = TeFindCentroid(lset);
+ add.isValid_ = true;
+ }
+ else
+ continue;
+ }
+ else if(cmetadata_.centroidLayer_->hasGeometry(TePOLYGONS))
+ {
+ TePolygonSet pset;
+
+ if(cmetadata_.centroidLayer_->loadGeometrySet(p->getData(0), pset))
+ {
+ add.pt_ = TeFindCentroid(pset);
+ add.isValid_ = true;
+ }
+ else
+ continue;
+
+ }
+ else if(cmetadata_.centroidLayer_->hasGeometry(TeCELLS))
+ {
+ TeCellSet cset;
+
+ if(cmetadata_.centroidLayer_->loadGeometrySet(p->getData(0), cset))
+ {
+ add.pt_ = TeFindCentroid(cset);
+ add.isValid_ = true;
+ }
+ else
+ continue;
+ }
+ else
+ continue;
+
+ TeVectorRemap(add.pt_, cmetadata_.centroidLayer_->projection(), add.pt_, referenceLayer_->projection());
+
+ if(cmetadata_.fieldType_ == TeZIPCODE)
+ {
+ add.leftZipCode_ = p->getData(1);
+ add.rightZipCode_ = p->getData(1);
+ }
+ else
+ {
+ add.leftNeighborhood_ = p->getData(1);
+ add.rightNeighborhood_ = p->getData(1);
+ }
+
+ addressesFound.push_back(add);
+ }
+
+ return addressesFound.size() > 0;
+}
+
+
+void TeAddressLocator::fillAddressMetadata(TeAddressMetadata& metadata, TeDatabasePortal* p)
+{
+ metadata.tableId_ = atoi(p->getData("table_id"));
+ metadata.initialLeftNumber_ = p->getData("initial_left_number");
+ metadata.finalLeftNumber_ = p->getData("final_left_number");
+ metadata.initialRightNumber_ = p->getData("initial_right_number");
+ metadata.finalRightNumber_ = p->getData("final_right_number");
+ metadata.locationType_ = p->getData("location_type");
+ metadata.locationTitle_ = p->getData("location_title");
+ metadata.locationPreposition_ = p->getData("location_preposition");
+ metadata.locationName_ = p->getData("location_name");
+ metadata.locationCompleteName_ = p->getData("location_full_name");
+ metadata.leftNeighborhood_ = p->getData("left_neighborhood");
+ metadata.rightNeighborhood_ = p->getData("right_neighborhood");
+ metadata.leftZipCode_ = p->getData("left_zip_code");
+ metadata.rightZipCode_ = p->getData("right_zip_code");
+ metadata.tableName_ = p->getData("attr_table");
+ metadata.linkColumnName_ = p->getData("attr_link");
+ return;
+}
+
+void TeAddressLocator::fillAddress(TeAddress& add, const TeGeocodeTableMetadata& tableMetadata, TeDatabasePortal* p)
+{
+ add.locationLink_ = p->getData(tableMetadata.linkColumnName_);
+
+ add.locationType_ = (tableMetadata.locationTypeColumnName_.empty()) ? "" : p->getData(tableMetadata.locationTypeColumnName_);
+ TeTrim(add.locationType_);
+
+ add.locationTitle_ = (tableMetadata.locationTitleColumnName_.empty()) ? "" : p->getData(tableMetadata.locationTitleColumnName_);
+ TeTrim(add.locationTitle_);
+
+ add.locationPreposition_ = (tableMetadata.locationPrepositionColumnName_.empty()) ? "" : p->getData(tableMetadata.locationPrepositionColumnName_);
+ TeTrim(add.locationPreposition_);
+
+ add.locationName_ = p->getData(tableMetadata.locationNameColumnName_);
+ TeTrim(add.locationName_);
+
+ add.neighborhood_ = (tableMetadata.neighborhoodColumnName_.empty()) ? "" : p->getData(tableMetadata.neighborhoodColumnName_);
+ TeTrim(add.neighborhood_);
+
+ add.zipCode_ = (tableMetadata.zipCodeColumnName_.empty()) ? "" : p->getData(tableMetadata.zipCodeColumnName_);
+ TeTrim(add.zipCode_);
+
+ if(!tableMetadata.locationNumberColumnName_.empty())
+ add.locationNumber_ = atoi(p->getData(tableMetadata.locationNumberColumnName_));
+ else
+ splitAddress(add);
+
+ return;
+}
+
+string TeAddressLocator::mountSimilarWhereSQL(const TeAddress& address)
+{
+ string sql = metadata_.locationName_ + " <> '' ";
+
+ if(address.locationNumber_ != 0)
+ {
+ string snumber = Te2String(address.locationNumber_);
+
+ if(!sql.empty())
+ sql += " AND ";
+
+ if((address.locationNumber_ % 2) == 0)
+ sql += metadata_.initialRightNumber_ + " <= " + snumber + " AND " + metadata_.finalRightNumber_ + " >= " + snumber;
+ else
+ sql += metadata_.initialLeftNumber_ + " <= " + snumber +" AND " + metadata_.finalLeftNumber_ + " >= " + snumber;
+ }
+
+ return sql;
+}
+
+string TeAddressLocator::mountExactWhereSQL(const TeAddress& address, const string& fullName)
+{
+ vector<string> fields;
+ string values = "";
+ string sql = "";
+
+ if(address.locationNumber_ != 0)
+ {
+ string snumber = Te2String(address.locationNumber_);
+
+ // Se for endere�os pares
+ if((address.locationNumber_ % 2) == 0)
+ sql += " ( " + metadata_.initialRightNumber_ +" <= " + snumber + " AND " + metadata_.finalRightNumber_ +" >= " + snumber + ") ";
+ else // Sen�o, se for �mpares
+ sql += " ( " + metadata_.initialLeftNumber_ + " <= " + snumber + " AND " + metadata_.finalLeftNumber_ + " >= " + snumber + ") ";
+ }
+
+ if(sql.empty())
+ sql += " ( " + metadata_.locationCompleteName_ + " = '";
+ else
+ sql += " AND (" + metadata_.locationCompleteName_ + " = '";
+
+ sql += db_->escapeSequence(fullName);
+
+ sql += "') ";
+
+ return sql;
+}
+
+string TeAddressLocator::mountLikeWhereSQL(const TeAddress& address, const string& fullName)
+{
+ vector<string> fields;
+ string values = db_->escapeSequence(fullName);
+ string sql = " ( " + metadata_.locationCompleteName_ + " LIKE '%";
+ sql += values;
+ sql += "') ";
+
+ if(address.locationNumber_ != 0)
+ {
+ string snumber = Te2String(address.locationNumber_);
+
+ // Se for endere�os pares
+ if((address.locationNumber_ % 2) == 0)
+ sql += " AND ( " + metadata_.initialRightNumber_ +" <= " + snumber + " AND " + metadata_.finalRightNumber_ +" >= " + snumber + ") ";
+ else // Sen�o, se for �mpares
+ sql += " AND ( " + metadata_.initialLeftNumber_ + " <= " + snumber + " AND " + metadata_.finalLeftNumber_ + " >= " + snumber + ") ";
+ }
+
+ return sql;
+
+}
+
+string TeAddressLocator::mountPatternWhereSQL(const TeAddress& address, const string& fullName, const bool& disabletype, const bool& disabletitle, const bool& disablepreposition)
+{
+ vector<string> fields;
+ string values = "";
+ string sql = "(";
+
+ if(!metadata_.locationType_.empty() && !disabletype)
+ fields.push_back(db_->toUpper(metadata_.locationType_));
+
+ if(!metadata_.locationTitle_.empty() && !disabletitle)
+ fields.push_back(db_->toUpper(metadata_.locationTitle_));
+
+ if(!metadata_.locationPreposition_.empty() && !disablepreposition)
+ fields.push_back(db_->toUpper(metadata_.locationPreposition_));
+
+ if(!metadata_.locationName_.empty())
+ fields.push_back(db_->toUpper(metadata_.locationName_));
+
+ sql += db_->concatValues(fields, "");
+ sql += ") LIKE '";
+
+ values += db_->escapeSequence(fullName);
+
+ sql += makeLikeExpression(values);
+ sql += "' ";
+
+ if(address.locationNumber_ != 0)
+ {
+ string snumber = Te2String(address.locationNumber_);
+
+ // Se for endere�os pares
+ if((address.locationNumber_ % 2) == 0)
+ sql += " AND ( " + metadata_.initialRightNumber_ +" <= " + snumber + " AND " + metadata_.finalRightNumber_ +" >= " + snumber + ") ";
+ else // Sen�o, se for �mpares
+ sql += " AND ( " + metadata_.initialLeftNumber_ + " <= " + snumber + " AND " + metadata_.finalLeftNumber_ + " >= " + snumber + ") ";
+ }
+
+ return sql;
+}
+
+void TeAddressLocator::findCoordinates(const TeAddress& add, vector<TeAddressDescription>& addresses)
+{
+ for(unsigned int i = 0; i < addresses.size(); ++i)
+ findCoordinate(add, addresses[i]);
+}
+
+void TeAddressLocator::findCoordinate(const TeAddress& add, TeAddressDescription& desc)
+{
+ // Evaluate the relative position of "number" (relativePosition) between initial and final numbers
+ // If number is zero, point to begin of line
+
+ int initialLeft, initialRight, finalLeft, finalRight;
+
+ double relativePosition = 0.0;
+
+ if(add.locationNumber_ != 0)
+ {
+ if((add.locationNumber_ % 2) == 0)
+ {
+ initialRight = desc.initialRightNumber_;
+ finalRight = desc.finalRightNumber_;
+
+ if(initialRight != finalRight)
+ relativePosition = double(add.locationNumber_ - initialRight) / double(finalRight - initialRight);
+ }
+ else
+ {
+ initialLeft = desc.initialLeftNumber_;
+ finalLeft = desc.finalLeftNumber_;
+
+ if(initialLeft != finalLeft)
+ relativePosition = double(add.locationNumber_ - initialLeft) / double(finalLeft - initialLeft);
+ }
+
+ if(relativePosition > 1.0)
+ relativePosition = 1.0;
+ else if(relativePosition < 0.0)
+ relativePosition = 0.0;
+ }
+
+ // Retrieve street segment geometry
+ TeLineSet ls;
+
+ if(!referenceLayer_->loadGeometrySet(desc.locationLink_, ls)) // Recupero a linha geom�trica do trecho que cont�m o endere�o em quest�o
+ return;
+
+ // Find the actual position of number on the street
+ if(ls.size() >= 1)
+ {
+ TeLine2D line = ls[0];
+
+ TeCoord2D pt1, pt2;
+
+ pt1 = line[0];
+ pt2 = line[1];
+
+ double x, y;
+
+ if(relativePosition <= 0.0)
+ {
+ x = pt1.x();
+ y = pt1.y();
+ }
+ else if(relativePosition >= 1.0)
+ {
+ pt1 = line[line.size() - 1];
+
+ x = pt1.x();
+ y = pt1.y();
+ }
+ else
+ {
+ if(line.size () > 2)
+ {
+
+ // Find the distance from number to the begin of street based on the relative position
+ double targetLen = TeLength(line) * relativePosition;
+ double acumLen = 0.0;
+ double segLen;
+
+ // Find in which segment number is comprised
+ for(unsigned int i = 1 ; i < line.size(); ++i)
+ {
+ pt2 = line[i];
+
+ segLen = TeDistance(pt2, pt1); //sqrt((pt2.x() - pt1.x()) * (pt2.x() - pt1.x()) + (pt2.y() - pt1.y()) * (pt2.y() - pt1.y()));
+
+ acumLen += segLen;
+
+ if(acumLen >= targetLen)
+ {
+ double targetLenInSeg = targetLen - (acumLen - segLen);
+
+ relativePosition = targetLenInSeg / segLen;
+
+ break;
+ }
+
+ pt1 = pt2;
+ }
+ }
+
+ x = pt1.x() + (pt2.x() - pt1.x()) * relativePosition;
+ y = pt1.y() + (pt2.y() - pt1.y()) * relativePosition;
+ }
+
+
+ desc.pt_ = TeCoord2D (x,y);
+
+ desc.isValid_ = true;
+ }
+ else
+ desc.isValid_ = false; // A linha pertencente ao trecho n�o foi encontrada... problemas s�rios na base de dados!
+}
+
+
+void TeAddressLocator::fillAddressesDescription(vector<TeAddressDescription>& addresses, TeDatabasePortal* p)
+{
+ addresses.clear();
+
+ if(p == 0)
+ return;
+
+ while(p->fetchRow())
+ {
+ TeAddressDescription descript;
+
+ fillAddressDescription(descript, p);
+
+ addresses.push_back(descript);
+ }
+
+ return;
+}
+
+void TeAddressLocator::fillAddressDescription(TeAddressDescription& descript, TeDatabasePortal* p)
+{
+ descript.locationLink_ = p->getData(metadata_.linkColumnName_);
+ descript.locationType_ = (metadata_.locationType_.empty()) ? "" : p->getData(metadata_.locationType_);
+ descript.locationTitle_ = (metadata_.locationTitle_.empty()) ? "" : p->getData(metadata_.locationTitle_);
+ descript.locationPreposition_ = (metadata_.locationPreposition_.empty()) ? "" : p->getData(metadata_.locationPreposition_);
+ descript.locationName_ = (metadata_.locationName_.empty()) ? "" : p->getData(metadata_.locationName_);
+ descript.locationCompleteName_ = p->getData(metadata_.locationCompleteName_);
+ descript.initialLeftNumber_ = (metadata_.initialLeftNumber_.empty()) ? 0 : atoi(p->getData(metadata_.initialLeftNumber_));
+ descript.finalLeftNumber_ = (metadata_.finalLeftNumber_.empty()) ? 0 : atoi(p->getData(metadata_.finalLeftNumber_));
+ descript.initialRightNumber_ = (metadata_.initialRightNumber_.empty()) ? 0 : atoi(p->getData(metadata_.initialRightNumber_));
+ descript.finalRightNumber_ = (metadata_.finalRightNumber_.empty()) ? 0 : atoi(p->getData(metadata_.finalRightNumber_));
+ descript.leftNeighborhood_ = (metadata_.leftNeighborhood_.empty()) ? "" : p->getData(metadata_.leftNeighborhood_);
+ descript.rightNeighborhood_ = (metadata_.rightNeighborhood_.empty()) ? "" : p->getData(metadata_.rightNeighborhood_);
+ descript.leftZipCode_ = (metadata_.leftZipCode_.empty()) ? "" : p->getData(metadata_.leftZipCode_);
+ descript.rightZipCode_ = (metadata_.rightZipCode_.empty()) ? "" : p->getData(metadata_.rightZipCode_);
+
+ return;
+}
+
+void TeAddressLocator::normalizeAddress(TeAddress& address, string& completeName)
+{
+ completeName = "";
+
+ if(!address.locationType_.empty())
+ {
+ TeTrim(address.locationType_);
+
+ if(changeSpecialChars_)
+ removeSpecialCharacters(address.locationType_);
+
+ address.locationType_ = TeConvertToUpperCase(address.locationType_);
+
+ completeName = address.locationType_;
+ }
+
+ if(!address.locationTitle_.empty())
+ {
+ TeTrim(address.locationTitle_);
+
+ if(changeSpecialChars_)
+ removeSpecialCharacters(address.locationTitle_);
+
+ address.locationTitle_ = TeConvertToUpperCase(address.locationTitle_);
+
+ if(!completeName.empty())
+ completeName += " ";
+
+ completeName += address.locationTitle_;
+ }
+
+ if(!address.locationPreposition_.empty())
+ {
+ TeTrim(address.locationPreposition_);
+
+ if(changeSpecialChars_)
+ removeSpecialCharacters(address.locationPreposition_);
+
+ address.locationPreposition_ = TeConvertToUpperCase(address.locationPreposition_);
+
+ if(!completeName.empty())
+ completeName += " ";
+
+ completeName += address.locationPreposition_;
+ }
+
+ if(!address.locationName_.empty())
+ {
+ TeTrim(address.locationName_);
+
+ if(changeSpecialChars_)
+ removeSpecialCharacters(address.locationName_);
+
+ address.locationName_ = TeConvertToUpperCase(address.locationName_);
+
+ if(!completeName.empty())
+ completeName += " ";
+
+ completeName += address.locationName_;
+ }
+
+ if(!address.neighborhood_.empty())
+ {
+ TeTrim(address.neighborhood_);
+
+ if(changeSpecialChars_)
+ removeSpecialCharacters(address.neighborhood_);
+
+ address.neighborhood_ = TeConvertToUpperCase(address.neighborhood_);
+ }
+
+ if(!address.zipCode_.empty())
+ {
+ TeTrim(address.zipCode_);
+
+ if(removeHifen_)
+ removeHifen(address.zipCode_);
+ else
+ insertHifen(address.zipCode_);
+ }
+
+ return;
+}
+
+void TeAddressLocator::removeHifen(string& zipCode) const
+{
+ if(zipCode.size() == 9)
+ {
+ unsigned int i = 0;
+
+ string newZipCode = "";
+
+ for(i = 0; i < 5; ++i)
+ newZipCode += zipCode[i];
+
+ for(i = 6; i < 9; ++i)
+ newZipCode += zipCode[i];
+
+ zipCode = newZipCode;
+ }
+
+ return;
+}
+
+void TeAddressLocator::insertHifen(string& zipCode) const
+{
+ if(zipCode.size() == 8)
+ {
+ unsigned int i = 0;
+
+ string newZipCode = "";
+
+ for(i = 0; i < 5; ++i)
+ newZipCode += zipCode[i];
+
+ newZipCode += hifen_;
+
+ for(i = 5; i < 8; ++i)
+ newZipCode += zipCode[i];
+
+ zipCode = newZipCode;
+ }
+
+ return;
+}
+
+string TeAddressLocator::makeLikeExpression(const string& str) const
+{
+ string aux = "";
+
+ for(unsigned int i = 0; i < str.size(); ++i)
+ aux += (str[i] == ' ') ? ('%') : str[i];
+
+ return aux;
+}
+
+void TeAddressLocator::removeSpecialCharacters(string& str) const
+{
+ string newStr = "";
+
+ unsigned int nStep = str.size();
+
+ for(unsigned int i = 0; i < nStep; ++i)
+ {
+ switch(str[i])
+ {
+ case '�' : newStr += "A"; break;
+ case '�' : newStr += "a"; break;
+ case '�' : newStr += "A"; break;
+ case '�' : newStr += "a"; break;
+ case '�' : newStr += "A"; break;
+ case '�' : newStr += "a"; break;
+ case '�' : newStr += "A"; break;
+ case '�' : newStr += "a"; break;
+
+ case '�' : newStr += "E"; break;
+ case '�' : newStr += "e"; break;
+ case '�' : newStr += "E"; break;
+ case '�' : newStr += "e"; break;
+
+ case '�' : newStr += "I"; break;
+ case '�' : newStr += "i"; break;
+
+ case '�' : newStr += "O"; break;
+ case '�' : newStr += "o"; break;
+ case '�' : newStr += "O"; break;
+ case '�' : newStr += "o"; break;
+
+ case '�' : newStr += "U"; break;
+ case '�' : newStr += "u"; break;
+ case '�' : newStr += "U"; break;
+ case '�' : newStr += "u"; break;
+
+ case '�' : newStr += "c"; break;
+ case '�' : newStr += "C"; break;
+
+ //case '.' : break;
+
+ default : newStr += str[i];
+ }
+ }
+
+ str = newStr;
+}
+
+bool TeAddressLocator::verifyHifen(const string& tableName, const string& columnName)
+{
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return 0;
+ }
+
+ TeDatabasePortal* p = db_->getPortal();
+
+ if(!p || columnName.empty() || tableName.empty())
+ return false;
+
+ string q = "SELECT MAX(";
+ q += columnName;
+ q += ") FROM ";
+ q += tableName;
+
+ if(!p->query(q) && !p->fetchRow())
+ {
+ delete p;
+
+ return false;
+ }
+
+ string zipCode = p->getData(0);
+
+ delete p;
+
+ if(zipCode.size() == 9)
+ {
+ hifen_ = zipCode[5];
+
+ return true;
+ }
+
+ return false;
+}
+
+bool TeAddressLocator::addReportColumn(TeGeocodeTableMetadata& tableMetadata, pair<string, string>& newColumns)
+{
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ // Adiciona as colunas para relat�rio de acerto dos pontos
+ TeDatabasePortal* portal = db_->getPortal();
+
+ if(!portal)
+ return false;
+
+ string allFieldQuery = "SELECT * FROM ";
+ allFieldQuery += tableMetadata.tableName_;
+ allFieldQuery += " WHERE 1 = 2";
+
+ if(!portal->query(allFieldQuery))
+ {
+ errMsg_ = "Could not find column names for the table to be geocoding!";
+
+ delete portal;
+
+ return false;
+ }
+
+ TeAttributeRep rep1;
+ rep1.name_ = "geocoding_result_id";
+ rep1.type_ = TeINT;
+ rep1.isPrimaryKey_ = false;
+ rep1.isAutoNumber_ = false;
+
+ TeAttributeList attrList = portal->AttributeList();
+ validColumnName(rep1, attrList);
+
+ TeAttributeRep rep2;
+ rep2.name_ = "geocoding_result_description";
+ rep2.type_ = TeSTRING;
+ rep2.numChar_ = 255;
+ rep2.isPrimaryKey_ = false;
+ rep2.isAutoNumber_ = false;
+
+ validColumnName(rep2, attrList);
+
+ delete portal;
+
+ portal = 0;
+
+ if(!db_->addColumn(tableMetadata.tableName_, rep1))
+ {
+ errMsg_ = "Could not add a column to do the report!";
+
+ delete portal;
+
+ return false;
+ }
+
+ //if(!db_->addColumn(tableMetadata.tableName_, rep2))
+ //{
+ // errMsg_ = "Could not add a column to do the report!";
+
+ // delete portal;
+
+ // return false;
+ //}
+
+ newColumns.first = rep1.name_;
+ newColumns.second = rep2.name_;
+
+ return true;
+}
+
+bool TeAddressLocator::findTableMetadata(TeGeocodeTableMetadata& tableMetadata)
+{
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ // Adiciona as colunas para relat�rio de acerto dos pontos
+ TeDatabasePortal* portal = db_->getPortal();
+
+ if(!portal)
+ return false;
+
+
+ // Procura o nome do campo chave da tabela a ser geocodificada
+ string sql = "SELECT * FROM te_layer_table WHERE table_id = ";
+ sql += Te2String(tableMetadata.tableId_);
+
+ portal = db_->getPortal();
+
+ if(!portal)
+ return false;
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ errMsg_ = "Could not read te_layer_table table for geocoding base table!";
+
+ delete portal;
+
+ return false;
+ }
+
+ tableMetadata.keyColumnName_ = portal->getData("unique_id");
+ tableMetadata.linkColumnName_ = portal->getData("attr_link");
+ tableMetadata.tableName_ = portal->getData("attr_table");
+
+ delete portal;
+
+ portal = 0;
+
+ return true;
+}
+
+bool TeAddressLocator::updateAddressTable(const string& c1, const int& v1, TeGeocodeTableMetadata& tableMetadata, const string& objectId)
+{
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return false;
+ }
+
+ string sql = "UPDATE ";
+ sql += tableMetadata.tableName_;
+ sql += " SET ";
+ sql += c1;
+ sql += " = ";
+ sql += Te2String(v1);
+ sql += " WHERE ";
+ sql += tableMetadata.linkColumnName_;
+ sql += " = '";
+ sql += objectId;
+ sql += "'";
+
+ return db_->execute(sql);
+}
+
+TeDatabasePortal* TeAddressLocator::getAddressTablePortal(TeGeocodeTableMetadata& tableMetadata, int& numRows)
+{
+ if(!db_)
+ {
+ errMsg_ = "You should connect to a database first!";
+
+ return 0;
+ }
+
+ string sql = "SELECT count(*) FROM " + tableMetadata.tableName_;
+
+ TeDatabasePortal* portal = db_->getPortal();
+
+ if(!portal)
+ {
+ errMsg_ = "Could not get a portal to query database!";
+
+ return 0;
+ }
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ errMsg_ = "Could not count the number of records in the geocoding base table!";
+
+ return 0;
+ }
+
+ numRows = portal->getInt(0);
+
+ portal->freeResult();
+
+ // Recupera um portal para a tabela a ser espacializada e verifica se a tabela tem conte�do
+ sql = "SELECT ";
+ sql += tableMetadata.linkColumnName_;
+ sql += ", ";
+ sql += tableMetadata.locationNameColumnName_;
+
+ if(!tableMetadata.locationNumberColumnName_.empty())
+ {
+ sql += ", ";
+ sql += tableMetadata.locationNumberColumnName_;
+ }
+
+ if(!tableMetadata.neighborhoodColumnName_.empty())
+ {
+ sql += ", ";
+ sql += tableMetadata.neighborhoodColumnName_;
+ }
+
+ if(!tableMetadata.zipCodeColumnName_.empty())
+ {
+ sql += ", ";
+ sql += tableMetadata.zipCodeColumnName_;
+ }
+
+ if(!tableMetadata.locationTypeColumnName_.empty())
+ {
+ sql += ", ";
+ sql += tableMetadata.locationTypeColumnName_;
+ }
+
+ if(!tableMetadata.locationTitleColumnName_.empty())
+ {
+ sql += ", ";
+ sql += tableMetadata.locationTitleColumnName_;
+ }
+
+ if(!tableMetadata.locationPrepositionColumnName_.empty())
+ {
+ sql += ", ";
+ sql += tableMetadata.locationPrepositionColumnName_;
+ }
+
+ sql += " FROM ";
+ sql += tableMetadata.tableName_;
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ errMsg_ = "Could not read the geocoding base table!";
+
+ delete portal;
+
+ return 0;
+ }
+
+ return portal;
+}
+
+
+
+void TeAddressLocator::refineFoundedLocationsByNeighBorhood(const TeAddress& address, vector<TeAddressDescription>& addressesFound)
+{
+ unsigned int nStep = addressesFound.size();
+
+ vector<TeAddressDescription> newAdds;
+
+ for(unsigned int i = 0; i < nStep; ++i)
+ {
+ TeAddressDescription& addFound = addressesFound[i];
+
+ if(address.neighborhood_ == TeConvertToUpperCase(addFound.leftNeighborhood_) || address.neighborhood_ == TeConvertToUpperCase(addFound.rightNeighborhood_))
+ newAdds.push_back(addFound);
+ }
+
+ if(newAdds.size() > 0)
+ {
+ addressesFound.clear();
+
+ addressesFound = newAdds;
+ }
+
+ return;
+}
+
+void TeAddressLocator::refineFoundedLocationsByZipCode(const TeAddress& address, vector<TeAddressDescription>& addressesFound)
+{
+ unsigned int nStep = addressesFound.size();
+
+ vector<TeAddressDescription> newAdds;
+
+ for(unsigned int i = 0; i < nStep; ++i)
+ {
+ TeAddressDescription& addFound = addressesFound[i];
+
+ if(address.zipCode_ == addFound.leftZipCode_ || address.zipCode_ == addFound.rightZipCode_)
+ newAdds.push_back(addFound);
+ }
+
+ if(newAdds.size() > 0)
+ {
+ addressesFound.clear();
+
+ addressesFound = newAdds;
+ }
+
+ return;
+}
+
+void TeAddressLocator::refineFoundedLocationsByNumberNeighboor(const TeAddress& address, vector<TeAddressDescription>& addressesFound)
+{
+ unsigned int nStep = addressesFound.size();
+
+ // id/dist
+ typedef pair<unsigned int, int> nearestItem;
+
+ map<string, nearestItem> nearestMap;
+
+ bool par = ((address.locationNumber_ % 2) == 0);
+
+ for(unsigned int i = 0; i < nStep; ++i)
+ {
+ TeAddressDescription& addFound = addressesFound[i];
+
+ int distBegin = 0;
+ int distEnd = 0;
+
+ int dist = 0;
+
+ if(par)
+ {
+
+ distBegin = abs(address.locationNumber_ - addFound.initialRightNumber_);
+ distEnd = abs(address.locationNumber_ - addFound.finalRightNumber_);
+
+ dist = MIN(distBegin, distEnd);
+ }
+ else
+ {
+ distBegin = abs(address.locationNumber_ - addFound.initialLeftNumber_);
+ distEnd = abs(address.locationNumber_ - addFound.finalLeftNumber_);
+
+ dist = MIN(distBegin, distEnd);
+ }
+
+
+ map<string, nearestItem>::iterator itLeft = nearestMap.find(addFound.leftNeighborhood_);
+
+ if(itLeft != nearestMap.end())
+ {
+ if(dist < itLeft->second.second)
+ nearestMap[addFound.leftNeighborhood_] = nearestItem(i, dist);
+ }
+ else
+ {
+ nearestMap[addFound.leftNeighborhood_] = nearestItem(i, dist);
+ }
+
+ if(addFound.leftNeighborhood_ != addFound.rightNeighborhood_)
+ {
+ map<string, nearestItem>::iterator itRight = nearestMap.find(addFound.rightNeighborhood_);
+
+ if(itRight != nearestMap.end())
+ {
+ if(dist < itRight->second.second)
+ nearestMap[addFound.rightNeighborhood_] = nearestItem(i, dist);
+ }
+ else
+ {
+ nearestMap[addFound.rightNeighborhood_] = nearestItem(i, dist);
+ }
+ }
+ }
+
+ if(!nearestMap.empty())
+ {
+ map<string, nearestItem>::iterator it = nearestMap.begin();
+ vector<TeAddressDescription> newAdds;
+ set<unsigned int> alreadyPushed;
+
+ while(it != nearestMap.end())
+ {
+ set<unsigned int>::iterator itaux = alreadyPushed.find(it->second.first);
+
+ // Se o endere�o j� n�o tiver sido colocado na lista, inclui, caso contr�rio n�o faz nada
+ if(itaux == alreadyPushed.end())
+ newAdds.push_back(addressesFound[it->second.first]);
+
+ alreadyPushed.insert(it->second.first);
+
+ ++it;
+ }
+
+ addressesFound.clear();
+ addressesFound = newAdds;
+
+ }
+
+ return;
+}
+
+void TeAddressLocator::refineFoundedLocationsByNumberZipCode(const TeAddress& address, vector<TeAddressDescription>& addressesFound)
+{
+ unsigned int nStep = addressesFound.size();
+
+ // id/dist
+ typedef pair<unsigned int, int> nearestItem;
+
+ map<string, nearestItem> nearestMap;
+
+ bool par = ((address.locationNumber_ % 2) == 0);
+
+ for(unsigned int i = 0; i < nStep; ++i)
+ {
+ TeAddressDescription& addFound = addressesFound[i];
+
+ int distBegin = 0;
+ int distEnd = 0;
+
+ int dist = 0;
+
+ if(par)
+ {
+
+ distBegin = abs(address.locationNumber_ - addFound.initialRightNumber_);
+ distEnd = abs(address.locationNumber_ - addFound.finalRightNumber_);
+
+ dist = MIN(distBegin, distEnd);
+ }
+ else
+ {
+ distBegin = abs(address.locationNumber_ - addFound.initialLeftNumber_);
+ distEnd = abs(address.locationNumber_ - addFound.finalLeftNumber_);
+
+ dist = MIN(distBegin, distEnd);
+ }
+
+
+ map<string, nearestItem>::iterator itLeft = nearestMap.find(addFound.leftZipCode_);
+
+ if(itLeft != nearestMap.end())
+ {
+ if(dist < itLeft->second.second)
+ nearestMap[addFound.leftZipCode_] = nearestItem(i, dist);
+ }
+ else
+ {
+ nearestMap[addFound.leftZipCode_] = nearestItem(i, dist);
+ }
+
+ if(addFound.leftZipCode_ != addFound.rightZipCode_)
+ {
+ map<string, nearestItem>::iterator itRight = nearestMap.find(addFound.rightZipCode_);
+
+ if(itRight != nearestMap.end())
+ {
+ if(dist < itRight->second.second)
+ nearestMap[addFound.rightZipCode_] = nearestItem(i, dist);
+ }
+ else
+ {
+ nearestMap[addFound.rightZipCode_] = nearestItem(i, dist);
+ }
+ }
+ }
+
+ if(!nearestMap.empty())
+ {
+ map<string, nearestItem>::iterator it = nearestMap.begin();
+ vector<TeAddressDescription> newAdds;
+ set<unsigned int> alreadyPushed;
+
+ while(it != nearestMap.end())
+ {
+ set<unsigned int>::iterator itaux = alreadyPushed.find(it->second.first);
+
+ // Se o endere�o j� n�o tiver sido colocado na lista, inclui, caso contr�rio n�o faz nada
+ if(itaux == alreadyPushed.end())
+ newAdds.push_back(addressesFound[it->second.first]);
+
+ alreadyPushed.insert(it->second.first);
+
+ ++it;
+ }
+
+ addressesFound.clear();
+ addressesFound = newAdds;
+
+ }
+
+ return;
+}
+
+void TeAddressLocator::splitAddress(TeAddress& add)
+{
+ unsigned int i;
+ string aux = add.locationName_;
+
+ add.locationName_ = "";
+ add.locationNumber_ = 0;
+
+ string number = "";
+
+ if(!splitChar_.empty())
+ {
+ unsigned int nChars = aux.size();
+
+ for(i = 0; i < nChars; ++i)
+ {
+ if(splitChar_[0] == aux[i])
+ {
+ ++i;
+ break;
+ }
+
+ add.locationName_ += aux[i];
+ }
+
+ number = "";
+
+ for(; i < nChars; ++i)
+ {
+ if((aux[i] >= '0') && (aux[i] <= '9'))
+ number += aux[i];
+ }
+
+ }
+ else
+ {
+ unsigned int nChars = aux.size();
+
+ for(i = 0; i < nChars; ++i)
+ {
+ if(aux[i] >= '0' && aux[i] <= '9')
+ break;
+
+ add.locationName_ += aux[i];
+ }
+
+ for(; i < nChars; ++i)
+ {
+ if(aux[i] < '0' || aux[i] > '9')
+ break;
+
+ number += aux[i];
+ }
+ }
+
+ TeTrim(add.locationName_);
+ TeTrim(number);
+ add.locationNumber_ = atoi(number.c_str());
+}
+
+
+void TeAddressLocator::queryAddresses(const string& strSQL, bool& queryExecuted, vector<TeAddressDescription>& addressesFound)
+{
+ TeDatabasePortal* portal = db_->getPortal();
+
+ if(!portal)
+ return;
+
+ // Check if there is a segment that satisfies the clause
+ if(portal->query(strSQL))
+ {
+ queryExecuted = true;
+
+ fillAddressesDescription(addressesFound, portal);
+ }
+
+ delete portal;
+}
+
+
+bool TeAddressLocator::loadAddressCompoundNames()
+{
+ typesVector_.clear();
+ titlesVector_.clear();
+ prepositionsVector_.clear();
+
+ if(!metadata_.locationType_.empty())
+ {
+ TeDatabasePortal *p = db_->getPortal();
+
+ if(!p)
+ {
+ errMsg_ = "Could not get portal to find types in base table!";
+
+ return false;
+ }
+
+
+ string sql = "SELECT DISTINCT ";
+ sql += metadata_.locationType_;
+ sql += " FROM ";
+ sql += metadata_.tableName_;
+ sql += " ORDER BY ";
+ sql += metadata_.locationType_;
+
+ if(p->query(sql))
+ {
+ while(p->fetchRow())
+ {
+ string aux = p->getData(metadata_.locationType_);
+
+ TeTrim(aux);
+
+ if(aux.empty())
+ continue;
+
+ typesVector_.push_back(aux);
+ }
+ }
+
+ delete p;
+ }
+
+ // T�tulo
+ if(!metadata_.locationTitle_.empty())
+ {
+ TeDatabasePortal *p = db_->getPortal();
+
+ if(!p)
+ {
+ errMsg_ = "Could not get portal to find titles in base table!";
+
+ return false;
+ }
+
+
+ string sql = "SELECT DISTINCT ";
+ sql += metadata_.locationTitle_;
+ sql += " FROM ";
+ sql += metadata_.tableName_;
+ sql += " ORDER BY ";
+ sql += metadata_.locationTitle_;
+
+ if(p->query(sql))
+ {
+ while(p->fetchRow())
+ {
+ string aux = p->getData(metadata_.locationTitle_);
+
+ TeTrim(aux);
+
+ if(aux.empty())
+ continue;
+
+ titlesVector_.push_back(aux);
+ }
+ }
+
+ delete p;
+ }
+
+ // Preposi��o
+ if(!metadata_.locationPreposition_.empty())
+ {
+ TeDatabasePortal *p = db_->getPortal();
+
+ if(!p)
+ {
+ errMsg_ = "Could not get portal to find prepositions in base table!";
+
+ return false;
+ }
+
+
+ string sql = "SELECT DISTINCT ";
+ sql += metadata_.locationPreposition_;
+ sql += " FROM ";
+ sql += metadata_.tableName_;
+ sql += " ORDER BY ";
+ sql += metadata_.locationPreposition_;
+
+ if(p->query(sql))
+ {
+ while(p->fetchRow())
+ {
+ string aux = p->getData(metadata_.locationPreposition_);
+
+ TeTrim(aux);
+
+ if(aux.empty())
+ continue;
+
+ prepositionsVector_.push_back(aux);
+ }
+ }
+
+ delete p;
+ }
+
+ return true;
+}
+
+
+bool TeAddressLocator::convertColumnNameToUpper()
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "Connect to a database first!";
+
+ return false;
+ }
+
+ string sql = "UPDATE ";
+ sql += metadata_.tableName_;
+ sql += " SET ";
+ sql += metadata_.locationCompleteName_;
+ sql += " = ";
+ sql += db_->toUpper(metadata_.locationCompleteName_);
+
+ if(!db_->execute(sql))
+ {
+ errMsg_ = "Couldn't convert to uppercase name column!";
+
+ return false;
+ }
+
+ return true;
+}
+
+bool TeAddressLocator::addCompleteNameColumn()
+{
+ errMsg_ = "";
+
+ if(!db_)
+ {
+ errMsg_ = "Connect to a database first!";
+
+ return false;
+ }
+
+ TeAttribute attr;
+
+ if(db_->columnExist(metadata_.tableName_, metadata_.locationCompleteName_, attr))
+ {
+ errMsg_ = "The specified column name already exist!";
+
+ return false;
+ }
+
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = metadata_.locationCompleteName_;
+ at.rep_.numChar_ = 255;
+
+ if(!db_->addColumn(metadata_.tableName_, at.rep_))
+ {
+ errMsg_ = "Couldn't add specified column!";
+
+ return false;
+ }
+
+ TeDatabasePortal* p = db_->getPortal();
+
+ if(!p)
+ {
+ errMsg_ = "Couldn't get portal!";
+
+ return false;
+ }
+
+ string sql = "SELECT count(*) FROM " + metadata_.tableName_;
+
+ if(!p->query(sql) && !p->fetchRow())
+ {
+ errMsg_ = "Couldn't get number of lines to update!";
+
+ delete p;
+
+ return false;
+ }
+
+ int lo = 0;
+ int nlo = p->getInt(0);
+
+ p->freeResult();
+
+ if(TeProgress::instance())
+ {
+ TeProgress::instance()->setTotalSteps(nlo);
+ TeProgress::instance()->setCaption("Address Geocoding Config");
+ TeProgress::instance()->setMessage("Creating new column...");
+ }
+
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+ t2 = clock();
+ t0 = t1 = t2;
+
+
+ sql = "SELECT * FROM " + metadata_.tableName_;
+
+ if(!p->query(sql))
+ {
+ errMsg_ = "Couldn't query address reference table!";
+
+ delete p;
+
+ return false;
+ }
+
+ while(p->fetchRow())
+ {
+ if(TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+
+ errMsg_ = "The process was canceled by user!";
+
+ delete p;
+
+ return false;
+ }
+
+
+ ++lo;
+
+ string completeName = "";
+
+ if(!metadata_.locationType_.empty())
+ completeName = TeConvertToUpperCase(p->getData(metadata_.locationType_));
+
+ if(!metadata_.locationTitle_.empty())
+ {
+ string aux = TeConvertToUpperCase(p->getData(metadata_.locationTitle_));
+
+ if(!completeName.empty() && !aux.empty())
+ completeName += " ";
+
+ completeName += aux;
+ }
+
+ if(!metadata_.locationPreposition_.empty())
+ {
+ string aux = TeConvertToUpperCase(p->getData(metadata_.locationPreposition_));
+
+ if(!completeName.empty() && !aux.empty())
+ completeName += " ";
+
+ completeName += aux;
+ }
+
+ if(!metadata_.locationName_.empty())
+ {
+ string aux = TeConvertToUpperCase(p->getData(metadata_.locationName_));
+
+ if(!completeName.empty() && !aux.empty())
+ completeName += " ";
+
+ completeName += aux;
+ }
+
+ string value = p->getData(metadata_.linkColumnName_);
+
+ sql = "UPDATE " + metadata_.tableName_ + " SET ";
+ sql += metadata_.locationCompleteName_ + " = '" + db_->escapeSequence(completeName) + "' WHERE ";
+ sql += metadata_.linkColumnName_ + " = '" + value + "'";
+
+ if(!db_->execute(sql))
+ {
+ delete p;
+
+ errMsg_ = "Couldn't update complete name column!";
+
+ return false;
+ }
+
+ if(TeProgress::instance())
+ {
+ t2 = clock();
+ if(int(t2-t1) > dt)
+ {
+ t1 = t2;
+
+ if((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(lo);
+ }
+ }
+ }
+
+ delete p;
+
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+
+
+ return true;
+}
+
+
+void TeAddressLocator::cleanAddressesFound(const string& locName, vector<TeAddressDescription>& addressesFound, const bool& disabletype, const bool& disabletitle, const bool& disablepreposition)
+{
+ vector<TeAddressDescription> newAddresses;
+
+ for(unsigned int i = 0; i < addressesFound.size(); ++i)
+ {
+ TeAddressDescription add = addressesFound[i];
+
+ string name = "";
+
+ if(!add.locationType_.empty() && !disabletype)
+ {
+ TeTrim(add.locationType_);
+
+ add.locationType_ = TeConvertToUpperCase(add.locationType_);
+
+ name = add.locationType_;
+ }
+
+ if(!add.locationTitle_.empty() && !disabletitle)
+ {
+ TeTrim(add.locationTitle_);
+
+ add.locationTitle_ = TeConvertToUpperCase(add.locationTitle_);
+
+ if(!name.empty() && !add.locationTitle_.empty())
+ name += " ";
+
+ name += add.locationTitle_;
+ }
+
+ if(!add.locationPreposition_.empty() && !disablepreposition)
+ {
+ TeTrim(add.locationPreposition_);
+
+
+ add.locationPreposition_ = TeConvertToUpperCase(add.locationPreposition_);
+
+ if(!name.empty() && !add.locationPreposition_.empty())
+ name += " ";
+
+ name += add.locationPreposition_;
+ }
+
+ if(!add.locationName_.empty())
+ {
+ TeTrim(add.locationName_);
+
+ add.locationName_ = TeConvertToUpperCase(add.locationName_);
+
+ if(!name.empty() && !add.locationName_.empty())
+ name += " ";
+
+ name += add.locationName_;
+ }
+
+ if(name == locName)
+ newAddresses.push_back(addressesFound[i]);
+ }
+
+ addressesFound = newAddresses;
+}
diff --git a/src/terralib/functions/TeAddressLocator.h b/src/terralib/functions/TeAddressLocator.h
new file mode 100644
index 0000000..7009516
--- /dev/null
+++ b/src/terralib/functions/TeAddressLocator.h
@@ -0,0 +1,420 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeAddressLocator.h
+ This file contains algorithms for address location generation.
+*/
+
+/**
+ *@author Gilberto Ribeiro de Queiroz and Ricardo Cartaxo
+ */
+
+#ifndef __TERRALIB_INTERNAL_ADDRESSLOCATOR_H
+#define __TERRALIB_INTERNAL_ADDRESSLOCATOR_H
+
+#include <TeDatabase.h>
+#include <TeLayer.h>
+
+#include <string>
+#include <map>
+
+using namespace std;
+
+
+typedef multimap<string, string> TeGeocoderDictionary;
+
+
+/*! \struct TeAddressMetadata
+ Metadata for a table used as a base for geocoding
+*/
+struct TeAddressMetadata
+{
+ int tableId_; //!< This value is a foreign key from te_layer_table indicates the table wich will be used for the address locator
+ string tableName_; //!< The table to use for geocoding process
+ string linkColumnName_; //!< The column used as link to line geometry
+ string initialLeftNumber_; //!< The field name with the initial location left number
+ string finalLeftNumber_; //!< The field name with the final location left number
+ string initialRightNumber_; //!< The field name with the initial location right number
+ string finalRightNumber_; //!< The field name with the final location right number
+ string locationType_; //!< The field name with location type (Av., Rua, R., Pr., Jz., Pres. ...)
+ string locationTitle_; //!< The field name with location title (Dr., Dra., PRF ...)
+ string locationPreposition_; //!< The field name with the preposition used to form the location name (Dos, Das, De,
+ string locationName_; //!< The field name with the location name
+ string locationCompleteName_; //!< The field name with composed location name
+ string leftNeighborhood_; //!< The field name for the left location neighborhood
+ string rightNeighborhood_; //!< The field name for the right location neighborhood
+ string leftZipCode_; //!< The field name for the left location zip code
+ string rightZipCode_; //!< The field name for the right location zip code
+};
+
+//! Types for centroid field name finding
+enum TeCentroidFieldType { TeNEIGHBORHOOD, TeZIPCODE };
+
+/*! \struct TeCentroidAddressMetadata
+ Metadata for a table used as a base for geocoding when an address is not found and a centroid for the zip code or neighborhood exists
+*/
+struct TeCentroidAddressMetadata
+{
+ string centroidName_; //!< This field may be the neighborhood name or zip code name
+
+ TeCentroidFieldType fieldType_; //!< Field type
+
+ string attributeTableName_; //!< Attribute table name
+
+ TeLayer* centroidLayer_; //!< Polygon or point layer to extract centroid from
+
+ TeCentroidAddressMetadata()
+ : centroidLayer_(0)
+ {
+ }
+};
+
+/*! \struct TeGeocodeTableMetadata
+ Metadata for the table that contains address to be geocode
+*/
+struct TeGeocodeTableMetadata
+{
+ string tableName_; //!< The table to be geocoding
+ string linkColumnName_; //!< The column used as link column in geocoding
+ string keyColumnName_; //!< The column with index
+ int tableId_; //!< The id of the table for geocoding
+ string locationTypeColumnName_; //!< The field name with location type (Av., Rua, R., Pr., Jz., Pres. ...)
+ string locationTitleColumnName_; //!< The field name with location title (Dr., Dra., PRF ...)
+ string locationPrepositionColumnName_; //!< The field name with the preposition used to form the location name (Dos, Das, De,
+ string locationNameColumnName_; //!< The field name with the location name
+ string locationNumberColumnName_; //!< The field name with the ocation number
+ string neighborhoodColumnName_; //!< The field name for the location neighborhood
+ string zipCodeColumnName_; //!< The field name for the location zip code
+};
+
+
+/*! \struct TeAddress
+ Information of an address that will be geocoded
+*/
+struct TeAddress
+{
+ string locationLink_; //!< The value that unique identifies the location
+ string locationType_; //!< Location type
+ string locationTitle_; //!< Location title
+ string locationPreposition_; //!< Location preposition
+ string locationName_; //!< Location name
+ int locationNumber_; //!< Location number
+ string neighborhood_; //!< Location neighborhood
+ string zipCode_; //!< Location zip code
+};
+
+
+/* \struct TeAddressDescription
+ Information about a found address
+ */
+struct TeAddressDescription
+{
+ string locationLink_; //!< The value that unique identifies the location
+ int initialLeftNumber_; //!< The initial location left number
+ int finalLeftNumber_; //!< The final location left number
+ int initialRightNumber_; //!< The initial location right number
+ int finalRightNumber_; //!< The final location right number
+ string locationType_; //!< The location type (Av., Rua, R., Pr., Jz., Pres. ...)
+ string locationTitle_; //!< The location title (Dr., Dra., PRF ...)
+ string locationPreposition_; //!< The preposition used to form the location name (Dos, Das, De,
+ string locationName_; //!< The location name
+ string locationCompleteName_; //!< The complete location name
+ string leftNeighborhood_; //!< The left location neighborhood
+ string rightNeighborhood_; //!< The right location neighborhood
+ string leftZipCode_; //!< The eft location zip code
+ string rightZipCode_; //!< The right location zip code
+ TeCoord2D pt_; //!< point location of the address
+ bool isValid_; //!< Tells if pt_ is a valid coordinate or the segment range was not found
+
+ TeAddressDescription()
+ : locationLink_(""), initialLeftNumber_(0), finalLeftNumber_(0),
+ initialRightNumber_(0), finalRightNumber_(0), locationType_(""),
+ locationTitle_(""), locationPreposition_(""), locationName_(""), locationCompleteName_(""),
+ leftNeighborhood_(""), rightNeighborhood_(""), leftZipCode_(""),
+ rightZipCode_(""), isValid_(false)
+ {
+ }
+};
+
+
+//! An abstract class to support interactivity in geocoding
+/*!
+ Subclasses of this class must implement the "operator()" method
+*/
+class TeAbstractAddressNotifyFunctor
+{
+ public:
+
+ virtual int operator()(const TeAddress& searchedAddress, vector<TeAddressDescription>& foundAddresses) = 0;
+
+ virtual ~TeAbstractAddressNotifyFunctor()
+ {
+ }
+};
+
+//! A class to handle the geocoder support
+/*!
+ Instances of this class contains information about
+ a table that can be used for geocoding and methods
+ to geocode a given address.
+*/
+class TeAddressLocator
+{
+ protected:
+
+ TeDatabase* db_; //!< Database connection
+ TeAddressMetadata metadata_; //!< Metadata information for a geocoding base table
+ TeLayer* referenceLayer_; //!< Ther layer used as reference for geocoding
+ TeCentroidAddressMetadata cmetadata_; //!< Centroid metadata
+ bool isMetadataLoaded_; //!< Flag to indicate if the metadata is loaded
+ string errMsg_; //!< Error message description
+ TeGeocoderDictionary dictionary_; //!< Use a geocoder dictionary
+ bool changeSpecialChars_; //!< If true should replace special characters
+ bool removeHifen_; //!< If true the hifen is removed in zip code
+ bool removeHifenFromCentroid_; //!< If true the hifen is removed in zip code from the centroid table
+ char hifen_;
+ string splitChar_; //!< Used to split address name and number
+
+ vector<string> typesVector_; //!< Vector with default types for street names
+ vector<string> titlesVector_; //!< Vector with default titles for street names
+ vector<string> prepositionsVector_; //!< Vector with default prepositions for street names
+
+ public:
+
+ //! Constructor
+ TeAddressLocator(TeDatabase* db)
+ : db_(db), referenceLayer_(0), isMetadataLoaded_(false), errMsg_(""), changeSpecialChars_(false), removeHifen_(false), removeHifenFromCentroid_(false)
+ {
+ }
+
+ //! Virtual destructor
+ virtual ~TeAddressLocator()
+ {
+ }
+
+ //! Creates the table to store metadata for geocoding tables
+ bool createAddressMetadataTable(void);
+
+ //! Inserts a new metadata for an attribute table layer and saves in the database
+ bool insertAddressMetadata(const TeAddressMetadata& metadata);
+
+ //! Updates the metadata of an attribute table layer and saves in the database
+ bool updateAddressMetadata(const TeAddressMetadata& metadata);
+
+ //! Removes the metadata for the attribute table layer on the database an clear memory
+ bool deleteAddressMetadata(const int& tableId);
+
+ //! Loads a metadata for an attribute table layer
+ bool loadAddressMetadata(const int& tableId);
+
+ //! Returns true if metadata was loaded
+ bool isMetadataLoaded() const
+ {
+ return isMetadataLoaded_;
+ }
+
+ //! Returns the metadata of the geocode base table
+ TeAddressMetadata getAddressLocatorMetadata() const
+ {
+ return metadata_;
+ }
+
+ //! Set the metadata
+ bool setAddressLocatorMetadata(const TeAddressMetadata& m);
+
+ //! Returns the error message
+ string errorMessage() const
+ {
+ return errMsg_;
+ }
+
+ //! Information about a layer to be used as an alternative for geocoding
+ void setCentroidAddressMetadata(const TeCentroidAddressMetadata& cMetadata)
+ {
+ removeHifenFromCentroid_ = false;
+
+ cmetadata_ = cMetadata;
+
+ if(cmetadata_.fieldType_ == TeZIPCODE && !cmetadata_.centroidName_.empty() && !cmetadata_.attributeTableName_.empty())
+ removeHifenFromCentroid_ = !verifyHifen(cmetadata_.attributeTableName_, cmetadata_.centroidName_);
+ }
+
+ void setReplaceSpecialChars(const bool& r)
+ {
+ changeSpecialChars_ = r;
+ }
+
+ bool getReplaceSpecialChars(void) const
+ {
+ return changeSpecialChars_;
+ }
+
+ void setSplitChar(const string& splitChar)
+ {
+ splitChar_ = splitChar;
+ }
+
+ //! Retrieves all metadata for a layer
+ bool getAllAddressMetadataLayer(const int& layerId, vector<TeAddressMetadata>& addVec);
+
+ //! Retrieves all metadata for a theme
+ bool getAllAddressMetadataTheme(const int& themeId, vector<TeAddressMetadata>& addVec);
+
+ //! Retrieves all layer name that has an address location table
+ bool getAddressLocatorLayers(vector<pair<int, string> >& layerNameVec);
+
+ //! Retrieves all layer table names that is register as an address find table for a given layerId
+ bool getAddressLocatorLayerTables(vector<pair<int, string> >& tableNameVec, const int& layerId);
+
+ //! Finds all geocoding table in a TerraLib database
+ bool findGeocodingTables(vector<pair<int, string> >& tableNames);
+
+ //! Looks the attribute description to transform a name location on an address
+ int findAddress(const TeAddress& address, vector<TeAddressDescription>& addressesFound, const bool& doExaustiveSearch = false);
+
+ //! Finds segment and does an interpolation
+ void findCoordinates(const TeAddress& add, vector<TeAddressDescription>& addresses);
+
+ //! Finds segment and does an interpolation
+ void findCoordinate(const TeAddress& add, TeAddressDescription& address);
+
+ //! Spatialize a table based on the indicated fields
+ bool addressGeocode(TeGeocodeTableMetadata& tableMetadata,
+ const string& newLayerName,
+ const string& reportName,
+ const string& reportDir,
+ const bool& doExaustive = false,
+ TeAbstractAddressNotifyFunctor* notifyFunction = 0);
+
+ //! Load a dictionary to change words in the searched addresses
+ bool loadDictionary(const string& dictionaryFileName);
+
+ //!
+ bool loadAddressCompoundNames();
+
+ //! Used to make columns in upper case
+ bool convertColumnNameToUpper();
+
+ //! Used to join columns in one field
+ bool addCompleteNameColumn();
+
+ protected:
+
+ //! Looks the attribute description to transform a name location on an address
+ int findExact(const TeAddress& address, const string& fullName, const bool& withNumber, vector<TeAddressDescription>& addressesFound);
+
+ //! Looks the attribute description to transform a name location on an address
+ int findPattern(const TeAddress& address, const string& fullName, const bool& withNumber, vector<TeAddressDescription>& addressesFound, const bool& disabletype = false, const bool& disabletitle = false, const bool& disablepreposition = false);
+
+
+ //! Looks the attribute description to transform a name location on an address
+ int findWithDictionary(const TeAddress& address, const string& fullName, const bool& withNumber, vector<TeAddressDescription>& addressesFound);
+
+ //! Looks the attribute description to transform a name location on an address
+ int findWithoutAllName(const TeAddress& address, const string& fullName, vector<TeAddressDescription>& addressesFound, const bool& disabletype = false, const bool& disabletitle = false, const bool& disablepreposition = false);
+
+ //! Looks the attribute description to transform a name location on an address
+ bool findSimilarAddress(const TeAddress& address, const string& fullName, TeAddressDescription& descript);
+
+ //! Try to find a centroid for zip code or neighborhood
+ bool findByCentroid(const TeAddress& addressToFind, vector<TeAddressDescription>& addressesFound);
+
+ //! Fill the metadata parameter
+ void fillAddressMetadata(TeAddressMetadata& metadata, TeDatabasePortal* p);
+
+ //! Fill address descriptions
+ void fillAddressesDescription(vector<TeAddressDescription>& addresses, TeDatabasePortal* p);
+
+ //!
+ void fillAddressDescription(TeAddressDescription& descript, TeDatabasePortal* p);
+
+ //! Fill address information
+ void fillAddress(TeAddress& add, const TeGeocodeTableMetadata& tableMetadata, TeDatabasePortal* p);
+
+ //! Mount a SQL to look for an address
+ string mountExactWhereSQL(const TeAddress& address, const string& fullName);
+
+ string mountLikeWhereSQL(const TeAddress& address, const string& fullName);
+
+ string mountPatternWhereSQL(const TeAddress& address, const string& fullName, const bool& disabletype = false, const bool& disabletitle = false, const bool& disablepreposition = false);
+
+ //!
+ string mountSimilarWhereSQL(const TeAddress& address);
+
+ //! Do some conversions in address fields
+ void normalizeAddress(TeAddress& address, string& completeName);
+
+ //! Removes hifen if remove flag is true
+ void removeHifen(string& zipCode) const;
+
+ //! Removes hifen if remove flag is true
+ void insertHifen(string& zipCode) const;
+
+ //! Inserts a special character in string for Like comparasion
+ string makeLikeExpression(const string& str) const;
+
+ //! Remove caracteres como ponto e troca acentuados por n�o acentuados
+ void removeSpecialCharacters(string& str) const;
+
+ //!
+ bool verifyHifen(const string& tableName, const string& columnName);
+
+ //!
+ bool addReportColumn(TeGeocodeTableMetadata& tableMetadata, pair<string, string>& newColumns);
+
+ //!
+ bool findTableMetadata(TeGeocodeTableMetadata& tableMetadata);
+
+ //! Update the table that contains address to be geocoded with the code returned by the geocoding process and a description of the process match
+ bool updateAddressTable(const string& c1, const int& v1, TeGeocodeTableMetadata& tableMetadata, const string& objectId);
+
+ //! Returns a portal to the address table
+ TeDatabasePortal* getAddressTablePortal(TeGeocodeTableMetadata& tableMetadata, int& numRows);
+
+ //!
+ void refineFoundedLocationsByNeighBorhood(const TeAddress& address, vector<TeAddressDescription>& addressesFound);
+
+ //!
+ void refineFoundedLocationsByZipCode(const TeAddress& address, vector<TeAddressDescription>& addressesFound);
+
+ //!
+ void refineFoundedLocationsByNumberNeighboor(const TeAddress& address, vector<TeAddressDescription>& addressesFound);
+
+ //!
+ void refineFoundedLocationsByNumberZipCode(const TeAddress& address, vector<TeAddressDescription>& addressesFound);
+
+ void cleanAddressesFound(const string& locName, vector<TeAddressDescription>& addressesFound, const bool& disabletype = false, const bool& disabletitle = false, const bool& disablepreposition = false);
+
+ //! Split address name and number
+ void splitAddress(TeAddress& add);
+
+ //! Only to query addresses and fill result
+ void queryAddresses(const string& strSQL, bool& queryExecuted, vector<TeAddressDescription>& addressesFound);
+
+ //! No copy allowed
+ TeAddressLocator(const TeAddressLocator& other);
+ TeAddressLocator& operator=(const TeAddressLocator& other);
+};
+
+#endif // __TERRALIB_INTERNAL_ADDRESSLOCATOR_H
+
diff --git a/src/terralib/functions/TeCellAlgorithms.cpp b/src/terralib/functions/TeCellAlgorithms.cpp
new file mode 100644
index 0000000..042b8ae
--- /dev/null
+++ b/src/terralib/functions/TeCellAlgorithms.cpp
@@ -0,0 +1,1066 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeCellAlgorithms.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeDatabase.h"
+#include "TeProgress.h"
+#include "TeRepresentation.h"
+#include "TeGeneralizedProxMatrix.h"
+
+TeLayer*
+TeCreateCells( const string& layerName, TeLayer* layerBase,
+ double resX, double resY, TeBox& box, bool mask)
+{
+ if (!layerBase || layerName.empty())
+ return 0;
+
+ TeDatabase* db = layerBase->database();
+ if (!db)
+ return 0;
+
+ TeDatabasePortal* portal = db->getPortal();
+ if (!portal)
+ return 0;
+
+ TeProjection* proj = layerBase->projection();
+
+ string newLayerName = layerName;
+ TeLayerMap& layerMap = db->layerMap();
+ TeLayerMap::iterator it;
+ bool flag = true;
+ int n = 1;
+ while (flag)
+ {
+ for (it = layerMap.begin(); it != layerMap.end(); ++it)
+ {
+ if (TeStringCompare(it->second->name(),newLayerName))
+ break;
+ }
+ if (it == layerMap.end())
+ flag = 0;
+ else
+ newLayerName = layerName + "_" +Te2String(n);
+ n++;
+ }
+
+ string polTableName;
+ if (mask)
+ {
+ TeRepresentation* repp = layerBase->getRepresentation(TePOLYGONS);
+ if (repp)
+ {
+ if (!box.isValid())
+ box = adjustToCut(repp->box_,resX,resY);
+ polTableName = repp->tableName_;
+ }
+ else
+ mask = false;
+ }
+ else
+ {
+ if (!box.isValid())
+ box = adjustToCut(layerBase->box(),resX,resY);
+ }
+
+ TeBox newBox = adjustToCut(box,resX,resY);
+ double x,y,x1,x2,y1,y2;
+ x1 = newBox.x1_;
+ y1 = newBox.y1_;
+ x2 = newBox.x2_;
+ y2 = newBox.y2_;
+
+ int maxcols, maxlines;
+ maxlines = TeRound((y2-y1)/resY);
+ maxcols = TeRound((x2-x1)/resX);
+
+ TeAttribute attribute;
+ TeAttributeList attList;
+ attribute.rep_.name_ = "object_id_";
+ attribute.rep_.type_ = TeSTRING;
+ attribute.rep_.numChar_ = 48;
+ attribute.rep_.isPrimaryKey_ = true;
+ attList.push_back ( attribute );
+ attribute.rep_.name_ = "Col";
+ attribute.rep_.type_ = TeINT;
+ attList.push_back ( attribute );
+ attribute.rep_.name_ = "Lin";
+ attribute.rep_.type_ = TeINT;
+ attribute.rep_.isPrimaryKey_ = false;
+ attList.push_back ( attribute );
+
+ TeLayer* newLayer = new TeLayer(layerName,db,newBox,proj);
+ if (!newLayer || newLayer->id() <= 0)
+ {
+ delete portal;
+ return 0;
+ }
+ newLayer->addGeometry(TeCELLS);
+ TeRepresentation* repp = newLayer->getRepresentation(TeCELLS);
+ if (!repp)
+ {
+ db->deleteLayer(newLayer->id());
+ delete portal;
+ return 0;
+ }
+ repp->box_ = newBox;
+ repp->resX_ = resX;
+ repp->resY_ = resY;
+ repp->nCols_ = maxcols;
+ repp->nLins_ = maxlines;
+ db->updateRepresentation(newLayer->id(),*repp);
+
+ TeTable attTable (layerName,attList,"object_id_","object_id_",TeAttrStatic);
+ newLayer->createAttributeTable(attTable);
+
+ TeCellSet cells;
+ cells.resX(resX);
+ cells.resY(resY);
+
+ int col,lin,ncels=0;
+ bool status;
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(maxlines);
+
+ TePolygon curPol;
+ bool found = false;
+
+ TePrecision::instance().setPrecision(TeGetPrecision(proj));
+
+ y=y2;
+ for (lin=0; lin<maxlines; ++lin)
+ {
+ double yu = y;
+ y=y-resY;
+ x=x1;
+
+ for (col=0; col<maxcols; ++col)
+ {
+ TeBox box(x,y,x+resX,yu);
+ found = false;
+ // check if there should be used the polygon representation as a mask
+ if (mask)
+ {
+ TePolygon polBox = polygonFromBox(box);
+ // check if the cell intersects the current polygon
+ if (TeIntersects(polBox,curPol))
+ found = true;
+ else
+ {
+ if (db->spatialRelation(polTableName, TePOLYGONS,
+ (TePolygon*)&polBox, portal, TeINTERSECTS))
+ {
+ portal->fetchGeometry(curPol);
+ found = true;
+ }
+ portal->freeResult();
+ }
+ }
+
+ if (!mask || found)
+ {
+ // build geometry
+ TeCell cell(box,col,lin);
+ char celId[32];
+ sprintf(celId,"C%02dL%02d",col,lin);
+ cell.objectId(string(celId));
+ cells.add(cell);
+
+ // build default attributes
+ TeTableRow row;
+ row.push_back(cell.objectId());
+ row.push_back(Te2String(col));
+ row.push_back(Te2String(lin));
+ attTable.add(row);
+ ncels++;
+ }
+ x=x+resX;
+ }
+ if (attTable.size() > 0) // if there is some attributes in this line
+ {
+ status = newLayer->saveAttributeTable(attTable);
+ attTable.clear();
+ status = newLayer->addCells(cells);
+ cells.clear();
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ else
+ TeProgress::instance()->setProgress(lin);
+ }
+ }
+ }
+ delete portal;
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ if (ncels > 0)
+ return newLayer;
+ else
+ {
+ db->deleteLayer(newLayer->id());
+ return 0;
+ }
+}
+
+
+TeLayer*
+TeCreateCells(const string& layerName,TeTheme* theme, double resX, double resY, TeBox& box)
+{
+ TeLayer* inputLayer = theme->layer();
+ TeRepresentation* pp = inputLayer->getRepresentation(TePOLYGONS);
+ if (!pp)
+ return 0;
+
+ TeDatabase* db = inputLayer->database();
+ TeDatabasePortal* portal = db->getPortal();
+ if (!portal)
+ return 0;
+
+ string newLayerName = layerName;
+ TeLayerMap& layerMap = db->layerMap();
+ TeLayerMap::iterator it;
+ bool flag = true;
+ int n = 1;
+ while (flag)
+ {
+ for (it = layerMap.begin(); it != layerMap.end(); ++it)
+ {
+ if (TeStringCompare(it->second->name(),newLayerName))
+ break;
+ }
+ if (it == layerMap.end())
+ flag = 0;
+ else
+ newLayerName = layerName + "_" +Te2String(n);
+ n++;
+ }
+
+ if (!box.isValid())
+ box = pp->box_;
+
+ TeBox newBox = adjustToCut(box,resX,resY);
+ double x,y,x1,x2,y1,y2;
+ x1 = newBox.x1_;
+ y1 = newBox.y1_;
+ x2 = newBox.x2_;
+ y2 = newBox.y2_;
+
+ int maxcols, maxlines;
+ maxlines = TeRound((y2-y1)/resY);
+ maxcols = TeRound((x2-x1)/resX);
+
+ TeAttribute attribute;
+ TeAttributeList attList;
+ attribute.rep_.name_ = "object_id_";
+ attribute.rep_.type_ = TeSTRING;
+ attribute.rep_.isPrimaryKey_ = true;
+ attribute.rep_.numChar_ = 48;
+ attList.push_back ( attribute );
+
+ attribute.rep_.name_ = "Col";
+ attribute.rep_.type_ = TeINT;
+ attribute.rep_.isPrimaryKey_ = false;
+ attList.push_back ( attribute );
+
+ attribute.rep_.name_ = "Lin";
+ attribute.rep_.type_ = TeINT;
+ attribute.rep_.isPrimaryKey_ = false;
+ attList.push_back ( attribute );
+
+ TeLayer* newLayer = new TeLayer(layerName,db,newBox,inputLayer->projection());
+ if (!newLayer || newLayer->id() <= 0)
+ {
+ return 0;
+ delete portal;
+ }
+ newLayer->addGeometry(TeCELLS);
+ TeRepresentation* repp = newLayer->getRepresentation(TeCELLS);
+ if (!repp)
+ {
+ db->deleteLayer(newLayer->id());
+ delete portal;
+ return 0;
+ }
+ repp->box_ = newBox;
+ repp->resX_ = resX;
+ repp->resY_ = resY;
+ repp->nCols_ = maxcols;
+ repp->nLins_ = maxlines;
+ db->updateRepresentation(newLayer->id(),*repp);
+
+ TeTable attTable (layerName,attList,"object_id_","object_id_",TeAttrStatic);
+ newLayer->createAttributeTable(attTable);
+
+ string polTableName = inputLayer->tableName(TePOLYGONS);
+
+ TeCellSet cells;
+ cells.resX(resX);
+ cells.resY(resY);
+
+ TePolygon curPol;
+ int col,lin;
+ bool status;
+ int ncels = 0;
+
+ TePrecision::instance().setPrecision(TeGetPrecision(newLayer->projection()));
+
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(maxlines);
+
+ bool found;
+ y=y2;
+ for (lin=0; lin<maxlines; ++lin)
+ {
+ double yu = y;
+ y=y-resY;
+ x=x1;
+ for (col=0; col<maxcols; ++col)
+ {
+ found = false;
+ TeBox box(x,y,x+resX,yu);
+
+ TePolygon polBox = polygonFromBox(box);
+ // check if the cell intersects the current polygon
+ if (TeIntersects(polBox,curPol))
+ found = true;
+ else
+ {
+ if (db->spatialRelation(polTableName, TePOLYGONS,
+ (TePolygon*)&polBox, portal, TeINTERSECTS, theme->collectionTable()))
+ {
+ portal->fetchGeometry(curPol);
+ found = true;
+ }
+ portal->freeResult();
+ }
+ if (found)
+ {
+ TeCell cell(box,col,lin);
+ char celId[32];
+ sprintf(celId,"C%02dL%02d",col,lin);
+ cell.objectId(string(celId));
+ cells.add(cell);
+
+ TeTableRow row;
+ row.push_back(cell.objectId());
+ row.push_back(Te2String(col));
+ row.push_back(Te2String(lin));
+ attTable.add(row);
+ ++ncels;
+ }
+ x=x+resX;
+ }
+ if (attTable.size() > 0) // if there is some attributes in this line
+ {
+ status = newLayer->saveAttributeTable(attTable);
+ attTable.clear();
+ status = newLayer->addCells(cells);
+ cells.clear();
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ else
+ TeProgress::instance()->setProgress(lin);
+ }
+ }
+ }
+ delete portal;
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ if (ncels > 0)
+ return newLayer;
+ else
+ {
+ db->deleteLayer(newLayer->id());
+ return 0;
+ }
+}
+
+
+bool
+TeCellStatistics(TeTheme* themeOut, TeTable& newAttrTable, TeGroupingAttr& stat,
+ TeTheme* themeIn, TeDatabase* db)
+{
+
+ TeGroupingAttr tempStat = stat;
+ string sqlResut = db->getSQLStatistics (tempStat);
+
+ bool dbStat = true;
+ TeGroupingAttr::iterator it = tempStat.begin();
+ while(it!= tempStat.end())
+ {
+ if(it->second != TeNOSTATISTIC)
+ {
+ dbStat = false;
+ break;
+ }
+ ++it;
+ }
+
+ if((!dbStat) || (sqlResut.empty()))
+ return false;
+
+ TeDatabasePortal* portal = db->getPortal();
+
+ // mount sql
+ //geom and collection tables from cell layer (cell)
+ string tableGeomOut = themeOut->layer()->tableName (TeCELLS);
+ string tableCollOut;
+ if(themeOut->hasRestriction())
+ tableCollOut = themeOut->collectionTable();
+
+ //geom and collection tables from in layer (point or cell)
+ string tableGeomIn = themeIn->layer()->tableName (TePOINTS);
+ TeGeomRep geomRepIn = TePOINTS;
+ if(tableGeomIn.empty())
+ {
+ geomRepIn = TeCELLS;
+ tableGeomIn = themeIn->layer()->tableName (TeCELLS);
+ }
+
+ string tableCollIn;
+ if(themeIn->hasRestriction())
+ tableCollIn = themeIn->collectionTable();
+
+ //sql from database
+ string sql = " SELECT " + tableGeomOut + ".object_id, ";
+ sql += sqlResut;
+ sql += " FROM " + tableGeomOut +","+ tableGeomIn;
+
+ //for each point attr table
+ string sqlWhere ="";
+ TeAttrTableVector vec = themeIn->attrTables();
+ for(unsigned int index=0; index<vec.size(); ++index)
+ {
+ if( (vec[index].tableType() != TeAttrStatic) &&
+ (vec[index].tableType() != TeAttrEvent) &&
+ (vec[index].tableType() != TeFixedGeomDynAttr)) //only to static attribute table
+ continue;
+
+ //from clause
+ sql += ","+ vec[index].name();
+
+ //where clause
+ if(!sqlWhere.empty())
+ sqlWhere += " AND ";
+ sqlWhere += vec[index].name() +"."+ vec[index].linkName() +" = "+ tableGeomIn +".object_id ";
+ }
+
+ if(!tableCollIn.empty())
+ {
+ sql += ", "+ tableCollIn;
+ if(!sqlWhere.empty())
+ sqlWhere += " AND ";
+
+ sqlWhere = tableGeomIn +".object_id = "+ tableCollIn +".c_object_id ";
+ }
+ if(!tableCollOut.empty())
+ {
+ sql += ", "+ tableCollOut;
+ if(!sqlWhere.empty())
+ sqlWhere += " AND ";
+
+ sqlWhere += tableGeomOut +".object_id = "+ tableCollOut +".c_object_id ";
+ }
+
+ //box where
+ if(!sqlWhere.empty())
+ sqlWhere += " AND ";
+
+ sqlWhere += db->getSQLBoxWhere (tableGeomOut, tableGeomIn, geomRepIn);
+
+ sql += " WHERE "+ sqlWhere;
+ sql += " GROUP BY "+ tableGeomOut +".object_id";
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ //Keep statistics in the tableAttrCell table
+ if(!TeKeepStatistics(newAttrTable, portal))
+ {
+ delete portal;
+ return false;
+ }
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeKeepStatistics(TeTable& tableAttrCell, TeDatabasePortal* portal)
+{
+
+ TeAttributeList attr = portal->AttributeList();
+
+ //Mount the update sql from portal
+ string insert = "INSERT INTO "+ tableAttrCell.name() +" VALUES ( ";
+ while(portal->fetchRow())
+ {
+ string insert2 = "";
+ for(unsigned int i=0; i<attr.size(); ++i)
+ {
+ if(i>0)
+ insert2 += ",";
+
+ string val = portal->getData(i);
+ if (attr[i].rep_.type_ == TeSTRING)
+ insert2 += "'"+ val +"'";
+ else
+ insert2 += val;
+ }
+
+ string result = insert + insert2 +" )";
+
+ if(!portal->getDatabase()->execute(result))
+ return false;
+ }
+
+ return true;
+}
+
+
+
+
+
+//////////////////////////////////////////////////////////////////////
+//
+// Fill Cell Auxiliary Funcions
+//
+/////////////////////////////////////////////////////////////////////
+
+
+bool TeFillCellInitLoad (TeLayer* cell_layer, const string& cell_tablename, TeCellSet& cells)
+{
+ if (!cell_layer) return false;
+
+ // get cells
+ if (!cell_layer->getCells (cells)) return false;
+
+ // if dynamic table was not created, create it
+ TeTable table;
+ if (!cell_layer->getAttrTablesByName(cell_tablename, table, TeFixedGeomDynAttr))
+ if (!TeCreateBasicDymanicCellTable (cell_layer, cell_tablename))
+ return false;
+
+ return true;
+}
+
+
+
+void TeFillCellInitSTO (const TeCell& cell, TeTimeInterval& t, TePropertyVector& result, TeSTElementSet& cellObjSet)
+{
+
+ TeSTInstance cellObj;
+ cellObj.objectId (cell.objectId());
+ string uniqueId = cell.objectId();
+ cellObj.addUniqueId (uniqueId); // ANAP
+ uniqueId += t.getInitialDate() + t.getInitialTime();
+ uniqueId += t.getFinalDate() + t.getFinalTime() ;
+ cellObj.addUniqueId (uniqueId);
+ cellObj.timeInterval (t);
+ TePropertyVector::iterator itProp = result.begin();
+ while (itProp != result.end())
+ {
+ cellObj.addProperty (*itProp);
+ itProp++;
+ }
+ cellObjSet.insertSTInstance (cellObj);
+ return;
+}
+
+
+
+bool
+TeCreateBasicDymanicCellTable (TeLayer* cell_layer, const string cell_tablename)
+{
+ if (!cell_layer) return false;
+
+ TeAttribute attribute;
+ TeAttributeList attList;
+ TeAttributeList keyList;
+
+ // attr_id
+ attribute.rep_.name_ = "attr_id";
+ attribute.rep_.type_ = TeSTRING;
+ attribute.rep_.numChar_ = 48;
+ attribute.rep_.isPrimaryKey_ = true;
+ attList.push_back (attribute);
+ keyList.push_back(attribute);
+
+ // object_id
+ attribute.rep_.name_ = "object_id";
+ attribute.rep_.type_ = TeSTRING;
+ attribute.rep_.numChar_ = 48;
+ attList.push_back ( attribute );
+
+
+ // initial_time
+ attribute.rep_.name_ = "initial_time";
+ attribute.rep_.type_ = TeDATETIME;
+ attribute.dateTimeFormat_ = "YYYYsMMsDDsHHsMMsSS";
+ attribute.dateChronon_ = TeSECOND;
+ attribute.rep_.numChar_ = 48;
+ attList.push_back ( attribute );
+
+
+ // final_time
+ attribute.rep_.name_ = "final_time";
+ attribute.rep_.type_ = TeDATETIME;
+ attribute.dateTimeFormat_ = "YYYYsMMsDDsHHsMMsSS";
+ attribute.dateChronon_ = TeSECOND;
+ attribute.rep_.numChar_ = 48;
+ attList.push_back ( attribute );
+
+ // Create table and initialize attributes
+
+ TeTable cells_attTable (cell_tablename);
+ cells_attTable.setAttributeList(attList);
+ cells_attTable.setTableType(TeFixedGeomDynAttr);
+ cells_attTable.setLinkName("object_id");
+ cells_attTable.setUniqueName("attr_id");
+ cells_attTable.attInitialTime ("initial_time");
+ cells_attTable.attFinalTime ("final_time");
+ cells_attTable.attTimeUnit (TeSECOND);
+
+ if (!cell_layer->createAttributeTable(cells_attTable))
+ return false;
+
+ TeAttributeList attr;
+ cell_layer->database ()->getAttributeList (cell_tablename, attr);
+
+ return true;
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+//
+// Fill Cell Operations
+//
+/////////////////////////////////////////////////////////////////////
+
+bool TeFillCellSpatialOperation (TeDatabase* db,
+ const string& input_layername,
+ TeGeomRep rep,
+ const string& input_tablename,
+ const string& input_attrname,
+ TeTimeInterval t,
+ const string& cell_layername,
+ const string& cell_tablename,
+ const string& output_columnName,
+ TeComputeAttrSpatialStrategy* operation)
+
+{
+ if (!operation) return false;
+ if (!db) return false;
+
+// Load input layers
+ TeLayer* input_layer = new TeLayer (input_layername);
+ if (!db->loadLayer (input_layer))
+ {
+ cout << "\tLayer de entrada inexistente: " << input_layername << endl;
+ db->close();
+ return false;
+ }
+
+// Load output cells layer with geometry previously created
+ TeLayer* cell_layer = new TeLayer (cell_layername);
+ if (!db->loadLayer (cell_layer))
+ {
+ cout << "\tLayer de entrada inexistente: " << cell_layername << endl;
+ db->close();
+ return false;
+ }
+
+// Initialize cell set
+ TeCellSet cells;
+ if (!TeFillCellInitLoad (cell_layer, cell_tablename, cells)) return false;
+
+
+// Initialize object set to store cell properties
+ TeSTElementSet cellObjSet (cell_layer);
+
+// Initialize theme
+
+ TeTheme* theme = new TeTheme ("", input_layer);
+ vector<string> attrTableNames;
+ attrTableNames.push_back (input_tablename);
+ TeAttrTableVector atts;
+ if (!input_layer->getAttrTablesByName(attrTableNames, atts)) return false;
+ theme->setAttTables (atts);
+
+// Process
+ TePropertyVector result;
+ TeCellSet::iterator cell_it = cells.begin();
+ while (cell_it != cells.end())
+ {
+ // Set restrictions on a theme and create stoset
+ theme->setSpatialRest((*cell_it).box(), rep);
+ result = operation->compute (theme, input_attrname, (*cell_it).box(), output_columnName);
+ TeFillCellInitSTO ((*cell_it), t, result, cellObjSet);
+ cell_it++;
+
+ }
+
+// Update DB
+ if (!TeUpdateDBFromSet(&cellObjSet, cell_tablename))
+ return false;
+ return true;
+}
+
+
+
+bool TeFillCellNonSpatialOperation (TeDatabase* db,
+ const string& input_layername,
+ TeGeomRep rep,
+ const string& input_tablename,
+ const string& input_attrname,
+ TeTimeInterval t,
+ const string& cell_layername,
+ const string& cell_tablename,
+ const string& output_columnName,
+ TeComputeAttrStrategy<TeSTElementSet::propertyIterator>* operation)
+{
+ if (!db) return false;
+
+// Load input layers
+ TeLayer* input_layer = new TeLayer (input_layername);
+ if (!db->loadLayer (input_layer))
+ {
+ cout << "\tLayer de entrada inexistente: " << input_layername << endl;
+ db->close();
+ return false;
+ }
+
+// Load output cells layer with geometry previously created
+ TeLayer* cell_layer = new TeLayer (cell_layername);
+ if (!db->loadLayer (cell_layer))
+ {
+ cout << "\tLayer de entrada inexistente: " << cell_layername << endl;
+ db->close();
+ return false;
+ }
+
+// Initialize cell set
+ TeCellSet cells;
+ if (!TeFillCellInitLoad (cell_layer, cell_tablename, cells)) return false;
+
+// Initialize object set to store cell properties
+ TeSTElementSet cellObjSet (cell_layer);
+
+// Initialize theme
+ TeTheme* theme = new TeTheme ("", input_layer);
+ vector<string> attrTableNames;
+ attrTableNames.push_back (input_tablename);
+ TeAttrTableVector atts;
+ if (!input_layer->getAttrTablesByName(attrTableNames, atts)) return false;
+ theme->setAttTables (atts);
+
+// Process
+ TePropertyVector result;
+ TeCellSet::iterator cell_it = cells.begin();
+ while (cell_it != cells.end())
+ {
+ // Set restrictions on a theme and create stoset
+ theme->setSpatialRest((*cell_it).box(), rep);
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (input_attrname);
+ if (TeSTOSetBuildDB (&stos, false, false, attrNames))
+ result = operation->compute (stos.begin(input_attrname), stos.end(input_attrname), output_columnName); // if property not found, stos iterator will return zero to operation. To check this, have to be less general and use getProperty inside the compute method.
+
+ TeFillCellInitSTO ((*cell_it), t, result, cellObjSet);
+ cell_it++;
+
+ }
+
+// Update DB
+ if (!TeUpdateDBFromSet (&cellObjSet, cell_tablename))
+ return false;
+ return true;
+}
+
+
+
+
+
+bool TeFillCellNonSpatialRasterOperation (TeDatabase* db,
+ const string& input_raster_layername,
+ TeTimeInterval t,
+ const string& cell_layername,
+ const string& cell_tablename,
+ const string& output_columnName,
+ TeComputeAttrStrategy<TeRaster::iteratorPoly>* operation)
+{
+ if (!db) return false;
+
+// Load input layers
+ TeLayer* input_layer = new TeLayer (input_raster_layername);
+ if (!db->loadLayer (input_layer))
+ {
+ cout << "\tLayer de entrada inexistente: " << input_raster_layername << endl;
+ db->close();
+ return false;
+ }
+
+ TeRaster* raster = input_layer->raster();
+ if (!raster) return false;
+
+
+// Load output cells layer with geometry previously created
+ TeLayer* cell_layer = new TeLayer (cell_layername);
+ if (!db->loadLayer (cell_layer))
+ {
+ cout << "\tLayer de entrada inexistente: " << cell_layername << endl;
+ db->close();
+ return false;
+ }
+
+
+// Initialize cell set
+ TeCellSet cells;
+ if (!TeFillCellInitLoad (cell_layer, cell_tablename, cells)) return false;
+
+
+// Initialize object set to store cell properties
+ TeSTElementSet cellObjSet (cell_layer);
+
+
+// Process
+ TePropertyVector result;
+ TeCellSet::iterator cell_it = cells.begin();
+ while (cell_it != cells.end())
+ {
+ TePolygon p = TeBox2Polygon((*cell_it).box());
+ TeRaster::iteratorPoly rasterItBegin(raster);
+ rasterItBegin = raster->begin(p, TeBBoxPixelInters, 0);
+ TeRaster::iteratorPoly rasterItEnd(raster);
+ rasterItEnd = raster->end(p, TeBBoxPixelInters, 0);
+
+ result = operation->compute (rasterItBegin, rasterItEnd, output_columnName);
+ TeFillCellInitSTO ((*cell_it), t, result, cellObjSet);
+ cell_it++;
+ }
+
+// Update DB
+ if (!TeUpdateDBFromSet (&cellObjSet, cell_tablename))
+ return false;
+ return true;
+}
+
+
+
+bool TeFillCellAggregateOperation ( TeDatabase* db,
+ const string& input_layername,
+ const string& input_tablename,
+ TeTimeInterval t,
+ const string& cell_layername,
+ const string& cell_tablename,
+ vector<string>& attrNames,
+ TeComputeAttrStrategy<TeSTElementSet::propertyIterator>* operation)
+{
+ if (!db) return false;
+
+
+// Load input layers
+ TeLayer* input_layer = new TeLayer (input_layername);
+ if (!db->loadLayer (input_layer))
+ {
+ cout << "\tLayer de entrada inexistente: " << input_layername << endl;
+ db->close();
+ return false;
+ }
+
+
+// Load output cells layer with geometry previously created
+ TeLayer* cell_layer = new TeLayer (cell_layername);
+
+ if (!db->loadLayer (cell_layer))
+ {
+ cout << "\tLayer de entrada inexistente: " << cell_layername << endl;
+ db->close();
+ return false;
+ }
+
+// Initialize cell set
+ TeCellSet cells;
+ if (!TeFillCellInitLoad (cell_layer, cell_tablename, cells)) return false;
+
+
+// Initialize object set to store cell properties
+ TeSTElementSet cellObjSet (cell_layer);
+
+// Initialize theme
+
+ TeTheme* theme = new TeTheme ("", input_layer);
+ vector<string> attrTableNames;
+ attrTableNames.push_back (input_tablename);
+ TeAttrTableVector atts;
+ if (!input_layer->getAttrTablesByName(attrTableNames, atts)) return false;
+ theme->setAttTables (atts);
+
+
+// Process
+ TeCellSet::iterator cell_it = cells.begin();
+ while (cell_it != cells.end())
+ {
+ TeSTInstance cellObj;
+ cellObj.objectId ((*cell_it).objectId());
+ string uniqueId = (*cell_it).objectId();
+ cellObj.addUniqueId (uniqueId);
+ uniqueId += t.getInitialDate() + t.getInitialTime();
+ uniqueId += t.getFinalDate() + t.getFinalTime() ;
+ cellObj.addUniqueId (uniqueId);
+ cellObj.timeInterval (t);
+
+ // Set restrictions on a theme and create stoset
+ theme->setSpatialRest((*cell_it).box(), TeCELLS); //????? TeWITHIN ok? ANAP
+ TeSTElementSet stos (theme);
+ TeSTOSetBuildDB (&stos, true, false, attrNames);
+
+ // Create stoset based on input layer
+ TePropertyVector result;
+ vector<string>::iterator attIt = attrNames.begin();
+ while (attIt != attrNames.end())
+ {
+ result = operation->compute (stos.begin(*attIt), stos.end(*attIt), (*attIt)); // if property not found, stos iterator will return zero to operation. To check this, have to be less general and use getProperty inside the compute method.
+ TePropertyVector::iterator itProp = result.begin();
+ while (itProp != result.end())
+ {
+ cellObj.addProperty (*itProp);
+ itProp++;
+ }
+ attIt++;
+ }
+ cellObjSet.insertSTInstance (cellObj);
+
+ cell_it++;
+ }
+
+// Update DB
+ if (!TeUpdateDBFromSet (&cellObjSet, cell_tablename))
+ return false;
+
+ return true;
+}
+
+
+
+
+
+
+bool TeFillCellConnectionOperation ( TeDatabase* db,
+ TeSTElementSet objects,
+ TeGeomRep rep,
+ TeGraphNetwork* net,
+ const string& input_attrName,
+
+ TeTimeInterval t,
+ const string& cell_layername,
+ const string& cell_tablename,
+ const string& output_columnName,
+
+
+ TeComputeAttrStrategy<TeSTElementSet::propertyIterator>* operation,
+ double local_distance_factor,
+ double net_distance_factor,
+ double net_conn_factor,
+ double mult_factor)
+{
+
+ if (!operation) return false;
+ if (!net) return false;
+ if (!db) return false;
+
+ // Load output cells layer with geometry previously created
+
+ TeLayer* cell_layer = new TeLayer (cell_layername);
+
+ if (!db->loadLayer (cell_layer))
+ {
+ cout << "\tLayer de entrada inexistente: " << cell_layername << endl;
+ db->close();
+ return false;
+ }
+
+// Initialize cell set
+ TeCellSet cells;
+ if (!TeFillCellInitLoad (cell_layer, cell_tablename, cells)) return false;
+
+
+// Initialize object set to store cell properties
+ TeSTElementSet cellObjSet (cell_layer);
+
+
+// Process
+ TePropertyVector result;
+ TeCellSet::iterator cell_it = cells.begin();
+ while (cell_it != cells.end())
+ {
+ TeSTInstance cellObj;
+ cellObj.objectId ((*cell_it).objectId());
+ string uniqueId = (*cell_it).objectId();
+ cellObj.addUniqueId (uniqueId);
+ uniqueId += t.getInitialDate() + t.getInitialTime();
+ uniqueId += t.getFinalDate() + t.getFinalTime() ;
+ cellObj.addUniqueId (uniqueId);
+ cellObj.timeInterval (t);
+ cellObjSet.insertSTInstance (cellObj);
+ cell_it++;
+ }
+
+ TeProxMatrixOpenNetworkStrategy2 sc_net (&cellObjSet, TeCELLS, &objects, rep, 0, TeMAXFLOAT, TeMAXFLOAT, net);
+ // TeProxMatrixConnectionStrenghtStrategy sw(4, 0.0, false);
+ TeProxMatrixInverseDistanceStrategy sw (local_distance_factor, net_distance_factor, net_conn_factor, mult_factor, false);
+ TeProxMatrixNoSlicingStrategy ss_no;
+ TeGeneralizedProxMatrix mat (&sc_net, &sw, &ss_no);
+
+ // initialize object set to store cell properties
+ TeSTElementSet cellObjSet2 (cell_layer);
+ TeCellSet::iterator cell_it2 = cells.begin();
+ while (cell_it2 != cells.end())
+ {
+ TeSTElementSet neigh = mat.getSTENeighbours((*cell_it2).objectId());
+
+ result = operation->compute (neigh.begin(input_attrName), neigh.end(input_attrName), output_columnName); // if property not found, stos iterator will return zero to operation. To check this, have to be less general and use getProperty inside the compute method.
+ TeFillCellInitSTO ((*cell_it2), t, result, cellObjSet2);
+ cell_it2++;
+ }
+
+
+// Update DB
+ if (!TeUpdateDBFromSet (&cellObjSet2, cell_tablename))
+ return false;
+
+ return true;
+}
+
+
diff --git a/src/terralib/functions/TeCellAlgorithms.h b/src/terralib/functions/TeCellAlgorithms.h
new file mode 100644
index 0000000..055c792
--- /dev/null
+++ b/src/terralib/functions/TeCellAlgorithms.h
@@ -0,0 +1,268 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeCellAlgorithms.h
+ This file contains algorithms and operations to deal with on cell geometry
+*/
+
+#ifndef __TERRALIB_INTERNAL_CELLALGORITHMS_H
+#define __TERRALIB_INTERNAL_CELLALGORITHMS_H
+
+#include "TeSTElementSet.h"
+#include "TeComputeAttributeStrategies.h"
+
+class TeDatabase;
+class TeLayer;
+class TeGraphNetwork;
+
+
+using namespace std;
+
+
+/** @defgroup CellAlg Functions to generate and operate on cell geometry
+ * @{
+ */
+
+/*!
+ \brief Creates a new layer with the cells that covers the polygons of a theme
+ \param layerName name of the new layer with cell representations
+ \param theme pointer to the theme that has the polygons
+ \param resX X resolution of each cell
+ \param resY Y resolution of each cell
+ \param box bounding box of interest
+ \return a pointer to the new layer created if success or null if fail
+*/
+TeLayer* TeCreateCells(const string& layerName,TeTheme* theme, double resX, double resY, TeBox& box);
+
+/*!
+ \brief Creates a new layer with the cells that covers the entire bounding box, or the polygons of a layer
+ \param layerName name of the new layer with cell representations
+ \param layerBase pointer to the base layer
+ \param resX X resolution of each cell
+ \param resY Y resolution of each cell
+ \param mask flag that indicates if the cells should be created only over the polygons of the layer
+ \param box bounding box of interest
+ \return a pointer to the new layer created if success or null if fail
+*/
+TeLayer* TeCreateCells( const string& layerName, TeLayer* layerBase,
+ double resX, double resY, TeBox& box, bool mask = true);
+
+
+/*!
+ \brief Calculates a set of statistics of cells of a theme
+ \param themeOut cell theme
+ \param newAttrTable new attribute table where the generated statistics will be kept
+ \param stat the structure that contains the statistics which will be generated
+ \param themeIn point or cell theme
+ \param db a pointer to the database
+*/
+bool
+TeCellStatistics(TeTheme* themeOut, TeTable& newAttrTable, TeGroupingAttr& stat,
+ TeTheme* themeIn, TeDatabase* db);
+
+
+/*!
+ \brief Saves the statistics accessible through a TeDatabasePortal in a database table
+ \param tableAttrCell attribute table name where the generated statistics will be kept
+ \param portal a pointer to the database portal that contains the generated statistics
+*/
+bool TeKeepStatistics(TeTable& tableAttrCell, TeDatabasePortal* portal);
+
+
+/** @} */ // End of group CellAlg format
+
+
+//////////////////////////////////////////////////////////////////////
+//
+// Fill Cell Function (headers)
+//
+/////////////////////////////////////////////////////////////////////
+/** @defgroup FillCellAlg Functions to fill one attribute (or group of related attributes) for all cells in the output layer based on a single input layer attribute for a given time interval. Specific operation to be applied is a parameter (Strategy pattern).
+ * @{
+ */
+
+/*!
+ \brief Computes the cell attribute based on a spatial operation (TeComputeAttrSpatialStrategy) over a vector input layer.
+ \param db a pointer to the database in which input and output layers are stored
+ \param input_layername name of input layer
+ \param rep input layer representation to be used
+ \param input_tablename input layer attribute table to be used
+ \param input_attrname input layer attribute to be used to compute output attribute
+ \param t time interval of output cells attributes
+ \param cell_layername output cell layer
+ \param cell_tablename output cell attribute dynamic table; if does not exist, the table will be created by the function
+ \param output_columnName output attribute name
+ \param operation operation to be applied (see TeComputeAttrSpatialStrategy hierarchy)
+*/
+bool TeFillCellSpatialOperation ( TeDatabase* db,
+ const string& input_layername,
+ TeGeomRep rep,
+ const string& input_tablename,
+ const string& input_attrname,
+ TeTimeInterval t,
+ const string& cell_layername,
+ const string& cell_tablename,
+ const string& output_columnName,
+ TeComputeAttrSpatialStrategy* operation);
+
+
+
+/*!
+ \brief Computes the cell attribute based on a non-spatial operation (TeComputeAttrStrategy) over a vector or cell input layer.
+ \param db a pointer to the database in which input and output layers are stored
+ \param input_layername name of input layer
+ \param rep input layer representation to be used
+ \param input_tablename input layer attribute table to be used
+ \param input_attrname input layer attribute to be used to compute output attribute
+ \param t time interval of output cells attributes
+ \param cell_layername output cell layer
+ \param cell_tablename output cell attribute dynamic table; if does not exist, the table will be created by the function
+ \param output_columnName output attribute name
+ \param operation operation to be applied (see TeComputeAttrStrategy hierarchy)
+*/
+bool TeFillCellNonSpatialOperation (TeDatabase* db,
+ const string& input_layername,
+ TeGeomRep rep,
+ const string& input_tablename,
+ const string& input_attrname,
+ TeTimeInterval t,
+ const string& cell_layername,
+ const string& cell_tablename,
+ const string& output_columnName,
+ TeComputeAttrStrategy<TeSTElementSet::propertyIterator>* operation);
+
+/*!
+ \brief Computes the cell attribute based on a non-spatial operation (TeComputeSpatialStrategy) over a raster input layer.
+ \param db a pointer to the database in which input and output layers are stored
+ \param input_raster_layername name of input layer that contains a raster representation
+ \param t time interval of output cells attributes
+ \param cell_layername output cell layer
+ \param cell_tablename output cell attribute dynamic table; if does not exist, the table will be created by the function
+ \param output_columnName output attribute name
+ \param operation operation to be applied (see TeComputeAttrStrategy hierarchy)
+*/
+
+bool TeFillCellNonSpatialRasterOperation (TeDatabase* db,
+ const string& input_raster_layername,
+ TeTimeInterval t,
+ const string& cell_layername,
+ const string& cell_tablename,
+ const string& output_columnName,
+ TeComputeAttrStrategy<TeRaster::iteratorPoly>* operation);
+
+
+
+
+
+/*!
+ \brief Computes the cell attribute based on a non-spatial operation (TeComputeSpatialStrategy) over a certain attribute of a set of objects connected to each cell by a network.
+ \param db a pointer to the database in which input and output layers are stored
+ \param objects set of objects (e.g., ports)
+ \param rep objects representation type
+ \param net netork to be used to verify and quantify cell connectivity to each cell
+ \param input_attrname connected objects attribute to be used to compute output attribute
+ \param t time interval of output cells attributes
+ \param cell_layername output cell layer
+ \param cell_tablename output cell attribute dynamic table; if does not exist, the table will be created by the function
+ \param output_columnName output attribute name
+ \param operation operation to be applied (see TeComputeAttrStrategy hierarchy)
+ \param local_distance_factor multiplier used to compute connection strenght weights: local distance factor (see GPM documentation)
+ \param net_distance_factor multiplier used to compute connection strenght weights: distance to network factor (see GPM documentation)
+ \param net_conn_factor multiplier used to compute connection strenght weights: connection through network factor (see GPM documentation)
+ \param mult_factor multiplier used to compute connection strenght weights: weight multiplier factor (see GPM documentation)
+*/
+
+
+bool TeFillCellConnectionOperation ( TeDatabase* db,
+ TeSTElementSet objects,
+ TeGeomRep rep,
+ TeGraphNetwork* net,
+ const string& input_attrName,
+
+ TeTimeInterval t,
+
+ const string& cell_layername,
+ const string& cell_tablename,
+ const string& output_columnName,
+
+
+ TeComputeAttrStrategy<TeSTElementSet::propertyIterator>* operation,
+ double local_distance_factor = 0.0,
+ double net_distance_factor = 0.25,
+ double net_conn_factor = 1.0,
+ double mult_factor = 1000000.0);
+
+/** @} */ // End of group FillCellAlg
+
+
+/** @defgroup AgregateCellAlg Functions aggregate a set of attributes to coarse resolution cells for a given time interval. Specific (non-spatial) operation to be applied is a parameter (Strategy pattern).
+* @{
+*/
+
+
+/*!
+ \brief Computes a set of attributes for the output cell layer based on a non-spatial operation (TeComputeAttrSpatialStrategy) over a input cell layer.
+ \param db a pointer to the database in which input and output layers are stored
+ \param input_layername name of input cell layer
+ \param input_tablename input layer attribute table to be used
+ \param t time interval of output cells attributes
+ \param cell_layername output cell layer
+ \param cell_tablename output cell attribute dynamic table; if does not exist, the table will be created by the function
+ \param attrNames names of input/output attribute names to be aggregated
+ \param operation operation to be applied (see TeComputeAttrStrategy hierarchy)
+*/
+
+
+bool TeFillCellAggregateOperation ( TeDatabase* db,
+ const string& input_layername,
+ const string& input_tablename,
+ TeTimeInterval t,
+ const string& cell_layername,
+ const string& cell_tablename,
+ vector<string>& attrNames,
+ TeComputeAttrStrategy<TeSTElementSet::propertyIterator>* operation);
+
+/** @} */ // End of group AgregateCellAlg
+
+
+//////////////////////////////////////////////////////////////////////
+//
+// Fill Cell Auxiliary Functions (headers)
+//
+/////////////////////////////////////////////////////////////////////
+
+
+// Load cells geometries and verify/create dynamic attribute table if does not exists
+bool TeFillCellInitLoad (TeLayer* cell_layer, const string& cell_tablename, TeCellSet& cells);
+
+
+
+// Init output cell sto
+void TeFillCellInitSTO (const TeCell& cell, TeTimeInterval& t, TePropertyVector& result, TeSTElementSet& cellObjSet);
+
+// Creates dymanic table
+bool TeCreateBasicDymanicCellTable (TeLayer* cell_layer, const string cell_tablename);
+
+
+
+#endif
+
diff --git a/src/terralib/functions/TeCoordAlgorithms.cpp b/src/terralib/functions/TeCoordAlgorithms.cpp
new file mode 100644
index 0000000..bcc867d
--- /dev/null
+++ b/src/terralib/functions/TeCoordAlgorithms.cpp
@@ -0,0 +1,99 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeCoordAlgorithms.h"
+#include <math.h>
+
+bool TeLongDMS2DD(char hem, short& dg, short& mn, float& sc, double& grauDec)
+{
+ short posat,lim = 180;
+
+ double dd,pi;
+ posat = 0;
+ pi = 4.*atan((double)1.);
+
+ // Longitude
+ if(dg < 0 || dg > lim)
+ return false;
+
+ if(mn < 0 || mn > 60)
+ return false;
+
+ if(sc < 0. || sc > 60.)
+ return false;
+
+ if(hem == 'W' || hem == 'w'|| hem == 'O'|| hem == 'o')
+ {
+ if(dg > 0)
+ dg = dg * -1;
+ else if(mn > 0)
+ mn = mn * -1;
+ else
+ sc = (float)(sc * -1.);
+ }
+
+ dd = (double)(abs(dg)) + ((double)abs(mn)/60.) + fabs(sc)/3600.;
+ if (dg < 0 || mn < 0 || (int)sc < 0)
+ dd = -dd;
+ grauDec = dd;
+ return true;
+}
+
+
+bool
+TeLatDMS2DD(char hem, short& dg, short& mn, float& sc, double& grauDec)
+{
+ short posat,lim = 90;
+
+ double dd,pi;
+ posat = 0;
+ pi = 4.*atan((double)1.);
+
+ // Longitude
+ if(dg < 0 || dg > lim)
+ return false;
+
+ if(mn < 0 || mn > 60)
+ return false;
+
+ if(sc < 0. || sc > 60.)
+ return false;
+
+ if(hem == 's' || hem == 'S')
+ {
+ if(dg > 0)
+ dg = dg * -1;
+ else if(mn > 0)
+ mn = mn * -1;
+ else
+ sc = (float)(sc * -1.);
+ }
+
+ dd = (double)(abs(dg)) + ((double)abs(mn)/60.) + fabs(sc)/3600.;
+ if (dg < 0 || mn < 0 || (int)sc < 0)
+ dd = -dd;
+
+// dd = dd*pi/180.;
+ grauDec = dd;
+ return true;
+}
diff --git a/src/terralib/functions/TeCoordAlgorithms.h b/src/terralib/functions/TeCoordAlgorithms.h
new file mode 100644
index 0000000..0084ee6
--- /dev/null
+++ b/src/terralib/functions/TeCoordAlgorithms.h
@@ -0,0 +1,56 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeCoordAlgorithms.h
+ This file contains some algorithms to deal with geographical coordinates
+*/
+#ifndef __TERRALIB_INTERNAL_COORDALGORITHMS_H
+#define __TERRALIB_INTERNAL_COORDALGORITHMS_H
+
+#include <string>
+using namespace std;
+/*!
+ \fn bool TeLongDMS2DD(char hem, short& dg, short& mn, float& sc, double& grauDec)
+ \brief Transform a Longitude Coordinate in degrees, minutes and seconds to decimal degrees
+ \param hem a character that indicates North or South hemisphere
+ \param dg dregrees value
+ \param mn minutes value
+ \param sc seconds value
+ \param grauDec returns the decimal degree value
+ \return TRUE if input is a valid longitude coordinate
+*/
+bool TeLongDMS2DD(char hem, short& dg, short& mn, float& sc, double& grauDec);
+
+/*!
+ \fn bool TeLatDMS2DD(char hem, short& dg, short& mn, float& sc, double& grauDec)
+ \brief Transform a Latitude Coordinate in degrees, minutes and seconds to decimal degrees
+ \param hem a character that indicates West or East
+ \param dg dregrees value
+ \param mn minutes value
+ \param sc seconds value
+ \param grauDec returns the decimal degree value
+ \return TRUE if input is a valid latitude coordinate
+*/
+bool TeLatDMS2DD(char hem, short& dg, short& mn, float& sc, double& grauDec);
+
+#endif
diff --git a/src/terralib/functions/TeExportDBF.cpp b/src/terralib/functions/TeExportDBF.cpp
new file mode 100644
index 0000000..b3f5027
--- /dev/null
+++ b/src/terralib/functions/TeExportDBF.cpp
@@ -0,0 +1,286 @@
+#include "shapefil.h"
+#include "TeImportExport.h"
+#include "TeTable.h"
+#include "TeException.h"
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeDatabase.h"
+
+bool
+TeExportShapefile(TeLayer& layer)
+{
+ DBFHandle hDBF;
+ SHPHandle hSHP;
+
+ string filename = layer.name();
+ string indexName = layer.indexName();
+ int nrepres = 0;
+ int rep = 0;
+ int nShapeType;
+ if (layer.hasGeometry(TePOINTS))
+ {
+ nShapeType = SHPT_POINT;
+ rep = TePOINTS;
+ nrepres++;
+ }
+ if (layer.hasGeometry(TePOLYGONS))
+ {
+ nShapeType = SHPT_POLYGON;
+ rep = TePOLYGONS;
+ nrepres++;
+ }
+ if (layer.hasGeometry(TeLINES))
+ {
+ nShapeType = SHPT_ARC;
+ rep = TeLINES;
+ nrepres++;
+ }
+ if (nrepres == 0 || nrepres>1)
+ {
+ return false;
+ }
+
+ string dbfFilename = filename + ".dbf";
+ hDBF = DBFCreate( dbfFilename.c_str() );
+ if( hDBF == 0 )
+ return false;
+
+ string shpFilename = filename + ".shp";
+ hSHP = SHPCreate( shpFilename.c_str(), nShapeType );
+ if( hSHP == 0 )
+ return false;
+
+ TeDatabasePortal* portalObjs = layer.database()->getPortal();
+ TeDatabasePortal* portalGeoms = layer.database()->getPortal();
+
+ string sql1 = "SELECT * FROM " + layer.attributeTable();
+ if (!portalObjs->query(sql1))
+ {
+ delete portalObjs;
+ delete portalGeoms;
+ return false;
+ }
+
+ int i = portalObjs->numFields();
+ vector<int> fieldsTypes;
+ fieldsTypes.resize(i);
+ i=0;
+ TeAttributeList attList=portalObjs->AttributeList();
+ TeAttributeList::iterator it=attList.begin();
+
+ while ( it != attList.end() )
+ {
+ TeAttribute at = (*it);
+ fieldsTypes[i] = at.rep_.type_;
+
+ if (at.rep_.type_ == TeSTRING )
+ {
+ if (DBFAddField( hDBF, at.rep_.name_.c_str(), FTString, at.rep_.numChar_, 0 ) == -1 )
+ {
+ delete portalObjs;
+ delete portalGeoms;
+ return false;
+ }
+ }
+ else if (at.rep_.type_ == TeDATETIME)
+ {
+ if (DBFAddField( hDBF, at.rep_.name_.c_str(), FTDate, 8, 0 ) == -1 )
+ {
+ delete portalObjs;
+ delete portalGeoms;
+ return false;
+ }
+ }
+ else if (at.rep_.type_ == TeINT)
+ {
+ if (DBFAddField( hDBF, at.rep_.name_.c_str(), FTInteger, 10, 0 ) == -1 )
+ {
+ delete portalObjs;
+ delete portalGeoms;
+ return false;
+ }
+ }
+ else if (at.rep_.type_ == TeREAL)
+ if (DBFAddField( hDBF, at.rep_.name_.c_str(), FTDouble, 10, 5 ) == -1 )
+ {
+ delete portalObjs;
+ delete portalGeoms;
+ return false;
+ }
+ i++;
+ it++;
+ }
+ int iRecord = DBFGetRecordCount( hDBF );
+ string geoid, sql2;
+ bool ok;
+
+ int nVertices, nParts, *panParts;
+ double *padfX, *padfY;
+ SHPObject *psObject;
+
+ TePointSet pos;
+ TeLineSet lis;
+ TePolygonSet pols;
+ while (portalObjs->fetchRow())
+ {
+ geoid = portalObjs->getData(indexName);
+ nVertices = 0;
+ switch (rep)
+ {
+ case TePOINTS:
+ sql2 = "SELECT * FROM " + layer.tableName(TePOINTS) + " WHERE id='" + geoid + "'";
+ ok = false;
+ if (portalGeoms->query(sql2))
+ {
+ while (portalGeoms->fetchRow())
+ {
+ TePoint point = portalGeoms->getPoint();
+ pos.add(point);
+ ok = true;
+ }
+ portalGeoms->freeResult();
+ nVertices = nParts = pos.size();
+ panParts = (int *) malloc(sizeof(int) * nParts);
+ padfX = (double *) malloc(sizeof(double) * nParts);
+ padfY = (double *) malloc(sizeof(double) * nParts);
+ for (int k=0;k<nParts;k++)
+ {
+ panParts[k] = k;
+ padfX[k] = pos[k].location().x();
+ padfY[k] = pos[k].location().y();
+ }
+ psObject = SHPCreateObject( nShapeType, -1, nParts, panParts, NULL,
+ nVertices, padfX, padfY, NULL, NULL );
+ SHPWriteObject( hSHP, -1, psObject );
+
+ SHPDestroyObject( psObject );
+ free( panParts );
+ free( padfX );
+ free( padfY );
+ pos.clear();
+ }
+ break;
+ case TeLINES:
+ sql2 = "SELECT * FROM " + layer.tableName(TeLINES) + " WHERE id='" + geoid + "'";
+ ok = false;
+ int npoints;
+ if (portalGeoms->query(sql2))
+ {
+ npoints = 0;
+ while (portalGeoms->fetchRow())
+ {
+ TeLine2D line = portalGeoms->getLine();
+ lis.add(line);
+ ok = true;
+ npoints += line.size();
+ }
+ portalGeoms->freeResult();
+ nVertices = lis.size();
+ panParts = (int *) malloc(sizeof(int) * nVertices);
+ padfX = (double *) malloc(sizeof(double) * npoints);
+ padfY = (double *) malloc(sizeof(double) * npoints);
+
+ int posXY = 0;
+ for (int k=0; k<nVertices; k++)
+ {
+ int lineSize = lis[k].size();
+ panParts[k]=posXY;
+ for (int l=0; l<lineSize; l++ )
+ {
+ padfX[posXY] = lis[k][l].x();
+ padfY[posXY] = lis[k][l].y();
+ posXY++;
+ }
+ }
+ lis.clear();
+ psObject = SHPCreateObject( nShapeType, -1, nVertices, panParts, NULL,
+ posXY, padfX, padfY, NULL, NULL );
+ SHPWriteObject( hSHP, -1, psObject );
+
+ SHPDestroyObject( psObject );
+ free( panParts );
+ free( padfX );
+ free( padfY );
+ }
+ break;
+ case TePOLYGONS:
+ sql2 = "SELECT * FROM " + layer.tableName(TePOLYGONS) + " WHERE id='" + geoid + "'";
+ ok = false;
+ int totpoints;
+ nVertices = 0;
+ if (portalGeoms->query(sql2))
+ {
+ totpoints = 0;
+ while (portalGeoms->fetchRow())
+ {
+ TePolygon poly = portalGeoms->getPolygon();
+ pols.add(poly);
+ ok = true;
+ nVertices += poly.size();
+ for (int n=0; n<poly.size();n++)
+ totpoints += poly[n].size();
+ }
+ portalGeoms->freeResult();
+ panParts = (int *) malloc(sizeof(int) * nVertices);
+ padfX = (double *) malloc(sizeof(double) * totpoints);
+ padfY = (double *) malloc(sizeof(double) * totpoints);
+
+ int posXY = 0;
+ int npolygons, nrings, npoints, nelem = 0;
+ npolygons = pols.size();
+ for (int k=0; k<npolygons; k++)
+ {
+ nrings = pols[k].size();
+ for (int l=0; l<nrings; l++)
+ {
+ npoints = pols[k][l].size();
+ panParts[nelem]=posXY;
+ for (int m=0; m<npoints; m++ )
+ {
+ padfX[posXY] = pols[k][l][m].x();
+ padfY[posXY] = pols[k][l][m].y();
+ posXY++;
+ }
+ nelem++;
+ }
+ }
+ pols.clear();
+ psObject = SHPCreateObject( nShapeType, -1, nelem, panParts, NULL,
+ posXY, padfX, padfY, NULL, NULL );
+ SHPWriteObject( hSHP, -1, psObject );
+
+ SHPDestroyObject( psObject );
+ free( panParts );
+ free( padfX );
+ free( padfY );
+ }
+ break;
+ }
+
+ if (!ok)
+ continue;
+
+ for (int j = 0; j < portalObjs->numFields(); j++)
+ {
+ int c = fieldsTypes[j];
+ if ( c == TeSTRING )
+ {
+ DBFWriteStringAttribute(hDBF, iRecord, j, portalObjs->getData(j) );
+ }
+ else if (c == TeINT)
+ {
+ DBFWriteIntegerAttribute(hDBF, iRecord, j, atoi(portalObjs->getData(j)) );
+ }
+ else if (c == TeREAL)
+ {
+ DBFWriteDoubleAttribute(hDBF, iRecord, j, atof(portalObjs->getData(j)) );
+ }
+ }
+ iRecord++;
+ }
+ DBFClose( hDBF );
+ SHPClose( hSHP );
+ delete portalObjs;
+ delete portalGeoms;
+ return true ;
+}
\ No newline at end of file
diff --git a/src/terralib/functions/TeExportMIF.cpp b/src/terralib/functions/TeExportMIF.cpp
new file mode 100644
index 0000000..3b9b238
--- /dev/null
+++ b/src/terralib/functions/TeExportMIF.cpp
@@ -0,0 +1,534 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeException.h"
+#include "TeImportExport.h"
+#include "TeAsciiFile.h"
+
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeTable.h"
+#include "TeGeometry.h"
+#include "TeDatabase.h"
+#include "TeGeometryAlgorithms.h"
+
+int TeExportMIFLineSet ( TeAsciiFile& mifFile, TeLineSet& ls);
+int TeExportMIFPointSet ( TeAsciiFile& mifFile, TePointSet& ps, bool isMulti=false);
+int TeExportMIFPolygonSet ( TeAsciiFile& mifFile, TePolygonSet& ps);
+int TeExportMIFCellSet (TeAsciiFile& mifFile, TeCellSet& cells, bool isMulti=false);
+void TeExportMIFProjection ( TeProjection* proj, TeAsciiFile& mifFile);
+void TeExportMIFAttributeList (TeAttributeList& attList, TeAsciiFile& mifFile);
+void TeExportMIFRow(TeTableRow& row, TeAsciiFile& midFile);
+TeProjInfo TeMIFProjectionInfo (const string& projName );
+
+bool
+TeExportMIF( TeLayer* layer, const string& mifFileName, const string& tableName)
+{
+ if (!layer || mifFileName.empty() || tableName.empty())
+ return false;
+
+ // check if layer has the attribute table
+ TeTable tableE;
+ if (!layer->getAttrTablesByName(tableName,tableE))
+ return false;
+
+ // try to get some portals
+ TeDatabasePortal* portalObjs = layer->database()->getPortal();
+ TeDatabasePortal* portalGeoms = layer->database()->getPortal();
+
+ if (!portalObjs || !portalGeoms)
+ return false;
+
+ // check if there is any object
+ string sql1 = "SELECT * FROM " + tableName;
+ if (!portalObjs->query(sql1) || !portalObjs->fetchRow())
+ {
+ delete portalObjs;
+ delete portalGeoms;
+ return false;
+ }
+ clock_t ti, tf;
+ int count = 0;
+
+ try
+ {
+ string link = tableE.linkName();
+ TeAsciiFile mifFile ( mifFileName+".MIF", "w+" );
+ TeAsciiFile midFile ( mifFileName+".MID", "w+" );
+ string sql2;
+
+ // write header;
+ mifFile.writeString("Version 300\n");
+ mifFile.writeString("Charset \"WindowsLatin1\" \n");
+ mifFile.writeString("Delimiter \";\"\n");
+ TeProjection* proj = layer->projection();
+ if (proj)
+ {
+ TeBox box = layer->box();
+ char txt[300];
+ sprintf(txt,"Bounds (%.5f, %5f) (%.5f, %5f)\n",box.x1_,box.y1_,box.x2_,box.y2_);
+ if (proj->name() == "NoProjection")
+ {
+ mifFile.writeString("CoordSys Nonearth\n");
+ mifFile.writeString("Units ");
+ mifFile.writeString(proj->units());
+ mifFile.writeNewLine();
+ mifFile.writeString(string(txt));
+ }
+ else if (proj->name() == "LatLong")
+ {
+ mifFile.writeString("CoordSys Earth Projection 1, 0 ");
+ mifFile.writeString(string(txt));
+
+ }
+ else
+ {
+ TeExportMIFProjection(layer->projection(), mifFile);
+ mifFile.writeString(" ");
+ mifFile.writeString(string(txt));
+ }
+ }
+ TeAttributeList attrList = tableE.attributeList();
+ TeExportMIFAttributeList(attrList,mifFile);
+
+ string geoid;
+ TeTableRow row;
+ mifFile.writeString("Data\n");
+
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portalObjs->numRows());
+ ti = clock();
+ // Loop through all objects of the layer
+ do
+ {
+ geoid = portalObjs->getData(link);
+
+ TePolygonSet objectPols; // polygons of the region
+ TeLineSet objectLines; // lines of the region
+ TePointSet objectPoints; // points of the region
+ TeCellSet objectCells; // points of the region
+
+ // check if there is a polygon set geometry
+ bool flag = true;
+ if (layer->hasGeometry(TePOLYGONS))
+ {
+ sql2 = "SELECT * FROM " + layer->tableName(TePOLYGONS) + " WHERE object_id='" + geoid + "'";
+ if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+ {
+ do
+ {
+ TePolygon poly;
+ flag = portalGeoms->fetchGeometry(poly);
+ objectPols.add(poly);
+ } while (flag);
+ }
+ portalGeoms->freeResult();
+ }
+
+ // check if there is a line set geometry
+ if (layer->hasGeometry(TeLINES))
+ {
+ sql2 = "SELECT * FROM " + layer->tableName(TeLINES) + " WHERE object_id='" + geoid + "'";
+ if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+ {
+ do
+ {
+ TeLine2D line;
+ flag = portalGeoms->fetchGeometry(line);
+ objectLines.add(line);
+ } while (flag);
+ }
+ portalGeoms->freeResult();
+ }
+
+ // check if there is a point set geometry
+ if (layer->hasGeometry(TePOINTS))
+ {
+ sql2 = "SELECT * FROM " + layer->tableName(TePOINTS) + " WHERE object_id='" + geoid + "'";
+ if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+ {
+ do
+ {
+ TePoint point;
+ flag = portalGeoms->fetchGeometry(point);
+ objectPoints.add(point);
+ } while (flag);
+ }
+ portalGeoms->freeResult();
+ }
+ // check if there is a point set geometry
+ if (layer->hasGeometry(TeCELLS))
+ {
+ sql2 = "SELECT * FROM " + layer->tableName(TeCELLS) + " WHERE object_id='" + geoid + "'";
+ if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+ {
+ do
+ {
+ TeCell cell;
+ flag = portalGeoms->fetchGeometry(cell);
+ objectCells.add(cell);
+ } while (flag);
+ }
+ portalGeoms->freeResult();
+ }
+ int col = 0;
+ if (objectPoints.size() > 0)
+ col++;
+ if (objectLines.size() > 0)
+ col++;
+ if (objectPols.size() > 0)
+ col++;
+ if (objectCells.size() > 0)
+ col++;
+
+
+
+ row.clear(); // export attributes
+ for (int j = 0; j < portalObjs->numFields(); j++)
+ row.push_back ( portalObjs->getData (j) );
+ TeExportMIFRow(row,midFile);
+
+ if (col == 0)
+ {
+ mifFile.writeString("NONE\n");
+ }
+ else
+ {
+ if (col > 1) // it is a collection
+ mifFile.writeString("Collection " + Te2String(col) + "\n");
+
+ if (objectPols.size() > 0)
+ TeExportMIFPolygonSet(mifFile,objectPols);
+
+ if (objectLines.size() > 0)
+ TeExportMIFLineSet(mifFile,objectLines);
+
+ if (objectPoints.size() > 0)
+ TeExportMIFPointSet(mifFile,objectPoints,(col>1));
+
+ if (objectCells.size() > 0)
+ TeExportMIFCellSet(mifFile,objectCells,(col>1));
+
+ objectCells.clear();
+ objectPols.clear();
+ objectPoints.clear();
+ objectLines.clear();
+ }
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ count++;
+ } while (portalObjs->fetchRow());
+ delete portalObjs;
+ delete portalGeoms;
+ return true;
+ }
+ catch(...)
+ {
+ if (portalObjs)
+ delete portalObjs;
+ if (portalGeoms)
+ delete portalGeoms;
+ return false;
+ }
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+}
+
+void
+TeExportMIFRow(TeTableRow& row, TeAsciiFile& midFile)
+{
+ TeTableRow::iterator it = row.begin();
+ if (it != row.end())
+ {
+ midFile.writeString((*it));
+ ++it;
+ }
+
+ while ( it!= row.end())
+ {
+ midFile.writeString(";"+(*it));
+ ++it;
+ }
+ midFile.writeNewLine();
+}
+
+void
+TeExportMIFProjection ( TeProjection* proj, TeAsciiFile& mifFile)
+{
+ if (!proj)
+ return ;
+
+ map<string,string> mifProjCode;
+ mifProjCode["LambertConformal"] = "3";
+ mifProjCode["UTM"] = "8";
+ mifProjCode["Albers"] = "9";
+ mifProjCode["Mercator"] = "10";
+ mifProjCode["Miller"] = "11";
+ mifProjCode["Polyconic"] = "27";
+
+ map<string,string> mifDatumCode;
+ mifDatumCode["Spherical"]="0";
+ mifDatumCode["Astro-Chua"]="23";
+ mifDatumCode["CorregoAlegre"]="24";
+ mifDatumCode["Indian"]="40";
+ mifDatumCode["NAD27"]="62";
+ mifDatumCode["SAD69"]="92";
+ mifDatumCode["WGS84"]="104";
+
+ TeProjInfo pjInfo;
+ try
+ {
+ pjInfo = TeMIFProjectionInfo (proj->name());
+ }
+ catch(...)
+ {
+ return;
+ }
+
+ mifFile.writeString("CoordSys Earth Projection ");
+ mifFile.writeString(mifProjCode[proj->name()]);
+ mifFile.writeString(", " + mifDatumCode[proj->datum().name()]);
+
+ string mess;
+
+ if (pjInfo.hasUnits)
+ mess = ", " + proj->units();
+
+ if ( pjInfo.hasLon0 )
+ {
+ if (!mess.empty())
+ mess += ", ";
+ mess += Te2String(proj->lon0()*TeCRD);
+ }
+
+ if ( pjInfo.hasLat0 )
+ {
+ if (!mess.empty())
+ mess += ", ";
+ mess += Te2String(proj->lat0()*TeCRD);
+ }
+
+ if ( pjInfo.hasStlat1 )
+ {
+ if (!mess.empty())
+ mess += ", ";
+ mess += Te2String(proj->stLat1()*TeCRD);
+ }
+
+ if ( pjInfo.hasStlat2 )
+ {
+ if (!mess.empty())
+ mess += ", ";
+ mess += Te2String(proj->stLat2()*TeCRD);
+ }
+
+ if ( pjInfo.hasScale )
+ {
+ if (!mess.empty())
+ mess += ", ";
+ mess += Te2String(proj->scale());
+ }
+
+ if ( pjInfo.hasOffx )
+ {
+ if (!mess.empty())
+ mess += ", ";
+ mess += Te2String(proj->offX());
+ }
+
+ if ( pjInfo.hasOffy )
+ {
+ if (!mess.empty())
+ mess += ", ";
+ mess += Te2String(proj->offY());
+ }
+ if (!mess.empty())
+ mifFile.writeString(mess);
+}
+
+void
+TeExportMIFAttributeList (TeAttributeList& attList, TeAsciiFile& mifFile)
+{
+ int n = attList.size();
+ mifFile.writeString("Columns " + Te2String(n));
+ mifFile.writeNewLine();
+
+ TeAttributeList::iterator it = attList.begin();
+ while ( it != attList.end())
+ {
+ TeAttribute att = *it;
+ mifFile.writeString(" "+att.rep_.name_ + " ");
+ if ( att.rep_.type_ == TeINT )
+ mifFile.writeString("Integer");
+ else if ( att.rep_.type_ == TeREAL )
+ mifFile.writeString("Float");
+ else if ( att.rep_.type_ == TeDATETIME )
+ mifFile.writeString("Char(25)");
+ else if ( att.rep_.type_ == TeSTRING )
+ mifFile.writeString("Char(" + Te2String(att.rep_.numChar_) + ")");
+ mifFile.writeNewLine();
+ ++it;
+ }
+}
+
+
+int
+TeExportMIFLineSet (TeAsciiFile& mifFile, TeLineSet& lines)
+{
+ if (lines.size() == 0)
+ return 0;
+
+ mifFile.writeString("Pline ");
+ char aux[100];
+ int n = lines.size();
+ if (n > 1)
+ {
+ sprintf(aux,"Multiple %d\n",n);
+ mifFile.writeString(string(aux));
+ }
+ for ( int i = 0; i < n; i++ )
+ {
+ TeLine2D line = lines[i];
+ sprintf(aux,"%d\n",line.size());
+ mifFile.writeString(string(aux));
+ for (unsigned int k = 0; k < line.size(); k++ )
+ {
+ sprintf(aux,"%.6f %.6f \n", line[k].x(),line[k].y());
+ mifFile.writeString(string(aux));
+ }
+ }
+ return lines.size();
+}
+
+int
+TeExportMIFPointSet (TeAsciiFile& mifFile, TePointSet& points, bool isMulti)
+{
+ if ( points.size() == 0 ) // layer has points
+ return 0;
+
+ int n = points.size();
+ char aux[50];
+ if (n == 1)
+ {
+ if (isMulti)
+ mifFile.writeString("Multipoint 1\n");
+ else
+ mifFile.writeString("Point ");
+ TePoint pt = points [0];
+ TeCoord2D xy = pt.location();
+ sprintf(aux,"%.6f %.6f \n", xy.x(), xy.y());
+ mifFile.writeString(string(aux));
+ }
+ else
+ {
+ mifFile.writeString("Multipoint ");
+ sprintf(aux,"%d\n",n);
+ mifFile.writeString(string(aux));
+ unsigned int i;
+ for ( i = 0; i < points.size(); i++ )
+ {
+ TePoint pt = points [i];
+ TeCoord2D xy = pt.location();
+ sprintf(aux,"%.6f %.6f \n", xy.x(), xy.y());
+ mifFile.writeString(string(aux));
+ }
+ }
+ return points.size();
+}
+
+int
+TeExportMIFPolygonSet (TeAsciiFile& mifFile, TePolygonSet& polygons)
+{
+ if (polygons.size() == 0)
+ return 0;
+ char aux[50];
+ sprintf(aux,"Region %d\n",polygons.size());
+ mifFile.writeString(string(aux));
+ unsigned int i;
+ for (i = 0; i < polygons.size(); i++ )
+ {
+ TePolygon poly = polygons[i];
+ unsigned int k;
+ for (k = 0; k < poly.size(); k++ )
+ {
+ TeLinearRing ring = poly[k];
+ sprintf(aux,"%d\n",ring.size());
+ mifFile.writeString(string(aux));
+ unsigned int l;
+ for (l = 0 ; l < ring.size(); l++)
+ {
+ sprintf(aux,"%.6f %.6f \n", ring[l].x(), ring[l].y());
+ mifFile.writeString(string(aux));
+ }
+ }
+ }
+ return polygons.size();
+}
+
+int
+TeExportMIFCellSet (TeAsciiFile& mifFile, TeCellSet& cells, bool isColl)
+{
+ if (cells.size() == 0)
+ return 0;
+ char aux[250];
+
+ if (cells.size() > 1 || isColl)
+ {
+ sprintf(aux,"Region %d\n",cells.size());
+ mifFile.writeString(string(aux));
+ unsigned int i;
+ for (i = 0; i < cells.size(); i++ )
+ {
+ TeCell cell = cells[i];
+ TeCoord2D ll = cell.box().lowerLeft();
+ TeCoord2D ur = cell.box().upperRight();
+ mifFile.writeString("5");
+ sprintf(aux,"%.6f %.6f \n", ll.x(), ll.y());
+ mifFile.writeString(string(aux));
+ sprintf(aux,"%.6f %.6f \n", ur.x(), ll.y());
+ mifFile.writeString(string(aux));
+ sprintf(aux,"%.6f %.6f \n", ur.x(), ur.y());
+ mifFile.writeString(string(aux));
+ sprintf(aux,"%.6f %.6f \n", ll.x(), ur.y());
+ mifFile.writeString(string(aux));
+ sprintf(aux,"%.6f %.6f \n", ll.x(), ll.y());
+ mifFile.writeString(string(aux));
+ }
+ return cells.size();
+ }
+ else
+ {
+ sprintf(aux,"Rect %.6f %.6f %.6f %.6f\n",
+ cells[0].box().lowerLeft().x(), cells[0].box().lowerLeft().y(),
+ cells[0].box().upperRight().x(), cells[0].box().upperRight().y());
+ mifFile.writeString(string(aux));
+ return 1;
+ }
+}
diff --git a/src/terralib/functions/TeExportSHP.cpp b/src/terralib/functions/TeExportSHP.cpp
new file mode 100644
index 0000000..e10373a
--- /dev/null
+++ b/src/terralib/functions/TeExportSHP.cpp
@@ -0,0 +1,443 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "shapefil.h"
+#include "TeImportExport.h"
+#include "TeTable.h"
+#include "TeException.h"
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeDatabase.h"
+#include <vector>
+
+
+DBFHandle TeCreateDBFFile (const string& dbfFilename, TeAttributeList& attList)
+{
+ DBFHandle hDBF = DBFCreate( dbfFilename.c_str() );
+ if( hDBF == 0 )
+ return 0;
+
+ int i =0;
+ TeAttributeList::iterator it=attList.begin();
+
+ while ( it != attList.end() )
+ {
+ TeAttribute at = (*it);
+ string atName = at.rep_.name_;
+
+ if (atName.size() > 10)
+ {
+ int extra = (int)(atName.size() - 10)/2;
+ int middle = (int)(atName.size()/2);
+ string str = atName.substr(0,middle-extra-1);
+ str += atName.substr(middle+extra);
+ atName = str;
+ }
+
+ if (at.rep_.type_ == TeSTRING )
+ {
+ if (DBFAddField( hDBF, atName.c_str(), FTString, at.rep_.numChar_, 0 ) == -1 )
+ return 0;
+ }
+ else if (at.rep_.type_ == TeINT)
+ {
+ if (DBFAddField( hDBF, atName.c_str(), FTInteger, 10, 0 ) == -1 )
+ return 0;
+ }
+ else if (at.rep_.type_ == TeREAL)
+ {
+ if (DBFAddField( hDBF, atName.c_str(), FTDouble, 10, 5 ) == -1 )
+ return 0;
+ }
+ // OBS: shapelib doesn�t deal with xBase field type for Date
+ // we are transforming it to string
+ else if (at.rep_.type_ == TeDATETIME)
+ {
+ if (DBFAddField( hDBF, atName.c_str(), FTDate, 8, 0 ) == -1 )
+ return 0;
+ }
+ ++i;
+ ++it;
+ }
+ return hDBF;
+}
+
+bool
+TeExportShapefile(TeLayer* layer, const string& shpFileName, const string& tableName)
+{
+ if (!layer || shpFileName.empty() || tableName.empty())
+ return false;
+
+ // check if layer has the attribute table
+ TeTable tableE;
+ if (!layer->getAttrTablesByName(tableName,tableE))
+ return false;
+ string linkName = tableE.linkName();
+
+ TeDatabasePortal* portalObjs = layer->database()->getPortal();
+ if (!portalObjs)
+ return false;
+
+ vector<int> reps;
+ if (layer->hasGeometry(TePOINTS))
+ reps.push_back(SHPT_POINT);
+
+ if (layer->hasGeometry(TePOLYGONS) || layer->hasGeometry(TeCELLS) )
+ reps.push_back(SHPT_POLYGON);
+
+ if (layer->hasGeometry(TeLINES))
+ reps.push_back(SHPT_ARC);
+
+ if (reps.empty())
+ {
+ delete portalObjs;
+ return false; // there are no geometrical representations
+ }
+
+ DBFHandle hDBF;
+ SHPHandle hSHP;
+
+ for (unsigned int i=0; i<reps.size(); i++)
+ {
+ string sql1 = "SELECT * FROM " + tableName;
+ if (!portalObjs->query(sql1) || !portalObjs->fetchRow())
+ {
+ delete portalObjs;
+ return false;
+ }
+
+ string dbfFilename;
+ string shpFilename;
+ int nShapeType = reps[i];
+ switch (nShapeType)
+ {
+ case SHPT_POINT:
+ dbfFilename = shpFileName + "_point.dbf";
+ shpFilename = shpFileName + "_point.shp";
+ break;
+ case SHPT_POLYGON:
+ dbfFilename = shpFileName + "_pol.dbf";
+ shpFilename = shpFileName + "_pol.shp";
+ break;
+ case SHPT_ARC:
+ dbfFilename = shpFileName + "_lin.dbf";
+ shpFilename = shpFileName + "_lin.shp";
+ }
+
+ // create files
+ hSHP = SHPCreate( shpFilename.c_str(), nShapeType );
+ if( hSHP == 0 )
+ {
+ delete portalObjs;
+ return false;
+ }
+
+ TeAttributeList attList = portalObjs->AttributeList();
+ hDBF = TeCreateDBFFile(dbfFilename, attList);
+ if( hDBF == 0 )
+ {
+ delete portalObjs;
+ return false;
+ }
+
+ TeDatabasePortal* portalGeoms = layer->database()->getPortal();
+ if (!portalGeoms)
+ {
+ delete portalObjs;
+ return false;
+ }
+
+ int count = 0;
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portalObjs->numRows());
+ clock_t ti, tf;
+
+ int iRecord = 0;
+ string geoid, sql2;
+ bool ok;
+ int nVertices, nParts, *panParts;
+ double *padfX, *padfY;
+ SHPObject *psObject;
+ int shpRes = 0;
+ ti = clock();
+ do
+ {
+ geoid = portalObjs->getData(linkName);
+ nVertices = 0;
+ bool flag = true;
+ TePointSet pos;
+ TeLineSet lis;
+ TePolygonSet pols;
+ TeCellSet cells;
+ switch (nShapeType)
+ {
+ case SHPT_POINT: // create a shapefile of points
+ sql2 = "SELECT * FROM " + layer->tableName(TePOINTS) + " WHERE object_id='" + geoid + "'";
+ ok = false;
+ if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+ {
+ do
+ {
+ TePoint point;
+ flag = portalGeoms->fetchGeometry(point);
+ pos.add(point);
+ ok = true;
+ } while (flag);
+ nVertices = nParts = pos.size();
+ panParts = (int *) malloc(sizeof(int) * nParts);
+ padfX = (double *) malloc(sizeof(double) * nParts);
+ padfY = (double *) malloc(sizeof(double) * nParts);
+ for (int k=0;k<nParts;k++)
+ {
+ panParts[k] = k;
+ padfX[k] = pos[k].location().x();
+ padfY[k] = pos[k].location().y();
+ }
+ psObject = SHPCreateObject( nShapeType, -1, nParts, panParts, NULL,
+ nVertices, padfX, padfY, NULL, NULL );
+ shpRes = SHPWriteObject( hSHP, -1, psObject );
+ SHPDestroyObject( psObject );
+ free( panParts );
+ free( padfX );
+ free( padfY );
+ pos.clear();
+ }
+ portalGeoms->freeResult();
+ break;
+ case SHPT_ARC: // create a shapefile of lines
+ sql2 = "SELECT * FROM " + layer->tableName(TeLINES) + " WHERE object_id='" + geoid + "'";
+ ok = false;
+ int npoints;
+ if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+ {
+ npoints = 0;
+ do
+ {
+ TeLine2D line;
+ flag = portalGeoms->fetchGeometry(line);
+ lis.add(line);
+ ok = true;
+ npoints += line.size();
+ } while (flag);
+ nVertices = lis.size();
+ panParts = (int *) malloc(sizeof(int) * nVertices);
+ padfX = (double *) malloc(sizeof(double) * npoints);
+ padfY = (double *) malloc(sizeof(double) * npoints);
+ int posXY = 0;
+ for (int k=0; k<nVertices; k++)
+ {
+ int lineSize = lis[k].size();
+ panParts[k]=posXY;
+ for (int l=0; l<lineSize; l++ )
+ {
+ padfX[posXY] = lis[k][l].x();
+ padfY[posXY] = lis[k][l].y();
+ posXY++;
+ }
+ }
+ lis.clear();
+ psObject = SHPCreateObject( nShapeType, -1, nVertices, panParts, NULL,
+ posXY, padfX, padfY, NULL, NULL );
+ SHPWriteObject( hSHP, -1, psObject );
+ SHPDestroyObject( psObject );
+ free( panParts );
+ free( padfX );
+ free( padfY );
+ }
+ portalGeoms->freeResult();
+ break;
+ case SHPT_POLYGON: // create a shapefile of polygons
+ sql2 = "SELECT * FROM " + layer->tableName(TePOLYGONS) + " WHERE object_id='" + geoid + "'";
+ ok = false;
+ if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+ {
+ int totpoints;
+ nVertices = 0;
+ totpoints = 0;
+ do
+ {
+ TePolygon poly;
+ flag = portalGeoms->fetchGeometry(poly);
+ pols.add(poly);
+ ok = true;
+ nVertices += poly.size();
+ unsigned int n;
+ for (n=0; n<poly.size();n++)
+ totpoints += poly[n].size();
+ } while (flag);
+ panParts = (int *) malloc(sizeof(int) * nVertices);
+ padfX = (double *) malloc(sizeof(double) * totpoints);
+ padfY = (double *) malloc(sizeof(double) * totpoints);
+
+ int posXY = 0;
+ int npolygons, nrings, npoints, nelem = 0;
+ npolygons = pols.size();
+ for (int k=0; k<npolygons; k++)
+ {
+ nrings = pols[k].size();
+
+ for (int l=0; l<nrings; ++l)
+ {
+ if (l==0)
+ {
+ if (TeOrientation(pols[k][l]) == TeCOUNTERCLOCKWISE)
+ TeReverseLine(pols[k][l]);
+ }
+ else
+ {
+ if (TeOrientation(pols[k][l]) == TeCLOCKWISE)
+ TeReverseLine(pols[k][l]);
+
+ }
+
+ npoints = pols[k][l].size();
+ panParts[nelem]=posXY;
+ for (int m=0; m<npoints; m++ )
+ {
+ padfX[posXY] = pols[k][l][m].x();
+ padfY[posXY] = pols[k][l][m].y();
+ posXY++;
+ }
+ nelem++;
+ }
+ }
+ pols.clear();
+ psObject = SHPCreateObject( nShapeType, -1, nelem, panParts, NULL,
+ posXY, padfX, padfY, NULL, NULL );
+ shpRes = SHPWriteObject( hSHP, -1, psObject );
+ SHPDestroyObject( psObject );
+ free( panParts );
+ free( padfX );
+ free( padfY );
+ }
+ portalGeoms->freeResult();
+
+ // --- Cells are exported as polygons
+
+ sql2 = "SELECT * FROM " + layer->tableName(TeCELLS) + " WHERE object_id='" + geoid + "'";
+ if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+ {
+ int totpoints;
+ nVertices = 0;
+ totpoints = 0;
+ do
+ {
+ TeCell cell;
+ flag = portalGeoms->fetchGeometry(cell);
+ cells.add(cell);
+ ok = true;
+ nVertices += 1;
+ totpoints += 5;
+ } while (flag);
+ panParts = (int *) malloc(sizeof(int) * nVertices);
+ padfX = (double *) malloc(sizeof(double) * totpoints);
+ padfY = (double *) malloc(sizeof(double) * totpoints);
+
+ int posXY = 0;
+ int ncells, nelem = 0;
+ ncells = cells.size();
+ for (int k=0; k<ncells; k++)
+ {
+ panParts[nelem]=posXY;
+ TeCell cell = cells[k];
+ TeCoord2D ll = cell.box().lowerLeft();
+ TeCoord2D ur = cell.box().upperRight();
+ padfX[posXY] = ll.x();
+ padfY[posXY] = ll.y();
+ posXY++;
+ padfX[posXY] = ur.x();
+ padfY[posXY] = ll.y();
+ posXY++;
+ padfX[posXY] = ur.x();
+ padfY[posXY] = ur.y();
+ posXY++;
+ padfX[posXY] = ll.x();
+ padfY[posXY] = ur.y();
+ posXY++;
+ padfX[posXY] = ll.x();
+ padfY[posXY] = ll.y();
+ posXY++;
+ nelem++;
+ }
+ cells.clear();
+ psObject = SHPCreateObject( nShapeType, -1, nelem, panParts, NULL,
+ posXY, padfX, padfY, NULL, NULL );
+ SHPWriteObject( hSHP, -1, psObject );
+ SHPDestroyObject( psObject );
+ free( panParts );
+ free( padfX );
+ free( padfY );
+ }
+ portalGeoms->freeResult();
+ } // end - case geometry representation
+
+ if (!ok) // no geometry associated to this object
+ continue;
+
+ // write attributes
+ for (int j = 0; j < portalObjs->numFields(); j++)
+ {
+ int c = attList[j].rep_.type_;
+ if (c == TeSTRING)
+ {
+ DBFWriteStringAttribute(hDBF, iRecord, j, portalObjs->getData(j) );
+ }
+ else if (c == TeDATETIME)
+ {
+ TeTime time = portalObjs->getDate(j);
+ char dd[8];
+ sprintf(dd,"%04d%02d%02d",time.year(),time.month(),time.day());
+ DBFWriteDateAttribute(hDBF, iRecord, j, dd );
+ }
+ else if (c == TeINT)
+ {
+ DBFWriteIntegerAttribute(hDBF, iRecord, j, portalObjs->getInt(j) );
+ }
+ else if (c == TeREAL)
+ {
+ DBFWriteDoubleAttribute(hDBF, iRecord, j, portalObjs->getDouble(j));
+ }
+ }
+ iRecord++;
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ } while (portalObjs->fetchRow()); // end - for every object
+ DBFClose( hDBF );
+ SHPClose( hSHP );
+ portalObjs->freeResult();
+ delete portalGeoms;
+ } // end - for each representation
+ delete portalObjs;
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+ return true ;
+}
+
diff --git a/src/terralib/functions/TeExportSPR.cpp b/src/terralib/functions/TeExportSPR.cpp
new file mode 100644
index 0000000..5b6293c
--- /dev/null
+++ b/src/terralib/functions/TeExportSPR.cpp
@@ -0,0 +1,807 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeException.h"
+#include "TeImportExport.h"
+#include "TeSPRFile.h"
+
+#include "TeDataTypes.h"
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeTable.h"
+#include "TeGeometry.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeDatabase.h"
+#include "TeProgress.h"
+#include <time.h>
+
+// --- Spring
+
+bool TeExportSPRMNTData ( TeLayer* layer, const string& sprFileName, const string& tabName, const string& attrQuoteName );
+bool TeExportSPRThematicData ( TeLayer* layer, const string& sprFileName, const string& tabName, const string& attThemeName );
+bool TeExportSPRNetworkData ( TeLayer* layer, const string& sprFileName, const string& objName);
+bool TeExportSPRCadastralData ( TeLayer* layer, const string& sprFileName, const string& objName);
+bool TeExportSPRTable (TeLayer* layer, const string& sprFileName, const string& tabName, const string& objName,TeSpringModels cat);
+
+bool
+TeExportSPR (TeLayer* layer, const string& sprFileName, const string& tableName, TeSpringModels cat, const string& name)
+{
+ if (tableName.empty() || sprFileName.empty())
+ return false;
+ switch (cat)
+ {
+ case TeSPRMNT:
+ return TeExportSPRMNTData(layer,sprFileName,tableName, name);
+ case TeSPRThematic:
+ return TeExportSPRThematicData(layer,sprFileName,tableName,name);
+ case TeSPRNetwork:
+ if (TeExportSPRNetworkData(layer,sprFileName,name))
+ return TeExportSPRTable (layer,sprFileName,tableName,name,TeSPRNetwork);
+ default:
+ if (TeExportSPRCadastralData(layer,sprFileName,name))
+ return TeExportSPRTable (layer,sprFileName,tableName,name,TeSPRCadastral);
+ }
+ return false;
+}
+
+bool TeExportSPRMNTData( TeLayer* layer, const string& sprFileName, const string& tabName, const string& attrQuoteName )
+{
+ clock_t ti, tf;
+ int count;
+ TeDatabasePortal* portal = 0;
+ try{
+
+ TeSPRFile sprFile ( sprFileName+".spr", "w+" );
+
+ if (attrQuoteName.empty() || tabName.empty())
+ return false;
+
+ if (!(layer->hasGeometry(TePOINTS) ||
+ layer->hasGeometry(TeLINES)))
+ return false;
+
+ // check if layer has the attribute table
+ TeTable tableE;
+ if (!layer->getAttrTablesByName(tabName,tableE))
+ return false;
+ string linkName = tableE.linkName();
+ if (linkName.empty())
+ return false;
+
+ TeDatabasePortal* portal = layer->database()->getPortal();
+ if (!portal)
+ return false;
+
+ // DTM/Network data can have POINTS 3D or contour line 3D, so the
+ // header SAMPLE should be written only once
+ sprFile.writeSampleHeader();
+ if ( layer->projection() )
+ sprFile.writeProjection ( layer->projection() );
+ sprFile.writeBox ( layer->box() );
+ sprFile.writeInfoEnd();
+
+ string sql = "SELECT attT." + attrQuoteName + ", geoT.* FROM " + tabName + " attT, ";
+ bool flag = true;
+ if (layer->hasGeometry(TeLINES))
+ {
+ sql += layer->tableName(TeLINES) + " geoT ";
+ sql += " WHERE attT." + linkName + "= geoT.object_id";
+ if (portal->query(sql) && portal->fetchRow())
+ {
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+ ti = clock();
+ count = 0;
+ do
+ {
+ TeLine2D line;
+ double quote = portal->getDouble(0);
+ flag = portal->fetchGeometry(line);
+ if (!line.empty())
+ {
+ sprFile.writeLine3DHeader();
+ sprFile.writeSampleQuote( quote );
+ for (unsigned int k=0; k<line.size(); k++ )
+ sprFile.writePoint ( line[k] );
+ sprFile.writeEnd();
+ }
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ } while(flag);
+ if (count)
+ sprFile.writeEnd();
+ }
+ portal->freeResult();
+ }
+ if (layer->hasGeometry(TePOINTS))
+ {
+ sql += layer->tableName(TePOINTS) + " geoT ";
+ sql += " WHERE attT." + linkName + "= geoT.object_id";
+ if (portal->query(sql) && portal->fetchRow())
+ {
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+ ti = clock();
+ count = 0;
+ do
+ {
+ TePoint xy;
+ if (count == 0)
+ sprFile.writePoint3DHeader();
+
+ double quote = portal->getDouble(0);
+ flag = portal->fetchGeometry(xy);
+
+ sprFile.writePoint3D( xy.location().x(), xy.location().y(), quote );
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ } while (flag);
+ if (count)
+ sprFile.writeEnd();
+ }
+ }
+ delete portal;
+ return true;
+ }
+ catch(...)
+ {
+ if (portal)
+ delete portal;
+ return false;
+ }
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+}
+
+bool TeExportSPRThematicData( TeLayer* layer, const string& sprFileName, const string& tabName, const string& attThemeName )
+{
+ if (attThemeName.empty() || tabName.empty())
+ return false;
+
+ if (!layer || !(layer->hasGeometry(TePOINTS) || layer->hasGeometry(TeLINES) ||
+ layer->hasGeometry(TePOLYGONS) || layer->hasGeometry(TeCELLS)))
+ return false;
+
+ // check if layer has the attribute table
+ TeTable tableE;
+ if (!layer->getAttrTablesByName(tabName,tableE))
+ return false;
+ string linkName = tableE.linkName();
+ if (linkName.empty())
+ return false;
+
+ TeDatabasePortal* portal=0;
+ clock_t ti, tf;
+ int count;
+
+ try{
+ portal = layer->database()->getPortal();
+ if (!portal)
+ return false;
+ TeSPRFile sprFile ( sprFileName+".spr", "w+" );
+
+ unsigned int k;
+ bool flag = true;
+
+ string sql = "SELECT attT." + attThemeName + ", geoT.* FROM " + tabName + " attT, ";
+ if (layer->hasGeometry(TePOINTS))
+ {
+ sql += layer->tableName(TePOINTS) + " geoT ";
+ sql += " WHERE attT." + linkName + "= geoT.object_id";
+ if(portal->query(sql) && portal->fetchRow())
+ {
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+ ti = clock();
+ count = 0;
+ do
+ {
+ if (count==0)
+ {
+ sprFile.writePointsHeader ( );
+ sprFile.writeProjection ( layer->projection() );
+ sprFile.writeBox ( layer->box() );
+ sprFile.writeInfoEnd();
+ }
+ string theme = portal->getData(attThemeName);
+ TePoint xy;
+ flag = portal->fetchGeometry(xy);
+ sprFile.writeThematicPoint(xy.location().x(), xy.location().y(), theme );
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ } while (flag);
+ }
+ portal->freeResult();
+ if (count)
+ sprFile.writeEnd();
+ }
+ if (!layer->hasGeometry(TeLINES) && !layer->hasGeometry(TePOLYGONS) && !layer->hasGeometry(TeCELLS))
+ {
+ delete portal;
+ sprFile.writeEnd();
+ return true;
+ }
+ count = 0;
+ TeSPRFile labelFile(sprFileName+"_LAB.spr", "w+");
+ if (layer->hasGeometry(TeLINES))
+ {
+ sql += layer->tableName(TeLINES) + " geoT ";
+ sql += " WHERE attT." + linkName + "= geoT.object_id";
+ if (portal->query(sql) && portal->fetchRow())
+ {
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+ ti = clock();
+ count = 0;
+ do{
+ string theme = portal->getData(0);
+ TeLine2D line;
+ flag = portal->fetchGeometry(line);
+ if (!line.empty())
+ {
+ if (count == 0)
+ {
+ sprFile.writeLinesHeader ( );
+ if ( layer->projection() )
+ sprFile.writeProjection ( layer->projection() );
+ sprFile.writeBox ( layer->box() );
+ sprFile.writeInfoEnd();
+ labelFile.writeLabelHeader(TeSPRThematic);
+ }
+
+ for (k=0; k<line.size(); k++ )
+ sprFile.writePoint ( line[k] );
+ sprFile.writeEnd();
+ TeCoord2D pt = TeFindCentroid( line );
+ labelFile.writeThematicLabel(pt.x(), pt.y(),theme);
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ }
+ } while (flag);
+ }
+ portal->freeResult();
+ }
+
+ if (layer->hasGeometry(TePOLYGONS))
+ {
+ sql += layer->tableName(TePOLYGONS) + " geoT ";
+ sql += " WHERE attT." + linkName + "= geoT.object_id";
+ if (portal->query(sql) && portal->fetchRow())
+ {
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+ ti = clock();
+ count = 0;
+ do
+ {
+ string theme = portal->getData(0);
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ if (!poly.empty())
+ {
+ if (count == 0)
+ {
+ sprFile.writeLinesHeader ( );
+ if ( layer->projection() )
+ sprFile.writeProjection ( layer->projection() );
+ sprFile.writeBox ( layer->box() );
+ sprFile.writeInfoEnd();
+ labelFile.writeLabelHeader(TeSPRThematic);
+ }
+ for (k = 0; k < poly.size(); k++ )
+ {
+ TeLinearRing ring = poly[k];
+
+ for (unsigned int l = 0 ; l < ring.size(); l++)
+ sprFile.writePoint ( ring[l] );
+ sprFile.writeEnd();
+ }
+
+ TeCoord2D pt = TeFindCentroid( poly );
+ labelFile.writeThematicLabel(pt.x(), pt.y(),theme);
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ }
+ } while (flag);
+ }
+ portal->freeResult();
+ }
+
+ if (layer->hasGeometry(TeCELLS))
+ {
+ sql += layer->tableName(TeCELLS) + " geoT ";
+ sql += " WHERE attT." + linkName + "= geoT.object_id";
+ if (portal->query(sql) && portal->fetchRow())
+ {
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+ ti = clock();
+ count = 0;
+ do
+ {
+ string theme = portal->getData(0);
+ TeCell cell;
+ flag = portal->fetchGeometry(cell);
+ if (count == 0)
+ {
+ sprFile.writeLinesHeader ( );
+ if ( layer->projection() )
+ sprFile.writeProjection ( layer->projection() );
+ sprFile.writeBox ( layer->box() );
+ sprFile.writeInfoEnd();
+ labelFile.writeLabelHeader(TeSPRThematic);
+ }
+ TeCoord2D ll = cell.box().lowerLeft();
+ TeCoord2D ur = cell.box().upperRight();
+ sprFile.writePoint (ll);
+ TeCoord2D p1(ur.x(), ll.y());
+ sprFile.writePoint (p1);
+ sprFile.writePoint (ur);
+ TeCoord2D p2(ll.x(),ur.y());
+ sprFile.writePoint (p2);
+ sprFile.writePoint (ll);
+ sprFile.writeEnd();
+ TeCoord2D pt = TeFindCentroid(cell);
+ labelFile.writeThematicLabel(pt.x(), pt.y(),theme);
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ } while (flag);
+ }
+ portal->freeResult();
+ }
+ sprFile.writeEnd();
+ labelFile.writeEnd();
+ delete portal;
+ return true;
+ }
+ catch(...)
+ {
+ if (portal)
+ delete portal;
+ return false;
+ }
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+}
+
+
+bool TeExportSPRNetworkData(TeLayer* layer, const string& sprFileName, const string& objName)
+{
+ if (!layer || !(layer->hasGeometry(TePOINTS) || layer->hasGeometry(TeLINES)) )
+ return false;
+
+ TeDatabasePortal* portal = layer->database()->getPortal();
+ if (!portal)
+ return false;
+ clock_t ti,tf;
+ int count;
+
+ try{
+ TeSPRFile sprFile ( sprFileName+".spr", "w+" );
+ sprFile.writeNetworkHeader();
+ if ( layer->projection() )
+ sprFile.writeProjection ( layer->projection() );
+ sprFile.writeBox ( layer->box() );
+ sprFile.writeInfoEnd();
+ bool flag; ;
+ if (layer->hasGeometry(TeLINES))
+ {
+ string sql = "SELECT * FROM " + layer->tableName(TeLINES);
+ if (portal->query(sql) && portal->fetchRow())
+ {
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+ ti = clock();
+ TeSPRFile labelFile(sprFileName+"_LAB.spr", "w+");
+ do
+ {
+ TeLine2D line;
+ string objid = portal->getData("object_id");
+ flag = portal->fetchGeometry(line);
+ if (!line.empty())
+ {
+ sprFile.writeNetworkLineHeader(count++);
+ unsigned int k;
+ for (k=0; k<line.size(); k++ )
+ sprFile.writePoint ( line[k] );
+ sprFile.writeEnd();
+ if (count==0)
+ labelFile.writeLabelHeader(TeSPRNetwork);
+ TeCoord2D pt = TeFindCentroid( line );
+ labelFile.writeNetworkLabel(objid,pt.x(), pt.y(),objName);
+ count++;
+ }
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ }while (flag);
+ if (count>0)
+ {
+ sprFile.writeEnd();
+ labelFile.writeEnd();
+ }
+ }
+ portal->freeResult();
+ }
+ }
+ catch (...)
+ {
+ delete portal;
+ return false;
+ }
+ delete portal;
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+ return true;
+}
+
+bool TeExportSPRCadastralData( TeLayer* layer, const string& sprFileName, const string& objName)
+{
+ if (!layer || !(layer->hasGeometry(TePOINTS) || layer->hasGeometry(TeLINES) ||
+ layer->hasGeometry(TePOLYGONS) || layer->hasGeometry(TeCELLS)))
+ return false;
+
+ TeDatabasePortal* portal= layer->database()->getPortal();
+ if (!portal)
+ return false;
+ bool flag;
+ clock_t ti, tf;
+ int count = 0;
+ unsigned int k;
+ try {
+
+ TeSPRFile sprFile ( sprFileName+".spr", "w+" );
+ if (layer->hasGeometry(TePOINTS))
+ {
+ string sql = "SELECT * FROM " + layer->tableName(TePOINTS);
+ if (portal->query(sql) && portal->fetchRow())
+ {
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+ ti = clock();
+ do
+ {
+ if (count==0)
+ {
+ sprFile.writePointsHeader ( );
+ sprFile.writeProjection ( layer->projection() );
+ sprFile.writeBox ( layer->box() );
+ sprFile.writeInfoEnd();
+ }
+ string objid = portal->getData("object_id");
+ TePoint xy;
+ flag = portal->fetchGeometry(xy);
+ sprFile.writeCadastralLabel(objid,xy.location().x(), xy.location().y(),objName);
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ } while (flag);
+ if (count)
+ sprFile.writeEnd();
+ }
+ portal->freeResult();
+ }
+
+ count = 0;
+ // if layer has lines, polygons or cells there should be one more file with labels
+ if (layer->hasGeometry(TeLINES) || layer->hasGeometry(TePOLYGONS)|| layer->hasGeometry(TeCELLS))
+ {
+ TeSPRFile labelFile(sprFileName+"_LAB.spr", "w+");
+ if (layer->hasGeometry(TeLINES))
+ {
+ string sql = "SELECT * FROM " + layer->tableName(TeLINES);
+ if (portal->query(sql) && portal->fetchRow())
+ {
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+ ti = clock();
+ do
+ {
+ string objid = portal->getData("object_id");
+ TeLine2D line;
+ flag = portal->fetchGeometry(line);
+ if (!line.empty())
+ {
+ if (count == 0)
+ {
+ sprFile.writeLinesHeader ( );
+ if ( layer->projection() )
+ sprFile.writeProjection ( layer->projection() );
+ sprFile.writeBox ( layer->box() );
+ sprFile.writeInfoEnd();
+ labelFile.writeLabelHeader(TeSPRCadastral);
+ }
+ for (k=0; k<line.size(); k++ )
+ sprFile.writePoint ( line[k] );
+ sprFile.writeEnd();
+ TeCoord2D xy = TeFindCentroid( line );
+ labelFile.writeCadastralLabel(objid,xy.x(), xy.y(),objName);
+ } // end - polygon is not empty
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ } while (flag); // end - for every record
+ } // end - if there is any record
+ } // end - if has lines
+ portal->freeResult();
+ if (layer->hasGeometry(TePOLYGONS))
+ {
+ string sql = "SELECT * FROM " + layer->tableName(TePOLYGONS);
+ if (portal->query(sql) && portal->fetchRow())
+ {
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+ ti = clock();
+ do
+ {
+ string objid = portal->getData("object_id");
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ if (!poly.empty())
+ {
+ if (count == 0)
+ {
+ sprFile.writeLinesHeader ( );
+ if ( layer->projection() )
+ sprFile.writeProjection ( layer->projection() );
+ sprFile.writeBox ( layer->box() );
+ sprFile.writeInfoEnd();
+ labelFile.writeLabelHeader(TeSPRCadastral);
+ }
+ for (k = 0; k < poly.size(); k++ )
+ {
+ TeLinearRing ring = poly[k];
+ for (unsigned int l = 0 ; l < ring.size(); l++)
+ sprFile.writePoint ( ring[l] );
+ sprFile.writeEnd();
+ }
+ TeCoord2D xy = TeFindCentroid( poly );
+ labelFile.writeCadastralLabel(objid,xy.x(), xy.y(),objName);
+ } // end - poly not empty
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ } while (flag); // end - for every record
+ } // end - has any record
+ } // end - if has polygons
+ portal->freeResult();
+ if (layer->hasGeometry(TeCELLS))
+ {
+ string sql = "SELECT * FROM " + layer->tableName(TeCELLS);
+ if (portal->query(sql) && portal->fetchRow())
+ {
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+ ti = clock();
+ do
+ {
+ string objid = portal->getData("object_id");
+ TeCell cell;
+ flag = portal->fetchGeometry(cell);
+ if (count == 0)
+ {
+ sprFile.writeLinesHeader ( );
+ if ( layer->projection() )
+ sprFile.writeProjection ( layer->projection() );
+ sprFile.writeBox ( layer->box() );
+ sprFile.writeInfoEnd();
+ labelFile.writeLabelHeader(TeSPRCadastral);
+ }
+ TeCoord2D ll = cell.box().lowerLeft();
+ TeCoord2D ur = cell.box().upperRight();
+ sprFile.writePoint (ll);
+ TeCoord2D p1(ur.x(),ll.y());
+ sprFile.writePoint (p1);
+ sprFile.writePoint (ur);
+ TeCoord2D p2(ll.x(),ur.y());
+ sprFile.writePoint (p2);
+ sprFile.writePoint (ll);
+ sprFile.writeEnd();
+ TeCoord2D xy = TeFindCentroid(cell);
+ labelFile.writeCadastralLabel(objid,xy.x(), xy.y(),objName);
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ } while (flag);
+ }
+ }
+ portal->freeResult();
+ if (count>0)
+ {
+ sprFile.writeEnd();
+ labelFile.writeEnd();
+ }
+ } // end - if has lines or polygons
+ delete portal;
+ return true;
+ }
+ catch (...)
+ {
+ delete portal;
+ return true;
+ }
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+}
+
+bool TeExportSPRTable(TeLayer* layer, const string& sprFileName, const string& tabName, const string& objName, TeSpringModels cat)
+{
+ if (!layer || tabName.empty() || sprFileName.empty())
+ return false;
+
+ string obj;
+ if (objName.empty())
+ obj = "Objeto";
+ else
+ obj = objName;
+
+ // check if layer has the attribute table
+ TeTable tableE;
+ if (!layer->getAttrTablesByName(tabName,tableE))
+ return false;
+ int index = tableE.attrLinkPosition();
+ if (index < 0)
+ return false;
+
+ // Try to get the table
+ TeDatabasePortal* portal = layer->database()->getPortal();
+ if (!portal)
+ return false;
+
+ string sql = "SELECT * FROM " + tabName;
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ // retrieve the attribute information
+ TeAttributeList attInfo = portal->AttributeList();
+
+ TeSPRFile tabFile(sprFileName+"_TAB.spr", "w+");
+
+ // write the attribute information ( skip the index if exists)
+ tabFile.writeTableHeader( cat );
+ tabFile.writeAttributeInfo (attInfo, obj, tableE.linkName());
+ tabFile.writeInfoEnd();
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+ int count = 0;
+ clock_t ti, tf;
+ ti = clock();
+ while (portal->fetchRow())
+ {
+ TeTableRow row;
+ for (int j = 0; j < portal->numFields(); j++)
+ row.push_back ( portal->getData (j) );
+
+ string label = row[index];
+ tabFile.writeGeoId (label);
+ for (unsigned int col = 0; col < row.size(); col++)
+ {
+ if ( col == (unsigned int) index ) // skip the index - already written
+ continue;
+ tabFile.writeValue(row[col], attInfo[col].rep_.type_); // write the value
+ }
+ tabFile.writeNewLine();
+ count++;
+ if (TeProgress::instance())
+ {
+ tf = clock();
+ if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+ TeProgress::instance()->setProgress(count);
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ ti = tf;
+ }
+ }
+ tabFile.writeEnd();
+ delete portal;
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+ return true;
+}
+
diff --git a/src/terralib/functions/TeGeoProcessingFunctions.cpp b/src/terralib/functions/TeGeoProcessingFunctions.cpp
new file mode 100644
index 0000000..6da13db
--- /dev/null
+++ b/src/terralib/functions/TeGeoProcessingFunctions.cpp
@@ -0,0 +1,2097 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include "TeGeoProcessingFunctions.h"
+#include "TeQuerier.h"
+#include "TeQuerierParams.h"
+#include "TeOverlay.h"
+#include "TeProgress.h"
+#include "TeVectorRemap.h"
+#include "TeApplicationUtils.h"
+#include "TeCellAlgorithms.h"
+#include "TeAsciiFile.h"
+
+
+bool changeAttrList(TeAttributeList& attrList)
+{
+ bool change = false;
+
+ for(int i=0; i<(int)attrList.size(); ++i)
+ {
+ string& nameOr = attrList[i].rep_.name_;
+
+ attrList[i].rep_.isAutoNumber_ = false;
+ attrList[i].rep_.isPrimaryKey_ = false;
+
+ //replace "." for "_"
+ string::size_type f = nameOr.find(".");
+ if(f != string::npos)
+ {
+ nameOr.replace(f, 1, "_");
+ change = true;
+ }
+
+ string nameTemp = TeConvertToUpperCase(nameOr);
+
+ int count = 1;
+ int j = i+1;
+ while(j<(int)attrList.size())
+ {
+ if((nameTemp == TeConvertToUpperCase(attrList[j].rep_.name_)) && (i!=j))
+ {
+ nameTemp = nameTemp +"_"+ Te2String(count);
+ nameOr = nameOr +"_"+ Te2String(count);
+
+ j = 0;
+ change = true;
+ ++count;
+ }
+ ++j;
+ }
+ }
+
+ return change;
+}
+
+
+bool multiGeometryToLayer(TeMultiGeometry& mGeom, const string& newId, TeLayer* newLayer, TeProjection* proj=0)
+{
+ bool flag = false;
+ TeProjection* projLayer = newLayer->projection();
+
+ if(mGeom.hasPolygons())
+ {
+ TePolygonSet polSet, polSetTemp;
+ mGeom.getGeometry (polSetTemp);
+
+ if((proj) && (!((*proj) == (*projLayer))))
+ {
+ for(int i=0; i<(int)polSetTemp.size(); ++i)
+ {
+ TePolygon poly = polSetTemp[i];
+ TePolygon pout;
+ TeVectorRemap (poly, proj, pout, projLayer);
+ pout.objectId(poly.objectId());
+ polSet.add (pout);
+ }
+ }
+ else
+ polSet = polSetTemp;
+
+
+ polSet.objectId(newId);
+ flag = newLayer->addPolygons(polSet);
+ }
+ else if (mGeom.hasLines())
+ {
+ TeLineSet lineSet, lineSetTemp;
+ mGeom.getGeometry (lineSetTemp);
+
+ if((proj) && (!((*proj) == (*projLayer))))
+ {
+ for(int i=0; i<(int)lineSetTemp.size(); ++i)
+ {
+ TeLine2D line = lineSetTemp[i];
+ TeLine2D lout;
+ TeVectorRemap (line, proj, lout, projLayer);
+ lout.objectId(line.objectId());
+ lineSet.add (lout);
+ }
+ }
+ else
+ lineSet = lineSetTemp;
+
+ lineSet.objectId (newId);
+ flag = newLayer->addLines(lineSet);
+ }
+ else if (mGeom.hasPoints())
+ {
+ TePointSet pointSet, pointSetTemp;
+ mGeom.getGeometry (pointSetTemp);
+
+ if((proj) && (!((*proj) == (*projLayer))))
+ {
+ for(int i=0; i<(int)pointSetTemp.size(); ++i)
+ {
+ TePoint point = pointSetTemp[i];
+ TePoint pout;
+ TeVectorRemap (point, proj, pout, projLayer);
+ pout.objectId(point.objectId());
+ pointSet.add (pout);
+ }
+ }
+ else
+ pointSet = pointSetTemp;
+
+ pointSet.objectId (newId);
+ flag = newLayer->addPoints(pointSet);
+ }
+ else if (mGeom.hasCells())
+ {
+ TeCellSet cellSet, cellSetTemp;
+ mGeom.getGeometry (cellSetTemp);
+
+ if((proj) && (!((*proj) == (*projLayer))))
+ {
+ for(int i=0; i<(int)cellSetTemp.size(); ++i)
+ {
+ TeCell cell = cellSetTemp[i];
+ TeCell cellout;
+ TeVectorRemap (cell, proj, cellout, projLayer);
+ cellout.objectId(cell.objectId());
+ cellSet.add (cellout);
+ }
+ }
+ else
+ cellSet = cellSetTemp;
+
+ cellSet.objectId (newId);
+ flag = newLayer->addCells(cellSet);
+ }
+ else
+ return false;
+
+ return flag;
+}
+
+
+
+bool TeGeoOpAggregation(TeLayer* newLayer, TeTheme* theme, vector<string> agregAttrVec,
+ TeGroupingAttr& attrMM, TeSelectedObjects selOb, TeAsciiFile* logFile)
+{
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+ int i, j, offset, steps = 0;
+ TeStatisticValMap stat;
+ TeStatisticStringValMap sstat;
+ vector<string> valVec;
+ map<int, vector<string> > stringMap;
+ map<int, vector<double> > doubleMap;
+ string geoName, query;
+ string layerName = newLayer->name();
+ TeLayer* layer = theme->layer();
+ TeDatabase* db = layer->database();
+ string CT = theme->collectionTable();
+ string OID = CT + ".c_object_id";
+
+ TeAttributeList aList = theme->sqlAttList();
+ TeAttribute agregTeAttribute;
+ agregTeAttribute.rep_.type_ = TeSTRING;
+ agregTeAttribute.rep_.numChar_ = 200;
+ agregTeAttribute.rep_.isPrimaryKey_ = false;
+ agregTeAttribute.rep_.isAutoNumber_ = false;
+
+ map<int, string> legendLabelMap;
+ int legIndex = -1;
+
+ for(j=0; j<(int)agregAttrVec.size(); ++j)
+ {
+ string name;
+ if(agregAttrVec[j] == "CURRENT LEGEND")
+ {
+ agregAttrVec[j] = CT + ".c_legend_id";
+ name = "agreg_leg_";
+ legIndex = j;
+ }
+ else
+ {
+ for(i=0; i<(int)aList.size(); ++i)
+ {
+ name = aList[i].rep_.name_;
+ if(name == agregAttrVec[j])
+ {
+ int f = name.find(".");
+ if(f >= 0)
+ name.replace(f, 1, "_");
+ break;
+ }
+ }
+ }
+ if(j==0)
+ agregTeAttribute.rep_.name_ += name;
+ else
+ agregTeAttribute.rep_.name_ += "_" + name;
+ }
+ if(agregTeAttribute.rep_.name_.size() > 30)
+ agregTeAttribute.rep_.name_.erase(30, agregTeAttribute.rep_.name_.size()-30);
+
+ if(legIndex > -1)
+ {
+ TeLegendEntryVector& legVec = theme->legend();
+ for(i=0; i<(int)legVec.size(); ++i)
+ legendLabelMap[legVec[i].id()] = legVec[i].label();
+ }
+
+ TeAttributeList attList;
+
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "object_id_";
+ at.rep_.numChar_ = 255;
+ at.rep_.isPrimaryKey_ = true;
+ at.rep_.isAutoNumber_ = false;
+ attList.push_back(at);
+
+ attList.push_back(agregTeAttribute);
+
+ at.rep_.type_ = TeINT;
+ at.rep_.name_ = "agreg_count_";
+ at.rep_.numChar_ = 0;
+ at.rep_.isPrimaryKey_ = false;
+ attList.push_back(at);
+
+ TeGroupingAttr::iterator it;
+ string ss;
+ for(it=attrMM.begin(); it!=attrMM.end(); ++it)
+ {
+ string s = it->first.name_;
+ TeStatisticType sType = it->second;
+
+ ss = getStringFromStatistic(sType);
+ string sss = s + "_" + ss;
+
+ if(((db->dbmsName()=="OracleAdo") ||
+ (db->dbmsName()=="OracleSpatial") ) &&
+ (sss.size() > 30))
+ {
+ int s = sss.size();
+ at.rep_.name_ = sss.substr(s-30, s-1);
+ }
+ else
+ at.rep_.name_ = sss;
+
+ at.rep_ = it->first;
+ at.rep_.isPrimaryKey_ = false;
+ if(at.rep_.type_ == TeINT)
+ at.rep_.type_ = TeREAL;
+ attList.push_back(at);
+ }
+
+ changeAttrList(attList);
+ TeTable attTable(newLayer->name(), attList, "object_id_", "object_id_");
+
+ if(!newLayer->createAttributeTable(attTable))
+ return false;
+
+ string queryAtr = "SELECT " + OID;
+
+ for(i=0; i<(int)agregAttrVec.size(); ++i)
+ queryAtr += ", " + agregAttrVec[i];
+
+ for(it=attrMM.begin(); it!=attrMM.end(); ++it)
+ {
+ string s = it->first.name_;
+ bool existedName = false;
+ vector<string>::iterator it2 = agregAttrVec.begin();
+ while(it2!=agregAttrVec.end())
+ {
+ if((*it2)==s)
+ {
+ existedName=true;
+ break;
+ }
+ ++it2;
+ }
+
+ if((s != ss) && (!existedName))
+ queryAtr += ", " + s;
+ ss = s;
+ }
+ queryAtr += theme->sqlFrom();
+ if(selOb == TeSelectedByPointing)
+ queryAtr += " WHERE " + CT + ".c_object_status = 1 OR " + CT + ".c_object_status = 3";
+ else if(selOb == TeSelectedByQuery)
+ queryAtr += " WHERE " + CT + ".c_object_status = 2 OR " + CT + ".c_object_status = 3";
+ queryAtr += " ORDER BY ";
+ for(i=0; i<(int)agregAttrVec.size(); ++i)
+ {
+ queryAtr += agregAttrVec[i];
+ if(i<(int)agregAttrVec.size()-1)
+ queryAtr += ", ";
+ }
+
+ if(layer->hasGeometry(TePOLYGONS))
+ geoName = layer->tableName(TePOLYGONS);
+ else if(layer->hasGeometry(TeLINES))
+ geoName = layer->tableName(TeLINES);
+ else if(layer->hasGeometry(TePOINTS))
+ geoName = layer->tableName(TePOINTS);
+ else
+ geoName = layer->tableName(TeCELLS);
+
+ TeAttributeList geoAtList;
+ db->getAttributeList(geoName, geoAtList);
+ offset = geoAtList.size();
+
+ if((db->dbmsName()=="OracleAdo") || (db->dbmsName()=="OracleSpatial"))
+ query = "SELECT " + geoName + ".*, ATR.* FROM " + geoName + ", (" + queryAtr + ") ATR ";
+ else
+ query = "SELECT " + geoName + ".*, ATR.* FROM " + geoName + ", (" + queryAtr + ") AS ATR ";
+
+ string newOID = TeGetExtension(OID.c_str());
+
+ if(newOID.empty())
+ newOID = OID;
+
+ query += "WHERE ATR." + newOID + " = " + geoName + ".object_id";
+ query += " ORDER BY ";
+ for(i=0; i<(int)agregAttrVec.size(); ++i)
+ {
+ string newagre = TeGetExtension(agregAttrVec[i].c_str());
+
+ if(newagre.empty())
+ newagre = agregAttrVec[i];
+
+ query += "ATR." + newagre;
+ if(i<(int)agregAttrVec.size()-1)
+ query += ", ";
+ }
+ query += ", " + geoName + ".object_id";
+
+
+ if(layer->hasGeometry(TePOLYGONS))
+ {
+ if(db->dbmsName() != "OracleSpatial" && db->dbmsName() != "PostGIS")
+ query += ", " + geoName + ".parent_id, " + geoName + ".num_holes DESC";
+ }
+
+ TeDatabasePortal* portal = db->getPortal();
+
+ int total;
+ string qc = "SELECT COUNT(*) FROM " + CT;
+ if(selOb == TeSelectedByPointing)
+ qc += " WHERE " + CT + ".c_object_status = 1 OR " + CT + ".c_object_status = 3";
+ else if(selOb == TeSelectedByQuery)
+ qc += " WHERE " + CT + ".c_object_status = 2 OR " + CT + ".c_object_status = 3";
+ if(portal->query(qc) && portal->fetchRow())
+ total = atoi(portal->getData(0));
+
+ portal->freeResult();
+ if(portal->query(query) && portal->fetchRow())
+ {
+ TeAttributeList portalAttList = portal->AttributeList();
+
+ if(layer->hasGeometry(TePOLYGONS))
+ newLayer->addGeometry(TePOLYGONS);
+ else if(layer->hasGeometry(TeLINES))
+ newLayer->addGeometry(TeLINES);
+ else if(layer->hasGeometry(TePOINTS))
+ newLayer->addGeometry(TePOINTS);
+ else
+ newLayer->addGeometry(TeCELLS);
+
+ bool flag = false;
+ int count = 0;
+ int objectId = 1;
+ string lastOid = portal->getData(offset);
+ lastOid += "aaa";
+ string lastVal;
+
+ for(i=0; i<(int)agregAttrVec.size(); ++i)
+ {
+ string s = portal->getData(agregAttrVec[i]);
+ if(legIndex == i)
+ s = legendLabelMap[atoi(s.c_str())];
+ lastVal += s;
+ if(i<(int)agregAttrVec.size() - 1)
+ lastVal += "_";
+ }
+
+ TePolygonSet ps;
+ TeMultiGeometry multGeom;
+
+ if(TeProgress::instance())
+ {
+ string caption = "Aggregation";
+ TeProgress::instance()->setCaption(caption.c_str());
+ string msg = "Executing aggregation. Please, wait!";
+ TeProgress::instance()->setMessage(msg);
+ TeProgress::instance()->setTotalSteps(total);
+ t2 = clock();
+ t0 = t1 = t2;
+ }
+
+
+ TePrecision::instance().setPrecision(TeGetPrecision(layer->projection()));
+
+ do
+ {
+ string oid = portal->getData(offset);
+ string currVal;
+ for(i=0; i<(int)agregAttrVec.size(); ++i)
+ {
+ string s = portal->getData(agregAttrVec[i]);
+ if(legIndex == i)
+ s = legendLabelMap[atoi(s.c_str())];
+ currVal += s;
+ if(i<(int)agregAttrVec.size() - 1)
+ currVal += "_";
+ }
+
+ TePolygon p;
+ TeLine2D l;
+ TePoint pt;
+ TeCell c;
+ double dval;
+
+ if(lastVal == currVal)
+ {
+ if(oid != lastOid)
+ {
+ count++;
+ for(j=3, i=offset+(int)agregAttrVec.size()+1; i<(int)portalAttList.size(); ++i, ++j)
+ {
+ string s = portal->getData(i);
+ TeAttrDataType aType = portalAttList[i].rep_.type_;
+ if(aType != TeREAL && aType != TeINT)
+ stringMap[j].push_back(s);
+ else
+ {
+ if(s.empty())
+ dval = TeMAXFLOAT;
+ else
+ dval = atof(s.c_str());
+ doubleMap[j].push_back(dval);
+ }
+ }
+ }
+
+ if(layer->hasGeometry(TePOLYGONS))
+ {
+ flag = portal->fetchGeometry(p);
+ TePolygonSet psaux;
+ psaux.add(p);
+
+ TePolygonSet psauxOut;
+ if(!TeOVERLAY::TeUnion(ps, psaux, psauxOut))
+ {
+ // when the operation returns false, write in the log a possible
+ // inconsistency in the data
+ if (logFile)
+ {
+ string mess = "Possivel inconsistencia na uniao do objeto ";
+ mess += ps.objectId();
+ mess += " e ";
+ mess += p.objectId();
+ logFile->writeString(mess);
+ logFile->writeNewLine();
+ }
+ }
+ ps = psauxOut;
+ multGeom.setGeometry(ps);
+ }
+ else if(layer->hasGeometry(TeLINES))
+ {
+ flag = portal->fetchGeometry(l);
+ multGeom.addGeometry(l);
+ }
+ else if(layer->hasGeometry(TePOINTS))
+ {
+ flag = portal->fetchGeometry(pt);
+ multGeom.addGeometry(pt);
+ }
+ else
+ {
+ flag = portal->fetchGeometry(c);
+ multGeom.addGeometry(c);
+ }
+ }
+ else
+ {
+ if(!multiGeometryToLayer(multGeom, Te2String(objectId), newLayer))
+ {
+ delete portal;
+ return false;
+ }
+
+ valVec.push_back(Te2String(objectId));
+ valVec.push_back(lastVal);
+ valVec.push_back(Te2String(count));
+
+ i = 3;
+ it=attrMM.begin();
+ while(it != attrMM.end())
+ {
+ TeAttributeRep atRep = it->first;
+ TeAttrDataType aType = atRep.type_;
+
+ stat.clear();
+ sstat.clear();
+ if(aType == TeREAL || aType == TeINT)
+ TeCalculateStatistics(doubleMap[i].begin(), doubleMap[i].end(), stat);
+ else
+ TeCalculateStatistics(stringMap[i].begin(), stringMap[i].end(), sstat);
+
+ int ssize = attrMM.count(atRep);
+ for(j=0; j<ssize; ++j)
+ {
+ TeStatisticType sType = it->second;
+
+ if(aType == TeREAL || aType == TeINT)
+ {
+ double d = stat[sType];
+ valVec.push_back(Te2String(d));
+ }
+ else
+ {
+ string s = sstat[sType];
+ valVec.push_back(s);
+ }
+ it++;
+ }
+ i++;
+ }
+
+ TeTableRow row;
+ for(i=0; i<(int)valVec.size(); ++i)
+ row.push_back(valVec[i]);
+ attTable.add(row);
+
+ valVec.clear();
+ stringMap.clear();
+ doubleMap.clear();
+ count = 0;
+ ps.clear();
+ multGeom.clear();
+
+ if(oid != lastOid)
+ {
+ count++;
+ for(j=3, i=offset+(int)agregAttrVec.size()+1; i<(int)portalAttList.size(); ++i, ++j)
+ {
+ string s = portal->getData(i);
+ TeAttrDataType aType = portalAttList[i].rep_.type_;
+ if(aType != TeREAL && aType != TeINT)
+ stringMap[j].push_back(s);
+ else
+ {
+ if(s.empty())
+ dval = TeMAXFLOAT;
+ else
+ dval = atof(s.c_str());
+ doubleMap[j].push_back(dval);
+ }
+ }
+ }
+
+ if(layer->hasGeometry(TePOLYGONS))
+ {
+ flag = portal->fetchGeometry(p);
+ TePolygonSet psaux;
+ psaux.add(p);
+
+ TePolygonSet psauxOut;
+
+ if(!TeOVERLAY::TeUnion(ps, psaux, psauxOut))
+ {
+ // when the operation returns false, write in the log a possible
+ // inconsistency in the data
+ if (logFile)
+ {
+ string mess = "Possivel inconsistencia na uniao do objeto ";
+ mess += ps.objectId();
+ mess += " e ";
+ mess += p.objectId();
+ logFile->writeString(mess);
+ logFile->writeNewLine();
+ }
+ }
+ ps = psauxOut;
+
+ multGeom.setGeometry(ps);
+ }
+ else if(layer->hasGeometry(TeLINES))
+ {
+ flag = portal->fetchGeometry(l);
+ multGeom.addGeometry(l);
+ }
+ else if(layer->hasGeometry(TePOINTS))
+ {
+ flag = portal->fetchGeometry(pt);
+ multGeom.addGeometry(pt);
+ }
+ else
+ {
+ flag = portal->fetchGeometry(c);
+ multGeom.addGeometry(c);
+ }
+
+ ++objectId;
+ }
+
+ if((oid != lastOid) && TeProgress::instance())
+ {
+ steps++;
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ if(TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ delete portal;
+ return false;
+ }
+
+ if((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(steps);
+ }
+ }
+ lastOid = oid;
+ lastVal = currVal;
+
+ }while(flag);
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ if(!multGeom.empty())
+ {
+ if(!multiGeometryToLayer(multGeom, Te2String(objectId), newLayer))
+ {
+ delete portal;
+ return false;
+ }
+
+ valVec.push_back(Te2String(objectId));
+ valVec.push_back(lastVal);
+ valVec.push_back(Te2String(count));
+
+ i = 3;
+ it=attrMM.begin();
+ while(it != attrMM.end())
+ {
+ TeAttributeRep atRep = it->first;
+ TeAttrDataType aType = atRep.type_;
+
+ stat.clear();
+ sstat.clear();
+ if(aType == TeREAL || aType == TeINT)
+ TeCalculateStatistics(doubleMap[i].begin(), doubleMap[i].end(), stat);
+ else
+ TeCalculateStatistics(stringMap[i].begin(), stringMap[i].end(), sstat);
+
+ int ssize = attrMM.count(atRep);
+ for(j=0; j<ssize; ++j)
+ {
+ TeStatisticType sType = it->second;
+
+ if(aType == TeREAL || aType == TeINT)
+ {
+ double d = stat[sType];
+ valVec.push_back(Te2String(d));
+ }
+ else
+ {
+ string s = sstat[sType];
+ valVec.push_back(s);
+ }
+ it++;
+ }
+ i++;
+ }
+
+ TeTableRow row;
+ for(i=0; i<(int)valVec.size(); ++i)
+ row.push_back(valVec[i]);
+ attTable.add(row);
+
+ valVec.clear();
+ stringMap.clear();
+ doubleMap.clear();
+ count = 0;
+ ps.clear();
+ multGeom.clear();
+ }
+
+ newLayer->saveAttributeTable(attTable);
+ }
+ else
+ {
+ delete portal;
+ return false;
+ }
+
+ delete portal;
+ return true;
+}
+
+
+bool TeGeoOpAdd(TeLayer* newLayer, TeTheme* theme, TeThemeVector themeVec,
+ TeSelectedObjects selOb,TeAsciiFile* logFile)
+{
+
+ bool insertAttr = false;
+
+ // create attribute table from main theme
+ TeAttributeList attrList;
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "object_id_"+ Te2String(newLayer->id());
+ at.rep_.numChar_ = 255;
+ at.rep_.isPrimaryKey_ = true;
+ at.rep_.isAutoNumber_ = false;
+ attrList.push_back(at);
+
+ //main theme
+ TeQuerierParams mainParams(true, true);
+ mainParams.setParams(theme);
+ mainParams.setSelecetObjs(selOb);
+ TeQuerier* mainQuerier = new TeQuerier(mainParams);
+
+ if(!mainQuerier->loadInstances())
+ return false;
+
+ //get attribute list from querier
+ TeAttributeList attribs = mainQuerier->getAttrList();
+ TeAttributeList::iterator it = attribs.begin();
+ while(it != attribs.end())
+ {
+ attrList.push_back (*it);
+ ++it;
+ }
+
+ //verify if there are duplicate names
+ changeAttrList(attrList);
+ attrList[0].rep_.isPrimaryKey_ = true; //link attribute is primary key
+
+ // --------- create table
+ TeTable attrTable (newLayer->name(), attrList, attrList[0].rep_.name_, attrList[0].rep_.name_);
+
+ if(!newLayer->createAttributeTable(attrTable))
+ return false;
+
+ int newId = 0;
+
+ // ---------------------------------- Begin main theme
+ TeSTInstance st;
+ while(mainQuerier->fetchInstance(st))
+ {
+ TeTableRow row;
+ TePropertyVector vect = st.getPropertyVector();
+ row.push_back(Te2String(++newId));
+
+ //insert os valores do tema principal
+ for(int p=0; p<(int)vect.size();++p)
+ row.push_back(vect[p].value_);
+
+ attrTable.add(row);
+
+ if(!multiGeometryToLayer(st.geometries(), Te2String(newId), newLayer))
+ return false;
+
+ if((newId%100)==0)
+ {
+ //insert attributes
+ newLayer->saveAttributeTable(attrTable); //save 100 records!!!
+ if(attrTable.size()>0)
+ insertAttr = true;
+ attrTable.clear();
+ }
+ } //while fetchInstance no querier
+
+
+ // save the last records
+ newLayer->saveAttributeTable(attrTable);
+ if(attrTable.size()>0)
+ insertAttr = true;
+ attrTable.clear();
+ st.clear();
+ delete mainQuerier;
+
+ // ---------------------------------- End main theme
+
+ for(int i=0; i<(int)themeVec.size(); ++i)
+ {
+
+ TeTheme* temp = themeVec[i];
+ TeProjection* projTemp = temp->layer()->projection();
+
+ TeQuerierParams params(true, true);
+
+ params.setParams(temp);
+ params.setSelecetObjs (selOb);
+ TeQuerier* querier = new TeQuerier(params);
+
+ if(!querier->loadInstances())
+ return false;
+
+ attribs.clear();
+ attribs = querier->getAttrList();
+ vector<int> indexVec;
+
+ for(int k=0; k<(int)attrList.size(); ++k)
+ {
+ string name = attrList[k].rep_.name_;
+ int ind = -1;
+
+ for(int p=0; p<(int)attribs.size();++p)
+ {
+ if(TeConvertToUpperCase(name) == TeConvertToUpperCase(attribs[p].rep_.name_))
+ {
+ ind = p;
+ break;
+ }
+ }
+
+ indexVec.push_back(ind);
+ }
+
+ while(querier->fetchInstance(st))
+ {
+ TeTableRow row;
+ TePropertyVector vect = st.getPropertyVector();
+ row.push_back(Te2String(++newId));
+
+ //insert the values when the names are equals
+ for(int p=1; p<(int)attrList.size();++p)
+ {
+ int s = indexVec[p];
+ if(s<0)
+ row.push_back("");
+ else
+ row.push_back(vect[s].value_);
+ }
+
+ attrTable.add(row);
+
+ if(!multiGeometryToLayer(st.geometries(), Te2String(newId), newLayer, projTemp))
+ return false;
+
+ if((newId%100)==0)
+ {
+ //insert attributes
+ newLayer->saveAttributeTable(attrTable); //save 100 records!!!
+ if(attrTable.size()>0)
+ insertAttr = true;
+ attrTable.clear();
+ }
+ } //while fetchInstance no querier
+
+ newLayer->saveAttributeTable(attrTable); //save the last records!!!
+ if(attrTable.size()>0)
+ insertAttr = true;
+ attrTable.clear();
+ st.clear();
+ }
+
+ if(!newLayer->box().isValid())
+ return false;
+
+ if(!insertAttr)
+ return false;
+
+ return true;
+}
+
+bool TeGeoOpOverlayIntersection(TeLayer* newLayer, TeTheme* theme, TeTheme* themeTrim,
+ TeSelectedObjects selOb, TeSelectedObjects selObTrim,
+ bool attrTrim, TeAsciiFile* logFile)
+{
+ if((!newLayer) || (!theme) || (!themeTrim))
+ return false;
+
+ bool insertAttr = false;
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+
+ TeLayer* layer = theme->layer();
+ TeLayer* layerTrim = themeTrim->layer();
+
+ TeProjection* proj = layer->projection();
+ TeProjection* projTrim = layerTrim->projection();
+
+ //Querier Trim
+ TeQuerierParams paramsTrim(true, true);
+ paramsTrim.setParams(themeTrim);
+ paramsTrim.setSelecetObjs(selObTrim);
+ TeQuerier querierTrim(paramsTrim);
+
+ if(!querierTrim.loadInstances())
+ return false;
+
+ // ----------------- begin create attribute table
+
+ TeAttributeList attrList;
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "object_id_"+ Te2String(newLayer->id());
+ at.rep_.numChar_ = 255;
+ at.rep_.isPrimaryKey_ = true;
+ at.rep_.isAutoNumber_ = false;
+ attrList.push_back(at);
+
+ //theme
+ TeQuerierParams paramsTemp(false, true);
+ paramsTemp.setParams(theme);
+ TeQuerier* querierTemp = new TeQuerier(paramsTemp);
+
+ if(!querierTemp->loadInstances())
+ return false;
+
+ //get attribute list from querier
+ TeAttributeList attribs = querierTemp->getAttrList();
+ TeAttributeList::iterator it = attribs.begin();
+ while(it != attribs.end())
+ {
+ attrList.push_back (*it);
+ ++it;
+ }
+
+ delete querierTemp;
+
+ //trim
+ attribs.clear();
+ attribs = querierTrim.getAttrList();
+
+ //fill attributes from Trim theme
+ if(attrTrim)
+ {
+ it = attribs.begin();
+ while(it != attribs.end())
+ {
+ attrList.push_back (*it);
+ ++it;
+ }
+ }
+
+ changeAttrList(attrList);
+ attrList[0].rep_.isPrimaryKey_ = true; //link attribute is primary key
+
+ TeTable attrTable (newLayer->name(), attrList, attrList[0].rep_.name_, attrList[0].rep_.name_);
+
+ if(!newLayer->createAttributeTable(attrTable))
+ return false;
+
+ // ----------------- End create attribute table
+ int numPolygonsTrim = querierTrim.numElemInstances();
+ // set progress bar
+ if(TeProgress::instance())
+ {
+ string caption = "Overlay Intersection";
+ string msg = "Executing Overlay Intersection. Please, wait!";
+ TeProgress::instance()->setCaption(caption.c_str());
+ TeProgress::instance()->setMessage(msg);
+ TeProgress::instance()->setTotalSteps(numPolygonsTrim);
+ t2 = clock();
+ t0 = t1 = t2;
+ }
+
+ double tol = TeGetPrecision(proj);
+ TePrecision::instance().setPrecision(tol);
+
+ int steps = 0;
+ TeSTInstance trim;
+ int newId = 0;
+
+ while(querierTrim.fetchInstance(trim))
+ {
+ TePolygonSet polSet;
+ if(!trim.getGeometry(polSet))
+ continue;
+
+ TeTableRow rowTrim;
+ if(attrTrim)
+ {
+ //fill attribute values from trim
+ TePropertyVector vecTrim = trim.getPropertyVector();
+
+ for(int p=0; p<(int)vecTrim.size();++p)
+ rowTrim.push_back(vecTrim[p].value_);
+ }
+
+ TePolygonSet ps;
+ TeLineSet ls;
+ TePointSet pts;
+ TeCellSet cs;
+
+ for(int i=0; i<(int)polSet.size(); ++i)
+ {
+ TePolygon polyTrim = polSet[i];
+
+ if(!((*proj) == (*projTrim)))
+ {
+ TePolygon pout;
+ TeVectorRemap (polyTrim, projTrim, pout, proj);
+ polyTrim = pout;
+ }
+
+ TePolygonSet polyTrimSet;
+ polyTrimSet.add(polyTrim);
+
+ TeBox boxTrim = polyTrim.box();
+
+ //Querier - theme that will be clip
+ TeQuerierParams params(true, true);
+ params.setParams(theme);
+ params.setSelecetObjs(selOb);
+ params.setSpatialRest(boxTrim, TeINTERSECTS, TeGEOMETRYNONE);
+
+ TeQuerier querier(params);
+
+ if(!querier.loadInstances())
+ continue;
+
+ TeSTInstance sti;
+ while(querier.fetchInstance(sti))
+ {
+ TeTableRow row;
+ TePropertyVector vect = sti.getPropertyVector();
+ row.push_back("");
+
+ //insert values of the theme that is been clip
+ for(int p=0; p<(int)vect.size();++p)
+ row.push_back(vect[p].value_);
+
+ if(attrTrim)
+ {
+ for(int i=0; i<(int)rowTrim.size(); ++i)
+ row.push_back(rowTrim[i]);
+ }
+
+ if(sti.hasPolygons())
+ {
+ TePolygonSet polSet;
+ sti.getGeometry (polSet);
+
+ for(int j=0; j<(int)polSet.size(); ++j)
+ {
+ TePolygonSet psAux, resultPS;
+ psAux.add(polSet[j]);
+ if(!TeOVERLAY::TeIntersection(polyTrimSet, psAux, resultPS))
+ {
+ // when the operation returns false, write in the log a possible
+ // inconsistency in the data
+ if (logFile)
+ {
+ string mess = "Possivel inconsistencia na interseccao do objeto ";
+ mess += polyTrim.objectId();
+ mess += " do tema " + themeTrim->name() + " e ";
+ mess += polSet[j].objectId();
+ mess += theme->name();
+ logFile->writeString(mess);
+ logFile->writeNewLine();
+ }
+ }
+
+ for(int c=0; c<(int)resultPS.size(); ++c)
+ {
+ newId++;
+ TePolygon paux = resultPS[c];
+ paux.objectId(Te2String(newId));
+ ps.add(paux);
+ row[0] = Te2String(newId);
+ attrTable.add(row);
+ }
+ }
+ }
+ else if (sti.hasLines())
+ {
+ TeLineSet lineSet;
+ sti.getGeometry (lineSet);
+
+ for(int j=0; j<(int)lineSet.size(); ++j)
+ {
+ TeLineSet lsAux, resultLS;
+ TeMultiGeometry resultMGEOM;
+ lsAux.add(lineSet[j]);
+ resultMGEOM = TeOVERLAY::TeIntersection(lsAux, polyTrimSet);
+
+ resultMGEOM.getGeometry(resultLS);
+
+ for(int c=0; c<(int)resultLS.size(); ++c)
+ {
+ newId++;
+ TeLine2D laux = resultLS[c];
+ laux.objectId(Te2String(newId));
+
+ ls.add(laux);
+ row[0] = Te2String(newId);
+ attrTable.add(row);
+ }
+ }
+ }
+ else if (sti.hasPoints())
+ {
+ TePointSet pointSet;
+ sti.getGeometry (pointSet);
+
+ for(int j=0; j<(int)pointSet.size(); ++j)
+ {
+ if(TeWithin(pointSet[j], polyTrim))
+ {
+ newId++;
+ pointSet[j].objectId(Te2String(newId));
+ pts.add(pointSet[j]);
+ row[0] = Te2String(newId);
+ attrTable.add(row);
+ }
+ }
+ }
+ else if (sti.hasCells())
+ {
+ TeCellSet cellSet;
+ sti.getGeometry (cellSet);
+
+ for(int j=0; j<(int)cellSet.size(); ++j)
+ {
+ if(TeIntersects(cellSet[j], polyTrim))
+ {
+ newId++;
+ cellSet[j].objectId(Te2String(newId));
+ cs.add(cellSet[j]);
+ row[0] = Te2String(newId);
+ attrTable.add(row);
+ }
+ }
+
+ }
+ } //while fetchInstance
+ }//for each polygon of the Trim theme
+
+ //inserir a geometria no banco
+ if(layer->hasGeometry(TePOLYGONS) && ps.size())
+ newLayer->addPolygons(ps);
+ else if(layer->hasGeometry(TeLINES) && ls.size())
+ newLayer->addLines(ls);
+ else if(layer->hasGeometry(TePOINTS) && pts.size())
+ newLayer->addPoints(pts);
+ else if(cs.size())
+ newLayer->addCells(cs);
+
+ trim.clear();
+
+ steps++;
+ t2 = clock();
+ if ((TeProgress::instance()) && (int(t2-t1) > dt))
+ {
+ t1 = t2;
+ if(TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ if((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(steps);
+ }
+
+ if((steps%100)==0)
+ {
+ newLayer->saveAttributeTable(attrTable); //save 100 records!!!
+ if(attrTable.size()>0)
+ insertAttr = true;
+ attrTable.clear();
+ }
+ } //while fetch instance querier Trim
+
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ newLayer->saveAttributeTable(attrTable); //save the last records!!!
+ if(attrTable.size()>0)
+ insertAttr = true;
+
+ if(!newLayer->box().isValid())
+ return false;
+
+ if(!insertAttr)
+ return false;
+
+ return true;
+}
+
+bool TeGeoOpAssignDataLocationDistribute(TeTheme* themeMod, TeTheme* theme, const string& tableName,
+ const int& spatialRelation)
+{
+ if((!themeMod) || (!themeMod->layer()) || (!theme))
+ return false;
+
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+
+ TeLayer* layerMod = themeMod->layer();
+ TeProjection* projMod = layerMod->projection();
+ TeProjection* proj = theme->layer()->projection();
+
+ //Querier from theme
+ TeQuerierParams params(true, true);
+ params.setParams(theme);
+ TeQuerier querier(params);
+
+ if(!querier.loadInstances())
+ return false;
+
+ // ----------------- begin create attribute table
+
+ TeAttributeList attrList;
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "object_id_";
+ at.rep_.numChar_ = 255;
+ at.rep_.isPrimaryKey_ = true;
+ at.rep_.isAutoNumber_ = false;
+ attrList.push_back(at);
+
+ //get attribute list from querier
+ TeAttributeList attribs = querier.getAttrList();
+ TeAttributeList::iterator it = attribs.begin();
+ while(it != attribs.end())
+ {
+ attrList.push_back (*it);
+ ++it;
+ }
+
+ changeAttrList(attrList);
+ attrList[0].rep_.isPrimaryKey_ = true; //link attribute is primary key
+
+ TeTable attrTable (tableName, attrList, attrList[0].rep_.name_, attrList[0].rep_.name_);
+
+ if(!layerMod->createAttributeTable(attrTable))
+ return false;
+
+ //empty rows
+ TeTable updateAttrTable (tableName, attrList, attrList[0].rep_.name_, attrList[0].rep_.name_);
+
+ // ----------------- End create attribute table
+ vector<string> objIds;
+ if( (theme->layer()->hasGeometry(TePOLYGONS)) ||
+ (theme->layer()->hasGeometry(TeCELLS)) ||
+ ((themeMod->layer()->hasGeometry(TeLINES)) && (theme->layer()->hasGeometry(TeLINES))))
+ {
+ int numElem = querier.numElemInstances();
+
+ // set progress bar
+ if(TeProgress::instance())
+ {
+ string caption = "Spatial Join";
+ string msg = "Executing Spatial Join. Please, wait!";
+ TeProgress::instance()->setCaption(caption.c_str());
+ TeProgress::instance()->setMessage(msg);
+ TeProgress::instance()->setTotalSteps(numElem);
+ t2 = clock();
+ t0 = t1 = t2;
+ }
+
+ int steps = 0;
+ TeSTInstance sti;
+
+ double tol = TeGetPrecision(projMod);
+ TePrecision::instance().setPrecision(tol);
+
+ while(querier.fetchInstance(sti))
+ {
+ // Get attributes
+ TeTableRow row;
+ TeTableRow emptyRow;
+
+ row.push_back("");
+ emptyRow.push_back("");
+
+ TePropertyVector vec = sti.getPropertyVector();
+ for(int p=0; p<(int)vec.size();++p)
+ {
+ row.push_back(vec[p].value_);
+ emptyRow.push_back ("");
+ }
+
+ //Get geometry
+ TeMultiGeometry mGeom;
+ sti.getGeometry(mGeom);
+
+ vector<TeGeometry*> geoms;
+ mGeom.getGeometry(geoms);
+
+ for(int i=0; i<(int)geoms.size(); ++i)
+ {
+ if(!((*proj) == (*projMod)))
+ {
+ TeGeometry* gout;
+ if(geoms[i]->elemType() == TePOLYGONS)
+ {
+ gout = new TePolygon;
+ TeVectorRemap (*((TePolygon*)geoms[i]), proj, *((TePolygon*)gout), projMod);
+ }
+ else if (geoms[i]->elemType() == TeCELLS)
+ {
+ gout = new TeCell;
+ TeVectorRemap (*((TeCell*)geoms[i]), proj, *((TeCell*)gout), projMod);
+ }
+ else
+ {
+ gout = new TeLine2D;
+ TeVectorRemap (*((TeLine2D*)geoms[i]), proj, *((TeLine2D*)gout), projMod);
+ }
+ gout->objectId(geoms[i]->objectId());
+ delete geoms[i];
+ geoms[i] = gout;
+ }
+
+ //querier that will be modified
+ TeQuerierParams paramsMod(false, false);
+ paramsMod.setParams(themeMod);
+ paramsMod.setSpatialRest(geoms[i], spatialRelation, TeGEOMETRYNONE);
+ TeQuerier querierMod(paramsMod);
+
+ if(!querierMod.loadInstances())
+ continue;
+
+ TeSTInstance stMod;
+ while(querierMod.fetchInstance(stMod))
+ {
+ string obj = stMod.objectId();
+ if( find(objIds.begin(), objIds.end(), obj) == objIds.end())
+ {
+ objIds.push_back (obj);
+ row[0] = obj;
+ attrTable.add(row);
+ }
+ else
+ {
+ emptyRow[0] = obj;
+ updateAttrTable.add(emptyRow);
+ }
+ }
+
+ if(attrTable.size()>100)
+ {
+ layerMod->saveAttributeTable(attrTable); //save 100 records!!!
+ layerMod->database()->updateTable(updateAttrTable);
+ attrTable.clear();
+ updateAttrTable.clear();
+ }
+ } // for
+
+ for(int j=0; j<(int)geoms.size(); ++j)
+ delete (geoms[j]); //delete allocated geometries
+
+ steps++;
+ t2 = clock();
+ if ((TeProgress::instance()) && (int(t2-t1) > dt))
+ {
+ t1 = t2;
+ if(TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ if((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(steps);
+ }
+
+ } //while
+ } //if geometry type
+ else
+ {
+ return false; //use nearest neighbor
+ }
+
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ layerMod->saveAttributeTable(attrTable); //save the last records!!!
+ layerMod->database()->updateTable(updateAttrTable);
+
+ return true;
+}
+
+
+bool TeGeoOpOverlayUnion(TeLayer* newLayer, TeTheme* theme, TeTheme* themeOverlay,
+ TeSelectedObjects selOb, TeSelectedObjects selObOverlay, TeAsciiFile* logFile)
+{
+///////////////////////////////////////////////////////////////////
+return false;
+// verifivar se vai trabalhar com celulas
+// se vai, modificar a interface.....
+///////////////////////////////////////////////////////////////////
+ if((!newLayer) || (!theme) || (!themeOverlay))
+ return false;
+
+ bool insertAttr = false;
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+
+ TeLayer* layer = theme->layer();
+ TeLayer* layerOverlay = themeOverlay->layer();
+
+ TeProjection* proj = layer->projection();
+ TeProjection* projOverlay = layerOverlay->projection();
+
+ //Querier Overlay
+ TeQuerierParams paramsOverlay(true, true);
+ paramsOverlay.setParams(themeOverlay);
+ paramsOverlay.setSelecetObjs(selObOverlay);
+ TeQuerier querierOverlay(paramsOverlay);
+
+ if(!querierOverlay.loadInstances())
+ return false;
+
+ // ----------------- begin create attribute table
+
+ TeAttributeList attrList;
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "object_id_"+ Te2String(newLayer->id());
+ at.rep_.numChar_ = 255;
+ at.rep_.isPrimaryKey_ = true;
+ at.rep_.isAutoNumber_ = false;
+ attrList.push_back(at);
+
+ //theme
+ TeQuerierParams paramsTemp(false, true);
+ paramsTemp.setParams(theme);
+ TeQuerier* querierTemp = new TeQuerier(paramsTemp);
+
+ if(!querierTemp->loadInstances())
+ return false;
+
+ //get attribute list from querier
+ TeAttributeList attribs = querierTemp->getAttrList();
+ TeAttributeList::iterator it = attribs.begin();
+ while(it != attribs.end())
+ {
+ attrList.push_back (*it);
+ ++it;
+ }
+
+ delete querierTemp;
+
+ //overlay
+ attribs.clear();
+ attribs = querierOverlay.getAttrList();
+
+ //fill attributes from Overlay theme
+ it = attribs.begin();
+ while(it != attribs.end())
+ {
+ attrList.push_back (*it);
+ ++it;
+ }
+
+ changeAttrList(attrList);
+ attrList[0].rep_.isPrimaryKey_ = true; //link attribute is primary key
+
+ TeTable attrTable (newLayer->name(), attrList, attrList[0].rep_.name_, attrList[0].rep_.name_);
+
+ if(!newLayer->createAttributeTable(attrTable))
+ return false;
+
+ // ----------------- End create attribute table
+ int numPolygonsOverlay = querierOverlay.numElemInstances();
+ // set progress bar
+ if(TeProgress::instance())
+ {
+ string caption = "Overlay Union";
+ string msg = "Executing Overlay Union. Please, wait!";
+ TeProgress::instance()->setCaption(caption.c_str());
+ TeProgress::instance()->setMessage(msg);
+ TeProgress::instance()->setTotalSteps(numPolygonsOverlay);
+ t2 = clock();
+ t0 = t1 = t2;
+ }
+
+ double tol = TeGetPrecision(layer->projection());
+ TePrecision::instance().setPrecision(tol);
+
+ int steps = 0;
+ TeSTInstance Overlay;
+ int newId = 0;
+
+ while(querierOverlay.fetchInstance(Overlay))
+ {
+ TePolygonSet polSet;
+ if(!Overlay.getGeometry(polSet))
+ continue;
+
+ TeTableRow rowOverlay;
+ //fill attribute values from Overlay
+ TePropertyVector vecOverlay = Overlay.getPropertyVector();
+
+ for(int p=0; p<(int)vecOverlay.size();++p)
+ rowOverlay.push_back(vecOverlay[p].value_);
+
+ TePolygonSet ps;
+// TeCellSet cs;
+
+ for(int i=0; i<(int)polSet.size(); ++i)
+ {
+ TePolygon polyOverlay = polSet[i];
+
+ if(!((*proj) == (*projOverlay)))
+ {
+ TePolygon pout;
+ TeVectorRemap (polyOverlay, projOverlay, pout, proj);
+ pout.objectId(polyOverlay.objectId());
+ polyOverlay = pout;
+ }
+
+ TePolygonSet polyOverlaySet;
+ polyOverlaySet.add(polyOverlay);
+
+ TeBox boxOverlay = polyOverlay.box();
+
+ //Querier - theme that will be clip
+ TeQuerierParams params(true, true);
+ params.setParams(theme);
+ params.setSelecetObjs(selOb);
+ params.setSpatialRest(boxOverlay, TeINTERSECTS, TeGEOMETRYNONE);
+
+ TeQuerier querier(params);
+
+ if(!querier.loadInstances())
+ continue;
+
+ TeSTInstance sti;
+ while(querier.fetchInstance(sti))
+ {
+ TeTableRow row;
+ TePropertyVector vect = sti.getPropertyVector();
+ row.push_back("");
+
+ //insert values of the theme that is been clip
+ for(int p=0; p<(int)vect.size();++p)
+ row.push_back(vect[p].value_);
+
+ for(int i=0; i<(int)rowOverlay.size(); ++i)
+ row.push_back(rowOverlay[i]);
+
+ if(sti.hasPolygons())
+ {
+ TePolygonSet polSet;
+ sti.getGeometry (polSet);
+
+ for(int j=0; j<(int)polSet.size(); ++j)
+ {
+ TePolygonSet psAux, resultPS;
+ psAux.add(polSet[j]);
+ if(!TeOVERLAY::TeIntersection(polyOverlaySet, psAux, resultPS))
+ {
+ // when the operation returns false, write in the log a possible
+ // inconsistency in the data
+ if (logFile)
+ {
+ string mess = "Possivel inconsistencia na interseccao do objeto ";
+ mess += polyOverlay.objectId();
+ mess += " e ";
+ mess += polSet[j].objectId();
+ logFile->writeString(mess);
+ logFile->writeNewLine();
+ }
+ }
+
+ for(int c=0; c<(int)resultPS.size(); ++c)
+ {
+ newId++;
+ TePolygon paux = resultPS[c];
+ paux.objectId(Te2String(newId));
+ ps.add(paux);
+ row[0] = Te2String(newId);
+ attrTable.add(row);
+ }
+ }
+ }
+// else if (sti.hasCells())
+// {
+// TeCellSet cellSet;
+// sti.getGeometry (cellSet);
+//
+// for(int j=0; j<(int)cellSet.size(); ++j)
+// {
+// if(TeIntersects(cellSet[j], polyOverlay))
+// {
+// newId++;
+// cellSet[j].objectId(Te2String(newId));
+// cs.add(cellSet[j]);
+// row[0] = Te2String(newId);
+// attrTable.add(row);
+// }
+// }
+// }
+ } //while fetchInstance
+ }//for each polygon of the Overlay theme
+
+ //inserir a geometria no banco
+ if(layer->hasGeometry(TePOLYGONS) && ps.size())
+ newLayer->addPolygons(ps);
+// else if(cs.size())
+// newLayer->addCells(cs);
+
+ Overlay.clear();
+
+ steps++;
+ t2 = clock();
+ if ((TeProgress::instance()) && (int(t2-t1) > dt))
+ {
+ t1 = t2;
+ if(TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ if((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(steps);
+ }
+
+ if((steps%100)==0)
+ {
+ newLayer->saveAttributeTable(attrTable); //save 100 records!!!
+ if(attrTable.size()>0)
+ insertAttr = true;
+ attrTable.clear();
+ }
+ } //while fetch instance querier Overlay
+
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ newLayer->saveAttributeTable(attrTable); //save the last records!!!
+ if(attrTable.size()>0)
+ insertAttr = true;
+
+ if(!newLayer->box().isValid())
+ return false;
+
+ if(!insertAttr)
+ return false;
+
+ return true;
+}
+
+
+bool TeGeoOpAssignByLocationCollect(TeTheme* restrTheme, TeTheme* srcTheme,
+ const string& newTableName, TeGroupingAttr& measuresColl,
+ const int& spatialRelation)
+{
+ if(!restrTheme || !restrTheme->layer() || // no spatial restriction theme
+ !srcTheme || // no source theme
+ newTableName.empty() || // no output table name
+ measuresColl.empty()) // no set of measures to collect
+ return false;
+
+ // verifies that spatial restriction is given by polygons or cells
+ TeGeomRep restrRep = (TeGeomRep)(restrTheme->layer()->geomRep() & ~TeTEXT);
+ if (restrRep != TePOLYGONS && restrRep != TeCELLS)
+ return false;
+
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+
+ TeProjection* restrProj = restrTheme->layer()->projection();
+ TeProjection* srcProj = srcTheme->layer()->projection();
+
+ bool doRemap = !(*restrProj == *srcProj);
+
+ // try to retrieve the geometries of the spatial restriction theme
+ TeQuerierParams params(true, false);
+ params.setParams(restrTheme);
+ TeQuerier spatialRestrictions(params);
+
+ if(!spatialRestrictions.loadInstances())
+ return false;
+
+ // there is at least one restriction geometry, so create the output table
+ // defines its attribute list
+ TeAttributeList attrList;
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.name_ = "object_id_";
+ at.rep_.numChar_ = 255;
+ attrList.push_back(at);
+ vector<int> countAttr;
+
+ int attrNum = 1;
+ TeGroupingAttr::iterator it = measuresColl.begin(); // for each different measure
+ while (it != measuresColl.end()) // create a new attribute
+ {
+ at.rep_ = it->first;
+ at.rep_.isPrimaryKey_ = false;
+ string nameTemp = it->first.name_ + "_" + getStringFromStatistic(it->second);
+ if(((restrTheme->layer()->database()->dbmsName()=="OracleAdo") ||
+ (restrTheme->layer()->database()->dbmsName()=="OracleSpatial") ) &&
+ (nameTemp.size() > 30))
+ {
+ int s = nameTemp.size();
+ at.rep_.name_ = nameTemp.substr(s-30, s-1);
+ }
+ else
+ at.rep_.name_ = nameTemp;
+
+ if (it->second == TeCOUNT || it->second == TeVALIDCOUNT)
+ {
+ at.rep_.type_ = TeINT;
+ countAttr.push_back (attrNum);
+ }
+ else if (at.rep_.type_ == TeINT)
+ at.rep_.type_ = TeREAL;
+ attrList.push_back(at);
+ ++it;
+ ++attrNum;
+ }
+ changeAttrList(attrList); // validates attribute list
+ attrList[0].rep_.isPrimaryKey_ = true;
+ attrList[0].rep_.isAutoNumber_ = false;
+
+ TeTable measuresTable (newTableName, attrList, attrList[0].rep_.name_, attrList[0].rep_.name_);
+ if(!restrTheme->layer()->createAttributeTable(measuresTable)) // creates the new attribute table
+ return false;
+
+ //use function to point and cell
+ TeGeomRep srcRep = (TeGeomRep)(srcTheme->layer()->geomRep() & ~TeTEXT);
+ TeDatabase* db = restrTheme->layer()->database();
+ int spatialRes = TeOVERLAPS | TeWITHIN | TeCOVEREDBY | TeCROSSES;
+ bool sqlGroup = false;
+
+ if( (*restrProj==*srcProj) &&
+ (((restrRep==TeCELLS) && (srcRep==TePOINTS)) ||
+ ((restrRep==TeCELLS) && (srcRep==TeCELLS) && ((spatialRelation==TeINTERSECTS) || (spatialRelation==spatialRes)))))
+ {
+ if(TeCellStatistics(restrTheme, measuresTable, measuresColl, srcTheme, restrTheme->layer()->database()))
+ sqlGroup = db->insertTableInfo(restrTheme->layer()->id(),measuresTable);
+ }
+
+ if(sqlGroup)
+ return true;
+
+ if(TeProgress::instance()) // sets the progress bar
+ {
+ string caption = "Assign Data By Location";
+ string msg = "Executing collecting. Please, wait!";
+ TeProgress::instance()->setCaption(caption.c_str());
+ TeProgress::instance()->setMessage(msg);
+ TeProgress::instance()->setTotalSteps(spatialRestrictions.numElemInstances());
+ t2 = clock();
+ t0 = t1 = t2;
+ }
+
+ double tol = TeGetPrecision(srcProj);
+ TePrecision::instance().setPrecision(tol);
+
+ unsigned int nregions = 0;
+ TePolygonSet restrPols;
+ TeCellSet restrCells;
+ TeSTInstance restrInstance;
+
+ while(spatialRestrictions.fetchInstance(restrInstance)) // collect data for each geometry
+ { // of the spatial restriction set
+ // defines a querier to select measures from objects that
+ // are delimited by the a geometry and a spatial restriction
+ TeQuerierParams par2(false,measuresColl);
+ par2.setParams(srcTheme);
+ restrCells.clear();
+ restrPols.clear();
+ TeMultiGeometry mGeom;
+ restrInstance.getGeometry(mGeom);
+ // get the geometry of the instance
+ if (restrRep == TeCELLS) // restriction is given by a cell set geometry
+ {
+ mGeom.getGeometry(restrCells);
+ if (doRemap) // bring it to the source projection
+ { // if necessary
+ TeCellSet restrCellsAux;
+ TeVectorRemap(restrCells,restrProj,restrCellsAux,srcProj);
+ restrCells.clear();
+ restrCells = restrCellsAux;
+ }
+ par2.setSpatialRest(&restrCells,spatialRelation,TeGEOMETRYNONE);
+ }
+ else // restriction is given by a cell set geometry
+ {
+ mGeom.getGeometry(restrPols);
+ if (doRemap) // bring it to the source projection
+ { // if necessary
+ TePolygonSet restrPolsAux;
+ TeVectorRemap(restrPols,restrProj,restrPolsAux,srcProj);
+ restrPols.clear();
+ restrPols = restrPolsAux;
+ }
+ par2.setSpatialRest(&restrPols,spatialRelation,TeGEOMETRYNONE);
+ }
+ // creates a querier to retrieve the desired measures of the objects inside the
+ // spatial restriction
+ TeQuerier sourceMeasures(par2);
+
+ // process each source within the spatial restriction geometry
+ TeTableRow row;
+ int nrows = 0;
+ row.push_back(restrInstance.objectId()); // identify the instance
+
+ if (sourceMeasures.loadInstances())
+ {
+ TeSTInstance sourceInstance;
+ unsigned int p; // get the calculated attributes
+ sourceMeasures.fetchInstance(sourceInstance);
+ TePropertyVector vec = sourceInstance.getPropertyVector();
+ for(p=0; p<vec.size();++p)
+ row.push_back(vec[p].value_);
+ }
+ else
+ {
+ //insert null or zero attribute value
+ for(int p=1; p<(int)attrList.size();++p)
+ {
+ if(find(countAttr.begin(), countAttr.end(), p) != countAttr.end())
+ row.push_back(Te2String(0));
+ else
+ row.push_back("");
+ }
+ }
+
+ measuresTable.add(row);
+ row.clear();
+ nrows++;
+
+ if(measuresTable.size()>100) // saves chunks of 100 records
+ {
+ restrTheme->layer()->saveAttributeTable(measuresTable);
+ measuresTable.clear();
+ }
+
+ ++nregions;
+ t2 = clock();
+ if ( int(t2-t1) > dt && TeProgress::instance())
+ {
+ t1 = t2;
+ if(TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ if((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(nregions);
+ }
+ }
+ if (measuresTable.size() > 0) // saves remaining records
+ {
+ restrTheme->layer()->saveAttributeTable(measuresTable);
+ measuresTable.clear();
+ }
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ return true;
+}
+
+
+bool TeGeoOpOverlayDifference(TeLayer* newLayer, TeTheme* theme1,
+ TeTheme* theme2, TeSelectedObjects selOb1,
+ TeSelectedObjects selOb2, TeAsciiFile* logFile)
+{
+ if((!newLayer) || (!theme1) || (!theme2))
+ return false;
+
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+
+ TeLayer* layer1 = theme1->layer();
+ TeLayer* layer2 = theme2->layer();
+
+ unsigned int t;
+ vector<string> linkNames;
+ TeAttrTableVector vetTables;
+ if (layer1->getAttrTables(vetTables,TeAttrStatic))
+ {
+ for (t=0; t<vetTables.size(); ++t)
+ linkNames.push_back(vetTables[t].linkName());
+ }
+ vetTables.clear();
+ if (layer1->getAttrTables(vetTables,TeAttrEvent))
+ {
+ for (t=0; t<vetTables.size(); ++t)
+ linkNames.push_back(vetTables[t].linkName());
+ }
+
+ TeProjection* proj1 = layer1->projection();
+ TeProjection* proj2 = layer2->projection();
+
+ // querier to get the objects from theme 1
+ TeQuerierParams params1(true, true);
+ params1.setParams(theme1);
+ params1.setSelecetObjs(selOb1);
+ TeQuerier querier1(params1);
+
+ if(!querier1.loadInstances())
+ return false; // there aren't objects on theme 1
+
+ // create the new attribute table with the attributes from theme 1
+ // preserving the same link attribute
+ TeAttributeList attrList;
+ int npk=-1, aux1=0;
+ TeAttributeList theme1AttrList = querier1.getAttrList();
+ TeAttributeList::iterator it = theme1AttrList.begin();
+ while (it != theme1AttrList.end())
+ {
+ attrList.push_back(*it);
+ vector<string>::iterator it2 = find(linkNames.begin(), linkNames.end(), (*it).rep_.name_);
+ if (it2 != linkNames.end())
+ npk = aux1;
+ ++it;
+ ++aux1;
+ }
+
+ // change attribute names if necessary and create a new attribute table
+ changeAttrList(attrList);
+ attrList[0].rep_.isPrimaryKey_ = true;
+ TeTable attrTable (newLayer->name(), attrList, attrList[npk].rep_.name_, attrList[npk].rep_.name_);
+ if(!newLayer->createAttributeTable(attrTable))
+ return false;
+
+ // -----
+
+ int numPolygons1 = querier1.numElemInstances();
+ if(TeProgress::instance())
+ {
+ string caption = "Overlay Difference";
+ string msg = "Executing Overlay Difference. Please, wait!";
+ TeProgress::instance()->setCaption(caption.c_str());
+ TeProgress::instance()->setMessage(msg);
+ TeProgress::instance()->setTotalSteps(numPolygons1);
+ t2 = clock();
+ t0 = t1 = t2;
+ }
+
+ double tol = TeGetPrecision(proj1);
+ TePrecision::instance().setPrecision(tol);
+
+ int steps = 0;
+ TeSTInstance elem1;
+ while(querier1.fetchInstance(elem1)) // for each object of theme 1
+ {
+ TePolygonSet polSet1;
+ if(!elem1.getGeometry(polSet1))
+ continue;
+
+ TePolygonSet resultAux;
+
+ // querier to the theme 2
+ TeQuerierParams params2(true,false);
+ params2.setParams(theme2);
+ params2.setSelecetObjs(selOb2);
+ params2.setSpatialRest(polSet1.box(), TeINTERSECTS, TeGEOMETRYNONE);
+
+ TeQuerier querier2(params2);
+ if(!querier2.loadInstances())
+ {
+ // there is no intersection between this object and the objects from theme 2
+ // so include the entire geometry of the object in the result
+ for (unsigned int i=0; i<polSet1.size(); ++i)
+ resultAux.add(polSet1[i]);
+ }
+ else
+ {
+ unsigned int m;
+ TePolygonSet polSet2;
+ TeSTInstance sti2;
+ vector<string> oids;
+ // build a polygon set with the representation of all objetcs from theme 2
+ // that intercepts current object of theme 1
+ while(querier2.fetchInstance(sti2))
+ {
+ if(sti2.hasPolygons())
+ {
+ TePolygonSet polSetAux2;
+ sti2.getGeometry (polSetAux2);
+ if (!((*proj1) == (*proj2)))
+ {
+ TePolygonSet polySet2Out;
+ TeVectorRemap (polSetAux2, proj2, polySet2Out, proj1);
+ for (m=0; m<polySet2Out.size(); m++)
+ polSet2.add(polySet2Out[m]);
+ }
+ else
+ {
+ for (m=0; m<polSetAux2.size(); m++)
+ polSet2.add(polSetAux2[m]);
+ }
+ // keep track of the object ids for logging
+ oids.push_back(sti2.objectId());
+ }
+ }// for each intersection object of theme 2
+
+ // try to recover the difference between the geometry of the current object
+ // from theme 1 and the geometries of the objects from theme 2 that intercept
+ // current object from theme 1
+ if(!TeOVERLAY::TeDifference(polSet1, polSet2, resultAux))
+ {
+ // when the operation returns false, writes in the error log file a possible
+ // inconsistency in the data
+ if (logFile)
+ {
+ string mess = "Possivel inconsistencia na diferenca do objeto ";
+ mess += polSet1.objectId();
+ mess += " do tema " + theme1->name() + " e ";
+ if (!oids.empty())
+ mess += oids[0];
+ for (m=1;m<oids.size();++m)
+ mess += ", " + oids[m];
+ mess += " do tema " + theme2->name();
+ logFile->writeString(mess);
+ logFile->writeNewLine();
+ }
+ }
+ }
+ // save partial results
+ if (!resultAux.empty())
+ {
+ TeTableRow row;
+ TePropertyVector vecOverlay = elem1.getPropertyVector();
+
+ for (unsigned int p=0; p<vecOverlay.size();++p)
+ row.push_back(vecOverlay[p].value_);
+ attrTable.add(row);
+ row.clear();
+ for (unsigned int l=0; l <resultAux.size(); l++)
+ resultAux[l].objectId(vecOverlay[npk].value_);
+ newLayer->addPolygons(resultAux);
+ }
+ steps++;
+ t2 = clock();
+ if ((TeProgress::instance()) && (int(t2-t1) > dt))
+ {
+ t1 = t2;
+ if(TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ if((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(steps);
+ }
+ if((steps%100)==0)
+ {
+ newLayer->saveAttributeTable(attrTable);
+ attrTable.clear();
+ }
+ } // for each object of theme 1
+
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ if(attrTable.size()>0)
+ newLayer->saveAttributeTable(attrTable);
+
+ if(!newLayer->box().isValid())
+ return false;
+ return true;
+}
diff --git a/src/terralib/functions/TeGeoProcessingFunctions.h b/src/terralib/functions/TeGeoProcessingFunctions.h
new file mode 100644
index 0000000..748e896
--- /dev/null
+++ b/src/terralib/functions/TeGeoProcessingFunctions.h
@@ -0,0 +1,51 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeGeoProcessingFunctions.h
+ This file contains functions to generate new layers from
+ spatial operations among themes
+*/
+
+#ifndef __TERRALIB_INTERNAL_GEOPROCESSING_H
+#define __TERRALIB_INTERNAL_GEOPROCESSING_H
+
+#include "TeDatabase.h"
+
+class TeAsciiFile;
+
+bool TeGeoOpAggregation(TeLayer* newLayer, TeTheme* theme, vector<string> agregAttrVec, TeGroupingAttr& attrMM, TeSelectedObjects selOb, TeAsciiFile* logFile=0);
+
+bool TeGeoOpAdd(TeLayer* newLayer, TeTheme* theme, TeThemeVector themeVec, TeSelectedObjects selObj = TeAll, TeAsciiFile* logFile=0);
+
+bool TeGeoOpOverlayIntersection(TeLayer* newLayer, TeTheme* theme, TeTheme* themeTrim, TeSelectedObjects selOb, TeSelectedObjects selObTrim, bool attrTrim, TeAsciiFile* logFile=0);
+
+bool TeGeoOpOverlayUnion(TeLayer* newLayer, TeTheme* theme, TeTheme* themeOverlay, TeSelectedObjects selOb, TeSelectedObjects selObOverlay, TeAsciiFile* logFile=0);
+
+bool TeGeoOpAssignDataLocationDistribute(TeTheme* themeMod, TeTheme* theme, const string& tableName, const int& spatialRelation);
+
+bool TeGeoOpAssignByLocationCollect(TeTheme* restrTheme, TeTheme* srcTheme, const string& newTableName, TeGroupingAttr& measuresColl, const int& spatialRelation);
+
+bool TeGeoOpOverlayDifference(TeLayer* newLayer, TeTheme* theme1, TeTheme* theme2, TeSelectedObjects selOb1, TeSelectedObjects selOb2, TeAsciiFile* logFile=0);
+
+#endif
+
diff --git a/src/terralib/functions/TeImportBNA.cpp b/src/terralib/functions/TeImportBNA.cpp
new file mode 100644
index 0000000..af5656c
--- /dev/null
+++ b/src/terralib/functions/TeImportBNA.cpp
@@ -0,0 +1,496 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <string>
+#include <iostream>
+#include <list>
+
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+using namespace std;
+
+#include "TeImportExport.h"
+#include "TeTable.h"
+#include "TeGeometry.h"
+#include "TeAsciiFile.h"
+#include "TeException.h"
+#include "TeProjection.h"
+#include "TeAttribute.h"
+#include "TeTable.h"
+#include "TeAssertions.h"
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeDatabase.h"
+
+bool TeReadBNAObjects(TeAsciiFile& bnaFile, TeTable& attTable, TePointSet& ptSet,
+ TeLineSet& lnSet, TePolygonSet& pSet,
+ int ncolumns, int nrecords, int delta, int attLinkColumnIndex);
+
+bool TeBNARegionDecode(TeAsciiFile& bnaFile, TePolygonSet& temp, string& index, const int& npoints);
+
+bool TeBNALineDecode(TeAsciiFile& bnaFile, TeLineSet& temp, string& index, const int& npoints);
+
+bool TeBNAPointDecode(TeAsciiFile& bnaFile, TePointSet& temp, string& index);
+
+
+
+TeLayer* TeImportBNA(const string& bnaFileName, TeDatabase* db, const string& layerName)
+{
+ if(!db || bnaFileName.empty())
+ return 0;
+
+ // check if format is complete (BNA file exist)
+ string filePrefix = TeGetName(bnaFileName.c_str());
+ string ftest = filePrefix + ".bna";
+ if(access(ftest.c_str(),04) == -1)
+ {
+ ftest = filePrefix + ".BNA";
+ if (access(ftest.c_str(),04) == -1)
+ return 0;
+ }
+
+ // found a valid layer name
+ string lName = layerName;
+
+ if(layerName.empty())
+ lName = TeGetBaseName(bnaFileName.c_str());
+
+ string newLayerName = lName;
+
+ TeLayerMap& layerMap = db->layerMap();
+ TeLayerMap::iterator it;
+
+ bool flag = true;
+
+ int n = 1;
+
+ while(flag)
+ {
+ for(it = layerMap.begin(); it != layerMap.end(); ++it)
+ {
+ if(TeStringCompare(it->second->name(), newLayerName))
+ break;
+ }
+
+ if(it == layerMap.end())
+ flag = 0;
+ else
+ newLayerName = lName + "_" + Te2String(n);
+
+ n++;
+ }
+
+ // Use no projection
+ TeLayer* newLayer = new TeLayer(newLayerName, db);
+
+ if(newLayer->id() <= 0)
+ return 0; // couldn�t create new layer
+
+ TeAttributeList attList;
+
+ bool res = TeImportBNA(newLayer, bnaFileName, "", attList, 60);
+
+ if (res)
+ return newLayer;
+ else
+ {
+ db->deleteLayer(newLayer->id());
+
+ delete newLayer;
+
+ return 0;
+ }
+}
+
+bool TeImportBNA(TeLayer* layer, const string& bnaFileName, string attrTableName,
+ TeAttributeList& attList, int unsigned chunkSize, const string& linkCol)
+{
+ if(chunkSize <= 0)
+ chunkSize = 1;
+
+ //-- Step 1: Read any adicional information (ex. projection)
+ char separator = ',';
+
+
+ if(!TeReadBNAAttributeList(bnaFileName, attList))
+ return false; // Attributelist read error
+
+
+ string linkColName = linkCol;
+
+ if(linkColName.empty())
+ linkColName = attList[0].rep_.name_;
+
+ int attLinkColumnIndex = 0;
+
+ for(unsigned int i = 0; i < attList.size(); ++i)
+ {
+ if(attList[i].rep_.name_ == linkColName)
+ {
+ attLinkColumnIndex = (int)i;
+ break;
+ }
+ }
+
+
+ // define a TeAttributeTable
+ if (attrTableName.empty())
+ {
+ if (layer->name().empty())
+ return false;
+ else
+ attrTableName = layer->name();
+ }
+
+ TeTable attTable(attrTableName, attList, linkColName, linkColName, TeAttrStatic);
+
+ attTable.setSeparator(separator);
+
+ // insert the table into the database
+ if(!layer->createAttributeTable(attTable))
+ return false;
+
+ int ncol = attList.size();
+
+ TeAsciiFile bnaFile(bnaFileName);
+
+ int delta = 0;
+
+ TePointSet ptSet;
+ TeLineSet lnSet;
+ TePolygonSet pSet;
+
+ while(TeReadBNAObjects(bnaFile, attTable, ptSet, lnSet, pSet, ncol, chunkSize, delta, attLinkColumnIndex))
+ {
+ // save table
+ if (!layer->saveAttributeTable( attTable ))
+ {
+ attTable.clear();
+ break;
+ }
+
+ // save the remaining geometries
+ if(ptSet.size() > 0)
+ {
+ layer->addPoints(ptSet);
+ ptSet.clear();
+ }
+
+ if(lnSet.size() > 0)
+ {
+ layer->addLines(lnSet);
+ lnSet.clear();
+ }
+
+ if(pSet.size() > 0)
+ {
+ layer->addPolygons(pSet);
+ pSet.clear();
+ }
+
+ delta += attTable.size();
+
+ attTable.clear();
+ }
+ return true;
+}
+
+
+bool TeReadBNAAttributeList(const string& bnaFileName, TeAttributeList& attList)
+{
+ TeAsciiFile bnaFile(bnaFileName);
+
+ if(!bnaFile.isNotAtEOF())
+ return false;
+
+ vector<string> strList;
+
+ bnaFile.readStringListCSV(strList, ',');
+
+ unsigned int nFields = (strList.size() - 1u);
+
+ if(nFields <= 0)
+ return false;
+
+ if(attList.size() > 0u) // Has already defined attributes, only check the number
+ {
+ if(attList.size() != nFields)
+ return false;
+ else
+ return true;
+ }
+
+ // In future, look for a better way to find the field name
+ // see in the specification of file format there is something about the field names!
+
+ TeAttribute at1;
+ at1.rep_.type_ = TeSTRING;
+ at1.rep_.numChar_ = 255;
+ at1.rep_.name_ = "IBGE_CODE";
+ at1.rep_.isPrimaryKey_ = false;
+ attList.push_back(at1);
+
+ if(nFields > 1)
+ {
+ TeAttribute at2;
+ at2.rep_.type_ = TeSTRING;
+ at2.rep_.numChar_ = 255;
+ at2.rep_.name_ = "IBGE_NAME";
+ at2.rep_.isPrimaryKey_ = false;
+ attList.push_back(at2);
+ }
+
+ for(unsigned int i = 2; i < nFields; ++i)
+ {
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.numChar_ = 255;
+ at.rep_.name_ = string("FIELD_") + Te2String(i);
+ at.rep_.isPrimaryKey_ = false;
+ attList.push_back(at);
+ }
+
+ return true;
+}
+
+
+bool TeReadBNAObjects(TeAsciiFile& bnaFile, TeTable& attTable, TePointSet& ptSet,
+ TeLineSet& lnSet, TePolygonSet& pSet,
+ int ncolumns, int nrecords, int /* delta */, int attLinkColumnIndex)
+{
+ if (!bnaFile.isNotAtEOF() || nrecords <=0 || ncolumns <= 0)
+ return false;
+
+ char separator = attTable.separator();
+
+ int count;
+
+ for(count=0; count < nrecords; ++count)
+ {
+ if(!bnaFile.isNotAtEOF())
+ break;
+
+ // Ler os atributos do objeto e o tipo/tamanho da geometria
+
+ TeTableRow row;
+
+
+ for(int n = 0; n < ncolumns; ++n)
+ {
+ string value;
+
+ try
+ {
+ value = bnaFile.readStringCSVNoQuote(separator);
+ }
+ catch(...)
+ {
+ if(count > 0)
+ return true;
+ else
+ return false;
+ }
+
+ row.push_back (value);
+ }
+
+ attTable.add(row);
+
+ string bnaGeometryTypeLen = bnaFile.readStringCSVNoQuote(separator);
+
+ int bnaGTypeLen = atoi(bnaGeometryTypeLen.c_str());
+
+ string index = row[attLinkColumnIndex];
+
+ // Go to the geometry line begin
+ bnaFile.findNewLine();
+
+ if(bnaGTypeLen > 2)
+ {
+ if(!TeBNARegionDecode(bnaFile, pSet, index, bnaGTypeLen))
+ return false;
+ }
+ else if(bnaGTypeLen < -1)
+ {
+ if(!TeBNALineDecode(bnaFile, lnSet, index, -bnaGTypeLen))
+ return false;
+ }
+ else if(bnaGTypeLen == 1)
+ {
+ if(!TeBNAPointDecode(bnaFile, ptSet, index))
+ return false;
+ }
+ else
+ return false;
+
+ bnaFile.findNewLine();
+ }
+
+ return true;
+}
+
+bool TeBNARegionDecode(TeAsciiFile& bnaFile, TePolygonSet& temp, string& index, const int& npoints)
+{
+ int i;
+ unsigned int j;
+
+ vector<TePolygon> pVec;
+ TeLine2D l;
+
+ TeCoord2D coordMainArea;
+ TeCoord2D firstCoord;
+ bool first = false;
+
+ for(i = 0; i < npoints; ++i)
+ {
+ if(!bnaFile.isNotAtEOF())
+ return false;
+
+ double x = bnaFile.readFloat();
+ bnaFile.readChar();
+ double y = bnaFile.readFloat();
+
+ //bnaFile.findNewLine();
+
+ TeCoord2D c(x, y);
+
+ if(i == 0)
+ {
+ coordMainArea.setXY(x, y);
+ firstCoord = coordMainArea;
+ first = false;
+ l.add(c);
+ }
+ else
+ {
+ if(c == firstCoord)
+ {
+ l.add(c);
+ l.objectId(index);
+ TeLinearRing r(l);
+ r.objectId(index);
+ TePolygon p;
+ p.add(r);
+ p.objectId(index);
+
+ if(pVec.size() == 0)
+ pVec.push_back(p);
+ else
+ {
+ for(j = 0; j < pVec.size(); ++j)
+ {
+ if(TeWithin(p, pVec[j]))
+ {
+ pVec[j].add(p[0]);
+ break;
+ }
+
+ }
+
+ if(j == pVec.size())
+ pVec.push_back(p);
+ }
+
+ // Make new line - Don't clear!
+ l = TeLine2D();
+
+ first = true;
+
+ }
+ else if(c == coordMainArea)
+ {
+ continue;
+ }
+ else
+ {
+ if(first)
+ {
+ firstCoord = c;
+ first = false;
+ }
+
+ l.add(c);
+ }
+ }
+ }
+
+ for(unsigned int k = 0; k < pVec.size(); ++k)
+ temp.add(pVec[k]);
+
+
+ return true;
+}
+
+bool TeBNALineDecode(TeAsciiFile& bnaFile, TeLineSet& temp, string& index, const int& npoints)
+{
+ TeLine2D l;
+
+ l.objectId(index);
+
+ for(int i = 0; i < npoints; ++i)
+ {
+ if(!bnaFile.isNotAtEOF())
+ return false;
+
+ double x = bnaFile.readFloat();
+ bnaFile.readChar();
+ double y = bnaFile.readFloat();
+
+ //bnaFile.findNewLine();
+
+ TeCoord2D c(x, y);
+
+ l.add(c);
+ }
+
+ temp.add(l);
+
+ return true;
+}
+
+bool TeBNAPointDecode(TeAsciiFile& bnaFile, TePointSet& temp, string& index)
+{
+ if(!bnaFile.isNotAtEOF())
+ return false;
+
+ double x = bnaFile.readFloat();
+ bnaFile.readChar();
+ double y = bnaFile.readFloat();
+
+ //bnaFile.findNewLine();
+
+ TeCoord2D c(x, y);
+
+ TePoint pt(c);
+
+ pt.objectId(index);
+
+ temp.add(pt);
+
+ return true;
+}
diff --git a/src/terralib/functions/TeImportDBF.cpp b/src/terralib/functions/TeImportDBF.cpp
new file mode 100644
index 0000000..6183545
--- /dev/null
+++ b/src/terralib/functions/TeImportDBF.cpp
@@ -0,0 +1,442 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <string>
+#include <iostream>
+
+#include "shapefil.h"
+#include "TeImportExport.h"
+#include "TeTable.h"
+#include "TeException.h"
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeProgress.h"
+#include "TeDatabase.h"
+
+//! Fills a vector with the values of choosen column named , to be used as object identifications
+/*!
+ \param dbfFileName DBF file name
+ \param indexes a vector that has the identification of the objects
+ \param objectIdAttr name of the attribute that has the identification of objects
+ \note if no objectIdAttr is provided or there is no column with this name return
+ an incremental sequence of numbers.
+*/
+void TeReadDBFIndexes(const string& dbfFileName, vector<string>& indexes, const string objectIdAttr="");
+
+
+bool TeReadDBFAttributeList ( const string& dbfFileName, TeAttributeList& attList )
+{
+ string filePrefix = TeGetName (dbfFileName.c_str()) ;
+ string fileName = filePrefix + ".dbf";
+
+/* -------------------------------------------------------------------- */
+/* Open the file. */
+/* -------------------------------------------------------------------- */
+ DBFHandle hDBF = DBFOpen( fileName.c_str(), "rb" );
+ if( hDBF == NULL )
+ {
+ throw TeException ( UNABLE_TO_OPEN_DBF_FILE );
+ }
+
+/* -------------------------------------------------------------------- */
+/* If there is no data in this file let the user know. */
+/* -------------------------------------------------------------------- */
+ if( DBFGetFieldCount(hDBF) == 0 )
+ {
+ throw TeException ( NO_DATA_IN_DBF_FILE );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Get Attributes header definitions. */
+/* -------------------------------------------------------------------- */
+ TeAttribute attribute;
+
+ char szTitle[12];
+ int nWidth, nDecimals;
+ int i;
+
+ vector<string> names;
+
+ for( i = 0; i < DBFGetFieldCount(hDBF); i++ )
+ {
+ DBFFieldType eType = DBFGetFieldInfo( hDBF, i, szTitle, &nWidth, &nDecimals );
+
+ string atname = TeConvertToUpperCase(szTitle);
+
+ vector<string>::iterator it = find(names.begin(),names.end(),atname);
+ if (it != names.end())
+ {
+ string newname = atname + "_" + Te2String(i);
+ int c = i+1;
+ while (true)
+ {
+ it = find(names.begin(),names.end(),newname);
+ if (it == names.end())
+ break;
+ newname = atname + "_" + Te2String(c);
+ ++c;
+ }
+ atname = newname;
+ }
+ names.push_back(atname);
+ attribute.rep_.name_ = atname;
+
+ if( eType == FTDate )
+ {
+ attribute.rep_.type_ = TeDATETIME;
+ attribute.dateChronon_ = TeDAY;
+ attribute.dateTimeFormat_ = "YYYYMMDD";
+ attribute.dateSeparator_ = 'c';
+ }
+ else if( eType == FTString )
+ {
+ attribute.rep_.type_ = TeSTRING;
+ attribute.rep_.numChar_ = nWidth;
+ }
+ else if( eType == FTInteger )
+ {
+ if (nWidth > 9)
+ {
+ attribute.rep_.type_ = TeREAL;
+ attribute.rep_.numChar_ = nWidth;
+ attribute.rep_.decimals_ = 0;
+ }
+ else
+ {
+ attribute.rep_.type_ = TeINT;
+ attribute.rep_.numChar_ = nWidth;
+ }
+ }
+ else if( eType == FTDouble )
+ {
+ attribute.rep_.type_ = TeREAL;
+ attribute.rep_.numChar_ = nWidth;
+ attribute.rep_.decimals_ = nDecimals;
+ }
+
+ // keep track of the index name
+
+ attList.push_back ( attribute );
+ }
+ names.clear();
+ DBFClose( hDBF );
+ return true;
+}
+
+
+bool TeImportDBFTable(const string& dbFileName,TeDatabase* db, TeLayer* layer,TeAttrTableType tableType, string objectIdAtt)
+{
+ if (!db || dbFileName.empty())
+ return false;
+
+ DBFHandle hDBF = DBFOpen(dbFileName.c_str(), "rb" );
+ if( hDBF == NULL )
+ return false;
+
+ string tabName = TeGetBaseName(dbFileName.c_str());
+ int n=0;
+ while (db->tableExist(tabName))
+ {
+ tabName = TeGetBaseName(dbFileName.c_str()) + "_" + Te2String(n);
+ n++;
+ }
+ TeAttributeList attList;
+ TeReadDBFAttributeList (dbFileName, attList);
+
+ if (objectIdAtt.empty())
+ objectIdAtt = "object_id_";
+
+ // check if object id column is already in the list
+ unsigned int j;
+ for (j=0; j<attList.size(); j++)
+ {
+ if ( TeConvertToUpperCase(objectIdAtt) == TeConvertToUpperCase(attList[j].rep_.name_))
+ {
+ objectIdAtt = TeConvertToUpperCase(attList[j].rep_.name_);
+ attList[j].rep_.name_ = objectIdAtt;
+ if (attList[j].rep_.type_ != TeSTRING)
+ {
+ attList[j].rep_.type_ = TeSTRING;
+ attList[j].rep_.numChar_ = 255;
+ }
+ attList[j].rep_.isPrimaryKey_ = true;
+ break;
+ }
+ }
+
+ // if not found create one automatically
+ bool createObjId = false;
+ if (j==attList.size())
+ {
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.numChar_ = 16;
+ at.rep_.name_ = objectIdAtt;
+ at.rep_.isPrimaryKey_ = true;
+ attList.push_back(at);
+ createObjId = true;
+ }
+
+ if (!db->createTable(tabName,attList))
+ {
+ DBFClose(hDBF);
+ return false;
+ }
+
+ TeTable table(tabName);
+ table.setAttributeList(attList);
+ table.setUniqueName(objectIdAtt);
+ if (layer)
+ table.setTableType(tableType);
+ else
+ table.setTableType(TeAttrExternal);
+
+ int nrec = DBFGetRecordCount(hDBF);
+ if (TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(nrec);
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+ t2 = clock();
+ t0 = t1 = t2;
+ int iRecord;
+ for (iRecord = 0; iRecord < nrec; iRecord++)
+ {
+ TeTableRow row;
+ int i;
+ for( i = 0; i < DBFGetFieldCount(hDBF); i++ )
+ {
+ string value = DBFReadStringAttribute(hDBF, iRecord, i);
+ row.push_back ( value ); // inserts a value into the row
+ }
+ if (createObjId)
+ row.push_back(Te2String(iRecord));
+ table.add(row);
+ if ((iRecord+1 % 100) == 0)
+ {
+ if (!db->insertTable(table))
+ {
+ DBFClose( hDBF );
+ table.clear();
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ return false;
+ }
+ table.clear();
+ if (TeProgress::instance())
+ {
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ if ((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(iRecord);
+ }
+ }
+ }
+ }
+ if (table.size() > 0)
+ {
+ db->insertTable(table);
+ table.clear();
+ }
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ DBFClose( hDBF );
+ if (iRecord == 0)
+ return false;
+ if (layer)
+ db->insertTableInfo(layer->id(),table);
+ else
+ db->insertTableInfo(0,table);
+
+ return true;
+}
+
+void TeReadSHPAttributes (const string& dbfFileName, TeTable& table)
+{
+ string filePrefix = TeGetName (dbfFileName.c_str()) ;
+ string fileName = filePrefix + ".dbf";
+
+/* -------------------------------------------------------------------- */
+/* Get Attributes definitions. */
+/* -------------------------------------------------------------------- */
+ TeAttributeList attList;
+ TeReadDBFAttributeList ( fileName, attList );
+ table.setAttributeList( attList );
+
+/* -------------------------------------------------------------------- */
+/* Open the file. */
+/* -------------------------------------------------------------------- */
+ DBFHandle hDBF = DBFOpen( fileName.c_str(), "rb" );
+ if( hDBF == NULL )
+ {
+ throw TeException ( UNABLE_TO_OPEN_DBF_FILE, fileName, true );
+ }
+
+/* -------------------------------------------------------------------- */
+/* If there is no data in this file let the user know. */
+/* -------------------------------------------------------------------- */
+ if( DBFGetFieldCount(hDBF) == 0 )
+ {
+ throw TeException ( NO_DATA_IN_DBF_FILE, fileName );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Read all the records */
+/* -------------------------------------------------------------------- */
+ for( int iRecord = 0; iRecord < DBFGetRecordCount(hDBF); iRecord++ )
+ {
+ TeTableRow row;
+ int i;
+
+ for( i = 0; i < DBFGetFieldCount(hDBF); i++ )
+ {
+ string value = DBFReadStringAttribute( hDBF, iRecord, i ) ;
+ row.push_back ( value ); // inserts a value into the row
+ }
+ table.add ( row ); // adds a row to a table
+ }
+ DBFClose( hDBF );
+}
+
+
+bool TeReadDBFAttributes (const string& dbfFileName, TeTable& table,
+ int nrecords, int rinitial, bool createAuto)
+{
+ string filePrefix = TeGetName (dbfFileName.c_str()) ;
+ string fileName = filePrefix + ".dbf";
+
+// --------------------------------------------------------------------
+// Open the file.
+// --------------------------------------------------------------------
+ DBFHandle hDBF = DBFOpen( fileName.c_str(), "rb" );
+ if( hDBF == NULL )
+ {
+ throw TeException ( UNABLE_TO_OPEN_DBF_FILE, fileName, true );
+ }
+
+// --------------------------------------------------------------------
+// If there is no data in this file let the user know.
+// --------------------------------------------------------------------
+ if( DBFGetFieldCount(hDBF) == 0 )
+ {
+ throw TeException ( NO_DATA_IN_DBF_FILE, fileName );
+ }
+
+ if (rinitial >= DBFGetRecordCount(hDBF))
+ return false;
+
+ if (nrecords < 1 || nrecords > DBFGetRecordCount(hDBF))
+ nrecords = DBFGetRecordCount(hDBF);
+
+// --------------------------------------------------------------------
+// Read all the records
+// --------------------------------------------------------------------
+ int count = 0;
+ for( int iRecord = rinitial; (iRecord < DBFGetRecordCount(hDBF) && count < nrecords); iRecord++ )
+ {
+ TeTableRow row;
+ int i;
+ for( i = 0; i < DBFGetFieldCount(hDBF); i++ )
+ {
+ string value = DBFReadStringAttribute( hDBF, iRecord, i ) ;
+ row.push_back ( value ); // inserts a value into the row
+ }
+
+ // if asked create a auto number extra column at the end
+ if (createAuto)
+ row.push_back(Te2String(iRecord));
+
+ table.add ( row ); // adds a row to a table
+ count++;
+ }
+ DBFClose( hDBF );
+ if (count > 0)
+ return true;
+ return false;
+}
+
+void
+TeImportDBFIndexes(const string& shpFileName, vector<string>& indexVect, const string objectIdAttr )
+{
+ string filePrefix = TeGetName(shpFileName.c_str());
+ string fileName = filePrefix + ".dbf";
+
+/* -------------------------------------------------------------------- */
+/* Get index position. */
+/* -------------------------------------------------------------------- */
+ int i=0, indexPos=-1;
+
+ if (!objectIdAttr.empty())
+ {
+ TeAttributeList attList;
+ TeReadDBFAttributeList ( fileName, attList );
+ TeAttributeList::iterator it = attList.begin();
+ while ( it != attList.end() )
+ {
+ TeAttribute att = *it;
+ if (TeConvertToUpperCase(att.rep_.name_) == TeConvertToUpperCase(objectIdAttr))
+ {
+ indexPos = i;
+ break;
+ }
+ it++;
+ i++;
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* Open the file. */
+/* -------------------------------------------------------------------- */
+ DBFHandle hDBF = DBFOpen( fileName.c_str(), "rb" );
+ if( hDBF == NULL )
+ {
+ throw TeException ( UNABLE_TO_OPEN_DBF_FILE, fileName, true );
+ }
+
+/* -------------------------------------------------------------------- */
+/* If there is no data in this file let the user know. */
+/* -------------------------------------------------------------------- */
+ int nRecords = DBFGetFieldCount(hDBF);
+ if( nRecords == 0 )
+ {
+ throw TeException ( NO_DATA_IN_DBF_FILE, fileName );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Read all the records */
+/* -------------------------------------------------------------------- */
+
+ for( int iRecord = 0; iRecord < nRecords; iRecord++ )
+ {
+ if (indexPos == -1)
+ indexVect.push_back (Te2String(iRecord+1));
+ else
+ indexVect.push_back ( DBFReadStringAttribute( hDBF, iRecord, indexPos ) );
+ }
+
+ DBFClose( hDBF );
+}
diff --git a/src/terralib/functions/TeImportExport.h b/src/terralib/functions/TeImportExport.h
new file mode 100644
index 0000000..1a6cadf
--- /dev/null
+++ b/src/terralib/functions/TeImportExport.h
@@ -0,0 +1,274 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeImportExport.h
+ This file contains functions to deal with the importing/exporting
+ of geographical data to and from a TerraLib database in usual
+ formats
+*/
+#ifndef __TERRALIB_INTERNAL_IMPORTEXPORT_H
+#define __TERRALIB_INTERNAL_IMPORTEXPORT_H
+
+#include "TeTable.h"
+#include "TeBox.h"
+#include "TeDataTypes.h"
+
+#include <string>
+using namespace std;
+
+class TeLayer;
+class TeSPRFile;
+class TeAsciiFile;
+class TeProjection;
+class TeDatabase;
+
+/** @defgroup ImpExp Importing and Exporting Functions
+ * TerraLib importing and exporting functions
+ * @{
+ */
+
+/** @defgroup MIDMIF Functions to deal with MID/MIF format
+ * @ingroup ImpExp
+ * Functions related to MID MIF format
+ * @{
+ */
+
+/*! \fn TeLayer* TeImportMIF(const string& mifFileName, TeDatabase* db, const string& layerName="")
+ \brief Imports a geo data in MID/MIF format to a TerraLib database
+ \param mifFileName MIF file name
+ \param db pointer to a TerraLib database
+ \param layerName name of the layer that will contain the data (optional)
+ \return a pointer to created layer if the data was imported successfully and 0 otherwise
+*/
+TeLayer* TeImportMIF(const string& mifFileName, TeDatabase* db, const string& layerName="");
+
+/*! \fn bool TeImportMIF(TeLayer* layer, const string& mifFileName, string attrTableName="", string objectIdAttr="", int unsigned chunkSize = 60)
+ \brief Imports a MID/MIF file to a specific layer TerraLib
+ \param layer pointer to a layer
+ \param mifFileName MIF file name
+ \param objectIdAttr name of the attribute that has the identification of objects
+ \param attrTableName the name that the attribute table will be saved
+ \param chunkSize the number of objects in memory before save them in the layer
+ \return TRUE if the data was imported successfully and FALSE otherwise
+*/
+bool TeImportMIF(TeLayer* layer, const string& mifFileName, string attrTableName="",
+ string objectIdAttr="", int unsigned chunkSize = 60);
+
+/*! \fn void TeReadMIFAttributeList(const string& mifFileName, TeAttributeList& attList)
+ \brief Reads the attributes definition of a data in MID/MIF format
+*/
+void TeReadMIFAttributeList(const string& mifFileName, TeAttributeList& attList);
+
+/*! \fn TeProjection* TeReadMIFProjection(const string& mifFileName)
+ \brief Reads the geographical projection of a data in MID/MIF format
+*/
+TeProjection* TeReadMIFProjection(const string& mifFileName);
+
+/*!\fn bool TeExportMIF (TeLayer* layer, const string& mifFileName, const string& tableName)
+ \brief Exports a layer in a TerraLib database to a file in MID/MIF format
+ \param layer pointer to the layer
+ \param mifFileName name of the output MID/MIF file
+ \param tableName name of the attribute table to be exported
+ \return TRUE if the data was successfully exported and FALSE otherwise
+*/
+bool TeExportMIF (TeLayer* layer, const string& mifFileName, const string& tableName);
+
+/** @} */ // End of subgroup MID/MIF format
+
+/** @defgroup SPR Functions to deal with SPRING GEO/TAB format
+ * @ingroup ImpExp
+ * Functions related to SPRING format
+ * @{
+ */
+/*! \fn TeLayer* TeImportGEO(const string& geoFileName, TeDatabase* db, const string& layerName="")
+ \brief Imports a geo data in SPRING geo/tab format to a TerraLib database
+ \param geoFileName GEO/TAB file name
+ \param db pointer to a TerraLib database
+ \param layerName name of the layer that will contain the data (optional)
+ \return a pointer to created layer if the data was imported successfully and 0 otherwise
+*/
+TeLayer* TeImportGEO(const string& geoFileName, TeDatabase* db, const string& layerName="");
+
+/*! \fn bool TeImportGEO(TeLayer* layer, const string& geoFileName, string attrTableName="", unsigned int chunkSize=60)
+ \brief Import a GEO/TAB data to a layer TerraLib
+ \param layer pointer to a layer
+ \param geoFileName GEO/TAB file name
+ \param attrTableName the name that the attribute table will be saved
+ \param chunkSize the number of objects in memory before save them in the layer
+*/
+bool TeImportGEO(TeLayer* layer, const string& geoFileName, string attrTableName="", unsigned int chunkSize=60);
+
+/*! \fn TeReadGeoAttributeList(const string& geoFileName,TeAttributeList& attList, string& labelName )
+ \brief Reads the list of attributes of GEO/TAB file
+ \param geoFileName DBF input file name
+ \param attList returns the DBF list of attributes
+ \param labelName returns the name of the column that is the link with geometries
+ \return TRUE if the list of attributes were was successfully read and FALSE otherwise
+*/
+void TeReadGeoAttributeList(const string& geoFileName,TeAttributeList& attList, string& labelName );
+
+/*! \fn TeExportSPR(TeLayer* layer, const string& sprFileName, const string& tableName, TeSpringModels cat, const string& name);
+ \brief Exports a layer in a TerraLib database to a file in ASCII SPRING format
+ \param layer pointer to the layer
+ \param sprFileName name of the output SPRING file
+ \param tableName name of the attribute table to be exported
+ \param cat Spring category
+ \param name name of the column that has label or class identifier
+ \return TRUE if the data was successfully exported and FALSE otherwise
+ \note Parameter 'name' is the Object name if exporting to categories Cadastral or Network .
+ Is the name of the column that has the quote value if Numeric category or the name
+ of the column that has the class information if category Thematic.
+*/
+bool TeExportSPR(TeLayer* layer, const string& sprFileName, const string& tableName,
+ TeSpringModels cat, const string& name);
+/** @} */ // End of subgroup SPRING format
+
+/** @defgroup DBF Functions to deal with DBF tables
+ * @ingroup ImpExp
+ * Functions related to DBF table format
+ * @{
+ */
+
+/*! \fn bool TeReadDBFAttributeList(const string& dbfFileName, TeAttributeList& attList)
+ \brief Reads the list of attributes specified in DBF file
+ \param dbfFileName DBF input file name
+ \param attList returns the DBF list of attributes
+ \return TRUE if the list of attributes were was successfully read and FALSE otherwise
+*/
+bool TeReadDBFAttributeList(const string& dbfFileName, TeAttributeList& attList);
+
+/*! \fn bool TeReadDBFAttributes (const string& dbfFileName, TeTable& table, int nrecords=-1, int rinitial=0, bool createAuto=false)
+ \brief Reads a set of records from a shapelib to a structure in memory
+ \param dbfFileName DBF file name
+ \param table returns the set of records in memory
+ \param nrecords number of records to be read
+ \param rinitial number of the initial record
+ \param createAuto flag used to indicate if an auto number columns should be added to each record
+*/
+bool TeReadDBFAttributes (const string& dbfFileName, TeTable& table,
+ int nrecords=-1, int rinitial=0, bool createAuto=false);
+
+/*! \fn bool TeImportDBFTable(const string& dbfFileName, TeDatabase* db, TeLayer* layer=0,TeAttrTableType tableType=TeAttrExternal)
+ \brief Imports a DBF table to a TerraLib database
+ This function imports a DBF to a TerraLib database. An attribute table can be associated to a
+ particular layer, or as an external table that will be linked to any layer when genereated a
+ theme. A column called object_id_ will be added with unique values automatically generated.
+ \param dbfFileName DBF file name
+ \param db pointer to a TerraLib database
+ \param layer pointer to a layer to which the table will associated
+ \param tableType type of the attribute table
+*/
+bool TeImportDBFTable(const string& dbfFileName, TeDatabase* db, TeLayer* layer=0,TeAttrTableType tableType=TeAttrExternal, string objectIdAtt = "object_id_");
+
+/** @} */ // End of subgroup DBF format
+
+/** @defgroup SHP Functions to deal with Shapefile format
+ * @ingroup ImpExp
+ * Functions related to Shapefile format. Uses some functions related to DBF attribute table format.
+ * @{
+ */
+/*! \fn TeLayer* TeImportShape(const string& shpFileName, TeDatabase* db, const string& layerName="")
+ \brief Imports a geo data in a shapefile format to a TerraLib database
+ \param shpFileName Shapefile name
+ \param db pointer to a TerraLib database
+ \param layerName name of the layer that will contain the data (optional)
+ \return a pointer to created layer if the data was imported successfully and 0 otherwise
+*/
+TeLayer* TeImportShape(const string& shpFileName, TeDatabase* db, const string& layerName="");
+
+/*! \fn bool TeImportShape (TeLayer* layer, const string& shpFileName, string attrTableName="",string objectIdAttr="", unsigned int chunkSize = 60)
+ \brief Import a shapefile to a layer TerraLib
+ \param layer pointer to a layer
+ \param shpFileName shapefile file name
+ \param attrTableName the name that the attribute table will be saved
+ \param objectIdAttr name of the attribute that has the identification of objects
+ \param chunkSize the number of objects in memory before save them in the layer
+*/
+bool TeImportShape (TeLayer* layer, const string& shpFileName, string attrTableName="",
+ string objectIdAttr="", unsigned int chunkSize = 60);
+
+/*! \fn bool TeExportShapefile(TeLayer* layer, const string& shpFileName, const string& tableName)
+ \brief Exports a layer in a TerraLib database to a file in MID/MIF format
+ \param layer pointer to the layer
+ \param shpFileName name of the output shapefile
+ \param tableName name of the attribute table to be exported
+ \return TRUE if the data was successfully exported and FALSE otherwise
+*/
+bool TeExportShapefile(TeLayer* layer, const string& shpFileName, const string& tableName);
+/** @} */ // End of subgroup SHAPEFILE format
+
+/** @defgroup BNA Functions to deal with BNA format
+ * @ingroup ImpExp
+ * Functions related to BNA format (Atlas GIS BNA)
+ * @{
+ */
+
+/*! \fn TeLayer* TeImportBNA(const string& bnaFileName, TeDatabase* db, const string& layerName="")
+ \brief Imports a geo data in BNA format to a TerraLib database
+ \param bnaFileName BNA file name
+ \param db pointer to a TerraLib database
+ \param layerName name of the layer that will contain the data (optional)
+ \return a pointer to created layer if the data was imported successfully and 0 otherwise
+*/
+TeLayer* TeImportBNA(const string& bnaFileName, TeDatabase* db, const string& layerName="");
+
+/*! \fn bool TeImportBNA(TeLayer* layer, const string& bnaFileName, string attrTableName="", string objectIdAttr="", int unsigned chunkSize = 60)
+ \brief Imports a BNA file to a specific layer TerraLib
+ \param layer pointer to a layer
+ \param bnaFileName BNA file name
+ \param attrTableName the name that the attribute table will be saved
+ \param attList List of attribute of the bna file, used only to name the fields
+ \param chunkSize the number of objects in memory before save them in the layer
+ \return TRUE if the data was imported successfully and FALSE otherwise
+*/
+bool TeImportBNA(TeLayer* layer, const string& bnaFileName, string attrTableName,
+ TeAttributeList& attList, int unsigned chunkSize, const string& linkCol = "");
+
+/*! \fn bool TeReadBNAAttributeList(const string& bnaFileName, TeAttributeList& attList)
+ \brief Reads the attributes definition of a data in BNA format if attList is empty or says if attList size is coorect
+*/
+bool TeReadBNAAttributeList(const string& bnaFileName, TeAttributeList& attList);
+
+/** @} */ // End of subgroup BNA format
+
+/** \example ImportExample1.cpp
+ * This is an example of how to import geographical data in MID/MIF format
+ */
+
+/** \example ImportExample2.cpp
+ * This is an example of how to import geographical data in shapefile format
+ */
+
+/** \example ImportExample3.cpp
+ * This is an example of how to import a DBF table
+ */
+
+/** \example ImportExample4.cpp
+ * This is an example of how to import geographical data in SPRING GEO/TAB format
+ */
+
+
+/** @} */ // End of group ImpExp format
+
+#endif
+
diff --git a/src/terralib/functions/TeImportGeo.cpp b/src/terralib/functions/TeImportGeo.cpp
new file mode 100644
index 0000000..a1ec105
--- /dev/null
+++ b/src/terralib/functions/TeImportGeo.cpp
@@ -0,0 +1,455 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+// STL
+#include <string>
+#include <iostream>
+#include <vector>
+#include <list>
+#include <map>
+
+using namespace std;
+
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+// TerraLib
+
+#include "TeImportExport.h"
+
+#include "TeAsciiFile.h"
+#include "TeBox.h"
+#include "TeLayer.h"
+#include "TeException.h"
+#include "TeUtils.h"
+#include "TeDatabase.h"
+
+//! Import only the attributes of a GEO/TAB data to a layer TerraLib
+/*!
+ \param layer pointer to a layer
+ \param geoFileName GEO/TAB file name
+ \param attrTableName the name that the attribute table will be saved
+ \param objectIdAttr name of the attribute that has the identification of objects
+ \param chunckSize the number of objects in memory before save them in the layer
+*/
+bool TeImportGeoAttributes(TeLayer* layer, const string& geoFileName, string attrTableName="", unsigned int chunckSize=60);
+
+//! Import only the geometries of a GEO/TAB data to a layer TerraLib
+/*!
+ \param layer pointer to a layer
+ \param geoFileName GEO/TAB file name
+ \param chunckSize the number of objects in memory before save them in the layer
+*/
+bool TeImportGeoGeometries(TeLayer* layer, const string& geoFileName, unsigned int chunckSize=60);
+
+TeLayer*
+TeImportGEO(const string& geoFileName, TeDatabase* db, const string& layerName)
+{
+ if (!db || geoFileName.empty())
+ return 0;
+
+ // check if format is complete (GEO e TAB files exist)
+ string filePrefix = TeGetName(geoFileName.c_str());
+ string ftest = filePrefix + ".geo";
+ if (access(ftest.c_str(),04) == -1)
+ {
+ ftest = filePrefix + ".GEO";
+ if (access(ftest.c_str(),04) == -1)
+ return 0;
+ }
+ ftest = filePrefix + ".tab";
+ if (access(ftest.c_str(),04) == -1)
+ {
+ ftest = filePrefix + ".TAB";
+ if (access(ftest.c_str(),04) == -1)
+ return 0;
+ }
+
+ // found a valid layer name
+ string lName;
+ string baseName = TeGetBaseName(geoFileName.c_str());
+ if (layerName.empty())
+ lName = baseName;
+ else
+ lName = layerName;
+
+ string newLayerName = lName;
+ TeLayerMap& layerMap = db->layerMap();
+ TeLayerMap::iterator it;
+ bool flag = true;
+ int n = 1;
+ while (flag)
+ {
+ for (it = layerMap.begin(); it != layerMap.end(); ++it)
+ {
+ if (TeStringCompare(it->second->name(),newLayerName))
+ break;
+ }
+ if (it == layerMap.end())
+ flag = 0;
+ else
+ newLayerName = lName + "_" +Te2String(n);
+ n++;
+ }
+
+ // find projection
+ TeLayer* newLayer = new TeLayer(newLayerName,db);
+ if (newLayer->id() <= 0 )
+ return 0; // couldn�t create new layer
+
+ bool res = TeImportGEO(newLayer,geoFileName);
+ if (res)
+ return newLayer;
+ else
+ {
+ db->deleteLayer(newLayer->id());
+ delete newLayer;
+ return 0;
+ }
+}
+
+bool
+TeImportGEO(TeLayer* layer, const string& geoFileName, string attrTableName, unsigned int chunckSize)
+{
+ // Import the attribute table in chuncks
+ if (!TeImportGeoAttributes (layer,geoFileName,attrTableName,chunckSize))
+ return false;
+
+ //Import the geometries
+ return TeImportGeoGeometries (layer,geoFileName,chunckSize);
+}
+
+void
+TeReadGeoAttributeList(const string& geoFileName,TeAttributeList& attList, string& labelName )
+{
+ string filePrefix = TeGetName (geoFileName.c_str()) ;
+ string fileName = filePrefix + ".tab";
+ try
+ {
+ TeAsciiFile pFile (fileName);
+ string name ;
+
+ name = pFile.readString(); // "LABEL"
+ pFile.findNewLine();
+ name = pFile.readString(); // Spring category
+ labelName = pFile.readString(); // label name
+
+ while ( pFile.isNotAtEOF() && name != "SEPARATOR" )
+ name = pFile.readString ();
+
+ char separator = ',';
+ if ( name == "SEPARATOR" )
+ {
+ separator = pFile.readString ().c_str()[0];
+ }
+ pFile.findNewLine();
+
+ TeAttribute attribute;
+ while (pFile.isNotAtEOF())
+ {
+ name = pFile.readStringCSVNoSpace (separator);
+ if ( name == "INFO_END" )
+ break;
+
+ attribute.rep_.name_ = name;
+
+ name = pFile.readStringCSVNoSpace (separator);
+ if (name == "TEXT")
+ attribute.rep_.type_ = TeSTRING;
+ else if (name == "INTEGER")
+ attribute.rep_.type_ = TeINT;
+ else if (name == "TeDATETIME")
+ attribute.rep_.type_ = TeDATETIME;
+ else if (name == "REAL")
+ attribute.rep_.type_ = TeREAL;
+ else
+ attribute.rep_.type_ = TeUNKNOWN;
+
+ int size = pFile.readIntCSV (separator);
+ attribute.rep_.numChar_ = size;
+
+ attList.push_back ( attribute );
+ pFile.findNewLine();
+ }
+ }
+ catch(...)
+ {
+ return;
+ }
+}
+
+bool
+TeImportGeoAttributes(TeLayer* layer,const string& geoFileName, string attrTableName, unsigned int chunckSize)
+{
+ string filePrefix = TeGetName (geoFileName.c_str()) ;
+ string fileName = filePrefix + ".tab";
+
+ // Read attribute list information and key field name
+ TeAttributeList attList;
+ string linkName;
+ TeReadGeoAttributeList(geoFileName,attList,linkName);
+
+ if (attrTableName.empty())
+ {
+ if (layer->name().empty())
+ return false;
+ else
+ attrTableName = layer->name();
+ }
+
+ // check if given index is valid
+ TeAttributeList::iterator it = attList.begin();
+ int i = -1, j=0;
+ while (it != attList.end())
+ {
+ if (TeConvertToUpperCase((*it).rep_.name_) == TeConvertToUpperCase(linkName)) // index found
+ {
+ if ((*it).rep_.type_ != TeSTRING) // make sure it is a String type
+ {
+ (*it).rep_.type_ = TeSTRING;
+ (*it).rep_.numChar_ = 16;
+ }
+ (*it).rep_.isPrimaryKey_ = true;
+ i=j;
+ break;
+ }
+ ++it;
+ j++;
+ }
+ if (it == attList.end())
+ return false;
+
+ TeAsciiFile pFile (fileName);
+ string name = pFile.readString ();
+ pFile.findNewLine();
+
+ if (name != "TABLE")
+ return false;
+
+ TeTable attTable (attrTableName,attList,linkName,linkName,TeAttrStatic);
+ if (!layer->createAttributeTable(attTable))
+ return false;
+
+
+ int nAtt = attList.size();
+
+ // Identify the separator again
+ while ( pFile.isNotAtEOF() && name != "SEPARATOR" )
+ name = pFile.readString ();
+
+ char separator = ',';
+ if ( name == "SEPARATOR" )
+ {
+ separator = pFile.readString ().c_str()[0];
+ }
+ pFile.findNewLine();
+
+ // Skip the information lines
+ while ( pFile.isNotAtEOF() && name != "INFO_END" )
+ name = pFile.readString ();
+
+ if (name != "INFO_END")
+ return false;
+
+ pFile.findNewLine();
+ string value = pFile.readStringCSVNoQuote(separator);
+ try {
+ // Read the attribute lines
+ while (pFile.isNotAtEOF())
+ {
+ TeTableRow row;
+ for (int n=0; n<nAtt; n++)
+ {
+ row.push_back ( value );
+ if(pFile.isNotAtEOF())
+ value = pFile.readStringCSVNoQuote(separator);
+ }
+ attTable.add( row );
+
+ if ( attTable.size() == chunckSize )
+ {
+ layer->saveAttributeTable( attTable );
+ attTable.clear();
+ }
+ pFile.findNewLine();
+ value = pFile.readStringCSVNoQuote(separator);
+ }
+ }
+ catch (...)
+ {
+// int a = 0; end of file reached
+ }
+ // save the remaining rows
+ if (attTable.size() > 0 )
+ layer->saveAttributeTable( attTable );
+ attTable.clear();
+ return true;
+}
+
+bool
+TeImportGeoGeometries ( TeLayer* layer, const string& geoFileName, unsigned int chunckSize)
+{
+ string filePrefix = TeGetName (geoFileName.c_str()) ;
+ string fileName = filePrefix + ".geo";
+
+ TePointSet pointSet;
+ TeLineSet lineSet;
+ TePolygonSet polySet;
+ TeTextSet textSet;
+
+
+/* -------------------------------------------------------------------- */
+/* Open the file. */
+/* -------------------------------------------------------------------- */
+
+ TeAsciiFile pFile (fileName);
+
+ int size,nrings;
+ string geoId;
+
+/* -------------------------------------------------------------------- */
+/* Get information about the file */
+/* -------------------------------------------------------------------- */
+ try
+ {
+ while (pFile.isNotAtEOF())
+ {
+ string repType = pFile.readString ();
+ pFile.findNewLine();
+ if (repType == "POLIGONOS")
+ {
+ while ( 1 )
+ {
+ TePolygon poly;
+ string rings = pFile.readString ();
+ if (rings == "END" )
+ break;
+ nrings = atoi(rings.c_str());
+ if (!pFile.isNotAtEOF())
+ break;
+ geoId = pFile.readString ();
+ pFile.findNewLine();
+ poly.objectId ( geoId );
+ int i,j;
+ for (j=0;j<nrings;j++)
+ {
+ TeLine2D line;
+ size = pFile.readInt ();
+ pFile.findNewLine();
+ for (i=0;i<size;i++)
+ {
+ // Build the polygon
+ TeCoord2D xy = pFile.readCoord2D ();
+ line.add ( xy );
+ }
+ TeLinearRing ring (line);
+ poly.add ( ring );
+ }
+ polySet.add ( poly );
+ if ( polySet.size() == chunckSize )
+ {
+ layer->addPolygons( polySet );
+ polySet.clear();
+ }
+ }
+ }
+ if (repType == "LINHAS")
+ {
+ while ( 1 )
+ {
+ geoId = pFile.readStringCSVNoQuote (',');
+ pFile.findNewLine();
+ if (!pFile.isNotAtEOF() || geoId == "END")
+ break;
+ int i;
+ TeLine2D line;
+ size = pFile.readInt ();
+ pFile.findNewLine();
+ for (i=0;i<size;i++)
+ {
+ // Build the line
+ TeCoord2D xy = pFile.readCoord2D ();
+ line.add ( xy );
+ }
+ line.objectId ( geoId );
+ lineSet.add ( line );
+ if ( lineSet.size() == chunckSize )
+ {
+ layer->addLines( lineSet );
+ lineSet.clear();
+ }
+ pFile.findNewLine();
+ }
+ }
+ if (repType == "PONTOS")
+ {
+ while ( 1 )
+ {
+ geoId = pFile.readString ();
+ if (!pFile.isNotAtEOF() || geoId == "END" )
+ break;
+ TePoint point;
+ // Build the point
+ TeCoord2D xy = pFile.readCoord2D ();
+ point.add ( xy );
+ point.objectId ( geoId );
+ pointSet.add ( point );
+ if ( pointSet.size() == chunckSize )
+ {
+ layer->addPoints( pointSet );
+ pointSet.clear();
+ }
+ pFile.findNewLine();
+ }
+ if (repType.empty())
+ break;
+ }
+ }
+ }
+ catch(...)
+ {
+// int a = 0;
+ }
+ // save the remaining geometries
+ if (pointSet.size() > 0)
+ {
+ layer->addPoints( pointSet );
+ pointSet.clear();
+ }
+
+ if (lineSet.size() > 0 )
+ {
+ layer->addLines( lineSet );
+ lineSet.clear();
+ }
+
+ if (polySet.size() > 0)
+ {
+ layer->addPolygons( polySet );
+ polySet.clear();
+ }
+ return true;
+}
diff --git a/src/terralib/functions/TeImportMIF.cpp b/src/terralib/functions/TeImportMIF.cpp
new file mode 100644
index 0000000..752cff3
--- /dev/null
+++ b/src/terralib/functions/TeImportMIF.cpp
@@ -0,0 +1,894 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <string>
+#include <iostream>
+#include <list>
+
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+using namespace std;
+
+#include "TeImportExport.h"
+#include "TeTable.h"
+#include "TeGeometry.h"
+#include "TeAsciiFile.h"
+#include "TeMIFProjection.h"
+#include "TeException.h"
+#include "TeProjection.h"
+#include "TeAttribute.h"
+#include "TeTable.h"
+#include "TeAssertions.h"
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeDatabase.h"
+
+void TeMIFRegionDecode ( TeAsciiFile& mifFile, TePolygonSet& temp, string& index);
+
+void TeMIFLineDecode (TeAsciiFile& mifFile, TeLineSet& temp, string& index);
+
+void TeMIFPlineDecode (TeAsciiFile& mifFile, TeLineSet& temp, string& index);
+
+void TeMIFPointDecode (TeAsciiFile& mifFile, TePointSet& temp, string& index);
+
+void TeMIFMultiPointDecode (TeAsciiFile& mifFile, TePointSet& temp, string& index);
+
+void TeMIFTextDecode (TeAsciiFile& mifFile, TeTextSet& temp, string& index);
+
+void TeMIFCollectionDecode(TeAsciiFile& mifFile, TePointSet& ps, TeLineSet& ls, TePolygonSet& pols, string& index);
+
+void TeMIFRectDecode (TeAsciiFile& mifFile, TePolygonSet& temp, string& index);
+
+void TeMIFOthersDecode ( TeAsciiFile& );
+
+void TeMIFTransformDecode ( TeAsciiFile& );
+
+bool TeReadMIFAttributes(TeAsciiFile& midFile, TeTable& attTable,
+ int ncolumns, int nrecords=-1, int delta = 0, bool createAuto=false);
+
+bool TeImportMIFGeometries(TeLayer* layer,const string& mifFileName,
+ vector<string> &indexes, unsigned int chunckSize);
+
+char TeReadMIFSeparator(const string& mifFileName);
+
+double glXmulti = 1., glYmulti = 1;
+
+TeCoord2D glAdd (0., 0. );
+
+
+TeLayer* TeImportMIF(const string& mifFileName, TeDatabase* db, const string& layerName)
+{
+ if (!db || mifFileName.empty())
+ return 0;
+
+ // check if format is complete (MID and MIF files exist)
+ string filePrefix = TeGetName(mifFileName.c_str());
+ string ftest = filePrefix + ".mid";
+ if (access(ftest.c_str(),04) == -1)
+ {
+ ftest = filePrefix + ".MID";
+ if (access(ftest.c_str(),04) == -1)
+ return 0;
+ }
+
+ ftest = filePrefix + ".mif";
+ if (access(ftest.c_str(),04) == -1)
+ {
+ ftest = filePrefix + ".MIF";
+ if (access(ftest.c_str(),04) == -1)
+ return 0;
+ }
+
+ // found a valid layer name
+ string lName;
+ string baseName = TeGetBaseName(mifFileName.c_str());
+ if (layerName.empty())
+ lName = baseName;
+ else
+ lName = layerName;
+
+ string newLayerName = lName;
+ TeLayerMap& layerMap = db->layerMap();
+ TeLayerMap::iterator it;
+ bool flag = true;
+ int n = 1;
+ while (flag)
+ {
+ for (it = layerMap.begin(); it != layerMap.end(); ++it)
+ {
+ if (TeStringCompare(it->second->name(),newLayerName))
+ break;
+ }
+ if (it == layerMap.end())
+ flag = 0;
+ else
+ newLayerName = lName + "_" +Te2String(n);
+ n++;
+ }
+
+ // find projection
+ TeProjection* mifProj = TeReadMIFProjection(mifFileName);
+ TeLayer* newLayer = new TeLayer(newLayerName,db,mifProj);
+ if (newLayer->id() <= 0 )
+ return 0; // couldn�t create new layer
+
+ bool res = TeImportMIF(newLayer,mifFileName);
+ delete mifProj;
+ if (res)
+ return newLayer;
+ else
+ {
+ db->deleteLayer(newLayer->id());
+ delete newLayer;
+ return 0;
+ }
+}
+
+bool
+TeImportMIF(TeLayer* layer, const string& mifFileName, string attrTableName,
+ string objectIdAttr, unsigned int chunkSize)
+{
+ // check if format is complete (MID and MIF files exist)
+ string filePrefix = TeGetName(mifFileName.c_str());
+ string ftest = filePrefix + ".mid";
+ if (access(ftest.c_str(),04) == -1)
+ {
+ ftest = filePrefix + ".MID";
+ if (access(ftest.c_str(),04) == -1)
+ return false;
+ }
+
+ ftest = filePrefix + ".mif";
+ if (access(ftest.c_str(),04) == -1)
+ {
+ ftest = filePrefix + ".MIF";
+ if (access(ftest.c_str(),04) == -1)
+ return false;
+ }
+
+
+ //-- Step 1: Read any adicional information (ex. projection)
+ if (!layer->projection())
+ {
+ TeProjection* mifProj = TeReadMIFProjection(mifFileName);
+ if (mifProj)
+ layer->setProjection(mifProj);
+ }
+
+ char separator = TeReadMIFSeparator(mifFileName);
+
+ //read the attribute list information
+ TeAttributeList attList;
+ TeReadMIFAttributeList(mifFileName, attList);
+
+ // define a TeAttributeTable
+ if (attrTableName.empty())
+ {
+ if (layer->name().empty())
+ return false;
+ else
+ attrTableName = layer->name();
+ }
+ string aux = attrTableName;
+ int c = 1;
+ while (layer->database()->tableExist(aux))
+ {
+ aux = attrTableName + "_" + Te2String(c);
+ ++c;
+ }
+ attrTableName = aux;
+
+ int linkCol=-1, j=0;
+ bool autoIndex = false;
+
+ // if no geometry link name is given, creates one called 'object_id'
+ if (objectIdAttr.empty())
+ {
+ objectIdAttr = "object_id_"+Te2String(layer->id());
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.numChar_ = 16;
+ at.rep_.name_ = objectIdAttr;
+ at.rep_.isPrimaryKey_ = true;
+ attList.push_back(at);
+ autoIndex = true;
+ }
+ else
+ {
+ // check if given index is valid
+ TeAttributeList::iterator it = attList.begin();
+ while (it != attList.end())
+ {
+ if (TeConvertToUpperCase((*it).rep_.name_) == TeConvertToUpperCase(objectIdAttr)) // index found
+ {
+ if ((*it).rep_.type_ != TeSTRING) // make sure it is a String type
+ {
+ (*it).rep_.type_ = TeSTRING;
+ (*it).rep_.numChar_ = 16;
+ }
+ linkCol=j;
+ (*it).rep_.isPrimaryKey_ = true;
+ break;
+ }
+ it++;
+ j++;
+ }
+ if (it == attList.end()) // index not found
+ {
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.numChar_ = 16;
+ at.rep_.name_ = objectIdAttr;
+ at.rep_.isPrimaryKey_ = true;
+ attList.push_back(at);
+ autoIndex = true;
+ }
+ }
+
+ if (autoIndex)
+ linkCol = attList.size()-1;
+
+ TeTable attTable (attrTableName,attList,objectIdAttr,objectIdAttr,TeAttrStatic);
+ attTable.setSeparator(separator);
+
+ // insert the table into the database
+ if (!layer->createAttributeTable(attTable))
+ return false;
+
+ vector<string> objectIds;
+
+ string midFileName = filePrefix + ".mid";
+
+ int ncol = attList.size();
+ if (autoIndex)
+ ncol--;
+
+ TeAsciiFile midFile(midFileName);
+ int delta = 0;
+ while (TeReadMIFAttributes(midFile,attTable,ncol,chunkSize,delta, autoIndex))
+ {
+ for (unsigned int n=0; n<attTable.size();++n)
+ objectIds.push_back(attTable.operator ()(n,linkCol));
+
+ // save table
+ if (!layer->saveAttributeTable( attTable ))
+ {
+ attTable.clear();
+ break;
+ }
+ delta += attTable.size();
+ attTable.clear();
+ }
+
+ // Import the geometries
+ bool res = TeImportMIFGeometries(layer,mifFileName,objectIds,chunkSize);
+ return res;
+}
+
+bool TeReadMIFAttributes(TeAsciiFile& midFile, TeTable& attTable,
+ int ncolumns, int nrecords, int delta, bool createAuto )
+{
+ if (!midFile.isNotAtEOF() || nrecords <=0 || ncolumns <= 0)
+ return false;
+ char separator = attTable.separator();
+
+ int count;
+ for (count=0; count<nrecords; count++)
+ {
+ if (!midFile.isNotAtEOF())
+ break;
+
+ TeTableRow row;
+ for (int n=0; n<ncolumns; n++)
+ {
+ string value;
+ try
+ {
+ value = midFile.readStringCSVNoQuote(separator);
+ }
+ catch(...)
+ {
+ if (count > 0)
+ return true;
+ else
+ return false;
+ }
+ row.push_back ( value );
+ }
+
+ if (createAuto)
+ row.push_back(Te2String(count+delta));
+
+ attTable.add(row);
+ midFile.findNewLine();
+ }
+ return true;
+}
+
+char
+TeReadMIFSeparator(const string& mifFileName)
+{
+ string filePrefix = TeGetName (mifFileName.c_str()) ;
+ string fileName = filePrefix + ".mif";
+
+ TeAsciiFile mifFile(fileName);
+ string name = mifFile.readString ();
+
+ while ( mifFile.isNotAtEOF() && !TeStringCompare(name,"Delimiter"))
+ name = mifFile.readString ();
+
+ if (mifFile.isNotAtEOF())
+ return mifFile.readQuotedChar();
+ else
+ return '\t';
+}
+
+
+TeProjection*
+TeReadMIFProjection(const string& mifFileName)
+{
+ TeProjection* proj = 0;
+
+ string filePrefix = TeGetName (mifFileName.c_str()) ;
+ string fileName = filePrefix + ".mif";
+
+ TeAsciiFile mifFile(fileName);
+ string name = mifFile.readString ();
+
+ while ( mifFile.isNotAtEOF() && !TeStringCompare(name,"CoordSys")
+ && !TeStringCompare(name,"Columns"))
+ name = mifFile.readString ();
+
+ if (mifFile.isNotAtEOF() && TeStringCompare(name,"CoordSys"))
+ {
+ string option = mifFile.readString();
+
+ vector<string> argList;
+
+ if (TeStringCompare(option,"Earth")) // expect Projection clause
+ {
+ string projRef = mifFile.readString ();
+ if (!TeStringCompare(projRef,"Projection"))
+ {
+ proj = new TeNoProjection();
+ return proj;
+ }
+ mifFile.readStringListCSV(argList,',');
+ proj = TeMIFProjectionFactory::make ( argList ); // create projection from parameters
+ }
+ else if (TeStringCompare(option,"Nonearth")) // non earth
+ {
+ // look for units specification
+ while (mifFile.isNotAtEOF() && !TeStringCompare(name,"Units")
+ && !TeStringCompare(name,"Columns"))
+ name = mifFile.readString ();
+ if (TeStringCompare(name,"Units"))
+ {
+ name = mifFile.readString();
+ proj = new TeNoProjection(name);
+ }
+ else
+ proj = new TeNoProjection(name);
+ }
+ }
+ else // no CoordSys clause specified
+ { // it should be assumed that the data is stored in Lat Long
+ TeDatum datum = TeDatumFactory::make("Spherical");
+ proj = new TeLatLong(datum);
+ }
+ return proj;
+}
+
+void
+TeReadMIFAttributeList ( const string& mifFileName, TeAttributeList& attList )
+{
+ string filePrefix = TeGetName (mifFileName.c_str()) ;
+ string fileName = filePrefix + ".mif";
+
+ TeAsciiFile mifFile(fileName);
+ string name = mifFile.readString ();
+
+ while ( mifFile.isNotAtEOF() && !TeStringCompare(name,"Columns"))
+ name = mifFile.readString ();
+
+ if (mifFile.isNotAtEOF())
+ {
+ int ncol = mifFile.readInt();
+ mifFile.findNewLine();
+ TeAttribute attribute;
+
+ for ( int i = 0; i< ncol; i++ )
+ {
+ attribute.rep_.name_ = mifFile.readString();
+ string attType = mifFile.readStringCSVNoSpace ('(');
+ if ( TeStringCompare(attType,"Integer") || TeStringCompare(attType,"Smallint")
+ || TeStringCompare(attType,"Logical") )
+ {
+ attribute.rep_.type_ = TeINT;
+ }
+ else if (TeStringCompare(attType,"Float"))
+ {
+ attribute.rep_.type_ = TeREAL;
+ attribute.rep_.numChar_ = 20;
+ attribute.rep_.decimals_ = 1;
+ }
+ else if (TeStringCompare(attType,"Date"))
+ {
+ attribute.rep_.type_ = TeDATETIME;
+ attribute.dateTimeFormat_="YYYYMMDD";
+ }
+ else if (TeStringCompare(attType,"Decimal"))
+ {
+ attribute.rep_.type_ = TeREAL;
+ attribute.rep_.numChar_ = mifFile.readIntCSV();
+ attribute.rep_.decimals_ = mifFile.readIntCSV(')');
+ }
+ else
+ {
+ attribute.rep_.type_ = TeSTRING;
+ attribute.rep_.numChar_ = mifFile.readIntCSV(')');
+ }
+ attList.push_back ( attribute );
+ mifFile.findNewLine();
+ }
+ }
+}
+
+bool
+TeImportMIFGeometries(TeLayer* layer,const string& mifFileName,
+ vector<string> &indexes, unsigned int chunckSize)
+{
+
+ string filePrefix = TeGetName (mifFileName.c_str()) ;
+ string fileName = filePrefix + ".mif";
+
+ TePointSet pointSet;
+ TeLineSet lineSet;
+ TePolygonSet polySet;
+ TeTextSet textSet;
+ string textTableName = layer->name() + "Texto";
+
+ try
+ {
+ TeAsciiFile mifFile(fileName);
+ int n = 0;
+ while ( mifFile.isNotAtEOF() )
+ {
+ string name = mifFile.readString ();
+ if (TeStringCompare(name,"Region"))
+ {
+ TeMIFRegionDecode ( mifFile, polySet, indexes[n]);
+ n++;
+ if ( polySet.size() == chunckSize )
+ {
+ layer->addPolygons( polySet );
+ polySet.clear();
+ }
+ }
+ else if (TeStringCompare(name,"Pline"))
+ {
+ TeMIFPlineDecode ( mifFile, lineSet, indexes[n] );
+ n++;
+ if ( lineSet.size() == chunckSize )
+ {
+ layer->addLines( lineSet );
+ lineSet.clear();
+ }
+ }
+ else if (TeStringCompare(name,"Line"))
+ {
+ TeMIFLineDecode ( mifFile, lineSet, indexes[n] );
+ n++;
+ if ( lineSet.size() == chunckSize )
+ {
+ layer->addLines( lineSet );
+ lineSet.clear();
+ }
+ }
+ else if (TeStringCompare(name,"Point"))
+ {
+ TeMIFPointDecode ( mifFile, pointSet, indexes[n] );
+ n++;
+ if ( pointSet.size() == chunckSize )
+ {
+ layer->addPoints( pointSet );
+ pointSet.clear();
+ }
+ }
+ else if (TeStringCompare(name,"Multipoint"))
+ {
+ TeMIFMultiPointDecode ( mifFile, pointSet, indexes[n] );
+ n++;
+ if ( pointSet.size() == chunckSize )
+ {
+ layer->addPoints( pointSet );
+ pointSet.clear();
+ }
+ }
+ else if (TeStringCompare(name,"Text"))
+ {
+ TeMIFTextDecode ( mifFile, textSet,indexes[n]);
+ n++;
+ if ( textSet.size() == chunckSize )
+ {
+ layer->addText( textSet,textTableName );
+ textSet.clear();
+ }
+ }
+ else if (TeStringCompare(name,"Rect"))
+ {
+ TeMIFRectDecode(mifFile,polySet,indexes[n]);
+ n++;
+ if (polySet.size() == chunckSize )
+ {
+ layer->addPolygons(polySet);
+ polySet.clear();
+ }
+ }
+ else if (TeStringCompare(name,"Collection"))
+ {
+ TeMIFCollectionDecode(mifFile,pointSet,lineSet, polySet,indexes[n]);
+ n++;
+ if (lineSet.size() == chunckSize )
+ {
+ layer->addLines(lineSet);
+ lineSet.clear();
+ }
+ if (polySet.size() == chunckSize )
+ {
+ layer->addPolygons(polySet);
+ polySet.clear();
+ }
+ if (pointSet.size() == chunckSize )
+ {
+ layer->addPoints(pointSet);
+ pointSet.clear();
+ }
+ }
+ else if (TeStringCompare(name,"Transform"))
+ TeMIFTransformDecode ( mifFile );
+ else if (TeStringCompare(name,"NONE"))
+ n++;
+ else
+ TeMIFOthersDecode ( mifFile );
+ }
+
+ // save the remaining geometries
+ if (pointSet.size() > 0 )
+ {
+ layer->addPoints( pointSet );
+ pointSet.clear();
+ }
+
+ if (lineSet.size() > 0 )
+ {
+ layer->addLines( lineSet );
+ lineSet.clear();
+ }
+
+ if (polySet.size() > 0 )
+ {
+ layer->addPolygons( polySet );
+ polySet.clear();
+ }
+
+ if (textSet.size() > 0)
+ {
+ layer->addText( textSet,textTableName );
+ textSet.clear();
+ }
+ }
+ catch(...)
+ {
+ return false;
+ }
+ return true;
+}
+
+void
+TeMIFRectDecode (TeAsciiFile& mifFile, TePolygonSet& temp, string& index)
+{
+ if (index.empty())
+ index = "te_nulo";
+ TeCoord2D ll = mifFile.readCoord2D();
+ TeCoord2D ur = mifFile.readCoord2D();
+
+ TeBox rec(ll.x_,ll.y_,ur.x_,ur.y_);
+ TePolygon pol = polygonFromBox(rec);
+ pol.objectId(index);
+ temp.add(pol);
+}
+
+void
+TeMIFRegionDecode ( TeAsciiFile& mifFile, TePolygonSet& temp, string& index)
+{
+ if (index.empty())
+ index = "te_nulo";
+
+ int npolyg = mifFile.readInt();
+ mifFile.findNewLine();
+
+ TeCoord2D pt;
+ TePolygon pol;
+ typedef list<TePolygon> PolyList;
+ PolyList pList;
+ for ( int i = 0; i < npolyg; i++ )
+ {
+ TeLine2D line;
+
+ int ncoord = mifFile.readInt();
+ mifFile.findNewLine();
+
+ for ( int j = 0; j < ncoord; j++ )
+ {
+ pt = mifFile.readCoord2D();
+ pt.scale( glXmulti, glYmulti);
+ pt += glAdd;
+ mifFile.findNewLine();
+ line.add ( pt );
+
+ }
+ if ( line.size() <= 3 ) continue; // to avoid dangling rings
+ if ( !line.isRing() ) //close the ring
+ {
+ line.add(line[0]);
+// throw TeException ( MIF_REGION_CLOSE );
+ }
+
+ TeLinearRing ring (line);
+
+ bool inside = false;
+
+ PolyList::iterator it = pList.begin();
+
+ while ( it != pList.end() )
+ {
+ TePolygon p1;
+ p1.add(ring);
+ TePolygon p2 = (*it);
+ if (TeWithin(p1,p2))
+ {
+ inside = true;
+ ring.objectId(p2[0].objectId());
+ p2.add ( ring );// add a closed region
+ }
+ ++it;
+ }
+ if ( !inside )
+ {
+ TePolygon poly;
+ ring.objectId(index);
+ poly.add ( ring ); // add an outer region
+ poly.objectId(index);
+ pList.push_back ( poly );
+ }
+ }
+
+ PolyList::iterator it = pList.begin();
+ while ( it != pList.end() )
+ {
+ temp.add ( *it ); // add a polygon to a layer
+ ++it;
+ }
+}
+
+void
+TeMIFLineDecode (TeAsciiFile& mifFile, TeLineSet& temp, string& index)
+{
+ if (index.empty())
+ index = "te_nulo";
+
+ TeLine2D line;
+ TeCoord2D pt;
+
+ for ( int i= 0; i < 2; i++ )
+ {
+ pt = mifFile.readCoord2D();
+ pt.scale( glXmulti, glYmulti);
+ pt += glAdd;
+ line.add ( pt );
+ }
+
+ line.objectId( index );
+ temp.add ( line );
+ mifFile.findNewLine();
+}
+
+void
+TeMIFPlineDecode (TeAsciiFile& mifFile, TeLineSet& temp, string& index)
+{
+ if (index.empty())
+ index = "te_nulo";
+
+ int numSections = 1;
+ int ncoord = 0;
+
+ // Read the Pline parameters
+ vector<string> strList;
+ mifFile.readStringList ( strList );
+
+ // Are we dealing with MULTIPLE sections ??
+ // If there are two parameters for the pline,
+ // the first MUST be a "Multiple" keyword
+
+ bool hasMultiple = false;
+
+ if ( strList.size() == 2 )
+ {
+ hasMultiple = true;
+ ensure (TeStringCompare(strList[0],"Multiple"));
+ numSections = atoi ( strList[1].c_str() );
+ }
+ else
+ ncoord = atoi ( strList[0].c_str());
+
+ mifFile.findNewLine(); // go to the next line
+ // If there is a single PLine, there is a single
+ // section ( numSections = 1 ) and will read
+ // the number of points within the loop
+
+
+ for ( int i= 0; i < numSections; i++ )
+ {
+ TeLine2D line;
+ TeCoord2D pt;
+ if ( hasMultiple == true )
+ {
+ ncoord = mifFile.readInt();
+ mifFile.findNewLine(); // go to the next line
+ }
+
+ for ( int j = 0; j < ncoord; j++ )
+ {
+ pt = mifFile.readCoord2D();
+ pt.scale( glXmulti, glYmulti);
+ pt += glAdd;
+ mifFile.findNewLine();
+ line.add ( pt );
+ }
+ line.objectId( index );
+ temp.add ( line );
+ }
+}
+
+void
+TeMIFPointDecode (TeAsciiFile& mifFile, TePointSet& temp, string& index)
+{
+ if (index.empty())
+ index = "te_nulo";
+
+ TePoint point;
+
+ // Read the coordinates
+
+ TeCoord2D pt = mifFile.readCoord2D();
+ pt.scale( glXmulti, glYmulti);
+ pt += glAdd;
+ point.add ( pt );
+ point.objectId( index );
+
+ // Add a point to the Point Set
+
+ temp.add ( point );
+
+ mifFile.findNewLine();
+}
+
+void
+TeMIFMultiPointDecode (TeAsciiFile& mifFile, TePointSet& temp, string& index)
+{
+ if (index.empty())
+ index = "te_nulo";
+
+ int npts = mifFile.readInt();
+ mifFile.findNewLine();
+ for (int i=0; i<npts;i++)
+ {
+ // Read points
+ TePoint point;
+ TeCoord2D pt = mifFile.readCoord2D();
+ pt.scale( glXmulti, glYmulti);
+ pt += glAdd;
+ point.add ( pt );
+ point.objectId( index );
+
+ // Add a point to the Point Set
+ temp.add ( point );
+ }
+ mifFile.findNewLine();
+}
+
+void
+TeMIFTransformDecode ( TeAsciiFile& mifFile )
+{
+ // read the tansformation params
+
+ double param = mifFile.readFloatCSV();
+
+ if ( param != 0. )
+ glXmulti = param;
+
+ param = mifFile.readFloatCSV();
+
+ if ( param != 0. )
+ glYmulti = param;
+
+ double x = mifFile.readFloatCSV();
+
+ double y = mifFile.readFloatCSV();
+
+ TeCoord2D pt ( x, y );
+
+ glAdd = pt;
+
+ // Go to the next line
+ mifFile.findNewLine ();
+
+}
+
+void
+TeMIFTextDecode (TeAsciiFile& mifFile, TeTextSet& temp, string& index)
+{
+ string txt = mifFile.readQuotedString(); // read the text string
+ mifFile.findNewLine ();
+ TeBox box = mifFile.readBox(); // read the text box
+
+ TeCoord2D lowerLeft = box.lowerLeft();
+ TeText text(lowerLeft,txt);
+ text.setBox(box);
+ text.objectId(index);
+ text.setHeight(box.height());
+ temp.add(text);
+ mifFile.findNewLine (); // go to the next line
+}
+
+void
+TeMIFOthersDecode ( TeAsciiFile& mifFile )
+{
+ // Simply go to the next line
+ mifFile.findNewLine ();
+}
+
+void
+TeMIFCollectionDecode(TeAsciiFile& mifFile, TePointSet& ps, TeLineSet& ls, TePolygonSet& pols, string& index)
+{
+ int nparts = mifFile.readInt();
+ if (nparts == 0)
+ nparts = 3;
+ mifFile.findNewLine();
+ for (int i=0; i<nparts; i++)
+ {
+ string part = mifFile.readString ();
+ if (TeStringCompare(part,"Region"))
+ TeMIFRegionDecode (mifFile, pols, index);
+ else if(TeStringCompare(part,"Pline"))
+ TeMIFPlineDecode (mifFile, ls, index);
+ else if (TeStringCompare(part,"Multipoint"))
+ TeMIFMultiPointDecode (mifFile,ps, index);
+ }
+}
diff --git a/src/terralib/functions/TeImportSHP.cpp b/src/terralib/functions/TeImportSHP.cpp
new file mode 100644
index 0000000..cc83e65
--- /dev/null
+++ b/src/terralib/functions/TeImportSHP.cpp
@@ -0,0 +1,882 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+// STL
+#include <string>
+#include <iostream>
+#include <vector>
+#include <list>
+#include <map>
+
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+using namespace std;
+
+// TerraLib
+
+#include "TeImportExport.h"
+#include "TeTable.h"
+#include "TeStdFile.h"
+#include "TeException.h"
+#include "TeUtils.h"
+#include "TeGeometry.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeLayer.h"
+#include "TeProgress.h"
+#include "TeDatabase.h"
+
+
+// from SHAPELIB
+
+#include "shapefil.h"
+
+
+// Internal functions
+bool TeImportSHPGeometries (TeLayer* layer,const string& shpFileName, vector<string> &indexes, unsigned int chunckSize);
+void TeSHPPointDecode (TeLayer*, SHPHandle, vector<string>&, unsigned int);
+void TeSHPPolyLineDecode (TeLayer*, SHPHandle, vector<string>&, unsigned int);
+void TeSHPPolygonDecode (TeLayer*, SHPHandle, vector<string>&, unsigned int);
+
+// Functions to decode one shape
+void TeSHPPointDecode (SHPObject*, TePointSet&, string&);
+void TeSHPPolyLineDecode(SHPObject*, TeLineSet&, string&);
+void TeSHPPolygonDecode (SHPObject*, TePolygonSet&, string&);
+void TeDBFRowDecode (DBFHandle&, int, TeTableRow&);
+
+TeLayer* TeImportShape(const string& shpFileName, TeDatabase* db, const string& layerName)
+{
+ if (!db || shpFileName.empty())
+ return 0;
+
+ // check if format is complete (SHP, SHX e DBF files exist)
+ string filePrefix = TeGetName(shpFileName.c_str());
+ string ftest = filePrefix + ".dbf";
+ if (access(ftest.c_str(),04) == -1)
+ {
+ ftest = filePrefix + ".DBF";
+ if (access(ftest.c_str(),04) == -1)
+ return 0;
+ }
+ ftest = filePrefix + ".shx";
+ if (access(ftest.c_str(),04) == -1)
+ {
+ ftest = filePrefix + ".SHX";
+ if (access(ftest.c_str(),04) == -1)
+ return 0;
+ }
+
+ // found a valid layer name
+ string lName;
+ string baseName = TeGetBaseName(shpFileName.c_str());
+ if (layerName.empty())
+ lName = baseName;
+ else
+ lName = layerName;
+
+ string newLayerName = lName;
+ TeLayerMap& layerMap = db->layerMap();
+ TeLayerMap::iterator it;
+ bool flag = true;
+ int n = 1;
+ while (flag)
+ {
+ for (it = layerMap.begin(); it != layerMap.end(); ++it)
+ {
+ if (TeStringCompare(it->second->name(),newLayerName))
+ break;
+ }
+ if (it == layerMap.end())
+ flag = 0;
+ else
+ newLayerName = lName + "_" +Te2String(n);
+ n++;
+ }
+
+ // find projection
+ TeLayer* newLayer = new TeLayer(newLayerName,db);
+ if (newLayer->id() <= 0 )
+ return 0; // couldn�t create new layer
+
+ bool res = TeImportShape(newLayer,shpFileName);
+ if (res)
+ return newLayer;
+ else
+ {
+ db->deleteLayer(newLayer->id());
+ delete newLayer;
+ return 0;
+ }
+}
+
+bool TeImportShape (TeLayer* layer, const string& shpFileName, string attrTableName,
+ string objectIdAtt, int unsigned chunkSize )
+{
+ string filePrefix = TeGetName(shpFileName.c_str());
+ string shpFileN = filePrefix + ".shp";
+ string dbfFileN = filePrefix + ".dbf";
+
+ SHPHandle hSHP = SHPOpen(shpFileN.c_str(),"rb");
+ if (hSHP == 0)
+ return false;
+
+ DBFHandle hDBF = DBFOpen(dbfFileN.c_str(), "rb");
+ if (hDBF == 0)
+ {
+ SHPClose(hSHP);
+ return false;
+ }
+
+ // Read some information about the shapefile
+ int nShapeType, nEntities;
+ // --- get the shape and decode it
+ double adfMinBound[4], adfMaxBound[4];
+ SHPGetInfo( hSHP, &nEntities, &nShapeType, adfMinBound, adfMaxBound );
+ string shpName = SHPTypeName( nShapeType );
+ if (shpName == "UnknownShapeType")
+ {
+ SHPClose(hSHP);
+ DBFClose(hDBF);
+ return false;
+ }
+
+ if (attrTableName.empty())
+ {
+ if (layer->name().empty())
+ return false;
+ else
+ attrTableName = layer->name();
+ }
+
+ int linkCol=-1;
+ unsigned int j=0;
+ bool autoIndex = false;
+
+ //read the attribute list information
+ TeAttributeList attList;
+ TeReadDBFAttributeList(shpFileName, attList);
+
+ // if no geometry link name is given, creates one called 'object_id_'
+ string ext = "";
+ int count = 0;
+ if (objectIdAtt.empty())
+ {
+ objectIdAtt = "object_id_" + Te2String(layer->id());
+ string s2 = TeConvertToUpperCase(objectIdAtt);
+ while (true)
+ {
+ for (j=0; j<attList.size(); j++)
+ {
+ string s0 = attList[j].rep_.name_;
+ string s1 = TeConvertToUpperCase(s0);
+ if ( s1 == s2)
+ break;
+ }
+ if (j < attList.size())
+ {
+ ++count;
+ objectIdAtt = "object_id_" + Te2String(count);
+ }
+ else
+ break;
+ }
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.numChar_ = 16;
+ at.rep_.name_ = objectIdAtt;
+ at.rep_.isPrimaryKey_ = true;
+ attList.push_back(at);
+ linkCol = attList.size()-1;
+ autoIndex = true;
+ }
+ else
+ {
+ // check if given index is valid
+ TeAttributeList::iterator it = attList.begin();
+ while (it != attList.end())
+ {
+ if (TeConvertToUpperCase((*it).rep_.name_) == TeConvertToUpperCase(objectIdAtt)) // index found
+ {
+ if ((*it).rep_.type_ != TeSTRING) // make sure it is a String type
+ {
+ (*it).rep_.type_ = TeSTRING;
+ (*it).rep_.numChar_ = 16;
+ }
+ (*it).rep_.isPrimaryKey_ = true;
+ linkCol=j;
+ break;
+ }
+ ++it;
+ ++j;
+ }
+ if (it == attList.end()) // index not found
+ {
+ objectIdAtt = "object_id_" + Te2String(layer->id());;
+ while (true)
+ {
+ for (j=0; j<attList.size(); j++)
+ {
+ if (TeConvertToUpperCase(attList[j].rep_.name_) == TeConvertToUpperCase(objectIdAtt))
+ break;
+ }
+ if (j < attList.size())
+ {
+ ++count;
+ objectIdAtt = "object_id_" + Te2String(count);
+ }
+ else
+ break;
+ }
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.numChar_ = 16;
+ at.rep_.name_ = objectIdAtt;
+ at.rep_.isPrimaryKey_ = true;
+ attList.push_back(at);
+ autoIndex = true;
+ }
+ }
+ if (autoIndex)
+ linkCol = attList.size()-1;
+
+ TeTable attTable (attrTableName,attList,objectIdAtt,objectIdAtt,TeAttrStatic);
+ if (!layer->createAttributeTable(attTable)) // create the table in the database
+ return false;
+
+ string objid, value;
+ TePointSet points;
+ TeLineSet lines;
+ TePolygonSet polygons;
+ TeTableRow row;
+ SHPObject* psShape;
+
+ if(TeProgress::instance())
+ {
+ TeProgress::instance()->setTotalSteps(nEntities);
+ TeProgress::instance()->setProgress(j+1);
+ }
+
+ // OBS1: we discard Z and M values when available, because TerraLib
+ // doesn�t have the concept of 3D or measured geometries
+ // OBS2: non identified geometries are mapped to a object_id_
+ // "te_nulo"
+ switch (nShapeType)
+ {
+ // --- null geometries ---
+ case SHPT_NULL: // read only the attributes
+ for (j=0; j<(unsigned int)nEntities; j++)
+ {
+ row.clear();
+ TeDBFRowDecode(hDBF,j,row);
+ if (autoIndex) // --- create automatic index if needed
+ row.push_back(Te2String(j));
+ if (row[linkCol].empty())
+ row[linkCol] = "te_nulo";
+ objid = row[linkCol];
+ attTable.add(row);
+ if ((j%chunkSize) == 0)
+ {
+ layer->saveAttributeTable(attTable);
+ attTable.clear();
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ else
+ TeProgress::instance()->setProgress(j+1);
+ }
+ }
+ }
+ break;
+ // --- point geometries ---
+ case SHPT_POINTZ:
+ case SHPT_MULTIPOINTZ:
+ case SHPT_POINTM:
+ case SHPT_MULTIPOINTM:
+ case SHPT_POINT:
+ case SHPT_MULTIPOINT:
+ for (j=0; j<(unsigned int)nEntities; j++)
+ {
+ row.clear();
+ TeDBFRowDecode(hDBF,j,row);
+ if (autoIndex) // --- create automatic index if needed
+ row.push_back(Te2String(j));
+ if (row[linkCol].empty())
+ row[linkCol] = "te_nulo";
+ objid = row[linkCol];
+ attTable.add(row);
+ psShape = SHPReadObject(hSHP,j);
+ TeSHPPointDecode(psShape,points,objid);
+ SHPDestroyObject(psShape);
+ if ((j%chunkSize) == 0)
+ {
+ layer->addPoints(points);
+ points.clear();
+ layer->saveAttributeTable(attTable);
+ attTable.clear();
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ else
+ TeProgress::instance()->setProgress(j+1);
+ }
+ }
+ }
+ break;
+ // --- line geometries ---
+ case SHPT_ARCZ:
+ case SHPT_ARCM:
+ case SHPT_ARC:
+ for (j=0; j<(unsigned int)nEntities; j++)
+ {
+ row.clear();
+ TeDBFRowDecode(hDBF,j,row);
+ if (autoIndex) // --- create automatic index if needed
+ row.push_back(Te2String(j));
+ if (row[linkCol].empty())
+ row[linkCol] = "te_nulo";
+ objid = row[linkCol];
+ attTable.add(row);
+ psShape = SHPReadObject(hSHP,j);
+ TeSHPPolyLineDecode(psShape,lines,objid);
+ SHPDestroyObject(psShape);
+ if ((j%chunkSize) == 0)
+ {
+ layer->addLines(lines);
+ lines.clear();
+ layer->saveAttributeTable(attTable);
+ attTable.clear();
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ else
+ TeProgress::instance()->setProgress(j+1);
+ }
+ }
+ }
+ break;
+ // --- polygon geometries ---
+ case SHPT_POLYGON:
+ case SHPT_POLYGONM:
+ case SHPT_POLYGONZ:
+ for (j=0; j<(unsigned int)nEntities; j++)
+ {
+ row.clear();
+ TeDBFRowDecode(hDBF,j,row);
+ if (autoIndex) // --- create automatic index if needed
+ row.push_back(Te2String(j));
+ if (row[linkCol].empty())
+ row[linkCol] = "te_nulo";
+ objid = row[linkCol];
+ attTable.add(row);
+ psShape = SHPReadObject(hSHP,j);
+ TeSHPPolygonDecode(psShape,polygons,objid);
+ SHPDestroyObject(psShape);
+ if ((j%chunkSize) == 0)
+ {
+ layer->addPolygons(polygons);
+ polygons.clear();
+ layer->saveAttributeTable(attTable);
+ attTable.clear();
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ else
+ TeProgress::instance()->setProgress(j+1);
+ }
+ }
+
+ }
+ break;
+ default:
+ /* todo: handle multipatch geometries */
+ throw TeException ( UNHANDLED_SHP_TYPE );
+ }
+ if (points.size() > 0)
+ {
+ layer->addPoints(points);
+ points.clear();
+ }
+ if (lines.size() > 0)
+ {
+ layer->addLines(lines);
+ lines.clear();
+ }
+ if (polygons.size() > 0)
+ {
+ layer->addPolygons(polygons);
+ polygons.clear();
+ }
+ if (attTable.size() > 0)
+ {
+ layer->saveAttributeTable(attTable);
+ attTable.clear();
+ }
+ if(TeProgress::instance())
+ TeProgress::instance()->cancel();
+
+ SHPClose(hSHP);
+ DBFClose(hDBF);
+ return true;
+}
+
+void TeDBFRowDecode(DBFHandle& hDBF, int nr, TeTableRow& row)
+{
+ string value;
+ int i;
+ for (i = 0; i < DBFGetFieldCount(hDBF); i++)
+ {
+ value = DBFReadStringAttribute(hDBF,nr,i);
+ row.push_back(value);
+ }
+}
+
+void TeSHPPointDecode(SHPObject* psShape, TePointSet& points, string& objid)
+{
+ int nv = psShape->nVertices;
+ for (int i = 0; i<nv; i++)
+ {
+ TePoint point(psShape->padfX[i], psShape->padfY[i]);
+ point.objectId(objid);
+ points.add(point);
+ }
+}
+
+
+void TeSHPPolyLineDecode(SHPObject* psShape, TeLineSet& lines, string& objid)
+{
+ int iPart,j=0,nextStart=0;
+ for (iPart = 0; iPart < psShape->nParts; iPart++)
+ {
+ if (iPart == psShape->nParts-1)
+ nextStart = psShape->nVertices;
+ else
+ nextStart = psShape->panPartStart[iPart+1];
+
+ TeLine2D line;
+ while (j<nextStart)
+ {
+ TeCoord2D pt ( psShape->padfX[j], psShape->padfY[j] );
+ line.add ( pt );
+ j++;
+ }
+ line.objectId (objid);
+ lines.add ( line );
+ }
+}
+
+void
+TeSHPPolygonDecode(SHPObject* psShape, TePolygonSet& polys, string& objid)
+{
+ int iPart;
+ vector<int> partStart;
+
+ vector<TePolygon> pList;
+ vector<TePolygon>::iterator it;
+ vector<TeLinearRing> holes;
+
+ // Build an array whose components point to the starting point
+ // of the rings that compose the shapepoly
+ for ( iPart = 0; iPart < psShape->nParts; iPart++ )
+ partStart.push_back ( psShape->panPartStart[iPart] );
+ partStart.push_back ( psShape->nVertices ); // point to the end
+
+ iPart = 0;
+ int j = 0;
+ while ( j < psShape->nVertices )
+ {
+ TeLine2D line;
+ iPart++; // while it doesn�t reach the start of next part
+ while ( j < partStart[iPart] ) // Read each ring
+ {
+ TeCoord2D pt ( psShape->padfX[j], psShape->padfY[j] );
+ line.add ( pt );
+ j++;
+ } // end of a ring
+ if (!line.isRing()) // arbitrarily close opened rings
+ line.add(line[0]);
+
+ TeLinearRing ring(line);
+
+ it = pList.begin();
+
+ short orient = TeOrientation(ring);
+
+ if(orient == TeCLOCKWISE) // outer ring?
+ {
+ TePolygon p;
+ p.add(ring);
+ p.objectId(objid);
+ pList.push_back(p);
+ }
+ else // COUNTERCLOCKWISE => inner ring!
+ {
+ holes.push_back(ring);
+ }
+ } // read all vertices
+
+ if(pList.size() == 1)
+ {
+ for(unsigned int i = 0; i < holes.size(); ++i)
+ {
+ pList[0].add(holes[i]);
+ }
+ }
+ else
+ {
+ for(unsigned int i = 0; i < holes.size(); ++i)
+ {
+ TeLinearRing ring = holes[i];
+
+ vector<TePolygon> candidates;
+
+ unsigned int j = 0;
+
+ for(j = 0; j < pList.size(); ++j)
+ {
+ if(TeWithinOrCoveredByOrEquals(ring.box(), pList[j].box()))
+ candidates.push_back(pList[j]);
+ }
+
+ if(candidates.size() == 1)
+ {
+ candidates[0].add(ring);
+ continue;
+ }
+
+ vector<TePolygon> newCandidates;
+
+ for(j = 0; j < candidates.size(); ++j)
+ {
+ short rel = TeBOUNDARY;
+ bool inside = false;
+
+ unsigned int nthVert = ring.size();
+ unsigned int iVert = 0u;
+
+ while(iVert < nthVert)
+ {
+ rel = TeRelation(ring[iVert], candidates[j][0]);
+
+ if(rel & TeINSIDE)
+ {
+
+ inside = true;
+ newCandidates.push_back(candidates[j]);
+ break;
+ }
+ else if(rel & TeOUTSIDE)
+ {
+ break;
+ }
+
+ ++iVert;
+ }
+
+ if(iVert == nthVert)
+ {
+ break;
+ }
+ }
+
+ int idxMinArea = 0;
+ double minArea = TeMAXFLOAT;
+ for(j = 0; j < newCandidates.size(); ++j)
+ {
+ if(TeGeometryArea(newCandidates[j].box()) < minArea)
+ {
+ idxMinArea = j;
+ minArea = TeGeometryArea(newCandidates[j].box());
+ }
+ }
+
+ if(newCandidates.size())
+ newCandidates[idxMinArea].add(ring);
+ }
+ }
+
+ it = pList.begin();
+ while (it != pList.end())
+ {
+ polys.add(*it);
+ ++it;
+ }
+}
+
+void
+TeSHPPointDecode( TeLayer* layer, SHPHandle hSHP, vector<string>& indexVect, unsigned int chunckSize )
+{
+ int nEntities = hSHP->nRecords; // indicates how many point sets are there
+ TePointSet points;
+
+/* -------------------------------------------------------------------- */
+/* Skim over the list of shapes, reading all the vertices. */
+/* -------------------------------------------------------------------- */
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(nEntities);
+
+ int j;
+ for(j= 0; j < nEntities; j++ )
+ {
+ SHPObject* psShape = SHPReadObject( hSHP, j );
+
+ int i;
+ for (i = 0; i < ( psShape->nVertices ); i++ )
+ {
+ TePoint point;
+ TeCoord2D xy ( psShape->padfX[i], psShape->padfY[i] );
+ point.add ( xy );
+ point.objectId ( indexVect[j] );
+ points.add ( point );
+ }
+ // check if there is a chunk of points to be inserted into the database
+ if ( points.size() >= chunckSize )
+ {
+ layer->addPoints( points );
+ points.clear();
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ else
+ TeProgress::instance()->setProgress(j+1);
+ }
+ }
+ SHPDestroyObject( psShape );
+ }
+ layer->addPoints( points );
+ points.clear();
+ if(TeProgress::instance())
+ TeProgress::instance()->setProgress(j+1);
+}
+
+void
+TeSHPPolyLineDecode ( TeLayer*layer, SHPHandle hSHP, vector<string>& indexVect, unsigned int chunckSize )
+{
+ int nEntities = hSHP->nRecords; // indicates how many regions are there
+ TeLineSet lines;
+
+/* -------------------------------------------------------------------- */
+/* Skim over the list of shapes, reading all the vertices. */
+/* -------------------------------------------------------------------- */
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(nEntities);
+
+ int i;
+ for(i = 0; i < nEntities; i++ )
+ {
+ SHPObject* psShape = SHPReadObject( hSHP, i );
+
+ // Build an array whose components point to the starting point
+ // of the rings that compose the shapepoly
+ int iPart;
+ vector<int> partStart;
+
+ // Build an array whose components point to the starting point
+ // of the segments that compose the shapeline
+ //
+ for ( iPart = 0; iPart < psShape->nParts; iPart++ )
+ {
+ partStart.push_back ( psShape->panPartStart[iPart] );
+ }
+ partStart.push_back ( psShape->nVertices ); // point to the end
+
+ iPart = 0;
+
+ int j = 0;
+
+ while ( j < psShape->nVertices )
+ {
+ TeLine2D line;
+
+ iPart++; // indicates the different segments of the line
+ // Read each segment
+ while ( j < partStart[iPart] )
+ {
+ TeCoord2D pt ( psShape->padfX[j], psShape->padfY[j] );
+ line.add ( pt );
+ j++;
+ }
+ // set the geometry Id for the line
+ line.objectId ( indexVect[i] ); // set the object index
+
+ lines.add ( line );
+ }
+
+ // check if there is a chunk of lines to be inserted into the database
+ if ( lines.size() >= chunckSize )
+ {
+ layer->addLines( lines );
+ lines.clear();
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ else
+ TeProgress::instance()->setProgress(i+1);
+ }
+ }
+ SHPDestroyObject( psShape );
+ }
+
+ // saves the remaining lines into the database
+ layer->addLines( lines );
+ lines.clear();
+ if(TeProgress::instance())
+ TeProgress::instance()->setProgress(i+1);
+}
+
+void
+TeSHPPolygonDecode ( TeLayer* layer, SHPHandle hSHP, vector<string>& indexVect, unsigned int chunckSize )
+{
+
+ int nEntities = hSHP->nRecords; // indicates how many regions are there
+ TePolygonSet polys;
+
+/* -------------------------------------------------------------------- */
+/* Skim over the list of shapes, reading all the vertices. */
+/* -------------------------------------------------------------------- */
+ if(TeProgress::instance())
+ TeProgress::instance()->setMessage("Importando poligonos, aguarde... ");
+
+ int i;
+ for(i = 0; i < nEntities; i++ )
+ {
+ SHPObject* psShape = SHPReadObject( hSHP, i );
+
+ int iPart;
+ vector<int> partStart;
+
+ // Auxiliary variables
+
+ list<TePolygon> pList;
+
+ // Build an array whose components point to the starting point
+ // of the rings that compose the shapepoly
+ //
+ for ( iPart = 0; iPart < psShape->nParts; iPart++ )
+ {
+ partStart.push_back ( psShape->panPartStart[iPart] );
+ }
+ partStart.push_back ( psShape->nVertices ); // point to the end
+
+ iPart = 0;
+
+ int j = 0;
+
+ while ( j < psShape->nVertices )
+ {
+ iPart++; // indicates the different rings of the shapepoly
+ TeLine2D line;
+
+ // Read each ring
+ while ( j < partStart[iPart] )
+ {
+ TeCoord2D pt ( psShape->padfX[j], psShape->padfY[j] );
+ line.add ( pt );
+ j++;
+ }
+ // end of a ring
+
+ if (!line.isRing())
+ {
+ line.add(line[0]);
+// throw TeException ( POLYSHAPE_IS_NOT_RING );
+ }
+
+ TeLinearRing ring ( line );
+
+ // Is it an OUTER or an INNER RING ?
+
+ bool inside = false;
+
+ list<TePolygon>::iterator it = pList.begin();
+
+
+ // Each ring is assigned to a polygon
+ // Each ring and polygon have a unique "geometrical index"
+ //
+ // All rings and polygons that are part of a same object
+ // have the same "object index"
+
+ while ( it != pList.end() )
+ {
+ TePolygon aux;
+ aux.add(ring);
+ if ( TeWithin ( aux, (*it)))
+ {
+ inside = true;
+ ring.objectId ( (*it)[0].objectId() ); // sets the object index
+ (*it).add ( ring );// add a closed region
+ break;
+ }
+ ++it;
+ }
+ if ( ! inside )
+ {
+ TePolygon poly;
+ ring.objectId (indexVect[i]);
+
+ // add a pair (objectId, geometryId) to the layer
+ poly.add ( ring ); // add an outer region
+ poly.objectId ( indexVect[i] ); // set the object index
+
+ pList.push_back ( poly );
+ }
+ } // read all vertices
+
+ list<TePolygon>::iterator it = pList.begin();
+
+ while ( it != pList.end() )
+ {
+ polys.add(*it);
+ ++it;
+ }
+ if ( polys.size() >= chunckSize )
+ {
+ layer->addPolygons( polys );
+ polys.clear();
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ else
+ TeProgress::instance()->setProgress(i+1);
+ }
+ }
+ SHPDestroyObject( psShape );
+ } // read all entities
+
+ // save the remaining polygons
+ layer->addPolygons( polys );
+ polys.clear();
+ if(TeProgress::instance())
+ TeProgress::instance()->setProgress(i+1);
+}
+
diff --git a/src/terralib/functions/TeImportSPR.cpp b/src/terralib/functions/TeImportSPR.cpp
new file mode 100644
index 0000000..7a0fdd5
--- /dev/null
+++ b/src/terralib/functions/TeImportSPR.cpp
@@ -0,0 +1,224 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+// STL
+#include <string>
+#include <iostream>
+#include <vector>
+#include <list>
+#include <map>
+
+using namespace std;
+
+// TerraLib
+
+#include "TeImportSPR.h"
+
+#include "TeAsciiFile.h"
+#include "TeBox.h"
+#include "TeLayer.h"
+#include "TeException.h"
+#include "TeUtils.h"
+
+
+void
+TeImportSPR ( TeLayer& layer, const string& fileName )
+{
+
+ TePolygonSet& regions = layer.polygonSet();
+ TeLineSet& lines = layer.lineSet();
+ TePointSet& points = layer.pointSet();
+ TeTextSet& textos = layer.textSet();
+
+/* -------------------------------------------------------------------- */
+/* Open the file. */
+/* -------------------------------------------------------------------- */
+
+ TeAsciiFile pFile (fileName);
+
+ int geomId = 1;
+ int size,nrings;
+
+ string geoId;
+
+/* -------------------------------------------------------------------- */
+/* Get information about the file */
+/* -------------------------------------------------------------------- */
+ string repType = pFile.readString ();
+ pFile.findNewLine();
+
+ if (repType == "POLIGONOS")
+ {
+ layer.addGeometry ( TePOLYGONS );
+ while ( 1 )
+ {
+ TePolygon poly;
+ nrings = pFile.readInt ();
+ if (!pFile.isNotAtEOF())
+ break;
+ geoId = pFile.readString ();
+ poly.objectId ( geoId );
+ int i,j;
+ for (j=0;j<nrings;j++)
+ {
+ TeLine2D line;
+ size = pFile.readInt ();
+ pFile.findNewLine();
+ for (i=0;i<size;i++)
+ {
+// Build the polygon
+ TeCoord2D xy = pFile.readCoord2D ();
+ line.add ( xy );
+ }
+ TeLinearRing ring (line);
+ ring.geomId ( geomId );
+ poly.add ( ring );
+ geomId++;
+ }
+ regions.add ( poly );
+ }
+ layer.setBox ( regions.box() );
+ }
+ if (repType == "LINHAS" || repType == "LINES")
+ {
+ TeDatum sad69 = TeDatumFactory::make("SAD69");
+ TeProjection* proj = new TeUtm ( sad69 , -39.*TeCDR);
+ layer.setProjection(proj);
+ string infoend;
+ char separator = ';';
+ while (infoend != "INFO_END" && pFile.isNotAtEOF())
+ infoend = pFile.readString ();
+ layer.addGeometry ( TeLINES );
+ while ( 1 )
+ {
+ geoId = pFile.readString ();
+ if (!pFile.isNotAtEOF())
+ break;
+ int i;
+ TeLine2D line;
+ size = pFile.readInt ();
+ pFile.findNewLine();
+ for (i=0;i<size;i++)
+ {
+// Build the line
+ TeCoord2D xy = pFile.readCoord2D ();
+ line.add ( xy );
+ }
+ line.objectId ( geoId );
+ line.geomId ( geomId );
+ geomId++;
+ lines.add ( line );
+ }
+ layer.setBox ( lines.box() );
+ }
+ if (repType == "POINT2D")
+ {
+ TeDatum sad69 = TeDatumFactory::make("SAD69");
+ TeProjection* proj = new TeUtm ( sad69 , -39.*TeCDR);
+ layer.addGeometry ( TePOINTS );
+ string infoend;
+ char separator = ';';
+ while (infoend != "INFO_END" && pFile.isNotAtEOF())
+ infoend = pFile.readString ();
+ pFile.findNewLine();
+ try
+ {
+ while ( pFile.isNotAtEOF() )
+ {
+ double x,y;
+ char rotulo [128], lixo[4];
+ string input = pFile.readLine();
+ if (!pFile.isNotAtEOF() || input == "END")
+ break;
+ sscanf (input.c_str (), "%lf %s %lf %s %s",&x, lixo, &y, lixo, rotulo);
+ geoId = rotulo;
+
+// Build the point
+ TePoint point;
+ TeCoord2D xy (x,y);
+// xy = proj->PC2LL (xy);
+// TeCoord2D xyd (xy.x()*TeCRD,xy.y()*TeCRD);
+ point.add ( xy );
+ point.objectId ( geoId );
+// point.geomId ( geomId );
+ points.add ( point );
+ geomId++;
+ }
+ }
+ catch (...)
+ {
+ }
+ layer.setBox ( points.box() );
+ }
+ if (repType == "TEXT")
+ {
+ TeDatum sad69 = TeDatumFactory::make("SAD69");
+ TeProjection* proj = new TeUtm ( sad69 , -39.*TeCDR);
+ layer.setProjection(proj);
+ layer.addGeometry ( TeTEXT );
+ string infoend;
+ char separator = ';';
+ while (infoend != "INFO_END" && pFile.isNotAtEOF())
+ infoend = pFile.readString ();
+ pFile.findNewLine();
+ try
+ {
+ while ( pFile.isNotAtEOF() )
+ {
+ double x,y,ang,exp,hgt;
+// char rotulo [128], lixo[4];
+// string input = pFile.readLine();
+// if (!pFile.isNotAtEOF() || input == "END")
+// break;
+// sscanf (input.c_str (), "%lf %s %lf %1s %s %s %lf %s %lf %s %lf %s",
+// &x, lixo, &y, lixo, rotulo, lixo, &ang, lixo, &exp, lixo, &hgt);
+ x = pFile.readFloatCSV(separator);
+ if (!pFile.isNotAtEOF() || x == 0.0)
+ break;
+ y = pFile.readFloatCSV(separator);
+ string rotulo = pFile.readStringCSV(separator);
+ ang = pFile.readFloatCSV(separator);
+ exp = pFile.readFloatCSV(separator);
+ hgt = pFile.readFloatCSV(separator);
+
+// Build the point
+ TeText texto;
+ TeCoord2D xy (x,y);
+// xy = proj->PC2LL (xy);
+// TeCoord2D xyd (xy.x()*TeCRD,xy.y()*TeCRD);
+ TeCoord2D xyd (x,y);
+ texto.add ( xyd );
+ texto.objectId ( geoId );
+ texto.setText ( rotulo );
+ texto.setAngle ( ang );
+ texto.setHeight ( hgt );
+ textos.add ( texto );
+ pFile.findNewLine();
+ }
+ }
+ catch (...)
+ {
+ }
+ layer.setBox ( textos.box() );
+ }
+}
diff --git a/src/terralib/functions/TeImportSPR.h b/src/terralib/functions/TeImportSPR.h
new file mode 100644
index 0000000..64e3608
--- /dev/null
+++ b/src/terralib/functions/TeImportSPR.h
@@ -0,0 +1,18 @@
+/***************************************************************************
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+***************************************************************************/
+#ifndef Te_SPR_H
+#define Te_SPR_H
+#include <string>
+using namespace std;
+
+class TeLayer;
+
+void TeImportSPR ( TeLayer& layer, const string& fileName );
+
+#endif
\ No newline at end of file
diff --git a/src/terralib/functions/TeLayerFunctions.cpp b/src/terralib/functions/TeLayerFunctions.cpp
new file mode 100644
index 0000000..f71ecba
--- /dev/null
+++ b/src/terralib/functions/TeLayerFunctions.cpp
@@ -0,0 +1,660 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeLayerFunctions.h"
+#include "TeImportRaster.h"
+#include "TeProgress.h"
+#include "TeRaster.h"
+
+
+bool TeCopyThemeToLayer(TeTheme* inTheme, TeLayer* outLayer,
+ int selObj, map<string,string> *txtTable)
+{
+ if (!inTheme || !outLayer)
+ return false;
+
+ TeLayer* inLayer = inTheme->layer();
+
+ // both projection should be valid
+ // do not allow only one NoProjection
+ TeProjection* pfrom = TeProjectionFactory::make(inTheme->layer()->projection()->params());
+ TeProjection* pto = TeProjectionFactory::make(outLayer->projection()->params());
+ TeDatabasePortal* portal = inLayer->database()->getPortal();
+ if (!portal)
+ {
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+
+ string sql;
+ bool res = false;
+ if (inLayer->hasGeometry(TeRASTER))
+ {
+ TeRepresentation* rep = inLayer->getRepresentation(TeRASTER);
+ sql = "SELECT object_id FROM " + rep->tableName_;
+ if (portal->query(sql))
+ {
+ string objid;
+ TeRasterParams par;
+ TeRaster* rst;
+ while (portal->fetchRow())
+ {
+ objid = portal->getData(0);
+ rst = inLayer->raster(objid);
+ par = rst->params();
+ res = TeImportRaster(outLayer,rst,par.blockWidth_,par.blockHeight_,par.compression_[0],
+ objid,par.dummy_[0],par.useDummy_,par.tiling_type_);
+ }
+ }
+
+ outLayer->database()->insertMetadata(outLayer->tableName(TeRASTER),"BLOCK_BOX", 0.0005,0.0005,outLayer->box());
+ outLayer->database()->createSpatialIndex(outLayer->tableName(TeRASTER),"BLOCK_BOX", (TeSpatialIndexType)TeRTREE);
+ portal->freeResult();
+ }
+
+
+ // this SQL selects instances of objects according to input, so it uses te_collection_aux
+ string inputInst;
+
+ // this SQL selects objects according to input, so it uses te_collection
+ string inputObj;
+ if(selObj == 1) // queried
+ {
+ inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 2";
+ inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 3)";
+ inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 2";
+ inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 3)";
+ }
+ else if(selObj == 2) // pointed
+ {
+ inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 1";
+ inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 3)";
+ inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 1";
+ inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 3)";
+ }
+ else if(selObj == 3) // not queried
+ {
+ inputObj = "(" + inTheme->collectionTable() + ".c_object_status <> 2";
+ inputObj += " AND " + inTheme->collectionTable() + ".c_object_status <> 3)";
+ inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status <> 2";
+ inputInst += " AND " + inTheme->collectionAuxTable() + ".grid_status <> 3)";
+ }
+ else if(selObj == 4) // not pointed
+ {
+ inputObj = "(" + inTheme->collectionTable() + ".c_object_status <> 1";
+ inputObj += " AND " + inTheme->collectionTable() + ".c_object_status <> 3)";
+ inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status <> 1";
+ inputInst += " AND " + inTheme->collectionAuxTable() + ".grid_status <> 3)";
+ }
+ else if(selObj == 5) // pointed and queried
+ {
+ inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 3)";
+ inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 3)";
+ }
+ else if(selObj == 6) // pointed or queried
+ {
+ inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 2";
+ inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 1";
+ inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 3)";
+ inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 2";
+ inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 1";
+ inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 3)";
+ }
+
+ if (!res)
+ {
+ // Initally test if there is any object selected
+ sql = "SELECT c_object_id FROM " + inTheme->collectionTable();
+ if (!inputObj.empty())
+ sql += " WHERE " + inputObj;
+ if (!portal->query(sql))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return true;
+ }
+ portal->freeResult();
+ }
+
+ unsigned int n = 1;
+ if (inLayer->hasGeometry(TePOINTS))
+ {
+ sql = "SELECT " + inLayer->tableName(TePOINTS) + ".* FROM ";
+ sql += inLayer->tableName(TePOINTS) + ", " + inTheme->collectionTable();
+ sql += " WHERE object_id = c_object_id";
+ if (!inputObj.empty())
+ sql += " AND " + inputObj;
+
+ if (!portal->query(sql))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ if (portal->fetchRow())
+ TeCopyPortalGeometriesToLayer<TePointSet>(portal,pfrom,outLayer);
+ portal->freeResult();
+
+ outLayer->database()->insertMetadata(outLayer->tableName(TePOINTS),"SPATIAL_DATA", 0.0005,0.0005,outLayer->box());
+ outLayer->database()->createSpatialIndex(outLayer->tableName(TePOINTS),"SPATIAL_DATA", (TeSpatialIndexType)TeRTREE);
+ }
+
+ if (inLayer->hasGeometry(TeLINES))
+ {
+ sql = "SELECT " + inLayer->tableName(TeLINES) + ".* FROM ";
+ sql += inLayer->tableName(TeLINES) + ", " + inTheme->collectionTable();
+ sql += " WHERE object_id = c_object_id";
+ if (!inputObj.empty())
+ sql += " AND " + inputObj;
+ sql += " ORDER BY ext_max DESC";
+
+ if (!portal->query(sql))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ if (portal->fetchRow())
+ TeCopyPortalGeometriesToLayer<TeLineSet>(portal,pfrom,outLayer);
+ portal->freeResult();
+
+ outLayer->database()->insertMetadata(outLayer->tableName(TeLINES),"SPATIAL_DATA", 0.0005,0.0005,outLayer->box());
+ outLayer->database()->createSpatialIndex(outLayer->tableName(TeLINES),"SPATIAL_DATA", (TeSpatialIndexType)TeRTREE);
+ }
+ if (inLayer->hasGeometry(TePOLYGONS))
+ {
+ sql = "SELECT " + inLayer->tableName(TePOLYGONS) + ".* FROM ";
+ sql += inLayer->tableName(TePOLYGONS) + ", " + inTheme->collectionTable();
+ sql += " WHERE object_id = c_object_id";
+ if (!inputObj.empty())
+ sql += " AND " + inputObj;
+
+ if (inLayer->database()->dbmsName() != "OracleSpatial")
+ sql += " ORDER BY object_id ASC, parent_id ASC, num_holes DESC";
+ else
+ sql += " ORDER BY object_id ASC";
+
+ if (!portal->query(sql))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ if (portal->fetchRow())
+ TeCopyPortalGeometriesToLayer<TePolygonSet>(portal,pfrom,outLayer);
+ portal->freeResult();
+
+ outLayer->database()->insertMetadata(outLayer->tableName(TePOLYGONS),"SPATIAL_DATA", 0.0005,0.0005,outLayer->box());
+ outLayer->database()->createSpatialIndex(outLayer->tableName(TePOLYGONS),"SPATIAL_DATA", (TeSpatialIndexType)TeRTREE);
+ }
+
+ if (inLayer->hasGeometry(TeCELLS))
+ {
+ sql = "SELECT " + inLayer->tableName(TeCELLS) + ".* FROM ";
+ sql += inLayer->tableName(TeCELLS) + ", " + inTheme->collectionTable();
+ sql += " WHERE object_id = c_object_id";
+ if (!inputObj.empty())
+ sql += " AND " + inputObj;
+
+ if (!portal->query(sql))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ if (portal->fetchRow())
+ TeCopyPortalGeometriesToLayer<TeCellSet>(portal,pfrom,outLayer);
+ portal->freeResult();
+
+ outLayer->database()->insertMetadata(outLayer->tableName(TeCELLS),"SPATIAL_DATA", 0.0005,0.0005,outLayer->box());
+ outLayer->database()->createSpatialIndex(outLayer->tableName(TeCELLS),"SPATIAL_DATA", (TeSpatialIndexType)TeRTREE);
+ }
+
+ if (inLayer->hasGeometry(TeTEXT))
+ {
+ unsigned int j;
+ vector<string> textTables;
+ vector<string> textDescr;
+ string selrep = "SELECT geom_table, description FROM te_representation WHERE layer_id = " + Te2String(inLayer->id());
+ selrep += " AND geom_type = " + Te2String(TeTEXT);
+ if (portal->query(selrep))
+ {
+ while(portal->fetchRow())
+ {
+ textTables.push_back(portal->getData(0));
+ textDescr.push_back(portal->getData(1));
+ }
+ }
+ portal->freeResult();
+
+ int k=1;
+ for (j=0; j<textTables.size(); j++)
+ {
+ string newTextTable = textTables[j] + "_1";
+ while (inLayer->database()->tableExist(newTextTable))
+ {
+ k++;
+ newTextTable = textTables[j] + "_" + Te2String(k);
+ }
+ sql = "SELECT " + textTables[j] + ".* FROM ";
+ sql += textTables[j] + ", " + inTheme->collectionTable();
+ sql += " WHERE object_id = c_object_id";
+ if(inputObj.empty() == false)
+ sql += " AND " + inputObj;
+ if (!portal->query(sql))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ if (portal->fetchRow())
+ {
+ if (!outLayer->addGeometry(TeTEXT,newTextTable,textDescr[j]))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ TeCopyPortalGeometriesToLayer<TeTextSet>(portal,pfrom,outLayer,newTextTable);
+ if (txtTable)
+ {
+ (*txtTable)[textTables[j]] = newTextTable;
+ }
+ }
+ portal->freeResult();
+ }
+ }
+
+ delete pfrom;
+ delete pto;
+ portal->freeResult();
+
+ TeAttrTableVector attributeTables;
+ inTheme->getAttTables(attributeTables);
+ sql = "SELECT table_id FROM te_theme_table WHERE theme_id = ";
+ bool hasExternal = false;
+ sql += Te2String(inTheme->id()) + " AND relation_id > 0";
+ if (portal->query(sql) && portal->fetchRow())
+ hasExternal = true;
+ portal->freeResult();
+
+ for (unsigned int i=0; i<attributeTables.size(); i++)
+ {
+ TeTable table = attributeTables[i];
+ if ((table.tableType() == TeAttrExternal) || table.attributeList().size() <= 0)
+ continue;
+
+ TeAttributeList attListIn = table.attributeList();
+ table.setId(-1);
+ n = 1;
+ string tname = table.name();
+ string tlinkqueattr = table.linkName();
+ while (true)
+ {
+ if (!outLayer->database()->tableExist(tname))
+ break;
+ n++;
+ tname = table.name() + "_" + Te2String(n);
+ }
+ string tfrom = table.name();
+ table.name(tname);
+ if (outLayer->createAttributeTable(table))
+ {
+ string fieldsIn;
+ string fieldsOut;
+ vector<string> attNamesIn;
+ vector<string> attNamesOut;
+ table.attributeNames(attNamesOut);
+ for (n=0;n<attNamesOut.size()-1; n++)
+ {
+ fieldsOut += attNamesOut[n] + ",";
+ fieldsIn += tfrom + "." + attListIn[n].rep_.name_ + ",";
+ }
+ fieldsOut += attNamesOut[n];
+ fieldsIn += tfrom + "." + attListIn[n].rep_.name_;
+
+ if (!hasExternal) // table might have temporal instances
+ {
+ sql = "SELECT " + fieldsIn + " ";
+ sql += inTheme->sqlGridFrom();
+ if (!inputInst.empty())
+ sql += " WHERE " + inputInst;
+ }
+ else // table doesn�t have temporal instances
+ {
+ sql = "SELECT " + fieldsIn + " FROM " + tfrom;
+ sql += ", " + inTheme->collectionTable() + " WHERE ";
+ sql += tfrom + "." + tlinkqueattr + "=" + inTheme->collectionTable() + ".c_object_id";
+ if (!inputObj.empty())
+ sql += " AND " + inputObj;
+ }
+
+ if (inLayer->database() == outLayer->database())
+ {
+ string popule = "INSERT INTO " + table.name() + " ( " + fieldsOut + ") " + sql;
+ inLayer->database()->execute(popule);
+ }
+ else
+ {
+ if (portal->query(sql))
+ {
+ int nr = 0;
+ while (portal->fetchRow())
+ {
+ TeTableRow row;
+ for(int i = 0; i < portal->numFields(); i++)
+ row.push_back(portal->getData(i));
+ table.add(row);
+ nr++;
+ if (nr % 100)
+ {
+ outLayer->saveAttributeTable(table);
+ table.clear();
+ nr = 0;
+ }
+ }
+ if (table.size() >0)
+ outLayer->saveAttributeTable(table);
+ table.clear();
+ }
+ }
+ }
+ }
+ delete portal;
+ return true;
+}
+
+
+bool TeCopyLayerToLayer(TeLayer* inLayer, TeLayer* outLayer, map<string,string> *txtTable)
+{
+ if (!inLayer || !outLayer)
+ return false;
+
+ // both projection should be valid
+ // do not allow only one NoProjection
+ TeProjection* pfrom = TeProjectionFactory::make(inLayer->projection()->params());
+ TeProjection* pto = TeProjectionFactory::make(outLayer->projection()->params());
+ if (!pfrom || !pto || (pfrom->name() == "NoProjection" || pto->name() == "NoProjection") &&
+ !(pfrom->name() == pto->name()))
+ {
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ TeDatabasePortal* portal = inLayer->database()->getPortal();
+ if (!portal)
+ {
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+
+ string sql;
+ bool res;
+ if (inLayer->hasGeometry(TeRASTER))
+ {
+ TeRepresentation* rep = inLayer->getRepresentation(TeRASTER);
+ sql = "SELECT object_id FROM " + rep->tableName_;
+ if (portal->query(sql))
+ {
+ string objid;
+ TeRasterParams par;
+ TeRaster* rst;
+ while (portal->fetchRow())
+ {
+ objid = portal->getData(0);
+ rst = inLayer->raster(objid);
+ par = rst->params();
+ res = TeImportRaster(outLayer,rst,par.blockWidth_,par.blockHeight_,par.compression_[0],
+ objid,par.dummy_[0],par.useDummy_,par.tiling_type_);
+ }
+ }
+ portal->freeResult();
+ }
+
+ unsigned int n = 1;
+ if (inLayer->hasGeometry(TePOINTS))
+ {
+ sql = "SELECT " + inLayer->tableName(TePOINTS) + ".* FROM ";
+ sql += inLayer->tableName(TePOINTS);
+ if (!portal->query(sql))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ if (portal->fetchRow())
+ TeCopyPortalGeometriesToLayer<TePointSet>(portal,pfrom,outLayer);
+ portal->freeResult();
+ }
+
+ if (inLayer->hasGeometry(TeLINES))
+ {
+ sql = "SELECT " + inLayer->tableName(TeLINES) + ".* FROM ";
+ sql += inLayer->tableName(TeLINES);
+ sql += " ORDER BY ext_max DESC";
+
+ if (!portal->query(sql))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ if (portal->fetchRow())
+ TeCopyPortalGeometriesToLayer<TeLineSet>(portal,pfrom,outLayer);
+ portal->freeResult();
+ }
+ if (inLayer->hasGeometry(TePOLYGONS))
+ {
+ sql = "SELECT " + inLayer->tableName(TePOLYGONS) + ".* FROM ";
+ sql += inLayer->tableName(TePOLYGONS);
+ if (inLayer->database()->dbmsName() != "OracleSpatial")
+ sql += " ORDER BY object_id ASC, parent_id ASC, num_holes DESC";
+ else
+ sql += " ORDER BY object_id ASC";
+
+ if (!portal->query(sql))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ if (portal->fetchRow())
+ TeCopyPortalGeometriesToLayer<TePolygonSet>(portal,pfrom,outLayer);
+ portal->freeResult();
+ }
+
+ if (inLayer->hasGeometry(TeCELLS))
+ {
+ sql = "SELECT " + inLayer->tableName(TeCELLS) + ".* FROM ";
+ sql += inLayer->tableName(TeCELLS) ;
+
+ if (!portal->query(sql))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ if (portal->fetchRow())
+ TeCopyPortalGeometriesToLayer<TeCellSet>(portal,pfrom,outLayer);
+ portal->freeResult();
+ }
+ if (inLayer->hasGeometry(TeTEXT))
+ {
+ unsigned int j;
+ vector<string> textTables;
+ vector<string> textDescr;
+ string selrep = "SELECT geom_table, description FROM te_representation WHERE layer_id = " + Te2String(inLayer->id());
+ selrep += " AND geom_type = " + Te2String(TeTEXT);
+ if (portal->query(selrep))
+ {
+ while(portal->fetchRow())
+ {
+ textTables.push_back(portal->getData(0));
+ textDescr.push_back(portal->getData(1));
+ }
+ }
+ portal->freeResult();
+
+ int k=1;
+ for (j=0; j<textTables.size(); j++)
+ {
+ string newTextTable = textTables[j] + "_1";
+ while (inLayer->database()->tableExist(newTextTable))
+ {
+ k++;
+ newTextTable = textTables[j] + "_" + Te2String(k);
+ }
+ sql = "SELECT " + textTables[j] + ".* FROM ";
+ sql += textTables[j] ;
+ if (!portal->query(sql))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+
+ if (portal->fetchRow())
+ {
+ if (!outLayer->addGeometry(TeTEXT,newTextTable,textDescr[j]))
+ {
+ delete portal;
+ delete pfrom;
+ delete pto;
+ return false;
+ }
+ TeCopyPortalGeometriesToLayer<TeTextSet>(portal,pfrom,outLayer,newTextTable);
+ if (txtTable)
+ {
+ (*txtTable)[textTables[j]] = newTextTable;
+ }
+ }
+ portal->freeResult();
+ }
+ }
+ delete pfrom;
+ delete pto;
+ portal->freeResult();
+
+ vector<TeTable> attributeTables;
+ inLayer->getAttrTables(attributeTables);
+ for (unsigned int i=0; i<attributeTables.size(); i++)
+ {
+ TeTable table = attributeTables[i];
+ if (table.attributeList().size() <= 0)
+ continue;
+
+ TeAttributeList attListIn = table.attributeList();
+ table.setId(-1);
+ n = 1;
+ string tname = table.name();
+ while (true)
+ {
+ if (!outLayer->database()->tableExist(tname))
+ break;
+ n++;
+ tname = table.name() + "_" + Te2String(n);
+ }
+ string tfrom = table.name();
+ table.name(tname);
+ if (outLayer->createAttributeTable(table))
+ {
+ if (inLayer->database() == outLayer->database())
+ {
+ string fieldsIn;
+ string fieldsOut;
+ vector<string> attNamesIn;
+ vector<string> attNamesOut;
+ table.attributeNames(attNamesOut);
+ for (n=0;n<attNamesOut.size()-1; n++)
+ {
+ fieldsOut += "`" + attNamesOut[n] + "`,";
+ fieldsIn += attListIn[n].rep_.name_ + ",";
+ }
+ fieldsOut += "`" + attNamesOut[n]+ "`";
+ fieldsIn += attListIn[n].rep_.name_;
+
+ sql = "SELECT " + fieldsIn + " FROM " + tfrom;
+ string popule = "INSERT INTO " + table.name() + " ( " + fieldsOut + ") " + sql;
+ inLayer->database()->execute(popule);
+ }
+ else
+ {
+ portal->freeResult();
+ sql = "SELECT * FROM " + tfrom;
+ if (portal->query(sql))
+ {
+ int nr = 0;
+ while (portal->fetchRow())
+ {
+ TeTableRow row;
+ for(int i = 0; i < portal->numFields(); i++)
+ {
+ if (table.attributeList()[i].rep_.type_== TeDATETIME)
+ {
+ TeTime t = portal->getDate(i);
+ string temp = t.getDateTime(table.attributeList()[i].dateTimeFormat_,table.attributeList()[i].dateSeparator_, table.attributeList()[i].timeSeparator_);
+ row.push_back(temp);
+ }
+ else
+ row.push_back(portal->getData(i));
+ }
+ table.add(row);
+ nr++;
+ if (nr % 100)
+ {
+ outLayer->saveAttributeTable(table);
+ table.clear();
+ nr = 0;
+ }
+ }
+ if (table.size() >0)
+ outLayer->saveAttributeTable(table);
+ table.clear();
+ }
+ }
+ }
+ }
+ delete portal;
+ return true;
+}
diff --git a/src/terralib/functions/TeLayerFunctions.h b/src/terralib/functions/TeLayerFunctions.h
new file mode 100644
index 0000000..5db328c
--- /dev/null
+++ b/src/terralib/functions/TeLayerFunctions.h
@@ -0,0 +1,197 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeLayerFunctions.h
+ This file contains functions to deal with layers
+*/
+#ifndef __TERRALIB_INTERNAL_LAYERFUNCTIONS_H
+#define __TERRALIB_INTERNAL_LAYERFUNCTIONS_H
+
+#include "TeLayer.h"
+#include "TeVectorRemap.h"
+#include "TeTheme.h"
+#include "TeDatabase.h"
+#include "TeProgress.h"
+
+
+//! Imports a geometry set to a layer, creating an empty attribute table
+/*!
+ This function imports a geometry set to a layer.
+ An attribute table is automatically created with only the object_id field.
+ If geometries don�t have object ids a unique identification will be automatically generated
+ \param layer pointer to a layer previously created
+ \param geomSet the geometry set
+ \return TRUE or FALSE whether the geometry set was imported successfully
+*/
+template <class G>
+bool TeImportGeometriesToLayer(TeLayer* layer, G& geomSet)
+{
+ if (!layer)
+
+ return false;
+
+ TeDatabase* db = layer->database();
+ int nTab = 0;
+ TeAttrTableVector attTables;
+ if (layer->getAttrTables(attTables))
+ nTab = attTables.size();
+
+ string tabName = "AttributeTable_" + Te2String(layer->id()) + "_" + Te2String(nTab);
+ TeAttributeList attList;
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.numChar_ = 16;
+ at.rep_.name_ = "object_id";
+ at.rep_.isPrimaryKey_ = true;
+ attList.push_back(at);
+
+ TeTable attTable(tabName,attList,"object_id", "object_id",TeAttrStatic);
+
+ TeTableRow row;
+ for (int i=0; i<geomSet.size(); i++)
+ {
+ row.clear();
+ string id = geomSet[i].objectId();
+ if (id.empty())
+ {
+ id = Te2String(i);
+ geomSet[i].objectId(id);
+ }
+ row.push_back(id);
+ attTable.add(row);
+ }
+
+ if (!layer->addGeometrySet(geomSet))
+ {
+ attTable.clear();
+ db->deleteLayer(layer->id());
+ return false;
+ }
+
+ if (!layer->createAttributeTable(attTable))
+ {
+ attTable.clear();
+ db->deleteLayer(layer->id());
+ return false;
+ }
+
+ if (!layer->saveAttributeTable(attTable))
+ {
+ attTable.clear();
+ db->deleteLayer(layer->id());
+ return false;
+ }
+
+ attTable.clear();
+ return true;
+}
+
+//! Copy the geometries retrieved in a portal to layer
+/*
+ \param portal pointer to a portal that has executed a query for geometries
+ \param proj pointer to the projection associated to the geometries
+ \param layer pointer to the destination layer
+ \param tname optional parameter indicating the name of a table to store the geometries
+*/
+template<typename GS>
+GS*
+TeCopyPortalGeometriesToLayer(TeDatabasePortal* portal, TeProjection* proj, TeLayer* layer, const string& tName="")
+{
+ if (!portal ||!layer)
+ return 0;
+
+ TeProjection* pfrom = TeProjectionFactory::make(proj->params());
+ TeProjection* pto = TeProjectionFactory::make(layer->projection()->params());
+ bool doRemap;
+ if (!pfrom || !pto || (pfrom->name() == "NoProjection" || pto->name() == "NoProjection") &&
+ !(pfrom->name() == pto->name()))
+ doRemap = false;
+ else
+ doRemap= !(*pfrom == *pto);
+
+ if (doRemap)
+ pfrom->setDestinationProjection(pto);
+
+ if (TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(portal->numRows());
+
+ GS set1;
+ int n = 1;
+ bool flag=false;
+ do
+ {
+ typename GS::value_type elemI;
+ flag = portal->fetchGeometry(elemI);
+ if (doRemap)
+ {
+ typename GS::value_type elemO;
+ TeVectorRemap(elemI,pfrom,elemO,pto);
+ elemO.objectId(elemI.objectId());
+ set1.add(elemO);
+ }
+ else
+ set1.add(elemI);
+
+ if (((n%100) == 0) || !flag)
+ {
+ layer->addGeometrySet(set1,tName);
+ set1.clear();
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ else
+ TeProgress::instance()->setProgress(n);
+ }
+ }
+ n++;
+ } while (flag);
+ delete pfrom;
+ delete pto;
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ return 0;
+}
+
+//! This function fills a layer with the objects selected in a theme
+/*
+ \param inTheme pointer to the source theme
+ \param outLayer pointer to the destination layer (already created)
+ \param selObj flag to indicate with objects of the theme should be copied.
+ \param txtTable pointer to a map<string,string> to return the old and
+ new names of the text tables
+*/
+bool TeCopyThemeToLayer(TeTheme* inTheme, TeLayer* outLayer,
+ int selObj, map<string,string> *txtTable=0);
+
+//! This function copies a layer to another
+/*
+ \param inLayer pointer to the source theme
+ \param outLayer pointer to the destination layer (already created)
+ \param txtTable pointer to a map<string,string> to return the old and
+ new names of the text tables
+*/
+bool TeCopyLayerToLayer(TeLayer* inLayer, TeLayer* outLayer, map<string,string> *txtTable=0);
+
+#endif
diff --git a/src/terralib/functions/TeMIFProjection.cpp b/src/terralib/functions/TeMIFProjection.cpp
new file mode 100644
index 0000000..0175a7c
--- /dev/null
+++ b/src/terralib/functions/TeMIFProjection.cpp
@@ -0,0 +1,340 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include <map>
+#include <string>
+#include "TeMIFProjection.h"
+#include "TeDatum.h"
+#include "TeProjection.h"
+#include "TeException.h"
+#include "TeUtils.h"
+
+using namespace std;
+/*---
+Projection Information
+
+contains information about the parameters
+needed by each projection
+
+parameters are:
+
+- Name
+- Datum
+- Units
+- Origin Longitude,
+- Origin Latitude,
+- Standard Paralel 1
+- Standard Paralel 2
+- Scale Factor
+- False Easting
+- False Northing
+- Range
+
+---*/
+
+const int NUM_MIF_PROJ = 7;
+const int NUM_MIF_DATUM = 19;
+const int NUM_MIF_UNITS = 13;
+
+
+// Name Units Long Lat Par1 Par2 Sca Eas Nor
+char* mifProjInfo[]= {
+"LatLong", "0", "0", "0", "0", "0", "0", "0", "0",
+"Albers", "1", "1", "1", "1", "1", "0", "1", "1",
+"LambertConformal", "1", "1", "1", "1", "1", "0", "1", "1",
+"Mercator", "1", "1", "0", "0", "0", "0", "0", "0",
+"Miller", "1", "1", "0", "0", "0", "0", "0", "0",
+"UTM", "1", "1", "1", "0", "0", "1", "1", "1",
+"Polyconic", "1", "1", "1", "1", "0", "0", "1", "1"
+};
+
+char* mifProjCode[]= {
+"1", "LatLong",
+"3", "LambertConformal",
+"8", "UTM",
+"9", "Albers",
+"10", "Mercator",
+"11", "Miller",
+"27", "Polyconic"
+};
+
+char* mifDatumCode[] = {
+"0", "Spherical",
+"23", "Astro-Chua",
+"24", "CorregoAlegre",
+"40", "Indian",
+"41", "Indian",
+"62", "NAD27",
+"63", "NAD27",
+"64", "NAD27",
+"65", "NAD27",
+"66", "NAD27",
+"67", "NAD27",
+"68", "NAD27",
+"69", "NAD27",
+"70", "NAD27",
+"71", "NAD27",
+"72", "NAD27",
+"74", "NAD83",
+"92", "SAD69",
+"104", "WGS84"
+};
+
+char* mifUnitsCode[] = {
+"6", "Centimeters",
+"31", "Chains",
+"3", "Feet",
+"2", "Inches",
+"1", "Kilometers",
+"30", "Links",
+"7", "Meters",
+"0", "Miles",
+"5", "Millimeters",
+"9", "Nautical Miles",
+"32", "Rods",
+"8", "US Survey Feet",
+"4", "Yards"
+};
+
+
+
+// Definitions for types used
+typedef map<int,string> NameMap;
+typedef map<int, string> MIFCodeMap;
+
+// Prototypes for aux functions
+
+TeProjInfo TeMIFProjectionInfo ( const string& projName );
+TeDatum TeMIFProjectionDatum ( const int& datCode );
+string TeMIFProjectionName ( const int& prjCode );
+string TeMIFProjectionUnits ( const int& unitsCode );
+
+
+TeProjection*
+TeMIFProjectionFactory::make ( vector<string>& argList )
+{
+ // Create a TerraLib projection from MIF information]
+ // INPUT - a list of parameters
+
+ int argInd = 0;
+
+ TeProjectionParams params;
+ params.hemisphere = TeSOUTH_HEM;
+
+ // Step 1 - read the projection name
+
+ int projCode = atoi( argList[argInd++].c_str() );
+
+ params.name = TeMIFProjectionName ( projCode );
+
+ // Step 2 - read the datum
+
+ int datumCode = atoi( argList[argInd++].c_str() );
+ TeProjInfo pjInfo;
+ try
+ {
+ params.datum = TeMIFProjectionDatum ( datumCode );
+ // Step 3 - Build a map of Projection info
+ pjInfo = TeMIFProjectionInfo ( params.name );
+ }
+ catch (...)
+ {
+ TeProjection* nproj = new TeNoProjection();
+ return nproj;
+ }
+
+ // Step 4 - Read the appropriate parameters
+
+ if ( pjInfo.hasUnits )
+ {
+ string unitsName = argList[argInd++];
+ string unitsName2 = TeRemoveSpecialChars(unitsName);
+ if (unitsName2 == "m" || unitsName2 == "M")
+ unitsName2 = "Meters";
+ params.units = unitsName2;
+ }
+ else
+ params.units = "DecimalDegrees";
+
+ string val;
+ if ( pjInfo.hasLon0 )
+ {
+ val = argList[argInd++].c_str();
+ params.lon0 = atof(val.c_str())*TeCDR;
+ }
+
+ if ( pjInfo.hasLat0 )
+ {
+ val = argList[argInd++].c_str();
+ params.lat0 = atof(val.c_str())*TeCDR;
+ }
+
+ if ( pjInfo.hasStlat1 )
+ {
+ val = argList[argInd++].c_str();
+ params.stlat1 = atof(val.c_str())*TeCDR;
+ }
+
+ if ( pjInfo.hasStlat2 )
+ {
+ val = argList[argInd++].c_str();
+ params.stlat2 = atof(val.c_str())*TeCDR;
+ }
+
+ if ( pjInfo.hasScale )
+ {
+ val = argList[argInd++].c_str();
+ params.scale = atof(val.c_str());
+ }
+
+ if ( pjInfo.hasOffx )
+ {
+ val = argList[argInd++].c_str();
+ params.offx = atof(val.c_str());
+ }
+
+ if ( pjInfo.hasOffy )
+ {
+ val = argList[argInd++].c_str();
+ params.offy = atof(val.c_str());
+ }
+
+ // Step 4 - create the projection
+
+ return TeProjectionFactory::make ( params );
+}
+
+
+TeProjInfo
+TeMIFProjectionInfo ( const string& projName )
+{
+
+ TeProjInfoMap pjMap;
+ TeProjInfo pjInfo;
+
+ int k = 0;
+
+ for ( int i = 0; i < NUM_MIF_PROJ; i++ )
+ {
+ string name = mifProjInfo [k++];
+
+ pjInfo.hasUnits = atoi ( mifProjInfo [k++] );
+ pjInfo.hasLon0 = atoi ( mifProjInfo [k++] );
+ pjInfo.hasLat0 = atoi ( mifProjInfo [k++] );
+ pjInfo.hasStlat1 = atoi ( mifProjInfo [k++] );
+ pjInfo.hasStlat2 = atoi ( mifProjInfo [k++] );
+ pjInfo.hasScale = atoi ( mifProjInfo [k++] );
+ pjInfo.hasOffx = atoi ( mifProjInfo [k++] );
+ pjInfo.hasOffy = atoi ( mifProjInfo [k++] );
+
+ pjMap [ name ] = pjInfo;
+ }
+
+
+ TeProjInfoMap::iterator it = pjMap.find ( projName );
+
+ if ( it == pjMap.end() )
+ throw TeException ( PROJECTION_NOT_AVAILABLE );
+
+return (*it).second;
+}
+
+TeDatum
+TeMIFProjectionDatum ( const int& datCode )
+{
+
+ MIFCodeMap datumCode;
+
+ int k= 0;
+
+ for ( int i = 0; i < NUM_MIF_DATUM; i++ )
+ {
+ int code = atoi ( mifDatumCode [k++] );
+ string name = mifDatumCode [k++];
+
+ datumCode [ code ] = name;
+ }
+
+ MIFCodeMap::iterator it = datumCode.find ( datCode );
+
+ if ( it == datumCode.end() )
+ throw TeException ( DATUM_ERROR );
+
+ string datName = (*it).second;
+
+ return TeDatumFactory::make ( datName );
+
+}
+
+string
+TeMIFProjectionName ( const int& prjCode )
+{
+
+ MIFCodeMap projCode;
+
+ int k= 0;
+
+ for ( int i = 0; i < NUM_MIF_PROJ; i++ )
+ {
+ int code = atoi ( mifProjCode [k++] );
+ string name = mifProjCode [k++];
+
+ projCode [ code ] = name;
+ }
+
+ MIFCodeMap::iterator it = projCode.find ( prjCode );
+
+ if ( it == projCode.end() )
+ throw TeException ( PROJECTION_NOT_AVAILABLE );
+
+return (*it).second;
+
+}
+
+string
+TeMIFProjectionUnits ( const int& code )
+{
+ MIFCodeMap unitsCode;
+
+ int k= 0;
+
+ for ( int i = 0; i < NUM_MIF_UNITS; i++ )
+ {
+ int code = atoi ( mifUnitsCode [k++] );
+ string name = mifUnitsCode [k++];
+
+ unitsCode [ code ] = name;
+ }
+
+ MIFCodeMap::iterator it = unitsCode.find ( code );
+
+ if ( it == unitsCode.end() )
+ return "Meters";
+
+return (*it).second;
+
+}
diff --git a/src/terralib/functions/TeMIFProjection.h b/src/terralib/functions/TeMIFProjection.h
new file mode 100644
index 0000000..d05764c
--- /dev/null
+++ b/src/terralib/functions/TeMIFProjection.h
@@ -0,0 +1,39 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_MIFPROJECTION_H
+#define __TERRALIB_INTERNAL_MIFPROJECTION_H
+
+#include <vector>
+#include <string>
+using namespace std;
+
+class TeProjection;
+//! A factory to build projection from some MIF parameters stored in a vector of strings
+class TeMIFProjectionFactory
+{
+public:
+ static TeProjection* make ( vector<string>& );
+};
+#endif
+
diff --git a/src/terralib/functions/TeSPRFile.cpp b/src/terralib/functions/TeSPRFile.cpp
new file mode 100644
index 0000000..266ad67
--- /dev/null
+++ b/src/terralib/functions/TeSPRFile.cpp
@@ -0,0 +1,310 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeSPRFile.h"
+#include "TeAssertions.h"
+#include "TeDefines.h"
+#include "TeProjection.h"
+#include "TeDatum.h"
+#include "TeUtils.h"
+#include "TeDataTypes.h"
+
+TeSPRFile::TeSPRFile ( const string& name, const char* mode, char separator):
+ TeAsciiFile ( name, mode )
+{
+ separator_ = separator;
+}
+
+void
+TeSPRFile::writeLabelHeader ( const int& option )
+{
+ if (option == TeSPRNetwork)
+ fprintf(file_,"%s\n", "NETWORK_OBJECTS" );
+ else
+ fprintf(file_,"%s\n", "POINTS" );
+ fprintf(file_,"%s\n", "INFO");
+ fprintf(file_,"%s %c \n", "SEPARATOR ", separator_ );
+ fprintf(file_,"%s\n", "// SPRING Interchange File" );
+
+ if (option == TeSPRThematic)
+ fprintf(file_,"%s \n", "// Format coordx ; coordy ; classe");
+ else
+ fprintf(file_,"%s \n", "// Format coordx ; coordy ; label ; name ; category_obj");
+ fprintf(file_,"%s\n", "INFO_END");
+}
+
+
+void
+TeSPRFile::writeCadastralLabel ( const string& geoid, const double& x, const double& y,
+ const string& objectCategory)
+{
+ if (geoid != "")
+ {
+ fprintf ( file_, "%.10E %c %.10E %c %s %c %s %c %s \n",
+ (float)x, separator_, (float)y, separator_, geoid.c_str(), separator_, geoid.c_str(), separator_, objectCategory.c_str() );
+ }
+}
+
+void
+TeSPRFile::writeThematicLabel( const double& x, const double& y, const string& theme )
+{
+ if ( theme != "")
+ fprintf ( file_, "%.10E %c %.10E %c %s \n",
+ (float)x, separator_, (float)y, separator_, theme.c_str() );
+}
+
+void
+TeSPRFile::writeNetworkLabel ( const string& geoid, const double& x, const double& y,
+ const string& objectCategory)
+{
+ if (geoid != "")
+ {
+ fprintf ( file_, "%.10E %c %.10E %c %s %c %s %c %s %c LINES\n",
+ (float)x, separator_, (float)y, separator_, geoid.c_str(), separator_, geoid.c_str(), separator_, objectCategory.c_str(), separator_ );
+ }
+
+}
+
+
+void
+TeSPRFile::writeThematicPoint( const double& x, const double& y, const string& theme )
+{
+ if ( theme != "")
+ fprintf ( file_, "%.10E %c %.10E %c %s \n",
+ (float)x, separator_, (float)y, separator_, theme.c_str() );
+ else
+ fprintf ( file_, "%.10E %c %.10E %c Nenhuma \n",
+ (float)x, separator_, (float)y, separator_ );
+
+}
+
+
+void
+TeSPRFile::writeProjection( TeProjection* proj )
+{
+ if (proj)
+ {
+ fprintf ( file_, "PROJECTION %s/%s\n", proj->name().c_str(),proj->datum().name().c_str());
+ }
+}
+
+void
+TeSPRFile::writeBox( TeBox& box )
+{
+ TeCoord2D pt1 = box.lowerLeft();
+ TeCoord2D pt2 = box.upperRight();
+
+ fprintf ( file_, "%s %.10E %.10E %.10E %.10E \n", "BOX", pt1.x(), pt1.y(), pt2.x(), pt2.y());
+ fprintf ( file_, "%s\n", "// " );
+}
+
+//===================================================
+//
+// Write lines header information
+//
+//===================================================
+
+void
+TeSPRFile::writeLinesHeader ()
+{
+ fprintf(file_,"%s\n", "LINES" );
+ fprintf(file_,"%s\n", "INFO");
+ fprintf(file_,"%s\n", "// SPRING Interchange File" );
+}
+
+
+
+//===================================================
+//
+// TeSPRPoints- Write points header information
+//
+//===================================================
+
+void
+TeSPRFile::writePointsHeader ()
+{
+ fprintf(file_,"%s\n", "POINT2D" );
+ fprintf(file_,"%s\n", "INFO");
+ fprintf(file_,"%s %c \n", "SEPARATOR ", separator_ );
+ fprintf(file_,"%s\n", "// SPRING Interchange File" );
+}
+
+//===================================================
+//
+// TeSPRTable - Write TABLE information
+//
+//===================================================
+
+void
+TeSPRFile::writeTableHeader (const int& /* dType */)
+{
+ fprintf(file_,"%s\n", "TABLE" );
+ fprintf(file_,"%s\n", "INFO");
+ fprintf(file_,"%s\n", "// SPRING Interchange File" );
+ fprintf(file_,"%s %c\n", "SEPARATOR ", separator_ );
+ fprintf(file_,"%s\n", "UNFORMATED ");
+
+ }
+
+void
+TeSPRFile::writeAttributeInfo( TeAttributeList& attList, const string& objCategory,
+ const string& indexName )
+{
+ fprintf(file_,"%s\n", "// Attribute Information" ); // Write basic attribute info
+ fprintf (file_, "%s %s \n", "CATEGORY_OBJ", objCategory.c_str() );
+ fprintf (file_, "%s%c%s%c%s%c%s \n", "T_KEY", separator_, "TEXT", separator_, "32", separator_, "0");
+ fprintf (file_, "%s%c%s%c%s%c%s \n", "T_NAME", separator_, "TEXT", separator_, "32", separator_, "0");
+
+ TeAttributeList::iterator it = attList.begin();
+
+ for ( ;it != attList.end();++it )
+ {
+ string name = (*it).rep_.name_;
+ if ( TeConvertToUpperCase(name) == TeConvertToUpperCase(indexName) ) continue; // skip the index name
+ switch ((*it).rep_.type_)
+ {
+ case TeSTRING:
+ this->writeTextParameterInfo(name, (*it).rep_.numChar_);
+ break;
+ case TeREAL:
+ this->writeRealParameterInfo(name);
+ break;
+ case TeINT:
+ this->writeIntParameterInfo(name);
+ break;
+ case TeCHARACTER:
+ this->writeTextParameterInfo(name,1);
+ break;
+ case TeDATETIME:
+ this->writeTextParameterInfo(name,25);
+ default:
+ break;
+ }
+ }
+}
+void
+TeSPRFile::writeTextParameterInfo ( const string& name, int w )
+{
+
+ char sprName [TeNAME_LENGTH];
+
+ int width = w;
+ if ( w == 0 )
+ width = name.size();
+
+ TeConvertToUpperCase ( name, sprName );
+
+ fprintf ( file_, "%s%c%s%c%d%c%d \n", sprName, separator_, "TEXT", separator_, width, separator_, 0 );
+}
+
+void
+TeSPRFile::writeRealParameterInfo ( const string& name )
+{
+ char sprName [TeNAME_LENGTH];
+
+ TeConvertToUpperCase ( name, sprName );
+
+ fprintf ( file_, "%s%c%s%c%d%c%d \n", sprName, separator_, "REAL", separator_, 17, separator_,8 );
+}
+
+void
+TeSPRFile::writeIntParameterInfo ( const string& name )
+{
+ char sprName [TeNAME_LENGTH];
+
+ TeConvertToUpperCase ( name, sprName );
+
+ fprintf ( file_, "%s%c%s%c%d%c%d \n", sprName, separator_, "INTEGER", separator_, 10, separator_, 0 );
+}
+
+void
+TeSPRFile::writeValue ( const string& value, TeAttrDataType type )
+{
+ switch ( type )
+ {
+ case TeINT :
+ writeValue ( atoi ( value.c_str()) );
+ break;
+ case TeREAL :
+ writeValue ( atof ( value.c_str()) );
+ break;
+ default :
+ writeValue ( value );
+ }
+
+}
+
+
+//===================================================
+//
+// Write SAMPLE information
+//
+//===================================================
+
+void
+TeSPRFile::writeSampleHeader ()
+{
+ fprintf(file_,"%s\n", "SAMPLE" );
+ fprintf(file_,"%s\n", "INFO");
+ fprintf(file_,"%s %c \n", "SEPARATOR ", separator_ );
+ fprintf(file_,"%s\n", "// SPRING Interchange File" );
+}
+
+
+void
+TeSPRFile::writeSample( const string& /* geoid */, const double& x,
+ const double& y, const string& value)
+{
+ fprintf ( file_, "%s \n", "POINT3D" );
+ fprintf ( file_, "%.10E %c %.10E %c %s \n", x, separator_, y, separator_, value.c_str() );
+ fprintf ( file_, "%s \n", "END" );
+}
+
+//===================================================
+//
+// Write NETWORK information
+//
+//===================================================
+
+
+void
+TeSPRFile::writeNetworkHeader()
+{
+ fprintf(file_,"%s\n", "NETWORK" );
+ fprintf(file_,"%s\n", "INFO");
+ fprintf(file_,"%s\n", "// SPRING Interchange File" );
+}
+
+
+void
+TeSPRFile::writeArcHeader ( const string& geoid, const double& posImp,
+ const double& negImp, const double& demand)
+{
+ fprintf ( file_, "%s %.10E %.10E %.10E \n", geoid.c_str(), posImp, negImp, demand );
+}
+
+
diff --git a/src/terralib/functions/TeSPRFile.h b/src/terralib/functions/TeSPRFile.h
new file mode 100644
index 0000000..67dadc6
--- /dev/null
+++ b/src/terralib/functions/TeSPRFile.h
@@ -0,0 +1,185 @@
+/************************************************************************************
+ TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_SPRFILE_H
+#define __TERRALIB_INTERNAL_SPRFILE_H
+
+#include "TeAsciiFile.h"
+#include "TeDataTypes.h"
+#include "TeCoord2D.h"
+#include "TeAttribute.h"
+#include "TeProjection.h"
+
+#include <string>
+#include <stdio.h>
+using namespace std;
+
+//! Provides support for writing SPRING/ASCII files
+class TeSPRFile : public TeAsciiFile
+{
+public:
+
+ //! Contructors
+
+ TeSPRFile(const string& fileName, const char* mode, char separator = ';');
+
+ //! Destructor
+
+ virtual ~TeSPRFile() {} //! base class
+
+ //! LINES - write header
+ void writeLinesHeader ();
+
+ //! LINES 3D - write header
+ void writeLine3DHeader()
+ { fprintf ( file_,"LINE3D\n"); }
+
+ //! LINES - write Coord
+ void writeCoord ( const double& x, const double& y )
+ { fprintf ( file_," %.10E %.10E\n", x, y ); }
+
+ //! LABELS - write Header
+ void writeLabelHeader ( const int& option );
+
+ //! LABELS - write Value
+ void writeCadastralLabel ( const string& geoid, const double& x, const double& y,
+ const string& objectCategory = "");
+
+ //! NETWORK - write labels
+ void writeNetworkLabel ( const string& geoid, const double& x, const double& y,
+ const string& objectCategory);
+
+ //! LABELS - write Theme
+ void writeThematicLabel( const double& x, const double& y, const string& theme );
+
+ //! POINTS - write a classified point
+ void writeThematicPoint( const double& x, const double& y, const string& theme );
+
+ //! POINTS - write Header
+ void writePointsHeader();
+
+ //! POINTS 3D - write Header
+ void writePoint3DHeader()
+ { fprintf ( file_,"POINT3D\n"); }
+
+ //! POINTS 3D - write Value
+ void writePoint3D( const double& x, const double& y, const double& quote )
+ { fprintf ( file_," %.10E %.10E %.10E\n", x, y, quote ); }
+
+ //! POINTS - write Value
+ void writePoint ( TeCoord2D& p )
+ { this->writeCoord ( p.x(), p.y() ); }
+
+ //! NETWORK - write Header
+ void writeNetworkHeader();
+
+ //! NETWORK - write arc header
+ void writeArcHeader ( const string& geoid, const double& posImp = 0.,
+ const double& negImp= 0., const double& demand = 0. );
+
+ //! NETWORK - write Lines Header
+ void writeNetworkLineHeader(int id )
+ { fprintf ( file_,"%d 1 1 0.0\n", id ); }
+
+ //! NETWORK - write Label Header
+ void writeNetworkLabelHeader();
+
+ //! TABLE - write Header
+ void writeTableHeader( const int& dType );
+
+ //! TABLE - write attribute information
+ void writeAttributeInfo ( TeAttributeList&, const string&, const string& indexName = "" );
+
+ //! TABLE - write text parameter
+ void writeTextParameterInfo ( const string& name, int w = 0);
+
+ //! TABLE - write real parameter
+ void writeRealParameterInfo ( const string& );
+
+ //! TABLE - write int parameter
+ void writeIntParameterInfo ( const string& );
+
+ //! TABLE - write geoId
+ void writeGeoId ( const string& geoid )
+ { fprintf ( file_, "%s%c%s", geoid.c_str(), separator_, geoid.c_str() ); }
+
+ //! TABLE - write attribute name
+ void writeValue ( const string& attrName, TeAttrDataType type );
+
+ //! TABLE - write int value
+ void writeValue ( const int& value )
+ { fprintf ( file_, "%c%d", separator_, value ); }
+
+ //! TABLE - write double value
+ void writeValue ( const double& value )
+ { fprintf ( file_, "%c%.10E", separator_, (float)value ); }
+
+ //! TABLE - write string
+ void writeValue ( const string& value )
+ { fprintf ( file_, "%c%s", separator_,value.c_str() ); }
+
+ //! SAMPLE - write Header
+ void writeSampleHeader();
+
+ //! SAMPLE - write value
+ void writeSample ( const string& index, const double& x, const double& y,
+ const string& value);
+
+ //! SAMPLE - write quote
+ void writeSampleQuote( double quote )
+ { fprintf ( file_,"HEIGHT %.10E\n", quote ); }
+
+ //! INFO - write projection
+ void writeProjection ( TeProjection* );
+
+ //! INFO - write Box
+ void writeBox ( TeBox& );
+
+ //! INFO - write InfoEND
+ void writeInfoEnd ()
+ { fprintf ( file_, "%s\n", "INFO_END"); }
+
+ //! GENERAL - write END
+ void writeEnd ()
+ { fprintf ( file_, "%s \n", "END" ); }
+
+ //! Sets the separator
+ void setSeparator ( const char& c )
+ { separator_ = c ; }
+
+ //! Returns the separator
+ char separator ()
+ { return separator_; }
+
+//! No copy allowed
+
+private:
+
+ TeSPRFile(const TeSPRFile&);
+ TeSPRFile& operator=(const TeSPRFile&){return *this;}
+ char separator_;
+
+};
+
+#endif
+
diff --git a/src/terralib/functions/TeSTEFunctionsSHP.cpp b/src/terralib/functions/TeSTEFunctionsSHP.cpp
new file mode 100644
index 0000000..eb0a880
--- /dev/null
+++ b/src/terralib/functions/TeSTEFunctionsSHP.cpp
@@ -0,0 +1,214 @@
+#include "TeSTEFunctionsSHP.h"
+#include "TeSTElementSet.h"
+#include <vector>
+
+#include "shapefil.h"
+
+bool TeDecodeShape(SHPObject* psShape, TePointSet& ps,const string& objectId);
+bool TeDecodeShape(SHPObject* psShape, TeLineSet& ps,const string& objectId);
+bool TeDecodeShape(SHPObject* psShape, TePolygonSet& ps,const string& objectId);
+
+bool TeDecodeShape(SHPObject* psShape, TeMultiGeometry& geomestries, const string& objectId)
+{
+ int shpType = psShape->nSHPType;
+ switch (shpType)
+ {
+ case SHPT_POLYGON:
+ case SHPT_POLYGONZ:
+ return TeDecodeShape(psShape,geomestries.polygons_,objectId);
+ case SHPT_ARC:
+ case SHPT_ARCZ:
+ return TeDecodeShape(psShape,geomestries.lines_,objectId);
+ case SHPT_POINT:
+ case SHPT_POINTZ:
+ case SHPT_MULTIPOINT:
+ case SHPT_MULTIPOINTZ:
+ return TeDecodeShape(psShape,geomestries.points_,objectId);
+ }
+ return false;
+}
+
+bool TeReadDBFAttributeList(const string& dbfFileName, TeAttributeList& attList);
+
+bool
+TeSTOSetBuildSHP(TeSTElementSet& stoset, const string& fileName)
+{
+ // Read some information about the shapefile
+ string filePrefix = TeGetName(fileName.c_str());
+ string shpfileName = filePrefix + ".shp";
+
+ SHPHandle hSHP;
+ hSHP = SHPOpen( shpfileName.c_str(), "rb" );
+
+ if( hSHP == 0 )
+ return false;
+
+ int nShapeType, nEntities;
+ double adfMinBound[4], adfMaxBound[4];
+
+ SHPGetInfo(hSHP, &nEntities, &nShapeType, adfMinBound, adfMaxBound);
+
+ string dbffileName = filePrefix + ".dbf";
+ DBFHandle hDBF = DBFOpen( dbffileName.c_str(), "rb" );
+ if( hDBF == 0 || DBFGetFieldCount(hDBF) == 0)
+ return false;
+
+ int natt = DBFGetFieldCount(hDBF);
+ TeAttributeList attList;
+ TeReadDBFAttributeList(shpfileName, attList);
+
+ TeAttributeRep repobjid;
+ repobjid.name_ = "object_id";
+ repobjid.numChar_ = 16;
+
+ TeAttribute attobjid;
+ attobjid.rep_ = repobjid;
+
+ TeProperty propobjid;
+ propobjid.attr_ = attobjid;
+
+ int i,n;
+ SHPObject* psShape;
+ for (i=0; i<nEntities; i++)
+ {
+ string objectid = Te2String(i);
+ TeSTInstance curObj;
+ curObj.objectId(objectid);
+ TeSTElement objInstances;
+ objInstances.objectId(objectid);
+
+ TePropertyVector prop;
+ psShape = SHPReadObject(hSHP,i);
+ if (TeDecodeShape(psShape,curObj.geometries(),objectid))
+ {
+ propobjid.value_ = objectid;
+ prop.push_back(propobjid);
+ for(n=0;n<natt;n++)
+ {
+ string value = DBFReadStringAttribute(hDBF,i,n);
+ TeProperty p;
+ p.attr_ = attList[n];
+ p.value_ = value;
+ prop.push_back(p);
+ }
+ curObj.properties(prop);
+ objInstances.insertSTInstance(curObj);
+ stoset.insertSTElement(objInstances);
+ curObj.theme(0);
+ }
+ SHPDestroyObject(psShape);
+ }
+ return true;
+}
+
+bool TeDecodeShape(SHPObject* psShape, TePointSet& points,const string& objectId)
+{
+ int i;
+ for (i = 0; i < ( psShape->nVertices ); i++ )
+ {
+ TePoint point;
+ TeCoord2D xy ( psShape->padfX[i], psShape->padfY[i] );
+ point.add ( xy );
+ point.objectId(objectId);
+ points.add ( point );
+ }
+ return (i > 0);
+}
+
+bool TeDecodeShape(SHPObject* psShape, TeLineSet& lines, const string& objectId)
+{
+ vector<int> partStart;
+ int iPart;
+ for (iPart = 0; iPart < psShape->nParts; iPart++ )
+ partStart.push_back ( psShape->panPartStart[iPart] );
+ partStart.push_back ( psShape->nVertices ); // point to the end
+
+ iPart = 0;
+ int j = 0;
+ while ( j < psShape->nVertices )
+ {
+ TeLine2D line;
+
+ iPart++; // indicates the different segments of the line
+ while ( j < partStart[iPart] ) // Read each segment
+ {
+ TeCoord2D pt ( psShape->padfX[j], psShape->padfY[j] );
+ line.add ( pt );
+ j++;
+ }
+ line.objectId(objectId);
+ lines.add(line);
+ }
+ return (iPart > 0);
+
+}
+
+bool TeDecodeShape(SHPObject* psShape, TePolygonSet& polys, const string& objectId)
+{
+ int iPart, j;
+ vector<int> partStart;
+ list<TePolygon> pList;
+
+ // Build an array whose components point to the starting point
+ // of the rings that compose the shapepoly
+ for ( iPart = 0; iPart < psShape->nParts; iPart++ )
+ partStart.push_back ( psShape->panPartStart[iPart] );
+ partStart.push_back ( psShape->nVertices ); // point to the end
+
+ iPart = 0;
+ j = 0;
+ while ( j < psShape->nVertices )
+ {
+ iPart++; // indicates the different rings of the shapepoly
+ TeLine2D line;
+ while ( j < partStart[iPart] ) // Read each ring
+ {
+ TeCoord2D pt ( psShape->padfX[j], psShape->padfY[j] );
+ line.add ( pt );
+ j++;
+ } // end of a ring
+ if (!line.isRing())
+ line.add(line[0]);
+
+ TeLinearRing ring(line);
+ bool inside = false; // Is it an OUTER or an INNER RING ?
+
+ list<TePolygon>::iterator it = pList.begin();
+ // Each ring is assigned to a polygon
+ // Each ring and polygon have a unique "geometrical index"
+ //
+ // All rings and polygons that are part of a same object
+ // have the same "object index"
+
+ while ( it != pList.end() )
+ {
+ TePolygon aux;
+ aux.add(ring);
+ if (TeWithin(aux,(*it)))
+ {
+ inside = true;
+ ring.objectId ( (*it)[0].objectId() ); // sets the object index
+ (*it).add ( ring ); // add a closed region
+ break;
+ }
+ ++it;
+ }
+ if (!inside)
+ {
+ TePolygon poly;
+ ring.objectId (objectId);
+ poly.add(ring); // add an outer region
+ poly.objectId(objectId); // set the object index
+
+ pList.push_back ( poly );
+ }
+ }
+ list<TePolygon>::iterator it = pList.begin();
+ while ( it != pList.end() )
+ {
+ polys.add(*it);
+ ++it;
+ }
+ return (iPart > 0);
+}
+
diff --git a/src/terralib/functions/TeSTEFunctionsSHP.h b/src/terralib/functions/TeSTEFunctionsSHP.h
new file mode 100644
index 0000000..4f20954
--- /dev/null
+++ b/src/terralib/functions/TeSTEFunctionsSHP.h
@@ -0,0 +1,41 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef TeSpaceTimeObjectBuilderSHP_H
+#define TeSpaceTimeObjectBuilderSHP_H
+
+#include <string>
+
+class TeSTElementSet;
+
+using namespace std;
+
+//! Builds the spatial object set from database according to the restrictions previously defined
+/*!
+ \param stoset the STOSet that will be filled
+ \param fileName shape file name
+*/
+bool TeSTOSetBuildSHP(TeSTElementSet& stoset, const string& fileName);
+
+#endif
+
diff --git a/src/terralib/functions/TeSimilarity.cpp b/src/terralib/functions/TeSimilarity.cpp
new file mode 100644
index 0000000..f26354a
--- /dev/null
+++ b/src/terralib/functions/TeSimilarity.cpp
@@ -0,0 +1,73 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeMatrix.h"
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+double
+SmallestOf (double a, double b, double c)
+{
+ double smallest = a;
+
+ if (b < smallest) smallest = b;
+ if (c < smallest) smallest = c;
+ return smallest;
+}
+
+double
+TeSimilarity (const char *streetname, const char *rotuloname)
+{
+ short Del = 1, Ins = 1, Sub = 1;
+ double a, b, c;
+ short i, j;
+ int m = strlen(streetname) + 1;
+ int n = strlen(rotuloname) + 1;
+ TeMatrix T;
+ if( T.Init(m,n) == false)
+ return -1.;
+
+ T(0,0) = 0;
+
+ for (j = 1; j<n; j++)
+ T(0,j) = T(0, j-1) + Ins;
+
+ for (i = 1; i<m; i++)
+ T(i,0) = T(i-1,0) + Del;
+
+ for (i = 1; i<m; i++)
+ for (j = 1; j<n; j++)
+ {
+ if (toupper(streetname[i-1]) == toupper(rotuloname[j-1]))
+ a = T(i-1,j-1);
+ else
+ a = T(i-1,j-1) + Sub;
+ b = T(i,j-1) + Ins;
+ c = T(i-1,j) + Del;
+ T(i,j) = SmallestOf(a, b, c);
+ }
+
+ double perc = (1.0 - (T(m-1,n-1) / (double)(n-1))) * 100.0;
+ return perc;
+}
diff --git a/src/terralib/functions/TeThemeFunctions.cpp b/src/terralib/functions/TeThemeFunctions.cpp
new file mode 100644
index 0000000..a35775d
--- /dev/null
+++ b/src/terralib/functions/TeThemeFunctions.cpp
@@ -0,0 +1,170 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#include "TeTheme.h"
+#include "TeDatabase.h"
+
+
+bool TeCreateThemeFromTheme(TeTheme* inTheme, const string& newThemeName, int selObj, TeTheme* newTheme)
+{
+ // if no source theme or not a name for the new theme
+ if (!inTheme || newThemeName.empty())
+ return false;
+
+ // if there no pointer theme was passed create a new instance
+ if (!newTheme)
+ newTheme = new TeTheme();
+
+ // builds a valid theme name
+ TeDatabase* curDb = inTheme->layer()->database();
+ string validThemeName = newThemeName;
+ int i=1;
+ while (curDb->themeExist(validThemeName))
+ {
+ validThemeName = newThemeName + "_" + Te2String(i);
+ i++;
+ }
+
+ // create new theme with the same definitions of the input theme
+ newTheme->id(0);
+ newTheme->name(validThemeName);
+ newTheme->layer(inTheme->layer());
+ newTheme->setAttTables(inTheme->attrTables());
+ curDb->viewMap()[inTheme->view()]->add(newTheme);
+ newTheme->visibleRep(inTheme->visibleRep());
+
+ // save its definition in the database
+ if (!newTheme->save())
+ {
+ delete newTheme;
+ newTheme = 0;
+ }
+
+ // this is a patch around TeTheme::save(). Auxiliary collection table is created
+ // with field "unique_id" of type auto-number. It has to be string.
+ TeAttribute at;
+ at.rep_.name_ = "unique_id";
+ at.rep_.type_ = TeSTRING;
+ at.rep_.numChar_ = 100;
+ at.rep_.isAutoNumber_ = false;
+ at.rep_.isPrimaryKey_ = true;
+ if (!curDb->alterTable(newTheme->collectionAuxTable(), at.rep_))
+ {
+ curDb->deleteTheme(newTheme->id());
+ delete newTheme;
+ return 0;
+ }
+
+ // if its a theme of raster data there's nothing else to be done
+ if (inTheme->layer()->hasGeometry(TeRASTER))
+ return false;
+
+ // this SQL selects instances of objects according to input, so it uses te_collection_aux
+ string inputInst;
+
+ // this SQL selects objects according to input, so it uses te_collection
+ string inputObj;
+ if(selObj == TeSelectedByPointing) // queried
+ {
+ inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 2";
+ inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 3)";
+ inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 2";
+ inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 3)";
+ }
+ else if(selObj == 2) // pointed
+ {
+ inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 1";
+ inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 3)";
+ inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 1";
+ inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 3)";
+ }
+ else if(selObj == 3) // not queried
+ {
+ inputObj = "(" + inTheme->collectionTable() + ".c_object_status <> 2";
+ inputObj += " AND " + inTheme->collectionTable() + ".c_object_status <> 3)";
+ inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status <> 2";
+ inputInst += " AND " + inTheme->collectionAuxTable() + ".grid_status <> 3)";
+ }
+ else if(selObj == 4) // not pointed
+ {
+ inputObj = "(" + inTheme->collectionTable() + ".c_object_status <> 1";
+ inputObj += " AND " + inTheme->collectionTable() + ".c_object_status <> 3)";
+ inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status <> 1";
+ inputInst += " AND " + inTheme->collectionAuxTable() + ".grid_status <> 3)";
+ }
+ else if(selObj == 5) // pointed and queried
+ {
+ inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 3)";
+ inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 3)";
+ }
+ else if(selObj == 6) // pointed or queried
+ {
+ inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 2";
+ inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 1";
+ inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 3)";
+ inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 2";
+ inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 1";
+ inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 3)";
+ }
+
+ // fills collection table from the selection requested
+ string sql = "INSERT INTO " + newTheme->collectionTable() + " ( ";
+ sql += " c_object_id, c_legend_id, label_x, label_y, c_legend_own, c_object_status ) ";
+ sql += " SELECT * FROM " + inTheme->collectionTable() + " WHERE " + inputObj;
+ if (!curDb->execute(sql))
+ {
+ curDb->deleteTheme(newTheme->id());
+ return false;
+ }
+ // sets theme objects settings to default
+ sql = "UPDATE " + newTheme->collectionTable() + " SET c_legend_id = 0";
+ if (!curDb->execute(sql))
+ {
+ curDb->deleteTheme(newTheme->id());
+ return false;
+ }
+ sql = "UPDATE " + newTheme->collectionTable() + " SET c_object_status = 0";
+ if (!curDb->execute(sql))
+ {
+ curDb->deleteTheme(newTheme->id());
+ return false;
+ }
+
+ // fills auxiliary collection table from the selection requested
+ sql = "INSERT INTO " + newTheme->collectionAuxTable() + " ( ";
+ sql += " object_id, unique_id, grid_status ) ";
+ sql += " SELECT * FROM " + inTheme->collectionAuxTable() + " WHERE " + inputInst;
+ if (!curDb->execute(sql))
+ {
+ curDb->deleteTheme(newTheme->id());
+ return false;
+ }
+ sql = "UPDATE " + newTheme->collectionAuxTable() + " SET grid_status = 0";
+ if (!curDb->execute(sql))
+ {
+ curDb->deleteTheme(newTheme->id());
+ return false;
+ }
+ return true;
+}
+
+
diff --git a/src/terralib/functions/TeThemeFunctions.h b/src/terralib/functions/TeThemeFunctions.h
new file mode 100644
index 0000000..cec422f
--- /dev/null
+++ b/src/terralib/functions/TeThemeFunctions.h
@@ -0,0 +1,43 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeThemeFunctions.h
+ This file contains functions to deal with themes
+*/
+#ifndef __TERRALIB_INTERNAL_THEMEFUNCTIONS_H
+#define __TERRALIB_INTERNAL_THEMEFUNCTIONS_H
+
+class TeTheme;
+
+#include <string>
+
+//! Creates a new theme from the objects of an existing theme
+/*!
+ \param inTheme input theme
+ \param newThemeName the name of the new theme
+ \param selObj the criteria to include objects of the existing theme in the new one
+ \param newTheme pointer to the new theme created if it succeed and null otherwise
+*/
+bool TeCreateThemeFromTheme(TeTheme* inTheme, const string& newThemeName, int selObj=0, TeTheme* newTheme=0);
+
+#endif
diff --git a/src/terralib/kernel/Gra_algo.h b/src/terralib/kernel/Gra_algo.h
new file mode 100644
index 0000000..3ee948a
--- /dev/null
+++ b/src/terralib/kernel/Gra_algo.h
@@ -0,0 +1,195 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+// include/gra_algo.h
+#ifndef GRAPH_ALGORITHMS_H
+#define GRAPH_ALGORITHMS_H
+#include <dynpq.h>
+#include <graph.h>
+#include <limits>
+#include <iostream>
+
+namespace br_stl {
+
+template<class GraphType, class EdgeType>
+void Dijkstra(
+ GraphType& Gr,
+ std::vector<EdgeType>& Dist,
+ std::vector<int>& Pred,
+ int Start) {
+ /* The algorithm proceeds in such a way that the distances are
+ estimated and the estimates gradually improved. The distance to
+ the starting point is known (0). For all other vertices, the
+ worst possible estimate is entered.*/
+
+ Dist = std::vector<EdgeType>(Gr.size(),
+ std::numeric_limits<EdgeType>::max()); // as good as infinity
+ Dist[Start] = (EdgeType)0;
+
+ /* The predecessor vector too is initialized with `impossible'
+ values. Subsequently, a dynamic priority queue is defined and
+ initialized with the distance vector: */
+
+ Pred = std::vector<int>(Gr.size(), -1);
+ dynamic_priority_queue<EdgeType> Q(Dist);
+
+ // In the next step, all vertices are extracted one by one from
+ // the priority queue, and precisely in the order of the estimated
+ // distance towards the starting vertex. Obviously, the starting
+ //vertex is dealt with first. No vertex is looked at twice.
+
+ int u;
+ while(!Q.empty()) {
+ u = Q.topIndex(); // extract vertex with minimum
+ Q.pop();
+
+ // Now, the distance estimates for all neighboring vertices of
+ // u are updated. If the previous estimate of the distance
+ // between the current neighbor of u and the starting vertex
+ // (Dist[Neighbor]) is worse than the distance between vertex u
+ // and the starting vertex (Dist[u]) plus the distance between
+ // u and the neighboring vertex (dist), the estimate is
+ // improved: this process is called relaxation. In this case,
+ // the path from the starting vertex to the neighbor cannot be
+ // longer than (Dist[u] + dist). In this case, u would have to
+ // be regarded as predecessor of the neighbor.
+
+ // improve estimates for all neighbors of u
+ typename GraphType::Successor::const_iterator
+ I = Gr[u].second.begin();
+
+ while(I != Gr[u].second.end()) {
+ int Neighbor = (*I).first;
+ EdgeType dist = (*I).second;
+
+ // relaxation
+ if(Dist[Neighbor] > Dist[u] + dist) {
+ // improve estimate
+ Q.changeKeyAt(Neighbor, Dist[u] + dist);
+ // u is predecessor of the neighbor
+ Pred[Neighbor] = u;
+ }
+ ++I;
+ }
+ }
+ return;
+}
+
+template<class GraphType>
+bool topoSort(
+ GraphType& G,
+ std::vector<int>& Result) {
+ assert(G.isDirected()); // let's play this safe!
+ int ResCounter = 0;
+ Result = std::vector<int>(G.size(), -1);
+
+ /* The vector Result takes the indices of the correspondingly
+ distributed vertices. The counter ResCounter is the position in
+ Result where the next entry belongs. */
+
+ vector<int> PredecessorCount(G.size(), 0);
+ int VerticesWithoutSuccessor = 0;
+
+ /* For each vertex, the vector PredecessorCount counts how many
+ predecessors it has. There are vertices without successors,
+ whose number is kept in VerticesWithoutSuccessor. Furthermore,
+ the algorithm remains stable if the precondition that a graph
+ must not have cycles is violated. The variable
+ VerticesWithoutSuccessor is used to recognize this situation
+ (see below). */
+
+ /*
+ for(size_t iv = 0; iv < G.size(); ++iv) {
+ if(G[iv].second.size() > 0) { // is predecessor
+ typename GraphType::Successor::const_iterator I =
+ G[iv].second.begin();
+ while(I != G[iv].second.end())
+ // update number of predecessors
+ ++PredecessorCount[(*I++).first];
+ }
+ else { // Vertex is no predecessor, that is, without successor
+ // an excessively high number of predecessors is used
+ // for later recognition
+ PredecessorCount[iv] = G.size(); // too many!
+ ++VerticesWithoutSuccessor;
+ }
+ }
+ */
+
+ /* The dynamic priority queue is initialized with the vector of
+ numbers of predecessors. At the beginning of the queue we find
+ those vertices that have no predecessors and therefore are to
+ be processed next. Only the vertices which are predecessors
+ themselves, that is that have successors are processed. The
+ subsequent loop is terminated when the queue only contains
+ successor vertices which themselves are not predecessors. Their
+ number of predecessors can never be 0 because further above
+ they were initialized with too high a value.*/
+
+ /*
+ dynamic_priority_queue<int> Q(PredecessorCount);
+
+ // process all predecessors
+ while(Q.topKey() == 0) {
+ // determine vertex with predecessor number 0
+ int oV = Q.topIndex();
+ Q.pop();
+
+ Result[ResCounter++] = oV;
+
+ // In order to ensure that this vertex without predecessors oV
+ // is no longer considered in the next cycle, the number of
+ // predecessors of all its successors is decreased by 1.
+
+ typename GraphType::Successor::const_iterator
+ I = G[oV].second.begin();
+ while(I != G[oV].second.end()) {
+ // decrease number of predecessors with
+ // changeKeyAt()}. Do not change directly!
+ int V = (*I).first;
+ Q.changeKeyAt(V, PredecessorCount[V] -1);
+ ++I;
+ }
+ }
+
+ // Now, all vertices without successors are entered. As a
+ // countercheck, the variable VerticesWithoutSuccessor is
+ // decreased. If the queue contains too many vertices, an error
+ // message is displayed.
+
+ while(!Q.empty()) {
+ Result[ResCounter++] = Q.topIndex();
+ Q.pop();
+ --VerticesWithoutSuccessor;
+ }
+
+ if(VerticesWithoutSuccessor < 0)
+ std::cerr << "Error: graph contains a cycle!\n";
+ return VerticesWithoutSuccessor == 0;
+ */
+ return;
+}
+
+} // namespace br_stl
+#endif
+
diff --git a/src/terralib/kernel/TeAsciiFile.cpp b/src/terralib/kernel/TeAsciiFile.cpp
new file mode 100644
index 0000000..3e80448
--- /dev/null
+++ b/src/terralib/kernel/TeAsciiFile.cpp
@@ -0,0 +1,342 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeAsciiFile.h"
+#include "TeErrorLog.h"
+#include "TeException.h"
+#include "TeAssertions.h"
+#include "TeDefines.h"
+
+TeAsciiFile::TeAsciiFile ( const string& name, const char* mode ):
+ TeStdFile ( name, mode )
+{
+}
+
+TeAsciiFile::~TeAsciiFile()
+{
+}
+
+void
+TeAsciiFile::findNewLine ()
+{
+ if ( feof ( file_ ) != 0 )
+ return;
+ char ch = '0';
+
+ while ( ch != '\n' )
+ {
+ fscanf ( file_, "%c", &ch );
+ if ( feof ( file_ ) != 0 )
+ return;
+ }
+}
+
+char
+TeAsciiFile::readQuotedChar()
+{
+ require ( feof ( file_ ) == 0 );
+
+ char ch = ',', ch2;
+
+ while ( ch != '"' )
+ {
+ fscanf ( file_, "%c", &ch );
+ }
+ fscanf ( file_, "%c", &ch );
+ fscanf ( file_, "%c", &ch2 );
+
+ ensure ( ch2 == '"' ); // just to make sure
+return ch;
+}
+
+char
+TeAsciiFile::readChar()
+{
+ char ch=' ';
+ require ( feof ( file_ ) == 0 );
+ while ( ch == ' ' )
+ {
+ fscanf ( file_, "%c", &ch );
+ }
+ return ch;
+}
+
+
+string
+TeAsciiFile::readString ()
+{
+ if ( feof ( file_ ) != 0 )
+ throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+ char input [TeNAME_LENGTH];
+ fscanf ( file_, "%s", input );
+
+return input;
+}
+
+void
+TeAsciiFile::writeString (const string& s)
+{
+ fprintf ( file_, "%s", s.c_str() );
+}
+
+string
+TeAsciiFile::readLine ()
+{
+ if ( feof ( file_ ) != 0 )
+ throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+ char input [TeNAME_LENGTH];
+ fgets ( input, TeNAME_LENGTH, file_ );
+
+return input;
+}
+
+string
+TeAsciiFile::readQuotedString()
+{
+ require ( feof ( file_ ) == 0 );
+
+ char ch = ' ';
+
+ string quote;
+
+ while ( ch != '"' )
+ {
+ fscanf ( file_, "%c", &ch );
+ }
+
+ while ( true )
+ {
+ fscanf ( file_, "%c", &ch );
+ if ( ch == '\n' || ch == '\r')
+ {
+ ungetc ( ch, file_ );
+ break;
+ }
+ if ( ch == '"' ) break;
+
+ quote = quote + ch;
+ }
+return quote;
+}
+
+void
+TeAsciiFile::readStringList ( vector<string>& strlist )
+{
+ require ( file_ != 0 );
+
+ this->readStringListCSV ( strlist, ' ');
+}
+
+void
+TeAsciiFile::readStringListCSV ( vector<string>& strlist, const char sep)
+{
+
+ if ( feof ( file_ ) != 0 )
+ throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+ char ch, lastChr = 0;
+ while (fscanf ( file_, "%c", &ch ) != EOF )
+ {
+ if ( ch == '\n' || ch == '\r')
+ {
+ if(lastChr==sep)
+ strlist.push_back ( "" );
+
+ ungetc ( ch, file_ );
+ return;
+ }
+ ungetc ( ch, file_ );
+ // there are still more values to be read
+ string name = readStringCSV (sep);
+ if ( name.size() != 0 || sep != ' ')
+ strlist.push_back ( name );
+
+ lastChr = ch;
+ }
+}
+
+void
+TeAsciiFile::readNStringCSV ( vector<string>& strlist, unsigned int n, const char sep)
+{
+
+ if ( feof ( file_ ) != 0 )
+ throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+ strlist.clear();
+ char ch, lastChr = 0;
+ while (fscanf ( file_, "%c", &ch ) != EOF )
+ {
+ if ( ch == '\n' || ch == '\r')
+ {
+ if(lastChr==sep)
+ strlist.push_back ( "" );
+
+ ungetc ( ch, file_ );
+ return;
+ }
+ ungetc ( ch, file_ );
+ // there are still more values to be read
+ string name = readStringCSV (sep);
+ if ( name.size() != 0 || sep != ' ')
+ strlist.push_back ( name );
+ if (strlist.size() == n)
+ break;
+
+ lastChr = ch;
+ }
+}
+
+string
+TeAsciiFile::readStringCSV( const char del, bool skip, const char skip_char )
+{
+ require ( file_ != 0 );
+
+ if ( feof ( file_ ) != 0 )
+ throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+ char ch = '0';
+ string line;
+ bool inQuotes = false;
+
+ int ret;
+ while ( (ret=fscanf ( file_, "%c", &ch )) != EOF)
+ {
+ if ( ch == '\n' || ch == '\r')
+ {
+ ungetc ( ch, file_ );
+ break;
+ }
+ if ( ch == del && !inQuotes ) break;
+ if (skip)
+ if (ch == skip_char)
+ {
+ if (skip_char == '"')
+ inQuotes = !inQuotes;
+ continue;
+ }
+ line = line + ch;
+ }
+ return line;
+}
+
+string
+TeAsciiFile::readStringCSVNoSpace( const char del )
+{
+ char blank = ' ';
+ string line = readStringCSV ( del, true, blank );
+return line;
+}
+
+string
+TeAsciiFile::readStringCSVNoQuote( const char del )
+{
+ char quote = '"';
+ string line = readStringCSV ( del, true, quote );
+return line;
+}
+
+int
+TeAsciiFile::readInt ()
+{
+ require ( file_ != 0 );
+
+ if ( feof ( file_ ) != 0 )
+ throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+ int value;
+ fscanf ( file_, "%d", &value );
+
+return value;
+}
+
+int
+TeAsciiFile::readIntCSV ( const char del )
+{
+ char blank = ' ';
+ string line = readStringCSV ( del, true, blank );
+
+return atoi(line.c_str());
+}
+
+double
+TeAsciiFile::readFloatCSV ( const char del )
+{
+ char blank = ' ';
+ string line = readStringCSV ( del, true, blank );
+
+return atof(line.c_str());
+}
+
+
+double
+TeAsciiFile::readFloat ()
+{
+ require ( file_ != 0 );
+
+ if ( feof ( file_ ) != 0 )
+ throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+ double value;
+ fscanf ( file_, "%lf", &value );
+
+return value;
+}
+
+TeCoord2D
+TeAsciiFile::readCoord2D ()
+{
+ require ( file_ != 0 );
+
+ if ( feof ( file_ ) != 0 )
+ throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+ double x, y;
+ fscanf ( file_, "%lf %lf", &x, &y);
+
+return TeCoord2D( x, y );
+}
+
+TeBox
+TeAsciiFile::readBox()
+{
+ require ( file_ != 0 );
+
+ if ( feof ( file_ ) != 0 )
+ {
+ throw TeException ( END_OF_FILE_REACHED, name(), true );
+ }
+ double x1, y1, x2, y2;
+
+
+ fscanf ( file_, "%lf %lf %lf %lf", &x1, &y1, &x2, &y2 );
+
+return TeBox ( x1, y1, x2, y2 );
+
+}
+
diff --git a/src/terralib/kernel/TeAsciiFile.h b/src/terralib/kernel/TeAsciiFile.h
new file mode 100644
index 0000000..cce443a
--- /dev/null
+++ b/src/terralib/kernel/TeAsciiFile.h
@@ -0,0 +1,129 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeAsciiFile.h
+ This file contains structures and definitions to deal ASCII files
+*/
+#ifndef __TERRALIB_INTERNAL_ASCIIFILE_H
+#define __TERRALIB_INTERNAL_ASCIIFILE_H
+
+#include "TeStdFile.h"
+#include "TeCoord2D.h"
+#include "TeBox.h"
+
+#include <stdio.h>
+
+#include <vector>
+#include <string>
+using namespace std;
+
+//! A class for handling reading/writing for ASCII files
+/*! Simple wrapper around a stdio file. Clientes are all the
+ functions that imports from ASCII files.
+
+ \sa
+ TeStdFile, TeSPRFile
+*/
+class TeAsciiFile: public TeStdFile {
+
+public:
+
+ //! Contructors
+ TeAsciiFile(const string& name, const char* mode = "r");
+
+ //! Destructor
+ virtual ~TeAsciiFile();
+
+ //! Writes a carriage return character
+ void writeNewLine ()
+ { fprintf ( file_, "\n" ); }
+
+ //! Goes to a new line
+ void findNewLine () ;
+
+ //! Reads a string
+ string readString();
+
+ //! Reads a full line up to carriage return
+ string readLine();
+
+ //! Writes a generic string to the file
+ void writeString (const string& s);
+
+ //! Reads a string whithin quotes
+ string readQuotedString();
+
+ //! Reads a comma-separated string ( with a skip character )
+ string readStringCSV( const char sep = ',', bool skip = false,
+ const char skip_char = ' ');
+
+ //! Reads a character whithin quotes
+ char readQuotedChar();
+
+ //! Reads a character
+ char readChar();
+
+ //! Reads a comma-separated string(ignore spaces)
+ string readStringCSVNoSpace( const char del = ',');
+
+ //! Reads a comma-separated string (ignore quote )
+ string readStringCSVNoQuote ( const char del = ',' );
+
+ //! Reads an integer
+ int readInt();
+
+ //! Reads a comma-separated int
+ int readIntCSV( const char del = ',');
+
+ //! Reads a float
+ double readFloat();
+
+ //! Reads a comma-separated float
+ double readFloatCSV( const char del = ',');
+
+ //! Reads a 2D coordinate ( x, y )
+ TeCoord2D readCoord2D();
+
+ //! Reads a line and put in a stringlist
+ void readStringList ( vector<string>& );
+
+ //! Reads a comma-separated line string and put in a string list
+ void readStringListCSV ( vector<string>&, const char sep = ',');
+
+ //! Reads the first n strings from a comma separated line string and put in a string list
+ void readNStringCSV ( vector<string>&, unsigned int n, const char sep = ',');
+
+
+ //! Reads a bounding box
+ TeBox readBox();
+
+private:
+
+// No copy allowed
+
+ TeAsciiFile(const TeAsciiFile&);
+ TeAsciiFile& operator=(const TeAsciiFile&);
+
+};
+#endif
+
+
diff --git a/src/terralib/kernel/TeAssertions.h b/src/terralib/kernel/TeAssertions.h
new file mode 100644
index 0000000..05e5d9e
--- /dev/null
+++ b/src/terralib/kernel/TeAssertions.h
@@ -0,0 +1,36 @@
+//***********************************************************************
+// TerraLib is a GIS Classes and Functions Library that
+// strongly explores Spatial Database Technologies
+//
+// Copyright � 2002 INPE and Tecgraf/PUC-Rio.
+//
+// This library is free software; you can redistribute it
+// and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation
+// version 2.1.(http://www.opensource.org/licenses/lgpl-license.php)
+//
+//
+//
+// Send questions or suggestions about the TerraLib Project
+// to terralib at dpi.inpe.br .
+//**************************************************************************//
+/*! \file TeAssertions.h
+ This file contains definitions for require and ensure macros.
+
+ The require and ensure macros implement
+ the pre-conditions and post-conditions
+ for each module.
+
+ The "invariant" macro verifies is an
+ invariant condition is true.
+
+*/
+#ifndef TeAssertions_H
+#define TeAssertions_H
+#include <assert.h>
+
+#define require(statement) assert(statement)
+#define ensure(statement) assert(statement)
+
+#endif
+
diff --git a/src/terralib/kernel/TeAttribute.h b/src/terralib/kernel/TeAttribute.h
new file mode 100644
index 0000000..eabe1bb
--- /dev/null
+++ b/src/terralib/kernel/TeAttribute.h
@@ -0,0 +1,155 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeAttribute.h
+ This file contains structures and definitions about attributes of geographical objects
+*/
+#ifndef __TERRALIB_INTERNAL_ATTRIBUTE_H
+#define __TERRALIB_INTERNAL_ATTRIBUTE_H
+
+#include "TeDataTypes.h"
+#include "TeTime.h"
+
+/*! \enum TeMeasurementScale
+ Sscale of measurement according to Stevens (1949)
+ modified by Chrisman (1998) to include CYCLIC and PROBABILITY
+ we also include FUZZY (possibility scale)
+*/
+enum TeMeasurementScale
+{ ORDINAL, NOMINAL, RATIO, INTERVAL, CYCLIC, PROBABILITY, FUZZY };
+
+/*! \struct TeAttributeRep
+ Attribute physical representation
+*/
+struct TeAttributeRep
+{
+ string name_; //!< attribute name
+ TeAttrDataType type_; //!< attribute type
+ int numChar_; //!< width of an attribute
+ int decimals_; //!< number of decimal digits
+ bool isPrimaryKey_; //!< flag to indicate that the attribute is part of primary key
+ bool isAutoNumber_; //!< flag to indicate that the attribute is auto number
+
+ //! Empty constructor
+ TeAttributeRep():
+ name_(""),
+ type_(TeSTRING),
+ numChar_(0),
+ decimals_(0),
+ isPrimaryKey_(false),
+ isAutoNumber_(false)
+ {}
+
+ //! Empty constructor
+ TeAttributeRep(const string& name):
+ name_(name),
+ type_(TeSTRING),
+ numChar_(0),
+ decimals_(0),
+ isPrimaryKey_(false),
+ isAutoNumber_(false)
+ {}
+
+ //! Operator =
+ TeAttributeRep& operator= ( const TeAttributeRep& at )
+ {
+ if ( this != &at )
+ {
+ name_ = at.name_;
+ type_ = at.type_;
+ numChar_ = at.numChar_;
+ decimals_ = at.decimals_;
+ isPrimaryKey_ = at.isPrimaryKey_;
+ isAutoNumber_ = at.isAutoNumber_;
+ }
+ return *this;
+ }
+
+ //! Operator <
+ bool operator< (const TeAttributeRep& at) const
+ {return (name_ < at.name_);}
+};
+
+/*! \struct TeAttribute
+ Attribute description
+*/
+struct TeAttribute
+{
+ TeAttributeRep rep_; //!< representation of attribute
+ string semantic_; //!< reference in a Ontology database (e.g., entry in WordNet )
+ string unit_; //!< measurement unit ( e.g., m ) if applicable
+ TeMeasurementScale scale_; //!< scale of measurement
+
+ // for RATIO data sets
+ string minValue_; //!< minimum value of the attribute
+ string maxValue_; //!< maximum value of the attrbute
+
+ // for NOMINAL or ORDINAL data sets
+ vector<string> validValueList_; //!< list of valid values
+
+ // for INTERVAL data sets (??)
+ string origin_; //!< origin of the intervals
+ string interval_; //!< mesurement interval
+
+ string dateTimeFormat_; //!< format for date and time values
+ string indicatorAM_; //!< AM indicator for a 12 hour clock
+ string indicatorPM_; //!< PM indicator for a 12 hour clock
+ string dateSeparator_; //!< date separator
+ string timeSeparator_; //!< time separator
+ TeChronon dateChronon_; //!< date chronon
+
+ //! Empty constructor
+ TeAttribute():
+ rep_ (TeAttributeRep()),
+ dateTimeFormat_ ("DsMsYYYYsHHsmmsSS"),
+ indicatorAM_ ("AM"),
+ indicatorPM_ ("PM"),
+ dateSeparator_ ("/"),
+ timeSeparator_ (":"),
+ dateChronon_ (TeSECOND)
+ {}
+};
+
+/*! \struct TeProperty
+ A property of an object
+ */
+struct TeProperty
+{
+ TeAttribute attr_; //!< attribute description
+ string value_; //!< its value stored as an string
+};
+
+//! A vector of TeProperties
+typedef vector<TeProperty> TePropertyVector;
+
+//! A vector of attributes representation
+typedef vector<TeAttributeRep> TeAttributeRepList;
+
+//! A vector of attributes
+typedef vector<TeAttribute> TeAttributeList;
+
+//! A Map of the attribute names to the statistical types
+typedef multimap<TeAttributeRep, TeStatisticType> TeGroupingAttr;
+
+#endif
+
diff --git a/src/terralib/kernel/TeBox.cpp b/src/terralib/kernel/TeBox.cpp
new file mode 100644
index 0000000..cb62897
--- /dev/null
+++ b/src/terralib/kernel/TeBox.cpp
@@ -0,0 +1,187 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeBox.h"
+#include "TeGeometry.h"
+
+void zoomIn ( TeBox& box, double t )
+{
+ TeCoord2D c = box.center ();
+ double w = box.width ()*t/2.;
+ double h = box.height ()*t/2.;
+ box.x1_ = c.x() - w;
+ box.x2_ = c.x() + w;
+ box.y1_ = c.y() - h;
+ box.y2_ = c.y() + h;
+}
+
+
+void zoomOut ( TeBox& box, double t )
+{
+ TeCoord2D c = box.center ();
+ double w = box.width ()/t/2.;
+ double h = box.height ()/t/2.;
+ box.x1_ = c.x() - w;
+ box.x2_ = c.x() + w;
+ box.y1_ = c.y() - h;
+ box.y2_ = c.y() + h;
+}
+
+// --- UPDATE BOX
+
+void
+updateBox ( TeBox& box, const TeCoord2D& pt )
+{
+ if ( pt.x() <= box.x1_ )
+ box.x1_ = pt.x();
+
+ if ( pt.x() >= box.x2_ )
+ box.x2_ = pt.x();
+
+ if ( pt.y() <= box.y1_ )
+ box.y1_ = pt.y();
+
+ if ( pt.y() >= box.y2_ )
+ box.y2_ = pt.y();
+}
+
+void
+updateBox ( TeBox& box, const TeBox& other )
+{
+ if ( other.x1_ <= box.x1_ )
+ box.x1_ = other.x1_;
+ if ( other.x2_ >= box.x2_ )
+ box.x2_ = other.x2_;
+ if ( other.y1_ <= box.y1_ )
+ box.y1_ = other.y1_;
+ if ( other.y2_ >= box.y2_ )
+ box.y2_ = other.y2_;
+}
+
+void
+updateBox ( TeBox& box, const TeGeometry& geo )
+{
+ updateBox ( box, geo.box() );
+}
+
+TeBox
+makeBox(double x1, double y1, double x2, double y2, const double& tol)
+{
+ double xlo, xhi;
+
+ if(x1 > x2)
+ {
+ xhi = x1;
+ xlo = x2;
+ }
+ else
+ {
+ xhi = x2;
+ xlo = x1;
+ }
+
+ double ylo, yhi;
+ if(y1 > y2)
+ {
+ yhi = y1;
+ ylo = y2;
+ }
+ else
+ {
+ yhi = y2;
+ ylo = y1;
+ }
+
+ return TeBox(xlo - tol, ylo - tol, xhi + tol, yhi + tol);
+}
+
+
+TeBox
+adjustToCut(TeBox& box, double bWidth, double bHeight)
+{
+ double auxD;
+ int auxI;
+
+ int magicX;
+ auxD = box.x1()/bWidth;
+ auxI = (int)(box.x1()/bWidth);
+ if (box.x1() < 0 && (auxD - auxI) != 0)
+ magicX = (int) (box.x1()/bWidth - 1);
+ else
+ magicX = auxI;
+
+ int magicY;
+ auxD = box.y1()/bHeight;
+ auxI = (int)(box.y1()/bHeight);
+ if (box.y1() < 0 && (auxD - auxI) != 0)
+ magicY = (int)(box.y1()/bHeight - 1);
+ else
+ magicY = auxI;
+
+ double xi = magicX*bWidth;
+ double yi = magicY*bHeight;
+
+ int magicX2;
+ auxD = box.x2()/bWidth;
+ auxI = (int)(box.x2()/bWidth);
+ if ((box.x2() < 0) || (auxD - auxI) == 0)
+ magicX2 = (int) (box.x2()/bWidth);
+ else
+ magicX2 = (int) (box.x2()/bWidth + 1);
+
+
+ int magicY2;
+ auxD = box.y2()/bHeight;
+ auxI = (int)(box.y2()/bHeight);
+ if ((box.y2() < 0) || (auxD - auxI) == 0)
+ magicY2 = (int) (box.y2()/bHeight);
+ else
+ magicY2 = (int) (box.y2()/bHeight + 1);
+
+
+ double xf = (magicX2)*bWidth;
+ double yf = (magicY2)*bHeight;
+
+ return TeBox(xi,yi,xf,yf);
+}
+
+TePolygon polygonFromBox( TeBox& bb )
+{
+ TePolygon poly;
+ TeLine2D line;
+
+ TeCoord2D ll (bb.x1_, bb.y1_);
+ TeCoord2D ul (bb.x1_, bb.y2_);
+ TeCoord2D ur (bb.x2_, bb.y2_);
+ TeCoord2D lr (bb.x2_, bb.y1_);
+
+ line.add(ll);
+ line.add(ul);
+ line.add(ur);
+ line.add(lr);
+ line.add(ll);
+
+ TeLinearRing ring(line);
+ poly.add(ring);
+ return poly;
+}
diff --git a/src/terralib/kernel/TeBox.h b/src/terralib/kernel/TeBox.h
new file mode 100644
index 0000000..5b21bd0
--- /dev/null
+++ b/src/terralib/kernel/TeBox.h
@@ -0,0 +1,204 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeBox.h
+ This file contains structures and definitions to deal with a box
+*/
+#ifndef __TERRALIB_INTERNAL_BOX_H
+#define __TERRALIB_INTERNAL_BOX_H
+
+#include "TeCoord2D.h"
+#include "TeDefines.h"
+
+class TeGeometry;
+class TePolygon;
+
+//! Provides support for dealing with a rectangular a box. Used by all geometrical representations
+/*!
+ \sa
+ TeCoord2D
+ */
+struct TeBox {
+
+ enum TeBoxCorner { TeLOWERLEFT=0, TeUPPERLEFT=1, TeLOWERRIGHT=2, TeUPPERRIGHT=3 };
+
+//! Default constructor
+/*!
+ \param x1 X value of the lower left box coordinate
+ \param y1 Y value of the lower left box coordinate
+ \param x2 X value of the upper right box coordinate
+ \param y2 Y value of the upper right box coordinate
+*/
+ TeBox ( const double& x1 = TeMAXFLOAT, const double y1 = TeMAXFLOAT,
+ const double& x2 = -TeMAXFLOAT, const double y2 = -TeMAXFLOAT ):
+ x1_ ( x1 ), y1_ ( y1 ), x2_ ( x2 ), y2_ ( y2 ) {}
+
+//! Constructor from corners as TeCoord2D objects
+/*!
+ \param p1 lower left box coordinate
+ \param p2 upper right box coordinate
+*/
+ TeBox( const TeCoord2D& p1, const TeCoord2D& p2 ):
+ x1_ ( p1.x() ), y1_ ( p1.y() ),
+ x2_ ( p2.x() ), y2_ ( p2.y() )
+ {}
+
+//! Copy constructor
+ TeBox ( const TeBox& rhs )
+ {
+ x1_ = rhs.x1_;
+ x2_ = rhs.x2_;
+ y1_ = rhs.y1_;
+ y2_ = rhs.y2_;
+ }
+
+//! Operator =
+ TeBox& operator=(const TeBox& rhs)
+ {
+ if ( this == &rhs )
+ return *this;
+ else
+ {
+ x1_ = rhs.x1_;
+ x2_ = rhs.x2_;
+ y1_ = rhs.y1_;
+ y2_ = rhs.y2_;
+ }
+ return *this;
+ }
+
+//! Returns TRUE if current TeBox is equal to box; otherwise returns FALSE
+ bool operator== (const TeBox& box) const
+ {return ( ( fabs (y1_ - box.y1_) < TePrecision::instance().precision() )
+ && ( fabs (x1_ - box.x1_) < TePrecision::instance().precision() )
+ && ( fabs (y2_ - box.y2_) < TePrecision::instance().precision() )
+ && ( fabs (x2_ - box.x2_) < TePrecision::instance().precision() )
+ ); }
+
+//! Returns the coordinate corresponding to the geometric center of the box
+ TeCoord2D center() const
+ {
+ TeCoord2D p ( ( ( x1_ + x2_ ) / 2.), ( ( y1_ + y2_ ) / 2.) );
+ return p;
+ }
+
+//! Returns TRUE if current box is valid; otherwise returns FALSE
+ bool isValid() const
+ {
+ if (x1_ == TeMAXFLOAT || y1_ == TeMAXFLOAT ||
+ x2_ == -TeMAXFLOAT || y2_ == -TeMAXFLOAT ||
+ x1_ > x2_ || y1_ > y2_)
+ return false;
+ return true;
+ }
+
+//! Returns the x component of the lower left corner
+ double x1 () const
+ { return x1_;}
+
+//! Returns the y component of the lower left corner
+ double y1 () const
+ { return y1_;}
+
+//! Returns the x component of the upper right corner
+ double x2 () const
+ { return x2_;}
+
+//! Returns the y component of the upper right corner
+ double y2 () const
+ { return y2_;}
+
+//! Returns the box width
+ double width () const
+ { return x2_ - x1_; }
+
+//! Returns the box height
+ double height () const
+ { return y2_ - y1_; }
+
+//! Returns the lower left coordinate of the box
+ TeCoord2D lowerLeft() const
+ { return TeCoord2D ( x1_, y1_ );}
+
+//! Returns the upper right coordinate of the box
+ TeCoord2D upperRight() const
+ { return TeCoord2D (x2_,y2_);}
+
+//! Destructor
+ ~TeBox() {}
+
+ double x1_, //!< x coordinate of the lower left corner
+ y1_, //!< y coordinate of the lower left corner
+ x2_, //!< x coordinate of the upper right corner
+ y2_; //!< y coordinate of the upper right corner
+
+};
+
+// ALGORITHMS THAT USE A BOX
+
+/*! \fn void updateBox void updateBox ( TeBox& box, const TeCoord2D& pt )
+ \brief update a box to include a coordinate
+ */
+void updateBox ( TeBox& box, const TeCoord2D& pt );
+
+/*! \fn void updateBox void updateBox ( TeBox& box, const TeBox& other )
+ \brief update a box to include another box
+ */
+void updateBox ( TeBox& box, const TeBox& other );
+
+/*! \fn void updateBox ( TeBox& box, const TeGeometry& geo )
+ \brief update a box to include a geometry
+ */
+void updateBox ( TeBox& box, const TeGeometry& geo );
+
+
+// ZOOMING FUNCTIONS
+
+/*! \fn void zoomIn void zoomIn ( TeBox& box, double t = .8)
+ \brief increases the box by a factor t
+ */
+void zoomIn ( TeBox& box, double t = .8);
+
+/*! \fn void zoomOut void zoomOut ( TeBox& box, double t = .8)
+ \brief decreases box by a factor of t
+ */
+void zoomOut ( TeBox& box, double t = .8);
+
+/*! \fn TeBox makeBox(double x1, double y1, double x2, double y2, const double& tol = 0.0)
+ \brief builds a box
+ */
+TeBox makeBox(double x1, double y1, double x2, double y2, const double& tol = 0.0);
+
+/*! \fn TeBox adjustToCut(TeBox& box, double bWidth, double bHeight)
+ \brief finds the correspondent smallest box that allows a box to be cut in blocks of a given size
+ */
+TeBox adjustToCut(TeBox& box, double bWidth, double bHeight);
+
+/*! \fn TePolygon polygonFromBox(TeBox& bb)
+ \brief builds a TePolygon geometry from a box
+ */
+TePolygon polygonFromBox( TeBox& bb );
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeBufferRegion.cpp b/src/terralib/kernel/TeBufferRegion.cpp
new file mode 100644
index 0000000..4d14452
--- /dev/null
+++ b/src/terralib/kernel/TeBufferRegion.cpp
@@ -0,0 +1,206 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeBufferRegion.h"
+#include "TeOverlay.h"
+#include "TeGeometry.h"
+#include "TeGeometryAlgorithms.h"
+
+#include <map>
+#include <algorithm>
+#include <cmath>
+
+using namespace std;
+
+namespace TeBUFFERREGION
+{
+
+//---------------- Auxiliary Constants ----------------//
+const double pi = 3.14159265358979323846;
+
+//---------------- Auxiliary Functions ----------------//
+// A partir de dois pontos, gera um pol�gono no sentido anti-hor�rio
+void TeGenerateBufferPolygon(TeCoord2D first, TeCoord2D last, const double& bufferDistance, const short& numPoints, TePolygon& pol)
+{
+ double xLength = 0.0;
+ double yLength = 0.0;
+ double x = 0.0;
+ double y = 0.0;
+ double val_ang = 0.0;
+ double ang = 0.0;
+
+ TeLine2D contourLine;
+
+ if(TeGeometryAlgorithmsPrecision::IsGreater(first.x(), last.x()))
+ swap(first, last);
+ else
+ if(TeGeometryAlgorithmsPrecision::IsEqual(first.x(), last.x()))
+ {
+ if(TeGeometryAlgorithmsPrecision::IsSmaller(first.y(), last.y()))
+ swap(first, last);
+ }
+
+
+ xLength = last.x() - first.x();
+
+ if(first.y() < last.y())
+ yLength = last.y() - first.y();
+ else
+ yLength = first.y() - last.y();
+
+ double segmentLength = TeDistance(first, last);
+
+ val_ang = xLength / segmentLength;
+
+ if(val_ang > 1.0)
+ val_ang = 1.0;
+ else
+ if(val_ang < -1.0)
+ val_ang = -1.0;
+
+ if(TeGeometryAlgorithmsPrecision::IsEqual(val_ang, 0.0))
+ ang = 0.0;
+ else
+ {
+ if(TeGeometryAlgorithmsPrecision::IsEqual(first.y(), last.y()))
+ ang = (pi/2.0);
+ else
+ if(TeGeometryAlgorithmsPrecision::IsGreater(first.y(), last.y()))
+ ang = asin(val_ang);
+ else
+ ang = acos(val_ang) + (pi/2.0);
+ }
+
+ // Para cada extremo, calcula uma semi-circunfer�ncia
+ for(int i = 1; i < numPoints; ++i)
+ {
+ double s = sin(ang);
+ double c = cos(ang);
+
+ x = first.x() + bufferDistance * c ;
+ y = first.y() + bufferDistance * s ;
+
+ contourLine.add(TeCoord2D(x, y));
+
+ ang += (pi / (numPoints - 1));
+ }
+
+ x = first.x() + bufferDistance * cos(ang) ;
+ y = first.y() + bufferDistance * sin(ang) ;
+
+ contourLine.add(TeCoord2D(x, y));
+
+ for(int j = 0; j < numPoints; ++j)
+ {
+ double s = sin(ang);
+ double c = cos(ang);
+
+ x = last.x() + bufferDistance * c ;
+ y = last.y() + bufferDistance * s ;
+
+ contourLine.add(TeCoord2D(x, y));
+
+ ang += (pi / (numPoints - 1));
+ }
+
+ contourLine.add(contourLine[0]);
+
+ pol.add(TeLinearRing(contourLine));
+
+ return;
+}
+
+} // end namespace TeBUFFERREGION
+
+//---------------- Buffer Algorithm ----------------//
+bool TeBUFFERREGION::TeBufferRegion(const TeCoord2D& coord, const double& bufferDistance, const short& numPoints, TePolygon& pol)
+{
+ TeLine2D contourLine;
+
+ contourLine.add(TeCoord2D((coord.x() + bufferDistance), (coord.y())));
+
+ double initialAng = 0.0;
+
+ const double two_pi = 2 * pi;
+
+ double x = 0.0;
+ double y = 0.0;
+
+ for(int i = 1; i < numPoints; ++i)
+ {
+ initialAng += (two_pi / numPoints);
+
+ double s = sin(initialAng);
+ double c = cos(initialAng);
+
+ x = coord.x() + bufferDistance * c ;
+ y = coord.y() + bufferDistance * s ;
+
+ contourLine.add(TeCoord2D(x, y));
+ }
+
+ contourLine.add(TeCoord2D((coord.x() + bufferDistance), (coord.y())));
+
+ pol.add(TeLinearRing(contourLine));
+
+ return true;
+}
+
+
+bool TeBUFFERREGION::TeBufferRegion(const TeLine2D& line, const double& bufferDistance, const short& numPoints, TePolygonSet& ps)
+{
+ ps.clear();
+
+ // Generate first polygon
+ TePolygon pAux;
+ TeGenerateBufferPolygon(line[0], line[1], bufferDistance, numPoints, pAux);
+ ps.add(pAux);
+
+ unsigned int nStep = line.size() - 1;
+ for(unsigned int i = 1; i < nStep; ++i)
+ {
+ // Generate polygon from segment
+ TePolygon p;
+ TeGenerateBufferPolygon(line[i], line[i+1], bufferDistance, numPoints, p);
+
+ //ps.add(p);
+ // Gets union
+ TePolygonSet psAux;
+ psAux.add(p);
+
+ TePolygonSet psAux2;
+
+ if(TeOVERLAY::TeUnion(psAux, ps, psAux2) == false)
+ return false;
+
+ ps = psAux2;
+ }
+
+ return true;
+}
+
+bool TeBUFFERREGION::TeBufferRegion(const TePolygon& pol, const double& bufferDistance, const short& numPoints, TePolygonSet& ps)
+{
+ return TeBufferRegion(pol[0], bufferDistance, numPoints, ps);
+}
+
diff --git a/src/terralib/kernel/TeBufferRegion.h b/src/terralib/kernel/TeBufferRegion.h
new file mode 100644
index 0000000..dd89313
--- /dev/null
+++ b/src/terralib/kernel/TeBufferRegion.h
@@ -0,0 +1,52 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeBufferRegion.h
+ This file contains structures and definitions for buffer region operation on objects.
+ */
+
+/**
+ *@author Gilberto Ribeiro de Queiroz
+ */
+
+#ifndef __TERRALIB_INTERNAL_BUFFER_H
+#define __TERRALIB_INTERNAL_BUFFER_H
+
+#include "TeCoord2D.h"
+
+class TeLine2D;
+class TePolygon;
+class TePolygonSet;
+
+namespace TeBUFFERREGION
+{
+ bool TeBufferRegion(const TeCoord2D& coord, const double& bufferDistance, const short& numPoints, TePolygon& pol);
+
+ bool TeBufferRegion(const TeLine2D& line, const double& bufferDistance, const short& numPoints, TePolygonSet& ps);
+
+ bool TeBufferRegion(const TePolygon& pol, const double& bufferDistance, const short& numPoints, TePolygonSet& ps);
+
+} // end namespace TeBUFFER
+
+#endif //__TERRALIB_INTERNAL_BUFFER_H
+
diff --git a/src/terralib/kernel/TeCentroid.cpp b/src/terralib/kernel/TeCentroid.cpp
new file mode 100644
index 0000000..39bd7a2
--- /dev/null
+++ b/src/terralib/kernel/TeCentroid.cpp
@@ -0,0 +1,411 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <vector>
+#include <functional>
+#include <algorithm>
+
+#include "TeAssertions.h"
+#include "TeException.h"
+#include "TeGeometryAlgorithms.h"
+
+using namespace std;
+
+
+// Prototypes for internal routines - NOT seen from the outside
+
+TeCoord2D TeFindBaricenter (const TeLinearRing& ring ); // general method ( solves most cases)
+TeCoord2D TeFindCentroidConcavePolygon (const TePolygon& poly ); // brute-force approach (use if above fails)
+
+
+TeCoord2D
+TeFindCentroid(const TePolygon& poly )
+{
+ // This is a two-step algorithm
+
+ // First, try a simple geometric solution
+ // that works for convex polygons and some concave ones
+
+ TeCoord2D pt = TeFindBaricenter( poly[0] );
+
+ if ( TeWithin ( TePoint(pt), poly) )
+ return pt;
+
+ // No, try a more general approach
+
+ pt = TeFindCentroidConcavePolygon( poly );
+
+return pt;
+}
+
+TeCoord2D
+TeFindCentroid (const TeLine2D& line )
+{
+ int midpoint = (line.size()/2) - 1 ;
+ TeCoord2D middle;
+
+ TeGetMiddlePoint(line[midpoint], line[midpoint+1], middle);
+ return middle;
+}
+
+TeCoord2D
+TeFindCentroid(const TeCell& c)
+{
+ return c.box().center();
+}
+
+TeCoord2D
+TeFindCentroid(const TePoint& p)
+{
+ return p.location();
+}
+
+
+TeCoord2D
+TeFindCentroid(const TePolygonSet& s)
+{
+ TePointSet pset;
+ TePolygonSet::iterator it1 = s.begin();
+ while (it1 != s.end())
+ {
+ TeCoord2D p1 = TeFindCentroid (*it1);
+ TePoint po;
+ po.add (p1);
+ pset.add (po);
+ it1++;
+ }
+
+ double x, y;
+ int n = 0;
+ TePointSet::iterator it2 = pset.begin();
+ while (it2 != pset.end())
+ {
+ x =+ (*it2).location().x();
+ y =+ (*it2).location().y();
+ n++;
+ it2++;
+ }
+
+ TeCoord2D p;
+ if (n != 0)
+ {
+ x = x/n;
+ y = y/n;
+ p.setXY (x, y);
+ }
+ return p;
+}
+
+
+TeCoord2D
+TeFindCentroid(const TeLineSet& s)
+{
+ TePointSet pset;
+ TeLineSet::iterator it1 = s.begin();
+ while (it1 != s.end())
+ {
+ TeCoord2D p1 = TeFindCentroid (*it1);
+ TePoint po;
+ po.add (p1);
+ pset.add (po);
+ it1++;
+ }
+
+ double x, y;
+ int n = 0;
+ TePointSet::iterator it2 = pset.begin();
+ while (it2 != pset.end())
+ {
+ x =+ (*it2).location().x();
+ y =+ (*it2).location().y();
+ n++;
+ it2++;
+ }
+
+ TeCoord2D p;
+ if (n != 0)
+ {
+ x = x/n;
+ y = y/n;
+ p.setXY (x, y);
+ }
+ return p;
+}
+
+
+TeCoord2D
+TeFindCentroid(const TeCellSet& s)
+{
+ TePointSet pset;
+ TeCellSet::iterator it1 = s.begin();
+ while (it1 != s.end())
+ {
+ TeCoord2D p1 = TeFindCentroid (*it1);
+ TePoint po;
+ po.add (p1);
+ pset.add (po);
+ it1++;
+ }
+
+ double x, y;
+ int n = 0;
+ TePointSet::iterator it2 = pset.begin();
+ while (it2 != pset.end())
+ {
+ x =+ (*it2).location().x();
+ y =+ (*it2).location().y();
+ n++;
+ it2++;
+ }
+
+ TeCoord2D p;
+ if (n != 0)
+ {
+ x = x/n;
+ y = y/n;
+ p.setXY (x, y);
+ }
+ return p;
+}
+
+TeCoord2D
+TeFindCentroid(TePointSet& points)
+{
+ TeCoord2D result;
+ if (points.size() == 1)
+ result = (points[0]).location();
+ else
+ {
+ TeBox bpt = points.box();
+ result = bpt.center();
+ }
+ return result;
+}
+
+/*
+ * ANSI C++ code from the article
+ * "Centroid of a Polygon"
+ * by Gerard Bashein and Paul R. Detmer,
+ * in "Graphics Gems IV", Academic Press, 1994
+ */
+
+/*********************************************************************
+Centroid: Calculates the centroid (xCentroid, yCentroid)
+of a polygon, given its vertices (x[0], y[0]) ... (x[n-1], y[n-1]). It
+is assumed that the contour is closed, i.e., that the vertex following
+(x[n-1], y[n-1]) is (x[0], y[0]).
+
+**********************************************************************/
+
+TeCoord2D
+TeFindBaricenter ( const TeLinearRing& ring )
+{
+
+ double ai, atmp = 0, xtmp = 0, ytmp = 0;
+
+ int n = ring.size() - 1; // our polygons wrap around
+ int i, j;
+
+ if (n < 3) return TeCoord2D (0., 0.);
+
+ for ( i = n-1, j = 0; j < n; i = j, j++)
+ {
+ ai = ring[i].x() * ring[j].y() - ring[j].x() * ring[i].y();
+ atmp += ai;
+ xtmp += (ring[j].x() + ring[i].x()) * ai;
+ ytmp += (ring[j].y() + ring[i].y()) * ai;
+ }
+
+ if (atmp != 0)
+ {
+ return TeCoord2D ( (xtmp / (3. * atmp)), ( ytmp / (3. * atmp)));
+ }
+ return TeCoord2D ( 0., 0. );
+}
+
+
+
+//
+// TeFindCentroidConcavePolygon
+//
+// This algorithm is based on the idea of a plane-sweep
+//
+// 1. Divide the box into horizontal slices
+//
+// 2. Sweep the plane, starting from the bottom
+//
+// 3. For each y-slice, find the horizontal intersections in the
+// forward direction (if it exists)
+//
+// 4. Sort these intersections
+//
+// 5. Order the intersections
+//
+// 6. For all possible "intersections", select a mid-point and
+// test if this point is inside the polygon
+//
+// 7. If a centroid has not been found, cut the box into
+// "smaller" slices and repeat steps 2-6
+
+
+
+// Defines a function object for sorting coordinates in ascending x-order
+
+struct x_order : public binary_function<TeCoord2D, TeCoord2D, bool>
+{
+ bool operator()(TeCoord2D& pt1, TeCoord2D& pt2) { return pt1.x() < pt2.x(); }
+};
+
+// Defines a distance measure between two Coordinate pairs (used for sorting)
+
+struct x_dist : public binary_function<TeCoordPair, TeCoordPair, bool>
+{
+ bool operator()(TeCoordPair c1, TeCoordPair c2)
+ {
+ return ( ( c1.pt2.x() - c1.pt1.x() ) > ( c2.pt2.x() - c2.pt1.x() ) );
+ }
+};
+
+
+typedef vector<double> doubleVect;
+
+TeCoord2D
+TeFindCentroidConcavePolygon ( const TePolygon& poly )
+{
+
+ TeLinearRing coords = poly[0];
+
+ TeBox box = coords.box();
+
+ int NSLICES = 10;
+
+ int NMAXSLICES = 400;
+
+ double yinit = box.lowerLeft().y();
+
+ while ( true )
+ {
+ int nparts = NSLICES + 2; // divide the box into slices
+
+ double increm = ( box.upperRight().y() - box.lowerLeft().y() ) / nparts; // y-increment
+
+ double yslice = yinit; // start at the bottom
+
+ TeCoordPairVect intersecList; //vector of horizontal intersections
+
+ doubleVect crossList; //vector of x-crossings
+
+ for ( int i = 0; i < NSLICES; i++ )
+ {
+ yslice += increm; //next slice
+
+ for (unsigned int x = 0; x < ( coords.size() - 1 ); x++ )
+ TeCoord2D cd= coords[x];
+
+ for (unsigned int j = 0; j < ( coords.size() - 1 ); j++ )
+ {
+
+ TeCoord2D vtx0 = coords[j];
+ TeCoord2D vtx1 = coords[j+1];
+
+ bool yflag0 = ( vtx0.y() >= yslice );
+ bool yflag1 = ( vtx1.y() >= yslice ) ;
+ /* check if endpoints straddle (are on opposite sides) of X axis
+ * (i.e. the Y's differ); if so, +X ray could intersect this edge.
+ */
+
+ if ( yflag0 != yflag1 )
+ {
+ // line crosses ring horizontally
+
+ double slope = ( vtx1.x() - vtx0.x() ) / ( vtx1.y() - vtx0.y());
+ double xcross = ( yslice - vtx0.y() )* slope + vtx0.x();
+
+ crossList.push_back ( xcross );
+ }
+
+ }
+
+ // Sort the x-intersections
+
+ sort ( crossList.begin(), crossList.end() );
+
+ doubleVect::iterator it = crossList.begin();
+
+ // Create a list of intersection points
+
+ while ( it != crossList.end() )
+ {
+ TeCoordPair cp;
+
+ cp.pt1 = TeCoord2D ( (*it), yslice );
+ ++it;
+ if ( it == crossList.end() ) break;
+
+ cp.pt2 = TeCoord2D ( (*it), yslice );
+ ++it;
+
+ intersecList.push_back ( cp );
+ }
+
+ } // for all slices
+
+ // Now sort all the intersections
+
+ sort ( intersecList.begin(), intersecList.end(), x_dist() );
+
+ // Go through the intersection list
+ // Find the mid-point
+
+ TeCoordPairVect::iterator it = intersecList.begin();
+
+ while ( it != intersecList.end() )
+ {
+ double xmid = (*it).pt1.x() + ( (*it).pt2.x() - (*it).pt1.x() ) / 2;
+
+ TeCoord2D pt ( xmid, (*it).pt2.y() );
+
+
+ if ( TeWithin (TePoint(pt), poly) ) // have we found it ???
+ return pt;
+
+ ++it; // try the next largest x-intersection
+ }
+
+ NSLICES *= 2; // double the number of slices
+
+ // iterate until a maximum number of slices
+ // if not able to find a centroid, log an error, but don't stop
+ if ( NSLICES > NMAXSLICES )
+ {
+ string userText = "Polygon number " + poly.geomId ();
+
+ TeErrorLog::instance().insert ( CENTROID_NOT_FOUND, userText );
+
+ return TeCoord2D ( TeMAXFLOAT, TeMAXFLOAT );
+ }
+ }
+
+}
+
+
diff --git a/src/terralib/kernel/TeComposite.h b/src/terralib/kernel/TeComposite.h
new file mode 100644
index 0000000..bddb193
--- /dev/null
+++ b/src/terralib/kernel/TeComposite.h
@@ -0,0 +1,195 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeComposite.h
+ This file contains definition of composite structures in TerraLib
+*/
+
+#ifndef __TERRALIB_INTERNAL_COMPOSITE_H
+#define __TERRALIB_INTERNAL_COMPOSITE_H
+
+#include "TeCounted.h"
+
+#include <vector>
+using namespace std;
+
+//! Defines a templated class for handling an object built of one single atomic element
+template <class T>
+class TeSingle
+{
+public:
+ //! Constructor
+ TeSingle<T>() {}
+
+ //! Destructor
+ virtual ~TeSingle<T>() {}
+
+ //! Copy constructor
+ TeSingle<T> ( T& elem ): elem_ ( elem ) {}
+
+ //! Adds the single element
+ void add ( T& elem )
+ { elem_ = elem; }
+
+ //! Returns a referency to the single element
+ T& location ()
+ { return elem_; }
+
+ //! Returns a constant reference to the single element
+ const T& location() const
+ {
+ return elem_;
+ }
+
+ //! Returns a referency to the single element
+ T& elem ()
+ { return elem_; }
+
+protected:
+ T elem_; //!< the single element
+
+};
+
+//! Defines a template for handling a composite object
+/*!
+ Provides a vector for storing components and ensures
+ proper destruction of them, by means of a handle/body idiom.
+ Provide a handle to an implementation and thus allow efficient
+ copying of derived objects
+
+ \note This is a specialised example of the "Composite"
+ design pattern, with support for the "Bridge" pattern
+ (also known as the handle/body idiom).
+*/
+template <class T>
+class TeComposite: public TeCounted
+{
+public:
+
+ using TeCounted::attach;
+ using TeCounted::detach;
+
+ //! An iterator to the composite elements
+ typedef typename vector<T>::iterator iterator;
+
+ //! Adds a new component
+ void add ( const T& elem )
+ { components_.push_back ( elem ); }
+
+ //! Removes the i-th component
+ bool erase ( unsigned int i )
+ {
+ if ( components_.size() < i )
+ return false;
+ return ! ( components_.erase ( components_.begin() + i ) == components_.end() );
+ }
+
+ //! Removes a specific element
+ /*!
+ \param elem the element to be removed
+ */
+ bool erase ( T& elem )
+ {
+ typename vector<T>::iterator location = find(components_.begin(),components_.end(), elem);
+ if ( location != components_.end())
+ {
+ components_.erase(elem);
+ return true;
+ }
+ else
+ return false;
+ }
+
+ //! Removes an element pointed by an iterator
+ iterator erase(iterator it)
+ {
+ return components_.erase(it);
+ }
+
+ //! Removes all elements
+ void clear ()
+ { components_.clear (); }
+
+ //! Returns the size of the composite
+ unsigned int size() const
+ { return components_.size(); }
+
+ //! Returns the i-th element
+ T& operator [] ( int i )
+ { return components_[ i ]; }
+
+ //! Returns TRUE if the composite is empty
+ bool empty() const
+ { return components_.empty(); }
+
+ //! Reserves space for n elements (reserve is available for vectors)
+ void reserve(int nelem)
+ { components_.reserve(nelem); }
+
+ //! Returns an iterator to the composite first element
+ iterator begin(void)
+ {
+ return components_.begin();
+ }
+
+ //! Returns an iterator to the composite first element
+ const iterator begin(void) const
+ {
+ return components_.begin();
+ }
+
+ //! Returns a iterator to the composite last plus one element
+ iterator end(void)
+ {
+ return components_.end();
+ }
+
+ //! Returns an iterator to the composite last plus one element
+ const iterator end(void) const
+ {
+ return components_.end();
+ }
+
+ //! A reverse iterator to the composite elements
+ typedef typename vector<T>::reverse_iterator reverse_iterator;
+
+ //! The iterator to the first position in the TeComposite in reverse order
+ reverse_iterator rbegin(void)
+ {
+ return components_.rbegin();
+ }
+
+ //! The iterator to the last plus one position in the TeComposite in reverse order
+ reverse_iterator rend(void)
+ {
+ return components_.rend();
+ }
+
+
+protected:
+ vector<T> components_; //!< a vector of components
+};
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeComputeAttributeStrategies.cpp b/src/terralib/kernel/TeComputeAttributeStrategies.cpp
new file mode 100644
index 0000000..ef711cc
--- /dev/null
+++ b/src/terralib/kernel/TeComputeAttributeStrategies.cpp
@@ -0,0 +1,969 @@
+// TeSpatialOperators.cpp: implementation of the TeSpatialOperators class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "TeComputeAttributeStrategies.h"
+#include "TeSTElementSet.h"
+#include "TeOverlay.h"
+
+using namespace TeOVERLAY;
+
+bool TeNearest (TeCoord2D& pt,TePointSet& ps, TeCoord2D& pout, double& dmin, const double& tol = 0.0);
+
+TePropertyVector
+TeCategoryAreaPercentageStrategy::compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+
+ // convert input box to a polygonset
+ TePolygonSet box_ps = TeBox2PolygonSet (box);
+ map<string, double> areaMap;
+ double partial_area = 0.0;
+
+ // Build stoset
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (attrName);
+ if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+ {
+
+ // initialize areMap
+ map<string, string>::iterator itMap = classesMap_.begin();
+ while (itMap != classesMap_.end())
+ {
+ areaMap[(*itMap).second] = 0;
+ ++itMap;
+ }
+ partial_area = 0.0;
+ // iterate over all objects that intercept the box
+ TeSTElementSet::iterator it = stos.begin();
+ while (it != stos.end())
+ {
+ string category;
+ if ((*it).getPropertyValue (attrName, category))
+ {
+ TePolygonSet objGeom;
+ if ((*it).getGeometry(objGeom))
+ {
+ TePolygonSet intersect;
+ TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+ double intersectArea = TeGeometryArea (intersect);
+ partial_area += intersectArea;
+ areaMap[classesMap_[category]] += intersectArea; // suppose objects are disjoint
+
+ }
+
+ }
+ ++it;
+ }
+ }
+
+ double areaTot = TeGeometryArea (box_ps);
+ double perc_total = 0.0;
+ double corrected_perc_total = 0.0;
+ vector<double> vec_percent;
+
+
+ map <string, double>:: iterator areaIt = areaMap.begin();
+ while(areaIt != areaMap.end())
+ {
+ double percent = 0.0;
+ if (areaTot != 0) percent = (*areaIt).second/areaTot;
+ perc_total += percent;
+ vec_percent.push_back (percent);
+ ++areaIt;
+ }
+
+
+ int i = 0;
+ if (perc_total > 1.5)
+ {
+ areaIt = areaMap.begin();
+ while(areaIt != areaMap.end())
+ {
+ if ((*areaIt).first == "")
+ {
+ perc_total = perc_total - vec_percent[i];
+ vec_percent[i] = 0.0;
+ }
+ ++areaIt;
+ i++;
+ }
+ }
+
+ i = 0;
+ if (perc_total > 1.02)
+ {
+ areaIt = areaMap.begin();
+ while(areaIt != areaMap.end())
+ {
+ vec_percent[i] = vec_percent[i]/perc_total;
+ ++areaIt;
+ i++;
+ }
+ }
+
+ TePropertyVector result;
+ i= 0;
+ areaIt = areaMap.begin();
+ while(areaIt != areaMap.end())
+ {
+
+ TeProperty prop;
+ double percent = vec_percent[i];
+ corrected_perc_total += percent;
+ prop.value_ = Te2String (percent); // count
+ prop.attr_.rep_.name_ = columnName + (*areaIt).first; // category
+ prop.attr_.rep_.type_ = TeREAL;
+ result.push_back (prop);
+ ++areaIt;
+ i++;
+
+ }
+ return result;
+
+}
+
+
+
+
+// For relative values to be weighted in space (e.g., population densitity, malaria per number of inhabitants, etc.)
+
+TePropertyVector TeAverageWeighbyAreaStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+
+ double weigh_val = 0.0;
+
+
+ // Build stoset
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (attrName);
+ if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+ {
+
+ // convert input box to a polygonset
+ TePolygonSet box_ps = TeBox2PolygonSet (box);
+ double areaBox = TeGeometryArea(box);
+ if (areaBox > 0.0)
+ {
+ TeSTElementSet::iterator it = stos.begin();
+ while (it != stos.end())
+ {
+ string val;
+ if ((*it).getPropertyValue (attrName, val))
+ {
+ double num_val = atof (val.c_str());
+ TePolygonSet objGeom;
+ if ((*it).getGeometry(objGeom))
+ {
+
+ // for (unsigned int i = 0 ; i < objGeom.size(); i++)
+ // TeRemoveDuplicatedCoordinates (objGeom[i]);
+ TePolygonSet intersect;
+ TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+ double intersectArea = TeGeometryArea (intersect);
+ weigh_val += num_val*(intersectArea/areaBox); // suppose objects are disjoint
+
+
+ }
+ }
+ ++it;
+ }
+ }
+ }
+
+ TeProperty prop;
+ prop.value_ = Te2String (weigh_val);
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+}
+
+
+
+
+
+TePropertyVector
+TeCategorySoilsAreaPercentageStrategy::compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+
+ map<string, double> areaMap;
+ double partial_area = 0.0;
+
+ // convert input box to a polygonset
+ TePolygonSet box_ps = TeBox2PolygonSet (box);
+ map<string, double> categoryMap;
+
+
+ // Build stoset
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (attrName);
+ if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+ {
+
+ // initialize areMap
+ map<string, string>::iterator itMap = classesMap_.begin();
+ while (itMap != classesMap_.end())
+ {
+ areaMap[(*itMap).second] = 0;
+ ++itMap;
+ }
+ partial_area = 0.0;
+ // iterate over all objects that intercept the box
+ TeSTElementSet::iterator it = stos.begin();
+ while (it != stos.end())
+ {
+ string category;
+ if ((*it).getPropertyValue (attrName, category))
+ {
+ TePolygonSet objGeom;
+ if ((*it).getGeometry(objGeom))
+ {
+ TePolygonSet intersect;
+ TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+ double intersectArea = TeGeometryArea (intersect);
+ partial_area += intersectArea;
+ areaMap[classesMap_[category]] += intersectArea; // suppose objects are disjoint
+ categoryMap[category] += intersectArea;
+ }
+
+ }
+ ++it;
+ }
+ }
+
+ double areaTot = TeGeometryArea (box_ps);
+
+ map <string, double>:: iterator categoryIt = categoryMap.begin();
+ if (partial_area > (1.5*areaTot))
+ {
+ while(categoryIt != categoryMap.end())
+ {
+ if ((*categoryIt).first == "")
+ {
+ partial_area -= (*categoryIt).second;
+ areaMap[classesMap_[(*categoryIt).first]] -= (*categoryIt).second;
+ (*categoryIt).second = 0.0;
+ }
+ ++categoryIt;
+ }
+ }
+
+ int i = 0;
+ double perc_total = 0.0;
+ vector<double> vec_percent;
+ map <string, double>:: iterator areaIt = areaMap.begin();
+ while(areaIt != areaMap.end())
+ {
+ double percent = 0.0;
+ if (areaTot != 0) percent = (*areaIt).second/areaTot;
+ perc_total += percent;
+ vec_percent.push_back (percent);
+ ++areaIt;
+ }
+
+ double corrected_perc_total = 0.0;
+ i = 0;
+ if (perc_total > 1.02)
+ {
+ areaIt = areaMap.begin();
+ while(areaIt != areaMap.end())
+ {
+ vec_percent[i] = vec_percent[i]/perc_total;
+ ++areaIt;
+ i++;
+ }
+ }
+
+ TePropertyVector result;
+ i= 0;
+ areaIt = areaMap.begin();
+ while(areaIt != areaMap.end())
+ {
+
+ TeProperty prop;
+ double percent = vec_percent[i];
+ corrected_perc_total += percent;
+ prop.value_ = Te2String (percent); // count
+ prop.attr_.rep_.name_ = columnName + (*areaIt).first; // category
+ prop.attr_.rep_.type_ = TeREAL;
+ result.push_back (prop);
+ ++areaIt;
+ i++;
+
+ }
+ return result;
+
+}
+
+TePropertyVector
+TeCategoryMajorityStrategy::compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+ map<string, double> areaMap;
+ // convert input box to a polygonset
+ TePolygonSet box_ps = TeBox2PolygonSet (box);
+
+ // Build stoset
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (attrName);
+ if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+ {
+ // initialize areMap
+ map<string, string>::iterator itMap = classesMap_.begin();
+ while (itMap != classesMap_.end())
+ {
+ areaMap[(*itMap).second] = 0;
+ ++itMap;
+ }
+
+ // iterate over all objects that intercept the box
+ TeSTElementSet::iterator it = stos.begin();
+ while (it != stos.end())
+ {
+ string category;
+ if ((*it).getPropertyValue (attrName, category))
+ {
+
+ TePolygonSet objGeom;
+ if ((*it).getGeometry(objGeom))
+ {
+ TePolygonSet intersect;
+ TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+ double intersectArea = TeGeometryArea (intersect);
+ areaMap[classesMap_[category]] += intersectArea; // suppose objects are disjoint
+ }
+
+ }
+ ++it;
+ }
+ }
+
+ double max = 0.0;
+ TePropertyVector result;
+ TeProperty prop;
+ prop.attr_.rep_.type_ = TeSTRING;
+// prop.value_ = defaultValue_.value_;
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.numChar_ = 48;
+ map <string, double>:: iterator it = areaMap.begin();
+ while(it != areaMap.end())
+ {
+ if ((*it).second > max)
+ {
+ prop.value_ = (*it).first;
+ max = (*it).second;
+ }
+ ++it;
+ }
+
+
+ result.push_back (prop);
+ return result;
+
+}
+
+TePropertyVector TeTotalAreaPercentageStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+ double area = TeGeometryArea(box);
+ double totArea = 0.0;
+
+ if (area > 0.0)
+ {
+ // convert input box to a polygonset
+ TePolygonSet box_ps = TeBox2PolygonSet (box);
+
+ // Build stoset
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (attrName);
+ if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+ {
+ // iterate over all objects that intercept the box
+ TeSTElementSet::iterator it = stos.begin();
+ while (it != stos.end())
+ {
+ TePolygonSet objGeom;
+ if ((*it).getGeometry(objGeom))
+ {
+ TePolygonSet intersect;
+ //TeGeometryAlgorithmsPrecision temp(0.0);
+ TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+ double intersectArea = TeGeometryArea (intersect);
+ totArea += intersectArea; // suppose objects are disjoint
+
+ }
+ ++it;
+ }
+ }
+ }
+
+ double percentage = 0.0;
+ if (area > 0.0) percentage = totArea/area;
+
+ if (percentage > 0.999) percentage = 1;
+ TeProperty prop;
+ prop.value_ = Te2String (percentage);
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+}
+
+
+
+TePropertyVector TeCountPolygonalObjectsStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox /* box */, const string& columnName)
+{
+ // Build stoset
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (attrName);
+ TeSTOSetBuildDB (&stos, true, false, attrNames);
+
+ TeProperty prop;
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ prop.value_ = Te2String (stos.numElements());
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+}
+
+
+TePropertyVector TeCountLineObjectsStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox /* box */, const string& columnName)
+{
+ // Build stoset
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (attrName);
+ TeSTOSetBuildDB (&stos, true, false, attrNames);
+
+ TeProperty prop;
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ prop.value_ = Te2String (stos.numElements());
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+}
+
+
+
+TePropertyVector TeCountPointObjectsStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox /* box */, const string& columnName)
+{
+ // Build stoset
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (attrName);
+ TeSTOSetBuildDB (&stos, true, false, attrNames);
+
+ TeProperty prop;
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ prop.value_ = Te2String (stos.numElements());
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+}
+
+
+TePropertyVector TeLineLengthStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+ double length = 0;
+
+ // Build stoset
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (attrName);
+ if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+ {
+
+ // convert input box to a polygonset
+ TePolygonSet box_ps = TeBox2PolygonSet (box);
+
+ double length = 0.0;
+ TeSTElementSet::iterator it = stos.begin();
+ while (it != stos.end())
+ {
+ TeLineSet objGeom;
+ if ((*it).getGeometry(objGeom))
+ {
+ TeLineSet intersect;
+ // if ((TeIntersection (area, (*it).geometry , intersect))
+ TeLineSet::iterator lineIt = intersect.begin();
+ while (lineIt != intersect.end())
+ {
+ length += TeLength (*lineIt); // suppose objects are disjoin
+ lineIt++;
+ }
+ }
+ ++it;
+ }
+ }
+
+
+ TeProperty prop;
+ prop.value_ = Te2String (length);
+ TePropertyVector result;
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+
+ result.push_back (prop);
+ return result;
+}
+
+
+
+// For absolute values to be partinioned in space (e.g., population, number of malaria cases, etc.)
+TePropertyVector TeSumWeighByAreaStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+ double weigh_val = 0.0;
+
+ // Build stoset
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (attrName);
+ if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+ {
+
+ // convert input box to a polygonset
+ TePolygonSet box_ps = TeBox2PolygonSet (box);
+ double areaBox = TeGeometryArea(box);
+ if (areaBox > 0.0)
+ {
+ TeSTElementSet::iterator it = stos.begin();
+ while (it != stos.end())
+ {
+ string val;
+ if ((*it).getPropertyValue (attrName, val))
+ {
+ double num_val = atof (val.c_str());
+ TePolygonSet objGeom;
+ if ((*it).getGeometry(objGeom))
+ {
+ //for (unsigned int i = 0 ; i < objGeom.size(); i++)
+ // TeRemoveDuplicatedCoordinates (objGeom[i]);
+ double geomArea = TeGeometryArea (objGeom);
+ if (geomArea > 0.0)
+ {
+ TePolygonSet intersect;
+ //TeGeometryAlgorithmsPrecision temp(0.0);
+ TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+ double intersectArea = TeGeometryArea (intersect);
+ weigh_val += num_val*(intersectArea/geomArea);
+
+ }
+
+ }
+ }
+ ++it;
+ }
+ }
+ }
+
+
+ TeProperty prop;
+ prop.value_ = Te2String (weigh_val);
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+}
+
+
+
+
+TePropertyVector TeSumWeighByRestrictedAreaStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+ double weigh_val = 0.0;
+
+ if (!raster_)
+ {
+ TeProperty prop;
+ prop.value_ = Te2String (weigh_val);
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+ }
+
+ double raster_elem_area = raster_->params().resx_*raster_->params().resy_;
+
+ // Build stoset
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (attrName);
+ if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+ {
+ // convert input box to a polygonset
+ TePolygonSet box_ps = TeBox2PolygonSet (box);
+ double areaBox = TeGeometryArea(box);
+ if (areaBox > 0.0)
+ {
+ TeSTElementSet::iterator it = stos.begin();
+ while (it != stos.end())
+ {
+ string val;
+ if ((*it).getPropertyValue (attrName, val))
+ {
+ double num_val = atof (val.c_str());
+ TePolygonSet objGeom;
+ if ((*it).getGeometry(objGeom))
+ {
+ double geomArea = TeGeometryArea (objGeom);
+ if (geomArea > 0.0)
+ {
+ TePolygonSet intersect;
+ TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+ double raster_intersect_area = 0.0;
+// double intersec_area = TeGeometryArea (intersect);
+ TePolygonSet::iterator psIt = intersect.begin();
+ while (psIt != intersect.end())
+ {
+
+ TeRaster::iteratorPoly raster_it;
+ TeRaster::iteratorPoly raster_it_end;
+ raster_it = raster_->begin (box_ps.first(), TeBoxPixelIn);
+ raster_it_end = raster_->end (box_ps.first(), TeBoxPixelIn);
+
+ while (raster_it != raster_it_end)
+ {
+ int val = (int)(raster_it.operator*(band_)); // OPERADOR * POR BANDA
+ if (val != 0) val = 5;
+ if (classesSelection_[val] == 1)
+ raster_intersect_area += raster_elem_area;
+ ++raster_it;
+ }
+ ++psIt;
+ }
+ weigh_val += num_val*(raster_intersect_area/geomArea); // avarege considering cell area
+ }
+ }
+ }
+ ++it;
+ }
+
+ }
+ }
+
+
+ TeProperty prop;
+ prop.value_ = Te2String (weigh_val);
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+}
+
+
+// For relative values to be weighted in space (e.g., percentage of a given land cover in the municipality, etc.)
+TePropertyVector TeAverageWeighByRestrictedAreaStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+ double weigh_val = 0.0;
+
+ if (!raster_)
+ {
+ TeProperty prop;
+ prop.value_ = Te2String (weigh_val);
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+ }
+
+ double raster_elem_area = raster_->params().resx_*raster_->params().resy_;
+
+ // Build stoset
+ TeSTElementSet stos (theme);
+ vector<string> attrNames;
+ attrNames.push_back (attrName);
+ if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+ {
+ // convert input box to a polygonset
+ TePolygonSet box_ps = TeBox2PolygonSet (box);
+ double areaBox = TeGeometryArea(box);
+ if (areaBox > 0.0)
+ {
+ TeSTElementSet::iterator it = stos.begin();
+ while (it != stos.end())
+ {
+ string val;
+ if ((*it).getPropertyValue (attrName, val))
+ {
+ double num_val = atof (val.c_str());
+ TePolygonSet objGeom;
+ if ((*it).getGeometry(objGeom))
+ {
+ double geomArea = TeGeometryArea (objGeom);
+ if (geomArea > 0.0)
+ {
+ TePolygonSet intersect;
+ TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+
+ double raster_intersect_area = 0.0;
+// double intersec_area = TeGeometryArea (intersect);
+
+ TePolygonSet::iterator psIt = intersect.begin();
+ while (psIt != intersect.end())
+ {
+ TeRaster::iteratorPoly raster_it(raster_);
+ TeRaster::iteratorPoly raster_it_end (raster_);
+ raster_it = raster_->begin ((*psIt), TeBoxPixelIn);
+ raster_it_end = raster_->end ((*psIt), TeBoxPixelIn);
+ while (raster_it != raster_it_end)
+ {
+ int val = (int)(raster_it.operator*(band_)); // OPERADOR * POR BANDA
+ if (classesSelection_[val] == 1)
+ raster_intersect_area += raster_elem_area;
+ ++raster_it;
+ }
+ ++psIt;
+ }
+ weigh_val += num_val*(raster_intersect_area/areaBox); // avarege considering cell area
+ }
+ }
+
+ }
+ ++it;
+ }
+
+ }
+ }
+
+
+ TeProperty prop;
+ prop.value_ = Te2String (weigh_val);
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+}
+
+
+TePropertyVector TeMinimumDistancePolygonsStrategy::
+compute (TeTheme* theme, const string& /* attrName */, TeBox box, const string& columnName)
+{
+ TePolygonSet ps;
+ if (theme->layer()->getPolygons(ps) == false)
+ {
+ TeProperty prop;
+ prop.value_ = Te2String (TeMAXFLOAT);
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+ }
+ TeCoord2D p1 = box.center();
+
+ TeCoord2D pinter;
+ double dmin = TeMAXFLOAT;
+
+ for (unsigned int i = 0; i < ps.size(); i++)
+ {
+ TePolygon p = ps[i];
+ if ((p.objectId() == "913") || (p.objectId() == "898"))
+ for (unsigned int j = 0; j < p.size(); j++)
+ {
+ TeLinearRing l = p[j];
+ //if (TeOrientation (l) == TeCOUNTERCLOCKWISE) // outside polygon
+ for (unsigned int k = 0; k < l.size(); k++)
+ {
+ double d = TeDistance (p1, l[k]);
+ if (d < dmin) dmin = d;
+ }
+ }
+ }
+
+ TeProperty prop;
+ prop.value_ = Te2String (dmin);
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+
+}
+
+TePropertyVector TeMinimumDistanceLinesStrategy::
+compute (TeTheme* theme, const string& /* attrName */, TeBox box, const string& columnName)
+{
+ TeLineSet ls;
+ if (theme->layer()->getLines(ls) == false)
+ {
+ TeProperty prop;
+ prop.value_ = Te2String (TeMAXFLOAT);
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+ }
+ TeCoord2D p1 = box.center();
+
+ int line_index;
+ TeCoord2D pinter;
+ double distance;
+
+ TeProperty prop;
+ prop.value_ = Te2String (TeMAXFLOAT);
+ if (TeNearest (p1, ls, line_index, pinter, distance))
+ prop.value_ = Te2String (distance);
+
+
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+
+}
+
+
+TePropertyVector TeMinimumDistancePointsStrategy::
+compute (TeTheme* theme, const string& /* attrName */, TeBox box, const string& columnName)
+{
+
+ TePointSet ps;
+ if (theme->layer()->getPoints (ps) == false)
+ {
+ TeProperty prop;
+ prop.value_ = Te2String (TeMAXFLOAT);
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+ }
+
+
+ // if (TeGetRepresentation (layer, ls, t) == false) return false;
+ TeCoord2D p1 = box.center();
+
+ TeCoord2D pinter;
+
+ TeProperty prop;
+ prop.value_ = Te2String (TeMAXFLOAT);
+// int i;
+ double distance;
+ if (TeNearest (p1, ps, pinter, distance))
+// if (TeNearest (p1, ps, i))
+ {
+ //double distance = TeDistance (p1, ps[i].location());
+ prop.value_ = Te2String (distance);
+ }
+
+
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+
+}
+
+
+
+TePolygonSet
+TeBox2PolygonSet (const TeBox& box)
+{
+ // create polygon representing each cell box
+ // simplification: assume same projection
+
+ TePolygon poly;
+
+ TeCoord2D coord1 (box.x1(), box.y1());
+ TeCoord2D coord2 (box.x1(), box.y2());
+ TeCoord2D coord3 (box.x2(), box.y2());
+ TeCoord2D coord4 (box.x2(), box.y1());
+ TeCoord2D coord5 (box.x1(), box.y1());
+
+ TeLine2D line;
+ line.add(coord1);
+ line.add(coord2);
+ line.add(coord3);
+ line.add(coord4);
+ line.add(coord5);
+
+ TeLinearRing ring(line);
+ poly.add(ring);
+ TePolygonSet ps;
+ ps.add (poly);
+ return ps;
+}
+
+
+TePolygon
+TeBox2Polygon (const TeBox& box)
+{
+ // create polygon representing each cell box
+ // simplification: assume same projection
+
+ TePolygon poly;
+
+ TeCoord2D coord1 (box.x1(), box.y1());
+ TeCoord2D coord2 (box.x1(), box.y2());
+ TeCoord2D coord3 (box.x2(), box.y2());
+ TeCoord2D coord4 (box.x2(), box.y1());
+ TeCoord2D coord5 (box.x1(), box.y1());
+
+ TeLine2D line;
+ line.add(coord1);
+ line.add(coord2);
+ line.add(coord3);
+ line.add(coord4);
+ line.add(coord5);
+
+ TeLinearRing ring(line);
+ poly.add(ring);
+
+ return poly;
+}
+
+
+
+bool TeNearest (TeCoord2D& pt,TePointSet& ps, TeCoord2D& pout, double& dmin, const double& /* tol */)
+{
+ bool flag = false;
+
+ dmin = TeMAXFLOAT;
+
+ for (unsigned int i = 0 ; i < ps.size(); i++)
+ {
+ double d = TeDistance (pt, ps[i].location());
+ if (d < dmin)
+ {
+
+ pout = ps[i].location();
+ dmin = d;
+ flag = true;
+ }
+
+ }
+ return flag;
+}
diff --git a/src/terralib/kernel/TeComputeAttributeStrategies.h b/src/terralib/kernel/TeComputeAttributeStrategies.h
new file mode 100644
index 0000000..5fc06a8
--- /dev/null
+++ b/src/terralib/kernel/TeComputeAttributeStrategies.h
@@ -0,0 +1,610 @@
+// TeOperationStrategy.h: interface for the TeOperationStrategy class.
+//
+//////////////////////////////////////////////////////////////////////
+
+
+/*! \file TeOperationStrategy.h
+ This file contains functions to compute attributes based on
+ alternative strategies. These strategies (Strategy Design Pattern)
+ correspond to operations to derive information based on other layers attributes and/or
+ spatial components (polygonal, raster, point, raster or other cells).
+*/
+
+
+
+#ifndef TeComputeAttrStrategies_H
+#define TeComputeAttrStrategies_H
+
+
+
+#include <TeAttribute.h>
+#include <TeLayer.h>
+#include <TeTimeInterval.h>
+#include <TeGeometryAlgorithms.h>
+#include <TeSTEFunctionsDB.h>
+
+
+TePolygonSet TeBox2PolygonSet (const TeBox& box);
+TePolygon TeBox2Polygon (const TeBox& box);
+
+
+///////////////////////////////////////////// Non-spatial Strategy Hierarchy
+//! Abstract class in the strategies hierarchy for computing attribute values based on other layers (Strategy Design Pattern).
+
+
+//! Abstract class in the strategies hierarchy for computing attribute values based on other layers (Strategy Design Pattern).
+template<class Iterator>
+class TeComputeAttrStrategy
+{
+protected:
+ TeComputeAttrStrategy () {};
+ TeProperty defaultValue_;
+public:
+ TeProperty defaultValue () {return defaultValue_;}
+ virtual vector<TeProperty> compute (Iterator /*first*/, Iterator /*last*/, const string& /*columnName*/)
+ {
+ vector<TeProperty> result;
+ result.push_back (defaultValue_);
+ return result;
+ }
+ virtual ~TeComputeAttrStrategy(){}
+
+};
+
+
+
+template<class Iterator>
+class TeAverageStrategy: public TeComputeAttrStrategy<Iterator>
+{
+public:
+
+ TeAverageStrategy (double defaultValue = 0.0) {this->defaultValue_.value_ = Te2String (defaultValue);}
+ virtual ~TeAverageStrategy() {}
+ virtual vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+ {
+
+ double tot_val = 0.0;
+ int num = 0;
+
+ Iterator it = first;
+ while (it != last)
+ {
+ tot_val += (*it);
+ num++;
+ ++it;
+ }
+
+ TeProperty prop;
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ prop.attr_.rep_.numChar_ = 48;
+ if (num > 0)
+ {
+ double val = tot_val/num;
+ prop.value_ = Te2String (val);
+ }
+ else prop.value_ = this->defaultValue_.value_;
+
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+ }
+
+};
+
+
+template<class Iterator>
+class TeSumStrategy: public TeComputeAttrStrategy<Iterator>
+{
+public:
+
+ TeSumStrategy (double defaultValue = 0.0) {this->defaultValue_.value_ = Te2String (defaultValue);}
+ virtual ~TeSumStrategy() {}
+ virtual vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+ {
+ double sum = 0.0;
+ Iterator it = first;
+ while (it != last)
+ {
+ sum += (*it);
+ ++it;
+ }
+
+ TeProperty prop;
+
+
+ if (first == last) prop = this->defaultValue_;
+ else prop.value_ = Te2String (sum);
+
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ prop.attr_.rep_.numChar_ = 48;
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+ }
+};
+
+
+template< class Iterator>
+class TeMinimumStrategy: public TeComputeAttrStrategy<Iterator>
+{
+public:
+
+ TeMinimumStrategy (double defaultValue = 0.0) {this->defaultValue_.value_ = Te2String (defaultValue);}
+ virtual ~TeMinimumStrategy() {}
+ virtual vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+ {
+ double min = TeMAXFLOAT;
+ Iterator it = first;
+ while (it != last)
+ {
+ double val = (*it);
+ if (val < min) min = val;
+ ++it;
+ }
+
+
+ TeProperty prop;
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ prop.attr_.rep_.numChar_ = 48;
+
+ if (first == last)
+ prop.value_ = this->defaultValue_.value_;
+ else
+ prop.value_ = Te2String (min);
+
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+ }
+};
+
+
+
+template< class Iterator>
+class TeMaximumStrategy: public TeComputeAttrStrategy<Iterator>
+{
+public:
+
+ TeMaximumStrategy (double defaultValue = 0.0) {this->defaultValue_.value_ = Te2String (defaultValue);}
+ virtual ~TeMaximumStrategy() {}
+ virtual vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+ {
+ double max = TeMINFLOAT;
+ Iterator it = first;
+ while (it != last)
+ {
+ double val = (*it);
+ if (val > max) max = val;
+ ++it;
+ }
+
+
+ TeProperty prop;
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeREAL;
+ prop.attr_.rep_.numChar_ = 48;
+
+ if (first == last)
+ prop.value_ = this->defaultValue_.value_;
+ else
+ prop.value_ = Te2String (max);
+
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+ }
+};
+
+
+template<class Iterator>
+class TeCategoryPercentageStrategy: public TeComputeAttrStrategy<Iterator>
+{
+private:
+ map<string, string> classesMap_;
+
+
+public:
+ TeCategoryPercentageStrategy (map<string, string>& classes, double defaultValue = 0.0)
+ {
+ this->defaultValue_.value_ = Te2String (defaultValue);
+ classesMap_ = classes;
+ }
+ virtual ~TeCategoryPercentageStrategy() {}
+ virtual vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+ {
+ TeProperty category;
+ int num = 0;
+
+ // initialize count
+ map<string, int> count;
+ map<string, string>::iterator itMap = classesMap_.begin();
+ while (itMap != classesMap_.end())
+ {
+ count[(*itMap).second] = 0;
+ ++itMap;
+ }
+
+ Iterator it = first;
+ while (it != last)
+ {
+ if (it.getProperty (category))
+ {
+ count[classesMap_[category.value_]]++;
+ num++;
+ }
+ ++it;
+ }
+
+ TePropertyVector result;
+ map <string, int>:: iterator count_it = count.begin();
+ while(count_it != count.end())
+ {
+ TeProperty prop;
+ prop.attr_.rep_.name_ = columnName + (*count_it).first; // category
+ prop.attr_.rep_.type_ = TeREAL;
+ prop.attr_.rep_.numChar_ = 48;
+
+ double percent = 0.0;
+ string cat = (*count_it).first;
+ double value = (double)(*count_it).second;
+ if (num != 0) percent = value/num;
+ prop.value_ = Te2String (percent); // count
+ result.push_back (prop);
+ ++count_it;
+ }
+ return result;
+ }
+
+};
+
+
+template<class Iterator>
+class TePresenceStrategy: public TeComputeAttrStrategy<Iterator>
+{
+public:
+ TePresenceStrategy (bool defaultValue = 0)
+ {
+ this->defaultValue_.attr_.rep_.type_ = TeINT;
+ this->defaultValue_.value_ = Te2String (defaultValue);
+ this->defaultValue_.attr_.rep_.numChar_ = 48;
+
+ }
+ virtual ~TePresenceStrategy() {}
+ virtual vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+ {
+ TeProperty prop;
+ if (first != last)
+ prop.value_ = "1";
+ else
+ prop = this->defaultValue_;
+
+ TePropertyVector result;
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.type_ = TeINT;
+ prop.attr_.rep_.numChar_ = 48;
+ result.push_back (prop);
+ return result;
+ }
+
+};
+
+template<class Iterator>
+class TeMajorityStrategy: public TeComputeAttrStrategy<Iterator>
+{
+public:
+ TeMajorityStrategy (TeAttrDataType defaultType = TeINT)
+ {
+ this->defaultValue_.attr_.rep_.type_ = defaultType;
+ this->defaultValue_.value_ = "0";
+ }
+ virtual ~TeMajorityStrategy() {}
+ virtual vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+ {
+ TeProperty category;
+ category.attr_.rep_.type_ = this->defaultValue_.attr_.rep_.type_;
+
+ map<string, int> count;
+ Iterator it = first;
+ while (it != last)
+ {
+ if (it.getProperty (category))
+ count[category.value_]++;
+ ++it;
+ }
+
+ TeProperty prop;
+ prop.attr_.rep_.type_ = category.attr_.rep_.type_;
+ prop.value_ = this->defaultValue_.value_;
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.numChar_ = 48;
+
+
+ int max = 0;
+ map <string, int>:: iterator count_it = count.begin();
+ while(count_it != count.end())
+ {
+ if ((*count_it).second > max)
+ {
+ prop.value_ = (*count_it).first;
+ max = (*count_it).second;
+ }
+ ++count_it;
+ }
+ TePropertyVector result;
+ result.push_back (prop);
+ return result;
+ }
+
+};
+
+template<class Iterator>
+class TeMajorityCategoryStrategy: public TeComputeAttrStrategy<Iterator>
+{
+ protected:
+ map<string, string> classesMap_;
+
+public:
+ TeMajorityCategoryStrategy (const map<string, string>& classesMap, TeAttrDataType defaultType = TeINT)
+ {
+ this->defaultValue_.attr_.rep_.type_ = defaultType;
+ this->defaultValue_.value_ = "0";
+ classesMap_ = classesMap;
+ }
+ virtual ~TeMajorityCategoryStrategy() {}
+ virtual vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+ {
+ TeProperty category;
+ category.attr_.rep_.type_ = this->defaultValue_.attr_.rep_.type_;
+
+
+ // initialize count
+ map<string, int> count;
+ map<string, string>::iterator itMap = classesMap_.begin();
+ while (itMap != classesMap_.end())
+ {
+ count[(*itMap).second] = 0;
+ ++itMap;
+ }
+
+ Iterator it = first;
+ while (it != last)
+ {
+ if (it.getProperty (category))
+ {
+ count[classesMap_[category.value_]]++;
+
+ }
+ ++it;
+ }
+
+
+
+ TePropertyVector result;
+ TeProperty prop;
+ prop.attr_.rep_.type_ = TeSTRING;
+// prop.value_ = defaultValue_.value_;
+ prop.attr_.rep_.name_ = columnName;
+ prop.attr_.rep_.numChar_ = 48;
+
+ int max = 0;
+ map <string, int>:: iterator count_it = count.begin();
+ while(count_it != count.end())
+ {
+ if ((*count_it).second > max)
+ {
+ prop.value_ = (*count_it).first;
+ max = (*count_it).second;
+ }
+ ++count_it;
+ }
+
+
+ result.push_back (prop);
+ return result;
+
+}
+};
+
+///////////////////////////////////////////////////// Spatial Strategy Hierarchy
+
+
+
+//! Abstract class in the strategies hierarchy for computing attribute values based on other layers (Strategy Design Pattern).
+
+class TeComputeAttrSpatialStrategy
+{
+ protected:
+ TeComputeAttrSpatialStrategy () {}
+ public:
+ virtual ~TeComputeAttrSpatialStrategy() {}
+ virtual TePropertyVector compute (TeTheme* /* theme */, const string& /* attrName */, TeBox /* box */, const string& /* columnName */)
+ {
+ TePropertyVector result;
+ return result;
+ }
+
+};
+
+
+class TeCategoryAreaPercentageStrategy: public TeComputeAttrSpatialStrategy
+{
+protected:
+ map<string, string> classesMap_;
+public:
+ TeCategoryAreaPercentageStrategy (const map<string, string>& classesMap) {classesMap_ = classesMap;};
+ virtual ~TeCategoryAreaPercentageStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+
+};
+
+
+
+class TeAverageWeighbyAreaStrategy: public TeComputeAttrSpatialStrategy
+{
+public:
+ TeAverageWeighbyAreaStrategy () {}
+ virtual ~TeAverageWeighbyAreaStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+class TeCategorySoilsAreaPercentageStrategy: public TeComputeAttrSpatialStrategy
+{
+protected:
+ map<string, string> classesMap_;
+public:
+ TeCategorySoilsAreaPercentageStrategy (const map<string, string>& classesMap) {classesMap_ = classesMap;};
+ virtual ~TeCategorySoilsAreaPercentageStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+
+};
+
+
+class TeCategoryMajorityStrategy: public TeComputeAttrSpatialStrategy
+{
+protected:
+ map<string, string> classesMap_;
+public:
+ TeCategoryMajorityStrategy (const map<string, string>& classesMap) {classesMap_ = classesMap;};
+ virtual ~TeCategoryMajorityStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+
+};
+
+
+
+
+
+
+class TeTotalAreaPercentageStrategy: public TeComputeAttrSpatialStrategy
+{
+
+public:
+ TeTotalAreaPercentageStrategy () {}
+ virtual ~TeTotalAreaPercentageStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+
+
+class TeCountPolygonalObjectsStrategy: public TeComputeAttrSpatialStrategy
+{
+
+public:
+ TeCountPolygonalObjectsStrategy () {}
+ virtual ~TeCountPolygonalObjectsStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+
+
+class TeCountLineObjectsStrategy: public TeComputeAttrSpatialStrategy
+{
+
+public:
+ TeCountLineObjectsStrategy () {}
+ virtual ~TeCountLineObjectsStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+
+class TeCountPointObjectsStrategy: public TeComputeAttrSpatialStrategy
+{
+
+public:
+ TeCountPointObjectsStrategy () {}
+ virtual ~TeCountPointObjectsStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+
+
+class TeLineLengthStrategy: public TeComputeAttrSpatialStrategy
+{
+public:
+ TeLineLengthStrategy () {}
+ virtual ~TeLineLengthStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+class TeMinimumDistancePolygonsStrategy: public TeComputeAttrSpatialStrategy
+{
+public:
+ TeMinimumDistancePolygonsStrategy () {}
+ virtual ~TeMinimumDistancePolygonsStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+class TeMinimumDistanceLinesStrategy: public TeComputeAttrSpatialStrategy
+{
+public:
+ TeMinimumDistanceLinesStrategy () {}
+ virtual ~TeMinimumDistanceLinesStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+class TeMinimumDistancePointsStrategy: public TeComputeAttrSpatialStrategy
+{
+public:
+ TeMinimumDistancePointsStrategy () {}
+ virtual ~TeMinimumDistancePointsStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+class TeSumWeighByAreaStrategy: public TeComputeAttrSpatialStrategy
+{
+public:
+ TeSumWeighByAreaStrategy () {}
+ virtual ~TeSumWeighByAreaStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+
+class TeSumWeighByRestrictedAreaStrategy: public TeComputeAttrSpatialStrategy
+{
+private:
+ TeRaster* raster_;
+ map<int, int> classesSelection_;
+ int band_;
+public:
+ TeSumWeighByRestrictedAreaStrategy (TeRaster* raster, map<int, int> classesSelection, int band = 0){
+ raster_ = raster;
+ classesSelection_ = classesSelection;
+ band_ = band;}
+ virtual ~TeSumWeighByRestrictedAreaStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+class TeAverageWeighByRestrictedAreaStrategy: public TeComputeAttrSpatialStrategy
+{
+private:
+ TeRaster* raster_;
+ map<int, int> classesSelection_;
+ int band_;
+public:
+ TeAverageWeighByRestrictedAreaStrategy (TeRaster* raster, map<int, int> classesSelection, int band = 0){
+ raster_ = raster;
+ classesSelection_ = classesSelection;
+ band_ = band;}
+ virtual ~TeAverageWeighByRestrictedAreaStrategy() {}
+ virtual TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+#endif
diff --git a/src/terralib/kernel/TeConsoleErrorMessage.cpp b/src/terralib/kernel/TeConsoleErrorMessage.cpp
new file mode 100644
index 0000000..451cc51
--- /dev/null
+++ b/src/terralib/kernel/TeConsoleErrorMessage.cpp
@@ -0,0 +1,51 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#include <iostream>
+#include "TeErrorMessage.h"
+
+using namespace std;
+
+class TeConsoleErrorMessage: public TeErrorMessage
+{
+public:
+
+ TeConsoleErrorMessage(){}
+ ~TeConsoleErrorMessage(){}
+ virtual TeMessageReturn apply (
+ const string& appName,
+ const string & msgText,
+ TeMessageType /* msgType */,
+ TeMessageIcon /* iconType */ )
+ { cout << appName << msgText; return Te_IDOK; }
+
+
+
+};
+
+
+class TeConsoleErrorMessagePrototype: public TeErrorMessagePrototype
+{
+ virtual TeErrorMessage* build()
+ { return new TeConsoleErrorMessage(); }
+
+}consoleInstance;
diff --git a/src/terralib/kernel/TeConsoleErrorMessage.h b/src/terralib/kernel/TeConsoleErrorMessage.h
new file mode 100644
index 0000000..ab4ed38
--- /dev/null
+++ b/src/terralib/kernel/TeConsoleErrorMessage.h
@@ -0,0 +1,69 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeConsoleErrorMessage.h
+ This file deals with the display of error messages in a console
+*/
+#ifndef TeConsoleErrorMessage_H
+#define TeConsoleErrorMessage_H
+
+#include <iostream>
+#include "TeErrorMessage.h"
+
+using namespace std;
+
+//! A class to handle the display of error messages in a console
+class TeConsoleErrorMessage: public TeErrorMessage
+{
+public:
+
+ //! Constructor
+ TeConsoleErrorMessage()
+ {}
+
+ //! Destructor
+ ~TeConsoleErrorMessage()
+ {}
+
+ //! Display the message
+ virtual TeMessageReturn apply (
+ const string& appName,
+ const string & msgText,
+ TeMessageType msgType,
+ TeMessageIcon iconType )
+ { cout << appName << msgText; return Te_IDOK; }
+
+};
+
+//! A prototype of a Console Error Message handler
+class TeConsoleErrorMessagePrototype: public TeErrorMessagePrototype
+{
+ virtual TeErrorMessage* build()
+ { return new TeConsoleErrorMessage(); }
+
+};
+
+//! A single instance of the console error message handler
+static TeConsoleErrorMessagePrototype consoleInstance;
+#endif
+
diff --git a/src/terralib/kernel/TeCoord2D.h b/src/terralib/kernel/TeCoord2D.h
new file mode 100644
index 0000000..763784d
--- /dev/null
+++ b/src/terralib/kernel/TeCoord2D.h
@@ -0,0 +1,148 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeCoord2D.h
+ This file contains the definition of a classes to handle 2D coordinates
+*/
+#ifndef __TERRALIB_INTERNAL_COORD2D_H
+#define __TERRALIB_INTERNAL_COORD2D_H
+
+#include <math.h>
+#include "TeDefines.h"
+#include "TePrecision.h"
+
+#include <vector>
+
+using namespace std;
+
+//! A class for handling 2D coordinates
+class TeCoord2D
+{
+public:
+
+ double x_; //!< x coordinate
+ double y_; //!< y coordinate
+
+//! Default contructor
+ TeCoord2D ( const double& x = 0., const double& y = 0. ):
+ x_ ( x ), y_ ( y ) {}
+
+//! Copy constructor
+ TeCoord2D (const TeCoord2D& cd)
+ {x_ = cd.x_; y_ = cd.y_;}
+
+//! Operator =
+ TeCoord2D& operator= ( const TeCoord2D& cd )
+ {
+ if ( this != &cd )
+ {
+ x_ = cd.x_; y_ = cd.y_;
+ }
+ return *this;
+ }
+
+//! Empty destructor.
+ ~TeCoord2D () { }
+
+//! Returns the X componente of the coordinate
+ double x () const
+ { return x_; }
+
+//! Sets the X componente of the coordinate
+ void x ( const double& valX )
+ { x_ = valX; }
+
+//! Returns the Y componente of the coordinate
+ double y () const
+ { return y_; }
+
+//! Sets the Y componente of the coordinate
+ void y(const double& valY)
+ { y_ = valY; }
+
+//! Sets the X and Y componentes of the coordinate
+ void setXY(const double& xVal, const double& yVal )
+ { x_= xVal; y_= yVal; }
+
+//! Adds two coordinates
+ void operator+=(const TeCoord2D& cd) {x_ += cd.x_; y_ += cd.y_;}
+
+//! Returns TRUE if current coordinate is smaller than or equal to TeCoord2D cd; returns FALSE otherwise
+ bool operator<= (const TeCoord2D& cd) const
+ {return (( y_ - cd.y_ <= TePrecision::instance().precision() ) &&
+ ( x_ - cd.x_ <= TePrecision::instance().precision() ) );}
+
+//! Returns TRUE if current coordinate is equal to TeCoord2D cd; returns FALSE otherwise
+ bool operator== (const TeCoord2D& cd) const
+ {return ( ( fabs (y_ - cd.y_) < TePrecision::instance().precision() )
+ && ( fabs (x_ - cd.x_) < TePrecision::instance().precision() ) ); }
+
+//! Returns TRUE if current coordinate is not equal to TeCoord2D cd; returns FALSE otherwise
+ bool operator!= (const TeCoord2D& cd) const
+ {return ( ( fabs (y_ - cd.y_) >= TePrecision::instance().precision() )
+ || ( fabs (x_ - cd.x_) >= TePrecision::instance().precision() ) );}
+
+//! Returns TRUE if current coordinate is smaller than TeCoord2D cd; returns FALSE otherwise
+ bool operator< (const TeCoord2D& cd) const
+ {return ( y_ - cd.y_ < TePrecision::instance().precision()
+ && x_ - cd.x_ < TePrecision::instance().precision() );}
+
+//! Returns TRUE if current coordinate greater than maximum allowed; returns FALSE otherwise
+ bool tooBig ()
+ {return ( y_ > TeMAXFLOAT/10.|| x_ > TeMAXFLOAT/10.);}
+
+//! Rescales the coordinate by a value in X (xscale) and in Y (yscale)
+ void scale ( const double xscale, const double yscale )
+ { x_ = x_* xscale; y_ = y_ * yscale; }
+
+
+//! Returns the middle coordinate in horizontal direction between current coordinate and rhs
+ TeCoord2D halfWayHoriz ( TeCoord2D& rhs )
+ {
+ TeCoord2D mid (( rhs.x() + x() ) / 2., y() );
+ return mid;
+ }
+
+//! Returns the middle coordinate in vertical direction between current coordinate and rhs
+ TeCoord2D halfWayVert ( TeCoord2D& rhs )
+ {
+ TeCoord2D mid ( x(), ( y() + rhs.y() ) / 2. );
+ return mid;
+ }
+
+ void objectId(const string& /* id */ )
+ { return; }
+};
+
+//! An structure that contains a pair of coordinates
+struct TeCoordPair
+{
+ TeCoord2D pt1;
+ TeCoord2D pt2;
+};
+
+//! A vector of pairs of coordinates
+typedef vector<TeCoordPair> TeCoordPairVect;
+
+#endif
+
diff --git a/src/terralib/kernel/TeCounted.h b/src/terralib/kernel/TeCounted.h
new file mode 100644
index 0000000..af9cf18
--- /dev/null
+++ b/src/terralib/kernel/TeCounted.h
@@ -0,0 +1,74 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeCounted.h
+ This file contains classes to support the counted object idiom
+*/
+#ifndef __TERRALIB_INTERNAL_COUNTED_H
+#define __TERRALIB_INTERNAL_COUNTED_H
+
+//! Supports the counted object idiom
+/*!
+ A counted class keeps track of how many abstract instances are pointing
+ to the same implementation.
+*/
+class TeCounted {
+public:
+
+// -- Contructors
+
+ //! Constructor: sets zero references when the object is built
+ TeCounted(): refCount_ ( 0 ){}
+
+// -- Methods
+
+ //! Increases the number of references to this object
+ void attach ()
+ { refCount_++; }
+
+ //! Decreases the number of references to this object. Destroy it if there are no more references to it
+ void detach ()
+ { if ( --refCount_ == 0 )
+ delete this; }
+
+ //! Returns the number of references to this object
+ int refCount()
+ { return refCount_; }
+
+ //! Destructor
+ virtual ~TeCounted(){}
+
+private:
+
+ //! No copy allowed
+ TeCounted(const TeCounted&);
+
+ //! No copy allowed
+ TeCounted& operator=(const TeCounted&){return *this;}
+
+// -- Members
+ int refCount_; //!< the number of references to this class
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeDataTypes.h b/src/terralib/kernel/TeDataTypes.h
new file mode 100644
index 0000000..7927cc5
--- /dev/null
+++ b/src/terralib/kernel/TeDataTypes.h
@@ -0,0 +1,172 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeDataTypes.h
+ This file contains enumerators and data types used by TerraLib
+*/
+#ifndef __TERRALIB_INTERNAL_DATATYPE_H
+#define __TERRALIB_INTERNAL_DATATYPE_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include <vector>
+#include <string>
+#include <map>
+
+using namespace std;
+
+//! SPRING�s data model entities
+enum TeSpringModels
+{ TeSPRCadastral=0, TeSPRNetwork=1, TeSPRThematic=2, TeSPRMNT=3 };
+
+
+//! Types for Attributes (stored in object-relational databases)
+enum TeAttrDataType
+{TeSTRING, TeREAL, TeINT, TeDATETIME, TeBLOB, TeOBJECT, TeCHARACTER, TeUNKNOWN};
+
+
+//! Geometrical representations
+/*! Uses a binary ennumeration since the same layer
+ may contain more than one geometrical representation
+*/
+enum TeGeomRep
+{ TePOLYGONS = 1, TeLINES = 2, TePOINTS = 4, TeSAMPLES = 8, TeCONTOURS = 16,
+ TeARCS = 32, TeNODES = 64 , TeTEXT = 128, TeCELLS = 256 , TeRASTER = 512,
+ TeRASTERFILE = 1024, TeGEOMETRYNONE = 2048 };
+
+//! Chart types
+enum TeChartType
+{ TeBarChart, TePieChart };
+
+//! Objects that will be grouped or used in a chart
+enum TeSelectedObjects
+{ TeAll, TeSelectedByPointing, TeNotSelectedByPointing, TeSelectedByQuery, TeNotSelectedByQuery, TeGrouped, TeNotGrouped };
+
+//! Modes of object selection
+enum TeObjectSelectionMode
+{ TeDefaultSelection, TePointingSelection, TeQuerySelection, TePointingAndQuerySelection };
+
+//! Modes of grouping objects
+enum TeGroupingMode
+{ TeEqualSteps, TeQuantil, TeStdDeviation, TeUniqueValue, TeRasterSlicing };
+
+//! Direction of use in a ramp color
+enum TeColorDirection
+{ TeColorAscSatEnd, TeColorDescSatEnd, TeColorAscSatBegin, TeColorDescSatBegin };
+
+//! Types of attribute tables in a layer
+enum TeAttrTableType
+{ TeAllAttrTypes, TeAttrStatic, TeAttrMedia, TeAttrExternal, TeAttrEvent, TeFixedGeomDynAttr,
+ TeDynGeomDynAttr, TeGeomAttrLinkTime, TeGeocodingData };
+
+//! Types of integrity relations among tables in a database
+enum TeDBRelationType
+{ TeNoRelation, TeRINoCascadeDeletion, TeRICascadeDeletion };
+
+//! Data types
+enum TeDataType
+{ TeBIT, TeUNSIGNEDCHAR, TeCHAR, TeUNSIGNEDSHORT, TeSHORT, TeINTEGER, TeUNSIGNEDLONG, TeLONG, TeFLOAT, TeDOUBLE };
+
+//! Compression modes to store raster data in a TerraLib database
+enum TeCompressionMode
+{ TeNoCompression, TeZLib, TeJPEG, TeTIFFCOMPRESSION };
+
+//! Tiling type modes to store raster data in a TerraLib database
+enum TeRasterTilingType
+{ TeExpansible=1, TeNoExpansible=2 };
+
+
+//! Statistics
+/*!
+ - TeSUM sum of the values
+ - TeMAXVALUE maximum value
+ - TeMINVALUE minimal value
+ - TeCOUNT total number of the values
+ - TeVALIDCOUNT valid number of the values
+ - TeSTANDARDDEVIATION standard deviation
+ - TeKERNEL kernel
+ - TeMEAN mean
+ - TeVARIANCE variance
+ - TeSKEWNESS third moment about the Mean
+ - TeKURTOSIS forth moment about the Mean
+ - TeAMPLITUDE maximum value minus minimal value
+ - TeMEDIAN median value
+ - TeVARCOEFF coefficient of variation
+ - TeMODE value more frequent
+*/
+enum TeStatisticType
+{ TeNOSTATISTIC, TeSUM, TeMAXVALUE, TeMINVALUE, TeCOUNT, TeVALIDCOUNT, TeSTANDARDDEVIATION, TeKERNEL,
+ TeMEAN, TeVARIANCE, TeSKEWNESS, TeKURTOSIS, TeAMPLITUDE, TeMEDIAN, TeVARCOEFF, TeMODE};
+
+//! A map of an statistic to its value
+typedef map<TeStatisticType, double> TeStatisticValMap;
+
+//! A map of an statistic to its string value
+typedef map<TeStatisticType, string> TeStatisticStringValMap;
+
+//! A map of an object id to its statistics
+typedef map<string, TeStatisticValMap> TeObjStatisticsMap;
+
+//! A map of an statistic to the column name where its value is stored
+typedef map<TeStatisticType, string> TeStatisticsMap;
+
+//! Intersection Algorithms.
+enum TeIntersectorAlgorithm { TeBentleyOttman, TeRedBlue, TeTrivial };
+
+//! Topological relations
+enum TeSpatialRelation
+{ TeDISJOINT = 1, TeTOUCHES = 2, TeCROSSES = 4, TeWITHIN = 8,
+ TeOVERLAPS = 16, TeCONTAINS = 32, TeINTERSECTS = 64, TeEQUALS = 128, TeCOVERS = 256,
+ TeCOVEREDBY = 512, TeUNDEFINEDREL = 1024};
+
+//! Temporal predicates
+enum TeTemporalRelation { TeTIMEUNDEFINED, TeTIMEEQUAL, TeTIMEBEFORE, TeTIMEAFTER, TeTIMEMEETS, TeTIMEDURING, TeTIMEOVERLAPS, TeTIMEENDS, TeTIMESTARTS };
+
+//! Logical predicates
+enum TeLogicalOperator { TeAND = 1, TeOR = 2 };
+
+//! Time chronons
+enum TeChronon { TeNOCHRONON, TeSECOND, TeMINUTE, TeHOUR, TeDAY, TeMONTH, TeYEAR,
+ TeDAYOFWEEK, TeDAYOFMONTH, TeDAYOFYEAR, TeMONTHOFYEAR, TeSEASON, TeWEEKOFYEAR,
+ TeHOUROFDAY, TeMINUTEOFHOUR, TeSECONDOFMINUTE };
+
+//! Polygon style types
+enum TePolyBasicType { TePolyTypeTransparent=0, TePolyTypeFill=1, TePolyTypeHorizontal=2,
+ TePolyTypeVertical=3, TePolyTypeFDiagonal=4, TePolyTypeBDiagonal=5,
+ TePolyTypeCross=6, TePolyTypeDiagonalCross=7 };
+//! Line style types
+enum TeLnBasicType { TeLnTypeContinuous=0, TeLnTypeDashed=1, TeLnTypeDotted=2,
+ TeLnTypeDashDot=3, TeLnTypeDashDotDot=4, TeLnTypeNone=5 };
+//! Point style types
+enum TePtBasicType { TePtTypePlus=0, TePtTypeStar=1, TePtTypeCircle=2, TePtTypeX=3,
+ TePtTypeBox=4, TePtTypeDiamond=5, TePtTypeHollowCircle=6,
+ TePtTypeHollowBox=7, TePtTypeHollowDiamond=8 };
+
+//! Type of segment intersection
+enum TeSegmentIntersectionType { TeProperIntersection, TeImproperIntersection };
+
+
+#endif
+
diff --git a/src/terralib/kernel/TeDatabase.cpp b/src/terralib/kernel/TeDatabase.cpp
new file mode 100644
index 0000000..7721c39
--- /dev/null
+++ b/src/terralib/kernel/TeDatabase.cpp
@@ -0,0 +1,6504 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeDecoderDatabase.h"
+#include "TeRasterRemap.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeSpatialOperations.h"
+#include "TeImportRaster.h"
+#include "TeDatabase.h"
+
+#include <stdio.h>
+
+typedef map<int,TeNode> TeNodeMap;
+
+static const int scales [] =
+{ 150000,
+ 80000,
+ 40000,
+ 20000,
+ 10000,
+ 3000,
+ 1500,
+ 800,
+ 400,
+ 200,
+ 100,
+ 30,
+ 15,
+ 8,
+ 4,
+ 2,
+ 1
+};
+
+//-*********************
+
+TeDatabase::TeDatabase() :
+ isConnected_ (false),
+ host_(""),
+ user_(""),
+ password_(""),
+ database_(""),
+ portNumber_(0),
+ errorNumber_(0),
+ errorMessage_("")
+{
+}
+
+
+TeDatabase::~TeDatabase()
+{
+}
+
+bool TeDatabase::validTable (TeTable& table)
+{
+ int cont=0;
+ bool change = false;
+ bool changeTable = false;
+ bool uniqueName, linkName;
+
+ TeAttributeList::iterator it = table.attributeList().begin();
+ TeAttributeList::iterator it2;
+ while(it != table.attributeList().end())
+ {
+ uniqueName = false;
+ linkName = false;
+
+ if((*it).rep_.name_==table.uniqueName())
+ uniqueName=true;
+
+ if((*it).rep_.name_==table.linkName())
+ linkName=true;
+
+ string errorMess;
+ string temp = TeCheckName((*it).rep_.name_, change, errorMess);
+
+ if(change)
+ {
+ it2 = table.attributeList().begin();
+ while(it2!=table.attributeList().end())
+ {
+ if(temp==(*it2).rep_.name_)
+ {
+ temp += Te2String(cont);
+ it2 = table.attributeList().begin();
+ ++cont;
+ }
+ else
+ ++it2;
+ }
+
+ changeTable = true;
+ }
+
+ if(change && uniqueName)
+ table.setUniqueName(temp);
+ if(change && linkName)
+ table.setLinkName (temp);
+
+ (*it).rep_.name_ = temp;
+ ++it;
+ ++cont;
+ }
+
+ return changeTable;
+}
+
+string TeDatabase::getTableName(int tableId)
+{
+ string tableName;
+
+ TeDatabasePortal* pt = getPortal();
+ string q = "SELECT attr_table FROM te_layer_table";
+ q += " WHERE table_id = " + Te2String(tableId);
+ if (pt->query(q) == true && pt->fetchRow())
+ tableName = pt->getData("attr_table");
+ delete pt;
+ return tableName;
+}
+
+bool TeDatabase::createTable(const string& table, TeAttributeList &attr)
+{
+ string q ="CREATE TABLE " + table +" (";
+ string type;
+ char size[8];
+ bool first=true;
+
+ string pkeys;
+
+ TeAttributeList::iterator it;
+ it = attr.begin();
+ while ( it != attr.end() )
+ {
+ string name = (*it).rep_.name_;
+
+ switch ((*it).rep_.type_)
+ {
+ case TeSTRING:
+ type = "VARCHAR ";
+ sprintf (size,"(%d)",(*it).rep_.numChar_);
+ type += string (size);
+ break;
+ case TeREAL:
+ type = "DOUBLE";
+ sprintf (size,"(%d,%d)",(*it).rep_.numChar_, (*it).rep_.decimals_);
+ type += string (size);
+ break;
+ case TeINT:
+ type = "INT ";
+ break;
+ case TeCHARACTER:
+ type = "CHAR ";
+ break;
+ case TeDATETIME:
+ type = "DATETIME "; //time
+ break;
+ case TeBLOB:
+ type = "BLOB ";
+ break;
+ default:
+ type = "VARCHAR ";
+ sprintf (size,"(%d)",(*it).rep_.numChar_);
+ type += string (size);
+ break;
+ }
+
+ if((*it).rep_.isAutoNumber_ && (*it).rep_.isPrimaryKey_)
+ type += " AUTO_INCREMENT ";
+
+ if (!first)
+ q += ",";
+ else
+ first = false;
+
+ q += name + " " + type;
+
+ // check if column is part of primary key
+ if ( (*it).rep_.isPrimaryKey_ && (*it).rep_.type_ != TeBLOB )
+ {
+ if (!pkeys.empty())
+ pkeys += ", ";
+ pkeys += (*it).rep_.name_;
+ q += " NOT NULL ";
+ }
+
+ ++it;
+ }
+
+ if (!pkeys.empty())
+ q += ", PRIMARY KEY (" + pkeys + ") ";
+ q += ")";
+
+ return execute(q);
+}
+
+bool
+TeDatabase::deleteTable (const string& table)
+{
+ int f = table.find ("te_collection", std::string::npos);
+
+ if( table=="te_theme" ||
+ table=="te_layer" ||
+ table=="te_representation" ||
+ table=="te_tables_relation" ||
+ table=="te_layer_table" ||
+ table=="te_raster_metadata" ||
+ table=="te_projection" ||
+ table=="te_view" ||
+ table=="te_legend" ||
+ table=="te_visual" ||
+ table=="te_database" ||
+ f == 0)
+ {
+ errorMessage_ = "N�o � poss�vel deletar tabelas do modelo!";
+ return false;
+ }
+
+ string del = "DROP TABLE " + table;
+ if(!execute(del))
+ return false;
+
+ return true;
+}
+
+
+bool
+TeDatabase::deleteColumn (const string& table, const string& colName)
+{
+ if (!tableExist(table))
+ return false;
+ TeAttribute attr;
+ if (!columnExist(table,colName,attr))
+ return true;
+ string drop = "ALTER TABLE " + table + " DROP COLUMN " + colName;
+ if(execute(drop) == false)
+ return false;
+
+ string tableId;
+ TeDatabasePortal* portal = getPortal();
+ string sql = "SELECT table_id FROM te_layer_table WHERE attr_table = '" + table + "'";
+ if(portal->query(sql) && portal->fetchRow())
+ tableId = portal->getData(0);
+
+ delete portal;
+ if(tableId.empty() == false)
+ {
+ // delete relation
+ sql = "DELETE FROM te_tables_relation WHERE (related_table_id = " + tableId;
+ sql += " AND related_attr = '" + colName + "')";
+ sql += " OR (external_table_name = '" + table + "'";
+ sql += " AND external_attr = '" + colName + "')";
+ if(execute(sql) == false)
+ return false;
+
+ // delete grouping
+ TeDatabasePortal* portal = getPortal();
+ sql = "SELECT theme_id FROM te_grouping WHERE grouping_attr = '" + table + "." + colName + "'";
+ if(portal->query(sql) && portal->fetchRow())
+ {
+ string themeId = portal->getData(0);
+
+ sql = "DELETE FROM te_legend WHERE theme_id = " + themeId + " AND group_id >= 0";
+ if(execute(sql) == false)
+ {
+ delete portal;
+ return false;
+ }
+ }
+ delete portal;
+
+ sql = "DELETE FROM te_grouping";
+ sql += " WHERE grouping_attr = '" + table + "." + colName + "'";
+ if(execute(sql) == false)
+ return false;
+ }
+ return true;
+}
+
+
+bool
+TeDatabase::defineIntegrity(void)
+{
+ if (existRelation("te_layer","fk_layer_proj_id") == TeNoRelation )
+ if (!createRelation("fk_layer_proj_id", "te_layer", "projection_id", "te_projection", "projection_id", false))
+ return false;
+
+ if (existRelation("te_representation","fk_rep_layer_id") == TeNoRelation )
+ if (!createRelation("fk_rep_layer_id", "te_representation", "layer_id", "te_layer", "layer_id", true))
+ return false;
+
+ if (existRelation("te_view","fk_view_proj_id") == TeNoRelation )
+ if (!createRelation("fk_view_proj_id", "te_view", "projection_id", "te_projection", "projection_id", false))
+ return false;
+
+ if (existRelation("te_theme","fk_theme_layer_id") == TeNoRelation )
+ if (!createRelation("fk_theme_layer_id", "te_theme", "layer_id", "te_layer", "layer_id", true))
+ return false;
+
+ if (existRelation("te_theme","fk_theme_view_id") == TeNoRelation )
+ if (!createRelation("fk_theme_view_id", "te_theme", "view_id", "te_view", "view_id", true))
+ return false;
+
+ if (existRelation("te_theme_table","fk_thmtable_theme_id") == TeNoRelation )
+ if (!createRelation("fk_thmtable_theme_id", "te_theme_table", "theme_id", "te_theme", "theme_id", true))
+ return false;
+
+ if (existRelation("te_theme_table","fk_thmtable_lytable_id") == TeNoRelation )
+ if (!createRelation("fk_thmtable_lytable_id", "te_theme_table", "table_id", "te_layer_table", "table_id", true))
+ return false;
+
+ if (existRelation("te_theme_table","fk_thmtable_relation_id") == TeNoRelation )
+ if (!createRelation("fk_thmtable_relation_id", "te_theme_table", "relation_id", "te_tables_relation", "relation_id", true))
+ return false;
+
+ if (existRelation("te_grouping","fk_group_theme_id") == TeNoRelation )
+ if (!createRelation("fk_group_theme_id", "te_grouping", "theme_id", "te_theme", "theme_id", true))
+ return false;
+
+ if (existRelation("te_legend","fk_legend_theme_id") == TeNoRelation )
+ if (!createRelation("fk_legend_theme_id", "te_legend", "theme_id", "te_theme", "theme_id", true))
+ return false;
+
+ if (existRelation("te_visual","fk_visual_legend_id") == TeNoRelation )
+ if (!createRelation("fk_visual_legend_id", "te_visual", "legend_id", "te_legend", "legend_id", true))
+ return false;
+
+ if (existRelation("te_layer_table","fk_laytable_layer_id") == TeNoRelation )
+ if (!createRelation ("fk_laytable_layer_id", "te_layer_table", "layer_id", "te_layer", "layer_id", true))
+ return false;
+
+ if (existRelation("te_tables_relation","fk_tabrelation_laytable_id") == TeNoRelation )
+ if (!createRelation("fk_tabrelation_laytable_id", "te_tables_relation", "related_table_id", "te_layer_table", "table_id", true))
+ return false;
+
+ if (existRelation("te_visual_raster","fk_visrast_theme_id") == TeNoRelation )
+ if (!createRelation("fk_visrast_theme_id", "te_visual_raster", "theme_id", "te_theme", "theme_id", true))
+ return false;
+
+ return true;
+}
+
+bool
+TeDatabase::createConceptualModel(bool withIntegrity, bool newDatabase, bool /* createIndex */)
+{
+ bool status = true;
+ bool createMainTables = false;
+
+ if (!this->tableExist("te_projection"))
+ {
+ status = this->createProjectionTable();
+ if (!status)
+ return false;
+ createMainTables = true;
+ }
+
+ if (!this->tableExist("te_layer"))
+ {
+ status = this->createLayerTable();
+ if (!status)
+ return false;
+ createMainTables = true;
+ }
+
+ if (!this->tableExist("te_layer_table"))
+ {
+ status = this->createLayerTableTable();
+ if (!status)
+ return false;
+ createMainTables = true;
+ }
+
+ if (!this->tableExist("te_tables_relation"))
+ {
+ status = this->createTablesRelationTable();
+ if (!status)
+ return false;
+ }
+
+ if (!this->tableExist("te_representation"))
+ {
+ status = this->createRepresentationTable();
+ if (!status)
+ return false;
+ createMainTables = true;
+ }
+
+ if (!this->tableExist("te_view"))
+ {
+ status = this->createViewTable();
+ if (!status)
+ return false;
+ createMainTables = true;
+ }
+
+ if (!this->tableExist("te_theme"))
+ {
+ status = this->createThemeTable();
+ if (!status)
+ return false;
+ }
+
+ if (!this->tableExist("te_grouping"))
+ {
+ status = this->createGroupingTable();
+ if (!status)
+ return false;
+ }
+
+ if (!this->tableExist("te_theme_table"))
+ {
+ status = this->createThemeTablesTable();
+ if (!status)
+ return false;
+ }
+
+ if (!this->tableExist("te_legend"))
+ {
+ status = this->createLegendTable();
+ if (!status)
+ return false;
+ }
+
+ if (!this->tableExist("te_visual"))
+ {
+ status = this->createVisualTable();
+ if (!status)
+ return false;
+ }
+
+ if (!this->tableExist("te_visual_raster"))
+ {
+ status = this->createVisualRasterTable();
+ if (!status)
+ return false;
+ }
+
+ if (!this->tableExist("te_database"))
+ {
+ status = this->createDatabaseTable();
+ if (!status)
+ return false;
+ }
+
+ if(newDatabase || createMainTables)
+ {
+ string ins = "INSERT INTO te_database (db_version) VALUES ('3.0.2')";
+ if (!execute(ins))
+ return false;
+ }
+
+ if (withIntegrity)
+ status = defineIntegrity();
+
+ return status;
+}
+
+bool
+TeDatabase::createIndex(const string& tableName, const string& indexName, const string& columnsName)
+{
+ string sql = "CREATE INDEX " + indexName + " ON " + tableName + "(" + columnsName + ")";
+ return execute (sql);
+}
+
+bool
+TeDatabase::createDatabaseTable()
+{
+ string create = "CREATE TABLE te_database (";
+ create += "db_version VARCHAR(50) NOT NULL,";
+ create += "db_creation DATETIME,";
+ create += "PRIMARY KEY (db_version))";
+ return execute (create);
+}
+
+
+bool
+TeDatabase::createProjectionTable ()
+{
+ string create = "CREATE TABLE te_projection (";
+ create += "projection_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ create += "name VARCHAR(50) NOT NULL,";
+ create += "long0 DOUBLE(24,15) DEFAULT '0.0',";
+ create += "lat0 DOUBLE(24,15) DEFAULT '0.0',";
+ create += "offx DOUBLE(24,15) DEFAULT '0.0',";
+ create += "offy DOUBLE(24,15) DEFAULT '0.0',";
+ create += "stlat1 DOUBLE(24,15) DEFAULT '0.0',";
+ create += "stlat2 DOUBLE(24,15) DEFAULT '0.0',";
+ create += "unit VARCHAR(50) NOT NULL,";
+ create += "scale DOUBLE(24,15) DEFAULT '0.0',";
+ create += "hemis INT(4) NOT NULL,";
+ create += "datum VARCHAR(50) NOT NULL,";
+ create += "radius DOUBLE(24,15) DEFAULT '0.0',";
+ create += "flattening DOUBLE(24,15) DEFAULT '0.0',";
+ create += "dx DOUBLE(24,15) DEFAULT '0.0',";
+ create += "dy DOUBLE(24,15) DEFAULT '0.0',";
+ create += "dz DOUBLE(24,15) DEFAULT '0.0',";
+ create += "PRIMARY KEY (projection_id))";
+ return execute (create);
+}
+
+bool TeDatabase::createLayerTable ()
+{
+ string create = "CREATE TABLE te_layer (";
+ create += "layer_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ create += "projection_id INT(10) UNSIGNED NOT NULL,";
+ create += "name VARCHAR(255) NOT NULL,";
+ create += "lower_x DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
+ create += "lower_y DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
+ create += "upper_x DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
+ create += "upper_y DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
+ create += "initial_time DATETIME,";
+ create += "final_time DATETIME, ";
+ create += "PRIMARY KEY (layer_id))";
+ return execute (create);
+}
+
+bool TeDatabase::createLayerTableTable()
+{
+ string create = "CREATE TABLE te_layer_table (";
+ create += "table_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ create += "layer_id INT(10) UNSIGNED,";
+ create += "attr_table VARCHAR(255) NOT NULL,";
+ create += "unique_id VARCHAR(255), ";
+ create += "attr_link VARCHAR(255), ";
+ create += "attr_initial_time VARCHAR(255), ";
+ create += "attr_final_time VARCHAR(255), ";
+ create += "attr_time_unit INT(4) UNSIGNED, ";
+ create += "attr_table_type INT(4) UNSIGNED, ";
+ create += "user_name VARCHAR(255),";
+ create += "initial_time DATETIME,";
+ create += "final_time DATETIME, ";
+ create += "PRIMARY KEY (table_id))";
+ return execute (create);
+}
+
+bool
+TeDatabase::updateTableInfo(int layerId, TeTable &table, const string user)
+{
+ if (table.id() <= 0 ) // table information doesn�t exist in database yet
+ return this->insertTableInfo(layerId,table,user);
+ string sql;
+ sql = "UPDATE te_layer_table SET ";
+ sql += "unique_id='" + table.uniqueName() + "', ";
+ sql += "attr_link='" + table.linkName() + "', ";
+ sql += "attr_initial_time='" + table.attInitialTime() + "', ";
+ sql += "attr_final_time='" + table.attFinalTime() + "', ";
+ sql += "attr_time_unit=" + Te2String(table.attTimeUnit()) + ", ";
+ sql += "attr_table_type="+ Te2String(table.tableType()) + ", ";
+ sql += "user_name='" + user + "' WHERE ";
+ sql += "layer_id=" + Te2String(layerId) + " AND ";
+ sql += "attr_table_name='" + table.name() + "'";
+ return execute (sql);
+}
+
+bool
+TeDatabase::loadTableInfo(TeTable& table)
+{
+ if (table.name().empty())
+ return false;
+
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ {
+ this->errorMessage_ = "N�o foi poss�vel abrir portal para o banco";
+ return false;
+ }
+
+ string get = "SELECT * FROM te_layer_table WHERE attr_table = '" + table.name() + "'";
+ if (!portal->query(get) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ table.setId(portal->getInt("table_id"));
+ table.setLinkName(portal->getData("attr_link"));
+ table.setUniqueName(portal->getData("unique_id"));
+ table.setTableType(TeAttrTableType(portal->getInt("attr_table_type")));
+ TeAttributeList attrList;
+ getAttributeList(table.name(), attrList);
+ table.setAttributeList(attrList);
+ table.attInitialTime(portal->getData("attr_initial_time"));
+ table.attFinalTime(portal->getData("attr_final_time"));
+ table.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
+ delete portal;
+ return true;
+}
+
+
+bool TeDatabase::createLUTTable(const string& name)
+{
+ string create = "CREATE TABLE " + name + "(";
+ create += "index_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ create += "r_val INT(10) UNSIGNED NOT NULL,";
+ create += "g_val INT(10) NOT NULL,";
+ create += "b_val INT(10) NOT NULL,";
+ create += "PRIMARY KEY (index_id))";
+ return execute (create);
+}
+
+bool TeDatabase::createTablesRelationTable()
+{
+ string create = "CREATE TABLE te_tables_relation (";
+ create += "relation_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ create += "related_table_id INT(10) NOT NULL,";
+ create += "related_attr VARCHAR(255) NOT NULL,";
+ create += "external_table_name VARCHAR(255) NOT NULL,";
+ create += "external_attr VARCHAR(255) NOT NULL,";
+ create += "PRIMARY KEY (relation_id))";
+ return execute (create);
+}
+
+bool TeDatabase::createRepresentationTable ()
+{
+ string create = "CREATE TABLE te_representation (";
+ create += "repres_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, ";
+ create += "layer_id INT(10) UNSIGNED NOT NULL, ";
+ create += "geom_type INT(10) NOT NULL, ";
+ create += "geom_table VARCHAR(255) NOT NULL, ";
+ create += "description VARCHAR(255), ";
+ create += "lower_x DOUBLE(24,15) DEFAULT '0.0', ";
+ create += "lower_y DOUBLE(24,15) DEFAULT '0.0', ";
+ create += "upper_x DOUBLE(24,15) DEFAULT '0.0', ";
+ create += "upper_y DOUBLE(24,15) DEFAULT '0.0', ";
+ create += "res_x DOUBLE(24,15) DEFAULT '0.0', ";
+ create += "res_y DOUBLE(24,15) DEFAULT '0.0', ";
+ create += "num_cols INT(10), ";
+ create += "num_rows INT(10), ";
+ create += "initial_time DATETIME, ";
+ create += "final_time DATETIME, ";
+ create += "PRIMARY KEY (repres_id), ";
+ create += "INDEX representation_index (layer_id,geom_type))";
+ return execute (create);
+}
+
+bool TeDatabase::createRasterMetadataTable(const string& tableName)
+{
+ if (tableName.empty())
+ return false;
+
+ string create = "CREATE TABLE " + tableName + " (";
+ create += " geom_id INT(10) UNSIGNED NOT NULL, ";
+ create += " band_id INT(10) UNSIGNED NOT NULL, ";
+ create += " min_value DOUBLE(24,15) DEFAULT '0.0', ";
+ create += " max_value DOUBLE(24,15) DEFAULT '0.0', ";
+ create += " num_bits INT(10), ";
+ create += " data_type INT(4), ";
+ create += " photometric_type INT(4), ";
+ create += " compression_type INT(4), ";
+ create += " dummy DOUBLE(24,15), ";
+ create += " PRIMARY KEY (geom_id, band_id))";
+ return execute (create);
+}
+
+
+bool TeDatabase::createRasterGeometry(const string& tableName)
+{
+ if (tableName.empty())
+ return false;
+
+ string create = "CREATE TABLE " + tableName + " (";
+ create += "geom_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, ";
+ create += "object_id VARCHAR(255) NOT NULL, ";
+ create += "raster_table VARCHAR(255) NOT NULL, ";
+ create += "lut_table VARCHAR(255), ";
+ create += "res_x DOUBLE(24,15) DEFAULT '0.0', ";
+ create += "res_y DOUBLE(24,15) DEFAULT '0.0', ";
+ create += "num_bands INT(10), ";
+ create += "num_cols INT(10), ";
+ create += "num_rows INT(10), ";
+ create += "block_height INT(10), ";
+ create += "block_width INT(10), ";
+ create += "lower_x DOUBLE(24,15) DEFAULT '0.0', ";
+ create += "lower_y DOUBLE(24,15) DEFAULT '0.0', ";
+ create += "upper_x DOUBLE(24,15) DEFAULT '0.0', ";
+ create += "upper_y DOUBLE(24,15) DEFAULT '0.0', ";
+ create += "tiling_type INT(4), ";
+ create += "PRIMARY KEY (geom_id), ";
+ create += "INDEX " + tableName + "_index(object_id))";
+ return execute (create);
+}
+
+bool TeDatabase::createViewTable ()
+{
+ string create = "CREATE TABLE te_view (";
+ create += "view_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ create += "projection_id INT(10) UNSIGNED NOT NULL,";
+ create += "name VARCHAR(255) NOT NULL,";
+ create += "user_name VARCHAR(255),";
+ create += "visibility INT(4),";
+ create += "PRIMARY KEY (view_id))";
+ return execute (create);
+}
+
+bool TeDatabase::createThemeTable ()
+{
+ string create = "CREATE TABLE te_theme (";
+ create += " theme_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ create += " layer_id INT(10) UNSIGNED,";
+ create += " view_id INT(10) UNSIGNED NOT NULL,";
+ create += " name VARCHAR(255) NOT NULL,";
+ create += " parent_id INT(10) UNSIGNED NOT NULL,";
+ create += " priority INT(10) UNSIGNED NOT NULL,";
+ create += " node_type INT(4) UNSIGNED NOT NULL,";
+ create += " min_scale DOUBLE(24,15),";
+ create += " max_scale DOUBLE(24,15),";
+ create += " generate_attribute_where VARCHAR(255),";
+ create += " generate_spatial_where VARCHAR(255),";
+ create += " generate_temporal_where VARCHAR(255),";
+ create += " collection_table VARCHAR(255),";
+ create += " visible_rep INT(10) UNSIGNED,";
+ create += " enable_visibility INT(10) UNSIGNED,";
+ create += " PRIMARY KEY (theme_id),";
+ create += " INDEX view_id_idx(view_id))";
+ return execute (create);
+}
+
+bool TeDatabase::createGroupingTable()
+{
+ string create = "CREATE TABLE te_grouping (";
+ create += " theme_id INT(10) UNSIGNED NOT NULL,";
+ create += " grouping_number INT(10) UNSIGNED,";
+ create += " grouping_attr VARCHAR(255),";
+ create += " grouping_attr_type INT(4) UNSIGNED,";
+ create += " grouping_mode INT(4) UNSIGNED,";
+ create += " grouping_norm_attr VARCHAR(255),";
+ create += " grouping_std_dev DOUBLE(24,15) DEFAULT '0.0',";
+ create += " grouping_precision INT(10) UNSIGNED,";
+ create += " grouping_function VARCHAR(20),";
+ create += " PRIMARY KEY (theme_id))";
+ return execute (create);
+}
+
+bool TeDatabase::createThemeTablesTable()
+{
+ string create = "CREATE TABLE te_theme_table (";
+ create += " theme_table_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ create += " theme_id INT(10) UNSIGNED NOT NULL,";
+ create += " table_id INT(10) UNSIGNED NOT NULL,";
+ create += " relation_id INT(10) UNSIGNED,";
+ create += " table_order INT(10) UNSIGNED,";
+ create += " PRIMARY KEY (theme_table_id), ";
+ create += " INDEX theme_table_index(theme_id))";
+
+ return execute (create);
+}
+
+bool TeDatabase::createLegendTable ()
+{
+ string create = "CREATE TABLE te_legend (";
+ create += " legend_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ create += " theme_id INT(10) UNSIGNED NOT NULL,";
+ create += " group_id INT(10) ,";
+ create += " num_objs INT(10) UNSIGNED,";
+ create += " lower_value VARCHAR(255),";
+ create += " upper_value VARCHAR(255),";
+ create += " label VARCHAR(255), ";
+ create += " PRIMARY KEY (legend_id),";
+ create += " INDEX legend_index (theme_id))";
+ return execute (create);
+}
+
+
+bool TeDatabase::createVisualTable()
+{
+ string create = "CREATE TABLE te_visual (";
+ create += " legend_id INT(10) UNSIGNED NOT NULL,";
+ create += " geom_type INT(4) UNSIGNED NOT NULL,";
+ create += " lib_name VARCHAR(255), ";
+ create += " symb_id INT(10), ";
+ create += " red INT(4) UNSIGNED,";
+ create += " green INT(4) UNSIGNED,";
+ create += " blue INT(4) UNSIGNED,";
+ create += " transparency INT(4) UNSIGNED,";
+ create += " width INT(4) UNSIGNED,";
+ create += " contour_lib_name VARCHAR(255), ";
+ create += " contour_symb_id INT(10), ";
+ create += " contour_red INT(4) UNSIGNED,";
+ create += " contour_green INT(4) UNSIGNED,";
+ create += " contour_blue INT(4) UNSIGNED,";
+ create += " contour_transp INT(4) UNSIGNED,";
+ create += " contour_width INT(10) UNSIGNED,";
+ create += " size_value INT(10) UNSIGNED,";
+ create += " pt_angle INT(4) UNSIGNED,";
+ create += " family VARCHAR(255),";
+ create += " bold INT(4) UNSIGNED,";
+ create += " italic INT(4) UNSIGNED,";
+ create += " alignment_vert DOUBLE(24,15),";
+ create += " alignment_horiz DOUBLE(24,15),";
+ create += " tab_size INT(4) UNSIGNED,";
+ create += " line_space INT(4) UNSIGNED,";
+ create += " fixed_size INT(4) UNSIGNED,";
+ create += " PRIMARY KEY (legend_id, geom_type))";
+ return execute (create);
+}
+
+bool TeDatabase::createVisualRasterTable()
+{
+ string create = "CREATE TABLE te_visual_raster (";
+ create += " theme_id INT(10) UNSIGNED NOT NULL,";
+ create += " band_in INT(4) UNSIGNED NOT NULL,";
+ create += " band_out INT(4) UNSIGNED, ";
+ create += " transf_type INT(4), ";
+ create += " param1 DOUBLE(24,15),";
+ create += " param2 DOUBLE(24,15),";
+ create += " lut_table VARCHAR(255), ";
+ create += " PRIMARY KEY (theme_id, band_in))";
+ return execute (create);
+}
+
+bool TeDatabase::insertVisual (TeLegendEntry *legend)
+{
+ TeGeomRepVisualMap mapVis = legend->getVisualMap();
+ TeGeomRepVisualMap::iterator it = mapVis.begin();
+ while ( it != mapVis.end())
+ {
+ TeGeomRep rep = it->first;
+ TeVisual vis = it->second;
+
+ string style, contourStyle, sizeValue, width;
+
+ if(rep == TePOLYGONS || rep == TeCELLS)
+ {
+ sizeValue = Te2String(0);
+ contourStyle = Te2String(vis.contourStyle());
+ width = Te2String(0);
+ style = Te2String(vis.style());
+ }
+ else if(rep == TeLINES)
+ {
+ sizeValue = Te2String(0);
+ contourStyle = Te2String(0);
+ width = Te2String(vis.width());
+ style = Te2String(vis.style());
+ }
+ else if(rep == TePOINTS)
+ {
+ sizeValue = Te2String(vis.size());
+ contourStyle = Te2String(0);
+ width = Te2String(0);
+ style = Te2String(vis.style());
+ }
+ else if(rep == TeTEXT)
+ {
+ sizeValue = Te2String(vis.size());
+ contourStyle = Te2String(0);
+ width = Te2String(0);
+ style = Te2String(0);
+ }
+
+ string insert = "INSERT INTO te_visual(legend_id, geom_type, ";
+ insert += "lib_name, symb_id, ";
+ insert += "red, green, blue, transparency, width, ";
+ insert += "contour_lib_name, contour_symb_id, ";
+ insert += "contour_red, contour_green,";
+ insert += "contour_blue, contour_transp, contour_width, size_value,";
+ insert += "pt_angle, family, bold, italic, ";
+ insert += "alignment_vert, alignment_horiz, tab_size, line_space, fixed_size) ";
+ insert += " VALUES (";
+ insert += Te2String(legend->id()) + ", ";
+ insert += Te2String(rep)+ ", ";
+
+ TeColor cor = vis.color(); // filling color
+ TeColor contourCor = vis.contourColor();// contour color
+
+ insert += "'"+ vis.libName() + "', ";
+ insert += style + ", ";
+ insert += Te2String(cor.red_) + ", ";
+ insert += Te2String(cor.green_) + ", ";
+ insert += Te2String(cor.blue_) + ", ";
+ insert += Te2String(vis.transparency()) + ", ";
+ insert += width +",";
+
+ insert += "'"+ vis.contourLibName() + "', ";
+ insert += contourStyle + ", ";
+ insert += Te2String(contourCor.red_) + ", ";
+ insert += Te2String(contourCor.green_) + ", ";
+ insert += Te2String(contourCor.blue_) + ", ";
+ insert += Te2String(vis.contourTransparency()) + ", ";
+ insert += Te2String(vis.contourWidth()) + ", ";
+
+ insert += sizeValue +",";
+ insert += Te2String(vis.ptAngle()) +", ";
+
+ insert += "'" + vis.family() + "', ";
+ if (vis.bold())
+ insert += "1, ";
+ else
+ insert += "0, ";
+ if (vis.italic())
+ insert += "1, ";
+ else
+ insert += "0, ";
+ insert += Te2String(vis.alignmentVert()) + ",";
+ insert += Te2String(vis.alignmentHoriz()) + ",";
+ insert += Te2String(vis.tabSize()) + ",";
+ insert += Te2String(vis.lineSpace()) +",";
+ if (vis.fixedSize())
+ insert += "1 ";
+ else
+ insert += "0";
+ insert += ")";
+
+ if (!execute(insert))
+ return false;
+ ++it;
+ }
+ return true;
+}
+
+bool TeDatabase::createCollectionTable(const string& tableName)
+{
+ string create = "CREATE TABLE " + tableName + " (";
+ create += " c_object_id VARCHAR(255) NOT NULL, ";
+ create += " c_legend_id INT(10), ";
+ create += " label_x DOUBLE(24,9), ";
+ create += " label_y DOUBLE(24,9), ";
+ create += " c_legend_own INT(10), ";
+ create += " c_object_status INT(10), ";
+ create += " PRIMARY KEY (c_object_id))";
+ return execute (create);
+}
+
+bool TeDatabase::createCellGeometry (const string& table)
+{
+ string q ="CREATE TABLE " + table +"(";
+ q += "geom_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ q += "object_id VARCHAR(255) NOT NULL ,";
+ q += "lower_x double(24,15) NOT NULL ,";
+ q += "lower_y double(24,15) NOT NULL ,";
+ q += "upper_x double(24,15) NOT NULL ,";
+ q += "upper_y double(24,15) NOT NULL ,";
+ q += "col_number INT(10) NOT NULL ,";
+ q += "row_number INT(10) NOT NULL ,";
+ q += "PRIMARY KEY (geom_id),";
+ q += "INDEX (object_id),";
+ q += "INDEX box_idx (lower_x, lower_y,upper_x, upper_y),";
+ q += "INDEX lc (row_number, col_number))";
+ return execute(q);
+}
+
+bool TeDatabase::createTextGeometry(const string& table)
+{
+ string q ="CREATE TABLE " + table +"(";
+ q += " geom_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ q += " object_id VARCHAR(255) NOT NULL ,";
+ q += " x DOUBLE(24,9) DEFAULT '0.0',";
+ q += " y DOUBLE(24,9) DEFAULT '0.0',";
+ q += " text_value VARCHAR(255),";
+ q += " angle DOUBLE(24,9) DEFAULT '0.0',";
+ q += " height DOUBLE(24,9) DEFAULT '0.0',";
+ q += " alignment_vert DOUBLE(24,9),";
+ q += " alignment_horiz DOUBLE(24,9),";
+ q += "PRIMARY KEY (geom_id),";
+ q += "INDEX (object_id),";
+ q += "INDEX pos_idx(x,y))";
+ return execute(q);
+}
+
+bool TeDatabase::createNodeGeometry(const string& table)
+{
+ string q ="CREATE TABLE " + table +"(";
+ q += "geom_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ q += "object_id VARCHAR(255) NOT NULL ,";
+ q += "x DOUBLE(24,15) DEFAULT '0.0',";
+ q += "y DOUBLE(24,15) DEFAULT '0.0',";
+ q += "PRIMARY KEY (geom_id),";
+ q += "INDEX (object_id),";
+ q += "INDEX pos_idx(x,y))";
+ return execute(q);
+}
+
+bool TeDatabase::createPointGeometry(const string& table)
+{
+ string q ="CREATE TABLE " + table +"(";
+ q += "geom_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ q += "object_id VARCHAR(255) NOT NULL ,";
+ q += "x DOUBLE(24,15) DEFAULT '0.0',";
+ q += "y DOUBLE(24,15) DEFAULT '0.0',";
+ q += "PRIMARY KEY (geom_id),";
+ q += "INDEX (object_id),";
+ q += "INDEX pos_idx(x,y))";
+ return execute(q);
+}
+
+bool TeDatabase::createArcGeometry(const string& table)
+{
+ string q ="CREATE TABLE " + table +"(";
+ q += "geom_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+ q += "object_id VARCHAR(255) NOT NULL ,";
+ q += "from_node INT(10),";
+ q += "to_node INT(10),";
+ q += "PRIMARY KEY (geom_id),";
+ q += "INDEX (object_id),";
+ q += "INDEX (from_node),";
+ q += "INDEX (to_node))";
+ return execute(q);
+}
+
+
+bool
+TeDatabase::insertTable (TeTable &table)
+{
+ string tableName = table.name();
+ TeAttributeList att = table.attributeList();
+ TeAttributeList::iterator it = att.begin();
+
+ TeTableRow row;
+ unsigned int i;
+ unsigned int j;
+ for ( i = 0; i < table.size(); i++ )
+ {
+ row = table[i];
+ it = att.begin();
+ string q = "INSERT INTO "+tableName+" values(";
+ j = 1;
+ int jj = 0;
+ string dt = "";
+ while ( it != att.end() )
+ {
+ if(((*it).rep_.type_==TeDATETIME) && (!row[jj].empty()))
+ {
+ const string temp_dt = string(row[jj].c_str());
+ TeTime t(temp_dt, (*it).dateChronon_, (*it).dateTimeFormat_, (*it).dateSeparator_, (*it).timeSeparator_, (*it).indicatorPM_);
+ dt=t.getDateTime("YYYYsMMsDDsHHsmmsSS", "-");
+ }
+
+ switch ((*it).rep_.type_)
+ {
+ case TeSTRING:
+ q += "'"+this->escapeSequence(row[jj])+"'";
+ break;
+ case TeREAL:
+ q += "'"+row[jj]+"'";
+ break;
+ case TeINT:
+ q += "'"+row[jj]+"'";
+ break;
+ case TeDATETIME:
+ q += "'"+dt+"'";
+ break;
+ default:
+ q += "'"+this->escapeSequence(row[jj])+"'";
+ break;
+ }
+ if (j<att.size())
+ q+= ",";
+ ++it;
+ j++;
+ jj++;
+ }
+ q += ")";
+ if (!this->execute(q))
+// return false;
+ continue;
+ }
+ return true;
+}
+
+bool
+TeDatabase::alterTable(const string& tableName, TeAttributeRep& rep, const string& oldColName)
+{
+ if(!tableExist(tableName))
+ return false;
+
+ string tab;
+
+ if(oldColName.empty())
+ {
+ tab = " ALTER TABLE " + tableName + " MODIFY ";
+ tab += rep.name_ +" ";
+ }
+ else
+ {
+ tab = " ALTER TABLE " + tableName + " CHANGE ";
+ tab += oldColName +" "+ rep.name_ +" ";
+ }
+
+ switch (rep.type_)
+ {
+ case TeSTRING:
+ tab += "VARCHAR(" + Te2String(rep.numChar_) + ") ";
+ break;
+
+ case TeREAL:
+ tab += "DOUBLE";
+ break;
+
+ case TeINT:
+ tab += "INT";
+ break;
+
+ case TeDATETIME:
+ tab += "DATETIME";
+ break;
+
+ case TeCHARACTER:
+ tab += "CHAR";
+ break;
+
+ case TeBLOB:
+ tab += "LONGBLOB";
+ break;
+
+ default:
+ tab += "VARCHAR(" + Te2String(rep.numChar_) + ") ";
+ break;
+ }
+
+ tab += " NULL ";
+
+ if(!execute(tab))
+ {
+ if(errorMessage_.empty())
+ errorMessage_ = "Error alter table " + tableName + " !";
+ return false;
+ }
+
+ string tableId;
+ TeDatabasePortal* portal = getPortal();
+ string sql = "SELECT table_id FROM te_layer_table WHERE attr_table = '" + tableName + "'";
+ if(portal->query(sql) && portal->fetchRow())
+ tableId = portal->getData(0);
+
+ delete portal;
+
+ if(tableId.empty() == false)
+ {
+ if(oldColName.empty() == false) // column name changed
+ {
+ // update relation
+ sql = "UPDATE te_tables_relation SET related_attr = '" + rep.name_ + "'";
+ sql += " WHERE related_table_id = " + tableId;
+ sql += " AND related_attr = '" + oldColName + "'";
+ if(execute(sql) == false)
+ return false;
+
+ sql = "UPDATE te_tables_relation SET external_attr = '" + rep.name_ + "'";
+ sql += " WHERE external_table_name = '" + tableName + "'";
+ sql += " AND external_attr = '" + oldColName + "'";
+ if(execute(sql) == false)
+ return false;
+
+ // update grouping
+ sql = "UPDATE te_grouping SET grouping_attr = '" + tableName + "." + rep.name_ + "'";
+ sql += " WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
+ if(execute(sql) == false)
+ return false;
+ }
+ else // column type changed
+ {
+ // delete relation
+ sql = "DELETE FROM te_tables_relation WHERE (related_table_id = " + tableId;
+ sql += " AND related_attr = '" + rep.name_ + "')";
+ sql += " OR (external_table_name = '" + tableName + "'";
+ sql += " AND external_attr = '" + rep.name_ + "')";
+ if(execute(sql) == false)
+ return false;
+
+ // delete grouping
+ TeDatabasePortal* portal = getPortal();
+ sql = "SELECT theme_id FROM te_grouping WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
+ if(portal->query(sql) && portal->fetchRow())
+ {
+ string themeId = portal->getData(0);
+
+ sql = "DELETE FROM te_legend WHERE theme_id = " + themeId + " AND group_id >= 0";
+ if(execute(sql) == false)
+ {
+ delete portal;
+ return false;
+ }
+ }
+ delete portal;
+
+ sql = "DELETE FROM te_grouping";
+ sql += " WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
+ if(execute(sql) == false)
+ return false;
+ }
+ }
+ return true;
+}
+
+bool
+TeDatabase::getAttrTables(TeAttrTableVector& atts, TeAttrTableType attType)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ {
+ this->errorMessage_ = "N�o foi poss�vel abrir portal para o banco";
+ return false;
+ }
+
+ // Get layer tables
+ string get = " SELECT * FROM te_layer_table";
+ if (attType != TeAllAttrTypes)
+ get += " WHERE attr_table_type = " + Te2String(attType);
+ if (!portal->query(get))
+ {
+ delete portal;
+ return false;
+ }
+
+ while (portal->fetchRow())
+ {
+ string tableName = portal->getData("attr_table");
+ int tableId = portal->getInt("table_id");
+ string indexName = portal->getData("attr_link");
+
+ TeAttributeList attrList;
+ getAttributeList(tableName, attrList);
+
+ TeTable attTable(tableName,attrList,
+ portal->getData("unique_id"), indexName,
+ TeAttrTableType(portal->getInt("attr_table_type")));
+
+ attTable.setId(tableId);
+ attTable.attInitialTime(portal->getData("attr_initial_time"));
+ attTable.attFinalTime(portal->getData("attr_final_time"));
+ attTable.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
+ atts.push_back(attTable);
+ }
+ delete portal;
+ return (atts.size() > 0);
+}
+
+bool
+TeDatabase::updateTable (TeTable &table)
+{
+ string tableName = table.name();
+ TeAttributeList att = table.attributeList();
+ TeAttributeList::iterator it = att.begin();
+
+ TeTableRow row;
+ unsigned int i;
+ string uniqueName = table.uniqueName();
+ string uniqueVal;
+ bool isUniqueValString = false;
+
+ for ( i = 0; i < table.size(); i++ )
+ {
+ row = table[i];
+ it = att.begin();
+ string q = "UPDATE "+tableName+" SET ";
+ unsigned int jj = 0;
+ while ( it != att.end() )
+ {
+ string val = row[jj];
+ if(row[jj].empty())
+ val = " NULL ";
+
+ if ((*it).rep_.name_ != uniqueName)
+ {
+ q += (*it).rep_.name_ + "=";
+ switch ((*it).rep_.type_)
+ {
+ case TeSTRING:
+ q += "'"+escapeSequence(row[jj])+"'";
+ break;
+ case TeREAL:
+ q += val;
+ break;
+ case TeINT:
+ q += val;
+ break;
+ default:
+ q += "'"+escapeSequence(row[jj])+"'";
+ break;
+ }
+ if (jj < att.size()-1)
+ q+= ",";
+ }
+ else
+ {
+ if((*it).rep_.type_ == TeSTRING)
+ isUniqueValString = true;
+ uniqueVal = row[jj];
+ }
+
+ ++it;
+ jj++;
+ }
+
+ if(isUniqueValString)
+ q += " WHERE " + uniqueName + " = '" + uniqueVal +"'";
+ else
+ q += " WHERE " + uniqueName + " = " + uniqueVal;
+
+ if (!this->execute(q))
+ continue;
+ }
+ return true;
+}
+
+
+bool
+TeDatabase::loadTable(const string& tableName, TeTable &table)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ string q ="SELECT * FROM " + tableName;
+ if (!portal->query(q))
+ {
+ delete portal;
+ return false;
+ }
+ table.name(tableName);
+ table.setAttributeList(portal->AttributeList());
+
+ while (portal->fetchRow())
+ {
+ TeTableRow row;
+ for (int j = 0; j < portal->numFields(); j++)
+ row.push_back (portal->getData (j));
+ table.add(row);
+ }
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::selectTable (const string& tableName, const string& criteria, TeTable &table)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ string q ="SELECT * FROM " + tableName;
+ if (!criteria.empty())
+ q += " WHERE " + criteria;
+
+ if (!portal->query(q))
+ {
+ delete portal;
+ return false;
+ }
+ table.name(tableName);
+ table.setAttributeList(portal->AttributeList());
+
+ while (portal->fetchRow())
+ {
+ TeTableRow row;
+ for(int i = 0; i < portal->numFields(); i++)
+ row.push_back(portal->getData(i));
+ table.add(row);
+ }
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::updateView (TeView *view)
+{
+ TeProjection* proj = view->projection();
+ if (proj)
+ {
+ if (proj->id() <= 0)
+ this->insertProjection(view->projection());
+ else
+ this->updateProjection(view->projection());
+ }
+ else
+ {
+ errorMessage_ = "N�o � poss�vel atualizar vista sem proje��o!";
+ return false;
+ }
+
+ string sql = "UPDATE te_view SET projection_id=" + Te2String(proj->id());
+ sql+= ", name='" + view->name() + "'";
+ sql+= ", user_name='" + view->user() + "'";
+ sql+= ", visibility= " + Te2String((int)view->isVisible());
+ sql +=" WHERE view_id = " + Te2String(view->id());
+
+ if (!this->execute (sql))
+ return false;
+
+ TeViewTree* tree = view->root();
+ if (tree)
+ return updateViewTree(tree);
+ return true;
+}
+
+
+bool
+TeDatabase::loadViewSet (const string& user)
+{
+ TeViewMap::iterator it = viewMap_.begin();
+ while (it != viewMap_.end())
+ {
+ delete it->second;
+ ++it;
+ }
+ viewMap_.clear();
+
+ TeDatabasePortal* portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ string sql;
+ if (!user.empty())
+ sql = "SELECT * FROM te_view WHERE user_name = '" + user + "'";
+ else
+ sql = "SELECT * FROM te_view WHERE user_name = '" + this->user() + "'";
+
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+ while (portal->fetchRow())
+ {
+ TeView *view = new TeView();
+ view->id (portal->getInt("view_id"));
+ loadView (view);
+ }
+ delete portal;
+ return true;
+}
+
+TeViewTree*
+TeDatabase::loadViewTree(TeView* view, int id)
+{
+ if( view == 0)
+ return 0;
+
+ TeDatabasePortal* portal = this->getPortal();
+ if (!portal)
+ return 0;
+
+ string q;
+ TeViewTree *node = 0;
+
+ if (id != 0)
+ {
+ q = "SELECT * FROM te_theme";
+ q += " WHERE view_id = " + Te2String (view->id());
+ q += " AND theme_id = " + Te2String(id);
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return 0;
+ }
+
+ TeViewNodeType type = (TeViewNodeType)portal->getInt("node_type");
+ if(type != TeTREE)
+ {
+ portal->freeResult();
+ delete portal;
+ return NULL;
+ }
+
+ node = portal->getViewTree();
+ portal->freeResult();
+ }
+
+ q ="SELECT * FROM te_theme";
+ q += " WHERE view_id = " + Te2String (view->id());
+ q += " AND parent_id = " + Te2String(id);
+ q += " ORDER BY priority ASC";
+
+ if (!portal->query(q))
+ {
+ delete portal;
+ return node;
+ }
+
+ while (portal->fetchRow())
+ {
+ TeViewNodeType childType = (TeViewNodeType)portal->getInt("node_type");
+ TeViewNode *childNode;
+ if (childType == TeTHEME)
+ {
+ childNode = new TeTheme();
+ childNode->id(portal->getInt(0));
+ this->loadTheme((TeTheme*)childNode);
+ }
+ else
+ {
+ childNode = loadViewTree(view, portal->getInt("theme_id"));
+ }
+
+ if(id == 0)
+ {
+ view->add(childNode);
+ }
+ else
+ {
+// view->addTheme(childNode);
+ node->add(childNode);
+ }
+ }
+ delete portal;
+ return node;
+}
+
+bool
+TeDatabase::loadView (TeView* view)
+{
+ string q;
+ if (view->id() > 0)
+ q = "SELECT * FROM te_view WHERE view_id=" + Te2String(view->id());
+ else if (!view->name().empty())
+ {
+ q = "SELECT * FROM te_view WHERE name='" + view->name() + "'";
+
+ if(!view->user().empty())
+ q += " AND user_name='" + view->user() + "'";
+ }
+ else
+ return false;
+
+ TeDatabasePortal* portal = getPortal();
+ if (!portal)
+ {
+ this->errorMessage_ = "Erro ao tentar abrir um portal";
+ return false;
+ }
+
+ if (!portal->query(q))
+ {
+ delete portal;
+ this->errorMessage_ = "Erro ao submeter query: \"" + q + "\"";
+ return false;
+ }
+
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ int projId = portal->getInt("projection_id");
+ TeProjection* proj = loadProjection(projId);
+ if (proj != 0)
+ view->projection(proj);
+ view->name(portal->getData("name"));
+ view->user(portal->getData("user_name"));
+ view->isVisible (portal->getBool("visibility"));
+ view->id(portal->getInt("view_id"));
+ portal->freeResult();
+
+ loadViewTree(view, 0);
+
+ delete portal;
+
+ vector<TeViewNode*> &themes = view->themes();
+ for (unsigned int i = 0; i < themes.size() ; i++)
+ {
+ TeTheme *theme = (TeTheme*)themes[i];
+ int id = theme->layerId();
+ TeLayerMap::iterator it = layerMap_.find(id);
+ if (it == layerMap_.end())
+ {
+ layerMap_.clear();
+ loadLayerSet();
+ }
+ theme->layer(layerMap_[id]);
+ if (!loadLegend (theme)) // retrieve associated legend
+ return false;
+ }
+ viewMap_[view->id()] = view;
+ return true;
+}
+
+
+void
+TeDatabase::clear()
+{
+ TeViewMap::iterator viewIt;
+ for (viewIt = viewMap_.begin(); viewIt != viewMap_.end(); ++viewIt)
+ delete viewIt->second;
+
+ TeLayerMap::iterator layerIt;
+ for (layerIt = layerMap_.begin(); layerIt != layerMap_.end(); ++layerIt)
+ delete layerIt->second;
+
+ legendMap_.clear();
+ themeMap_.clear();
+ viewMap_.clear();
+ layerMap_.clear();
+}
+
+bool
+TeDatabase::deleteView (int viewId)
+{
+ TeDatabasePortal* portal = this->getPortal();
+
+ // view projection should be deleted manually
+ string sql = "SELECT projection_id FROM te_view WHERE view_id=" + Te2String(viewId);
+ portal->freeResult();
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ string projId = portal->getData("projection_id");
+ portal->freeResult();
+
+ // delete themes belonging to this view
+ sql = "SELECT theme_id FROM te_theme WHERE view_id=" + Te2String(viewId);
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+ while (portal->fetchRow())
+ {
+ int id = atoi(portal->getData(0));
+ if(deleteTheme(id) == false)
+ {
+ delete portal;
+ return false;
+ }
+ }
+ // delete view
+ sql = "DELETE FROM te_view WHERE view_id = " + Te2String(viewId);
+ if (!this->execute (sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ sql = "DELETE FROM te_projection WHERE projection_id = " + projId;
+ if (!this->execute (sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ // Delete the view and its themes
+ TeView* view = viewMap_[viewId];
+ viewMap_.erase(viewId);
+ delete view;
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::updateViewTree (TeViewTree *tree)
+{
+ if(tree->id() > 0)
+ {
+ string sql;
+ sql = "UPDATE te_theme SET ";
+ sql += "name='" + tree->name()+"'";
+ sql += ", parent_id=" + Te2String (tree->parentId());
+ sql += ", node_type=" + Te2String (tree->type());
+ sql += " ,priority=" + Te2String (tree->priority());
+ sql += " WHERE theme_id = " + Te2String(tree->id());
+
+ if(!this->execute (sql)) return false;
+ }
+
+ for (unsigned int th=0; th<tree->size(); th++)
+ {
+ TeViewNode* node = tree->retrieve(th);
+ if (node->type() == TeTHEME)
+ {
+ TeTheme *theme = (TeTheme*)node;
+ if(!updateTheme(theme)) return false;
+ }
+ else
+ {
+ TeViewTree* tree = (TeViewTree*)node;
+ if(!updateViewTree(tree)) return false;
+ }
+ }
+ return true;
+}
+
+bool
+TeDatabase::viewExist(string viewName)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ viewName = TeConvertToUpperCase(viewName);
+
+ string sql = "SELECT name FROM te_view";
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+ while (portal->fetchRow())
+ {
+ string name = portal->getData(0);
+ name = TeConvertToUpperCase(name);
+ if (viewName == name)
+ {
+ delete portal;
+ return true;
+ }
+ }
+ delete portal;
+ return false;
+}
+
+
+bool
+TeDatabase::updateTheme (TeTheme *theme)
+{
+ string sql;
+
+ if (theme->id() <= 0 ) // theme doesn�t exist in the database yet
+ {
+ return this->insertTheme(theme);
+ }
+
+ // update theme metadata
+ sql = "UPDATE te_theme SET ";
+ sql += " layer_id=" + Te2String (theme->layerId());
+ sql += ", view_id=" + Te2String (theme->view());
+ sql += ", name='" + escapeSequence(theme->name())+"'";
+ sql += ", parent_id=" + Te2String (theme->parentId());
+ sql += ", priority=" + Te2String (theme->priority());
+ sql += ", node_type=" + Te2String (theme->type());
+ sql += ", min_scale=" + Te2String (theme->minScale(),5);
+ sql += ", max_scale=" + Te2String (theme->maxScale(),5);
+ sql += ", generate_attribute_where='" + escapeSequence(theme->attributeRest())+"'";
+ sql += ", generate_spatial_where='" + escapeSequence(theme->spatialRest())+"'";
+ sql += ", generate_temporal_where='" + escapeSequence(theme->temporalRest())+"'";
+ sql += ", collection_table='" + theme->collectionTable() + "'";
+ sql += ", visible_rep= " + Te2String(theme->visibleRep ());
+ sql += ", enable_visibility= " + Te2String(theme->visibility());
+ sql += " WHERE theme_id=" + Te2String (theme->id());
+
+ if (!this->execute (sql))
+ return false;
+
+ //delete grouping
+ sql = "DELETE FROM te_grouping WHERE theme_id= "+ Te2String(theme->id());
+ this->execute (sql);
+
+ if(theme->grouping())
+ {
+ if(!insertGrouping(theme->id(), theme->grouping()))
+ return false;
+ }
+
+ // update each of its legends
+ bool status = true;
+
+ if(theme->legend().size() == 0)
+ {
+ if(!deleteLegend(theme->id()))
+ return false;
+ }
+ else
+ {
+ for (unsigned int i = 0; i < theme->legend().size() ; i++)
+ {
+ status = updateLegend(&(theme->legend()[i]));
+ if (!status)
+ return status;
+ }
+ }
+
+ status = updateLegend(&(theme->withoutDataConnectionLegend()));
+ if (!status)
+ return status;
+
+ status = updateLegend(&(theme->outOfCollectionLegend()));
+ if (!status)
+ return status;
+
+ status = updateLegend(&(theme->defaultLegend()));
+ if (!status)
+ return status;
+
+ status = updateLegend(&(theme->pointingLegend()));
+ if (!status)
+ return status;
+
+ status = updateLegend(&(theme->queryLegend()));
+ if (!status)
+ return status;
+
+ status = updateLegend(&(theme->queryAndPointingLegend()));
+ if (!status)
+ return status;
+
+ // theme tables
+ return updateThemeTable (theme);
+}
+
+bool
+TeDatabase::loadTheme (TeTheme* theme)
+{
+ if (theme == 0)
+ return false;
+
+ string get = "SELECT te_theme.* FROM te_view INNER JOIN te_theme ON te_view.view_id = te_theme.view_id WHERE ";
+ if (theme->id() > 0)
+ get += " te_theme.theme_id = "+ Te2String(theme->id());
+ else if (!theme->name().empty())
+ get += " te_theme.name = '"+ theme->name() + "'";
+ else
+ {
+ this->errorMessage_ = "Theme procurado n�o possui nem id nem nome";
+ return false;
+ }
+ get += " AND te_view.user_name = \'" + this->user() +"\'";
+
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ {
+ this->errorMessage_ = "N�o foi poss�vel abrir portal para o banco";
+ return false;
+ }
+
+ if (!portal->query (get))
+ {
+ delete portal;
+ return false;
+ }
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ //theme information
+ theme->id(atoi (portal->getData(0)));
+ theme->layerId (atoi(portal->getData(1)));
+ theme->view (atoi(portal->getData (2)));
+ theme->name(string (portal->getData("name")));
+ theme->parentId( atoi(portal->getData ("parent_id")));
+ theme->type (TeViewNodeType(atoi(portal->getData ("node_type"))));
+ theme->priority(portal->getInt("priority"));
+ theme->minScale (portal->getDouble ("min_scale"));
+ theme->maxScale (portal->getDouble ("max_scale"));
+ theme->attributeRest(string(portal->getData ("generate_attribute_where")));
+ theme->spatialRest(string(portal->getData ("generate_spatial_where")));
+ theme->temporalRest(string(portal->getData ("generate_temporal_where")));
+ theme->collectionTable(string(portal->getData ("collection_table")));
+ theme->collectionAuxTable(theme->collectionTable() + "_aux");
+ theme->visibleRep(atoi(portal->getData ("visible_rep")));
+ theme->visibility(atoi(portal->getData ("enable_visibility")));
+
+ //load layer
+ int id = theme->layerId();
+ TeLayerMap::iterator it = layerMap_.find(id);
+ if (it == layerMap_.end())
+ {
+ layerMap_.clear();
+ loadLayerSet();
+ }
+ theme->layer(layerMap_[id]);
+ portal->freeResult();
+
+ // load them grouping
+ get = "SELECT * FROM te_grouping WHERE theme_id = " + Te2String(theme->id());
+ if (portal->query (get) && portal->fetchRow())
+ {
+ TeAttributeRep atRep;
+ string attname = portal->getData ("grouping_attr");
+ string norname = portal->getData ("grouping_norm_attr");
+ int f = attname.find("(");
+ if(f >= 0)
+ {
+ string alias = attname;
+ attname.erase(f, attname.size()-f);
+ alias.erase(0, f+1);
+ alias.erase(alias.size()-1, 1);
+ map<string, string>& m = mapThemeAlias_[theme->id()];
+ m[attname] = alias;
+ }
+ f = norname.find("(");
+ if(f >= 0)
+ {
+ string alias = norname;
+ norname.erase(f, norname.size()-f);
+ alias.erase(0, f+1);
+ alias.erase(alias.size()-1, 1);
+ map<string, string>& m = mapThemeAlias_[theme->id()];
+ m[norname] = alias;
+ }
+
+ if(attname=="NONE")
+ attname = "";
+
+ if(norname=="NONE")
+ norname = "";
+
+ atRep.name_ = attname;
+ atRep.type_ = TeAttrDataType(atoi(portal->getData ("grouping_attr_type")));
+
+ TeGrouping* g = new TeGrouping ( atRep, norname,
+ TeGroupingMode(atoi(portal->getData ("grouping_mode"))),
+ atoi(portal->getData ("grouping_number")),
+ atoi(portal->getData ("grouping_precision")),
+ portal->getDouble("grouping_std_dev"),
+ portal->getData("grouping_function") );
+
+ theme->grouping(g);
+ }
+ portal->freeResult();
+
+ // load theme tables
+ if(!loadThemeTable(theme))
+ {
+ delete portal;
+ return false;
+ }
+
+ get = "SELECT * FROM te_visual_raster WHERE theme_id = " + Te2String(theme->id());
+ if (portal->query (get) && portal->fetchRow())
+ {
+ TeRasterTransform* vis = new TeRasterTransform();
+ vis->setSrcBand(portal->getInt(1));
+ vis->setDestBand(portal->getInt(2));
+ vis->setTransfFunction(static_cast<TeRasterTransform::TeRasterTransfFunctions>(portal->getInt(3)));
+ if (vis->getTransfFunction() == TeRasterTransform::TeExtractRGB ||
+ vis->getTransfFunction() == TeRasterTransform::TeExtractBands)
+ {
+ do
+ {
+ vis->setBChannelMapping(portal->getInt(1),static_cast<TeRasterTransform::TeRGBChannels>(portal->getInt(2)));
+ }while (portal->fetchRow());
+ }
+ theme->rasterVisual(vis);
+ }
+
+ // load theme legends
+ loadLegend(theme);
+
+ themeMap_[theme->id()] = theme;
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeDatabase::loadThemeTable (TeTheme* theme)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ {
+ this->errorMessage_ = "N�o foi poss�vel abrir portal para o banco";
+ return false;
+ }
+
+ //theme tables
+ string sel = "SELECT te_theme_table.*, te_tables_relation.*, te_layer_table.*";
+ sel += " FROM (te_theme_table LEFT JOIN te_tables_relation";
+ sel += " ON te_theme_table.relation_id = te_tables_relation.relation_id)";
+ sel += " LEFT JOIN te_layer_table ON te_theme_table.table_id = te_layer_table.table_id";
+ sel += " WHERE te_theme_table.theme_id = " + Te2String(theme->id());
+ sel += " ORDER BY table_order";
+
+ if (!portal->query (sel))
+ {
+ delete portal;
+ return false;
+ }
+
+ while(portal->fetchRow ())
+ {
+ string tableName = portal->getData("attr_table");
+ TeAttributeList attrList;
+ getAttributeList(tableName, attrList);
+ string uniqueId = portal->getData("unique_id");
+ string linkName = portal->getData("attr_link");
+
+ TeTable table(tableName, attrList, uniqueId, linkName);
+ table.setId(portal->getInt("te_theme_table.table_id"));
+ table.setOrder(portal->getInt("table_order"));
+ table.attInitialTime(portal->getData("attr_initial_time"));
+ table.attFinalTime(portal->getData("attr_final_time"));
+ table.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
+
+ int tableType = portal->getInt("attr_table_type");
+ if (tableType == TeAttrExternal)
+ {
+ int relatedTableId = portal->getInt("related_table_id");
+ table.relatedTableName(getTableName(relatedTableId));
+ int relationId = portal->getInt("te_theme_table.relation_id");
+ relationMSet_.insert(relationId);
+
+ string relatedAttr = portal->getData("related_attr");
+ table.setTableType(TeAttrExternal, relatedTableId, relatedAttr);
+
+ table.setLinkName(portal->getData("external_attr"));
+ }
+ else
+ table.setTableType((TeAttrTableType)tableType);
+
+ theme->addThemeTable(table);
+ }
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeDatabase::insertThemeTable(TeTheme *theme, TeTable& inputTable)
+{
+ int themeId = theme->id();
+ int tableOrder = 0;
+ int relationId;
+ bool status;
+ string qString;
+
+ // Get the order of the last theme table
+ qString = "SELECT MAX(table_order) FROM te_theme_table";
+ qString += " WHERE theme_id = " + Te2String(themeId);
+
+ TeDatabasePortal* portal = getPortal();
+ if (portal->query(qString) == false || portal->fetchRow() == false)
+ return false;
+
+ string data = portal->getData(0);
+ if (data.empty())
+ tableOrder = 0;
+ else
+ {
+ tableOrder = atoi(portal->getData(0));
+ ++tableOrder;
+ }
+ inputTable.setOrder(tableOrder);
+ delete portal;
+
+ if (inputTable.tableType() == TeAttrExternal)
+ {
+ status = insertRelationInfo(inputTable.relatedTableId(),inputTable.relatedAttribute(),
+ inputTable.name(),inputTable.linkName(),relationId);
+ if (status == false)
+ return false;
+ relationMSet_.insert(relationId);
+
+ status = insertThemeTable(themeId, inputTable.id(), relationId, tableOrder);
+ }
+ else
+ {
+ // Insert the table in the te_theme_table
+ status = insertThemeTable(themeId, inputTable.id(), 0, tableOrder);
+ }
+ return status;
+}
+
+bool
+TeDatabase::removeThemeTable(TeTheme *theme, int tableOrder)
+{
+ if (tableOrder < 0)
+ return false;
+
+ int relationId = -1;
+ string qString;
+
+ TeAttrTableVector attrTableVector;
+ theme->getAttTables(attrTableVector);
+
+ // If the table is external, find the relation id
+ qString = "SELECT relation_id FROM te_theme_table";
+ qString += " WHERE theme_id = " + Te2String(theme->id());
+ qString += " AND relation_id IS NOT NULL";
+ qString += " AND table_order = " + Te2String(tableOrder);
+
+ TeDatabasePortal* portal = getPortal();
+ if (portal->query(qString) && portal->fetchRow())
+ relationId = portal->getInt("relation_id");
+ else
+ {
+ delete portal;
+ return false;
+ }
+ delete portal;
+
+ // Remove the relation from the te_tables_relation
+ // table if only this theme is using it
+ if (relationId > 0)
+ {
+ if (relationMSet_.count(relationId) == 1)
+ {
+ qString = "DELETE FROM te_tables_relation WHERE relation_id = " + Te2String(relationId);
+ if (execute(qString) == false)
+ return false;
+ relationMSet_.erase(relationId);
+ }
+ else
+ relationMSet_.erase(relationMSet_.find(relationId));
+ }
+
+ // Remove the table from the te_theme_table
+ qString = "DELETE FROM te_theme_table WHERE theme_id = " + Te2String(theme->id());
+ qString += " AND table_order = " + Te2String(tableOrder);
+
+ if (execute(qString) == false)
+ return false;
+
+ return true;
+}
+
+
+bool
+TeDatabase::updateThemeTable(TeTheme *theme)
+{
+ //Initially remove from te_theme_table all the records of this theme
+ string q = "SELECT * FROM te_theme_table WHERE theme_id = " + Te2String(theme->id());
+ TeDatabasePortal *portal = getPortal();
+
+ if (portal->query(q) == false)
+ {
+ delete portal;
+ return false;
+ }
+
+ while (portal->fetchRow())
+ {
+ int relationId;
+ int themeTableId = portal->getInt("theme_table_id");
+
+ string data = portal->getData("relation_id");
+ if (data.empty())
+ relationId = -1;
+ else
+ relationId = atoi(data.c_str());
+
+ // Remove the relation from the te_tables_relation
+ // table if only this theme is using it
+ if (relationId > 0)
+ {
+ if (relationMSet_.count(relationId) == 1)
+ {
+ q = "DELETE FROM te_tables_relation WHERE relation_id = " + Te2String(relationId);
+ if (execute(q) == false)
+ {
+ delete portal;
+ return false;
+ }
+ relationMSet_.erase(relationId);
+ }
+ else
+ relationMSet_.erase(relationMSet_.find(relationId));
+ }
+
+ // Remove the table from the te_theme_table
+ q = "DELETE FROM te_theme_table WHERE theme_id = " + Te2String(theme->id());
+ q += " AND theme_table_id = " + Te2String(themeTableId);
+ if (execute(q) == false)
+ {
+ delete portal;
+ return false;
+ }
+ }
+ delete portal;
+
+ // Update te_theme_table and te_tables_relation(if there are any external tables)
+ // with the information provided from the new vector of theme tables
+ TeAttrTableVector tablesVector;
+ theme->getAttTables(tablesVector);
+ for (unsigned i = 0; i < tablesVector.size(); ++i)
+ insertThemeTable(theme, tablesVector[i]);
+
+ return true;
+}
+
+
+bool
+TeDatabase::insertGrouping (int themeId, TeGrouping* grouping)
+{
+ if((themeId < 1) || (!grouping) )
+ return false;
+
+ string ins = " INSERT INTO te_grouping (theme_id, grouping_number, ";
+ ins += " grouping_attr, grouping_attr_type, grouping_mode, ";
+ ins += " grouping_norm_attr, grouping_std_dev, grouping_precision, grouping_function )";
+ ins += " VALUES ( ";
+ ins += Te2String(themeId);
+ ins += ", "+ Te2String(grouping->groupNumSlices_);
+
+ string attname = grouping->groupAttribute_.name_;
+ if(attname.empty() || (attname=="NONE") )
+ attname = "";
+
+ string norname = grouping->groupNormAttribute_;
+ if(norname.empty() || (norname=="NONE"))
+ norname = "";
+
+ map<int, map<string, string> >::iterator it = mapThemeAlias_.find(themeId);
+ if(it != mapThemeAlias_.end())
+ {
+ map<string, string>::iterator tit = it->second.find(attname);
+ if(tit != it->second.end())
+ {
+ string alias = tit->second;
+ attname += "(" + alias + ")";
+ }
+ if(norname.empty() == false)
+ {
+ map<string, string>::iterator tit = it->second.find(norname);
+ if(tit != it->second.end())
+ {
+ string nalias = tit->second;
+ norname += "(" + nalias + ")";
+ }
+ }
+ }
+
+ ins += ", '"+ attname +"'";
+ ins += ", "+ Te2String(grouping->groupAttribute_.type_);
+ ins += ", "+ Te2String(grouping->groupMode_);
+ ins += ", '"+ norname +"'";
+ ins += ", "+ Te2String(grouping->groupStdDev_);
+ ins += ", "+ Te2String(grouping->groupPrecision_);
+ ins += ", '"+ grouping->groupFunction_ +"'";
+ ins += ")";
+
+ return (execute(ins));
+}
+
+bool
+TeDatabase::updateGrouping (int themeId, TeGrouping* grouping)
+{
+ if((themeId < 1) || (!grouping))
+ return false;
+
+ string up = " UPDATE te_grouping SET ";
+ up += " grouping_number = "+ Te2String(grouping->groupNumSlices_);
+
+ string attname = grouping->groupAttribute_.name_;
+ if(attname.empty() || (attname=="NONE"))
+ attname = "";
+
+ string norname = grouping->groupNormAttribute_;
+ if(norname.empty()|| (norname=="NONE"))
+ norname = "";
+
+ map<int, map<string, string> >::iterator it = mapThemeAlias_.find(themeId);
+ if(it != mapThemeAlias_.end())
+ {
+ map<string, string>::iterator tit = it->second.find(attname);
+ if(tit != it->second.end())
+ {
+ string alias = tit->second;
+ attname += "(" + alias + ")";
+ }
+ if(norname.empty() == false)
+ {
+ map<string, string>::iterator tit = it->second.find(norname);
+ if(tit != it->second.end())
+ {
+ string nalias = tit->second;
+ norname += "(" + nalias + ")";
+ }
+ }
+ }
+
+ up += ", grouping_attr = '"+ attname +"'";
+ up += ", grouping_attr_type = "+ Te2String(grouping->groupAttribute_.type_);
+ up += ", grouping_mode = "+ Te2String(grouping->groupMode_);
+ up += ", grouping_norm_attr = '"+ norname +"'";
+ up += ", grouping_std_dev = "+ Te2String(grouping->groupStdDev_);
+ up += ", grouping_precision = "+ Te2String(grouping->groupPrecision_);
+ up += ", grouping_function = '"+ grouping->groupFunction_ +"'";
+ up += " WHERE theme_id = "+ Te2String(themeId);
+
+ return (execute(up));
+}
+
+bool
+TeDatabase::generateLabelPositions(TeTheme *theme)
+{
+ string piebar, geomTable, upd;
+ string collTable = theme->collectionTable();
+
+ if((collTable.empty()) || (!tableExist(collTable)))
+ return false;
+
+ if (theme->layer()->hasGeometry(TeCELLS) )
+ {
+ geomTable = theme->layer()->tableName(TeCELLS);
+
+ piebar = "SELECT label_x, label_y, lower_x, lower_y, upper_x, upper_y";
+ piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
+ piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
+
+ upd = " UPDATE (" + piebar + ") SET";
+ upd += " label_x = lower_x + (upper_x-lower_x)/2,";
+ upd += " label_y = lower_y + (upper_y-lower_y)/2";
+
+ if(!execute(upd))
+ return false;
+ }
+
+ if( theme->layer()->hasGeometry(TePOLYGONS))
+ {
+ geomTable = theme->layer()->tableName(TePOLYGONS);
+
+ piebar = "SELECT label_x, label_y, lower_x, lower_y, upper_x, upper_y";
+ piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
+ piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
+ piebar += " WHERE label_x is null OR label_y is null";
+ piebar += " ORDER BY c_object_id ASC, ext_max ASC";
+
+ upd = " UPDATE (" + piebar + ") SET";
+ upd += " label_x = lower_x + (upper_x-lower_x)/2,";
+ upd += " label_y = lower_y + (upper_y-lower_y)/2";
+
+ if(!execute(upd))
+ return false;
+ }
+
+ if (theme->layer()->hasGeometry(TePOINTS))
+ {
+ geomTable = theme->layer()->tableName(TePOINTS);
+
+ piebar = "SELECT label_x, label_y, x, y";
+ piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
+ piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
+ piebar += " WHERE label_x is null OR label_y is null";
+ upd = " UPDATE (" + piebar + ") SET";
+ upd += " label_x = x,";
+ upd += " label_y = y";
+
+ if(!execute(upd))
+ return false;
+ }
+
+ if(theme->layer()->hasGeometry(TeLINES))
+ {
+ geomTable = theme->layer()->tableName(TeLINES);
+
+ piebar = "SELECT label_x, label_y, lower_x, lower_y, upper_x, upper_y";
+ piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
+ piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
+ piebar += " WHERE label_x is null OR label_y is null";
+ piebar += " ORDER BY c_object_id ASC, ext_max ASC";
+
+ upd = " UPDATE (" + piebar + ") SET";
+ upd += " label_x = lower_x + (upper_x-lower_x)/2,";
+ upd += " label_y = lower_y + (upper_y-lower_y)/2";
+
+ if(!execute(upd))
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeDatabase::themeExist(string themeName)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ themeName = TeConvertToUpperCase(themeName);
+
+ string sql = "SELECT name FROM te_theme";
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+ while (portal->fetchRow())
+ {
+ string name = portal->getData(0);
+ name = TeConvertToUpperCase(name);
+ if (themeName == name)
+ {
+ delete portal;
+ return true;
+ }
+ }
+ delete portal;
+ return false;
+}
+
+bool
+TeDatabase::deleteTheme(int themeId)
+{
+ string sql;
+
+ // delete the collection table associated to this theme
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ return false;
+
+ sql = "SELECT collection_table FROM te_theme WHERE theme_id = " + Te2String(themeId);
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ string colTab = portal->getData("collection_table");
+ //delete collection table
+ if (this->tableExist(colTab))
+ {
+ sql = "DROP TABLE " + colTab;
+ if (!this->execute(sql) )
+ {
+ delete portal;
+ return false;
+ }
+ }
+ //delete auxiliar collection table
+ if (this->tableExist(colTab +"_aux"))
+ {
+ sql = "DROP TABLE " +colTab +"_aux";
+ if (!this->execute(sql) )
+ {
+ delete portal;
+ return false;
+ }
+ }
+
+ portal->freeResult();
+
+ //delete the visual associated to this theme
+ if (existRelation("te_visual","fk_visual_legend_id") != TeRICascadeDeletion)
+ {
+ sql = "SELECT legend_id FROM te_legend WHERE theme_id = " + Te2String(themeId);
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+ string wherec;
+ int c = 0;
+ while (portal->fetchRow())
+ {
+ if (c)
+ wherec += ",";
+ c++;
+ wherec += portal->getData(0);
+ }
+ portal->freeResult();
+ sql = "DELETE FROM te_visual WHERE legend_id IN (" + wherec + ")";
+ if (!this->execute(sql))
+ {
+ delete portal;
+ return false;
+ }
+ }
+
+ //delete all visuals of raster associated to this theme
+ if (existRelation("te_visual_raster","fk_visrast_theme_id") != TeRICascadeDeletion)
+ {
+ sql = "DELETE FROM te_visual_raster WHERE theme_id =" + Te2String(themeId);
+ if (!this->execute (sql))
+ {
+ delete portal;
+ return false;
+ }
+ }
+
+ //delete all legends associated to this theme
+ if (existRelation("te_legend","fk_legend_theme_id") != TeRICascadeDeletion)
+ {
+ sql = "DELETE FROM te_legend WHERE theme_id =" + Te2String(themeId);
+ if (!this->execute (sql))
+ {
+ delete portal;
+ return false;
+ }
+ }
+
+ //select the view of this theme
+ sql = "SELECT view_id FROM te_theme WHERE theme_id = " + Te2String(themeId);
+ portal->freeResult();
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ int viewId = portal->getInt("view_id");
+ TeView* view = viewMap_[viewId];
+ TeTheme* tema = (TeTheme*)view->remove(themeId);
+ if(!tema)
+ {
+ delete portal;
+ return false;
+ }
+
+ unsigned int i;
+ TeLegendEntryVector& legendVector = tema->legend();
+ for (i = 0; i < legendVector.size(); ++i)
+ legendMap_.erase(legendVector[i].id());
+ themeMap_.erase(themeId);
+
+ delete tema;
+ delete portal;
+
+ //delete the tables associated to this theme
+ if (existRelation("te_theme_table","fk_thmtable_theme_id") != TeRICascadeDeletion)
+ {
+ sql = "DELETE FROM te_theme_table WHERE theme_id =" + Te2String(themeId);
+ if (!this->execute (sql))
+ return false;
+ }
+
+ //delete the grouping
+ if (existRelation("te_grouping","fk_group_theme_id") != TeRICascadeDeletion)
+ {
+ sql = "DELETE FROM te_grouping WHERE theme_id =" + Te2String(themeId);
+ if (!this->execute (sql))
+ return false;
+ }
+
+ // delete raster visual
+ if (existRelation("te_visual_raster","fk_visrast_theme_id") == TeNoRelation )
+ {
+ sql = "DELETE FROM te_visual_raster WHERE theme_id =" + Te2String(themeId);
+ if (!this->execute (sql))
+ return false;
+ }
+
+ // delete the theme
+ sql = "DELETE FROM te_theme WHERE theme_id = " + Te2String(themeId);
+ if (!this->execute (sql))
+ return false;
+
+ return true;
+}
+
+bool
+TeDatabase::deleteThemeGroup(int themeId)
+{
+ string sql;
+ // delete the theme
+ sql = "DELETE FROM te_theme WHERE theme_id = " + Te2String(themeId);
+ if (!this->execute (sql))
+ return false;
+ return true;
+}
+
+bool
+TeDatabase::deleteLegend(int themeId)
+{
+ // If there is a collection table update legend of the objects in it
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ return false;
+ string sel = "SELECT collection_table FROM te_theme WHERE theme_id = " + Te2String(themeId);
+ string TC;
+ if (portal->query(sel) && portal->fetchRow())
+ TC = portal->getData(0);
+ delete portal;
+
+ if (!TC.empty() && this->tableExist(TC))
+ {
+ string up = "UPDATE " + TC + " SET c_legend_id = 0";
+ if (!execute(up))
+ return false;
+ }
+
+ // Delete visual of the legends
+ string del = "DELETE FROM te_visual WHERE legend_id IN ";
+ del += "(SELECT legend_id FROM te_legend WHERE theme_id = " + Te2String(themeId);
+ del += " AND group_id > -1)";
+ if (!execute(del))
+ return false;
+
+ del = "DELETE FROM te_legend WHERE theme_id = " + Te2String(themeId);
+ del += " AND group_id > -1";
+ if (!execute(del))
+ return false;
+
+ // Delete from memory the legends of the theme
+ unsigned int i;
+ TeTheme *theme = themeMap_[themeId];
+ TeLegendEntryVector& legendVector = theme->legend();
+ for (i = 0; i < legendVector.size(); ++i)
+ legendMap_.erase(legendVector[i].id());
+ legendVector.clear();
+
+ //delete grouping
+ del = "DELETE FROM te_grouping WHERE theme_id =" + Te2String(themeId);
+ if (!execute (del))
+ return false;
+
+ return true;
+}
+
+bool
+TeDatabase::updateLayer(TeLayer *layer)
+{
+ if (!layer)
+ return false;
+
+ string sql;
+ sql = "UPDATE te_layer SET ";
+ sql += "name = '" + layer->name() + "' ";
+ sql += ", lower_x = " + Te2String(layer->box().x1(),15) + " ";
+ sql += ", lower_y = " + Te2String(layer->box().y1(),15) + " ";
+ sql += ", upper_x = " + Te2String(layer->box().x2(),15) + " ";
+ sql += ", upper_y = " + Te2String(layer->box().y2(),15) + " ";
+ sql += " WHERE layer_id = " + Te2String(layer->id());
+
+ if (layer->projection())
+ updateProjection(layer->projection());
+ return (this->execute (sql));
+}
+
+bool
+TeDatabase::loadLayerSet()
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ return false;
+
+ string get = "SELECT * FROM te_layer";
+ if (!portal->query(get))
+ {
+ layerMap_.clear();
+ delete portal;
+ return false;
+ }
+
+ int lid;
+ while (portal->fetchRow())
+ {
+ TeLayer* layer = 0;
+ lid = portal->getInt("layer_id");
+
+ TeLayerMap::iterator it = layerMap_.find(lid);
+ // if layer is not in the cache yet load it in a new pointer
+ if (it == layerMap_.end())
+ {
+ layer = new TeLayer();
+ layer->id(lid);
+ loadLayer(layer);
+ }
+ // else just refresh the pointer
+ else
+ {
+ it->second->id(lid);
+ loadLayer(it->second);
+ }
+ }
+ delete portal;
+ return true;
+}
+
+string
+TeDatabase::getRasterTable(int layerId, const string& objectId)
+{
+ if (layerId <=0 )
+ return "";
+
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ return "";
+
+ string get;
+ // get the raster representation
+ get = "SELECT geom_table FROM te_representation WHERE layer_id = "+Te2String(layerId);
+ get += " AND geom_type= " + Te2String((int)TeRASTER);
+
+ // error executing query or no there is no raster representation
+ if (!portal->query(get) || !portal->fetchRow())
+ {
+ delete portal;
+ return "";
+ }
+
+ string tableName = portal->getData(0);
+ portal->freeResult();
+ if (tableName.empty())
+ {
+ delete portal;
+ return "";
+ }
+
+ // check if a specific object is being looked for
+ get = "SELECT raster_table FROM " + tableName + " WHERE object_id='" + objectId + "'";
+ if (!portal->query(get) || !portal->fetchRow())
+ {
+ delete portal;
+ return "";
+ }
+ tableName = portal->getData(0);
+ delete portal;
+ return tableName;
+}
+
+
+TeRaster*
+TeDatabase::loadLayerRaster(int layerId, const string& objectId, const char& mode)
+{
+ if (layerId <=0 )
+ return 0;
+
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ return 0;
+
+ TeRaster* raster = 0;
+ string get;
+ // get the raster representation
+ get = "SELECT geom_table FROM te_representation WHERE layer_id = "+Te2String(layerId);
+ get += " AND geom_type= " + Te2String((int)TeRASTER);
+
+ // error executing query or no there is no raster representation
+ if (!portal->query(get) || !portal->fetchRow())
+ {
+ delete portal;
+ return 0;
+ }
+
+ string tableName = portal->getData(0);
+ portal->freeResult();
+ if (tableName.empty())
+ {
+ delete portal;
+ return 0;
+ }
+
+ //--- this check is made for compatibility reasons with older terralib databases
+ TeAttributeRep attrRep;
+ attrRep.name_ = "tiling_type";
+ attrRep.type_ = TeINT;
+
+ TeAttribute att;
+ if(!columnExist(tableName, attrRep.name_,att))
+ {
+ addColumn (tableName, attrRep);
+ string sql = "UPDATE " + tableName + " SET tiling_type = " + Te2String(static_cast<int>(TeExpansible));
+ this->execute(sql);
+ }
+
+ // ---
+
+ // check if a specific object is being looked for
+ get = "SELECT * FROM " + tableName;
+ if (!objectId.empty())
+ get += " WHERE object_id='" + objectId + "'";
+ if (!portal->query(get) || !portal->fetchRow())
+ {
+ delete portal;
+ return 0;
+ }
+
+ string oid = portal->getData("object_id");
+ int geomId = portal->getInt("geom_id"); // get raster representation id
+
+ // get raster parameters from te_raster_table table
+ TeRasterParams params;
+ params.fileName_ = portal->getData("raster_table");
+ params.lutName_ = portal->getData("lut_table");
+ params.nBands(portal->getInt("num_bands"));
+ params.boundingBoxResolution(portal->getDouble("lower_x"),portal->getDouble("lower_y"),
+ portal->getDouble("upper_x"),portal->getDouble("upper_y"),
+ portal->getDouble("res_x"),portal->getDouble("res_y"));
+ params.blockHeight_ = portal->getInt("block_height");
+ params.blockWidth_ = portal->getInt("block_width");
+ params.tiling_type_ = static_cast<TeRasterTilingType>(portal->getInt("tiling_type"));
+
+ portal->freeResult();
+
+ // get extra information from te_raster_metadata table
+ string metadatatable = tableName + "_metadata";
+ unsigned int nb = params.nBands();
+ unsigned int i;
+ for (i=0; i<nb; i++)
+ {
+ get = "SELECT * FROM " + metadatatable + " WHERE geom_id=" + Te2String(geomId);
+ get += " AND band_id=" + Te2String(i);
+ if (portal->query(get) && portal->fetchRow())
+ {
+ params.vmax_[i] = portal->getDouble("max_value");
+ params.vmin_[i] = portal->getDouble("min_value");
+ params.nbitsperPixel_[i] = portal->getInt("num_bits");
+ params.dataType_[i] = TeDataType(portal->getInt("data_type"));
+ params.compression_[i] = TeCompressionMode(portal->getInt("compression_type"));
+ params.photometric_[i] = portal->getInt("photometric_type");
+ }
+ portal->freeResult();
+ }
+
+ // if raster is pallete get the associated LUT
+ if ((params.photometric_[0] == TeRASTERPALETTE) ||
+ (params.photometric_[0] == TeRASTERKERNEL))
+ this->loadRasterLUT(¶ms);
+
+ // raster has the same projection as its layer
+ get = "SELECT projection_id FROM te_layer WHERE layer_id = " + Te2String(layerId);
+ int projId;
+ TeProjection* proj=0;
+ if (portal->query(get) && portal->fetchRow())
+ {
+ projId = portal->getInt("projection_id");
+ proj = this->loadProjection(projId);
+ }
+ portal->freeResult();
+
+ params.projection(proj);
+ if (proj)
+ delete proj;
+ params.nTilesInMemory_ = 0;
+ params.database_ = this;
+
+ bool hasDummy = false;
+
+ get = "SELECT band_id, dummy FROM " + metadatatable + " WHERE geom_id=" + Te2String(geomId);
+ get += " AND NOT (dummy IS NULL)";
+ if (portal->query(get))
+ {
+ while (portal->fetchRow())
+ {
+ int b = portal->getInt(0);
+ double d = portal->getDouble("dummy");
+ params.setDummy(d,b);
+ hasDummy = true;
+ }
+ }
+ params.useDummy_ = hasDummy;
+ params.mode_ = mode;
+ delete portal;
+
+ // builds a raster from the parameters
+ TeDecoderDatabase* dec = new TeDecoderDatabase(params);
+ dec->init();
+ raster = new TeRaster();
+ raster->setDecoder(dec);
+ raster->objectId(oid);
+ return raster;
+}
+
+bool
+TeDatabase::loadRasterLUT(TeRasterParams* par)
+{
+ if (par->lutName_.empty())
+ return false;
+
+ TeDatabasePortal* portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ string get = "SELECT COUNT(index_id) FROM " + par->lutName_;
+ if (!portal->query(get) || !portal->fetchRow()) // if there is no table, or table is empty
+ {
+ delete portal;
+ return false;
+ }
+ int nentries = atoi(portal->getData(0));
+ if (nentries <= 0)
+ {
+ delete portal;
+ return false;
+ }
+
+ par->setNumberPalleteEntries(nentries);
+ portal->freeResult();
+
+ get = "SELECT * FROM " + par->lutName_ + " ORDER BY index_id ASC ";
+
+ if (!portal->query(get) || !portal->fetchRow()) // if there is no table, or table is empty
+ {
+ delete portal;
+ return false;
+ }
+ do
+ {
+ int index = atoi(portal->getData(0));
+ par->lutr_[index] = atoi(portal->getData(1));
+ par->lutg_[index] = atoi(portal->getData(2));
+ par->lutb_[index] = atoi(portal->getData(3));
+ }while (portal->fetchRow());
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeDatabase::loadLayer(TeLayer* layer)
+{
+ if (layer == 0)
+ return false;
+
+ string get;
+ if (layer->id() > 0)
+ get = "SELECT * FROM te_layer WHERE layer_id = "+ Te2String(layer->id());
+ else if (!layer->name().empty())
+ get = "SELECT * FROM te_layer WHERE name = '"+ layer->name() + "'";
+ else
+ {
+ this->errorMessage_ = "Layer procurado n�o possui nem id nem nome";
+ return false;
+ }
+
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ {
+ this->errorMessage_ = "N�o foi poss�vel abrir portal para o banco";
+ return false;
+ }
+
+ if (!portal->query (get))
+ {
+ delete portal;
+ return false;
+ }
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ layer->id(atoi (portal->getData("layer_id")));
+ layer->name(string (portal->getData("name")));
+ layer->setLayerBox(TeBox(portal->getDouble("lower_x"),
+ portal->getDouble("lower_y"),
+ portal->getDouble("upper_x"),
+ portal->getDouble("upper_y")));
+
+ int projId = portal->getInt("projection_id");
+ portal->freeResult();
+
+ layer->setDatabase(this);
+
+ // Load layer projection
+ TeProjection* proj = loadProjection (projId);
+ if (proj)
+ layer->setProjection (proj);
+
+ // Load layer representations
+ get = "SELECT * FROM te_representation WHERE layer_id = "+Te2String(layer->id());
+ if (portal->query (get))
+ {
+ while (portal->fetchRow())
+ {
+ TeRepresentation* repp = new TeRepresentation();
+ repp->id_ = atoi(portal->getData(0));
+ TeGeomRep g = (TeGeomRep)atoi (portal->getData(2));
+ repp->geomRep_ = g;
+ repp->tableName_ = portal->getData(3);
+ repp->description_ = portal->getData(4);
+ repp->box_ = TeBox(portal->getDouble(5),
+ portal->getDouble(6),
+ portal->getDouble(7),
+ portal->getDouble(8));
+ repp->resX_ = portal->getDouble(9);
+ repp->resY_ = portal->getDouble(10);
+ repp->nCols_ = portal->getInt(11);
+ repp->nLins_ = portal->getInt(12);
+ layer->addVectRepres(repp);
+ }
+ }
+
+ delete portal;
+ if(!loadLayerTable(layer))
+ return false;
+
+ layerMap_[layer->id()] = layer;
+ return true;
+}
+
+bool
+TeDatabase::loadLayerTable(TeLayer* layer)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ {
+ this->errorMessage_ = "N�o foi poss�vel abrir portal para o banco";
+ return false;
+ }
+
+ // Get layer tables
+ string get = " SELECT * FROM te_layer_table";
+ get += " WHERE layer_id = " + Te2String(layer->id());
+ get += " ORDER BY attr_table_type, table_id";
+
+ if (!portal->query (get))
+ {
+ delete portal;
+ return false;
+ }
+
+ while (portal->fetchRow())
+ {
+ string tableName = portal->getData("attr_table");
+ int tableId = portal->getInt("table_id");
+ string indexName = portal->getData("attr_link");
+
+ TeAttributeList attrList;
+ getAttributeList(tableName, attrList);
+
+ TeTable attTable(tableName,attrList,
+ portal->getData("unique_id"), indexName,
+ TeAttrTableType(portal->getInt("attr_table_type")));
+
+ attTable.setId(tableId);
+ attTable.attInitialTime(portal->getData("attr_initial_time"));
+ attTable.attFinalTime(portal->getData("attr_final_time"));
+ attTable.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
+
+ layer->addAttributeTable(attTable);
+ }
+
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::layerExist(int layerId)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ string sql = "SELECT layer_id FROM te_layer WHERE layer_id = " + Te2String(layerId);
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::layerExist(string layerName)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ layerName = TeConvertToUpperCase(layerName);
+
+ string sql = "SELECT name FROM te_layer";
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+ while (portal->fetchRow())
+ {
+ string name = portal->getData(0);
+ name = TeConvertToUpperCase(name);
+ if (layerName == name)
+ {
+ delete portal;
+ return true;
+ }
+ }
+ delete portal;
+ return false;
+}
+
+
+bool
+TeDatabase::deleteLayer(int layerId)
+{
+ //Delete attributes tables
+ if(!deleteLayerTable(layerId))
+ return false;
+
+ TeDatabasePortal* portal = this->getPortal();
+ if (!portal)
+ return false;
+
+
+ string sql = "SELECT projection_id FROM te_layer WHERE layer_id = ";
+ sql += Te2String(layerId);
+
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ string projId = portal->getData("projection_id");
+ portal->freeResult();
+
+ // Get all representations that are associated to this layer
+ sql = "SELECT * FROM te_representation WHERE layer_id = "+ Te2String(layerId);
+ if (!portal->query (sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ while (portal->fetchRow())
+ {
+ // Save the name of the geometry table
+ string geomTable = portal->getData("geom_table");
+
+ // Delete lut table
+ TeGeomRep rep = TeGeomRep(portal->getInt("geom_type"));
+ if (rep == TeRASTER)
+ {
+ TeDatabasePortal* portal2 = this->getPortal();
+ sql = "SELECT lut_table, raster_table FROM " + geomTable;
+ string tabName;
+ if (!portal2->query (sql))
+ {
+ delete portal2;
+ continue;
+ }
+
+ while (portal2->fetchRow())
+ {
+ // remove lut table
+ tabName = portal2->getData(0);
+ if (!tabName.empty() && this->tableExist(tabName))
+ {
+ sql = "DROP TABLE " + tabName;
+ this->execute(sql);
+ }
+ // remove raster table
+ tabName = portal2->getData(1);
+ if (!tabName.empty() && this->tableExist(tabName))
+ {
+ sql = "DROP TABLE " + tabName;
+ this->execute(sql);
+ }
+ }
+ delete portal2;
+ // remove raster metadata table
+ tabName = geomTable + "_metadata";
+ if (!tabName.empty() && this->tableExist(tabName))
+ {
+ sql = "DROP TABLE " + tabName;
+ this->execute(sql);
+ }
+ }
+ if (this->tableExist(geomTable))
+ {
+ sql = "DROP TABLE " + geomTable;
+ if (!this->execute(sql) )
+ {
+ delete portal;
+ return false;
+ }
+ }
+ }
+ portal->freeResult();
+
+ if (existRelation("te_representation","fk_rep_layer_id") != TeRICascadeDeletion)
+ {
+ // Delete entries into representations table
+ sql = "DELETE FROM te_representation WHERE layer_id = " +Te2String(layerId);
+ if (!this->execute(sql) )
+ {
+ delete portal;
+ return false;
+ }
+ }
+
+ // delete layer themes
+ sql = "SELECT theme_id FROM te_theme WHERE layer_id=" + Te2String(layerId);
+ if (!portal->query (sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ int themeId;
+ while (portal->fetchRow())
+ {
+ themeId = portal->getInt("theme_id");
+ this->deleteTheme(themeId);
+ }
+
+ sql = "DELETE FROM te_layer WHERE layer_id=" + Te2String(layerId);
+ if (!this->execute(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ // delete layer projection
+ sql = "DELETE FROM te_projection WHERE projection_id = "+ projId;
+ if (!this->execute(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ // remove all the items� themes associated to the layer to be removed
+ TeThemeMap::iterator it;
+ for (it = themeMap_.begin(); it != themeMap_.end(); ++it)
+ {
+ TeTheme *theme = it->second;
+ if (theme && theme->layer() && (theme->layer()->id() == layerId))
+ {
+ themeMap_.erase(theme->id());
+ delete theme;
+ }
+ }
+
+ // delete layer and its entry in the layer map
+ TeLayer* layer = layerMap_[layerId];
+ layerMap_.erase(layerId);
+ delete layer;
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeDatabase::deleteLayerTable (int layerId, TeAttrTableType ttype)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ return false;
+
+ //tables of the type 1 can be relationed with other layer ??? Conferir
+ string query = "SELECT attr_table, table_id FROM te_layer_table WHERE layer_id = " + Te2String(layerId);
+ query += " AND attr_table_type = " + Te2String(static_cast<int>(ttype));
+ if(!portal->query(query))
+ {
+ delete portal;
+ return false;
+ }
+
+ vector<int> tableIds;
+ string attrTable;
+ string tableId;
+ string drop;
+ while (portal->fetchRow())
+ {
+ attrTable = portal->getData(0);
+ tableId = portal->getData(1);
+ drop = "DROP TABLE " + attrTable;
+ if(!execute(drop))
+ {
+ delete portal;
+ return false;
+ }
+ tableIds.push_back(atoi(tableId.c_str()));
+
+ string del = "DELETE FROM te_address_locator WHERE table_id = "+ tableId;
+ execute(del);
+ }
+
+ delete portal;
+ string del;
+ if (existRelation("te_tables_relation","fk_tabrelation_laytable_id") != TeRICascadeDeletion)
+ {
+ for (unsigned int i=0; i<tableIds.size();i++)
+ {
+ del = "DELETE FROM te_tables_relation WHERE relation_id = " + Te2String(tableIds[i]);
+ if (!execute (del))
+ return false;
+ }
+ }
+ del = "DELETE FROM te_layer_table WHERE layer_id = " + Te2String(layerId);
+ if (!execute (del))
+ return false;
+ return true;
+}
+
+bool
+TeDatabase::updateRepresentation (int layerId, TeRepresentation& rep)
+{
+ if (layerId <= 0)
+ return false;
+
+ string sql;
+ sql = "UPDATE te_representation SET ";
+ sql += " lower_x= " + Te2String(rep.box_.x1(),15);
+ sql += ", lower_y= " + Te2String(rep.box_.y1(),15);
+ sql += ", upper_x= " + Te2String(rep.box_.x2(),15);
+ sql += ", upper_y= " + Te2String(rep.box_.y2(),15);
+ sql += ", description= '" + rep.description_ + "'";
+ sql += ", res_x= " + Te2String(rep.resX_);
+ sql += ", res_y= " + Te2String(rep.resY_);
+ sql += ", num_cols=" + Te2String(rep.nCols_);
+ sql += ", num_rows=" + Te2String(rep.nLins_);
+
+ if (rep.geomRep_ != TeTEXT)
+ sql += ", geom_table='" + rep.tableName_ + "'";
+
+ sql += " WHERE layer_id=" + Te2String(layerId);
+ sql += " AND geom_type= " + Te2String(rep.geomRep_);
+
+ if (rep.geomRep_ == TeTEXT)
+ sql += " AND geom_table='" + rep.tableName_ + "'";
+
+ return this->execute(sql);
+}
+
+bool
+TeDatabase::insertRasterGeometry(const string& tableName, TeRasterParams& par, const string& objectId)
+{
+ if (tableName.empty())
+ return false;
+
+ string objId;
+ if (objectId.empty())
+ objId = "O1";
+ else
+ objId = objectId;
+
+ //------ this check is made for compatibility reasons with old versions of TerraLib databases
+ TeAttributeRep attrRep;
+ attrRep.name_ = "tiling_type";
+ attrRep.type_ = TeINT;
+
+ TeAttribute att;
+ if(!columnExist(tableName, attrRep.name_,att))
+ {
+ addColumn (tableName, attrRep);
+ string sql = "UPDATE " + tableName + " SET tiling_type = " + Te2String(static_cast<int>(TeExpansible));
+ this->execute(sql);
+ }
+ //------
+
+ // finds the name of the raster geometry table
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ return false;
+
+ TeBox box = par.boundingBox();
+
+ string ins = "INSERT INTO " + tableName + " (object_id, raster_table, lut_table, ";
+ ins += "res_x, res_y, num_bands, num_cols, num_rows, block_height, block_width, ";
+ ins += "lower_x, lower_y, upper_x, upper_y, tiling_type) ";
+ ins += " VALUES ('" + objId + "', '" + par.fileName_+ "', '" + par.lutName_ + "', ";
+ ins += Te2String(par.resx_) + ", " + Te2String(par.resy_) + ", ";
+ ins += Te2String(par.nBands()) + ", " + Te2String(par.ncols_) + ", " + Te2String(par.nlines_) + ", ";
+ ins += Te2String(par.blockHeight_) + ", " + Te2String(par.blockWidth_) + ", ";
+ ins += Te2String(box.x1_,15) +", " + Te2String(box.y1_,15) + ", ";
+ ins += Te2String(box.x2_,15) +", " + Te2String(box.y2_,15) + ", ";
+ ins += Te2String(par.tiling_type_) + ")";
+ if (!this->execute(ins))
+ {
+ delete portal;
+ return false;
+ }
+
+ // save the pallete associated to the raster
+ // if it doesn�t exist yet
+ if ((par.photometric_[0] == TeRASTERPALETTE ||
+ par.photometric_[0] == TeRASTERKERNEL) && !par.lutName_.empty())
+ {
+
+ if (!this->tableExist(par.lutName_))
+ {
+ if (this->createLUTTable(par.lutName_))
+ {
+ for (unsigned int i=0; i<par.lutb_.size(); i++)
+ {
+ string sql = "INSERT INTO " + par.lutName_ + " VALUES(";
+ sql += Te2String(i) + ", ";
+ sql += Te2String(par.lutr_[i]) + ", ";
+ sql += Te2String(par.lutg_[i]) + ", ";
+ sql += Te2String(par.lutb_[i]) + ")";
+ this->execute(sql);
+ }
+ }
+ }
+ }
+
+ ins = "SELECT geom_id FROM " + tableName + " WHERE object_id='" + objId + "'";
+ ins += " AND raster_table='" + par.fileName_+ "'";
+ if(!portal->query(ins) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ int geomId = atoi(portal->getData(0));
+ delete portal;
+ string metadataTableName = tableName+"_metadata";
+ insertRasterMetadata(metadataTableName, geomId,par);
+ return true;
+}
+
+bool
+TeDatabase::updateRasterRepresentation(int layerId, TeRasterParams& par, const string& objectId)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if(!portal)
+ return false;
+
+ string sql = "SELECT repres_id, lower_x, lower_y, upper_x, upper_y, geom_table ";
+ sql += " FROM te_representation WHERE layer_id= " + Te2String(layerId);
+ sql += " AND geom_type= " + Te2String(TeRASTER);
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ TeBox box (portal->getDouble(1),portal->getDouble(2),
+ portal->getDouble(3),portal->getDouble(4));
+ int represId = atoi(portal->getData(0));
+ string rasterrep = portal->getData(5);
+ portal->freeResult();
+
+ updateBox(box,par.boundingBox());
+ sql = "UPDATE te_representation SET lower_x = " + Te2String(box.x1_,15);
+ sql += ", lower_y = " + Te2String(box.y1_,15) + ", upper_x = " + Te2String(box.x2_,15);
+ sql += ", upper_y = " + Te2String(box.y2_,15) + " WHERE repres_id=" + Te2String(represId);
+
+ if(!execute(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ string objId;
+ if (objectId.empty())
+ objId = "O1";
+ else
+ objId = objectId;
+
+ box = par.boundingBox();
+
+ sql = "UPDATE " + rasterrep + " SET lut_table ='" + par.lutName_ + "'";
+ sql += ", res_x= " + Te2String(par.resx_) + ", res_y=" + Te2String(par.resy_);
+ sql += ", num_bands=" + Te2String(par.nBands()) + ", num_cols=" + Te2String(par.ncols_);
+ sql += ", num_rows=" + Te2String(par.nlines_) + ", block_height=" + Te2String(par.blockHeight_);
+ sql += ", block_width= " + Te2String(par.blockWidth_) + ", lower_x = " + Te2String(box.x1_,15);
+ sql += ", lower_y = " + Te2String(box.y1_,15) + ", upper_x = " + Te2String(box.x2_,15);
+ sql += ", upper_y = " + Te2String(box.y2_,15);
+ sql += " WHERE object_id='" + objId + "' AND raster_table='" + par.fileName_ + "'";
+ if (!this->execute(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ sql = "SELECT geom_id FROM " + rasterrep + " WHERE object_id='" + objId + "'";
+ sql+= " AND raster_table='" + par.fileName_+ "'";
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ // save the pallete associated to the raster
+ // if it doesn�t exist yet
+ if ((par.photometric_[0] == TeRASTERPALETTE ||
+ par.photometric_[0] == TeRASTERKERNEL) && !par.lutName_.empty())
+ {
+
+ if (!this->tableExist(par.lutName_))
+ {
+ if (this->createLUTTable(par.lutName_))
+ {
+ for (unsigned int i=0; i<par.lutb_.size(); i++)
+ {
+ string sql = "INSERT INTO " + par.lutName_ + " VALUES(";
+ sql += Te2String(i) + ", ";
+ sql += Te2String(par.lutr_[i]) + ", ";
+ sql += Te2String(par.lutg_[i]) + ", ";
+ sql += Te2String(par.lutb_[i]) + ")";
+ this->execute(sql);
+ }
+ }
+ }
+ }
+
+ int geomId = atoi(portal->getData(0));
+ delete portal;
+ string metadatatabel = rasterrep + "_metadata";
+ return updateRasterMetadata(metadatatabel,geomId,par);
+}
+
+bool
+TeDatabase::insertRasterMetadata (const string& tableName, int geomId, TeRasterParams& par)
+{
+ if (geomId <= 0)
+ return false;
+
+ string ins;
+ unsigned int i;
+
+ unsigned int nb = par.nBands();
+ ins = "INSERT INTO " + tableName + " (geom_id, band_id, min_value, max_value, ";
+ ins += " num_bits, data_type, photometric_type, compression_type ) VALUES (";
+ string vals;
+ for (i=0; i<nb; i++)
+ {
+ vals = Te2String(geomId) + ", " + Te2String(i) + ", ";
+ vals += Te2String(par.vmin_[i],15) + ", " + Te2String(par.vmax_[i],15) + ", ";
+ vals += Te2String(par.nbitsperPixel_[i]) + ", " + Te2String(par.dataType_[i]) + ", " ;
+ vals += Te2String(par.photometric_[i]) + ", " + Te2String(par.compression_[i]) + " )" ;
+ string sql = ins + vals;
+ if (!this->execute(sql))
+ return false;
+ }
+
+ // update dummy value
+ if (par.useDummy_)
+ {
+ ins = "UPDATE " + tableName + " SET dummy = ";
+ for (i=0; i<nb; i++)
+ {
+ vals = Te2String(par.dummy_[i]) + " WHERE geom_id = " + Te2String(geomId);
+ vals += " AND band_id=" + Te2String(i);
+ string sql = ins + vals;
+ if (!this->execute(sql))
+ return false;
+ }
+ }
+ return true;
+}
+
+bool
+TeDatabase::updateRasterMetadata (const string& tableName, int geomId, TeRasterParams& par)
+{
+ if (geomId <= 0)
+ return false;
+
+ string sql = "DELETE FROM " + tableName + " WHERE geom_id = " + Te2String(geomId);
+ if (!this->execute (sql))
+ return false;
+ return insertRasterMetadata(tableName,geomId,par);
+}
+
+bool
+TeDatabase::updateLegend (TeLegendEntry *legend)
+{
+ if (!legend)
+ return false;
+
+ string sql;
+ if (legend->id() > 0 )
+ {
+ sql = "UPDATE te_legend SET ";
+ sql += " theme_id=" + Te2String (legend->theme());
+ sql += ",group_id=" + Te2String (legend->group());
+ sql += ",num_objs=" + Te2String (legend->count());
+ sql += ",lower_value='" + escapeSequence(legend->from())+"'";
+ sql += ",upper_value='" + escapeSequence(legend->to())+"'";
+ sql += ",label='" + escapeSequence(legend->label())+"'";
+ sql += " WHERE legend_id=" + Te2String (legend->id());
+
+ if (execute(sql) == false)
+ return false;
+ }
+ else
+ {
+ if (!insertLegend(legend))
+ return false;
+ }
+ legendMap_[legend->id()] = legend;
+
+ return updateVisual(legend);
+}
+
+bool
+TeDatabase::updateVisual(TeLegendEntry *legend)
+{
+ if (!legend)
+ return false;
+
+ TeGeomRepVisualMap mapVis = legend->getVisualMap();
+ TeGeomRepVisualMap::iterator it = mapVis.begin();
+ while ( it != mapVis.end())
+ {
+
+ TeGeomRep rep = it->first;
+ TeVisual vis = it->second;
+
+ TeColor cor = vis.color(); // filling color
+ TeColor contourCor = vis.contourColor();// contour color
+
+ string update = "UPDATE te_visual SET ";
+ update += " lib_name = '"+ vis.libName() +"', ";
+ update += "red = "+ Te2String(cor.red_) + ", ";
+ update += "green =" + Te2String(cor.green_) + ", ";
+ update += "blue =" + Te2String(cor.blue_) + ", ";
+ update += "transparency =" + Te2String(vis.transparency()) + ", ";
+
+ update += "contour_lib_name='"+ vis.contourLibName() +"', ";
+ update += "contour_red=" + Te2String(contourCor.red_) + ", ";
+ update += "contour_green=" + Te2String(contourCor.green_) + ", ";
+ update += "contour_blue=" + Te2String(contourCor.blue_) + ", ";
+ update += "contour_transp=" + Te2String(vis.contourTransparency()) + ", ";
+ update += "contour_width=" + Te2String(vis.contourWidth()) + ", ";
+
+ if(rep == TePOLYGONS)
+ {
+ update += "width=" + Te2String(vis.contourWidth()) + ", ";
+ update += "contour_symb_id=" + Te2String(vis.contourStyle()) + ", ";
+ update += "symb_id=" + Te2String(vis.style()) + ", ";
+ }
+ else if(rep == TeLINES)
+ {
+ update += "width=" + Te2String(vis.width()) + ", ";
+ update += "symb_id=" + Te2String(vis.style()) + ", ";
+ }
+ else if(rep == TePOINTS)
+ {
+ update += "size_value=" + Te2String(vis.size()) + ", ";
+ update += "symb_id=" + Te2String(vis.style ()) + ", ";
+ }
+ else if(rep == TeTEXT)
+ {
+ update += "size_value=" + Te2String(vis.size()) + ", ";
+ update += "pt_angle=" + Te2String(vis.ptAngle()) + ", ";
+ }
+
+ update += "family='" + vis.family() + "', ";
+ if (vis.bold())
+ update += "bold=1, ";
+ else
+ update += "bold=0, ";
+
+ if (vis.italic())
+ update += "italic=1, ";
+ else
+ update += "italic=0, ";
+
+ update += "fixed_size=" + Te2String(vis.fixedSize())+ ", ";
+ update += "alignment_vert=" + Te2String(vis.alignmentVert())+ ", ";
+ update += "alignment_horiz=" + Te2String(vis.alignmentHoriz())+ ", ";
+ update += "tab_size=" + Te2String(vis.tabSize())+ ", ";
+ update += "line_space=" + Te2String(vis.lineSpace());
+
+ update += " WHERE legend_id= " + Te2String(legend->id()) ;
+ update += " AND geom_type= " + Te2String(rep);
+
+ if (!execute(update))
+ return false;
+ ++it;
+ }
+ return true;
+}
+
+bool
+TeDatabase::loadLegend (TeTheme *theme)
+{
+ if (!theme)
+ return false;
+
+ unsigned int i;
+ int legId, gId, lastLegId;
+ TeGeomRep rep;
+ TeVisual visual;
+ vector<string> legIdVec;
+ map<int, TeLegendEntry> legMap;
+ map<int, TeLegendEntry>::iterator it;
+ map<int, TeLegendEntry*> ownLegMap;
+
+ theme->cleanLegend();
+
+ TeDatabasePortal* portal = getPortal();
+
+ string q = "SELECT * FROM te_legend WHERE theme_id = " + Te2String(theme->id());
+ q += " ORDER BY legend_id";
+
+ if (!portal->query(q))
+ {
+ delete portal;
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ legId = portal->getInt("legend_id");
+ legIdVec.push_back(Te2String(legId));
+
+ TeLegendEntry& legEntry = legMap[legId];
+ legEntry.id(legId);
+ legEntry.theme(theme->id());
+ TeSlice& slice = legEntry.slice();
+
+ gId = portal->getInt("group_id");
+ legEntry.group(gId);
+ if (gId == -10)
+ {
+ TeLegendEntry* ownLeg = new TeLegendEntry;
+ ownLegMap[legId] = ownLeg;
+ }
+
+ string lb = portal->getData("label");
+ legEntry.label(lb);
+ slice.count_ = portal->getInt("num_objs");
+ slice.from_ = portal->getData("lower_value");
+ slice.to_ = portal->getData("upper_value");
+ }
+
+ string inClause;
+ for(i = 0; i < legIdVec.size(); ++i)
+ {
+ inClause += legIdVec[i];
+ if (i != legIdVec.size() - 1)
+ inClause += ",";
+ }
+
+ portal->freeResult();
+ q = "SELECT * FROM te_visual WHERE legend_id IN (";
+ q += inClause + ") ORDER BY legend_id";
+
+ if (!portal->query(q))
+ {
+ delete portal;
+ return false;
+ }
+
+ while(portal->fetchRow())
+ {
+ legId = portal->getInt("legend_id");
+ rep = TeGeomRep(portal->getInt("geom_type"));
+ visual = portal->getVisual();
+
+ TeLegendEntry& legEntry = legMap[legId];
+ gId = legEntry.group();
+ legEntry.setVisual(visual, rep);
+
+ if (gId == -10) // own visual
+ {
+ TeLegendEntry* ownLegend = ownLegMap[legId];
+ *ownLegend = legEntry;
+
+ if (rep == TePOLYGONS)
+ ownLegend->setVisual(visual, TePOLYGONS);
+ else if (rep == TeLINES)
+ ownLegend->setVisual(visual, TeLINES);
+ else if (rep == TePOINTS)
+ ownLegend->setVisual(visual, TePOINTS);
+ else if (rep == TeTEXT)
+ ownLegend->setVisual(visual, TeTEXT);
+
+ legendMap_[legId] = ownLegend;
+ }
+ else if(gId == -6)
+ {
+ TeLegendEntry& pointingQueryLegend = theme->queryAndPointingLegend();
+ pointingQueryLegend = legEntry;
+
+ pointingQueryLegend.setVisual(visual, TeLINES);
+ pointingQueryLegend.setVisual(visual, TePOINTS);
+ pointingQueryLegend.setVisual(visual, TeCELLS);
+ pointingQueryLegend.setVisual(visual, TeTEXT);
+
+ legendMap_[legId] = &pointingQueryLegend;
+ }
+ else if(gId == -5)
+ {
+ TeLegendEntry& queryLegend = theme->queryLegend();
+ queryLegend = legEntry;
+
+ queryLegend.setVisual(visual, TeLINES);
+ queryLegend.setVisual(visual, TePOINTS);
+ queryLegend.setVisual(visual, TeCELLS);
+ queryLegend.setVisual(visual, TeTEXT);
+
+ legendMap_[legId] = &queryLegend;
+ }
+ else if(gId == -4)
+ {
+ TeLegendEntry& pointingLegend = theme->pointingLegend();
+ pointingLegend = legEntry;
+
+ pointingLegend.setVisual(visual, TeLINES);
+ pointingLegend.setVisual(visual, TePOINTS);
+ pointingLegend.setVisual(visual, TeCELLS);
+ pointingLegend.setVisual(visual, TeTEXT);
+
+ legendMap_[legId] = &pointingLegend;
+ }
+ else if(gId == -3)
+ {
+ TeLegendEntry& defaultLegend = theme->defaultLegend();
+ defaultLegend = legEntry;
+ legendMap_[legId] = &defaultLegend;
+
+ // Make the pointing visual equal to the default visual, excluding
+ // the pointing color
+ TeColor color;
+ TeLegendEntry& pointingLegend = theme->pointingLegend();
+ TeVisual& pointingVisual = pointingLegend.visual(rep);
+ color = pointingVisual.color();
+ pointingLegend.setVisual(visual, rep);
+ pointingVisual.color(color);
+
+ // Make the query visual equal to the default visual, excluding
+ // the query color
+ TeLegendEntry& queryLegend = theme->queryLegend();
+ TeVisual& queryVisual = queryLegend.visual(rep);
+ color = queryVisual.color();
+ queryLegend.setVisual(visual, rep);
+ queryVisual.color(color);
+
+ // Make the pointingQuery visual equal to the default visual, excluding
+ // the pointingQuery color
+ TeLegendEntry& pointingQueryLegend = theme->queryAndPointingLegend();
+ TeVisual& pointingQueryVisual = pointingQueryLegend.visual(rep);
+ color = pointingQueryVisual.color();
+ pointingQueryLegend.setVisual(visual, rep);
+ pointingQueryVisual.color(color);
+ }
+ else if(gId == -2)
+ {
+ TeLegendEntry& withoutDataConnectionLegend = theme->withoutDataConnectionLegend();
+ withoutDataConnectionLegend = legEntry;
+ legendMap_[legId] = &withoutDataConnectionLegend;
+ }
+ else if(gId == -1)
+ {
+ TeLegendEntry& outOfCollectionLegend = theme->outOfCollectionLegend();
+ outOfCollectionLegend = legEntry;
+ legendMap_[legId] = &outOfCollectionLegend;
+ }
+ else if (gId > -1)
+ {
+ TeLegendEntryVector& legendEntryVector = theme->legend();
+ if (legendEntryVector.empty() == true)
+ legendEntryVector.push_back(legMap[legId]);
+ else
+ {
+ if (legId != lastLegId)
+ legendEntryVector.push_back(legMap[legId]);
+ else
+ {
+ legendEntryVector.pop_back();
+ legendEntryVector.push_back(legMap[legId]);
+ }
+ }
+ lastLegId = legId;
+ }
+ }
+
+ TeLegendEntryVector& legVector = theme->legend();
+ for (i = 0; i < legVector.size(); ++i)
+ legendMap_[legVector[i].id()] = &legVector[i];
+
+ delete portal;
+ return true;
+}
+
+
+bool
+TeDatabase::updateProjection (TeProjection *proj)
+{
+ if (proj->id() <= 0)
+ return false;
+ string sql;
+ sql = "UPDATE te_projection SET ";
+ sql += "name='" + proj->name() + "',";
+ sql += " long0=" + Te2String(proj->params().lon0*TeCRD,15)+ ",";
+ sql += " lat0=" + Te2String(proj->params().lat0*TeCRD,15) + ",";
+ sql += " offx=" +Te2String(proj->params().offx,15) + ",";
+ sql += " offy=" +Te2String(proj->params().offy,15) + ",";
+ sql += " stlat1="+ Te2String(proj->params().stlat1*TeCRD,15) + ",";
+ sql += " stlat2=" +Te2String(proj->params().stlat2*TeCRD,15) + ",";
+ sql += " unit='" + proj->params().units + "',";
+ sql += " scale=" + Te2String(proj->params().scale) + ",";
+ sql += " hemis=" + Te2String(proj->params().hemisphere) + ",";
+ sql += " datum='" + proj->datum().name() + "',";
+ sql += " radius=" + Te2String(proj->datum().radius(),15) + ",";
+ sql += " flattening=" + Te2String(proj->datum().flattening(),15) + ",";
+ sql += " dx=" + Te2String(proj->datum().xShift(),15) + ",";
+ sql += " dy=" + Te2String(proj->datum().yShift(),15) + ",";
+ sql += " dz=" + Te2String(proj->datum().zShift(),15) ;
+ sql += " WHERE projection_id = " + Te2String(proj->id());
+ return this->execute(sql);
+}
+
+TeProjection*
+TeDatabase::loadProjection (int projId)
+{
+ TeDatabasePortal* portal = this->getPortal();
+
+ string sql ="SELECT * FROM te_projection WHERE projection_id = " + Te2String (projId);
+
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return 0;
+ }
+
+ // Look for the projection
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ return 0;
+ }
+
+ TeDatum datum ( portal->getData("datum"),
+ portal->getDouble("radius"),
+ portal->getDouble("flattening"),
+ portal->getDouble("dx"),
+ portal->getDouble("dy"),
+ portal->getDouble("dz"));
+
+ TeProjectionParams mProjPars;
+ mProjPars.datum = datum;
+ mProjPars.name = portal->getData("name");
+ mProjPars.lat0 = portal->getDouble("lat0")*TeCDR;
+ mProjPars.lon0 = portal->getDouble("long0")*TeCDR;
+ mProjPars.offx = portal->getDouble("offx");
+ mProjPars.offy = portal->getDouble("offy");
+ mProjPars.stlat1 = portal->getDouble("stlat1")*TeCDR;
+ mProjPars.stlat2 = portal->getDouble("stlat2")*TeCDR;
+ mProjPars.units = portal->getData("unit");
+ mProjPars.scale = portal->getDouble("scale");
+ mProjPars.hemisphere = (TeHemisphere)portal->getInt("hemis");
+
+ TeProjection* proj = TeProjectionFactory::make(mProjPars);
+ delete portal;
+ proj->id(projId);
+ return proj;
+}
+
+bool
+TeDatabase::insertPolygonSet(const string& table, TePolygonSet &ps)
+{
+ for (unsigned int i = 0; i < ps.size(); i++ )
+ {
+ TePolygon poly = ps [i];
+ if (!insertPolygon (table,poly))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::updatePolygonSet (const string& table, TePolygonSet &ps)
+{
+ for (unsigned int i = 0; i < ps.size(); i++ )
+ {
+ TePolygon poly = ps [i];
+ if (!updatePolygon (table,poly))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::selectPolygonSet (const string& table, const string& criteria, TePolygonSet &ps)
+{
+ TeDatabasePortal *portal = this->getPortal();
+ string sql ="SELECT * FROM " + table;
+ if (!criteria.empty())
+ sql += " WHERE " + criteria;
+ sql += " ORDER BY object_id ASC, parent_id, num_holes DESC, ext_max ASC";
+
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ ps.add(poly);
+ }
+ while (flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::loadPointSet(TeTheme* theme, TePointSet &ps)
+{
+ string collTable = theme->collectionTable();
+ if (collTable.empty())
+ return false;
+
+ TeLayer* themeLayer = theme->layer();
+ if (!themeLayer->hasGeometry(TePOINTS))
+ return false;
+
+ string pointTable = themeLayer->tableName(TePOINTS);
+ if (pointTable.empty())
+ return false;
+
+ string sql = "SELECT * FROM (" + pointTable + " RIGHT JOIN " + collTable;
+ sql = sql + " ON " + pointTable + ".object_id = " + collTable + ".object_id)";
+
+ TeDatabasePortal *portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ if (!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do {
+ TePoint pt;
+ flag = portal->fetchGeometry(pt);
+ ps.add(pt);
+ }
+ while (flag);
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::loadLineSet(TeTheme* theme, TeLineSet &ls)
+{
+ string collTable = theme->collectionTable();
+ if (collTable.empty())
+ return false;
+
+ TeLayer* themeLayer = theme->layer();
+ if (!themeLayer->hasGeometry(TeLINES))
+ return false;
+
+ string lineTable = themeLayer->tableName(TeLINES);
+ if (lineTable.empty())
+ return false;
+
+ string sql = "SELECT * FROM (" + lineTable + " RIGHT JOIN " + collTable;
+ sql = sql + " ON " + lineTable + ".object_id = " + collTable + ".object_id)";
+
+ TeDatabasePortal *portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ if (!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag;
+ do
+ {
+ TeLine2D lin;
+ flag = portal->fetchGeometry(lin);
+ ls.add(lin);
+ }while(flag);
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::loadPolygonSet (const string& table, const string& geoid, TePolygonSet &ps)
+{
+
+ TeDatabasePortal *portal = this->getPortal();
+ string q ="SELECT * FROM " + table;
+
+ if (!geoid.empty())
+ q += " WHERE object_id = '" + geoid +"'";
+ q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
+
+ if (!portal->query(q))
+ {
+ delete portal;
+ return false;
+ }
+
+ if (!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ ps.add(poly);
+ }
+ while (flag);
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::loadPolygonSet (const string& table, TeBox &bb, TePolygonSet &polSet)
+{
+ TeDatabasePortal *portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ string q;
+ q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere (bb, TePOLYGONS);
+ q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ polSet.add(poly);
+ }
+ while (flag);
+ delete portal;
+ return true;
+}
+
+TeDatabasePortal*
+TeDatabase::loadPolygonSet(const string& table, TeBox &box)
+{
+ TeDatabasePortal *portal = this->getPortal();
+ if (!portal)
+ return 0;
+
+ string q;
+ q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere (box, TePOLYGONS);
+ q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return 0;
+ }
+ else
+ return portal;
+}
+
+
+bool
+TeDatabase::locatePolygon (const string& table, TeCoord2D &pt, TePolygon &polygon, const double& tol)
+{
+ TeDatabasePortal *portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+ string q;
+ q = "SELECT * FROM " + table + " WHERE lower_x < " + Te2String(box.x2(),15);
+ q += " AND upper_x > " + Te2String(box.x1(),15);
+ q += " AND lower_y < " + Te2String(box.y2(),15);
+ q += " AND upper_y > " + Te2String(box.y1(),15);
+ q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ if (TeWithin (TePoint(pt), poly))
+ {
+ polygon = poly;
+ delete portal;
+ return true;
+ }
+ }
+ while (flag);
+ delete portal;
+ return false;
+}
+
+
+bool
+TeDatabase::locatePolygonSet (const string& table, TeCoord2D &pt, double tol, TePolygonSet &polygons)
+{
+ TeDatabasePortal *portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+ string q;
+ q = "SELECT * FROM " + table + " WHERE lower_x < " + Te2String(box.x2(),6);
+ q += " AND upper_x > " + Te2String(box.x1(),6);
+ q += " AND lower_y < " + Te2String(box.y2(),6);
+ q += " AND upper_y > " + Te2String(box.y1(),6);
+ q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ bool flag = true;
+ polygons.clear();
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ if (TeWithin (TePoint(pt), poly))
+ polygons.add(poly);
+ }
+ while (flag);
+ delete portal;
+
+ if(polygons.size())
+ return (true);
+ return false;
+}
+
+
+bool
+TeDatabase::loadPolygonSet(TeTheme* theme, TePolygonSet &ps)
+{
+ string collTable = theme->collectionTable();
+ if (collTable.empty())
+ return false;
+
+ TeLayer* themeLayer = theme->layer();
+ if (!themeLayer->hasGeometry(TePOLYGONS))
+ return false;
+
+ string polygonTable = themeLayer->tableName(TePOLYGONS);
+ if (polygonTable.empty())
+ return false;
+
+ string sql = "SELECT * FROM (" + polygonTable + " RIGHT JOIN " + collTable;
+ sql = sql + " ON " + polygonTable + ".object_id = " + collTable + ".object_id)";
+ sql += " ORDER BY " + polygonTable + ".parent_id, ";
+ sql += polygonTable + ".num_holes DESC, " + polygonTable + ".ext_max ASC";
+
+ TeDatabasePortal *portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ if (!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ ps.add ( poly );
+ }
+ while (flag);
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::insertLineSet (const string& table, TeLineSet &ls)
+{
+ for (unsigned int i = 0; i < ls.size(); i++ )
+ {
+ TeLine2D line = ls [i];
+ if (!insertLine (table,line))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::updateLineSet (const string& table, TeLineSet &ls)
+{
+ for (unsigned int i = 0; i < ls.size(); i++ )
+ {
+ TeLine2D line = ls [i];
+ if (!updateLine (table,line))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::loadLineSet (const string& table, const string& geoid, TeLineSet &ls)
+{
+ TeDatabasePortal *portal = this->getPortal();
+
+ string q ="SELECT * FROM " + table;
+
+ if (!geoid.empty())
+ q += " WHERE object_id = '" + geoid +"'";
+
+ q += " ORDER BY ext_max DESC";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TeLine2D line;
+ flag = portal->fetchGeometry(line);
+ ls.add ( line );
+ }while(flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::loadLineSet (const string& table, TeBox &bb, TeLineSet &linSet)
+{
+ TeDatabasePortal *portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ string q;
+ q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere (bb, TeLINES);
+ q += " ORDER BY ext_max DESC";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ bool flag = true;
+ do
+ {
+ TeLine2D lin;
+ flag = portal->fetchGeometry(lin);
+ linSet.add(lin);
+ }
+ while (flag);
+ delete portal;
+ return true;
+}
+
+TeDatabasePortal*
+TeDatabase::loadLineSet (const string& table, TeBox &box)
+{
+ TeDatabasePortal *portal = this->getPortal();
+ if (!portal)
+ return 0;
+
+ string q;
+ q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere (box, TeLINES);
+ q += " ORDER BY ext_max DESC";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return 0;
+ }
+ return portal;
+}
+
+bool
+TeDatabase::selectLineSet (const string& table, const string& criteria, TeLineSet &ls)
+{
+ TeDatabasePortal *portal = this->getPortal();
+ string q ="SELECT * FROM " + table;
+ if (!criteria.empty())
+ q += " WHERE " + criteria;
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TeLine2D line;
+ flag = portal->fetchGeometry(line);
+ ls.add ( line );
+ }while(flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::locateLine (const string& table, TeCoord2D &pt, TeLine2D &line, const double& tol)
+{
+ TeDatabasePortal* portal = this->getPortal();
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+ string q ="SELECT * FROM " + table;
+ char buf [1024];
+ sprintf (buf," WHERE lower_x < %f AND upper_x > %f AND lower_y < %f AND upper_y > %f",
+ box.x2(),box.x1(),box.y2(),box.y1());
+ q += buf;
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ // Get all lines
+ TeLineSet ls;
+ int k;
+ bool flag = true;
+ do
+ {
+ TeLine2D l;
+ flag = portal->fetchGeometry( l );
+ ls.add ( l );
+ } while (flag);
+
+ delete portal;
+
+ TeCoord2D paux;
+
+ if (TeNearest (pt, ls, k, paux, tol))
+ {
+ line = ls[k];
+ return true;
+ }
+ return false;
+}
+
+bool
+TeDatabase::insertPointSet (const string& table, TePointSet &ps)
+{
+ for (unsigned int i = 0; i < ps.size(); i++ )
+ {
+ TePoint point = ps [i];
+ if (!insertPoint (table,point))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::updatePointSet (const string& table, TePointSet &ps)
+{
+ for (unsigned int i = 0; i < ps.size(); i++ )
+ {
+ TePoint point = ps [i];
+ if (!updatePoint (table,point))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::loadPointSet (const string& table, const string& geoid, TePointSet &ps)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ string q ="SELECT * FROM " + table;
+
+ if (!geoid.empty())
+ q += " WHERE object_id = '" + geoid +"'";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TePoint point;
+ flag = portal->fetchGeometry (point);
+ ps.add ( point );
+ }while (flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::loadPointSet (const string& table, TeBox &bb, TePointSet &ps)
+{
+ TeDatabasePortal *portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ string q;
+ q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere (bb, TePOINTS);
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ bool flag = true;
+ do
+ {
+ TePoint pt;
+ flag = portal->fetchGeometry(pt);
+ ps.add(pt);
+ }
+ while (flag);
+ delete portal;
+ return true;
+}
+
+TeDatabasePortal*
+TeDatabase::loadPointSet(const string& table, TeBox &box)
+{
+ TeDatabasePortal *portal = this->getPortal();
+ if (!portal)
+ return 0;
+
+ string q;
+ q = "SELECT * FROM " + table + " WHERE ";
+ q += this->getSQLBoxWhere (box, TePOINTS);
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return 0;
+ }
+ return portal;
+}
+
+bool
+TeDatabase::selectPointSet (const string& table, const string& criteria, TePointSet &ps)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ string q ="SELECT * FROM " + table;
+ if (!criteria.empty())
+ q += " WHERE " + criteria;
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TePoint point;
+ flag = portal->fetchGeometry (point);
+ ps.add ( point );
+ }while (flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::locatePoint (const string& table, TeCoord2D &pt, TePoint &point, const double& tol)
+{
+ TeDatabasePortal* portal = this->getPortal();
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+ string q ="SELECT * FROM " + table;
+ char buf [1024];
+ sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
+ box.x2(),box.x1(),box.y2(),box.y1());
+ q += buf;
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ TePointSet ps;
+ bool flag = true;
+ do
+ {
+ TePoint point;
+ flag = portal->fetchGeometry (point);
+ ps.add ( point );
+ }while (flag);
+
+ delete portal;
+ int k;
+ if (TeNearest (pt, ps, k, tol))
+ {
+ point = ps[k];
+ return true;
+ }
+ return false;
+}
+
+bool
+TeDatabase::insertTextSet (const string& table, TeTextSet &ts)
+{
+ for (unsigned int i = 0; i < ts.size(); i++ )
+ {
+ TeText text = ts [i];
+ if (!insertText (table,text))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::updateTextSet (const string& table, TeTextSet &ts)
+{
+ for ( unsigned int i = 0; i < ts.size(); i++ )
+ {
+ TeText text = ts [i];
+ if (!updateText (table,text))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::loadTextSet (const string& table, const string& geoid, TeTextSet &ts)
+{
+ TeDatabasePortal *portal = this->getPortal();
+
+ string q ="SELECT * FROM " + table;
+ if (!geoid.empty())
+ q += " WHERE object_id = '" + geoid +"'";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ // Look for all texts
+ bool flag = true;
+ do
+ {
+ TeText p;
+ flag = portal->fetchGeometry(p);
+ ts.add ( p );
+ } while (flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::selectTextSet (const string& table, const string& criteria, TeTextSet &ts)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ string q ="SELECT * FROM " + table;
+ if (!criteria.empty())
+ q += " WHERE " + criteria;
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ // Look for all texts
+ bool flag = true;
+ do
+ {
+ TeText p;
+ flag = portal->fetchGeometry(p);
+ ts.add ( p );
+ } while (flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::updateText(const string& table, TeText &t)
+{
+ string sql;
+ sql = "UPDATE " + table + " SET ";
+ sql += "x=" + Te2String(t.location().x(),10) + ", ";
+ sql += "y=" + Te2String(t.location().y(),10) + ", ";
+ sql += "text_value='" + t.textValue() + "', ";
+ sql += "angle=" + Te2String(t.angle(),5) + ", ";
+ sql += "height=" + Te2String(t.height(),5) + ",";
+ sql += "alignment_vert=" + Te2String(t.alignmentVert(),5) + ",";
+ sql += "alignment_horiz=" + Te2String(t.alignmentHoriz(),5);
+ sql += " WHERE geom_id=" + Te2String(t.geomId());
+ return (this->execute(sql));
+}
+
+bool
+TeDatabase::updateNode(const string& table, TeNode &node)
+{
+ string sql;
+ sql = "UPDATE " + table + " SET ";
+ sql += "x=" + Te2String(node.location().x(),10) + ", ";
+ sql += "y=" + Te2String(node.location().y(),10) + ", ";
+ sql += " WHERE geom_id = " + Te2String(node.geomId());
+ return (this->execute(sql));
+}
+
+bool
+TeDatabase::updatePoint(const string& table, TePoint &p)
+{
+ string sql;
+ sql = "UPDATE " + table + " SET ";
+ sql += "x=" + Te2String(p.location().x(),10) + ", ";
+ sql += "y=" + Te2String(p.location().y(),10) + ", ";
+ sql += " WHERE geom_id = " + Te2String(p.geomId());
+ return (this->execute(sql));
+}
+
+bool TeDatabase::locateText (const string& table, TeCoord2D &pt, TeText &text, const double& tol)
+{
+ TeDatabasePortal* portal = this->getPortal();
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+ string q ="SELECT * FROM " + table;
+ char buf [1024];
+ sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
+ box.x2(),box.x1(),box.y2(),box.y1());
+ q += buf;
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ // Look for all texts
+ bool flag = true;
+ TeTextSet ts;
+ do
+ {
+ TeText p;
+ flag = portal->fetchGeometry(p);
+ ts.add ( p );
+ } while (flag);
+
+ delete portal;
+
+ int k;
+ if (TeNearest (pt, ts, k, tol))
+ {
+ text = ts[k];
+ return true;
+ }
+ return false;
+}
+
+bool
+TeDatabase::insertArcSet (const string& table, TeArcSet &as)
+{
+ for (unsigned int i = 0; i < as.size(); i++ )
+ {
+ TeArc arc = as [i];
+ if (!insertArc (table,arc))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::updateArcSet (const string& table, TeArcSet &as)
+{
+ for ( unsigned int i = 0; i < as.size(); i++ )
+ {
+ TeArc arc = as [i];
+ if (!updateArc (table,arc))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::loadArcSet (const string& table, const string& geoid, TeArcSet &as)
+{
+
+ TeDatabasePortal* portal = this->getPortal();
+ string q ="SELECT * FROM " + table;
+ if (!geoid.empty())
+ q += " WHERE object_id = " + geoid;
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ // Look for all nodes
+ bool flag;
+ do
+ {
+ TeArc arc;
+ flag = portal->fetchGeometry(arc);
+ as.add (arc);
+ } while (flag);
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::updateArc (const string& /*table */, TeArc &arc)
+{
+ string sql;
+ sql = "UPDATE table SET ";
+ sql += "from_node=" + Te2String(arc.fromNode().geomId()) + ", ";
+ sql += "to_node=" + Te2String(arc.toNode().geomId()) + ", ";
+ sql += " WHERE object_id = " + arc.geomId();
+ return (this->execute(sql));
+}
+
+bool
+TeDatabase::insertNodeSet (const string& table, TeNodeSet &ns)
+{
+ for (unsigned int i = 0; i < ns.size(); i++ )
+ {
+ TeNode no = ns [i];
+ if (!insertNode (table,no))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::updateNodeSet (const string& table, TeNodeSet &ns)
+{
+ for (unsigned int i = 0; i < ns.size(); i++ )
+ {
+ TeNode no = ns [i];
+ if (!updateNode (table,no))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::loadNodeSet (const string& table, const string& geoid, TeNodeSet &ns)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ string q ="SELECT * FROM " + table;
+ if (!geoid.empty())
+ q += " WHERE object_id = " + geoid;
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TeNode n;
+ flag = portal->fetchGeometry(n);
+ ns.add ( n );
+ }while (flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::insertCellSet (const string& table, TeCellSet &cs)
+{
+ for (unsigned int i = 0; i < cs.size(); i++ )
+ {
+ TeCell cell = cs [i];
+ if (!insertCell (table,cell))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::updateCellSet (const string& table, TeCellSet &cs)
+{
+ for (unsigned int i = 0; i < cs.size(); i++ )
+ {
+ TeCell cell = cs [i];
+ if (!updateCell (table,cell))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDatabase::loadCellSet (const int& layerId, const string& table, const string& geoid, TeCellSet &cs)
+{
+
+ TeDatabasePortal *portal = this->getPortal();
+
+ // Get the cell set resolution
+ string q = "SELECT * FROM te_representation WHERE layer_id = " + Te2String(layerId);
+ q += " AND geom_type = " + Te2String(TeCELLS);
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ cs.resX(portal->getDouble("res_x"));
+ cs.resY(portal->getDouble("res_y"));
+
+ portal->freeResult();
+
+ q = "SELECT * FROM " + table;
+ if (!geoid.empty())
+ q += " WHERE object_id = '" + geoid +"'";
+ q += " ";
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag;
+ do
+ {
+ TeCell cell;
+ flag = portal->fetchGeometry(cell);
+ cs.add ( cell );
+ } while (flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::selectCellSet (const int& layerId, const string& table, const string& criteria, TeCellSet &cs)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ string q = "SELECT * FROM te_representation WHERE layer_id = " ;
+ q += Te2String(layerId) + " AND geom_type = " + Te2String(TeCELLS);
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ cs.resX(portal->getDouble("res_x"));
+ cs.resY(portal->getDouble("res_y"));
+ portal->freeResult();
+
+ q ="SELECT * FROM " + table;
+ if (!criteria.empty())
+ q += " WHERE " + criteria;
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag;
+ do
+ {
+ TeCell cell;
+ flag = portal->fetchGeometry(cell);
+ cs.add ( cell );
+ } while (flag);
+
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::updateCell(const string& /* table */, TeCell &c)
+{
+ TeBox b = c.box();
+
+ string sql;
+ sql = "UPDATE table SET ";
+ sql += "lower_x=" + Te2String(b.lowerLeft().x(),15) + ", ";
+ sql += "lower_y=" + Te2String(b.lowerLeft().y(),15) + ", ";
+ sql += "upper_x=" + Te2String(b.upperRight().x(),15) + ", ";
+ sql += "upper_y=" + Te2String(b.upperRight().y(),15) + ", ";
+ sql += "col_number=" + Te2String(c.column()) + ", ";
+ sql += "row_number=" + Te2String(c.line());
+ sql += " WHERE geom_id = " + c.geomId();
+ return (this->execute(sql));
+}
+
+bool
+TeDatabase::locateCell (const string& table, TeCoord2D &pt, TeCell &cell, const double& /* tol */)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ string q ="SELECT * FROM " + table;
+ char buf [1024];
+ sprintf (buf," WHERE lower_x < %f AND upper_x > %f AND lower_y < %f AND upper_y > %f",
+ pt.x(),pt.x(),pt.y(),pt.y());
+ q += buf;
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ portal->fetchGeometry(cell);
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::inClauseValues(const string& query, const string& /* attribute */, vector<string>& inClauseVector)
+{
+ inClauseVector.push_back( "(" + query + ")" );
+ return true;
+}
+
+//Spatial query
+//retornam um portal
+
+bool
+TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabasePortal *portal, int relate, const string& actCollTable)
+{
+ return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, portal, relate, actCollTable));
+}
+
+bool
+TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, const string& visGeomTable, TeGeomRep visRep, TeDatabasePortal *portal, int relate, const string& visCollTable)
+{
+ return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, visGeomTable, visRep, portal, relate, visCollTable));
+}
+
+bool
+TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, TeDatabasePortal *portal, int relate, const string& actCollTable)
+{
+ return (TeTopologicalRelation(actGeomTable, actRep, geom, portal, relate, actCollTable));
+}
+
+//retornam um vetor de object_ids resultantes da consulta
+bool
+TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, Keys& actIdsOut, int relate, const string& actCollTable)
+{
+ return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, actIdsOut, this, relate, actCollTable));
+}
+
+bool
+TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, const string& visGeomTable, TeGeomRep visRep, Keys& visIdsOut, int relate, const string& visCollTable)
+{
+ return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, visGeomTable, visRep, visIdsOut, this, relate, visCollTable));
+}
+
+bool
+TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, Keys& actIdsOut, int relate, const string& actCollTable)
+{
+ return (TeTopologicalRelation(actGeomTable, actRep, geom, actIdsOut, this, relate, actCollTable));
+}
+
+//metric functions
+bool
+TeDatabase::calculateArea(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, double &area)
+{
+ return (TeGetArea(actGeomTable, actRep, actIdsIn, this, area));
+}
+
+bool
+TeDatabase::calculateLength(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn , double& length )
+{
+ return (TeGetLength(actGeomTable, actRep, actIdsIn, this, length));
+}
+
+bool
+TeDatabase::calculateDistance(const string& actGeomTable, TeGeomRep actRep, Keys& Ids, double& distance)
+{
+ return (TeGetDistance(actGeomTable, actRep, Ids, this, distance));
+}
+
+bool
+TeDatabase::calculateDistance(const string& /* actGeomTable */, TeGeomRep /*actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, double& /* distance */)
+{
+ return false;
+}
+
+bool
+TeDatabase::withinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& coord, KeysToDist& IdsDistOut, const double& max_distance, const string& actCollTable)
+{
+ return (TeGetWithinDistance(actGeomTable, actRep, coord, IdsDistOut, this, max_distance, actCollTable));
+}
+
+// functions that generate new geometry
+bool
+TeDatabase::Buffer(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& bufferSet, double dist)
+{
+ return (TeGetBuffer(actGeomTable, actRep, actIds, this, bufferSet, dist));
+}
+
+bool
+TeDatabase::Centroid(const string& actGeomTable , TeGeomRep actRep, TePointSet& centroidSet, Keys actIds, const string& actCollTable)
+{
+ return (TeGetCentroid(actGeomTable, actRep, this, centroidSet, actIds, actCollTable));
+}
+
+bool
+TeDatabase::ConvexHull(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& convexHullSet)
+{
+ return (TeGetConvexHull(actGeomTable, actRep, actIds, this, convexHullSet));
+}
+
+bool
+TeDatabase::nearestNeighbors(const string& /* actGeomTable */, const string& /* actCollTable */, TeGeomRep /* actRep */, const string& /* objId1 */, Keys& /* actIdsOut */, int /* numRes */)
+{
+ return false;
+}
+
+bool
+TeDatabase::nearestNeighbors(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, const string& /* visCollTable */, TeGeomRep /* visRep */, Keys& /* visIdsOut */, int /* numRes */)
+{
+ return false;
+}
+
+bool
+TeDatabase::nearestNeighbors(const string& /* actGeomTable */, const string& /* actCollTable */, TeGeomRep /* actRep */, const string& /* objId1 */, TeDatabasePortal* /* portal */, int /* numRes */)
+{
+ return false;
+}
+
+bool
+TeDatabase::nearestNeighbors(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, const string& /* visCollTable */, TeGeomRep /* visRep */, TeDatabasePortal* /* portal */, int /* numRes */)
+{
+ return false;
+}
+
+bool
+TeDatabase::geomIntersection(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect)
+{
+ return (TeGetOverlay(actGeomTable, actRep, actIds, this, geomVect, TeINTERSECTION));
+}
+
+bool
+TeDatabase::geomIntersection(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
+{
+ return false;
+}
+
+bool
+TeDatabase::geomDifference(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& objId2, TeGeometryVect& geomVect)
+{
+ Keys actIds;
+ actIds.push_back(objId1);
+ actIds.push_back(objId2);
+
+ return (TeGetOverlay(actGeomTable, actRep, actIds, this, geomVect, TeDIFFERENCE));
+
+}
+
+bool
+TeDatabase::geomDifference(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
+{
+ return false;
+}
+
+bool
+TeDatabase::geomUnion(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect)
+{
+ return (TeGetOverlay(actGeomTable, actRep, actIds, this, geomVect, TeUNION));
+}
+
+bool
+TeDatabase::geomUnion(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
+{
+ return false;
+}
+
+bool
+TeDatabase::geomXOr(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
+{
+ return false;
+}
+
+bool
+TeDatabase::geomXOr(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
+{
+ return false;
+}
+
+// Operation with Image
+
+bool
+TeDatabase::Zonal(const string& rasterTable, const string& actGeomTable, Keys& Ids, TeObjectStatistics& result)
+{
+ TeDatabasePortal* portal=getPortal();
+ if (!portal)
+ return false;
+
+ //recuperar o raster!!!
+ string sql = "SELECT layer_id FROM te_representation";
+ sql += " WHERE geom_table = '" + rasterTable +"'";
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ int layerId = atoi(portal->getData(0));
+ TeRaster* raster = loadLayerRaster(layerId);
+
+ //recuperar as geometrias
+ portal->freeResult();
+
+ string objIds = getStringIds(Ids);
+ sql = "SELECT * FROM "+ actGeomTable;
+ sql+= " WHERE object_id IN ("+ objIds +")";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+
+ TeStatisticsDimensionVect st;
+
+ TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPixelIn);
+ TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
+
+ if(!TeCalculateStatistics (itBegin, itEnd, st))
+ {
+ delete portal;
+ return false;
+ }
+
+ result[poly.objectId()] = st;
+
+ }while (flag);
+
+
+ delete raster;
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::Zonal(const string& rasterTable, const string& actGeomTable, const string& actCollTable, TeObjectStatistics& result)
+{
+ TeDatabasePortal* portal=getPortal();
+ if (!portal)
+ return false;
+
+ //recuperar o raster
+ string sql = "SELECT layer_id FROM te_representation";
+ sql += " WHERE geom_table = '" + rasterTable +"'";
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ int layerId = atoi(portal->getData(0));
+ TeRaster* raster = loadLayerRaster(layerId);
+
+ //recuperar as geometrias
+ portal->freeResult();
+
+ sql = "SELECT * FROM "+ actGeomTable;
+
+ if(!actCollTable.empty())
+ {
+ sql += " ,"+ actCollTable;
+ sql += " WHERE object_id = c_object_id ";
+ }
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+
+ TeStatisticsDimensionVect st;
+
+ TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPixelIn);
+ TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
+
+ if(!TeCalculateStatistics (itBegin, itEnd, st))
+ {
+ delete portal;
+ return false;
+ }
+ result[poly.objectId()] = st;
+
+ }while (flag);
+
+
+ delete raster;
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::Zonal(const string& rasterTable, TePolygon& poly, TeStatisticsDimensionVect& result)
+{
+ TeDatabasePortal* portal=getPortal();
+ if (!portal)
+ return false;
+
+ //recuperar o raster!!!
+ string sql = "SELECT layer_id FROM te_representation";
+ sql += " WHERE geom_table = '" + rasterTable +"'";
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ int layerId = atoi(portal->getData(0));
+ TeRaster* raster = loadLayerRaster(layerId);
+
+ delete portal;
+
+ TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPixelIn);
+ TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
+
+ if(!TeCalculateStatistics (itBegin, itEnd, result))
+ return false;
+
+ delete raster;
+ return true;
+}
+
+
+bool
+TeDatabase::Mask(const string& rasterTable, const string& actGeomTable, const string& objId, const string& nameLayerOut, TeStrategicIterator st)
+{
+ TeDatabasePortal* portal=getPortal();
+ if (!portal)
+ return false;
+
+ //recuperar o raster!!!
+ string sql = "SELECT layer_id FROM te_representation";
+ sql += " WHERE geom_table = '" + rasterTable +"'";
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ int layerId = atoi(portal->getData(0));
+ TeRaster* raster = loadLayerRaster(layerId);
+
+ //recuperar a geometria
+ portal->freeResult();
+
+ sql = "SELECT * FROM "+ actGeomTable;
+ sql+= " WHERE object_id = '" + objId + "'";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ TePolygon poly;
+ portal->fetchGeometry(poly);
+
+ TeRaster* rasterOut = TeMask (raster, poly, st);
+ TeRasterParams param = rasterOut->params();
+
+ TeBox b = param.boundingBox();
+ TeLayer* layer = new TeLayer(nameLayerOut,this, b , rasterOut->projection());
+ bool status = TeImportRaster(layer,rasterOut, param.blockWidth_, param.blockHeight_, param.compression_[0]);
+
+ delete raster;
+ delete rasterOut;
+ delete portal;
+ return status;
+}
+
+
+
+bool
+TeDatabase::Mask(const string& rasterTable, TePolygon& poly, const string& nameLayerOut, TeStrategicIterator st)
+{
+ TeDatabasePortal* portal=getPortal();
+ if (!portal)
+ return false;
+
+ //recuperar o raster!!!
+ string sql = "SELECT layer_id FROM te_representation";
+ sql += " WHERE geom_table = '" + rasterTable +"'";
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ int layerId = atoi(portal->getData(0));
+ TeRaster* raster = loadLayerRaster(layerId);
+
+ delete portal;
+
+ TeRaster* rasterOut = TeMask (raster, poly, st);
+ TeRasterParams param = rasterOut->params();
+
+ TeBox b = param.boundingBox();
+ TeLayer* layer = new TeLayer(nameLayerOut,this, b , rasterOut->projection());
+ bool status = TeImportRaster(layer,rasterOut, param.blockWidth_, param.blockHeight_, param.compression_[0]);
+
+ delete raster;
+ delete rasterOut;
+ return status;
+}
+
+
+string
+TeDatabase::getSQLBoxWhere (TeBox &box, TeGeomRep rep)
+{
+ string wherebox;
+ string lowerX, lowerY, upperX, upperY;
+ if(rep == TePOLYGONS || rep == TeLINES || rep == TeCELLS || rep == TeRASTER)
+ {
+ lowerX = "lower_x";
+ lowerY = "lower_y";
+ upperX = "upper_x";
+ upperY = "upper_y";
+ }
+ else if(rep == TePOINTS || rep == TeTEXT)
+ {
+ lowerX = "x";
+ lowerY = "y";
+ upperX = "x";
+ upperY = "y";
+ }
+
+ wherebox = "NOT("+ lowerX +" >= " + Te2String(box.x2_, 12) + " OR ";
+ wherebox += upperX +" <= " + Te2String(box.x1_, 12) + " OR ";
+ wherebox += lowerY +" >= " + Te2String(box.y2_, 12) + " OR ";
+ wherebox += upperY +" <= " + Te2String(box.y1_, 12) + ")";
+
+ return wherebox;
+}
+
+
+string
+TeDatabase::getSQLBoxWhere (const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep /* rep1 */)
+{
+ string wherebox;
+
+ if(rep2 == TePOLYGONS || rep2 == TeLINES || rep2 == TeCELLS || rep2 == TeRASTER)
+ {
+ wherebox = " NOT( ";
+ wherebox += table2 +".lower_x > "+ table1 +".upper_x OR ";
+ wherebox += table2 +".upper_x < "+ table1 +".lower_x OR ";
+ wherebox += table2 +".lower_y > "+ table1 +".upper_y OR ";
+ wherebox += table2 +".upper_y < "+ table1 +".lower_y )";
+ }
+ else if(rep2 == TePOINTS || rep2 == TeTEXT)
+ {
+ wherebox = " NOT( ";
+ wherebox += table2 +".x > "+ table1 +".upper_x OR ";
+ wherebox += table2 +".x < "+ table1 +".lower_x OR ";
+ wherebox += table2 +".y > "+ table1 +".upper_y OR ";
+ wherebox += table2 +".y < "+ table1 +".lower_y )";
+ }
+
+ return wherebox;
+}
+
+
+string
+TeDatabase::getSQLBoxSelect (const string& tableName, TeGeomRep /* rep */)
+{
+ string sql = tableName +".* ";
+ return sql;
+}
+
+
+string
+TeDatabase::getSQLStatistics (TeGroupingAttr& attrs)
+{
+ string sql = "";
+ string virg = "";
+
+ TeGroupingAttr::iterator it = attrs.begin();
+ int count = 0;
+ while(it != attrs.end())
+ {
+ if(count>0)
+ virg = ",";
+
+ switch ((*it).second)
+ {
+ case TeSUM:
+ sql += virg +" SUM( "+ (*it).first.name_ +") AS SUM_"+ Te2String(count);
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeMAXVALUE:
+ sql += virg +" MAX( "+ (*it).first.name_ +") AS MAX_"+ Te2String(count);
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeMINVALUE:
+ sql += virg +" MIN( "+ (*it).first.name_ +") AS MIN_"+ Te2String(count);
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeCOUNT:
+ sql += virg +" COUNT( "+ (*it).first.name_ +") AS COUNT_"+ Te2String(count);
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ case TeMEAN:
+ sql += virg +" AVG( "+ (*it).first.name_ +") AS AVG_"+ Te2String(count);
+ (*it).second = TeNOSTATISTIC;
+ ++count;
+ break;
+ default:
+ break;
+ }
+ ++it;
+ }
+ return sql;
+}
+
+string
+TeDatabase::getSQLAutoNumber(const string& /* table */)
+{
+ return "";
+}
+
+string
+TeDatabase::getSQLTemporalWhere (TeTimeInterval& timeInterval, TeTemporalRelation timeOperator, const string& initialTime, const string& finalTime)
+{
+ string sql;
+ string t1 = getSQLTime(timeInterval.getT1());
+ string t2 = getSQLTime(timeInterval.getT2());
+
+ switch(timeOperator)
+ {
+ case TeTIMEBEFORE:
+ sql = finalTime +" < "+ t1;
+ break;
+ case TeTIMEAFTER:
+ sql = initialTime +" > "+ t2;
+ break;
+ case TeTIMEEQUAL:
+ sql = "( "+ initialTime +" >= "+ t1;
+ sql += " AND "+ initialTime +" <= "+ t2 +" )";
+ if (initialTime != finalTime)
+ {
+ sql += " AND ";
+ sql += "( "+ finalTime +" >= "+ t1;
+ sql += " AND "+ finalTime +" <= "+ t2 +" )";
+ }
+ break;
+
+ case TeTIMEMEETS:
+ sql = finalTime +" = "+ t1;
+ sql += " OR "+ initialTime +" = "+ t2;
+ break;
+
+ case TeTIMEDURING:
+ sql = initialTime +" >= "+ t1;
+ sql += " AND "+ initialTime +" <= "+ t2;
+ if (initialTime != finalTime)
+ {
+ sql += " AND "+ finalTime +" >= "+ t1;
+ sql += " AND "+ finalTime +" <= "+ t2;
+ }
+ break;
+
+ case TeTIMEOVERLAPS:
+ sql = "( "+ initialTime +" < "+ t1;
+ sql += " AND "+ finalTime +" > "+ t1;
+ sql += " AND "+ finalTime +" < "+ t2 +" )";
+ sql += " OR ";
+ sql += "( "+ initialTime +" > "+ t1;
+ sql += " AND "+ initialTime +" < "+ t2;
+ sql += " AND "+ finalTime +" > "+ t2 +" )";
+ break;
+
+ case TeTIMEENDS:
+ sql = finalTime +" = "+ t2;
+ break;
+
+ case TeTIMESTARTS:
+ sql = initialTime +" = "+ t1;
+ break;
+
+ default:
+ break;
+ }
+
+ return sql;
+}
+
+string
+TeDatabase::getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel,
+ const string& initialTime, const string& finalTime)
+{
+ //rever os chronons definidos - alterar o parser para restri��o temporal
+ string func, sql;
+ switch(chr)
+ {
+ case TeSECONDOFMINUTE:
+ func = " second";
+ break;
+
+ case TeMINUTEOFHOUR:
+ func = " minute";
+ break;
+
+ case TeHOUROFDAY:
+ func = " hour";
+ break;
+
+ case TeDAYOFMONTH:
+ func = " day";
+ break;
+
+ case TeDAYOFWEEK:
+ func = " weekday";
+ break;
+
+ case TeMONTHOFYEAR:
+ func = " month";
+ break;
+
+ case TeYEAR:
+ func = " year";
+ break;
+
+ default:
+ return "";
+ }
+
+ switch(rel)
+ {
+ case TeTIMEBEFORE:
+ sql = func +"("+ finalTime +") < "+ Te2String(time1);
+ break;
+
+ case TeTIMEAFTER:
+ sql = func +"("+ initialTime +") > "+ Te2String(time2);
+ break;
+
+ case TeTIMEEQUAL:
+ sql = func +"("+ initialTime +") = "+ Te2String(time1);
+ sql += " AND "+ func +"(" + finalTime +") = "+ Te2String(time2);
+ break;
+
+ case TeTIMEMEETS:
+ sql = func +"("+ finalTime +") = "+ Te2String(time1);
+ sql += " OR "+ func +"(" + initialTime +") = "+ Te2String(time2);
+ break;
+
+ case TeTIMEDURING:
+ sql = func +"("+ initialTime +") >= "+ Te2String(time1);
+ sql += " AND "+ func +"("+ initialTime +") <= "+ Te2String(time2);
+ sql += " AND "+ func +"("+ finalTime +") >= "+ Te2String(time1);
+ sql += " AND "+ func +"("+ finalTime +") <= "+ Te2String(time2);
+ break;
+
+ case TeTIMEOVERLAPS:
+ sql = "("+ func +"("+ initialTime +") <= "+ Te2String(time1);
+ sql += " AND "+ func +"("+ finalTime +") >= "+ Te2String(time1);
+ sql += " AND "+ func +"("+ finalTime +") <= "+ Te2String(time2) +")";
+ sql += " OR ";
+ sql += "("+ func +"("+ initialTime +") >= "+ Te2String(time1);
+ sql += " AND "+ func +"("+ initialTime +") <= "+ Te2String(time2);
+ sql += " AND "+ func +"("+ finalTime +") >= "+ Te2String(time2) +")";
+ break;
+
+ case TeTIMEENDS:
+ sql = func +"("+ finalTime +") = "+ Te2String(time2);
+ break;
+
+ case TeTIMESTARTS:
+ sql = func +"("+ initialTime +") = "+ Te2String(time1);
+
+ default:
+ break;
+ }
+
+ return sql;
+}
+
+string
+TeDatabase::getSQLTemporalWhere (const string& temporalRest)
+{
+ string result, tableName, initialCol, finalCol, time1, time2, mask;
+ TeTemporalRelation rel;
+ TeChronon chronon;
+
+ string temp = temporalRest;
+ bool flag = true;
+ int cont = 0;
+
+ while(flag)
+ {
+ string element;
+ int pos = temp.find (";");
+ if(pos<0)
+ {
+ flag = false;
+ element = temp;
+ }
+ else
+ {
+ element = temp.substr(0, pos);
+ temp = temp.substr (pos+1);
+ }
+
+ if(cont==0) //table name
+ tableName = element;
+ else if(cont==1) //column name (initial time)
+ initialCol = element;
+ else if(cont==2) //column name (final time)
+ finalCol = element;
+ else if(cont==3) //TeTemporalRelation
+ {
+ if(element=="TeTIMEEQUAL")
+ rel = TeTIMEEQUAL;
+ else if (element=="TeTIMEBEFORE")
+ rel = TeTIMEBEFORE;
+ else if (element=="TeTIMEAFTER")
+ rel = TeTIMEAFTER;
+ else if (element=="TeTIMEMEETS")
+ rel = TeTIMEMEETS;
+ else if (element=="TeTIMEDURING")
+ rel = TeTIMEDURING;
+ else if (element=="TeTIMEOVERLAPS")
+ rel = TeTIMEOVERLAPS;
+ else if (element=="TeTIMEENDS")
+ rel = TeTIMEENDS;
+ else if (element=="TeTIMESTARTS")
+ rel = TeTIMESTARTS;
+ }
+ else if(cont==4) //time 1
+ time1 = element;
+ else if(cont==5) //time 2
+ {
+ if(element.empty())
+ time1 = time2;
+ else
+ time2 = element;
+ }
+ else if(cont==6)
+ mask = element;
+ else if(cont==7) //TeChronon
+ {
+ if (element=="TeSECOND")
+ chronon = TeSECOND;
+ else if (element=="TeMINUTE")
+ chronon = TeMINUTE;
+ else if (element=="TeHOUR")
+ chronon = TeHOUR;
+ else if (element=="TeDAY")
+ chronon = TeDAY;
+ else if (element=="TeMONTH")
+ chronon = TeMONTH;
+ else if (element=="TeYEAR")
+ chronon = TeYEAR;
+ else if (element=="TeDAYOFWEEK")
+ chronon = TeDAYOFWEEK;
+ else if (element=="TeMONTHOFYEAR")
+ chronon = TeMONTHOFYEAR;
+ else if (element=="TeSEASON")
+ chronon = TeSEASON;
+ else if (element=="TeWEEKOFYEAR")
+ chronon = TeWEEKOFYEAR;
+ }
+
+ ++cont;
+ }
+
+ int posMask = mask.find ("s");
+ if(posMask<0)
+ {
+ result = " "+ getSQLTemporalWhere(atoi(time1.c_str()), atoi(time2.c_str()), chronon, rel, (tableName+"."+initialCol), (tableName+"."+finalCol)) +" ";
+ }
+ else
+ {
+ TeTimeInterval interval(time1, time2, chronon, mask);
+ result = " "+ getSQLTemporalWhere(interval, rel, (tableName+"."+initialCol), (tableName+"."+finalCol)) + " ";
+ }
+
+ return result;
+}
+
+
+string
+TeDatabase::getSQLTemporalFunction (TeChronon chr, const string& colName)
+{
+ string func;
+ switch(chr)
+ {
+ case TeYEAR:
+ func = " year ("+ colName +")";
+ break;
+
+ case TeMONTH: // Fev/2003 != Fev/2004
+ func = " year ("+ colName +"), month ("+ colName +") ";
+ break;
+
+ case TeMONTHOFYEAR: // Fev/2003 == Fev/2004
+ func = " month ("+ colName +")";
+ break;
+
+ case TeDAY: // 01/01/2003 != 01/01/2004 != 01/02/2004
+ func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +") ";
+ break;
+
+ case TeDAYOFMONTH: // 01/01/2003 == 01/01/2004 == 01/02/2004
+ func = " day("+ colName +") ";
+ break;
+
+ case TeDAYOFYEAR: // 01/01/2003 == 01/01/2004 != 01/02/2004
+ func = " month ("+ colName +"), day("+ colName +") ";
+ break;
+
+ case TeDAYOFWEEK: // 01/01/2003 != 01/01/2004 != 01/02/2004
+ func = " weekday ("+ colName +") ";
+ break;
+
+ case TeHOUR: // 01/01/2003 10:00 != 01/01/2004 10:00 != 01/02/2004 10:00
+ func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +"), hour("+ colName +") ";
+ break;
+
+ case TeHOUROFDAY: // 01/01/2003 10:00 == 01/01/2004 10:00 == 01/02/2004 10:00
+ func = " hour ("+ colName +")";
+ break;
+
+ case TeMINUTE: // 01/01/2003 10:30 != 01/01/2004 10:30 != 01/02/2004 10:30
+ func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +"), hour("+ colName +"), minute("+ colName +") ";
+ break;
+
+ case TeMINUTEOFHOUR: // 01/01/2003 10:30 == 01/01/2004 10:30 == 01/02/2004 10:30 != 01/02/2004 10:31
+ func = " minute("+ colName +") ";
+ break;
+
+ case TeSECOND: // 01/01/2003 10:30:04 != 01/01/2004 10:30:04 != 01/02/2004 10:30:04
+ func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +"), hour("+ colName +"), minute("+ colName +"), second("+ colName +") ";
+ break;
+
+ case TeSECONDOFMINUTE: // 01/01/2003 10:30:04 == 01/01/2004 10:30:04 == 01/02/2004 10:30:04 != 01/02/2004 10:30:07
+ func = " second("+ colName +") ";
+ break;
+
+ default:
+ return "";
+ }
+
+ return func;
+}
+
+
+bool
+TeDatabase::getMBRGeom(string tableGeom, string object_id, TeBox& box, string /* colGeom */)
+{
+ double xmin = TeMAXFLOAT;
+ double xmax = -TeMAXFLOAT;
+ double ymin = TeMAXFLOAT;
+ double ymax = -TeMAXFLOAT;
+
+ TeDatabasePortal* portal = getPortal();
+ if(!portal)
+ return false;
+
+ string sel = "SELECT lower_x, upper_x, lower_y, upper_y FROM " + tableGeom;
+ sel += " WHERE object_id = '" + object_id + "'";
+
+ if(!portal->query(sel))
+ {
+ delete portal;
+ return false;
+ }
+
+ bool b = portal->fetchRow();
+ if(!b)
+ {
+ delete portal;
+ return false;
+ }
+
+ while(b)
+ {
+ xmin = MIN(xmin, portal->getDouble(0));
+ xmax = MAX(xmax, portal->getDouble(1));
+ ymin = MIN(ymin, portal->getDouble(2));
+ ymax = MAX(ymax, portal->getDouble(3));
+ b = portal->fetchRow();
+ }
+
+ TeBox bb(xmin, ymin, xmax, ymax);
+ box = bb;
+ delete portal;
+ return true;
+}
+
+bool
+TeDatabase::getMBRSelectedObjects(string /* geomTable */,string /* colGeom */, string fromClause, string whereClause, string afterWhereClause, TeGeomRep repType,TeBox &bout, const double& tol)
+{
+ string fields;
+ string query;
+ bool status = false;
+
+ TeBox box;
+ bout = box;
+
+ TeDatabasePortal* portal = this->getPortal();
+
+ switch(repType)
+ {
+ case TePOLYGONS:
+ case TeLINES:
+
+ fields = "MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y)";
+ query = " SELECT " + fields;
+ query += " FROM " + fromClause;
+ if (!whereClause.empty())
+ query += " WHERE " + whereClause;
+ if (!afterWhereClause.empty())
+ query += afterWhereClause;
+
+ if (portal->query (query))
+ {
+ bool b = portal->fetchRow();
+ while(b)
+ {
+ string vxmin = portal->getData(0);
+ string vymin = portal->getData(1);
+ string vxmax = portal->getData(2);
+ string vymax = portal->getData(3);
+ if(vxmin.empty() || vymin.empty() || vxmax.empty() || vymax.empty())
+ {
+ b = portal->fetchRow();
+ continue;
+ }
+ double xmin = atof(vxmin.c_str());
+ double ymin = atof(vymin.c_str());
+ double xmax = atof(vxmax.c_str());
+ double ymax = atof(vymax.c_str());
+ TeBox ibox(xmin, ymin, xmax, ymax);
+ updateBox (bout, ibox);
+ b = portal->fetchRow();
+ status = true;
+ }
+ }
+ break;
+
+ case TePOINTS:
+
+ fields = "MIN(x), MIN(y), MAX(x), MAX(y)";
+ query = " SELECT " + fields;
+ query += " FROM " + fromClause;
+ if (!whereClause.empty())
+ query += " WHERE " + whereClause;
+ if (!afterWhereClause.empty())
+ query += afterWhereClause;
+
+ if (portal->query (query))
+ {
+ bool b = portal->fetchRow();
+ while(b)
+ {
+ string vxmin = portal->getData(0);
+ string vymin = portal->getData(1);
+ string vxmax = portal->getData(2);
+ string vymax = portal->getData(3);
+ if(vxmin.empty() || vymin.empty() || vxmax.empty() || vymax.empty())
+ {
+ b = portal->fetchRow();
+ continue;
+ }
+ double xmin = atof(vxmin.c_str());
+ double ymin = atof(vymin.c_str());
+ double xmax = atof(vxmax.c_str());
+ double ymax = atof(vymax.c_str());
+
+ TeBox ibox;
+ if (xmin == xmax) {
+ ibox.x1_ = xmin - tol;
+ ibox.x2_ = xmax + tol;
+ }
+ else{
+ ibox.x1_ = xmin;
+ ibox.x2_ = xmax;
+ }
+ if (ymin == ymax) {
+ ibox.y1_ = ymin - tol;
+ ibox.y2_ = ymax + tol;
+ }
+ else {
+ ibox.y1_ = ymin;
+ ibox.y2_ = ymax;
+ }
+ updateBox (bout, ibox);
+ b = portal->fetchRow();
+ status = true;
+ }
+ }
+ break;
+
+
+ default:
+ status = false;
+ break;
+ }
+
+ delete portal;
+
+ return status;
+
+}
+
+bool
+TeDatabase::getAttributeList(const string& tableName,TeAttributeList& attList)
+{
+ TeDatabasePortal* portal = this->getPortal();
+ if (!portal)
+ return false;
+
+ string sql = "SELECT * FROM " + tableName + " WHERE 1=2";
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+ else
+ attList = portal->AttributeList();
+ delete portal;
+ return true;
+}
+
+TeBox
+TeDatabase::getThemeBox(TeTheme* theme)
+{
+ TeBox bb;
+ if (!theme)
+ return bb;
+
+ string colTabName = theme->collectionTable();
+ if (colTabName.empty())
+ return bb;
+
+ string sqlfrom;
+ TeLayer* layer = theme->layer();
+ string geomTable;
+ if (layer->hasGeometry(TePOINTS))
+ {
+ geomTable = layer->tableName(TePOINTS);
+ sqlfrom = colTabName + " LEFT JOIN " + geomTable;
+ sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
+ TeBox bpt;
+ if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TePOINTS,bpt))
+ updateBox(bb,bpt);
+ }
+ if (layer->hasGeometry(TeLINES))
+ {
+ geomTable = layer->tableName(TeLINES);
+ sqlfrom = colTabName + " LEFT JOIN " + geomTable;
+ sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
+ TeBox bln;
+ if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TeLINES,bln))
+ updateBox(bb,bln);
+ }
+ if (layer->hasGeometry(TePOLYGONS))
+ {
+ geomTable = layer->tableName(TePOLYGONS);
+ sqlfrom = colTabName + " LEFT JOIN " + geomTable;
+ sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
+ TeBox bpol;
+ if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TePOLYGONS,bpol))
+ updateBox(bb,bpol);
+ }
+
+ if (layer->hasGeometry(TeCELLS))
+ {
+ geomTable = layer->tableName(TeCELLS);
+ sqlfrom = colTabName + " LEFT JOIN " + geomTable;
+ sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
+ TeBox bpol;
+ if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TeCELLS,bpol))
+ updateBox(bb,bpol);
+ }
+ return bb;
+}
+
+bool TeDatabase::insertRasterVisual (int themeId , TeRasterVisual* vis)
+{
+ TeRasterTransform::TeRasterTransfFunctions tf = vis->getTransfFunction();
+
+ if (tf == TeRasterTransform::TeNoTransf)
+ return true;
+
+ string sql = "DELETE FROM te_visual_raster WHERE theme_id = " + Te2String(themeId);
+ if (!this->execute(sql))
+ return false;
+
+ if (tf == TeRasterTransform::TeMono2Three ||
+ tf == TeRasterTransform::TePall2Three ||
+ tf == TeRasterTransform::TeLUT2Three)
+ {
+ sql = "INSERT INTO te_visual_raster (theme_id, band_in, transf_type) VALUES (";
+ sql += Te2String(themeId) + "," + Te2String(vis->getSrcBand()) + ",";
+ sql += Te2String(static_cast<short>(tf)) + ")";
+ if (!this->execute(sql))
+ return false;
+ return true;
+ }
+
+ if (tf == TeRasterTransform::TeExtractBand)
+ {
+ sql = "INSERT INTO te_visual_raster (theme_id, band_in, band_out, transf_type) VALUES (";
+ sql += Te2String(themeId) + "," + Te2String(vis->getSrcBand()) + ",";
+ sql += Te2String(vis->getDestBand()) + "," + Te2String(static_cast<short>(tf))+ ")";
+ if (!this->execute(sql))
+ return false;
+ return true;
+ }
+
+ if (tf == TeRasterTransform::TeExtractBands || tf == TeRasterTransform::TeExtractRGB)
+ {
+ map<TeRasterTransform::TeRGBChannels,short>& RGBmap = vis->getRGBMap();
+ map<TeRasterTransform::TeRGBChannels,short>::iterator it = RGBmap.begin();
+ while (it != RGBmap.end())
+ {
+ sql = "INSERT INTO te_visual_raster (theme_id, band_in, band_out, transf_type) VALUES (";
+ sql += Te2String(themeId) + "," + Te2String(static_cast<short>(it->second)) + ",";
+ sql += Te2String(static_cast<short>(it->first)) + "," + Te2String(static_cast<short>(tf))+ ")";
+ if (!this->execute(sql))
+ return false;
+ ++it;
+ }
+ return true;
+ }
+ return false;
+}
+
+
+bool
+TeDatabase::locateLineSet (const string& table, TeCoord2D &pt, TeLineSet &ls, const double& tol)
+{
+ bool located=false;
+ TeDatabasePortal* portal = this->getPortal();
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+ string q ="SELECT * FROM " + table;
+ char buf [1024];
+ sprintf (buf," WHERE lower_x < %f AND upper_x > %f AND lower_y < %f AND upper_y > %f",
+ box.x2(),box.x1(),box.y2(),box.y1());
+ q += buf;
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ // Get all lines
+ bool flag = true;
+ do
+ {
+ TeLine2D l;
+ TeLineSet tmp;
+ int index;
+ double dist;
+ TeCoord2D pout;
+
+ flag = portal->fetchGeometry( l );
+ tmp.add(l);
+ if(TeNearest(pt,tmp,index,pout,dist,tol))
+ {
+ ls.add ( l );
+ located=true;
+ }
+ } while (flag);
+
+ delete portal;
+ return located;
+}
+
+
+bool
+TeDatabase::locatePointSet (const string& table, TeCoord2D &pt, TePointSet &pointSet, const double& tol)
+{
+ bool located=false;
+
+ TeDatabasePortal* portal = this->getPortal();
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+ string q ="SELECT * FROM " + table;
+ char buf [1024];
+ sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
+ box.x2(),box.x1(),box.y2(),box.y1());
+ q += buf;
+
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TePoint point;
+ flag = portal->fetchGeometry (point);
+ pointSet.add ( point );
+ located=true;
+ }while (flag);
+
+ delete portal;
+ return located;
+}
+
+
+bool
+TeDatabase::locateTextSet (const string& table, TeCoord2D &pt, TeTextSet& textSet, const double& tol)
+{
+ bool located=false;
+
+ TeDatabasePortal* portal = this->getPortal();
+
+ TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+ string q ="SELECT * FROM " + table;
+ char buf [1024];
+ sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
+ box.x2(),box.x1(),box.y2(),box.y1());
+ q += buf;
+ if (!portal->query(q) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+ // Look for all texts
+ bool flag = true;
+
+ do
+ {
+ TeText p;
+ flag = portal->fetchGeometry(p);
+ textSet.add ( p );
+ located=true;
+ } while (flag);
+
+ delete portal;
+ return located;
+}
+
+
+// End TeDatabase Methods
+
+// Begin TeDatabasePortal Methods
+
+TeDatabasePortal::TeDatabasePortal():
+ db_(0),
+ numRows_(0),
+ numFields_ (0),
+ errorMessage_(""),
+ errorNumber_(0)
+ {}
+
+TeDatabasePortal::~TeDatabasePortal ()
+{
+}
+
+double
+TeDatabasePortal::getDouble (int i)
+{
+ char* val = getData(i);
+ return atof(val);
+}
+
+double
+TeDatabasePortal::getDouble (const string& s)
+{
+ char* val = getData(s);
+ return atof(val);
+}
+
+int
+TeDatabasePortal::getInt (int i)
+{
+ char* val = getData(i);
+ return atoi(val);
+}
+
+int
+TeDatabasePortal::getInt (const string& s)
+{
+ char* val = getData(s);
+ return atoi(val);
+}
+
+bool
+TeDatabasePortal::fetchGeometry (TeCell& cell)
+{
+ int index = atoi(getData("geom_id"));
+ string object_id = getData("object_id");
+ TeBox b (atof(getData("lower_x")),atof(getData("lower_y")),atof(getData("upper_x")),atof(getData("upper_y")));
+ cell.geomId(index);
+ cell.objectId(object_id);
+ cell.setBox (b);
+ cell.column(atoi(getData("col_number")));
+ cell.line(atoi(getData("row_number")));
+ return (fetchRow());
+}
+
+TeAttribute TeDatabasePortal::getAttribute (int i)
+{
+ TeAttributeList::iterator it = attList_.begin();
+ int j = 0;
+ while ( it != attList_.end() )
+ {
+ if (i == j)
+ return (*it);
+ ++it;
+ j++;
+ }
+ return TeAttribute();
+}
+
+TeAttribute TeDatabasePortal::getAttribute (const string& s)
+{
+ TeAttributeList::iterator it = attList_.begin();
+ while ( it != attList_.end() )
+ {
+ if (TeConvertToUpperCase(s) == TeConvertToUpperCase((*it).rep_.name_))
+ return (*it);
+ ++it;
+ }
+ return TeAttribute();
+}
+
+int
+TeDatabasePortal::getColumnIndex (const string& s)
+{
+ TeAttributeList::iterator it = attList_.begin();
+ int j = 0;
+ while ( it != attList_.end() )
+ {
+ if (TeConvertToUpperCase(s) == TeConvertToUpperCase((*it).rep_.name_))
+ return j;
+ ++it;
+ j++;
+ }
+ return -1;
+}
+
+string
+TeDatabasePortal::getColumnName (int i)
+{
+ TeAttributeList::iterator it = attList_.begin();
+ int j=0;
+ while ( it != attList_.end() )
+ {
+ if (j==i)
+ return (*it).rep_.name_;
+ ++it;
+ j++;
+ }
+ return "";
+}
+
+
+TeViewTree*
+TeDatabasePortal::getViewTree ()
+{
+ TeViewTree *tree = new TeViewTree();
+ tree->id (atoi(getData("theme_id")));
+ tree->name (getData("name"));
+ tree->priority(atoi(getData("priority")));
+ return tree;
+}
+
+TeLegendEntry
+TeDatabasePortal::getLegend ()
+{
+ TeLegendEntry leg;
+ leg.id (atoi(getData("legend_id")));
+ leg.theme (atoi(getData("theme_id")));
+ leg.group (atoi(getData("group_id")));
+
+ string data;
+ data = getData("num_objs");
+ leg.count(atoi(data.c_str()));
+ data = getData("lower_value");
+ leg.from(data);
+ data = getData("upper_value");
+ leg.to(data);
+ data = getData("label");
+ leg.label(data);
+ return leg;
+}
+
+TeVisual
+TeDatabasePortal::getVisual()
+{
+ TeVisual vis;
+ TeGeomRep rep = (TeGeomRep)atoi (getData("geom_type"));
+
+ TeColor cor(atoi(getData("red")),atoi(getData("green")),atoi(getData("blue")));
+ vis.color(cor);
+ vis.libName (string(getData("lib_name")));
+ vis.transparency(atoi(getData("transparency")));
+
+ TeColor ccor(atoi(getData("contour_red")),atoi(getData("contour_green")),atoi(getData("contour_blue")));
+ vis.contourColor(ccor);
+ vis.contourLibName(string(getData("contour_lib_name")));
+ vis.contourWidth(atoi(getData("contour_width")));
+ vis.contourTransparency(atoi(getData("contour_transp")));
+
+ if(rep == TePOLYGONS || rep == TeCELLS)
+ {
+ vis.contourWidth(atoi(getData("width")));
+ vis.contourStyle(atoi(getData("contour_symb_id")));
+ vis.style(atoi(getData("symb_id")));
+ }
+ else if(rep == TeLINES)
+ {
+ vis.width(atoi(getData("width")));
+ vis.style(atoi(getData("symb_id")));
+ }
+ else if(rep == TePOINTS)
+ {
+ vis.size(atoi(getData("size_value")));
+ vis.style(atoi(getData("symb_id")));
+ }
+ else if(rep == TeTEXT)
+ vis.size(atoi(getData("size_value")));
+
+ vis.family(getData("family"));
+ vis.bold (getBool("bold"));
+ vis.italic (getBool("italic"));
+ vis.fixedSize (getBool("fixed_size"));
+
+ vis.alignmentVert(getDouble("alignment_vert"));
+ vis.alignmentHoriz(getDouble("alignment_horiz"));
+
+ vis.tabSize(atoi(getData("tab_size")));
+ vis.lineSpace(atoi(getData("line_space")));
+ return vis;
+}
+
+bool
+TeDatabasePortal::fetchGeometry (TeText& t)
+{
+ TeCoord2D c(getDouble("x"), getDouble("y"));
+ string txt = getData ("text_value");
+ TeText t2(c,txt);
+ t2.geomId(atoi(getData("geom_id")));
+ t2.objectId(string(getData("object_id")));
+ t2.setAngle (getDouble("angle"));
+ t2.setHeight (getDouble("height"));
+ t2.setAlignmentVert(getDouble("alignment_vert"));
+ t2.setAlignmentHoriz(getDouble("alignment_horiz"));
+ t = t2;
+ return (fetchRow());
+}
+
+TeColor
+TeDatabasePortal::getColor ()
+{
+ TeColor c(atoi(getData("red")), atoi(getData("green")), atoi(getData("blue")));
+ return c;
+}
+
+bool
+TeDatabasePortal::fetchGeometry (TeArc& arc)
+{
+ arc.fromId(atoi(getData(2)));
+ arc.toId(atoi(getData(3)));
+ arc.geomId(atol(getData(0)));
+ arc.objectId(string(getData(1)));
+ return fetchRow();
+}
+
+
+
+// End TeDatabasePortal Methods
+
diff --git a/src/terralib/kernel/TeDatabase.h b/src/terralib/kernel/TeDatabase.h
new file mode 100644
index 0000000..bfdddfe
--- /dev/null
+++ b/src/terralib/kernel/TeDatabase.h
@@ -0,0 +1,1438 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeDatabase.h
+ This file contains structures and definitions about database support in TerraLib
+*/
+#ifndef __TERRALIB_INTERNAL_DATABASE_H
+#define __TERRALIB_INTERNAL_DATABASE_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeDefines.h"
+#include "TeDataTypes.h"
+#include "TeTable.h"
+#include "TeGeometry.h"
+#include "TeLayer.h"
+#include "TeView.h"
+#include "TeTheme.h"
+#include "TeRasterParams.h"
+#include "TeTimeInterval.h"
+#include "TeStatistics.h"
+
+#include <set>
+using namespace std;
+
+
+/*! \enum TeCursorLocation
+ Location of a cursor on record set
+ */
+enum TeCursorLocation { TeCLIENTESIDE, TeSERVERSIDE };
+
+/*! \enum TeCursorType
+ Type of cursor on record set
+ */
+enum TeCursorType { TeUNIDIRECTIONAL, TeBIDIRECTIONAL, TeRANDOMACCESS };
+
+/*! \enum TeCursorEditType
+ Type of edition on record set cursor
+ */
+enum TeCursorEditType { TeREADONLY, TeREADWRITE };
+
+/*! \enum TeCursorDataType
+ Type of edition on record set cursor
+ */
+enum TeCursorDataType { TeBINARYCURSOR, TeTEXTCURSOR };
+
+
+/*! \enum TeSpatialIndexType
+ Type of spatial index
+ */
+enum TeSpatialIndexType {TeRTREE, TeQUADTREE};
+
+//! A vector of objects identifications (object_id)
+typedef vector<string> Keys;
+
+//! A Map of objects identifications (object_id) to a distance value
+typedef map<string, double> KeysToDist;
+
+//! A Vector of pointers to TeGeometry
+typedef vector<TeGeometry*> TeGeometryVect;
+
+//! A Map of the objects identifications to a set of statistical values
+typedef map<string, TeStatisticsDimensionVect> TeObjectStatistics;
+
+
+class TeDatabasePortal;
+
+
+//! An abstract database class
+/*!
+ Instances of this classes represent connections
+ to a database server. It includes the host name,
+ user name and password parameters of the connection.
+ It should be implemented by the drivers to specific
+ database servers as: MySQL, Ado, PostgreSQL or any
+ other server to be used in TerraLib applications.
+ When possible, default implementations using ANSI SQL
+ are provided.
+ Methods that rely on special features of the derived
+ driver are left as purely virtual.
+
+ \sa
+ TeTheme, TeView, TeLayer, TeAttribute
+*/
+class TeDatabase
+{
+public:
+ //! Empty constructor
+ TeDatabase();
+
+ //! Destructor
+ virtual ~TeDatabase();
+
+ //! Operator ==
+ bool operator== (const TeDatabase& other) const
+ {
+ if (dbmsName_ != other.dbmsName_ ||
+ database_ != other.database_ ||
+ host_ != other.host_ ||
+ user_ != other.user_ )
+ return false;
+ return true;
+ }
+ /** @name Members
+ * Methods to access class private members
+ */
+ //@{
+ //! Returns the error message from the server
+ virtual string errorMessage ()
+ { return errorMessage_; }
+
+ //! Returns the error number from the server
+ virtual int errorNum ()
+ { return errorNumber_; }
+
+ //! Return the user name of the connection opened
+ string user ()
+ { return user_; }
+
+ //! Set the current user name to view
+ void user(string value) { user_=value;}
+
+ //! Returns the host name of the connection opened
+ string host ()
+ { return host_; }
+
+ //! Returns the user's password of the connection opened
+ string password ()
+ { return password_; }
+
+ //! Returns the database name of the connection opened
+ string databaseName ()
+ { return database_; }
+
+ //! Returns the Database Management System name
+ string dbmsName ()
+ { return dbmsName_; }
+
+ //! Returns the port number of the connection opened
+ int portNumber ()
+ { return portNumber_; }
+
+ //! Returns the map of layers in the database
+ TeLayerMap& layerMap ()
+ { return layerMap_; }
+
+ //! Returns the map of views in the database
+ TeViewMap& viewMap ()
+ { return viewMap_; }
+
+ //! Returns the map of themes in the database
+ TeThemeMap& themeMap ()
+ { return themeMap_; }
+
+ //! Returns the map of legends in the database
+ TeLegendEntryMap& legendMap ()
+ { return legendMap_; }
+
+ //! Returns the set of relations between tables
+ multiset<int>& relationMSet ()
+ { return relationMSet_; }
+
+ //! Clears structures in memory (legendMap, layerMap, viewMap...) used to optimize database access
+ virtual void clear();
+
+ //@}
+
+ /** @name Database
+ * Methods related to database and connection creation.
+ * These methods return TRUE when the operation was successfull.
+ * Otherwise return FALSE and when possible an error message is captured.
+ */
+ //@{
+ //! Creates a new database and open a connection to it
+ virtual bool newDatabase(const string& database, const string& user, const string& password, const string& host, const int &port=0, bool terralibModel=true) = 0;
+
+ //! Opens a connection to a database server passing all parameters needed
+ virtual bool connect (const string& host, const string& user, const string& password, const string& database, int port = 0) = 0;
+
+ //! Show the server databases (only for MySQL, Oracle and PostgreSQL)
+ virtual bool showDatabases (const string& /* host */, const string& /* user */, const string& /* password */, vector<string>& /* dbNames */ , int /* port */ = 0)
+ { return true; }
+
+ //! Opens a connection without parameters. When possible, should be implemented by the derived classes
+ virtual bool connect (const string& = "") { return false; };
+
+ //! Check if there is an opened connection
+ bool isConnected ()
+ { return isConnected_; }
+
+ //! Closes the connection
+ virtual void close() = 0;
+ //@}
+
+ /** @name Tables
+ Methods related to table manipulation.
+ \note refer to data model documentation in order to understand the meanning of
+ each tables and its fields
+ */
+ //@{
+
+ //! Returns a list of tables in a database
+ virtual bool listTables(vector<string>& /* tableList */) { return false; }
+
+ //! Verifies if a table exist in the database
+ virtual bool tableExist(const string& table) = 0;
+
+ //! Verifies if a table has a column
+ virtual bool columnExist(const string& table, const string& column, TeAttribute& attr) = 0;
+
+ //! Update a column
+ virtual bool allowEmptyString(const string& /* tableName */, const string& /* column */) { return false; }
+
+ //! Verifies and modifies the column names of the table. It returns if the table was modified
+ virtual bool validTable (TeTable& table);
+
+ //! Return the name of an attribute table given its identifier
+ string getTableName(int tableId);
+
+ //! Creates a table
+ /*!
+ \param table table name
+ \param attr table list of attributes
+ */
+ virtual bool createTable(const string& table, TeAttributeList &attr);
+
+ //! Deletes a table. Do not allow the deletion of model tables
+ virtual bool deleteTable (const string& table);
+
+ //! Adds a column to a table
+ /*!
+ \param table table name
+ \param rep representation of the column being created
+ */
+ virtual bool addColumn (const string& table, TeAttributeRep &rep) = 0;
+
+ //! Deletes a column to a table
+ /*!
+ \param table table name
+ \param colName name of the column being deleted
+ */
+ virtual bool deleteColumn (const string& table, const string& colName);
+
+ //! Creates a reationship between two tables
+ /*!
+ \param relName relationship name
+ \param table table that will receive the foreign key
+ \param fieldName column that will be foreign key
+ \param relatedTable table that exports the foreign key
+ \param relatedField field that will the exported foreign key
+ \param cascadeDeletion flag that indicates if the deletion should be propagated
+ */
+ virtual bool createRelation (const string& relName, const string& table, const string& fieldName,
+ const string& relatedTable, const string& relatedField, bool cascadeDeletion) = 0;
+
+ //! Checks if a relation exist
+ /*!
+ \param tableName table where the relashionship exists
+ \param relName relationship name
+ */
+ virtual TeDBRelationType existRelation(const string& tableName, const string& relName) = 0;
+ //@}
+
+ /** @name Query
+ * Methods related to query the database
+ */
+ //@{
+ //! Executes a SQL command that doesn�t return a record set. Tipically a data definition comand
+ virtual bool execute ( const string &sql) = 0;
+
+ //! Returns a database portal.
+ /*!
+ A database portal is used to submit queries to the database and to navigate over the
+ resulting record set
+ */
+ virtual TeDatabasePortal* getPortal () = 0;
+
+ //! Get the values that satisfy the query
+ virtual bool inClauseValues(const string& query , const string& attribute, vector<string>& inClauseVector);
+
+ //@}
+
+ /** @name Data Model
+ Methods that create the database model suggested in TerraLib.
+ Classes in TerraLib materialize the DataModel suggested.
+ */
+ //@{
+ //! Creates the entire TerraLib conceptual model.
+ /*
+ \param withIntegrity flag that indicates that the referencial integrity should be implemented.
+ \param createIndex flag that indicate that the indexes should be created
+ */
+ virtual bool createConceptualModel(bool withIntegrity = true, bool newDatabase = true, bool createIndex = true);
+
+ //! Creates the referencial integrity of the conceptual model
+ virtual bool defineIntegrity(void);
+
+ //! Create the indexes for the tables in the conceptual model
+ virtual bool createIndex(const string& tableName, const string& indexName, const string& columnsName);
+
+ //! Creates a table to store version database information
+ virtual bool createDatabaseTable();
+
+ //! Creates a table to store Projection information
+ virtual bool createProjectionTable ();
+
+ //! Creates a table to store Layers information
+ virtual bool createLayerTable ();
+
+ //! Creates a table to store Representations information
+ virtual bool createRepresentationTable ();
+
+ //! Creates a table to store Views information
+ virtual bool createViewTable ();
+
+ //! Creates a table to store Themes information
+ virtual bool createThemeTable ();
+
+ //! Creates a table to store the groupings associated with a theme
+ virtual bool createGroupingTable();
+
+ //! Creates a table to store information about the attribute tables used by a theme
+ virtual bool createThemeTablesTable();
+
+ //! Creates a table to store legends
+ virtual bool createLegendTable ();
+
+ //! Creates a table to store visual definitions
+ virtual bool createVisualTable();
+
+ //! Creates a table to store raster visual definitions
+ virtual bool createVisualRasterTable();
+
+ //! Creates a table to store information about the non-spatial tables associated to this layer
+ virtual bool createLayerTableTable();
+
+ //! Creates a table to store information about the external tables related to non-spatial tables of layers
+ virtual bool createTablesRelationTable();
+
+ //@}
+
+ /** @name Geometries
+ Methods that create tables that store the spatial data
+ */
+ //@{
+
+ //! Creates a table for a polygon geometries
+ virtual bool createPolygonGeometry (const string& tableName) = 0;
+
+ //! Creates a table for line geometries
+ virtual bool createLineGeometry (const string& tableName) = 0;
+
+ //! Creates a table for point geometries
+ virtual bool createPointGeometry (const string& tableName);
+
+ //! Creates a table for cell geometries
+ virtual bool createCellGeometry (const string& tableName);
+
+ //! Creates a table for a text geometries
+ virtual bool createTextGeometry (const string& tableName);
+
+ //! Creates a table for a arc geometries
+ virtual bool createArcGeometry (const string& tableName);
+
+ //! Creates a table for a node geometries
+ virtual bool createNodeGeometry (const string& tableName);
+
+ //! Creates a table to store raster representations of objects
+ virtual bool createRasterGeometry(const string& tableName);
+
+ //! Creates a table to store information about raster representation
+ virtual bool createRasterMetadataTable(const string& tableName);
+
+ //! Creates a table for raster geometries
+ virtual bool createRasterTable (const string& tableName) = 0;
+
+ //! Creates a table to store information about objects in a theme
+ virtual bool createCollectionTable(const string& tableName);
+ //@}
+
+ /** @name Non-spatial tables
+ * Retrieving/Inserting/Modifying generic tables in the database.
+ */
+ //@{
+ //! Retrieves information about some tables
+ /*
+ \param atts returning vector of tables information
+ \param attType type of the tables that are being looked for (optional)
+ \return TRUE if any table was found and FALSE otherwise
+ */
+ virtual bool getAttrTables(TeAttrTableVector& atts, TeAttrTableType attType = TeAllAttrTypes);
+
+ //! Inserts information about a link to an external table
+ /*
+ \param tableId table identification (from te_layer_table)
+ \param tField link column name of the static table
+ \param eTable name of the external table
+ \param eField name of the link column of the related table
+ \param relId returns the identification of the relation
+ */
+ virtual bool insertRelationInfo(const int tableId, const string& tField,
+ const string& rTable, const string& rField, int& relId) = 0;
+
+ //! Inserts information about an attribute table
+ virtual bool insertTableInfo (int layerId, TeTable &table, const string& user="") = 0;
+
+ //! Updates information about an attribute table
+ virtual bool updateTableInfo (int layerId, TeTable &table, const string user="");
+
+ //! Retrieves the metainformation about an attribute table
+ virtual bool loadTableInfo(TeTable& table);
+
+ //! Saves a table and its contents in the database
+ virtual bool insertTable(TeTable &table);
+
+ //! Alter a property of a table
+ virtual bool alterTable(const string& tableName, TeAttributeRep& rep, const string& oldColName="");
+
+ //! Saves a large binary objects (BLOB) in a row table
+ virtual bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size) = 0;
+
+ //! Saves a large binary objects (BLOB) in a row table
+ virtual bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName) = 0;
+
+ //! Updates a table and its contents in the database
+ virtual bool updateTable (TeTable &table);
+
+ //! Retrieves a table and its contents from the database
+ virtual bool loadTable (const string& tableName, TeTable &table);
+
+ //! Retrieves a table (or part of it) accordingly to a criteria written in SQL
+ virtual bool selectTable (const string& tableName, const string& criteria, TeTable &table);
+
+ //! Deletes all tables, of a particular type, associated to a layer
+ virtual bool deleteLayerTable (int layerId, TeAttrTableType ttype = TeAttrStatic);
+ //@}
+
+ /** @name Projection
+ * Accessing/Inserting/Modifying projection information into the database.
+ */
+ //@{
+
+ //! Insert information about a geographical projection
+ virtual bool insertProjection (TeProjection *proj) = 0;
+
+ //! Updates information about a geographical projection
+ virtual bool updateProjection (TeProjection *proj);
+
+ //! Retrieves information about a geographical projection identified by its database id
+ virtual TeProjection* loadProjection (int id);
+ //@}
+
+ /** @name Layers
+ * Retrieving/Inserting/Modifying/Deleting layers in the database.
+ */
+ //@{
+ //! Insert information about a layer
+ virtual bool insertLayer (TeLayer *layer) = 0;
+
+ //! Update information about a layer
+ virtual bool updateLayer (TeLayer *layer);
+
+ //! Load information about all layers stored in the database
+ virtual bool loadLayerSet ();
+
+ //! Load information about a particular layer
+ virtual bool loadLayer (TeLayer* layer);
+
+ //! Load layer tables
+ virtual bool loadLayerTable (TeLayer* layer);
+
+ //! Delete a particular layer passing its id
+ virtual bool deleteLayer (int layerId);
+
+ //! Check if a particular layer exists (passing its id)
+ virtual bool layerExist (int id);
+
+ //! Check if a particular layer exists (passing its name)
+ virtual bool layerExist (string layerName);
+ //@}
+
+ /** @name Representation
+ * Retrieving/Inserting/Modifying/Deleting representations in the database.
+ */
+ //@{
+ //! Inserts information about a geometrical representation
+ virtual bool insertRepresentation (int layerId, TeRepresentation& rep) = 0;
+
+ //! Updates information about a geometrical representation
+ virtual bool updateRepresentation (int layerId, TeRepresentation& rep);
+ //@}
+
+ /** @name Raster Tables
+ * Retrieving/Inserting/Modifying/Deleting raster representations in the database.
+ */
+ //@{
+ //! Inserts information about a raster geometry associated to an object
+ /*!
+ \param tableName name of the table that stores the raster representation
+ \param par raster parameters
+ \param objectId identification of the object associated to the raster geometry
+ */
+ virtual bool insertRasterGeometry(const string& tableName, TeRasterParams& par, const string& objectId = "");
+
+ //! Updates the information about the raster geometry associated to an object of a layer
+ /*!
+ \param layerId layer unique database identification
+ \param par raster parameters
+ \param objectId identification of the object associated to the raster geometry
+ */
+ virtual bool updateRasterRepresentation(int layerId, TeRasterParams& par, const string& objectId="");
+
+ //! Returns the name of the table where the raster geometry associated to an object of a leyr
+ /*!
+ \param layerId layer unique database identification
+ \param objectId identification of the object associated to the raster geometry
+ */
+ virtual string getRasterTable(int layerId, const string& objectId);
+
+ //! Inserts metadata information about a particular raster geometry
+ /*!
+ \param tableName name of the table that stores the metadata
+ \param geomId geometry unique database identification
+ \param par raster parameters
+ */
+ virtual bool insertRasterMetadata (const string& tableName, int geomId, TeRasterParams& par);
+ //! Updates metadata information about a particular raster geometry
+ /*!
+ \param tableName name of the table that stores the metadata
+ \param geomId geometry unique database identification
+ \param par raster parameters
+
+ */
+ virtual bool updateRasterMetadata (const string& tableName, int geomId, TeRasterParams& par);
+ //@}
+ /** @name Views
+ * Retrieving/Inserting/Modifying/Deleting views in the database.
+ */
+ //@{
+ //! Inserts a view
+ virtual bool insertView (TeView *view) = 0;
+
+ //! Updates a view
+ virtual bool updateView (TeView *view);
+
+ //! Loads a set of views belonging to a user
+ virtual bool loadViewSet (const string& user);
+
+ //! Load a view
+ virtual bool loadView (TeView* view);
+
+ //! Delete a view
+ virtual bool deleteView (int viewId);
+
+ //! Recursive inserting of a view tree.
+ virtual bool insertViewTree (TeViewTree *tree) = 0;
+
+ //! Recursive load view tree.
+ virtual TeViewTree* loadViewTree(TeView* view, int id);
+
+ //! Recusive updating of a view tree.
+ virtual bool updateViewTree (TeViewTree *tree);
+
+ //! Check whether a given view already exists in the database
+ virtual bool viewExist(string viewName);
+
+ //@}
+
+ /** @name Themes
+ * Retrieving/Inserting/Modifying/Deleting themes and group of themes in the database.
+ */
+ //@{
+ virtual bool insertThemeGroup (TeViewTree* tree) = 0;
+ virtual bool insertTheme (TeTheme *theme) = 0;
+ virtual bool updateTheme (TeTheme *theme);
+ virtual bool loadTheme (TeTheme *theme);
+ virtual bool loadThemeTable (TeTheme* theme);
+ virtual bool deleteThemeGroup (int themeId);
+ virtual bool deleteTheme (int themeId);
+ virtual bool deleteLegend (int themeId);
+
+ //! Inserts information about a table used by a theme
+ bool insertThemeTable(TeTheme *theme, TeTable& inputTable);
+
+ //! Inserts information about a table used by a theme
+ virtual bool insertThemeTable (int themeId, int tableId, int relationId, int tableOrder) = 0;
+
+ //! Updates information about the tables used by a theme
+ virtual bool updateThemeTable (TeTheme *theme);
+
+ //! Removes a table from the theme
+ bool removeThemeTable(TeTheme *theme, int tableOrder);
+
+ //! Inserts information about a grouping used in a theme
+ virtual bool insertGrouping (int themeId, TeGrouping* grouping);
+
+ //! Updates information about a grouping used in a theme
+ virtual bool updateGrouping (int themeId, TeGrouping* grouping);
+
+ //! Generates the label position (x,y) to each object of a theme
+ virtual bool generateLabelPositions(TeTheme *theme);
+
+ //! Check whether a given theme already exists in the database
+ virtual bool themeExist(string themeName);
+
+ //@}
+
+ /** @name Legend
+ * Retrieving/Inserting/Modifying/Deleting legends in the database.
+ */
+ //@{
+ virtual bool insertLegend (TeLegendEntry *legend) = 0;
+ virtual bool updateLegend (TeLegendEntry *legend);
+ virtual bool loadLegend (TeTheme *theme);
+ virtual bool updateVisual (TeLegendEntry *legend);
+ //@}
+
+ /** @name Polygon
+ // Accessing/Inserting/Modifying polygon geometries into the database
+ */
+ //@{
+ //! Inserts a polygon set in a geometry table
+ virtual bool insertPolygonSet (const string& table, TePolygonSet &ps);
+
+ //! Updates a polygon set in a geometry table
+ virtual bool updatePolygonSet (const string& table, TePolygonSet &ps);
+
+ //! Returns all polygons in a table given a criteria expressed as an SQL where statement
+ virtual bool selectPolygonSet (const string& table, const string& criteria, TePolygonSet &ps);
+
+ //! Returns all polygons that represents objects of a particular theme
+ virtual bool loadPolygonSet (TeTheme* theme, TePolygonSet &ps);
+
+ //! Returns all polygons that represents objects of a particular geoid
+ virtual bool loadPolygonSet (const string& table, const string& geoid, TePolygonSet &ps);
+
+ //! Returns all polygons inside a given box
+ virtual bool loadPolygonSet (const string& table, TeBox &box, TePolygonSet &ps);
+
+ //! Returns a database portal to iterate over the polygons that are inside a given box
+ /*
+ \return A database portal pointer if there is any polygons inside the box
+ \return A null pointer if there isn't polygons to iterate
+ \note The database portal pointer should be deleted by the application
+ */
+ virtual TeDatabasePortal* loadPolygonSet(const string& table, TeBox &box);
+
+ //! Returns the first polygon that contais a given coordinate
+ virtual bool locatePolygon (const string& table, TeCoord2D &pt, TePolygon &polygon, const double& tol = 0.0);
+
+ //! Returns the polygons that contains a give coordinate
+ virtual bool locatePolygonSet (const string& table, TeCoord2D &pt, double tol, TePolygonSet &polygons);
+
+ //! Inserts a polygon in a geometry table
+ virtual bool insertPolygon (const string& table, TePolygon &p) = 0;
+
+ //! Updates a polygon in a geometry table
+ virtual bool updatePolygon (const string& table, TePolygon &p) = 0;
+ //@}
+
+ /** @name Line
+ * Accessing/Inserting/Modifying Line geometries into the database.
+ */
+ //@{
+ // Accessing/Inserting line geometries into the database
+ virtual bool insertLineSet (const string& table, TeLineSet &ls);
+ virtual bool updateLineSet (const string& table,TeLineSet &ls);
+ virtual bool loadLineSet (const string& table, const string& geoid, TeLineSet &ls);
+ virtual bool loadLineSet (TeTheme* theme, TeLineSet &ls);
+ virtual bool loadLineSet (const string& table, TeBox &box, TeLineSet &linSet);
+ virtual TeDatabasePortal* loadLineSet (const string& table, TeBox &box);
+ virtual bool selectLineSet (const string& table, const string& criteria, TeLineSet &ls);
+
+ virtual bool insertLine (const string& table, TeLine2D &l) = 0;
+ virtual bool updateLine (const string& table, TeLine2D &l) = 0;
+ virtual bool locateLine (const string& table, TeCoord2D &pt, TeLine2D &line, const double& tol = 0.0);
+ virtual bool locateLineSet (const string& table, TeCoord2D &pt, TeLineSet & ls, const double& tol = 0.0);
+
+ //@}
+
+ /** @name Point
+ * Accessing/Inserting/Modifying Point geometries into the database.
+ */
+ //@{
+ // Accessing/Inserting point geometries into the database
+ virtual bool insertPointSet (const string& table, TePointSet &ps);
+ virtual bool updatePointSet (const string& table, TePointSet &ps);
+ virtual bool loadPointSet (const string& table, TeBox &box, TePointSet &ps);
+ virtual TeDatabasePortal* loadPointSet (const string& table, TeBox &box);
+ virtual bool loadPointSet (const string& table, const string& geoid, TePointSet &ps);
+ virtual bool loadPointSet (TeTheme* theme, TePointSet &ps);
+ virtual bool selectPointSet (const string& table, const string& criteria, TePointSet &ps);
+
+ virtual bool insertPoint (const string& table, TePoint &p) = 0;
+ virtual bool updatePoint (const string& table, TePoint &p);
+ virtual bool locatePoint (const string& table, TeCoord2D &pt, TePoint &point, const double& tol = 0.0);
+ virtual bool locatePointSet (const string& table, TeCoord2D &pt, TePointSet &pointSet, const double& tol=0.0);
+ //@}
+
+ /** @name Text
+ * Accessing/Inserting/Modifying Text geometries into the database.
+ */
+ //@{
+ // Accessing/Inserting text geometries into the database
+ virtual bool insertTextSet (const string& table, TeTextSet &ts);
+ virtual bool updateTextSet (const string& table, TeTextSet &ts);
+ virtual bool loadTextSet (const string& table, const string& geoid, TeTextSet &ts);
+ virtual bool selectTextSet (const string& table, const string& criteria, TeTextSet &ts);
+
+ virtual bool insertText (const string& table, TeText &t) = 0;
+ virtual bool updateText (const string& table, TeText &t);
+ virtual bool locateText (const string& table, TeCoord2D &pt, TeText &text, const double& tol = 0.0);
+ virtual bool locateTextSet (const string& table, TeCoord2D &pt, TeTextSet &textSet, const double& tol = 0.0);
+ //@}
+
+ /** @name Arc
+ * Accessing/Inserting/Modifying Arc geometries into the database.
+ */
+ //@{
+ // Accessing/Inserting arc geometries into the database
+ virtual bool insertArcSet (const string& table, TeArcSet &as);
+ virtual bool updateArcSet (const string& table, TeArcSet &as);
+ virtual bool loadArcSet (const string& table, const string& geoid, TeArcSet &as);
+
+ virtual bool insertArc (const string& table,TeArc &arc) = 0;
+ virtual bool updateArc (const string& table,TeArc &arc);
+ //@}
+
+ /** @name Node
+ * Accessing/Inserting/Modifying Node geometries into the database.
+ */
+ //@{
+ // Accessing/Inserting node geometries into the database
+ virtual bool insertNodeSet (const string& table, TeNodeSet &ns);
+ virtual bool updateNodeSet (const string& table, TeNodeSet &ns);
+ virtual bool loadNodeSet (const string& table, const string& geoid, TeNodeSet &ps);
+
+ virtual bool insertNode (const string& table, TeNode &node) = 0;
+ virtual bool updateNode (const string& table, TeNode &node);
+ //@}
+
+ /** @name Cell
+ * Accessing/Inserting/Modifying Cell geometries into the database.
+ */
+ //@{
+ // Accessing/Inserting cell geometries into the database
+ virtual bool insertCellSet (const string& table, TeCellSet &cs);
+ virtual bool updateCellSet (const string& table, TeCellSet &cs);
+ virtual bool loadCellSet (const int& layerId, const string& table, const string& geoid, TeCellSet &cs);
+ virtual bool selectCellSet (const int& layerId, const string& table, const string& criteria, TeCellSet &cs);
+
+ virtual bool insertCell (const string& table, TeCell &c) = 0;
+ virtual bool updateCell (const string& table, TeCell &c);
+ virtual bool locateCell (const string& table, TeCoord2D &pt, TeCell &c, const double& tol = 0.0);
+ //@}
+
+ //! Insert a raster block into the database
+ /*!
+ \param table table name
+ \param blockId block unique identifier
+ \param ll block lower left coordinate
+ \param ur block upper right coordinate
+ \param buf block binary data
+ \param size block size
+ \param band block band
+ \param res block resolution factor
+ \param subband sub band definitiion
+ */
+ virtual bool insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, unsigned char *buf,unsigned long size, int band=0, unsigned int res=1, unsigned int subband=0) = 0;
+
+ //! Inserts all visual
+ virtual bool insertVisual (TeLegendEntry *legend);
+
+ //! Insert raster visual
+ virtual bool insertRasterVisual (int themeId , TeRasterVisual* rasterVisual);
+
+ //! Returns the raster associated to a layer
+ virtual TeRaster* loadLayerRaster(int layerId, const string& objectId="", const char& mode = 'r');
+
+ //! Creates a lookup table (used for pallete raster representations)
+ virtual bool createLUTTable(const string& name);
+
+ //! Loads a look up table associated to a raster and fills its parameters
+ virtual bool loadRasterLUT(TeRasterParams* par);
+
+ //! Creates a spatial index for a spatial table. It is implemented only in spatial databases.
+ virtual bool createSpatialIndex(const string& /* table */, const string& /* column */, TeSpatialIndexType = TeRTREE,short /* level */ =0,short /* tile */ =0) { return true; };
+
+ //! Creates a spatial metadata for a spatial table. It is implemented only in spatial databases.
+ virtual bool insertMetadata(const string& /* table */, const string& /* column */, double /* tolx */, double /* toly */,TeBox &/* box */,short /* srid */ =0) { return true; };
+
+ /** @name Spatial Operations with vector data
+ * spatial operations over geometries into the database.
+ */
+ //@{
+
+ /** @name topologic relation query
+ * topologic relation query over geometries into the database.
+ */
+ //@{
+ /*!
+ \brief Returns the geometries of a geometric table (actGeomTable) that have a specific spatial relation (relate) with a subset of geometries of this table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the geometric table
+ \param actIdsIn identifiers of a geometry subset of the actGeomTable table
+ \param portal a pointer to a database portal that will contain the resulted geometries
+ \param relate spatial relation
+ \param actCollTable collection table name
+ */
+ virtual bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn,
+ TeDatabasePortal *portal, int relate, const string& actCollTable="");
+
+ /*!
+ \brief Returns the geometries of a geometric table (visGeomTable) that have a specific spatial relation (relate) with a subset of geometries of other geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param actIdsIn identifiers of a geometry subset of the actGeomTable table
+ \param visGeomTable geometric table name
+ \param visRep geometric representation of the visGeomTable table
+ \param portal a pointer to a database portal that will contain the resulted geometries
+ \param relate spatial relation
+ \param visCollTable collection table name associated with the visGeomTable table
+ */
+ virtual bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn,
+ const string& visGeomTable, TeGeomRep visRep, TeDatabasePortal *portal,
+ int relate, const string& visCollTable="");
+
+ /*!
+ \brief Returns the geometries of a geometric table (actGeomTable) that have a specific spatial relation (relate) with a geometry in memory (geom)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param geom a pointer to a geometry in memory
+ \param portal a pointer to a database portal that will contain the resulted geometries
+ \param relate spatial relation
+ \param actCollTable collection table name associated with the actGeomTable table
+ */
+ virtual bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom,
+ TeDatabasePortal *portal, int relate, const string& actCollTable="");
+
+ /*!
+ \brief Returns the geometries of a geometric table (actGeomTable) that have a specific spatial relation (relate) with a subset of geometries of this table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the geometric table
+ \param actIdsIn identifiers of a geometry subset of the actGeomTable table
+ \param actIdsOut structure that will contain the identifiers of the resulted geometries
+ \param relate spatial relation
+ \param actCollTable collection table name
+ */
+ virtual bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn,
+ Keys& actIdsOut, int relate, const string& actCollTable="");
+
+ /*!
+ \brief Returns the geometries of a geometric table (visGeomTable) that have a specific spatial relation (relate) with a subset of geometries of other geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param actIdsIn identifiers of a geometry subset of the actGeomTable table
+ \param visGeomTable geometric table name
+ \param visRep geometric representation of the visGeomTable table
+ \param visIdsOut structure that will contain the identifiers of the resulted geometries
+ \param relate spatial relation
+ \param visCollTable collection table name associated with the visGeomTable table
+ */
+ virtual bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn,
+ const string& visGeomTable, TeGeomRep visRep, Keys& visIdsOut, int relate,
+ const string& visCollTable="");
+
+ /*!
+ \brief Returns the geometries of a geometric table (actGeomTable) that have a specific spatial relation (relate) with a geometry in memory (geom)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param geom a pointer to a geometry in memory
+ \param actIdsOut structure that will contain the identifiers of the resulted geometries
+ \param relate spatial relation
+ \param actCollTable collection table name associated with the actGeomTable table
+ */
+ virtual bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom,
+ Keys& actIdsOut, int relate, const string& actCollTable="");
+ //@}
+
+ /** @name metric functions
+ * metric functions over geometries into the database.
+ */
+ //@{
+ /*!
+ \brief Calculates the area of a geometry set of the geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the geometric table
+ \param actIdsIn identifiers of the geometry set of the actGeomTable table
+ \param area the returned area value
+ */
+ virtual bool calculateArea(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, double &area);
+
+ /*!
+ \brief Calculates the length of a geometry set of the actGeomTable table
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the geometric table
+ \param actIdsIn identifiers of the geometry set of the actGeomTable table
+ \param length the returned length value
+ */
+ virtual bool calculateLength(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, double &length);
+
+ /*!
+ \brief Calculates the distance between two geometries of the actGeomTable table
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the geometric table
+ \param Ids identifiers of the two geometries of the actGeomTable table
+ \param distance the returned distance value
+ */
+ virtual bool calculateDistance(const string& actGeomTable, TeGeomRep actRep, Keys& Ids, double& distance);
+
+ /*!
+ \brief Calculates the distance between a geometry of a geometric table (actGeomTable) and a geometry of other geometric table (visGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param objId1 identifier of the geometry of the actGeomTable table
+ \param visGeomTable geometric table name
+ \param visRep geometric representation of the visGeomTable table
+ \param objId2 identifier of the geometry of the visGeomTable table
+ \param distance the returned distance value
+ */
+ virtual bool calculateDistance(const string& actGeomTable, TeGeomRep actRep, const string& objId1,
+ const string& visGeomTable, TeGeomRep visRep, const string& objId2, double& distance);
+
+ /*!
+ \brief Returns the geometries of a geometric table (actGeomTable) that are within a specific distance from a point in memory
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param point a point in memory
+ \param IdsDistOut structure that will contain the identifiers of the resulted geometries and their distances
+ \param max_distance maximum distance
+ \param actCollTable collection table name associated with the actGeomTable table
+ */
+ virtual bool withinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& point,
+ KeysToDist& IdsDistOut, const double& max_distance, const string& actCollTable="");
+ //@}
+
+
+ /** @name metric functions
+ * functions that generate new geometries over geometries into the database.
+ */
+ //@{
+ /*!
+ \brief Returns the buffers with a specific distance of a geometry set of a geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the geometric table
+ \param actIds identifiers of the geometry set of the actGeomTable table
+ \param bufferSet the returned buffers
+ \param dist the distance of the buffers
+ */
+ virtual bool Buffer(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& bufferSet, double dist);
+
+ /*!
+ \brief Returns the centroids of a geometry set of a geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the geometric table
+ \param centroidSet the returned centroids
+ \param actIds identifiers of the geometry set of the actGeomTable table
+ \param actCollTable collection table name associated with the actGeomTable table
+ */
+ virtual bool Centroid(const string& actGeomTable, TeGeomRep actRep, TePointSet& centroidSet, Keys actIds = vector<string>(), const string& actCollTable = "");
+
+ /*!
+ \brief Returns the convex geometries of a geometries set of a geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the geometric table
+ \param actIds identifiers of the geometry set of the actGeomTable table
+ \param convexHullSet the returned convex geometries
+ */
+ virtual bool ConvexHull(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& convexHullSet);
+ //@}
+
+ /*!
+ \brief Returns the nearest neighbors of a specific geometry of a geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actCollTable collection table name associated with the actGeomTable table
+ \param actRep geometric representation of the geometric table
+ \param objId1 identifier of the geometry of the actGeomTable table
+ \param actIdsOut structure that will contain the identifiers of the nearest neighbors
+ \param numRes the number of nearest neighbors that will be returned
+ */
+ virtual bool nearestNeighbors(const string& actGeomTable, const string& actCollTable,
+ TeGeomRep actRep, const string& objId1, Keys& actIdsOut, int numRes=1);
+
+ /*!
+ \brief Returns the nearest neighbors of a geometric table (visGeomTable) of a specific geometry of other geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param objId1 identifier of the geometry of the actGeomTable table
+ \param visGeomTable geometric table name
+ \param visCollTable collection table name associated with the visGeomTable table
+ \param visRep geometric representation of the visGeomTable table
+ \param visIdsOut structure that will contain the identifiers of the nearest neighbors
+ \param numRes the number of nearest neighbors that will be returned
+ */
+ virtual bool nearestNeighbors(const string& actGeomTable, TeGeomRep actRep, const string& objId1,
+ const string& visGeomTable, const string& visCollTable,
+ TeGeomRep visRep, Keys& visIdsOut, int numRes=1);
+
+ /*!
+ \brief Returns the nearest neighbors of a specific geometry of a geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actCollTable collection table name associated with the actGeomTable table
+ \param actRep geometric representation of the geometric table
+ \param objId1 identifier of the geometry of the actGeomTable table
+ \param portal a pointer to a database portal that will contain the identifiers of the nearest neighbors
+ \param numRes the number of nearest neighbors that will be returned
+ */
+ virtual bool nearestNeighbors(const string& actGeomTable, const string& actCollTable,
+ TeGeomRep actRep, const string& objId1, TeDatabasePortal* portal, int numRes=1);
+
+ /*!
+ \brief Returns the nearest neighbors of a geometric table (visGeomTable) of a specific geometry of other geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param objId1 identifier of the geometry of the actGeomTable table
+ \param visGeomTable geometric table name
+ \param visCollTable collection table name associated with the visGeomTable table
+ \param visRep geometric representation of the visGeomTable table
+ \param portal a pointer to a database portal that will contain the identifiers of the nearest neighbors
+ \param numRes the number of nearest neighbors that will be returned
+ */
+ virtual bool nearestNeighbors(const string& actGeomTable, TeGeomRep actRep,
+ const string& objId1, const string& visGeomTable, const string& visCollTable,
+ TeGeomRep visRep, TeDatabasePortal* portal, int numRes=1);
+
+ /** @name metric functions
+ * functions of set: union, intersection, difference and symmetrical difference.
+ */
+ //@{
+
+ /*!
+ \brief Returns the intersection between two geometries of a geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param actIds identifiers of the geometry set of the actGeomTable table
+ \param geomVect the returned intersection
+ */
+ virtual bool geomIntersection(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect);
+
+ /*!
+ \brief Returns the intersection between a geometry of a geometric table (actGeomTable) and a geometry of other geometric table (visGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param objId1 identifier of a geometry of the actGeomTable table
+ \param visGeomTable geometric table name
+ \param visRep geometric representation of the visGeomTable table
+ \param objId2 identifier of other geometry of the visGeomTable table
+ \param geomVect the returned intersection
+ */
+ virtual bool geomIntersection(const string& actGeomTable, TeGeomRep actRep, const string& objId1,
+ const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+ /*!
+ \brief Returns the difference between two geometries of a geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param objId1 identifier of a geometry of the actGeomTable table
+ \param objId2 identifier of other geometry of the actGeomTable table
+ \param geomVect the returned difference
+ */
+ virtual bool geomDifference(const string& actGeomTable, TeGeomRep actRep, const string& objId1,
+ const string& objId2, TeGeometryVect& geomVect);
+
+ /*!
+ \brief Returns the difference between a geometry of a geometric table (actGeomTable) and a geometry of other geometric table (visGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param objId1 identifier of a geometry of the actGeomTable table
+ \param visGeomTable geometric table name
+ \param visRep geometric representation of the visGeomTable table
+ \param objId2 identifier of other geometry of the visGeomTable table
+ \param geomVect the returned difference
+ */
+ virtual bool geomDifference(const string& actGeomTable, TeGeomRep actRep, const string& objId1,
+ const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+ /*!
+ \brief Returns the union between geometries of a geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param actIds identifiers of the geometry set of the actGeomTable table
+ \param geomVect the returned union
+ */
+ virtual bool geomUnion(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect);
+
+ /*!
+ \brief Returns the union between a geometry of a geometric table (actGeomTable) and a geometry of other geometric table (visGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param objId1 identifier of a geometry of the actGeomTable table
+ \param visGeomTable geometric table name
+ \param visRep geometric representation of the visGeomTable table
+ \param objId2 identifier of other geometry of the visGeomTable table
+ \param geomVect the returned union
+ */
+ virtual bool geomUnion(const string& actGeomTable, TeGeomRep actRep, const string& objId1,
+ const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+ /*!
+ \brief Returns the symmetrical difference between two geometries of a geometric table (actGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param objId1 identifier of a geometry of the actGeomTable table
+ \param objId2 identifier of other geometry of the actGeomTable table
+ \param geomVect the returned symmetrical difference
+ */
+ virtual bool geomXOr(const string& actGeomTable, TeGeomRep actRep, const string& objId1,
+ const string& objId2, TeGeometryVect& geomVect);
+
+ /*!
+ \brief Returns the symmetrical difference between a geometry of a geometric table (actGeomTable) and a geometry of other geometric table (visGeomTable)
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param objId1 identifier of a geometry of the actGeomTable table
+ \param visGeomTable geometric table name
+ \param visRep geometric representation of the visGeomTable table
+ \param objId2 identifier of other geometry of the visGeomTable table
+ \param geomVect the returned symmetrical difference
+ */
+ virtual bool geomXOr(const string& actGeomTable, TeGeomRep actRep, const string& objId1,
+ const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+ //@}
+
+ /** @name Spatial Operations with raster data
+ * spatial operations over raster data into the database.
+ */
+ //@{
+ /*!
+ \brief Returns the statistics of raster data regions inside a geometry set of a geometric table (actGeomTable)
+ \param rasterTable raster table name
+ \param actGeomTable geometric table name that contains polygons
+ \param Ids identifiers of the geometries of the actGeomTable table that define the regions in the raster data
+ \param result structure that will contain the resulted statistics
+ */
+ virtual bool Zonal(const string& rasterTable, const string& actGeomTable, Keys& Ids, TeObjectStatistics& result);
+
+ /*!
+ \brief Returns the statistics of raster data regions inside a geometry set of a geometric table (actGeomTable)
+ \param rasterTable raster table name
+ \param actGeomTable geometric table name that contains polygons
+ \param actCollTable collection table that contains the identifiers of the geometries of the actGeomTable table that define the regions in the raster data
+ \param result structure that will contain the resulted statistics
+ */
+ virtual bool Zonal(const string& rasterTable, const string& actGeomTable, const string& actCollTable, TeObjectStatistics& result);
+
+ /*!
+ \brief Returns the statistics of a raster data region inside a geometry in memory
+ \param rasterTable raster table name
+ \param poly the geometry in memory that define a region in the raster data
+ \param result structure that will contain the resulted statistics
+ */
+ virtual bool Zonal(const string& rasterTable, TePolygon& poly, TeStatisticsDimensionVect& result);
+
+ /*!
+ \brief Clips a raster data from a geometry of a geometric table (actGeomTable)
+ \param rasterTable raster table name
+ \param actGeomTable geometric table name that contains polygons
+ \param objId identifier of the geometry of the actGeomTable table
+ \param nameLayerOut the layer name that will contain the result
+ \param st the strategy used in the clipping of the raster data
+ */
+ virtual bool Mask(const string& rasterTable, const string& actGeomTable, const string& objId, const string& nameLayerOut, TeStrategicIterator st);
+
+ /*!
+ \brief Clips a raster data from a geometry in memory (poly)
+ \param rasterTable raster table name
+ \param poly a geometry in memory
+ \param nameLayerOut the layer name that will contain the result
+ \param st the strategy used in the clipping of the raster data
+ */
+ virtual bool Mask(const string& rasterTable, TePolygon& poly, const string& nameLayerOut, TeStrategicIterator st);
+ //@}
+
+ /** @name specifics SQLs
+ * return SQL strings
+ */
+ //@{
+ //! Return a string that describes a where clause in SQL to return the geometries inside the box
+ virtual string getSQLBoxWhere (TeBox &box, TeGeomRep rep);
+
+ //! Return a string that describes a where clause in SQL to return the geometries of the table2 that are
+ //! inside the geometries box of the table1 (table1 must have lower_x, lower_y...)
+ virtual string getSQLBoxWhere (const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep rep1 = TePOLYGONS);
+
+ //! Return a string SQL to be used in the clause SELECT to select the box (lower_x, lower_y, upper_x, upper_y)
+ virtual string getSQLBoxSelect (const string& tableName, TeGeomRep rep);
+
+ //! Return a string SQL to calculate the statistics of some attributes
+ virtual string getSQLStatistics (TeGroupingAttr& attrs);
+
+ //! Return the database function in SQL to generate autonumber values
+ virtual string getSQLAutoNumber(const string& table);
+
+ //! Return a string SQL to temporal where
+ virtual string getSQLTemporalWhere (TeTimeInterval& /* timeInterval */, TeTemporalRelation /* timeOperator */, const string& /* initialTime */, const string& /* finalTime */ );
+
+ //! Return a string SQL to temporal where
+ virtual string getSQLTemporalWhere (const string& temporalRest);
+
+ //! Return a string SQL to temporal where
+ virtual string getSQLTemporalWhere(int /* time1 */, int /* time2 */, TeChronon /* chr */, TeTemporalRelation /* rel */, const string& /* initialTime */, const string& /* finalTime */);
+
+ virtual string getSQLTime(TeTime& /* time */) { return ""; };
+
+ virtual string getSQLTemporalFunction (TeChronon chr, const string& colName);
+ //@}
+
+ //! Return the box of a specific geometry (object_id)
+ virtual bool getMBRGeom(string tableGeom, string object_id, TeBox& box, string colGeom);
+
+ //! Return the box of a select objects set
+ virtual bool getMBRSelectedObjects(string geomTable,string colGeom, string fromClause,
+ string whereClause, string afterWhereClause, TeGeomRep repType,TeBox &bout, const double& tol = 0.0);
+
+ //! Gets the list of attributes of a table
+ virtual bool getAttributeList(const string& tableName,TeAttributeList& attList);
+
+ //! Escape special characters in a string to be used in a SQL statement
+ virtual string escapeSequence(const string& from) = 0;
+
+ virtual TeBox getThemeBox(TeTheme* theme);
+
+ map<int, map<string, string> >& mapThemeAlias() {return mapThemeAlias_;}
+
+ //! Concat values in a vector using unionString as the join between each value
+ virtual string concatValues(vector<string>& values, const string& unionString) = 0;
+
+ //! Returns the SQL function for upper case
+ virtual string toUpper(const string& value) = 0;
+
+
+protected :
+
+ bool isConnected_; //!< indicates if the connection is open
+ string host_; //!< host name of the database server
+ string user_; //!< user name
+ string password_; //!< user password
+ string database_; //!< database name
+ int portNumber_; //!< port number
+ int errorNumber_; //!< error number
+ string errorMessage_; //!< error message
+ TeLayerMap layerMap_; //!< layer map
+ TeViewMap viewMap_; //!< view map
+ TeThemeMap themeMap_; //!< theme map
+ TeLegendEntryMap legendMap_; //!< view map
+ multiset<int> relationMSet_; //!< multiset of relations between tables
+ string dbmsName_; //!< DBMS name (Ado, MySQL, Postgres, OracleSpatial)
+ map<int, map<string, string> > mapThemeAlias_;
+};
+/*! \example DatabaseExample1.cpp
+ This is an example of how to use the TeDatabase to create a TerraLib Database
+ */
+
+/*! \example DatabaseExample2.cpp
+ This is an example of how to use the TeDatabase class to open a connection
+ to a database and and retrieve some geometries
+ */
+
+/*! \example SpatialOperation1.cpp
+ This is an example of how to use the TeDatabasePortal class to manipulate geometries
+ returned from queries on geometry tables
+ */
+
+
+//! An abstract access portal to a database
+/*! A portal has a concept of a record set, that is generated by a selection (query) on
+ the data accessible through a connection to a database server.
+ \sa
+ TeDatabase, TeGeometry, TeTable, TeTheme, TeView, TeLayer
+
+ */
+class TeDatabasePortal {
+protected:
+
+
+ TeDatabase* db_; //!< the database associated to this portal
+ TeAttributeList attList_; //!< the list of attributes associated to this portal
+ int numRows_; //!< the number of rows in this portal
+ int numFields_; //!< the number of fields in this portal
+ string errorMessage_; //!< error message
+ int errorNumber_; //!< error number
+
+public :
+
+ //!Constructor
+ TeDatabasePortal ();
+
+ //! Destructor
+ virtual ~TeDatabasePortal ();
+
+ //! Returns the database associated to this portal
+ TeDatabase* getDatabase()
+ { return db_; }
+
+ //! Executes a SQL query that opens a record set
+ virtual bool query ( const string &qry, TeCursorLocation l = TeSERVERSIDE, TeCursorType t = TeUNIDIRECTIONAL, TeCursorEditType e = TeREADONLY, TeCursorDataType dt = TeTEXTCURSOR ) = 0;
+
+ //! Fetchs the next row in a record set that should�ve been previously opened
+ virtual bool fetchRow () = 0;
+
+ //! Fetchs a particular row
+ virtual bool fetchRow (int i) = 0;
+
+ //! Frees the current record set
+ virtual void freeResult () = 0;
+
+ //! Gets the last error message
+ virtual string errorMessage ()
+ { return errorMessage_; }
+
+ //! Gets the number of the last error message
+ virtual int errorNum ()
+ { return errorNumber_; }
+
+// virtual bool loadNetwork (TeLayer *layer) = 0;
+
+// specific SQL SELECT command methods
+
+ //! Retrieves the number of rows in this portal
+ int numRows ()
+ { return numRows_;}
+
+ //! Retrieves the number of fields in this portal
+ int numFields ()
+ { return numFields_; }
+
+ //! Retrieves attribute list in this portal
+ TeAttributeList AttributeList()
+ { return attList_; }
+
+ //! Retrieves the i-th attribute in this portal
+ TeAttribute getAttribute (int i);
+
+ //! Retrieves an attribute by name
+ TeAttribute getAttribute (const string& s);
+
+ //! Gets the value of the i-th attribute as a literal
+ virtual char* getData (int i) = 0;
+
+ //! Gets the value of a named attribute as a literal
+ virtual char* getData (const string& s) = 0;
+
+ //! Gets the value of the i-th attribute as a double
+ virtual double getDouble (int i);
+
+ //! Gets the value of a named attribute as a double
+ virtual double getDouble (const string& s);
+
+ //! Gets the value of the i-th attribute as an integer
+ virtual int getInt (int i);
+
+ //! Gets the value of a named attribute as an integer
+ virtual int getInt (const string& s);
+
+ //! Gets the value of a named attribute as a boolean
+ virtual bool getBool (const string& s) = 0;
+
+ //! Gets the value of the i-th attribute as a boolean
+ virtual bool getBool (int i) = 0;
+
+ //! Gets the value of the i-th attribute as a date
+ virtual TeTime getDate (int i) = 0;
+
+ //! Gets the value of a named attribute as a date
+ virtual TeTime getDate (const string& s) = 0;
+
+ //! Gets the of a date/time attribute as a string formatted as accepted in further SQL statements
+ virtual string getDateAsString(int i) = 0;
+
+ //! Gets the of a date/time attribute as a string formatted as accepted in further SQL statements
+ virtual string getDateAsString(const string& s) = 0;
+
+ //! Gets the value of a named BLOB attribute
+ virtual bool getBlob(const string& s, unsigned char* &data, long& size) = 0;
+
+ //! Gets the index of a named attribute
+ int getColumnIndex (const string& s);
+
+ //! Gets the name of the i-th attribute
+ string getColumnName (int i);
+
+ /** @name Data Model
+ The following methods decodify structures as stored
+ in the database according to the data model proposed in TerraLib.
+ */
+ //@{
+ virtual TeViewTree* getViewTree ();
+ virtual TeLegendEntry getLegend();
+ virtual TeVisual getVisual();
+ virtual TeColor getColor();
+ virtual bool getRasterBlock(unsigned long& size, unsigned char* ptData)=0;
+ //@}
+
+ /** @name Fetch Geometry
+ The following methods decodify geometries as stored
+ in the database according to the data model proposed in TerraLib .
+ \par The fetchGeometry methods advance the portal to the next record
+ and they return TRUE if there are more records to be read and FALSE otherwise
+ */
+ //@{
+ virtual bool fetchGeometry (TePolygon& pol) = 0;
+ virtual bool fetchGeometry (TeLine2D& line) = 0;
+ virtual bool fetchGeometry (TeNode& n) = 0;
+ virtual bool fetchGeometry (TePoint& p) = 0;
+ virtual bool fetchGeometry (TeCell& cell);
+ virtual bool fetchGeometry (TeArc& arc);
+ virtual bool fetchGeometry (TeText& text);
+ //@}
+};
+
+
+/*! \example DatabaseExample3.cpp
+ This is an example n example of how to use the databse interface to do some spatial queries
+ */
+#endif
+
diff --git a/src/terralib/kernel/TeDatum.cpp b/src/terralib/kernel/TeDatum.cpp
new file mode 100644
index 0000000..10f5b9f
--- /dev/null
+++ b/src/terralib/kernel/TeDatum.cpp
@@ -0,0 +1,222 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include <map>
+
+using namespace std;
+
+#include "TeDatum.h"
+#include "TeException.h"
+#include "TeUtils.h"
+
+const int NUMDATUM = 8; // number of datum
+const int NUMSPH = 8; // number of ellipsoids
+
+struct SphParam
+{
+ double rd;
+ double flt;
+};
+
+typedef map<string, SphParam> SphMap;
+
+// Spheroid Radius(Semi Major Axis) Flattening
+char* ellipsoidList [] =
+{
+"Airy", "6.3775634e+06", "3.340906e-03",
+"Clarke-1866", "6.378206e+06", "3.390060e-03",
+"EarthRadius", "6.371000e+06", "0.000000e+00",
+"Everest", "6.3772763e+06", "3.324468e-03",
+"GRS80", "6.378137e+06", "3.352811e-03",
+"Hayford", "6.378388e+06", "3.367003e-03",
+"UGGI67", "6.378160e+06", "3.352892e-03",
+"WGS84", "6.378137e+06", "3.352811e-03"
+};
+
+
+
+// DatumName Spheroid Shift_X Shift_Y Shift_Z
+
+char* datumList [] =
+{
+"Astro-Chua", "Hayford", "-7.700000e+01", "2.390000e+02", "5.000000e+00",
+"CorregoAlegre","Hayford", "-1.387000e+02", "1.644000e+02", "3.440000e+01",
+"Indian", "Everest", "0.000000e+00", "0.000000e+00", "0.000000e+00",
+"NAD27", "Clarke-1866", "0.000000e+00", "0.000000e+00", "0.000000e+00",
+"NAD83", "GRS80", "0.000000e+00", "0.000000e+00", "0.000000e+00",
+"SAD69", "UGGI67", "0.000000e+00", "0.000000e+00", "0.000000e+00",
+"Spherical", "EarthRadius", "0.000000e+00", "0.000000e+00", "0.000000e+00",
+"WGS84", "WGS84", "6.687000e+01", "-4.370000e+00", "3.852000e+01"
+};
+
+typedef map<string, TeDatum> DatumMap;
+
+
+TeDatum::TeDatum(const TeDatum& other)
+{
+ name_ = other.name_;
+ rd_ = other.rd_ ;
+ flt_= other.flt_;
+ dx_ = other.dx_;
+ dy_= other.dy_;
+ dz_ = other.dz_;
+}
+
+TeDatum&
+TeDatum::operator=(const TeDatum& rhs)
+{
+ if ( this != &rhs )
+ {
+ name_ = rhs.name_;
+ rd_ = rhs.rd_;
+ flt_= rhs.flt_;
+ dx_ = rhs.dx_;
+ dy_= rhs.dy_;
+ dz_ = rhs.dz_;
+ }
+ return *this;
+}
+
+
+TeDatum
+TeDatumFactory::make( const string& name )
+{
+
+ DatumMap datumMap_;
+ // Step 1 - Read the Spheroids - Put in a Map
+
+ SphMap sphMap;
+
+ SphParam sphPar;
+
+ int i, k = 0;
+
+ for ( i = 0; i < NUMSPH; i++ )
+ {
+ string name = ellipsoidList [k++];
+ sphPar.rd = atof ( ellipsoidList [k++] );
+ sphPar.flt = atof ( ellipsoidList [k++] );
+
+ sphMap [ name ] = sphPar;
+ }
+
+ // Step 2 - Read the Datum List, create a Map
+
+
+ k = 0;
+
+ for ( i = 0; i < NUMDATUM; i++ )
+ {
+ string name = datumList [k++];
+
+ string sphname = datumList [ k++];
+
+ double dx = atof ( datumList [k++] );
+ double dy = atof ( datumList [k++] );
+ double dz = atof ( datumList [k++] );
+
+ SphMap::iterator it = sphMap.find ( sphname );
+
+ if ( it == sphMap.end() )
+ {
+ throw TeException ( DATUM_ERROR );
+ }
+ else
+ sphPar = (*it).second;
+
+ TeDatum dat ( name, sphPar.rd, sphPar.flt, dx, dy, dz );
+
+ datumMap_ [ name ] = dat; // create a datum map
+ }
+
+ DatumMap::iterator it = datumMap_.find ( name );
+
+ if ( it != datumMap_.end() ) // found it
+ return (*it).second;
+
+ return TeDatum ("Spherical");
+}
+
+
+bool findDatum(double semiMajor, double flatenning, TeDatum& datum)
+{
+ DatumMap datumMap_;
+
+ // Step 1 - Read the Spheroids - Put in a Map
+
+ SphMap sphMap;
+ SphParam sphPar;
+
+ int i, k = 0;
+
+ for ( i = 0; i < NUMSPH; i++ )
+ {
+ string name = ellipsoidList [k++];
+ sphPar.rd = atof ( ellipsoidList [k++] );
+ sphPar.flt = atof ( ellipsoidList [k++] );
+
+ sphMap [ name ] = sphPar;
+ }
+
+ // Step 2 - Read the Datum List, create a Map
+ k = 0;
+
+ for ( i = 0; i < NUMDATUM; i++ )
+ {
+ string name = datumList [k++];
+ string sphname = datumList [ k++];
+ double dx = atof ( datumList [k++] );
+ double dy = atof ( datumList [k++] );
+ double dz = atof ( datumList [k++] );
+
+ SphMap::iterator it = sphMap.find ( sphname );
+
+ if ( it == sphMap.end() )
+ {
+ throw TeException ( DATUM_ERROR );
+ }
+ else
+ sphPar = (*it).second;
+ TeDatum dat ( name, sphPar.rd, sphPar.flt, dx, dy, dz );
+ datumMap_ [ name ] = dat; // create a datum map
+ }
+
+ DatumMap::iterator it = datumMap_.begin();
+ while (it != datumMap_.end())
+ {
+ TeDatum dt = (*it).second;
+ if ( TeCompareDouble(dt.radius(),semiMajor,6) &&
+ TeCompareDouble(dt.flattening(),flatenning,6))
+ {
+
+ datum = dt;
+ return true;
+ }
+ ++it;
+ }
+ return false;
+}
diff --git a/src/terralib/kernel/TeDatum.h b/src/terralib/kernel/TeDatum.h
new file mode 100644
index 0000000..933ab3e
--- /dev/null
+++ b/src/terralib/kernel/TeDatum.h
@@ -0,0 +1,141 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_DATUM_H
+#define __TERRALIB_INTERNAL_DATUM_H
+
+#include <string>
+#include <cmath>
+using namespace std;
+
+//! Implements valid Datum options and related parameters which account for different earth spheroids.
+/*! Specifies planimetric TeDatum parameters to be used for defining geodetic
+ coordinates, which are necessary to establish a map projection system.
+ It encapsulates the following important information regarding
+ a planimetric Datum such as:
+ \li Datum name;
+ \li Earth equatorial radius;
+ \li Earth flatenning;
+ \li Datum shifts.
+
+ \author
+ Ubirajara Freitas, Julio d'Alge.
+
+ \sa TeDatumFactory
+*/
+class TeDatum
+{
+private:
+ string name_; //!< Planimetric TeDatum name
+ double rd_, //!< Earth equatorial radius (m)
+ flt_; //!< Earth flattening
+ double dx_, //!< TeDatum shift along x axis (m)
+ dy_, //!< TeDatum shift along y axis (m)
+ dz_; //!< TeDatum shift along z axis (m)
+public:
+
+ //! Constructor.
+ TeDatum ( string name = "Spherical", double rd = 6.371000e+06 , double flt = 0.,
+ double dx = 0., double dy= 0., double dz = 0.):
+ name_ ( name ),
+ rd_ ( rd ),
+ flt_ ( flt ),
+ dx_ ( dx ),
+ dy_ ( dy ),
+ dz_ ( dz )
+ { }
+
+ //! Copy constructor
+ TeDatum(const TeDatum& other);
+
+ //! Operator =
+ TeDatum& operator=(const TeDatum& rhs);
+
+ //! Destructor.
+ ~TeDatum () {}
+
+ //! Returns the datum name
+ string name() const
+ { return name_;}
+
+ //! Sets the datum name
+ void name(const string& name)
+ { name_ = name; }
+
+ //! Returns Earth equatorial radius (m)
+ double radius() const
+ { return rd_; }
+
+ //! Sets Earth equatorial radius (m)
+ void radius(const double rd)
+ { rd_ = rd; }
+
+ //! Returns the Earth equatorial radius (m) (m)
+ double flattening() const
+ { return flt_; }
+
+ //! Sets the Earth equatorial radius (m) (m)
+ void flattening(const double flt)
+ { flt_ = flt; }
+
+ //! Returns the shift along x axis (m)
+ double xShift() const
+ { return dx_; }
+
+ //! Returns the shift along y axis (m)
+ double yShift() const
+ { return dy_; }
+
+ //! Returns the shift along z axis (m)
+ double zShift() const
+ { return dz_; }
+
+
+//! Verifies if current TeDatum is equal to TeDatum& dat.
+ bool operator== (const TeDatum& dat) const
+ {
+ return ( (fabs(rd_-dat.rd_) <= 1.0e-6f)
+ && (fabs(flt_-dat.flt_) <= 1.0e-6f)
+ && (fabs(dx_ - dat.dx_) <= 1.0e-6f)
+ && (fabs(dy_ - dat.dy_) <= 1.0e-6f)
+ && (fabs(dz_ - dat.dz_) <= 1.0e-6f)
+ );
+ }
+};
+
+//! Produces a Datum accordingly to an specified name
+class TeDatumFactory
+{
+public:
+ //! factory method - clones a datum given a name
+ static TeDatum make ( const string& name );
+};
+
+/*!
+ \fn findDatum(double semiMajor, double flatenning, TeDatum& datum)
+ \brief Tries to find the a TeDatum according to givem semi major axis and earth flattening
+ */
+bool findDatum(double semiMajor, double flatenning, TeDatum& datum);
+
+#endif
+
diff --git a/src/terralib/kernel/TeDecoder.h b/src/terralib/kernel/TeDecoder.h
new file mode 100644
index 0000000..9e85e6a
--- /dev/null
+++ b/src/terralib/kernel/TeDecoder.h
@@ -0,0 +1,181 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoder.h
+ This file deals with decoding of raster structures
+*/
+#ifndef __TERRALIB_INTERNAL_DECODER_H
+#define __TERRALIB_INTERNAL_DECODER_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeProjection.h"
+#include "TeBox.h"
+#include "TeRasterParams.h"
+#include "TeFactory.h"
+
+using namespace std;
+#include <string>
+#include <list>
+#include <map>
+
+class TeRaster;
+class TeDecoderMemory;
+
+//! An abstract class to decode raster data
+/*
+ A decoder keeps its own copy of the parameters associated
+ to the raster being decoded.
+
+ \sa TeRaster, TeRasterParams
+*/
+class TeDecoder {
+
+public:
+ //! Empty constructor
+ TeDecoder() {}
+
+ //! Constructor from raster parameters
+ /*!
+ \param par raster parameters
+ */
+ TeDecoder(TeRasterParams& par) : params_(par) {}
+
+ //! Virtual destructor (derived classe might have their own)
+ virtual ~TeDecoder() {}
+
+ //! Returns the raster parameters
+ TeRasterParams& params()
+ { return params_; }
+
+ //! Updates the raster parameters
+ void updateParams(TeRasterParams& par)
+ { params_ = par; }
+
+ //! Sets the value of a specific raster pixel
+ /*!
+ \param col pixel column identifier
+ \param lin pixel line identifier
+ \param val pixel value being inserted
+ \param band pixel band identifier
+ */
+ virtual bool setElement(int col, int lin, double val, int band=0 ) = 0;
+
+ //! Gets an specific element (col, lin, band) of a raster data
+ /*!
+ \param col pixel column identifier
+ \param lin pixel line identifier
+ \param val pixel value being retrieved
+ \param band pixel band identifier
+ */
+ virtual bool getElement(int col, int lin, double& val, int band=0 ) = 0;
+
+ //! Transform a geographical coordinate to an index (lin, col) coordinate
+ virtual TeCoord2D coord2Index (TeCoord2D &pt)
+ { return params_.coord2Index(pt); }
+
+ //! Transform an index (lin, col) coordinate to geographical coordinate
+ virtual TeCoord2D index2Coord (TeCoord2D &pt)
+ { return params_.index2Coord(pt); }
+
+ //! Initializes the internal structures of the decoder from an external raster parameters structure
+ /*
+ Copy the raster parameters to the internal parameters of the raster
+ calls the init() method
+ */
+ virtual void init( TeRasterParams& par )
+ { clear(); params_= par; init();}
+
+ //! Initializes the internal structures of the decoder, from its raster parameters structure.
+ virtual void init() = 0;
+
+ //! Clears its internal structures
+ virtual bool clear() = 0;
+
+ //! Returns a default object - for compatibility reasons with TeDecoderFactory
+ static TeDecoder* DefaultObject( const TeRasterParams& /* par */)
+ { return 0; }
+
+/** @name Selection
+ These routines are used to implement a selection of blocks or tiles
+ that intercept a given bounding box, and provide them sequentially.
+ Decoders that decodify rasters in formats that support tiling should
+ reimplement theses functions in an optimized way.
+*/
+//@{
+
+ //! Returns TRUE if it there are raster blocks that intersect a given box
+ virtual bool selectBlocks(TeBox& /* bb */, int /* resFac */, TeRasterParams& /*parBlock*/)
+ { return false; }
+
+ //! Gets the the current raster block selected as a raster in memory
+ virtual bool getSelectedRasterBlock(TeDecoderMemory* /* memDec */)
+ { return false; }
+
+ //! Clear a block selection previously done
+ virtual void clearBlockSelection() {}
+
+ //! Returns the raster best resolution level available to fill a given bounding box with a given number of lines and columns in a given projection
+ virtual int bestResolution(TeBox& /*bb*/, int /*ncols*/, int /*nlines*/, TeProjection* /*proj*/)
+ { return 1; }
+
+ //! Returns the number of blocks selected in the last query
+ virtual int numberOfSelectedBlocks()
+ { return 0; }
+
+//@}
+
+protected:
+
+//! The parameters that describes a raster data
+ TeRasterParams params_;
+};
+
+//! A decoder abstract factory
+/*!
+ Implements an abstract factory that builds appropriate decoders
+ according to a string identifier.
+*/
+class TeDecoderFactory: public TeFactory<TeDecoder,TeRasterParams>
+{
+public:
+
+ //! Maps synonyms to decoders identifiers (example "TIFF" or "tif" to decoderTIFF
+ typedef map<string,string> TeNames2Decoders;
+
+ //! Unique instance instance of map from synonyms to decoder identifiers
+ static TeNames2Decoders& instanceName2Dec ()
+ {
+ static TeNames2Decoders names2dec_;
+ return names2dec_;
+ }
+
+ //! Builds an appropriate decoder from a identifier
+ TeDecoderFactory(const string& name) : TeFactory<TeDecoder,TeRasterParams>(name) { }
+
+ //! Destructor
+ virtual ~TeDecoderFactory() {}
+};
+
+#endif
diff --git a/src/terralib/kernel/TeDecoderASCIIGrid.cpp b/src/terralib/kernel/TeDecoderASCIIGrid.cpp
new file mode 100644
index 0000000..e4aad2d
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderASCIIGrid.cpp
@@ -0,0 +1,335 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeException.h"
+#include "TeDecoderASCIIGrid.h"
+#include "TeAsciiFile.h"
+#include "TeUtils.h"
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+/*
+Expected format for ESRI ASCII GRID Files (Copied from the ArcWorkstation 8.3 Help File):
+
+<NCOLS xxx>
+<NROWS xxx>
+<XLLCENTER xxx | XLLCORNER xxx>
+<YLLCENTER xxx | YLLCORNER xxx>
+<CELLSIZE xxx>
+{NODATA_VALUE xxx}
+row 1
+row 2
+.
+.
+.
+row n
+*/
+
+TeDecoderASCIIGrid::TeDecoderASCIIGrid (const TeRasterParams& par) :
+ TeDecoderMemory()
+{
+ if (par.fileName_.empty())
+ return;
+ params_ = par;
+ params_.decoderIdentifier_ = "ASCIIGRID";
+ if (params_.mode_ == 'w' || params_.mode_ == 'r')
+ readParameters();
+}
+
+TeDecoderASCIIGrid::~TeDecoderASCIIGrid ()
+{
+ if ( isModified_ && (params_.mode_ == 'w' || params_.mode_ == 'c'))
+ { // save contents to disk
+ try
+ {
+ TeAsciiFile sFile(params_.fileName_,"w+");
+ if (writeParameters(sFile))
+ saveData(sFile);
+ }
+ catch (...)
+ {
+ }
+ }
+ TeDecoderMemory::clear();
+}
+
+bool
+TeDecoderASCIIGrid::clear()
+{
+ if ( isModified_ && (params_.mode_ == 'w' || params_.mode_ == 'c'))
+ { // save contents to disk
+ try
+ {
+ TeAsciiFile sFile(params_.fileName_,"w+");
+ if (writeParameters(sFile))
+ saveData(sFile);
+ }
+ catch (...)
+ {
+ }
+ isModified_ = false;
+ }
+ TeDecoderMemory::clear();
+ return true;
+}
+
+bool
+TeDecoderASCIIGrid::readParameters()
+{
+ try
+ {
+ TeAsciiFile pFile (params_.fileName_);
+ string name;
+ while (pFile.isNotAtEOF())
+ {
+ name = pFile.readString();
+ if (TeStringCompare(name,"NCOLS"))
+ break;
+ }
+ if (!pFile.isNotAtEOF()) // unexpected end of file
+ return false;
+ params_.ncols_ = pFile.readInt();
+ pFile.findNewLine();
+
+ while (pFile.isNotAtEOF())
+ {
+ name = pFile.readString();
+ if (TeStringCompare(name,"NROWS"))
+ break;
+ }
+ if (!pFile.isNotAtEOF()) // unexpected end of file
+ return false;
+ params_.nlines_ = pFile.readInt();
+ pFile.findNewLine();
+
+ bool isCenter = false;
+ while (pFile.isNotAtEOF())
+ {
+ name = pFile.readString();
+ if (TeStringCompare(name,"XLLCENTER"))
+ {
+ isCenter = true;
+ break;
+ }
+ else if (TeStringCompare(name,"XLLCORNER"))
+ break;
+ }
+ if (!pFile.isNotAtEOF()) // unexpected end of file
+ return false;
+ double llx = pFile.readFloat();
+ pFile.findNewLine();
+
+ while (pFile.isNotAtEOF())
+ {
+ name = pFile.readString();
+ if (TeStringCompare(name,"YLLCENTER"))
+ {
+ isCenter = true;
+ break;
+ }
+ else if (TeStringCompare(name,"YLLCORNER"))
+ break;
+ }
+ if (!pFile.isNotAtEOF()) // unexpected end of file
+ return false;
+ double lly = pFile.readFloat();
+ pFile.findNewLine();
+
+ while (pFile.isNotAtEOF())
+ {
+ name = pFile.readString();
+ if (TeStringCompare(name,"CELLSIZE"))
+ break;
+ }
+ if (!pFile.isNotAtEOF()) // unexpected end of file
+ return false;
+ params_.resx_ = params_.resy_ = pFile.readFloat();
+ pFile.findNewLine();
+
+ while (pFile.isNotAtEOF())
+ {
+ name = pFile.readString();
+ if (TeStringCompare(name,"NODATA_VALUE"))
+ break;
+ }
+ if (!pFile.isNotAtEOF()) // unexpected end of file
+ return false;
+ double dummy = pFile.readFloat();
+ params_.useDummy_ = true;
+ params_.nBands(1);
+ params_.setDummy(dummy);
+ params_.nBands(1);
+ params_.useDummy_ = true;
+ params_.setDummy(dummy);
+ params_.setDataType(TeDOUBLE);
+ params_.setPhotometric(TeRASTERMULTIBAND);
+ params_.lowerLeftResolutionSize(llx,lly,params_.resx_,params_.resy_,
+ params_.ncols_,params_.nlines_,isCenter);
+ TeProjection* pp = new TeNoProjection();
+ params_.projection(pp);
+ delete pp;
+ }
+ catch(...)
+ {
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDecoderASCIIGrid::readFile(const string& filename)
+{
+ string valstring;
+ try
+ {
+ TeAsciiFile pFile (filename);
+ string name;
+ while (pFile.isNotAtEOF() && !TeStringCompare(name,"NODATA_VALUE"))
+ name = pFile.readString();
+ if (!pFile.isNotAtEOF()) // unexpected end of file
+ return false;
+ pFile.findNewLine();
+ for (int lin = 0; lin < params_.nlines_; ++lin)
+ {
+ for (int col = 0; col < params_.ncols_; ++col)
+ {
+ setElement(col,lin,pFile.readFloat());
+ }
+ }
+ }
+ catch(...)
+ {
+ return false;
+ }
+ return true;
+}
+
+void
+TeDecoderASCIIGrid::init()
+{
+ params_.status_= TeNOTREADY;
+ int nb = params_.nBands();
+ if (nb != 1 )
+ return;
+
+ TeDecoderMemory::init(); // try to allocate enough memory
+ if (params_.status_ == TeNOTREADY)
+ return;
+
+ params_.status_= TeNOTREADY;
+ if (params_.mode_ == 'c') // creating a new file
+ {
+ if (access(params_.fileName_.c_str(),00) != -1) // remove existing file
+ {
+ if (unlink(params_.fileName_.c_str()) == -1)
+ return;
+ }
+ try
+ {
+ TeAsciiFile sFile(params_.fileName_,"w+");
+ if (!writeParameters(sFile) || !saveData(sFile))
+ return;
+ else
+ {
+ params_.status_ = TeREADYTOWRITE;
+ }
+ }
+ catch (...)
+ {
+ return;
+ }
+ }
+ else if (params_.mode_ == 'w')
+ {
+ if ((access(params_.fileName_.c_str(),06) == -1) || !readFile(params_.fileName_))
+ return;
+ params_.status_ = TeREADYTOWRITE;
+ }
+ else if (params_.mode_ == 'r')
+ {
+ if ((access(params_.fileName_.c_str(),04) == -1)|| !readFile(params_.fileName_))
+ return;
+ params_.status_ = TeREADYTOREAD;
+ }
+}
+
+bool
+TeDecoderASCIIGrid::writeParameters(TeAsciiFile& pFile)
+{
+ string name;
+ try
+ {
+ TeBox box = params_.box();
+ name = "NCOLS " + Te2String(params_.ncols_) + "\n";
+ pFile.writeString(name);
+ name = "NROWS " + Te2String(params_.nlines_) + "\n";
+ pFile.writeString(name);
+ name = "XLLCENTER " + Te2String(box.x1_,6) + "\n";
+ pFile.writeString(name);
+ name = "YLLCENTER " + Te2String(box.y2_,6) + "\n";
+ pFile.writeString(name);
+ name = "CELLSIZE " + Te2String(params_.resx_,6) + "\n";
+ pFile.writeString(name);
+ name = "NODATA_VALUE " + Te2String(params_.dummy_[0],6) + "\n";
+ pFile.writeString(name);
+ }
+ catch (...)
+ {
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDecoderASCIIGrid::saveData(TeAsciiFile& pFile)
+{
+ bool isi = (params_.dataType_[0] != TeDOUBLE) && (params_.dataType_[0] != TeFLOAT);
+
+ FILE* fp = pFile.FilePtr();
+ char fmt[100];
+ if (isi)
+ strcpy(fmt,"%.0f ");
+ else
+ strcpy(fmt,"%f ");
+ try
+ {
+ double d;
+ for (int l=0; l<params_.nlines_; ++l)
+ {
+ for (int c=0; c<params_.ncols_; ++c)
+ {
+ TeDecoderMemory::getElement(c,l,d);
+ fprintf(fp,fmt,d);
+ }
+ pFile.writeNewLine();
+ }
+ }
+ catch(...)
+ {
+ return false;
+ }
+ return true;
+}
diff --git a/src/terralib/kernel/TeDecoderASCIIGrid.h b/src/terralib/kernel/TeDecoderASCIIGrid.h
new file mode 100644
index 0000000..a615f46
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderASCIIGrid.h
@@ -0,0 +1,68 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderASCIIGrid.h
+ This file deals with decoding of raster data in a ASCII SPRING format
+*/
+#ifndef __TERRALIB_INTERNAL_DECODERASCIIGrid_H
+#define __TERRALIB_INTERNAL_DECODERASCIIGrid_H
+
+#include "TeDecoderMemory.h"
+
+class TeAsciiFile;
+
+//! Implements a decoder for rasters in ESRI, Inc.'s ASCII Grid format
+class TeDecoderASCIIGrid : public TeDecoderMemory
+{
+public:
+ //! Empty constructor
+ TeDecoderASCIIGrid () : TeDecoderMemory()
+ { params_.decoderIdentifier_ = "ASCIIGRID"; }
+
+ //! Constructor from some parameters
+ TeDecoderASCIIGrid (const TeRasterParams& par);
+
+ //! Destructor
+ ~TeDecoderASCIIGrid ();
+
+ void init();
+ bool clear();
+private:
+ bool readFile(const string& filename);
+ bool readParameters();
+ bool writeParameters(TeAsciiFile& pFile);
+ bool saveData(TeAsciiFile& pFile);
+};
+
+//! Implements a factory to build decoders to JPEG raster
+class TeDecoderASCIIGridFactory : public TeDecoderFactory
+{
+public:
+
+ TeDecoderASCIIGridFactory(const string& name) : TeDecoderFactory(name) {}
+
+ virtual TeDecoder* build (const TeRasterParams& arg)
+ { return new TeDecoderASCIIGrid(arg); }
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeDecoderDatabase.cpp b/src/terralib/kernel/TeDecoderDatabase.cpp
new file mode 100644
index 0000000..e5481a4
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderDatabase.cpp
@@ -0,0 +1,452 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeDecoderDatabase.h>
+#include <TeDecoderMemory.h>
+#include <TeRasterRemap.h>
+#include <zlib.h>
+#ifdef WIN32
+#include <jpeg.h>
+#endif
+#include <TeDataTypes.h>
+#include "TeProgress.h"
+#include "TeVectorRemap.h"
+
+TeDecoderDatabase::TeDecoderDatabase(const TeRasterParams& par ):
+ TeDecoderVirtualMemory(par),
+ db_(par.database_),
+ blockPortal_(0),
+ memAux_(0),
+ nSelectedBlocks_(0)
+{
+ params_ = par;
+ params_.decoderIdentifier_ = "DB";
+}
+
+TeDecoderDatabase::~TeDecoderDatabase()
+{
+ clearBlockSelection();
+ clear();
+}
+
+bool
+TeDecoderDatabase::create()
+{
+ if (db_ == 0)
+ return false;
+
+ // Create raster table in database
+ if (!db_->createRasterGeometry (params_.fileName_))
+ return false;
+ return true;
+}
+
+void
+TeDecoderDatabase::init()
+{
+ clearBlockSelection();
+ clear();
+ params_.status_= TeNOTREADY;
+ if (db_ == 0) // there is not valid database connection
+ return;
+
+ if (params_.mode_ == 'c')
+ {
+ if (db_->tableExist(params_.fileName_))
+ {
+ string sql = "DROP TABLE " + params_.fileName_;
+ db_->execute(sql);
+ }
+ if (!db_->createRasterGeometry (params_.fileName_))
+ return;
+ else params_.status_ = TeREADYTOWRITE;
+ }
+ else if (params_.mode_ == 'w')
+ {
+ if (db_->tableExist(params_.fileName_))
+ params_.status_ = TeREADYTOWRITE;
+ }
+ else if (params_.mode_ == 'r')
+ {
+ if (db_->tableExist(params_.fileName_))
+ params_.status_ = TeREADYTOREAD;
+ }
+ TeDecoderVirtualMemory::init();
+ return;
+}
+
+bool
+TeDecoderDatabase::clear()
+{
+ if (db_ == 0)
+ return false;
+ TeDecoderVirtualMemory::clear();
+ if (blockPortal_)
+ delete blockPortal_;
+ blockPortal_ = 0;
+ if (memAux_)
+ delete []memAux_;
+ memAux_ = 0;
+ params_.status_ = TeNOTREADY;
+ return true;
+}
+
+string
+TeDecoderDatabase::codifyId(int col, int lin, int band, int /*res*/, int /*subb*/)
+{
+ char id[32];
+ if (params_.tiling_type_ == TeExpansible)
+ {
+ TeCoord2D tmpCoord = TeCoord2D(col,lin);
+ TeCoord2D xy = params_.index2Coord(tmpCoord);
+
+ double bXSize = params_.blockWidth_*params_.resx_;
+ double bYSize = params_.blockHeight_*params_.resy_;
+
+ int magicX, magicY;
+ if ( xy.x() < 0)
+ magicX = (int)(xy.x()/bXSize - 1);
+ else
+ magicX = (int)(xy.x()/bXSize);
+
+ if (xy.y() < 0)
+ magicY = (int) (xy.y()/bYSize-1);
+ else
+ magicY = (int) (xy.y()/bYSize);
+
+ sprintf(id,"X%dY%dB%dR%dS0",magicX,magicY,band,params_.resolution_);
+ }
+ else
+ sprintf(id,"X%dY%dB%dR%dS0",
+ (int)(col/params_.blockWidth_),(int)(lin/params_.blockHeight_),band,params_.resolution_);
+
+ return string(id);
+}
+
+void
+TeDecoderDatabase::decodifyId(const string& id, int& col,int& lin, int& band, int& res, int& subb)
+{
+ char lixo;
+ int magicX, magicY;
+ if (params_.tiling_type_ == TeExpansible)
+ {
+ sscanf(id.c_str(),"%1c%d%1c%d%1c%d%1c%d%1c%d",&lixo,&magicX,&lixo,&magicY,&lixo,&band,&lixo,&res,&lixo,&subb);
+
+ double bXSize = params_.blockWidth_*params_.resx_;
+ double bYSize = params_.blockHeight_*params_.resy_;
+
+ TeCoord2D xy(magicX*bXSize+params_.resx_/2,magicY*bYSize+params_.resy_/2);
+
+ xy = params_.coord2Index(xy);
+ lin = TeRound(xy.y())-params_.blockHeight_+1;
+ col = TeRound(xy.x());
+ }
+ else
+ {
+ sscanf(id.c_str(),"%1c%d%1c%d%1c%d%1c%d%1c%d",&lixo,&magicX,&lixo,&magicY,&lixo,&band,&lixo,&res,&lixo,&subb);
+ col = magicX*params_.blockWidth_;
+ lin = magicY*params_.blockHeight_;
+ }
+}
+
+bool
+TeDecoderDatabase::getRasterBlock(const string& index, void *block, int& ulCol, int& ulLin)
+{
+
+ TeDatabasePortal* portal = db_->getPortal();
+ if (!portal)
+ return false;
+
+ string q; // try to get the tile from databatase
+ q ="SELECT * FROM " + params_.fileName_ + " WHERE block_id='" + index + "'";
+
+ if (!portal->query(q)) // error submting query
+ {
+ delete portal;
+ return 0;
+ }
+
+ int res, subb, band=0;
+ if (!portal->fetchRow()) // tile is not in the database
+ {
+ decodifyId(index,ulCol,ulLin,band,res, subb);
+ delete portal;
+ return 0;
+ }
+
+ if (!memAux_)
+ {
+ long size = params_.blockHeight_ * params_.blockWidth_ * params_.nbitsperPixel_[0]/8;
+ memAux_ = new unsigned char[size];
+ }
+
+ // tile is already in the database
+ unsigned long blobLen;
+ if (!portal->getRasterBlock(blobLen,memAux_))
+ {
+ delete portal;
+ return false;
+ }
+
+ // decompress blob into a tile (previously allocated)
+ if (params_.compression_[band] == TeZLib) // zlib compression
+ {
+ unsigned long blockLen; // size after decompression
+ uncompress (reinterpret_cast<unsigned char*>(block),&blockLen,memAux_,blobLen);
+ }
+#ifdef WIN32
+ else if (params_.compression_[band] == TeJPEG) //jpeg compression
+ {
+ int nb;
+ bool status = Jpeg::ReadImage(params_.blockWidth_,params_.blockHeight_,nb,memAux_,blobLen,reinterpret_cast<unsigned char*>(block));
+ }
+#endif
+ else // no compression
+ {
+ memcpy(block,memAux_,blobLen);
+ }
+ TeCoord2D xy(portal->getDouble("lower_x"),portal->getDouble("upper_y"));
+ TeCoord2D ij = params_.coord2Index(xy);
+
+ // This is the rounding algorithm for col/lin value:
+ // Pixel 0 covers column and line indexes from [-0.5,0.5)
+ ulCol = TeRoundRasterIndex(ij.x_);
+ ulLin = TeRoundRasterIndex(ij.y_);
+ delete portal;
+ return true;
+}
+
+bool
+TeDecoderDatabase::putRasterBlock(const string& index, void *block, long bsize)
+{
+
+ if (db_ == 0 || index.empty())
+ return false;
+
+ // decodify tile parameters from index
+ int res, subb, band, blin, bcol;
+ decodifyId(index,bcol,blin,band,res, subb);
+
+ // calculates the box coordinates of the tile
+ TeCoord2D llt(bcol, blin+params_.blockHeight_-1);
+ TeCoord2D urt(bcol+params_.blockWidth_-1, blin);
+ TeCoord2D ll = params_.index2Coord(llt);
+ TeCoord2D ur = params_.index2Coord(urt);
+
+ TeBox blockbb(ll.x()-params_.resx_/2.,ll.y()-params_.resy_/2.,ur.x()+params_.resx_/2.,ur.y()+params_.resy_/2.);
+ bool status;
+
+ // verify compression option
+ if (params_.compression_[band] == TeNoCompression)
+ {
+ status = db_->insertRasterBlock(params_.fileName_,index,blockbb.lowerLeft(),blockbb.upperRight(),reinterpret_cast<unsigned char*>(block),bsize,band,res,subb);
+ return status;
+ }
+
+ unsigned long finalsize = bsize; // final size after compression
+ if (!memAux_)
+ {
+ long size = params_.blockHeight_ * params_.blockWidth_ * params_.elementSize();
+ memAux_ = new unsigned char[int(size*1.1 + 12.)];
+ }
+
+ if (params_.compression_[band] == TeZLib) // ZLib compression
+ {
+ // zlib needs some more space)
+ finalsize = (unsigned long)(bsize*1.1 + 12.);
+ compress (memAux_, &finalsize,reinterpret_cast<unsigned char*>(block),bsize);
+ }
+#ifdef WIN32
+ else if (params_.compression_[band] == TeJPEG) // JPEG compression
+ {
+ status = Jpeg::Compress(reinterpret_cast<unsigned char*>(block),memAux_,params_.blockWidth_,params_.blockHeight_,1,finalsize);
+ }
+#endif
+
+ status = db_->insertRasterBlock(params_.fileName_,index,blockbb.lowerLeft(),blockbb.upperRight(),memAux_,finalsize,band,res,subb);
+ return status;
+}
+
+bool
+TeDecoderDatabase::saveLUTTable()
+{
+ if (params_.lutName_.empty())
+ return false;
+ if (!db_ || !db_->createLUTTable(params_.lutName_))
+ return false;
+ for (unsigned int i=0; i<params_.lutb_.size(); i++)
+ {
+ string sql = "INSERT INTO " + params_.lutName_ + " VALUES(";
+ sql += Te2String(i) + ", ";
+ sql += Te2String(params_.lutr_[i]) + ", ";
+ sql += Te2String(params_.lutg_[i]) + ", ";
+ sql += Te2String(params_.lutb_[i]) + ")";
+ if (!db_->execute(sql))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDecoderDatabase::selectBlocks(TeBox& bb, int resFac, TeRasterParams& parBlock)
+{
+ if (!db_)
+ return false;
+
+ if (blockPortal_)
+ delete blockPortal_;
+
+ blockPortal_ = db_->getPortal();
+ if (!blockPortal_)
+ return false;
+
+ string sql;
+ string sel = db_->getSQLBoxSelect(params_.fileName_, TeRASTER);
+ string where = db_->getSQLBoxWhere (bb, TeRASTER);
+
+ sql = "SELECT "+ sel;
+ sql += " FROM " + params_.fileName_;
+ sql += " WHERE " + where + " AND resolution_factor= " + Te2String(resFac);
+ sql += " ORDER BY lower_x, lower_y, upper_x, upper_y, block_id";
+
+ if (!blockPortal_->query(sql))
+ {
+ delete blockPortal_;
+ blockPortal_ = 0;
+ return false;
+ }
+ nSelectedBlocks_ = blockPortal_->numRows();
+ parBlock.projection(params_.projection());
+ parBlock.resx_ = params_.resx_*resFac;
+ parBlock.resy_ = params_.resy_*resFac;
+ parBlock.nlines_ = params_.blockHeight_;
+ parBlock.ncols_= params_.blockWidth_;
+ parBlock.nBands(params_.nBands());
+ parBlock.dataType_ = params_.dataType_;
+ parBlock.dummy_ = params_.dummy_;
+ parBlock.useDummy_ = params_.useDummy_;
+ parBlock.photometric_ = params_.photometric_;
+ parBlock.vmax_ = params_.vmax_;
+ parBlock.vmin_ = params_.vmin_;
+ parBlock.lutr_ = params_.lutr_;
+ parBlock.lutg_ = params_.lutg_;
+ parBlock.lutb_ = params_.lutb_;
+ parBlock.interleaving_ = TePerBand;
+ return blockPortal_->fetchRow();
+}
+
+bool
+TeDecoderDatabase::getSelectedRasterBlock(TeDecoderMemory* memDec)
+{
+ if (!blockPortal_)
+ return 0;
+ unsigned long srcLen;
+ int i = 0;
+ if (!memAux_ )
+ {
+ long size = params_.blockHeight_ * params_.blockWidth_ * params_.elementSize();
+ memAux_ = new unsigned char[size];
+ }
+ int res;
+ TeBox bbBlock;
+ string blockId;
+ do
+ {
+ bbBlock = TeBox (blockPortal_->getDouble("lower_x"),blockPortal_->getDouble("lower_y"),
+ blockPortal_->getDouble("upper_x"),blockPortal_->getDouble("upper_y"));
+ blockId = blockPortal_->getData("block_id");
+ res = blockPortal_->getInt("resolution_factor");
+
+ int banda;
+ int l;
+ this->decodifyId(blockId,l,l,banda,l,l);
+ blockPortal_->getRasterBlock(srcLen,memAux_);
+
+ if (params_.compression_[banda] == TeZLib)
+ {
+ unsigned long destLen;
+ int status;
+ status = uncompress (reinterpret_cast<unsigned char*>(memDec->data(banda)),&destLen,memAux_,srcLen);
+ }
+#ifdef WIN32
+ else if (params_.compression_[banda] == TeJPEG)
+ {
+ int nbytes = params_.nbitsperPixel_[banda]/8;
+ int nb = 1;
+ bool status = Jpeg::ReadImage(params_.blockWidth_,params_.blockHeight_,nb,memAux_,srcLen,reinterpret_cast<unsigned char*>(memDec->data(banda)));
+ }
+#endif
+ else
+ memcpy(reinterpret_cast<unsigned char*>(memDec->data(banda)),reinterpret_cast<unsigned char*>(memAux_),srcLen);
+ i++;
+ }while (i<params_.nBands() && blockPortal_->fetchRow());
+
+ memDec->params().boundingBoxResolution(bbBlock.x1_,bbBlock.y1_,bbBlock.x2_,bbBlock.y2_,
+ params_.resx_*res,params_.resy_*res);
+ memDec->params().blockId_ = blockId;
+ return blockPortal_->fetchRow();
+}
+
+void
+TeDecoderDatabase::clearBlockSelection()
+{
+ if (blockPortal_)
+ delete blockPortal_;
+ blockPortal_ = 0;
+ nSelectedBlocks_ = 0;
+}
+
+int
+TeDecoderDatabase::bestResolution(TeBox& bb, int ncols, int nlines, TeProjection* proj)
+{
+ TeBox box = bb;
+ if (proj)
+ box = TeRemapBox(bb, proj, params_.projection());
+
+ double resx = box.width()/ncols;
+ double resy = box.height()/nlines;
+
+ double auxx = resx/params_.resx_;
+ double auxy = resy/params_.resy_;
+
+ int aux = (int) (min(auxx,auxy));
+
+ string sql = "SELECT resolution_factor FROM " + params_.fileName_;
+ sql += " WHERE resolution_factor <= " + Te2String(aux) + " ORDER BY resolution_factor DESC";
+
+ TeDatabasePortal* portal = params_.database_->getPortal();
+ if (!portal)
+ return 1;
+
+ if (!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return 1;
+ }
+
+ int res = atoi(portal->getData(0));
+ delete portal;
+ return res;
+}
+
+
diff --git a/src/terralib/kernel/TeDecoderDatabase.h b/src/terralib/kernel/TeDecoderDatabase.h
new file mode 100644
index 0000000..fb0c3a5
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderDatabase.h
@@ -0,0 +1,141 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderDatabase.h
+ This file deals with decoding of raster structures stored in a TerraLib database
+*/
+
+#ifndef __TERRALIB_INTERNAL_DECODERDATADASE_H
+#define __TERRALIB_INTERNAL_DECODERDATABASE_H
+
+#include "TeDecoderVirtualMemory.h"
+#include "TeDatabase.h"
+
+//! A concrete class to manipulate raster data stored in a TerraLib database
+/*
+ TeDecoderDatabase uses a virtual memory, to handle the raster blocks
+ (as proposed by the TerraLib data model to store raster data) traffic from
+ memory to database and vice versa.
+
+ \sa TeDatabase TeDecoderVirtualMemory
+*/
+class TeDecoderDatabase: public TeDecoderVirtualMemory
+{
+public:
+ //! Empty constructor
+ TeDecoderDatabase() :
+ db_(0),
+ blockPortal_(0),
+ memAux_(0),
+ nSelectedBlocks_(0)
+ { params_.decoderIdentifier_ = "DB"; }
+
+ //! Constructor from parameters
+ TeDecoderDatabase( const TeRasterParams& par );
+
+ //! Destructor
+ ~TeDecoderDatabase();
+
+ //! Sets the database pointer associated to this decoder
+ void setDB (TeDatabase* db)
+ { db_ = db; }
+
+ //! Initializes the decoder
+ virtual void init();
+
+ //! Creates the decoder
+ virtual bool create();
+
+ //! Clears the decoder
+ virtual bool clear();
+
+ //! Gets the raster block with index identifier
+ /*!
+ \param index tile unique identifier
+ \param buf pointer to a raster tile in memory
+ \param ulCol returns the column index of the upper-left corner of the block
+ \param ulLin returns the column index of the upper-left corner of the block
+ */
+ bool getRasterBlock(const string& index, void *buf, int& ulCol, int& ulLin);
+
+ //! Saves a raster tile from a virtual memory to permanent storage
+ /*!
+ \param index tile unique identifier
+ \param buf pointer to a raster tile in memory
+ \param bsize size of the block in bytes
+ */
+ bool putRasterBlock(const string& index, void *buf, long bsize);
+
+ string codifyId(int col, int lin, int band, int res, int subb);
+ void decodifyId(const string& id, int& col,int& lin, int& band, int& res, int& subb);
+
+ //! Saves the lut table of the raster associated to this decoder
+ bool saveLUTTable();
+
+ //! Search for tiles of image that intersects a certain bounding box in a given resolution
+ /*
+ \param bb bounding box that should be filled
+ \param resFac resolution factor that identify a level of resolution
+ \param parBlock returns the basic parameters of the selected tiles
+ \note Resolution factor in decoder database is a multiplier of the original resolution
+ and assume integer multiples of two. Smaller resolution has resolution factor
+ of 1 and the higher resolution have multiple of two values (2,4,8, 16...)
+ */
+ int bestResolution(TeBox& bb, int ncols, int nlines, TeProjection* proj);
+
+ //! Select the stored raster blocks with a certain resolution to fill a given bounding box
+ /*
+ \param bb bounding box that should be filled
+ \param the resolution factor desired
+ \param parBlock common parameters of the blocks selected
+ \returns TRUE if could select at least one block and FALSE otherwise
+ */
+ bool selectBlocks(TeBox& bb, int resFac, TeRasterParams& parBlock);
+
+ bool getSelectedRasterBlock(TeDecoderMemory* memDec);
+
+ void clearBlockSelection();
+
+ int numberOfSelectedBlocks()
+ { return nSelectedBlocks_; }
+
+private:
+ TeDatabase *db_;
+ TeDatabasePortal *blockPortal_;
+ unsigned char *memAux_;
+ int nSelectedBlocks_;
+};
+
+//! Implements a factory to build database decoders
+class TeDecoderDatabaseFactory : public TeDecoderFactory
+{
+public:
+
+ //! Constructor
+ TeDecoderDatabaseFactory(const string& name) : TeDecoderFactory(name) {}
+
+ //! Builds a database decoder
+ virtual TeDecoder* build (const TeRasterParams& arg)
+ { return new TeDecoderDatabase(arg); }
+};
+#endif
+
diff --git a/src/terralib/kernel/TeDecoderFile.cpp b/src/terralib/kernel/TeDecoderFile.cpp
new file mode 100644
index 0000000..b451408
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderFile.cpp
@@ -0,0 +1,363 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeDecoderFile.h>
+
+#ifdef WIN32
+static inline short swaps(short value)
+{
+ short svalue = ((value & 0x00ff) << 8) | ((value >> 8) & 0x00ff);
+ return svalue;
+}
+
+TeDecoderFile::TeDecoderFile ( const TeRasterParams& par )
+{
+ params_ = par;
+ dataInitPos_ = 0;
+ dataInitPos_ = par.offset_;
+ m_dwPosition = 0;
+ m_dwWordSize = params_.elementSize();
+ params_.blockHeight_ = 1;
+ params_.blockWidth_ = params_.ncols_;
+ params_.decoderIdentifier_ = "RAW";
+}
+
+TeDecoderFile::~TeDecoderFile ()
+{
+ if (m_hFile != NULL)
+ clear();
+}
+
+void
+TeDecoderFile::init()
+{
+ clear();
+
+ // First open the file
+ m_hFile = CreateFile(
+ params_.fileName_.c_str(), // File name
+ GENERIC_READ | GENERIC_WRITE, // Read-write
+ FILE_SHARE_READ
+ | FILE_SHARE_WRITE, // Allow sharing-- we're only doing a quick scan
+ NULL, // No security attributes
+ OPEN_EXISTING, // Only open an existing file
+ 0, // Ignore file attributes
+ NULL); // Ignore hTemplateFile
+
+ if (m_hFile == INVALID_HANDLE_VALUE)
+ return ; // could not open file
+
+// Get the file's size
+ m_dwSize = GetFileSize(m_hFile, NULL);
+ if (m_dwSize == 0xffffffff)
+ {
+ m_hFile = NULL;
+ return ;
+ }
+
+// Allocate buffer to get raster line from file
+
+ long mBufferSize = params_.ncols_;
+ if (params_.interleaving_ == TePerPixel)
+ mBufferSize *= params_.nBands();
+
+ switch (params_.dataType_[0]) {
+ case (TeUNSIGNEDCHAR):
+ m_buffer = new unsigned char[mBufferSize];
+ break;
+ case (TeCHAR) :
+ m_buffer = new char[mBufferSize];
+ break;
+ case (TeUNSIGNEDSHORT):
+ m_buffer = new unsigned short[mBufferSize];
+ break;
+ case (TeSHORT):
+ m_buffer = new short[mBufferSize];
+ break;
+ case (TeUNSIGNEDLONG):
+ m_buffer = new unsigned long[mBufferSize];
+ break;
+ case (TeLONG):
+ m_buffer = new long[mBufferSize];
+ break;
+ case (TeFLOAT):
+ m_buffer = new float[mBufferSize];
+ break;
+ case (TeDOUBLE):
+ m_buffer = new double[mBufferSize];
+ break;
+ }
+ if ( m_buffer == NULL )
+ return ;
+ else
+ return ;
+
+}
+
+bool
+TeDecoderFile::create()
+{
+ m_hFile = CreateFile(
+ params_.fileName_.c_str(), // File name
+ GENERIC_READ | GENERIC_WRITE, // Read-write
+ FILE_SHARE_READ
+ | FILE_SHARE_WRITE, // Allow sharing-- we're only doing a quick scan
+ NULL, // No security attributes
+ CREATE_NEW, // Open a new file
+ 0, // Ignore file attributes
+ NULL); // Ignore hTemplateFile
+
+ if ( m_hFile == INVALID_HANDLE_VALUE)
+ return false; // could not open file
+
+ char lpBuffer[1024];
+ unsigned long nNumberOfBytesToWrite=(long)params_.nBands() * (long)params_.ncols_ * (long)params_.nlines_; // number of bytes to write
+ nNumberOfBytesToWrite *= (long)params_.nbitsperPixel_[0]/8; // number of bytes to write
+ unsigned long nNumberOfBytesWritten; // pointer to number of bytes written
+
+ for (;nNumberOfBytesToWrite > 1024; nNumberOfBytesToWrite-=1024)
+ {
+ if ( !WriteFile(
+ m_hFile, // handle to file to write to
+ lpBuffer, // pointer to data to write to file
+ 1024, // number of bytes to write
+ &nNumberOfBytesWritten, // pointer to number of bytes written
+ NULL // pointer to structure for overlapped I/O
+ ))
+ return false; // could not write to file
+ }
+
+ if ( !WriteFile(
+ m_hFile, // handle to file to write to
+ lpBuffer, // pointer to data to write to file
+ nNumberOfBytesToWrite, // number of bytes to write
+ &nNumberOfBytesWritten, // pointer to number of bytes written
+ NULL // pointer to structure for overlapped I/O
+ ))
+ return false; // could not write to file
+
+ SetFilePointer (m_hFile, NULL, NULL, FILE_BEGIN);
+
+// Allocate buffer to get raster line from file
+
+ switch (params_.dataType_[0]) {
+ case (TeUNSIGNEDCHAR):
+ m_buffer = new unsigned char[params_.ncols_];
+ break;
+ case (TeCHAR) :
+ m_buffer = new char[params_.ncols_];
+ break;
+ case (TeUNSIGNEDSHORT):
+ m_buffer = new unsigned short[params_.ncols_];
+ break;
+ case (TeSHORT):
+ m_buffer = new short[params_.ncols_];
+ break;
+ case (TeUNSIGNEDLONG):
+ m_buffer = new unsigned long[params_.ncols_];
+ break;
+ case (TeLONG):
+ m_buffer = new long[params_.ncols_];
+ break;
+ case (TeFLOAT):
+ m_buffer = new float[params_.ncols_];
+ break;
+ case (TeDOUBLE):
+ m_buffer = new double[params_.ncols_];
+ break;
+ }
+
+ if ( m_buffer == NULL )
+ return false;
+
+ if (params_.dummy_[0])
+ {
+ for (int b=0; b<params_.nBands();b++)
+ for (int l=0; l<params_.nlines_;l++)
+ for (int c=0; c<params_.ncols_;c++)
+ setElement ( c, l, params_.dummy_[0], b);
+ }
+ return true;
+}
+
+bool
+TeDecoderFile::clear()
+{
+ if (!m_hFile)
+ return true;
+
+ CloseHandle(m_hFile);
+ m_hFile = NULL;
+ delete m_buffer;
+ m_buffer = 0;
+ params_.status_ = TeNOTREADY;
+ return true;
+}
+
+bool
+TeDecoderFile::getRasterBlock(const string& index, void *buf, int& ulCol, int& ulLin)
+{
+ int res, subb, band;
+ decodifyId(index,ulCol,ulLin,band,res,subb);
+
+ int nb = params_.nBands();
+ DWORD position;
+ DWORD nBytesToRead;
+ int inc, inic;
+ if (params_.interleaving_ == TePerPixel)
+ {
+ inc = nb;
+ inic = band;
+ position = dataInitPos_ + params_.ncols_*(nb*ulLin);
+ nBytesToRead = m_dwWordSize*params_.ncols_*nb;
+ }
+ else
+ {
+ inc = 1;
+ inic = 0;
+ position = dataInitPos_ + params_.ncols_*(nb*ulLin + band);
+ nBytesToRead = m_dwWordSize*params_.ncols_;
+ }
+ DWORD diff = position - m_dwPosition;
+ if (diff != 0)
+ m_dwPosition = SetFilePointer (m_hFile, diff, NULL, FILE_CURRENT);
+ unsigned long nBytesRead;
+ if (!ReadFile(m_hFile, m_buffer, nBytesToRead, &nBytesRead, NULL))
+ return false;
+ m_dwPosition += nBytesRead;
+
+ int i,n;
+ switch (params_.dataType_[0])
+ {
+ case (TeUNSIGNEDCHAR):
+ for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+ ((unsigned char*)buf)[n] = ((unsigned char*)m_buffer)[i];
+ break;
+ case (TeCHAR) :
+ for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+ ((char*)buf)[n] = ((char*)m_buffer)[i];
+ break;
+ case (TeUNSIGNEDSHORT):
+ for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+ ((unsigned short*)buf)[n] = ((unsigned short*)m_buffer)[i];
+ break;
+ case (TeSHORT):
+ for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+ ((short*)buf)[n] = ((short*)m_buffer)[i];
+ break;
+ case (TeUNSIGNEDLONG):
+ for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+ ((unsigned long*)buf)[n] = ((unsigned long*)m_buffer)[i];
+ break;
+ case (TeLONG):
+ for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+ ((long*)buf)[n] = ((long*)m_buffer)[i];
+ break;
+ case (TeFLOAT):
+ for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+ ((float*)buf)[n] = ((float*)m_buffer)[i];
+ break;
+ case (TeDOUBLE):
+ for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+ ((double*)buf)[n] = ((double*)m_buffer)[i];
+ break;
+ }
+
+ return true;
+}
+
+bool
+TeDecoderFile::putRasterBlock(const string& index, void *buf, long bsize)
+{
+ int res, subb, band,ulCol,ulLin;
+ decodifyId(index,ulCol,ulLin,band,res,subb);
+
+ DWORD position = dataInitPos_ + params_.ncols_*(params_.nBands()*ulLin + band);
+ DWORD diff = position - m_dwPosition;
+ if (diff != 0)
+ SetFilePointer (m_hFile, diff, NULL, FILE_CURRENT);
+ DWORD nBytesToWrite = m_dwWordSize*params_.ncols_,
+ nBytesWritten;
+ int i;
+ switch (params_.dataType_[0])
+ {
+ case (TeUNSIGNEDCHAR):
+ for (i=0;i<params_.ncols_;i++)
+ ((unsigned char*)m_buffer)[i] = ((unsigned char*)buf)[i];
+ break;
+ case (TeCHAR) :
+ for (i=0;i<params_.ncols_;i++)
+ ((char*)m_buffer)[i] = ((char*)buf)[i];
+ break;
+ case (TeUNSIGNEDSHORT):
+ for (i=0;i<params_.ncols_;i++)
+ ((unsigned short*)m_buffer)[i] = ((unsigned short*)buf)[i];
+ break;
+ case (TeSHORT):
+ for (i=0;i<params_.ncols_;i++)
+ ((short*)m_buffer)[i] = ((short*)buf)[i];
+ break;
+ case (TeUNSIGNEDLONG):
+ for (i=0;i<params_.ncols_;i++)
+ ((unsigned long*)m_buffer)[i] = ((unsigned long*)buf)[i];
+ break;
+ case (TeLONG):
+ for (i=0;i<params_.ncols_;i++)
+ ((long*)m_buffer)[i] = ((long*)buf)[i];
+ break;
+ case (TeFLOAT):
+ for (i=0;i<params_.ncols_;i++)
+ ((float*)m_buffer)[i] = ((float*)buf)[i];
+ break;
+ case (TeDOUBLE):
+ memcpy (m_buffer,buf,params_.ncols_);
+ break;
+ }
+
+ if (!WriteFile(m_hFile, m_buffer, nBytesToWrite, &nBytesWritten, NULL))
+ return false;
+
+ m_dwPosition += nBytesWritten;
+
+ return true;
+}
+
+string
+TeDecoderFile::codifyId(int col, int lin, int band, int res, int subb)
+{
+ char id[32];
+ sprintf(id,"Y%dB%d",lin,band);
+ return string(id);
+
+}
+
+void
+TeDecoderFile::decodifyId(const string& id, int& col,int& lin, int& band, int& res, int& subb)
+{
+ char lixo;
+ sscanf(id.c_str(),"%1c%d%1c%d",&lixo,&lin,&lixo,&band);
+ col = 0;
+ res = 1;
+ subb = 0;
+}
+#endif
diff --git a/src/terralib/kernel/TeDecoderFile.h b/src/terralib/kernel/TeDecoderFile.h
new file mode 100644
index 0000000..ef18088
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderFile.h
@@ -0,0 +1,73 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderFile.h
+ This file deals with decoding of raster structures in a binary file
+*/
+#ifndef __TERRALIB_INTERNAL_DECODERFILE_H
+#define __TERRALIB_INTERNAL_DECODERFILE_H
+
+#ifdef WIN32
+#include "TeDecoderVirtualMemory.h"
+#include <windows.h>
+#include <winbase.h>
+
+//! Implements decoder to raster data stored in a file in a binary raw format
+class TeDecoderFile : public TeDecoderVirtualMemory
+{
+public:
+ TeDecoderFile ( const TeRasterParams& );
+ ~TeDecoderFile ();
+
+ void init ();
+ bool create ();
+ bool clear ();
+
+ bool getRasterBlock(const string& index, void *buf, int& ulCol, int& ulLin);
+ bool putRasterBlock(const string& index, void *buf, long bsize);
+ string codifyId(int col, int lin, int band, int res, int subb);
+ void decodifyId(const string& id, int& col,int& lin, int& band, int& res, int& subb);
+
+private:
+
+ unsigned long dataInitPos_;
+ HANDLE m_hFile; // Handle to file we're currently zapping
+ LPVOID m_buffer; // Pointer to view of file mapped to memory
+ DWORD m_dwSize; // File size in bytes
+ DWORD m_dwPosition; // Current file pointer position
+ DWORD m_dwWordSize; // word size in bytes
+};
+
+//! Implements a factory to build file decoders
+class TeDecoderFileFactory : public TeDecoderFactory
+{
+public:
+
+ TeDecoderFileFactory(const string& name) : TeDecoderFactory(name) {}
+
+ //! Builds a database decoder
+ virtual TeDecoder* build (const TeRasterParams& arg)
+ { return new TeDecoderFile(arg); }
+};
+
+#endif
+#endif
diff --git a/src/terralib/kernel/TeDecoderJPEG.cpp b/src/terralib/kernel/TeDecoderJPEG.cpp
new file mode 100644
index 0000000..bc2ff95
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderJPEG.cpp
@@ -0,0 +1,184 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeException.h"
+#include "TeDecoderJPEG.h"
+#include "TeAsciiFile.h"
+#include "TeUtils.h"
+#include <jpeg.h>
+#include <io.h>
+
+TeDecoderJPEG::TeDecoderJPEG (const TeRasterParams& par) :
+ TeDecoderMemory()
+{
+ params_ = par;
+ // if openning an existent file, read its informations
+ if (params_.mode_ == 'w' || params_.mode_ == 'r')
+ {
+ int nb;
+ if (!Jpeg::ReadFileParams(params_.ncols_ , params_.nlines_ , nb , (char*)params_.fileName_.c_str()))
+ return;
+
+ params_.nBands(nb);
+ params_.setDataType(TeUNSIGNEDCHAR);
+ params_.setPhotometric(TeRASTERMULTIBAND);
+ params_.decoderIdentifier_ = "JPEG";
+ params_.blockWidth_ = params_.ncols_;
+ params_.blockHeight_ = params_.nlines_;
+ TeProjection* proj = new TeNoProjection();
+ params_.projection(proj);
+ delete proj;
+
+ // Try reading box from auxiliary file
+ string filePrefix = TeGetName(params_.fileName_.c_str());
+ string jgw = filePrefix+".jgw";
+ try
+ {
+ TeAsciiFile pFile (jgw);
+ double dyj, dxi, x0, y0;
+
+ params_.resx_ = pFile.readFloat();
+ dyj = pFile.readFloat(); // ignored
+ dxi = pFile.readFloat(); // ignored
+ params_.resy_ = -1 * pFile.readFloat();
+ x0 = pFile.readFloat();
+ y0 = pFile.readFloat();
+
+ // IMPORTANT: we discard any rotation or translation defined in the
+ // .jgw file! It should be treated properly later
+ params_.topLeftResolutionSize(x0,y0,params_.resx_,params_.resy_,
+ params_.ncols_,params_.nlines_,true);
+ }
+ catch (...)
+ {
+ // no .jgw inexistent or inconsistent, uses resolution of 1 unit
+ // and box lower left coordinate of (0.5,0.5)
+ params_.lowerLeftResolutionSize(0.5,0.5,1.0,1.0,params_.ncols_,params_.nlines_,true);
+ }
+ }
+}
+
+TeDecoderJPEG::~TeDecoderJPEG ()
+{
+ if ( isModified_ && (params_.mode_ == 'w' || params_.mode_ == 'c') ) // save contents to disk
+ {
+ int nb = params_.nBands();
+ int nc = params_.fileName_.size();
+ char* name = new char[nc+1];
+ strcpy(name,params_.fileName_.c_str());
+ int i = _access(params_.fileName_.c_str(),06);
+ i = _unlink(params_.fileName_.c_str());
+ Jpeg::WriteFile((unsigned char*)data_,params_.ncols_,params_.nlines_,nb,name);
+ }
+ TeDecoderMemory::clear();
+}
+
+
+bool
+TeDecoderJPEG::clear()
+{
+ if (data_ == 0)
+ return true;
+
+ if ( isModified_ && (params_.mode_ == 'w' || params_.mode_ == 'c') ) // save contents to disk
+ {
+ int nb = params_.nBands();
+ int nc = params_.fileName_.size();
+ char* name = new char[nc+1];
+ strcpy(name,params_.fileName_.c_str());
+ Jpeg::WriteFile((unsigned char*)data_,params_.ncols_,params_.nlines_,nb,name);
+ isModified_ = 0;
+ }
+ TeDecoderMemory::clear();
+ return true;
+}
+
+
+void
+TeDecoderJPEG::init()
+{
+ params_.status_= TeNOTREADY;
+ int nb = params_.nBands();
+ if (nb != 1 && nb != 3)
+ return;
+
+ // try to allocate enough memory to hold the data
+ TeDecoderMemory::init();
+ if (params_.status_== TeNOTREADY)
+ return;
+
+ params_.status_= TeNOTREADY;
+ if (params_.mode_ == 'c') // creating a new file
+ {
+ if (_access(params_.fileName_.c_str(),00) != -1) // remove existing file
+ {
+ if (_unlink(params_.fileName_.c_str()) == -1)
+ return;
+ }
+ // write georeference file
+ string filePrefix = TeGetName (params_.fileName_.c_str());
+ string jgw = filePrefix+".jgw";
+
+ try {
+ TeAsciiFile jgwFile(jgw,"w+");
+ string line;
+ line = Te2String(params_.resx_) + "\n";
+ jgwFile.writeString(line);
+ line = "0.0\n";
+ jgwFile.writeString(line);
+ jgwFile.writeString(line);
+ line = Te2String(params_.resy_ * -1.) + "\n";
+ jgwFile.writeString(line);
+ line = Te2String(params_.box().x1_) + "\n";
+ jgwFile.writeString(line);
+ line = Te2String(params_.box().y2_) + "\n";
+ jgwFile.writeString(line);
+ }
+ catch(...)
+ {}
+ // write data
+ int nc = params_.fileName_.size();
+ char* name = new char[nc+1];
+ strcpy(name,params_.fileName_.c_str());
+
+ if (!Jpeg::WriteFile((unsigned char*)data_,params_.ncols_,params_.nlines_,nb,name))
+ return;
+ params_.status_ = TeREADYTOWRITE;
+ }
+ else if (params_.mode_ == 'w')
+ {
+ int i = _access(params_.fileName_.c_str(),06);
+ if (i == -1)
+ return;
+// if (!Jpeg::ReadFile(params_.ncols_, params_.nlines_, params_.nBands(), (char*)params_.fileName_.c_str(), (unsigned char*) data_))
+// return;
+ params_.status_ = TeREADYTOWRITE;
+ i = _access(params_.fileName_.c_str(),06);
+ }
+ else if (params_.mode_ == 'r')
+ {
+ if ((_access(params_.fileName_.c_str(),04) == -1) || !Jpeg::ReadFile(params_.ncols_, params_.nlines_, params_.nBands(), (char*)params_.fileName_.c_str(), (unsigned char*) data_))
+ return;
+ params_.status_ = TeREADYTOREAD;
+ }
+}
diff --git a/src/terralib/kernel/TeDecoderJPEG.h b/src/terralib/kernel/TeDecoderJPEG.h
new file mode 100644
index 0000000..c3d1e26
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderJPEG.h
@@ -0,0 +1,68 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderJPEG.h
+ This file deals with decoding of raster structures in JPEG format
+*/
+#ifndef __TERRALIB_INTERNAL_DECODERJPEG_H
+#define __TERRALIB_INTERNAL_DECODERJPEG_H
+
+#include "TeDecoderMemory.h"
+
+//! Implements a decoder for rasters in JPEG format
+/*
+ In order to be accessed a raster in JPEG format is decompressed
+ in memory and its pixels acessed directly.
+*/
+class TeDecoderJPEG : public TeDecoderMemory
+{
+public:
+ //! Empty constructor
+ TeDecoderJPEG () : TeDecoderMemory()
+ { params_.decoderIdentifier_ = "JPEG"; }
+
+ //! Constructor from some parameters
+ TeDecoderJPEG (const TeRasterParams& par);
+
+ //! Destructor
+ ~TeDecoderJPEG ();
+
+ void init();
+
+ bool clear();
+
+};
+
+//! Implements a factory to build decoders to JPEG raster
+class TeDecoderJPEGFactory : public TeDecoderFactory
+{
+public:
+
+ TeDecoderJPEGFactory(const string& name) : TeDecoderFactory(name) {}
+
+ virtual TeDecoder* build (const TeRasterParams& arg)
+ { return new TeDecoderJPEG(arg); }
+
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeDecoderMemory.cpp b/src/terralib/kernel/TeDecoderMemory.cpp
new file mode 100644
index 0000000..931eeac
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderMemory.cpp
@@ -0,0 +1,339 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeDecoderMemory.h"
+
+TeDecoderMemory::~TeDecoderMemory ()
+{
+ if (data_ != 0)
+ clear();
+}
+
+void*
+TeDecoderMemory::data (int band)
+{
+ if (band==0)
+ return data_;
+ if (params_.interleaving_ != TePerBand)
+ return 0;
+
+ void* pt = 0;
+ switch (params_.dataType_[band]) {
+ case TeUNSIGNEDCHAR:
+ pt = reinterpret_cast<unsigned char*>(data_) + (params_.ncols_ * params_.nlines_*band);
+ break;
+ case TeCHAR :
+ pt = reinterpret_cast<char*>(data_) + (params_.ncols_ * params_.nlines_*band);
+ break;
+ case TeUNSIGNEDSHORT:
+ pt = reinterpret_cast<unsigned short*>(data_) + (params_.ncols_ * params_.nlines_*band);
+ break;
+ case (TeSHORT):
+ pt = reinterpret_cast<short*>(data_) + (params_.ncols_ * params_.nlines_*band);
+ break;
+ case (TeUNSIGNEDLONG):
+ pt = reinterpret_cast<unsigned long*>(data_) + (params_.ncols_ * params_.nlines_*band);
+ break;
+ case (TeLONG):
+ pt = reinterpret_cast<long*>(data_) + (params_.ncols_ * params_.nlines_*band);
+ break;
+ case (TeFLOAT):
+ pt = reinterpret_cast<float*>(data_) + (params_.ncols_ * params_.nlines_*band);
+ break;
+ case (TeDOUBLE):
+ pt = reinterpret_cast<double*>(data_) + (params_.ncols_ * params_.nlines_*band);
+ break;
+ default:
+ break;
+ }
+ return (void*) pt;
+}
+
+void
+TeDecoderMemory::init()
+{
+ params_.status_= TeNOTREADY;
+ if ( !data_ || nelems_ != (params_.ncols_ * params_.nlines_ * params_.nBands()))
+ {
+ clear();
+ nelems_ = params_.ncols_ * params_.nlines_ * params_.nBands();
+ if (!allocateMemory() || !resetMemory())
+ return;
+ }
+
+ if (params_.mode_ == 'c' || params_.mode_ == 'w') // creating a new file
+ {
+ if (resetMemory())
+ params_.status_ = TeREADYTOWRITE;
+ }
+ else if (params_.mode_ == 'r')
+ params_.status_ = TeREADYTOREAD;
+}
+
+
+bool
+TeDecoderMemory::allocateMemory()
+{
+ // Allocate necessary memory
+ switch (params_.dataType_[0]) {
+ case (TeUNSIGNEDCHAR):
+ data_ = new unsigned char [nelems_];
+ if (!data_)
+ return false;
+ break;
+ case (TeCHAR) :
+ data_ = new char [nelems_];
+ if (!data_)
+ return false;
+ break;
+ case (TeUNSIGNEDSHORT):
+ data_ = new unsigned short [nelems_];
+ if (!data_)
+ return false;
+ break;
+ case (TeSHORT):
+ data_ = new short [nelems_];
+ if (!data_)
+ return false;
+ break;
+ case (TeUNSIGNEDLONG):
+ data_ = new unsigned long [nelems_];
+ if (!data_)
+ return false;
+ break;
+ case (TeLONG):
+ data_ = new long [nelems_];
+ if (!data_)
+ return false;
+ break;
+ case (TeFLOAT):
+ data_ = new float [nelems_];
+ if (!data_)
+ return false;
+ break;
+ case (TeDOUBLE):
+ data_ = new double [nelems_];
+ if (!data_)
+ return false;
+ break;
+ default:
+ break;
+ }
+ if (data_)
+ return true;
+ else
+ return false;
+}
+
+
+bool
+TeDecoderMemory::resetMemory()
+{
+ if (!data_)
+ return false;
+
+ int i;
+ switch (params_.dataType_[0]) {
+ case (TeUNSIGNEDCHAR):
+ for(i=0; i<nelems_; reinterpret_cast<unsigned char*>(data_)[i]=static_cast<unsigned char>(params_.dummy_[0]),++i);
+ size_ = nelems_ * sizeof(unsigned char);
+ break;
+ case (TeCHAR) :
+ for(i=0; i<nelems_; reinterpret_cast<char*>(data_)[i]=static_cast<char>(params_.dummy_[0]),++i);
+ size_ = nelems_ * sizeof(char);
+ break;
+ case (TeUNSIGNEDSHORT):
+ for(i=0; i<nelems_; reinterpret_cast<unsigned short*>(data_)[i]=static_cast<unsigned short>(params_.dummy_[0]),++i);
+ size_ = nelems_ * sizeof(unsigned short);
+ break;
+ case (TeSHORT):
+ for(i=0; i<nelems_; reinterpret_cast<short*>(data_)[i]=static_cast<short>(params_.dummy_[0]),++i);
+ size_ = nelems_ * sizeof(short);
+ break;
+ case (TeUNSIGNEDLONG):
+ for(i=0; i<nelems_; reinterpret_cast<unsigned long*>(data_)[i]=static_cast<unsigned long>(params_.dummy_[0]),++i);
+ size_ = nelems_ * sizeof(unsigned long);
+ break;
+ case (TeLONG):
+ for(i=0; i<nelems_; reinterpret_cast<long*>(data_)[i]=static_cast<long>(params_.dummy_[0]),++i);
+ size_ = nelems_ * sizeof(long);
+ break;
+ case (TeFLOAT):
+ for(i=0; i<nelems_; reinterpret_cast<float*>(data_)[i]=static_cast<float>(params_.dummy_[0]),++i);
+ size_ = nelems_ * sizeof(float);
+ break;
+ case (TeDOUBLE):
+ for(i=0; i<nelems_; reinterpret_cast<double*>(data_)[i]=params_.dummy_[0],++i);
+ size_ = nelems_ * sizeof(double);
+ break;
+ default:
+ break;
+ }
+ return true;
+}
+
+bool
+TeDecoderMemory::clear()
+{
+ if (data_ == 0)
+ return true;
+ switch (params_.dataType_[0])
+ {
+ case (TeUNSIGNEDCHAR):
+ delete [](unsigned char*)data_;
+ break;
+ case (TeCHAR) :
+ delete (char*)data_;
+ break;
+ case (TeUNSIGNEDSHORT):
+ delete [](unsigned short*)data_;
+ break;
+ case (TeSHORT):
+ delete (short*) data_;
+ break;
+ case (TeUNSIGNEDLONG):
+ delete [](unsigned long*)data_;
+ break;
+ case (TeLONG):
+ delete [](long*) data_;
+ break;
+ case (TeFLOAT):
+ delete [](float*)data_;
+ break;
+ case (TeDOUBLE):
+ delete [](double*) data_;
+ break;
+ default:
+ break;
+ }
+ data_ = 0;
+ params_.status_ = TeNOTREADY;
+ return true;
+}
+
+bool
+TeDecoderMemory::getElement (int col,int lin, double& val,int band)
+{
+ unsigned int position = 0;
+
+ switch (params_.interleaving_)
+ {
+ case TePerPixel:
+ position = params_.nBands()*(params_.ncols_*lin+col)+band;
+ break;
+ case TePerLine:
+ position = (params_.nBands()*params_.ncols_*lin)+band*params_.ncols_+col;
+ break;
+ case TePerBand:
+ position = band*(params_.ncols_*params_.nlines_)+(params_.ncols_*lin+col);
+ break;
+ }
+ switch (params_.dataType_[0])
+ {
+ case (TeUNSIGNEDCHAR):
+ val = reinterpret_cast<unsigned char*>(data_)[position];
+ break;
+ case (TeCHAR) :
+ val = reinterpret_cast<char*>(data_)[position];
+ break;
+ case (TeUNSIGNEDSHORT):
+ val = reinterpret_cast<unsigned short*>(data_)[position];
+ break;
+ case (TeSHORT):
+ val = reinterpret_cast<short*>(data_)[position];
+ break;
+ case (TeUNSIGNEDLONG):
+ val = reinterpret_cast<unsigned long*>(data_)[position];
+ break;
+ case (TeLONG):
+ val = reinterpret_cast<long*>(data_)[position];
+ break;
+ case (TeFLOAT):
+ val = reinterpret_cast<float*>(data_)[position];
+ break;
+ case (TeDOUBLE):
+ val = reinterpret_cast<double*>(data_)[position];
+ break;
+ default:
+ break;
+ }
+ return true;
+}
+
+bool
+TeDecoderMemory::setElement (int col, int lin, double val,int band)
+{
+ unsigned int position = 0;
+ switch (params_.interleaving_)
+ {
+ case TePerPixel:
+ position = params_.nBands()*(params_.ncols_*lin+col)+band;
+ break;
+ case TePerLine:
+ position = (params_.nBands()*params_.ncols_*lin)+band*params_.ncols_+col;
+ break;
+ case TePerBand:
+ position = band*(params_.ncols_*params_.nlines_)+(params_.ncols_*lin+col);
+ break;
+ }
+
+ switch (params_.dataType_[0])
+ {
+ case (TeUNSIGNEDCHAR):
+ reinterpret_cast<unsigned char*>(data_)[position] = static_cast<unsigned char>(val);
+ break;
+
+ case (TeCHAR) :
+ reinterpret_cast<char*>(data_)[position] = static_cast<char>(val);
+ break;
+
+ case (TeUNSIGNEDSHORT):
+ reinterpret_cast<unsigned short*>(data_)[position] = static_cast<unsigned short>(val);
+ break;
+
+ case (TeSHORT):
+ reinterpret_cast<short*>(data_)[position] = static_cast<short>(val);
+ break;
+
+ case (TeUNSIGNEDLONG):
+ reinterpret_cast<unsigned long*>(data_)[position] = static_cast<unsigned long>(val);
+ break;
+
+ case (TeLONG):
+ reinterpret_cast<long*>(data_)[position] = static_cast<long>(val);
+ break;
+
+ case (TeFLOAT):
+ reinterpret_cast<float*>(data_)[position] = static_cast<float>(val);
+ break;
+
+ case (TeDOUBLE):
+ reinterpret_cast<double*>(data_)[position] = val;
+
+ default:
+ break;
+ }
+ isModified_ = true;
+ return true;
+}
+
diff --git a/src/terralib/kernel/TeDecoderMemory.h b/src/terralib/kernel/TeDecoderMemory.h
new file mode 100644
index 0000000..cb981fc
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderMemory.h
@@ -0,0 +1,90 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderMemory.h
+ This file deals with decoding of raster structures as a mulitdimensional matrix in memory
+*/
+#ifndef __TERRALIB_INTERNAL_DECODERMEMORY_H
+#define __TERRALIB_INTERNAL_DECODERMEMORY_H
+
+#include <TeDecoder.h>
+
+//! Implements a decoder to a raster stored as a as a mulitdimensional matrix in memory
+class TeDecoderMemory : public TeDecoder
+{
+ bool allocateMemory();
+ bool resetMemory();
+
+public:
+
+ //! Empty constructor
+ TeDecoderMemory ( ) :
+ data_(0),
+ isModified_(false)
+ { params_.decoderIdentifier_ = "MEM";};
+
+ //! Constructor from parameters
+ TeDecoderMemory ( const TeRasterParams& par ) :
+ data_(0),
+ isModified_(false)
+ {
+ params_ = par;
+ params_.decoderIdentifier_ = "MEM";
+ };
+
+ //! Destructor
+ virtual ~TeDecoderMemory ();
+
+ bool setElement (int col,int lin, double val, int band=0);
+ bool getElement (int col,int lin, double &val,int band=0);
+
+ //! Returns the pointer to the matrix structure in memory
+ void* data () { return data_; }
+
+ //! Retuns a ponter to a given band
+ void* data (int band=0);
+
+ virtual void init ();
+ virtual bool clear ();
+
+ void setModified(bool val)
+ { isModified_ = val; }
+
+protected:
+ int nelems_;
+ int size_;
+ void* data_; //!< Pointer to view of file mapped to memory
+ bool isModified_;
+};
+
+//! Implements a factory to build decoder to MEMORY raster
+class TeDecoderMemoryFactory : public TeDecoderFactory
+{
+public:
+
+ TeDecoderMemoryFactory(const string& name) : TeDecoderFactory(name) {}
+
+ virtual TeDecoder* build (const TeRasterParams& arg)
+ { return new TeDecoderMemory(arg); }
+};
+#endif
+
diff --git a/src/terralib/kernel/TeDecoderMemoryMap.cpp b/src/terralib/kernel/TeDecoderMemoryMap.cpp
new file mode 100644
index 0000000..4468533
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderMemoryMap.cpp
@@ -0,0 +1,664 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeDecoderMemoryMap.h"
+#include "TeUtils.h"
+#include "TeAsciiFile.h"
+#include <map>
+#include <string>
+
+static inline short swaps(short value)
+{
+ short svalue = ((value & 0x00ff) << 8) | ((value >> 8) & 0x00ff);
+ return svalue;
+}
+
+TeDecoderMemoryMap::TeDecoderMemoryMap ( const TeRasterParams& par )
+{
+ params_ = par;
+ dataInitPos_ = 0;
+ dataInitPos_ = par.offset_;
+ m_lpszFile = 0;
+ m_hFile = 0;
+ params_.decoderIdentifier_ = "MEMMAP";
+}
+
+TeDecoderMemoryMap::~TeDecoderMemoryMap ()
+{
+ if (m_hFile != 0)
+ clear();
+}
+bool
+TeDecoderMemoryMap::getElement (int col,int lin, double& val,int band)
+{
+ unsigned long position = dataInitPos_+(unsigned long)params_.nBands()*(unsigned long)(params_.ncols_*lin+col)+band;
+ switch (params_.dataType_[0])
+ {
+ case (TeUNSIGNEDCHAR):
+ val = ((unsigned char*)m_lpszFile)[position];
+ break;
+ case (TeCHAR) :
+ val = ((char*) m_lpszFile)[position];
+ break;
+ case (TeUNSIGNEDSHORT):
+ unsigned short uval;
+ if (params_.swap_)
+ uval = swaps(((unsigned short*)m_lpszFile)[position]);
+ else
+ uval = ((unsigned short*)m_lpszFile)[position];
+ val = uval;
+ break;
+ case (TeSHORT):
+ if (params_.swap_)
+ val = swaps(((short*)m_lpszFile)[position]);
+ else
+ val = ((short*)m_lpszFile)[position];
+ break;
+ case (TeINTEGER):
+ val = ((int*)m_lpszFile)[position];
+ case (TeUNSIGNEDLONG):
+ val = ((unsigned long*)m_lpszFile)[position];
+ break;
+ case (TeLONG):
+ val = ((long*)m_lpszFile)[position];
+ break;
+ case (TeFLOAT):
+ val = ((float*)m_lpszFile)[position];
+ break;
+ case (TeDOUBLE):
+ val = ((double*)m_lpszFile)[position];
+ break;
+ default:
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDecoderMemoryMap::setElement (int col,int lin, double val, int band)
+{
+ unsigned int position = dataInitPos_+params_.nBands()*(params_.ncols_*lin+col)+band;
+ switch (params_.dataType_[0])
+ {
+ case (TeUNSIGNEDCHAR):
+ ((unsigned char*)m_lpszFile)[position] = (unsigned char) val;
+ break;
+
+ case (TeCHAR) :
+ ((char*) m_lpszFile)[position] = (char) val;
+ break;
+
+ case (TeUNSIGNEDSHORT):
+ ((unsigned short*)m_lpszFile)[position] = (unsigned short) val;
+ break;
+
+ case (TeSHORT):
+ if (params_.swap_)
+ ((short*)m_lpszFile)[position] = swaps((short) val);
+ else
+ ((short*)m_lpszFile)[position] = (short) val;
+ break;
+
+ case (TeINTEGER):
+ ((int*)m_lpszFile)[position] = (int) val;
+ break;
+
+ case (TeUNSIGNEDLONG):
+ ((unsigned long*)m_lpszFile)[position] = (unsigned long) val;
+ break;
+
+ case (TeLONG):
+ ((long*)m_lpszFile)[position] = (long) val;
+ break;
+
+ case (TeFLOAT):
+ ((float*)m_lpszFile)[position] = (float) val;
+ break;
+
+ case (TeDOUBLE):
+ ((double*)m_lpszFile)[position] = val;
+ default:
+ return false;
+ }
+ return true;
+}
+
+void
+TeDecoderMemoryMap::writeMetadataFile()
+{
+ string metFileName = TeGetName (params_.fileName_.c_str())+".met";
+ try {
+ TeAsciiFile metFile(metFileName,"w");
+ string line = "%Raw raster file metadata\n";
+ metFile.writeString(line);
+ line = "NROWS " + Te2String(params_.nlines_);
+ metFile.writeString(line);
+ metFile.writeNewLine();
+ line = "NCOLS " + Te2String(params_.ncols_);
+ metFile.writeString(line);
+ metFile.writeNewLine();
+ line = "NBANDS " + Te2String(params_.nBands());
+ metFile.writeString(line);
+ metFile.writeNewLine();
+
+ if (params_.nBands() > 1)
+ {
+ line = "INTERLEAVING ";
+ if (params_.interleaving_ == TePerPixel)
+ line += "perpixel";
+ else if (params_.interleaving_ == TePerLine)
+ line += "perline";
+ else
+ line += "perband";
+ metFile.writeString(line);
+ metFile.writeNewLine();
+ }
+
+ line = "DATATYPE ";
+ if (params_.dataType_[0] == TeBIT)
+ line += "bit";
+ else if (params_.dataType_[0] == TeUNSIGNEDCHAR)
+ line += "unsignedchar";
+ else if (params_.dataType_[0] == TeCHAR)
+ line += "char";
+ else if (params_.dataType_[0] == TeUNSIGNEDSHORT)
+ line += "unsignedshort";
+ else if (params_.dataType_[0] == TeSHORT)
+ line += "short";
+ else if (params_.dataType_[0] == TeINTEGER)
+ line += "integer";
+ else if (params_.dataType_[0] == TeUNSIGNEDLONG)
+ line += "unsignedlong";
+ else if (params_.dataType_[0] == TeLONG)
+ line += "long";
+ else if (params_.dataType_[0] == TeFLOAT)
+ line += "float";
+ else if (params_.dataType_[0] == TeDOUBLE)
+ line += "double";
+ metFile.writeString(line);
+ metFile.writeNewLine();
+
+ if (params_.swap_)
+ {
+ line = "SWAPPED yes";
+ metFile.writeString(line);
+ metFile.writeNewLine();
+ }
+
+ if (params_.useDummy_)
+ {
+ line += "NO_DATA " + Te2String(params_.dummy_[0]);
+ metFile.writeString(line);
+ metFile.writeNewLine();
+ }
+
+ line = "RESOLUTION_X " + Te2String(params_.resx_);
+ metFile.writeString(line);
+ metFile.writeNewLine();
+ line = "RESOLUTION_Y " + Te2String(params_.resy_);
+ metFile.writeString(line);
+ metFile.writeNewLine();
+ line = "LOWERLEFT_X " + Te2String(params_.box().x1_);
+ metFile.writeString(line);
+ metFile.writeNewLine();
+ line = "LOWERLEFT_Y " + Te2String(params_.box().y1_);
+ metFile.writeString(line);
+ metFile.writeNewLine();
+ line = "PROJECTION " + params_.projection()->name() + " ";
+ line += params_.projection()->describe();
+ metFile.writeString(line);
+ metFile.writeNewLine();
+ line = "DATUM " + params_.projection()->datum().name();
+ metFile.writeString(line);
+ metFile.writeNewLine();
+ }
+ catch(...)
+ {
+ }
+}
+
+void
+TeDecoderMemoryMap::readMetadataFile()
+{
+ // read all keys in the metadata file (there is no order expected)
+ string metFileName = TeGetName (params_.fileName_.c_str())+".met";
+ map<string,string> metadata;
+ try {
+ TeAsciiFile metFile(metFileName,"r");
+ string key, value;
+ while (metFile.isNotAtEOF())
+ {
+ key = metFile.readString();
+ if (key[0] == '%')
+ {
+ metFile.findNewLine();
+ continue;
+ }
+ value = metFile.readString();
+ metadata.insert(make_pair(key,value));
+ metFile.findNewLine();
+ }
+ }
+ catch(...)
+ {
+ }
+ if (!metadata.empty())
+ {
+ double xll=0, yll=0;
+ map<string,string>::iterator it;
+ it = metadata.find("NROWS");
+ if (it != metadata.end())
+ params_.nlines_ = atoi(it->second.c_str());
+ it = metadata.find("NCOLS");
+ if (it != metadata.end())
+ params_.ncols_ = atoi(it->second.c_str());
+ it = metadata.find("NBANDS");
+ if (it != metadata.end())
+ params_.nBands(atoi(it->second.c_str()));
+ else
+ params_.nBands(1);
+ it = metadata.find("RESOLUTION_X");
+ if (it != metadata.end())
+ params_.resx_ = atof(it->second.c_str());
+ it = metadata.find("RESOLUTION_Y");
+ if (it != metadata.end())
+ params_.resy_ = atof(it->second.c_str());
+ it = metadata.find("LOWERLEFT_X");
+ if (it != metadata.end())
+ {
+ xll = atof(it->second.c_str());
+ it = metadata.find("LOWERLEFT_Y");
+ if (it != metadata.end())
+ {
+ yll = atof(it->second.c_str());
+ params_.lowerLeftResolutionSize(xll,yll, params_.resx_, params_.resy_,
+ params_.ncols_, params_.nlines_);
+ }
+ }
+
+ it = metadata.find("INTERLEAVING");
+ if (it != metadata.end())
+ {
+ if (it->second == "perline")
+ params_.interleaving_ = TePerLine;
+ else if (it->second == "perband")
+ params_.interleaving_ = TePerBand;
+ else params_.interleaving_ = TePerPixel;
+ }
+
+ it = metadata.find("DATATYPE");
+ if (it != metadata.end())
+ {
+ if (it->second == "bit")
+ params_.setDataType(TeBIT);
+ else if (it->second == "unsignedchar")
+ params_.setDataType(TeBIT);
+ else if (it->second == "char")
+ params_.setDataType(TeCHAR);
+ else if (it->second == "unsignedshort")
+ params_.setDataType(TeUNSIGNEDSHORT);
+ else if (it->second == "short")
+ params_.setDataType(TeSHORT);
+ else if (it->second == "integer")
+ params_.setDataType(TeINTEGER);
+ else if (it->second == "unsignedlong")
+ params_.setDataType(TeUNSIGNEDLONG);
+ else if (it->second == "long")
+ params_.setDataType(TeLONG);
+ else if (it->second == "float")
+ params_.setDataType(TeFLOAT);
+ else if (it->second == "double")
+ params_.setDataType(TeDOUBLE);
+ }
+ it = metadata.find("SWAPPED");
+ if (it != metadata.end() && it->second == "yes")
+ params_.swap_ = true;
+
+ it = metadata.find("NO_DATA");
+ if (it != metadata.end())
+ {
+ params_.useDummy_ = true;
+ params_.setDummy(atof(it->second.c_str()));
+ }
+
+ it = metadata.find("PROJECTION");
+ if (it != metadata.end())
+ {
+ string projdesc = it->second;
+ TeProjectionParams pars;
+ it = metadata.find("DATUM");
+ if (it != metadata.end())
+ {
+ TeDatum dat = TeDatumFactory::make(it->second);
+ pars.datum = dat;
+ }
+ if (decodifyDescription(projdesc,pars))
+ {
+ TeProjection* proj = TeProjectionFactory::make(pars);
+ params_.projection(proj);
+ }
+ }
+ }
+}
+
+#ifdef WIN32
+void
+TeDecoderMemoryMap::init()
+{
+ clear();
+ params_.status_= TeNOTREADY;
+
+ DWORD dwDesiredAccess, dwCreationDisposition, flProtect,dwDesiredAccessV ;
+
+ if (params_.mode_ == 'c')
+ {
+ dwCreationDisposition = CREATE_ALWAYS;
+ dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
+ flProtect = PAGE_READWRITE;
+ dwDesiredAccessV = FILE_MAP_WRITE;
+ }
+ else if (params_.mode_ == 'w')
+ {
+ dwCreationDisposition = OPEN_ALWAYS;
+ dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
+ flProtect = PAGE_READWRITE;
+ dwDesiredAccessV = FILE_MAP_WRITE;
+ }
+ else
+ {
+ dwCreationDisposition = OPEN_EXISTING;
+ dwDesiredAccess = GENERIC_READ;
+ flProtect = PAGE_READONLY;
+ dwDesiredAccessV = FILE_MAP_READ;
+ }
+
+ // First open the file
+ m_hFile = CreateFile(
+ params_.fileName_.c_str(), // File name
+ dwDesiredAccess, // Desired access
+ FILE_SHARE_READ
+ | FILE_SHARE_WRITE, // Allow sharing-- we're only doing a quick scan
+ NULL, // No security attributes
+ dwCreationDisposition, // Creation disposition
+ 0, // Ignore file attributes
+ NULL); // Ignore hTemplateFile
+
+ if (m_hFile == INVALID_HANDLE_VALUE)
+ return; // could not open file
+
+ // Get the file's size
+ m_dwSize = GetFileSize(m_hFile, NULL);
+ if (m_dwSize == 0xffffffff)
+ {
+ m_hFile = NULL;
+ return;
+ }
+
+ bool fillDummy = false;
+ if (params_.mode_ == 'c' || m_dwSize == 0)
+ {
+ if (!create())
+ return;
+ fillDummy = true;
+ // if creating a raw file write the metata file
+ writeMetadataFile();
+ }
+ else
+ {
+ // if reading an existing raw file try to read the metadata file
+ readMetadataFile();
+ }
+
+ // Create a mapping object from the file
+ m_hMapping = CreateFileMapping(
+ m_hFile, // Handle we got from CreateFile
+ NULL, // No security attributes
+ flProtect, // read-write
+ 0, 0, // Max size = current size of file
+ NULL); // Don't name the mapping object
+ if ( m_hMapping == NULL )
+ {
+ m_hFile = NULL;
+ return;
+ }
+
+// Map the file to memory
+ switch (params_.dataType_[0]) {
+ case (TeUNSIGNEDCHAR):
+ m_lpszFile = (unsigned char*) MapViewOfFile(
+ m_hMapping, // Handle we got from CreateFileMapping
+ dwDesiredAccessV, // full access
+ 0, 0, // Offset into file = beginning of file
+ 0);
+ break;
+ case (TeCHAR) :
+ m_lpszFile = (char*) MapViewOfFile(
+ m_hMapping, // Handle we got from CreateFileMapping
+ dwDesiredAccessV, // full access
+ 0, 0, // Offset into file = beginning of file
+ 0);
+ break;
+ case (TeUNSIGNEDSHORT):
+ m_lpszFile = (unsigned short*) MapViewOfFile(
+ m_hMapping, // Handle we got from CreateFileMapping
+ dwDesiredAccessV, // full access
+ 0, 0, // Offset into file = beginning of file
+ 0);
+ break;
+ case (TeSHORT):
+ m_lpszFile = (short*) MapViewOfFile(
+ m_hMapping, // Handle we got from CreateFileMapping
+ dwDesiredAccessV, // full access
+ 0, 0, // Offset into file = beginning of file
+ 0);
+ break;
+ case (TeUNSIGNEDLONG):
+ m_lpszFile = (unsigned long*) MapViewOfFile(
+ m_hMapping, // Handle we got from CreateFileMapping
+ dwDesiredAccessV, // full access
+ 0, 0, // Offset into file = beginning of file
+ 0);
+ break;
+ case (TeLONG):
+ m_lpszFile = (long*) MapViewOfFile(
+ m_hMapping, // Handle we got from CreateFileMapping
+ dwDesiredAccessV, // full access
+ 0, 0, // Offset into file = beginning of file
+ 0);
+ break;
+ case (TeFLOAT):
+ m_lpszFile = (float*) MapViewOfFile(
+ m_hMapping, // Handle we got from CreateFileMapping
+ dwDesiredAccessV, // full access
+ 0, 0, // Offset into file = beginning of file
+ 0);
+ break;
+ case (TeDOUBLE):
+ m_lpszFile = (double*) MapViewOfFile(
+ m_hMapping, // Handle we got from CreateFileMapping
+ dwDesiredAccessV, // full access
+ 0, 0, // Offset into file = beginning of file
+ 0);
+ break;
+ }
+ if ( m_lpszFile == NULL )
+ return ;
+
+ if (fillDummy)
+ {
+ for (int b=0; b<params_.nBands();b++)
+ for (int l=0; l<params_.nlines_;l++)
+ for (int c=0; c<params_.ncols_;c++)
+ setElement ( c, l, params_.dummy_[b], b);
+ }
+ if (params_.mode_ =='c' || params_.mode_ == 'w')
+ params_.status_ = TeREADYTOWRITE;
+ else
+ params_.status_ = TeREADYTOREAD;
+ return;
+}
+
+
+bool
+TeDecoderMemoryMap::create()
+{
+ char lpBuffer[1024];
+ unsigned long nNumberOfBytesToWrite=(long)params_.nBands() * (long)params_.ncols_ * (long)params_.nlines_; // number of bytes to write
+ nNumberOfBytesToWrite *= (long)params_.nbitsperPixel_[0]/8; // number of bytes to write
+ unsigned long nNumberOfBytesWritten; // pointer to number of bytes written
+
+ for (;nNumberOfBytesToWrite > 1024; nNumberOfBytesToWrite-=1024)
+ {
+ if ( !WriteFile(
+ m_hFile, // handle to file to write to
+ lpBuffer, // pointer to data to write to file
+ 1024, // number of bytes to write
+ &nNumberOfBytesWritten, // pointer to number of bytes written
+ NULL // pointer to structure for overlapped I/O
+ ))
+ return false; // could not write to file
+ }
+
+ if ( !WriteFile(
+ m_hFile, // handle to file to write to
+ lpBuffer, // pointer to data to write to file
+ nNumberOfBytesToWrite, // number of bytes to write
+ &nNumberOfBytesWritten, // pointer to number of bytes written
+ NULL // pointer to structure for overlapped I/O
+ ))
+ return false; // could not write to file
+ return true;
+}
+
+bool
+TeDecoderMemoryMap::clear()
+{
+ if (m_hFile == NULL)
+ return true;
+
+ if ( !UnmapViewOfFile(m_lpszFile) )
+ return false;
+
+ CloseHandle(m_hMapping);
+ CloseHandle(m_hFile);
+ m_hFile = NULL;
+ params_.status_ = TeNOTREADY;
+ return true;
+}
+#else
+// Linux version: uses mmap
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+void
+TeDecoderMemoryMap::init()
+{
+ clear();
+
+ // First open the file
+ m_hFile = open(params_.fileName_.c_str(), // File name
+ O_RDWR, // Flags
+ S_IRWXU); // Mode
+
+ if (m_hFile == -1)
+ return; // could not open file
+
+ // Get the file's size
+ struct stat aux;
+ if (stat(params_.fileName_.c_str(), &aux) == -1)
+ return;
+ m_dwSize = aux.st_size;
+
+ m_lpszFile = mmap(0, m_dwSize, PROT_READ|PROT_WRITE , MAP_PRIVATE, m_hFile, 0);
+ if ( ((int) m_lpszFile) == -1 )
+ return;
+}
+
+bool
+TeDecoderMemoryMap::create()
+{
+ clear();
+ // First open the file
+ m_hFile = open(params_.fileName_.c_str(), // File name
+ O_RDWR, // Flags
+ S_IRWXU); // Mode
+
+ if (m_hFile == -1)
+ return false; // could not open file
+
+ char lpBuffer[1024];
+ long nNumberOfBytesToWrite=(long)params_.nBands() * (long)params_.ncols_ * (long)params_.nlines_; // number of bytes to write
+ nNumberOfBytesToWrite *= (long)params_.nbitsperPixel_[0]/8; // number of bytes to write
+ long nNumberOfBytesWritten; // pointer to number of bytes written
+
+ for (;nNumberOfBytesToWrite > 1024; nNumberOfBytesToWrite-=1024)
+ {
+ nNumberOfBytesWritten = write(m_hFile, lpBuffer,1024);
+ if (nNumberOfBytesWritten == -1)
+ return false; // could not write to file
+ }
+
+ nNumberOfBytesWritten = write(m_hFile, lpBuffer,nNumberOfBytesToWrite);
+ if (nNumberOfBytesWritten == -1)
+ return false;
+
+ // Create a mapping object from the file
+
+ struct stat aux;
+ if (stat(params_.fileName_.c_str(), &aux) == -1) // Get the file's size
+ return false;
+ m_dwSize = aux.st_size;
+
+ m_lpszFile = mmap(0, m_dwSize, PROT_READ|PROT_WRITE , MAP_PRIVATE, m_hFile, 0);
+ if ( ((int) m_lpszFile) == -1 )
+ return false;
+
+ // Writes the default values
+ if (params_.dummy_[0])
+ {
+ for (int b=0; b<params_.nBands();b++)
+ for (int l=0; l<params_.nlines_;l++)
+ for (int c=0; c<params_.ncols_;c++)
+ setElement ( c, l, params_.dummy_[b], b);
+ }
+ return true;
+}
+
+
+bool
+TeDecoderMemoryMap::clear()
+{
+ if (m_lpszFile == 0)
+ return true;
+
+ if ( munmap(m_lpszFile, m_dwSize) == -1)
+ return false;
+ m_lpszFile = 0;
+ close(m_hFile);
+ m_hFile = 0;
+ return true;
+}
+#endif
+
+
diff --git a/src/terralib/kernel/TeDecoderMemoryMap.h b/src/terralib/kernel/TeDecoderMemoryMap.h
new file mode 100644
index 0000000..f71c538
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderMemoryMap.h
@@ -0,0 +1,85 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderMemoryMap.h
+ This file deals with decoding of raster data in a bynary file, using the memory map operation system functionality
+*/
+#ifndef __TERRALIB_INTERNAL_DECODERMEMORYMAP_H
+#define __TERRALIB_INTERNAL_DECODERMEMORYMAP_H
+
+#include "TeDecoder.h"
+
+#ifdef WIN32
+#include <windows.h>
+#include <winbase.h>
+#else
+#include <sys/mman.h>
+#endif
+
+
+//! Implements a decoder to raster data in a bynary file, using the memory map operation system functionality
+class TeDecoderMemoryMap : public TeDecoder
+{
+public:
+ TeDecoderMemoryMap ( const TeRasterParams& );
+ ~TeDecoderMemoryMap ();
+
+ bool setElement (int col, int lin, double val, int band = 0);
+ bool getElement (int col, int lin, double &val,int band = 0);
+
+ void init ();
+ bool clear ();
+
+ void writeMetadataFile();
+ void readMetadataFile();
+
+private:
+ bool create ();
+
+#ifdef WIN32
+// Windows support to file memory mapping
+ long dataInitPos_;
+ HANDLE m_hFile; // Handle to file we're currently zapping
+ HANDLE m_hMapping; // Handle to memory-mapping of that file
+ LPVOID m_lpszFile; // Pointer to view of file mapped to memory
+ DWORD m_dwSize;
+#else
+// Linux support to file memory mapping
+ long dataInitPos_;
+ int m_hFile; //(fd) Handle to file we're currently zapping
+ void* m_lpszFile; // Pointer to view of file mapped to memory
+ long m_dwSize;
+#endif
+};
+
+//! Implements a factory to build memory map decoder
+class TeDecoderMemoryMapFactory : public TeDecoderFactory
+{
+public:
+
+ TeDecoderMemoryMapFactory(const string& name) : TeDecoderFactory(name) {}
+
+ virtual TeDecoder* build (const TeRasterParams& arg)
+ { return new TeDecoderMemoryMap(arg); }
+};
+#endif
+
diff --git a/src/terralib/kernel/TeDecoderSPR.cpp b/src/terralib/kernel/TeDecoderSPR.cpp
new file mode 100644
index 0000000..0316660
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderSPR.cpp
@@ -0,0 +1,341 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeException.h"
+#include "TeDecoderSPR.h"
+#include "TeAsciiFile.h"
+#include "TeUtils.h"
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+
+TeDecoderSPR::TeDecoderSPR (const TeRasterParams& par) :
+ TeDecoderMemory()
+{
+ if (par.fileName_.empty())
+ return;
+ params_ = par;
+ params_.decoderIdentifier_ = "SPR";
+ if (params_.mode_ == 'w' || params_.mode_ == 'r')
+ readParameters();
+}
+
+TeDecoderSPR::~TeDecoderSPR ()
+{
+ if ( isModified_ && (params_.mode_ == 'w' || params_.mode_ == 'c'))
+ { // save contents to disk
+ try
+ {
+ TeAsciiFile sFile(params_.fileName_,"w+");
+ if (writeParameters(sFile))
+ saveData(sFile);
+ }
+ catch (...)
+ {
+ }
+ }
+ TeDecoderMemory::clear();
+}
+
+bool
+TeDecoderSPR::clear()
+{
+ if ( isModified_ && (params_.mode_ == 'w' || params_.mode_ == 'c'))
+ { // save contents to disk
+ try
+ {
+ TeAsciiFile sFile(params_.fileName_,"w+");
+ if (writeParameters(sFile))
+ saveData(sFile);
+ }
+ catch (...)
+ {
+ }
+ isModified_ = false;
+ }
+ TeDecoderMemory::clear();
+ return true;
+}
+
+bool
+TeDecoderSPR::readParameters()
+{
+ try
+ {
+ TeAsciiFile pFile (params_.fileName_);
+ string name;
+
+ // check if there is the GRIDDEF section
+ while (pFile.isNotAtEOF())
+ {
+ name = pFile.readString();
+ if (name[0] =='/' && name[1] == '/') // skip comments
+ pFile.findNewLine();
+ else if (name == "GRIDDEF")
+ break;
+ }
+ if (!pFile.isNotAtEOF()) // unexpected end of file
+ return false;
+
+ // read INFO section
+ double x1, y2;
+ int ncols;
+ double dummy;
+
+ // Expected format to grid definition:
+ // GRIDDEF <ncols> <nlins> <X1> <Y2> <resX> <resY> <nodatavalue>
+ params_.ncols_ = ncols = pFile.readInt();
+ params_.nlines_ = pFile.readInt();
+ x1 = pFile.readFloat();
+ y2 = pFile.readFloat();
+ params_.resx_ = pFile.readFloat();
+ params_.resy_ = pFile.readFloat();
+ params_.nBands(1);
+ dummy = pFile.readFloat();
+ params_.useDummy_ = true;
+ params_.setDummy(dummy);
+
+ do
+ {
+ name = pFile.readString();
+ if (name[0] =='/' && name[1] == '/') // skip comments
+ pFile.findNewLine();
+ } while (pFile.isNotAtEOF() && name != "GRIDCLASS" && name != "INFO_END");
+
+ if (name == "GRIDCLASS" )
+ {
+ // Expected format GRIDCLASS <nclass> <ncolorR> <ncolorG> <ncolorB> <nameclass>
+ vector<short> lutr;
+ vector<short> lutg;
+ vector<short> lutb;
+
+ name = pFile.readString();
+ while (pFile.isNotAtEOF() && name != "INFO_END") // loop through all class definitions
+ {
+ name = pFile.readString();
+ lutr.push_back(atoi(name.c_str()));
+
+ name = pFile.readString();
+ lutg.push_back(atoi(name.c_str()));
+
+ name = pFile.readString();
+ lutb.push_back(atoi(name.c_str()));
+
+ name = pFile.readString();
+ name = pFile.readString();
+ }
+
+ if (!pFile.isNotAtEOF()) // unexpected end of file
+ return false;
+
+ params_.setPhotometric(TeRASTERPALETTE);
+ params_.setNumberPalleteEntries(lutr.size()+1);
+ for (unsigned int i=0; i<lutr.size(); i++)
+ {
+ params_.lutr_[i+1] = lutr[i];
+ params_.lutg_[i+1] = lutg[i];
+ params_.lutb_[i+1] = lutb[i];
+ }
+ lutr.clear();
+ lutg.clear();
+ lutb.clear();
+ params_.setDataType(TeUNSIGNEDCHAR);
+ }
+ else if (name == "INFO_END")
+ {
+ params_.setDataType(TeDOUBLE);
+ params_.setPhotometric(TeRASTERMULTIBAND);
+ }
+ params_.topLeftResolutionSize(x1,y2,params_.resx_,params_.resy_,
+ params_.ncols_,params_.nlines_,false);
+ TeProjection* pp = new TeNoProjection();
+ params_.projection(pp);
+ delete pp;
+ }
+ catch(...)
+ {
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDecoderSPR::readFile(const string& filename)
+{
+ string valstring;
+ try
+ {
+ TeAsciiFile pFile (filename);
+ string name;
+ while (pFile.isNotAtEOF() && name != "INFO_END")
+ {
+ name = pFile.readString();
+ if (name[0] =='/' && name[1] == '/') // skip comments
+ pFile.findNewLine();
+ }
+ if (!pFile.isNotAtEOF()) // unexpected end of file
+ return false;
+
+ for (int lin = 0; lin < params_.nlines_; lin++)
+ {
+ for (int col = 0; col < params_.ncols_; col++)
+ {
+ valstring = pFile.readString();
+ setElement(col,lin,atof(valstring.c_str()));
+ }
+ }
+ }
+ catch(...)
+ {
+ return false;
+ }
+ return true;
+}
+
+void
+TeDecoderSPR::init()
+{
+ params_.status_= TeNOTREADY;
+ int nb = params_.nBands();
+ if (nb != 1 )
+ return;
+
+ TeDecoderMemory::init(); // try to allocate enough memory
+ if (params_.status_ == TeNOTREADY)
+ return;
+
+ params_.status_= TeNOTREADY;
+ if (params_.mode_ == 'c') // creating a new file
+ {
+ if (access(params_.fileName_.c_str(),00) != -1) // remove existing file
+ {
+ if (unlink(params_.fileName_.c_str()) == -1)
+ return;
+ }
+ try
+ {
+ TeAsciiFile sFile(params_.fileName_,"w+");
+ if (!writeParameters(sFile) || !saveData(sFile))
+ return;
+ else
+ {
+ params_.status_ = TeREADYTOWRITE;
+ }
+ }
+ catch (...)
+ {
+ return;
+ }
+ }
+ else if (params_.mode_ == 'w')
+ {
+ if ((access(params_.fileName_.c_str(),06) == -1) || !readFile(params_.fileName_))
+ return;
+ params_.status_ = TeREADYTOWRITE;
+ }
+ else if (params_.mode_ == 'r')
+ {
+ if ((access(params_.fileName_.c_str(),04) == -1)|| !readFile(params_.fileName_))
+ return;
+ params_.status_ = TeREADYTOREAD;
+ }
+}
+
+bool
+TeDecoderSPR::writeParameters(TeAsciiFile& pFile)
+{
+ string name;
+ try
+ {
+ TeBox box = params_.boundingBox();
+ name = "GRIDREG\nINFO\n";
+ pFile.writeString(name);
+ name = "//Formato GRIDDEF <ncols> <nlins> <X1> <Y2> <resX> <resY> <nodatavalue>\n";
+ pFile.writeString(name);
+ name = "GRIDDEF ";
+ pFile.writeString(name);
+ name = Te2String(params_.ncols_) + " " + Te2String(params_.nlines_) + " ";
+ pFile.writeString(name);
+ name = Te2String(box.x1_,6) + " " + Te2String(box.y2_,6) + " ";
+ pFile.writeString(name);
+ name = Te2String(params_.resx_,6) + " " + Te2String(params_.resy_,6) + " ";
+ pFile.writeString(name);
+ name = Te2String(params_.dummy_[0],6) + "\n";
+ pFile.writeString(name);
+
+ if (params_.photometric_[0] == TeRASTERPALETTE)
+ {
+ name = "GRIDCLASS\n";
+ for (unsigned int nc=0; nc<params_.lutr_.size(); ++nc)
+ {
+ name = Te2String(nc) + " " + Te2String(params_.lutr_[nc]);
+ name += " " + Te2String(params_.lutg_[nc]) + " " + Te2String(params_.lutb_[nc]);
+ name += " c" + Te2String(nc) + "\n";
+ pFile.writeString(name);
+ }
+ }
+ name = "INFO_END\n";
+ pFile.writeString(name);
+ }
+ catch (...)
+ {
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDecoderSPR::saveData(TeAsciiFile& pFile)
+{
+ bool isi = (params_.dataType_[0] != TeDOUBLE) && (params_.dataType_[0] != TeFLOAT);
+
+ FILE* fp = pFile.FilePtr();
+ char fmt[100];
+ if (isi)
+ strcpy(fmt,"%.0f ");
+ else
+ strcpy(fmt,"%f ");
+ try
+ {
+ double d;
+ for (int l=0; l<params_.nlines_; ++l)
+ {
+ for (int c=0; c<params_.ncols_; ++c)
+ {
+ TeDecoderMemory::getElement(c,l,d);
+ fprintf(fp,fmt,d);
+ }
+ pFile.writeNewLine();
+ }
+ string spc = "END\n";
+ pFile.writeString(spc);
+ }
+ catch(...)
+ {
+ return false;
+ }
+ return true;
+}
diff --git a/src/terralib/kernel/TeDecoderSPR.h b/src/terralib/kernel/TeDecoderSPR.h
new file mode 100644
index 0000000..7292ff8
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderSPR.h
@@ -0,0 +1,68 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderSPR.h
+ This file deals with decoding of raster data in a ASCII SPRING format
+*/
+#ifndef __TERRALIB_INTERNAL_DECODERSPR_H
+#define __TERRALIB_INTERNAL_DECODERSPR_H
+
+#include "TeDecoderMemory.h"
+
+class TeAsciiFile;
+
+//! Implements a decoder for rasters in ASCII Spring format
+class TeDecoderSPR : public TeDecoderMemory
+{
+public:
+ //! Empty constructor
+ TeDecoderSPR () : TeDecoderMemory()
+ { params_.decoderIdentifier_ = "SPR"; }
+
+ //! Constructor from some parameters
+ TeDecoderSPR (const TeRasterParams& par);
+
+ //! Destructor
+ ~TeDecoderSPR ();
+
+ void init();
+ bool clear();
+private:
+ bool readFile(const string& filename);
+ bool readParameters();
+ bool writeParameters(TeAsciiFile& pFile);
+ bool saveData(TeAsciiFile& pFile);
+};
+
+//! Implements a factory to build decoders to JPEG raster
+class TeDecoderSPRFactory : public TeDecoderFactory
+{
+public:
+
+ TeDecoderSPRFactory(const string& name) : TeDecoderFactory(name) {}
+
+ virtual TeDecoder* build (const TeRasterParams& arg)
+ { return new TeDecoderSPR(arg); }
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeDecoderTIFF.cpp b/src/terralib/kernel/TeDecoderTIFF.cpp
new file mode 100644
index 0000000..831551f
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderTIFF.cpp
@@ -0,0 +1,1372 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeDecoderTIFF.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeRaster.h"
+#include "TeDecoderMemory.h"
+#ifdef WIN32
+#include <io.h>
+#endif
+
+#if !defined(WIN32)
+#include <sys/param.h>
+#endif
+
+// ---- Public Methods -----
+
+TeDecoderTIFF::TeDecoderTIFF(const TeRasterParams& par)
+{
+ params_ = par;
+ TImage = -1;
+ TCurLine_ = -1;
+ first = 1;
+ TBuffer_ = 0;
+ TBufferTile_ = 0;
+ nBands_ = par.nBands();
+ params_.status_= TeNOTREADY;
+
+ bytesperline_ = 0;
+ rowtilesize_ = 0;
+ tilew_ = 0;
+ tileh_ = 0;
+ bytespertile_ = 0;
+
+ tif = 0;
+ gtif = 0;
+
+ char tifmode = 'r';
+ if (params_.mode_=='c')
+ {
+ tifmode = 'a';
+ }
+ else if (params_.mode_ == 'r')
+ {// if file should exist already read tiff/geotiff parameters
+ tif=XTIFFOpen(params_.fileName_.c_str(),&tifmode);
+ if (!tif)
+ return;
+ gtif = (GTIF*)GTIFNew(tif);
+ ReadTiffDirectory();
+ if (gtif)
+ {
+ GTIFFree(gtif);
+ gtif = 0;
+ }
+ if (tif)
+ {
+ XTIFFClose(tif);
+ tif = 0;
+ }
+ params_.decoderIdentifier_ = "TIF";
+ }
+}
+
+void
+TeDecoderTIFF::init()
+{
+ clear(); // reset existent internal structures
+
+ params_.status_= TeNOTREADY;
+ char tifmode; // libtiff mode
+
+ // check the initial permissions on the file
+ if (params_.mode_ == 'c') // creating a new raster file
+ {
+ if (access(params_.fileName_.c_str(),00) != -1) // try to remove existing file
+ if (unlink(params_.fileName_.c_str()) == -1)
+ return;
+ tifmode = 'a';
+ params_.status_ = TeREADYTOWRITE;
+ }
+ else if ( params_.mode_ == 'r' )
+ {
+ if (access(params_.fileName_.c_str(),04) == -1)
+ return; // there is no permission to read
+ tifmode = 'r';
+ params_.status_ = TeREADYTOREAD;
+ }
+ // TIFF image files may not be opened for both reading and writing;
+ // there is no support for altering the contents of a TIFF file. So
+ // mode == 'w' never initializes this decoder.
+ else if (params_.mode_ == 'w')
+ {
+ params_.status_= TeNOTREADY;
+ return;
+ }
+ else // unknown mode
+ return;
+
+ // try to open the tiff file with the desired mode
+ tif=XTIFFOpen(params_.fileName_.c_str(),&tifmode);
+ if (!tif)
+ {
+ params_.status_= TeNOTREADY;
+ return;
+ }
+
+ // try to create a geotiff instance on the tiff file
+ gtif = (GTIF*)GTIFNew(tif);
+ if (!tif)
+ {
+ params_.status_= TeNOTREADY;
+ return;
+ }
+
+ if (params_.mode_ == 'c') // if geotiff is being created we should set the geo flags
+ SetGeoKeys();
+
+ ReadTiffDirectory(); // read the tiff geokeys
+ AllocateBuffer(); // allocate the internal buffers
+ if (params_.mode_ == 'c' && // if a new image writes creates a dummy image
+ !WriteDummyImage()) // if couldn�t write dummy image there is an error
+ {
+ params_.status_= TeNOTREADY;
+ return;
+ }
+}
+
+
+bool
+TeDecoderTIFF::clear()
+{
+ if (tif && params_.mode_=='c' && TCurLine_ >= 0) // if we have been
+ { // writting save the last
+ tif->tif_curoff = 0;
+ int cc = TIFFStripSize(tif);
+ TIFFWriteStrip(tif,TCurLine_,TBuffer_,cc);
+ }
+ if (gtif)
+ GTIFFree(gtif);
+ if (tif)
+ XTIFFClose(tif);
+
+ tif = 0;
+ gtif = 0;
+ first = 0;
+ TImage = -1;
+ TCurLine_ = -1;
+ bytesperline_ = 0;
+ rowtilesize_ = 0;
+ tilew_ = 0;
+ tileh_ = 0;
+ bytespertile_ = 0;
+
+ DeallocateBuffer();
+ params_.status_ = TeNOTREADY;
+ return true;
+}
+
+TeDecoderTIFF::~TeDecoderTIFF()
+{
+ clear();
+}
+
+bool
+TeDecoderTIFF::getElement(int col,int lin, double &val,int band)
+{
+ if (TCurLine_ != (int)lin) // if line is not the current
+ {
+ if (TImage == MONOIMAGE || TImage == PALLETEIMAGE)
+ {
+ if (TIFFReadScanline(tif,TBuffer_,lin,0) < 0)
+ return false;
+ }
+ else // RGB image
+ {
+ if (planar_ == PLANARCONFIG_CONTIG)
+ {
+ if (isTiled_)
+ {
+ if(!ReadTileImageContig(lin,TBuffer_))
+ return false;
+ }
+ else
+ {
+ if (TIFFReadScanline(tif,TBuffer_,lin,0) < 0)
+ return false;
+ }
+ }
+ else // RGB Separate
+ {
+ if (isTiled_) return false; // SEPARATE and tiled => Error!
+ for (int s=0; s < nBands_; s++)
+ if (TIFFReadScanline(tif,&TBuffer_[s*params_.ncols_*params_.elementSize(s)],lin,s) < 0)
+ return false;
+ }
+ }
+ TCurLine_ = lin;
+ }
+ int pos;
+ if (planar_ == PLANARCONFIG_CONTIG)
+ pos = col*nBands_+band;
+ else
+ pos = band*params_.ncols_+col;
+
+ if (params_.dataType_[band] == TeFLOAT) // 32 bits
+ val = ((float*)TBuffer_)[pos];
+ else if (params_.dataType_[band] == TeSHORT) // 16 bits
+ val = ((short*)TBuffer_)[pos];
+ else // 8 bits
+ val = TBuffer_[pos];
+ return true;
+}
+
+
+// We allow writting only to a strip based, non compressed tiff file
+bool
+TeDecoderTIFF::setElement(int col, int lin, double val, int band)
+{
+ int strip = lin/rowsperstrip_;
+ if (strip != TCurLine_)
+ {
+ if (TCurLine_ >= 0)
+ {
+ tif->tif_curoff = 0;
+ int cc = TIFFStripSize(tif);
+ TIFFWriteStrip(tif,TCurLine_,TBuffer_,cc);
+ }
+ TCurLine_ = strip;
+
+ int l = strip * rowsperstrip_;
+ bool res = false;
+ if (TImage == MONOIMAGE || TImage == PALLETEIMAGE)
+ {
+ tif->tif_curstrip = 0;
+ res = ReadMonoImage(l);
+ }
+ else if(TImage == RGBIMAGE)
+ {
+ tif->tif_curstrip = 0;
+ res = ReadRGBImage (l);
+ }
+ if (!res)
+ {
+ TCurLine_ = -1;
+ return false;
+ }
+ }
+ int offset = lin % rowsperstrip_ * bytesperline_;
+ unsigned char* cp = TBuffer_ + offset;
+ int pos = col*nBands_+band;
+ if (params_.dataType_[band] == TeFLOAT) // 32 bits
+ ((float*)cp)[pos] = (float)val;
+ else if (params_.dataType_[band] == TeSHORT) // 16 bits
+ ((short*)cp)[pos] = (short)val;
+ else // 8 bits
+ cp[pos] = (unsigned char)val;
+ return true;
+}
+
+
+// --- Internal Methods ---
+
+// --- Methods that deal with Tiff/GeoTiff Flags
+
+void TeDecoderTIFF :: SetGeoKeys()
+{
+
+// Image Size
+ TIFFSetField(gtif->gt_tif, TIFFTAG_IMAGEWIDTH, params_.ncols_);
+ TIFFSetField(gtif->gt_tif, TIFFTAG_IMAGELENGTH, params_.nlines_);
+
+// Orientation
+ TIFFSetField(gtif->gt_tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
+
+// Number of bits
+ int nb = params_.nbitsperPixel_[0];
+ TIFFSetField(gtif->gt_tif, TIFFTAG_BITSPERSAMPLE, nb);
+
+// Number of bands
+ TIFFSetField(gtif->gt_tif, TIFFTAG_SAMPLESPERPIXEL, nBands_);
+
+// Compression
+ TIFFSetField(gtif->gt_tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
+
+// Planar configuration
+ TIFFSetField(tif,TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
+
+// Photometric type
+ if (nBands_ == 1) // monobands
+ {
+ if (params_.photometric_[0] == TeRASTERPALETTE)
+ {
+ TIFFSetField(gtif->gt_tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE);
+ SaveLut();
+ TImage = PALLETEIMAGE;
+ }
+ else
+ {
+ TIFFSetField(gtif->gt_tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+ TImage = MONOIMAGE;
+ }
+ }
+ else
+ {
+ TIFFSetField(gtif->gt_tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
+ TImage = RGBIMAGE;
+ }
+
+ // Rows per Strip
+ int rowsperstrip = 3;
+// rowsperstrip = TIFFDefaultStripSize(gtif->gt_tif, rowsperstrip);
+ TIFFSetField(gtif->gt_tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
+
+ TeProjectionParams paramas = params_.projection()->params();
+
+ // Projection parameters
+ GTIFKeySet(gtif, GTRasterTypeGeoKey, TYPE_SHORT, 1, RasterPixelIsArea);
+ double tiepoint[6];
+ TeBox infobox = params_.box();
+ tiepoint[0] =0;
+ tiepoint[1] =0;
+ tiepoint[2] =0;
+ tiepoint[3] = infobox.x1();
+ tiepoint[4] = infobox.y2();
+ tiepoint[5] = 0;
+ double resolution[3];
+ resolution[0] = params_.resx_;
+ resolution[1] = params_.resy_;
+ resolution[2] = 0;
+ TIFFSetField(gtif->gt_tif, GTIFF_TIEPOINTS, 6,&tiepoint);
+ TIFFSetField(gtif->gt_tif, GTIFF_PIXELSCALE, 3,&resolution);
+
+ string projname = params_.projection()->name();
+ if (projname == "NoProjection")
+ {
+ GTIFWriteKeys(gtif); // write so far defined geo keys
+ return;
+ }
+
+ if (projname == "LatLong")
+ {
+ GTIFKeySet(gtif, GTModelTypeGeoKey, TYPE_SHORT, 1, ModelTypeGeographic);
+ GTIFKeySet(gtif, GeogAngularUnitsGeoKey, TYPE_SHORT, 1, Angular_Degree);
+ }
+ else
+ {
+ GTIFKeySet(gtif, GTModelTypeGeoKey, TYPE_SHORT, 1, ModelTypeProjected);
+ GTIFKeySet(gtif, ProjLinearUnitsGeoKey, TYPE_SHORT, 1,Linear_Meter);
+ if (projname == "UTM")
+ {
+ GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_TransverseMercator);
+ GTIFKeySet(gtif, ProjNatOriginLatGeoKey, TYPE_DOUBLE,1,paramas.lat0*TeCRD);
+ GTIFKeySet(gtif, ProjNatOriginLongGeoKey, TYPE_DOUBLE,1,paramas.lon0*TeCRD);
+ GTIFKeySet(gtif, ProjScaleAtNatOriginGeoKey, TYPE_DOUBLE,1,paramas.scale);
+ GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE,1,paramas.offx);
+ GTIFKeySet(gtif, ProjFalseNorthingGeoKey, TYPE_DOUBLE,1,paramas.offy);
+ }
+ else if (projname == "Mercator")
+ {
+ GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_Mercator);
+ GTIFKeySet(gtif, ProjNatOriginLongGeoKey, TYPE_DOUBLE,1,paramas.lon0*TeCRD);
+ GTIFKeySet(gtif, ProjNatOriginLatGeoKey, TYPE_DOUBLE,1,paramas.stlat1*TeCRD);
+ GTIFKeySet(gtif, ProjScaleAtNatOriginGeoKey, TYPE_DOUBLE,1,paramas.scale);
+ GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE,1,paramas.offx);
+ GTIFKeySet(gtif, ProjFalseNorthingGeoKey, TYPE_DOUBLE,1,paramas.offy);
+ }
+ else if (projname == "LambertConformal")
+ {
+ GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_LambertConfConic_2SP);
+ GTIFKeySet(gtif, ProjFalseOriginLatGeoKey,TYPE_DOUBLE, 1, paramas.lat0*TeCRD);
+ GTIFKeySet(gtif, ProjFalseOriginLongGeoKey, TYPE_DOUBLE, 1, paramas.lon0*TeCRD);
+ GTIFKeySet(gtif, ProjStdParallel1GeoKey, TYPE_DOUBLE, 1, paramas.stlat1*TeCRD);
+ GTIFKeySet(gtif, ProjStdParallel2GeoKey, TYPE_DOUBLE, 1, paramas.stlat2*TeCRD);
+ GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE, 1,paramas.offx);
+ GTIFKeySet(gtif, ProjFalseNorthingGeoKey,TYPE_DOUBLE, 1,paramas.offy);
+ }
+ else if (projname == "Polyconic")
+ {
+ GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_Polyconic);
+ GTIFKeySet(gtif, ProjFalseOriginLatGeoKey,TYPE_DOUBLE, 1, paramas.lat0*TeCRD);
+ GTIFKeySet(gtif, ProjFalseOriginLongGeoKey, TYPE_DOUBLE, 1, paramas.lon0*TeCRD);
+ GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE, 1,paramas.offx);
+ GTIFKeySet(gtif, ProjFalseNorthingGeoKey,TYPE_DOUBLE, 1,paramas.offy);
+ GTIFKeySet(gtif, ProjScaleAtNatOriginGeoKey, TYPE_DOUBLE,1,paramas.scale);
+ }
+ else if (projname == "CylindricalEquidistant")
+ {
+ GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_Equirectangular);
+ GTIFKeySet(gtif, ProjCenterLatGeoKey,TYPE_DOUBLE, 1, paramas.stlat1*TeCRD);
+ GTIFKeySet(gtif, ProjCenterLongGeoKey, TYPE_DOUBLE, 1, paramas.lon0*TeCRD);
+ GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE, 1,paramas.offx);
+ GTIFKeySet(gtif, ProjFalseNorthingGeoKey,TYPE_DOUBLE, 1,paramas.offy);
+ }
+ else if (projname == "PolarStereographic")
+ {
+ GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_PolarStereographic);
+ GTIFKeySet(gtif, ProjNatOriginLatGeoKey, TYPE_DOUBLE,1,paramas.lat0*TeCRD);
+ GTIFKeySet(gtif, ProjNatOriginLongGeoKey, TYPE_DOUBLE,1,paramas.lon0*TeCRD);
+ GTIFKeySet(gtif, ProjScaleAtNatOriginGeoKey, TYPE_DOUBLE,1,paramas.scale);
+ GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE,1,paramas.offx);
+
+ GTIFKeySet(gtif, ProjFalseNorthingGeoKey, TYPE_DOUBLE,1,paramas.offy);
+ }
+ else if (projname == "Albers")
+ {
+ GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_AlbersEqualArea);
+ GTIFKeySet(gtif, ProjFalseOriginLatGeoKey,TYPE_DOUBLE, 1, paramas.lat0*TeCRD);
+ GTIFKeySet(gtif, ProjFalseOriginLongGeoKey, TYPE_DOUBLE, 1, paramas.lon0*TeCRD);
+ GTIFKeySet(gtif, ProjStdParallel1GeoKey, TYPE_DOUBLE, 1, paramas.stlat1*TeCRD);
+ GTIFKeySet(gtif, ProjStdParallel2GeoKey, TYPE_DOUBLE, 1, paramas.stlat2*TeCRD);
+ GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE, 1,paramas.offx);
+ GTIFKeySet(gtif, ProjFalseNorthingGeoKey,TYPE_DOUBLE, 1,paramas.offy);
+ }
+ else if (projname == "Miller")
+ {
+ GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_MillerCylindrical);
+ GTIFKeySet(gtif, ProjCenterLongGeoKey, TYPE_DOUBLE, 1, paramas.lon0*TeCRD);
+ GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE, 1,paramas.offx);
+ GTIFKeySet(gtif, ProjFalseNorthingGeoKey,TYPE_DOUBLE, 1,paramas.offy);
+ }
+ }
+
+ // datum parameters
+ if (paramas.datum.name() == "CorregoAlegre")
+ GTIFKeySet(gtif, GeogGeodeticDatumGeoKey, TYPE_SHORT, 1,6225);
+ else if (paramas.datum.name() == "WGS84")
+ GTIFKeySet(gtif, GeogGeodeticDatumGeoKey, TYPE_SHORT, 1,6326);
+ else if (paramas.datum.name() == "SAD69")
+ GTIFKeySet(gtif, GeogGeodeticDatumGeoKey, TYPE_SHORT, 1,6291);
+ else
+ GTIFKeySet(gtif, GeogGeodeticDatumGeoKey, TYPE_SHORT, 1,32767);
+
+ GTIFKeySet(gtif, GeogCitationGeoKey, TYPE_ASCII,1,paramas.datum.name().c_str());
+ double sMajorAxis = paramas.datum.radius();
+ double sMinorAxis = sMajorAxis*(1-paramas.datum.flattening());
+ GTIFKeySet(gtif, GeogSemiMajorAxisGeoKey,TYPE_DOUBLE, 1, sMajorAxis);
+ GTIFKeySet(gtif, GeogSemiMinorAxisGeoKey,TYPE_DOUBLE, 1, sMinorAxis);
+ GTIFWriteKeys(gtif);
+}
+
+void
+TeDecoderTIFF::ReadTiffDirectory()
+{
+ int ncols=0, nlins = 0;
+ TIFFGetField(tif,TIFFTAG_IMAGEWIDTH,&ncols);
+ TIFFGetField(tif,TIFFTAG_IMAGELENGTH,&nlins);
+ params_.ncols_ = ncols;
+ params_.nlines_ = nlins;
+
+ short samplesperPixel;
+ if (!TIFFGetField(tif,TIFFTAG_SAMPLESPERPIXEL,&samplesperPixel) )
+ params_.nBands(1);
+ else
+ params_.nBands(samplesperPixel);
+ nBands_ = params_.nBands();
+
+ nbitsperpixel_ = 0;
+ if( !TIFFGetField(tif,TIFFTAG_BITSPERSAMPLE,&nbitsperpixel_) )
+ {
+ nbitsperpixel_ = 1;
+ params_.setDataType(TeBIT);
+ }
+ else
+ {
+ int nbytes = nbitsperpixel_/8;
+ if (nbytes == 1)
+ params_.setDataType(TeUNSIGNEDCHAR);
+ else if (nbytes == 2)
+ params_.setDataType(TeSHORT);
+ else if (nbytes == 4)
+ params_.setDataType(TeFLOAT);
+ else
+ params_.setDataType(TeDOUBLE);
+ }
+
+ isTiled_ = (TIFFIsTiled(tif) != 0); // return non-zero if is organized in tiles
+ if (isTiled_)
+ {
+ rowtilesize_= TIFFTileRowSize(tif);
+ TIFFGetField(tif,TIFFTAG_TILEWIDTH,&tilew_);
+ TIFFGetField(tif,TIFFTAG_TILELENGTH,&tileh_);
+ bytespertile_ = TIFFTileSize(tif);
+ }
+ else
+ TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip_);
+
+
+ bytesperline_ = TIFFScanlineSize(tif);
+
+ TIFFGetField(tif,TIFFTAG_PLANARCONFIG,&planar_); // storage organization
+ TIFFGetField(tif,TIFFTAG_PHOTOMETRIC,&photom_); // photometric interpretation
+
+ if (samplesperPixel == 3 &&
+ (photom_ == PHOTOMETRIC_MINISWHITE ||
+ photom_ == PHOTOMETRIC_MINISBLACK))
+ photom_ = PHOTOMETRIC_RGB;
+
+ switch (photom_)
+ {
+ case PHOTOMETRIC_PALETTE:
+ params_.setPhotometric(TeRASTERPALETTE);
+ TImage = PALLETEIMAGE;
+ ReadLut();
+ break;
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
+ params_.setPhotometric(TeRASTERMULTIBAND);
+ TImage = MONOIMAGE;
+ break;
+ case PHOTOMETRIC_RGB:
+ params_.setPhotometric(TeRASTERRGB);
+ TImage = RGBIMAGE;
+ break;
+ default:
+ break;
+ }
+
+ TIFFGetField(tif, TIFFTAG_COMPRESSION, &compress_);
+ if (compress_ != COMPRESSION_NONE)
+ params_.setCompressionMode(TeTIFFCOMPRESSION);
+
+ // Read georeference parameters
+ if (GetGeoTIFF ()) //GeoTiff Images
+ {
+ TeCoord2D lleft(0.,params_.nlines_-1);
+ TeCoord2D uleft(0.,0.);
+ TeCoord2D uright(params_.ncols_-1,0.);
+ TeCoord2D lright(params_.ncols_-1,params_.nlines_-1);
+
+ lleft = index2Coord (lleft);
+ uleft = index2Coord (uleft);
+ uright = index2Coord (uright);
+ lright = index2Coord(lright);
+
+ double x1 = min(lleft.x(), uleft.x());
+ double x2 = max(lright.x(), uright.x());
+ double y1 = min(lleft.y(), lright.y());
+ // double y2 = max(uleft.y(), uright.y()); variable not used
+
+ params_.lowerLeftResolutionSize(x1,y1,params_.resx_,params_.resy_,params_.ncols_,params_.nlines_);
+
+ TeCoord2D coord(0,0);
+ TeCoord2D pt1 = index2Coord(coord);
+ x2 = pt1.x()+params_.boundingBox().width();
+ TeCoord2D tmpCoord = TeCoord2D(x2,pt1.y());
+ TeCoord2D pt2 = params_.coord2Index(tmpCoord);
+ params_.nTilesInMemory_ = (abs((int)pt2.y())+1)*nBands_;
+ }
+ else if (!params_.box().isValid())
+ {
+ params_.lowerLeftResolutionSize(0.5,0.5,1,1,params_.ncols_,params_.nlines_);
+ }
+}
+
+
+bool
+TeDecoderTIFF::GetGeoTIFF()
+{
+ if (!gtif)
+ return false;
+
+ int count;
+ transMatrix_ = 0;
+ pixelScale_ = 0;
+ tiePoints_ = 0;
+
+ double TIangle = 0.;
+ params_.resx_ = params_.resy_ = 1;
+ double TIx0=0, TIy0=0, TIi0=0, TIj0 = 0.;
+// double TIzone = 0;
+
+ if(gtif->gt_num_keys > 0)
+ {
+ if ((gtif->gt_methods.get)(tif, GTIFF_TRANSMATRIX, &count, &transMatrix_ ))
+ {
+ if (transMatrix_[0] > 0.)
+ {
+ TIangle = atan (transMatrix_[4]/transMatrix_[0]);
+ params_.resx_ = TeRoundD(fabs(transMatrix_[0]/cos(TIangle)));
+ params_.resy_ = TeRoundD(fabs(transMatrix_[1]/sin(TIangle)));
+ TIangle = -1. * TIangle * 180. / 3.14159264359;
+
+ }
+ }
+ else
+ {
+ if ((gtif->gt_methods.get)(tif, GTIFF_PIXELSCALE, &count, &pixelScale_ ))
+ {
+ params_.resx_ = TeRoundD(fabs (pixelScale_[0]));
+ params_.resy_ = TeRoundD(fabs (pixelScale_[1]));
+ }
+ }
+ }
+
+ if ((gtif->gt_methods.get)(tif, GTIFF_TIEPOINTS, &count, &tiePoints_ ))
+ {
+ if (count > 0)
+ {
+ TIi0 = tiePoints_[0];
+ TIj0 = tiePoints_[1];
+ int di = (int)(TIi0 - 0);
+ int dj = (int)(TIj0 - 0);
+
+ TIx0 = tiePoints_[3];
+ TIy0 = tiePoints_[4];
+
+ double x0 = TIx0 - di*params_.resx_;
+ double y0 = TIy0 - dj*params_.resy_;
+
+ params_.topLeftResolutionSize(x0,y0,params_.resx_,params_.resy_,params_.ncols_,params_.nlines_);
+ }
+ }
+
+ GTIFDefn defn;
+ if (GTIFGetDefn( gtif, &defn ) )
+ {
+ isGeoTiff_ = false;
+
+ // default parameters of a spherical ellipsoid
+ double TISemiMajor = 6.371000e+06, TISemiMinor = 0;
+ if (defn.SemiMajor == 0. && defn.SemiMinor == 0.)
+ {
+ GTIFKeyGet(gtif, GeogSemiMajorAxisGeoKey,&TISemiMajor, 0, 1 );
+ GTIFKeyGet(gtif, GeogSemiMinorAxisGeoKey,&TISemiMinor, 0, 1 );
+ }
+ else
+ {
+ TISemiMajor = defn.SemiMajor;
+ TISemiMinor = defn.SemiMinor;
+ }
+
+ TeDatum mDatum;
+ if (defn.Datum == 6291)
+ mDatum = TeDatumFactory::make("SAD69");
+ else if (defn.Datum == 6326)
+ mDatum = TeDatumFactory::make("WGS84");
+ else
+ {
+ double f = (TISemiMajor - TISemiMinor)/TISemiMajor;
+ if (!findDatum(TISemiMajor,f,mDatum))
+ mDatum = TeDatum("UserDefined",TISemiMajor,f,0.,0.,0.);
+ }
+
+ double TIlat1 = 0., TIlat2 = 0., TIlat0 = 0., TIlon0 = 0.;
+ double TIdeltax = 0., TIdeltay = 0., TIScale = 0.;
+
+ // Try to get projection parameters
+ TeProjectionParams mProjPars;
+ mProjPars.units = "Meters";
+
+ TeProjection* proj = 0;
+
+ short mtype = ModelTypeProjected;
+ GTIFKeyGet(gtif, GTModelTypeGeoKey,&mtype, 0, 1 );
+ if (mtype == ModelTypeGeographic)
+ {
+ proj = new TeLatLong(mDatum);
+ }
+ else
+ {
+ switch (defn.CTProjection)
+ {
+ case CT_TransverseMercator :
+ TIlat0 = defn.ProjParm[0];
+ TIlon0 = defn.ProjParm[1];
+ TIScale = defn.ProjParm[4];
+ TIdeltax = defn.ProjParm[5];
+ TIdeltay = defn.ProjParm[6];
+
+ TIy0 = TIy0 + 10000000. - TIdeltay;
+ TIx0 = TIx0 + 500000. - TIdeltax;
+
+ mProjPars.name = "UTM";
+ mProjPars.offx = TIdeltax;
+ mProjPars.offy = TIdeltay;
+ mProjPars.lat0 = TIlat0*TeCDR;
+ mProjPars.lon0 = TIlon0*TeCDR;
+ mProjPars.scale = TIScale;
+ if (TIdeltay > 0.1)
+ mProjPars.hemisphere = TeSOUTH_HEM;
+ else
+ mProjPars.hemisphere = TeNORTH_HEM;
+
+ break;
+ case CT_Mercator :
+ TIlat1 = defn.ProjParm[0];
+ TIlon0 = defn.ProjParm[1];
+ TIScale = defn.ProjParm[4];
+ TIdeltax = defn.ProjParm[5];
+ TIdeltay = defn.ProjParm[6];
+
+ mProjPars.name = "Mercator";
+ mProjPars.offx = TIdeltax;
+ mProjPars.offy = TIdeltay;
+ mProjPars.lon0 = TIlon0*TeCDR;
+ mProjPars.stlat1 = TIlat1*TeCDR;
+ mProjPars.scale = TIScale;
+ if (TIdeltay > 0.1)
+ mProjPars.hemisphere = TeSOUTH_HEM;
+ else
+ mProjPars.hemisphere = TeNORTH_HEM;
+ break;
+ case CT_LambertConfConic_2SP :
+ TIlat0 = defn.ProjParm[0]*defn.UOMAngleInDegrees;
+ TIlat1 = defn.ProjParm[2]*defn.UOMAngleInDegrees;
+ TIlat2 = defn.ProjParm[3]*defn.UOMAngleInDegrees;
+ TIlon0 = defn.ProjParm[1]*defn.UOMAngleInDegrees;
+ TIdeltax = defn.ProjParm[5];
+ TIdeltay = defn.ProjParm[6];
+ TIy0 = TIy0 - 10000000.;
+ TIx0 = TIx0 - 3000000.;
+
+ mProjPars.name = "LambertConformal";
+ mProjPars.offx = TIdeltax;
+ mProjPars.offy = TIdeltay;
+ mProjPars.lat0 = TIlat0*TeCDR;
+ mProjPars.lon0 = TIlon0*TeCDR;
+ mProjPars.stlat1 = TIlat1*TeCDR;
+ mProjPars.stlat2 = TIlat2*TeCDR;
+ if (TIdeltay > 0.1)
+ mProjPars.hemisphere = TeSOUTH_HEM;
+ else
+ mProjPars.hemisphere = TeNORTH_HEM;
+ break;
+ case CT_Polyconic :
+ TIlat0 = defn.ProjParm[0];
+ TIlon0 = defn.ProjParm[1];
+ TIScale = defn.ProjParm[4];
+ TIdeltax = defn.ProjParm[5];
+ TIdeltay = defn.ProjParm[6];
+
+ mProjPars.name = "Polyconic";
+ mProjPars.offx = TIdeltax;
+ mProjPars.offy = TIdeltay;
+ mProjPars.lat0 = TIlat0*TeCDR;
+ mProjPars.lon0 = TIlon0*TeCDR;
+ mProjPars.scale = TIScale;
+ if (TIdeltay > 0.1)
+ mProjPars.hemisphere = TeSOUTH_HEM;
+ else
+ mProjPars.hemisphere = TeNORTH_HEM;
+ break;
+
+ case CT_Equirectangular :
+ TIlat1 = defn.ProjParm[0];
+ TIlon0 = defn.ProjParm[1];
+ TIdeltax = defn.ProjParm[5];
+ TIdeltay = defn.ProjParm[6];
+
+ mProjPars.name = "CylindricalEquidistant";
+ mProjPars.offx = TIdeltax;
+ mProjPars.offy = TIdeltay;
+ mProjPars.lon0 = TIlon0*TeCDR;
+ mProjPars.stlat1 = TIlat1*TeCDR;
+ if (TIdeltay > 0.1)
+ mProjPars.hemisphere = TeSOUTH_HEM;
+ else
+ mProjPars.hemisphere = TeNORTH_HEM;
+ break;
+
+ case CT_PolarStereographic :
+ TIlat0 = defn.ProjParm[0];
+ TIlon0 = defn.ProjParm[1];
+ TIScale = defn.ProjParm[4];
+ TIdeltax = defn.ProjParm[5];
+ TIdeltay = defn.ProjParm[6];
+
+ mProjPars.name = "PolarStereographic";
+ mProjPars.offx = TIdeltax;
+ mProjPars.offy = TIdeltay;
+ mProjPars.lat0 = TIlat0*TeCDR;
+ mProjPars.lon0 = TIlon0*TeCDR;
+ mProjPars.scale = TIScale;
+ if (TIdeltay > 0.1)
+ mProjPars.hemisphere = TeSOUTH_HEM;
+ else
+ mProjPars.hemisphere = TeNORTH_HEM;
+ break;
+ case CT_AlbersEqualArea :
+ TIlat1 = defn.ProjParm[0];
+ TIlat2 = defn.ProjParm[1];
+ TIlat0 = defn.ProjParm[2];
+ TIlon0 = defn.ProjParm[3];
+ TIdeltax = defn.ProjParm[5];
+ TIdeltay = defn.ProjParm[6];
+
+ mProjPars.name = "Albers";
+ mProjPars.offx = TIdeltax;
+ mProjPars.offy = TIdeltay;
+ mProjPars.lat0 = TIlat0*TeCDR;
+ mProjPars.lon0 = TIlon0*TeCDR;
+ mProjPars.stlat1 = TIlat1*TeCDR;
+ mProjPars.stlat2 = TIlat2*TeCDR;
+
+ if (TIdeltay > 0.1)
+ mProjPars.hemisphere = TeSOUTH_HEM;
+ else
+ mProjPars.hemisphere = TeNORTH_HEM;
+ break;
+ case CT_MillerCylindrical:
+ TIlon0 = defn.ProjParm[1];
+ TIdeltax = defn.ProjParm[5];
+ TIdeltay = defn.ProjParm[6];
+
+ mProjPars.name = "Miller";
+ mProjPars.offx = TIdeltax;
+ mProjPars.offy = TIdeltay;
+ mProjPars.lon0 = TIlon0*TeCDR;
+ if (TIdeltay > 0.1)
+ mProjPars.hemisphere = TeSOUTH_HEM;
+ else
+ mProjPars.hemisphere = TeNORTH_HEM;
+ break;
+ default :
+ mProjPars.name = "NoProjection";
+ break;
+ }
+ mProjPars.datum = mDatum;
+ proj = TeProjectionFactory::make(mProjPars);
+ }
+ if (proj && proj->name() != "NoProjection")
+ isGeoTiff_ = true;
+ params_.projection(proj);
+ delete proj;
+ }
+
+ // try find .tfw file
+ string filename=params_.fileName_;
+ long pos = filename.size() - 3;
+ filename.replace(pos,3,"tfw");
+ DecodeTFW(filename);
+ return isGeoTiff_;
+}
+
+
+bool
+TeDecoderTIFF::DecodeTFW(const string& filename)
+{
+ FILE *fp = fopen(filename.data(),"r");
+ if( fp )
+ {
+ isGeoTiff_ = true;
+ double dxj=0.,dyj=0.,dxi=0.,dyi=0.,x0=0.,y0=0.;
+ char val[40];
+ if( fscanf(fp,"%s",val) )
+ dxj = TeRoundD(atof(val)); // dxJ=resx
+ else
+ isGeoTiff_ = false;
+ if( fscanf(fp,"%s",val) )
+ dyj = TeRoundD(atof(val)); // dyJ
+ else
+ isGeoTiff_ = false;
+ if( fscanf(fp,"%s",val) )
+ dxi = TeRoundD(atof(val)); // dxI
+ else
+ isGeoTiff_ = false;
+ if( fscanf(fp,"%s",val) )
+ dyi = TeRoundD(atof(val)); // dyI = resy
+ else
+ isGeoTiff_ = false;
+ if( fscanf(fp,"%s",val) )
+ x0 = TeRoundD(atof(val)); // x0
+ else
+ isGeoTiff_ = false;
+ if( fscanf(fp,"%s",val) )
+ y0 = TeRoundD(atof(val)); // y0
+ else
+ isGeoTiff_ = false;
+ fclose(fp);
+
+ if (isGeoTiff_)
+ {
+ params_.resx_ = dxj;
+ params_.resy_ = ABS(dyi);
+
+ if (dxi != 0 || dyj != 0)
+ {
+ params_.dyJ_ = dyj;
+ params_.dyI_ = dyi;
+ params_.dxI_ = dxi;
+ params_.dxJ_ = dxj;
+ params_.x0_ = x0;
+ params_.y0_ = y0;
+ }
+ else // there is no rotation or scaling defined
+ { // uses only box and resolution
+ // double llx = x0; variable not used
+ // double ury = y0; variable not used
+ params_.topLeftResolutionSize(x0,y0,params_.resx_,params_.resy_,params_.ncols_,params_.nlines_,true);
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+// --- Methods that deal with the internal buffer to store the image in memory
+
+bool
+TeDecoderTIFF::AllocateBuffer()
+{
+ unsigned long bufsize;
+ int n;
+
+ if (TBufferTile_)
+ {
+ delete []TBufferTile_;
+ TBufferTile_ = 0;
+ }
+ if (TBuffer_)
+ {
+ delete []TBuffer_;
+ TBuffer_ = 0;
+ }
+
+ if (isTiled_) // we don�t write tiled TIFF
+ { // let libtigg manage its raw data buffer
+ // allocate a buffer to encode/decode a tile
+ bufsize = bytespertile_;
+ TBufferTile_ = new unsigned char[bytespertile_];
+ if (!TBufferTile_)
+ return false;
+/* n = TIFFReadBufferSetup(tif,TBufferTile_,bufsize);
+ n = TIFFWriteBufferSetup(tif,TBufferTile_,bufsize);
+*/
+ // allocate a buffer to hold a line of image
+ // a line may be formed by more than one tile
+ TBuffer_ = new unsigned char[bytesperline_];
+ if (!TBuffer_)
+ {
+ delete []TBufferTile_;
+ TBufferTile_ = 0;
+ return false;
+ }
+ }
+ else
+ {
+ if (params_.mode_ == 'r') // if we are reading let libtiff handle
+ { // the raw buffer and keeps a copy of each line
+ bufsize = TIFFScanlineSize(tif) * params_.nBands();
+ TBuffer_ = new unsigned char[bufsize];
+ if (!TBuffer_)
+ return false;
+ }
+ else // if we are writting
+ { // we control the raw buffer
+ bufsize = TIFFStripSize(tif);
+ TBuffer_ = new unsigned char[bufsize];
+ if (!TBuffer_)
+ return false;
+ n = TIFFReadBufferSetup(tif,TBuffer_,bufsize);
+ n = TIFFWriteBufferSetup(tif,TBuffer_,bufsize);
+ }
+ }
+ return true;
+}
+
+void
+TeDecoderTIFF::DeallocateBuffer()
+{
+ if (TBuffer_)
+ delete [] TBuffer_;
+ TBuffer_ = 0;
+
+ if (TBufferTile_)
+ delete [] TBufferTile_;
+ TBufferTile_ = 0;
+}
+
+
+// ---- Internal routines
+bool
+TeDecoderTIFF::WriteDummyImage()
+{
+ long ssize = TIFFScanlineSize(gtif->gt_tif);
+ unsigned char* obuf = (unsigned char*)_TIFFmalloc(ssize);
+ unsigned char* pp;
+ pp = obuf;
+ if (TImage == RGBIMAGE) // RGB image
+ {
+ for (int x = 0; x < params_.ncols_; x++)
+ {
+ if (params_.dataType_[0] == TeFLOAT) // 32 bits
+ {
+ ((float*)obuf)[x] = (float)params_.dummy_[0];
+ ((float*)obuf)[x+1] = (float)params_.dummy_[1];
+ ((float*)obuf)[x+2] = (float)params_.dummy_[2];
+ }
+ else if (params_.dataType_[0] == TeSHORT) // 16 bits
+ {
+ ((short*)obuf)[x] = (short)params_.dummy_[0];
+ ((short*)obuf)[x+1] = (short)params_.dummy_[1];
+ ((short*)obuf)[x+2] = (short)params_.dummy_[2];
+ }
+ else // 8 bits
+ {
+ obuf[x] = (unsigned char)params_.dummy_[0];
+ obuf[x+1] = (unsigned char)params_.dummy_[1];
+ obuf[x+2] = (unsigned char)params_.dummy_[2];
+ }
+ }
+ }
+ else // Mono or pallete image
+ {
+ for (int x = 0; x < params_.ncols_; x++)
+ {
+ if (params_.dataType_[0] == TeFLOAT) // 32 bits
+ ((float*)obuf)[x] = (float)params_.dummy_[0];
+ else if (params_.dataType_[0] == TeSHORT) // 16 bits
+ ((short*)obuf)[x] = (short)params_.dummy_[0];
+ else // 8 bits
+ obuf[x] = (unsigned char)params_.dummy_[0];
+ }
+ }
+
+ for (int row=0; row<params_.nlines_; row++)
+ {
+ if (!TIFFWriteScanline(gtif->gt_tif, obuf, row, 0))
+ return false;
+ }
+ TIFFFlushData(gtif->gt_tif);
+ _TIFFfree(obuf);
+ return true;
+}
+
+bool
+TeDecoderTIFF::ReadMonoImage(unsigned long lin)
+{
+ if (isTiled_)
+ {
+ if (!ReadTileImageContig(lin,TBuffer_))
+ return false;
+ }
+ else
+ {
+ //int offset = (lin % rowsperstrip_)* bytesperline_;
+ if (TIFFReadScanline(tif,TBuffer_,lin,0) < 0)
+ return false;
+ }
+ return true;
+}
+
+bool
+TeDecoderTIFF::ReadRGBImage (unsigned long lin)
+{
+ if (planar_ == PLANARCONFIG_CONTIG)
+ {
+ if (isTiled_)
+ {
+ if(!ReadTileImageContig(lin,TBuffer_))
+ return false;
+ }
+ else
+ {
+ if (TIFFReadScanline(tif,TBuffer_,lin,0) < 0)
+ return false;
+ }
+ }
+ else // RGB Separate
+ {
+ if (isTiled_)
+ return false;
+ int s;
+ for (s=0; s < nBands_; s++)
+ if (TIFFReadScanline(tif,&TBuffer_[s*params_.ncols_],lin,s) < 0)
+ return false;
+ }
+ return true;
+}
+
+// |- -| |- -| |- -|
+// | X | | a b 0 d | | I |
+// | | | | | |
+// | Y | | e f 0 h | | J |
+// | | = | | | |
+// | Z | | 0 0 0 0 | | K |
+// | | | | | |
+// | 1 | | 0 0 0 1 | | 1 |
+// |- -| |- -| |- -|
+
+// Direct transformation
+// X = a*I + b*j + d
+// Y = e*I + f*j + h
+
+// Inverse Transformation
+// I = [f(X-d) - b(Y-h)) / (af-eb)
+// J = [e(X-d) - a(Y-h)) / (eb-af)
+// where
+// a = transMatrix_[0]
+// b = transMatrix_[1]
+// d = transMatrix_[3]
+// e = transMatrix_[4]
+// f = transMatrix_[5]
+// h = transMatrix_[7]
+
+TeCoord2D
+TeDecoderTIFF::index2Coord (TeCoord2D& pt)
+{
+ if (transMatrix_)
+ {
+ double x,y;
+ x = transMatrix_[3] + pt.x()*transMatrix_[0] + pt.y()*transMatrix_[1];
+ y = transMatrix_[7] + pt.x()*transMatrix_[4] - pt.y()*transMatrix_[5];
+ return TeCoord2D(x,y);
+ }
+ else if (tiePoints_)
+ {
+ double x,y;
+ x = tiePoints_[3] + (pt.x() - tiePoints_[0]) * params_.resx_;
+ y = tiePoints_[4] - (pt.y() - tiePoints_[1]) * params_.resy_;
+ return TeCoord2D(x,y);
+ }
+ else
+ return params_.index2Coord (pt);
+}
+
+TeCoord2D
+TeDecoderTIFF::coord2Index (TeCoord2D& pt)
+{
+ if (transMatrix_)
+ {
+ double i,j;
+ double f = -transMatrix_[5];
+ double af = transMatrix_[0]*f;
+ double eb = transMatrix_[4]*transMatrix_[1];
+ double xd = pt.x() - transMatrix_[3];
+ double yh = pt.y() - transMatrix_[7];
+
+ i = (f*xd - transMatrix_[1]*(yh)) / (af-eb);
+ j = (transMatrix_[4]*xd - transMatrix_[0]*(yh)) / (eb-af);
+
+ return TeCoord2D(i,j);
+ }
+ else if (tiePoints_)
+ {
+ double i,j;
+ i = (pt.x() - tiePoints_[3]) / params_.resx_ + tiePoints_[0];
+ j = (tiePoints_[4] - pt.y()) / params_.resy_ + tiePoints_[1];
+ return TeCoord2D(i,j);
+ }
+ else
+ return params_.coord2Index(pt);
+}
+
+void TeDecoderTIFF::Print()
+{
+ long t = 0L;
+ if(tif)
+ TIFFPrintDirectory(tif,stdout,t);
+}
+
+static long Tiffpow2(short bits)
+{
+ unsigned long ret = 1;
+ unsigned short x;
+
+ for(x=0; x < bits ; x++)
+ ret *= 2;
+
+ return ret;
+}
+
+static unsigned short CalculateMask(unsigned short bits)
+{
+ unsigned long ret;
+ ret = Tiffpow2(bits) -1L;
+ return (unsigned short)ret;
+}
+
+static void ShiftAndLoadTo8Bits(unsigned char *ret, unsigned char *buf, short bits, unsigned long col, unsigned short mask)
+{
+ long shift1 = (long) (8 - bits);
+ long shift = shift1;
+ unsigned long y = 0;
+ unsigned long x;
+
+ for(x=0; x < col; x++)
+ {
+ ret[x] = (buf[y] >> shift)&mask;
+ shift -= bits;
+ if( shift < 0 )
+ {
+ shift = shift1;
+ y++;
+ }
+ }
+}
+
+static void CreateLut(short bits,u_char lut[])
+{
+ u_long itens = Tiffpow2(bits);
+ u_long x;
+
+ for (x=0; x < itens; x++)
+ lut[x] = (u_char) ( (255L*x)/(itens-1));
+}
+
+void TeDecoderTIFF:: To8Bits(unsigned char* buf,unsigned char *ret,short vmax,short vmin,short nx)
+{
+ if (params_.nbitsperPixel_[0] == 32)
+ {
+ unsigned long aux;
+
+ long j=0;
+ long ls = (long)params_.ncols_*4;
+
+ for (long i=0; i< ls; i+=4)
+ {
+ memcpy(&aux,&buf[i],4);
+
+ ret[j] = (unsigned char)aux;
+ j++;
+ }
+ return;
+ }
+
+ if (params_.nbitsperPixel_[0] == 16)
+ {
+ short aux,aux2,i,j;
+ float div = (float)((vmax-vmin)/255.);
+
+ j=0;
+
+ for (i=0; i<nx*2; i+=2)
+ {
+ memcpy(&aux,&buf[i],2);
+
+ aux2 = (short) ((float)(aux-vmin) /div);
+ ret[j] = (unsigned char)aux2;
+ j++;
+ }
+ return;
+ }
+
+ if ( params_.nbitsperPixel_[0] == 8 )
+ {
+ memcpy(ret,buf,params_.ncols_);
+ return;
+ }
+
+ if( first )
+ {
+ mask = CalculateMask(params_.nbitsperPixel_[0]);
+ CreateLut(params_.nbitsperPixel_[0],Lut);
+ first = 0;
+ }
+
+ ShiftAndLoadTo8Bits(ret,buf,params_.nbitsperPixel_[0],params_.ncols_,mask);
+ unsigned long x;
+ for(x=0; x < (unsigned long)params_.ncols_; x++)
+ {
+ ret[x] = Lut[ret[x]];
+ }
+}
+
+// --- Tile Functions ---/
+bool
+TeDecoderTIFF::ReadTileImageContig(unsigned long lin, unsigned char *line)
+{
+ unsigned long offset = lin%tileh_;
+ unsigned long col, i, nbytes;
+ for (col=0; col < (unsigned long)params_.ncols_; col += tilew_)
+ {
+ if (TIFFReadTile(tif, TBufferTile_, col, lin, 0, 0) < 0 )
+ return false;
+ nbytes = params_.nbitsperPixel_[0]/8;
+ if (col + tilew_ > (unsigned long)params_.ncols_ )
+ {
+ unsigned long diff = params_.ncols_-col;
+ for (i=0; i < diff*nbytes; i++)
+ line[i+col] = TBufferTile_[i+offset*rowtilesize_];
+ }
+ else
+ {
+ for (i=0; i < tilew_*nbytes; i++)
+ line[col+i] = TBufferTile_[i+offset*rowtilesize_];
+ }
+ }
+ return true;
+}
+
+// --- To read and set a LUT table ---
+
+static int checkmap(int n, unsigned short *r, unsigned short *g, unsigned short *b,long val)
+{
+ while (n-- >= 0)
+ if (*r++ > val || *g++ > val || *b++ > val)
+ return (16);
+ return (8);
+}
+
+static unsigned short CVT1 (unsigned long x,long value) //CVT is used in DEC station
+{
+ unsigned long den = (1L << 16) -1L;
+ unsigned short num = (unsigned short)((x*value)/den); // normalize lut value
+ return num;
+}
+
+bool
+TeDecoderTIFF::ReadLut()
+{
+ unsigned short *rmap,*gmap,*bmap;
+ if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &rmap, &gmap, &bmap))
+ return false;
+
+ int range = (1 << params_.nbitsperPixel_[0])-1;
+ int x;
+ long val = (long)pow(2.,params_.nbitsperPixel_[0]) - 1;
+ params_.setNumberPalleteEntries(range);
+ if (checkmap (range,rmap,gmap,bmap,val) == 16)
+ {
+ for(x = range; x >= 0; x--)
+ {
+ params_.lutr_[x] = CVT1(rmap[x],val);
+ params_.lutg_[x] = CVT1(gmap[x],val);
+ params_.lutb_[x] = CVT1(bmap[x],val);
+ }
+ }
+ else
+ {
+ for(x = range; x >= 0; x--)
+ {
+ params_.lutr_[x] = rmap[x];
+ params_.lutg_[x] = gmap[x];
+ params_.lutb_[x] = bmap[x];
+ }
+ }
+ return true;
+}
+
+void
+TeDecoderTIFF::SaveLut()
+{
+ if (!tif)
+ return;
+
+ int nentries = params_.lutr_.size();
+ if (nentries <= 0)
+ return;
+
+ unsigned short* lutr = new unsigned short[nentries];
+ unsigned short* lutg = new unsigned short[nentries];
+ unsigned short* lutb = new unsigned short[nentries];
+
+ for (int i=0; i<nentries; i++)
+ {
+ lutr[i] = params_.lutr_[i]*255;
+ lutg[i] = params_.lutg_[i]*255;
+ lutb[i] = params_.lutb_[i]*255;
+ }
+ TIFFSetField(tif, TIFFTAG_COLORMAP,lutr,lutg,lutb);
+}
diff --git a/src/terralib/kernel/TeDecoderTIFF.h b/src/terralib/kernel/TeDecoderTIFF.h
new file mode 100644
index 0000000..b8e3e85
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderTIFF.h
@@ -0,0 +1,205 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderTIFF.h
+ This file contais functions to deal with raster images in Tiff/GeoTIFF format.
+*/
+
+#ifndef __TERRALIB_INTERNAL_DECODERTIFF_H
+#define __TERRALIB_INTERNAL_DECODERTIFF_H
+
+// LibTIFF includes
+#include "geotiff.h"
+#include "xtiffio.h"
+#include "geo_normalize.h"
+#include "geovalues.h"
+#include "tiffiop.h"
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h" /* private interface */
+
+#include <iostream>
+#include <stdio.h>
+#include <sys/types.h>
+
+#include "TeDecoderVirtualMemory.h"
+
+#include <map>
+using namespace std;
+
+#define MONOIMAGE 0 /* Image type monochrome */
+#define RGBIMAGE 1 /* Image type color image */
+#define PALLETEIMAGE 2 /* Image type pallete image */
+
+
+//! Implements a decoder to a raster in TIFF (Tagged Image File Format) format
+/*!
+ Decoder TIFF is based on geotiff libray (http://remotesensing.org/geotiff/geotiff.html).
+ This imposes some restrictions to this decoder. Using libtiff TIFF image files may not
+ be opened for both reading and writing; there is no support for altering the contents of
+ a TIFF file. So this decoder is limited to create new tiff files or to read existing ones.
+*/
+class TeDecoderTIFF : public TeDecoder
+{
+ TIFF *tif; // TIFF directory structure
+ GTIF *gtif; // GEOTIFF directory structure
+
+ unsigned char *TBuffer_;
+ unsigned char *TBufferTile_;
+
+ bool isGeoTiff_; // flag that indicates georeference
+ bool isTiled_; // flag indicating if image is tiled
+ unsigned short photom_; // photometric interpretation
+ unsigned short planar_; // storage organization : PLANARCONFIG_CONTIG or PLANARCONFIG_SEPARATE
+ unsigned short compress_; // compression flag: COMPRESSION_NONE, COMPRESSION_CCITTRLE, COMPRESSION_CCITTFAX3 and others
+ short TImage; // MONOIMAGE, RGBIMAGE, PALLETE
+ int nBands_; // number of bands
+ int nbitsperpixel_;
+ unsigned long bytesperline_;
+ unsigned long tilew_,tileh_;
+ unsigned long rowtilesize_;
+ unsigned long bytespertile_;
+ unsigned long rowsperstrip_;
+ int TCurLine_; // current line in memory
+ int TCurTile_; // current tile in memory
+
+
+ bool first; // Flag to test the first access to To8Bits() function
+ unsigned char Lut[256]; // Lut to convert nbits/pixel to 8bits/pixel
+ unsigned short mask; // mask bits 0000...1 for 1 bit
+ // 000.1111 for 2 bits and on
+
+ double *transMatrix_;
+ double *pixelScale_;
+ double *tiePoints_;
+
+
+ // if PHOTOMETRIC_YCBCR:
+ float *YCbCrCoeffs, *refBlackWhite; // Chrominance coefficients
+ unsigned short YCbCrHorizSampling, // Horizontal Smapling
+ YCbCrVertSampling; // Vertical and
+
+
+
+
+ //! Reads TIFF Directory and fills tif structure
+ void ReadTiffDirectory();
+
+ //! Reads the georeferencing keys of a geotiff data
+ bool GetGeoTIFF ();
+
+ //! Reads and inteprets a .tfw file associated to a tiff
+ bool DecodeTFW(const string& filename);
+
+ //! Sets the georeferencing keys of a geotiff data
+ void SetGeoKeys();
+
+ //! Write a dummy image (when creating a tiff file)
+ bool WriteDummyImage();
+
+ //! Reads a line of monochrome image
+ /*! \param buf image
+ \param lin line number to read
+ \return true if line is secessfully read and false otherwise
+ */
+ bool ReadMonoImage(unsigned long lin);
+
+ //! Reads a line of color image
+ /*! \param lin line number to read
+ \return true if line is secessfully read and false otherwise
+ */
+ bool ReadRGBImage(unsigned long lin);
+
+ //! Reads color image if planar = PLANARCONFIG_CONTIG
+ /*! \param lin line number to read
+ \return non 0 if line is secessfully written and 0 otherwise
+ */
+ bool ReadRGBContig(unsigned long lin);
+
+ //! Reads color image if planar = PHOTOMETRIC_PALETTE
+ /*! \param lin line number to read
+ \return non 0 if line is secessfully written and 0 otherwise
+ */
+ bool ReadPaletteContig(unsigned long lin);
+
+ bool ReadTileImageContig(unsigned long lin, unsigned char *line);
+
+ //! Allocates the internal buffers
+ bool AllocateBuffer();
+
+ //! Allocates the internal buffers
+ void DeallocateBuffer();
+
+ //! Reads Lut associated to a raster pallete
+ bool ReadLut();
+
+ //! Saves the associated LUT for pallete raster
+ void SaveLut();
+
+ //! Converts buf to 8 bits per pixel into ret buffer
+ // Input:
+ // buf - a line of image stored in TIFF
+ // Output:
+ // ret - image line converted to 8 bits per pixel
+ // Preconditions:
+ // image line buffer (ret) must be allocated
+ // previously before call this function
+ void To8Bits(u_char *buf,u_char *ret,short vmax=0, short vmin = 0,short nx=0);
+
+ //! Prints to standard output contents of TIFF directory
+ void Print();
+
+ // Returns true if tiff data is compressed
+ bool IsCompressed() { return compress_ != COMPRESSION_NONE; }
+
+public:
+
+ //! Construtor from parameters
+ TeDecoderTIFF( const TeRasterParams& );
+
+ //! Normal destructor
+ ~TeDecoderTIFF();
+
+ //! Initializes raster structure
+ void init();
+
+ //! Clear internal parameters
+ bool clear();
+
+ TeCoord2D index2Coord (TeCoord2D& pt);
+ TeCoord2D coord2Index (TeCoord2D& pt);
+
+ bool setElement (int col,int lin, double val, int band=0);
+ bool getElement (int col,int lin, double &val,int band=0);
+};
+
+//! Implements a tiff decoder factory
+class TeDecoderTIFFFactory : public TeDecoderFactory
+{
+public:
+
+ TeDecoderTIFFFactory(const string& name) : TeDecoderFactory(name) {}
+
+ virtual TeDecoder* build (const TeRasterParams& arg)
+ { return new TeDecoderTIFF(arg); }
+};
+
+#endif
diff --git a/src/terralib/kernel/TeDecoderVirtualMemory.cpp b/src/terralib/kernel/TeDecoderVirtualMemory.cpp
new file mode 100644
index 0000000..fa52431
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderVirtualMemory.cpp
@@ -0,0 +1,442 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeDecoderVirtualMemory.h>
+
+//! Destructor
+TeMemoryPage::~TeMemoryPage()
+{
+ if (this->data_ != 0)
+ {
+ switch (dataType_)
+ {
+ case (TeUNSIGNEDCHAR):
+ delete [](unsigned char*)data_;
+ break;
+ case (TeCHAR) :
+ delete (char*)data_;
+ break;
+ case (TeUNSIGNEDSHORT):
+ delete [](unsigned short*)data_;
+ break;
+ case (TeSHORT):
+ delete (short*) data_;
+ break;
+ case (TeUNSIGNEDLONG):
+ delete [](unsigned long*)data_;
+ break;
+ case (TeLONG):
+ delete [](long*) data_;
+ break;
+ case (TeFLOAT):
+ delete [](float*)data_;
+ break;
+ case (TeDOUBLE):
+ delete [](double*) data_;
+ break;
+ default:
+ break;
+ }
+ data_ = 0;
+ }
+}
+
+TeMemoryPage::TeMemoryPage(unsigned long size, double defValue, TeDataType dataType):
+ used_(false),
+ size_(size),
+ defValue_(defValue),
+ dataType_(dataType)
+{
+ data_ = 0;
+ try
+ {
+ unsigned int i;
+ // Try to allocate the necessary memory
+ switch (dataType_) {
+ case (TeUNSIGNEDCHAR):
+ data_ = new unsigned char [size_];
+ for (i=0;i<size;((unsigned char*)data_)[i]=(unsigned char) defValue_,i++);
+ break;
+ case (TeCHAR) :
+ data_ = new char [size_];
+ for (i=0;i<size;((char*)data_)[i]=(char) defValue_,i++);
+ break;
+ case (TeUNSIGNEDSHORT):
+ data_ = new unsigned short [size_];
+ for (i=0;i<size;((unsigned short*)data_)[i]= (unsigned short) defValue_,i++);
+ break;
+ case (TeSHORT):
+ data_ = new short [size_];
+ for (i=0;i<size;((short*)data_)[i]=(short)defValue_,i++);
+ break;
+ case (TeUNSIGNEDLONG):
+ data_ = new unsigned long [size_];
+ for (i=0;i<size;((unsigned long*)data_)[i]=(unsigned long)defValue_,i++);
+ break;
+ case (TeLONG):
+ data_ = new long [size_];
+ for (i=0;i<size;((long*)data_)[i]=(long)defValue_,i++);
+ break;
+ case (TeFLOAT):
+ data_ = new float [size_];
+ for (i=0;i<size;((float*)data_)[i]=(float)defValue_,i++);
+ break;
+ case (TeDOUBLE):
+ data_ = new double [size_];
+ for (i=0;i<size;((double*)data_)[i]=(double)defValue_,i++);
+ break;
+ default:
+ break;
+ }
+ }
+ catch (...)
+ {
+ }
+}
+
+void
+TeMemoryPage::clear()
+{
+ unsigned int i;
+ switch (dataType_)
+ {
+ case (TeUNSIGNEDCHAR):
+ for (i=0;i<size_;((unsigned char*)data_)[i]=(unsigned char) defValue_,i++);
+ break;
+ case (TeCHAR) :
+ for (i=0;i<size_;((char*)data_)[i]=(char) defValue_,i++);
+ break;
+ case (TeUNSIGNEDSHORT):
+ for (i=0;i<size_;((unsigned short*)data_)[i]= (unsigned short) defValue_,i++);
+ break;
+ case (TeSHORT):
+ for (i=0;i<size_;((short*)data_)[i]=(short)defValue_,i++);
+ break;
+ case (TeUNSIGNEDLONG):
+ for (i=0;i<size_;((unsigned long*)data_)[i]=(unsigned long)defValue_,i++);
+ break;
+ case (TeLONG):
+ for (i=0;i<size_;((long*)data_)[i]=(long)defValue_,i++);
+ break;
+ case (TeFLOAT):
+ for (i=0;i<size_;((float*)data_)[i]=(float)defValue_,i++);
+ break;
+ case (TeDOUBLE):
+ for (i=0;i<size_;((double*)data_)[i]=(double)defValue_,i++);
+ break;
+ default:
+ break;
+ }
+}
+
+long
+TeMemoryPage::pageSize()
+{
+ long s;
+ switch (dataType_)
+ {
+ case (TeCHAR) :
+ s = size_*sizeof(char);
+ break;
+ case (TeUNSIGNEDSHORT):
+ s = size_*sizeof(unsigned short);
+ break;
+ case (TeSHORT):
+ s = size_*sizeof(short);
+ break;
+ case (TeUNSIGNEDLONG):
+ s = size_*sizeof(unsigned long);
+ break;
+ case (TeLONG):
+ s = size_*sizeof(long);
+ break;
+ case (TeFLOAT):
+ s = size_*sizeof(float);
+ break;
+ case (TeDOUBLE):
+ s = size_*sizeof(double);
+ break;
+ default:
+ s = size_*sizeof(unsigned char);
+ }
+ return s;
+}
+
+double
+TeMemoryPage::getVal(int col,int lin, int nCols)
+{
+ unsigned long offset = (lin-ulLin_)*nCols+(col-ulCol_);
+ double val = defValue_;
+ if (offset < size_) // solucao temporaria, rever
+ {
+ switch (dataType_)
+ {
+ case (TeUNSIGNEDCHAR):
+ val = ((unsigned char*)data_)[offset];
+ break;
+ case (TeCHAR) :
+ val = ((char*) data_)[offset];
+ break;
+ case (TeUNSIGNEDSHORT):
+ val = ((unsigned short*)data_)[offset];
+ break;
+ case (TeSHORT):
+ val = ((short*)data_)[offset];
+ break;
+ case (TeUNSIGNEDLONG):
+ val = ((unsigned long*)data_)[offset];
+ break;
+ case (TeLONG):
+ val = ((long*)data_)[offset];
+ break;
+ case (TeFLOAT):
+ val = ((float*)data_)[offset];
+ break;
+ case (TeDOUBLE):
+ val = ((double*)data_)[offset];
+ break;
+ default:
+ break;
+ }
+ }
+ return val;
+}
+
+void
+TeMemoryPage::setVal(int col,int lin,int nCols, double val)
+{
+ unsigned long offset = (lin-ulLin_)*nCols+(col-ulCol_);
+ if (offset < size_)
+ {
+ switch (dataType_)
+ {
+ case (TeUNSIGNEDCHAR):
+ ((unsigned char*)data_)[offset] = (unsigned char) val;
+ break;
+
+ case (TeCHAR) :
+ ((char*) data_)[offset] = (char) val;
+ break;
+
+ case (TeUNSIGNEDSHORT):
+ ((unsigned short*)data_)[offset] = (unsigned short) val;
+ break;
+
+ case (TeSHORT):
+ ((short*)data_)[offset] = (short) val;
+ break;
+
+ case (TeUNSIGNEDLONG):
+ ((unsigned long*)data_)[offset] = (unsigned long) val;
+ break;
+
+ case (TeLONG):
+ ((long*)data_)[offset] = (long) val;
+ break;
+
+ case (TeFLOAT):
+ ((float*)data_)[offset] = (float) val;
+ break;
+
+ case (TeDOUBLE):
+ ((double*)data_)[offset] = val;
+
+ default:
+ break;
+ }
+ }
+ return;
+}
+
+TeDecoderVirtualMemory::TeDecoderVirtualMemory( const TeRasterParams& par)
+{
+ params_ = par;
+}
+
+TeDecoderVirtualMemory::~TeDecoderVirtualMemory()
+{
+ if (!pagesQueue_.empty())
+ TeDecoderVirtualMemory::clear();
+}
+
+bool
+TeDecoderVirtualMemory::getElement(int col,int lin, double &val,int band)
+{
+ // identify the page has the pixel (col,lin,band)
+ string index = codifyId(col,lin,band,1,0);
+ TeMemoryPage* block = 0;
+
+// int nt = params_.nTilesInMemory_;
+
+ // check band cache first
+ if (indexCache_[band] == index)
+ block = pageCache_[band];
+ else
+ {
+ // check if page is already in memory
+ MapMemoryPageIterator p = virtualMemory_.find(index);
+ if (p != virtualMemory_.end())
+ {
+ // use it
+ block = p->second;
+ }
+ else
+ {
+ // page is not in memory
+ // check whether there is space in memory to bring another page
+ if (virtualMemory_.size() >= (unsigned int)params_.nTilesInMemory_)
+ {
+ // FIFO strategy: replace the oldest page in memory
+ string first = pagesQueue_.front();
+ pagesQueue_.pop();
+ p = virtualMemory_.find(first);
+ if (p != virtualMemory_.end())
+ {
+ block = p->second;
+ if (block->used_)
+ putRasterBlock(first,block->data_,block->pageSize());
+ block->clear(); // reuse the allocated memory
+ virtualMemory_.erase(first);
+ }
+ }
+ else
+ // bring the page to memory
+ block = new TeMemoryPage(params_.blockHeight_*params_.blockWidth_, params_.dummy_[band],params_.dataType_[band]);
+
+ virtualMemory_.insert(MapMemoryPage::value_type(index,block));
+ pagesQueue_.push(index);
+ int ulLin=0, ulCol=0;
+ getRasterBlock(index,block->data_,ulCol,ulLin);
+ block->ulLin_ = ulLin;
+ block->ulCol_ = ulCol;
+ }
+ indexCache_[band] = index;
+ pageCache_[band] = block;
+ }
+ val = block->getVal(col,lin,params_.blockWidth_);
+ return true;
+}
+
+bool
+TeDecoderVirtualMemory::setElement(int col, int lin, double val,int band)
+{
+ string index = codifyId(col,lin,band,1,0);
+
+ TeMemoryPage* block = 0;
+
+ // check band cache first
+ if (indexCache_[band] == index)
+ block = pageCache_[band];
+ else
+ {
+ MapMemoryPageIterator p = virtualMemory_.find(index);
+ if (p != virtualMemory_.end())
+ {
+ block = p->second;
+ }
+ else
+ {
+ if (virtualMemory_.size() >= (unsigned int)params_.nTilesInMemory_)
+ {
+ string first = pagesQueue_.front();
+ pagesQueue_.pop();
+ p = virtualMemory_.find(first);
+ if (p != virtualMemory_.end())
+ {
+ block = p->second;
+ if (block->used_ == true)
+ {
+ putRasterBlock(first,block->data_,block->pageSize());
+ }
+ block->clear();
+ virtualMemory_.erase(first);
+ }
+ }
+ else
+ block = new TeMemoryPage(params_.blockHeight_*params_.blockWidth_, params_.dummy_[band],params_.dataType_[band]);
+ virtualMemory_.insert(MapMemoryPage::value_type(index,block));
+ pagesQueue_.push(index);
+ int ulLin=0, ulCol=0;
+ getRasterBlock(index,block->data_,ulCol,ulLin);
+ block->ulLin_ = ulLin;
+ block->ulCol_ = ulCol;
+ }
+ indexCache_[band] = index;
+ pageCache_[band] = block;
+ }
+ block->setVal(col,lin,params_.blockWidth_,val);
+ block->used_ = true;
+ return true;
+}
+
+
+/*bool
+TeDecoderVirtualMemory::create()
+{
+ clear();
+ if ( params_.nTilesInMemory_ == 0 )
+ params_.nTilesInMemory_ = params_.nBands() * (params_.ncols_ / params_.blockWidth_+1) ;
+ pageCache_.resize(params_.nBands(),0);
+ indexCache_.resize(params_.nBands(),"");
+ return true;
+}
+*/
+void
+TeDecoderVirtualMemory::init()
+{
+ TeDecoderVirtualMemory::clear();
+ if ( params_.nTilesInMemory_ == 0 )
+ params_.nTilesInMemory_ = params_.nBands() * (params_.ncols_ / params_.blockWidth_+1) ;
+ pageCache_.resize(params_.nBands(),0);
+ indexCache_.resize(params_.nBands(),"");
+}
+
+bool
+TeDecoderVirtualMemory::clear()
+{
+ TeMemoryPage* block;
+ string index;
+
+ MapMemoryPageIterator p;
+
+ while (!pagesQueue_.empty() )
+ {
+ index = pagesQueue_.front();
+ pagesQueue_.pop();
+ p = virtualMemory_.find(index);
+ if (p != virtualMemory_.end())
+ {
+ block = p->second;
+ if (block->used_)
+ {
+ putRasterBlock(index,block->data_,block->pageSize());
+ }
+ delete block;
+ virtualMemory_.erase(index);
+ }
+ }
+ indexCache_.clear();
+ pageCache_.clear();
+ return true;
+}
+
diff --git a/src/terralib/kernel/TeDecoderVirtualMemory.h b/src/terralib/kernel/TeDecoderVirtualMemory.h
new file mode 100644
index 0000000..5e7ad69
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderVirtualMemory.h
@@ -0,0 +1,196 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderVirtualMemory.h
+ This file supports a virtual memory strategy to deal whith raster structures
+*/
+#ifndef __TERRALIB_INTERNAL_DECODERVIRTUALMEMORY_H
+#define __TERRALIB_INTERNAL_DECODERVIRTUALMEMORY_H
+
+#include "TeDecoder.h"
+
+#include <queue>
+#include <vector>
+using namespace std;
+
+//! A page of memory
+class TeMemoryPage
+{
+public:
+ void* data_; //<! Pointer to the data in memory
+ bool used_; //<! Flag that indicate if the page was modified in memory
+ unsigned long size_; //<! Page number of elements
+
+ int ulLin_; //<! Line index of the upper-left corner
+ int ulCol_; //<! Column index of the upper-left corner
+ double defValue_; //<! Default value (fo initially fill the page)
+ TeDataType dataType_; //<! Pixel data type
+
+ //! Constructor
+ TeMemoryPage(unsigned long size, double defValue, TeDataType dataType = TeDOUBLE);
+
+ //! Destructor
+ ~TeMemoryPage();
+
+ //! Copy constructor
+ TeMemoryPage(const TeMemoryPage& rhs)
+ {
+ if (this != &rhs)
+ {
+ data_ = rhs.data_;
+ used_ = rhs.used_;
+ defValue_ = rhs.defValue_;
+ dataType_ = rhs.dataType_;
+ }
+ }
+
+ //! Operator =
+ TeMemoryPage& operator=(const TeMemoryPage& rhs)
+ {
+ data_ = rhs.data_;
+ used_ = rhs.used_;
+ size_ = rhs.size_;
+ defValue_ = rhs.defValue_;
+ dataType_ = rhs.dataType_;
+ return *this;
+ }
+
+ //! Returns the value of on position within the block
+ /*
+ \par col column identifier of the position
+ \par lin line identifier of the position
+ \par nCols number of columns per line of the block
+ \returns the value of the position indicated by (col x lin)
+ */
+ double getVal(int col,int lin, int nCols);
+
+ //! Sets the value of a position within the block
+ /*
+ \par col column identifier of the position
+ \par lin line identifier of the position
+ \par nCols number of columns per line of the block
+ \par val the value to be put in the position
+ */
+ void setVal(int col,int lin,int nCols, double val);
+
+ //! Set all positions of the page to the default value;
+ void clear();
+
+ //! Returns the physical size of a memory page
+ long pageSize();
+};
+
+//! A map of string identifiers to pointer to memory pages
+typedef map<string,TeMemoryPage*> MapMemoryPage;
+
+//! A const iterator to a map of pages
+typedef map<string,TeMemoryPage*>::const_iterator MapMemoryPageIterator;
+
+//! Implements a virtual memory strategy to decode raster in blocks
+/*
+ It should be used as a parent class of decoder that access raster
+ blocks from a physical storage
+*/
+class TeDecoderVirtualMemory: public TeDecoder
+{
+public:
+
+ //! Empty constructor
+ TeDecoderVirtualMemory() {};
+
+ //! Constructor from paramenters
+ TeDecoderVirtualMemory( const TeRasterParams& par);
+
+ //! Destructor
+ ~TeDecoderVirtualMemory();
+
+ //! Saves a raster tile from a virtual memory to permanent storage
+ /*!
+ \param index tile unique identifier
+ \param buf pointer to a raster tile in memory
+ \param bsize block size
+ */
+ virtual bool putRasterBlock(const string& index, void *buf, long bsize) = 0;
+
+ //! Gets the raster block with index identifier
+ /*!
+ \param index tile unique identifier
+ \param buf pointer to a raster tile in memory
+ \param ulCol returns the column index of the upper-left corner of the block
+ \param ulLin returns the column index of the upper-left corner of the block
+ */
+ virtual bool getRasterBlock(const string& index, void *buf, int& ulCol, int& ulLin) = 0;
+
+ //! Codifies the unique identifier of the raster block that contains a certain pixel
+ /*!
+ \param col column number
+ \param lin pixel line number
+ \param band pixel band
+ \param res pixel resolution factor
+ \param subb pixel sub band information
+ \return block unique identifier
+ */
+ virtual string codifyId(int col, int lin, int band, int res, int subb) = 0;
+
+ //! Decodifies a block unique identifier to get some block information
+ /*!
+ \param index block unique identifier
+ \param col returns the column number of the upper-left corner of the block
+ \param lin returns the line number of the upper-left corner of the block
+ \param band returns the band id block
+ \param res returns the resolution factor of the block
+ \param subb returns the sub band information of the block
+ */
+ virtual void decodifyId(const string& index, int& col, int& lin, int& band, int& res, int& subb) = 0;
+
+ //! Sets the value of a specific raster pixel
+ /*!
+ \param col pixel column identifier
+ \param lin pixel line identifier
+ \param val pixel value being inserted
+ \param band pixel band identifier
+ */
+ bool getElement(int col,int lin, double &val,int band);
+
+ //! Gets an specific element (col, lin, band) of a raster data
+ /*!
+ \param col pixel column identifier
+ \param lin pixel line identifier
+ \param val pixel value being retrieved
+ \param band pixel band identifier
+ */
+ bool setElement(int col, int lin, double val,int band);
+
+ //! Initializes the internal structures of the decoder, from its raster parameters structure.
+ void init();
+
+ //! Clears the decoder internal structures
+ bool clear();
+
+private:
+ MapMemoryPage virtualMemory_;
+ queue<string> pagesQueue_;
+ vector<string> indexCache_;
+ vector<TeMemoryPage*> pageCache_;
+};
+
+#endif
diff --git a/src/terralib/kernel/TeDefines.h b/src/terralib/kernel/TeDefines.h
new file mode 100644
index 0000000..11f5044
--- /dev/null
+++ b/src/terralib/kernel/TeDefines.h
@@ -0,0 +1,85 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDefines.h
+ Provides a set of general definitions used by Terralib
+*/
+#ifndef __TERRALIB_INTERNAL_DEFINES_H
+#define __TERRALIB_INTERNAL_DEFINES_H
+
+const int TeNAME_LENGTH = 400; //<! A default name lenght
+const double TeMAXFLOAT = 3.4E37; //<! Maximum float value
+const double TeMINFLOAT = 3.4E-37; //<! Minimum float value
+const double TePI = 3.14159265358979323846; //<! The ratio of the circumference to the diameter of a circle
+const double TeCDR = 0.01745329251994329576; //<! Conversion factor: degrees to radians
+const double TeCRD = 57.29577951308232087679; //<!Conversion factor: radians to degrees
+
+
+// General position definitions
+#define TeUNKNOWNPOSITION 0
+#define TeINSIDE 1
+#define TeOUTSIDE 2
+#define TeBOUNDARY 4
+
+
+// Intersection type
+#define TeINTERIORINTERIOR 8
+#define TeINTERIORBOUNDARY 16
+#define TeINTERIOREXTERIOR 32
+#define TeBOUNDARYINTERIOR 64
+#define TeBOUNDARYBOUNDARY 128
+#define TeBOUNDARYEXTERIOR 256
+#define TeEXTERIORINTERIOR 512
+#define TeEXTERIORBOUNDARY 1024
+#define TeEXTERIOREXTERIOR 2048
+
+// Segment intersection
+#define TeDONT_INTERSECT 0
+#define TeDO_INTERSECT 1
+//#define TeCOLLINEAR 2
+#define TeAT_ENDPOINT 4
+
+#ifndef MAX
+#define MAX(a,b) a>b?a:b
+#endif
+
+#ifndef MIN
+#define MIN(a,b) a<b?a:b
+#endif
+
+#ifndef ABS
+#define ABS(x) ( ((x) >= 0) ? (x) : -(x) )
+#endif
+
+// Orientation
+#define TeNOTURN 0
+#define TeCOLLINEAR 0
+#define TeCLOCKWISE -1
+#define TeCOUNTERCLOCKWISE 1
+
+// Operation
+#define TeDIFFERENCE 1
+#define TeUNION 2
+#define TeINTERSECTION 4
+
+#endif
+
diff --git a/src/terralib/kernel/TeErrorLog.cpp b/src/terralib/kernel/TeErrorLog.cpp
new file mode 100644
index 0000000..fae26f2
--- /dev/null
+++ b/src/terralib/kernel/TeErrorLog.cpp
@@ -0,0 +1,171 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeErrorLog.h"
+#include "TeAsciiFile.h"
+#include "TeUtils.h"
+
+TeErrorLog::TeErrorLog():logFile_ ( 0 )
+{
+ errorMessage_ [ LOG_MESSAGE ] = "Message ";
+
+ errorMessage_ [ EMPTY_FILE_NAME ] = "Empty File Name";
+ errorMessage_ [ CANNOT_OPEN_FILE ] = "Could Not Open File";
+ errorMessage_ [ CANNOT_READ_FILE ] = "Could Not Read File";
+ errorMessage_ [ CANNOT_WRITE_FILE ] = "Could Not Write File";
+ errorMessage_ [ CANNOT_CLOSE_FILE ] = "Could Not Close File";
+ errorMessage_ [ END_OF_FILE_REACHED ] = "End of File Reached";
+
+
+// Errors associated with projection
+
+ errorMessage_ [ DATUM_ERROR ] = "Error when creating Datum";
+ errorMessage_ [ PROJECTION_NOT_AVAILABLE ] = "Projection not available in TerraLib";
+
+// Error codes for MIF files
+ errorMessage_ [ NOT_MIF_FILE ] = "Not a MIF File";
+ errorMessage_ [ MIF_REGION_CLOSE ] = "Error - MIF Region is not Closed";
+ errorMessage_ [ MIF_CONVERSION_ERROR ] = "Error during conversion of MIF data";
+ errorMessage_ [ NOT_CSV ] = "Data not separated by commas";
+ errorMessage_ [ NOT_ENOUGH_ROWS ] = "Less rows in MID file than regions in MIF file";
+ errorMessage_ [ NOT_POLYGON_FILE ] = "Not a polygon (planar areas) file";
+ errorMessage_ [ PLINE_ERROR ] = "Wrongly defined PLINE attribute";
+ errorMessage_ [ NO_DTM_QUOTE_VALUE ] = "Unable to define an attribute as a DTM quote file";
+
+// Error Codes for shapefiles
+ errorMessage_ [ POLYSHAPE_IS_NOT_RING ] = "Shape PolyShape is not a ring";
+ errorMessage_ [ UNHANDLED_SHP_TYPE ] = "Shape type unhandled currently";
+
+// Error Codes for DBF files
+
+ errorMessage_ [ UNABLE_TO_OPEN_DBF_FILE ] = "Unable to Open DBF file";
+ errorMessage_ [ NO_DATA_IN_DBF_FILE ] = "No Data in DBF File";
+ errorMessage_ [ ATTRIBUTE_INDEX_MISMATCH ] = "Mismatch between attribute index and number of geometries";
+
+// Error codes for E00 Files
+ errorMessage_ [ NOT_E00_FILE ] = "Not an E00 File";
+
+// Error codes for algorithms
+ errorMessage_ [ CENTROID_NOT_FOUND ] = "Could not find centroid of a polygon";
+ errorMessage_ [ REGIONS_WITH_HOLES ] = "Problems in regions with holes";
+ errorMessage_ [ LINE_IS_NOT_RING ] = "Tried to a create a ring from a non-closed line";
+
+// Error codes for tables
+
+ errorMessage_ [ ROW_MISMATCH ] = "Unable to insert a row into a table (attribute mismatch)";
+ errorMessage_ [ NO_SUCH_ATTRIBUTE ] = "Attribute does not exist in the table";
+
+ // Error codes for Raster stuff
+ errorMessage_ [ UNKNOWN_DECODER_TECHNOLOGY_TYPE ] = "Decoder technology not specified";
+ errorMessage_ [ UNKNOWN_RASTER_FORMAT ] = "Raster format not supported";
+
+ // Error codes for layer stuff
+ errorMessage_ [ GEOMETRY_REPRESENTATION_MISMATCH ] = "Geometry representation has not been created";
+
+ errorMessage_ [ UNKNOWN_ERROR_TYPE ] = "";
+}
+
+TeErrorLog::~TeErrorLog()
+{
+ if ( logFile_ != 0 )
+ delete logFile_;
+}
+string
+TeErrorLog::message( const TeErrorType msgCode )
+{
+ // find the message associated to the errorcode
+ map <TeErrorType, string>::iterator it = errorMessage_.find ( msgCode );
+ if ( it != errorMessage_.end() )
+ return (*it).second;
+ else
+ return errorMessage_ [ UNKNOWN_ERROR_TYPE ];
+}
+
+void
+TeErrorLog::insert ( TeErrorType code, const string& msg )
+{
+ // create a new logfile, if needed
+ if ( logFile_ == 0 )
+ //logFile_ = new TeAsciiFile ( "terralib.err", "rw" );
+ return;
+
+ string log = errorMessage_ [ code ] + " " + msg;
+ logFile_->writeString ( log );
+
+ // increment the count associated to this error type
+ map<TeErrorType, int>::iterator it = errorLog_.find( code );
+ if ( it == errorLog_.end() )
+ errorLog_[ code ] = 1;
+ else
+ {
+ int count = (*it).second;
+ errorLog_[ code ] = ++count;
+ }
+}
+
+
+void
+TeErrorLog::startSession ( const string& errLogFileName)
+{
+ // clean the logfile
+ if ( logFile_ != 0 )
+ delete logFile_;
+
+ // create a new logfile
+ logFile_ = new TeAsciiFile ( errLogFileName, "rw" );
+
+ // clear the stack
+ errorLog_.clear();
+}
+
+int
+TeErrorLog::endSession ()
+{
+ int numerr = errorLog_.size();
+
+ // increment the count associated to this error type
+ map<TeErrorType, int>::iterator it = errorLog_.begin();
+
+ while ( it != errorLog_.end() )
+ {
+ int count = (*it).second;
+ string log = "Number of Error of Type " + errorMessage_ [ (*it).first ]
+ + " = " + Te2String ( count );
+ logFile_->writeString ( log );
+ }
+
+ // close the log file
+ if ( logFile_ != 0 )
+ delete logFile_;
+
+ // clear the stack
+ errorLog_.clear ();
+
+return numerr;
+}
+
+
diff --git a/src/terralib/kernel/TeErrorLog.h b/src/terralib/kernel/TeErrorLog.h
new file mode 100644
index 0000000..05153db
--- /dev/null
+++ b/src/terralib/kernel/TeErrorLog.h
@@ -0,0 +1,139 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeErrorLog.h
+ This file deals log of errors in TerraLib
+*/
+#ifndef __TERRALIB_INTERNAL_ERRORLOG_H
+#define __TERRALIB_INTERNAL_ERRORLOG_H
+
+#include "TeSingleton.h"
+
+#include <string>
+#include <stack>
+#include <map>
+using namespace std;
+
+class TeAsciiFile;
+
+enum TeErrorType
+{
+
+ // Generic message inserted to log file
+ LOG_MESSAGE,
+
+ // Errors associated to files
+ EMPTY_FILE_NAME,
+ CANNOT_OPEN_FILE,
+ CANNOT_READ_FILE,
+ CANNOT_WRITE_FILE,
+ CANNOT_CLOSE_FILE,
+ END_OF_FILE_REACHED,
+
+ // Errors associated with projection
+ DATUM_ERROR,
+ PROJECTION_NOT_AVAILABLE,
+
+// Error codes for MIF files
+ NOT_MIF_FILE,
+ MIF_REGION_CLOSE,
+ MIF_CONVERSION_ERROR,
+ NOT_CSV,
+ NOT_ENOUGH_ROWS,
+ NOT_POLYGON_FILE,
+ PLINE_ERROR,
+ NO_DTM_QUOTE_VALUE,
+
+// Error Codes for shapefiles
+ POLYSHAPE_IS_NOT_RING,
+ UNHANDLED_SHP_TYPE,
+
+// Error Codes for DBF files
+
+ UNABLE_TO_OPEN_DBF_FILE,
+ NO_DATA_IN_DBF_FILE,
+ ATTRIBUTE_INDEX_MISMATCH,
+
+ // Error codes for E00 Files
+ NOT_E00_FILE,
+
+ // Error codes for algorithms
+ CENTROID_NOT_FOUND,
+ REGIONS_WITH_HOLES,
+ LINE_IS_NOT_RING,
+
+ // Error codes for tables
+
+ ROW_MISMATCH,
+ NO_SUCH_ATTRIBUTE,
+
+ // Error codes for Raster stuff
+ UNKNOWN_DECODER_TECHNOLOGY_TYPE,
+ UNKNOWN_RASTER_FORMAT,
+
+ // Layer stuff
+ GEOMETRY_REPRESENTATION_MISMATCH,
+
+ // Other
+ UNKNOWN_ERROR_TYPE
+};
+
+typedef map<TeErrorType, string> TeErrorTypeMap;
+
+typedef map<TeErrorType, int> TeErrorLogMap;
+
+//! Describes a class for describing error logging in TerraLib
+/*!
+ All errors in TerraLib may be logged into an error file.
+ The error logging facilities include the notion of a
+ session, using the "start" and "end" methods, of a
+ dump method for acessing the contenst
+
+\sa TeException, TeSingleton
+*/
+class TeErrorLog: public TeSingleton<TeErrorLog>
+{
+public:
+ TeErrorLog();
+
+ ~TeErrorLog();
+
+ string message(const TeErrorType code);
+
+ virtual void insert ( TeErrorType code, const string& msg = "" );
+
+ virtual void startSession ( const string& errLogFileName = "terralib.err");
+
+ virtual int endSession ();
+
+private:
+
+ TeAsciiFile* logFile_;
+
+ TeErrorLogMap errorLog_;
+
+ TeErrorTypeMap errorMessage_;
+};
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeErrorMessage.cpp b/src/terralib/kernel/TeErrorMessage.cpp
new file mode 100644
index 0000000..23eb6d6
--- /dev/null
+++ b/src/terralib/kernel/TeErrorMessage.cpp
@@ -0,0 +1,33 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeErrorMessage.h"
+#include <map>
+using namespace std;
+static map<string, string> errorMessage_;
+
+
diff --git a/src/terralib/kernel/TeErrorMessage.h b/src/terralib/kernel/TeErrorMessage.h
new file mode 100644
index 0000000..3e38e9d
--- /dev/null
+++ b/src/terralib/kernel/TeErrorMessage.h
@@ -0,0 +1,111 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeErrorMessage.h
+ This file contains some definitions issuing error messages to the user
+*/
+#ifndef TeErrorMessage_H
+#define TeErrorMessage_H
+
+#include <string>
+using namespace std;
+
+#include "TePrototype.h"
+#include "TeSingleton.h"
+
+/*!
+\enum TeMessageType
+
+Te_ABORTRETRYIGNORE
+ The message box contains three pushbuttons: Abort, Retry, and Ignore.
+Te_OK The message box contains one pushbutton: OK.
+Te_OKCANCEL The message box contains two pushbuttons: OK and Cancel.
+Te_RETRYCANCEL The message box contains two pushbuttons: Retry and Cancel.
+Te_YESNO The message box contains two pushbuttons: Yes and No.
+Te_YESNOCANCEL The message box contains three pushbuttons: Yes, No, and Cancel.
+
+---*/
+enum TeMessageType
+{ Te_ABORTRETRYIGNORE, Te_OK, Te_OKCANCEL, Te_RETRYCANCEL, Te_YESNO, Te_YESNOCANCEL };
+
+
+/*!
+\enum TeMessageIcon
+
+Te_ICONEXCLAMATION An exclamation-point icon appears in the message box.
+Te_ICONINFORMATION An icon consisting of an �i� in a circle appears in the message box.
+Te_ICONQUESTION A question-mark icon appears in the message box.
+Te_ICONSTOP A stop-sign icon appears in the message box.
+-----*/
+
+enum TeMessageIcon
+{ Te_ICONEXCLAMATION, Te_ICONINFORMATION, Te_ICONQUESTION, Te_ICONSTOP };
+
+/*---------
+Return Value
+
+Zero if there is not enough memory to display the message box;
+otherwise one of the following values is returned:
+
+Te_IDABORT The Abort button was selected.
+Te_IDCANCEL The Cancel button was selected.
+Te_IDIGNORE The Ignore button was selected.
+Te_IDNO The No button was selected.
+Te_IDOK The OK button was selected.
+Te_IDRETRY The Retry button was selected.
+Te_IDYES The Yes button was selected.
+
+----*/
+
+enum TeMessageReturn
+{ Te_IDABORT, Te_IDCANCEL, Te_IDIGNORE, Te_IDNO, Te_IDOK, Te_IDRETRY, Te_IDYES };
+
+//! Provides a convenience class for issuing error messages to the user
+/*
+ Based on a configuration parameter, provide implementations
+ for console (stdio), MFC and QT
+
+ \sa TeException
+*/
+class TeErrorMessage
+{
+public:
+ //! Constructor
+ TeErrorMessage(){}
+
+ virtual ~TeErrorMessage(){}
+
+ virtual TeMessageReturn apply (
+ const string& appName,
+ const string & msgText,
+ TeMessageType msgType,
+ TeMessageIcon iconType ) = 0;
+};
+
+class TeErrorMessagePrototype: public TePrototype<TeErrorMessage>
+{
+ virtual TeErrorMessage* build() = 0;
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeException.cpp b/src/terralib/kernel/TeException.cpp
new file mode 100644
index 0000000..4f5cc81
--- /dev/null
+++ b/src/terralib/kernel/TeException.cpp
@@ -0,0 +1,51 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeException.h"
+#include "TeErrorLog.h"
+#include <errno.h>
+
+TeException::TeException ( TeErrorType msgCode, const string& userText, bool haserrno ):
+ userText_ ( userText )
+{
+ if ( haserrno )
+ userText_ = userText + " " + strerror ( errno );
+
+ TeErrorLog::instance().insert( msgCode, userText_ );
+}
+
+string
+TeException::message()
+{
+ return TeErrorLog::instance().message ( msgCode_ ) + " " + userText_;
+}
+
+TeErrorType
+TeException::code ()
+{
+ return msgCode_;
+}
diff --git a/src/terralib/kernel/TeException.h b/src/terralib/kernel/TeException.h
new file mode 100644
index 0000000..4a7599f
--- /dev/null
+++ b/src/terralib/kernel/TeException.h
@@ -0,0 +1,72 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeException.h
+ This file deals Eexception throwing in TerraLib
+*/
+#ifndef __TERRALIB_INTERNAL_EXCEPTION_H
+#define __TERRALIB_INTERNAL_EXCEPTION_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4355 )
+#endif
+
+#include "TeSingleton.h"
+#include "TeErrorLog.h"
+
+#include <string>
+#include <map>
+using namespace std;
+
+
+//! Provides a class for handling exceptions on Terralib
+class TeException {
+public:
+
+// -- Contructors
+
+ TeException ( TeErrorType msgCode, const string& userText = "", bool hasErrno = false );
+
+// -- Destructor
+
+ virtual ~TeException() {} // base class
+
+// -- Members
+
+ string message ();
+ TeErrorType code();
+
+protected:
+
+// -- Members
+
+//! code associated with TeException
+ TeErrorType msgCode_;
+
+//! message associated with TeException
+ string userText_;
+
+private:
+
+};
+#endif
+
diff --git a/src/terralib/kernel/TeFactory.h b/src/terralib/kernel/TeFactory.h
new file mode 100644
index 0000000..8e19b93
--- /dev/null
+++ b/src/terralib/kernel/TeFactory.h
@@ -0,0 +1,145 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeFactory.h
+ This file deals with the Factory Pattern
+*/
+#ifndef __TERRALIB_INTERNAL_FACTORY_H
+#define __TERRALIB_INTERNAL_FACTORY_H
+
+#include <map>
+#include <string>
+
+using namespace std;
+
+//! Implements a template for the "TeFactory" pattern.
+/*
+ The "factory" pattern is a technique for creating new
+ instances of objects which defines an abstract interface,
+ (represented by the "Make" module). The subclasses of
+ factory decide which class to instantiate.
+
+
+ Each subclass of factory "registers" itself at compile time;
+ therefore, the addition of a new factory requires no change
+ the parent class.
+
+ \author Gilberto Camara
+*/
+template <class T, class Arg>
+class TeFactory
+{
+public:
+
+//! Dictionary of factories (indexed by name)
+ typedef map<string, TeFactory<T,Arg>* > TeFactoryMap;
+
+//! Returns the single instance of the factory dictionay
+ static TeFactoryMap& instance ()
+ {
+ static TeFactoryMap Fmap_;
+ return Fmap_;
+
+ }
+
+ //! Normal Constructor
+ TeFactory (const string& factoryName);
+
+ virtual ~TeFactory() {}
+
+ //! Virtual constructor using name
+ static T* make ( string name, const Arg& arg );
+
+ //! Virtual constructor using arguments
+ static T* make ( Arg arg );
+
+
+protected:
+
+ //! Builds a new type (should be implemented by descendants)
+ virtual T* build ( const Arg& arg ) = 0;
+
+private:
+ string Fname_;
+};
+
+// Initialisation of static variable
+//template <class T, class Arg>
+//TeFactory<T,Arg>::TeFactoryMap TeFactory<T,Arg>::Fmap_;
+
+
+// Constructor
+template <class T, class Arg>
+TeFactory<T,Arg>::TeFactory(const string& name):
+ Fname_(name)
+{
+ TeFactory<T,Arg>::instance()[name] = this;
+
+}
+
+// Destructor
+//template <class T, class Arg>
+//TeFactory<T,Arg>::~TeFactory<T,Arg> ()
+//{
+ // Remove the object from the factory dictionary
+ // Fmap_.erase ( Fname_ );
+//}
+
+//! Builds an object, based on the input parameters
+template <class T, class Arg>
+T*
+TeFactory<T,Arg>::make ( string name, const Arg& arg )
+{
+ // try to find the name on the factory dictionary
+ typename TeFactoryMap::iterator i = TeFactory<T,Arg>::instance().find ( name );
+
+ // Not found ? return the Default Object
+ if ( i == TeFactory<T,Arg>::instance().end() )
+ return T::DefaultObject( arg );
+
+ // Create an object, based on the input parameters
+ return (*i).second->build ( arg );
+ return 0;
+
+}
+
+//! Builds an object, based on the input parameters
+template <class T, class Arg>
+T*
+TeFactory<T,Arg>::make ( Arg arg )
+{
+ string name = arg.decName();
+
+ // try to find the name on the factory dictionary
+ typename TeFactoryMap::iterator i = TeFactory<T,Arg>::instance().find ( name );
+
+ // Not found ? return the Default Object
+ if ( i == TeFactory<T,Arg>::instance().end() )
+ return T::DefaultObject( arg );
+
+ // Create an object, based on the input parameters
+ return (*i).second->build ( arg );
+ return 0;
+
+}
+#endif
+
diff --git a/src/terralib/kernel/TeFragmentation.cpp b/src/terralib/kernel/TeFragmentation.cpp
new file mode 100644
index 0000000..e232c7f
--- /dev/null
+++ b/src/terralib/kernel/TeFragmentation.cpp
@@ -0,0 +1,424 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeFragmentation.h"
+#include "TeGeometryAlgorithms.h"
+
+
+// Is Crescent?
+struct xyOrder
+{
+ bool operator()(const TeCoord2D& c1, const TeCoord2D& c2) const
+ {
+ if(c1.x_ < c2.x_)
+ return true;
+
+ if(c1.x_ > c2.x_)
+ return false;
+
+ if(c1.y_ < c2.y_)
+ return true;
+
+ return false;
+ }
+};
+
+
+struct ipRedOrder // XY order
+{
+ /*
+ * TODO: Talvez desempatar pela segunda coordenada no caso de overlap
+ *
+ */
+ bool operator()(const TeINTERSECTOR2::TeBoundaryIP& ip1, const TeINTERSECTOR2::TeBoundaryIP& ip2) const
+ {
+ if(ip1.redPartNum_ < ip2.redPartNum_)
+ return true;
+
+ if(ip1.redPartNum_ > ip2.redPartNum_)
+ return false;
+
+ if(ip1.redSegNum_ < ip2.redSegNum_)
+ return true;
+
+ if(ip1.redSegNum_ > ip2.redSegNum_)
+ return false;
+
+ if(ip1.coords_[0].x_ < ip2.coords_[0].x_)
+ return true;
+
+ if(ip1.coords_[0].x_ > ip2.coords_[0].x_)
+ return false;
+
+ if(ip1.coords_[0].y_ < ip2.coords_[0].y_)
+ return true;
+
+ if(ip1.coords_.size() < ip2.coords_.size())
+ return true;
+
+ return false;
+ }
+};
+
+struct yxIPOrder // YX order
+{
+ /*
+ * TODO: Talvez desempatar pela segunda coordenada no caso de overlap
+ *
+ */
+ bool operator()(const TeINTERSECTOR2::TeBoundaryIP& ip1, const TeINTERSECTOR2::TeBoundaryIP& ip2) const
+ {
+ if(ip1.coords_[0].x_ > ip2.coords_[0].x_)
+ return true;
+
+ if(ip1.coords_[0].x_ < ip2.coords_[0].x_)
+ return false;
+
+ if(ip1.coords_[0].y_ > ip2.coords_[0].y_)
+ return true;
+
+ return false;
+ }
+};
+
+inline void cleanIntersections(TeINTERSECTOR2::TeVectorBoundaryIP& ips)
+{
+ // Eliminar os pontos de interse��o 1p que estiverem em cima ou no meio de outros
+ // pontos de intersec��o 2p
+ // +
+ // Eliminar os segmentos de overlap que estiverem entre algum outro de overlap
+ for(unsigned int i = 1; i < ips.size(); ++i)
+ {
+ unsigned int currentSize = ips[i].coords_.size();
+
+ for(unsigned int j = 0; j < i; ++j)
+ {
+ if(currentSize == 1) // Verificar se ele n�o se encontra entre algum de overlap
+ {
+ // Se o ponto j-th � �nico, ir p/ o pr�ximo
+ // pois ele n�o tem problemas
+ if(ips[j].coords_.size() == 1)
+ continue;
+
+ // Se o ponto estiver fora do intervalo x, ir p/ o pr�ximo
+ if(ips[i].coords_[0].x_ < ips[j].coords_[0].x_ ||
+ ips[i].coords_[0].x_ > ips[j].coords_[1].x_)
+ continue;
+
+ // Caso contr�rio, verificar se ele se encontra no intervalo y tamb�m
+ if(ips[i].coords_[0].y_ < ips[j].coords_[0].y_ &&
+ ips[i].coords_[0].y_ < ips[j].coords_[1].x_)
+ continue;
+
+ if(ips[i].coords_[0].y_ > ips[j].coords_[0].y_ &&
+ ips[i].coords_[0].y_ > ips[j].coords_[1].x_)
+ continue;
+
+ // Remove o ponto e j� move o cursor p/ um ponto anterior
+ // pois ele ser� incremementado
+ ips.erase(ips.begin() + i);
+ --i;
+ break;
+ }
+ else // Verificar se ele n�o � um de overlap entre algum outro de overlap
+ {
+ // Se o ponto j-th � �nico, ir p/ o pr�ximo
+ // pois ele n�o te problemas
+ if(ips[j].coords_.size() == 1)
+ continue;
+
+ // Remover os segmentos iguais
+ if(TeEquals(ips[i].coords_[0], ips[j].coords_[0]) &&
+ TeEquals(ips[i].coords_[1], ips[j].coords_[1]))
+ {
+ ips.erase(ips.begin() + i);
+ --i;
+ break;
+ }
+
+ }
+ }
+ }
+}
+
+inline void TeFragmentSegmentByNonOverlapping(const TeCoord2D& s1, const TeCoord2D& s2,
+ TeINTERSECTOR2::TeVectorBoundaryIP& ips,
+ TeLine2D& currentFragment,
+ TeLineSet& fragments)
+{
+ // Se a orienta��o do segmento n�o for esquerda/direita
+ // � preciso reverter os pontos de intersec��o
+ if(s1.x_ > s2.x_)
+ {
+ reverse(ips.begin(), ips.end());
+ }
+ else if(s1.x_ < s2.x_)
+ {
+ }
+ else if(s1.y_ > s2.y_)
+ {
+ reverse(ips.begin(), ips.end());
+ }
+
+
+ // � s� fragmentar o segmento at� o �ltimo ponto de intersec��o dele
+ for(unsigned int k = 0; k < ips.size(); ++k)
+ {
+ if(TeEquals(ips[k].coords_[0], currentFragment[currentFragment.size() - 1])) // Se o ponto de intersec��o est� sobre o v�rtice do segmento
+ {
+ // fragmenta a linha caso haja mais de um ponto nela
+ if(currentFragment.size() > 1)
+ {
+ fragments.add(currentFragment);
+
+ currentFragment = TeLine2D();
+ currentFragment.add(ips[k].coords_[0]);
+ }
+ else
+ {
+ continue;
+ }
+ }
+ else
+ {
+ currentFragment.add(ips[k].coords_[0]);
+
+ fragments.add(currentFragment);
+
+ currentFragment = TeLine2D();
+ currentFragment.add(ips[k].coords_[0]);
+ }
+ }
+}
+
+inline void TeFragmentSegmentByOverlapping(const TeCoord2D& s1, const TeCoord2D& s2,
+ TeINTERSECTOR2::TeVectorBoundaryIP& ips,
+ TeLine2D& currentFragment,
+ TeLineSet& fragments, TeLineSet& boundaryFragments)
+{
+ cleanIntersections(ips);
+
+ unsigned int i = 0;
+
+
+ // Se a orienta��o do segmento n�o for esquerda/direita
+ // � preciso reverter os pontos de intersec��o
+ if(s1.x_ > s2.x_)
+ {
+ for(i = 0; i < ips.size(); ++i)
+ {
+ if(ips[i].coords_.size() == 2)
+ {
+ swap(ips[i].coords_[0], ips[i].coords_[1]);
+ }
+ }
+
+ reverse(ips.begin(), ips.end());
+ }
+ else if(s1.x_ < s2.x_)
+ {
+ }
+ else if(s1.y_ > s2.y_)
+ {
+ for(i = 0; i < ips.size(); ++i)
+ {
+ if(ips[i].coords_.size() == 2)
+ {
+ swap(ips[i].coords_[0], ips[i].coords_[1]);
+ }
+ }
+
+ reverse(ips.begin(), ips.end());
+ }
+
+
+ // � s� fragmentar o segmento at� o �ltimo ponto de intersec��o dele
+ for(i = 0; i < ips.size(); ++i)
+ {
+ if(TeEquals(ips[i].coords_[0], currentFragment[currentFragment.size() - 1])) // Se o ponto de intersec��o est� sobre o v�rtice do segmento
+ {
+ // fragmenta a linha caso haja mais de um ponto nela
+ if(currentFragment.size() > 1)
+ {
+ fragments.add(currentFragment);
+
+ currentFragment = TeLine2D();
+
+ if(ips[i].coords_.size() == 2)
+ {
+ TeLine2D l;
+ l.add(ips[i].coords_[0]);
+ l.add(ips[i].coords_[1]);
+
+ boundaryFragments.add(l);
+
+ currentFragment.add(ips[i].coords_[1]);
+ }
+ else
+ {
+ currentFragment.add(ips[i].coords_[0]);
+ }
+ }
+ else
+ {
+ if(ips[i].coords_.size() == 2)
+ {
+ TeLine2D l;
+ l.add(ips[i].coords_[0]);
+ l.add(ips[i].coords_[1]);
+
+ boundaryFragments.add(l);
+
+ currentFragment.clear();
+ currentFragment.add(ips[i].coords_[1]);
+ }
+ }
+ }
+ else
+ {
+
+ currentFragment.add(ips[i].coords_[0]);
+
+ if(ips[i].coords_.size() == 2)
+ {
+ fragments.add(currentFragment);
+
+ currentFragment = TeLine2D();
+
+ currentFragment.add(ips[i].coords_[1]);
+
+ TeLine2D l;
+ l.add(ips[i].coords_[0]);
+ l.add(ips[i].coords_[1]);
+
+ boundaryFragments.add(l);
+ }
+ else
+ {
+ fragments.add(currentFragment);
+
+ currentFragment = TeLine2D();
+
+ currentFragment.add(ips[i].coords_[0]);
+ }
+ }
+ }
+}
+
+void TeFragmentBoundary(const TeLineSet& lines, TeINTERSECTOR2::TeVectorBoundaryIP& ips, TeLineSet& boundaryFragments, TeLineSet& fragments)
+{
+ // Informa��es sobre os pontos de interse��o
+ unsigned int currentIP = 0;
+ unsigned int nthIP = ips.size();
+
+ // Informa��es sobre n�mero de linhas
+ unsigned int nthLine = lines.size();
+
+ // Ordena os pontos de interse��o
+ sort(ips.begin(), ips.end(), ipRedOrder());
+
+ for(unsigned int i = 0; i < nthLine; ++i)
+ {
+ if((currentIP < nthIP) && (ips[currentIP].redPartNum_ == i))
+ {
+ // Se a linha corrente possui um ponto de interse��o ent�o ela dever� ser fragmentada
+ TeLine2D& currentLine = lines[i];
+
+ TeLine2D lFrag;
+
+ //unsigned int currentSegment = 0;
+ unsigned int nthSegment = currentLine.size() - 1;
+
+ for(unsigned int j = 0; j < nthSegment; ++j)
+ {
+ if((currentIP < nthIP) && (j == ips[currentIP].redSegNum_) && (ips[currentIP].redPartNum_ == i)) // Se ainda tenho pontos de intersec��o e
+ { // o corrente pertence ao segmento atual
+ // Adiciona o primeiro ponto da linha na lista do fragmento atual
+ if((lFrag.size() == 0) || TeDisjoint(currentLine[j], lFrag[lFrag.size() - 1]))
+ lFrag.add(currentLine[j]);
+
+ // Copias todos os pontos de intersec��o do segmento para
+ // um vetor auxiliar e j� avan�a o currentIP
+ TeINTERSECTOR2::TeVectorBoundaryIP ipsAux;
+
+ bool hasOverlap = false;
+
+ while((currentIP < nthIP) && (ips[currentIP].redSegNum_ == j) && (ips[currentIP].redPartNum_ == i))
+ {
+ if(ips[currentIP].coords_.size() == 2)
+ hasOverlap = true;
+
+ ipsAux.push_back(ips[currentIP]);
+
+ ++currentIP;
+ }
+
+ if(hasOverlap) // Se houverem pontos de intersec��o que fazem overlap
+ {
+ TeFragmentSegmentByOverlapping(currentLine[j], currentLine[j + 1], ipsAux, lFrag, fragments, boundaryFragments);
+ }
+ else // Se n�o houver pontos de intersec��o que fazem overlap
+ {
+ TeFragmentSegmentByNonOverlapping(currentLine[j], currentLine[j + 1], ipsAux, lFrag, fragments);
+ }
+ }
+ else
+ {
+ // Caso n�o haja ponto de intersec��o sobre o segmento,
+ // apenas insere o ponto no fragmento de linha
+ lFrag.add(currentLine[j]);
+ }
+ }
+
+ //if((lFrag.size() > 0u) && TeDisjoint(currentLine[nthSegment], lFrag[lFrag.size() - 1u]))
+ if(lFrag.size() > 0)
+ {
+ //unsigned int st = lFrag.size();
+
+ if(TeDisjoint(currentLine[nthSegment], lFrag[lFrag.size() - 1]))
+ {
+ lFrag.add(currentLine[nthSegment]);
+
+ fragments.add(lFrag);
+ }
+ else if(lFrag.size() > 1)
+ {
+ fragments.add(lFrag);
+ }
+ }
+ }
+ else
+ {
+ // Caso contr�rio, se a linha n�o possui ponto de interse��o
+ // � s� colocar ela na lista de linhas fragmentadas
+ fragments.add(lines[i]);
+ }
+ }
+
+ return;
+}
+
diff --git a/src/terralib/kernel/TeFragmentation.h b/src/terralib/kernel/TeFragmentation.h
new file mode 100644
index 0000000..f9964b6
--- /dev/null
+++ b/src/terralib/kernel/TeFragmentation.h
@@ -0,0 +1,52 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeFragmentation.h
+ This file contains Algorithms for Topological Operations.
+*/
+
+/**
+ *@author Gilberto Ribeiro de Queiroz
+ */
+
+#ifndef __TERRALIB_INTERNAL_FRAGMENTATION_H
+#define __TERRALIB_INTERNAL_FRAGMENTATION_H
+
+#include "TeGeometry.h"
+#include "TeIntersector.h"
+
+/** @defgroup FragmentAlgorithms Algorithms that performs fragmentation of lines
+ * TerraLib fragmentation algorithms.
+ * @{
+ */
+/*! \fn TeLineSet TeFragmentLine(const TeLineSet& redLineSet, const TeLineSet& blueLineSet, TeINTERSECTOR2::TeReportVector& report)
+ \brief Fragments the red lines according to blues and report, this rotine tries to join fragments.
+ \param redLineSet The lines to fragment.
+ \param blueLineSet The blues one used as reference
+ \param report The intersection points.
+*/
+void TeFragmentBoundary(const TeLineSet& lines, TeINTERSECTOR2::TeVectorBoundaryIP& ips, TeLineSet& boundaryFragments, TeLineSet& fragments);
+
+/** @} */ // end of group FragmentAlgorithms
+
+#endif // __TERRALIB_INTERNAL_FRAGMENTATION_H
diff --git a/src/terralib/kernel/TeGeneralizedProxMatrix.cpp b/src/terralib/kernel/TeGeneralizedProxMatrix.cpp
new file mode 100644
index 0000000..33f8a3c
--- /dev/null
+++ b/src/terralib/kernel/TeGeneralizedProxMatrix.cpp
@@ -0,0 +1,433 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeSTElementSet.h"
+#include "TeGeneralizedProxMatrix.h"
+
+
+bool
+TeGeneralizedProxMatrix::IsValid () const
+{
+ if ((imp_) && (sc_) && (ss_) && (sw_))
+ return true;
+
+ return false;
+}
+
+
+TeProxMatrixImplementation*
+TeGeneralizedProxMatrix::getImplementation (const string type)
+{
+ if (imp_ == 0)
+ imp_ = TeProxMatrixAbstractFactory::MakeConcreteImplementation (type);
+ return imp_;
+}
+
+
+
+TeGeneralizedProxMatrix::TeGeneralizedProxMatrix(TeSTElementSet* objects, TeGeomRep geom_type, const string imp_type)
+{
+ imp_ = 0;
+ imp_ = getImplementation(imp_type);
+ total_slices_ = 1;
+
+ if ((geom_type==TePOLYGONS) || (geom_type==TeCELLS))
+ sc_ = new TeProxMatrixLocalAdjacencyStrategy (objects, geom_type);
+ else {
+ imp_ = 0;
+ sc_ = 0;
+ ss_ = 0;
+ sw_ = 0;
+ }
+ ss_ = new TeProxMatrixNoSlicingStrategy;
+ sw_ = new TeProxMatrixNoWeightsStrategy;
+
+ if (IsValid()) {
+ if (sc_->Construct (imp_)) {
+ ss_->Slice (imp_);
+ sw_->ComputeWeigths (imp_);
+ }
+ else {
+
+ imp_ = 0;
+ sc_ = 0;
+ ss_ = 0;
+ sw_ = 0;
+ }
+ }
+}
+
+
+TeGeneralizedProxMatrix::TeGeneralizedProxMatrix (TeProxMatrixConstructionStrategy* sc, TeProxMatrixWeightsStrategy* sw, TeProxMatrixSlicingStrategy* ss, const string imp_type)
+{
+ imp_ = 0;
+ imp_ = getImplementation(imp_type);
+ total_slices_ = 1;
+ sc_ = sc;
+
+
+ if(ss)
+ ss_ = ss;
+ else
+ ss_ = new TeProxMatrixNoSlicingStrategy();
+
+ if(sw)
+ sw_ = sw;
+ else
+ sw_ = new TeProxMatrixNoWeightsStrategy();
+
+
+ if (IsValid()) {
+ if (sc_->Construct (imp_)) {
+ ss_->Slice (imp_);
+ sw_->ComputeWeigths (imp_);
+ }
+ else {
+ imp_ = 0;
+ sc_ = 0;
+ ss_ = 0;
+ sw_ = 0;
+ }
+ }
+}
+
+
+TeGeneralizedProxMatrix::TeGeneralizedProxMatrix(const TeGeneralizedProxMatrix& pm)
+{
+ if (pm.imp_ == 0)
+ imp_ = 0;
+ else
+ imp_ = pm.imp_->CreateCopy ();
+
+ total_slices_ = pm.total_slices_;
+ sc_ = pm.sc_;
+ ss_ = pm.ss_;
+ sw_ = pm.sw_;
+
+ if (IsValid() == false)
+ {
+ imp_ = 0;
+ sc_ = 0;
+ ss_ = 0;
+ sw_ = 0;
+ }
+}
+
+
+TeGeneralizedProxMatrix&
+TeGeneralizedProxMatrix::operator=(const TeGeneralizedProxMatrix& pm)
+{
+ if (*this == pm) return *this;
+
+ if (imp_) delete imp_;
+ imp_ = 0;
+ if (pm.imp_) imp_ = pm.imp_->CreateCopy ();
+
+ total_slices_ = pm.total_slices_;
+ sc_ = pm.sc_;
+ ss_ = pm.ss_;
+ sw_ = pm.sw_;
+
+ if (IsValid() == false)
+ {
+ imp_ = 0;
+ sc_ = 0;
+ ss_ = 0;
+ sw_ = 0;
+ }
+
+ return *this;
+
+}
+
+bool
+TeGeneralizedProxMatrix::operator==(const TeGeneralizedProxMatrix& pm) const
+{
+ if (IsValid() && pm.IsValid())
+ {
+ if ((sc_->IsEqual (*(pm.sc_))) &&
+ (ss_->IsEqual (*(pm.ss_))) &&
+ (sw_->IsEqual (*(pm.sw_))) &&
+ (total_slices_ == pm.total_slices_) &&
+
+ (imp_->IsEqual(*(pm.imp_)))) return true;
+ } else
+ if ((IsValid() == false) && (pm.IsValid() == false))
+ return true;
+
+ return false;
+
+}
+
+TeNeighbours
+TeGeneralizedProxMatrix:: getNeighbours (const string& object_id, int slice)
+{
+ TeNeighbours neigh2;
+ if (slice > total_slices_) return neigh2;
+
+ if (IsValid())
+ {
+ TeNeighbours neigh1;
+ imp_->getNeighbours (object_id, neigh1);
+ for (int i=0; i < neigh1.size(); i++)
+ if (neigh1.Attributes(i).Slice() == slice)
+ neigh2.Insert (neigh1.ObjectId(i), neigh1.Attributes(i));
+ }
+
+ return neigh2;
+}
+
+
+TeNeighbours
+TeGeneralizedProxMatrix::operator[](const string& object_id)
+{
+ return getNeighbours(object_id);
+}
+
+
+TeNeighboursMap
+TeGeneralizedProxMatrix::getMapNeighbours (const string& object_id, int slice)
+{
+ TeNeighboursMap map;
+ if (slice > total_slices_) return map;
+
+ if (IsValid())
+ {
+ TeNeighbours neigh;
+ imp_->getNeighbours (object_id, neigh);
+
+ for (int i=0; i < neigh.size(); i++)
+ if (neigh.Attributes(i).Slice() == slice)
+ map[neigh.ObjectId(i)] = neigh.Attributes(i);
+ }
+
+ return map;
+}
+
+
+TeSTElementSet
+TeGeneralizedProxMatrix::getSTENeighbours(const string& object_id)
+{
+ TeSTElementSet selected_objects;
+ if (imp_)
+ {
+ TeNeighbours neigh;
+ imp_->getNeighbours (object_id, neigh);
+
+ for (int i = 0; i < neigh.size(); i++)
+ {
+ // Construct a sto instance with its attributes
+ TeSTInstance obj;
+ obj.objectId(neigh.ObjectId(i));
+
+ //load the attributes
+ TePropertyVector propVector;
+ sc_->objects()->getPropertyVector(object_id, propVector);
+ obj.properties(propVector);
+
+ // insert object in the return vector
+ selected_objects.insertSTInstance(obj);
+ }
+ }
+ return selected_objects;
+}
+
+
+bool
+TeGeneralizedProxMatrix::setCurrentConstructionStrategy (TeProxMatrixConstructionStrategy* sc)
+{
+ if (sc == 0)
+ return false;
+ sc_ = sc;
+ return true;
+}
+
+
+bool
+TeGeneralizedProxMatrix::setCurrentWeightsStrategy (TeProxMatrixWeightsStrategy* sw)
+{
+ if (sw == 0)
+ return false;
+ sw_ = sw;
+ return true;
+}
+
+bool
+TeGeneralizedProxMatrix::setCurrentSlicingStrategy (TeProxMatrixSlicingStrategy* ss)
+{
+ if (ss == 0)
+ return false;
+ ss_ = ss;
+ return true;
+}
+
+bool
+TeGeneralizedProxMatrix:: ConstructMatrix ()
+{
+
+ // ClearImplementation();
+ imp_ = 0;
+ imp_ = getImplementation();
+
+ if (sc_)
+ {
+ if (sc_->Construct (imp_))
+ {
+ if (ss_) ss_->Slice (imp_);
+ if (sw_) sw_->ComputeWeigths (imp_);
+ return true;
+ }
+ }
+ return false;
+}
+
+
+bool
+TeGeneralizedProxMatrix:: ClearImplementation ()
+{
+ TeProxMatrixImplementation* aux;
+ if (imp_ == 0) aux = getImplementation ();
+ else aux = getImplementation (imp_->Type().c_str());
+
+ if (aux == 0) return false;
+ delete imp_;
+ imp_ = aux;
+
+ return true;
+}
+
+bool
+TeGeneralizedProxMatrix:: RecomputeWeights ()
+{
+ if (IsValid()){
+ sw_->ComputeWeigths (imp_); return true;
+ }
+ return false;
+}
+
+
+bool
+TeGeneralizedProxMatrix:: RecomputeSlicing ()
+{
+ if (IsValid()){
+ ss_->Slice (imp_); return true;
+ }
+ return false;
+}
+
+
+bool
+TeGeneralizedProxMatrix::IsConnected (const string& object_id1, const string& object_id2)
+{
+ if (imp_ == 0)
+ return false;
+ return imp_->isConnected (object_id1, object_id2);
+}
+
+bool
+TeGeneralizedProxMatrix::ConnectObjects (const string& object_id1, const string& object_id2, const TeProxMatrixAttributes& attr)
+{
+ if (!imp_)
+ getImplementation();
+ imp_->connectObjects (object_id1, object_id2, attr);
+ return true;
+}
+
+bool
+TeGeneralizedProxMatrix::ConnectObjects (const string& object_id1, const string& object_id2)
+{
+ if (!imp_)
+ getImplementation();
+ TeProxMatrixAttributes attr;
+ imp_->connectObjects (object_id1, object_id2, attr);
+ return true;
+}
+
+bool
+TeGeneralizedProxMatrix::DisconnectObjects (const string& object_id1, const string& object_id2)
+{
+ if (imp_ == 0)
+ return false;
+ return imp_->disconnectObjects (object_id1, object_id2);
+}
+
+bool
+TeGeneralizedProxMatrix::RemoveObject (const string& object_id)
+{
+ if (imp_ == 0)
+ return false;
+ return imp_->removeObject (object_id);
+}
+
+bool
+TeGeneralizedProxMatrix::GetConnectionAttributes (const string& object_id1, string& object_id2, TeProxMatrixAttributes& attr)
+{
+ if (imp_ == 0)
+ return false;
+ return imp_->getConnectionAttributes (object_id1, object_id2, attr);
+}
+
+int
+TeGeneralizedProxMatrix::NumberOfObjects ()
+{
+ if (imp_ == 0)
+ return 0;
+ return imp_->NumberOfObjects ();
+}
+
+bool
+TeGeneralizedProxMatrix::SaveTextFile (string name)
+{
+ if (imp_ == 0)
+ return false;
+ return imp_->SaveTextFile (name);
+}
+
+
+bool
+TeGeneralizedProxMatrix::SaveGALFile (string name)
+{
+ if (imp_ == 0)
+ return false;
+ return imp_->SaveGALFile (name);
+}
+
+bool
+TeGeneralizedProxMatrix::SaveGWTFile (string name)
+{
+ if (imp_ == 0)
+ return false;
+ return imp_->SaveGWTFile (name);
+}
+
+TeGeneralizedProxMatrix::~TeGeneralizedProxMatrix()
+{
+ if (imp_ != 0)
+ delete imp_; //It is not counted.
+}
+
+
+
+
+
+
diff --git a/src/terralib/kernel/TeGeneralizedProxMatrix.h b/src/terralib/kernel/TeGeneralizedProxMatrix.h
new file mode 100644
index 0000000..e573103
--- /dev/null
+++ b/src/terralib/kernel/TeGeneralizedProxMatrix.h
@@ -0,0 +1,169 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeGeneralizedProxMatrix.h
+ This file contains structures and definitions about
+ generalized proximity matrices support in TerraLib
+*/
+
+
+#ifndef TeProxMatrix_H
+#define TeProxMatrix_H
+
+#include "TeNeighbours.h"
+#include "TeProxMatrixImplementation.h"
+#include "TeProxMatrixConstructionStrategy.h"
+#include "TeProxMatrixSlicingStrategy.h"
+#include "TeProxMatrixWeightsStrategy.h"
+
+
+//! A class to represent a generalized proximity matrix
+class TeGeneralizedProxMatrix
+{
+private:
+
+ TeProxMatrixImplementation* imp_;
+ TeProxMatrixConstructionStrategy* sc_;
+ TeProxMatrixSlicingStrategy* ss_;
+ TeProxMatrixWeightsStrategy* sw_;
+
+ int total_slices_;
+
+protected:
+
+ //! Get the implementation from a concrete factory defined by impl_type
+ TeProxMatrixImplementation* getImplementation(const string implementation_type = "Breymann");
+
+ //! Verify if a matrix was created correctly by the constructors.
+ bool IsValid() const;
+
+public:
+
+ //! Empty constructor
+ TeGeneralizedProxMatrix ()
+ {imp_ = 0; sc_ = 0; sw_ = 0; ss_ = 0; total_slices_=1;}
+
+ //! Constructor parametrized with specific strategies. Each stragegy must be previously created and correctly parametrized.
+ TeGeneralizedProxMatrix (TeProxMatrixConstructionStrategy* sc, TeProxMatrixWeightsStrategy* sw = 0, TeProxMatrixSlicingStrategy* ss = 0, const string type = "Breymann");
+
+ //! Constructor based on default strategies: (a) Local adjacency of first order; (b) No siling; and (c) No weighs (all equal to 1).
+ TeGeneralizedProxMatrix(TeSTElementSet* objects, TeGeomRep geom_type, const string type = "Breymann");
+
+ //! Copy constructor
+ TeGeneralizedProxMatrix(const TeGeneralizedProxMatrix& p);
+
+ //! Attribution Operator
+ TeGeneralizedProxMatrix& operator=(const TeGeneralizedProxMatrix& p);
+
+ bool ClearImplementation ();
+
+ //! Comparison Operator
+ bool operator==(const TeGeneralizedProxMatrix& p) const;
+
+
+ /** @name Methods for return the neighbours
+ * All methods return the neighbours of a given object in a given slice. The default is the first slice.
+ * Slices are defined according to the Slicing Strategy in use (e.g., according to distance zones, corresponding to neighbourhood orders, weights intervals, etc.).
+ * If the parameter slice is not provided, the first slice is returned.
+ * The operator[] method should preferably be used
+ * For each object, all the connection attributes are stored as properties (weight is the first).
+ */
+ //@{
+ //! Return the neighbours of an object in a slice, packed in a TeNeighbours
+ TeNeighbours getNeighbours (const string& object_id, int slice = 1);
+
+ //! Return the neighbours of an object in a slice, packed in a TeNeighboursMap
+ TeNeighboursMap getMapNeighbours (const string& object_id, int slice = 1);
+
+ //! Operator [], return the neighbours packed in a TeNeighbours
+ TeNeighbours operator[] (const string& object_id);
+
+ //! Return the neighbours of an object and their attributes in a spatial temporal element set (TeSTElementSet)
+ TeSTElementSet getSTENeighbours(const string& object_id);
+
+ //@}
+
+
+ /** @name Methods for changing current strategies
+ * change current strategies
+ */
+ //@{
+ //! Set current construction strategy
+ bool setCurrentConstructionStrategy (TeProxMatrixConstructionStrategy* sc);
+
+ //! Set current weights strategy
+ bool setCurrentWeightsStrategy (TeProxMatrixWeightsStrategy* sw);
+
+ //! Set current slicing strategy
+ bool setCurrentSlicingStrategy (TeProxMatrixSlicingStrategy* ss);
+ //@}
+
+
+ //! Reconstruct matrix and recompute weights and slicing, accornding to current strategies.
+ bool ConstructMatrix ();
+
+ //! Recomputes the weigths, given a new strategy. The matrix is not reconstructed.
+ bool RecomputeWeights ();
+
+ //! Sets the slicing strategy for neighbours selection.
+ bool RecomputeSlicing ();
+
+ //! Verify if two objects are connected
+ bool IsConnected (const string& object_id1, const string& object_id2);
+
+ //! Connect two objects
+ bool ConnectObjects (const string& object_id1, const string& object_id2, const TeProxMatrixAttributes& attr);
+
+ //! Connect two objects
+ bool ConnectObjects (const string& object_id1, const string& object_id2);
+
+ //! Disconnect two objects
+ bool DisconnectObjects (const string& object_id1, const string& object_id2);
+
+ //! Remove object
+ bool RemoveObject (const string& object_id);
+
+ //! Get connection attributes
+ bool GetConnectionAttributes (const string& object_id1, string& object_id2, TeProxMatrixAttributes& attr);
+
+ //! Return the number of objects
+ int NumberOfObjects ();
+
+ //! Return the number of slices
+ int NumerOfSlices () {return total_slices_;}
+
+ //! Save the matrix in a text file
+ bool SaveTextFile (string name);
+
+ //! Save the matrix in a text file
+ bool SaveGALFile (string name);
+
+ //! Save the matrix in a text file
+ bool SaveGWTFile (string name);
+
+ //! Destructor
+ virtual ~TeGeneralizedProxMatrix();
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeGeometry.cpp b/src/terralib/kernel/TeGeometry.cpp
new file mode 100644
index 0000000..67310e2
--- /dev/null
+++ b/src/terralib/kernel/TeGeometry.cpp
@@ -0,0 +1,113 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeGeometry.h"
+#include "TeException.h"
+
+// TeLine2D
+
+bool
+TeLine2D::isRing() const
+{
+ if ( size() <= 3 )
+ return false;
+ return ( pImpl_->operator[] (0) == pImpl_->operator[] ( pImpl_->size() - 1 ) );
+
+}
+
+
+// TeLinearRing
+
+TeLinearRing::TeLinearRing ( TeLine2D& line ): TeLine2D ( line )
+{
+ if ( ! line.isRing() )
+ {
+ line.add (line[0]);
+// throw TeException ( LINE_IS_NOT_RING );
+ }
+}
+
+
+ostream& operator<<(ostream& os, TeNode& N)
+{
+ os << Te2String(N.geomId());
+ return os;
+}
+
+ostream& operator<<(ostream& os, const TeArc& N)
+{
+ TeArc a = N;
+ os << a.objectId();
+ return os;
+}
+
+void
+TeLineSet::copyElements ( const TeLineSet& other )
+{
+ box_ = other.box();
+ geomId_ = other.geomId();
+ objectId_ = other.objectId();
+
+ for (unsigned int i=0; i<other.size(); i++) // for each line
+ {
+ TeLine2D line;
+ line.copyElements(other[i]);
+ this->add (line);
+ }
+}
+
+void
+TePolygon::copyElements ( const TePolygon& other )
+{
+ box_ = other.box();
+ geomId_ = other.geomId();
+ objectId_ = other.objectId();
+
+ for (unsigned int i = 0; i < other.size(); i++) // for each linear ring
+ {
+ TeLine2D line;
+ line.copyElements(other[i]);
+ this->add (line);
+ }
+}
+
+
+void
+TePolygonSet::copyElements ( const TePolygonSet& other )
+{
+ box_ = other.box();
+ geomId_ = other.geomId();
+ objectId_ = other.objectId();
+
+ for (unsigned int i = 0; i < other.size(); i++) // for each polygon
+ {
+ TePolygon poly;
+ poly.copyElements (other[i]);
+ this->add (poly);
+ }
+}
+
+
+
+
+
diff --git a/src/terralib/kernel/TeGeometry.h b/src/terralib/kernel/TeGeometry.h
new file mode 100644
index 0000000..ac2015a
--- /dev/null
+++ b/src/terralib/kernel/TeGeometry.h
@@ -0,0 +1,926 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeGeometry.h
+ This file contains structures and definitions about
+ geometries support in TerraLib
+*/
+
+#ifndef __TERRALIB_INTERNAL_GEOMETRY_H
+#define __TERRALIB_INTERNAL_GEOMETRY_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeBox.h"
+#include "TeCoord2D.h"
+#include "TeComposite.h"
+#include "TeMeasure.h"
+#include "TeUtils.h"
+#include "TeDataTypes.h"
+
+#include <string>
+#include <iostream>
+
+using namespace std;
+
+//! A basic class for handling geometries in TerraLib
+/*!
+ All geometric classes of TerraLib are derived from
+ TeGeometry. This class keep track of a geometryId and of a bounding box for the geometry
+
+ \note The Geometry classes in TerraLib use the Composite and the Visitor patterns
+ \sa TeBox TeGeomComposite, TeGeomSingle
+*/
+class TeGeometry
+{
+public:
+
+ //! Empty constructor
+ TeGeometry(): box_ ( TeMAXFLOAT, TeMAXFLOAT, -TeMAXFLOAT, -TeMAXFLOAT ),
+ geomId_ ( 0 ), objectId_ ("") {}
+
+ //! Copy Constructor
+ TeGeometry ( const TeGeometry& other )
+ {
+ box_ = other.box_;
+ geomId_ = other.geomId_;
+ objectId_ = other.objectId_;
+ }
+
+ //! Destructor
+ virtual ~TeGeometry() {}
+
+ //! Sets the bounding box for the object
+ void setBox ( const TeBox & box )
+ { box_ = box; }
+
+ //! Returns the constant bounding box
+ const TeBox& box () const
+ { return box_; }
+
+ //! Returns the bounding box
+ TeBox& box ()
+ { return box_; }
+
+ //! Returns the geometry Id
+ int geomId() const
+ { return geomId_; }
+
+ //! Sets the geometryId.
+ void geomId( int id )
+ { geomId_ = id; }
+
+ //! Returns the object unique identification
+ virtual string objectId() const
+ { return objectId_; }
+
+ //! Sets the objectId
+ virtual void objectId ( const string& id )
+ { objectId_ = id; }
+
+ //! Return the geometry size
+ virtual unsigned int size() const
+ { return 0; }
+
+ //! Outputs the geometical identification to an output stream
+ ostream& operator<<(ostream& os)
+ {
+ os << Te2String(geomId_);
+ return os;
+ }
+
+ //! Returns TRUE if a geometry is a closed ring
+ virtual bool isRing() const
+ { return false; }
+
+ //! Returns the type of the geometry
+ virtual TeGeomRep elemType()
+ { return TeGEOMETRYNONE; }
+
+protected:
+
+ TeBox box_; //!< The bounding box of the geometry
+ int geomId_; //!< The unique geometry identification
+ string objectId_; //!< The unique object identification associated to a geometry
+};
+
+
+//! A class that represents a non existent geometry
+/*!
+ This class is used to deal in a similar way with objects with or without geometry
+*/
+class TeGeometryNone: public TeGeometry
+{
+public:
+ //! Returns the basic geometry in a set of geometries structure
+ TeGeomRep elemType() { return TeGEOMETRYNONE; }
+
+ void clear () { return; }
+};
+
+//! A class to handle vector geometries
+class TeVector : public TeGeometry
+{
+};
+
+//! TeGeomSingle: A class for handling geometries in TerraLib which consist of one location
+/*!
+ \sa TePoint, TeSample
+*/
+template <class T>
+class TeGeomSingle : public TeVector
+{
+public:
+
+// typedef typename T value_type;
+ typedef T value_type;
+
+ //! Empty constructor
+ TeGeomSingle<T>() {}
+
+ //! Constructor
+ /*!
+ \param elem the unique element of the single
+ */
+ TeGeomSingle<T> (const T& elem ): elem_ ( elem )
+ { updateBox ( box_, elem ); }
+
+ //! Copy Constructor
+ TeGeomSingle ( const TeGeomSingle& other ) : TeVector()
+ {
+ box_ = other.box_;
+ geomId_ = other.geomId_;
+ objectId_ = other.objectId_;
+ elem_ = other.elem_;
+ }
+
+ //! Equal Operator
+ TeGeomSingle& operator = ( const TeGeomSingle& other )
+ {
+ box_ = other.box_;
+ geomId_ = other.geomId_;
+ objectId_ = other.objectId_;
+ elem_ = other.elem_;
+ return *this;
+ }
+
+ //! Destructor
+ virtual ~TeGeomSingle<T>() {}
+
+ //! Changes the unique element
+ void add ( T& elem )
+ {
+ elem_ = elem;
+ box_ = TeBox(TeMAXFLOAT, TeMAXFLOAT,-TeMAXFLOAT,-TeMAXFLOAT); // invalidates its box
+ updateBox ( box_, elem );
+ }
+
+ //! Returns the unique element
+ T& location ()
+ { return elem_; }
+
+ //! Returns the unique element
+ const T& location () const
+ { return elem_; }
+
+ //! Returns the unique element
+ T& elem ()
+ { return elem_; }
+
+ //! Returns the unique element
+ T& operator [] ( int /* i */)
+ { return elem_; }
+
+ //! Returns TRUE if a TeGeomSingle is equal to other
+ bool operator== (const T& other) const
+ { return elem_ == other.elem(); }
+
+ //! Returns the size of a TeGeomSingle: always 1
+ int size() { return 1; }
+
+protected:
+ T elem_;
+
+};
+
+//! TeGeomComposite: A template class for handling a hierarchy of geometries in TerraLib
+/*!
+
+ Used for instantiating the different geometries. Provide a vector to store the 2D
+ coordinates of a ring. Multiple copies of a geometry are allowed to share the same
+ coordinates by means of a "handle/body" idiom.
+
+ \sa TeLine2D TePolygon TeLineSet TePolygonSet
+*/
+
+template <class T>
+class TeGeomComposite: public TeVector
+{
+public:
+
+ //! Constructor
+ TeGeomComposite()
+ {
+ pImpl_ = new TeComposite<T>;
+ pImpl_->attach();
+ }
+
+ //! Destructor
+ virtual ~TeGeomComposite()
+ { pImpl_->detach(); }
+
+
+ //! Copy Constructor
+ TeGeomComposite ( const TeGeomComposite& other ) : TeVector()
+ {
+ pImpl_ = other.pImpl_;
+ pImpl_->attach();
+ box_ = other.box_;
+ geomId_ = other.geomId_;
+ objectId_ = other.objectId_;
+ }
+
+ //! Operator =
+ TeGeomComposite& operator= ( const TeGeomComposite& other )
+ {
+ if ( this != &other )
+ {
+ other.pImpl_->attach();
+ pImpl_->detach();
+ pImpl_ = other.pImpl_;
+ box_ = other.box_;
+ geomId_ = other.geomId_;
+ objectId_ = other.objectId_;
+ }
+ return *this;
+ }
+
+ virtual string objectId() const
+ { return objectId_; }
+
+ virtual void objectId (const string& id )
+ {
+ objectId_ = id;
+ typename TeComposite<T>::iterator it = pImpl_->begin();
+ while (it != pImpl_->end())
+ {
+ it->objectId(id);
+ ++it;
+ }
+ }
+
+ //! Copy two composites, duplicating elements (breaking handle/body idiom)
+ void copyElements ( const TeGeomComposite& other )
+ {
+ box_ = other.box_;
+ geomId_ = other.geomId_;
+ objectId_ = other.objectId_;
+
+ for (unsigned int i = 0; i < other.pImpl_->size(); i++)
+ pImpl_->add (other.pImpl_->operator[](i));
+ }
+
+ //! Returns TRUE if two composites have exactly the same elements
+ bool operator== (const T& other) const
+ {
+ if ( this->size() != other.size() )
+ return false;
+
+ for (unsigned int i = 0; i < other.pImpl_->size(); i++)
+ if ( (pImpl_->operator[](i))==(other.pImpl_->operator[]( i )) )
+ return false;
+ return true;
+ }
+
+ //! Adds a new component
+ void add ( const T& elem )
+ {
+ pImpl_->add ( elem );
+ updateBox ( box_, elem );
+ }
+
+ //! Removes the i-th component
+ bool erase ( int i )
+ {
+ bool status = pImpl_->erase (i);
+
+ if (status) // recalculates the box
+ {
+ box_ = TeBox(TeMAXFLOAT, TeMAXFLOAT,-TeMAXFLOAT,-TeMAXFLOAT);
+ for (unsigned int j = 0; j < pImpl_->size(); j++)
+ updateBox(box_,pImpl_->operator[](j));
+ }
+ return status;
+ }
+
+ //! Removes an element
+ bool erase ( T& object )
+ {
+ bool status = pImpl_->erase ( object );
+ if (status) // recalculates the box
+ {
+ box_ = TeBox(TeMAXFLOAT, TeMAXFLOAT,-TeMAXFLOAT,-TeMAXFLOAT);
+ for (unsigned int j = 0; j < pImpl_->size(); j++)
+ updateBox(box_,pImpl_->operator[](j));
+ }
+ return status;
+ }
+
+ //! Removes the element pointed by an interator
+ typename TeComposite<T>::iterator erase(typename TeComposite<T>::iterator it)
+ {
+ typename TeComposite<T>::iterator res = pImpl_->erase(it);
+ box_ = TeBox(TeMAXFLOAT, TeMAXFLOAT,-TeMAXFLOAT,-TeMAXFLOAT);
+ for (unsigned int j = 0; j < pImpl_->size(); j++)
+ updateBox(box_,pImpl_->operator[](j));
+ return res;
+ }
+
+ //! Removes all elements
+ void clear ()
+ {
+ pImpl_->clear (); // remove all elements
+ box_ = TeBox(TeMAXFLOAT, TeMAXFLOAT,-TeMAXFLOAT,-TeMAXFLOAT); // invalidates its box
+ }
+
+ //! Returns the size of the composite
+ unsigned int size() const
+ { return pImpl_->size(); }
+
+ //! Reserves space for a given number of elements (reserve is available for vectors)
+ void reserve(int nelem)
+ { pImpl_->reserve(nelem); }
+
+ //! Returns the i-th element
+ T& operator [] ( int i ) const
+ { return pImpl_->operator[] ( i ); }
+
+ //! Returns the first element
+ T& first() const
+ { return pImpl_->operator[] ( 0 ); }
+
+ //! Returns the i-th element
+ T& last() const
+ { return pImpl_->operator[] ( pImpl_->size()-1 ); }
+
+ //! Returns TRUE if composite is empty
+ bool empty () const
+ { return pImpl_->empty (); }
+
+ //! An Iterator that enables forward traversal of a TeGeomComposite
+ typedef typename TeComposite<T>::iterator iterator;
+
+ //! The type of the value obtained by dereferencing a TeGeomComposite iterator
+// typedef typename T value_type;
+ typedef T value_type;
+
+ //! The iterator to the first position in the TeGeomComposite
+ typename TeComposite<T>::iterator begin()
+ { return pImpl_->begin(); }
+
+ //! The iterator to the first position in the TeGeomComposite
+ typename TeComposite<T>::iterator const begin() const
+ { return pImpl_->begin(); }
+
+ //! The iterator to the last plus one position in the TeGeomComposite
+ typename TeComposite<T>::iterator end()
+ { return pImpl_->end(); }
+
+ //! The iterator to the last plus one position in the TeGeomComposite
+ typename TeComposite<T>::iterator const end() const
+ { return pImpl_->end(); }
+
+ //! An Iterator that enables backward traversal of a TeGeomComposite
+ typedef typename TeComposite<T>::reverse_iterator reverse_iterator;
+
+ //! The iterator to the first position in the TeGeomComposite in reverse order
+ typename TeComposite<T>::reverse_iterator rbegin()
+ { return pImpl_->rbegin(); }
+
+ //! The iterator to the last plus one position in the TeGeomComposite in reverse order
+ typename TeComposite<T>::reverse_iterator rend()
+ { return pImpl_->rend(); }
+
+protected:
+
+ //! Pointer to the implementation of a composite<T>
+ TeComposite<T> * pImpl_;
+};
+
+//! TeLine2D: Supports a simple 2D line, composed of 2D xy points
+/*!
+ \sa TeGeometry TeLinearRing
+*/
+class TeLine2D : public TeGeomComposite<TeCoord2D> {
+public:
+
+// -- Methods
+
+ //! Check if a line2D is a closed ring
+ bool isRing() const;
+
+ string objectId() const
+ { return objectId_; }
+
+ void objectId (const string& id )
+ { objectId_ = id; }
+
+ TeGeomRep elemType() { return TeLINES; }
+
+};
+
+//! TeLineSet: Supports a composite of lines
+/*!
+ \sa TeGeomComposite
+*/
+class TeLineSet: public TeGeomComposite<TeLine2D>
+{
+public:
+ //! Returns the basic geometry in a set of geometries structure
+ TeGeomRep elemType() { return TeLINES; }
+
+ void copyElements (const TeLineSet& other );
+};
+
+//! TeLinearRing: Provides support for a 2D linear ring
+/*!
+ A linear ring is a 2D line (without self-intersections) whose
+ first point is the same as the last point. A linear ring cannot be created
+ directly, but is instantiated from a 2D line.
+
+ \sa TePolygon
+*/
+class TeLinearRing : public TeLine2D {
+public:
+
+ //! Empty constructor
+ TeLinearRing() : TeLine2D() {}
+
+ //! Contructor from a line
+ TeLinearRing ( TeLine2D& line );
+
+};
+
+
+//! TePolygon: A class for handling 2D polygons.
+/*!
+ In TerraLib, a 2D polygon consists of an outer ring and a list
+ of inner rings
+*/
+class TePolygon: public TeGeomComposite<TeLinearRing>
+{
+public:
+
+ TeGeomRep elemType() { return TePOLYGONS; }
+
+ void copyElements ( const TePolygon& other );
+};
+
+//! TePolygonSet: A class for handling sets of 2D polygons.
+class TePolygonSet: public TeGeomComposite<TePolygon>
+{
+public:
+ //! Returns the basic geometry in a set of geometries structure
+ TeGeomRep elemType() { return TePOLYGONS; }
+
+ void copyElements ( const TePolygonSet& other );
+};
+
+
+//! TePoint: A class for handling 2D Points.
+class TePoint : public TeGeomSingle<TeCoord2D>
+{
+public:
+ //! Default constructor
+ TePoint(const double& x = 0., const double& y = 0. ):
+ TeGeomSingle<TeCoord2D> ( )
+ {
+ elem_ = TeCoord2D(x,y);
+ setBox(TeBox(x,y,x,y)); // the box of a point is the point itself
+ }
+
+ TePoint(TeCoord2D& c):
+ TeGeomSingle<TeCoord2D> ( )
+ {
+ elem_ = c;
+ setBox(TeBox(c.x(),c.y(),c.x(),c.y())); // the box of a point is the point itself
+ }
+
+ TeGeomRep elemType() { return TePOINTS; }
+
+ string objectId() const
+ { return objectId_; }
+
+ void objectId (const string& id )
+ { objectId_ = id; }
+};
+
+//! TePointSet: A class for handling sets of 2D polygons.
+class TePointSet: public TeGeomComposite<TePoint>
+{
+public:
+ //! Returns the basic geometry in a set of geometries structure
+ TeGeomRep elemType() { return TePOINTS; }
+};
+
+//! TeText : A class for handling text.
+class TeText: public TeGeomSingle<TeCoord2D>
+{
+public:
+ //! Default contructor
+ /*!
+ \param txt the string of character that form the text (default is an empty string)
+ */
+ TeText(const string& txt="" ):
+ TeGeomSingle<TeCoord2D> ( ),
+ angle_(0),
+ height_(0),
+ textValue_(txt),
+ alignmentVert_(0),
+ alignmentHoriz_(0)
+ {
+ elem_ = TeCoord2D(0,0);
+ setBox(TeBox(0.0,0.0,0.0,0.0));
+ }
+
+ //! Constructor
+ /*!
+ \param location basic position of the text
+ \param txt the string of character that form the text (default is an empty string)
+ */
+
+ TeText( TeCoord2D& location, const string& txt="" ):
+ TeGeomSingle<TeCoord2D> ( location ),
+ angle_(0),
+ height_(0),
+ textValue_(txt),
+ alignmentVert_(0),
+ alignmentHoriz_(0)
+ {
+ setBox(TeBox(location,location));
+ }
+
+ //! Copy constructor
+ TeText(const TeText& other ) : TeGeomSingle<TeCoord2D>()
+ {
+ angle_ = other.angle_;
+ height_ = other.height_;
+ textValue_ = other.textValue_;
+ alignmentVert_ = other.alignmentVert_;
+ alignmentHoriz_ = other. alignmentHoriz_;
+ setBox(other.box());
+ elem_ = other.elem_;
+ geomId_ = other.geomId_;
+ objectId_ = other.objectId_;
+ }
+
+ //! Operator =
+ TeText& operator= ( const TeText& other )
+ {
+ if ( this != &other )
+ {
+ angle_ = other.angle_;
+ height_ = other.height_;
+ textValue_ = other.textValue_;
+ alignmentVert_ = other.alignmentVert_;
+ alignmentHoriz_ = other. alignmentHoriz_;
+ setBox(other.box());
+ elem_ = other.elem_;
+ geomId_ = other.geomId_;
+ objectId_ = other.objectId_;
+ }
+ return *this;
+ }
+
+ //! Returns TRUE if a text is equal to other
+ bool operator== (const TeText& tx) const
+ {
+ return (angle_ == tx.angle_ &&
+ height_ == tx.height_ &&
+ textValue_ == tx.textValue_ &&
+ alignmentVert_ == tx.alignmentVert_ &&
+ alignmentHoriz_ == tx.alignmentHoriz_ &&
+ elem_ == tx.elem_ &&
+ geomId_ == tx.geomId_ &&
+ objectId_ == tx.objectId_);
+ }
+
+ //! Sets anew value for the location of the text
+ void setLocation(TeCoord2D& l)
+ { elem_ = l; setBox(TeBox(l,l)); }
+
+ //! Returns the string value of a text
+ string textValue () const
+ { return textValue_; }
+
+ //! Sets the string value of a text
+ void setTextValue (const string &text)
+ { textValue_ = text; }
+
+ //! Returns the text inclination
+ double angle () const
+ { return angle_; }
+
+ //! Sets the text inclination
+ void setAngle (double angle)
+ { angle_ = angle; }
+
+ //! Returns the text height
+ double height () const
+ { return height_ ; }
+
+ //! Sets the text height
+ void setHeight (double height)
+ { height_ = height; }
+
+ //! Returns the text vertical alignment
+ double alignmentVert () const
+ { return alignmentVert_ ; }
+
+ //! Sets the text vertical alignment
+ void setAlignmentVert (double alig)
+ { alignmentVert_ = alig; }
+
+ //! Returns the text horizontal alignment
+ double alignmentHoriz () const
+ { return alignmentHoriz_ ; }
+
+ //! Sets the text horizontal alignment
+ void setAlignmentHoriz (double alig)
+ { alignmentHoriz_ = alig; }
+
+ TeGeomRep elemType() { return TeTEXT; }
+
+private:
+ double angle_;
+ double height_;
+ string textValue_;
+ double alignmentVert_;
+ double alignmentHoriz_;
+};
+
+
+//! TeTextSet : A class for handling sets of TeText.
+class TeTextSet : public TeGeomComposite<TeText>
+{
+public:
+ //! Returns the basic geometry in a set of geometries structure
+ TeGeomRep elemType() { return TeTEXT; }
+
+};
+
+
+//! TeNode: A class for handling 2D Nodes.
+class TeNode: public TeGeomSingle<TeCoord2D>
+{
+public:
+ //! Returns TRUE if nodes are equal
+ bool operator== (const TeNode& node) const
+ {
+ TeCoord2D p1 = elem_;
+ TeCoord2D p2 = node.elem_;
+ return p1==p2;
+ }
+
+ //! Outputs the geometrical identification of a node
+ ostream& operator<<(ostream& os)
+ {
+ os << Te2String(geomId_);
+ return os;
+ }
+
+ TeGeomRep elemType() { return TeNODES; }
+
+};
+
+//! Outputs the geometrical identification of a node
+ostream& operator<<(ostream& os, TeNode& N);
+
+//! TeNodeSet : A class for handling sets of 2D Nodes.
+class TeNodeSet : public TeGeomComposite<TeNode>
+
+{
+public:
+ //! Returns the basic geometry in a set of geometries structure
+ TeGeomRep elemType() { return TeNODES; }
+
+};
+
+//! TeArc : Provides support for a 2D arc.
+class TeArc : public TeVector
+{
+public:
+
+ //! Empty contructors
+ TeArc(): ifrom_ (-1), ito_ (-1){}
+
+ //! Construtor
+ /*!
+ \param from the starting node of an arc
+ \param to the ending node of an arc
+ */
+ TeArc(TeNode& from, TeNode& to)
+ {
+ from_ = from;
+ to_ = to;
+ updateBox ( box_, from );
+ updateBox ( box_, to );
+ }
+
+ //! Construtor
+ /*!
+ \param from the geometrical identification of the starting node of an arc
+ \param to the geometrical identification of the ending node of an arc
+ */
+ TeArc(int from, int to): ifrom_ (from), ito_ (to) {}
+
+// -- Methods
+
+ //! Returns the starting node
+ TeNode& fromNode ()
+ { return from_; }
+
+ //! Returns the ending node
+ TeNode& toNode ()
+ { return to_; }
+
+ //! Returns the geometrical identification of the starting node
+ int fromId () const
+ { return ifrom_; }
+
+ //! Sets the geometrical identification of the starting node
+ void fromId (int i)
+ { ifrom_ = i; }
+
+ //! Returns the geometrical identification of the ending node
+ int toId () const
+ { return ito_; }
+
+ //! Sets the geometrical identification of the ending node
+ void toId (int i)
+ { ito_ = i; }
+
+ //! Sets the starting and ending node
+ void setNodes (TeNode& from, TeNode& to)
+ {
+ from_ = from;
+ to_ = to;
+ updateBox ( box_, from );
+ updateBox ( box_, to );
+ }
+
+ TeGeomRep elemType() { return TeARCS; }
+
+private:
+
+ TeNode from_, to_;
+ int ifrom_, ito_;
+};
+//! Outputs the description of an arc
+ostream& operator<<(ostream& os, const TeArc& N);
+
+
+//! TeArcSet: Provides support for a set of 2D arc.
+class TeArcSet: public TeGeomComposite <TeArc>
+{
+public:
+ //! Returns the basic geometry in a set of geometries structure
+ TeGeomRep elemType() { return TeARCS; }
+};
+
+//! TeSample: A class for handling 2D Points with an associated measure.
+class TeSample: public TeGeomSingle<TeCoord2D>, public TeMeasure
+{
+public:
+ //! Constructor
+ /*!
+ \param location the position of the sample
+ \param measure the value associated to the sample
+ */
+ TeSample ( TeCoord2D& location, double measure = 0. ):
+ TeGeomSingle<TeCoord2D> ( location ), TeMeasure ( measure ) {}
+
+ TeGeomRep elemType() { return TeSAMPLES; }
+};
+
+//! TeSampleSet: A class for handling sets of 2D samples
+class TeSampleSet: public TeGeomComposite<TeSample>
+{
+public:
+ //! Returns the basic geometry in a set of geometries structure
+ TeGeomRep elemType() { return TeSAMPLES; }
+};
+
+//! TeContourLine: A class for handling 2D countour lines
+class TeContourLine: public TeLine2D, public TeMeasure
+{
+public:
+ //! Constructor
+ /*!
+ \param line the contour line
+ \param measure the value associated to the contour line
+ */
+ TeContourLine ( TeLine2D& line, double measure = 0. )
+ : TeLine2D ( line ), TeMeasure ( measure )
+ {}
+};
+
+
+//! TeContourLineSet: A class for handling sets of 2D countour lines
+class TeContourLineSet: public TeGeomComposite <TeContourLine>
+{
+public:
+ //! Returns the basic geometry in a set of geometries structure
+ TeGeomRep elemType() { return TeSAMPLES; }
+};
+
+
+//! A class for handling cells.
+class TeCell : public TeVector
+{
+ int column_; //!< the column number of this cell
+ int line_; //!< the line number of this cell
+
+public:
+ //! Empty constructor
+ TeCell():
+ column_(-1),
+ line_(-1) {}
+
+ TeCell(TeBox& box, int col, int lin):
+ column_(col),
+ line_(lin) { setBox(box); }
+
+ //! Returns the column identification of the cell
+ int column () const
+ { return column_; }
+
+ //! Sets the column identification of the cell
+ void column (int column)
+ { column_ = column; }
+
+ //! Returns the line identification of the cell
+ int line () const
+ { return line_; }
+
+ //! Sets the line identification of the cell
+ void line (int line)
+ { line_ = line; }
+
+ TeGeomRep elemType() { return TeCELLS; }
+};
+
+//! A class for handling sets of cells.
+class TeCellSet: public TeGeomComposite<TeCell>
+{
+ double resX_; //!< the X resolution of a set of cells
+ double resY_; //!< the Y resolution of a set of cells
+
+public:
+
+ //! Returns the X resolution of a cell set
+ double resX () const
+ { return resX_; }
+
+ //! Returns the Y resolution of a cell set
+ double resY () const
+ { return resY_; }
+
+ //! Sets the X resolution of a cell set
+ void resX (double reX)
+ { resX_ = reX; }
+
+ //! Sets the Y resolution of a cell set
+
+ void resY (double reY)
+ { resY_ = reY; }
+
+ //! Returns the basic geometry in a set of geometries structure
+ TeGeomRep elemType() { return TeCELLS; }
+
+};
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeGeometryAlgorithms.cpp b/src/terralib/kernel/TeGeometryAlgorithms.cpp
new file mode 100644
index 0000000..ec374d8
--- /dev/null
+++ b/src/terralib/kernel/TeGeometryAlgorithms.cpp
@@ -0,0 +1,2695 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ * Verficar os lugares em que usa safeintersections pois talvez ter� que fazer o sort
+ */
+
+#include "TeAssertions.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeDefines.h"
+
+#include "TeIntersector.h"
+#include "TeFragmentation.h"
+
+#include <algorithm>
+#include <set>
+
+
+using namespace std;
+
+//---------- Local Functions ans Structures ----------//
+
+//! Instead of using arctan, use this to compare angles, so given two points return a number to be used in place of the angle formed by the segment.
+double Theta(const TeCoord2D& c1, const TeCoord2D& c2)
+{
+ register double dx = c2.x() - c1.x();
+ register double ax = fabs(dx);
+ register double dy = c2.y() - c1.y();
+ register double ay = fabs(dy);
+ register double t = 0.0;
+
+ if((dx == 0.0) && (dy == 0.0))
+ t = 0.0;
+ else
+ t = dy / (ax + ay);
+
+ if(dx < 0.0)
+ t = 2 - t;
+ else
+ if(dy < 0.0)
+ t = 4.0 + t;
+
+ return t * 90.0;
+}
+
+//! This struct is used for compare angles between two points and an anchor.
+struct ThetaOrder
+{
+ //! A fixed coordinate to be used to compare.
+ TeCoord2D anchor;
+
+ ThetaOrder(const TeCoord2D& c)
+ : anchor(c)
+ {
+ }
+
+ // Return true if c1 and anchor has a smaller angle than c2 and anchor.
+ bool operator()(const TeCoord2D& c1, const TeCoord2D& c2) const
+ {
+ register double t1 = Theta(anchor, c1);
+ register double t2 = Theta(anchor, c2);
+
+ if(t1 < t2)
+ return true;
+
+ if(t1 > t2)
+ return false;
+
+ if(c1.x() < c2.x())
+ return true;
+
+ if(c1.x() > c2.x())
+ return false;
+
+ return false;
+ }
+};
+
+/*! \struct xOrder
+ \brief Returns true if c1 < c2 otherwise, returns false.
+ */
+template<class T> struct xOrder
+{
+ bool operator()(T c1, T c2)
+ {
+ if(c1.x() < c2.x())
+ return true;
+
+ if(c1.x() > c2.x())
+ return false;
+
+ if(c1.y() < c2.y())
+ return true;
+
+ return false;
+ }
+};
+
+/*! \fn double TeArea(TeLinearRing& r);
+ \brief This function returns twice the area of a ring treated as a simple polygon (no holes).
+ \param r The ring.
+
+ This function returns twice the area of a ring treated as a simple polygon (no holes).
+ May return a negative number => it will be used in Orientation tests.
+*/
+double Te2Area(const TeLinearRing& r)
+{
+ double S2 = 0.0;
+
+ TeLinearRing::iterator it = r.begin();
+ TeLinearRing::iterator end = r.end() - 1;
+ while(it != end)
+ {
+ S2 += (it->x() + (it + 1)->x()) * ((it + 1)->y() - it->y());
+ ++it;
+ }
+
+ return S2;
+}
+
+/*! \fn short TeConverseRelation(const short& rel)
+ \brief This function returns the complements relation of one given relation.
+ \param rel The relation.
+*/
+inline short ConverseRelation(const short& rel)
+{
+ switch(rel)
+ {
+ case TeCOVEREDBY : return TeCOVERS;
+ case TeWITHIN : return TeCONTAINS;
+ case TeCOVERS : return TeCOVEREDBY;
+ case TeCONTAINS : return TeWITHIN;
+ default : return rel;
+ }
+}
+
+/*! \fn bool MayTouches(const TeLine2D& lRed, const TeLine2D& lBlue, TeINTERSECTOR2::TeReportTree& report)
+ \brief This function verifies if the two lines may touches.
+ \param lRed The first line.
+ \param lBlue The second line.
+ \param report The intersection point list.
+*/
+bool MayTouches(const TeLine2D& lRed, const TeLine2D& lBlue, TeINTERSECTOR2::TeVectorBoundaryIP& report)
+{
+ if(lRed.isRing() && lBlue.isRing())
+ return false;
+
+ TeINTERSECTOR2::TeVectorBoundaryIP::iterator it = report.begin();
+ TeINTERSECTOR2::TeVectorBoundaryIP::iterator it_end = report.end();
+
+
+ // Get the boundaries' coordinate.
+ TeCoord2D line1_boundary1 = lRed[0];
+ TeCoord2D line1_boundary2 = lRed[lRed.size() - 1u];
+
+ TeCoord2D line2_boundary1 = lBlue[0];
+ TeCoord2D line2_boundary2 = lBlue[lBlue.size() - 1u];
+
+ // Verifies if intersection points are on boundary of one of the blue line
+ while(it != it_end)
+ { // Get intersection point coordinate.
+
+ for(unsigned int i = 0; i < it->coords_.size(); ++i)
+ {
+ TeCoord2D ip_coord = it->coords_[i];
+
+ if(lRed.isRing())
+ {
+ if(!(TeEquals(ip_coord, line2_boundary1) || TeEquals(ip_coord, line2_boundary2)))
+ return false;
+ }
+ else if(lBlue.isRing())
+ {
+ if(!(TeEquals(ip_coord, line1_boundary1) || TeEquals(ip_coord, line1_boundary2)))
+ return false;
+ }
+ else
+ {
+ if(!(TeEquals(ip_coord, line1_boundary1) || TeEquals(ip_coord, line1_boundary2) || TeEquals(ip_coord, line2_boundary1) || TeEquals(ip_coord, line2_boundary2)))
+ return false;
+ }
+ }
+
+ ++it;
+ }
+
+ return true; // The lines touches.
+}
+
+/*! \fn short Relation(const TeLine2D& lRed, const TeLine2D& lBlue, TeINTERSECTOR2::TeReportTree& report, const short& relation)
+ \brief This function returns the relation between two lines.
+ \param lRed The first line.
+ \param lBlue The second line.
+ \param report The intersection point list.
+ \param relation The relation that stop the search.
+
+ This function returns the relation between lines. May be: TeDISJOINT, TeTOUCHES, TeWITHIN, TeCROSSES, TeCOVEREDBY, TeEQUALS.
+ Obs: Doesn't do box elimination. You must implement the test in your own functions.
+*/
+short Relation(const TeLine2D& lRed, const TeLine2D& lBlue, TeINTERSECTOR2::TeVectorBoundaryIP& report, const short& relation)
+{
+ if(report.size() == 0u)
+ return TeDISJOINT;
+
+ // Do fragmentation
+ //bool hasContour = false; // This will decide between CROSSES and OVERLAPS.
+
+ bool mayTouches = MayTouches(lRed, lBlue, report);
+
+ // Stop to check, because touches can't occur anymore
+ if(relation == TeTOUCHES && !mayTouches)
+ return TeUNDEFINEDREL;
+
+
+ TeLineSet redFragments;
+ TeLineSet redBoundaryFragments;
+ TeLine2D lRedAux;
+ lRedAux.copyElements(lRed);
+ TeLineSet lSet; lSet.add(lRedAux);
+
+ TeFragmentBoundary(lSet, report, redBoundaryFragments, redFragments);
+
+ unsigned int redFragmentsSize = redFragments.size();
+
+ short mask = TeUNKNOWNPOSITION;
+
+ if(redBoundaryFragments.size() > 0u)
+ mask |= TeINSIDE;
+
+ // Do a position test for each fragment and stop if all relations have been found.
+ for(unsigned int j = 0u; j < redFragmentsSize; ++j)
+ {
+ TeCoord2D middle;
+
+ if(redFragments[j].size() == 2u) // If the fragment has two points I need to check the middle point of this fragment.
+ TeGetMiddlePoint(redFragments[j][0u], redFragments[j][1u], middle);
+ else // If the fragment has more than two points so I check one point between the end points.
+ middle = redFragments[j][(unsigned int)((double(redFragments[j].size()) / 2.0 + 0.5)) - 1];
+
+ if(TeIsOnLine(middle, lBlue))
+ mask |= TeINSIDE;
+ else
+ mask |= TeOUTSIDE;
+
+ if((mask & TeOUTSIDE) && (mask & TeINSIDE))
+ break;
+ }
+
+ // If the intersection is only at end points and there is no part of red line inside blue line so they touches
+ if(mayTouches && mask == TeOUTSIDE)
+ {
+ return TeTOUCHES;
+ }
+
+ // Stop to check, because touches can't occur anymore
+ if(relation == TeTOUCHES)
+ return TeUNDEFINEDREL;
+
+
+ // if there is no fragments in line blue interiors, so line red cross line blue
+ if(mask == TeOUTSIDE)
+ return TeCROSSES;
+
+ // Stop to check, because crosses can't occur anymore
+ if(relation == TeCROSSES)
+ return TeUNDEFINEDREL;
+
+ TeCoord2D firstRedCoord = lRed[0];
+ TeCoord2D lastRedCoord = lRed[lRed.size() - 1];
+
+ TeCoord2D firstBlueCoord = lBlue[0];
+ TeCoord2D lastBlueCoord = lBlue[lBlue.size() - 1];
+
+
+ // If there is no part of red line outside blue line => must decide within, covered by and equals
+ if(!(mask & TeOUTSIDE))
+ {
+ // So, if we arrived here, blue line contains red line, but needs to decide between equal, coveredby and within.
+
+ if(TeEquals(firstRedCoord, firstBlueCoord) || TeEquals(firstRedCoord, lastBlueCoord))
+ {
+ if(TeEquals(lastRedCoord, firstBlueCoord) || TeEquals(lastRedCoord, lastBlueCoord))
+ {
+ return TeEQUALS;
+ }
+ else
+ {
+ if(lBlue.isRing())
+ return TeWITHIN;
+ else
+ return TeCOVEREDBY;
+ }
+ }
+
+ if(TeEquals(lastRedCoord, firstBlueCoord) || TeEquals(lastRedCoord, lastBlueCoord))
+ {
+ if(lBlue.isRing())
+ return TeWITHIN;
+ else
+ return TeCOVEREDBY;
+ }
+
+ return TeWITHIN;
+ }
+
+ return TeUNDEFINEDREL;
+}
+
+/*! \fn short Relation(const TeLine2D& line, const TeLinearRing& ring, const short& relation)
+ \brief This function returns the relation between a line and a linear ring (treated as a simple polygon with no holes).
+ \param line The line.
+ \param ring The simple polygon ring.
+
+ This function returns how the points of input line are related with interior, boundary, and
+ exterior of polygon. The mask may be a combination of the following values: TeOUTSIDE, TeINSIDE and TeBOUNDARY.
+ Obs: Do box elimination.
+*/
+short Relation(const TeLine2D& line, const TeLinearRing& ring)
+{
+ if(TeDisjoint(line.box(), ring.box()))
+ return TeOUTSIDE;
+
+ TeINTERSECTOR2::TeVectorBoundaryIP report;
+
+ if(TeINTERSECTOR2::TeSafeIntersections(line, ring, report))
+ {
+ short mask = TeBOUNDARY; // It will be at least intersections between boundaries.
+
+ // Fragments line.
+ TeLineSet lSet;
+ TeLineSet boundaryFragments;
+ TeLine2D lineAux;
+ lineAux.copyElements(line);
+ TeLineSet auxLineSet; auxLineSet.add(lineAux);
+
+ TeFragmentBoundary(auxLineSet, report, boundaryFragments, lSet);
+
+
+ unsigned int lSetSize = lSet.size();
+
+ // Do a position test for each fragment and stop if al relations has been found.
+ for(unsigned int j = 0; j < lSetSize; ++j)
+ {
+ TeCoord2D middle;
+
+ if(lSet[j].size() == 2) // If the fragment has two points I need to check the middle point of this fragment.
+ TeGetMiddlePoint(lSet[j][0], lSet[j][1], middle);
+ else // If the fragment has more than two points so I check one point between the end points.
+ middle = lSet[j][(unsigned int)((double(lSet[j].size()) / 2.0 + 0.5)) - 1];
+
+
+ mask |= TeRelation(middle, ring);
+
+ if((mask & TeOUTSIDE) && (mask & TeINSIDE))
+ break;
+ }
+
+ return mask;
+ }
+ else
+ return TeRelation(line[0], ring); // Needs to test only one point of the line, and its location defines the line location.
+}
+
+/*! \fn short TopologicRelation(const TeLine2D& line, const TeLinearRing& r)
+ \brief This function returns the relation between a line and a linear ring (treated as a simple polygon with no holes).
+ \param line The line.
+ \param r The simple polygon ring.
+
+ This function returns the topologic relation between the line and
+ the ring. The result may be: DISJOINT, WITHIN, TOUCHES, CROSSES or COVERED BY.
+ Obs: Doesn't do box elimination. Just uses from TeRelation.
+*/
+short TopologicRelation(const TeLine2D& line, const TeLinearRing& r)
+{
+ short mask = Relation(line, r);
+
+ if(mask & TeBOUNDARY) // TOUCHES or CROSSES or COVERED BY
+ {
+ if(mask & TeOUTSIDE) // TOUCHES or CROSSES
+ {
+ if(mask & TeINSIDE)
+ return TeCROSSES;
+ else
+ return TeTOUCHES;
+ }
+ else // COVERED BY
+ return TeCOVEREDBY;
+
+ }
+ else // DISJOINT or WITHIN
+ {
+ if(mask & TeINSIDE)
+ return TeWITHIN;
+ else
+ return TeDISJOINT;
+ }
+}
+
+/*! \fn short TopologicRelation(const TeLinearRing& rRed, const TeLinearRing& rBlue)
+ \brief This function returns the relationship between two rings (treated as simple polygons with no holes).
+ \param rRed The ring to test relationship.
+ \param rBlue The ring to test relationship.
+
+ This function returns the relationship between two rings.
+*/
+short TopologicRelation(const TeLinearRing& rRed, const TeLinearRing& rBlue)
+{
+ // See the intersection between the points of rRed and the three components of rBlue (Boundary, Exterior, Interior)
+ short rel = Relation(rRed, rBlue);
+
+ if((rel & TeOUTSIDE) && (rel & TeINSIDE) && (rel & TeBOUNDARY))
+ return TeOVERLAPS;
+
+ if((rel & TeOUTSIDE) && !(rel & TeINSIDE) && (rel & TeBOUNDARY))
+ {
+ if(TeWithinOrCoveredByOrEquals(rBlue.box(), rRed.box()))
+ {
+ short rel_aux = Relation(rBlue, rRed);
+
+ if((rel_aux & TeINSIDE) && !(rel_aux & TeOUTSIDE) && (rel_aux & TeBOUNDARY))
+ return TeCOVERS;
+ }
+
+ return TeTOUCHES;
+ }
+
+ if((rel & TeOUTSIDE) && !(rel & TeINSIDE) && !(rel & TeBOUNDARY))
+ {
+ if(TeWithinOrCoveredByOrEquals(rBlue.box(), rRed.box()))
+ {
+ if(TeRelation(rBlue[0], rRed) == TeINSIDE)
+ return TeCONTAINS;
+ }
+
+ return TeDISJOINT;
+ }
+
+ if(!(rel & TeOUTSIDE) && (rel & TeINSIDE) && !(rel & TeBOUNDARY))
+ return TeWITHIN;
+
+ if(!(rel & TeOUTSIDE) && (rel & TeINSIDE) && (rel & TeBOUNDARY))
+ return TeCOVEREDBY;
+
+ if(rel == TeBOUNDARY)
+ return TeEQUALS;
+
+ return TeINTERSECTS;
+}
+
+/*! \fn short TeTopologicRelation(const TeLinearRing& rRed, const TeLinearRing& rBlue, vector<TeLinearRing>& rings, short& rel)
+ \brief This function returns the relationship between the ring and the polygon inner rings.
+ \param rRed The ring to test relationship.
+ \param pBlue The polygon to test relationship.
+ \param rings Inner rings from blue polygon that is inside or is covered by red external polygon.
+ \param rel The relation between external red ring and external blue ring.
+
+ This function returns the relationship between the ring and the polygon inner rings.
+*/
+short LookAtInnerRings(const TeLinearRing& rRed, const TePolygon& pBlue, vector<TeLinearRing>& rings, short& rel)
+{
+ register unsigned int i = 1;
+ register unsigned int nRings = pBlue.size();
+
+ for(; i < nRings; ++i)
+ {
+ switch(TopologicRelation(rRed, pBlue[i]))
+ {
+ case TeCOVEREDBY : return TeTOUCHES;
+
+ case TeWITHIN : return TeDISJOINT;
+
+ case TeOVERLAPS : return TeOVERLAPS;
+
+ case TeEQUALS : return TeTOUCHES;
+
+ case TeDISJOINT : continue; // this ring is outside the external ring, so it doesn't contribute to the relationship.
+
+ case TeTOUCHES : rel = TeCOVEREDBY; // change rel if rel is within.
+ continue;
+
+ case TeCOVERS : rings.push_back(pBlue[i]);
+ rel = TeCOVEREDBY;
+ break;
+
+ case TeCONTAINS : rings.push_back(pBlue[i]);
+ break;
+ }
+ }
+
+ return TeUNDEFINEDREL;
+}
+
+/*! \fn short TestInnerRings(const TePolygon& pRed, vector<TeLinearRing>& rings)
+ \brief This function returns the relationship between the ring and the polygon inner rings.
+ \param pRed The inner rings from pRed to test relationship.
+ \param rings Inner rings from blue polygon that is inside or is covered by red external polygon.
+
+ This function returns the relationship between the inner ring of pRed and the inner rings in rings.
+*/
+short TestInnerRings(const TePolygon& pRed, vector<TeLinearRing>& rings)
+{
+ unsigned int nRedRings = pRed.size();
+ unsigned int nBlueRings = rings.size();
+
+ if((nRedRings - 1) != nBlueRings)
+ return TeOVERLAPS;
+
+ unsigned int i = 1;
+ unsigned int j = 0;
+
+ bool find = false;
+
+ set<unsigned int> blueRingsProcessed;
+
+ set<unsigned int> redRingsContainsCovers;
+
+ short rel = TeUNDEFINEDREL;
+
+ for(; i < nRedRings; ++i)
+ {
+ find = false;
+
+ for(j = 0; j < nBlueRings; ++j)
+ {
+ if(blueRingsProcessed.find(j) != blueRingsProcessed.end())
+ continue;
+
+ switch(TopologicRelation(pRed[i], rings[j]))
+ {
+ case TeDISJOINT : continue; // so it doesn't contribute to the relationship yet.
+
+ case TeEQUALS :
+ rel |= TeEQUALS;
+ blueRingsProcessed.insert(j);
+ find = true;
+ break;
+
+ case TeCONTAINS :
+ if(redRingsContainsCovers.find(i) != redRingsContainsCovers.end())
+ return TeOVERLAPS;
+
+ rel |= TeCONTAINS;
+
+ redRingsContainsCovers.insert(i);
+ blueRingsProcessed.insert(j);
+ find = true;
+ break;
+
+ case TeCOVERS :
+ if(redRingsContainsCovers.find(i) != redRingsContainsCovers.end())
+ return TeOVERLAPS;
+
+ rel |= TeCOVERS;
+
+ redRingsContainsCovers.insert(i);
+ blueRingsProcessed.insert(j);
+ find = true;
+ break;
+
+
+ default : return TeOVERLAPS;
+ }
+
+ if(find)
+ break;
+ }
+
+ if(!find)
+ return TeOVERLAPS;
+ }
+
+ return rel;
+}
+
+//---------- Topological Function ----------//
+
+// EQUALS
+template<> bool TeEquals(const TeCoord2D& c1, const TeCoord2D& c2)
+{
+ if(TeGeometryAlgorithmsPrecision::IsDifferent(c1.x(), c2.x()))
+ return false;
+
+ if(TeGeometryAlgorithmsPrecision::IsDifferent(c1.y(), c2.y()))
+ return false;
+
+ return true;
+}
+
+template<> bool TeEquals(const TePoint& p1, const TePoint& p2)
+{
+ return TeEquals(p1.location(), p2.location());
+}
+
+template<> bool TeEquals(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+ if(TeEquals(redLine.box(), blueLine.box()))
+ return TeRelation(redLine, blueLine, TeEQUALS) == TeEQUALS;
+ else
+ return false;
+}
+
+template<> bool TeEquals(const TePolygon& redPol, const TePolygon& bluePol)
+{
+ if(TeEquals(redPol.box(), bluePol.box()))
+ {
+ if(redPol.size() != bluePol.size())
+ return false;
+
+ return TeRelation(redPol, bluePol) == TeEQUALS;
+ }
+ else
+ return false;
+}
+
+template<> bool TeEquals(const TeBox& bx1, const TeBox& bx2)
+{
+ if(TeGeometryAlgorithmsPrecision::IsDifferent(bx1.x1(), bx2.x1()))
+ return false;
+
+ if(TeGeometryAlgorithmsPrecision::IsDifferent(bx1.y1(), bx2.y1()))
+ return false;
+
+ if(TeGeometryAlgorithmsPrecision::IsDifferent(bx1.x2(), bx2.x2()))
+ return false;
+
+ if(TeGeometryAlgorithmsPrecision::IsDifferent(bx1.y2(), bx2.y2()))
+ return false;
+
+ return true;
+}
+
+template<> bool TeEquals(const TeCell& cell1, const TeCell& cell2)
+{
+ return TeEquals(cell1.box(), cell2.box());
+}
+
+
+// DISJOINT
+bool TeDisjoint(const TeCoord2D& c1, const TeCoord2D& c2)
+{
+ if(TeGeometryAlgorithmsPrecision::IsDifferent(c1.x(), c2.x()))
+ return true;
+
+ if(TeGeometryAlgorithmsPrecision::IsDifferent(c1.y(), c2.y()))
+ return true;
+
+ return false;
+}
+
+bool TeDisjoint(const TeCoord2D& c, const TeBox& b)
+{
+ // c to the right of b
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c.x(), b.x2()))
+ return true;
+
+ // c to the left of b
+ if(TeGeometryAlgorithmsPrecision::IsGreater(b.x1(), c.x()))
+ return true;
+
+ // c is above b
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c.y(), b.y2()))
+ return true;
+
+ // c is below b
+ if(TeGeometryAlgorithmsPrecision::IsGreater(b.y1(), c.y()))
+ return true;
+
+ return false;
+}
+
+bool TeDisjoint(const TeBox& bx1, const TeBox& bx2)
+{
+ // B1 to the right of B2
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.x1(), bx2.x2()))
+ return true;
+
+ // B1 to the left of B2
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.x1(), bx1.x2()))
+ return true;
+
+ // B2 is above B1
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.y1(), bx1.y2()))
+ return true;
+
+ // B2 is below B1
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.y1(), bx2.y2()))
+ return true;
+
+ return false;
+}
+
+bool TeDisjoint(const TeCoord2D& c, const TeLine2D& l)
+{
+ return TeRelation(c, l) == TeOUTSIDE;
+}
+
+bool TeDisjoint(const TeCoord2D& c, const TePolygon& pol)
+{
+ return TeRelation(c, pol) == TeOUTSIDE;
+}
+
+bool TeDisjoint(const TePoint& p1, const TePoint& p2)
+{
+ return TeDisjoint(p1.location(), p2.location());
+}
+
+bool TeDisjoint(const TePoint& p, const TeLine2D& l)
+{
+ return TeDisjoint(p.location(), l);
+}
+
+bool TeDisjoint(const TePoint& p, const TePolygon& pol)
+{
+ return TeDisjoint(p.location(), pol);
+}
+
+bool TeDisjoint(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+ if(TeDisjoint(redLine.box(), blueLine.box()))
+ return true;
+
+ return !TeINTERSECTOR2::TeIntersects(redLine, blueLine);
+}
+
+bool TeDisjoint(const TeLine2D& l, const TePolygon& pol)
+{
+ if(TeDisjoint(l.box(), pol.box()))
+ return true;
+
+ return TeRelation(l, pol) == TeDISJOINT;
+}
+
+bool TeDisjoint(const TePolygon& redPol, const TePolygon& bluePol)
+{
+ if(TeDisjoint(redPol.box(), bluePol.box()))
+ return true;
+ else
+ return TeRelation(redPol, bluePol) == TeDISJOINT;
+}
+
+bool TeDisjoint(const TeCell& cell1, const TeCell& cell2)
+{
+ return TeDisjoint(cell1.box(), cell2.box());
+}
+
+bool TeDisjoint(const TeCell& cell, const TeLine2D& line)
+{
+ return TeDisjoint(line, TeMakePolygon(cell.box()));
+}
+
+bool TeDisjoint(const TeCell& cell, const TePolygon& pol)
+{
+ return TeDisjoint(pol, TeMakePolygon(cell.box()));
+}
+
+bool TeDisjoint(const TeCell& cell, const TePoint& point)
+{
+ return TeDisjoint(point.location(), cell.box());
+}
+
+
+// INTERSECTS
+template<> bool TeIntersects(const TeCoord2D& c, const TeBox& b)
+{
+ // c to the right of b
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c.x(), b.x2()))
+ return false;
+
+ // c to the left of b
+ if(TeGeometryAlgorithmsPrecision::IsGreater(b.x1(), c.x()))
+ return false;
+
+ // c is above b
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c.y(), b.y2()))
+ return false;
+
+ // c is below b
+ if(TeGeometryAlgorithmsPrecision::IsGreater(b.y1(), c.y()))
+ return false;
+
+ return true;
+}
+
+template<> bool TeIntersects(const TePoint& p, const TeBox& b)
+{
+ return TeIntersects(p.location(), b);
+}
+
+template<> bool TeIntersects(const TeBox& bx1, const TeBox& bx2)
+{
+ // B1 to the right of B2
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.x1(), bx2.x2()))
+ return false;
+
+ // B1 to the left of B2
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.x1(), bx1.x2()))
+ return false;
+
+ // B2 is above B1
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.y1(), bx1.y2()))
+ return false;
+
+ // B2 is below B1
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.y1(), bx2.y2()))
+ return false;
+
+ return true;
+}
+
+
+// TOUCHES
+bool TeTouches(const TeCoord2D& c, const TeLine2D& l)
+{
+ return TeRelation(c, l) == TeBOUNDARY;
+}
+
+bool TeTouches(const TeCoord2D& c, const TePolygon& pol)
+{
+ return TeRelation(c, pol) == TeBOUNDARY;
+}
+
+bool TeTouches(const TePoint& p, const TeLine2D& l)
+{
+ return TeTouches(p.location(), l);
+}
+
+bool TeTouches(const TePoint& p, const TePolygon& pol)
+{
+ return TeTouches(p.location(), pol);
+}
+
+bool TeTouches(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+ if(TeDisjoint(redLine.box(), blueLine.box()))
+ return false;
+
+ return TeRelation(redLine, blueLine, TeTOUCHES) == TeTOUCHES;
+}
+
+bool TeTouches(const TeLine2D& l, const TePolygon& pol)
+{
+ if(TeDisjoint(l.box(), pol.box()))
+ return false;
+
+ return TeRelation(l, pol) == TeTOUCHES;
+}
+
+bool TeTouches(const TePolygon& redPol, const TePolygon& bluePol)
+{
+ if(TeDisjoint(redPol.box(), bluePol.box()))
+ return false;
+
+ return TeRelation(redPol, bluePol) == TeTOUCHES;
+}
+
+bool TeTouches(const TeBox& bx1, const TeBox& bx2)
+{
+ // bx1 may touches its right wall in bx2 left wall
+ // or bx1 may touches its left wall in bx2 right wall
+ if(TeGeometryAlgorithmsPrecision::IsEqual(bx1.x2(), bx2.x1()) || TeGeometryAlgorithmsPrecision::IsEqual(bx1.x1(), bx2.x2()))
+ {
+ // bx1 is below bx2
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.y1(), bx1.y2()))
+ return false;
+
+ // bx1 is above bx2
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.y1(), bx2.y2()))
+ return false;
+
+ // touches
+ return true;
+ }
+
+ // bx1 may touches its bottom wall in bx2 top wall
+ // or bx1 may touches its top wall in bx2 bottom wall
+ if(TeGeometryAlgorithmsPrecision::IsEqual(bx1.y1(), bx2.y2()) || TeGeometryAlgorithmsPrecision::IsEqual(bx1.y2(), bx2.y1()))
+ {
+ // bx1 is left of bx2
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.x1(), bx1.x2()))
+ return false;
+
+ // bx1 is right of bx2
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.x1(), bx2.x2()))
+ return false;
+
+ // touches
+ return true;
+ }
+
+ // doesn't touches
+ return false;
+}
+
+bool TeTouches(const TeCell& c1, const TeCell& c2)
+{
+ return TeTouches(c1.box(), c2.box());
+}
+
+bool TeTouches(const TeLine2D& line, const TeCell& cell)
+{
+ return TeTouches(line, TeMakePolygon(cell.box()));
+}
+
+bool TeTouches(const TeCell& c1, const TePolygon& poly)
+{
+ return TeTouches (poly, TeMakePolygon(c1.box()));
+}
+
+bool TeTouches(const TePoint& point,const TeCell& c1)
+{
+ return TeTouches(point.location(), TeMakePolygon(c1.box()));
+}
+
+
+// CROSSES
+bool TeCrosses(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+ if(TeDisjoint(redLine.box(), blueLine.box()))
+ return false;
+ else
+ return TeRelation(redLine, blueLine, TeCROSSES) == TeCROSSES;
+}
+
+bool TeCrosses(const TeLine2D& l, const TePolygon& pol)
+{
+ if(TeDisjointOrTouches(l.box(), pol.box()))
+ return false;
+ else
+ return TeRelation(l, pol) == TeCROSSES;
+}
+
+bool TeCrosses(const TeLine2D& l, const TeCell& cell)
+{
+ return TeCrosses(l, TeMakePolygon(cell.box()));
+}
+
+
+// WITHIN
+bool TeWithin(const TeCoord2D& c1, const TeCoord2D& c2)
+{
+ return TeEquals(c1, c2);
+}
+
+bool TeWithin(const TeCoord2D& c, const TeBox& b)
+{
+ // c to the right of b left wall AND c to the left of b right wall
+ // AND c below b top wall AND c above b bottom wall => then c is on b interior.
+ return (TeGeometryAlgorithmsPrecision::IsGreater(c.x(), b.x1()) && TeGeometryAlgorithmsPrecision::IsGreater(b.x2(), c.x()) && TeGeometryAlgorithmsPrecision::IsGreater(b.y2(), c.y()) && TeGeometryAlgorithmsPrecision::IsGreater(c.y(), b.y1()));
+}
+
+bool TeWithin(const TeCoord2D& c, const TeLine2D& l)
+{
+ return TeRelation(c, l) == TeINSIDE;
+}
+
+bool TeWithin(const TeCoord2D& c, const TePolygon& pol)
+{
+ return TeRelation(c, pol) == TeINSIDE;
+}
+
+bool TeWithin(const TePoint& p1, const TePoint& p2)
+{
+ return TeWithin(p1.location(), p2.location());
+}
+
+bool TeWithin(const TePoint& p, const TeLine2D& l)
+{
+ return TeWithin(p.location(), l);
+}
+
+bool TeWithin(const TePoint& p, const TePolygon& pol)
+{
+ return TeWithin(p.location(), pol);
+}
+
+bool TeWithin(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+ if(TeWithinOrCoveredByOrEquals(redLine.box(), blueLine.box()))
+ return TeRelation(redLine, blueLine, TeWITHIN) == TeWITHIN;
+ else
+ return false;
+}
+
+bool TeWithin(const TeLine2D& l, const TePolygon& pol)
+{
+ if(TeWithinOrCoveredByOrEquals(l.box(), pol.box()))
+ return TeRelation(l, pol) == TeWITHIN;
+
+
+ return false;
+}
+
+bool TeWithin(const TePolygon& redPol, const TePolygon& bluePol)
+{
+ if(TeWithinOrCoveredByOrEquals(redPol.box(), bluePol.box()))
+ return TeRelation(redPol, bluePol) == TeWITHIN;
+ else
+ return false;
+}
+
+bool TeWithin(const TeBox& bx1, const TeBox& bx2)
+{
+ // bx1 left wall is left of or on bx2 left wall
+ if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx2.x1(), bx1.x1()))
+ return false;
+
+ // bx1 right wall is right of or on bx2 right wall
+ if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx1.x2(), bx2.x2()))
+ return false;
+
+ // bx1 is below bx2 or on.
+ if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx2.y1(), bx1.y1()))
+ return false;
+
+ // bx1 is above bx2 or on
+ if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx1.y2(), bx2.y2()))
+ return false;
+
+ return true;
+}
+
+bool TeWithin(const TeCell& cell1, const TeCell& cell2)
+{
+ return TeWithin(cell1.box(), cell2.box());
+}
+
+bool TeWithin(const TeLine2D& line, const TeCell& cell)
+{
+ return TeWithin(line, TeMakePolygon(cell.box()));
+}
+
+
+bool TeWithin(const TeCell& cell, const TePolygon& poly)
+{
+ return TeWithin(TeMakePolygon(cell.box()), poly);
+}
+
+bool TeWithin(const TePoint& point, const TeCell& cell)
+{
+ return TeWithin(point.location(), cell.box());
+}
+
+
+// OVERLAPS
+bool TeOverlaps(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+ if(TeDisjoint(redLine.box(), blueLine.box()))
+ return false;
+ else
+ return TeRelation(redLine, blueLine, TeOVERLAPS) == TeOVERLAPS;
+}
+
+bool TeOverlaps(const TePolygon& redPol, const TePolygon& bluePol)
+{
+ //if(TeDisjoint(redPol.box(), bluePol.box()))
+ if(TeDisjointOrTouches(redPol.box(), bluePol.box()))
+ return false;
+ else
+ return TeRelation(redPol, bluePol) == TeOVERLAPS;
+}
+
+bool TeOverlaps(const TeCell& cell1, const TeCell& cell2)
+{
+ return TeOverlaps(TeMakePolygon(cell1.box()), TeMakePolygon(cell2.box()));
+}
+
+bool TeOverlaps(const TeCell& cell, const TePolygon& poly)
+{
+ return TeOverlaps(TeMakePolygon(cell.box()), poly);
+}
+
+
+// COVERED BY
+bool TeCoveredBy(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+ if(TeWithinOrCoveredByOrEquals(redLine.box(), blueLine.box()))
+ return TeRelation(redLine, blueLine, TeCOVEREDBY) == TeCOVEREDBY;
+ else
+ return false;
+}
+
+bool TeCoveredBy(const TeLine2D& l, const TePolygon& pol)
+{
+ if(TeWithinOrCoveredByOrEquals(l.box(), pol.box()))
+ return TeRelation(l, pol) == TeCOVEREDBY;
+ else
+ return false;
+}
+
+bool TeCoveredBy(const TePolygon& redPol, const TePolygon& bluePol)
+{
+ if(TeWithinOrCoveredByOrEquals(redPol.box(), bluePol.box()))
+ return TeRelation(redPol, bluePol) == TeCOVEREDBY;
+ else
+ return false;
+}
+
+bool TeCoveredBy(const TeCell& cell1, const TeCell& cell2)
+{
+ return TeCoveredBy(TeMakePolygon(cell1.box()), TeMakePolygon(cell2.box()));
+}
+
+bool TeCoveredBy(const TePolygon& poly, const TeCell& cell)
+{
+ return TeCoveredBy(poly, TeMakePolygon(cell.box()));
+}
+
+bool TeCoveredBy(const TeLine2D& line, const TeCell& cell)
+{
+ return TeCoveredBy(line, TeMakePolygon(cell.box()));
+}
+
+//---------- Box Tests ----------//
+
+bool TeDisjointOrTouches(const TeBox& bx1, const TeBox& bx2)
+{
+ // B1 to the right of or on B2
+ if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx1.x1(), bx2.x2()))
+ return true;
+
+ // B1 to the left of or on B2
+ if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx2.x1(), bx1.x2()))
+ return true;
+
+ // B2 is above or on B1
+ if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx2.y1(), bx1.y2()))
+ return true;
+
+ // B2 is below or on B1
+ if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx1.y1(), bx2.y2()))
+ return true;
+
+ return false;
+}
+
+template<>
+bool TeWithinOrCoveredByOrEquals(const TeBox& bx1, const TeBox& bx2)
+{
+ // bx1 left wall is left of bx2 left wall
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.x1(), bx1.x1()))
+ return false;
+
+ // bx1 right wall is right of bx2 right wall
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.x2(), bx2.x2()))
+ return false;
+
+ // bx1 is below bx2
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.y1(), bx1.y1()))
+ return false;
+
+ // bx1 is above bx2
+ if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.y2(), bx2.y2()))
+ return false;
+
+ return true;
+}
+
+template<>
+bool TeWithinOrCoveredByOrEquals(const TeLine2D& line1, const TeLine2D& line2)
+{
+ if(TeWithinOrCoveredByOrEquals(line1.box(), line2.box()))
+ {
+ short r;
+ short rel = TeRelation(line1, line1, r);
+
+ if((rel&TeWITHIN) || (rel&TeCOVEREDBY) || (rel&TeEQUALS))
+ return true;
+
+ return false;
+ }
+ return false;
+}
+
+template<>
+bool TeWithinOrCoveredByOrEquals(const TeLine2D& line1, const TePolygon& pol)
+{
+ if(TeWithinOrCoveredByOrEquals(line1.box(), pol.box()))
+ {
+ short rel = TeRelation(line1, pol);
+
+ if((rel&TeWITHIN) || (rel&TeCOVEREDBY))
+ return true;
+
+ return false;
+ }
+ return false;
+}
+
+template<>
+bool TeWithinOrCoveredByOrEquals(const TePolygon& pol1, const TePolygon& pol2)
+{
+ if(TeWithinOrCoveredByOrEquals(pol1.box(), pol2.box()))
+ {
+ short rel = TeRelation(pol1, pol2);
+
+ if((rel&TeWITHIN) || (rel&TeCOVEREDBY) || (rel&TeEQUALS))
+ return true;
+
+ return false;
+ }
+ return false;
+}
+
+
+bool TeWithinOrTouches(const TeCoord2D& c, const TeCoord2D& c1, const TeCoord2D& c2)
+{
+ // c is to the right of c1 and c2
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c.x(), c1.x()) && TeGeometryAlgorithmsPrecision::IsGreater(c.x(), c2.x()))
+ return false;
+
+ // c is above c1 and c2
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c.y(), c1.y()) && TeGeometryAlgorithmsPrecision::IsGreater(c.y(), c2.y()))
+ return false;
+
+ // c is to the left of c1 and c2
+ if(TeGeometryAlgorithmsPrecision::IsSmaller(c.x(), c1.x()) && TeGeometryAlgorithmsPrecision::IsSmaller(c.x(), c2.x()))
+ return false;
+
+ // c is below c1 and c2
+ if(TeGeometryAlgorithmsPrecision::IsSmaller(c.y(), c1.y()) && TeGeometryAlgorithmsPrecision::IsSmaller(c.y(), c2.y()))
+ return false;
+
+ return true;
+}
+
+
+//---------- Intersection Functions ----------//
+
+bool TeIntersection(const TeBox& bx1, const TeBox& bx2, TeBox& bout)
+{
+ if(TeDisjoint(bx1, bx2))
+ return false;
+
+ double x1 = MAX(bx1.x1(),bx2.x1());
+ double x2 = MIN(bx1.x2(),bx2.x2());
+ double y1 = MAX(bx1.y1(),bx2.y1());
+ double y2 = MIN(bx1.y2(),bx2.y2());
+
+ bout = TeBox(x1, y1, x2, y2);
+
+ return true;
+}
+
+TeCoordPairVect TeGetIntersections(const TePolygon &poly, const double& y)
+{
+ TeCoordPairVect Segments;
+ vector<double> crossList;
+ unsigned int nholes = poly.size();
+
+ //for each ring of the polygon
+ for (unsigned int count=0; count<nholes; count++ )
+ {
+ TeLinearRing coords = poly[count];
+ for (unsigned int j=0; j < (coords.size() - 1); j++ )
+ {
+ TeCoord2D coord0 = coords[j];
+ TeCoord2D coord1 = coords[j+1];
+
+ bool yflag0 = ( coord0.y() > y );
+ bool yflag1 = ( coord1.y() > y );
+
+ if ( yflag0 != yflag1 )
+ {
+ // line crosses ring horizontally
+ double slope = ( coord1.x() - coord0.x() ) / ( coord1.y() - coord0.y());
+ double xcross = ( y - coord0.y() )* slope + coord0.x();
+ crossList.push_back (xcross);
+ }
+ else if((coord0.y()==y) && (coord1.y()!=y))
+ {
+ crossList.push_back(coord0.x());
+ }
+ else if((coord0.y()!=y) && (coord1.y()==y))
+ {
+ crossList.push_back(coord1.x());
+ }
+ }
+ }
+
+ // Sort the x-intersections
+ sort (crossList.begin(), crossList.end());
+
+ vector<double>::iterator it = crossList.begin();
+
+ while ( it != crossList.end() )
+ {
+ TeCoordPair cp;
+
+ cp.pt1 = TeCoord2D ( (*it), y);
+ ++it;
+ if ( it == crossList.end() ) break;
+
+ cp.pt2 = TeCoord2D ( (*it), y);
+ ++it;
+
+ Segments.push_back ( cp );
+ }
+
+ return Segments;
+}
+
+
+//---------- Union Operators ----------//
+
+TeBox TeUnion(const TeBox& bx1, const TeBox& bx2)
+{
+ double x1 = MIN(bx1.x1(), bx2.x1());
+ double y1 = MIN(bx1.y1(), bx2.y1());
+
+ double x2 = MAX(bx1.x2(), bx2.x2());
+ double y2 = MAX(bx1.y2(), bx2.y2());
+
+ return TeBox(x1, y1, x2, y2);
+}
+
+
+//---------- Localization Functions ----------//
+
+bool TePointInPoly(const TeCoord2D& c, const TeLinearRing& r)
+{
+ if(r.size() < 4)
+ return false;
+
+ register double ty, tx;
+
+ register const unsigned int nVertices = r.size();
+
+ register bool inside_flag = false;
+
+ register int j, yflag0, yflag1;
+
+ TeLinearRing::iterator vtx0, vtx1;
+
+ tx = c.x();
+ ty = c.y();
+
+ vtx0 = r.end() - 2;
+
+ yflag0 = (vtx0->y() >= ty);
+
+ vtx1 = r.begin();
+
+ for(j = nVertices; --j; )
+ {
+ yflag1 = (vtx1->y() >= ty);
+
+ if(yflag0 != yflag1)
+ {
+ if(((vtx1->y() - ty) * (vtx0->x() - vtx1->x()) >=
+ (vtx1->x() - tx) * (vtx0->y() - vtx1->y())) == yflag1)
+ {
+ inside_flag = !inside_flag ;
+ }
+ }
+
+ yflag0 = yflag1 ;
+ vtx0 = vtx1 ;
+ vtx1++;
+ }
+
+ return inside_flag;
+}
+
+bool TeIsOnSegment(const TeCoord2D& c, const TeCoord2D& c1, const TeCoord2D& c2)
+{
+ if(TeWithinOrTouches(c, c1, c2))
+ {
+ bool aux = false;
+
+ return TeINTERSECTOR2::TeCCW(c1, c2, c, aux) == TeNOTURN;
+ }
+
+ return false;
+}
+
+bool TeIsOnLine(const TeCoord2D& c, const TeLine2D& l)
+{
+ if(l.size() < 2)
+ return false;
+
+ if(TeDisjoint(c, l.box()))
+ return false;
+
+ TeLine2D::iterator it = l.begin();
+
+ unsigned int nstep = l.size() - 1;
+
+ for(unsigned int i = 0; i < nstep; ++i)
+ {
+ if(TeIsOnSegment(c, *(it), *(it + 1)))
+ return true;
+
+ ++it;
+ }
+
+ return false;
+}
+
+bool TeLocateLineSegment (TeCoord2D& pin, TeLine2D& line, int& segment, double /*tol*/)
+{
+ if (line.size() < 2)
+ return false;
+
+ TeCoord2D pout;
+
+ segment = 0;
+ double min_dist = TeMinimumDistance(line[0], line[1], pin, pout);
+
+ for (unsigned int i = 2; i < line.size(); i++)
+ {
+ double dist;
+ if ((dist = TeMinimumDistance (line[i-1],line[i], pin, pout)) < min_dist)
+ {
+ min_dist = dist;
+ segment = i - 1;
+ }
+ }
+
+ return true;
+}
+
+
+//---------- �rea Functions ----------//
+
+template<> double TeGeometryArea(const TePolygon& p)
+{
+ if(p.size() > 0)
+ {
+ TePolygon::iterator it = p.begin();
+
+ double area = fabs(Te2Area(*it));
+
+ ++it;
+
+ // subtract inner rings area.
+ while(it != p.end())
+ {
+ area -= fabs(Te2Area(*it));
+ ++it;
+ }
+
+ return (area / 2.0);
+ }
+
+ return 0.0;
+}
+
+template<> double TeGeometryArea(const TePolygonSet& ps)
+{
+ TePolygonSet::iterator it = ps.begin();
+
+ double area = 0.0;
+
+ while(it != ps.end())
+ {
+ area += TeGeometryArea(*it);
+ ++it;
+ }
+
+ return (area);
+}
+
+template<> double TeGeometryArea(const TeBox& b)
+{
+ return ((b.x2() - b.x1()) * (b.y2() - b.y1()));
+}
+
+//---------- ConvexHull ----------//
+
+//! If we have the two end point equals, so we remove it.
+void removeDuplicatedCoords(vector<TeCoord2D>& coordSet)
+{
+ if(coordSet[0] == coordSet[coordSet.size() - 1])
+ coordSet.erase(coordSet.end() - 1);
+
+ return;
+}
+
+// Return a linear ring that is the convex hull of a given list of coords
+TePolygon ConvexHull(vector<TeCoord2D>& coordSet)
+{
+ // sorting the coords
+ sort(coordSet.begin(), coordSet.end(), xOrder<TeCoord2D>());
+
+ register unsigned int i = 0;
+ register unsigned int n = coordSet.size();
+
+ TeLine2D upperHull;
+ TeLine2D lowerHull;
+
+ lowerHull.add(coordSet[0]);
+ lowerHull.add(coordSet[1]);
+
+ unsigned int count = 2;
+
+ bool aux = false;
+
+ for(i = 2; i < n; ++i)
+ {
+ lowerHull.add(coordSet[i]);
+
+ ++count;
+
+ while(count > 2 && TeINTERSECTOR2::TeCCW(lowerHull[count - 3], lowerHull[count - 2], lowerHull[count - 1], aux) <= TeNOTURN)
+ {
+ lowerHull.erase(count - 2);
+ --count;
+ }
+ }
+
+ upperHull.add(coordSet[n - 1]);
+ upperHull.add(coordSet[n - 2]);
+
+ count = 2;
+
+ for(i = n - 2; i > 0; --i)
+ {
+ upperHull.add(coordSet[i - 1]);
+ ++count;
+
+ while(count > 2 && TeINTERSECTOR2::TeCCW(upperHull[count - 3], upperHull[count - 2], upperHull[count - 1], aux) <= TeNOTURN)
+ {
+ upperHull.erase(count - 2);
+ --count;
+ }
+ }
+
+
+ upperHull.erase(0);
+ upperHull.erase(count - 1);
+
+ lowerHull.copyElements(upperHull);
+ lowerHull.add(lowerHull[0]);
+
+ TeLinearRing aux_ring(lowerHull);
+ TePolygon p;
+ p.add(aux_ring);
+ return p;
+}
+
+template<class T> TePolygon TeConvexHull(const T& coordSet)
+{
+ // creates an auxiliary line with the points of the ring
+ vector<TeCoord2D> aux;
+
+ typename T::iterator it = coordSet.begin();
+
+ while(it != coordSet.end())
+ {
+ aux.push_back(*it);
+ ++it;
+ }
+
+ // removes duplicated coords from structs like ring
+ removeDuplicatedCoords(aux);
+
+ return ConvexHull(aux);
+}
+
+template<> TePolygon TeConvexHull(const TePolygon& p)
+{
+ vector<TeCoord2D> coords;
+ back_insert_iterator<vector<TeCoord2D> > it(coords);
+ // Copy the first ring of each polygon without the last point (that is equals to the first).
+
+ copy(p[0].begin(), p[0].end() - 1, it);
+
+ return ConvexHull(coords);
+}
+
+template<> TePolygon TeConvexHull(const TePolygonSet& ps)
+{
+ vector<TeCoord2D> coords;
+ back_insert_iterator<vector<TeCoord2D> > it(coords);
+ // Copy the first ring of each polygon without the last point (that is equals to the first).
+
+ TePolygonSet::iterator it_ps = ps.begin();
+ while(it_ps != ps.end())
+ {
+ TeLinearRing r = (*it_ps)[0];
+ copy(r.begin(), r.end() - 1, it);
+ ++it_ps;
+ }
+
+ return ConvexHull(coords);
+}
+
+template<> TePolygon TeConvexHull(const TePointSet& ps)
+{
+ vector<TeCoord2D> coords;
+ // Copy the first ring of each polygon without the last point (that is equals to the first).
+
+ TePointSet::iterator itr = ps.begin();
+
+ while(itr != ps.end())
+ {
+ coords.push_back(itr->location());
+
+ ++itr;
+ }
+
+ return ConvexHull(coords);
+}
+
+//---------- Utilities Functions ----------//
+
+
+
+//---------- Validation Functions ----------//
+
+bool TeIsConvex(const TeLinearRing& ring)
+{
+ bool aux = false;
+
+ short orientation = TeINTERSECTOR2::TeCCW(*(ring.end() - 2), ring[0], ring[1], aux);
+
+ const unsigned int nStep = ring.size() - 1;
+
+ for(unsigned int i = 1; i < nStep; ++i)
+ {
+ short this_orientation = TeINTERSECTOR2::TeCCW(ring[i-1], ring[i], ring[i+1], aux);
+
+ if(this_orientation == TeNOTURN)
+ continue;
+
+ if((orientation != TeNOTURN) && (orientation != this_orientation))
+ return false;
+
+ orientation = this_orientation;
+ }
+
+ return true;
+}
+
+short TeOrientation(const TeLinearRing& r)
+{
+ double area = Te2Area(r);
+
+ if(area > 0.0)
+ return TeCOUNTERCLOCKWISE;
+
+ if(area < 0.0)
+ return TeCLOCKWISE;
+
+ return TeNOTURN;
+}
+
+void TeGetMiddlePoint(const TeCoord2D &first, const TeCoord2D &last, TeCoord2D &middle)
+{
+ double lenght,parts,curlenght,incx,incy,
+ deltax,deltay,dx,dy;
+ short i,nparts;
+
+ lenght = TeDistance(first,last);
+ if(lenght == 0.)
+ {
+ middle = first;
+ return;
+ }
+
+ nparts = 2;
+ parts = lenght/2.;
+// verify segment orientation
+ if(first.x() < last.x())
+ incx = 1.;
+ else
+ incx = -1.;
+
+ if(first.y() < last.y())
+ incy = 1.;
+ else
+ incy = -1.;
+
+ curlenght = 0.;
+ deltax = fabs(first.x()-last.x());
+ deltay = fabs(first.y()-last.y());
+ for(i=0;i<(nparts-1);i++)
+ {
+ curlenght = curlenght + parts;
+ // vertical segment
+ if(first.x() == last.x())
+ {
+ middle = TeCoord2D(first.x(),first.y()+(curlenght*incy));
+ continue;
+ }
+
+ // horizontal segment
+ if(first.y() == last.y())
+ {
+ middle = TeCoord2D(first.x()+(curlenght*incx),first.y());
+ continue;
+ }
+
+ // inclined segment
+
+ // calculating X coordinate
+ dx = curlenght*deltax/lenght;
+
+ // calculating Y coordinate
+ dy = curlenght*deltay/lenght;
+ middle = TeCoord2D(first.x()+(dx*incx),first.y()+(dy*incy));
+ }
+}
+
+//---------- Metric Functions ----------//
+
+double TeDistance(const TeCoord2D& c1, const TeCoord2D& c2)
+{
+ return sqrt(((c2.x() - c1.x()) * (c2.x() - c1.x())) + ((c2.y()-c1.y()) * (c2.y() - c1.y())));
+}
+
+double TeLength(const TeLine2D& l)
+{
+ double len = 0.0;
+
+ unsigned int nStep = l.size() - 1;
+
+ for(unsigned int i = 0 ; i < nStep; ++i)
+ len += TeDistance(l[i], l[i+1]);
+
+ return len;
+}
+
+double TePerpendicularDistance(const TeCoord2D& first, const TeCoord2D& last, const TeCoord2D& pin, TeCoord2D &pinter)
+{
+ double d12,xmin,ymin;
+
+ double xi = first.x();
+ double xf = last.x();
+ double yi = first.y();
+ double yf = last.y();
+ double x = pin.x();
+ double y = pin.y();
+
+ double dx = xf - xi;
+ double dy = yf - yi;
+ double a2 = (y - yi) * dx - (x - xi)*dy;
+
+ if(dx==0. && dy==0.)
+ {
+ d12= sqrt(((x - xi) * (x - xi)) + ((y - yi) * (y - yi)));
+ d12 *= d12;
+ }
+ else
+ d12= a2 * a2 / (dx * dx + dy * dy);
+
+ if (dx == 0.)
+ {
+ xmin = xi;
+ ymin = y;
+ }
+ else if (dy == 0.)
+ {
+ xmin = x;
+ ymin = yi;
+ }
+ else
+ {
+ double alfa = dy / dx;
+ xmin = (x + alfa * (y - yi) + alfa * alfa * xi) / (1. + alfa * alfa);
+ ymin = (x - xmin) / alfa + y;
+ }
+
+ pinter = TeCoord2D(xmin, ymin);
+ return (sqrt(d12));
+}
+
+double TeMinimumDistance (const TeCoord2D& first, const TeCoord2D& last, const TeCoord2D& pin, TeCoord2D& pout, double /*tol*/)
+{
+ TeCoord2D pinter;
+ TeBox sbox(MIN(first.x(),last.x()),
+ MIN(first.y(),last.y()),
+ MAX(first.x(),last.x()),
+ MAX(first.y(),last.y()));
+
+ double d = TePerpendicularDistance (first, last, pin, pinter);
+ double dmin = TeMAXFLOAT;
+
+ // Perpendicular minimum distance point was found.
+ if (TeWithin (pinter, sbox))
+ {
+ dmin = d;
+ pout = pinter;
+ }
+ else
+ {
+ // Perpendicular minimum distance point could not be found.
+ // The segment vertices distances will analyzed
+ double d1 = TeDistance (first, pin);
+ double d2 = TeDistance (last, pin);
+ if (d1 <= d2)
+ {
+ dmin = d1;
+ pout = first;
+ }
+ else if (d2 < dmin)
+ {
+ dmin = d2;
+ pout = last;
+ }
+ }
+
+ return dmin;
+}
+
+
+//---------- Relation Functions ----------//
+
+short TeRelation(const TeCoord2D& c, const TeLine2D& l)
+{
+ if(TeEquals(c, l[0]) || TeEquals(c, l[l.size() - 1]))
+ {
+ // Ring doesn't have bundaries, only interiors.
+ if(l.isRing())
+ return TeINSIDE;
+
+ return TeBOUNDARY;
+ }
+
+ if(TeIsOnLine(c, l))
+ return TeINSIDE;
+
+ return TeOUTSIDE;
+}
+
+short TeRelation(const TeCoord2D& c, const TeLinearRing& r)
+{
+ if(TeDisjoint(c, r.box()))
+ return TeOUTSIDE;
+
+ if(TeIsOnLine(c, r))
+ return TeBOUNDARY;
+
+ if(TePointInPoly(c, r))
+ return TeINSIDE;
+ else
+ return TeOUTSIDE;
+}
+
+short TeRelation(const TeCoord2D& c, const TePolygon& pol)
+{
+ short rel = TeRelation(c, pol[0]);
+
+ if(rel != TeINSIDE)
+ return rel;
+ else // If point is inside exterior ring
+ {
+ unsigned int size = pol.size();
+
+ for(unsigned int i = 1; i < size; ++i)
+ {
+ rel = TeRelation(c, pol[i]);
+
+ switch(rel)
+ {
+ // If point is inside a hole so it is on polygon's outside.
+ case TeINSIDE : return TeOUTSIDE;
+
+ // If point is on boundary so it is on polygon's boundary.
+ case TeBOUNDARY : return TeBOUNDARY;
+ }
+ }
+ }
+
+ // If the point is inside exterior ring and is not on one of the holes so it is in polygon's interior.
+ return TeINSIDE;
+}
+
+short TeRelation(const TePoint& p, const TePolygon& pol)
+{
+ return (TeRelation(p.location(), pol));
+}
+
+short TeRelation(const TeCoord2D& c, const TePolygonSet& pSet)
+{
+ if(TeDisjoint(c, pSet.box()))
+ return TeOUTSIDE;
+
+ unsigned int size = pSet.size();
+
+ for(unsigned int i = 0; i < size; ++i)
+ {
+ short rel = TeRelation(c, pSet[i]);
+
+ if(rel & TeINSIDE)
+ return TeINSIDE;
+
+ if(rel & TeBOUNDARY)
+ return TeBOUNDARY;
+ }
+
+ return TeOUTSIDE;
+}
+
+short TeRelation(const TeLine2D& lRed, const TeLine2D& lBlue, const short& relation)
+{
+ TeINTERSECTOR2::TeVectorBoundaryIP report;
+
+ if(TeINTERSECTOR2::TeSafeIntersections(lRed, lBlue, report))
+ {
+ short rel = Relation(lRed, lBlue, report, relation);
+
+ // Stop to check, because touches can't occur anymore
+ if((relation == TeTOUCHES || relation == TeCROSSES) && rel != relation)
+ return TeUNDEFINEDREL;
+
+ if(rel != TeUNDEFINEDREL)
+ return rel;
+
+ TeINTERSECTOR2::TeVectorBoundaryIP::iterator it = report.begin();
+ TeINTERSECTOR2::TeVectorBoundaryIP::iterator it_end = report.end();
+
+ for(unsigned int i = 0; i < report.size(); ++i)
+ {
+ swap(report[i].redPartNum_, report[i].bluePartNum_);
+ swap(report[i].redSegNum_, report[i].blueSegNum_);
+ }
+
+ rel = Relation(lBlue, lRed, report, relation);
+
+ if(rel != TeUNDEFINEDREL)
+ return ConverseRelation(rel);
+ else
+ return TeOVERLAPS;
+ }
+ else
+ return TeDISJOINT;
+}
+
+short TeRelation(const TeLine2D& line, const TePolygon& pol)
+{
+ short rel = TopologicRelation(line, pol[0]);
+
+ if(rel & TeTOUCHES || rel & TeCROSSES || rel & TeDISJOINT)
+ return rel;
+
+ // If relation is WITHIN or COVERED BY we need to test inner rings.
+ register unsigned int i = 1;
+ register unsigned int nRings = pol.size();
+
+ for(; i < nRings; ++i)
+ {
+ short rel_aux = TopologicRelation(line, pol[i]);
+
+ switch(rel_aux)
+ {
+ case TeCROSSES : return TeCROSSES;
+
+ case TeCOVEREDBY : return TeTOUCHES;
+
+ case TeTOUCHES : rel = TeCOVEREDBY;
+ break; // Needs to check other holes.
+
+ case TeWITHIN : return TeDISJOINT;
+
+ case TeDISJOINT : break; // Keeps rel and check other inner rings
+ }
+ }
+
+ return rel;
+}
+
+short TeRelation(const TePolygon& pRed, const TePolygon& pBlue)
+{
+
+ short rel = TopologicRelation(pRed[0], pBlue[0]);
+
+ if(rel & TeTOUCHES || rel & TeOVERLAPS || rel & TeDISJOINT)
+ return rel;
+
+
+ short rel_external_ring = TeUNDEFINEDREL;
+
+ bool converse = false;
+
+ vector<TeLinearRing> innerRingsToTest;
+
+ switch(rel)
+ {
+ case TeWITHIN :
+ case TeCOVEREDBY :
+ // if pBlue has inner rings.
+ if(pBlue.size() > 1)
+ {
+ rel_external_ring = LookAtInnerRings(pRed[0], pBlue, innerRingsToTest, rel);
+ }
+ else // else if it hasn't
+ {
+ if(pRed.size() > 1) // but pRed has
+ return TeOVERLAPS; // they overlaps
+ else
+ return rel;
+ }
+ break;
+
+ case TeCONTAINS :
+ case TeCOVERS :
+ // if pRed has inner rings.
+ if(pRed.size() > 1)
+ {
+ rel_external_ring = LookAtInnerRings(pBlue[0], pRed, innerRingsToTest, rel);
+ }
+ else // else if it hasn't
+ {
+ if(pBlue.size() > 1) // but pBlue has
+ return TeOVERLAPS; // they overlaps
+ else
+ return rel;
+ }
+
+ converse = true;
+ break;
+
+ case TeEQUALS :
+ if(pRed.size() != pBlue.size())
+ return TeOVERLAPS;
+
+ if(pRed.size() == 1 && pBlue.size() == 1)
+ return rel;
+
+ for(unsigned int k = 1; k < pBlue.size(); k++)
+ innerRingsToTest.push_back(pBlue[k]);
+
+ rel_external_ring = TeUNDEFINEDREL;
+ }
+
+ if(rel_external_ring != TeUNDEFINEDREL)
+ return rel_external_ring;
+
+ // If we are here, so we need to test
+ if(converse) // COVERS or CONTAINS
+ {
+ if(pBlue.size() == 1 && innerRingsToTest.size() == 0)
+ return rel;
+
+ // The result may be: overlap or equals.
+ short rel_aux = TestInnerRings(pBlue, innerRingsToTest);
+
+ if(rel_aux & TeOVERLAPS)
+ return TeOVERLAPS;
+
+ if(rel_aux & TeCOVERS)
+ return TeCOVERS;
+
+ if(rel_aux & TeCONTAINS)
+ return TeCONTAINS;
+ }
+ else // EQUALS, COVERED BY or WITHIN
+ {
+ if(pRed.size() == 1 && innerRingsToTest.size() == 0)
+ return rel;
+
+ short rel_aux = TestInnerRings(pRed, innerRingsToTest);
+
+ if(rel_aux & TeOVERLAPS)
+ return TeOVERLAPS;
+
+ if((rel_aux == TeEQUALS) && (rel == TeEQUALS))
+ return TeEQUALS;
+
+ if((rel_aux & TeCOVERS) || (rel_aux & TeEQUALS))
+ return TeCOVEREDBY;
+
+ if(rel_aux & TeCONTAINS)
+ {
+ if((rel == TeEQUALS) || (rel == TeCOVEREDBY))
+ return TeCOVEREDBY;
+
+ return TeWITHIN;
+ }
+ }
+
+ return TeUNDEFINEDREL;
+}
+
+
+//---------- Generate Geometry Functions ----------//
+
+TePolygon TeMakePolygon(const TeBox& b)
+{
+ TeLine2D l;
+
+ l.add(b.lowerLeft());
+ l.add(TeCoord2D(b.x2(), b.y1()));
+ l.add(b.upperRight());
+ l.add(TeCoord2D(b.x1(), b.y2()));
+ l.add(b.lowerLeft());
+ l.setBox(b);
+
+ TePolygon p;
+ p.add(TeLinearRing(l));
+ p.setBox(b);
+
+ return p;
+}
+
+TeLinearRing TeSimpleClosedPath(const TePointSet& pSet)
+{
+ TeLine2D l;
+
+ for(register unsigned int i = 0; i < pSet.size(); ++i)
+ l.add(pSet[i].location());
+
+ ThetaOrder tr(pSet[0].location());
+
+ sort(l.begin(), l.end(), tr);
+
+ l.add(l[0]);
+
+ return TeLinearRing(l);
+}
+
+
+//---------- Nearest ----------//
+
+bool TeNearest ( TeCoord2D& pt, TeNodeSet& ns , int& k, const double& tol)
+{
+ double d,dmin = TeMAXFLOAT;
+ bool flag = false;
+
+ k = -1;
+ for (unsigned int i=0; i < ns.size() ; i++)
+ {
+ d = TeDistance (pt, ns[i].location());
+ if ( d <= tol && d < dmin)
+ {
+ dmin = d;
+ k = i;
+ flag = true;
+ }
+ }
+ return flag;
+}
+
+bool TeNearest ( TeCoord2D& pt, TePointSet& ps , int& k, const double& tol)
+{
+ double d,dmin = TeMAXFLOAT;
+ bool flag = false;
+
+ k = -1;
+ for (unsigned int i=0; i < ps.size() ; i++)
+ {
+ d = TeDistance (pt, ps[i].location());
+ if ( d <= tol && d < dmin)
+ {
+ dmin = d;
+ k = i;
+ flag = true;
+ }
+ }
+ return flag;
+}
+
+bool TeNearest ( TeCoord2D& pt, TeTextSet& ts , int& k, const double& tol)
+{
+ double d,dmin = TeMAXFLOAT;
+ bool flag = false;
+
+ k = -1;
+ for (unsigned int i=0; i < ts.size() ; i++)
+ {
+ d = TeDistance (pt, ts[i].location());
+ if ( d <= tol && d < dmin)
+ {
+ dmin = d;
+ k = i;
+ flag = true;
+ }
+ }
+ return flag;
+}
+
+bool TeNearest(TeCoord2D& pt, TeLineSet& ls , int& k, TeCoord2D& pi, const double& tol)
+{
+ double d,dmin = TeMAXFLOAT;
+ bool flag = false;
+
+ k = -1;
+ for (unsigned int i=0 ; i<ls.size() ; i++)
+ {
+ TeLine2D line = ls[i];
+ TeBox lb = line.box();
+ TeBox box(lb.x1()-tol,lb.y1()-tol,lb.x2()+tol,lb.y2()+tol);
+ if (TeIntersects(pt, box))
+ {
+ for (unsigned int j=0 ; j<line.size()-1 ; j++)
+ {
+ TeCoord2D pinter;
+ TeBox sbox(MIN(line[j].x(),line[j+1].x()),
+ MIN(line[j].y(),line[j+1].y()),
+ MAX(line[j].x(),line[j+1].x()),
+ MAX(line[j].y(),line[j+1].y()));
+ d = TePerpendicularDistance (line[j],line[j+1],pt, pinter);
+ if((d <= tol) && (d < dmin) && TeIntersects(pinter, sbox))
+ {
+ dmin = d;
+ k = i;
+ pi = pinter;
+ flag = true;
+ }
+ }
+ }
+ }
+ return flag;
+}
+
+
+bool TeNearest (TeCoord2D& pt,TeLineSet& ls, int& lindex, TeCoord2D& pout, double& dmin, const double& tol)
+{
+ bool flag = false;
+ TeCoord2D pinter;
+
+ dmin = TeMAXFLOAT;
+ lindex = -1;
+
+ for (unsigned int i = 0 ; i < ls.size(); i++)
+ {
+ TeLine2D line = ls[i];
+
+ for (unsigned int j = 0 ; j < line.size() - 1 ; j++)
+ {
+ double d = TeMinimumDistance (line[j], line[j + 1], pt, pinter, tol);
+ if (d < dmin)
+ {
+ lindex = i;
+ pout = pinter;
+ dmin = d;
+ flag = true;
+ }
+ }
+ }
+ return flag;
+}
+
+bool TeNearest(TeCoord2D& pt, TePolygonSet& ps , int& k, const double& /*tol*/)
+{
+ bool flag = false;
+
+ k = -1;
+
+ TePoint ptaux(pt);
+
+ for (unsigned int i=0; i < ps.size() ; i++)
+ {
+ if (TeIntersects(ptaux,ps[i]))
+ {
+ k = i;
+ flag = true;
+ }
+ }
+ return flag;
+}
+
+bool TeNearestByPoints ( TeCoord2D& pt, TeLineSet& ls , int& k, double& dist, const double& tol)
+{
+ double d,dmin = TeMAXFLOAT;
+ bool flag = false;
+
+ k = -1;
+ for (unsigned int i=0 ; i<ls.size() ; i++)
+ {
+ TeLine2D line = ls[i];
+ TeBox lb = line.box();
+ TeBox box(lb.x1()-tol,lb.y1()-tol,lb.x2()+tol,lb.y2()+tol);
+ if (TeIntersects (pt,box))
+ {
+ for (unsigned int j=0 ; j<line.size()-1 ; j++)
+ {
+ d = TeDistance (line[j],pt);
+ if ( d <= tol && d < dmin )
+ {
+ dmin = d;
+ dist = dmin;
+ k = i;
+ flag = true;
+ }
+ }
+ }
+ }
+ return flag;
+}
+
+
+//---------- TIN ----------//
+
+bool TeFindTriangleCenter(const TeCoord2D& vert0, const TeCoord2D& vert1, const TeCoord2D& vert2, TeCoord2D& pc )
+{
+ if ( vert0 == vert1 || vert0 == vert2 )
+ return false; // pontos sao iguais-> retorna
+
+ // calcula o coeficiente angular perpendicular a reta 1
+ bool perpvert1 = false, // perpendicular vertical ao segmento 1
+ perpvert2 = false; // perpendicular vertical ao segmento 2
+ double m1 = 10., m2 =10.; // normais aos segmentos 1 e 2
+ double prcsion = 1.0e-10; // Precision to be used for equal comparison
+ double oldPrcsion = TePrecision::instance().precision();
+ TePrecision::instance().setPrecision(prcsion);
+
+ if ( TeCoord2D( 0., vert0.y() ) == TeCoord2D( 0., vert1.y() ) )
+ perpvert1 = true;
+ else
+ m1 = -(vert1.x() - vert0.x()) / (vert1.y() - vert0.y());
+
+// calcula o coeficiente angular da perpendicular a reta 2
+ if ( TeCoord2D( 0., vert1.y() ) == TeCoord2D( 0., vert2.y() ) )
+ perpvert2 = true;
+ else
+ m2 = -(vert2.x() - vert1.x()) / (vert2.y() - vert1.y());
+
+ TePrecision::instance().setPrecision(oldPrcsion);
+// Caso as retas sejam coincidentes, uma circunferencia
+// nao eh definida
+ if (fabs( m1 - m2 ) > prcsion)
+ {
+
+// passou pelos testes: os pontos definem uma circunferencia
+// calculo do ponto medio do segmento ponto0-ponto1 (segmento 1)
+ TeCoord2D ptm1 = vert0;
+ ptm1 += vert1;
+ ptm1.scale ( 0.5, 0.5);
+
+// calculo do ponto medio do segmento ponto1-ponto2 (segmento 2)
+ TeCoord2D ptm2 = vert1;
+ ptm2 += vert2;
+ ptm2.scale ( 0.5, 0.5);
+
+// calculo das coordenadas do centro: ponto de interseccao das mediatrizes
+// dos segmentos ponto0-ponto1 e ponto1-ponto2
+ if (perpvert1 == true)
+ {
+ pc.x( ptm1.x() );
+ pc.y( ptm2.y() + m2 * ( pc.x() - ptm2.x() ) );
+ }
+ else if (perpvert2 == true)
+ {
+ pc.x( ptm2.x() );
+ pc.y( ptm1.y() + m1 * ( pc.x() - ptm1.x() ) );
+ }
+ else
+ {
+ pc.x( (m1*ptm1.x() - m2*ptm2.x() - ptm1.y() + ptm2.y())/(m1-m2) );
+ pc.y( ptm1.y() + m1 * ( pc.x() - ptm1.x() ) );
+ }
+ return true;
+ }
+ return false;
+}
+
+bool TeLineSimplify(TeLine2D& ptlist, double snap, double maxdist)
+{
+// If snap is zero, don't worry
+ if (snap == 0.0)
+ return true;
+// If line is too short do nothing
+ int npts = ptlist.size();
+ if ( npts <= 3 )
+ return true;
+ int npte = npts;
+
+ double snap2 = maxdist*maxdist;
+ TeLine2D vxy (ptlist);
+
+// Check for islands before defining number of points to be used
+ int npt;
+ if ( ptlist.last() == vxy.first() )
+ npt = npte - 1;
+ else
+ npt = npte;
+ ptlist.clear();
+
+// initialize variables
+ int i = 0;
+ int numa = 0;
+ int numpf = npt - 1;
+
+// define anchor
+ TeCoord2D axy = vxy[numa];
+
+// define floating point
+ TeCoord2D pfxy = vxy[numpf];
+
+ while (numa < (npt-1))
+ {
+ bool retv (false);
+ double aa1 = 0.;
+ double a = 0.;
+ double b = 0.;
+// Compute coeficients of straight line y=ax+b
+ if (pfxy.x() == axy.x())
+ retv = true;
+ else
+ {
+ a = (pfxy.y() - axy.y())/(pfxy.x() - axy.x());
+ b = pfxy.y() - a * pfxy.x();
+ aa1 = sqrt(a * a + 1.);
+ }
+
+ double d = 0;
+ double dmax = 0;
+ int numdmax = numpf;
+
+ int k;
+ for (k = numa + 1; k <= numpf; k++)
+ {
+// Distance between point and line
+ if (retv)
+ d = fabs(axy.x() - vxy[k].x());
+ else
+ d = fabs(vxy[k].y() - a*vxy[k].x() - b)/aa1;
+
+ if (d > dmax)
+ {
+ dmax = d;
+ numdmax = k;
+ }
+ }
+
+ if (dmax <= snap)
+ {
+// Store selected point
+ if (i > (npt-1))
+ return false;
+ vxy[i++] = axy;
+
+ double axbx = pfxy.x()-axy.x();
+ double ayby = pfxy.y()-axy.y();
+ double dist2 = axbx*axbx + ayby*ayby;
+ if (dist2 > snap2)
+ {
+ for (k = numpf; k > numa+1; k--)
+ {
+ axbx = vxy[k].x()-axy.x();
+ ayby = vxy[k].y()-axy.y();
+ dist2 = axbx*axbx + ayby*ayby;
+ if (dist2 < snap2)
+ break;
+ }
+// Shift anchor
+ numa = k;
+ axy = vxy[k];
+ }
+ else
+ {
+// Shift anchor
+ numa = numpf;
+ axy = vxy[numpf];
+ }
+ numpf = npt - 1;
+ }
+ else
+ {
+// Shift floating point
+ numpf = numdmax;
+ }
+
+ pfxy = vxy[numpf];
+ }
+
+// Store results
+ vxy[i] = vxy[numa];
+ npts = i+1;
+
+ if ( vxy[i] == vxy[i-1] )
+ npts = i;
+
+ for (i = 0; i < npts; i++)
+ ptlist.add( vxy[i] );
+
+// Case islands
+ if (vxy[0] == vxy[npte-1])
+ ptlist.add( vxy[0] );
+
+ return true;
+}
+
+
+//---------- Curve ----------//
+
+/*! \fn void TeSwap(TePoint &p1, TePoint &p2)
+ \brief Swaps to points.
+ \param p1 The first point.
+ \param p2 The second point.
+*/
+void TeSwap(TePoint& p1, TePoint& p2)
+{
+ TePoint temp;
+
+ temp = p1;
+ p1 = p2;
+ p2 = temp;
+
+ return;
+}
+
+bool TeGetCenter(TePoint p1, TePoint p2, TePoint p3, TePoint& center)
+{
+ double x, y;
+ double ma=0., mb= 0.;
+ bool result = true;
+
+ //we don't want infinite slopes, or 0 slope for line 1, since we'll divide by "ma" below
+ if ((p1.location().x()==p2.location().x()) || (p1.location().y()==p2.location().y()))
+ TeSwap(p2,p3);
+
+ if (p2.location().x()==p3.location().x())
+ TeSwap(p1,p2);
+
+ if (p1.location().x()!=p2.location().x())
+ ma=(p2.location().y()-p1.location().y())/(p2.location().x()-p1.location().x());
+ else
+ result=false;
+
+ if (p2.location().x()!=p3.location().x())
+ mb=(p3.location().y()-p2.location().y())/(p3.location().x()-p2.location().x());
+ else
+ result=false;
+
+ if ((ma==0) && (mb==0))
+ result=false;
+
+ if (result)
+ {
+ x=(ma*mb*(p1.location().y()-p3.location().y())+mb*(p1.location().x()+p2.location().x())-ma*(p2.location().x()+p3.location().x()))/(2*(mb-ma));
+ y=-(x-(p1.location().x()+p2.location().x())/2)/ma + (p1.location().y()+p2.location().y())/2;
+
+ double w= x; //TeRound(x);
+ double z= y; //TeRound(y);
+ TeCoord2D coord(w,z);
+ center.add(coord);
+ }
+ return result;
+}
+
+double TeGetRadius(TePoint& p1, TePoint& p2, TePoint& p3)
+{
+ double s,a,b,c, result;
+ a=sqrt(pow(p1.location().x()-p2.location().x(),2)+pow(p1.location().y()-p2.location().y(),2)); //sqr: square of the param
+ b=sqrt(pow(p2.location().x()-p3.location().x(),2)+pow(p2.location().y()-p3.location().y(),2));
+ c=sqrt(pow(p3.location().x()-p1.location().x(),2)+pow(p3.location().y()-p1.location().y(),2));
+ s=(a+b+c)/2;
+ result=(a*b*c)/(4*sqrt(s*(s-a)*(s-b)*(s-c)));
+ return result;
+}
+
+bool TeGenerateArc(TePoint& p1, TePoint& p2, TePoint& p3, TeLine2D& arcOut, const short& NPoints)
+{
+ TePoint center;
+ double radius;
+
+ if(!TeGetCenter(p1, p2, p3, center))
+ return false;
+
+ radius = TeGetRadius(p1, p2, p3);
+
+ //calculate the distance between the points p1 and p3
+ double length = TeDistance(p1.location(),p3.location());
+
+ double val = length/(2*radius);
+ if(val>1)
+ return false;
+
+ //calculate the angle (in radians) between the segments (p1 - p3) in the circle center
+ //asin : arco seno
+ //http://mathforum.org/dr.math/faq/faq.circle.segment.html#7
+ double thetaR = 2 * asin(val);
+
+ //calculate the variation of the angle in radians for each point
+ double deltaR = thetaR/(NPoints+1);
+
+ //verify if is counterclockwise or clockwise
+ TeLine2D line;
+ line.add(p1.location());
+ line.add(p2.location());
+ line.add(p3.location());
+ line.add(p1.location());
+ TeLinearRing ring(line);
+
+ short orient = TeOrientation(ring);
+
+ //calculate the coseno e seno of the angle (beta) between the circle center (horizontal segment) and the first point
+ //http://mathforum.org/library/drmath/view/55327.html
+ double cosBeta = (p1.location().x()-center.location().x())/radius;
+ double sinBeta = (p1.location().y()-center.location().y())/radius;
+
+ //rela��es trigonom�tricas
+ //sin(x+y) = sin(x)cos(y) + cos(x)sin(y),
+ //cos(x+y) = cos(x)cos(y) - sin(x)sin(y),
+ //sin(x-y) = sin(x)cos(y) - cos(x)sin(y),
+ //cos(x-y) = cos(x)cos(y) + sin(x)sin(y),
+
+ arcOut.add(p1.location());
+ double angle = deltaR;
+ for (int i=0; i<(NPoints+1); i++)
+ {
+ double x,y;
+ if(orient==TeCOUNTERCLOCKWISE)
+ {
+ //c = h + r*cos(B+A),
+ //d = k + r*sin(B+A),
+ x = center.location().x() + radius * ((cosBeta*cos(angle))-(sinBeta*sin(angle))); //cos(beta+angle)
+ y = center.location().y() + radius * ((sinBeta*cos(angle))+(cosBeta*sin(angle))); //sin(beta+angle)
+ }
+ else if (orient==TeCLOCKWISE)
+ {
+ //c = h + r*cos(B-A),
+ //d = k + r*sin(B-A),
+ x = center.location().x() + radius * ((cosBeta*cos(angle))+(sinBeta*sin(angle))); //cos(beta-angle)
+ y = center.location().y() + radius * ((sinBeta*cos(angle))-(cosBeta*sin(angle))); //sin(beta-angle)
+ }
+
+ TeCoord2D coord(x,y);
+ arcOut.add(coord);
+ angle += deltaR;
+ }
+ arcOut.add(p3.location());
+ return true;
+}
+
+bool TeGenerateCircle(TePoint& center, const double& radius, TeLine2D& circle, const short& NPoints)
+{
+ //angle (in radians) of the circumference (2*Pi)
+ double thetaR = 2 * 3.14159;
+
+ //calculate the variation of the angle in radians for each point
+ double deltaR = thetaR/(NPoints+1);
+
+ //calculate a point P1 of the circumference
+ TePoint p1(center.location().x()+radius, center.location().y());
+
+ //calculate the coseno e seno of the angle (beta) between the center and the point P1
+ //http://mathforum.org/library/drmath/view/55327.html
+ double cosBeta = 1;
+ double sinBeta = 0;
+
+ //rela��es trigonom�tricas
+ //sin(x+y) = sin(x)cos(y) + cos(x)sin(y),
+ //cos(x+y) = cos(x)cos(y) - sin(x)sin(y),
+ //sin(x-y) = sin(x)cos(y) - cos(x)sin(y),
+ //cos(x-y) = cos(x)cos(y) + sin(x)sin(y),
+
+ circle.add(p1.location());
+ double angle = deltaR;
+ for (int i=0; i<(NPoints+1); i++)
+ {
+ double x,y;
+
+ //TeCOUNTERCLOCKWISE
+ //c = h + r*cos(B+A),
+ //d = k + r*sin(B+A),
+
+ x = center.location().x() + radius * ((cosBeta*cos(angle))-(sinBeta*sin(angle))); //cos(beta+angle)
+ y = center.location().y() + radius * ((sinBeta*cos(angle))+(cosBeta*sin(angle))); //sin(beta+angle)
+
+ TeCoord2D coord(x,y);
+ circle.add(coord);
+ angle += deltaR;
+ }
+ circle.add(p1.location());
+ return true;
+}
+
+double TeGetPrecision(TeProjection* proj)
+{
+ if(!proj)
+ return 0.000000001;
+
+ if(proj->units() == "Meters")
+ {
+ return 0.001;
+ }
+
+ return 0.000000001; // Lat/Long e NoProjection
+}
+
+
diff --git a/src/terralib/kernel/TeGeometryAlgorithms.h b/src/terralib/kernel/TeGeometryAlgorithms.h
new file mode 100644
index 0000000..92c06f0
--- /dev/null
+++ b/src/terralib/kernel/TeGeometryAlgorithms.h
@@ -0,0 +1,1024 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeGeometryAlgorithms.h
+ This file contains Algorithms for Topological Operations.
+*/
+
+/**
+ *@author Gilberto Ribeiro de Queiroz
+ */
+
+#ifndef __TERRALIB_INTERNAL_GEOMETRYALGORITHMS_H
+#define __TERRALIB_INTERNAL_GEOMETRYALGORITHMS_H
+
+#include "TeGeometry.h"
+
+#include "TePrecision.h"
+#include "TeProjection.h"
+
+//! Intersection coordinates of two segments.
+typedef vector<TeCoord2D> TeIntersCoordsVec;
+
+/** @defgroup GeometryAlgorithms Geometry Algorithms
+ * TerraLib geometry algorithms.
+ * @{
+ */
+/** @defgroup TopologicalOperators Topological Operators
+ * @ingroup GeometryAlgorithms
+ Functions that test topologival relation between two objects.
+ The topological operators are based on the intersection of interior, exterior and boundary of geometries:
+ \par ------------------------------------------------------------------------------------------------------------------
+ \par | TeGeometry | INTERIOR | BOUNDARY | EXTERIOR |
+ \par ------------------------------------------------------------------------------------------------------------------
+ \par | TePoint | The point itself | Empty | Everything except interior |
+ \par | TeLine2D | All points except the end points | The two end points | Everything except interior and boundary |
+ \par | TeLinearRing | All points | Empty | Everything except interior and boundary |
+ \par | TePolygon | Everything between the external | All rings | Everything except interior and boundary |
+ \par | | ring and the inner rings | | |
+ \par ------------------------------------------------------------------------------------------------------------------
+
+ \par We use:
+ - I: for Interior
+ - E: for Exterior
+ - B: for Boundary
+ - inter: Intersects
+ - ^: AND
+ - v: OR
+ - A = refer to two-dimensional geometries (TePolygon and TePolygonSet)
+ - L = refer to one-dimensional geometries (TeLine2D and TeLineSet)
+ - P = refer to 0-dimensional geometries (TePoint and TePointSet)
+ * @{
+ */
+
+/** @defgroup TeEquals Equals test
+ * @ingroup TopologicalOperators
+ * Check if one object is equal another object.
+ * Applies to: P/P, L/L and A/A.
+ * TeEquals(x, y) => (x inter y = x) ^ (y inter x = y)
+ * (B(x) inter I(y) = false) ^ (B(x) inter E(y) = false)
+ * @{
+*/
+
+//! If a specialized function is not used, returns false.
+template<class T1, class T2> inline bool TeEquals(const T1& /*o1*/, const T2& /*o2*/)
+{
+ return false;
+}
+
+//! Check if coordinate 1 and coordinate 2 are equal
+template<> bool TeEquals(const TeCoord2D& c1, const TeCoord2D& c2);
+
+//! Check if point 1 and point 2 are equal
+template<> bool TeEquals(const TePoint& p1, const TePoint& p2);
+
+//! Check if lineRed and lineBlue are equal
+template<> bool TeEquals(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if polygon red and polygon blue are equal
+template<> bool TeEquals(const TePolygon& redPol, const TePolygon& bluePol);
+
+//! Check if box 1 and box 2 are equal
+template<> bool TeEquals(const TeBox& bx1, const TeBox& bx2);
+
+//! Check if cell 1 and cell 2 are equal
+template<> bool TeEquals(const TeCell& cell1, const TeCell& cell2);
+/** @} */
+
+
+/** @defgroup TeDisjoint Disjoint test
+ * @ingroup TopologicalOperators
+ * Check if two objects are disjoint.
+ * Applies to all geometries.
+ * TeDisjoint(x, y) => (x inter y = false)
+ * (I(x) inter I(y) = false) ^ (I(x) inter B(y) = false) ^ (B(x) inter I(y) = false) ^ (B(x) inter B(y) = false)
+ * @{
+*/
+
+//! Check if coordinate cl and coordinate c2 are disjoint
+bool TeDisjoint(const TeCoord2D& c1, const TeCoord2D& c2);
+
+//! Check if coordinate and box are disjoint
+bool TeDisjoint(const TeCoord2D& c, const TeBox& b);
+
+//! Check if box 1 and box 2 are disjoint
+bool TeDisjoint(const TeBox& bx1, const TeBox& bx2);
+
+//! Check if coordinate and line are disjoint
+bool TeDisjoint(const TeCoord2D& c, const TeLine2D& l);
+
+//! Check if coordinate and polygon are disjoint
+bool TeDisjoint(const TeCoord2D& c, const TePolygon& pol);
+
+//! Check if point l and point 2 are disjoint
+bool TeDisjoint(const TePoint& p1, const TePoint& p2);
+
+//! Check if point and object are disjoint
+bool TeDisjoint(const TePoint& p, const TeLine2D& l);
+
+//! Check if point and object are disjoint
+bool TeDisjoint(const TePoint& p, const TePolygon& pol);
+
+//! Check if lines are disjoint
+bool TeDisjoint(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if line and polygon are disjoint
+bool TeDisjoint(const TeLine2D& l, const TePolygon& pol);
+
+//! Check if polygons are disjoint
+bool TeDisjoint(const TePolygon& redPol, const TePolygon& bluePol);
+
+//! Check if cell 1 and cell 2 are disjoint
+bool TeDisjoint(const TeCell& cell1, const TeCell& cell2);
+
+//! Check if cell and line are disjoint
+bool TeDisjoint(const TeCell& cell, const TeLine2D& line);
+
+//! Check if cell and polygon are disjoint
+bool TeDisjoint(const TeCell& cell, const TePolygon& pol);
+
+//! Check if cell and point are disjoint
+bool TeDisjoint(const TeCell& cell, const TePoint& point);
+/** @} */
+
+
+/** @defgroup TeIntersects Intersects test
+ * @ingroup TopologicalOperators
+ * Check if one object intersects another object.
+ * Applies to all geometries.
+ * TeIntersects(x, y) => !TeDisjoint(x, y)
+ * => (I(x) inter I(y) = true) v (I(x) inter B(y) = true) v (B(x) inter I(y) = true) v (B(x) inter B(y) = true)
+ * @{
+ */
+
+//! If a specialized function is not used, returns the disjoint negation
+template<class T1, class T2> inline bool TeIntersects(const T1& o1, const T2& o2)
+{
+ return !TeDisjoint(o1, o2);
+}
+
+//! Check if coordinate and box intersects
+template<> bool TeIntersects(const TeCoord2D& c, const TeBox& b);
+
+//! Check if point and box intersects
+template<> bool TeIntersects(const TePoint& p, const TeBox& b);
+
+//! Check if boxes intersects
+template<> bool TeIntersects(const TeBox& bx1, const TeBox& bx2);
+
+/** @} */
+
+
+/** @defgroup TeTouches Touch test
+ * @ingroup TopologicalOperators
+ * Check if two objects touche.
+ * Applies to A/A, L/L, L/A, P/A, P/L.
+ * TeTouches(x, y) => (I(x) inter I(y) = false) ^ (x inter y = true)
+ * => (I(x) inter I(y) = false) ^ ((B(x) inter I(y) = true) v (I(x) inter B(y) = true) v (B(x) inter B(y) = true))
+ * @{
+ */
+
+//! Check if coordinate and line touches
+bool TeTouches(const TeCoord2D& c, const TeLine2D& l);
+
+//! Check if coordinate and polygon touches
+bool TeTouches(const TeCoord2D& c, const TePolygon& pol);
+
+//! Check if point and object touches
+bool TeTouches(const TePoint& p, const TeLine2D& l);
+
+//! Check if point and object touches
+bool TeTouches(const TePoint& p, const TePolygon& pol);
+
+//! Check if line and line touches
+bool TeTouches(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if line and polygon
+bool TeTouches(const TeLine2D& l, const TePolygon& pol);
+
+//! Check if polygons touches
+bool TeTouches(const TePolygon& redPol, const TePolygon& bluePol);
+
+//! Check if boxes touches
+bool TeTouches(const TeBox& bx1, const TeBox& bx2);
+
+//! Check if cells touches
+bool TeTouches(const TeCell& c1, const TeCell& c2);
+
+//! Check if cell and line touches
+bool TeTouches(const TeLine2D& line, const TeCell& cell);
+
+//! Check if cell and polygon touches
+bool TeTouches(const TeCell& c1, const TePolygon& poly);
+
+//! Check if cell and point touches
+bool TeTouches( const TePoint& point, const TeCell& c1);
+/** @} */
+
+
+/** @defgroup TeCrosses Crosses test
+ * @ingroup TopologicalOperators
+ * Check if one object crosses another object.
+ * TeCrosses(x, y) => dim(I(x) inter I(y)) = (max(dim(I(x)), dim(I(y))) - 1) ^ (x inter y != x) ^ (x inter y != y)
+ * Case 1: x = TeLine2D and y = TePolygon
+ * => (I(x) inter I(y) = true) ^ (I(x) inter E(y) = true)
+ * Case 2: x = TeLine2D and y = TeLine2D
+ * => dim(I(x) inter I(y)) = 0
+ * @{
+ */
+
+//! Check if red line crosses blue line
+bool TeCrosses(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if line crosses polygon
+bool TeCrosses(const TeLine2D& l, const TePolygon& pol);
+
+//! Check if line and cell crosses
+bool TeCrosses(const TeLine2D& l, const TeCell& cell);
+/** @} */
+
+
+/** @defgroup TeWithin Within test
+ * @ingroup TopologicalOperators
+ * Check if one object is within another object.
+ * TeWithin(x, y) => (x inter y = x) ^ (I(x) inter I(y) = true)
+ * Case 1: P/P, P/L and P/A
+ * => (I(x) inter I(y) = true)
+ * Case 2: L/L and A/A
+ * => (I(x) inter I(y) = true) ^ (I(x) inter E(y) = false) ^ (B(x) inter E(y) = false) ^ (B(x) inter B(y) = false)
+ * Case 3: L/A
+ * => (I(x) inter I(y) = true) ^ (I(x) inter E(y) = false) ^ (B(x) inter E(y) = false) ^ (B(x) inter B(y) = false) ^ (I(x) inter B(y) = false)
+ * @{
+*/
+
+//! Check if coordinate 1 is within coordinate 2
+bool TeWithin(const TeCoord2D& c1, const TeCoord2D& c2);
+
+//! Check if coordinate is within a box
+bool TeWithin(const TeCoord2D& c, const TeBox& b);
+
+//! Check if a cordinate is within a line
+bool TeWithin(const TeCoord2D& c, const TeLine2D& l);
+
+//! Check if a cordinate is within a polygon
+bool TeWithin(const TeCoord2D& c, const TePolygon& pol);
+
+//! Check if point 1 is within point 2
+bool TeWithin(const TePoint& p1, const TePoint& p2);
+
+//! Check if point is within object
+bool TeWithin(const TePoint& p, const TeLine2D& l);
+
+//! Check if point is within object
+bool TeWithin(const TePoint& p, const TePolygon& pol);
+
+//! Check if red line is within blue line
+bool TeWithin(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if line is within polygon
+bool TeWithin(const TeLine2D& l, const TePolygon& pol);
+
+//! Check if red polygon is within blue polygon
+bool TeWithin(const TePolygon& redPol, const TePolygon& bluePol);
+
+//! Check if box1 is within box2
+bool TeWithin(const TeBox& bx1, const TeBox& bx2);
+
+//! Check if cell1 is within cell2
+bool TeWithin(const TeCell& cell1, const TeCell& cell2);
+
+//! Check if line is within cell
+bool TeWithin(const TeLine2D& line, const TeCell& cell);
+
+//! Check if cell is within polygon
+bool TeWithin(const TeCell& cell, const TePolygon& poly);
+
+//! Check if point is within cell
+bool TeWithin(const TePoint& point, const TeCell& cell);
+/** @} */
+
+/** @defgroup TeContains Contains test
+ * @ingroup TopologicalOperators
+ * Check if one object contains another object.
+ * TeContains(x, y) = TeWithin(y, x)
+ * @{
+ */
+
+//! If a specialized function is not used, returns false
+template<class T1, class T2> inline bool TeContains(const T1& o1, const T2& o2)
+{
+ return TeWithin(o2, o1);
+}
+/** @} */
+
+/** @defgroup TeOverlaps Overlaps test
+ * @ingroup TopologicalOperators
+ * Check if one object overlaps another object.
+ * TeOverlaps(x, y) => (dim(I(x)) = dim(I(y)) = dim(I(x) inter I(y))) ^ (x inter y != x) ^ (x inter y != y)
+ * Case 1: (x = TePolygon and y = TePolygon)
+ * => (I(x) inter I(y) = true) ^ (I(x) inter E(y) = true) ^ (E(x) inter I(y) = true)
+ * Case 2: x = TeLine2D and y = TeLine2D
+ * => (dim(I(x) inter I(y)) = 1) ^ (I(x) inter E(y) = true) ^ (E(x) inter I(y) = true)
+ * @{
+ */
+
+//! Check if red red overlaps blue line
+bool TeOverlaps(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if red polygon overlaps blue polygon
+bool TeOverlaps(const TePolygon& redPol, const TePolygon& bluePol);
+
+//! Check if cell1 overlaps cell2
+bool TeOverlaps(const TeCell& cell1, const TeCell& cell2);
+
+//! Check if cell overlaps polygon
+bool TeOverlaps(const TeCell& cell, const TePolygon& poly);
+/** @} */
+
+
+/** @defgroup TeCoveredBy Covered by test
+ * @ingroup TopologicalOperators
+ * Check if one object is covered by another object.
+ * TeCoveredBy(x, y) => (x inter y = x) ^ (I(x) inter I(y) = true)
+ * - Case 1: (x = TePolygon and y = TePolygon) or (x = TeLine2D and y = TeLine2D)
+ * => (I(x) inter I(y) = true) ^ (I(x) inter E(y) = false) ^ (B(x) inter E(y) = false) ^ (B(x) inter B(y) = true)
+ * - Case 2: x = TeLine2D and y = TePolygon
+ * => (I(x) inter I(y) = true) ^ (I(x) inter E(y) = false) ^ (B(x) inter E(y) = false) ^ ((B(x) inter B(y) = true) v (I(x) inter B(y) = true))
+ * @{
+ */
+
+//! Check if red line is covered by blue line
+bool TeCoveredBy(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if line is covered by polygon
+bool TeCoveredBy(const TeLine2D& l, const TePolygon& pol);
+
+//! Check if red polygon is covered by blue polygon
+bool TeCoveredBy(const TePolygon& redPol, const TePolygon& bluePol);
+
+//! Check if cell1 is covered by cell2
+bool TeCoveredBy(const TeCell& cell1, const TeCell& cell2);
+
+//! Check if polygon is covered by cell
+bool TeCoveredBy(const TePolygon& poly, const TeCell& cell);
+
+//! Check if line is covered by cell
+bool TeCoveredBy(const TeLine2D& line, const TeCell& cell);
+
+/** @} */
+
+/** @defgroup TeCovers Covers test
+ * @ingroup TopologicalOperators
+ * Check if one object covers another object.
+ * TeCovers(x, y) => TeCoveredBy(y, x)
+ * @{
+ */
+template<typename T1, typename T2> inline bool TeCovers(T1& o1, T2& o2)
+{
+ return TeCoveredBy(o2, o1);
+}
+/** @} */
+
+/** @defgroup TeRelation Relation test
+ * @ingroup TopologicalOperators
+ * Return the relation between two objects.
+ * @{
+ */
+
+/*! \fn short TeRelation(const TeCoord2D& c, const TeLine2D& l)
+ \brief Returns the relation between coordinate c and line l.
+ \param c The coordinate.
+ \param l The line.
+
+ This function may returns: INSIDE, OUTSIDE or BOUNDARY.
+ Obs: Doesn't do box elimination, just uses from TeIsOnLine(coordinate, line) elimination
+ */
+short TeRelation(const TeCoord2D& c, const TeLine2D& l);
+
+
+ /*! \fn short TeRelation(const TeCoord2D& c, const TeLinearRing& ring)
+ \brief Point in polygon inside/outside/boundary code.
+ \param c The coordinate to test.
+ \param ring The simple polygon to test.
+
+ Check if point is INSIDE/OUTSIDE/BOUNDARY of a given ring.
+ The ring is treated as a simple polygon (no holes).
+ Obs: Do box elimination.
+*/
+short TeRelation(const TeCoord2D& c, const TeLinearRing& r);
+
+/*! \fn short TeRelation(const TeCoord2D& c, const TePolygon& pol);
+ \brief Point in polygon inside/outside/boundary code.
+ \param c The coordinate to test.
+ \param pol The polygon to test.
+
+ Check if point is INSIDE/OUTSIDE/BOUNDARY.
+ Obs: Doesn't do box elimination, just uses from TeRelation(coordinate, ring) elimination.
+*/
+short TeRelation(const TeCoord2D& c, const TePolygon& pol);
+
+short TeRelation(const TePoint& p, const TePolygon& pol);
+
+/*! \fn short TeRelation(const TeCoord2D& c, const TePolygonSet& pSet)
+ \brief Point in polygon set inside/outside/boundary code.
+ \param c The coordinate to test.
+ \param pSet The polygon set to test.
+
+ Check if point is INSIDE/OUTSIDE/BOUNDARY.
+ Obs: Do box elimination.
+*/
+short TeRelation(const TeCoord2D& c, const TePolygonSet& pSet);
+
+/*! \fn short TeRelation(const TeLine2D& lRed, const TeLine2D& lBlue, const short& relation)
+ \brief This function returns the relation between two lines.
+ \param lRed The first line.
+ \param lBlue The second line.
+ \param relation The relation that stop the search.
+
+ This function returns the relation between lines. May be: TeDISJOINT, TeTOUCHES, TeWITHIN, TeCONTAINS, TeCROSSES, TeOVERLAPS, TeCOVEREDBY, TeCOVERS, TeEQUALS.
+ Obs: Doesn't do box elimination. You must implement the test in your own functions.
+*/
+short TeRelation(const TeLine2D& lRed, const TeLine2D& lBlue, const short& relation);
+
+/*! \fn short TeRelation(const TeLine2D& line, const TePolygon& pol)
+ \brief This function returns the relation between a line and a polygon.
+ \param line The line.
+ \param pol The polygon.
+
+ This function returns the relation between a line and a polygon. May be: TeDISJOINT, TeTOUCHES, TeWITHIN (THE LINE IS WITHIN), TeCROSSES, TeCOVEREDBY (THE LINE IS COVERED BY).
+ Obs: Doesn't do box elimination. You must implement the test in your own functions.
+*/
+short TeRelation(const TeLine2D& line, const TePolygon& pol);
+
+/*! \fn short TeRelation(const TePolygon& pRed, const TePolygon& pBlue)
+ \brief This function returns the relation between two polygons.
+ \param pRed The first polygon.
+ \param pBlue The second polygon.
+
+ This function returns the relation between a line and a polygon. May be: TeEQUALS, TeDISJOINT, TeTOUCHES, TeWITHIN (pRed IS WITHIN pBlue), TeCONTANS (pBlue CONTAINS pRed), TeOVERLAPS, TeCOVEREDBY (pRed IS COVERED BY pBlue) or TeCOVERS (pRed COVERS pBlue).
+ Obs: Doesn't do box elimination. You must implement the test in your own functions.
+*/
+short TeRelation(const TePolygon& pRed, const TePolygon& pBlue);
+/** @} */
+/** @} */
+
+/** @defgroup BoxTests Special box tests
+ * @ingroup GeometryAlgorithms
+ * Box tests.
+ * @{
+*/
+
+//! Check if box1 is disjoint or touches box2
+bool TeDisjointOrTouches(const TeBox& bx1, const TeBox& bx2);
+
+//! Check if coordinate c is within or touches segments c1 and c2 box
+bool TeWithinOrTouches(const TeCoord2D& c, const TeCoord2D& c1, const TeCoord2D& c2);
+/** @} */
+
+
+/** @defgroup GeometryTests Special Geometry tests
+ * @ingroup GeometryAlgorithms
+ * Geometry tests.
+ * @{
+*/
+
+//! Check if geom1 is within or is covered by or is equal to geom2
+template<class T1, class T2>
+bool TeWithinOrCoveredByOrEquals(const T1& geom1, const T2& geom2)
+{
+ short rel = TeRelation(geom1, geom2);
+
+ if((rel&TeINSIDE) || (rel&TeBOUNDARY))
+ return true;
+
+ return false;
+}
+
+//! Check if box1 is within or is covered by or is equal to box2
+template<>
+bool TeWithinOrCoveredByOrEquals(const TeBox& bx1, const TeBox& bx2);
+
+//! Check if line1 is within or is covered by or is equal to line2
+template<>
+bool TeWithinOrCoveredByOrEquals(const TeLine2D& line1, const TeLine2D& line2);
+
+//! Check if line1 is within or is covered by to pol
+template<>
+bool TeWithinOrCoveredByOrEquals(const TeLine2D& line1, const TePolygon& pol);
+
+//! Check if pol1 is within or is covered by or is equal to pol2
+template<>
+bool TeWithinOrCoveredByOrEquals(const TePolygon& pol1, const TePolygon& pol2);
+
+/** @} */
+
+
+/** @defgroup IntersectionOperators Intersection Operators
+ * @ingroup GeometryAlgorithms
+ * Functions that calculate the intersection among objects or do intersection test.
+ * @{
+ */
+
+/*! \fn bool TeIntersection(const TeBox& bx1, const TeBox& bx2, TeBox& bout)
+ \brief Performs the intersection between box b1 and b2, returning the resulting box bout.
+ \param bx1 The first box to do the intersection.
+ \param bx2 The second box to do the intersection.
+ \param bout The box formed by the intersection of bx1 and bx2.
+*/
+bool TeIntersection(const TeBox& bx1, const TeBox& bx2, TeBox& bout);
+
+/*! \fn TeCoordPairVect TeGetIntersections(const TePolygon &poly, const double& y);
+ \brief Return the segments that intersept the poly polygon in the line y.
+ \param poly A polygon.
+ \param y The ordinate that cuts the polygons edges.
+*/
+TeCoordPairVect TeGetIntersections(const TePolygon &poly, const double& y);
+/** @} */
+
+
+/** @defgroup UnionOperators Union Operators
+ * @ingroup GeometryAlgorithms
+ * Functions that compute the union of objects.
+ * @{
+ */
+
+/*! \fn TeBox TeUnion(const TeBox& bx1, const TeBox& bx2)
+ \brief Combine two box, make one that includes both.
+ \param bx1 The first box to do the union.
+ \param bx2 The second box to do the union.
+*/
+TeBox TeUnion(const TeBox& bx1, const TeBox& bx2);
+
+/** @} */
+
+/** @defgroup TeLocationFunctions Functions that finds the localization of objects.
+ * @ingroup GeometryAlgorithms
+ * Functions that finds the localization of objects.
+ * @{
+ */
+
+/*! \fn bool TePointInPoly(const TeCoord2D& c, const TeLinearRing& r)
+ \brief Point in polygon inside/outside/boundary code.
+ \param c The coordinate to test.
+ \param r The simple polygon to test.
+
+ Check if point is INSIDE of a given ring.
+ The ring is treated as a simple polygon (no holes).
+ Adapted from:
+ Samosky, Joseph, "SectionView: A system for interactively specifying and
+ visualizing sections through three-dimensional medical image data,
+ M.S. Thesis, Department of Electrical Engineering and Computer Science,
+ Massachusetts Institute of Technology, 1993.
+ Obs: Doesn't do box elimination.
+*/
+bool TePointInPoly(const TeCoord2D& c, const TeLinearRing& r);
+
+/*! \fn bool TeIsOnSegment(const TeCoord2D& c, const TeCoord2D& c1, const TeCoord2D& c2)
+ \brief Check if coordinate c is on segment (segment is closed).
+ \param c The coordinate to be tested.
+ \param c1 The first segment's coordinate.
+ \param c2 The second segment's coordinate.
+*/
+bool TeIsOnSegment(const TeCoord2D& c, const TeCoord2D& c1, const TeCoord2D& c2);
+
+/*! \fn bool TeIsOnLine(const TeCoord2D& c, const TeLine2D& l)
+ \brief Check if coordinate c is on line boundary or on line interior (see explanation above for definition of boundary and interior of a line).
+ \param c The coordinate to be tested.
+ \param l The line used in the test.
+
+ Obs: Do box elimination.
+*/
+bool TeIsOnLine(const TeCoord2D& c, const TeLine2D& l);
+
+/*! \fn bool TeLocateLineSegment(TeCoord2D& pin, TeLine2D& line, int& segment, double tol = 0.0)
+ \brief Locate the nearest line segment of a coordinate.
+ \param pin The coordinate.
+ \param line The line.
+ \param segment The position of the segment in the line
+ \param tol Tolerance.
+*/
+bool TeLocateLineSegment(TeCoord2D& pin, TeLine2D& line, int& segment, double tol = 0.0);
+/** @} */
+
+/** @defgroup TeConvexHull Functions to compute the Convex Hull
+ * @ingroup GeometryAlgorithms
+ * Functions that returns the convex hull of a point list.
+ * @{
+ */
+
+ /*! \fn template<class T> TePolygon TeConvexHull(const T& coordSet)
+ \brief Returns the convexhull of a given list of coords in counterclockwise.
+ \param coordSet A list with coordinates without duplicated coordinates.
+
+ This algorithm is based on the book Computational Geometry
+ by M. de Berg, M. van Kreveld, M. Overmars and O. Schwarzkopf - Springer Verlag - pp. 6.
+ It is O(N log N).
+
+*/
+template<class T> TePolygon TeConvexHull(const T& coordSet);
+
+//! This is a explicit specialization that returns the convex hull of a TePolygon
+template<> TePolygon TeConvexHull(const TePolygon& p);
+
+//! This is a explicit specialization that returns the convex hull of a TePolygonSet
+template<> TePolygon TeConvexHull(const TePolygonSet& ps);
+
+//! This is a explicit specialization that returns the convex hull of a TePointSet. Must be defined!
+template<> TePolygon TeConvexHull(const TePointSet& ps);
+
+/** @} */
+
+/** @defgroup TeUtils Utilities functions.
+ * @ingroup GeometryAlgorithms
+ * @{
+ */
+
+//! Given a projection "proj" returns a tolerance value in the same unit of projection to be used in geometric operations
+double TeGetPrecision(TeProjection* proj);
+
+
+//! This class implements the Epsilon-tweaking used in calculus.
+class TeGeometryAlgorithmsPrecision
+{
+ protected:
+
+ //! Constructor
+ TeGeometryAlgorithmsPrecision();
+
+ public:
+
+ //! Tells if d1 is greater than d2 according to tolerance factor.
+ static bool IsGreater(const double& d1, const double& d2)
+ {
+ return ((d1 - d2) > TePrecision::instance().precision());
+ }
+
+ //! Tells if d1 is greater than or equal to d2 according to tolerance factor.
+ static bool IsGreaterEqual(const double& d1, const double& d2)
+ {
+ return ((d1 - d2) >= (-TePrecision::instance().precision()));
+ }
+
+ //! Tells if d1 is smaller than d2 according to a tolerance factor.
+ static bool IsSmaller(const double& d1, const double& d2)
+ {
+ return ((d1 - d2) < -(TePrecision::instance().precision()));
+ }
+
+ //! Tells if d1 is smaller than or equals to d2 according to a tolerance factor.
+ static bool IsSmallerEqual(const double& d1, const double& d2)
+ {
+ return ((d1 - d2) <= TePrecision::instance().precision());
+ }
+
+ //! Tells if d1 is equals to d2 according to a tolerance factor.
+ static bool IsEqual(const double& d1, const double& d2)
+ {
+ return (fabs(d1 - d2) <= TePrecision::instance().precision());
+ }
+
+ //! Tells if d1 is different from d2 according to a tolerance factor.
+ static bool IsDifferent(const double& d1, const double& d2)
+ {
+ return (fabs(d1 - d2) > TePrecision::instance().precision());
+ }
+};
+
+inline void TeRemoveDuplicatedCoordinates(TeLine2D& l)
+{
+ for(unsigned int i = 0; i < l.size() - 1; ++i)
+ if(TeEquals(l[i], l[i + 1]))
+ {
+ l.erase(i);
+ --i;
+ }
+
+ return;
+}
+
+inline void TeRemoveDuplicatedCoordinates(TePolygon& p)
+{
+ for(unsigned int i = 0; i < p.size(); ++i)
+ TeRemoveDuplicatedCoordinates(p[i]);
+
+ return;
+}
+
+/*! \fn void TeReverseLine (TeLine2D& lin);
+ \brief Reverses the line.
+ \param lin The line to be reversed.
+*/
+inline void TeReverseLine(TeLine2D& lin)
+{
+ for(unsigned int i=0,j=lin.size()-1 ; i<lin.size()/2 ; ++i,--j)
+ {
+ TeCoord2D p = lin[i];
+ lin[i] = lin[j];
+ lin[j] = p;
+ }
+
+ return;
+}
+
+/** @} */
+
+/** @defgroup ValidationOperators Validation Operators
+ * @ingroup GeometryAlgorithms
+ * Functions that do some validation tests.
+ * @{
+ */
+
+/*! \fn bool TeIsConvex(const TeLinearRing& ring);
+ \brief Tells if a simple polygon defined as a linear ring is convex or not.
+ \param ring The polygon to test convexity.
+*/
+bool TeIsConvex(const TeLinearRing& ring);
+
+/*! \fn short TeOrientation(const TeLinearRing& r);
+ \brief Returns the orientation of the ring (CLOCKWISE or COUNTERCLOCKWISE);
+ \param r The ring to be checked.
+*/
+short TeOrientation(const TeLinearRing& r);
+
+/** @} */
+
+/** @defgroup MetricOperators Metric Operators
+ * @ingroup GeometryAlgorithms
+ * Functions that do some usefull metric operations.
+ * @{
+ */
+
+/*! \fn void TeGetMiddlePoint(const TeCoord2D& first, const TeCoord2D& last, TeCoord2D& middle)
+ \brief Returns the middle point of a segment.
+ \param first The first segment's coordinate.
+ \param last The second segment's coordinate.
+ \param middle The middle point.
+*/
+void TeGetMiddlePoint(const TeCoord2D& first, const TeCoord2D& last, TeCoord2D& middle);
+
+
+/*! \fn double TeDistance(const TeCoord2D& c1, const TeCoord2D& c2)
+ \brief Euclidian distance between two points.
+ \param c1 First coordinate;
+ \param c2 Second coordinate;
+*/
+double TeDistance(const TeCoord2D& c1, const TeCoord2D& c2);
+
+/*! \fn double TeLength(const TeLine2D& l)
+ \brief Returns the length of a Line 2D.
+ \param l The line to calculate the length.
+*/
+double TeLength(const TeLine2D& l);
+
+/*! \fn double TePerpendicularDistance(const TeCoord2D& first, const TeCoord2D& last, const TeCoord2D& pin, TeCoord2D &pinter)
+ \brief Perpendicular distance from point to segment.
+ \param first The first segment's coordinate.
+ \param last The second segment's coordinate.
+ \param pin The point to get the distance from the segment.
+ \param pinter The point of intersection on the segment.
+*/
+double TePerpendicularDistance(const TeCoord2D& first, const TeCoord2D& last, const TeCoord2D& pin, TeCoord2D &pinter);
+
+/*! \fn double TeMinimumDistance(const TeCoord2D& first, const TeCoord2D& last, const TeCoord2D& pin, TeCoord2D& pout, double tol = 0.0);
+ \brief Minimal distance from point to segment.
+ \param first The first segment's coordinate.
+ \param last The second segment's coordinate.
+ \param pin The point to get the minimal distance from the segment. This point is inside the segment
+ \param pout The nearest segment point of the pin point.
+ \param tol Numerical tolerance
+*/
+double TeMinimumDistance (const TeCoord2D& first, const TeCoord2D& last, const TeCoord2D& pin, TeCoord2D& pout, double tol = 0.0);
+
+/** @defgroup TeGeometryArea Functions to compute the area of a geometry
+ * @ingroup MetricOperators
+ * Functions that returns the area of a geometry.
+ * @{
+ */
+
+/*! \fn template<class T> double TeGeometryArea(const T& geom)
+ \brief Returns the area of a TePolygon or TePolygonSet, otherwise return zero.
+ \param geom The geometry whose area we want to known.
+
+ This algorithm is based on the book Spatial Databases with Application to GIS
+ by Philippe Rigaux, Michel O. Scholl and Agnes Voisard.
+
+*/
+
+template<class T> double TeGeometryArea(const T& /* geom */)
+{
+ return 0.0;
+}
+
+//! This is a explicit specialization that returns the area of a TePolygon
+template<> double TeGeometryArea(const TePolygon& p);
+
+//! This is a explicit specialization that returns the area of a TePolygonSet
+template<> double TeGeometryArea(const TePolygonSet& ps);
+
+//! This is a explicit specialization that returns the area of a Box
+template<> double TeGeometryArea(const TeBox& b);
+/** @} */
+
+/** @} */
+
+
+
+/** @defgroup GeometryFunction Functions that return geometries.
+ * @ingroup GeometryAlgorithms
+ * Functions that return geometries.
+ * @{
+ */
+
+ /*! \fn TePolygon TeMakePolygon(const TeBox& b)
+ \brief Given a box return its polygon representation.
+ \param b The box to create a polygon.
+*/
+TePolygon TeMakePolygon(const TeBox& b);
+
+/*! \fn TeLinearRing TeSimpleClosedPath(const TePointSet& pSet)
+ \brief Given N points, finds a path that doesn't self-intersects, visiting all points and returning to the begginning one.
+ \param pSet The point set to form a path.
+
+ It is based on the book Algorithms by Robert Sedgewick, Addisson-Wesley, 1988.
+*/
+TeLinearRing TeSimpleClosedPath(const TePointSet& pSet);
+/** @} */
+
+
+/** @defgroup TeFindCentroid Functions to compute the centroid
+ * @ingroup GeometryAlgorithms
+ * Functions that return the centroid.
+ * @{
+ */
+/*! \fn TeCoord2D TeFindCentroid(const TePolygon& p);
+ \brief Calculates the centroid of a polygon.
+ \param p A TePolygon whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TePolygon& p);
+
+/*! \fn TeCoord2D TeFindCentroid(const TeLine2D& l);
+ \brief Calculates a reference point.
+ \param l A TeLine whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TeLine2D& l);
+
+/*! \fn TeCoord2D TeFindCentroid(const TeCell& c );
+ \brief Calculates the centroid of a cell.
+ \param c A TeCell whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TeCell& c);
+
+/*! \fn TeCoord2D TeFindCentroid(const TePoint& p );
+ \brief Calculates the centroid of a point.
+ \param p A TePoint whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TePoint& p);
+
+/*! \fn TeCoord2D TeFindCentroid(const TePolygonSet& s );
+ \brief Calculates the centroid of a polygon set.
+ \param s A TePolygon set whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TePolygonSet& s);
+
+/*! \fn TeCoord2D TeFindCentroid(const TeLineSet& s );
+ \brief Calculates the centroid of a line set.
+ \param s A TeLine set whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TeLineSet& s);
+
+/*! \fn TeCoord2D TeFindCentroid(const TeCellSet& s );
+ \brief Calculates the centroid of a cell set.
+ \param s A TeCell set whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TeCellSet& s);
+
+/*! \fn TeCoord2D TeFindCentroid(TePointSet& ps );
+ \brief Calculates the centroid of a point set.
+ \param ps A TePointSet set whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(TePointSet& ps);
+/** @} */
+
+
+/** @defgroup TeNearest Functions to compute the nearest part of an object to a point.
+ * @ingroup GeometryAlgorithms
+ * Auxiliary functions.
+ * @{
+ */
+//! Nearest node in set from location pt (i = the node index in the nodeset)
+bool TeNearest(TeCoord2D& pt, TeNodeSet& ns , int& i, const double& tol = 0.0);
+
+//! Nearest point in set from location pt (i = the point index in the pointset)
+bool TeNearest(TeCoord2D& pt, TePointSet& ps , int& i, const double& tol = 0.0);
+
+//! Nearest text in set from location pt (i = the text index in the textset)
+bool TeNearest(TeCoord2D& pt, TeTextSet& ts , int& i, const double& tol = 0.0);
+
+//! Nearest line in set from location pt (i = the line index in the lineset and pi = the closest point)
+//! The pi point can be outside a line of the line set
+bool TeNearest(TeCoord2D& pt, TeLineSet& ls , int& i, TeCoord2D& pi, const double& tol = 0.0);
+
+//! Nearest line in set from location pt (i = the line index in the lineset and pout = the closest point)
+//! The pout point must be inside a line of the line set
+bool TeNearest (TeCoord2D& pt,TeLineSet& ls, int& lindex, TeCoord2D& pout, double& dmin, const double& tol = 0.0);
+
+//! Nearest polygon in set from location pt (i = the polygon index in the polygonset).
+bool TeNearest(TeCoord2D& pt, TePolygonSet& ps , int& i, const double& tol = 0.0);
+
+//! Nearest line in set from location pt (i = the line index in lineset) calculated by the vertex of the lines
+bool TeNearestByPoints(TeCoord2D& pt, TeLineSet& ls , int& i, double& dist, const double& tol = 0.0);
+/** @} */
+
+
+/** @defgroup TINfunction Functions used by TIN.
+ * @ingroup GeometryAlgorithms
+ * TIN functions.
+ * @{
+ */
+/*! \fn bool TeFindTriangleCenter(const TeCoord2D& vert0, const TeCoord2D& vert1, const TeCoord2D& vert2, TeCoord2D& pc);
+ \brief Calculates the center of a triangle.
+ \param vert0 First triagle's vertex.
+ \param vert1 Second triagle's vertex.
+ \param vert2 Third triagle's vertex.
+ \param pc The triangle center.
+*/
+bool TeFindTriangleCenter(const TeCoord2D& vert0, const TeCoord2D& vert1, const TeCoord2D& vert2, TeCoord2D& pc);
+
+//! Line simplification.
+bool TeLineSimplify(TeLine2D& line, double snap, double maxdist);
+
+/** @} */
+
+/** @defgroup Curvefunction Functions used to make curve.
+ * @ingroup GeometryAlgorithms
+ * Curve functions.
+ * @{
+ */
+
+/*! \fn bool TeGetCenter(TePoint p1, TePoint p2, TePoint p3, TePoint ¢er);
+ \brief Given three points of a circumference, returns the center point.
+ \param p1 First point.
+ \param p2 Second point.
+ \param p3 Third point.
+ \param center Circunference center.
+ This algorithm is adapted from http://www.delphiforfun.org/Programs/Math_Topics/circle_from_3_points.htmbook.
+*/
+bool TeGetCenter(TePoint p1, TePoint p2, TePoint p3, TePoint ¢er);
+
+/*! \fn double TeGetRadius(TePoint& p1, TePoint& p2, TePoint& p3);
+ \brief Given three points of a circumference, returns the radius.
+ \param p1 First point.
+ \param p2 Second point.
+ \param p3 Third point.
+ This algorithm is adapted from http://www.delphiforfun.org/Programs/Math_Topics/circle_from_3_points.htmbook.
+*/
+double TeGetRadius(TePoint &p1, TePoint &p2, TePoint &p3);
+
+/*! \fn bool TeGenerateArc(TePoint& p1, TePoint& p2, TePoint& p3, TeLine2D& arcOut, const short& NPoints);
+ \brief Given three points of a circle, returns the an arc passing for this points that is formed by a given number of points.
+ \param p1 First point.
+ \param p2 Second point.
+ \param p3 Third point.
+ \param arcOut The return arc.
+ \param NPoints Number of arc points.
+
+ This algorithm is adapted from http://mathforum.org/dr.math/
+
+*/
+bool TeGenerateArc(TePoint& p1, TePoint& p2, TePoint& p3, TeLine2D& arcOut, const short& NPoints);
+
+/*! \fn bool TeGenerateCircle(TePoint& center, const double& radius, TeLine2D& circle, const short& NPoints);
+ \brief Given the center and the radius, returns the circle formed by a given number of points.
+ \param center Center point of the circle.
+ \param radius radius of the circle.
+ \param circle The return circle
+ \param NPoints Number of circle points.
+*/
+bool TeGenerateCircle(TePoint& center, const double& radius, TeLine2D& circle, const short& NPoints);
+
+/** @} */
+
+/** @} */ // end of group GeometryAlgorithms
+
+
+#endif // __TERRALIB_INTERNAL_GEOMETRYALGORITHMS_H
diff --git a/src/terralib/kernel/TeGraph.cpp b/src/terralib/kernel/TeGraph.cpp
new file mode 100644
index 0000000..9d63d60
--- /dev/null
+++ b/src/terralib/kernel/TeGraph.cpp
@@ -0,0 +1,1557 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include <TeGraph.h>
+#include <TeDefines.h>
+#include <math.h>
+#include <float.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <errno.h>
+
+int set_font(int font_number);
+
+#define PEN_UP 0 /* pen status up */
+#define PEN_DOWN 1 /* pen status down */
+
+#define ERR -1 /* return value when error occurs */
+
+#define HORIZ_FONT 0
+#define VERT_FONT 1
+#define FONT_MAX 2
+
+/*** symbol shapes ***/
+
+#define RECTANGLE 0 /* tells PlotSymbol to draw a rectangle */
+#define TRIANGLE 1 /* tells PlotSymbol to draw a triangle */
+#define DIAMOND 2 /* tells PlotSymbol to draw a diamond */
+#define SCROSS 3 /* tells PlotSymbol to draw an upright cross */
+#define XCROSS 4 /* tells PlotSymbol to draw an angled cross */
+
+/*** constants ***/
+
+#define CURVES_LIMIT 10 /* maximum number of curves */
+#define MAIN_ROW 3 /* row number for main menu */
+#define MAIN_COL 2 /* column number for main menu */
+#define MAX_ITEMS 13 /* maximum number of items in a menu window */
+#define MASK_SIZE 50 /* length of file mask string */
+#define ASCII 0 /* Ascii output format */
+#define BINARY 1 /* Binary output format */
+#define LOAD 0 /* load options */
+#define SAVE 1 /* save options */
+#define SET 2 /* set options */
+#define DIGITS 6 /* number of digits to display for regression
+ coefficients and mean square error */
+int Font_width[FONT_MAX] = {9,9};
+int Font_height[FONT_MAX] = {15,15};
+int Font_direct[FONT_MAX] = {HORIZ_FONT,VERT_FONT};
+
+
+char Symbol[CURVES_MAX] = { /* symbols identifying each curve */
+ RECTANGLE, /* symbol for curve 1 is a rectangle */
+ SCROSS, /* symbol for curve 4 is an upright cross */
+ TRIANGLE, /* symbol for curve 2 is a triangle */
+ DIAMOND, /* symbol for curve 3 is a diamond */
+ XCROSS, /* symbol for curve 5 is an angled cross */
+ RECTANGLE, /* symbol for curve 6 is a rectangle */
+ SCROSS, /* symbol for curve 9 is an upright cross */
+ TRIANGLE, /* symbol for curve 7 is a triangle */
+ DIAMOND, /* symbol for curve 8 is a diamond */
+ XCROSS /* symbol for curve 10 is an angled cross */
+};
+
+unsigned Terms[] =
+{ /* terms in each regression function */
+ 0, /* terms for polynomial set by regres_func */
+ 2, /* number of exponential terms */
+ 2, /* number of logarithmic terms */
+ 3 /* number of sinusoidal terms */
+};
+
+
+struct { /* Options default settings */
+ char symbols[5];
+ char x_major[3];
+ char x_minor[3];
+ char y_major[3];
+ char y_minor[3];
+ char y_scale[2];
+ char filemask[MASK_SIZE];
+ char format[7];
+ char digits[3];
+ char linesize[4];
+ char adapter[5];
+ char printer[9];
+ char printer_port[5];
+ char print_file[13];
+ char color[4];
+ char snow[4];
+ char sound[4];
+ char grid[4];
+ char legend[4];
+} Options ; /* curve legend turned on */
+
+struct {
+ unsigned char background; /* color of outermost window */
+ unsigned char pattern; /* color of pattern in outermost window */
+ unsigned char input; /* color of input window */
+ unsigned char input_prompt; /* color of input window prompt */
+ unsigned char input_answer; /* color of input window answer */
+ unsigned char edit; /* color of edit window */
+ unsigned char edit_bar; /* color of selection bar in edit window */
+ unsigned char edit_answer; /* color of answer bar in edit window */
+ unsigned char edit_index; /* color of index values in edit window */
+ unsigned char edit_heading; /* color of X/Y values heading in edit window */
+ unsigned char error; /* color of error window */
+ unsigned char help; /* color of help message text */
+} Text_color;
+
+struct Grc{
+ TeColor grid; /* color of plot grid */
+ TeColor text; /* color of plot text */
+ TeColor lines; /* color of plot all lines */
+ TeColor symbol[CURVES_LIMIT];/* color of plot all lines */
+ TeColor curve[CURVES_LIMIT]; /* color of plot curves */
+} Graph_color;
+
+int f_spoly(Real x, Real_Vector terms, unsigned n);
+int f_sexp(Real x, Real_Vector terms, unsigned n);
+int f_slog(Real x, Real_Vector terms, unsigned n);
+int f_ssin(Real x, Real_Vector terms, unsigned n);
+
+int (*Function[])(Real, Real_Vector, unsigned) =
+{ /* array of functions used for regression */
+ f_spoly, /* calculate terms of polynomial equation */
+ f_sexp, /* calculate terms of exponential equation */
+ f_slog, /* calculate terms of logarithmic equation */
+ f_ssin /* calculate terms of sinusoidal equation */
+};
+
+Real vmaxval(Real_Vector v, unsigned int n, int *imx)
+{
+ // subroutine determines the maximum value (maxx) of the
+ // vector v[] of length n and returns the index (imx) where
+ // the maximum occurs; i.e. imx, where maxx = v[imx].
+ // On exit, the maximum is returned as the value of vmaxval().
+
+ unsigned int i;
+ Real maxx;
+
+ if (v == NULL)
+ return (Real) 0.0;
+
+ //find max value
+
+ *imx=0;
+ maxx=v[0];
+ for(i=1; i<n ; i++)
+ {
+ if(v[i] > maxx)
+ {
+ maxx=v[i];
+ *imx=i;
+ }
+ }
+ return maxx;
+}
+
+//---------------------------------------------------------------------------------
+Real
+vminval(Real_Vector v, unsigned int n, int *imn)
+{
+// subroutine determines the minimum value (minx) of the
+// vector v[] of length n and returns the index (imn) where
+// the minimum occurs; i.e. imn, where minx = v[imn].
+// On exit, the minimum is returned as the value of vminval().
+
+ unsigned int i;
+ Real minx;
+
+ if (v == NULL)
+ return (Real) 0.0;
+
+ //find min value
+ *imn=0;
+ minx=v[0];
+ for(i=1; i<n ; i++)
+ {
+ if(v[i] < minx)
+ {
+ minx=v[i];
+ *imn=i;
+ }
+ }
+ return minx;
+}
+
+//---------------------------------------------------------------------------------
+
+TeGraphPlot :: TeGraphPlot ()
+{
+ GPpointwidth = 7;
+ GPpointheight = 7;
+
+ label_field = 11;
+ major_tick = 5;
+ minor_tick = 2;
+ x_major = 8;
+ y_major = 10;
+ x_minor = 8;
+ y_minor = 5;
+ Scale_curve = -1;
+ Plot_curves = 0;
+ Plot_symbols = 0;
+ Curve_choice = 0;
+ Plot_choice = 0;
+ int i;
+ for( i = 0; i < CURVES_MAX; i++ )
+ {
+ Plot_points[i] = 0;
+ Plot_x[i] = 0;
+ Plot_y[i] = 0;
+ }
+
+ Graph_color.grid.init(0,100,100);
+ Graph_color.text.init(0,0,0);
+ Graph_color.lines.init(30,30,30);// preto
+
+ for( i = 0; i < CURVES_LIMIT; i++ )
+ {
+ Graph_color.symbol[i].init(0,255,0);
+ Graph_color.curve[i].init(0,0,0);
+ }
+
+ sliceVector = 0;
+}
+
+//---------------------------------------------------------------------------------
+
+TeGraphPlot :: ~TeGraphPlot ()
+{
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: setColorGrid(int r, int g, int b)
+{
+ Graph_color.grid.init(r,g,b);
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: setColorText(int r, int g, int b)
+{
+ Graph_color.text.init(r,g,b);
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: setColorSymbol(int r, int g, int b, int curve, int w, int h)
+{
+ if (curve==-1)
+ for (int i=0; i<CURVES_LIMIT; i++)
+ Graph_color.symbol[i].init(r,g,b);
+ else
+ Graph_color.symbol[curve].init(r,g,b);
+
+ GPpointwidth = w;
+ GPpointheight = h;
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: setColorLine(int r, int g, int b)
+{
+ Graph_color.lines.init(r,g,b);
+}
+
+//---------------------------------------------------------------------------------
+int
+TeGraphPlot :: setColorCurve(int c,int r, int g, int b)
+{
+ if( c < 0 || c > CURVES_LIMIT-1 )
+ {
+ return false;
+ }
+
+ Graph_color.curve[c].init(r,g,b);
+
+ return true;
+}
+
+void
+TeGraphPlot :: pieLegends ()
+{
+ if (sliceVector == 0)
+ return;
+ int w;
+ int xt, yt, pw, ph;
+
+ TeColor cor;
+
+ cor.init (0, 0, 0);
+ setTextColor(cor);
+
+ w = min(width,height);
+ pw = 2*label_height;
+ ph = label_height;
+
+ xt = xupleft + w + pw;
+ yt = yupleft;
+ int textext = 0;
+ for (unsigned int i = 0; i < sliceVector->size (); i++)
+ {
+ TeLegendEntry slice = (*sliceVector)[i];
+ TeVisual vis;
+ //vis = slice.visual (TePOLYGONS);
+ TeColor cor = vis.color();
+
+ setFillAreaColor (cor);
+ string leg = slice.label ();
+ int xw,xh;
+ textExtent (leg, xw, xh);
+ textext = max (textext, xw);
+ fillRectangle (xt, yt-ph, pw, ph);
+ drawText ((int)(xt+1.2*pw), yt-2, (char*)leg.c_str ());
+ yt += (int)1.5*ph;
+ if (yt > (yupleft + height))
+ {
+ xt += (int)(textext+2.2*pw);
+ textext = 0;
+ yt = yupleft;
+ }
+ }
+}
+
+
+//---------------------------------------------------------------------------------
+int
+TeGraphPlot :: setGridSize(int s)
+{
+ if( s <= 0 )
+ {
+ return false;
+ }
+ x_major = s;
+ y_major = s;
+ x_minor = s;
+ y_minor = s;
+
+ return true;
+}
+
+//---------------------------------------------------------------------------------
+int
+TeGraphPlot :: setGridSize(int xma, int yma, int xmi, int ymi )
+{
+ if( xma <= 0 || yma <= 0 || xmi <= 0 || ymi <= 0 )
+ {
+ return false;
+ }
+
+ x_major = xma;
+ y_major = yma;
+ x_minor = xmi;
+ y_minor = ymi;
+
+ return true;
+}
+
+//---------------------------------------------------------------------------------
+int
+TeGraphPlot :: loadDirect (int format, int curv, int points, Labels& labels, Real_Vector x, Real_Vector y)
+{
+ if( curv < 0 || curv > CURVES_LIMIT-1 )
+ {
+ return false;
+ }
+
+ strcpy(Plot_label.title, labels.title);
+ strcpy(Plot_label.xaxis, labels.xaxis);
+ strcpy(Plot_label.yaxis, labels.yaxis);
+ Input_format[curv] = format;
+
+ strcpy(Plot_label.curve[curv], labels.curve[curv]);
+
+ Plot_x[curv] = x;
+ Plot_y[curv] = y;
+ Plot_points[curv] = points;
+
+ if (Plot_curves < (curv+1) )
+ {
+ Plot_curves= curv+1;
+ }
+
+ return true;
+}
+
+void TeGraphPlot::loadHistogram (TeLegendEntryVector& sv, const string& label)
+{
+// Manage number of curves, only one histogram is allowed per plotting
+ Plot_curves = 1;
+ int order = 0;
+ Input_format[order] = BAR_BINARY;
+ sliceVector = &sv;
+// Allocate space for data arrays
+ unsigned int size = sv.size ();
+ if (Plot_x[order])
+ delete [] Plot_x[order];
+ if (Plot_y[order])
+ delete [] Plot_y[order];
+ Plot_x[order] = new double [size];
+ Plot_y[order] = new double [size];
+ Plot_points[order] = size;
+
+// Transfer data from TeLegendEntrys to double array
+ int vmax = 0;
+ for (unsigned int i=0;i<size;i++)
+ {
+ TeLegendEntry sl = sv[i];
+ Plot_y[order][i] = sl.count();
+ Plot_x[order][i] = (double)i+1;
+ vmax = max (vmax,sl.count() );
+ }
+
+// Fill in labels
+ strcpy(Plot_label.title, label.c_str ());
+ strcpy(Plot_label.xaxis, "Fatia");
+ strcpy(Plot_label.yaxis, "Objetos");
+ strcpy(Plot_label.curve[order],"");
+ setScale(1., Real(size+1) , 0., Real (vmax));
+ setGridSize(size, 8, 1, 1);
+}
+
+void TeGraphPlot::loadPie (TeLegendEntryVector& sv, const string& label)
+{
+// Manage number of curves, only one pie is allowed per plotting
+ Plot_curves = 1;
+ int order = 0;
+ Input_format[order] = PIE_BINARY;
+ height = Y_pixels - yupleft;
+ sliceVector = &sv;
+// Allocate space for data arrays
+ unsigned int size = sv.size ();
+ if (Plot_x[order])
+ delete [] Plot_x[order];
+ if (Plot_y[order])
+ delete [] Plot_y[order];
+ Plot_x[order] = new double [size];
+ Plot_y[order] = new double [size];
+ Plot_points[order] = size;
+
+// Transfer data from TeLegendEntrys to double array
+ int vmax = 0;
+ for (unsigned int i=0;i<size;i++)
+ {
+ TeLegendEntry sl = sv[i];
+ Plot_y[order][i] = sl.count();
+ Plot_x[order][i] = (double)i+1;
+ vmax = max (vmax,sl.count() );
+ }
+
+// Fill in labels
+ strcpy(Plot_label.title, label.c_str ());
+// strcpy(Label.curve[order],label.c_str ());
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: autoScale(void)
+{
+// scale axes for Scale_curve (for all curves if Scale_curve == -1)
+
+ int i, index;
+ Real value;
+
+ if (Scale_curve == -1)
+ index = 0;
+ else
+ index = Scale_curve;
+
+ xminval = vminval(Plot_x[index], Plot_points[index], &i);
+ xmaxval = vmaxval(Plot_x[index], Plot_points[index], &i);
+ yminval = vminval(Plot_y[index], Plot_points[index], &i);
+ ymaxval = vmaxval(Plot_y[index], Plot_points[index], &i);
+
+ if (Scale_curve == -1)
+ {
+ for (i = 1; i < Plot_curves; i++)
+ {
+ value = vminval(Plot_x[i], Plot_points[i], &index);
+ if (value < xminval) xminval = value;
+ value = vmaxval(Plot_x[i], Plot_points[i], &index);
+ if (value > xmaxval) xmaxval = value;
+ value = vminval(Plot_y[i], Plot_points[i], &index);
+ if (value < yminval) yminval = value;
+ value = vmaxval(Plot_y[i], Plot_points[i], &index);
+ if (value > ymaxval) ymaxval = value;
+ }
+ }
+
+ for (int curva=0; curva < Plot_curves; curva++)
+ {
+ if (Input_format[curva] == ROSE_BINARY)
+ {
+ yminval = - ymaxval;
+ xmaxval = ymaxval;
+ xminval = yminval;
+ }
+ }
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: setScale(Real x1, Real x2 , Real y1, Real y2)
+{
+ xminval = x1;
+ xmaxval = x2;
+ yminval = y1;
+ ymaxval = y2;
+
+ for (int curva=0; curva < Plot_curves; curva++)
+ {
+ if (Input_format[curva] == ROSE_BINARY)
+ {
+ yminval = - ymaxval;
+ xmaxval = ymaxval;
+ xminval = yminval;
+ }
+ }
+}
+
+int f_spoly(Real x, Real_Vector terms, unsigned n)
+{
+ unsigned i;
+ terms[0] = 1.0;
+ for (i = 1; i < n; i++) terms[i] = x * terms[i-1];
+ return 0;
+}
+
+int f_sexp(Real x, Real_Vector terms, unsigned n)
+{
+ double value;
+ value = exp(x);
+ if (value != HUGE_VAL)
+ {
+ terms[0] = 1.0;
+ terms[n-1] = (Real) value;
+ return 0;
+ }
+ else
+ {
+ show_err("Value of exp(x) is too large");
+ return -1;
+ }
+}
+
+int f_slog(Real x, Real_Vector terms, unsigned n)
+{
+ if (x > 0.0) {
+ terms[0] = 1.0;
+ terms[n-1] = (Real) log(x);
+ return 0;
+ }
+ else {
+ show_err("Value of x is less than or equal to 0");
+ return -1;
+ }
+}
+
+int f_ssin(Real x, Real_Vector terms, unsigned n)
+{
+ errno = 0;
+ terms[0] = 1.0;
+ terms[1] = (Real) sin(x);
+ terms[n-1] = (Real) cos(x);
+ if (errno == 0)
+ return 0;
+ else
+ {
+ show_err("Loss of significance for cos(x) or sin(x)");
+ return -1;
+ }
+}
+
+void show_err (char* /* mess */)
+{
+// printf("%s\n",mess);
+}
+
+//---------------------------------------------------------------------------------
+
+int
+TeGraphPlot :: kill(int order)
+{
+ int i, count = 0;
+ if (Plot_curves == 0)
+ return 0;
+ for (i = 0; i < Plot_curves; i++)
+ {
+ if (Plot_x[i] == Plot_x[order]) count++;
+ }
+
+ if (count == 1)
+ {
+ delete [] Plot_x[order];
+ Plot_x[order] = 0;
+ delete [] Plot_y[order];
+ Plot_y[order] = 0;
+ }
+
+ for (i = order; i < Plot_curves-1; i++)
+ {
+ Plot_x[i] = Plot_x[i+1];
+ Plot_y[i] = Plot_y[i+1];
+ Plot_points[i] = Plot_points[i+1];
+ strcpy(Plot_label.curve[i], Plot_label.curve[i+1]);
+ }
+ Plot_curves--;
+ return 1;
+}
+
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: plotCurves ( int with_simbols)
+{
+ short drawplot = true;
+ Plot_symbols = with_simbols; // numero de pontos
+ // que devem ser plotados
+ // sobre a curva
+ for (int curva=0; curva < Plot_curves; curva++)
+ {
+ if (Plot_y[curva] == NULL)
+ continue;
+
+ if (Input_format[curva] == PIE_BINARY && sliceVector)
+ {
+ plot_title(Plot_label.title);
+
+ int i, w, h, xc, yc, points;
+
+ w = min(width,height);
+ h = min(width,height);
+ xc = xupleft ;
+ yc = yupleft ;
+ points = Plot_points[0];
+
+ Real_Vector y = Plot_y[0];
+
+ Real count = 0., value;
+
+ for (i = 0; i < points; i++) count += y[i];
+ if (count == 0.) break;
+
+ double a1 = 0.,
+ a2 = 0.;
+
+ for (i = 0; i < points; i++)
+ {
+ TeLegendEntry slice = (*sliceVector)[i];
+ TeColor cor = slice.visual(TePOLYGONS).color ();
+ value = y[i]/count;
+ a2 += value*360.;
+ setFillAreaColor(cor);
+ fillArc (xc, yc, w, h, a1, a2, cor);
+ if (value > .08)
+ {
+ char percent[16];
+ sprintf (percent," %.1f",value*100);
+ drawText (xc+w/2, yc+h/2, percent, (a1+a2)/2);
+ }
+ a1 = a2;
+ }
+ pieLegends ();
+ }
+ else if (Input_format[curva] == BAR_BINARY)
+ {
+ //-------------------------------------
+ // ^
+ // | .....
+ // | : :....
+ // | : : :
+ // | ....: : :
+ // | : : : :
+ // |__:_|_:_|_:_|_:____
+ // 1 2 3
+ //-------------------------------------
+ int x1, y1, x2, y2;
+ int i;
+
+// Real_Vector x = Plot_x[0],
+// y = Plot_y[0];
+ Real_Vector x = Plot_x[curva],
+ y = Plot_y[curva];
+
+// setLineAttributes(Graph_color.curve[0],0,0);
+// setFillAreaColor(Graph_color.curve[0]);
+ setLineAttributes(Graph_color.curve[curva],TeLnTypeContinuous,0);
+ setFillAreaColor(Graph_color.curve[curva]);
+
+ for (i = 0; i < Plot_points[curva]; i++)
+ {
+ // Juan begin
+ if(sliceVector)
+ {
+ TeLegendEntry slice = (*sliceVector)[i];
+ TeColor cor = slice.visual(TePOLYGONS).color ();
+ setFillAreaColor (cor);
+ }
+ // Juan end
+// if (i < Plot_points[0]-1)
+ if (i < Plot_points[curva]-1)
+ {
+ value_to_pixel(x[i], y[i], &x1, &y1);
+ value_to_pixel(x[i+1], y[i+1], &x2, &y2);
+ if ((height + yupleft - y1 - 1) > 0)
+ fillRectangle(x1-(x2-x1)/2, y1, (x2-x1-2), height + yupleft - y1);
+ }
+ else
+ {
+ value_to_pixel(x[i-1], y[i-1], &x1, &y1);
+ value_to_pixel(x[i], y[i], &x2, &y2);
+ if ((height + yupleft - y2 - 1) > 0)
+ fillRectangle(x2-(x2-x1)/2, y2, (x2-x1-2), height + yupleft - y2);
+ }
+ }
+ draw_plot();
+ }
+ else if (Input_format[curva] == ROSE_BINARY)
+ {
+ int i;
+ int x1, y1, x2, y2;
+ int a1 = 0,
+ a2 = 0;
+ Real_Vector x = Plot_x[0],
+ y = Plot_y[0];
+
+ plot_title(Plot_label.title);
+
+ for (i = 0; i < Plot_points[0]-1; i++)
+ {
+ if (y[i]==0.)continue;
+ a1 = (int)(x[i] * 64.);
+ a2 = (int)(x[i+1] * 64.) - a1;
+ value_to_pixel(-y[i], y[i], &x1, &y1);
+ value_to_pixel(y[i], -y[i], &x2, &y2);
+ fillArc (x1, y1, x2-x1, y2-y1, a1, a2, Graph_color.curve[0]);
+ }
+
+ Real step = ymaxval / (Real)major_tick;
+
+ for(Real j = step ; j <= ymaxval; j += step )
+ {
+ value_to_pixel(-j, j, &x1, &y1);
+ value_to_pixel(j, -j, &x2, &y2);
+
+ setLineAttributes(Graph_color.lines,TeLnTypeContinuous,0);
+ drawArc(x1, y1, x2-x1, y2-y1,0,360*64,Graph_color.lines);
+ }
+ }
+ else if (Input_format[curva] == POINT_BINARY)
+ {
+ draw_plot();
+
+ for (int j = 0; j < Plot_points[curva]; j ++)
+ plotSymbol(Plot_x[curva][j], Plot_y[curva][j], Symbol[curva], GPpointwidth, GPpointheight, curva);
+
+ }
+ else
+ {
+ if (drawplot)
+ {
+ draw_plot();
+ drawplot = false;
+ }
+
+ plot_curve(Plot_x[curva], Plot_y[curva], Plot_points[curva],Graph_color.curve[curva]);
+
+ if (Plot_symbols)
+ draw_symbols(curva);
+ }
+ }
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: draw_plot(void)
+{
+
+ plot_axes();
+ plot_ticks();
+// if (Options.grid[1] == 'n')
+ plot_grid();
+ plot_labels();
+ plot_title(Plot_label.title);
+ plot_xaxis(Plot_label.xaxis);
+ plot_yaxis(Plot_label.yaxis);
+// if (Options.legend[1] == 'n')
+ drawLegend();
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: setSymbolType(int type, int curve)
+{
+ if(curve>=0 && curve<=9)
+ Symbol[curve] = type;
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: draw_symbols(int curve)
+{
+ int i, step;
+
+ if (Plot_symbols > 0)
+ {
+ step = Plot_points[curve]/Plot_symbols;
+ if (Plot_points[curve] % Plot_symbols != 0) step++;
+ for (i = 0; i < Plot_points[curve]; i += step)
+ plotSymbol(Plot_x[curve][i], Plot_y[curve][i], Symbol[curve], GPpointwidth, GPpointheight, curve);
+ }
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: plot_axes(void)
+{
+ setLineAttributes(Graph_color.lines,TeLnTypeContinuous,0);
+ drawRectangle(xupleft, yupleft, width, height);
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: plot_ticks(void)
+{
+ int i, x, y, maximum, delta, length;
+ int x_ticks = x_major * x_minor;
+ int y_ticks = y_major * y_minor;
+
+ setLineAttributes(Graph_color.lines,TeLnTypeContinuous,0);
+ delta = (width-1)/x_ticks;
+ x = xupleft + delta;
+ y = yupleft + 1;
+ maximum = yupleft + height ;
+ for (i = 1; i < x_ticks; i++)
+ {
+ if (i % x_minor == 0)
+ length = major_tick;
+ else
+ length = minor_tick;
+ drawLine(x, y, x, y + length );
+ drawLine(x, maximum, x, maximum - length );
+ x += delta;
+ }
+ delta = (height-1)/y_ticks;
+ x = xupleft + 1;
+ y = yupleft + delta;
+ maximum = xupleft + width -1;
+ for (i = 1; i < y_ticks; i++)
+ {
+ if (i % y_minor == 0)
+ length = major_tick;
+ else
+ length = minor_tick;
+ drawLine(x, y, x + length , y);
+ drawLine(maximum, y, maximum - length , y);
+ y += delta;
+ }
+}
+
+void TeGraphPlot :: plot_grid(void)
+{
+ int i, x, y, maximum, delta;
+ setLineAttributes(Graph_color.grid,TeLnTypeDotted,0);
+ delta = (width-1)/x_major;
+ x = xupleft + delta;
+ maximum = yupleft + height - major_tick - 1;
+ for (i = 1; i < x_major; i++)
+ {
+ y = yupleft + 1 + major_tick;
+ // while (y < maximum) {
+ // drawPoint (x,y);
+ // y += 3;
+ // }
+ drawLine(x,y,x,maximum);
+ x += delta;
+ }
+ delta = (height-1)/y_major;
+ y = yupleft + delta;
+ maximum = xupleft + width - major_tick - 1;
+ for (i = 1; i < y_major; i++)
+ {
+ x = xupleft + 1 + major_tick;
+ // while (x < maximum) {
+ // drawPoint (x,y);
+ // x += 4;
+ // }
+ drawLine(x,y,maximum,y);
+ y += delta;
+ }
+}
+
+int TeGraphPlot :: plot_labels(void)
+{
+ char text[80];
+ int i, x, y, delta, font;
+ int digits_left, digits_right, exp_flag;
+ Real value, values[3];
+ setTextColor(Graph_color.text);
+
+ if ((font = set_font(label_font)) == ERR) return ERR;
+ values[0] = yminval;
+ values[1] = ymaxval;
+ values[2] = (values[1] - values[0]) / y_major;
+ label_format(values, 3, label_field, &digits_left, &digits_right, &exp_flag);
+ delta = (height-1) / y_major;
+ y = yupleft - label_height/2;
+ value = ymaxval;
+ Yaxis_x = xupleft;
+ for (i = 0; i <= y_major; i++)
+ {
+ ftos(value, digits_left, digits_right, exp_flag, text);
+ x = xupleft - strlen(text) * label_width - label_width/2;
+ if (x < Yaxis_x)
+ Yaxis_x = x;
+ drawText (x, y+8, text);
+ y += delta;
+ value -= values[2];
+ }
+ if (yaxis_direct == HORIZ_FONT)
+ {
+ Yaxis_x -= (yaxis_width + label_width/2);
+ if (Yaxis_x < 0)
+ Yaxis_x = 0;
+ }
+ else
+ {
+ Yaxis_x -= label_width/2;
+ if (Yaxis_x < yaxis_height)
+ Yaxis_x = yaxis_height;
+ }
+ values[0] = xminval;
+ values[1] = xmaxval;
+ values[2] = (values[1] - values[0]) / x_major;
+ label_format(values, 3, label_field, &digits_left, &digits_right, &exp_flag);
+ delta = (width-1) / x_major;
+ y = yupleft + height + label_height/2;
+ value = xminval;
+ for (i = 0; i <= x_major; i++)
+ {
+ ftos(value, digits_left, digits_right, exp_flag, text);
+ x = xupleft + i*delta - strlen(text) * label_width / 2;
+ drawText (x, y+8, text);
+ value += values[2];
+ if (x_major > 5)
+ {
+ i++;
+ value += values[2];
+ // if (x_major > 9) {
+ // i++;
+ // value += values[2];
+ //}
+ }
+ }
+// set_font(font);
+ return 0;
+}
+
+int TeGraphPlot :: plot_title(char *text)
+{
+ int font;
+ if ((font = set_font(title_font)) == ERR) return ERR;
+ plot_horiz(text, Title_y, title_width);
+ set_font(font);
+ return 0;
+}
+
+int TeGraphPlot :: plot_xaxis(char *text)
+{
+ int font;
+ if ((font = set_font(xaxis_font)) == ERR) return ERR;
+ plot_horiz(text, Xaxis_y, xaxis_width);
+ set_font(font);
+ return 0;
+}
+
+void
+TeGraphPlot :: plot_horiz(char *text, int y, int w)
+{
+ int x, l, count;
+ char *ptr = NULL,buffer[80];
+ setTextColor(Graph_color.text);
+ l = strlen(text);
+ x = xupleft + (width-1)/2 - (l * w)/2;
+ ptr = text;
+ if (x < xupleft) {
+ count = (xupleft - x)/w;
+ buffer[79] = '\0';
+ strncpy(buffer, text, sizeof(buffer)-1);
+ buffer[l-count-1] = '\0';
+ x = xupleft;
+ ptr = buffer;
+ }
+ drawText (x, y, ptr);
+ ptr = NULL;
+}
+
+int
+TeGraphPlot :: plot_yaxis(char *text)
+{
+ int y, length, count, font, delta;
+ char *ptr= NULL, buffer[80], c[2];
+ setTextColor(Graph_color.text);
+ c[0] = '*'; c[1] = '\0';
+ if ((font = set_font(yaxis_font)) == ERR) return ERR;
+ length = strlen(text);
+ ptr = text;
+ delta = yaxis_direct == HORIZ_FONT ?
+ yaxis_height : yaxis_width;
+ y = (Title_y + Xaxis_y + delta * length) / 2;
+ buffer[79] = '\0';
+ strncpy(buffer, text, sizeof(buffer)-1);
+ if (y < Title_y)
+ {
+ count = 2 * (Title_y - y)/delta;
+ buffer[length-count-1] = '\0';
+ y = Title_y;
+ ptr = buffer;
+ }
+ if (yaxis_direct == HORIZ_FONT)
+ {
+ while (*ptr != '\0')
+ {
+ c[0] = *ptr++;
+ drawText (Yaxis_x, y, c);
+ y += yaxis_height;
+ }
+ }
+ else
+ drawText (Yaxis_x, y, ptr, 90.);
+ ptr = NULL;
+
+ set_font(font);
+ return 0;
+}
+
+int
+TeGraphPlot :: plot_curve(Real_Vector x, Real_Vector y,int points,TeColor c)
+{
+ int i, count;
+
+ setLineAttributes(c,TeLnTypeContinuous,0);
+
+ count = plot_point(x[0], y[0], PEN_UP);
+ for (i = 1; i < points; i++)
+ count += plot_point(x[i], y[i], PEN_DOWN);
+ return count;
+}
+
+int
+TeGraphPlot :: plot_point(Real x_value, Real y_value, int pen_status)
+{
+ static Real last_x_value, last_y_value;
+ static int last_x, last_y;
+ Real temp_x, temp_y;
+ int x, y, status=0;
+
+ if (point_visible(x_value, y_value))
+ {
+ value_to_pixel(x_value, y_value, &x, &y);
+ if (pen_status == PEN_UP)
+ {
+// SET_PIXEL(x, y, color);
+ }
+ else
+ {
+ if (!point_visible(last_x_value, last_y_value))
+ {
+ temp_x = last_x_value;
+ temp_y = last_y_value;
+ find_intersect(x_value, y_value, &temp_x, &temp_y);
+ value_to_pixel(temp_x, temp_y, &last_x, &last_y);
+ }
+ if (last_y_value < TeMAXFLOAT)
+ drawLine(last_x, last_y, x, y);
+ }
+ last_x = x;
+ last_y = y;
+ status = 1;
+ }
+ else if (pen_status == PEN_DOWN && point_visible(last_x_value, last_y_value))
+ {
+ if (y_value < TeMAXFLOAT)
+ {
+ temp_x = x_value;
+ temp_y = y_value;
+ find_intersect(last_x_value, last_y_value, &temp_x, &temp_y);
+ value_to_pixel(temp_x, temp_y, &x, &y);
+ drawLine(last_x, last_y, x, y);
+ }
+ status = 0;
+ }
+ last_x_value = x_value;
+ last_y_value = y_value;
+ return status;
+}
+
+int
+TeGraphPlot :: plotSymbol(Real x_value, Real y_value, int symbol, int w, int h, int curve)
+{
+ int x, y;
+
+ setLineAttributes(Graph_color.symbol[curve],TeLnTypeContinuous,1);
+
+ if (point_visible(x_value, y_value))
+ {
+ value_to_pixel(x_value, y_value, &x, &y);
+ draw_symbol(x, y, symbol, w, h);
+ return true;
+ }
+ return false;
+}
+
+void
+TeGraphPlot :: draw_symbol(int x, int y,int symbol, int w, int h)
+{
+ if( symbol < 0 ) //V2.0-01 GAIA
+ {
+ symbol = 0;
+ }
+ symbol = symbol % 5; //V2.0-01 GAIA
+
+ switch (symbol)
+ {
+ case RECTANGLE:
+ drawLine(x - w/2, y - h/2, x + w/2, y - h/2);
+ drawLine(x + w/2, y - h/2, x + w/2, y + h/2);
+ drawLine(x + w/2, y + h/2, x - w/2, y + h/2);
+ drawLine(x - w/2, y + h/2, x - w/2, y - h/2);
+ break;
+
+ case TRIANGLE:
+ drawLine(x - w/2, y + h/2, x, y - h/2);
+ drawLine(x, y - h/2, x + w/2, y + h/2);
+ drawLine(x + w/2, y + h/2, x - w/2, y + h/2);
+ break;
+
+ case DIAMOND:
+ drawLine(x - w/2, y, x, y - h/2);
+ drawLine(x, y - h/2, x + w/2, y);
+ drawLine(x + w/2, y, x, y + h/2);
+ drawLine(x, y + h/2, x - w/2, y);
+ break;
+
+ case SCROSS:
+ drawLine(x - w/2, y, x + w/2, y);
+ drawLine(x, y - h/2, x, y + h/2);
+ break;
+
+ case XCROSS:
+ drawLine(x - w/2, y + h/2, x + w/2, y - h/2);
+ drawLine(x - w/2, y - h/2, x + w/2, y + h/2);
+ break;
+ }
+}
+
+
+void TeGraphPlot :: draw_symbol_legend(int x, int y, int symbol, int w, int h)
+{
+ if( symbol < 0 ) //V2.0-01 GAIA
+ {
+ symbol = 0;
+ }
+ symbol = symbol % 5; //V2.0-01 GAIA
+
+ switch (symbol)
+ {
+ case RECTANGLE:
+ drawLine(x - w/2, y - h/2, x + w/2, y - h/2);
+ drawLine(x + w/2, y - h/2, x + w/2, y + h/2);
+ drawLine(x + w/2, y + h/2, x - w/2, y + h/2);
+ drawLine(x - w/2, y + h/2, x - w/2, y - h/2);
+ break;
+
+ case TRIANGLE:
+ drawLine(x - w/2, y + h/2, x, y - h/2);
+ drawLine(x, y - h/2, x + w/2, y + h/2);
+ drawLine(x + w/2, y + h/2, x - w/2, y + h/2);
+ break;
+
+ case DIAMOND:
+ drawLine(x - w/2, y, x, y - h/2);
+ drawLine(x, y - h/2, x + w/2, y);
+ drawLine(x + w/2, y, x, y + h/2);
+ drawLine(x, y + h/2, x - w/2, y);
+ break;
+
+ case SCROSS:
+ drawLine(x - w/2, y, x + w/2, y);
+ drawLine(x, y - h/2, x, y + h/2);
+ break;
+
+ case XCROSS:
+ drawLine(x - w/2, y + h/2, x + w/2, y - h/2);
+ drawLine(x - w/2, y - h/2, x + w/2, y + h/2);
+ break;
+ }
+}
+
+
+void
+TeGraphPlot :: label_format(Real values[], int nvalues, int field_width,
+ int *digits_left, int *digits_right, int *exp_flag)
+{
+ char *str = NULL;
+ int i, j, digits, decimal, sign, trail0;
+
+ digits = sizeof(Real) == sizeof(float) ? FLT_DIG : DBL_DIG;
+ *digits_left = *digits_right = *exp_flag = 0;
+ for (i = 0; i < nvalues && *exp_flag == 0; i++) {
+ str = ecvt(values[i], digits, &decimal, &sign);
+ if (decimal > *digits_left) *digits_left = decimal;
+ for (j = digits-1, trail0 = 0; j >= 0 && str[j] == '0'; j--) trail0++;
+ j = digits - trail0 - decimal;
+ if (j > *digits_right) *digits_right = j;
+ if (*digits_right + *digits_left > field_width-2) {
+ *exp_flag = 1;
+ *digits_left = 1;
+ *digits_right = field_width - 8;
+ if (*digits_right < 0) *digits_right = 0;
+ }
+ }
+ str = NULL;
+}
+
+void TeGraphPlot :: find_intersect(Real x_in, Real y_in,
+ Real *x_out, Real *y_out)
+{
+ // find values for x_out and y_out that intersect the
+ // plot boundary on a line between the points (x_in, y_in) inside
+ // the plot region and (x_out, y_out) outside the plot region
+
+ Real m, b, temp_x, temp_y;
+ m = (y_in - *y_out) / (x_in - *x_out);
+ b = y_in - m * x_in;
+ if (*x_out >= xminval && *x_out <= xmaxval) {
+ // only y_out is outside plot region
+ if (*y_out < yminval) *y_out = yminval;
+ else if (*y_out > ymaxval) *y_out = ymaxval;
+ *x_out = (*y_out - b) / m;
+ }
+ else
+ {
+ if (*y_out >= yminval && *y_out <= ymaxval) {
+ // only x_out is outside plot region
+ if (*x_out < xminval) *x_out = xminval;
+ else if (*x_out > xmaxval) *x_out = xmaxval;
+ *y_out = *x_out * m + b;
+ }
+ else
+ {
+ // both x_out and y_out are outside plot region
+ if (*y_out < yminval) temp_y = yminval;
+ else temp_y = ymaxval;
+ temp_x = (temp_y - b) / m;
+ if (temp_x >= xminval && temp_x <= xmaxval) {
+ *y_out = temp_y;
+ *x_out = temp_x;
+ }
+ else {
+ if (*x_out < xminval) *x_out = xminval;
+ else *x_out = xmaxval;
+ *y_out = *x_out * m + b;
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------------------
+void
+TeGraphPlot :: drawLegend(void)
+{
+ int x, y, h, delta;
+ int i, count = 0;
+
+ for (i = 0; i < Plot_curves; i++)
+ {
+ if (Plot_label.curve[i][0] != '\0') count++;
+ }
+
+ if (count != 0)
+ {
+ h = Font_height[0] + 4;
+ if (count > 3) h += Font_height[0] + 3;
+ y = getHeight() - h;
+
+ setLineAttributes(Graph_color.lines,TeLnTypeContinuous,0);
+ drawRectangle(0, y, width - 1, h);
+
+ x = Font_width[0] + 1;
+ delta = Font_height[0] + 3;
+ for (count = 0, i = 0; i < Plot_curves; i++)
+ {
+ if (Plot_label.curve[i][0] != '\0' && count < 7)
+ {
+ if (count++ == 3) {
+ x = Font_width[0] + 1;
+ y += Font_height[0] + 6;
+ }
+
+ setLineAttributes(Graph_color.curve[i],TeLnTypeContinuous,0);
+ draw_symbol_legend(x, y + delta - Font_height[0]/2, Symbol[i], 7, 7);
+ x += Font_width[0];
+
+ setTextColor(Graph_color.text);
+ drawText (x, y + delta - Font_height[0], Plot_label.curve[i]);
+ x += 10 * Font_width[0];
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------------------
+void
+TeGraphPlot :: value_to_pixel(Real x_value, Real y_value, int *x_pixel, int *y_pixel)
+{
+ *x_pixel = (int) ((x_value - xminval) /
+ (xmaxval - xminval) * (width - 1) + xupleft);
+ *y_pixel = (int) ((ymaxval - y_value) /
+ (ymaxval - yminval) * (height - 1) + yupleft);
+}
+
+//----------------------------------------------------------------------------------------
+void
+TeGraphPlot :: pixelToValue(int x_pixel, int y_pixel, Real& x_value, Real& y_value)
+{
+ x_value = (Real) (x_pixel - xupleft) / (width-1) *
+ (xmaxval - xminval) + xminval;
+ y_value = (Real) (yupleft - y_pixel) / (height-1) *
+ (ymaxval - yminval) + ymaxval;
+}
+
+//----------------------------------------------------------------------------------------
+int
+TeGraphPlot :: point_visible(Real x, Real y)
+{
+ if (x >= xminval && x <= xmaxval &&
+ y >= yminval && y <= ymaxval) return 1;
+ else return 0;
+}
+
+//FAMI0395 int set_font(int font_number)
+int set_font(int)
+{
+/*
+ static int font;
+ int previous_font;
+ // set font to specified font number
+ if (_set_font(font_number) == 0) {
+ previous_font = font;
+ font = font_number;
+ return previous_font;
+ }
+ else {
+ video_err = FONT_ERR;
+ return ERR;
+ } */
+
+ return (int)true; //FAMI0394
+}
+
+void ftos(Real f, int digits_left, int digits_right, int exp_flag, char *s)
+{
+ int i = 0, decimal, sign;
+ char *str = NULL;
+ str = ecvt(f, digits_left+digits_right, &decimal, &sign);
+ if (sign) *s++ = '-';
+ if (exp_flag)
+ { /* exponential format */
+ for (i=0; i < digits_left; i++) *s++ = *str++;
+ *s++ = '.';
+ for (i=0; i < digits_right; i++) *s++ = *str++;
+ *s++ = 'e';
+ decimal -= digits_left;
+ if (decimal < 0)
+ {
+ *s++ = '-';
+ decimal = -decimal;
+ }
+ else *s++ = '+';
+ s += 3;
+ *s-- = '\0';
+ for (i = 0; i < 3; i++)
+ {
+ *s-- = (char) (decimal % 10 + (int) '0');
+ decimal /= 10;
+ }
+ }
+ else
+ { /* fixed point format */
+ if (decimal <= 0)
+ {
+ if (digits_left > 0) *s++ = '0';
+ if (digits_right > 0) *s++ = '.';
+ for (i = decimal; i != 0 && digits_right > 0 ; i++)
+ {
+ *s++ = '0';
+ digits_right--;
+ }
+ for (i = 0; i < digits_right; i++) *s++ = *str++;
+ }
+ else
+ {
+ for (i = 0; i < decimal; i++) *s++ = *str++;
+ if (digits_right > 0)
+ {
+ *s++ = '.';
+ for (i = 0; i < digits_right; i++) *s++ = *str++;
+ }
+ }
+ *s = '\0';
+ }
+ str = NULL;
+}
+
+//----------------------------------------------------------------------------------------
+
+void
+TeGraphPlot :: plotInit(int pixels_above, int pixels_below, int pixels_left, int pixels_right)
+{
+// initialize Plot variables, reserving the number of pixels specified by
+// pixels_above, pixels_below, pixels_left, and pixels_right for use by
+// the program
+
+ int delta, x_ticks, y_ticks;
+
+// initialize variables appropriately for current plotting device
+ X_pixels = getWidth ();
+ Y_pixels = getHeight ();
+
+ get_plot_fonts();
+ get_font_size(title_font, &title_width, &title_height);
+ get_font_size(label_font, &label_width, &label_height);
+ get_font_size(xaxis_font, &xaxis_width, &xaxis_height);
+ yaxis_direct = get_font_size(yaxis_font, &yaxis_width, &yaxis_height);
+ delta = yaxis_direct == HORIZ_FONT ? yaxis_width : yaxis_height;
+ xupleft = pixels_left + delta + (label_field + 1) * label_width;
+ delta = title_height + label_height/2;
+ yupleft = pixels_above + delta + title_height;
+ Title_y = yupleft - delta;
+
+// make width of Plot region a multiple of x_ticks
+ x_ticks = x_major * x_minor;
+ width = (X_pixels - pixels_right - xupleft -
+ label_field * label_width / 2 + 1)
+ /x_ticks*x_ticks + 1;
+
+// make height of Plot region a multiple of y_ticks
+ y_ticks = y_major * y_minor;
+ delta = 2 * label_height + 1;
+ height = (Y_pixels - pixels_below - yupleft - delta -
+ xaxis_height)/y_ticks*y_ticks + 1;
+
+// define y coordinate for x axis title
+ Xaxis_y = yupleft + height - 1 + delta;
+}
+
+//----------------------------------------------------------------------------------------
+void
+TeGraphPlot :: get_plot_fonts()
+{
+ title_font = 0;
+ label_font = 0;
+ xaxis_font = 0;
+ yaxis_font = 1;
+}
+
+//----------------------------------------------------------------------------------------
+int
+TeGraphPlot :: get_font_size(int font_number, int *w, int *h)
+{
+// return width, height, and direction of specified font number
+ if (font_number < FONT_MAX)
+ {
+ *w = Font_width[font_number];
+ *h = Font_height[font_number];
+ return Font_direct[font_number];
+ }
+ else
+ {
+ return ERR;
+ }
+}
+
+//----------------------------------------------------------------------------------------
+void
+TeGraphPlot :: reset()
+{
+ for (int i=0; i<Plot_curves; i++)
+ {
+ Plot_x[i] = NULL;
+ Plot_y[i] = NULL;
+ }
+
+ Plot_curves = 0;
+ Plot_symbols = 0;
+ Curve_choice = 0;
+ Plot_choice = 0;
+}
+
+void TeGraphPlot::drawMoranText (double dx1, double dy1, double dx2, double dy2)
+{
+ int w, h, x, y;
+ int x1, y1, x2, y2, mx, my;
+
+ setTextColor(Graph_color.text);
+
+ value_to_pixel(dx1, dy1, &x1, &y1);
+ value_to_pixel(dx2, dy2, &x2, &y2);
+ value_to_pixel(0., 0., &mx, &my);
+
+ string tx = "AA";
+ textExtent(tx, w, h);
+ x = (int)(mx + (double)(x2-mx)/2. - (double)w/2.);
+ y = (int)(my - (double)(my-y2)/2. + (double)h/2.);
+ drawText(x, y, (char*)tx.c_str());
+
+ tx = "AB";
+ textExtent(tx, w, h);
+ x = (int)(mx - (double)(mx-x1)/2. - (double)w/2.);
+ drawText(x, y, (char*)tx.c_str());
+
+ tx = "BB";
+ textExtent(tx, w, h);
+ y = (int)(my + (double)(y1-my)/2. + (double)h/2.);
+ drawText(x, y, (char*)tx.c_str());
+
+ tx = "BA";
+ textExtent(tx, w, h);
+ x = (int)(mx + (double)(x2-mx)/2. - (double)w/2.);
+ drawText(x, y, (char*)tx.c_str());
+}
diff --git a/src/terralib/kernel/TeGraph.h b/src/terralib/kernel/TeGraph.h
new file mode 100644
index 0000000..c1813f6
--- /dev/null
+++ b/src/terralib/kernel/TeGraph.h
@@ -0,0 +1,182 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeGraph.h
+ This file deals with graphs in TerraLib
+*/
+
+#ifndef __TERRALIB_INTERNAL_GRAPH_H
+#define __TERRALIB_INTERNAL_GRAPH_H
+
+#include "TeLegendEntry.h"
+#define CURVES_MAX 10
+#define AXIS_MAX 64
+#define TITLE_MAX 64
+#define LABEL_MAX 64
+
+#define XY_ASCII 0
+#define XY_BINARY 1
+#define XYY_ASCII 2
+#define XYY_BINARY 3
+#define PIE_BINARY 4
+#define BAR_BINARY 5
+#define ROSE_BINARY 6
+#define POINT_BINARY 7
+
+#define Real double
+typedef Real* Real_Vector;
+typedef struct {
+ char title[TITLE_MAX+1];
+ char xaxis[AXIS_MAX+1];
+ char yaxis[AXIS_MAX+1];
+ char curve[CURVES_MAX][LABEL_MAX+1];
+} Labels;
+
+class TeGraphPlot
+{
+protected:
+ int label_field; /* maximum no. of characters in a label field */
+ int major_tick; /* length of major tick mark (in pixels) */
+ int minor_tick; /* length of minor tick mark (in pixels) */
+ int x_major; /* number of x axis divisions */
+ int y_major; /* number of y axis divisions */
+ int x_minor; /* number of x axis subdivisions */
+ int y_minor; /* number of y axis subdivisions */
+ Real xminval; /* minimum value on x axis */
+ Real xmaxval; /* maximum value on x axis */
+ Real yminval; /* minimum value on y axis */
+ Real ymaxval; /* maximum value on y axis */
+ int xupleft; /* x pixel coordinate (upper left) */
+ int yupleft; /* y pixel coordinate (upper left) */
+ int width; /* width of axes (in pixels) */
+ int height; /* height of axes (in pixels) */
+ int label_width; /* width of label character */
+ int label_height; /* height of label character */
+ int label_font; /* font number to use for labels */
+ int title_width; /* width of title characters */
+ int title_height; /* height of title characters */
+ int title_font; /* font number to use for title */
+ int xaxis_width; /* width of x axis characters */
+ int xaxis_height; /* height of x axis characters */
+ int xaxis_font; /* font number to use for x axis */
+ int yaxis_width; /* width of y axis characters */
+ int yaxis_height; /* height of y axis characters */
+ int yaxis_font; /* font number to use for y axis */
+ int yaxis_direct; /* direction of y axis characters */
+ int X_pixels; /* number of pixels in horizontal direction */
+ int Y_pixels; /* number of pixels in vertical direction */
+ int Xaxis_y; /* y pixel coordinate of X axis title */
+ int Yaxis_x; /* x pixel coordinate of Y axis title */
+ int Title_y; /* y pixel coordinate of main title */
+
+
+ int Plot_curves; /* number of curves */
+ int Plot_symbols; /* maximum number of symbols on curve */
+ int Curve_choice; /* number of selected curve */
+ int Plot_choice; /* graphics menu item choice */
+ int Plot_points[CURVES_MAX]; /* number of points in each curve */
+ Real_Vector Plot_x[CURVES_MAX]; /* X data points for each curve */
+ Real_Vector Plot_y[CURVES_MAX]; /* Y data points for each curve */
+ Labels Plot_label; /* labels for title, axes, and curves */
+
+ int Scale_curve; /* number of curve to scale (-1 for all) */
+ int Scale_factor; /* used to scale Y axis for printing */
+ int Output_format; /* output format for xywrite */
+ int Input_format[CURVES_MAX]; /* format of file loaded */
+ char Data_filename[13]; /* name of last file loaded */
+ TeLegendEntryVector* sliceVector;/* vector of TeLegendEntry */
+ TeColor GPpcor; /*piechart color */
+ char *GPpieleg;
+ int GPpointwidth, GPpointheight;
+
+// Private members
+
+ void draw_plot(void);
+ void draw_symbols(int curve);
+ void plot_axes(void);
+ void plot_ticks(void);
+ void plot_grid(void);
+ int plot_labels(void);
+ int plot_title(char *text);
+ int plot_xaxis(char *text);
+ int plot_yaxis(char *text);
+ int point_visible(Real x, Real y);
+ void value_to_pixel(Real x_value, Real y_value, int *x_pixel, int *y_pixel);
+ int plot_curve(Real_Vector x, Real_Vector y, int points, TeColor c);
+ void label_format(Real values[], int nvalues, int field_width, int *digits_left, int *digits_right, int *exp_flag);
+ void plot_horiz(char *text, int y, int width);
+ int plot_point(Real x_value, Real y_value, int pen_status);
+ void find_intersect(Real x_in, Real y_in, Real *x_out, Real *y_out);
+ void draw_symbol(int x, int y, int symbol, int width, int height);
+ void draw_symbol_legend(int x, int y, int symbol, int width, int height);
+ void get_plot_fonts();
+ int get_font_size(int font_number, int *width, int *height);
+
+ virtual int getWidth () = 0;
+ virtual int getHeight () = 0;
+ virtual void setLineAttributes(TeColor c, int , int ) = 0;
+ virtual void setFillAreaColor (TeColor c) = 0;
+ virtual void setTextColor (TeColor c) = 0;
+ virtual void fillRectangle (int x, int y, int dx, int dy) = 0;
+ virtual void drawRectangle (int x, int y, int dx, int dy) = 0;
+ virtual void drawLine (int sx, int sy, int dx, int dy) = 0;
+ virtual void drawText (int x, int y, char* str, double angle = 0.) = 0;
+ virtual void fillArc (int xc, int yc, int w, int h, double a1, double a2, TeColor c) = 0;
+ virtual void drawArc (int xc, int yc, int w, int h, double a1, double a2, TeColor c) = 0;
+ virtual void textExtent ( string &str, int &w, int &h, double angle = 0.) = 0;
+
+// Public members
+
+public :
+ TeGraphPlot ();
+ virtual ~TeGraphPlot ();
+ int loadDirect ( int format, int curv, int points, Labels& labels, Real_Vector x, Real_Vector y);
+ void loadHistogram (TeLegendEntryVector& sv, const string& label);
+ void loadPie (TeLegendEntryVector& sv, const string& label);
+ void plotInit( int , int , int , int );
+ void autoScale( void);
+ void setScale( Real x1, Real x2 , Real y1, Real y2);
+ int kill( int order);
+ int plotSymbol( Real x_value, Real y_value,int symbol, int width, int height, int curve=0);
+ void plotCurves (int with_simbols = 0);
+ void pixelToValue( int x_p, int y_p, Real& x_v, Real& y_v);
+ void reset();
+ void setColorGrid( int , int , int );
+ void setColorText( int , int , int );
+ void setColorLine( int , int , int );
+ int setColorCurve( int ,int , int , int );
+ void setColorSymbol( int , int, int, int=-1, int=7, int=7); // r, g, b, curve, width, height
+ void setSymbolType( int, int=0); // type , curve
+ void drawLegend( void);
+ int setGridSize( int );
+ int setGridSize( int, int, int, int );
+ void drawMoranText (double x1, double y1, double x2, double y2);
+
+ void pieLegends ();
+};
+
+// Utility functions
+
+void show_err(char *s);
+void ftos(Real f, int digits_left, int digits_right, int exp_flag, char *s);
+
+#endif
diff --git a/src/terralib/kernel/TeGroupingAlgorithms.cpp b/src/terralib/kernel/TeGroupingAlgorithms.cpp
new file mode 100644
index 0000000..15646a2
--- /dev/null
+++ b/src/terralib/kernel/TeGroupingAlgorithms.cpp
@@ -0,0 +1,112 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeGroupingAlgorithms.h"
+
+void
+TeGroupByUniqueValue(vector<string>& vec, TeAttrDataType tipo, vector<TeSlice>& result, int precision)
+{
+ unsigned int i, j;
+
+ if (tipo == TeINT)
+ {
+ vector<int> v;
+ for (i = 0; i < vec.size(); ++i)
+ v.push_back(atoi(vec[i].c_str()));
+ sort(v.begin(), v.end());
+
+ for (i = 0; i < v.size(); ++i)
+ vec[i] = Te2String(v[i]);
+ }
+ else if (tipo == TeREAL)
+ {
+ vector<double> v;
+ for (i = 0; i < vec.size(); ++i)
+ {
+ double a = atof(vec[i].c_str());
+ v.push_back(a);
+ }
+ stable_sort(v.begin(), v.end());
+
+ for (i = 0; i < v.size(); ++i)
+ vec[i] = Te2String(v[i], precision);
+ }
+ else
+ {
+ sort(vec.begin(), vec.end());
+ }
+
+ // Check the elements that are equal, incrementing
+ // the variable count associated to each one
+ int count = 1;
+ TeSlice slice;
+ unsigned int sz = vec.size();
+ for (i = 0, j = 1; i < sz - 1 && j < sz; ++i, ++j)
+ {
+ if (vec[i] == vec[j])
+ ++count;
+ else
+ {
+ slice.from_ = vec[i];
+ slice.count_ = count;
+ result.push_back(slice);
+ count = 1;
+ }
+ }
+
+ if (vec[i] == vec[i - 1])
+ {
+ slice.from_ = vec[i];
+ slice.count_ = count;
+ result.push_back(slice);
+ }
+ else
+ {
+ slice.from_ = vec[i];
+ slice.count_ = 1;
+ result.push_back(slice);
+ }
+}
+
+void
+TeGroupByEqualStep(double min, double max, int nstep, vector<TeSlice>& result, int precision)
+{
+ double slice = (max - min)/double(nstep);
+ int ns;
+ for (ns=0;ns<nstep;ns++)
+ {
+ TeSlice ps;
+ ps.count_ = 0;
+ ps.from_ = Te2String(min+double(ns)*slice, precision);
+ ps.to_ = Te2String(min+double(ns+1)*slice, precision);
+ result.push_back(ps);
+ }
+ min = TeAdjustToPrecision(min, precision, true);
+ result[0].from_ = Te2String(min, precision);
+ max = TeAdjustToPrecision(max, precision);
+ result[result.size()-1].to_ = Te2String(max, precision);
+}
diff --git a/src/terralib/kernel/TeGroupingAlgorithms.h b/src/terralib/kernel/TeGroupingAlgorithms.h
new file mode 100644
index 0000000..964789c
--- /dev/null
+++ b/src/terralib/kernel/TeGroupingAlgorithms.h
@@ -0,0 +1,280 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeGroupingAlgorithms.h
+ This file contains some generic grouping algorithms (based on iterators)
+*/
+
+#ifndef __TERRALIB_INTERNAL_GROUPINGALGORITHMS_H
+#define __TERRALIB_INTERNAL_GROUPINGALGORITHMS_H
+
+#include "TeDefines.h"
+#include "TeSlice.h"
+#include "TeUtils.h"
+#include "TeDataTypes.h"
+
+#include <math.h>
+#include <time.h>
+#include <algorithm>
+
+
+//! Finds the element with minimum value among the elements contained in a range of iterators
+template<typename It> void
+TeMinimumValue(It begin, It end, vector<double>& minValue, double dummy=-9999.99, bool usesDummy=false)
+{
+ for (int i=0; i<minValue.size(); i++)
+ minValue[i] = TeMAXFLOAT;
+
+ It it = begin;
+ double val;
+ while ( it != end)
+ {
+ if (!(usesDummy && dummy == val))
+ for (int i=0; i<minValue.size(); i++)
+ {
+ val= (*it)[i];
+ if (val < minValue[i])
+ minValue[i] = val;
+ }
+ it++;
+ }
+}
+
+//! Finds the element with maximum value among the elements contained in a range of iterators
+template<typename It> void
+TeMaximumValue(It begin, It end, vector<double>& maxValue, double dummy=-9999.99, bool usesDummy=false)
+{
+ for (int i=0; i<maxValue.size(); i++)
+ maxValue[i] = -TeMAXFLOAT;
+
+ It it = begin;
+ double val;
+ while ( it != end)
+ {
+ if (!(usesDummy && dummy == val))
+ for (int i=0; i<maxValue.size(); i++)
+ {
+ val= (*it)[i];
+ if (val > maxValue[i])
+ maxValue[i] = val;
+ }
+ it++;
+ }
+}
+
+void
+TeGroupByEqualStep(double min, double max, int nstep, vector<TeSlice>& result, int precision=0);
+
+/** @defgroup GenGroupAlg Generic Algorithms to do grouping
+ * A set of of generic functions to do grouping
+ * @{
+ */
+
+//! Groups a set of elements defined by a range of iterators in nstep groups, using Equal Step algorithm
+template<class iterator> void
+TeGroupByEqualStep(iterator begin, iterator end, int nstep, vector<TeSlice>& result,
+ int precision=0, bool countElements = true)
+{
+ double min = TeMAXFLOAT;
+ double max = -TeMAXFLOAT;
+
+ iterator it=begin;
+ while(it < end)
+ {
+ min = MIN(min, *it);
+ max = MAX(max, *it);
+ it++;
+ }
+ double slice = (max - min)/double(nstep);
+ int ns;
+ for (ns=0;ns<nstep;ns++)
+ {
+ TeSlice ps;
+ ps.count_ = 0;
+ ps.from_ = Te2String(min+double(ns)*slice, precision);
+ ps.to_ = Te2String(min+double(ns+1)*slice, precision);
+ result.push_back(ps);
+ }
+ min = TeAdjustToPrecision(min, precision, true);
+ result[0].from_ = Te2String(min, precision);
+ max = TeAdjustToPrecision(max, precision);
+ result[result.size()-1].to_ = Te2String(max, precision);
+
+ // Set the number of elements for each slice
+ if (countElements == true)
+ TeElemCountingBySlice(begin, end, result);
+}
+
+//! Groups a set of elements defined by a range of iterators in nstep groups, using Quantil algorithm
+template<class iterator> void
+TeGroupByQuantil(iterator begin, iterator end, int nstep, vector<TeSlice>& result,
+ int precision = 0, bool countElements = true)
+{
+ sort(begin, end);
+
+ int size = end - begin;
+ double step = (double)size / (double)nstep;
+
+ int n = 0;
+ iterator it = begin;
+ while(it < end)
+ {
+ TeSlice ps;
+ ps.from_ = Te2String((*it), precision);
+ int p = (int)(step * (double)++n + .5);
+ it = begin + p;
+ if(it < end)
+ ps.to_ = Te2String((*it), precision);
+ else
+ ps.to_ = Te2String(*(it-1), precision);
+ result.push_back(ps);
+ }
+ if(end-begin > 1)
+ {
+ double min = (*begin);
+ double max = (*(end-1));
+ min = TeAdjustToPrecision(min, precision, true);
+ result[0].from_ = Te2String(min, precision);
+ max = TeAdjustToPrecision(max, precision);
+ result[result.size()-1].to_ = Te2String(max, precision);
+ }
+
+ // Set the number of elements for each slice
+ if (countElements == true)
+ TeElemCountingBySlice(begin, end, result);
+}
+
+//! Groups a set of elements defined by a range of iterators in ndev groups, using Standanrd deviation algorithm
+template<class iterator> void
+TeGroupByStdDev(iterator begin, iterator end, double ndev, vector<TeSlice>& result, string& rmean,
+ int precision = 0, bool countElements = true)
+{
+ // Compute mim, max and mean
+ double min = TeMAXFLOAT;
+ double max = -TeMAXFLOAT;
+ long double sum=0.;
+ long double sm2=0.;
+ iterator it=begin;
+ while(it < end)
+ {
+ min = MIN(min, *it);
+ max = MAX(max, *it);
+ sum += (*it);
+ sm2 += ((*it) * (*it));
+ it++;
+ }
+ double cont = (double)(end - begin);
+ double mean = (double)(sum/cont);
+ long double var = (sm2 / cont) - (mean * mean);
+ double sdev = sqrt(var);
+
+ double slice = sdev * ndev;
+
+ vector<TeSlice> aux;
+ rmean = Te2String(mean, precision);
+ double val = mean;
+ while(val-slice > min-slice)
+ {
+ TeSlice ps;
+ double v = val - slice;
+ ps.from_ = Te2String(v, precision);
+ ps.to_ = Te2String(val, precision);
+ aux.push_back(ps);
+ val = v;
+ }
+
+ if(aux.size())
+ {
+ typename vector<TeSlice>::iterator sit = aux.end() - 1;
+ while(sit >= aux.begin())
+ result.push_back(*sit--);
+ }
+
+ string media = "mean = " + rmean;
+ TeSlice ps;
+ ps.from_ = media;
+ ps.to_.clear();
+ result.push_back(ps);
+ val = mean;
+ while(val+slice < max+slice)
+ {
+ TeSlice ps;
+ double v = val + slice;
+ ps.from_ = Te2String(val, precision);
+ ps.to_ = Te2String(v, precision);
+ result.push_back(ps);
+ val = v;
+ }
+ if(result.size() > 2)
+ {
+ if (result[0].from_.find("mean") == string::npos)
+ {
+ min = TeAdjustToPrecision(min, precision, true);
+ result[0].from_ = Te2String(min, precision);
+ }
+ if (result[result.size()-1].from_.find("mean") == string::npos)
+ {
+ max = TeAdjustToPrecision(max, precision);
+ result[result.size()-1].to_ = Te2String(max, precision);
+ }
+ }
+
+ // Set the number of elements for each slice
+ if (countElements == true)
+ TeElemCountingBySlice(begin, end, result);
+}
+
+
+template<class iterator> void
+TeElemCountingBySlice(iterator begin, iterator end, vector<TeSlice>& result)
+{
+ iterator it;
+ double from, to;
+
+ for (unsigned int i = 0; i < result.size(); ++i)
+ {
+ TeSlice& sl = result[i];
+ sl.count_ = 0;
+ from = atof(sl.from_.c_str());
+ to = atof(sl.to_.c_str());
+ for (it = begin; it != end; ++it)
+ {
+ if (*it >= from && *it < to)
+ ++sl.count_;
+ }
+ }
+}
+
+
+//! Groups a set of elements in a vector of string using Unique Value algorithm
+void TeGroupByUniqueValue(vector<string>& vec, TeAttrDataType tipo, vector<TeSlice>& result, int precision);
+
+/** @} */
+#endif
+
+
+
+
+
+
+
+
diff --git a/src/terralib/kernel/TeImportRaster.cpp b/src/terralib/kernel/TeImportRaster.cpp
new file mode 100644
index 0000000..ef9daa8
--- /dev/null
+++ b/src/terralib/kernel/TeImportRaster.cpp
@@ -0,0 +1,309 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeRasterRemap.h"
+#include "TeDecoderDatabase.h"
+#include "TeRaster.h"
+#include "TeDecoderMemory.h"
+#include "TeRasterParams.h"
+#include "TeProgress.h"
+#include "TeVectorRemap.h"
+#include "TeImportRaster.h"
+
+
+TeLayer*
+TeImportRaster (const string& layerName, TeRaster* rasterIn, TeDatabase* database)
+{
+ if (!database || layerName.empty() || !rasterIn ||
+ (rasterIn->status() != TeREADYTOREAD && rasterIn->status() != TeREADYTOWRITE))
+ return 0;
+
+ // find a valid layer name
+ string newLayerName = layerName;
+ TeLayerMap& layerMap = database->layerMap();
+ TeLayerMap::iterator it;
+ bool flag = true;
+ int n = 1;
+ while (flag)
+ {
+ for (it = layerMap.begin(); it != layerMap.end(); ++it)
+ {
+ if (TeStringCompare(it->second->name(),newLayerName))
+ break;
+ }
+ if (it == layerMap.end())
+ flag = 0;
+ else
+ newLayerName = layerName + "_" +Te2String(n);
+ n++;
+ }
+
+ TeLayer* newLayer = new TeLayer(newLayerName,database,rasterIn->projection());
+ if (newLayer->id() <= 0 )
+ return 0; // couldn�t create new layer
+
+ unsigned int bw = rasterIn->params().ncols_;
+ unsigned int bh = 1;
+ if (rasterIn->params().nlines_ > 128 || rasterIn->params().ncols_ > 128)
+ {
+ bw = 128;
+ bh = 128;
+ }
+
+ bool res = TeImportRaster(newLayer, rasterIn, bw, bh, TeNoCompression,
+ "", rasterIn->params().dummy_[0], false, TeNoExpansible);
+ if (res)
+ return newLayer;
+
+ database->deleteLayer(newLayer->id());
+ delete newLayer;
+ return 0;
+}
+
+
+// This function mosaics an input raster to one previsously existing in a TerraLib layer
+bool TeMosaicRaster(TeRaster* rasterIn, TeLayer* layer, const string& objectId)
+{
+ // layer must exist and input raster should be read to be read
+ if (!layer || !rasterIn || rasterIn->status() != TeREADYTOREAD)
+ return false;
+
+ TeRaster* rasterOut;
+ if (!objectId.empty()) // if object id informed try to get raster associated to it
+ rasterOut = layer->raster(objectId,'w');
+ else // else try to get first one found
+ rasterOut = layer->raster();
+
+ if (!rasterOut) // no raster asked or no raster at all
+ return false; // can not do mosaic
+
+ // allows mosaic of same photometric types only
+ if (rasterOut->params().photometric_[0] != rasterIn->params().photometric_[0])
+ return false;
+
+ // increases output box to: input raster box + output raster box
+ TeBox boxIn = rasterIn->params().box();
+
+ // if necessary remap input box to output projection
+ if (!(*(rasterIn->projection()) == *(rasterOut->projection())))
+ boxIn = TeRemapBox(boxIn,rasterIn->projection(),rasterOut->projection());
+
+ // adjust it to expansible values
+ boxIn = adjustToCut(boxIn, rasterOut->params().blockWidth_*rasterOut->params().resx_,
+ rasterOut->params().blockHeight_*rasterOut->params().resy_);
+
+ // sum stored and input boxes
+ TeBox newBox = rasterOut->params().boundingBox();
+ updateBox(newBox,boxIn);
+
+ // update box in parameters of the raster and it's decoder
+ rasterOut->params().boundingBoxResolution(newBox.x1_,newBox.y1_,newBox.x2_,newBox.y2_,
+ rasterOut->params().resx_, rasterOut->params().resy_);
+
+ rasterOut->decoder()->params().boundingBoxResolution(newBox.x1_,newBox.y1_,newBox.x2_,newBox.y2_,
+ rasterOut->params().resx_, rasterOut->params().resy_);
+ rasterOut->params().nTilesInMemory_ = 0;
+
+ // creates a remapping from input raster to output raster
+ TeRasterRemap remap(rasterIn, rasterOut);
+ if (remap.apply(true)) // o.k.
+ {
+ TeRasterParams rp = rasterOut->params();
+
+ // atualizes the representation box in memory
+ TeRepresentation* repp = layer->getRepresentation(TeRASTER);
+ TeBox boxNew = rp.box();
+ updateBox(repp->box_,rp.box());
+ repp->nCols_ = rp.ncols_;
+ repp->nLins_ = rp.nlines_;
+ repp->resX_ = rp.resx_;
+ repp->resY_ = rp.resy_;
+
+ // atualizes representation in the database
+ layer->database()->updateRasterRepresentation(layer->id(),rp,objectId);
+ layer->updateLayerBox(rp.boundingBox());
+ rasterOut->clear();
+ return true;
+ }
+ return false;
+}
+
+
+bool TeImportRaster (TeLayer* layer, TeRaster* rasterIn,
+ unsigned int bWidth, unsigned int bHeight,TeCompressionMode compress,
+ const string& objectId, double dummy, bool useDummy,
+ TeRasterTilingType indext)
+{
+ if (!layer || !rasterIn)
+ return false;
+
+ string objId;
+ if (objectId.empty())
+ objId = "O1";
+ else
+ objId = objectId;
+
+ // check if there is a raster geometry to be modified
+ string tableGeo;
+ TeRepresentation* repp = 0;
+ repp = layer->getRepresentation(TeRASTER);
+ if (!repp || !layer->raster(objectId)) // layer doesn�t have any
+ { // or the desired raster geometry
+ // a new one should be created
+
+ TeRasterParams parOut = rasterIn->params(); // parameters of the raster being created
+ // start with the same parameters as input raster
+
+ parOut.setCompressionMode(compress); // overwrites some parameters
+ parOut.nTilesInMemory_ = 0; // according to the specified in the interface
+ parOut.blockHeight_ = bHeight;
+ parOut.blockWidth_ = bWidth;
+ parOut.setDummy(dummy);
+ parOut.useDummy_ = useDummy;
+ parOut.tiling_type_ = indext;
+
+ parOut.dxI_= 0.0; // raster stored is corrected
+ parOut.dyJ_= 0.0; // to translation/rotation
+ parOut.dxJ_ = 0.0;
+ parOut.dyI_ = 0.0;
+
+ TeBox newBox = rasterIn->params().boundingBox();
+ TeProjection *projIn = rasterIn->projection();
+ TeProjection *projOut = layer->projection();
+ parOut.projection(projOut);
+ if (projIn && projOut && !(*projIn == *projOut))
+ {
+ TeBox boxIn = rasterIn->params().boundingBox();
+ newBox = TeRemapBox (boxIn,projIn,projOut);
+ parOut.resx_ = newBox.width()/parOut.ncols_; // recalculates resolutions
+ parOut.resy_ = newBox.height()/parOut.nlines_; // for the new projection
+ parOut.boundingBoxResolution(newBox.x1_,newBox.y1_,newBox.x2_,newBox.y2_,parOut.resx_,parOut.resy_);
+ newBox = parOut.box();
+ }
+
+ if (indext == TeExpansible) // if mosaicable adjust box
+ parOut.resizeToTiling(newBox,bWidth,bHeight); // to be cut in blocks of bWidth X bHeight (in projection units)
+
+ parOut.decoderIdentifier_ = "DB"; // parameters of the decoder
+ parOut.fileName_ = "RasterLayer" + Te2String(layer->id()) + "_R_" + objId;
+
+ if ((parOut.photometric_[0] == TeRASTERPALETTE
+ || parOut.photometric_[0] == TeRASTERKERNEL))
+ parOut.lutName_ = parOut.fileName_ + "_LUT";
+
+ if (!layer->addRasterGeometry(parOut,objId)) // creates the empty raster geometry
+ return false;
+
+ TeRaster* rasterOut = layer->raster(objId,'w');
+ TeRasterRemap remap(rasterIn, rasterOut);
+ if (remap.apply(true)) // o.k.
+ {
+ TeRasterParams rp = rasterOut->params();
+
+ // atualizes the representation box in memory
+ TeRepresentation* repp = layer->getRepresentation(TeRASTER);
+ TeBox boxNew = rp.box();
+ updateBox(repp->box_,rp.box());
+ repp->nCols_ = rp.ncols_;
+ repp->nLins_ = rp.nlines_;
+ repp->resX_ = rp.resx_;
+ repp->resY_ = rp.resy_;
+
+ // atualizes representation in the database
+ layer->database()->updateRasterRepresentation(layer->id(),rp,objectId);
+ layer->updateLayerBox(rp.boundingBox());
+ rasterOut->clear();
+ return true;
+ }
+ return false;
+ }
+ else
+ {
+ // layer contains already a raster representation associated to the
+ // object id: calls mosaic operation
+ return TeMosaicRaster(rasterIn,layer,objId);
+ }
+}
+
+
+bool
+TeBuildLowerResolution(TeLayer* layer, TeRaster* rasterIn, int resFac, const string& objectId)
+{
+ if (!layer || !rasterIn) // layer and input raster pointers shouldn't be null
+ return false;
+
+ string objId; // if empty try to get the default object identification
+ if (objectId.empty())
+ objId = "O1";
+ else
+ objId = objectId;
+
+ string tableName;
+ TeRepresentation* repp = layer->getRepresentation(TeRASTER);
+ if (repp)
+ {
+ tableName = layer->database()->getRasterTable(layer->id(), objId);
+ if (tableName.empty())
+ return false; // layer doesn�t have a raster geometry to this object id
+ }
+ else
+ return false; // layer doesn�t have any raster geometry
+
+ // retrieves the original raster
+ TeRaster* originalRaster = layer->raster(objId);
+ TeBox bbOriginalRes = originalRaster->params().boundingBox();
+
+ // builds some parameters relative to the new resolution
+ TeRasterParams parNewRes = originalRaster->params();
+ parNewRes.resolution_ = resFac;
+ parNewRes.mode_ = 'w';
+ parNewRes.boundingBoxResolution(bbOriginalRes.x1_, bbOriginalRes.y1_,bbOriginalRes.x2_, bbOriginalRes.y2_,
+ parNewRes.resx_*resFac, parNewRes.resy_*resFac);
+
+ // adjust box to tiling in geographical coordinates
+ if (originalRaster->params().tiling_type_ == TeExpansible)
+ {
+ TeBox b = parNewRes.boundingBox();
+ int w = parNewRes.blockWidth_;
+ int h = parNewRes.blockHeight_;
+ parNewRes.resizeToTiling(b, w, h);
+ }
+
+
+ // create a decoder to raster in a TerraLib database
+ TeDecoderDatabase *dbDecoder = new TeDecoderDatabase(parNewRes);
+ dbDecoder->setDB (layer->database());
+
+ TeRaster* rasterOut = new TeRaster();
+ rasterOut->setDecoder(dbDecoder);
+ rasterOut->init();
+
+ // remap;
+ TeRasterRemap remap;
+ remap.setInput(rasterIn);
+ remap.setOutput(rasterOut);
+ bool status = remap.apply(true);
+ rasterOut->clear();
+ delete dbDecoder;
+ return status;
+}
diff --git a/src/terralib/kernel/TeImportRaster.h b/src/terralib/kernel/TeImportRaster.h
new file mode 100644
index 0000000..200908f
--- /dev/null
+++ b/src/terralib/kernel/TeImportRaster.h
@@ -0,0 +1,104 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeImportRaster.h
+ This file contains functions to support importing of
+ raster data into a TerraLib database
+*/
+#ifndef __TERRALIB_INTERNAL_IMPORTRASTER_H
+#define __TERRALIB_INTERNAL_IMPORTRASTER_H
+
+#include "TeDataTypes.h"
+#include "TeRasterParams.h"
+
+#include <string>
+using namespace std;
+
+class TeLayer;
+class TeRaster;
+/** @defgroup RasterFunctions Functions to deal with raster data
+ * @{
+*/
+//! Imports a TeRaster object to a database creationg a new TeLayer
+/*!
+ This function imports a raster to the database, generating a new layer.
+ \param layerName name of the layer to be created
+ \param rasterIn a pointer to the raster representation to be imported
+ \param database a pointer to the database where the raster will be imported
+ \returns a pointer to the generated layer
+*/
+TeLayer*
+TeImportRaster (const string& layerName, TeRaster* rasterIn, TeDatabase* database);
+
+
+//! Imports a TeRaster object to a TeLayer
+/*!
+ This function imports a raster as a geometry of an object of a layer.
+ \param layer pointer to a layer already created
+ \param rasterIn a raster representation
+ \param bWidth width of the blocks used to store the raster
+ \param bHeight height of the blocks used to store the raster
+ \param compress compression type
+ \param objectId object identification associated to this raster
+ \param dummy value to be used as a no data value when importing
+ \param useDummy flag used to indicate that imported raster will have a dummy value
+ \param indext type of tiling used to import raster
+ \returns true or false whether the raster was imported successfully
+*/
+bool
+TeImportRaster (TeLayer* layer, TeRaster* rasterIn, unsigned int bWidth=512, unsigned int bHeight=512,
+ TeCompressionMode compress = TeNoCompression, const string& objectId="", double dummy=255,bool useDummy = false, TeRasterTilingType indext=TeNoExpansible);
+
+//! This function mosaics an input raster to one previsously existing in a TerraLib layer
+/*!
+ \param rasterIn a raster representation
+ \param layer pointer to an existing layer
+ \param objectId object identification associated to this raster
+ \returns true or false whether the mosaic operation was successfull
+*/
+bool
+TeMosaicRaster(TeRaster* rasterIn, TeLayer* layer, const string& objectId="");
+
+
+//! Builds a degraded resolution of a raster data
+/*!
+ \param layer pointer to a layer already created
+ \param rasterIn a raster representation
+ \param resFac value to multiply the original resolution
+ \param objectId object identification associated to this raster
+ \returns true or false whether the raster was imported successfully
+*/
+bool
+TeBuildLowerResolution(TeLayer* layer, TeRaster* rasterIn, int resFac, const string& objectId="");
+/** @} */
+
+/** \example ImportRaster1.cpp
+ * This is an example of how to import a raster data to a TerraLib database
+ */
+
+/** \example ImportRaster2.cpp
+ * This is an example of how to build a mosaic of images as a layer in a TerraLib database
+ */
+
+#endif
+
diff --git a/src/terralib/kernel/TeInitQuerierStrategy.cpp b/src/terralib/kernel/TeInitQuerierStrategy.cpp
new file mode 100644
index 0000000..b3b0b38
--- /dev/null
+++ b/src/terralib/kernel/TeInitQuerierStrategy.cpp
@@ -0,0 +1,41 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierDBStr1.h"
+#include "TeQuerierDBStr2.h"
+#include "TeQuerierDBStr3.h"
+#include "TeQuerierSHP.h"
+
+
+void TeInitQuerierStrategies()
+{
+ static TeQuerierDBStr1Factory querierDBStr1("querierDBStr1");
+
+ static TeQuerierDBStr2Factory querierDBStr2("querierDBStr2");
+
+ static TeQuerierDBStr3Factory querierDBStr3("querierDBStr3");
+
+ static TeQuerierSHPFactory querierSHP("querierSHP");
+}
diff --git a/src/terralib/kernel/TeInitQuerierStrategy.h b/src/terralib/kernel/TeInitQuerierStrategy.h
new file mode 100644
index 0000000..6654c0c
--- /dev/null
+++ b/src/terralib/kernel/TeInitQuerierStrategy.h
@@ -0,0 +1,32 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QUERIERINIT_H
+#define __TERRALIB_INTERNAL_QUERIERINIT_H
+
+//! function to init the querier strategies
+void TeInitQuerierStrategies();
+
+
+#endif
+
diff --git a/src/terralib/kernel/TeInitRasterDecoders.cpp b/src/terralib/kernel/TeInitRasterDecoders.cpp
new file mode 100644
index 0000000..9ffaa3a
--- /dev/null
+++ b/src/terralib/kernel/TeInitRasterDecoders.cpp
@@ -0,0 +1,86 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeInitRasterDecoders.h"
+#include "TeDecoderMemoryMap.h"
+#include "TeDecoderMemory.h"
+#include "TeDecoderTIFF.h"
+#ifdef WIN32
+#ifdef _MRSIDSUPPORT
+#include "TeDecoderMrSID.h"
+#endif
+#include "TeDecoderJPEG.h"
+#endif
+#include "TeDecoderDatabase.h"
+#include "TeDecoderFile.h"
+#include "TeDecoderSPR.h"
+#include "TeDecoderASCIIGrid.h"
+
+#include <map>
+
+void
+TeInitRasterDecoders()
+{
+ static TeDecoderDatabaseFactory theDecoderDatabaseFactory("DB");
+
+ static TeDecoderMemoryFactory theDecoderMemoryFactory("MEM");
+
+ static TeDecoderMemoryMapFactory theDecoderMemoryMapFactory("MEMMAP");
+ TeDecoderFactory::instanceName2Dec()["raw"] = "MEMMAP";
+ TeDecoderFactory::instanceName2Dec()["RAW"] = "MEMMAP";
+
+
+ static TeDecoderTIFFFactory theDecoderTIFFFactory("TIF");
+ TeDecoderFactory::instanceName2Dec()["tif"] = "TIF";
+ TeDecoderFactory::instanceName2Dec()["tiff"] = "TIF";
+ TeDecoderFactory::instanceName2Dec()["TIF"] = "TIF";
+ TeDecoderFactory::instanceName2Dec()["TIFF"] = "TIF";
+
+ static TeDecoderSPRFactory theDecoderSPRFactory("SPR");
+ TeDecoderFactory::instanceName2Dec()["spr"] = "SPR";
+ TeDecoderFactory::instanceName2Dec()["SPR"] = "SPR";
+
+ static TeDecoderASCIIGridFactory theDecoderASCIIGridFactory("ASCIIGRID");
+ TeDecoderFactory::instanceName2Dec()["ascii"] = "ASCIIGRID";
+ TeDecoderFactory::instanceName2Dec()["asc"] = "ASCIIGRID";
+ TeDecoderFactory::instanceName2Dec()["ASCII"] = "ASCIIGRID";
+ TeDecoderFactory::instanceName2Dec()["txt"] = "ASCIIGRID";
+ TeDecoderFactory::instanceName2Dec()["TXT"] = "ASCIIGRID";
+
+
+#ifdef WIN32
+ static TeDecoderJPEGFactory theDecoderJPEGFactory("JPEG");
+ TeDecoderFactory::instanceName2Dec()["jpg"] = "JPEG";
+ TeDecoderFactory::instanceName2Dec()["jpeg"] = "JPEG";
+
+ static TeDecoderFileFactory theDecoderFileFactory("RAW");
+
+#ifdef _MRSIDSUPPORT
+ static TeDecoderMrSIDFactory theDecoderMrSIDFactory("MrSID");
+ TeDecoderFactory::instanceName2Dec()["sid"] = "MrSID";
+ TeDecoderFactory::instanceName2Dec()["SID"] = "MrSID";
+ TeDecoderFactory::instanceName2Dec()["Sid"] = "MrSID";
+#endif
+#endif
+
+}
diff --git a/src/terralib/kernel/TeInitRasterDecoders.h b/src/terralib/kernel/TeInitRasterDecoders.h
new file mode 100644
index 0000000..0261eb7
--- /dev/null
+++ b/src/terralib/kernel/TeInitRasterDecoders.h
@@ -0,0 +1,33 @@
+//***********************************************************************
+// TerraLib is a GIS Classes and Functions Library that
+// strongly explores Spatial Database Technologies
+//
+// Copyright � 2002 INPE and Tecgraf/PUC-Rio.
+//
+// This library is free software; you can redistribute it
+// and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation
+// version 2.1.(http://www.opensource.org/licenses/lgpl-license.php)
+//
+//
+//
+// Send questions or suggestions about the TerraLib Project
+// to terralib at dpi.inpe.br .
+//**************************************************************************//
+/*! \file TeInitRasterDecoders.h
+ This file contains functions to deal with the initialization of raster decoding tool
+*/
+#ifndef TeInitRasterDecoders_H
+#define TeInitRasterDecoders_H
+
+//! Initializes the system of decoding raster data in different formats
+/*!
+ Source file should be customized to reflect the formats and identifiers
+ associate to each raster format.
+ This function should be called by all applications that instantiate a
+ TeRaster.
+ \sa TeRaster TeDecoder
+*/
+void TeInitRasterDecoders();
+#endif
+
diff --git a/src/terralib/kernel/TeIntersector.cpp b/src/terralib/kernel/TeIntersector.cpp
new file mode 100644
index 0000000..c215d77
--- /dev/null
+++ b/src/terralib/kernel/TeIntersector.cpp
@@ -0,0 +1,202 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeIntersector.h"
+#include <map>
+
+using namespace std;
+
+//---------------- TeIntersectionsBO ----------------//
+bool TeINTERSECTOR2::TeIntersects(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+ if(redLine.size() < 2 || blueLine.size() < 2)
+ return false;
+
+ if(TeDisjoint(redLine.box(), blueLine.box()))
+ return false;
+
+ unsigned int i = 0;
+ unsigned int j = 0;
+
+ TeBox interBox;
+
+ // Creates a intersection box from lines boxes.
+ ::TeIntersection(redLine.box(), blueLine.box(), interBox);
+
+ unsigned int nstep_redLine = redLine.size() - 1;
+ unsigned int nstep_blueLine = blueLine.size() - 1;
+
+ TeSegmentIntersectionType t = TeImproperIntersection;
+
+ for(i = 0; i < nstep_redLine; ++i)
+ {
+ // Creates the segment box.
+ TeBox red_box = makeBox(redLine[i].x(), redLine[i].y(), redLine[i+1].x(), redLine[i+1].y());
+
+ // See if red segment box intersects with the intersection box.
+ if(TeDisjoint(interBox, red_box))
+ continue; // If it doesn't intersect, go to another segment => skip comparasion beteween other "m" segments.
+
+ for(j = 0; j < nstep_blueLine; ++j)
+ {
+ // Check intersection.
+ if(TeIntersects(redLine[i], redLine[i+1], blueLine[j], blueLine[j+1], t))
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+
+bool TeINTERSECTOR2::TeSafeIntersections(const TeLine2D& redLine, const TeLine2D& blueLine, TeVectorBoundaryIP& report, const unsigned int& redObjId, const unsigned int& blueObjId)
+{
+ if(redLine.size() < 2 || blueLine.size() < 2)
+ return false;
+
+ if(TeDisjoint(redLine.box(), blueLine.box()))
+ return false;
+
+ unsigned int i = 0;
+ unsigned int j = 0;
+
+ TeBox interBox;
+
+ bool hasIntersections = false;
+
+ // Creates a intersection box from lines boxes.
+ ::TeIntersection(redLine.box(), blueLine.box(), interBox);
+
+ unsigned int nstep_redLine = redLine.size() - 1;
+ unsigned int nstep_blueLine = blueLine.size() - 1;
+
+ TeSegmentIntersectionType t = TeImproperIntersection;
+
+ for(i = 0; i < nstep_redLine; ++i)
+ {
+ // Creates the segment box.
+ TeBox red_box = makeBox(redLine[i].x_, redLine[i].y_, redLine[i+1].x_, redLine[i+1].y_);
+
+ // See if red segment box intersects with the intersection box.
+ if(TeDisjoint(interBox, red_box))
+ continue; // If it doesn't intersect, go to another segment => skip comparasion beteween other "m" segments.
+
+ for(j = 0; j < nstep_blueLine; ++j)
+ {
+ // Check intersection.
+ TeBoundaryIP ip;
+
+ if(TeIntersection(redLine[i], redLine[i+1], blueLine[j], blueLine[j+1], ip, t))
+ {
+ hasIntersections = true;
+
+ ip.redPartNum_ = redObjId;
+ ip.redSegNum_ = i;
+ ip.bluePartNum_ = blueObjId;
+ ip.blueSegNum_ = j;
+
+ if(ip.coords_.size() == 2) //overlap
+ {
+ // Verificar se os pontos est�o em ordem crescente
+ if(ip.coords_[0].x_ < ip.coords_[1].x_)
+ {
+ report.push_back(ip);
+ }
+ else if(ip.coords_[0].x_ > ip.coords_[1].x_)
+ {
+ swap(ip.coords_[0], ip.coords_[1]);
+ report.push_back(ip);
+ }
+ else if(ip.coords_[0].y_ < ip.coords_[1].y_)
+ {
+ report.push_back(ip);
+ }
+ else
+ {
+ swap(ip.coords_[0], ip.coords_[1]);
+
+ report.push_back(ip);
+ }
+
+ }
+ else
+ {
+ report.push_back(ip);
+ }
+ }
+ }
+ }
+
+ return hasIntersections;
+}
+
+
+bool TeINTERSECTOR2::TeSafeIntersections(const TePolygonSet& redPols, const TePolygonSet& bluePols, TeVectorBoundaryIP& report)
+{
+ unsigned int redPart = 0;
+ unsigned int redPolsSize = redPols.size();
+
+ // Loops through red polygons
+ for(unsigned int i = 0; i < redPolsSize; ++i)
+ {
+ TePolygon redPol = redPols[i];
+ unsigned int redPolSize = redPol.size();
+
+ // Loops through red polygons rings
+ for(register unsigned int j = 0; j < redPolSize; ++j)
+ {
+ TeLinearRing redRing = redPol[j];
+
+ // Loops through blue polygons
+ unsigned int bluePart = 0;
+ unsigned int bluePolsSize = bluePols.size();
+
+ for(unsigned int k = 0; k < bluePolsSize; ++k)
+ {
+ // Loops through blue polygons rings
+ TePolygon bluePol = bluePols[k];
+
+ unsigned int bluePolSize = bluePol.size();
+
+ for(register unsigned int l = 0; l < bluePolSize; ++l)
+ {
+ TeLinearRing blueRing = bluePol[l];
+
+ TeSafeIntersections(redRing, blueRing, report, redPart, bluePart);
+
+ ++bluePart;
+ }
+ }
+
+ ++redPart;
+ }
+ }
+
+ return !report.empty();
+}
+
diff --git a/src/terralib/kernel/TeIntersector.h b/src/terralib/kernel/TeIntersector.h
new file mode 100644
index 0000000..ffea4ac
--- /dev/null
+++ b/src/terralib/kernel/TeIntersector.h
@@ -0,0 +1,442 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeIntersector.h
+ This file contains structures and definitions for line intersection algorithms.
+ */
+
+/**
+ *@author Gilberto Ribeiro de Queiroz
+ */
+
+#ifndef __TERRALIB_INTERNAL_INTERSECTOR2_H
+#define __TERRALIB_INTERNAL_INTERSECTOR2_H
+
+//TerraLib's include
+#include "TeCounted.h"
+#include "TeCoord2D.h"
+#include "TeGeometryAlgorithms.h"
+
+//STL's include
+#include <list>
+#include <vector>
+#include <map>
+#include <algorithm>
+#include <string>
+
+using namespace std;
+
+
+#define PRINT
+
+namespace TeINTERSECTOR2
+{
+
+#define EPSILON_COMPARE 0.00000000005
+
+/*! \fn inline short TeCCW(const TeCoord2D& c1, const TeCoord2D& c2, const TeCoord2D& c3, bool& between)
+ \brief Tells if three points makes a right turn, a left turn or are collinear.
+ \param c1 The first coordinate.
+ \param c2 The second coordinate.
+ \param c3 The coordinate to test the relative position.
+ \param between Tells if c3 is between c1 and c2.
+*/
+inline short TeCCW(const TeCoord2D& c1, const TeCoord2D& c2, const TeCoord2D& c3, bool& between)
+{
+ double tol = TePrecision::instance().precision();
+ TePrecision::instance().setPrecision(EPSILON_COMPARE);
+
+
+ double dx1 = c2.x() - c1.x();
+ double dx2 = c3.x() - c1.x();
+ double dy1 = c2.y() - c1.y();
+ double dy2 = c3.y() - c1.y();
+
+ double dx1y2 = dx1 * dy2;
+ double dy1x2 = dy1 * dx2;
+
+ // slope of the second line is greater than the first, so counterclockwise.
+ if(TeGeometryAlgorithmsPrecision::IsGreater(dx1y2, dy1x2))
+ {
+ TePrecision::instance().setPrecision(tol);
+
+ return TeCOUNTERCLOCKWISE;
+ }
+
+ // slope of the first line is greater than the second, so clockwise.
+ if(TeGeometryAlgorithmsPrecision::IsSmaller(dx1y2, dy1x2))
+ {
+ TePrecision::instance().setPrecision(tol);
+
+ return TeCLOCKWISE;
+ }
+
+
+ TePrecision::instance().setPrecision(tol);
+ // if we are here, so the three points are collinear.
+
+ // check if c3 is between c1 and c2
+ if(TeGeometryAlgorithmsPrecision::IsDifferent(c1.x(), c2.x())) // c1c2 is not vertical
+ between = (TeGeometryAlgorithmsPrecision::IsSmallerEqual(c1.x(), c3.x()) && TeGeometryAlgorithmsPrecision::IsSmallerEqual(c3.x(), c2.x())) ||
+ (TeGeometryAlgorithmsPrecision::IsGreaterEqual(c1.x(), c3.x()) && TeGeometryAlgorithmsPrecision::IsGreaterEqual(c3.x(), c2.x()));
+ else // c1c2 is vertical
+ between = (TeGeometryAlgorithmsPrecision::IsSmallerEqual(c1.y(), c3.y()) && TeGeometryAlgorithmsPrecision::IsSmallerEqual(c3.y(), c2.y())) ||
+ (TeGeometryAlgorithmsPrecision::IsGreaterEqual(c1.y(), c3.y()) && TeGeometryAlgorithmsPrecision::IsGreaterEqual(c3.y(), c2.y()));
+
+
+
+ //string linha = "";
+ //linha = Te2String(c1.x(), 15);
+ //linha += " | ";
+ //linha += Te2String(c1.y(), 15);
+ //linha += " | ";
+ //linha += Te2String(c2.x(), 15);
+ //linha += " | ";
+ //linha += Te2String(c2.y(), 15);
+ //linha += " | ";
+ //linha += Te2String(c3.x(), 15);
+ //linha += " | ";
+ //linha += Te2String(c3.y(), 15);
+ //linha += " | ";
+ //linha += Te2String(dx1y2 - dy1x2, 15);
+ //linha += "\n";
+
+ //TeWriteToFile("c:\\log_ccw.txt", linha, "aw");
+
+
+ return TeNOTURN;
+}
+
+/*! \fn inline bool TeBoxIntersects(const TeCoord2D& a, const TeCoord2D& b, const TeCoord2D& c, const TeCoord2D& d)
+ \brief Tells if the box of segments intersects.
+ \param a The first coordinate of the first segment.
+ \param b The second coordinate of the first segment.
+ \param c The first coordinate of the second segment.
+ \param d The second coordinate of the second segment.
+*/
+inline bool TeBoxIntersects(const TeCoord2D& a, const TeCoord2D& b, const TeCoord2D& c, const TeCoord2D& d)
+{
+ /* X bound box test */
+ if(d.x() > c.x())
+ {
+ if(b.x() < a.x())
+ {
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c.x(), a.x()))
+ return false; // don't intersect => S2 is to the right of S1
+
+ if(TeGeometryAlgorithmsPrecision::IsGreater(b.x(), d.x()))
+ return false; // don't intersect => S2 is to the left of S1
+ }
+ else
+ {
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c.x(), b.x()))
+ return false; // don't intersect => S2 is to the right of S1
+
+ if(TeGeometryAlgorithmsPrecision::IsGreater(a.x(), d.x()))
+ return false; // don't intersect => S2 is to the left of S1
+ }
+ }
+ else
+ {
+ if(b.x() < a.x())
+ {
+ if(TeGeometryAlgorithmsPrecision::IsGreater(d.x(), a.x()))
+ return false; // don't intersect => S2 is to the right of S1
+
+ if(TeGeometryAlgorithmsPrecision::IsGreater(b.x(), c.x()))
+ return false; // don't intersect => S2 is to the left of S1
+ }
+ else
+ {
+ if(TeGeometryAlgorithmsPrecision::IsGreater(d.x(), b.x()))
+ return false; // don't intersect => S2 is to the right of S1
+
+ if(TeGeometryAlgorithmsPrecision::IsGreater(a.x(), c.x()))
+ return false; // don't intersect => S2 is to the left of S1
+ }
+ }
+
+ /* Y bound box test */
+ if(d.y() > c.y())
+ {
+ if(b.y() < a.y())
+ {
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c.y(), a.y()))
+ return false; // don't intersect => S2 is above of S1
+
+ if(TeGeometryAlgorithmsPrecision::IsGreater(b.y(), d.y()))
+ return false; // don't intersect => S1 is above of S2
+ }
+ else
+ {
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c.y(), b.y()))
+ return false; // don't intersect => S2 is above of S1
+
+ if(TeGeometryAlgorithmsPrecision::IsGreater(a.y(), d.y()))
+ return false; // don't intersect => S1 is above of S2
+ }
+ }
+ else
+ {
+ if(b.y() < a.y())
+ {
+ if(TeGeometryAlgorithmsPrecision::IsGreater(d.y(), a.y()))
+ return false; // don't intersect => S2 is above of S1
+
+ if(TeGeometryAlgorithmsPrecision::IsGreater(b.y(), c.y()))
+ return false; // don't intersect => S1 is above of S2
+ }
+ else
+ {
+ if(TeGeometryAlgorithmsPrecision::IsGreater(d.y(), b.y()))
+ return false; // don't intersect => S2 is above of S1
+
+ if(TeGeometryAlgorithmsPrecision::IsGreater(a.y(), c.y()))
+ return false; // don't intersect => S1 is above of S2
+ }
+ }
+
+ return true;
+}
+
+struct TeBoundaryIP
+{
+
+ vector<TeCoord2D> coords_;
+
+ unsigned int redSegNum_;
+ unsigned int redPartNum_;
+
+ unsigned int blueSegNum_;
+ unsigned int bluePartNum_;
+};
+
+typedef vector<TeBoundaryIP> TeVectorBoundaryIP;
+
+/*! \fn inline bool TeIntersection(const TeCoord2D& a, const TeCoord2D& b, const TeCoord2D& c, const TeCoord2D& d, TeIntersCoordsVec& coords, TeSegmentIntersectionType& intersectionType)
+ \brief Returns the intersection point of the segments.
+ \param a The first coordinate of the first segment.
+ \param b The second coordinate of the first segment.
+ \param c The first coordinate of the second segment.
+ \param d The second coordinate of the second segment.
+ \param coords The intersection coordinates (0, 1 or 2).
+ \param intersectionType An intersection may be proper or improper.
+*/
+inline bool TeIntersection(const TeCoord2D& a, const TeCoord2D& b, const TeCoord2D& c, const TeCoord2D& d, TeBoundaryIP& ips, TeSegmentIntersectionType& intersectionType)
+{
+ if(TeEquals(a, b))
+ return false;
+
+ if(TeEquals(c, d))
+ return false;
+
+ if(TeBoxIntersects(a, b, c, d))
+ {
+ if((TeEquals(a, c) || TeEquals(a, d)) && (TeEquals(b, c) || TeEquals(b, d)))
+ {
+ intersectionType = TeImproperIntersection;
+
+ ips.coords_.push_back(a);
+ ips.coords_.push_back(b);
+
+ return true;
+ }
+
+ bool between1 = false;
+ short sign1 = TeCCW(a, b, c, between1);
+
+ bool between2 = false;
+ short sign2 = TeCCW(a, b, d, between2);
+
+ bool between3 = false;
+ short sign3 = TeCCW(c, d, a, between3);
+
+ bool between4 = false;
+ short sign4 = TeCCW(c, d, b, between4);
+
+ if((sign1 * sign2) <= 0 && (sign3 * sign4 <= 0)) // if there is an intersection
+ {
+ intersectionType = TeProperIntersection;
+
+ if(between1)
+ {
+ intersectionType = TeImproperIntersection;
+ ips.coords_.push_back(c);
+ }
+
+ if(between2)
+ {
+ intersectionType = TeImproperIntersection;
+ ips.coords_.push_back(d);
+ }
+
+ if(between3 && !TeEquals(a, c) && !TeEquals(a, d))
+ {
+ intersectionType = TeImproperIntersection;
+ ips.coords_.push_back(a);
+
+ return true;
+ }
+
+ if(between4 && !TeEquals(b, c) && !TeEquals(b, d))
+ {
+ intersectionType = TeImproperIntersection;
+ ips.coords_.push_back(b);
+
+ return true;
+ }
+
+ if(intersectionType == TeImproperIntersection)
+ return true;
+
+ double denominator = (d.y() - c.y()) * (b.x() - a.x()) - (d.x() - c.x()) * (b.y() - a.y());
+
+ if(denominator == 0.0) // parallel can not occur here any more! I expect this is true!
+ return false; // ERRO!!!!!!! Lan�ar Exce��o: Montar um esquema de exce��es
+
+ // parameters
+ double Ua = ((d.x() - c.x()) * (a.y() - c.y()) - (d.y() - c.y()) * (a.x() - c.x())) / denominator;
+ double Ub = ((b.x() - a.x()) * (a.y() - c.y()) - (b.y() - a.y()) * (a.x() - c.x())) / denominator;
+
+ if(Ua > 0.0 && Ua < 1.0 && Ub > 0.0 && Ub < 1.0)
+ {
+ ips.coords_.push_back(TeCoord2D(a.x() + Ua * (b.x() - a.x()), a.y() + Ua * (b.y() - a.y())));
+ return true;
+ }
+ }
+ }
+
+ intersectionType = TeImproperIntersection;
+
+ return false;
+}
+
+/*! \fn inline bool TeIntersects(const TeCoord2D& a, const TeCoord2D& b, const TeCoord2D& c, const TeCoord2D& d, TeSegmentIntersectionType& intersectionType)
+ \brief Tells if two segments intersects.
+ \param a The first coordinate of the first segment.
+ \param b The second coordinate of the first segment.
+ \param c The first coordinate of the second segment.
+ \param d The second coordinate of the second segment.
+ \param intersectionType An intersection may be proper or improper.
+*/
+inline bool TeIntersects(const TeCoord2D& a, const TeCoord2D& b, const TeCoord2D& c, const TeCoord2D& d, TeSegmentIntersectionType& intersectionType)
+{
+ if(TeBoxIntersects(a, b, c, d))
+ {
+ if((TeEquals(a, c) || TeEquals(a, d)) && (TeEquals(b, c) || TeEquals(b, d)))
+ {
+ intersectionType = TeImproperIntersection;
+
+ return true;
+ }
+
+ bool between1 = false;
+ short sign1 = TeCCW(a, b, c, between1);
+
+ bool between2 = false;
+ short sign2 = TeCCW(a, b, d, between2);
+
+ bool between3 = false;
+ short sign3 = TeCCW(c, d, a, between3);
+
+ bool between4 = false;
+ short sign4 = TeCCW(c, d, b, between4);
+
+ if((sign1 * sign2) <= 0 && (sign3 * sign4 <= 0)) // if there is an intersection
+ {
+ intersectionType = TeProperIntersection;
+
+ if(between1)
+ {
+ intersectionType = TeImproperIntersection;
+
+ return true;
+ }
+
+ if(between2)
+ {
+ intersectionType = TeImproperIntersection;
+
+ return true;
+ }
+
+ if(between3 && !TeEquals(a, c) && !TeEquals(a, d))
+ {
+ intersectionType = TeImproperIntersection;
+
+ return true;
+ }
+
+ if(between4 && !TeEquals(b, c) && !TeEquals(b, d))
+ {
+ intersectionType = TeImproperIntersection;
+
+ return true;
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/*! \fn bool TeSafeIntersections(const TePolygonSet& redPols, const TePolygonSet& bluePols, TeReportVector& report)
+ \brief Verifies if there is an intersection between two given polygonsets.
+ \param redPols The first polygonset to test.
+ \param bluePols The second polygonset to test.
+ \param report A list with the intersection points sorted according to redPols segments.
+
+ This is a lazy algorithm. It can be used, for example, in intersections between a box and a line.
+ It is O(n*m) - where n and m are the numbers of segments in the first and second polygonsets.
+ */
+bool TeSafeIntersections(const TePolygonSet& redPols, const TePolygonSet& bluePols, TeVectorBoundaryIP& report);
+
+/*! \fn bool TeSafeIntersections(const TeLine2D& redLine, const TeLine2D& blueLine, TeReportVector& report, const unsigned int& redObjId = 0, const unsigned int& blueObjId = 0, const bool& sortReport = true)
+ \brief Verifies if there is an intersection between two given lines.
+ \param redLine The first line to test.
+ \param blueLine The second line to test.
+ \param report A list with the intersection points sorted according to lred segments.
+ \param redObjId Red line object id
+ \param blueObjId Blue line object id
+ \param sortReport Flag to indicate that report should be sorted
+
+ This is a lazy algorithm. It can be used, for example, in intersections between a box and a line.
+ It is O(n*m) - where n and m are the numbers of segments in the first and second lines.
+ */
+bool TeSafeIntersections(const TeLine2D& redLine, const TeLine2D& blueLine, TeVectorBoundaryIP& report, const unsigned int& redObjId = 0, const unsigned int& blueObjId = 0);
+
+/*! \fn bool TeIntersects(const TeLine2D& redLine, const TeLine2D& blueLine)
+ \brief Returns true if the lines intersects.
+ \param redLine The line to test.
+ \param blueLine The line to test.
+
+ */
+bool TeIntersects(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+
+
+} // end namespace TeINTERSECTOR2
+
+#endif //__TERRALIB_INTERNAL_INTERSECTOR2_H
+
diff --git a/src/terralib/kernel/TeLayer.cpp b/src/terralib/kernel/TeLayer.cpp
new file mode 100644
index 0000000..2ddca43
--- /dev/null
+++ b/src/terralib/kernel/TeLayer.cpp
@@ -0,0 +1,1038 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeLayer.h"
+#include "TeUtils.h"
+#include "TeException.h"
+#include "TeDatabase.h"
+
+// -- Layer novo ---
+
+TeLayer::TeLayer(const string& name, TeDatabase* db, TeProjection* proj):
+ name_(name),
+ id_(-1),
+ db_(db),
+ projection_ ( proj ),
+ raster_(0)
+{
+ if (!db_ || name.empty())
+ return;
+
+ // verifies if layer already exists in the database
+ string sql = "SELECT * FROM te_layer WHERE name = '" + name + "'";
+ TeDatabasePortal* portal = db_->getPortal();
+ if (!portal)
+ return;
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return;
+ }
+ if (!portal->fetchRow())
+ {
+ if (!proj) // provides a default projection No Projection
+ projection_ = new TeNoProjection();
+ else
+ projection_ = TeProjectionFactory::make (proj->params());
+ db_->insertLayer(this);
+ }
+ else
+ db_->loadLayer(this);
+ int pid = projection_->id();
+ delete projection_;
+ projection_ = db_->loadProjection(pid);
+ delete portal;
+}
+
+
+TeLayer::TeLayer(const string& name, TeDatabase* db, TeBox& box, TeProjection* proj):
+ name_(name),
+ id_(-1),
+ db_(db),
+ projection_(proj),
+ box_(box),
+ raster_(0)
+{
+ if (!db_ || name.empty())
+ return;
+
+ // verifies if layer already exists in the database
+ string sql = "SELECT * FROM te_layer WHERE name = '" + name + "'";
+ TeDatabasePortal* portal = db_->getPortal();
+ if (!portal)
+ return;
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return;
+ }
+ if (!portal->fetchRow())
+ {
+ if (!proj) // provides a default projection No Projection
+ projection_ = new TeNoProjection();
+ else
+ projection_ = TeProjectionFactory::make (proj->params());
+ db_->insertLayer(this);
+ }
+ else
+ db_->loadLayer(this);
+ delete portal;
+}
+
+TeLayer::~TeLayer()
+{
+ if ( projection_ != 0 )
+ {
+ delete projection_;
+ projection_ = 0;
+ }
+ for (TeRepresPointerVectorIterator it = repVector_.begin(); it != repVector_.end(); it++)
+ {
+ if (*it)
+ delete (*it);
+ }
+ repVector_.clear();
+}
+
+void
+TeLayer::setLayerBox(const TeBox& box)
+{
+ box_ = box;
+ if ((id_ > -1) && db_)
+ {
+ string sql = "UPDATE te_layer SET lower_x = " + Te2String(box_.x1(),12);
+ sql += ", lower_y = " + Te2String(box_.y1(),12);
+ sql += ", upper_x = " + Te2String(box_.x2(),12);
+ sql += ", upper_y = " + Te2String(box_.y2(),12);
+ sql += " WHERE layer_id=" + Te2String(id_);
+ db_->execute(sql);
+ }
+}
+
+void
+TeLayer::updateLayerBox(const TeBox& box)
+{
+ updateBox(box_,box);
+ if ((id_ > -1) && db_)
+ {
+ string sql = "UPDATE te_layer SET lower_x = " + Te2String(box_.x1(),12);
+ sql += ", lower_y = " + Te2String(box_.y1(),12);
+ sql += ", upper_x = " + Te2String(box_.x2(),12);
+ sql += ", upper_y = " + Te2String(box_.y2(),12);
+ sql += " WHERE layer_id=" + Te2String(id_);
+ db_->execute(sql);
+ }
+}
+
+void
+TeLayer::updateLayerBox()
+{
+ if (id_ < 0 || !db_)
+ return;
+
+ string sql = "SELECT lower_x, lower_y, upper_x, upper_y FROM te_representation WHERE layer_id = " + Te2String(id_);
+ TeDatabasePortal* portal = db_->getPortal();
+ if (!portal)
+ return;
+ if (!portal->query(sql))
+ {
+ delete portal;
+ return;
+ }
+
+ TeBox box;
+ while (portal->fetchRow())
+ {
+ TeBox brep(portal->getDouble(0),portal->getDouble(1),portal->getDouble(2),portal->getDouble(3));
+ updateBox(box,brep);
+ }
+ delete portal;
+ sql = "UPDATE te_layer SET lower_x = " + Te2String(box.x1(),12);
+ sql += ", lower_y = " + Te2String(box.y1(),12);
+ sql += ", upper_x = " + Te2String(box.x2(),12);
+ sql += ", upper_y = " + Te2String(box.y2(),12);
+ sql += " WHERE layer_id=" + Te2String(id_);
+ db_->execute(sql);
+ box_ = box;
+ return;
+}
+
+void
+TeLayer::setProjection ( TeProjection* proj )
+{
+ if (!proj)
+ return;
+
+ // if no database set just update pointer
+ if (!db_)
+ {
+ if ( projection_)
+ delete projection_;
+ projection_ = proj;
+ return;
+ }
+
+ // delete old projection
+ if (projection_ && projection_->id() > 0 )
+ {
+ string sql = "DELETE FROM te_projection WHERE projection_id = " + Te2String(projection_->id());
+ if (db_->execute(sql))
+ delete projection_;
+ }
+ projection_ = proj;
+ bool status = true;
+
+ if ( proj->id() <= 0 ) // new projection not in the database
+ status = db_->insertProjection(projection_);
+
+ // update layer information
+ if (status && id_ > 0)
+ {
+ string sql = "UPDATE te_layer SET projection_id = " + Te2String(projection_->id());
+ sql += " WHERE layer_id=" + Te2String(id_);
+ db_->execute(sql);
+ }
+ if (raster_)
+ {
+ delete raster_;
+ raster_ = 0;
+ }
+}
+
+void
+TeLayer::raster( TeRaster* raster)
+{
+ if (raster_ )
+ delete raster_;
+ raster_ = raster;
+}
+
+bool
+TeLayer::hasGeometry (TeGeomRep rep)
+{
+ if (repVector_.empty())
+ return false;
+ TeRepresPointerVectorIterator it;
+ it = TeFindRepresentation(repVector_.begin(), repVector_.end(),rep);
+ return (it != repVector_.end());
+}
+
+int
+TeLayer::geomRep()
+{
+ int r = 0;
+ if (repVector_.empty())
+ return r;
+ TeRepresPointerVectorIterator it;
+ for (it=repVector_.begin(); it != repVector_.end(); it++)
+ r= (int)(*it)->geomRep_ | r;
+ return r;
+}
+
+string
+TeLayer::tableName(TeGeomRep rep)
+{
+ TeRepresPointerVectorIterator it;
+ it = TeFindRepresentation(repVector_.begin(), repVector_.end(),rep);
+ if (it != repVector_.end())
+ return (*it)->tableName_;
+ else
+ return string("");
+}
+
+int
+TeLayer::nGeometries(TeGeomRep rep)
+{
+ TeRepresPointerVectorIterator it;
+ it = TeFindRepresentation(repVector_.begin(), repVector_.end(),rep);
+ int ngeo = 0;
+ if (it != repVector_.end())
+ {
+ string sql = "SELECT COUNT(geom_id) FROM " + (*it)->tableName_;
+ TeDatabasePortal* portal = db_->getPortal();
+ if (portal && portal->query(sql) && portal->fetchRow())
+ ngeo = portal->getInt(0);
+ delete portal;
+ }
+ return ngeo;
+}
+
+
+bool
+TeLayer::getRepresentation(TeGeomRep repType, TeRepresPointerVector& result)
+{
+ TeRepresPointerVectorIterator it;
+ it = repVector_.begin();
+ while (it != repVector_.end())
+ {
+ if ((*it)->geomRep_ == repType)
+ result.push_back((*it));
+ ++it;
+ }
+ if (result.empty())
+ return false;
+ return true;
+}
+
+TeRepresentation*
+TeLayer::getRepresentation(TeGeomRep repType, const string& tName)
+{
+
+ TeRepresPointerVectorIterator it;
+ it = repVector_.begin();
+ while (it != repVector_.end())
+ {
+ if ((*it)->geomRep_ == repType)
+ {
+ if (tName.empty() || (*it)->tableName_== tName)
+ return (*it);
+ }
+ it++;
+ }
+ return 0;
+}
+
+bool
+TeLayer::removeGeometry (TeGeomRep repType, const string& tName)
+{
+ if (!db_)
+ return false;
+
+ if (repType == TeTEXT && tName.empty()) // layer can have more than one TEXT table
+ return false;
+
+ TeRepresPointerVectorIterator it;
+ it = TeFindRepresentation(repVector_.begin(), repVector_.end(),repType);
+ while (it != repVector_.end())
+ {
+ if (tName.empty() || (*it)->tableName_== tName)
+ {
+ string del;
+ TeRepresentation* rep = (*it);
+ if (rep->id_ > 0)
+ {
+ del = "DELETE FROM te_representation WHERE repres_id=" + Te2String(rep->id_);
+ if (!db_->execute(del))
+ return false;
+ }
+
+ if (!rep->tableName_.empty())
+ {
+ if(rep->geomRep_ == TeRASTER)
+ {
+ TeDatabasePortal* portal = db_->getPortal();
+ string sql, tname;
+
+ sql = "SELECT lut_table, raster_table FROM " + rep->tableName_;
+ portal->query(sql);
+
+ while(portal->fetchRow())
+ {
+ // delete lut table
+ tname = portal->getData(0);
+ if(!tname.empty())
+ db_->deleteTable(tname);
+ // delete raster table
+ tname = portal->getData(1);
+ if(!tname.empty())
+ db_->deleteTable(tname);
+ }
+ portal->freeResult();
+ delete portal;
+
+ // delete metadata table
+ sql = "DROP TABLE " + rep->tableName_ + "_metadata";
+ db_->execute(sql);
+ if (raster_)
+ {
+ delete raster_;
+ raster_ = 0;
+ }
+ }
+ if (!db_->deleteTable(rep->tableName_))
+ return false;
+ }
+ repVector_.erase(it);
+ delete rep;
+ break;
+ }
+ it++;
+ it = TeFindRepresentation(it,repVector_.end(),repType);
+ }
+ updateLayerBox();
+ return true;
+}
+
+bool TeLayer::addGeometry(TeGeomRep repType, const string& tName, const string& desc)
+{
+ // check if representation is already in layer
+ if (repType == TeTEXT)
+ {
+ string tt;
+ if (!tName.empty())
+ tt = tName;
+ else
+ tt = name_ + "Texts";
+
+ if (getRepresentation(repType,tt))
+ return true;
+ }
+ else if (getRepresentation(repType))
+ return true;
+
+ if (!db_) // layer has no database associated
+ return false;
+
+ if (id_ < 0) // layer has not saved in the database
+ {
+ if (!db_->insertLayer (this))
+ return false;
+ }
+
+ TeRepresentation* represe = new TeRepresentation();
+ represe->geomRep_ = repType;
+ if (!tName.empty())
+ represe->tableName_ = tName;
+ if (!desc.empty())
+ represe->description_ = desc;
+
+ if (repType == TePOLYGONS)
+ {
+ if (tName.empty())
+ represe->tableName_ = "Polygons" + Te2String(id_);
+ if (!db_->createPolygonGeometry (represe->tableName_))
+ return false;
+ }
+ else if (repType == TeLINES)
+ {
+ if (tName.empty())
+ represe->tableName_ = "Lines" + Te2String(id_);
+ if (!db_->createLineGeometry (represe->tableName_))
+ return false;
+ }
+ else if (repType == TePOINTS)
+ {
+ if (tName.empty())
+ represe->tableName_ = "Points" + Te2String(id_);
+ if (!db_->createPointGeometry (represe->tableName_))
+ return false;
+ }
+ else if (repType == TeTEXT)
+ {
+ if (tName.empty())
+ represe->tableName_ = "Texts" + Te2String(id_);
+ if (!db_->createTextGeometry (represe->tableName_))
+ return false;
+ }
+ else if (repType == TeARCS)
+ {
+ if (tName.empty())
+ represe->tableName_ = "Arcs"+ Te2String(id_);
+ if (!db_->createArcGeometry (represe->tableName_))
+ return false;
+ }
+ else if (repType == TeNODES)
+ {
+ if (tName.empty())
+ represe->tableName_ = "Nodes"+ Te2String(id_);
+ if (!db_->createNodeGeometry (represe->tableName_))
+ return false;
+ }
+ else if (repType == TeCELLS)
+ {
+ if (tName.empty())
+ represe->tableName_ = "Cells"+ Te2String(id_);
+ if (!db_->createCellGeometry (represe->tableName_))
+ return false;
+ }
+ else
+ {
+ return false;
+ }
+
+ bool res = db_->insertRepresentation(id_,*represe);
+
+ if (res)
+ repVector_.push_back(represe);
+ else
+ return false;
+ return true;
+}
+
+bool
+TeLayer::addRasterGeometry(TeRasterParams& par, const string& objectId,
+ const string& tName, const string& desc)
+{
+ string tableName = tName;
+ TeRepresentation* rep = getRepresentation(TeRASTER,tableName);
+ if (!rep)
+ {
+ rep = new TeRepresentation();
+ updateBox(rep->box_,par.boundingBox());
+
+ if (!tableName.empty())
+ rep->tableName_ = tableName;
+ else
+ rep->tableName_ = "RasterLayer" + Te2String(id_);
+
+ if (!desc.empty())
+ rep->description_ = desc;
+
+ rep->geomRep_ = TeRASTER;
+ if (!db_->insertRepresentation(id_,*rep))
+ return false;
+
+ tableName = rep->tableName_;
+ if (!db_->createRasterGeometry(tableName))
+ return false;
+
+ string metadataTableName = tableName+"_metadata";
+ if (!db_->createRasterMetadataTable(metadataTableName))
+ return false;
+
+ repVector_.push_back(rep);
+ }
+ else
+ tableName = rep->tableName_;
+
+ string oid = objectId;
+ if (oid.empty())
+ oid = "O1";
+
+ if (par.fileName_.empty())
+ {
+ string aux = "RasterLayer" + Te2String(id_) + "_R_" + objectId;
+ bool flag = db_->tableExist(aux);
+ short i=1;
+ while (flag)
+ {
+ aux = "RasterLayer" + Te2String(id_) + "_R_" + objectId + "_" + Te2String(i);
+ ++i;
+ }
+ par.fileName_ = aux;
+ }
+
+ if (!db_->createRasterTable(par.fileName_))
+ return false;
+
+ if (!db_->insertRasterGeometry(tableName,par,objectId))
+ return false;
+
+ updateLayerBox(par.boundingBox());
+ return true;
+}
+
+TeRaster*
+TeLayer::raster(const string& objectId, const char& mode)
+{
+ if (!hasGeometry(TeRASTER) || id_ <= 0 )
+ return 0;
+
+ if (raster_ && !objectId.empty() &&
+ (objectId != raster_->objectId() ||
+ mode != raster_->params().mode_ ))
+ {
+ delete raster_;
+ raster_ = 0;
+ }
+ if (!raster_)
+ raster_ = db_->loadLayerRaster(id_,objectId, mode);
+ return raster_;
+}
+
+int
+TeLayer::nObjects(const string& tName)
+{
+ if (attTables_.empty())
+ return 0;
+ string linkName;
+ vector<TeTable>::iterator it = attTables_.begin();
+ while (it != attTables_.end())
+ {
+ if ((*it).name() == tName)
+ {
+ linkName = (*it).linkName();
+ break;
+ }
+ it++;
+ }
+ if (linkName.empty())
+ return 0;
+ int no;
+ string sql;
+ TeDatabasePortal* portal = db_->getPortal();
+ if (!portal)
+ return 0;
+ sql = "SELECT COUNT(" + linkName + ") FROM " + (*it).name();
+ if (portal->query(sql) && portal->fetchRow())
+ no = portal->getInt(0);
+ delete portal;
+ return no;
+}
+
+
+bool
+TeLayer::createAttributeTable(TeTable& table)
+{
+ if (!db_->tableExist(table.name()))
+ {
+ db_->validTable(table);
+ if (!db_->createTable(table.name(),table.attributeList()))
+ return false;
+ }
+
+ if(!db_->insertTableInfo(id_,table))
+ return false;
+
+ vector<TeTable>::iterator it = attTables_.begin();
+ while (it != attTables_.end())
+ {
+ if ((*it).name() == table.name())
+ return true;
+ it++;
+ }
+ attTables_.push_back(table);
+ return true;
+}
+
+bool
+TeLayer::addAttributeTable(TeTable& table)
+{
+ vector<TeTable>::iterator it = attTables_.begin();
+ while (it != attTables_.end())
+ {
+ if ((*it).name() == table.name())
+ return false;
+ it++;
+ }
+ attTables_.push_back(table);
+ return true;
+}
+
+bool
+TeLayer::removeAttributeTable(string tableName)
+{
+ vector<TeTable>::iterator it = attTables_.begin();
+ while (it != attTables_.end())
+ {
+ if ((*it).name() == tableName)
+ {
+ attTables_.erase(it);
+ return true;
+ }
+ it++;
+ }
+ return false;
+}
+
+void
+TeLayer::updateAttributeTable(TeTable& table)
+{
+ vector<TeTable>::iterator it = attTables_.begin();
+ while (it != attTables_.end())
+ {
+ if ((*it).name() == table.name())
+ {
+ attTables_.erase(it);
+ break;
+ }
+ it++;
+ }
+ attTables_.push_back(table);
+}
+
+bool
+TeLayer::loadLayerTables()
+{
+ TeDatabase *db = database();
+ if(!db)
+ return false;
+
+ attTables_.clear();
+ return(db->loadLayerTable(this));
+}
+
+bool
+TeLayer::getAttrTables(TeAttrTableVector& atts, TeAttrTableType attType)
+{
+ TeAttrTableVector::iterator it = attTables_.begin();
+ while (it != attTables_.end())
+ {
+ if ((attType == TeAllAttrTypes) || ((*it).tableType() == attType))
+ atts.push_back((*it));
+ it++;
+ }
+ return (!atts.empty());
+}
+
+bool
+TeLayer::getAttrTablesByName(vector<string> &tableNames, TeAttrTableVector& atts, TeAttrTableType attType)
+{
+ TeAttrTableVector::iterator it;
+ vector<string>::iterator it2;
+
+ for(it2 = tableNames.begin(); it2 != tableNames.end(); ++it2)
+ {
+ for(it = attTables_.begin(); it != attTables_.end(); ++it)
+ {
+ if ((attType == TeAllAttrTypes) || ((*it).tableType() == attType))
+ {
+ string name = (*it).name();
+ string name2 = (*it2);
+ if(name == name2)
+ {
+ atts.push_back((*it));
+ break;
+ }
+ }
+ }
+ }
+ return (!atts.empty());
+}
+
+
+bool
+TeLayer::getAttrTablesByName(const string& attrTableName, TeTable& table, TeAttrTableType attType)
+{
+ TeAttrTableVector::iterator it;
+
+ for(it = attTables_.begin(); it != attTables_.end(); ++it)
+ {
+ if ((attType == TeAllAttrTypes) || ((*it).tableType() == attType))
+ {
+ string name = (*it).name();
+ if(name == attrTableName)
+ {
+ table = (*it);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+bool
+TeLayer::addPolygons (TePolygonSet& polySet)
+{
+ if (!db_)
+ return false;
+
+ if (polySet.size() > 0 )
+ {
+ if (!this->hasGeometry(TePOLYGONS))
+ this->addGeometry(TePOLYGONS);
+
+ TeRepresentation* rep = getRepresentation(TePOLYGONS);
+ if (rep)
+ {
+ if (!db_->insertPolygonSet (rep->tableName_, polySet))
+ return false;
+ updateLayerBox(polySet.box());
+ updateBox(rep->box_,polySet.box());
+ if (!db_->updateRepresentation(id_,*rep))
+ return false;
+ }
+ else
+ return false;
+ }
+ return true;
+}
+
+bool
+TeLayer::addLines (TeLineSet& lineSet)
+{
+ if (!db_)
+ return false;
+
+ if (lineSet.size() > 0)
+ {
+ if (!this->hasGeometry(TeLINES))
+ this->addGeometry(TeLINES);
+ TeRepresentation* rep = getRepresentation(TeLINES);
+ if (rep)
+ {
+ if (!db_->insertLineSet (rep->tableName_, lineSet))
+ return false;
+ updateLayerBox(lineSet.box());
+ updateBox(rep->box_,lineSet.box());
+ if (!db_->updateRepresentation(id_,*rep))
+ return false;
+ }
+ else
+ return false;
+ }
+ return true;
+}
+
+bool
+TeLayer::addPoints (TePointSet& pointSet)
+{
+ if (!db_)
+ return false;
+
+ if (pointSet.size() > 0)
+ {
+ if (!this->hasGeometry(TePOINTS))
+ this->addGeometry(TePOINTS);
+ string tblName = tableName(TePOINTS);
+
+ TeRepresentation* rep = getRepresentation(TePOINTS);
+ if (rep)
+ {
+ if (!db_->insertPointSet (rep->tableName_, pointSet))
+ return false;
+ updateLayerBox(pointSet.box());
+ updateBox(rep->box_,pointSet.box());
+ if (!db_->updateRepresentation(id_,*rep))
+ return false;
+ }
+ else
+ return false;
+ }
+ return true;
+}
+
+bool
+TeLayer::addText (TeTextSet& textSet, const string& tName)
+{
+ if (!db_)
+ return false;
+
+ TeRepresentation* rep =0;
+ string tabName;
+ if (tName.empty())
+ {
+ int i=0;
+ string name = "Text_" + Te2String(id_) + "_" + Te2String(0);
+ do
+ {
+ rep = getRepresentation(TeTEXT,tName);
+ ++i;
+ }
+ while (rep);
+ tabName = name;
+ }
+ else
+ tabName = tName;
+
+ if (textSet.size() > 0 )
+ {
+ rep = getRepresentation(TeTEXT,tabName);
+ if (!rep)
+ {
+ this->addGeometry(TeTEXT,tabName);
+ rep = getRepresentation(TeTEXT,tabName);
+ }
+ if (rep)
+ {
+ if (!db_->insertTextSet (tabName, textSet))
+ return false;
+ updateLayerBox(textSet.box());
+ updateBox(rep->box_,textSet.box());
+ if (!db_->updateRepresentation(id_,*rep))
+ return false;
+ }
+ else
+ return false;
+ }
+ return true;
+}
+
+bool
+TeLayer::addCells(TeCellSet& cellSet)
+{
+ if (!db_)
+ return false;
+
+ if (cellSet.size() > 0)
+ {
+ string tblName = tableName(TeCELLS);
+ if (!this->hasGeometry(TeCELLS))
+ this->addGeometry(TeCELLS);
+
+ TeRepresentation* rep = getRepresentation(TeCELLS);
+ if (rep)
+ {
+ rep->resX_ = cellSet.resX();
+ rep->resY_ = cellSet.resY();
+ if (!db_->insertCellSet(tableName(TeCELLS), cellSet))
+ return false;
+ updateLayerBox(cellSet.box());
+ updateBox(rep->box_,cellSet.box());
+ if (!db_->updateRepresentation(id_,*rep))
+ return false;
+ }
+ else
+ return false;
+ }
+ return true;
+}
+
+
+bool
+TeLayer::saveAttributeTable(TeTable& table)
+{
+ if (!db_ || id_ <= 0)
+ return false;
+ if (db_->insertTable (table))
+ {
+ if (table.id() <= 0)
+ return db_->insertTableInfo(id_,table);
+ else
+ return true;
+ }
+ return false;
+}
+
+bool
+TeLayer::getPolygons(TePolygonSet &ps, const string& whereClause)
+{
+ if (!hasGeometry(TePOLYGONS))
+ return false;
+ return db_->selectPolygonSet(tableName(TePOLYGONS), whereClause, ps);
+}
+
+bool
+TeLayer::getLines(TeLineSet &ls, const string& whereClause)
+{
+ if (!hasGeometry(TeLINES))
+ return false;
+ return db_->selectLineSet(tableName(TeLINES), whereClause, ls);
+}
+
+bool
+TeLayer::getPoints(TePointSet &ps, const string& whereClause)
+{
+ if (!hasGeometry(TePOINTS))
+ return false;
+ return db_->selectPointSet(tableName(TePOINTS), whereClause, ps);
+}
+
+bool
+TeLayer::getText(TeTextSet &ts, const string& whereClause)
+{
+ if (!hasGeometry(TeTEXT))
+ return false;
+ return db_->selectTextSet(tableName(TeTEXT), whereClause, ts);
+}
+
+bool
+TeLayer::getCells(TeCellSet &cs, const string& whereClause)
+{
+ if (!hasGeometry(TeCELLS))
+ return false;
+ return db_->selectCellSet(id_, tableName(TeCELLS), whereClause, cs);
+}
+
+bool
+TeLayer::locatePolygon (TeCoord2D &pt, TePolygon &polygon, const double& tol)
+{
+ if (!hasGeometry(TePOLYGONS))
+ return false;
+ return db_->locatePolygon(tableName(TePOLYGONS),pt, polygon, tol);
+}
+
+bool
+TeLayer::locateLine (TeCoord2D &pt, TeLine2D &line, const double& tol)
+{
+ if (!hasGeometry(TeLINES))
+ return false;
+ return db_->locateLine(tableName(TeLINES),pt, line, tol);
+}
+
+bool
+TeLayer::locatePoint (TeCoord2D &pt, TePoint &point, const double& tol)
+{
+ if (!hasGeometry(TePOINTS))
+ return false;
+ return db_->locatePoint(tableName(TePOINTS), pt, point, tol);
+}
+
+bool
+TeLayer::locateText(TeCoord2D &pt, TeText &text, const double& tol)
+{
+ if (!hasGeometry(TeTEXT))
+ return false;
+ return db_->locateText(tableName(TeTEXT), pt, text, tol);
+}
+
+bool
+TeLayer::locateCell (TeCoord2D &pt, TeCell &cell, const double& tol)
+{
+ if (!hasGeometry(TeCELLS))
+ return false;
+ return db_->locateCell(tableName(TeCELLS), pt, cell, tol);
+}
+
+bool
+TeLayer::loadGeometrySet (const string& geoid, TePolygonSet &ps)
+{
+ if (!hasGeometry(TePOLYGONS))
+ return false;
+ return db_->loadPolygonSet(tableName(TePOLYGONS), geoid, ps);
+}
+
+bool
+TeLayer::loadGeometrySet (const string& geoid, TeLineSet &ls)
+{
+ if (!hasGeometry(TeLINES))
+ return false;
+ return db_->loadLineSet(tableName(TeLINES), geoid, ls);;
+}
+
+bool
+TeLayer::loadGeometrySet (const string& geoid, TePointSet &ps)
+{
+ if (!hasGeometry(TePOINTS))
+ return false;
+ return db_->loadPointSet(tableName(TePOINTS), geoid, ps);
+}
+
+bool
+TeLayer::loadGeometrySet (const string& geoid, TeCellSet &cs)
+{
+ if (!hasGeometry(TeCELLS))
+ return false;
+ return db_->loadCellSet(id_, tableName(TeCELLS), geoid, cs);;
+}
+
+string
+TeLayer::mediaTable()
+{
+ TeAttrTableVector attrs;
+ getAttrTables(attrs, TeAttrMedia);
+
+ if(attrs.size()<1)
+ return "";
+
+ return (attrs[0].name());
+}
+
+void
+TeLayer::mediaTable(const string& name)
+{
+ TeAttributeList attList;
+ TeTable table(name, attList,"object_id", "object_id", TeAttrMedia);
+ attTables_.push_back (table);
+}
diff --git a/src/terralib/kernel/TeLayer.h b/src/terralib/kernel/TeLayer.h
new file mode 100644
index 0000000..e948993
--- /dev/null
+++ b/src/terralib/kernel/TeLayer.h
@@ -0,0 +1,416 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeLayer.h
+ This file contains structures and definitions to deal with a layer
+*/
+#ifndef __TERRALIB_INTERNAL_LAYER_H
+#define __TERRALIB_INTERNAL_LAYER_H
+
+#include "TeGeometry.h"
+#include "TeRaster.h"
+#include "TeProjection.h"
+#include "TeDataTypes.h"
+#include "TeTable.h"
+#include "TeRepresentation.h"
+
+#include <string>
+#include <list>
+#include <map>
+
+//! A class for supporting a layer.
+/*!
+ In TerraLib, a layer is a collection of geometries that share the same
+ geographical projection, and are related in some way (e.g. a shapefile).
+ A layer has a pointer to a database that effectively stores its atributes
+ and geometries.
+
+ \sa
+ TeGeometry, TeProjection, TeBox, TeDatabase, TeTheme, TeTable
+*/
+class TeLayer {
+
+public:
+
+ //! Empty constructor
+ TeLayer():
+ id_(-1),
+ db_(0),
+ projection_ ( 0 ),
+ raster_(0)
+ { }
+
+
+ //! Constructor with parameters
+ /*
+ \param name layer name (should be unique)
+ \param db a TerraLib database connection w
+ \param proj layer projection
+ \note
+ \par If no database is informed, layer will exist only in memory.
+ \par If a layer with this name doesn�t exist a layer will be
+ created and stored. If no projection is informed a default TeNoProjection
+ will be used as layer projection.
+ \par If a layer with this name already exists it will be retrieved
+ */
+ TeLayer(const string& name, TeDatabase* db=0, TeProjection* proj=0);
+
+ //! Constructor with parameters
+ /*
+ \param name layer name (should be unique)
+ \param db TerraLib database connection where layer will be stored
+ \param box layer bounding box
+ \param proj layer projection
+ \note
+ \par If no database is informed, layer will exist only in memory.
+ \par If a layer with this name doesn�t exist a layer will be
+ created and stored. If no projection is informed a default TeNoProjection
+ will be used as layer projection.
+ \par If a layer with this name already exists it will be retrieved
+ */
+ TeLayer(const string& name, TeDatabase* db, TeBox& box, TeProjection* proj = 0);
+
+ //! Destructor
+ virtual ~TeLayer();
+
+ //! Copy Constructor
+ TeLayer ( const TeLayer& other )
+ {
+ if (projection_)
+ delete projection_;
+ projection_ = 0;
+ if (other.projection_)
+ projection_ = TeProjectionFactory::make ( other.projection_->params());
+ name_ = other.name_;
+ id_ = other.id_;
+ db_ = other.db_;
+ }
+
+ //! Operator =
+ TeLayer& operator= ( const TeLayer& other )
+ {
+ if ( this != &other )
+ {
+ if (projection_)
+ delete projection_;
+ projection_ = 0;
+ if (other.projection_)
+ projection_ = TeProjectionFactory::make ( other.projection_->params());
+ name_ = other.name_;
+ id_ = other.id_;
+ box_ = other.box_;
+ db_ = other.db_;
+ }
+ return *this;
+ }
+
+ //! Retrieves the database associated to this layer
+ TeDatabase* const database()
+ { return db_; }
+
+ //! Sets the layer database
+ void setDatabase(TeDatabase* db)
+ { db_ = db; }
+
+ //! Returns the layer id
+ int id()
+ { return id_; }
+
+ //! Sets the layer id
+ void id(int id)
+ { id_ = id; }
+
+ //! Returns the layer name
+ string name()
+ { return name_; }
+
+ //! Sets the layer name
+ void name(const string &name)
+ { name_ = name; }
+
+ //! Sets the layer projection
+ void setProjection ( TeProjection* proj );
+
+ //! Retrieves the layer projection
+ TeProjection* projection()
+ { return projection_; }
+
+ //! Returns the layer bounding box
+ TeBox& box()
+ { return box_; }
+
+ //! Sets the bounding box of a layer
+ void setLayerBox ( const TeBox& box );
+
+ //! Updates the bounding box of a layer
+ void updateLayerBox(const TeBox& box);
+
+ //! Refreshes the bounding box of a layer according to its representation
+ void updateLayerBox();
+
+ /** @name Attribute Tables
+ * Methods to deal with the attribute tables of the layer
+ */
+ //@{
+
+ //! Returns the number of distinct objects in the layer
+ int nObjects(const string& tName);
+
+ //! Returns a vector with the definition of all attribute tables associated to layer
+ TeAttrTableVector& attrTables ()
+ { return attTables_; }
+
+ //! Creates a new attribute table for the layer
+ bool createAttributeTable(TeTable& table);
+
+ //! Adds an attribute table definition to layer vector of attribute tables (in memory)
+ bool addAttributeTable(TeTable& table);
+
+ //! Remove an attribute table definition to layer vector of attribute tables (in memory)
+ bool removeAttributeTable(string tableName);
+
+ //! Update an attribute table definition to layer vector of attribute tables (in memory)
+ void updateAttributeTable(TeTable& table);
+
+ //! Reload the tables definition from database to memory
+ bool loadLayerTables();
+
+ //! Saves an attribute table into the database where layer is stored
+ bool saveAttributeTable(TeTable& table);
+
+ //! Gets all attribute tables associated to this layer that are of a certain type
+ bool getAttrTables(TeAttrTableVector& atts, TeAttrTableType attType = TeAllAttrTypes);
+
+ //! Gets a set of attribute table specifications associated to this layer that are of a certain type
+ /*
+ \param tableNames a vector that contains the name of the tables that are being searched
+ \param attType type of table that is being searched
+ \param atts returns a vector of tables found
+ \return true if at least one table was found and false otherwise
+ */
+ bool getAttrTablesByName(vector<string> &tableNames, TeAttrTableVector& atts, TeAttrTableType attType = TeAllAttrTypes);
+
+ //! Gets an attribute table associated to a layer
+ /*
+ \param tableName name of the table being searched
+ \param attType type of table being searched
+ \param table returns the table found
+ \return true if table was found and false otherwise
+ */
+ bool getAttrTablesByName(const string& tableName, TeTable& table, TeAttrTableType attType = TeAllAttrTypes);
+
+ //! Gets the name of the media table associated to layer
+ string mediaTable();
+
+ //! Sets the name of the media table associated to layer
+ void mediaTable(const string& name);
+ //@}
+
+ /** @name Geometries
+ * Methods to deal with the geometries of the objects of a layer
+ */
+ //! Returns a pointer to the raster geometry associated to an object of this layer
+ /*!
+ \param objectId unique identification of the object (if empty it will look
+ for the first raster geometry found)
+ \param mode permission access ('r', 'w')
+ */
+ TeRaster* raster(const string& objectId="",const char& mode = 'r');
+
+ //! Sets the pointer to the raster representation
+ void raster( TeRaster* raster);
+
+ //! Retrieves a polygon set given a selection criteria, expressed as a where clause
+ bool getPolygons(TePolygonSet &ps, const string& whereClause = "");
+
+ //! Retrieves a line set given a selection criteria, expressed as a where clause
+ bool getLines(TeLineSet &ls, const string& whereClause = "");
+
+ //! Retrieves a point set given a selection criteria, expressed as a where clause
+ bool getPoints(TePointSet &ps, const string& whereClause = "");
+
+ //! Retrieve a point set given a selection criteria, expressed as a where clause
+ bool getText(TeTextSet &ts, const string& whereClause = "");
+
+ //! Retrieve a cell set given a selection criteria, expressed as a where clause
+ bool getCells(TeCellSet &cs, const string& whereClause = "");
+
+ //! Locates a polygon that cointains a certain coordinate
+ bool locatePolygon(TeCoord2D &pt, TePolygon &polygon, const double& tol = 0.0);
+
+ //! Locates a line that cointains a certain coordinate
+ bool locateLine(TeCoord2D &pt, TeLine2D &line, const double& tol = 0.0);
+
+ //! Retrieves a point that cointains a certain coordinate
+ bool locatePoint(TeCoord2D &pt, TePoint &point, const double& tol = 0.0);
+
+ //! Retrieves a TeText that cointains a certain coordinate
+ bool locateText(TeCoord2D &pt, TeText &text, const double& tol = 0.0);
+
+ //! Retrieves a point that cointains a certain coordinate
+ bool locateCell(TeCoord2D &pt, TeCell &cell, const double& tol = 0.0);
+
+ //! Retrieves the set of polygons with a certain geoid
+ bool loadGeometrySet (const string& geoid, TePolygonSet &ps);
+
+ //! Retrieves the set of lines with a certain geoid
+ bool loadGeometrySet (const string& geoid, TeLineSet &ls);
+
+ //! Retrieves the set of points with a certain geoid
+ bool loadGeometrySet (const string& geoid, TePointSet &ps);
+
+ //! Retrieves the set of points with a certain geoid
+ bool loadGeometrySet (const string& geoid, TeCellSet &cs);
+
+ //! Adds a set of polygons to a layer
+ bool addGeometrySet(TePolygonSet& polySet, const string& /* tName */ = "")
+ { return addPolygons(polySet); }
+
+ //! Adds a set of lines to a layer
+ bool addGeometrySet(TeLineSet& lineSet, const string& /* tName */ = "")
+ { return addLines(lineSet); }
+
+ //! Adds a set of points to a layer
+ bool addGeometrySet(TePointSet& pointSet, const string& /* tName */ = "")
+ { return addPoints(pointSet); }
+
+ //! Adds a set of text to a layer
+ bool addGeometrySet(TeTextSet& textSet, const string& tName = "")
+ { return addText(textSet,tName); }
+
+ //! Adds a set of cells to a layer
+ bool addGeometrySet(TeCellSet& cellSet, const string& /* tName */ = "")
+ { return addCells(cellSet); }
+
+ //! Adds a set of polygons to a layer
+ bool addPolygons(TePolygonSet& polySet);
+
+ //! Adds a set of lines to a layer
+ bool addLines (TeLineSet& lineSet);
+
+ //! Adds a set of points to a layer
+ bool addPoints (TePointSet& pointSet);
+
+ //! Adds a set of text to a layer
+ bool addText (TeTextSet& textSet,const string& tName);
+
+ //! Adds a set of cells to a layer
+ bool addCells(TeCellSet& cellSet);
+
+ //@}
+
+ /** @name Geometries
+ * Methods to deal with geometrical representations of a layer
+ */
+ //! Removes a geometry from layer
+ bool removeGeometry (TeGeomRep repType, const string& tName="");
+
+ //! Indicates if layer has a geometry representation
+ bool hasGeometry (TeGeomRep rep);
+
+ //! Retrieves the table name associated to a geometry representation
+ /*! \param rep geometrical representation
+ \note When there is more than one representation of a given type
+ returns the table name associated to the first one encountered
+ */
+ string tableName(TeGeomRep rep);
+
+ //! Retrieves the number of geometries of a type
+ /*!
+ \param rep geometrical representation
+ */
+ int nGeometries(TeGeomRep rep);
+
+ //! Gets all information about a representation
+ bool getRepresentation(TeGeomRep repType, TeRepresPointerVector& result);
+
+ //! Gets an specific representation
+ /*!
+ \param repType the geometrical representation being searched
+ \param tableName the table associated to this representation
+ \return the representation associated to a geometry with the given table name
+ \note if no table name is specified the first found is returned
+ */
+ TeRepresentation* getRepresentation(TeGeomRep repType, const string& tableName="");
+
+ //! Creates a new geometry representation to a layer
+ /*
+ \param repType the geometrical representation being searched
+ \param tableName name of the table that will stored the geometries
+ \param desc description of the representation
+ \return true if success and false otherwise
+ */
+ bool addGeometry ( TeGeomRep repType, const string& tableName="", const string& desc = "");
+
+ //! Creates a new raster geometry to a layer
+ /*
+ \param par raster parameters
+ \param objectId identifier of the object that has the raster geometry
+ \param tableName name of the table that will stored the geometries
+ \param desc description of the representation
+ \return true if success and false otherwise
+ */
+ bool addRasterGeometry(TeRasterParams& par, const string& objectId,
+ const string& tableName="", const string& desc="");
+
+ //! Returns a combination of all representations in the layer
+ int geomRep();
+
+ //! Adds a representation to vector of representation of the layer
+ void addVectRepres(TeRepresentation* rep)
+ {
+ repVector_.push_back(rep);
+ }
+
+ //! Returns a vector with all representations in the layer
+ TeRepresPointerVector& vectRepres()
+ {
+ return repVector_;
+ }
+
+ //@}
+
+private:
+
+// -- Members
+
+// -- General Description of a layer
+
+ string name_; //!< layer name
+ int id_; //!< layer unique identification
+ TeDatabase* db_; //!< database connection to this layer
+ TeProjection* projection_; //!< layer projection
+ TeBox box_; //!< layer bounding box
+ TeRaster* raster_; //!< layer raster representation
+
+ TeAttrTableVector attTables_; //!< Attributes associated to a layer
+ TeRepresPointerVector repVector_; //!< vector of representations associated to this layer
+};
+
+//! A map from a integer unique identifier to a pointer to layer
+typedef map<int,TeLayer*> TeLayerMap;
+
+/** \example LayerExample1.cpp
+ * This is an example of how to create a layer with objects, atributes and geometries
+ */
+#endif
+
diff --git a/src/terralib/kernel/TeLegendEntry.h b/src/terralib/kernel/TeLegendEntry.h
new file mode 100644
index 0000000..a7ff5bf
--- /dev/null
+++ b/src/terralib/kernel/TeLegendEntry.h
@@ -0,0 +1,202 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeLegendEntry.h
+ This file deals with legends in TerraLib
+*/
+#ifndef __TERRALIB_INTERNAL_LEGENDENTRY_H
+#define __TERRALIB_INTERNAL_LEGENDENTRY_H
+
+#include "TeVisual.h"
+#include "TeUtils.h"
+#include "TeDataTypes.h"
+#include "TeSlice.h"
+
+#include <string>
+#include <vector>
+#include <map>
+
+using namespace std;
+
+class TeTheme;
+
+//! A map from representation types to a presentation visual characteristics
+typedef map<TeGeomRep,TeVisual> TeGeomRepVisualMap;
+
+
+//! A legend entry defines a group of objects and its visual presentation characteristics in a theme
+/*!
+ The group of objects is defined by a TeSlice, and has a unique identifier
+ The visual presentation characteristics id defined by a TeGeomRepVisualMap
+ Each legend entry has a unique identification
+*/
+class TeLegendEntry
+{
+public:
+
+ //! Constructor
+ TeLegendEntry::TeLegendEntry () :
+ label_(""),
+ id_(-1),
+ theme_(0),
+ group_(0)
+ {}
+
+ //! Constructor
+ TeLegendEntry::TeLegendEntry (const TeSlice& slice) :
+ slice_(slice),
+ id_(-1),
+ theme_(0),
+ group_(0)
+ {
+ if (slice_.from_ == "Missing Data")
+ label_ = "Missing Data";
+ else
+ {
+ int i = slice_.from_.find("mean = ");
+ if (i >= 0 || slice_.to_.empty())
+ label_ = slice_.from_;
+ else
+ label_ = slice_.from_ + " ~ " + slice_.to_;
+ }
+ }
+
+
+ //! Copy constructor
+ TeLegendEntry (const TeLegendEntry& leg)
+ {
+ if (&leg == this)
+ return;
+ visualMap_ = leg.visualMap_;
+ slice_ = leg.slice_;
+ label_ = leg.label_;
+ id_ = leg.id_;
+ theme_ = leg.theme_;
+ group_ = leg.group_;
+ }
+
+ //! Operator =
+ TeLegendEntry& operator = (const TeLegendEntry& leg)
+ {
+ visualMap_ = leg.visualMap_;
+ slice_ = leg.slice_;
+ label_ = leg.label_;
+ id_ = leg.id_;
+ theme_ = leg.theme_;
+ group_ = leg.group_;
+ return *this;
+ }
+
+ //! Returns the legend id
+ int id () { return id_; }
+ //! Sets the legend id
+ void id (int i) { id_ = i; }
+
+ //! Returns the theme identifier to which the legend belongs
+ int theme () { return theme_; }
+ //! Sets the theme id to which this legend belongs to
+ void theme (int i) { theme_ = i; }
+
+ //! Returns the group identifier associated to the legend
+ int group () { return group_; }
+ //! Sets the group identification to which this legend refers to
+ void group (int i) { group_ = i; }
+
+ //! Returns the visual presentation characteristics associated to a given representation
+ TeVisual& visual (TeGeomRep rep)
+ {
+ static TeVisual visual;
+ if(visualMap_.find(rep) == visualMap_.end())
+ return visual;
+ return visualMap_[rep];
+ }
+ //! Sets the visual presentation characteristics associated to a given representation
+ void setVisual (TeVisual &vis, TeGeomRep rep)
+ { visualMap_[rep] = vis; }
+ //! Return the visual presentation characteristics map
+ TeGeomRepVisualMap& getVisualMap()
+ { return visualMap_; }
+
+ //! Returns the slice associated to this legend
+ TeSlice& slice()
+ { return slice_; }
+ // Sets the slice associated to this legend
+ void setSlice(const TeSlice& sl)
+ { slice_ = sl; }
+ //! Returns the number of objects of the legend
+ int count()
+ { return slice_.count_; }
+ //! Sets the number of objects with the legend
+ void count(int n)
+ { slice_.count_ = n; }
+ //! Increase the number of objects with the legend
+ void incCount(int n=1)
+ { slice_.count_ += n; }
+
+ //! Returns the lower value associated to the legend
+ string from()
+ { return slice_.from_; }
+ //! Sets the lower value associated to the legend
+ void from(string& s)
+ { slice_.from_ = s; }
+
+ //! Returns the upper value associated to the legend
+ string to()
+ { return slice_.to_; }
+ //! Sets the upper value associated to the legend
+ void to(string& s)
+ { slice_.to_ = s; }
+
+ //! Returns the label associated to the legend
+ string label()
+ {
+ if (label_.empty())
+ {
+ int npos = slice_.from_.find("mean = ");
+ if (npos >= 0 || slice_.to_.empty())
+ label_ = slice_.from_;
+ label_ = slice_.from_ + " ~ " + slice_.to_;
+ }
+ return label_;
+ }
+ //! Sets the label associated to the legend
+ void label(string& s)
+ { label_ = s; }
+
+private:
+
+ TeGeomRepVisualMap visualMap_;
+ TeSlice slice_;
+ string label_;
+ int id_;
+ int theme_;
+ int group_;
+};
+
+//! A vector of legendy entries
+typedef vector<TeLegendEntry> TeLegendEntryVector;
+
+//! A map of legend identifiers to legend entrie pointers
+typedef map<int, TeLegendEntry*> TeLegendEntryMap;
+
+#endif
+
diff --git a/src/terralib/kernel/TeMatrix.cpp b/src/terralib/kernel/TeMatrix.cpp
new file mode 100644
index 0000000..7df0b10
--- /dev/null
+++ b/src/terralib/kernel/TeMatrix.cpp
@@ -0,0 +1,1516 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+ // TeMatrix.c -- matrix of type double
+
+#include <TeMatrix.h>
+#include <math.h>
+#include <stdio.h>
+
+
+TeMatrix::TeMatrix(){
+ nrow = 0;
+ ncol = 0;
+ mat = NULL;
+ lixo = 0.;
+}
+
+void
+TeMatrix::Clear()
+{
+ if( mat != NULL ){
+ int i;
+ for( i = 0; i < nrow; i++ )
+ if( mat[i] != NULL )
+ {
+ delete []mat[i];
+ mat[i]=NULL;
+ }
+ delete []mat;
+ mat = NULL;
+ }
+ nrow = ncol = 0;
+ lixo = (double)0;
+}
+
+TeMatrix::~TeMatrix()
+{
+ Clear();
+}
+
+short
+TeMatrix::Alloc(int nl, int nc)
+{
+ Clear();
+ if( nl <= 0 || nc <= 0 ){
+ return false;
+ }
+ nrow = nl;
+ ncol = nc;
+ if ( (mat = new double*[nrow]) == NULL ){
+ Clear();
+ return false;
+ }
+ int i,j;
+ for( i = 0; i < nrow; i++ ) mat[i] = NULL;
+ for( i = 0; i < nrow; i++ ){
+ if( (mat[i] = new double[ncol]) == NULL ){
+ Clear();
+ return false;
+ }
+ for( j = 0; j < ncol; j++ ) mat[i][j] = (double)0.;
+ }
+ return true;
+}
+
+TeMatrix::TeMatrix(const TeMatrix& m)
+{
+ nrow = ncol = 0;
+ mat = NULL;
+ lixo = 0.;
+ *this = m;
+}
+
+int
+TeMatrix::Init( int nl, int nc , double* f )
+{
+ if( f == NULL )
+ return Init( nl, nc, (double) 0 );
+ if( Alloc( nl, nc ) ){
+ int c=0;
+ int i,j;
+ for ( i = 0; i < nrow; i++)
+ for (j = 0; j < ncol; j++)
+ mat[i][j] = f[c++];
+ return true;
+ }
+ return false;
+}
+
+int
+TeMatrix::Init(int nl, int nc, double f )
+{
+ // initialize matrix
+ if( Alloc( nl, nc ) ){
+ int i,j;
+ for (i = 0; i < nrow; i++)
+ for (j = 0; j < ncol; j++)
+ mat[i][j] = f;
+ return true;
+ }
+ return false;
+}
+
+int
+TeMatrix::Init(int k, double* f)
+{
+ if( f == NULL )
+ return Init( k, k, (double) 0 );
+ if( Alloc(k,k) == false )
+ return false;
+ int i,j;
+ for ( i = 0; i < nrow; i++ )
+ for (j = 0; j < ncol; j++)
+ mat[i][j] = (i==j)? f[i]: (double)0.;
+ return true;
+}
+
+int
+TeMatrix::Init(int k, double f)
+{
+ if( Alloc(k,k) == false )
+ return false;
+ int i,j;
+ for (i=0; i<nrow; i++)
+ for (j=0; j<ncol; j++)
+ mat[i][j] = (i==j)? (double)f:0;
+ return true;
+}
+
+TeMatrix&
+TeMatrix::operator=(const TeMatrix& m)
+{
+
+ if( Alloc(m.nrow,m.ncol) == false ){
+ printf("\nMatrix::operator=:no memory available \n");
+ return *this;
+ }
+ int i,j;
+ for( i = 0; i < nrow; i++)
+ for( j = 0; j < ncol; j++)
+ mat[i][j] = m.mat[i][j];
+ return *this;
+}
+
+int
+TeMatrix::operator==(const TeMatrix& m) const
+{
+ if( nrow != m.nrow || ncol != m.ncol )
+ return false;
+ int i,j;
+ for ( i = 0; i < nrow; i++)
+ for ( j = 0; j < ncol; j++)
+ if ( mat[i][j]!= m.mat[i][j] )
+ return false;
+ return true;
+}
+
+void
+TeMatrix::operator*=(double f)
+{
+ int i,j;
+ for( i = 0; i < nrow; i++)
+ for( j = 0; j < ncol; j++)
+ mat[i][j] *= f;
+ return;
+}
+
+
+//-------------------------------------------------------------friend methods
+
+TeMatrix
+operator+(const TeMatrix& m,const TeMatrix& n)
+{
+ if( m.nrow != n.nrow || m.ncol != n.ncol ){
+ printf("\nMatrix::operator+ >>> Operandos com tamanhos diferentes\n");
+ return m;
+ }
+ TeMatrix rm;
+ if( rm.Init(m.Nrow(),m.Ncol()) == false ){
+ printf("\nMatrix::operator+ >>> Memoria nao disponivel\n");
+ return m;
+ }
+ int i,j;
+ for ( i = 0; i < m.Nrow(); i++)
+ for ( j = 0; j < m.Ncol(); j++)
+ rm.mat[i][j] = m.mat[i][j] + n.mat[i][j];
+ return rm;
+}
+
+TeMatrix
+operator-(const TeMatrix& m,const TeMatrix& n)
+{
+ if( m.nrow != n.nrow || m.ncol != n.ncol ){
+ printf("\nMatrix::operator+ >>> Operandos com tamanhos diferentes\n");
+ return m;
+ }
+ TeMatrix rm;
+ if( rm.Init(m.Nrow(),m.Ncol()) == false ){
+ printf("\nMatrix::operator- >>> Memoria nao disponivel\n");
+ return m;
+ }
+
+ int i,j;
+ for ( i = 0; i < m.Nrow(); i++)
+ for ( j = 0; j < m.Ncol(); j++)
+ rm.mat[i][j] = m.mat[i][j] - n.mat[i][j];
+ return rm;
+}
+
+TeMatrix
+TeMatrix::operator-()
+{
+ TeMatrix rm;
+ if( rm.Init(Nrow(),Ncol()) == false ){
+ printf("\n operator-:no memory \n");
+ return *this;
+ }
+ int i,j;
+ for (i=0; i<Nrow(); i++)
+ for (j=0; j<Ncol(); j++)
+ rm.mat[i][j] = -mat[i][j];
+ return rm;
+}
+
+TeMatrix
+operator*(const TeMatrix& m,const TeMatrix& n)
+{
+ if ( m.Ncol() != n.Nrow() ) {
+ printf( "\nMatrix::operator* >>> Operandos com tamanhos diferentes\n");
+ return m;
+ }
+ int nr = m.Nrow(), nc =n.Ncol();
+ TeMatrix result;
+ if( result.Init(nr,nc) == false){
+ printf("\nMatrix::operator* >>> Memoria nao disponivel\n");
+ return m;
+ }
+
+ double sum = (double)0.;
+ int l,c,i;
+
+ for ( l = 0; l < m.Nrow(); l++){
+ for ( c = 0; c < n.Ncol(); c++){
+ sum = (double)0.;
+ for ( i = 0; i < m.Ncol(); i++)
+ sum += m.mat[l][i] * n.mat[i][c];
+ result.mat[l][c] = sum;
+
+ }
+ }
+ return result;
+}
+
+TeMatrix
+operator*(double f,const TeMatrix& m)
+{
+ int nr = m.Nrow(), nc =m.Ncol();
+ TeMatrix rm;
+ if( rm.Init(nr,nc) == false){
+ printf("\noperator*:no memory");
+ return m;
+ }
+ int i,j;
+ for (i = 0; i < rm.Nrow(); i++)
+ for (j = 0; j < rm.Ncol(); j++)
+ rm.mat[i][j] = f * m.mat[i][j];
+ return rm;
+}
+
+//VRMC 12/98
+int
+TeMatrix::isUpperTriangle() const
+{
+ // elements above diagonal != 0
+ int i,j;
+ for(j = 0; j < ncol; j++)
+ for(i = j+1; i < nrow; i++)
+ if ( mat[i][j] != (double)0 )
+ return false;
+ return true;
+}
+
+//VRMC 12/98
+int
+TeMatrix::isLowerTriangle() const
+{
+ // elements under diagonal different 0
+ int i,j;
+/* for(j=0; j<ncol; j++)
+ for(i=j+1; i<nrow; i++)
+ if ( mat[i][j]!=0 )*/
+ // VRMC 11/98
+ for (i=0; i< nrow; i++)
+ for (j= i+1; j <ncol; j++)
+ if ( mat[i][j] != (double)0)
+ return false;
+ return true;
+}
+
+double
+TeMatrix:: Determinant()
+{
+ if (Nrow() != Ncol()) {
+ printf("\nMatrix::Determinant >>> not a square matrix\n");
+ return lixo;
+ }
+ if (Nrow()==1) return mat[0][0];
+ if (Nrow()==2)
+ return mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0];
+ if (Nrow()==3)
+ return ( mat[0][0] * mat[1][1] * mat[2][2]
+ +mat[0][1] * mat[1][2] * mat[2][0]
+ +mat[0][2] * mat[1][0] * mat[2][1]
+ -mat[0][1] * mat[1][0] * mat[2][2]
+ -mat[0][0] * mat[1][2] * mat[2][1]
+ -mat[0][2] * mat[1][1] * mat[2][0] );
+ if ( isUpperTriangle() ) {
+ double val = 1;
+ int i;
+ for (i = 0; i < Nrow(); i++) val *= mat[i][i];
+ return val;
+ }
+ TeMatrix mt;
+ double val = 0;
+ double det;
+ int sign = 1;
+ int j;
+ for(j = 0; j < Ncol(); j++) {
+ if( CoFactor(0,j, mt) == false )
+ return (double)0;
+ det = mt.Determinant();
+ val += sign * mat[0][j] * det;
+ sign *= -1;
+ }
+ return val;
+}
+
+int
+TeMatrix::CoFactor(int irow, int jcol, TeMatrix& mt ) const
+{
+ if ( nrow == 1||ncol == 1 ) {
+ printf("\nMatrix::CoFactor >>> can't CoFactor row or column matrix\n");
+ return false;
+ }
+ if( mt.Init(nrow-1,ncol-1) == false){
+ printf("\nMatrix::CoFactor: Memoria nao disponivel\n");
+ return false;
+ }
+ int getcol, getrow =0;
+ int i,j;
+ for(i=0; i < mt.Nrow(); i++) {
+ if ( getrow == irow ) ++getrow;
+ if ( getrow == nrow ) break;
+ getcol = 0;
+ for(j=0; j < mt.Ncol(); j++) {
+ if ( getcol==jcol ) ++getcol;
+ if ( getcol==ncol ) continue;
+ mt.mat[i][j] = mat[getrow][getcol];
+ ++getcol;
+ }
+ ++getrow;
+ }
+ return true;
+}
+
+int
+TeMatrix::Transpose( TeMatrix &rm ) const
+{
+ if( &rm == this ){
+ printf("\nMatrix::Transpose >>> Operacao usa duas matrizes\n");
+ return false;
+ }
+
+ if( rm.Init( ncol, nrow ) == false){
+ printf("\nMatrix::Transpose >>> Memoria nao disponivel\n");
+ return false;
+ }
+ int i,j;
+ for(i = 0; i < ncol; i++)
+ for( j = 0; j < nrow; j++)
+ rm.mat[i][j] = mat[j][i];
+ return true;
+}
+
+// VRMC 12/98
+int
+TeMatrix::isSimetric() const
+{
+ int i,j;
+
+ if (nrow != ncol){
+ printf("\nMatrix::isSimetric >>> Memoria nao disponivel\n");
+ return false;
+ }
+
+ for (i = 0; i < nrow; i++)
+ for (j = 0; j < ncol; j++)
+ if ( mat[i][j] != mat[j][i]) return false;
+
+ return true;
+}
+
+// VRMC 12/98
+int
+TeMatrix::isPositiveDefinide() const
+{
+ int i, j, dim, subdim;
+ TeMatrix Submat;
+
+ if (nrow != ncol){
+ printf("\nMatrix::isPositiveDefinide >>> Matriz tem que ser quadrada\n");
+ return false;
+ }
+ dim = nrow;
+
+ for (subdim=1 ; subdim <= dim; subdim++)
+ {
+ if( Submat.Init( subdim,subdim ) == false ){
+ printf("\nMatrix::isPositiveDefinide>>>Memoria nao disponivel!\n");
+ return false;
+ }
+
+ for ( i=0; i < subdim; i++)
+ for (j = 0; j < subdim; j++)
+ Submat(i,j) = mat[i][j];
+
+ if (Submat.Determinant() <= 0.) {
+ printf("\nMatrix::isPositiveDefinide>>>Matriz nao e positiva definida!\n");
+ return false;
+ }
+
+ Submat.Clear();
+ }
+ return true;
+}
+
+// VRMC 12/98
+int
+TeMatrix :: MatTransf( TeMatrix& mt )
+{
+ TeMatrix TI; // inverse of a inferior triangular matrix
+ int dim;
+
+ if( &mt == this ){
+ printf("\nMatrix::MatTransf >>> Operacao usa duas matrizes\n");
+ return false;
+ }
+
+ if( nrow <= 0 || ncol <= 0 ){
+ printf("\nMatrix::MatTransf >>> Dimensoes da matriz invalidas!\n");
+ return false;
+ }
+
+ if( nrow != ncol ){
+ printf("\nMatrix::MatTransf >>> Dimensoes da matriz invalidas!\n");
+ return false;
+ }
+
+ dim = nrow;
+ if( mat[0][0] <= 0. ){
+ printf("\nMatrix::MatTranf >>> ERROR\n");
+ return false;
+ }
+
+ if( TI.Init( dim, (double)0. ) == false ){
+ printf("\nMatrix::MatTransf >>> Memoria nao disponivel!\n");
+ return false;
+ }
+
+
+ //-- Calculate inferior triangular matrix by Cholesky decomposition method
+ if ((*this).CholeskyDecomp(TI) == false) {
+ printf("\nMatrix::MatTransf>>> Nao foi possivel decompor a matriz!\n");
+ return false;
+ }
+
+ //-- Calculate the inverse of Cholesky matrix
+// if (TI.CholeskyInv(mt) != true)
+ if (!(TI.CholeskyInv(mt)))
+ {
+ printf("\nMatrix::MatTransf>>> Matriz nao inversivel!\n");
+ return false;
+ }
+
+ return true;
+}
+
+// VRMC 12/98
+int
+TeMatrix::CholeskyInv (TeMatrix& mt) const
+{
+ if( mt.Init(nrow,(double)0.) == false ){
+ printf("\nMatrix::CholeskyInv >>> Memoria nao disponivel!\n");
+ return false;
+ }
+
+ if( &mt == this ){
+ printf("\nMatrix::CholeskyInv >>> Operacao usa duas matrizes\n");
+ return false;
+ }
+ if ( nrow != ncol ){
+ printf("\nMatrix::CholeskyInv>>> Can't invert a non-square matrix");
+ return false;
+ }
+// if (this->isLowerTriangle() != true) {
+ if (!(this->isLowerTriangle())) {
+ printf("\nMatrix::CholeskyInv >>> Matriz nao e triangular inferior\n");
+ return false;
+ }
+
+ int i; double rf;
+ for( i = 0; i < nrow; i++ ){
+ if( this->mat[i][i] == (double)0. ){
+ printf("\nMatrix::CholeskyInv >>> ERROR IV\n");
+ return false;
+ }
+ mt.mat[i][i] = (double)1. / this->mat[i][i];
+ int j,k;
+ for( j = i-1; j >= 0; j-- ){
+ rf = (double)0.;
+ for( k = j; k <= i-1; k++ ){
+ rf += ( this->mat[i][k] * mt.mat[k][j] );
+ }
+ mt.mat[i][j] = -rf * mt.mat[i][i];
+ }
+ }
+ return true;
+}
+
+
+int
+TeMatrix::EigenValues( TeMatrix& mt )
+{
+ //--- calcula os eigenvalues de uma
+ // matriz representada na forma vetorial
+ // Os auto valores sao devolvidos em ordem decrescente
+ // e ocupam as posicoes: 0, 2, 5, 9, ... .
+
+ if( &mt == this ){
+ printf("\nMatrix::EigenValues >>> Operacao usa duas matrizes\n");
+ return false;
+ }
+
+double *cov = NULL, /* matriz de covariancia */
+ *e_val = NULL; /* " de auto_valores */
+
+int dim = (*this).Nrow(); /* ordem da matriz*/
+
+int i,j,k, /* cov[], e_val[] */
+ ia, /* */
+ ind, /* |0 | */
+ l,m, /* |1 2 | */
+ mq,lm, /* |3 4 5 | */
+ ll,mm, /* |6 7 8 9| */
+ ilq,imq, /* */
+ im,iq,il,lq, /* (para DIM=4) */
+ jq;
+
+double range, /* e_vec[] */
+ dim1,fdim, /* */
+ anorm, /* |0 4 8 12| */
+ anrmx, /* |1 5 9 13| */
+ thr, /* |2 6 10 14| */
+ x,y,z, /* |3 7 11 15| */
+ sinx,cosx, /* */
+ sinx2,cosx2,
+ sincs;
+
+int fat = (dim*dim+dim)/2;
+
+ if( dim <= 0 ){
+ printf("\nMatrix::EigenValues >>> dimensao da matriz nula!\n");
+ return false;
+ }
+ if( mt.Init( dim, (double)1 ) == false ){
+ printf("\nMatrix::EigenValues >>> Memoria nao disponivel\n");
+ return false;
+ }
+ range = 1.0e-6 ;
+ dim1 = dim - 1 ;
+ fdim = dim;
+
+ cov = new double[fat];
+
+ if( cov == NULL ){
+ printf("\nMatrix::EigenValues >>> Memoria nao disponivel (COV)\n");
+ return false;
+ }
+
+ e_val = new double[fat];
+ if( e_val == NULL ){
+ delete []cov; //SSL0296
+ cov = NULL;
+ printf("\nMatrix::EigenValues >>> Memoria nao disponivel (EVAL)\n");
+ return false;
+ }
+ k = 0;
+ for ( i = 0; i< dim; i++)
+ for ( j = 0; j <= i; j++)
+ cov[k++] = mat[i][j];
+
+ for (i=0; i < ((dim*dim+dim)/2); i++) e_val[i] = cov[i];
+
+ anorm = 0.0;
+
+ for ( j = 0; j < dim; j++){
+ for (i = 0; i <= j; i++){
+ if (i != j){
+ ia = i + (j*j+j)/2;
+ anorm = anorm + e_val[ia] * e_val[ia];
+ }
+ }
+ }
+
+ if (anorm <= 0) goto l5;
+
+ anorm = 1.414 * sqrt((double)anorm);
+ anrmx = anorm * range/fdim;
+ ind = 0;
+ thr = anorm;
+
+l1:
+ thr = thr/fdim;
+l2:
+ l = 0;
+l3:
+ m = l+1;
+l4:
+ mq = (m*m + m)/2;
+ lq = (l*l + l)/2;
+ lm = l + mq;
+
+ if ( fabs((double)(e_val[lm])) >= thr )
+ {
+ ind = 1;
+ ll = l + lq;
+ mm = m + mq;
+
+ x = 0.5 * (e_val[ll] - e_val[mm]);
+ z = e_val[lm] * e_val[lm] + x*x;
+ y = - e_val[lm] / sqrt((double)(z));
+
+ if (x < 0)
+ {
+ y = -y;
+ }
+
+ z = sqrt( (double)(1.0-y*y) );
+ sinx = y / sqrt( (double)( 2.0*(1.0 + z) ) );
+ sinx2 = sinx * sinx;
+
+ cosx = sqrt( (double)(1.0 - sinx2) );
+ cosx2 = cosx * cosx;
+
+ sincs = sinx * cosx;
+
+ ilq = dim * l;
+ imq = dim * m;
+
+ for (i = 0; i < dim; i++)
+ {
+ iq = (i*i + i)/2;
+ if ( i != l )
+ {
+ if (i != m)
+ {
+ if (i > m)
+ im = m + iq;
+ else
+ im = i + mq;
+ if (i < l)
+ il = i + lq;
+ else
+ il = l + iq;
+
+ x = e_val[il] * cosx - e_val[im] * sinx;
+ e_val[im] = e_val[il] * sinx + e_val[im] * cosx;
+ e_val[il] = x;
+ }
+ }
+ }
+ x = 2.0 * e_val[lm] * sincs;
+ y = e_val[ll] * cosx2 + e_val[mm] * sinx2 - x;
+ x = e_val[ll] * sinx2 + e_val[mm] * cosx2 + x;
+
+ e_val[lm] = (e_val[ll]-e_val[mm])*sincs+e_val[lm]*(cosx2-sinx2);
+ e_val[ll] = y;
+ e_val[mm] = x;
+ }
+
+ if (m != (dim-1))
+ {
+ m = m + 1; goto l4;
+ }
+ if (l != (dim-2))
+ {
+ l = l + 1; goto l3;
+ }
+ if (ind == 1)
+ {
+ ind = 0; goto l2;
+ }
+ if (thr > anrmx) goto l1;
+
+l5:
+ iq = -dim;
+
+ for (i = 0; i < dim; i++)
+ {
+ iq = iq + dim;
+ ll = i + (i*i + i)/2;
+ jq = dim * (i-1);
+
+ for (j = i; j < dim; j++)
+ {
+ jq = jq + dim;
+ mm = j + (j*j + j)/2;
+
+ if (e_val[ll] < e_val[mm])
+ {
+ x = e_val[ll];
+ e_val[ll] = e_val[mm];
+ e_val[mm] = x;
+ }
+ }
+ }
+
+ for ( i = 0; i< dim; i++){
+ mt(i,0) = e_val[(i*(i+1))/2+i];
+ }
+
+ delete []cov; //SSL0296
+ delete []e_val; //SSL0296
+
+ return true;
+}
+
+//--------------------------------------------------EigenVectors
+//
+// Metodo adaptado a partir de uma implementacao em C
+// utilizada no software SITIM.
+
+int
+TeMatrix::EigenVectors( TeMatrix& mt )
+{
+ if( &mt == this ){
+ printf("\nMatrix::EigenVectors >>> Operacao usa duas matrizes\n");
+ return false;
+ }
+
+double *cov = NULL, /* matriz de covariancia */
+ *e_val = NULL, /* " de auto_valores */
+ *e_vec = NULL; /* " de auto_vetores */
+
+int dim = (*this).Nrow(); /* ordem da matriz*/
+
+int i,j,ij,k, /* cov[], e_val[] */
+ ia, /* */
+ ind, /* |0 | */
+ l,m, /* |1 2 | */
+ mq,lm, /* |3 4 5 | */
+ ll,mm, /* |6 7 8 9| */
+ ilq,imq, /* */
+ im,iq,il,lq, /* (para DIM=4) */
+ ilr,imr,
+ jq;
+
+double range, /* e_vec[] */
+ dim1,fdim, /* */
+ anorm, /* |0 4 8 12| */
+ anrmx, /* |1 5 9 13| */
+ thr, /* |2 6 10 14| */
+ x,y,z, /* |3 7 11 15| */
+ sinx,cosx, /* */
+ sinx2,cosx2,
+ sincs;
+
+ if( dim <= 0 ){
+ printf("\nMatrix::EigenValues >>> dimensao da matriz nula!\n");
+ return false;
+ }
+ if( mt.Init( dim, (double)1 ) == false ){
+ printf("\nMatriz::EigenVectors >>> Memoria nao disponivel!\n");
+ return false;
+ }
+
+ int fat =(dim*dim+dim)/2;
+ range = 1.0e-6 ;
+ dim1 = dim - 1 ;
+ fdim = dim;
+
+ cov = new double[fat];
+ e_vec = new double[dim*dim];
+ e_val = new double[fat];
+
+ if( cov == NULL || e_vec == NULL || e_val == NULL ){
+ printf("\nMatrix::EigenVectors >>> Memoria nao disponivel\n");
+ return false;
+ }
+
+ k = 0;
+ for ( i = 0; i< dim; i++)
+ for ( j = 0; j <= i; j++)
+ cov[k++] = (*this)(i,j);
+
+ for (i=0; i < ((dim*dim+dim)/2); i++) e_val[i] = cov[i];
+
+ iq = -dim;
+ for (i = 0; i < dim; i++)
+ {
+ iq = iq + dim;
+ for ( j = 0; j < dim; j++)
+ {
+ ij = iq + j;
+ if (i == j)
+ e_vec[ij] = 1.0;
+ else
+ e_vec[ij] = 0.0;
+ }
+ }
+
+ anorm = 0.0;
+
+ for ( j = 0; j < dim; j++)
+ {
+ for (i = 0; i <= j; i++)
+ {
+ if (i != j)
+ {
+ ia = i + (j*j+j)/2;
+ anorm = anorm + e_val[ia] * e_val[ia];
+ }
+ }
+ }
+
+ if (anorm <= 0) goto l5;
+
+ anorm = 1.414 * sqrt((double)anorm);
+ anrmx = anorm * range/fdim;
+ ind = 0;
+ thr = anorm;
+
+l1:
+ thr = thr/fdim;
+l2:
+ l = 0;
+l3:
+ m = l+1;
+l4:
+ mq = (m*m + m)/2;
+ lq = (l*l + l)/2;
+ lm = l + mq;
+
+ if ( fabs((double)(e_val[lm])) >= thr )
+ {
+ ind = 1;
+ ll = l + lq;
+ mm = m + mq;
+
+ x = 0.5 * (e_val[ll] - e_val[mm]);
+ z = e_val[lm] * e_val[lm] + x*x;
+ y = - e_val[lm] / sqrt((double)(z));
+
+ if (x < 0)
+ {
+ y = -y;
+ }
+
+ z = sqrt( (double)(1.0-y*y) );
+ sinx = y / sqrt( (double)( 2.0*(1.0 + z) ) );
+ sinx2 = sinx * sinx;
+
+ cosx = sqrt( (double)(1.0 - sinx2) );
+ cosx2 = cosx * cosx;
+
+ sincs = sinx * cosx;
+
+ ilq = dim * l;
+ imq = dim * m;
+
+ for (i = 0; i < dim; i++)
+ {
+ iq = (i*i + i)/2;
+ if ( i != l )
+ {
+ if (i != m)
+ {
+ if (i > m)
+ im = m + iq;
+ else
+ im = i + mq;
+ if (i < l)
+ il = i + lq;
+ else
+ il = l + iq;
+
+ x = e_val[il] * cosx - e_val[im] * sinx;
+ e_val[im] = e_val[il] * sinx + e_val[im] * cosx;
+ e_val[il] = x;
+ }
+ }
+
+ //--- calculate eigenvectors
+
+ ilr = ilq + i;
+ imr = imq + i;
+ x = e_vec[ilr] * cosx - e_vec[imr] * sinx;
+ e_vec[imr] = e_vec[ilr] * sinx + e_vec[imr] * cosx;
+ e_vec[ilr] = x;
+ }
+
+ x = 2.0 * e_val[lm] * sincs;
+ y = e_val[ll] * cosx2 + e_val[mm] * sinx2 - x;
+ x = e_val[ll] * sinx2 + e_val[mm] * cosx2 + x;
+
+ e_val[lm] = (e_val[ll]-e_val[mm])*sincs+e_val[lm]*(cosx2-sinx2);
+ e_val[ll] = y;
+ e_val[mm] = x;
+ }
+
+ if (m != (dim-1))
+ {
+ m = m + 1; goto l4;
+ }
+ if (l != (dim-2))
+ {
+ l = l + 1; goto l3;
+ }
+ if (ind == 1)
+ {
+ ind = 0; goto l2;
+ }
+ if (thr > anrmx) goto l1;
+
+l5:
+ iq = -dim;
+
+ for (i = 0; i < dim; i++)
+ {
+ iq = iq + dim;
+ ll = i + (i*i + i)/2;
+ jq = dim * (i-1);
+
+ for (j = i; j < dim; j++)
+ {
+ jq = jq + dim;
+ mm = j + (j*j + j)/2;
+
+ if (e_val[ll] < e_val[mm])
+ {
+ x = e_val[ll];
+ e_val[ll] = e_val[mm];
+ e_val[mm] = x;
+
+ for (k = 0; k < dim; k++)
+ {
+ ilr = iq + k;
+ imr = jq + k;
+ x = e_vec[ilr];
+ e_vec[ilr] = e_vec[imr];
+ e_vec[imr] = x;
+ }
+ }
+ }
+ }
+
+ k=0;
+ for ( i = 0; i< dim; i++){
+ for ( j = 0; j< dim; j++)
+ mt(j,i) = e_vec[k++];
+ }
+
+ delete []cov; //SSL0296
+ delete []e_vec; //SSL0296
+ delete []e_val; //SSL0296
+
+ return true;
+}
+
+//--------------------------------------------------EigenVec
+//
+// Metodo desenvolvido para suporte de decisao (suporte_stubs.cpp)
+// Missae Yamamoto (junho/1999)
+
+int
+TeMatrix::EigenVec( double e_vec[] )
+{
+
+double *e_vec_aux = NULL, soma = 0.0;
+
+int dim = (*this).Nrow(); /* ordem da matriz*/
+
+TeMatrix aux1, aux2, mt;
+
+int i,j,k;
+
+ if( dim <= 0 )
+ {
+ printf("\nMatrix::EigenVecVal >>> dimensao da matriz nula!\n");
+ return false;
+ }
+
+ if( aux1.Init( dim, (double)1 ) == false )
+ {
+ printf("\nMatrix::EigenVecVal >>> Memoria nao disponivel!\n");
+ return false;
+ }
+
+ if( aux2.Init( dim, (double)1 ) == false )
+ {
+ printf("\nMatrix::EigenVecVal >>> Memoria nao disponivel!\n");
+ return false;
+ }
+
+ e_vec_aux = new double[dim];
+
+ if( e_vec_aux == NULL )
+ {
+ printf("\nMatrix::EigenVecVal >>> Memoria nao disponivel\n");
+ return false;
+ }
+
+ for ( k = 0; k< dim; k++)
+ {
+ e_vec_aux[k] = 0.0;
+ e_vec[k] = 0.0;
+ }
+
+ aux1 = *this;
+ aux2 = *this;
+
+ for (;;)
+ {
+ mt = aux1 * aux2;
+
+ for (i=0; i<dim; i++)
+ {
+ for (j=0; j<dim; j++)
+ e_vec[i] = e_vec[i] + mt(i,j);
+ soma = soma + e_vec[i];
+ }
+
+ for (j=0; j<dim; j++)
+ e_vec[j] = e_vec[j] / soma;
+
+ for (j=0; j<dim; j++)
+ {
+ if ( fabs(e_vec_aux[j] - e_vec[j]) < 0.001 )
+ {
+ delete []e_vec_aux;
+ return true;
+ }
+ e_vec_aux[j] = e_vec[j];
+ }
+
+ aux1 = mt;
+ aux2 = mt;
+ }
+
+}
+
+//------------------------------------------ Print
+void
+TeMatrix::Print()
+{
+ //printf("\nMATRIZ ( %d, %d ) LIXO %f **mat %p\n", nrow,ncol, lixo, mat);
+ printf("\nMATRIZ ( %d, %d )\n\n", nrow,ncol);
+ if( mat == NULL ){
+ printf("\n>>> mat e NULL \n");
+ return;
+ }
+ int i,j;
+ for(i = 0; i < nrow; i++){
+ for( j = 0; j < ncol;j++){
+ printf("%10.4f ",(float)mat[i][j]);
+ }
+ printf("\n\n");
+ }
+}
+
+// VRMC 12/98
+int
+TeMatrix::CholeskyDecomp( TeMatrix& mt )
+{
+
+ //-- Verify if the matrix is simetric
+ if ((*this).isSimetric() == false){
+ printf("\nMatrix::CholeskyDecomp >>> Matriz nao e simetrica!\n");
+ return false;
+ }
+ //-- Verify if the matrix is positive definide
+ if ((*this).isPositiveDefinide() == false){
+ printf("\nMatrix::CholeskyDecomp >>> Matriz nao e positiva definida!\n");
+ return false;
+ }
+ if( &mt == this ){
+ printf("\nMatrix::CholeskyDecomp >>> Operacao usa duas matrizes\n");
+ return false;
+ }
+ if( mat[0][0] <= 0. ){
+ printf("\nMatrix::CholeskyDecomp >>> Posicao [0,0] e' nula\n");
+ return false;
+ }
+ if( mt.Init(nrow,ncol) == false ){
+ printf("\nMatrix::CholeskyDecomp>>>no memory \n");
+ return false;
+ }
+ mt(0,0) = (double)sqrt((double)(*this)(0,0));
+
+ //--- Calculate the first column of the TeMatrix mt
+
+ int i,j,k;
+ for( i= 0; i < nrow; i++){
+ mt(i,0) = (*this)(i,0)/mt(0,0);
+ }
+
+ for( i= 1; i < nrow; i++){
+ for( j= 1; j <= i; j++){
+ //int m = (j*j - j)/2 + 1;
+ double rf = 0.;
+ //int k2 = j - 1;
+ //for( k = 0;k<=k2;k++)
+ for( k = 0;k < j;k++)
+ rf += mt(i,k) * mt(j,k);
+ if( i == j ){
+ rf = (*this)(i,j) - rf;
+ if( rf < 0. ){
+ printf("\nMatrix::CholeskyDecomp:ERRO \n");
+ return false;
+ }
+ mt(i,j) = (double)sqrt((double)rf);
+ }
+ else{
+ if( mt(j,j) == 0. ){
+ printf("\nMatrix::CholeskyDecomp:ERRO \n");
+ return false;
+ }
+ mt(i,j) = ((*this)(i,j)-rf)/mt (j,j );
+ }
+ }
+ }
+ return true;
+}
+
+
+//-------------------------------------------------Inverse(SITIM)
+//
+//--- Calcula a matriz inversa pelo metodo de Gauss-Jordan.
+//
+
+int
+TeMatrix::Inverse( TeMatrix& matinv ) const
+{
+
+ if( &matinv == this ){
+ printf("\nMatrix::Inverse >>> Operacao usa duas matrizes\n");
+ return false;
+ }
+ if ( nrow != ncol ){
+ printf("\nMatrix::Inverse: can't invert a non-square matrix");
+ return false;
+ }
+
+ if( matinv.Init( this->nrow, (double)1 ) == false ){
+ printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+ return false;
+ }
+
+//--- Calculo da inversa se a matriz tem dimensao unitaria
+
+ if(nrow == 1){
+ if(mat[0][0] == 0.0) {
+ printf("\noperator~: can't invert singular matrix");
+ return false;
+ }
+ matinv(0,0) = 1. / mat[0][0];
+ return true;
+ }
+
+//--- Formacao da matriz aumentada mataum
+
+ int m2 = 2 * nrow ;
+ TeMatrix mataum;
+
+ if( mataum.Init( nrow , m2 ) == false ){
+ printf("\nInverse:no memory");
+ return false;
+ }
+
+ int i1,i2,i3;
+ for(i1 = 0 ; i1 < nrow ; i1++){
+ for( i2 = 0 ; i2 < ncol ; i2++)
+ mataum(i1,i2) = mat[i1][i2];
+
+ for( i3 = nrow ; i3 < m2 ; i3++)
+ mataum(i1,i3) = 0.0;
+
+ mataum( i1, i1 + nrow) = 1.0;
+ }
+
+//-- Inicializa ponteiro de linhas
+
+ double *maxlinha = NULL;
+
+ if( ( maxlinha = new double[nrow] ) == NULL ){
+ printf("\nMatrix::Inverse>>no memory");
+ return false;
+ }
+
+ double sup,lcon1,amul,pivo;
+ int * lp = NULL;
+
+ if( (lp = new int[nrow]) == NULL ){
+ printf("\nMatrix::Inverse>>no memory");
+ if( maxlinha != NULL){delete []maxlinha; maxlinha = NULL;} //SSL0296
+ return false;
+ }
+
+ for(i1 = 0 ; i1 < nrow ; i1++)
+ lp[i1] = i1;
+
+ int lcon = 0;
+ int m1 = nrow - 1;
+
+ while(lcon < nrow){
+//--- Selecao do maior valor em cada linha . seu inverso e armazenado em maxlinha.
+ for(i1 = 0 ; i1 < nrow ; i1++){
+ sup = 0.0;
+ for(i2 = 0 ; i2 < nrow ; i2++){
+ lcon1 = (double)fabs(mataum(lp[i1],i2));
+ if((lcon1 - sup ) > 0.000001 )
+ sup = lcon1;
+ }
+ if(sup == 0.0){
+ printf("\nMatrix::Inverse>>Determinant = 0.");
+ if( maxlinha != NULL){ delete []maxlinha; maxlinha = NULL; } //SSL0296
+ if( lp != NULL){ delete []lp; lp = NULL; } //SSL0296
+ return false;
+ }
+ maxlinha[lp[i1]] = 1.0 / sup;
+ }
+
+//--- Selecao do pivo em cada linha
+
+ int lpi;
+ double supc = fabs((double)( mataum(lp[lcon],lcon) * maxlinha[lp[lcon]] ));
+ pivo = mataum(lp[lcon],lcon);
+ lpi = lcon;
+ for(i1 = lcon ; i1 < nrow ; i1++){
+ amul = mataum(lp[i1],lcon) * maxlinha[lp[i1]];
+ if (fabs(amul) > supc ){
+ supc = (fabs((double)amul));
+ pivo = mataum(lp[i1],lcon);
+ lpi = i1;
+ }
+ }
+
+ if(pivo == 0.0){
+ printf("\nMatrix::Inverse>>Determinant = 0.");
+ if( maxlinha != NULL){ delete []maxlinha; maxlinha = NULL; } //SSL0296
+ if( lp != NULL){ delete []lp; lp = NULL; } //SSL0296
+ return false;
+ }
+
+ /* troca de linhas */
+ i1 = lp[lcon];
+ lp[lcon] = lp[lpi];
+ lp[lpi] = i1;
+
+//--- Divide a linha pelo pivo
+ for(i2 = 0 ; i2 < m2 ; i2++){
+ mataum(lp[lcon],i2) = mataum(lp[lcon],i2) / pivo ;
+ }
+
+//--- Realiza subtracoes nas linhas de forma a zerar os elementos da coluna
+//--- dada pelo indice lcon
+
+ int il = lcon;
+
+ for(i2 = 0; i2 < m1 ; i2++){
+ il = il + 1;
+ if(il >= nrow ) il = 0;
+ double aux = - mataum(lp[il],lcon);
+ for(i3 = lcon; i3 < m2 ; i3++)
+ mataum(lp[il],i3) = mataum(lp[il],i3) + aux * mataum(lp[lcon],i3);
+
+ mataum(lp[il],lcon) = 0.0;
+ }
+
+ lcon = lcon + 1;
+ }
+
+//--- Copia a parte extendida de mataum em matinv que passa a ser a matriz inversa
+ for(i1 = 0 ; i1 < nrow ; i1++){
+ for(i2 = nrow ; i2 < m2 ; i2++){
+ i3 = i2 - nrow ;
+ matinv(i1,i3) = mataum(lp[i1],i2);
+ }
+ }
+
+ if( maxlinha != NULL){
+ delete []maxlinha; //SSL0296
+ maxlinha = NULL;
+ }
+ if( lp != NULL){
+ delete []lp; //SSL0296
+ lp = NULL;
+ }
+
+ return true;
+}
+
+// Esse m�todo, n�o esta correto
+//------------------------------------------Inverse
+// NIH library
+// 1. triangulate: *this = ~P*T
+// 2. when T isUpperTriangle ~T isUpperTriangle
+// 3. split: T = T.row(0) + subT
+// 4. I = ~T*T
+// 5. ~T.at(0,0) = 1/T.at(0,0)
+// 6. sub~T = ~(subT)
+// 7. ~T.row(0) = [1/T.at(0,0)]&B
+// where T.at(0,0)*B = [t21 ... t2n]*~subT
+// 8. ~*this = ~T*P
+
+/*int
+TeMatrix::InverseNIH( TeMatrix& mt ) const
+{
+ TeMatrix r;
+ TeMatrix _subT;
+ TeMatrix B;
+ TeMatrix val;
+
+ if ( nrow!=ncol || nrow <= 0 || ncol <= 0 ){
+ printf("\nMatrix::Inverse >>> Matriz nao inversivel!\n");
+ return false;
+ }
+
+ if( mt.Init( this->nrow, (double)1 ) == false ){
+ printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+ return false;
+ }
+
+ if ( nrow==1 ){
+ if( mat[0][0] == (double)0 ){
+ printf("\nMatrix::Inverse >>> Matriz nao inversivel!\n");
+ return false;
+ }
+ mt.mat[0][0] = 1/mat[0][0];
+ return true;
+ }
+ TeMatrix T(*this);
+ if( T.Initialized() == false ){
+ printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+ return false;
+ }
+
+ // 1. triangulate: *this = ~P*T
+ TeMatrix P;
+ if( P.Init(nrow,ncol) == false){
+ printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+ return false;
+ }
+ if( T.UpperTriangle( P ) == false ){
+ printf("\nMatriz::Inverse >>> ERRO!\n");
+ return false;
+ }
+ if ( T.Determinant()==0 ) {
+ printf("\nMatrix::Inverse >>> can't invert singular matrix\n");
+ return false;
+ }
+
+ // 2. when T isUpperTriangle ~T isUpperTriangle
+ // 3. split: T = T.row(0) + subT
+
+ if( r.Init(1,ncol-1,&(T.mat[0][1])) == false){
+ printf("\nMatrix::Inverse* >>> Memoria nao disponivel\n");
+ return false;
+ }
+
+ T.CoFactor(0,0,mt);
+ mt.Inverse(_subT);
+ if( _subT.Initialized() == false){
+ printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+ return false;
+ }
+
+
+ B = (-(1/T.mat[0][0])*r*_subT);
+ if( B.Initialized() == false ){
+ printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+ return false;
+ }
+
+ if( val.Init(nrow,ncol) == false){
+ printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+ return false;
+ }
+
+ val.mat[0][0] = 1/T.mat[0][0];
+ int i;
+ for(i=1; i<ncol; i++) val.mat[0][i]=B.mat[0][i-1];
+ val.CoFactor(0,0,_subT);
+
+ mt = val*P; // P is now the row-reduction transformation
+
+ return true;
+}
+*/
+
+// os m�todos switchRows e combineRows ficarao comentados
+// pois s� sao utilizados no calculo da matriz inversa NIH,
+// inversaNIH, que tambem foi comentado
+/*void
+TeMatrix::switchRows(int i,int j)
+{
+ double *tmp;
+
+ if( i < 0 || j < 0 || i >= nrow || j >= ncol ){
+ printf("\nMatrix::switchRows >>> Switching linhas invalidas\n");
+ return;
+ }
+ tmp = mat[i];
+ mat[i] = mat[j];
+ mat[j] = tmp;
+}
+
+void
+TeMatrix::combineRows(int i, double a, int j)
+{
+ if( i < 0 || j < 0 || i >= nrow || j >= ncol ){
+ printf("\nMatrix::combineRows >>> Combining linhas invalidas\n");
+ return;
+ }
+ int h;
+ for(h = 0; h < ncol; h++)
+ mat[i][h] += a * mat[j][h];
+}
+*/
+
+//--------Esse metodo nao esta correto e por isso ficar� comentado VRMC
+//----------------------------------------------------
+/*int
+TeMatrix::UpperTriangle( TeMatrix& mt )
+{
+ if( &mt == this ){
+ printf("\nMatrix::UpperTriangle >>> Operacao usa duas matrizes\n");
+ return false;
+ }
+ if( mt.Init(nrow,(double)1) == false){
+ printf("\nMatrix::UpperTriangle >>> Memoria nao disponivel\n");
+ return false;
+ }
+
+ if ( this->isUpperTriangle() )
+ return true;
+
+ int j;
+ for(j = 0; j < ncol; j++) {
+ int b_row = nrow-1; // 1st non-zero entry from bottom
+ int t_row = j; // 1st zero entry from the top
+
+ //--- switch rows until all zeros are at
+ //--- the bottom of jTH column
+
+ while ( b_row>=t_row ) {
+ while ( b_row > j && mat[b_row][j] == 0. )
+ --b_row;
+ if ( b_row == j )
+ break; // bottom at diagonal
+ while ( b_row >= t_row && mat[t_row][j] != 0. )
+ ++t_row;
+ if ( t_row == Nrow() )
+ break; // top at last row
+ if ( t_row > b_row )
+ break;
+ switchRows(b_row,t_row);
+ mt.switchRows(b_row,t_row);
+ }
+
+ //--- now b_row is last non-zero entry from the top
+ //--- now t_row is first zero entry from the bottom
+ //--- combine until all entries below diagonal in jTH column = 0
+
+ if ( b_row <= j )
+ continue;
+ int i;
+ for( i = j+1; i<= b_row; i++) {
+ double f = -mat[i][j] / mat[j][j];
+ combineRows(i,f,j);
+ mt.combineRows(i,f,j);
+ }
+ }
+ return true;
+}
+*/
diff --git a/src/terralib/kernel/TeMatrix.h b/src/terralib/kernel/TeMatrix.h
new file mode 100644
index 0000000..d960bd6
--- /dev/null
+++ b/src/terralib/kernel/TeMatrix.h
@@ -0,0 +1,161 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeMatrix.h
+ This file models the object matrix of type double - class TeMatrix.
+*/
+#ifndef __TERRALIB_INTERNAL_MATRIX_H
+#define __TERRALIB_INTERNAL_MATRIX_H
+
+//! This class represents a matrix of elements of type double
+class TeMatrix
+{
+private:
+ int nrow; // Number of rows
+ int ncol; // Number of columns
+ double **mat; // TeMatrix of double elements
+ double lixo; // Ancillary variable
+
+ //! Allocates memory to holds a matrix of l lines by c columns
+ short Alloc( int l, int c);
+
+public:
+ //! Normal constructor
+ TeMatrix();
+
+ //! Copy constructor
+ TeMatrix(const TeMatrix& );
+
+ //! Destructor
+ ~TeMatrix();
+
+ //! Clear memory for matrix.
+ void Clear();
+
+ //! Checks if the matrix is initialized.
+ int Initialized(){ return ( nrow > 0 && ncol > 0 ) ? (true) : (false); }
+
+ //! Initializes the matrix with a vector of values
+ int Init( int nrow = 1, int ncol = 1 , double* f=0);
+
+ //! Initializes the matrix with the same value.
+ int Init( int nrow , int ncol , double f );
+
+ //! Diagonal matrix with different values.
+ int Init(int k, double* f);
+
+
+ //! Diagonal matrix with the same value
+ int Init(int k, double f);
+
+ //! Acess element in position (lin,col)
+ double& operator()( int lin, int col ){
+ return (lin >= 0 && lin < nrow && col >= 0 && col < ncol ) ?
+ ( mat[lin][col] ) : ( lixo );
+ }
+
+ //! Assign matrix values to another one using operator =
+ TeMatrix& operator=( const TeMatrix& m );
+
+ //! Compares two matrix using the operator ==
+ int operator==(const TeMatrix& m) const;
+
+ //! Operator *=
+ void operator*=(double);
+
+ //! Operator unary minus
+ TeMatrix operator-();
+
+ //! Returns the number of rows.
+ int Nrow() const { return nrow; }
+
+ //! Returns the number of columns.
+ int Ncol() const { return ncol; }
+
+ //! Print the matrix elements .
+ void Print();
+
+ //! Switches two rows "a" and "b".
+ void switchRows(int a ,int b);
+
+ //! Combines two rows in according to row(i) += b*row(j)
+ void combineRows(int i,double b,int j);
+
+ //! Finds the transpose of a matrix.
+ int Transpose( TeMatrix& mt ) const;
+
+ //! Finds the inverse of a matrix, if any.
+ int Inverse ( TeMatrix& mt ) const;
+
+ //! Finds the inverse of a triangle matrix acquired from Cholesky decomposition
+ int CholeskyInv (TeMatrix& mt) const;
+
+
+//! Calculates the inverse of a lowertriangle matrix aquired from the Cholesky decomposition of a simetric positive definide matrix.
+ int MatTransf( TeMatrix& mt );
+
+//! Checks if the matrix is an uppertriangle matrix.
+ int isUpperTriangle() const;
+
+//! Checks if the matrix is an lowertriangle matrix.
+ int isLowerTriangle() const;
+
+//! Checks if the matrix is a simetric matrix
+ int isSimetric() const;
+
+//! Checks if the matrix is positive definide
+ int isPositiveDefinide() const;
+
+//! Calculates the cofactor value of a matrix.
+ int CoFactor(int irow, int jcol, TeMatrix& m) const;
+
+//! Calculates the determinant value.
+ double Determinant();
+
+// Extracts a triangle matrix from a simetric positive definide one
+ int CholeskyDecomp( TeMatrix& mt );
+
+//! Calculates the EigenVectors.
+ int EigenVectors( TeMatrix& mt );
+
+//! Calculates the EigenValues.
+ int EigenValues( TeMatrix& mt );
+
+//! Calculates the EigenVectors.
+ int EigenVec( double e_vec[] );
+
+//! Sums two matrices.
+ friend TeMatrix operator+(const TeMatrix& m1,const TeMatrix& m2);
+
+//! Subtracts two matrices.
+ friend TeMatrix operator-(const TeMatrix&,const TeMatrix&);
+
+//! Calculates the product of two matrices.
+ friend TeMatrix operator*(const TeMatrix&,const TeMatrix&);
+
+//! Product of the matrix by a constant.
+ friend TeMatrix operator*(double c,const TeMatrix&);
+
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeMeasure.h b/src/terralib/kernel/TeMeasure.h
new file mode 100644
index 0000000..2722fd5
--- /dev/null
+++ b/src/terralib/kernel/TeMeasure.h
@@ -0,0 +1,57 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeMeasure.h
+ This file Defines a class for handling a measure
+*/
+
+#ifndef __TERRALIB_INTERNAL_MEASURE_H
+#define __TERRALIB_INTERNAL_MEASURE_H
+
+//! A class for handling a measure
+/*!
+ Provide support and definition for a measured value for All application that
+ require a field measure.
+ \sa TeSample, TeCountourLine
+*/
+class TeMeasure
+{
+public:
+
+ //! Constructor
+ TeMeasure( double value ) : value_( value ) {}
+
+ //! Destructor
+ ~TeMeasure() {}
+
+ //! Return the value associated to the measure
+ double value()
+ { return value_; }
+
+protected:
+ double value_;
+};
+
+
+//typedef TeComposite <TeMeasure> TeMeasureComposite;
+
+#endif
diff --git a/src/terralib/kernel/TeMultiGeometry.cpp b/src/terralib/kernel/TeMultiGeometry.cpp
new file mode 100644
index 0000000..fcd319a
--- /dev/null
+++ b/src/terralib/kernel/TeMultiGeometry.cpp
@@ -0,0 +1,171 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeMultiGeometry.h"
+
+
+TeMultiGeometry::TeMultiGeometry(const TeMultiGeometry& other)
+{
+ polygons_.copyElements(other.polygons_);
+ lines_.copyElements(other.lines_);
+ points_.copyElements(other.points_);
+ cells_.copyElements(other.cells_);
+}
+
+TeMultiGeometry&
+TeMultiGeometry::operator= (const TeMultiGeometry& other)
+{
+ if ( this != &other )
+ {
+ polygons_.copyElements(other.polygons_);
+ lines_.copyElements(other.lines_);
+ points_.copyElements(other.points_);
+ cells_.copyElements(other.cells_);
+ }
+ return *this;
+}
+
+
+bool
+TeMultiGeometry::getGeometry(TePolygonSet& result)
+{
+ if(!hasPolygons())
+ return false;
+ result.copyElements(polygons_);
+ return true;
+}
+
+
+bool
+TeMultiGeometry::getGeometry(TeLineSet& result)
+{
+ if(!hasLines())
+ return false;
+ result.copyElements(lines_);
+ return true;
+}
+
+bool
+TeMultiGeometry::getGeometry(TePointSet& result)
+{
+ if(!hasPoints())
+ return false;
+ result.copyElements(points_);
+ return true;
+}
+
+bool
+TeMultiGeometry::getGeometry(TeCellSet& result)
+{
+ if(!hasCells())
+ return false;
+ result.copyElements(cells_);
+ return true;
+}
+
+bool
+TeMultiGeometry::getGeometry(vector<TeGeometry*>& result)
+{
+ bool status = false;
+ if(hasPolygons())
+ {
+ for(int i=0; i< (int)polygons_.size(); ++i)
+ {
+ TePolygon* pol = new TePolygon();
+ (*pol) = polygons_[i];
+ result.push_back (pol);
+ status = true;
+ }
+ }
+ if(hasLines())
+ {
+ for(int i=0; i< (int)lines_.size(); ++i)
+ {
+ TeLine2D* lin = new TeLine2D();
+ (*lin) = lines_[i];
+ result.push_back (lin);
+ status = true;
+ }
+ }
+ if(hasPoints())
+ {
+ for(int i=0; i< (int)points_.size(); ++i)
+ {
+ TePoint* pon = new TePoint();
+ (*pon) = points_[i];
+ result.push_back (pon);
+ status = true;
+ }
+ }
+ if(hasCells())
+ {
+ for(int i=0; i< (int)cells_.size(); ++i)
+ {
+ TeCell* cell = new TeCell();
+ (*cell) = cells_[i];
+ result.push_back (cell);
+ status = true;
+ }
+ }
+ return status;
+}
+
+void
+TeMultiGeometry::setGeometry(vector<TeGeometry*>& result)
+{
+ this->clear();
+ vector<TeGeometry*>::iterator it = result.begin();
+
+ while(it!=result.end())
+ {
+ TeGeometry* geom = (*it);
+
+ if(dynamic_cast<TePolygon*> (geom))
+ polygons_.add (*((TePolygon*)geom));
+ else if (dynamic_cast<TePolygonSet*> (geom))
+ polygons_ = *((TePolygonSet*) geom);
+ else if(dynamic_cast<TeLine2D*> (geom))
+ lines_.add (*((TeLine2D*)geom));
+ else if(dynamic_cast<TeLineSet*> (geom))
+ lines_ = *((TeLineSet*)geom);
+ else if(dynamic_cast<TePoint*> (geom))
+ points_.add (*((TePoint*)geom));
+ else if(dynamic_cast<TePointSet*> (geom))
+ points_ = *((TePointSet*)geom);
+ else if(dynamic_cast<TeCell*> (geom))
+ cells_.add (*((TeCell*)geom));
+ else if(dynamic_cast<TeCellSet*> (geom))
+ cells_ = *((TeCellSet*)geom);
+
+ ++it;
+ }
+}
+
+void
+TeMultiGeometry::clear()
+{
+ polygons_.clear ();
+ lines_.clear ();
+ points_.clear ();
+ cells_.clear ();
+}
diff --git a/src/terralib/kernel/TeMultiGeometry.h b/src/terralib/kernel/TeMultiGeometry.h
new file mode 100644
index 0000000..98ef0de
--- /dev/null
+++ b/src/terralib/kernel/TeMultiGeometry.h
@@ -0,0 +1,146 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeMultiGeometry.h
+ This file contains structures and definitions to deal with a multigeometry.
+ A multigeometry can have polygons, lines, points or cells.
+*/
+
+#ifndef __TERRALIB_MULTIGEOMETRY_H
+#define __TERRALIB_MULTIGEOMETRY_H
+
+#include "TeGeometry.h"
+
+
+class TeMultiGeometry
+{
+
+public:
+ TePolygonSet polygons_;
+ TeLineSet lines_;
+ TePointSet points_;
+ TeCellSet cells_;
+
+ //! Constructor
+ TeMultiGeometry() {};
+
+ //! Copy constructor
+ TeMultiGeometry(const TeMultiGeometry& other);
+
+ //! Assignment operator
+ TeMultiGeometry& operator= (const TeMultiGeometry& other);
+
+ //! Get polygon geometries. Return true if the geometries exit.
+ bool getGeometry(TePolygonSet& result);
+
+ //! Get line geometries. Return true if the geometries exit.
+ bool getGeometry(TeLineSet& result);
+
+ //! Get point geometries. Return true if the geometries exit.
+ bool getGeometry(TePointSet& result);
+
+ //! Get cell geometries. Return true if the geometries exit.
+ bool getGeometry(TeCellSet& result);
+
+ //! Get a reference to the polygon geometry container
+ TePolygonSet& getPolygons()
+ { return polygons_; }
+
+ //! Get a reference to the line geometry container
+ TeLineSet& getLines()
+ { return lines_; }
+
+ //! Get a reference to the point geometry container
+ TePointSet& getPoints()
+ { return points_; }
+
+ //! Get a reference to the cell geometry container
+ TeCellSet& getCells()
+ { return cells_; }
+
+ //! Get all geometries. Return true if the geometries exit.
+ bool getGeometry(vector<TeGeometry*>& result);
+
+ //! Set polygon geometries
+ void setGeometry(const TePolygonSet& result)
+ { polygons_ = result; }
+
+ //! Set line geometries
+ void setGeometry(const TeLineSet& result)
+ { lines_ = result; }
+
+ //! Set point geometries
+ void setGeometry(const TePointSet& result)
+ { points_ = result; }
+
+ //! Set cell geometries
+ void setGeometry(const TeCellSet& result)
+ { cells_ = result; }
+
+ //! Set all geometries
+ void setGeometry(vector<TeGeometry*>& result);
+
+ //! Add polygon geometry
+ void addGeometry(const TePolygon& poly)
+ { polygons_.add(poly); polygons_.objectId(poly.objectId()); }
+
+ //! Add line geometry
+ void addGeometry(const TeLine2D& line)
+ { lines_.add(line); lines_.objectId(line.objectId()); }
+
+ //! Add point geometry
+ void addGeometry(const TePoint& point)
+ { points_.add(point); points_.objectId(point.objectId()); }
+
+ //! Add cell geometry
+ void addGeometry(const TeCell& cell)
+ { cells_.add(cell); cells_.objectId(cell.objectId()); }
+
+ //! Return true if this has polygons
+ bool hasPolygons()
+ { return (!polygons_.empty()); }
+
+ //! Return true if this has lines
+ bool hasLines()
+ { return (!lines_.empty()); }
+
+ //! Return true if this has points
+ bool hasPoints()
+ { return (!points_.empty()); }
+
+ //! Return true if this has cells
+ bool hasCells()
+ { return (!cells_.empty()); }
+
+ //! Return true if there are not any geometry
+ bool empty()
+ {
+ return ( polygons_.empty() && lines_.empty() &&
+ points_.empty() && cells_.empty() );
+ }
+
+ //! Clear geometries
+ void clear();
+};
+
+#endif
diff --git a/src/terralib/kernel/TeNeighbours.cpp b/src/terralib/kernel/TeNeighbours.cpp
new file mode 100644
index 0000000..8ac1b49
--- /dev/null
+++ b/src/terralib/kernel/TeNeighbours.cpp
@@ -0,0 +1,221 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeNeighbours.h"
+
+TeProxMatrixAttributes::TeProxMatrixAttributes()
+{
+ _weight = 1; //default
+ _slice = 1; //default
+ _order = 1; //defaul
+ _centroid_distance = -1.0; //not computed
+ _borders_length = -1.0; //not computed
+ _net_objects_distance = -1.0; //not computed
+ _net_minimum_path= -1.0; //not computed
+}
+
+
+TeProxMatrixAttributes::TeProxMatrixAttributes (const TeProxMatrixAttributes& att)
+{
+ _weight = att._weight;
+ _slice = att._slice;
+ _order = att._order;
+ _centroid_distance = att._centroid_distance;
+ _borders_length = att._borders_length;
+ _net_objects_distance = att._net_objects_distance;
+ _net_minimum_path = att._net_minimum_path;
+}
+
+
+TePropertyVector
+TeProxMatrixAttributes::getProperties ()
+{
+ TePropertyVector vec;
+ TeProperty prop1; prop1.value_ = Te2String (_weight); vec.push_back ( prop1 );
+ TeProperty prop2; prop2.value_ = Te2String (_slice); vec.push_back ( prop2 );
+ TeProperty prop3; prop3.value_ = Te2String (_order); vec.push_back ( prop3 );
+ TeProperty prop4; prop4.value_ = Te2String (_borders_length); vec.push_back ( prop4 );
+ TeProperty prop5; prop5.value_ = Te2String (_centroid_distance); vec.push_back ( prop5 );
+ TeProperty prop6; prop6.value_ = Te2String (_net_objects_distance); vec.push_back ( prop6 );
+ TeProperty prop7; prop7.value_ = Te2String (_net_minimum_path); vec.push_back ( prop7 );
+ return vec;
+}
+
+
+TeProxMatrixAttributes&
+TeProxMatrixAttributes::operator= (const TeProxMatrixAttributes& att)
+{
+ _weight = att._weight;
+ _slice = att._slice;
+ _order = att._order;
+ _centroid_distance = att._centroid_distance;
+ _borders_length = att._borders_length;
+ _net_objects_distance = att._net_objects_distance;
+ _net_minimum_path = att._net_minimum_path;
+ return *this;
+}
+
+
+
+bool
+TeProxMatrixAttributes::operator==(const TeProxMatrixAttributes& att) const
+{
+ return ((_weight == att._weight) &&
+ (_slice == att._slice) &&
+ (_order == att._order) &&
+ (_centroid_distance == att._centroid_distance) &&
+ (_borders_length == att._borders_length) &&
+ (_net_objects_distance == att._net_objects_distance) &&
+ (_net_minimum_path == att._net_minimum_path));
+}
+
+
+TeNeighbours::TeNeighbours(const TeNeighboursMap& neigh)
+{
+
+ TeNeighboursMap::const_iterator pos = neigh.begin();
+
+ for (pos = neigh.begin(); pos != neigh.end(); ++pos)
+ _neigh.push_back(make_pair (pos->first, pos->second));
+}
+
+
+
+TeNeighbours::TeNeighbours (const TeNeighbours& neigh)
+{
+ const_iterator it;
+ for (it = neigh._neigh.begin(); it != neigh._neigh.end(); ++it)
+ _neigh.push_back(*it);
+}
+
+
+string
+TeNeighbours::ObjectId (int n)
+{
+ if (n < (int)_neigh.size())
+ return _neigh[n].first;
+
+ else {
+ string empty;
+ return empty;
+ }
+}
+
+
+string
+TeNeighbours:: operator[](int n)
+{
+ if (n < (int)_neigh.size())
+ return _neigh[n].first;
+
+ else {
+ string empty;
+ return empty;
+ }
+}
+
+double
+TeNeighbours:: Weight (int n)
+{
+ if (n < (int)_neigh.size())
+ return _neigh[n].second.Weight();
+
+ else
+ return 0.0;
+}
+
+
+double
+TeNeighbours:: Weight (const string& object_id)
+{
+ for (unsigned int i = 0; i< _neigh.size(); ++i) {
+ if (object_id == _neigh[i].first)
+ return _neigh[i].second.Weight();
+ }
+ return 0.0;
+}
+
+
+TeProxMatrixAttributes
+TeNeighbours:: Attributes (int n)
+{
+ TeProxMatrixAttributes attr;
+
+ if (n < (int)_neigh.size())
+ return _neigh[n].second;
+ else
+ return attr;
+}
+
+bool
+TeNeighbours:: operator== (const TeNeighbours& neigh)
+{
+ if (_neigh == neigh._neigh) return true;
+ else return false;
+}
+
+
+TeNeighbours&
+TeNeighbours::operator= (const TeNeighbours& neigh)
+{
+ if (*this == neigh)
+ return *this;
+
+ _neigh.clear();
+
+ const_iterator it;
+ for (it = neigh._neigh.begin(); it != neigh._neigh.end(); ++it)
+ _neigh.push_back(*it);
+
+ return *this;
+}
+
+
+bool
+TeNeighbours:: Insert (const string& object_id, const TeProxMatrixAttributes& attr)
+{
+ for (unsigned int i = 0; i< _neigh.size(); i++) {
+ if (object_id == _neigh[i].first)
+ return false;
+ }
+ _neigh.push_back (make_pair (object_id, attr));
+ return true;
+}
+
+
+bool
+TeNeighbours:: Remove (const string& object_id)
+{
+ iterator it = _neigh.begin();
+ while (it!= _neigh.end())
+ if (object_id == (*it).first)
+ {
+ _neigh.erase (it);
+ return true;
+ }
+ return false;
+}
diff --git a/src/terralib/kernel/TeNeighbours.h b/src/terralib/kernel/TeNeighbours.h
new file mode 100644
index 0000000..47f2f9c
--- /dev/null
+++ b/src/terralib/kernel/TeNeighbours.h
@@ -0,0 +1,200 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeNeighbours.h
+ This file contains structures and definitions about neighborhood
+*/
+
+#ifndef __TERRALIB_INTERNAL_NEGHBOURS_H
+#define __TERRALIB_INTERNAL_NEGHBOURS_H
+
+#include "TeUtils.h"
+#include "TeAttribute.h"
+
+#include <vector>
+#include <string>
+#include <map>
+using namespace std;
+
+
+//! Attributes associated with each neighborhood of a proximity matrix
+class TeProxMatrixAttributes
+{
+ private:
+ double _weight;
+ int _slice;
+ int _order;
+ double _centroid_distance;
+ double _borders_length;
+ double _net_objects_distance;
+ double _net_minimum_path;
+
+
+ public:
+
+ //! Empty constructor
+ TeProxMatrixAttributes();
+
+ //! Copy constuctor
+ TeProxMatrixAttributes (const TeProxMatrixAttributes& att);
+
+ //! Return weight
+ double Weight() {return _weight;}
+
+ //! Return slice
+ int Slice () {return _slice;}
+
+ //! Return order
+ int Order() {return _order;}
+
+ //! Return border length
+ double BorderLength() {return _borders_length;}
+
+ //! Return centroid distance
+ double CentroidDistance() {return _centroid_distance;}
+
+ //! Return network objects distance
+ double NetworkObjectsDistance() {return _net_objects_distance;}
+
+ //! Return network minimum path
+ double NetworkMinimumPath () {return _net_minimum_path;}
+
+ //! Set weight
+ void Weight(double w) {_weight = w;}
+
+ //! Set slice
+ void Slice (int s) {_slice = s;}
+
+ //! Set order
+ void Order(int o) {_order = o;}
+
+ //! Set border length
+ void BorderLength(double l) {_borders_length = l;}
+
+ //! Set centroid distance
+ void CentroidDistance(double d) {_centroid_distance = d;}
+
+ //! Set network objects distance
+ void NetworkObjectsDistance(double d) {_net_objects_distance = d;}
+
+ //! Set network minimum path
+ void NetworkMinimumPath (double d) {_net_minimum_path = d;}
+
+ //! Return the attributes as a TePropertyVector
+ TePropertyVector getProperties ();
+
+ //! Return if the border length was computed
+ bool WasBordersLengthComputed () {if (_borders_length == -1.0) return false; else return true;}
+
+ //! Return if the centroid distance was computed
+ bool WasCentroidDistanceComputed () {if (_centroid_distance == -1.0) return false; else return true;}
+
+ //! Return if the network objects distance was computed
+ bool WasNetworkObjectsDistanceComputed () {if (_net_objects_distance == -1.0) return false; else return true;}
+
+ //! Return if the network minimal path was computed
+ bool WasNetworkMinimumPathComputed () {if (_net_minimum_path == -1.0) return false; else return true;}
+
+ //! Copy operator
+ TeProxMatrixAttributes& operator= (const TeProxMatrixAttributes& att);
+
+ //! Comparison Operator
+ bool operator==(const TeProxMatrixAttributes& att) const;
+
+ //! Destructor
+ virtual ~TeProxMatrixAttributes() {}
+};
+
+//! A map from a object to its attributes
+typedef map<string, TeProxMatrixAttributes> TeNeighboursMap;
+
+
+//! A class to representate the neighbours of a object
+class TeNeighbours
+{
+private:
+ typedef pair<string, TeProxMatrixAttributes> neigh_values;
+ typedef vector<neigh_values> neigh_vector;
+
+ neigh_vector _neigh;
+
+
+public:
+
+ typedef neigh_vector::iterator iterator;
+ typedef neigh_vector::const_iterator const_iterator;
+
+ //! Empty constructor
+ TeNeighbours () {};
+
+ //! Copy constructor
+ TeNeighbours(const TeNeighboursMap& neigh);
+
+ //! Copy constructor
+ TeNeighbours(const TeNeighbours& neigh);
+
+ //! Return the number of the neighbours
+ int size() const { return _neigh.size();}
+
+ //! Return a iterator to the begin of the neighbours
+ iterator begin() { return _neigh.begin();}
+
+ //! Return a iterator to the one past end of the neighbours
+ iterator end() { return _neigh.end();}
+
+ //! Return the n-th neighbour object_id, if n < map size.
+ string ObjectId (int n);
+
+ //! Return the n-th neighbour object_id, if n < map size.
+ string operator[](int n);
+
+ //! Return the n-th connection weight (corresponding to the n-th neighbour), if n < map size.
+ double Weight (int n);
+
+ //! Return the connection weight, given the neighbour object_id
+ double Weight (const string& object_id);
+
+ //! Return the complete set of connection attributes (corresponding to the ith neighbour), packed in a TeProxMatrixAttributes object.
+ TeProxMatrixAttributes Attributes (int n);
+
+ //! Return the complete set of connection attributes, given the neighbour object_id, packed in a TeProxMatrixAttributes object.
+ TeProxMatrixAttributes Attributes (const string& object_id);
+
+ //! Insert a new neighbour
+ bool Insert (const string& object_id, const TeProxMatrixAttributes& attr);
+
+ //! Remove a neighbour
+ bool Remove (const string& object_id);
+
+ //! Copy operator
+ TeNeighbours& operator= (const TeNeighbours& neigh);
+
+ //! Comparison Operator
+ bool operator==(const TeNeighbours& p);
+
+ //! Destructor
+ virtual ~TeNeighbours() {}
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeNetwork.cpp b/src/terralib/kernel/TeNetwork.cpp
new file mode 100644
index 0000000..c03435a
--- /dev/null
+++ b/src/terralib/kernel/TeNetwork.cpp
@@ -0,0 +1,578 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeNetwork.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeSTElementSet.h"
+#include "Gra_algo.h"
+
+
+
+TeGraphNetwork:: TeGraphNetwork (TeLineSet& ls) : graph_ (false)
+{
+ TeLineSet ls2;
+ ls2.copyElements(ls);
+
+// The initial and final points of each line will be the nodes
+ TeLineSet::iterator it = ls2.begin();
+ while (it != ls2.end())
+ {
+ insertLine ((*it), TeLength(*it));
+ it++;
+ }
+}
+
+
+TeGraphNetwork:: TeGraphNetwork (TeLineSet& ls, map<string, double>& line_costs) : graph_ (false)
+{
+ if (ls.size() == line_costs.size())
+ {
+ TeLineSet::iterator it_line = ls.begin();
+
+ while (it_line != ls.end())
+ {
+ string id = (*it_line).objectId ();
+ map<string, double>:: iterator it_val = line_costs.find(id);
+ if (it_val != line_costs.end())
+ insertLine ((*it_line), (*it_val).second);
+ it_line++;
+ }
+ }
+
+}
+
+
+bool
+TeGraphNetwork:: Add (TeLineSet& ls, map<string, double>& line_costs)
+{
+ if (ls.size() == line_costs.size())
+ {
+ TeLineSet::iterator it_line = ls.begin();
+
+ while (it_line != ls.end())
+ {
+ string id = (*it_line).objectId ();
+ map<string, double>:: iterator it_val = line_costs.find(id);
+ if (it_val != line_costs.end())
+ insertLine ((*it_line), (*it_val).second);
+ it_line++;
+ }
+ return true;
+ }
+ else
+ return false;
+
+}
+
+
+TeGraphNetwork:: TeGraphNetwork (TeSTElementSet& stos, string& attrName) : graph_ (false)
+{
+ TeSTElementSet::iterator it = stos.begin();
+ while (it != stos.end())
+ {
+ string value;
+ if ((*it).getPropertyValue (attrName, value))
+ {
+ double val = atof(value.c_str());
+ TeLineSet objGeom;
+ if ((*it).getGeometry(objGeom))
+ {
+ double total_length = 0.0;
+ TeLineSet::iterator it_geom = objGeom.begin();
+ while (it_geom != objGeom.end())
+ {
+ total_length += TeLength (*it_geom);
+ it_geom++;
+ }
+
+ it_geom = objGeom.begin();
+ while (it_geom != objGeom.end())
+ {
+ double w = TeLength(*it_geom)/total_length;
+ insertLine (*it_geom, val*w);
+ it_geom++;
+ }
+ }
+ }
+ ++it;
+ }
+}
+
+
+void
+TeGraphNetwork:: insertLine (TeLine2D& line, const double& attr)
+{
+
+ // Change line identifiers, to allow lines from different layers
+ int j = line_set_.size();
+ string line_objId = "l" + Te2String (j);
+ line.objectId (line_objId);
+
+
+ // The initial and final nodes will be the first and last points of the line
+ TeNode n1;
+ n1.add(line.first());
+ string id1 = line.objectId() + "_p1";
+ n1.objectId (id1);
+ n1.geomId (0);
+
+ TeNode n2;
+ n2.add(line.last());
+ string id2 = line.objectId() + "_p2";
+
+ n2.objectId (id2);
+ n2.geomId (0);
+
+ for (unsigned int i = 0; i < graph_.size(); i++)
+ {
+ if (TeDistance (line.first(), graph_[i].first.location()) < 0.001)
+ n1 = graph_[i].first;
+
+ if (TeDistance (line.last(), graph_[i].first.location()) < 0.001)
+ n2 = graph_[i].first;
+ }
+
+ if (n1 == n2)
+ {
+ cout << "linha circular" << endl;
+ }
+ else
+ {
+ graph_.insert (n1, n2, attr); // if graph is non-directed, edge from n2 to n1 will also be added
+ line_cost_ [line.objectId()] = attr;
+ line_set_.add (line);
+ }
+
+}
+
+
+
+bool
+TeGraphNetwork:: minimumPath (TeNode& n1, TeNodeSet& nodeSet,vector<double>& result)
+{
+ vector<double> dist;
+ vector<int> pred;
+
+ // Compute minimum path to all vertex
+ unsigned int j = 0;
+ br_stl::Graph<TeNode, double>::iterator it = graph_.begin();
+ while (it != graph_.end())
+ {
+ if ((*it).first == n1)
+ it = graph_.end();
+ else
+ {
+ it++;
+ j++;
+ }
+ }
+ if (j == graph_.size()) return false;
+
+ br_stl::Dijkstra<br_stl::Graph<TeNode, double>, double> (graph_, dist, pred, j);
+
+ for (unsigned int i = 0; i< nodeSet.size(); i++)
+ {
+ br_stl::Graph<TeNode, double>::iterator it = graph_.begin();
+ unsigned int vertex = 0;
+ while (it != graph_.end())
+ {
+ if ((*it).first == nodeSet[i])
+ it = graph_.end();
+ else
+ {
+ it++;
+ vertex++;
+ }
+ }
+
+ if (vertex == graph_.size()) return false;
+ result.push_back (dist[vertex]);
+ }
+
+
+ return true;
+
+}
+
+bool
+TeGraphNetwork::getNode (int i, TeNode& node)
+{
+ if ((i >0) && (i < (int) graph_.size()))
+ {
+ node = graph_[i].first;
+ return true;
+ }
+ else
+ return false;
+}
+
+bool
+TeGraphNetwork:: nearestNodePoint (TeCoord2D& p1, int& index, TeCoord2D& p2, double& distance, double tol)
+{
+ TeNodeSet node_set;
+ for (unsigned int i = 0; i < graph_.size(); i++)
+ node_set.add (graph_[i].first);
+
+ if (node_set.size() == 0) return false;
+
+ TeNearest (p1, node_set, index, tol);
+ p2 = node_set[index].elem();
+ distance = TeDistance (p1, p2);
+ return true;
+}
+
+
+
+
+
+bool
+TeGraphNetwork:: breakLineSet (TeNode& node, int line)
+{
+
+ if ((line >= 0) && (line < (int) line_set_.size()))
+ {
+ // Break line
+ int segment;
+ if (TeLocateLineSegment (node.location(), line_set_[line], segment, 0.001))
+ {
+ if (segment <= (int) (line_set_[line].size()) - 2)
+ {
+ TeLine2D l1, l2;
+ int j = 0;
+ TeLine2D::iterator it = line_set_[line].begin();
+
+ while (j <= segment)
+ {
+ l1.add (*it);
+ it++;
+ j++;
+ }
+
+ l1.add (node.location());
+ l2.add (node.location ());
+
+ while (it != line_set_[line].end())
+ {
+ l2.add (*it);
+ it++;
+ }
+
+ string old_line_id = line_set_[line].objectId();
+ string line1_id = old_line_id + "l1";
+ string line2_id = old_line_id + "l2";
+
+ l1.objectId(line1_id);
+ l2.objectId(line2_id);
+
+ // Compute proportional costs for broken lines
+
+ double d1 = TeLength (l1);
+ double d2 = TeLength (l2);
+ double d_tot = TeLength (line_set_[line]);
+
+ double w1 = d1/d_tot;
+ double w2 = d2/d_tot;
+
+ double val1 = w1*line_cost_[old_line_id];
+ double val2 = w2*line_cost_[old_line_id];
+
+ // update line cost
+
+ line_cost_[line1_id] = val1;
+ line_cost_[line2_id] = val2;
+ line_cost_.erase (old_line_id);
+
+ // update line set
+
+ line_set_.add (l1);
+ line_set_.add (l2);
+ line_set_.erase (line);
+
+ return true;
+ }
+ else return false;
+ }
+ else return false;
+ }
+ else return false;
+}
+
+
+
+
+bool
+TeGraphNetwork:: nearestNetworkPoint (TeCoord2D& p1, int& lindex, TeCoord2D& pinter, double& distance, double tol)
+{
+ if (line_set_.size() == 0) return false;
+ return TeNearest (p1, line_set_, lindex, pinter, distance, tol);
+
+ bool TeNearest(TeCoord2D& pt, TeLineSet& ls , int& i, TeCoord2D& pi, const double& tol = 0.0);
+
+}
+
+
+///////////////////////////////////// Old version - not modified
+
+TeNetwork:: TeNetwork (TeLineSet& ls) : graph_ (false)
+{
+ line_set_ = ls;
+
+
+ // The initial and final points of each line will be the nodes
+ TeLineSet::iterator it = ls.begin();
+ int j = 0;
+ while (it != line_set_.end())
+ {
+ string line_objId = "l" + Te2String (j);
+ (*it).objectId (line_objId); //ANAP: modified to be able to use more than on layer.
+ TeLine2D line = (*it);
+
+ TeNode n1;
+ n1.add(line.first());
+ string id1 = line.objectId() + "_p1";
+ n1.objectId (id1);
+ n1.geomId (0);
+
+ TeNode n2;
+ n2.add(line.last());
+ string id2 = line.objectId() + "_p2";
+ n2.objectId (id2);
+ n2.geomId (0);
+
+ for (unsigned int i = 0; i < graph_.size(); i++)
+ {
+ if (TeDistance (line.first(), graph_[i].first.location()) < 0.01)
+ n1 = graph_[i].first;
+
+ if (TeDistance (line.last(), graph_[i].first.location()) < 0.01)
+ n2 = graph_[i].first;
+ }
+
+ graph_.insert (n1, n2, TeLength(line));
+
+ TeArc arc (n1, n2);
+ // This is kept for updating purposes
+ arcs_map_[line.objectId()] = arc;
+ it++;
+ j++;
+ }
+}
+
+void
+TeNetwork:: insertLine (TeLine2D& line, const double& attr)
+{
+
+ int j = line_set_.size();
+
+ // The initial and final points of each line will be the nodes
+ string line_objId = "l" + Te2String (j);
+ line.objectId (line_objId); //ANAP: modified to be able to use more than one layer.
+
+ TeNode n1;
+ n1.add(line.first());
+ string id1 = line.objectId() + "_p1";
+ n1.objectId (id1);
+ n1.geomId (0);
+
+ TeNode n2;
+ n2.add(line.last());
+ string id2 = line.objectId() + "_p2";
+
+ n2.objectId (id2);
+ n2.geomId (0);
+
+ for (unsigned int i = 0; i < graph_.size(); i++)
+ {
+ if (TeDistance (line.first(), graph_[i].first.location()) < 0.01)
+ n1 = graph_[i].first;
+
+ if (TeDistance (line.last(), graph_[i].first.location()) < 0.01)
+ n2 = graph_[i].first;
+ }
+
+ graph_.insert (n1, n2, attr);
+
+ TeArc arc (n1, n2);
+ // This is kept for updating purposes
+ arcs_map_[line.objectId()] = arc;
+ line_set_.add (line);
+
+}
+
+
+bool
+TeNetwork:: insertNode (TeNode& node, int line)
+{
+ if ((line >= 0) && (line < (int) line_set_.size()))
+ {
+ // Break line
+ int segment;
+ if (TeLocateLineSegment (node.location(), line_set_[line], segment, 0.001))
+ {
+ if (segment <= (int) (line_set_[line].size()) - 2)
+ {
+ TeLine2D l1, l2;
+ int j = 0;
+ TeLine2D::iterator it = line_set_[line].begin();
+
+ while (j <= segment)
+ {
+ l1.add (*it);
+ it++;
+ j++;
+ }
+
+ l1.add (node.location());
+ l2.add (node.location ());
+
+ while (it != line_set_[line].end())
+ {
+ l2.add (*it);
+ it++;
+ }
+
+ // get new and old lines ids
+
+ string old_line_id = line_set_[line].objectId();
+ string line1_id = old_line_id + "l1";
+ string line2_id = old_line_id + "l2";
+
+ l1.objectId(line1_id);
+ l2.objectId(line2_id);
+
+ // update line set
+ line_set_.add (l1);
+ line_set_.add (l2);
+ line_set_.erase (line);
+
+ // update map_nodes
+ TeArc arc1 (arcs_map_[old_line_id].toNode(), node);
+ arcs_map_[line1_id] = arc1;
+
+ TeArc arc2 (arcs_map_[old_line_id].fromNode(),node);
+ arcs_map_[line2_id] = arc2;
+ arcs_map_.erase(old_line_id);
+
+
+/* // insert new arc connection in the network
+ graph_.insert (arcs_map_ [old_line_id].fromNode(),node, l1.length());
+ graph_.insert (arcs_map_ [old_line_id].toNode(), node, l2.length());
+ // graph_.remove (arcs_map_[old_line_id].fromNode(), _map_nodes[old_line_id].toNode());
+
+
+*/
+ return true;
+ }
+ else return false;
+ }
+ else return false;
+ }
+ else return false;
+}
+
+
+bool
+TeNetwork::getNode (int i, TeNode& node)
+{
+ if ((i >0) && (i < (int) graph_.size()))
+ {
+ node = graph_[i].first;
+ return true;
+ }
+ else
+ return false;
+}
+
+
+bool
+TeNetwork:: minimumPath (TeNode& n1, TeNodeSet& nodeSet,vector<double>& result)
+{
+ vector<double> dist;
+ vector<int> pred;
+
+ // Compute minimum path to all vertex
+ unsigned int j = 0;
+ br_stl::Graph<TeNode, double>::iterator it = graph_.begin();
+ while (it != graph_.end())
+ {
+ if ((*it).first == n1)
+ it = graph_.end();
+ else
+ {
+ it++;
+ j++;
+ }
+ }
+ if (j == graph_.size()) return false;
+
+ br_stl::Dijkstra<br_stl::Graph<TeNode, double>, double> (graph_, dist, pred, j);
+
+ for (unsigned int i = 0; i< nodeSet.size(); i++)
+ {
+ br_stl::Graph<TeNode, double>::iterator it = graph_.begin();
+ unsigned int vertex = 0;
+ while (it != graph_.end())
+ {
+ if ((*it).first == nodeSet[i])
+ it = graph_.end();
+ else
+ {
+ it++;
+ vertex++;
+ }
+ }
+
+ if (vertex == graph_.size()) return false;
+ result.push_back (dist[vertex]);
+ }
+
+
+ return true;
+
+}
+
+
+bool
+TeNetwork:: nearestNodePoint (TeCoord2D& p1, int& index, TeCoord2D& p2, double& distance, double tol)
+{
+ TeNodeSet node_set;
+ for (unsigned int i = 0; i < graph_.size(); i++)
+ node_set.add (graph_[i].first);
+
+ if (node_set.size() == 0) return false;
+
+ TeNearest (p1, node_set, index, tol);
+ p2 = node_set[index].elem();
+ distance = TeDistance (p1, p2);
+ return true;
+}
+
+bool
+TeNetwork:: nearestNetworkPoint (TeCoord2D& p1, int& lindex, TeCoord2D& pinter, double& distance, double tol)
+{
+ if (line_set_.size() == 0) return false;
+ return TeNearest (p1, line_set_, lindex, pinter, distance, tol);
+
+ bool TeNearest(TeCoord2D& pt, TeLineSet& ls , int& i, TeCoord2D& pi, const double& tol = 0.0);
+
+}
diff --git a/src/terralib/kernel/TeNetwork.h b/src/terralib/kernel/TeNetwork.h
new file mode 100644
index 0000000..df05347
--- /dev/null
+++ b/src/terralib/kernel/TeNetwork.h
@@ -0,0 +1,164 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeNetwork2.h
+ This file defines class for handling networks in Terralib
+*/
+#ifndef TeNetwork_H
+#define TeNetwork_H
+
+#include "TeGeometry.h"
+#include "graph.h"
+
+class TeSTElementSet;
+
+
+//! class for handling networks
+class TeGraphNetwork
+{
+protected:
+ //! Set of nodes and the cost of each edge
+ br_stl::Graph<TeNode, double> graph_;
+
+ //! Set of geometric representation of edges
+ TeLineSet line_set_;
+
+ //! A map to associate each edge (line object_id) to its cost
+ map<string, double> line_cost_;
+
+
+public:
+
+ //! Empty constructor
+ TeGraphNetwork() : graph_ (true) {}; // directed graph
+
+
+ //! Create a graph from TeLineSet; the line size is considered the cost. In this case, graph non-directed.
+ TeGraphNetwork (TeLineSet& ls);
+
+
+ //! Create a graph from TeLineSet; the cost is given by the map.
+ TeGraphNetwork (TeLineSet& ls, map<string, double>& line_costs);
+
+
+ //! Create a network from a set of line objects; the cost is given by the attrName sto property. The graph is non-directed.
+ TeGraphNetwork (TeSTElementSet& stos, string& attrName);
+
+
+ //! Assignment operator
+ TeGraphNetwork& operator=(TeGraphNetwork& other)
+ {
+ if(this != &other)
+ {
+ graph_ = other.graph_;
+ line_set_ = other.getLineSet();
+ line_cost_ = other.getLineCosts();
+ }
+ return (*this);
+ }
+
+ //! Add lineset to graph. Useful specially for directed graphs (lines must be entered in both directions. It has to be tested for existing graphs.
+ bool Add (TeLineSet& ls, map<string, double>& line_costs);
+
+ //! Calculate the minimun path
+ bool minimumPath (TeNode& n1, TeNodeSet& set, vector<double>& dist);
+
+ //! Get the i-th node
+ bool getNode (int i, TeNode& node);
+
+ //! Get the nearest network node of a specific point (p1)
+ bool nearestNodePoint (TeCoord2D& p1, int& lindex, TeCoord2D& pinter, double& distance, double tol = 0.0);
+
+ //! Get the nearest network lines point from a specific point (p1)
+ bool nearestNetworkPoint (TeCoord2D& p1, int& lindex, TeCoord2D& pinter, double& distance, double tol = 0.0);
+
+ //! Get line Set
+ TeLineSet getLineSet () { return line_set_;}
+
+ //! Get line costs
+ map<string, double> getLineCosts () {return line_cost_;}
+
+ //! Insert a new line
+ void insertLine (TeLine2D& line, const double& attr);
+
+ //! Insert a new node
+ bool breakLineSet (TeNode& node, int i); //maybe should be done externally.
+
+ //! Destructor
+ virtual ~TeGraphNetwork () {}
+
+};
+
+
+//! class for handling networks
+class TeNetwork
+{
+private:
+ //! Set of nodes and the cost of each edge
+ br_stl::Graph<TeNode, double> graph_;
+
+ //! Set of edges
+ TeLineSet line_set_;
+
+ //! A map to associate each edge (line object_id) to its arc
+ map<string, TeArc> arcs_map_;
+
+public:
+ //! Empty constructor
+ TeNetwork() : graph_ (false) { };
+
+ //! Create a graph from TeLineSet, the line size is considered the cost
+ TeNetwork (TeLineSet& ls);
+
+ //! Calculate the minimun path
+ bool minimumPath (TeNode& n1, TeNodeSet& set, vector<double>& dist);
+
+
+ //! Insert a new line
+ void insertLine (TeLine2D& line, const double& attr);
+
+
+ //! Insert a new node
+ bool insertNode (TeNode& node, int i);
+
+ //! Get the i-th node
+ bool getNode (int i, TeNode& node);
+
+ //! Get the nearest network point of a specific point (p1)
+ bool nearestNetworkPoint (TeCoord2D& p1, int& lindex, TeCoord2D& pinter, double& distance, double tol = 0.0);
+
+ //! Get the nearest network node of a specific point (p1)
+ bool nearestNodePoint (TeCoord2D& p1, int& lindex, TeCoord2D& pinter, double& distance, double tol = 0.0);
+
+ //! Destructor
+ virtual ~TeNetwork () {}
+
+ //! Get line Set
+ TeLineSet getLineSet () { return line_set_;}
+
+};
+
+
+
+
+#endif
diff --git a/src/terralib/kernel/TeOverlay.cpp b/src/terralib/kernel/TeOverlay.cpp
new file mode 100644
index 0000000..3d449af
--- /dev/null
+++ b/src/terralib/kernel/TeOverlay.cpp
@@ -0,0 +1,895 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeOverlay.h"
+#include "TeIntersector.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeFragmentation.h"
+
+#include <map>
+#include <vector>
+#include <algorithm>
+
+using namespace std;
+
+
+//---------------- Auxiliary structure ----------------//
+struct xyOrder
+{
+ bool operator()(const TeCoord2D& c1, const TeCoord2D& c2) const
+ {
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c2.x_, c1.x_))
+ return true;
+
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c1.x_, c2.x_))
+ return false;
+
+ if(TeGeometryAlgorithmsPrecision::IsGreater(c2.y_, c1.y_))
+ return true;
+
+ return false;
+ }
+};
+
+typedef multimap<TeCoord2D, pair<unsigned int, TeLine2D>, xyOrder> TeLineIndex;
+
+
+
+inline void TeRemoveDuplicatedSegments(TeLine2D& l)
+{
+ bool hasDuplicated = false;
+
+ for(unsigned int i = 1; i < l.size() - 1; ++i)
+ if(TeEquals(l[i - 1], l[i + 1]))
+ {
+ l.erase(i + 1);
+ hasDuplicated = true;
+ }
+
+ if(hasDuplicated)
+ TeRemoveDuplicatedCoordinates(l);
+
+ return;
+}
+
+void TeClonePolygonSet(const TePolygonSet& pSetIn, TePolygonSet& pSetOut)
+{
+ for(unsigned int i = 0; i < pSetIn.size(); ++i)
+ {
+ TePolygon p;
+ for(unsigned int j = 0; j < pSetIn[i].size(); ++j)
+ {
+ TeLine2D l;
+
+ for(unsigned int k = 0; k < pSetIn[i][j].size(); ++k)
+ l.add(pSetIn[i][j][k]);
+
+ TeRemoveDuplicatedCoordinates(l);
+
+ TeRemoveDuplicatedSegments(l);
+
+ TeLinearRing r(l);
+
+ p.add(r);
+ }
+
+ pSetOut.add(p);
+ }
+}
+
+void TeCloneLineSet(const TeLineSet& lSetIn, TeLineSet& lSetOut)
+{
+ for(unsigned int i = 0; i < lSetIn.size(); ++i)
+ {
+ TeLine2D l;
+
+ for(unsigned int j = 0; j < lSetIn[i].size(); ++j)
+ l.add(lSetIn[i][j]);
+
+ TeRemoveDuplicatedCoordinates(l);
+
+ lSetOut.add(l);
+ }
+}
+
+
+// Verifica qual opera��o a realizar e j� coloca as fronteiras dos pol�gonos na ordem correta e caso n�o seja necess�rio opera��o, ele j� retorna o resultado
+TePolygonSet TeChooseOperation(const short& operation, TePolygonSet& redPols, TePolygonSet& bluePols, short& locationRedFragments, short& locationBlueFragments)
+{
+ TePolygonSet result;
+
+ unsigned int i = 0;
+
+ switch(operation)
+ {
+ // Intersection gets all fragments from red polygon wich are
+ // inside the blue polygon and the blue fragments that are inside
+ // the red polygon.
+ case TeINTERSECTION: if(TeDisjoint(redPols.box(), bluePols.box()))
+ return result;
+
+ // Need to reverse orientation
+ for(i = 0; i < bluePols.size(); ++i)
+ {
+ if(TeOrientation(bluePols[i][0]) == TeCOUNTERCLOCKWISE)
+ reverse(bluePols[i][0].begin(), bluePols[i][0].end());
+
+ for(unsigned int j = 1; j < bluePols[i].size(); ++j)
+ {
+ if(TeOrientation(bluePols[i][j]) == TeCLOCKWISE)
+ reverse(bluePols[i][j].begin(), bluePols[i][j].end());
+ }
+ }
+
+ // Need to reverse orientation
+ for(i = 0; i < redPols.size(); ++i)
+ {
+ if(TeOrientation(redPols[i][0]) == TeCOUNTERCLOCKWISE)
+ reverse(redPols[i][0].begin(), redPols[i][0].end());
+
+ for(unsigned int j = 1; j < redPols[i].size(); ++j)
+ {
+ if(TeOrientation(redPols[i][j]) == TeCLOCKWISE)
+ reverse(redPols[i][j].begin(), redPols[i][j].end());
+ }
+ }
+
+ locationRedFragments = TeINSIDE;
+ locationBlueFragments = TeINSIDE;
+
+ break;
+
+ // Union gets all fragments from red polygon wich are
+ // outside the blue polygon and the blue fragments that are outside
+ // the red polygon.
+ case TeUNION: if(TeDisjoint(redPols.box(), bluePols.box()))
+ {
+ result = redPols;
+
+ for(i = 0; i < bluePols.size(); ++i)
+ result.add(bluePols[i]);
+
+ return result;
+ }
+
+ // Need to reverse orientation
+ for(i = 0; i < bluePols.size(); ++i)
+ {
+ if(TeOrientation(bluePols[i][0]) == TeCOUNTERCLOCKWISE)
+ reverse(bluePols[i][0].begin(), bluePols[i][0].end());
+
+ for(unsigned int j = 1; j < bluePols[i].size(); ++j)
+ {
+ if(TeOrientation(bluePols[i][j]) == TeCLOCKWISE)
+ reverse(bluePols[i][j].begin(), bluePols[i][j].end());
+ }
+ }
+
+ // Need to reverse orientation
+ for(i = 0; i < redPols.size(); ++i)
+ {
+ if(TeOrientation(redPols[i][0]) == TeCOUNTERCLOCKWISE)
+ reverse(redPols[i][0].begin(), redPols[i][0].end());
+
+ for(unsigned int j = 1; j < redPols[i].size(); ++j)
+ {
+ if(TeOrientation(redPols[i][j]) == TeCLOCKWISE)
+ reverse(redPols[i][j].begin(), redPols[i][j].end());
+ }
+ }
+
+ locationRedFragments = TeOUTSIDE;
+ locationBlueFragments = TeOUTSIDE;
+
+ break;
+
+ // Difference gets all fragments from red polygon wich are
+ // outside the blue polygon and the blue fragments that are inside
+ // the red polygon.
+ case TeDIFFERENCE: if(TeDisjoint(redPols.box(), bluePols.box()))
+ return redPols;
+
+ locationRedFragments = TeOUTSIDE;
+ locationBlueFragments = TeINSIDE;
+
+ // Need to reverse orientation
+ for(i = 0; i < bluePols.size(); ++i)
+ {
+ if(TeOrientation(bluePols[i][0]) == TeCLOCKWISE)
+ reverse(bluePols[i][0].begin(), bluePols[i][0].end());
+
+ for(unsigned int j = 1; j < bluePols[i].size(); ++j)
+ {
+ if(TeOrientation(bluePols[i][j]) == TeCOUNTERCLOCKWISE)
+ reverse(bluePols[i][j].begin(), bluePols[i][j].end());
+ }
+ }
+
+ // Need to reverse orientation
+ for(i = 0; i < redPols.size(); ++i)
+ {
+ if(TeOrientation(redPols[i][0]) == TeCOUNTERCLOCKWISE)
+ reverse(redPols[i][0].begin(), redPols[i][0].end());
+
+ for(unsigned int j = 1; j < redPols[i].size(); ++j)
+ {
+ if(TeOrientation(redPols[i][j]) == TeCLOCKWISE)
+ reverse(redPols[i][j].begin(), redPols[i][j].end());
+ }
+ }
+
+ break;
+ }
+
+ return result;
+}
+
+TeMultiGeometry TeChooseOperation(const short& operation, TeLineSet& redLines, TePolygonSet& bluePols, short& locationRedFragments)
+{
+ TeMultiGeometry result;
+
+ switch(operation)
+ {
+ // Intersection gets all fragments from red polygon wich are
+ // inside the blue polygon and the blue fragments that are inside
+ // the red polygon.
+ case TeINTERSECTION: if(TeDisjoint(redLines.box(), bluePols.box()))
+ return result;
+
+ locationRedFragments = TeINSIDE;
+ break;
+
+ // Union gets all fragments from red polygon wich are
+ // outside the blue polygon and the blue fragments that are outside
+ // the red polygon.
+ case TeUNION: if(TeDisjoint(redLines.box(), bluePols.box()))
+ {
+ result.setGeometry(redLines);
+ result.setGeometry(bluePols);
+
+ return result;
+ }
+
+ locationRedFragments = TeOUTSIDE;
+
+ break;
+
+ // Difference gets all fragments from red polygon wich are
+ // outside the blue polygon and the blue fragments that are inside
+ // the red polygon.
+ case TeDIFFERENCE: if(TeDisjoint(redLines.box(), bluePols.box()))
+ {
+ result.setGeometry(redLines);
+ return result;
+ }
+
+ locationRedFragments = TeOUTSIDE;
+
+ break;
+ }
+
+ return result;
+}
+
+void TeRemoveOpositeBoundaryFragments(TeLineIndex& redFragmentsIndex, TeLineIndex& blueFragmentsIndex)
+{
+ TeLineIndex::iterator indexIterator = blueFragmentsIndex.begin();
+
+ while(indexIterator != blueFragmentsIndex.end())
+ {
+ TeLineIndex::iterator idx = redFragmentsIndex.find(indexIterator->second.second[(indexIterator->second.second.size() - 1u)]);
+
+ if(idx != redFragmentsIndex.end())
+ {
+ if(TeEquals(idx->second.second[idx->second.second.size() - 1u], indexIterator->second.second[0u]))
+ {
+ redFragmentsIndex.erase(idx);
+
+ TeLineIndex::iterator idxAux;
+ idxAux = indexIterator;
+ ++indexIterator;
+ blueFragmentsIndex.erase(idxAux);
+
+ continue;
+ }
+
+ }
+
+
+ ++indexIterator;
+ }
+}
+
+void TeRemoveSameBoundaryFragments(TeLineIndex& redFragmentsIndex, TeLineIndex& blueFragmentsIndex)
+{
+ TeLineIndex::iterator indexIterator = blueFragmentsIndex.begin();
+
+ while(indexIterator != blueFragmentsIndex.end())
+ {
+ TeLineIndex::iterator idx = redFragmentsIndex.find(indexIterator->second.second[0u]);
+
+ if(idx != redFragmentsIndex.end())
+ {
+ if(TeEquals(idx->second.second[idx->second.second.size() - 1u], indexIterator->second.second[(indexIterator->second.second.size() - 1u)]))
+ {
+ redFragmentsIndex.erase(idx);
+ continue;
+ }
+
+ }
+
+ ++indexIterator;
+ }
+}
+
+void TeMergeFragments(TeLineIndex& fragmentsIndex, TeLineIndex& boundaryFragmentsIndex)
+{
+ TeLineIndex::iterator indexIterator = boundaryFragmentsIndex.begin();
+
+ while(indexIterator != boundaryFragmentsIndex.end())
+ {
+ fragmentsIndex.insert(*indexIterator);
+ ++indexIterator;
+ }
+
+ boundaryFragmentsIndex.clear();
+}
+
+void TeFindAndMoveClosedRings(TeLineIndex& fragmentsIndex, vector<TeLinearRing>& rings)
+{
+ TeLineIndex::iterator indexIterator = fragmentsIndex.begin();
+
+ while(indexIterator != fragmentsIndex.end())
+ {
+ if(indexIterator->second.second.isRing())
+ {
+ rings.push_back(indexIterator->second.second);
+
+ TeLineIndex::iterator idxAux;
+ idxAux = indexIterator;
+ ++indexIterator;
+ fragmentsIndex.erase(idxAux);
+ }
+ else
+ ++indexIterator;
+ }
+}
+
+// Recebe um polygonset com an�is externos e um vetor de pol�gonos que seriam buracos e
+// define em qual pol�gono colocar os buracos
+bool TeMountTopology(TePolygonSet& polysOut, vector<TeLinearRing>& holes)
+{
+ bool returnValue = true;
+
+ if((polysOut.size() == 0) && (holes.size() > 0))
+ {
+ return false; // Formou buracos e n�o formou os an�is externos
+ }
+
+ if(polysOut.size() == 1)
+ {
+ for(unsigned int i = 0; i < holes.size(); ++i)
+ polysOut[0].add(holes[i]);
+ }
+ else
+ {
+ for(unsigned int i = 0; i < holes.size(); ++i)
+ {
+ TeLinearRing ring = holes[i];
+
+ vector<TePolygon> candidates;
+ vector<unsigned int> candidatesPos;
+
+ unsigned int j = 0;
+
+ for(j = 0; j < polysOut.size(); ++j)
+ {
+ if(TeWithinOrCoveredByOrEquals(ring.box(), polysOut[j].box()))
+ {
+ candidates.push_back(polysOut[j]);
+ candidatesPos.push_back(j);
+ }
+ }
+
+ if(candidates.size() == 1)
+ {
+ candidates[0].add(ring);
+ continue;
+ }
+
+ vector<TePolygon> newCandidates;
+
+ for(j = 0; j < candidates.size(); ++j)
+ {
+ short rel = TeBOUNDARY;
+
+ unsigned int nthVert = ring.size();
+ unsigned int iVert = 0u;
+
+ while(iVert < nthVert)
+ {
+ rel = TeRelation(ring[iVert], candidates[j][0]);
+
+ if(rel & TeINSIDE)
+ {
+ newCandidates.push_back(candidates[j]);
+ break;
+ }
+ else if(rel & TeOUTSIDE)
+ {
+ break;
+ }
+
+ ++iVert;
+ }
+
+ if(iVert == nthVert)
+ {
+ // Erro topol�gico, todos os pontos est�o na fronteira do anel externo...
+ returnValue = false;
+
+ TePolygon topTest;
+ topTest.add(ring);
+
+ short whatRel = TeRelation(topTest, candidates[j]);
+
+ // Se um buraco for igual ao exterior, existe um erro topol�gico
+ // No momento, eliminamos o anel externo
+ // e o interno...
+ // Se o buraco for coberto pelo pol�gono externo, ent�o ele ir� ficar dentro deste
+ // Caso contr�rio � erro sem possibilidades...
+ if(whatRel & TeEQUALS)
+ {
+ polysOut.erase(candidatesPos[j]);
+ continue;
+ }
+ }
+ }
+
+ if(newCandidates.size() <= 0)
+ {
+ // N�o encontrou o anel externo ao qual o buraco pertence
+ returnValue = false;
+ continue;
+ }
+
+ int idxMinArea = 0;
+
+ double minArea = TeMAXFLOAT;
+
+ for(j = 0; j < newCandidates.size(); ++j)
+ {
+ if(TeGeometryArea(newCandidates[j].box()) < minArea)
+ {
+ idxMinArea = j;
+ minArea = TeGeometryArea(newCandidates[j].box());
+ }
+ }
+
+ newCandidates[idxMinArea].add(ring);
+ }
+ }
+
+ return returnValue;
+}
+
+// Set operation for rings
+bool TeOVERLAY::TeOverlay(const TePolygonSet& redPolsIn, const TePolygonSet& bluePolsIn, TePolygonSet& polsOut, const short& operation)
+{
+ polsOut.clear();
+
+ short locationRedFragments = 0; // Wich red fragments to consider.
+ short locationBlueFragments = 0; // Wich blue fragments to consider.
+
+ short redMask = TeUNKNOWNPOSITION;
+ short blueMask = TeUNKNOWNPOSITION;
+ short location = TeUNKNOWNPOSITION;
+
+ TePolygonSet redPols;
+ TePolygonSet bluePols;
+
+ // Copia o conte�do dos pol�gonos de entrada
+ TeClonePolygonSet(redPolsIn, redPols);
+ TeClonePolygonSet(bluePolsIn, bluePols);
+
+ // Ajeita a orienta��o das fronteiras dos pol�gonos e determina a localiza��o dos fragmentos que ser�o utilizados
+ polsOut = TeChooseOperation(operation, redPols, bluePols, locationRedFragments, locationBlueFragments);
+
+ if(polsOut.size() > 0)
+ return true;
+
+
+ // If we are here so the rings are not disjoint by box
+
+ // Gets intersection list
+ TeINTERSECTOR2::TeVectorBoundaryIP report;
+
+ TeINTERSECTOR2::TeSafeIntersections(redPols, bluePols, report);
+
+ // So we need to create the fragments
+ TeLineIndex redFragmentsIndex;
+ TeLineIndex blueFragmentsIndex;
+
+ TeLineIndex redBoundaryFragmentsIndex;
+ TeLineIndex blueBoundaryFragmentsIndex;
+
+
+ TeLineSet redRings;
+ for(unsigned int i = 0; i < redPols.size(); ++i)
+ for(unsigned int j = 0; j < redPols[i].size(); ++j)
+ redRings.add(redPols[i][j]);
+
+ TeLineSet blueRings;
+ for(unsigned int k = 0; k < bluePols.size(); ++k)
+ for(unsigned int j = 0; j < bluePols[k].size(); ++j)
+ blueRings.add(bluePols[k][j]);
+
+ // Choose red fragments
+ TeLineSet redFragments;
+ TeLineSet redFragmentsBoundary;
+ TeFragmentBoundary(redRings, report, redFragmentsBoundary, redFragments);
+
+ unsigned int setSize = redFragments.size();
+
+ TeCoord2D middle;
+
+ if(redFragmentsBoundary.size())
+ redMask = TeBOUNDARY;
+
+ unsigned int w = 0;
+
+ for(w = 0; w < redFragmentsBoundary.size(); ++w)
+ redBoundaryFragmentsIndex.insert(TeLineIndex::value_type(redFragmentsBoundary[w][0], pair<short, TeLine2D>(TeBOUNDARY, redFragmentsBoundary[w])));
+
+ vector<TeLinearRing> rings;
+
+ // Do a position test for each fragment and stop if all relations have been found.
+ for(w = 0; w < setSize; ++w)
+ {
+ if(redFragments[w].size() == 2) // If the fragment has two points I need to check the middle point of this fragment.
+ TeGetMiddlePoint(redFragments[w][0], redFragments[w][1], middle);
+ else // If the fragment has more than two points so I check one point between the end points.
+ middle = redFragments[w][(unsigned int)((double(redFragments[w].size()) / 2.0 + 0.6)) - 1];
+
+ location = TeRelation(middle, bluePols);
+
+ // If fragment is on location type or is boundary, get it.
+ if((location & locationRedFragments))
+ {
+ if(redFragments[w].isRing())
+ rings.push_back(redFragments[w]);
+ else
+ redFragmentsIndex.insert(TeLineIndex::value_type(redFragments[w][0], pair<short, TeLine2D>(w, redFragments[w])));
+ }
+
+ redMask |= location;
+ }
+
+ // Choose blue fragments
+
+ TeINTERSECTOR2::TeVectorBoundaryIP::iterator it = report.begin();
+ TeINTERSECTOR2::TeVectorBoundaryIP::iterator it_end = report.end();
+
+ while(it != it_end)
+ {
+ swap(it->bluePartNum_, it->redPartNum_);
+ swap(it->blueSegNum_, it->redSegNum_);
+ ++it;
+ }
+
+ // Choose blue fragments
+ TeLineSet blueFragments;
+ TeLineSet blueFragmentsBoundary;
+
+ TeFragmentBoundary(blueRings, report, blueFragmentsBoundary, blueFragments);
+
+
+ setSize = blueFragments.size();
+
+ for(w = 0; w < blueFragmentsBoundary.size(); ++w)
+ blueBoundaryFragmentsIndex.insert(TeLineIndex::value_type(blueFragmentsBoundary[w][0], pair<short, TeLine2D>(TeBOUNDARY, blueFragmentsBoundary[w])));
+
+ if(blueFragmentsBoundary.size())
+ blueMask = TeBOUNDARY;
+
+ // Do a position test for each fragment and stop if all relations have been found.
+ for(unsigned int j = 0; j < setSize; ++j)
+ {
+ if(blueFragments[j].size() == 2) // If the fragment has two points I need to check the middle point of this fragment.
+ TeGetMiddlePoint(blueFragments[j][0], blueFragments[j][1], middle);
+ else // If the fragment has more than two points so I check one point between the end points.
+ middle = blueFragments[j][(unsigned int)((double(blueFragments[j].size()) / 2.0 + 0.6)) - 1];
+
+ location = TeRelation(middle, redPols);
+
+ // If fragment is on location type or is boundary, get it.
+ if((location & locationBlueFragments))
+ {
+ if(blueFragments[j].isRing())
+ rings.push_back(blueFragments[j]);
+ else
+ blueFragmentsIndex.insert(TeLineIndex::value_type(blueFragments[j][0], pair<short, TeLine2D>(w, blueFragments[j])));
+ }
+
+ blueMask |= location;
+ }
+
+ // Remove closed rings => Only needs to test open segments
+ TeFindAndMoveClosedRings(redBoundaryFragmentsIndex, rings);
+ TeFindAndMoveClosedRings(blueBoundaryFragmentsIndex, rings);
+
+
+ // Try to eliminate oposite boundaries
+ TeRemoveOpositeBoundaryFragments(redBoundaryFragmentsIndex, blueBoundaryFragmentsIndex);
+
+ // Try to eliminate same boundary fragments
+ TeRemoveSameBoundaryFragments(redBoundaryFragmentsIndex, blueBoundaryFragmentsIndex);
+
+ // Merge all red fragments in the first fragment index
+ TeMergeFragments(redFragmentsIndex, redBoundaryFragmentsIndex);
+
+ // Merge all blue fragments in the first fragment index
+ TeMergeFragments(blueFragmentsIndex, blueBoundaryFragmentsIndex);
+
+
+ // Make polygons from fragments.
+ bool returnValue = true;
+
+ TeLine2D lAux;
+ TeCoord2D endLineCoordinate;
+
+ while(!(redFragmentsIndex.empty() && blueFragmentsIndex.empty()))
+ {
+ if(lAux.size() == 0)
+ {
+ TeLineIndex::iterator indexIterator = redFragmentsIndex.begin();
+ if(indexIterator != redFragmentsIndex.end())
+ {
+ if(indexIterator->second.second.isRing())
+ {
+ rings.push_back(indexIterator->second.second);
+ redFragmentsIndex.erase(indexIterator);
+ continue;
+ }
+
+ for(unsigned int i = 0; i < indexIterator->second.second.size(); ++i)
+ lAux.add(indexIterator->second.second[i]);
+
+ lAux.setBox(::TeUnion(lAux.box(), indexIterator->second.second.box()));
+
+ redFragmentsIndex.erase(indexIterator);
+ }
+ else
+ {
+ TeLineIndex::iterator indexIterator = blueFragmentsIndex.begin();
+ if(indexIterator != blueFragmentsIndex.end())
+ {
+ if(indexIterator->second.second.isRing())
+ {
+ rings.push_back(indexIterator->second.second);
+ blueFragmentsIndex.erase(indexIterator);
+ continue;
+ }
+
+ for(unsigned int i = 0; i < indexIterator->second.second.size(); ++i)
+ lAux.add(indexIterator->second.second[i]);
+
+ //lAux.copyElements(indexIterator->second);
+ lAux.setBox(::TeUnion(lAux.box(), indexIterator->second.second.box()));
+ blueFragmentsIndex.erase(indexIterator);
+ }
+ else
+ {
+ returnValue = false; //N�o poderia vir aqui, deveria ter sa�do no teste do la�o!!
+ }
+ }
+ }
+ else
+ {
+ endLineCoordinate = lAux[lAux.size() - 1];
+
+ // Try to find the beginning of the next fragment that is part of the polygon in the same list
+ TeLineIndex::iterator indexIterator = redFragmentsIndex.find(endLineCoordinate);
+
+ if(indexIterator != redFragmentsIndex.end())
+ {
+ for(unsigned int i = 1; i < indexIterator->second.second.size(); ++i)
+ lAux.add(indexIterator->second.second[i]);
+
+ lAux.setBox(::TeUnion(lAux.box(), indexIterator->second.second.box()));
+ redFragmentsIndex.erase(indexIterator);
+ }
+ else
+ {
+ indexIterator = blueFragmentsIndex.find(endLineCoordinate);
+
+ if(indexIterator != blueFragmentsIndex.end())
+ {
+ for(unsigned int i = 1; i < indexIterator->second.second.size(); ++i)
+ lAux.add(indexIterator->second.second[i]);
+
+ lAux.setBox(::TeUnion(lAux.box(), indexIterator->second.second.box()));
+ blueFragmentsIndex.erase(indexIterator);
+ }
+ else
+ {
+ if(lAux.isRing())
+ {
+ // Add ring
+ rings.push_back(TeLinearRing(lAux));
+ }
+
+ returnValue = false; // Erro na topologia dos pol�gonos
+
+ // Clear auxiliary.
+ TeLine2D emptyLine;
+ lAux = emptyLine;
+ }
+ }
+ }
+
+ if(lAux.isRing())
+ {
+ // Add polygon
+ rings.push_back(TeLinearRing(lAux));
+
+ // Clear auxiliary.
+ TeLine2D emptyLine;
+ lAux = emptyLine;
+ }
+ }
+
+ if(lAux.size() > 0)
+ returnValue = false; // Erro, alguma linha n�o fechou!!!
+
+ // Separate holes from islands
+ vector<TeLinearRing> holes;
+
+ //string aux = "";
+ for(unsigned int z = 0; z < rings.size(); ++z)
+ {
+ short ori = TeOrientation(rings[z]);
+
+ if(ori == TeCOUNTERCLOCKWISE) // It is a hole
+ {
+ holes.push_back(rings[z]); // add to holes list
+ }
+ else if(ori == TeCLOCKWISE) // else if island
+ { // create a polygon
+ TePolygon p;
+ p.add(rings[z]);
+ polsOut.add(p);
+ }
+ else
+ {
+ returnValue = false; // Objeto sem �rea? Isso � um erro!
+ }
+ }
+
+ if((polsOut.size() == 0) && (holes.size() == 0))
+ {
+ if(operation & TeUNION)
+ return false; // Na uni�o deve haver a forma��o de pol�gonos
+ else
+ return returnValue; // Diferen�a e interse��o podem retornar vazio
+ }
+
+ bool mountResult = TeMountTopology(polsOut, holes);
+
+ return (returnValue && mountResult);
+}
+
+TeMultiGeometry TeOVERLAY::TeOverlay(const TeLineSet& redLinesIn, const TePolygonSet& bluePolsIn, const short& operation)
+{
+ short location = TeUNKNOWNPOSITION;
+ short locationRedFragments = TeUNKNOWNPOSITION;
+
+ TeMultiGeometry mGeom;
+
+ TeLineSet redLines;
+ TePolygonSet bluePols;
+ TeLineSet blueLines;
+
+ // Copia o conte�do das linhas de entrada
+ TeCloneLineSet(redLinesIn, redLines);
+
+ // Copia o conte�do dos pol�gonos de entrada
+ TeClonePolygonSet(bluePolsIn, bluePols);
+
+
+ // Ajeita a orienta��o das fronteiras dos pol�gonos e determina a localiza��o dos fragmentos que ser�o utilizados
+ mGeom = TeChooseOperation(operation, redLines, bluePols, locationRedFragments);
+
+ if(!mGeom.empty())
+ return mGeom;
+
+ unsigned int i = 0u;
+
+ // Gets intersection list
+ TeINTERSECTOR2::TeVectorBoundaryIP report;
+
+ unsigned int redLinesSize = redLines.size();
+
+ // Loops through red lines
+ for(i = 0u; i < redLinesSize; ++i)
+ {
+ unsigned int bluePart = 0u;
+
+ // Loops through blue polygonset
+ unsigned int bluePolsSize = bluePols.size();
+
+ for(unsigned int j = 0u; j < bluePolsSize; ++j)
+ {
+ //Loops trough blue polygon rings
+ unsigned int bluePolNumRings = bluePols[j].size();
+
+ for(unsigned k = 0u; k < bluePolNumRings; ++k)
+ {
+ TeINTERSECTOR2::TeSafeIntersections(redLines[i], bluePols[j][k], report, i, bluePart);
+
+ ++bluePart;
+ }
+ }
+
+ //++redPart;
+ }
+
+ // Fragment red Lines
+ TeLineSet redFragments;
+ TeLineSet redFragmentsBoundary;
+ TeFragmentBoundary(redLines, report, redFragmentsBoundary, redFragments);
+
+ // Choose red fragments
+ unsigned int setSize = redFragments.size();
+
+ TeCoord2D middle;
+
+ for(i = 0u; i < setSize; ++i)
+ {
+ if(redFragments[i].size() == 2) // If the fragment has two points I need to check the middle point of this fragment.
+ TeGetMiddlePoint(redFragments[i][0u], redFragments[i][1u], middle);
+ else // If the fragment has more than two points so I check one point between the end points.
+ middle = redFragments[i][(unsigned int)((double(redFragments[i].size()) / 2.0 + 0.6)) - 1];
+
+ location = TeRelation(middle, bluePols);
+
+ // If fragment is on location type, get it.
+ if((location & locationRedFragments))
+ mGeom.addGeometry(redFragments[i]);
+ }
+
+ switch(operation)
+ {
+ case TeINTERSECTION: break;
+
+ case TeUNION: mGeom.setGeometry(bluePols);
+ break;
+
+ case TeDIFFERENCE: break;
+ }
+
+ return mGeom;
+
+}
+
+
diff --git a/src/terralib/kernel/TeOverlay.h b/src/terralib/kernel/TeOverlay.h
new file mode 100644
index 0000000..64cf71b
--- /dev/null
+++ b/src/terralib/kernel/TeOverlay.h
@@ -0,0 +1,78 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeOverlay.h
+ This file contains structures and definitions for set operation on objects.
+ */
+
+/**
+ *@author Gilberto Ribeiro de Queiroz
+ */
+
+#ifndef __TERRALIB_INTERNAL_OVERLAY_H
+#define __TERRALIB_INTERNAL_OVERLAY_H
+
+#include "TeMultiGeometry.h"
+
+
+namespace TeOVERLAY
+{
+
+bool TeOverlay(const TePolygonSet& redPols, const TePolygonSet& bluePols, TePolygonSet& polsOut, const short& operation);
+
+inline bool TeUnion(TePolygonSet& redPols, TePolygonSet& bluePols, TePolygonSet& polsOut)
+{
+ return TeOverlay(redPols, bluePols, polsOut, TeUNION);
+}
+
+inline bool TeIntersection(TePolygonSet& redPols, TePolygonSet& bluePols, TePolygonSet& polsOut)
+{
+ return TeOverlay(redPols, bluePols, polsOut, TeINTERSECTION);
+}
+
+inline bool TeDifference(TePolygonSet& redPols, TePolygonSet& bluePols, TePolygonSet& polsOut)
+{
+ return TeOverlay(redPols, bluePols, polsOut, TeDIFFERENCE);
+}
+
+TeMultiGeometry TeOverlay(const TeLineSet& redLines, const TePolygonSet& bluePols, const short& operation);
+
+inline TeMultiGeometry TeUnion(TeLineSet& redLines, TePolygonSet& bluePols)
+{
+ return TeOverlay(redLines, bluePols, TeUNION);
+}
+
+inline TeMultiGeometry TeIntersection(TeLineSet& redLines, TePolygonSet& bluePols)
+{
+ return TeOverlay(redLines, bluePols, TeINTERSECTION);
+}
+
+inline TeMultiGeometry TeDifference(TeLineSet& redLines, TePolygonSet& bluePols)
+{
+ return TeOverlay(redLines, bluePols, TeDIFFERENCE);
+}
+
+} // end namespace TeOVERLAY
+
+#endif //__TERRALIB_INTERNAL_OVERLAY_H
+
diff --git a/src/terralib/kernel/TePieBar.h b/src/terralib/kernel/TePieBar.h
new file mode 100644
index 0000000..015b339
--- /dev/null
+++ b/src/terralib/kernel/TePieBar.h
@@ -0,0 +1,289 @@
+#ifndef TEPIEBAR_H
+#define TEPIEBAR_H
+
+class TePieBar
+{
+public:
+ enum TePieBarInput {ALL, TABSEL, QUERYSEL, LEGEND, NOTTABSEL, NOTQUERYSEL, NOTLEGEND};
+ string type_; // PIECHART or BARCHART
+ int themeId_;
+ double maxDiameter_;
+ double minDiameter_;
+ double diameter_;
+ string dimensionAttr_;
+ vector<string> attrVector_;
+ vector<TeColor> colorVector_;
+ double maxHeight_;
+ double minHeight_;
+ double width_;
+ double maxValue_;
+ double minValue_;
+ bool keepDimension_;
+ int inputType_;
+ TeDatabase *db_;
+ string keyMove_;
+
+ TePieBar() {}
+
+ TePieBar(int themeId, TeDatabase* db)
+ {
+ themeId_ = themeId;
+ db_ = db;
+ }
+
+ TePieBar (const TePieBar& pb )
+ {
+ type_ = pb.type_;
+ themeId_ = pb.themeId_;
+ maxDiameter_ = pb.maxDiameter_;
+ minDiameter_ = pb.minDiameter_;
+ diameter_ = pb.diameter_;
+ dimensionAttr_ = pb.dimensionAttr_;
+ maxHeight_ = pb.maxHeight_;
+ minHeight_ = pb.minHeight_;
+ width_ = pb.width_;
+ maxValue_ = pb.maxValue_;
+ minValue_ = pb.minValue_;
+ keepDimension_ = pb.keepDimension_;
+ inputType_ = pb.inputType_;
+ db_ = pb.db_;
+ keyMove_ = pb.keyMove_;
+
+ attrVector_.clear();
+ colorVector_.clear();
+ int size = pb.attrVector_.size();
+ int i = 0;
+ while(i < size)
+ { attrVector_.push_back(pb.attrVector_[i]);
+ colorVector_.push_back(pb.colorVector_[i]);
+ i++;
+ }
+ }
+
+ TePieBar& operator=(const TePieBar& pb)
+ {
+ type_ = pb.type_;
+ themeId_ = pb.themeId_;
+ maxDiameter_ = pb.maxDiameter_;
+ minDiameter_ = pb.minDiameter_;
+ diameter_ = pb.diameter_;
+ dimensionAttr_ = pb.dimensionAttr_;
+ maxHeight_ = pb.maxHeight_;
+ minHeight_ = pb.minHeight_;
+ width_ = pb.width_;
+ maxValue_ = pb.maxValue_;
+ minValue_ = pb.minValue_;
+ keepDimension_ = pb.keepDimension_;
+ inputType_ = pb.inputType_;
+ db_ = pb.db_;
+ keyMove_ = pb.keyMove_;
+
+ attrVector_.clear();
+ colorVector_.clear();
+ int size = pb.attrVector_.size();
+ int i = 0;
+ while(i < size)
+ { attrVector_.push_back(pb.attrVector_[i]);
+ colorVector_.push_back(pb.colorVector_[i]);
+ i++;
+ }
+ return *this;
+ }
+
+ ~TePieBar() {}
+
+ void init(int themeId, TeDatabase* db)
+ {
+ themeId_ = themeId;
+ db_ = db;
+ }
+
+ bool locate(TeCoord2D pt, double delta)
+ {
+ keyMove_.clear();
+ string TS = "AuxTheme" + Te2String(themeId_);
+ string xmin = Te2String(pt.x()-delta);
+ string xmax = Te2String(pt.x()+delta);
+ string ymin = Te2String(pt.y()-delta);
+ string ymax = Te2String(pt.y()+delta);
+
+ TeDatabasePortal* portal = db_->getPortal();
+ string sel = "SELECT SELKEY FROM " + TS + " WHERE ";
+ sel += "PIEBARX > " + xmin + " AND ";
+ sel += "PIEBARX < " + xmax + " AND ";
+ sel += "PIEBARY > " + ymin + " AND ";
+ sel += "PIEBARY < " + ymax;
+ if(portal->query(sel) == false)
+ {
+ delete portal;
+ return false;
+ }
+
+ bool b = portal->fetchRow(0);
+ if(b == true)
+ keyMove_ = portal->getData(0);
+ delete portal;
+
+ if(keyMove_.empty() == false)
+ return true;
+ return false;
+ }
+
+ void move(TeCoord2D pt)
+ {
+ if(keyMove_.empty() == true)
+ return;
+
+ string x = Te2String(pt.x());
+ string y = Te2String(pt.y());
+ string TS = "AuxTheme" + Te2String(themeId_);
+ string mover = "UPDATE " + TS + " SET PIEBARX = " + x + ", PIEBARY = " + y;
+ mover += " WHERE SELKEY = '" + keyMove_ + "'";
+ db_->execute(mover);
+ }
+
+ bool load()
+ {
+ TeDatabasePortal* portal = db_->getPortal();
+ string sel = "SELECT * FROM piebars WHERE themeId = " + Te2String(themeId_);
+ if(portal->query(sel))
+ {
+ bool b = portal->fetchRow(0);
+ if(b == false)
+ {
+ delete portal;
+ return false;
+ }
+ type_ = portal->getData("type");
+ maxDiameter_ = portal->getDouble("maxDiameter");
+ minDiameter_ = portal->getDouble("minDiameter");
+ diameter_ = portal->getDouble("diameter"));
+ string attr = portal->getData("dimensionAttr");
+ dimensionAttr_ = attr;
+ maxHeight_ = portal->getDouble("maxHeight");
+ minHeight_ = portal->getDouble("minHeight");
+ width_ = portal->getDouble("width"));
+ maxValue_ = portal->getDouble("maxValue");
+ minValue_ = atof(portal->getData("minValue");
+ keepDimension_ = portal->getDouble("keepDimension");
+ inputType_ = portal->getDouble("inputType");
+ int i;
+ for(i=0; i<10; i++)
+ {
+ string attr = "attr" + Te2String(i+1);
+ string vattr = portal->getData(attr);
+ if(vattr.empty() == true)
+ break;
+ attrVector_.push_back(vattr);
+
+ string red = "red" + Te2String(i+1);
+ string green = "green" + Te2String(i+1);
+ string blue = "blue" + Te2String(i+1);
+ TeColor cor;
+ cor.red_ = atoi(portal->getData(red));
+ cor.green_ = atoi(portal->getData(green));
+ cor.blue_ = atoi(portal->getData(blue));
+ colorVector_.push_back(cor);
+ }
+ delete portal;
+ return true;
+ }
+ delete portal;
+ return false;
+ }
+
+ void save()
+ {
+ int i;
+ TeDatabasePortal* portal = db_->getPortal();
+ bool b = portal->query("SELECT * FROM piebars");
+ delete portal;
+ if(b == false)
+ {
+ string criar = "CREATE TABLE piebars (themeId INTEGER,";
+ criar += "type VARCHAR(16) DEFAULT NULL,";
+ criar += "maxDiameter DOUBLE DEFAULT NULL,";
+ criar += "minDiameter DOUBLE DEFAULT NULL,";
+ criar += "diameter DOUBLE DEFAULT NULL,";
+ criar += "dimensionAttr VARCHAR(64) DEFAULT NULL,";
+ criar += "maxHeight DOUBLE DEFAULT NULL,";
+ criar += "minHeight DOUBLE DEFAULT NULL,";
+ criar += "width DOUBLE DEFAULT NULL,";
+ criar += "maxValue DOUBLE DEFAULT NULL,";
+ criar += "minValue DOUBLE DEFAULT NULL,";
+ criar += "keepDimension INTEGER DEFAULT 0,";
+ criar += "inputType INTEGER DEFAULT 0,";
+ for (i=0; i<10; i++)
+ {
+ criar += "attr" + Te2String(i+1) + " VARCHAR(64) DEFAULT NULL,";
+ criar += "red" + Te2String(i+1) + " INTEGER DEFAULT NULL,";
+ criar += "green" + Te2String(i+1) + " INTEGER DEFAULT NULL,";
+ criar += "blue" + Te2String(i+1) + " INTEGER DEFAULT NULL,";
+ }
+ criar.erase(criar.size()-1, 1);
+ criar += ")";
+ db_->execute(criar);
+ }
+
+ string del = "DELETE FROM piebars WHERE themeId = " + Te2String(themeId_);
+ db_->execute(del);
+
+ if(attrVector_.size() == 0)
+ return;
+ string up = "INSERT INTO piebars (themeId, type, maxDiameter, ";
+ up += "minDiameter, diameter, dimensionAttr, maxHeight, minHeight, ";
+ up += "width, maxValue, minValue, keepDimension, inputType, ";
+ for (i=0; i<attrVector_.size() && i<10; i++)
+ {
+ up += "attr" + Te2String(i+1) + ", ";
+ up += "red" + Te2String(i+1) + ", ";
+ up += "green" + Te2String(i+1) + ", ";
+ up += "blue" + Te2String(i+1) + ", ";
+ }
+ up.erase(up.size()-2, 2);
+ up += ")";
+
+ up += " VALUES (" + Te2String(themeId_) + ", ";
+ up += "'" + type_ + "', ";
+ up += Te2String(maxDiameter_) + ", ";
+ up += Te2String(minDiameter_) + ", ";
+ up += Te2String(diameter_) + ", ";
+ up += "'" + dimensionAttr_ + "', ";
+ up += Te2String(maxHeight_) + ", ";
+ up += Te2String(minHeight_) + ", ";
+ up += Te2String(width_) + ", ";
+ up += Te2String(maxValue_) + ", ";
+ up += Te2String(minValue_) + ", ";
+ up += Te2String(keepDimension_) + ", ";
+ up += Te2String(inputType_) + ", ";
+ for (i=0; i<attrVector_.size() && i<10; i++)
+ {
+ up += "'" + attrVector_[i] + "', ";
+ up += Te2String(colorVector_[i].red_) + ", ";
+ up += Te2String(colorVector_[i].green_) + ", ";
+ up += Te2String(colorVector_[i].blue_) + ", ";
+ }
+ up.erase(up.size()-2, 2);
+ up += ")";
+ db_->execute(up);
+ }
+
+ void remove()
+ {
+ TeDatabasePortal* portal = db_->getPortal();
+ bool b = portal->query("SELECT * FROM piebars");
+ delete portal;
+ if(b == false)
+ return;
+
+ string del = "DELETE FROM piebars WHERE themeId = " + Te2String(themeId_);
+ db_->execute(del);
+ }
+};
+
+#endif
+
+
+
+
+
diff --git a/src/terralib/kernel/TePrecision.h b/src/terralib/kernel/TePrecision.h
new file mode 100644
index 0000000..ec4ae4d
--- /dev/null
+++ b/src/terralib/kernel/TePrecision.h
@@ -0,0 +1,57 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_PRECISION_H
+#define __TERRALIB_INTERNAL_PRECISION_H
+
+#include "TeSingleton.h"
+#include "TeDefines.h"
+
+//! Describes a class for supporting, scale and represetation dependet, approximation calculations
+//! \sa TeSingleton
+class TePrecision: public TeSingleton<TePrecision>
+{
+public:
+
+ ~TePrecision() {}
+
+ friend class TeSingleton<TePrecision>;
+
+//! Sets the precision value to be considered
+ void setPrecision ( double precision )
+ { precision_ = precision; }
+
+//! Returns the precision value in use
+ double precision ()
+ { return precision_; }
+
+protected:
+
+ TePrecision(): precision_ ( TeMINFLOAT )
+ {}
+
+ double precision_;
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeProgress.cpp b/src/terralib/kernel/TeProgress.cpp
new file mode 100644
index 0000000..f14dbc6
--- /dev/null
+++ b/src/terralib/kernel/TeProgress.cpp
@@ -0,0 +1,31 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeProgress.h"
+
+TeProgressBase* TeProgress::instance_ = 0;
+
+void TeProgress::setProgressInterf( TeProgressBase* interf )
+{
+ instance_ = interf;
+}
diff --git a/src/terralib/kernel/TeProgress.h b/src/terralib/kernel/TeProgress.h
new file mode 100644
index 0000000..9e15aae
--- /dev/null
+++ b/src/terralib/kernel/TeProgress.h
@@ -0,0 +1,66 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_PROGRESS_H
+#define __TERRALIB_INTERNAL_PROGRESS_H
+
+#include "TeProgressBase.h"
+
+//! Provides the suport to implement an instance of a progress bar interface
+/*
+ This class is based on a Singleton Design Pattern (See "Design Patterns" book, page 127).
+ Applications should set the Progress Interface that will be used by the TerraLib routines
+ able to indicate progress in executing a task.
+
+*/
+class TeProgress {
+
+public:
+
+ //! Returns the unique instance of a progress interface
+ static TeProgressBase* instance()
+ {
+ return instance_;
+ }
+
+ //! Sets the unique instance of a progress interface
+ static void setProgressInterf( TeProgressBase* interf );
+
+ virtual ~TeProgress() {}
+
+protected:
+
+//! Empty
+ TeProgress() {}
+
+private:
+ //! The unique instance of a progress interface
+ static TeProgressBase* instance_;
+
+// No copy allowed
+ TeProgress(const TeProgress&);
+ TeProgress& operator=(const TeProgress&){return *this;}
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeProgressBase.h b/src/terralib/kernel/TeProgressBase.h
new file mode 100644
index 0000000..2240328
--- /dev/null
+++ b/src/terralib/kernel/TeProgressBase.h
@@ -0,0 +1,73 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_PROGRESSBASE_H
+#define __TERRALIB_INTERNAL_PROGRESSBASE_H
+
+#include <string>
+using std::string;
+
+//! A generic Progress Interface.
+/*
+ It defines the methods that should be implemented by concrete classes.
+ Assumes that a progress interface has a Caption to indicate the task
+ being monitored and a Message to be displayed along with the progress
+ indication. A progress interface also know the total number of steps
+ required to finish the task being monitored.
+*/
+class TeProgressBase
+{
+public:
+
+ //! Constructor
+ TeProgressBase(){}
+
+ //! Destructor
+ virtual ~TeProgressBase() {}
+
+ //! Sets the total number of steps to n
+ virtual void setTotalSteps(int n) =0;
+
+ //! Sets the current amount of progress made to n
+ virtual void setProgress(int n) = 0;
+
+ //! Resets the progress interface
+ virtual void reset() = 0;
+
+ //! Resets the progress dialog
+ virtual void cancel() = 0;
+
+ //! Sets the label's text
+ virtual void setMessage(const string& text) = 0;
+
+ //!Returns the label's text
+ virtual string getMessage() { return ""; }
+
+ //! Returns true whether the process was cancelled
+ virtual bool wasCancelled() = 0;
+
+ //! Sets the caption associated to the progress interface
+ virtual void setCaption(const string& cap) = 0;
+
+};
+#endif
diff --git a/src/terralib/kernel/TeProjection.cpp b/src/terralib/kernel/TeProjection.cpp
new file mode 100644
index 0000000..6e54792
--- /dev/null
+++ b/src/terralib/kernel/TeProjection.cpp
@@ -0,0 +1,1708 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeProjection.h"
+#include "TeException.h"
+#include "TeUtils.h"
+#include <stdio.h>
+
+//=========================================================
+//
+// PROJECTION INFORMATION
+//
+// Auxiliary functions which indicate the information
+// associated to a projection
+//
+// Used for reading and writing information
+//
+//==========================================================
+
+
+// Name Units Long Lat Par1 Par2 Sca Eas Nor
+char* teProjInfo[]= {
+"Albers", "1", "1", "1", "1", "1", "0", "1", "1",
+"LatLong", "1", "0", "0", "0", "0", "0", "0", "0",
+"LambertConformal", "1", "1", "1", "1", "1", "0", "1", "1",
+"Mercator", "1", "1", "1", "1", "0", "0", "1", "1",
+"Miller", "1", "1", "0", "0", "0", "0", "1", "1",
+"UTM", "1", "1", "0", "0", "0", "1", "1", "1",
+"Polyconic", "1", "1", "1", "0", "0", "0", "1", "1",
+"Sinusoidal", "1", "1", "0", "0", "0", "0", "1", "1",
+"CylindricalEquidistant", "1", "1", "0", "1", "0", "0", "1", "1",
+"PolarStereographic", "1", "1", "0", "0", "0", "0", "1", "1",
+"NoProjection", "1", "0", "0", "0", "0", "0", "0", "0"
+};
+
+TeProjInfo
+TeProjectionInfo ( const string& projName )
+{
+
+ TeProjInfoMap pjMap;
+ TeProjInfo pjInfo;
+
+ int k = 0;
+
+ for ( int i = 0; i < NUM_PROJ; i++ )
+ {
+ string name = teProjInfo [k++];
+
+ pjInfo.hasUnits = atoi ( teProjInfo [k++] );
+ pjInfo.hasLon0 = atoi ( teProjInfo [k++] );
+ pjInfo.hasLat0 = atoi ( teProjInfo [k++] );
+ pjInfo.hasStlat1 = atoi ( teProjInfo [k++] );
+ pjInfo.hasStlat2 = atoi ( teProjInfo [k++] );
+ pjInfo.hasScale = atoi ( teProjInfo [k++] );
+ pjInfo.hasOffx = atoi ( teProjInfo [k++] );
+ pjInfo.hasOffy = atoi ( teProjInfo [k++] );
+
+ pjMap [ name ] = pjInfo;
+ }
+
+
+ TeProjInfoMap::iterator it = pjMap.find ( projName );
+
+ if ( it == pjMap.end() )
+ throw TeException ( PROJECTION_NOT_AVAILABLE );
+
+return (*it).second;
+}
+
+//========================================================
+//
+// PROJECTION FACTORY
+//
+// =======================================================
+
+TeProjection*
+TeProjectionFactory::make ( const TeProjectionParams& par )
+{
+ string punits;
+ if (par.units.empty())
+ punits = "Meters";
+ else
+ punits = par.units;
+
+ if ( par.name == "UTM" )
+ return new TeUtm ( par.datum, par.lon0, par.lat0,
+ par.offx, par.offy, punits, par.scale, par.hemisphere );
+
+ if ( par.name == "LambertConformal")
+ return new TeLambertConformal ( par.datum, par.lon0, par.lat0,
+ par.offx, par.offy, par.stlat1, par.stlat2, punits );
+
+ if ( par.name == "Albers" )
+ return new TeAlbers ( par.datum, par.lon0, par.lat0,
+ par.offx, par.offy, par.stlat1, par.stlat2, punits );
+
+ if ( par.name == "Miller")
+ return new TeMiller ( par.datum, par.lon0, par.offx, par.offy, punits );
+
+ if ( par.name == "LatLong" )
+ {
+ if (par.units.empty())
+ punits = "DecimalDegrees";
+ else
+ punits = par.units;
+ return new TeLatLong ( par.datum, par.units );
+ }
+
+ if ( par.name == "Polyconic" )
+ return new TePolyconic ( par.datum, par.lon0, par.lat0, par.offx, par.offy, punits);
+
+ if ( par.name == "Mercator" )
+ return new TeMercator ( par.datum, par.lon0, par.lat0,
+ par.offx, par.offy, par.stlat1, punits );
+
+ if ( par.name == "Sinusoidal")
+ return new TeSinusoidal ( par.datum, par.lon0, par.offx, par.offy, punits );
+
+ if ( par.name == "CylindricalEquidistant")
+ return new TeCylindricalEquidistant ( par.datum, par.lon0, par.offx, par.offy, par.stlat1, punits);
+
+ if ( par.name == "PolarStereographic")
+ return new TePolarStereographic ( par.datum, par.lon0, par.offx, par.offy,punits, par.hemisphere );
+
+ if ( par.name == "NoProjection")
+ return new TeNoProjection (punits);
+
+return 0;
+}
+
+TeProjectionParams
+TeProjection::params ()
+{
+ TeProjectionParams par;
+
+ par.name = GPname;
+ par.datum = GPdatum;
+ par.lon0 = GPlon0;
+ par.lat0 = GPlat0;
+ par.offx = GPoffx;
+ par.offy = GPoffy;
+ par.stlat1 = GPstlat1;
+ par.stlat2 = GPstlat2;
+ par.units = GPunits;
+ par.scale = GPscale;
+ par.hemisphere = GPhemisphere;
+
+return par;
+}
+
+
+TeProjection::TeProjection(const TeProjection& rhs)
+{
+ GPname = rhs.GPname;
+ GPdatum = rhs.GPdatum;
+ GPlon0 = rhs.GPlon0;
+ GPlat0 = rhs.GPlat0;
+ GPoffx = rhs.GPoffx;
+ GPoffy = rhs.GPoffy;
+ GPstlat1 = rhs.GPstlat1;
+ GPstlat2 = rhs.GPstlat2;
+ GPunits = rhs.GPunits;
+ GPscale = rhs.GPscale;
+ GPhemisphere = rhs.GPhemisphere;
+}
+
+TeProjection&
+TeProjection::operator=(const TeProjection& rhs)
+{
+ if ( this != &rhs )
+ {
+ GPname = rhs.GPname;
+ GPdatum = rhs.GPdatum;
+ GPlon0 = rhs.GPlon0;
+ GPlat0 = rhs.GPlat0;
+ GPoffx = rhs.GPoffx;
+ GPoffy = rhs.GPoffy;
+ GPstlat1 = rhs.GPstlat1;
+ GPstlat2 = rhs.GPstlat2;
+ GPunits = rhs.GPunits;
+ GPscale = rhs.GPscale;
+ GPhemisphere = rhs.GPhemisphere;
+ }
+ return *this;
+}
+
+
+
+/*******************************************************************
+ CHECKS IF A PROJECTION INSTANCE IS EQUAL TO ANOTHER
+********************************************************************/
+
+bool
+TeProjection::operator== (const TeProjection& proj)
+{
+ if (!(GPdatum==proj.GPdatum))
+ return false;
+ if (GPlon0!=proj.GPlon0)
+ return false;
+ if (GPlat0!=proj.GPlat0)
+ return false;
+ if (GPoffx!=proj.GPoffx)
+ return false;
+ if (GPoffy!=proj.GPoffy)
+ return false;
+ if (GPstlat1!=proj.GPstlat1)
+ return false;
+ if (GPstlat2!=proj.GPstlat2)
+ return false;
+ if (GPhemisphere!=proj.GPhemisphere)
+ return false;
+
+ return true;
+}
+
+/*******************************************************************
+ PRINTS INFORMATION ABOUT A PROJECTION
+********************************************************************/
+
+
+void
+TeProjection::print ( FILE* file_ )
+{
+ TeProjInfo pjInfo = TeProjectionInfo ( GPname );
+
+ fprintf(file_,"%s\n", "// Projection Information" );
+ fprintf ( file_, "%s %s \n", "PROJECTION", GPname.c_str() );
+ fprintf ( file_, "%s %s \n", "DATUM", GPdatum.name().c_str() );
+ fprintf ( file_, "%s %s \n", "UNITS", GPunits.c_str() );
+
+ if ( pjInfo.hasLon0 )
+ fprintf ( file_, "%s %17.6f \n", "ORIGIN LONG", GPlon0 );
+
+ if ( pjInfo.hasLat0 )
+ fprintf ( file_, "%s %17.6f \n", "ORIGIN LAT", GPlat0 );
+
+ if ( pjInfo.hasOffx )
+ fprintf ( file_, "%s %17.6f \n", "FALSE EASTING", GPoffx );
+
+ if ( pjInfo.hasOffy )
+ fprintf ( file_, "%s %17.6f \n", "FALSE NORTHING", GPoffy );
+
+ if ( pjInfo.hasStlat1 )
+ fprintf ( file_, "%s %17.6f \n", "FIRST STANDARD PARALEL", GPstlat1 );
+
+ if ( pjInfo.hasStlat2 )
+ fprintf ( file_, "%s %17.6f \n", "SECOND STANDARD PARALEL", GPstlat2 );
+
+ if ( pjInfo.hasScale )
+ fprintf ( file_, "%s %17.6f \n", "SCALE", GPscale );
+
+ fprintf(file_,"%s\n", "// End of Projection Information" );
+}
+
+
+string
+TeProjection::describe ()
+{
+ string desc;
+ if (GPname == "NoProjection")
+ {
+ desc = "NoProjection";
+ return desc;
+ }
+
+ TeProjInfo pjInfo = TeProjectionInfo ( GPname );
+
+ desc = GPunits;
+ if ( pjInfo.hasLon0 )
+ desc += "," + Te2String(GPlon0*TeCRD,6);
+
+ if ( pjInfo.hasLat0 )
+ desc += "," + Te2String(GPlat0*TeCRD,6);
+
+ if ( pjInfo.hasStlat1 )
+ desc += ", " + Te2String(GPstlat1*TeCRD,6);
+
+ if ( pjInfo.hasStlat2 )
+ desc += "," + Te2String(GPstlat2*TeCRD,6);
+
+ if ( pjInfo.hasOffx )
+ desc += "," + Te2String(GPoffx,6);
+
+ if ( pjInfo.hasOffy )
+ desc += "," + Te2String(GPoffy,6);
+
+ if ( pjInfo.hasScale )
+ desc += "," + Te2String(GPscale,6);
+
+ return desc;
+}
+
+
+bool decodifyDescription(const string& projDescription, TeProjectionParams& pars)
+{
+ vector<string> projDesc;
+ if (TeSplitString(projDescription, ",", projDesc) <= 0)
+ return false;
+ unsigned int npar = projDesc.size();
+ TeProjInfo pjInfo = TeProjectionInfo (projDesc[0]);
+ pars.name = projDesc[0];
+ if (npar > 1)
+ pars.units = projDesc[1];
+ else
+ return true;
+
+ unsigned int nextp = 2;
+ if (pjInfo.hasLon0)
+ {
+ if (nextp < npar)
+ {
+ pars.lon0 = atof(projDesc[nextp].c_str()) * TeCDR;
+ nextp++;
+ }
+ else
+ return false;
+ }
+
+ if (pjInfo.hasLat0)
+ {
+ if (nextp < npar)
+ {
+ pars.lat0 = atof(projDesc[nextp].c_str()) * TeCDR;
+ nextp++;
+ }
+ else
+ return false;
+ }
+
+ if (pjInfo.hasStlat1)
+ {
+ if (nextp < npar)
+ {
+ pars.stlat1 = atof(projDesc[nextp].c_str()) * TeCDR;
+ nextp++;
+ }
+ else
+ return false;
+ }
+
+ if (pjInfo.hasStlat2)
+ {
+ if (nextp < npar)
+ {
+ pars.stlat2 = atof(projDesc[nextp].c_str()) * TeCDR;
+ nextp++;
+ }
+ else
+ return false;
+ }
+
+ if (pjInfo.hasOffx)
+ {
+ if (nextp < npar)
+ {
+ pars.offx = atof(projDesc[nextp].c_str());
+ nextp++;
+ }
+ else
+ return false;
+ }
+
+ if (pjInfo.hasOffy)
+ {
+ if (nextp < npar)
+ {
+ pars.offy = atof(projDesc[nextp].c_str());
+ nextp++;
+ }
+ else
+ return false;
+ }
+
+ if (pjInfo.hasScale)
+ {
+ if (nextp < npar)
+ {
+ pars.scale = atof(projDesc[nextp].c_str());
+ nextp++;
+ }
+ else
+ return false;
+ }
+ return true;
+}
+
+/********************************************************************
+ Planimetric datum transformation
+********************************************************************/
+void
+TeProjection :: ChangeLL (double &lon1, double &lat1)
+{
+ double equad1, // Squared eccentricity - datum 1
+ equad2, // Squared eccentricity - datum 2
+ n1, // Great normal of ellipsoid - datum 1
+ n2, // Great normal od ellipsoid - datum 2
+ x1, // Geocentric cartesian coordinates - datum 1
+ y1,
+ z1,
+ x2, // Geocentric cartesian coordinates - datum 2
+ y2,
+ z2,
+ d,lat2, // Ancillary variable
+ lon2;
+ double Pflt = GPdatum.flattening();
+ double Prd = GPdatum.radius();
+
+ if( GPdestination->GPdatum.radius() == 0.) return;
+
+ int flt1 = (int)(Pflt*1000000000.);
+ int flt2 = (int)(GPdestination->GPdatum.flattening()*1000000000.);
+ if (Prd == GPdestination->GPdatum.radius() && flt1==flt2)
+ return;
+
+// Geocentric cartesian coordinates calculation - datum 1
+ equad1 = 2.*Pflt;
+ equad1 -= Pflt*Pflt;
+ double a1,a2,a3;
+ a1 = sin(lat1);
+ a1 *= a1;
+ a1 *= equad1;
+ a2 = 1-a1;
+ n1 = Prd/sqrt(a2);
+ x1 = n1*cos(lat1)*cos(lon1);
+ y1 = n1*cos(lat1)*sin(lon1);
+ z1 = (n1*(1-equad1))*sin(lat1);
+
+// Geocentric cartesian coordinates calculation - datum 2
+ if (GPdatum.xShift() == TeMAXFLOAT || GPdestination->GPdatum.xShift() == TeMAXFLOAT)
+ {
+ x2 = x1;
+ y2 = y1;
+ z2 = z1;
+ }
+ else
+ {
+ x2 = x1 + (GPdatum.xShift() - GPdestination->GPdatum.xShift());
+ y2 = y1 + (GPdatum.yShift() - GPdestination->GPdatum.yShift());
+ z2 = z1 + (GPdatum.zShift() - GPdestination->GPdatum.zShift());
+ }
+
+// Geodetic coordinates calculation - datum 2
+ equad2 = 2.*GPdestination->GPdatum.flattening();
+ equad2 -= (GPdestination->GPdatum.flattening())*(GPdestination->GPdatum.flattening());
+ lat2 = lat1;
+ do
+ {
+ a1 = sin(lat2);
+ a1 *= a1;
+ a1 *= equad2;
+ a2 = 1-a1;
+ n2 = GPdestination->GPdatum.radius()/sqrt(a2);
+ a1 = equad2*sin(lat2);
+ a1 *= n2;
+ a1 += z2;
+ a2 = x2*x2;
+ a2 += (y2*y2);
+ a3 = sqrt(a2);
+ lat2 = atan2(a1,a3);
+ a1 = sin(lat2);
+ a1 *= a1;
+ a1 *= equad2;
+ a2 = 1-a1;
+ a3 = sqrt(a2);
+ d = (GPdestination->GPdatum.radius()/a3)-n2;
+ }
+ while (fabs(d) > 0.0000001);
+ lon2 = atan2(y2,x2);
+ lat1 = lat2;
+ lon1 = lon2;
+}
+
+/********************************************************************
+ GEODETIC TO UTM COORDINATES
+********************************************************************/
+
+
+TeCoord2D
+TeUtm :: LL2PC (TeCoord2D& ptll)
+{
+
+ double k0, // Scale factor
+ equad, // Squared eccentricity
+ n, // Great normal of ellipsoid
+ elinquad, // ancillary variables
+ aux1,aux2,aux3,aux4,aux5,aux6,aux7,aux8,aux9,
+ aux10,aux11,aux12,aux13,t,c,ag,m,ptllx,ptlly;
+
+ double Pflt = GPdatum.flattening();
+ ptllx = ptll.x();
+ ptlly = ptll.y();
+ k0 = 1. - (1./2500.);
+ equad = 2.*Pflt;
+ equad -= Pflt*Pflt;
+ elinquad = equad/(1. - equad);
+ aux1 = equad*equad;
+ aux2 = aux1*equad;
+ aux3 = sin((double)2*ptlly);
+ aux4 = sin((double)4*ptlly);
+ aux5 = sin((double)6*ptlly);
+
+ double a1, a2, a3;
+ a1 = equad/4.;
+ a2 = 3.*aux1/64.;
+ a3 = 5.*aux2/256.;
+ aux6 = (1-a1-a2-a3)*ptlly;
+
+ a1 = 3.*equad/8.;
+ a2 = 3.*aux1/32.;
+ a3 = 45.*aux2/1024.;
+ aux7 = (a1+a2+a3)*aux3;
+
+ a1 = 15.*aux1/256.;
+ a2 = 45.*aux2/1024.;
+ aux8 = (a1+a2)*aux4;
+
+ aux9 = 35.*aux2;
+ aux9 /= 3072.;
+ aux9 *= aux5;
+
+ a1 = sin(ptlly);
+ a1 *= a1;
+ a1 *= equad;
+ n = GPdatum.radius()/sqrt((double)1-a1);
+
+
+ t = tan(ptlly);
+ t *= t;
+
+ c = cos(ptlly);
+ c *= c;
+ c *= elinquad;
+ ag = (ptllx-GPlon0)*cos(ptlly);
+ m = GPdatum.radius()*(aux6 - aux7 + aux8 - aux9);
+
+
+ a1 = ag*ag*ag;
+ aux10 = (1.-t+c)*a1/6.;
+
+ a1 = 5.-(18.*t);
+ a2 = a1+t*t;
+ a1 = a2+72.*c;
+ a2 = a1-(58.*elinquad);
+ a1 = ag*ag*ag;
+ a1 *= ag;
+ a1 *= ag;
+ aux11 = a2*a1/120.;
+
+ a1 = 5.-t+9.*c;
+ a2 = 4.*c*c;
+ a3 = ag*ag;
+ a3 *= ag;
+ a3 *= ag;
+ aux12 = (a1+a2)*a3/24.;
+
+ a1 = 61.-(58.*t) ;
+ a2 = a1+(t*t);
+ a1 = a2+(600.*c);
+ a2 = a1-(330.*elinquad);
+ a1 = ag*ag*ag;
+ a1 *= ag;
+ a1 *= ag;
+ a1 *= ag;
+ aux13 = a2*a1/720.;
+
+ ptllx = k0*n*(ag + aux10 + aux11);
+
+ a1 = ag*ag/2;
+ a2 = a1+aux12+aux13;
+ a3 = n*tan(ptlly);
+ a1 = a2*a3;
+ ptlly = k0*(m+a1);
+
+ return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));
+}
+
+
+/********************************************************************
+ UTM TO GEODETIC COORDINATES
+********************************************************************/
+
+TeCoord2D
+TeUtm :: PC2LL (TeCoord2D& ptpc)
+{
+ double k0, // Scale factor
+ equad, // Squared eccentricity
+ n1, // Great normal of ellipsoid
+ elinquad, // Ancillary variables
+ e1,aux1,aux2,aux3,aux4,aux5,m,mi,aux6,aux7,aux8,lat1,
+ c1,t1, quoc,r1,d,aux9,aux10,aux11,aux12,ptpcx,ptpcy;
+
+ double Prd = GPdatum.radius();
+ double Pflt = GPdatum.flattening();
+
+ ptpcx = ptpc.x()-GPoffx;
+ ptpcy = ptpc.y()-GPoffy;
+
+ k0 = 1. - (1./2500.);
+ equad = 2.*Pflt;
+ equad -= Pflt*Pflt;
+ elinquad = equad/(1. - equad);
+
+ double a1,a2,a3;
+ a1 = sqrt((double)1-equad);
+ e1 = (1.-a1)/(1.+a1);
+
+ aux1 = equad*equad;
+ aux2 = aux1*equad;
+ aux3 = e1*e1;
+ aux4 = e1*aux3;
+ aux5 = aux4*e1;
+
+ m = ptpcy/k0;
+
+
+ a1 = 1.-(equad/4.);
+ a2 = 3.*(aux1/64.);
+ a3 = 5.*(aux2/256.);
+ mi = m/(Prd*(a1-a2-a3));
+
+
+ a1 = 3.*(e1/2.);
+ a2 = 27.*(aux4/32.);
+ a3 = sin((double)2*mi);
+ aux6 = (a1-a2)*a3;
+
+ a1 = 21.*(aux3/16.);
+ a2 = 55.*(aux5/32.);
+ a3 = sin((double)4*mi);
+ aux7 = (a1-a2)*a3;
+
+ a1 = 151.*(aux4/96.);
+ a2 = sin((double)6*mi);
+ aux8 = a1*a2;
+
+ lat1 = mi + aux6 + aux7 + aux8;
+
+ c1 = cos(lat1);
+ c1 *= c1;
+ c1 *= elinquad;
+
+ t1 = tan(lat1);
+ t1 *= t1;
+
+ a1 = sin(lat1);
+ a1 *= a1;
+ a1 *= equad;
+ a2 = 1.-a1;
+ n1 = Prd/sqrt(a2);
+
+ a1 = sin(lat1);
+ a1 *= a1;
+ a1 *= equad;
+ a2 = 1.-a1;
+ quoc = a2*a2*a2;
+
+ r1 = Prd*(1.-equad);
+ r1 /= sqrt(quoc);
+
+ d = ptpcx;
+ d /= (n1*k0);
+
+
+ a1 = 5.+(3.*t1);
+ a1 += (10.*c1);
+ a1 += (-4.*(c1*c1));
+ a1 += (-9.*elinquad);
+ a1 *= d;
+ a1 *= d;
+ a1 *= d;
+ a1 *= d;
+ aux9 = a1/24.;
+
+ a1 = 61.+(90.*t1);
+ a1 += (298.*c1);
+ a1 += (45.*(t1*t1));
+ a1 += (-252.*elinquad);
+ a1 += (-3.*c1*c1);
+ aux10 = d*d*d;
+ aux10 *= d;
+ aux10 *= d;
+ aux10 *= d;
+ aux10 *= a1;
+ aux10 /= 720.;
+
+ a1 = d*d*d;
+ a1 /= 6.;
+ a2 = 2.*t1;
+ a2 += (1.+c1);
+ aux11 = d-a2*a1;
+
+ a1 = 5.-(2.*c1);
+ a1 += (28.*t1);
+ a1 += (-3.*c1*c1);
+ a1 += (8.*elinquad);
+ a1 += (24.*t1*t1);
+ aux12 = d*d*d;
+ aux12 *= d;
+ aux12 *= d;
+ aux12 *= a1;
+ aux12 /= 120.;
+
+ a1 = d*d/2.;
+ a1 += (- aux9 + aux10);
+ a2 = tan(lat1)/r1;
+ a2 *= n1;
+ ptpcy = lat1-a2*a1;
+
+ ptpcx= GPlon0 + (aux11 + aux12)/cos(lat1);
+
+ if( GPdestination && !(datum() == GPdestination->datum()))
+ ChangeLL(ptpcx,ptpcy);
+
+ return(TeCoord2D(ptpcx,ptpcy));
+}
+
+/********************************************************************
+ GEODETIC TO MERCATOR COORDINATES
+********************************************************************/
+TeCoord2D
+TeMercator :: LL2PC (TeCoord2D& ptll)
+{
+ double equad, //Squared eccentricity
+ aux1, // Ancillary variables
+ aux2,aux3,aux4,aux5,aux6,ptllx,ptlly;
+
+ double Pflt = GPdatum.flattening();
+ double Prd = GPdatum.radius();
+
+ ptllx = ptll.x();
+ ptlly = ptll.y();
+
+ equad = 2.*Pflt;
+ equad -= Pflt*Pflt;
+ double a1,a2,a3;
+
+ a1 = tan(ptlly/(double)2);
+ a2 = 1.+a1;
+ a3 = 1.-a1;
+ aux1 = a2/a3;
+
+ a1 = equad*equad/4.;
+ a1 += equad;
+ a2 = equad*equad*equad/8.;
+ a3 = sin(ptlly);
+ aux2 = (a1+a2)*a3;
+
+ a1 = equad*equad/12.;
+ a2 = equad*equad*equad/16.;
+ a3 = sin((double)3*ptlly);
+ aux3 = (a1+a2)*a3;
+
+ a1 = equad*equad*equad/80.;
+ a2 = sin((double)5*ptlly);
+ aux4 = a1*a2;
+ aux5 = cos(GPstlat1);
+
+ a1 = sin(GPstlat1);
+ a1 *= a1;
+ a1 *= equad;
+ a2 = sqrt((double)1-a1);
+ aux6 = 1./a2;
+
+ ptllx = Prd*(ptllx - GPlon0)*aux5*aux6;
+ ptlly = Prd*(log(aux1) - aux2 + aux3 - aux4)*aux5*aux6;
+
+ return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));
+}
+
+/********************************************************************
+ MERCATOR TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeMercator :: PC2LL (TeCoord2D& ptpc)
+{
+ double equad, //Squared eccentricity
+ pi, // PII value
+ t, // Ancillary variables
+ xx,aux1,aux2,aux3,aux4,aux5,ptpcx,ptpcy;
+
+ double Pflt = GPdatum.flattening();
+ double Prd = GPdatum.radius();
+
+ ptpcx = ptpc.x()-GPoffx;
+ ptpcy = ptpc.y()-GPoffy;
+
+ equad = 2.*Pflt;
+ equad -= Pflt*Pflt;
+ pi = 4.*atan((double)1);
+ double a1,a2;
+ aux1 = cos(GPstlat1);
+
+ a1 = sin(GPstlat1);
+ a1 *= a1;
+ a1 *= equad;
+ a2 = sqrt((double)1-a1);
+ aux2 = 1./a2;
+ ptpcx = ptpcx/(aux1*aux2);
+ ptpcy = ptpcy/(aux1*aux2);
+ t = exp(-ptpcy/Prd);
+ xx = pi/2. - 2.*atan(t);
+
+ a1 = equad/2.;
+ a1 += 5.*equad*equad/24.;
+ a1 += equad*equad*equad/12.;
+ a2 = sin((double)4*atan(t));
+ aux3 = a1*a2;
+
+ a1 = 7.*equad*equad/48.;
+ a1 += 29.*equad*equad*equad/240.;
+ a2 = sin((double)8*atan(t));
+ aux4 = -a1*a2;
+
+ a1 = 7.*equad*equad*equad/120.;
+ a2 = sin((double)12*atan(t));
+ aux5 = a1*a2;
+
+ ptpcy = xx + aux3 + aux4 + aux5;
+ ptpcx = ptpcx/Prd + GPlon0;
+
+ if( GPdestination && !(datum() == GPdestination->datum()))
+ ChangeLL(ptpcx,ptpcy);
+
+ return(TeCoord2D(ptpcx,ptpcy));
+}
+
+
+
+
+/********************************************************************
+ GEODETIC TO LAMBERT CONIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeLambertConformal :: LL2PC (TeCoord2D& ptll)
+{
+
+ double equad, // Squared eccentricity
+ e, // Ancillary variables
+ m1,m2,aux1,aux2,aux0,t1,t2,t0,n,efe,ro0,aux,
+ t,ro,teta,ptllx,ptlly;
+
+ double Pflt = GPdatum.flattening();
+ double Prd = GPdatum.radius();
+
+ ptllx = (double)ptll.x();
+ ptlly = (double)ptll.y();
+
+ equad = 2.*Pflt - pow(Pflt,(double)2);
+ e = sqrt(equad);
+
+ m1 = cos(GPstlat1)/sqrt((double)1-equad*pow(sin(GPstlat1),(double)2));
+ m2 = cos(GPstlat2)/sqrt((double)1-equad*pow(sin(GPstlat2),(double)2));
+ aux1 = sqrt(((double)1-e*sin(GPstlat1))/((double)1+e*sin(GPstlat1)));
+ aux2 = sqrt(((double)1-e*sin(GPstlat2))/((double)1+e*sin(GPstlat2)));
+ aux0 = sqrt(((double)1-e*sin(GPlat0))/((double)1+e*sin(GPlat0)));
+ t1 = ((1.-tan(GPstlat1/(double)2))/(1.+tan(GPstlat1/(double)2)))/pow(aux1,e);
+ t2 = ((1.-tan(GPstlat2/(double)2))/(1.+tan(GPstlat2/(double)2)))/pow(aux2,e);
+ t0 = ((1.-tan(GPlat0/(double)2))/(1.+tan(GPlat0/(double)2)))/pow(aux0,e);
+
+ if (GPstlat1 == GPstlat2)
+ n = sin(GPstlat1);
+ else
+ n = (log(m1)-log(m2))/(log(t1)-log(t2));
+
+ efe = m1/(n*pow(t1,n));
+ ro0 = Prd*efe*pow(t0,n);
+
+ aux = sqrt(((double)1-e*sin(ptlly))/((double)1+e*sin(ptlly)));
+ t = ((1.-tan(ptlly/(double)2))/(1.+tan(ptlly/(double)2)))/pow(aux,e);
+ ro = Prd*efe*pow(t,n);
+ teta = n*(ptllx - GPlon0);
+ ptllx = ro*sin(teta);
+ ptlly = ro0 - ro*cos(teta);
+ return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));
+}
+
+
+
+/********************************************************************
+ LAMBERT CONIC TO GEODETIC COORDINATES
+ ********************************************************************/
+TeCoord2D
+TeLambertConformal :: PC2LL (TeCoord2D& ptpc)
+{
+ double equad, // Squared eccentricity
+ pi, // PI value
+ e,m1,m2,aux1,aux2,aux0,t1,t2,t0,n,efe,ro0,ro,teta,
+ t,xx,aux3,aux4,aux5,ptpcx,ptpcy;
+
+ int sinal;
+
+ double Pflt = GPdatum.flattening();
+ double Prd = GPdatum.radius();
+
+
+ ptpcx = ptpc.x()-GPoffx;
+ ptpcy = ptpc.y()-GPoffy;
+
+ equad = 2.*Pflt - pow(Pflt,(double)2);
+ e = sqrt(equad);
+ pi = 4.*atan((double)1);
+
+ m1 = cos(GPstlat1)/sqrt((double)1-equad*pow(sin(GPstlat1),(double)2));
+ m2 = cos(GPstlat2)/sqrt((double)1-equad*pow(sin(GPstlat2),(double)2));
+ aux1 = sqrt(((double)1-e*sin(GPstlat1))/((double)1+e*sin(GPstlat1)));
+ aux2 = sqrt(((double)1-e*sin(GPstlat2))/((double)1+e*sin(GPstlat2)));
+ aux0 = sqrt(((double)1-e*sin(GPlat0))/((double)1+e*sin(GPlat0)));
+ t1 = ((1.-tan(GPstlat1/(double)2))/(1.+tan(GPstlat1/(double)2)))/pow(aux1,e);
+ t2 = ((1.-tan(GPstlat2/(double)2))/(1.+tan(GPstlat2/(double)2)))/pow(aux2,e);
+ t0 = ((1.-tan(GPlat0/(double)2))/(1.+tan(GPlat0/(double)2)))/pow(aux0,e);
+
+ if (GPstlat1 == GPstlat2)
+ n = sin(GPstlat1);
+ else
+ n = (log(m1)-log(m2))/(log(t1)-log(t2));
+
+ efe = m1/(n*pow(t1,n));
+ ro0 = Prd*efe*pow(t0,n);
+
+ sinal = (int)(n/fabs(n));
+ ro = sqrt(ptpcx*ptpcx + (ro0-ptpcy)*(ro0-ptpcy));
+ ro *= sinal;
+ teta = atan(ptpcx/(ro0-ptpcy));
+ t = pow((ro/(Prd*efe)),(double)1/n);
+ xx = pi/2. - 2.*atan(t);
+ aux3 = equad/2. + 5.*equad*equad/24. + equad*equad*equad/12.;
+ aux4 = 7.*equad*equad/48. + 29.*equad*equad*equad/240.;
+ aux5 = (7.*equad*equad*equad/120.)*sin(12.*atan(t));
+
+ ptpcy = xx + aux3*sin(4.*atan(t)) - aux4*sin(8.*atan(t)) + aux5;
+ ptpcx = teta/n + GPlon0;
+
+ if( GPdestination && !(datum() == GPdestination->datum()))
+ ChangeLL(ptpcx,ptpcy);
+
+ return (TeCoord2D(ptpcx,ptpcy));
+}
+
+/********************************************************************
+ GEODETIC TO POLYCONIC COORDINATES
+********************************************************************/
+TeCoord2D
+TePolyconic :: LL2PC (TeCoord2D& ptll)
+{
+ double equad, // Squared eccentricity
+ n, // Great normal of ellipsoid
+ aux01, // Ancillary variables
+ aux02,aux03,aux04,m0,aux1,aux2,aux3,
+ aux4,m,e,ptllx,ptlly;
+
+ double Pflt = GPdatum.flattening();
+ double Prd = GPdatum.radius();
+
+ ptllx = (double)ptll.x();
+ ptlly = (double)ptll.y();
+
+ equad = 2.*Pflt - pow(Pflt,(double)2);
+
+ aux01 = (1.-equad/4.-3.*equad*equad/64.-5.*equad*equad*equad/256.)*GPlat0;
+ aux02 = (3.*equad/8+3.*equad*equad/32.+45.*equad*equad*equad/1024.)*sin((double)2*GPlat0);
+ aux03 = (15.*equad*equad/256.+45.*equad*equad*equad/1024.)*sin((double)4*GPlat0);
+ aux04 = (35.*equad*equad*equad/3072.)*sin((double)6*GPlat0);
+ m0 = Prd*(aux01 - aux02 + aux03 - aux04);
+
+ if (ptlly == 0.)
+ {
+ ptllx = Prd*(ptllx - GPlon0);
+ ptlly = -m0;
+ }
+ else
+ {
+ aux1 = (1.-equad/4.-3.*equad*equad/64.-5.*equad*equad*equad/256.)*ptlly;
+ aux2 = (3.*equad/8+3.*equad*equad/32.+45.*equad*equad*equad/1024.)*sin((double)2*ptlly);
+ aux3 = (15.*equad*equad/256.+45.*equad*equad*equad/1024.)*sin((double)4*ptlly);
+ aux4 = (35.*equad*equad*equad/3072.)*sin((double)6*ptlly);
+ m = Prd*(aux1 - aux2 + aux3 - aux4);
+ n = Prd/sqrt((double)1-equad*pow(sin(ptlly),(double)2));
+ e = (ptllx - GPlon0)*sin(ptlly);
+ ptllx = n*sin(e)/tan(ptlly);
+ ptlly = m - m0 + (n*(1. - cos(e))/tan(ptlly));
+ }
+ return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));
+}
+
+/*******************************************************************
+ POLYCONIC TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TePolyconic :: PC2LL (TeCoord2D& ptpc)
+{
+ double A,
+ B,
+ C,
+ equad, // Squared eccentricity
+ aux01, // Ancillary variables
+ aux02,aux03,aux04,m0,mn,mnl,ma,cp,lat1,lat2,aux05,
+ aux06,aux07,aux08,aux09,aux10,aux11,aux12,aux21,
+ aux22,aux23,aux24,ptpcx,ptpcy;
+
+
+ double Pflt = GPdatum.flattening();
+ double Prd = GPdatum.radius();
+
+ ptpcx = ptpc.x()-GPoffx;
+ ptpcy = ptpc.y()-GPoffy;
+
+ equad = 2.*Pflt - pow(Pflt,(double)2);
+
+ // Initialize latitude with latitude of origin
+ aux01 = (1.-equad/4.-3.*equad*equad/64.-5.*equad*equad*equad/256.)*GPlat0;
+ aux02 = (3.*equad/8+3.*equad*equad/32.+45.*equad*equad*equad/1024.)*sin((double)2*GPlat0);
+ aux03 = (15.*equad*equad/256.+45.*equad*equad*equad/1024.)*sin((double)4*GPlat0);
+ aux04 = (35.*equad*equad*equad/3072.)*sin((double)6*GPlat0);
+ m0 = Prd*(aux01 - aux02 + aux03 - aux04);
+
+ if (ptpcy == (-m0))
+ {
+ ptpcy= 0.;
+ ptpcx = ptpcx/Prd + GPlon0;
+ }
+ else
+ {
+ A = (m0 + ptpcy)/Prd;
+ B = ((ptpcx*ptpcx)/(Prd*Prd)) +(A*A);
+
+ lat2 = A;
+
+ do
+ {
+ C = (sqrt(1.- equad*sin(lat2)*sin(lat2)))*tan(lat2);
+
+ // mn calculation
+ aux21 = (1.-equad/4.-3.*equad*equad/64.-5.*equad*equad*equad/256.)*lat2;
+ aux22 = (3.*equad/8.+3.*equad*equad/32.+45.*equad*equad*equad/1024.)*sin((double)2*lat2);
+ aux23 = (15.*equad*equad/256.+45.*equad*equad*equad/1024.)*sin((double)4*lat2);
+ aux24 = (35.*equad*equad*equad/3072.)*sin((double)6*lat2);
+ mn = Prd*(aux21 - aux22 + aux23 - aux24);
+
+ // mnl calculation
+ aux05 = 1.- equad/4.-3.*equad*equad/64.-5.*equad*equad*equad/256.;
+ aux06 = 2.*(3.*equad/8.+3.*equad*equad/32.+45.*equad*equad*equad/1024.)*cos((double)2*lat2);
+ aux07 = 4.*(15.*equad*equad/256.+45.*equad*equad*equad/1024.)*cos((double)4*lat2);
+ aux08 = 6.*(35.*equad*equad*equad/3072.)*cos((double)6*lat2);
+ mnl = aux05 - aux06 + aux07- aux08;
+
+ // ma calculation
+ ma = mn/Prd;
+
+ aux09 = (A*(C*ma+1)-ma)-(0.5*(ma*ma+B)*C);
+ aux10 = equad*sin((double)2*lat2)*(ma*ma+B-2.*A*ma);
+ aux11 = 4.*C+(A-ma);
+ aux12 = C*mnl-(2./sin((double)2*lat2));
+
+ // New latitude calculation
+ lat1 = lat2 - (aux09/((aux10/(aux11*aux12)) - mnl));
+ cp = fabs(lat1-lat2) ;
+ lat2 = lat1;
+
+
+ }while(cp > 0.0000000001);
+
+ ptpcy = lat1;
+ ptpcx = ((asin((ptpcx*C)/Prd))/(sin(lat1))) + GPlon0;
+ }
+
+ if( GPdestination && !(datum() == GPdestination->datum()))
+ ChangeLL(ptpcx,ptpcy);
+
+ return (TeCoord2D(ptpcx,ptpcy));
+
+}
+
+/********************************************************************
+ GEODETIC TO LAT LONG
+********************************************************************/
+TeCoord2D
+TeLatLong :: LL2PC (TeCoord2D& ptll)
+{
+ return TeCoord2D( ptll.x()*TeCRD, ptll.y()*TeCRD );
+}
+
+
+/********************************************************************
+ LAT LONG TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeLatLong :: PC2LL (TeCoord2D& ptpc)
+{
+ double ptpcx, ptpcy;
+
+ ptpcx = ptpc.x()*TeCDR;
+ ptpcy = ptpc.y()*TeCDR;
+
+ if( GPdestination && !(datum() == GPdestination->datum()))
+ ChangeLL(ptpcx,ptpcy);
+
+ return TeCoord2D(ptpcx,ptpcy);
+}
+
+
+
+/********************************************************************
+ GEODETIC TO ALBERS EQUAL-AREA COORDINATES
+********************************************************************/
+TeCoord2D
+TeAlbers :: LL2PC (TeCoord2D& ptll)
+{
+
+ double equad, // Squared eccentricity
+ e, // Ancillary variables
+ m1,m2,aux1,aux10,aux11,aux12,aux2,aux20,aux21,
+ aux22,q0,q1,q2,q,n,c,ro0,teta,ro,ptllx,ptlly;
+
+ double Pflt = GPdatum.flattening();
+ double Prd = GPdatum.radius();
+
+ ptllx = (double)ptll.x();
+ ptlly = (double)ptll.y();
+
+ equad = 2.*Pflt - pow(Pflt,(double)2);
+ e = sqrt(equad);
+
+ m1 = cos(GPstlat1)/sqrt((double)1-equad*pow(sin(GPstlat1),(double)2));
+ m2 = cos(GPstlat2)/sqrt((double)1-equad*pow(sin(GPstlat2),(double)2));
+ aux1 = sin(ptlly)/((double)1-equad*pow(sin(ptlly),(double)2));
+ aux10 = sin(GPlat0)/((double)1-equad*pow(sin(GPlat0),(double)2));
+ aux11 = sin(GPstlat1)/((double)1-equad*pow(sin(GPstlat1),(double)2));
+ aux12 = sin(GPstlat2)/((double)1-equad*pow(sin(GPstlat2),(double)2));
+ aux2 = log((1. - e*sin(ptlly))/(1. + e*sin(ptlly)));
+ aux20 = log((1. - e*sin(GPlat0))/(1. + e*sin(GPlat0)));
+ aux21 = log((1. - e*sin(GPstlat1))/(1. + e*sin(GPstlat1)));
+ aux22 = log((1. - e*sin(GPstlat2))/(1. + e*sin(GPstlat2)));
+ q0 = (1. - equad)*(aux10 - (1./(2.*e))*aux20);
+ q1 = (1. - equad)*(aux11 - (1./(2.*e))*aux21);
+ q2 = (1. - equad)*(aux12 - (1./(2.*e))*aux22);
+ q = (1. - equad)*(aux1 - (1./(2.*e))*aux2);
+ n = (m1*m1 - m2*m2)/(q2 - q1);
+ c = m1*m1 + n*q1;
+ ro0 = Prd*sqrt(c - n*q0)/n;
+ teta = n*(ptllx - GPlon0);
+ ro = Prd*sqrt(c - n*q)/n;
+
+ ptllx = ro*sin(teta);
+ ptlly = ro0 - ro*cos(teta);
+
+ return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));
+}
+
+
+/********************************************************************
+ ALBERS EQUAL-AREA TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeAlbers :: PC2LL(TeCoord2D& ptpc)
+{
+
+ double equad, // Squared eccentricity
+ e, // Eccentricity
+ m1, // Ancillary variable
+ m2,aux10,aux11,aux12,aux20,aux21,aux22,q0,q1,q2,
+ n,c,ro0,ro,q,aux,beta,aux1,aux2,aux3,teta,ptpcx,ptpcy;
+
+ int sinal; // Ancillary variable
+
+
+ double Pflt = GPdatum.flattening();
+ double Prd = GPdatum.radius();
+
+ ptpcx = ptpc.x()-GPoffx;
+ ptpcy = ptpc.y()-GPoffy;
+
+ sinal = (int)(GPstlat2/fabs(GPstlat2));
+ equad = 2.*Pflt - pow(Pflt,(double)2);
+ e = sqrt(equad);
+
+ m1 = cos(GPstlat1)/sqrt((double)1-equad*pow(sin(GPstlat1),(double)2));
+ m2 = cos(GPstlat2)/sqrt((double)1-equad*pow(sin(GPstlat2),(double)2));
+ aux10 = sin(GPlat0)/((double)1-equad*pow(sin(GPlat0),(double)2));
+ aux11 = sin(GPstlat1)/((double)1-equad*pow(sin(GPstlat1),(double)2));
+ aux12 = sin(GPstlat2)/((double)1-equad*pow(sin(GPstlat2),(double)2));
+ aux20 = log((1. - e*sin(GPlat0))/(1. + e*sin(GPlat0)));
+ aux21 = log((1. - e*sin(GPstlat1))/(1. + e*sin(GPstlat1)));
+ aux22 = log((1. - e*sin(GPstlat2))/(1. + e*sin(GPstlat2)));
+ q0 = (1. - equad)*(aux10 - (1./(2.*e))*aux20);
+ q1 = (1. - equad)*(aux11 - (1./(2.*e))*aux21);
+ q2 = (1. - equad)*(aux12 - (1./(2.*e))*aux22);
+ n = (m1*m1 - m2*m2)/(q2 - q1);
+ c = m1*m1 + n*q1;
+ ro0 = Prd*sqrt(c - n*q0)/n;
+ ro = sqrt(ptpcx*ptpcx + (ro0 - ptpcy)*(ro0 - ptpcy));
+ q = (c - (ro*ro*n*n/(Prd*Prd)))/n;
+ aux = ((1. - equad)/(2.*e))*log((1. - e)/(1. + e));
+ beta = asin(q/(1. - aux));
+ aux1 = (equad/3. + 31.*equad*equad/180.+517.*equad*equad*equad/5040.)*sin(2.*beta);
+ aux2 = (23.*equad*equad/360.+251.*equad*equad*equad/3780.)*sin(4.*beta);
+ aux3 = (761.*equad*equad*equad/45360.)*sin(6.*beta);
+ teta = fabs(atan(ptpcx/(ro0 - ptpcy)));
+
+ if (sinal == 1)
+ {
+ if (ptpcx < 0.)
+ teta = -teta;
+ }
+
+ if (sinal == -1)
+ {
+ if (ptpcx > 0.)
+ teta *= sinal;
+ }
+
+ ptpcy = beta + aux1 + aux2 + aux3;
+ ptpcx = GPlon0 + (teta/n);
+
+ if( GPdestination && !(datum() == GPdestination->datum()))
+ ChangeLL(ptpcx,ptpcy);
+
+ return (TeCoord2D(ptpcx,ptpcy));
+}
+
+/*******************************************************************
+ GEODETIC TO MILLER COORDINATES
+********************************************************************/
+TeCoord2D
+TeMiller :: LL2PC (TeCoord2D& ptll)
+{
+
+ double pi, // PI value
+ ptllx,ptlly; // Ancillary variables
+
+ int sinal; // Ancillary variables
+
+ double Prd = GPdatum.radius();
+
+ ptllx = (double)ptll.x();
+ ptlly = (double)ptll.y();
+
+ pi = 4.*atan((double)1);
+ sinal = (int)(fabs(ptlly)/ptlly);
+
+ ptllx = Prd*(ptllx - GPlon0);
+
+ if (sinal == 1)
+ ptlly = (Prd/0.8)*(log(tan(pi/4. + 0.4*ptlly)));
+ else
+ {
+ ptlly *= sinal;
+ ptlly = (Prd/0.8)*(log(tan(pi/4. + 0.4*ptlly)));
+ ptlly *= sinal;
+ }
+
+ return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));
+}
+
+
+/********************************************************************
+ MILLER TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeMiller :: PC2LL (TeCoord2D& ptpc)
+{
+
+ double e, // Neperian logarithm base
+ pi, // PI value
+ ptpcx,ptpcy; // Ancillary variables
+
+ int sinal; // Ancillary variable
+
+ double Prd = GPdatum.radius();
+
+ ptpcx = ptpc.x()-GPoffx;
+ ptpcy = ptpc.y()-GPoffy;
+
+ e = 2.718281828;
+ pi = 4.*atan((double)1);
+ sinal = (int)(fabs(ptpcy)/ptpcy);
+
+ ptpcx = GPlon0 + (ptpcx/Prd);
+
+ if (sinal == 1)
+ ptpcy = 2.5*atan(pow(e,(0.8*ptpcy/Prd)))-5.*pi/8.;
+ else
+ {
+ ptpcy *= sinal;
+ ptpcy = 2.5*atan(pow(e,(0.8*ptpcy/Prd))) - 5.*pi/8.;
+ ptpcy *= sinal;
+ }
+
+ if( GPdestination && !(datum() == GPdestination->datum()))
+ ChangeLL(ptpcx,ptpcy);
+
+ return(TeCoord2D(ptpcx,ptpcy));
+}
+
+
+/*******************************************************************
+ GEODETIC TO SINUSOIDAL COORDINATES
+********************************************************************/
+TeCoord2D
+TeSinusoidal :: LL2PC (TeCoord2D& ptll)
+{
+
+ double ptllx,ptlly; // Ancillary variables
+
+ double Prd = GPdatum.radius();
+
+ ptllx = (double)ptll.x();
+ ptlly = (double)ptll.y();
+
+ ptllx = Prd*(ptllx - GPlon0);
+ ptllx *= cos(ptlly);
+
+ ptlly = Prd*ptlly;
+
+ return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));
+}
+
+
+/********************************************************************
+ SINUSOIDAL TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeSinusoidal :: PC2LL (TeCoord2D& ptpc)
+{
+
+ double ptpcx,ptpcy; // Ancillary variables
+
+ double Prd = GPdatum.radius();
+
+ ptpcx = ptpc.x()-GPoffx;
+ ptpcy = ptpc.y()-GPoffy;
+
+ ptpcy = ptpcy/Prd;
+
+ ptpcx = GPlon0 + (ptpcx/(Prd*cos(ptpcy)));
+
+ if( GPdestination && !(datum() == GPdestination->datum()))
+ ChangeLL(ptpcx,ptpcy);
+
+ return(TeCoord2D(ptpcx,ptpcy));
+}
+
+/*******************************************************************
+ GEODETIC TO CYLINDRICAL EQUIDISTANT COORDINATES
+********************************************************************/
+TeCoord2D
+TeCylindricalEquidistant :: LL2PC (TeCoord2D& ptll)
+{
+ double ptllx,ptlly;
+
+ double Prd = GPdatum.radius();
+
+ ptllx = ptll.x();
+ ptlly = ptll.y();
+
+ ptllx = Prd*(ptllx - GPlon0)*cos(GPstlat1);
+ ptlly = Prd*ptlly;
+
+ return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));
+}
+
+
+/*******************************************************************
+ CYLINDRICAL EQUIDISTANT TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeCylindricalEquidistant :: PC2LL (TeCoord2D& ptpc)
+{
+ double ptpcx,ptpcy;
+
+ double Prd = GPdatum.radius();
+
+ ptpcx = ptpc.x()-GPoffx;
+ ptpcy = ptpc.y()-GPoffy;
+
+ ptpcy = ptpcy/Prd;
+ ptpcx = GPlon0 + ptpcx/(Prd*cos(GPstlat1));
+
+ if( GPdestination && !(datum() == GPdestination->datum()))
+ ChangeLL(ptpcx,ptpcy);
+
+ return (TeCoord2D(ptpcx,ptpcy));
+}
+
+/*******************************************************************
+ GEODETIC TO POLAR STEREOGRAPHIC COORDINATES
+********************************************************************/
+TeCoord2D
+TePolarStereographic :: LL2PC (TeCoord2D& ptll)
+{
+ double k0, // Scale factor
+ e, // Eccentricity
+ pi, // Auxillary variables
+ lon0, // auxilliary origin longitude
+ t,ro,aux1,aux2,aux3,ptllx,ptlly;
+
+ int GPhemis;
+ if (GPhemisphere == TeNORTH_HEM)
+ GPhemis = 1;
+ else
+ GPhemis = -1;
+
+ double Pflt = GPdatum.flattening();
+ double Prd = GPdatum.radius();
+
+ ptllx = ptll.x();
+ ptlly = ptll.y();
+
+ k0 = 0.933; // Standard parallel 60 degrees
+ e = sqrt((double)2*Pflt - pow(Pflt,(double)2));
+ pi = 4.*atan((double)1);
+
+ ptlly *= GPhemis;
+ ptllx *= GPhemis;
+ lon0 = (GPhemis == 1) ? GPlon0 : -GPlon0;
+
+ aux1 = (1. - e*sin(ptlly))/(1. + e*sin(ptlly));
+ t = tan((pi/4.) - (ptlly/2.))/pow(aux1,(e/(double)2));
+ aux2 = pow(((double)1 + e),((double)1 + e));
+ aux3 = pow(((double)1 - e),((double)1 - e));
+ ro = 2.*Prd*k0*t/sqrt(aux2*aux3);
+
+ aux1 = ro*sin(ptllx - lon0);
+ ptlly = -ro*cos(ptllx - lon0);
+ aux1 *= GPhemis;
+ ptlly *= GPhemis;
+
+ if (GPhemis == -1)
+ {
+ aux1 *= GPhemis;
+ ptlly *= GPhemis;
+ }
+// return(Point((float)aux1,(float)ptlly));
+ return (TeCoord2D(aux1+GPoffx,ptlly+GPoffy));
+
+}
+
+
+/*******************************************************************
+ POLAR STEREOGRAPHIC TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TePolarStereographic :: PC2LL (TeCoord2D& ptpc)
+{
+ double k0, // Scale factor
+
+ equad, // Squared eccentricity
+ e, // Eccentricity
+ pi, // Ancillary variables
+ lon0, // auxilliary origin longitude
+ ro,t,xx,aux1,aux2,aux3,aux4,aux5,ptpcx,ptpcy,px,py;
+
+ px = (double)ptpc.x()-GPoffx;
+ py = (double)ptpc.y()-GPoffy;
+
+ int GPhemis;
+ if (GPhemisphere == TeNORTH_HEM)
+ GPhemis = 1;
+ else
+ GPhemis = -1;
+
+ double Pflt = GPdatum.flattening();
+ double Prd = GPdatum.radius();
+
+// k0 = 0.994; // Standard parallel 80.1 degrees
+ k0 = 0.933; // Standard parallel 60 degrees
+ pi = 4.*atan((double)1);
+ equad = 2.*Pflt - pow(Pflt,(double)2);
+ e = sqrt(equad);
+
+ if (GPhemis == -1)
+ {
+ px *= GPhemis;
+ py *= GPhemis;
+ }
+
+ lon0 = (GPhemis == 1) ? GPlon0 : -GPlon0;
+
+ ro = sqrt(px*px + py*py);
+ aux1 = pow(((double)1 + e),((double)1 + e));
+ aux2 = pow(((double)1 - e),((double)1 - e));
+ t = (ro*sqrt(aux1*aux2))/(2.*Prd*k0);
+ xx = pi/2. - 2.*atan(t);
+ aux3 = equad/2. + 5.*equad*equad/24. + equad*equad*equad/12.;
+ aux4 = 7.*equad*equad/48. + 29.*equad*equad*equad/240.;
+ aux5 = 7.*equad*equad*equad/120.;
+
+ ptpcy = xx + aux3*sin((double)2*xx) + aux4*sin((double)4*xx) + aux5*sin((double)6*xx);
+
+ if (py != 0.)
+ ptpcx = lon0 + atan(px/(-py));
+
+
+ if (GPhemis == 1)
+ {
+ if (px > 0. && py > 0.)
+ ptpcx = ptpcx + pi;
+ else if (px < 0. && py > 0.)
+ ptpcx = ptpcx - pi;
+ else if (px > 0. && py == 0.)
+ ptpcx = lon0 + pi / 2.;
+ else if (px < 0. && py == 0.)
+ ptpcx = lon0 - pi / 2.;
+ else if (px == 0. && py == 0.)
+ ptpcx = lon0;
+ }
+ else
+ {
+ ptpcy *= GPhemis;
+ ptpcx *= GPhemis;
+
+ if (px > 0. && py < 0.)
+ ptpcx = ptpcx + pi;
+ else if (px < 0. && py < 0.)
+ ptpcx = ptpcx - pi;
+ else if (px > 0. && py == 0.)
+ ptpcx = lon0 + pi / 2.;
+ else if (px < 0. && py == 0.)
+ ptpcx = lon0 - pi / 2.;
+ else if (px == 0. && py == 0.)
+ ptpcx = lon0;
+ }
+
+ if (ptpcx < (-pi)) ptpcx += 2.*pi;
+ else if (ptpcx > pi) ptpcx -= 2.*pi;
+
+ if( GPdestination && !(datum() == GPdestination->datum()))
+ ChangeLL(ptpcx,ptpcy);
+
+ return (TeCoord2D(ptpcx,ptpcy));
+}
+
+TeProjection* TeGetTeProjectionFromSProj(const string& proj4)
+{
+
+ // a map from sproj4 projections to TerraLib projections
+ map<string,string> sprojToTeProj;
+ sprojToTeProj["aea"] = "Albers";
+ sprojToTeProj["latlong"] = "LatLong";
+ sprojToTeProj["lcc"] = "LambertConformal";
+ sprojToTeProj["merc"] = "Mercator";
+ sprojToTeProj["mill"] = "Miller";
+ sprojToTeProj["utm"] = "UTM";
+ sprojToTeProj["sinu"] = "Sinusoidal";
+ sprojToTeProj["poly"] = "Polyconic";
+ sprojToTeProj["eqc"] = "CylindricalEquidistant";
+ sprojToTeProj["ups"] = "PolarStereographic";
+
+ unsigned int pos;
+ string attribute;
+ string value;
+
+ TeProjectionParams par;
+ par.hemisphere = TeNORTH_HEM;
+ par.offx = 500000;
+ par.offy = 0;
+ par.units = "";
+ TeDatum dat("UserDefined");
+
+ for(unsigned int i = 0; i < proj4.size(); i++)
+ {
+ for( pos = i; i != proj4.size() && proj4[i] != '=';i++);
+
+ attribute = proj4.substr(pos+1, i-pos-1);
+
+ for(pos = i; i != proj4.size() && proj4[i] != ' ';i++);
+
+ if(proj4[i] == ' ') value = proj4.substr(pos+1, i-pos-1);
+ else value = proj4.substr(pos+1, i-pos);
+
+ if(attribute == "proj")
+ {
+ map<string,string>::iterator it = sprojToTeProj.find(value);
+ if (it != sprojToTeProj.end())
+ par.name = sprojToTeProj[value];
+ else
+ par.name = "NoProjection";
+ }
+ // Currently this routine understands the following parameters from
+ // a sproj description: lon_0, lat_0, lat_1, lat_2, k, zone, x_0, y_0
+
+ else if(attribute == "lon_0")
+ par.lon0 = atof(value.c_str())*TeCDR;
+ else if(attribute == "lat_0")
+ par.lat0 = atof(value.c_str())*TeCDR;
+ else if(attribute == "lat_1")
+ par.stlat1 = atof(value.c_str())*TeCDR;
+ else if(attribute == "lat_2")
+ par.stlat2 = atof(value.c_str())*TeCDR;
+ else if(attribute == "k")
+ par.scale = atof(value.c_str());
+ else if(attribute == "zone")
+ par.lon0 = (-183 + 6*(atoi(value.c_str()))*TeCDR);
+ else if (attribute == "south")
+ {
+ par.hemisphere = TeSOUTH_HEM;
+ par.offy = 10000000;
+ }
+ else if(attribute == "x_0")
+ par.offx = atof(value.c_str());
+ else if(attribute == "y_0")
+ par.offy = atof(value.c_str());
+ else if (attribute == "units")
+ par.units = value;
+ // Datum parameters
+ else if(attribute == "R") // radius for a spherical ellipsoid
+ dat = TeDatum("Spherical",atof(value.c_str()));
+ else if(attribute == "a") // Earth equatorial radius
+ dat.radius(atof(value.c_str()));
+ else if(attribute == "f") // Earth flattening
+ dat.flattening(atof(value.c_str()));
+ else if(attribute == "rf") // Earth reverse flattening (f = 1/rf)
+ dat.flattening(1/atof(value.c_str()));
+ else if (attribute == "es") // eccentricity squared (f=1-(1-es)^0.5)
+ dat.flattening(1-sqrt(1-atof(value.c_str())));
+ else if (attribute == "e") // eccentricity (f=1-(1-es^2)^0.5)
+ dat.flattening(1-sqrt(1-pow(atof(value.c_str()),2)));
+
+// TODO: sproj4 also allowd the selection of standard, predefined
+// ellipsoid figures using the option +ellps=acronym. But we are not decoding
+// them yet...
+ }
+ par.datum = dat;
+ return TeProjectionFactory::make(par);
+}
+
+string TeGetSProjFromTeProjection(TeProjection* teproj)
+{
+ map<string,string> teProjToSProj;
+ teProjToSProj["Albers"] = "aea";
+ teProjToSProj["LatLong"] = "latlong";
+ teProjToSProj["LambertConformal"] = "lcc";
+ teProjToSProj["Mercator"] = "merc";
+ teProjToSProj["Miller"] = "mill";
+ teProjToSProj["UTM"] = "utm";
+ teProjToSProj["Sinusoidal"] = "sinu";
+ teProjToSProj["Polyconic"] = "poly";
+ teProjToSProj["CylindricalEquidistant"] = "eqc";
+ teProjToSProj["PolarStereographic"] = "ups";
+
+ string sresp = "+proj=";
+ map<string,string>::iterator it = teProjToSProj.find(teproj->name());
+ if (it == teProjToSProj.end())
+ {
+ sresp += "noprojection";
+ return sresp;
+ }
+ else
+ sresp += it->second;
+
+ TeProjInfo pjInfo = TeProjectionInfo(teproj->name());
+ if ( pjInfo.hasLon0 )
+ sresp += " +lon_0=" + Te2String(teproj->lon0()*TeCRD,6);
+
+ if ( pjInfo.hasLat0 )
+ sresp += " +lat_0=" + Te2String(teproj->lat0()*TeCRD,6);
+
+ if ( pjInfo.hasStlat1 )
+ sresp += " +lat_1=" + Te2String(teproj->stLat1()*TeCRD,6);
+
+ if ( pjInfo.hasStlat2 )
+ sresp += " +lat_2=" +Te2String(teproj->stLat2()*TeCRD,6);
+
+ if (teproj->name() == "UTM" && teproj->hemisphere() == TeSOUTH_HEM)
+ sresp += " +south";
+ else
+ {
+ if ( pjInfo.hasOffx )
+ sresp += " +x_0=" + Te2String(teproj->offX(),6);
+ if ( pjInfo.hasOffy )
+ sresp += " +y_0=" + Te2String(teproj->offY(),6);
+ }
+
+ if ( pjInfo.hasScale )
+ sresp += " +k=" + Te2String(teproj->scale(),6);
+
+ if (teproj->datum().name() == "Spherical")
+ sresp += " +R=" + Te2String(teproj->datum().radius(),6);
+ else
+ {
+ sresp += " +a=" + Te2String(teproj->datum().radius(),6);
+ sresp += " +f=" + Te2String(teproj->datum().flattening(),6);
+ }
+ return sresp;
+}
diff --git a/src/terralib/kernel/TeProjection.h b/src/terralib/kernel/TeProjection.h
new file mode 100644
index 0000000..4f35673
--- /dev/null
+++ b/src/terralib/kernel/TeProjection.h
@@ -0,0 +1,700 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeProjection.h
+ This file contains support do deal with geographical projections
+*/
+
+#ifndef __TERRALIB_INTERNAL_PROJECTION_H
+#define __TERRALIB_INTERNAL_PROJECTION_H
+
+#include "TeCoord2D.h"
+#include "TeDefines.h"
+#include "TeDatum.h"
+#include <stdio.h>
+#include <map>
+#include <string>
+
+using namespace std;
+
+//! Earth hemispheres
+enum TeHemisphere
+{ TeNORTH_HEM, TeSOUTH_HEM };
+
+//! Number of supported projections in TerraLib
+const int NUM_PROJ = 11;
+
+//! Set of informations required by projections
+struct TeProjInfo
+{
+ int hasUnits;
+ int hasLon0;
+ int hasLat0;
+ int hasStlat1;
+ int hasStlat2;
+ int hasScale;
+ int hasOffx;
+ int hasOffy;
+};
+
+//! A map from name of projections to a set of informations that it requires
+typedef map<string,TeProjInfo> TeProjInfoMap;
+
+//! Returns the set of informations required by a given projection
+TeProjInfo TeProjectionInfo ( const string& projName );
+
+// ============ PROJECTION PARAMETERS ===============
+
+class TeProjection;
+
+//! Set of parameters that define a geographical projection
+struct TeProjectionParams
+{
+ string name; //!< projection name
+ TeDatum datum; //!< spheroid
+ double lon0; //!< Longitude of origin (rad)
+ double lat0; //!< Latitude of origin (rad)
+ double offx; //!< X (projection coordinate) offset (m)
+ double offy; //!< Y (projection coordinate) offset (m)
+ double stlat1; //!< First standard parallel (rad)
+ double stlat2; //!< Second standard paralel ( rad)
+ string units; //!< units
+ double scale; //!< projection scale (used in UTM)
+ TeHemisphere hemisphere; //!< Hemisphere
+};
+
+//========== PROJECTION FACTORY
+//! A factory of projections
+class TeProjectionFactory
+{
+public:
+ static TeProjection* make( const TeProjectionParams& );
+};
+
+//! Provides methods that are required to handle all map projection definitions and georeferencing of satellite images.
+/*!
+ Specifies earth and projection parameters that represent a common
+ ground in terms of defining conventional map projections, navigating
+ on low-resolution images of geostationary satellites.
+*/
+class TeProjection
+{
+protected:
+ string GPname; // projection name
+ TeDatum GPdatum; // spheroid
+ double GPlon0; // Longitude of origin (rad)
+ double GPlat0; // Latitude of origin (rad)
+ double GPoffx; // X (projection coordinate) offset (m)
+ double GPoffy; // Y (projection coordinate) offset (m)
+ double GPstlat1; // First standard parallel (rad)
+ double GPstlat2; // Second standard parallel (rad)
+ string GPunits; // units
+ double GPscale; // scale (used for UTM)
+ TeHemisphere GPhemisphere; // Hemisphere
+ TeProjection* GPdestination; // destination projection
+ int GPid; // id
+
+ //! Changes planimetic datum
+ /*! Computes changes in geodetic coordinates due to
+ planimetric datum changes. First, the method finds
+ geocentric cartesian coordinates on the initial datum,
+ then applies datum shifts, and finally computes the
+ new geodetic coordinates on the final datum. The new
+ geodetic latitude is computed iteractively, the old
+ geodetic latitude being used as initial guess.
+
+ \param x Initial longitude (rad);
+ \param y Initial latitude (rad).
+ \return x Final longitude (rad);
+ \return y Final latitude (rad).
+
+ \note
+ x must be a valid longitude ([0,pi] or [0,-pi]) and
+ y must be a valid latitude ([0,pi/2] or [0,-pi/2]).
+ */
+ void ChangeLL (double &x, double &y);
+
+public:
+
+ //! Normal constructor
+ /*!
+ Initializes projection parameters
+ \param name projection name
+ \param datum spheroid
+ \param lon0 longitude of origin (in radians)
+ \param lat0 latitude of origin (in radians)
+ \param offx X (projection coordinate) offset (m)
+ \param offy Y (projection coordinate) offset (m)
+ \param stlat1 first standard parallel (in radians)
+ \param stlat2 second standard parallel (in radians)
+ \param units projection unit
+ \param scale scale (used for UTM)
+ \param hem hemisphere
+ */
+ TeProjection ( const string& name, const TeDatum& datum,
+ double lon0 = 0., double lat0=0., double offx = 0., double offy = 0.,
+ double stlat1 = 0., double stlat2 = 0.,
+ const string units = "Meters",
+ double scale = 1., TeHemisphere hem = TeSOUTH_HEM):
+ GPname ( name ),
+ GPdatum ( datum ),
+ GPlon0 ( lon0 ),
+ GPlat0 ( lat0 ),
+ GPoffx ( offx ),
+ GPoffy ( offy ),
+ GPstlat1 ( stlat1 ),
+ GPstlat2 ( stlat2 ),
+ GPunits ( units ),
+ GPscale ( scale ),
+ GPhemisphere ( hem ),
+ GPdestination (0),
+ GPid(0)
+ {}
+
+ TeProjection ():
+ GPname ( "NoProjection" ),
+ GPlon0 ( 0. ),
+ GPlat0 ( 0. ),
+ GPoffx ( 0. ),
+ GPoffy ( 0. ),
+ GPstlat1 ( 0. ),
+ GPstlat2 ( 0. ),
+ GPunits ( "Units" ),
+ GPscale ( 1 ),
+ GPhemisphere ( TeSOUTH_HEM ),
+ GPdestination (0),
+ GPid(0)
+ {}
+
+ //! Copy Constructor
+ TeProjection(const TeProjection&);
+
+ //! Operator =
+ TeProjection& operator=(const TeProjection&);
+
+ //! Destructor.
+ virtual ~TeProjection (){}
+
+ //! Returns the projection name;
+ string name()
+ { return GPname; }
+
+ //! Returns the projection datum
+ TeDatum datum()
+ { return GPdatum; }
+
+ //! Return the projection units
+ string units()
+ { return GPunits; }
+
+ //! Return the longitude of origin ( in rad)
+ double lon0() { return GPlon0; }
+
+ //! Return the Latitude of origin (rad)
+ double lat0() { return GPlat0; }
+
+ //! Return X (projection coordinate) offset (m)
+ double offX() { return GPoffx; }
+
+ //! Return Y (projection coordinate) offset (m)
+ double offY() { return GPoffy; }
+
+ //! Return First standard parallel (rad)
+ double stLat1() { return GPstlat1; }
+
+ //! Return the second standard parallel (rad)
+ double stLat2() { return GPstlat2; }
+
+ //! Return the scale (used for UTM)
+ double scale() { return GPscale; }
+
+ //! Return the Hemisphere
+ TeHemisphere hemisphere() { return GPhemisphere; }
+
+ // Returns a the parameters of this projection
+ TeProjectionParams params ();
+
+ bool operator== (const TeProjection& proj);
+
+ //! Pure virtual method that transforms geodetic into projection coordinates
+ /*!
+ This method is implemented for each available
+ projection class and represents the so-called
+ direct formulas, which compute projection
+ coordinates from geodetic coordinates.
+
+ \param p Geodetic coordinates (radian).
+ \return p Projection coordinates (m).
+ \note
+ Geodetic coordinates must be a valid latitude
+ ([0,pi/2] or [0,-pi/2]) and a valid longitude
+ ([0,pi] or [0,-pi]).
+ */
+ virtual TeCoord2D LL2PC (TeCoord2D& p) = 0;
+
+ //! Pure virtual method that transforms projection into geodetic coordinates.
+ /*!
+ This method is implemented for each available
+ projection class and represents the so-called
+ inverse formulas, which compute geodetic
+ coordinates from projection coordinates.
+ \param p Projection coordinates (m).
+ \return p Geodetic coordinates (rad).
+ \note X and Y projection coordinates must be both valid,
+ within the typical range of each projection class.
+ */
+ virtual TeCoord2D PC2LL (TeCoord2D& p) = 0;
+
+ //! Sets the projection to which a Latitude/Longitude value will be generated by the current projection by calling changeLL in PC2LL method
+ void setDestinationProjection (TeProjection* proj)
+ { GPdestination = proj; }
+
+ //! Concrete method that prints information about a projection
+ void print ( FILE* file_ );
+
+ //! Concrete method that prints information about a projection in a string
+ string describe ();
+
+ //! Get projection unique id in the database
+ int id() { return GPid;}
+
+ //! Set projection unique id in the database
+ void id(int i) { GPid = i;}
+};
+
+
+//! Provides methods that are required to handle the UTM map projection.
+/*!
+ Specifies methods that are necessary to establish the relation between
+ geodetic and UTM coordinates. UTM is a conformal projection system that
+ uses the planimetric datum Sad69 or Corrego Alegre (Hayford ellipsoid).
+
+ \sa TeCoord2D TeDatum TeProjection.
+*/
+class TeUtm : public TeProjection
+{
+public:
+
+ //! Constructor
+ /*!
+ Initializes projection parameters
+ \param datum spheroid
+ \param long0 longitude of origin (in radians)
+ \param lat0 latitude of origin (in radians)
+ \param offx X (projection coordinate) offset (m)
+ \param offy Y (projection coordinate) offset (m)
+ \param units projection unit
+ \param scale scale (used for UTM)
+ \param hemisphere hemisphere
+ */
+ TeUtm ( const TeDatum& datum, double long0, double lat0 = 0.,
+ double offx = 500000., double offy = 10000000.,
+ const string& units = "Meters",
+ double scale = 0.9996, TeHemisphere hemisphere = TeSOUTH_HEM ):
+ TeProjection ( "UTM", datum, long0, lat0, offx, offy, 0., 0., units, scale,
+ hemisphere)
+
+ {
+ if ( hemisphere == TeNORTH_HEM )
+ GPoffy = 0.;
+ }
+
+ //! Destructor
+ ~TeUtm () {}
+
+ //! This implementation of a pure virtual method defined in Projection transforms geodetic into UTM coordinates.
+ /*!
+ \param p Geodetic coordinates (rad).
+ \return p: UTM coordinates (m).
+ \note
+ Geodetic coordinates must be a valid latitude
+ ([0,pi/2] or [0,-pi/2]) and a valid longitude
+ ([0,pi] or [0,-pi]). Conventional UTM offsets
+ (500,000 m and 10,000,000 m) are always added
+ to the resulting projection coordinates.
+ */
+ virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+ //! This implementation of a pure virtual method defined in
+ /* Projection transforms UTM into geodetic coordinates.
+ \param p: UTM coordinates (m).
+ \return p: Geodetic coordinates (rad).
+ \note
+ X and Y UTM coordinates must be both valid, within
+ their typical range. Conventional UTM offsets are
+ handled in this method, and therefore must not be
+ previously subtracted.
+ */
+ virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+//! Provides methods that are required to handle Lambert conformal conic map projection..
+/*!
+ Specifies methods that are necessary to establish the relation between
+ geodetic and Lambert conformal conic coordinates.
+ \sa TeCoord2D TeDatum TeProjection.
+*/
+class TeLambertConformal : public TeProjection
+{
+public :
+ //! Constructor
+ /*!
+ Initializes projection parameters
+ \param datum spheroid
+ \param long0 longitude of origin (in radians)
+ \param lat0 latitude of origin (in radians)
+ \param offx X (projection coordinate) offset (m)
+ \param offy Y (projection coordinate) offset (m)
+ \param stlat1 first standard parallel (in radians)
+ \param stlat2 second standard parallel (in radians)
+ \param units projection unit
+ */
+ TeLambertConformal ( const TeDatum& datum,
+ double long0,
+ double lat0,
+ double offx,
+ double offy,
+ double stlat1,
+ double stlat2,
+ const string& units = "Meters" ):
+ TeProjection ( "LambertConformal", datum, long0, lat0, offx, offy, stlat1, stlat2, units)
+ {}
+
+ //! Destructor
+ ~TeLambertConformal () {}
+
+
+ virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+ virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+//! Provides methods that are required to handle the Mercator map projection.
+/*!
+ Specifies methods that are necessary to establish the relation between
+ geodetic and Mercator coordinates.
+*/
+class TeMercator : public TeProjection
+{
+
+public:
+ //! Constructor
+ /*!
+ Initializes projection parameters
+ \param datum spheroid
+ \param long0 longitude of origin (in radians)
+ \param lat0 latitude of origin (in radians)
+ \param offx X (projection coordinate) offset (m)
+ \param offy Y (projection coordinate) offset (m)
+ \param stlat1 first standard parallel (in radians)
+ \param units projection unit
+ */
+ TeMercator ( const TeDatum& datum,
+ double long0,
+ double lat0 = 0.,
+ double offx = 0.,
+ double offy = 0.,
+ double stlat1 = 0.,
+ const string& units = "Meters"):
+ TeProjection ( "Mercator", datum, long0, lat0, offx, offy, stlat1, 0., units )
+ {}
+
+ //! Destructor
+ ~TeMercator () {}
+
+ virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+ virtual TeCoord2D PC2LL(TeCoord2D& p);
+
+};
+
+
+
+//! Provides methods that are required to handle the Polyconic map projection.
+/*!
+ Specifies methods that are necessary to establish the relation between
+ geodetic and Polyconic coordinates. Polyconic is a projection system that
+ is neither conformal nor equal-area.
+*/
+class TePolyconic : public TeProjection
+{
+
+public:
+ //! Constructor
+ /*!
+ Initializes projection parameters
+ \param datum spheroid
+ \param long0 longitude of origin (in radians)
+ \param lat0 latitude of origin (in radians)
+ \param offx X (projection coordinate) offset (m)
+ \param offy Y (projection coordinate) offset (m)
+ \param units projection unit
+ */
+ TePolyconic (const TeDatum& datum,
+ double long0,
+ double lat0 = 0.,
+ double offx = 0.,
+ double offy = 0.,
+ const string& units = "Meters"):
+ TeProjection ( "Polyconic", datum, long0, lat0, offx, offy, 0., 0., units )
+ {}
+
+ //! Destructor
+ ~TePolyconic () {}
+
+
+ virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+ virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+//! Provides methods that are required to handle the Equidistant Cylindrical map projection.
+class TeLatLong : public TeProjection
+{
+
+public :
+ //! Constructor
+ /*!
+ Initializes projection parameters
+ \param datum spheroid
+ \param units projection unit
+ */
+ TeLatLong( const TeDatum& datum, const string& units = "DecimalDegrees" ):
+ TeProjection ( "LatLong", datum, 0., 0., 0., 0., 0., 0., units )
+ {}
+
+ //! Destructor
+ ~TeLatLong () {}
+
+ //! Returns the same coordinate
+ virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+ //! Returns the same coordinate
+ virtual TeCoord2D PC2LL(TeCoord2D& p);
+
+};
+
+//! Provides methods that are required to handle the Albers Conic map projection.
+/*
+ Specifies methods that are necessary to establish the relation between
+ geodetic and Albers Conic coordinates. Albers Conic is an equal-area
+ projection system.
+*/
+class TeAlbers : public TeProjection
+{
+
+public:
+ //! Constructor
+ /*!
+ Initializes projection parameters
+ \param datum spheroid
+ \param lon0 longitude of origin (in radians)
+ \param lat0 latitude of origin (in radians)
+ \param offx X (projection coordinate) offset (m)
+ \param offy Y (projection coordinate) offset (m)
+ \param stlat1 first standard parallel (in radians)
+ \param stlat2 second standard parallel (in radians)
+ \param units projection unit
+ */
+ TeAlbers( const TeDatum& datum,
+ double lon0,
+ double lat0,
+ double offx,
+ double offy,
+ double stlat1,
+ double stlat2,
+ const string& units = "Meters" ):
+ TeProjection ( "Albers", datum, lon0, lat0, offx, offy, stlat1, stlat2, units )
+ {}
+
+ //! Destructor
+ ~TeAlbers () { }
+
+ virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+ virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+//! Provides methods that are required to handle the Miller map projection.
+/*!
+ Specifies methods that are necessary to establish the relation between
+ geodetic and Miller coordinates. Miller is a projection system that
+ is neither conformal nor equal-area."
+*/
+class TeMiller : public TeProjection
+{
+
+public:
+ //! Constructor
+ /*!
+ Initializes projection parameters
+ \param datum spheroid
+ \param long0 longitude of origin (in radians)
+ \param offx X (projection coordinate) offset (m)
+ \param offy Y (projection coordinate) offset (m)
+ \param units projection unit
+ */
+ TeMiller ( const TeDatum& datum,
+ double long0,
+ double offx = 0.,
+ double offy = 0.,
+ const string& units = "Meters"):
+ TeProjection ( "Miller", datum, long0, 0., offx, offy, 0., 0., units )
+ {}
+
+ //! Destructor
+ ~TeMiller () {}
+
+ virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+ virtual TeCoord2D PC2LL(TeCoord2D& p);
+
+};
+
+//! Provides methods that are required to handle the Sinusoidal map projection.
+/*!
+ Specifies methods that are necessary to establish the relation between
+ geodetic and Sinusoidal coordinates. Sinusoidal is a projection system that
+ is equal-area. Being not an interrupted form,
+ this implementation assumes a single central meridian. Spheroid options
+ can be redefined by editing the file "TeDatum.cpp"
+*/
+class TeSinusoidal : public TeProjection
+{
+
+public:
+
+//! Constructor.
+ /*!
+ Initializes projection parameters
+ \param datum spheroid
+ \param long0 longitude of origin (in radians)
+ \param offx X (projection coordinate) offset (m)
+ \param offy Y (projection coordinate) offset (m)
+ \param units projection unit
+ */
+ TeSinusoidal (const TeDatum& datum,
+ double long0,
+ double offx = 0.,
+ double offy = 0.,
+ const string& units = "Meters"):
+ TeProjection ( "Sinusoidal", datum, long0, 0., offx, offy, 0., 0., units )
+ {}
+
+//! Empty destructor.
+ ~TeSinusoidal () {}
+
+ virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+ virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+//! Provides methods that are required to handle the Cylindrical Equidistant map projection
+class TeCylindricalEquidistant : public TeProjection
+{
+public:
+
+//! Constructor.
+ /*!
+ Initializes projection parameters
+ \param datum spheroid
+ \param lon0 longitude of origin (in radians)
+ \param offx X (projection coordinate) offset (m)
+ \param offy Y (projection coordinate) offset (m)
+ \param stlat1 first standard parallel (in radians)
+ \param units projection unit
+ */
+ TeCylindricalEquidistant (const TeDatum& datum,
+ double lon0,
+ double offx = 0.,
+ double offy = 0.,
+ double stlat1 = 0.,
+ const string& units = "Meters"):
+ TeProjection ( "CylindricalEquidistant", datum, lon0, 0., offx, offy, stlat1, 0,units)
+ {}
+//! Empty destructor.
+ ~TeCylindricalEquidistant () {}
+
+ virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+ virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+//! Provides methods that are required to handle the Polar Stereographic map projection
+class TePolarStereographic : public TeProjection
+{
+public:
+ //! Constructor
+ /*!
+ Initializes projection parameters
+ \param datum spheroid
+ \param lon0 longitude of origin (in radians)
+ \param offx X (projection coordinate) offset (m)
+ \param offy Y (projection coordinate) offset (m)
+ \param units projection unit
+ \param hem hemisphere
+ */
+ TePolarStereographic ( const TeDatum& datum,
+ double lon0,
+ double offx = 0.,
+ double offy = 0.,
+ const string& units = "Meters",
+ const TeHemisphere hem = TeSOUTH_HEM ):
+ TeProjection ( "PolarStereographic", datum, lon0, 0., offx, offy, 0, 0, units, 1, hem )
+ {}
+
+ //! Destructor
+ ~TePolarStereographic () {}
+
+ virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+ virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+class TeNoProjection : public TeProjection
+{
+public:
+ TeNoProjection(const string& units = "Units")
+ { GPname = "NoProjection", GPunits = units; }
+
+ ~TeNoProjection () {}
+
+ virtual TeCoord2D LL2PC(TeCoord2D& p) { return p; }
+
+ virtual TeCoord2D PC2LL(TeCoord2D& p) {return p;};
+};
+
+bool decodifyDescription(const string& projDescription, TeProjectionParams& pars);
+
+TeProjection* TeGetTeProjectionFromSProj(const string& sproj4desc);
+
+string TeGetSProjFromTeProjection(TeProjection* teproj);
+
+/** \example ProjectionExample1.cpp
+ * This is an example of how to convert a coordinate from a projection to another
+ */
+
+
+#endif
+
+
diff --git a/src/terralib/kernel/TePrototype.h b/src/terralib/kernel/TePrototype.h
new file mode 100644
index 0000000..96de337
--- /dev/null
+++ b/src/terralib/kernel/TePrototype.h
@@ -0,0 +1,79 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef TePrototype_H
+#define TePrototype_H
+//! Implements a template for the "TePrototype" pattern.
+/*
+// The "factory" pattern is a technique for creating new
+// instances of objects which defines an abstract interface,
+// (represented by the "Make" module). The subclasses of
+// factory decide which class to instantiate.
+//
+// Each subclass of factory "registers" itself at compile time;
+// therefore, the addition of a new factory requires no change
+// the parent class. */
+template <class T>
+class TePrototype
+{
+public:
+
+ typedef TePrototype<T>* TePrototypePtr;
+
+// -- Normal Constructor
+
+ TePrototype ();
+ virtual ~TePrototype() {}
+
+// -- Virtual Constructor
+ static T* clone ();
+
+//! Builds a new type (should be implemented by descendants)
+ virtual T* build () = 0;
+
+private:
+ static TePrototypePtr instance_;
+};
+
+// Initialisation of static variable
+template <class T>
+typename TePrototype<T>::TePrototypePtr TePrototype<T>::instance_;
+
+// Constructor
+template <class T>
+TePrototype<T>::TePrototype()
+{
+ // Put the object in the factory dictionary
+ instance_ = this;
+}
+
+// Virtual Constructor
+template <class T>
+T*
+TePrototype<T>::clone ()
+{
+ return instance_->build();
+}
+
+#endif
+
diff --git a/src/terralib/kernel/TeProxMatrixConstructionStrategy.cpp b/src/terralib/kernel/TeProxMatrixConstructionStrategy.cpp
new file mode 100644
index 0000000..c79c901
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixConstructionStrategy.cpp
@@ -0,0 +1,1009 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "TeProxMatrixConstructionStrategy.h"
+#include "TeDatabase.h"
+#include "TeProgress.h"
+#include "TeSTElementSet.h"
+
+//////////////////////////////////////////////////////////////////////
+// Auxiliary Functions for construction strategies
+//////////////////////////////////////////////////////////////////////
+
+bool
+TeFindObjectCentroid (TeSTInstance& obj, TeGeomRep rep, TeCoord2D& p)
+{
+ if(rep == TePOLYGONS)
+ {
+ TePolygonSet pols;
+ if(obj.getGeometry (pols))
+ p = TeFindCentroid (pols);
+ else
+ return false;
+ }
+ else if (rep == TeLINES)
+ {
+ TeLineSet lines;
+ if(obj.getGeometry (lines))
+ p = TeFindCentroid (lines);
+ else
+ return false;
+ }
+ else if (rep == TePOINTS)
+ {
+ TePointSet points;
+ if(obj.getGeometry (points))
+ p = TeFindCentroid (points);
+ else
+ return false;
+ }
+ else if (rep == TeCELLS)
+ {
+ TeCellSet cells;
+ if(obj.getGeometry (cells))
+ p = TeFindCentroid (cells);
+ else
+ return false;
+ }
+ return true;
+}
+
+bool
+TeFindObjectsCentroid (TeSTElementSet* objects, const string& object_id, TeGeomRep rep, TeCoord2D& p)
+{
+ if(rep==TePOLYGONS)
+ {
+ TePolygonSet polygons;
+ if(objects->getGeometry (object_id, polygons))
+ p = TeFindCentroid (polygons);
+
+ }
+ else if (rep==TeLINES)
+ {
+ TeLineSet lines;
+ if(objects->getGeometry (object_id, lines))
+ p = TeFindCentroid (lines);
+ }
+ else if (rep==TePOINTS)
+ {
+ TePointSet points;
+ if(objects->getGeometry (object_id, points))
+ p = TeFindCentroid (points);
+
+ }
+ else if (rep==TeCELLS)
+ {
+ TeCellSet cells;
+ if(objects->getGeometry (object_id, cells))
+ p = TeFindCentroid (cells);
+ }
+ return true;
+}
+
+
+bool TeSelectEntryPoints (TeNodeSet entry_set, map<string, string> entry_geom_map, TeGraphNetwork* net,
+ double max_dist, TeSTElementSet* objects, TeGeomRep rep, TeProxMatrixImplementation* imp)
+{
+
+ // Compute minimum path for all the new nodes/geometries near the network
+ // and connect the ones close enough
+ TeNodeSet::iterator it_node1 = entry_set.begin();
+ while ( it_node1 != entry_set.end())
+ {
+ vector<double> minimum_path;
+ if (net->minimumPath ((*it_node1), entry_set, minimum_path))
+ {
+ int j = 0;
+ // Check maximum connection distance and connect selected objects
+ TeNodeSet::iterator it_node2 = entry_set.begin();
+ while ( it_node2 != entry_set.end())
+ {
+ // Get ids to simplify the code
+ string node1_id = (*it_node1).objectId(); // Created Node id, nearest point to Geom1
+ string node2_id = (*it_node2).objectId(); // Created Node id, nearest point to Geom1
+ string object1_id = entry_geom_map[node1_id]; // Input Geom1 id
+ string object2_id = entry_geom_map[node2_id]; // Input Geom2 id
+
+ // Check identity and maximum allowed distance through the network
+ if ((object1_id != object2_id) && (minimum_path[j] <= max_dist))
+ {
+ // Compute attributes and connect objects
+ TeProxMatrixAttributes attr;
+
+ TeCoord2D p1, p2;
+ if (!TeFindObjectsCentroid (objects, object1_id, rep, p1))
+ return false;
+
+ if (!TeFindObjectsCentroid (objects, object2_id, rep, p2))
+ return false;
+
+ // Local istance between input geometries
+ attr.CentroidDistance (TeDistance (p1, p2));
+
+ // Total distance from input geometries centroids to network
+ attr.NetworkObjectsDistance (TeDistance (p1, (*it_node1).location()) +
+ TeDistance (p2, (*it_node2).location()));
+
+ // Minimum path from the nodes relatives to the two geometries
+ attr.NetworkMinimumPath (minimum_path[j]);
+
+ imp->connectObjects (object1_id, object2_id, attr); // for networks, only one direction is connected
+ }
+ it_node2++;
+ j++;
+ }
+ }
+ it_node1++;
+ }
+ return true;
+}
+
+
+bool TeSelectEntryPoints2 (TeNodeSet entry_set1,
+ TeNodeSet entry_set2,
+ map<string, string> entry_geom_map,
+ TeGraphNetwork* net,
+ double max_dist,
+ TeSTElementSet* objects1,
+ TeGeomRep rep1,
+ TeSTElementSet* objects2,
+ TeGeomRep rep2,
+ TeProxMatrixImplementation* imp)
+{
+
+ // Compute minimum path for all the new nodes/geometries near the network
+ // and connect the ones close enough
+ TeNodeSet::iterator it_node1 = entry_set1.begin();
+ while ( it_node1 != entry_set1.end())
+ {
+ vector<double> minimum_path;
+ net->minimumPath ((*it_node1), entry_set2, minimum_path);
+ if (minimum_path.size() > 0)
+ {
+ int j = 0;
+ // Check maximum connection distance and connect selected objects
+ TeNodeSet::iterator it_node2 = entry_set2.begin();
+ while ( it_node2 != entry_set2.end())
+ {
+ // Get ids to simplify the code
+ string node1_id = (*it_node1).objectId(); // Created Node id, nearest point to Geom1
+ string node2_id = (*it_node2).objectId(); // Created Node id, nearest point to Geom1
+ string object1_id = entry_geom_map[node1_id]; // Input Geom1 id
+ string object2_id = entry_geom_map[node2_id]; // Input Geom2 id
+
+
+ // Check identity and maximum allowed distance through the network
+ if ((object1_id != object2_id) && (minimum_path[j] <= max_dist))
+ {
+
+ // Compute attributes and connect objects
+ TeProxMatrixAttributes attr;
+
+ TeCoord2D p1, p2;
+ if (!TeFindObjectsCentroid (objects1, object1_id, rep1, p1))
+ return false;
+
+ if (!TeFindObjectsCentroid (objects2, object2_id, rep2, p2))
+ return false;
+
+ // Local distance
+ attr.CentroidDistance (TeDistance (p1, p2));
+
+ // Total distance from input geometries centroids to network
+ attr.NetworkObjectsDistance (TeDistance (p1, (*it_node1).location()) +
+ TeDistance (p2, (*it_node2).location()));
+
+ // Minimum path from the nodes relatives to the two geometries
+ attr.NetworkMinimumPath (minimum_path[j]);
+
+ imp->connectObjects (object1_id, object2_id, attr); // for networks, only one direction is connected
+ }
+ it_node2++;
+ j++;
+ }
+ }
+ it_node1++;
+ }
+ return true;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// TeProxMatrixConstructionStrategy
+//////////////////////////////////////////////////////////////////////
+
+TeProxMatrixConstructionStrategy::TeProxMatrixConstructionStrategy() :
+ objects_(0),
+ geomRep_(TeGEOMETRYNONE),
+ type_("")
+ { }
+
+TeProxMatrixConstructionStrategy::TeProxMatrixConstructionStrategy(TeSTElementSet* objects, TeGeomRep geomRep, const string& type):
+ objects_(objects),
+ geomRep_(geomRep),
+ type_(type)
+ { }
+
+TeProxMatrixConstructionStrategy::TeProxMatrixConstructionStrategy (const TeProxMatrixConstructionStrategy& st)
+{
+ objects_ = st.objects_;
+ geomRep_ = st.geomRep_;
+ type_ = st.type_;
+}
+
+void
+TeProxMatrixConstructionStrategy::setSTObjects (TeSTElementSet* objects, TeGeomRep geomRep)
+{
+ objects_ = objects;
+ geomRep_ = geomRep;
+}
+
+TeSTElementSet*
+TeProxMatrixConstructionStrategy::objects()
+{
+ return objects_;
+}
+
+bool
+TeProxMatrixConstructionStrategy::IsEqual (const TeProxMatrixConstructionStrategy& other) const
+{
+ return ((type_==other.type_) &&
+ ((&objects_)==(&other.objects_)) &&
+ (geomRep_ == other.geomRep_));
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// TeProxMatrixLocalAdjacencyStrategy
+//////////////////////////////////////////////////////////////////////
+
+TeProxMatrixLocalAdjacencyStrategy::TeProxMatrixLocalAdjacencyStrategy (bool calcDistance) :
+ TeProxMatrixConstructionStrategy (0, TeGEOMETRYNONE, "LocalAdjacency"),
+ calcDistance_(calcDistance)
+ { }
+
+
+TeProxMatrixLocalAdjacencyStrategy::TeProxMatrixLocalAdjacencyStrategy (TeSTElementSet* objects, TeGeomRep geomRep, bool calcDistance):
+ TeProxMatrixConstructionStrategy (objects, geomRep, "LocalAdjacency"),
+ calcDistance_(calcDistance)
+ { }
+
+
+TeProxMatrixLocalAdjacencyStrategy::TeProxMatrixLocalAdjacencyStrategy (TeProxMatrixLocalAdjacencyStrategy& st):
+ TeProxMatrixConstructionStrategy (st)
+ {
+ calcDistance_ = st.calculateDistance();
+ }
+
+bool
+TeProxMatrixLocalAdjacencyStrategy::Construct (TeProxMatrixImplementation* imp)
+{
+ if (imp == 0)
+ return false;
+ int n = 0;
+
+ // Iterate over all selected objects, selecting their neighbours
+ TeSTElementSet::iterator itobj1 = objects_->begin();
+
+ TeDatabase* db = objects_->theme()->layer()->database();
+ if(!db)
+ return false;
+
+ string geomTable = objects_->theme()->layer()->tableName(geomRep_);
+ if(geomTable.empty())
+ return false;
+
+ //verify if the theme has collection
+ string collTable = "";
+ if(db->tableExist(objects_->theme()->collectionTable()))
+ collTable = objects_->theme()->collectionTable();
+
+ // ----- progress bar
+ int step = 0;
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(objects_->numElements());
+ // -----
+
+ TePrecision::instance().setPrecision(TeGetPrecision(objects_->theme()->layer()->projection()));
+
+ while ( itobj1 != objects_->end())
+ {
+ // Get object1 id and representation
+ string object_id1 = (*itobj1).objectId();
+ n++;
+
+ Keys IdsIn, IdsOut;
+ IdsIn.push_back(object_id1);
+
+ //spatial relation Touch
+ if(!db->spatialRelation(geomTable, geomRep_, IdsIn, IdsOut, TeINTERSECTS, collTable))
+ {
+ ++itobj1;
+ continue;
+ }
+
+ for(unsigned int i=0; i<IdsOut.size(); i++)
+ {
+ string object_id2 = IdsOut[i];
+
+ if ((object_id1 != object_id2) && (!imp->isConnected (object_id1,object_id2)) &&
+ (objects_->hasElement(object_id2)))
+ {
+ TeProxMatrixAttributes attr;
+
+ if(calcDistance_)
+ {
+
+ TeCoord2D p1, p2;
+ if (!TeFindObjectsCentroid (objects_, object_id1, geomRep_, p1))
+ return false;
+
+ if (!TeFindObjectsCentroid (objects_, object_id2, geomRep_, p2))
+ return false;
+
+ attr.CentroidDistance (TeDistance (p1, p2));
+ }
+
+ imp->connectObjects (object_id2, object_id1, attr);
+ imp->connectObjects (object_id1, object_id2, attr);
+ }
+
+ }
+ ++itobj1;
+
+
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ TeProgress::instance()->setProgress(step);
+ }
+ ++step;
+ }
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ return true;
+}
+
+
+TeProxMatrixLocalAdjacencyStrategy&
+TeProxMatrixLocalAdjacencyStrategy::operator= (const TeProxMatrixLocalAdjacencyStrategy& rhs)
+{
+ if ( this != &rhs )
+ {
+ type_ = rhs.type_;
+ objects_ = rhs.objects_;
+ geomRep_ = rhs.geomRep_;
+ }
+ return *this;
+}
+
+bool
+TeProxMatrixLocalAdjacencyStrategy::operator== (const TeProxMatrixLocalAdjacencyStrategy& rhs) const
+{
+ return (TeProxMatrixConstructionStrategy::IsEqual(rhs));
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// TeProxMatrixLocalDistanceStrategy
+//////////////////////////////////////////////////////////////////////
+
+TeProxMatrixLocalDistanceStrategy::TeProxMatrixLocalDistanceStrategy (double max_distance):
+ TeProxMatrixConstructionStrategy (0, TeGEOMETRYNONE, "LocalDistance"),
+ max_distance_ (max_distance)
+ { }
+
+
+TeProxMatrixLocalDistanceStrategy::TeProxMatrixLocalDistanceStrategy (TeSTElementSet* objects, TeGeomRep geomRep, double max_distance):
+ TeProxMatrixConstructionStrategy(objects, geomRep, "LocalDistance"),
+ max_distance_ (max_distance)
+ { }
+
+
+TeProxMatrixLocalDistanceStrategy::TeProxMatrixLocalDistanceStrategy (const TeProxMatrixLocalDistanceStrategy& st):
+ TeProxMatrixConstructionStrategy(st)
+{
+ max_distance_ = st.max_distance_;
+}
+
+bool
+TeProxMatrixLocalDistanceStrategy::Construct (TeProxMatrixImplementation* imp)
+{
+ if (imp == 0)
+ return false;
+
+ TeDatabase* db = objects_->theme()->layer()->database();
+ if(!db)
+ return false;
+
+ string geomTable = objects_->theme()->layer()->tableName(geomRep_);
+ if(geomTable.empty())
+ return true;
+
+ //verify if the theme has restriction
+ string collTable = "";
+ if(objects_->theme()->hasRestriction())
+ collTable = objects_->theme()->collectionTable();
+
+ // ----- progress bar
+ int step = 0;
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(objects_->numElements());
+ // -----
+
+ TeSTElementSet::iterator itobj1 = objects_->begin();
+ while ( itobj1 != objects_->end())
+ {
+ // Get object1 id and representation
+ string object_id1 = (*itobj1).objectId();
+
+ TeCoord2D p1;
+ if (!TeFindObjectCentroid ((*itobj1), geomRep_, p1))
+ return false;
+
+ KeysToDist result;
+
+ //within distance
+ if(!db->withinDistance(geomTable, geomRep_, p1, result, max_distance_, collTable))
+ {
+ ++itobj1;
+ continue;
+ }
+
+ KeysToDist::iterator it = result.begin();
+ while(it != result.end())
+ {
+ string object_id2 = it->first;
+
+ if ((object_id1 != object_id2) && (!imp->isConnected (object_id1,object_id2)) &&
+ (objects_->hasElement(object_id2)))
+ {
+ TeProxMatrixAttributes attr;
+ attr.CentroidDistance (it->second);
+ imp->connectObjects (object_id1, object_id2, attr);
+ imp->connectObjects (object_id2, object_id1, attr);
+ }
+
+ ++it;
+ }
+
+ if(TeProgress::instance())
+ {
+
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ TeProgress::instance()->setProgress(step);
+ }
+ ++step;
+ ++itobj1;
+ }
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ return true;
+}
+
+
+bool
+TeProxMatrixLocalDistanceStrategy::IsEqual (const TeProxMatrixConstructionStrategy& other) const
+{
+ return ((*this) == (TeProxMatrixLocalDistanceStrategy&) other);
+}
+
+bool
+TeProxMatrixLocalDistanceStrategy::operator== (const TeProxMatrixLocalDistanceStrategy& s) const
+{
+ return ( TeProxMatrixConstructionStrategy::IsEqual(s) &&
+ (max_distance_ == s.max_distance_));
+}
+
+TeProxMatrixLocalDistanceStrategy&
+TeProxMatrixLocalDistanceStrategy::operator= (const TeProxMatrixLocalDistanceStrategy& rhs)
+{
+ if ( this != &rhs )
+ {
+ type_ = rhs.type_;
+ objects_ = rhs.objects_;
+ geomRep_ = rhs.geomRep_;
+ max_distance_ = rhs.max_distance_;
+ }
+ return *this;
+}
+
+//////////////////////////////////////////////////////////////////////
+// TeProxMatrixClosedNetworkStrategy
+//////////////////////////////////////////////////////////////////////
+
+TeProxMatrixClosedNetworkStrategy::TeProxMatrixClosedNetworkStrategy (TeSTElementSet* objects,
+ TeGeomRep rep, double max_local_distance,
+ double max_net_distance, double max_connection_distance,
+ TeGraphNetwork* input_net) :
+ TeProxMatrixConstructionStrategy(objects, rep, "ClosedNetwork"),
+ max_local_distance_ (max_local_distance),
+ max_net_distance_ (max_net_distance),
+ max_connection_distance_ (max_connection_distance),
+ net_ (input_net)
+ { }
+
+
+
+TeProxMatrixClosedNetworkStrategy::TeProxMatrixClosedNetworkStrategy (const TeProxMatrixClosedNetworkStrategy& rhs) :
+ TeProxMatrixConstructionStrategy(rhs)
+{
+ max_local_distance_ = rhs.max_local_distance_;
+ max_net_distance_ = rhs.max_net_distance_;
+ max_connection_distance_ = rhs.max_connection_distance_;
+
+ TeGraphNetwork* n = new TeGraphNetwork();
+ *n = *rhs.net_;
+ net_ = n;
+}
+
+
+bool
+TeProxMatrixClosedNetworkStrategy::Construct (TeProxMatrixImplementation* imp)
+{
+ if (imp == 0) return false;
+
+ // Connect local neighbours, based on the Local Distance Strategy
+
+ TeProxMatrixLocalDistanceStrategy local(objects_, geomRep_, max_local_distance_);
+ local.Construct (imp);
+
+ // Connect neighbours through the network. The process is the following:
+ // 1. The nearest node (entry points) in the network for all the input geometries
+ // are computed;
+ // 2. If the distance from the geometry centroid to the entry point is smaller than the maximum allowed,
+ // create a new node in the network corresponding to this entry point.
+ // 3. Compute the minimum path among all these new nodes (entry points).
+ // 4. For each pair of entry points, if the minimum path distance is smaller than the
+ // maximum allowed, the corresponding geometries will be connected.
+
+ if (net_ == 0) return false;
+
+ map<string, string> entry_geom_map; // maps input geometries to network entry points
+ TeNodeSet entry_set; // entry points
+
+ // ----- progress bar
+ int step = 0;
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(objects_->numElements());
+ // -----
+
+ // Iterate over all objects and select the ones that are close enough to the network
+ TeSTElementSet::iterator itobj1 = objects_->begin();
+ while ( itobj1 != objects_->end())
+ {
+ // Get object1 id and representation
+ string object_id1 = (*itobj1).objectId();
+ TeCoord2D p1, p2;
+
+
+ int i = 0;
+ double min_distance = 0.;
+
+ net_->nearestNodePoint (p1, i, p2, min_distance);
+
+ TeNode node;
+ if ((min_distance <= max_net_distance_) && net_->getNode(i, node))
+ {
+ entry_geom_map[node.objectId()] = object_id1; // Associates geometry with closest net nodes
+ entry_set.add (node); // This set will be used as initial points in the shortest path algorithm
+ }
+
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ TeProgress::instance()->setProgress(step);
+ }
+ ++step;
+ ++itobj1;
+ }
+
+ TeSelectEntryPoints (entry_set, entry_geom_map, net_, max_connection_distance_, objects_, geomRep_, imp);
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ return true;
+}
+
+
+bool
+TeProxMatrixClosedNetworkStrategy::IsEqual (const TeProxMatrixConstructionStrategy& other) const
+{
+ return (*this == (TeProxMatrixClosedNetworkStrategy&) other);
+}
+
+TeProxMatrixClosedNetworkStrategy&
+TeProxMatrixClosedNetworkStrategy::operator= (const TeProxMatrixClosedNetworkStrategy& rhs)
+{
+ if (!(this==&rhs))
+ {
+ type_ = rhs.type_;
+ objects_ = rhs.objects_;
+ geomRep_ = rhs.geomRep_;
+ max_local_distance_ = rhs.max_local_distance_;
+ max_net_distance_ = rhs.max_net_distance_;
+ max_connection_distance_ = rhs.max_connection_distance_;
+
+ TeGraphNetwork* n = new TeGraphNetwork();
+ *n = *rhs.net_;
+ net_ = n;
+ }
+ return (*this);
+}
+
+
+bool
+TeProxMatrixClosedNetworkStrategy::operator== (const TeProxMatrixClosedNetworkStrategy& other) const
+{
+ return ( TeProxMatrixConstructionStrategy::IsEqual(other) &&
+ (max_local_distance_ == other.max_local_distance_) &&
+ (max_net_distance_ == other.max_net_distance_) &&
+ (max_connection_distance_ == other.max_connection_distance_));
+}
+
+//////////////////////////////////////////////////////////////////////
+// TeProxMatrixOpenNetworkStrategy
+//////////////////////////////////////////////////////////////////////
+
+TeProxMatrixOpenNetworkStrategy::TeProxMatrixOpenNetworkStrategy (TeSTElementSet* objects, TeGeomRep rep,
+ double max_local_distance,
+ double max_net_distance, double max_connetion_distance,
+ TeGraphNetwork* input_net) :
+ TeProxMatrixConstructionStrategy(objects, rep, "OpenNetwork"),
+ max_local_distance_ (max_local_distance),
+ max_net_distance_ (max_net_distance),
+ max_connection_distance_ (max_connetion_distance),
+ net_ (input_net)
+ { }
+
+
+TeProxMatrixOpenNetworkStrategy::TeProxMatrixOpenNetworkStrategy (const TeProxMatrixOpenNetworkStrategy& rhs):
+ TeProxMatrixConstructionStrategy(rhs)
+{
+ max_local_distance_ = rhs.max_local_distance_;
+ max_net_distance_ = rhs.max_net_distance_;
+ max_connection_distance_ = rhs.max_connection_distance_;
+
+ TeGraphNetwork* n = new TeGraphNetwork();
+ *n = *rhs.net_;
+ net_ = n;
+}
+
+bool
+TeProxMatrixOpenNetworkStrategy::Construct (TeProxMatrixImplementation* imp)
+{
+ if (imp == 0)
+ return false;
+
+ // Connect local neighbours, based on the Local Distance Strategy
+ if (max_local_distance_ > 0)
+ {
+ TeProxMatrixLocalDistanceStrategy local(objects_, geomRep_, max_local_distance_);
+ local.Construct (imp);
+ }
+
+ // Connect neighbours through the network. The process is the following:
+ // 1. The nearest point (entry points) in the network for all the input geometries
+ // are computed;
+ // 2. If the distance from the geometry centroid to the entry point is smaller than the maximum allowed,
+ // create a new node in the network corresponding to this entry point.
+ // 3. Compute the minimum path among all these new nodes (entry points).
+ // 4. For each pair of entry points, if the minimum path distance is smaller than the
+ // maximum allowed, the corresponding geometries will be connected.
+ if (net_ == 0)
+ return false;
+
+ map<string, string> entry_geom_map; // maps input geometries to network entry points
+ TeNodeSet entry_set; // entry points
+
+// // ----- progress bar
+// int step = 0;
+// if(TeProgress::instance())
+
+// TeProgress::instance()->setTotalSteps(objects_->numObjects());
+ // -----
+
+ // Iterate over all objects and select the ones that are close enough to the network
+ TeSTElementSet::iterator itobj1 = objects_->begin();
+ int id = 0; // Nodes to be created will have sequential object_ids.
+ // The existing network nodes have object_id equal to their position
+ while ( itobj1 != objects_->end())
+
+ {
+ // Get object1 id and representation
+ string object_id1 = (*itobj1).objectId();
+ cout << object_id1 << "id " << id << endl;
+
+ TeCoord2D p1;
+ if (!TeFindObjectCentroid ((*itobj1), geomRep_, p1))
+ return false;
+
+
+ int line_index;
+ TeCoord2D pinter;
+ double min_dist;
+
+ if (net_->nearestNetworkPoint (p1, line_index, pinter, min_dist))
+ {
+ if (min_dist < max_net_distance_)
+ {
+ TeNode new_node;
+ new_node.add (pinter);
+ new_node.objectId (Te2String (id));
+ id++;
+
+ net_->breakLineSet (new_node, line_index);
+ entry_geom_map[new_node.objectId()] = object_id1; // Associates geometry with closest net nodes
+ entry_set.add (new_node); // This set will be used as initial points in the shortest path algorithm
+ }
+ }
+ ++itobj1;
+/* if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ TeProgress::instance()->setProgress(step);
+ }
+ ++step;
+ */
+
+ }
+
+ TeLineSet lineSet = net_->getLineSet();
+ map<string, double> lineCosts = net_->getLineCosts();
+ TeGraphNetwork net(lineSet, lineCosts);
+ TeSelectEntryPoints (entry_set, entry_geom_map, &net, max_connection_distance_, objects_, geomRep_, imp);
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ return true;
+}
+
+
+bool
+TeProxMatrixOpenNetworkStrategy::IsEqual (const TeProxMatrixConstructionStrategy& other) const
+{
+ return ((*this)==(TeProxMatrixOpenNetworkStrategy&)other);
+}
+
+bool
+TeProxMatrixOpenNetworkStrategy::operator== (const TeProxMatrixOpenNetworkStrategy& other) const
+{
+ return (TeProxMatrixConstructionStrategy::IsEqual(other) &&
+ (max_local_distance_ == other.max_local_distance_) &&
+ (max_net_distance_ == other.max_net_distance_) &&
+ (max_connection_distance_ == other.max_connection_distance_));
+}
+
+
+TeProxMatrixOpenNetworkStrategy&
+TeProxMatrixOpenNetworkStrategy::operator= (const TeProxMatrixOpenNetworkStrategy& rhs)
+{
+ if (!(this==&rhs))
+ {
+ type_ = rhs.type_;
+ objects_ = rhs.objects_;
+ geomRep_ = rhs.geomRep_;
+ max_local_distance_ = rhs.max_local_distance_;
+ max_net_distance_ = rhs.max_net_distance_;
+ max_connection_distance_ = rhs.max_connection_distance_;
+
+ TeGraphNetwork* n = new TeGraphNetwork();
+ *n = *rhs.net_;
+ net_ = n;
+ }
+ return (*this);
+}
+
+
+/////////////////////////////////////////////////////////////////////
+// TeProxMatrixOpenNetworkStrategy2
+//////////////////////////////////////////////////////////////////////
+
+TeProxMatrixOpenNetworkStrategy2::TeProxMatrixOpenNetworkStrategy2 (TeSTElementSet* objects1,
+ TeGeomRep rep1,
+ TeSTElementSet* objects2, TeGeomRep rep2,
+ double max_local_distance,
+ double max_net_distance, double max_connetion_distance,
+ TeGraphNetwork* input_net) :
+ TeProxMatrixConstructionStrategy(objects1, rep1, "OpenNetwork2"),
+ objects2_ (objects2),
+ geomRep2_(rep2),
+ max_local_distance_ (max_local_distance),
+ max_net_distance_ (max_net_distance),
+ max_connection_distance_ (max_connetion_distance),
+ net_ (input_net)
+ { }
+
+TeProxMatrixOpenNetworkStrategy2::TeProxMatrixOpenNetworkStrategy2 (const TeProxMatrixOpenNetworkStrategy2& rhs)
+ : TeProxMatrixConstructionStrategy(rhs)
+{
+ objects2_ = rhs.objects2_;
+ geomRep2_ = rhs.geomRep2_;
+ max_local_distance_ = rhs.max_local_distance_;
+ max_net_distance_ = rhs.max_net_distance_;
+ max_connection_distance_ = rhs.max_connection_distance_;
+
+ TeGraphNetwork* n = new TeGraphNetwork();
+ *n = *rhs.net_;
+ net_ = n;
+}
+
+
+bool
+TeProxMatrixOpenNetworkStrategy2:: Construct (TeProxMatrixImplementation* imp)
+ {
+ if (imp == 0)
+ return false;
+
+
+ // Connect neighbours through the network. The process is the following:
+ // 1. The nearest point (entry points) in the network for all the input geometries
+ // are computed;
+ // 2. If the distance from the geometry centroid to the entry point is smaller than the maximum allowed,
+ // create a new node in the network corresponding to this entry point.
+ // 3. Compute the minimum path among all these new nodes (entry points).
+ // 4. For each pair of entry points, if the minimum path distance is smaller than the
+ // maximum allowed, the corresponding geometries will be connected.
+ if (net_ == 0)
+ return false;
+
+ map<string, string> entry_geom_map; // maps input geometries to network entry points
+
+
+ int id = 0; // Nodes to be created will have sequential object_ids.
+ // The existing network nodes have object_id equal to their position
+ // Iterate over all objects and select the ones that are close enough to the network
+
+ TeNodeSet entry_set1; // entry points
+ TeSTElementSet::iterator itobj1 = objects_->begin();
+ while ( itobj1 != objects_->end())
+ {
+ // Get object1 id and representation
+ string object_id1 = (*itobj1).objectId();
+ cout << "object1 " << object_id1 << "id" << id << endl;
+
+ TeCoord2D p1;
+ if (!TeFindObjectCentroid ((*itobj1), geomRep_, p1))
+ return false;
+
+
+ int line_index;
+ TeCoord2D pinter;
+ double min_dist;
+
+ if (net_->nearestNetworkPoint (p1, line_index, pinter, min_dist))
+ {
+ if (min_dist < max_net_distance_)
+ {
+ TeNode new_node;
+ new_node.add (pinter);
+ new_node.objectId (Te2String (id));
+ id++;
+
+ net_->breakLineSet (new_node, line_index);
+ entry_geom_map[new_node.objectId()] = object_id1; // Associates geometry with closest net nodes
+ entry_set1.add (new_node); // This set will be used as initial points in the shortest path algorithm
+ }
+ }
+ ++itobj1;
+ }
+
+
+ // Iterate over all objects of interst (objects2)
+ TeNodeSet entry_set2; // entry points
+ TeSTElementSet::iterator itobj2 = objects2_->begin();
+ while ( itobj2 != objects2_->end())
+ {
+ // Get object1 id and representation
+ string object_id2 = (*itobj2).objectId();
+ cout << "object2 " << object_id2 << "id" << id << endl;
+
+ TeCoord2D p2;
+ if (!TeFindObjectCentroid ((*itobj2), geomRep2_, p2))
+ return false;
+
+ int line_index;
+ TeCoord2D pinter;
+ double min_dist;
+
+ if (net_->nearestNetworkPoint (p2, line_index, pinter, min_dist))
+ {
+ TeNode new_node;
+ new_node.add (pinter);
+ new_node.objectId (Te2String (id));
+ id++;
+
+ net_->breakLineSet (new_node, line_index);
+ entry_geom_map[new_node.objectId()] = object_id2; // Associates geometry with closest net nodes
+ entry_set2.add (new_node); // This set will be used as initial points in the shortest path algorithm
+ }
+ ++itobj2;
+ }
+
+ TeLineSet lineSet = net_->getLineSet();
+ map<string, double> lineCosts = net_->getLineCosts();
+ TeGraphNetwork net(lineSet, lineCosts);
+ TeSelectEntryPoints2 (entry_set1, entry_set2, entry_geom_map, &net, max_connection_distance_,
+ objects_, geomRep_, objects2_, geomRep2_, imp);
+ return true;
+ }
+
+bool
+TeProxMatrixOpenNetworkStrategy2::IsEqual (const TeProxMatrixConstructionStrategy& other) const
+{
+ return ((*this)==(TeProxMatrixOpenNetworkStrategy2&)other);
+}
+
+bool
+TeProxMatrixOpenNetworkStrategy2:: operator== (const TeProxMatrixOpenNetworkStrategy2& other) const
+{
+
+ return ((type_==other.type_) &&
+ (max_local_distance_ == other.max_local_distance_) &&
+ (max_net_distance_ == other.max_net_distance_) &&
+ (max_connection_distance_ == other.max_connection_distance_));
+}
+
+TeProxMatrixOpenNetworkStrategy2&
+TeProxMatrixOpenNetworkStrategy2:: operator= (const TeProxMatrixOpenNetworkStrategy2& rhs)
+{
+ if (!(this==&rhs))
+ {
+ type_ = rhs.type_;
+ objects_ = rhs.objects_;
+ objects2_ = rhs.objects2_;
+
+ max_local_distance_ = rhs.max_local_distance_;
+ max_net_distance_ = rhs.max_net_distance_;
+ max_connection_distance_ = rhs.max_connection_distance_;
+
+ TeGraphNetwork* n = new TeGraphNetwork();
+ *n = *rhs.net_;
+ net_ = n;
+ }
+ return (*this);
+}
+
+
diff --git a/src/terralib/kernel/TeProxMatrixConstructionStrategy.h b/src/terralib/kernel/TeProxMatrixConstructionStrategy.h
new file mode 100644
index 0000000..5cd98f9
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixConstructionStrategy.h
@@ -0,0 +1,284 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeProxMatrixConstructionStrategy.h
+ This file contains structures and definitions about construction strategies of proximity matrix
+*/
+
+#ifndef TeProxMatrixConstructionStrategy_H
+#define TeProxMatrixConstructionStrategy_H
+
+#include "TeProxMatrixImplementation.h"
+#include "TeNetwork.h"
+
+class TeSTElementSet;
+
+
+//! An abstract class to representate construction strategies of proximity matrix
+class TeProxMatrixConstructionStrategy
+{
+
+protected:
+
+ //! Set of objetcs used to construct the matrix
+ TeSTElementSet* objects_;
+
+ //! Geometry representation of the objects used to construct the matrix
+ TeGeomRep geomRep_;
+
+ //! Type of the construction strategy
+ string type_;
+
+ //! Construct
+ TeProxMatrixConstructionStrategy();
+
+ //! Construct
+ TeProxMatrixConstructionStrategy(TeSTElementSet* objects, TeGeomRep geomRep, const string& type);
+
+ //! Copy construct
+ TeProxMatrixConstructionStrategy(const TeProxMatrixConstructionStrategy& st);
+
+public:
+
+ //! Construct the proximity matrix
+ virtual bool Construct(TeProxMatrixImplementation*){return false;}
+
+ //! Destructor
+ virtual ~TeProxMatrixConstructionStrategy() {}
+
+ //! Return the type of the strategy
+ string Type() {return type_;}
+
+ //! Set the set of objects and its geometry representation
+ void setSTObjects (TeSTElementSet* objects, TeGeomRep geomRep);
+
+ //! Get the objects used to construct the matrix
+ TeSTElementSet* objects();
+
+ //! Get the geometry representation
+ TeGeomRep geomRep() { return geomRep_; }
+
+ //! Verify if the type of the strategy, the object set and its geometry representation are equal
+ virtual bool IsEqual (const TeProxMatrixConstructionStrategy& other) const;
+};
+
+
+//! A class to implement the local adjacency strategy of proximity matrix
+class TeProxMatrixLocalAdjacencyStrategy : public TeProxMatrixConstructionStrategy
+{
+
+private:
+
+ //! If it must calculate or not the distance between neighbors
+ bool calcDistance_;
+
+public:
+
+ //! Constructor
+ TeProxMatrixLocalAdjacencyStrategy (bool calcDistance=false);
+
+ //! Constructor
+ TeProxMatrixLocalAdjacencyStrategy (TeSTElementSet* objects, TeGeomRep geomRep, bool calcDistance=false);
+
+ //! Copy constructor
+ TeProxMatrixLocalAdjacencyStrategy (TeProxMatrixLocalAdjacencyStrategy& st);
+
+ //! Destructor
+ virtual ~TeProxMatrixLocalAdjacencyStrategy() {}
+
+ //! Construct the proximity matrix through local adjacency strategy
+ virtual bool Construct (TeProxMatrixImplementation* imp);
+
+ //! Equal operator
+ bool operator== (const TeProxMatrixLocalAdjacencyStrategy& rhs) const;
+
+ //! Assignment operator
+ TeProxMatrixLocalAdjacencyStrategy& operator= (const TeProxMatrixLocalAdjacencyStrategy& rhs);
+
+ bool calculateDistance()
+ { return calcDistance_; }
+};
+
+
+//! A class to implement the local distance strategy of proximity matrix
+class TeProxMatrixLocalDistanceStrategy : public TeProxMatrixConstructionStrategy
+{
+private:
+ double max_distance_;
+
+public:
+
+ //! Constructor
+ TeProxMatrixLocalDistanceStrategy (double max_distance = 0);
+
+ //! Constructor
+ TeProxMatrixLocalDistanceStrategy (TeSTElementSet* objects, TeGeomRep geomRep, double max_distance);
+
+ //! Copy constructor
+ TeProxMatrixLocalDistanceStrategy (const TeProxMatrixLocalDistanceStrategy& st);
+
+ //! Destructor
+ virtual ~TeProxMatrixLocalDistanceStrategy(){}
+
+ //! Construct the proximity matrix through local distance strategy
+ virtual bool Construct (TeProxMatrixImplementation* imp);
+
+ //! Verify if is equal
+ virtual bool IsEqual (const TeProxMatrixConstructionStrategy& other) const;
+
+ //! Equal operator
+ bool operator== (const TeProxMatrixLocalDistanceStrategy& s) const;
+
+ //! Assignment operator
+ TeProxMatrixLocalDistanceStrategy& operator= (const TeProxMatrixLocalDistanceStrategy& rhs);
+
+};
+
+
+//! A class to implement the closed network strategy of proximity matrix
+class TeProxMatrixClosedNetworkStrategy : public TeProxMatrixConstructionStrategy
+{
+private:
+ double max_local_distance_;
+ double max_net_distance_;
+ double max_connection_distance_;
+
+
+ TeGraphNetwork* net_;
+
+public:
+
+ //! Constructor
+ TeProxMatrixClosedNetworkStrategy ( TeSTElementSet* objects, TeGeomRep rep, double max_local_distance,
+ double max_net_distance, double max_connection_distance,
+ TeGraphNetwork* input_net);
+
+ //! Copy constructor
+ TeProxMatrixClosedNetworkStrategy (const TeProxMatrixClosedNetworkStrategy& rhs);
+
+ //! Destructor
+ virtual ~TeProxMatrixClosedNetworkStrategy()
+ {
+ if(net_)
+ delete (net_);
+ }
+
+ //! Construct the proximity matrix through closed network strategy
+ virtual bool Construct (TeProxMatrixImplementation* imp);
+
+ //! Verify if is equal
+ virtual bool IsEqual (const TeProxMatrixConstructionStrategy& other) const;
+
+ //! Assignment operator
+ TeProxMatrixClosedNetworkStrategy& operator= (const TeProxMatrixClosedNetworkStrategy& rhs);
+
+ //! Equal operator
+ bool operator== (const TeProxMatrixClosedNetworkStrategy& other) const;
+
+ //! Get the objects used to construct the matrix
+ TeSTElementSet* objects() { return objects_; }
+};
+
+//! A class to implement the open network strategy of proximity matrix (among a set of objetcs)
+class TeProxMatrixOpenNetworkStrategy : public TeProxMatrixConstructionStrategy
+{
+private:
+ double max_local_distance_;
+ double max_net_distance_;
+ double max_connection_distance_;
+
+ TeGraphNetwork* net_;
+public:
+
+ //! Constructor
+ TeProxMatrixOpenNetworkStrategy ( TeSTElementSet* objects, TeGeomRep rep, double max_local_distance,
+ double max_net_distance, double max_connetion_distance,
+ TeGraphNetwork* input_net);
+ //! Copy constructor
+ TeProxMatrixOpenNetworkStrategy (const TeProxMatrixOpenNetworkStrategy& rhs);
+
+ //! Destructor
+ virtual ~TeProxMatrixOpenNetworkStrategy()
+ {
+ if(net_)
+ delete (net_);
+ }
+
+ //! Construct the proximity matrix through open network strategy
+ virtual bool Construct (TeProxMatrixImplementation* imp);
+
+ //! Verify if is equal
+ virtual bool IsEqual (const TeProxMatrixConstructionStrategy& other) const;
+
+ //! Equal operator
+ bool operator== (const TeProxMatrixOpenNetworkStrategy& other) const;
+
+ //! Assignment operator
+ TeProxMatrixOpenNetworkStrategy& operator= (const TeProxMatrixOpenNetworkStrategy& rhs);
+};
+
+
+//! A class to implement the open network strategy of proximity matrix (relationships among objetc of two differnt sets)
+class TeProxMatrixOpenNetworkStrategy2 : public TeProxMatrixConstructionStrategy
+{
+private:
+ TeSTElementSet* objects2_;
+ TeGeomRep geomRep2_;
+ double max_local_distance_;
+ double max_net_distance_;
+ double max_connection_distance_;
+
+ TeGraphNetwork* net_;
+public:
+
+ //! Constructor
+ TeProxMatrixOpenNetworkStrategy2 ( TeSTElementSet* objects1, TeGeomRep rep1,
+ TeSTElementSet* objects2, TeGeomRep rep2,
+ double max_local_distance,
+ double max_net_distance, double max_connetion_distance,
+ TeGraphNetwork* input_net);
+ //! Copy constructor
+ TeProxMatrixOpenNetworkStrategy2 (const TeProxMatrixOpenNetworkStrategy2& rhs);
+
+ //! Destructor
+ virtual ~TeProxMatrixOpenNetworkStrategy2 ()
+ {
+ if(net_)
+ delete (net_);
+ }
+
+ //! Construct the proximity matrix through open network strategy
+ virtual bool Construct (TeProxMatrixImplementation* imp);
+
+ //! Verify if is equal
+ virtual bool IsEqual (const TeProxMatrixConstructionStrategy& other) const;
+
+ //! Equal operator
+ bool operator== (const TeProxMatrixOpenNetworkStrategy2& other) const;
+
+ //! Assignment operator
+ TeProxMatrixOpenNetworkStrategy2& operator= (const TeProxMatrixOpenNetworkStrategy2& rhs);
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeProxMatrixImplementation.cpp b/src/terralib/kernel/TeProxMatrixImplementation.cpp
new file mode 100644
index 0000000..9a4f4ca
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixImplementation.cpp
@@ -0,0 +1,365 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeProxMatrixImplementation.h"
+
+#include <stdio.h>
+
+TeProxMatrixGraphBreymann:: TeProxMatrixGraphBreymann (TeProxMatrixGraphBreymann& other) : TeProxMatrixImplementation(), graph_(false)
+{
+ type_ = other.type_;
+// graph_ = other.graph_;
+ map_ = other.map_;
+}
+
+
+
+TeProxMatrixGraphBreymann&
+TeProxMatrixGraphBreymann:: operator= (TeProxMatrixGraphBreymann& other)
+{
+ type_ = other.type_;
+// graph_ = other.graph_;
+ map_ = other.map_;
+ return (*this);
+}
+
+
+void
+TeProxMatrixGraphBreymann::connectObjects (const string& object_id1, const string& object_id2, const TeProxMatrixAttributes& attr)
+{
+ int pos1 = graph_.insert (object_id1);
+ int pos2 = graph_.insert (object_id2);
+
+ graph_.connectVertices (pos1, pos2, attr);
+
+ map_[object_id1] = pos1;
+ map_[object_id2] = pos2;
+}
+
+
+bool
+TeProxMatrixGraphBreymann::setConnectionAttributes (const string& object_id1, const string& object_id2, const TeProxMatrixAttributes& attr)
+{
+ return(graph_.setEdgeValue (object_id1, object_id2, attr));
+}
+
+bool
+TeProxMatrixGraphBreymann::getConnectionAttributes (const string& object_id1, const string&object_id2, TeProxMatrixAttributes& attr)
+{
+ map_iterator pos1, pos2;
+
+ if ((pos1 = map_.find(object_id1)) == map_.end())
+ return false; // object_id1 not in the graph
+
+ if ((pos2 = map_.find(object_id2)) == map_.end())
+ return false; // object_id2 not in the graph
+
+ // Object_id1 neighbours iterator
+ br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator
+ start = graph_[(*pos1).second].second.begin(),
+ end = graph_[(*pos1).second].second.end();
+
+ while (start != end)
+ {
+ if ((*start).first == (*pos2).second) {
+ attr = (*start).second;
+ return true;
+ }
+ ++start;
+ }
+ return false;
+}
+
+bool
+TeProxMatrixGraphBreymann::getNeighboursNeighbours (const string& object_id, TeNeighbours& neigh, int max_order )
+{
+ bool ret_value = getNeighboursNeighbours (object_id, neigh, max_order, 1);
+ neigh.Remove (object_id);
+ return ret_value;
+}
+
+bool
+TeProxMatrixGraphBreymann::getNeighboursNeighbours (const string& object_id, TeNeighbours& neigh, int max_order, int current_order)
+{
+
+ map_iterator pos;
+
+ if ((pos = map_.find(object_id)) == map_.end())
+ return false; // object_id not in the graph
+
+ // Object_id1 neighbours iterator
+ br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator
+ start = graph_[(*pos).second].second.begin(),
+ end = graph_[(*pos).second].second.end();
+
+ // Insert all neighbours
+ while (start != end)
+ {
+ TeProxMatrixAttributes attr = (*start).second;
+ attr.Order (current_order); //Update attr attribute for that specific object
+ if (neigh.Insert (graph_[(*start).first].first, attr))
+ {
+ // Get neighbours of neighbours that were not inserted before
+ for (int recursive_loop = max_order - 1; recursive_loop > 0; --recursive_loop)
+ getNeighboursNeighbours (graph_[(*start).first].first, neigh, recursive_loop, ++current_order);
+
+ }
+ ++start;
+ }
+ return true;
+
+}
+
+
+bool
+TeProxMatrixGraphBreymann::getNeighbours (const string& object_id, TeNeighbours& neigh)
+{
+ map_iterator pos;
+
+ if ((pos = map_.find(object_id)) == map_.end())
+ return false; // object_id not in the graph
+
+ br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator
+ start = graph_[(*pos).second].second.begin(),
+ end = graph_[(*pos).second].second.end();
+
+ while (start != end)
+ {
+ neigh.Insert (graph_[(*start).first].first, (*start).second);
+ ++start;
+ }
+
+ return true;
+
+}
+
+bool
+TeProxMatrixGraphBreymann::getNeighbours (int i, string& object_id, TeNeighbours& neigh)
+{
+
+ if (i > (int) graph_.size())
+ return false;
+
+ // find object_id
+ map_iterator pos = map_.begin();
+ while (pos != map_.end())
+ {
+ if ((*pos).second == i)
+ {
+ object_id = (*pos).first;
+ pos = map_.end();
+ }
+ else pos++;
+ }
+
+ br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator
+ start = graph_[i].second.begin(),
+ end = graph_[i].second.end();
+
+
+ while (start != end)
+ {
+ neigh.Insert (graph_[(*start).first].first, (*start).second);
+ start++;
+ }
+
+ return true;
+
+}
+
+
+
+TeProxMatrixImplementation*
+TeProxMatrixGraphBreymann:: CreateCopy ()
+{
+ TeProxMatrixGraphBreymann* imp = new TeProxMatrixGraphBreymann (*this);
+ return imp;
+
+}
+
+void
+TeProxMatrixGraphBreymann:: List ()
+{
+
+ cout << "objetos proximos " << endl;
+ for (unsigned int j = 0; j < graph_.size(); j++)
+ cout << "objeto " << j << " id " << graph_[j].first << endl;
+
+
+ for (unsigned int i = 0; i < graph_.size(); i++)
+ {
+ if ((graph_[i].first == "13") || (graph_[i].first == "20") ||
+ (graph_[i].first == "36") ) /*|| (graph_[i].first == "C09L12") ||
+ (graph_[i].first == "C10L15") || (graph_[i].first == "C27L14") ||
+ (graph_[i].first == "C15L05"))*/
+
+ {
+ cout << "object: " << i << " id: " << graph_[i].first << endl;
+ cout << "vizinhos: " << endl;
+
+ br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator
+ start = graph_[i].second.begin(),
+ end = graph_[i].second.end();
+
+ while (start != end)
+ {
+// cout << " " << graph_[(*start).first].first << endl;
+ cout << " " << graph_[(*start).first].first << " w " << (*start).second.Weight() << " d1 " << (*start).second.CentroidDistance() << " d2 " << (*start).second.NetworkObjectsDistance() << " d3 " << (*start).second.NetworkMinimumPath() << endl;
+ start++;
+ }
+ cout << endl;
+ }
+ }
+
+}
+
+
+bool
+TeProxMatrixGraphBreymann:: SaveTextFile (string& name)
+{
+ string complete_name = name + ".txt";
+
+ FILE* fp = fopen(complete_name.c_str(),"w");
+ if (fp)
+ {
+ fprintf (fp, "Objetos conectados: %d\n", graph_.size() );
+ // for (int j = 0; j < graph_.size(); j++)
+ // fprintf (fp, " %s%\n", graph_[j].first.c_str());
+
+
+ for (unsigned int i = 0; i < graph_.size(); i++)
+ {
+
+ fprintf (fp, "%d --------------- object_id: %s\n", i, graph_[i].first.c_str());
+ fprintf (fp," vizinhos:\n");
+
+ br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator
+ start = graph_[i].second.begin(),
+ end = graph_[i].second.end();
+ double sum = 0.0;
+ while (start != end)
+ {
+ fprintf (fp, "%s S %d W: %3.7f D1: %3.7f D2: %3.7f D3: %3.7f \n", graph_[(*start).first].first.c_str(), (*start).second.Slice(), (*start).second.Weight(),(*start).second.CentroidDistance() , (*start).second.NetworkObjectsDistance(),(*start).second.NetworkMinimumPath() );
+ sum += (*start).second.Weight();
+ start++;
+ }
+
+ fprintf (fp, "Weights sum: %3.7f\n", sum);
+ fprintf (fp, "end --------------- object_id: %s\n\n", graph_[i].first.c_str());
+
+
+ }
+ fclose (fp);
+ return true;
+ }
+ else return false;
+
+ /*
+ FILE* fp = fopen(name.c_str(),"w");
+ if (fp)
+ {
+ for (int i = 0; i < graph_.size(); i++)
+ {
+
+
+ cout << "***********************" << graph_[i].first << endl;
+ br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator
+ start = graph_[i].second.begin(),
+ end = graph_[i].second.end();
+ double sum = 0.0;
+ while (start != end)
+ {
+ cout << graph_[(*start).first].first << endl;
+ fprintf (fp, "%3.7f ", (*start).second.CentroidDistance());
+ sum += (*start).second.Weight();
+ start++;
+ }
+
+ fprintf (fp, "\n");
+
+ }
+ fclose (fp);
+ return true;
+ }
+ else return false;
+ */
+}
+
+
+bool
+TeProxMatrixGraphBreymann:: SaveGALFile (string& name)
+{
+
+ string complete_name = name + ".gal";
+ FILE* fp = fopen(complete_name.c_str(),"w");
+ if (fp)
+ {
+ fprintf (fp, "%d\n", graph_.size() ); // first line: number of elements in matrix
+ for (unsigned int i = 0; i < graph_.size(); i++)
+ {
+
+ fprintf (fp, "%s %d\n", graph_[i].first.c_str(), graph_[i].second.size());
+ br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator
+ start = graph_[i].second.begin(),
+ end = graph_[i].second.end();
+ while (start != end)
+ {
+ fprintf (fp, "%s %3.7f\n", graph_[(*start).first].first.c_str(), (*start).second.Weight() );
+ start++;
+ }
+ fprintf (fp, "\n");
+ }
+ fclose (fp);
+ return true;
+ }
+ else return false;
+
+}
+
+
+bool
+TeProxMatrixGraphBreymann:: SaveGWTFile (string& name)
+{
+
+ string complete_name = name + ".gwt";
+ FILE* fp = fopen(complete_name.c_str(),"w");
+ if (fp)
+ {
+ fprintf (fp, "%d\n", graph_.size() ); // first line: number of elements in matrix
+ for (unsigned int i = 0; i < graph_.size(); i++)
+ {
+ br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator
+ start = graph_[i].second.begin(),
+ end = graph_[i].second.end();
+ while (start != end)
+ {
+ fprintf (fp, "%s %s\n", graph_[i].first.c_str(), graph_[(*start).first].first.c_str());
+ start++;
+ }
+ }
+ fclose (fp);
+ return true;
+ }
+ else return false;
+
+}
diff --git a/src/terralib/kernel/TeProxMatrixImplementation.h b/src/terralib/kernel/TeProxMatrixImplementation.h
new file mode 100644
index 0000000..83350f8
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixImplementation.h
@@ -0,0 +1,210 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeProxMatrixImplementation.h
+ This file contains structures and definitions about different representations of proximity matrix
+*/
+
+#ifndef TeProxMatrixImplementation_H
+#define TeProxMatrixImplementation_H
+
+#include "TeNeighbours.h"
+#include <graph.h>
+
+//! An abstract class to represent proximity matrix
+class TeProxMatrixImplementation
+{
+
+protected:
+
+ //! Type of the representation
+ string type_;
+
+ //! Empty constructor
+ TeProxMatrixImplementation(){}
+
+public:
+
+ //! Verify if two objects are neighbour or connected
+ bool isConnected (const string& object_id1, const string& object_id2)
+ {
+ TeProxMatrixAttributes attr;
+ return getConnectionAttributes (object_id1, object_id2, attr);
+ }
+
+ //! Connect two objects
+ virtual void connectObjects (const string& /* object_id1 */, const string& /* object_id2 */, const TeProxMatrixAttributes& /* attr */){}
+
+ //! Disconnect two objects
+ virtual bool disconnectObjects (const string& /* object_id1 */, const string& /* object_id2 */) {return false;}
+
+ //! Remove an object
+ virtual bool removeObject (const string& /* object_id */) {return false;}
+
+ //! Get connection attributes
+ virtual bool getConnectionAttributes (const string& /* object_id1 */, const string& /* object_id2 */, TeProxMatrixAttributes& /* attr */) {return false;}
+
+ //! Set connection attributes
+ virtual bool setConnectionAttributes (const string& /* object_id1 */, const string& /* object_id2 */, const TeProxMatrixAttributes& /*attr*/) {return false;}
+
+ //! Get the neighbours of an object
+ virtual bool getNeighbours (const string& /* object_id */, TeNeighbours& /* neigh */) {return false;}
+
+ //! Get the obj-th neighbour of an object
+ virtual bool getNeighbours (int /* obj */, string& /* object_id */, TeNeighbours& /* neigh */) {return false;}
+
+ //! Get the neighbours of an object
+ virtual bool getNeighboursNeighbours (const string& /* object_id */, TeNeighbours& /* neigh */, int /* max_order */ = 2) {return false;}
+
+ //! Return the number of objects
+ virtual int NumberOfObjects () {return 0;}
+
+ //! Return the type of the representation
+ string Type() {return type_;}
+
+ //! Create a copy
+ virtual TeProxMatrixImplementation* CreateCopy (){return 0;}
+
+ //! Verify if is equal
+ virtual bool IsEqual (TeProxMatrixImplementation& other)
+ {
+ if (type_ == other.type_)
+ return true;
+ return false;
+ }
+
+ //! Equal operator
+ virtual bool operator== (const TeProxMatrixImplementation& /* other */) const { return true;}
+
+
+ //! Save the proximity matrix in a text file
+ virtual bool SaveTextFile (string& /* name */) {return false;}
+
+ //! Save the proximity matrix in a GAL format text file
+ virtual bool SaveGALFile (string& /* name */){return false;}
+
+ //! Save the proximity matrix in a GWT format text file
+ virtual bool SaveGWTFile (string& /* name */){return false;}
+
+ //! List the proximity matrix on command prompt
+ virtual void List (){}
+
+ //! Destructor
+ virtual ~TeProxMatrixImplementation(){}
+};
+
+
+//! A class to represent proximity matrix utilising the Breymann graph
+class TeProxMatrixGraphBreymann : public TeProxMatrixImplementation
+{
+private:
+ string type_;
+ br_stl::Graph<string, TeProxMatrixAttributes> graph_;
+
+ typedef map<string, int> Object_id_map_type;
+ Object_id_map_type map_;
+
+ typedef Object_id_map_type::iterator map_iterator;
+ typedef Object_id_map_type::const_iterator map_const_iterator;
+
+ bool getNeighboursNeighbours (const string& object_id, TeNeighbours& neigh, int max_order = 2, int current_order = 1);
+
+public:
+
+ //! Empty constructor
+ TeProxMatrixGraphBreymann () : graph_(true) //false means undirected graph, has to be true to allow normalization
+ {
+ type_ = "Breymann";
+ }
+
+ //! Copy constructor
+ TeProxMatrixGraphBreymann(TeProxMatrixGraphBreymann& imp);
+
+ //! Connect two objects
+ virtual void connectObjects (const string& object_id1, const string& object_id2, const TeProxMatrixAttributes& attr);
+
+ //! Get connection attributes
+ virtual bool getConnectionAttributes (const string& object_id1, const string& object_id2, TeProxMatrixAttributes& attr);
+
+ //! Set connection attributes
+ virtual bool setConnectionAttributes (const string& object_id1, const string& object_id2, const TeProxMatrixAttributes& attr);
+
+ //! Get the neighbours of an object
+ virtual bool getNeighbours (const string& object_id, TeNeighbours& neigh);
+
+ //! Get the obj-th neighbour of an object
+ virtual bool getNeighbours (int obj, string& object_id, TeNeighbours& neigh);
+
+ //! Get the neighbours of an object
+ virtual bool getNeighboursNeighbours (const string& object_id, TeNeighbours& neigh, int max_order = 2);
+
+ //! Return the number of the objects
+ virtual int NumberOfObjects () {return graph_.size();}
+
+ //! Create a copy
+ virtual TeProxMatrixImplementation* CreateCopy ();
+
+ //! Verify if is equal
+ virtual bool IsEqual (TeProxMatrixImplementation& other)
+ {
+ if (type_ == other.Type())
+ return (*this == (TeProxMatrixGraphBreymann&)other);
+ return false;
+ }
+
+ //! Assignment operator
+ TeProxMatrixGraphBreymann& operator= (TeProxMatrixGraphBreymann& imp);
+
+ //! Destructor
+ virtual ~TeProxMatrixGraphBreymann() {}
+
+ //! Save the proximity matrix in a text file
+ virtual bool SaveTextFile (string& name);
+
+ //! Save the proximity matrix in a GAL text file
+ virtual bool SaveGALFile (string& name);
+
+ //! Save the proximity matrix in a GWT text file
+ virtual bool SaveGWTFile (string& name);
+
+ //! List proximity matrix on command prompt
+ virtual void List ();
+};
+
+
+//! An abstract factory of proximity matrix representations
+class TeProxMatrixAbstractFactory
+{
+public:
+
+ static TeProxMatrixImplementation* MakeConcreteImplementation (const string impl_type = "BREYMANN")
+ {
+ if (impl_type == "Breymann")
+ return new TeProxMatrixGraphBreymann;
+
+ return new TeProxMatrixGraphBreymann;
+ }
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeProxMatrixSlicingStrategy.h b/src/terralib/kernel/TeProxMatrixSlicingStrategy.h
new file mode 100644
index 0000000..05b12f0
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixSlicingStrategy.h
@@ -0,0 +1,89 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeProxMatrixSlicingStrategy.h
+ This file contains structures and definitions about slicing strategies of proximity matrix
+*/
+
+
+#ifndef TeProxMatrixSlicingStrategy_H
+#define TeProxMatrixSlicingStrategy_H
+
+#include "TeProxMatrixImplementation.h"
+
+
+//! An abstract class to representate slicing strategies of proximity matrix
+class TeProxMatrixSlicingStrategy
+{
+
+protected:
+ //! Empty constructor
+ TeProxMatrixSlicingStrategy() {}
+
+public:
+ //! Destructor
+ virtual ~TeProxMatrixSlicingStrategy() {}
+
+ //! Slice the proximity matrix
+ virtual bool Slice(TeProxMatrixImplementation* /* imp */) {return true;}
+
+ //! Verify if is equal
+ virtual bool IsEqual (const TeProxMatrixSlicingStrategy& /* rhs */) const {return true;}
+
+};
+
+
+//! A class to implement the no slicing strategy of proximity matrix (i.e., all neighbour are considered to be in the first slice).
+class TeProxMatrixNoSlicingStrategy : public TeProxMatrixSlicingStrategy
+{
+public:
+
+ //! Empty constructor
+ TeProxMatrixNoSlicingStrategy () {}
+
+ //! No slice the proximity matrix
+ virtual bool Slice(TeProxMatrixImplementation* /* imp */) {return true;}
+
+ //! Destructor
+ ~TeProxMatrixNoSlicingStrategy() {}
+};
+
+
+//! A class to implement the zone slicing strategy of proximity matrix (by local or newtork connection distance);
+class TeProxMatrixZonesSlicingStrategy : public TeProxMatrixSlicingStrategy
+{
+ double dist_;
+ bool local_;
+public:
+
+ //! Constructor
+ TeProxMatrixZonesSlicingStrategy (double dist, bool local = true) {dist_ = dist; local_ = local;}
+
+ //! Slice the proximity matrix through zone strategy
+ virtual bool Slice(TeProxMatrixImplementation* imp);
+
+ //! Destructor
+ ~TeProxMatrixZonesSlicingStrategy() {}
+};
+
+#endif
diff --git a/src/terralib/kernel/TeProxMatrixStrategies.cpp b/src/terralib/kernel/TeProxMatrixStrategies.cpp
new file mode 100644
index 0000000..65ff5a1
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixStrategies.cpp
@@ -0,0 +1,296 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeProxMatrixSlicingStrategy.h"
+#include "TeProxMatrixWeightsStrategy.h"
+
+
+// zone slicing strategy
+bool TeProxMatrixZonesSlicingStrategy::Slice (TeProxMatrixImplementation* imp)
+{
+ if (imp == 0) return false;
+
+ for (int obj = 0; obj < imp->NumberOfObjects(); obj++)
+ {
+ TeNeighbours neigh;
+ string object_id;
+ TeProxMatrixAttributes attr;
+ if (imp->getNeighbours (obj, object_id, neigh))
+ {
+ for (int i = 0; i < neigh.size(); i++)
+ {
+ attr = neigh.Attributes(i);
+
+ double distance, d_centr, d_net, d_conn;
+
+ if (attr.WasCentroidDistanceComputed())
+ d_centr = attr.CentroidDistance();
+ else
+ d_centr = 0;
+
+
+ if (attr.WasNetworkObjectsDistanceComputed())
+ d_net = attr.NetworkObjectsDistance();
+ else
+ d_net = 0;
+
+
+ if (attr.WasNetworkMinimumPathComputed())
+ d_conn = attr.NetworkMinimumPath();
+ else
+ d_conn = 0;
+
+
+ if (local_)
+ distance = d_centr;
+ else
+ distance = d_net + d_conn;
+
+ int zone = (int) (distance/dist_);
+ attr.Slice (zone);
+ imp->setConnectionAttributes (object_id, neigh[i], attr);
+
+ }
+
+ }
+ }
+ return true;
+}
+
+
+// inverse distance weight strategy
+bool TeProxMatrixInverseDistanceStrategy::
+ComputeWeigths (TeProxMatrixImplementation* imp)
+{
+ if (imp == 0) return false;
+
+ for (int obj = 0; obj < imp->NumberOfObjects(); obj++)
+ {
+ TeNeighbours neigh;
+ string object_id;
+ TeProxMatrixAttributes attr;
+ if (imp->getNeighbours (obj, object_id, neigh))
+ {
+ double tot = 0.0;
+ vector<double> w_vec;
+
+ for (int i = 0; i < neigh.size(); i++)
+ {
+ TeProxMatrixAttributes attr = neigh.Attributes(i);
+ double w = 1;
+ double d_centr, d_net, d_conn;
+ if (attr.WasCentroidDistanceComputed())
+ if ((d_centr = attr.CentroidDistance()) != 0.0)
+ w += (a_)*1/d_centr;
+
+ if (attr.WasNetworkObjectsDistanceComputed())
+ if ((d_net = attr.NetworkObjectsDistance()) != 0.0)
+ w += (b_)*1/d_net;
+
+ if (attr.WasNetworkMinimumPathComputed())
+ if ((d_conn = attr.NetworkMinimumPath()) != 0.0)
+ w += (c_)*1/d_conn;
+
+ if (w != 1) w -= 1;
+
+ w_vec.push_back (w*factor_);
+ tot += w;
+ }
+
+
+ for (int j = 0; j < neigh.size(); j++)
+ {
+ TeProxMatrixAttributes attr = neigh.Attributes(j);
+ double w = w_vec[j];
+ if (norm_)
+ if (tot != 0) w = w/tot;
+ attr.Weight (w);
+ imp->setConnectionAttributes (object_id, neigh[j], attr);
+ }
+ }
+ }
+ return true;
+}
+
+
+
+// inverse distance weight strategy
+bool TeProxMatrixSquaredInverseDistanceStrategy::
+ComputeWeigths (TeProxMatrixImplementation* imp)
+{
+ if (imp == 0) return false;
+
+ for (int obj = 0; obj < imp->NumberOfObjects(); obj++)
+ {
+ TeNeighbours neigh;
+ string object_id;
+ TeProxMatrixAttributes attr;
+ if (imp->getNeighbours (obj, object_id, neigh))
+ {
+ double tot = 0.0;
+ vector<double> w_vec;
+
+ for (int i = 0; i < neigh.size(); i++)
+ {
+ TeProxMatrixAttributes attr = neigh.Attributes(i);
+ double w = 1;
+ double d_centr, d_net, d_conn;
+ if (attr.WasCentroidDistanceComputed())
+ if ((d_centr = attr.CentroidDistance()) != 0.0)
+ w += (a_)*1/(d_centr*d_centr);
+
+ if (attr.WasNetworkObjectsDistanceComputed())
+ if ((d_net = attr.NetworkObjectsDistance()) != 0.0)
+ w += (b_)*1/(d_net*d_net);
+
+ if (attr.WasNetworkMinimumPathComputed())
+ if ((d_conn = attr.NetworkMinimumPath()) != 0.0)
+ w += (c_)*1/(d_conn*d_conn);
+
+ if (w != 1) w -= 1;
+
+ w_vec.push_back (w*factor_);
+ tot += w;
+ }
+
+
+ for (int j = 0; j < neigh.size(); j++)
+ {
+ TeProxMatrixAttributes attr = neigh.Attributes(j);
+ double w = w_vec[j];
+ if (norm_)
+ if (tot != 0) w = w/tot;
+ attr.Weight (w);
+ imp->setConnectionAttributes (object_id, neigh[j], attr);
+ }
+ }
+ }
+ return true;
+}
+
+// inverse distance weight strategy
+bool TeProxMatrixConnectionStrenghtStrategy::
+ComputeWeigths (TeProxMatrixImplementation* imp)
+{
+ if (imp == 0) return false;
+
+ for (int obj = 0; obj < imp->NumberOfObjects(); obj++)
+ {
+ TeNeighbours neigh;
+ string object_id;
+ TeProxMatrixAttributes attr;
+ if (imp->getNeighbours (obj, object_id, neigh))
+ {
+ double tot = 0.0;
+ vector<double> w_vec;
+
+ for (int i = 0; i < neigh.size(); i++)
+ {
+ TeProxMatrixAttributes attr = neigh.Attributes(i);
+ double w = 1;
+ double d_centr = TeMAXFLOAT;
+ double d_net = TeMAXFLOAT;
+ double d_conn = TeMAXFLOAT;
+
+ if (attr.WasCentroidDistanceComputed())
+ d_centr = attr.CentroidDistance();
+
+
+ if (d_centr == 0.0)
+ {
+ w = 1;
+ }
+ else
+ {
+ if (d_centr <= max_local_distance_)
+ {
+ w = 1/d_centr;
+ }
+ else
+ {
+
+ if (attr.WasNetworkObjectsDistanceComputed())
+ d_net = attr.NetworkObjectsDistance();
+
+ if (attr.WasNetworkMinimumPathComputed())
+ d_conn = attr.NetworkMinimumPath();
+
+ //double distance = (dist_ratio_*d_net + d_conn)/1000; Anap - Jul04
+ double distance = (dist_ratio_*d_net + d_conn);
+ if (distance != 0.0)
+ w = 1/distance;
+ }
+ }
+ //if (w > 1.0) w = 1.0; ANAP- Acho que n�o precisa: o objeto pode ser mais pr�ximo que 1 metro? jul04
+ w_vec.push_back (w*factor_);
+ tot += w;
+ }
+
+ for (int j = 0; j < neigh.size(); j++)
+ {
+
+ TeProxMatrixAttributes attr = neigh.Attributes(j);
+ double w = w_vec[j];
+ if (norm_)
+ if (tot != 0) w = w/tot;
+ attr.Weight (w);
+ imp->setConnectionAttributes (object_id, neigh[j], attr);
+
+ }
+ }
+ }
+ return true;
+}
+
+
+
+bool TeProxMatrixNoWeightsStrategy::
+ComputeWeigths (TeProxMatrixImplementation* imp)
+{
+ if (imp == 0) return false;
+ // Normalize
+ if (norm_)
+ {
+ for (int obj = 0; obj < imp->NumberOfObjects(); obj++)
+ {
+ TeNeighbours neigh;
+ string object_id;
+ TeProxMatrixAttributes attr;
+ if (imp->getNeighbours (obj, object_id, neigh))
+ {
+
+ for (int j = 0; j < neigh.size(); j++)
+ {
+ double size = (double) neigh.size();
+ double w = 1.0/size;
+ TeProxMatrixAttributes attr = neigh.Attributes(j);
+
+ attr.Weight (w);
+ imp->setConnectionAttributes(object_id, neigh[j], attr);
+ }
+ }
+ }
+ }
+ return true;
+}
+
diff --git a/src/terralib/kernel/TeProxMatrixWeightsStrategy.h b/src/terralib/kernel/TeProxMatrixWeightsStrategy.h
new file mode 100644
index 0000000..d6dc65d
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixWeightsStrategy.h
@@ -0,0 +1,154 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeProxMatrixWeightsStrategy.h
+ This file contains structures and definitions about weight strategies of proximity matrix
+*/
+
+
+#ifndef TeProxMatrixWeightsStrategy_H
+#define TeProxMatrixWeightsStrategy_H
+
+#include "TeProxMatrixImplementation.h"
+#include <vector>
+
+
+//! An abstract class to representate weight strategies of proximity matrix
+class TeProxMatrixWeightsStrategy
+{
+protected:
+ bool norm_;
+
+ //! Constructor
+ TeProxMatrixWeightsStrategy(bool norm = false) { norm_ = norm; }
+
+public:
+ //! Compute weigths
+ virtual bool ComputeWeigths (TeProxMatrixImplementation* /* imp */) {return true;}
+
+ //! Destructor
+ virtual ~TeProxMatrixWeightsStrategy() {}
+
+ //! Verify if is equal
+ virtual bool IsEqual (const TeProxMatrixWeightsStrategy& /* rhs */) const {return true;}
+
+ //! Equal operator
+ virtual bool operator== (const TeProxMatrixWeightsStrategy& /* rhs */) const {return true;}
+
+};
+
+//! A class to implement the no weight strategy of proximity matrix (i.e., all weights are 1, only indicating that a connection exists).
+class TeProxMatrixNoWeightsStrategy : public TeProxMatrixWeightsStrategy
+{
+
+public:
+
+ //! Constructor
+ TeProxMatrixNoWeightsStrategy (bool norm = true) {norm_ = norm;}
+
+ //! Compute weigths
+ virtual bool ComputeWeigths (TeProxMatrixImplementation* imp);
+
+ //! Destructor
+ ~TeProxMatrixNoWeightsStrategy() {}
+};
+
+
+//! A class to implement the inverse distance weight strategy of proximity matrix; if network distances were computed, they can be also considered.
+//! Formula: w = (a*1/dist_centroids + b*1/dist_to_net + c*1/dist_net_connection)*factor
+//! These values can be normalized or not.
+class TeProxMatrixInverseDistanceStrategy : public TeProxMatrixWeightsStrategy
+{
+private:
+ double a_;
+ double b_;
+ double c_;
+ double factor_;
+
+public:
+
+ //! Constructor
+ TeProxMatrixInverseDistanceStrategy (double a = 1.0, double b = 1.0, double c = 1.0, double factor = 1.0, bool norm = true) : TeProxMatrixWeightsStrategy (norm)
+ { a_ = a; b_ = b; c_ = c; factor_ = factor;}
+
+ //! Compute weights
+ virtual bool ComputeWeigths (TeProxMatrixImplementation* imp);
+
+ //! Destructor
+ ~TeProxMatrixInverseDistanceStrategy() {}
+};
+
+
+//! A class to implement the inverse distance weight strategy of proximity matrix; if network distances were computed, they can be also considered.
+//! Formula: w = (a*1/(dist_centroids)2 + b*1/(dist_to_net)2 + c*1/(dist_net_connection)2)*factor
+//! These values can be normalized or not.
+class TeProxMatrixSquaredInverseDistanceStrategy : public TeProxMatrixWeightsStrategy
+{
+private:
+ double a_;
+ double b_;
+ double c_;
+ double factor_;
+
+public:
+
+ //! Constructor
+ TeProxMatrixSquaredInverseDistanceStrategy (double a = 1.0, double b = 1.0, double c = 1.0, double factor = 1.0, bool norm = true) : TeProxMatrixWeightsStrategy (norm)
+ { a_ = a; b_ = b; c_ = c; factor_ = factor;}
+
+ //! Compute weights
+ virtual bool ComputeWeigths (TeProxMatrixImplementation* imp);
+
+ //! Destructor
+ ~TeProxMatrixSquaredInverseDistanceStrategy() {}
+};
+
+
+//! A class to implement the connection strenght weight strategy of proximity matrix
+//! If centroids distance is smaller them max_local_distance, w will be only the local distance inverse (multiplied by factor).
+//! otherwise, it will be w = 1/(dist_ratio*dist_to_net + dist_net_connection)*factor.
+class TeProxMatrixConnectionStrenghtStrategy : public TeProxMatrixWeightsStrategy
+{
+private:
+ double dist_ratio_;
+ double max_local_distance_;
+ double factor_;
+public:
+
+ //! Constructor
+ TeProxMatrixConnectionStrenghtStrategy (double dist_ratio = 1.0, double max_local_distance = 0.0, double factor = 1.0, bool norm = true)
+ : TeProxMatrixWeightsStrategy (norm)
+ {
+ dist_ratio_ = dist_ratio;
+ max_local_distance_ = max_local_distance;
+ factor_ = factor;
+ }
+
+ //! Compute weights
+ virtual bool ComputeWeigths (TeProxMatrixImplementation* imp);
+
+ //! Destructor
+ ~TeProxMatrixConnectionStrenghtStrategy() {}
+};
+
+#endif
diff --git a/src/terralib/kernel/TeQuerier.cpp b/src/terralib/kernel/TeQuerier.cpp
new file mode 100644
index 0000000..296de88
--- /dev/null
+++ b/src/terralib/kernel/TeQuerier.cpp
@@ -0,0 +1,146 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerier.h"
+#include "TeQuerierImpl.h"
+
+
+TeQuerier::TeQuerier(TeQuerierParams& params)
+{
+ Impl_ = TeQuerierImplFactory::make(params);
+}
+
+TeQuerier::~TeQuerier()
+{
+ if(Impl_)
+ delete (Impl_);
+}
+
+bool
+TeQuerier::loadInstances(int frame)
+{
+ if(!Impl_)
+ return false;
+
+ return(Impl_->loadTimeFrameInstances(frame));
+}
+
+
+bool
+TeQuerier::fetchInstance(TeSTInstance& sto)
+{
+ if(!Impl_)
+ return false;
+
+ return(Impl_->fetchInstance(sto));
+}
+
+
+int
+TeQuerier::getNumTimeFrames()
+{
+ if(!Impl_)
+ return false;
+
+ return (Impl_->getNumTimeFrames());
+}
+
+bool
+TeQuerier::getTSEntry(TeTSEntry& tsEntry, int frame)
+{
+ if(!Impl_)
+ return false;
+
+ return(Impl_->getTSEntry(tsEntry, frame));
+}
+
+
+bool
+TeQuerier::getTS(TeTemporalSeries& ts)
+{
+ if(!Impl_)
+ return false;
+
+ return (Impl_->getTS(ts));
+}
+
+TeTheme*
+TeQuerier::theme()
+{
+ if(!Impl_)
+ return 0;
+
+ return(Impl_->theme());
+}
+
+
+int
+TeQuerier::numElemInstances()
+{
+ if(!Impl_)
+ return 0;
+
+ return (Impl_->numElemInstances());
+}
+
+TeQuerierParams&
+TeQuerier::params()
+{
+ return (Impl_->params());
+}
+
+TeTSParams&
+TeQuerier::getTSParams()
+{
+ return (Impl_->getTSParams());
+}
+
+void
+TeQuerier::clear()
+{
+ if(!Impl_)
+ return;
+
+ Impl_->clear();
+}
+
+TeAttributeList
+TeQuerier::getAttrList()
+{
+ TeAttributeList temp;
+ if(!Impl_)
+ return temp;
+
+ return (Impl_->getAttrList());
+}
+
+void
+TeQuerier::refresh(TeQuerierParams& params)
+{
+ if(Impl_)
+ delete (Impl_);
+
+ Impl_ = TeQuerierImplFactory::make(params);
+}
+
+
diff --git a/src/terralib/kernel/TeQuerier.h b/src/terralib/kernel/TeQuerier.h
new file mode 100644
index 0000000..a328a4a
--- /dev/null
+++ b/src/terralib/kernel/TeQuerier.h
@@ -0,0 +1,94 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QUERIER_H
+#define __TERRALIB_INTERNAL_QUERIER_H
+
+#include "TeSTInstance.h"
+#include "TeTemporalSeries.h"
+
+class TeQuerierParams;
+class TeQuerierImpl;
+
+//! A class to build spatial temporal instances (STInstance) from different sources
+class TeQuerier
+{
+
+ protected:
+ TeQuerierImpl* Impl_; //! handle/bory pattern
+
+ public:
+
+ //! Empty constructor
+ TeQuerier():
+ Impl_(0)
+ {}
+
+ //! Constructor
+ TeQuerier(TeQuerierParams& params);
+
+ //! Destructor
+ ~TeQuerier();
+
+ //! Returns the theme
+ TeTheme* theme();
+
+ //! Loads the STInstances. If frame>-1, loads only the instances of the frame-�simo frame
+ bool loadInstances(int frame=-1);
+
+ //! Returns each spatial temporal instance
+ bool fetchInstance(TeSTInstance& sto);
+
+ //! Return the number of time frames generated by the chronon
+ int getNumTimeFrames();
+
+ //! Gets each temporal serie entry, for each time frame
+ bool getTSEntry(TeTSEntry& tsEntry, int frame);
+
+ //! Gets the full temporal serie
+ bool getTS(TeTemporalSeries& ts);
+
+ //! Returns the temporal serie params
+ TeTSParams& getTSParams();
+
+ //! Gets the attribute list from querier
+ TeAttributeList getAttrList();
+
+ //! Returns the number of instances to each time frame
+ int numElemInstances();
+
+ //! Returns the querier parameters
+ TeQuerierParams& params();
+
+ //! Empties querier instances
+ void clear();
+
+ //! Refresh the querier based in new querier params
+ void refresh(TeQuerierParams& params);
+};
+
+
+#endif
+
+
+
diff --git a/src/terralib/kernel/TeQuerierDB.cpp b/src/terralib/kernel/TeQuerierDB.cpp
new file mode 100644
index 0000000..808faed
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDB.cpp
@@ -0,0 +1,362 @@
+
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerierDB.h"
+#include "TeDatabase.h"
+#include "TeSTInstance.h"
+#include "TeTemporalSeries.h"
+
+
+// Add geometries from portal to STO
+bool
+addGeometry(TeDatabasePortal* portal, TeGeomRep geomRep, TeSTInstance& sto, const string& geomTable)
+{
+ bool flag=false;
+ vector<int> geomIds;
+
+ string ObjId;
+ if(geomTable.empty())
+ ObjId = "object_id";
+ else
+ ObjId = geomTable +".object_id";
+
+ do
+ {
+ int gId = portal->getInt("geom_id");
+ if(find(geomIds.begin(), geomIds.end(), gId) == geomIds.end())
+ {
+ geomIds.push_back(gId);
+ if(geomRep == TePOLYGONS)
+ {
+ TePolygon pol;
+ flag = portal->fetchGeometry(pol);
+ sto.addGeometry(pol);
+ }
+ else if (geomRep==TeLINES)
+ {
+ TeLine2D lin;
+ flag = portal->fetchGeometry(lin);
+ sto.addGeometry(lin);
+ }
+ else if (geomRep == TePOINTS)
+ {
+ TePoint point;
+ flag = portal->fetchGeometry(point);
+ sto.addGeometry(point);
+ }
+ else if (geomRep == TeCELLS)
+ {
+ TeCell cell;
+ flag = portal->fetchGeometry(cell);
+ sto.addGeometry(cell);
+ }
+ }
+ else
+ flag = portal->fetchRow();
+
+ }while(flag && (string(portal->getData(ObjId)) == sto.objectId()));
+
+ return flag;
+}
+
+// Add geometries from portal to STO considering the time value
+bool
+addGeometry(TeDatabasePortal* portal, TeGeomRep geomRep, TeSTInstance& sto, const string& geomTable,
+ TeTimeInterval time, const string& initalTimeName, const string& finalTimeName)
+{
+ bool flag=false;
+ vector<int> geomIds;
+ TeTime t1 = time.getT1();
+ TeTime t2 = time.getT2();
+ string ObjId;
+ if(geomTable.empty())
+ ObjId = "object_id";
+ else
+ ObjId = geomTable +".object_id";
+
+ do
+ {
+ int gId = portal->getInt("geom_id");
+ if(find(geomIds.begin(), geomIds.end(), gId) == geomIds.end())
+ {
+ geomIds.push_back(gId);
+ if(geomRep == TePOLYGONS)
+ {
+ TePolygon pol;
+ flag = portal->fetchGeometry(pol);
+ sto.addGeometry(pol);
+ }
+ else if (geomRep==TeLINES)
+ {
+ TeLine2D lin;
+ flag = portal->fetchGeometry(lin);
+ sto.addGeometry(lin);
+ }
+ else if (geomRep == TePOINTS)
+ {
+ TePoint point;
+ flag = portal->fetchGeometry(point);
+ sto.addGeometry(point);
+ }
+ else if (geomRep == TeCELLS)
+ {
+ TeCell cell;
+ flag = portal->fetchGeometry(cell);
+ sto.addGeometry(cell);
+ }
+ }
+ else
+ flag = portal->fetchRow();
+
+ }while ( flag &&
+ (string(portal->getData(ObjId)) == sto.objectId()) &&
+ portal->getDate(initalTimeName) == t1 &&
+ portal->getDate(finalTimeName) == t2 );
+
+ return flag;
+}
+
+
+TeQuerierDB::~TeQuerierDB()
+{
+ for(unsigned int i=0; i<portals_.size(); ++i)
+ delete (portals_[i]);
+
+ portals_.clear();
+ geomRepr_.clear();
+}
+
+
+void
+TeQuerierDB::clearVectors()
+{
+ vector<TeDatabasePortal*>::iterator itPortal = portals_.begin();
+ while(itPortal!=portals_.end())
+ {
+ delete (*itPortal);
+ ++itPortal;
+ }
+
+ portals_.clear();
+ geomRepr_.clear();
+ flagPortal_ = false;
+}
+
+void
+TeQuerierDB::clear()
+{
+ clearVectors();
+}
+
+
+string
+TeQuerierDB::sqlWhereRestrictions(TeRepresentation* rep)
+{
+ Keys objs;
+ string whereClause= " 1 = 1 ";
+ TeDatabase* db = params_.theme()->layer()->database();
+ if(!db)
+ return "";
+
+ // load the first representation
+ if(!rep)
+ rep = (params_.theme()->layer()->vectRepres())[0];
+
+ // spatial restriction with other geometry representation
+ if (params_.hasSpatialRes() && rep)
+ {
+ if(params_.boxRest().isValid())
+ {
+ TeBox b = params_.boxRest();
+ TeGeomRep gRep = rep->geomRep_;
+ whereClause += " AND "+ db->getSQLBoxWhere(b, gRep);
+ }
+ else if(params_.geomRest())
+ {
+ string geomTableRest = params_.theme()->layer()->tableName(params_.geomRepRest());
+ TePrecision::instance().setPrecision(TeGetPrecision(params_.theme()->layer()->projection()));
+
+ if((db->spatialRelation(geomTableRest, params_.geomRepRest(), params_.geomRest(),
+ objs, params_.spatialRelation())) && (!objs.empty()))
+ {
+ string obs;
+ for(unsigned int i=0; i<objs.size(); i++)
+ {
+ if(i!=0)
+ obs += ",";
+ obs += "'"+ objs[i] +"'";
+ }
+
+ whereClause += " AND "+ rep->tableName_ +".object_id IN ("+ obs +")";
+ }
+ else
+ whereClause += " AND 1 <> 1 "; // no geometry was found
+
+ }
+ }
+
+ //selected objects
+ switch (params_.selectedObjs())
+ {
+ case TeAll:
+ break;
+
+ case TeSelectedByPointing:
+ whereClause += " AND (grid_status = 1 OR grid_status = 3";
+ whereClause += " OR (grid_status IS NULL AND (c_object_status = 1 OR c_object_status = 3)))";
+ break;
+
+ case TeNotSelectedByPointing:
+ whereClause += " AND (grid_status = 0 OR grid_status = 2";
+ whereClause += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 2)))";
+ break;
+
+ case TeSelectedByQuery:
+ whereClause += " AND (grid_status = 2 OR grid_status = 3";
+ whereClause += " OR (grid_status is null AND (c_object_status = 2 OR c_object_status = 3)))";
+ break;
+
+ case TeNotSelectedByQuery:
+ whereClause += " AND (grid_status = 0 OR grid_status = 1";
+ whereClause += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 1)))";
+ break;
+
+ case TeGrouped:
+ whereClause += " AND c_legend_id <> 0";
+ break;
+
+ case TeNotGrouped:
+ whereClause += " AND c_legend_id = 0";
+ break;
+ }
+
+ return whereClause;
+}
+
+
+string
+TeQuerierDB::sqlFrom(string geomTable)
+{
+ string fromPar = "";
+ string fromClause = "";
+
+ //get collection tables
+ string collAuxTable = params_.theme()->collectionAuxTable();
+ string collTable = params_.theme()->collectionTable();
+
+ if(attrTable_.name().empty() || collAuxTable.empty() || collTable.empty())
+ return "";
+
+ string uniqueIdName = attrTable_.name() +"."+ attrTable_.uniqueName();
+ string linkName;
+ if(attrTable_.tableType() != TeAttrExternal)
+ linkName = attrTable_.name() +"."+ attrTable_.linkName();
+ else
+ linkName = collTable +".c_object_id ";
+
+ //load geometry table if there is spatial restriction
+ if(geomTable.empty() && params_.hasSpatialRes())
+ {
+ TeRepresentation* rep = (theme()->layer()->vectRepres())[0];
+ geomTable = theme()->layer()->tableName(rep->geomRep_);
+ }
+
+ //get the extern table position
+ int posExtern = -1;
+ TeAttrTableVector attr = params_.theme()->attrTables();
+ for(unsigned int i=0; i<attr.size(); ++i)
+ {
+ if(attr[i].tableType() == TeAttrExternal)
+ ++posExtern;
+ }
+
+ //if the table is temporal
+ if((attrTable_.tableType()==TeAttrEvent) || (attrTable_.tableType()==TeFixedGeomDynAttr))
+ {
+ fromPar += "(";
+ fromClause = attrTable_.name()+" RIGHT JOIN "+ collAuxTable;
+ fromClause += " ON "+ uniqueIdName +" = ";
+
+ if(attrTable_.tableType()==TeFixedGeomDynAttr)
+ fromClause += collAuxTable +".aux0 )";
+ else
+ fromClause += collAuxTable +".unique_id )";
+
+ if(!geomTable.empty())
+ {
+ fromPar += "(";
+ fromClause += " LEFT JOIN "+ geomTable +" ON ";
+ fromClause += collAuxTable +".object_id = "+ geomTable +".object_id )";
+ }
+
+ if(params_.selectedObjs() != TeAll) //! join with collection table
+ {
+ fromPar += "(";
+ fromClause += " LEFT JOIN "+ collTable +" ON ";
+ fromClause += collAuxTable +".object_id = "+ collTable +".c_object_id )";
+ }
+ }
+
+ else if (attrTable_.tableType()==TeAttrStatic)
+ {
+ fromPar += "(";
+ fromClause = attrTable_.name()+" RIGHT JOIN "+ collTable;
+ fromClause += " ON "+ linkName +" = "+ collTable +".c_object_id)";
+
+ if(!geomTable.empty()) //! join with geometry table
+ {
+ fromPar += "(";
+ fromClause += " LEFT JOIN "+ geomTable +" ON ";
+ fromClause += collTable +".c_object_id = "+ geomTable +".object_id )";
+ }
+
+ if(params_.selectedObjs() != TeAll) //! join with collection table
+ {
+ fromPar += "(";
+ fromClause += " LEFT JOIN "+ collAuxTable +" ON ";
+ fromClause += collTable +".c_object_id = "+ collAuxTable +".object_id )";
+ }
+ }
+ else if (attrTable_.tableType()==TeAttrExternal)
+ {
+ fromPar += "((";
+ fromClause = collAuxTable +" RIGHT JOIN "+ collTable;
+ fromClause += " ON "+ collAuxTable +".object_id = "+ collTable +".c_object_id )";
+ fromClause += " LEFT JOIN "+ attrTable_.name() +" ON ";
+ fromClause += collAuxTable +".aux"+ Te2String(posExtern) +" = ";
+ fromClause += uniqueIdName +" )";
+
+ if(!geomTable.empty()) //! join with geometry table
+ {
+ fromPar += "(";
+ fromClause += " LEFT JOIN "+ geomTable +" ON ";
+ fromClause += collTable +".c_object_id = "+ geomTable +".object_id )";
+ }
+ }
+
+ return (fromPar+fromClause);
+}
+
+
+
diff --git a/src/terralib/kernel/TeQuerierDB.h b/src/terralib/kernel/TeQuerierDB.h
new file mode 100644
index 0000000..4ae63e9
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDB.h
@@ -0,0 +1,91 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QUERIER_DB_H
+#define __TERRALIB_INTERNAL_QUERIER_DB_H
+
+#include "TeQuerierImpl.h"
+
+class TeDatabasePortal;
+class TeTimeInterval;
+class TeTSEntry;
+
+
+//! auxiliary functions to add geometries in the sto
+bool addGeometry(TeDatabasePortal* portal, TeGeomRep geomRep, TeSTInstance& sto, const string& geomTable = "");
+bool addGeometry(TeDatabasePortal* portal, TeGeomRep geomRep, TeSTInstance& sto, const string& geomTable,
+ TeTimeInterval time, const string& initalTimeName, const string& finalTimeName);
+
+
+//! An abstract class to build STOs (Spatial Temporal Objects) from a TerraLib database
+class TeQuerierDB : public TeQuerierImpl
+{
+ protected:
+
+ vector<TeDatabasePortal*> portals_; //! a portal to each geometry representation
+ vector<TeRepresentation> geomRepr_; //! keep the geometry representation of each portal
+ TeTable attrTable_; //! internal information used to fill the stos
+ bool flagPortal_; //! flag to control the portal
+
+ //! clear internal vectors
+ void clearVectors();
+
+ //! Return a where clause in SQL that represent the querier restrictions
+ string sqlWhereRestrictions(TeRepresentation* rep=0);
+
+ //! Build the sql from clause
+ string sqlFrom(string geomTable="");
+
+ public:
+
+ //! Constructor
+ TeQuerierDB(TeQuerierParams& params): TeQuerierImpl(params), flagPortal_(false)
+ {}
+
+ //! Destructor
+ virtual ~TeQuerierDB();
+
+ //! Returns the pointer to the theme
+ TeTheme* theme() { return params_.theme(); }
+
+ //! Returns the pointer to the layer
+ TeLayer* layer() { return params_.theme()->layer(); }
+
+ //! Returns the geometry representation of the theme
+ TeGeomRep geometryRep()
+ { return TeGeomRep(params_.theme()->layer()->geomRep()); }
+
+ //! Loads the STOs
+ virtual bool loadInstances(TeTSEntry* ent=0) = 0;
+
+ //! Returns each loaded STO
+ virtual bool fetchInstance(TeSTInstance& stoi)= 0;
+
+ //! Empties querier instances
+ void clear();
+
+
+};
+
+
+#endif
diff --git a/src/terralib/kernel/TeQuerierDBStr1.cpp b/src/terralib/kernel/TeQuerierDBStr1.cpp
new file mode 100644
index 0000000..3109c59
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDBStr1.cpp
@@ -0,0 +1,1018 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerierDBStr1.h"
+#include "TeDatabase.h"
+#include "TeTemporalSeries.h"
+#include "TeSTInstance.h"
+
+bool
+TeQuerierDBStr1::initPortal(TeRepresentation& rep, TeTSEntry* ent)
+{
+ string selectClause, fromClause, whereClause, orderByClause, groupByClause, parClause;
+ TeDatabase* db = params_.theme()->layer()->database();
+ isGroup_ = false;
+
+ //verify if the theme has collection table
+ bool hasCollTable = false;
+ if(db->tableExist(params_.theme()->collectionAuxTable()))
+ hasCollTable = true;
+
+ clearVectors();
+ params_.setLoadAttrs(params_.loadSetedAttrs()); //the original data
+
+ //get the link name
+ string sqlGroup ="";
+ if(hasCollTable && (!params_.hasSpatialRes()) && (!params_.loadGeom()))
+ {
+ linkName_ = params_.theme()->collectionTable() +".c_object_id";
+ sqlGroup = linkName_;
+ }
+ else //has spatial restriction
+ {
+ linkName_ = rep.tableName_ +".object_id";
+ sqlGroup = linkName_ +","+ rep.tableName_ +".geom_id";
+ geomRepr_.push_back(rep);
+ }
+
+ // order by clause
+ orderByClause = " ORDER BY "+ sqlGroup;
+
+ //verify if will be group the objects
+ TeGroupingAttr groups = params_.groupAttr();
+ bool groupAttr = !(groups.empty());
+
+ // --------------------------------------------- Mount SQL
+
+ // --------- begin attributes
+
+ // load only the attribute that will be grouped
+ if(groupAttr)
+ {
+ if(!params_.loadGeom())
+ {
+ string sGroup = db->getSQLStatistics(groups);
+ isGroup_ = true;
+ TeGroupingAttr::iterator it = groups.begin();
+ while(it!= groups.end())
+ {
+ if(it->second != TeNOSTATISTIC)
+ isGroup_ = false;
+ ++it;
+ }
+
+ if(isGroup_)
+ {
+ selectClause = sGroup;
+ orderByClause = "";
+ }
+
+ //if there is a spatial restriction, group every objects
+ if(!params_.hasSpatialRes())
+ groupByClause = " GROUP BY "+ linkName_;
+ }
+
+ if(!isGroup_)
+ {
+ //group attributes in memory
+ groupInMemory_ = true;
+ //fill select clause from set of attributes
+ string lastAttr = "";
+ TeGroupingAttr::iterator it = groups.begin();
+ while(it!= groups.end())
+ {
+ if(lastAttr != it->first.name_)
+ {
+ if(it != groups.begin())
+ selectClause += ",";
+
+ selectClause += it->first.name_;
+ }
+
+ lastAttr = it->first.name_;
+ ++it;
+ }
+ }
+ }
+ // load all attributes or the attributes that are in the vector
+ else
+ {
+ //get attribute tables
+ TeAttrTableVector atts;
+ params_.theme()->getAttTables(atts);
+ if(atts.empty() && (params_.loadAllAttr() || (!params_.loadAttrs().empty())))
+ return false;
+
+ // get some information about the attribute tables required
+ for(unsigned int i=0; i<atts.size(); i++)
+ {
+ string initialTime, finalTime;
+
+ if((atts[i].tableType()==TeAttrEvent) || (atts[i].tableType()==TeFixedGeomDynAttr))
+ {
+ attrTable_ = atts[i];
+ initialTime = attrTable_.attInitialTime();
+ finalTime = attrTable_.attFinalTime();
+ }
+
+ // fill vector of unique name
+ string unName = TeConvertToUpperCase(atts[i].uniqueName());
+ string unNameT = TeConvertToUpperCase(atts[i].name()+"."+atts[i].uniqueName());
+ uniqueNames_.push_back(unName);
+ uniqueNames_.push_back(unNameT);
+
+ //fill vector of attributes and sql string with all attributes
+ if(params_.loadAllAttr())
+ {
+ TeAttributeList::iterator itAttr = atts[i].attributeList().begin();
+ while(itAttr!= atts[i].attributeList().end())
+ {
+ string attribute = atts[i].name() +"."+ (*itAttr).rep_.name_;
+ params_.loadAttrs().push_back(attribute);
+ params_.loadAttrs().push_back((*itAttr).rep_.name_);
+
+ //select clause
+ if(!selectClause.empty())
+ selectClause += ", ";
+ selectClause += attribute;
+
+ ++itAttr;
+ }
+ }
+ //only fill the sql string with the attributes of the TeSTInstance
+ else // make sure the unique and temporal columns are retrieved
+ {
+ string un = atts[i].name()+"."+ atts[i].uniqueName();
+ if (find(params_.loadAttrs().begin(), params_.loadAttrs().end(), un) == params_.loadAttrs().end())
+ {
+ if(!selectClause.empty())
+ selectClause += ", ";
+ selectClause += un;
+ }
+
+ string ini = atts[i].name()+"."+initialTime;
+ if (!initialTime.empty() && (find(params_.loadAttrs().begin(), params_.loadAttrs().end(), ini) == params_.loadAttrs().end()))
+ {
+ if(!selectClause.empty())
+ selectClause += ", ";
+ selectClause += ini;
+ }
+
+ string fin = atts[i].name()+"."+finalTime;
+ if (!finalTime.empty() && initialTime != finalTime &&
+ (find(params_.loadAttrs().begin(), params_.loadAttrs().end(), fin) == params_.loadAttrs().end()))
+ {
+ if(!selectClause.empty())
+ selectClause += ", ";
+ selectClause += fin;
+ }
+ }
+ }
+
+ if(!params_.loadAllAttr())
+ {
+ vector<string> newNames;
+ vector<string>::iterator itVec = params_.loadAttrs().begin();
+ while(itVec!=params_.loadAttrs().end())
+ {
+ //insert in select clause
+ if(!selectClause.empty())
+ selectClause += ", ";
+ selectClause += (*itVec);
+
+ //insert in the attribute name vector without table name
+ size_t pos = (*itVec).find(".", string::npos,1);
+ if (pos != string::npos)
+ {
+ string newNam = (*itVec).substr(pos+1);
+ newNames.push_back(newNam);
+ }
+ ++itVec;
+ }
+
+ itVec = newNames.begin();
+ while(itVec!=newNames.end())
+ {
+ params_.loadAttrs().push_back(*itVec);
+ ++itVec;
+ }
+ }
+ }
+
+ // selecionar o campo de data tamb�m
+ if(groupInMemory_ && params_.loadGeom() && (!attrTable_.name().empty()))
+ {
+ selectClause += ", "+ attrTable_.name()+"."+attrTable_.attInitialTime();
+ if(attrTable_.attInitialTime()!=attrTable_.attFinalTime())
+ selectClause += ", "+ attrTable_.name()+"."+attrTable_.attFinalTime();
+ }
+
+ // --------- end attributes
+
+
+ // --------- begin geometry
+
+ if(!selectClause.empty())
+ selectClause += ", ";
+
+ // select com todos os campos da tabela de geometria
+ if(params_.loadGeom())
+ {
+ TeTable table;
+ if(!db->loadTable(rep.tableName_, table))
+ return false;
+
+ vector<string> attrs;
+ table.attributeNames(attrs);
+ for(unsigned int i=0; i<attrs.size(); ++i)
+ {
+ if(i>0)
+ selectClause += ",";
+ selectClause += rep.tableName_+"."+ attrs[i];
+ }
+
+ // order by clause
+ if((rep.geomRep_ == TePOLYGONS) && (db->dbmsName() != "OracleSpatial") && (db->dbmsName() != "PostGIS") )
+ orderByClause += ", parent_id ASC, num_holes DESC";
+
+ }
+ // select apenas com object_id e geom_id
+ else if(isGroup_)
+ {
+ if(params_.hasSpatialRes())
+ selectClause += " MIN("+ linkName_ +") AS terraObjId, MIN("+ rep.tableName_ +".geom_id) AS geom_id ";
+ else
+ selectClause += " MIN("+ linkName_ +") AS terraObjId ";
+
+ linkName_ = "terraObjId";
+ }
+ else
+ selectClause += sqlGroup;
+
+ // --------- end geometry
+
+ // --------- begin restrictions
+ if(!hasCollTable)
+ {
+ TeAttrTableVector atts;
+ params_.theme()->getAttTables(atts);
+
+ if(atts.empty())
+ return false;
+
+ fromClause = " FROM " + tableJoin(atts, rep.tableName_, "object_id");
+ whereClause = params_.theme()->sqlWhereRestrictions(&rep);
+ }
+ else
+ {
+ if(params_.loadGeom() || params_.hasSpatialRes())
+ fromClause = params_.theme()->sqlGridFrom(rep.tableName_);
+ else
+ fromClause = params_.theme()->sqlGridFrom();
+ }
+
+
+ if(ent)
+ {
+ if(attrTable_.name().empty())
+ params_.theme()->getTemporalTable(attrTable_);
+
+ string iniTime = attrTable_.name()+"."+attrTable_.attInitialTime();
+ string finTime = attrTable_.name()+"."+attrTable_.attFinalTime();
+ if(!whereClause.empty())
+ whereClause += " AND ";
+
+ if ((params_.chronon()==TeMONTHOFYEAR) || (params_.chronon()==TeDAYOFWEEK))
+ whereClause += db->getSQLTemporalWhere(ent->timeInt_, ent->timeInt_, params_.chronon(), TeTIMEDURING, iniTime, finTime);
+ else
+ {
+ TeTimeInterval interval = ent->time_;
+ interval.intervalChronon(params_.chronon());
+
+ whereClause += db->getSQLTemporalWhere(interval, TeTIMEDURING, iniTime, finTime);
+ }
+ }
+
+ // --------- end restrictions
+
+ //where clause
+ if(!objectId().empty())
+ {
+ if(!whereClause.empty())
+ whereClause += " AND ";
+
+ whereClause += linkName_ +" = '"+ objectId() +"'";
+ }
+
+
+ //---------- querier restriction
+ string sqlQuerierRest = sqlWhereRestrictions(&rep);
+ if(!whereClause.empty())
+ whereClause += " AND ";
+
+ whereClause += sqlQuerierRest;
+
+ //----------
+
+ string sql = "SELECT "+ selectClause + fromClause;
+ if(!whereClause.empty())
+ sql += " WHERE "+ whereClause;
+
+ if(!groupByClause.empty())
+ sql += " "+ groupByClause;
+ else
+ sql += orderByClause;
+
+ // --------- Submit the query
+ portals_.clear();
+ TeDatabasePortal* portal = db->getPortal();
+
+ if(!portal)
+ return false;
+
+ if(!portal->query(sql))
+ {
+ delete (portal);
+ flagPortal_ = false;
+ return false;
+ }
+
+ if(!portal->fetchRow())
+ {
+ delete (portal);
+ flagPortal_ = false;
+ return false;
+ }
+
+ string id = portal->getData(linkName_);
+ if(id.empty())
+ {
+ delete (portal);
+ flagPortal_ = false;
+ return false;
+ }
+
+ portals_.push_back (portal);
+ flagPortal_ = true;
+ lastObjId_ ="";
+ return true;
+}
+
+
+bool
+TeQuerierDBStr1::initGeomPortal(TeRepresentation& rep, TeTSEntry* ent)
+{
+ string selectClause, fromClause, whereClause, orderByClause, parClause;
+ string initialTime, finalTime;
+ string uniqueName;
+
+ TeDatabase* db = params_.theme()->layer()->database();
+
+ //------- Get geometry table
+ geomRepr_.push_back(rep);
+ if(rep.tableName_.empty())
+ return false;
+
+ selectClause = rep.tableName_ +".* ";
+ orderByClause = " ORDER BY "+ rep.tableName_ +".object_id ";
+
+ if((rep.geomRep_ == TePOLYGONS) && (db->dbmsName() != "OracleSpatial") && (db->dbmsName() != "PostGIS") )
+ orderByClause += " , parent_id ASC, num_holes DESC";
+
+ //------- Get temporal attribute
+ if(!attrTable_.name().empty())
+ {
+ initialTime = attrTable_.name() +"."+ attrTable_.attInitialTime ();
+ finalTime = attrTable_.name() +"."+ attrTable_.attFinalTime ();
+
+ // fill vector of unique name
+ uniqueName = TeConvertToUpperCase(attrTable_.name()+"."+attrTable_.uniqueName());
+
+ selectClause += ", "+ attrTable_.name()+"."+ attrTable_.uniqueName();
+ selectClause += ", "+ attrTable_.name()+"."+initialTime;
+
+ if (initialTime != finalTime)
+ selectClause += ", "+ attrTable_.name()+"."+finalTime;
+ }
+
+ if(!db->tableExist(params_.theme()->collectionAuxTable()))
+ {
+ TeAttrTableVector atts;
+ params_.theme()->getAttTables(atts);
+
+ if(atts.empty())
+ return false;
+
+ fromClause = " FROM " + tableJoin(atts, rep.tableName_, "object_id");
+ whereClause = params_.theme()->sqlWhereRestrictions(&rep);
+ }
+ else
+ fromClause = params_.theme()->sqlGridFrom(rep.tableName_);
+
+ if(ent)
+ {
+ string iniTime = attrTable_.name()+"."+initialTime;
+ string finTime = attrTable_.name()+"."+finalTime;
+ if(!whereClause.empty())
+ whereClause += " AND ";
+
+ if ((params_.chronon()==TeMONTHOFYEAR) || (params_.chronon()==TeDAYOFWEEK))
+ whereClause += db->getSQLTemporalWhere(ent->timeInt_, ent->timeInt_, params_.chronon(), TeTIMEDURING, iniTime, finTime);
+ else
+ {
+ TeTimeInterval interval = ent->time_;
+ interval.intervalChronon(params_.chronon());
+
+ whereClause += db->getSQLTemporalWhere(interval, TeTIMEDURING, iniTime, finTime);
+ }
+ }
+
+ //where clause
+ if(!objectId().empty())
+ {
+ if(!whereClause.empty())
+ whereClause += " AND ";
+
+ whereClause += rep.tableName_+".object_id = '"+ objectId() +"'";
+ }
+
+ //---------- querier restriction
+ string sqlQuerierRest = sqlWhereRestrictions(&rep);
+ if(!whereClause.empty())
+ whereClause += " AND ";
+
+ whereClause += sqlQuerierRest;
+
+ //----------
+
+ string sql = "SELECT "+ selectClause + fromClause;
+ if(!whereClause.empty())
+ sql += " WHERE "+ whereClause;
+ sql += orderByClause;
+
+ //------ Submit the query
+ TeDatabasePortal* portal = db->getPortal();
+ if(!portal)
+ return false;
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ if(!portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ portals_.push_back (portal);
+ return true;
+}
+
+
+// ---------- final - initPortal
+
+// It is used in two cases:
+// 1) when it must return all instances of an object
+// 2) when the attributes was grouped by sql functions - without geometry
+
+bool
+TeQuerierDBStr1::fillSTOGrouped(TeSTInstance& sto, bool fetchInstance)
+{
+ if(portals_.empty())
+ return false;
+
+ TeDatabasePortal* portal = portals_[0];
+ if(!portal)
+ return false;
+
+ TeRepresentation* rep = 0;
+ if(!geomRepr_.empty())
+ rep = &(geomRepr_[0]);
+
+ if(!flagPortal_)
+ {
+ clearVectors();
+ return false;
+ }
+
+ TeTime minT1, maxT2;
+
+ // builds an ST object instance
+ TeTime t1, t2;
+ TePropertyVector prop;
+
+ // verify if exist several geometries for an object
+ bool flagGeom = true;
+ while(flagGeom && fetchInstance)
+ {
+ sto.objectId (portal->getData(linkName_));
+
+ if(rep && (!params_.loadGeom()))
+ {
+ int geomId = portal->getInt(rep->tableName_ +".geom_id");
+
+ if(sto.objectId()==lastObjId_)
+ {
+ if (geomId_!=geomId)
+ {
+ flagGeom = portal->fetchRow();
+ continue;
+ }
+ }
+ else
+ geomId_ = geomId;
+ }
+ flagGeom = false;
+ }
+
+
+ // ------------- begin fill attribute
+ // process the records filling the parameters of each instance
+ TeAttributeList attrsPortal = portal->AttributeList();
+ TeAttributeList::iterator it= attrsPortal.begin();
+
+ if(isGroup_) // it was grouped by sql functions and without geometry
+ {
+ sto.addUniqueId(string(portal->getData(linkName_)));
+
+ unsigned int size = params_.groupAttr().size();
+ for(unsigned int s=0; s<size; ++s)
+ {
+ TeProperty p;
+ p.attr_ = attrsPortal[s];
+ p.value_ = portal->getData (s);
+ prop.push_back(p);
+ }
+ }
+ else
+ {
+ while(it!=attrsPortal.end())
+ {
+ TeProperty p;
+ string name = (*it).rep_.name_;
+ p.attr_ = (*it);
+
+ if(name==attrTable_.attInitialTime())
+ {
+ t1 = portal->getDate(attrTable_.attInitialTime());
+ if(attrTable_.attInitialTime()==attrTable_.attFinalTime())
+ {
+ t2 = t1;
+ sto.timeInterval(TeTimeInterval(t1,t2));
+ }
+ }
+ else if(name==attrTable_.attFinalTime())
+ {
+ t2 = portal->getDate(attrTable_.attFinalTime());
+ sto.timeInterval(TeTimeInterval(t1,t2));
+ }
+ else if(find(uniqueNames_.begin(), uniqueNames_.end(), TeConvertToUpperCase(name)) != uniqueNames_.end())
+ {
+ string uniqueValue = portal->getData(name);
+ sto.addUniqueId(uniqueValue);
+ }
+
+ if(find(params_.loadAttrs().begin(), params_.loadAttrs().end(), name) != params_.loadAttrs().end())
+ {
+ p.value_ = portal->getData(name);
+ prop.push_back(p);
+ }
+ ++it;
+ }
+ }
+
+ //! Set the property in the stoInstance
+ sto.properties(prop);
+ sto.theme(params_.theme());
+
+ if(!fetchInstance) //only to get the attributes
+ return true;
+
+ // ------------- end fill attribute
+
+ //total time
+ if(t1.isValid() && t1<minT1)
+ minT1 = t1;
+ if(t2.isValid() && maxT2<t2)
+ maxT2 = t2;
+
+ // ------------- begin fill geometries
+
+ if(params_.loadGeom())
+ {
+ if(t1.isValid() && t2.isValid())
+ flagPortal_ = addGeometry(portal, rep->geomRep_, sto, rep->tableName_, TeTimeInterval(t1,t2), attrTable_.attInitialTime(), attrTable_.attFinalTime());
+ else
+ flagPortal_ = addGeometry(portal, rep->geomRep_, sto, rep->tableName_);
+ }
+ else
+ flagPortal_ = portal->fetchRow ();
+
+ // ------------- end fill geometries
+
+ lastObjId_ = sto.objectId();
+ return true;
+}
+
+bool
+TeQuerierDBStr1::fillGeomSTO(TeSTInstance& sto, unsigned int index)
+{
+ if((portals_.size()<(index+1)) || (geomRepr_.size()<(index+1)))
+ return false;
+
+ TeDatabasePortal* portal = portals_[index];
+ TeRepresentation rep = geomRepr_[index];
+ if(!portal)
+ return false;
+
+ TeTimeInterval time = sto.timeInterval();
+ bool flag = false;
+ if(time.isValid())
+ flag = addGeometry(portal, rep.geomRep_, sto, rep.tableName_, time, attrTable_.attInitialTime(), attrTable_.attFinalTime());
+ else
+ flag = addGeometry(portal, rep.geomRep_, sto, rep.tableName_);
+
+ return flag;
+}
+
+
+// It is used in a case:
+// 1) when the attributes of the object instances must be grouping in memory - with or without geometry
+bool
+TeQuerierDBStr1::fillSTONoGrouped(TeSTInstance& sto)
+{
+ unsigned int s;
+ if(portals_.empty())
+ return false;
+
+ TeDatabasePortal* portal = portals_[0];
+ if(!portal)
+ return false;
+
+ TeRepresentation* rep = 0;
+ if(!geomRepr_.empty())
+ rep = &(geomRepr_[0]);
+
+ //verify if the portal points to any STO
+ if(!flagPortal_)
+ {
+ clearVectors();
+ return false;
+ }
+
+ TePropertyVector prop;
+ map<int, vector<double> > values;
+ string lastObj = "";
+
+ TeAttributeList attrsPortal = portal->AttributeList();
+
+ if(!params_.loadGeom())
+ {
+ do
+ {
+ string objId = portal->getData(linkName_);
+ if(!rep)
+ {
+ lastObj = objId;
+ flagPortal_ = portal->fetchRow();
+ break;
+ }
+
+ int geomId = portal->getInt(rep->tableName_ +".geom_id");
+
+ if(lastObj.empty())
+ geomId_ = geomId; //first read geomId
+
+ if((!lastObj.empty()) && (objId != lastObj))
+ break;
+
+ //verify this is the geomId
+ if(geomId!=geomId_)
+ {
+ flagPortal_ = portal->fetchRow();
+ lastObj = objId;
+ continue;
+ }
+
+ string val = "";
+ unsigned int size = attrsPortal.size();
+ //portal has the attributes that will be grouped and geometric columns (object_id and geom_id)
+ for(unsigned int s=0; s<(size-2); ++s)
+ {
+ val = portal->getData(s);
+ if(val.empty())
+ values[s].push_back (TeMAXFLOAT); //invalid value
+ else
+ values[s].push_back (atof(val.c_str()));
+ }
+
+ flagPortal_ = portal->fetchRow();
+ lastObj = objId;
+
+ } while(flagPortal_);
+ }
+ else // -- when fill the geometry
+ {
+
+ //------- first: load the geometry, attributes and time of the first object
+ //object id
+ lastObj = portal->getData(rep->tableName_ +".object_id");
+
+ //attribute val
+ string val = "";
+ unsigned int size = attrsPortal.size();
+ for(s=0; s<(size-1); ++s)
+ {
+ val = portal->getData(s);
+ if(val.empty())
+ values[s].push_back (TeMAXFLOAT); //invalid value
+ else
+ values[s].push_back (atof(val.c_str()));
+ }
+
+ //time
+ TeTime t1, t2;
+ if(!attrTable_.name().empty())
+ {
+ t1 = portal->getDate(attrTable_.attInitialTime());
+ t2 = portal->getDate(attrTable_.attFinalTime());
+ }
+
+ if(t1.isValid() && t2.isValid())
+ flagPortal_ = addGeometry(portal, rep->geomRep_, sto, rep->tableName_, TeTimeInterval(t1,t2), attrTable_.attInitialTime(), attrTable_.attFinalTime());
+ else
+ flagPortal_ = addGeometry(portal, rep->geomRep_, sto, rep->tableName_);
+
+ //------- second: load the attributes of the other objects
+ int cont = 0;
+ while (flagPortal_)
+ {
+ string objId = portal->getData(rep->tableName_ +".object_id");
+ int geomId = portal->getInt(rep->tableName_ +".geom_id");
+
+ if(objId != lastObj)
+ break;
+
+ if(!cont)
+ geomId_ = geomId; //first geom_id
+
+ //verify the geomId
+ if(geomId!=geomId_)
+ {
+ flagPortal_ = portal->fetchRow();
+ lastObj = objId;
+ continue;
+ }
+
+ val = "";
+ for(s=0; s<(size-1); ++s)
+ {
+ val = portal->getData(s);
+ if(val.empty())
+ values[s].push_back (TeMAXFLOAT); //invalid value
+ else
+ values[s].push_back (atof(val.c_str()));
+ }
+
+ flagPortal_ = portal->fetchRow();
+ lastObj = objId;
+ ++cont;
+ }
+ }
+
+ //fill the property from portal
+ //calculate the statistics
+ string lastAttr = "";
+ unsigned int j=0;
+ string colName = "";
+ TeGroupingAttr::iterator it = params().groupAttr().begin();
+
+ TeStatisticValMap stat;
+ while(it!=params().groupAttr().end())
+ {
+ if(lastAttr != it->first.name_)
+ {
+ if(j>=(values.size()))
+ return false;
+
+ stat.clear();
+ TeCalculateStatistics(values[j].begin(), values[j].end(), stat);
+ colName = attrsPortal[j].rep_.name_;
+ ++j;
+ }
+
+ double result;
+ string prefix;
+ switch(it->second)
+ {
+ case TeCOUNT:
+ result = stat[TeCOUNT];
+ prefix = "count";
+ break;
+ case TeVALIDCOUNT:
+ result = stat[TeVALIDCOUNT];
+ prefix = "valCount";
+ break;
+ case TeMINVALUE:
+ result = stat[TeMINVALUE];
+ prefix = "min";
+ break;
+ case TeMAXVALUE:
+ result = stat[TeMAXVALUE];
+ prefix = "max";
+ break;
+ case TeSUM:
+ result = stat[TeSUM];
+ prefix = "sum";
+ break;
+ case TeMEAN:
+ result = stat[TeMEAN];
+ prefix = "mean";
+ break;
+ case TeSTANDARDDEVIATION:
+ result = stat[TeSTANDARDDEVIATION];
+ prefix = "stDeviation";
+ break;
+ case TeVARIANCE:
+ result = stat[TeVARIANCE];
+ prefix = "variance";
+ break;
+ case TeSKEWNESS:
+ result = stat[TeSKEWNESS];
+ prefix = "skwness";
+ break;
+ case TeKURTOSIS:
+ result = stat[TeKURTOSIS];
+ prefix = "kurtosis";
+ break;
+ case TeAMPLITUDE:
+ result = stat[TeAMPLITUDE];
+ prefix = "amplitude";
+ break;
+ case TeMEDIAN:
+ result = stat[TeMEDIAN];
+ prefix = "median";
+ break;
+ case TeVARCOEFF:
+ result = stat[TeVARCOEFF];
+ prefix = "varcoeff";
+ break;
+ case TeMODE:
+ result = stat[TeMODE];
+ prefix = "mode";
+ break;
+ default:
+ break;
+ }
+
+ lastAttr = it->first.name_;
+ ++it;
+
+ //fill the property
+ TeProperty p;
+ p.attr_.rep_.name_ = prefix +"_"+ colName;
+ p.attr_.rep_.type_ = TeREAL;
+ p.value_ = Te2String(result);
+
+ prop.push_back(p);
+ }
+
+ //adds the property in the stoInstance
+ sto.properties(prop);
+ sto.theme(params_.theme());
+ sto.objectId(lastObj);
+ sto.addUniqueId(lastObj);
+
+ lastObjId_ = sto.objectId();
+ return true;
+}
+
+
+bool
+TeQuerierDBStr1::loadInstances(TeTSEntry* ent)
+{
+ if(!params_.theme())
+ return false;
+
+ TeRepresPointerVector repres = params_.theme()->layer()->vectRepres();
+ TeRepresentation rep;
+
+ //fill instances - first fill the geometry representation of the spatial restriction
+ if(params_.theme()->hasSpatialRest())
+ rep = **(TeFindRepresentation(repres.begin(), repres.end(), params_.theme()->geomRepRestriction()));
+ else
+ {
+ for(int i=0; i<(int)repres.size(); ++i)
+ {
+ if(repres[i]->geomRep_==TeTEXT)
+ continue;
+
+ rep = *repres[i];
+ break;
+ }
+ }
+
+ if(!initPortal(rep, ent))
+ return false;
+
+ //get the attribute list
+ attrList_.clear();
+ if(!groupInMemory_)
+ {
+ TeSTInstance i;
+ fillSTOGrouped(i, false);
+ TePropertyVector props = i.getPropertyVector();
+ for(int c=0; c<(int)props.size(); ++c)
+ attrList_.push_back (props[c].attr_);
+ }
+ else
+ {
+ TeGroupingAttr::iterator it = params().groupAttr().begin();
+ while(it!=params().groupAttr().end())
+ {
+ TeAttribute at;
+ at.rep_ = it->first;
+ attrList_.push_back (at);
+ ++it;
+ }
+ }
+
+ if(!params_.loadGeom())
+ return true;
+
+ for(unsigned int i=0; i<repres.size(); ++i)
+ {
+ if( (repres[i]->geomRep_ == rep.geomRep_) ||
+ (repres[i]->geomRep_ == TeTEXT) )
+ continue;
+
+ if(!initGeomPortal(*(repres[i]), ent))
+ {
+ clearVectors();
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool
+TeQuerierDBStr1::fetchInstance(TeSTInstance& sto)
+{
+ sto.clear();
+ bool flag = false;
+
+ if(groupInMemory_)
+ flag = fillSTONoGrouped(sto);
+ else
+ flag = fillSTOGrouped(sto);
+
+ if((flag==false) || (!params_.loadGeom()))
+ return flag;
+
+ for(unsigned int i=1; i<portals_.size(); ++i)
+ flag = fillGeomSTO(sto, i);
+
+ return flag;
+}
+
+
+int
+TeQuerierDBStr1::numElemInstances()
+{
+ if((portals_.empty()))
+ return 0;
+
+ TeDatabasePortal* portal = portals_[0];
+ if(!portal)
+ return 0;
+
+ return (portal->numRows());
+}
+
+
+
+
diff --git a/src/terralib/kernel/TeQuerierDBStr1.h b/src/terralib/kernel/TeQuerierDBStr1.h
new file mode 100644
index 0000000..89cf967
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDBStr1.h
@@ -0,0 +1,94 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QUERIER_DBSTR1_H
+#define __TERRALIB_INTERNAL_QUERIER_DBSTR1_H
+
+#include "TeQuerierDB.h"
+
+//! A class that implement a strategy to build STOs (Spatial Temporal Objects) from a TerraLib database (Strategy 1)
+class TeQuerierDBStr1 : public TeQuerierDB
+{
+
+private:
+
+ vector<string> uniqueNames_;
+ string lastObjId_;
+ int geomId_;
+ bool isGroup_; //! if the portal was built with statistics sql funcionts
+ bool groupInMemory_; //! if it must group the object instances in the memory
+ string linkName_;
+
+ /* @name Internal functions to initialize portals */
+ //@{
+ bool initPortal(TeRepresentation& rep, TeTSEntry* ent=0);
+ bool initGeomPortal(TeRepresentation& rep, TeTSEntry* ent=0);
+ //@}
+
+ /* @name Internal functions to fill the STOs from portals */
+ //@{
+ bool fillSTOGrouped(TeSTInstance& sto, bool fetchInstance = true);
+ bool fillSTONoGrouped(TeSTInstance& sto);
+ bool fillGeomSTO(TeSTInstance& sto, unsigned int index);
+ //@}
+
+public:
+
+ //! Constructor
+ TeQuerierDBStr1(TeQuerierParams& params) :
+ TeQuerierDB(params),
+ lastObjId_(""),
+ isGroup_(false),
+ groupInMemory_(false),
+ linkName_("")
+ {}
+
+ //! Loads instances
+ bool loadInstances(TeTSEntry* ent=0);
+
+ //! Returns each loaded instance
+ bool fetchInstance(TeSTInstance& sto);
+
+ //! Returns the number of instances to each time frame
+ int numElemInstances();
+};
+
+//! A class that define a factory to build a querier strategy from database(strategy 1)
+class TeQuerierDBStr1Factory : public TeQuerierImplFactory
+{
+public:
+
+ //! Constructor
+ TeQuerierDBStr1Factory(const string& name) : TeQuerierImplFactory(name) {}
+
+ //! Builds a database querier
+ virtual TeQuerierImpl* build (const TeQuerierParams& arg)
+ {
+ TeQuerierParams tempArg = arg;
+ return new TeQuerierDBStr1(tempArg);
+ }
+};
+
+
+#endif
+
diff --git a/src/terralib/kernel/TeQuerierDBStr2.cpp b/src/terralib/kernel/TeQuerierDBStr2.cpp
new file mode 100644
index 0000000..137c98f
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDBStr2.cpp
@@ -0,0 +1,299 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerierDBStr2.h"
+#include "TeDatabase.h"
+#include "TeSTInstance.h"
+
+bool
+TeQuerierDBStr2::initPortal(TeTSEntry* ent)
+{
+ string selectClause, fromClause, whereClause, groupByClause;
+ string initialTime, finalTime;
+ TeDatabase* db = params_.theme()->layer()->database();
+
+ if(params_.groupAttr().empty())
+ return false;
+
+ //get the table name
+ string tableName;
+ TeGroupingAttr groupAttr = params_.groupAttr();
+ TeGroupingAttr::iterator it = groupAttr.begin();
+ size_t pos = (it->first.name_).find(".", string::npos,1);
+ if (pos != string::npos)
+ tableName = (it->first.name_).substr(0,pos);
+
+
+ clearVectors();
+
+ // --------------------------------------------- Mount SQL
+ //------- Select and Group By clause
+
+ //load the attribute table
+ int index = -1;
+ TeAttrTableVector attr = params_.theme()->attrTables();
+ for(unsigned int i=0; i<attr.size(); ++i)
+ {
+ if(TeConvertToUpperCase(attr[i].name()) == TeConvertToUpperCase(tableName))
+ {
+ index = i;
+ attrTable_ = attr[i];
+ break;
+ }
+ }
+
+ //not find the table
+ if(index<0)
+ return false;
+
+ //verify the attribute table
+ if((ent) && (attrTable_.tableType()!=TeAttrEvent) && (attrTable_.tableType()!=TeFixedGeomDynAttr))
+ return false;
+
+ //object_id
+ string linkName;
+ if(attrTable_.tableType() != TeAttrExternal)
+ linkName = attrTable_.name() +"."+ attrTable_.linkName();
+ else
+ linkName = params_.theme()->collectionTable() +".c_object_id ";
+
+ if(params_.hasSpatialRes())
+ selectClause = " MIN("+ linkName +")";
+ else
+ selectClause = linkName;
+
+ if(ent)
+ {
+ //date
+ initialTime = attrTable_.name() +"."+ attrTable_.attInitialTime();
+
+ groupByClause = db->getSQLTemporalFunction(params_.chronon(), initialTime);
+
+ if(!params_.hasSpatialRes())
+ groupByClause += ","+ linkName;
+
+ selectClause += ", MAX("+ initialTime +")";
+ }
+ else
+ groupByClause = linkName;
+
+ //statistic
+ selectClause += ","+ db->getSQLStatistics(groupAttr);
+
+ //---- from clause
+ if(params_.hasSpatialRes())
+ {
+ groupByClause = ""; //It groups all attributes from all objects
+ string gTable = params_.theme()->layer()->tableName(params_.geomRepRest());
+ fromClause = this->sqlFrom(gTable);
+ }
+ else
+ fromClause = this->sqlFrom();
+
+ if(fromClause.empty())
+ return false;
+
+ //where clause
+ if(!params_.objId().empty())
+ whereClause = linkName +" = '"+ params_.objId() +"'";
+
+ //---------- querier restriction
+ string sqlQuerierRest = sqlWhereRestrictions();
+ if(!whereClause.empty())
+ whereClause += " AND ";
+
+ whereClause += sqlQuerierRest;
+
+ //----------
+
+ string sql = " SELECT "+ selectClause;
+ sql += " FROM "+ fromClause;
+ if(!whereClause.empty())
+ sql += " WHERE "+ whereClause;
+ if(!groupByClause.empty())
+ sql += " GROUP BY "+ groupByClause;
+
+ // --------------------------------------------- Submit the query
+
+ portals_.clear();
+ TeDatabasePortal* portal = db->getPortal();
+
+ if(!portal)
+ return false;
+
+ if(!portal->query(sql))
+ {
+ delete (portal);
+ flagPortal_ = false;
+ return false;
+ }
+
+ if(!portal->fetchRow())
+ {
+ delete (portal);
+ flagPortal_ = false;
+ return false;
+ }
+
+ string id = portal->getData(0); //object_Id
+ if(id.empty())
+ {
+ delete (portal);
+ flagPortal_ = false;
+ return false;
+ }
+
+ portals_.push_back (portal);
+ flagPortal_ = true;
+ return true;
+}
+
+
+bool
+TeQuerierDBStr2::fillSTO(TeSTInstance& sto)
+{
+ if(portals_.empty())
+ return false;
+
+ TeDatabasePortal* portal = portals_[0];
+ if(!portal)
+ return false;
+
+ if(!flagPortal_) // end of portal
+ {
+ clearVectors();
+ return false;
+ }
+
+ int posInit = 1;
+
+ if(TSEntry_.timeFrame_ > -1)
+ {
+ // first : verify the time
+ TeTime t1 = portal->getDate(1); // 1: date
+ t1.chronon ((TSEntry_.time_).intervalChronon());
+ posInit = 2;
+
+ //if the time is before the requested interval
+ while ( (TSEntry_.time_).before(t1) && flagPortal_)
+ {
+ flagPortal_ = portal->fetchRow();
+ t1 = portal->getDate(1);
+ t1.chronon ((TSEntry_.time_).intervalChronon());
+ }
+
+ if(!(TSEntry_.time_).during(t1))
+ return false;
+
+ TeTimeInterval interval(t1, t1);
+ sto.timeInterval(interval);
+
+ timeFramePortal_ = (TSEntry_.timeFrame_)+1; //next time frame
+ }
+
+ // get object_id
+ string objId = string(portal->getData(0)); // 0: object_id
+ sto.objectId (objId);
+ sto.addUniqueId (objId);
+
+ //get property
+ TeAttributeList attrsPortal = portal->AttributeList();
+ TePropertyVector prop;
+
+ unsigned int size = params_.groupAttr().size();
+ for(unsigned int s=0; s<size; ++s) // 1 or 2 until size...
+ {
+ TeProperty p;
+ p.attr_ = attrsPortal[posInit];
+ p.value_ = string(portal->getData(posInit));
+ prop.push_back(p);
+ ++posInit;
+ }
+
+ // set the property in the stoInstance
+ sto.properties(prop);
+ sto.theme(params_.theme());
+
+ flagPortal_ = portal->fetchRow();
+ return true;
+}
+
+
+bool
+TeQuerierDBStr2::loadInstances(TeTSEntry* ent)
+{
+ if(!params_.theme())
+ return false;
+
+ if(ent)
+ {
+ //if the portal was not initialised (timeFramePortal_==-1) or
+ //if the time frame requested is lesser than the time frame appointed by the portal
+ if((timeFramePortal_<0) || (ent->timeFrame_<timeFramePortal_))
+ {
+ if(!initPortal(ent))
+ return false;
+
+ timeFramePortal_ = 0;
+ }
+ TSEntry_ = (*ent);
+ }
+ else // no chronon
+ {
+ if(!initPortal())
+ return false;
+
+ timeFramePortal_ = -1;
+ }
+
+ attrList_.clear();
+ TeAttribute at;
+ TeGroupingAttr::iterator it = params().groupAttr().begin();
+ while(it!=params().groupAttr().end())
+ {
+ TeAttribute at;
+ at.rep_ = it->first;
+ attrList_.push_back (at);
+ ++it;
+ }
+
+ return true;
+}
+
+
+bool
+TeQuerierDBStr2::fetchInstance(TeSTInstance& sto)
+{
+ sto.clear();
+
+ if(!fillSTO(sto))
+ return false;
+
+ //build a temporal serie to one object
+ if((ts_) && (ts_->setTSEntryValue(TSEntry_.timeFrame_, sto[0], TeDATA)))
+ filledSerie_ = true;
+
+ return true;
+}
+
+
diff --git a/src/terralib/kernel/TeQuerierDBStr2.h b/src/terralib/kernel/TeQuerierDBStr2.h
new file mode 100644
index 0000000..581a35d
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDBStr2.h
@@ -0,0 +1,78 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QUERIER_DBSTR2_H
+#define __TERRALIB_INTERNAL_QUERIER_DBSTR2_H
+
+#include "TeQuerierDB.h"
+#include "TeTemporalSeries.h"
+
+//! A class that implement a strategy to build STOs (Spatial Temporal Objects) from a TerraLib database (Strategy 2)
+//! Strategy 2: simple chronon, without geometry, theme with collection table, operator exist in the database
+class TeQuerierDBStr2: public TeQuerierDB
+{
+
+private:
+ int timeFramePortal_; // the time frame appointed by the portal
+ TeTSEntry TSEntry_;
+
+ /* @name Internal functions to initialize portals */
+ //@{
+ bool initPortal(TeTSEntry* ent=0);
+ //@}
+
+ //! Internal function to fill STO
+ bool fillSTO(TeSTInstance& sto);
+
+public:
+
+ //! Constructor
+ TeQuerierDBStr2(TeQuerierParams& params):
+ TeQuerierDB(params),
+ timeFramePortal_(-1)
+ {}
+
+ //! Loads the instances
+ bool loadInstances(TeTSEntry* ent=0);
+
+ //! Returns each loaded STO
+ bool fetchInstance(TeSTInstance& sto);
+};
+
+//! A class that define a factory to build a querier strategy from database(strategy 2)
+class TeQuerierDBStr2Factory : public TeQuerierImplFactory
+{
+public:
+
+ //! Constructor
+ TeQuerierDBStr2Factory(const string& name) : TeQuerierImplFactory(name) {}
+
+ //! Builds a database querier
+ virtual TeQuerierImpl* build (const TeQuerierParams& arg)
+ {
+ TeQuerierParams tempArg = arg;
+ return new TeQuerierDBStr2(tempArg);
+ }
+};
+
+#endif
diff --git a/src/terralib/kernel/TeQuerierDBStr3.cpp b/src/terralib/kernel/TeQuerierDBStr3.cpp
new file mode 100644
index 0000000..60032a3
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDBStr3.cpp
@@ -0,0 +1,336 @@
+ /************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerierDBStr3.h"
+#include "TeDatabase.h"
+#include "TeSTInstance.h"
+
+bool
+TeQuerierDBStr3::initPortal(TeTSEntry* ent)
+{
+ string selectClause, fromClause, whereClause, groupByClause;
+ string initialTime, finalTime;
+ TeDatabase* db = params_.theme()->layer()->database();
+
+ if(params_.groupAttr().empty())
+ return false;
+
+ //get the table name
+ string tableName;
+ TeGroupingAttr groupAttr = params_.groupAttr();
+ TeGroupingAttr::iterator it = groupAttr.begin();
+ size_t pos = (it->first.name_).find(".", string::npos,1);
+ if (pos != string::npos)
+ tableName = (it->first.name_).substr(0,pos);
+
+ clearVectors();
+
+ // --------------------------------------------- Monut SQL
+
+ //------- Select and Group By clause
+
+ //load the attribute table
+ int index = -1;
+ unsigned int i=0;
+ TeAttrTableVector attr = params_.theme()->attrTables();
+ for(i=0; i<attr.size(); ++i)
+ {
+ if(TeConvertToUpperCase(attr[i].name()) == TeConvertToUpperCase(tableName))
+ {
+ index = i;
+ attrTable_ = attr[i];
+ break;
+ }
+ }
+
+ //not find the table
+ if(index<0)
+ return false;
+
+ //verify the attribute table
+ if((ent) && (attrTable_.tableType()!=TeAttrEvent) && (attrTable_.tableType()!=TeFixedGeomDynAttr))
+ return false;
+
+ //geometric Table
+ TeTable geomTable;
+ if(params_.theme()->layer()->hasGeometry(TePOINTS))
+ {
+ if(!db->loadTable(params_.theme()->layer()->tableName(TePOINTS), geomTable))
+ return false;
+ rep_ = TePOINTS;
+ }
+ else if (params_.theme()->layer()->hasGeometry(TeCELLS))
+ {
+ if(!db->loadTable(params_.theme()->layer()->tableName(TeCELLS), geomTable))
+ return false;
+ rep_ = TeCELLS;
+ }
+ else
+ return false; //this strategy is valid only for cells and point geometry
+
+ //object_id
+ string linkName = geomTable.name()+ ".object_id ";
+ string uniqueIdName = attrTable_.name() +"."+ attrTable_.uniqueName();
+
+ if(params_.hasSpatialRes())
+ selectClause = " MIN("+ linkName +")";
+ else
+ selectClause = linkName;
+
+ if(ent)
+ {
+ //date
+ initialTime = attrTable_.name() +"."+ attrTable_.attInitialTime();
+
+ groupByClause = db->getSQLTemporalFunction(params_.chronon(), initialTime);
+
+ if(!params_.hasSpatialRes())
+ groupByClause += ","+ linkName;
+
+ selectClause += ", MAX("+ initialTime +")";
+ }
+ else if(!params_.hasSpatialRes())
+ groupByClause = linkName;
+
+ //statistic
+ selectClause += ","+ db->getSQLStatistics(groupAttr);
+
+ //----- insert geometrical information in the select clause
+ vector<string> attrs;
+ geomTable.attributeNames(attrs);
+ for(i=0; i<attrs.size(); ++i)
+ {
+ if(attrs[i]!="object_id")
+ selectClause += ", MIN( "+ geomTable.name()+"."+ attrs[i] +" ) AS "+ attrs[i];
+ }
+ //-----
+
+ //------- From clause
+ fromClause = this->sqlFrom(geomTable.name());
+ if(fromClause.empty())
+ return false;
+
+ //where clause
+ if(!params_.objId().empty())
+ whereClause = linkName +" = '"+ params_.objId() +"'";
+
+ //---------- querier restriction
+ TeRepresentation rep;
+ rep.tableName_ = geomTable.name();
+ rep.geomRep_ = rep_;
+
+ string sqlQuerierRest = sqlWhereRestrictions(&rep);
+ if(!whereClause.empty())
+ whereClause += " AND ";
+
+ whereClause += sqlQuerierRest;
+
+ //----------
+
+ string sql = " SELECT "+ selectClause;
+ sql += " FROM "+ fromClause;
+ if(!whereClause.empty())
+ sql += " WHERE "+ whereClause;
+ if(!groupByClause.empty())
+ sql += " GROUP BY "+ groupByClause;
+
+ // --------------------------------------------- Submit the query
+
+ portals_.clear();
+ TeDatabasePortal* portal = db->getPortal();
+
+ if(!portal)
+ return false;
+
+ if(!portal->query(sql))
+ {
+ delete (portal);
+ flagPortal_ = false;
+ return false;
+ }
+
+ if(!portal->fetchRow())
+ {
+ delete (portal);
+ flagPortal_ = false;
+ return false;
+ }
+
+ string id = portal->getData(0); //object_Id
+ if(id.empty())
+ {
+ delete (portal);
+ flagPortal_ = false;
+ return false;
+ }
+
+ portals_.push_back (portal);
+ flagPortal_ = true;
+ return true;
+}
+
+
+bool
+TeQuerierDBStr3::fillSTO(TeSTInstance& sto)
+{
+ if(portals_.empty())
+ return false;
+
+ TeDatabasePortal* portal = portals_[0];
+ if(!portal)
+ return false;
+
+ if(!flagPortal_) //end of portal
+ {
+ clearVectors();
+ return false;
+ }
+
+ int posInit = 1;
+
+ // first : verify the time
+ if(TSEntry_.timeFrame_ > -1)
+ {
+ TeTime t1 = portal->getDate(1); // 1: date
+ t1.chronon ((TSEntry_.time_).intervalChronon());
+// int posInit = 2;
+
+ //if the time is before the requested interval
+ while ( (TSEntry_.time_).before(t1) && flagPortal_)
+ {
+ flagPortal_ = portal->fetchRow();
+ t1 = portal->getDate(1);
+ t1.chronon ((TSEntry_.time_).intervalChronon());
+ }
+
+ if(!(TSEntry_.time_).during(t1))
+ return false;
+
+ TeTimeInterval interval(t1, t1);
+ sto.timeInterval(interval);
+
+ timeFramePortal_ = (TSEntry_.timeFrame_)+1; //next time frame
+ }
+
+ // get object_id
+ string objId = string(portal->getData(0)); // 0: object_id
+ sto.objectId (objId);
+ sto.addUniqueId (objId);
+
+ //get property
+ TeAttributeList attrsPortal = portal->AttributeList();
+ TePropertyVector prop;
+
+ unsigned int size = params_.groupAttr().size();
+ for(unsigned int s=0; s<size; ++s) // 1 or 2 until size...
+ {
+ TeProperty p;
+ p.attr_ = attrsPortal[posInit];
+ p.value_ = portal->getData (posInit);
+ prop.push_back(p);
+ ++posInit;
+ }
+
+ // set the property in the stoInstance
+ sto.properties(prop);
+ sto.theme(params_.theme());
+
+ // get geometry
+ if(rep_ == TePOINTS)
+ {
+ TePoint point;
+ flagPortal_ = portal->fetchGeometry(point);
+ sto.addGeometry (point);
+ }
+ else
+ {
+ TeCell cell;
+ flagPortal_ = portal->fetchGeometry(cell);
+ sto.addGeometry (cell);
+ }
+
+ return true;
+}
+
+
+bool
+TeQuerierDBStr3::loadInstances(TeTSEntry* ent)
+{
+ if(!params_.theme())
+ return false;
+
+ if(ent)
+ {
+ //if the portal was not initialised (timeFramePortal_==-1) or
+ //if the time frame requested is lesser than the time frame appointed by the portal
+ if((timeFramePortal_<0) || (ent->timeFrame_<timeFramePortal_))
+ {
+ if(!initPortal(ent))
+ return false;
+
+ timeFramePortal_ = 0;
+ }
+ TSEntry_ = (*ent);
+ }
+ else // no chronon
+ {
+ if(!initPortal())
+ return false;
+
+ timeFramePortal_ = -1;
+ }
+
+ attrList_.clear();
+ TeAttribute at;
+ TeGroupingAttr::iterator it = params().groupAttr().begin();
+ while(it!=params().groupAttr().end())
+ {
+ TeAttribute at;
+ at.rep_ = it->first;
+ attrList_.push_back (at);
+ ++it;
+ }
+
+ return true;
+}
+
+
+bool
+TeQuerierDBStr3::fetchInstance(TeSTInstance& sto)
+{
+ sto.clear();
+
+ if(!fillSTO(sto))
+ return false;
+
+ //build a temporal serie to one object
+ if((ts_) && (ts_->setTSEntryValue(TSEntry_.timeFrame_, sto[0], TeDATA)))
+ filledSerie_ = true;
+
+ return true;
+}
+
+
+
+
+
diff --git a/src/terralib/kernel/TeQuerierDBStr3.h b/src/terralib/kernel/TeQuerierDBStr3.h
new file mode 100644
index 0000000..bd9bb4b
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDBStr3.h
@@ -0,0 +1,79 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QUERIER_DBSTR3_H
+#define __TERRALIB_INTERNAL_QUERIER_DBSTR3_H
+
+#include "TeQuerierDB.h"
+#include "TeTemporalSeries.h"
+
+//! A class that implement a strategy to build STOs (Spatial Temporal Objects) from a TerraLib database (Strategy 3)
+//! Strategy 3: simple chronon, with geometry (points or cells), theme with collection table, operator exist in the database
+class TeQuerierDBStr3: public TeQuerierDB
+{
+
+private:
+ int timeFramePortal_; // the time frame appointed by the portal
+ TeTSEntry TSEntry_;
+ TeGeomRep rep_;
+
+ /* @name Internal functions to initialize portals */
+ //@{
+ bool initPortal(TeTSEntry* ent=0);
+ //@}
+
+ //! Internal function to fill STO
+ bool fillSTO(TeSTInstance& sto);
+
+public:
+
+ //! Constructor
+ TeQuerierDBStr3(TeQuerierParams& params):
+ TeQuerierDB(params),
+ timeFramePortal_(-1)
+ {}
+
+ //! Loads the instances
+ bool loadInstances(TeTSEntry* ent=0);
+
+ //! Returns each loaded STO
+ bool fetchInstance(TeSTInstance& sto);
+};
+
+//! A class that define a factory to build a querier strategy from database(strategy 3)
+class TeQuerierDBStr3Factory : public TeQuerierImplFactory
+{
+public:
+
+ //! Constructor
+ TeQuerierDBStr3Factory(const string& name) : TeQuerierImplFactory(name) {}
+
+ //! Builds a database querier
+ virtual TeQuerierImpl* build (const TeQuerierParams& arg)
+ {
+ TeQuerierParams tempArg = arg;
+ return new TeQuerierDBStr3(tempArg);
+ }
+};
+
+#endif
diff --git a/src/terralib/kernel/TeQuerierImpl.cpp b/src/terralib/kernel/TeQuerierImpl.cpp
new file mode 100644
index 0000000..7641500
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierImpl.cpp
@@ -0,0 +1,95 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerierImpl.h"
+#include "TeTemporalSeries.h"
+
+
+TeQuerierImpl::TeQuerierImpl(TeQuerierParams& par): params_(par), filledSerie_(false)
+{
+ ts_ = 0;
+ if(par.chronon()!=TeNOCHRONON) //if there is a chronon, build ts
+ {
+ TeGroupingAttr::iterator it = par.groupAttr().begin();
+ if(it!=par.groupAttr().end())
+ ts_ = new TeTemporalSeries(par.theme(), par.objId(), par.chronon(), it->first.name_, it->first.name_, it->second, it->second);
+ else
+ ts_ = new TeTemporalSeries(par.chronon(), par.theme());
+ ts_->buildFrameIntervals();
+ }
+}
+
+TeQuerierImpl::~TeQuerierImpl()
+{
+ if(ts_)
+ delete (ts_);
+}
+
+bool
+TeQuerierImpl::loadTimeFrameInstances(int frame)
+{
+ if(frame>-1)
+ {
+ TeTSEntry ent;
+ if(!getTSEntry(ent, frame))
+ return false;
+
+ return(loadInstances(&ent));
+ }
+ else
+ return(loadInstances());
+}
+
+bool
+TeQuerierImpl::getTSEntry(TeTSEntry& tsEntry, int frame)
+{
+ if(!ts_)
+ return false;
+
+ return(ts_->getTSEntry(tsEntry, frame));
+}
+
+int
+TeQuerierImpl::getNumTimeFrames()
+{
+ if(!ts_)
+ return 0;
+
+ return (ts_->numTimeFrames());
+}
+
+bool
+TeQuerierImpl::getTS(TeTemporalSeries& ts)
+{
+ if(!ts_)
+ return false;
+
+ ts = (*ts_);
+ return true;
+}
+
+TeTSParams&
+TeQuerierImpl::getTSParams()
+{
+ return (ts_->TSparams_);
+}
diff --git a/src/terralib/kernel/TeQuerierImpl.h b/src/terralib/kernel/TeQuerierImpl.h
new file mode 100644
index 0000000..0a6f11d
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierImpl.h
@@ -0,0 +1,109 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QUERIER_IMPL_H
+#define __TERRALIB_INTERNAL_QUERIER_IMPL_H
+
+#include "TeQuerierParams.h"
+#include "TeFactory.h"
+
+class TeTSEntry;
+class TeTSParams;
+class TeSTInstance;
+class TeTemporalSeries;
+
+//! An abstract querier class to build STOs (Spatial Temporal Objects)
+class TeQuerierImpl
+{
+ protected:
+ //! querier parameters that define the used querier strategy
+ TeQuerierParams params_;
+ TeTemporalSeries* ts_; //! temporal series
+ bool filledSerie_; //! this flag indicates if the temporal serie was filled
+ TeAttributeList attrList_; //! list of the attributes of the querier
+
+ public:
+
+ //! Constructor
+ TeQuerierImpl(TeQuerierParams& par);
+
+ //! Destructor
+ virtual ~TeQuerierImpl();
+
+ //! Returns the object identifier
+ string objectId() { return params_.objId();}
+
+ //! Returns the theme pointer
+ TeTheme* theme() { return params_.theme();}
+
+ //! Loads the STOs
+ bool loadTimeFrameInstances(int frame=-1);
+
+ //! Gets each temporal serie entry, for each time frame
+ bool getTSEntry(TeTSEntry& tsEntry, int frame);
+
+ //! Gets the number of generated time frames
+ int getNumTimeFrames();
+
+ //! Gets the full temporal serie
+ bool getTS(TeTemporalSeries& ts);
+
+ //! Returns the temporal serie params
+ TeTSParams& getTSParams();
+
+ //! Gets the attribute list from querier
+ TeAttributeList getAttrList() { return attrList_; }
+
+ //! Returns a default object
+ static TeQuerierImpl* DefaultObject(const TeQuerierParams& /*params*/) { return 0; }
+
+ //! Returns the querier parameters
+ TeQuerierParams& params() { return params_; }
+
+ //! Loads the STOs
+ virtual bool loadInstances(TeTSEntry* ent=0) = 0;
+
+ //! Returns each loaded STO
+ virtual bool fetchInstance(TeSTInstance& stoi)= 0;
+
+ //! Returns the number of instances to each time frame
+ virtual int numElemInstances() { return 0;}
+
+ //! Empties querier instances
+ virtual void clear() { return; }
+};
+
+//! A class that define a factory to build querier strategies
+class TeQuerierImplFactory : public TeFactory<TeQuerierImpl, TeQuerierParams>
+{
+
+public:
+
+ //! Builds an appropriate decoder from a identifier
+ TeQuerierImplFactory(const string& name) : TeFactory<TeQuerierImpl, TeQuerierParams>(name) { }
+
+ //! Destructor
+ virtual ~TeQuerierImplFactory() {}
+};
+
+#endif
diff --git a/src/terralib/kernel/TeQuerierParams.cpp b/src/terralib/kernel/TeQuerierParams.cpp
new file mode 100644
index 0000000..e4c039f
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierParams.cpp
@@ -0,0 +1,252 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerierParams.h"
+#include "TeDatabase.h"
+
+TeQuerierParams::~TeQuerierParams()
+{
+ if(themeFlag_)
+ delete theme_;
+}
+
+TeQuerierParams::TeQuerierParams(const TeQuerierParams& rhs)
+{
+ loadGeometries_ = rhs.loadGeometries_;
+ loadAllAttributes_ = rhs.loadAllAttributes_;
+ loadAttrNames_ = rhs.loadAttrNames_;
+ loadAttrNamesSeted_ = rhs.loadAttrNamesSeted_;
+ themeFlag_ = false;
+ layer_ = rhs.layer_;
+
+ if ((rhs.themeFlag_) && layer_)
+ {
+ theme_ = new TeTheme("theme_", layer_);
+ TeAttrTableVector attrTables;
+ layer_->getAttrTables(attrTables);
+ theme_->setAttTables(attrTables);
+ themeFlag_ = true;
+ }
+ else
+ theme_ = rhs.theme_;
+
+ fileName_ = rhs.fileName_;
+ chr_ = rhs.chr_;
+ objId_ = rhs.objId_;
+ groupingAttr_ = rhs.groupingAttr_;
+ strategy_ = rhs.strategy_;
+
+ //restrictions
+ selectedObjs_ = rhs.selectedObjs_;
+ spatialRelation_ = rhs.spatialRelation_;
+ hasSpatialRes_ = rhs.hasSpatialRes_;
+ boxRest_ = rhs.boxRest_;
+ geomRest_ = rhs.geomRest_;
+ geomRepRest_ = rhs.geomRepRest_;
+}
+
+
+TeQuerierParams&
+TeQuerierParams::operator=(const TeQuerierParams& rhs)
+{
+ if (&rhs != this)
+ {
+ loadGeometries_ = rhs.loadGeometries_;
+ loadAllAttributes_ = rhs.loadAllAttributes_;
+ loadAttrNames_ = rhs.loadAttrNames_;
+ loadAttrNamesSeted_ = rhs.loadAttrNamesSeted_;
+ themeFlag_ = false;
+ layer_ = rhs.layer_;
+
+ if ((rhs.themeFlag_) && layer_)
+ {
+ theme_ = new TeTheme("theme_", layer_);
+ TeAttrTableVector attrTables;
+ layer_->getAttrTables(attrTables);
+ theme_->setAttTables(attrTables);
+ themeFlag_ = true;
+ }
+ else
+ theme_ = rhs.theme_;
+
+ fileName_ = rhs.fileName_;
+ chr_ = rhs.chr_;
+ objId_ = rhs.objId_;
+ groupingAttr_ = rhs.groupingAttr_;
+ strategy_ = rhs.strategy_;
+
+ //restrictions
+ selectedObjs_ = rhs.selectedObjs_;
+ spatialRelation_ = rhs.spatialRelation_;
+ hasSpatialRes_ = rhs.hasSpatialRes_;
+ boxRest_ = rhs.boxRest_;
+ geomRest_ = rhs.geomRest_;
+ geomRepRest_ = rhs.geomRepRest_;
+ }
+ return *this;
+}
+
+void
+TeQuerierParams::setParams(TeLayer* layer)
+{
+ layer_ = layer;
+ if(theme_ == 0)
+ {
+ theme_ = new TeTheme("theme_", layer_);
+ TeAttrTableVector attrTables;
+ theme_->layer(layer_);
+ layer_->getAttrTables(attrTables);
+ theme_->setAttTables(attrTables);
+ themeFlag_ = true;
+ }
+ strategy_ = "querierDBStr1";
+}
+
+void
+TeQuerierParams::setParams(TeTheme* theme, TeChronon chr)
+{
+ theme_ = theme;
+ chr_ = chr;
+ strategy_ = "querierDBStr1";
+
+ bool geomRep = (theme_->layer()->hasGeometry (TeCELLS) || theme_->layer()->hasGeometry (TePOINTS));
+ bool groupAttr = !(groupingAttr_.empty());
+ bool hasOneTable = true;
+
+ if(groupAttr)
+ {
+ string lastTable = "";
+ TeGroupingAttr::iterator it = groupingAttr_.begin();
+ while(it!=groupingAttr_.end())
+ {
+ string tableName;
+ size_t pos = (it->first.name_).find(".", string::npos,1);
+ if (pos != string::npos)
+ tableName = (it->first.name_).substr(0,pos);
+
+ if((!lastTable.empty()) && (lastTable!=tableName))
+ {
+ hasOneTable = false;
+ break;
+ }
+ lastTable = tableName;
+ ++it;
+ }
+
+ //verify if the statistis can be calculated by SGBD
+ TeGroupingAttr groups = groupingAttr_;
+ string sGroup = theme->layer()->database()->getSQLStatistics(groups);
+ TeGroupingAttr::iterator itgroup = groups.begin();
+ while(itgroup!= groups.end())
+ {
+ if(itgroup->second != TeNOSTATISTIC)
+ {
+ strategy_ = "querierDBStr1";
+ return;
+ }
+ ++itgroup;
+ }
+ }
+
+ if( groupAttr && hasOneTable && (!loadGeom()))
+ strategy_ = "querierDBStr2";
+ else if( groupAttr && hasOneTable && loadGeom() && geomRep)
+ strategy_ = "querierDBStr3";
+
+ return;
+}
+
+void
+TeQuerierParams::setParams(TeTheme* theme, const string& objId, TeChronon chr)
+{
+ objId_ = objId;
+ setParams(theme, chr);
+}
+
+void
+TeQuerierParams::setParams(const string& fileName, TeChronon chr)
+{
+ fileName_ = fileName;
+ chr_ = chr;
+ strategy_ = "querierSHP";
+}
+
+
+void
+TeQuerierParams::setFillParams(bool loadGeom, bool loadAllAttr, vector<string> loadAttr)
+{
+ loadGeometries_ = loadGeom;
+ loadAllAttributes_ = loadAllAttr;
+
+ if(!loadAttr.empty())
+ loadAllAttributes_ = false;
+
+ loadAttrNames_ = loadAttr;
+ loadAttrNamesSeted_ = loadAttr;
+ groupingAttr_.clear();
+
+ if(theme_)
+ setParams(theme_, objId_, chr_);
+}
+
+void
+TeQuerierParams::setFillParams(bool loadGeom, TeGroupingAttr attrG)
+{
+ loadGeometries_ = loadGeom;
+ loadAttrNames_.clear();
+ loadAttrNamesSeted_.clear();
+ groupingAttr_ = attrG;
+
+ if(theme_)
+ setParams(theme_, objId_, chr_);
+}
+
+void
+TeQuerierParams::setSpatialRest(TeBox& box, int relation, TeGeomRep rep)
+{
+ hasSpatialRes_ = true;
+ boxRest_ = box;
+ spatialRelation_ = relation;
+
+ if(rep==TeGEOMETRYNONE)
+ geomRepRest_ = theme_->layer()->vectRepres()[0]->geomRep_;
+ else
+ geomRepRest_ = rep;
+
+ geomRest_ = 0;
+}
+
+void
+TeQuerierParams::setSpatialRest(TeGeometry* geom, int relation, TeGeomRep rep)
+{
+ hasSpatialRes_ = true;
+ geomRest_ = geom;
+ spatialRelation_ = relation;
+
+ if(rep==TeGEOMETRYNONE)
+ geomRepRest_ = theme_->layer()->vectRepres()[0]->geomRep_;
+ else
+ geomRepRest_ = rep;
+
+ boxRest_ = TeBox();
+}
diff --git a/src/terralib/kernel/TeQuerierParams.h b/src/terralib/kernel/TeQuerierParams.h
new file mode 100644
index 0000000..323d0b7
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierParams.h
@@ -0,0 +1,208 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QUERIER_PARAMS_H
+#define __TERRALIB_INTERNAL_QUERIER_PARAMS_H
+
+#include "TeTheme.h"
+
+
+//! class to handle the parameters that define a querier
+class TeQuerierParams
+{
+
+private:
+
+ /* @name Params used to fill STOs */
+ //@{
+ bool loadGeometries_;
+ bool loadAllAttributes_;
+ vector<string> loadAttrNames_;
+ vector<string> loadAttrNamesSeted_;
+ TeGroupingAttr groupingAttr_;
+ //@}
+
+ bool themeFlag_; //! if the theme is a temporary theme
+ TeTheme* theme_; //! pointer to a theme
+ TeLayer* layer_; //! pointer to a layer
+ string fileName_; //! file name (.shp, etc)
+
+ TeChronon chr_; //! chronon used to generate the slides
+ string objId_; //! object identifier
+
+ //TeStatisticType tsOper_; //operator used in the construction of temporal series
+
+ string strategy_; //! strategy name
+
+ /* @name Restrictions */
+ //@{
+ TeSelectedObjects selectedObjs_;
+
+ int spatialRelation_;
+ bool hasSpatialRes_;
+ TeBox boxRest_; //box which defines the spatial restriction
+ TeGeometry* geomRest_; //geometry which defines the spatial restriction
+ TeGeomRep geomRepRest_; //geometry representation of the theme which will be
+ //considered in the spatial restriction
+ //@}
+
+public:
+
+ //! Constructor
+ TeQuerierParams(bool loadGeom = false, bool loadAllAttr = true):
+ loadGeometries_(loadGeom),
+ loadAllAttributes_(loadAllAttr),
+ themeFlag_(false),
+ theme_ (0),
+ layer_ (0),
+ fileName_(""),
+ chr_ (TeNOCHRONON),
+ objId_(""),
+ selectedObjs_(TeAll),
+ spatialRelation_(0),
+ hasSpatialRes_(false),
+ geomRest_(0)
+ { }
+
+ //! Constructor
+ TeQuerierParams(bool loadGeom, const vector<string>& loadAttr):
+ loadGeometries_(loadGeom),
+ loadAllAttributes_(false),
+ themeFlag_(false),
+ theme_ (0),
+ layer_ (0),
+ fileName_(""),
+ chr_ (TeNOCHRONON),
+ objId_(""),
+ selectedObjs_(TeAll),
+ spatialRelation_(0),
+ hasSpatialRes_(false),
+ geomRest_(0)
+ {
+ loadAttrNamesSeted_.clear();
+ loadAttrNamesSeted_ = loadAttr;
+ }
+
+
+ //! Constructor
+ TeQuerierParams(bool loadGeom, TeGroupingAttr& groupAttr):
+ loadGeometries_(loadGeom),
+ loadAllAttributes_(false),
+ themeFlag_(false),
+ theme_ (0),
+ layer_ (0),
+ fileName_(""),
+ chr_ (TeNOCHRONON),
+ objId_(""),
+ selectedObjs_(TeAll),
+ spatialRelation_(0),
+ hasSpatialRes_(false),
+ geomRest_(0)
+ {
+ groupingAttr_.clear();
+ groupingAttr_ = groupAttr;
+ }
+
+ //! Destructor
+ ~TeQuerierParams();
+
+ //! Copy Constructor
+ TeQuerierParams(const TeQuerierParams& qp);
+
+ TeQuerierParams& operator=(const TeQuerierParams& rhs);
+
+ /* @name Sets params */
+ // @{
+ void setParams(TeLayer* layer);
+
+ void setParams(TeTheme* theme, TeChronon chr=TeNOCHRONON);
+
+ void setParams(TeTheme* theme, const string& objId, TeChronon chr=TeNOCHRONON);
+
+ void setParams(const string& fileName, TeChronon chr=TeNOCHRONON);
+ // @}
+
+ //! Sets the params to fill the STO
+ void setFillParams(bool loadGeom, bool loadAllAttr, vector<string> loadAttr = vector<string>());
+
+ //! Sets the params to fill the STO
+ void setFillParams(bool loadGeom, TeGroupingAttr attrG);
+
+ //! Set the spatial restriction to be a spatial relation with a box
+ void setSpatialRest(TeBox& box, int relation = TeWITHIN, TeGeomRep rep = TeGEOMETRYNONE);
+ //! Set the spatial restriction to be a spatial relation with a geometry
+ void setSpatialRest(TeGeometry* geom, int relation = TeWITHIN, TeGeomRep rep = TeGEOMETRYNONE);
+
+ //! Set selected objects
+ void setSelecetObjs(TeSelectedObjects so) { selectedObjs_ = so; }
+
+ //! Sets the attributes that will be loaded
+ void setLoadAttrs(const vector<string>& vec) { loadAttrNames_ = vec; }
+
+ //! Returns the identifier of the strategy associated to the querier
+ string decName() { return strategy_; }
+
+ //! Returns the theme
+ TeTheme* theme() { return theme_; }
+
+ //! Returns the layer
+ TeLayer* layer() { return layer_; }
+
+ //! Returns the file name
+ string fileName() { return fileName_; }
+
+ //! Returns the chronon
+ TeChronon chronon() { return chr_; }
+
+ //! Returns the object identifier
+ string objId() { return objId_; }
+
+ //! Returns the attributes that will be grouped
+ TeGroupingAttr& groupAttr() { return groupingAttr_;}
+
+ //! Returns if it loads geometries
+ bool loadGeom () { return loadGeometries_; }
+
+ //! Returns if it loads all attributes
+ bool loadAllAttr() { return loadAllAttributes_;}
+
+ //! Returns the attributes that will be loaded
+ vector<string>& loadAttrs() { return loadAttrNames_;}
+
+ //! Returns the original attributes that will be loaded
+ vector<string>& loadSetedAttrs() { return loadAttrNamesSeted_;}
+
+ TeSelectedObjects selectedObjs() { return selectedObjs_; }
+
+ int spatialRelation() { return spatialRelation_; }
+
+ bool hasSpatialRes() { return hasSpatialRes_;}
+
+ TeBox boxRest() { return boxRest_; }
+
+ TeGeometry* geomRest() { return geomRest_; }
+
+ TeGeomRep geomRepRest() { return geomRepRest_; }
+};
+
+#endif
diff --git a/src/terralib/kernel/TeQuerierSHP.h b/src/terralib/kernel/TeQuerierSHP.h
new file mode 100644
index 0000000..c5d7eba
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierSHP.h
@@ -0,0 +1,70 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_QUERIER_SHP_H
+#define __TERRALIB_INTERNAL_QUERIER_SHP_H
+
+#include "TeQuerierImpl.h"
+
+
+//! A class to build STOs (Spatial Temporal Objects) from a shape file
+class TeQuerierSHP : public TeQuerierImpl
+{
+ public:
+
+ //! Constructor
+ TeQuerierSHP(TeQuerierParams& params): TeQuerierImpl(params)
+ { }
+
+
+ //! Returns the file name
+ string fileName () { return params_.fileName(); }
+
+ bool loadInstances(TeTSEntry* /* ent */ = 0) { return false; }
+
+ bool loadStatistics(TeTSEntry* /* ent */ = 0) { return false; }
+
+ bool fetchInstance(TeSTInstance& /* stoi */) { return false; }
+
+ bool getBasicStatistics(TeStatisticValMap& /* stats */, TeTSEntry* /* ent */ = 0) { return false; }
+};
+
+//! A class that define a factory to build a querier strategy from shape file
+class TeQuerierSHPFactory : public TeQuerierImplFactory
+{
+public:
+
+ //! Constructor
+ TeQuerierSHPFactory(const string& name) : TeQuerierImplFactory(name) {}
+
+ //! Builds a shapefile querier
+ virtual TeQuerierImpl* build (const TeQuerierParams& arg)
+ {
+ TeQuerierParams tempArg = arg;
+ return new TeQuerierSHP(tempArg);
+ }
+};
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeRaster.cpp b/src/terralib/kernel/TeRaster.cpp
new file mode 100644
index 0000000..ea98cf9
--- /dev/null
+++ b/src/terralib/kernel/TeRaster.cpp
@@ -0,0 +1,632 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeRaster.h>
+#include <TeDecoder.h>
+#include <TeUtils.h>
+#include <TeStdFile.h>
+#include <TeException.h>
+#include "TeRasterRemap.h"
+#include "TeDecoderMemory.h"
+
+#include <algorithm>
+
+
+//! virtual class that define the strategics of the iteratorPoly, each strategic is a functor
+class TeStrategic
+{
+protected:
+ TeRaster* raster_;
+ double y_;
+ TeCoordPairVect SegOut_; //line and column index
+
+public:
+ TeStrategic(TeRaster* r=0, double y=0): raster_(r), y_(y) {}
+
+ virtual ~TeStrategic() {}
+
+ void Init(TeRaster* r, double y)
+ {
+ raster_ = r;
+ y_ = y;
+ }
+
+ virtual void strateg(double xMin, double xMax, double y) = 0;
+
+ void operator() (TeCoordPair& pair)
+ {
+ //xmin and xmax of the segment (line and column index)
+ double xMinSegCM = pair.pt1.x();
+ double xMaxSegCM = pair.pt2.x();
+
+ //line and column index of the segment
+ TeCoord2D minSegCM(xMinSegCM, y_);
+ TeCoord2D maxSegCM(xMaxSegCM, y_);
+
+ TeCoord2D minSegLC = raster_->coord2Index (minSegCM);
+ TeCoord2D maxSegLC = raster_->coord2Index (maxSegCM);
+
+ double xMinLCd = minSegLC.x();
+ double xMaxLCd = maxSegLC.x();
+ double yLC = maxSegLC.y();
+
+ //verify if is outside raster area
+ if(xMinLCd<-0.5)
+ {
+ if(xMaxLCd<-0.5)
+ return;
+ else
+ xMinLCd=-0.5;
+ }
+
+ strateg(xMinLCd, xMaxLCd, yLC);
+ }
+
+ TeCoordPairVect result() const {return SegOut_;}
+};
+
+
+//! functor TePixelBoxInPoly
+/*
+ return the elements of the raster which box is
+ contained in the polygon
+*/
+class TePixelBoxInPoly: public TeStrategic
+{
+
+public:
+ TePixelBoxInPoly(TeRaster* r=0, double y=0): TeStrategic(r,y) {}
+
+ virtual ~TePixelBoxInPoly() {}
+
+ void strateg(double xMin, double xMax, double y)
+ {
+ //verify if contain the element center
+ int xMinLCi = TeRoundRasterIndex(xMin);
+ int xMaxLCi = TeRoundRasterIndex(xMax);
+
+ if (xMinLCi < xMin)
+ xMinLCi++;
+
+ if (xMaxLCi > xMax)
+ xMaxLCi--;
+
+ if (xMinLCi <= xMaxLCi)
+ {
+ //new segment
+ TeCoord2D minLC (xMinLCi, y);
+ TeCoord2D maxLC (xMaxLCi, y);
+
+ TeCoordPair res;
+ res.pt1 = minLC;
+ res.pt2 = maxLC;
+
+ SegOut_.push_back (res);
+ }
+ }
+
+};
+
+
+//! functor TePixelBBInterPoly
+/*
+ return the elements of the raster "cujo" boundingbox
+ intersects the polygon
+*/
+class TePixelBBInterPoly: public TeStrategic
+{
+
+public:
+ TePixelBBInterPoly(TeRaster* r=0, double y=0): TeStrategic(r,y) {}
+
+ virtual ~TePixelBBInterPoly() {}
+
+ void strateg(double xMin, double xMax, double y)
+ {
+ //element center
+ int xMinLCi = TeRoundRasterIndex(xMin);
+ int xMaxLCi = TeRoundRasterIndex(xMax);
+
+ if (SegOut_.size()>0)
+ {
+ TeCoordPair prev = SegOut_[SegOut_.size()-1];
+ if (xMinLCi == prev.pt2.x())
+ xMinLCi++;
+ if (xMinLCi > xMaxLCi)
+ return;
+ }
+
+ TeCoord2D minLC (xMinLCi, y);
+ TeCoord2D maxLC (xMaxLCi, y);
+
+ TeCoordPair res;
+ res.pt1 = minLC;
+ res.pt2 = maxLC;
+
+ SegOut_.push_back (res);
+ }
+};
+
+
+TeCoordPairVect
+applyStrategic(double& y, double ymin, double xmin, TeStrategicIterator st, TeRaster* raster, TePolygon& poly)
+{
+ TeCoordPairVect Segments = TeGetIntersections(poly, y);
+ double resy = raster->params().resy_;
+
+ //In polygon
+ if((st==TeBoxPixelIn) || (st==TeBBoxPixelInters))
+ {
+ bool empty=false;
+ if(Segments.empty())
+
+ {
+ empty = true;
+ y -= resy;
+ while((y>=ymin) && (empty))
+ {
+ Segments = TeGetIntersections(poly, y);
+ if(!Segments.empty())
+ empty = false;
+ else
+ y -=resy;
+ }
+ }
+ if(!empty)
+ {
+ if (st==TeBoxPixelIn)
+ {
+ TePixelBoxInPoly strat(raster,y);
+ strat = for_each(Segments.begin (), Segments.end(), strat);
+ return strat.result();
+ }
+ else
+ {
+ TePixelBBInterPoly strat(raster,y);
+ strat = for_each(Segments.begin (), Segments.end(), strat);
+ return strat.result();
+ }
+ }
+ }
+ //Out polygon
+ else if((st==TeBoxPixelOut) || (st==TeBBoxPixelNotInters))
+ {
+ int nCols = raster->params().ncols_;
+
+ //se o segmento for vazio, n�o h� interse��o entre essa linha e o pol�gono
+ //fazer um segmento de todas as colunas
+ if(Segments.empty())
+ {
+ //passar para indice: linha e coluna
+ TeCoord2D coordCM (xmin, y);
+ double linLC = (raster->coord2Index(coordCM)).y();
+
+ int lin = TeRoundRasterIndex(linLC);
+
+ TeCoord2D index1(0, lin);
+ TeCoord2D index2(nCols-1,lin);
+
+ TeCoordPair pair;
+ pair.pt1=index1;
+ pair.pt2=index2;
+
+ Segments.push_back(pair);
+ return Segments;
+ }
+ else
+ {
+ TeCoordPairVect segsIn, segResult;
+
+ if(st==TeBoxPixelOut)
+ {
+ TePixelBoxInPoly strat(raster,y);
+ //return the segments in the polygon
+ strat = for_each(Segments.begin (), Segments.end(), strat);
+ segsIn = strat.result();
+ }
+ else
+ {
+ TePixelBBInterPoly strat(raster,y);
+ //return the segments in the polygon
+ strat = for_each(Segments.begin (), Segments.end(), strat);
+ segsIn = strat.result();
+ }
+
+ TeCoordPairVect::iterator it = segsIn.begin();
+
+ double colMin = 0;
+ double colMax;
+ double lin;
+
+ while(it!=segsIn.end())
+ {
+ TeCoord2D coord1 = (*it).pt1;
+ TeCoord2D coord2 = (*it).pt2;
+ lin = coord1.y();
+
+ colMax = coord1.x()-1;
+
+ if (colMax >= colMin)
+ {
+ TeCoord2D index1(colMin, lin);
+ TeCoord2D index2(colMax, lin);
+
+ TeCoordPair pair;
+ pair.pt1=index1;
+ pair.pt2=index2;
+
+ segResult.push_back(pair);
+ }
+ colMin = coord2.x()+1;
+ ++it;
+ }
+
+ //Montar o �ltimo segmento
+ TeCoord2D index1(colMin, lin);
+ TeCoord2D index2(nCols-1,lin);
+
+ TeCoordPair pair;
+ pair.pt1=index1;
+ pair.pt2=index2;
+
+ segResult.push_back(pair);
+ return segResult;
+ }
+ }
+
+ return Segments;
+}
+
+
+TeRaster::TeRaster( TeRasterParams& pars )
+{
+ decoder_ = 0;
+ string decName;
+ params_.status_ = TeNOTREADY;
+ if (pars.decoderIdentifier_.empty()) // the decoder is not especified in raster parameters
+ {
+ if (!pars.fileName_.empty()) // try to guess from the file name
+ {
+ string ext = TeGetExtension(pars.fileName_.c_str());
+ decName = TeDecoderFactory::instanceName2Dec()[ext];
+ if ( decName.empty())
+ return;
+ pars.decoderIdentifier_ = decName;
+ }
+ else // no decoder type, and no filename
+ return;
+ }
+ decoder_ = TeDecoderFactory::make(pars);
+ if (decoder_)
+ {
+ params_ = decoder_->params();
+ box_ = decoder_->params().box();
+ }
+}
+
+TeRaster::TeRaster( const string& filename, const char& mode )
+{
+ params_.fileName_ = filename;
+ params_.mode_ = mode;
+ decoder_ = 0;
+ params_.status_ = TeNOTREADY;
+ string decName;
+ if (!filename.empty())
+ {
+ string ext = TeGetExtension(filename.c_str());
+ decName = TeDecoderFactory::instanceName2Dec()[ext];
+ if (decName.empty())
+ return;
+ }
+ else
+ return;
+
+ params_.decoderIdentifier_= decName;
+ decoder_ = TeDecoderFactory::make (params_);
+ if (decoder_)
+ {
+ params_ = decoder_->params();
+ box_ = decoder_->params().box();
+ }
+}
+
+
+TeRaster::TeRaster(int ncols, int nlines, int nbands, TeDataType elemType)
+{
+ params_.decoderIdentifier_= "MEM";
+ params_.ncols_ = ncols;
+ params_.nlines_ = nlines;
+ params_.nBands(nbands);
+ params_.setDataType(elemType);
+ params_.mode_ = 'c';
+ params_.lowerLeftResolutionSize(0.5,0.5,1.0,1.0,params_.ncols_,params_.nlines_,true);
+ TeProjection* proj = new TeNoProjection();
+ params_.projection(proj);
+ decoder_ = new TeDecoderMemory(params_);
+ delete proj;
+ if (decoder_)
+ {
+ params_ = decoder_->params();
+ box_ = decoder_->params().box();
+ }
+}
+
+
+TeRaster::~TeRaster( )
+{
+ if (decoder_)
+ delete decoder_;
+}
+
+bool TeRaster::init( TeRasterParams& pars )
+{
+ if (!decoder_ )
+ {
+ params_.status_ = TeNOTREADY;
+ string decName;
+ if (params_.decoderIdentifier_.empty()) // the decoder is not especified in raster parameters
+ {
+ if (!params_.fileName_.empty()) // try to guess from the file name
+ {
+ string ext = TeGetExtension(params_.fileName_.c_str());
+ decName = TeDecoderFactory::instanceName2Dec()[ext];
+ if ( decName.empty())
+ return false;
+ params_.decoderIdentifier_ = decName;
+ }
+ else // no decoder type, and no filename
+ return false;
+ }
+ decoder_ = TeDecoderFactory::make(params_);
+ if (!decoder_)
+ return false;
+ }
+ decoder_->init(pars);
+ params_ = decoder_->params();
+ box_ = decoder_->params().box();
+ return (params_.status_ != TeNOTREADY);
+}
+
+bool TeRaster::init()
+{
+ if (decoder_)
+ {
+ decoder_->init(params_);
+ params_ = decoder_->params();
+ return (params_.status_ != TeNOTREADY);
+ }
+ return false;
+}
+
+bool TeRaster::setElement (int col, int lin, double val,int band)
+{
+ if (params_.status_!=TeREADYTOWRITE)
+ return false;
+ if ( col < 0 || col >= params_.ncols_ ||
+ lin < 0 || lin >= params_.nlines_ ||
+ band < 0 || band >= params_.nBands())
+ return false;
+
+ bool res = decoder_->setElement(col,lin,val,band);
+ if ( res && (!params_.useDummy_ || val != params_.dummy_[band]))
+ {
+ // check if should update min and max values
+ if (val < params_.vmin_[band])
+ {
+ params_.vmin_[band] = val;
+ decoder_->params().vmin_[band] = val;
+ }
+
+ if (val > params_.vmax_[band])
+ {
+ params_.vmax_[band] = val;
+ decoder_->params().vmax_[band] = val;
+ }
+ }
+ return res;
+}
+
+bool TeRaster::getElement (int col, int lin, double& val,int band)
+{
+ if (!params_.status_ || col < 0 || col >= params_.ncols_ ||
+ lin < 0 || lin >= params_.nlines_ ||
+ band < 0 || band >= params_.nBands())
+ return false;
+
+ if (decoder_->getElement (col,lin,val,band) &&
+ (!params_.useDummy_ || val != params_.dummy_[band]))
+ return true;
+ else
+ return false;
+}
+
+TeRaster::iteratorPoly
+TeRaster::begin(TePolygon& poly, TeStrategicIterator st, int band)
+{
+ double minLinLC, maxLinLC, minColLC, maxColLC; //index
+ double minLinCM, maxLinCM, minColCM, maxColCM; //world coordinates
+ int nlines = 0;
+ int ncols = 0;
+ double resy = params_.resy_;
+ bool end = false;
+
+ if((st==TeBoxPixelOut) || (st==TeBBoxPixelNotInters)) //out polygon
+ {
+ minLinLC = (params_.nlines_-1);
+ maxLinLC = 0.0;
+ minColLC = 0.0;
+ maxColLC = (params_.ncols_-1);
+ }
+ else //in polygon
+ {
+ //box (world coordinates) of the polygon
+ TeBox boxPol = poly.box();
+
+ //change to line and column index
+ TeCoord2D minColLinLC = coord2Index(boxPol.lowerLeft());
+ TeCoord2D maxColLinLC = coord2Index(boxPol.upperRight());
+
+ //segment that pass by center of the element
+ minLinLC = TeRound(minColLinLC.y());
+ maxLinLC = TeRound(maxColLinLC.y());
+ minColLC = TeRound(minColLinLC.x());
+ maxColLC = TeRound(maxColLinLC.x());
+
+ //number of lines and columns of the polygon box
+ nlines = (int)((minLinLC - maxLinLC)+1);
+ ncols = (int)((maxColLC - minColLC)+1);
+
+
+ //if is negative
+ if(minLinLC<-0.5)
+ {
+ if(maxLinLC<-0.5)
+ end=true;
+ else
+ minLinLC = -0.5;
+ }
+
+ if(minColLC<-0.5)
+ {
+ if(maxColLC<-0.5)
+ end=true;
+ else
+ minColLC = -0.5;
+ }
+ }
+
+ TeCoord2D MinColLinLC(minColLC, minLinLC);
+ TeCoord2D MaxColLinLC(maxColLC, maxLinLC);
+
+ //calculate the minimal and maximal line and minimal column (in world coordinates)
+ TeCoord2D MinColLinCM = index2Coord(MinColLinLC);
+ minLinCM = MinColLinCM.y();
+ minColCM = MinColLinCM.x();
+ maxLinCM = index2Coord(MaxColLinLC).y();
+ maxColCM = index2Coord(MaxColLinLC).x();
+
+ TeCoordPairVect segRes;
+ bool empty = true;
+ bool first = true;
+
+ while(empty && (maxLinCM >= minLinCM))
+ {
+ if(!first)
+ {
+ maxLinCM -= resy;
+ TeCoord2D maxColLinLC = coord2Index(TeCoord2D(maxColCM,maxLinCM));
+ maxLinLC = TeRound(maxColLinLC.y());
+ }
+
+ segRes = applyStrategic(maxLinCM, minLinCM, minColCM, st, this, poly);
+ empty = segRes.empty();
+ first = false;
+ }
+
+ if(!segRes.empty())
+ {
+ minColLC = segRes[0].pt1.x();
+ double lMin = segRes[0].pt1.y();
+ maxColLC = segRes[0].pt2.x();
+
+ int cCurr = TeRound(minColLC); //column current
+ int lCurr = TeRound(lMin); //line current
+
+ iteratorPoly itPoly(cCurr, lCurr, params_.ncols_, params_.nlines_, params_.nBands(), this, poly,
+ st, maxLinLC, minLinLC, minColLC, maxColLC, segRes,
+ 0, nlines, ncols, end, minLinCM);
+ return itPoly;
+
+ }
+ else
+ {
+ iteratorPoly itPoly = this->end(poly, st, band);
+ return itPoly;
+ }
+}
+
+
+bool
+TeRaster::fillRaster(TeRaster* dstRaster, TeRasterTransform* transf, bool bestRes)
+{
+ if (!dstRaster->status() || !decoder_)
+ return false;
+
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+
+ TeRasterRemap fillRemap;
+ fillRemap.setOutput(dstRaster);
+ fillRemap.setInput(this);
+ fillRemap.setTransformer(transf);
+ int res = 1;
+ TeBox b = dstRaster->params().boundingBox();
+ if (bestRes)
+ res = decoder_->bestResolution(b, dstRaster->params().nlines_, dstRaster->params().ncols_,
+ dstRaster->params().projection());
+ this->clearBlockSelection();
+ bool result = true;
+ TeRasterParams parBlock;
+ if (selectBlocks(b, res, parBlock))
+ {
+ if (TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(this->numberOfSelectedBlocks());
+ TeRaster* block = new TeRaster;
+ TeDecoderMemory* decMem = new TeDecoderMemory(parBlock);
+ decMem->init();
+ int n = 0;
+ t2 = clock();
+ t0 = t1 = t2;
+ bool flag = true;
+ do
+ {
+ flag = fetchRasterBlock(decMem);
+ block->setDecoder(decMem);
+ fillRemap.setInput(block);
+ if (!fillRemap.apply())
+ break;
+ n++;
+ if (TeProgress::instance())
+ {
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ if((int)(t2-t0) > dt2) // show progress
+ TeProgress::instance()->setProgress(n);
+ }
+ }
+ }while (flag);
+ decMem->clear();
+ delete block;
+ }
+ else
+ result = fillRemap.apply();
+ this->clearBlockSelection();
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ return result;
+}
diff --git a/src/terralib/kernel/TeRaster.h b/src/terralib/kernel/TeRaster.h
new file mode 100644
index 0000000..0b597d6
--- /dev/null
+++ b/src/terralib/kernel/TeRaster.h
@@ -0,0 +1,627 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeRaster.h
+ This file contains structures and definitions to deal with raster structures
+*/
+#ifndef __TERRALIB_INTERNAL_RASTER_H
+#define __TERRALIB_INTERNAL_RASTER_H
+
+#include "TeDecoder.h"
+#include "TeDataTypes.h"
+#include "TeCoord2D.h"
+#include "TeAttribute.h"
+#include "TeGeometry.h"
+#include "TeGeometryAlgorithms.h"
+
+class TeRasterTransform;
+
+#include <map>
+
+//! Strategy used to decide if a pixel is inside/outside a polygon
+enum TeStrategicIterator
+{ TeBoxPixelIn, //!< center of pixel is inside the geometry
+ TeBBoxPixelInters, //!< bounding box of pixel intercepts the geometry
+ TeBoxPixelOut, //!< center of pixel is outside the geometry
+ TeBBoxPixelNotInters //!< bounding box of pixel do not intercept the geometry
+};
+
+/*! \fn bool TeCoordPairVect applyStrategic(double& y, double ymin, double xmin, TeStrategicIterator st, TeRaster* raster, TePolygon& poly);
+ \brief Returns
+ \param y
+ \param ymin
+ \param xmin
+ \param st pixel in polygon strategy
+ \param raster pointer to raster
+ \param poly polygon
+ */
+TeCoordPairVect
+applyStrategic(double& y, double ymin, double xmin,
+ TeStrategicIterator st, TeRaster* raster, TePolygon& poly);
+
+//! Support for a raster geometry
+/*
+ \par A Raster Geometry is made of a matrix of ncolumns x nlines elements
+ with nBands dimension. Each element, or pixel, of the raster its is
+ indexed by a column, line and band and has a double value associated.
+ \par Each Raster geometry has a decoder associated to it. Its decoder
+ knows how to get return the value (as a double) of each pixel.
+ \par All information about the data is stored in a TeRasterParams structure
+ that is duplicated in its decoder.
+ \sa TeDecoder TeRasterParams
+*/
+class TeRaster : public TeGeometry
+{
+ TeRasterParams params_; //!< structure that describes all information about a raster
+ TeDecoder *decoder_; //!< pointer to a decoder of values
+public:
+
+ //! Constructor from file
+ /*!
+ This method tries to instatiate a decoder for this data from the
+ file extension of the filename.
+ \param filename the name of a file that contains the raster data
+ \param mode file opening mode ('r', 'w' or 'c')
+ \par Obs: the method init should be called before any attempt to read or write this raster data
+ */
+ TeRaster(const string& filename, const char& mode = 'r');
+
+ //! Constructor from parameters
+ /*!
+ This method tries to instatiate a decoder for this data. It uses the identification
+ explicitly described or the extension of a file name specified in the parameters.
+ \param pars a raster parameters structure that contains information about the raster
+ \par Obs: the method init should be called before any attempt to read or write data
+ to the raster.
+ */
+ TeRaster(TeRasterParams& pars);
+
+ //! Contructor from commom parameters
+ /*
+ This method creates a raste data in memory, using only the most basic
+ parameters:
+ \par ncols number of columns
+ \par nlines number of lines
+ \par nbands number of bands
+ \par elemType size of each element
+ */
+ TeRaster(int ncols, int nlines, int nbands, TeDataType elemType);
+
+ //! Empty constructor
+ TeRaster() : decoder_(0) {}
+
+ //! Destructor
+ ~TeRaster ();
+
+ //! Returns the parameters of the raster
+ TeRasterParams& params()
+ { return params_; }
+
+ //! Returns the number of lines of the raster
+ int nBands()
+ { return params_.nBands(); }
+
+ //! Update the parametes of a raster file
+ /*!
+ \param par a new raster parameters structure
+ */
+ void updateParams( TeRasterParams& par)
+ {
+ params_ = par; // update raster parameters
+ if (decoder_)
+ decoder_->updateParams(par); // update its decoder parameters
+ box_ = params_.box();
+ }
+
+ //! Returns the type of the geometry
+ TeGeomRep elemType() { return TeRASTER; }
+
+ //! Associate a decoder to a raster
+ /*!
+ \param dec pointer to a raster decoder
+ */
+ void setDecoder( TeDecoder* dec )
+ {
+ if (dec)
+ {
+ decoder_ = dec; // set the decoder
+ params_ = decoder_->params(); // copy decoder parameters to raster
+ box_ = params_.box();
+ }
+ }
+
+ //! Returns status of the raster
+ int status()
+ { return params_.status_; }
+
+ //! Returns a pointer to the decoder associated to this raster
+ TeDecoder* decoder( )
+ { return decoder_; }
+
+ //! Returns a pointer to the raster projection
+ TeProjection* projection ()
+ { return params_.projection(); }
+
+ //! Sets the value of a element of the raster
+ /*!
+ \param col column number
+ \param lin line number
+ \param val element value
+ \param band band number
+ */
+ bool setElement (int col, int lin, double val, int band=0);
+
+ //! Gets the value of a element of the raster
+ /*!
+ \param col column number
+ \param lin line number
+ \param val element value
+ \param band band number
+ */
+ bool getElement (int col, int lin, double& val, int band=0);
+
+ //! Fills a destination raster with the raster elements
+ /*
+ \param dstRaster destination raster
+ \param transf pixel evaluator to be used
+ \param bestRes flag to indicate that it should use the best resolution available
+ */
+ bool fillRaster (TeRaster* dstRaster, TeRasterTransform* transf=0, bool bestRes = true);
+
+ //! Initalize the raster decoding tool from its parameters
+ /*! The result of this method depends on the mode_ specified in the parameters.
+ \par 'r' : initializes a raster with reading only permission. If the source
+ of the data doesn�t exist it will fail.
+ \par 'w' : initializes a raster with reading and writting permission. If the source
+ of the data doesn�t exist will fail.
+ \par 'c' : creates a new raster data with default values. Initializes it with
+ reading and writting permision. Fails if creation fail.
+ */
+ bool init();
+
+ //! Initalize the raster decoding tool from a raster parameters structure
+ /*!
+ \return true if raster is read to be read/written and false otherwise.
+ */
+ bool init(TeRasterParams& pars);
+
+ //! Clear internal structures and disable the raster decoding tool
+ void clear()
+ {
+ if (decoder_)
+ decoder_->clear();
+ }
+
+ //! Transform a coordinate from line/column domain to projection domain
+ TeCoord2D index2Coord(TeCoord2D pt)
+ { return decoder_->index2Coord(pt); }
+
+ //! Transform a coordinate from projection domain domain to line/column
+ TeCoord2D coord2Index(TeCoord2D pt)
+ { return decoder_->coord2Index(pt); }
+
+ //----------------
+ //! A raster iterator
+ /*!
+ An strucuture that allows the traversal over the raster elements
+ (pixels) in a similar way as the STL iterators.
+ */
+ class iterator
+ {
+ public:
+
+ //! Constructor
+ /*!
+ \param c0 initial column
+ \param l0 initial line
+ \param nc number of columns
+ \param nl number of lines
+ \param nb number of bands
+ \param pt pointer to the raster to iterate
+ */
+ iterator(int c0=0, int l0=0, int nc=0, int nl=0, int nb=0, TeRaster* pt=0) :
+ linCurrent_(l0),
+ colCurrent_(c0),
+ nLines_(nl),
+ nCols_(nc),
+ nBands_(nb),
+ raster_(pt)
+ {}
+
+ //! Move iterator forward
+ virtual void moveForward()
+ {
+ this->operator++();
+ }
+
+ //! Prefix move forward operator
+ iterator& operator++()
+ {
+ if (++colCurrent_ == nCols_)
+ {
+ if (linCurrent_ < nLines_-1)
+ {
+ linCurrent_++;
+ colCurrent_ = 0;
+ }
+ }
+ return *this;
+ }
+
+ //! Posfix move forward operator
+ iterator operator++(int)
+ {
+ iterator temp = *this;
+ ++(*this);
+ return temp;
+ }
+
+ //! Returns iterator current line
+ int currentLine()
+ { return linCurrent_;}
+
+ //! Returns iterator current column
+ int currentColumn()
+ {return colCurrent_; }
+
+ //! Returns the number of bands
+ int nBands(void)
+ { return nBands_; }
+
+ //! Iterator de-referencing operator
+ /*!
+ \return a vector (with nbands_ size) with the values in
+ each band, of the element pointed by the iterator
+ */
+ vector<double> operator*()
+ {
+ vector<double> vt(nBands_);
+ if ((linCurrent_ < nLines_) && (colCurrent_ < nCols_))
+ {
+ for (int n=0; n<nBands_; n++)
+ raster_->getElement(colCurrent_,linCurrent_,vt[n],n);
+ }
+ return vt;
+ }
+
+ //! Returns the value in a given band of a element pointed by the iterator
+ double operator*(int band)
+ {
+ double val = 0.0;
+ if ((linCurrent_ < nLines_) && (colCurrent_ < nCols_))
+ {
+ if (raster_->getElement(colCurrent_,linCurrent_,val,band))
+ return val;
+ }
+ return 0.0;
+ }
+
+ //! Returns whether two iterators point to the same element
+ bool operator==(const iterator& rhs) const
+ {
+ return (this->colCurrent_ == rhs.colCurrent_ && this->linCurrent_== rhs.linCurrent_);
+ }
+
+ //! Returns whether two iterators point to the different elements
+ bool operator!=(const iterator& rhs) const
+ {
+ return (this->colCurrent_ != rhs.colCurrent_ || this->linCurrent_!= rhs.linCurrent_);
+ }
+
+ protected:
+ int linCurrent_, colCurrent_;
+ int nLines_, nCols_;
+ int nBands_;
+ TeRaster* raster_;
+ };
+
+ // --------------------- End of class raster Iterator
+
+ //----------------
+ //! A raster iterator with a restriction of area
+ /*!
+ A strucuture that allows to cover the raster elements
+ (pixels) that are IN or OUT a specific region (polygon)
+ */
+ class iteratorPoly : public iterator
+ {
+ public:
+ //! Constructor
+ /*!
+ \param colCurr initial column
+ \param linCurr initial line
+ \param nc number of columns
+ \param nl number of lines
+ \param nb number of bands
+ \param pt pointer to the raster that will be covered
+ \param poly polygon that defines a specific region
+ \param str strategic of the iterator, IN or OUT the polygon
+ \param linMin minimal line of the raster that will be covered
+ \param linMax maximal line of the raster that will be covered
+ \param colMin minimal column of the raster that will be covered
+ \param colMax maximal column of the raster that will be covered
+ \param seg the segments of intersection of the current line
+ \param posSeg the current segment
+ \param nlInPoly number of lines IN the polygon
+ \param nColsInPoly number of columns IN the polygon
+ \param e iterator end
+ \param minLinCM minimal line (in world coordinates)
+ \param band band to iterate
+ */
+ iteratorPoly(int colCurr, int linCurr, int nc, int nl, int nb, TeRaster* pt, TePolygon& poly,
+ TeStrategicIterator str, double linMin=0.0, double linMax=0.0, double colMin=0.0,
+ double colMax=0.0, TeCoordPairVect seg=TeCoordPairVect(),
+ int posSeg=0, int nlInPoly=0, int nColsInPoly=0, bool e=true, double minLinCM=0.0, int band = 0):
+ iterator(colCurr,linCurr,nc,nl,nb,pt),
+ linMin_(linMin),
+ linMax_(linMax),
+ colMin_(colMin),
+ colMax_(colMax),
+ segments_(seg),
+ posSegments_(posSeg),
+ poly_(poly),
+ end_(e),
+ strategy_(str),
+ nLinesInPoly_(nlInPoly),
+ nColsInPoly_(nColsInPoly),
+ linMinCM_(minLinCM),
+ band_(band)
+ {}
+
+ //! empty contructor
+ iteratorPoly(TeRaster* raster = 0):
+ iterator(0,0,0,0,0,raster),
+ linMin_(0.0),
+ linMax_(0.0),
+ colMin_(0.0),
+ colMax_(0.0),
+ posSegments_(0),
+ end_(true),
+ nLinesInPoly_(0),
+ nColsInPoly_(0),
+ band_(0)
+ {}
+
+ //! destructor
+ virtual ~iteratorPoly() {}
+
+ //! calculate the segment of the current line that intersect the polygon
+ void getNewSegment(int linCurr)
+ {
+ //change to world coordinates
+ TeCoord2D coord(colMin_,linCurr);
+ TeCoord2D colLinCM = raster_->index2Coord(coord);
+
+ double linCM = colLinCM.y();
+ double colMinCM = colLinCM.x();
+
+ //applyStrategic: return the segments
+ segments_ = applyStrategic(linCM, linMinCM_, colMinCM, strategy_, raster_, poly_);
+
+ colMin_ = segments_[0].pt1.x();
+ colMax_ = segments_[0].pt2.x();
+
+ colCurrent_=(int)colMin_;
+ posSegments_ = 0;
+ end_ = false;
+ }
+
+ void moveForward()
+ {
+ this->operator++();
+ }
+
+ //! Prefix move forward operator
+ iteratorPoly& operator++() //prefix
+ {
+ if (++colCurrent_>colMax_)
+ {
+ if((++posSegments_ > (int)(segments_.size()-1)) || (segments_.size()<1))
+ {
+ if(++linCurrent_>linMax_)
+ {
+ end_ = true;
+ *this = raster_->end(poly_,strategy_);
+ }
+ else
+ {
+ segments_.clear();
+ do
+ {
+ getNewSegment(linCurrent_);
+ if (segments_.empty())
+ linCurrent_++;
+ else
+ break;
+ } while (linCurrent_<=linMax_);
+ if (linCurrent_ > linMax_)
+ {
+ end_ = true;
+ *this = raster_->end(poly_,strategy_);
+ }
+ }
+ }
+ else
+ {
+ colMin_ = segments_[posSegments_].pt1.x();
+ colMax_ = segments_[posSegments_].pt2.x();
+ colCurrent_=(int)colMin_;
+ }
+ }
+
+ return *this;
+ }
+
+ //! Prefix move orward operator
+ iteratorPoly operator++(int)
+ {
+ iteratorPoly temp = *this;
+ ++(*this);
+ return temp;
+ }
+
+ //! Dereferencing operator
+ /*!
+ This operator was designed for compatibility reasons with standard
+ containers of STL.
+ If there is a band restriction defined it will return the value associated to that band.
+ Otherwise will return the value associated to band 0.
+ */
+ double operator*()
+ {
+ double val = 0.0;
+ if ((linCurrent_ < nLines_) && (colCurrent_ < nCols_))
+ {
+ if (raster_->getElement(colCurrent_,linCurrent_,val,band_))
+ return val;
+ }
+ return 0.0;
+ }
+
+ //! Returns the value of a given band of the element pointed by the iterator
+ double operator*(int band)
+ {
+ double val = 0.0;
+ if ((linCurrent_ < nLines_) && (colCurrent_ < nCols_))
+ {
+ if (raster_->getElement(colCurrent_,linCurrent_,val,band))
+ return val;
+ }
+ return 0.0;
+ }
+
+ //! Returns the value of of the element pointed by the iterator as TeProperty structure
+ /*!
+ If there is a band restriction defined it will return the value associated to that band.
+ Otherwise will return the value associated to band 0.
+ */
+ bool getProperty(TeProperty& prop)
+ {
+ double val = 0.0;
+ prop.attr_.rep_.type_ = TeREAL;
+ if (!raster_) prop.attr_.rep_.name_ = raster_->params().fileName_ + Te2String(band_);
+ prop.value_ = Te2String (val);
+
+ if ((linCurrent_ < nLines_) && (colCurrent_ < nCols_))
+ {
+ if (raster_->getElement(colCurrent_,linCurrent_,val,band_))
+ {
+ prop.value_ = Te2String (val);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ //! Returns the last past one element in the polygon
+ bool end()
+ { return end_; }
+
+ //! Returns the number of lines covered by the iterator
+ int nLinesInPoly()
+ { return nLinesInPoly_;}
+
+ //! Returns the number of columns covered by the iterator
+ int nColsInPoly()
+ { return nColsInPoly_;}
+
+ private:
+ double linMin_, linMax_;
+ double colMin_, colMax_;
+ TeCoordPairVect segments_;
+ int posSegments_;
+ TePolygon poly_;
+ bool end_;
+ TeStrategicIterator strategy_;
+ int nLinesInPoly_, nColsInPoly_;
+ double linMinCM_; //minimal line in world coordinates
+ int band_; // band restriction
+ };
+
+ //! Returns an iterator to the first element of the raster
+ iterator begin()
+ {
+ return iterator(0,0, params_.ncols_,params_.nlines_, params_.nBands(), this);
+ }
+
+ //! Returns an iterator to the first element of the raster IN or OUT the polygon
+ /*!
+ \param poly polygon that delimitates the iterator traversal
+ \param st stragetegy used to decide if a pixel is in or out a polygon
+ \param band optional band restriction
+ */
+ iteratorPoly begin(TePolygon& poly, TeStrategicIterator st, int band=0);
+
+
+ //! Returns the end past one position of the elements of the raster
+ iterator end()
+ {
+ return iterator(params_.ncols_,params_.nlines_-1,params_.ncols_,params_.nlines_, params_.nBands(), this);
+ }
+
+ //! Returns an iterator to the end element of the raster
+ /*!
+ \param poly polygon that delimitates the iterator traversal
+ \param st stragetegy used to decide if a pixel is in or out a polygon
+ \param band optional band restriction
+ */
+ iteratorPoly end(TePolygon& poly, TeStrategicIterator st, int band=0)
+ {
+ return iteratorPoly(params_.ncols_,params_.nlines_-1,params_.ncols_,params_.nlines_, params_.nBands(), this, poly, st, band);
+ }
+
+ //! Select all blocks of raster, in a certain resolution factor that intercepts a given bounding box
+ bool selectBlocks(TeBox& bb, int resFac, TeRasterParams& parBlock)
+ {
+ if (!decoder_)
+ return false;
+ return decoder_->selectBlocks(bb,resFac,parBlock);
+ }
+ //! Returns the number of blocks selected by the last block selection
+ int numberOfSelectedBlocks()
+ {
+ if (!decoder_)
+ return 0;
+ return decoder_->numberOfSelectedBlocks();
+ }
+
+ //! Returns the current block of a set selected by the last block selection
+ bool fetchRasterBlock(TeDecoderMemory* memDec)
+ {
+ if (!decoder_)
+ return false;
+ return decoder_->getSelectedRasterBlock(memDec);
+ }
+
+ //! Clears the current selection of a set selected by the last block selection
+ void clearBlockSelection()
+ {
+ if (!decoder_)
+ return ;
+ decoder_->clearBlockSelection();
+ }
+};
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeRasterParams.cpp b/src/terralib/kernel/TeRasterParams.cpp
new file mode 100644
index 0000000..4770127
--- /dev/null
+++ b/src/terralib/kernel/TeRasterParams.cpp
@@ -0,0 +1,509 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeRasterParams.h"
+#include "TeUtils.h"
+
+// copy constructor
+TeRasterParams::TeRasterParams(const TeRasterParams& other)
+{
+ resolution_ = other.resolution_;
+ subBand_ = other.subBand_;
+ nlines_ = other.nlines_;
+ ncols_ = other.ncols_;
+ nbands_ = other.nbands_;
+ lutName_ = other.lutName_;
+ swap_ = other.swap_;
+ useDummy_ = other.useDummy_;
+
+ nbitsperPixel_.resize(nbands_);
+ vmin_.resize(nbands_);
+ vmax_.resize(nbands_);
+ bands_.resize(nbands_);
+ photometric_.resize(nbands_);
+ dataType_.resize(nbands_);
+ dummy_.resize(nbands_);
+ compression_.resize(nbands_);
+
+ int i;
+ for (i=0; i<nbands_; i++)
+ {
+ nbitsperPixel_[i] = other.nbitsperPixel_[i];
+ vmin_[i] = other.vmin_[i];
+ vmax_[i] = other.vmax_[i];
+ bands_[i] = other.bands_[i];
+ photometric_[i] = other.photometric_[i];
+ dataType_[i] = other.dataType_[i];
+ dummy_[i] = other.dummy_[i];
+ compression_[i] = other.compression_[i];
+ }
+
+ resx_ = other.resx_;
+ resy_ = other.resy_;
+ fileName_ = other.fileName_;
+ mode_ = other.mode_;
+ status_ = other.status_;
+ offset_ = other.offset_;
+ tiling_type_ = other.tiling_type_;
+ blockHeight_ = other.blockHeight_;
+ blockWidth_ = other.blockWidth_;
+ decoderIdentifier_ = other.decoderIdentifier_;
+ nTilesInMemory_ = other.nTilesInMemory_;
+ if (other.projection_)
+ projection_ = TeProjectionFactory::make(other.projection_->params());
+ else
+ projection_=0;
+ box_ = other.box_;
+ database_ = other.database_;
+ interleaving_ = other.interleaving_;
+
+ lutr_ = other.lutr_;
+ lutg_ = other.lutg_;
+ lutb_ = other.lutb_;
+ dyJ_ = other.dyJ_;
+ dxI_ = other.dxI_;
+ dyI_ = other.dyI_;
+ dxJ_ = other.dxJ_;
+ x0_ = other.x0_;
+ y0_ = other.y0_;
+}
+
+// pperator =
+TeRasterParams&
+TeRasterParams::operator=(const TeRasterParams& rhs)
+{
+ if ( this != &rhs )
+ {
+ resolution_ = rhs.resolution_;
+ subBand_ = rhs.subBand_;
+ nlines_ = rhs.nlines_;
+ ncols_ = rhs.ncols_;
+ nbands_ = rhs.nbands_;
+ swap_ = rhs.swap_;
+ useDummy_ = rhs.useDummy_;
+ lutName_ = rhs.lutName_;
+
+ nbitsperPixel_.resize(nbands_);
+ vmin_.resize(nbands_);
+ vmax_.resize(nbands_);
+ bands_.resize(nbands_);
+ photometric_.resize(nbands_);
+ dataType_.resize(nbands_);
+ dummy_.resize(nbands_);
+ compression_.resize(nbands_);
+
+ for (int i=0; i<nbands_; i++)
+ {
+ nbitsperPixel_[i] = rhs.nbitsperPixel_[i];
+ vmin_[i] = rhs.vmin_[i];
+ vmax_[i] = rhs.vmax_[i];
+ bands_[i] = rhs.bands_[i];
+ photometric_[i] = rhs.photometric_[i];
+ dataType_[i] = rhs.dataType_[i];
+ dummy_[i] = rhs.dummy_[i];
+ compression_[i] = rhs.compression_[i];
+ }
+
+ resx_ = rhs.resx_;
+ resy_ = rhs.resy_;
+ fileName_ = rhs.fileName_;
+ mode_ = rhs.mode_;
+ status_ = rhs.status_;
+ offset_ = rhs.offset_;
+ tiling_type_ = rhs.tiling_type_;
+ blockHeight_ = rhs.blockHeight_;
+ blockWidth_ = rhs.blockWidth_;
+ decoderIdentifier_ = rhs.decoderIdentifier_;
+ nTilesInMemory_ = rhs.nTilesInMemory_;
+ if (projection_)
+ {
+ delete projection_;
+ projection_ = 0;
+ }
+ if (rhs.projection_)
+ projection_ = TeProjectionFactory::make(rhs.projection_->params());
+ box_ = rhs.box_;
+ database_ = rhs.database_;
+ interleaving_ = rhs.interleaving_;
+
+ lutr_ = rhs.lutr_;
+ lutg_ = rhs.lutg_;
+ lutb_ = rhs.lutb_;
+ dyJ_ = rhs.dyJ_;
+ dxI_ = rhs.dxI_;
+ x0_ = rhs.x0_;
+ y0_ = rhs.y0_;
+ dyI_ = rhs.dyI_;
+ dxJ_ = rhs.dxJ_;
+ }
+ return *this;
+}
+
+void
+TeRasterParams::resizeToTiling(TeBox& bb, int bWidth, int bHeight)
+{
+ blockHeight_ = bHeight;
+ blockWidth_ = bWidth;
+
+ double bXSize = bWidth*resx_;
+ double bYSize = bHeight*resy_;
+
+ TeBox baux = adjustToCut(bb, bXSize, bYSize);
+ this->boundingBoxResolution(baux.x1_,baux.y1_,baux.x2_,baux.y2_,resx_,resy_);
+}
+
+//! Calculates the *bounding box* when box coordinates are relative to the center of the pixel
+TeBox
+TeRasterParams::boundingBox ()
+{ return TeBox (box_.x1()-resx_/2.,
+ box_.y1()-resy_/2.,
+ box_.x2()+resx_/2.,
+ box_.y2()+resy_/2.);
+}
+
+void
+TeRasterParams::boundingBoxResolution (double x1, double y1, double x2, double y2,
+ double resx, double resy, TeBox::TeBoxCorner lock)
+{
+ resx_ = resx;
+ resy_ = resy;
+ ncols_ = (int)((x2-x1)/resx_+0.5);
+ nlines_ = (int)((y2-y1)/resy_+0.5);
+
+ if (lock == TeBox::TeUPPERLEFT)
+ box_ = TeBox(x1+0.5*resx_, y2-nlines_*resy_+0.5*resy_,
+ x1+ncols_*resx_-0.5*resx_, y2-0.5*resy_);
+
+ else if (lock == TeBox::TeLOWERLEFT)
+ box_ = TeBox(x1+0.5*resx_, y1+0.5*resy_,
+ x1+ncols_*resx_-0.5*resx_, y1+nlines_*resy_-0.5*resy_);
+
+ else if (lock == TeBox::TeUPPERRIGHT)
+ box_ = TeBox(x2-ncols_*resx_+0.5*resx_, y2-nlines_*resy_+0.5*resy_,
+ x2-0.5*resx_,y2-0.5*resy_);
+
+ else // TeLOWERRIGHT
+ box_ = TeBox(x2-ncols_*resx_+0.5*resx_,y1+0.5*resy_,
+ x2-0.5*resx_,y1+nlines_*resy_-0.5*resy_);
+}
+
+void
+TeRasterParams::boundingBoxLinesColumns (double x1, double y1, double x2, double y2,
+ int nlines, int ncols, TeBox::TeBoxCorner lock)
+{
+ nlines_ = nlines;
+ ncols_ = ncols;
+
+ resx_ = (x2-x1)/ncols_;
+ resy_ = (y2-y1)/nlines_;
+
+ if (lock == TeBox::TeUPPERLEFT)
+ box_ = TeBox(x1+0.5*resx_, y2-nlines_*resy_+0.5*resy_,
+ x1+ncols_*resx_-0.5*resx_, y2-0.5*resy_);
+
+ else if (lock == TeBox::TeLOWERLEFT)
+ box_ = TeBox(x1+0.5*resx_, y1+0.5*resy_,
+ x1+ncols_*resx_-0.5*resx_, y1+nlines_*resy_-0.5*resy_);
+
+ else if (lock == TeBox::TeUPPERRIGHT)
+ box_ = TeBox(x2-ncols_*resx_+0.5*resx_, y2-nlines_*resy_+0.5*resy_,
+ x2-0.5*resx_,y2-0.5*resy_);
+
+ else // TeLOWERRIGHT
+ box_ = TeBox(x2-ncols_*resx_+0.5*resx_,y1+0.5*resy_,
+ x2-0.5*resx_,y1+nlines_*resy_-0.5*resy_);
+}
+
+void
+TeRasterParams::boxResolution (double x1, double y1, double x2, double y2,
+ double resx, double resy, TeBox::TeBoxCorner lock)
+{
+ resx_ = resx;
+ resy_ = resy;
+
+ ncols_ = (int)((x2-x1)/resx_+0.45)+1;
+ nlines_ = (int)((y2-y1)/resy_+0.45)+1;
+
+ if (lock == TeBox::TeUPPERLEFT)
+ box_ = TeBox(x1, y2-(nlines_-1)*resy_,x1+(ncols_-1)*resx_,y2);
+
+ else if (lock == TeBox::TeLOWERLEFT)
+ box_ = TeBox(x1, y1,x1+(ncols_-1)*resx_,y1+(nlines_-1)*resy_);
+
+ else if (lock == TeBox::TeUPPERRIGHT)
+ box_ = TeBox(x2-(ncols_-1)*resx_, y2-(nlines_-1)*resy_,x2,y2);
+
+ else // TeLOWERRIGHT
+ box_ = TeBox(x2-(ncols_-1)*resx_,y1,x2,y1+(nlines_-1)*resy_);
+}
+
+void
+TeRasterParams::boxLinesColumns (double x1, double y1, double x2, double y2,
+ int nlines, int ncols, TeBox::TeBoxCorner lock)
+{
+ nlines_ = nlines;
+ ncols_ = ncols;
+
+ resx_ = (x2-x1)/(ncols_-1);
+ resy_ = (y2-y1)/(nlines_-1);
+
+ if (lock == TeBox::TeUPPERLEFT)
+ box_ = TeBox(x1, y2-(nlines_-1)*resy_,x1+(ncols_-1)*resx_,y2);
+
+ else if (lock == TeBox::TeLOWERLEFT)
+ box_ = TeBox(x1, y1,x1+(ncols_-1)*resx_,y1+(nlines_-1)*resy_);
+
+ else if (lock == TeBox::TeUPPERRIGHT)
+ box_ = TeBox(x2-(ncols_-1)*resx_, y2-(nlines_-1)*resy_,x2,y2);
+
+ else // TeLOWERRIGHT
+ box_ = TeBox(x2-(ncols_-1)*resx_,y1,x2,y1+(nlines_-1)*resy_);
+}
+
+void
+TeRasterParams::topLeftResolutionSize (double left, double top,
+ double resx, double resy,
+ int ncol, int nlin,
+ bool coordIsCentrePixel)
+{
+ resx_ = resx;
+ resy_ = resy;
+ ncols_ = ncol;
+ nlines_ = nlin;
+
+ if (coordIsCentrePixel)
+ box_ = TeBox(left,top-(nlin-1)*resy_,left+(ncol-1)*resx_,top);
+ else
+ {
+ TeBox bb(left,top-nlines_*resy_,left+ncols_*resx_,top);
+ box_ = TeBox(bb.x1()+resx_/2.,
+ bb.y1()+resy_/2.,
+ bb.x2()-resx_/2.,
+ bb.y2()-resy_/2.);
+ }
+}
+
+void
+TeRasterParams::lowerLeftResolutionSize (double left, double lower,
+ double resx, double resy,
+ int ncol, int nlin,
+ bool coordIsCentrePixel)
+{
+ resx_ = resx;
+ resy_ = resy;
+ ncols_ = ncol;
+ nlines_ = nlin;
+
+ if (coordIsCentrePixel)
+ box_ = TeBox(left,lower,left+(ncol-1)*resx_,lower+(nlin-1)*resy_);
+ else
+ {
+ TeBox bb(left,lower,left+ncols_*resx_,lower+nlines_*resy_);
+ box_ = TeBox(bb.x1()+resx_/2.,
+ bb.y1()+resy_/2.,
+ bb.x2()-resx_/2.,
+ bb.y2()-resy_/2.);
+ }
+}
+
+void
+TeRasterParams::nBands(int n)
+{
+ if (nbands_ != n)
+ {
+ if (n < 1)
+ n = 1;
+ nbands_ = n;
+ nbitsperPixel_.resize(nbands_);
+ vmin_.resize(nbands_);
+ vmax_.resize(nbands_);
+ bands_.resize(nbands_);
+ photometric_.resize(nbands_);
+ dataType_.resize(nbands_);
+ dummy_.resize(nbands_);
+ compression_.resize(nbands_);
+ double d = dummy_[0];
+ for (int i = 0; i<n; i++)
+ {
+ bands_[i] = i;
+ vmin_[i] = TeMAXFLOAT;
+ vmax_[i] = -TeMAXFLOAT;
+ dataType_[i] = TeUNSIGNEDCHAR;
+ photometric_[i] = TeRASTERUNKNOWN;
+ dummy_[i] = d;
+ }
+ }
+}
+
+void
+TeRasterParams::projection(TeProjection* proj)
+{
+ if (projection_)
+ {
+ delete projection_;
+ projection_ = 0;
+ }
+ if (proj)
+ projection_ = TeProjectionFactory::make(proj->params());
+}
+
+void
+TeRasterParams::setDataType(TeDataType type, int band)
+{
+ int nb = 8;
+ switch (type) {
+ case TeUNSIGNEDCHAR:
+ nb = sizeof(unsigned char)*8;
+ break;
+ case TeCHAR :
+ nb = sizeof(char)*8;
+ break;
+ case TeUNSIGNEDSHORT:
+ nb = sizeof(unsigned short)*8;
+ break;
+ case (TeSHORT):
+ nb = sizeof(short)*8;
+ break;
+ case (TeUNSIGNEDLONG):
+ nb = sizeof(unsigned long)*8;
+ break;
+ case (TeLONG):
+ nb = sizeof(long)*8;
+ break;
+ case (TeFLOAT):
+ nb = sizeof(float)*8;
+ break;
+ case (TeDOUBLE):
+ nb = sizeof(double)*8;
+ break;
+ default:
+ break;
+ }
+ if (band<0 || band>= (int)dataType_.size())
+ for (unsigned int i=0; i<dataType_.size(); dataType_[i]=type,nbitsperPixel_[i]=nb,i++);
+ else
+ {
+ dataType_[band]=type;
+ nbitsperPixel_[band]=nb;
+ }
+}
+
+int TeRasterParams::elementSize(int band)
+{
+ switch (dataType_[band]) {
+ case TeUNSIGNEDCHAR:
+ return (sizeof(unsigned char));
+ case TeCHAR :
+ return (sizeof(char));
+ case TeUNSIGNEDSHORT:
+ return (sizeof(unsigned short));
+ case (TeSHORT):
+ return (sizeof(short));
+ case (TeUNSIGNEDLONG):
+ return (sizeof(unsigned long));
+ case (TeLONG):
+ return (sizeof(long));
+ case (TeFLOAT):
+ return (sizeof(float));
+ default:
+ return (sizeof(double));
+ }
+}
+
+
+void
+TeRasterParams::setPhotometric(short photom, int band)
+{
+ if (band<0 || band>= (int)photometric_.size())
+ for (unsigned int i=0; i<photometric_.size(); photometric_[i]=photom,i++);
+ else
+ photometric_[band]=photom;
+}
+
+void
+TeRasterParams::setCompressionMode(TeCompressionMode cmode, int band)
+{
+ if (band<0 || band>= (int)compression_.size())
+ for (unsigned int i=0; i<compression_.size(); compression_[i]=cmode,i++);
+ else
+ compression_[band] = cmode;
+}
+
+void
+TeRasterParams::setDummy(double dummy, int band)
+{
+ if (band<0 || band>= (int)dummy_.size())
+ for (unsigned int i=0; i<dummy_.size(); dummy_[i]=dummy,i++);
+ else
+ dummy_[band] = dummy;
+ this->useDummy_ = true;
+}
+
+TeCoord2D
+TeRasterParams::coord2Index (TeCoord2D& pt)
+{
+ double i, j;
+ if (dxI_ != 0 || dyJ_ != 0 || dxJ_ != 0 || dyI_ != 0)
+ {
+ double x = pt.x();
+ double y = pt.y();
+
+ i = (dyJ_*(x-x0_)-dxJ_*(y-y0_))/(dxI_*dyJ_-dxJ_*dyI_);
+ j = (x-x0_-i*dxI_)/dxJ_;
+ return TeCoord2D (j,i);
+ }
+ else
+ {
+ i = (pt.x() - box_.x1()) / resx_;
+ j = (box_.y2() - pt.y()) / resy_;
+ return TeCoord2D (i,j);
+ }
+}
+
+TeCoord2D
+TeRasterParams::index2Coord (TeCoord2D& pt)
+{
+ double x,y;
+ double i = pt.y();
+ double j = pt.x();
+
+ if (dxI_ != 0 || dyJ_ != 0 || dxJ_ != 0 || dyI_ != 0)
+ {
+ // X= x0 + J*Dx_j + I*Dx_i
+ // Y= Y0 + J*Dy_j + I*Dy_i
+
+ x = x0_ + i*dxI_ + j*dxJ_;
+ y = y0_ + i*dyI_ + j*dyJ_;
+ }
+ else
+ {
+ x = box_.x1() + pt.x() * resx_;
+ y = box_.y2() - pt.y() * resy_;
+ }
+ return TeCoord2D (x,y);
+}
+
diff --git a/src/terralib/kernel/TeRasterParams.h b/src/terralib/kernel/TeRasterParams.h
new file mode 100644
index 0000000..50d6548
--- /dev/null
+++ b/src/terralib/kernel/TeRasterParams.h
@@ -0,0 +1,366 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeRasterParams.h
+ This file contains definitions about parameters of a raster structure
+*/
+#ifndef __TERRALIB_INTERNAL_RASTERPARAMS_H
+#define __TERRALIB_INTERNAL_RASTERPARAMS_H
+
+#include "TeProjection.h"
+#include "TeBox.h"
+#include "TeDataTypes.h"
+
+#include <string>
+#include <list>
+#include <vector>
+
+//! Pixels interleaving mode
+enum TeInterLeaving
+{ TePerPixel, TePerLine, TePerBand };
+
+using namespace std;
+
+#define TeRASTERUNKNOWN 0 //!< unknown type of raster (an intermediate state)
+#define TeRASTERPALETTE 1 //!< a sintetic image that has an associated LUT (pixel val -> RGB triple)
+#define TeRASTERMULTIBAND 2 //!< an image which 1 to n bands
+#define TeRASTERRGB 3 //!< a particular case of multiband, with exactly 3 bands
+#define TeRASTERTHEMATIC 4 //!< a temathic image
+#define TeRASTEROBJECTID 5 //!< each pixel has an ID of the corresponding object
+#define TeRASTERLDD 6 //!< each pixel is a local drain direction
+#define TeRASTERKERNEL 7
+
+#define TeNOTREADY 0x0000 // Decoder is not read to read or read
+#define TeREADYTOREAD 0x0001 // Decoder is read to read
+#define TeREADYTOWRITE 0x0002 // Decoder is read to write
+
+
+class TeDatabase;
+
+//! A class to handle the parameters set associated with a raster
+/*!
+ \sa
+ TeRaster
+*/
+class TeRasterParams
+{
+public:
+
+ //! Default contructor
+ TeRasterParams () :
+ nlines_(0),
+ ncols_(0),
+ resx_(1),
+ resy_(1),
+ resolution_(1),
+ subBand_(0),
+ swap_(false),
+ useDummy_(false),
+ mode_('r'),
+ status_(TeNOTREADY),
+ offset_(0),
+ tiling_type_(TeExpansible),
+ blockHeight_(0),
+ blockWidth_(0),
+ nTilesInMemory_(0),
+ database_ (0),
+ interleaving_(TePerPixel),
+ dxJ_(0.0),
+ dyJ_(0.0),
+ dxI_(0.0),
+ dyI_(0.0),
+ x0_(0.0),
+ y0_(0.0),
+ nbands_(1),
+ box_(TeBox()),
+ projection_(0)
+ {
+ nbitsperPixel_.resize(nbands_);
+ vmin_.resize(nbands_);
+ vmax_.resize(nbands_);
+ bands_.resize(nbands_);
+ photometric_.resize(nbands_);
+ dataType_.resize(nbands_);
+ dummy_.resize(nbands_);
+ compression_.resize(nbands_);
+ for (int i=0; i<nbands_; i++)
+ {
+ bands_[i] = i;
+ vmin_[i] = TeMAXFLOAT;
+ vmax_[i] = -TeMAXFLOAT;
+ dataType_[i] = TeUNSIGNEDCHAR;
+ photometric_[i] = TeRASTERUNKNOWN;
+ dummy_[i] = 0.0;
+ }
+ }
+
+ //! Copy constructor
+ TeRasterParams(const TeRasterParams& other);
+
+ //! Operator =
+ TeRasterParams& operator=(const TeRasterParams& rhs);
+
+ //! Destructor
+ virtual ~TeRasterParams()
+ {
+ bands_.clear();
+ vmin_.clear();
+ vmax_.clear();
+ lutr_.clear();
+ lutg_.clear();
+ lutb_.clear();
+ photometric_.clear();
+ dataType_.clear();
+ dummy_.clear();
+ compression_.clear();
+ if (projection_)
+ delete projection_;
+ }
+
+ //! Return the box based on the coordinates of center of pixel
+ TeBox box()
+ { return box_; }
+
+ //! Returns the outline box
+ TeBox boundingBox ();
+
+ //! Sets box parameters
+ /*
+ This methods recalculates the number of lines and columns and box accordingly to
+ a desired bounding box and resolution
+ \param x1 bounding box lower left point X coordinate
+ \param y1 bounding box lower left point Y coordinate
+ \param x2 bounding box upper right point X coordinate
+ \param y2 bounding box upper right point Y coordinate
+ \param resx X resolution
+ \param resy Y resolution
+ \param lock corner of the bounding box that should be preserved
+ */
+ void boundingBoxResolution (double x1, double y1, double x2, double y2,
+ double resx, double resy, TeBox::TeBoxCorner lock = TeBox::TeUPPERLEFT);
+
+ //! Sets box parameters
+ /*
+ This methods recalculates the resolutions and box accordingly to
+ a desired bounding box and number of lines and columns
+ \param x1 bounding box lower left point X coordinate
+ \param y1 bounding box lower left point Y coordinate
+ \param x2 bounding box upper right point X coordinate
+ \param y2 bounding box upper right point Y coordinate
+ \param nlines number of lines
+ \param ncols number of columns
+ \param lock corner of the bounding box that should be preserved
+ */
+ void boundingBoxLinesColumns (double x1, double y1, double x2, double y2,
+ int nlines, int ncols, TeBox::TeBoxCorner lock = TeBox::TeUPPERLEFT);
+
+ //! Sets box parameters
+ /*
+ This methods recalculates the number of lines and columns and box accordingly to
+ a desired box and resolution
+ \param x1 box lower left point X coordinate
+ \param y1 box lower left point Y coordinate
+ \param x2 box upper right point X coordinate
+ \param y2 box upper right point Y coordinate
+ \param resx X resolution
+ \param resy Y resolution
+ \param lock corner of the bounding box that should be preserved
+ */
+ void boxResolution (double x1, double y1, double x2, double y2,
+ double resx, double resy, TeBox::TeBoxCorner lock = TeBox::TeUPPERLEFT);
+
+ //! Sets box parameters
+ /*
+ This methods recalculates the resolutions and box accordingly to
+ a desired box and number of lines and columns
+ \param x1 box lower left point X coordinate
+ \param y1 box lower left point Y coordinate
+ \param x2 box upper right point X coordinate
+ \param y2 box upper right point Y coordinate
+ \param nlines number of lines
+ \param ncols number of columns
+ \par Calculates X resolution and Y resolution
+ \param lock corner of the bounding box that should be preserved
+ */
+ void boxLinesColumns (double x1, double y1, double x2, double y2,
+ int nlines, int ncols, TeBox::TeBoxCorner lock = TeBox::TeUPPERLEFT);
+
+ //! Sets box parameters
+ /*
+ \param left lower left point X coordinate
+ \param top upper right point Y coordinate
+ \param resx X resolution
+ \param resy Y resolution
+ \param nlines number of lines
+ \param ncols number of columns
+ \param coordIsCentrePixel flag to indicate that top left coordinate is centre of pixel
+ */
+ void topLeftResolutionSize (double left, double top, double resx, double resy, int ncol, int nlin, bool coordIsCentrePixel=true);
+
+ //! Sets box parameters
+ /*
+ \param left lower left point X coordinate
+ \param lower lower left point Y coordinate
+ \param resx X resolution
+ \param resy Y resolution
+ \param nlines number of lines
+ \param ncols number of columns
+ \param coordIsCentrePixel flag to indicate that top left coordinate is centre of pixel
+ */
+ void lowerLeftResolutionSize (double left, double lower, double resx, double resy, int ncol, int nlin, bool coordIsCentrePixel=true);
+
+ //! Resizes the raster bounding box to allow tiling operation
+ /*!
+ \param bb an initial bounding box
+ \param bWidth block width (in number of elements/pixels)
+ \param bHeight block height (in number of elements/pixels)
+ \note uses X an Y resolutions already defined
+ */
+ void resizeToTiling(TeBox& bb, int bWidth, int bHeight);
+
+ //! Sets the number of bands
+ void nBands(int n);
+
+ //! Sets the projection
+ /*
+ A new instance of projection is created according to the parameters described
+ by proj.
+ */
+ void projection(TeProjection* proj);
+
+ //! Returns the projection
+ TeProjection* projection()
+ { return projection_; }
+
+ //! Transform a point from projection domain to line/column domain
+ TeCoord2D coord2Index (TeCoord2D& pt);
+
+ //! Transform a point from line/column domain to projection domain
+ TeCoord2D index2Coord (TeCoord2D& pt);
+
+ //----------------- MEMBERS ---------------------
+
+ int nlines_; //!< number of lines
+ int ncols_; //!< number of columns
+
+ double resx_, //!< pixel horizontal resolution
+ resy_; //!< pixel vertical resolution
+
+
+ int resolution_; //! resolution level (used in storing raster as wavelets)
+ int subBand_; //! sub band identification (used in storing rasters as wavelets)
+
+ string lutName_; //!< name of a lut table associated to this raster
+ bool swap_; //!< a flag to indicate that raster has swapped values
+ bool useDummy_; //!< a flag to indicate that raster has dummy values
+
+ vector<int> nbitsperPixel_; //!< number of bits per pixel in each band
+ vector<double> vmin_; //!< minimum value per band
+ vector<double> vmax_; //!< maximum value per band
+ vector<int> bands_; //!< bands information
+ vector<double> dummy_; //!< no data value
+ vector<short> photometric_; //!< raster type (palette, multiband, rgb, ...)
+ vector<TeCompressionMode> compression_; //!< compression type of tiles as this raster is stored
+ vector<TeDataType> dataType_; //!< size of each pixel (char,int,unsigned char...), as it will be saved
+
+ string fileName_; //!< source of the raster data (table or disk file)
+ char mode_; //! Instantiating mode for the raster data 'r', 'w' or 'c'
+ int status_; //! Status for reading and writing to raster
+ int offset_; //!< offset
+
+ TeRasterTilingType tiling_type_; //!< raster tiling scheme
+ int blockHeight_; //!< block height of tiles as this raster is stored
+ int blockWidth_; //!< block width of tiles as this raster is stored
+
+ string decoderIdentifier_; //!< decoder associated to his raster
+ int nTilesInMemory_; //!< number of tiles to be kept in virtual memory decoders
+
+ TeDatabase *database_; //!< database associated to this driver
+
+ string blockId_; //!< block identification
+
+ TeInterLeaving interleaving_; //!< interleaving mode
+
+ /** @name Raster pallete
+ * Look up table associated to a raster
+ */
+ //@{
+ vector<unsigned short> lutr_; //!< Red pallete
+ vector<unsigned short> lutg_; //!< Green pallete
+ vector<unsigned short> lutb_; //!< Blue pallete
+ //@}
+
+ /** @name TFW parameters
+ * Parameters associated to TFW codification of georeferencing
+ */
+ //@{
+ double dxJ_; //!< X offset due to increase of one column position
+ double dyJ_; //!< Y offset due to increase of one column position
+ double dxI_; //!< X offset due to increase of one line position
+ double dyI_; //!< X offset due to increase of one line position
+ double x0_; //!< X coordinate of the upper left raster pixel
+ double y0_; //!< Y coordinate of the upper left raster pixel
+ //@}
+
+ //! Sets the size of raster element per in each band
+ void setDataType(TeDataType type, int band=-1);
+
+ //! Returns the size in bytes of each raster element
+ int elementSize(int band=0);
+
+ //! Sets the photometric type of each band
+ void setPhotometric(short photom, int band=-1);
+
+ //! Sets the compression mode of each band
+ void setCompressionMode(TeCompressionMode cmode, int band=-1);
+
+ //! Sets the dummy value in each band
+ void setDummy(double dummy, int band=-1);
+
+ //! Returns the number of bands of the raster
+ int nBands() const
+ { return nbands_; }
+
+ //! Sets the number of entries in the pallete table
+ void setNumberPalleteEntries(int n)
+ {
+ lutr_.resize(n+1);
+ lutg_.resize(n+1);
+ lutb_.resize(n+1);
+ }
+
+ //! Returns the identifier of the decoder associated to the raster
+ string decName()
+ { return decoderIdentifier_; }
+
+ string lutName()
+ { return lutName_; }
+
+private:
+ int nbands_; //!< number of bands
+ TeBox box_; //!< raster box in center of pixel coordinates
+ TeProjection* projection_; //!< raster projection
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeRasterRemap.cpp b/src/terralib/kernel/TeRasterRemap.cpp
new file mode 100644
index 0000000..186d967
--- /dev/null
+++ b/src/terralib/kernel/TeRasterRemap.cpp
@@ -0,0 +1,503 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeDefines.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeRasterRemap.h"
+#include "TeVectorRemap.h"
+#include "TeProgress.h"
+#include <time.h>
+
+
+#include <algorithm> // for max and min
+#include <cstdlib> // for abs
+
+
+bool TePointOnLine (TeCoord2D& p, TeCoord2D& q, TeCoord2D& t, double tol)
+{
+ int tx, ty, px, py, qx, qy, dx, dy;
+
+ px = (int)(p.x () / tol);
+ py = (int)(p.y () / tol);
+
+ qx = (int)(q.x () / tol);
+ qy = (int)(q.y () / tol);
+
+ tx = (int)(t.x () / tol);
+ ty = (int)(t.y () / tol);
+
+ dx = abs(px-qx);
+ dy = abs(py-qy);
+
+ if (dx <=2 && dy <= 2)
+ return true;
+
+ int q1 = (qy-py)*(tx-px);
+ int q2 = (ty-py)*(qx-px);
+ int q3 = qx-px;
+ int q4 = qy-py;
+
+ if (q1 == 0 && q2 == 0 && q3 == 0 && q4 == 0)
+ return true;
+ if (abs(q1 - q2) > (std::max(abs(q3), abs(q4))))
+ return false;
+ return true;
+}
+
+
+void TeRasterRemap::TeInterpolateIn ( TeBox &box )
+{
+ TeRasterParams paramIn = rasterIn_->params();
+ TeRasterParams paramOut = rasterOut_->params();
+
+ TeProjection *projIn = paramIn.projection();
+ TeProjection *projOut = paramOut.projection();
+
+ if (!projIn || !projOut)
+ return;
+
+// Take coordinates of box corners in output raster projection
+
+ TeCoord2D poll = box.lowerLeft ();
+ TeCoord2D pour = box.upperRight ();
+
+// Bring output coordinates to output line/column domain
+
+ TeCoord2D pxoll = rasterOut_->coord2Index (poll);
+ TeCoord2D pxour = rasterOut_->coord2Index (pour);
+
+// Round output coordinates to nearest exact pixel
+
+ int x1,y1;
+ x1 = (int) (pxoll.x() - 0.5);
+ y1 = (int) (pxoll.y() + 0.5);
+ pxoll = TeCoord2D (x1,y1);
+
+ int x2,y2;
+ x2 = (int)(pxour.x() + 0.5);
+ y2 = (int)(pxour.y() - 0.5);
+ pxour = TeCoord2D (x2,y2);
+// fprintf (loga,"Coordenadas de saida - x1=%d x2=%d y1=%d y2=%d\n",x1,x2,y1,y2);
+
+ poll = rasterOut_->index2Coord (pxoll);
+ pour = rasterOut_->index2Coord (pxour);
+// fprintf (loga,"Box de saida - x1=%f x2=%f y1=%f y2=%f\n\n",poll.x(),pour.x(),poll.y(),pour.y());
+
+ TeCoord2D poul = TeCoord2D(poll.x(),pour.y());
+ TeCoord2D polr = TeCoord2D(pour.x(),poll.y());
+
+// Bring coordinates of box four corners to input raster projection
+
+ TeCoord2D pill = projOut->PC2LL (poll);
+ TeCoord2D piur = projOut->PC2LL (pour);
+ TeCoord2D piul = projOut->PC2LL (poul);
+ TeCoord2D pilr = projOut->PC2LL (polr);
+
+ pill = projIn->LL2PC (pill);
+ piur = projIn->LL2PC (piur);
+ piul = projIn->LL2PC (piul);
+ pilr = projIn->LL2PC (pilr);
+
+// Check if linear interpolation may be performed on input raster
+// Evaluate point at middle of the edges in output domain and check if their
+// corresponding points belong to the edges in input domain. If they belong,
+// a linear interpolation may be performed, else divide output image
+// in four quadrants and try interpolating again
+
+
+ TeCoord2D pou((pour.x()-poul.x())/2.+poul.x(), poul.y()), // upper edge
+ pob((polr.x()-poll.x())/2.+poll.x(), poll.y()), // bottom edge
+ pol(poll.x(), (poul.y()-poll.y())/2.+poll.y()), // left edge
+ por(polr.x(), (pour.y()-polr.y())/2.+polr.y()); // right edge
+
+// Evaluate corresponding points in input raster domain
+ TeCoord2D piu, pib, pil, pir;
+
+ piu = projOut->PC2LL (pou);
+ pib = projOut->PC2LL (pob);
+ pil = projOut->PC2LL (pol);
+ pir = projOut->PC2LL (por);
+
+ piu = projIn->LL2PC (piu);
+ pib = projIn->LL2PC (pib);
+ pil = projIn->LL2PC (pil);
+ pir = projIn->LL2PC (pir);
+
+// Check if middle points belong to the edges
+
+ double tol = MAX(paramIn.resx_ ,paramIn.resy_ );
+
+// if (!TeIsOnSegment (piu,piul,piur/*,tol*/) ||
+// !TeIsOnSegment (pir,pilr,piur/*,tol*/) ||
+// !TeIsOnSegment (pib,pill,pilr/*,tol*/) ||
+// !TeIsOnSegment (pil,pill,piul/*,tol*/))
+
+ if (!TePointOnLine (piul,piur,piu,tol) ||
+ !TePointOnLine (pilr,piur,pir,tol) ||
+ !TePointOnLine (pill,pilr,pib,tol) ||
+ !TePointOnLine (pill,piul,pil,tol))
+ {
+// If one of them does not belong to correspondig edge, divide output in four quadrants
+ TeCoord2D pom ((por.x()-pol.x())/2.+pol.x(), (pou.y()-pob.y())/2.+pob.y()); // center point
+ TeBox quadrantul (pol, pou);
+ TeInterpolateIn ( quadrantul );
+ TeBox quadrantur (pom, pour);
+ TeInterpolateIn ( quadrantur );
+ TeBox quadrantll (poll, pom);
+ TeInterpolateIn ( quadrantll );
+ TeBox quadrantlr (pob, por);
+ TeInterpolateIn ( quadrantlr );
+ return;
+ }
+
+// Start linear interpolation on input image.
+
+ double xl, // x at the beginning of the line
+ yl, // y at the beginning of the line
+ xr, // x at the end of the line
+ yr, // y at the end of the line
+ dx, // inner loop x increment
+ dy, // inner loop y increment
+ dxl, // x increment at the beginning of line
+ dyl, // y increment at the beginning of line
+ dxr, // x increment at the end of line
+ dyr; // y increment at the end of line
+
+ TeCoord2D pxill = rasterIn_->coord2Index (pill);
+ TeCoord2D pxiul = rasterIn_->coord2Index (piul);
+ TeCoord2D pxilr = rasterIn_->coord2Index (pilr);
+ TeCoord2D pxiur = rasterIn_->coord2Index (piur);
+
+// Evaluate the increments in x and y on both sides of input image
+
+ int i, j;
+ double x,y;
+
+ x1 = (int)pxoll.x()-1;
+ y1 = (int)pxour.y()-1;
+
+ x2 = (int)pxour.x()+1;
+ y2 = (int)pxoll.y()+1;
+
+ dxl = ( (pxill.x()-pxiul.x())/(y2-y1) );
+ dyl = ( (pxill.y()-pxiul.y())/(y2-y1) );
+
+ dxr = ( (pxilr.x()-pxiur.x())/(y2-y1) );
+ dyr = ( (pxilr.y()-pxiur.y())/(y2-y1) );
+
+// Set initial values for x and y at beginning point on input image
+
+ xl = pxiul.x() - 1;
+ yl = pxiul.y() - 1;
+
+// Set initial values for x and y at end point on input image
+
+ xr = pxiur.x() + 1;
+ yr = pxiur.y() + 1;
+
+// Evaluate increments for the first line
+
+ dx = (xr-xl)/(x2-x1);
+ dy = (yr-yl)/(x2-x1);
+
+ x = xl; // round to left pixel
+ y = yl; // round to left pixel
+
+ for (j=y1;j<=y2;j++)
+ {
+ for (i=x1;i<=x2;i++)
+ {
+ if (interpolation_ == 0)
+ transformer_->apply((int)(x+0.5),(int)(y+0.5),i,j);
+ x += dx;
+ y += dy;
+ }
+
+ xl += dxl;
+ x = xl;
+ xr += dxr;
+ yl += dyl;
+ y = yl;
+ yr += dyr;
+ dx = (xr-xl)/(x2-x1);
+ dy = (yr-yl)/(x2-x1);
+ }
+}
+
+bool TeRasterRemap::apply( bool showProgress )
+{
+ // check if input and output raster are set
+ if (!rasterIn_ || !rasterOut_)
+ return false;
+
+ TeRasterParams paramIn = rasterIn_->params();
+ TeRasterParams paramOut = rasterOut_->params();
+
+ TeProjection* projIn = paramIn.projection();
+ TeProjection* projOut = paramOut.projection();
+
+ // if only one of the rasters don�t have projection can�t do remapping
+ if ((projIn && !projOut) || (projOut && !projIn))
+ return false;
+
+ showProgress_ = showProgress;
+
+ // if no transformer defined create a new on based on typical cases of
+ // visualization and import operations
+ bool delTransf = false;
+ if (!transformer_)
+ {
+ delTransf = true; // remember to delete it
+ transformer_ = new TeRasterTransform();
+ transformer_->setRasterIn(rasterIn_);
+ transformer_->setRasterOut(rasterOut_);
+
+ // pallete raster to a RGB device -> apply input raster pallete
+ if ((paramIn.photometric_[0] == TeRASTERPALETTE ||
+ paramIn.photometric_[0] == TeRASTERTHEMATIC) &&
+ paramOut.nBands() == 3)
+ transformer_->setTransfFunction(&TeRasterTransform::Pallete2ThreeBand);
+ // mono band raster to a RGB device -> repeat band to 3 channels
+ else if (paramIn.nBands() == 1 && paramOut.nBands() == 3)
+ transformer_->setTransfFunction(&TeRasterTransform::Mono2ThreeBand);
+ // copy first n input bands to first n output bands
+ else
+ transformer_->setTransfFunction(&TeRasterTransform::Band2Band);
+ }
+
+ bool result;
+ // check if datum's are different
+ if (projIn->datum().name() != projOut->datum().name())
+ {
+ projIn->setDestinationProjection(projOut);
+ projOut->setDestinationProjection(projIn);
+ }
+
+ if (projIn && projOut && (*projIn == *projOut)) // same projection
+ {
+ TeBox boxIn = paramIn.box();
+ TeBox boxOut = paramOut.box();
+
+
+ if (!(boxIn == boxOut) || // different resolutions or boxes
+ paramIn.resx_ != paramOut.resx_ ||
+ paramIn.resy_ != paramOut.resy_ ||
+ paramIn.ncols_ != paramOut.ncols_ ||
+ paramIn.nlines_ != paramOut.nlines_ )
+ result = resample();
+ else // same dimensions
+ result = copy();
+ }
+ else // different projection
+ result = remap();
+
+ if (delTransf)
+ {
+ delete transformer_;
+ transformer_ = 0;
+ }
+ return result;
+}
+
+bool TeRasterRemap::copy ()
+{
+ TeRasterParams paramOut = rasterOut_->params();
+ if(showProgress_ && TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(paramOut.nlines_);
+ int c, l;
+ clock_t ti, tf;
+ ti = clock();
+ for (l=0; l<paramOut.nlines_; l++)
+ {
+ for (c=0; c<paramOut.ncols_; c++)
+ transformer_->apply(c,l,c,l);
+
+ if (showProgress_ && TeProgress::instance())
+ {
+ tf = clock();
+ if (int((tf-ti)/CLOCKS_PER_SEC) > 3)
+ {
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ TeProgress::instance()->setProgress(l);
+ ti = tf;
+ }
+ }
+ }
+ if(showProgress_ && TeProgress::instance())
+ TeProgress::instance()->reset();
+ return true;
+}
+
+bool TeRasterRemap::resample ()
+{
+ TeRasterParams paramIn = rasterIn_->params();
+ TeRasterParams paramOut = rasterOut_->params();
+
+ TeBox boxIn = paramIn.boundingBox();
+ TeBox boxOut = paramOut.boundingBox();
+
+// Evaluate intersection of input and output rasters in output raster projection domain
+
+ TeBox boxInter;
+
+ if (!TeIntersection (boxIn,boxOut,boxInter))
+ return false;
+
+// Take coordinates of intersection box
+
+ TeCoord2D poll = boxInter.lowerLeft ();
+ TeCoord2D pour = boxInter.upperRight ();
+
+// Bring it to output line/column domain
+
+ TeCoord2D pxoll = rasterOut_->coord2Index (poll);
+ TeCoord2D pxour = rasterOut_->coord2Index (pour);
+
+// Round it to nearest pixel
+ int x1,y1,x2,y2;
+ x1 = TeRoundRasterIndex(pxoll.x_) - 1;
+ y2 = TeRoundRasterIndex(pxoll.y_) + 1;
+ pxoll = TeCoord2D (x1,y2);
+
+ x2 = TeRoundRasterIndex(pxour.x_) + 1;
+ y1 = TeRoundRasterIndex(pxour.y_) - 1;
+ pxour = TeCoord2D (x2,y1);
+
+// Bring it to output projection domain
+ poll = rasterOut_->index2Coord (pxoll);
+ pour = rasterOut_->index2Coord (pxour);
+
+// Bring upper left point to input line/column domain
+ TeCoord2D ulPoint = rasterIn_->coord2Index(TeCoord2D(poll.x(),pour.y()));
+
+// - -
+// |A|B|
+// - -
+// |C| |
+// - -
+// Get output projection domain of corner ABC
+ TeCoord2D A = rasterOut_->index2Coord(TeCoord2D(0,0));
+ TeCoord2D B = rasterOut_->index2Coord(TeCoord2D(1,0));
+ TeCoord2D C = rasterOut_->index2Coord(TeCoord2D(0,1));
+
+// Calculate equivalent input line/column coordinates
+ TeCoord2D Ae = rasterIn_->coord2Index(A);
+ TeCoord2D Be = rasterIn_->coord2Index(B);
+ TeCoord2D Ce = rasterIn_->coord2Index(C);
+
+// Calculate input increments in both directions, in number of pixels
+// for each output 1 pixel increment in
+ double eDxJ = Be.x()-Ae.x(); // increment in X direction when moving from A->B
+ double eDyJ = Be.y()-Ae.y(); // increment in Y direction when moving from A->B
+ double eDyI = Ce.y()-Ae.y(); // increment in Y direction when moving from C->A
+ double eDxI = Ce.x()-Ae.x(); // increment in X direction when moving from C->A
+
+ int lin_sai,col_sai;
+ double lin_entra,col_entra;
+
+ double lin_entra_i = ulPoint.y(); // starting at the upper-left corner
+ double col_entra_i = ulPoint.x();
+
+ // redefine processing area, so there is no unecessary processing
+ while (TeRoundRasterIndex(lin_entra_i)<0)
+ {
+ lin_entra_i += eDyI;
+ col_entra_i += eDxI;
+ y1 += 1;
+ }
+ while (TeRoundRasterIndex(lin_entra_i+(y2-y1)*eDyI) >= paramIn.nlines_)
+ y2 -= 1;
+
+ while (TeRoundRasterIndex(col_entra_i)<0)
+ {
+ lin_entra_i += eDyJ;
+ col_entra_i += eDxJ;
+ x1 += 1;
+ }
+ while (TeRoundRasterIndex(col_entra_i+(x2-x1)*eDxJ) >= paramIn.ncols_)
+ x2 -= 1;
+
+ if( showProgress_ && TeProgress::instance())
+ {
+ TeProgress::instance()->setTotalSteps((int)(y2-y1));
+ }
+ int count = 1;
+ clock_t ti, tf;
+ ti = clock();
+ for (lin_sai=y1;lin_sai<=y2;lin_sai++)
+ {
+ lin_entra = lin_entra_i;
+ col_entra = col_entra_i;
+ for (col_sai=x1;col_sai<=x2;col_sai++)
+ {
+ transformer_->apply(TeRoundRasterIndex(col_entra),TeRoundRasterIndex(lin_entra),col_sai,lin_sai);
+ col_entra += eDxJ;
+ lin_entra += eDyJ;
+ }
+ count++;
+ lin_entra_i += eDyI;
+ col_entra_i += eDxI;
+ if(showProgress_ && TeProgress::instance())
+ {
+ tf = clock();
+ if (int((tf-ti)/CLOCKS_PER_SEC) > 3)
+ {
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ TeProgress::instance()->setProgress(count);
+ ti = tf;
+ }
+ }
+ }
+ if (showProgress_ && TeProgress::instance())
+ TeProgress::instance()->reset();
+ return true;
+}
+
+bool TeRasterRemap::remap()
+{
+
+ TeRasterParams paramIn = rasterIn_->params();
+ TeRasterParams paramOut = rasterOut_->params();
+
+ TeProjection *projIn = paramIn.projection();
+ TeProjection *projOut = paramOut.projection();
+
+
+ if ( projIn == 0 || projOut == 0)
+ return false;
+
+ TeBox boxIn = paramIn.box();
+ TeBox boxOut = paramOut.box();
+
+// Evaluate intersection of input and output rasters in output raster projection domain
+ TeBox boxInter;
+ boxIn = TeRemapBox (boxIn, projIn, projOut);
+ if (!TeIntersection (boxIn,boxOut,boxInter))
+ return false;
+
+// Start trying to remap the input quadrilateral
+ TeInterpolateIn ( boxInter );
+ return true;
+}
diff --git a/src/terralib/kernel/TeRasterRemap.h b/src/terralib/kernel/TeRasterRemap.h
new file mode 100644
index 0000000..2de8d88
--- /dev/null
+++ b/src/terralib/kernel/TeRasterRemap.h
@@ -0,0 +1,116 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeRasterRemap.h
+ This file contains definitions the class and functions need to transform a raster geometry into another geometry
+*/
+#ifndef __TERRALIB_INTERNAL_RASTERREMAP_H
+#define __TERRALIB_INTERNAL_RASTERREMAP_H
+
+#include "TeRaster.h"
+#include "TeGeometry.h"
+#include "TeRasterTransform.h"
+
+//! A functional class to transform a raster geometry into another geometry
+/*!
+ RasterRemap class provides functions to remap a raster strtucture into another.
+ The two raster can have a different projections, different bounding boxes and/or
+ different resolutions.
+
+ \sa
+ TeRaster, TeRasterParams, TeRasterTransform, TeProjection, TeBox
+
+ \note Raster representation in TerraLib is under development, all files that deal
+ with raster representation should be considered as a beta version.
+*/
+class TeRasterRemap
+{
+protected:
+ TeRaster* rasterIn_; //!< input raster
+ TeRaster* rasterOut_; //!< output raster
+
+ TeRasterTransform* transformer_;
+
+ int interpolation_;
+ bool showProgress_;
+
+ void TeInterpolateIn (TeBox &box);
+
+ bool remap ();
+ bool copy ();
+ bool resample ();
+
+public:
+
+ //! Constructor
+ /*
+ \param rasterIn pointer to the input raster
+ \param rasterOut pointer to the output raster
+ \para showProgress flag to indicate that a progress status hould be reported
+ */
+ TeRasterRemap (TeRaster* rasterIn=0, TeRaster* rasterOut=0, bool showProgress = false):
+ rasterIn_(rasterIn),
+ rasterOut_(rasterOut),
+ transformer_(0),
+ interpolation_(0),
+ showProgress_(showProgress)
+ {}
+
+ //! Sets the input raster
+ void setInput( TeRaster* rasterIn)
+ {
+ rasterIn_ = rasterIn;
+ if (transformer_)
+ transformer_->setRasterIn(rasterIn_);
+ }
+
+ //! Sets the output raster
+ void setOutput( TeRaster* rasterOut)
+ {
+ rasterOut_ = rasterOut;
+ if (transformer_)
+ transformer_->setRasterOut(rasterOut_);
+ }
+
+ //! Sets the interpolation flag
+ void setInterpolation( int interpolation )
+ { interpolation_ = interpolation; }
+
+ //! Sets the transformation to be used when doing remap
+ void setTransformer(TeRasterTransform* transf)
+ {
+ transformer_ = transf;
+ transformer_->setRasterOut(rasterOut_);
+ transformer_->setRasterIn(rasterIn_);
+ }
+
+ //! Returns the transformation to be used when doing remap
+ TeRasterTransform* transformer()
+ { return transformer_; }
+
+ //! Applies the remaping
+ bool apply(bool showProgress = false );
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeRasterTransform.cpp b/src/terralib/kernel/TeRasterTransform.cpp
new file mode 100644
index 0000000..d16b4d4
--- /dev/null
+++ b/src/terralib/kernel/TeRasterTransform.cpp
@@ -0,0 +1,128 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeRasterTransform.h"
+
+void
+TeRasterTransform::generateLUT(TeLegendEntryVector& legs, unsigned int nentries, TeColor& backColor)
+{
+ // find the range covered by the legends
+ unsigned int n;
+ double vmin = TeMAXFLOAT;
+ double vmax = TeMINFLOAT;
+ for (n=0; n <legs.size(); n++)
+ {
+ if (atof(legs[n].slice().from_.c_str()) < vmin)
+ vmin = atof(legs[n].slice().from_.c_str());
+ if (atof(legs[n].slice().to_.c_str()) > vmax)
+ vmax = atof(legs[n].slice().to_.c_str());
+ }
+ // do a linear transformation from the range defined by the legend to the number of entries
+ this->setLinearTransfParameters(vmin,vmax, 0, nentries-1);
+
+ // initialize lut with the background color
+ lutr_.clear();
+ lutg_.clear();
+ lutb_.clear();
+
+ lutr_.insert(lutr_.begin(),nentries,backColor.red_);
+ lutg_.insert(lutg_.begin(),nentries,backColor.green_);
+ lutb_.insert(lutb_.begin(),nentries,backColor.blue_);
+
+ // to each entry define its equivalent range of indexes on the LUT
+ int nunIndx = 0;
+ int indexFrom, indexTo;
+ for (n=0; n <legs.size(); n++)
+ {
+ // find the range of entries that
+ indexFrom = (int)(atof(legs[n].slice().from_.c_str()) * gain_ + offset_);
+ if (indexFrom < 0)
+ indexFrom = 0;
+ indexTo = (int)(atof(legs[n].slice().to_.c_str()) * gain_ + offset_);
+ if (indexTo > (int)nentries)
+ indexTo = nentries;
+ nunIndx = indexTo - indexFrom + 1;
+ if (nunIndx >= 1)
+ {
+ fill_n(&lutr_[indexFrom],nunIndx,legs[n].getVisualMap()[TePOLYGONS].color().red_);
+ fill_n(&lutg_[indexFrom],nunIndx,legs[n].getVisualMap()[TePOLYGONS].color().green_);
+ fill_n(&lutb_[indexFrom],nunIndx,legs[n].getVisualMap()[TePOLYGONS].color().blue_);
+ }
+ }
+ lutSize_ = lutr_.size();
+}
+
+TeRasterTransform::TeRasterTransfFunctions TeRasterTransform::getTransfFunction()
+{
+ if (transfFuncPtr_ == 0)
+ return TeNoTransf;
+
+ if (transfFuncPtr_ == &TeRasterTransform::Mono2ThreeBand)
+ return TeMono2Three;
+
+ if (transfFuncPtr_ == &TeRasterTransform::Band2Band)
+ return TeBand2Band;
+
+ if (transfFuncPtr_ == &TeRasterTransform::Pallete2ThreeBand)
+ return TePall2Three;
+
+ if (transfFuncPtr_ == &TeRasterTransform::LUT2ThreeBand)
+ return TeLUT2Three;
+
+ if (transfFuncPtr_ == &TeRasterTransform::ExtractRGB)
+ return TeExtractRGB;
+
+ if (transfFuncPtr_ == &TeRasterTransform::ExtractBand)
+ return TeExtractBand;
+
+ if (transfFuncPtr_ == &TeRasterTransform::ExtractBands)
+ return TeExtractBands;
+ else
+ return TeNoTransf;
+}
+
+void TeRasterTransform::setTransfFunction(TeRasterTransfFunctions func)
+{
+ if (func == TeMono2Three)
+ transfFuncPtr_ = &TeRasterTransform::Mono2ThreeBand;
+
+ else if (func == TeBand2Band)
+ transfFuncPtr_ = &TeRasterTransform::Band2Band;
+
+ else if (func == TePall2Three)
+ transfFuncPtr_ = &TeRasterTransform::Pallete2ThreeBand;
+
+ else if (func == TeLUT2Three)
+ transfFuncPtr_ = &TeRasterTransform::LUT2ThreeBand;
+
+ else if (func == TeExtractRGB)
+ transfFuncPtr_ = &TeRasterTransform::ExtractRGB;
+
+ else if (func == TeExtractBand)
+ transfFuncPtr_ = &TeRasterTransform::ExtractBand;
+
+ else if (func == TeExtractBands)
+ transfFuncPtr_ = &TeRasterTransform::ExtractBands;
+ else
+ transfFuncPtr_ = 0;
+}
diff --git a/src/terralib/kernel/TeRasterTransform.h b/src/terralib/kernel/TeRasterTransform.h
new file mode 100644
index 0000000..08f89d6
--- /dev/null
+++ b/src/terralib/kernel/TeRasterTransform.h
@@ -0,0 +1,307 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeRasterTransform.h
+ This file deals with the transformation functions over raster pixels
+*/
+#ifndef __TERRALIB_INTERNAL_RASTERTRANSFORM_H
+#define __TERRALIB_INTERNAL_RASTERTRANSFORM_H
+
+#include "TeRaster.h"
+#include "TeLegendEntry.h"
+
+#include <map>
+#include <vector>
+using namespace std;
+
+//! This class defines a way of evaluating the final value of a raster element
+class TeRasterTransform
+{
+public:
+
+ //! The three channels of a display
+ enum TeRGBChannels { TeREDCHANNEL=0, TeGREENCHANNEL=1, TeBLUECHANNEL=2 };
+
+ enum TeRasterTransfFunctions
+ { TeNoTransf=0, TeMono2Three=1, TeBand2Band=2, TePall2Three=3, TeLUT2Three=4,
+ TeExtractRGB=5, TeExtractBand=6, TeExtractBands=7 };
+
+ //! One of the available transformation methods
+ typedef void (TeRasterTransform::*TransformFunction)(double, double, double, double);
+
+private:
+
+ TeRaster* rasterIn_;
+ TeRaster* rasterOut_;
+
+ double gain_, offset_;
+
+ map<TeRGBChannels,short> rgbmap_;
+
+ short mband_, mbout_;
+
+ TransformFunction transfFuncPtr_;
+
+ double rmin_, rmax_;
+
+ int lutSize_;
+
+public:
+
+ vector<unsigned char> lutr_;
+ vector<unsigned char> lutg_;
+ vector<unsigned char> lutb_;
+
+ //! Constructor
+ TeRasterTransform(TeRaster* rIn=0, TeRaster* rOut=0):
+ rasterIn_(rIn),
+ rasterOut_(rOut),
+ gain_(1),
+ offset_(0),
+ mband_(0),
+ mbout_(0),
+ transfFuncPtr_(&TeRasterTransform::Band2Band),
+ rmin_(TeMINFLOAT),
+ rmax_(TeMAXFLOAT),
+ lutSize_(0)
+ {}
+
+ //! Destructor
+ ~TeRasterTransform()
+ {
+ lutr_.clear();
+ lutb_.clear();
+ lutg_.clear();
+ rgbmap_.clear();
+ transfFuncPtr_ = 0;
+ }
+
+ //! Sets the size of the LUT being used
+ void setLutSize(int n)
+ { lutSize_ = n; }
+
+ //! Gets the size of the LUT being used
+ int getLutSize()
+ { return lutSize_; }
+
+ //! Sets the input raster
+ void setRasterIn(TeRaster* rIn)
+ { rasterIn_ = rIn; }
+
+ //! Sets the input raster
+ void setRasterOut(TeRaster* rOut)
+ { rasterOut_ = rOut; }
+
+ //! Sets the gain
+ void setGain(double g)
+ { gain_= g; }
+
+ //! Sets the offset
+ void setOffset(double o)
+ { offset_= o; }
+
+ //! Sets the transformation method to be used
+ void setTransfFunction(TeRasterTransform::TransformFunction transfFuncPtr)
+ { transfFuncPtr_ = transfFuncPtr; }
+
+ //! Sets the mapping from bands to R,G and B channels
+ void setRGBmap (map<TeRGBChannels,short>& rgbmap)
+ {
+ if (rgbmap.size() < 3)
+ return;
+ rgbmap_.clear();
+ rgbmap_ = rgbmap;
+ }
+
+ //! Sets the mapping from a particular input band to a particular output channel
+ void setBChannelMapping(short bIn, TeRGBChannels bOut)
+ {
+ rgbmap_[bOut] = bIn;
+ }
+
+ //! Clears current mapping from bands to channel
+ void clearRGBMap()
+ {
+ rgbmap_.clear();
+ }
+
+ //! Returns the mapping from a particular input band to a particular output channel
+ map<TeRGBChannels,short>& getRGBMap()
+ {
+ return rgbmap_;
+ }
+
+ //! Sets the mono band to be transformed
+ void setSrcBand(short n)
+ { mband_ = n; }
+
+ //! Gets the mono band to be transformed
+ short getSrcBand()
+ { return mband_; }
+
+ //! Sets the destination of the mono band
+ void setDestBand(short n)
+ { mbout_ = n; }
+
+ //! Gets the destination of the mono band
+ short getDestBand()
+ { return mbout_; }
+
+ //! Generates a LUT with nentries to display the vector of legends
+ void generateLUT(TeLegendEntryVector& legs, unsigned int nentries, TeColor& backColor);
+
+ //! Set parameters of linear transformation
+ /*!
+ \param vmin smallest input value
+ \param vmax largest input value
+ \param rmin smallest value of the output range
+ \param rmax largest value of the output range
+ */
+ void setLinearTransfParameters(double vmin, double vmax, double rmin, double rmax)
+ {
+ rmin_ = rmin;
+ rmax_ = rmax;
+ gain_ = (double)(rmax-rmin)/(vmax-vmin);
+ offset_ = -1*gain_*vmin+rmin;
+ }
+
+ //! Applies the selected transformation method
+ void apply(double icol, double ilin, double ocol, double olin)
+ { (this->*transfFuncPtr_)(icol,ilin,ocol,olin); }
+
+
+ //! Returns the identifier of the transformation function currently set
+ TeRasterTransfFunctions getTransfFunction();
+
+ //! Sets the associated transformation function from an identifier
+ void setTransfFunction(TeRasterTransfFunctions func);
+
+// --- The transformation functions available ----
+ //! This transformation repeats the value of the first band in input three bands of the output
+ void Mono2ThreeBand(double icol, double ilin, double ocol, double olin)
+ {
+ double val;
+ if (rasterIn_->getElement((int)icol,(int)ilin,val,mband_))
+ {
+ val = val*gain_ + offset_;
+ if (val < rmin_)
+ val = rmin_;
+ else if (val > rmax_)
+ val = rmax_;
+ rasterOut_->setElement((int)ocol,(int)olin,val,0);
+ rasterOut_->setElement((int)ocol,(int)olin,val,1);
+ rasterOut_->setElement((int)ocol,(int)olin,val,2);
+ }
+ }
+
+ //! This transformation repeats the value of each band in input to the same band in output
+ void Band2Band(double icol, double ilin, double ocol, double olin)
+ {
+ double val;
+ int n = rasterOut_->params().nBands();
+ for (int i=0; i<n; i++)
+ if (rasterIn_->getElement((int)icol,(int)ilin,val,i))
+ {
+ val = val*gain_ + offset_;
+ if (val < rmin_)
+ val = rmin_;
+ else if (val > rmax_)
+ val = rmax_;
+ rasterOut_->setElement((int)ocol,(int)olin,val,i);
+ }
+ }
+
+ //! This transformation repeats the value of the raster LUT in input to the first 3 bands of output
+ void Pallete2ThreeBand(double icol, double ilin, double ocol, double olin)
+ {
+ double val;
+ if (rasterIn_->getElement((int)icol,(int)ilin,val))
+ {
+ if (val> 0 && (int)val < lutSize_)
+ {
+ rasterOut_->setElement((int)ocol,(int)olin,rasterIn_->params().lutr_[(int)val],0);
+ rasterOut_->setElement((int)ocol,(int)olin,rasterIn_->params().lutg_[(int)val],1);
+ rasterOut_->setElement((int)ocol,(int)olin,rasterIn_->params().lutb_[(int)val],2);
+ }
+ }
+ }
+
+ //! This transformation repeats the value of an external LUT to the first 3 bands of output
+ void LUT2ThreeBand(double icol, double ilin, double ocol, double olin)
+ {
+ double idx, val;
+ if (rasterIn_->getElement((int)icol,(int)ilin,val,mband_))
+ {
+ idx = (val*gain_) + offset_;
+ if (idx >= 0 && idx < lutSize_)
+ {
+ rasterOut_->setElement((int)ocol,(int)olin,lutr_[(int)idx],0);
+ rasterOut_->setElement((int)ocol,(int)olin,lutg_[(int)idx],1);
+ rasterOut_->setElement((int)ocol,(int)olin,lutb_[(int)idx],2);
+ }
+ }
+ }
+
+ // This transformation is used to define a particular mapping from input bands to RGB channels
+ void ExtractRGB(double icol, double ilin, double ocol, double olin)
+ {
+ double val;
+ if (rasterIn_->getElement((int)icol,(int)ilin,val,rgbmap_[TeREDCHANNEL]))
+ rasterOut_->setElement((int)ocol,(int)olin,val,0);
+ if (rasterIn_->getElement((int)icol,(int)ilin,val,rgbmap_[TeGREENCHANNEL]))
+ rasterOut_->setElement((int)ocol,(int)olin,val,1);
+ if (rasterIn_->getElement((int)icol,(int)ilin,val,rgbmap_[TeBLUECHANNEL]))
+ rasterOut_->setElement((int)ocol,(int)olin,val,2);
+ }
+
+ //! This transformation repeats the value of a particular band in input to a particular band of the output
+ void ExtractBand(double icol, double ilin, double ocol, double olin)
+ {
+ double val;
+ if (rasterIn_->getElement((int)icol,(int)ilin,val,mband_))
+ {
+ val = val*gain_ + offset_;
+ if (val < rmin_)
+ val = rmin_;
+ else if (val > rmax_)
+ val = rmax_;
+ rasterOut_->setElement((int)ocol,(int)olin,val,mbout_);
+ }
+ }
+
+ // This transformation extracts selected bands of the input raster and writes each to a particular band of the output
+ void ExtractBands(double icol, double ilin, double ocol, double olin)
+ {
+ double val;
+ map<TeRGBChannels,short>::iterator it = rgbmap_.begin();
+ while (it != rgbmap_.end())
+ {
+ if (rasterIn_->getElement((int)icol,(int)ilin,val,it->second))
+ rasterOut_->setElement((int)ocol,(int)olin,val,it->first);
+ }
+ }
+
+};
+#endif
+
+
diff --git a/src/terralib/kernel/TeRedBlackTree.h b/src/terralib/kernel/TeRedBlackTree.h
new file mode 100644
index 0000000..3b6ddb4
--- /dev/null
+++ b/src/terralib/kernel/TeRedBlackTree.h
@@ -0,0 +1,765 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeRedBlackTree.h
+ This file contains structures and definitions for a balanced binary search tree.
+ */
+
+/**
+ *@author Gilberto Ribeiro de Queiroz
+ */
+
+#ifndef __TERRALIB_INTERNAL_RED_BLACK_TREE_H
+#define __TERRALIB_INTERNAL_RED_BLACK_TREE_H
+
+//STL's include
+#include <string>
+
+//TerraLib's include
+#include "TeUtils.h"
+
+using namespace std;
+
+#define PRINT
+
+namespace TeREDBLACK
+{
+
+ /*! \enum TeRBNodeColor
+ Possible values for a node color in a red-black tree.
+ */
+ enum TeRBNodeColor { TeREDNODE, TeBLACKNODE };
+
+ //! Template class for nodes in a Red-Black tree.
+ /*!
+ This class contains the common attributes to a node
+ used by a binary tree. Only used for commom binary trees,
+ if you want a more sophisticated tree, you can continue
+ using the Red-Black Tree framework defined below, it is possible
+ taking care of some default attributes that a node must
+ have to implement (left_, right_, parent_, data_).
+ */
+ template<class T> class TeRedBlackNode
+ {
+ public:
+
+ //! Export node's data type.
+ typedef T TeRedBlackNodeData;
+
+ //! Node's data.
+ T data_;
+
+ //! Pointer to the left sub-tree.
+ TeRedBlackNode* left_;
+
+ //! Pointer to the right sub-tree.
+ TeRedBlackNode* right_;
+
+ //! Pointeir to the father's node.
+ TeRedBlackNode* parent_;
+
+ //! Node's color (RED or BLACK).
+ TeRBNodeColor color_;
+
+ //! Constructor.
+ TeRedBlackNode(const TeRBNodeColor& color = TeREDNODE)
+ : left_(0), right_(0), parent_(0), color_(color)
+ {
+ }
+
+ //! Constructor.
+ TeRedBlackNode(T& d, const TeRBNodeColor& color = TeREDNODE)
+ : data_(d), left_(0), right_(0), parent_(0), color_(color)
+ {
+ }
+
+
+ private:
+
+ //! No copy allowed
+ TeRedBlackNode(const TeRedBlackNode& other);
+
+ // No copy allowed
+ TeRedBlackNode& operator=(const TeRedBlackNode& other);
+ };
+
+ //! Template class for Red-Black trees.
+ /*!
+ This class contains the common operations in a Red-Black Tree.
+ It can be used like a framework. Extend the methods like
+ "Insert" and "Search" to walk and to do some usefull things.
+ You will use the methods for Rotation, Insert Propagation,
+ Delete Propagation, Sucessor, Predecessor, IsEmpty, Clear.
+ This tree is based on the algorithm of Cormen's book. The only difference is
+ when a node being deleted has two children its successor node is relinked into its place,
+ rather than copied, so that the only iterators invalidated are those referring to the deleted node.
+ Every data used in nodes must implements a ToString() method.
+ */
+ template<class NODE> class TeRBTree
+ {
+ private:
+
+ //! No copy allowed.
+ TeRBTree(const TeRBTree& other);
+
+ //! No copy allowed.
+ TeRBTree& operator=(const TeRBTree& other);
+
+ protected:
+
+ //! Reference node.
+ NODE* nil_;
+
+ //! Tree's root.
+ NODE* root_;
+
+ //! Count the number of nodes in the tree (excluding nil_ node).
+ unsigned int nodeCount_;
+
+ public:
+
+ typedef NODE* REDBLACKNODEPOINTER;
+ typedef typename NODE::TeRedBlackNodeData TeRedBlackNodeData;
+
+ //! Constructor.
+ TeRBTree()
+ : nodeCount_(0)
+ {
+ nil_ = new NODE();
+ nil_->color_ = TeBLACKNODE;
+
+ root_ = nil_;
+
+ }
+
+ //! Destructor.
+ virtual ~TeRBTree()
+ {
+ Clear();
+
+ if(nil_)
+ delete nil_;
+ }
+
+ //! Returns true if the tree is empty otherwise returns false.
+ bool IsEmpty(void) const
+ {
+ return root_ == nil_;
+ }
+
+ //! Returns the number of nodes in the tree, excluding the nil_ one.
+ unsigned int Size(void) const
+ {
+ return nodeCount_;
+ }
+
+ //! Removes the node from the tree and do rebalancing.
+ virtual void Delete(NODE* z)
+ {
+ if(z)
+ {
+ // z has at most one non-null child. y == z.
+ // x might be null.
+ // z has exactly one non-null child. y == z.
+ // x is not null.
+ // z has two non-null children. Set y to
+ // z's successor. x might be null.
+ NODE* y = ((z->left_ == nil_) || (z->right_ == nil_)) ? z : Successor(z);
+ NODE* x = (y->left_ != nil_) ? y->left_ : y->right_;
+ NODE* x_parent = 0;
+
+ if(y != z) // relink y in place of z. y is z's successor
+ {
+ z->left_->parent_ = y;
+ y->left_ = z->left_;
+ if(y != z->right_)
+ {
+ x_parent = y->parent_;
+
+ if(x != nil_)
+ x->parent_ = y->parent_;
+
+ y->parent_->left_ = x; // y must be a left child
+ y->right_ = z->right_;
+ z->right_->parent_ = y;
+ }
+ else
+ x_parent = y;
+
+ if(root_ == z)
+ root_ = y;
+ else
+ if(z->parent_->left_ == z)
+ z->parent_->left_ = y;
+ else
+ z->parent_->right_ = y;
+
+ y->parent_ = z->parent_;
+
+ TeRBNodeColor aux_color = y->color_;
+ y->color_ = z->color_;
+ z->color_ = aux_color;
+
+ y = z;
+
+ // y now points to node to be actually deleted
+ }
+ else
+ { // y == z
+ x_parent = y->parent_;
+ if(x != nil_)
+ x->parent_ = y->parent_;
+
+ if(root_ == z)
+ root_ = x;
+ else
+ if(z->parent_->left_ == z)
+ z->parent_->left_ = x;
+ else
+ z->parent_->right_ = x;
+ }
+
+ if(y->color_ == TeBLACKNODE)
+ DeleteFixUp(x, x_parent, root_);
+
+ delete y;
+
+ nodeCount_--;
+ }
+
+ return;
+ }
+
+ //! Returns the sucessor of a given node or zero if not.
+ virtual NODE* Successor(NODE* x) const
+ {
+ if(x)
+ {
+ if(x->right_ != nil_)
+ {
+ x = x->right_;
+
+ while(x->left_ != nil_)
+ x = x->left_;
+
+ return x;
+ }
+
+ NODE* y = x->parent_;
+
+ while((y != nil_) && (x == y->right_))
+ {
+ x = y;
+ y = y->parent_;
+ }
+
+ if(y == nil_)
+ return 0;
+
+ return y;
+ }
+
+ return 0;
+ }
+
+ //! Returns the predecessor of a given node or zero if not.
+ virtual NODE* Predecessor(NODE* x) const
+ {
+ if(x)
+ {
+ if(x->left_ != nil_)
+ {
+ x = x->left_;
+
+ while(x->right_ != nil_)
+ x = x->right_;
+
+ return x;
+ }
+
+ NODE* y = x->parent_;
+
+ while((y != nil_) && (x == y->left_))
+ {
+ x = y;
+ y = y->parent_;
+ }
+
+ if(y == nil_)
+ return 0;
+
+ return y;
+ }
+
+ return 0;
+ }
+
+ //! Returns the leftmost node in the tree, or zero if not.
+ NODE* First(void) const
+ {
+ if(IsEmpty())
+ return 0;
+
+ NODE *x = root_;
+
+ while(x->left_ != nil_)
+ x = x->left_;
+
+ return x;
+ }
+
+ //! Returns the rightmost node in the tree, or zero if not.
+ NODE* Last(void) const
+ {
+ if(IsEmpty())
+ return 0;
+
+ NODE *x = root_;
+
+ while(x->right_ != nil_)
+ x = x->right_;
+
+ return x;
+ }
+
+ //! Return the first element in the tree and removes it.
+ virtual bool GetFirst(TeRedBlackNodeData& d)
+ {
+ NODE *x = First();
+
+ if(x)
+ {
+ d = x->data_;
+
+ Delete(x);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ //! Removes all nodes from the tree (excepty the nil node). Clear memory.
+ void Clear(void)
+ {
+ if(!IsEmpty())
+ {
+ Erase(root_);
+
+ root_ = nil_;
+ }
+
+ return;
+ }
+
+ //! Write the node's data to a file. The data must implement a methos called: void ToString(void).
+ virtual void WriteToFile(const string& fileName) const
+ {
+ string strRepres = "";
+
+ WriteToFile(root_, strRepres);
+
+ TeWriteToFile(fileName, strRepres, "w");
+
+ return;
+ }
+
+ protected:
+
+ //! Left rotation.
+ virtual void LeftRotate(NODE* x, NODE*& root)
+ {
+ NODE* y = x->right_;
+
+ x->right_ = y->left_;
+
+ if(y->left_ != nil_)
+ y->left_->parent_ = x;
+
+ y->parent_ = x->parent_;
+
+
+ if(x == root)
+ root = y;
+ else
+ {
+ if(x == x->parent_->left_)
+ x->parent_->left_ = y;
+ else
+ x->parent_->right_ = y;
+ }
+
+ y->left_ = x;
+ x->parent_ = y;
+
+ return;
+ }
+
+ //! Right rotation.
+ virtual void RightRotate(NODE* y, NODE*& root)
+ {
+ NODE* x = y->left_;
+
+ y->left_ = x->right_;
+
+ if(x->right_ != nil_)
+ x->right_->parent_ = y;
+
+ x->parent_ = y->parent_;
+
+ if(y == root)
+ root = x;
+ else
+ {
+ if(y == y->parent_->right_)
+ y->parent_->right_ = x;
+ else
+ y->parent_->left_ = x;
+ }
+
+ x->right_ = y;
+ y->parent_ = x;
+
+ return;
+ }
+
+ //! Must be called after an insert, to fix-up the tree.
+ void InsertFixUp(NODE*& n, NODE*& root)
+ {
+ n->color_ = TeREDNODE;
+
+ NODE* y;
+
+ while ((n != root) && (n->parent_->color_ == TeREDNODE))
+ {
+ if(n->parent_ == n->parent_->parent_->left_)
+ {
+ y = n->parent_->parent_->right_;
+ if(y->color_ == TeREDNODE)
+ {
+ n->parent_->color_ = TeBLACKNODE;
+ y->color_ = TeBLACKNODE;
+ n = n->parent_->parent_;
+ n->color_ = TeREDNODE;
+ }
+ else
+ {
+ if(n == n->parent_->right_)
+ {
+ n = n->parent_;
+ LeftRotate(n, root);
+ }
+
+ n->parent_->color_ = TeBLACKNODE;
+ n->parent_->parent_->color_ = TeREDNODE;
+ RightRotate(n->parent_->parent_, root);
+ }
+ }
+ else
+ {
+ y = n->parent_->parent_->left_;
+ if(y->color_ == TeREDNODE)
+ {
+ n->parent_->color_ = TeBLACKNODE;
+ y->color_ = TeBLACKNODE;
+ n = n->parent_->parent_;
+ n->color_ = TeREDNODE;
+ }
+ else
+ {
+ if(n == n->parent_->left_)
+ {
+ n = n->parent_;
+ RightRotate(n, root);
+ }
+
+ n->parent_->color_ = TeBLACKNODE;
+ n->parent_->parent_->color_ = TeREDNODE;
+ LeftRotate(n->parent_->parent_, root);
+ }
+ }
+ }
+
+ root->color_ = TeBLACKNODE;
+
+ return;
+ }
+
+ //! Must be called after a deletion, to fix-up the tree.
+ void DeleteFixUp(NODE* x, NODE* x_parent, NODE*& root)
+ {
+ while((x != root) && (x == nil_ || x->color_ == TeBLACKNODE))
+ {
+ if(x == x_parent->left_)
+ {
+ NODE *w = x_parent->right_;
+
+ if(w->color_ == TeREDNODE)
+ {
+ w->color_ = TeBLACKNODE;
+ x_parent->color_ = TeREDNODE;
+ LeftRotate(x_parent, root);
+ w = x_parent->right_;
+ }
+
+ if((w->left_ == nil_ || w->left_->color_ == TeBLACKNODE) && (w->right_ == nil_ || w->right_->color_ == TeBLACKNODE))
+ {
+ w->color_ = TeREDNODE;
+ x = x_parent;
+ x_parent = x_parent->parent_;
+ }
+ else
+ {
+ if(w->right_ == nil_ || w->right_->color_ == TeBLACKNODE)
+ {
+ if(w->left_ != nil_)
+ w->left_->color_ = TeBLACKNODE;
+
+ w->color_ = TeREDNODE;
+ RightRotate(w, root);
+ w = x_parent->right_;
+ }
+
+ w->color_ = x_parent->color_;
+ x_parent->color_ = TeBLACKNODE;
+
+ if(w->right_ != nil_)
+ w->right_->color_ = TeBLACKNODE;
+
+ LeftRotate(x_parent, root);
+
+ break;
+ }
+ }
+ else
+ {
+ NODE* w = x_parent->left_;
+
+ if(w->color_ == TeREDNODE)
+ {
+ w->color_ = TeBLACKNODE;
+ x_parent->color_ = TeREDNODE;
+ RightRotate(x_parent, root);
+ w = x_parent->left_;
+ }
+
+ if((w->left_ == nil_ || w->left_->color_ == TeBLACKNODE) && (w->right_ == nil_ || w->right_->color_ == TeBLACKNODE))
+ {
+ w->color_ = TeREDNODE;
+ x = x_parent;
+ x_parent = x_parent->parent_;
+ }
+ else
+ {
+ if(w->left_ == nil_ || w->left_->color_ == TeBLACKNODE)
+ {
+ if(w->right_ != nil_)
+ w->right_->color_ = TeBLACKNODE;
+
+ w->color_ = TeREDNODE;
+ LeftRotate(w, root);
+ w = x_parent->left_;
+ }
+
+ w->color_ = x_parent->color_;
+ x_parent->color_ = TeBLACKNODE;
+
+ if(w->left_ != nil_)
+ w->left_->color_ = TeBLACKNODE;
+
+ RightRotate(x_parent, root);
+
+ break;
+ }
+ }
+ }
+
+ if(x != nil_)
+ x->color_ = TeBLACKNODE;
+ }
+
+ //! Only to be used by the public method, walking on the tree.
+ virtual void WriteToFile(NODE* n, string& strRepres) const
+ {
+ if(n != nil_)
+ {
+ WriteToFile(n->left_, strRepres);
+
+ strRepres += n->data_.ToString();
+ strRepres += '\n';
+
+ WriteToFile(n->right_, strRepres);
+ }
+
+ return;
+ }
+
+ //! Removes the node and all node below it and doesn't do rebalancing. Used to free the memory.
+ void Erase(NODE* n)
+ {
+ if(n != nil_)
+ {
+ Erase(n->left_);
+ Erase(n->right_);
+
+ delete n;
+
+ nodeCount_--;
+ }
+
+ return;
+ }
+
+ public:
+
+ //! Iterators class for the tree. It is used to abstract walking on the tree.
+ template<class Node_i> class internal_iterator
+ {
+ protected:
+
+ //! Pointer to the tree.
+ TeRBTree<Node_i>* tree_;
+
+ //! Pointer to the node.
+ Node_i* node_;
+
+ public:
+
+ void invalid(void)
+ {
+ node_ = 0;
+ return;
+ }
+
+ Node_i* getNode(void) const
+ {
+ return node_;
+ }
+
+ public:
+
+ //! Constructor.
+ internal_iterator()
+ : node_(0), tree_(0)
+ {
+ }
+
+ //! Constructor
+ internal_iterator(TeRBTree<Node_i>* tree, Node_i* n)
+ : tree_(tree), node_(n)
+ {
+ }
+
+ //! Destructor.
+ virtual ~internal_iterator()
+ {
+ }
+
+ //! Dereference operator.
+ typename Node_i::TeRedBlackNodeData* operator->() const
+ {
+ return &node_->data_;
+ }
+
+ //! Dereference operator.
+ typename Node_i::TeRedBlackNodeData& operator*() const
+ {
+ return node_->data_;
+ }
+
+ //! Operator ++ pre-fixed.
+ internal_iterator& operator++()
+ {
+ node_ = tree_->Successor(node_);
+
+
+ return *this;
+ }
+
+ //! Operator ++ pos-fixed
+ internal_iterator operator++(int)
+ {
+ internal_iterator temp = *this;
+ ++(*this);
+
+ return temp;
+ }
+
+ //! Operator -- pre-fixed.
+ internal_iterator& operator--()
+ {
+ node_ = tree_->Predecessor(node_);
+
+
+ return *this;
+ }
+
+ //! Operator -- pos-fixed
+ internal_iterator operator--(int)
+ {
+ internal_iterator temp = *this;
+ --(*this);
+ return temp;
+ }
+
+ //! Operator ==.
+ bool operator==(const internal_iterator& other) const
+ {
+ return (this->node_ == other.node_);
+ }
+
+ //! Operator !=.
+ bool operator!=(const internal_iterator& other) const
+ {
+ return(this->node_ != other.node_);
+ }
+ };
+
+ //! Exports iterator type.
+ typedef internal_iterator<NODE> iterator;
+
+ //! Returns an iterator to the leftmost node of the tree.
+ iterator begin(void)
+ {
+ return iterator(this, First());
+ }
+
+ //! Returns a reference iterator indicating the end of a tree.
+ iterator end(void)
+ {
+ return iterator(this, 0);
+ }
+
+ //! Erases a node pointed by an interator.
+ void erase(iterator& it)
+ {
+ Delete(it.getNode());
+
+ it.invalid();
+
+ return;
+ }
+ };
+
+} // end namespace TeREDBLACK
+#endif // __TERRALIB_INTERNAL_RED_BLACK_TREE_H
diff --git a/src/terralib/kernel/TeRepresentation.cpp b/src/terralib/kernel/TeRepresentation.cpp
new file mode 100644
index 0000000..e2ce078
--- /dev/null
+++ b/src/terralib/kernel/TeRepresentation.cpp
@@ -0,0 +1,34 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeRepresentation.h"
+
+TeRepresPointerVectorIterator
+TeFindRepresentation(TeRepresPointerVectorIterator begin, TeRepresPointerVectorIterator end, TeGeomRep rep)
+{
+ return find_if(begin,end,TeRepres_eq(rep));
+}
diff --git a/src/terralib/kernel/TeRepresentation.h b/src/terralib/kernel/TeRepresentation.h
new file mode 100644
index 0000000..31a2916
--- /dev/null
+++ b/src/terralib/kernel/TeRepresentation.h
@@ -0,0 +1,79 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeRepresentation.h
+ This file contains structures and definitions to deal with a geometrical representation
+*/
+#ifndef __TERRALIB_INTERNAL_REPRESENTATION_H
+#define __TERRALIB_INTERNAL_REPRESENTATION_H
+
+#include "TeDataTypes.h"
+#include "TeBox.h"
+
+#include <algorithm>
+#include <string>
+
+//! A class to supporting a geometrical representation
+struct TeRepresentation
+{
+ int id_; //!< representation unique dabatase identifier
+ TeGeomRep geomRep_; //!< representation type (
+ string tableName_; //!< name of the table that stores the geometries associated to this representation
+ TeBox box_; //!< representation bounding box
+ string description_; //!< representation description
+ double resX_; //!< the x resolution of the layer cell set geometry
+ double resY_; //!< the y resolution of the layer cell set geometry
+ int nCols_; //!< number of columns in raster geometry
+ int nLins_; //!< number of columns in raster geometry
+
+ //! Constructor
+ TeRepresentation() :
+ resX_(0.0),
+ resY_(0.0),
+ nCols_(0),
+ nLins_(0)
+ {}
+};
+
+//! A functor class to compare representations by its type
+class TeRepres_eq : public unary_function<TeRepresentation*,bool>
+{
+ TeGeomRep r;
+public:
+ explicit TeRepres_eq(TeGeomRep rr): r(rr) {}
+ bool operator()(const TeRepresentation* rep) const { return rep->geomRep_ == r; }
+};
+
+//! An iterator to a vector of TeRepresentation
+typedef vector<TeRepresentation* >::iterator TeRepresPointerVectorIterator;
+
+//! A vector of pointers to TeRepresentation
+typedef vector<TeRepresentation* > TeRepresPointerVector;
+
+//! Finds the first representation of a given type in a vector of representations
+TeRepresPointerVectorIterator
+TeFindRepresentation(TeRepresPointerVectorIterator begin, TeRepresPointerVectorIterator end, TeGeomRep rep);
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeSTEFunctionsDB.cpp b/src/terralib/kernel/TeSTEFunctionsDB.cpp
new file mode 100644
index 0000000..c18085d
--- /dev/null
+++ b/src/terralib/kernel/TeSTEFunctionsDB.cpp
@@ -0,0 +1,623 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeSTElementSet.h"
+#include "TeSTInstance.h"
+#include "TeSTEvent.h"
+#include "TeProgress.h"
+#include "TeQuerier.h"
+#include "TeQuerierDB.h"
+#include "TeSTEFunctionsDB.h"
+
+//------------------------------- auxiliary functions
+
+bool insertRow (TeSTInstance* elem, TeTable& table, const string& uniqueValue, vector<int>* indexes=0)
+{
+ vector<string> attrs;
+ table.attributeNames(attrs);
+
+ string ins = " INSERT INTO "+ table.name() +" (";
+ string values = " VALUES ( ";
+
+ TePropertyVector prop = elem->getPropertyVector();
+ int count=0;
+
+ for(unsigned int i=0; i<prop.size(); ++i)
+ {
+ if(indexes && (find(indexes->begin(), indexes->end(),(int)i) == indexes->end()))
+ continue;
+
+ string attrName = prop[i].attr_.rep_.name_;
+
+ if( (find(attrs.begin(), attrs.end(), attrName)!=attrs.end()) &&
+ (attrName != table.uniqueName()) &&
+ (attrName != table.linkName()) &&
+ (attrName != table.attInitialTime()) &&
+ (attrName != table.attFinalTime()) )
+
+ {
+ if(count>0)
+ {
+ ins += ",";
+ values += ",";
+ }
+ ++count;
+ ins += attrName;
+ if(prop[i].attr_.rep_.type_==TeSTRING)
+ values += "'"+ prop[i].value_ +"'";
+ else if(prop[i].attr_.rep_.type_==TeDATETIME)
+ {
+ TeTime time(prop[i].value_, prop[i].attr_.dateChronon_, prop[i].attr_.dateTimeFormat_, prop[i].attr_.dateSeparator_, prop[i].attr_.timeSeparator_);
+ values += elem->theme()->layer()->database()->getSQLTime(time);
+ }
+ else
+ values += prop[i].value_;
+ }
+ }
+
+ // -------- object_id, unique_id and timeInterval
+
+ if(count>0)
+ {
+ ins += " ,";
+ values += " ,";
+ }
+
+ ins += table.linkName();
+ values += "'"+ elem->objectId() +"'";
+
+ if(table.linkName() != table.uniqueName())
+ {
+ ins += ", "+ table.uniqueName();
+ values += ", '"+ uniqueValue +"'";
+ }
+
+ if(!table.attInitialTime().empty())
+ {
+ TeTime time (elem->timeInterval().getT1());
+ ins += ", "+ table.attInitialTime();
+ values += ", "+ elem->theme()->layer()->database()->getSQLTime(time);
+ }
+
+ if((!table.attFinalTime().empty()) && (table.attInitialTime()!=table.attFinalTime()))
+ {
+ TeTime time (elem->timeInterval().getT2());
+ ins += ", "+ table.attFinalTime();
+ values += ", "+ elem->theme()->layer()->database()->getSQLTime(time);
+ }
+ // ----------
+
+ ins += ") "+ values +" )";
+
+ if(!elem->theme()->layer()->database ()->execute (ins))
+ return false;
+
+ return true;
+}
+
+
+bool insertRow (TeSTEvent* elem, TeTable& table, const string& uniqueValue, vector<int>* indexes=0)
+{
+ vector<string> attrs;
+ table.attributeNames(attrs);
+
+ string ins = " INSERT INTO "+ table.name() +" (";
+ string values = " VALUES ( ";
+
+ TePropertyVector prop = elem->getPropertyVector();
+ int count=0;
+
+ for(unsigned int i=0; i<prop.size(); ++i)
+ {
+ if(indexes && (find(indexes->begin(), indexes->end(),(int)i) == indexes->end()))
+ continue;
+
+ string attrName = prop[i].attr_.rep_.name_;
+
+ if( (find(attrs.begin(), attrs.end(), attrName)!=attrs.end()) &&
+ (attrName != table.uniqueName()) &&
+ (attrName != table.linkName()) &&
+ (attrName != table.attInitialTime()) &&
+ (attrName != table.attFinalTime()) )
+
+ {
+ if(count>0)
+ {
+ ins += ",";
+ values += ",";
+ }
+ ++count;
+ ins += attrName;
+ if(prop[i].attr_.rep_.type_==TeSTRING)
+ values += "'"+ prop[i].value_ +"'";
+ else if(prop[i].attr_.rep_.type_==TeDATETIME)
+ {
+ TeTime time(prop[i].value_, prop[i].attr_.dateChronon_, prop[i].attr_.dateTimeFormat_, prop[i].attr_.dateSeparator_, prop[i].attr_.timeSeparator_);
+ values += elem->theme()->layer()->database()->getSQLTime(time);
+ }
+ else
+ values += prop[i].value_;
+ }
+ }
+
+ // -------- object_id, unique_id and timeInterval
+
+ if(count>0)
+ {
+ ins += " ,";
+ values += " ,";
+ }
+
+ ins += table.linkName();
+ values += "'"+ elem->objectId() +"'";
+
+ if(table.linkName() != table.uniqueName())
+ {
+ ins += ", "+ table.uniqueName();
+ values += ", '"+ uniqueValue +"'";
+ }
+
+ if(!table.attInitialTime().empty())
+ {
+ TeTime time (elem->timeInterval().getT1());
+ ins += ", "+ table.attInitialTime();
+ values += ", "+ elem->theme()->layer()->database()->getSQLTime(time);
+ }
+
+ if((!table.attFinalTime().empty()) && (table.attInitialTime()!=table.attFinalTime()))
+ {
+ TeTime time (elem->timeInterval().getT2());
+ ins += ", "+ table.attFinalTime();
+ values += ", "+ elem->theme()->layer()->database()->getSQLTime(time);
+ }
+ // ----------
+
+ ins += ") "+ values +" )";
+
+ if(!elem->theme()->layer()->database ()->execute (ins))
+ return false;
+
+ return true;
+}
+
+bool updateRow (TeSTInstance* elem, TeTable table, const string& uniqueId, vector<int>* indexes=0)
+{
+
+ vector<string> attrs;
+ table.attributeNames(attrs);
+
+ string ins = " UPDATE "+ table.name() +" SET ";
+
+ TePropertyVector prop = elem->getPropertyVector();
+ int count = 0;
+ for(unsigned int i=0; i<prop.size(); ++i)
+ {
+ if(indexes && (find(indexes->begin(), indexes->end(),(int)i) == indexes->end()))
+ continue;
+
+ string attrName = prop[i].attr_.rep_.name_;
+
+ if( (find(attrs.begin(), attrs.end(), attrName)!=attrs.end()) &&
+ (attrName != table.uniqueName()) &&
+ (attrName != table.linkName()) &&
+ (attrName != table.attInitialTime()) &&
+ (attrName != table.attFinalTime()) )
+ {
+
+ if(count>0)
+ ins += ",";
+
+ ++count;
+ ins += attrName +" = ";
+
+ if(prop[i].attr_.rep_.type_==TeSTRING)
+ ins += "'"+ prop[i].value_ +"'";
+ else if(prop[i].attr_.rep_.type_==TeDATETIME)
+ {
+ TeTime time(prop[i].value_, prop[i].attr_.dateChronon_, prop[i].attr_.dateTimeFormat_, prop[i].attr_.dateSeparator_, prop[i].attr_.timeSeparator_);
+ ins += elem->theme()->layer()->database()->getSQLTime(time);
+ }
+ else
+ ins += prop[i].value_;
+ }
+ }
+
+ // -------- timeInterval
+ if(!table.attInitialTime().empty())
+ {
+ TeTime time (elem->timeInterval().getT1());
+ ins += ", "+ table.attInitialTime() +" = ";
+ ins += elem->theme()->layer()->database()->getSQLTime(time);
+ }
+
+ if((!table.attFinalTime().empty()) && (table.attInitialTime()!=table.attFinalTime()))
+ {
+ TeTime time (elem->timeInterval().getT2());
+ ins += ", "+ table.attFinalTime() +" = ";
+ ins += elem->theme()->layer()->database()->getSQLTime(time);
+ }
+ // ----------
+
+ ins += " WHERE "+ table.uniqueName() +" = '"+ uniqueId +"'";
+
+ if(!elem->theme()->layer()->database()->execute (ins))
+ return false;
+
+ return true;
+}
+
+bool updateRow (TeSTEvent* elem, TeTable table, const string& uniqueId, vector<int>* indexes=0)
+{
+
+ vector<string> attrs;
+ table.attributeNames(attrs);
+
+ string ins = " UPDATE "+ table.name() +" SET ";
+
+ TePropertyVector prop = elem->getPropertyVector();
+ int count = 0;
+ for(unsigned int i=0; i<prop.size(); ++i)
+ {
+ if(indexes && (find(indexes->begin(), indexes->end(),(int)i) == indexes->end()))
+ continue;
+
+ string attrName = prop[i].attr_.rep_.name_;
+
+ if( (find(attrs.begin(), attrs.end(), attrName)!=attrs.end()) &&
+ (attrName != table.uniqueName()) &&
+ (attrName != table.linkName()) &&
+ (attrName != table.attInitialTime()) &&
+ (attrName != table.attFinalTime()) )
+ {
+
+ if(count>0)
+ ins += ",";
+
+ ++count;
+ ins += attrName +" = ";
+
+ if(prop[i].attr_.rep_.type_==TeSTRING)
+ ins += "'"+ prop[i].value_ +"'";
+ else if(prop[i].attr_.rep_.type_==TeDATETIME)
+ {
+ TeTime time(prop[i].value_, prop[i].attr_.dateChronon_, prop[i].attr_.dateTimeFormat_, prop[i].attr_.dateSeparator_, prop[i].attr_.timeSeparator_);
+ ins += elem->theme()->layer()->database()->getSQLTime(time);
+ }
+ else
+ ins += prop[i].value_;
+ }
+ }
+
+ // -------- timeInterval
+ if(!table.attInitialTime().empty())
+ {
+ TeTime time (elem->timeInterval().getT1());
+ ins += ", "+ table.attInitialTime() +" = ";
+ ins += elem->theme()->layer()->database()->getSQLTime(time);
+ }
+
+ if((!table.attFinalTime().empty()) && (table.attInitialTime()!=table.attFinalTime()))
+ {
+ TeTime time (elem->timeInterval().getT2());
+ ins += ", "+ table.attFinalTime() +" = ";
+ ins += elem->theme()->layer()->database()->getSQLTime(time);
+ }
+ // ----------
+
+ ins += " WHERE "+ table.uniqueName() +" = '"+ uniqueId +"'";
+
+ if(!elem->theme()->layer()->database()->execute (ins))
+ return false;
+
+ return true;
+}
+
+//-------------------------------
+
+bool
+TeSTOSetBuildDB(TeSTElementSet* stoset, bool loadGeometries, bool loadAllAttributes, vector<string> attrNames)
+{
+ if(!stoset->querier())
+ return false;
+
+ if(!stoset->build(loadGeometries, loadAllAttributes, attrNames))
+ return false;
+ return true;
+}
+
+bool
+TeSTOSetBuildDB(TeSTElementSet* stoset, TeGroupingAttr& groupAttr, bool loadGeometries)
+{
+ if(!stoset->querier())
+ return false;
+
+ if(!stoset->build(groupAttr, loadGeometries))
+ return false;
+ return true;
+}
+
+bool
+TeUpdateDBFromSet (TeSTElementSet* elemSet, const string& tableName, vector<int>* indexes)
+{
+ if(!elemSet->theme()->layer())
+ return false;
+
+ TeDatabase* db = elemSet->theme()->layer()->database();
+
+ //progress bar
+ int step = 0;
+ int numSteps = elemSet->numSTInstance();
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(numSteps);
+
+ try
+ {
+ TeAttrTableVector attrTables;
+ elemSet->theme()->getAttTables(attrTables);
+ if(attrTables.empty())
+ return false;
+
+ TeTable table;
+ int uniqueIndex = -1;
+
+ //! verify if the table is in the stoset
+ for(unsigned int i=0; i<attrTables.size(); i++)
+ {
+ if(attrTables[i].name()==tableName)
+ {
+ uniqueIndex = i;
+ table = attrTables[i];
+ break;
+ }
+ }
+
+ if((uniqueIndex==-1) || ((table.tableType()!=TeAttrEvent) &&
+ (table.tableType()!=TeAttrStatic) &&
+ (table.tableType()!=TeFixedGeomDynAttr) &&
+ (table.tableType()!=TeAttrExternal)))
+ return false;
+
+ // get some information about the attribute table required
+ string uniqueIdName = table.uniqueName();
+
+ TeDatabasePortal* portal = db->getPortal();
+ if(!portal)
+ return false;
+
+ vector<string> uniqueIds;
+ string sql = "SELECT "+ uniqueIdName +" FROM "+ table.name();
+
+ if(!portal->query (sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ while(portal->fetchRow())
+ uniqueIds.push_back(portal->getData(0));
+
+ delete portal;
+
+ // Update all the objects
+ TeSTElementSet::iterator itObj = elemSet->begin();
+ while (itObj != elemSet->end())
+ {
+ //verify if all columns exist in the table
+ if(itObj == elemSet->begin())
+ {
+ TePropertyVector vec = (*itObj).getPropertyVector();
+ for(unsigned int i=0; i<vec.size(); ++i)
+ {
+ if(indexes && (find(indexes->begin(), indexes->end(),(int)i) == indexes->end()))
+ continue;
+
+ //verify if the table has this column
+ if (!elemSet->theme()->layer()->database()->columnExist(tableName, vec[i].attr_.rep_.name_ , vec[i].attr_))
+ {
+ if(!elemSet->theme()->layer()->database()->addColumn (tableName, vec[i].attr_.rep_))
+ return false;
+
+ TeAttributeList attrList = table.attributeList();
+ attrList.push_back (vec[i].attr_);
+ table.setAttributeList (attrList);
+ }
+ }
+ }
+
+ string uniqueId = (*itObj).uniqueId(uniqueIndex);
+
+ if(find(uniqueIds.begin(), uniqueIds.end(), uniqueId) == uniqueIds.end())
+ {
+ if (!insertRow (&(*itObj), table, uniqueId, indexes))
+ return false;
+
+ uniqueIds.push_back(uniqueId);
+ }
+ else
+ {
+ if (!updateRow (&(*itObj), table, uniqueId, indexes))
+ return false;
+ }
+
+ ++itObj;
+
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ TeProgress::instance()->setProgress(step);
+ }
+ ++step;
+ }
+ }
+ catch(...)
+ {
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ return false;
+ }
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ return true;
+}
+
+
+bool
+TeUpdateDBFromSet (TeSTEventSet* elemSet, const string& tableName, vector<int>* indexes)
+{
+ if(!elemSet->theme()->layer())
+ return false;
+
+ TeDatabase* db = elemSet->theme()->layer()->database();
+
+ //progress bar
+ int step = 0;
+ int numSteps = elemSet->numSTInstance();
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(numSteps);
+
+ try
+ {
+ TeAttrTableVector attrTables;
+ elemSet->theme()->getAttTables(attrTables);
+ if(attrTables.empty())
+ return false;
+
+ TeTable table;
+ int uniqueIndex = -1;
+
+ //! verify if the table is in the stoset
+ for(unsigned int i=0; i<attrTables.size(); i++)
+ {
+ if(attrTables[i].name()==tableName)
+ {
+ uniqueIndex = i;
+ table = attrTables[i];
+ break;
+ }
+ }
+
+ if((uniqueIndex==-1) || ((table.tableType()!=TeAttrEvent) &&
+ (table.tableType()!=TeAttrStatic) &&
+ (table.tableType()!=TeFixedGeomDynAttr) &&
+ (table.tableType()!=TeAttrExternal)))
+ return false;
+
+ // get some information about the attribute table required
+ string uniqueIdName = table.uniqueName();
+
+ TeDatabasePortal* portal = db->getPortal();
+ if(!portal)
+ return false;
+
+ vector<string> uniqueIds;
+ string sql = "SELECT "+ uniqueIdName +" FROM "+ table.name();
+
+ if(!portal->query (sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ while(portal->fetchRow())
+ uniqueIds.push_back(portal->getData(0));
+
+ delete portal;
+
+ // Update all the objects
+ TeSTEventSet::iterator itObj = elemSet->begin();
+ while (itObj != elemSet->end())
+ {
+ //verify if all columns exist in the table
+ if(itObj == elemSet->begin())
+ {
+ TePropertyVector vec = (*itObj).getPropertyVector();
+ for(unsigned int i=0; i<vec.size(); ++i)
+ {
+ if(indexes && (find(indexes->begin(), indexes->end(),(int)i) == indexes->end()))
+ continue;
+
+ //verify if the table has this column
+ if (!elemSet->theme()->layer()->database()->columnExist(tableName, vec[i].attr_.rep_.name_ , vec[i].attr_))
+ {
+ if(!elemSet->theme()->layer()->database()->addColumn (tableName, vec[i].attr_.rep_))
+ return false;
+
+ TeAttributeList attrList = table.attributeList();
+ attrList.push_back (vec[i].attr_);
+ table.setAttributeList (attrList);
+ }
+ }
+ }
+
+ string uniqueId = (*itObj).uniqueId(uniqueIndex);
+
+ if(find(uniqueIds.begin(), uniqueIds.end(), uniqueId) == uniqueIds.end())
+ {
+ if (!insertRow (&(*itObj), table, uniqueId, indexes))
+ return false;
+
+ uniqueIds.push_back(uniqueId);
+ }
+ else
+ {
+ if (!updateRow (&(*itObj), table, uniqueId, indexes))
+ return false;
+ }
+
+ ++itObj;
+
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ TeProgress::instance()->setProgress(step);
+ }
+ ++step;
+ }
+ }
+ catch(...)
+ {
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ return false;
+ }
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ return true;
+
+}
+
+
diff --git a/src/terralib/kernel/TeSTEFunctionsDB.h b/src/terralib/kernel/TeSTEFunctionsDB.h
new file mode 100644
index 0000000..2eb3d94
--- /dev/null
+++ b/src/terralib/kernel/TeSTEFunctionsDB.h
@@ -0,0 +1,81 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library p rovided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_STOFUNCTIONS_H
+#define __TERRALIB_INTERNAL_STOFUNCTIONS_H
+
+#include "TeDatabase.h"
+#include <vector>
+#include <string>
+
+class TeSTElementSet;
+class TeSTEventSet;
+
+//! Builds the spatial object set from database according to the restrictions previously defined
+/*!
+ \param stoset the STOSet that will be filled
+ \param loadGeometries if the STOSet will be filled with the geometries
+ \param loadAllAttributes if the STOSet will be filled with all attributes of the tables of the STOSet
+ \param attrNames a subset of the attribute names that will be loaded, if the param loadAllAttributes is false
+*/
+bool
+TeSTOSetBuildDB(TeSTElementSet* stoset, bool loadGeometries = false, bool loadAllAttributes = false, vector<string> attrNames = vector<string>());
+
+
+//! Builds the spatial object set from database according to the restrictions previously defined
+/*!
+ \param stoset the STOSet that will be filled
+ \param groupAttr a map from attribute name to statistic type
+ \param loadGeometries if the STOSet will be filled with the geometries
+*/
+bool
+TeSTOSetBuildDB(TeSTElementSet* stoset, TeGroupingAttr& groupAttr, bool loadGeometries = false);
+
+
+//! Updates the database table from a element set
+bool
+TeUpdateDBFromSet (TeSTElementSet* elemSet, const string& tableName, vector<int>* indexes = 0);
+
+
+//! Updates the database table from a element set
+bool
+TeUpdateDBFromSet (TeSTEventSet* elemSet, const string& tableName, vector<int>* indexes = 0);
+
+
+/** \example STObjectSetExample1.cpp
+ * This is an example of how to create a new Spatial Temporal Object
+ Set (STObjectSet) filled whit attributes from a layer .
+ */
+
+ /** \example STObjectSetExample2.cpp
+ * This is an example of how to create a new Spatial Temporal Object
+ Set (STObjectSet) filled whit geometries and attributes from a theme.
+ */
+
+ /** \example STObjectSetExample3.cpp
+ * This is an example of how to create a new Spatial Temporal Object
+ Set (STObjectSet) and to use it in spatial algorithms.
+ */
+
+#endif
+
diff --git a/src/terralib/kernel/TeSTElement.cpp b/src/terralib/kernel/TeSTElement.cpp
new file mode 100644
index 0000000..fed1069
--- /dev/null
+++ b/src/terralib/kernel/TeSTElement.cpp
@@ -0,0 +1,196 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "TeSTElement.h"
+#include "TeQuerier.h"
+#include "TeQuerierParams.h"
+
+
+TeSTElement::TeSTElement (const string& objId)
+{
+ object_id_ = objId;
+ time_ = TeTimeInterval();
+ querier_ = 0;
+}
+
+TeSTElement::TeSTElement(TeTheme* theme, const string& objId)
+{
+ TeQuerierParams params;
+ params.setParams(theme, objId);
+
+ object_id_ = objId;
+ time_ = TeTimeInterval();
+ querier_ = new TeQuerier(params);
+}
+
+TeSTElement::TeSTElement(const TeSTElement& other)
+{
+ object_id_ = other.object_id_;
+ time_ = other.time_;
+ instances_ = other.instances_;
+ if(other.querier_)
+ querier_ = new TeQuerier(other.querier_->params());
+ else
+ querier_ = 0;
+}
+
+TeSTElement::~TeSTElement()
+{
+ if(querier_)
+ delete (querier_);
+}
+
+TeSTElement&
+TeSTElement::operator= (const TeSTElement& other)
+{
+ if ( this != &other )
+ {
+ object_id_ = other.object_id_;
+ time_ = other.time_;
+ instances_ = other.instances_;
+
+ if(other.querier_)
+ querier_ = new TeQuerier(other.querier_->params());
+ else
+ querier_ = 0;
+ }
+ return *this;
+}
+
+void
+TeSTElement::querier(TeQuerier* qu)
+{
+ if(querier_)
+ delete (querier_);
+
+ querier_ = qu;
+}
+
+bool
+TeSTElement::insertSTInstance (TeSTInstance& object)
+{
+ if(object.objectId() != this->objectId())
+ return false;
+
+ instances_.push_back (object);
+ return true;
+}
+
+bool
+TeSTElement::build(bool loadGeometries, bool loadAllAttributes, vector<string> attrNames, int slide)
+{
+ if(!querier_)
+ return false;
+
+ TeQuerierParams* param;
+ if(loadAllAttributes)
+ param = new TeQuerierParams(loadGeometries, loadAllAttributes);
+ else
+ param = new TeQuerierParams(loadGeometries, attrNames);
+
+ param->setParams(querier_->params().theme(), objectId());
+
+ querier_->refresh(*param);
+ delete param;
+
+ return(buildImpl(slide));
+}
+
+bool
+TeSTElement::build(TeGroupingAttr& groupAttr, bool loadGeometries, int slide)
+{
+ if(!querier_)
+ return false;
+
+ TeQuerierParams param(loadGeometries, groupAttr);
+ param.setParams(querier_->params().theme(), objectId());
+
+ querier_->refresh(param);
+
+ return(buildImpl(slide));
+}
+
+bool
+TeSTElement::buildImpl(int slide)
+{
+ int dt = CLOCKS_PER_SEC/4, steps = 0;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+
+ if(!querier_->loadInstances(slide))
+ return false;
+
+ int tot = querier_->numElemInstances();
+ if(TeProgress::instance())
+ {
+ string caption = "Building data";
+ TeProgress::instance()->setCaption(caption.c_str());
+ string msg = "Building in progress. Please, wait!";
+ TeProgress::instance()->setMessage(msg);
+ TeProgress::instance()->setTotalSteps(tot);
+ t2 = clock();
+ t0 = t1 = t2;
+ }
+
+ TeSTInstance obj;
+ while(querier_->fetchInstance(obj))
+ {
+ this->insertSTInstance(obj);
+ obj.clear();
+ if(TeProgress::instance())
+ {
+ steps++;
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ if(TeProgress::instance()->wasCancelled())
+ return false;
+
+ if((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(steps);
+ }
+ }
+ }
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ querier_->clear(); //clear instances
+ return true;
+}
+
+TeSTElement::iterator
+TeSTElement::begin()
+{
+ return iterator(instances_.begin());
+}
+
+TeSTElement::iterator
+TeSTElement::end()
+{
+ return iterator(instances_.end());
+}
+
+
+
diff --git a/src/terralib/kernel/TeSTElement.h b/src/terralib/kernel/TeSTElement.h
new file mode 100644
index 0000000..9ab2ec8
--- /dev/null
+++ b/src/terralib/kernel/TeSTElement.h
@@ -0,0 +1,148 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeSTElement.h
+ This file contains structures and definitions to deal with instances
+ in time of a spatial element
+*/
+
+#ifndef __TERRALIB_INTERNAL_STELEMENT_H
+#define __TERRALIB_INTERNAL_STELEMENT_H
+
+#include "TeSTInstance.h"
+#include "TeTimeInterval.h"
+
+class TeQuerier;
+
+#include <string>
+#include <map>
+#include <vector>
+using namespace std;
+
+//! A spatial element and its instances in the time
+class TeSTElement
+{
+ protected:
+ string object_id_; // object identification
+ TeTimeInterval time_; // validity time
+ TeQuerier* querier_; // to fill the instance
+
+ vector<TeSTInstance> instances_; // instances ordered by time
+
+ typedef vector<TeSTInstance>::iterator STElementIterator;
+
+ //! internal function to fill this STElement
+ bool buildImpl(int slide=-1);
+
+ public:
+ //! Constructor that does not create a internal querier
+ TeSTElement(const string& objId= "");
+
+ //! Constructor that creates a internal querier
+ TeSTElement(TeTheme* theme, const string& objId);
+
+ //! Copy constructor
+ TeSTElement(const TeSTElement& other);
+
+ //! Destructor
+ ~TeSTElement();
+
+ //! Copy operator
+ TeSTElement& operator= (const TeSTElement& other);
+
+ //! Returns the object identification
+ string objectId ()
+ { return object_id_; }
+
+ //! Sets the object identification
+ void objectId (const string& id)
+ { object_id_ = id; }
+
+ //! Returns the validity interval
+ TeTimeInterval timeInterval ()
+ { return time_; }
+
+ //! Sets the validity interval
+ void timeInterval (const TeTimeInterval& t)
+ { time_ = t; }
+
+ //! Returns the querier
+ TeQuerier* querier()
+ { return querier_; }
+
+ //! Inserts a new instance
+ bool insertSTInstance (TeSTInstance& object);
+
+ //! Sets the Querier
+ void querier(TeQuerier* qu);
+
+ //! Loads the instances of this spatial element
+ bool build(bool loadGeometries=false, bool loadAllAttributes=true, vector<string> attrNames=vector<string>(), int slide=-1);
+
+ //! Loads the instances of this spatial element
+ bool build(TeGroupingAttr& groupAttr, bool loadGeometries=false, int slide=-1);
+
+ //! Returns the number of instances
+ int numSTInstance() { return instances_.size(); }
+
+ //---------------------
+ //! An iterator to a set of instances
+ /*!
+ An strucuture that allows the traversal STElement
+ in a similar way as the STL iterators.
+ */
+ class iterator
+ {
+ public:
+
+ iterator(STElementIterator it) : elemIt_(it)
+ {}
+
+ //! Prefix move forward operator
+ iterator& operator++()
+ { ++elemIt_; return (*this); }
+
+ TeSTInstance& operator*()
+ { return (*elemIt_); }
+
+ bool operator==(const iterator& rhs) const
+ { return (this->elemIt_ == rhs.elemIt_ && this->elemIt_== rhs.elemIt_); }
+
+ bool operator!=(const iterator& rhs) const
+ { return (this->elemIt_ != rhs.elemIt_ && this->elemIt_!= rhs.elemIt_); }
+
+ protected:
+ STElementIterator elemIt_;
+ };
+ //---------------
+
+ //! Returns an iterator to the first instance of the element
+ iterator begin();
+
+ //! Returns an iterator to the last instance of the element
+ iterator end();
+};
+
+
+#endif
+
diff --git a/src/terralib/kernel/TeSTElementSet.cpp b/src/terralib/kernel/TeSTElementSet.cpp
new file mode 100644
index 0000000..66b95c5
--- /dev/null
+++ b/src/terralib/kernel/TeSTElementSet.cpp
@@ -0,0 +1,606 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeSTElementSet.h"
+#include "TeQuerier.h"
+#include "TeQuerierParams.h"
+
+
+TeSTElementSet::TeSTElementSet (const TeSTElementSet& other)
+{
+ totalTime_ = other.totalTime_;
+ elements_ = other.elements_;
+ if(other.querier_)
+ querier_ = new TeQuerier(other.querier_->params());
+ else
+ querier_ = 0;
+}
+
+TeSTElementSet::TeSTElementSet(TeTheme* theme)
+{
+ TeQuerierParams par;
+ par.setParams(theme);
+ querier_ = new TeQuerier(par);
+}
+
+TeSTElementSet::TeSTElementSet(TeLayer* layer)
+{
+ TeQuerierParams par;
+ par.setParams (layer);
+ querier_ = new TeQuerier(par);
+}
+
+TeSTElementSet::TeSTElementSet(TeQuerier* querier)
+{
+ querier_ = querier;
+}
+
+
+TeSTElementSet&
+TeSTElementSet::operator= (const TeSTElementSet& other)
+{
+ if ( this != &other )
+ {
+ totalTime_ = other.totalTime_;
+ elements_ = other.elements_;
+ if(other.querier_)
+ querier_ = new TeQuerier(other.querier_->params());
+ else
+ querier_ = 0;
+ }
+ return *this;
+}
+
+TeSTElementSet::~TeSTElementSet()
+{
+ if(querier_)
+ delete (querier_);
+}
+
+TeTheme*
+TeSTElementSet::theme()
+{
+ if(querier_)
+ return (querier_->theme());
+
+ return 0;
+}
+
+bool
+TeSTElementSet::insertSTInstance (TeSTInstance& object)
+{
+ if (elements_.find (object.objectId()) == elements_.end())
+ {
+ //ainda n�o existe
+ TeSTElement stElem(object.objectId());
+ stElem.insertSTInstance (object);
+ elements_[object.objectId()] = stElem;
+ }
+ else
+ elements_[object.objectId()].insertSTInstance(object);
+
+ return true;
+}
+
+
+bool
+TeSTElementSet::setGeometry(const string& object_id, const TePolygonSet& geomSet, TeTimeInterval time)
+{
+ STElementSetIterator itSet = elements_.find (object_id);
+ if (itSet == elements_.end())
+ return false;
+
+ STElemIterator itGeom = (*itSet).second.begin();
+ while (itGeom != (*itSet).second.end())
+ {
+ if ((!time.isValid()) || ((*itGeom).timeInterval() == time))
+ (*itGeom).setGeometry (geomSet);
+ ++itGeom;
+ }
+ return true;
+}
+
+bool
+TeSTElementSet::setGeometry(const string& object_id, const TeLineSet& geomSet, TeTimeInterval time)
+{
+ STElementSetIterator itSet = elements_.find (object_id);
+ if (itSet == elements_.end())
+ return false;
+
+ STElemIterator itGeom = (*itSet).second.begin();
+ while (itGeom != (*itSet).second.end())
+ {
+ if ((!time.isValid()) || ((*itGeom).timeInterval() == time))
+ (*itGeom).setGeometry (geomSet);
+ ++itGeom;
+ }
+ return true;
+}
+
+bool
+TeSTElementSet::setGeometry(const string& object_id, const TePointSet& geomSet, TeTimeInterval time)
+{
+ STElementSetIterator itSet = elements_.find (object_id);
+ if (itSet == elements_.end())
+ return false;
+
+ STElemIterator itGeom = (*itSet).second.begin();
+ while (itGeom != (*itSet).second.end())
+ {
+ if ((!time.isValid()) || ((*itGeom).timeInterval() == time))
+ (*itGeom).setGeometry (geomSet);
+ ++itGeom;
+ }
+ return true;
+}
+
+bool
+TeSTElementSet::setGeometry(const string& object_id, const TeCellSet& geomSet, TeTimeInterval time)
+{
+ STElementSetIterator itSet = elements_.find (object_id);
+ if (itSet == elements_.end())
+ return false;
+
+ STElemIterator itGeom = (*itSet).second.begin();
+ while (itGeom != (*itSet).second.end())
+ {
+ if ((!time.isValid()) || ((*itGeom).timeInterval() == time))
+ (*itGeom).setGeometry (geomSet);
+ ++itGeom;
+ }
+ return true;
+}
+
+bool
+TeSTElementSet::setGeometry(const string& object_id, vector<TeGeometry*>& geomSet, TeTimeInterval time)
+{
+ STElementSetIterator itSet = elements_.find (object_id);
+ if (itSet == elements_.end())
+ return false;
+
+ STElemIterator itGeom = (*itSet).second.begin();
+ while (itGeom != (*itSet).second.end())
+ {
+ if ((!time.isValid()) || ((*itGeom).timeInterval() == time))
+ (*itGeom).setGeometry (geomSet);
+ ++itGeom;
+ }
+ return true;
+}
+
+bool
+TeSTElementSet::setGeometry(const string& object_id, const TeMultiGeometry& geomSet, TeTimeInterval time)
+{
+ STElementSetIterator itSet = elements_.find (object_id);
+ if (itSet == elements_.end())
+ return false;
+
+ STElemIterator itGeom = (*itSet).second.begin();
+ while (itGeom != (*itSet).second.end())
+ {
+ if ((!time.isValid()) || ((*itGeom).timeInterval() == time))
+ (*itGeom).setGeometry (geomSet);
+ ++itGeom;
+ }
+ return true;
+}
+
+bool
+TeSTElementSet::getGeometry(const string& object_id, TePolygonSet& geomSet, TeTimeInterval time)
+{
+ // Verify if object is in the map
+ STElementSetIterator geomSetIt = elements_.find (object_id);
+ if (geomSetIt == elements_.end())
+ return false;
+
+ STElemIterator geomIt = (*geomSetIt).second.begin();
+ while (geomIt != (*geomSetIt).second.end())
+ {
+ if ((!time.isValid()) || ((*geomIt).timeInterval() == time))
+ return ((*geomIt).getGeometry (geomSet));
+
+ ++geomIt;
+ }
+ return false;
+}
+
+
+bool
+TeSTElementSet::getGeometry(const string& object_id, TeLineSet& geomSet, TeTimeInterval time)
+{
+ // Verify if object is in the map
+ STElementSetIterator geomSetIt = elements_.find (object_id);
+ if (geomSetIt == elements_.end())
+ return false;
+
+ STElemIterator geomIt = (*geomSetIt).second.begin();
+ while (geomIt != (*geomSetIt).second.end())
+ {
+ if ((!time.isValid()) || ((*geomIt).timeInterval() == time))
+ return ((*geomIt).getGeometry (geomSet));
+
+ ++geomIt;
+ }
+ return false;
+}
+
+
+bool
+TeSTElementSet::getGeometry(const string& object_id, TePointSet& geomSet, TeTimeInterval time)
+{
+ // Verify if object is in the map
+ STElementSetIterator geomSetIt = elements_.find (object_id);
+ if (geomSetIt == elements_.end())
+ return false;
+
+ STElemIterator geomIt = (*geomSetIt).second.begin();
+ while (geomIt != (*geomSetIt).second.end())
+ {
+ if ((!time.isValid()) || ((*geomIt).timeInterval() == time))
+ return ((*geomIt).getGeometry (geomSet));
+
+ ++geomIt;
+ }
+ return false;
+}
+
+
+bool
+TeSTElementSet::getGeometry(const string& object_id, TeCellSet& geomSet, TeTimeInterval time)
+{
+ // Verify if object is in the map
+ STElementSetIterator geomSetIt = elements_.find (object_id);
+ if (geomSetIt == elements_.end())
+ return false;
+
+ STElemIterator geomIt = (*geomSetIt).second.begin();
+ while (geomIt != (*geomSetIt).second.end())
+ {
+ if ((!time.isValid()) || ((*geomIt).timeInterval() == time))
+ return ((*geomIt).getGeometry (geomSet));
+
+ ++geomIt;
+ }
+ return false;
+}
+
+
+bool
+TeSTElementSet::getGeometry(const string& object_id, vector<TeGeometry*>& geomSet, TeTimeInterval time)
+{
+ // Verify if object is in the map
+ STElementSetIterator geomSetIt = elements_.find (object_id);
+ if (geomSetIt == elements_.end())
+ return false;
+
+ STElemIterator geomIt = (*geomSetIt).second.begin();
+ while (geomIt != (*geomSetIt).second.end())
+ {
+ if ((!time.isValid()) || ((*geomIt).timeInterval() == time))
+ return ((*geomIt).getGeometry (geomSet));
+
+ ++geomIt;
+ }
+ return false;
+}
+
+
+bool
+TeSTElementSet::getGeometry(const string& object_id, TeMultiGeometry& geomSet, TeTimeInterval time)
+{
+ // Verify if object is in the map
+ STElementSetIterator geomSetIt = elements_.find (object_id);
+ if (geomSetIt == elements_.end())
+ return false;
+
+ STElemIterator geomIt = (*geomSetIt).second.begin();
+ while (geomIt != (*geomSetIt).second.end())
+ {
+ if ((!time.isValid()) || ((*geomIt).timeInterval() == time))
+ return ((*geomIt).getGeometry (geomSet));
+
+ ++geomIt;
+ }
+ return false;
+}
+
+bool
+TeSTElementSet::getAttributeValue (const string& object_id, const string& attr_name, string& val, TeTimeInterval time)
+{
+ STElementSetIterator geomSetIt = elements_.find (object_id);
+ if (geomSetIt == elements_.end())
+ return false;
+
+ STElemIterator stoIt = (*geomSetIt).second.begin();
+ while (stoIt != (*geomSetIt).second.end())
+ {
+ if ((!time.isValid()) || ((*stoIt).timeInterval() == time))
+ return ((*stoIt).getPropertyValue (attr_name, val));
+ ++stoIt;
+ }
+ return false;
+}
+
+bool
+TeSTElementSet::getAttributeValue (const string& object_id, int attr_index, string& val, TeTimeInterval time)
+{
+ STElementSetIterator geomSetIt = elements_.find (object_id);
+ if (geomSetIt == elements_.end())
+ return false;
+
+ STElemIterator stoIt = (*geomSetIt).second.begin();
+ while (stoIt != (*geomSetIt).second.end())
+ {
+ if ((!time.isValid()) || ((*stoIt).timeInterval() == time))
+ return ((*stoIt).getPropertyValue (val, attr_index));
+ ++stoIt;
+ }
+ return false;
+}
+
+bool
+TeSTElementSet::getAttributeValue (const string& object_id, int attr_index, double& val, TeTimeInterval time)
+{
+ string vals;
+ if(!getAttributeValue (object_id, attr_index, vals, time))
+ return false;
+
+ val = atof(vals.c_str());
+ return true;
+}
+
+int
+TeSTElementSet::getAttributeIndex (const string& attrName)
+{
+ STElementSetIterator geomSetIt = elements_.begin();
+ if (geomSetIt == elements_.end())
+ return -1;
+
+ STElemIterator stoIt = (*geomSetIt).second.begin();
+ if (stoIt == (*geomSetIt).second.end())
+ return -1;
+
+ TePropertyVector vec = (*stoIt).getPropertyVector();
+ for (unsigned int i=0; i<vec.size(); ++i)
+ {
+ if(TeConvertToUpperCase(attrName)==TeConvertToUpperCase(vec[i].attr_.rep_.name_))
+ return i;
+ }
+ return -1;
+}
+
+bool
+TeSTElementSet::getPropertyVector (const string& object_id, TePropertyVector& propVec, TeTimeInterval time)
+{
+ STElementSetIterator geomSetIt = elements_.find (object_id);
+ if (geomSetIt == elements_.end())
+ return false;
+
+ STElemIterator stoIt = (*geomSetIt).second.begin();
+ while (stoIt != (*geomSetIt).second.end())
+ {
+ if ((!time.isValid()) || ((*stoIt).timeInterval() == time))
+ {
+ propVec = (*stoIt).getPropertyVector();
+ return true;
+ }
+ ++stoIt;
+ }
+ return false;
+
+}
+
+bool
+TeSTElementSet::addProperty (const string& object_id, TeProperty& prop)
+{
+ STElementSetIterator geomSetIt = elements_.find (object_id);
+ if (geomSetIt == elements_.end())
+ return false;
+
+ STElemIterator stoIt = (*geomSetIt).second.begin();
+ if (!(*stoIt).setPropertyValue(prop.attr_.rep_.name_, prop.value_))
+ (*stoIt).addProperty(prop);
+
+ return true;
+}
+
+
+bool
+TeSTElementSet::existMultiTemporalElem(const string& objId)
+{
+ STElementSetIterator geomSetIt = elements_.find (objId);
+ if (geomSetIt != elements_.end())
+ return ((elements_[objId].numSTInstance())>1);
+
+ return false;
+}
+
+
+int
+TeSTElementSet::numSTInstance(const string& objectId)
+{
+ if (!objectId.empty())
+ {
+ STElementSetIterator geomSetIt = elements_.find (objectId);
+ if (geomSetIt != elements_.end())
+ return (elements_[objectId].numSTInstance());
+ return 0;
+ }
+ else
+ {
+ int ntot = 0;
+ STElementSetIterator geomSetIt = elements_.begin();
+ while (geomSetIt != elements_.end())
+ {
+ ntot += geomSetIt->second.numSTInstance();
+ ++geomSetIt;
+ }
+ return ntot;
+ }
+}
+
+
+bool
+TeSTElementSet::build(bool loadGeometries, bool loadAllAttributes, vector<string> attrNames, int slide)
+{
+ if(!querier_)
+ return false;
+
+ TeQuerierParams param = querier_->params();
+ param.setFillParams(loadGeometries, loadAllAttributes, attrNames);
+
+ querier_->refresh(param);
+
+ return(buildImpl(slide));
+}
+
+bool
+TeSTElementSet::build(TeGroupingAttr& groupAttr, bool loadGeometries, int slide)
+{
+ if(!querier_)
+ return false;
+
+ TeQuerierParams param = querier_->params();
+ param.setFillParams(loadGeometries, groupAttr);
+
+ querier_->refresh(param);
+
+ return(buildImpl(slide));
+}
+
+bool
+TeSTElementSet::buildImpl(int slide)
+{
+ int dt = CLOCKS_PER_SEC/4, steps = 0;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+
+ if(!querier_)
+ return false;
+
+ if(!querier_->loadInstances(slide))
+ return false;
+
+ int tot = querier_->numElemInstances();
+ if(TeProgress::instance())
+ {
+ string caption = "Building data";
+ TeProgress::instance()->setCaption(caption.c_str());
+ string msg = "Building in progress. Please, wait!";
+ TeProgress::instance()->setMessage(msg);
+ TeProgress::instance()->setTotalSteps(tot);
+ t2 = clock();
+ t0 = t1 = t2;
+ }
+
+ TeSTInstance obj;
+ while(querier_->fetchInstance(obj))
+ {
+ this->insertSTInstance(obj);
+ obj.clear();
+ if(TeProgress::instance())
+ {
+ steps++;
+ t2 = clock();
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ if(TeProgress::instance()->wasCancelled())
+ return false;
+
+ if((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(steps);
+ }
+ }
+ }
+ if(TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ querier_->clear(); //clear instances
+ return true;
+}
+
+
+TeSTElementSet::iterator&
+TeSTElementSet::iterator::operator++()
+{
+ if (++curSTO_ == (*curObj_).second.end())
+ {
+ if (++curObj_ != stoSet_->elements().end())
+ {
+ curSTO_ = (*curObj_).second.begin();
+ }
+ }
+ return *this;
+}
+
+double
+TeSTElementSet::propertyIterator::operator*()
+{
+ string val;
+ STElemIterator itCur = getCurSTO();
+ if ((*itCur).getPropertyValue (attrName_, val))
+ return (atof(val.c_str()));
+ else
+ return 0.0;
+}
+
+bool
+TeSTElementSet::propertyIterator::getProperty(TeProperty& prop)
+{
+ STElemIterator itCur = getCurSTO();
+ if ((*itCur).getProperty (prop, attrName_))
+ return true;
+ else
+ return false;
+}
+
+TeSTElementSet::iterator
+TeSTElementSet::begin()
+{
+ return iterator(this, elements_.begin(), (*(elements_.begin())).second.begin());
+}
+
+TeSTElementSet::propertyIterator
+TeSTElementSet::begin(const string& attrName)
+{
+ return propertyIterator(this, elements_.begin(), (*(elements_.begin())).second.begin(),attrName);
+}
+
+TeSTElementSet::iterator
+TeSTElementSet::end()
+{
+ if(elements_.size()<1)
+ return iterator(this, elements_.end(), (*(elements_.end())).second.end());
+
+ return iterator(this, elements_.end(), (*(--elements_.end())).second.end());
+}
+
+TeSTElementSet::propertyIterator
+TeSTElementSet::end(const string& attrName)
+{
+ if(elements_.size()<1)
+ return propertyIterator(this, elements_.end(), (*(elements_.end())).second.end(), attrName);
+
+ return propertyIterator(this, elements_.end(), (*(--elements_.end())).second.end(), attrName);
+}
diff --git a/src/terralib/kernel/TeSTElementSet.h b/src/terralib/kernel/TeSTElementSet.h
new file mode 100644
index 0000000..795377d
--- /dev/null
+++ b/src/terralib/kernel/TeSTElementSet.h
@@ -0,0 +1,254 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_STOBJECTSET_H
+#define __TERRALIB_INTERNAL_STOBJECTSET_H
+
+#include "TeSTElement.h"
+
+class TeQuerier;
+
+//! A TeSTElementSet is a set of spatial temporal elements
+/*
+ A spatial temporal set of elements or objects is obtained from a theme.
+*/
+class TeSTElementSet
+{
+
+protected:
+
+ //! valid time interval of all ST elements in the set
+ TeTimeInterval totalTime_;
+
+ //! querier used to fill this structure
+ TeQuerier* querier_;
+
+ //! map of object identification to its instances in time
+ map<string, TeSTElement > elements_;
+
+ typedef map<string, TeSTElement >::iterator STElementSetIterator;
+ typedef TeSTElement::iterator STElemIterator;
+
+ //! Internal function to build the STElement set
+ bool buildImpl(int slide=-1);
+
+public:
+
+
+ //! Default constructor
+ TeSTElementSet()
+ { querier_ = 0; }
+
+ //! Constructor
+ TeSTElementSet(TeTheme* theme);
+
+ //! Constructor
+ TeSTElementSet(TeLayer* layer);
+
+ //! Constructor
+ TeSTElementSet(TeQuerier* querier);
+
+ //! Copy constructor
+ TeSTElementSet (const TeSTElementSet& other);
+
+ //! Destructor
+ ~TeSTElementSet();
+
+ //! Assignment operator
+ TeSTElementSet& operator= (const TeSTElementSet& other);
+
+ //! Operator ==
+ bool operator== (const TeSTElementSet& other) const
+ { return ((totalTime_==other.totalTime_)); }
+
+ //! Returns the time inteval associated with the STOSet
+ TeTimeInterval totalTime() { return totalTime_;}
+
+ //! Sets the time inteval associated with the STOSet
+ void totalTime(TeTimeInterval t) { totalTime_ = t;}
+
+ //! Returns the querier
+ TeQuerier* querier() { return querier_; }
+
+ // Returns the theme
+ TeTheme* theme();
+
+ //! Returns a reference to the map of elements
+ map<string, TeSTElement >& elements() { return elements_; }
+
+ //! Return if the element (objId) exists in the STElemSet
+ bool hasElement(const string& objId) { return (elements_.find (objId) != elements_.end()); }
+
+ //! Insert an ST element instance
+ bool insertSTInstance (TeSTInstance& object);
+
+ //! Sets the geometries of a STObjetct
+ bool setGeometry(const string& object_id, const TePolygonSet& geomSet, TeTimeInterval time = TeTimeInterval());
+ bool setGeometry(const string& object_id, const TeLineSet& geomSet, TeTimeInterval time = TeTimeInterval());
+ bool setGeometry(const string& object_id, const TePointSet& geomSet, TeTimeInterval time = TeTimeInterval());
+ bool setGeometry(const string& object_id, const TeCellSet& geomSet, TeTimeInterval time = TeTimeInterval());
+ bool setGeometry(const string& object_id, vector<TeGeometry*>& geomSet, TeTimeInterval time = TeTimeInterval());
+ bool setGeometry(const string& object_id, const TeMultiGeometry& geomSet, TeTimeInterval time = TeTimeInterval());
+
+ //! Gets the geometries of an object with a time stamp
+ bool getGeometry(const string& object_id, TePolygonSet& geomSet, TeTimeInterval time = TeTimeInterval());
+ bool getGeometry(const string& object_id, TeLineSet& geomSet, TeTimeInterval time = TeTimeInterval());
+ bool getGeometry(const string& object_id, TePointSet& geomSet, TeTimeInterval time = TeTimeInterval());
+ bool getGeometry(const string& object_id, TeCellSet& geomSet, TeTimeInterval time = TeTimeInterval());
+ bool getGeometry(const string& object_id, vector<TeGeometry*>& geomSet, TeTimeInterval time = TeTimeInterval());
+ bool getGeometry(const string& object_id, TeMultiGeometry& geomSet, TeTimeInterval time = TeTimeInterval());
+
+
+ //! Gets the value of an attribute (as string) of a object with a time stamp
+ bool getAttributeValue (const string& object_id, const string& attr_name,
+ string& val, TeTimeInterval time = TeTimeInterval());
+
+
+ //! Gets the value of the i-th attribute (as string) of a object with a time stamp
+ bool getAttributeValue (const string& object_id, int attr_index, string& val,
+ TeTimeInterval time = TeTimeInterval());
+
+ //! Gets the value of the i-th attribute (as double) of a object with a time stamp
+ bool getAttributeValue (const string& object_id, int attr_index, double& val,
+ TeTimeInterval time = TeTimeInterval());
+
+ //! Returns the index of an attribute
+ int getAttributeIndex(const string& attrName);
+
+ //! Gets a vector of attributes or properties of a object with a time stamp
+ bool getPropertyVector (const string& object_id, TePropertyVector& propVec,
+ TeTimeInterval time = TeTimeInterval());
+
+ //! Sets the value of the property or adds if there is no such property in the object
+ bool addProperty(const string& object_id, TeProperty& prop);
+
+ //! Returns true if exists in the set, an object with more than one instance
+ bool existMultiTemporalElem(const string& objId);
+
+ //! Adds the instances of a element
+ void insertSTElement(TeSTElement& stElem)
+ { elements_[stElem.objectId()] = stElem; }
+
+ //! Retuns the number of elements in the set
+ int numElements() const { return elements_.size();}
+
+ //! Returns the number of instances of an object
+ int numSTInstance(const string& objectId = "");
+
+ //! Fills the STElement set
+ bool build(bool loadGeometries=false, bool loadAllAttributes=true, vector<string> attrNames=vector<string>(), int slide=-1);
+
+ //! Fills the STElement set
+ bool build(TeGroupingAttr& groupAttr, bool loadGeometries=false, int slide=-1);
+
+ //! Clears the set
+ void clear() { elements_.clear(); }
+
+ //---------------------
+ //! An iterator to a set of spatial temportal elements
+ /*!
+ An strucuture that allows the traversal STElement set
+ (ST elements) in a similar way as the STL iterators.
+ */
+ class iterator
+ {
+ public:
+
+ iterator(TeSTElementSet* stoSet, STElementSetIterator stoSetP, STElemIterator stoVecP) :
+ curObj_(stoSetP),
+ curSTO_(stoVecP),
+ stoSet_(stoSet)
+ {}
+
+ //! Prefix move forward operator
+ iterator& operator++();
+
+ TeSTInstance& operator*()
+ { return (*curSTO_); }
+
+ STElemIterator getCurSTO()
+ { return curSTO_; }
+
+ TeSTElementSet* elemSet()
+ { return stoSet_; }
+
+ bool operator==(const iterator& rhs) const
+ { return (this->curSTO_ == rhs.curSTO_ && this->curObj_== rhs.curObj_); }
+
+ bool operator!=(const iterator& rhs) const
+ { return (this->curSTO_ != rhs.curSTO_ && this->curObj_!= rhs.curObj_); }
+
+ protected:
+ STElementSetIterator curObj_;
+ STElemIterator curSTO_;
+ TeSTElementSet* stoSet_;
+ };
+ //---------------
+
+ //---------------------
+ //! An iterator to a given numeric property in a set of spatial temportal obejcts
+ /*!
+ An strucuture that allows the traversal STO set
+ (ST objects) in a similar way as the STL iterators.
+ */
+ class propertyIterator : public iterator
+ {
+ public:
+
+ propertyIterator (TeSTElementSet* stoSet,
+ STElementSetIterator stoSetP,
+ STElemIterator stoVecP,
+ string attrName):
+ iterator(stoSet, stoSetP, stoVecP),
+ attrName_ (attrName)
+ {}
+
+
+ double operator*(); //if too slow, get property index. The problem is
+ // that nothing garantees it is going to be the same for all objects.
+
+ bool getProperty(TeProperty& prop);
+ // same implemented for raster: to be used when attribute is categorical
+ protected:
+ string attrName_;
+
+ };
+ //---------------
+
+ //! Returns an iterator to the first element of the set
+ iterator begin();
+
+ //! Returns an iterator to the first element of the set
+ propertyIterator begin(const string& attrName);
+
+ //! Returns an iterator to the one past last element of the set
+ iterator end();
+
+ //! Returns an iterator to the one past last element of the set
+ propertyIterator end(const string& attrName);
+
+ //---------------
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeSTEvent.cpp b/src/terralib/kernel/TeSTEvent.cpp
new file mode 100644
index 0000000..6cfddee
--- /dev/null
+++ b/src/terralib/kernel/TeSTEvent.cpp
@@ -0,0 +1,270 @@
+
+#include "TeSTEvent.h"
+#include "TeTheme.h"
+#include "TeTimeInterval.h"
+
+
+TeSTEvent::TeSTEvent(const string& objId, const TePoint& point, const long& time):
+ object_id_(objId),
+ point_(point),
+ time_(time)
+{
+ unique_id_.push_back (objId);
+}
+
+TeSTEvent::TeSTEvent(const string& objId, const TePoint& point, const vector<double>& attrValue,
+ const vector<TeAttributeRep>& attrRep, const long& time):
+ object_id_(objId),
+ point_(point),
+ time_(time),
+ attrValue_(attrValue),
+ attrRep_(attrRep)
+{
+ unique_id_.push_back (objId);
+}
+
+TeSTEvent::TeSTEvent(const TeSTEvent& other)
+{
+ unique_id_ = other.unique_id_;
+ object_id_ = other.object_id_;
+ time_ = other.time_;
+ point_ = other.point_;
+ attrValue_ = other.attrValue_;
+ attrRep_ = other.attrRep_;
+ theme_ = other.theme_;
+ attrOut_ = other.attrOut_;
+}
+
+TeSTEvent&
+TeSTEvent::operator= (const TeSTEvent& other)
+{
+ if ( this != &other )
+ {
+ unique_id_ = other.unique_id_;
+ object_id_ = other.object_id_;
+ time_ = other.time_;
+ point_ = other.point_;
+ attrValue_ = other.attrValue_;
+ attrRep_ = other.attrRep_;
+ theme_ = other.theme_;
+ attrOut_ = other.attrOut_;
+ }
+ return *this;
+}
+
+
+bool
+TeSTEvent::operator== (const TeSTEvent& other) const
+{
+ if (this->object_id_ != other.object_id_ ||
+ !(this->time_ == other.time_) ||
+ (this->point_.location().x() != other.point_.location().x()) ||
+ (this->point_.location().y() != other.point_.location().y()))
+ return false;
+
+ return true;
+}
+
+
+TeTheme*
+TeSTEvent::theme()
+{
+ return theme_;
+}
+
+void
+TeSTEvent::theme(TeTheme* t)
+{
+ theme_ = t;
+}
+
+TeTimeInterval
+TeSTEvent::timeInterval()
+{
+ TeTimeInterval t;
+ return t;
+}
+
+int
+TeSTEvent::getPropertyIndex(const string& name)
+{
+ vector<TeAttributeRep>::iterator itRep = attrRep_.begin();
+ int index=-1;
+ while (itRep!=attrRep_.end())
+ {
+ ++index;
+ if(itRep->name_==name)
+ return index;
+ }
+ return index;
+}
+
+
+void
+TeSTEvent::setPropertyValue(const int& indexAttr, const double& value)
+{
+ if(attrValue_.empty())
+ return;
+
+ if(indexAttr >(int)(attrValue_.size()-1))
+ return;
+
+ attrValue_[indexAttr] = value;
+}
+
+void
+TeSTEvent::addProperty(const TeProperty& prop, bool attrIn)
+{
+ attrValue_.push_back(atof(prop.value_.c_str()));
+ attrRep_.push_back(prop.attr_.rep_);
+ if(!attrIn)
+ attrOut_.push_back((attrValue_.size()-1));
+}
+
+void
+TeSTEvent::addProperty(const double& val, TeAttributeRep rep, bool attrIn)
+{
+ attrValue_.push_back(val);
+ attrRep_.push_back(rep);
+ if(!attrIn)
+ attrOut_.push_back((attrValue_.size()-1));
+}
+
+TePropertyVector
+TeSTEvent::getOutPropertyVector()
+{
+ TePropertyVector vec;
+ for(unsigned int i=0; i<attrOut_.size(); ++i)
+ {
+ TeProperty prop;
+ prop.attr_.rep_ = attrRep_[attrOut_[i]];
+ prop.value_ = Te2String(attrValue_[attrOut_[i]]);
+ vec.push_back (prop);
+ }
+ return vec;
+}
+
+TePropertyVector
+TeSTEvent::getPropertyVector()
+{
+ TePropertyVector vec;
+ for(unsigned int i=0; i<attrValue_.size(); ++i)
+ {
+ TeProperty prop;
+ prop.attr_.rep_ = attrRep_[i];
+ prop.value_ = Te2String(attrValue_[i]);
+ vec.push_back (prop);
+ }
+ return vec;
+}
+
+bool
+TeSTEvent::getPropertyValue (string& val, int i)
+{
+ if ((i>=0) && (i<(int)attrValue_.size()))
+ {
+ val = Te2String(attrValue_[i]);
+ return true;
+ }
+ else
+ return false;
+}
+
+//------------------------------------------ TeSTEventSet
+
+TeTheme*
+TeSTEventSet::theme()
+{
+ return theme_;
+}
+
+void
+TeSTEventSet::theme(TeTheme* t)
+{
+ theme_ = t;
+}
+
+unsigned int
+TeSTEventSet::size()
+{
+ return eventSet_.size();
+}
+
+bool
+TeSTEventSet::getAttributeValue (const string& object_id, const string& attr_name, string& val, TeTimeInterval /* time */)
+{
+ int index = getAttributeIndex(attr_name);
+ if(index<0)
+ return false;
+
+ double vald = 0.;
+ bool status = getAttributeValue (object_id, index, vald);
+ val = Te2String(vald);
+ return status;
+}
+
+bool
+TeSTEventSet::getAttributeValue (const string& object_id, int attr_index, string& val, TeTimeInterval /* time */)
+{
+ double vald = 0.;
+ bool status = getAttributeValue (object_id, attr_index, vald);
+ val = Te2String(vald);
+ return status;
+}
+
+
+bool
+TeSTEventSet::getAttributeValue (const string& object_id, int attr_index, double& val, long /* time */)
+{
+
+ STElemIterator it = eventSet_.find(object_id);
+ if(it==eventSet_.end())
+ return false;
+
+ val = (it->second).getPropertyValue(attr_index);
+ return true;
+}
+
+int
+TeSTEventSet::getAttributeIndex(const string& attrName)
+{
+ STElemIterator it = eventSet_.begin();
+ return(it->second.getPropertyIndex(attrName));
+}
+
+TeSTEventSet::iterator&
+TeSTEventSet::iterator::operator++()
+{
+ if(curElem_!=elemSet_->eventSet_.end())
+ ++curElem_;
+ return (*this);
+}
+
+
+TeSTEventSet::iterator
+TeSTEventSet::begin()
+{
+ return iterator(this, eventSet_.begin());
+}
+
+
+TeSTEventSet::iterator
+TeSTEventSet::end()
+{
+ return iterator(this, eventSet_.end());
+}
+
+
+void
+TeSTEventSet::insertSTInstance(TeSTEvent& ev)
+{
+ string obj = ev.objectId();
+ eventSet_[obj] = ev;
+}
+
+
+
+
+
+
+
diff --git a/src/terralib/kernel/TeSTEvent.h b/src/terralib/kernel/TeSTEvent.h
new file mode 100644
index 0000000..e3a93d2
--- /dev/null
+++ b/src/terralib/kernel/TeSTEvent.h
@@ -0,0 +1,298 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeSTEvent.h
+ This file contains structures and definitions to deal with spatial temporal events.
+ An spatial temporal event is represented by a point, a time and a set of attributes.
+*/
+
+#ifndef __TERRALIB_INTERNAL_STEVENT_H
+#define __TERRALIB_INTERNAL_STEVENT_H
+
+#include "TeGeometry.h"
+#include "TeAttribute.h"
+#include "TeTimeInterval.h"
+
+class TeTheme;
+
+//! A class to represent spatial temporal events
+class TeSTEvent
+{
+protected:
+ vector<string> unique_id_; // instance identification for each attribute table
+ string object_id_; // event identification
+ TePoint point_; // point where the event happened
+ long time_; // time when the event happened
+
+ vector<double> attrValue_; // attribute values
+ vector<TeAttributeRep> attrRep_; // attribute representations (name, type, size)
+ vector<int> attrOut_; // indexes of the attributes that were generated
+
+ TeTheme* theme_; // theme associated to this event
+
+public:
+
+ //! Empty constructor
+ TeSTEvent()
+ { }
+
+ //! Constructor
+ TeSTEvent(const string& objId, const TePoint& point, const long& time);
+
+ //! Constructor
+ TeSTEvent(const string& objId, const TePoint& point, const vector<double>& attrValue,
+ const vector<TeAttributeRep>& attrRep, const long& time);
+
+ //! Copy constructor
+ TeSTEvent(const TeSTEvent& other);
+
+ //! Assignment operator
+ TeSTEvent& operator= (const TeSTEvent& other);
+
+ //! Operator ==
+ bool operator== (const TeSTEvent& other) const;
+
+ //! Destructor
+ ~TeSTEvent() {}
+
+ //! Returns the event identification
+ string objectId (void)
+ { return object_id_; }
+
+ //! Sets the event identification
+ void objectId (const string& objId)
+ { object_id_ = objId; }
+
+ //! Returns the instance identification
+ vector<string>& uniqueId ()
+ { return unique_id_; }
+
+ //! Returns the instance identification
+ string uniqueId (int index_)
+ { return unique_id_[index_]; }
+
+ //! Sets the instance identifications
+ void uniqueId (const vector<string>& ids)
+ { unique_id_ = ids; }
+
+ //! Get point geometry
+ void getGeometry(TePoint& result)
+ { result = point_; }
+
+ //! Set point geometry
+ void setGeometry(const TePoint& result)
+ { point_ = result; }
+
+ //! Get time
+ long eventTime()
+ { return time_; }
+
+ //! Set time
+ void eventTime(const long& t)
+ { time_ = t; }
+
+ //! Get the time as a structure TeTimeInterval
+ TeTimeInterval timeInterval();
+
+ //! Get theme pointer
+ TeTheme* theme();
+
+ //! Set theme pointer
+ void theme(TeTheme* t);
+
+ //! Get attribute values
+ vector<double>& attrValues()
+ { return attrValue_; }
+
+ //! Set attribute values
+ void attrValues (const vector<double>& attrVal)
+ { attrValue_ = attrVal; }
+
+ //! Get attribute representations (name, type, size)
+ vector<TeAttributeRep>& getAttributeRep()
+ { return attrRep_; }
+
+ //! Get the attribute representation of the index-th attribute
+ TeAttributeRep getAttributeRep(const int& index)
+ { return attrRep_[index]; }
+
+ //! Set attribute representations (name, type, size)
+ void setAttributeRep (const vector<TeAttributeRep>& attrRep)
+ { attrRep_ = attrRep; }
+
+ //! Get attribute indexes that were generated
+ vector<int>& attrOutIndexes()
+ { return attrOut_; }
+
+ //! Set attribute indexes that were generated
+ void attrOutIndexes (const vector<int>& indexes)
+ { attrOut_ = indexes; }
+
+ //! Get the attribute or property value of the index-th attribute
+ double getPropertyValue(const int& index)
+ { return attrValue_[index]; }
+
+ //! Gets the attribute value (as a string) of the i-th property
+ bool getPropertyValue (string& val, int i= 0);
+
+ //! Set the attribute value of the indexAttr-th attribute
+ void setPropertyValue(const int& indexAttr, const double& value);
+
+ //! Get the attribute name of the index-th attribute
+ string getPropertyName(const int& index)
+ { return attrRep_[index].name_; }
+
+ //! Get the property index of attribute called "name"
+ int getPropertyIndex(const string& name);
+
+ //! Operator [], get attribute value
+ double operator[] (const int& index)
+ { return attrValue_[index]; }
+
+ //! Add a property that contain the attribute representation and the attribute value
+ void addProperty(const TeProperty& prop, bool attrIn = true);
+
+ //! Add a property from a attribute representation and a attribute value
+ void addProperty(const double& val, TeAttributeRep rep = TeAttributeRep(), bool attrIn = true);
+
+ //! Return the attributes (representation and value) that were generated as a vector of properties
+ TePropertyVector getOutPropertyVector();
+
+ //! Return all attributes (representation and value) as a vector of properties
+ TePropertyVector getPropertyVector();
+};
+
+//! A class that represents a set of spatial temporal events
+class TeSTEventSet
+{
+protected:
+ map<string, TeSTEvent> eventSet_; // a map from event identification to event
+ TeChronon chronon_; // chronon
+ TeTheme* theme_; // theme associated to this event set
+ TeBox box_;
+
+ typedef map<string, TeSTEvent>::iterator STElemIterator;
+
+public:
+
+ //! Constructor
+ TeSTEventSet(TeTheme* theme=0):
+ theme_(theme)
+ { }
+
+ //! Get theme pointer
+ TeTheme* theme();
+
+ //! Set theme pointer
+ void theme(TeTheme* t);
+
+ //! Return the number of events
+ unsigned int size();
+
+ //! Set the chronon
+ void chronon(const TeChronon& chr) { chronon_ = chr; }
+
+ //! Set the box
+ void box(const TeBox& b) { box_ = b; }
+
+ //! Gets the value of an attribute (as string) called "attr_name"
+ bool getAttributeValue (const string& object_id, const string& attr_name,
+ string& val, TeTimeInterval time = TeTimeInterval());
+
+ //! Gets the value of the attr_index-th attribute (as string)
+ bool getAttributeValue (const string& object_id, int attr_index, string& val,
+ TeTimeInterval time = TeTimeInterval());
+
+ //! Gets the value of the attr_index-th attribute (as double)
+ bool getAttributeValue (const string& object_id, int attr_index, double& val, long time = -1);
+
+ //! Get the attribute index of attribute called "attrName"
+ int getAttributeIndex(const string& attrName);
+
+ //! Retuns the number of spatial temporal instances in the set
+ int numSTInstance()
+ { return eventSet_.size(); }
+
+ //! Retuns the number of elements in the set
+ int numElements()
+ { return eventSet_.size(); }
+
+ //! An iterator to a set of spatial temportal events
+ /*!
+ An strucuture that allows the traversal STEvent set
+ (ST elements) in a similar way as the STL iterators.
+ */
+ class iterator
+ {
+ public:
+
+ //! Constructor
+ iterator(TeSTEventSet* elemSet, STElemIterator curElem) :
+ curElem_(curElem),
+ elemSet_(elemSet)
+ { }
+
+ //! Prefix move forward operator
+ iterator& operator++();
+
+ //! Operator that return the pointed event
+ TeSTEvent& operator*()
+ { return (curElem_->second); }
+
+ //! Return a pointer to the event set
+ TeSTEventSet* elemSet()
+ { return elemSet_; }
+
+ //! Equal operator
+ bool operator==(const iterator& rhs) const
+ { return (this->curElem_== rhs.curElem_); }
+
+ //! Unequal operator
+ bool operator!=(const iterator& rhs) const
+ { return (this->curElem_!= rhs.curElem_); }
+
+ protected:
+ STElemIterator curElem_;
+ TeSTEventSet* elemSet_;
+ };
+
+ friend class TeSTEventSet::iterator;
+
+ //! Returns an iterator to the first element of the set
+ iterator begin();
+
+ //! Returns an iterator to the one past last element of the set
+ iterator end();
+
+ //! Insert a new event in the set
+ void insertSTInstance(TeSTEvent& ev);
+};
+
+#endif
+
+
+
+
+
+
+
diff --git a/src/terralib/kernel/TeSTInstance.cpp b/src/terralib/kernel/TeSTInstance.cpp
new file mode 100644
index 0000000..ec7eb9b
--- /dev/null
+++ b/src/terralib/kernel/TeSTInstance.cpp
@@ -0,0 +1,490 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "TeSTInstance.h"
+
+TeSTInstance::TeSTInstance (const string& object_id, TeProperty& prop )
+{
+ object_id_ = object_id;
+ time_ = TeTimeInterval();
+ properties_.push_back(prop);
+ slice_ = 0;
+ theme_= 0;
+}
+
+
+TeSTInstance::TeSTInstance(const TeSTInstance& other)
+{
+ object_id_ = other.object_id_;
+ time_ = other.time_;
+ properties_ = other.properties_;
+ slice_ = other.slice_;
+ theme_ = other.theme_;
+ unique_id_ = other.unique_id_;
+ geometries_ = other.geometries_;
+}
+
+TeSTInstance&
+TeSTInstance::operator= (const TeSTInstance& other)
+{
+ if ( this != &other )
+ {
+ object_id_ = other.object_id_;
+ time_ = other.time_;
+ properties_ = other.properties_;
+ slice_ = other.slice_;
+ theme_ = other.theme_;
+ unique_id_ = other.unique_id_;
+ geometries_ = other.geometries_;
+ }
+ return *this;
+}
+
+
+bool
+TeSTInstance::operator== (const TeSTInstance& other) const
+{
+ if (this->object_id_ != other.object_id_ ||
+ !(this->time_ == other.time_) )
+ return false;
+
+ return true;
+}
+
+
+bool
+TeSTInstance::getProperty (TeProperty& prop, unsigned int i)
+{
+ if (i < properties_.size())
+ {
+ prop = properties_[i];
+ return true;
+ }
+ else
+ return false;
+}
+
+bool
+TeSTInstance::getProperty (TeProperty& prop, string name)
+{
+ string newName;
+ size_t pos = name.find(".", string::npos,1);
+ if (pos != string::npos)
+ newName = name.substr(pos+1);
+
+ TePropertyVector::iterator it = properties_.begin();
+ while(it!=properties_.end())
+ {
+ if( ((*it).attr_.rep_.name_ == name) ||
+ ((*it).attr_.rep_.name_ == newName))
+ {
+ prop = (*it);
+ return true;
+ }
+ ++it;
+ }
+ return false;
+}
+
+
+bool
+TeSTInstance::getPropertyValue (string& val, int i)
+{
+ if ((i >=0) && (i< (int)properties_.size()))
+ {
+ val = properties_[i].value_;
+ return true;
+ }
+ else
+ return false;
+}
+
+
+bool
+TeSTInstance::getPropertyValue (const string& name, string& val)
+{
+ string newName;
+ size_t pos = name.find(".", string::npos,1);
+ if (pos != string::npos)
+ newName = name.substr(pos+1);
+
+ TePropertyVector::iterator it = properties_.begin();
+ while(it!=properties_.end())
+ {
+ if( ((*it).attr_.rep_.name_ == name) ||
+ ((*it).attr_.rep_.name_ == newName))
+ {
+ val = (*it).value_;
+ return true;
+ }
+ ++it;
+ }
+ return false;
+}
+
+bool
+TeSTInstance::getGeometry(TePolygonSet& result)
+{
+ if(geometries_.getGeometry(result))
+ return true;
+
+ if((theme_) && (theme_->layer()->loadGeometrySet(object_id_, result)))
+ return true;
+
+ return false;
+}
+
+bool
+TeSTInstance::getGeometry(TeLineSet& result)
+{
+ if(geometries_.getGeometry(result))
+ return true;
+
+ if((theme_) && (theme_->layer()->loadGeometrySet(object_id_, result)))
+ return true;
+
+ return false;
+}
+
+bool
+TeSTInstance::getGeometry(TePointSet& result)
+{
+ if(geometries_.getGeometry(result))
+ return true;
+
+ if((theme_) && (theme_->layer()->loadGeometrySet(object_id_, result)))
+ return true;
+
+ return false;
+}
+
+bool
+TeSTInstance::getGeometry(TeCellSet& result)
+{
+ if(geometries_.getGeometry(result))
+ return true;
+
+ if((theme_) && (theme_->layer()->loadGeometrySet(object_id_, result)))
+ return true;
+
+ return false;
+}
+
+bool
+TeSTInstance::getGeometry(vector<TeGeometry*>& result)
+{
+ if(geometries_.getGeometry(result))
+ return true;
+
+ if(theme_)
+ {
+ if(theme_->layer()->hasGeometry (TePOLYGONS))
+ {
+ TePolygonSet pols;
+ if(!theme_->layer()->loadGeometrySet(object_id_, pols))
+ return false;
+
+ for(int i=0; i<(int)pols.size(); ++i)
+ {
+ TePolygon* pol = new TePolygon;
+ result.push_back (pol);
+ }
+ }
+ if(theme_->layer()->hasGeometry (TeLINES))
+ {
+ TeLineSet lins;
+ if(!theme_->layer()->loadGeometrySet(object_id_, lins))
+ return false;
+
+ for(int i=0; i<(int)lins.size(); ++i)
+ {
+ TeLine2D* line = new TeLine2D;
+ result.push_back (line);
+ }
+ }
+ if(theme_->layer()->hasGeometry (TePOINTS))
+ {
+ TePointSet points;
+ if(!theme_->layer()->loadGeometrySet(object_id_, points))
+ return false;
+
+ for(int i=0; i<(int)points.size(); ++i)
+ {
+ TePoint* point = new TePoint;
+ result.push_back (point);
+ }
+ }
+ if(theme_->layer()->hasGeometry (TeCELLS))
+ {
+ TeCellSet cells;
+ if(!theme_->layer()->loadGeometrySet(object_id_, cells))
+ return false;
+
+ for(int i=0; i<(int)cells.size(); ++i)
+ {
+ TeCell* cell = new TeCell;
+ result.push_back (cell);
+ }
+ }
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool
+TeSTInstance::getGeometry(TeMultiGeometry& result)
+{
+ if(!geometries_.empty())
+ {
+ result = geometries_;
+ return true;
+ }
+
+ geometries_.getGeometry (result.polygons_);
+ geometries_.getGeometry (result.lines_);
+ geometries_.getGeometry (result.points_);
+ geometries_.getGeometry (result.cells_);
+
+ return (!result.empty());
+}
+
+void
+TeSTInstance::addProperty(const double& val, TeAttributeRep rep, bool /* attrIn */)
+{
+ TeProperty prop;
+ prop.attr_.rep_ = rep;
+ prop.value_ = Te2String(val);
+ properties_.push_back(prop);
+}
+
+
+bool
+TeSTInstance::addGeometry(const TePolygon& poly)
+{
+ if(poly.objectId() == objectId())
+ {
+ geometries_.addGeometry (poly);
+ return true;
+ }
+ return false;
+}
+
+bool
+TeSTInstance::addGeometry(const TeLine2D& line)
+{
+ if(line.objectId() == objectId())
+ {
+ geometries_.addGeometry (line);
+ return true;
+ }
+ return false;
+}
+
+bool
+TeSTInstance::addGeometry(const TePoint& point)
+{
+ if(point.objectId() == objectId())
+ {
+ geometries_.addGeometry (point);
+ return true;
+ }
+ return false;
+}
+
+bool
+TeSTInstance::addGeometry(const TeCell& cell)
+{
+ if(cell.objectId() == objectId())
+ {
+ geometries_.addGeometry (cell);
+ return true;
+ }
+ return false;
+}
+
+
+bool
+TeSTInstance::setPropertyValue (const string& name, const string& val)
+{
+ string newName;
+ size_t pos = name.find(".", string::npos,1);
+ if (pos != string::npos)
+ newName = name.substr(pos+1);
+
+ TePropertyVector::iterator it = properties_.begin();
+ while(it!=properties_.end())
+ {
+ if( ((*it).attr_.rep_.name_ == name) ||
+ ((*it).attr_.rep_.name_ == newName))
+ {
+ (*it).value_ = val;
+ return true;
+ }
+ ++it;
+ }
+ return false;
+}
+
+
+double
+TeSTInstance::operator[](int i)
+{
+ TeAttrDataType attrType = properties_[i].attr_.rep_.type_;
+
+ if ((i >= 0) && (i < (int)properties_.size()) &&
+ (attrType == TeREAL || attrType == TeINT))
+ {
+ if (properties_[i].value_.empty())
+ return TeMAXFLOAT;
+ return (atof(properties_[i].value_.c_str()));
+ }
+ else
+ return 0.;
+}
+
+bool
+TeSTInstance::centroid(TeCoord2D& centroid, TeGeomRep geomRep)
+{
+ bool status = false;
+ if(geomRep==TePOLYGONS)
+ {
+ TePolygonSet pols;
+ if(getGeometry(pols))
+ {
+ centroid = TeFindCentroid(pols);
+ status = true;
+ }
+ }
+ if(geomRep==TeLINES)
+ {
+ TeLineSet lins;
+ if(getGeometry(lins))
+ {
+ centroid = TeFindCentroid(lins);
+ status = true;
+ }
+ }
+ if(geomRep==TePOINTS)
+ {
+ TePointSet points;
+ if(getGeometry(points))
+ {
+ centroid = TeFindCentroid(points);
+ status = true;
+ }
+ }
+ if(geomRep==TeCELLS)
+ {
+ TeCellSet cells;
+ if(getGeometry(cells))
+ {
+ centroid = TeFindCentroid(cells);
+ status = true;
+ }
+ }
+ if(geomRep==TeGEOMETRYNONE)
+ {
+ if(hasPolygons())
+ status = this->centroid(centroid, TePOLYGONS);
+ else if(hasLines())
+ status = this->centroid(centroid, TeLINES);
+ else if (hasPoints())
+ status = this->centroid(centroid, TePOINTS);
+ else if (hasCells())
+ status = this->centroid(centroid, TeCELLS);
+ }
+
+ return status;
+}
+
+bool
+TeSTInstance::area(double& a, TeGeomRep geomRep)
+{
+ bool status = false;
+ if(geomRep==TePOLYGONS)
+ {
+ TePolygonSet pols;
+ if(getGeometry(pols))
+ {
+ a = TeGeometryArea(pols);
+ status = true;
+ }
+ }
+ if(geomRep==TeLINES)
+ {
+ TeLineSet lins;
+ if(getGeometry(lins))
+ {
+ a = TeGeometryArea(lins);
+ status = true;
+ }
+ }
+ if(geomRep==TePOINTS)
+ {
+ TePointSet points;
+ if(getGeometry(points))
+ {
+ a = TeGeometryArea(points);
+ status = true;
+ }
+ }
+ if(geomRep==TeCELLS)
+ {
+ TeCellSet cells;
+ if(getGeometry(cells))
+ {
+ a = TeGeometryArea(cells);
+ status = true;
+ }
+ }
+ if(geomRep==TeGEOMETRYNONE)
+ {
+ if(hasPolygons())
+ status = this->area(a, TePOLYGONS);
+ else if(hasLines())
+ status = this->area(a, TeLINES);
+ else if (hasPoints())
+ status = this->area(a, TePOINTS);
+ else if (hasCells())
+ status = this->area(a, TeCELLS);
+ }
+
+ return status;
+}
+
+void
+TeSTInstance::clear()
+{
+ slice_ = 0;
+ theme_ = 0;
+ object_id_.clear();
+ unique_id_.clear();
+ properties_.clear();
+ geometries_.clear();
+}
+
+
+
diff --git a/src/terralib/kernel/TeSTInstance.h b/src/terralib/kernel/TeSTInstance.h
new file mode 100644
index 0000000..9594e62
--- /dev/null
+++ b/src/terralib/kernel/TeSTInstance.h
@@ -0,0 +1,231 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeSTInstance.h
+ This file contains structures and definitions to deal with an instance
+ in time of a spatial element, including their geometry and set of properties
+*/
+
+#ifndef __TERRALIB_INTERNAL_STINSTANCE_H
+#define __TERRALIB_INTERNAL_STINSTANCE_H
+
+#include "TeAttribute.h"
+#include "TeTimeInterval.h"
+#include "TeTheme.h"
+#include "TeMultiGeometry.h"
+
+#include <string>
+#include <map>
+#include <vector>
+using namespace std;
+
+//! An instance in a time of a spatial element
+class TeSTInstance
+{
+
+protected:
+ string object_id_; // object identification
+ vector<string> unique_id_; // instance identification for each attribute table
+ int slice_; // grouping identification
+
+ TeTimeInterval time_; // validity time
+ TePropertyVector properties_; // set of properties
+ TeMultiGeometry geometries_; // set of geometries
+
+ TeTheme* theme_; // theme
+
+public:
+
+ //! Default constructor
+ TeSTInstance() { }
+
+ //! Constructor to an ST object without geometries or time stamp
+ TeSTInstance (const string& object_id, TeProperty& prop );
+
+ //! Copy constructor
+ TeSTInstance(const TeSTInstance& other);
+
+ //! Assignment operator
+ TeSTInstance& operator= (const TeSTInstance& other);
+
+ //! Operator ==
+ bool operator== (const TeSTInstance& other) const;
+
+ //! Destructor
+ ~TeSTInstance() {}
+
+ //! Sets the vector of properties of this ST object
+ void properties(TePropertyVector& p)
+ { properties_ = p; }
+
+ //! Returns the property vector of this instance
+ TePropertyVector& getPropertyVector()
+ { return properties_; }
+
+ //! Returns the properties of this instance that was generated for a function
+ TePropertyVector& getOutPropertyVector()
+ { return properties_; }
+
+ //! Returns the geometries
+ TeMultiGeometry& geometries() { return geometries_;}
+
+ //! Gets the i-th property
+ bool getProperty (TeProperty& prop, unsigned int i = 0);
+
+ //! Gets the property named "name
+ bool getProperty (TeProperty& prop, string name);
+
+ //! Gets the value (as a string) of of the i-th property
+ bool getPropertyValue (string& val, int i = 0);
+
+ //! Gets the value (as a string) of a property named 'name'
+ bool getPropertyValue (const string& name, string& val);
+
+ //! Return true if this has polygons
+ bool hasPolygons()
+ { return (geometries_.hasPolygons()); }
+
+ //! Return true if this has lines
+ bool hasLines()
+ { return (geometries_.hasLines()); }
+
+ //! Return true if this has points
+ bool hasPoints()
+ { return (geometries_.hasPoints()); }
+
+ //! Return true if this has cells
+ bool hasCells()
+ { return (geometries_.hasCells()); }
+
+ //! Get geometries
+ bool getGeometry(TePolygonSet& result);
+ bool getGeometry(TeLineSet& result);
+ bool getGeometry(TePointSet& result);
+ bool getGeometry(TeCellSet& result);
+ bool getGeometry(vector<TeGeometry*>& result);
+ bool getGeometry(TeMultiGeometry& result);
+
+ //! Adds a property to this ST object
+ void addProperty(TeProperty& prop)
+ { properties_.push_back ( prop ); }
+
+ //! Adds a property to this ST object
+ void addProperty(const double& val, TeAttributeRep rep = TeAttributeRep(), bool attrIn = true);
+
+ //! Set geometries
+ void setGeometry(const TePolygonSet& result)
+ { geometries_.setGeometry(result); }
+
+ void setGeometry(const TeLineSet& result)
+ { geometries_.setGeometry(result); }
+
+ void setGeometry(const TePointSet& result)
+ { geometries_.setGeometry(result); }
+
+ void setGeometry(const TeCellSet& result)
+ { geometries_.setGeometry(result); }
+
+ void setGeometry(vector<TeGeometry*>& result)
+ { geometries_.setGeometry(result); }
+
+ void setGeometry(const TeMultiGeometry& geoms)
+ { geometries_ = geoms; }
+
+ //! Add geometries
+ bool addGeometry(const TePolygon& poly);
+ bool addGeometry(const TeLine2D& line);
+ bool addGeometry(const TePoint& point);
+ bool addGeometry(const TeCell& cell);
+
+ //! Sets the value (as a string) of a property named 'name'
+ bool setPropertyValue (const string& name, const string& val);
+
+ //! Returns the value (as a double) of the i-th property
+ double operator[](int i);
+
+ //! Return the centroid of the geometry
+ bool centroid(TeCoord2D& centroid, TeGeomRep geomRep=TeGEOMETRYNONE);
+
+ //! Return the area of the geometry
+ bool area( double& a, TeGeomRep geomRep=TeGEOMETRYNONE);
+
+ //! Returns the validity interval
+ TeTimeInterval timeInterval ()
+ { return time_; }
+
+ //! Sets the validity interval
+ void timeInterval (const TeTimeInterval& t)
+ { time_ = t; }
+
+ //! Returns the initial time of the validity interval
+ string getInitialDateTime(const string& mask="YYYYsMMsDDsHHsmmsSS")
+ { return time_.getInitialDateTime(mask); }
+
+ //! Returns the final time of the validity interval
+ string getFinalDateTime(const string& mask="YYYYsMMsDDsHHsmmsSS")
+ { return time_.getFinalDateTime(mask); }
+
+ //! Returns the object identification
+ string objectId ()
+ { return object_id_; }
+
+ //! Sets the object identification
+ void objectId (const string& id)
+ { object_id_ = id; }
+
+ //! Returns the instance identification
+ vector<string>& uniqueId ()
+ { return unique_id_; }
+
+ //! Returns the instance identification
+ string uniqueId (int index_)
+ { return unique_id_[index_]; }
+
+ //! Sets the instance identifications
+ void uniqueId (const vector<string>& ids)
+ { unique_id_ = ids; }
+
+ //! Adds the instance identifications
+ void addUniqueId(const string& id)
+ { unique_id_.push_back(id); }
+
+ //! Sets the grouping identification of this ST object
+ void slice (int s)
+ { slice_ = s; }
+
+ //! Returns the grouping identification of this ST object
+ int slice()
+ { return slice_; }
+
+ //! Return the theme that the instance belongs
+ TeTheme* theme() { return theme_; }
+
+ //! Set the theme that the instance belongs
+ void theme(TeTheme* theme) { theme_ = theme; }
+
+ //! clear instance
+ void clear();
+};
+
+
+#endif
diff --git a/src/terralib/kernel/TeSingleton.h b/src/terralib/kernel/TeSingleton.h
new file mode 100644
index 0000000..16be16b
--- /dev/null
+++ b/src/terralib/kernel/TeSingleton.h
@@ -0,0 +1,62 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_SINGLETON_H
+#define __TERRALIB_INTERNAL_SINGLETON_H
+
+//! Provides a template support for the "Singleton" pattern
+/*!
+ \note See "Design Patterns" book, page 127
+*/
+template <class T>
+class TeSingleton {
+public:
+
+ static T& instance ()
+ {
+ static T instance_;
+ return instance_;
+ }
+
+// -- Destructor
+
+ virtual ~TeSingleton() {} // base class
+
+protected:
+
+// -- Contructors
+
+ TeSingleton() {}
+
+
+private:
+
+// No copy allowed
+
+ TeSingleton(const TeSingleton&);
+ TeSingleton& operator=(const TeSingleton&){return *this;}
+
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeSlice.h b/src/terralib/kernel/TeSlice.h
new file mode 100644
index 0000000..2ebb39e
--- /dev/null
+++ b/src/terralib/kernel/TeSlice.h
@@ -0,0 +1,63 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeSlice.h
+ This provides support for a slice structure
+*/
+#ifndef __TERRALIB_INTERNAL_SLICE_H
+#define __TERRALIB_INTERNAL_SLICE_H
+
+#include "TeUtils.h"
+
+#include <string>
+#include <vector>
+#include <map>
+#include <iostream>
+using namespace std;
+
+/*!
+A Slice is a structure that defines an interval of values and associates a
+number of objects that have a certain property, or attribute, whithin this
+interval.
+*/
+class TeSlice
+{
+public:
+ int count_; //! number of objects container in the interval
+ string from_; //! interval lower value
+ string to_; //! interval upper value
+
+ //! Constructor
+ TeSlice::TeSlice () : count_(0),from_(""),to_("") {}
+
+ //! Constructor
+ TeSlice::TeSlice(const string& from, const string& to, int count=0) :
+ count_(count),
+ from_(from),
+ to_(to) {}
+};
+
+//! A vector of slices
+typedef vector<TeSlice> TeSliceVector;
+#endif
+
diff --git a/src/terralib/kernel/TeSparseMatrix.h b/src/terralib/kernel/TeSparseMatrix.h
new file mode 100644
index 0000000..e843cca
--- /dev/null
+++ b/src/terralib/kernel/TeSparseMatrix.h
@@ -0,0 +1,272 @@
+// k9/a4/sparmat.h, templates for sparse matrices
+#ifndef SPARSEMATRIX_H
+#define SPARSEMATRIX_H SPARSEMATRIX_H
+
+// selection of implementation
+#ifdef STL_map // defined in main()
+#include<map>
+#include<cassert>
+#else
+#include<hmap.h>
+
+/* If at this point the HMap container is chosen, a function for
+ calculating the hash table addresses is needed. As opposed to the
+ hash functions described up to now, not only one value, but two are
+ used for the calculation. Therefore, the function operator of the
+ PairHashFun class takes a pair as argument. The address calculation
+ itself is simple, but sufficient for our purposes. */
+
+using namespace std;
+
+template<class IndexType> // int, long or unsigned
+class PairHashFun
+{
+ public:
+ PairHashFun(long prime=65537) // another prime number is possible
+ // e.g. 2111 for smaller Matrizes
+ : tabSize(prime)
+ {}
+
+ // Address calculation with two values
+ long operator()(const pair<IndexType, IndexType>& p) const
+ {
+ return (p.first + p.second) % tabSize;
+ }
+
+ long tableSize() const
+ {
+ return tabSize;
+ }
+
+ private:
+ long tabSize;
+};
+#endif // STL_map
+
+#ifdef _MSC_VER
+#include <utility>
+using namespace std;
+#endif
+
+template<class ValueType, class IndexType, class ContainerType>
+class MatrixElement
+{
+ private:
+ ContainerType& C;
+ typename ContainerType::iterator I;
+ IndexType row, column;
+
+ public:
+ typedef pair<IndexType, IndexType> IndexPair;
+ typedef MatrixElement<ValueType, IndexType,
+ ContainerType>& Reference;
+
+ MatrixElement(ContainerType& Cont, IndexType r, IndexType c)
+ : C(Cont), I(C.find(IndexPair(r,c))),
+ row(r), column(c)
+ {}
+
+ /* The constructor initializes the private variables with all
+ information that is needed. The container itself is located in
+ the sparseMatrix class; here, the reference to it is entered.
+ If the passed indices for row and column belong to an element
+ not yet stored in the container, the iterator has the value
+ C.end(). */
+
+ ValueType asValue() const
+ {
+ if(I == C.end())
+ return ValueType(0);
+ else
+ return (*I).second;
+ }
+
+ operator ValueType () const // type conversion operator
+ {
+ return asValue();
+ }
+
+ /* According to the definition of the sparse matrix, 0 is returned
+ if the element is not present in the container. Otherwise, the
+ result is the second part of the object of type value_type
+ stored in the container. */
+
+ Reference operator=(const ValueType& x)
+ {
+ if(x != ValueType(0)) // not equal 0?
+ {
+ /* If the element does not yet exist, it is put, together
+ with the indices, into an object of type value_type and
+ inserted with insert(): */
+
+ if(I == C.end())
+ {
+ assert(C.size() < C.max_size());
+ I = (C.insert(
+#ifndef _MSC_VER
+ typename
+#endif
+ ContainerType::value_type(
+ IndexPair(row,column), x))
+ ).first;
+ }
+ else (*I).second = x;
+ }
+
+ /* insert() returns a pair whose first part is an iterator
+ pointing to the inserted object. The second part is of type
+ bool and indicates whether the insertion took place because
+ no element with this key existed. This is, however, not
+ evaluated here because, due to the precondition (I ==
+ C.end()), the second part must always have the value true.
+ If, instead, the element already exists, the value is
+ entered into the second part of the value_type object. If
+ the value is equal 0, in order to save space the element is
+ deleted if it existed. */
+
+ else // x = 0
+ if(I != C.end())
+ {
+ C.erase(I);
+ I = C.end();
+ }
+ return *this;
+ }
+
+ /* An assignment operator is required which in turn requires a
+ reference to an object of type MatrixElement. When both the
+ left- and right-hand side are identical, nothing has to happen.
+ Otherwise, as above, it has to be checked whether the value of
+ the right-hand element is 0 or not. The resulting behavior is
+ described together with the above assignment operator, so that
+ here it is simply called: */
+
+ Reference operator=(const Reference rhs)
+ {
+ if(this != &rhs) // not identical?
+ {
+ return operator=(rhs.asValue()); // see above
+ }
+ return *this;
+ }
+
+}; // class MatrixElement
+
+template<class ValueType, class IndexType>
+class TeSparseMatrix
+{
+ public:
+ typedef pair<IndexType, IndexType> IndexPair;
+
+ // The switch STL_map controls the compilation:
+
+#ifdef STL_map
+ typedef map<IndexPair, ValueType,
+ less<IndexPair> > ContainerType;
+#else
+ typedef HMap<IndexPair, ValueType,
+ PairHashFun<IndexType> > ContainerType;
+#endif
+
+ typedef MatrixElement<ValueType, IndexType,
+ ContainerType> MatrixElement;
+
+ public:
+ typedef IndexType size_type;
+
+ /* The constructor only initializes the row and column
+ information. The container is created by its standard
+ constructor, where in the case of hash implementation, the size
+ of the container is given by the hash function object of type
+ PairHashFun (see typedef above). */
+
+ private:
+ size_type rows, columns;
+ ContainerType C;
+
+ public:
+ sparseMatrix(size_type r, size_type c)
+ : rows(r), columns(c)
+ {}
+
+ size_type Rows() const { return rows;}
+ size_type Columns() const { return columns;}
+
+ // usual container type definitions
+ typedef typename ContainerType::iterator iterator;
+ typedef typename ContainerType::const_iterator const_iterator;
+
+ // usual container functions
+ size_type size() const { return C.size();}
+ size_type max_size() const { return C.max_size();}
+
+ iterator begin() { return C.begin();}
+ iterator end() { return C.end();}
+
+ const_iterator begin() const { return C.begin();}
+ const_iterator end() const { return C.end();}
+
+ void clear()
+ {
+ C.clear();
+
+ }
+
+ class Aux // for index operator below
+ {
+ public:
+ Aux(size_type r, size_type maxs, ContainerType& Cont)
+ : Row(r), maxColumns(maxs), C(Cont)
+ {}
+
+ /* After checking the number of columns, the index operator of
+ Aux returns a matrix element which is equipped with all
+ necessary information to carry out a successful assignment.
+ */
+
+ MatrixElement operator[](size_type c)
+ {
+ assert(c >= 0 && c < maxColumns);
+ return MatrixElement(C, Row, c);
+ }
+
+ private:
+ size_type Row, maxColumns;
+ ContainerType& C;
+ };
+
+ /* The index operator of the sparseMatrix class returns the
+ auxiliary object, whose class is defined as nested inside
+ sparseMatrix. */
+ Aux operator[](size_type r)
+ {
+ assert(r >= 0 && r < rows);
+ return Aux(r, columns, C);
+ }
+
+ /* Up to this point, from a functionality point of view, the
+ sparseMatrix class is sufficiently equipped. In order, however,
+ to avoid writing such horrible things as `(*I).first.first' for
+ accessing the elements, some auxiliary functions follow which
+ determine the indices and associated values of an iterator in a
+ more readable way. */
+
+ size_type Index1(iterator& I) const
+ {
+ return (*I).first.first;
+ }
+
+ size_type Index2(iterator& I) const
+ {
+ return (*I).first.second;
+ }
+
+ ValueType Value(iterator& I) const
+ {
+ return (*I).second;
+ }
+}; // class sparseMatrix
+
+#endif // file sparmat.h
+
+
diff --git a/src/terralib/kernel/TeSpatialOperations.cpp b/src/terralib/kernel/TeSpatialOperations.cpp
new file mode 100644
index 0000000..d893848
--- /dev/null
+++ b/src/terralib/kernel/TeSpatialOperations.cpp
@@ -0,0 +1,1658 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeSpatialOperations.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeRasterRemap.h"
+#include "TeStatistics.h"
+#include "TeOverlay.h"
+#include "TeBufferRegion.h"
+#include "TeProgress.h"
+#include "TeVectorRemap.h"
+
+#include <algorithm>
+
+
+TeProjection*
+getProjectionFromGeomTable(const string& geomTable, TeDatabase* db)
+{
+ TeLayerMap layerMap = db->layerMap();
+ TeLayerMap::iterator it = layerMap.begin();
+ while(it!=layerMap.end())
+ {
+ TeLayer* layer = it->second;
+ TeRepresPointerVector::iterator itRep = layer->vectRepres().begin();
+ while(itRep!=layer->vectRepres().end())
+ {
+ if(TeConvertToUpperCase((*itRep)->tableName_)==TeConvertToUpperCase(geomTable))
+ return layer->projection();
+ ++itRep;
+ }
+ ++it;
+ }
+ return 0;
+}
+
+
+// Return if exist or not a totpological relation between two geometries
+// Use the TerraLib topological functions
+bool TopolRelation(TePolygon* geom1, TePolygon* geom2, int relation)
+{
+ bool result = false;
+ switch (relation)
+ {
+ case TeDISJOINT:
+ result = TeDisjoint(*geom1, *geom2);
+ break;
+
+ case TeINTERSECTS:
+ result = TeIntersects(*geom1, *geom2);
+ break;
+
+ case TeTOUCHES:
+ result = TeTouches(*geom1, *geom2);
+ break;
+
+ case TeOVERLAPS:
+ result = TeOverlaps(*geom1, *geom2);
+ break;
+
+ case TeCOVERS:
+ result = TeCovers(*geom1, *geom2);
+ break;
+
+ case TeCOVEREDBY:
+ result = TeCoveredBy(*geom1, *geom2);
+ break;
+
+ case TeCONTAINS:
+ result = TeContains(*geom1, *geom2);
+ break;
+
+ case TeWITHIN:
+ result = TeWithin(*geom1, *geom2);
+ break;
+
+ case TeEQUALS:
+ result = TeEquals(*geom1, *geom2);
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY) :
+ result = TeWithinOrCoveredByOrEquals(*geom1, *geom2);
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+ result = ( (TeOverlaps(*geom1, *geom2)) || (TeWithinOrCoveredByOrEquals(*geom1, *geom2)));
+ break;
+ }
+ return result;
+}
+
+
+bool TopolRelation(TePolygon* geom1, TeLine2D* geom2, int relation)
+{
+ bool result = false;
+ switch (relation)
+ {
+ case TeDISJOINT:
+ result = TeDisjoint(*geom2, *geom1);
+ break;
+
+ case TeINTERSECTS:
+ result = TeIntersects(*geom2, *geom1);
+ break;
+
+ case TeTOUCHES:
+ result = TeTouches(*geom2, *geom1);
+ break;
+
+ case TeCOVERS:
+ result = TeCovers(*geom1, *geom2);
+ break;
+
+ case TeCOVEREDBY:
+ result = TeCoveredBy(*geom2, *geom1);
+ break;
+
+ case TeCONTAINS:
+ result = TeContains(*geom1, *geom2);
+ break;
+
+ case TeWITHIN:
+ result = TeWithin(*geom2, *geom1);
+ break;
+
+ case TeCROSSES:
+ result = TeCrosses(*geom2, *geom1);
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY):
+ result = TeWithinOrCoveredByOrEquals(*geom2, *geom1);
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+ result = ( (TeCrosses(*geom2, *geom1)) || (TeWithinOrCoveredByOrEquals(*geom2, *geom1)));
+ break;
+ }
+ return result;
+}
+
+
+bool TopolRelation(TePolygon* geom1, TePoint* geom2, int relation)
+{
+ bool result = false;
+ switch (relation)
+ {
+ case TeDISJOINT:
+ result = TeDisjoint(*geom2, *geom1);
+ break;
+
+ case TeINTERSECTS:
+ result = TeIntersects(*geom2, *geom1);
+ break;
+
+ case TeTOUCHES:
+ result = TeTouches(*geom2, *geom1);
+ break;
+
+ case TeCONTAINS:
+ result = TeContains(*geom1, *geom2);
+ break;
+
+ case TeWITHIN:
+ result = TeWithin(*geom2, *geom1);
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY):
+ case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+ result = TeWithinOrCoveredByOrEquals((*geom2).location(), *geom1);
+ break;
+ }
+ return result;
+}
+
+bool TopolRelation(TeLine2D* geom1, TeLine2D* geom2, int relation)
+{
+ bool result = false;
+ switch (relation)
+ {
+ case TeDISJOINT:
+ result = TeDisjoint(*geom1, *geom2);
+ break;
+
+ case TeINTERSECTS:
+ result = TeIntersects(*geom1, *geom2);
+ break;
+
+ case TeTOUCHES:
+ result = TeTouches(*geom1, *geom2);
+ break;
+
+ case TeOVERLAPS:
+ result = TeOverlaps(*geom1, *geom2);
+ break;
+
+ case TeCOVERS:
+ result = TeCovers(*geom1, *geom2);
+ break;
+
+ case TeCOVEREDBY:
+ result = TeCoveredBy(*geom1, *geom2);
+ break;
+
+ case TeCONTAINS:
+ result = TeContains(*geom1, *geom2);
+ break;
+
+ case TeWITHIN:
+ result = TeWithin(*geom1, *geom2);
+ break;
+
+ case TeEQUALS:
+ result = TeEquals(*geom1, *geom2);
+ break;
+
+ case TeCROSSES:
+ result = TeCrosses(*geom1, *geom2);
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+ result = ( (TeCrosses(*geom1, *geom2)) || (TeWithinOrCoveredByOrEquals(*geom1, *geom2)));
+ break;
+ }
+ return result;
+}
+
+bool TopolRelation(TeLine2D* geom1, TePoint* geom2, int relation)
+{
+ bool result = false;
+ switch (relation)
+ {
+ case TeDISJOINT:
+ result = TeDisjoint(*geom2, *geom1);
+ break;
+
+ case TeINTERSECTS:
+ result = TeIntersects(*geom2, *geom1);
+ break;
+
+ case TeTOUCHES:
+ result = TeTouches(*geom2, *geom1);
+ break;
+
+ case TeCONTAINS:
+ result = TeContains(*geom1, *geom2);
+ break;
+
+ case TeWITHIN:
+ result = TeWithin(*geom2, *geom1);
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY):
+ case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+ result = TeWithinOrCoveredByOrEquals((*geom2).location(), *geom1);
+ break;
+ }
+ return result;
+}
+
+bool TopolRelation(TePoint* geom1, TePoint* geom2, int relation)
+{
+ bool result = false;
+ switch (relation)
+ {
+ case TeDISJOINT:
+ result = TeDisjoint(*geom1, *geom2);
+ break;
+
+ case TeINTERSECTS:
+ result = TeIntersects(*geom1, *geom2);
+ break;
+
+ case TeCONTAINS:
+ result = TeContains(*geom1, *geom2);
+ break;
+
+ case TeWITHIN:
+ result = TeWithin(*geom1, *geom2);
+ break;
+
+ case TeEQUALS:
+ case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+ result = TeEquals(*geom1, *geom2);
+ break;
+ }
+ return result;
+}
+
+bool TopolRelation(TeCell* geom1, TeCell* geom2, int relation)
+{
+ bool result = false;
+ switch (relation)
+ {
+ case TeDISJOINT:
+ result = TeDisjoint(*geom1, *geom2);
+ break;
+
+ case TeINTERSECTS:
+ result = TeIntersects(*geom1, *geom2);
+ break;
+
+ case TeTOUCHES:
+ result = TeTouches(*geom1, *geom2);
+ break;
+
+ case TeOVERLAPS:
+ result = TeOverlaps(*geom1, *geom2);
+ break;
+
+ case TeCOVERS:
+ result = TeCovers(*geom1, *geom2);
+ break;
+
+ case TeCOVEREDBY:
+ result = TeCoveredBy(*geom1, *geom2);
+ break;
+
+ case TeCONTAINS:
+ result = TeContains(*geom1, *geom2);
+ break;
+
+ case TeWITHIN:
+ result = TeWithin(*geom1, *geom2);
+ break;
+
+ case TeEQUALS:
+ result = TeEquals(*geom1, *geom2);
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY):
+ result = TeWithinOrCoveredByOrEquals((*geom1).box(), (*geom2).box());
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+ result = ( (TeOverlaps(*geom1, *geom2)) || (TeWithinOrCoveredByOrEquals((*geom1).box(), (*geom2).box())));
+ break;
+ }
+ return result;
+}
+
+bool TopolRelation(TeCell* geom1, TePolygon* geom2, int relation)
+{
+ bool result = false;
+ switch (relation)
+ {
+ case TeDISJOINT:
+ result = TeDisjoint(*geom1, *geom2);
+ break;
+
+ case TeINTERSECTS:
+ result = TeIntersects(*geom1, *geom2);
+ break;
+
+ case TeTOUCHES:
+ result = TeTouches(*geom1, *geom2);
+ break;
+
+ case TeOVERLAPS:
+ result = TeOverlaps(*geom1, *geom2);
+ break;
+
+ case TeCOVERS:
+ result = TeCovers(*geom1, *geom2);
+ break;
+
+ case TeCOVEREDBY:
+ result = TeCoveredBy(TeMakePolygon((*geom1).box()), *geom2);
+ break;
+
+ case TeCONTAINS:
+ result = TeWithin(*geom2, TeMakePolygon((*geom1).box()));
+ break;
+
+ case TeWITHIN:
+ result = TeWithin(*geom1, *geom2);
+ break;
+
+ case TeEQUALS:
+ result = TeEquals(*geom1, *geom2);
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY):
+ result = TeWithinOrCoveredByOrEquals(TeMakePolygon((*geom1).box()), *geom2);
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+ result = ( (TeOverlaps(*geom1, *geom2)) || (TeWithinOrCoveredByOrEquals(TeMakePolygon((*geom1).box()) , *geom2)));
+ break;
+ }
+ return result;
+}
+
+bool TopolRelation(TeCell* geom1, TeLine2D* geom2, int relation)
+{
+ bool result = false;
+ switch (relation)
+ {
+ case TeDISJOINT:
+ result = TeDisjoint(*geom1, *geom2);
+ break;
+
+ case TeINTERSECTS:
+ result = TeIntersects(*geom1, *geom2);
+ break;
+
+ case TeTOUCHES:
+ result = TeTouches(*geom2, *geom1);
+ break;
+
+ case TeCOVERS:
+ result = TeCovers(*geom1, *geom2);
+ break;
+
+ case TeCOVEREDBY:
+ result = TeCoveredBy(*geom2, *geom1);
+ break;
+
+ case TeCONTAINS:
+ result = TeContains(*geom1, *geom2);
+ break;
+
+ case TeWITHIN:
+ result = TeWithin(*geom2, *geom1);
+ break;
+
+ case TeCROSSES:
+ result = TeCrosses(*geom2, *geom1);
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY):
+ result = TeWithinOrCoveredByOrEquals(*geom2, TeMakePolygon((*geom1).box()));
+ break;
+
+ case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+ result = ( (TeCrosses(*geom2, *geom1)) || (TeWithinOrCoveredByOrEquals(*geom2, TeMakePolygon((*geom1).box()))));
+ break;
+ }
+ return result;
+
+}
+
+bool TopolRelation(TeCell* geom1, TePoint* geom2, int relation)
+{
+ bool result = false;
+ switch (relation)
+ {
+ case TeDISJOINT:
+ result = TeDisjoint(*geom1, *geom2);
+ break;
+
+ case TeINTERSECTS:
+ result = TeIntersects(*geom1, *geom2);
+ break;
+
+ case TeTOUCHES:
+ result = TeTouches(*geom2, *geom1);
+ break;
+
+ case TeCONTAINS:
+ result = TeContains(*geom1, *geom2);
+ break;
+
+ case TeWITHIN:
+ result = TeWithin(*geom2, *geom1);
+ break;
+
+ case (TeWITHIN & TeCOVEREDBY):
+ case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+ result = TeWithinOrCoveredByOrEquals((*geom2).location(), TeMakePolygon((*geom1).box()));
+ break;
+ }
+ return result;
+
+}
+
+
+// Return a string with the identifications of the selected geometries
+string
+getStringIds(Keys& IdsIn)
+{
+ string Ids = "";
+ int cont = 0;
+
+ Keys::iterator itIdIn = IdsIn.begin();
+ while (itIdIn != IdsIn.end())
+ {
+ if(cont)
+ Ids += ",";
+ Ids += "'" + (*itIdIn) + "'";
+ itIdIn++;
+ cont++;
+ }
+
+ return Ids;
+}
+
+// fill the geometries vector from a portal
+string
+mountSelect(string geomTable, string colTable, TeGeomRep rep, TeBox& box, int relate, TeDatabasePortal *portal)
+{
+
+ string sql = "SELECT * FROM "+ geomTable;
+
+ if(!colTable.empty())
+ sql +=", "+ colTable +" WHERE c_object_id = object_id ";
+
+ //If not disjoint
+ if(box.isValid() && (relate!=TeDISJOINT))
+ {
+ if(!colTable.empty())
+ sql += " AND ";
+ else
+ sql += " WHERE ";
+
+ sql += portal->getDatabase()->getSQLBoxWhere (box, rep);
+ }
+ return sql;
+}
+
+//fill the result vector of the geometries identificators
+bool
+fillSelectedGeomVector(TeGeomRep actRep, TeSelectedGeom& vetGeom, TeDatabasePortal *portal, TeProjection* projAct=0, TeProjection* projVis=0)
+{
+ bool flag = true;
+ bool remap = false;
+
+ if((projAct!=0) && (projVis!=0) && (projAct!=projVis))
+ remap = true;
+
+ try
+ {
+ do
+ {
+ if(actRep == TePOLYGONS)
+ {
+ TePolygon poly, *pol;
+ flag = portal->fetchGeometry(poly);
+ pol = new TePolygon;
+ if(remap)
+ {
+ TePolygon pout;
+ TeVectorRemap (poly, projAct, pout, projVis);
+ *pol = pout;
+ }
+ else
+ *pol = poly;
+ vetGeom.push_back(pol);
+ }
+ else if(actRep == TeLINES)
+ {
+ TeLine2D line, *lin;
+ flag = portal->fetchGeometry(line);
+ lin = new TeLine2D();
+ if(remap)
+ {
+ TeLine2D gout;
+ TeVectorRemap (line, projAct, gout, projVis);
+ *lin = gout;
+ }
+ else
+ *lin = line;
+ vetGeom.push_back(lin);
+ }
+ else if(actRep == TePOINTS)
+ {
+ TePoint point, *pnt;
+ flag = portal->fetchGeometry(point);
+ pnt = new TePoint();
+ if(remap)
+ {
+ TePoint gout;
+ TeVectorRemap (point, projAct, gout, projVis);
+ *pnt = gout;
+ }
+ else
+ *pnt = point;
+ vetGeom.push_back(pnt);
+ }
+ else if(actRep == TeCELLS)
+ {
+ TeCell cell, *cll;
+ flag = portal->fetchGeometry(cell);
+ cll = new TeCell();
+ if(remap)
+ {
+ TeCell gout;
+ TeVectorRemap (cell, projAct, gout, projVis);
+ *cll = gout;
+ }
+ else
+ *cll = cell;
+ vetGeom.push_back(cll);
+ }
+ } while (flag);
+ }
+ catch(...)
+ {
+ TeSelectedGeom::iterator it;
+ for(it = vetGeom.begin(); it != vetGeom.end(); it++)
+ delete (*it);
+ return false;
+ }
+
+ return true;
+}
+
+//geom: selected geometries
+//obj: portal geometries
+//basic idea: obj "relate" geom
+bool
+fillResultIdsVector(TeGeometry *geom, TeDatabasePortal *portal, TeGeomRep portalRep, int relate, Keys& resultIds)
+{
+ bool flag = false;
+ bool result = false;
+ TeGeomRep geomRep = geom->elemType();
+ bool isSet = false;
+ int setSize = 1;
+
+ if ( (dynamic_cast<TePolygonSet*> (geom)) ||
+ (dynamic_cast<TeLineSet*> (geom)) ||
+ (dynamic_cast<TePointSet*> (geom)) ||
+ (dynamic_cast<TeCellSet*> (geom)) )
+ {
+ isSet = true;
+ setSize = geom->size();
+ }
+
+ try
+ {
+ do
+ {
+ TeGeometry* obj = 0;
+ if(portalRep == TePOLYGONS)
+ {
+ TePolygon poly, *pol;
+ flag = portal->fetchGeometry (poly);
+ pol = new TePolygon();
+ *pol = poly;
+ obj = pol;
+ }
+ else if(portalRep == TeLINES)
+ {
+ TeLine2D line, *lin;
+ flag = portal->fetchGeometry (line);
+ lin = new TeLine2D();
+ *lin = line;
+ obj = lin;
+ }
+ else if(portalRep == TePOINTS)
+ {
+ TePoint point, *pnt;
+ flag = portal->fetchGeometry (point);
+ pnt = new TePoint();
+ *pnt = point;
+ obj = pnt;
+ }
+ else if(portalRep == TeCELLS)
+ {
+ TeCell cell, *cll;
+ flag = portal->fetchGeometry (cell);
+ cll = new TeCell();
+ *cll = cell;
+ obj = cll;
+ }
+
+ result = false;
+
+ //for each geometry
+ for(int i=0; i<setSize; ++i)
+ {
+ TeGeometry* geomTemp;
+ if(isSet)
+ {
+ if(geomRep==TePOLYGONS)
+ geomTemp = &(((TePolygonSet*)geom)->operator[](i));
+ else if (geomRep==TeLINES)
+ geomTemp = &(((TeLineSet*)geom)->operator[](i));
+ else if (geomRep==TePOINTS)
+ geomTemp = &(((TePointSet*)geom)->operator[](i));
+ else if (geomRep==TeCELLS)
+ geomTemp = &(((TeCellSet*)geom)->operator[](i));
+ }
+ else
+ geomTemp = geom;
+
+ switch (geomRep | portalRep) //geom: selected and obj: portal
+ {
+
+ case 1: //polygon with polygon
+ result = TopolRelation((TePolygon*)obj, (TePolygon*)geomTemp, relate);
+ break;
+
+ case 2://line with line
+ result = TopolRelation((TeLine2D*)obj, (TeLine2D*)geomTemp, relate);
+ break;
+
+ case 3://polygon with line
+ if(geomRep == TePOLYGONS)
+ result = TopolRelation((TePolygon*)geomTemp, (TeLine2D*)obj, relate);
+ else
+ result = TopolRelation((TePolygon*)obj, (TeLine2D*)geomTemp, relate);
+ break;
+
+ case 4://point with point
+ result = TopolRelation((TePoint*)obj, (TePoint*)geomTemp, relate);
+ break;
+
+ case 5://polygon with point
+ if(geomRep == TePOLYGONS)
+ result = TopolRelation((TePolygon*)geomTemp, (TePoint*)obj, relate);
+ else
+ result = TopolRelation((TePolygon*)obj, (TePoint*)geomTemp, relate);
+ break;
+
+ case 6://line with point
+ if(geomRep == TeLINES)
+ result = TopolRelation((TeLine2D*)geomTemp, (TePoint*)obj, relate);
+ else
+ result = TopolRelation((TeLine2D*)obj, (TePoint*)geomTemp, relate);
+ break;
+
+ case 256://cell with cell
+ result = TopolRelation((TeCell*)obj, (TeCell*)geomTemp, relate);
+ break;
+
+ case 257://cell with polygon
+ if(geomRep == TePOLYGONS)
+ result = TopolRelation((TeCell*)obj, (TePolygon*)geomTemp, relate);
+ else
+ result = TopolRelation((TeCell*)geomTemp, (TePolygon*)obj, relate);
+ break;
+
+ case 258://cell with line
+ if(geomRep == TeLINES)
+ result = TopolRelation((TeCell*)obj, (TeLine2D*)geomTemp, relate);
+ else
+ result = TopolRelation((TeCell*)geomTemp, (TeLine2D*)obj, relate);
+ break;
+
+ case 260://cell with point
+ if(geomRep == TeCELLS)
+ result = TopolRelation((TeCell*)geomTemp, (TePoint*)obj, relate);
+ else
+ result = TopolRelation((TeCell*)obj, (TePoint*)geomTemp, relate);
+ break;
+ }
+
+ if(result)
+ {
+ string objId = obj->objectId();
+ resultIds.push_back(objId);
+ }
+ }//for
+
+ delete obj;
+ } while (flag); //fetchrow
+ }
+ catch(...)
+ {
+ return false;
+ }
+ return true;
+}
+
+
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn,
+ TeDatabasePortal *portal, int relation, const string& actColTable)
+{
+ Keys resultIds;
+
+ if(!TeTopologicalRelation(actGeomTable, actRep, actIdsIn, resultIds, portal->getDatabase(), relation, actColTable))
+ return false;
+
+ string Ids = getStringIds(resultIds);
+
+ string sql = "SELECT * FROM " + actGeomTable;
+ sql += " WHERE object_id IN (" + Ids + ")";
+ sql += " ORDER BY object_id ASC ";
+ if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ portal->freeResult();
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ return true;
+}
+
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn,
+ const string& visGeomTable, TeGeomRep visRep, TeDatabasePortal *portal,
+ int relation, const string& visColTable)
+{
+ Keys resultIds;
+
+ if(!TeTopologicalRelation(actGeomTable, actRep, actIdsIn, visGeomTable, visRep, resultIds, portal->getDatabase(), relation, visColTable))
+ return false;
+
+ string Ids = getStringIds(resultIds);
+
+ portal->freeResult ();
+
+ string sql = "SELECT * FROM " + visGeomTable;
+ sql += " WHERE object_id IN (" + Ids + ")";
+ sql += " ORDER BY object_id ASC ";
+ if(visRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ return true;
+}
+
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom,
+ TeDatabasePortal *portal, int relation, const string& actCollTable)
+{
+
+ Keys resultIds;
+
+ if(!TeTopologicalRelation(actGeomTable, actRep, geom, resultIds, portal->getDatabase(), relation, actCollTable))
+ return false;
+
+ string Ids = getStringIds(resultIds);
+
+ portal->freeResult();
+
+ string sql = "SELECT * FROM " + actGeomTable;
+ sql += " WHERE object_id IN (" + Ids + ")";
+ sql += " ORDER BY object_id ASC ";
+ if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ return false;
+
+ return true;
+}
+
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn,
+ Keys& actIdsOut, TeDatabase* db, int relation, const string& actCollTable)
+{
+ TeSelectedGeom vetGeom;
+
+ string Ids = getStringIds(actIdsIn);
+
+ TeDatabasePortal* portal = db->getPortal();
+
+ string sql = "SELECT * FROM " + actGeomTable;
+ sql += " WHERE object_id IN (" + Ids + ")";
+
+ //order by clause
+ string sqlOrderBy = " ORDER BY object_id ASC ";
+ if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")
+ sqlOrderBy += ", parent_id ASC, num_holes DESC ";
+
+ sql += sqlOrderBy;
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ if(!fillSelectedGeomVector(actRep,vetGeom,portal))
+ {
+ delete portal;
+ return false;
+ }
+
+ //iterators
+ TeSelectedGeom::iterator it;
+ actIdsOut.clear();
+ double prec = TePrecision::instance().precision();
+
+ for (it = vetGeom.begin(); it != vetGeom.end(); it++)
+ {
+ portal->freeResult();
+ TeBox box = (**it).box();
+
+ TeBox temp (box.x1()-prec, box.y1()-prec, box.x2()+prec, box.y2()+prec);
+
+ sql = mountSelect(actGeomTable, actCollTable, actRep, temp, relation, portal);
+ if(relation != TeEQUALS)
+ sql += " AND object_id NOT IN (" + Ids + ")";
+ sql += sqlOrderBy;
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ if(!portal->fetchRow())
+ continue;
+
+ fillResultIdsVector((*it), portal, actRep, relation, actIdsOut);
+
+ }
+
+ sort(actIdsOut.begin(), actIdsOut.end());
+ unique(actIdsOut.begin(), actIdsOut.end());
+
+ delete portal;
+
+ for (it = vetGeom.begin(); it != vetGeom.end(); it++)
+ delete (*it);
+
+ return true;
+}
+
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn,
+ const string& visGeomTable, TeGeomRep visRep, Keys& visIdsOut,
+ TeDatabase* db, int relation, const string& visCollTable)
+{
+ TeSelectedGeom vetGeom;
+
+ string Ids = getStringIds(actIdsIn);
+
+ //verify projection
+ TeProjection* projAct = getProjectionFromGeomTable(actGeomTable, db);
+ TeProjection* projVis = getProjectionFromGeomTable(visGeomTable, db);
+
+ TeDatabasePortal* portal = db->getPortal();
+
+ string sql = "SELECT * FROM " + actGeomTable;
+ sql += " WHERE object_id IN (" + Ids + ")";
+ sql += " ORDER BY object_id ASC ";
+ if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ if(!portal->query(sql)|| !portal->fetchRow ())
+ {
+ delete portal;
+ return false;
+ }
+
+ if(!fillSelectedGeomVector(actRep,vetGeom,portal,projAct, projVis))
+ {
+ delete portal;
+ return false;
+ }
+
+ //iterators
+ TeSelectedGeom::iterator it;
+ visIdsOut.clear();
+ double prec = TePrecision::instance().precision();
+
+ for (it = vetGeom.begin(); it != vetGeom.end(); it++)
+ {
+ portal->freeResult();
+ TeBox box = (**it).box();
+
+ TeBox temp (box.x1()-prec, box.y1()-prec, box.x2()+prec, box.y2()+prec);
+
+ sql = mountSelect(visGeomTable, visCollTable, visRep, temp, relation, portal);
+ sql += " ORDER BY object_id ASC ";
+ if(visRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ if(!portal->fetchRow())
+ continue;
+
+ fillResultIdsVector((*it), portal, visRep, relation, visIdsOut);
+
+ }
+
+ delete portal;
+
+ sort(visIdsOut.begin(), visIdsOut.end());
+ unique(visIdsOut.begin(), visIdsOut.end());
+
+ for (it = vetGeom.begin(); it != vetGeom.end(); it++)
+ delete (*it);
+
+ return true;
+}
+
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom,
+ Keys& actIdsOut, TeDatabase* db, int relation, const string& actCollTable)
+{
+ TeDatabasePortal* portal = db->getPortal();
+ TeBox box = geom->box();
+
+ double prec = TePrecision::instance().precision();
+ TeBox temp (box.x1()-prec, box.y1()-prec, box.x2()+prec, box.y2()+prec);
+
+ string sql = mountSelect(actGeomTable, actCollTable, actRep, temp, relation, portal);
+ sql += " ORDER BY object_id ASC ";
+ if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ actIdsOut.clear();
+
+ fillResultIdsVector(geom, portal, actRep, relation, actIdsOut);
+
+ delete portal;
+
+ sort(actIdsOut.begin(), actIdsOut.end());
+ unique(actIdsOut.begin(), actIdsOut.end());
+
+ return true;
+}
+
+bool TeGetWithinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& point, KeysToDist& IdsDistOut,
+ TeDatabase* db, const double& max_dist, const string& actCollTable)
+{
+ if(!db)
+ return false;
+
+ TeDatabasePortal* portal = db->getPortal();
+ if(!portal)
+ return false;
+
+ TeBox box (point.x()-max_dist, point.y()-max_dist,point.x()+max_dist, point.y()+max_dist);
+
+ string sql = mountSelect(actGeomTable, actCollTable, actRep, box, TeWITHIN, portal);
+ sql += " ORDER BY object_id ASC ";
+ if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ if(!portal->query(sql))
+ {
+ delete portal;
+ return false;
+ }
+
+ if(!portal->fetchRow())
+ {
+ delete portal;
+ return true;
+ }
+
+ bool flag = true;
+ do
+ {
+ TeCoord2D centroid2;
+ string objId;
+ if(actRep == TePOLYGONS)
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry (poly);
+ objId = poly.objectId ();
+ centroid2 = TeFindCentroid(poly);
+ }
+ else if(actRep == TeLINES)
+ {
+ TeLine2D line;
+ flag = portal->fetchGeometry (line);
+ objId = line.objectId ();
+ centroid2 = TeFindCentroid(line);
+ }
+ else if(actRep == TePOINTS)
+ {
+ TePoint point;
+ flag = portal->fetchGeometry (point);
+ objId = point.objectId ();
+ centroid2 = TeFindCentroid(point);
+ }
+ else if(actRep == TeCELLS)
+ {
+ TeCell cell;
+ flag = portal->fetchGeometry (cell);
+ objId = cell.objectId ();
+ centroid2 = TeFindCentroid(cell);
+ }
+
+ double dist = TeDistance(point, centroid2);
+ if(dist<=max_dist)
+ IdsDistOut[objId] = dist;
+
+ } while (flag); //fetchrow
+
+ //sort(IdsDistOut.begin(), IdsDistOut.end());
+
+ delete portal;
+ return true;
+}
+
+bool TeGetArea(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabase* db, double& area)
+{
+ if(actRep != TePOLYGONS && actRep != TeCELLS )
+ return false;
+
+ string Ids = getStringIds(actIdsIn);
+
+ TeDatabasePortal* portal = db->getPortal();
+
+ string sql = "SELECT * FROM " + actGeomTable;
+ sql += " WHERE object_id IN (" + Ids + ")";
+ sql += " ORDER BY object_id ASC ";
+
+ if((actRep == TePOLYGONS) && (portal->getDatabase()->dbmsName() != "PostGIS"))
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = false;
+ double sumArea = 0.;
+ do
+ {
+ if(actRep == TePOLYGONS)
+ {
+ TePolygon poly;
+ flag = portal->fetchGeometry(poly);
+ sumArea+= TeGeometryArea(poly);
+ }
+ else if(actRep == TeCELLS)
+ {
+ TeCell cell;
+ flag = portal->fetchGeometry(cell);
+ sumArea+= TeGeometryArea(cell.box());
+ }
+ }while (flag);
+
+ area = sumArea;
+ delete portal;
+ return true;
+}
+
+
+bool TeGetLength(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabase* db, double& length)
+{
+ if((actRep != TePOLYGONS) && (actRep != TeLINES) && (actRep != TeCELLS) )
+ return false;
+
+ string Ids = getStringIds(actIdsIn);
+
+ TeDatabasePortal* portal = db->getPortal();
+
+ string sql = "SELECT * FROM " + actGeomTable;
+ sql += " WHERE object_id IN (" + Ids + ")";
+ sql += " ORDER BY object_id ASC ";
+
+ if((actRep == TePOLYGONS) && (portal->getDatabase()->dbmsName() != "PostGIS"))
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = false;
+ double sumLen = 0.;
+ do
+ {
+ if(actRep == TePOLYGONS)
+ {
+ TePolygon p;
+ flag = portal->fetchGeometry(p);
+
+ for(unsigned int i=0; i<p.size(); i++)
+ sumLen += TeLength(p[i]);
+ }
+ else if (actRep == TeLINES)
+ {
+ TeLine2D l;
+ flag = portal->fetchGeometry(l);
+ sumLen += TeLength(l);
+ }
+ else if (actRep == TeCELLS)
+ {
+ TeCell c;
+ flag = portal->fetchGeometry(c);
+
+ TePolygon p = TeMakePolygon(c.box());
+ sumLen += TeLength(p[0]);
+ }
+
+ }while (flag);
+
+ length = sumLen;
+ delete portal;
+ return true;
+}
+
+
+bool TeGetDistance(const string& actGeomTable, TeGeomRep actRep, Keys& IdsIn, TeDatabase* db, double& distance)
+{
+ string Ids = getStringIds(IdsIn);
+
+ TeDatabasePortal* portal = db->getPortal();
+
+ string sql = "SELECT * FROM " + actGeomTable;
+ sql += " WHERE object_id IN (" + Ids + ")";
+ sql += " ORDER BY object_id ASC ";
+
+ if((actRep == TePOLYGONS) && (portal->getDatabase()->dbmsName() != "PostGIS"))
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = false;
+ string lastObjId ="";
+ TeCoord2D coord1, coord2;
+ int step = 0;
+ do
+ {
+ TeCoord2D coord;
+ string objId;
+
+ if(actRep == TePOLYGONS)
+ {
+ TePolygon p;
+ flag = portal->fetchGeometry(p);
+ objId = p.objectId();
+ if(lastObjId==objId)
+ continue;
+ coord = TeFindCentroid(p);
+ }
+ else if (actRep == TeLINES)
+ {
+ TeLine2D l;
+ flag = portal->fetchGeometry(l);
+ objId = l.objectId ();
+ if(lastObjId==objId)
+ continue;
+ coord = TeFindCentroid(l);
+ }
+ else if (actRep == TePOINTS)
+ {
+ TePoint p;
+ flag = portal->fetchGeometry(p);
+ coord = p.location();
+ }
+ else if (actRep == TeCELLS)
+ {
+ TeCell c;
+ flag = portal->fetchGeometry(c);
+ objId = c.objectId ();
+ if(lastObjId==objId)
+ continue;
+ coord = TeFindCentroid(c);
+ }
+
+ if(step==0)
+ coord1 = coord;
+ else
+ coord2 = coord;
+
+ lastObjId = objId;
+ ++step;
+
+ }while (flag);
+
+ distance = TeDistance(coord1, coord2);
+ delete portal;
+ return true;
+}
+
+bool TeGetConvexHull(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeDatabase* db, TePolygonSet& convexHullSet)
+{
+ if(actRep != TePOLYGONS)
+ return false;
+
+ TeDatabasePortal* portal = db->getPortal();
+ string Ids = getStringIds(actIds);
+
+ string sql = "SELECT * FROM " + actGeomTable;
+ sql += " WHERE object_id IN ("+ Ids +")";
+ sql += " ORDER BY object_id ASC ";
+
+ if(portal->getDatabase()->dbmsName() != "PostGIS")
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ do
+ {
+ TePolygon poly, result;
+ flag = portal->fetchGeometry(poly);
+ TePolygon pol = TeConvexHull(poly);
+ result.add(pol[0]);
+ convexHullSet.add(result);
+ } while (flag);
+
+ delete portal;
+ return true;
+}
+
+bool TeGetCentroid(const string& actGeomTable, TeGeomRep actRep, TeDatabase* db, TePointSet& centroidSet, Keys& actIds, const string& actCollTable)
+{
+ TeDatabasePortal* portal = db->getPortal();
+ string Ids = getStringIds(actIds);
+
+ string select = " SELECT * ";
+ string from = " FROM " + actGeomTable;
+ string where = " WHERE 1=1 ";
+
+ if(!actCollTable.empty())
+ {
+ select += ", "+ actCollTable;
+ where += " AND object_id = c_object_id ";
+ }
+
+ //if empty it calculates the centroids to all geometries
+ if(!Ids.empty())
+ where += " AND object_id IN ("+ Ids +")";
+
+ string orderBy = " ORDER BY object_id ASC ";
+
+ if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")
+ orderBy += ", parent_id ASC, num_holes DESC ";
+
+ // ---- progress bar
+ int numSteps = 0;
+ string sqlProg = " SELECT COUNT(*) "+ from + where;
+ if(portal->query(sqlProg) && portal->fetchRow())
+ numSteps = portal->getInt(0);
+
+ portal->freeResult();
+
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(numSteps);
+ //------
+
+ string sql = select + from + where + orderBy;
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ string lastObjId ="";
+ int step = 0;
+ do
+ {
+ TeCoord2D coord;
+ string objId;
+
+ if(actRep == TePOLYGONS)
+ {
+ TePolygon p;
+ flag = portal->fetchGeometry(p);
+ objId = p.objectId();
+ if(lastObjId==objId)
+ continue;
+ coord = TeFindCentroid(p);
+ }
+ else if (actRep == TeLINES)
+ {
+ TeLine2D l;
+ flag = portal->fetchGeometry(l);
+ objId = l.objectId ();
+ if(lastObjId==objId)
+ continue;
+ coord = TeFindCentroid(l);
+ }
+ else if (actRep == TeCELLS)
+ {
+ TeCell c;
+ flag = portal->fetchGeometry(c);
+ objId = c.objectId ();
+ if(lastObjId==objId)
+ continue;
+ coord = TeFindCentroid(c);
+ }
+
+ lastObjId = objId;
+ TePoint point(coord);
+ point.objectId (objId);
+ centroidSet.add(point);
+
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ TeProgress::instance()->setProgress(step);
+ }
+ ++step;
+
+ } while (flag);
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ delete portal;
+ return true;
+}
+
+
+bool TeGetBuffer(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeDatabase* db, TePolygonSet& bufferSet, double dist)
+{
+
+ if(actIds.empty())
+ return false;
+
+ string Ids = getStringIds(actIds);
+
+ TeDatabasePortal* portal = db->getPortal();
+ if(!portal)
+ return false;
+
+ string sql = " SELECT * FROM " + actGeomTable;
+ sql += " WHERE object_id IN ("+ Ids +")";
+ sql += " ORDER BY object_id ASC ";
+ if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ bool res = true;
+ do
+ {
+ TePolygonSet polSet;
+
+ if(actRep == TePOINTS)
+ {
+ TePoint p;
+ TePolygon pol;
+ flag = portal->fetchGeometry(p);
+ res = TeBUFFERREGION::TeBufferRegion(p.location(), dist, 16, pol);
+ polSet.add (pol);
+ }
+
+ else if(actRep == TeLINES)
+ {
+ TeLine2D l;
+ flag = portal->fetchGeometry(l);
+ res = TeBUFFERREGION::TeBufferRegion(l, dist, 8, polSet);
+ }
+
+ else if(actRep == TePOLYGONS)
+ {
+ TePolygon p;
+ flag = portal->fetchGeometry(p);
+ res = TeBUFFERREGION::TeBufferRegion(p, dist, 8, polSet);
+ }
+
+ else if(actRep == TeCELLS)
+ {
+ TeCell c;
+ flag = portal->fetchGeometry(c);
+ res = TeBUFFERREGION::TeBufferRegion(TeMakePolygon(c.box()), dist, 8, polSet);
+ }
+
+ if(res)
+ {
+ for(unsigned int i=0; i<polSet.size(); i++)
+ bufferSet.add(polSet[i]);
+ }
+
+ } while (flag && res);
+
+ delete portal;
+ return true;
+}
+
+
+bool TeGetOverlay(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeDatabase* db, TeGeometryVect& geomVect, const short& operation)
+{
+ if((actIds.empty()) || (actRep!=TePOLYGONS && actRep!=TeCELLS))
+ return false;
+
+ string Ids = getStringIds(actIds);
+
+ TeDatabasePortal* portal = db->getPortal();
+ if(!portal)
+ return false;
+
+ string sql = " SELECT * FROM " + actGeomTable;
+ sql += " WHERE object_id IN ("+ Ids +")";
+ sql += " ORDER BY object_id ASC ";
+ if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")
+ sql += ", parent_id ASC, num_holes DESC ";
+
+ if(!portal->query(sql) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ bool flag = true;
+ TePolygonSet polSet1;
+
+ if(actRep == TePOLYGONS)
+ {
+ TePolygon p;
+ flag = portal->fetchGeometry(p);
+ polSet1.add (p);
+ }
+ else if(actRep == TeCELLS)
+ {
+ TeCell c;
+ flag = portal->fetchGeometry(c);
+ polSet1.add(TeMakePolygon(c.box()));
+ }
+
+ while (flag)
+ {
+ TePolygonSet polSet2, polInter;
+
+ if(actRep == TePOLYGONS)
+ {
+ TePolygon p;
+ flag = portal->fetchGeometry(p);
+ polSet2.add (p);
+ }
+
+ else if(actRep == TeCELLS)
+ {
+ TeCell c;
+ flag = portal->fetchGeometry(c);
+ polSet2.add(TeMakePolygon(c.box()));
+ }
+
+ if(operation==TeUNION)
+ {
+ if(!TeOVERLAY::TeUnion(polSet1, polSet2, polInter))
+ return false;
+ }
+ else if (operation==TeINTERSECTION)
+ {
+ if(!TeOVERLAY::TeIntersection(polSet1, polSet2, polInter))
+ return false;
+ }
+ else if (operation==TeDIFFERENCE)
+ {
+ if(!TeOVERLAY::TeDifference(polSet1, polSet2, polInter))
+ return false;
+ }
+
+ polSet1 = polInter;
+ }
+
+ TeGeometry* geom;
+ TePolygonSet* pol = new TePolygonSet();
+ *pol = polSet1;
+ geom = pol;
+
+ geomVect.push_back (geom);
+ delete portal;
+ return true;
+}
+
+
+TeRaster*
+TeMask (TeRaster* rasterIn, TePolygon& poly, TeStrategicIterator st)
+{
+ TeRasterParams paramsInter(rasterIn->params());
+
+ paramsInter.fileName_ = "";
+ paramsInter.decoderIdentifier_ = "MEM";
+ paramsInter.mode_ = 'c';
+
+ TeRaster* rasterInter = new TeRaster(paramsInter);
+ if (!rasterInter->init())
+ return 0;
+
+ TeRaster::iteratorPoly it = rasterIn->begin(poly, st);
+ int nlines = it.nLinesInPoly();
+ int ncols = it.nColsInPoly();
+ while(!it.end())
+ {
+ int lin = it.currentLine();
+ int col = it.currentColumn();
+ int nbands = it.nBands();
+ vector<double> vals;
+ vals = (*(TeRaster::iterator)it);
+ for(int i=0; i<nbands; i++)
+ rasterInter->setElement (col, lin, vals[i], i);
+ ++it;
+ }
+
+ TeRasterParams paramsOut(paramsInter);
+ paramsInter.mode_ = 'c';
+
+ if((st==TeBoxPixelIn) || (st==TeBBoxPixelInters))
+ {
+ TeCoord2D pll = poly.box().lowerLeft();
+ TeCoord2D rll = rasterIn->index2Coord(pll);
+ pll = rasterIn->coord2Index(TeCoord2D(TeRound(rll.x()),TeRound(rll.y())));
+
+ paramsOut.ncols_ = ncols;
+ paramsOut.nlines_= nlines;
+ paramsOut.lowerLeftResolutionSize(pll.x(),pll.y(),paramsOut.resx_,paramsOut.resy_,ncols,nlines,true);
+ }
+ else if((st==TeBoxPixelOut) || (st==TeBBoxPixelNotInters))
+ {
+ TeBox box = paramsInter.boundingBox();
+ double resx = paramsInter.resx_;
+ double resy = paramsInter.resy_;
+ paramsOut.boundingBoxResolution(box.x1()-resx, box.y1()-resy, box.x2()+resx, box.y2()+resy,resx,resy);
+ }
+
+ TeRaster* rasterOut = new TeRaster(paramsOut);
+
+ TeRasterRemap remap(rasterInter, rasterOut);
+ if (!remap.apply())
+ return rasterIn;
+
+ delete rasterInter;
+ return rasterOut;
+}
+
+
+
+
+
diff --git a/src/terralib/kernel/TeSpatialOperations.h b/src/terralib/kernel/TeSpatialOperations.h
new file mode 100644
index 0000000..802db63
--- /dev/null
+++ b/src/terralib/kernel/TeSpatialOperations.h
@@ -0,0 +1,206 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeSpatialOperations.h
+ This file contains functions to spatial operations with
+ geographical objects that are in a SGBD
+*/
+
+#ifndef __TERRALIB_INTERNAL_SPATIALOPERATIONS_H
+#define __TERRALIB_INTERNAL_SPATIALOPERATIONS_H
+
+#include "TeDatabase.h"
+#include "TeRaster.h"
+
+//! Keep the selected geometries in the canvas
+typedef vector<TeGeometry*> TeSelectedGeom;
+
+//! Return a string with the identifications of the selected geometries
+string getStringIds(Keys& IdsIn);
+
+
+//! Return a portal with the geometries of a spatial table that have a topological relation with specifics geometries of this spatial table
+/*!
+ Calculate the topological relation between all geometries of a spatial table and
+ specifics geometries of this spatial table
+ \param actGeomTable spatial table name that contains all the geometries
+ \param actRep geometrical representation of the spatial table
+ \param actIdsIn identifications of the specifics geometries (object_id)
+ \param portal returned with the resultants geometries
+ \param relation topological relation that will be computed
+ \param actColTable collection table name that contains a set of geometries of the spatial table
+*/
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn,
+ TeDatabasePortal *portal, int relation, const string& actColTable="");
+
+
+//! Return a portal with the geometries of a spatial table that have a topological relation with specifics geometries of other spatial table
+/*!
+ Calculate the topological relation between all geometries of a spatial table and
+ specifics geometries of other spatial table
+ \param actGeomTable first spatial table name that contains the specifics geometries
+ \param actRep geometrical representation of the first spatial table
+ \param actIdsIn identifications of specifics geometries of the first spatial table (object_id)
+ \param visGeomTable second spatial table name that contains the others geometries
+ \param visRep geometrical representation of the second spatial table
+ \param portal returned with the resultants geometries
+ \param relation topological relation that will be computed
+ \param visColTable collection table name that contains a set of geometries of the second spatial table
+*/
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn,
+ const string& visGeomTable, TeGeomRep visRep, TeDatabasePortal *portal,
+ int relation, const string& visColTable="");
+
+
+//! Return a portal with the geometries of a spatial table that have a topological relation with a specific geometry
+/*!
+ Calculate the topological relation between all geometries of a spatial table and a specific geometry
+ \param actGeomTable spatial table name that contains the geometries
+ \param actRep geometrical representation of the spatial table
+ \param geom a specific geometry
+ \param portal returned with the resultants geometries
+ \param relation topological relation that will be computed
+ \param actCollTable collection table name that contains a set of geometries of the spatial table
+*/
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom,
+ TeDatabasePortal *portal, int relation, const string& actCollTable="");
+
+
+//! Return the identications of the geometries of a spatial table that have a topological relation with specifics geometries of this spatial table
+/*!
+ Calculate the topological relation between all geometries of a spatial table and
+ specifics geometries of this spatial table
+ \param actGeomTable spatial table name that contains all the geometries
+ \param actRep geometrical representation of the spatial table
+ \param actIdsIn identifications of the specifics geometries (object_id)
+ \param actIdsOut returned with the identications of the resultants geometries (object_id)
+ \param db a TeDatabase pointer
+ \param relation topological relation that will be computed
+ \param actCollTable collection table name that contains a set of geometries of the spatial table
+*/
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn,
+ Keys& actIdsOut, TeDatabase* db, int relation, const string& actCollTable="");
+
+
+//! Return the identications of the geometries of a spatial table that have a topological relation with specifics geometries of other spatial table
+/*!
+ Calculate the topological relation between all geometries of a spatial table and
+ specifics geometries of other spatial table
+ \param actGeomTable first spatial table name that contains the specifics geometries
+ \param actRep geometrical representation of the first spatial table
+ \param actIdsIn identifications of specifics geometries of the first spatial table (object_id)
+ \param visGeomTable second spatial table name that contains the others geometries
+ \param visRep geometrical representation of the second spatial table
+ \param visIdsOut returned with the identications of the resultants geometries (object_id)
+ \param db a TeDatabase pointer
+ \param relation topological relation that will be computed
+ \param visCollTable collection table name that contains a set of geometries of the second spatial table
+*/
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn,
+ const string& visGeomTable, TeGeomRep visRep, Keys& visIdsOut,
+ TeDatabase* db, int relation, const string& visCollTable="");
+
+//! Return the identications of the geometries of a spatial table that have a topological relation with a specific geometry
+/*!
+ Calculate the topological relation between all geometries of a spatial table and a specific geometry
+ \param actGeomTable spatial table name that contains the geometries
+ \param actRep geometrical representation of the spatial table
+ \param geom a specific geometry
+ \param actIdsOut returned with the identications of the resultants geometries (object_id)
+ \param db a TeDatabase pointer
+ \param relation topological relation that will be computed
+ \param actCollTable collection table name that contains a set of geometries of the spatial table
+*/
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom,
+ Keys& actIdsOut, TeDatabase* db, int relation, const string& actCollTable="");
+
+
+//! Returns the geometries of a geometric table (actGeomTable) that are within a specific distance from a point in memory
+/*!
+ \param actGeomTable geometric table name
+ \param actRep geometric representation of the actGeomTable table
+ \param point a point in memory
+ \param IdsDistOut structure that will contain the identifiers of the resulted geometries and their distances
+ \param db a TeDatabase pointer
+ \param max_dist maximum distance
+ \param actCollTable collection table name associated with the actGeomTable table
+*/
+bool TeGetWithinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& point, KeysToDist& IdsDistOut,
+ TeDatabase* db, const double& max_dist, const string& actCollTable="");
+
+
+//! Return the area of some specifics geometries of a spatial table
+/*!
+ \param actGeomTable spatial table name that contains the geometries
+ \param actRep geometrical representation of the spatial table
+ \param actIdsIn identifications of the specifics geometries (object_id)
+ \param db a TeDatabase pointer
+ \param area area returned
+*/
+bool TeGetArea(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabase* db, double& area);
+
+
+//! Return the length of some specifics geometries of a spatial table
+bool TeGetLength(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabase* db, double& length);
+
+
+//! Return the distance between two geometries
+bool TeGetDistance(const string& actGeomTable, TeGeomRep actRep, Keys& IdsIn, TeDatabase* db, double& distance);
+
+//! Return the convexhull geometries of specifics geometries of a spatial table
+/*!
+ \param actGeomTable spatial table name that contains the geometries
+ \param actRep geometrical representation of the spatial table
+ \param actIds identifications of the specifics geometries (object_id)
+ \param db a TeDatabase pointer
+ \param convexHullSet the convexhull geometries returned
+*/
+bool TeGetConvexHull(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeDatabase* db,
+ TePolygonSet& convexHullSet);
+
+
+//! Return the centroids of specifics geometries of a spatial table
+bool TeGetCentroid(const string& actGeomTable, TeGeomRep actRep, TeDatabase* db, TePointSet& centroidSet,
+ Keys& actIds, const string& actCollTable="");
+
+
+//! Return the buffer
+bool TeGetBuffer(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeDatabase* db,
+ TePolygonSet& bufferSet, double dist);
+
+
+//! Return intersection
+bool TeGetOverlay(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeDatabase* db,
+ TeGeometryVect& geomVect, const short& operation);
+
+/*!
+ \brief Clip a raster from a polygon. Return the clipped raster
+ \param rasterIn TeRaster pointer that will be clipped
+ \param poly polygon that defines the clipping
+ \param st strategic to the iterator of the raster
+*/
+TeRaster*
+TeMask (TeRaster* rasterIn, TePolygon& poly, TeStrategicIterator st);
+
+#endif
+
diff --git a/src/terralib/kernel/TeStatistics.h b/src/terralib/kernel/TeStatistics.h
new file mode 100644
index 0000000..e090a78
--- /dev/null
+++ b/src/terralib/kernel/TeStatistics.h
@@ -0,0 +1,664 @@
+//***********************************************************************
+// TerraLib is a GIS Classes and Functions Library that
+// strongly explores Spatial Database Technologies
+//
+// Copyright � 2002 INPE and Tecgraf/PUC-Rio.
+//
+// This library is free software; you can redistribute it
+// and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation
+// version 2.1.(http://www.opensource.org/licenses/lgpl-license.php)
+//
+//
+//
+// Send questions or suggestions about the TerraLib Project
+// to terralib at dpi.inpe.br .
+//**************************************************************************//
+/*! \file TeStatistics.h
+ This file contains functions for calculate statistics
+*/
+
+#ifndef TeStatistics_H
+#define TeStatistics_H
+
+#include "TeDataTypes.h"
+
+#include <string>
+#include <map>
+
+using namespace std;
+
+//! vector of statistics
+typedef vector<double> stats;
+
+
+/*! \struct TeStatisticsDimension
+ Associate a statistics set for each dimension
+*/
+struct TeStatisticsDimension
+{
+ int dimension_;
+ TeStatisticValMap stat_;
+
+ TeStatisticsDimension(int d, TeStatisticValMap& st):
+ dimension_(d),
+ stat_(st)
+ {}
+};
+
+//! vector of the statistics associated with the dimensions
+typedef vector<TeStatisticsDimension> TeStatisticsDimensionVect;
+
+//! map each value to its count: histogram
+typedef map<double, int> TeHistogram;
+
+
+/*! \function TeCalculateHistogram
+ \brief Calculate the histrogram of a set of values kept in a data structure
+ \param itBegin the iterator to the begin of the data structure
+ \param itEnd the iterator to the end of the data structure
+ \param stat returned histogram
+*/
+template<typename T>
+bool TeCalculateHistogram(const T& itBegin, const T& itEnd, TeHistogram& histOut)
+{
+ T it = itBegin;
+
+ //initialization
+ while(it!=itEnd)
+ {
+ double val = (*it);
+ histOut[val] = 0;
+ it++;
+ }
+
+ it= itBegin;
+
+ //calcule histogram
+ while(it!=itEnd)
+ {
+ double val = (*it);
+ histOut[val]++;
+ it++;
+ }
+
+ return true;
+}
+
+/*! \function TeCalculateStatistics
+ \brief Calculate the statistics of a specific dimension of a data structure
+ \param itBegin the iterator to the begin of the data structure
+ \param itEnd the iterator to the end of the data structure
+ \param stat returned statistics
+ \param dim the dimension of the data structure
+*/
+template<typename It>
+bool TeCalculateStatistics(const It& itBegin, const It& itEnd, TeStatisticValMap& stat, int dim)
+{
+ double sum, mean, minValue, maxValue, variance, assim,
+ curtose, stDev, coefVar, amplitude, moda, median;
+ sum=mean=variance=assim=curtose=stDev=coefVar=amplitude=0.0;
+
+ minValue = TeMAXFLOAT;
+ maxValue = TeMINFLOAT;
+
+ vector<double> values;
+ int count=0;
+ int countTotal = 0;
+ It itt = itBegin;
+ while(itt != itEnd)
+ {
+ double val;
+ val = (*itt)[dim];
+
+ if(val!=TeMAXFLOAT) // MAXFLOAT is considered invalid value
+ {
+ values.push_back (val);
+ sum += val;
+
+ if(minValue>val)
+ minValue = val;
+ if(maxValue<val)
+ maxValue = val;
+
+ ++count;
+ mean = sum/count;
+ }
+
+ ++itt;
+ ++countTotal;
+ }
+
+ for(int i=0; i<count; i++)
+ {
+ double v= values[i];
+ variance += pow((v-mean),2);
+ assim += pow((v-mean),3);
+ curtose += pow((v-mean),4);
+ }
+
+ if(!count)
+ return false;
+
+ variance /= count;
+ stDev = pow(variance,0.5);
+ assim /= count;
+ assim /= pow(stDev,3);
+ curtose /= count;
+ curtose /= pow(stDev,4);
+
+ coefVar = (100*stDev)/mean;
+ amplitude = maxValue-minValue;
+
+ sort(values.begin(), values.end());
+
+ //calculate median
+ if((count%2)==0)
+ median = (values[(count/2)]+values[(count/2-1)])/2;
+ else
+ median = values[(count-1)/2];
+
+ //calculate the mode
+ TeHistogram histog;
+ TeCalculateHistogram(values.begin(),values.end(), histog);
+
+ TeHistogram::iterator itHist = histog.begin();
+ int nCount=0;
+ while(itHist!=histog.end())
+ {
+ int hCount = itHist->second;
+ if (hCount > nCount)
+ {
+ nCount = hCount;
+ moda = itHist->first;
+ }
+ itHist++;
+ }
+
+ //fill results
+ stat[TeCOUNT] = countTotal;
+ stat[TeVALIDCOUNT] = count;
+ stat[TeMINVALUE] = minValue;
+ stat[TeMAXVALUE] = maxValue;
+ stat[TeSUM] = sum;
+ stat[TeMEAN] = mean;
+ stat[TeSTANDARDDEVIATION] = stDev;
+ stat[TeVARIANCE] = variance;
+ stat[TeSKEWNESS] = assim;
+ stat[TeKURTOSIS] = curtose;
+ stat[TeAMPLITUDE] = amplitude;
+ stat[TeMEDIAN] = median;
+ stat[TeVARCOEFF] = coefVar;
+ stat[TeMODE] = moda;
+
+ return true;
+}
+
+
+/*! \function TeCalculateStatistics
+ \brief Calculate the statistics of a string data structure
+ \param itBegin the iterator to the begin of the data structure
+ \param itEnd the iterator to the end of the data structure
+ \param stat returned string statistics
+*/
+template<typename It>
+bool TeCalculateStatistics(const It& itBegin, const It& itEnd, TeStatisticStringValMap& stat)
+{
+ string min, max, val;
+ int count = 0;
+
+ It it = itBegin;
+ int totalCount = 0;
+
+ if(it != itEnd)
+ min = max = (*it);
+ while(it != itEnd)
+ {
+ val = (*it);
+ if(val.empty() == false)
+ {
+ count++;
+ min = MIN(min, val);
+ max = MAX(max, val);
+ }
+ ++it;
+ ++totalCount;
+ }
+
+ stat[TeMINVALUE] = min;
+ stat[TeMAXVALUE] = max;
+ stat[TeCOUNT] = Te2String(totalCount);
+ stat[TeVALIDCOUNT] = Te2String(count);
+ return true;
+}
+
+
+/*! \function TeCalculateStatistics
+ \brief Calculate the statistics of a data structure
+ \param itBegin the iterator to the begin of the data structure
+ \param itEnd the iterator to the end of the data structure
+ \param stat returned statistics
+*/
+template<typename It>
+bool TeCalculateStatistics(const It& itBegin, const It& itEnd, TeStatisticValMap& stat)
+{
+ double sum, mean, minValue, maxValue, variance, assim,
+ curtose, stDev, coefVar, amplitude, moda, median;
+ sum=mean=variance=assim=curtose=stDev=coefVar=amplitude=0.0;
+
+ minValue = TeMAXFLOAT;
+ maxValue = TeMINFLOAT;
+
+ vector<double> values;
+
+ int totalCount = 0;
+ int count=0;
+ It itt = itBegin;
+ while(itt != itEnd)
+ {
+ double val = (*itt);
+ if(val != TeMAXFLOAT) // MAXFLOAT is considered invalid value
+ {
+ values.push_back (val);
+ sum += val;
+ minValue = MIN(minValue, val);
+ maxValue = MAX(maxValue, val);
+ }
+
+ ++itt;
+ ++totalCount;
+ }
+
+ count = values.size();
+ mean = sum/count;
+
+ for(int i=0; i<count; i++)
+ {
+ double v= values[i];
+ variance += pow((v-mean),2);
+ assim += pow((v-mean),3);
+ curtose += pow((v-mean),4);
+ }
+
+ if(!count)
+ return false;
+
+ variance /= count;
+ stDev = pow(variance,0.5);
+ assim /= count;
+ assim /= pow(stDev,3);
+ curtose /= count;
+ curtose /= pow(stDev,4);
+
+ coefVar = (100*stDev)/mean;
+ amplitude = maxValue-minValue;
+
+ sort(values.begin(), values.end());
+
+ //calculate median
+ if((count%2)==0)
+ median = (values[(count/2)]+values[(count/2-1)])/2;
+ else
+ median = values[(count-1)/2];
+
+ //calculate the mode
+ TeHistogram histog;
+ TeCalculateHistogram(values.begin(),values.end(), histog);
+
+ TeHistogram::iterator itHist = histog.begin();
+ int nCount=0;
+ while(itHist!=histog.end())
+ {
+ int hCount = itHist->second;
+ if (hCount > nCount)
+ {
+ nCount = hCount;
+ moda = itHist->first;
+ }
+ itHist++;
+ }
+
+ //fill results
+ stat[TeVALIDCOUNT] = count;
+ stat[TeCOUNT] = totalCount;
+ stat[TeMINVALUE] = minValue;
+ stat[TeMAXVALUE] = maxValue;
+ stat[TeSUM] = sum;
+ stat[TeMEAN] = mean;
+ stat[TeSTANDARDDEVIATION] = stDev;
+ stat[TeVARIANCE] = variance;
+ stat[TeSKEWNESS] = assim;
+ stat[TeKURTOSIS] = curtose;
+ stat[TeAMPLITUDE] = amplitude;
+ stat[TeMEDIAN] = median;
+ stat[TeVARCOEFF] = coefVar;
+ stat[TeMODE] = moda;
+
+ return true;
+}
+
+
+/*! \function TeCalculateStatistics
+ \brief Calculate the statistics of all dimensions of a data structure
+ \param itBegin the iterator to the begin of the data structure
+ \param itEnd the iterator to the end of the data structure
+ \param stat returned statistics
+*/
+template<typename It>
+bool TeCalculateStatistics(It& itBegin, It& itEnd, TeStatisticsDimensionVect& stat)
+{
+
+ vector<double> sum, mean, minValue, maxValue, variance, assim, curtose,
+ stDev, coefVar, amplitude, moda, median;
+
+ int nb = itBegin.nBands();
+
+ //initialization of the vetors
+ for (int i=0; i<nb; i++)
+ {
+ sum.push_back(0.0);
+ mean.push_back(0.0);
+ variance.push_back(0.0);
+ assim.push_back(0.0);
+ curtose.push_back(0.0);
+ stDev.push_back(0.0);
+ coefVar.push_back(0.0);
+ amplitude.push_back(0.0);
+ median.push_back (0.0);
+ moda.push_back (0.0);
+ minValue.push_back(TeMAXFLOAT);
+ maxValue.push_back(TeMINFLOAT);
+ }
+
+ map<int,stats> bandValues;
+
+ int count=0;
+ It itt = itBegin;
+
+ while(itt != itEnd)
+ {
+ for (int j=0; j<nb; j++)
+ {
+ double val = itt.operator* (j);
+ bandValues[j].push_back(val);
+ sum[j] += val;
+
+ if(minValue[j]>val)
+ minValue[j] = val;
+ if(maxValue[j]<val)
+ maxValue[j] = val;
+
+ int size = bandValues[j].size();
+ mean[j] = sum[j]/size;
+ }
+
+ ++itt;
+ ++count;
+ }
+
+ if(!count)
+ return false;
+
+ for (int jj=0; jj<nb; jj++)
+ {
+ for(int i=0; i<count; i++)
+ {
+ double v = bandValues[jj][i];
+ variance[jj] += pow((v-mean[jj]),2);
+ assim[jj] += pow((v-mean[jj]),3);
+ curtose[jj] += pow((v-mean[jj]),4);
+ }
+
+ variance[jj] /= count;
+ stDev[jj] = pow(variance[jj],0.5);
+ assim[jj] /= count;
+ assim[jj] /= pow(stDev[jj],3);
+ curtose[jj] /= count;
+ curtose[jj] /= pow(stDev[jj],4);
+
+ coefVar[jj] = (100*stDev[jj])/mean[jj];
+ amplitude[jj] = maxValue[jj]-minValue[jj];
+
+ sort(bandValues[jj].begin(), bandValues[jj].end());
+
+ //calculate median
+ if((count%2)==0)
+ median[jj] = ((bandValues[jj][(count/2)])+(bandValues[jj][(count/2-1)]))/2;
+ else
+ median[jj] = bandValues[jj][(count-1)/2];
+
+ //calculate the mode
+ TeHistogram histog;
+ TeCalculateHistogram(bandValues[jj].begin(),bandValues[jj].end(), histog);
+
+ TeHistogram::iterator itHist = histog.begin();
+ int nCount=0;
+ while(itHist!=histog.end())
+ {
+ int hCount = itHist->second;
+ if (hCount > nCount)
+ {
+ nCount = hCount;
+ moda[jj] = itHist->first;
+ }
+ itHist++;
+ }
+
+ //fill results
+ TeStatisticValMap statVal;
+
+ statVal[TeCOUNT] = count;
+ statVal[TeMINVALUE] = minValue[jj];
+ statVal[TeMAXVALUE] = maxValue[jj];
+ statVal[TeSUM] = sum[jj];
+ statVal[TeMEAN] = mean[jj];
+ statVal[TeSTANDARDDEVIATION] = stDev[jj];
+ statVal[TeVARIANCE] = variance[jj];
+ statVal[TeSKEWNESS] = assim[jj];
+ statVal[TeKURTOSIS] = curtose[jj];
+ statVal[TeAMPLITUDE] = amplitude[jj];
+ statVal[TeMEDIAN] = median[jj];
+ statVal[TeVARCOEFF] = coefVar[jj];
+ statVal[TeMODE] = moda[jj];
+
+ TeStatisticsDimension statBand(jj, statVal);
+ stat.push_back(statBand);
+ }
+
+ return true;
+}
+
+
+//! Returns the sum of the elements of a specific dimension
+template <typename It>
+double TeSum (It begin, It end, int dim)
+{
+ double sum = 0.;
+ while ( begin != end)
+ {
+ if(((*begin)[dim])!= TeMAXFLOAT) // MAXFLOAT is considered invalid value
+ sum += (*begin)[dim];
+
+ ++begin;
+ }
+ return sum;
+}
+
+
+//! Return the sum of the elements
+template <typename It>
+double TeSum (It begin, It end)
+{
+ double sum = 0.;
+ while ( begin != end)
+ {
+ if((*begin)!= TeMAXFLOAT) // MAXFLOAT is considered invalid value
+ sum += (*begin);
+
+ ++begin;
+ }
+ return sum;
+}
+
+
+//! calculates the mean (first moment) of the elements of a specific dimension
+template <typename It>
+double TeFirstMoment (It begin, It end, int dim)
+{
+ int number = 0;
+ double mean = 0.;
+ while (begin != end)
+ {
+ if(((*begin)[dim])!= TeMAXFLOAT) // MAXFLOAT is considered invalid value
+ {
+ mean += (*begin)[dim];
+ number++;
+ }
+ ++begin;
+ }
+ return mean /= number;
+}
+
+
+//! calculates the mean (first moment) of the elements
+template <typename It>
+double TeFirstMoment (It begin, It end)
+{
+ int number = 0;
+ double mean = 0.;
+ while (begin != end)
+ {
+ if((*begin)!= TeMAXFLOAT) // MAXFLOAT is considered invalid value
+ {
+ mean += (*begin);
+ number++;
+ }
+ begin++;
+ }
+ return mean /= number;
+}
+
+
+//! calculates the second moment
+template <typename It>
+double TeSecondMoment (It begin, It end, double mean)
+{
+ int number = 0;
+ double SSD = 0; //sum of squares of desviation
+
+ while (begin != end)
+ {
+ if((*begin)!= TeMAXFLOAT) // MAXFLOAT is considered invalid value
+ {
+ SSD += pow(( (*begin) - mean), 2);
+ number++;
+ }
+ begin++;
+ }
+ return SSD /= number;
+}
+
+
+//! calculates the second moment
+template <typename It>
+double TeSecondMoment (It begin, It end, double mean, int dim)
+{
+ int number = 0;
+ double SSD = 0; //sum of squares of desviation
+
+ while (begin != end)
+ {
+ if(((*begin)[dim])!= TeMAXFLOAT) // MAXFLOAT is considered invalid value
+ {
+ SSD += pow(((*begin)[dim] - mean), 2);
+ number++;
+ }
+ ++begin;
+ }
+ return SSD /= number;
+}
+
+
+
+//! calculates the vector with the means of the attributs
+template <typename It, typename T>
+bool TeMeanVector ( It begin, It end, T& result)
+{
+ int i = 0;
+ int dim = result.size();
+ T soma;
+
+ for (int m = 0; m < dim ; m++)
+ soma.push_back(0.);
+
+ while (begin != end)
+ {
+ for( int j = 0; j < dim; j++)
+ {
+ if(((*begin)[j]) != TeMAXFLOAT) // MAXFLOAT is considered invalid value
+ {
+ soma[j]+= (*begin)[j];
+ i++;
+ }
+ else
+ soma[j]= TeMAXFLOAT;
+ }
+ begin++;
+ }
+
+ for (int k = 0; k < dim; k++)
+ {
+ if(soma[k] != TeMAXFLOAT)
+ result[k] = soma[k]/i;
+ else
+ result[k] = TeMAXFLOAT;
+ }
+
+ return true;
+}
+
+//! calculates the deviations in relation to mean
+template <typename It>
+bool TeDeviation ( It begin, It end, It result, double mean)
+{
+ while (begin != end)
+ {
+ if((*begin) != TeMAXFLOAT) // MAXFLOAT is considered invalid value
+ *result = double(*begin) - mean;
+ else
+ *result = TeMAXFLOAT;
+
+ begin++; result++;
+ }
+ return true;
+}
+
+
+//! calculates the deviations in relation to mean
+// Keep the result in the ObjsSet
+template <typename iteratorSet>
+bool TeDeviation ( iteratorSet begin, iteratorSet end, double mean, int index=0)
+{
+ while (begin != end)
+ {
+ double result;
+
+ if(((*begin)[index]) != TeMAXFLOAT) // MAXFLOAT is considered invalid value
+ result = ((*begin)[index]) - mean;
+ else
+ result = TeMAXFLOAT;
+
+ TeAttributeRep attrRep;
+ attrRep.name_ = "Z";
+ attrRep.type_ = TeREAL;
+
+ (*begin).addProperty(result, attrRep, false);
+
+ ++begin;
+ }
+ return true;
+}
+
+
+#endif
+
diff --git a/src/terralib/kernel/TeStdFile.cpp b/src/terralib/kernel/TeStdFile.cpp
new file mode 100644
index 0000000..86d8f8b
--- /dev/null
+++ b/src/terralib/kernel/TeStdFile.cpp
@@ -0,0 +1,60 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeStdFile.h"
+#include "TeException.h"
+
+
+
+// -- Constructor
+
+TeStdFile::TeStdFile ( const string& name, const char* mode ):
+ file_ ( 0 ), fileName_ ( name ), mode_ ( mode )
+{
+ const char* inputFile = fileName_.c_str();
+ if ( name.size() <= 1 )
+ throw TeException ( EMPTY_FILE_NAME, name, false );
+
+ if ( ( file_ = fopen( inputFile, mode ) ) == 0 )
+ {
+ bool hasErrno = true;
+ throw TeException ( CANNOT_OPEN_FILE, name, hasErrno );
+ }
+}
+
+TeStdFile::~TeStdFile()
+{
+ if(file_ )
+ fclose(file_);
+}
+
+void
+TeStdFile::rewind()
+{
+ if (file_)
+ fseek(file_,0,0);
+}
diff --git a/src/terralib/kernel/TeStdFile.h b/src/terralib/kernel/TeStdFile.h
new file mode 100644
index 0000000..74396fe
--- /dev/null
+++ b/src/terralib/kernel/TeStdFile.h
@@ -0,0 +1,81 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_STDFILE_H
+#define __TERRALIB_INTERNAL_STSFILE_H
+
+#include <stdio.h>
+#include <string>
+using namespace std;
+
+//! A class for handling "stdio" files
+/* Provide support for using a file as a class, and
+ throws exceptions if things go wrong
+ \sa TeException TeAsciiFile
+*/
+class TeStdFile {
+public:
+
+//! Simple constructor taking the file name and the mode of oppening
+ TeStdFile(const string& name, const char* mode = "r");
+
+ virtual ~TeStdFile();
+
+//! Return true if the file pointer is not at the end of file
+ bool isNotAtEOF()
+ {
+ if ( feof ( file_ ) != 0 )
+ return false;
+ return true;
+ }
+
+// name
+ string name ()
+ { return fileName_; }
+
+// -- operator ()
+ operator FILE*() { return file_; }
+
+// -- returns the file pointer
+ FILE* FilePtr() { return file_; }
+
+ void rewind();
+
+protected:
+
+// -- File pointer
+
+ FILE *file_;
+ string fileName_;
+ string mode_;
+
+private:
+
+// No copy allowed
+ TeStdFile(const TeStdFile&);
+ TeStdFile& operator=(const TeStdFile&);
+
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeStdIOProgress.h b/src/terralib/kernel/TeStdIOProgress.h
new file mode 100644
index 0000000..8401582
--- /dev/null
+++ b/src/terralib/kernel/TeStdIOProgress.h
@@ -0,0 +1,60 @@
+#ifndef TeSTDIOPROGRESS_H
+#define TeSTDIOPROGRESS_H
+
+#include "TeProgressBase.h"
+#include <iostream>
+
+class TeStdIOProgress : public TeProgressBase
+{
+public:
+
+ //! Constructor
+ TeStdIOProgress() :
+ totsteps(0),
+ nsteps(0),
+ curstep(-1)
+ {}
+
+ //! Destructor
+ ~TeStdIOProgress() {}
+
+ //! Sets the total number of steps to n
+ void setTotalSteps(int n) { totsteps = n; }
+
+ //! Sets the current amount of progress made to n
+ void setProgress(int n)
+ {
+ if (totsteps > 0)
+ {
+ int aux = (int)((n*100)/totsteps);
+ if (aux != curstep)
+ {
+ curstep = aux;
+ cout << curstep << "% ";
+ cout.flush();
+ }
+ }
+ }
+
+ //! Resets the progress interface
+ void reset() { totsteps = nsteps = 0; curstep = -1; }
+
+ //! Resets the progress dialog
+ void cancel() {};
+
+ //! Sets the label's text
+ void setMessage(const string& text) { cout << endl << text << endl;}
+
+ //! Returns true whether the process was cancelled
+ bool wasCancelled() { return false; }
+
+ //! Sets the caption associated to the progress interface
+ void setCaption(const string& /*cap*/) {};
+
+private:
+ int totsteps;
+ int nsteps;
+ int curstep;
+
+};
+#endif
diff --git a/src/terralib/kernel/TeTable.cpp b/src/terralib/kernel/TeTable.cpp
new file mode 100644
index 0000000..24f868b
--- /dev/null
+++ b/src/terralib/kernel/TeTable.cpp
@@ -0,0 +1,348 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeTable.h"
+#include "TeUtils.h"
+#include <iostream>
+
+using namespace std;
+
+
+string tableJoin(TeAttrTableVector& vecTable, string firstTable, string attrLink)
+{
+ string parClause = "";
+ string fromResult = "";
+ TeAttrTableVector::iterator it;
+
+ if(firstTable.empty())
+ {
+ //find the first static table
+ it = vecTable.begin();
+ while(it!=vecTable.end())
+ {
+ if((*it).tableType() != TeAttrExternal)
+ {
+ firstTable = (*it).name();
+ attrLink = (*it).linkName();
+ break;
+ }
+ ++it;
+ }
+ }
+
+ //if don�t exist a table static or temporal
+ if(firstTable.empty() || attrLink.empty())
+ return "";
+
+ fromResult += firstTable;
+ it = vecTable.begin();
+
+ while(it!=vecTable.end())
+ {
+ if( ((*it).name()!=firstTable) && ((*it).tableType()!=TeAttrExternal))
+ {
+ fromResult += " LEFT JOIN "+ (*it).name() +" ON "+ firstTable;
+ fromResult += "."+ attrLink +" = "+ (*it).name() +"."+ (*it).linkName() +")";
+ parClause += "(";
+ }
+
+ else if ((*it).name()!=firstTable)
+ {
+ int idTableStatic = (*it).relatedTableId();
+ string colTableStatic = (*it).relatedAttribute();
+ string nameTableStatic;
+
+ //verify if static table is in the vector of the attribute tables
+ for(unsigned int j=0; j<vecTable.size(); j++)
+ {
+ if(vecTable[j].id()==idTableStatic)
+ {
+ nameTableStatic = vecTable[j].name();
+ break;
+ }
+ }
+
+ if(nameTableStatic.empty())
+ return "";
+
+ fromResult += " LEFT JOIN "+ (*it).name() +" ON "+ nameTableStatic +"."+ colTableStatic;
+ fromResult += " = " + (*it).name() +"."+ (*it).linkName() +")";
+ parClause += "(";
+ }
+
+ ++it;
+ }
+
+ return (parClause + fromResult);
+}
+
+
+// ---- Handle class - TeTable
+
+TeTable::TeTable():
+ id_(-1),
+ name_(""),
+ type_(TeAttrStatic),
+ order_(-1),
+ attLink_(""),
+ attUnique_(""),
+ separator_(','),
+ attInitialTime_(""),
+ attFinalTime_(""),
+ attTimeUnit_(TeSECOND),
+ relatedTableId_(-1),
+ relatedAttribute_("")
+{
+ pImpl_ = new TeTableImpl;
+ pImpl_->refCount_ = 1;
+}
+
+TeTable::TeTable(const string& name):
+ id_(-1),
+ name_(name),
+ type_(TeAttrStatic),
+ order_(-1),
+ attLink_(""),
+ attUnique_(""),
+ separator_(','),
+ attInitialTime_(""),
+ attFinalTime_(""),
+ attTimeUnit_(TeSECOND),
+ relatedTableId_(-1),
+ relatedAttribute_("")
+{
+ pImpl_ = new TeTableImpl;
+ pImpl_->refCount_ = 1;
+}
+
+TeTable::TeTable(const string& name, const TeAttributeList& attList, const string& uniqueName,
+ const string& linkName, TeAttrTableType tableType):
+ id_(-1),
+ name_(name),
+ type_(tableType),
+ order_(-1),
+ attList_(attList),
+ attLink_(linkName),
+ attUnique_(uniqueName),
+ separator_(','),
+ attInitialTime_(""),
+ attFinalTime_(""),
+ attTimeUnit_(TeSECOND),
+ relatedTableId_(-1),
+ relatedAttribute_("")
+{
+ pImpl_ = new TeTableImpl;
+ pImpl_->refCount_ = 1;
+}
+
+TeTable::~TeTable()
+{
+ if ( --(pImpl_->refCount_) <= 0 )
+ delete pImpl_;
+ attList_.clear();
+}
+
+// Copy constructor
+// copies the representation pointer
+// increments the reference counter
+
+TeTable::TeTable(const TeTable& other)
+{
+ id_= other.id_;
+ name_ = other.name_;
+ type_ = other.type_;
+ attLink_ = other.attLink_;
+ attUnique_ = other.attUnique_;
+ separator_ = other.separator_;
+ order_ = other.order_;
+ attInitialTime_ = other.attInitialTime_;
+ attFinalTime_ = other.attFinalTime_;
+ attTimeUnit_ = other.attTimeUnit_;
+ attList_.clear();
+ attList_.resize(other.attList_.size());
+ attList_=other.attList_;
+ relatedTableId_ = other.relatedTableId_;
+ relatedTableName_ = other.relatedTableName_;
+ relatedAttribute_ = other.relatedAttribute_;
+ pImpl_ = other.pImpl_;
+ pImpl_->refCount_++;
+}
+
+// Operator =
+// Copies the representation pointer
+// Decrements the reference counter of the current object
+// Increments the reference counter for the new object
+TeTable&
+TeTable::operator=(const TeTable& rhs)
+{
+ if ( this != &rhs )
+ {
+ rhs.pImpl_->refCount_++;
+
+ if ( --(pImpl_->refCount_) <= 0 )
+ delete pImpl_;
+ pImpl_ = rhs.pImpl_;
+
+ separator_ = rhs.separator_;
+ attLink_ = rhs.attLink_;
+ attUnique_ = rhs.attUnique_;
+ order_ = rhs.order_;
+ attInitialTime_ = rhs.attInitialTime_;
+ attFinalTime_ = rhs.attFinalTime_;
+ attTimeUnit_ = rhs.attTimeUnit_;
+ type_ = rhs.type_;
+ name_ = rhs.name_;
+ attList_.clear();
+ attList_ = rhs.attList_;
+ relatedTableId_ = rhs.relatedTableId_;
+ relatedTableName_ = rhs.relatedTableName_;
+ relatedAttribute_ = rhs.relatedAttribute_;
+ id_ = rhs.id_;
+ }
+ return *this;
+}
+
+bool
+TeTable::setTableType( TeAttrTableType attType, int relatedTableId, const string& relatedAttribute)
+{
+ type_ = attType;
+ if ( attType == TeAttrExternal && relatedTableId > 0 && !relatedAttribute.empty())
+ {
+ relatedTableId_ = relatedTableId;
+ relatedAttribute_ = relatedAttribute;
+
+ return true;
+ }
+ return false;
+}
+
+void
+TeTable::add ( const TeTableRow& row )
+{
+ pImpl_->add ( row );
+}
+
+void
+TeTable::setValue (int row, int col, string& val)
+{
+ pImpl_->setValue (row,col,val);
+}
+
+unsigned int
+TeTable::size ()
+{
+ return pImpl_->size();
+}
+
+void TeTable::clear ()
+{
+ pImpl_->clear();
+}
+
+TeTableRow
+TeTable::operator [] (int i)
+{
+ return pImpl_->operator [] ( i );
+}
+
+string
+TeTable::operator () ( int row, int col )
+{
+ return pImpl_->operator () (row, col );
+}
+
+
+bool
+TeTable::attrLink(TeAttribute& att)
+{
+ TeAttributeList::iterator it = attList_.begin();
+ while (it != attList_.end())
+ {
+ if (TeConvertToUpperCase((*it).rep_.name_) == TeConvertToUpperCase(attLink_))
+ {
+ att = (*it);
+ return true;
+ }
+ ++it;
+ }
+ return false;
+}
+
+bool
+TeTable::attrUnique(TeAttribute& attr)
+{
+ TeAttributeList::iterator it = attList_.begin();
+ while(it!=attList_.end())
+ {
+ if(TeConvertToUpperCase((*it).rep_.name_) == TeConvertToUpperCase(attUnique_))
+ {
+ attr = (*it);
+ return true;
+ }
+ ++it;
+ }
+ return false;
+}
+
+int
+TeTable::attrLinkPosition()
+{
+ int i = 0;
+ TeAttributeList::iterator it = attList_.begin();
+ while (it != attList_.end())
+ {
+ if (TeConvertToUpperCase((*it).rep_.name_) == TeConvertToUpperCase(attLink_))
+ return i;
+ ++it;
+ ++i;
+ }
+ return -1;
+}
+
+bool
+TeTable::attributeNames(vector<string>& attrs)
+{
+ attrs.clear();
+ TeAttributeList::iterator it = attList_.begin();
+ while(it!=attList_.end())
+ {
+ attrs.push_back((*it).rep_.name_);
+ ++it;
+ }
+ return true;
+}
+
+
+void
+TeTable::primaryKeys(vector<string>& keys)
+{
+ keys.empty();
+ TeAttributeList::iterator it = attList_.begin();
+ while(it!=attList_.end())
+ {
+ if((*it).rep_.isPrimaryKey_)
+ keys.push_back((*it).rep_.name_);
+ ++it;
+ }
+ return;
+}
diff --git a/src/terralib/kernel/TeTable.h b/src/terralib/kernel/TeTable.h
new file mode 100644
index 0000000..4c15202
--- /dev/null
+++ b/src/terralib/kernel/TeTable.h
@@ -0,0 +1,393 @@
+ /************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeTable.h
+ \brief This file contains class TeTable definitions.
+*/
+
+#ifndef __TERRALIB_INTERNAL_TABLE_H
+#define __TERRALIB_INTERNAL_TABLE_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include <string>
+#include <vector>
+#include "TeComposite.h"
+using namespace std;
+
+#include "TeAttribute.h"
+
+class TeTableImpl;
+
+//! A table row is a vector of strings
+typedef vector<string> TeTableRow;
+
+//! The table implementation, this is the body class, of the handle/body idiom
+/*!
+ All members are private. This class is used only through the TeTable class
+*/
+class TeTableImpl: public TeComposite<TeTableRow>
+{
+
+friend class TeTable;
+
+ int refCount_;
+
+ //! Empty constructor
+ TeTableImpl(): refCount_(0){}
+
+ //! Returns the value of a cell in table
+ string operator () ( int row, int col )
+ {
+ return components_[row].operator[] ( col );
+ }
+
+ void setValue (int row, int col, string& val)
+ {
+ TeTableRow tRow = components_[row];
+ if (col >= (int)(tRow.size()))
+ tRow.resize(col+1);
+ tRow[col] = val;
+ components_[row] = tRow;
+ }
+
+};
+
+//! An attribute table in memory
+/*!
+ Instances of this classes represent non-spatial tables, or tables
+ that don�t have a spatial data as one of its columns.
+ The class stores the table schema and it also can store rows of data.
+
+ Rows of data are stored according to handle/hody idiom, to make
+ copies optimized.
+
+ \sa
+ TeAttribute TeTableImpl
+*/
+class TeTable {
+
+public:
+ //! Empty constructor
+ /*!
+ \note
+ Instance of TeTable will be created with the following default values:
+ \arg name: "" (empty)
+ \arg id_: -1 (no database identifier)
+ \arg type_: static attribute table
+ \arg attList: empty list of attributes
+ \arg attLink_: "" (no index to geometries)
+ \arg attUnique_: "" (no unique values)
+ \arg separator_: ',' comma separator (used to read ASCII tables from files)
+ \arg attInitialTime_: "" no initial time information
+ \arg attFinalTime_: "" no final time information
+ \arg attTimeUnit_: TeYear
+ \arg relatedTableId: -1 (no relation to other table)
+ \arg relatedTableName: "" (name of the related table)
+ \arg relatedAttribute: "" (attribute of the related table)
+ */
+ TeTable();
+
+ //! Constructor by name
+ /*!
+ \param name table name
+ \note
+ Instance of TeTable will be created with the following default values:
+ \arg id_: -1 (no database identifier)
+ \arg tableType_: static attribute table
+ \arg attList: empty list of attributes
+ \arg attLink_: "" (no index to geometries)
+ \arg attUnique_: "" (no unique values)
+ \arg separator_: ',' comma separator (used to read ASCII tables from files)
+ \arg attInitialTime_: "" no initial time information
+ \arg attFinalTime_: "" no final time information
+ \arg attTimeUnit_: TeYear
+ \arg relatedTableId: -1 (no relation to other table)
+ \arg relatedTableName: "" (name of the related table)
+ \arg relatedAttribute: "" (attribute of the related table)
+ */
+ TeTable(const string& name);
+
+ //! Constructor by name and attribute list
+ /*!
+ \param name table name
+ \param attList list of attributes
+ \param uniqueName column that unique attributes to be used as a primary key
+ \param linkName column that links attributes to geometries
+ \param tableType type of attribute table
+ \note
+ Instance of TeTable will be created with the following default values:
+ \arg id_: -1 (no database identifier)
+ \arg separator_: ',' comma separator (used to read ASCII tables from files)
+ \arg attInitialTime_: "" no initial time information
+ \arg attFinalTime_: "" no final time information
+ \arg attTimeUnit_: TeYear
+ \arg relatedTableId: -1 (no relation to other table)
+ \arg relatedTableName: "" (name of the related table)
+ \arg relatedAttribute: "" (attribute of the related table)
+ */
+ TeTable(const string& name, const TeAttributeList& attList, const string& uniqueName,
+ const string& linkName="", TeAttrTableType tableType=TeAttrStatic);
+
+ //! Destructor
+ ~TeTable();
+
+ //! Copy Constructor
+ /*! Copies the representation pointer increments the reference counter */
+ TeTable(const TeTable&);
+
+ //! Operator =
+ /*!
+ Copies the representation pointer
+ Decrements the reference counter of the current object
+ Increments the reference counter for the new object
+ */
+ TeTable& operator=(const TeTable&);
+
+// -- Methods
+
+ //! Returns the table name
+ string name()
+ { return name_; }
+
+ //! Sets the table name
+ void name(const string& n)
+ { name_ = n; }
+
+ //! Returns the unique id of the table in a database
+ int id() { return id_; }
+
+ //! Sets the id of the table
+ void setId(int n) { id_ = n; }
+
+ //! Set the position of the table in a join
+ void setOrder(int n) { order_ = n; }
+
+ //! Get the position of the table in a join
+ int getOrder() { return order_;}
+
+ //! Defines the list of attributes of this table
+ void setAttributeList ( const TeAttributeList& attList)
+ { attList_ = attList; }
+
+ //! Retrieves the list of attributes of this table
+ TeAttributeList& attributeList()
+ { return attList_; }
+
+ //! Retrieves the list of attribute names of this table
+ bool attributeNames(vector<string>& attrs);
+
+ //! Returns the type of this attribute table
+ TeAttrTableType tableType()
+ { return type_; }
+
+ //! Sets the table separator
+ void setSeparator ( const char& c )
+ { separator_ = c ; }
+
+ //! Returns the table separator
+ char separator ()
+ { return separator_; }
+
+ //! Sets the table type
+ /*!
+ \param attType table type
+ \note In case of external tables
+ \param relatedTableId is the id of the related table
+ \param relatedAttribute is column name of the related table
+ */
+ bool setTableType( TeAttrTableType attType, int relatedTableId=-1, const string& relatedAttribute="");
+
+ //! Sets an attribute as the table index.
+ /*!
+ Index in this context, means an attribute that is a link between
+ the attribute table and a spatial table (a table of geometrical
+ representation of objects).
+ */
+ void setLinkName ( const string& linkName ) { attLink_ = linkName;}
+
+ //! Returns the name of the column used as link between the attribute table and a spatial table
+ string linkName()
+ { return attLink_; }
+
+ //! Sets the name of the column that has unique values
+ void setUniqueName ( const string& uniqueName ) { attUnique_ = uniqueName; }
+
+ //! Returns the name of the column used as primary key
+ string uniqueName()
+ { return attUnique_; }
+
+ //! If there is one, returns the attribute used as an index
+ /*!
+ \param att to return the attribute used as an index
+ \return TRUE if there is an index, FALSE otherwise
+ */
+ bool attrLink(TeAttribute& att);
+
+ //! If there is one, returns the attribute used as primary key
+ /*!
+ \param attr to return the attribute used as primary key
+ \return TRUE if there is an index, FALSE otherwise
+ */
+ bool attrUnique(TeAttribute& attr);
+
+
+ //! Returns the position of the link attribute in the attribute list
+ int attrLinkPosition();
+
+
+ /** @name External tables
+ The following members are used to manipulate information about tables that
+ are external: don�t have a direct link to geometries, but can be linked by
+ a column to another attribute table
+ */
+ //@{
+ //! Sets the id of a table to which this is related (only for TeAttrExternal tables)
+ void relatedTableId(int id)
+ { relatedTableId_ = id; }
+
+ //! Returns the id of a related table (only for TeAttrExternal tables)
+ int relatedTableId()
+ { return relatedTableId_; }
+
+ //! Sets the name of a table to which this is related (only for TeAttrExternal tables)
+ void relatedTableName(string tableName)
+ { relatedTableName_ = tableName; }
+
+ //! Returns the name of a related table (only for TeAttrExternal tables)
+ string relatedTableName()
+ { return relatedTableName_; }
+
+ //! Set the name of a column to link to a related table (only for TeAttrExternal tables)
+ void relatedAttribute(const string& columnName)
+ { relatedAttribute_ = columnName; }
+
+ //! Return the column that links to a related table (only for TeAttrExternal tables)
+ string relatedAttribute()
+ { return relatedAttribute_; }
+
+ //@}
+
+ /** @name Temporal Attributes
+ The following members are used to manipulate the attribute tables with temporal
+ information.
+ \par Temporal tables contains columns to store a time interval in which the
+ attributes (or a row) of an object is valid.
+ */
+ //@{
+
+ //! Sets the name of the column that has the initial time of the validity interval
+ void attInitialTime(const string& t)
+ { attInitialTime_ = t; }
+
+ //! Returns the name of the column that has the initial time of the validity interval
+ string attInitialTime()
+ { return attInitialTime_; }
+
+ //! Sets the name of the column that has the final time of the validity interval
+ void attFinalTime(const string& t)
+ { attFinalTime_ = t; }
+
+ //! Returns the name of the column that has the final time of the validity interval
+ string attFinalTime()
+ { return attFinalTime_; }
+
+ //! Sets the time unit relative to the validity interval
+ void attTimeUnit(TeChronon t)
+ { attTimeUnit_ = t; }
+
+ //! Returns the time unit relative to the validity interval
+ TeChronon attTimeUnit()
+ { return attTimeUnit_; }
+ //@}
+
+ /** @name Data in Memory
+ The following members are used to manipulate rows of the table in memory
+ */
+ //@{
+ //! Add a row to a table
+ void add ( const TeTableRow& row );
+
+ //! Returns the i-th row
+ TeTableRow operator [] ( int row ) ;
+
+ //! Returns the element indexed by (row,col)
+ string operator () ( int row, int col );
+
+ //! Sets the value of a cell indexed by row x col to value val
+ void setValue (int row, int col, string& val);
+
+ //! Returns the number of rows in a table
+ unsigned int size ();
+
+ //! Clears the table storage in memory
+ void clear ();
+ //@}
+
+ //! Returns the primary key names of the table
+ void primaryKeys(vector<string>& keys);
+
+private:
+
+ int id_; // unique id from a database where this table may be stored
+ string name_; // name
+ TeAttrTableType type_; // type of table
+ int order_; // the table position relative to others in a join
+
+ TeAttributeList attList_; // list of attributes
+ string attLink_; // attribute that links objects to their spatial representation
+ // in case of external table it is used to link to the related table
+ string attUnique_; // primary key
+ char separator_; // in case of CSV table
+
+// --- The following attributes are relative to tables with temporal information
+
+ string attInitialTime_; // initial time attribute
+ string attFinalTime_; // final time attribute
+ TeChronon attTimeUnit_; // time granularity
+
+// --- The following attributes are relative to external tables
+ int relatedTableId_; // id of a table to which this is related
+ string relatedTableName_; // name of a table to which this is related
+ string relatedAttribute_; // column name of table which this is related
+
+// -- Table Implementation
+ TeTableImpl* pImpl_; // the rows of a table
+
+};
+
+//! A vector of tables
+typedef vector<TeTable> TeAttrTableVector;
+
+//! Return the sql join related with the table vector
+string tableJoin(TeAttrTableVector& vecTable, string firstTable="", string attrLink="");
+
+/*! \example TableExample1.cpp
+ This is an example of how to use TeDatabase and TeTable to create, populate
+ and retrieve data from an attribute table in a TerraLib database.
+ */
+#endif
+
+
diff --git a/src/terralib/kernel/TeTemporalSeries.cpp b/src/terralib/kernel/TeTemporalSeries.cpp
new file mode 100644
index 0000000..ba01eec
--- /dev/null
+++ b/src/terralib/kernel/TeTemporalSeries.cpp
@@ -0,0 +1,283 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeTemporalSeries.h"
+#include "TeDatabase.h"
+
+
+TeTSEntry::TeTSEntry(const double& val, TeTimeInterval& time, int timeFrame, int nItens, TeTSDataType dType)
+{
+ timeFrame_= timeFrame;
+ value_ = val;
+ type_ = dType;
+ nItens_ = nItens;
+ time_ = time;
+ timeInt_ = -1;
+
+ if (time.intervalChronon()==TeMONTHOFYEAR)
+ timeInt_ = time.getT1().month();
+ else if(time.intervalChronon()==TeDAYOFMONTH)
+ timeInt_ = time.getT1().day();
+ else if(time.intervalChronon()==TeDAYOFWEEK)
+ timeInt_ = time.getT1().weekDay();
+ else if(time.intervalChronon()==TeDAYOFYEAR)
+ timeInt_ = time.getT1().yearDay();
+ else if(time.intervalChronon()==TeHOUROFDAY)
+ timeInt_ = time.getT1().hour();
+ else if(time.intervalChronon()==TeMINUTEOFHOUR)
+ timeInt_ = time.getT1().minute();
+ else if(time.intervalChronon()==TeSECONDOFMINUTE)
+ timeInt_ = time.getT1().hour();
+}
+
+
+
+TeTSEntry&
+TeTSEntry::operator=(const TeTSEntry& other)
+{
+ if ( this != &other )
+ {
+ timeFrame_ = other.timeFrame_;
+ value_ = other.value_;
+ time_ = other.time_;
+ nItens_ = other.nItens_;
+ type_ = other.type_;
+ timeInt_ = other.timeInt_;
+ }
+ return (*this);
+}
+
+TeTSParams&
+TeTSParams::operator=(const TeTSParams& other)
+{
+ if ( this != &other )
+ {
+ type_ = other.type_;
+ chronon_ = other.chronon_;
+ time_ = other.time_;
+ timeOper_ = other.timeOper_;
+ spatOper_ = other.spatOper_;
+ orTheme_ = other.orTheme_;
+ objectId_ = other.objectId_;
+ attrTable_ = other.attrTable_;
+ attrColumn_ = other.attrColumn_;
+ }
+ return (*this);
+}
+
+
+TeTemporalSeries&
+TeTemporalSeries::operator=(const TeTemporalSeries& other)
+{
+ if ( this != &other )
+ {
+ TSparams_ = other.TSparams_;
+ series_ = other.series_;
+ }
+ return (*this);
+}
+
+
+bool
+TeTemporalSeries::getTSEntry(TeTSEntry& ts, unsigned int frame)
+{
+ if(frame >= (series_.size()))
+ return false;
+
+ ts = series_[frame];
+ return true;
+}
+
+bool
+TeTemporalSeries::buildFrameIntervals()
+{
+ // ----- information about temporal table
+ TeTable tempTable;
+ TeDatabase* db = TSparams_.orTheme_->layer()->database();
+
+ if(!TSparams_.orTheme_->getTemporalTable(tempTable))
+ return false;
+
+ TSparams_.attrTable_ = tempTable.name();
+ string initialtime = tempTable.name() +"."+ tempTable.attInitialTime();
+ string finaltime = tempTable.name() +"."+ tempTable.attFinalTime();
+
+ TeTime iTime, fTime;
+
+ // ----- fill time interval
+ // ---------------------------- you don�t know how many time frames will be generated
+
+ if( (TSparams_.chronon_==TeYEAR) || (TSparams_.chronon_==TeMONTH) ||
+ (TSparams_.chronon_==TeDAY) || (TSparams_.chronon_==TeHOUR) ||
+ (TSparams_.chronon_==TeMINUTE) || (TSparams_.chronon_==TeSECOND) )
+ {
+
+ string fromClause, whereClause;
+ if(!db->tableExist(TSparams_.orTheme_->collectionAuxTable()))
+ {
+ TeAttrTableVector atts;
+ TSparams_.orTheme_->getAttTables(atts);
+ if(atts.empty())
+ return false;
+
+ fromClause = " FROM " + tableJoin(atts);
+ whereClause = TSparams_.orTheme_->sqlWhereRestrictions();
+ }
+ else
+ {
+ //fromClause = TSparams_.orTheme_->sqlGridFrom();
+ string collAuxTable = TSparams_.orTheme_->collectionAuxTable();
+ string uniqueIdName = tempTable.name() +"."+ tempTable.uniqueName();
+ fromClause = " FROM "+ tempTable.name()+" RIGHT JOIN "+ collAuxTable;
+ fromClause += " ON "+ uniqueIdName +" = ";;
+
+ if(tempTable.tableType()==TeFixedGeomDynAttr)
+ fromClause += collAuxTable +".aux0";
+ else
+ fromClause += collAuxTable +".unique_id";
+ }
+
+ string sql = " SELECT min("+ initialtime +"), max("+ finaltime +") ";
+ sql += fromClause;
+
+ if(!whereClause.empty())
+ sql += " WHERE "+ whereClause;
+
+ TeDatabasePortal* portal = db->getPortal();
+ if(!portal)
+ return false;
+
+ if((!portal->query(sql)) || (!portal->fetchRow()))
+ {
+ delete portal;
+ return false;
+ }
+
+ //fill the temporal series
+ TeTime date1 = portal->getDate(0);
+ TeTime date2 = portal->getDate(1);
+ TeTimeInterval interval(date1, date2);
+ interval.intervalChronon(TSparams_.chronon_); //min/max
+
+ iTime = interval.getT1();
+ fTime = interval.getT2();
+
+ delete (portal);
+ }
+
+ // ---------------------------- you know how many time frames will be generated
+
+ else if (TSparams_.chronon_==TeMONTHOFYEAR)
+ {
+ TeTime t1("01/01/2001", TeMONTHOFYEAR, "DDsMMsYYYY");
+ TeTime t2("01/12/2001", TeMONTHOFYEAR, "DDsMMsYYYY");
+ iTime = t1;
+ fTime = t2;
+ }
+ else if(TSparams_.chronon_==TeDAYOFMONTH)
+ {
+ TeTime t1("01/01/2001", TeDAYOFMONTH, "DDsMMsYYYY");
+ TeTime t2("31/01/2001", TeDAYOFMONTH, "DDsMMsYYYY");
+ iTime = t1;
+ fTime = t2;
+ }
+ else if(TSparams_.chronon_==TeDAYOFWEEK)
+ {
+ TeTime t1("07/01/2001", TeDAYOFWEEK, "DDsMMsYYYY");
+ TeTime t2("13/01/2001", TeDAYOFWEEK, "DDsMMsYYYY");
+ iTime = t1;
+ fTime = t2;
+ }
+ else if(TSparams_.chronon_==TeDAYOFYEAR)
+ {
+ TeTime t1("01/01/2001", TeDAYOFYEAR, "DDsMMsYYYY");
+ TeTime t2("31/12/2001", TeDAYOFYEAR, "DDsMMsYYYY");
+ iTime = t1;
+ fTime = t2;
+ }
+ else if(TSparams_.chronon_==TeHOUROFDAY)
+ {
+ TeTime t1("01/01/2001 00", TeHOUROFDAY, "DDsMMsYYYYsHH");
+ TeTime t2("01/01/2001 23", TeHOUROFDAY, "DDsMMsYYYYsHH");
+ iTime = t1;
+ fTime = t2;
+ }
+ else if(TSparams_.chronon_==TeMINUTEOFHOUR)
+ {
+ TeTime t1("01/01/2001 00:00", TeMINUTEOFHOUR, "DDsMMsYYYYsHHsmm");
+ TeTime t2("01/01/2001 00:59", TeMINUTEOFHOUR, "DDsMMsYYYYsHHsmm");
+ iTime = t1;
+ fTime = t2;
+ }
+ else if(TSparams_.chronon_==TeSECONDOFMINUTE)
+ {
+ TeTime t1("01/01/2001 00:00:00", TeSECONDOFMINUTE, "DDsMMsYYYYsHHsmmsSS");
+ TeTime t2("01/01/2001 00:00:59", TeSECONDOFMINUTE, "DDsMMsYYYYsHHsmmsSS");
+ iTime = t1;
+ fTime = t2;
+ }
+
+ int timeFrame = 0;
+ while (iTime <= fTime)
+ {
+ TeTimeInterval inter(iTime,iTime);
+ inter.intervalChronon(TSparams_.chronon_); //min/max
+ TeTSEntry tsEntry(0., inter, timeFrame);
+ this->series_.push_back(tsEntry);
+ ++iTime;
+ ++timeFrame;
+ }
+
+ return true;
+}
+
+bool
+TeTemporalSeries::setTSEntryValue(unsigned int frame, double val, TeTSDataType type)
+{
+
+ TeTSEntry entry;
+ if(!getTSEntry(entry, frame))
+ return false;
+
+ double val1 = entry.value_;
+ double result = val1;
+
+ if(TSparams_.timeOper_==TeCOUNT)
+ result += 1;
+ else if (TSparams_.timeOper_==TeSUM)
+ result += val;
+ else if ((TSparams_.timeOper_==TeMAXVALUE) && (val>val1))
+ result = val;
+ else if((TSparams_.timeOper_==TeMINVALUE) && (val<val1))
+ result = val;
+ else if(TSparams_.timeOper_==TeMEAN)
+ result = (val1+val)/2;
+
+ series_[frame].value_ = result;
+ series_[frame].type_ = type;
+ return true;
+}
+
+
+
+
diff --git a/src/terralib/kernel/TeTemporalSeries.h b/src/terralib/kernel/TeTemporalSeries.h
new file mode 100644
index 0000000..a68f7ee
--- /dev/null
+++ b/src/terralib/kernel/TeTemporalSeries.h
@@ -0,0 +1,193 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_TS_H
+#define __TERRALIB_INTERNAL_TS_H
+
+
+#include "TeTheme.h"
+#include "TeTimeInterval.h"
+
+
+/*
+ ATTR_DYN: a spatial object with a dynamic attribute
+ ATTR_DYN_GROUP: some spatial objects with a dynamic attribute table
+ EVENT: count of events
+ ATTR_EVENT: grouping the attributes of the events
+*/
+//! type of temporal series
+enum TeTSType { TeATTRDYN, TeATTRDYNGROUP, TeEVENT, TeATTREVENT};
+
+
+//! type of the data collected in the serie temporal
+enum TeTSDataType { TeDATA, TeMISSING, TeDMISSING, TeOUTLIER, TeDOUTLIER, TePREDICTION };
+
+
+//! A class that represent each time frame of a temporal serie
+class TeTSEntry
+{
+
+public:
+ int timeFrame_; //the time frame of the temporal series
+ double value_;
+ TeTSDataType type_;
+ int nItens_; //number of instances
+ TeTimeInterval time_;
+ int timeInt_;
+
+ //! Constructor
+ TeTSEntry():
+ timeFrame_(-1),
+ value_(0),
+ type_(TeMISSING),
+ nItens_(0),
+ timeInt_(-1)
+ {}
+
+ //! Constructor
+ TeTSEntry(const double& val, TeTimeInterval& time, int timeFrame=-1, int nItens=0, TeTSDataType dType=TeMISSING);
+
+
+ //! Copy constructor
+ TeTSEntry(const TeTSEntry& other)
+ {
+ timeFrame_ = other.timeFrame_;
+ value_ = other.value_;
+ time_ = other.time_;
+ nItens_ = other.nItens_;
+ type_ = other.type_;
+ timeInt_ = other.timeInt_;
+ }
+
+ //! Operator =
+ TeTSEntry& operator=(const TeTSEntry& other);
+
+};
+
+//! Parameters of a temporal serie
+class TeTSParams
+{
+
+public:
+ TeTSType type_; //! type of the serie
+ TeChronon chronon_; //! Chronon used to generated the serie
+ TeTimeInterval time_; //! Date/Time validy
+ TeStatisticType timeOper_; //! operator to temporal grouping - to group objects in each time frame
+ TeStatisticType spatOper_; //! operator to spatial grouping - to group instances to each object
+
+ // Measures
+ TeTheme* orTheme_; //Pointer to the origin theme
+ string objectId_;
+ string attrTable_; //temporal table
+ string attrColumn_; //date column
+
+
+ //! Empty constructor
+ TeTSParams():
+ chronon_(TeNOCHRONON),
+ timeOper_(TeNOSTATISTIC),
+ spatOper_(TeNOSTATISTIC),
+ orTheme_(0),
+ objectId_(""),
+ attrTable_(""),
+ attrColumn_("")
+ { }
+
+ //! Constructor - - serie type is ATTR_DYN_GROUP, EVENT, ATTR_EVENT
+ TeTSParams(TeTheme* theme, TeChronon chr, const string& table, const string& col, TeStatisticType tOper, TeStatisticType sOper):
+ chronon_(chr),
+ timeOper_(tOper),
+ spatOper_(sOper),
+ orTheme_(theme),
+ objectId_(""),
+ attrTable_(table),
+ attrColumn_(col)
+ {}
+
+ //! Constructor - serie type is ATTR_DYN
+ TeTSParams(TeTheme* theme, const string& objId, TeChronon chr, const string& table, const string& col, TeStatisticType tOper, TeStatisticType sOper):
+ chronon_(chr),
+ timeOper_(tOper),
+ spatOper_(sOper),
+ orTheme_(theme),
+ objectId_(objId),
+ attrTable_(table),
+ attrColumn_(col)
+ {}
+
+ //! Operator =
+ TeTSParams& operator=(const TeTSParams& other);
+};
+
+//! A class to represent temporal serie
+class TeTemporalSeries
+{
+
+public:
+ TeTSParams TSparams_;
+ vector<TeTSEntry> series_; //! serie
+
+ //! Constructor
+ TeTemporalSeries():
+ TSparams_(TeTSParams())
+ {}
+
+ //! Constructor
+ TeTemporalSeries(TeChronon chr, TeTheme* theme=0, const string& table="", const string& col="", TeStatisticType tOper=TeNOSTATISTIC, TeStatisticType sOper=TeNOSTATISTIC):
+ TSparams_(TeTSParams(theme, chr, table, col, tOper, sOper))
+ {}
+
+ //! Constructor
+ TeTemporalSeries(TeTheme* theme, const string& objId, TeChronon chr, const string& table, const string& col, TeStatisticType tOper, TeStatisticType sOper):
+ TSparams_(TeTSParams(theme, objId, chr, table, col, tOper, sOper))
+ {}
+
+ //! Gets the time frame (0 until n-1)
+ bool getTSEntry(TeTSEntry& ts, unsigned int frame);
+
+ //! Operator =
+ TeTemporalSeries& operator=(const TeTemporalSeries& other);
+
+ //! Fills the time interval for each frame
+ bool buildFrameIntervals();
+
+ //! Returns the number of time frames
+ int numTimeFrames() { return series_.size(); }
+
+ //! Returns the time of each frame
+ int timeInt(int frame) { return ((series_[frame-1]).timeInt_); }
+
+ //! Sets the temporal serie entry value
+ bool setTSEntryValue(unsigned int frame, double val, TeTSDataType type);
+
+ //! Returns the time of each frame
+ TeTimeInterval time(int frame) { return ((series_[frame-1]).time_); }
+
+};
+
+
+#endif
+
+
+
+
diff --git a/src/terralib/kernel/TeTheme.cpp b/src/terralib/kernel/TeTheme.cpp
new file mode 100644
index 0000000..4e5ac33
--- /dev/null
+++ b/src/terralib/kernel/TeTheme.cpp
@@ -0,0 +1,1703 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeTheme.h"
+#include "TeUtils.h"
+#include "TeDatabase.h"
+#include "TeGroupingAlgorithms.h"
+
+extern int yyparse(string& sqlOut);
+extern int initParse(const string& strIn, TeDatabase* db);
+
+TeTheme&
+TeTheme::operator= (TeTheme& other)
+{
+ if ( this != &other )
+ {
+ myParent_ = other.parent();
+ id_ = other.id();
+ name_= other.name();
+ view_ = other.view();
+ type_ = other.type();
+ priority_ = other.priority();
+
+ layerId_ = other.layerId();
+ layer_ = other.layer(); //the same layer pointer
+ generateAttributeRest_ = other.attributeRest();
+ generateTemporalRest_ = other.temporalRest();
+ generateSpatialRest_ = other.spatialRest();
+ spatialRelation_ = other.spatialRelation();
+ hasSpatialRes_ = other.hasSpatialRest();
+ boxRest_ = other.boxRestriction();
+ geomRest_ = other.geomRestriction();
+ geomRepRest_ = other.geomRepRestriction();
+ minScale_ = other.minScale();
+ maxScale_ = other.maxScale();
+ collectionTable_ = other.collectionTable();
+ collectionAuxTable_ = other.collectionAuxTable();
+ visibleRep_ = other.visibleRep();
+ enableVisibility_ = other.visibility();
+
+ if(grouping_)
+ delete grouping_;
+ grouping_ = 0;
+ if(other.grouping())
+ {
+ grouping_ = new TeGrouping();
+ (*grouping_) = (*other.grouping());
+ }
+
+ legend_ = other.legend();
+ outOfCollectionLegend_ = other.outOfCollectionLegend();
+ withoutDataConnectionLegend_ = other.withoutDataConnectionLegend();
+ defaultLegend_ = other.defaultLegend ();
+ pointingLegend_ = other.pointingLegend();
+ queryLegend_ = other.queryLegend();
+ queryAndPointingLegend_ = other.queryAndPointingLegend();
+
+ attTableVector_ = other.attrTables();
+ sqlFrom_ = other.sqlFrom();
+ sqlJoin_ = other.sqlGridJoin();
+ sqlGridFrom_ = other.sqlGridFrom();
+ sqlGridJoin_ = other.sqlGridJoin();
+ aliasVector_ = other.aliasVector();
+ sqlAttList_ = other.sqlAttList();
+ sqlNumAttList_ = other.sqlNumAttList();
+
+ if(rasterVisual_)
+ delete rasterVisual_;
+ rasterVisual_ = 0;
+ if(other.rasterVisual())
+ {
+ rasterVisual_ = new TeRasterTransform();
+ (*rasterVisual_) = (*other.rasterVisual());
+ }
+ }
+ return *this;
+}
+
+void
+TeTheme::setSpatialRest(TeBox& box, TeGeomRep rep, TeSpatialRelation relation)
+{
+ hasSpatialRes_ = true;
+ boxRest_ = box;
+ spatialRelation_ = relation;
+
+ if(rep==TeGEOMETRYNONE)
+ geomRepRest_ = layer()->vectRepres()[0]->geomRep_;
+ else
+ geomRepRest_ = rep;
+
+ geomRest_ = 0;
+}
+
+void
+TeTheme::setSpatialRest(TeGeometry* geom, TeGeomRep rep, TeSpatialRelation relation)
+{
+ hasSpatialRes_ = true;
+ geomRest_ = geom;
+ spatialRelation_ = relation;
+
+ if(rep==TeGEOMETRYNONE)
+ geomRepRest_ = layer()->vectRepres()[0]->geomRep_;
+ else
+ geomRepRest_ = rep;
+
+ boxRest_ = TeBox();
+}
+
+void
+TeTheme::grouping(TeGrouping* g)
+{
+ if(grouping_==g)
+ return;
+
+ if(grouping_)
+ delete (grouping_);
+
+ grouping_ = g;
+}
+
+bool
+TeTheme::save()
+{
+ TeDatabase* db = layer()->database();
+ if(!db)
+ return false;
+
+ //insert theme in database
+ if(id()==0)
+ {
+ if(!db->insertTheme(this))
+ {
+ db->deleteTheme(this->id());
+ return false;
+ }
+ }
+
+ //update te_theme_tables table
+ if(!db->updateThemeTable(this))
+ {
+ db->deleteTheme(this->id());
+ return false;
+ }
+
+ //collection table
+ if(collectionTable().empty())
+ collectionTable("te_collection_"+ Te2String(id()));
+
+ if(!db->createCollectionTable(collectionTable_))
+ {
+ db->deleteTheme(this->id());
+ return false;
+ }
+
+ //collection aux table
+ collectionAuxTable(collectionTable() + "_aux");
+ addThemeTable(collectionAuxTable());
+
+ if(!createCollectionAuxTable())
+ {
+ db->deleteTheme(this->id());
+ return false;
+ }
+
+ return true;
+}
+
+bool
+TeTheme::buildCollection()
+{
+ if(id()==0)
+ return false;
+
+ if(!populateCollection())
+ return false;
+
+ if(!populateCollectionAux())
+ return false;
+
+ return true;
+}
+
+bool
+TeTheme::generateLabelPositions()
+{
+ TeDatabase* db = layer()->database();
+ if(!db)
+ return false;
+
+ return (db->generateLabelPositions(this));
+}
+
+void
+TeTheme::resetGrouping ()
+{
+ if(grouping_)
+ {
+ if (grouping_->groupMode_ == TeRasterSlicing && rasterVisual_)
+ this->removeRasterVisual();
+
+ delete(grouping_);
+ grouping_ = 0;
+ }
+
+ legend_.clear();
+ return;
+}
+
+bool
+TeTheme::buildGrouping(TeGrouping* g, vector<TeSlice>& slices)
+{
+ if(slices.size() > 200)
+ return false;
+ grouping(g);
+ legend_.clear();
+
+ for(unsigned int j=0; j<slices.size(); j++)
+ {
+ TeLegendEntry legend(slices[j]);
+ legend.group(j);
+ legend.theme(id());
+ legend_.push_back(legend);
+ }
+ return true;
+}
+
+bool
+TeTheme::buildGrouping(TeGrouping* g, TeSelectedObjects selectedObjects, vector<double>* dValuesVec)
+{
+ TeDatabase* db = layer_->database();
+ if(!db || !g)
+ return false;
+
+ unsigned int i;
+ vector<TeSlice> slices;
+
+ if (g->groupMode_ == TeRasterSlicing)
+ {
+ int b = atoi(g->groupAttribute_.name_.c_str());
+ if (!layer_->raster() ||
+ b < 0 ||
+ b > layer_->raster()->params().nBands() ||
+ g->groupNumSlices_ <= 0 ||
+ g->groupNumSlices_ > 200 )
+ return false;
+
+ if (g->groupMaxVal_ == TeMINFLOAT)
+ g->groupMaxVal_ = layer_->raster()->params().vmax_[b];
+
+ if (g->groupMinVal_ == TeMAXFLOAT)
+ g->groupMinVal_ = layer_->raster()->params().vmin_[b];
+
+ grouping(g);
+ TeGroupByEqualStep(g->groupMinVal_, g->groupMaxVal_,g->groupNumSlices_, slices, g->groupPrecision_);
+ }
+ else
+ {
+ if(g->groupAttribute_.name_.empty())
+ return false;
+ grouping(g);
+
+ //verify what the objects will be consired
+ string input;
+ if(selectedObjects == TeSelectedByPointing)
+ {
+ input = " WHERE (grid_status = 1 OR grid_status = 3";
+ input += " OR (grid_status is null AND (c_object_status = 1 OR c_object_status = 3)))";
+ }
+ else if(selectedObjects == TeNotSelectedByPointing)
+ {
+ input = " WHERE (grid_status = 0 OR grid_status = 2";
+ input += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 2)))";
+ }
+ else if(selectedObjects == TeSelectedByQuery)
+ {
+ input = " WHERE (grid_status = 2 OR grid_status = 3";
+ input += " OR (grid_status is null AND (c_object_status = 2 OR c_object_status = 3)))";
+ }
+ else if(selectedObjects == TeNotSelectedByQuery)
+ {
+ input = " WHERE (grid_status = 0 OR grid_status = 1";
+ input += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 1)))";
+ }
+ else if(selectedObjects == TeGrouped)
+ {
+ input = " WHERE c_legend_id <> 0";
+ }
+ else if(selectedObjects == TeNotGrouped)
+ {
+ input = " WHERE c_legend_id = 0";
+ }
+
+ TeDatabasePortal* portal = db->getPortal();
+ string query;
+ bool normal = false;
+ string aggrFunc = "";
+ if(grouping_->groupFunction_.empty())
+ aggrFunc = " MIN";
+ else
+ aggrFunc = grouping_->groupFunction_;
+
+ if(grouping_->groupNormAttribute_.empty())
+ {
+// if(grouping_->groupAttribute_.type_== TeSTRING)
+// query = " SELECT "+ grouping_->groupAttribute_.name_;
+// else
+ query = " SELECT "+ aggrFunc +"("+ grouping_->groupAttribute_.name_ +")";
+ }
+ else
+ {
+ query = " SELECT "+ aggrFunc +"("+ grouping_->groupAttribute_.name_ +") / "+ aggrFunc +"("+ grouping_->groupNormAttribute_ + ")";
+ normal = true;
+ }
+ query += sqlGridFrom();
+
+ if(selectedObjects != TeAll)
+ query += input;
+
+// if(grouping_->groupAttribute_.type_!= TeSTRING)
+ query += " GROUP BY " + collectionTable() + ".c_object_id";
+
+ if(!portal->query(query) || !portal->fetchRow())
+ {
+ delete portal;
+ return false;
+ }
+
+ //mount vector in memory
+ vector<double> dValues; //inputvect
+ vector<string> sValues; //svec
+
+ double mean, sum;
+ mean = sum = 0.;
+ int nullValues = 0;
+ do
+ {
+ string val = portal->getData(0);
+ string valNorm = Te2String(atof(val.c_str()), grouping_->groupPrecision_);
+
+ if (!val.empty())
+ {
+ if(grouping_->groupMode_== TeUniqueValue)
+ {
+ if(normal)
+ sValues.push_back(valNorm);
+ else
+ sValues.push_back(val);
+ }
+ else
+ {
+ dValues.push_back(atof(valNorm.c_str()));
+ sum += atof(valNorm.c_str());
+ }
+
+ }
+ else
+ nullValues++;
+ }while(portal->fetchRow());
+ delete portal;
+
+ if(dValues.empty() && sValues.empty())
+ return false;
+
+ if(grouping_->groupMode_== TeEqualSteps)
+ TeGroupByEqualStep(dValues.begin(), dValues.end(), grouping_->groupNumSlices_, slices, grouping_->groupPrecision_);
+ else if(grouping_->groupMode_== TeQuantil)
+ TeGroupByQuantil(dValues.begin(), dValues.end(), grouping_->groupNumSlices_, slices, grouping_->groupPrecision_);
+ else if(grouping_->groupMode_== TeStdDeviation)
+ {
+ string m = Te2String(mean);
+ TeGroupByStdDev(dValues.begin(), dValues.end(), grouping_->groupStdDev_, slices, m, grouping_->groupPrecision_);
+ }
+ else if(grouping_->groupMode_== TeUniqueValue)
+ {
+ if(grouping_->groupFunction_ == "COUNT")
+ TeGroupByUniqueValue(sValues, TeINT, slices, grouping_->groupPrecision_);
+ else
+ TeGroupByUniqueValue(sValues, grouping_->groupAttribute_.type_, slices, grouping_->groupPrecision_);
+ }
+
+ if(grouping_->groupNullAttr_ && nullValues > 0)
+ {
+ TeSlice ps;
+ ps.count_ = nullValues;
+ ps.from_ = "Missing Data";
+ slices.push_back(ps);
+ grouping_->groupNumSlices_ = slices.size() - 1;
+ }
+ else
+ grouping_->groupNumSlices_ = slices.size();
+
+ if (dValuesVec)
+ {
+ for (i = 0; i < dValues.size(); ++i)
+ dValuesVec->push_back(dValues[i]);
+ }
+ }
+
+ legend_.clear();
+ if(slices.size() > 200)
+ return false;
+
+ for(i=0; i<slices.size(); ++i)
+ {
+ TeLegendEntry legend(slices[i]);
+ legend.group(i);
+ legend.theme(id());
+ legend_.push_back(legend);
+ }
+
+ return true;
+}
+
+bool
+TeTheme::setGroupingVisual(int n, TeVisual& visual, TeGeomRep rep)
+{
+ if( (n > grouping_->groupNumSlices_) ||
+ ((int)legend_.size() < n) ||
+ (legend_.empty()) )
+ return false;
+
+ legend_[(n-1)].setVisual (visual, rep);
+
+ return true;
+}
+
+bool
+TeTheme::setGroupingVisual(int n, TeGeomRepVisualMap& vismap)
+{
+ if( (n > grouping_->groupNumSlices_) ||
+ ((int)legend_.size() < n) ||
+ (legend_.empty()) )
+ return false;
+
+ TeGeomRepVisualMap::iterator it = vismap.begin();
+ while (it != vismap.end())
+ {
+ legend_[(n-1)].setVisual(it->second,it->first);
+ ++it;
+ }
+ return true;
+}
+
+TeSliceVector
+TeTheme::getSlices()
+{
+ TeSliceVector sliceVec;
+ for(unsigned int x=0; x<legend_.size(); ++x)
+ {
+ TeSlice slice = legend_[x].slice();
+ sliceVec.push_back (slice);
+ }
+ return sliceVec;
+}
+
+bool
+TeTheme::getAttTables(TeAttrTableVector& attrs, TeAttrTableType attType)
+{
+ TeAttrTableVector::iterator it = attTableVector_.begin();
+ while (it != attTableVector_.end())
+ {
+ if ((attType == TeAllAttrTypes) || ((*it).tableType() == attType))
+ attrs.push_back((*it));
+ ++it;
+ }
+ return (!attrs.empty());
+}
+
+bool
+TeTheme::getTemporalTable(TeTable& table)
+{
+ TeAttrTableVector::iterator it = attTableVector_.begin();
+ while (it != attTableVector_.end())
+ {
+ if (((*it).tableType() == TeAttrEvent) || ((*it).tableType() == TeFixedGeomDynAttr))
+ {
+ table = (*it);
+ return true;
+ }
+ ++it;
+ }
+ return false;
+}
+
+bool
+TeTheme::saveGrouping(TeSelectedObjects selectedObjects)
+{
+ TeDatabase* db = layer_->database();
+ if(!db || !grouping_)
+ return false;
+
+ //verify if the collection table exists
+ //if there is a grouping definition
+ if (grouping_->groupMode_ != TeRasterSlicing)
+ {
+ if (!db->tableExist(collectionTable_) ||
+ (grouping_->groupAttribute_.name_.empty()))
+ return false;
+ }
+ if(legend_.empty())
+ buildGrouping(grouping());
+
+ //save grouping in te_gouping table, the legends in te_legend table and
+ //the visual of each legend in the te_visual table
+ if(!db->updateTheme(this))
+ return false;
+
+ if(grouping_->groupMode_ != TeRasterSlicing)
+ { //save legend in collection table
+ if(!saveLegendInCollection(selectedObjects))
+ return false;
+ }
+ return true;
+}
+
+bool
+TeTheme::addThemeTable(TeTable& inputTable)
+{
+ bool result = true;
+ TeAttrTableType type = inputTable.tableType();
+
+ if(inputTable.name() == collectionAuxTable_)
+ {
+ loadTablesJoin();
+ return false;
+ }
+
+ if (type == TeAttrMedia)
+ return false;
+
+ if(type != TeAttrStatic)
+ {
+ bool hasTemporal = false;
+ bool hasExtern = false;
+
+ TeAttrTableVector::iterator it = attTableVector_.begin();
+ while(it!=attTableVector_.end())
+ {
+ //temporal
+ if( (it->tableType()==TeAttrEvent) ||
+ (it->tableType()==TeFixedGeomDynAttr) ||
+ (it->tableType()==TeDynGeomDynAttr))
+ hasTemporal = true;
+
+ //extern
+ if((it->tableType())==TeAttrExternal)
+ hasExtern = true;
+
+ ++it;
+ }
+
+ if( ((type==TeAttrEvent) ||
+ (type==TeFixedGeomDynAttr) ||
+ (type==TeDynGeomDynAttr)) && (hasTemporal || hasExtern))
+ result = false;
+ else if ((type==TeAttrExternal) && hasTemporal)
+ result = false;
+ }
+
+ if(!result)
+ return false;
+
+ attTableVector_.push_back(inputTable);
+ loadAliasVector();
+ loadAttrLists();
+ loadTablesJoin();
+ return true;
+}
+
+void
+TeTheme::addThemeTable(string tableName)
+{
+ TeTable table(tableName);
+ addThemeTable(table);
+}
+
+bool
+TeTheme::setAttTables(TeAttrTableVector& attrs)
+{
+ attTableVector_.clear();
+ int countTemporal = 0;
+ int countExtern = 0;
+ bool result = true;
+
+ TeAttrTableVector::iterator it = attrs.begin();
+ while(it!=attrs.end())
+ {
+ //temporal
+ if( (it->tableType()==TeAttrEvent) ||
+ (it->tableType()==TeFixedGeomDynAttr) ||
+ (it->tableType()==TeDynGeomDynAttr))
+ ++countTemporal;
+
+ //extern
+ if(it->tableType()==TeAttrExternal)
+ ++countExtern;
+
+ if( (it->tableType()==TeAttrMedia) ||
+ (countTemporal>0 && countExtern>0) ||
+ (countTemporal>1) ||
+ (it->name() == collectionAuxTable_) )
+ {
+ result = false;
+ }
+ else
+ {
+ attTableVector_.push_back(*it);
+ loadAliasVector();
+ loadAttrLists();
+ loadTablesJoin();
+ }
+
+ ++it;
+ }
+
+ return result;
+}
+
+bool
+TeTheme::removeThemeTable(unsigned int index)
+{
+ if (index > (attTableVector_.size() - 1))
+ return false;
+
+ TeAttrTableVector::iterator it;
+ it = attTableVector_.begin() + index;
+
+ attTableVector_.erase(it);
+ loadAliasVector();
+ loadAttrLists();
+ loadTablesJoin();
+
+ return true;
+}
+
+bool
+TeTheme::isThemeTable(int tableId)
+{
+ bool isThemeTable = false;
+ for (unsigned int i = 0; i < attTableVector_.size(); ++i)
+ {
+ if (attTableVector_[i].id() == tableId)
+ {
+ isThemeTable = true;
+ break;
+ }
+ }
+ return isThemeTable;
+}
+
+bool
+TeTheme::isThemeTable(string tableName)
+{
+ bool isThemeTable = false;
+ for (unsigned int i = 0; i < attTableVector_.size(); ++i)
+ {
+ if (attTableVector_[i].name() == tableName)
+ {
+ isThemeTable = true;
+ break;
+ }
+ }
+ return isThemeTable;
+}
+
+string
+TeTheme::getTableName(const string& attrName)
+{
+ string tableName;
+ size_t pos = attrName.find(".");
+
+ if (pos != string::npos)
+ return tableName = attrName.substr(0, pos-1);
+
+ for (unsigned int i = 0; i < attTableVector_.size(); ++i)
+ {
+ TeAttributeList& attrList = attTableVector_[i].attributeList();
+ for (unsigned j = 0; j < attrList.size(); ++j)
+ {
+ if (attrList[j].rep_.name_ == attrName)
+ {
+ tableName = attTableVector_[i].name();
+ return tableName;
+ }
+ }
+ }
+
+ return tableName;
+}
+
+
+bool
+TeTheme::loadThemeTables()
+{
+ clearAttTableVector();
+ TeDatabase* db = this->layer()->database();
+ if(!db)
+ return false;
+
+ return (db->loadThemeTable(this));
+}
+
+
+bool
+TeTheme::deleteGrouping()
+{
+ TeDatabase* db = layer_->database();
+ if(!db)
+ return false;
+
+ resetGrouping();
+
+ //delete te_legend table
+ if(!db->deleteLegend (this->id()))
+ return false;
+
+ //delete te_grouping table
+ string sql = "DELETE FROM te_grouping WHERE theme_id= "+ Te2String(this->id());
+ db->execute (sql);
+
+ return true;
+}
+
+bool
+TeTheme::createCollectionAuxTable()
+{
+ unsigned int i, j;
+ bool status;
+
+ TeDatabase* db = layer_->database();
+
+ if(!db->tableExist(collectionTable_))
+ return false;
+
+ if(db->tableExist(collectionAuxTable_))
+ {
+ status = db->execute("DROP TABLE " + collectionAuxTable_);
+ if(!status)
+ return false;
+ }
+
+ TeAttributeList attList;
+
+ TeAttribute at;
+ at.rep_.type_ = TeSTRING;
+ at.rep_.numChar_ = 50;
+ at.rep_.name_ = "object_id";
+ attList.push_back(at);
+
+ j = 0;
+ for (i = 0; i < attTableVector_.size(); ++i)
+ {
+ if (attTableVector_[i].tableType() == TeAttrExternal ||
+ attTableVector_[i].tableType() == TeFixedGeomDynAttr)
+ {
+ at.rep_.name_ = "aux" + Te2String(j++);
+ attList.push_back(at);
+ }
+ }
+
+ at.rep_.isPrimaryKey_ = true;
+// at.rep_.numChar_ = 200;
+ at.rep_.numChar_ = 0;
+ at.rep_.name_ = "unique_id";
+ at.rep_.isAutoNumber_ = true;
+ at.rep_.type_ = TeINT;
+ attList.push_back(at);
+
+// at.rep_.type_ = TeINT;
+ at.rep_.name_ = "grid_status";
+ at.rep_.isPrimaryKey_ = false;
+ at.rep_.isAutoNumber_ = false;
+ at.rep_.numChar_ = 0;
+ attList.push_back(at);
+
+ status = db->createTable(collectionAuxTable_,attList);
+ if(!status)
+ return false;
+
+ //create index to object_id
+ db->createIndex(collectionAuxTable_, collectionAuxTable_+"_index1", "object_id");
+ return true;
+}
+
+bool
+TeTheme::populateCollectionAux()
+{
+ TeDatabase* db = layer_->database();
+ if((!db) || (collectionTable_.empty()) || (collectionAuxTable_.empty()))
+ return false;
+
+ string whereClause;
+
+ whereClause = " WHERE 1=1 ";
+
+ // Populate the collection auxiliary table
+ string ins = "INSERT INTO " + collectionAuxTable_ + " (object_id";
+ unsigned int i, j;
+ j = 0;
+ for (i = 0; i < attTableVector_.size(); ++i)
+ {
+ if (attTableVector_[i].tableType() == TeAttrExternal ||
+ attTableVector_[i].tableType() == TeFixedGeomDynAttr)
+ ins += ", aux" + Te2String(j++);
+ }
+
+// ins += ", unique_id, grid_status) SELECT c_object_id";
+ ins += ", grid_status) SELECT c_object_id";
+ for (i = 0; i < attTableVector_.size(); ++i)
+ {
+ if (attTableVector_[i].tableType() == TeAttrExternal ||
+ attTableVector_[i].tableType() == TeFixedGeomDynAttr)
+ ins += "," + aliasVector()[i] + "." + attTableVector_[i].uniqueName();
+ }
+
+ ins += ",c_object_status";
+
+ //attribute restriction
+ if(!generateAttributeRest_.empty())
+ whereClause += " AND "+ generateAttributeRest_;
+
+ //temporal restriction
+ if(!generateTemporalRest_.empty())
+ {
+ string sqlTemp;
+ initParse(generateTemporalRest_, db);
+
+ if(!yyparse(sqlTemp)) //0: accept 1: reject
+ whereClause += " AND "+ sqlTemp;
+ else
+ return false;
+ }
+
+ Keys objs;
+
+ //spatial restriction
+ if(hasSpatialRes_)
+ {
+ //TeRepresentation* rep = layer_->vectRepres()[0];
+ string geomTable = layer_->tableName(geomRepRest_);
+
+ if(boxRest_.isValid())
+ {
+ TeBox box = boxRest_;
+ whereClause += " AND "+ db->getSQLBoxWhere(box, geomRepRest_);
+ }
+ else if (geomRest_)
+ {
+
+ TePrecision::instance().setPrecision(TeGetPrecision(layer()->projection()));
+
+ if(db->spatialRelation(geomTable, geomRepRest_, geomRest_, objs, spatialRelation_))
+ {
+ string obs;
+ for(unsigned int i=0; i<objs.size(); i++)
+ {
+ if(i!=0)
+ obs += ",";
+ obs += "'"+ objs[i] +"'";
+ }
+
+ whereClause += " AND "+ geomTable +".object_id IN ("+ obs +")";
+ }
+ }
+ }
+
+ bool usaTemporal = false;
+ for (i = 0; i < attTableVector_.size(); ++i)
+ {
+ if (attTableVector_[i].tableType() == TeAttrExternal ||
+ attTableVector_[i].tableType() == TeFixedGeomDynAttr ||
+ attTableVector_[i].tableType() == TeDynGeomDynAttr)
+ {
+ whereClause += " AND ";
+ whereClause += aliasVector()[i] + "." + attTableVector_[i].uniqueName();
+ whereClause += " IS NOT NULL ";
+ }
+ if (attTableVector_[i].tableType() == TeFixedGeomDynAttr ||
+ attTableVector_[i].tableType() == TeDynGeomDynAttr)
+ usaTemporal = true;
+ }
+
+ string result = ins + sqlFrom() + whereClause + " ";
+ bool ret = db->execute(result);
+ if(ret == false)
+ return false;
+
+ TeAttribute at;
+ at.rep_.name_ = "unique_id";
+ at.rep_.type_ = TeSTRING;
+ at.rep_.numChar_ = 100;
+ at.rep_.isAutoNumber_ = false;
+ at.rep_.isPrimaryKey_ = true;
+ ret = db->alterTable(collectionAuxTable_, at.rep_);
+
+ if(usaTemporal) // filter collection table
+ {
+ string s = "DELETE FROM " + collectionTable_ + " WHERE c_object_id NOT IN";
+ s += " (SELECT DISTINCT object_id FROM " + collectionAuxTable_ + ")";
+ return(db->execute(s));
+ }
+ return true;
+}
+
+
+bool
+TeTheme::locatePolygon (TeCoord2D &pt, TePolygon &polygon, const double& tol)
+{
+ if (!layer()->database() || collectionTable().empty())
+ return false;
+
+ string geomTable = layer()->tableName(TePOLYGONS);
+ string sqlFrom = " "+ geomTable +" INNER JOIN " + collectionTable();
+ sqlFrom += " ON "+ collectionTable() +".c_object_id = "+ geomTable +".object_id ";
+
+ if(!layer()->database()->locatePolygon(sqlFrom, pt, polygon, tol))
+ return false;
+
+ return true;
+}
+
+
+bool
+TeTheme::locatePolygonSet (TeCoord2D &pt, double tol, TePolygonSet &polygons)
+{
+ if (!layer()->database() || collectionTable().empty())
+ return false;
+
+ string geomTable = layer()->tableName(TePOLYGONS);
+ string sqlFrom = " "+ geomTable +" INNER JOIN " + collectionTable();
+ sqlFrom += " ON "+ collectionTable() +".c_object_id = "+ geomTable +".object_id ";
+
+ if(!layer()->database()->locatePolygonSet(sqlFrom, pt, tol, polygons))
+ return false;
+
+ return true;
+}
+
+bool
+TeTheme::locateLine (TeCoord2D &pt, TeLine2D &line, const double& tol)
+{
+ if (!layer()->database() || collectionTable().empty())
+ return false;
+
+ string geomTable = layer()->tableName(TeLINES);
+ string sqlFrom = " "+ geomTable +" INNER JOIN " + collectionTable();
+ sqlFrom += " ON "+ collectionTable() +".c_object_id = "+ geomTable +".object_id ";
+
+ if(!layer()->database()->locateLine(sqlFrom, pt, line, tol))
+ return false;
+
+ return true;
+}
+
+bool
+TeTheme::locatePoint (TeCoord2D &pt, TePoint &point, const double& tol)
+{
+ if (!layer()->database() || collectionTable().empty())
+ return false;
+
+ string geomTable = layer()->tableName(TePOINTS);
+ string sqlFrom = " "+ geomTable +" INNER JOIN " + collectionTable();
+ sqlFrom += " ON "+ collectionTable() +".c_object_id = "+ geomTable +".object_id ";
+
+ if(!layer()->database()->locatePoint(sqlFrom, pt, point, tol))
+ return false;
+
+ return true;
+}
+
+bool
+TeTheme::locateCell (TeCoord2D &pt, TeCell &cell, const double& tol)
+{
+ if (!layer()->database() || collectionTable().empty())
+ return false;
+
+ string geomTable = layer()->tableName(TeCELLS);
+ string sqlFrom = " "+ geomTable +" INNER JOIN " + collectionTable();
+ sqlFrom += " ON "+ collectionTable() +".c_object_id = "+ geomTable +".object_id ";
+
+ if(!layer()->database()->locateCell(sqlFrom, pt, cell, tol))
+ return false;
+
+ return true;
+}
+
+//------------------------------ protected methods
+void
+TeTheme::loadAliasVector()
+{
+ unsigned int i, count;
+ TeTable table;
+ multimap<string, int> tableMMap;
+
+ aliasVector_.clear();
+
+ for (i = 0; i < attTableVector_.size(); ++i)
+ {
+ table = attTableVector_[i];
+
+ if (table.tableType() != TeAttrExternal)
+ aliasVector_.push_back(table.name());
+ else
+ {
+ count = tableMMap.count(table.name());
+ if (count == 0)
+ aliasVector_.push_back(table.name());
+ else
+ aliasVector_.push_back(table.name() + "_" + Te2String(count));
+
+ tableMMap.insert(multimap<string,int>::value_type(table.name(), ++count));
+ }
+ }
+}
+
+string
+TeTheme::sqlGridFrom(const string& geomTable)
+{
+ if(geomTable.empty())
+ return sqlGridFrom_;
+
+ string result;
+ loadTablesJoin(geomTable);
+ result = sqlGridFrom_;
+ loadTablesJoin();
+ return result;
+}
+
+string
+TeTheme::sqlWhereRestrictions(TeRepresentation* rep)
+{
+ Keys objs;
+ string whereClause= " 1 = 1 ";
+ TeDatabase* db = layer()->database();
+
+ // load the first representation
+ if(!rep)
+ rep = (layer()->vectRepres())[0];
+
+ // temporal restrictions are applied only to temporal tables
+ if(hasTemporalRest())
+ {
+ string result = "";
+
+ initParse(temporalRest(), db);
+
+ if(!yyparse(result)) //0: accept 1: reject
+ whereClause += " AND "+ result;
+ else
+ return "";
+ }
+
+ // we should test if the attribute restriction is valid
+ if (hasAttrRest())
+ whereClause += " AND "+ attributeRest();
+
+ // spatial restriction with other geometry representation
+ if (hasSpatialRest() && rep)
+ {
+ if(boxRestriction().isValid())
+ {
+ TeBox b = boxRestriction();
+ TeGeomRep gRep = rep->geomRep_;
+// whereClause += " AND "+ db->getSQLBoxWhere(boxRestriction(), rep->geomRep_);
+ whereClause += " AND "+ db->getSQLBoxWhere(b, gRep);
+ }
+ else if(geomRestriction())
+ {
+ string geomTableRest = layer()->tableName(geomRepRestriction());
+ TePrecision::instance().setPrecision(TeGetPrecision(layer()->projection()));
+
+ if(db->spatialRelation(geomTableRest, geomRepRestriction(), geomRestriction(),
+ objs, spatialRelation()))
+ {
+ string obs;
+ for(unsigned int i=0; i<objs.size(); i++)
+ {
+ if(i!=0)
+ obs += ",";
+ obs += "'"+ objs[i] +"'";
+ }
+
+ whereClause += " AND "+ rep->tableName_ +".object_id IN ("+ obs +")";
+ }
+ }
+ }
+ return whereClause;
+}
+
+
+
+void
+TeTheme::loadTablesJoin(const string& geomTable) //sqlGridFrom and sqlGridJoin
+{
+ unsigned int i, count;
+ multimap<string, int> tableMMap;
+ TeTable table;
+ bool hasExternalTable = false;
+
+ // Set the new sqlGridFrom_ clause and the new sqlGridJoin_ string
+ sqlGridFrom_.clear();
+ sqlGridJoin_.clear();
+
+ TeAttrTableVector tableVec;
+ vector<string> aliasVec;
+
+ if(!geomTable.empty())
+ {
+ TeTable table;
+ table.name(geomTable);
+ table.setLinkName("object_id");
+ table.setUniqueName("object_id");
+ table.setTableType(TeAttrStatic);
+ tableVec.push_back(table);
+
+ for(i=0; i<attTableVector_.size(); ++i)
+ tableVec.push_back(attTableVector_[i]);
+
+ aliasVec.push_back(geomTable);
+ for(i=0; i<aliasVector_.size(); ++i)
+ aliasVec.push_back(aliasVector_[i]);
+ }
+ else
+ {
+ tableVec = attTableVector_;
+ aliasVec = aliasVector_;
+ }
+
+ //verify if there is external table
+ for (i = 0; i < tableVec.size(); ++i)
+ {
+ if (tableVec[i].tableType() == TeAttrExternal)
+ {
+ hasExternalTable = true;
+ break;
+ }
+ }
+
+ if(!collectionAuxTable_.empty())
+ {
+ sqlGridFrom_ = " FROM ";
+
+ for (i = 0; i <= tableVec.size(); ++i)
+ sqlGridFrom_ += "(";
+
+ sqlGridFrom_ += collectionAuxTable_;
+ sqlGridJoin_ = "SELECT ";
+
+ if(hasExternalTable)
+ sqlGridFrom_ += " RIGHT JOIN "+ collectionTable_;
+ else
+ sqlGridFrom_ += " LEFT JOIN "+ collectionTable_;
+
+ sqlGridFrom_ += " ON "+ collectionAuxTable_ +".object_id = "+ collectionTable_ +".c_object_id )";
+
+ int numAux = 0;
+ for (i = 0; i < tableVec.size(); ++i)
+ {
+ table = tableVec[i];
+ if ((table.tableType()==TeAttrStatic) || (table.tableType()==TeAttrMedia) || (table.tableType()==TeAttrEvent))
+ {
+ sqlGridFrom_ += " LEFT JOIN " + aliasVec[i];
+ sqlGridFrom_ += " ON " + collectionTable_ +".c_object_id = " + aliasVec[i] + "." + table.linkName() +")";
+ }
+ else if (table.tableType() == TeAttrExternal)
+ {
+ count = tableMMap.count(table.name());
+ if (count == 0)
+ sqlGridFrom_ += " LEFT JOIN " + aliasVec[i];
+ else
+ sqlGridFrom_ += " LEFT JOIN " + table.name() + " AS " + aliasVec[i];
+
+ tableMMap.insert(multimap<string,int>::value_type(table.name(), ++count));
+ sqlGridFrom_ += " ON " + collectionAuxTable_ + ".aux" + Te2String(numAux++) +" = "+ aliasVec[i] +"."+ table.uniqueName() +")";
+ }
+ else
+ {
+ sqlGridFrom_ += " LEFT JOIN " + aliasVec[i];
+ sqlGridFrom_ += " ON " + collectionAuxTable_ + ".aux" + Te2String(numAux++) +" = "+ aliasVec[i] +"."+ table.uniqueName() +")";
+ }
+
+ sqlGridJoin_ += aliasVec[i] + ".*,";
+ }
+
+ sqlGridJoin_ += collectionTable_ + ".*, " + collectionAuxTable_ + ".* " + sqlGridFrom_;
+ }
+ loadThemeTablesJoin();
+}
+
+
+void TeTheme::loadThemeTablesJoin() ////sqlJoin and sqlFrom
+{
+ unsigned int i, count;
+ multimap<string, int> tableMMap;
+ TeTable table;
+
+ // Set the new from clause and the new join string
+ sqlFrom_.clear();
+ sqlJoin_.clear();
+
+ sqlFrom_ = " FROM ";
+ sqlJoin_ = "SELECT ";
+
+ if (collectionTable_.empty() == false)
+ {
+ for (i = 0; i < attTableVector_.size(); ++i)
+ sqlFrom_ += "(";
+ sqlFrom_ += collectionTable_;
+
+ for (i = 0; i < attTableVector_.size(); ++i)
+ {
+ table = attTableVector_[i];
+ if (table.tableType() != TeAttrExternal)
+ {
+ sqlFrom_ += " LEFT JOIN " + aliasVector_[i];
+ sqlFrom_ += " ON " + collectionTable_ + ".c_object_id = " + aliasVector_[i] + "." + table.linkName() + ")";
+ }
+ else
+ {
+ count = tableMMap.count(table.name());
+ if (count == 0)
+ sqlFrom_ += " LEFT JOIN " + aliasVector_[i];
+ else
+ sqlFrom_ += " LEFT JOIN " + table.name() + " AS " + aliasVector_[i];
+
+ tableMMap.insert(multimap<string,int>::value_type(table.name(), ++count));
+
+ sqlFrom_ += " ON " + table.relatedTableName() + "." + table.relatedAttribute() + " = ";
+ sqlFrom_ += aliasVector_[i] + "." + table.linkName() + ")";
+ }
+
+ sqlJoin_ += aliasVector_[i] + ".*,";
+ }
+
+ sqlJoin_ += collectionTable_ + ".*" + sqlFrom_;
+ }
+ else
+ {
+ if (attTableVector_.size() == 1)
+ {
+ table = attTableVector_[0];
+ sqlFrom_ += table.name();
+ sqlJoin_ = "SELECT " + table.name() + ".*" + sqlFrom_;
+ }
+ else
+ {
+ for (i = 0; i < attTableVector_.size() - 1; ++i)
+ sqlFrom_ += "(";
+
+ TeTable firstTable = attTableVector_[0];
+ sqlFrom_ += firstTable.name();
+ sqlJoin_ += firstTable.name() + ".*,";
+ for (i = 1; i < attTableVector_.size(); ++i)
+ {
+ table = attTableVector_[i];
+ sqlFrom_ += " LEFT JOIN " + aliasVector_[i];
+ sqlFrom_ += " ON " + firstTable.name() + "." + firstTable.linkName() + " = " + aliasVector_[i] + "." + table.linkName() + ")";
+
+ if (i == attTableVector_.size() - 1)
+ sqlJoin_ += aliasVector_[i] + ".*";
+ else
+ sqlJoin_ += aliasVector_[i] + ".*,";
+ }
+
+ sqlJoin_ += sqlFrom_;
+ }
+ }
+}
+
+void
+TeTheme::loadAttrLists()
+{
+ // Set the new list of attributes of all the theme tables and its new numerical list,
+ unsigned int i, j, count;
+ TeTable table;
+ multimap<string, int> attrMMap;
+ string attrName;
+
+ sqlAttList_.clear();
+ sqlNumAttList_.clear();
+
+ if (layer() == 0)
+ return;
+ TeDatabase *db = layer()->database();
+
+ for (i = 0; i < attTableVector_.size(); ++i)
+ {
+ table = attTableVector_[i];
+
+ // Set the map of attribute names
+ TeAttributeList attrList;
+ db->getAttributeList(table.name(), attrList);
+ for (j = 0; j < attrList.size(); ++j)
+ {
+ attrName = attrList[j].rep_.name_;
+ count = attrMMap.count(attrName);
+ attrMMap.insert(multimap<string,int>::value_type(attrName, ++count));
+ }
+ }
+
+ // Set the list of attribute names that contains all the attribute names
+ // of the theme tables
+ for (i = 0; i < attTableVector_.size(); ++i)
+ {
+ TeAttributeList attrList;
+ table = attTableVector_[i];
+ db->getAttributeList(table.name(), attrList);
+ for (j = 0; j < attrList.size(); ++j)
+ {
+ attrName = attrList[j].rep_.name_;
+ count = attrMMap.count(attrName);
+ if (count == 1)
+ attrList[j].rep_.name_ = attrName;
+ else
+ attrList[j].rep_.name_ = aliasVector_[i] + "." + attrName;
+
+ sqlAttList_.push_back(attrList[j]);
+ }
+ }
+
+ // Set the list of attribute names that contains all the numeric attribute names
+ // of the theme tables
+ for(i = 0; i < sqlAttList_.size(); ++i)
+ {
+ if(sqlAttList_[i].rep_.type_ == TeREAL || sqlAttList_[i].rep_.type_ == TeINT)
+ sqlNumAttList_.push_back(sqlAttList_[i]);
+ }
+}
+
+bool
+TeTheme::saveLegendInCollection(TeSelectedObjects selectedObjects) //colocar o count por grupo
+{
+ unsigned int i;
+ if(!grouping_)
+ return false;
+
+ TeAttrDataType type = grouping_->groupAttribute_.type_;
+ TeLegendEntryVector legVec = legend_;
+ string groupingAttr = grouping_->groupAttribute_.name_;
+
+ string input;
+ if(selectedObjects == TeSelectedByPointing)
+ {
+ input = " WHERE (grid_status = 1 OR grid_status = 3";
+ input += " OR (grid_status IS NULL AND (c_object_status = 1 OR c_object_status = 3)))";
+ }
+ else if(selectedObjects == TeNotSelectedByPointing)
+ {
+ input = " WHERE (grid_status = 0 OR grid_status = 2";
+ input += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 2)))";
+ }
+ else if(selectedObjects == TeSelectedByQuery)
+ {
+ input = " WHERE (grid_status = 2 OR grid_status = 3";
+ input += " OR (grid_status is null AND (c_object_status = 2 OR c_object_status = 3)))";
+ }
+ else if(selectedObjects == TeNotSelectedByQuery)
+ {
+ input = " WHERE (grid_status = 0 OR grid_status = 1";
+ input += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 1)))";
+ }
+ else if(selectedObjects == TeGrouped)
+ input = " WHERE c_legend_id <> 0";
+ else if(selectedObjects == TeNotGrouped)
+ input = " WHERE c_legend_id = 0";
+
+
+ string func;
+ if(grouping_->groupFunction_.empty())
+ func = " MIN";
+ else
+ func = grouping_->groupFunction_;
+
+ if(grouping_->groupFunction_ == "COUNT")
+ type = TeINT;
+
+ string query = "SELECT MIN(" + collectionTable_ + ".c_object_id)";
+ if(grouping_->groupNormAttribute_.empty())
+ query += ", "+ func +"(" + groupingAttr + ")" + sqlGridFrom();
+ else
+ query += ", "+ func +"(" + groupingAttr + ") / "+ func +"(" + grouping_->groupNormAttribute_ + ")" + sqlGridFrom();
+
+ if(selectedObjects != TeAll)
+ query += input;
+
+ query += " GROUP BY " + collectionTable_ + ".c_object_id";
+
+ map<int, vector<string> > legMap;
+ TeDatabase *db = layer()->database();
+ TeDatabasePortal* portal = db->getPortal();
+ if(portal->query(query) == false)
+ {
+ delete portal;
+ return false;
+ }
+
+ vector<string> idVec;
+ vector<string> nullIdVec;
+ vector<string> valVec;
+ while(portal->fetchRow())
+ {
+ string val = portal->getData(1);
+ string oid = portal->getData(0);
+ if (val.empty() == false)
+ {
+ idVec.push_back(oid);
+ valVec.push_back(val);
+ }
+ else
+ nullIdVec.push_back(oid);
+ }
+ if (grouping_->groupMode_ == TeUniqueValue)
+ {
+ unsigned int j = 0;
+ while( j < idVec.size())
+ {
+ string val = valVec[j];
+ string oid = idVec[j];
+ if(type == TeREAL)
+ {
+ double a = atof(val.c_str());
+ val = Te2String(a, grouping_->groupPrecision_);
+ }
+ else if(type == TeINT)
+ {
+ int a = atoi(val.c_str());
+ val = Te2String(a);
+ }
+
+ unsigned int siz = legend_.size();
+ if (nullIdVec.size())
+ --siz;
+ for(i=0; i < siz; i++)
+ {
+ TeLegendEntry& leg = legend_[i];
+ if(val == leg.from())
+ {
+ legMap[leg.id()].push_back(oid);
+ break;
+ }
+ }
+ j++;
+ }
+ }
+ else
+ {
+ unsigned int j = 0;
+ while(j < idVec.size())
+ {
+ string val = valVec[j];
+ string oid = idVec[j];
+ if(type == TeREAL)
+ {
+ double a = atof(val.c_str());
+ val = Te2String(a, grouping_->groupPrecision_);
+ }
+
+ unsigned int siz = legend_.size();
+ if (nullIdVec.size())
+ --siz;
+ for(i=0; i < siz; i++)
+ {
+ TeLegendEntry& leg = legend_[i];
+ int f = leg.from().find("mean", string::npos);
+ if(f >= 0)
+ continue;
+ double dval = atof(val.c_str());
+ double dfrom = atof(leg.from().c_str());
+ double dto = atof(leg.to().c_str());
+ if(i < legend_.size()-1)
+ {
+ if(dval >= dfrom && dval < dto)
+ {
+ legMap[leg.id()].push_back(oid);
+ break;
+ }
+ }
+ else
+ {
+ if(dval >= dfrom && dval <= dto)
+ {
+ legMap[leg.id()].push_back(oid);
+ break;
+ }
+ }
+ }
+ j++;
+ }
+ }
+ delete portal;
+
+ int legId = legend_[legend_.size()-1].id();
+ for(i = 0; i < nullIdVec.size(); ++i)
+ {
+ string oid = nullIdVec[i];
+ legMap[legId].push_back(oid);
+ }
+
+ vector<string> svec;
+ map<int, vector<string> > :: iterator it = legMap.begin();
+ while(it != legMap.end())
+ {
+ // --- Generate In Clauses ----
+ unsigned int i, j, k, size, chunkSize = 200, nChunks;
+ string inClause;
+ size = it->second.size();
+ if (size % chunkSize)
+ nChunks = size / chunkSize + 1;
+ else
+ nChunks = size / chunkSize;
+
+ j = 0;
+ for (k = 0; k < nChunks; ++k)
+ {
+ i = 0;
+ inClause = "(";
+ while (j < size && i < chunkSize)
+ {
+ inClause += "'" + db->escapeSequence(it->second[j]) + "',";
+ i++;
+ j++;
+ }
+ inClause[inClause.size() - 1] = ')';
+ svec.push_back(inClause);
+ }
+
+ //--- generateInClause
+
+ for(i=0; i<svec.size(); i++)
+ {
+ string up = "UPDATE " + collectionTable_ + " SET c_legend_id = " + Te2String(it->first);
+ up += " WHERE c_object_id IN " + svec[i];
+
+ if(db->execute(up) == false)
+ continue;
+ }
+ it++;
+ svec.clear();
+ }
+ if(legend_.size())
+ visibleRep_ = visibleRep_ | 0x40000000;
+ else
+ visibleRep_ = visibleRep_ | 0xbfffffff;
+ string upVis = "UPDATE te_theme SET visible_rep=" + Te2String(visibleRep_) + " WHERE theme_id=" + Te2String(id_);
+ return (db->execute(upVis));
+}
+
+bool
+TeTheme::populateCollection()
+{
+ TeDatabase* db = layer_->database();
+ if(!db || collectionTable_.empty())
+ return false;
+
+ if(attTableVector_.empty())
+ attTableVector_ = layer_->attrTables();
+
+// TeRepresentation* rep = layer_->vectRepres()[0];
+ TeRepresPointerVector& represVec = layer_->vectRepres();
+ for (unsigned int i = 0; i < represVec.size(); ++i)
+ {
+ TeRepresentation* rep = represVec[i];
+ if (rep->geomRep_ == TeTEXT)
+ continue;
+
+ string geomTable = layer_->tableName(rep->geomRep_);
+
+ string sqlSelect, sqlFrom, sqlWhere;
+
+ sqlSelect = " SELECT DISTINCT "+ geomTable +".object_id ";
+ sqlFrom = tableJoin(attTableVector_, geomTable, "object_id");
+
+// sqlWhere = " WHERE 1=1 ";
+ sqlWhere = " WHERE " + geomTable + ".object_id NOT IN (SELECT c_object_id FROM " + collectionTable_ + ")";
+
+ //attribute restriction
+ if(!generateAttributeRest_.empty())
+ sqlWhere += " AND "+ generateAttributeRest_;
+
+ //temporal restriction
+ if(!generateTemporalRest_.empty())
+ {
+ string sqlTemp;
+ initParse(generateTemporalRest_, db);
+
+ if(!yyparse(sqlTemp)) //0: accept 1: reject
+ sqlWhere += " AND "+ sqlTemp;
+ else
+ return false;
+ }
+
+ Keys objs;
+
+ //spatial restriction
+ if(hasSpatialRes_)
+ {
+ if(boxRest_.isValid())
+ {
+ TeBox box = boxRest_;
+ sqlWhere += " AND "+ db->getSQLBoxWhere(box, geomRepRest_);
+ }
+ else if (geomRest_)
+ {
+ TePrecision::instance().setPrecision(TeGetPrecision(layer()->projection()));
+
+ if(db->spatialRelation(geomTable, geomRepRest_, geomRest_, objs, spatialRelation_))
+ {
+ string obs;
+ for(unsigned int i=0; i<objs.size(); i++)
+ {
+ if(i!=0)
+ obs += ",";
+ obs += "'"+ objs[i] +"'";
+ }
+
+ sqlWhere += " AND "+ geomTable +".object_id IN ("+ obs +")";
+ }
+ }
+ }
+
+ //populate the collection table
+ string popule;
+ popule = " INSERT INTO "+ collectionTable_ +" (c_object_id) ";
+ popule += sqlSelect +" FROM "+ sqlFrom + sqlWhere;
+
+ if (!db->execute(popule))
+ return false;
+ }
+
+// int defaultLegend = defaultLegend_.id();
+ string popule = "UPDATE " + collectionTable_;
+ popule += " SET c_legend_id=0, c_legend_own=0, c_object_status=0 ";
+
+ if (!db->execute(popule))
+ return false;
+
+ return true;
+}
+
+
+void TeTheme::createRasterVisual(TeRaster* rst)
+{
+ if (rasterVisual_)
+ delete rasterVisual_;
+
+ if (!rst)
+ rst = layer_->raster();
+
+ if (!rst)
+ return;
+
+ rasterVisual_ = new TeRasterTransform();
+
+ if (rst->params().photometric_[0] == TeRASTERPALETTE || // raster palette -> uses its palette
+ rst->params().photometric_[0] == TeRASTERTHEMATIC)
+ {
+ rasterVisual_->setTransfFunction(&TeRasterTransform::Pallete2ThreeBand);
+ rasterVisual_->setLutSize(rst->params().lutr_.size());
+ return;
+ }
+
+ if (visibleRep_ & 0x40000000 && grouping_ && // sliced raster -> generate the
+ grouping_->groupMode_ == TeRasterSlicing) // appropriate palette
+ {
+ int band = atoi(grouping_->groupAttribute_.name_.c_str());
+ rasterVisual_->setSrcBand(band);
+ if (rst->params().dataType_[band] != TeUNSIGNEDCHAR)
+ rasterVisual_->generateLUT(legend_, 1024, defaultLegend_.visual(TePOLYGONS).color());
+ else
+ rasterVisual_->generateLUT(legend_, 256, defaultLegend_.visual(TePOLYGONS).color());
+ rasterVisual_->setTransfFunction(&TeRasterTransform::LUT2ThreeBand);
+ return;
+ }
+
+ if (rst->params().dataType_[0] != TeUNSIGNEDCHAR) // non unsigned char -> generate linear transformation
+ rasterVisual_->setLinearTransfParameters(rst->params().vmin_[0],rst->params().vmax_[0], 0, 255);
+
+ if (rst->params().nBands() == 1)
+ rasterVisual_->setTransfFunction(&TeRasterTransform::Mono2ThreeBand);
+ else
+ rasterVisual_->setTransfFunction(&TeRasterTransform::Band2Band);
+}
+
+
diff --git a/src/terralib/kernel/TeTheme.h b/src/terralib/kernel/TeTheme.h
new file mode 100644
index 0000000..d796320
--- /dev/null
+++ b/src/terralib/kernel/TeTheme.h
@@ -0,0 +1,765 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeTheme.h
+ This file contains definitions about a theme in TerraLib
+*/
+#ifndef __TERRALIB_INTERNAL_THEME_H
+#define __TERRALIB_INTERNAL_THEME_H
+
+#include "TeViewNode.h"
+#include "TeLayer.h"
+#include "TeLegendEntry.h"
+#include "TeDataTypes.h"
+#include "TeRasterTransform.h"
+
+
+//! This structure is used to store the grouping parameters used in a theme
+struct TeGrouping
+{
+
+ //! Returns the attribute used to group the objects of the theme
+ TeAttributeRep groupAttribute_;
+
+ //! Returns the attribute used to normalize a grouping
+ string groupNormAttribute_;
+
+ //! Returns the grouping mode
+ TeGroupingMode groupMode_;
+
+ //! Returns the number of groups
+ int groupNumSlices_;
+
+ //! Returns the numeric precision used to group objects
+ int groupPrecision_;
+
+ //! Returns the deviation parameter used to group objects
+ double groupStdDev_;
+
+ //! Aggregate function
+ string groupFunction_;
+
+ //! Show missing data
+ bool groupNullAttr_;
+
+ //! Minimum value used to calculate a equal step grouping
+ double groupMinVal_;
+
+ //! Maximum value used to calculate a equal step grouping
+ double groupMaxVal_;
+
+ //! Constructor
+ TeGrouping(TeAttributeRep att=TeAttributeRep(), const string& normAttr="",
+ TeGroupingMode gMode=TeEqualSteps, int numSlice=0, int gPrecision=6,
+ double gStDev=1.0, const string& func=""):
+ groupAttribute_(att),
+ groupNormAttribute_(normAttr),
+ groupMode_(gMode),
+ groupNumSlices_(numSlice),
+ groupPrecision_(gPrecision),
+ groupStdDev_(gStDev),
+ groupFunction_(func),
+ groupNullAttr_(false),
+ groupMinVal_(TeMAXFLOAT),
+ groupMaxVal_(TeMINFLOAT)
+ {}
+
+ //! Copy constructor
+ TeGrouping(const TeGrouping& other)
+ {
+ groupAttribute_ = other.groupAttribute_;
+ groupNormAttribute_ = other.groupNormAttribute_;
+ groupMode_ = other.groupMode_;
+ groupNumSlices_ = other.groupNumSlices_;
+ groupPrecision_ = other.groupPrecision_;
+ groupStdDev_ = other.groupStdDev_;
+ groupFunction_ = other.groupFunction_;
+ groupNullAttr_ = other.groupNullAttr_;
+ groupMinVal_ = other.groupMinVal_;
+ groupMaxVal_ = other.groupMaxVal_;
+ }
+
+ //! Destructor
+ ~TeGrouping() {}
+
+ TeGrouping& operator= (const TeGrouping& other)
+ {
+ if ( this != &other )
+ {
+ groupAttribute_ = other.groupAttribute_;
+ groupNormAttribute_ = other.groupNormAttribute_;
+ groupMode_ = other.groupMode_;
+ groupNumSlices_ = other.groupNumSlices_;
+ groupPrecision_ = other.groupPrecision_;
+ groupStdDev_ = other.groupStdDev_;
+ groupFunction_ = other.groupFunction_;
+ groupNullAttr_ = other.groupNullAttr_;
+ groupNullAttr_ = other.groupNullAttr_;
+ groupMinVal_ = other.groupMinVal_;
+ groupMaxVal_ = other.groupMaxVal_;
+ }
+ return *this;
+ }
+};
+
+using namespace std;
+
+//! TerraLib definition of a Theme
+/*!
+\par A Theme is a collection of objects selected from a TeLayer spatial and non spatial
+criteria. A theme points to the visual presentation parameters of its objects.
+
+\par A Theme store the parameters about how to group its objects according com its attributes.
+
+\par A theme may have many associated graphics, which includes histogram, pie charts,
+scatterplots, etc. These graphics are visible only when the theme is visible.
+
+\par A theme has a threshold, that defines the minimum and maximum scales
+at which the Theme is drawn.
+
+ \sa TeView TeTable
+*/
+class TeTheme: public TeViewNode
+{
+public:
+
+ //! Constructor
+ TeTheme( const string& name="", TeLayer* layer=0, TeViewNode* parent = 0, int view=0, int id=0)
+ : TeViewNode(name, parent, view, id, TeTHEME),
+ layer_(layer),
+ generateAttributeRest_(""),
+ generateTemporalRest_(""),
+ hasSpatialRes_(false),
+ geomRest_(0),
+ minScale_(0.0),
+ maxScale_(0.0),
+ visibleRep_(0),
+ enableVisibility_(1),
+ grouping_(0),
+ rasterVisual_(0)
+ {
+ //default legends
+ TeVisual visp(TePOLYGONS);
+ TeVisual visl(TeLINES);
+ TeVisual vispt(TePOINTS);
+ TeVisual vist(TeTEXT);
+ TeColor color;
+ color.init(100, 220, 220);
+ visp.color(color);
+ visl.color(color);
+ vispt.color(color);
+ color.init(100, 100, 100);
+ visp.contourColor(color);
+ visl.contourColor(color);
+ vispt.contourColor(color);
+ outOfCollectionLegend_.setVisual(visp, TePOLYGONS);
+ outOfCollectionLegend_.setVisual(visl, TeLINES);
+ outOfCollectionLegend_.setVisual(vispt, TePOINTS);
+
+ color.init(220, 100, 220);
+ visp.color(color);
+ visl.color(color);
+ vispt.color(color);
+ color.init(100, 100, 100);
+ visp.contourColor(color);
+ visl.contourColor(color);
+ vispt.contourColor(color);
+ withoutDataConnectionLegend_.setVisual(visp, TePOLYGONS);
+ withoutDataConnectionLegend_.setVisual(visl, TeLINES);
+ withoutDataConnectionLegend_.setVisual(vispt, TePOINTS);
+
+ color.init(220, 0, 0);
+ visp.color(color);
+ color.init(0, 220, 220);
+ visl.color(color);
+ color.init(220, 90, 180);
+ vispt.color(color);
+ color.init(100, 100, 100);
+ visp.contourColor(color);
+ visl.contourColor(color);
+ vispt.contourColor(color);
+ defaultLegend_.setVisual(visp, TePOLYGONS);
+ defaultLegend_.setVisual(visl, TeLINES);
+ defaultLegend_.setVisual(vispt, TePOINTS);
+ color.init(0, 0, 0);
+ vist.color(color);
+ defaultLegend_.setVisual(vist, TeTEXT);
+
+
+ color.init(80, 240, 100);
+ visp.color(color);
+ color.init(100, 100, 100);
+ visp.contourColor(color);
+ pointingLegend_.setVisual(visp, TePOLYGONS);
+
+ color.init(210, 210, 0);
+ visp.color(color);
+ color.init(100, 100, 100);
+ visp.contourColor(color);
+ queryLegend_.setVisual(visp, TePOLYGONS);
+
+ color.init(255, 255, 0);
+ visp.color(color);
+ color.init(100, 100, 100);
+ visp.contourColor(color);
+ queryAndPointingLegend_.setVisual(visp, TePOLYGONS);
+
+ //layer id
+ if(layer)
+ {
+ layerId_ = layer->id();
+ }
+ else
+ layerId_ = -1;
+ }
+
+ //! Copy constructor
+ TeTheme (TeTheme& other) : TeViewNode(other.name(), other.parent(), other.view(), other.id(), TeTHEME)
+ {
+ layerId_ = other.layerId();
+ layer_ = other.layer(); //the same layer pointer
+ generateAttributeRest_ = other.attributeRest();
+ generateTemporalRest_ = other.temporalRest();
+ generateSpatialRest_ = other.spatialRest();
+ spatialRelation_ = other.spatialRelation();
+ hasSpatialRes_ = other.hasSpatialRest();
+ boxRest_ = other.boxRestriction();
+ geomRest_ = other.geomRestriction();
+ geomRepRest_ = other.geomRepRestriction();
+ minScale_ = other.minScale();
+ maxScale_ = other.maxScale();
+ collectionTable_ = other.collectionTable();
+ collectionAuxTable_ = other.collectionAuxTable();
+ visibleRep_ = other.visibleRep();
+ enableVisibility_ = other.visibility();
+
+ if(grouping_)
+ delete grouping_;
+ grouping_ = 0;
+ if(other.grouping())
+ {
+ grouping_ = new TeGrouping();
+ (*grouping_) = (*other.grouping());
+ }
+
+ legend_ = other.legend();
+ outOfCollectionLegend_ = other.outOfCollectionLegend();
+ withoutDataConnectionLegend_ = other.withoutDataConnectionLegend();
+ defaultLegend_ = other.defaultLegend ();
+ pointingLegend_ = other.pointingLegend();
+ queryLegend_ = other.queryLegend();
+ queryAndPointingLegend_ = other.queryAndPointingLegend();
+
+ attTableVector_ = other.attrTables();
+ sqlFrom_ = other.sqlFrom();
+ sqlJoin_ = other.sqlGridJoin();
+ sqlGridFrom_ = other.sqlGridFrom();
+ sqlGridJoin_ = other.sqlGridJoin();
+ aliasVector_ = other.aliasVector();
+ sqlAttList_ = other.sqlAttList();
+ sqlNumAttList_ = other.sqlNumAttList();
+
+ if(rasterVisual_)
+ delete rasterVisual_;
+ rasterVisual_ = 0;
+ if(other.rasterVisual())
+ {
+ rasterVisual_ = new TeRasterTransform();
+ (*rasterVisual_) = (*other.rasterVisual());
+ }
+ }
+
+ //! Destructor
+ ~TeTheme ()
+ {
+ if (rasterVisual_)
+ delete rasterVisual_;
+ if (grouping_)
+ delete grouping_;
+ }
+
+ //! Assignment operator
+ TeTheme& operator= (TeTheme& other);
+
+ //! Returns the id of the source layer
+ int layerId ()
+ { return layerId_; }
+
+ //! Sets the id of the source layer
+ void layerId(int i)
+ { layerId_ = i; }
+
+ //! Set the source layer
+ /*! \param layer a pointer to a layer from which theme get its objects
+ */
+ void layer (TeLayer* layer)
+ {
+ layer_ = layer;
+ if (layer)
+ layerId_ = layer->id();
+ }
+
+ //! Returns a pointer to the layer from which the theme get its objects
+ TeLayer* layer () { return layer_; }
+
+ //! Returns TRUE if a theme has lower priority than another
+ bool operator< (const TeTheme& r) const
+ { return priority_ < r.priority_; }
+
+ //! Returns the minimum scale in which the theme is visible
+ double minScale () { return minScale_; }
+ //! Set the minimum scale in which the theme is visible
+ void minScale (double s) { minScale_ = s; }
+
+ //! Returns the maximum scale in which the theme is visible
+ double maxScale () { return maxScale_; }
+ //! Set the maximum scale in which the theme is visible
+ void maxScale (double s) { maxScale_ = s; }
+
+ //! Returns a vector of theme legends
+ TeLegendEntryVector& legend () { return legend_; }
+
+ //! Returns the attribute restriction (where clause) used to generate the theme
+ string attributeRest() { return generateAttributeRest_; }
+ //! Set the attribute restriction (where clause) used to generate the theme
+ void attributeRest(const string& s) { generateAttributeRest_ = s; }
+ //! Returns if there is an attribute restriction
+ bool hasAttrRest () { return (!generateAttributeRest_.empty());}
+
+ //! Returns the temporal restriction used to generate the theme
+ string temporalRest() { return generateTemporalRest_; }
+ //! Set the temporal restriction used to generate the theme
+ void temporalRest(const string& t) { generateTemporalRest_ = t; };
+ //! Returns if there is a temporal restriction
+ bool hasTemporalRest () { return (!generateTemporalRest_.empty());}
+
+ //! Returns the spatial restriction used to generate the theme
+ string spatialRest() { return generateSpatialRest_; }
+ //! Set the spatial restriction used to generate the theme
+ void spatialRest(const string& s) { generateSpatialRest_ = s; };
+
+ //! Returns the spatial relation
+ TeSpatialRelation spatialRelation() {return spatialRelation_;}
+ //! Sets the spatial relation
+ void spatialRelation(TeSpatialRelation s) {spatialRelation_=s;}
+
+ //! Returns if there is a spatial restriction
+ bool hasSpatialRest () { return hasSpatialRes_;}
+ //! Sets if there is a spatial restriction
+ void hasSpatialRest (bool a) {hasSpatialRes_ = a;}
+
+ //! Returns the box associated with the spatial restriction
+ TeBox boxRestriction() {return boxRest_;}
+ //! Sets the box associated with the spatial restriction
+ void boxRestriction (TeBox& b) {boxRest_ = b;}
+
+ //! Returns a pointer to the geometry associated with the spatial restriction
+ TeGeometry* geomRestriction() { return geomRest_;}
+ //! Sets a pointer to the geometry associated with the spatial restriction
+ void geomRestriction(TeGeometry* g) {geomRest_ = g;}
+
+ //! Returns the geometry representation of the theme which will be considered in the spatial restriction
+ TeGeomRep geomRepRestriction() { return geomRepRest_; }
+ //! Sets the geometry representation of the theme which will be considered in the spatial restriction
+ void geomRepRestriction (TeGeomRep& rep) { geomRepRest_ = rep; }
+
+ //! Set the spatial restriction to be a spatial relation with a box
+ void setSpatialRest(TeBox& box, TeGeomRep rep = TeGEOMETRYNONE, TeSpatialRelation relation = TeWITHIN);
+ //! Set the spatial restriction to be a spatial relation with a geometry
+ void setSpatialRest(TeGeometry* geom, TeGeomRep rep = TeGEOMETRYNONE, TeSpatialRelation relation = TeWITHIN);
+
+ //! Returns the name of a table used to store the ids of the objects belonging to the theme
+ string collectionTable() { return collectionTable_; }
+ //! Set the name of a table used to store the ids of the objects belonging to the theme
+ void collectionTable(const string& s) { collectionTable_ = s; }
+
+ //! Return the name of the collection auxiliary table
+ string collectionAuxTable() { return collectionAuxTable_; }
+ //! Set the name of the collection auxiliary table
+ void collectionAuxTable(string name) { collectionAuxTable_ = name; }
+
+ //! Set the visible representation
+ void visibleRep (int rep) { visibleRep_ = rep; }
+ //! Return the visible representation
+ int visibleRep () { return visibleRep_; }
+
+ //! Returns the status of a theme
+ /*!
+ - Returns 0 if the theme is not visible and not active
+ - Returns 1 if the theme is visible and not active
+ - Returns 2 if theme is and active and not visible
+ - Returns 3 if theme is and visible and active
+ */
+ int visibility()
+ { return enableVisibility_; }
+ //! Set whether the theme should be visible and/or active
+ void visibility(int v)
+ { enableVisibility_ = v; }
+
+
+ //! verify if the theme was generated with restrictions
+ bool hasRestriction() { return (!(generateAttributeRest_.empty() ||
+ generateTemporalRest_.empty()) && hasSpatialRes_); }
+
+ //! Returns a grouping associated the theme
+ TeGrouping* grouping() {return grouping_; }
+
+ //! Sets a grouping associated the theme
+ void grouping(TeGrouping* g);
+
+ //! Returns the legend (visual presentation) of the layer objects that aren�t selected in this layer
+ TeLegendEntry& outOfCollectionLegend ()
+ { return outOfCollectionLegend_; }
+
+ //! Set the legend (visual presentation) of the layer objects that aren�t selected in this layer
+ void outOfCollectionLegend (TeLegendEntry &leg)
+ { outOfCollectionLegend_ = leg;}
+
+ //! Set the visual of the layer objects that aren�t selected in this layer
+ void setVisualOutOfCollection (TeVisual& visual, TeGeomRep rep)
+ { outOfCollectionLegend_.setVisual(visual, rep); }
+
+ //! Returns the legend (visual presentation) of the geometries without descriptive attributes
+ TeLegendEntry& withoutDataConnectionLegend ()
+ { return withoutDataConnectionLegend_; }
+
+ //! Set the legend (visual presentation) of the geometries without descriptive attributes
+ void withoutDataConnectionLegend (TeLegendEntry &leg)
+ { withoutDataConnectionLegend_ = leg; }
+
+ //! Set the visualof the geometries without descriptive attributes
+ void setVisualWithoutDataConnection (TeVisual& visual, TeGeomRep rep)
+ { withoutDataConnectionLegend_.setVisual(visual, rep); }
+
+ //! Returns the default legend (visual presentation) objects of the theme
+ TeLegendEntry& defaultLegend ()
+ { return defaultLegend_; }
+
+ //! Set the default legend (visual presentation) objects of the theme
+ void defaultLegend (TeLegendEntry& leg)
+ { defaultLegend_ = leg; }
+
+ //! Set the default visual of the objects of the theme
+ void setVisualDefault (TeVisual& visual, TeGeomRep rep)
+ { defaultLegend_.setVisual(visual, rep); }
+
+ //! Returns the legend (visual presentation) of the theme objects selected by pointing
+ TeLegendEntry& pointingLegend ()
+ { return pointingLegend_; }
+
+ //! Set the legend (visual presentation) of the theme objects selected by pointing
+ void pointingLegend (TeLegendEntry &leg)
+ { pointingLegend_ = leg; }
+
+ //! Set the visual of the theme objects selected by pointing
+ void setVisualPointing (TeVisual& visual, TeGeomRep rep)
+ { pointingLegend_.setVisual(visual, rep); }
+
+ //! Returns the legend (visual presentation) of the theme objects selected by a query
+ TeLegendEntry& queryLegend ()
+ { return queryLegend_; }
+
+ //! Set the legend (visual presentation) of the theme objects selected by a query
+ void queryLegend (TeLegendEntry &leg)
+ { queryLegend_ = leg; }
+
+ //! Set the visual of the theme objects selected by a query
+ void setVisualQuery (TeVisual& visual, TeGeomRep rep)
+ { queryLegend_.setVisual(visual, rep); }
+
+ //! Returns the legend (visual presentation) of the theme objects selected by query and pointing
+ TeLegendEntry& queryAndPointingLegend ()
+ { return queryAndPointingLegend_; }
+
+ //! Set the legend (visual presentation) of the theme objects selected by query and pointing
+ void queryAndPointingLegend (TeLegendEntry &leg)
+ { queryAndPointingLegend_ = leg; }
+
+ //! Set the visual of the theme objects selected by query and pointing
+ void setVisualQueryAndPointing (TeVisual& visual, TeGeomRep rep)
+ { queryAndPointingLegend_.setVisual(visual, rep); }
+
+ //! Set the n-th grouping visual to a geometric representation
+ bool setGroupingVisual(int n, TeVisual& visual, TeGeomRep rep);
+
+ //! Set the n-th grouping visual of a particular group
+ bool setGroupingVisual(int n, TeGeomRepVisualMap& vismap);
+
+ //! get the grouping slices from the legends without visual
+ TeSliceVector getSlices();
+
+ //! Returns a vector of the attribute tables of the theme
+ bool getAttTables(TeAttrTableVector& attrs, TeAttrTableType attType = TeAllAttrTypes);
+
+ //! Returns the temporal attribute table of the theme (TeEvent and TeFixedGeomDynAttr)
+ bool getTemporalTable(TeTable& table);
+
+ //! Set the theme tables vector
+ bool setAttTables(TeAttrTableVector& attrs);
+
+ //! Clear the list of theme tables
+ void clearAttTableVector()
+ { attTableVector_.clear(); }
+
+ //! Returns the vector of attribute tables
+ TeAttrTableVector& attrTables()
+ { return attTableVector_; }
+
+ //! Return a complete SQL statement to get all the attributes of the theme objects
+ string sqlJoin() {return sqlJoin_;}
+
+ //! Return a FROM CLAUSE of a SQL statement to get attributes of theme objects
+ string sqlFrom() {return sqlFrom_;}
+
+ //! Returns a SQL statement to get all the attributes of the theme objects, the attributes of the
+ //! collection table, and the attributes of the extended collection table
+ string sqlGridJoin() { return sqlGridJoin_; }
+
+ //! Returns a FROM clause of a SQL statement to get attributes of the theme objects, the attributes of the
+ //! collection table, and the attributes of the extended collection table
+ string sqlGridFrom(const string& geomTable="");
+
+ //! Return the clause WHERE from restrictions (spatial, attribute and temporal)
+ string sqlWhereRestrictions(TeRepresentation* rep=0);
+
+ //! Return the list of attributes of the theme tables
+ TeAttributeList sqlAttList() {return sqlAttList_;}
+
+ //! Clear the list of attributes associated to the theme tables
+ void clearAttList() {sqlAttList_.clear();}
+
+ //! Return the list of numerical attributes of the theme tables
+ TeAttributeList sqlNumAttList() {return sqlNumAttList_;}
+
+ //! Clear the list of numerical attributes associated to the theme tables
+ void clearNumAttList() {sqlNumAttList_.clear();}
+
+ //! Return the alias vector of the names of the theme tables
+ vector<string>& aliasVector() { return aliasVector_; }
+
+ //! Save the theme informations in database
+ bool save();
+
+ //! Build the theme collection
+ bool buildCollection();
+
+ //! Generate the label positions (x,y) to each object of the theme
+ bool generateLabelPositions();
+
+ //! Clear the existing grouping of objects of this theme
+ void resetGrouping ();
+
+ //! Clean legend
+ void cleanLegend() { legend_.clear(); }
+
+ //! Save the grouping parameters in memory
+ bool buildGrouping(TeGrouping* g, TeSelectedObjects selectedObjects = TeAll,
+ vector<double>* dValuesVec = 0);
+
+ //! Save grouping parameters in memory passing an arbitrary set of slices
+ bool buildGrouping(TeGrouping* g, vector<TeSlice>& slices);
+
+ //! Build the grouping and associate each object to its group in the collection table
+ bool saveGrouping(TeSelectedObjects selectedObjects = TeAll);
+
+ //! Add new theme table
+ virtual bool addThemeTable (TeTable& table);
+ virtual void addThemeTable (string tableName);
+
+ //! Verify if a table is a theme table, given its id
+ bool isThemeTable(int tableId);
+
+ //! Verify if a table is a theme table, given its name
+ bool isThemeTable(string tableName);
+
+ //! Return the table name of a given attribute
+ string getTableName(const string& attrName);
+
+ //! Removes an attribute table
+ bool removeThemeTable(unsigned int index);
+
+ //! Loads the theme tables in the database
+ bool loadThemeTables();
+
+ //! Delete grouping
+ bool deleteGrouping();
+
+ //! Create the auxiliar collection table based in the theme tables
+ bool createCollectionAuxTable();
+
+ //! Populate the auxiliar collection table based in the theme tables
+ bool populateCollectionAux();
+
+ //! Load the new attribute list of all the theme tables.
+ //! All attributes are stored into sqlAttList_ and numeric attributes are stored into sqlNumAttList_.
+ void loadAttrLists();
+
+ /** @name Locate geometries
+ * Returns the geometry(ies) of the theme that contains a given coordinate
+ */
+ //@{
+ bool locatePolygon (TeCoord2D &pt, TePolygon &polygon, const double& tol = 0.0);
+ bool locatePolygonSet (TeCoord2D &pt, double tol, TePolygonSet &polygons);
+ bool locateLine (TeCoord2D &pt, TeLine2D &line, const double& tol = 0.0);
+ bool locatePoint (TeCoord2D &pt, TePoint &point, const double& tol = 0.0);
+ bool locateCell (TeCoord2D &pt, TeCell &c, const double& tol = 0.0);
+ //@}
+
+ /** @name Raster Visual
+ * Methods to deal with the visual presentation of the raster
+ */
+ //@{
+ //! Returns the visual presentation of raster geometry
+ TeRasterTransform* rasterVisual()
+ { return rasterVisual_; }
+
+ //! Sets the visual presentation of raster geometry
+ void rasterVisual(TeRasterTransform* r)
+ { rasterVisual_ = r; }
+
+ //! Removes the visual presentation of the raster
+ void removeRasterVisual()
+ {
+ if (rasterVisual_)
+ {
+ delete rasterVisual_;
+ rasterVisual_ = 0;
+ }
+ }
+
+ //! Creates an appropriate visual presentation to the raster of the theme
+ void createRasterVisual(TeRaster* rst=0);
+ //@}
+
+protected:
+ // ----------------- theme information -----------------
+
+ // General identification
+ int layerId_; // layer id
+
+ // Associated layer and selected objects
+ TeLayer* layer_;
+
+ // Selection
+ //attribute restriction
+ string generateAttributeRest_;
+
+ // temporal restriction
+ string generateTemporalRest_;
+
+ //spatial restriction
+ string generateSpatialRest_; //future use
+
+ TeSpatialRelation spatialRelation_;
+ bool hasSpatialRes_;
+ TeBox boxRest_; //box which defines the spatial restriction
+ TeGeometry* geomRest_; //geometry which defines the spatial restriction
+ TeGeomRep geomRepRest_; //geometry representation of the theme which will be
+ //considered in the spatial restriction
+ // Display scale
+ double minScale_;
+ double maxScale_;
+
+ // collection table name
+ string collectionTable_;
+ string collectionAuxTable_;
+
+ //representation visible in the theme
+ int visibleRep_;
+
+ //if theme is visible or not
+ int enableVisibility_;
+
+ // ----------------- grouping information -----------------
+ TeGrouping* grouping_;
+
+ // ----------------- legend information -----------------
+ TeLegendEntryVector legend_;
+
+ // Background Legend
+ TeLegendEntry outOfCollectionLegend_; //group(-1)
+ TeLegendEntry withoutDataConnectionLegend_; //group(-2)
+ TeLegendEntry defaultLegend_; //group(-3)
+ TeLegendEntry pointingLegend_; //group(-4)
+ TeLegendEntry queryLegend_; //group(-5)
+ TeLegendEntry queryAndPointingLegend_; //group(-6)
+
+ // ----------------- theme tables information -----------------
+ TeAttrTableVector attTableVector_;
+
+ //! clause FROM: join with the theme tables and collection table
+ string sqlFrom_;
+
+ //! clause SELECT and FROM: join with the theme tables and collection table
+ string sqlJoin_;
+
+ //! clause FROM: join with the theme tables and auxiliar collection table
+ string sqlGridFrom_;
+
+ //! clause SELECT and FROM: join with the theme tables and auxiliar collection table
+ string sqlGridJoin_;
+
+ //! vector of alias to the attribute tables that are used more than once
+ vector<string> aliasVector_;
+
+ //! list containing all the attributes of the theme tables
+ TeAttributeList sqlAttList_;
+
+ //! list containing only the numeric attributes of the the theme tables
+ TeAttributeList sqlNumAttList_;
+
+ //! visual of raster
+ TeRasterTransform* rasterVisual_;
+
+ //! fill aliasVector_
+ void loadAliasVector();
+
+ //! Fill the sqlJoin_ and sqlFrom_
+ void loadThemeTablesJoin();
+
+ //! Fill the sqlGridJoin_ and sqlGridFrom_
+ void loadTablesJoin(const string& geomTable="");
+
+ //! Save the theme grouping legends in the collection table
+ bool saveLegendInCollection(TeSelectedObjects selectedObjects = TeAll);
+
+ //! Populate the collection table based in the theme restrictions
+ bool populateCollection();
+
+};
+
+//! A vector of pointers to Theme
+typedef vector<TeTheme*> TeThemeVector;
+
+//! A map from theme identifier to pointer to theme
+typedef map<int, TeTheme*> TeThemeMap;
+
+/*! \example ThemeExample1.cpp
+ This is an example of how to create themes in TerraLib.
+ */
+
+/*! \example ThemeExample2.cpp
+ This is an example of how to do a grouping on the objects of a TerraLib theme.
+ */
+#endif
+
diff --git a/src/terralib/kernel/TeTime.cpp b/src/terralib/kernel/TeTime.cpp
new file mode 100644
index 0000000..0f99dec
--- /dev/null
+++ b/src/terralib/kernel/TeTime.cpp
@@ -0,0 +1,612 @@
+ /************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeTime.h>
+#include <memory.h>
+#include <TeUtils.h>
+#include <iostream>
+
+//return the number of the month
+int getMonth(const string& month)
+{
+ string tempM = TeConvertToUpperCase(month);
+ if(tempM=="JAN")
+ return 0;
+ else if(tempM=="FEB")
+ return 1;
+ else if(tempM=="MAR")
+ return 2;
+ else if(tempM=="APR")
+ return 3;
+ else if(tempM=="MAY")
+ return 4;
+ else if(tempM=="JUN")
+ return 5;
+ else if(tempM=="JUL")
+ return 6;
+ else if(tempM=="AUG")
+ return 7;
+ else if(tempM=="SEP")
+ return 8;
+ else if(tempM=="OCT")
+ return 9;
+ else if(tempM=="NOV")
+ return 10;
+ else if(tempM=="DEC")
+ return 11;
+
+ return -1;
+}
+
+//return the month
+string getMonth(int i)
+{
+ if(i==0)
+ return "Jan";
+ else if(i==1)
+ return "Feb";
+ else if(i==2)
+ return "Mar";
+ else if(i==3)
+ return "Apr";
+ else if(i==4)
+ return "May";
+ else if(i==5)
+ return "Jun";
+ else if(i==6)
+ return "Jul";
+ else if(i==7)
+ return "Aug";
+ else if(i==8)
+ return "Sep";
+ else if(i==9)
+ return "Oct";
+ else if(i==10)
+ return "Nov";
+ else if(i==11)
+ return "Dec";
+
+ return "";
+}
+
+
+TeTime::TeTime()
+{
+ /*
+ set the tm_isdst field to 0 to indicate that standard time is in effect,
+ or to a value greater than 0 to indicate that daylight savings time is in effect,
+ or to a value less than zero to have the C run-time library code compute whether
+ standard time or daylight savings time is in effect.
+ (The C run-time library assumes the United States�s rules for implementing
+ the calculation of Daylight Saving Time).
+ */
+
+ chronon_ = TeSECOND;
+ ts_.tm_sec = 0;
+ ts_.tm_min = 0;
+ ts_.tm_hour = 0;
+ ts_.tm_isdst = -1;
+ ts_.tm_mday = 0;
+ ts_.tm_mon = 0;
+ ts_.tm_year = 0;
+}
+
+TeTime::TeTime(const TeTime& other)
+{
+ memcpy(&ts_, &other.ts_, sizeof(struct tm));
+ last_ = other.last_;
+ chronon_ = other.chronon_;
+}
+
+TeTime::TeTime(int h, int m, int s, TeChronon chronon)
+{
+ now();
+ ts_ = *localtime(&last_);
+ ts_.tm_sec = s;
+ ts_.tm_min = m;
+ ts_.tm_hour = h;
+ ts_.tm_isdst = -1;
+ ts_.tm_mday = 0;
+ ts_.tm_mon = 0;
+ ts_.tm_year = 0;
+ last_ = mktime(&ts_);
+ chronon_ = chronon;
+}
+
+TeTime::TeTime(const string& ds, TeChronon chronon, const string& mask, const string& dateS, const string& timeS, const string& indPM)
+{
+ chronon_ = chronon;
+ ts_.tm_sec = 0;
+ ts_.tm_min = 0;
+ ts_.tm_hour = 0;
+ ts_.tm_isdst = -1;
+ ts_.tm_mday = 0;
+ ts_.tm_mon = 0;
+ ts_.tm_year = 0;
+
+ bool flag = true;
+ string tempDT, tempM;
+ string maskTemp = mask;
+
+ int posBeginMask = 0;
+ int posBeginDate = 0;
+ int posEndMask;
+ int posEndTotalMask = 0;
+
+ if (mask == "YYYYMMDD" || mask == "yyyymmdd" || mask == "aaaammdd" || mask == "AAAAMMDD")
+ {
+ sscanf(ds.c_str(),"%4d%2d%2d",&ts_.tm_year,&ts_.tm_mon,&ts_.tm_mday);
+ }
+ else if (mask == "DDMMAAAA" || mask == "ddmmaaaa" || mask == "DDMMYYYY" || mask == "ddmmyyyy")
+ {
+ sscanf(ds.c_str(),"%2d%2d%4d",&ts_.tm_mday,&ts_.tm_mon,&ts_.tm_year);
+ }
+ else
+ {
+ while(flag)
+ {
+ posEndMask = maskTemp.find("s");
+ posEndTotalMask += posEndMask;
+
+ if(posEndMask==-1)
+ {
+ flag = false;
+ posEndTotalMask = mask.size();
+ }
+ else
+ {
+ if(posBeginMask>0)
+ ++posEndTotalMask;
+
+ maskTemp = maskTemp.substr(posEndMask+1, (maskTemp.size()-(posEndMask+1)));
+ }
+
+ tempDT.clear();
+ tempM = mask.substr(posBeginMask,(posEndTotalMask-posBeginMask));
+
+ //fill the datetime
+ string dt = ds.substr(posBeginDate,1);
+ while((dt!=dateS) && (dt!=timeS) && (dt!=" ") && (posBeginDate < (int)ds.size()))
+ {
+ tempDT += dt;
+ ++posBeginDate;
+ dt = ds.substr(posBeginDate,1);
+ }
+ ++posBeginDate;
+
+ //day
+ if(tempM.find(68)==0)
+ ts_.tm_mday = atoi(tempDT.c_str());
+
+ //month
+ else if (tempM.find(77)==0)
+ {
+ if(tempDT.size()>2)
+ ts_.tm_mon = getMonth(tempDT)+1;
+ else
+ ts_.tm_mon = atoi(tempDT.c_str());
+ }
+
+ //year
+ else if (tempM.find(89)==0)
+ {
+ ts_.tm_year = atoi(tempDT.c_str());
+ if(ts_.tm_year < 100)
+ ts_.tm_year += 1900;
+ }
+
+ //hour
+ else if (tempM.find(72)==0)
+ ts_.tm_hour = atoi(tempDT.c_str());
+
+ //minute
+ else if (tempM.find(109)==0)
+ ts_.tm_min = atoi(tempDT.c_str());
+
+ //second
+ else if (tempM.find(83)==0)
+ ts_.tm_sec = atoi(tempDT.c_str());
+
+ //PM or AM indicator
+ else if ((tempM.find(84)==0) && (tempDT==indPM))
+ ts_.tm_hour += 12;
+
+ posBeginMask = posEndTotalMask+1;
+
+ if((posBeginDate)>(int)(ds.size()-1) || (posBeginMask)>(int)(mask.size()-1))
+ flag = false;
+ }
+ }
+
+ switch (chronon_)
+ {
+ case TeYEAR :
+ ts_.tm_mon = 1;
+ break;
+ case TeMONTH :
+ ts_.tm_mday = 0;
+ break;
+ case TeDAY :
+ ts_.tm_hour = 0;
+ break;
+ case TeHOUR :
+ ts_.tm_min = 0;
+ break;
+ case TeMINUTE :
+ ts_.tm_sec = 0;
+ break;
+ default:
+ break;
+ }
+
+ ts_.tm_year -= 1900;
+ --ts_.tm_mon;
+
+ last_ = mktime(&ts_);
+ if (last_ != time_t(-1))
+ ts_ = *localtime(&last_);
+}
+
+time_t TeTime::now(void)
+{
+ time(&last_);
+ ts_ = *localtime(&last_);
+ return last_;
+}
+
+string
+TeTime::getTime()
+{
+ char tbuf[9];
+ sprintf(tbuf, "%02d:%02d:%02d",
+ ts_.tm_hour,ts_.tm_min,ts_.tm_sec);
+ return tbuf;
+}
+
+
+string
+TeTime::getDate()
+{
+ char dbuf[12];
+ sprintf(dbuf,"%4d-%02d-%02d",ts_.tm_year+1900,ts_.tm_mon+1,ts_.tm_mday);
+ return dbuf;
+}
+
+string
+TeTime::getDateTime (const string& mask, const string& dateS, const string& timeS, const string& indPM, const string& indAM)
+{
+ string result = "";
+
+ if(!this->isValid())
+ return result;
+
+ bool flag = true;
+ string tempM;
+ string maskTemp = mask;
+
+ int posBeginMask = 0;
+ int posEndMask;
+ int posEndTotalMask = 0;
+
+ bool firstTime = true;
+ bool pm = false;
+ bool am = false;
+
+ //verify if the mask is AM and PM
+ string tempAPM = mask.substr(mask.size()-1, 1);
+ if(tempAPM=="T")
+ {
+ if((ts_.tm_hour>12) || ((ts_.tm_hour==12) && (ts_.tm_min>0)) ||
+ ((ts_.tm_hour==12) && (ts_.tm_min==0) && (ts_.tm_sec>0)))
+ pm=true;
+ else
+ am=true;
+ }
+
+ while(flag)
+ {
+ posEndMask = maskTemp.find("s");
+ posEndTotalMask += posEndMask;
+
+ if(posEndMask==-1)
+ {
+ flag = false;
+ posEndTotalMask = mask.size();
+ }
+ else
+ {
+ if(posBeginMask>0)
+ ++posEndTotalMask;
+
+ maskTemp = maskTemp.substr(posEndMask+1, (maskTemp.size()-(posEndMask+1)));
+ }
+
+ tempM = mask.substr(posBeginMask,(posEndTotalMask-posBeginMask));
+
+ //day
+ if(tempM.find(68)==0)
+ result += Te2String(ts_.tm_mday) + dateS;
+
+ //month
+ else if (tempM.find(77)==0)
+ {
+ if(tempM=="MMM")
+ result += getMonth(ts_.tm_mon) + dateS;
+ else
+ result += Te2String(ts_.tm_mon+1) + dateS;
+ }
+
+ //year
+ else if (tempM.find(89)==0)
+ {
+ if(tempM=="YYYY")
+ result += Te2String(ts_.tm_year+1900) + dateS;
+ else
+ {
+ string tempY = Te2String(ts_.tm_year);
+ tempY = tempY.substr(tempY.size()-2, 2);
+ result += tempY + dateS;
+ }
+ }
+
+ //hour
+ else if (tempM.find(72)==0)
+ {
+ if(firstTime)
+ result.replace(result.size()-1, 1, " ");
+
+ if(pm)
+ result += Te2String(ts_.tm_hour-12) + timeS;
+ else
+ result += Te2String(ts_.tm_hour) + timeS;
+
+ firstTime = false;
+ }
+
+ //minute
+ else if (tempM.find(109)==0)
+ {
+ if(firstTime)
+ result.replace(result.size()-1, 1, " ");
+
+ result += Te2String(ts_.tm_min) + timeS;
+ firstTime = false;
+ }
+
+ //second
+ else if (tempM.find(83)==0)
+ {
+ if(firstTime)
+ result.replace(result.size()-1, 1, " ");
+
+ result += Te2String(ts_.tm_sec) + timeS;
+ firstTime = false;
+ }
+
+ //PM or AM indicator
+ else if (tempM.find(84)==0)
+ {
+ result.replace(result.size()-1, 1, " ");
+
+ if(pm)
+ result += indPM;
+ else if(am)
+ result += indAM;
+
+ }
+
+ posBeginMask = posEndTotalMask+1;
+ }
+
+ if((!am) && (!pm))
+ result.replace(result.size()-1, 1, " ");
+
+ return result;
+}
+
+time_t
+TeTime::Set(int y, int m, int d, int h, int mt, int s)
+{
+ if (y > -1) ts_.tm_year = y-1900;
+ if (m > -1) ts_.tm_mon = m-1;
+
+
+ if (d > -1) ts_.tm_mday = d;
+ if (h > -1) ts_.tm_hour = h;
+ if (mt > -1) ts_.tm_min = mt;
+ if (s > -1) ts_.tm_sec = s;
+ ts_.tm_isdst =-1;
+ last_ = mktime(&ts_);
+ if (last_ == -1) last_ = 0;
+ return last_;
+}
+
+TeTime&
+TeTime::operator=(const TeTime& other)
+{
+ memcpy(&ts_, &other.ts_, sizeof(struct tm));
+ last_ = other.last_;
+ chronon_ = other.chronon_;
+ return *this;
+}
+
+
+TeTime&
+TeTime::operator+=(int delta)
+{
+ if (delta == 0)
+ return *this;
+
+ int deltaux=delta;
+ switch (chronon_)
+ {
+ case TeYEAR :
+ ts_.tm_isdst = -1;
+ ts_.tm_year += delta;
+ last_ = mktime(&ts_);
+ break;
+ case TeMONTH :
+ case TeMONTHOFYEAR:
+ ts_.tm_isdst = -1;
+ ts_.tm_year += (ts_.tm_mon+delta)/12;
+ ts_.tm_mon = (ts_.tm_mon+delta)%12;
+ last_ = mktime(&ts_);
+ break;
+ case TeDAY :
+ case TeDAYOFMONTH:
+ case TeDAYOFWEEK:
+ case TeDAYOFYEAR:
+ deltaux *= 3600*24;
+ last_ += deltaux;
+ ts_ = *localtime(&last_);
+ break;
+ case TeHOUR :
+ case TeHOUROFDAY :
+ deltaux *= 3600;
+ last_ += deltaux;
+ ts_ = *localtime(&last_);
+ break;
+ case TeMINUTE :
+ case TeMINUTEOFHOUR:
+ deltaux *= 60;;
+ last_ += deltaux;
+ ts_ = *localtime(&last_);
+ break;
+ case TeSECOND :
+ case TeSECONDOFMINUTE :
+ last_ += deltaux;
+ ts_ = *localtime(&last_);
+ break;
+ default :
+ break;
+ }
+
+ return *this;
+}
+
+TeTime&
+TeTime::operator++()
+{
+ this->operator +=(1);
+ return *this;
+}
+
+TeTime
+TeTime::operator+(int delta)
+{
+ TeTime temp(*this);
+ temp += delta;
+ return temp;
+}
+
+TeTime&
+TeTime::operator-=(int delta)
+{
+ last_ -= delta;
+ ts_ = *localtime(&last_);
+ return *this;
+}
+
+bool
+TeTime::operator==(const TeTime& time) const
+{
+ return ((chronon_==time.chronon_) && (ts_.tm_sec==time.ts_.tm_sec) && (ts_.tm_min==time.ts_.tm_min) &&
+ (ts_.tm_hour==time.ts_.tm_hour) && (ts_.tm_isdst==time.ts_.tm_isdst) && (ts_.tm_mday==time.ts_.tm_mday) &&
+ (ts_.tm_mon==time.ts_.tm_mon) && (ts_.tm_year==time.ts_.tm_year));
+}
+
+bool
+TeTime::operator<(const TeTime& time) const
+{
+ if(chronon_!=time.chronon_)
+ return false;
+
+ if(ts_.tm_year>time.ts_.tm_year)
+ return false;
+ else if(ts_.tm_year<time.ts_.tm_year)
+ return true;
+
+ if(ts_.tm_mon>time.ts_.tm_mon)
+ return false;
+ else if (ts_.tm_mon<time.ts_.tm_mon)
+ return true;
+
+ if(ts_.tm_mday>time.ts_.tm_mday)
+ return false;
+ else if (ts_.tm_mday<time.ts_.tm_mday)
+ return true;
+
+ if(ts_.tm_hour>time.ts_.tm_hour)
+ return false;
+ else if (ts_.tm_hour<time.ts_.tm_hour)
+ return true;
+
+ if(ts_.tm_min>time.ts_.tm_min)
+ return false;
+ else if (ts_.tm_min<time.ts_.tm_min)
+ return true;
+
+ if(ts_.tm_sec>time.ts_.tm_sec)
+ return false;
+ else if (ts_.tm_sec<time.ts_.tm_sec)
+ return true;
+
+ return false;
+}
+
+bool
+TeTime::operator<=(const TeTime& time) const
+{
+ return (this->operator<(time) || this->operator==(time));
+}
+
+bool
+TeTime::isValid()
+{
+ if( (chronon_==TeSECOND) && (ts_.tm_sec==0) && (ts_.tm_min==0) &&
+ (ts_.tm_hour==0) && (ts_.tm_mday==0) &&
+ (ts_.tm_mon==0) && (ts_.tm_year==0))
+ return false;
+ else
+ return true;
+}
+
+void
+TeTime::chronon (TeChronon c)
+{
+ if(chronon_==c)
+ return;
+
+ chronon_=c;
+}
+
+
+ostream& operator<<(ostream& os, TeTime& N)
+{
+ os << N.getDateTime();
+ return os;
+}
+
+
+
+
diff --git a/src/terralib/kernel/TeTime.h b/src/terralib/kernel/TeTime.h
new file mode 100644
index 0000000..ec245c4
--- /dev/null
+++ b/src/terralib/kernel/TeTime.h
@@ -0,0 +1,156 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeTime.h
+ This file contains structures and definitions to deal with date and time
+*/
+
+#ifndef __TERRALIB_INTERNAL_TIME_H
+#define __TERRALIB_INTERNAL_TIME_H
+
+
+#include "TeDataTypes.h"
+
+#include <time.h>
+#include <stdio.h>
+#include <string>
+#include <iostream>
+
+
+using namespace std;
+
+
+//! A class for supporting date and time.
+class TeTime
+{
+ struct tm ts_; // Unix time structure
+ time_t last_; // time in seconds
+ TeChronon chronon_;
+
+public:
+
+ //! Set the date and time from the system clock.
+ time_t now(void);
+
+ //! Set all time information with NULL value
+ TeTime(void);
+
+ //! Copy constructor.
+ TeTime(const TeTime& t);
+
+ //! Set the date from the system clock and the time from its parameter list. Chronon defaulted to second.
+ TeTime(int h, int m, int s, TeChronon chronon);
+
+ //! Set date and time from arguments, though the time fields.
+ TeTime( const string& dt, TeChronon chronon, const string& mask,
+ const string& dateS = "/", const string& timeS = ":", const string& indPM = "PM");
+
+ //! Return a time of day string in format "hh:mm:ss"
+ string getTime();
+
+ //! Return a string to the date in the form "yyyy-mm-dd"
+ string getDate(void);
+
+ //! Return a pointer to the date and time in the form passed in mask.
+ string getDateTime (const string& mask= "DDsMMsYYYYsHHsmmsSS", const string& dateS="/", const string& timeS=":", const string& indPM="PM", const string& indAM="AM");
+
+
+ //! Reset time to the specified arguments. Return time_t: number of seconds since 0:00:00 Jan 1 1987
+ /*!
+ \param y year
+ \param m month
+ \param d day
+ \param h hour
+ \param min minutes
+ \param s seconds
+ */
+ time_t Set(int y, int m, int d, int h = 0, int min = 0, int s = 0);
+
+
+ //! Get year value as an four digit integer
+ int year() {return ts_.tm_year+1900;}
+
+ //! Get month value
+ int month() {return ts_.tm_mon+1;}
+
+ //! Get day of the month value
+ int day() {return ts_.tm_mday;}
+
+ //! Get hour value as an integer
+ int hour() {return ts_.tm_hour;}
+
+ //! Get minute value as an integer
+ int minute() {return ts_.tm_min;}
+
+ //! Get second value as an integer
+ int second() {return ts_.tm_sec;}
+
+ //! Get week day as in integer
+ int weekDay() { return ts_.tm_wday;} //(0-6) 0=Sunday
+
+ //! Get year day as in integer
+ int yearDay() { return ts_.tm_yday;} //(0-365) 01/01=0
+
+ //! Get chronon definition
+ TeChronon chronon () {return chronon_;}
+
+ //! Set chronon definition
+ void chronon (TeChronon c);
+
+ //! Assignment operator for TeTime objects.
+ TeTime& operator=(const TeTime&);
+
+ //! Add 'delta' chronon units to the current date. Return current date.
+ TeTime& operator+=(int delta);
+
+ //! Increase a chronon unit in the time (Prefix operator)
+ TeTime& operator++();
+
+ //! Add 'delta' chronon units to the current date and return a new date. Return new date.
+ TeTime operator+(int delta);
+
+ //! Subtract 'delta' chronon units from the current date. Return current date.
+ TeTime& operator-=(int delta);
+
+ //! Operator ==
+ bool operator==(const TeTime& time) const;
+
+ //! Operator <
+ bool operator<(const TeTime& time) const;
+
+ bool operator<=(const TeTime& time) const;
+
+ //! verify if the time has null values
+ bool isValid();
+
+ //! Normal destructor.
+ ~TeTime(void) { }
+
+};
+
+ostream& operator<<(ostream& os, TeTime& N);
+
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeTimeInterval.cpp b/src/terralib/kernel/TeTimeInterval.cpp
new file mode 100644
index 0000000..4b39b92
--- /dev/null
+++ b/src/terralib/kernel/TeTimeInterval.cpp
@@ -0,0 +1,181 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeTimeInterval.h"
+
+TeTimeInterval :: TeTimeInterval(const string& s1, const string& s2, TeChronon chronon,
+ const string& mask, const string& dateS, const string& timeS,
+ const string& indPM)
+{
+ intChronon_ = chronon;
+ //build t1 and t2 with the chronon parameter
+ TeTime t1 (s1, chronon, mask, dateS, timeS, indPM);
+ TeTime t2 (s2, chronon, mask, dateS, timeS, indPM);
+ t1_ = t1;
+ t2_ = t2;
+ adjustIntervaltoChronon();
+
+}
+
+void
+TeTimeInterval::intervalChronon(TeChronon c)
+{
+ intChronon_ = c;
+ t1_.chronon(c);
+ t2_.chronon(c);
+ adjustIntervaltoChronon();
+}
+
+void
+TeTimeInterval::adjustIntervaltoChronon ()
+{
+ int m2 = t2_.month();
+ int d2 = 31;
+ int d1 = 1;
+
+ if ((m2 == 4) || (m2 == 6) || (m2 == 9) || (m2 == 11)) //april, june, september, november
+ d2 = 30;
+ if (m2 == 2) //february
+ d2 = 28;
+
+ switch (intChronon_)
+ {
+ case TeYEAR :
+ t1_.Set(t1_.year(), 1 , 1, 0, 0, 0);
+ t2_.Set(t2_.year(), 12, 31, 23, 59, 59);
+ break;
+ case TeMONTH :
+ t1_.Set(t1_.year(), t1_.month(), d1, 0, 0, 0);
+ t2_.Set(t2_.year(), t2_.month(), d2, 23, 59, 59);
+ break;
+ case TeDAY :
+ t1_.Set(t1_.year(), t1_.month(), t1_.day(), 0, 0, 0);
+ t2_.Set(t2_.year(), t2_.month(), t2_.day(), 23, 59, 59);
+ break;
+ case TeHOUR :
+ t1_.Set(t1_.year(), t1_.month(), t1_.day(), t1_.hour(), 0, 0);
+ t2_.Set(t2_.year(), t2_.month(), t2_.day(), t2_.hour(), 59, 59);
+ break;
+ case TeMINUTE :
+ t1_.Set(t1_.year(), t1_.month(), t1_.day(), t1_.hour(), t1_.minute(), 0);
+ t2_.Set(t2_.year(), t2_.month(), t2_.day(), t2_.hour(), t2_.minute(), 59);
+ break;
+ default:
+ break;
+ }
+}
+
+
+int
+TeTimeInterval :: length ()
+{
+ return 1;
+}
+
+void
+TeTimeInterval :: shift (const string& t)
+{
+ TeTime new_t1;
+ if (t == "")
+ TeTime new_t1 (t2_);
+ else
+ TeTime new_t1 (t, t2_.chronon(), "YYYYsMMsDDsHHsmmsSS");
+
+ TeTime new_t2 = new_t1 + length();
+
+ t1_ = new_t1;
+ t2_ = new_t2;
+ adjustIntervaltoChronon();
+}
+
+
+void
+TeTimeInterval :: shiftPlus (int delta)
+{
+ t1_ += delta;
+ t2_ = t1_ + (delta - 1);
+ adjustIntervaltoChronon();
+}
+
+
+void
+TeTimeInterval :: shiftMinus (int delta)
+{
+ t1_ -= delta;
+ t2_ = t1_ + (-delta);
+ adjustIntervaltoChronon();
+}
+
+bool
+TeTimeInterval :: during (TeTime& time)
+{
+ if(intChronon_==TeMONTHOFYEAR)
+ return ((this->getT1().month()<=time.month()) && (this->getT2().month()>=time.month()));
+
+ if (intChronon_==TeDAYOFMONTH)
+ return ((this->getT1().day()<=time.day()) && (this->getT2().day()>=time.day()));
+
+ if (intChronon_== TeDAYOFWEEK)
+ return ((this->getT1().weekDay()<=time.weekDay()) && (this->getT2().weekDay()>=time.weekDay()));
+
+ if (intChronon_== TeDAYOFYEAR)
+ return ((this->getT1().yearDay()<=time.yearDay()) && (this->getT2().yearDay()>=time.yearDay()));
+
+ if (intChronon_== TeHOUROFDAY)
+ return ((this->getT1().hour()<=time.hour()) && (this->getT2().hour()>=time.hour()));
+
+ if (intChronon_==TeMINUTEOFHOUR)
+ return ((this->getT1().minute()<=time.minute()) && (this->getT2().minute()>=time.minute()));
+
+ if (intChronon_==TeSECONDOFMINUTE)
+ return ((this->getT1().second()<=time.second()) && (this->getT2().second()>=time.second()));
+
+ return ((this->getT1()<=time) && (time<=this->getT2()));
+}
+
+bool
+TeTimeInterval :: before (TeTime& time)
+{
+ if(intChronon_==TeMONTHOFYEAR)
+ return (time.month() < this->getT1().month());
+
+ if (intChronon_==TeDAYOFMONTH)
+ return (time.day() < this->getT1().day());
+
+ if (intChronon_== TeDAYOFWEEK)
+ return (time.weekDay() < this->getT1().weekDay());
+
+ if (intChronon_== TeDAYOFYEAR)
+ return (time.yearDay() < this->getT1().yearDay());
+
+ if (intChronon_== TeHOUROFDAY)
+ return (time.hour() < this->getT1().hour());
+
+ if (intChronon_==TeMINUTEOFHOUR)
+ return (time.minute() < this->getT1().minute());
+
+ if (intChronon_==TeSECONDOFMINUTE)
+ return (time.second() < this->getT1().second());
+
+ return (time < this->getT1());
+}
diff --git a/src/terralib/kernel/TeTimeInterval.h b/src/terralib/kernel/TeTimeInterval.h
new file mode 100644
index 0000000..878c95b
--- /dev/null
+++ b/src/terralib/kernel/TeTimeInterval.h
@@ -0,0 +1,166 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeTimeInterval.h
+ This file contains structures and definitions to deal with date and time intervals
+*/
+
+#ifndef __TERRALIB_INTERNAL_TIMEINTERVAL_H
+#define __TERRALIB_INTERNAL_TIMEINTERVAL_H
+
+#include <TeTime.h>
+
+//! This class provides a set of functions for manipulating date and time intervals
+class TeTimeInterval
+{
+private:
+
+ TeTime t1_;
+ TeTime t2_;
+ TeChronon intChronon_;
+
+ void adjustIntervaltoChronon ();
+
+public:
+
+ //! Set the date and time from the system clock
+ void now(void) {t1_.now(); t2_.now();}
+
+ //! Empty constructor
+ TeTimeInterval (void): t1_(), t2_() {}
+
+ //! Set all time information from the system clock
+ TeTimeInterval (TeTime& t1, TeTime& t2): t1_(t1), t2_(t2) {}
+
+ //! Copy constructor.
+ TeTimeInterval(const TeTimeInterval& t): t1_(t.t1_), t2_(t.t2_) {}
+
+ //! Set date and time from arguments, though the time fields defaults to zero.
+ TeTimeInterval(const string& t1, const string& t2, TeChronon chronon=TeSECOND, const string& mask="YYYYsMMsDDsHHsmmsSS", const string& dateS = "/", const string& timeS = ":", const string& indPM = "PM");
+
+ //! Set date and time from arguments, though the time fields defaults to zero.
+ TeTimeInterval(const string& t1, TeChronon chronon=TeSECOND, const string& mask="YYYYsMMsDDsHHsmmsSS", int delta = 0, int numsteps = 1):
+ t1_ (t1, chronon, mask)
+ {
+ t2_ = t1_ + (delta-1)*numsteps;
+ adjustIntervaltoChronon();
+ }
+
+ //! Returns the chronon of the interval
+ TeChronon intervalChronon() { return intChronon_; }
+
+ //! Sets the chronon of the interval
+ void intervalChronon(TeChronon c);
+
+ //! Return a time of day string in format "hh:mm:ss"
+ string getInitialTime() {return t1_.getTime();}
+
+ //! Return a time of day string in format "hh:mm:ss"
+ string getFinalTime() {return t2_.getTime();}
+
+ //! Return a string to the date in the form "yyyy-mm-dd"
+ string getInitialDate(void) {return t1_.getDate();}
+
+ //! Return a string to the date in the form "yyyy-mm-dd"
+ string getFinalDate(void) {return t2_.getDate();}
+
+ //! Return the time t1_
+ TeTime& getT1 (void) {return t1_;}
+
+ //! Return the time t2_
+ TeTime& getT2 (void) {return t2_;}
+
+ //! Return a pointer to the date and time in the form passed in mask.
+ string getInitialDateTime (const string& mask="YYYYsMMsDDsHHsmmsSS", const string& dateS="/", const string& timeS=":", const string& indPM="PM", const string& indAM="AM") {return t1_.getDateTime(mask, dateS, timeS, indPM, indAM);}
+
+ //! Return a pointer to the date and time in the form passed in mask.
+ string getFinalDateTime (const string& mask="YYYYsMMsDDsHHsmmsSS", const string& dateS="/", const string& timeS=":", const string& indPM="PM", const string& indAM="AM") {return t2_.getDateTime(mask, dateS, timeS, indPM, indAM);}
+
+
+ //! Reset time to the specified arguments. Return time_t: number of seconds since 0:00:00 Jan 1 1987
+ /*!
+ \param y year
+ \param m month
+ \param d day
+ \param h hour
+ \param min minutes
+ \param s seconds
+ */
+ time_t setInitialTime (int y, int m, int d, int h = 0, int min = 0, int s = 0)
+ {return t1_.Set(y, m, d, h, min, s);}
+
+
+ //! Reset time to the specified arguments. Return time_t: number of seconds since 0:00:00 Jan 1 1987
+ /*!
+ \param y year
+ \param m month
+ \param d day
+ \param h hour
+ \param min minutes
+ \param s seconds
+ */
+ time_t setFinalTime (int y, int m, int d, int h = 0, int min = 0, int s = 0)
+ {return t2_.Set(y, m, d, h, min, s);}
+
+ //! Assignment operator for TeTime objects.
+ TeTimeInterval& operator=(const TeTimeInterval& t) {t1_ = t.t1_; t2_ = t.t2_; intChronon_ = t.intChronon_; return (*this);}
+
+ //! Operator ==
+ bool operator==(const TeTimeInterval& other) const { return (this->t1_ == other.t1_ && this->t2_ == other.t2_); }
+
+ //! Compute legnth of time interval in units of chonon
+ int length ();
+
+ //! Shift the interval, begining at time t (in the form "yyyy-mm-dd hh:mm:ss").
+ /*!
+ If t is not provided, the current final time becomes the initial time.
+ The interval length is maintained.
+ */
+ void shift (const string& t = "");
+
+
+ //! Shift the interval, begining delta units after the initial time. The interval length is maintained.
+ void shiftPlus (int delta);
+
+ //! Shift the interval, begining delta units before the initial time. The interval length is maintained.
+ void shiftMinus (int delta);
+
+ //! verify if the times have null values
+ bool isValid() { return (t1_.isValid() || t2_.isValid()); }
+
+ //! Normal destructor.
+ ~TeTimeInterval(void) { }
+
+ //! verify if a specific time is during the interval time
+ bool during (TeTime& time);
+
+ //! verify if a specific time is before the interval time
+ bool before (TeTime& time);
+
+
+};
+ostream& operator<<(ostream& os, TeTime& N);
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeTin.cpp b/src/terralib/kernel/TeTin.cpp
new file mode 100644
index 0000000..8d4e055
--- /dev/null
+++ b/src/terralib/kernel/TeTin.cpp
@@ -0,0 +1,1762 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeTin.h"
+#include "TeStdFile.h"
+#include "TeException.h"
+#include "TeGeometryAlgorithms.h"
+#include <iostream>
+#include <fstream>
+#include <algorithm>
+
+// TeTinTriangleSet
+
+bool
+TeTinTriangleSet::loadFromFile(string &fileName)
+{
+// Open tin triangles file
+ string trianglesFile = fileName;
+ trianglesFile += ".tpl";
+
+ ifstream inStream;
+ inStream.open( trianglesFile.data(), ios::in | ios::binary );
+
+ if (! inStream.good() )
+ return false;
+
+ long laux;
+//#if defined(SPRWIN) || defined(LITTLEENDIAN) - File is saved in LITTLEENDIAN
+ inStream.read((char*)&laux, sizeof(long));
+ int numTriangles = laux;
+
+// Create and set tin triangles vector
+ if ( this->size () )
+ this->clear ();
+ this->reserve (numTriangles);
+
+// Read file for triangles data load
+ long lineid [3];
+ for (int i = 0; i < numTriangles; i++)
+ {
+ for (int j = 0; j < 3; j++)
+ {
+ if (! inStream.good() )
+ return false;
+ inStream.read((char*)&laux, sizeof(long));
+ lineid[j] = laux;
+ }
+ this->add ( TeTinTriangle (lineid[0],lineid[1],lineid[2]) );
+// triangles_[i].setEdges(lineid[0],lineid[1],lineid[2]);
+ }
+ return true;
+}
+
+bool
+TeTinVertexSet::loadFromFile(string &fileName)
+{
+// Open tin vertices file
+ string verticesFile = fileName;
+ verticesFile += ".tnd";
+
+ ifstream inStream;
+ inStream.open( verticesFile.data(), ios::in | ios::binary );
+
+ if (! inStream.good() )
+ return false;
+
+ long laux;
+//#if defined(SPRWIN) || defined(LITTLEENDIAN) - File is saved in LITTLEENDIAN
+ inStream.read((char*)&laux, sizeof(long));
+ int numVertices = laux;
+
+// Create and set tin vertices vector
+ if ( this->size () )
+ this->clear ();
+ this->reserve (numVertices);
+
+// Read file for vertices data load
+ double x, y;
+ float value;
+ short vertexType;
+ for (int i = 0; i < numVertices; i++)
+ {
+ if (! inStream.good() )
+ return false;
+ inStream.read((char*)&x, sizeof(double));
+ if (! inStream.good() )
+ return false;
+ inStream.read((char*)&y, sizeof(double));
+ if (! inStream.good() )
+ return false;
+ inStream.read((char*)&value, sizeof(float));
+ if (! inStream.good() )
+ return false;
+ inStream.read((char*)&vertexType, sizeof(short));
+ this->add( TeTinVertex (TeCoord2D (x,y), value,
+ (TeTinVertexType) vertexType, -1 ) );
+ }
+ return true;
+}
+
+bool
+TeTinEdgeSet::loadFromFile(string &fileName)
+{
+// Open tin edges file
+ string edgesFile = fileName;
+ edgesFile += ".tln";
+
+ ifstream inStream;
+ inStream.open( edgesFile.data(), ios::in | ios::binary );
+
+ if (! inStream.good() )
+ return false;
+
+ long laux;
+//#if defined(SPRWIN) || defined(LITTLEENDIAN) - File is saved in LITTLEENDIAN
+ inStream.read((char*)&laux, sizeof(long));
+ long numEdges = laux;
+
+// Create and set tin edges vector
+ if ( this->size () )
+ this->clear ();
+ this->reserve (numEdges);
+
+// Read file for edges data load
+ long from, to, left, right;
+ for (int i = 0; i < numEdges; i++)
+ {
+ if (! inStream.good() )
+ return false;
+ inStream.read((char*)&from, sizeof(long));
+ if (! inStream.good() )
+ return false;
+ inStream.read((char*)&to, sizeof(long));
+
+ if (! inStream.good() )
+ return false;
+ inStream.read((char*)&left, sizeof(long));
+ if (! inStream.good() )
+ return false;
+ inStream.read((char*)&right, sizeof(long));
+
+ this->add( TeTinEdge (from, to, left, right, NORMALEDGE) );
+ }
+ return true;
+}
+
+
+// TeTin
+
+bool
+TeTin::loadFromFile(string &fileName)
+{
+ if ( triangleSet_.loadFromFile ( fileName ) )
+ {
+ if ( vertexSet_.loadFromFile ( fileName ) )
+ {
+ if ( edgeSet_.loadFromFile ( fileName ) )
+ return true;
+ }
+ }
+ return false;
+}
+
+bool
+TeTin::getLines(TeLineSet &lineSet)
+{
+ vector<TeTinEdge>::iterator i = edgeSet_.begin();
+ while ( i != edgeSet_.end() )
+ {
+ int from = (*i).from();
+ int to = (*i).to();
+ TeCoord2D ptf = vertexSet_[from].location();
+ TeCoord2D ptt = vertexSet_[to].location();
+ i++;
+
+ TeLine2D line;
+ line.add (ptf);
+ line.add (ptt);
+ lineSet.add(line);
+ }
+ return true;
+}
+
+int
+TeTin::oneEdgeWithVertex(int v)
+{
+ int vsize = vertexSet_.size();
+ int edge;
+ if (v < vsize)
+ {
+ TeTinVertex vv = vertexSet_[v];
+ edge = vv.oneEdge();
+ }
+ else
+ return -1;
+
+ // Test to make sure there is no wrong index
+ if ( edge != -1 )
+ if ( ( edgeSet_[edge].to() == v ) ||
+ ( edgeSet_[edge].from() == v ) )
+ return edge;
+
+ static int oldedge = 0; // Set one edge only once
+
+ int j = 0;
+ while (j < 2)
+ {
+ unsigned int i;
+ for (i = oldedge; i < edgeSet_.size(); i++)
+ {
+ int from = edgeSet_[i].from();
+ int to = edgeSet_[i].to();
+ if ( from == -1 || to == -1 )
+ continue;
+ if (from == v || to == v)
+ {
+ oldedge = i;
+ return i;
+ }
+ }
+ oldedge = 0;
+ j++;
+ }
+ return -1;
+}
+
+int
+TeTin::edgeOppVertex(int t, int v)
+{
+ int edges[3];
+ triangleSet_[t].edges(edges[0],edges[1],edges[2]);
+
+ for (int i = 0; i < 3; i++)
+ {
+ if ( edgeSet_[edges[i]].from() != v &&
+ edgeSet_[edges[i]].to() != v )
+ return edges[i];
+ }
+ return -1;
+}
+
+int
+TeTin::vertexOppEdge(int t, int e)
+{
+ int edges[3];
+ triangleSet_[t].edges(edges[0],edges[1],edges[2]);
+
+ int vef(-1), vet(-1);
+ unsigned int i;
+ for (i = 0; i < 3; i++)
+ {
+ if ( edges[i] == e )
+ {
+ vef = edgeSet_[edges[i]].from();
+ vet = edgeSet_[edges[i]].to();
+ break;
+ }
+ }
+ if ( vef == -1 )
+ return -1;
+
+ for (i = 0; i < 3; i++)
+ {
+ if ( edges[i] != e )
+ {
+ if ( vef == edgeSet_[edges[i]].from() ||
+ vet == edgeSet_[edges[i]].from() )
+ return edgeSet_[edges[i]].to();
+ if ( vef == edgeSet_[edges[i]].to() ||
+ vet == edgeSet_[edges[i]].to() )
+ return edgeSet_[edges[i]].from();
+ return -1;
+ }
+ }
+ return -1;
+}
+
+int
+TeTin::edgeWithVertexDiffFromEdge(int t, int v, int e)
+{
+ int edges[3];
+ triangleSet_[t].edges(edges[0],edges[1],edges[2]);
+
+ for (int i = 0; i < 3; i++)
+ {
+ if ( edges[i] == e )
+ continue;
+ if ( edgeSet_[edges[i]].from() == v ||
+ edgeSet_[edges[i]].to() == v )
+ return edges[i];
+ }
+ return -1;
+}
+
+bool
+TeTin::vertexOppEdges(int v, list<int> &edges)
+{
+// Find one line that contains node
+ int a = oneEdgeWithVertex(v);
+ if (a == -1)
+ return false;
+
+// 1. Defina td como sendo o tri�ngulo que est� � direita da aresta a e
+ int td = edgeSet_[a].right(); // te como sendo o tri�ngulo que est�
+ int te = edgeSet_[a].left(); // � esquerda de a,
+
+ int ai = a; // 2. Defina ai como sendo aresta a
+ int ti = td;// e ti como sendo o tri�ngulo td,
+
+ int ao;
+
+ if ( ti != -1 ) // 3. Se o tri�ngulo ti n�o for nulo,
+ { // insira aresta ao de ti que n�o � diretamente
+ ao = edgeOppVertex ( ti, v );// conectado a v no conjunto A,
+ if (ao == -1)
+ return false;
+ edges.push_back (ao);
+ }
+
+ while (ti != te)// 4. Enquanto ti for diferente do tri�ngulo te,
+ {
+ if (ti == -1)// 4.1. Se o tri�ngulo ti � nulo (esta' na
+ { // borda da triangula��o) fa�a:
+ ti = te; // 4.1.1. Defina ti como sendo o tri�ngulo te,
+ te = -1; // 4.1.2. Defina te como sendo nulo,
+ ai = a; // 4.1.3. Defina ai como sendo aresta a,
+ if ( ti != -1 ) // 4.1.4. Se o tri�ngulo ti n�o for nulo,
+ { // insira aresta ao de ti que n�o � diretamente
+ ao = edgeOppVertex ( ti, v );// conectado a v
+ if (ao == -1)
+ return false;
+ edges.push_back (ao); // a v no conjunto A,
+ }
+ continue;// 4.1.5. Retorne a 4.
+ }
+
+ int aaux = edgeWithVertexDiffFromEdge ( ti, v, ai );// 4.2. Defina a
+ if (aaux == -1) // aresta aaux do tri�ngulo ti que conecta o
+ return false;// v�rtice v e � diferente de ai,
+
+ int taux;
+ if (edgeSet_[aaux].right() == ti) // 4.3. Defina taux como sendo
+ taux = edgeSet_[aaux].left();// o tri�ngulo que compartilha
+ else if (edgeSet_[aaux].left() == ti)// a aresta aaux com ti,
+ taux = edgeSet_[aaux].right();
+ else
+ return false;
+
+ ti = taux;// 4.4. Defina ti como sendo o tri�ngulo taux e ai
+ ai = aaux;// como sendo aresta aaux,
+
+ if ( ti != -1 )// 4.5. Se o tri�ngulo ti n�o for nulo, insira
+ { // aresta ao de ti que n�o � diretamente
+ ao = edgeOppVertex ( ti, v ); // conectado a v
+ if (ao == -1) // no conjunto A,
+ return false;
+ edges.push_back (ao);
+ }
+ } // 4.6. Retorne a 4.
+ return true;
+}
+
+bool
+TeTin::vertexEdges(int v, list<int> &edges)
+{
+// Find one line that contains node
+ int a = oneEdgeWithVertex(v);
+ if (a == -1)
+ return false;
+
+// 1. Defina td como sendo o tri�ngulo que est� � direita da aresta a e
+ int td = edgeSet_[a].right(); // te como sendo o tri�ngulo que est�
+ int te = edgeSet_[a].left(); // � esquerda de a,
+
+ int ai = a; // 2. Defina ai como sendo aresta a
+ int ti = td;// e ti como sendo o tri�ngulo td,
+
+ edges.push_back (ai);// 3. Insira a aresta ai no conjunto A,
+
+ while (ti != te)// 4. Enquanto ti for diferente do tri�ngulo te,
+ {
+ if (ti == -1)
+ {// 4.1. Se o tri�ngulo ti � nulo (esta' na borda da triangula��o) fa�a:
+ ti = te;// 4.1.1. Defina ti como sendo o tri�ngulo te,
+ te = -1;// 4.1.2. Defina te como sendo nulo,
+ ai = a;// 4.1.3. Defina ai como sendo aresta a,
+ continue;// 4.1.4. Retorne a 4.
+ }
+
+ int aaux = edgeWithVertexDiffFromEdge ( ti, v, ai );// 4.2. Defina a
+ if (aaux == -1) // aresta aaux do tri�ngulo ti que conecta o
+ return false;// v�rtice v e � diferente de ai,
+
+ int taux;
+ if (edgeSet_[aaux].right() == ti) // 4.3. Defina taux como sendo
+ taux = edgeSet_[aaux].left();// o tri�ngulo que compartilha
+ else if (edgeSet_[aaux].left() == ti)// a aresta aaux com ti,
+ taux = edgeSet_[aaux].right();
+ else
+ return false;
+
+ ti = taux;// 4.4. Defina ti como sendo o tri�ngulo taux e ai
+ ai = aaux;// como sendo aresta aaux,
+
+ edges.push_back (ai);// 4.5. Se o tri�ngulo ti n�o for nulo, insira
+ } // 4.6. Retorne a 4.
+ return true;
+}
+
+bool
+TeTin::vertexOppVertices(int v, list<int> &vertices)
+{
+// Find one line that contains node
+ int a = oneEdgeWithVertex(v);
+ if (a == -1)
+ return false;
+
+// 1. Defina td como sendo o tri�ngulo que est� � direita da aresta a e
+ int td = edgeSet_[a].right(); // te como sendo o tri�ngulo que est�
+ int te = edgeSet_[a].left(); // � esquerda de a,
+
+ int ai = a; // 2. Defina ai como sendo aresta a
+ int ti = td;// e ti como sendo o tri�ngulo td,
+
+ int vi = edgeSet_[a].from();// 3. Insira o v�rtice diferente de v
+ if (vi == v) // conectado � aresta ai no conjunto V,
+ vi = edgeSet_[a].to();
+ vertices.push_back (vi);
+
+ while (ti != te)// 4. Enquanto ti for diferente do tri�ngulo te,
+ {
+ if (ti == -1)// 4.1. Se o tri�ngulo ti � nulo (esta' na borda
+ { // da triangula��o) fa�a:
+ ti = te; // 4.1.1. Defina ti como sendo o tri�ngulo te,
+ te = -1; // 4.1.2. Defina te como sendo nulo,
+ ai = a; // 4.1.3. Defina ai como sendo aresta a,
+ continue;// 4.1.4. Retorne a 4.
+ }
+
+ int aaux = edgeWithVertexDiffFromEdge ( ti, v, ai );// 4.2. Defina a
+ if (aaux == -1) // aresta aaux do tri�ngulo ti que conecta o
+ return false;// v�rtice v e � diferente de ai,
+
+ int taux;
+ if (edgeSet_[aaux].right() == ti) // 4.3. Defina taux como sendo
+ taux = edgeSet_[aaux].left();// o tri�ngulo que compartilha
+ else if (edgeSet_[aaux].left() == ti)// a aresta aaux com ti,
+ taux = edgeSet_[aaux].right();
+ else
+ return false;
+
+ ti = taux;// 4.4. Defina ti como sendo o tri�ngulo taux e ai
+ ai = aaux;// como sendo aresta aaux,
+
+ vi = edgeSet_[ai].from();// 4.5. Insira o v�rtice diferente
+ if (vi == v) // de v conectado � aresta ai no conjunto V,
+ vi = edgeSet_[ai].to();
+ vertices.push_back (vi);
+ }// 4.6. Retorne a 4.
+ return true;
+}
+
+bool
+TeTin::vertexTriangles(int v, list<int> &triangles)
+{
+// Find one line that contains node
+ int a = oneEdgeWithVertex(v);
+ if (a == -1)
+ return false;
+
+// 1. Defina td como sendo o tri�ngulo que est� � direita da aresta a e
+ int td = edgeSet_[a].right(); // te como sendo o tri�ngulo que est�
+ int te = edgeSet_[a].left(); // � esquerda de a,
+
+ int ai = a; // 2. Defina ai como sendo aresta a
+ int ti = td;// e ti como sendo o tri�ngulo td,
+
+ if ( ti != -1 ) // 3. Se o tri�ngulo ti n�o for nulo,
+ { // insira ti no conjunto T,
+ triangles.push_back (ti);
+ }
+
+ while (ti != te)// 4. Enquanto ti for diferente do tri�ngulo te,
+ {
+ if (ti == -1)// 4.1. Se o tri�ngulo ti � nulo (esta' na
+ { // borda da triangula��o) fa�a:
+ ti = te; // 4.1.1. Defina ti como sendo o tri�ngulo te,
+ te = -1; // 4.1.2. Defina te como sendo nulo,
+ ai = a; // 4.1.3. Defina ai como sendo aresta a,
+ if ( ti != -1 ) // 4.1.4. Se o tri�ngulo ti n�o for nulo,
+ { // insira ti no conjunto T,
+ triangles.push_back (ti);
+ }
+ continue;// 4.1.5. Retorne a 4.
+ }
+
+ int aaux = edgeWithVertexDiffFromEdge ( ti, v, ai );// 4.2. Defina a
+ if (aaux == -1) // aresta aaux do tri�ngulo ti que conecta o
+ return false;// v�rtice v e � diferente de ai,
+
+ int taux;
+ if (edgeSet_[aaux].right() == ti) // 4.3. Defina taux como sendo
+ taux = edgeSet_[aaux].left();// o tri�ngulo que compartilha
+ else if (edgeSet_[aaux].left() == ti)// a aresta aaux com ti,
+ taux = edgeSet_[aaux].right();
+ else
+ return false;
+
+ ti = taux;// 4.4. Defina ti como sendo o tri�ngulo taux e ai
+ ai = aaux;// como sendo aresta aaux,
+
+ if ( ti != -1 )// 4.5. Se o tri�ngulo ti n�o for nulo, insira
+ { // aresta ao de ti que n�o � diretamente
+ triangles.push_back (ti);
+ }
+ } // 4.6. Retorne a 4.
+ return true;
+}
+
+int
+TeTin::oneTriangleWithVertex(int v)
+{
+// Find one line that contains node
+ int a = oneEdgeWithVertex(v);
+ if (a == -1)
+ return -1;
+
+ int td = edgeSet_[a].right();
+ if ( td == -1 )
+ return edgeSet_[a].left();
+ else
+ return td;
+}
+
+bool
+TeTin::triangleContainsPoint(int t, TeCoord2D& pt)
+{
+ double totalArea, triangleArea;
+ TeCoord2D vert[3];
+
+ this->trianglePoints(t, vert[0], vert[1], vert[2]);
+
+// Calculate the base triangle area
+ triangleArea = fabs(( (vert[1].x() - vert[0].x()) *
+ (vert[2].y() - vert[0].y()) ) -
+ ( (vert[2].x() - vert[0].x()) *
+ (vert[1].y() - vert[0].y()) ));
+ triangleArea *= 1.00001;
+ totalArea = fabs(( (vert[0].x() - pt.x()) * (vert[1].y() - pt.y()) ) -
+ ( (vert[1].x() - pt.x()) * (vert[0].y() - pt.y()) ));
+ if (totalArea > triangleArea)
+ return false;
+
+ totalArea += fabs(( (vert[1].x() - pt.x()) * (vert[2].y() - pt.y()) ) -
+ ( (vert[2].x() - pt.x()) * (vert[1].y() - pt.y()) ));
+ if (totalArea > triangleArea)
+ return false;
+
+ totalArea += fabs(( (vert[0].x() - pt.x()) * (vert[2].y() - pt.y()) ) -
+ ( (vert[2].x() - pt.x()) * (vert[0].y() - pt.y()) ));
+ if (totalArea > triangleArea)
+ return false;
+
+ return true;
+}
+
+int
+TeTin::triangleAt (TeCoord2D& pt)
+{
+ double tolvertex = 1; //To be set through interface
+ double tol;
+ tol = TePrecision::instance().precision();
+ TePrecision::instance().setPrecision(tolvertex);
+//Seja v um v�rtice qualquer da triangula��o T e p o ponto para o qual se deseja saber qual tri�ngulo t
+// o cont�m.
+ int vi1;
+
+ TeTinEdgeSet::reverse_iterator i = edgeSet_.rbegin();
+ while ( i != edgeSet_.rend() )
+ {
+ vi1 = (*i++).from();
+ if (vi1 > 0 ) // -1L)
+ break;
+ }
+ if ( i == edgeSet_.rend() )
+ return -1;
+
+//1. Defina o conjunto T={t1,..., tm} com os m tri�ngulos que compartilham o v�rtice vi,
+ list<int> triset;
+ this->vertexTriangles(vi1, triset);
+
+ TeCoord2D pf = vertexSet_[vi1].location();
+ if ( pf == pt )
+//2. Se vi � igual a p, o tri�ngulo que cont�m p � um dos tri�ngulos que compartilham vi.
+// Escolha qualquer um dos tri�ngulos e termine o algoritmo.
+ return ( *(triset.begin()) );
+
+//3. Defina A={a1,...,an} com as n arestas opostas a vi,
+ list<int> aedges;
+ this->vertexOppEdges(vi1, aedges);
+
+//4. Defina V={v1,...,vm} com os m v�rtices dos tri�ngulos que cont�m o v�rtice vi,
+ list <int> vvertex;
+ this->vertexOppVertices(vi1, vvertex);
+
+//5. Insira o v�rtice v no conjunto VI de v�rtices intersectados,
+ set <int> viset;
+ viset.insert(vi1);
+
+//6. Defina o v�rtice auxiliar vaux como sendo vi,
+ int vaux = vi1;
+// e aresta aaux como sendo inv�lida
+ int aaux = -1;
+ vector<int> auxset(3);
+ for (;;)
+ {
+//7. Para cada tri�ngulo ti de T, fa�a:
+ list<int>::iterator tii;
+ for (tii = triset.begin(); tii != triset.end(); tii++)
+ {
+ int ti = *tii;
+//7.1. Se o tri�ngulo ti cont�m o ponto pn, termine o algoritmo.
+ if ( this->triangleContainsPoint( ti, pt ) )
+ return ti;
+ }
+//8. Para cada v�rtice vi de V, fa�a:
+ list<int>::iterator vii;
+ for (vii = vvertex.begin(); vii != vvertex.end(); vii++)
+ {
+ int vi = *vii;
+ TeCoord2D ptvi = vertexSet_[vi].location();
+ if ( ptvi == pt )
+//8.1. Se vi � igual a p, o tri�ngulo que cont�m p � um dos tri�ngulos que compartilham vi.
+// Escolha qualquer um dos tri�ngulos e termine o algoritmo.
+ return ( *(triset.begin()) );
+ }
+//9. Para cada v�rtice vi de V, fa�a:
+ for ( vii = vvertex.begin(); vii != vvertex.end(); vii++)
+ {
+ int vi = *vii;
+//9.1. Se vi est� sobre r, fa�a:
+ TeCoord2D ptvi = vertexSet_[vi].location();
+ TeCoord2D pinter;
+ if ( TePerpendicularDistance(pf, pt, ptvi, pinter) < TePrecision::instance().precision() )
+ {
+ TeBox box1;
+ updateBox (box1, pf);
+ updateBox (box1, pt);
+
+ if (TeWithin (pinter, box1) )
+ {
+//9.1.1. Redefina o conjunto A={a1,..., an} com as n arestas opostas a vi, diferentes de aaux,
+ aedges.clear();
+ this->vertexOppEdges(vi, aedges);
+//9.1.2. Defina o conjunto Aaux={a1,..., am} com as m arestas compartilhadas por vaux,
+ list <int> vauxedges;
+ this->vertexEdges(vaux, vauxedges);
+//9.1.3. Exclua do conjunto A todas as arestas que pertencem ao conjunto Aaux,
+ for (list<int>::iterator vai = vauxedges.begin(); vai != vauxedges.end(); vai++)
+ aedges.remove ( *vai );
+//9.1.4. Exclua do conjunto A a aresta aaux,
+ aedges.remove ( aaux ); // better perfomance than remove algorithm
+//9.1.5. Redefina o conjunto V={v1,..., vm} com os m v�rtices dos tri�ngulos que cont�m o v�rtice vi,
+// diferentes de vaux,
+ vvertex.clear();
+ this->vertexOppVertices(vi, vvertex);
+//9.1.6. Exclua do conjunto V todos os v�rtices que pertencem ao conjunto VI,
+ for (set<int>::iterator vvi = viset.begin(); vvi != viset.end(); vvi++)
+ vvertex.remove ( *vvi );
+//9.1.7. Redefina o conjunto T={t1, ..., tk } com os k tri�ngulos que cont�m o v�rtice vi,
+ triset.clear();
+ this->vertexTriangles(vi, triset);
+//9.1.8. Redefina o v�rtice auxiliar vaux como sendo vi,
+ vaux = vi;
+//9.1.8. Insira o v�rtice vi no conjunto VI de v�rtices intersectados,
+ viset.insert(vi);
+//9.1.8. Retorne a 7,
+ break;
+ }
+ }
+ }
+ if ( vii != vvertex.end() )
+ continue; // do for (;;)
+
+//10. Para cada aresta ai de A, fa�a:
+ list<int>::iterator aii;
+ for (aii = aedges.begin(); aii != aedges.end(); aii++)
+ {
+ int ai = *aii;
+//10.1. Se o ponto p est� sobre ai, fa�a:
+ TeCoord2D pfr = vertexSet_[edgeSet_[ai].from()].location();
+ TeCoord2D pto = vertexSet_[edgeSet_[ai].to()].location();
+ TeCoord2D pinter;
+ if ( TePerpendicularDistance(pfr, pto, pt, pinter) < TePrecision::instance().precision() )
+ {
+ TeBox box1;
+ updateBox (box1, pfr);
+ updateBox (box1, pto);
+ if (TeWithin(pinter, box1) )
+ {
+//10.1.1. Escolha qualquer um dos tri�ngulos que compartilham ai.
+ int ti = edgeSet_[ai].left();
+//10.1.2. Termine o algoritmo.
+ if ( (ti != -1) && (this->triangleContainsPoint(ti, pt)) )
+ return ( ti );
+ else
+ {
+ ti = edgeSet_[ai].right();
+ if ( (ti != -1) && (this->triangleContainsPoint(ti, pt)) )
+ return ( ti );
+ return -1;
+ }
+ }
+ }
+ }
+
+//11. Para cada aresta ai de A, fa�a:
+ for (aii = aedges.begin(); aii != aedges.end(); aii++)
+ {
+ int ai = *aii;
+ //int vt = edgeSet_[ai].to();
+ //int vf = edgeSet_[ai].from();
+//11.1. Se ai intersecta r, fa�a:
+ TeIntersCoordsVec pinters;
+ //if(TeSegmentIntersection(vertexSet_[vt].location(), vertexSet_[vf].location(), pf, pt, pinters, tol) && pinters.size() < 2)
+ //{
+//11.1.2. Defina os tri�ngulos t1 e t2 que compartilham a aresta ai.
+//11.1.3. Se t2 est� contido no conjunto T , ent�o fa�a taux=t1,
+ int taux = edgeSet_[ai].left();
+ if (taux == -1)
+ return -1;
+ list<int>::iterator pos1 = find (triset.begin(), triset.end(), taux);
+ if ( pos1 != triset.end() )
+//11.1.4. Sen�o, fa�a taux=t2,
+ taux = edgeSet_[ai].right();
+ if (taux == -1)
+ return -1;
+//11.1.5. Se o tri�ngulo taux cont�m o ponto pn, termine o algoritmo.
+ if ( this->triangleContainsPoint( taux, pt ) )
+ return taux;
+//11.1.6. Redefina o conjunto A={a1, a2} com as arestas do tri�ngulo taux diferentes de ai,
+ triangleSet_[taux].edges ( auxset[0], auxset[1], auxset[2] );
+ aedges.clear();
+ aedges.insert( aedges.begin(), auxset.begin(), auxset.end() );
+ aedges.remove( ai );
+//11.1.7. Redefina o conjunto V={v1}. O v�rtice v1 � o v�rtice do tri�ngulo taux que n�o est�
+// em nenhuma extremidade da aresta ai,
+ int vaux1 = edgeSet_[ai].from();
+ int vaux2 = edgeSet_[ai].to();
+ this->triangleVertices ( taux, auxset[0], auxset[1], auxset[2]);
+ vvertex.clear();
+ vvertex.insert ( vvertex.begin(), auxset.begin(), auxset.end() );
+ vvertex.remove ( vaux1 );
+ vvertex.remove ( vaux2 );
+
+//11.1.8. Redefina o conjunto T={taux},
+ triset.clear();
+ triset.push_back ( taux );
+//11.1.9. Redefina aaux como sendo ai,
+ aaux = ai;
+//11.1.10. Retorne a 8;
+ break;
+ //}
+ }
+//12. Se n�o h� mais arestas em A, ent�o:
+ if ( aii == aedges.end() )
+ {
+//12.1. Para cada tri�ngulo ti de T, fa�a:
+ list<int>::iterator tii;
+ for ( tii = triset.begin(); tii != triset.end(); tii++)
+
+ {
+ int ti = *tii;
+ //12.1.1. Se o tri�ngulo ti cont�m o ponto pn, termine o algoritmo.
+ if ( this->triangleContainsPoint( ti, pt ) )
+ return ti;
+ }
+ if (tii == triset.end() )
+ return -1;
+ }
+ } // Do for (;;)
+ return -1;
+}
+
+bool
+TeTin::insertPoint(double x, double y, float value)
+{
+ double tolvertex = 1; //To be set through interface
+
+ double tol = TePrecision::instance().precision();
+ TePrecision::instance().setPrecision(tolvertex);
+
+// Get Point to be inserted from vector
+ TeCoord2D pt(x,y);
+ if ( ! TeWithin (pt, vertexSet_.box()) )
+ return false;
+
+// Find the triangle that owns the point pt
+ int t = triangleAt ( pt );
+
+ if (t == -1)
+ return false;
+
+ TeCoord2D vert[3];
+ trianglePoints(t, vert[0], vert[1], vert[2]);
+
+
+
+// Verify if point is too close to one triangle vertex
+ int j;
+ for ( j = 0; j < 3; j++)
+ {
+ if (pt == vert[j]) // Using precision to compare
+ {
+ TePrecision::instance().setPrecision(tol);
+ return false;
+ }
+ }
+
+// Test if the point is on an edge
+ int nedge = -1;
+ double dmin = TeMAXFLOAT;
+ TeCoord2D pmin;
+ for (j = 0; j < 3; j++)
+ {
+ if ( fabs (vert[j].x() - vert[(j+1)%3].x()) > TePrecision::instance().precision() )
+ {
+ if ((pt.x() > vert[j].x()) && (pt.x() > vert[(j+1)%3].x()))
+ continue;
+ if ((pt.x() < vert[j].x()) && (pt.x() < vert[(j+1)%3].x()))
+ continue;
+ }
+ if ( fabs (vert[j].y() - vert[(j+1)%3].y()) > TePrecision::instance().precision() )
+ {
+ if ((pt.y() > vert[j].y()) && (pt.y() > vert[(j+1)%3].y()))
+ continue;
+ if ((pt.y() < vert[j].y()) && (pt.y() < vert[(j+1)%3].y()))
+ continue;
+ }
+ TeCoord2D paux;
+ double daux = TePerpendicularDistance(vert[j], vert[(j+1)%3], pt, paux);
+ if ((daux < TePrecision::instance().precision()) && (daux < dmin))
+ {// On edge j
+ nedge = j;
+ dmin = daux;
+ pmin = paux;
+ }
+ }
+
+ TePrecision::instance().setPrecision(tol);
+
+ vertexSet_.add( TeTinVertex (pt, value, NORMALVERTEX, -1 ) );
+ int v = vertexSet_.size()-1;
+
+ set<int> trianglesToTest;
+ if (nedge == -1) // Not on an edge
+ {
+ this->twoNewTriangles(t, v, trianglesToTest); //If not, split triang
+ }
+ else
+ {
+ int neighids[3];
+ this->triangle3Neighbors(t, neighids[0],neighids[1],neighids[2]);
+ int edges[3];
+ triangleSet_[t].edges( edges[0], edges[1], edges[2] );
+ for (j = 0; j < 3; j++)
+ { // Check if neighbor triangle opposite vertex is too close
+ if ( neighids[j] == -1L )
+ continue;
+ int oppVertex = edgeOppVertex(neighids[j], edges[j]);
+ int vsize = vertexSet_.size();
+ if ( oppVertex < vsize )
+ {
+ TeCoord2D ptaux = vertexSet_[oppVertex].location();
+ if ( ptaux == pt )
+// if ( vertexSet_[oppVertex].location() == pt )
+ {
+ // If necessary add code to change oppVertex type and value
+ return false;
+ }
+ }
+ }
+
+// Duplicate triangle and its neighbor on the same edge
+ int an0 = this->duplicateTriangle( t, nedge, v, trianglesToTest);
+ if (neighids[nedge] != -1L)
+ {
+ int tv = neighids[nedge];
+ this->dupNeighTriangle( tv, an0, v, trianglesToTest);
+ }
+ }
+ this->testDelaunayForVertex(v, trianglesToTest);
+ return true;
+}
+
+bool
+TeTin::trianglePoints(int t, TeCoord2D& pt0, TeCoord2D& pt1, TeCoord2D& pt2)
+{
+ int vertex0, vertex1, vertex2;
+ this->triangleVertices(t, vertex0, vertex1, vertex2);
+
+ pt0 = vertexSet_[vertex0].location();
+ pt1 = vertexSet_[vertex1].location();
+ pt2 = vertexSet_[vertex2].location();
+
+ return true;
+}
+
+bool
+TeTin::triangleVertices(int t, int& vertex0, int& vertex1, int& vertex2)
+{
+ int edge0, edge1, edge2;
+ triangleSet_[t].edges(edge0,edge1,edge2);
+
+ if (edgeSet_[edge0].to() == edgeSet_[edge1].to())
+ {
+ vertex0 = edgeSet_[edge0].from();
+ vertex1 = edgeSet_[edge0].to();
+ vertex2 = edgeSet_[edge1].from();
+ }
+ else if (edgeSet_[edge0].to() == edgeSet_[edge1].from())
+ {
+ vertex0 = edgeSet_[edge0].from();
+ vertex1 = edgeSet_[edge0].to();
+ vertex2 = edgeSet_[edge1].to();
+ }
+ else if (edgeSet_[edge0].from() == edgeSet_[edge1].from())
+ {
+ vertex0 = edgeSet_[edge0].to();
+ vertex1 = edgeSet_[edge0].from();
+ vertex2 = edgeSet_[edge1].to();
+ }
+ else if (edgeSet_[edge0].from() == edgeSet_[edge1].to())
+ {
+ vertex0 = edgeSet_[edge0].to();
+ vertex1 = edgeSet_[edge0].from();
+ vertex2 = edgeSet_[edge1].from();
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool
+TeTin::triangle3Neighbors(int t, int& neighbor0, int& neighbor1, int& neighbor2)
+{
+ int edge0, edge1, edge2;
+ triangleSet_[t].edges(edge0,edge1,edge2);
+
+ if (edgeSet_[edge0].left() == t)
+ neighbor0 = edgeSet_[edge0].right();
+ else
+ neighbor0 = edgeSet_[edge0].left();
+
+ if (edgeSet_[edge1].left() == t)
+ neighbor1 = edgeSet_[edge1].right();
+ else
+ neighbor1 = edgeSet_[edge1].left();
+
+ if (edgeSet_[edge2].left() == t)
+ neighbor2 = edgeSet_[edge2].right();
+ else
+ neighbor2 = edgeSet_[edge2].left();
+
+ return true;
+}
+
+int
+TeTin::triangleVertexAt(int t, int vertex)
+{
+ int vertices[3];
+ this->triangleVertices ( t, vertices[0],vertices[1],vertices[2] );
+
+ return vertices[vertex];
+}
+
+bool
+TeTin::twoNewTriangles(int t, int v, set<int>& triangles)
+{
+//1. Crie o v�rtice vn com os dados da amostra s,
+// Sint4 vn = nodeId;
+
+//2. Crie 2 novos tri�ngulos t1 e t2,
+ int t1 = triangleSet_.size();
+ int t2 = t1+1;
+
+//3. Crie a nova aresta an0 que conecta os v�rtices vn e v0 e
+// tem t e t1 como os tri�ngulos que compartilham a aresta.
+ int v0 = this->triangleVertexAt(t,0); //v0 e' o vertice 0 de t
+ edgeSet_.add( TeTinEdge (v, v0, t, t1, NORMALEDGE) );
+ int an0 = edgeSet_.size()-1;
+ vertexSet_[v].setOneEdge (an0);
+
+//4. Crie a nova aresta an1 que conecta os v�rtices vn e v1 e
+// tem t1 e t2 como os tri�ngulos que compartilham a aresta.
+ int v1 = this->triangleVertexAt(t,1); //v1 e' o vertice 1 de t
+ edgeSet_.add( TeTinEdge (v, v1, t1, t2, NORMALEDGE) );
+ int an1 = edgeSet_.size()-1;
+
+//5. Crie a nova aresta an2 que conecta os v�rtices vn e v2 e
+// tem t2 e t como os tri�ngulos que compartilham a aresta.
+ int v2 = this->triangleVertexAt(t,2); //v2 e' o vertice 2 de t
+ edgeSet_.add( TeTinEdge (v, v2, t2, t, NORMALEDGE) );
+ int an2 = edgeSet_.size()-1;
+
+//6. Troque o tri�ngulo t por t1 na aresta a0,
+ int a0 = triangleSet_[t].edgeAt(0); // retorna aresta 0 de t
+ edgeSet_[a0].exchangeTriangle(t,t1);
+
+//7. Defina as arestas de t1 como sendo an0, a0 e an1,
+ triangleSet_.add ( TeTinTriangle (an0, a0, an1) );
+
+//8. Troque o tri�ngulo t por t2 na aresta a1,
+ int a1 = triangleSet_[t].edgeAt(1); // retorna aresta 1 de t
+ edgeSet_[a1].exchangeTriangle(t, t2);
+
+//9. Defina as arestas de t2 como sendo an1, a1 e an2,
+ triangleSet_.add ( TeTinTriangle (an1, a1, an2) );
+
+//10. Defina as arestas de t como sendo an2, a2 e an0,
+ int a2 = triangleSet_[t].edgeAt(2); // retorna aresta 2 de t
+ triangleSet_[t].setEdges(an2, a2, an0);
+
+ triangles.insert(t);
+ triangles.insert(t1);
+ triangles.insert(t2);
+ return true;
+}
+
+int
+TeTin::duplicateTriangle(int t, int n, int v, set<int>& triangles)
+{
+// Seja t o tri�ngulo que cont�m cuja n-�sima aresta an � a aresta
+// pr�xima a amostra s ( n E {0,1,2} ). A aresta an conecta os v�rtices
+// vn e vj, a aresta aj conecta os v�rtices vj e vk e a aresta ak conecta
+// os v�rtices vk e vn, sendo j o resto da divis�o de n+1 por 3 e k o resto
+// da divis�o de n+2 por 3.
+ int edges[3];
+ triangleSet_[t].edges(edges[0],edges[1],edges[2]);
+
+ int an = edges [ n ];
+ int aj = edges [ (n+1)%3 ];
+ int ak = edges [ (n+2)%3 ];
+
+ int vn = this->triangleVertexAt( t, n );
+
+// 1. Crie o v�rtice v com os dados da amostra s,
+// 2. Defina o tri�ngulo tv que compartilha a aresta an com t,
+ int tv = 0;
+ if (edgeSet_[an].left() == t)
+ tv = edgeSet_[an].right();
+ else if (edgeSet_[an].right() == t)
+ tv = edgeSet_[an].left();
+
+// 3. Defina o v�rtice vop do tri�ngulo t que n�o � conectado a aresta an,
+ int vop = this->triangleVertexAt ( t, (n+2)%3 );
+
+// 4. Crie o novo tri�ngulos t1,
+ int t1 = triangleSet_.size();
+
+// 5. Crie a nova aresta an0 que conecta os v�rtices v e vn e
+// tem t1 e tv como os tri�ngulos que compartilham a aresta.
+ edgeSet_.add( TeTinEdge (v, vn, t1, tv, NORMALEDGE) );
+ int an0 = edgeSet_.size()-1;
+
+// 6. Crie a nova aresta an1 que conecta os v�rtices v e vop e
+// tem t e t1 como os tri�ngulos que compartilham a aresta.
+ edgeSet_.add( TeTinEdge (v, vop, t, t1, NORMALEDGE) );
+ int an1 = edgeSet_.size()-1;
+
+// 7. Modifique a aresta an para conectar o v�rtice v ao inv�s de vn,
+ edgeSet_[an].exchangeVertex( vn, v );
+ vertexSet_[vn].setOneEdge ( an0 );
+
+// 8. Defina as arestas de t como sendo an, aj e an1,
+ triangleSet_[t].setEdges( an, aj, an1 );
+
+// 9. Modifique a aresta ak para compartilhar o tri�ngulo t1 ao inv�s de t,
+ edgeSet_[ak].exchangeTriangle( t, t1 );
+
+// 10. Defina as arestas de t1 como sendo an0, an1 e ak,
+ triangleSet_.add ( TeTinTriangle (an0, an1, ak) );
+
+ triangles.insert(t);
+ triangles.insert(t1);
+
+ return an0;
+}
+
+bool
+TeTin::dupNeighTriangle(int tv, int an0, int v, set<int>& triangles)
+{
+// 11.1. Crie o novo tri�ngulo t2,
+ int t2 = triangleSet_.size();
+
+// 11.2. Defina a aresta av do tri�ngulo tv que cont�m o v�rtice vn
+// (obs: s� h� uma aresta porque a outra foi modificada),
+ int vn = edgeSet_[an0].to(); //Due to assembly, dangerous
+ if ( vn == v )
+ vn = edgeSet_[an0].from();
+
+ int edges[3];
+ triangleSet_[tv].edges(edges[0],edges[1],edges[2]);
+ int i;
+ for (i = 0; i < 3; i++)
+ {
+ if ( (edgeSet_[edges[i]].from() == vn) ||
+ (edgeSet_[edges[i]].to() == vn) )
+ break;
+ }
+ if (i == 3)
+ return false;
+ int av = edges[i];
+
+// 11.3. Defina as outras arestas de tv como sendo av1 e av2.
+ int av1 = edges[ (i+1)%3];
+ int av2 = edges[ (i+2)%3];
+
+// 11.4. Defina o v�rtice vvo conectado a vn por meio da aresta av,
+ int vvo;
+ if (edgeSet_[av].from() == vn)
+ vvo = edgeSet_[av].to();
+ else
+ vvo = edgeSet_[av].from();
+
+// 11.5. Crie a nova aresta an2 que conecta os v�rtices v e vvo e
+// tem t e t2 como os tri�ngulos que compartilham a aresta.
+ edgeSet_.add( TeTinEdge (v, vvo, tv, t2, NORMALEDGE) );
+ int an2 = edgeSet_.size()-1;
+
+// 11.6. Troque o tri�ngulo tv por t2 na aresta av,
+ edgeSet_[av].exchangeTriangle( tv, t2 );
+
+// 11.7. Troque o tri�ngulo tv por t2 na aresta an0,
+ edgeSet_[an0].exchangeTriangle( tv, t2 );
+
+// 11.8. Defina as arestas de tv como sendo an2, av1 e av2.
+ triangleSet_[tv].setEdges( an2, av1, av2 );
+
+// 11.9. Defina as arestas de t2 como sendo an0, av e an2,
+ triangleSet_.add ( TeTinTriangle ( an0, av, an2 ) );
+
+ triangles.insert(tv);
+ triangles.insert(t2);
+
+ return true;
+}
+
+void
+TeTin::testDelaunayForVertex(int v, set<int>& triangles)
+{
+ while ( triangles.size() )
+ {
+ set<int>::iterator i = triangles.begin();
+ int t = *i;
+ triangles.erase(t);
+ this->testDelaunayAt(t, v, triangles);
+ }
+}
+
+bool
+TeTin::testDelaunayAt(int t, int v, set<int>& triangles)
+{
+ // Retrieve line of triangle common to neighbor triangle
+ int e = this->edgeOppVertex (t, v);
+
+// Retrieve neighbour triangle (tviz) pointer
+ int tviz = edgeSet_[e].left();
+ if ( edgeSet_[e].left() == t )
+ tviz = edgeSet_[e].right();
+ if ( tviz == -1 )
+ return false;
+
+// Define base triangle (tri) center point
+ TeCoord2D vert[3];
+ this->trianglePoints(t, vert[0], vert[1], vert[2]);
+
+// Find opposite point to base triangle (tri) inside neighbour (tviz)
+ int vo = this->vertexOppEdge ( tviz, e );
+ TeCoord2D pto = vertexSet_[vo].location();
+
+// To avoid overflow
+ TeCoord2D ptmin( TeMAXFLOAT, TeMAXFLOAT );
+ int i;
+ for (i = 0; i < 3; i++)
+ if ( vert[i] < ptmin )
+ ptmin = vert[i];
+
+ if ( ! ptmin.tooBig() )
+ {
+ TeCoord2D mptmin ( -ptmin.x(), -ptmin.y() );
+ for (i = 0; i < 3; i++)
+ vert[i] += mptmin;
+ pto += mptmin;
+ }
+
+ TeCoord2D ptc;
+ if ( ! TeFindTriangleCenter( vert[0], vert[1], vert[2], ptc ) )
+ return false;
+
+// Calculate base triangle (tri) radius
+ double xaux = ptc.x() - vert[0].x();
+ double yaux = ptc.y() - vert[0].y();
+ double raio2 = xaux * xaux + yaux * yaux;
+
+// Calculate distance from opposite point (tviz) to center point (tri)
+ xaux = ptc.x() - pto.x();
+ yaux = ptc.y() - pto.y();
+ double dist2 = xaux * xaux + yaux * yaux;
+
+/* float fr = (float)sqrt(raio2);
+ float fd = (float)sqrt(dist2);
+ if (fr <= fd)
+ return false; */
+
+ if ( raio2 <= dist2 )
+ return false;
+
+ // If not, change edge between tri and ntri
+ bool status;
+ if ( status = this->swapEdges(t, tviz, e) )
+ {
+ triangles.insert(t);
+ triangles.insert(tviz);
+ }
+ return status;
+}
+
+bool
+TeTin::swapEdges( int t, int tv, int ai )
+{
+ if ( tv == -1 )
+ return false;
+// Seja t o tri�ngulo que cont�m cuja i-�sima aresta ai � a aresta
+// que se deseja alterar ( i E {0,1,2} ). A aresta ai conecta os
+// v�rtices vi e vj, a aresta aj conecta os v�rtices vj e vk e a
+// aresta ak conecta os v�rtices vk e vi, sendo j o resto da divis�o
+// de i+1 por 3 e k o resto da divis�o de i+2 por 3.
+
+ int tedges[3];
+ triangleSet_[t].edges ( tedges[0], tedges[1], tedges[2] );
+
+ int vertex[3];
+ this->triangleVertices ( t, vertex[0], vertex[1], vertex[2]);
+ int i;
+ for ( i= 0; i < 3; i++ )
+ if ( tedges[i] == ai )
+ break;
+
+ int aj = tedges [ (i+1) % 3 ];
+ int ak = tedges [ (i+2) % 3 ];
+
+ int vi = vertex [ i ];
+ int vj = vertex [ (i+1) % 3 ];
+ int vk = vertex [ (i+2) % 3 ];
+
+// Seja tv o tri�ngulo que compartilha a aresta ai com t. O v�rtice de
+// tv que n�o � conectado pela aresta ai � o v�rtice vn. As outras
+// arestas do tri�ngulo tv s�o am que conecta os v�rtices vi e vn e a
+// aresta an conecta os v�rtices vn e vj.
+
+ int vn = this->vertexOppEdge ( tv, ai );
+
+ int tvedges [3];
+ triangleSet_[tv].edges ( tvedges[0], tvedges[1], tvedges[2] );
+
+ int am, an = 0;
+ for ( int j = 0; j < 3; j++ )
+ {
+ if ( tvedges [ j ] == ai )
+ continue;
+
+ if ( edgeSet_[tvedges[j]].from() == vn )
+ {
+ if ( edgeSet_[tvedges[j]].to() == vi )
+ am = tvedges [ j ];
+ else if ( edgeSet_[tvedges[j]].to() == vj )
+ an = tvedges [ j ];
+ }
+ else if ( edgeSet_[tvedges[j]].to() == vn )
+ {
+ if ( edgeSet_[tvedges[j]].from() == vi )
+ am = tvedges [ j ];
+ else if ( edgeSet_[tvedges[j]].from() == vj )
+ an = tvedges [ j ];
+ }
+ }
+
+ TeCoord2D ptaux;
+ double tol = TePrecision::instance().precision();
+ if ( TePerpendicularDistance(vertexSet_[vk].location(), vertexSet_[vn].location(),
+ vertexSet_[vi].location(), ptaux) < tol )
+ return false;
+ if ( TePerpendicularDistance(vertexSet_[vk].location(), vertexSet_[vn].location(),
+ vertexSet_[vj].location(), ptaux) < TePrecision::instance().precision() )
+ return false;
+
+// 1. Se o segmento de reta formado conectando o v�rtice vk do
+// tri�ngulo t ao v�rtice vn de tv intersecta a aresta ai, fa�a:
+ TeIntersCoordsVec pinters;
+ //if(!TeSegmentIntersection(vertexSet_[vi].location(), vertexSet_[vj].location(), vertexSet_[vk].location(), vertexSet_[vn].location(), pinters, tol)
+ // || pinters.size() == 2)
+ // return false;
+
+// 1.1. Troque na aresta ai o v�rtice vi pelo vertice vk e o
+// v�rtice vj pelo v�rtice vn.
+ edgeSet_[ai].exchangeVertex ( vi, vk );
+ edgeSet_[ai].exchangeVertex ( vj, vn );
+
+ if ( vertexSet_[vi].oneEdge() == ai )
+ vertexSet_[vi].setOneEdge ( ak );
+ if ( vertexSet_[vj].oneEdge() == ai )
+ vertexSet_[vj].setOneEdge ( aj );
+
+// 1.2. Troque na aresta an o tri�ngulo tv pelo tri�ngulo t.
+ edgeSet_[an].exchangeTriangle( tv , t );
+
+// 1.3. Troque na aresta ak o tri�ngulo t pelo tri�ngulo tv.
+ edgeSet_[ak].exchangeTriangle( t, tv );
+
+// 1.4. Troque no tri�ngulo t a aresta ai pela aresta an e a
+// aresta ak pela aresta ai.
+ for ( i = 0; i < 3; i++ )
+ if ( tedges[i] == ai )
+ break;
+ tedges[i] = an;
+ tedges[(i+2)%3] = ai;
+ triangleSet_[t].setEdges ( tedges[0], tedges[1], tedges[2] );
+
+// 1.5. Troque no tri�ngulo tv a aresta ai pela aresta ak
+ for ( i = 0; i < 3; i++ )
+ if ( tvedges[i] == ai )
+ break;
+ tvedges [i] = ak;
+
+// e a aresta an pela aresta ai.
+ for ( i = 0; i < 3; i++ )
+ if (tvedges[i] == an )
+ break;
+ tvedges[i] = ai;
+
+ triangleSet_[tv].setEdges ( tvedges[0], tvedges[1], tvedges[2] );
+
+ return true;
+}
+
+bool
+TeTin::edgesInterBySegment( TeCoord2D& pf, TeCoord2D& pn, list<int> &aiset, list<int> &viset )
+{
+ double tolvertex = 1; //To be set through interface
+ TePrecision::instance().setPrecision(tolvertex);
+// Seja o segmento de reta r que conecta os pontos pf e pn,
+//1. Defina o tri�ngulo tf que cont�m o ponto pf,
+ int tf = this->triangleAt (pf);
+ if (tf == -1)
+ return false;
+
+//2. Defina o v�rtice vaux e aresta aaux, como sendo inv�lidos,
+ int vaux = -1;
+ int aaux = -1;
+
+//3. Defina o conjunto A={a1, a2, a3} com as arestas de tf,
+ vector<int> auxset(3);
+ triangleSet_[tf].edges ( auxset[0], auxset[1], auxset[2] );
+ list<int> aedges ( auxset.begin(), auxset.end() );
+
+//4. Defina o conjunto V={v1, v2, v3} com os v�rtices de tf,
+ this->triangleVertices ( tf, auxset[0], auxset[1], auxset[2]);
+ list <int> vvertex ( auxset.begin(), auxset.end() );
+
+//5. Defina o conjunto T={tf},
+ list<int> triset( 1, tf );
+ set<int> visetaux;
+
+//6. Para cada v�rtice vi de V, fa�a:
+ list<int>::iterator vii;
+ for (vii = vvertex.begin(); vii != vvertex.end(); vii++)
+ {
+ int vi = *vii;
+ TeCoord2D ptvi = vertexSet_[vi].location();
+ TeCoord2D pinter;
+
+//6.1. Se o v�rtice vi coincide com pf, fa�a:
+ if ( ptvi == pf )
+ {
+//6.1.1. Redefina A={a1,...,an} com as n arestas opostas a vi,
+ aedges.clear();
+ this->vertexOppEdges(vi, aedges);
+
+//6.1.2. Redefina V={v1,...,vm} com os m v�rtices dos tri�ngulos que cont�m o v�rtice vi,
+ vvertex.clear();
+ this->vertexOppVertices(vi, vvertex);
+
+//6.1.3. Redefina o conjunto T={t1,..., tm} com os m tri�ngulos que compartilham o v�rtice vi,
+ triset.clear();
+ this->vertexTriangles(vi, triset);
+
+//6.1.4. Redefina o v�rtice auxiliar vaux como sendo vi,
+ vaux = vi;
+ visetaux.insert(vi);
+//6.1.5. V� para 8,
+ break;
+ }
+ }
+ if ( vii == vvertex.end() )
+ {
+//7. Para cada aresta ai de A, fa�a:
+ for (list<int>::iterator aii = aedges.begin(); aii != aedges.end(); aii++)
+ {
+ int ai = *aii;
+//7.1. Se o ponto pf est� sobre ai, fa�a:
+ TeCoord2D pfr = vertexSet_[edgeSet_[ai].from()].location();
+ TeCoord2D pto = vertexSet_[edgeSet_[ai].to()].location();
+ TeCoord2D pinter;
+ if ( TePerpendicularDistance(pfr, pto, pf, pinter) < TePrecision::instance().precision() )
+ {
+//7.1.1. Defina o tri�ngulo tv que compartilha ai com tf,
+ int tv = edgeSet_[ai].right();
+ if (tv == tf)
+ tv = edgeSet_[ai].left();
+ if (tv == -1)
+ return false;
+//7.1.2. Redefina V={v1, v2, v3, v4} com os v�rtices de tv e tf,
+ vvertex.clear();
+ this->triangleVertices ( tv, auxset[0], auxset[1], auxset[2]);
+ vvertex.insert( vvertex.begin(), auxset.begin(), auxset.end() );
+ this->triangleVertices ( tf, auxset[0], auxset[1], auxset[2]);
+ vvertex.insert( vvertex.begin(), auxset.begin(), auxset.end() );
+ vvertex.sort();
+ vvertex.unique();
+//7.1.3. Redefina A={a1, a2, a3, a4} com as arestas de tv e tf diferentes de ai,
+ aedges.clear();
+ triangleSet_[tv].edges ( auxset[0], auxset[1], auxset[2] );
+ aedges.insert( aedges.begin(), auxset.begin(), auxset.end() );
+ aedges.remove(ai);
+ triangleSet_[tf].edges ( auxset[0], auxset[1], auxset[2] );
+ aedges.insert( aedges.begin(), auxset.begin(), auxset.end() );
+ aedges.remove(ai);
+
+//7.1.4. Redefina o conjunto T={tv, tf},
+ triset.push_back ( tv );
+//7.1.5. Redefina a aresta auxiliar aaux como sendo ai,
+ aiset.push_back ( ai );
+ aaux = ai;
+//7.1.6. V� para 8,
+ break;
+ }
+ }
+ }
+
+ for (;;)
+ {
+//8. Para cada tri�ngulo ti de T, fa�a:
+ list<int>::iterator tii;
+ for ( tii = triset.begin(); tii != triset.end(); tii++)
+ {
+ int ti = *tii;
+//8.1.1. Se o tri�ngulo ti cont�m o ponto pn, termine o algoritmo.
+ if ( this->triangleContainsPoint( ti, pn ) )
+ return true;
+ }
+//9. Para cada v�rtice vi de V, fa�a:
+ list<int>::iterator vii;
+ for (vii = vvertex.begin(); vii != vvertex.end(); vii++)
+ {
+ int vi = *vii;
+ TeCoord2D ptvi = vertexSet_[vi].location();
+//9.1. Se vi coincide com pn, fa�a:
+ if ( ptvi == pn )
+ {
+//9.1.1. Insira o v�rtice vi no conjunto VI de v�rtices intersectados,
+ viset.push_back ( vi );
+//9.1.2. Termine o algoritmo.
+ break;
+ }
+ }
+ if ( vii != vvertex.end() )
+ break; // do for (;;)
+
+//10. Para cada v�rtice vi de V, fa�a:
+ for ( vii = vvertex.begin(); vii != vvertex.end(); vii++)
+ {
+ int vi = *vii;
+//10.1. Se vi � diferente de vaux e est� sobre r, fa�a:
+ if ( vi != vaux )
+ {
+ TeCoord2D ptvi = vertexSet_[vi].location();
+ TeCoord2D pinter;
+ if ( TePerpendicularDistance(pf, pn, ptvi, pinter) < TePrecision::instance().precision() )
+ {
+ TeBox box1;
+ updateBox (box1, pf);
+ updateBox (box1, pn);
+ if (TeWithin (pinter, box1) )
+ {
+//10.1.1. Redefina o conjunto A={a1,..., an} com as n arestas opostas a vi, excluindo as arestas de AI,
+ aedges.clear();
+ this->vertexOppEdges(vi, aedges);
+ list<int>::iterator aisi;
+ for ( aisi = aiset.begin(); aisi != aiset.end(); aisi++)
+ aedges.remove ( *aisi );
+//10.1.2. Redefina o conjunto V={v1,..., vm} com os m v�rtices dos tri�ngulos que cont�m o v�rtice vi,
+// excluindo os vertices de Vi,
+ vvertex.clear();
+ this->vertexOppVertices(vi, vvertex);
+ list<int>::iterator visi;
+ for ( visi = viset.begin(); visi != viset.end(); aisi++)
+ viset.remove ( *visi );
+//101.3. Redefina o conjunto T={t1, ..., tk } com os k tri�ngulos que cont�m o v�rtice vi,
+ triset.clear();
+ this->vertexTriangles(vi, triset);
+//101.4. Insira o v�rtice vi no conjunto VI de v�rtices intersectados,
+ viset.push_back ( vi );
+//101.5. Defina o conjunto Ac={a1,..., aj} com as j arestas que cont�m vi, diferentes de aaux,
+//101.6. Insira as arestas de Ac no conjunto AI de arestas intersectadas,
+ this->vertexEdges(vi, aiset);
+ aiset.sort();
+ aiset.unique();
+//10.7. Redefina o v�rtice auxiliar vaux como sendo vi,
+ vaux = vi;
+//10.8. Retorne a 8,
+ break;
+ }
+ }
+ }
+ }
+ if ( vii != vvertex.end() )
+ continue; // do for (;;)
+
+//11. Para cada aresta ai de A, fa�a:
+ list<int>::iterator aii;
+ for (aii = aedges.begin(); aii != aedges.end(); aii++)
+ {
+ int ai = *aii;
+//11.1. Se o ponto pn est� sobre ai, fa�a:
+ TeCoord2D pfr = vertexSet_[edgeSet_[ai].from()].location();
+ TeCoord2D pto = vertexSet_[edgeSet_[ai].to()].location();
+ TeCoord2D pinter;
+ if ( TePerpendicularDistance(pfr, pto, pn, pinter) < TePrecision::instance().precision() )
+ {
+ TeBox box1;
+ updateBox (box1, pfr);
+ updateBox (box1, pto);
+ if (TeWithin (pinter, box1) )
+ {
+//11.1.1. Insira a aresta ai no conjunto AI de arestas intersectadas,
+ aiset.push_back ( ai );
+//11.1.2. Termine o algoritmo.
+ break;
+ }
+ }
+ }
+ if ( aii != aedges.end() )
+ break; // do for (;;)
+
+//12. Para cada aresta ai de A, fa�a:
+ for (aii = aedges.begin(); aii != aedges.end(); aii++)
+ {
+ int ai = *aii;
+ TeCoord2D pinter;
+ //int vt = edgeSet_[ai].to();
+ //int vf = edgeSet_[ai].from();
+//12.1. Se ai intersecta r, fa�a:
+ TeIntersCoordsVec pinters;
+ //if(TeSegmentIntersection(vertexSet_[vt].location(), vertexSet_[vf].location(), pf, pn, pinters) && pinters.size() < 2)
+ //{
+//12.1.1. Insira a aresta ai no conjunto AI de arestas intersectadas,
+ aiset.push_back ( ai );
+//12.1.2. Defina os tri�ngulos t1 e t2 que compartilham a aresta ai.
+//12.1.3. Se t2 est� contido no conjunto T , ent�o fa�a taux=t1,
+ int taux = edgeSet_[ai].left();
+ if (taux == -1)
+ return false;
+ list<int>::iterator pos1 = find (triset.begin(), triset.end(), taux);
+ if ( pos1 != triset.end() )
+//12.1.4. Sen�o, fa�a taux=t2,
+ taux = edgeSet_[ai].right();
+ if (taux == -1)
+ return false;
+//12.1.5. Se o tri�ngulo taux cont�m o ponto pn, termine o algoritmo.
+ if ( this->triangleContainsPoint( taux, pn ) )
+ return true;
+//12.1.6. Redefina o conjunto A={a1, a2} com as arestas do tri�ngulo taux diferentes de ai,
+ triangleSet_[taux].edges ( auxset[0], auxset[1], auxset[2] );
+ aedges.clear();
+ aedges.insert( aedges.begin(), auxset.begin(), auxset.end() );
+ aedges.remove( ai );
+//12.1.7. Redefina o conjunto V={v1}. O v�rtice v1 � o v�rtice do tri�ngulo taux que n�o est�
+// em nenhuma extremidade da aresta ai,
+ int vaux1 = edgeSet_[ai].from();
+ int vaux2 = edgeSet_[ai].to();
+ this->triangleVertices ( taux, auxset[0], auxset[1], auxset[2]);
+ vvertex.clear();
+ vvertex.insert ( vvertex.begin(), auxset.begin(), auxset.end() );
+ vvertex.remove ( vaux1 );
+ vvertex.remove ( vaux2 );
+
+//12.1.8. Redefina o conjunto T={taux},
+ triset.clear();
+ triset.push_back ( taux );
+//12.1.9. Redefina aaux como sendo ai,
+ aaux = ai;
+//12.1.10. Retorne a 8;
+ break;
+ //}
+ }
+ } // Do for (;;)
+ return true;
+}
+
+bool
+TeTin::insertSegment( TeCoord2D& pf, TeCoord2D& pn )
+{
+ if ( this->insertPoint( pf.x(), pf.y(), 100.) )
+ {
+ if ( this->insertPoint( pn.x(), pn.y(), 100.) )
+ {
+ list<int> aiset;
+ list<int> viset;
+ if ( this->edgesInterBySegment( pf, pn, aiset, viset ) )
+ {
+ if ( viset.size() == 0 )
+ {
+ while ( aiset.size() > 0 )
+ {
+//2. Para cada aresta ai de A, fa�a:
+ list<int>::iterator aii;
+ for (aii = aiset.begin(); aii != aiset.end(); aii++)
+ {
+ int ai = *aii;
+//2.1. Defina os tri�ngulos td e te compartilham ai,
+ int td = edgeSet_[ai].right();
+ int te = edgeSet_[ai].left();
+//2.2. Defina os v�rtices vm e vn dos tri�ngulos td e te que n�o est�o sobre a aresta ai,
+ //int vn = this->vertexOppEdge(td, ai)
+ //int vm = this->vertexOppEdge(te, ai);
+//2.3. Se r n�o intersecta o segmento que conecta os v�rtices vm e vn, fa�a:
+ TeIntersCoordsVec pinters;
+ //if(!TeSegmentIntersection(vertexSet_[vn].location(), vertexSet_[vm].location(), pf, pn, pinters) ||
+ // pinters.size() == 2)
+ //{
+//2.3.1. Se ai intersecta o segmento que conecta os v�rtices vm e vn, fa�a:
+ if ( this->swapEdges( td, te, ai ) )
+ {
+//2.3.1.1. Redefina ai como sendo o segmento que conecta os v�rtices vm e vn,
+//2.3.1.2. Redefina adequadamente os tri�ngulos tv e tf,
+//2.3.1.3. Remova a aresta ai de A,
+ aiset.remove(ai);
+ break;
+ }
+ //}
+ }
+ if ( aii != aiset.end() )
+ continue;
+//3. Se n�o h� mais arestas em A, ent�o:
+//3.1. Termine o algoritmo.
+//4. Para cada aresta ai de A, fa�a:
+ aii = aiset.begin();
+ while ( aii != aiset.end() )
+ {
+ int ai = *aii;
+//4.1. Defina os tri�ngulos td e te compartilham ai,
+ int td = edgeSet_[ai].right();
+ int te = edgeSet_[ai].left();
+//4.2. Defina os v�rtices vm e vn dos tri�ngulos td e te que n�o est�o sobre a aresta ai,
+//4.3. Se ai intersecta o segmento que conecta os v�rtices vm e vn, fa�a:
+ if ( this->swapEdges( td, te, ai ) )
+ {
+//4.3.1. Redefina ai como sendo o segmento que conecta os v�rtices vm e vn,
+//4.3.2. Redefina adequadamente os tri�ngulos tv e tf,
+ TeCoord2D pinter;
+ //int vt = edgeSet_[ai].to();
+ //int vf = edgeSet_[ai].from();
+ TeIntersCoordsVec pinters;
+ //if ( ( vertexSet_[vt].location() == pf ) ||
+ // ( vertexSet_[vf].location() == pf ) ||
+ // ( vertexSet_[vt].location() == pn ) ||
+ // ( vertexSet_[vf].location() == pn ) ||
+ // ( (!TeSegmentIntersection(vertexSet_[vt].location(), vertexSet_[vf].location(), pf, pn, pinters) || pinters.size() == 2)))
+ //{
+//4.3.3. Se ai n�o intersecta r, fa�a:
+//4.3.3.1. Remova a aresta ai de A
+ // aiset.remove(ai);
+ // aii = aiset.begin();
+ //}
+ //else
+ // aii++;
+ }
+ else
+ aii++;
+ }
+//4.3.3. Retorne a 2.
+ }
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+bool
+TeTin::createInitialTriangles(TeBox &box)
+{
+ // Make box 1% bigger
+ zoomOut(box, 1./1.01);
+
+ // Create and insert initial nodes of the Tin
+ vertexSet_.add( TeTinVertex (box.lowerLeft(), (float)TeMAXFLOAT, NORMALVERTEX, 0 ) ); //v0
+ vertexSet_.add( TeTinVertex (TeCoord2D(box.x1(),box.y2()), (float)TeMAXFLOAT, NORMALVERTEX, 1 ) ); //v1
+ vertexSet_.add( TeTinVertex (box.upperRight(), (float)TeMAXFLOAT, NORMALVERTEX, 2 ) ); //v2
+ vertexSet_.add( TeTinVertex (TeCoord2D(box.x2(),box.y1()), (float)TeMAXFLOAT, NORMALVERTEX, 3 ) ); //v3
+
+// Create and insert initial lines of the Tin
+ edgeSet_.add( TeTinEdge (0, 1, -1, 0, NORMALEDGE) ); //a0
+ edgeSet_.add( TeTinEdge (1, 2, -1, 0, NORMALEDGE) ); //a1
+ edgeSet_.add( TeTinEdge (2, 3, -1, 1, NORMALEDGE) ); //a2
+ edgeSet_.add( TeTinEdge (3, 0, -1, 1, NORMALEDGE) ); //a3
+ edgeSet_.add( TeTinEdge (0, 2, 0, 1, NORMALEDGE) ); //a4
+
+// Create the two initial triangles of the Tin
+// Update triangles edges
+ triangleSet_.add ( TeTinTriangle (0, 1, 4) );
+ triangleSet_.add ( TeTinTriangle (2, 3, 4) );
+
+ return true;
+}
+
+bool
+TeTin::insertLineSamples ( TeContourLine& line )
+{
+ TeLineSimplify(line, 20., 200.);
+ unsigned int i;
+ for ( i = 0; i < line.size(); i++ )
+ {
+ TeCoord2D pt = line[i];
+ this->insertPoint(pt.x(), pt.y(), (float)line.value());
+ }
+ return true;
+}
+
diff --git a/src/terralib/kernel/TeTin.h b/src/terralib/kernel/TeTin.h
new file mode 100644
index 0000000..16ec703
--- /dev/null
+++ b/src/terralib/kernel/TeTin.h
@@ -0,0 +1,353 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeTin.h
+ This provides support for a TIN structure
+*/
+#ifndef __TERRALIB_INTERNAL_TIN_H
+#define __TERRALIB_INTERNAL_TIN_H
+#include "TeGeometry.h"
+#include <list>
+#include <set>
+
+using namespace std;
+
+//! Tin Vertex types
+enum TeTinVertexType
+{ NORMALVERTEX = 0, ONCONTOURVERTEX = 1, ONBREAKLINEVERTEX = 0x10 };
+
+//! A basic class for handling vertex of TIN
+/*!
+ \sa TeGeometry TeMeasure
+*/
+class TeTinVertex : public TeGeomSingle<TeCoord2D>, public TeMeasure
+{
+public:
+
+ //! Empty constructor
+ TeTinVertex() : TeMeasure ( TeMAXFLOAT ), oneEdge_ (-1) {}
+
+ //! Constructor with parameters
+ TeTinVertex( TeCoord2D xy, float value, TeTinVertexType type,
+ int edge ) :
+ TeGeomSingle<TeCoord2D> (xy), TeMeasure ( value ),
+ type_ (type), oneEdge_ ( edge )
+ { if ( ! xy.tooBig() ) TeGeometry::setBox(TeBox(xy,xy)); }
+
+// -- Methods
+//
+ int oneEdge ()
+ { return oneEdge_; }
+
+ void setOneEdge (int oneEdge)
+ { oneEdge_ = oneEdge; }
+
+ TeTinVertexType type ()
+ { return type_; }
+
+ void setType (TeTinVertexType type)
+ { type_ = type; }
+
+ void value (float value)
+ { value_ = value; }
+
+ TeGeomRep elemType() { return TeSAMPLES; }
+
+private:
+
+ TeTinVertexType type_;
+ int oneEdge_;
+};
+
+//! A basic class for handling a set of TeTinVertex
+class TeTinVertexSet : public TeGeomComposite <TeTinVertex>
+{
+public:
+
+// -- Constructors
+
+ TeTinVertexSet() {}
+
+// -- Methods
+
+ bool loadFromFile (string &fileName);
+
+ TeGeomRep elemType() { return TeSAMPLES; }
+};
+
+//! Tin Edges type
+enum TeTinEdgeType
+{ NORMALEDGE, ONCONTOUREDGE, ONBREAKLINEEDGE };
+
+//! A basic class for handling edges of a TIN
+/*!
+ \sa TeGeometry
+*/
+class TeTinEdge : public TeGeometry
+{
+public:
+
+// -- Constructors
+
+ TeTinEdge() {}
+ TeTinEdge(int from, int to, int left, int right,
+ TeTinEdgeType type) :
+ from_ (from), to_ (to), left_ (left), right_ (right), type_ (type)
+ {}
+
+// -- Methods
+
+ int from ()
+ { return from_; }
+
+ int to ()
+ { return to_; }
+
+ void setVertices (int from, int to)
+ {
+ from_ = from;
+ to_ = to;
+ }
+
+ void swapVertices ()
+ {
+ int aux = from_;
+ from_ = to_;
+ to_ = aux;
+ }
+
+ int left ()
+ { return left_; }
+
+ int right ()
+ { return right_; }
+
+ void setTriangles (int left, int right)
+ {
+ left_ = left;
+ right_ = right;
+ }
+
+ void swapTriangles ()
+ {
+ int aux = left_;
+ left_ = right_;
+ right_ = aux;
+ }
+
+ void exchangeTriangle ( int t1, int t2 )
+ {
+ if (left_ == t1 )
+ left_ = t2;
+ else
+ right_ = t2;
+ }
+
+ void exchangeVertex ( int v1, int v2 )
+ {
+ if (from_ == v1 )
+ from_ = v2;
+ else
+ to_ = v2;
+ }
+
+ TeTinEdgeType type ()
+ { return type_; }
+
+ void setType (TeTinEdgeType type)
+ { type_ = type; }
+
+ TeGeomRep elemType() { return TeSAMPLES; }
+
+private:
+
+ int from_, to_;
+ int left_, right_;
+ TeTinEdgeType type_;
+};
+
+//! A basic class for handling a set of TeTinEdge
+class TeTinEdgeSet : public TeGeomComposite<TeTinEdge>
+{
+public:
+
+// -- Constructors
+
+ TeTinEdgeSet() {}
+
+// -- Methods
+
+ bool loadFromFile (string &fileName);
+
+ TeGeomRep elemType() { return TeSAMPLES; }
+};
+
+//! TeTinTriangle: A class for handling a TIN triangle
+class TeTinTriangle : public TeGeometry
+{
+public:
+
+// -- Constructors
+
+ TeTinTriangle()
+ {
+ triEdges_[0] = -1;
+ triEdges_[1] = -1;
+ triEdges_[2] = -1;
+ }
+
+ TeTinTriangle(int first, int second, int third)
+ {
+ triEdges_[0] = first;
+ triEdges_[1] = second;
+ triEdges_[2] = third;
+ }
+
+// -- Methods
+
+ void setEdges (int first, int second, int third)
+ {
+ triEdges_[0] = first;
+ triEdges_[1] = second;
+ triEdges_[2] = third;
+ }
+
+ void edges (int& first, int& second, int& third)
+ {
+ first = triEdges_[0];
+ second = triEdges_[1];
+ third = triEdges_[2];
+ }
+
+ int edgeAt (short num)
+ {
+ if ((num > -1) && (num < 3))
+ return triEdges_[num];
+ else
+ return -1;
+ }
+
+ TeGeomRep elemType() { return TeSAMPLES; }
+
+private:
+
+ int triEdges_[3];
+};
+
+//! TeTinTriangle: A class for handling a set of TIN triangles
+class TeTinTriangleSet : public TeGeomComposite<TeTinTriangle>
+{
+public:
+
+// -- Constructors
+
+ TeTinTriangleSet() {}
+
+// -- Methods
+
+ bool loadFromFile (string &fileName);
+
+ TeGeomRep elemType() { return TeSAMPLES; }
+};
+
+//! A class to handle a TIN
+class TeTin
+{
+public:
+
+// -- Constructors
+
+ TeTin() {}
+ TeTin(TeBox & /* box */) {}
+
+// -- Methods
+ void clear()
+ {
+ vertexSet_.clear();
+ triangleSet_.clear();
+ edgeSet_.clear();
+ }
+
+ bool createInitialTriangles(TeBox &box);
+ bool insertLineSamples ( TeContourLine& line );
+ bool loadFromFile(string &fileName);
+ bool getLines(TeLineSet &lineSet);
+ bool isEmpty ()
+ { return ( vertexSet_.empty() && triangleSet_.empty() &&
+ edgeSet_.empty() ); }
+
+ typedef TeTinEdgeSet::iterator TeTinEdgeIterator;
+
+ TeTinEdgeIterator edgeBegin()
+ { return edgeSet_.begin(); }
+
+ TeTinEdgeIterator edgeEnd()
+ { return edgeSet_.end(); }
+
+ TeTinVertex& vertex (int i)
+ { return vertexSet_[i]; }
+
+ TeTinEdge& edge (int i)
+ { return edgeSet_[i]; }
+
+ bool triangleContainsPoint(int t, TeCoord2D& pt);
+ int edgeWithVertexDiffFromEdge(int t, int v, int e);
+ int oneTriangleWithVertex(int vertex);
+ int oneEdgeWithVertex(int vertex);
+ int edgeOppVertex(int triangle, int vertex);
+ int vertexOppEdge(int triangle, int edge);
+ bool vertexEdges(int vertex, list<int> &edges);
+ bool vertexOppEdges(int vertex, list<int> &edges);
+ bool vertexOppVertices(int vertex, list<int> &vertices);
+ bool vertexTriangles(int vertex, list<int> &triangles);
+ bool triangle3Neighbors(int t, int& neighbor0, int& neighbor1, int& neighbor2);
+ int triangleAt (TeCoord2D& pt);
+
+ bool triangleVertices(int t, int& vertex0, int& vertex1, int& vertex2);
+
+ int triangleVertexAt(int t, int vertex);
+ bool trianglePoints(int t, TeCoord2D& pt0, TeCoord2D& pt1, TeCoord2D& pt2);
+
+ bool twoNewTriangles(int t, int v, set<int>& triangles);
+ int duplicateTriangle(int t, int n, int v, set<int>& triangles);
+ bool dupNeighTriangle (int t, int e, int v, set<int>& triangles);
+
+ void testDelaunayForVertex(int v, set<int>& triangles);
+ bool testDelaunayAt(int t, int v, set<int>& triangles);
+ bool swapEdges( int t, int tv, int ai );
+
+ bool insertPoint(double x, double y, float value);
+
+ bool edgesInterBySegment( TeCoord2D& pf, TeCoord2D& pn, list<int> &aiset, list<int> &viset );
+ bool insertSegment( TeCoord2D& pf, TeCoord2D& pn );
+
+ TeGeomRep elemType() { return TeSAMPLES; }
+private:
+
+ TeTinVertexSet vertexSet_;
+ TeTinTriangleSet triangleSet_;
+ TeTinEdgeSet edgeSet_;
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeUtils.cpp b/src/terralib/kernel/TeUtils.cpp
new file mode 100644
index 0000000..b6a6dcd
--- /dev/null
+++ b/src/terralib/kernel/TeUtils.cpp
@@ -0,0 +1,465 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "TeUtils.h"
+#include "TeDefines.h"
+#include <stdio.h>
+#include <ctype.h>
+
+string
+Te2String ( const int value )
+{
+ char name [ TeNAME_LENGTH ];
+ sprintf ( name, "%d", value );
+ return name;
+}
+
+string
+Te2String ( const unsigned int value )
+{
+ char name [ TeNAME_LENGTH ];
+ sprintf ( name, "%d", value );
+ return name;
+}
+
+string
+Te2String ( const long value )
+{
+ char name [ TeNAME_LENGTH ];
+ sprintf ( name, "%ld", value );
+ return name;
+}
+
+string
+Te2String ( const unsigned long value )
+{
+ char name [ TeNAME_LENGTH ];
+ sprintf ( name, "%ld", value );
+ return name;
+}
+
+void
+TeTrim(string &str)
+{
+//empty strings are bad
+ if(str.empty())
+ return;
+//remove left whitespace, \t and \n
+ string::iterator it;
+ for(it=str.begin();it!=str.end() &&
+ ((*it) == ' ' || (*it) == '\t' || (*it) == '\n');it++);
+ str.erase(str.begin(),it);
+//empty strings are bad
+ if(str.empty())
+ return;
+//remove right whitespace, \t and \n
+ it=str.end();
+ for(--it;it!=str.begin() &&
+ ((*it) == ' ' || (*it) == '\t' || (*it) == '\n');--it);
+ str.erase(++it,str.end());
+}
+
+string
+TeRemoveSpecialChars ( string& str)
+{
+ string aux;
+ string::iterator it;
+ for(it=str.begin();it!=str.end();it++)
+ {
+ if (isalnum(*it))
+ aux+=(*it);
+ }
+ return aux;
+}
+
+string
+Te2String ( const double value, int precision )
+{
+ char name [ TeNAME_LENGTH ];
+ if (precision == 0)
+ sprintf ( name, "%f", value );
+ else
+ sprintf ( name, "%.*f", precision, value );
+
+return name;
+}
+
+
+string
+TeGetExtension ( const char* value )
+{
+ if (!value)
+ return string("");
+ string name = string(value);
+ int len = strlen ( value );
+ unsigned int ip = name.rfind('.');
+ if (ip == std::string::npos)
+ return "";
+ else
+ return name.substr(ip+1,len-1);
+}
+
+string
+TeGetName ( const char* value )
+{
+ if (!value)
+ return string("");
+ string name = string(value);
+ int len = strlen ( value );
+
+ int sp = name.rfind('\\')+1;
+ int ip = (name.substr(sp,len-1)).rfind('.');
+ if (ip>0)
+ return name.substr(0,sp+ip);
+ else
+ return name;
+}
+
+string
+TeGetBaseName ( const char* value )
+{
+ if (!value)
+ return string("");
+ string name = string(value);
+ int ip = name.rfind('.');
+ unsigned int is = name.rfind('\\');
+ if (is == std::string::npos)
+ is = name.rfind('/');
+ return name.substr(is+1,ip-is-1);
+}
+
+string
+TeGetPath(const char* value)
+{
+ if (!value)
+ return string(".");
+ string name = string (value);
+ unsigned int ip = name.rfind('/');
+ if (ip == std::string::npos)
+ return string(".");
+ else
+ return name.substr(0,ip);
+}
+
+void
+TeConvertToUpperCase ( const string& name, char upName[] )
+{
+
+ const char* old = name.c_str();
+
+ const char* p;
+ int i = 0;
+
+ for( p = old; p < old + strlen ( old) ; p++ )
+ {
+ if ( islower ( *p ) )
+ upName[i] = toupper( *p );
+ else
+ upName [i] = *p;
+ i++;
+ }
+ upName[i] = '\0';
+}
+
+string
+TeConvertToUpperCase (const string &name)
+{
+ string aux = "";
+ for(unsigned int i=0; i < strlen(name.c_str()); i++)
+ {
+ if((name[i] >= 97) && (name[i] <= 122))
+ aux += name[i] - 32;
+ else
+ aux += name[i];
+ }
+ return aux;
+}
+
+
+string
+TeConvertToLowerCase (const string &name)
+{
+ string aux = "";
+ for(unsigned int i=0; i < strlen(name.c_str()); i++)
+ {
+ if((name[i] >= 65) && (name[i] <= 90))
+ aux += name[i] + 32;
+ else
+ aux += name[i];
+ }
+ return aux;
+}
+
+
+//-----------------------------------------------------------------------
+//
+// Purpose: STL split string utility
+// Author: Paul J. Weiss
+// Extracted from: The Code Project (http://www.codeproject.com/)
+//
+//------------------------------------------------------------------------
+
+int TeSplitString(const string& input, const string& delimiter, vector<string>& results)
+{
+ int iPos = 0;
+ int newPos = -1;
+ int sizeS2 = delimiter.size();
+ int isize = input.size();
+
+ if (input.empty())
+ return 0;
+
+ vector<int> positions;
+
+ newPos = input.find (delimiter, 0);
+
+ if( newPos < 0 )
+ {
+ results.push_back(input);
+ return 1;
+ }
+
+ int numFound = 0;
+ while( newPos > iPos )
+ {
+ numFound++;
+ positions.push_back(newPos);
+ iPos = newPos;
+ newPos = input.find (delimiter, iPos+sizeS2+1);
+ }
+
+ for( unsigned int i=0; i <= positions.size(); i++ )
+ {
+ string s;
+ if( i == 0 ) { s = input.substr( i, positions[i] ); }
+ int offset = positions[i-1] + sizeS2;
+ if( offset < isize )
+ {
+ if( i == positions.size() )
+ {
+ s = input.substr(offset);
+ }
+ else if( i > 0 )
+ {
+ s = input.substr( positions[i-1] + sizeS2, positions[i] - positions[i-1] - sizeS2 );
+ }
+ }
+ if( s.size() > 0 )
+ {
+ results.push_back(s);
+ }
+ }
+ return numFound;
+}
+
+bool TeNoCaseCmp(const char& c1, const char& c2)
+{
+ return toupper(c1) == toupper(c2);
+}
+
+
+bool
+TeStringCompare(const string& str1, const string& str2, bool caseS)
+{
+ if (!caseS)
+ {
+ return ((str1.size() == str2.size()) &&
+ equal(str1.begin(),str1.end(),str2.begin(),TeNoCaseCmp));
+ }
+ else
+ return (str1 == str2);
+}
+
+double
+TeRoundD(double val, int precision)
+{
+ char name [ TeNAME_LENGTH ];
+ sprintf ( name, "%.*f", precision, val);
+ return atof(name);
+
+}
+
+bool
+TeCompareDouble(double a, double b, int precision)
+{
+ char bufa [ TeNAME_LENGTH ];
+ char bufb [ TeNAME_LENGTH ];
+ if (precision == 0)
+ {
+ sprintf ( bufa, "%f", a );
+ sprintf ( bufb, "%f", b );
+ }
+ else
+ {
+ sprintf ( bufa, "%.*f", precision, a );
+ sprintf ( bufb, "%.*f", precision, b );
+ }
+
+ string A = bufa;
+ string B = bufb;
+ return (A == B);
+}
+
+void TeWriteToFile(const string& fileName, const string& text, const string& mode)
+{
+ FILE *f;
+
+ f = fopen(fileName.c_str(), mode.c_str());
+
+ fprintf(f, "%s", text.c_str());
+
+ fclose(f);
+
+ return;
+}
+
+double TeAdjustToPrecision(double val, int precision, bool reduce)
+{
+ double p = pow(10.0, (double)-precision);
+
+ if (reduce)
+ return (val - p);
+
+ return (val + p);
+}
+
+string TeCheckName(const string& name, bool& changed, string& invalidChar)
+{
+ string newName = name;
+
+ if(newName[0] >= 0x30 && newName[0] <= 0x39)
+ {
+ newName[0] = '_';
+ invalidChar = "begin with a numeric character";
+ }
+
+ int ff = newName.find(" ", string::npos);
+ while(ff >= 0)
+ {
+ newName.replace(ff, 1, "_");
+ ff = newName.find(" ", string::npos);
+ invalidChar = "blank space";
+ }
+
+ ff = newName.find("*", string::npos);
+ while(ff >= 0)
+ {
+ newName.replace(ff, 1, "_");
+ ff = newName.find("*", string::npos);
+ invalidChar = "mathematical symbol *";
+ }
+
+ ff = newName.find("/", string::npos);
+ while(ff >= 0)
+ {
+ newName.replace(ff, 1, "_");
+ ff = newName.find("/", string::npos);
+ invalidChar = "mathematical symbol /";
+ }
+
+ ff = newName.find("-", string::npos);
+ while(ff >= 0)
+ {
+ newName.replace(ff, 1, "_");
+ ff = newName.find("-", string::npos);
+ invalidChar = "mathematical symbol -";
+ }
+
+ ff = newName.find("+", string::npos);
+ while(ff >= 0)
+ {
+ newName.replace(ff, 1, "_");
+ ff = newName.find("+", string::npos);
+ invalidChar = "mathematical symbol +";
+ }
+
+ ff = newName.find("%", string::npos);
+ while(ff >= 0)
+ {
+ newName.replace(ff, 1, "_");
+ ff = newName.find("%", string::npos);
+ invalidChar = "mathematical symbol %";
+ }
+
+ ff = newName.find(">", string::npos);
+ while(ff >= 0)
+ {
+ newName.replace(ff, 1, "_");
+ ff = newName.find(">", string::npos);
+ invalidChar = "mathematical symbol >";
+ }
+
+ ff = newName.find("<", string::npos);
+ while(ff >= 0)
+ {
+ newName.replace(ff, 1, "_");
+ ff = newName.find("<", string::npos);
+ invalidChar = "mathematical symbol <";
+ }
+
+ string u = TeConvertToUpperCase(newName);
+ if(u=="OR" || u=="AND" || u=="NOT" || u=="LIKE" ||
+ u=="SELECT" || u=="FROM" || u=="UPDATE" || u=="DELETE" ||u=="BY" || u=="GROUP" || u=="ORDER" ||
+ u=="DROP" || u=="INTO" || u=="VALUE" || u=="IN" || u=="ASC" || u=="DESC"|| u=="COUNT" || u=="JOIN" ||
+ u=="LEFT" || u=="RIGHT" || u=="INNER" || u=="UNION" || u=="IS" || u=="NULL" || u=="WHERE" ||
+ u=="BETWEEN" || u=="DISTINCT" || u=="TRY" || u=="IT" || u=="INSERT" || u=="ALIASES" || u=="CREATE" ||
+ u=="ALTER" || u=="TABLE" || u=="INDEX" || u=="ALL" || u=="HAVING")
+ {
+ invalidChar = newName;
+ newName += "_";
+ }
+
+ // check against geometry tables field names
+ string n = TeConvertToLowerCase(newName);
+
+ if (n == "x" || n == "y" || n == "object_id" ||
+ n == "geom_id" || n == "num_coords" ||
+ n == "lower_x" || n == "lower_y" ||
+ n == "upper_x" || n == "upper_y" ||
+ n == "ext_max" || n == "spatial_data" ||
+ n == "num_holes" || n == "parent_id" ||
+ n == "col_number" || n == "row_number" ||
+ n == "text_value" || n == "angle" ||
+ n == "height" || n == "alignment_vert" ||
+ n == "alignment_horiz" || n=="from_node" ||
+ n == "to_node")
+ {
+ invalidChar = newName;
+ newName += "_";
+ }
+
+ // reserved words
+ if( (n=="zone") || (n=="comp") || (n=="no") || (n=="local") ||
+ (n=="level") || (n=="long"))
+ {
+ invalidChar = newName;
+ newName += "_";
+ }
+
+ changed = true;
+ if(name == newName)
+ changed = false;
+
+ return newName;
+}
diff --git a/src/terralib/kernel/TeUtils.h b/src/terralib/kernel/TeUtils.h
new file mode 100644
index 0000000..88fd44e
--- /dev/null
+++ b/src/terralib/kernel/TeUtils.h
@@ -0,0 +1,169 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeUtils.h
+ This file contains some utility functions
+*/
+#ifndef __TERRALIB_INTERNAL_UTILS_H
+#define __TERRALIB_INTERNAL_UTILS_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include <string>
+#include <vector>
+#include <cstdio>
+#include <time.h>
+
+
+#include "TeCoord2D.h"
+#include "TeProgress.h"
+
+using namespace std;
+
+/** @defgroup FileFunctions Functions to manipulate file
+ * @{
+ */
+ //! Get the extension part (right to the dot) of a string
+ string TeGetExtension ( const char* value );
+
+ //! Get the name part (left to the dot) of a string, path included
+ string TeGetName ( const char* value );
+
+ //! Get the base name part of a string, strip path information
+ string TeGetBaseName ( const char* value );
+
+ //! Get the path part of a file name
+ string TeGetPath(const char* value);
+
+ //! This function writes a string to a file.
+ /*
+ \params fileName the file name to write to, including the directory.
+ \params text the string with the text to write to.
+ \params mode the mode used to write to the file (a | w | r).
+ */
+ void TeWriteToFile(const string& fileName, const string& text, const string& mode);
+
+/** @} */
+
+/** @defgroup C2StringFunctions Functions convert numbers to strings
+ * @{
+ */
+ //! Transforms an integer to string
+ string Te2String ( const int value );
+
+ //! Transforms an unsigned integer to string
+ string Te2String ( const unsigned int value );
+
+ //! Transforms a long to string
+ string Te2String ( const long value );
+
+ //! Transforms an unsigned long to string
+ string Te2String ( const unsigned long value );
+
+ //! Transforms a double to string
+ string Te2String ( const double value, int precision=0 );
+/** @} */
+
+/** @defgroup StringFunctions Functions to manipulate strings
+ * @{
+ */
+ //! Converts a string to upper case
+ void TeConvertToUpperCase ( const string& , char* );
+
+ //! Converts a string to upper case
+ string TeConvertToUpperCase (const string &name);
+
+ //! Converts a string to lower case
+ string TeConvertToLowerCase (const string &name);
+
+ //! Removes special characteres from a string
+ string TeRemoveSpecialChars ( string& str);
+
+ //! Removes left and right blank, \t, \n characters of a string
+ void TeTrim(string &str);
+
+ //! Splits a string, given a separator, in a vector of parts
+ int TeSplitString(const string& input, const string& delimiter, vector<string>& results);
+
+ //! Compares two strings
+ /*
+ \params caseS flag indicating if it is a case sensitive comparation
+ */
+ bool TeStringCompare(const string& str1, const string& str2, bool caseS=false);
+/** @} */
+
+/** @defgroup MathFunctions Mathematical functions
+ * @{
+ */
+ //! Rounds a double to int
+ inline int TeRound(double val)
+ {
+ if (val>=0)
+ return (int)(val+.5);
+ else
+ return (int)(val-.5);
+ }
+
+ //! Rounds a double value to a given number of decimal digits
+ double TeRoundD(double val, int precision=8);
+
+ //! Compares two doubles
+ bool TeCompareDouble(double a, double b, int precision);
+
+ //! Adjust a number to a given precision
+ /*
+ \param val the number to be adjusted
+ \param precision the number of decimals places to be used
+ \param reduce flag to indicate that the number should be reduced instead to increased
+ \return the adjusted number
+ */
+ double TeAdjustToPrecision(double val, int precision, bool reduce=false);
+
+ //! Rounds a double raster element index to an integer
+ /*
+ Raster elements have area, so raster element in upper-left position has
+ index from [-0.5,+0.5) in i and j dimension.
+ */
+ inline int TeRoundRasterIndex(double val)
+ {
+ int ind = (int) val;
+ if (val < (ind-0.5))
+ ind -= 1;
+ else if (val >= (ind+0.5))
+ ind += 1;
+ return ind;
+ }
+
+ //! Check column name and change if necessary
+ /*
+ Raster elements have area, so raster element in upper-left position has
+ index from [-0.5,+0.5) in i and j dimension.
+ */
+ string TeCheckName(const string& name, bool& changed, string& invalidChar);
+/** @} */
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeVectorRemap.cpp b/src/terralib/kernel/TeVectorRemap.cpp
new file mode 100644
index 0000000..d09e38c
--- /dev/null
+++ b/src/terralib/kernel/TeVectorRemap.cpp
@@ -0,0 +1,95 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeVectorRemap.h"
+
+TeBox TeRemapBox ( TeBox& box, TeProjection* projFrom, TeProjection* projTo)
+{
+ if (projFrom == 0 || projTo == 0)
+ return box;
+
+ if (*projFrom == *projTo)
+ return box;
+
+ if (projFrom->datum().name() != projTo->datum().name())
+ {
+ projFrom->setDestinationProjection(projTo);
+ projTo->setDestinationProjection(projFrom);
+ }
+
+ TeCoord2D pll = box.lowerLeft (),
+ pur = box.upperRight (),
+ pul (pll.x(),pur.y()),
+ plr (pur.x(),pll.y());
+
+// Evaluate coordinates of box corners in Lat/Long
+
+ pll = projFrom->PC2LL (pll);
+ pur = projFrom->PC2LL (pur);
+ pul = projFrom->PC2LL (pul);
+ plr = projFrom->PC2LL (plr);
+
+// Bring coordinates of box corners to target projection
+
+ pll = projTo->LL2PC (pll);
+ pur = projTo->LL2PC (pur);
+ pul = projTo->LL2PC (pul);
+ plr = projTo->LL2PC (plr);
+
+// Evaluate the minimum box that includes all four corners
+
+ return TeBox ( std::min(pll.x(),pul.x()),
+ std::min(pll.y(),plr.y()),
+ std::max(pur.x(),plr.x()),
+ std::max(pul.y(),pur.y()));
+}
+
+void
+TeVectorRemap(TeCoord2D& c1, TeProjection* p1, TeCoord2D& c2, TeProjection* p2)
+{
+ p1->setDestinationProjection(p2);
+ TeCoord2D ll = p1->PC2LL(c1);
+ c2 = p2->LL2PC(ll);
+}
+
+void
+TeVectorRemap(TeText& t1, TeProjection* p1, TeText& t2, TeProjection* p2)
+{
+ p1->setDestinationProjection(p2);
+ t2 = t1;
+ TeCoord2D nl = p1->PC2LL(t1.location());
+ TeCoord2D p = p2->LL2PC(nl);
+ t2.setLocation(p);
+}
+
+void TeVectorRemap(TeCell& c1, TeProjection* p1, TeCell& c2, TeProjection* p2)
+{
+ c2 = c1;
+ TeBox nb = TeRemapBox(c1.box(),p1,p2);
+ c2.setBox(nb);
+}
+
diff --git a/src/terralib/kernel/TeVectorRemap.h b/src/terralib/kernel/TeVectorRemap.h
new file mode 100644
index 0000000..d4515ca
--- /dev/null
+++ b/src/terralib/kernel/TeVectorRemap.h
@@ -0,0 +1,52 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#ifndef __TERRALIB_INTERNAL_VECTORREMAP_H
+#define __TERRALIB_INTERNAL_VECTORREMAP_H
+
+#include "TeProjection.h"
+#include "TeGeometry.h"
+
+//! Remaps a geometry from projection p1 to projection p2
+template<typename G>
+void
+TeVectorRemap (G& g1, TeProjection* p1, G& g2, TeProjection* p2)
+{
+ int nItens = g1.size();
+ for (int i=0; i<nItens; i++)
+ {
+ typename G::value_type e1 = g1[i];
+ typename G::value_type e2;
+ TeVectorRemap(e1,p1,e2,p2);
+ g2.add(e2);
+ }
+}
+
+void TeVectorRemap(TeCoord2D& pt1, TeProjection* p1, TeCoord2D& pt2, TeProjection* p2);
+
+void TeVectorRemap(TeCell& c1, TeProjection* p1, TeCell& c2, TeProjection* p2);
+
+void TeVectorRemap(TeText& t1, TeProjection* p1, TeText& t2, TeProjection* p2);
+
+TeBox TeRemapBox (TeBox& box, TeProjection* projFrom, TeProjection* projTo);
+
+#endif
diff --git a/src/terralib/kernel/TeView.h b/src/terralib/kernel/TeView.h
new file mode 100644
index 0000000..f623809
--- /dev/null
+++ b/src/terralib/kernel/TeView.h
@@ -0,0 +1,189 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeView.h
+ This file provides TerraLib's definition of a View
+*/
+#ifndef __TERRALIB_INTERNAL_VIEW_H
+#define __TERRALIB_INTERNAL_VIEW_H
+
+#include "TeLayer.h"
+#include "TeTheme.h"
+#include <algorithm>
+
+using namespace std;
+
+//! A class to deal with views in TerraLib
+/*!
+ A view in TerraLib has its own projections and may belong to a particular user
+ \sa TeTheme TeViewNode
+*/
+class TeView {
+
+public:
+
+ //! Constructor
+ TeView( const string& name="", const string& user="", int id=0)
+ : id_(id), name_(name), user_(user), proj_(0), is_visible_(true), connectedId_(0)
+ {}
+
+ //! Destructor
+ ~TeView () {}
+
+ //! Returns view unique id
+ int id () { return id_; }
+
+ //! Sets view unique id
+ void id (int id)
+ {
+ id_ = id; // update view id
+ for (unsigned int th=0;th<viewTree_.size();th++) //update its themes
+ viewTree_.retrieve(th)->view (id_);
+ }
+
+ //! Returns the view name
+ string name () { return name_; }
+
+ //! Sets the view name
+ void name (const string& s) { name_ = s; }
+
+ //! Returns the view user name
+ string user () { return user_; }
+
+ //! Sets the view user name
+ void user (const string& i) { user_ = i; }
+
+ //! Returns the view projection
+ TeProjection* projection () { return proj_; }
+
+ //! Sets the view projection
+ void projection (TeProjection* p) { proj_ = p; }
+
+ //! Returns TRUE if view is visible
+ bool isVisible () { return is_visible_; }
+
+ //! Sets whether view is visible
+ void isVisible (bool v) { is_visible_ = v; }
+
+ //! Returns the view tree where view belongs
+ TeViewTree* root () { return &viewTree_; }
+
+ //! Adds a view node to the view tree
+ void add( TeViewNode* node )
+ {
+ node->view (id_);
+ viewTree_.add ( node );
+ }
+
+ //! Removes a view node through its name from the view tree
+ TeViewNode* remove(string name)
+ {
+ return viewTree_.remove(name);
+ }
+
+ //! Removes a view node through its identifier from the view tree
+ TeViewNode* remove (int id)
+ {
+ return viewTree_.removeID(id);
+ }
+
+ //! Moves a node up
+ void moveUp (TeViewNode* node)
+ {
+ viewTree_.moveUp(node);
+ }
+
+ //! Moves a node down
+ void moveDown(TeViewNode* node)
+ {
+ viewTree_.moveDown(node);
+ }
+
+ //! Returns a node identified by its position
+ TeViewNode* get(int i)
+ {
+ return viewTree_.retrieve(i);
+ }
+
+ //! Returns a node identified by its name and version
+ TeTheme* get(string themeName)
+ {
+ TeTheme *ret = 0;
+ for (unsigned int th = 0;th < viewTree_.size();th++)
+ {
+ TeViewNode *node = viewTree_.retrieve(th);
+ if (node->type() == TeTHEME)
+ {
+ TeTheme *tmp = (TeTheme*)node;
+ if (tmp->name() == themeName)
+ {
+ ret = tmp;
+ break;
+ }
+ }
+ }
+ return ret;
+ }
+
+ //! Sort the themes in the view
+ void sort()
+ { viewTree_.sort(); }
+
+ //! Swap the order of two themes
+ void swap( unsigned int i, unsigned int j)
+ {
+ viewTree_.swap(i,j);
+ }
+
+ //! Returns the number of themes in the view
+ unsigned int size()
+ { return viewTree_.size() ; }
+
+ //! Returns the vector of themes of the view sorted
+ //! according to their priorities
+ vector<TeViewNode*>& themes()
+ { return viewTree_.nodes();}
+
+ void connectedId(int id) {connectedId_ = id;}
+
+ int connectedId() {return connectedId_;}
+
+
+private:
+ int id_; // view id
+ string name_; // view name
+ string user_; // user id
+ TeProjection* proj_;
+ bool is_visible_;
+
+ TeViewTree viewTree_;
+ int connectedId_; // connected view
+};
+
+//! A map from identifiers to pointers to views
+typedef map<int,TeView*> TeViewMap;
+
+#endif
+
+
+
diff --git a/src/terralib/kernel/TeViewNode.h b/src/terralib/kernel/TeViewNode.h
new file mode 100644
index 0000000..752f368
--- /dev/null
+++ b/src/terralib/kernel/TeViewNode.h
@@ -0,0 +1,337 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeViewNode.h
+ This file provides TerraLib's tree structure of views
+*/
+#ifndef __TERRALIB_INTERNAL_VIEWNODE_H
+#define __TERRALIB_INTERNAL_VIEWNODE_H
+
+#define THEME_GROUP
+
+#include <iostream>
+#include <string>
+#include <vector>
+using namespace std;
+
+//! Type of node
+enum TeViewNodeType
+{ TeTHEME, TeTREE };
+
+//! A class to deal with nodes of a view tree structure
+class TeViewNode
+{
+public:
+ //! Constructor
+ TeViewNode( const string& name, TeViewNode* parent = 0, int view=0, int id=0, TeViewNodeType type= TeTHEME)
+ : myParent_(parent),
+ id_(id),
+ name_(name),
+ view_(view),
+ type_(type),
+ priority_(0)
+ {}
+
+ //! Destructor
+ virtual ~TeViewNode()
+ {}
+
+ //! Inserts a new child in the tree hierachy. Fails if the object is a leaf
+ virtual void add (TeViewNode*) {}
+
+
+ //! Remove an existing child identified by its id from the tree hierarchy
+ /*!
+ Fails if the object is a leaf
+ Should be used in conjunction with a delete
+ */
+ virtual TeViewNode* removeID (int /* id */) { return 0; }
+
+ //! Remove an existing child identified by its name from the tree hierarchy
+ /*!
+ Fails if the object is a leaf
+ Should be used in conjunction with a delete
+ */
+ virtual TeViewNode* remove (const string& /*name*/) { return 0; }
+
+ //! Retrieve a node identified by its identifier from the tree structure
+ virtual TeViewNode* retrieve (int) { return 0; }
+
+ //! Returns a pointer to a parent node
+ TeViewNode* parent()
+ { return myParent_; }
+
+ //! Returns the identifier of a node parent
+ int parentId()
+ {
+ if (myParent_)
+ return myParent_->id();
+ else
+ return 0;
+ }
+
+ //! Sets the identification of the parent node
+ void parentId(int i)
+ {
+ if (myParent_)
+ myParent_->id(i);
+ }
+
+ //! Sets the parent of node
+ void setParent ( TeViewNode* node )
+ { myParent_ = node; }
+
+ //! Returns the identification of a node
+ int id () { return id_; }
+ //! Sets the identification of a node
+ void id (int i){ id_ = i; }
+
+ //! Returns the name of a node
+ string name () { return name_; }
+ //! Sets the name of a node
+ void name (const string& s) { name_ = s; }
+
+ //! Returns the priority of a node
+ int priority () { return priority_; }
+ //! Sets the priority of a node
+ void priority (int i) { priority_ = i; }
+
+ //! Sets the view identification of a node
+ void view (int view) { view_ = view; }
+ //! Returns the view identification of a node
+ int view () { return view_ ; }
+
+ //! Returns the node type
+ TeViewNodeType type() { return type_; };
+ //! Sets the node type
+ void type(TeViewNodeType t) { type_ = t; }
+
+ //! Moves a node up in the tree structure
+ virtual void moveUp ()
+ {
+ if (myParent_)
+ myParent_->moveUp (this);
+ }
+
+ //! Moves a node down in the tree structure
+ virtual void moveDown ()
+ {
+ if (myParent_)
+ myParent_->moveDown (this);
+ }
+
+ //! Swaps nodes
+ virtual void swap ( unsigned int, unsigned int ) {}
+
+ //! Draws a node
+ virtual void draw() {}
+
+
+protected:
+
+ virtual void moveUp (TeViewNode*) {}
+ virtual void moveDown (TeViewNode*) {}
+
+ TeViewNode* myParent_;
+ int id_; // Node id
+ string name_; // Node name
+ int view_; // view id
+
+ TeViewNodeType type_;
+
+// Precedence when stored in a view
+ int priority_;
+};
+
+
+//! A class to deal with branchs in a view tree structure
+class TeViewTree: public TeViewNode
+{
+public:
+
+ //! Constructor
+ TeViewTree(const string& name=""): TeViewNode(name)
+ {
+ type_ = TeTREE;
+ }
+
+ //! Destructor
+ ~TeViewTree ()
+ {
+ // For all my children, delete them
+ vector<TeViewNode*>::iterator child = nodes_.begin();
+ unsigned int size = nodes_.size();
+ for (unsigned int n=0; n<size; n++ )
+ {
+ // Create a temporary pointer to store the child's
+ // address
+ TeViewNode* pt = (*child);
+ // Remove the child from the list
+
+ nodes_.erase(child);
+
+ // Ok, now the child's parent points to NULL and we can
+ // safely call the child's destructor
+ delete pt;
+ }
+ }
+
+ //! Swap nodes
+ virtual void swap (unsigned int i, unsigned int j)
+ {
+ if (i==j || i>=nodes_.size() || j>=nodes_.size())
+ return;
+ TeViewNode* temp = nodes_[i];
+ nodes_[i] = nodes_[j];
+ nodes_[j] = temp;
+ nodes_[i]->priority (i);
+ nodes_[j]->priority (j);
+ }
+
+ //! Moves a node up in the tree structure
+ virtual void moveUp (TeViewNode* node)
+ {
+ for (unsigned int i=0 ; i<nodes_.size() ; i++)
+ {
+ if (node == nodes_[i])
+ {
+ swap (i, i-1);
+ return;
+ }
+ }
+ }
+
+ //! Moves a node down in the tree structure
+ virtual void moveDown (TeViewNode* node)
+ {
+ for (unsigned int i=0 ; i<nodes_.size() ; i++)
+ {
+ if (node == nodes_[i])
+ {
+ swap (i, i+1);
+ return;
+ }
+ }
+ }
+
+ //! Adds a node to the structure
+ virtual void add (TeViewNode* node)
+ {
+ node->setParent ( this ); // I am the father
+ node->priority(static_cast<int>(nodes_.size()));
+ nodes_.push_back (node);
+ }
+
+ //! Removes a node identified by its name
+ virtual TeViewNode* remove (const string& name)
+ {
+ vector<TeViewNode*>::iterator child = nodes_.begin();
+ while ( child != nodes_.end() )
+ {
+ TeViewNode* pt = (*child);
+ if (pt->name() == name)
+ {
+ nodes_.erase(child);
+ return pt;
+ }
+ if(pt->type() == TeTREE)
+ {
+ TeViewNode* result = pt->remove(name);
+ if(result) return result;
+ }
+ ++child;
+ }
+ return 0;
+ }
+
+ //! Removes a node through its identifier
+ virtual TeViewNode* removeID (int id)
+ {
+ for (vector<TeViewNode*>::iterator child = nodes_.begin();
+ child != nodes_.end(); ++child)
+ {
+ TeViewNode* pt = (*child);
+ if(pt->id() == id)
+ {
+ nodes_.erase(child);
+ return pt;
+ }
+ if(pt->type() == TeTREE)
+ {
+ TeViewNode* result = pt->removeID(id);
+ if(result) return result;
+ }
+ }
+ return 0;
+ }
+
+ //! Retrieves a node through its index
+ virtual TeViewNode* retrieve (unsigned int i)
+ { return nodes_[i]; }
+
+ //! Draw a node
+ virtual void draw ()
+ {
+ vector<TeViewNode*>::iterator child = nodes_.begin();
+ while ( child != nodes_.end() )
+ {
+ TeViewNode* pt = (*child);
+ pt->draw();
+ child++;
+ }
+ }
+
+ //! Returns the size of the structure
+ unsigned int size()
+ { return nodes_.size(); }
+
+ //! Returns the vector of View nodes
+ vector<TeViewNode*>& nodes()
+ { return nodes_; }
+
+ //! Sort the vector of nodes according to their priorities
+ void sort()
+ {
+ unsigned int i, j;
+ for (i = 0; i < size() - 1; ++i)
+ {
+ for (j = i+1; j < size(); ++j)
+ {
+ if (nodes_[i]->priority() > nodes_[j]->priority())
+ {
+ TeViewNode* temp = nodes_[i];
+ nodes_[i] = nodes_[j];
+ nodes_[j] = temp;
+ }
+ }
+ }
+ }
+
+private:
+ vector<TeViewNode*> nodes_;
+};
+
+#endif
+
+
+
diff --git a/src/terralib/kernel/TeViewTreeIterator.cpp b/src/terralib/kernel/TeViewTreeIterator.cpp
new file mode 100644
index 0000000..c2b30f5
--- /dev/null
+++ b/src/terralib/kernel/TeViewTreeIterator.cpp
@@ -0,0 +1,140 @@
+/*
+** ---------------------------------------------------------------
+** TeViewTreeIterator.cpp -
+**
+*/
+
+/*
+** ---------------------------------------------------------------
+** Includes:
+*/
+
+#include "TeViewTreeIterator.h"
+
+
+/*
+** ---------------------------------------------------------------
+** Methods implementations:
+*/
+
+void TeViewTreeIterator::next()
+{
+ do
+ {
+ StackElem& elem = TravStack.top();
+ elem.ind++;
+
+ if(elem.ind >= (int)(elem.tree->size()))
+ {
+ if(TravStack.size() <= 1) break; // reached the end of the list
+
+ TravStack.pop();
+ continue;
+ }
+
+ TeViewNode* node = elem.tree->retrieve(elem.ind);
+// if(node->type() == TeTHEME) break; // reached a leaf
+ if(node->type() != TeTREE) break;
+
+ TravStack.push(StackElem((TeViewTree*)node, -1));
+ break;
+ }while(1);
+}
+
+
+void TeViewTreeRevIterator::next()
+{
+ do
+ {
+ StackElem& elem = TravStack.top();
+ elem.ind--;
+
+ if(elem.ind < 0)
+ {
+ if(TravStack.size() <= 1) break; // reached the end of the list
+
+ TravStack.pop();
+ continue;
+ }
+
+ TeViewNode* node = elem.tree->retrieve(elem.ind);
+// if(node->type() == TeTHEME) break; // reached a leaf
+ if(node->type() != TeTREE) break; // reached a leaf
+
+ TravStack.push(StackElem((TeViewTree*)node));
+ break;
+ }while(1);
+}
+
+/*!
+ Move to the next leaf on the tree.
+*/
+void TeViewTreeIterator::nextLeaf()
+{
+ do
+ {
+ StackElem& elem = TravStack.top();
+ elem.ind++;
+
+ if(elem.ind >= (int)(elem.tree->size()))
+ {
+ if(TravStack.size() <= 1) break; // reached the end of the list
+
+ TravStack.pop();
+ continue;
+ }
+
+ TeViewNode* node = elem.tree->retrieve(elem.ind);
+ //if(node->type() == TeTHEME) break; // reached a leaf
+ if(node->type() != TeTREE) break; // reached a leaf
+
+ TravStack.push(StackElem((TeViewTree*)node, -1));
+
+ }while(1);
+}
+
+/*!
+ Move to the next leaf on the tree.
+*/
+void TeViewTreeRevIterator::nextLeaf()
+{
+ do
+ {
+ StackElem& elem = TravStack.top();
+ elem.ind--;
+
+ if(elem.ind < 0)
+ {
+ if(TravStack.size() <= 1) break; // reached the end of the list
+
+ TravStack.pop();
+ continue;
+ }
+
+ TeViewNode* node = elem.tree->retrieve(elem.ind);
+// if(node->type() == TeTHEME) break; // reached a leaf
+ if(node->type() != TeTREE) break; // reached a leaf
+
+ TravStack.push(StackElem((TeViewTree*)node));
+
+ }while(1);
+}
+
+
+/*!
+ Move to the next node in the tree skipping the current
+ node children.
+*/
+void TeViewTreeIterator::skipChildren()
+{
+ StackElem& elem = TravStack.top();
+ if(elem.ind == -1) elem.ind = elem.tree->size();
+ next();
+}
+
+void TeViewTreeRevIterator::skipChildren()
+{
+ StackElem& elem = TravStack.top();
+ if(elem.ind == (int)(elem.tree->size())) elem.ind = -1;
+ next();
+}
diff --git a/src/terralib/kernel/TeViewTreeIterator.h b/src/terralib/kernel/TeViewTreeIterator.h
new file mode 100644
index 0000000..7dedd3b
--- /dev/null
+++ b/src/terralib/kernel/TeViewTreeIterator.h
@@ -0,0 +1,193 @@
+/* $Id: TeViewTreeIterator.h,v 1.2 2005/04/11 20:04:57 juan Exp $
+** ---------------------------------------------------------------
+** TeViewTreeIterator -
+**
+*/
+
+#ifndef TEVIEWTREEITERATOR_H
+#define TEVIEWTREEITERATOR_H
+
+/*
+** ---------------------------------------------------------------
+** Includes:
+*/
+
+// TerraLib includes
+#include "TeException.h"
+#include "TeViewNode.h"
+
+// STL includes
+#include <vector>
+#include <stack>
+
+/*
+** ---------------------------------------------------------------
+** Defines:
+*/
+
+/*
+ One stl module included by some TerraLib files define a macro named
+ next which conflicts whith the TeViewTreeInterator::next method. So
+ we choosed to undefine it.
+*/
+#undef next
+
+
+/*
+** ---------------------------------------------------------------
+** Class definition:
+*/
+
+class TeViewTreeIterator
+{
+public:
+ TeViewTreeIterator(TeViewTree* root);
+
+ void first();
+ void firstLeaf();
+ void next();
+ void nextLeaf();
+ void skipChildren(); //!< move to the next node skipping the current node childs
+
+// void Previous();
+
+ bool isDone();
+
+ TeViewNode* currentNode();
+ int currentDepth(); //!< Returns the depth of the current node. The root has depth is 0.
+
+protected:
+private:
+ struct StackElem{
+ StackElem(TeViewTree* tr, int i){ tree = tr; ind = i; }
+ TeViewTree* tree;
+ int ind; //!< index of the current child in the tree
+ };
+
+ std::stack<StackElem> TravStack; //!< traversal stack
+};
+
+class TeViewTreeRevIterator
+{
+public:
+ TeViewTreeRevIterator(TeViewTree* root);
+
+ void first();
+ void firstLeaf();
+ void next();
+ void nextLeaf();
+ void skipChildren(); //!< move to the next node skipping the current node childs
+
+// void Previous();
+
+ bool isDone();
+
+ TeViewNode* currentNode();
+ int currentDepth(); //!< Returns the depth of the current node. The root has depth is 0.
+
+protected:
+private:
+ struct StackElem{
+ StackElem(TeViewTree* tr, int i){ tree = tr; ind = i; }
+ StackElem(TeViewTree* tr){ tree = tr; ind = tr->size(); }
+ TeViewTree* tree;
+ int ind; //!< index of the current child in the tree
+ };
+
+ std::stack<StackElem> TravStack; // traversal stack
+};
+
+
+/*
+** ---------------------------------------------------------------
+** Inline methods:
+*/
+
+inline TeViewTreeIterator::TeViewTreeIterator(TeViewTree* root)
+{
+ TravStack.push(StackElem(root, -1));
+}
+
+inline TeViewTreeRevIterator::TeViewTreeRevIterator(TeViewTree* root)
+{
+ TravStack.push(StackElem(root));
+}
+
+inline void TeViewTreeIterator::first()
+{
+ while(TravStack.size() > 1)
+ TravStack.pop();
+ TravStack.top().ind = -1;
+}
+
+inline void TeViewTreeRevIterator::first()
+{
+ while(TravStack.size() > 1)
+ TravStack.pop();
+ TravStack.top().ind = TravStack.top().tree->size();
+}
+
+inline void TeViewTreeIterator::firstLeaf()
+{
+ first();
+ nextLeaf();
+}
+
+inline void TeViewTreeRevIterator::firstLeaf()
+{
+ first();
+ nextLeaf();
+}
+
+inline bool TeViewTreeIterator::isDone()
+{
+ if(TravStack.size() > 1) return false;
+
+ StackElem& elem = TravStack.top();
+ if(elem.ind < (int)(elem.tree->size())) return false;
+
+ return true;
+}
+
+inline bool TeViewTreeRevIterator::isDone()
+{
+ if(TravStack.size() > 1) return false;
+
+ StackElem& elem = TravStack.top();
+ if(elem.ind >= 0) return false;
+
+ return true;
+}
+
+inline TeViewNode* TeViewTreeIterator::currentNode()
+{
+ StackElem& elem = TravStack.top();
+ if(elem.ind == -1) return elem.tree;
+
+ return elem.tree->retrieve(elem.ind);
+}
+
+inline TeViewNode* TeViewTreeRevIterator::currentNode()
+{
+ StackElem& elem = TravStack.top();
+ if(elem.ind == (int)(elem.tree->size())) return elem.tree;
+
+ return elem.tree->retrieve(elem.ind);
+}
+
+inline int TeViewTreeIterator::currentDepth()
+{
+ return TravStack.size() - 1;
+}
+
+inline int TeViewTreeRevIterator::currentDepth()
+{
+ return TravStack.size() - 1;
+}
+
+
+#ifdef te__next_back__
+#define next te__next_back__
+#undef te__next_back__ // some stl module defines a macro named next that is generating conflics with
+#endif
+#endif
diff --git a/src/terralib/kernel/TeViewTreeUtils.cpp b/src/terralib/kernel/TeViewTreeUtils.cpp
new file mode 100644
index 0000000..69889ec
--- /dev/null
+++ b/src/terralib/kernel/TeViewTreeUtils.cpp
@@ -0,0 +1,104 @@
+/*
+** ---------------------------------------------------------------
+** teviewtreeutils.cpp - This module contains some functions to be
+** used with the TeViewTree class. These functions should probably be
+** methods of the own TeView class.
+**
+*/
+
+/*
+** ---------------------------------------------------------------
+** Includes:
+*/
+
+
+#include "TeViewTreeUtils.h"
+#include "TeViewTreeIterator.h"
+
+/*
+** ----------------------------------------------------------------------------
+** Constants:
+*/
+
+
+/*
+** ---------------------------------------------------------------
+** Internal Functions:
+*/
+
+/*
+** ---------------------------------------------------------------
+** Public Functions:
+*/
+
+
+void TeClearViewTree(TeViewTree* vtree)
+{
+ if(vtree==NULL) return;
+
+ while(vtree->size() > 0)
+ {
+ TeViewNode* node = vtree->removeID(vtree->size() - 1);
+
+ if(node == NULL) continue;
+
+ if(node->type() == TeTREE)
+ TeClearViewTree((TeViewTree*)node);
+ delete node;
+ }
+}
+
+/*!
+ \brief Look at a View Tree for a theme with the given name.
+
+ This function creates a simple theme with the given parameters.
+ A simple theme is a non thematic theme without any associated
+ where clause and with only one attribute table associated to it.
+ It is assumed that, given the feature (layer) name,
+ its the attributes table is named name_attr while the geometries
+ tables are called namePontos, nameLinhas and namePoligonos for
+ respectively the Points geometry table, Lines geometry table and
+ Poligons geometry table.
+
+ \param vtree theme name and also name of the theme associated feature(layer)
+ \param name name of the theme to be found
+ \param case_sensitive(optional) name of the key field of the associated
+ attribute table. If no key is given it is
+ assumed that the key name is object_id.
+*/
+TeTheme* TeFindTheme(TeViewTree& vtree, char* name, bool case_sensitive)
+{
+ TeTheme* theme = NULL;
+ TeViewTreeIterator it(&vtree);
+
+ for(it.firstLeaf();!(it.isDone());it.nextLeaf())
+ {
+ TeViewNode* node = it.currentNode();
+ int ret; // return value of the string comparation functions
+
+ if(node->type() != TeTHEME)
+ continue;
+
+ if(case_sensitive)
+ ret = strcmp(name, node->name().c_str());
+ else
+ {
+// ret = stricmp(name, node->name().c_str()); // do not work for Linux
+ string s1 = TeConvertToLowerCase(string(name));
+ string s2 = TeConvertToLowerCase(node->name());
+ if (s1 == s2)
+ ret = 0;
+ else
+ ret = -1;
+ }
+
+ if(ret == 0)
+ {
+ theme = (TeTheme*)node;
+ break;
+ }
+
+ }
+
+ return theme;
+}
diff --git a/src/terralib/kernel/TeViewTreeUtils.h b/src/terralib/kernel/TeViewTreeUtils.h
new file mode 100644
index 0000000..04ec379
--- /dev/null
+++ b/src/terralib/kernel/TeViewTreeUtils.h
@@ -0,0 +1,39 @@
+/*
+** ---------------------------------------------------------------
+** teviewtreeutils.h:
+**
+*/
+
+
+#ifndef TEVIEWTREEUTILS_H_
+#define TEVIEWTREEUTILS_H_
+
+/*
+** ---------------------------------------------------------------
+** Includes:
+*/
+
+#include "TeViewNode.h"
+#include "TeTheme.h"
+
+
+/*
+** ---------------------------------------------------------------
+** Functions Prototypes:
+*/
+
+void TeClearViewTree(TeViewTree* vtree);
+TeTheme* TeFindTheme(TeViewTree& vtree, char* name, bool case_sensitive = false);
+
+/*
+** ---------------------------------------------------------------
+** Inline Functions:
+*/
+
+
+/*
+** ---------------------------------------------------------------
+** End:
+*/
+
+#endif
diff --git a/src/terralib/kernel/TeVisual.h b/src/terralib/kernel/TeVisual.h
new file mode 100644
index 0000000..941c906
--- /dev/null
+++ b/src/terralib/kernel/TeVisual.h
@@ -0,0 +1,429 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeVisual.h
+ This file deals with the visual presentation characteristics of geometries in TerraLib
+*/
+#ifndef __TERRALIB_INTERNAL_VISUAL_H
+#define __TERRALIB_INTERNAL_VISUAL_H
+#include "TeDataTypes.h"
+
+class TeRasterTransform;
+
+#include <string>
+#include <map>
+
+using namespace std;
+
+//! Supports a color definition
+struct TeColor
+{
+ //! Red component
+ int red_;
+
+ //! Green component
+ int green_;
+
+ //! Blue component
+ int blue_;
+
+ //! Color name
+ string name_;
+
+ //! Empty constructor
+ TeColor () : red_(0),green_(0),blue_(0), name_("") {}
+
+ //! Constructor with parameters
+ TeColor (int r, int g, int b, const string& name="") : red_(r),green_(g),blue_(b), name_(name) {}
+
+ //! Set parameters of colors
+ void init (int r, int g, int b, const string& name="") {red_=r,green_=g,blue_=b;name_=name; }
+
+
+ //! Returns TRUE if color1 is equal to color2 or FALSE if they are different.
+ bool operator== (const TeColor& color)
+ {
+ if(red_==color.red_ && green_==color.green_ && blue_==color.blue_)
+ return true;
+ return false;
+ }
+
+ //! Assignment operator
+ TeColor& operator= ( const TeColor& color )
+ {
+ if ( this != &color )
+ {
+ red_ = color.red_;
+ green_ = color.green_;
+ blue_ = color.blue_;
+ name_ = color.name_;
+ }
+ return *this;
+ }
+};
+
+
+//! This class is used to store the presentation characteristics of vector geometries
+class TeVisual
+{
+private :
+
+ string libName_; //! Symbol library name used to geometry filling
+ int symbId_; //! Symbol id that define the style for the geometry filling
+ TeColor color_; //! Color used for geometry filling (line, point and text color)
+ int transparency_; //! Percentage of transparency for the geometry filling
+ int width_; //! Width for line geometry
+
+ string contourLibName_; //! Symbol library name used to geometry outline
+ int contourSymbId_; //! Symbol id that define the style for the geometry outline
+ TeColor contourColor_; //! Contour color for the geometry outline
+ int contourTransparency_; //! Percentage of transparency for the geometry outline
+ int contourWidth_; //! Width for the geometry outline
+
+ int sizeValue_;
+ int ptAngle_;
+
+ // Text attributes
+ string family_; //! Text family
+ bool bold_; //! Flag to indicate if text is bold
+ bool italic_; //! Flag to indicate if text is italic
+ double alignmentVert_; //! Position of vertical alignment
+ double alignmentHoriz_; //! Position of horizontal alignmentool fixedSize_; //! Flag to indicate that element has a fixed size, don�t follow zoom operations
+ int tabSize_; //! Number of spaces defined in a tab character
+ int lineSpace_; //! Spacing between lines
+ bool fixedSize_;
+
+ char* pixmap_;
+
+public :
+
+ //! Empty constructor
+ TeVisual(TeGeomRep rep = TePOLYGONS) :
+ libName_ (""),
+ symbId_ (TePolyTypeFill),
+ color_ (255,0,0),
+ transparency_ (0),
+ width_ (0),
+ contourLibName_ (""),
+ contourSymbId_ (TeLnTypeContinuous),
+ contourColor_(0,255,255),
+ contourTransparency_ (0),
+ contourWidth_ (1),
+ sizeValue_ (0),
+ ptAngle_ (0),
+ family_ ("Verdana"),
+ bold_ (false),
+ italic_(false),
+ alignmentVert_(0),
+ alignmentHoriz_(0),
+ tabSize_(6),
+ lineSpace_(1),
+ fixedSize_(false),
+ pixmap_(0)
+ {
+ switch (rep)
+ {
+ case TePOLYGONS:
+ case TeCELLS:
+ symbId_= TePolyTypeFill;
+ contourSymbId_= TeLnTypeContinuous;
+ break;
+ case TeLINES:
+ symbId_= TeLnTypeContinuous;
+ width_ = 1;
+ break;
+ case TePOINTS:
+ case TeNODES:
+ symbId_= TePtTypeBox;
+ sizeValue_ = 3;
+ break;
+ case TeTEXT:
+ sizeValue_= 12;
+ break;
+ default:
+ break;
+ }
+ }
+
+ //! Destructor
+ ~TeVisual ()
+ { if (pixmap_) delete pixmap_; }
+
+ //! Copy constructor
+ TeVisual& operator=(const TeVisual& vis)
+ {
+ if ( this == &vis )
+ return *this;
+ else
+ {
+ libName_ = vis.libName_;
+ symbId_ = vis.symbId_;
+ color_ = vis.color_;
+ transparency_ = vis.transparency_;
+ width_ = vis.width_;
+
+ contourLibName_ = vis.contourLibName_;
+ contourSymbId_ = vis.contourSymbId_;
+ contourColor_ = vis.contourColor_;
+ contourTransparency_ = vis.contourTransparency_;
+ contourWidth_ = vis.contourWidth_;
+
+ sizeValue_ = vis.sizeValue_;
+ ptAngle_ = vis.ptAngle_;
+
+ family_ = vis.family_;
+ bold_ = vis.bold_;
+ italic_ = vis.italic_;
+ fixedSize_ = vis.fixedSize_;
+ alignmentVert_ = vis.alignmentVert_;
+ alignmentHoriz_ = vis.alignmentHoriz_;
+ tabSize_ = vis.tabSize_;
+ lineSpace_ = vis.lineSpace_;
+ pixmap_ = vis.pixmap_;
+ }
+ return *this;
+ }
+
+ //! Returns TRUE if vis1 is equal to vis2 or FALSE if they are different.
+ bool operator== (const TeVisual& vis)
+ {
+ if( libName_ == vis.libName_ &&
+ symbId_ == vis.symbId_ &&
+ color_ == vis.color_ &&
+ transparency_ == vis.transparency_ &&
+ width_ == vis.width_ &&
+ contourLibName_ == vis.contourLibName_ &&
+ contourSymbId_ == vis.contourSymbId_ &&
+ contourColor_ == vis.contourColor_ &&
+ contourTransparency_ == vis.contourTransparency_ &&
+ contourWidth_ == vis.contourWidth_ &&
+ sizeValue_ == vis.sizeValue_ &&
+ ptAngle_ == vis.ptAngle_ &&
+ family_ == vis.family_ &&
+ bold_ == vis.bold_ &&
+ italic_ == vis.italic_ &&
+ fixedSize_ == vis.fixedSize_ &&
+ alignmentVert_ == vis.alignmentVert_ &&
+ alignmentHoriz_ == vis.alignmentHoriz_ &&
+ tabSize_ == vis.tabSize_ &&
+ lineSpace_ == vis.lineSpace_ &&
+ pixmap_ == vis.pixmap_)
+ return true;
+ return false;
+ }
+
+ //! Copies visual parameters from another visual
+ void setBasic (TeVisual &vis)
+ {
+ libName_ = vis.libName_;
+ symbId_ = vis.symbId_;
+ color_ = vis.color_;
+ transparency_ = vis.transparency_;
+ width_ = vis.width_;
+
+ contourLibName_ = vis.contourLibName_;
+ contourSymbId_ = vis.contourSymbId_;
+ contourColor_ = vis.contourColor_;
+ contourTransparency_ = vis.contourTransparency_;
+ contourWidth_ = vis.contourWidth_;
+
+ sizeValue_ = vis.sizeValue_;
+ ptAngle_ = vis.ptAngle_;
+
+ family_ = vis.family_;
+ bold_ = vis.bold_;
+ italic_ = vis.italic_;
+ fixedSize_ = vis.fixedSize_;
+ alignmentVert_ = vis.alignmentVert_;
+ alignmentHoriz_ = vis.alignmentHoriz_;
+ tabSize_ = vis.tabSize_;
+ lineSpace_ = vis.lineSpace_;
+ pixmap_ = vis.pixmap_;
+ }
+
+ //! Sets the color used for geometry filling and line, point and text color
+ void color(TeColor& color)
+ { color_ = color;}
+
+ //! Returns the color used for geometry filling and line, point and text color
+ TeColor& color()
+ { return color_; }
+
+ //! Sets symbol library name used for filling
+ void libName (const string& name) { libName_ = name; }
+
+ //! Returns symbol library name used for filling
+ string libName () { return libName_; }
+
+ //! Sets symbol library name used for contour
+ void contourLibName (const string& name) { contourLibName_ = name; }
+
+ //! Returns symbol library name used for contour
+ string contourLibName () { return contourLibName_; }
+
+ //! Sets the style for the filling of geometries
+ void style(int s) { symbId_ = s; }
+
+ //! Returns the style for the filling of geometries
+ int style() { return symbId_; }
+
+ //! Sets the percentage of transparency for polygons and cells
+ void transparency(int t)
+ { transparency_ = t; }
+
+ //! Returns the percentage of transparency used in polygons and cells
+ int transparency()
+ { return transparency_; }
+
+ //! Sets the color for the polygons and cells outlines
+ void contourColor(TeColor& color)
+ { contourColor_ = color;}
+
+ //! Returns the color used in the polygons and cells outlines
+ TeColor& contourColor()
+ { return contourColor_; }
+
+ //! Sets the percentage of transparency for the polygon ans cells outlines
+ void contourTransparency(int t)
+ { contourTransparency_ = t;}
+
+ //! Returns the color used in the polygons and cells outlines
+ int contourTransparency()
+ { return contourTransparency_; }
+
+ //! Sets the contour width for the polygons and cells outlines
+ void contourWidth(int w) { contourWidth_ = w; }
+
+ //! Returns the contour width used in the polygons and cells outlines
+ int contourWidth() { return contourWidth_; }
+
+ //! Sets the contour style for the polygons and cells outlines
+ void contourStyle(int s) { contourSymbId_ = s; }
+
+ //! Returns the contour style used in the polygons and cells outlines
+ int contourStyle() { return contourSymbId_; }
+
+ //! Sets the width
+ void width(int w) { width_ = w; }
+
+ //! Returns the width
+ int width () { return width_; }
+
+ //! Sets the point size
+ void size (int s) { sizeValue_ = s; }
+
+ //! Returns the point size
+ int size () { return sizeValue_; }
+
+ //! Sets the text family for fonts
+ void family (string f) { family_ = f; }
+
+ //! Returns font�s family
+ string family () { return family_ ; }
+
+ //! Sets the bold style for texts
+ void bold (bool b) { bold_ = b; }
+
+ //! Returns the bold style used in the texts
+ bool bold () { return bold_; }
+
+ //! Sets the italic style for texts
+ void italic (bool i) { italic_ = i; }
+
+ //! Returns the italic style used in the texts
+ bool italic () { return italic_; }
+
+ //! Sets a flag indicating if the text will have a fixed size
+ void fixedSize (bool i) { fixedSize_ = i; }
+
+ //! Retuns a flag indicating if an text have a fixed size
+ bool fixedSize () { return fixedSize_; }
+
+ //! Sets the vertical alignment of texts
+ void alignmentVert(double a) { alignmentVert_ = a; }
+
+ //! Retuns the vertical alignment of texts
+ double alignmentVert() { return alignmentVert_; }
+
+ //! Sets the horizontal alignment of texts
+ void alignmentHoriz(double a) { alignmentHoriz_ = a; }
+
+ //! Retuns the horizontal alignment of texts
+ double alignmentHoriz() { return alignmentHoriz_; }
+
+ //! Sets the number of spaces defined in a tab character
+ void tabSize (int s) { tabSize_ = s; }
+
+ //! Returns the number of spaces defined in a tab character
+ int tabSize () { return tabSize_; }
+
+ //! Sets the spacing between lines
+ void lineSpace (int s) { lineSpace_ = s; }
+
+ //! Returns the spacing between lines
+ int lineSpace () { return lineSpace_; }
+
+ //! Returns the angle of points and symbols
+ int ptAngle() {return ptAngle_; }
+
+ //! Sets the angle of points and symbols
+ void ptAngle(int p) {ptAngle_ = p;}
+
+ //! Returns pixmap used in the visual
+ char* pixmap () { return pixmap_; }
+
+ //! Sets the pixmap used in the visual
+ void setPixmap( char* pix ) { pixmap_ = pix; }
+
+};
+
+typedef TeRasterTransform TeRasterVisual;
+
+/*
+//! This class is used to store the presentation characteristics of raster geometries
+class TeRasterVisual
+{
+public:
+
+ //! Constructor
+ TeRasterVisual():
+ mBand_(0),
+ gain_(1.),
+ offset_(0)
+ {}
+
+ int mBand_;
+
+ double gain_;
+ double offset_;
+
+ map<int,int> bandMap;
+
+ vector<unsigned char> lutr_;
+ vector<unsigned char> lutg_;
+ vector<unsigned char> lutb_;
+};
+*/
+
+#endif
+
diff --git a/src/terralib/kernel/checkvec.h b/src/terralib/kernel/checkvec.h
new file mode 100644
index 0000000..8e1d613
--- /dev/null
+++ b/src/terralib/kernel/checkvec.h
@@ -0,0 +1,70 @@
+/************************************************************************************
+ TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+// include/checkvec : vector class with checked limits
+#ifndef CHECKVEC_H
+#define CHECKVEC_H
+#include<cassert>
+#include<vector>
+
+namespace br_stl {
+
+template<class T>
+class checkedVector : public std::vector<T> { // inherit
+ public:
+ // inherited types
+ typedef typename checkedVector::size_type size_type;
+ typedef typename checkedVector::iterator iterator;
+ typedef typename checkedVector::difference_type difference_type;
+ typedef typename checkedVector::reference reference;
+ typedef typename checkedVector::const_reference const_reference;
+
+ checkedVector() {
+ }
+
+ checkedVector(size_type n, const T& value = T())
+ : std::vector<T>(n, value) {
+ }
+
+// checkedVector(iterator i, iterator j)
+// : std::vector<T>(i, j) {}
+
+ reference operator[](difference_type index) {
+ assert(index >=0
+ && index < static_cast<difference_type>(this->size()));
+ return std::vector<T>::operator[](index);
+ }
+
+
+ const_reference operator[](difference_type index) const {
+ assert(index >=0
+ && index < static_cast<difference_type>(this->size()));
+ return std::vector<T>::operator[](index);
+ }
+
+};
+}
+
+
+#endif
+
diff --git a/src/terralib/kernel/dynpq.h b/src/terralib/kernel/dynpq.h
new file mode 100644
index 0000000..2a0177c
--- /dev/null
+++ b/src/terralib/kernel/dynpq.h
@@ -0,0 +1,175 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+// include/dynpq.h
+#ifndef DYNPQ_H
+#define DYNPQ_H
+#include<checkvec.h>
+#include<algorithm>
+#include<showseq.h>
+namespace br_stl {
+
+// compares the associated values of passed iterators
+template<class T>
+struct IterGreater {
+ bool operator()( T x, T y) const { return *y < *x;}
+};
+
+template <class key_type>
+class dynamic_priority_queue {
+ public:
+ // public type definitions
+ typedef typename std::vector<key_type>::size_type size_type;
+ typedef typename std::vector<key_type>::difference_type index_type;
+
+ // constructor
+ dynamic_priority_queue(std::vector<key_type>& v);
+
+ // change a value at position 'at'
+ void changeKeyAt(index_type at, key_type k);
+
+ // index of the smallest element (= highest priority)
+ index_type topIndex() const { return c.front() - first; }
+
+ // value of the smallest element (= highest priority)
+ const key_type& topKey() const { return *c.front(); }
+
+ void pop(); // remove smallest element from the heap
+
+ bool empty() const { return csize == 0;}
+ size_type size() const { return csize;}
+
+ private:
+// checkedVector<index_type> Indices; // auxiliary vector ANAP
+ vector<index_type> Indices; // auxiliary vector
+ typedef typename std::vector<key_type>::iterator randomAccessIterator;
+// checkedVector<randomAccessIterator> c; // heap of iterators ANAP
+ vector<randomAccessIterator> c; // heap of iterators
+ randomAccessIterator first; // beginning of the external vector
+ IterGreater<randomAccessIterator> comp; // comparison object
+ index_type csize; // current heap size
+
+ // heap update (see below)
+ void goUp(index_type);
+ void goDown(index_type);
+};
+
+template <class key_type>
+dynamic_priority_queue<key_type>::dynamic_priority_queue(
+ std::vector<key_type>& v)
+ : Indices(v.size()), c(v.size()), first(v.begin()),
+ csize(v.size()) {
+ // store iterators and generate heap
+ for(index_type i = 0; i< csize; ++i)
+ c[i] = v.begin()+i;
+ make_heap(c.begin(), c.end(), comp); // STL
+
+ // construct index array
+ for(index_type ii = 0; ii< csize; ++ii) // ANAP i-> ii
+ Indices[c[ii] - first] = ii;
+}
+
+template <class key_type>
+void dynamic_priority_queue<key_type>::changeKeyAt(
+ index_type at, key_type k) {
+ index_type idx = Indices[at];
+
+// if (idx < csize) //ANAP
+ // {
+ assert(idx < csize); // value still present in the queue?
+
+ if(*c[idx] != k) // in case of equality, do nothing
+ if(k > *c[idx]) {
+ *c[idx] = k; // enter heavier value
+ goDown(idx); // reorganize heap
+ }
+ else {
+ *c[idx] = k; // enter lighter value
+ goUp(idx); // reorganize heap
+ }
+// }
+// else cout << "erro no dynamic_priority_queue<key_type>::changeKeyAt" << idx << csize << k << endl;
+}
+
+template <class key_type>
+void dynamic_priority_queue<key_type>::goUp(index_type idx) {
+ index_type Predecessor = (idx-1)/2;
+ randomAccessIterator temp = c[idx];
+
+ while(Predecessor != idx && comp(c[Predecessor], temp)) {
+ c[idx] = c[Predecessor];
+ Indices[c[idx]-first] = idx;
+ idx = Predecessor;
+ Predecessor = (idx-1)/2;
+ }
+
+ c[idx] = temp;
+ Indices[c[idx]-first] = idx;
+}
+
+template <class key_type>
+void dynamic_priority_queue<key_type>::goDown(index_type idx) {
+ index_type Successor = (idx+1)*2-1;
+
+ if(Successor < csize-1
+ && comp(c[Successor], c[Successor+1]))
+ ++Successor;
+ randomAccessIterator temp = c[idx];
+
+ while(Successor < csize && comp(temp, c[Successor])) {
+ c[idx] = c[Successor];
+ Indices[c[idx]-first] = idx;
+ idx = Successor;
+ Successor = (idx+1)*2-1;
+
+ if(Successor < csize-1
+ && comp(c[Successor], c[Successor+1]))
+ ++Successor;
+ }
+ c[idx] = temp;
+ Indices[c[idx]-first] = idx;
+}
+
+/* The method pop() removes the topmost element from the heap. This is
+ done by moving the last element to the top and blocking the freed
+ position with --csize. Subsequently, the element sinks down to its
+ proper position. */
+
+template <class key_type>
+void dynamic_priority_queue<key_type>::pop() {
+ // overwrite iterator at the top with the
+ // address of the last element
+ c[0] = c[--csize];
+
+ // enter the new address 0 at the position belonging
+ // to this element in the auxiliary array
+ Indices[c[0]-first] = 0;
+
+ // let the element at the top sink to the correct
+ // position corresponding to its weight
+ goDown(0);
+}
+
+} // namespace br_stl
+#endif
+
diff --git a/src/terralib/kernel/gra_util.h b/src/terralib/kernel/gra_util.h
new file mode 100644
index 0000000..10f7213
--- /dev/null
+++ b/src/terralib/kernel/gra_util.h
@@ -0,0 +1,259 @@
+#ifndef GRAPH_UTILITIES_H
+#define GRAPH_UTILITIES_H
+
+#include<place.h>
+#include<graph.h>
+#include<fstream>
+#include<myrandom.h>
+#include<string>
+#include<iostream>
+
+namespace br_stl {
+
+/* During automatic creation of an undirected graph, a name must be
+ generated for each vertex. The following auxiliary function
+ converts the current number into a string object which is entered
+ as identifier. */
+
+// auxiliary function for generating strings out of numbers
+std::string i2string(unsigned int i) {
+ if(i==0) return std::string("0");
+ char buf[] = "0000000000000000";
+ char *pos = buf + sizeof(buf)-1; // point to end
+
+ do
+ *--pos = i % 10 + '0';
+ while(i /=10);
+ return std::string(pos);
+}
+
+/* The function create_vertex_set() creates a number of vertices with
+ random coordinates between 0 and maxX or maxY in a graph G
+ according to its size (G.size()). */
+
+template<class EdgeType>
+void create_vertex_set(Graph<Place, EdgeType>& G,
+ int count, int maxX, int maxY) {
+ Random xRandom(maxX),
+ yRandom(maxY);
+
+ // create vertices with random coordinates
+ int i = -1;
+ while(++i < count)
+ G.insert(Place(xRandom(), yRandom(),i2string(i)));
+}
+
+template<class EdgeType>
+void connectNeighbors(Graph<Place, EdgeType>& G) {
+ for(size_t i = 0; i < G.size(); ++i) {
+ Place iPlace = G[i].first;
+
+ for(size_t j = i+1; j < G.size(); ++j) {
+ Place jPlace = G[j].first;
+
+ Place MidPoint((iPlace.X()+jPlace.X())/2,
+ (iPlace.Y()+jPlace.Y())/2);
+
+ /* The following loop is not run-time optimized. A possible
+ optimization could be to sort the places by their x
+ coordinates so that only a small relevant range must be
+ searched. The relevant range results from the fact that
+ the places to be compared must lie inside a circle around
+ the mid-point whose diameter is equal to the distance
+ between the places i and j. */
+
+ size_t k = 0;
+ unsigned long int e2 = DistSquare(iPlace, MidPoint);
+
+ while(k < G.size()) { // not run-time optimized
+ if(k != j && k != i &&
+ DistSquare(G[k].first, MidPoint) < e2)
+ break;
+ ++k;
+ }
+
+ if(k == G.size()) {// no nearer place found
+ EdgeType dist = Distance(iPlace, jPlace);
+ G.connectVertices(i, j, dist);
+ }
+ }
+ }
+}
+
+
+// Only for undirected graphs!
+template<class EdgeType>
+void createTeXfile(const char * Filename,
+ Graph<Place, EdgeType>& G,
+ double ScalingFactor,
+ int xMax, int yMax) {
+ assert(!G.isDirected());
+ std::ofstream Output(Filename);
+
+ if(!Output) {
+ std::cerr << Filename
+ << " cannot be opened!\n";
+ exit(1);
+ }
+
+ Output << "%% This is a generated file!\n"
+ << "\\unitlength 1.00mm\n"
+ << "\\begin{picture}("
+ << xMax << ','
+ << yMax << ")\n";
+
+ for(size_t iv = 0; iv < G.size(); ++iv) {
+ // Point
+ Output << "\\put("
+ << G[iv].first.X()*ScalingFactor
+ << ','
+ << G[iv].first.Y()*ScalingFactor
+ << "){\\circle*{1.0}}\n";
+
+ // node name
+ Output << "\\put("
+ << (1.0 + G[iv].first.X()*ScalingFactor)
+ << ','
+ << G[iv].first.Y()*ScalingFactor
+ << "){\\makebox(0,0)[lb]{{\\tiny "
+ << G[iv].first // name
+ << "}}}\n";
+
+ /* All edges are drawn. In order to prevent them from appearing
+ twice in the undirected graph, they are only drawn in the
+ direction of the greater index. */
+
+ typename Graph<Place,EdgeType>::Successor::const_iterator I =
+ // std::map< int, EdgeType >::const_iterator I =
+ G[iv].second.begin();
+
+ while(I != G[iv].second.end()) {
+ size_t n = (*I).first;
+ if(n > iv) { // otherwise, ignore
+ double x1,x2,y1,y2,dx,dy;
+ x1 = G[iv].first.X()*ScalingFactor;
+ y1 = G[iv].first.Y()*ScalingFactor;
+ x2 = G[n].first.X()*ScalingFactor;
+ y2 = G[n].first.Y()*ScalingFactor;
+ dx = x2-x1; dy = y2-y1;
+ double dist = std::sqrt(dx*dx+dy*dy);
+ int wdh = int(5*dist);
+ dx = dx/wdh; dy = dy/wdh;
+ Output << "\\multiput(" << x1 << "," << y1 << ")("
+ << dx << "," << dy << "){" << wdh
+ << "}{\\circle*{0.1}}\n";
+ }
+ ++I;
+ }
+ }
+ Output << "\\end{picture}\n";
+}
+
+/* This is similar to createTeXfile, but creates
+ metapost-output which can with metapost directly
+ be converted to postscript. The adaption of this routine
+ was made by Andreas Scherer.
+ Only for undirected graphs! */
+
+template<class EdgeType>
+void createMPfile(char * Filename,
+ Graph<Place, EdgeType>& G,
+ double ScalingFactor) {
+ assert(!G.isDirected());
+ std::ofstream Output(Filename);
+
+ if(!Output) {
+ std::cerr << Filename
+ << " cannot be opened!\n";
+ exit(1);
+ }
+
+ Output << "%%%% createMPfile(): This is a generated file!\n"
+ << "input boxes\n\n"
+ << "beginfig(1);\nu=1mm; % unitlength\n"
+ << "defaultscale := 0.8; % small numbers\n";
+
+ for(register size_t iv = 0; iv < G.size(); ++iv) {
+ // Point
+ Output << " drawdot( "
+ << G[iv].first.X()*ScalingFactor
+ << "u, "
+ << G[iv].first.Y()*ScalingFactor
+ << "u) withpen pencircle scaled 1mm;\n";
+
+ // node name
+ Output << " label.urt( \""
+ << G[iv].first << "\", ( "
+ << G[iv].first.X()*ScalingFactor
+ << "u, "
+ << G[iv].first.Y()*ScalingFactor
+ << "u) ); " << std::endl;
+
+ /* All edges are drawn. In order to prevent them from appearing
+ twice in the undirected graph, they are only drawn in the
+ direction of the greater index. */
+
+
+ typename Graph<Place, EdgeType>::Successor::const_iterator I =
+ // std:: map<int, EdgeType>::const_iterator I =
+ G[iv].second.begin();
+
+ while(I != G[iv].second.end()) {
+ size_t n = (*I).first;
+ if(n > iv) { // otherwise, ignore
+ Output << " draw ( "
+ << G[iv].first.X()*ScalingFactor << "u, "
+ << G[iv].first.Y()*ScalingFactor
+ << "u ) -- ( "
+ << G[n].first.X()*ScalingFactor << "u, "
+ << G[n].first.Y()*ScalingFactor
+ << "u );" << std::endl;
+ }
+ ++I;
+ }
+ }
+ Output << "endfig;" << std::endl << "end." << std::endl;
+}
+
+/* This function (written by A. Scherer) writes a path
+ within a graph as a separate metapost-file */
+
+template<class EdgeType>
+void writeMPpath(char * Filename,
+ Graph<Place, EdgeType>& G,
+ std::vector< int >& V,
+ double ScalingFactor,
+ int Start) {
+ std::ofstream Output(Filename);
+
+ if(!Output) {
+ std::cerr << Filename
+ << " cannot be opened!\n";
+ exit(1);
+ }
+
+ Output << "%%%% writeMPpath(): This is a generated file!\n"
+ << "beginfig( 1 );\nu=1mm; % unitlength" << std::endl
+ << "pickup pencircle scaled 2pt;\n" // line width
+ << " draw ( "
+ << G[ Start ].first.X() * ScalingFactor
+ << "u, "
+ << G[ Start ].first.Y() * ScalingFactor
+ << "u)";
+
+ while ( V[ Start ] >= 0 ) {
+ int Successor = V[ Start ];
+ Output << std::endl << " -- ( "
+ << G[ Successor ].first.X() * ScalingFactor
+ << "u, "
+ << G[ Successor ].first.Y() * ScalingFactor
+ << " u)";
+ Start = Successor;
+ }
+ Output << ";\n" << "endfig;\n" << "end." << std::endl;
+}
+
+} // namespace br_stl
+
+#endif // graphUtilities
+
diff --git a/src/terralib/kernel/graph.h b/src/terralib/kernel/graph.h
new file mode 100644
index 0000000..ddf01d3
--- /dev/null
+++ b/src/terralib/kernel/graph.h
@@ -0,0 +1,365 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file graph.h
+ This file contains structures and definitions used to manipulate a
+ graph strucutre
+ \note this code came from the book "Desining Components with C++ STL" -
+ Ulrich Breymann - Addison-Wesley - pag 243
+*/
+#ifndef GRAPH_H
+#define GRAPH_H
+#include<cassert>
+#include<vector>
+#include<map>
+#include<stack>
+#include<iostream>
+namespace br_stl {
+
+// empty parameter class with a minimal set of operations
+// if there are no weights for edges necessary
+struct Empty {
+ public:
+ Empty(int=0) {}
+ bool operator<(const Empty&) const { return true;}
+};
+inline std::ostream& operator<<(std::ostream& os, const Empty&) { return os;}
+inline std::istream& operator>>(std::istream& is, Empty& ) { return is;}
+
+template<class VertexType, class EdgeType>
+class Graph {
+ public:
+ // public type interface
+ typedef std::map<int, EdgeType > Successor;
+ typedef std::pair<VertexType, Successor> vertex;
+ typedef std::vector<vertex> GraphType;
+ typedef typename GraphType::iterator iterator;
+ typedef typename GraphType::const_iterator const_iterator;
+
+ /* The following constructor initializes the output channel with
+ cerr. A parameter must be specified as to whether the graph is
+ directed or undirected, because this is an essential property
+ of a graph. */
+
+ Graph(bool g, std::ostream& os = cerr)
+ : directed(g), pOut(&os) { }
+
+ bool isDirected() const { return directed;}
+
+ /* A graph is a special kind of container to which something can
+ be added and whose elements can be accessed. Therefore, typical
+ container methods follow, which in their extent are limited to
+ those needed in the book's examples. Thus, there is no method
+ for explicit removal of a vertex or an edge from the graph. */
+
+ size_t size() const { return C.size();}
+
+ iterator begin() { return C.begin();}
+ iterator end() { return C.end();}
+
+ // access to vertex i}
+ vertex& operator[](int i) {
+ // the access is safe, because C is a checkedVector
+ return C[i];
+ }
+
+ // return the position of the vertex, if it does not exist return -1
+ int getPosition(const VertexType& e);
+
+ // addition of a vertex
+ int insert(const VertexType& e);
+
+ // addition of an edge between e1 and e2
+ void insert(const VertexType& e1, const VertexType& e2,
+ const EdgeType& Value);
+
+ // addition of an edge between vertices no. i and j
+ void connectVertices(int i, int j, const EdgeType& Value);
+
+ // set the edge value between vertices no. i and j
+ bool setEdgeValue(const VertexType& e1, const VertexType& e2, const EdgeType& Value);
+
+ /* The following methods are useful tools for displaying
+ information on a graph and check its structure.*/
+
+ // checking of a read data model
+ // output on the channel passed to check()
+ void check(std::ostream& = std::cout);
+
+ // determine the number of edges
+ size_t CountEdges();
+
+ /* determine whether the graph contains cycles and in which way it
+ is connected. The method combines two tasks, because they can
+ be carried out in a single run.*/
+ void CycleAndConnect(std::ostream& = cout);
+ int sucessors(int index);
+
+ private:
+ bool directed;
+ GraphType C; // container
+ std::ostream* pOut;
+}; // class Graph
+
+
+template<class VertexType, class EdgeType>
+int Graph<VertexType,EdgeType>::getPosition(const VertexType& e)
+{
+ for(size_t i = 0; i < size(); ++i)
+ if(e == C[i].first)
+ return i;
+
+ return -1;
+}
+
+/* In order to avoid ambiguities, a vertex is only entered if it does
+not yet exist. The sequential search is not particularly fast; on the
+other hand, this process is only needed once during the construction
+of the graph. The position of the vertex is returned. */
+
+template<class VertexType, class EdgeType>
+int Graph<VertexType,EdgeType>::insert(const VertexType& e)
+{
+ int pos = getPosition(e);
+ if(pos<0)
+ {
+ // if not found, insert:
+ C.push_back(vertex(e, Successor()));
+ return size()-1;
+ }
+
+ return pos;
+}
+
+/* An edge is inserted by first inserting the vertices, if needed, and
+by determining their positions. The edge construction itself is
+carried out by the function connectVertices(). It is passed the
+vertex numbers and, because of the absence of a search procedure,
+it is very fast. */
+
+template<class VertexType, class EdgeType>
+void Graph<VertexType,EdgeType>::insert(const VertexType& e1,
+ const VertexType& e2,
+ const EdgeType& Value) {
+ int pos1 = insert(e1);
+ int pos2 = insert(e2);
+ connectVertices(pos1, pos2, Value);
+}
+
+template<class VertexType, class EdgeType>
+void Graph<VertexType,EdgeType>::connectVertices(
+ int pos1, int pos2, const EdgeType& Value)
+{
+ (C[pos1].second)[pos2] = Value;
+
+ if(!directed) // automatically insert opposite direction too
+ (C[pos2].second)[pos1] = Value;
+}
+
+template<class VertexType, class EdgeType>
+bool Graph<VertexType,EdgeType>::setEdgeValue(const VertexType& e1,
+ const VertexType& e2,
+ const EdgeType& Value)
+{
+ int pos1 = getPosition(e1);
+ int pos2 = getPosition(e2);
+
+ if((pos1<0) || (pos2<0))
+ return false;
+
+ (C[pos1].second)[pos2] = Value;
+
+ if(!directed) // automatically insert opposite direction too
+ (C[pos1].second)[pos2] = Value;
+
+ return true;
+}
+
+
+template<class VertexType, class EdgeType>
+void Graph<VertexType,EdgeType>::check(std::ostream& os) {
+ os << "The graph is ";
+ if(!isDirected())
+ os << "un";
+
+ os << "directed and has "
+ << size() << " vertices and "
+ << CountEdges()
+ << " edges\n";
+ CycleAndConnect(os);
+}
+
+template<class VertexType, class EdgeType>
+size_t Graph<VertexType,EdgeType>::CountEdges() {
+ size_t edges = 0;
+ iterator temp = begin();
+
+ while(temp != end())
+ edges += (*temp++).second.size();
+
+ if(!directed)
+ edges /= 2;
+ return edges;
+}
+
+// Type for next function
+enum VertStatus {notVisited, visited, processed};
+
+template<class VertexType, class EdgeType>
+int Graph<VertexType, EdgeType>::sucessors(int index) {
+ typename Successor::const_iterator
+ start = operator[](index).second.begin(),
+ end = operator[](index).second.end();
+ int nSucc = 0;
+ while(start != end)
+ {
+ nSucc++;
+ ++start;
+ }
+
+ return nSucc;
+}
+template<class VertexType, class EdgeType>
+void Graph<VertexType, EdgeType>::CycleAndConnect(std::ostream& os) {
+ int Cycles = 0;
+ int ComponentNumber = 0;
+ std::stack<int, std::vector<int> > verticesStack; // vertices to be visited
+
+ /* In order to prevent multiple visits to vertices in possible
+ cycles, which entails the risk of infinite loops, the vertices
+ are marked for having been visited or finished being processed.
+ This purpose is served by the vector VertexState. */
+
+ // assign all vertices the state `not visited'
+ std::vector<VertStatus> VertexState(size(), notVisited);
+
+ /* If, starting from one vertex, an attempt is made to reach all
+ other vertices, success is not guaranteed in weakly or
+ non-connected graphs. Therefore, each vertex is visited. If it
+ is found that a vertex has already been visited, it does not
+ need to be processed any further. */
+
+ // visit all vertices
+ for(size_t i = 0; i < size(); ++i) {
+ if(VertexState[i] == notVisited) {
+ ++ComponentNumber;
+ // store on stack for further processing
+ verticesStack.push(i);
+
+ // process stack
+ while(!verticesStack.empty()) {
+ int theVertex = verticesStack.top();
+ verticesStack.pop();
+ if(VertexState[theVertex] == visited)
+ VertexState[theVertex] = processed;
+ else
+ if(VertexState[theVertex] == notVisited) {
+ VertexState[theVertex] = visited;
+ // new vertex, earmark for processed mark
+ verticesStack.push(theVertex);
+
+ /* If one of the successors of a newly found vertex
+ bears the visited mark, the algorithm has already
+ passed this point once, and there is a cycle. */
+
+ // earmark successor:
+ typename Successor::const_iterator
+ start = operator[](theVertex).second.begin(),
+ end = operator[](theVertex).second.end();
+
+ while(start != end) {
+ int Succ = (*start).first;
+
+ if(VertexState[Succ] == visited) {
+ ++Cycles; // someone's been here already!
+ (*pOut) << "at least vertex "
+ << operator[](Succ).first
+ << " lies in a cycle\n";
+ }
+
+ /* Otherwise, the vertex has already been
+ processed and therefore should not be
+ considered again, or it has not yet been
+ visited and is earmarked on the stack. */
+
+ if(VertexState[Succ] == notVisited)
+ verticesStack.push(Succ);
+ ++start;
+ }
+ }
+ } // stack empty?
+ } // if(VertexState}...
+ } // for()} ...
+
+ /* Now we only need the output. In case of directed, weakly
+ connected graphs, the algorithm counts several components. In
+ order to make the output conform to the above definitions,
+ although with less content of information, a distinction is
+ made as to whether the graph is directed or not. */
+
+ if(directed)
+ { if(ComponentNumber == 1)
+ os << "The graph is strongly connected.\n";
+ else
+ os << "The graph is not or weakly "
+ "connected.\n";
+ }
+ else
+ os << "The graph has "
+ << ComponentNumber
+ << " component(s)." << std::endl;
+
+ os << "The graph has ";
+ if(Cycles == 0)
+ os << "no ";
+ os << "cycles." << std::endl;
+}
+
+template<class VertexType, class EdgeType>
+std::ostream& operator<<(std::ostream& os, Graph<VertexType,EdgeType>& G) {
+ // display of vertices with successors
+ for(size_t i = 0; i < G.size(); ++i)
+ {
+ os << G[i].first << " <";
+ typename Graph<VertexType,EdgeType>::Successor::const_iterator
+ startN = G[i].second.begin(),
+ endN = G[i].second.end();
+
+ while(startN != endN)
+ {
+ os << G[(*startN).first].first << ' ' // vertex
+ << (*startN).second << ' '; // edge value
+ ++startN;
+ }
+ os << ">" << std::endl;
+ }
+ return os;
+}
+
+
+} // namespace br_stl
+
+
+
+#endif
+
diff --git a/src/terralib/kernel/ijl.h b/src/terralib/kernel/ijl.h
new file mode 100644
index 0000000..ef706bd
--- /dev/null
+++ b/src/terralib/kernel/ijl.h
@@ -0,0 +1,1513 @@
+/*M*
+//
+//
+// INTEL CORPORATION PROPRIETARY INFORMATION
+// This software is supplied under the terms of a license agreement or
+// nondisclosure agreement with Intel Corporation and may not be copied
+// or disclosed except in accordance with the terms of that agreement.
+// Copyright (c) 1998 Intel Corporation. All Rights Reserved.
+//
+//
+// File:
+// ijl.h
+//
+// Purpose:
+// IJL Common Header File
+// This file contains: definitions for data types, data
+// structures, error codes, and function prototypes used
+// in the Intel(R) JPEG Library (IJL).
+//
+// Version:
+// 1.5
+//
+*M*/
+
+#ifndef __IJL_H__
+#define __IJL_H__
+
+
+#if defined( __cplusplus )
+extern "C" {
+#endif
+
+
+#ifndef IJL_ALL_WARNINGS
+
+#if _MSC_VER >= 1000
+
+/* nonstandard extension used : nameless struct/union */
+#pragma warning(disable : 4201)
+/* nonstandard extension used : bit field types other than int */
+#pragma warning(disable : 4214)
+/* unreferenced inline function has been removed */
+#pragma warning(disable : 4514)
+/* named type definition in parentheses */
+#pragma warning(disable : 4115)
+
+#endif /* _MSC_VER >= 1000 */
+
+#endif /* IJL_ALL_WARNINGS */
+
+
+#define IJL_STDCALL __stdcall
+
+
+/* align struct on 8 bytes boundary */
+#pragma pack (8)
+
+
+/* /////////////////////////////////////////////////////////////////////////
+// Macros/Constants */
+
+/* Size of file I/O buffer (4K). */
+#define JBUFSIZE 4096
+
+
+#define IJL_INT64 __int64
+#define IJL_UINT64 unsigned IJL_INT64
+
+
+#ifndef IJLAPI
+ #ifdef IJL_MSEXPORTS
+ #define IJLAPI(type,name,arg) \
+ extern __declspec(dllimport) type IJL_STDCALL name arg
+ #else
+ #define IJLAPI(type,name,arg) \
+ extern type IJL_STDCALL name arg
+ #endif
+#endif
+
+
+
+#define IJL_DIB_ALIGN (sizeof(int) - 1)
+
+#define IJL_DIB_UWIDTH(width,nchannels) \
+ ((width) * (nchannels))
+
+#define IJL_DIB_AWIDTH(width,nchannels) \
+ ( ((IJL_DIB_UWIDTH(width,nchannels) + IJL_DIB_ALIGN) & (~IJL_DIB_ALIGN)) )
+
+#define IJL_DIB_PAD_BYTES(width,nchannels) \
+ ( IJL_DIB_AWIDTH(width,nchannels) - IJL_DIB_UWIDTH(width,nchannels) )
+
+
+#define IJL_DIB_SCALE_SIZE(jpgsize,scale) \
+ ( ((jpgsize) + (scale) - 1) / (scale) )
+
+
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: IJLibVersion
+//
+// Purpose: Stores library version info.
+//
+// Context:
+//
+// Example:
+// major - 1
+// minor - 0
+// build - 1
+// Name - "ijl10.dll"
+// Version - "1.0.1 Beta1"
+// InternalVersion - "1.0.1.1"
+// BuildDate - "Sep 22 1998"
+// CallConv - "DLL"
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _IJLibVersion
+{
+ int major;
+ int minor;
+ int build;
+ const char* Name;
+ const char* Version;
+ const char* InternalVersion;
+ const char* BuildDate;
+ const char* CallConv;
+
+} IJLibVersion;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: IJL_RECT
+//
+// Purpose: Keep coordinates for rectangle region of image
+//
+// Context: Used to specify roi
+//
+// Fields:
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _IJL_RECT
+{
+ long left;
+ long top;
+ long right;
+ long bottom;
+
+} IJL_RECT;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: IJL_HANDLE
+//
+// Purpose: file handle
+//
+// Context: used internally
+//
+// Fields:
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef void* IJL_HANDLE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: IJLIOTYPE
+//
+// Purpose: Possible types of data read/write/other operations to be
+// performed by the functions IJL_Read and IJL_Write.
+//
+// See the Developer's Guide for details on appropriate usage.
+//
+// Fields:
+//
+// IJL_JFILE_XXXXXXX Indicates JPEG data in a stdio file.
+//
+// IJL_JBUFF_XXXXXXX Indicates JPEG data in an addressable buffer.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _IJLIOTYPE
+{
+ IJL_SETUP = -1,
+
+
+ /* Read JPEG parameters (i.e., height, width, channels, sampling, etc.) */
+ /* from a JPEG bit stream. */
+ IJL_JFILE_READPARAMS = 0,
+ IJL_JBUFF_READPARAMS = 1,
+
+ /* Read a JPEG Interchange Format image. */
+ IJL_JFILE_READWHOLEIMAGE = 2,
+ IJL_JBUFF_READWHOLEIMAGE = 3,
+
+ /* Read JPEG tables from a JPEG Abbreviated Format bit stream. */
+ IJL_JFILE_READHEADER = 4,
+ IJL_JBUFF_READHEADER = 5,
+
+ /* Read image info from a JPEG Abbreviated Format bit stream. */
+ IJL_JFILE_READENTROPY = 6,
+ IJL_JBUFF_READENTROPY = 7,
+
+ /* Write an entire JFIF bit stream. */
+ IJL_JFILE_WRITEWHOLEIMAGE = 8,
+ IJL_JBUFF_WRITEWHOLEIMAGE = 9,
+
+ /* Write a JPEG Abbreviated Format bit stream. */
+ IJL_JFILE_WRITEHEADER = 10,
+ IJL_JBUFF_WRITEHEADER = 11,
+
+ /* Write image info to a JPEG Abbreviated Format bit stream. */
+ IJL_JFILE_WRITEENTROPY = 12,
+ IJL_JBUFF_WRITEENTROPY = 13,
+
+
+ /* Scaled Decoding Options: */
+
+ /* Reads a JPEG image scaled to 1/2 size. */
+ IJL_JFILE_READONEHALF = 14,
+ IJL_JBUFF_READONEHALF = 15,
+
+ /* Reads a JPEG image scaled to 1/4 size. */
+ IJL_JFILE_READONEQUARTER = 16,
+ IJL_JBUFF_READONEQUARTER = 17,
+
+ /* Reads a JPEG image scaled to 1/8 size. */
+ IJL_JFILE_READONEEIGHTH = 18,
+ IJL_JBUFF_READONEEIGHTH = 19,
+
+ /* Reads an embedded thumbnail from a JFIF bit stream. */
+ IJL_JFILE_READTHUMBNAIL = 20,
+ IJL_JBUFF_READTHUMBNAIL = 21
+
+} IJLIOTYPE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: IJL_COLOR
+//
+// Purpose: Possible color space formats.
+//
+// Note these formats do *not* necessarily denote
+// the number of channels in the color space.
+// There exists separate "channel" fields in the
+// JPEG_CORE_PROPERTIES data structure specifically
+// for indicating the number of channels in the
+// JPEG and/or DIB color spaces.
+//
+// See the Developer's Guide for details on appropriate usage.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _IJL_COLOR
+{
+ IJL_RGB = 1, /* Red-Green-Blue color space. */
+ IJL_BGR = 2, /* Reversed channel ordering from IJL_RGB. */
+ IJL_YCBCR = 3, /* Luminance-Chrominance color space as defined */
+ /* by CCIR Recommendation 601. */
+ IJL_G = 4, /* Grayscale color space. */
+ IJL_RGBA_FPX = 5, /* FlashPix RGB 4 channel color space that */
+ /* has pre-multiplied opacity. */
+ IJL_YCBCRA_FPX = 6, /* FlashPix YCbCr 4 channel color space that */
+ /* has pre-multiplied opacity. */
+
+ IJL_OTHER = 255 /* Some other color space not defined by the IJL. */
+ /* (This means no color space conversion will */
+ /* be done by the IJL.) */
+
+} IJL_COLOR;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: IJL_JPGSUBSAMPLING
+//
+// Purpose: Possible subsampling formats used in the JPEG.
+//
+// See the Developer's Guide for details on appropriate usage.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _IJL_JPGSUBSAMPLING
+{
+ IJL_NONE = 0, /* Corresponds to "No Subsampling". */
+ /* Valid on a JPEG w/ any number of channels. */
+ IJL_411 = 1, /* Valid on a JPEG w/ 3 channels. */
+ IJL_422 = 2, /* Valid on a JPEG w/ 3 channels. */
+
+ IJL_4114 = 3, /* Valid on a JPEG w/ 4 channels. */
+ IJL_4224 = 4 /* Valid on a JPEG w/ 4 channels. */
+
+} IJL_JPGSUBSAMPLING;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: IJL_DIBSUBSAMPLING
+//
+// Purpose: Possible subsampling formats used in the DIB.
+//
+// See the Developer's Guide for details on appropriate usage.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef IJL_JPGSUBSAMPLING IJL_DIBSUBSAMPLING;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: HUFFMAN_TABLE
+//
+// Purpose: Stores Huffman table information in a fast-to-use format.
+//
+// Context: Used by Huffman encoder/decoder to access Huffman table
+// data. Raw Huffman tables are formatted to fit this
+// structure prior to use.
+//
+// Fields:
+// huff_class 0 == DC Huffman or lossless table, 1 == AC table.
+// ident Huffman table identifier, 0-3 valid (Extended Baseline).
+// huffelem Huffman elements for codes <= 8 bits long;
+// contains both zero run-length and symbol length in bits.
+// huffval Huffman values for codes 9-16 bits in length.
+// mincode Smallest Huffman code of length n.
+// maxcode Largest Huffman code of length n.
+// valptr Starting index into huffval[] for symbols of length k.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _HUFFMAN_TABLE
+{
+ int huff_class;
+ int ident;
+ unsigned int huffelem[256];
+ unsigned short huffval[256];
+ unsigned short mincode[17];
+ short maxcode[18];
+ unsigned short valptr[17];
+
+} HUFFMAN_TABLE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: JPEGHuffTable
+//
+// Purpose: Stores pointers to JPEG-binary spec compliant
+// Huffman table information.
+//
+// Context: Used by interface and table methods to specify encoder
+// tables to generate and store JPEG images.
+//
+// Fields:
+// bits Points to number of codes of length i (<=16 supported).
+// vals Value associated with each Huffman code.
+// hclass 0 == DC table, 1 == AC table.
+// ident Specifies the identifier for this table.
+// 0-3 for extended JPEG compliance.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _JPEGHuffTable
+{
+ unsigned char* bits;
+ unsigned char* vals;
+ unsigned char hclass;
+ unsigned char ident;
+
+} JPEGHuffTable;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: QUANT_TABLE
+//
+// Purpose: Stores quantization table information in a
+// fast-to-use format.
+//
+// Context: Used by quantizer/dequantizer to store formatted
+// quantization tables.
+//
+// Fields:
+// precision 0 => elements contains 8-bit elements,
+// 1 => elements contains 16-bit elements.
+// ident Table identifier (0-3).
+// elements Pointer to 64 table elements + 16 extra elements to catch
+// input data errors that may cause malfunction of the
+// Huffman decoder.
+// elarray Space for elements (see above) plus 8 bytes to align
+// to a quadword boundary.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _QUANT_TABLE
+{
+ int precision;
+ int ident;
+ short* elements;
+ short elarray [84];
+
+} QUANT_TABLE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: JPEGQuantTable
+//
+// Purpose: Stores pointers to JPEG binary spec compliant
+// quantization table information.
+//
+// Context: Used by interface and table methods to specify encoder
+// tables to generate and store JPEG images.
+//
+// Fields:
+// quantizer Zig-zag order elements specifying quantization factors.
+// ident Specifies identifier for this table.
+// 0-3 valid for Extended Baseline JPEG compliance.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _JPEGQuantTable
+{
+ unsigned char* quantizer;
+ unsigned char ident;
+
+} JPEGQuantTable;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: FRAME_COMPONENT
+//
+// Purpose: One frame-component structure is allocated per component
+// in a frame.
+//
+// Context: Used by Huffman decoder to manage components.
+//
+// Fields:
+// ident Component identifier. The tables use this ident to
+// determine the correct table for each component.
+// hsampling Horizontal subsampling factor for this component,
+// 1-4 are legal.
+// vsampling Vertical subsampling factor for this component,
+// 1-4 are legal.
+// quant_sel Quantization table selector. The quantization table
+// used by this component is determined via this selector.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _FRAME_COMPONENT
+{
+ int ident;
+ int hsampling;
+ int vsampling;
+ int quant_sel;
+
+} FRAME_COMPONENT;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: FRAME
+//
+// Purpose: Stores frame-specific data.
+//
+// Context: One Frame structure per image.
+//
+// Fields:
+// precision Sample precision in bits.
+// width Width of the source image in pixels.
+// height Height of the source image in pixels.
+// MCUheight Height of a frame MCU.
+// MCUwidth Width of a frame MCU.
+// max_hsampling Max horiz sampling ratio of any component in the frame.
+// max_vsampling Max vert sampling ratio of any component in the frame.
+// ncomps Number of components/channels in the frame.
+// horMCU Number of horizontal MCUs in the frame.
+// totalMCU Total number of MCUs in the frame.
+// comps Array of 'ncomps' component descriptors.
+// restart_interv Indicates number of MCUs after which to restart the
+// entropy parameters.
+// SeenAllDCScans Used when decoding Multiscan images to determine if
+// all channels of an image have been decoded.
+// SeenAllACScans (See SeenAllDCScans)
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _FRAME
+{
+ int precision;
+ int width;
+ int height;
+ int MCUheight;
+ int MCUwidth;
+ int max_hsampling;
+ int max_vsampling;
+ int ncomps;
+ int horMCU;
+ long totalMCU;
+ FRAME_COMPONENT* comps;
+ int restart_interv;
+ int SeenAllDCScans;
+ int SeenAllACScans;
+
+} FRAME;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: SCAN_COMPONENT
+//
+// Purpose: One scan-component structure is allocated per component
+// of each scan in a frame.
+//
+// Context: Used by Huffman decoder to manage components within scans.
+//
+// Fields:
+// comp Component number, index to the comps member of FRAME.
+// hsampling Horizontal sampling factor.
+// vsampling Vertical sampling factor.
+// dc_table DC Huffman table pointer for this scan.
+// ac_table AC Huffman table pointer for this scan.
+// quant_table Quantization table pointer for this scan.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _SCAN_COMPONENT
+{
+ int comp;
+ int hsampling;
+ int vsampling;
+ HUFFMAN_TABLE* dc_table;
+ HUFFMAN_TABLE* ac_table;
+ QUANT_TABLE* quant_table;
+
+} SCAN_COMPONENT;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: SCAN
+//
+// Purpose: One SCAN structure is allocated per scan in a frame.
+//
+// Context: Used by Huffman decoder to manage scans.
+//
+// Fields:
+// ncomps Number of image components in a scan, 1-4 legal.
+// gray_scale If TRUE, decode only the Y channel.
+// start_spec Start coefficient of spectral or predictor selector.
+// end_spec End coefficient of spectral selector.
+// approx_high High bit position in successive approximation
+// Progressive coding.
+// approx_low Low bit position in successive approximation
+// Progressive coding.
+// restart_interv Restart interval, 0 if disabled.
+// curxMCU Next horizontal MCU index to be processed after
+// an interrupted SCAN.
+// curyMCU Next vertical MCU index to be processed after
+// an interrupted SCAN.
+// dc_diff Array of DC predictor values for DPCM modes.
+// comps Array of ncomps SCAN_COMPONENT component identifiers.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _SCAN
+{
+ int ncomps;
+ int gray_scale;
+ int start_spec;
+ int end_spec;
+ int approx_high;
+ int approx_low;
+ unsigned int restart_interv;
+ int curxMCU;
+ int curyMCU;
+ int dc_diff[4];
+ SCAN_COMPONENT* comps;
+
+} SCAN;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: DCTTYPE
+//
+// Purpose: Possible algorithms to be used to perform the discrete
+// cosine transform (DCT).
+//
+// Fields:
+// IJL_AAN The AAN (Arai, Agui, and Nakajima) algorithm from
+// Trans. IEICE, vol. E 71(11), 1095-1097, Nov. 1988.
+// IJL_IPP The modified K. R. Rao and P. Yip algorithm from
+// Intel Performance Primitives Library
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _DCTTYPE
+{
+ IJL_AAN = 0,
+ IJL_IPP = 1
+
+} DCTTYPE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: UPSAMPLING_TYPE
+//
+// Purpose: - Possible algorithms to be used to perform upsampling
+//
+// Fields:
+// IJL_BOX_FILTER - the algorithm is simple replication of the input pixel
+// onto the corresponding output pixels (box filter);
+// IJL_TRIANGLE_FILTER - 3/4 * nearer pixel + 1/4 * further pixel in each
+// dimension
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _UPSAMPLING_TYPE
+{
+ IJL_BOX_FILTER = 0,
+ IJL_TRIANGLE_FILTER = 1
+
+} UPSAMPLING_TYPE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: SAMPLING_STATE
+//
+// Purpose: Stores current conditions of sampling. Only for upsampling
+// with triangle filter is used now.
+//
+// Fields:
+// top_row - pointer to buffer with MCUs, that are located above than
+// current row of MCUs;
+// cur_row - pointer to buffer with current row of MCUs;
+// bottom_row - pointer to buffer with MCUs, that are located below than
+// current row of MCUs;
+// last_row - pointer to bottom boundary of last row of MCUs
+// cur_row_number - number of row of MCUs, that is decoding;
+// user_interrupt - field to store jprops->interrupt, because of we prohibit
+// interrupts while top row of MCUs is upsampling.
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _SAMPLING_STATE
+{
+ short* top_row;
+ short* cur_row;
+ short* bottom_row;
+ short* last_row;
+ int cur_row_number;
+
+} SAMPLING_STATE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: PROCESSOR_TYPE
+//
+// Purpose: Possible types of processors.
+// Note that the enums are defined in ascending order
+// depending upon their various IA32 instruction support.
+//
+// Fields:
+//
+// IJL_OTHER_PROC
+// Does not support the CPUID instruction and
+// assumes no Pentium(R) processor instructions.
+//
+// IJL_PENTIUM_PROC
+// Corresponds to an Intel(R) Pentium(R) processor
+// (or a 100% compatible) that supports the
+// Pentium(R) processor instructions.
+//
+// IJL_PENTIUM_PRO_PROC
+// Corresponds to an Intel(R) Pentium(R) Pro processor
+// (or a 100% compatible) that supports the
+// Pentium(R) Pro processor instructions.
+//
+// IJL_PENTIUM_PROC_MMX_TECH
+// Corresponds to an Intel(R) Pentium(R) processor
+// with MMX(TM) technology (or a 100% compatible)
+// that supports the MMX(TM) instructions.
+//
+// IJL_PENTIUM_II_PROC
+// Corresponds to an Intel(R) Pentium(R) II processor
+// (or a 100% compatible) that supports both the
+// Pentium(R) Pro processor instructions and the
+// MMX(TM) instructions.
+//
+// IJL_PENTIUM_III_PROC
+// Corresponds to an Intel(R) Pentium(R) III processor
+//
+// IJL_NEW_PROCESSOR
+// Correponds to new processor
+//
+// Any additional processor types that support a superset
+// of both the Pentium(R) Pro processor instructions and the
+// MMX(TM) instructions should be given an enum value greater
+// than IJL_PENTIUM_III_PROC.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _PROCESSOR_TYPE
+{
+ IJL_OTHER_PROC = 0,
+ IJL_PENTIUM_PROC = 1,
+ IJL_PENTIUM_PRO_PROC = 2,
+ IJL_PENTIUM_PROC_MMX_TECH = 3,
+ IJL_PENTIUM_II_PROC = 4,
+ IJL_PENTIUM_III_PROC = 5,
+ IJL_PENTIUM_4_PROC = 6,
+ IJL_NEW_PROCESSOR = 7
+
+} PROCESSOR_TYPE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: RAW_DATA_TYPES_STATE
+//
+// Purpose: Stores data types: raw dct coefficients or raw sampled data.
+// Pointer to structure in JPEG_PROPERTIES is NULL, if any raw
+// data isn't request (DIBBytes!=NULL).
+//
+// Fields:
+// short* raw_ptrs[4] - pointers to buffers with raw data; one pointer
+// corresponds one JPG component;
+// data_type - 0 - raw dct coefficients, 1 - raw sampled data.
+////////////////////////////////////////////////////////////////////////////
+*D*/
+typedef struct _RAW_DATA_TYPES_STATE
+{
+ int data_type;
+ unsigned short* raw_ptrs[4];
+
+} RAW_DATA_TYPES_STATE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: ENTROPYSTRUCT
+//
+// Purpose: Stores the decoder state information necessary to "jump"
+// to a particular MCU row in a compressed entropy stream.
+//
+// Context: Used to persist the decoder state within Decode_Scan when
+// decoding using ROIs.
+//
+// Fields:
+// offset Offset (in bytes) into the entropy stream
+// from the beginning.
+// dcval1 DC val at the beginning of the MCU row
+// for component 1.
+// dcval2 DC val at the beginning of the MCU row
+// for component 2.
+// dcval3 DC val at the beginning of the MCU row
+// for component 3.
+// dcval4 DC val at the beginning of the MCU row
+// for component 4.
+// bit_buffer_64 64-bit Huffman bit buffer. Stores current
+// bit buffer at the start of a MCU row.
+// Also used as a 32-bit buffer on 32-bit
+// architectures.
+// bitbuf_bits_valid Number of valid bits in the above bit buffer.
+// unread_marker Have any markers been decoded but not
+// processed at the beginning of a MCU row?
+// This entry holds the unprocessed marker, or
+// 0 if none.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _ENTROPYSTRUCT
+{
+ unsigned int offset;
+ int dcval1;
+ int dcval2;
+ int dcval3;
+ int dcval4;
+ IJL_UINT64 bit_buffer_64;
+ int bitbuf_bits_valid;
+ unsigned char unread_marker;
+
+} ENTROPYSTRUCT;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: STATE
+//
+// Purpose: Stores the active state of the IJL.
+//
+// Context: Used by all low-level routines to store pseudo-global or
+// state variables.
+//
+// Fields:
+// bit_buffer_64 64-bit bitbuffer utilized by Huffman
+// encoder/decoder algorithms utilizing routines
+// designed for MMX(TM) technology.
+// bit_buffer_32 32-bit bitbuffer for all other Huffman
+// encoder/decoder algorithms.
+// bitbuf_bits_valid Number of bits in the above two fields that
+// are valid.
+//
+// cur_entropy_ptr Current position (absolute address) in
+// the entropy buffer.
+// start_entropy_ptr Starting position (absolute address) of
+// the entropy buffer.
+// end_entropy_ptr Ending position (absolute address) of
+// the entropy buffer.
+// entropy_bytes_processed Number of bytes actually processed
+// (passed over) in the entropy buffer.
+// entropy_buf_maxsize Max size of the entropy buffer.
+// entropy_bytes_left Number of bytes left in the entropy buffer.
+// Prog_EndOfBlock_Run Progressive block run counter.
+//
+// DIB_ptr Temporary offset into the input/output DIB.
+//
+// unread_marker If a marker has been read but not processed,
+// stick it in this field.
+// processor_type (0, 1, or 2) == current processor does not
+// support MMX(TM) instructions.
+// (3 or 4) == current processor does
+// support MMX(TM) instructions.
+// cur_scan_comp On which component of the scan are we working?
+// file Process file handle, or
+// 0x00000000 if no file is defined.
+// JPGBuffer Entropy buffer (~4K).
+//
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _STATE
+{
+ /* Bit buffer. */
+ IJL_UINT64 bit_buffer_64;
+ unsigned int bit_buffer_32;
+ int bitbuf_bits_valid;
+
+ /* Entropy. */
+ unsigned char* cur_entropy_ptr;
+ unsigned char* start_entropy_ptr;
+ unsigned char* end_entropy_ptr;
+ int entropy_bytes_processed;
+ int entropy_buf_maxsize;
+ int entropy_bytes_left;
+ int Prog_EndOfBlock_Run;
+
+ /* Input or output DIB. */
+ unsigned char* DIB_ptr;
+
+ /* Control. */
+ unsigned char unread_marker;
+ PROCESSOR_TYPE processor_type;
+ int cur_scan_comp;
+ IJL_HANDLE file;
+ unsigned char JPGBuffer [JBUFSIZE];
+
+} STATE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: FAST_MCU_PROCESSING_TYPE
+//
+// Purpose: Advanced Control Option. Do NOT modify.
+// WARNING: Used for internal reference only.
+//
+// Fields:
+//
+// IJL_(sampling)_(JPEG color space)_(sampling)_(DIB color space)
+// Decode is read left to right w/ upsampling.
+// Encode is read right to left w/ subsampling.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _FAST_MCU_PROCESSING_TYPE
+{
+ IJL_NO_CC_OR_US = 0,
+
+ IJL_111_YCBCR_111_RGB = 1,
+ IJL_111_YCBCR_111_BGR = 2,
+
+ IJL_411_YCBCR_111_RGB = 3,
+ IJL_411_YCBCR_111_BGR = 4,
+
+ IJL_422_YCBCR_111_RGB = 5,
+ IJL_422_YCBCR_111_BGR = 6,
+
+ IJL_111_YCBCR_1111_RGBA_FPX = 7,
+ IJL_411_YCBCR_1111_RGBA_FPX = 8,
+ IJL_422_YCBCR_1111_RGBA_FPX = 9,
+
+ IJL_1111_YCBCRA_FPX_1111_RGBA_FPX = 10,
+ IJL_4114_YCBCRA_FPX_1111_RGBA_FPX = 11,
+ IJL_4224_YCBCRA_FPX_1111_RGBA_FPX = 12,
+
+ IJL_111_RGB_1111_RGBA_FPX = 13,
+
+ IJL_1111_RGBA_FPX_1111_RGBA_FPX = 14,
+
+ IJL_111_OTHER_111_OTHER = 15,
+ IJL_411_OTHER_111_OTHER = 16,
+ IJL_422_OTHER_111_OTHER = 17,
+
+ IJL_YCBYCR_YCBCR = 18,
+
+ IJL_YCBCR_YCBYCR = 19 // decoding to YCbCr 422 format
+
+} FAST_MCU_PROCESSING_TYPE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: JPEG_PROPERTIES
+//
+// Purpose: Stores low-level and control information. It is used by
+// both the encoder and decoder. An advanced external user
+// may access this structure to expand the interface
+// capability.
+//
+// See the Developer's Guide for an expanded description
+// of this structure and its use.
+//
+// Context: Used by all interface methods and most IJL routines.
+//
+// Fields:
+//
+// iotype IN: Specifies type of data operation
+// (read/write/other) to be
+// performed by IJL_Read or IJL_Write.
+// roi IN: Rectangle-Of-Interest to read from, or
+// write to, in pixels.
+// dcttype IN: DCT alogrithm to be used.
+// fast_processing OUT: Supported fast pre/post-processing path.
+// This is set by the IJL.
+// interrupt IN: Signals an interrupt has been requested.
+//
+// DIBBytes IN: Pointer to buffer of uncompressed data.
+// DIBWidth IN: Width of uncompressed data.
+// DIBHeight IN: Height of uncompressed data.
+// DIBPadBytes IN: Padding (in bytes) at end of each
+// row in the uncompressed data.
+// DIBChannels IN: Number of components in the
+// uncompressed data.
+// DIBColor IN: Color space of uncompressed data.
+// DIBSubsampling IN: Required to be IJL_NONE or IJL_422.
+// DIBLineBytes OUT: Number of bytes in an output DIB line
+// including padding.
+//
+// JPGFile IN: Pointer to file based JPEG.
+// JPGBytes IN: Pointer to buffer based JPEG.
+// JPGSizeBytes IN: Max buffer size. Used with JPGBytes.
+// OUT: Number of compressed bytes written.
+// JPGWidth IN: Width of JPEG image.
+// OUT: After reading (except READHEADER).
+// JPGHeight IN: Height of JPEG image.
+// OUT: After reading (except READHEADER).
+// JPGChannels IN: Number of components in JPEG image.
+// OUT: After reading (except READHEADER).
+// JPGColor IN: Color space of JPEG image.
+// JPGSubsampling IN: Subsampling of JPEG image.
+// OUT: After reading (except READHEADER).
+// JPGThumbWidth OUT: JFIF embedded thumbnail width [0-255].
+// JPGThumbHeight OUT: JFIF embedded thumbnail height [0-255].
+//
+// cconversion_reqd OUT: If color conversion done on decode, TRUE.
+// upsampling_reqd OUT: If upsampling done on decode, TRUE.
+// jquality IN: [0-100] where highest quality is 100.
+// jinterleaveType IN/OUT: 0 => MCU interleaved file, and
+// 1 => 1 scan per component.
+// numxMCUs OUT: Number of MCUs in the x direction.
+// numyMCUs OUT: Number of MCUs in the y direction.
+//
+// nqtables IN/OUT: Number of quantization tables.
+// maxquantindex IN/OUT: Maximum index of quantization tables.
+// nhuffActables IN/OUT: Number of AC Huffman tables.
+// nhuffDctables IN/OUT: Number of DC Huffman tables.
+// maxhuffindex IN/OUT: Maximum index of Huffman tables.
+// jFmtQuant IN/OUT: Formatted quantization table info.
+// jFmtAcHuffman IN/OUT: Formatted AC Huffman table info.
+// jFmtDcHuffman IN/OUT: Formatted DC Huffman table info.
+//
+// jEncFmtQuant IN/OUT: Pointer to one of the above, or
+// to externally persisted table.
+// jEncFmtAcHuffman IN/OUT: Pointer to one of the above, or
+// to externally persisted table.
+// jEncFmtDcHuffman IN/OUT: Pointer to one of the above, or
+// to externally persisted table.
+//
+// use_default_qtables IN: Set to default quantization tables.
+// Clear to supply your own.
+// use_default_htables IN: Set to default Huffman tables.
+// Clear to supply your own.
+// rawquanttables IN: Up to 4 sets of quantization tables.
+// rawhufftables IN: Alternating pairs (DC/AC) of up to 4
+// sets of raw Huffman tables.
+// HuffIdentifierAC IN: Indicates what channel the user-
+// supplied Huffman AC tables apply to.
+// HuffIdentifierDC IN: Indicates what channel the user-
+// supplied Huffman DC tables apply to.
+//
+// jframe OUT: Structure with frame-specific info.
+// needframe OUT: TRUE when a frame has been detected.
+//
+// jscan Persistence for current scan pointer when
+// interrupted.
+//
+// state OUT: Contains info on the state of the IJL.
+// SawAdobeMarker OUT: Decoder saw an APP14 marker somewhere.
+// AdobeXform OUT: If SawAdobeMarker TRUE, this indicates
+// the JPEG color space given by that marker.
+//
+// rowoffsets Persistence for the decoder MCU row origins
+// when decoding by ROI. Offsets (in bytes
+// from the beginning of the entropy data)
+// to the start of each of the decoded rows.
+// Fill the offsets with -1 if they have not
+// been initalized and NULL could be the
+// offset to the first row.
+//
+// MCUBuf OUT: Quadword aligned internal buffer.
+// Big enough for the largest MCU
+// (10 blocks) with extra room for
+// additional operations.
+// tMCUBuf OUT: Version of above, without alignment.
+//
+// processor_type OUT: Determines type of processor found
+// during initialization.
+//
+// raw_coefs IN: Place to hold pointers to raw data buffers or
+// raw DCT coefficients buffers
+//
+// progressive_found OUT: 1 when progressive image detected.
+// coef_buffer IN: Pointer to a larger buffer containing
+// frequency coefficients when they
+// cannot be decoded dynamically
+// (i.e., as in progressive decoding).
+//
+// upsampling_type IN: Type of sampling:
+// IJL_BOX_FILTER or IJL_TRIANGLE_FILTER.
+// SAMPLING_STATE* OUT: pointer to structure, describing current
+// condition of upsampling
+//
+// AdobeVersion OUT version field, if Adobe APP14 marker detected
+// AdobeFlags0 OUT flags0 field, if Adobe APP14 marker detected
+// AdobeFlags1 OUT flags1 field, if Adobe APP14 marker detected
+//
+// jfif_app0_detected OUT: 1 - if JFIF APP0 marker detected,
+// 0 - if not
+// jfif_app0_version IN/OUT The JFIF file version
+// jfif_app0_units IN/OUT units for the X and Y densities
+// 0 - no units, X and Y specify
+// the pixel aspect ratio
+// 1 - X and Y are dots per inch
+// 2 - X and Y are dots per cm
+// jfif_app0_Xdensity IN/OUT horizontal pixel density
+// jfif_app0_Ydensity IN/OUT vertical pixel density
+//
+// jpeg_comment IN pointer to JPEG comments
+// jpeg_comment_size IN/OUT size of JPEG comments, in bytes
+//
+// raw_coefs IN/OUT if !NULL, then pointer to vector of pointers
+// (size = JPGChannels) to buffers for raw (short)
+// dct coefficients. 1 pointer corresponds to one
+// component;
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _JPEG_PROPERTIES
+{
+ /* Compression/Decompression control. */
+ IJLIOTYPE iotype; /* default = IJL_SETUP */
+ IJL_RECT roi; /* default = 0 */
+ DCTTYPE dcttype; /* default = IJL_AAN */
+ FAST_MCU_PROCESSING_TYPE fast_processing; /* default = IJL_NO_CC_OR_US */
+ int interrupt; /* default = FALSE */
+
+ /* DIB specific I/O data specifiers. */
+ unsigned char* DIBBytes; /* default = NULL */
+ int DIBWidth; /* default = 0 */
+ int DIBHeight; /* default = 0 */
+ int DIBPadBytes; /* default = 0 */
+ int DIBChannels; /* default = 3 */
+ IJL_COLOR DIBColor; /* default = IJL_BGR */
+ IJL_DIBSUBSAMPLING DIBSubsampling; /* default = IJL_NONE */
+ int DIBLineBytes; /* default = 0 */
+
+ /* JPEG specific I/O data specifiers. */
+ const char* JPGFile; /* default = NULL */
+ unsigned char* JPGBytes; /* default = NULL */
+ int JPGSizeBytes; /* default = 0 */
+ int JPGWidth; /* default = 0 */
+ int JPGHeight; /* default = 0 */
+ int JPGChannels; /* default = 3 */
+ IJL_COLOR JPGColor; /* default = IJL_YCBCR */
+ IJL_JPGSUBSAMPLING JPGSubsampling; /* default = IJL_411 */
+ int JPGThumbWidth; /* default = 0 */
+ int JPGThumbHeight; /* default = 0 */
+
+ /* JPEG conversion properties. */
+ int cconversion_reqd; /* default = TRUE */
+ int upsampling_reqd; /* default = TRUE */
+ int jquality; /* default = 75 */
+ int jinterleaveType; /* default = 0 */
+ int numxMCUs; /* default = 0 */
+ int numyMCUs; /* default = 0 */
+
+ /* Tables. */
+ int nqtables;
+ int maxquantindex;
+ int nhuffActables;
+ int nhuffDctables;
+ int maxhuffindex;
+
+ QUANT_TABLE jFmtQuant[4];
+ HUFFMAN_TABLE jFmtAcHuffman[4];
+ HUFFMAN_TABLE jFmtDcHuffman[4];
+
+ short* jEncFmtQuant[4];
+ HUFFMAN_TABLE* jEncFmtAcHuffman[4];
+ HUFFMAN_TABLE* jEncFmtDcHuffman[4];
+
+ /* Allow user-defined tables. */
+ int use_external_qtables;
+ int use_external_htables;
+
+ JPEGQuantTable rawquanttables[4];
+ JPEGHuffTable rawhufftables[8];
+ char HuffIdentifierAC[4];
+ char HuffIdentifierDC[4];
+
+ /* Frame specific members. */
+ FRAME jframe;
+ int needframe;
+
+ /* SCAN persistent members. */
+ SCAN* jscan;
+
+ /* State members. */
+ STATE state;
+ int SawAdobeMarker;
+ int AdobeXform;
+
+ /* ROI decoder members. */
+ ENTROPYSTRUCT* rowoffsets;
+
+ /* Intermediate buffers. */
+ unsigned char* MCUBuf;
+ unsigned char tMCUBuf[720*2];
+
+ /* Processor detected. */
+ PROCESSOR_TYPE processor_type;
+
+ RAW_DATA_TYPES_STATE* raw_coefs;
+
+ /* Progressive mode members. */
+ int progressive_found;
+ short* coef_buffer;
+
+ /* Upsampling mode members. */
+ UPSAMPLING_TYPE upsampling_type;
+ SAMPLING_STATE* sampling_state_ptr;
+
+ /* Adobe APP14 segment variables */
+ unsigned short AdobeVersion; /* default = 100 */
+ unsigned short AdobeFlags0; /* default = 0 */
+ unsigned short AdobeFlags1; /* default = 0 */
+
+ /* JFIF APP0 segment variables */
+ int jfif_app0_detected;
+ unsigned short jfif_app0_version; /* default = 0x0101 */
+ unsigned char jfif_app0_units; /* default = 0 - pixel */
+ unsigned short jfif_app0_Xdensity; /* default = 1 */
+ unsigned short jfif_app0_Ydensity; /* default = 1 */
+
+ /* comments related fields */
+ char* jpeg_comment; /* default = NULL */
+ unsigned short jpeg_comment_size; /* default = 0 */
+
+} JPEG_PROPERTIES;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: JPEG_CORE_PROPERTIES
+//
+// Purpose: This is the primary data structure between the IJL and
+// the external user. It stores JPEG state information
+// and controls the IJL. It is user-modifiable.
+//
+// See the Developer's Guide for details on appropriate usage.
+//
+// Context: Used by all low-level IJL routines to store
+// pseudo-global information.
+//
+// Fields:
+//
+// UseJPEGPROPERTIES Set this flag != 0 if you wish to override
+// the JPEG_CORE_PROPERTIES "IN" parameters with
+// the JPEG_PROPERTIES parameters.
+//
+// DIBBytes IN: Pointer to buffer of uncompressed data.
+// DIBWidth IN: Width of uncompressed data.
+// DIBHeight IN: Height of uncompressed data.
+// DIBPadBytes IN: Padding (in bytes) at end of each
+// row in the uncompressed data.
+// DIBChannels IN: Number of components in the
+// uncompressed data.
+// DIBColor IN: Color space of uncompressed data.
+// DIBSubsampling IN: Required to be IJL_NONE or IJL_422.
+//
+// JPGFile IN: Pointer to file based JPEG.
+// JPGBytes IN: Pointer to buffer based JPEG.
+// JPGSizeBytes IN: Max buffer size. Used with JPGBytes.
+// OUT: Number of compressed bytes written.
+// JPGWidth IN: Width of JPEG image.
+// OUT: After reading (except READHEADER).
+// JPGHeight IN: Height of JPEG image.
+// OUT: After reading (except READHEADER).
+// JPGChannels IN: Number of components in JPEG image.
+// OUT: After reading (except READHEADER).
+// JPGColor IN: Color space of JPEG image.
+// JPGSubsampling IN: Subsampling of JPEG image.
+// OUT: After reading (except READHEADER).
+// JPGThumbWidth OUT: JFIF embedded thumbnail width [0-255].
+// JPGThumbHeight OUT: JFIF embedded thumbnail height [0-255].
+//
+// cconversion_reqd OUT: If color conversion done on decode, TRUE.
+// upsampling_reqd OUT: If upsampling done on decode, TRUE.
+// jquality IN: [0-100] where highest quality is 100.
+//
+// jprops "Low-Level" IJL data structure.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _JPEG_CORE_PROPERTIES
+{
+ int UseJPEGPROPERTIES; /* default = 0 */
+
+ /* DIB specific I/O data specifiers. */
+ unsigned char* DIBBytes; /* default = NULL */
+ int DIBWidth; /* default = 0 */
+ int DIBHeight; /* default = 0 */
+ int DIBPadBytes; /* default = 0 */
+ int DIBChannels; /* default = 3 */
+ IJL_COLOR DIBColor; /* default = IJL_BGR */
+ IJL_DIBSUBSAMPLING DIBSubsampling; /* default = IJL_NONE */
+
+ /* JPEG specific I/O data specifiers. */
+ const char* JPGFile; /* default = NULL */
+ unsigned char* JPGBytes; /* default = NULL */
+ int JPGSizeBytes; /* default = 0 */
+ int JPGWidth; /* default = 0 */
+ int JPGHeight; /* default = 0 */
+ int JPGChannels; /* default = 3 */
+ IJL_COLOR JPGColor; /* default = IJL_YCBCR */
+ IJL_JPGSUBSAMPLING JPGSubsampling; /* default = IJL_411 */
+ int JPGThumbWidth; /* default = 0 */
+ int JPGThumbHeight; /* default = 0 */
+
+ /* JPEG conversion properties. */
+ int cconversion_reqd; /* default = TRUE */
+ int upsampling_reqd; /* default = TRUE */
+ int jquality; /* default = 75 */
+
+ /* Low-level properties. */
+ JPEG_PROPERTIES jprops;
+
+} JPEG_CORE_PROPERTIES;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name: IJLERR
+//
+// Purpose: Listing of possible "error" codes returned by the IJL.
+//
+// See the Developer's Guide for details on appropriate usage.
+//
+// Context: Used for error checking.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _IJLERR
+{
+ /* The following "error" values indicate an "OK" condition. */
+ IJL_OK = 0,
+ IJL_INTERRUPT_OK = 1,
+ IJL_ROI_OK = 2,
+
+ /* The following "error" values indicate an error has occurred. */
+ IJL_EXCEPTION_DETECTED = -1,
+ IJL_INVALID_ENCODER = -2,
+ IJL_UNSUPPORTED_SUBSAMPLING = -3,
+ IJL_UNSUPPORTED_BYTES_PER_PIXEL = -4,
+ IJL_MEMORY_ERROR = -5,
+ IJL_BAD_HUFFMAN_TABLE = -6,
+ IJL_BAD_QUANT_TABLE = -7,
+ IJL_INVALID_JPEG_PROPERTIES = -8,
+ IJL_ERR_FILECLOSE = -9,
+ IJL_INVALID_FILENAME = -10,
+ IJL_ERROR_EOF = -11,
+ IJL_PROG_NOT_SUPPORTED = -12,
+ IJL_ERR_NOT_JPEG = -13,
+ IJL_ERR_COMP = -14,
+ IJL_ERR_SOF = -15,
+ IJL_ERR_DNL = -16,
+ IJL_ERR_NO_HUF = -17,
+ IJL_ERR_NO_QUAN = -18,
+ IJL_ERR_NO_FRAME = -19,
+ IJL_ERR_MULT_FRAME = -20,
+ IJL_ERR_DATA = -21,
+ IJL_ERR_NO_IMAGE = -22,
+ IJL_FILE_ERROR = -23,
+ IJL_INTERNAL_ERROR = -24,
+ IJL_BAD_RST_MARKER = -25,
+ IJL_THUMBNAIL_DIB_TOO_SMALL = -26,
+ IJL_THUMBNAIL_DIB_WRONG_COLOR = -27,
+ IJL_BUFFER_TOO_SMALL = -28,
+ IJL_UNSUPPORTED_FRAME = -29,
+ IJL_ERR_COM_BUFFER = -30,
+ IJL_RESERVED = -99
+
+} IJLERR;
+
+
+
+
+/* /////////////////////////////////////////////////////////////////////////
+// Function Prototypes (API Calls) //
+///////////////////////////////////////////////////////////////////////// */
+
+
+/*F*
+////////////////////////////////////////////////////////////////////////////
+// Name: ijlInit
+//
+// Purpose: Used to initalize the IJL.
+//
+// See the Developer's Guide for details on appropriate usage.
+//
+// Context: Always call this before anything else.
+// Also, only call this with a new jcprops structure, or
+// after calling IJL_Free. Otherwise, dynamically
+// allocated memory may be leaked.
+//
+// Returns: Any IJLERR value. IJL_OK indicates success.
+//
+// Parameters:
+// jcprops Pointer to an externally allocated
+// JPEG_CORE_PROPERTIES structure.
+//
+////////////////////////////////////////////////////////////////////////////
+*F*/
+
+IJLAPI(IJLERR, ijlInit, ( JPEG_CORE_PROPERTIES* jcprops ));
+
+
+/*F*
+////////////////////////////////////////////////////////////////////////////
+// Name: ijlFree
+//
+// Purpose: Used to properly close down the IJL.
+//
+// See the Developer's Guide for details on appropriate usage.
+//
+// Context: Always call this when done using the IJL to perform
+// clean-up of dynamically allocated memory.
+// Note, IJL_Init will have to be called to use the
+// IJL again.
+//
+// Returns: Any IJLERR value. IJL_OK indicates success.
+//
+// Parameters:
+// jcprops Pointer to an externally allocated
+// JPEG_CORE_PROPERTIES structure.
+//
+////////////////////////////////////////////////////////////////////////////
+*F*/
+
+IJLAPI(IJLERR, ijlFree, ( JPEG_CORE_PROPERTIES* jcprops ));
+
+
+/*F*
+////////////////////////////////////////////////////////////////////////////
+// Name: IJL_Read
+//
+// Purpose: Used to read JPEG data (entropy, or header, or both) into
+// a user-supplied buffer (to hold the image data) and/or
+// into the JPEG_CORE_PROPERTIES structure (to hold the
+// header info).
+//
+// Context: See the Developer's Guide for a detailed description
+// on the use of this function. The jcprops main data
+// members are checked for consistency.
+//
+// Returns: Any IJLERR value. IJL_OK indicates success.
+//
+// Parameters:
+// jcprops Pointer to an externally allocated
+// JPEG_CORE_PROPERTIES structure.
+// iotype Specifies what type of read operation to perform.
+//
+////////////////////////////////////////////////////////////////////////////
+*F*/
+
+IJLAPI(IJLERR, ijlRead, ( JPEG_CORE_PROPERTIES* jcprops, IJLIOTYPE iotype ));
+
+
+/*F*
+////////////////////////////////////////////////////////////////////////////
+// Name: ijlWrite
+//
+// Purpose: Used to write JPEG data (entropy, or header, or both) into
+// a user-supplied buffer (to hold the image data) and/or
+// into the JPEG_CORE_PROPERTIES structure (to hold the
+// header info).
+//
+// Context: See the Developer's Guide for a detailed description
+// on the use of this function. The jcprops main data
+// members are checked for consistency.
+//
+// Returns: Any IJLERR value. IJL_OK indicates success.
+//
+// Parameters:
+// jcprops Pointer to an externally allocated
+// JPEG_CORE_PROPERTIES structure.
+// iotype Specifies what type of write operation to perform.
+//
+////////////////////////////////////////////////////////////////////////////
+*F*/
+
+IJLAPI(IJLERR, ijlWrite, ( JPEG_CORE_PROPERTIES* jcprops, IJLIOTYPE iotype ));
+
+
+/*F*
+////////////////////////////////////////////////////////////////////////////
+// Name: ijlGetLibVersion
+//
+// Purpose: To identify the version number of the IJL.
+//
+// Context: Call to get the IJL version number.
+//
+// Returns: pointer to IJLibVersion struct
+//
+// Parameters: none
+//
+////////////////////////////////////////////////////////////////////////////
+*F*/
+
+IJLAPI(const IJLibVersion*, ijlGetLibVersion, (void));
+
+
+/*F*
+////////////////////////////////////////////////////////////////////////////
+// Name: ijlErrorStr
+//
+// Purpose: Gets the string to describe error code.
+//
+// Context: Is called to get descriptive string on arbitrary IJLERR code.
+//
+// Returns: pointer to string
+//
+// Parameters: IJLERR - IJL error code
+//
+////////////////////////////////////////////////////////////////////////////
+*F*/
+
+IJLAPI(const char*, ijlErrorStr, (IJLERR code));
+
+
+
+
+#if defined( __cplusplus )
+}
+#endif
+
+#endif /* __IJL_H__ */
diff --git a/src/terralib/kernel/jpeg.cpp b/src/terralib/kernel/jpeg.cpp
new file mode 100644
index 0000000..e183bfe
--- /dev/null
+++ b/src/terralib/kernel/jpeg.cpp
@@ -0,0 +1,452 @@
+//** JPEG.CPP, the code used to wrap IJL
+
+
+//############################################################################
+//## ##
+//## JPEG.CPP ##
+//## ##
+//## Wrapper class to load a jpeg from a block of memory. ##
+//## ##
+//## OpenSourced 2/4/2000 by John W. Ratcliff ##
+//## ##
+//## No warranty expressed or implied. Released as part of the triangle ##
+//## throughput testbed project. ##
+//############################################################################
+//## ##
+//## Contact John W. Ratcliff at jratcliff at verant.com ##
+//############################################################################
+#include "jpeg.h"
+#include "ijl.h" // intel jpeg library header file.
+
+// read image parameters.
+bool Jpeg::ReadFileParams(int &width,
+ int &height,
+ int &nchannels,
+ char *name)
+{
+ JPEG_CORE_PROPERTIES jcprops;
+
+ if ( ijlInit(&jcprops) != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return false;
+ }
+
+ jcprops.JPGFile = name;
+
+ if ( ijlRead(&jcprops,IJL_JFILE_READPARAMS) != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return false;
+ }
+
+ width = jcprops.JPGWidth;
+ height = jcprops.JPGHeight;
+ nchannels = jcprops.JPGChannels;
+ return true;
+}
+
+// read image file into this buffer.
+bool Jpeg::ReadFile(int width,
+ int height,
+ int nchannels,
+ char *name,
+ unsigned char *pixbuff)
+{
+ JPEG_CORE_PROPERTIES jcprops;
+
+ if ( ijlInit(&jcprops) != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return false;
+ }
+
+ jcprops.JPGFile = name;
+
+ IJLIOTYPE mode;
+
+ mode = IJL_JFILE_READWHOLEIMAGE;
+
+ jcprops.DIBWidth = width;
+ jcprops.DIBHeight = height;
+ jcprops.JPGWidth = width;
+ jcprops.JPGHeight = height;
+ jcprops.DIBChannels = nchannels;
+ jcprops.JPGChannels = nchannels;
+
+ jcprops.DIBPadBytes = 0;
+ jcprops.DIBBytes = (unsigned char *)pixbuff;
+
+ if ( jcprops.JPGChannels == 3 )
+ {
+ jcprops.DIBColor = IJL_RGB;
+ jcprops.JPGColor = IJL_YCBCR;
+ jcprops.JPGSubsampling = IJL_411;
+ jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+ }
+ else
+ {
+ jcprops.DIBColor = IJL_G;
+ jcprops.JPGColor = IJL_G;
+ jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
+ jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+ }
+
+ if ( ijlRead(&jcprops, mode) != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return false;
+ }
+
+ if ( ijlFree(&jcprops) != IJL_OK ) return false;
+
+ return true;
+}
+
+// read image into this buffer.
+void * Jpeg::ReadImage(int &width,
+ int &height,
+ int &nchannels,
+ const void *buffer,
+ int sizebytes)
+{
+ JPEG_CORE_PROPERTIES jcprops;
+
+ _IJLERR res;
+
+ res = ijlInit(&jcprops);
+ if ( res != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return 0;
+ }
+
+ jcprops.JPGBytes = (unsigned char *) buffer;
+ jcprops.JPGSizeBytes = sizebytes;
+ jcprops.jquality = 100;
+
+ res = ijlRead(&jcprops,IJL_JBUFF_READPARAMS);
+ if ( res != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return 0;
+ }
+
+ width = jcprops.JPGWidth;
+ height = jcprops.JPGHeight;
+ IJLIOTYPE mode;
+
+ mode = IJL_JBUFF_READWHOLEIMAGE;
+ nchannels = jcprops.JPGChannels;
+ unsigned char * pixbuff = new unsigned char[width*height*nchannels];
+ if ( !pixbuff )
+ {
+ ijlFree(&jcprops);
+ return 0;
+ }
+
+ jcprops.DIBWidth = width;
+ jcprops.DIBHeight = height;
+ jcprops.DIBChannels = nchannels;
+ jcprops.DIBPadBytes = 0;
+ jcprops.DIBBytes = (unsigned char *)pixbuff;
+
+ if ( jcprops.JPGChannels == 3 )
+ {
+ jcprops.DIBColor = IJL_RGB;
+ jcprops.JPGColor = IJL_YCBCR;
+ jcprops.JPGSubsampling = IJL_411;
+ jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+ }
+ else
+ {
+ jcprops.DIBColor = IJL_G;
+ jcprops.JPGColor = IJL_G;
+ jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
+ jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+ }
+
+
+ res = ijlRead(&jcprops, mode);
+ if (res != IJL_OK )
+ {
+ const char* desc = ijlErrorStr(res);
+ ijlFree(&jcprops);
+ return 0;
+ }
+
+ if ( ijlFree(&jcprops) != IJL_OK ) return 0;
+
+ return (void *)pixbuff;
+}
+
+
+void* Jpeg::Compress(const void *source,
+ int width,
+ int height,
+ int bpp,
+ int &len,
+ int quality)
+{
+ JPEG_CORE_PROPERTIES jcprops;
+
+ if ( ijlInit(&jcprops) != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return 0;
+ }
+
+ jcprops.DIBWidth = width;
+ jcprops.DIBHeight = height;
+ jcprops.JPGWidth = width;
+ jcprops.JPGHeight = height;
+ jcprops.DIBBytes = (unsigned char *) source;
+ jcprops.DIBPadBytes = 0;
+ jcprops.DIBChannels = bpp;
+ jcprops.JPGChannels = bpp;
+
+ if ( bpp == 3 )
+ {
+ jcprops.DIBColor = IJL_RGB;
+ jcprops.JPGColor = IJL_YCBCR;
+ jcprops.JPGSubsampling = IJL_411;
+ jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+ }
+ else
+ {
+ jcprops.DIBColor = IJL_G;
+ jcprops.JPGColor = IJL_G;
+ jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
+ jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+ }
+
+ int size = width*height*bpp;
+
+ unsigned char * buffer = new unsigned char[size];
+
+ jcprops.JPGSizeBytes = size;
+ jcprops.JPGBytes = buffer;
+
+ jcprops.jquality = quality;
+
+
+ if ( ijlWrite(&jcprops,IJL_JBUFF_WRITEWHOLEIMAGE) != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ delete buffer;
+ return 0;
+ }
+
+
+ if ( ijlFree(&jcprops) != IJL_OK )
+ {
+ delete buffer;
+ return 0;
+ }
+
+ len = jcprops.JPGSizeBytes;
+ return buffer;
+}
+
+bool Jpeg::WriteFile(const void *source,
+ int width,
+ int height,
+ int bpp,
+ char *name,
+ int quality)
+{
+ JPEG_CORE_PROPERTIES jcprops;
+
+ if ( ijlInit(&jcprops) != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return false;
+ }
+
+ jcprops.JPGFile = name;
+ jcprops.DIBWidth = width;
+ jcprops.DIBHeight = height;
+ jcprops.JPGWidth = width;
+ jcprops.JPGHeight = height;
+ jcprops.DIBBytes = (unsigned char *) source;
+ jcprops.DIBPadBytes = 0;
+ jcprops.DIBChannels = bpp;
+ jcprops.JPGChannels = bpp;
+
+ if ( bpp == 3 )
+ {
+ jcprops.DIBColor = IJL_RGB;
+ jcprops.JPGColor = IJL_YCBCR;
+ jcprops.JPGSubsampling = IJL_411;
+ jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+ }
+ else
+ {
+ jcprops.DIBColor = IJL_G;
+ jcprops.JPGColor = IJL_G;
+ jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
+ jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+ }
+
+ jcprops.jquality = quality;
+
+ IJLERR error;
+ error = ijlWrite(&jcprops,IJL_JFILE_WRITEWHOLEIMAGE);
+ if ( error != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return false;
+ }
+
+
+ if ( ijlFree(&jcprops) != IJL_OK )
+ return false;
+
+ return true;
+}
+
+bool Jpeg::Compress(const void *source,
+ unsigned char *dest,
+ int width,
+ int height,
+ int bpp,
+ unsigned long &len,
+ int quality)
+{
+
+ if (!source || ! dest)
+ return false;
+
+ JPEG_CORE_PROPERTIES jcprops;
+
+ if ( ijlInit(&jcprops) != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return false;
+ }
+
+ jcprops.DIBWidth = width;
+ jcprops.DIBHeight = height;
+ jcprops.JPGWidth = width;
+ jcprops.JPGHeight = height;
+ jcprops.DIBBytes = (unsigned char *) source;
+ jcprops.DIBPadBytes = 0;
+ jcprops.DIBChannels = bpp;
+ jcprops.JPGChannels = bpp;
+
+ if ( bpp == 3 )
+ {
+ jcprops.DIBColor = IJL_RGB;
+ jcprops.JPGColor = IJL_YCBCR;
+ jcprops.JPGSubsampling = IJL_411;
+ jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+ }
+ else
+ {
+ jcprops.DIBColor = IJL_G;
+ jcprops.JPGColor = IJL_G;
+ jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
+ jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+ }
+
+ int size = width*height*bpp;
+
+ jcprops.JPGSizeBytes = size;
+ jcprops.JPGBytes = dest;
+
+ jcprops.jquality = quality;
+
+
+ if ( ijlWrite(&jcprops,IJL_JBUFF_WRITEWHOLEIMAGE) != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return false;
+ }
+
+
+ if ( ijlFree(&jcprops) != IJL_OK )
+ {
+ return false;
+ }
+
+ len = jcprops.JPGSizeBytes;
+ return true;
+}
+
+
+
+// read image into this buffer.
+bool Jpeg::ReadImage(int &width,
+ int &height,
+ int &nchannels,
+ const void *buffer,
+ long sizebytes,
+ unsigned char* dest)
+{
+
+ if (!dest || !buffer)
+ return false;
+
+ JPEG_CORE_PROPERTIES jcprops;
+
+ _IJLERR res;
+
+ res = ijlInit(&jcprops);
+ if ( res != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return 0;
+ }
+
+ jcprops.JPGBytes = (unsigned char *) buffer;
+ jcprops.JPGSizeBytes = sizebytes;
+ jcprops.jquality = 100;
+
+ res = ijlRead(&jcprops,IJL_JBUFF_READPARAMS);
+ if ( res != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return 0;
+ }
+
+ width = jcprops.JPGWidth;
+ height = jcprops.JPGHeight;
+ IJLIOTYPE mode;
+
+ mode = IJL_JBUFF_READWHOLEIMAGE;
+ nchannels = jcprops.JPGChannels;
+
+ jcprops.DIBWidth = width;
+ jcprops.DIBHeight = height;
+ jcprops.DIBChannels = nchannels;
+ jcprops.DIBPadBytes = 0;
+ jcprops.DIBBytes = (unsigned char *)dest;
+
+ if ( jcprops.JPGChannels == 3 )
+ {
+ jcprops.DIBColor = IJL_RGB;
+ jcprops.JPGColor = IJL_YCBCR;
+ jcprops.JPGSubsampling = IJL_411;
+ jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+ }
+ else
+ {
+ jcprops.DIBColor = IJL_G;
+ jcprops.JPGColor = IJL_G;
+ jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
+ jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+ }
+
+
+ res = ijlRead(&jcprops, mode);
+ if (res != IJL_OK )
+ {
+ ijlFree(&jcprops);
+ return 0;
+ }
+
+ if ( ijlFree(&jcprops) != IJL_OK ) return 0;
+
+ return true;
+}
+
diff --git a/src/terralib/kernel/jpeg.h b/src/terralib/kernel/jpeg.h
new file mode 100644
index 0000000..e0ac8f7
--- /dev/null
+++ b/src/terralib/kernel/jpeg.h
@@ -0,0 +1,95 @@
+/*Intel Corporation has released a number of extremely useful libraries and tools as part
+of their performance suite. These tools are designed to assist developers in taking
+advantage of their advanced processors.
+
+One excellent tool is the Intel Jpeg Library which provides a single small DLL which
+will rapidly compress and decompress Jpeg images, a common graphics file format.
+
+The following code snippet provides a static wrapper class for this library. The
+only thing you need besides this code snippet is IJL.H, IJL.LIB, IJL.DLL which can
+be found at the following URL.
+
+
+http://www-cs.intel.com/support/performancetools/libraries/ijl/index.htm
+
+When you see the quantity of code required just to compress or decompress a JPEG image
+using IJL I think you will see the value of the following simplified wrapper layer.
+
+John W. Ratcliff
+jratcliff at verant.com
+*/
+//*** The JPEG.H wrapper layer header file.
+
+#ifndef JPEG_H
+#define JPEG_H
+
+//############################################################################
+//## ##
+//## JPEG.H ##
+//## ##
+//## Wrapper class to compress or decompress a jpeg from a block of memory ##
+//## using the Intel Jpeg Library. ##
+//## OpenSourced 2/4/2000 by John W. Ratcliff ##
+//## ##
+//## No warranty expressed or implied. Released as part of the triangle ##
+//## throughput testbed project. ##
+//############################################################################
+//## ##
+//## Contact John W. Ratcliff at jratcliff at verant.com ##
+//############################################################################
+
+class Jpeg
+{
+public:
+
+ static bool ReadFileParams(int &width,
+ int &height,
+ int &nchannels,
+ char *name);
+
+ static bool ReadFile(int width,
+ int height,
+ int nchannels,
+ char *name,
+ unsigned char *pixbuff);
+
+ static void *ReadImage(int &width, // width of the image loaded.
+ int &height, // height of the image loaded.
+ int &bpp, // BYTES (not bits) PER PIXEL.
+ const void *buffer, // memory address containing jpeg compressed data.
+ int sizebytes); // size of jpeg compressed data.
+
+
+ static void * Compress(const void *buffer, // address of image in memory
+ int width, // width of image in pixels
+ int height, // height of image in pixels.
+ int bpp, // *BYTES* per pixel of image 1 or 3
+ int &len, // returns length of compressed data
+ int quality=75); // image quality as a percentage
+
+ static bool WriteFile(const void *buffer, // address of image in memory
+ int width, // width of image in pixels
+ int height, // height of image in pixels.
+ int bpp, // *BYTES* per pixel of image 1 or 3
+ char *name,
+ int quality=75); // image quality as a percentage
+
+ static bool Compress(const void *source, // address of image in memory
+ unsigned char *dest, // buffer to hold the compressed image
+ int width, // width of image in pixels
+ int height, // height of image in pixels
+ int bpp, // *BYTES* per pixel of image 1 or 3
+ unsigned long &len, // returns length of compressed data
+ int quality=75); // image quality as a percentage
+
+ static bool ReadImage(int &width, // width of the image loaded.
+ int &height, // height of the image loaded.
+ int &bpp, // BYTES (not bits) PER PIXEL.
+ const void *buffer, // memory address containing jpeg compressed data.
+ long sizebytes, // size of jpeg compressed data.
+ unsigned char* dest); // buffer to hold the uncompressed image
+
+};
+
+#endif
+
diff --git a/src/terralib/kernel/lexTemporal.cpp b/src/terralib/kernel/lexTemporal.cpp
new file mode 100644
index 0000000..4791b83
--- /dev/null
+++ b/src/terralib/kernel/lexTemporal.cpp
@@ -0,0 +1,1922 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /home/terralib/src/terralib/kernel/lexTemporal.cpp,v 1.5 2004/11/12 18:32:46 juan Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <errno.h>
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator). This
+ * avoids problems with code like:
+ *
+ * if ( condition_holds )
+ * yyless( 5 );
+ * else
+ * do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ *yy_cp = yy_hold_char; \
+ YY_RESTORE_YY_MORE_OFFSET \
+ yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+ };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! yy_current_buffer ) \
+ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ yy_current_buffer->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! yy_current_buffer ) \
+ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ yy_current_buffer->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define YY_USES_REJECT
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern int yylineno;
+int yylineno = 1;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ yytext_ptr = yy_bp; \
+ yyleng = (int) (yy_cp - yy_bp); \
+ yy_hold_char = *yy_cp; \
+ *yy_cp = '\0'; \
+ yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 35
+#define YY_END_OF_BUFFER 36
+static yyconst short int yy_acclist[257] =
+ { 0,
+ 36, 34, 35, 1, 2, 34, 35, 33, 35, 2,
+ 34, 35, 3, 34, 35, 4, 34, 35, 34, 35,
+ 23, 34, 35, 34, 35, 34, 35, 26, 34, 35,
+ 34, 35, 34, 35, 34, 35, 1, 3, 4, 31,
+ 32, 23, 30, 30, 26, 30, 26, 30, 30, 27,
+ 30, 30, 28, 30, 26, 30, 26, 30, 26, 30,
+ 29, 30, 30, 30, 30, 30, 30, 30, 30, 26,
+ 30, 26, 30, 26, 30, 26, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 24, 26, 30, 26, 30,
+ 26, 30, 26, 30, 26, 30, 16, 30, 30, 30,
+
+ 30, 30, 30, 30, 30, 30, 24, 26, 30, 26,
+ 30, 26, 30, 26, 30, 26, 30, 26, 30, 30,
+ 15, 30, 30, 30, 30, 30, 30, 30, 18, 30,
+ 24, 26, 30, 26, 30, 26, 30, 26, 30, 26,
+ 30, 26, 30, 30, 30, 17, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 26, 30, 26,
+ 30, 26, 30, 26, 30, 26, 30, 30, 30, 14,
+ 30, 21, 30, 13, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 26, 30, 26, 30, 26, 30,
+ 26, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+
+ 30, 30, 30, 26, 30, 26, 30, 26, 30, 30,
+ 30, 30, 30, 30, 11, 30, 30, 30, 30, 30,
+ 30, 25, 25, 26, 30, 26, 30, 19, 30, 20,
+ 30, 7, 30, 30, 30, 5, 30, 8, 30, 30,
+ 30, 30, 26, 30, 6, 30, 9, 30, 30, 12,
+ 30, 22, 30, 30, 10, 30
+ } ;
+
+static yyconst short int yy_accept[189] =
+ { 0,
+ 1, 1, 1, 2, 4, 8, 10, 13, 16, 19,
+ 21, 24, 26, 28, 31, 33, 35, 37, 38, 39,
+ 40, 41, 42, 42, 43, 44, 45, 47, 49, 50,
+ 52, 53, 53, 55, 57, 59, 61, 63, 64, 65,
+ 66, 67, 68, 69, 70, 70, 72, 74, 76, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 89,
+ 91, 93, 95, 97, 99, 100, 101, 102, 103, 104,
+ 105, 106, 107, 107, 108, 110, 112, 114, 116, 118,
+ 120, 121, 123, 124, 125, 126, 127, 128, 129, 131,
+ 131, 132, 134, 136, 138, 140, 142, 144, 145, 146,
+
+ 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,
+ 158, 158, 158, 160, 162, 164, 166, 168, 169, 170,
+ 172, 174, 176, 177, 178, 179, 180, 181, 182, 183,
+ 184, 185, 185, 185, 187, 189, 191, 193, 194, 195,
+ 196, 197, 198, 199, 200, 201, 202, 203, 204, 204,
+ 204, 206, 208, 210, 211, 212, 213, 214, 215, 217,
+ 218, 219, 220, 221, 222, 223, 224, 226, 228, 230,
+ 232, 234, 235, 236, 238, 240, 241, 242, 243, 245,
+ 247, 249, 250, 252, 254, 255, 257, 257
+ } ;
+
+static yyconst int yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 1, 1, 1, 1, 1, 1, 5,
+ 6, 7, 1, 1, 1, 1, 8, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 10, 1, 1,
+ 1, 1, 1, 1, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 27, 28, 29, 30, 31, 32, 33, 20, 34, 20,
+ 1, 1, 1, 1, 35, 1, 20, 20, 20, 20,
+
+ 36, 20, 20, 20, 20, 20, 20, 20, 37, 20,
+ 20, 20, 20, 20, 38, 20, 20, 20, 20, 20,
+ 20, 20, 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, 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, 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, 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
+ } ;
+
+static yyconst int yy_meta[39] =
+ { 0,
+ 1, 1, 2, 1, 1, 1, 1, 1, 3, 1,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3
+ } ;
+
+static yyconst short int yy_base[190] =
+ { 0,
+ 0, 0, 242, 581, 239, 581, 581, 234, 232, 32,
+ 33, 213, 0, 29, 209, 205, 195, 228, 224, 222,
+ 581, 581, 217, 36, 0, 211, 54, 79, 194, 0,
+ 103, 40, 0, 124, 149, 185, 0, 211, 195, 31,
+ 204, 199, 202, 200, 205, 173, 198, 175, 222, 175,
+ 177, 182, 181, 40, 181, 188, 190, 191, 247, 272,
+ 161, 296, 160, 172, 167, 163, 163, 163, 165, 174,
+ 167, 157, 175, 173, 143, 321, 142, 345, 141, 370,
+ 161, 0, 146, 157, 149, 149, 398, 146, 0, 45,
+ 50, 132, 131, 414, 130, 439, 128, 28, 150, 0,
+
+ 140, 146, 143, 142, 125, 46, 140, 122, 122, 135,
+ 141, 140, 110, 108, 464, 107, 489, 129, 128, 0,
+ 0, 0, 111, 124, 111, 121, 103, 116, 115, 118,
+ 94, 55, 65, 89, 87, 514, 86, 108, 111, 105,
+ 94, 99, 86, 103, 82, 83, 82, 94, 98, 97,
+ 67, 66, 539, 82, 73, 72, 71, 74, 0, 74,
+ 66, 72, 60, 78, 78, 69, 48, 47, 0, 0,
+ 0, 69, 65, 0, 0, 70, 51, 48, 33, 0,
+ 0, 43, 0, 0, 28, 0, 581, 43, 577
+ } ;
+
+static yyconst short int yy_def[190] =
+ { 0,
+ 187, 1, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 188, 188, 188, 188, 188, 188, 187, 187, 187,
+ 187, 187, 187, 187, 188, 188, 188, 14, 188, 188,
+ 188, 187, 188, 188, 27, 35, 188, 188, 188, 188,
+ 188, 188, 188, 188, 187, 188, 34, 47, 47, 188,
+ 188, 188, 188, 188, 188, 188, 188, 189, 188, 46,
+ 60, 60, 62, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 187, 189, 59, 59, 76, 76, 78, 78,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 187,
+ 189, 76, 76, 76, 94, 94, 96, 188, 188, 188,
+
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 187, 187, 94, 94, 94, 115, 115, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 187, 187, 115, 115, 115, 136, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 187, 187,
+ 136, 136, 136, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 187, 187, 153, 153, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 0, 187, 187
+ } ;
+
+static yyconst short int yy_nxt[620] =
+ { 0,
+ 4, 5, 6, 7, 8, 9, 4, 10, 11, 4,
+ 12, 13, 13, 14, 13, 13, 13, 14, 13, 13,
+ 13, 13, 14, 15, 16, 13, 13, 13, 14, 17,
+ 13, 13, 13, 14, 4, 13, 14, 13, 21, 22,
+ 23, 24, 27, 23, 24, 25, 27, 45, 32, 52,
+ 68, 27, 69, 90, 111, 53, 186, 27, 91, 112,
+ 118, 119, 27, 132, 149, 27, 28, 34, 185, 126,
+ 179, 34, 127, 133, 150, 184, 34, 166, 149, 183,
+ 182, 181, 34, 180, 179, 167, 165, 34, 178, 177,
+ 34, 35, 36, 176, 175, 174, 36, 173, 172, 171,
+
+ 170, 36, 169, 167, 151, 166, 165, 36, 164, 163,
+ 162, 161, 36, 160, 159, 36, 38, 158, 157, 156,
+ 39, 155, 154, 153, 151, 40, 134, 148, 147, 146,
+ 145, 41, 42, 144, 143, 43, 44, 46, 142, 141,
+ 140, 46, 139, 138, 136, 134, 46, 113, 133, 132,
+ 131, 130, 46, 129, 128, 125, 124, 46, 123, 122,
+ 46, 47, 48, 121, 120, 117, 48, 115, 113, 92,
+ 110, 48, 102, 101, 100, 99, 98, 48, 96, 94,
+ 92, 91, 48, 90, 89, 48, 59, 88, 87, 86,
+ 59, 85, 84, 83, 82, 59, 81, 80, 78, 74,
+
+ 72, 59, 71, 70, 67, 66, 59, 65, 64, 59,
+ 60, 61, 62, 58, 57, 61, 56, 55, 54, 51,
+ 61, 50, 49, 37, 33, 32, 61, 20, 19, 18,
+ 31, 61, 30, 29, 61, 63, 26, 20, 19, 63,
+ 18, 187, 187, 187, 63, 187, 187, 187, 187, 187,
+ 63, 187, 187, 187, 187, 63, 187, 187, 63, 49,
+ 75, 187, 187, 187, 75, 187, 187, 187, 187, 75,
+ 187, 187, 187, 187, 187, 75, 187, 187, 187, 187,
+ 75, 187, 187, 75, 76, 77, 187, 187, 187, 77,
+ 187, 187, 187, 187, 77, 187, 187, 187, 187, 187,
+
+ 77, 187, 187, 187, 187, 77, 187, 187, 77, 79,
+ 187, 187, 187, 79, 187, 187, 187, 187, 79, 187,
+ 187, 187, 187, 187, 79, 187, 187, 187, 187, 79,
+ 187, 187, 79, 62, 93, 187, 187, 187, 93, 187,
+ 187, 187, 187, 93, 187, 187, 187, 187, 187, 93,
+ 187, 187, 187, 187, 93, 187, 187, 93, 95, 187,
+ 187, 187, 95, 187, 187, 187, 187, 95, 187, 187,
+ 187, 187, 187, 95, 187, 187, 187, 187, 95, 187,
+ 187, 95, 78, 97, 187, 187, 187, 97, 187, 187,
+ 187, 187, 97, 187, 187, 187, 187, 187, 97, 187,
+
+ 187, 187, 187, 97, 187, 187, 97, 80, 103, 104,
+ 187, 105, 106, 187, 187, 187, 187, 187, 187, 187,
+ 107, 187, 108, 187, 187, 187, 109, 114, 187, 187,
+ 187, 114, 187, 187, 187, 187, 114, 187, 187, 187,
+ 187, 187, 114, 187, 187, 187, 187, 114, 187, 187,
+ 114, 94, 116, 187, 187, 187, 116, 187, 187, 187,
+ 187, 116, 187, 187, 187, 187, 187, 116, 187, 187,
+ 187, 187, 116, 187, 187, 116, 96, 135, 187, 187,
+ 187, 135, 187, 187, 187, 187, 135, 187, 187, 187,
+ 187, 187, 135, 187, 187, 187, 187, 135, 187, 187,
+
+ 135, 115, 137, 187, 187, 187, 137, 187, 187, 187,
+ 187, 137, 187, 187, 187, 187, 187, 137, 187, 187,
+ 187, 187, 137, 187, 187, 137, 117, 152, 187, 187,
+ 187, 152, 187, 187, 187, 187, 152, 187, 187, 187,
+ 187, 187, 152, 187, 187, 187, 187, 152, 187, 187,
+ 152, 136, 168, 187, 187, 187, 168, 187, 187, 187,
+ 187, 168, 187, 187, 187, 187, 187, 168, 187, 187,
+ 187, 187, 168, 187, 187, 168, 153, 73, 187, 73,
+ 3, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 187, 187
+ } ;
+
+static yyconst short int yy_chk[620] =
+ { 0,
+ 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, 1, 1, 1, 10, 10,
+ 11, 11, 14, 24, 24, 188, 14, 32, 32, 40,
+ 54, 14, 54, 90, 90, 40, 185, 14, 91, 91,
+ 98, 98, 14, 132, 132, 14, 14, 27, 182, 106,
+ 179, 27, 106, 133, 133, 178, 27, 166, 166, 177,
+ 176, 173, 27, 172, 168, 167, 165, 27, 164, 163,
+ 27, 27, 28, 162, 161, 160, 28, 158, 157, 156,
+
+ 155, 28, 154, 152, 151, 150, 149, 28, 148, 147,
+ 146, 145, 28, 144, 143, 28, 31, 142, 141, 140,
+ 31, 139, 138, 137, 135, 31, 134, 131, 130, 129,
+ 128, 31, 31, 127, 126, 31, 31, 34, 125, 124,
+ 123, 34, 119, 118, 116, 114, 34, 113, 112, 111,
+ 110, 109, 34, 108, 107, 105, 104, 34, 103, 102,
+ 34, 34, 35, 101, 99, 97, 35, 95, 93, 92,
+ 88, 35, 86, 85, 84, 83, 81, 35, 79, 77,
+ 75, 74, 35, 73, 72, 35, 46, 71, 70, 69,
+ 46, 68, 67, 66, 65, 46, 64, 63, 61, 58,
+
+ 57, 46, 56, 55, 53, 52, 46, 51, 50, 46,
+ 46, 47, 48, 45, 44, 47, 43, 42, 41, 39,
+ 47, 38, 36, 29, 26, 23, 47, 20, 19, 18,
+ 17, 47, 16, 15, 47, 49, 12, 9, 8, 49,
+ 5, 3, 0, 0, 49, 0, 0, 0, 0, 0,
+ 49, 0, 0, 0, 0, 49, 0, 0, 49, 49,
+ 59, 0, 0, 0, 59, 0, 0, 0, 0, 59,
+ 0, 0, 0, 0, 0, 59, 0, 0, 0, 0,
+ 59, 0, 0, 59, 59, 60, 0, 0, 0, 60,
+ 0, 0, 0, 0, 60, 0, 0, 0, 0, 0,
+
+ 60, 0, 0, 0, 0, 60, 0, 0, 60, 62,
+ 0, 0, 0, 62, 0, 0, 0, 0, 62, 0,
+ 0, 0, 0, 0, 62, 0, 0, 0, 0, 62,
+ 0, 0, 62, 62, 76, 0, 0, 0, 76, 0,
+ 0, 0, 0, 76, 0, 0, 0, 0, 0, 76,
+ 0, 0, 0, 0, 76, 0, 0, 76, 78, 0,
+ 0, 0, 78, 0, 0, 0, 0, 78, 0, 0,
+ 0, 0, 0, 78, 0, 0, 0, 0, 78, 0,
+ 0, 78, 78, 80, 0, 0, 0, 80, 0, 0,
+ 0, 0, 80, 0, 0, 0, 0, 0, 80, 0,
+
+ 0, 0, 0, 80, 0, 0, 80, 80, 87, 87,
+ 0, 87, 87, 0, 0, 0, 0, 0, 0, 0,
+ 87, 0, 87, 0, 0, 0, 87, 94, 0, 0,
+ 0, 94, 0, 0, 0, 0, 94, 0, 0, 0,
+ 0, 0, 94, 0, 0, 0, 0, 94, 0, 0,
+ 94, 94, 96, 0, 0, 0, 96, 0, 0, 0,
+ 0, 96, 0, 0, 0, 0, 0, 96, 0, 0,
+ 0, 0, 96, 0, 0, 96, 96, 115, 0, 0,
+ 0, 115, 0, 0, 0, 0, 115, 0, 0, 0,
+ 0, 0, 115, 0, 0, 0, 0, 115, 0, 0,
+
+ 115, 115, 117, 0, 0, 0, 117, 0, 0, 0,
+ 0, 117, 0, 0, 0, 0, 0, 117, 0, 0,
+ 0, 0, 117, 0, 0, 117, 117, 136, 0, 0,
+ 0, 136, 0, 0, 0, 0, 136, 0, 0, 0,
+ 0, 0, 136, 0, 0, 0, 0, 136, 0, 0,
+ 136, 136, 153, 0, 0, 0, 153, 0, 0, 0,
+ 0, 153, 0, 0, 0, 0, 0, 153, 0, 0,
+ 0, 0, 153, 0, 0, 153, 153, 189, 0, 189,
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 187, 187
+ } ;
+
+static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;
+static char *yy_full_match;
+static int yy_lp;
+#define REJECT \
+{ \
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \
+yy_cp = yy_full_match; /* restore poss. backed-over text */ \
+++yy_lp; \
+goto find_rule; \
+}
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#define INITIAL 0
+/*
+* Lex
+*/
+#include <string.h>
+#include <yyTemporal.h>
+
+extern const char *myinputptr; /* current position in myinput */
+extern int myinputlim; /* end of data */
+
+int lineno;
+char lexOut[1000];
+char sqlOutLex[1000];
+
+#undef YY_INPUT
+extern int my_yyinput(char* buf, int max_size);
+#define YY_INPUT(buffer, result, size) (result=my_yyinput(buffer,size))
+
+void initLexOut()
+{
+ for(int i=0; i<1000; ++i)
+ {
+ lexOut[i] = '\0';
+ sqlOutLex[i] = '\0';
+ }
+ return;
+}
+
+int my_yyinput(char* buf, int max_size)
+{
+ int n = max_size;
+ int s = myinputlim - (int)myinputptr;
+ if(max_size>s)
+ n = s;
+
+ //int n = min(max_size, myinputlim - (int)myinputptr);
+ if(n>0)
+ {
+ initLexOut();
+ memcpy(buf, myinputptr, n);
+ myinputptr += n;
+ }
+ return n;
+}
+
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines. This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( yy_current_buffer->yy_is_interactive ) \
+ { \
+ int c = '*', n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+YY_DECL
+ {
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+
+
+
+ if ( yy_init )
+ {
+ yy_init = 0;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! yy_start )
+ yy_start = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! yy_current_buffer )
+ yy_current_buffer =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+
+ yy_load_buffer_state();
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = yy_c_buf_p;
+
+ /* Support of yytext. */
+ *yy_cp = yy_hold_char;
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = yy_start;
+ yy_state_ptr = yy_state_buf;
+ *yy_state_ptr++ = yy_current_state;
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 188 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *yy_state_ptr++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 581 );
+
+yy_find_action:
+ yy_current_state = *--yy_state_ptr;
+ yy_lp = yy_accept[yy_current_state];
+/* find_rule: we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[yy_lp];
+ {
+ yy_full_match = yy_cp;
+ break;
+ }
+ }
+ --yy_cp;
+ yy_current_state = *--yy_state_ptr;
+ yy_lp = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+ if ( yy_act != YY_END_OF_BUFFER )
+ {
+ int yyl;
+ for ( yyl = 0; yyl < yyleng; ++yyl )
+ if ( yytext[yyl] == '\n' )
+ ++yylineno;
+ }
+
+do_action: /* This label is used only to access EOF actions. */
+
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+YY_RULE_SETUP
+{ ; }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+{ ; }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+{ strncat(sqlOutLex, yytext, strlen(yytext)); };
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+{ strncat(sqlOutLex, yytext, strlen(yytext)); };
+ YY_BREAK
+case 5:
+case 6:
+case 7:
+case 8:
+case 9:
+case 10:
+case 11:
+case 12:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext));
+ strncat(lexOut, ";", 1);
+ return TEMPORALRELATION; }
+ YY_BREAK
+case 13:
+case 14:
+case 15:
+case 16:
+case 17:
+case 18:
+case 19:
+case 20:
+case 21:
+case 22:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext));
+ return CHRONON; }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext)); strncat(lexOut, ";", 1); return NUMBER;}
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext)); strncat(lexOut, ";", 1); return NUMBER; }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext)); strncat(lexOut, ";", 1); return NUMBER; }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext)); strncat(lexOut, ";", 1); return MASK;}
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+{strncat(sqlOutLex, yytext, strlen(yytext)); return OR;}
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+{strncat(sqlOutLex, yytext, strlen(yytext)); return AND;}
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+{strncat(sqlOutLex, yytext, strlen(yytext)); return NOT;}
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext)); strncat(lexOut, ";", 1); return NAME; }
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+{
+ int yyinput();
+ unsigned char c1=0,c2=yyinput();
+ while (1)
+ {
+ if ((char)c2==EOF) break;
+ if ((c1=='*') && (c2=='/')) break;
+ if (c2=='\n') {lineno++;}
+ c1=c2;
+ c2=yyinput();
+ }
+ }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+{
+ int yyinput();
+ unsigned char c1=yyinput();
+ while (1)
+ {
+ if (c1=='\n') {lineno++;break;}
+ c1=yyinput();
+ }
+ }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+{ lineno++; }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+{ return yytext[0]; }
+ YY_BREAK
+case YY_STATE_EOF(INITIAL):
+{ return 0; }
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+ECHO;
+ YY_BREAK
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = yy_hold_char;
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between yy_current_buffer and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ yy_n_chars = yy_current_buffer->yy_n_chars;
+ yy_current_buffer->yy_input_file = yyin;
+ yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state();
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++yy_c_buf_p;
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = yy_c_buf_p;
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer() )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ yy_did_buffer_switch_on_eof = 0;
+
+ if ( yywrap() )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yy_c_buf_p =
+ yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state();
+
+ yy_cp = yy_c_buf_p;
+ yy_bp = yytext_ptr + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ yy_c_buf_p =
+ &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+ yy_current_state = yy_get_previous_state();
+
+ yy_cp = yy_c_buf_p;
+ yy_bp = yytext_ptr + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+ } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+ {
+ register char *dest = yy_current_buffer->yy_ch_buf;
+ register char *source = yytext_ptr;
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( yy_current_buffer->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+ else
+ {
+ int num_to_read =
+ yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = yy_current_buffer;
+
+ int yy_c_buf_p_offset =
+ (int) (yy_c_buf_p - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yy_flex_realloc( (void *) b->yy_ch_buf,
+ b->yy_buf_size + 2 );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = 0;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = yy_current_buffer->yy_buf_size -
+ number_to_move - 1;
+#endif
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+ yy_n_chars, num_to_read );
+
+ yy_current_buffer->yy_n_chars = yy_n_chars;
+ }
+
+ if ( yy_n_chars == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart( yyin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ yy_current_buffer->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ yy_n_chars += number_to_move;
+ yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+ yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+ yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+ return ret_val;
+ }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+ {
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = yy_start;
+ yy_state_ptr = yy_state_buf;
+ *yy_state_ptr++ = yy_current_state;
+
+ for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 188 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *yy_state_ptr++ = yy_current_state;
+ }
+
+ return yy_current_state;
+ }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+ {
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 188 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 187);
+ if ( ! yy_is_jam )
+ *yy_state_ptr++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+ }
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+ {
+ register char *yy_cp = yy_c_buf_p;
+
+ /* undo effects of setting up yytext */
+ *yy_cp = yy_hold_char;
+
+ if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register int number_to_move = yy_n_chars + 2;
+ register char *dest = &yy_current_buffer->yy_ch_buf[
+ yy_current_buffer->yy_buf_size + 2];
+ register char *source =
+ &yy_current_buffer->yy_ch_buf[number_to_move];
+
+ while ( source > yy_current_buffer->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ yy_current_buffer->yy_n_chars =
+ yy_n_chars = yy_current_buffer->yy_buf_size;
+
+ if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ if ( c == '\n' )
+ --yylineno;
+
+ yytext_ptr = yy_bp;
+ yy_hold_char = *yy_cp;
+ yy_c_buf_p = yy_cp;
+ }
+#endif /* ifndef YY_NO_UNPUT */
+
+
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+ {
+ int c;
+
+ *yy_c_buf_p = yy_hold_char;
+
+ if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+ /* This was really a NUL. */
+ *yy_c_buf_p = '\0';
+
+ else
+ { /* need more input */
+ int offset = yy_c_buf_p - yytext_ptr;
+ ++yy_c_buf_p;
+
+ switch ( yy_get_next_buffer() )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart( yyin );
+
+ /* fall through */
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap() )
+ return EOF;
+
+ if ( ! yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yy_c_buf_p = yytext_ptr + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */
+ *yy_c_buf_p = '\0'; /* preserve yytext */
+ yy_hold_char = *++yy_c_buf_p;
+
+ if ( c == '\n' )
+ ++yylineno;
+
+ return c;
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+ {
+ if ( ! yy_current_buffer )
+ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+ yy_init_buffer( yy_current_buffer, input_file );
+ yy_load_buffer_state();
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+ {
+ if ( yy_current_buffer == new_buffer )
+ return;
+
+ if ( yy_current_buffer )
+ {
+ /* Flush out information for old buffer. */
+ *yy_c_buf_p = yy_hold_char;
+ yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+ yy_current_buffer->yy_n_chars = yy_n_chars;
+ }
+
+ yy_current_buffer = new_buffer;
+ yy_load_buffer_state();
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ yy_did_buffer_switch_on_eof = 1;
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+ {
+ yy_n_chars = yy_current_buffer->yy_n_chars;
+ yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+ yyin = yy_current_buffer->yy_input_file;
+ yy_hold_char = *yy_c_buf_p;
+ }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+ {
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer( b, file );
+
+ return b;
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+ {
+ if ( ! b )
+ return;
+
+ if ( b == yy_current_buffer )
+ yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yy_flex_free( (void *) b->yy_ch_buf );
+
+ yy_flex_free( (void *) b );
+ }
+
+
+#ifndef _WIN32
+#include <unistd.h>
+#else
+#ifndef YY_ALWAYS_INTERACTIVE
+#ifndef YY_NEVER_INTERACTIVE
+//extern int isatty YY_PROTO(( int ));
+#endif
+#endif
+#endif
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+ {
+ yy_flush_buffer( b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+ b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+ b->yy_is_interactive = 0;
+#else
+// b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+ {
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == yy_current_buffer )
+ yy_load_buffer_state();
+ }
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+ {
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer( b );
+
+ return b;
+ }
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+ {
+ int len;
+ for ( len = 0; yy_str[len]; ++len )
+ ;
+
+ return yy_scan_bytes( yy_str, len );
+ }
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+ {
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = len + 2;
+ buf = (char *) yy_flex_alloc( n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < len; ++i )
+ buf[i] = bytes[i];
+
+ buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer( buf, n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+ }
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+ {
+ if ( yy_start_stack_ptr >= yy_start_stack_depth )
+ {
+ yy_size_t new_size;
+
+ yy_start_stack_depth += YY_START_STACK_INCR;
+ new_size = yy_start_stack_depth * sizeof( int );
+
+ if ( ! yy_start_stack )
+ yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+ else
+ yy_start_stack = (int *) yy_flex_realloc(
+ (void *) yy_start_stack, new_size );
+
+ if ( ! yy_start_stack )
+ YY_FATAL_ERROR(
+ "out of memory expanding start-condition stack" );
+ }
+
+ yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+ BEGIN(new_state);
+ }
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+ {
+ if ( --yy_start_stack_ptr < 0 )
+ YY_FATAL_ERROR( "start-condition stack underflow" );
+
+ BEGIN(yy_start_stack[yy_start_stack_ptr]);
+ }
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+ {
+ return yy_start_stack[yy_start_stack_ptr - 1];
+ }
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+ {
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+ }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ yytext[yyleng] = yy_hold_char; \
+ yy_c_buf_p = yytext + n; \
+ yy_hold_char = *yy_c_buf_p; \
+ *yy_c_buf_p = '\0'; \
+ yyleng = n; \
+ } \
+ while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+ {
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+ }
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+ {
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+ }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+ {
+ return (void *) malloc( size );
+ }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+ {
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+ }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+ {
+ free( ptr );
+ }
+
+#if YY_MAIN
+int main()
+ {
+ yylex();
+ return 0;
+ }
+#endif
+
diff --git a/src/terralib/kernel/showseq.h b/src/terralib/kernel/showseq.h
new file mode 100644
index 0000000..4d9a1fc
--- /dev/null
+++ b/src/terralib/kernel/showseq.h
@@ -0,0 +1,23 @@
+// Template zur Anzeige von Sequenzen
+// Template for the display of sequences (file include/showseq)
+#ifndef SHOWSEQ_H
+#define SHOWSEQ_H
+
+#include<iostream>
+
+namespace br_stl {
+
+template<class Container>
+void showSequence(const Container& s, const char* sep = " ",
+ std::ostream& where = std::cout) {
+ typename Container::const_iterator iter = s.begin();
+ while(iter != s.end())
+ where << *iter++ << sep;
+ where << std::endl;
+}
+
+
+} // namespace br_stl
+
+#endif
+
diff --git a/src/terralib/kernel/yyTemporal.cpp b/src/terralib/kernel/yyTemporal.cpp
new file mode 100644
index 0000000..83bb961
--- /dev/null
+++ b/src/terralib/kernel/yyTemporal.cpp
@@ -0,0 +1,495 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#ifndef lint
+static char const
+yyrcsid[] = "$FreeBSD: src/usr.bin/yacc/skeleton.c,v 1.28 2000/01/17 02:04:06 bde Exp $";
+#endif
+#include <stdlib.h>
+#define YYBYACC 1
+#define YYMAJOR 1
+#define YYMINOR 9
+#define YYLEX yylex()
+#define YYEMPTY -1
+#define yyclearin (yychar=(YYEMPTY))
+#define yyerrok (yyerrflag=0)
+#define YYRECOVERING() (yyerrflag!=0)
+static int yygrowstack();
+#define YYPREFIX "yy"
+#include <stdio.h>
+#include <iostream>
+#include <string.h>
+#include <TeDatabase.h>
+
+extern int yylex();
+extern void initLexOut();
+
+extern char lexOut[1000];
+extern char sqlOutLex[1000];
+
+char sqlOut[1000];
+char tempSql[1000];
+string aux;
+
+const char* myinputptr;
+string myinputptr_aux;
+int myinputlim;
+
+TeDatabase* database_;
+
+int initParse(const string& strIn, TeDatabase* db)
+{
+ for(int i=0; i<1000; ++i)
+ {
+ sqlOut[i] = '\0';
+ tempSql[i]= '\0';
+ }
+
+ //myinputptr = new char();
+ //memcpy(myinputptr, strIn.c_str(), strIn.size ());
+ myinputptr_aux = strIn;
+ myinputptr = myinputptr_aux.c_str();
+
+ myinputlim = (int)myinputptr + strIn.size ();
+ database_ = db;
+ return 1;
+}
+
+void yyerror(char* msg)
+{
+ if(strcmp(msg,"syntax error"))
+ printf(" Syntax Error : %s\n", msg);
+}
+
+#define YYERRCODE 256
+#define TEMPORALRELATION 257
+#define CHRONON 258
+#define NAME 259
+#define NUMBER 260
+#define MASK 261
+#define OR 262
+#define AND 263
+#define NOT 264
+const short yylhs[] = { -1,
+ 0, 0, 0, 0, 0,
+};
+const short yylen[] = { 2,
+ 15, 2, 3, 3, 3,
+};
+const short yydefred[] = { 0,
+ 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
+ 3, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1,
+};
+const short yydgoto[] = { 4,
+};
+const short yysindex[] = { -40,
+ -52, -40, -40, -260, -251, 0, -37, -40, -40, -50,
+ 0, -253, 0, -246, -45, -242, -43, -243, -41, -241,
+ -39, -240, -36, -236, 0,
+};
+const short yyrindex[] = { 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+};
+const short yygindex[] = { 3,
+};
+#define YYTABLESIZE 263
+const short yytable[] = { 3,
+ 5, 8, 9, 11, 6, 7, 5, 10, 14, 9,
+ 12, 13, 15, 16, 17, 18, 19, 20, 21, 22,
+ 23, 25, 24, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 5, 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, 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, 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, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 2, 8, 9, 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, 5,
+};
+const short yycheck[] = { 40,
+ 0, 262, 263, 41, 2, 3, 59, 259, 59, 263,
+ 8, 9, 259, 59, 257, 59, 260, 59, 260, 59,
+ 261, 258, 59, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 41, -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, -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, -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, -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, -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, -1, 259, -1,
+ -1, -1, -1, 264, 262, 263, -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, -1, 262,
+};
+#define YYFINAL 4
+#ifndef YYDEBUG
+#define YYDEBUG 0
+#endif
+#define YYMAXTOKEN 264
+#if YYDEBUG
+const char * const yyname[] = {
+"end-of-file",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,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,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,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,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,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,0,"TEMPORALRELATION",
+"CHRONON","NAME","NUMBER","MASK","OR","AND","NOT",
+};
+const char * const yyrule[] = {
+"$accept : exp",
+"exp : NAME ';' NAME ';' NAME ';' TEMPORALRELATION ';' NUMBER ';' NUMBER ';' MASK ';' CHRONON",
+"exp : NOT exp",
+"exp : '(' exp ')'",
+"exp : exp AND exp",
+"exp : exp OR exp",
+};
+#endif
+#ifndef YYSTYPE
+typedef int YYSTYPE;
+#endif
+#if YYDEBUG
+#include <stdio.h>
+#endif
+#ifdef YYSTACKSIZE
+#undef YYMAXDEPTH
+#define YYMAXDEPTH YYSTACKSIZE
+#else
+#ifdef YYMAXDEPTH
+#define YYSTACKSIZE YYMAXDEPTH
+#else
+#define YYSTACKSIZE 10000
+#define YYMAXDEPTH 10000
+#endif
+#endif
+#define YYINITSTACKSIZE 200
+int yydebug;
+int yynerrs;
+int yyerrflag;
+int yychar;
+short *yyssp;
+YYSTYPE *yyvsp;
+YYSTYPE yyval;
+YYSTYPE yylval;
+short *yyss;
+short *yysslim;
+YYSTYPE *yyvs;
+int yystacksize;
+
+
+/* allocate initial stack or double stack size, up to YYMAXDEPTH */
+static int yygrowstack()
+{
+ int newsize, i;
+ short *newss;
+ YYSTYPE *newvs;
+
+ if ((newsize = yystacksize) == 0)
+ newsize = YYINITSTACKSIZE;
+ else if (newsize >= YYMAXDEPTH)
+ return -1;
+ else if ((newsize *= 2) > YYMAXDEPTH)
+ newsize = YYMAXDEPTH;
+ i = yyssp - yyss;
+ newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :
+ (short *)malloc(newsize * sizeof *newss);
+ if (newss == NULL)
+ return -1;
+ yyss = newss;
+ yyssp = newss + i;
+ newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :
+ (YYSTYPE *)malloc(newsize * sizeof *newvs);
+ if (newvs == NULL)
+ return -1;
+ yyvs = newvs;
+ yyvsp = newvs + i;
+ yystacksize = newsize;
+ yysslim = yyss + newsize - 1;
+ return 0;
+}
+
+#define YYABORT goto yyabort
+#define YYREJECT goto yyabort
+#define YYACCEPT goto yyaccept
+#define YYERROR goto yyerrlab
+
+#ifndef YYPARSE_PARAM
+#if defined(__cplusplus) || __STDC__
+#define YYPARSE_PARAM_ARG void
+#define YYPARSE_PARAM_DECL
+#else /* ! ANSI-C/C++ */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* ANSI-C/C++ */
+#else /* YYPARSE_PARAM */
+#ifndef YYPARSE_PARAM_TYPE
+#define YYPARSE_PARAM_TYPE void *
+#endif
+#if defined(__cplusplus) || __STDC__
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* ! ANSI-C/C++ */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM;
+#endif /* ANSI-C/C++ */
+#endif /* ! YYPARSE_PARAM */
+
+int
+yyparse (string& sql/*, YYPARSE_PARAM_ARG*/)
+ YYPARSE_PARAM_DECL
+{
+ register int yym, yyn, yystate;
+ string aux = "";
+#if YYDEBUG
+ register const char *yys;
+
+ if ((yys = getenv("YYDEBUG")))
+ {
+ yyn = *yys;
+ if (yyn >= '0' && yyn <= '9')
+ yydebug = yyn - '0';
+ }
+#endif
+
+ yynerrs = 0;
+ yyerrflag = 0;
+ yychar = (-1);
+
+ if (yyss == NULL && yygrowstack()) goto yyoverflow;
+ yyssp = yyss;
+ yyvsp = yyvs;
+ *yyssp = yystate = 0;
+
+yyloop:
+ if ((yyn = yydefred[yystate])) goto yyreduce;
+ if (yychar < 0)
+ {
+ if ((yychar = yylex()) < 0) yychar = 0;
+#if YYDEBUG
+ if (yydebug)
+ {
+ yys = 0;
+ if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+ if (!yys) yys = "illegal-symbol";
+ printf("%sdebug: state %d, reading %d (%s)\n",
+ YYPREFIX, yystate, yychar, yys);
+ }
+#endif
+ }
+ if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
+ {
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: state %d, shifting to state %d\n",
+ YYPREFIX, yystate, yytable[yyn]);
+#endif
+ if (yyssp >= yysslim && yygrowstack())
+ {
+ goto yyoverflow;
+ }
+ *++yyssp = yystate = yytable[yyn];
+ *++yyvsp = yylval;
+ yychar = (-1);
+ if (yyerrflag > 0) --yyerrflag;
+ goto yyloop;
+ }
+ if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
+ {
+ yyn = yytable[yyn];
+ goto yyreduce;
+ }
+ if (yyerrflag) goto yyinrecovery;
+#if defined(lint) || defined(__GNUC__)
+ yyerror("syntax error");
+ ++yynerrs;
+#endif
+yyinrecovery:
+ if (yyerrflag < 3)
+ {
+ yyerrflag = 3;
+ for (;;)
+ {
+ if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
+ {
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: state %d, error recovery shifting\
+ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
+#endif
+ if (yyssp >= yysslim && yygrowstack())
+ {
+ goto yyoverflow;
+ }
+ *++yyssp = yystate = yytable[yyn];
+ *++yyvsp = yylval;
+ goto yyloop;
+ }
+ else
+ {
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: error recovery discarding state %d\n",
+ YYPREFIX, *yyssp);
+#endif
+ if (yyssp <= yyss) goto yyabort;
+ --yyssp;
+ --yyvsp;
+ }
+ }
+ }
+ else
+ {
+ if (yychar == 0) goto yyabort;
+#if YYDEBUG
+ if (yydebug)
+ {
+ yys = 0;
+ if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+ if (!yys) yys = "illegal-symbol";
+ printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
+ YYPREFIX, yystate, yychar, yys);
+ }
+#endif
+ yychar = (-1);
+ goto yyloop;
+ }
+yyreduce:
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: state %d, reducing by rule %d (%s)\n",
+ YYPREFIX, yystate, yyn, yyrule[yyn]);
+#endif
+ yym = yylen[yyn];
+ yyval = yyvsp[1-yym];
+ switch (yyn)
+ {
+case 1:
+{
+ strncat(sqlOut, sqlOutLex, strlen(sqlOutLex));
+ aux = database_->getSQLTemporalWhere (string(lexOut));
+ memcpy(tempSql, aux.c_str(), aux.size());
+ strncat(sqlOut, tempSql, strlen(tempSql));
+ initLexOut();
+ }
+break;
+ }
+ yyssp -= yym;
+ yystate = *yyssp;
+ yyvsp -= yym;
+ yym = yylhs[yyn];
+ if (yystate == 0 && yym == 0)
+ {
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: after reduction, shifting from state 0 to\
+ state %d\n", YYPREFIX, YYFINAL);
+#endif
+ yystate = YYFINAL;
+ *++yyssp = YYFINAL;
+ *++yyvsp = yyval;
+ if (yychar < 0)
+ {
+ if ((yychar = yylex()) < 0) yychar = 0;
+#if YYDEBUG
+ if (yydebug)
+ {
+ yys = 0;
+ if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+ if (!yys) yys = "illegal-symbol";
+ printf("%sdebug: state %d, reading %d (%s)\n",
+ YYPREFIX, YYFINAL, yychar, yys);
+ }
+#endif
+ }
+ if (yychar == 0) goto yyaccept;
+ goto yyloop;
+ }
+ if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
+ yystate = yytable[yyn];
+ else
+ yystate = yydgoto[yym];
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: after reduction, shifting from state %d \
+to state %d\n", YYPREFIX, *yyssp, yystate);
+#endif
+ if (yyssp >= yysslim && yygrowstack())
+ {
+ goto yyoverflow;
+ }
+ *++yyssp = yystate;
+ *++yyvsp = yyval;
+ goto yyloop;
+yyoverflow:
+ yyerror("yacc stack overflow");
+yyabort:
+ return (1);
+yyaccept:
+ {
+ sql = string(sqlOut);
+ //delete(myinputptr); cai!!!!
+ return (0);
+ }
+}
diff --git a/src/terralib/kernel/yyTemporal.h b/src/terralib/kernel/yyTemporal.h
new file mode 100644
index 0000000..0077010
--- /dev/null
+++ b/src/terralib/kernel/yyTemporal.h
@@ -0,0 +1,35 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef YYERRCODE
+#define YYERRCODE 256
+#endif
+
+#define TEMPORALRELATION 257
+#define CHRONON 258
+#define NAME 259
+#define NUMBER 260
+#define MASK 261
+#define OR 262
+#define AND 263
+#define NOT 264
diff --git a/src/terralib/stat/TeBayesFunctions.cpp b/src/terralib/stat/TeBayesFunctions.cpp
new file mode 100644
index 0000000..ff10c67
--- /dev/null
+++ b/src/terralib/stat/TeBayesFunctions.cpp
@@ -0,0 +1,232 @@
+#include "TeBayesFunctions.h"
+#include "TeStatDataStructures.h"
+#include "TeProxMatrixConstructionStrategy.h"
+#include "TeGeneralizedProxMatrix.h"
+#include "TeSTElementSet.h"
+
+// TeGlobalEmpiricalBayes // Function declaration
+bool TeGlobalEmpiricalBayes(TeSTStatInstanceSet *rs, double rate)
+{
+ TeSTStatInstanceSet::iterator it = rs->begin();
+
+ long int Narea=0; // number of areas
+ long int count; // Counter
+ double m_hat; // the global rate
+ double n_; // the mean population in risk
+ double s2=0; // s2 = sum(n(i)(r(i) - m_hat)^2)/n
+ double sum_n=0; //
+ double sum_y=0; //
+ vector<double> r; // the rate for each area
+ vector<double> n; // the population in each area
+ vector<double> y; // the cases in each area
+ double aux; // auxiliary variable
+
+ try{
+
+ while(it != rs->end())
+ {
+ (*it).getDoubleProperty(0,aux);
+ n.push_back(aux);
+ (*it).getDoubleProperty(1,aux);
+ y.push_back(aux);
+ ++Narea;
+ r.push_back(y[Narea-1]/n[Narea-1]);
+ sum_n+=n[Narea-1];
+ sum_y+=y[Narea-1];
+ ++it;
+
+ // Check if the population is smaller than the
+ // number of cases
+ //if(n[Narea-1]<=y[Narea-1])
+ // throw TeGlobalBayesException(BAYES_GREATER_CASES);
+ if(n[Narea-1]<=0)
+ throw TeGlobalBayesException(BAYES_NULL_POPULATION);
+ }
+
+ m_hat = sum_y/sum_n;
+ n_ = sum_n/Narea;
+
+ for(count=0;count<Narea;count++)
+ {
+ s2+= n[count]*(r[count]-m_hat)*(r[count]-m_hat);
+ }
+ s2=s2/sum_n;
+
+ it = rs->begin();
+ aux = s2 - (m_hat/n_);
+
+ if(aux<0)
+ {
+ (*it).setDoubleProperty(2,m_hat);
+ ++it;
+ }
+ else
+ {
+ double Theta_i, Ci, pop, cases;
+ while(it != rs->end())
+ {
+ (*it).getDoubleProperty(0,pop);
+ (*it).getDoubleProperty(1,cases);
+ Ci = (aux)/(aux + (m_hat/pop));
+ Theta_i = Ci*(cases/pop) + (1-Ci)*m_hat;
+ (*it).setDoubleProperty(2,Theta_i*rate);
+ ++it;
+ }
+ }
+
+ }catch(TeGlobalBayesException e)
+ {
+/* switch(e.getErrorCode()){
+ case BAYES_GREATER_CASES:
+ break;
+ case BAYES_NULL_POPULATION:
+ break;
+ }*/
+ e.getErrorCode();
+ return(false);
+ }
+
+ return(true);
+}
+
+
+
+/* Taxa Bayesiana Local -- recebe conjunto de areas, cria matriz de vizinhanca,
+ e estima taxa local baseado na vizinhanca.
+
+ As duas primeiras propriedades das areas sao populacao e casos.
+ Ha mais duas propriedades double onde serao armazenados total de casos e total
+ de populacao dos vizinhos.
+
+ teta[i]=w[i]*r[i]+(1-w[i])*c[i]
+ w[i]=V/(V+r[i]))
+ V=Sum(Area i,Pop[i]*(ri-m)^2)/Sum(Area i,Pop[i])-m/PopMedia
+*/
+// TeGlobalEmpiricalBayes // Function declaration
+bool TeLocalEmpiricalBayes(TeSTElementSet *rs, string& colname, double /*rate*/)
+{
+
+
+ //Monta vizinhanca
+ TeProxMatrixLocalAdjacencyStrategy matrix(rs, TePOLYGONS);
+ TeGeneralizedProxMatrix neighMatrix(&matrix);
+
+ //Percorre areas, calculando populacao e contagem total dos vizinhos
+
+ TeSTElementSet::iterator it = rs->begin();
+ double neiPop, neiCases;
+ double totPop, mPop;
+
+ totPop = 0;
+ std::string val;
+
+ while ( it != rs->end())
+ {
+
+ //Inicializa total de casos e de populacao
+ neiPop = neiCases = 0;
+ (*it).getPropertyValue(val, 0);
+ mPop = atof(val.c_str());
+ if (mPop == 0)
+ return false;
+ totPop += mPop;
+
+
+ TeNeighboursMap neighbors = neighMatrix.getMapNeighbours((*it).objectId());
+
+ if (neighbors.size() > 0) {
+
+ TeNeighboursMap::iterator itNeigs = neighbors.begin();
+
+ //Total de casos e de populacao
+ while(itNeigs != neighbors.end()){
+
+ //Pega numero de casos e de populacao
+ it.elemSet()->getAttributeValue((*itNeigs).first, 0, val);
+ neiPop += atof(val.c_str());
+ it.elemSet()->getAttributeValue((*itNeigs).first, 1, val);
+ neiCases += atof(val.c_str());
+ (++itNeigs);
+ }
+ }
+
+ //Insere propriedades na area
+
+ TeProperty prop;
+ prop.attr_.rep_.type_ = TeREAL;
+
+ prop.attr_.rep_.name_ = "neiPop";
+ prop.value_ = Te2String(neiPop, 9);
+ (*it).addProperty(prop);
+
+ prop.attr_.rep_.name_ = "neiCases";
+ prop.value_ = Te2String(neiCases, 9);
+ (*it).addProperty(prop);
+
+ (++it);
+ }
+
+
+ double m, variance, V, W, LocalBayesRate;
+ double myPop, myCases, neiJPop, neiJCases;
+
+ TeProperty rateProp;
+ rateProp.attr_.rep_.type_ = TeREAL;
+ rateProp.attr_.rep_.name_ = colname;
+
+ it = rs->begin();
+ while ( it != rs->end())
+ {
+
+ //Pega numero de casos e de populacao
+ (*it).getPropertyValue(val, 0);
+ myPop = atof(val.c_str());
+ (*it).getPropertyValue(val, 1);
+ myCases = atof(val.c_str());
+
+ (*it).getPropertyValue("neiPop", val);
+ neiPop = atof(val.c_str());
+ (*it).getPropertyValue("neiCases", val);
+ neiCases = atof(val.c_str());
+
+ m = (double)neiCases/(double)neiPop;
+ variance = 0;
+
+ TeNeighboursMap neighbors = neighMatrix.getMapNeighbours((*it).objectId());
+
+ if (neighbors.size() == 0) {
+ LocalBayesRate = (double)myCases/(double)myPop;
+ }
+ else {
+
+ TeNeighboursMap::iterator itNeigs = neighbors.begin();
+
+ //Total de casos e de populacao
+ while(itNeigs != neighbors.end()){
+
+ //Pega numero de casos e de populacao
+ it.elemSet()->getAttributeValue((*itNeigs).first, 0, val);
+ neiJPop = atof(val.c_str());
+ it.elemSet()->getAttributeValue((*itNeigs).first, 1, val);
+ neiJCases = atof(val.c_str());
+
+ //Atualiza numS
+ variance += (double)neiJPop * pow((double)neiJCases/(double)neiJPop - m,2);
+ (++itNeigs);
+ }
+
+
+ V = (variance/(double)myPop) - (m * (double)neighbors.size()/(double)neiPop);
+ if (V < 0)
+ V = 0;
+ W = V/(V + (m/(double)myPop));
+ LocalBayesRate = W * (double)myCases/(double)myPop + (1 - W) * m;
+
+ }
+ rateProp.value_ = Te2String(LocalBayesRate, 9);
+ (*it).addProperty(rateProp);
+ (++it);
+ }
+
+ return (true);
+}
diff --git a/src/terralib/stat/TeBayesFunctions.h b/src/terralib/stat/TeBayesFunctions.h
new file mode 100644
index 0000000..bd127f8
--- /dev/null
+++ b/src/terralib/stat/TeBayesFunctions.h
@@ -0,0 +1,71 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#ifndef __TEBAYESFUNCTIONSH__
+#define __TEBAYESFUNCTIONSH__
+
+#include "TeStatDataStructures.h"
+
+// Class for error treatment
+enum TeGlobalBayesError {
+ BAYES_GREATER_CASES,
+ BAYES_NULL_POPULATION
+};
+
+class TeGlobalBayesException {
+
+
+ TeGlobalBayesError error_;
+
+public:
+
+ TeGlobalBayesException(TeGlobalBayesError e) {
+ error_ = e;
+ }
+
+ TeGlobalBayesError getErrorCode() {
+ return error_;
+ }
+};
+
+
+// TeGlobalEmpiricalBayes // Function declaration
+bool TeGlobalEmpiricalBayes(TeSTStatInstanceSet *rs, double rate);
+
+
+
+/* Taxa Bayesiana Local -- recebe conjunto de areas, cria matriz de vizinhanca,
+ e estima taxa local baseado na vizinhanca.
+
+ As duas primeiras propriedades das areas sao populacao e casos.
+ Ha mais duas propriedades double onde serao armazenados total de casos e total
+ de populacao dos vizinhos.
+
+ teta[i]=w[i]*r[i]+(1-w[i])*c[i]
+ w[i]=V/(V+r[i]))
+ V=Sum(Area i,Pop[i]*(ri-m)^2)/Sum(Area i,Pop[i])-m/PopMedia
+*/
+// TeGlobalEmpiricalBayes // Function declaration
+bool TeLocalEmpiricalBayes(TeSTElementSet *rs, string& colname, double rate);
+
+
+#endif
diff --git a/src/terralib/stat/TeKMeansGrouping.h b/src/terralib/stat/TeKMeansGrouping.h
new file mode 100644
index 0000000..7b04384
--- /dev/null
+++ b/src/terralib/stat/TeKMeansGrouping.h
@@ -0,0 +1,164 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeKMeansGrouping.h
+ This file contains functions related to the K Means clustering algorithm
+*/
+#ifndef __TERRALIB_INTERNAL_KMEANSGROUPING_H
+#define __TERRALIB_INTERNAL_KMEANSGROUPING_H
+
+#include "TeGroupingAlgorithms.h"
+
+template<typename I, typename T> int
+TeMinimumDistance(I it, T& centroides )
+{
+ double distmin = TeMAXFLOAT, dist;
+ int j = -1;
+ for (int i=0; i< centroides.size(); i++)
+ {
+ dist = TeEuclidianDistance(it,centroides[i]);
+ if ( dist < distmin )
+ {
+ j = i;
+ distmin = dist;
+ }
+ }
+ return j;
+}
+
+template<typename I, typename T>
+double
+TeEuclidianDistance(I it, T& centroide)
+{
+ double val = 0;
+ int n = centroide.size();
+ for (int i=0; i<n; i++)
+ {
+ double v1 = (*it)[i];
+ double v2 = centroide[i];
+ val += pow(v1-v2,2);
+ }
+ return sqrt(val);
+}
+
+
+template<typename T>
+void
+Initialize(T& centroide, vector<double>& minValue, vector<double>& maxValue)
+{
+ int n = centroide.size();
+ for (int i=0; i<n; i++)
+ {
+ double val = (rand()* (maxValue[i]-minValue[i]))/RAND_MAX;
+ centroide[i] = val;
+ }
+ return;
+}
+
+template<typename T>
+bool
+CheckConvergence(T& toUpdate, T& newCentroides, double limiar )
+{
+
+ int k = newCentroides.size();
+ int n = newCentroides[0].size();
+ for (int i=0; i<k; i++)
+ for (int j = 0; j<n; j++)
+ {
+ double num = newCentroides[i][j];
+ double den = toUpdate[i][j];
+/* if (num > den)
+ {
+ double aux = den;
+ den = num;
+ num = aux;
+ }
+ val = (1-num/den)*100.;
+ if (val > limiar)
+ return false;
+*/
+ if (num != den)
+ return false;
+ }
+ return true;
+}
+
+template<typename It, typename C>
+void
+ReCalculate(It it, C& nearest)
+{
+ for (int i=0; i<nearest.size(); i++)
+ nearest[i] = (nearest[i] + (*it)[i])/2.0;
+ return;
+}
+
+
+template<typename It, typename C> void
+TeKMeans (It begin, It end, C& result, double conv)
+{
+ srand( static_cast<unsigned>(time(NULL)));
+ C centroides(result), centr_aux(result);
+
+ int n = result[0].size();
+ vector<double> minValue(n);
+ vector<double> maxValue(n);
+
+ TeMinimumValue(begin, end, minValue);
+ TeMaximumValue(begin, end, maxValue);
+
+ for (int i=0; i<result.size(); i++)
+ {
+ // Falta verificar se n�o gera centroides iniciais iguais
+ Initialize(centroides[i], minValue, maxValue);
+ }
+
+ centr_aux = centroides;
+ bool converge = false;
+ int j, niter=0;
+
+ while (!converge)
+ {
+ for (It it=begin; it!= end; it++)
+ {
+ j = TeMinimumDistance(it, centroides);
+ ReCalculate(it,centr_aux[j]);
+ }
+ converge = CheckConvergence(centroides, centr_aux,conv);
+ centroides = centr_aux;
+ niter++;
+ }
+ result = centroides;
+}
+
+template<typename ItIn, typename C, typename ItOut> void
+TeEuclidianClassify (ItIn begin, ItIn end, ItOut& result, C& kmeans)
+{
+ int j;
+ for (ItIn it=begin; it!= end; it++)
+ {
+ j = TeMinimumDistance(it, kmeans);
+ (*result) = j;
+ result++;
+ }
+}
+#endif
\ No newline at end of file
diff --git a/src/terralib/stat/TeKernelFunctions.cpp b/src/terralib/stat/TeKernelFunctions.cpp
new file mode 100644
index 0000000..467990f
--- /dev/null
+++ b/src/terralib/stat/TeKernelFunctions.cpp
@@ -0,0 +1,67 @@
+/************************************************************************************
+Exploring and analysis of geographical data using TerraLib and TerraView
+
+Copyright � 2003,2004 INPE and LESTE/UFMG.
+
+Partially funded by CNPq - Project SAUDAVEL, under grant no. 552044/2002-4,
+SENASP-MJ and INPE
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed hoping it will be useful, however, WITHOUT ANY
+WARRANTIES; neither to the implicit warranty of MERCHANTABILITY OR SUITABILITY FOR
+AN SPECIFIC FINALITY. Consult the GNU General Public License for more details.
+
+You must have received a copy of the GNU General Public License with this program.
+In negative case, write to the Free Software Foundation, Inc. in the following
+address: 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+***********************************************************************************/
+
+#include "TeKernelFunctions.h"
+#include "TeDefines.h"
+#include <math.h>
+
+
+double TeKernelQuartic(double tau, double distance, double intensity)
+{
+ if (distance > tau)
+ return 0.0;
+
+ return intensity * (3.0 / (tau * tau * TePI)) *
+ pow(1 - ((distance * distance)/ (tau * tau)),2.0);
+}
+
+double TeKernelNormal(double tau, double distance, double intensity)
+{
+ return intensity * (1.0 / (tau * tau * 2 * TePI)) *
+ exp(-1.0 * (distance * distance)/ (2 * tau * tau));
+}
+
+double TeKernelUniform(double tau, double distance, double intensity)
+{
+ if (distance > tau)
+ return 0.0;
+
+ return intensity;
+}
+
+double TeKernelTriangular(double tau, double distance, double intensity)
+{
+ if (distance > tau)
+ return 0.0;
+
+ return intensity * (1.0 - 1.0/tau) * distance;
+}
+
+double TeKernelNegExponential(double tau, double distance, double intensity)
+{
+ if (distance > tau)
+ return 0.0;
+
+ return intensity * exp(-3.0 * distance);
+}
+
+
diff --git a/src/terralib/stat/TeKernelFunctions.h b/src/terralib/stat/TeKernelFunctions.h
new file mode 100644
index 0000000..442809b
--- /dev/null
+++ b/src/terralib/stat/TeKernelFunctions.h
@@ -0,0 +1,693 @@
+/************************************************************************************
+Exploring and analysis of geographical data using TerraLib and TerraView
+
+Copyright � 2003,2004 INPE and LESTE/UFMG.
+
+Partially funded by CNPq - Project SAUDAVEL, under grant no. 552044/2002-4,
+SENASP-MJ and INPE
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed hoping it will be useful, however, WITHOUT ANY
+WARRANTIES; neither to the implicit warranty of MERCHANTABILITY OR SUITABILITY FOR
+AN SPECIFIC FINALITY. Consult the GNU General Public License for more details.
+
+You must have received a copy of the GNU General Public License with this program.
+In negative case, write to the Free Software Foundation, Inc. in the following
+address: 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+***********************************************************************************/
+
+/*! \file TeKernelFunctions.h
+ This file contains functions to spatial kernel estimation: basic, adaptive and ratio
+*/
+
+#ifndef __TERRALIB_INTERNAL_KERNELFUNCTIONS_H
+#define __TERRALIB_INTERNAL_KERNELFUNCTIONS_H
+
+#include "TeException.h"
+#include "TeKernelParams.h"
+#include "TeDefines.h"
+#include "TeProgress.h"
+
+
+#define INVALID_KERNEL -TeMAXFLOAT
+
+#define IDX_ATTR 0
+#define IDX_KERNEL 0
+#define IDX_NUMERATOR 1
+#define IDX_KERNEL1 0
+#define IDX_KERNEL2 1
+
+double TeDistance(const TeCoord2D& c1, const TeCoord2D& c2);
+
+enum TeKernelError {
+ KERNEL_NO_CENTROID,
+ KERNEL_ALL_NULL,
+ KERNEL_INVALID_AREA,
+ KERNEL_INVALID_VALUE,
+ KERNEL_NO_VALUE
+};
+
+class TeKernelException {
+
+
+ TeKernelError error_;
+
+public:
+
+ TeKernelException(TeKernelError e) {
+ error_ = e;
+ }
+
+ TeKernelError getErrorCode() {
+ return error_;
+ }
+};
+
+
+
+/*! Kernel functions
+
+ * \param tau spatial threshold to define neighboorhood
+ * \param distance distance between event and region centroid
+ * \param intensity attribute value for event
+*/
+double TeKernelQuartic(double tau, double distance, double intensity);
+double TeKernelNormal(double tau, double distance, double intensity);
+double TeKernelUniform(double tau, double distance, double intensity);
+double TeKernelTriangular(double tau, double distance, double intensity);
+double TeKernelNegExponential(double tau, double distance, double intensity);
+
+
+/**
+ * Calcula a media geometrica de um conjunto de valores atraves da
+ * utilizacao de logaritmos
+ * Implementado pelo Andre
+ **/
+template <typename ItReg>
+double TeKernelGeometricMean(ItReg& beginReg, ItReg& endReg, int idx)
+{
+ double mantissa, MediaE, MediaM;
+ int expoente, Cont;
+ int MediaETmp = 0;
+ double MediaMTmp = 0;
+
+ double log_two = log(2.0);
+ Cont = 0;
+ ItReg it = beginReg;
+ double val;
+ while (it != endReg) {
+ if ((*it).getDoubleProperty(idx, val) && (val > 0))
+ {
+ mantissa = frexp(val,&expoente);
+ MediaMTmp = MediaMTmp+log(mantissa);
+ MediaETmp = MediaETmp+expoente;
+ Cont++;
+ }
+ ++it;
+ }
+
+ MediaE = MediaETmp;
+ MediaM = (MediaMTmp+(MediaE*log_two))/Cont;
+ MediaM = exp(MediaM);
+
+ return MediaM;
+}
+
+
+
+/*! \brief Evaluates normalization factor for kernel
+ * \param begin begin of event set iterator
+ * \param end end of event set iterator
+ * \return sum of intensities
+ **/
+template <typename ItEvt>
+double KernelNormalizationFactor(ItEvt itBegin, ItEvt itEnd) {
+
+ double normFactor = 0;
+ double intensity;
+
+ ItEvt evtIter = itBegin;
+
+ while (evtIter != itEnd) {
+
+ (*evtIter).getDoubleProperty(IDX_ATTR, intensity);
+ normFactor += intensity;
+ ++evtIter;
+ }
+
+ return normFactor;
+
+}
+
+
+/*! \brief Evaluates kernel value of events with intensity (attribute)
+ * for one support region, for a kernel function
+ * \param center support region centroid
+ * \param begin begin of event set iterator
+ * \param end end of event set iterator
+ * \param radius spatial threshold
+ * \param kfunc type of kernel function
+ * This function assumes that intensity value of event is available on its first
+ * property - if it does not exist, it is set to 1.0 (identity)
+ **/
+template <typename ItEvt>
+double TeKernelValue (TeCoord2D& center, ItEvt& begin, ItEvt& end,
+ double radius, TeKernelFunctionType kfunc)
+{
+
+ string intstr;
+
+ TeCoord2D location; //Event spatial location
+ double intensity; //Event intensity
+
+ //Final kernel value
+ double kernel = 0;
+
+ //Iterates through events, getting their location and intensity values
+ //and updating kernel value
+ ItEvt it = begin;
+ while (it != end)
+ {
+ if (!(*it).centroid(location)) {
+ throw TeKernelException(KERNEL_NO_CENTROID);
+ }
+
+ //If there is no properties, assume intensity of one
+ if (!(*it).getDoubleProperty(IDX_ATTR, intensity)) {
+ intensity = 1.0;
+ }
+
+ //Evaluates kernel value for one event
+ double distance = TeDistance (location,center);
+ double localK;
+
+ switch(kfunc) {
+ case TeKQuartic:
+ localK = TeKernelQuartic(radius,distance,intensity);
+ break;
+ case TeKNormal:
+ localK = TeKernelNormal(radius,distance,intensity);
+ break;
+ case TeKTriangular:
+ localK = TeKernelTriangular(radius,distance,intensity);
+ break;
+ case TeKNegExponential:
+ localK = TeKernelNegExponential(radius,distance,intensity);
+ break;
+ case TeKUniform:
+ localK = TeKernelUniform(radius,distance,intensity);
+ break;
+ }
+ kernel += localK;
+ ++it;
+
+ }
+ return kernel;
+}
+
+/*! \brief Normalizes kernel values based on type of computation.
+ * \brief Gets value from IDX_KERNEL and stores it at the same place
+ * \param events set of spatial events
+ * \param regionsBegin begin of regions iterator
+ * \param reginsEnd end of region iterator
+ * \param kfunc type of kernel function
+ * \param ktype type of computation (SMA, density or probability)
+ * \param radius spatial threshold
+ **/
+template<typename EventSet, typename ItRegionSet>
+bool TeKernelNormalize(EventSet& events,
+ ItRegionSet& regionsBegin,
+ ItRegionSet& regionsEnd,
+ TeKernelComputeType kType,
+ double totKernel,
+ int idxProp)
+{
+
+ double normKernel, kernel, area;
+ try {
+
+ //Evaluates sum of attributes for normalization
+ double normFactor =
+ KernelNormalizationFactor(events.begin(), events.end());
+
+ //Reiterates through regions defining normalized kernel value,
+ //given the computation type
+ ItRegionSet regIter = regionsBegin;
+ while (regIter != regionsEnd)
+ {
+
+ (*regIter).getDoubleProperty(idxProp, kernel);
+ if (kernel < 0) {
+ throw TeKernelException(KERNEL_INVALID_VALUE);
+ }
+
+ //Evaluates value based on computation type
+ switch(kType) {
+ case TeKMovingAverage:
+ normKernel = (kernel * normFactor)/totKernel;
+ break;
+ case TeKDensity:
+ //If region does not have an area, assumes one
+ if (!(*regIter).area(area))
+ area = 1;
+ if (area <= 0) {
+ throw TeKernelException(KERNEL_INVALID_AREA);
+ }
+ normKernel = ((kernel * normFactor)/totKernel)/area;
+ break;
+ case TeKProbability:
+ normKernel = kernel/totKernel;
+ break;
+ }
+
+ //Store final value
+ (*regIter).setDoubleProperty(idxProp, normKernel);
+ ++regIter;
+ }
+ } catch (TeKernelException /* e */) {
+// int a = e.getErrorCode();
+ return false;
+ }
+ return true;
+}
+
+
+/*! \brief Evaluates kernel value for all support regions,
+ * storing values either on IDX_KERNEL or IDX_NUMERATOR.
+ * \param events set of spatial events
+ * \param regionsBegin begin of regions iterator
+ * \param reginsEnd end of region iterator
+ * \param kfunc type of kernel function
+ * \param ktype type of computation (SMA, density or probability)
+ * \param radius spatial threshold
+ * \param idxProp index of double property
+ **/
+template<typename EventSet, typename ItRegionSet>
+bool TeStatIntKernel(EventSet& events,
+ ItRegionSet& regionsBegin,
+ ItRegionSet& regionsEnd,
+ TeKernelFunctionType kfunc,
+ TeKernelComputeType kType,
+ double radius,
+ int idxProp)
+{
+
+
+ //Support region attributes
+ TeCoord2D location;
+ double kernel;
+
+ //Regions iterator
+ ItRegionSet regIter = regionsBegin;
+ // Sum of kernels
+ double totKernel = 0;
+
+ //Treats unexpected expections returning false
+ try {
+
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+ t2 = clock();
+ t0 = t1 = t2;
+ int nsteps = 0;
+ //Iterates through regions
+ while (regIter != regionsEnd)
+ {
+ if (!(*regIter).centroid(location)) {
+ throw TeKernelException(KERNEL_NO_CENTROID);
+ }
+
+ //Define iterators for event sets -- may optimize
+ typename EventSet::iterator subSetBegin = events.begin(location,radius);
+ typename EventSet::iterator subSetEnd = events.end(location,radius);
+ if (kfunc == TeKNormal) {
+ subSetBegin = events.begin();
+ subSetEnd = events.end();
+ }
+
+ //Evaluates kernel value for region
+ kernel = TeKernelValue(location, subSetBegin, subSetEnd,
+ radius, kfunc);
+
+ totKernel += kernel;
+
+ (*regIter).setDoubleProperty(idxProp, kernel);
+ ++regIter;
+ t2 = clock();
+ ++nsteps;
+ if (TeProgress::instance())
+ {
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ if((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(nsteps);
+ }
+ }
+ }
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ if (totKernel <= 0) {
+ throw TeKernelException(KERNEL_ALL_NULL);
+ }
+
+ return TeKernelNormalize(events, regionsBegin, regionsEnd, kType, totKernel,
+ idxProp);
+
+ } catch (TeKernelException /* e */) {
+// int a = e.getErrorCode();
+ return false;
+ }
+
+ return true;
+}
+
+
+/*! \brief Evaluates adaptive kernel value for all support regions,
+ * storing values (intermediary and final) in double property idxProp
+ * \param events set of spatial events
+ * \param regionsBegin begin of regions iterator
+ * \param reginsEnd end of region iterator
+ * \param kfunc type of kernel function
+ * \param ktype type of computation (SMA, density or probability)
+ * \param numReg number of support regions -- need to evaluate initial radius
+ * \param totalArea total area of support regions -- need to evaluate initial radius
+ * \param idxProp index of double property
+ **/
+template<typename EventSet, typename ItRegionSet>
+bool TeStatAdaptiveGeoMeanIntKernel(EventSet& events,
+ ItRegionSet& regionsBegin,
+ ItRegionSet& regionsEnd,
+ TeKernelFunctionType kfunc,
+ TeKernelComputeType ktype,
+ int /* numReg */,
+ double totalArea,
+ int idxProp)
+{
+
+ try {
+
+ //Evaluate kernel with a fixed radius, based on formula, storing in vecValues
+ double radius = 0.68*pow((double)events.numObjects(),-0.2)*sqrt(totalArea);
+ double sqArea = sqrt(totalArea);
+ if (!TeStatIntKernel(events, regionsBegin, regionsEnd,
+ kfunc, ktype, radius, idxProp))
+ return false;
+
+ //Evaluate geometric mean of kernel values, to adjust radius
+ double meanKernel = TeKernelGeometricMean(regionsBegin, regionsEnd, idxProp);
+
+ if (meanKernel <= 0) {
+ throw TeKernelException(TeKernelException(KERNEL_ALL_NULL));
+ }
+
+ //Now, reassign radius, evaluating final value for kernel
+
+ ItRegionSet regIter = regionsBegin;
+ double prevKernel;
+ double newKernel;
+ double newRadius;
+ double totKernel = 0;
+ TeCoord2D location;
+
+ int dt = CLOCKS_PER_SEC/4;
+ int dt2 = CLOCKS_PER_SEC * 5;
+ clock_t t0, t1, t2;
+ t2 = clock();
+ t0 = t1 = t2;
+ int nsteps = 0;
+
+ //Iterates through regions
+ while (regIter != regionsEnd)
+ {
+ if (!(*regIter).centroid(location)) {
+ throw TeKernelException(KERNEL_NO_CENTROID);
+ }
+
+ //Define iterators for event sets -- may optimize
+ typename EventSet::iterator subSetBegin = events.begin(location,radius);
+ typename EventSet::iterator subSetEnd = events.end(location,radius);
+ if (kfunc == TeKNormal) {
+ subSetBegin = events.begin();
+ subSetEnd = events.end();
+ }
+
+ if (!((*regIter).getDoubleProperty(idxProp, prevKernel)) || (prevKernel < 0)) {
+ throw TeKernelException(KERNEL_INVALID_VALUE);
+ }
+
+ if (prevKernel > 0) {
+ newRadius = radius*pow((meanKernel/prevKernel),0.5);
+ if (newRadius > sqArea/4.0)
+ newRadius = sqArea/4.0; //Para funcionar quando o valor eh muito pequeno
+ newKernel = TeKernelValue(location, subSetBegin, subSetEnd, newRadius, kfunc);
+ }
+ else {
+ newKernel = 0.0;
+ }
+
+ totKernel += newKernel;
+ (*regIter).setDoubleProperty(idxProp, newKernel);
+ ++regIter;
+ t2 = clock();
+ ++nsteps;
+ if (TeProgress::instance())
+ {
+ if (int(t2-t1) > dt)
+ {
+ t1 = t2;
+ if (TeProgress::instance()->wasCancelled())
+ break;
+ if((int)(t2-t0) > dt2)
+ TeProgress::instance()->setProgress(nsteps);
+ }
+ }
+ }
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ if (totKernel <= 0) {
+ throw TeKernelException(KERNEL_ALL_NULL);
+ }
+
+ return TeKernelNormalize(events, regionsBegin, regionsEnd, ktype, totKernel,
+ idxProp);
+ } catch (TeKernelException /* e */) {
+// int a = e.getErrorCode();
+ return false;
+ }
+
+ return true;
+}
+
+
+
+/*! Class to apply kernel method
+*
+*/
+class TeStatKernel {
+
+public:
+
+ //! type of kernel function
+ TeKernelFunctionType kfunc_;
+ //! type of computation
+ TeKernelComputeType ktype_;
+ //! spatial threshold
+ double radius_;
+ //! sum of support region areas
+ double totalArea_;
+ //! number of support regions
+ int numReg_;
+
+ TeStatKernel() {
+ kfunc_ = TeKQuartic;
+ ktype_ = TeKDensity;
+ radius_ = 0;
+ totalArea_ = 0;
+ numReg_ = 0;
+ }
+
+ /*! \brief Apply kernel method to a specif set of support regions
+ * and events, storing results in resName_.
+ * \param events set of point events
+ * \param regionsBegin iterator for support regions
+ * \param regionsEnd iterator for support regions
+ * If radius_ is 0, then applies adaptive kernel.
+ */
+ template<typename EventSet, typename ItRegionSet>
+ bool apply(EventSet& events,
+ ItRegionSet regionsBegin,
+ ItRegionSet regionsEnd) {
+ if (totalArea_ <= 0) {
+ return false;
+ }
+
+ if (numReg_ <= 0) {
+ return false;
+ }
+
+ bool result;
+ //Radius defined, kernel with a fixed radius
+ if (radius_ > 0) {
+ result = TeStatIntKernel(events,regionsBegin, regionsEnd,
+ kfunc_,ktype_, radius_, IDX_KERNEL);
+
+ }
+ //Radius undefined, adaptive kernel
+ else {
+ result = TeStatAdaptiveGeoMeanIntKernel(events, regionsBegin, regionsEnd,
+ kfunc_, ktype_, numReg_, totalArea_, IDX_KERNEL);
+
+ }
+ return result;
+ }
+
+};
+
+
+
+class TeStatKernelRatio
+{
+ public:
+ int numReg_;
+
+ public:
+
+ TeKernelCombinationType kComb_;
+ TeKernelComputeType ktype_;
+ TeKernelFunctionType kfunc1_;
+ double radius1_;
+ TeKernelFunctionType kfunc2_;
+ double radius2_;
+ double totalArea_;
+
+
+ TeStatKernelRatio() {
+ kComb_ = TeKRatio;
+ kfunc1_ = kfunc2_ = TeKQuartic;
+ ktype_ = TeKDensity;
+ radius1_ = radius2_ = 0;
+ totalArea_ = 0;
+ numReg_ = 0;
+ }
+
+ template <typename EventSet1, typename EventSet2, typename ItRegionSet>
+ bool apply (EventSet1& ev1,
+ EventSet2& ev2,
+ ItRegionSet regBegin,
+ ItRegionSet regEnd) {
+
+
+ if (totalArea_ <= 0)
+ return false;
+
+ if (numReg_ <= 0)
+ return false;
+
+ //Calcula kernel para primeiro conjunto
+
+ bool result;
+ //Radius defined, kernel with a fixed radius
+ if (radius1_ > 0) {
+ result = TeStatIntKernel(ev1,regBegin, regEnd,
+ kfunc1_,ktype_, radius1_, IDX_KERNEL1);
+
+ }
+ //Radius undefined, adaptive kernel
+ else {
+ result = TeStatAdaptiveGeoMeanIntKernel(ev1, regBegin, regEnd,
+ kfunc1_, ktype_, numReg_, totalArea_, IDX_KERNEL1);
+
+ }
+
+ if (!result)
+ return result;
+
+
+ //Calcula kernel para segundo conjunto
+ //Radius defined, kernel with a fixed radius
+ if (radius2_ > 0) {
+ result = TeStatIntKernel(ev2,regBegin, regEnd,
+ kfunc2_,ktype_, radius2_, IDX_KERNEL2);
+
+ }
+ //Radius undefined, adaptive kernel
+ else {
+ result = TeStatAdaptiveGeoMeanIntKernel(ev2, regBegin, regEnd,
+ kfunc2_, ktype_, numReg_, totalArea_, IDX_KERNEL2);
+
+ }
+
+ if (!result)
+ return result;
+
+ //Itera calculando o tipo de combinacao e armazenando no valor da regiao
+ //Percorre todas as regioes
+// int Cont = 0;
+ double kernel;
+ double k1;
+ double k2;
+ double area;
+
+ ItRegionSet regIter = regBegin;
+
+ while (regIter != regEnd)
+ {
+
+ (*regIter).area(area);
+
+ (*regIter).getDoubleProperty(IDX_KERNEL1, k1);
+ (*regIter).getDoubleProperty(IDX_KERNEL2, k2);
+
+ switch(kComb_)
+ {
+ case TeKRatio:
+ if (k2 == 0.0)
+ kernel = 0.0;//INVALID_KERNEL;
+ else
+ kernel = k1/k2;
+ break;
+ case TeKLogRatio:
+ if (k2 == 0.0)
+ kernel = INVALID_KERNEL;
+ else
+ kernel = log(k1/k2);
+ break;
+ case TeAbsDifference:
+ kernel = k1 - k2;
+ break;
+ case TeRelDifference:
+ kernel = (k1 - k2) * area;
+ break;
+ case TeAbsSum:
+ kernel = k1+k2;
+ break;
+ case TeRelSum:
+ kernel = (k1 + k2) * area;
+ break;
+ }
+ (*regIter).setDoubleProperty(IDX_KERNEL, kernel);
+ ++regIter;
+ }
+
+ return true;
+ }
+
+};
+
+
+#endif
+
+
+
+
+
diff --git a/src/terralib/stat/TeKernelParams.h b/src/terralib/stat/TeKernelParams.h
new file mode 100644
index 0000000..ce9902d
--- /dev/null
+++ b/src/terralib/stat/TeKernelParams.h
@@ -0,0 +1,112 @@
+/************************************************************************************
+Exploring and analysis of geographical data using TerraLib and TerraView
+
+Copyright � 2003,2004 INPE and LESTE/UFMG.
+
+Partially funded by CNPq - Project SAUDAVEL, under grant no. 552044/2002-4,
+SENASP-MJ and INPE
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed hoping it will be useful, however, WITHOUT ANY
+WARRANTIES; neither to the implicit warranty of MERCHANTABILITY OR SUITABILITY FOR
+AN SPECIFIC FINALITY. Consult the GNU General Public License for more details.
+
+You must have received a copy of the GNU General Public License with this program.
+In negative case, write to the Free Software Foundation, Inc. in the following
+address: 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+***********************************************************************************/
+
+/*! \file TeKernelParams.h
+ This file contains structures and definitions about Kernel parameters
+*/
+#ifndef __TERRALIB_INTERNAL_KERNELPARAMS_H
+#define __TERRALIB_INTERNAL_KERNELPARAMS_H
+#include "TeUtils.h"
+
+#include <string>
+#include <vector>
+using namespace std;
+
+//! Kernel Algorithm types
+enum TeKernelFunctionType
+ {TeKQuartic, TeKNormal, TeKUniform, TeKTriangular, TeKNegExponential};
+
+
+//! Kernel Evaluation types
+enum TeKernelComputeType
+{TeKDensity, TeKMovingAverage, TeKProbability};
+
+enum TeKernelCombinationType
+{TeKRatio, TeKLogRatio, TeAbsDifference, TeRelDifference, TeAbsSum, TeRelSum};
+
+
+/*! \struct TeKernelParams
+ Kernel parameters representation
+*/
+struct TeKernelParams
+{
+ //first event theme
+ int eventThemeId1_; // event theme id
+ string eventThemeName1_; // event theme name
+ string intensityAttrName1_; // intensity attribute name
+ string intensityAttrTable1_; // table name that keeps the intensity attribute
+ TeKernelFunctionType kernelFunction1_; // kernel function
+ TeKernelComputeType computeType1_;
+ double radiusValue1_; // radius value if the kernel is not adaptative
+
+ TeKernelCombinationType combinationType_;
+
+ //second event theme (if Kernel ratio)
+ int eventThemeId2_; // event theme id
+ string eventThemeName2_; // event theme name
+ string intensityAttrName2_; // intensity attribute name
+ string intensityAttrTable2_; // table name that keeps the intensity attribute
+ TeKernelFunctionType kernelFunction2_; // kernel function
+ TeKernelComputeType computeType2_;
+ double radiusValue2_; // radius value if the kernel is not adaptative
+
+ //informations about the kernel result
+ int supportThemeId_; // support theme id
+ string supportThemeName_; // support theme name
+ string supportThemeTable_; // support theme table that keeps the kernel results
+ string supportThemeAttr_; // attribute name of the support theme table that keeps the kernel results
+ int generatedLayerId_; // id of the generated layer (when it�s raster)
+ string generatedLayerName_; // name of the generated layer (when it�s raster)
+
+ //! Empty constructor
+ TeKernelParams():
+ eventThemeId1_(0),
+ eventThemeName1_(""),
+ intensityAttrName1_(""),
+ intensityAttrTable1_(""),
+ kernelFunction1_(TeKQuartic),
+ computeType1_(TeKDensity),
+ radiusValue1_(0.0),
+ combinationType_(TeKRatio),
+ eventThemeId2_(0),
+ eventThemeName2_(""),
+ intensityAttrName2_(""),
+ intensityAttrTable2_(""),
+ kernelFunction2_(TeKQuartic),
+ computeType2_(TeKDensity),
+ radiusValue2_(0.0),
+ supportThemeId_(0),
+ supportThemeName_(""),
+ supportThemeTable_(""),
+ supportThemeAttr_(""),
+ generatedLayerId_(0),
+ generatedLayerName_("")
+ {}
+
+};
+
+//! A vector of TeKernelParams
+typedef vector<TeKernelParams> TeKernelParamsVector;
+
+
+#endif
+
diff --git a/src/terralib/stat/TeSkaterArvore.cpp b/src/terralib/stat/TeSkaterArvore.cpp
new file mode 100644
index 0000000..f8fcc7b
--- /dev/null
+++ b/src/terralib/stat/TeSkaterArvore.cpp
@@ -0,0 +1,62 @@
+//---------------------------------------------------------------------------
+#ifdef WIN32
+#pragma hdrstop
+#endif
+#include <stdlib.h>
+#include "TeSkaterArvore.h"
+#include "heap.h"
+void TArvore::Monta_Arvore(TSkaterGrafo *Grafo){
+ Heap = new THeap(Grafo->MyGrafo->Size);
+ Prim(Grafo);
+};
+
+/**********************************/
+void TArvore::Prim(TSkaterGrafo *Grafo) {
+ int Menor;
+ int Viz;
+ double Peso;
+ int* Pai;
+
+ Pai = (int*)malloc(sizeof(int)*(Grafo->MyGrafo->Size));
+ if (Pai == NULL)
+ FatalError("Falta memoria");
+ try
+ {
+ while (!(Heap->Empty()))
+ {
+ Menor = Heap->Extract_Min();
+ Grafo->MyGrafo->Nos[Menor].Mark=0; //Marca que o nodo esta fora da Fila
+ for(Grafo->Adjacente(&Viz,&Peso,Menor);Viz!=-1;Grafo->Adjacente(&Viz,&Peso,Menor))
+ {
+ if (Grafo->MyGrafo->Nos[Viz].Mark && Peso<(Heap->Key(Viz)))
+ {
+ Pai[Viz]=Menor;
+ Heap->SetKey(Viz,Peso);
+ };
+ }
+
+ if(Menor)
+ {
+ try
+ {
+ //Testa se nao e a raiz. Raiz nao tem pai nem e filho
+ Grafo->MyGrafo->Nos[Pai[Menor]].ArViz->Insere(Menor,0);
+ }
+ catch(...)
+ {
+ continue;
+ }
+ }
+ }
+ }
+ catch(...)
+ {
+ return;
+ }
+};
+//---------------------------------------------------------------------------
+TArvore::~TArvore(){
+ delete Heap;
+};
+
+
diff --git a/src/terralib/stat/TeSkaterArvore.h b/src/terralib/stat/TeSkaterArvore.h
new file mode 100644
index 0000000..760d9de
--- /dev/null
+++ b/src/terralib/stat/TeSkaterArvore.h
@@ -0,0 +1,18 @@
+//---------------------------------------------------------------------------
+#ifndef ArvoreH
+#define ArvoreH
+#include "TeSkaterGrafo.h"
+#include "heap.h"
+
+class TArvore{
+ private:
+ THeap *Heap;
+ void Prim(TSkaterGrafo *);
+ public:
+ ~TArvore();
+ void Monta_Arvore(TSkaterGrafo *);
+
+};
+
+//---------------------------------------------------------------------------
+#endif
diff --git a/src/terralib/stat/TeSkaterFunctions.cpp b/src/terralib/stat/TeSkaterFunctions.cpp
new file mode 100644
index 0000000..5fc2b01
--- /dev/null
+++ b/src/terralib/stat/TeSkaterFunctions.cpp
@@ -0,0 +1,414 @@
+//---------------------------------------------------------------------------
+#include <stdio.h>
+#ifdef WIN32
+#pragma hdrstop
+#endif
+#include "TeSkaterGrafo.h"
+#include "TeSkaterArvore.h"
+#include "filaR.h"
+#include "filaDouble.h"
+#include "filaInt.h"
+#include "TeSkaterFunctions.h"
+#include <TeDefines.h>
+#include "TeAttribute.h"
+#include "TeUtils.h"
+#include "TeSTElementSet.h"
+
+
+
+class TParticao{
+private:
+ double* BFS_Media(int,int,long*);
+ double BFS_Desvio(int,int,double*);
+ double Dist(int,double*);
+ void BFS_Main(TFilaR::Item_ptr);//Raiz,Populacao,Desvio
+ TSkaterGrafo *Grafo;
+ long PopMin;
+ int Num_Grupos;
+public:
+ TFilaR *Clusters;
+ TParticao(TSkaterGrafo*);
+ ~TParticao();
+ TFilaDouble *QuedaDesv;
+ void Particiona(int,long);
+ void BFS_Salva(TeSTElementSet& regSet, string name);
+};
+
+
+//---------------------------------------------------------------------------
+TParticao::TParticao(TSkaterGrafo *G){
+ Grafo=G;
+ QuedaDesv = new TFilaDouble;
+ Clusters = new TFilaR;
+ Clusters->Insere(0,TeMAXFLOAT,(long)TeMAXFLOAT);
+ Num_Grupos = 1;
+};
+
+//---------------------------------------------------------------------------
+TParticao::~TParticao(){
+ delete Clusters;
+};
+
+//---------------------------------------------------------------------------
+double* TParticao::BFS_Media(int Raiz,int Exceto,long *Populacao){
+ double *Acc;
+ double Peso;// Usado na busca dos filhos
+ int Indice; // Usado na busca dos filhos
+ int i;
+ int n=0;
+ int Atual; // No sendo visitado
+ TFilaInt *Fila;
+
+ Acc = new double[Grafo->MyGrafo->Num_Var];
+ for(i=0;i<Grafo->MyGrafo->Num_Var;i++)
+ Acc[i] =0;
+ *Populacao = 0;
+
+ Fila = new TFilaInt;
+ Fila->Insere(Raiz);
+
+ while (Fila->Size()){
+ Atual = Fila->Retira();
+
+ /** Calculo da Media **/
+ n++;
+ for(i=0;i<Grafo->MyGrafo->Num_Var;i++)
+ Acc[i] += Grafo->MyGrafo->Nos[Atual].Variaveis[i];
+ *Populacao = *Populacao + Grafo->MyGrafo->Nos[Atual].Populacao;
+
+ /** Insere Filhos na Lista **/
+ Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso);
+ while(Indice!=-1){
+ if (Indice != Exceto)
+ Fila->Insere(Indice);
+ Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso);
+ };
+ };
+ for(i=0;i<Grafo->MyGrafo->Num_Var;i++)
+ Acc[i] /=n;
+
+ delete Fila;
+ return Acc;
+};
+//---------------------------------------------------------------------------
+
+double TParticao::BFS_Desvio(int Raiz,int Exceto,double *Media){
+ double Acc=0;
+ double Peso;// Usado na busca dos filhos
+ int Indice; // Usado na busca dos filhos
+ int Atual; // No sendo visitado
+ TFilaInt *Fila;
+
+ Fila = new TFilaInt;
+ Fila->Insere(Raiz);
+
+ while (Fila->Size()){
+ Atual = Fila->Retira();
+
+ /** Calculo do desvio **/
+ Acc += Dist(Atual,Media);
+
+ /** Insere Filhos na Lista **/
+ Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso);
+ while(Indice != -1){
+ if (Indice != Exceto)
+ Fila->Insere(Indice);
+ Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso);
+ };
+ };
+ return Acc;
+};
+
+//---------------------------------------------------------------------------
+double TParticao::Dist(int Atual,double *Media){
+ int i;
+ double Acc=0;
+
+ for(i=0;i<Grafo->MyGrafo->Num_Var;i++)
+ Acc += (Grafo->MyGrafo->Nos[Atual].Variaveis[i] - Media[i]) *
+ (Grafo->MyGrafo->Nos[Atual].Variaveis[i] - Media[i]);
+ return Acc;
+};
+
+//---------------------------------------------------------------------------
+
+void TParticao::BFS_Main(TFilaR::Item_ptr Item){//Raiz,Populacao,Desvio
+ //int i=0;
+ int Atual; // No sendo visitado
+ double Peso;// Usado na busca dos filhos
+ int Indice=0; // Usado na busca dos filhos
+ double *M1,*M2,D1,D2;
+ long Pop1,Pop2;
+ double D_Min = TeMAXFLOAT;
+ double DMin1;
+ double DMin2;
+ long Raiz1,PopMin1;
+ long Raiz2,PopMin2;
+ TFilaInt *Fila;
+
+ if (!Item->Desvio) return;
+
+ Fila = new TFilaInt;
+ Fila->Insere(Item->Raiz);
+
+ M1 = new double[Grafo->MyGrafo->Num_Var];
+ M2 = new double[Grafo->MyGrafo->Num_Var];
+
+ while (Fila->Size()){
+ Atual = Fila->Retira();
+ //i++;
+ /* Insere Filhos na fila */
+ Grafo->MyGrafo->Nos[Atual].ArViz->AdjacenteB(&Indice,&Peso);
+ while (Indice != -1){
+ Fila->Insere(Indice);
+ M1 = BFS_Media(Indice,0,&Pop1);
+ D1 = BFS_Desvio(Indice,0,M1);
+
+ M2 = BFS_Media(Item->Raiz,Indice,&Pop2);
+ D2 = BFS_Desvio(Item->Raiz,Indice,M2);
+ if (((D1+D2) < D_Min) && (Pop1 > PopMin) && (Pop2 > PopMin)) { //encontrou um minimo
+ D_Min = (D1+D2);
+ Raiz1 = Indice;
+ Raiz2 = Atual;
+ PopMin1 = Pop1;
+ PopMin2 = Pop2;
+ DMin1 = D1;
+ DMin2 = D2;
+ };
+ Grafo->MyGrafo->Nos[Atual].ArViz->AdjacenteB(&Indice,&Peso);
+ };
+ };
+ /*Atualizacao dos dados*/
+if (D_Min != TeMAXFLOAT){
+ Item->D1 = DMin1;
+ Item->D2 = DMin2;
+ Item->P1 = PopMin1;
+ Item->P2 = PopMin2;
+ Item->R1 = Raiz1;
+ Item->R2 = Raiz2;
+ Item->Queda = Item->Desvio - DMin1 - DMin2;
+ } else
+ Item->Desvio = 0;
+
+ delete Fila;
+ delete M1;
+ delete M2;
+};
+
+//---------------------------------------------------------------------------
+void TParticao::Particiona(int N_Grp,long Pop){
+ int i;
+ int Raiz;
+ int Sai;
+ double QMax;
+ int R1,R2;
+ double D1,D2;
+ long P1,P2;
+ TFilaR::Item_ptr Item;
+ double Acc;
+
+ PopMin = Pop;
+
+ if (Pop == -1){ // Nao levar em conta populacao
+ while (N_Grp != Num_Grupos){
+ Item = Clusters->mFila->Head;
+ for(i=0;i<Clusters->mFila->Size;i++){
+ if (!Item->Queda) BFS_Main(Item);
+ Item = Item->Proximo;
+ };
+ Item = Clusters->mFila->Head;
+ QMax = 0;
+ for(i=0;i<Clusters->mFila->Size;i++){
+ if (Item->Queda > QMax){
+ QMax = Item->Queda;
+ Raiz = Item->Raiz;
+ R1 = Item->R1;
+ R2 = Item->R2;
+ D1 = Item->D1;
+ D2 = Item->D2;
+ P1 = Item->P1;
+ P2 = Item->P2;
+ };
+ Item = Item->Proximo;
+ };
+ Grafo->MyGrafo->Nos[R2].ArViz->Retira(R1);
+ Num_Grupos++;
+ Clusters->Insere(R1,D1,P1);
+ Clusters->Retira(Raiz);
+ Clusters->Insere(Raiz,D2,P2);
+ Acc = 0;
+ while (Clusters->Proximo() != -1) Acc += Clusters->mFila->Atual->Desvio;
+ QuedaDesv->Insere(Acc);
+ };
+ } else
+ if (N_Grp == 0)
+ {
+ Sai=0;
+ while (!Sai){
+ Item = Clusters->mFila->Head;
+ for(i=0;i<Clusters->mFila->Size;i++){
+ if (!Item->Queda) BFS_Main(Item);
+ Item = Item->Proximo;
+ };
+
+ Item = Clusters->mFila->Head;
+ QMax = 0;
+ Sai = 1;
+ for(i=0;i<Clusters->mFila->Size;i++){
+ if (Item->Desvio) Sai = 0;
+ if (Item->Queda > QMax){
+ QMax = Item->Queda;
+ Raiz = Item->Raiz;
+ R1 = Item->R1;
+ R2 = Item->R2;
+ D1 = Item->D1;
+ D2 = Item->D2;
+ P1 = Item->P1;
+ P2 = Item->P2;
+ };
+ Item = Item->Proximo;
+ };
+ if (!Sai){
+ Grafo->MyGrafo->Nos[R2].ArViz->Retira(R1);
+ Num_Grupos++;
+ Clusters->Insere(R1,D1,P1);
+ Clusters->Retira(Raiz);
+ Clusters->Insere(Raiz,D2,P2);
+ Acc = 0;
+ while (Clusters->Proximo() != -1) Acc += Clusters->mFila->Atual->Desvio;
+ QuedaDesv->Insere(Acc);
+ };
+ };//while
+ } else { // Grupos com populacao restringida
+ Sai=0;
+ while (!Sai){
+ Item = Clusters->mFila->Head;
+ for(i=0;i<Clusters->mFila->Size;i++){
+ if (!Item->Queda) BFS_Main(Item);
+ Item = Item->Proximo;
+ };
+
+ Item = Clusters->mFila->Head;
+ QMax = 0;
+ Sai = 1;
+ for(i=0;i<Clusters->mFila->Size;i++){
+ if (Item->Desvio) Sai = 0;
+ if (Item->Queda > QMax){
+ QMax = Item->Queda;
+ Raiz = Item->Raiz;
+ R1 = Item->R1;
+ R2 = Item->R2;
+ D1 = Item->D1;
+ D2 = Item->D2;
+ P1 = Item->P1;
+ P2 = Item->P2;
+ };
+ Item = Item->Proximo;
+ };
+ if (!Sai){
+ Grafo->MyGrafo->Nos[R2].ArViz->Retira(R1);
+ Num_Grupos++;
+ Clusters->Insere(R1,D1,P1);
+ Clusters->Retira(Raiz);
+ Clusters->Insere(Raiz,D2,P2);
+ Acc = 0;
+ while (Clusters->Proximo() != -1) Acc += Clusters->mFila->Atual->Desvio;
+ QuedaDesv->Insere(Acc);
+ if (Num_Grupos >= N_Grp) Sai = 1;
+ };
+ };//while
+ }//else
+};
+//---------------------------------------------------------------
+
+void TParticao::BFS_Salva(TeSTElementSet& regSet, string name){
+ double Peso;// Usado na busca dos filhos
+ int Indice; // Usado na busca dos filhos
+ int Atual; // No sendo visitado
+ int i=1;
+ TFilaInt *Fila;
+ int Raiz;
+
+ TeProperty prop;
+ prop.attr_.rep_.name_ = name;
+ prop.attr_.rep_.type_ = TeREAL;
+
+ Raiz=Clusters->Proximo();
+ while (Raiz != -1){
+
+ prop.value_ = Te2String(i);
+
+ Fila = new TFilaInt;
+ Fila->Insere(Raiz);
+
+ while (Fila->Size()){
+ Atual = Fila->Retira();
+
+ /** Insere Filhos na Lista **/
+ Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso);
+ while(Indice != -1){
+ Fila->Insere(Indice);
+ Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso);
+ };
+ regSet.addProperty(Grafo->MyGrafo->Nos[Atual].Label, prop);
+ }
+ i++;
+ Raiz=Clusters->Proximo();
+ }
+}
+
+
+
+bool TeSkaterFunction(bool hasPop, int tipo, int nGrupos, int popMin,
+ TeSTElementSet& regSet, string name,
+ vector<double>& hetDrop) {
+
+ TParticao *Particao = 0;
+ try
+ {
+ //Monta grafo a partir do conjunto
+ TSkaterGrafo g(hasPop);
+ if (!g.MontaGrafo(regSet)) {
+ return false;
+ }
+
+ TArvore* a = new TArvore();
+ a->Monta_Arvore(&g);
+ delete a;
+
+
+ Particao = new TParticao(&g);
+ switch (tipo) {
+ case SKATER_POR_GRUPO:
+ Particao->Particiona(nGrupos,-1);
+ break;
+ case SKATER_POR_POPULACAO:
+ Particao->Particiona(0,popMin);
+ break;
+ case SKATER_POR_AMBOS:
+ Particao->Particiona(nGrupos,popMin);
+ break;
+ }
+
+ Particao->BFS_Salva(regSet, name);
+
+ //Copia as quedas a partir do numero de grupos para hetDrop,
+ //comecando do menor
+ hetDrop.clear();
+ int size = Particao->QuedaDesv->Size();
+ for (int gr = 0; gr < size; gr++) {
+ double het = Particao->QuedaDesv->Retira();
+ hetDrop.push_back(het);
+ }
+ delete Particao;
+ }
+ catch(...)
+ {
+ if(Particao)
+ delete Particao;
+
+ return false;
+ }
+
+ return true;
+}
diff --git a/src/terralib/stat/TeSkaterFunctions.h b/src/terralib/stat/TeSkaterFunctions.h
new file mode 100644
index 0000000..1e47d90
--- /dev/null
+++ b/src/terralib/stat/TeSkaterFunctions.h
@@ -0,0 +1,32 @@
+//---------------------------------------------------------------------------
+#ifndef ParticaoH
+#define ParticaoH
+
+
+
+#define SKATER_SEM_POPULACAO 0
+#define SKATER_COM_POPULACAO 1
+
+
+#define SKATER_POR_GRUPO 0
+#define SKATER_POR_POPULACAO 1
+#define SKATER_POR_AMBOS 2
+
+#include <string>
+#include <vector>
+using namespace std;
+
+/** Funcao de regionalizacao de um conjunto de poligonos
+ * hasPop: se ha atributo de populacao, que devera ser o ultimo
+ * tipo: tipo de quebra, por grupo, por populacao ou por ambos
+ * nGrupos: numero de grupos de quebra
+ * popMin: tamanho minimo da populacao
+ * regSet: conjunto de areas a serem regionalizadas, com seus atributos
+ * hetDrop: heterogeneidade dado cada uma das divisoes
+ **/
+bool TeSkaterFunction(bool hasPop, int tipo, int nGrupos, int popMin,
+ TeSTElementSet& regSet, string resName,
+ vector<double>& hetDrop);
+
+//---------------------------------------------------------------------------
+#endif
diff --git a/src/terralib/stat/TeSkaterGrafo.cpp b/src/terralib/stat/TeSkaterGrafo.cpp
new file mode 100644
index 0000000..c6f9cb3
--- /dev/null
+++ b/src/terralib/stat/TeSkaterGrafo.cpp
@@ -0,0 +1,188 @@
+//---------------------------------------------------------------------------
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#ifdef WIN32
+#pragma hdrstop
+#endif
+
+#include "TeSkaterGrafo.h"
+#include "lista.h"
+#include "TeProxMatrixConstructionStrategy.h"
+#include "TeGeneralizedProxMatrix.h"
+#include "TeSTElementSet.h"
+
+
+TSkaterGrafo::TSkaterGrafo(bool hasPop){
+
+ MyGrafo= new MyGrafo_t;
+ MyGrafo->Nos = (Grafo_ptr) malloc(sizeof(Grafo_t));
+ MyGrafo->Size = 0;
+ Hash = new THash;
+ Tem_Pop = (hasPop) ? 1 : 0;
+};
+
+
+/*************************/
+int TSkaterGrafo::GetSize(){
+
+ return MyGrafo->Size; //Retorna o tamanho do grafo
+};
+
+
+/*************************/
+/*************************/
+
+bool TSkaterGrafo::MontaGrafo(TeSTElementSet& regSet) {
+
+// long nAreas = regSet.numElements();
+
+ TeSTElementSet::iterator it = regSet.begin();
+ int nCov = (*it).getPropertyVector().size();
+
+
+ //Monta lista de areas
+
+ TeCoord2D centroid;
+ (*it).centroid(centroid);
+ X_min=X_max=centroid.x();
+ Y_min=Y_max=centroid.y();
+ //Obtem o numero de variaveis --> se tem populacao e menos um
+ if (this->Tem_Pop)
+ MyGrafo->Num_Var = nCov-1; //Obtem o numero de variaveis
+ else
+ MyGrafo->Num_Var = nCov;
+
+ string val;
+ int i;
+
+ //Monta areas
+ while (it != regSet.end())
+ {
+ (*it).centroid(centroid);
+ MyGrafo->Nos =
+ (Grafo_ptr) realloc(MyGrafo->Nos,sizeof(Grafo_t)*((MyGrafo->Size)+1));
+ sprintf(MyGrafo->Nos[MyGrafo->Size].Label,"%s",(*it).objectId().c_str());
+ MyGrafo->Nos[MyGrafo->Size].Vizinhos = NULL;
+ MyGrafo->Nos[MyGrafo->Size].ArViz = NULL;
+ Hash->Insere(MyGrafo->Nos[MyGrafo->Size].Label,MyGrafo->Size);
+ MyGrafo->Nos[MyGrafo->Size].X = centroid.x();
+ if(centroid.x() < X_min) X_min =centroid.x();// Procura limites da tela
+ else if(centroid.x() > X_max) X_max = centroid.x();
+
+ MyGrafo->Nos[MyGrafo->Size].Y =centroid.y();
+ if(centroid.y()< Y_min) Y_min = centroid.y(); //Procura limites da tela
+ else if(centroid.y() > Y_max) Y_max = centroid.y();
+
+ MyGrafo->Nos[MyGrafo->Size].Variaveis =
+ (double *) malloc(sizeof(double)*MyGrafo->Num_Var);
+ for(i=0;i<MyGrafo->Num_Var;i++) {
+ (*it).getPropertyValue(val, i);
+ MyGrafo->Nos[MyGrafo->Size].Variaveis[i] = atof(val.c_str());
+ }
+ if (Tem_Pop) {
+ (*it).getPropertyValue(val, MyGrafo->Num_Var);
+ MyGrafo->Nos[MyGrafo->Size].Populacao = (int)atof(val.c_str());//covs[a*nCov+nCov-1];
+ }
+ else
+ MyGrafo->Nos[MyGrafo->Size].Populacao = 0;
+
+ MyGrafo->Nos[MyGrafo->Size].Mark=1;
+ (MyGrafo->Size)++;
+ (++it);
+ }
+
+
+ //Monta vizinhanca
+ //Monta matriz de vizinhanca
+ TeProxMatrixLocalAdjacencyStrategy matrix(®Set, TePOLYGONS);
+ TeGeneralizedProxMatrix neighMatrix(&matrix);
+
+ int L_indice,V_indice;
+ double dist;
+
+ it = regSet.begin();
+
+ while ( it != regSet.end())
+ {
+ TeNeighboursMap neighbors = neighMatrix.getMapNeighbours((*it).objectId());
+
+ //Grafo eh desconexo
+ if (neighbors.size() == 0)
+ {
+ delete Hash;
+ return false;
+ }
+
+ L_indice = Hash->Pesquisa((*it).objectId().c_str());
+ MyGrafo->Nos[L_indice].Vizinhos = new TListaVizinho;
+ MyGrafo->Nos[L_indice].ArViz = new TListaVizinho;
+
+ TeNeighboursMap::iterator itNeigs = neighbors.begin();
+
+ while(itNeigs != neighbors.end())
+ {
+
+ V_indice = Hash->Pesquisa(((*itNeigs).first).c_str());
+ dist = Distancia(L_indice,V_indice);
+ MyGrafo->Nos[L_indice].Vizinhos->Insere(V_indice,dist);
+ (++itNeigs);
+ }
+ (++it);
+ }
+
+ delete Hash;
+ return true;
+}
+
+
+/*************************/
+double TSkaterGrafo::Distancia(int L_indice, int V_indice){
+
+ int i;
+ double Acc=0;
+
+ for(i=0;i < MyGrafo->Num_Var;i++)
+ Acc += (MyGrafo->Nos[L_indice].Variaveis[i] - MyGrafo->Nos[V_indice].Variaveis[i]) *
+ (MyGrafo->Nos[L_indice].Variaveis[i] - MyGrafo->Nos[V_indice].Variaveis[i]);
+ return sqrt(Acc);
+};
+
+//-------------------------------------
+void TSkaterGrafo::Escalona(double *X, double *Y){
+ *X = Cx *(*X + Gamax);
+ *Y = Cy *(*Y + Gamay);
+};
+
+/***************************/
+//Retorna o Indice e o peso do proximo Vizinho -1 se nao houver mais vizinhos
+void TSkaterGrafo::Adjacente(int *Indice,double *Peso,int i){
+ MyGrafo->Nos[i].Vizinhos->Adjacente(Indice,Peso);
+};
+
+void TSkaterGrafo::Adjacente1(int *Indice,double *Peso,int i){
+ MyGrafo->Nos[i].ArViz->Adjacente(Indice,Peso);
+};
+
+//--------------------------------------------------------
+void TSkaterGrafo::Escala(int Altura,int Largura){
+
+ Cx = (Largura - 2*(RAIO))/(X_max-X_min);
+ Gamax = -RAIO/Cx - X_min;
+
+ Cy = (Altura - 2*(RAIO))/(Y_max-Y_min);
+ Gamay = -RAIO/Cy - Y_min;
+};
+//--------------------------------------------------------
+double TSkaterGrafo::Get_X(int Indice){
+ return MyGrafo->Nos[Indice].X;
+};
+
+//--------------------------------------------------------
+double TSkaterGrafo::Get_Y(int Indice){
+ return MyGrafo->Nos[Indice].Y;
+};
+//---------------------------------------------
+int TSkaterGrafo::GetNum_Var(){
+ return MyGrafo->Num_Var;
+};
diff --git a/src/terralib/stat/TeSkaterGrafo.h b/src/terralib/stat/TeSkaterGrafo.h
new file mode 100644
index 0000000..7ae0304
--- /dev/null
+++ b/src/terralib/stat/TeSkaterGrafo.h
@@ -0,0 +1,75 @@
+#include "hash.h"
+#include "lista.h"
+#define RAIO 4
+//---------------------------------------------------------------------------
+#ifndef GrafoH
+#define GrafoH
+//---------------------------------------------------------------------------
+
+class TeSTElementSet;
+
+class TSkaterGrafo {
+
+public:
+
+ typedef struct No_Grafo{
+ char Label[50];
+ double X;
+ double Y;
+ TListaVizinho *Vizinhos;
+ TListaVizinho *ArViz;
+ double *Variaveis;
+ int Populacao;
+ char Mark;
+ } Grafo_t, *Grafo_ptr;
+
+ typedef struct Grafo{
+ Grafo_ptr Nos;
+ int Num_Var;
+ int Size;
+ }MyGrafo_t,*MyGrafo_ptr;
+
+/**** Funcoes Publicas ****/
+ TSkaterGrafo(bool hasPop);
+ bool MontaGrafo(TeSTElementSet& regSet);
+ void Escalona(double *,double *);
+ void Escala(int,int);
+ void Adjacente(int *,double *,int i);
+ void Adjacente1(int *,double *,int i);
+ int Size() {return GetSize();}
+ double MinX() {return X_min;}
+ double MaxX() {return X_max;}
+ double MinY() {return Y_min;}
+ double MaxY() {return Y_max;}
+ double Coord_X(int Indice){return Get_X(Indice);}
+ double Coord_Y(int Indice) {return Get_Y(Indice);}
+ int Num_Var() {return GetNum_Var();}
+
+
+ /***** Area Privada *****/
+private:
+ MyGrafo_ptr MyGrafo;
+ THash *Hash;
+ double X_min,X_max;//Usado para conversao de escala
+ double Y_min,Y_max;//Usado para conversao de escala
+ double Cx,Gamax; //Usados na conversao de escala
+ double Cy,Gamay; //Usados na conversao de escala
+
+ double Distancia(int,int);
+ double Get_X(int Indice);
+ double Get_Y(int Indice);
+ int GetSize();
+ int GetNum_Var();
+
+ //Variaveis que sao inicializadas de fora
+ char *NArq;
+ char *NViz;
+ char Tem_Pop;
+
+ friend class TArvore;
+ friend class TParticao;
+ friend class TPrincipal;
+ friend class TEstatistica;
+};
+
+#endif
diff --git a/src/terralib/stat/TeSpatialStatistics.cpp b/src/terralib/stat/TeSpatialStatistics.cpp
new file mode 100644
index 0000000..5baf107
--- /dev/null
+++ b/src/terralib/stat/TeSpatialStatistics.cpp
@@ -0,0 +1,987 @@
+#include "TeSpatialStatistics.h"
+#include "TeLayer.h"
+#include "TeGeneralizedProxMatrix.h"
+#include "TeSTEvent.h"
+#include "TeSTElementSet.h"
+#include "TeStatistics.h"
+#include "TeProgress.h"
+
+
+bool
+TeLocalMean (TeSTEventSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr)
+{
+
+ TeSTEventSet::iterator itObjs = elemSet->begin();
+ double numberNeighbors;
+
+ while (itObjs != elemSet->end())
+ {
+ double sum = 0.;
+ double localMean = 0.;
+
+ TeNeighboursMap neighbors = proxMatrix->getMapNeighbours((*itObjs).objectId());
+ TeNeighboursMap::iterator itNeigs = neighbors.begin();
+ numberNeighbors = neighbors.size();
+
+ while(itNeigs != neighbors.end())
+ {
+ //retrieve the neighbor attribute value
+ double val;
+ if(!elemSet->getAttributeValue ((*itNeigs).first, indexAttr, val))
+ return false;
+
+ // find the weight associated with the neighbor (attribute of index 0)
+ double weight = (*itNeigs).second.Weight();
+
+ sum += weight * val;
+ ++itNeigs;
+ }
+
+ localMean = sum;
+
+ TeAttributeRep rep;
+ rep.name_ = "LocalMean";
+ rep.type_ = TeREAL;
+ (*itObjs).addProperty(localMean, rep, false);
+
+ rep.name_ = "NumNeighbors";
+ rep.type_ = TeINT;
+ (*itObjs).addProperty((double)numberNeighbors, rep, false);
+
+ ++itObjs;
+ }
+
+ return true;
+}
+
+double
+TeMoranIndex2 (TeSTEventSet* elemSet, const double& mean, const double& var, TeGeneralizedProxMatrix* proxMatrix, int indexAttr)
+{
+ double moran = 0;
+ TeSTEventSet::iterator itObjs = elemSet->begin();
+ int numberObjs = elemSet->numSTInstance();
+
+ while ( itObjs != elemSet->end())
+ {
+ double normObjVal = (*itObjs)[indexAttr] - mean;
+ double li = 0.;
+ double weightSum = 0.;
+
+
+ TeNeighboursMap neighbors = proxMatrix->getMapNeighbours((*itObjs).objectId());
+ TeNeighboursMap::iterator itNeigs = neighbors.begin();
+
+ while(itNeigs != neighbors.end())
+ {
+ //retrieve the neighbor attribute value
+ double val;
+ if(!elemSet->getAttributeValue ((*itNeigs).first, indexAttr, val))
+ return 0.;
+
+ // normalize the property
+ double normNeighVal = val - mean;
+
+ // find the weight associated with the neighbor (attribute of index 0)
+ double weight = (*itNeigs).second.Weight();
+ li += weight * ( normNeighVal ) * ( normObjVal ); // se dividir pela vari�ncia � o �ndice local de moran
+ weightSum += weight;
+ ++itNeigs;
+ }
+
+ if (weightSum != 0.)
+ li /= weightSum;
+
+
+ moran += li;
+
+ ++itObjs;
+ }
+
+ if ( numberObjs > 1 )
+ return moran / ( var * ( numberObjs - 1 ) );
+ else
+ return moran / var;
+}
+
+double
+TeMoranIndex (TeSTEventSet* elemSet, int indexZ, int indexWZ)
+{
+ double variance = 0.;
+ double sum = 0;
+ int number = 0;
+
+ variance = TeSecondMoment (elemSet->begin(), elemSet->end(), 0, indexZ);
+ TeSTEventSet::iterator it = elemSet->begin();
+
+ while (it != elemSet->end())
+ {
+ double z = (*it)[indexZ];
+ double wz = (*it)[indexWZ];
+ double ZxWZ;
+ if(variance==0)
+ ZxWZ = 0.;
+ else
+ ZxWZ = (z*wz)/variance;
+
+ //keep
+ TeAttributeRep rep;
+ rep.name_ = "MoranIndex";
+ rep.type_ = TeREAL;
+ (*it).addProperty(ZxWZ, rep, false);
+
+ sum += ZxWZ;
+ number++;
+ ++it;
+ }
+
+ return sum /= number;
+}
+
+double
+TeGlobalMoranSignificance (TeSTEventSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr,
+ unsigned int permutationsNumber, double moranIndex)
+{
+
+ vector<double> permutationsResults(permutationsNumber);
+ double significance;
+
+ unsigned int objectsNumber = elemSet->numSTInstance();
+
+ //progress bar
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(permutationsNumber);
+
+ vector<double> deviations(objectsNumber);
+ vector<double>::iterator itDev = deviations.begin();
+ TeSTEventSet::iterator itObjs = elemSet->begin();
+ while(itObjs != elemSet->end())
+ {
+ (*itDev) = (*itObjs)[indexAttr]; //attribute value
+ ++itObjs;
+ ++itDev;
+ }
+
+ TeStatisticValMap stat;
+ if(!TeCalculateStatistics(elemSet->begin(), elemSet->end(), stat, 0))
+ return 0.;
+
+ double mean = stat[TeMEAN];
+ double var = stat[TeVARIANCE];
+
+ srand(time(0));
+ unsigned int i;
+ for (i = 0; i < permutationsNumber; i++)
+ {
+ TeSTEventSet changedObjects;
+
+ itObjs = elemSet->begin();
+
+ // chande values
+ while(itObjs != elemSet->end())
+ {
+ TeSTEvent stoChange;
+ stoChange.objectId((*itObjs).objectId());
+
+ double ranaux = rand();
+ int randon = (int) ((ranaux * (objectsNumber-1))/RAND_MAX );
+ double value = deviations[randon];
+
+ stoChange.addProperty(value);
+
+ changedObjects.insertSTInstance (stoChange);
+ ++itObjs;
+ }
+
+ permutationsResults[i] = TeMoranIndex2 (&changedObjects, mean, var, proxMatrix, 0);
+
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return 0.;
+ }
+ else
+ TeProgress::instance()->setProgress(i);
+ }
+ }
+
+ // verify the significance
+ int position = 0;
+ significance = 0;
+ unsigned int k;
+ for (k = 0; k < permutationsNumber; k++)
+ {
+ if (moranIndex < permutationsResults[k]) //>
+ position++;
+ }
+ if ( moranIndex >= 0)
+ significance = (double) (position+1) / (permutationsNumber+1);
+ else
+ significance = (double) (permutationsNumber-position)/(permutationsNumber+1);
+
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ return significance;
+}
+
+
+void
+TeMoranMap (TeSTEventSet* elemSet, int indexLISAMap, int indexBoxMap)
+{
+ TeSTEventSet::iterator it = elemSet->begin();
+ while ( it != elemSet->end())
+ {
+ double result = 0.0;
+ int lisaMap = (int)((*it)[indexLISAMap]);
+
+ if (lisaMap != 0)
+ result = (*it)[indexBoxMap];
+
+ //keep
+ TeAttributeRep rep;
+ rep.name_ = "MoranMap";
+ rep.type_ = TeREAL;
+ (*it).addProperty(result, rep, false);
+
+ ++it;
+ }
+}
+
+bool
+TeGStatistics (TeSTEventSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr)
+{
+
+ TeSTEventSet::iterator itObjs = elemSet->begin();
+ double totalSum = 0.;
+ double excludSum = 0.;
+
+ totalSum = TeSum(itObjs, elemSet->end(), indexAttr);
+
+ itObjs = elemSet->begin();
+
+ //progress bar
+ int step = 0;
+ int numSteps = elemSet->numSTInstance();
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(numSteps);
+
+ while ( itObjs != elemSet->end() )
+ {
+ double valObj = (*itObjs)[indexAttr];
+ excludSum = totalSum - valObj;
+
+ double G = 0;
+ double GStar = valObj;
+
+ TeNeighboursMap neighbors = proxMatrix->getMapNeighbours((*itObjs).objectId());
+ TeNeighboursMap::iterator itNeigs = neighbors.begin();
+ int neigNumber = neighbors.size();
+
+ if(itNeigs != neighbors.end())
+ {
+ while(itNeigs != neighbors.end())
+ {
+ // retrieve the property value associated to this neighbor
+ double val;
+ if(!elemSet->getAttributeValue ((*itNeigs).first, indexAttr, val))
+ return false;
+
+ G += val;
+ GStar += val;
+
+ ++itNeigs;
+ }
+
+ G /= neigNumber;
+ GStar /= (neigNumber+1);
+
+ G /= excludSum;
+ GStar /= totalSum;
+ }
+
+ //insert the indexes in the sET
+ TeAttributeRep rep;
+ rep.name_ = "G";
+ rep.type_ = TeREAL;
+ (*itObjs).addProperty(G, rep, false);
+
+ rep.name_ = "GStar";
+ (*itObjs).addProperty(GStar, rep, false);
+
+ ++itObjs;
+
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ TeProgress::instance()->setProgress(step);
+ }
+ ++step;
+ }
+
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ return true;
+}
+
+void
+TeBoxMap (TeSTEventSet* elemSet, int indexZ, int indexWZ, double mean)
+{
+
+ TeSTEventSet::iterator it_begin = elemSet->begin();
+ while ( it_begin != elemSet->end())
+ {
+ int result=0;
+
+ if ( ((*it_begin)[indexZ] >= mean) && ((*it_begin)[indexWZ] >= mean))
+ result = 1;
+ else if ( ((*it_begin)[indexZ] < mean) && ((*it_begin)[indexWZ] >= mean))
+ result = 4;
+ else if ( ((*it_begin)[indexZ] < mean) && ((*it_begin)[indexWZ] < mean))
+ result = 2;
+ else if ( ((*it_begin)[indexZ] >= mean) && ((*it_begin)[indexWZ] < mean))
+ result = 3;
+
+ //keep
+ TeAttributeRep rep;
+ rep.name_ = "BoxMap";
+ rep.type_ = TeINT;
+ (*it_begin).addProperty((double)result, rep, false);
+
+ ++it_begin;
+ }
+}
+
+bool TeLisaStatisticalSignificance ( TeSTEventSet* elemSet, int indexZ, int indexLISA,
+ int indexNeighNum, int permutationsNumber)
+ {
+ double sum;
+ double WZperm;
+ double significance;
+
+ TeSTEventSet::iterator it = elemSet->begin();
+
+ double variance = TeSecondMoment (it, elemSet->end(), 0, indexZ);
+
+ int index = 0;
+ it = elemSet->begin();
+ int objectsNumber = elemSet->numSTInstance();
+
+ //progress bar
+ int step = 0;
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(objectsNumber);
+
+ vector<double> deviations(objectsNumber);
+ vector<double>::iterator it_dev = deviations.begin();
+ while(it != elemSet->end())
+ {
+ (*it_dev) = (*it)[indexZ];
+ ++it;
+ ++it_dev;
+ }
+
+ srand(time(0));
+ it = elemSet->begin();
+
+
+ while ( it != elemSet->end())
+ {
+ int neighborsNumber = (int)((*it)[indexNeighNum]);
+
+ vector<double> permut(permutationsNumber);
+ for (int j = 0; j < permutationsNumber; j++)
+ {
+ int randon = 0;
+ sum = 0;
+ set<int> setNeigh;
+ for (int k = 0; k < neighborsNumber; k++)
+ {
+ double ranaux = rand();
+ randon = (int)((ranaux * (objectsNumber-1))/RAND_MAX);
+ if (index == randon || (setNeigh.find(randon) != setNeigh.end()) )
+ k--; // raffle annulled
+ else
+ {
+ setNeigh.insert(randon);
+ sum += deviations[randon];
+ }
+ }
+
+ if(neighborsNumber==0)
+ WZperm = 0.;
+ else
+ WZperm = sum/neighborsNumber;
+
+ if(variance==0)
+ permut[j] = 0.;
+ else
+ permut[j] = deviations[index] * WZperm / variance;
+ }
+
+ int position = 0;
+ for (int k = 0; k < permutationsNumber; k++)
+ {
+ if (((*it)[indexLISA]) > permut[k])
+ position++;
+ }
+ if ( ((*it)[indexLISA]) >= 0)
+ significance = (double) (permutationsNumber-position)/(permutationsNumber+1);
+ else
+ significance = (double) position/( permutationsNumber + 1 );
+
+ //keep
+ TeAttributeRep rep;
+ rep.name_ = "LISASig";
+ rep.type_ = TeREAL;
+ (*it).addProperty(significance, rep, false);
+
+ ++it;
+ ++index;
+
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ TeProgress::instance()->setProgress(step);
+ }
+ ++step;
+ }
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ return true;
+}
+
+
+void
+TeLisaMap (TeSTEventSet* elemSet, int indexSignifLISA, int /* permutationNumber */)
+{
+ TeSTEventSet::iterator begin = elemSet->begin();
+ while (begin != elemSet->end())
+ {
+ int significanceClass = 0;
+ if ( ( (*begin)[indexSignifLISA] <= 0.001 )) /*&& (permutationNumber >= 999)*/
+ significanceClass = 3;
+ else if ( ((*begin)[indexSignifLISA] <= 0.01) && ((*begin)[indexSignifLISA] > 0.001 )) /*&& (permutationNumber >= 99)*/
+ significanceClass = 2;
+ else if ( ((*begin)[indexSignifLISA] <= 0.05) && ((*begin)[indexSignifLISA] > 0.01))
+ significanceClass = 1;
+
+ //keep
+ TeAttributeRep rep;
+ rep.name_ = "LISAMap";
+ rep.type_ = TeINT;
+ (*begin).addProperty((double)significanceClass, rep, false);
+
+ ++begin;
+ }
+}
+
+//-------------------- using TeSTElementSet
+//-------------------- not templated because Visual C++ 6.0
+
+bool
+TeLocalMean (TeSTElementSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr)
+{
+
+ TeSTElementSet::iterator itObjs = elemSet->begin();
+ double numberNeighbors;
+
+ while (itObjs != elemSet->end())
+ {
+ double sum = 0.;
+ double localMean = 0.;
+
+ TeNeighboursMap neighbors = proxMatrix->getMapNeighbours((*itObjs).objectId());
+ TeNeighboursMap::iterator itNeigs = neighbors.begin();
+ numberNeighbors = neighbors.size();
+
+ while(itNeigs != neighbors.end())
+ {
+ //retrieve the neighbor attribute value
+ double val;
+ if(!elemSet->getAttributeValue ((*itNeigs).first, indexAttr, val))
+ return false;
+
+ // find the weight associated with the neighbor (attribute of index 0)
+ double weight = (*itNeigs).second.Weight();
+
+ sum += weight * val;
+ ++itNeigs;
+ }
+
+ localMean = sum;
+
+ TeAttributeRep rep;
+ rep.name_ = "LocalMean";
+ rep.type_ = TeREAL;
+ (*itObjs).addProperty(localMean, rep, false);
+
+ rep.name_ = "NumNeighbors";
+ rep.type_ = TeINT;
+ (*itObjs).addProperty((double)numberNeighbors, rep, false);
+
+ ++itObjs;
+ }
+
+ return true;
+}
+
+double
+TeMoranIndex2 (TeSTElementSet* elemSet, const double& mean, const double& var, TeGeneralizedProxMatrix* proxMatrix, int indexAttr)
+{
+ double moran = 0;
+ TeSTElementSet::iterator itObjs = elemSet->begin();
+ int numberObjs = elemSet->numSTInstance();
+
+ while ( itObjs != elemSet->end())
+ {
+ double normObjVal = (*itObjs)[indexAttr] - mean;
+ double li = 0.;
+ double weightSum = 0.;
+
+
+ TeNeighboursMap neighbors = proxMatrix->getMapNeighbours((*itObjs).objectId());
+ TeNeighboursMap::iterator itNeigs = neighbors.begin();
+
+ while(itNeigs != neighbors.end())
+ {
+ //retrieve the neighbor attribute value
+ double val;
+ if(!elemSet->getAttributeValue ((*itNeigs).first, indexAttr, val))
+ return 0.;
+
+ // normalize the property
+ double normNeighVal = val - mean;
+
+ // find the weight associated with the neighbor (attribute of index 0)
+ double weight = (*itNeigs).second.Weight();
+ li += weight * ( normNeighVal ) * ( normObjVal ); // se dividir pela vari�ncia � o �ndice local de moran
+ weightSum += weight;
+ ++itNeigs;
+ }
+
+ if (weightSum != 0.)
+ li /= weightSum;
+
+
+ moran += li;
+
+ ++itObjs;
+ }
+
+ if ( numberObjs > 1 )
+ return moran / ( var * ( numberObjs - 1 ) );
+ else
+ return moran / var;
+}
+
+double
+TeMoranIndex (TeSTElementSet* elemSet, int indexZ, int indexWZ)
+{
+ double variance = 0.;
+ double sum = 0;
+ int number = 0;
+
+ variance = TeSecondMoment (elemSet->begin(), elemSet->end(), 0, indexZ);
+ TeSTElementSet::iterator it = elemSet->begin();
+
+ while (it != elemSet->end())
+ {
+ double z = (*it)[indexZ];
+ double wz = (*it)[indexWZ];
+ double ZxWZ;
+ if(variance==0)
+ ZxWZ = 0.;
+ else
+ ZxWZ = (z*wz)/variance;
+
+ //keep
+ TeAttributeRep rep;
+ rep.name_ = "MoranIndex";
+ rep.type_ = TeREAL;
+ (*it).addProperty(ZxWZ, rep, false);
+
+ sum += ZxWZ;
+ number++;
+ ++it;
+ }
+
+ return sum /= number;
+}
+
+double
+TeGlobalMoranSignificance (TeSTElementSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr,
+ unsigned int permutationsNumber, double moranIndex)
+{
+
+ vector<double> permutationsResults(permutationsNumber);
+ double significance;
+
+ unsigned int objectsNumber = elemSet->numSTInstance();
+
+ //progress bar
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(permutationsNumber);
+
+ vector<double> deviations(objectsNumber);
+ vector<double>::iterator itDev = deviations.begin();
+ TeSTElementSet::iterator itObjs = elemSet->begin();
+ while(itObjs != elemSet->end())
+ {
+ (*itDev) = (*itObjs)[indexAttr]; //attribute value
+ ++itObjs;
+ ++itDev;
+ }
+
+ TeStatisticValMap stat;
+ if(!TeCalculateStatistics(elemSet->begin(), elemSet->end(), stat, 0))
+ return 0.;
+
+ double mean = stat[TeMEAN];
+ double var = stat[TeVARIANCE];
+
+ srand(time(0));
+ unsigned int i;
+ for (i = 0; i < permutationsNumber; i++)
+ {
+ TeSTElementSet changedObjects;
+
+ itObjs = elemSet->begin();
+
+ // chande values
+ while(itObjs != elemSet->end())
+ {
+ TeSTInstance stoChange;
+ stoChange.objectId((*itObjs).objectId());
+
+ double ranaux = rand();
+ int randon = (int) ((ranaux * (objectsNumber-1))/RAND_MAX);
+ double value = deviations[randon];
+
+ stoChange.addProperty(value);
+
+ changedObjects.insertSTInstance (stoChange);
+ ++itObjs;
+ }
+
+ permutationsResults[i] = TeMoranIndex2 (&changedObjects, mean, var, proxMatrix, 0);
+
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return 0.;
+ }
+ else
+ TeProgress::instance()->setProgress(i);
+ }
+ }
+
+ // verify the significance
+ int position = 0;
+ significance = 0;
+ unsigned int k;
+ for (k = 0; k < permutationsNumber; k++)
+ {
+ if (moranIndex < permutationsResults[k]) //>
+ position++;
+ }
+ if ( moranIndex >= 0)
+ significance = (double) (position+1) / (permutationsNumber+1);
+ else
+ significance = (double) (permutationsNumber-position)/(permutationsNumber+1);
+
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ return significance;
+}
+
+
+void
+TeMoranMap (TeSTElementSet* elemSet, int indexLISAMap, int indexBoxMap)
+{
+ TeSTElementSet::iterator it = elemSet->begin();
+ while ( it != elemSet->end())
+ {
+ double result = 0.0;
+ int lisaMap = (int)((*it)[indexLISAMap]);
+
+ if (lisaMap != 0)
+ result = (*it)[indexBoxMap];
+
+ //keep
+ TeAttributeRep rep;
+ rep.name_ = "MoranMap";
+ rep.type_ = TeREAL;
+ (*it).addProperty(result, rep, false);
+
+ ++it;
+ }
+}
+
+bool
+TeGStatistics (TeSTElementSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr)
+{
+
+ TeSTElementSet::iterator itObjs = elemSet->begin();
+ double totalSum = 0.;
+ double excludSum = 0.;
+
+ totalSum = TeSum(itObjs, elemSet->end(), indexAttr);
+
+ itObjs = elemSet->begin();
+
+ //progress bar
+ int step = 0;
+ int numSteps = elemSet->numSTInstance();
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(numSteps);
+
+ while ( itObjs != elemSet->end() )
+ {
+ double valObj = (*itObjs)[indexAttr];
+ excludSum = totalSum - valObj;
+
+ double G = 0;
+ double GStar = valObj;
+
+ TeNeighboursMap neighbors = proxMatrix->getMapNeighbours((*itObjs).objectId());
+ TeNeighboursMap::iterator itNeigs = neighbors.begin();
+ int neigNumber = neighbors.size();
+
+ if(itNeigs != neighbors.end())
+ {
+ while(itNeigs != neighbors.end())
+ {
+ // retrieve the property value associated to this neighbor
+ double val;
+ if(!elemSet->getAttributeValue ((*itNeigs).first, indexAttr, val))
+ return false;
+
+ G += val;
+ GStar += val;
+
+ ++itNeigs;
+ }
+
+ G /= neigNumber;
+ GStar /= (neigNumber+1);
+
+ G /= excludSum;
+ GStar /= totalSum;
+ }
+
+ //insert the indexes in the sET
+ TeAttributeRep rep;
+ rep.name_ = "G";
+ rep.type_ = TeREAL;
+ (*itObjs).addProperty(G, rep, false);
+
+ rep.name_ = "GStar";
+ (*itObjs).addProperty(GStar, rep, false);
+
+ ++itObjs;
+
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ TeProgress::instance()->setProgress(step);
+ }
+ ++step;
+ }
+
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+ return true;
+}
+
+void
+TeBoxMap (TeSTElementSet* elemSet, int indexZ, int indexWZ, double mean)
+{
+
+ TeSTElementSet::iterator it_begin = elemSet->begin();
+ while ( it_begin != elemSet->end())
+ {
+ int result=0;
+
+ if ( ((*it_begin)[indexZ] >= mean) && ((*it_begin)[indexWZ] >= mean))
+ result = 1;
+ else if ( ((*it_begin)[indexZ] < mean) && ((*it_begin)[indexWZ] >= mean))
+ result = 4;
+ else if ( ((*it_begin)[indexZ] < mean) && ((*it_begin)[indexWZ] < mean))
+ result = 2;
+ else if ( ((*it_begin)[indexZ] >= mean) && ((*it_begin)[indexWZ] < mean))
+ result = 3;
+
+ //keep
+ TeAttributeRep rep;
+ rep.name_ = "BoxMap";
+ rep.type_ = TeINT;
+ (*it_begin).addProperty((double)result, rep, false);
+
+ ++it_begin;
+ }
+}
+
+bool TeLisaStatisticalSignificance ( TeSTElementSet* elemSet, int indexZ, int indexLISA,
+ int indexNeighNum, int permutationsNumber)
+ {
+ double sum;
+ double WZperm;
+ double significance;
+
+ TeSTElementSet::iterator it = elemSet->begin();
+
+ double variance = TeSecondMoment (it, elemSet->end(), 0, indexZ);
+
+ int index = 0;
+ it = elemSet->begin();
+ int objectsNumber = elemSet->numSTInstance();
+
+ //progress bar
+ int step = 0;
+ if(TeProgress::instance())
+ TeProgress::instance()->setTotalSteps(objectsNumber);
+
+ vector<double> deviations(objectsNumber);
+ vector<double>::iterator it_dev = deviations.begin();
+ while(it != elemSet->end())
+ {
+ (*it_dev) = (*it)[indexZ];
+ ++it;
+ ++it_dev;
+ }
+
+ it = elemSet->begin();
+ srand(time(0));
+ while ( it != elemSet->end())
+ {
+ int neighborsNumber = (int)((*it)[indexNeighNum]);
+
+ vector<double> permut(permutationsNumber);
+
+ for (int j = 0; j < permutationsNumber; j++)
+ {
+ int randon = 0;
+ sum = 0;
+ set<int> setNeigh;
+ for (int k = 0; k < neighborsNumber; k++)
+ {
+ double ranaux = rand();
+ randon = (int)((ranaux * (objectsNumber-1))/RAND_MAX);
+ if (index == randon || (setNeigh.find(randon) != setNeigh.end()) )
+ k--; // raffle annulled
+ else
+ {
+ setNeigh.insert(randon);
+ sum += deviations[randon];
+ }
+ }
+
+ if(neighborsNumber==0)
+ WZperm = 0.;
+ else
+ WZperm = sum/neighborsNumber;
+
+ if(variance==0)
+ permut[j] = 0.;
+ else
+ permut[j] = deviations[index] * WZperm / variance;
+ }
+
+ int position = 0;
+ for (int k = 0; k < permutationsNumber; k++)
+ {
+ if (((*it)[indexLISA]) > permut[k])
+ position++;
+ }
+ if ( ((*it)[indexLISA]) >= 0)
+ significance = (double) (permutationsNumber-position)/(permutationsNumber+1);
+ else
+ significance = (double) position/( permutationsNumber + 1 );
+
+ //keep
+ TeAttributeRep rep;
+ rep.name_ = "LISASig";
+ rep.type_ = TeREAL;
+ (*it).addProperty(significance, rep, false);
+
+ ++it;
+ ++index;
+
+ if(TeProgress::instance())
+ {
+ if (TeProgress::instance()->wasCancelled())
+ {
+ TeProgress::instance()->reset();
+ return false;
+ }
+ else
+ TeProgress::instance()->setProgress(step);
+ }
+ ++step;
+ }
+
+ if (TeProgress::instance())
+ TeProgress::instance()->reset();
+
+ return true;
+}
+
+
+void
+TeLisaMap (TeSTElementSet* elemSet, int indexSignifLISA, int /* permutationNumber */)
+{
+ TeSTElementSet::iterator begin = elemSet->begin();
+ while (begin != elemSet->end())
+ {
+ int significanceClass = 0;
+ if ( ( (*begin)[indexSignifLISA] <= 0.001 )) /*&& (permutationNumber >= 999)*/
+ significanceClass = 3;
+ else if ( ((*begin)[indexSignifLISA] <= 0.01) && ((*begin)[indexSignifLISA] > 0.001 )) /*&& (permutationNumber >= 99)*/
+ significanceClass = 2;
+ else if ( ((*begin)[indexSignifLISA] <= 0.05) && ((*begin)[indexSignifLISA] > 0.01))
+ significanceClass = 1;
+
+ //keep
+ TeAttributeRep rep;
+ rep.name_ = "LISAMap";
+ rep.type_ = TeINT;
+ (*begin).addProperty((double)significanceClass, rep, false);
+
+ ++begin;
+ }
+}
+
+
+
+
+
+
+
+
+
diff --git a/src/terralib/stat/TeSpatialStatistics.h b/src/terralib/stat/TeSpatialStatistics.h
new file mode 100644
index 0000000..75472bb
--- /dev/null
+++ b/src/terralib/stat/TeSpatialStatistics.h
@@ -0,0 +1,283 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeSpatialStatistics.h
+ This file provides support for spatial statistics functions
+ \note for a general overview of spatial statistics, please see
+ "Spatial Data Analysis by Example", Bailey and Gattrell
+*/
+#ifndef __TERRALIB_INTERNAL_SPATIALSTATISTICS_H
+#define __TERRALIB_INTERNAL_SPATIALSTATISTICS_H
+
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+using namespace std;
+
+class TeSTEventSet;
+class TeSTElementSet;
+class TeGeneralizedProxMatrix;
+
+
+/** @defgroup SpatialStatistics Spatial Statistics Algorithms
+ * TerraLib spatial statistics algorithms.
+ * @{
+*/
+
+/*! \fn void TeLocalMean(TeSTEventSet* elemSet, ProxMatrix& proxMatrix, int indexAttr);
+ \brief calculates the local mean (WZ) and the number of neighbors for each object
+ \param elemSet a set of objects
+ \param proxMatrix proximity matrix
+ \param indexAttr the index of the objects which keeps the attributes
+*/
+bool
+TeLocalMean (TeSTEventSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr=0);
+
+
+/*! \fn void TeLocalMean(TeSTElementSet* elemSet, ProxMatrix& proxMatrix, int indexAttr);
+ \brief calculates the local mean (WZ) and the number of neighbors for each object
+ \param elemSet a set of objects
+ \param proxMatrix proximity matrix
+ \param indexAttr the index of the objects which keeps the attributes
+*/
+bool
+TeLocalMean (TeSTElementSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr=0);
+
+
+/** @defgroup TeMoranIndex Moran Index Algorithm
+ * @ingroup SpatialStatistics
+ * @{
+*/
+
+/*! \fn double TeMoranIndex2 (TeSTEventSet* elemSet, ProxMatrix& proxMatrix, int indexAttr)
+ \brief calculates the local moran index for each object and returns the global moran index
+ \param elemSet a set of objects
+ \param proxMatrix proximity matrix
+ \param indexAttr the index of the objects which keeps the attributes
+*/
+double
+TeMoranIndex2 (TeSTEventSet* elemSet, const double& mean, const double& var, TeGeneralizedProxMatrix* proxMatrix, int indexAttr=0);
+
+/*! \fn double TeMoranIndex2 (TeSTElementSet* elemSet, ProxMatrix& proxMatrix, int indexAttr)
+ \brief calculates the local moran index for each object and returns the global moran index
+ \param elemSet a set of objects
+ \param proxMatrix proximity matrix
+ \param indexAttr the index of the objects which keeps the attributes
+*/
+double
+TeMoranIndex2 (TeSTElementSet* elemSet, const double& mean, const double& var, TeGeneralizedProxMatrix* proxMatrix, int indexAttr=0);
+
+
+/*! \fn double TeMoranIndex (TeSTEventSet* elemSet, int indexZ, int indexWZ)
+ \brief calculates the local moran index (WZ) for each object and returns the global moran index
+ \param elemSet a set of objects
+ \param indexZ the index of the objects which keeps the deviations (Z)
+ \param indexWZ the index of the objects which keeps the local mean deviations (WZ)
+*/
+double
+TeMoranIndex (TeSTEventSet* elemSet, int indexZ, int indexWZ);
+
+/*! \fn double TeMoranIndex (TeSTElementSet* elemSet, int indexZ, int indexWZ)
+ \brief calculates the local moran index (WZ) for each object and returns the global moran index
+ \param elemSet a set of objects
+ \param indexZ the index of the objects which keeps the deviations (Z)
+ \param indexWZ the index of the objects which keeps the local mean deviations (WZ)
+*/
+double
+TeMoranIndex (TeSTElementSet* elemSet, int indexZ, int indexWZ);
+
+/*! \fn double TeGlobalMoranSignificance (TeSTEventSet* elemSet, ProxMatrix& proxMatrix, int indexZ, unsigned int permutationsNumber, double moranIndex)
+ \brief calculates and returns the global moran significance
+ \param elemSet a set of objects
+ \param proxMatrix proximity matrix
+ \param indexZ the index of the objects which keeps the deviations (Z)
+ \param permutationsNumber number of the permutations used to calculate the significance
+ \param moranIndex the global moran index
+*/
+double
+TeGlobalMoranSignificance (TeSTEventSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr,
+ unsigned int permutationsNumber, double moranIndex);
+
+/*! \fn double TeGlobalMoranSignificance (TeSTElementSet* elemSet, ProxMatrix& proxMatrix, int indexZ, unsigned int permutationsNumber, double moranIndex)
+ \brief calculates and returns the global moran significance
+ \param elemSet a set of objects
+ \param proxMatrix proximity matrix
+ \param indexZ the index of the objects which keeps the deviations (Z)
+ \param permutationsNumber number of the permutations used to calculate the significance
+ \param moranIndex the global moran index
+*/
+double
+TeGlobalMoranSignificance (TeSTElementSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr,
+ unsigned int permutationsNumber, double moranIndex);
+
+
+
+/*! \fn void TeMoranMap (TeSTEventSet* elemSet, int indexLISAMap, int indexBoxMap)
+ \brief classifies the objects based in the scatterplot of moran index and statistical significance
+ \param elemSet a set of objects
+ \param indexLISAMap the index of the objects which keeps the statistical significances of the moran local indexes (LISA)
+ \param indexBoxMap the index of the objects which keeps the classifications of the statistical significance of the moran local indexes
+*/
+void
+TeMoranMap (TeSTEventSet* elemSet, int indexLISAMap, int indexBoxMap);
+
+/*! \fn void TeMoranMap (TeSTElementSet* elemSet, int indexLISAMap, int indexBoxMap)
+ \brief classifies the objects based in the scatterplot of moran index and statistical significance
+ \param elemSet a set of objects
+ \param indexLISAMap the index of the objects which keeps the statistical significances of the moran local indexes (LISA)
+ \param indexBoxMap the index of the objects which keeps the classifications of the statistical significance of the moran local indexes
+*/
+void
+TeMoranMap (TeSTElementSet* elemSet, int indexLISAMap, int indexBoxMap);
+
+
+/** @} */
+
+/*! \fn void TeGStatistics (TeSTEventSet* elemSet, ProxMatrix& proxMatrix, int indexAttr)
+ \brief calculates the G and G* statistics for each object
+ \param elemSet a set of objects
+ \param proxMatrix proximity matrix
+ \param indexAttr the index of the objects which keeps the attributes
+*/
+bool
+TeGStatistics (TeSTEventSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr=0 );
+
+
+/*! \fn void TeGStatistics (TeSTElementSet* elemSet, ProxMatrix& proxMatrix, int indexAttr)
+ \brief calculates the G and G* statistics for each object
+ \param elemSet a set of objects
+ \param proxMatrix proximity matrix
+ \param indexAttr the index of the objects which keeps the attributes
+*/
+bool
+TeGStatistics (TeSTElementSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr=0 );
+
+
+
+/*! \fn void TeBoxMap (TeSTEventSet* elemSet, int indexZ, int indexWZ, double mean)
+ \brief classifies the objects in quadrants based in the scatterplot of moran index
+ \param elemSet a set of objects
+ \param indexZ the index of the objects which keeps the deviations (Z)
+ \param indexWZ the index of the objects which keeps the local mean deviations (WZ)
+ \param mean the global mean
+*/
+void
+TeBoxMap (TeSTEventSet* elemSet, int indexZ, int indexWZ, double mean);
+
+
+/*! \fn void TeBoxMap (TeSTElementSet* elemSet, int indexZ, int indexWZ, double mean)
+ \brief classifies the objects in quadrants based in the scatterplot of moran index
+ \param elemSet a set of objects
+ \param indexZ the index of the objects which keeps the deviations (Z)
+ \param indexWZ the index of the objects which keeps the local mean deviations (WZ)
+ \param mean the global mean
+*/
+void
+TeBoxMap (TeSTElementSet* elemSet, int indexZ, int indexWZ, double mean);
+
+
+
+/*! \fn void TeLisaStatisticalSignificance ( TeSTEventSet* elemSet, int indexZ, int indexLISA, int indexNeighNum, int permutationsNumber)
+ \brief evaluates the statistical significance of the moran local indexes (LISA)
+ \param elemSet a set of objects
+ \param indexZ the index of the objects which keeps the deviations (Z)
+ \param indexLISA the index of the objects which keeps the local moran indexes (LISA)
+ \param indexNeighNum the index of the objects which keeps the numbers of neighbours
+ \param permutationsNumber number of the permutations used to evaluate the significance
+*/
+bool TeLisaStatisticalSignificance ( TeSTEventSet* elemSet, int indexZ, int indexLISA,
+ int indexNeighNum, int permutationsNumber);
+
+/*! \fn void TeLisaStatisticalSignificance ( TeSTElementSet* elemSet, int indexZ, int indexLISA, int indexNeighNum, int permutationsNumber)
+ \brief evaluates the statistical significance of the moran local indexes (LISA)
+ \param elemSet a set of objects
+ \param indexZ the index of the objects which keeps the deviations (Z)
+ \param indexLISA the index of the objects which keeps the local moran indexes (LISA)
+ \param indexNeighNum the index of the objects which keeps the numbers of neighbours
+ \param permutationsNumber number of the permutations used to evaluate the significance
+*/
+bool TeLisaStatisticalSignificance ( TeSTElementSet* elemSet, int indexZ, int indexLISA,
+ int indexNeighNum, int permutationsNumber);
+
+
+/*! \fn void TeLisaMap ( TeSTEventSet* elemSet, int indexSignifLISA, int permutationNumber)
+ \brief classifies the objects based in the statistical significance of the moran local indexes (LISA)
+ \param elemSet a set of objects
+ \param indexSignifLISA the index of the objects which keeps the statistical significances of the local moran indexes (LISA)
+ \param permutationNumber number of the permutations used to evaluate the significance
+*/
+void
+TeLisaMap (TeSTEventSet* elemSet, int indexSignifLISA, int /* permutationNumber */);
+
+
+/*! \fn void TeLisaMap ( TeSTElementSet* elemSet, int indexSignifLISA, int permutationNumber)
+ \brief classifies the objects based in the statistical significance of the moran local indexes (LISA)
+ \param elemSet a set of objects
+ \param indexSignifLISA the index of the objects which keeps the statistical significances of the local moran indexes (LISA)
+ \param permutationNumber number of the permutations used to evaluate the significance
+*/
+void
+TeLisaMap (TeSTElementSet* elemSet, int indexSignifLISA, int /* permutationNumber */);
+
+/** @defgroup BayesEstimation Bayes estimation Algorithm
+ * @ingroup SpatialStatistics
+ * @{
+*/
+//! Calculates the empirical Bayes estimation
+template <typename It> void
+TeEmpiricalBayes (It rBegin, It rEnd, It n, double mean, double variance, It bayes)
+{
+ double w= 0.;
+ while (rBegin != rEnd)
+ {
+ w = variance / ( variance + ( mean/(*n)) );
+ *bayes = w*(*rBegin) + (1-w)*mean;
+ rBegin++; n++; bayes++;
+ }
+}
+
+//! Calculates the local Bayes estimation
+template <typename It> void
+TeSpatialEmpiricalBayes (It rBegin, It rEnd, It n, It mean, It variance, It bayes)
+{
+ double w = 0.;
+ while (rBegin != rEnd)
+ {
+ w = (*variance)/( (*variance) + ( (*mean)/n ));
+ *bayes = w*(*rBegin) + (1-w)*(*mean);
+ rBegin++; n++; mean++; variance++; bayes++;
+ }
+}
+
+/** @} */
+/** @} */
+
+/** \example STObjectSetExample3.cpp
+ * This is an example of how to use spatial statistic algorithms from
+ a Spatial Temporal Object Set (STObjectSet) and proximity matrix.
+ */
+
+
+#endif
+
diff --git a/src/terralib/stat/TeStatDataStructures.cpp b/src/terralib/stat/TeStatDataStructures.cpp
new file mode 100644
index 0000000..4b9e726
--- /dev/null
+++ b/src/terralib/stat/TeStatDataStructures.cpp
@@ -0,0 +1,85 @@
+/************************************************************************************
+Exploring and analysis of geographical data using TerraLib and TerraView
+
+Copyright � 2003,2004 INPE and LESTE/UFMG.
+
+Partially funded by CNPq - Project SAUDAVEL, under grant no. 552044/2002-4,
+SENASP-MJ and INPE
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed hoping it will be useful, however, WITHOUT ANY
+WARRANTIES; neither to the implicit warranty of MERCHANTABILITY OR SUITABILITY FOR
+AN SPECIFIC FINALITY. Consult the GNU General Public License for more details.
+
+You must have received a copy of the GNU General Public License with this program.
+In negative case, write to the Free Software Foundation, Inc. in the following
+address: 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+***********************************************************************************/
+
+
+#include "TeStatDataStructures.h"
+#include "TeSTElementSet.h"
+
+
+TeSTStatInstance::TeSTStatInstance(int nDlbProp) : TeSTInstance()
+{
+ initDbl(nDlbProp);
+}
+
+
+TeSTStatInstance::TeSTStatInstance(TeSTInstance other, int nd, int ad): TeSTInstance(other)
+{
+ initDbl(nd+ad);
+ int n;
+ //Copia propriedades de um como double
+ TeProperty prop;
+ for(n = 0; n < nd; n++)
+ {
+ other.getProperty(prop, n);
+ if ((prop.attr_.rep_.type_ != TeREAL) &&
+ (prop.attr_.rep_.type_ != TeINT))
+ {
+ dblProperties_[n] = 0.0;
+ }
+ else
+ {
+ dblProperties_[n] = atof(prop.value_.c_str());
+ }
+ }
+}
+
+
+TeSTStatInstance::TeSTStatInstance(const TeSTStatInstance& other) : TeSTInstance(other)
+{
+ initDbl(other.nDblProperties_);
+ int n;
+ for(n = 0; n < nDblProperties_; n++)
+ {
+ dblProperties_[n] = other.dblProperties_[n];
+ }
+}
+
+
+void
+TeSTStatInstanceSet::Copy(TeSTElementSet& stoSet, int nDbl, int aDbl)
+{
+
+ TeSTElementSet::iterator it = stoSet.begin();
+ while (it != stoSet.end()) {
+ //Insere elemento no mapa atual e inicializa double
+ TeSTStatInstance* nObj = new TeSTStatInstance(*it, nDbl, aDbl);
+ objs_.push_back(*nObj);
+ ++it;
+ }
+}
+
+
+int TeSTStatInstanceSet::numObjects()
+{
+ return objs_.size();
+}
+
diff --git a/src/terralib/stat/TeStatDataStructures.h b/src/terralib/stat/TeStatDataStructures.h
new file mode 100644
index 0000000..7055446
--- /dev/null
+++ b/src/terralib/stat/TeStatDataStructures.h
@@ -0,0 +1,455 @@
+/************************************************************************************
+Exploring and analysis of geographical data using TerraLib and TerraView
+
+Copyright � 2003,2004 INPE and LESTE/UFMG.
+
+Partially funded by CNPq - Project SAUDAVEL, under grant no. 552044/2002-4,
+SENASP-MJ and INPE
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed hoping it will be useful, however, WITHOUT ANY
+WARRANTIES; neither to the implicit warranty of MERCHANTABILITY OR SUITABILITY FOR
+AN SPECIFIC FINALITY. Consult the GNU General Public License for more details.
+
+You must have received a copy of the GNU General Public License with this program.
+In negative case, write to the Free Software Foundation, Inc. in the following
+address: 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+***********************************************************************************/
+
+/*! \file TeStatDataStructures.h
+ This file deals with special data structures for spatial statistics
+*/
+#ifndef __TERRALIB_INTERNAL_STATDATASTRUCTURES_H
+#define __TERRALIB_INTERNAL_STATDATASTRUCTURES_H
+
+#include "TeProjection.h"
+#include "TeRaster.h"
+#include "TeAttribute.h"
+#include "TeCoord2D.h"
+#include "TeSTInstance.h"
+
+class TeSTElementSet;
+
+class TeGridElement
+{
+ TeRaster* parent_;
+
+public:
+ int col_;
+ int lin_;
+
+ TeGridElement(TeRaster* rst=0, int col=0, int lin=0):
+ parent_(rst),
+ col_(col),
+ lin_(lin)
+ {}
+
+ void setColLin(int col, int lin)
+ { col_ = col; lin_ = lin; }
+
+ void setRaster(TeRaster* rst)
+ { parent_ = rst; }
+
+ void addProperty(TeProperty propK)
+ {
+ double val = atof(propK.value_.c_str());
+ parent_->setElement(col_,lin_,val);
+ }
+
+ bool getDoubleProperty(int /* idx */, double& value)
+ { return parent_->getElement(col_, lin_, value); }
+
+ bool setDoubleProperty(int /* idx */, double value)
+ { return parent_->setElement(col_,lin_, value); }
+
+ //** ANDREA -- adaptive kernel support
+ bool getPropertyValue(const string& /* name */, string& value)
+ {
+ double val;
+ if (parent_->getElement(col_,lin_,val))
+ {
+ value = Te2String(val,12);
+ return true;
+ }
+ value = Te2String(-1.0);
+ return false;
+ }
+
+ //** ANDREA -- adaptive kernel support
+ bool setPropertyValue(const string& /* name */, const string& value)
+ {
+ double val;
+ val = atof(value.c_str());
+ return parent_->setElement(col_,lin_,val);
+ }
+
+ bool centroid(TeCoord2D& loc)
+ {
+ TeCoord2D pt(col_,lin_);
+ loc = parent_->index2Coord(pt);
+ return true;
+ }
+
+ bool area(double& a)
+ {
+ a = parent_->params().resx_ * parent_->params().resy_;
+ return true;
+ }
+};
+//! A grid support to generate a map of kernel
+/*!
+ This is a wrapper around TeRaster class in order to use it as
+ the output of a kernel algorithm. It provides iterators and methods
+ so that Kernel Map algorithms can use it in the same way as when using
+ a set of polygonal regions as support.
+*/
+class TeKernelGridSupport
+{
+ TeRaster* rasterImp_;
+public:
+
+ TeKernelGridSupport(TeBox& bb, int ncols, TeProjection* proj)
+ {
+ TeRasterParams par;
+ par.decoderIdentifier_= "MEM";
+ par.fileName_ = "rasterTemp";
+
+ double resx = bb.width()/ncols;
+ TeBox newBox = adjustToCut(bb,resx,resx);
+ par.boundingBoxResolution(newBox.x1_,newBox.y1_,newBox.x2_,newBox.y2_,resx,resx);
+ newBox = par.boundingBox();
+ par.nBands(1);
+ par.projection(proj);
+ par.setDataType(TeDOUBLE);
+ par.setDummy(-TeMAXFLOAT);
+ par.setPhotometric(TeRASTERMULTIBAND);
+ par.useDummy_ = true;
+ par.mode_ = 'c';
+
+ rasterImp_ = new TeRaster(par);
+ if (!rasterImp_ || !rasterImp_->init())
+ {
+ delete rasterImp_;
+ rasterImp_ = 0;
+ }
+ }
+
+
+ ~TeKernelGridSupport()
+ {
+ if (!rasterImp_)
+ {
+ delete rasterImp_;
+ rasterImp_ = 0;
+ }
+ }
+
+ bool status()
+ { return (rasterImp_ && rasterImp_->status()); }
+
+ /** ANDREA -- method to return total area from polygon cut, if any **/
+ double totalArea()
+ { return TeGeometryArea(rasterImp_->params().boundingBox()); }
+
+ /** ANDREA -- method to returnal number of elements, adaptive kernel **/
+ int numObjects()
+ {
+ TeRasterParams par;
+ par = rasterImp_->params();
+ return par.ncols_ * par.nlines_;
+ }
+
+ //-----
+ class iterator
+ {
+ friend class TeKernelGridSupport;
+
+ protected:
+ TeRaster::iterator curItRaster_; //guarda iterador que pode ser de poligono ou nao
+ TeGridElement elem_;
+
+ public:
+ iterator(TeRaster* rst=0): curItRaster_(0)
+ { elem_.setRaster(rst); }
+
+ ~iterator() {}
+
+ iterator(TeRaster::iterator itr, TeRaster* rst=0) :
+ curItRaster_(itr)
+ {
+ elem_.setRaster(rst);
+ elem_.setColLin(curItRaster_.currentColumn(), curItRaster_.currentLine());
+ }
+
+ iterator& operator++()
+ {
+ //curItRaster_->operator++();
+ curItRaster_.moveForward();
+ elem_.setColLin(curItRaster_.currentColumn(), curItRaster_.currentLine());
+ return *this;
+ }
+
+ bool operator==(const iterator& rhs) const
+ { return ((this->curItRaster_) == (rhs.curItRaster_)); }
+
+ bool operator!=(const iterator& rhs) const
+ { return !((this->curItRaster_) == (rhs.curItRaster_));}
+
+ iterator& operator=(const iterator& other)
+ {
+ if ( this != &other )
+ {
+ curItRaster_ = other.curItRaster_;
+ elem_ = other.elem_;
+ }
+ return *this;
+ }
+
+ TeGridElement& operator*() { return elem_; }
+
+ TeGridElement& operator->() { return elem_; }
+ };
+
+ //-----
+ class iteratorPoly
+ {
+ friend class TeKernelGridSupport;
+
+ protected:
+ TeRaster::iteratorPoly curItRaster_; //guarda iterador que pode ser de poligono ou nao
+ TeGridElement elem_;
+
+ public:
+ iteratorPoly(TeRaster* rst=0): curItRaster_(0)
+ { elem_.setRaster(rst); }
+
+ ~iteratorPoly() {}
+
+ iteratorPoly(TeRaster::iteratorPoly itr, TeRaster* rst=0) :
+ curItRaster_(itr)
+ {
+ elem_.setRaster(rst);
+ elem_.setColLin(curItRaster_.currentColumn(), curItRaster_.currentLine());
+ }
+
+ iteratorPoly& operator++()
+ {
+ //curItRaster_->operator++();
+ curItRaster_.moveForward();
+ elem_.setColLin(curItRaster_.currentColumn(), curItRaster_.currentLine());
+ return *this;
+ }
+
+ bool operator==(const iteratorPoly& rhs) const
+ { return ((this->curItRaster_) == (rhs.curItRaster_)); }
+
+ bool operator!=(const iteratorPoly& rhs) const
+ { return !((this->curItRaster_) == (rhs.curItRaster_)); }
+
+ iteratorPoly& operator=(const iteratorPoly& other)
+ {
+ if ( this != &other )
+ {
+ curItRaster_ = other.curItRaster_;
+ elem_ = other.elem_;
+ }
+ return *this;
+ }
+
+ TeGridElement& operator*() { return elem_; }
+
+ TeGridElement& operator->() { return elem_; }
+ };
+
+
+ //-----
+
+ TeRaster* raster()
+ { return rasterImp_; }
+
+ iterator begin()
+ {
+ TeRasterParams par = rasterImp_->params();
+ TeRaster::iterator itbegin(0,0,par.ncols_,par.nlines_,par.nBands(),rasterImp_);
+ TeKernelGridSupport::iterator it(itbegin,rasterImp_);
+ return it;
+ }
+
+ iteratorPoly begin(TePolygon poly)
+ {
+ TeRaster::iteratorPoly itRasterBegin_ = rasterImp_->begin(poly,TeBBoxPixelInters);
+ TeKernelGridSupport::iteratorPoly it(itRasterBegin_, rasterImp_);
+ return it;
+ }
+
+ iterator end()
+ {
+ TeRasterParams par = rasterImp_->params();
+ TeRaster::iterator itend = TeRaster::iterator(par.ncols_,par.nlines_-1,par.ncols_,par.nlines_,par.nBands(),rasterImp_);
+ TeKernelGridSupport::iterator it(itend,rasterImp_);
+ return it;
+ }
+
+ iteratorPoly end(TePolygon poly)
+ {
+ TeRaster::iteratorPoly itRasterEnd_ = rasterImp_->end(poly,TeBBoxPixelInters);
+ TeKernelGridSupport::iteratorPoly it(itRasterEnd_,rasterImp_);
+ return it;
+ }
+};
+
+
+/////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////
+//! An instance in time of a spatial object, with specialized members for TerraStat
+class TeSTStatInstance : public TeSTInstance
+{
+
+ protected:
+
+ int nDblProperties_;
+ double* dblProperties_;
+
+ void initDbl(int n) {
+ nDblProperties_ = n;
+ if (n == 0) {
+ dblProperties_ = NULL;
+ }
+ else {
+ dblProperties_ = new double[n];
+ }
+ }
+
+ public:
+
+ TeSTStatInstance(int nDlbProp = 0);
+
+ //! Copy constructor
+ TeSTStatInstance(TeSTInstance other, int nd, int ad);
+
+ //! Copy constructor
+ TeSTStatInstance(const TeSTStatInstance& other);
+
+ bool setDoubleProperty(int idx, double value) {
+ if ((idx < 0) || (idx > nDblProperties_))
+ return false;
+ dblProperties_[idx] = value;
+ return true;
+ }
+
+ bool getDoubleProperty(int idx, double& value) {
+ if ((idx < 0) || (idx > nDblProperties_))
+ return false;
+ value = dblProperties_[idx];
+ return true;
+ }
+
+ //! Destructor
+ ~TeSTStatInstance(){
+
+ if (dblProperties_ != NULL)
+ delete [] dblProperties_;
+ }
+
+};
+
+class TeSTStatInstanceSet
+{
+
+
+ protected:
+
+ // map of object identification to its instances in time
+ vector<TeSTStatInstance > objs_;
+
+ public:
+
+ //Constroi um a partir de outro
+ TeSTStatInstanceSet() {
+ }
+
+ void Copy(TeSTElementSet& stoSet, int nDbl=0, int aDbl = 0);
+
+ int numObjects();
+
+ class iterator {
+ vector<TeSTStatInstance >::iterator it_;
+
+ public:
+ iterator(vector<TeSTStatInstance >::iterator i){it_ = i;}
+
+ ~iterator(){}
+
+ iterator& operator++()
+ {
+ ++it_;
+ return *this;
+ }
+
+ bool operator==(const iterator& rhs) const
+ {
+ return ((this->it_) == (rhs.it_));
+ }
+
+ bool operator!=(const iterator& rhs) const
+ {
+ return !((this->it_) == (rhs.it_));
+ }
+
+ iterator& operator=(const iterator& other)
+ {
+ if ( this != &other )
+ {
+ it_ = other.it_;
+ }
+ return *this;
+ }
+
+ TeSTStatInstance& operator*() { return *(it_); }
+ };
+
+ iterator begin() {
+ return TeSTStatInstanceSet::iterator(objs_.begin());
+ }
+
+ iterator end() {
+ return TeSTStatInstanceSet::iterator(objs_.end());
+ }
+
+};
+
+// Classe de eventos pontuais
+class TePointTInstanceSet : public TeSTStatInstanceSet
+{
+
+ public:
+
+ TePointTInstanceSet() : TeSTStatInstanceSet() {}
+
+
+ iterator begin(const TeCoord2D& /* center */, const double& /* radius */)
+ {
+ return TeSTStatInstanceSet::begin();
+ }
+
+ iterator end(const TeCoord2D& /* center */, const double& /* radius */)
+ {
+ return TeSTStatInstanceSet::end();
+ }
+
+ iterator begin()
+ {
+ return TeSTStatInstanceSet::begin();
+ }
+
+ iterator end()
+ {
+ return TeSTStatInstanceSet::end();
+ }
+};
+
+#endif
diff --git a/src/terralib/stat/TeTreeMinimum.cpp b/src/terralib/stat/TeTreeMinimum.cpp
new file mode 100644
index 0000000..f5d7394
--- /dev/null
+++ b/src/terralib/stat/TeTreeMinimum.cpp
@@ -0,0 +1,379 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#include <math.h>
+#include "TeTreeMinimum.h"
+
+bool
+compare_dissimilarity(const graph_link &graph_link1, const graph_link &graph_link2)
+{
+ if (graph_link1.Dissimilarity_ < graph_link2.Dissimilarity_)
+ return true;
+ else
+ return false;
+}
+
+void TeCreateDissMatrix (TeSelectedObjectMap& objects, TeProxMatrix& proxMatrix,
+ matrix& mat_diss, double &Diss_max)
+{
+ string GeoId1, GeoId2;
+ TeSelectedObjectVector neighbors;
+ int num_neighbors;
+ double val1, val2;
+ int DISS_TYPE = 1;
+ double Diss = 0.;
+ Diss_max = 0.;
+ graph graph_;
+ int tamanho = 0;
+
+ TeSelectedObjectMap::iterator it = objects.begin();
+ int num_objects = objects.size();
+
+ while ( it != objects.end() )
+ {
+ ((*it).second).slice_ = 0.;
+ GeoId1 = (*it).first;
+ neighbors = proxMatrix [GeoId1];
+ num_neighbors = neighbors.size();
+ graph_.clear();
+ tamanho = graph_.size();
+ double difer = 0.;
+ for (int i = 0; i< num_neighbors; i++)
+ {
+ GeoId2 = neighbors[i].geoid_;
+ TeSelectedObjectMap::iterator it2 = objects.find(GeoId2);
+ //leitura dos valores
+ for (int j = 0; j < (*it).second.properties_.size(); j++)
+ {
+ val1 = atof ( ((*it).second).properties_[j].value_.c_str() );
+ val2 = atof ( ((*it2).second).properties_[j].value_.c_str() );
+ difer = val1 - val2;
+ if (DISS_TYPE)
+ Diss+= difer*difer; // distancia euclidiana (y=1)
+ else
+ Diss+= double(fabs(difer)); // distancia quarteirao (y=0)
+ }
+ if (DISS_TYPE)
+ Diss = sqrt(Diss);
+
+ // guarda maior valor
+ if (Diss > Diss_max)
+ Diss_max = Diss;
+
+ //escrever na estrutura map de grafos
+ if (GeoId1 != GeoId2)
+ graph_.push_back(graph_link(GeoId1,GeoId2,Diss));
+ }
+ sort(graph_.begin(), graph_.end(), compare_dissimilarity);
+ mat_diss[GeoId1] = graph_;
+ it++;
+ }
+}
+
+void
+TeCreateMinimumTree (TeSelectedObjectMap& objects, matrix& DissMatrix,
+ graph& Min_Tree, double Diss_max)
+{
+ // GERAR ARVORE MINIMA
+ map<int,string> nos_MimTree; //container que armazenar� n�s da �rvore minima
+ // escolha do primeiro n�
+ TeSelectedObjectMap::iterator it = objects.begin();
+
+ string GeoId1 = (*it).first;
+ int num_nos = 0; //n�mero de n�s na �rvore m�nima
+
+ nos_MimTree[num_nos++] = GeoId1;
+ string GeoId2 = DissMatrix[GeoId1][0].GeoId2_; //A matriz possui as linhas ordenadas pela menor dissimilaridade
+ nos_MimTree[num_nos++] = GeoId2;
+
+ graph_link link1(GeoId1, GeoId2, DissMatrix[GeoId1][0].Dissimilarity_);
+ Min_Tree.push_back(link1);
+
+ double Diss_mim;
+ graph::iterator it_link = DissMatrix[GeoId1].begin();
+ DissMatrix[GeoId1].erase(it_link); //apaga link j� analisado
+
+ int num_objects = objects.size();
+ bool no_novo = false;
+
+ while ((num_nos) < num_objects)
+ {
+ Diss_mim = Diss_max;
+ no_novo = false;
+ for (int i = 0; i < nos_MimTree.size(); i++)
+ {
+ string no_atual = nos_MimTree[i];
+ if ((DissMatrix[no_atual].size() != 0) & (DissMatrix[no_atual][0].Dissimilarity_ < Diss_mim))
+ {
+ GeoId1 = DissMatrix[nos_MimTree[i]][0].GeoId1_;
+ GeoId2 = DissMatrix[nos_MimTree[i]][0].GeoId2_;
+ Diss_mim = DissMatrix[nos_MimTree[i]][0].Dissimilarity_;
+ no_novo = true;
+ }
+ }
+
+ // verifica se n� j� pertence � �rvore
+ string no_atual;
+ for (int j = 0; j < nos_MimTree.size(); j++)
+ {
+ no_atual = nos_MimTree[j];
+ if(no_atual == GeoId2)
+ no_novo = false;
+ }
+
+ // se n� � novo, inclui link na �rvore m�nima
+ if (no_novo)
+ {
+ nos_MimTree[num_nos++] = GeoId2;
+ graph_link link2(GeoId1, GeoId2, Diss_mim);
+ Min_Tree.push_back(link2);
+ }
+
+ DissMatrix[GeoId1].erase(DissMatrix[GeoId1].begin());
+ }
+}
+
+
+void
+TeCreateSubTrees( TeSelectedObjectMap& objects,graph& Min_Tree,
+ TeSelectedObjectMap& result, int num_regioes)
+{
+ double SSA1 = 0., SSA2 = 0., SSTO = 0.;
+ graph::iterator it1 = Min_Tree.begin();
+ graph::iterator it2 = Min_Tree.begin();
+ graph::iterator itMax = Min_Tree.begin();
+ result.clear();
+ TeSelectedObjectMap::iterator it = objects.begin();
+
+ vector<string> subtree_vertexes_1, subtree1;
+ vector<string> subtree_vertexes_2, subtree2;
+
+ // h� necessidade de zerar o slice!
+ for (int regiao = 1; regiao < num_regioes; regiao++)
+ {
+ double link_cost = 0.;
+ graph_link bigest_cost("","",0.);
+ int contagem = 0;
+ it1 = Min_Tree.begin();
+ while (it1 != Min_Tree.end())
+ {
+ graph MT_copy;
+
+ string GeoId1 = it1->GeoId1_;
+ string GeoId2 = it1->GeoId2_;
+ subtree_vertexes_1.clear();
+ subtree_vertexes_2.clear();
+
+ subtree_vertexes_1.push_back(GeoId1);
+ subtree_vertexes_2.push_back(GeoId2);
+
+ int actual_vert = 0;
+ string new_vertixe;
+
+ while (actual_vert < subtree_vertexes_1.size())
+ {
+ it2 = Min_Tree.begin();
+ bool new_v = false;
+
+ while (it2 != Min_Tree.end())
+ {
+ if ((subtree_vertexes_1[actual_vert] == it2->GeoId1_) &&
+ (subtree_vertexes_2[0] != it2->GeoId2_ ))
+ {
+ new_vertixe = it2->GeoId2_; new_v = true;
+ } else if ((subtree_vertexes_1[actual_vert] == it2->GeoId2_) &&
+ (subtree_vertexes_2[0] != it2->GeoId1_ ))
+ {
+ new_vertixe = it2->GeoId1_; new_v = true;
+ }
+ if ((new_v) && (find(subtree_vertexes_1.begin(), subtree_vertexes_1.end(), new_vertixe) == subtree_vertexes_1.end()))
+ subtree_vertexes_1.push_back(new_vertixe);
+ it2++;
+ }
+ actual_vert++;
+ }
+
+ actual_vert = 0;
+ while (actual_vert < subtree_vertexes_2.size())
+ {
+ it2 = Min_Tree.begin();
+ bool new_v = false;
+
+ while (it2 != Min_Tree.end())
+ {
+ if ((subtree_vertexes_2[actual_vert] == it2->GeoId1_) &&
+ (subtree_vertexes_1[0] != it2->GeoId2_ ))
+ {
+ new_vertixe = it2->GeoId2_; new_v = true;
+ } else if ((subtree_vertexes_2[actual_vert] == it2->GeoId2_) &&
+ (subtree_vertexes_1[0] != it2->GeoId1_ ))
+ {
+ new_vertixe = it2->GeoId1_; new_v = true;
+ }
+ if ((new_v) && (find(subtree_vertexes_2.begin(), subtree_vertexes_2.end(), new_vertixe) == subtree_vertexes_2.end()))
+ subtree_vertexes_2.push_back(new_vertixe);
+ it2++;
+ }
+ actual_vert++;
+ }
+
+ //Calcular o vetor m�dia
+ int tam1 = subtree_vertexes_1.size();
+ int tam2 = subtree_vertexes_2.size();
+
+ int attributes_number = ((*it).second).properties_.size();
+
+ vector <double> sum1, sum2, total_sum;
+ vector<double> mean1, mean2, global_mean;
+ for (int i = 0; i < attributes_number ; i++)
+ {
+ sum1.push_back(0.); sum2.push_back(0.); total_sum.push_back(0.);
+ mean1.push_back(0.); mean2.push_back(0.); global_mean.push_back(0.);
+ }
+
+
+ string GeoId;
+ vector<string>::iterator it_s = subtree_vertexes_1.begin();
+
+ double valor = 0.;
+ while ( it_s != subtree_vertexes_1.end() )
+ {
+ GeoId = (*it_s).c_str();
+ it = objects.find(GeoId);
+ for (int i = 0; i < attributes_number ; i++)
+ {
+ valor = atof ( ((*it).second).properties_[i].value_.c_str() );
+ sum1[i] += valor;
+ }
+ it_s++;
+ }
+
+ it_s = subtree_vertexes_2.begin();
+ while ( it_s != subtree_vertexes_2.end() )
+ {
+ GeoId = (*it_s).c_str();
+ it = objects.find(GeoId);
+ for (int i = 0; i < attributes_number ; i++)
+ {
+ valor = atof ( ((*it).second).properties_[i].value_.c_str() );
+ sum2[i] += valor;
+ }
+ it_s++;
+ }
+
+ for (int k = 0; k < attributes_number ; k++)
+ {
+ total_sum[k] = sum1[k] + sum2[k];
+ }
+
+
+ for (int j = 0; j < attributes_number ; j++)
+ {
+ mean1[j] = sum1[j]/tam1;
+ mean2[j] = sum2[j]/tam2;
+ global_mean[j] = total_sum[j]/(tam1+tam2);
+ }
+
+ // Calculo do SSTO e SSA's
+ double SSA1 = 0.; SSA2 = 0.; SSTO = 0.;
+ double desvio1 = 0., desvio2 = 0., desvioGlobal = 0.;
+
+ it_s = subtree_vertexes_1.begin();
+ while ( it_s != subtree_vertexes_1.end() )
+ {
+ GeoId = (*it_s).c_str();
+ it = objects.find(GeoId);
+ for (int i=0; i<attributes_number; i++)
+ {
+ valor = atof ( ((*it).second).properties_[i].value_.c_str() );
+ desvio1 = valor - mean1[i];
+ desvioGlobal = valor - global_mean[i];
+ SSA1 += desvio1*desvio1;
+ SSTO += desvioGlobal*desvioGlobal;
+ }
+ it_s++;
+ }
+
+ it_s = subtree_vertexes_2.begin();
+ while ( it_s != subtree_vertexes_2.end() )
+ {
+ GeoId = (*it_s).c_str();
+ it = objects.find(GeoId);
+ for (int i=0; i<attributes_number; i++)
+ {
+ valor = atof ( ((*it).second).properties_[i].value_.c_str() );
+ desvio2 = valor - mean2[i];
+ desvioGlobal = valor - global_mean[i];
+ SSA2 += desvio2*desvio2;
+ SSTO += desvioGlobal*desvioGlobal;
+ }
+ it_s++;
+ }
+
+ // Calculo do custo de aresta
+ double link_cost = SSTO - SSA1 - SSA2;
+
+ if (link_cost > bigest_cost.Dissimilarity_)
+ {
+ bigest_cost.Dissimilarity_ = link_cost;
+ bigest_cost.GeoId1_= GeoId1;
+ bigest_cost.GeoId2_= GeoId2;
+ subtree1 = subtree_vertexes_1;
+ subtree2 = subtree_vertexes_2;
+ itMax = it1; //armazena o iterator para o n� mais caro
+ }
+
+ it1++;
+ }
+ // excluir link
+ string teste1 = itMax->GeoId1_;
+ string teste2 = itMax->GeoId2_;
+ Min_Tree.erase(itMax);
+
+ // atualizar slice
+ vector<string>::iterator it_s = subtree2.begin();
+ int contador = 0;
+ while (it_s != subtree2.end())
+ {
+ it = objects.find((*it_s).c_str());
+ ((*it).second).slice_ = regiao;
+ it_s++;
+ contador++;
+ }
+
+ }
+
+ // Transfer objects to map
+// TeSelectedObjectMap *objectsMap = layer.objectMap();//->objectMap();
+ it = objects.begin();
+ while ( it != objects.end() )
+ {
+ string GeoId = (*it).first;
+// (*objectsMap)[GeoId] = (*it).second;
+ TeSelectedObject obj = ( *it ).second;
+ obj.properties_[0].attr_.semantic_ = "Cluster index";
+ obj.properties_[0].value_ = Te2String (((*it).second).slice_ );
+ result [ obj.geoid_] = obj;
+ ++it;
+ }
+
+}
\ No newline at end of file
diff --git a/src/terralib/stat/TeTreeMinimum.h b/src/terralib/stat/TeTreeMinimum.h
new file mode 100644
index 0000000..6562286
--- /dev/null
+++ b/src/terralib/stat/TeTreeMinimum.h
@@ -0,0 +1,89 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeTreeMinimum.h
+ This file contains functions related to the Tree Minimum clustering algorithm
+*/
+#ifndef __TERRALIB_INTERNAL_TREEMINIMUM_H
+#define __TERRALIB_INTERNAL_TREEMINIMUM_H
+
+#include <vector>
+#include <map>
+#include <string>
+
+#include "TeSelectedObject.h"
+#include "TeSpatialStatistics.h"
+#include "TeLayer.h"
+
+using namespace std;
+
+class graph_link
+{
+public:
+ string GeoId1_;
+ string GeoId2_;
+ double Dissimilarity_;
+
+ ~graph_link()
+ {}
+
+
+ graph_link() :
+ GeoId1_(""),
+ GeoId2_("")
+ {}
+
+ graph_link(const string& GeoId1, const string& GeoId2):
+ GeoId1_(GeoId1),
+ GeoId2_(GeoId2)
+ {}
+
+ graph_link(const string& GeoId1, const string& GeoId2, const double Dissimilarity) :
+ GeoId1_(GeoId1),
+ GeoId2_(GeoId2),
+ Dissimilarity_(Dissimilarity)
+ {}
+
+
+ void set_Dissimilatiry (const double Dissimilarity)
+ { Dissimilarity_ = Dissimilarity; }
+
+ bool compare_dissimilarity(const graph_link &graph_link1, const graph_link &graph_link2);
+// bool graph_link::operator<(const graph_link &graph_link1, const graph_link &graph_link2);
+};
+
+
+
+typedef vector<graph_link> graph;
+
+typedef map<string,graph> matrix;
+
+void TeCreateDissMatrix (TeSelectedObjectMap& Objects, TeProxMatrix& proxMatrix,
+ matrix& mat_diss, double& Diss_max);
+
+void TeCreateMinimumTree ( TeSelectedObjectMap& Objects, matrix& DissMatrix, graph& Min_Tree, double Diss_max);
+
+void TeCreateSubTrees( TeSelectedObjectMap& Objects, graph& Min_Tree,
+ TeSelectedObjectMap& result, int num_regioes);
+
+#endif
\ No newline at end of file
diff --git a/src/terralib/stat/erro.h b/src/terralib/stat/erro.h
new file mode 100644
index 0000000..80ca0b6
--- /dev/null
+++ b/src/terralib/stat/erro.h
@@ -0,0 +1,6 @@
+#ifndef ErroH
+#define ErroH
+#include <stdlib.h>
+#include <stdio.h>
+#define FatalError(x) {printf("%s\n", x); exit(0);}
+#endif
diff --git a/src/terralib/stat/filaDouble.cpp b/src/terralib/stat/filaDouble.cpp
new file mode 100644
index 0000000..0448d34
--- /dev/null
+++ b/src/terralib/stat/filaDouble.cpp
@@ -0,0 +1,58 @@
+//---------------------------------------------------------------------------
+#include <stdlib.h>
+#include "erro.h"
+#ifdef WIN32
+#pragma hdrstop
+#endif
+
+#include "filaDouble.h"
+TFilaDouble::TFilaDouble(){
+ mFila = (Fila_ptr) malloc(sizeof(Fila_t));
+ if (!mFila) FatalError("Mem�ria FilaInt");
+ mFila->Head = NULL;
+ mFila->Tail = NULL;
+ mFila->Size = 0;
+}
+//---------------------------------------------------------------------------
+TFilaDouble::~TFilaDouble(){
+ delete mFila;
+}
+//---------------------------------------------------------------------------
+void TFilaDouble::Insere(double Item){
+ Item_ptr novo;
+
+ novo=(Item_ptr) malloc(sizeof(Item_t));
+ if (!novo){
+ FatalError("Falta de mem�ria!");
+ }
+ novo->Item = Item;
+ novo->Proximo = NULL;
+ if(mFila->Size)
+ mFila->Tail->Proximo = novo;
+ else
+ mFila->Head = novo;
+ mFila->Tail = novo;
+ (mFila->Size)++;
+}
+//---------------------------------------------------------------------------
+double TFilaDouble::Retira(){
+ Item_ptr Aux;
+ double i;
+
+ if(!mFila->Size) {
+ FatalError("Tirando de Fila Vazia!");
+ }
+
+ Aux = mFila->Head;
+ i=Aux->Item;
+ mFila->Head = mFila->Head->Proximo;
+ if (mFila->Size == 1) mFila->Tail = NULL;
+ (mFila->Size)--;
+ free(Aux);
+ return i;
+}
+//---------------------------------------------------------------------------
+int TFilaDouble::GetSize(){
+ return mFila->Size;
+}
+
diff --git a/src/terralib/stat/filaDouble.h b/src/terralib/stat/filaDouble.h
new file mode 100644
index 0000000..2830aab
--- /dev/null
+++ b/src/terralib/stat/filaDouble.h
@@ -0,0 +1,27 @@
+//---------------------------------------------------------------------------
+#ifndef FilaDoubleH
+#define FilaDoubleH
+class TFilaDouble {
+ private:
+ typedef struct it {
+ double Item;
+ struct it *Proximo;
+ }Item_t,*Item_ptr;
+
+ typedef struct Fila {
+ Item_ptr Head;
+ Item_ptr Tail;
+ int Size;
+ }Fila_t,*Fila_ptr;
+ Fila_ptr mFila;
+ int GetSize();
+public:
+ TFilaDouble();
+ ~TFilaDouble();
+ void Insere(double);
+ double Retira();
+ int Size() {return GetSize();}
+};
+
+//---------------------------------------------------------------------------
+#endif
diff --git a/src/terralib/stat/filaInt.cpp b/src/terralib/stat/filaInt.cpp
new file mode 100644
index 0000000..6fc1012
--- /dev/null
+++ b/src/terralib/stat/filaInt.cpp
@@ -0,0 +1,58 @@
+//---------------------------------------------------------------------------
+#include <stdlib.h>
+#ifdef WIN32
+#pragma hdrstop
+#endif
+
+#include "erro.h"
+#include "filaInt.h"
+TFilaInt::TFilaInt(){
+ mFila = (Fila_ptr) malloc(sizeof(Fila_t));
+ if (!mFila) FatalError("Mem�ria FilaInt");
+ mFila->Head = NULL;
+ mFila->Tail = NULL;
+ mFila->Size = 0;
+}
+//---------------------------------------------------------------------------
+TFilaInt::~TFilaInt(){
+ delete mFila;
+}
+//---------------------------------------------------------------------------
+void TFilaInt::Insere(int Raiz){
+ Item_ptr novo;
+
+ novo=(Item_ptr) malloc(sizeof(Item_t));
+ if (!novo){
+ FatalError("Falta de mem�ria!");
+ }
+ novo->Raiz = Raiz;
+ novo->Proximo = NULL;
+ if(mFila->Size)
+ mFila->Tail->Proximo = novo;
+ else
+ mFila->Head = novo;
+ mFila->Tail = novo;
+ (mFila->Size)++;
+}
+//---------------------------------------------------------------------------
+int TFilaInt::Retira(){
+ Item_ptr Aux;
+ int i;
+
+ if(!mFila->Size) {
+ FatalError("Tirando de Fila Vazia!");
+ }
+
+ Aux = mFila->Head;
+ i=Aux->Raiz;
+ mFila->Head = mFila->Head->Proximo;
+ if (mFila->Size == 1) mFila->Tail = NULL;
+ (mFila->Size)--;
+ free(Aux);
+ return i;
+}
+//---------------------------------------------------------------------------
+int TFilaInt::GetSize(){
+ return mFila->Size;
+}
+
diff --git a/src/terralib/stat/filaInt.h b/src/terralib/stat/filaInt.h
new file mode 100644
index 0000000..cd98d67
--- /dev/null
+++ b/src/terralib/stat/filaInt.h
@@ -0,0 +1,27 @@
+//---------------------------------------------------------------------------
+#ifndef FilaIntH
+#define FilaIntH
+class TFilaInt {
+ private:
+ typedef struct it {
+ int Raiz;
+ struct it *Proximo;
+ }Item_t,*Item_ptr;
+
+ typedef struct Fila {
+ Item_ptr Head;
+ Item_ptr Tail;
+ int Size;
+ }Fila_t,*Fila_ptr;
+ Fila_ptr mFila;
+ int GetSize();
+public:
+ TFilaInt();
+ ~TFilaInt();
+ void Insere(int);
+ int Retira();
+ int Size() {return GetSize();}
+};
+
+//---------------------------------------------------------------------------
+#endif
diff --git a/src/terralib/stat/filaR.cpp b/src/terralib/stat/filaR.cpp
new file mode 100644
index 0000000..f023f93
--- /dev/null
+++ b/src/terralib/stat/filaR.cpp
@@ -0,0 +1,79 @@
+//---------------------------------------------------------------------------
+#include <stdlib.h>
+#ifdef WIN32
+#pragma hdrstop
+#endif
+
+#include "filaR.h"
+#include "erro.h"
+
+TFilaR::TFilaR(){
+ mFila = (Fila_ptr) malloc(sizeof(Fila_t));
+ if (!mFila) FatalError("Mem�ria FilaR");
+ mFila->Head = NULL;
+ mFila->Next = NULL;
+ mFila->Atual = NULL;
+ mFila->Size = 0;
+}
+//---------------------------------------------------------------------------
+TFilaR::~TFilaR(){
+ delete mFila;
+}
+//---------------------------------------------------------------------------
+void TFilaR::Insere(int Raiz,double Desvio,long Populacao){
+ Item_ptr novo;
+
+ novo=(Item_ptr) malloc(sizeof(Item_t));
+ if (!novo) {
+ FatalError("Falta de mem�ria!");
+ }
+ novo->Raiz = Raiz;
+ novo->Desvio = Desvio;
+ novo->Queda = 0;
+ novo->Populacao = Populacao;
+ novo->Proximo = mFila->Head;
+
+ mFila->Head = novo;
+ mFila->Atual = novo;
+ mFila->Next = novo;
+ (mFila->Size)++;
+}
+//---------------------------------------------------------------------------
+void TFilaR::Retira(int Raiz){
+ Item_ptr Aux,Prev;
+
+ if(!mFila->Size) {
+ FatalError("Fila Vazia!");
+ }
+
+ Aux = mFila->Head;
+ if(Aux->Raiz == Raiz) {
+ mFila->Head = Aux->Proximo;
+ (mFila->Size)--;
+ } else {
+ while (Aux && Aux->Raiz != Raiz){
+ Prev = Aux;
+ Aux = Aux->Proximo;
+ }
+ Prev->Proximo = Aux->Proximo;
+ (mFila->Size)--;
+ free(Aux);
+ }
+ mFila->Atual = mFila->Head;
+ mFila->Next = mFila->Head;
+}
+//---------------------------------------------------------------------------
+int TFilaR::Proximo(){
+ int i;
+ if(!mFila->Next) {
+ mFila->Next = mFila->Head;
+ mFila->Atual = mFila->Head;
+ return -1;
+ }
+ i = mFila->Next->Raiz;
+ mFila->Atual = mFila->Next;
+ mFila->Next = mFila->Next->Proximo;
+ return i;
+}
+//---------------------------------------------------------------------------
+
diff --git a/src/terralib/stat/filaR.h b/src/terralib/stat/filaR.h
new file mode 100644
index 0000000..ee0b32e
--- /dev/null
+++ b/src/terralib/stat/filaR.h
@@ -0,0 +1,36 @@
+//---------------------------------------------------------------------------
+#ifndef FilaRH
+#define FilaRH
+
+class TFilaR {
+public:
+ typedef struct Item {
+ int Raiz; // Indice no vetor da raiz do grupamento
+ double Centro_X,Centro_Y; // Centroide do grupamento
+ int Num_Areas; // Numero de areas dentro do grupamento
+ double Desvio; // Desvio dentro do grupamento
+ double Queda; // Quanto cai o desvio com uma particao
+ double D1,D2; // desvio nos dois grupos gerados
+ int R1,R2; // Indice no vetor das raizes dos grupos gerados
+ long P1,P2; // populacao nos grupos gerados
+ long Populacao; // Populacao do grupamento
+ struct Item *Proximo; // Proximo item na lista de raizes
+ }Item_t,*Item_ptr;
+
+ typedef struct Fila {
+ Item_ptr Head;
+ int Size;
+ Item_ptr Atual;// Utilizado para acesso aos dados
+ Item_ptr Next; //Para Pesquisa
+ }Fila_t,*Fila_ptr;
+
+ Fila_ptr mFila;
+
+ TFilaR();
+ ~TFilaR();
+ void Insere(int,double,long);
+ void Retira(int);
+ int Proximo();
+};
+//---------------------------------------------------------------------------
+#endif
diff --git a/src/terralib/stat/hash.cpp b/src/terralib/stat/hash.cpp
new file mode 100644
index 0000000..3606b78
--- /dev/null
+++ b/src/terralib/stat/hash.cpp
@@ -0,0 +1,53 @@
+//---------------------------------------------------------------------------
+#ifdef WIN32
+#pragma hdrstop
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+#include "hash.h"
+
+THash::THash(){//Construtora
+ MyHash = new Hash_t[HASH_SIZE];
+ if(!MyHash)
+ FatalError("Falta de mem�ria para o Hash");
+};
+
+void THash::Insere(char* SKey,unsigned int Indice){
+ unsigned int Hash_Indice;
+ unsigned long Key;
+ Hash_ptr Novo;
+
+ sscanf(SKey,"%ld",&Key);
+
+ Novo = (Hash_ptr) malloc(sizeof(Hash_t));
+ if(!Novo) FatalError("Falta de mem�ria para o Hash");
+
+ Hash_Indice = Hash_Function(Key);
+ Novo->Next = MyHash[Hash_Indice].Next;
+ Novo->Key = Key;
+ Novo->Indice = Indice;
+ MyHash[Hash_Indice].Next = Novo;
+};
+
+unsigned int THash::Pesquisa(const char* SKey){
+ Hash_ptr Aux;
+ unsigned int Hash_Indice;
+ unsigned long Key;
+
+ sscanf(SKey,"%ld",&Key);
+ Hash_Indice = Hash_Function(Key); //Obtem posicao no Hash
+ Aux=MyHash[Hash_Indice].Next;//Prepara para a pesquisa
+ while((Aux != NULL) && (Aux->Key != Key)) Aux=Aux->Next;//Faz a pesquisa
+
+ if (Aux == NULL) {
+ FatalError("Pesquisa no hash");
+ }
+ return Aux->Indice;//Retorna o resultado
+};
+
+unsigned int THash::Hash_Function(unsigned long Key){
+ return Key%HASH_SIZE;
+};
+
+//---------------------------------------------------------------------------
+
diff --git a/src/terralib/stat/hash.h b/src/terralib/stat/hash.h
new file mode 100644
index 0000000..fbf17c2
--- /dev/null
+++ b/src/terralib/stat/hash.h
@@ -0,0 +1,26 @@
+//---------------------------------------------------------------------------
+#ifndef HashH
+#define HashH
+#define HASH_SIZE 1000
+#include "erro.h"
+class THash{
+
+/*** Area Privada ***/
+private:
+ typedef struct Hash_Type{
+ unsigned long Key;
+ unsigned int Indice;
+ struct Hash_Type *Next;
+ }Hash_t,*Hash_ptr;
+
+ Hash_ptr MyHash;
+ unsigned int Hash_Function(unsigned long);
+
+/*** Area Publica ***/
+public:
+ THash();//Construtora
+ void Insere(char *,unsigned int);
+ unsigned int Pesquisa(const char *);
+};
+//---------------------------------------------------------------------------
+#endif
diff --git a/src/terralib/stat/heap.cpp b/src/terralib/stat/heap.cpp
new file mode 100644
index 0000000..72f2ad2
--- /dev/null
+++ b/src/terralib/stat/heap.cpp
@@ -0,0 +1,124 @@
+//---------------------------------------------------------------------------
+#include <limits.h>
+#include <stdlib.h>
+#ifdef WIN32
+#pragma hdrstop
+#endif
+
+#include "heap.h"
+#include "erro.h"
+
+/********* Mantem a propriedade de Heap (Para Baixo) *****/
+void THeap::DownHeap(int i){
+ int l;// esquerda
+ int r;// direita
+
+ int max;
+ TipoHeap_t swap;
+
+ l=2*i; //filho da esquerda de i
+ r=2*i+1;// filho da direita de i
+ if ((l<=MyHeap->Size) && (MyHeap->Nos[l].Chave < MyHeap->Nos[r].Chave))
+ max=l;
+ else
+ max=i;
+ if ((r<=MyHeap->Size) && (MyHeap->Nos[r].Chave < MyHeap->Nos[max].Chave))
+ max=r;
+ if (max!=i) {
+ /* Atualiza KeyAux */
+ KeyAux[MyHeap->Nos[i].Indice] = max;
+ KeyAux[MyHeap->Nos[max].Indice] = i;
+
+ /*** Troca Heap[i] com Heap[max] ***/
+ swap = MyHeap->Nos[i];
+ MyHeap->Nos[i] = MyHeap->Nos[max];
+ MyHeap->Nos[max] = swap;
+ /*** Fim da troca *****/
+ DownHeap(max); // Continua o processo
+ };
+};
+
+/******** Mantem a propriedade de Heap (Para Cima) *********/
+void THeap::UpHeap(int i){
+ TipoHeap_t Aux;
+ int swap;
+
+ Aux = MyHeap->Nos[i];
+ /* Guarda a posicao ocupada pelo Indice[i] no Heap */
+ swap = MyHeap->Nos[i].Indice;
+
+ while (i>1 && MyHeap->Nos[i/2].Chave > Aux.Chave){
+
+ /* Atualiza a KeyAux */
+ KeyAux[MyHeap->Nos[i/2].Indice] = i;
+
+ MyHeap->Nos[i] = MyHeap->Nos[i/2];
+ i/=2;
+ };
+ MyHeap->Nos[i] = Aux;
+ /* Atualiza a posicao do KeyAux do item que subiu no Heap */
+ KeyAux[swap] = i;
+};
+
+/******** Funcao que monta o Heap a partir de um Array *****/
+void THeap::Build_Heap(){
+ int i;
+
+ for (i=(MyHeap->Size)/2;i>=1;i--)
+ THeap::DownHeap(i);
+};
+
+/******** Extrai o elemento de maior prioridade e remonta o Heap ********/
+int THeap::Extract_Min(){
+ int min;
+
+ if (MyHeap->Size<1) FatalError("Heap Vazio"); /*acrescentar mensagem de erro*/
+ min=MyHeap->Nos[1].Indice;
+
+ /** Atualiza o KeyAux do Item que foi pra frente */
+ KeyAux[MyHeap->Nos[MyHeap->Size].Indice] = 1;
+ /** Atualiza o KeyAux do Item que foi pro vinagre */
+ KeyAux[MyHeap->Nos[1].Indice] = -1;
+
+ MyHeap->Nos[1] = MyHeap->Nos[MyHeap->Size];
+
+ (MyHeap->Size)--;
+ DownHeap(1);
+ return min;
+};
+
+THeap::THeap(int Size){
+ int i;
+ /*** Inicializacao do Heap ***/
+ MyHeap = new Heap_t;
+ MyHeap->Size = Size;
+ MyHeap->Nos = (TipoHeap_ptr) malloc(sizeof(TipoHeap_t)*(MyHeap->Size+1));
+ KeyAux = (int *) malloc(sizeof(int)*Size);
+ /*** Preenchimento do Heap ***/
+ MyHeap->Nos[1].Chave = 0; // Inicializacao do nodo 1
+ MyHeap->Nos[1].Indice = 0;
+ KeyAux[0]=1;
+ for(i=2;i<=MyHeap->Size;i++) {
+ KeyAux[i-1]=i;
+ MyHeap->Nos[i].Chave = INT_MAX;
+ MyHeap->Nos[i].Indice = i-1;
+ };
+};
+
+/****************************/
+ int THeap::Empty(){
+ return !(MyHeap->Size);
+ };
+
+/*************************/
+double THeap::GetKey(int Indice){
+ return MyHeap->Nos[KeyAux[Indice]].Chave;
+};
+
+/****************************/
+void THeap::SetKey(int Indice,double NKey){
+ MyHeap->Nos[KeyAux[Indice]].Chave = NKey;
+ UpHeap(KeyAux[Indice]);
+};
+
+
diff --git a/src/terralib/stat/heap.h b/src/terralib/stat/heap.h
new file mode 100644
index 0000000..3c0cf00
--- /dev/null
+++ b/src/terralib/stat/heap.h
@@ -0,0 +1,36 @@
+//---------------------------------------------------------------------------
+#ifndef heapH
+#define heapH
+#include "TeSkaterGrafo.h"
+//---------------------------------------------------------------------------
+class THeap {
+
+/******** Area Privada *********/
+private:
+ /* Tipo dos nos do heap */
+ typedef struct TipoHeap {
+ double Chave;
+ int Indice;
+ }TipoHeap_t,*TipoHeap_ptr;
+
+ /* Estrutura do TAD Heap : Tamanho + Vetor */
+ typedef struct Heap {
+ int Size;
+ TipoHeap_ptr Nos;
+ }Heap_t, *Heap_ptr;
+ int *KeyAux;
+ Heap_ptr MyHeap;
+ void Build_Heap();
+ void UpHeap(int);
+ void DownHeap(int);
+ double GetKey(int);
+
+/******** Area Publica *********/
+public:
+ THeap(int);
+ double Key(int Indice) {return GetKey(Indice);}
+ void SetKey(int,double);
+ int Extract_Min();
+ int Empty();
+};
+#endif
diff --git a/src/terralib/stat/lista.cpp b/src/terralib/stat/lista.cpp
new file mode 100644
index 0000000..3b19370
--- /dev/null
+++ b/src/terralib/stat/lista.cpp
@@ -0,0 +1,111 @@
+//---------------------------------------------------------------------------
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef WIN32
+#pragma hdrstop
+#endif
+
+#include "lista.h"
+//---------------------------------------------------------------------------
+TListaVizinho::TListaVizinho(){
+ Lista = (Lista_ptr) malloc(sizeof(Lista_t));
+ if (!Lista) {
+ FatalError("Erro interno A1! \n Entre em contato com o desenvolvedor.");
+ };
+ Lista->Head = NULL;
+ Lista->Next = NULL;
+ Lista->NextB = NULL;
+ Lista->Size = 0;
+ };
+
+//---------------------------------------------------------------------------
+void TListaVizinho::Insere(int indice,double peso){
+ Vizinho_ptr novo;
+
+ novo=(Vizinho_ptr) malloc(sizeof(Vizinho_t));
+ if (!novo) FatalError("Lista Erro"); /* Incluir mensagem de erro */
+
+ novo->Indice = indice;
+ novo->Peso = peso;
+ novo->Proximo = Lista->Head;
+
+ Lista->Head = novo;
+ Lista->Next=novo;
+ Lista->NextB=novo;
+ (Lista->Size)++;
+
+ };
+
+//---------------------------------------------------------------------------
+void TListaVizinho::Adjacente(int *Indice,double *Peso)
+{
+ try
+ {
+ if(!Lista)
+ return;
+
+ if(Lista->Size==0)
+ return;
+
+ if (Lista->Next) {
+ *Indice = Lista->Next->Indice;
+ *Peso = Lista->Next->Peso;
+ Lista->Next=Lista->Next->Proximo;
+ }
+ else {
+ *Indice = -1;
+ Lista->Next = Lista->Head;
+ }
+ }
+ catch(...)
+ {
+ *Indice = -1;
+ return;
+ }
+ };
+
+//---------------------------------------------------------------------------
+void TListaVizinho::AdjacenteB(int *Indice,double *Peso){
+
+
+ if (Lista->NextB) {
+ *Indice = Lista->NextB->Indice;
+ *Peso = Lista->NextB->Peso;
+ Lista->NextB=Lista->NextB->Proximo;
+ }
+ else {
+ *Indice = -1;
+ Lista->NextB = Lista->Head;
+ };
+ };
+
+//---------------------------------------------------------------------------
+int TListaVizinho::GetSize(){
+ return Lista->Size;
+};
+
+//---------------------------------------------------------------------------
+void TListaVizinho::Retira(int Indice){
+ Vizinho_ptr Aux,Prev;
+
+ if(!Lista->Size) {
+ FatalError("Erro interno A2! \n\nEntre em contato com o desenvolvedor.");
+ };
+
+ Aux = Lista->Head;
+ if(Aux->Indice == Indice) {
+ Lista->Head = Aux->Proximo;
+ (Lista->Size)--;
+ Lista->Next = Aux->Proximo;
+ Lista->NextB = Aux->Proximo;
+ } else {
+ Prev = Aux;
+ for(;Aux->Indice != Indice;Aux = Aux->Proximo)
+ Prev = Aux;
+ Prev->Proximo = Aux->Proximo;
+ (Lista->Size)--;
+ free(Aux);
+ };
+};
+
diff --git a/src/terralib/stat/lista.h b/src/terralib/stat/lista.h
new file mode 100644
index 0000000..a2385d2
--- /dev/null
+++ b/src/terralib/stat/lista.h
@@ -0,0 +1,31 @@
+#ifndef ListaH
+#define ListaH
+
+#include "erro.h"
+class TListaVizinho{
+
+private:
+ typedef struct Vizinho {
+ int Indice;
+ double Peso;
+ struct Vizinho *Proximo;
+ }Vizinho_t,*Vizinho_ptr;
+
+ typedef struct ListaVizinho{
+ Vizinho_ptr Head;
+ int Size;
+ Vizinho_ptr Next; /* Utilizado para pesquisa */
+ Vizinho_ptr NextB; /* Utilizado para pesquisa e apelacao */
+ }Lista_t, *Lista_ptr;
+
+ Lista_ptr Lista;
+ int GetSize();
+public:
+ TListaVizinho();
+ void Insere(int,double);
+ void Retira(int);
+ void Adjacente(int *,double *);
+ void AdjacenteB(int *,double *);
+ int Size;
+};
+#endif
diff --git a/src/tiff/cpl_csv.c b/src/tiff/cpl_csv.c
new file mode 100644
index 0000000..0c55abf
--- /dev/null
+++ b/src/tiff/cpl_csv.c
@@ -0,0 +1,1013 @@
+/******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * cpl_csv.c: Support functions for accessing CSV files.
+ *
+ * $Log: cpl_csv.c,v $
+ * Revision 1.3 2004/03/19 11:51:23 lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.15 2003/01/20 06:46:35 warmerda
+ * search for pcs.csv, not horiz_cs.csv
+ *
+ * Revision 1.14 2003/01/15 04:39:58 warmerda
+ * change internal name of CSVAccess
+ *
+ * Revision 1.13 2002/11/28 22:26:41 warmerda
+ * upgraded to proper CSV formatting, and in-memory caching
+ *
+ * Revision 1.12 2002/06/19 03:51:15 warmerda
+ * migrated cpl_csv.h into cpl_serv.h
+ *
+ * Revision 1.11 2001/03/05 04:49:56 warmerda
+ * try to clear CPLReadLine buffer on deaccess
+ *
+ * Revision 1.10 2001/01/17 15:32:19 warmerda
+ * Include /usr/share/epsg_csv and share/epsg_csv in csv search path.
+ *
+ * Revision 1.9 2000/12/12 19:34:36 warmerda
+ * Use CSV_DATA_DIR if defined.
+ *
+ * Revision 1.8 2000/08/22 04:33:33 warmerda
+ * added support for /usr/local/shared/epsg_csv
+ *
+ * Revision 1.7 1999/12/03 14:42:59 warmerda
+ * Passing a NULL filename into CSVAccess() now results in a graceful
+ * failure to open the file.
+ *
+ * Revision 1.6 1999/06/26 17:28:51 warmerda
+ * Fixed reading of records with newlines embedded in quoted strings.
+ *
+ * Revision 1.5 1999/05/04 03:07:24 warmerda
+ * avoid warning
+ *
+ * Revision 1.4 1999/04/28 19:59:56 warmerda
+ * added some doxygen style documentation
+ *
+ * Revision 1.3 1999/03/17 19:53:15 geotiff
+ * sys includes moved to cpl_serv.h
+ *
+ * Revision 1.2 1999/03/10 16:54:42 geotiff
+ * Added use of the GEOTIFF_CSV environment variable to locate CSV files.
+ *
+ * Revision 1.1 1999/03/09 15:57:04 geotiff
+ * New
+ *
+ * Revision 1.2 1999/02/24 16:23:21 warmerda
+ * added lots
+ *
+ * Revision 1.1 1999/01/05 16:52:36 warmerda
+ * New
+ *
+ */
+
+#include "cpl_serv.h"
+#include "geo_tiffp.h"
+
+/* ==================================================================== */
+/* The CSVTable is a persistant set of info about an open CSV */
+/* table. While it doesn't currently maintain a record index, */
+/* or in-memory copy of the table, it could be changed to do so */
+/* in the future. */
+/* ==================================================================== */
+typedef struct ctb {
+ FILE *fp;
+
+ struct ctb *psNext;
+
+ char *pszFilename;
+
+ char **papszFieldNames;
+
+ char **papszRecFields;
+
+ int iLastLine;
+
+ /* Cache for whole file */
+ int nLineCount;
+ char **papszLines;
+ int *panLineIndex;
+ char *pszRawData;
+} CSVTable;
+
+static CSVTable *psCSVTableList = NULL;
+
+/************************************************************************/
+/* CSVAccess() */
+/* */
+/* This function will fetch a handle to the requested table. */
+/* If not found in the ``open table list'' the table will be */
+/* opened and added to the list. Eventually this function may */
+/* become public with an abstracted return type so that */
+/* applications can set options about the table. For now this */
+/* isn't done. */
+/************************************************************************/
+
+static CSVTable *gtCSVAccess( const char * pszFilename )
+
+{
+ CSVTable *psTable;
+ FILE *fp;
+
+/* -------------------------------------------------------------------- */
+/* Is the table already in the list. */
+/* -------------------------------------------------------------------- */
+ for( psTable = psCSVTableList; psTable != NULL; psTable = psTable->psNext )
+ {
+ if( EQUAL(psTable->pszFilename,pszFilename) )
+ {
+ /*
+ * Eventually we should consider promoting to the front of
+ * the list to accelerate frequently accessed tables.
+ */
+
+ return( psTable );
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* If not, try to open it. */
+/* -------------------------------------------------------------------- */
+ fp = VSIFOpen( pszFilename, "rb" );
+ if( fp == NULL )
+ return NULL;
+
+/* -------------------------------------------------------------------- */
+/* Create an information structure about this table, and add to */
+/* the front of the list. */
+/* -------------------------------------------------------------------- */
+ psTable = (CSVTable *) CPLCalloc(sizeof(CSVTable),1);
+
+ psTable->fp = fp;
+ psTable->pszFilename = CPLStrdup( pszFilename );
+ psTable->psNext = psCSVTableList;
+
+ psCSVTableList = psTable;
+
+/* -------------------------------------------------------------------- */
+/* Read the table header record containing the field names. */
+/* -------------------------------------------------------------------- */
+ psTable->papszFieldNames = CSVReadParseLine( fp );
+
+ return( psTable );
+}
+
+/************************************************************************/
+/* CSVDeaccess() */
+/************************************************************************/
+
+void CSVDeaccess( const char * pszFilename )
+
+{
+ CSVTable *psLast, *psTable;
+
+/* -------------------------------------------------------------------- */
+/* A NULL means deaccess all tables. */
+/* -------------------------------------------------------------------- */
+ if( pszFilename == NULL )
+ {
+ while( psCSVTableList != NULL )
+ CSVDeaccess( psCSVTableList->pszFilename );
+
+ return;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Find this table. */
+/* -------------------------------------------------------------------- */
+ psLast = NULL;
+ for( psTable = psCSVTableList;
+ psTable != NULL && !EQUAL(psTable->pszFilename,pszFilename);
+ psTable = psTable->psNext )
+ {
+ psLast = psTable;
+ }
+
+ if( psTable == NULL )
+ {
+ return;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Remove the link from the list. */
+/* -------------------------------------------------------------------- */
+ if( psLast != NULL )
+ psLast->psNext = psTable->psNext;
+ else
+ psCSVTableList = psTable->psNext;
+
+/* -------------------------------------------------------------------- */
+/* Free the table. */
+/* -------------------------------------------------------------------- */
+ if( psTable->fp != NULL )
+ VSIFClose( psTable->fp );
+
+ CSLDestroy( psTable->papszFieldNames );
+ CSLDestroy( psTable->papszRecFields );
+ CPLFree( psTable->pszFilename );
+ CPLFree( psTable->panLineIndex );
+ CPLFree( psTable->pszRawData );
+ CPLFree( psTable->papszLines );
+
+ CPLFree( psTable );
+
+ CPLReadLine( NULL );
+}
+
+/************************************************************************/
+/* CSVSplitLine() */
+/* */
+/* Tokenize a CSV line into fields in the form of a string */
+/* list. This is used instead of the CPLTokenizeString() */
+/* because it provides correct CSV escaping and quoting */
+/* semantics. */
+/************************************************************************/
+
+static char **CSVSplitLine( const char *pszString )
+
+{
+ char **papszRetList = NULL;
+ char *pszToken;
+ int nTokenMax, nTokenLen;
+
+ pszToken = (char *) CPLCalloc(10,1);
+ nTokenMax = 10;
+
+ while( pszString != NULL && *pszString != '\0' )
+ {
+ int bInString = FALSE;
+
+ nTokenLen = 0;
+
+ /* Try to find the next delimeter, marking end of token */
+ for( ; *pszString != '\0'; pszString++ )
+ {
+
+ /* End if this is a delimeter skip it and break. */
+ if( !bInString && *pszString == ',' )
+ {
+ pszString++;
+ break;
+ }
+
+ if( *pszString == '"' )
+ {
+ if( !bInString || pszString[1] != '"' )
+ {
+ bInString = !bInString;
+ continue;
+ }
+ else /* doubled quotes in string resolve to one quote */
+ {
+ pszString++;
+ }
+ }
+
+ if( nTokenLen >= nTokenMax-2 )
+ {
+ nTokenMax = nTokenMax * 2 + 10;
+ pszToken = (char *) CPLRealloc( pszToken, nTokenMax );
+ }
+
+ pszToken[nTokenLen] = *pszString;
+ nTokenLen++;
+ }
+
+ pszToken[nTokenLen] = '\0';
+ papszRetList = CSLAddString( papszRetList, pszToken );
+
+ /* If the last token is an empty token, then we have to catch
+ * it now, otherwise we won't reenter the loop and it will be lost.
+ */
+ if ( *pszString == '\0' && *(pszString-1) == ',' )
+ {
+ papszRetList = CSLAddString( papszRetList, "" );
+ }
+ }
+
+ if( papszRetList == NULL )
+ papszRetList = (char **) CPLCalloc(sizeof(char *),1);
+
+ CPLFree( pszToken );
+
+ return papszRetList;
+}
+
+/************************************************************************/
+/* CSVFindNextLine() */
+/* */
+/* Find the start of the next line, while at the same time zero */
+/* terminating this line. Take into account that there may be */
+/* newline indicators within quoted strings, and that quotes */
+/* can be escaped with a backslash. */
+/************************************************************************/
+
+static char *CSVFindNextLine( char *pszThisLine )
+
+{
+ int nQuoteCount = 0, i;
+
+ for( i = 0; pszThisLine[i] != '\0'; i++ )
+ {
+ if( pszThisLine[i] == '\"'
+ && (i == 0 || pszThisLine[i-1] != '\\') )
+ nQuoteCount++;
+
+ if( (pszThisLine[i] == 10 || pszThisLine[i] == 13)
+ && (nQuoteCount % 2) == 0 )
+ break;
+ }
+
+ while( pszThisLine[i] == 10 || pszThisLine[i] == 13 )
+ pszThisLine[i++] = '\0';
+
+ if( pszThisLine[i] == '\0' )
+ return NULL;
+ else
+ return pszThisLine + i;
+}
+
+/************************************************************************/
+/* CSVIngest() */
+/* */
+/* Load entire file into memory and setup index if possible. */
+/************************************************************************/
+
+static void CSVIngest( const char *pszFilename )
+
+{
+ CSVTable *psTable = gtCSVAccess( pszFilename );
+ int nFileLen, i, nMaxLineCount, iLine = 0;
+ char *pszThisLine;
+
+ if( psTable->pszRawData != NULL )
+ return;
+
+/* -------------------------------------------------------------------- */
+/* Ingest whole file. */
+/* -------------------------------------------------------------------- */
+ VSIFSeek( psTable->fp, 0, SEEK_END );
+ nFileLen = VSIFTell( psTable->fp );
+ VSIRewind( psTable->fp );
+
+ psTable->pszRawData = (char *) CPLMalloc(nFileLen+1);
+ if( (int) VSIFRead( psTable->pszRawData, 1, nFileLen, psTable->fp )
+ != nFileLen )
+ {
+ CPLFree( psTable->pszRawData );
+ psTable->pszRawData = NULL;
+
+ CPLError( CE_Failure, CPLE_FileIO, "Read of file %s failed.",
+ psTable->pszFilename );
+ return;
+ }
+
+ psTable->pszRawData[nFileLen] = '\0';
+
+/* -------------------------------------------------------------------- */
+/* Get count of newlines so we can allocate line array. */
+/* -------------------------------------------------------------------- */
+ nMaxLineCount = 0;
+ for( i = 0; i < nFileLen; i++ )
+ {
+ if( psTable->pszRawData[i] == 10 )
+ nMaxLineCount++;
+ }
+
+ psTable->papszLines = (char **) CPLCalloc(sizeof(char*),nMaxLineCount);
+
+/* -------------------------------------------------------------------- */
+/* Build a list of record pointers into the raw data buffer */
+/* based on line terminators. Zero terminate the line */
+/* strings. */
+/* -------------------------------------------------------------------- */
+ /* skip header line */
+ pszThisLine = CSVFindNextLine( psTable->pszRawData );
+
+ while( pszThisLine != NULL && iLine < nMaxLineCount )
+ {
+ psTable->papszLines[iLine++] = pszThisLine;
+ pszThisLine = CSVFindNextLine( pszThisLine );
+ }
+
+ psTable->nLineCount = iLine;
+
+/* -------------------------------------------------------------------- */
+/* Allocate and populate index array. Ensure they are in */
+/* ascending order so that binary searches can be done on the */
+/* array. */
+/* -------------------------------------------------------------------- */
+ psTable->panLineIndex = (int *) CPLMalloc(sizeof(int)*psTable->nLineCount);
+ for( i = 0; i < psTable->nLineCount; i++ )
+ {
+ psTable->panLineIndex[i] = atoi(psTable->papszLines[i]);
+
+ if( i > 0 && psTable->panLineIndex[i] < psTable->panLineIndex[i-1] )
+ {
+ CPLFree( psTable->panLineIndex );
+ psTable->panLineIndex = NULL;
+ break;
+ }
+ }
+
+ psTable->iLastLine = -1;
+
+/* -------------------------------------------------------------------- */
+/* We should never need the file handle against, so close it. */
+/* -------------------------------------------------------------------- */
+ VSIFClose( psTable->fp );
+ psTable->fp = NULL;
+}
+
+/************************************************************************/
+/* CSVReadParseLine() */
+/* */
+/* Read one line, and return split into fields. The return */
+/* result is a stringlist, in the sense of the CSL functions. */
+/************************************************************************/
+
+char **CSVReadParseLine( FILE * fp )
+
+{
+ const char *pszLine;
+ char *pszWorkLine;
+ char **papszReturn;
+
+ CPLAssert( fp != NULL );
+ if( fp == NULL )
+ return( NULL );
+
+ pszLine = CPLReadLine( fp );
+ if( pszLine == NULL )
+ return( NULL );
+
+/* -------------------------------------------------------------------- */
+/* If there are no quotes, then this is the simple case. */
+/* Parse, and return tokens. */
+/* -------------------------------------------------------------------- */
+ if( strchr(pszLine,'\"') == NULL )
+ return CSVSplitLine( pszLine );
+
+/* -------------------------------------------------------------------- */
+/* We must now count the quotes in our working string, and as */
+/* long as it is odd, keep adding new lines. */
+/* -------------------------------------------------------------------- */
+ pszWorkLine = CPLStrdup( pszLine );
+
+ while( TRUE )
+ {
+ int i, nCount = 0;
+
+ for( i = 0; pszWorkLine[i] != '\0'; i++ )
+ {
+ if( pszWorkLine[i] == '\"'
+ && (i == 0 || pszWorkLine[i-1] != '\\') )
+ nCount++;
+ }
+
+ if( nCount % 2 == 0 )
+ break;
+
+ pszLine = CPLReadLine( fp );
+ if( pszLine == NULL )
+ break;
+
+ pszWorkLine = (char *)
+ CPLRealloc(pszWorkLine,
+ strlen(pszWorkLine) + strlen(pszLine) + 1);
+ strcat( pszWorkLine, pszLine );
+ }
+
+ papszReturn = CSVSplitLine( pszWorkLine );
+
+ CPLFree( pszWorkLine );
+
+ return papszReturn;
+}
+
+/************************************************************************/
+/* CSVCompare() */
+/* */
+/* Compare a field to a search value using a particular */
+/* criteria. */
+/************************************************************************/
+
+static int CSVCompare( const char * pszFieldValue, const char * pszTarget,
+ CSVCompareCriteria eCriteria )
+
+{
+ if( eCriteria == CC_ExactString )
+ {
+ return( strcmp( pszFieldValue, pszTarget ) == 0 );
+ }
+ else if( eCriteria == CC_ApproxString )
+ {
+ return( EQUAL( pszFieldValue, pszTarget ) );
+ }
+ else if( eCriteria == CC_Integer )
+ {
+ return( atoi(pszFieldValue) == atoi(pszTarget) );
+ }
+
+ return FALSE;
+}
+
+/************************************************************************/
+/* CSVScanLines() */
+/* */
+/* Read the file scanline for lines where the key field equals */
+/* the indicated value with the suggested comparison criteria. */
+/* Return the first matching line split into fields. */
+/************************************************************************/
+
+char **CSVScanLines( FILE *fp, int iKeyField, const char * pszValue,
+ CSVCompareCriteria eCriteria )
+
+{
+ char **papszFields = NULL;
+ int bSelected = FALSE, nTestValue;
+
+ CPLAssert( pszValue != NULL );
+ CPLAssert( iKeyField >= 0 );
+ CPLAssert( fp != NULL );
+
+ nTestValue = atoi(pszValue);
+
+ while( !bSelected ) {
+ papszFields = CSVReadParseLine( fp );
+ if( papszFields == NULL )
+ return( NULL );
+
+ if( CSLCount( papszFields ) < iKeyField+1 )
+ {
+ /* not selected */
+ }
+ else if( eCriteria == CC_Integer
+ && atoi(papszFields[iKeyField]) == nTestValue )
+ {
+ bSelected = TRUE;
+ }
+ else
+ {
+ bSelected = CSVCompare( papszFields[iKeyField], pszValue,
+ eCriteria );
+ }
+
+ if( !bSelected )
+ {
+ CSLDestroy( papszFields );
+ papszFields = NULL;
+ }
+ }
+
+ return( papszFields );
+}
+
+/************************************************************************/
+/* CSVScanLinesIndexed() */
+/* */
+/* Read the file scanline for lines where the key field equals */
+/* the indicated value with the suggested comparison criteria. */
+/* Return the first matching line split into fields. */
+/************************************************************************/
+
+static char **
+CSVScanLinesIndexed( CSVTable *psTable, int nKeyValue )
+
+{
+ int iTop, iBottom, iMiddle, iResult = -1;
+
+ CPLAssert( psTable->panLineIndex != NULL );
+
+/* -------------------------------------------------------------------- */
+/* Find target record with binary search. */
+/* -------------------------------------------------------------------- */
+ iTop = psTable->nLineCount-1;
+ iBottom = 0;
+
+ while( iTop >= iBottom )
+ {
+ iMiddle = (iTop + iBottom) / 2;
+ if( psTable->panLineIndex[iMiddle] > nKeyValue )
+ iTop = iMiddle - 1;
+ else if( psTable->panLineIndex[iMiddle] < nKeyValue )
+ iBottom = iMiddle + 1;
+ else
+ {
+ iResult = iMiddle;
+ break;
+ }
+ }
+
+ if( iResult == -1 )
+ return NULL;
+
+/* -------------------------------------------------------------------- */
+/* Parse target line, and update iLastLine indicator. */
+/* -------------------------------------------------------------------- */
+ psTable->iLastLine = iResult;
+
+ return CSVSplitLine( psTable->papszLines[iResult] );
+}
+
+/************************************************************************/
+/* CSVScanLinesIngested() */
+/* */
+/* Read the file scanline for lines where the key field equals */
+/* the indicated value with the suggested comparison criteria. */
+/* Return the first matching line split into fields. */
+/************************************************************************/
+
+static char **
+CSVScanLinesIngested( CSVTable *psTable, int iKeyField, const char * pszValue,
+ CSVCompareCriteria eCriteria )
+
+{
+ char **papszFields = NULL;
+ int bSelected = FALSE, nTestValue;
+
+ CPLAssert( pszValue != NULL );
+ CPLAssert( iKeyField >= 0 );
+
+ nTestValue = atoi(pszValue);
+
+/* -------------------------------------------------------------------- */
+/* Short cut for indexed files. */
+/* -------------------------------------------------------------------- */
+ if( iKeyField == 0 && eCriteria == CC_Integer
+ && psTable->panLineIndex != NULL )
+ return CSVScanLinesIndexed( psTable, nTestValue );
+
+/* -------------------------------------------------------------------- */
+/* Scan from in-core lines. */
+/* -------------------------------------------------------------------- */
+ while( !bSelected && psTable->iLastLine+1 < psTable->nLineCount ) {
+ psTable->iLastLine++;
+ papszFields = CSVSplitLine( psTable->papszLines[psTable->iLastLine] );
+
+ if( CSLCount( papszFields ) < iKeyField+1 )
+ {
+ /* not selected */
+ }
+ else if( eCriteria == CC_Integer
+ && atoi(papszFields[iKeyField]) == nTestValue )
+ {
+ bSelected = TRUE;
+ }
+ else
+ {
+ bSelected = CSVCompare( papszFields[iKeyField], pszValue,
+ eCriteria );
+ }
+
+ if( !bSelected )
+ {
+ CSLDestroy( papszFields );
+ papszFields = NULL;
+ }
+ }
+
+ return( papszFields );
+}
+
+/************************************************************************/
+/* CSVScanFile() */
+/* */
+/* Scan a whole file using criteria similar to above, but also */
+/* taking care of file opening and closing. */
+/************************************************************************/
+
+char **CSVScanFile( const char * pszFilename, int iKeyField,
+ const char * pszValue, CSVCompareCriteria eCriteria )
+
+{
+ CSVTable *psTable;
+
+/* -------------------------------------------------------------------- */
+/* Get access to the table. */
+/* -------------------------------------------------------------------- */
+ CPLAssert( pszFilename != NULL );
+
+ if( iKeyField < 0 )
+ return NULL;
+
+ psTable = gtCSVAccess( pszFilename );
+ if( psTable == NULL )
+ return NULL;
+
+ CSVIngest( pszFilename );
+
+/* -------------------------------------------------------------------- */
+/* Does the current record match the criteria? If so, just */
+/* return it again. */
+/* -------------------------------------------------------------------- */
+ if( iKeyField >= 0
+ && iKeyField < CSLCount(psTable->papszRecFields)
+ && CSVCompare(pszValue,psTable->papszRecFields[iKeyField],eCriteria) )
+ {
+ return psTable->papszRecFields;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Scan the file from the beginning, replacing the ``current */
+/* record'' in our structure with the one that is found. */
+/* -------------------------------------------------------------------- */
+ psTable->iLastLine = -1;
+ CSLDestroy( psTable->papszRecFields );
+
+ if( psTable->pszRawData != NULL )
+ psTable->papszRecFields =
+ CSVScanLinesIngested( psTable, iKeyField, pszValue, eCriteria );
+ else
+ {
+ VSIRewind( psTable->fp );
+ CPLReadLine( psTable->fp ); /* throw away the header line */
+
+ psTable->papszRecFields =
+ CSVScanLines( psTable->fp, iKeyField, pszValue, eCriteria );
+ }
+
+ return( psTable->papszRecFields );
+}
+
+/************************************************************************/
+/* CPLGetFieldId() */
+/* */
+/* Read the first record of a CSV file (rewinding to be sure), */
+/* and find the field with the indicated name. Returns -1 if */
+/* it fails to find the field name. Comparison is case */
+/* insensitive, but otherwise exact. After this function has */
+/* been called the file pointer will be positioned just after */
+/* the first record. */
+/************************************************************************/
+
+int CSVGetFieldId( FILE * fp, const char * pszFieldName )
+
+{
+ char **papszFields;
+ int i;
+
+ CPLAssert( fp != NULL && pszFieldName != NULL );
+
+ VSIRewind( fp );
+
+ papszFields = CSVReadParseLine( fp );
+ for( i = 0; papszFields != NULL && papszFields[i] != NULL; i++ )
+ {
+ if( EQUAL(papszFields[i],pszFieldName) )
+ {
+ CSLDestroy( papszFields );
+ return i;
+ }
+ }
+
+ CSLDestroy( papszFields );
+
+ return -1;
+}
+
+/************************************************************************/
+/* CSVGetFileFieldId() */
+/* */
+/* Same as CPLGetFieldId(), except that we get the file based */
+/* on filename, rather than having an existing handle. */
+/************************************************************************/
+
+int CSVGetFileFieldId( const char * pszFilename, const char * pszFieldName )
+
+{
+ CSVTable *psTable;
+ int i;
+
+/* -------------------------------------------------------------------- */
+/* Get access to the table. */
+/* -------------------------------------------------------------------- */
+ CPLAssert( pszFilename != NULL );
+
+ psTable = gtCSVAccess( pszFilename );
+ if( psTable == NULL )
+ return -1;
+
+/* -------------------------------------------------------------------- */
+/* Find the requested field. */
+/* -------------------------------------------------------------------- */
+ for( i = 0;
+ psTable->papszFieldNames != NULL
+ && psTable->papszFieldNames[i] != NULL;
+ i++ )
+ {
+ if( EQUAL(psTable->papszFieldNames[i],pszFieldName) )
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+
+/************************************************************************/
+/* CSVScanFileByName() */
+/* */
+/* Same as CSVScanFile(), but using a field name instead of a */
+/* field number. */
+/************************************************************************/
+
+char **CSVScanFileByName( const char * pszFilename,
+ const char * pszKeyFieldName,
+ const char * pszValue, CSVCompareCriteria eCriteria )
+
+{
+ int iKeyField;
+
+ iKeyField = CSVGetFileFieldId( pszFilename, pszKeyFieldName );
+ if( iKeyField == -1 )
+ return NULL;
+
+ return( CSVScanFile( pszFilename, iKeyField, pszValue, eCriteria ) );
+}
+
+/************************************************************************/
+/* CSVGetField() */
+/* */
+/* The all-in-one function to fetch a particular field value */
+/* from a CSV file. Note this function will return an empty */
+/* string, rather than NULL if it fails to find the desired */
+/* value for some reason. The caller can't establish that the */
+/* fetch failed. */
+/************************************************************************/
+
+const char *CSVGetField( const char * pszFilename,
+ const char * pszKeyFieldName,
+ const char * pszKeyFieldValue,
+ CSVCompareCriteria eCriteria,
+ const char * pszTargetField )
+
+{
+ CSVTable *psTable;
+ char **papszRecord;
+ int iTargetField;
+
+/* -------------------------------------------------------------------- */
+/* Find the table. */
+/* -------------------------------------------------------------------- */
+ psTable = gtCSVAccess( pszFilename );
+ if( psTable == NULL )
+ return "";
+
+/* -------------------------------------------------------------------- */
+/* Find the correct record. */
+/* -------------------------------------------------------------------- */
+ papszRecord = CSVScanFileByName( pszFilename, pszKeyFieldName,
+ pszKeyFieldValue, eCriteria );
+
+ if( papszRecord == NULL )
+ return "";
+
+/* -------------------------------------------------------------------- */
+/* Figure out which field we want out of this. */
+/* -------------------------------------------------------------------- */
+ iTargetField = CSVGetFileFieldId( pszFilename, pszTargetField );
+ if( iTargetField < 0 )
+ return "";
+
+ if( iTargetField >= CSLCount( papszRecord ) )
+ return "";
+
+ return( papszRecord[iTargetField] );
+}
+
+/************************************************************************/
+/* CSVFilename() */
+/* */
+/* Return the full path to a particular CSV file. This will */
+/* eventually be something the application can override. */
+/************************************************************************/
+
+static const char *(*pfnCSVFilenameHook)(const char *) = NULL;
+
+const char * CSVFilename( const char *pszBasename )
+
+{
+ static char szPath[512];
+
+ if( pfnCSVFilenameHook == NULL )
+ {
+ FILE *fp = NULL;
+
+ if( getenv("GEOTIFF_CSV") != NULL )
+ {
+ sprintf( szPath, "%s/%s", getenv("GEOTIFF_CSV"), pszBasename );
+ }
+#ifdef CSV_DATA_DIR
+ else
+ {
+ sprintf( szPath, "%s/%s", CSV_DATA_DIR, pszBasename );
+ }
+#else
+ else if( (fp = fopen( "/usr/local/share/epsg/csv/pcs.csv", "rt" )) != NULL )
+ {
+ sprintf( szPath, "/usr/local/share/epsg/csv/%s", pszBasename );
+ }
+ else if( (fp = fopen( "csv/pcs.csv", "rt" )) != NULL )
+ {
+ sprintf( szPath, "csv/%s", pszBasename );
+ }
+ else if( (fp = fopen( "share/epsg_csv/pcs.csv", "rt" )) != NULL )
+ {
+ sprintf( szPath, "share/epsg_csv/%s", pszBasename );
+ }
+ else if( (fp = fopen( "/usr/share/epsg_csv/pcs.csv", "rt" )) != NULL )
+ {
+ sprintf( szPath, "/usr/share/epsg_csv/%s", pszBasename );
+ }
+ else
+ {
+ sprintf( szPath, "/usr/local/share/epsg_csv/%s", pszBasename );
+ }
+#endif
+
+ if( fp != NULL )
+ fclose( fp );
+
+ return( szPath );
+ }
+ else
+ return( pfnCSVFilenameHook( pszBasename ) );
+}
+
+/************************************************************************/
+/* SetCSVFilenameHook() */
+/* */
+/* Applications can use this to set a function that will */
+/* massage CSV filenames. */
+/************************************************************************/
+
+/**
+ * Override CSV file search method.
+ *
+ * @param CSVFileOverride The pointer to a function which will return the
+ * full path for a given filename.
+ *
+
+This function allows an application to override how the GTIFGetDefn() and related function find the CSV (Comma Separated
+Value) values required. The pfnHook argument should be a pointer to a function that will take in a CSV filename and return a
+full path to the file. The returned string should be to an internal static buffer so that the caller doesn't have to free the result.
+
+<b>Example:</b><br>
+
+The listgeo utility uses the following override function if the user
+specified a CSV file directory with the -t commandline switch (argument
+put into CSVDirName). <p>
+
+<pre>
+
+ ...
+
+
+ SetCSVFilenameHook( CSVFileOverride );
+
+ ...
+
+
+static const char *CSVFileOverride( const char * pszInput )
+
+{
+ static char szPath[1024];
+
+#ifdef WIN32
+ sprintf( szPath, "%s\\%s", CSVDirName, pszInput );
+#else
+ sprintf( szPath, "%s/%s", CSVDirName, pszInput );
+#endif
+
+ return( szPath );
+}
+</pre>
+
+*/
+
+void SetCSVFilenameHook( const char *(*pfnNewHook)( const char * ) )
+
+{
+ pfnCSVFilenameHook = pfnNewHook;
+}
diff --git a/src/tiff/cpl_csv.h b/src/tiff/cpl_csv.h
new file mode 100644
index 0000000..db4a1f8
--- /dev/null
+++ b/src/tiff/cpl_csv.h
@@ -0,0 +1,86 @@
+/******************************************************************************
+ * $Id: cpl_csv.h,v 1.1 2002/07/30 19:57:50 juan Exp $
+ *
+ * Project: Common Portability Library
+ * Purpose: Functions for reading and scaning CSV (comma separated,
+ * variable length text files holding tables) files.
+ * Author: Frank Warmerdam, warmerda at home.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: cpl_csv.h,v $
+ * Revision 1.1 2002/07/30 19:57:50 juan
+ * File added
+ *
+ * Revision 1.1 2002/02/04 18:49:02 juan
+ * Arquivo adicionado
+ *
+ * Revision 1.1 1999/10/06 19:26:24 juan
+ * Add files for geotiff
+ *
+ * Revision 1.2 1999/03/17 20:42:40 geotiff
+ * Dont export the CSV functions from the DLL
+ *
+ * Revision 1.1 1999/03/09 15:57:04 geotiff
+ * New
+ *
+ * Revision 1.2 1999/02/24 16:22:58 warmerda
+ * cpl_csv.c
+ *
+ */
+
+#ifndef CPL_CSV_H_INCLUDED
+#define CPL_CSV_H_INCLUDED
+
+#include "cpl_serv.h"
+
+CPL_C_START
+
+typedef enum {
+ CC_ExactString,
+ CC_ApproxString,
+ CC_Integer
+} CSVCompareCriteria;
+
+const char *CSVFilename( const char * );
+
+char **CSVReadParseLine( FILE * );
+char **CSVScanLines( FILE *, int, const char *, CSVCompareCriteria );
+char **CSVScanFile( const char *, int, const char *,
+ CSVCompareCriteria );
+char **CSVScanFileByName( const char *, const char *, const char *,
+ CSVCompareCriteria );
+int CSVGetFieldId( FILE *, const char * );
+int CSVGetFileFieldId( const char *, const char * );
+
+void CSVDeaccess( const char * );
+
+const char *CSVGetField( const char *, const char *, const char *,
+ CSVCompareCriteria, const char * );
+
+void CPL_DLL SetCSVFilenameHook( const char *(*)(const char *) );
+
+CPL_C_END
+
+#endif /* ndef CPL_CSV_H_INCLUDED */
+
diff --git a/src/tiff/cpl_serv.c b/src/tiff/cpl_serv.c
new file mode 100644
index 0000000..7f8f7a6
--- /dev/null
+++ b/src/tiff/cpl_serv.c
@@ -0,0 +1,599 @@
+/******************************************************************************
+ * Copyright (c) 1998, Frank Warmerdam
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * cpl_serv.c: Various Common Portability Library derived convenience functions
+ *
+ * $Log: cpl_serv.c,v $
+ * Revision 1.3 2004/03/19 11:51:23 lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.8 2001/07/09 20:14:37 warmerda
+ * Another problem freeing pszRLBuffer and not setting to NULL.
+ *
+ * Revision 1.7 2001/04/17 13:40:43 warmerda
+ * fixed freeing of line buffer in CPLReadLine(), init ptr to NULL
+ *
+ * Revision 1.6 2001/03/05 04:56:17 warmerda
+ * make it possible to deallocate CPLReadLine buffer
+ *
+ * Revision 1.5 2000/09/30 03:35:05 warmerda
+ * Fixed CPLReadLine() to use avoid calling VSIRealloc() on a NULL pointer.
+ *
+ * Revision 1.4 1999/06/25 04:35:26 warmerda
+ * Fixed to actually support long lines.
+ *
+ * Revision 1.3 1999/03/17 20:43:03 geotiff
+ * Avoid use of size_t keyword
+ *
+ * Revision 1.2 1999/03/10 18:22:39 geotiff
+ * Added string.h, fixed backslash escaping
+ *
+ * Revision 1.1 1999/03/09 15:57:04 geotiff
+ * New
+ *
+ */
+
+#include "cpl_serv.h"
+#include "geo_tiffp.h"
+
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#if defined(HAVE_STRINGS_H) && !defined(HAVE_STRING_H)
+# include <strings.h>
+#endif
+
+/************************************************************************/
+/* CPLCalloc() */
+/************************************************************************/
+
+void *CPLCalloc( int nCount, int nSize )
+
+{
+ void *pReturn;
+
+ if( nSize == 0 )
+ return NULL;
+
+ pReturn = VSICalloc( nCount, nSize );
+ if( pReturn == NULL )
+ {
+ CPLError( CE_Fatal, CPLE_OutOfMemory,
+ "CPLCalloc(): Out of memory allocating %d bytes.\n",
+ nSize * nCount );
+ }
+
+ return pReturn;
+}
+
+/************************************************************************/
+/* CPLMalloc() */
+/************************************************************************/
+
+void *CPLMalloc( int nSize )
+
+{
+ void *pReturn;
+
+ if( nSize == 0 )
+ return NULL;
+
+ pReturn = VSIMalloc( nSize );
+ if( pReturn == NULL )
+ {
+ CPLError( CE_Fatal, CPLE_OutOfMemory,
+ "CPLMalloc(): Out of memory allocating %d bytes.\n",
+ nSize );
+ }
+
+ return pReturn;
+}
+
+/************************************************************************/
+/* CPLRealloc() */
+/************************************************************************/
+
+void * CPLRealloc( void * pData, int nNewSize )
+
+{
+ void *pReturn;
+
+ if( pData == NULL )
+ pReturn = VSIMalloc( nNewSize );
+ else
+ pReturn = VSIRealloc( pData, nNewSize );
+
+ if( pReturn == NULL )
+ {
+ CPLError( CE_Fatal, CPLE_OutOfMemory,
+ "CPLRealloc(): Out of memory allocating %d bytes.\n",
+ nNewSize );
+ }
+
+ return pReturn;
+}
+
+/************************************************************************/
+/* CPLStrdup() */
+/************************************************************************/
+
+char *CPLStrdup( const char * pszString )
+
+{
+ char *pszReturn;
+
+ if( pszString == NULL )
+ pszString = "";
+
+ pszReturn = VSIMalloc( strlen(pszString)+1 );
+
+ if( pszReturn == NULL )
+ {
+ CPLError( CE_Fatal, CPLE_OutOfMemory,
+ "CPLStrdup(): Out of memory allocating %d bytes.\n",
+ strlen(pszString) );
+
+ }
+
+ strcpy( pszReturn, pszString );
+
+ return( pszReturn );
+}
+
+/************************************************************************/
+/* CPLReadLine() */
+/* */
+/* Read a line of text from the given file handle, taking care */
+/* to capture CR and/or LF and strip off ... equivelent of */
+/* DKReadLine(). Pointer to an internal buffer is returned. */
+/* The application shouldn't free it, or depend on it's value */
+/* past the next call to CPLReadLine() */
+/************************************************************************/
+
+const char *CPLReadLine( FILE * fp )
+
+{
+ static char *pszRLBuffer = NULL;
+ static int nRLBufferSize = 0;
+ int nLength, nReadSoFar = 0;
+
+/* -------------------------------------------------------------------- */
+/* Cleanup case. */
+/* -------------------------------------------------------------------- */
+ if( fp == NULL )
+ {
+ CPLFree( pszRLBuffer );
+ pszRLBuffer = NULL;
+ nRLBufferSize = 0;
+ return NULL;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Loop reading chunks of the line till we get to the end of */
+/* the line. */
+/* -------------------------------------------------------------------- */
+ do {
+/* -------------------------------------------------------------------- */
+/* Grow the working buffer if we have it nearly full. Fail out */
+/* of read line if we can't reallocate it big enough (for */
+/* instance for a _very large_ file with no newlines). */
+/* -------------------------------------------------------------------- */
+ if( nRLBufferSize-nReadSoFar < 128 )
+ {
+ nRLBufferSize = nRLBufferSize*2 + 128;
+ if( pszRLBuffer == NULL )
+ pszRLBuffer = (char *) VSIMalloc(nRLBufferSize);
+ else
+ pszRLBuffer = (char *) VSIRealloc(pszRLBuffer, nRLBufferSize);
+ if( pszRLBuffer == NULL )
+ {
+ nRLBufferSize = 0;
+ return NULL;
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* Do the actual read. */
+/* -------------------------------------------------------------------- */
+ if( VSIFGets( pszRLBuffer+nReadSoFar, nRLBufferSize-nReadSoFar, fp )
+ == NULL )
+ {
+ CPLFree( pszRLBuffer );
+ pszRLBuffer = NULL;
+ nRLBufferSize = 0;
+
+ return NULL;
+ }
+
+ nReadSoFar = strlen(pszRLBuffer);
+
+ } while( nReadSoFar == nRLBufferSize - 1
+ && pszRLBuffer[nRLBufferSize-2] != 13
+ && pszRLBuffer[nRLBufferSize-2] != 10 );
+
+/* -------------------------------------------------------------------- */
+/* Clear CR and LF off the end. */
+/* -------------------------------------------------------------------- */
+ nLength = strlen(pszRLBuffer);
+ if( nLength > 0
+ && (pszRLBuffer[nLength-1] == 10 || pszRLBuffer[nLength-1] == 13) )
+ {
+ pszRLBuffer[--nLength] = '\0';
+ }
+
+ if( nLength > 0
+ && (pszRLBuffer[nLength-1] == 10 || pszRLBuffer[nLength-1] == 13) )
+ {
+ pszRLBuffer[--nLength] = '\0';
+ }
+
+ return( pszRLBuffer );
+}
+
+
+/*=====================================================================
+ StringList manipulation functions.
+ =====================================================================*/
+
+/**********************************************************************
+ * CSLAddString()
+ *
+ * Append a string to a StringList and return a pointer to the modified
+ * StringList.
+ * If the input StringList is NULL, then a new StringList is created.
+ **********************************************************************/
+char **CSLAddString(char **papszStrList, const char *pszNewString)
+{
+ int nItems=0;
+
+ if (pszNewString == NULL)
+ return papszStrList; /* Nothing to do!*/
+
+ /* Allocate room for the new string */
+ if (papszStrList == NULL)
+ papszStrList = (char**) CPLCalloc(2,sizeof(char*));
+ else
+ {
+ nItems = CSLCount(papszStrList);
+ papszStrList = (char**)CPLRealloc(papszStrList,
+ (nItems+2)*sizeof(char*));
+ }
+
+ /* Copy the string in the list */
+ papszStrList[nItems] = CPLStrdup(pszNewString);
+ papszStrList[nItems+1] = NULL;
+
+ return papszStrList;
+}
+
+/**********************************************************************
+ * CSLCount()
+ *
+ * Return the number of lines in a Stringlist.
+ **********************************************************************/
+int CSLCount(char **papszStrList)
+{
+ int nItems=0;
+
+ if (papszStrList)
+ {
+ while(*papszStrList != NULL)
+ {
+ nItems++;
+ papszStrList++;
+ }
+ }
+
+ return nItems;
+}
+
+
+/************************************************************************/
+/* CSLGetField() */
+/* */
+/* Fetches the indicated field, being careful not to crash if */
+/* the field doesn't exist within this string list. The */
+/* returned pointer should not be freed, and doesn't */
+/* necessarily last long. */
+/************************************************************************/
+
+const char * CSLGetField( char ** papszStrList, int iField )
+
+{
+ int i;
+
+ if( papszStrList == NULL || iField < 0 )
+ return( "" );
+
+ for( i = 0; i < iField+1; i++ )
+ {
+ if( papszStrList[i] == NULL )
+ return "";
+ }
+
+ return( papszStrList[iField] );
+}
+
+/**********************************************************************
+ * CSLDestroy()
+ *
+ * Free all memory used by a StringList.
+ **********************************************************************/
+void CSLDestroy(char **papszStrList)
+{
+ char **papszPtr;
+
+ if (papszStrList)
+ {
+ papszPtr = papszStrList;
+ while(*papszPtr != NULL)
+ {
+ CPLFree(*papszPtr);
+ papszPtr++;
+ }
+
+ CPLFree(papszStrList);
+ }
+}
+
+
+/**********************************************************************
+ * CSLDuplicate()
+ *
+ * Allocate and return a copy of a StringList.
+ **********************************************************************/
+char **CSLDuplicate(char **papszStrList)
+{
+ char **papszNewList, **papszSrc, **papszDst;
+ int nLines;
+
+ nLines = CSLCount(papszStrList);
+
+ if (nLines == 0)
+ return NULL;
+
+ papszNewList = (char **)CPLMalloc((nLines+1)*sizeof(char*));
+ papszSrc = papszStrList;
+ papszDst = papszNewList;
+
+ while(*papszSrc != NULL)
+ {
+ *papszDst = CPLStrdup(*papszSrc);
+
+ papszSrc++;
+ papszDst++;
+ }
+ *papszDst = NULL;
+
+ return papszNewList;
+}
+
+/**********************************************************************
+ * CSLTokenizeString()
+ *
+ * Tokenizes a string and returns a StringList with one string for
+ * each token.
+ **********************************************************************/
+char **CSLTokenizeString( const char *pszString )
+{
+ return CSLTokenizeStringComplex( pszString, " ", TRUE, FALSE );
+}
+
+/************************************************************************/
+/* CSLTokenizeStringComplex() */
+/* */
+/* The ultimate tokenizer? */
+/************************************************************************/
+
+char ** CSLTokenizeStringComplex( const char * pszString,
+ const char * pszDelimiters,
+ int bHonourStrings, int bAllowEmptyTokens )
+
+{
+ char **papszRetList = NULL;
+ char *pszToken;
+ int nTokenMax, nTokenLen;
+
+ pszToken = (char *) CPLCalloc(10,1);
+ nTokenMax = 10;
+
+ while( pszString != NULL && *pszString != '\0' )
+ {
+ int bInString = FALSE;
+
+ nTokenLen = 0;
+
+ /* Try to find the next delimeter, marking end of token */
+ for( ; *pszString != '\0'; pszString++ )
+ {
+
+ /* End if this is a delimeter skip it and break. */
+ if( !bInString && strchr(pszDelimiters, *pszString) != NULL )
+ {
+ pszString++;
+ break;
+ }
+
+ /* If this is a quote, and we are honouring constant
+ strings, then process the constant strings, with out delim
+ but don't copy over the quotes */
+ if( bHonourStrings && *pszString == '"' )
+ {
+ if( bInString )
+ {
+ bInString = FALSE;
+ continue;
+ }
+ else
+ {
+ bInString = TRUE;
+ continue;
+ }
+ }
+
+ /* Within string constants we allow for escaped quotes, but
+ in processing them we will unescape the quotes */
+ if( bInString && pszString[0] == '\\' && pszString[1] == '"' )
+ {
+ pszString++;
+ }
+
+ /* Within string constants a \\ sequence reduces to \ */
+ else if( bInString
+ && pszString[0] == '\\' && pszString[1] == '\\' )
+ {
+ pszString++;
+ }
+
+ if( nTokenLen >= nTokenMax-1 )
+ {
+ nTokenMax = nTokenMax * 2 + 10;
+ pszToken = (char *) CPLRealloc( pszToken, nTokenMax );
+ }
+
+ pszToken[nTokenLen] = *pszString;
+ nTokenLen++;
+ }
+
+ pszToken[nTokenLen] = '\0';
+
+ if( pszToken[0] != '\0' || bAllowEmptyTokens )
+ {
+ papszRetList = CSLAddString( papszRetList, pszToken );
+ }
+ }
+
+ if( papszRetList == NULL )
+ papszRetList = (char **) CPLCalloc(sizeof(char *),1);
+
+ CPLFree( pszToken );
+
+ return papszRetList;
+}
+
+/* static buffer to store the last error message. We'll assume that error
+ * messages cannot be longer than 2000 chars... which is quite reasonable
+ * (that's 25 lines of 80 chars!!!)
+ */
+static char gszCPLLastErrMsg[2000] = "";
+static int gnCPLLastErrNo = 0;
+
+static void (*gpfnCPLErrorHandler)(CPLErr, int, const char *) = NULL;
+
+/**********************************************************************
+ * CPLError()
+ *
+ * This function records an error code and displays the error message
+ * to stderr.
+ *
+ * The error code can be accessed later using CPLGetLastErrNo()
+ **********************************************************************/
+void CPLError(CPLErr eErrClass, int err_no, const char *fmt, ...)
+{
+ va_list args;
+
+ /* Expand the error message
+ */
+ va_start(args, fmt);
+ vsprintf(gszCPLLastErrMsg, fmt, args);
+ va_end(args);
+
+ /* If the user provided his own error handling function, then call
+ * it, otherwise print the error to stderr and return.
+ */
+ gnCPLLastErrNo = err_no;
+
+ if (gpfnCPLErrorHandler != NULL)
+ {
+ gpfnCPLErrorHandler(eErrClass, err_no, gszCPLLastErrMsg);
+ }
+ else
+ {
+ fprintf(stderr, "ERROR %d: %s\n", gnCPLLastErrNo, gszCPLLastErrMsg);
+ }
+
+ if( eErrClass == CE_Fatal )
+ abort();
+}
+
+/**********************************************************************
+ * CPLErrorReset()
+ *
+ * Erase any traces of previous errors.
+ **********************************************************************/
+void CPLErrorReset()
+{
+ gnCPLLastErrNo = 0;
+ gszCPLLastErrMsg[0] = '\0';
+}
+
+
+/**********************************************************************
+ * CPLGetLastErrorNo()
+ *
+ **********************************************************************/
+int CPLGetLastErrorNo()
+{
+ return gnCPLLastErrNo;
+}
+
+/**********************************************************************
+ * CPLGetLastErrorMsg()
+ *
+ **********************************************************************/
+const char* CPLGetLastErrorMsg()
+{
+ return gszCPLLastErrMsg;
+}
+
+/**********************************************************************
+ * CPLSetErrorHandler()
+ *
+ * Allow the library's user to specify his own error handler function.
+ *
+ * A valid error handler is a C function with the following prototype:
+ *
+ * void MyErrorHandler(int errno, const char *msg)
+ *
+ * Pass NULL to come back to the default behavior.
+ **********************************************************************/
+
+void CPLSetErrorHandler(void (*pfnErrorHandler)(CPLErr, int, const char *))
+{
+ gpfnCPLErrorHandler = pfnErrorHandler;
+}
+
+/************************************************************************/
+/* _CPLAssert() */
+/* */
+/* This function is called only when an assertion fails. */
+/************************************************************************/
+
+void _CPLAssert( const char * pszExpression, const char * pszFile,
+ int iLine )
+
+{
+ CPLError( CE_Fatal, CPLE_AssertionFailed,
+ "Assertion `%s' failed\n"
+ "in file `%s', line %d\n",
+ pszExpression, pszFile, iLine );
+}
diff --git a/src/tiff/cpl_serv.h b/src/tiff/cpl_serv.h
new file mode 100644
index 0000000..6672056
--- /dev/null
+++ b/src/tiff/cpl_serv.h
@@ -0,0 +1,276 @@
+/******************************************************************************
+ * Copyright (c) 1998, Frank Warmerdam
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * cpl_serv.h
+ *
+ * This include file derived and simplified from the GDAL Common Portability
+ * Library.
+ */
+
+#ifndef CPL_SERV_H_INCLUDED
+#define CPL_SERV_H_INCLUDED
+
+/* ==================================================================== */
+/* Standard include files. */
+/* ==================================================================== */
+
+#include "geo_config.h"
+#include <stdio.h>
+
+#include <math.h>
+
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#if defined(HAVE_STRINGS_H) && !defined(HAVE_STRING_H)
+# include <strings.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+/**********************************************************************
+ * Do we want to build as a DLL on windows?
+ **********************************************************************/
+#if !defined(CPL_DLL)
+# if defined(_WIN32) && defined(BUILD_AS_DLL)
+# define CPL_DLL __declspec(dllexport)
+# else
+# define CPL_DLL
+# endif
+#endif
+
+/* ==================================================================== */
+/* Other standard services. */
+/* ==================================================================== */
+#ifdef __cplusplus
+# define CPL_C_START extern "C" {
+# define CPL_C_END }
+#else
+# define CPL_C_START
+# define CPL_C_END
+#endif
+
+#ifndef NULL
+# define NULL 0
+#endif
+
+#ifndef FALSE
+# define FALSE 0
+#endif
+
+#ifndef TRUE
+# define TRUE 1
+#endif
+
+#ifndef MAX
+# define MIN(a,b) ((a<b) ? a : b)
+# define MAX(a,b) ((a>b) ? a : b)
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef ABS
+# define ABS(x) ((x<0) ? (-1*(x)) : x)
+#endif
+
+#ifndef EQUAL
+#if defined(_WIN32) && !defined(__CYGWIN__)
+# define EQUALN(a,b,n) (strnicmp(a,b,n)==0)
+# define EQUAL(a,b) (stricmp(a,b)==0)
+#else
+# define EQUALN(a,b,n) (strncasecmp(a,b,n)==0)
+# define EQUAL(a,b) (strcasecmp(a,b)==0)
+#endif
+#endif
+
+/* ==================================================================== */
+/* VSI Services (just map directly onto Standard C services. */
+/* ==================================================================== */
+
+#define VSIFOpen fopen
+#define VSIFClose fclose
+#define VSIFEof feof
+#define VSIFPrintf fprintf
+#define VSIFPuts fputs
+#define VSIFPutc fputc
+#define VSIFGets fgets
+#define VSIRewind rewind
+#define VSIFSeek fseek
+#define VSIFTell ftell
+#define VSIFRead fread
+
+#ifndef notdef
+#define VSICalloc(x,y) _GTIFcalloc(x*y)
+#define VSIMalloc _GTIFcalloc
+#define VSIFree _GTIFFree
+#define VSIRealloc _GTIFrealloc
+#else
+#define VSICalloc(x,y) (((char *) _GTIFcalloc(x*y+4)) + 4)
+#define VSIMalloc(x) (((char *) _GTIFcalloc((x)+4)) + 4)
+#define VSIFree(x) _GTIFFree(((char *) (x)) - 4)
+#define VSIRealloc(p,n) (((char *) _GTIFrealloc(((char *)p)-4,(n)+4)) + 4)
+#endif
+
+/* -------------------------------------------------------------------- */
+/* Safe malloc() API. Thin cover over VSI functions with fatal */
+/* error reporting if memory allocation fails. */
+/* -------------------------------------------------------------------- */
+CPL_C_START
+
+#define CPLMalloc gtCPLMalloc
+#define CPLCalloc gtCPLCalloc
+#define CPLRealloc gtCPLRealloc
+#define CPLStrdup gtCPLStrdup
+
+void *CPLMalloc( int );
+void *CPLCalloc( int, int );
+void *CPLRealloc( void *, int );
+char *CPLStrdup( const char * );
+
+#define CPLFree(x) { if( x != NULL ) VSIFree(x); }
+
+/* -------------------------------------------------------------------- */
+/* Read a line from a text file, and strip of CR/LF. */
+/* -------------------------------------------------------------------- */
+
+#define CPLReadLine gtCPLReadLine
+
+const char *CPLReadLine( FILE * );
+
+/*=====================================================================
+ Error handling functions (cpl_error.c)
+ =====================================================================*/
+
+typedef enum
+{
+ CE_None = 0,
+ CE_Log = 1,
+ CE_Warning = 2,
+ CE_Failure = 3,
+ CE_Fatal = 4
+} CPLErr;
+
+#define CPLError gtCPLError
+#define CPLErrorReset gtCPLErrorReset
+#define CPLGetLastErrorNo gtCPLGetLastErrorNo
+#define CPLGetLastErrorMsg gtCPLGetLastErrorMsg
+#define CPLSetErrorHandler gtCPLSetErrorHandler
+#define _CPLAssert gt_CPLAssert
+
+void CPLError(CPLErr eErrClass, int err_no, const char *fmt, ...);
+void CPLErrorReset();
+int CPLGetLastErrorNo();
+const char * CPLGetLastErrorMsg();
+void CPLSetErrorHandler(void(*pfnErrorHandler)(CPLErr,int,
+ const char *));
+void _CPLAssert( const char *, const char *, int );
+
+#ifdef DEBUG
+# define CPLAssert(expr) ((expr) ? (void)(0) : _CPLAssert(#expr,__FILE__,__LINE__))
+#else
+# define CPLAssert(expr)
+#endif
+
+CPL_C_END
+
+/* ==================================================================== */
+/* Well known error codes. */
+/* ==================================================================== */
+
+#define CPLE_AppDefined 1
+#define CPLE_OutOfMemory 2
+#define CPLE_FileIO 3
+#define CPLE_OpenFailed 4
+#define CPLE_IllegalArg 5
+#define CPLE_NotSupported 6
+#define CPLE_AssertionFailed 7
+#define CPLE_NoWriteAccess 8
+
+/*=====================================================================
+ Stringlist functions (strlist.c)
+ =====================================================================*/
+CPL_C_START
+
+#define CSLAddString gtCSLAddString
+#define CSLCount gtCSLCount
+#define CSLGetField gtCSLGetField
+#define CSLDestroy gtCSLDestroy
+#define CSLDuplicate gtCSLDuplicate
+#define CSLTokenizeString gtCSLTokenizeString
+#define CSLTokenizeStringComplex gtCSLTokenizeStringComplex
+
+char **CSLAddString(char **papszStrList, const char *pszNewString);
+int CSLCount(char **papszStrList);
+const char *CSLGetField( char **, int );
+void CSLDestroy(char **papszStrList);
+char **CSLDuplicate(char **papszStrList);
+
+char **CSLTokenizeString(const char *pszString );
+char **CSLTokenizeStringComplex(const char *pszString,
+ const char *pszDelimiter,
+ int bHonourStrings, int bAllowEmptyTokens );
+
+/* ==================================================================== */
+/* .csv file related functions (from cpl_csv.c) */
+/* ==================================================================== */
+
+typedef enum {
+ CC_ExactString,
+ CC_ApproxString,
+ CC_Integer
+} CSVCompareCriteria;
+
+#define CSVFilename gtCSVFilename
+#define CSVReadParseLine gtCSVReadParseLine
+#define CSVScanLines gtCSVScanLines
+#define CSVScanFile gtCSVScanFile
+#define CSVScanFileByName gtCSVScanFileByName
+#define CSVGetFieldId gtCSVGetFieldId
+#define CSVDeaccess gtCSVDeaccess
+#define CSVGetField gtCSVGetField
+#define SetCSVFilenameHook gtSetCSVFilenameHook
+#define CSVGetFileFieldId gtCSVGetFileFieldId
+
+const char *CSVFilename( const char * );
+
+char **CSVReadParseLine( FILE * );
+char **CSVScanLines( FILE *, int, const char *, CSVCompareCriteria );
+char **CSVScanFile( const char *, int, const char *,
+ CSVCompareCriteria );
+char **CSVScanFileByName( const char *, const char *, const char *,
+ CSVCompareCriteria );
+int CSVGetFieldId( FILE *, const char * );
+int CSVGetFileFieldId( const char *, const char * );
+
+void CSVDeaccess( const char * );
+
+const char *CSVGetField( const char *, const char *, const char *,
+ CSVCompareCriteria, const char * );
+
+void CPL_DLL SetCSVFilenameHook( const char *(*)(const char *) );
+
+CPL_C_END
+
+#endif /* ndef CPL_SERV_H_INCLUDED */
diff --git a/src/tiff/csv/README b/src/tiff/csv/README
new file mode 100644
index 0000000..41e83fd
--- /dev/null
+++ b/src/tiff/csv/README
@@ -0,0 +1,38 @@
+ EPSG Tables
+ ===========
+
+The .csv files in this directory are an extract of tables from the EPSG
+projection database in CSV (comma separated value) format. These same
+files come with the source distribution in the libgeotiff/csv directory.
+Information and source to extract these tables from the EPSG database
+can be found in the source distribution libgeotiff/csv/odbc2csv directory.
+
+Detailed information on the EPSG database can be found at:
+
+ http://www.petroconsultants.com/products/geodetic.htm
+
+
+The tables containing the basic data are:
+
+ compd_cs: compound coordinate system data.
+ ellipsoid: ellipsoid data.
+ ellips_alias: ellipsoid alias data.
+ geod_datum: geodetic datum data.
+ gdatum_alias: geodetic datum alias data.
+ geod_trf: geodetic transformation data.
+ horiz_cs: geographic and projected coordinate system data (GCS/PCS codes)
+ p_meridian: prime meridian data.
+ trf_method: transformation method and parameter data.
+ trf_nonpolynomial: projection and 3- or 7-parameter geodetic
+ transformation parameter values.
+ trf_path: geodetic transformation path data.
+ uom_angle: angle unit data.
+ uom_an_alias: angle unit alias data: currently not populated.
+ uom_length: length unit data.
+ uom_le_alias: length unit alias data.
+ uom_scale: scale unit data.
+ uom_sc_alias: scale unit alias data: currently not populated.
+ vert_datum: vertical datum data.
+ vert_cs: vertical coordinate system data.
+ vert_offset: vertical coordinate system transformation data.
+
diff --git a/src/tiff/csv/alias.csv b/src/tiff/csv/alias.csv
new file mode 100644
index 0000000..8f581dd
--- /dev/null
+++ b/src/tiff/csv/alias.csv
@@ -0,0 +1,2001 @@
+"ALIAS CODE","OBJECT_TABLE_NAME","OBJECT_CODE","NAMING_SYSTEM_CODE","ALIAS","REMARKS"
+1,Coordinate_Operation,1274,7300,LKS94(ETRF89) to WGS 84 (1),
+4,Datum,6258,7300,ETRF89,
+5,Ellipsoid,7013,7300,Modified Clarke 1880 (South Africa),The Clarke 1880 (Arc) figure is one of several modifications to the original definition. The name Clarke Modified is usually taken to be the RGS modification. But in southern Africa it is usually taken to be the Arc or Cape modification.
+6,Coordinate_Operation,8570,7300,ED50 to EUREF89 (2),
+7,Unit of Measure,9001,7300,meter,
+8,Unit of Measure,9036,7300,kilometer,Spelling used in US
+9,Coordinate Reference System,21100,7300,Genuk / NEIEZ,
+10,Coordinate_Operation,1036,7301,OSTN97,
+11,Coordinate_Operation,1123,7301,Genuk to WGS 84 (1),
+12,Coordinate_Operation,1149,7301,ETRF89 to WGS 84 (1),
+13,Coordinate_Operation,1273,7301,HD72 to ETRF89 (1),
+14,Coordinate_Operation,1309,7301,DHDN to ETRF89 (1),
+15,Coordinate_Operation,1310,7301,Pulkovo 1942 to ETRF89 (1),
+16,Coordinate_Operation,1311,7301,ED50 to WGS 84 (18),
+17,Coordinate_Operation,1331,7301,EST92 to ETRF89 (1),
+19,Coordinate_Operation,1513,7301,Final Datum 1958 to WGS 84 (1),
+20,Coordinate_Operation,1571,7301,Amersfoort to ETRF89 (1),
+21,Coordinate_Operation,1584,7301,Levant to WGS 72BE (1),
+22,Coordinate_Operation,1585,7301,Levant to WGS 84 (2),
+23,Coordinate_Operation,1586,7301,Levant to WGS 84 (3),
+24,Coordinate_Operation,1587,7301,Levant to WGS 84 (4),
+26,Coordinate_Operation,1589,7301,ED50 to ETRF89 (3),
+28,Coordinate_Operation,1611,7301,IRENET95 to ETRF89 (1),
+29,Coordinate Reference System,2140,7301,NAD83(CSRS98) / SCoPQ zone 3,
+30,Coordinate Reference System,2141,7301,NAD83(CSRS98) / SCoPQ zone 4,
+31,Coordinate Reference System,2142,7301,NAD83(CSRS98) / SCoPQ zone 5,
+32,Coordinate Reference System,2143,7301,NAD83(CSRS98) / SCoPQ zone 6,
+33,Coordinate Reference System,2144,7301,NAD83(CSRS98) / SCoPQ zone 7,
+34,Coordinate Reference System,2145,7301,NAD83(CSRS98) / SCoPQ zone 8,
+35,Coordinate Reference System,2146,7301,NAD83(CSRS98) / SCoPQ zone 9,
+36,Coordinate Reference System,2147,7301,NAD83(CSRS98) / SCoPQ zone 10,
+37,Coordinate Reference System,2159,7301,Sierra Leone 1924 / Peninsular Grid,
+38,Coordinate Reference System,2291,7301,NAD83 / PEI Stereo,
+39,Coordinate Reference System,3200,7301,Final Datum 1958 / Iraq zone,
+40,Coordinate Reference System,4132,7301,Final Datum 1958 (Iran),
+41,Coordinate Reference System,4140,7301,NAD83(CSRS),
+42,Coordinate Reference System,4172,7301,National Geodetic System [Argentina],see http://www.igm.gov.ar/posgar.html
+43,Coordinate Reference System,4211,7301,Genuk,
+44,Datum,4218,7301,Bogota,
+45,Coordinate Reference System,4227,7301,Levant,
+46,Coordinate Reference System,4258,7301,ETRF89,
+47,Coordinate Reference System,4272,7301,GD49,
+48,Coordinate Reference System,4813,7301,Genuk (Jakarta),
+49,Datum,5104,7301,Huang Hai 1956,
+50,Datum,6120,7301,Old Greek,"Adjective ""Old"" applied since introduction of GGRS87 (code 6121)"
+51,Datum,6125,7301,Samboja P2 exc T9,
+52,Datum,6160,7301,Quini-Huao,
+53,Datum,6174,7301,Sierra Leone Peninsular 1924,
+54,Datum,6211,7301,Genuk,
+55,Datum,6218,7301,Bogota,
+56,Datum,6222,7301,South Africa,
+57,Datum,6227,7301,Levant,
+58,Datum,6258,7301,European Terrestrial Reference Frame 1989,
+59,Datum,6269,7301,NAD83 (1986),
+60,Datum,6272,7301,GD49,
+61,Datum,6308,7301,Rikets koordinatsystem 1938,
+62,Ellipsoid,7012,7301,Clarke Modified 1880,The Clarke 1880 (RGS) figure is one of several modifications to the original definition. The name Clarke Modified is usually taken to be the RGS modification.
+63,Ellipsoid,7013,7301,Clarke 1880 (Cape),
+64,Ellipsoid,7019,7301,International 1979,Adopted by IUGG 1979 Canberra as the Geodetic Reference Spheroid of 1980 (GRS 1980).
+65,Ellipsoid,7022,7301,Hayford 1909,Described as a=6378388 m. and b=6356909 m. from which 1/f derived to be 296.95926... The figure was adopted as the International ellipsoid in 1924 but with 1/f taken as 297 exactly from which b is derved as 6356911.946 m.
+66,Ellipsoid,7029,7301,McCaw 1924,
+67,Ellipsoid,7030,7301,WGS84,
+68,Ellipsoid,7036,7301,International 1967,More usually known as GRS 1967 to avoid confusion with the International 1924 figure.
+69,Ellipsoid,7043,7301,NWL 10D,Used by Transit Broadcast Ephemeris before 1989. Also referred to as WGS72 spheroid.
+70,Coordinate_Operation,8568,7301,Levant to WGS 84 (1),
+71,Coordinate_Operation,8570,7301,ED50 to ETRF89 (2),
+72,Coordinate_Operation Parameter,8602,7301,Longitude rotation,
+73,Prime Meridian,8913,7301,Kristiania,
+74,Unit of Measure,9001,7301,International metre,
+75,Unit of Measure,9002,7301,international foot,
+76,Unit of Measure,9003,7301,American foot,
+77,Unit of Measure,9005,7301,South African geodetic foot,Not to be confused with the Cape foot.
+78,Unit of Measure,9030,7301,International nautical mile,
+79,Unit of Measure,9039,7301,link (Clarke's ratio),
+80,Unit of Measure,9040,7301,yard,
+81,Unit of Measure,9041,7301,foot,
+82,Unit of Measure,9042,7301,chain,
+83,Unit of Measure,9043,7301,link,
+84,Unit of Measure,9050,7301,yard,
+85,Unit of Measure,9051,7301,foot,
+86,Unit of Measure,9052,7301,chain,
+87,Unit of Measure,9053,7301,link,
+88,Unit of Measure,9060,7301,yard,
+89,Unit of Measure,9061,7301,foot,
+90,Unit of Measure,9062,7301,chain,
+91,Unit of Measure,9063,7301,link,
+92,Unit of Measure,9070,7301,foot,
+93,Unit of Measure,9080,7301,Indian geodetic foot,
+94,Unit of Measure,9081,7301,Indian geodetic foot,
+95,Unit of Measure,9084,7301,yard,= 3 Indian feet.
+96,Unit of Measure,9085,7301,yard,= 3 Indian feet.
+97,Unit of Measure,9094,7301,foot,
+98,Unit of Measure,9114,7301,mil,"Alias also applies to other variations of a mil, especially mil_6300 and mil_6000."
+100,Coordinate_Operation,17001,7301,Ghana TM,
+101,Coordinate_Operation,17901,7301,Mount Eden Circuit 1949,
+102,Coordinate_Operation,17902,7301,Bay of Plenty Circuit 1949,
+103,Coordinate_Operation,17903,7301,Poverty Bay Circuit 1949,
+104,Coordinate_Operation,17904,7301,Hawkes Bay Circuit 1949,
+105,Coordinate_Operation,17905,7301,Taranaki Circuit 1949,
+106,Coordinate_Operation,17906,7301,Tuhirangi Circuit 1949,
+107,Coordinate_Operation,17907,7301,Wanganui Circuit 1949,
+108,Coordinate_Operation,17908,7301,Wairarapa Circuit 1949,
+109,Coordinate_Operation,17909,7301,Wellington Circuit 1949,
+110,Coordinate_Operation,17910,7301,Collingwood Circuit 1949,
+111,Coordinate_Operation,17911,7301,Nelson Circuit 1949,
+112,Coordinate_Operation,17912,7301,Karamea Circuit 1949,
+113,Coordinate_Operation,17913,7301,Buller Circuit 1949,
+114,Coordinate_Operation,17914,7301,Grey Circuit 1949,
+115,Coordinate_Operation,17915,7301,Amuri Circuit 1949,
+116,Coordinate_Operation,17916,7301,Marlborough Circuit 1949,
+117,Coordinate_Operation,17917,7301,Hokitika Circuit 1949,
+118,Coordinate_Operation,17918,7301,Okarito Circuit 1949,
+119,Coordinate_Operation,17919,7301,Jacksons Bay Circuit 1949,
+120,Coordinate_Operation,17920,7301,Mount Pleasant Circuit 1949,
+121,Coordinate_Operation,17921,7301,Gawler Circuit 1949,
+122,Coordinate_Operation,17922,7301,Timaru Circuit 1949,
+123,Coordinate_Operation,17923,7301,Lindis Peak Circuit 1949,
+124,Coordinate_Operation,17924,7301,Mount Nicholas Circuit 1949,
+125,Coordinate_Operation,17925,7301,Mount York Circuit 1949,
+126,Coordinate_Operation,17926,7301,Observation Point Circuit 1949,
+127,Coordinate_Operation,17927,7301,North Taieri Circuit 1949,
+128,Coordinate_Operation,17928,7301,Bluff Circuit 1949,
+129,Coordinate_Operation,19906,7301,IOEPC Lambert,Sometimes seen defined with 2 standard parallels.
+130,Coordinate_Operation,19959,7301,Gold Coast Grid,
+131,Coordinate_Operation,19963,7301,Sierra Leone Peninsula Grid,
+132,Coordinate Reference System,21100,7301,Genuk (Jakarta) / NEIEZ,
+133,Coordinate Reference System,21148,7301,Genuk / UTM zone 48S,
+134,Coordinate Reference System,21150,7301,Genuk / UTM zone 50S,
+135,Coordinate Reference System,22700,7301,Levant / Levant Zone,
+136,Coordinate Reference System,22770,7301,Levant / Syria Lambert,
+137,Coordinate Reference System,22780,7301,Levant / Levant Stereographic,
+138,Coordinate Reference System,25828,7301,ETRF89 / UTM zone 28N,
+139,Coordinate Reference System,25829,7301,ETRF89 / UTM zone 29N,
+140,Coordinate Reference System,25830,7301,ETRF89 / UTM zone 30N,
+141,Coordinate Reference System,25831,7301,ETRF89 / UTM zone 31N,
+142,Coordinate Reference System,25832,7301,ETRF89 / UTM zone 32N,
+143,Coordinate Reference System,25833,7301,ETRF89 / UTM zone 33N,
+144,Coordinate Reference System,25834,7301,ETRF89 / UTM zone 34N,
+145,Coordinate Reference System,25835,7301,ETRF89 / UTM zone 35N,
+146,Coordinate Reference System,25836,7301,ETRF89 / UTM zone 36N,
+147,Coordinate Reference System,25837,7301,ETRF89 / UTM zone 37N,
+148,Coordinate Reference System,25838,7301,ETRF89 / UTM zone 38N,
+149,Coordinate Reference System,25884,7301,ETRF89 / TM Baltic93,
+150,Coordinate Reference System,27258,7301,GD49 / UTM zone 58,
+151,Coordinate Reference System,27259,7301,GD49 / UTM zone 59,
+152,Coordinate Reference System,27260,7301,GD49 / UTM zone 60,
+153,Coordinate Reference System,27291,7301,GD49 / North Island Grid,
+154,Coordinate Reference System,27292,7301,GD49 / South Island Grid,
+155,Coordinate Reference System,30592,7301,Nord Sahara 1959/Voirol Unifie S Algerie,
+156,Coordinate Reference System,30791,7301,Nord Sahara 1959 / Lambert Nord Voirol Unifie 1960,Voirol Unifie 1960 is NOT a geodetic datum nor GeogCRS. It is two Lambert projected coordinate reference systems based on Nord Sahara 1959 Datum. See also code 30792.
+157,Coordinate Reference System,30792,7301,Nord Sahara 1959 / Lambert Sud Voirol Unifie 1960,Voirol Unifie 1960 is NOT a geodetic datum nor GeogCRS. It is two Lambert projected coordinate reference systems based on Nord Sahara 1959 Datum. See also code 30791.
+158,Coordinate Reference System,31170,7301,Zanderij / Surinam Old TM,Old country name spelling.
+159,Coordinate Reference System,31171,7301,Zanderij / Surinam TM,Old spelling for country name.
+160,Coordinate Reference System,31300,7301,Belge Lambert 72,
+161,Coordinate_Operation,1026,7302,Madrid to ED50 (1),
+162,Coordinate_Operation,1027,7302,Madrid to ED50 (2),
+163,Coordinate_Operation,1028,7302,Madrid to ED50 (3),
+164,Coordinate_Operation,1029,7302,RD New to ED50/UTM31 (1),
+165,Coordinate_Operation,1030,7302,ED50/UTM31 to RD New (1),
+166,Coordinate_Operation,1031,7302,RD New to ED50/UTM31 (2),
+167,Coordinate_Operation,1032,7302,ED50/UTM31 to RD New (2),
+168,Coordinate_Operation,1274,7302,CS42 to LKS94 (1),
+169,Coordinate_Operation,1283,7302,LKS94 to WGS 84 (1),
+170,Coordinate Reference System,2000,7302,Anguilla 1957 / BWI Grid,
+171,Coordinate Reference System,2001,7302,Antigua 1943 / BWI Grid,
+172,Coordinate Reference System,2002,7302,Dominica 1945 / BWI Grid,
+173,Coordinate Reference System,2003,7302,Grenada 1953 / BWI Grid,
+174,Coordinate Reference System,2004,7302,Montserrat 58 / BWI Grid,
+175,Coordinate Reference System,2005,7302,St Kitts 1955 / BWI Grid,
+176,Coordinate Reference System,2006,7302,St Lucia 1955 / BWI Grid,
+177,Coordinate Reference System,2007,7302,St Vincent 45 / BWI Grid,
+178,Coordinate Reference System,2008,7302,CGQ77 / SCoPQ zone 2,
+179,Coordinate Reference System,2009,7302,CGQ77 / SCoPQ zone 3,
+180,Coordinate Reference System,2010,7302,CGQ77 / SCoPQ zone 4,
+181,Coordinate Reference System,2011,7302,CGQ77 / SCoPQ zone 5,
+182,Coordinate Reference System,2012,7302,CGQ77 / SCoPQ zone 6,
+183,Coordinate Reference System,2013,7302,CGQ77 / SCoPQ zone 7,
+184,Coordinate Reference System,2014,7302,CGQ77 / SCoPQ zone 8,
+185,Coordinate Reference System,2015,7302,CGQ77 / SCoPQ zone 9,
+186,Coordinate Reference System,2016,7302,CGQ77 / SCoPQ zone 10,
+187,Coordinate Reference System,2036,7302,NAD83(CSRS) / NB Stereo,
+188,Coordinate Reference System,2037,7302,NAD83(CSRS) / UTM 19N,
+189,Coordinate Reference System,2038,7302,NAD83(CSRS) / UTM 20N,
+190,Coordinate Reference System,2039,7302,Israeli TM Grid,
+191,Coordinate Reference System,2040,7302,Locodjo 65 / UTM 30N,
+192,Coordinate Reference System,2041,7302,Abidjan 87 / UTM 30N,
+193,Coordinate Reference System,2042,7302,Locodjo 65 / UTM 29N,
+194,Coordinate Reference System,2043,7302,Abidjan 87 / UTM 29N,
+195,Coordinate Reference System,2044,7302,Hanoi 72 / Gauss zone 18,
+196,Coordinate Reference System,2045,7302,Hanoi 72 / Gauss zone 19,
+197,Coordinate Reference System,2046,7302,New S African CS zone 15,
+198,Coordinate Reference System,2047,7302,New S African CS zone 17,
+199,Coordinate Reference System,2048,7302,New S African CS zone 19,
+200,Coordinate Reference System,2049,7302,New S African CS zone 21,
+201,Coordinate Reference System,2050,7302,New S African CS zone 23,
+202,Coordinate Reference System,2051,7302,New S African CS zone 25,
+203,Coordinate Reference System,2052,7302,New S African CS zone 27,
+204,Coordinate Reference System,2053,7302,New S African CS zone 29,
+205,Coordinate Reference System,2054,7302,New S African CS zone 31,
+206,Coordinate Reference System,2055,7302,New S African CS zone 33,
+207,Coordinate Reference System,2056,7302,LV95,
+208,Coordinate Reference System,2066,7302,Mount Dillon / Tobago,
+209,Coordinate Reference System,2067,7302,Naparima 1955 / UTM 20N,
+210,Coordinate Reference System,2081,7302,Chos Malal / Argentina 2,
+211,Coordinate Reference System,2082,7302,Pampa d Castillo / Arg 2,
+212,Coordinate Reference System,2083,7302,Hito XVIII / Argentina 2,
+213,Coordinate Reference System,2084,7302,Hito XVIII / UTM 19S,
+214,Coordinate Reference System,2089,7302,Yemen NGN96 / UTM 38N,
+215,Coordinate Reference System,2090,7302,Yemen NGN96 / UTM 39N,
+216,Coordinate Reference System,2091,7302,S Yemen / Gauss zone 8,
+217,Coordinate Reference System,2092,7302,S Yemen / Gauss zone 9,
+218,Coordinate Reference System,2096,7302,Korean 1985 / East Belt,
+219,Coordinate Reference System,2097,7302,Korean 1985 / Cen. Belt,
+220,Coordinate Reference System,2098,7302,Korean 1985 / West Belt,
+221,Coordinate Reference System,2099,7302,Qatar Plane CS,
+222,Coordinate Reference System,2136,7301,Accra / Gold Coast Grid,
+223,Coordinate Reference System,2137,7301,Accra / Ghana TM,
+224,Coordinate Reference System,2157,7302,IRENET95 / ITM,
+225,Coordinate Reference System,2200,7302,ATS77 / NB Stereographic,
+226,Coordinate Reference System,2290,7302,ATS77 / PEI Stereo,
+227,Coordinate Reference System,2291,7302,NAD83(CSRS) / PEI Stereo,
+228,Coordinate Reference System,2294,7302,ATS77 / MTM NS zone 4,
+229,Coordinate Reference System,2295,7302,ATS77 / MTM NS zone 5,
+230,Coordinate Reference System,2393,7302,KKJ / Finland zone 3,
+231,Coordinate Reference System,2600,7302,LKS94,
+232,Coordinate Reference System,3561,7302,Old Hawaiian / SP zone 1,
+233,Coordinate Reference System,3562,7302,Old Hawaiian / SP zone 2,
+234,Coordinate Reference System,3563,7302,Old Hawaiian / SP zone 3,
+235,Coordinate Reference System,3564,7302,Old Hawaiian / SP zone 4,
+236,Coordinate Reference System,3565,7302,Old Hawaiian / SP zone 5,
+237,Coordinate Reference System,3991,7302,Puerto Rico SPCS 27,
+238,Coordinate Reference System,4134,7302,PSD93,
+239,Coordinate Reference System,4215,7302,BD 50,
+240,Coordinate Reference System,4268,7302,NAD Michigan,
+241,Coordinate Reference System,4313,7302,BD 72,
+242,Coordinate Reference System,4609,7302,CGQ77,
+243,Coordinate Reference System,4809,7302,BD 50 (Brussels),
+244,Datum,5100,7302,msl,
+245,Datum,5101,7302,ODN,
+246,Datum,5102,7302,NGVD29,
+247,Datum,5103,7302,NAVD88,
+248,Datum,5104,7302,Yellow Sea,
+249,Datum,5105,7302,Baltic,
+250,Datum,5106,7302,Caspian,
+251,Datum,5107,7302,NGF,
+252,Datum,5109,7302,NAP,
+253,Datum,5111,7302,AHD,
+254,Datum,5112,7302,AHD (Tasmania),
+255,Datum,5114,7302,CVD28,
+256,Datum,5115,7302,Piraeus86,
+257,Datum,5116,7302,N60,
+258,Datum,5117,7302,RH70,
+259,Datum,5118,7302,NGF - Lallemand,
+260,Datum,5119,7302,NGF - IGN69,
+261,Datum,5120,7302,NGF - IGN78,
+262,Datum,5122,7302,JapanVD,
+263,Datum,5123,7302,PHD93,
+264,Datum,5127,7302,LN02,
+265,Datum,5128,7302,LHN95,
+266,Datum,5129,7302,EVRF2000,
+267,Coordinate Reference System,5701,7302,ODN,
+268,Coordinate Reference System,5702,7302,NGVD29,
+269,Coordinate Reference System,5703,7302,NAVD88,
+270,Coordinate Reference System,5709,7302,NAP,
+271,Coordinate Reference System,5711,7302,AHD,
+272,Coordinate Reference System,5712,7302,AHD (Tasmania),
+273,Coordinate Reference System,5713,7302,CVD28,
+274,Coordinate Reference System,5714,7302,msl height,
+275,Coordinate Reference System,5715,7302,msl depth,
+276,Coordinate Reference System,5723,7302,Japan Levelling Datum,
+277,Coordinate Reference System,5724,7302,PHD93,
+278,Coordinate Reference System,5728,7302,LN02,
+279,Coordinate Reference System,5729,7302,LHN95,
+280,Coordinate Reference System,5730,7302,EVRS2000,
+281,Datum,6121,7302,GGRS87,
+282,Datum,6122,7302,ATS77,
+283,Datum,6123,7302,KKJ,
+284,Datum,6124,7302,RT90,
+285,Datum,6126,7302,LKS94 (ETRS89),
+286,Datum,6130,7302,Moznet,
+287,Datum,6132,7302,FD58,
+288,Datum,6133,7302,EST92,
+289,Datum,6134,7302,PSD93,
+290,Datum,6140,7302,NAD83(CSRS98),
+291,Datum,6151,7302,CHTRF95,
+292,Datum,6152,7302,NAD83(HARN),
+293,Datum,6154,7302,ED50(ED77),
+294,Datum,6156,7302,S-JTSK,
+295,Datum,6159,7302,ELD79,
+296,Datum,6163,7302,YNGN96,
+297,Datum,6170,7302,SIRGAS,
+298,Datum,6171,7302,RGF93,
+299,Datum,6172,7302,POSGAR,
+300,Datum,6202,7302,AGD66,
+301,Datum,6203,7302,AGD84,
+302,Datum,6204,7302,Ain el Abd,
+303,Datum,6215,7302,Belge 1950,
+304,Datum,6230,7302,ED50,
+305,Datum,6231,7302,ED87,
+306,Datum,6237,7302,HD72,
+307,Datum,6238,7302,ID74,
+308,Datum,6242,7302,JAD69,
+309,Datum,6246,7302,KOC,
+310,Datum,6248,7302,PSAD56,
+311,Datum,6258,7302,ETRS89,
+312,Datum,6267,7302,NAD27,
+313,Datum,6269,7302,NAD83,
+314,Datum,6272,7302,NZGD49,
+315,Datum,6275,7302,NTF,
+316,Datum,6278,7302,OSGB70,
+317,Datum,6279,7302,OS(SN)80,
+318,Datum,6280,7302,Padang,
+319,Datum,6283,7302,GDA94,
+320,Datum,6291,7302,SAD69,
+321,Datum,6297,7302,Tananarive,
+322,Datum,6303,7302,TC(1948),
+323,Datum,6305,7302,Voirol Unifie,
+324,Datum,6308,7302,RT38,
+325,Datum,6312,7302,MGI,
+326,Datum,6313,7302,Belge 1972,
+327,Datum,6314,7302,DHDN,
+328,Datum,6318,7302,NGN,
+329,Datum,6319,7302,KUDAMS,
+330,Datum,6322,7302,WGS 72,
+331,Datum,6324,7302,WGS 72BE,
+332,Datum,6326,7302,WGS 84,
+333,Datum,6608,7302,NAD27(76),
+334,Datum,6609,7302,CGQ77,
+335,Datum,6901,7302,ATF (Paris),
+336,Datum,6902,7302,NDG (Paris),
+337,Ellipsoid,7003,7302,ANS,
+338,Coordinate Reference System,7401,7302,NTF / France II + Lalle,
+339,Coordinate Reference System,7402,7302,NTF / France II + IGN69,
+340,Coordinate Reference System,7403,7302,NTF / France III + IGN69,
+341,Coordinate Reference System,7405,7302,GB National Grid + ODN,
+342,Coordinate Reference System,7407,7302,NAD27 / TX_N + NGVD29,
+343,Coordinate_Operation Parameter,8663,7302,k,
+344,Unit of Measure,9001,7302,m,
+345,Unit of Measure,9002,7302,ft,
+346,Unit of Measure,9003,7302,ftUS,
+347,Unit of Measure,9005,7302,ftCla,
+348,Unit of Measure,9014,7302,f,
+349,Unit of Measure,9030,7302,NM,
+350,Unit of Measure,9031,7302,GLM,
+351,Unit of Measure,9033,7302,chUS,
+352,Unit of Measure,9034,7302,lkUS,
+353,Unit of Measure,9035,7302,miUS,
+354,Unit of Measure,9036,7302,km,
+355,Unit of Measure,9037,7302,ydCla,
+356,Unit of Measure,9038,7302,chCla,
+357,Unit of Measure,9039,7302,lkCla,
+358,Unit of Measure,9040,7302,ydSe,
+359,Unit of Measure,9041,7302,ftSe,
+360,Unit of Measure,9042,7302,chSe,
+361,Unit of Measure,9043,7302,lkSe,
+362,Unit of Measure,9050,7302,ydBnA,
+363,Unit of Measure,9051,7302,ftBnA,
+364,Unit of Measure,9052,7302,chBnA,
+365,Unit of Measure,9053,7302,lkBnA,
+366,Unit of Measure,9060,7302,ydBnB,
+367,Unit of Measure,9061,7302,ftBnB,
+368,Unit of Measure,9062,7302,chBnB,
+369,Unit of Measure,9063,7302,lkBnB,
+370,Unit of Measure,9070,7302,ftBr(65),
+371,Unit of Measure,9080,7302,ftInd,
+372,Unit of Measure,9081,7302,ftInd(37),
+373,Unit of Measure,9082,7302,ftInd(62),
+374,Unit of Measure,9083,7302,ftInd(75),
+375,Unit of Measure,9084,7302,ydInd,
+376,Unit of Measure,9085,7302,ydInd(37),
+377,Unit of Measure,9086,7302,ydInd(62),
+378,Unit of Measure,9087,7302,ydInd(75),
+379,Unit of Measure,9093,7302,mi,
+380,Unit of Measure,9094,7302,ftGC,
+381,Unit of Measure,9101,7302,rad,
+382,Unit of Measure,9102,7302,deg,
+383,Unit of Measure,9103,7302,min,
+384,Unit of Measure,9104,7302,sec,
+385,Unit of Measure,9105,7302,gr,
+386,Unit of Measure,9106,7302,g,
+387,Unit of Measure,9107,7302,DMS,
+388,Unit of Measure,9108,7302,DMSH,
+389,Unit of Measure,9109,7302,�rad,
+390,Unit of Measure,9110,7302,DDD.MMSSsss,
+391,Unit of Measure,9111,7302,DDD.MMm,
+392,Unit of Measure,9112,7302,c,
+393,Unit of Measure,9113,7302,cc,
+394,Unit of Measure,9114,7302,mil,
+395,Unit of Measure,9202,7302,ppm,
+396,Unit of Measure,9204,7302,Bin330ftUS,
+397,Unit of Measure,9205,7302,Bin165ftUS,
+398,Unit of Measure,9206,7302,Bin82.5ftUS,
+399,Unit of Measure,9207,7302,Bin37.5m,
+400,Unit of Measure,9208,7302,Bin25m,
+401,Unit of Measure,9209,7302,Bin12.5m,
+402,Unit of Measure,9210,7302,Bin6.25m,
+403,Unit of Measure,9211,7302,Bin3.125m,
+404,Coordinate_Operation Method,9633,7302,OSTN,
+405,Coordinate_Operation Method,9824,7302,UTM,
+406,Coordinate_Operation,10101,7302,Alabama East,
+407,Coordinate_Operation,10102,7302,Alabama West,
+408,Coordinate_Operation,10131,7302,Alabama East,
+409,Coordinate_Operation,10132,7302,Alabama West,
+410,Coordinate_Operation,10201,7302,Arizona East,
+411,Coordinate_Operation,10202,7302,Arizona Central,
+412,Coordinate_Operation,10203,7302,Arizona West,
+413,Coordinate_Operation,10231,7302,Arizona East,
+414,Coordinate_Operation,10232,7302,Arizona Central,
+415,Coordinate_Operation,10233,7302,Arizona West,
+416,Coordinate_Operation,10301,7302,Arkansas North,
+417,Coordinate_Operation,10302,7302,Arkansas South,
+418,Coordinate_Operation Method,9809,7301,Roussilhe,
+419,Coordinate_Operation,10331,7302,Arkansas North,
+420,Coordinate_Operation,10332,7302,Arkansas South,
+421,Coordinate_Operation,10401,7302,California zone I,
+422,Coordinate_Operation,10402,7302,California zone II,
+423,Coordinate_Operation,10403,7302,California zone III,
+424,Coordinate_Operation,10404,7302,California zone IV,
+425,Coordinate_Operation,10405,7302,California zone V,
+426,Coordinate_Operation,10406,7302,California zone VI,
+427,Coordinate_Operation,10407,7302,California zone VII,
+428,Coordinate_Operation,10431,7302,California zone 1,
+429,Coordinate_Operation,10432,7302,California zone 2,
+430,Coordinate_Operation,10433,7302,California zone 3,
+431,Coordinate_Operation,10434,7302,California zone 4,
+432,Coordinate_Operation,10435,7302,California zone 5,
+433,Coordinate_Operation,10436,7302,California zone 6,
+434,Coordinate_Operation,10501,7302,Colorado North,
+435,Coordinate_Operation,10503,7302,Colorado South,
+436,Coordinate_Operation,10531,7302,Colorado North,
+437,Coordinate_Operation,10533,7302,Colorado South,
+438,Coordinate_Operation,10600,7302,Connecticut,
+439,Coordinate_Operation,10630,7302,Connecticut,
+440,Coordinate_Operation,10700,7302,Delaware,
+441,Coordinate_Operation,10730,7302,Delaware,
+442,Coordinate_Operation,10901,7302,Florida East,
+443,Coordinate_Operation,10902,7302,Florida West,
+444,Coordinate_Operation,10903,7302,Florida North,
+445,Coordinate_Operation,10931,7302,Florida East,
+446,Coordinate_Operation,10932,7302,Florida West,
+447,Coordinate_Operation,10933,7302,Florida North,
+448,Coordinate_Operation,11001,7302,Georgia East,
+449,Coordinate_Operation,11002,7302,Georgia West,
+450,Coordinate_Operation,11031,7302,Georgia East,
+451,Coordinate_Operation,11032,7302,Georgia West,
+452,Coordinate_Operation,11101,7302,Idaho East,
+453,Coordinate_Operation,11102,7302,Idaho Central,
+454,Coordinate_Operation,11103,7302,Idaho West,
+455,Coordinate_Operation,11131,7302,Idaho East,
+456,Coordinate_Operation,11132,7302,Idaho Central,
+457,Coordinate_Operation,11133,7302,Idaho West,
+458,Coordinate_Operation,11201,7302,Illinois East,
+459,Coordinate_Operation,11202,7302,Illinois West,
+460,Coordinate_Operation,11231,7302,Illinois East,
+461,Coordinate_Operation,11232,7302,Illinois West,
+462,Coordinate_Operation,11301,7302,Indiana East,
+463,Coordinate_Operation,11302,7302,Indiana West,
+464,Coordinate_Operation,11331,7302,Indiana East,
+465,Coordinate_Operation,11332,7302,Indiana West,
+466,Coordinate_Operation,11401,7302,Iowa North,
+467,Coordinate_Operation,11402,7302,Iowa South,
+468,Coordinate_Operation,11431,7302,Iowa North,
+469,Coordinate_Operation,11432,7302,Iowa South,
+470,Coordinate_Operation,11501,7302,Kansas North,
+471,Coordinate_Operation,11502,7302,Kansas South,
+472,Coordinate_Operation,11531,7302,Kansas North,
+473,Coordinate_Operation,11532,7302,Kansas South,
+474,Coordinate_Operation,11601,7302,Kentucky North,
+475,Coordinate_Operation,11602,7302,Kentucky South,
+476,Coordinate_Operation,11631,7302,Kentucky North,
+477,Coordinate_Operation,11632,7302,Kentucky South,
+478,Coordinate_Operation,11701,7302,Louisiana North,
+479,Coordinate_Operation,11702,7302,Louisiana South,
+480,Coordinate_Operation,11731,7302,Louisiana North,
+481,Coordinate_Operation,11732,7302,Louisiana South,
+482,Coordinate_Operation,11801,7302,Maine East,
+483,Coordinate_Operation,11802,7302,Maine West,
+484,Coordinate_Operation,11831,7302,Maine East,
+485,Coordinate_Operation,11832,7302,Maine West,
+486,Coordinate_Operation,11900,7302,Maryland,
+487,Coordinate_Operation,11930,7302,Maryland,
+488,Coordinate_Operation,12001,7302,Massachusetts Mainland,
+489,Coordinate_Operation,12002,7302,Massachusetts Island,
+490,Coordinate_Operation,12031,7302,Massachusetts Mainland,
+491,Coordinate_Operation,12032,7302,Massachusetts Island,
+492,Coordinate_Operation,12101,7302,Michigan East,
+493,Coordinate_Operation,12102,7302,Michigan Old Central,
+494,Coordinate_Operation,12111,7302,Michigan North,
+495,Coordinate_Operation,12112,7302,Michigan Central,
+496,Coordinate_Operation,12113,7302,Michigan South,
+497,Coordinate_Operation,12141,7302,Michigan North,
+498,Coordinate_Operation,12142,7302,Michigan Central,
+499,Coordinate_Operation,12143,7302,Michigan South,
+500,Coordinate_Operation,12201,7302,Minnesota North,
+501,Coordinate_Operation,12202,7302,Minnesota Central,
+502,Coordinate_Operation,12203,7302,Minnesota South,
+503,Coordinate_Operation,12231,7302,Minnesota North,
+504,Coordinate_Operation,12232,7302,Minnesota Central,
+505,Coordinate_Operation,12233,7302,Minnesota South,
+506,Coordinate_Operation,12301,7302,Mississippi East,
+507,Coordinate_Operation,12302,7302,Mississippi West,
+508,Coordinate_Operation,12331,7302,Mississippi East,
+509,Coordinate_Operation,12332,7302,Mississippi West,
+510,Coordinate_Operation,12401,7302,Missouri East,
+511,Coordinate_Operation,12402,7302,Missouri Central,
+512,Coordinate_Operation,12403,7302,Missouri West,
+513,Coordinate_Operation,12431,7302,Missouri East,
+514,Coordinate_Operation,12432,7302,Missouri Central,
+515,Coordinate_Operation,12433,7302,Missouri West,
+516,Coordinate_Operation,12501,7302,Montana North,
+517,Coordinate_Operation,12502,7302,Montana Central,
+518,Coordinate_Operation,12503,7302,Montana South,
+519,Coordinate_Operation,12530,7302,Montana,
+520,Coordinate_Operation,12601,7302,Nebraska North,
+521,Coordinate_Operation,12602,7302,Nebraska South,
+522,Coordinate_Operation,12630,7302,Nebraska,
+523,Coordinate_Operation,12701,7302,Nevada East,
+524,Coordinate_Operation,12702,7302,Nevada Central,
+525,Coordinate_Operation,12703,7302,Nevada West,
+526,Coordinate_Operation,12731,7302,Nevada East,
+527,Coordinate_Operation,12732,7302,Nevada Central,
+528,Coordinate_Operation,12733,7302,Nevada West,
+529,Coordinate_Operation,12800,7302,New Hampshire,
+530,Coordinate_Operation,12830,7302,New Hampshire,
+531,Coordinate_Operation,12900,7302,New Jersey,
+532,Coordinate_Operation,12930,7302,New Jersey,
+533,Coordinate_Operation,13001,7302,New Mexico East,
+534,Coordinate_Operation,13002,7302,New Mexico Central,
+535,Coordinate_Operation,13003,7302,New Mexico West,
+536,Coordinate_Operation,13031,7302,New Mexico East,
+537,Coordinate_Operation,13032,7302,New Mexico Central,
+538,Coordinate_Operation,13033,7302,New Mexico West,
+539,Coordinate_Operation,13101,7302,New York East,
+540,Coordinate_Operation,13102,7302,New York Central,
+541,Coordinate_Operation,13103,7302,New York West,
+542,Coordinate_Operation,13104,7302,New York Long Island,
+543,Coordinate_Operation,13131,7302,New York East,
+544,Coordinate_Operation,13132,7302,New York Central,
+545,Coordinate_Operation,13133,7302,New York West,
+546,Coordinate_Operation,13134,7302,New York Long Island,
+547,Coordinate_Operation,13200,7302,North Carolina,
+548,Coordinate_Operation,13230,7302,North Carolina,
+549,Coordinate_Operation,13301,7302,North Dakota North,
+550,Coordinate_Operation,13302,7302,North Dakota South,
+551,Coordinate_Operation,13331,7302,North Dakota North,
+552,Coordinate_Operation,13332,7302,North Dakota South,
+553,Coordinate_Operation,13401,7302,Ohio North,
+554,Coordinate_Operation,13402,7302,Ohio South,
+555,Coordinate_Operation,13431,7302,Ohio North,
+556,Coordinate_Operation,13432,7302,Ohio South,
+557,Coordinate_Operation,13501,7302,Oklahoma North,
+558,Coordinate_Operation,13502,7302,Oklahoma South,
+559,Coordinate_Operation,13531,7302,Oklahoma North,
+560,Coordinate_Operation,13532,7302,Oklahoma South,
+561,Coordinate_Operation,13601,7302,Oregon North,
+562,Coordinate_Operation,13602,7302,Oregon South,
+563,Coordinate_Operation,13631,7302,Oregon North,
+564,Coordinate_Operation,13632,7302,Oregon South,
+565,Coordinate_Operation,13701,7302,Pennsylvania North,
+566,Coordinate_Operation,13702,7302,Pennsylvania South,
+567,Coordinate_Operation,13731,7302,Pennsylvania North,
+568,Coordinate_Operation,13732,7302,Pennsylvania South,
+569,Coordinate_Operation,13800,7302,Rhode Island,
+570,Coordinate_Operation,13830,7302,Rhode Island,
+571,Coordinate_Operation,13901,7302,South Carolina North,
+572,Coordinate_Operation,13902,7302,South Carolina South,
+573,Coordinate_Operation,13930,7302,South Carolina,
+574,Coordinate_Operation,14001,7302,South Dakota North,
+575,Coordinate_Operation,14002,7302,South Dakota South,
+576,Coordinate_Operation,14031,7302,South Dakota North,
+577,Coordinate_Operation,14032,7302,South Dakota South,
+578,Coordinate_Operation,14100,7302,Tennessee,
+579,Coordinate_Operation,14130,7302,Tennessee,
+580,Coordinate_Operation,14201,7302,Texas North,
+581,Coordinate_Operation,14202,7302,Texas North Central,
+582,Coordinate_Operation,14203,7302,Texas Central,
+583,Coordinate_Operation,14204,7302,Texas South Central,
+584,Coordinate_Operation,14205,7302,Texas South,
+585,Coordinate_Operation,14231,7302,Texas North,
+586,Coordinate_Operation,14232,7302,Texas North Central,
+587,Coordinate_Operation,14233,7302,Texas Central,
+588,Coordinate_Operation,14234,7302,Texas South Central,
+589,Coordinate_Operation,14235,7302,Texas South,
+590,Coordinate_Operation,14301,7302,Utah North,
+591,Coordinate_Operation,14302,7302,Utah Central,
+592,Coordinate_Operation,14303,7302,Utah South,
+593,Coordinate_Operation,14331,7302,Utah North,
+594,Coordinate_Operation,14332,7302,Utah Central,
+595,Coordinate_Operation,14333,7302,Utah South,
+596,Coordinate_Operation,14400,7302,Vermont,
+597,Coordinate_Operation,14430,7302,Vermont,
+598,Coordinate_Operation,14501,7302,Virginia North,
+599,Coordinate_Operation,14502,7302,Virginia South,
+600,Coordinate_Operation,14531,7302,Virginia North,
+601,Coordinate_Operation,14532,7302,Virginia South,
+602,Coordinate_Operation,14601,7302,Washington North,
+603,Coordinate_Operation,14602,7302,Washington South,
+604,Coordinate_Operation,14631,7302,Washington North,
+605,Coordinate_Operation,14632,7302,Washington South,
+606,Coordinate_Operation,14701,7302,West Virginia North,
+607,Coordinate_Operation,14702,7302,West Virginia South,
+608,Coordinate_Operation,14731,7302,West Virginia North,
+609,Coordinate_Operation,14732,7302,West Virginia South,
+610,Coordinate_Operation,14801,7302,Wisconsin North,
+611,Coordinate_Operation,14802,7302,Wisconsin Central,
+612,Coordinate_Operation,14803,7302,Wisconsin South,
+613,Coordinate_Operation,14831,7302,Wisconsin North,
+614,Coordinate_Operation,14832,7302,Wisconsin Central,
+615,Coordinate_Operation,14833,7302,Wisconsin South,
+616,Coordinate_Operation,14901,7302,Wyoming East,
+617,Coordinate_Operation,14902,7302,Wyoming East Central,
+618,Coordinate_Operation,14903,7302,Wyoming West Central,
+619,Coordinate_Operation,14904,7302,Wyoming West,
+620,Coordinate_Operation,14931,7302,Wyoming East,
+621,Coordinate_Operation,14932,7302,Wyoming East Central,
+622,Coordinate_Operation,14933,7302,Wyoming West Central,
+623,Coordinate_Operation,14934,7302,Wyoming West,
+624,Coordinate_Operation,15001,7302,Alaska zone 1,
+625,Coordinate_Operation,15002,7302,Alaska zone 2,
+626,Coordinate_Operation,15003,7302,Alaska zone 3,
+627,Coordinate_Operation,15004,7302,Alaska zone 4,
+628,Coordinate_Operation,15005,7302,Alaska zone 5,
+629,Coordinate_Operation,15006,7302,Alaska zone 6,
+630,Coordinate_Operation,15007,7302,Alaska zone 7,
+631,Coordinate_Operation,15008,7302,Alaska zone 8,
+632,Coordinate_Operation,15009,7302,Alaska zone 9,
+633,Coordinate_Operation,15010,7302,Alaska zone 10,
+634,Coordinate_Operation,15031,7302,Alaska zone 1,
+635,Coordinate_Operation,15032,7302,Alaska zone 2,
+636,Coordinate_Operation,15033,7302,Alaska zone 3,
+637,Coordinate_Operation,15034,7302,Alaska zone 4,
+638,Coordinate_Operation,15035,7302,Alaska zone 5,
+639,Coordinate_Operation,15036,7302,Alaska zone 6,
+640,Coordinate_Operation,15037,7302,Alaska zone 7,
+641,Coordinate_Operation,15038,7302,Alaska zone 8,
+642,Coordinate_Operation,15039,7302,Alaska zone 9,
+643,Coordinate_Operation,15040,7302,Alaska zone 10,
+644,Coordinate_Operation,15101,7302,Hawaii zone 1,
+645,Coordinate_Operation,15102,7302,Hawaii zone 2,
+646,Coordinate_Operation,15103,7302,Hawaii zone 3,
+647,Coordinate_Operation,15104,7302,Hawaii zone 4,
+648,Coordinate_Operation,15105,7302,Hawaii zone 5,
+649,Coordinate_Operation,15131,7302,Hawaii zone 1,
+650,Coordinate_Operation,15132,7302,Hawaii zone 2,
+651,Coordinate_Operation,15133,7302,Hawaii zone 3,
+652,Coordinate_Operation,15134,7302,Hawaii zone 4,
+653,Coordinate_Operation,15135,7302,Hawaii zone 5,
+654,Coordinate_Operation,15201,7302,Puerto Rico,
+655,Coordinate_Operation,15202,7302,St. Croix,
+656,Coordinate_Operation,15230,7302,Puerto Rico & Virgin Is.,
+657,Coordinate_Operation,15914,7302,BLM 14N (ftUS),
+658,Coordinate_Operation,15915,7302,BLM 15N (ftUS),
+659,Coordinate_Operation,15916,7302,BLM 16N (ftUS),
+660,Coordinate_Operation,15917,7302,BLM 17N (ftUS),
+661,Coordinate_Operation,16061,7302,UPS North,
+662,Coordinate_Operation,16062,7302,UPS South,
+663,Coordinate_Operation,16261,7302,3-degree Gauss zone 1,
+664,Coordinate_Operation,16262,7302,3-degree Gauss zone 2,
+665,Coordinate_Operation,16263,7302,3-degree Gauss zone 3,
+666,Coordinate_Operation,16264,7302,3-degree Gauss zone 4,
+667,Coordinate_Operation,16265,7302,3-degree Gauss zone 5,
+668,Coordinate_Operation,16266,7302,3-degree Gauss zone 6,
+669,Coordinate_Operation,16267,7302,3-degree Gauss zone 7,
+670,Coordinate_Operation,16268,7302,3-degree Gauss zone 8,
+671,Coordinate_Operation,16361,7302,3-deg Gauss-Kruger 3E,
+672,Coordinate_Operation,16362,7302,3-deg Gauss-Kruger 6E,
+673,Coordinate_Operation,16363,7302,3-deg Gauss-Kruger 9E,
+674,Coordinate_Operation,16364,7302,3-deg Gauss-Kruger 12E,
+675,Coordinate_Operation,16365,7302,3-deg Gauss-Kruger 15E,
+676,Coordinate_Operation,16366,7302,3-deg Gauss-Kruger 18E,
+677,Coordinate_Operation,16367,7302,3-deg Gauss-Kruger 21E,
+678,Coordinate_Operation,16368,7302,3-deg Gauss-Kruger 24E,
+679,Coordinate_Operation,17348,7302,MGA zone 48,
+680,Coordinate_Operation,17349,7302,MGA zone 49,
+681,Coordinate_Operation,17350,7302,MGA zone 50,
+682,Coordinate_Operation,17351,7302,MGA zone 51,
+683,Coordinate_Operation,17352,7302,MGA zone 52,
+684,Coordinate_Operation,17353,7302,MGA zone 53,
+685,Coordinate_Operation,17354,7302,MGA zone 54,
+686,Coordinate_Operation,17355,7302,MGA zone 55,
+687,Coordinate_Operation,17356,7302,MGA zone 56,
+688,Coordinate_Operation,17357,7302,MGA zone 57,
+689,Coordinate_Operation,17358,7302,MGA zone 58,
+690,Coordinate_Operation,17448,7302,AMG zone 48,
+691,Coordinate_Operation,17449,7302,AMG zone 49,
+692,Coordinate_Operation,17450,7302,AMG zone 50,
+693,Coordinate_Operation,17451,7302,AMG zone 51,
+694,Coordinate_Operation,17452,7302,AMG zone 52,
+695,Coordinate_Operation,17453,7302,AMG zone 53,
+696,Coordinate_Operation,17454,7302,AMG zone 54,
+697,Coordinate_Operation,17455,7302,AMG zone 55,
+698,Coordinate_Operation,17456,7302,AMG zone 56,
+699,Coordinate_Operation,17457,7302,AMG zone 57,
+700,Coordinate_Operation,17458,7302,AMG zone 58,
+701,Coordinate_Operation,17515,7302,S. African Grid zone 15,
+702,Coordinate_Operation,17517,7302,S. African Grid zone 17,
+703,Coordinate_Operation,17519,7302,S. African Grid zone 19,
+704,Coordinate_Operation,17521,7302,S. African Grid zone 21,
+705,Coordinate_Operation,17523,7302,S. African Grid zone 23,
+706,Coordinate_Operation,17525,7302,S. African Grid zone 25,
+707,Coordinate_Operation,17527,7302,S. African Grid zone 27,
+708,Coordinate_Operation,17529,7302,S. African Grid zone 29,
+709,Coordinate_Operation,17531,7302,S. African Grid zone 31,
+710,Coordinate_Operation,17533,7302,S. African Grid zone 33,
+711,Coordinate_Operation,17611,7302,SW African Grid zone 11,
+712,Coordinate_Operation,17613,7302,SW African Grid zone 13,
+713,Coordinate_Operation,17615,7302,SW African Grid zone 15,
+714,Coordinate_Operation,17617,7302,SW African Grid zone 17,
+715,Coordinate_Operation,17619,7302,SW African Grid zone 19,
+716,Coordinate_Operation,17621,7302,SW African Grid zone 21,
+717,Coordinate_Operation,17623,7302,SW African Grid zone 23,
+718,Coordinate_Operation,17625,7302,SW African Grid zone 25,
+719,Coordinate_Operation,17702,7302,MTM zone 2,
+720,Coordinate_Operation,17801,7302,Japan zone I,
+721,Coordinate_Operation,17802,7302,Japan zone II,
+722,Coordinate_Operation,17803,7302,Japan zone III,
+723,Coordinate_Operation,17804,7302,Japan zone IV,
+724,Coordinate_Operation,17805,7302,Japan zone V,
+725,Coordinate_Operation,17806,7302,Japan zone VI,
+726,Coordinate_Operation,17807,7302,Japan zone VII,
+727,Coordinate_Operation,17808,7302,Japan zone VIII,
+728,Coordinate_Operation,17809,7302,Japan zone IX,
+729,Coordinate_Operation,17810,7302,Japan zone X,
+730,Coordinate_Operation,17811,7302,Japan zone XI,
+731,Coordinate_Operation,17812,7302,Japan zone XII,
+732,Coordinate_Operation,17813,7302,Japan zone XIII,
+733,Coordinate_Operation,17814,7302,Japan zone XIV,
+734,Coordinate_Operation,17815,7302,Japan zone XV,
+735,Coordinate_Operation,17816,7302,Japan zone XVI,
+736,Coordinate_Operation,17817,7302,Japan zone XVII,
+737,Coordinate_Operation,17818,7302,Japan zone XVIII,
+738,Coordinate_Operation,17901,7302,Mt Eden Circuit,
+739,Coordinate_Operation,17920,7302,Mt Pleasant Circuit,
+740,Coordinate_Operation,17924,7302,Mt Nicholas Circuit,
+741,Coordinate_Operation,17925,7302,Mt York Circuit,
+742,Coordinate_Operation,17926,7302,Observation Pt Circuit,
+743,Coordinate_Operation,18031,7302,Argentina 1,
+744,Coordinate_Operation,18032,7302,Argentina 2,
+745,Coordinate_Operation,18033,7302,Argentina 3,
+746,Coordinate_Operation,18034,7302,Argentina 4,
+747,Coordinate_Operation,18035,7302,Argentina 5,
+748,Coordinate_Operation,18036,7302,Argentina 6,
+749,Coordinate_Operation,18037,7302,Argentina 7,
+750,Coordinate_Operation,18044,7302,M28,
+751,Coordinate_Operation,18045,7302,M31,
+752,Coordinate_Operation,18046,7302,M34,
+753,Coordinate_Operation,18051,7302,Colombia 3W,
+754,Coordinate_Operation,18052,7302,Colombia Bogota,
+755,Coordinate_Operation,18053,7302,Colombia 3E,
+756,Coordinate_Operation,18054,7302,Colombia 6E,
+757,Coordinate_Operation,18071,7302,Blue Belt,
+758,Coordinate_Operation,18072,7302,Red Belt,
+759,Coordinate_Operation,18073,7302,Purple Belt,
+760,Coordinate_Operation,18074,7302,Extended Purple Belt,
+761,Coordinate_Operation,18141,7302,North Island Grid,
+762,Coordinate_Operation,18142,7302,South Island Grid,
+763,Coordinate_Operation,18193,7302,Finland zone 3,
+764,Coordinate_Operation,18203,7302,ICS,
+765,Coordinate_Operation,18204,7302,ITM,
+766,Coordinate_Operation,18231,7302,India zone I,
+767,Coordinate_Operation,18232,7302,India zone IIa,
+768,Coordinate_Operation,18233,7302,India zone IIIa,
+769,Coordinate_Operation,18234,7302,India zone IVa,
+770,Coordinate_Operation,18235,7302,India zone IIb,
+771,Coordinate_Operation,18236,7302,India zone I,
+772,Coordinate_Operation,18237,7302,India zone IIa,
+773,Coordinate_Operation,18238,7302,India zone IIb,
+774,Coordinate_Operation,19900,7302,Bahrain Grid,
+775,Coordinate_Operation,19905,7302,NEIEZ,
+776,Coordinate_Operation,19917,7302,NZMG,
+777,Coordinate_Operation,19922,7302,LV03,
+778,Coordinate_Operation,19923,7302,LV03C,
+779,Coordinate_Operation,19928,7302,KTM,
+780,Coordinate_Operation,19929,7302,2.5 gon West,
+781,Coordinate_Operation,19931,7302,EOV,
+782,Coordinate_Operation,19933,7302,PEI Stereographic ATS77,
+783,Coordinate_Operation,19935,7302,R.S.O. Malaya,
+784,Coordinate_Operation,19945,7302,NB Stereographic ATS77,
+785,Coordinate_Operation,19946,7302,NB Stereographic NAD83,
+786,Coordinate_Operation,19950,7302,LV95,
+787,Coordinate_Operation,19951,7302,Nakhl e Taqi,
+788,Coordinate_Operation,19956,7302,R.S.O. Borneo (chSe),
+789,Coordinate_Operation,19957,7302,R.S.O. Borneo (ftSe),
+790,Coordinate_Operation,19958,7302,R.S.O. Borneo (m),
+791,Coordinate_Operation,19960,7302,PEI Stereographic NAD83,
+792,Coordinate_Operation,19962,7302,ITM,
+793,Coordinate Reference System,20004,7302,1995 Coord. Sys. zone 4,
+794,Coordinate Reference System,20005,7302,1995 Coord. Sys. zone 5,
+795,Coordinate Reference System,20006,7302,1995 Coord. Sys. zone 6,
+796,Coordinate Reference System,20007,7302,1995 Coord. Sys. zone 7,
+797,Coordinate Reference System,20008,7302,1995 Coord. Sys. zone 8,
+798,Coordinate Reference System,20009,7302,1995 Coord. Sys. zone 9,
+799,Coordinate Reference System,20010,7302,1995 Coord. Sys. zone 10,
+800,Coordinate Reference System,20011,7302,1995 Coord. Sys. zone 11,
+801,Coordinate Reference System,20012,7302,1995 Coord. Sys. zone 12,
+802,Coordinate Reference System,20013,7302,1995 Coord. Sys. zone 13,
+803,Coordinate Reference System,20014,7302,1995 Coord. Sys. zone 14,
+804,Coordinate Reference System,20015,7302,1995 Coord. Sys. zone 15,
+805,Coordinate Reference System,20016,7302,1995 Coord. Sys. zone 16,
+806,Coordinate Reference System,20017,7302,1995 Coord. Sys. zone 17,
+807,Coordinate Reference System,20018,7302,1995 Coord. Sys. zone 18,
+808,Coordinate Reference System,20019,7302,1995 Coord. Sys. zone 19,
+809,Coordinate Reference System,20020,7302,1995 Coord. Sys. zone 20,
+810,Coordinate Reference System,20021,7302,1995 Coord. Sys. zone 21,
+811,Coordinate Reference System,20022,7302,1995 Coord. Sys. zone 22,
+812,Coordinate Reference System,20023,7302,1995 Coord. Sys. zone 23,
+813,Coordinate Reference System,20024,7302,1995 Coord. Sys. zone 24,
+814,Coordinate Reference System,20025,7302,1995 Coord. Sys. zone 25,
+815,Coordinate Reference System,20026,7302,1995 Coord. Sys. zone 26,
+816,Coordinate Reference System,20027,7302,1995 Coord. Sys. zone 27,
+817,Coordinate Reference System,20028,7302,1995 Coord. Sys. zone 28,
+818,Coordinate Reference System,20029,7302,1995 Coord. Sys. zone 29,
+819,Coordinate Reference System,20030,7302,1995 Coord. Sys. zone 30,
+820,Coordinate Reference System,20031,7302,1995 Coord. Sys. zone 31,
+821,Coordinate Reference System,20032,7302,1995 Coord. Sys. zone 32,
+822,Coordinate Reference System,20064,7302,Pulkovo 1995 / Gauss 4N,
+823,Coordinate Reference System,20065,7302,Pulkovo 1995 / Gauss 5N,
+824,Coordinate Reference System,20066,7302,Pulkovo 1995 / Gauss 6N,
+825,Coordinate Reference System,20067,7302,Pulkovo 1995 / Gauss 7N,
+826,Coordinate Reference System,20068,7302,Pulkovo 1995 / Gauss 8N,
+827,Coordinate Reference System,20069,7302,Pulkovo 1995 / Gauss 9N,
+828,Coordinate Reference System,20070,7302,Pulkovo 1995 / Gauss 10N,
+829,Coordinate Reference System,20071,7302,Pulkovo 1995 / Gauss 11N,
+830,Coordinate Reference System,20072,7302,Pulkovo 1995 / Gauss 12N,
+831,Coordinate Reference System,20073,7302,Pulkovo 1995 / Gauss 13N,
+832,Coordinate Reference System,20074,7302,Pulkovo 1995 / Gauss 14N,
+833,Coordinate Reference System,20075,7302,Pulkovo 1995 / Gauss 15N,
+834,Coordinate Reference System,20076,7302,Pulkovo 1995 / Gauss 16N,
+835,Coordinate Reference System,20077,7302,Pulkovo 1995 / Gauss 17N,
+836,Coordinate Reference System,20078,7302,Pulkovo 1995 / Gauss 18N,
+837,Coordinate Reference System,20079,7302,Pulkovo 1995 / Gauss 19N,
+838,Coordinate Reference System,20080,7302,Pulkovo 1995 / Gauss 20N,
+839,Coordinate Reference System,20081,7302,Pulkovo 1995 / Gauss 21N,
+840,Coordinate Reference System,20082,7302,Pulkovo 1995 / Gauss 22N,
+841,Coordinate Reference System,20083,7302,Pulkovo 1995 / Gauss 23N,
+842,Coordinate Reference System,20084,7302,Pulkovo 1995 / Gauss 24N,
+843,Coordinate Reference System,20085,7302,Pulkovo 1995 / Gauss 25N,
+844,Coordinate Reference System,20086,7302,Pulkovo 1995 / Gauss 26N,
+845,Coordinate Reference System,20087,7302,Pulkovo 1995 / Gauss 27N,
+846,Coordinate Reference System,20088,7302,Pulkovo 1995 / Gauss 28N,
+847,Coordinate Reference System,20089,7302,Pulkovo 1995 / Gauss 29N,
+848,Coordinate Reference System,20090,7302,Pulkovo 1995 / Gauss 30N,
+849,Coordinate Reference System,20091,7302,Pulkovo 1995 / Gauss 31N,
+850,Coordinate Reference System,20092,7302,Pulkovo 1995 / Gauss 32N,
+851,Coordinate Reference System,20437,7302,Ain el Abd / UTM 37N,
+852,Coordinate Reference System,20438,7302,Ain el Abd / UTM 38N,
+853,Coordinate Reference System,20439,7302,Ain el Abd / UTM 39N,
+854,Coordinate Reference System,20790,7302,Lisbon / Portuguese National Grid,
+855,Coordinate Reference System,21100,7302,Batavia / NEIEZ,
+856,Coordinate Reference System,21291,7302,Barbados 1938 / BWI Grid,
+857,Coordinate Reference System,21292,7302,Barbados NationaI Grid,
+858,Coordinate Reference System,21413,7302,Beijing / Gauss zone 13,
+859,Coordinate Reference System,21414,7302,Beijing / Gauss zone 14,
+860,Coordinate Reference System,21415,7302,Beijing / Gauss zone 15,
+861,Coordinate Reference System,21416,7302,Beijing / Gauss zone 16,
+862,Coordinate Reference System,21417,7302,Beijing / Gauss zone 17,
+863,Coordinate Reference System,21418,7302,Beijing / Gauss zone 18,
+864,Coordinate Reference System,21419,7302,Beijing / Gauss zone 19,
+865,Coordinate Reference System,21420,7302,Beijing / Gauss zone 20,
+866,Coordinate Reference System,21421,7302,Beijing / Gauss zone 21,
+867,Coordinate Reference System,21422,7302,Beijing / Gauss zone 22,
+868,Coordinate Reference System,21423,7302,Beijing / Gauss zone 23,
+869,Coordinate Reference System,21473,7302,Beijing / Gauss 13N,
+870,Coordinate Reference System,21474,7302,Beijing / Gauss 14N,
+871,Coordinate Reference System,21475,7302,Beijing / Gauss 15N,
+872,Coordinate Reference System,21476,7302,Beijing / Gauss 16N,
+873,Coordinate Reference System,21477,7302,Beijing / Gauss 17N,
+874,Coordinate Reference System,21478,7302,Beijing / Gauss 18N,
+875,Coordinate Reference System,21479,7302,Beijing / Gauss 19N,
+876,Coordinate Reference System,21480,7302,Beijing / Gauss 20N,
+877,Coordinate Reference System,21481,7302,Beijing / Gauss 21N,
+878,Coordinate Reference System,21482,7302,Beijing / Gauss 22N,
+879,Coordinate Reference System,21483,7302,Beijing / Gauss 23N,
+880,Coordinate Reference System,21500,7302,Belge Lambert 50,
+881,Coordinate Reference System,21780,7302,LV03C,
+882,Coordinate Reference System,21781,7302,LV03,
+883,Coordinate Reference System,21891,7302,Bogota / Colombia 3W,
+884,Coordinate Reference System,21892,7302,Bogota / Colombia Bogota,
+885,Coordinate Reference System,21893,7302,Bogota / Colombia 3E,
+886,Coordinate Reference System,21894,7302,Bogota / Colombia 6E,
+887,Coordinate Reference System,22191,7302,C Inchauspe /Argentina 1,
+888,Coordinate Reference System,22192,7302,C Inchauspe /Argentina 2,
+889,Coordinate Reference System,22193,7302,C Inchauspe /Argentina 3,
+890,Coordinate Reference System,22194,7302,C Inchauspe /Argentina 4,
+891,Coordinate Reference System,22195,7302,C Inchauspe /Argentina 5,
+892,Coordinate Reference System,22196,7302,C Inchauspe /Argentina 6,
+893,Coordinate Reference System,22197,7302,C Inchauspe /Argentina 7,
+894,Coordinate Reference System,22275,7302,South African CS zone 15,
+895,Coordinate Reference System,22277,7302,South African CS zone 17,
+896,Coordinate Reference System,22279,7302,South African CS zone 19,
+897,Coordinate Reference System,22281,7302,South African CS zone 21,
+898,Coordinate Reference System,22283,7302,South African CS zone 23,
+899,Coordinate Reference System,22285,7302,South African CS zone 25,
+900,Coordinate Reference System,22287,7302,South African CS zone 27,
+901,Coordinate Reference System,22289,7302,South African CS zone 29,
+902,Coordinate Reference System,22291,7302,South African CS zone 31,
+903,Coordinate Reference System,22293,7302,South African CS zone 33,
+904,Coordinate Reference System,22300,7302,Tunisia Mining Grid,
+905,Coordinate Reference System,22523,7302,Corrego Alegre / UTM 23S,
+906,Coordinate Reference System,22524,7302,Corrego Alegre / UTM 24S,
+907,Coordinate Reference System,22994,7302,Egypt 1907 / Ext. Purple,
+908,Coordinate Reference System,23946,7302,Indian 1954 / UTM 46N,
+909,Coordinate Reference System,23947,7302,Indian 1954 / UTM 47N,
+910,Coordinate Reference System,23948,7302,Indian 1954 / UTM 48N,
+911,Coordinate Reference System,24047,7302,Indian 1975 / UTM 47N,
+912,Coordinate Reference System,24048,7302,Indian 1975 / UTM 48N,
+913,Coordinate Reference System,24100,7302,Jamaica 1875 / Old Grid,
+914,Coordinate Reference System,24200,7302,JAD69 / Jamaica Grid,
+915,Coordinate Reference System,24305,7302,Kalianpur 37 / UTM 45N,
+916,Coordinate Reference System,24306,7302,Kalianpur 37 / UTM 46N,
+917,Coordinate Reference System,24311,7302,Kalianpur 62 / UTM 41N,
+918,Coordinate Reference System,24312,7302,Kalianpur 62 / UTM 42N,
+919,Coordinate Reference System,24313,7302,Kalianpur 62 / UTM 43N,
+920,Coordinate Reference System,24342,7302,Kalianpur 75 / UTM 42N,
+921,Coordinate Reference System,24343,7302,Kalianpur 75 / UTM 43N,
+922,Coordinate Reference System,24344,7302,Kalianpur 75 / UTM 44N,
+923,Coordinate Reference System,24345,7302,Kalianpur 75 / UTM 45N,
+924,Coordinate Reference System,24346,7302,Kalianpur 75 / UTM 46N,
+925,Coordinate Reference System,24347,7302,Kalianpur 75 / UTM 47N,
+926,Coordinate Reference System,24370,7302,Kalianpur / India 0,
+927,Coordinate Reference System,24371,7302,Kalianpur / India I,
+928,Coordinate Reference System,24372,7302,Kalianpur / India IIa,
+929,Coordinate Reference System,24373,7302,Kalianpur / India III,
+930,Coordinate Reference System,24374,7302,Kalianpur / India IV,
+931,Coordinate Reference System,24375,7302,Kalianpur 37 / India IIb,
+932,Coordinate Reference System,24376,7302,Kalianpur 62 / India I,
+933,Coordinate Reference System,24377,7302,Kalianpur 62 / India IIa,
+934,Coordinate Reference System,24378,7302,Kalianpur 75 / India I,
+935,Coordinate Reference System,24379,7302,Kalianpur 75 / India IIa,
+936,Coordinate Reference System,24380,7302,Kalianpur 75 / India IIb,
+937,Coordinate Reference System,24381,7302,Kalianpur 75 / India III,
+938,Coordinate Reference System,24382,7302,Kalianpur / India IIb,
+939,Coordinate Reference System,24383,7302,Kalianpur 75 / India IV,
+940,Coordinate Reference System,24892,7302,PSAD56 / Peru central,
+941,Coordinate Reference System,25000,7302,Leigon / Ghana Grid,
+942,Coordinate Reference System,25391,7302,Luzon / Philippines I,
+943,Coordinate Reference System,25392,7302,Luzon / Philippines II,
+944,Coordinate Reference System,25393,7302,Luzon / Philippines III,
+945,Coordinate Reference System,25394,7302,Luzon / Philippines IV,
+946,Coordinate Reference System,25395,7302,Luzon / Philippines V,
+947,Coordinate Reference System,25700,7302,Makassar / NEIEZ,
+948,Coordinate Reference System,25932,7302,Malongo 1987 / UTM 32S,
+949,Coordinate Reference System,26391,7302,Minna / Nigeria West,
+950,Coordinate Reference System,26393,7302,Minna / Nigeria East,
+951,Coordinate Reference System,26591,7302,Monte Mario / Italy 1,
+952,Coordinate Reference System,26592,7302,Monte Mario / Italy 2,
+953,Coordinate Reference System,26632,7302,M'poraloko / UTM 32N,
+954,Coordinate Reference System,26692,7302,M'poraloko / UTM 32S,
+955,Coordinate Reference System,26741,7302,NAD27 / California I,
+956,Coordinate Reference System,26742,7302,NAD27 / California II,
+957,Coordinate Reference System,26743,7302,NAD27 / California III,
+958,Coordinate Reference System,26744,7302,NAD27 / California IV,
+959,Coordinate Reference System,26745,7302,NAD27 / California V,
+960,Coordinate Reference System,26746,7302,NAD27 / California VI,
+961,Coordinate Reference System,26747,7302,NAD27 / California VII,
+962,Coordinate Reference System,26786,7302,NAD27 / Massachusetts,
+963,Coordinate Reference System,26787,7302,NAD27 / Massachusetts Is,
+964,Coordinate Reference System,26792,7302,NAD27 / Minnesota Cent.,
+965,Coordinate Reference System,26801,7302,NAD27 / Michigan East,
+966,Coordinate Reference System,26802,7302,NAD27 / Michigan Old Cen,
+967,Coordinate Reference System,26803,7302,NAD27 / Michigan West,
+968,Coordinate Reference System,26811,7302,NAD27 / Michigan North,
+969,Coordinate Reference System,26812,7302,NAD27 / Michigan Central,
+970,Coordinate Reference System,26813,7302,NAD27 / Michigan South,
+971,Coordinate Reference System,26941,7302,NAD83 / California 1,
+972,Coordinate Reference System,26942,7302,NAD83 / California 2,
+973,Coordinate Reference System,26943,7302,NAD83 / California 3,
+974,Coordinate Reference System,26944,7302,NAD83 / California 4,
+975,Coordinate Reference System,26945,7302,NAD83 / California 5,
+976,Coordinate Reference System,26946,7302,NAD83 / California 6,
+977,Coordinate Reference System,26986,7302,NAD83 / Massachusetts,
+978,Coordinate Reference System,26987,7302,NAD83 / Massachusetts Is,
+979,Coordinate Reference System,26992,7302,NAD83 / Minnesota Cent.,
+980,Coordinate Reference System,27038,7302,Nahrwan 1967 / UTM 38N,
+981,Coordinate Reference System,27039,7302,Nahrwan 1967 / UTM 39N,
+982,Coordinate Reference System,27040,7302,Nahrwan 1967 / UTM 40N,
+983,Coordinate Reference System,27120,7302,Naparima 1972 / UTM 20N,
+984,Coordinate Reference System,27200,7302,GD49 / NZ Map Grid,
+985,Coordinate Reference System,27391,7302,NGO 1948 / I,
+986,Coordinate Reference System,27392,7302,NGO 1948 / II,
+987,Coordinate Reference System,27393,7302,NGO 1948 / III,
+988,Coordinate Reference System,27394,7302,NGO 1948 / IV,
+989,Coordinate Reference System,27395,7302,NGO 1948 / V,
+990,Coordinate Reference System,27396,7302,NGO 1948 / VI,
+991,Coordinate Reference System,27397,7302,NGO 1948 / VII,
+992,Coordinate Reference System,27398,7302,NGO 1948 / VIII,
+993,Coordinate Reference System,27500,7302,ATF / Nord de Guerre,
+994,Coordinate Reference System,27581,7302,NTF / France I,
+995,Coordinate Reference System,27582,7302,NTF / France II,
+996,Coordinate Reference System,27583,7302,NTF / France III,
+997,Coordinate Reference System,27584,7302,NTF / France IV,
+998,Coordinate Reference System,27591,7302,NTF / Nord France,
+999,Coordinate Reference System,27592,7302,NTF / Centre France,
+1000,Coordinate Reference System,27593,7302,NTF / Sud France,
+1001,Coordinate Reference System,27594,7302,NTF / Corse,
+1002,Coordinate Reference System,27700,7302,British National Grid,
+1003,Coordinate Reference System,28191,7302,Palestine Grid,
+1004,Coordinate Reference System,28192,7302,Palestine Belt,
+1005,Coordinate Reference System,28193,7302,Israeli CS Grid,
+1006,Coordinate Reference System,28232,7302,Point Noire / UTM 32S,
+1007,Coordinate Reference System,28402,7302,1942 Coord. Sys. zone 2,
+1008,Coordinate Reference System,28403,7302,1942 Coord. Sys. zone 3,
+1009,Coordinate Reference System,28404,7302,1942 Coord. Sys. zone 4,
+1010,Coordinate Reference System,28405,7302,1942 Coord. Sys. zone 5,
+1011,Coordinate Reference System,28406,7302,1942 Coord. Sys. zone 6,
+1012,Coordinate Reference System,28407,7302,1942 Coord. Sys. zone 7,
+1013,Coordinate Reference System,28408,7302,1942 Coord. Sys. zone 8,
+1014,Coordinate Reference System,28409,7302,1942 Coord. Sys. zone 9,
+1015,Coordinate Reference System,28410,7302,1942 Coord. Sys. zone 10,
+1016,Coordinate Reference System,28411,7302,1942 Coord. Sys. zone 11,
+1017,Coordinate Reference System,28412,7302,1942 Coord. Sys. zone 12,
+1018,Coordinate Reference System,28413,7302,1942 Coord. Sys. zone 13,
+1019,Coordinate Reference System,28414,7302,1942 Coord. Sys. zone 14,
+1020,Coordinate Reference System,28415,7302,1942 Coord. Sys. zone 15,
+1021,Coordinate Reference System,28416,7302,1942 Coord. Sys. zone 16,
+1022,Coordinate Reference System,28417,7302,1942 Coord. Sys. zone 17,
+1023,Coordinate Reference System,28418,7302,1942 Coord. Sys. zone 18,
+1024,Coordinate Reference System,28419,7302,1942 Coord. Sys. zone 19,
+1025,Coordinate Reference System,28420,7302,1942 Coord. Sys. zone 20,
+1026,Coordinate Reference System,28421,7302,1942 Coord. Sys. zone 21,
+1027,Coordinate Reference System,28422,7302,1942 Coord. Sys. zone 22,
+1028,Coordinate Reference System,28423,7302,1942 Coord. Sys. zone 23,
+1029,Coordinate Reference System,28424,7302,1942 Coord. Sys. zone 24,
+1030,Coordinate Reference System,28425,7302,1942 Coord. Sys. zone 25,
+1031,Coordinate Reference System,28426,7302,1942 Coord. Sys. zone 26,
+1032,Coordinate Reference System,28427,7302,1942 Coord. Sys. zone 27,
+1033,Coordinate Reference System,28428,7302,1942 Coord. Sys. zone 28,
+1034,Coordinate Reference System,28429,7302,1942 Coord. Sys. zone 29,
+1035,Coordinate Reference System,28430,7302,1942 Coord. Sys. zone 30,
+1036,Coordinate Reference System,28431,7302,1942 Coord. Sys. zone 31,
+1037,Coordinate Reference System,28432,7302,1942 Coord. Sys. zone 32,
+1038,Coordinate Reference System,28462,7302,Pulkovo / Gauss 2N,
+1039,Coordinate Reference System,28463,7302,Pulkovo / Gauss 3N,
+1040,Coordinate Reference System,28464,7302,Pulkovo / Gauss 4N,
+1041,Coordinate Reference System,28465,7302,Pulkovo / Gauss 5N,
+1042,Coordinate Reference System,28466,7302,Pulkovo / Gauss 6N,
+1043,Coordinate Reference System,28467,7302,Pulkovo / Gauss 7N,
+1044,Coordinate Reference System,28468,7302,Pulkovo / Gauss 8N,
+1045,Coordinate Reference System,28469,7302,Pulkovo / Gauss 9N,
+1046,Coordinate Reference System,28470,7302,Pulkovo / Gauss 10N,
+1047,Coordinate Reference System,28471,7302,Pulkovo / Gauss 11N,
+1048,Coordinate Reference System,28472,7302,Pulkovo / Gauss 12N,
+1049,Coordinate Reference System,28473,7302,Pulkovo / Gauss 13N,
+1050,Coordinate Reference System,28474,7302,Pulkovo / Gauss 14N,
+1051,Coordinate Reference System,28475,7302,Pulkovo / Gauss 15N,
+1052,Coordinate Reference System,28476,7302,Pulkovo / Gauss 16N,
+1053,Coordinate Reference System,28477,7302,Pulkovo / Gauss 17N,
+1054,Coordinate Reference System,28478,7302,Pulkovo / Gauss 18N,
+1055,Coordinate Reference System,28479,7302,Pulkovo / Gauss 19N,
+1056,Coordinate Reference System,28480,7302,Pulkovo / Gauss 20N,
+1057,Coordinate Reference System,28481,7302,Pulkovo / Gauss 21N,
+1058,Coordinate Reference System,28482,7302,Pulkovo / Gauss 22N,
+1059,Coordinate Reference System,28483,7302,Pulkovo / Gauss 23N,
+1060,Coordinate Reference System,28484,7302,Pulkovo / Gauss 24N,
+1061,Coordinate Reference System,28485,7302,Pulkovo / Gauss 25N,
+1062,Coordinate Reference System,28486,7302,Pulkovo / Gauss 26N,
+1063,Coordinate Reference System,28487,7302,Pulkovo / Gauss 27N,
+1064,Coordinate Reference System,28488,7302,Pulkovo / Gauss 28N,
+1065,Coordinate Reference System,28489,7302,Pulkovo / Gauss 29N,
+1066,Coordinate Reference System,28490,7302,Pulkovo / Gauss 30N,
+1067,Coordinate Reference System,28491,7302,Pulkovo / Gauss 31N,
+1068,Coordinate Reference System,28492,7302,Pulkovo / Gauss 32N,
+1069,Coordinate Reference System,28600,7302,Qatar National Grid,
+1070,Coordinate Reference System,29220,7302,Sapper Hill / UTM 20S,
+1071,Coordinate Reference System,29221,7302,Sapper Hill / UTM 21S,
+1072,Coordinate Reference System,29333,7302,Schwarzeck / UTM 33S,
+1073,Coordinate Reference System,29371,7302,SW African CS zone 11,
+1074,Coordinate Reference System,29373,7302,SW African CS zone 13,
+1075,Coordinate Reference System,29375,7302,SW African CS zone 15,
+1076,Coordinate Reference System,29377,7302,SW African CS zone 17,
+1077,Coordinate Reference System,29379,7302,SW African CS zone 19,
+1078,Coordinate Reference System,29381,7302,SW African CS zone 21,
+1079,Coordinate Reference System,29383,7302,SW African CS zone 23,
+1080,Coordinate Reference System,29385,7302,SW African CS zone 25,
+1081,Coordinate Reference System,29700,7302,Tananarive / Laborde,
+1082,Coordinate Reference System,29738,7302,Tananarive / UTM 38S,
+1083,Coordinate Reference System,29739,7302,Tananarive / UTM 39S,
+1084,Coordinate Reference System,29849,7302,Timbalai 1948 / UTM 49N,
+1085,Coordinate Reference System,29850,7302,Timbalai 1948 / UTM 50N,
+1086,Coordinate Reference System,29871,7302,Timbalai / Borneo (ch),
+1087,Coordinate Reference System,29872,7302,Timbalai / Borneo (ft),
+1088,Coordinate Reference System,29873,7302,Timbalai / Borneo (m),
+1089,Coordinate Reference System,29900,7302,TM65 / Irish Nat Grid,
+1090,Coordinate Reference System,30161,7302,Tokyo / Japan zone I,
+1091,Coordinate Reference System,30162,7302,Tokyo / Japan zone II,
+1092,Coordinate Reference System,30163,7302,Tokyo / Japan zone III,
+1093,Coordinate Reference System,30164,7302,Tokyo / Japan zone IV,
+1094,Coordinate Reference System,30165,7302,Tokyo / Japan zone V,
+1095,Coordinate Reference System,30166,7302,Tokyo / Japan zone VI,
+1096,Coordinate Reference System,30167,7302,Tokyo / Japan zone VII,
+1097,Coordinate Reference System,30168,7302,Tokyo / Japan zone VIII,
+1098,Coordinate Reference System,30169,7302,Tokyo / Japan zone IX,
+1099,Coordinate Reference System,30170,7302,Tokyo / Japan zone X,
+1100,Coordinate Reference System,30171,7302,Tokyo / Japan zone XI,
+1101,Coordinate Reference System,30172,7302,Tokyo / Japan zone XII,
+1102,Coordinate Reference System,30173,7302,Tokyo / Japan zone XIII,
+1103,Coordinate Reference System,30174,7302,Tokyo / Japan zone XIV,
+1104,Coordinate Reference System,30175,7302,Tokyo / Japan zone XV,
+1105,Coordinate Reference System,30176,7302,Tokyo / Japan zone XVI,
+1106,Coordinate Reference System,30177,7302,Tokyo / Japan zone XVII,
+1107,Coordinate Reference System,30178,7302,Tokyo / Japan zone XVIII,
+1108,Coordinate Reference System,30200,7302,Trinidad 1903 / Trinidad,
+1109,Coordinate Reference System,30491,7302,Voirol /N Algerie ancien,
+1110,Coordinate Reference System,30492,7302,Voirol /S Algerie ancien,
+1111,Coordinate Reference System,30729,7302,Nord Sahara / UTM 29N,
+1112,Coordinate Reference System,30730,7302,Nord Sahara / UTM 30N,
+1113,Coordinate Reference System,30731,7302,Nord Sahara / UTM 31N,
+1114,Coordinate Reference System,30732,7302,Nord Sahara / UTM 32N,
+1115,Coordinate Reference System,30791,7302,Nord Sahara / N Algerie,
+1116,Coordinate Reference System,30792,7302,Nord Sahara / S Algerie,
+1117,Coordinate Reference System,31265,7302,MGI / Gauss zone 5,
+1118,Coordinate Reference System,31266,7302,MGI / Gauss zone 6,
+1119,Coordinate Reference System,31267,7302,MGI / Gauss zone 7,
+1120,Coordinate Reference System,31268,7302,MGI / Gauss zone 8,
+1121,Coordinate Reference System,31291,7302,MGI / Austria West,
+1122,Coordinate Reference System,31292,7302,MGI / Austria Central,
+1123,Coordinate Reference System,31293,7302,MGI / Austria East,
+1124,Coordinate Reference System,31370,7302,BD 72 / Lambert 72,
+1125,Coordinate Reference System,31461,7302,DHDN / Gauss zone 1,
+1126,Coordinate Reference System,31462,7302,DHDN / Gauss zone 2,
+1127,Coordinate Reference System,31463,7302,DHDN / Gauss zone 3,
+1128,Coordinate Reference System,31464,7302,DHDN / Gauss zone 4,
+1129,Coordinate Reference System,31465,7302,DHDN / Gauss zone 5,
+1130,Coordinate Reference System,31600,7302,Stereo 33,
+1131,Coordinate Reference System,31700,7302,Stereo 70,
+1132,Coordinate Reference System,32013,7302,NAD27 / New Mexico Cent.,
+1133,Coordinate Reference System,32018,7302,NAD27 / New York Long Is,
+1134,Coordinate Reference System,32020,7302,NAD27 / North Dakota N,
+1135,Coordinate Reference System,32021,7302,NAD27 / North Dakota S,
+1136,Coordinate Reference System,32028,7302,NAD27 / Pennsylvania N,
+1137,Coordinate Reference System,32029,7302,NAD27 / Pennsylvania S,
+1138,Coordinate Reference System,32031,7302,NAD27 / South Carolina N,
+1139,Coordinate Reference System,32033,7302,NAD27 / South Carolina S,
+1140,Coordinate Reference System,32034,7302,NAD27 / South Dakota N,
+1141,Coordinate Reference System,32035,7302,NAD27 / South Dakota S,
+1142,Coordinate Reference System,32038,7302,NAD27 / Texas North Cen.,
+1143,Coordinate Reference System,32040,7302,NAD27 / Texas South Cen.,
+1144,Coordinate Reference System,32050,7302,NAD27 / West Virginia N,
+1145,Coordinate Reference System,32051,7302,NAD27 / West Virginia S,
+1146,Coordinate Reference System,32053,7302,NAD27 / Wisconsin Cen.,
+1147,Coordinate Reference System,32056,7302,NAD27 / Wyoming E. Cen.,
+1148,Coordinate Reference System,32057,7302,NAD27 / Wyoming W. Cen.,
+1149,Coordinate Reference System,32113,7302,NAD83 / New Mexico Cent.,
+1150,Coordinate Reference System,32118,7302,NAD83 / New York Long Is,
+1151,Coordinate Reference System,32120,7302,NAD83 / North Dakota N,
+1152,Coordinate Reference System,32121,7302,NAD83 / North Dakota S,
+1153,Coordinate Reference System,32128,7302,NAD83 / Pennsylvania N,
+1154,Coordinate Reference System,32129,7302,NAD83 / Pennsylvania S,
+1155,Coordinate Reference System,32134,7302,NAD83 / South Dakota N,
+1156,Coordinate Reference System,32135,7302,NAD83 / South Dakota S,
+1157,Coordinate Reference System,32138,7302,NAD83 / Texas North Cen.,
+1158,Coordinate Reference System,32140,7302,NAD83 / Texas South Cen.,
+1159,Coordinate Reference System,32150,7302,NAD83 / West Virginia N,
+1160,Coordinate Reference System,32151,7302,NAD83 / West Virginia S,
+1161,Coordinate Reference System,32153,7302,NAD83 / Wisconsin Cen.,
+1162,Coordinate Reference System,32156,7302,NAD83 / Wyoming E. Cen.,
+1163,Coordinate Reference System,32157,7302,NAD83 / Wyoming W. Cen.,
+1164,Unit of Measure,9001,7306,m,
+1165,Unit of Measure,9002,7306,ft,
+1166,Unit of Measure,9003,7306,ftUS,
+1167,Unit of Measure,9005,7306,ftCla,
+1168,Unit of Measure,9014,7306,fathom,
+1169,Unit of Measure,9030,7306,nautmi,
+1170,Unit of Measure,9031,7306,mGer,
+1171,Unit of Measure,9033,7306,chUS,
+1172,Unit of Measure,9034,7306,lkUS,
+1173,Unit of Measure,9035,7306,miUS,
+1174,Unit of Measure,9036,7306,km,
+1175,Unit of Measure,9037,7306,ydCla,
+1176,Unit of Measure,9038,7306,chCla,
+1177,Unit of Measure,9039,7306,lkCla,
+1178,Unit of Measure,9040,7306,ydSe,
+1179,Unit of Measure,9041,7306,ftSe,
+1180,Unit of Measure,9042,7306,chSe,
+1181,Unit of Measure,9043,7306,lkSe,
+1182,Unit of Measure,9050,7306,ydBnA,
+1183,Unit of Measure,9051,7306,ftBnA,
+1184,Unit of Measure,9052,7306,chBnA,
+1185,Unit of Measure,9053,7306,lkBnA,
+1186,Unit of Measure,9060,7306,ydBnB,
+1187,Unit of Measure,9061,7306,ftBnB,
+1188,Unit of Measure,9062,7306,chBnB,
+1189,Unit of Measure,9063,7306,lkBnB,
+1190,Unit of Measure,9070,7306,ftBr(65),
+1191,Unit of Measure,9080,7306,ftInd,
+1192,Unit of Measure,9081,7306,ftInd(37),
+1193,Unit of Measure,9082,7306,ftInd(62),
+1194,Unit of Measure,9083,7306,ftInd(75),
+1195,Unit of Measure,9084,7306,ydInd,
+1196,Unit of Measure,9085,7306,ydInd(37),
+1197,Unit of Measure,9086,7306,ydInd(62),
+1198,Unit of Measure,9087,7306,ydInd(75),
+1199,Unit of Measure,9093,7306,mi,
+1200,Unit of Measure,9094,7306,ftGC,
+1201,Unit of Measure,9101,7306,rad,
+1202,Unit of Measure,9102,7306,dega,
+1203,Unit of Measure,9103,7306,mina,
+1204,Unit of Measure,9104,7306,seca,
+1205,Unit of Measure,9105,7306,gr,
+1206,Unit of Measure,9106,7306,gon,
+1207,Unit of Measure,9107,7306,dega,
+1208,Unit of Measure,9108,7306,dega,
+1209,Unit of Measure,9109,7306,urad,
+1210,Unit of Measure,9110,7306,dega,
+1211,Unit of Measure,9111,7306,dega,
+1212,Unit of Measure,9112,7306,cgr,
+1213,Unit of Measure,9113,7306,ccgr,
+1214,Unit of Measure,9114,7306,mila,
+1215,Coordinate_Operation Method,9824,7302,UTM grid system,
+1216,Coordinate Reference System,4143,7301,C�te D'Ivoire,Same alias also applied to Locodjo 1965 (code 4142).
+1217,Coordinate Reference System,4143,7301,Port Bouet,Same alias also applied to Locodjo 1965 (code 4142).
+1218,Coordinate Reference System,4142,7301,Port Bouet,Same alias also applied to Abidjan 1987 (code 4143).
+1219,Coordinate Reference System,4142,7301,C�te D'Ivoire,Same alias also applied to Abidjan 1987 (code 4143).
+1220,Coordinate Reference System,2164,7301,Cote d'Ivoire / TM 5 NW,Same alias used for Abidjan 1987 / TM 5 NW (code 2165).
+1221,Coordinate Reference System,2164,7301,Port Bouet / TM 5 NW,Same alias used for Abidjan 1987 / TM 5 NW (code 2165).
+1222,Coordinate Reference System,2165,7301,Cote d'Ivoire / TM 5 NW,Same alias used for Locodjo 1965 / TM 5 NW (code 2164).
+1223,Coordinate Reference System,2165,7301,Port Bouet / TM 5 NW,Same alias used for Abidjan 1987 / TM 5 NW (code 2165).
+1224,Coordinate_Operation,1588,7301,ED50 to EUREF89 (1),
+1225,Coordinate_Operation,1588,7301,ED50 to ETRF89 (1),
+1227,Coordinate_Operation,1589,7301,ED50 to EUREF89 (3),
+1229,Datum,6181,7301,LUREF,
+1230,Datum,6180,7302,EST97,
+1231,Datum,6179,7301,42/58,
+1232,Datum,6178,7301,42/83,
+1233,Datum,6312,7308,HR1901,
+1234,Datum,6312,7309,D48,
+1235,Coordinate_Operation Method,9807,7301,Gauss-Kruger,
+1236,Coordinate_Operation Method,9807,7302,TM,
+1237,Datum,6818,7301,Jednotn� Trigonometrick� S�te Katastr�ln� (Ferro),
+1238,Coordinate Reference System,2393,7301,KKJ / Basic Coordinate System zone 3,
+1239,Coordinate Reference System,2391,7301,KKJ / Basic Coordinate System zone 1,
+1240,Coordinate Reference System,2392,7301,KKJ / Basic Coordinate System zone 2,
+1241,Coordinate Reference System,2394,7301,KKJ / Basic Coordinate System zone 4,
+1242,Coordinate Reference System,31467,7301,DHDN / 3-degree Gauss-Kruger zone 3,
+1243,Coordinate Reference System,31468,7301,DHDN / 3-degree Gauss-Kruger zone 4,
+1244,Coordinate Reference System,31469,7301,DHDN / 3-degree Gauss-Kruger zone 5,
+1247,Coordinate Reference System,4178,7301,42/83,
+1248,Coordinate Reference System,31466,7301,DHDN / 3-degree Gauss-Kruger zone 2,
+1249,Coordinate Reference System,2166,7301,Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 3,
+1250,Coordinate Reference System,2167,7301,Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 4,
+1251,Coordinate Reference System,4181,7301,LUREF,
+1253,Coordinate Reference System,4258,7301,EUREF89,
+1254,Coordinate Reference System,2170,7301,EUREF89 / CS92,
+1255,Coordinate Reference System,4312,7308,HR1901,
+1256,Coordinate Reference System,4312,7309,D48,
+1257,Coordinate Reference System,4805,7308,HR1901 (Ferro),
+1258,Coordinate Reference System,4805,7309,D48 (Ferro),
+1259,Coordinate Reference System,31275,7308,HDKS zone 5,HDKS = Hrvatski Drzavni Koordinatni Sustav
+1260,Coordinate Reference System,31276,7308,HDKS zone 6,HDKS = Hrvatski Drzavni Koordinatni Sustav
+1261,Coordinate Reference System,31275,7309,D48 zone 5,
+1262,Coordinate Reference System,2169,7301,LUREF / Gauss,
+1263,Coordinate Reference System,31467,7310,PD/83 / Gauss-Kruger zone 3,PD/83 is the result of the transformation from Pulkovo 1942(83) to DHDN for Thuringen.
+1264,Coordinate Reference System,31468,7310,PD/83 / Gauss-Kruger zone 4,PD/83 is the result of the transformation from Pulkovo 1942(83) to DHDN for Thuringen.
+1265,Coordinate Reference System,31468,7310,RD/83 / Gauss-Kruger zone 4,RD/83 is the result of the transformation from Pulkovo 1942(83) to DHDN for Sachsen.
+1266,Coordinate Reference System,31469,7310,RD/83 / Gauss-Kruger zone 4,RD/83 is the result of the transformation from Pulkovo 1942(83) to DHDN for Sachsen.
+1267,Coordinate_Operation,1620,7308,HR1901 to ETRS89 (2),
+1268,Coordinate_Operation,1619,7307,AT_MGI to ETRS89,
+1269,Coordinate_Operation,1622,7307,CZ_S-JTSK to ETRS89,
+1270,Coordinate_Operation,1620,7307,HR_HDKS to ETRS89,
+1271,Coordinate_Operation,1624,7307,SK_S-JTSK to ETRS89,
+1272,Coordinate_Operation,1626,7307,DK_ED50 to ETRS89,
+1273,Coordinate_Operation,1628,7307,GI_ED50 to ETRS89,
+1274,Coordinate_Operation,1630,7307,ES_ED50 (BAL99) to ETRS89,
+1275,Coordinate_Operation,1632,7307,ES_ED50 (EST99) to ETRS89,
+1276,Coordinate_Operation,1634,7307,ES_ED50 (ZNW99) to ETRS89,
+1277,Coordinate_Operation,1636,7307,TR_ED50 to ETRS89,
+1278,Coordinate_Operation,1638,7307,FI_KKJ to ETRS89,
+1279,Coordinate_Operation,1640,7307,IE_Ireland65 to ETRS89,IE_Ireland65 to ETRS89 applies to the Republic of Ireland. Also referred to in EuroGeographics as NI_Ireland65 to ETRS89 for Northern Ireland.
+1280,Coordinate_Operation,1642,7307,LU_LUREF to ETRS89,
+1281,Coordinate_Operation,1644,7307,PL_42/58 to ETRS89,
+1282,Coordinate_Operation,1646,7307,CH_CH1903 to ETRS89,
+1283,Coordinate_Operation,1647,7307,CH_CH1903+ to ETRS89,
+1284,Coordinate_Operation,1648,7307,EE_L-EST97 to ETRS89,
+1285,Coordinate_Operation,1650,7307,FR_ED50 to ETRS89,
+1286,Coordinate_Operation,1651,7307,FR_NTF to ETRS89,
+1287,Coordinate_Operation,1653,7307,NO_NGO1948 to ETRS89,
+1288,Coordinate_Operation,1657,7307,PT_D73 to ETRS89,
+1289,Coordinate_Operation,1655,7307,PT_DLX(HAY) to ETRS89,
+1290,Coordinate_Operation,1652,7307,BE_BD72 to ETRS89,
+1291,Coordinate Reference System,31282,7302,MGI / Austria Central,
+1292,Coordinate Reference System,31283,7302,MGI / Austria East,
+1293,Coordinate Reference System,31281,7302,MGI / Austria West,
+1294,Datum,6176,7302,AAD98,
+1295,Coordinate Reference System,4176,7302,AAD98,
+1296,Datum,6167,7302,NZGD2000,
+1297,Coordinate Reference System,2193,7302,NZGD2000 / NZTM,
+1298,Coordinate_Operation,19971,7302,NZTM,
+1299,Datum,6186,7302,S-JTSK,
+1300,Datum,5119,7301,Nivellement general de la France,This alias is also used for other datum realisations: see NGF - Lallemand (code 5118) and NGF - IGN78 (code 5120).
+1301,Datum,5119,7301,NGF,This alias is also used for other datum realisations: see NGF - Lallemand (code 5118) and NGF - IGN78 (code 5120).
+1302,Datum,5120,7301,NGF,This alias is also used for other datum realisations: see NGF - Lallemand (code 5118) and NGF - IGN69 (code 5119).
+1303,Datum,5118,7301,NGF,This alias is also used for other datum realisations: see NGF - IGN69 (code 5119) and NGF - IGN78 (code 5120).
+1304,Datum,5120,7301,Nivellement general de la France,This alias is also used for other datum realisations: see NGF - Lallemand (code 5118) and NGF - IGN69 (code 5119).
+1305,Datum,5118,7301,Nivellement general de la France,This alias is also used for other datum realisations: see NGF - IGN69 (code 5119) and NGF - IGN78 (code 5120).
+1306,Datum,6143,7301,C�te D'Ivoire (Ivory Coast),This alias is not unique: it is also used for code 6142.
+1307,Datum,6142,7301,C�te D'Ivoire (Ivory Coast),This alias is not unique: it is also used for code 6143.
+1308,Coordinate Reference System,4300,7301,1975 Mapping Adjustment,
+1309,Coordinate Reference System,2196,7301,EUREF89 / Kp2000 Jutland,
+1310,Coordinate Reference System,2196,7301,System 2000 Jylland zoner,
+1311,Coordinate Reference System,2197,7301,EUREF89 / Kp2000 Zealand,
+1312,Coordinate Reference System,2197,7301,System 2000 Sjaelland zoner,
+1313,Coordinate Reference System,2198,7301,EUREF89 / Kp2000 Bornholm,
+1314,Coordinate Reference System,2198,7301,System 2000 Bornholm zoner,
+1315,Datum,6189,7301,SIRGAS-REGVEN,
+1316,Datum,6189,7302,REGVEN,
+1317,datum,6171,7300,R�seau G�od�sique Fran�ais 1993,
+1318,datum,6172,7300,Posiciones Geod�sicas Argentinas,
+1319,datum,6186,7300,Jednotn� Trigonometrick� S�te Katastr�ln�,
+1320,Coordinate Reference System,4314,7310,PD/83,Used for describing result of transformation from Pulkovo 1942(83) to DHDN for Thuringen.
+1321,Coordinate Reference System,4314,7310,RD/83,Used for describing result of transformation from Pulkovo 1942(83) to DHDN for Sachsen.
+1322,Coordinate_Operation,15304,7302,Arizona East (ft),
+1323,Coordinate_Operation,15305,7302,Arizona Central (ft),
+1324,Coordinate_Operation,15306,7302,Arizona West (ft),
+1325,Coordinate_Operation,15307,7302,California zone 1 (ftUS),
+1326,Coordinate_Operation,15308,7302,California zone 2 (ftUS),
+1327,Coordinate_Operation,15309,7302,California zone 3 (ftUS),
+1328,Coordinate_Operation,15310,7302,California zone 4 (ftUS),
+1329,Coordinate_Operation,15311,7302,California zone 5 (ftUS),
+1330,Coordinate_Operation,15312,7302,California zone 6 (ftUS),
+1331,Coordinate_Operation,15313,7302,Colorado North (ftUS),
+1332,Coordinate_Operation,15314,7302,Colorado Central (ftUS),
+1333,Coordinate_Operation,15315,7302,Colorado South (ftUS),
+1334,Coordinate_Operation,15316,7301,Connecticut (ft US),
+1335,Coordinate_Operation,15317,7302,Delaware (ftUS),
+1336,Coordinate_Operation,15318,7301,Florida East (ft US),
+1337,Coordinate_Operation,15319,7302,Florida West (ftUS),
+1338,Coordinate_Operation,15320,7302,Florida North (ftUS),
+1339,Coordinate_Operation,15321,7302,Georgia East (ftUS),
+1340,Coordinate_Operation,15322,7302,Georgia West (ftUS),
+1341,Coordinate_Operation,15323,7302,Idaho East (ftUS),
+1342,Coordinate_Operation,15324,7302,Idaho Central (ftUS),
+1343,Coordinate_Operation,15325,7302,Idaho West (ftUS),
+1344,Coordinate_Operation,15326,7302,Indiana East (ftUS),
+1345,Coordinate_Operation,15327,7302,Indiana West (ftUS),
+1346,Coordinate_Operation,15328,7302,Kentucky North (ftUS),
+1347,Coordinate_Operation,15329,7302,Kentucky South (ftUS),
+1348,Coordinate_Operation,15330,7302,Maryland (ftUS),
+1349,Coordinate_Operation,15331,7302,Massachusetts Mainland (ftUS),
+1350,Coordinate_Operation,15332,7302,Massachusetts Island (ftUS),
+1351,Coordinate_Operation,15333,7302,Michigan North (ft),
+1352,Coordinate_Operation,15334,7302,Michigan Central (ft),
+1353,Coordinate_Operation,15335,7302,Michigan South (ft),
+1354,Coordinate_Operation,15336,7302,Mississippi East (ftUS),
+1355,Coordinate_Operation,15337,7302,Mississippi West (ftUS),
+1356,Coordinate_Operation,15338,7301,Montana (ftUS),
+1357,Coordinate_Operation,15339,7302,New Mexico East (ftUS),
+1358,Coordinate_Operation,15340,7302,New Mexico Central (ftUS),
+1359,Coordinate_Operation,15341,7302,New Mexico West (ftUS),
+1360,Coordinate_Operation,15342,7302,New York East (ftUS),
+1361,Coordinate_Operation,15343,7302,New York Central (ftUS),
+1362,Coordinate_Operation,15344,7302,New York West (ftUS),
+1363,Coordinate_Operation,15345,7302,New York Long Island (ftUS),
+1364,Coordinate_Operation,15346,7302,North Carolina (ftUS),
+1365,Coordinate_Operation,15347,7302,North Dakota North (ft),
+1366,Coordinate_Operation,15348,7302,North Dakota South (ft),
+1367,Coordinate_Operation,15349,7302,Oklahoma North (ftUS),
+1368,Coordinate_Operation,15350,7302,Oklahoma South (ftUS),
+1369,Coordinate_Operation,15351,7302,Oregon North (ft),
+1370,Coordinate_Operation,15352,7302,Oregon South (ft),
+1371,Coordinate_Operation,15353,7302,Pennsylvania North (ftUS),
+1372,Coordinate_Operation,15354,7301,Pennsylvania South (ftUS),
+1373,Coordinate_Operation,15355,7302,South Carolina (ft),
+1374,Coordinate_Operation,15356,7302,Tennessee (ftUS),
+1375,Coordinate_Operation,15357,7302,Texas North (ftUS),
+1376,Coordinate_Operation,15358,7302,Texas North Central (ftUS),
+1377,Coordinate_Operation,15359,7302,Texas Central (ftUS),
+1378,Coordinate_Operation,15360,7302,Texas South Central (ftUS),
+1379,Coordinate_Operation,15361,7302,Texas South (ftUS),
+1380,Coordinate_Operation,15362,7302,Utah North (ft),
+1381,Coordinate_Operation,15363,7302,Utah Central (ft),
+1382,Coordinate_Operation,15364,7302,Utah South (ft),
+1383,Coordinate_Operation,15365,7302,Virginia North (ftUS),
+1384,Coordinate_Operation,15366,7302,Virginia South (ftUS),
+1385,Coordinate_Operation,15367,7302,Washington North (ftUS),
+1386,Coordinate_Operation,15368,7302,Washington South (ftUS),
+1387,Coordinate_Operation,15369,7302,Wisconsin North (ftUS),
+1388,Coordinate_Operation,15370,7302,Wisconsin Central (ftUS),
+1389,Coordinate_Operation,15371,7302,Wisconsin South (ftUS),
+1390,datum,6190,7302,POSGAR 98,
+1391,datum,6190,7300,Posiciones Geod�sicas Argentinas 1998,
+1392,Coordinate Reference System,4190,7301,National Geodetic System [Argentina],see http://www.igm.gov.ar/posgar.html
+1393,datum,6182,7301,Observatario Flores,
+1394,datum,6182,7302,Azores Occidental 1939,
+1395,datum,6183,7301,Graciosa Base SW,
+1396,datum,6183,7302,Azores Central 1948,
+1397,datum,6184,7301,Sao Bras,
+1398,datum,6184,7302,Azores Oriental 1940,
+1399,Coordinate Reference System,4182,7301,Observatorio Flores,
+1400,Coordinate Reference System,4183,7301,Graciosa,
+1401,Coordinate Reference System,4184,7301,Sao Braz,
+1402,Coordinate_Operation,18084,7301,France zone IV,
+1403,Coordinate_Operation,18083,7301,France zone III,
+1404,Coordinate_Operation,18082,7301,France zone II,
+1405,Coordinate_Operation,18081,7301,France zone I,
+1406,Coordinate_Operation,18093,7301,Sud France,
+1407,Coordinate_Operation,18094,7301,Corse,
+1408,Coordinate_Operation,18092,7301,Centre France,
+1409,Coordinate_Operation,18091,7301,Nord France,
+1410,Coordinate Reference System,27561,7301,NTF (Paris) / Nord France,
+1411,Coordinate Reference System,27562,7301,NTF (Paris) / Centre France,
+1412,Coordinate Reference System,27563,7301,NTF (Paris) / Sud France,
+1413,Coordinate Reference System,27564,7301,NTF (Paris) / Corse,
+1414,Coordinate Reference System,27571,7301,NTF (Paris) / France I,
+1415,Coordinate Reference System,27572,7301,NTF (Paris) / France II,
+1416,Coordinate Reference System,27573,7301,NTF (Paris) / France III,
+1417,Coordinate Reference System,27574,7301,NTF (Paris) / France IV,
+1418,Coordinate Reference System,27572,7301,NTF (Paris) / Lambert zone II Etendue,
+1419,datum,6156,7300,Jednotn� Trigonometrick� S�te Katastr�ln�,
+1421,Coordinate_Operation,1751,7301,Amersfoort to ETRF89 (1),
+1422,Coordinate Reference System,2168,7301,Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 5,
+1423,Coordinate_Operation,15302,7302,Tennessee,
+1424,Coordinate_Operation,16269,7302,3-degree Gauss zone 9,
+1425,Coordinate_Operation,16270,7302,3-degree Gauss zone 10,
+1426,Coordinate_Operation,16271,7302,3-degree Gauss zone 11,
+1427,Coordinate_Operation,16272,7302,3-degree Gauss zone 12,
+1428,Coordinate_Operation,16273,7302,3-degree Gauss zone 13,
+1429,Coordinate_Operation,16274,7302,3-degree Gauss zone 14,
+1430,Coordinate_Operation,16275,7302,3-degree Gauss zone 15,
+1431,datum,6123,7300,Kartasto Koordinaati J�rjestelm� 1966,
+1432,Coordinate Reference System,2181,7301,ED50 / Turkey zone 9,
+1433,Coordinate Reference System,2182,7301,ED50 / Turkey zone 10,
+1434,Coordinate Reference System,2183,7301,ED50 / Turkey zone 11,
+1435,Coordinate Reference System,2184,7301,ED50 / Turkey zone 12,
+1436,Coordinate Reference System,2185,7301,ED50 / Turkey zone 13,
+1437,Coordinate Reference System,2186,7301,ED50 / Turkey zone 14,
+1438,Coordinate Reference System,2187,7301,ED50 / Turkey zone 15,
+1439,Coordinate Reference System,2188,7301,Observatorio Flores / UTM zone 25N,
+1440,Coordinate Reference System,2189,7301,Graciosa / UTM zone 26N,
+1441,Coordinate Reference System,2190,7301,Sao Braz / UTM zone 26N,
+1442,Coordinate_Operation,1781,7310,PD/83 to ETRS89,
+1443,Coordinate_Operation,1782,7310,RD/83 to ETRS89,
+1444,Coordinate Reference System,4207,7301,Lisbon 1937,
+1445,Coordinate Reference System,4803,7301,Lisbon 1937 (Lisbon),
+1446,Coordinate Reference System,20791,7301,Lisbon 1937 (Lisbon)/Portuguese Grid,
+1447,Coordinate Reference System,20790,7301,Lisbon 1937 (Lisbon)/Portuguese National Grid,
+1448,Coordinate_Operation,18411,7301,Afrique Occidentale Fran�aise Senegal zone,
+1449,Coordinate_Operation,18412,7301,Afrique Occidentale Fran�aise C�te d'Ivoire zone,
+1450,Coordinate_Operation,18413,7301,Afrique Occidentale Fran�aise Dahomey zone,
+1451,Coordinate_Operation,18415,7301,Afrique Equatoriale Fran�aise ouest zone,
+1452,Coordinate_Operation,18416,7301,Afrique Equatoriale Fran�aise centrale zone,
+1453,Coordinate_Operation,18417,7301,Afrique Equatoriale Fran�aise est zone,
+1454,Coordinate_Operation,18414,7301,Afrique Occidentale Fran�aise Niger zone,
+1455,Coordinate_Operation,18411,7302,AOF Senegal zone,
+1456,Coordinate_Operation,18412,7302,AOF C�te d'Ivoire zone,
+1457,Coordinate_Operation,18413,7302,AOF Dahomey zone,
+1458,Coordinate_Operation,18414,7302,AOF Niger zone,
+1459,Coordinate_Operation,18415,7302,AEF west,
+1460,Coordinate_Operation,18416,7302,AEF central,
+1461,Coordinate_Operation,18417,7302,AEF east,
+1462,Coordinate_Operation Method,9823,7301,Plate Carr�e,This alias only applies if the latitude of natural origin is at the equator.
+1464,Coordinate_Operation,1469,7301,C�te D'Ivoire to WGS 84 (1),Same alias also applied to Abidjan 1987 to WGS 84 (1) (code 1470).
+1465,Coordinate_Operation,1469,7301,Port Bouet to WGS 84 (1),Same alias also applied to Abidjan 1987 to WGS 84 (1) (code 1470).
+1466,Coordinate_Operation,1470,7301,C�te D'Ivoire to WGS 84 (1),Same alias also applied to Locodjo 1965 to WGS 84 (1) (code 1469).
+1467,Coordinate_Operation,1470,7301,Port Bouet to WGS 84 (1),Same alias also applied to Locodjo 1965 to WGS 84 (1) (code 1469).
+1468,Coordinate Reference System,2040,7301,Port Bouet / UTM zone 30N,Same alias used for Abidjan 1987 / UTM zone 30N (code 2041).
+1469,Coordinate Reference System,2040,7301,C�te d'Ivoire / UTM zone 30N,Same alias used for Abidjan 1987 / UTM zone 30N (code 2041).
+1470,Coordinate Reference System,2041,7301,Port Bouet / UTM zone 30N,Same alias used for Locodjo 1965 / UTM zone 30N (code 2040).
+1471,Coordinate Reference System,2041,7301,C�te d'Ivoire / UTM zone 30N,Same alias used for Locodjo 1965 / UTM zone 30N (code 2040).
+1472,Coordinate Reference System,2042,7301,Port Bouet / UTM zone 29N,Same alias used for Abidjan 1987 / UTM zone 29N (code 2043).
+1473,Coordinate Reference System,2042,7301,C�te d'Ivoire / UTM zone 29N,Same alias used for Abidjan 1987 / UTM zone 29N (code 2043).
+1474,Coordinate Reference System,2043,7301,Port Bouet / UTM zone 29N,Same alias used for Locodjo 1965 / UTM zone 29N (code 2042).
+1475,Coordinate Reference System,2043,7301,C�te d'Ivoire / UTM zone 29N,Same alias used for Locodjo 1965 / UTM zone 29N (code 2042).
+1479,Coordinate_Operation,18421,7301,Greenland zone 1 west,
+1480,Coordinate_Operation,18428,7301,Greenland zone 8 west,
+1481,Coordinate Reference System,2297,7301,Qornoq 1927 / Greenland zone 1 west,
+1482,Coordinate Reference System,2307,7301,Qornoq 1927 / Greenland zone 8 west,
+1483,Coordinate Reference System,32113,7301,NAD83 / New Mexico Central (m),
+1484,Coordinate Reference System,26949,7301,NAD83 / Arizona Central (m),
+1485,Coordinate Reference System,26929,7301,NAD83 / Alabama East (m),
+1486,Coordinate Reference System,26930,7301,NAD83 / Alabama West (m),
+1487,Coordinate Reference System,26931,7301,NAD83 / Alaska zone 1 (m),
+1488,Coordinate Reference System,26940,7301,NAD83 / Alaska zone 10 (m),
+1489,Coordinate Reference System,26932,7301,NAD83 / Alaska zone 2 (m),
+1490,Coordinate Reference System,26933,7301,NAD83 / Alaska zone 3 (m),
+1491,Coordinate Reference System,26934,7301,NAD83 / Alaska zone 4 (m),
+1492,Coordinate Reference System,26935,7301,NAD83 / Alaska zone 5 (m),
+1493,Coordinate Reference System,26936,7301,NAD83 / Alaska zone 6 (m),
+1494,Coordinate Reference System,26937,7301,NAD83 / Alaska zone 7 (m),
+1495,Coordinate Reference System,26938,7301,NAD83 / Alaska zone 8 (m),
+1496,Coordinate Reference System,26939,7301,NAD83 / Alaska zone 9 (m),
+1497,Coordinate Reference System,26948,7301,NAD83 / Arizona East (m),
+1498,Coordinate Reference System,26950,7301,NAD83 / Arizona West (m),
+1499,Coordinate Reference System,26951,7301,NAD83 / Arkansas North (m),
+1500,Coordinate Reference System,26952,7301,NAD83 / Arkansas South (m),
+1501,Coordinate Reference System,26941,7301,NAD83 / California zone 1 (m),
+1502,Coordinate Reference System,26942,7301,NAD83 / California zone 2 (m),
+1503,Coordinate Reference System,26943,7301,NAD83 / California zone 3 (m),
+1504,Coordinate Reference System,26944,7301,NAD83 / California zone 4 (m),
+1505,Coordinate Reference System,26945,7301,NAD83 / California zone 5 (m),
+1506,Coordinate Reference System,26946,7301,NAD83 / California zone 6 (m),
+1507,Coordinate Reference System,26954,7301,NAD83 / Colorado Central (m),
+1508,Coordinate Reference System,26953,7301,NAD83 / Colorado North (m),
+1509,Coordinate Reference System,26955,7301,NAD83 / Colorado South (m),
+1510,Coordinate Reference System,26956,7301,NAD83 / Connecticut (m),
+1511,Coordinate Reference System,26957,7301,NAD83 / Delaware (m),
+1512,Coordinate Reference System,26958,7301,NAD83 / Florida East (m),
+1513,Coordinate Reference System,26960,7301,NAD83 / Florida North (m),
+1514,Coordinate Reference System,26959,7301,NAD83 / Florida West (m),
+1515,Coordinate Reference System,26966,7301,NAD83 / Georgia East (m),
+1516,Coordinate Reference System,26967,7301,NAD83 / Georgia West (m),
+1517,Coordinate Reference System,26961,7301,NAD83 / Hawaii zone 1 (m),
+1518,Coordinate Reference System,26962,7301,NAD83 / Hawaii zone 2 (m),
+1519,Coordinate Reference System,26963,7301,NAD83 / Hawaii zone 3 (m),
+1520,Coordinate Reference System,26964,7301,NAD83 / Hawaii zone 4 (m),
+1521,Coordinate Reference System,26965,7301,NAD83 / Hawaii zone 5 (m),
+1522,Coordinate Reference System,26969,7301,NAD83 / Idaho Central (m),
+1523,Coordinate Reference System,26968,7301,NAD83 / Idaho East (m),
+1524,Coordinate Reference System,26970,7301,NAD83 / Idaho West (m),
+1525,Coordinate Reference System,26971,7301,NAD83 / Illinois East (m),
+1526,Coordinate Reference System,26972,7301,NAD83 / Illinois West (m),
+1527,Coordinate Reference System,26973,7301,NAD83 / Indiana East (m),
+1528,Coordinate Reference System,26974,7301,NAD83 / Indiana West (m),
+1529,Coordinate Reference System,26975,7301,NAD83 / Iowa North (m),
+1530,Coordinate Reference System,26976,7301,NAD83 / Iowa South (m),
+1531,Coordinate Reference System,26977,7301,NAD83 / Kansas North (m),
+1532,Coordinate Reference System,26978,7301,NAD83 / Kansas South (m),
+1533,Coordinate Reference System,2205,7301,NAD83 / Kentucky North (m),
+1534,Coordinate Reference System,26980,7301,NAD83 / Kentucky South (m),
+1535,Coordinate Reference System,26981,7301,NAD83 / Louisiana North (m),
+1536,Coordinate Reference System,26982,7301,NAD83 / Louisiana South (m),
+1537,Coordinate Reference System,26983,7301,NAD83 / Maine East (m),
+1538,Coordinate Reference System,26984,7301,NAD83 / Maine West (m),
+1539,Coordinate Reference System,26985,7301,NAD83 / Maryland (m),
+1540,Coordinate Reference System,26987,7301,NAD83 / Massachusetts Island (m),
+1541,Coordinate Reference System,26986,7301,NAD83 / Massachusetts Mainland (m),
+1542,Coordinate Reference System,26989,7301,NAD83 / Michigan Central (m),
+1543,Coordinate Reference System,26988,7301,NAD83 / Michigan North (m),
+1544,Coordinate Reference System,26990,7301,NAD83 / Michigan South (m),
+1545,Coordinate Reference System,26992,7301,NAD83 / Minnesota Central (m),
+1546,Coordinate Reference System,26991,7301,NAD83 / Minnesota North (m),
+1547,Coordinate Reference System,26993,7301,NAD83 / Minnesota South (m),
+1548,Coordinate Reference System,26994,7301,NAD83 / Mississippi East (m),
+1549,Coordinate Reference System,26995,7301,NAD83 / Mississippi West (m),
+1550,Coordinate Reference System,26997,7301,NAD83 / Missouri Central (m),
+1551,Coordinate Reference System,26996,7301,NAD83 / Missouri East (m),
+1552,Coordinate Reference System,26998,7301,NAD83 / Missouri West (m),
+1553,Coordinate Reference System,32100,7301,NAD83 / Montana (m),
+1554,Coordinate Reference System,32104,7301,NAD83 / Nebraska (m),
+1555,Coordinate Reference System,32108,7301,NAD83 / Nevada Central (m),
+1556,Coordinate Reference System,32107,7301,NAD83 / Nevada East (m),
+1557,Coordinate Reference System,32109,7301,NAD83 / Nevada West (m),
+1558,Coordinate Reference System,32110,7301,NAD83 / New Hampshire (m),
+1559,Coordinate Reference System,32111,7301,NAD83 / New Jersey (m),
+1560,Coordinate Reference System,32112,7301,NAD83 / New Mexico East (m),
+1561,Coordinate Reference System,32114,7301,NAD83 / New Mexico West (m),
+1562,Coordinate Reference System,32116,7301,NAD83 / New York Central (m),
+1563,Coordinate Reference System,32115,7301,NAD83 / New York East (m),
+1564,Coordinate Reference System,32118,7301,NAD83 / New York Long Island (m),
+1565,Coordinate Reference System,32117,7301,NAD83 / New York West (m),
+1566,Coordinate Reference System,32119,7301,NAD83 / North Carolina (m),
+1567,Coordinate Reference System,32120,7301,NAD83 / North Dakota North (m),
+1568,Coordinate Reference System,32121,7301,NAD83 / North Dakota South (m),
+1569,Coordinate Reference System,32122,7301,NAD83 / Ohio North (m),
+1570,Coordinate Reference System,32123,7301,NAD83 / Ohio South (m),
+1571,Coordinate Reference System,32124,7301,NAD83 / Oklahoma North (m),
+1572,Coordinate Reference System,32125,7301,NAD83 / Oklahoma South (m),
+1573,Coordinate Reference System,32126,7301,NAD83 / Oregon North (m),
+1574,Coordinate Reference System,32127,7301,NAD83 / Oregon South (m),
+1575,Coordinate Reference System,32128,7301,NAD83 / Pennsylvania North (m),
+1576,Coordinate Reference System,32129,7301,NAD83 / Pennsylvania South (m),
+1577,Coordinate Reference System,32130,7301,NAD83 / Rhode Island (m),
+1578,Coordinate Reference System,32133,7301,NAD83 / South Carolina (m),
+1579,Coordinate Reference System,32134,7301,NAD83 / South Dakota North (m),
+1580,Coordinate Reference System,32135,7301,NAD83 / South Dakota South (m),
+1581,Coordinate Reference System,32136,7301,NAD83 / Tennessee (m),
+1582,Coordinate Reference System,32139,7301,NAD83 / Texas Central (m),
+1583,Coordinate Reference System,32137,7301,NAD83 / Texas North (m),
+1584,Coordinate Reference System,32138,7301,NAD83 / Texas North Central (m),
+1585,Coordinate Reference System,32141,7301,NAD83 / Texas South (m),
+1586,Coordinate Reference System,32140,7301,NAD83 / Texas South Central (m),
+1587,Coordinate Reference System,32143,7301,NAD83 / Utah Central (m),
+1588,Coordinate Reference System,32142,7301,NAD83 / Utah North (m),
+1589,Coordinate Reference System,32144,7301,NAD83 / Utah South (m),
+1590,Coordinate Reference System,32145,7301,NAD83 / Vermont (m),
+1591,Coordinate Reference System,32146,7301,NAD83 / Virginia North (m),
+1592,Coordinate Reference System,32147,7301,NAD83 / Virginia South (m),
+1593,Coordinate Reference System,32148,7301,NAD83 / Washington North (m),
+1594,Coordinate Reference System,32149,7301,NAD83 / Washington South (m),
+1595,Coordinate Reference System,32150,7301,NAD83 / West Virginia North (m),
+1596,Coordinate Reference System,32151,7301,NAD83 / West Virginia South (m),
+1597,Coordinate Reference System,32153,7301,NAD83 / Wisconsin Central (m),
+1598,Coordinate Reference System,32152,7301,NAD83 / Wisconsin North (m),
+1599,Coordinate Reference System,32154,7301,NAD83 / Wisconsin South (m),
+1600,Coordinate Reference System,32155,7301,NAD83 / Wyoming East (m),
+1601,Coordinate Reference System,32156,7301,NAD83 / Wyoming East Central (m),
+1602,Coordinate Reference System,32158,7301,NAD83 / Wyoming West (m),
+1603,Coordinate Reference System,32157,7301,NAD83 / Wyoming West Central (m),
+1604,Coordinate Reference System,32161,7301,NAD83 / Puerto Rico & Virgin Is. (m),
+1605,Coordinate_Operation,10131,7301,Alabama CS83 East zone,
+1606,Coordinate_Operation,10132,7301,Alabama CS83 West zone,
+1607,Coordinate_Operation,10231,7301,Arizona CS83 East zone,
+1608,Coordinate_Operation,10232,7301,Arizona CS83 Central zone,
+1609,Coordinate_Operation,10233,7301,Arizona CS83 West zone,
+1610,Coordinate_Operation,10331,7301,Arkansas CS83 North zone,
+1611,Coordinate_Operation,10332,7301,Arkansas CS83 South zone,
+1612,Coordinate_Operation,10431,7301,California CS83 zone 1,
+1613,Coordinate_Operation,10432,7301,California CS83 zone 2,
+1614,Coordinate_Operation,10433,7301,California CS83 zone 3,
+1615,Coordinate_Operation,10434,7301,California CS83 zone 4,
+1616,Coordinate_Operation,10435,7301,California CS83 zone 5,
+1617,Coordinate_Operation,10436,7301,California CS83 zone 6,
+1618,Coordinate_Operation,10531,7301,Colorado CS83 North zone,
+1619,Coordinate_Operation,10532,7301,Colorado CS83 Central zone,
+1620,Coordinate_Operation,10533,7301,Colorado CS83 South zone,
+1621,Coordinate_Operation,10630,7301,Connecticut CS83,
+1622,Coordinate_Operation,10730,7301,Delaware CS83,
+1623,Coordinate_Operation,10931,7301,Florida CS83 East zone,
+1624,Coordinate_Operation,10932,7301,Florida CS83 West zone,
+1625,Coordinate_Operation,10933,7301,Florida CS83 North zone,
+1626,Coordinate_Operation,11031,7301,Georgia CS83 East zone,
+1627,Coordinate_Operation,11032,7301,Georgia CS83 West zone,
+1628,Coordinate_Operation,11131,7301,Idaho CS83 East zone,
+1629,Coordinate_Operation,11132,7301,Idaho CS83 Central zone,
+1630,Coordinate_Operation,11133,7301,Idaho CS83 West zone,
+1631,Coordinate_Operation,11231,7301,Illinois CS83 East zone,
+1632,Coordinate_Operation,11232,7301,Illinois CS83 West zone,
+1633,Coordinate_Operation,11331,7301,Indiana CS83 East zone,
+1634,Coordinate_Operation,11332,7301,Indiana CS83 West zone,
+1635,Coordinate_Operation,11431,7301,Iowa CS83 North zone,
+1636,Coordinate_Operation,11432,7301,Iowa CS83 South zone,
+1637,Coordinate_Operation,11531,7301,Kansas CS83 North zone,
+1638,Coordinate_Operation,11532,7301,Kansas CS83 South zone,
+1640,Coordinate_Operation,11632,7301,Kentucky CS83 South zone,
+1641,Coordinate_Operation,11731,7301,Louisiana CS83 North zone,
+1642,Coordinate_Operation,11732,7301,Louisiana CS83 South zone,
+1643,Coordinate_Operation,11831,7301,Maine CS83 East zone,
+1644,Coordinate_Operation,11832,7301,Maine CS83 West zone,
+1645,Coordinate_Operation,11930,7301,Maryland CS83,
+1646,Coordinate_Operation,12031,7301,Massachusetts CS83 Mainland zone,
+1647,Coordinate_Operation,12032,7301,Massachusetts CS83 Island zone,
+1648,Coordinate_Operation,12141,7301,Michigan CS83 North zone,
+1649,Coordinate_Operation,12142,7301,Michigan CS83 Central zone,
+1650,Coordinate_Operation,12143,7301,Michigan CS83 South zone,
+1651,Coordinate_Operation,12231,7301,Minnesota CS83 North zone,
+1652,Coordinate_Operation,12232,7301,Minnesota CS83 Central zone,
+1653,Coordinate_Operation,12233,7301,Minnesota CS83 South zone,
+1654,Coordinate_Operation,12331,7301,Mississippi CS83 East zone,
+1655,Coordinate_Operation,12332,7301,Mississippi CS83 West zone,
+1656,Coordinate_Operation,12431,7301,Missouri CS83 East zone,
+1657,Coordinate_Operation,12433,7301,Missouri CS83 West zone,
+1658,Coordinate_Operation,12530,7301,Montana CS83,
+1659,Coordinate_Operation,12630,7301,Nebraska CS83,
+1660,Coordinate_Operation,12731,7301,Nevada CS83 East zone,
+1661,Coordinate_Operation,12732,7301,Nevada CS83 Central zone,
+1662,Coordinate_Operation,12733,7301,Nevada CS83 West zone,
+1663,Coordinate_Operation,12830,7301,New Hampshire CS83,
+1664,Coordinate_Operation,12930,7301,New Jersey CS83,
+1665,Coordinate_Operation,13031,7301,New Mexico CS83 East zone,
+1666,Coordinate_Operation,13032,7301,New Mexico CS83 Central zone,
+1667,Coordinate_Operation,13033,7301,New Mexico CS83 West zone,
+1668,Coordinate_Operation,13131,7301,New York CS83 East zone,
+1669,Coordinate_Operation,13132,7301,New York CS83 Central zone,
+1670,Coordinate_Operation,13133,7301,New York CS83 West zone,
+1671,Coordinate_Operation,13134,7301,New York CS83 Long Island zone,
+1672,Coordinate_Operation,13230,7301,North Carolina CS83,
+1673,Coordinate_Operation,13331,7301,North Dakota CS83 North zone,
+1674,Coordinate_Operation,13332,7301,North Dakota CS83 South zone,
+1675,Coordinate_Operation,13431,7301,Ohio CS83 North zone,
+1676,Coordinate_Operation,13432,7301,Ohio CS83 South zone,
+1677,Coordinate_Operation,13531,7301,Oklahoma CS83 North zone,
+1678,Coordinate_Operation,13532,7301,Oklahoma CS83 South zone,
+1679,Coordinate_Operation,13631,7301,Oregon CS83 North zone,
+1680,Coordinate_Operation,13632,7301,Oregon CS83 South zone,
+1681,Coordinate_Operation,13731,7301,Pennsylvania CS83 North zone,
+1682,Coordinate_Operation,13732,7301,Pennsylvania CS83 South zone,
+1683,Coordinate_Operation,13830,7301,Rhode Island CS83,
+1684,Coordinate_Operation,13930,7301,South Carolina CS83,
+1685,Coordinate_Operation,14031,7301,South Dakota CS83 North zone,
+1686,Coordinate_Operation,14032,7301,South Dakota CS83 South zone,
+1687,Coordinate_Operation,14130,7301,Tennessee CS83,
+1688,Coordinate_Operation,14231,7301,Texas CS83 North zone,
+1689,Coordinate_Operation,14232,7301,Texas CS83 North Central zone,
+1690,Coordinate_Operation,14233,7301,Texas CS83 Central zone,
+1691,Coordinate_Operation,14234,7301,Texas CS83 South Central zone,
+1692,Coordinate_Operation,14235,7301,Texas CS83 South zone,
+1693,Coordinate_Operation,14331,7301,Utah CS83 North zone,
+1694,Coordinate_Operation,14332,7301,Utah CS83 Central zone,
+1695,Coordinate_Operation,14333,7301,Utah CS83 South zone,
+1696,Coordinate_Operation,14430,7301,Vermont CS83,
+1697,Coordinate_Operation,14531,7301,Virginia CS83 North zone,
+1698,Coordinate_Operation,14532,7301,Virginia CS83 South zone,
+1699,Coordinate_Operation,14631,7301,Washington CS83 North zone,
+1700,Coordinate_Operation,14632,7301,Washington CS83 South zone,
+1701,Coordinate_Operation,14731,7301,West Virginia CS83 North zone,
+1702,Coordinate_Operation,14732,7301,West Virginia CS83 South zone,
+1703,Coordinate_Operation,14831,7301,Wisconsin CS83 North zone,
+1704,Coordinate_Operation,14832,7301,Wisconsin CS83 Central zone,
+1705,Coordinate_Operation,14833,7301,Wisconsin CS83 South zone,
+1706,Coordinate_Operation,14931,7301,Wyoming CS83 East zone,
+1707,Coordinate_Operation,14932,7301,Wyoming CS83 East Central zone,
+1708,Coordinate_Operation,14933,7301,Wyoming CS83 West Central zone,
+1709,Coordinate_Operation,14934,7301,Wyoming CS83 West zone,
+1710,Coordinate_Operation,15031,7301,Alaska CS83 zone 1,
+1711,Coordinate_Operation,15032,7301,Alaska CS83 zone 2,
+1712,Coordinate_Operation,15033,7301,Alaska CS83 zone 3,
+1713,Coordinate_Operation,15034,7301,Alaska CS83 zone 4,
+1714,Coordinate_Operation,15035,7301,Alaska CS83 zone 5,
+1715,Coordinate_Operation,15036,7301,Alaska CS83 zone 6,
+1716,Coordinate_Operation,15037,7301,Alaska CS83 zone 7,
+1717,Coordinate_Operation,15038,7301,Alaska CS83 zone 8,
+1718,Coordinate_Operation,15039,7301,Alaska CS83 zone 9,
+1719,Coordinate_Operation,15040,7301,Alaska CS83 zone 10,
+1720,Coordinate_Operation,15131,7301,Hawaii CS83 zone 1,
+1721,Coordinate_Operation,15132,7301,Hawaii CS83 zone 2,
+1722,Coordinate_Operation,15133,7301,Hawaii CS83 zone 3,
+1723,Coordinate_Operation,15134,7301,Hawaii CS83 zone 4,
+1724,Coordinate_Operation,15135,7301,Hawaii CS83 zone 5,
+1725,Coordinate_Operation,15230,7301,Puerto Rico & Virgin Islands CS83,
+1726,Coordinate_Operation,15303,7301,Kentucky CS83 North zone,
+1727,Coordinate_Operation,12432,7301,Missouri CS83 Central zone,
+1728,Coordinate_Operation,15303,7302,Kentucky North,
+1729,Coordinate_Operation,10532,7302,Colorado Central,
+1730,Coordinate Reference System,4282,7301,Congo 1960 Pointe Noire,
+1731,Coordinate Reference System,28232,7301,Congo 1960 Pointe Noire / UTM zone 32S,
+1732,Coordinate_Operation,1801,7301,Congo 1960 Pointe Noire to WGS 84 (2),
+1733,Coordinate_Operation,1802,7301,Congo 1960 Pointe Noire to WGS 84 (3),
+1734,Coordinate_Operation,1200,7301,Congo 1960 Pointe Noire to WGS 84 (1),
+1735,Coordinate_Operation,15914,7301,BLM zone 14N in feet,
+1736,Coordinate_Operation,15915,7301,BLM zone 15N in feet,
+1737,Coordinate_Operation,15916,7301,BLM zone 16N in feet,
+1738,Coordinate_Operation,15917,7301,BLM zone 17N in feet,
+1739,Coordinate Reference System,21149,7301,Genuk / UTM zone 49S,
+1740,Coordinate Reference System,2308,7301,Genuk / TM 109 SE,
+1741,Datum,5133,7302,AIOC95,
+1742,Coordinate Reference System,5705,7301,Kronshstadt,
+1743,Datum,6199,7301,New Egyptian,Old Egyptian is an alias for Egypt 1907 (code 6229).
+1744,Datum,6229,7301,Old Egyptian,New Egyptian is an alias for Egypt 1930 (code 6199).
+1745,Coordinate Reference System,4199,7301,New Egyptian,Old Egyptian is an alias for Egypt 1907 (code 4229).
+1746,Coordinate Reference System,4229,7301,Old Egyptian,New Egyptian is an alias for Egypt 1930 (code 4199).
+1747,Coordinate_Operation,1516,7301,PSAD56 to WGS 84,
+1748,Coordinate_Operation,1813,7301,Genuk to WGS 84 (ONWJ),
+1749,Coordinate Reference System,32064,7301,NAD27 / UTM zone 14N (ftUS),Non-metric equivalent of NAD27 / UTM zone 14N (code 26714). UTM is a metric system so strictly this is not UTM.
+1750,Coordinate Reference System,32065,7301,NAD27 / UTM zone 15N (ftUS),Non-metric equivalent of NAD27 / UTM zone 15N (code 26715). UTM is a metric system so strictly this is not UTM.
+1751,Coordinate Reference System,32066,7301,NAD27 / UTM zone 16N (ftUS),Non-metric equivalent of NAD27 / UTM zone 16N (code 26716). UTM is a metric system so strictly this is not UTM.
+1752,Coordinate Reference System,32067,7301,NAD27 / UTM zone 17N (ftUS),Non-metric equivalent of NAD27 / UTM zone 17N (code 26717). UTM is a metric system so strictly this is not UTM.
+1754,Coordinate Reference System,2319,7301,ED50 / 3-degree Gauss-Kruger CM 27E,
+1755,Coordinate Reference System,2320,7301,ED50 / 3-degree Gauss-Kruger CM 30E,
+1756,Coordinate Reference System,2321,7301,ED50 / 3-degree Gauss-Kruger CM 33E,
+1757,Coordinate Reference System,2322,7301,ED50 / 3-degree Gauss-Kruger CM 36E,
+1758,Coordinate Reference System,2323,7301,ED50 / 3-degree Gauss-Kruger CM 39E,
+1759,Coordinate Reference System,2324,7301,ED50 / 3-degree Gauss-Kruger CM 42E,
+1760,Coordinate Reference System,2325,7301,ED50 / 3-degree Gauss-Kruger CM 45E,
+1761,Datum,6612,7302,JGD2000,
+1762,Datum,5137,7301,Huang Hai 1985,
+1763,Datum,5135,7302,HKPD,
+1765,Coordinate Reference System,5736,7301,Huang Hai 1956,
+1766,Coordinate Reference System,5738,7302,HKPD,
+1767,Coordinate Reference System,2343,7301,Xian 1980 / 6-degree Gauss-Kruger CM 105E,
+1768,Coordinate Reference System,2344,7301,Xian 1980 / 6-degree Gauss-Kruger CM 111E,
+1769,Coordinate Reference System,2338,7301,Xian 1980 / 6-degree Gauss-Kruger CM 75E,
+1770,Coordinate Reference System,2342,7301,Xian 1980 / 6-degree Gauss-Kruger CM 99E,
+1771,Coordinate Reference System,2348,7301,Xian 1980 / 6-degree Gauss-Kruger CM 135E,
+1772,Coordinate Reference System,2339,7301,Xian 1980 / 6-degree Gauss-Kruger CM 81E,
+1773,Coordinate Reference System,2340,7301,Xian 1980 / 6-degree Gauss-Kruger CM 87E,
+1774,Coordinate Reference System,2341,7301,Xian 1980 / 6-degree Gauss-Kruger CM 93E,
+1775,Coordinate Reference System,2345,7301,Xian 1980 / 6-degree Gauss-Kruger CM 117E,
+1776,Coordinate Reference System,2346,7301,Xian 1980 / 6-degree Gauss-Kruger CM 123E,
+1777,Coordinate Reference System,2347,7301,Xian 1980 / 6-degree Gauss-Kruger CM 129E,
+1778,Datum,6611,7302,HK80,
+1779,Datum,5135,7301,Ordnance Datum,This is the former name.
+1780,Datum,5136,7301,Admiralty Datum,This is the former name.
+1781,Coordinate Reference System,5737,7301,Huang Hai 1985,
+1782,Coordinate Reference System,2326,7302,HK 1980 Grid System,
+1783,Coordinate Reference System,4611,7302,HK1980,
+1784,Coordinate_Operation Parameter,8802,7301,Central Meridian,"Abbeviated as ""CM""."
+1785,Coordinate_Operation Parameter,8802,7302,CM,"Abbreviation for ""Central Meridian""."
+1786,Coordinate Reference System,2327,7301,Xian 1980 / 6-degree Gauss-Kruger zone 13,Part of the China National Coordinate System of 1980.
+1787,Coordinate Reference System,2328,7301,Xian 1980 / 6-degree Gauss-Kruger zone 14,Part of the China National Coordinate System of 1980.
+1788,Coordinate Reference System,2329,7301,Xian 1980 / 6-degree Gauss-Kruger zone 15,Part of the China National Coordinate System of 1980.
+1789,Coordinate Reference System,2330,7301,Xian 1980 / 6-degree Gauss-Kruger zone 16,Part of the China National Coordinate System of 1980.
+1790,Coordinate Reference System,2331,7301,Xian 1980 / 6-degree Gauss-Kruger zone 17,Part of the China National Coordinate System of 1980.
+1791,Coordinate Reference System,2332,7301,Xian 1980 / 6-degree Gauss-Kruger zone 18,Part of the China National Coordinate System of 1980.
+1792,Coordinate Reference System,2333,7301,Xian 1980 / 6-degree Gauss-Kruger zone 19,Part of the China National Coordinate System of 1980.
+1793,Coordinate Reference System,2334,7301,Xian 1980 / 6-degree Gauss-Kruger zone 20,Part of the China National Coordinate System of 1980.
+1794,Coordinate Reference System,2335,7301,Xian 1980 / 6-degree Gauss-Kruger zone 21,Part of the China National Coordinate System of 1980.
+1795,Coordinate Reference System,2336,7301,Xian 1980 / 6-degree Gauss-Kruger zone 22,Part of the China National Coordinate System of 1980.
+1796,Coordinate Reference System,2333,7301,Xian 1980 / 6-degree Gauss-Kruger zone 23,Part of the China National Coordinate System of 1980.
+1797,Coordinate Reference System,21413,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 13,
+1798,Coordinate Reference System,21414,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 14,
+1799,Coordinate Reference System,21415,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 15,
+1800,Coordinate Reference System,21416,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 16,
+1801,Coordinate Reference System,21417,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 17,
+1802,Coordinate Reference System,21418,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 18,
+1803,Coordinate Reference System,21419,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 19,
+1804,Coordinate Reference System,21420,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 20,
+1805,Coordinate Reference System,21421,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 21,
+1806,Coordinate Reference System,21422,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 22,
+1807,Coordinate Reference System,21423,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 23,
+1808,Coordinate Reference System,21453,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 75E,
+1809,Coordinate Reference System,21454,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 81E,
+1810,Coordinate Reference System,21455,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 87E,
+1811,Coordinate Reference System,21456,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 93E,
+1812,Coordinate Reference System,21457,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 99E,
+1813,Coordinate Reference System,21458,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 105E,
+1814,Coordinate Reference System,21459,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 111E,
+1815,Coordinate Reference System,21460,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 117E,
+1816,Coordinate Reference System,21461,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 123E,
+1817,Coordinate Reference System,21462,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 129E,
+1818,Coordinate Reference System,21463,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 135E,
+1819,Coordinate_Operation,5405,7302,HKPD to Hong Kong Chart,
+1820,Coordinate Reference System,2044,7301,Hanoi 1972 / 6-degree Gauss-Kruger zone 18,
+1821,Coordinate Reference System,2045,7301,Hanoi 1972 / 6-degree Gauss-Kruger zone 18,
+1822,Coordinate Reference System,2462,7301,Albanian 1987 / 6-degree Gauss-Kruger zone 4,
+1823,Coordinate Reference System,2397,7301,Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 3,
+1824,Coordinate Reference System,2398,7301,Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 4,
+1825,Coordinate Reference System,2399,7301,Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 3,
+1826,Coordinate Reference System,2395,7302,S Yemen / Gauss zone 8,
+1827,Coordinate Reference System,2396,7302,S Yemen / Gauss zone 9,
+1828,Coordinate Reference System,2396,7301,South Yemen / 6-degree Gauss-Kruger zone 9,
+1829,Coordinate Reference System,2395,7301,South Yemen / 6-degree Gauss-Kruger zone 8,
+1830,Coordinate_Operation,18031,7301,Gauss-Kruger zone 1,
+1831,Coordinate_Operation,18032,7301,Gauss-Kruger zone 2,
+1832,Coordinate_Operation,18033,7301,Gauss-Kruger zone 3,
+1833,Coordinate_Operation,18034,7301,Gauss-Kruger zone 4,
+1834,Coordinate_Operation,18035,7301,Gauss-Kruger zone 5,
+1835,Coordinate_Operation,18036,7301,Gauss-Kruger zone 6,
+1836,Coordinate_Operation,18037,7301,Gauss-Kruger zone 7,
+1837,Coordinate Reference System,22191,7301,Campo Inchauspe / Gauss-Kruger zone 1,
+1838,Coordinate Reference System,22192,7301,Campo Inchauspe / Gauss-Kruger zone 2,
+1839,Coordinate Reference System,22193,7301,Campo Inchauspe / Gauss-Kruger zone 3,
+1840,Coordinate Reference System,22194,7301,Campo Inchauspe / Gauss-Kruger zone 4,
+1841,Coordinate Reference System,22195,7301,Campo Inchauspe / Gauss-Kruger zone 5,
+1842,Coordinate Reference System,22196,7301,Campo Inchauspe / Gauss-Kruger zone 6,
+1843,Coordinate Reference System,22197,7301,Campo Inchauspe / Gauss-Kruger zone 7,
+1844,Coordinate Reference System,2081,7301,Chos Malal 1914 / Gauss-Kruger zone 2,
+1845,Coordinate Reference System,2082,7301,Pampa del Castillo / Gauss-Kruger zone 2,
+1846,Coordinate Reference System,2083,7301,Hito XVIII 1963 / Gauss-Kruger zone 2,
+1847,Coordinate Reference System,20004,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 4,
+1848,Coordinate Reference System,20005,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 5,
+1849,Coordinate Reference System,20006,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 6,
+1850,Coordinate Reference System,20007,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 7,
+1851,Coordinate Reference System,20008,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 8,
+1852,Coordinate Reference System,20009,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 9,
+1853,Coordinate Reference System,20010,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 10,
+1854,Coordinate Reference System,20011,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 11,
+1855,Coordinate Reference System,20012,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 12,
+1856,Coordinate Reference System,20013,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 13,
+1857,Coordinate Reference System,20014,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 14,
+1858,Coordinate Reference System,20015,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 15,
+1859,Coordinate Reference System,20016,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 16,
+1860,Coordinate Reference System,20017,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 17,
+1861,Coordinate Reference System,20018,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 18,
+1862,Coordinate Reference System,20019,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 19,
+1863,Coordinate Reference System,20020,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 20,
+1864,Coordinate Reference System,20021,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 21,
+1865,Coordinate Reference System,20022,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 22,
+1866,Coordinate Reference System,20023,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 23,
+1867,Coordinate Reference System,20024,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 24,
+1868,Coordinate Reference System,20025,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 25,
+1869,Coordinate Reference System,20026,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 26,
+1870,Coordinate Reference System,20027,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 27,
+1871,Coordinate Reference System,20028,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 28,
+1872,Coordinate Reference System,20029,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 29,
+1873,Coordinate Reference System,20030,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 30,
+1874,Coordinate Reference System,20031,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 31,
+1875,Coordinate Reference System,20032,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 32,
+1876,Coordinate Reference System,28402,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 2,
+1877,Coordinate Reference System,28403,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 3,
+1878,Coordinate Reference System,28404,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 4,
+1879,Coordinate Reference System,28405,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 5,
+1880,Coordinate Reference System,28406,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 6,
+1881,Coordinate Reference System,28407,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 7,
+1882,Coordinate Reference System,28408,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 8,
+1883,Coordinate Reference System,28409,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 9,
+1884,Coordinate Reference System,28410,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 10,
+1885,Coordinate Reference System,28411,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 11,
+1886,Coordinate Reference System,28412,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 12,
+1887,Coordinate Reference System,28413,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 13,
+1888,Coordinate Reference System,28414,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 14,
+1889,Coordinate Reference System,28415,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 15,
+1890,Coordinate Reference System,28416,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 16,
+1891,Coordinate Reference System,28417,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 17,
+1892,Coordinate Reference System,28418,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 18,
+1893,Coordinate Reference System,28419,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 19,
+1894,Coordinate Reference System,28420,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 20,
+1895,Coordinate Reference System,28421,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 21,
+1896,Coordinate Reference System,28422,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 22,
+1897,Coordinate Reference System,28423,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 23,
+1898,Coordinate Reference System,28424,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 24,
+1899,Coordinate Reference System,28425,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 25,
+1900,Coordinate Reference System,28426,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 26,
+1901,Coordinate Reference System,28427,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 27,
+1902,Coordinate Reference System,28428,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 28,
+1903,Coordinate Reference System,28429,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 29,
+1904,Coordinate Reference System,28430,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 30,
+1905,Coordinate Reference System,28431,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 31,
+1906,Coordinate Reference System,28432,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 32,
+1907,Coordinate Reference System,2463,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 21E,
+1908,Coordinate Reference System,2464,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 27E,
+1909,Coordinate Reference System,2465,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 33E,
+1910,Coordinate Reference System,2466,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 39E,
+1911,Coordinate Reference System,2467,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 45E,
+1912,Coordinate Reference System,2468,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 51E,
+1913,Coordinate Reference System,2469,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 57E,
+1914,Coordinate Reference System,2470,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 63E,
+1915,Coordinate Reference System,2471,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 69E,
+1916,Coordinate Reference System,2472,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 75E,
+1917,Coordinate Reference System,2473,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 81E,
+1918,Coordinate Reference System,2474,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 87E,
+1919,Coordinate Reference System,2475,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 93E,
+1920,Coordinate Reference System,2476,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 99E,
+1921,Coordinate Reference System,2477,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 105E,
+1922,Coordinate Reference System,2478,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 111E,
+1923,Coordinate Reference System,2479,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 117E,
+1924,Coordinate Reference System,2480,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 123E,
+1925,Coordinate Reference System,2481,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 129E,
+1926,Coordinate Reference System,2482,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 135E,
+1927,Coordinate Reference System,2483,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 141E,
+1928,Coordinate Reference System,2484,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 147E,
+1929,Coordinate Reference System,2485,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 153E,
+1930,Coordinate Reference System,2486,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 159E,
+1931,Coordinate Reference System,2487,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 165E,
+1932,Coordinate Reference System,2488,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 171E,
+1933,Coordinate Reference System,2489,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 177E,
+1934,Coordinate Reference System,2490,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 177W,
+1935,Coordinate Reference System,2491,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 171W,
+1936,Coordinate Reference System,2492,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 9E,
+1937,Coordinate Reference System,2493,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 15E,
+1938,Coordinate Reference System,2494,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 21E,
+1939,Coordinate Reference System,2495,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 27E,
+1940,Coordinate Reference System,2496,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 33E,
+1941,Coordinate Reference System,2497,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 39E,
+1942,Coordinate Reference System,2498,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 45E,
+1943,Coordinate Reference System,2499,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 51E,
+1944,Coordinate Reference System,2500,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 57E,
+1945,Coordinate Reference System,2501,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 63E,
+1946,Coordinate Reference System,2502,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 69E,
+1947,Coordinate Reference System,2503,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 75E,
+1948,Coordinate Reference System,2504,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 81E,
+1949,Coordinate Reference System,2505,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 87E,
+1950,Coordinate Reference System,2506,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 93E,
+1951,Coordinate Reference System,2507,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 99E,
+1952,Coordinate Reference System,2508,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 105E,
+1953,Coordinate Reference System,2509,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 111E,
+1954,Coordinate Reference System,2510,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 117E,
+1955,Coordinate Reference System,2511,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 123E,
+1956,Coordinate Reference System,2512,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 129E,
+1957,Coordinate Reference System,2513,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 135E,
+1958,Coordinate Reference System,2514,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 141E,
+1959,Coordinate Reference System,2515,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 147E,
+1960,Coordinate Reference System,2516,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 153E,
+1961,Coordinate Reference System,2517,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 159E,
+1962,Coordinate Reference System,2518,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 165E,
+1963,Coordinate Reference System,2519,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 171E,
+1964,Coordinate Reference System,2520,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 177E,
+1965,Coordinate Reference System,2521,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 177W,
+1966,Coordinate Reference System,2522,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 171W,
+1967,Unit of Measure,9115,7302,DM,
+1968,Unit of Measure,9115,7306,dega,
+1969,Coordinate_Operation,1833,7311,ID74 to DGN-95 (3),DGN-95 is a synonym in Indonesia for WGS 84.
+1970,Coordinate_Operation,1832,7311,ID74 to DGN-95 (2),DGN-95 is a synonym in Indonesia for WGS 84.
+1971,Coordinate_Operation,1248,7311,ID74 to DGN-95 (1),DGN-95 is a synonym in Indonesia for WGS 84.
+1972,Coordinate Reference System,2309,7311,DGN-95 / TM 116 SE,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1973,Coordinate Reference System,2310,7311,DGN-95 / TM 132 SE,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1974,Coordinate Reference System,32646,7311,DGN-95 / UTM zone 46N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1975,Coordinate Reference System,32647,7311,DGN-95 / UTM zone 47N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1976,Coordinate Reference System,32648,7311,DGN-95 / UTM zone 48N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1977,Coordinate Reference System,32649,7311,DGN-95 / UTM zone 49N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1978,Coordinate Reference System,32650,7311,DGN-95 / UTM zone 50N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1979,Coordinate Reference System,32651,7311,DGN-95 / UTM zone 51N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1980,Coordinate Reference System,32652,7311,DGN-95 / UTM zone 52N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1981,Coordinate Reference System,32747,7311,DGN-95 / UTM zone 47S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1982,Coordinate Reference System,32748,7311,DGN-95 / UTM zone 48S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1983,Coordinate Reference System,32749,7311,DGN-95 / UTM zone 49S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1984,Coordinate Reference System,32750,7311,DGN-95 / UTM zone 50S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1985,Coordinate Reference System,32751,7311,DGN-95 / UTM zone 51S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1986,Coordinate Reference System,32752,7311,DGN-95 / UTM zone 52S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1987,Coordinate Reference System,32753,7311,DGN-95 / UTM zone 53S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1988,Coordinate Reference System,32754,7311,DGN-95 / UTM zone 54S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1990,Coordinate Reference System,4326,7311,DGN-95,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1991,Coordinate Reference System,4327,7311,DGN-95 (geographic 3D),Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1992,Coordinate Reference System,4328,7311,DGN-95 (geocentric),Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1993,Datum,6326,7311,DGN-95,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1994,Coordinate_Operation,1814,7301,Genuk to WGS 84 (3),
+1996,Datum,6820,7302,Segara (Jakarta),
+1997,Datum,6613,7302,Segara,
+1998,Datum,6613,7301,Samboja,Samboja-1 is one of two stations used as the baseline for extension to government triangulation by Total Indonesia in 1970-71.
+1999,Datum,6613,7301,P2 Exc,P2 Exc is one of two stations used as the baseline for extension to government triangulation by Total Indonesia in 1970-71. P2 Exc is a replacement satellite station to the destroyed station P2.
+2000,Datum,6613,7301,P2 Exc-T9,P2 Exc was a replacement satellite station to the destroyed station P2 from which several Toran stations including T9 were coordinated in 1970-71. When further control work was executed in 1995 P2 Exc was by then destroyed and T9 was used as its origin.
+2001,Coordinate Reference System,4613,7301,Samboja,Oil industry extension in the Mahakam delta region. Also known as P2 Exc and P2 Exc-T9.
+2002,Coordinate Reference System,4613,7301,P2 Exc-T9,Oil industry extension in the Mahakam delta region. Also known as P2 Exc and Samboja.
+2003,Coordinate Reference System,4613,7301,P2 Exc,Oil industry extension in the Mahakam delta region. Also known as P2 Exc-T9 and Samboja.
+2004,Coordinate_Operation,1838,7301,Samboja to WGS 84 (4),
+2005,Coordinate_Operation,1838,7301,P2 Exc-T9 to WGS 84 (4),
+2006,Datum,6614,7302,QND95,
+2008,Coordinate Reference System,2933,7301,Samboja / UTM zone 50S,
+2009,Coordinate Reference System,2933,7301,P2 Exc-T9 / UTM zone 50S,
+2010,Unit of Measure,9110,7301,sexagesimal degree,
+2011,Coordinate Reference System,2952,7301,NAD83(CSRS) / SCoPQ zone 10,
+2012,Coordinate Reference System,2945,7301,NAD83(CSRS) / SCoPQ zone 3,
+2013,Coordinate Reference System,2946,7301,NAD83(CSRS) / SCoPQ zone 4,
+2014,Coordinate Reference System,2947,7301,NAD83(CSRS) / SCoPQ zone 5,
+2015,Coordinate Reference System,2948,7301,NAD83(CSRS) / SCoPQ zone 6,
+2016,Coordinate Reference System,2949,7301,NAD83(CSRS) / SCoPQ zone 7,
+2017,Coordinate Reference System,2950,7301,NAD83(CSRS) / SCoPQ zone 8,
+2018,Coordinate Reference System,2951,7301,NAD83(CSRS) / SCoPQ zone 9,
+2019,Coordinate_Operation,18071,7301,Green Belt,
+2020,Coordinate Reference System,22991,7301,Egypt 1907 / Green Belt,
+2021,Coordinate_Operation Parameter,8806,7301,False westing,"This alias applies only in the case of projection methods which have an axis positive west, e.g. Transverse Mercator (South Orientated)."
+2022,Coordinate_Operation Parameter,8807,7301,False southing,"This alias applies only in the case of projection methods which have an axis positive south, e.g. Transverse Mercator (South Orientated)."
diff --git a/src/tiff/csv/area.csv b/src/tiff/csv/area.csv
new file mode 100644
index 0000000..3e0fe93
--- /dev/null
+++ b/src/tiff/csv/area.csv
@@ -0,0 +1,1751 @@
+"AREA_CODE","AREA_NAME","AREA_OF_USE","ISO_A2_CODE","ISO_A3_CODE","ISO_N_CODE","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+1118,China - Hong Kong,China - Hong Kong special administrative region.,HK,HKG,344,"""Hong Kong"" in ISO 3166",EPSG,EPSG,2002-06-22 00:00:00,2002.16,0
+1119,Hungary,Hungary.,HU,HUN,348,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1120,Iceland,Iceland.,IS,ISL,352,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1121,India,India.,IN,IND,356,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1122,Indonesia,Indonesia.,ID,IDN,360,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1123,"Iran, Islamic Republic of",Islamic Republic of Iran,IR,IRN,364,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1124,Iraq,Iraq.,IQ,IRQ,368,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1125,Ireland,Ireland.,IE,IRL,372,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1126,Israel,Israel.,IL,ISR,376,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1127,Italy,Italy.,IT,ITA,380,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1128,Jamaica,Jamaica.,JM,JAM,388,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1129,Japan,Japan.,JP,JPN,392,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1130,Jordan,Jordan.,JO,JOR,400,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1131,Kazakstan,Kazakstan.,KZ,KAZ,398,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1132,Kenya,Kenya.,KE,KEN,404,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1133,Kiribati,Kiribati.,KI,KIR,296,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1134,"Korea, Democratic People's Republic of (North Korea)",Democratic People's Republic of Korea (North Korea).,KP,PRK,408,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1135,"Korea, Republic of (South Korea)",Republic of Korea (South Korea).,KR,KOR,410,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1136,Kuwait,Kuwait.,KW,KWT,414,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1137,Kyrgyzstan,Kyrgyzstan.,KG,KGZ,417,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1138,Lao People's Democratic Republic (Laos).,Lao People's Democratic Republic (Laos).,LA,LAO,418,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1139,Latvia,Latvia.,LV,LVA,428,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1140,Lebanon,Lebanon.,LB,LBN,422,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1141,Lesotho,Lesotho.,LS,LSO,426,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1142,Liberia,Liberia.,LR,LBR,430,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1143,Libyan Arab Jamahiriya,Libyan Arab Jamahiriya.,LY,LBY,434,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1144,Liechtenstein,Liechtenstein.,LI,LIE,438,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1145,Lithuania,Lithuania.,LT,LTU,440,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1146,Luxembourg,Luxembourg.,LU,LUX,442,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1147,China - Macau,China - Macau special administrative region.,MO,MAC,446,"""Macau"" in ISO 3166.",EPSG,EPSG,2002-06-22 00:00:00,2002.16,0
+1148,"Macedonia, The Former Yugoslav Republic of",The Former Yugoslav Republic of Macedonia.,MK,MKD,807,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1149,Madagascar,Madagascar.,MG,MDG,450,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1150,Malawi,Malawi.,MW,MWI,454,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1151,Malaysia,Malaysia.,MY,MYS,458,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1152,Maldives,Maldives.,MV,MDV,462,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1153,Mali,Mali.,ML,MLI,466,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1154,Malta,Malta.,MT,MLT,470,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1155,Marshall Islands,Marshall Islands.,MH,MHL,584,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1156,Martinique,Martinique.,MQ,MTQ,474,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1157,Mauritania,Mauritania.,MR,MRT,478,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1158,Mauritius,Mauritius.,MU,MUS,480,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1159,Mayotte,Mayotte.,YT,MYT,175,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1160,Mexico,Mexico.,MX,MEX,484,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1161,"Micronesia, Federated States of",Federated States of Micronesia.,FM,FSM,583,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1162,"Moldova, Republic of",Republic of Moldova,MD,MDA,498,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1163,Monaco,Monaco.,MC,MCO,492,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1164,Mongolia,Mongolia.,MN,MNG,496,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1165,Montserrat,Montserrat.,MS,MSR,500,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1166,Morocco,Morocco.,MA,MAR,504,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1167,Mozambique,Mozambique.,MZ,MOZ,508,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1168,Myanmar (Burma),Myanmar (Burma).,MM,MMR,104,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/isoISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1169,Namibia,Namibia.,NA,NAM,516,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1170,Nauru,Nauru.,NR,NRU,520,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1171,Nepal,Nepal.,NP,NPL,524,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1172,Netherlands,Netherlands.,NL,NLD,528,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1173,Netherlands Antilles,Netherlands Antilles.,AN,ANT,530,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1174,New Caledonia,New Caledonia.,NC,NCL,540,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1175,New Zealand,New Zealand.,NZ,NZL,554,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1176,Nicaragua,Nicaragua.,NI,NIC,558,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1177,Niger,Niger.,NE,NER,562,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1178,Nigeria,Nigeria.,NG,NGA,566,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1179,Niue,Niue.,NU,NIU,570,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1180,Norfolk Island,Norfolk Island.,NF,NFK,574,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1181,Northern Mariana Islands,Northern Mariana Islands.,MP,MNP,580,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1182,Norway,Norway.,NO,NOR,578,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1183,Oman,Oman.,OM,OMN,512,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1184,Pakistan,Pakistan.,PK,PAK,586,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1185,Palau,Palau.,PW,PLW,585,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1186,Panama,Panama.,PA,PAN,591,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1187,Papua New Guinea (PNG),Papua New Guinea (PNG).,PG,PNG,598,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1188,Paraguay,Paraguay.,PY,PRY,600,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1189,Peru,Peru.,PE,PER,604,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1190,Philippines,Philippines.,PH,PHL,608,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1191,Pitcairn,Pitcairn.,PN,PCN,612,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1192,Poland,Poland.,PL,POL,616,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1193,Portugal,Portugal.,PT,PRT,620,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1194,Puerto Rico,Puerto Rico.,PR,PRI,630,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1195,Qatar,Qatar.,QA,QAT,634,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1196,Reunion,Reunion.,RE,REU,638,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1197,Romania,Romania.,RO,ROU,642,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1198,Russian Federation,Russian Federation.,RU,RUS,643,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1199,Rwanda,Rwanda.,RW,RWA,646,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1200,Saint Kitts and Nevis,Saint Kitts and Nevis.,KN,KNA,659,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1201,Saint Lucia,Saint Lucia.,LC,LCA,662,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1202,Saint Vincent and the Grenadines,Saint Vincent and the Grenadines.,VC,VCT,670,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1203,Samoa,Samoa.,WS,WSM,882,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1204,San Marino,San Marino.,SM,SMR,674,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1205,Sao Tome and Principe,Sao Tome and Principe.,ST,STP,678,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1206,Saudi Arabia,Saudi Arabia.,SA,SAU,682,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1207,Senegal,Senegal.,SN,SEN,686,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1208,Seychelles,Seychelles.,SC,SYC,690,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1209,Sierra Leone,Sierra Leone.,SL,SLE,694,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1210,Singapore,Singapore.,SG,SGP,702,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1211,Slovakia (Slovak Republic),Slovakia (Slovak Republic).,SK,SVK,703,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1212,Slovenia,Slovenia.,SI,SVN,705,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1213,Solomon Islands,Solomon Islands.,SB,SLB,90,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1214,Somalia,Somalia.,SO,SOM,706,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1215,South Africa,South Africa.,ZA,ZAF,710,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1216,South Georgia and the South Sandwich Islands,South Georgia and the South Sandwich Islands.,GS,SGS,239,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1217,Spain,Spain.,ES,ESP,724,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1218,Sri Lanka,Sri Lanka.,LK,LKA,144,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1219,Saint Helena,Saint Helena.,SH,SHN,654,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1220,Saint Pierre and Miquelon,Saint Pierre and Miquelon.,PM,SPM,666,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1221,Sudan,Sudan.,SD,SDN,736,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1222,Suriname,Suriname.,SR,SUR,740,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1223,Svalbard and Jan Mayen,Svalbard and Jan Mayen.,SJ,SJM,744,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1224,Swaziland,Swaziland.,SZ,SWZ,748,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1225,Sweden,Sweden.,SE,SWE,752,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1226,Switzerland,Switzerland.,CH,CHE,756,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1227,Syrian Arab Republic,Syrian Arab Republic.,SY,SYR,760,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1228,"Taiwan, Province of China","Taiwan, Province of China",TW,TWN,158,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1229,Tajikistan,Tajikistan.,TJ,TJK,762,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1230,"Tanzania, United Republic of",United Republic of Tanzania.,TZ,TZA,834,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1231,Thailand,Thailand.,TH,THA,764,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1232,Togo,Togo.,TG,TGO,768,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1233,Tokelau,Tokelau.,TK,TKL,772,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1234,Tonga,Tonga.,TO,TON,776,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1235,Trinidad and Tobago,Trinidad and Tobago.,TT,TTO,780,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1236,Tunisia,Tunisia.,TN,TUN,788,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1237,Turkey,Turkey.,TR,TUR,792,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1238,Turkmenistan,Turkmenistan.,TM,TKM,795,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1239,Turks and Caicos Islands,Turks and Caicos Islands.,TC,TCA,796,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1240,Tuvalu,Tuvalu.,TV,TUV,798,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1241,Uganda,Uganda.,UG,UGA,800,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1242,Ukraine,Ukraine.,UA,UKR,804,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1243,United Arab Emirates (UAE),United Arab Emirates (UAE).,AE,ARE,784,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1244,United Kingdom (UK),United Kingdom (UK).,GB,GBR,826,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1245,United States (USA),United States (USA).,US,USA,840,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1246,United States Minor Outlying Islands,United States Minor Outlying Islands,UM,UMI,581,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1247,Uruguay,Uruguay.,UY,URY,858,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1248,Uzbekistan,Uzbekistan.,UZ,UZB,860,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1249,Vanuatu,Vanuatu.,VU,VUT,548,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1250,Holy See (Vatican City State),Holy See (Vatican City State),VA,VAT,336,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1251,Venezuela,Venezuela.,VE,VEN,862,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1252,Vietnam,Vietnam.,VN,VNM,704,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1253,"Virgin Islands, British",British Virgin Islands.,VG,VGB,92,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1254,"Virgin Islands, US",US Virgin Islands.,VI,VIR,850,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1255,Wallis and Futuna,Wallis and Futuna.,WF,WLF,876,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1256,Western Sahara,Western Sahara.,EH,ESH,732,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1257,Yemen,Yemen.,YE,YEM,887,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1258,Yugoslavia,Yugoslavia.,YU,YUG,891,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1259,"Congo, The Democratic Republic of the Congo (Zaire)",The Democratic Republic of the Congo (Zaire).,CD,COD,180,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1260,Zambia,Zambia.,ZM,ZMB,894,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1261,Zimbabwe,Zimbabwe.,ZW,ZWE,716,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1262,World,World.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1263,Not specified,Not specified.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1264,UK - Great Britain onshore,United Kingdom (UK) - Great Britain - England Scotland Wales - onshore; Isle of Man.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1265,Argentina - Comodoro Rivadavia,Argentina - Comodoro Rivadavia area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1266,Venezuela - Puerto La Cruz,Venezuela - Puerto La Cruz area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1267,Venezuela - Barinas,Venezuela - Barinas area.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1268,Venezuela - Falcon state,Venezuela - Falcon state.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1269,Venezuela - Pedregal area of Falcon state,Venezuela - Pedregal area of Falcon state.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1270,Venezuela - Maracaibo south,Venezuela - south Maracaibo area.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1271,Africa - Ethiopia and Sudan,Ethiopia; Sudan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1272,Asia - Middle East - Kuwait and Saudi,Kuwait; Saudi Arabia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1273,Antigua,Antigua and Barbuda - Antigua.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+1274,Brazil - Aratu,Brazil - coastal areas south of 2 deg 55 min South.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1275,Netherlands - onshore,Netherlands - onshore.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1276,"Africa - Botswana, Malawi, Zambia, Zimbabwe.",Botswana; Malawi; Zambia; Zimbabwe.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1277,"Africa - Kenya, Tanzania and Uganda",Kenya; Tanzania; Uganda.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1278,Antarctica - Australian sector,Antarctica - Australian sector.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1279,Australasia - Australia and PNG - AGD66,Australia - Australian Capital Territory (ACT); New South Wales (NSW); Northern Territory (NT); Tasmania; Victoria. Papua New Guinea (PNG).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1280,Australia - Western Australia (WA),Australia - Western Australia (WA).,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1281,Australia - mainland,Australia - Australian Capital Territory (ACT); New South Wales (NSW); Northern Territories (NT); Queensland; South Australia (SA); Western Australia (WA); Victoria.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1282,Australia - Tasmania,Australia - Tasmania.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1283,Canada - Maritime Provinces,Canada - New Brunswick; Nova Scotia; Prince Edward Island.,,,,,EPSG,EPSG,1997-07-22 00:00:00,,0
+1284,Europe - Soviet Union,Armenia; Azerbaijan; Belorus; Estonia; Georgia; Kazakstan; Kirgizstan; Latvia; Lithuania; Moldavia; Russian Federation; Tadzhikistan; Turkmenistan; Ukraine; Uzbekistan.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1285,Indonesia - Java,Indonesia - Java.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1286,Europe - Liechtenstein and Switzerland.,Liechtenstein; Switzerland.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1287,Indonesia - Banga & Belitung Islands.,Indonesia - Banga & Belitung Islands.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1288,Angola - Angola proper,Angola - Angola proper,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1289,Canada - CVD28,Canada - Alberta; British Columbia; Manitoba; New Brunswick; Nova Scotia; Ontario; Prince Edward Island; Quebec; Saskatchewan.,,,,,EPSG,EPSG,1996-12-12 00:00:00,,0
+1290,Africa - Botswana and South Africa.,Botswana; South Africa.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1291,Asia - Caspian Sea,Azerbaijan - offshore; Kazakstan - offshore; Russian Federation - Caspian Sea; Turkmenistan - offshore.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1292,Argentina - Neuquen province,Argentina - Neuquen province.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1024,Afghanistan,Afghanistan.,AF,AFG,4,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1025,Albania,Albania.,AL,ALB,8,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1026,Algeria,Algeria.,DZ,DZA,12,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1027,American Samoa,American Samoa.,AS,ASM,16,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1028,Andorra,Andorra.,AD,AND,20,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1029,Angola,Angola.,AO,AGO,24,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1030,Anguilla,Anguilla.,AI,AIA,660,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1031,Antarctica,Antarctica.,AQ,ATA,10,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1032,Antigua and Barbuda,Antigua and Barbuda.,AG,ATG,28,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1033,Argentina,Argentina.,AR,ARG,32,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1034,Armenia,Armenia.,AM,ARM,51,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1035,Aruba,Aruba.,AW,ABW,533,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1036,Australia,Australia.,AU,AUS,36,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1037,Austria,Austria.,AT,AUT,40,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1038,Azerbaijan,Azerbaijan.,AZ,AZE,31,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1039,Bahamas,Bahamas.,BS,BHS,44,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1040,Bahrain,Bahrain.,BH,BHR,48,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1041,Bangladesh,Bangladesh.,BD,BGD,50,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1042,Barbados,Barbados.,BB,BRB,52,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1043,Belarus,Belarus.,BY,BLR,112,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1044,Belgium,Belgium.,BE,BEL,56,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1045,Belize,Belize.,BZ,BLZ,84,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1046,Benin,Benin.,BJ,BEN,204,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1047,Bermuda,Bermuda.,BM,BMU,60,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1048,Bhutan,Bhutan.,BT,BTN,64,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1049,Bolivia,Bolivia.,BO,BOL,68,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1050,Bosnia and Herzegowina,Bosnia and Herzegowina.,BA,BIH,70,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1051,Botswana,Botswana.,BW,BWA,72,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1052,Bouvet Island,Bouvet Island.,BV,BVT,74,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1053,Brazil,Brazil.,BR,BRA,76,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1054,British Indian Ocean Territory,British Indian Ocean Territory.,IO,IOT,86,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1055,Brunei Darussalam,Brunei Darussalam.,BN,BRN,96,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1056,Bulgaria,Bulgaria.,BG,BGR,100,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1057,Burkina Faso,Burkina Faso.,BF,BFA,854,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1058,Burundi,Burundi.,BI,BDI,108,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1059,Cambodia,Cambodia.,KH,KHM,116,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1060,Cameroon,Cameroon.,CM,CMR,120,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1061,Canada,Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon.,CA,CAN,124,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1062,Cape Verde,Cape Verde.,CV,CPV,132,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1063,Cayman Islands,Cayman Islands.,KY,CYM,136,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1064,Central African Republic,Central African Republic.,CF,CAF,140,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1065,Chad,Chad.,TD,TCD,148,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1066,Chile,Chile.,CL,CHL,152,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1067,China,China.,CN,CHN,156,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1068,Christmas Island,Christmas Island.,CX,CXR,162,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1069,Cocos (Keeling) Islands,Cocos (Keeling) Islands.,CC,CCK,166,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1070,Colombia,Colombia.,CO,COL,170,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1071,Comoros,Comoros.,KM,COM,174,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1072,Congo,Congo.,CG,COG,178,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1073,Cook Islands,Cook Islands.,CK,COK,184,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1074,Costa Rica,Costa Rica.,CR,CRI,188,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1075,Cote d'Ivoire (Ivory Coast),C�te d'Ivoire (Ivory Coast).,CI,CIV,384,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1076,Croatia,Croatia.,HR,HRV,191,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1077,Cuba,Cuba.,CU,CUB,192,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1078,Cyprus,Cyprus.,CY,CYP,196,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1079,Czech Republic,Czech Republic.,CZ,CZE,203,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1080,Denmark,Denmark.,DK,DNK,208,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1081,Djibouti,Djibouti.,DJ,DJI,262,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1082,Dominica,Dominica.,DM,DMA,212,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1083,Dominican Republic,Dominican Republic.,DO,DOM,214,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1084,East Timor,East Timor.,TP,TMP,626,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1085,Ecuador,Ecuador.,EC,ECU,218,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1086,Egypt,Egypt.,EG,EGY,818,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1087,El Salvador,El Salvador.,SV,SLV,222,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1088,Equatorial Guinea,Equatorial Guinea.,GQ,GNQ,226,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1089,Eritrea,Eritrea.,ER,ERI,232,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1090,Estonia,Estonia.,EE,EST,233,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1091,Ethiopia,Ethiopia.,ET,ETH,231,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1092,Falkland Islands (Malvinas),Falkland Islands (Malvinas).,FK,FLK,238,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1093,Faroe Islands,Faroe Islands.,FO,FRO,234,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1094,Fiji,Fiji.,FJ,FJI,242,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1095,Finland,Finland.,FI,FIN,246,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1096,France,France.,FR,FRA,250,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1097,French Guiana,French Guiana.,GF,GUF,254,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1098,French Polynesia,French Polynesia.,PF,PYF,258,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1099,French Southern Territories,French Southern Territories.,TF,ATF,260,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1100,Gabon,Gabon.,GA,GAB,266,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1101,Gambia,Gambia.,GM,GMB,270,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1102,Georgia,Georgia.,GE,GEO,268,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1103,Germany,Germany.,DE,DEU,276,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1104,Ghana,Ghana.,GH,GHA,288,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1105,Gibraltar,Gibraltar.,GI,GIB,292,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1106,Greece,Greece.,GR,GRC,300,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1107,Greenland,Greenland.,GL,GRL,304,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1108,Grenada,Grenada.,GD,GRD,308,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1109,Guadeloupe,Guadeloupe.,GP,GLP,312,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1110,Guam,Guam.,GU,GUM,316,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1111,Guatemala,Guatemala.,GT,GTM,320,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1112,Guinea,Guinea.,GN,GIN,324,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1113,Guinea-Bissau,Guinea-Bissau.,GW,GNB,624,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1114,Guyana,Guyana.,GY,GUY,328,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1115,Haiti,Haiti.,HT,HTI,332,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1116,Heard Island and McDonald Islands,Heard Island and McDonald Islands.,HM,HMD,334,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1117,Honduras,Honduras.,HN,HND,340,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1293,Brazil - Corrego Alegre,Brazil - NE coastal area between 45 deg W and 40 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1294,Portugal - onshore,Portugal - onshore.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1295,Germany - DHDN,"Germany - onshore - Baden-Wurtemberg, Bayern, Hessen, Niedersachsen, Nordrhein-Westfalen, Rheinland-Pfalz, Saarland, Schleswig-Holstein. Also former DDR states of Sachsen and Thuringen by transformation.",,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1296,Europe - ED50,Europe - west - Denmark; Faroe Islands; France offshore; Italy; Ireland offshore; Netherlands offshore; Germany offshore; Greece (offshore); North Sea; Norway; Spain; Turkey; United Kingdom UKCS offshore. Egypt - Western Desert.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1297,Europe - ED87,Europe - west.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1298,Europe - ETRS89,Europe: Austria; Belgium; Bosnia and Herzegovina; Croatia; Czech Republic; Denmark; Estonia; Finland; France; Germany; Hungary; Italy; Latvia; Liechtenstein; Lithuania; Luxembourg; Netherlands; Norway; Poland; Portugal; Romania; Slovakia; Slovenia; Spain; Sweden; Switzerland; United Kingdom (UK).,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1299,Europe - EVRF2000,Europe: Austria; Belgium; Bosnia and Herzegovina; Croatia; Czech Republic; Denmark; Estonia; Finland; France; Germany; Hungary; Italy; Latvia; Liechtenstein; Lithuania; Luxembourg; Netherlands; Norway; Poland; Portugal; Romania; Slovakia; Slovenia; Spain; Sweden; Switzerland; United Kingdom (UK).,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1300,Iran - FD58,Islamic Republic of Iran - Gulf coast and Arwaz areas.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1301,Portugal - central Azores,"Portugal - central Azores - Graciosa, Terceira, Sao Jorge, Pico, Faial.",,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1302,Asia - Cambodia and Vietnam,Cambodia; Vietnam.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1303,South America - Tierra del Fuego.,Argentina and Chile - Tierra del Fuego.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1304,Asia - Myanmar and Thailand,Myanmar (Burma); Thailand.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1305,Europe - Ireland (Republic and Ulster),Ireland. United Kingdom (UK) - Northern Ireland (Ulster).,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+1306,Europe - Czechoslovakia,Czech Republic; Slovakia.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1307,Asia - Bangladesh; India; Myanmur; Pakistan.,Bangladesh; India; Myanmar (Burma); Pakistan.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1308,Asia - Bangladesh; India; Pakistan.,Bangladesh; India; Pakistan.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1309,Asia - Malaysia (west) and Singapore.,Malaysia - West Malaysia; Singapore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1310,Kuwait - Kuwait City,Kuwait - Kuwait City.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1311,Venezuela - Cabinas,Venezuela - Cabinas area.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1312,Venezuela - Lake Maracaibo,Venezuela - Lake Maracaibo area.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1313,Venezuela - Loma Quintana,Venezuela - north.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1314,Portugal - Madeira islands,"Portugal - Madeira, Porto Santo and Desertas islands.",,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1315,Mozambique - west.,Mozambique - west.,,,,,EPSG,EPSG,1998-04-16 00:00:00,,0
+1316,Indonesia - Sulawesi SW,Indonesia - south west Sulawesi.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1317,Angola - Cabinda offshore,Angola - Cabinda offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1318,Angola - Cabinda,Angola - Cabinda,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1319,Venezuela - Maracaibo area,Venezuela - Maracaibo area.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1320,Venezuela - Maturin,Venezuela - Maturin area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1321,Europe - MGI,"Austria. Bosnia and Herzegowina. Croatia. FYR Macedonia. Slovenia. Yugoslavia (Serbia, Montenegro).",,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1322,Trinidad and Tobago - Tobago,Trinidad and Tobago - Tobago.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1323,USA - conus,United States (USA) - Alabama; 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; Virg [...]
+1324,USA (all states),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 [...]
+1325,North America - all Canada and USA subunits,North America: Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland; North West Territories; Nova Scotia; Nunavet; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon. United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; [...]
+1326,France - mainland,France - mainland.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1327,France - Corsica,France - Corsica.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1328,Indonesia - Kalimantan E - Mahakam delta,Indonesia - east Kalimantan - Mahakam delta area.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1329,Mozambique - south,Mozambique - south.,,,,,EPSG,EPSG,1998-04-16 00:00:00,,0
+1330,USA - Alaska,United States (USA) - Alaska,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1331,USA - Alaska - St. George Island,United States (USA) - Alaska - St. George Island.,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+2040,WGS84 / UTM zone 21N,Between 60 and 54 deg West; northern hemisphere. Barbados. Brazil. Canada - Newfoundland; Quebec. French Guiana. Greenland. Guyana. St. Pierre and Miquelon. Suriname.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2041,WGS84 / UTM zone 21S,Between 60 and 54 deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay. Uruguay.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2042,WGS84 / UTM zone 22N,Between 54 and 48 deg West; northern hemisphere. Brazil. Canada - Newfoundland. French Guiana. Greenland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2043,WGS84 / UTM zone 22S,Between 54 and 48 deg West; southern hemisphere. Brazil. Uruguay.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2044,WGS84 / UTM zone 23N,Between 48 and 42 deg West; northern hemisphere. Greenland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2045,WGS84 / UTM zone 23S,Between 48 and 42 deg West; southern hemisphere. Brazil.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2046,WGS84 / UTM zone 24N,Between 42 and 36 deg West; northern hemisphere. Greenland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2047,WGS84 / UTM zone 24S,Between 42 and 36 deg West; southern hemisphere. Brazil. South Georgia and the South Sandwich Islands.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2048,WGS84 / UTM zone 25N,Between 36 and 30 deg West; northern hemisphere. Greenland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2049,WGS84 / UTM zone 25S,Between 36 and 30 deg West; southern hemisphere. Brazil.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2050,WGS84 / UTM zone 26N,Between 30 and 24 deg West; northern hemisphere. Greenland. Iceland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2051,WGS84 / UTM zone 26S,Between 30 and 24 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2052,WGS84 / UTM zone 27N,Between 24 and 18 deg West; northern hemisphere. Greenland. Iceland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2053,WGS84 / UTM zone 27S,Between 24 and 18 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2054,WGS84 / UTM zone 28N,Between 18 and 12 deg West; northern hemisphere. Gambia. Greenland. Guinea. Guinea-Bissau. Iceland. Ireland - offshore Porcupine Basin. Mauritania. Morocco. Senegal. Sierra Leone. Western Sahara.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2055,WGS84 / UTM zone 28S,Between 18 and 12 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2056,WGS84 / UTM zone 29N,Between 12 and 6 deg West; northern hemisphere. Algeria. Cote D'Ivoire (Ivory Coast). Faroe Islands. Guinea. Ireland. Mali. Mauritania. Morocco. Portugal. Sierra Leone. Spain. United Kingdom (UK). Western Sahara.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2057,WGS84 / UTM zone 29S,Between 12 and 6 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2058,WGS84 / UTM zone 30N,Between 6 deg West and 0 deg East; northern hemisphere. Algeria. Burkino Faso. Cote' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2059,WGS84 / UTM zone 30S,Between 6 deg West and 0 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2060,WGS84 / UTM zone 31N,Between 0 and 6 deg East; northern hemisphere. Algeria. Andorra. Benin. Bukino Faso. Denmark - North Sea. France. Germany - North Sea. Ghana. Luxembourg. Mali. Netherlands. Niger. Nigeria. Norway. Spain. Togo. United Kingdom (UK) - North Sea.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2061,WGS84 / UTM zone 31S,Between 0 and 6 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2062,WGS84 / UTM zone 32N,Between 6 and 12 deg East; northern hemisphere. Algeria. Austria. Cameroon. Denmark. Equatorial Guinea. France. Gabon. Germany. Italy. Libya. Liechtenstein. Monaco. Netherlands. Niger. Nigeria. Norway. Sao Tome and Principe. Svalbard and Jan Mayen Islands. Sweden. Switzerland. Tunisia. Vatican City State.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2063,WGS84 / UTM zone 32S,Between 6 and 12 deg East; southern hemisphere. Angola. Congo. Gabon. Namibia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2064,WGS84 / UTM zone 33N,Between 12 and 18 deg East; northern hemisphere. Austria. Bosnia and Herzegowina. Cmeroon. Central African Republic. Chad. Congo. Croatia. Czech Republic. Democratic Republic of the Congo (Zaire). Gabon. Germany. Hungary. Italy. Libya. Malta. Niger. Nigeria. Norway. Poland. San Marino. Slovakia. Slovenia. Svalbard and Jan Mayen Islands. Sweden.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2065,WGS84 / UTM zone 33S,Between 12 and 18 deg East; southern hemisphere. Angola. Congo. Democratic Republic of the Congo (Zaire). Gabon. Namibia. South Africa.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2066,WGS84 / UTM zone 34N,Between 18 and 24 deg East; northern hemisphere. Albania. Belarus. Bosnia and Herzegowina. Bulgaria. Central African Republic. Chad. Croatia. Democratic Republic of the Congo (Zaire). Estonia. Finland. FYR Macedonia. Greece. Hungary. Italy. Latvia. Libya. Lithuania. Norway. Poland. Romania. Russian Federation. Slovakia. Sudan. Svalbard. Sweden. Ukraine. Yugoslavia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2067,WGS84 / UTM zone 34S,Between 18 and 24 deg East; southern hemisphere. Angola. Botswana. Democratic Republic of the Congo (Zaire). Namibia. South Africa. Zambia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2068,WGS84 / UTM zone 35N,Between 24 and 30 deg East; northern hemisphere. Belarus. Bulgaria. Central African Republic. Democratic Republic of the Congo (Zaire). Egypt. Estonia. Finland. Greece. Latvia. Lesotho. Libya. Lithuania. Moldova. Norway. Romania. Russian Federation. Sudan. Svalbard. Turkey. Uganda. Ukraine.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2069,WGS84 / UTM zone 35S,Between 24 and 30 deg East; southern hemisphere. Botswana. Burundi. Democratic Republic of the Congo (Zaire). Rwanda. South Africa. Tanzania. Uganda. Zambia. Zimbabwe.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2070,WGS84 / UTM zone 36N,Between 30 and 36 deg East; northern hemisphere. Belarus. Cyprus. Egypt. Ethiopia. Finland. Israel. Jordan. Kenya. Lebanon. Norway. Russian Federation. Saudi Arabia. Sudan. Syria. Turkey. Uganda. Ukraine.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2071,WGS84 / UTM zone 36S,Between 30 and 36 deg East; southern hemisphere. Burundi. Kenya. Malawi. Mozambique. Rwanda. South Africa. Swaziland. Tanzania. Uganda. Zambia. Zimbabwe.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2072,WGS84 / UTM zone 37N,Between 36 and 42 deg East; northern hemisphere. Djibouti. Egypt. Eritrea. Ethiopia. Georgia. Iraq. Jordan. Kenya. Lebanon. Russian Federation. Saudi Arabia. Somalia. Sudan. Syria. Turkey. Ukraine.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2073,WGS84 / UTM zone 37S,Between 36 and 42 deg East; southern hemisphere. Kenya. Mozambique. Tanzania.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2074,WGS84 / UTM zone 38N,Between 42 and 48 deg East; northern hemisphere. Armenia. Azerbaijan. Djibouti. Eritrea. Ethiopia. Georgia. Islamic Republic of Iran. Iraq. Kazakstan. Kuwait. Russian Federation. Saudi Arabia. Somalia. Turkey. Yemen.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2075,WGS84 / UTM zone 38S,Between 42 and 48 deg East; southern hemisphere. Madagascar.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2076,WGS84 / UTM zone 39N,Between 48 and 54 deg East; northern hemisphere. Azerbaijan. Bahrain. Islamic Republic of Iran. Kazakstan. Kuwait. Oman. Qatar. Russian Federation. Saudi Arabia. Somalia. Turkmenistan. United Arab Emirates. Yemen.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2077,WGS84 / UTM zone 39S,Between 48 and 54 deg East; southern hemisphere. Madagascar.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2078,WGS84 / UTM zone 40N,Between 54 and 60 deg East; northern hemisphere. Islamic Republic of Iran. Kazakstan. Oman. Russian Federation. Saudi Arabia. Turkmenistan. United Arab Emirates. Uzbekistan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2079,WGS84 / UTM zone 40S,Between 54 and 60 deg East; southern hemisphere. Seychelles.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2080,WGS84 / UTM zone 41N,Between 60 and 66 deg East; northern hemisphere. Afghanistan. Islamic Republic of Iran. Kazakstan. Pakistan. Russian Federation. Turkmenistan. Uzbekistan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2081,WGS84 / UTM zone 41S,Between 60 and 66 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2082,WGS84 / UTM zone 42N,Between 66 and 72 deg East; northern hemisphere. Afghanistan. India. Kazakstan. Kyrgyzstan. Pakistan. Russian Federation. Tajikistan. Uzbekistan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2083,WGS84 / UTM zone 42S,Between 66 and 72 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2084,WGS84 / UTM zone 43N,Between 72 and 78 deg East; northern hemisphere. China. India. Kazakstan. Kyrgyzstan. Maldives. Pakistan. Russian Federation. Tajikistan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2085,WGS84 / UTM zone 43S,Between 72 and 78 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1332,USA - Alaska - St. Lawrence Island,United States (USA) - Alaska - St. Lawrence Island.,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+1333,USA - Alaska - St. Paul Island,United States (USA) - Alaska - St. Paul Island.,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+1334,USA - Hawaii,United States (USA) - Hawaii.,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+1335,Caribbean - Puerto Rico and the Virgin Islands,Puerto Rico; Virgin Islands (British); Virgin Islands (US).,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+1336,Canada - CSRS98,Canada - Alberta; New Brunswick; Saskatchewan; Prince Edward Island; and Quebec.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,1
+1337,USA and American Samoa HARN,American Samoa. United States (USA) - Alabama; 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 Dakota; Ohio; Oklahoma; Oregon; Rhode Island; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; [...]
+1338,Iran - Taheri refinery,Islamic Republic of Iran - Taheri refinery site only.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1339,Trinidad and Tobago - Trinidad,Trinidad and Tobago - Trinidad.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1340,Yemen - South Yemen,Yemen - South Yemen.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1341,South America - all countries,"South America - Argentina, Brazil, Bolivia, Chile, Colombia, Ecuador, French Guiana, Guyana, Paraguay, Peru, Suriname, Uruguay, Venezuela.",,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1342,Sierra Leone - Freetown Peninsula,Sierra Leone - Freetown Peninsula.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1343,Germany - east Germany all states,Germany - states of former East Germany (DDR) - Brandenburg; Mecklenburg-Vorpommern; Sachsen; Sachsen-Anhalt; Thuringen.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1344,Portugal - western Azores,"Portugal - western Azores - Flores, Corvo.",,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1345,Portugal - eastern Azores,"Portugal - eastern Azores - Sao Miguel, Santa Maria.",,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1346,Qatar - onshore,Qatar - onshore.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1347,Belgium - onshore,Belgium - onshore.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1348,South America - PSAD56,Bolivia; Ecuador; Peru; [Venezuela].,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1349,North America - NAD27,North and central America: Antigua and Barbuda. Belize. Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland; North West Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon. Costa Rica. Cuba. El Salvador. Guatemala. Honduras. Mexico. Nicaragua. United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kans [...]
+1350,North America - NAD83,North America: Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland; North West Territories; Nova Scotia; Nunavet; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon. Greenland. Mexico. 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; Mississ [...]
+1351,Asia - Middle East - Nahrwan,Arabian Gulf; Kuwait; Qatar - offshore; United Arab Emirates (UAE) - Abu Dhabi; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1352,Norway - onshore,Norway - onshore.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1353,France - onshore,France - onshore.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1354,Europe - British Isles - UK and Ireland,Ireland - onshore. United Kingdom (UK) - onshore - England; Scotland; Wales; Northern Ireland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1355,Indonesia - Sumatra,Indonesia - Sumatra.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1356,"Asia - Middle East - Israel, Jordan and Palestine Territory",Israel; Jordan; Palestine Territory.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.34,0
+1357,Europe - Pulkovo,Armenia; Azerbaijan; Belarus; Estonia; Georgia; Kazakstan; Kirgistan; Latvia; Lithuania; Moldova; Russian Federation; Tadzhikstan; Turkmenistan; Ukraine; Uzbekistan; Germany (former DDR); Czech Republic; Slovakia; Hungary; Poland; Romania; Latvia; Lithuania; Estonia; Albania.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1358,South America - SAD69,South America - Brazil.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1359,Indonesia - Kalimantan SE,Indonesia - southeast Kalimantan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1360,Indonesia - Kalimantan E,Indonesia - east Kalimantan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1361,Sudan - south,Sudan - south.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1362,Asia - Brunei and East Malaysia,Brunei; Malaysia - East Malaysia (Sabah; Sarawak).,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1363,UAE - Abu Dhabi and Dubai,United Arab Emirates (UAE) - Abu Dhabi; Dubai.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1364,Asia - Japan and Korea,Japan; North Korea; South Korea.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1365,Algeria - N of 32 deg N,Algeria - north of 32 deg North.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1366,"Africa - Algeria, Morocco and Tunisia",Algeria; Morocco; Tunisia.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1367,Canada - Ontario,Canada - Ontario.,,,,,EPSG,EPSG,1999-05-12 00:00:00,,0
+1368,Canada - Quebec,Canada - Quebec.,,,,,EPSG,EPSG,1999-10-22 00:00:00,,0
+1369,France - Alsace,France - Alsace.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1370,Venezuela - Deltana,Venezuela - Deltana area.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1371,Venezuela - Guarico state,Venezuela - Guarico state.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1372,USA - Alabama,United States (USA) - Alabama.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1373,USA - Arizona,United States (USA) - Arizona.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1374,USA - Arkansas,United States (USA) - Arkansas.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1375,USA - California,United States (USA) - California.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1376,USA - Colorado,United States (USA) - Colorado.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1377,USA - Connecticut,United States (USA) - Connecticut - counties of Fairfield; Hartford; Litchfield; Middlesex; New Haven; New London; Tolland; Windham.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+1378,USA - Delaware,United States (USA) - Delaware - counties of Kent; New Castle; Sussex.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+1379,USA - Florida,United States (USA) - Florida.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1380,USA - Georgia,United States (USA) - Georgia.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1381,USA - Idaho,United States (USA) - Idaho.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1382,USA - Illinois,United States (USA) - Illinois.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1383,USA - Indiana,United States (USA) - Indiana.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1384,USA - Iowa,United States (USA) - Iowa.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1385,USA - Kansas,United States (USA) - Kansas.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1386,USA - Kentucky,United States (USA) - Kentucky.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1387,USA - Louisiana,United States (USA) - Louisiana.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1388,USA - Maine,United States (USA) - Maine.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1389,USA - Maryland,United States (USA) - Maryland - counties of Allegany; Anne Arundel; Baltimore; Calvert; Caroline; Carroll; Cecil; Charles; Dorchester; Frederick; Garrett; Harford; Howard; Kent; Montgomery; Prince Georges; Queen Annes; Somerset; St. Marys; Talbot; Washington; Wicomico; Worcester.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+1390,USA - Massachusetts,United States (USA) - Massachusetts.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1391,USA - Michigan,United States (USA) - Michigan.,,,,,EPSG,EPSG,1996-12-12 00:00:00,,0
+1392,USA - Minnesota,United States (USA) - Minnesota.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1393,USA - Mississippi,United States (USA) - Mississippi.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1394,USA - Missouri,United States (USA) - Missouri.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1395,USA - Montana,United States (USA) - Montana - counties of Beaverhead; Big Horn; Blaine; Broadwater; Carbon; Carter; Cascade; Chouteau; Custer; Daniels; Dawson; Deer Lodge; Fallon; Fergus; Flathead; Gallatin; Garfield; Glacier; Golden Valley; Granite; Hill; Jefferson; Judith Basin; Lake; Lewis and Clark; Liberty; Lincoln; Madison; McCone; Meagher; Mineral; Missoula; Musselshell; Park; Petroleum; Phillips; Pondera; Powder River; Powell; Prairie; Ravalli; Richland; Roosevelt; Rosebud; [...]
+1396,USA - Nebraska,United States (USA) - Nebraska - counties of Adams; Antelope; Arthur; Banner; Blaine; Boone; Box Butte; Boyd; Brown; Buffalo; Burt; Butler; Cass; Cedar; Chase; Cherry; Cheyenne; Clay; Colfax; Cuming; Custer; Dakota; Dawes; Dawson; Deuel; Dixon; Dodge; Douglas; Dundy; Fillmore; Franklin; Frontier; Furnas; Gage; Garden; Garfield; Gosper; Grant; Greeley; Hall; Hamilton; Harlan; Hayes; Hitchcock; Holt; Hooker; Howard; Jefferson; Johnson; Kearney; Keith; Keya Paha; Kimball [...]
+1397,USA - Nevada,United States (USA) - Nevada.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1398,USA - New Hampshire,United States (USA) - New Hampshire - counties of Belknap; Carroll; Cheshire; Coos; Grafton; Hillsborough; Merrimack; Rockingham; Strafford; Sullivan.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1399,USA - New Jersey,United States (USA) - New Jersey - counties of Atlantic; Bergen; Burlington; Camden; Cape May; Cumberland; Essex; Gloucester; Hudson; Hunterdon; Mercer; Middlesex; Monmouth; Morris; Ocean; Passaic; Salem; Somerset; Sussex; Union; Warren.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1400,USA - New Mexico,United States (USA) - New Mexico.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1401,USA - New York,United States (USA) - New York.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1402,USA - North Carolina,United States (USA) - North Carolina - counties of Alamance; Alexander; Alleghany; Anson; Ashe; Avery; Beaufort; Bertie; Bladen; Brunswick; Buncombe; Burke; Cabarrus; Caldwell; Camden; Carteret; Caswell; Catawba; Chatham; Cherokee; Chowan; Clay; Cleveland; Columbus; Craven; Cumberland; Currituck; Dare; Davidson; Davie; Duplin; Durham; Edgecombe; Forsyth; Franklin; Gaston; Gates; Graham; Granville; Greene; Guilford; Halifax; Harnett; Haywood; Henderson; Hertford; [...]
+1403,USA - North Dakota,United States (USA) - North Dakota.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1404,USA - Ohio,United States (USA) - Ohio.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1405,USA - Oklahoma,United States (USA) - Oklahoma.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1406,USA - Oregon,United States (USA) - Oregon.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1407,USA - Pennsylvania,United States (USA) - Pennsylvania.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1408,USA - Rhode Island,United States (USA) - Rhode Island - counties of Bristol; Kent; Newport; Providence; Washington.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1409,USA - South Carolina,United States (USA) - South Carolina - counties of Abbeville; Aiken; Allendale; Anderson; Bamberg; Barnwell; Beaufort; Berkeley; Calhoun; Charleston; Cherokee; Chester; Chesterfield; Clarendon; Colleton; Darlington; Dillon; Dorchester; Edgefield; Fairfield; Florence; Georgetown; Greenville; Greenwood; Hampton; Horry; Jasper; Kershaw; Lancaster; Laurens; Lee; Lexington; Marion; Marlboro; McCormick; Newberry; Oconee; Orangeburg; Pickens; Richland; Saluda; Spartanb [...]
+1410,USA - South Dakota,United States (USA) - South Dakota.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1411,USA - Tennessee,United States (USA) - Tennessee - counties of Anderson; Bedford; Benton; Bledsoe; Blount; Bradley; Campbell; Cannon; Carroll; Carter; Cheatham; Chester; Claiborne; Clay; Cocke; Coffee; Crockett; Cumberland; Davidson; De Kalb; Decatur; Dickson; Dyer; Fayette; Fentress; Franklin; Gibson; Giles; Grainger; Greene; Grundy; Hamblen; Hamilton; Hancock; Hardeman; Hardin; Hawkins; Haywood; Henderson; Henry; Hickman; Houston; Humphreys; Jackson; Jefferson; Johnson; Knox; Lake; [...]
+1412,USA - Texas,United States (USA) - Texas.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1413,USA - Utah,United States (USA) - Utah.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1414,USA - Vermont,United States (USA) - Vermont - counties of Addison; Bennington; Caledonia; Chittenden; Essex; Franklin; Grand Isle; Lamoille; Orange; Orleans; Rutland; Washington; Windham; Windsor.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1415,USA - Virginia,United States (USA) - Virginia.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1416,USA - Washington,United States (USA) - Washington.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1417,USA - West Virginia,United States (USA) - West Virginia.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1418,USA - Wisconsin,United States (USA) - Wisconsin.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1419,USA - Wyoming,United States (USA) - Wyoming.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1420,Canada - Quebec - E of 57 deg W,Canada - Quebec - east of 57 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1421,Canada - Quebec - 60 to 57 deg W.,Canada - Quebec between 60 and 57 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1422,Canada - Quebec - 63 to 60 deg W,Canada - Quebec between 63 and 60 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1423,Canada - Quebec - 66 to 63 deg W,Canada - Quebec between 66 and 63 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1424,Canada - Quebec - 69 to 66 deg W,Canada - Quebec between 69 and 66 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1425,Canada - Quebec - 72 to 69 deg W,Canada - Quebec between 72 and 69 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1426,Canada - Quebec - 75 to 72 deg W,Canada - Quebec between 75 and 72 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1427,Canada - Quebec - 78 to 75 deg W,Canada - Quebec between 78 and 75 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1428,Canada - Quebec - W of 78 deg W,Canada - Quebec west of 78 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1429,Canada - Ontario - E of 75 deg W,Canada - Ontario - east of 75 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1430,Canada - Ontario - 78 to 75 deg W,Canada - Ontario - between 78 and 75 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1431,Canada - Ontario - MTM zone 10,Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1432,Canada - Ontario - MTM zone 11,Canada - Ontario - south of 46 deg N and west of 81 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1433,Canada - Ontario - MTM zone 12,Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1434,Canada - Ontario - MTM zone 13,Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1435,Canada - Ontario - 88.5 to 85.5 deg W,Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1436,Canada - Ontario - 91.5 to 88.5 deg W,Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1437,Canada - Ontario - 94.5 to 91.5 deg W,Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1438,Canada - Ontario - W of 94.5 deg W,Canada - Ontario - west of 94 deg 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1439,Canada - Ontario - 96 to 90 deg W,Canada - Ontario - between 96 and 90 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1440,Canada - Ontario - 90 to 84 deg W,Canada - Ontario - between 90 and 84 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1441,Canada - Ontario - 84 to 78 deg W,Canada - Ontario - between 84 and 78 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1442,Canada - Ontario - E of 78 deg W,Canada - Ontario - east of 78 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1443,Canada - Quebec - 78 to 72 deg W,Canada - Quebec - between 78 and 72 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1444,Canada - Quebec - 72 to 66 deg W,Canada - Quebec - between 72 and 66 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1445,Canada - Quebec - 66 to 60 deg W,Canada - Quebec - between 66 and 60 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1446,Canada - Quebec - E of 60 deg W,Canada - Quebec - east of 60 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1447,Canada - New Brunswick,Canada - New Brunswick.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1448,Canada - 72 to 66 deg W,Canada - New Brunswick west of 66 deg West; Quebec between 72 and 66 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1449,Canada - 66 to 60 deg W,Canada - New Brunswick east of 66 deg West; Nova Scotia; Prince Edward Island; Quebec between 66 and 60 deg West.,,,,,EPSG,EPSG,2002-07-13 00:00:00,2002.41,0
+1450,Cote d'Ivoire (Ivory Coast) - E of 6 deg W,C�te d'Ivoire (Ivory Coast) east of 6 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1451,Cote d'Ivoire (Ivory Coast) - W of 6 deg W,C�te d'Ivoire (Ivory Coast) west of 6 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1452,Vietnam - W of 108 deg E,Vietnam - west of 108 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1453,Vietnam - E of 108 deg E,Vietnam - east of 108 deg East.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1454,South Africa - Walvis Bay,South Africa - Walvis Bay.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1455,South Africa - W of 18 deg E,South Africa - west of 18 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1456,South Africa - 18 to 20 deg E,South Africa - between 18 and 20 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1457,South Africa - 20 to 22 deg E,South Africa - between 20 and 22 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1458,South Africa - 22 to 24 deg E,South Africa - between 22 and 24 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1459,South Africa - 24 to 26 deg E,Lesotho - west of 26 deg East. South Africa - between 24 and 26 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1460,South Africa - 26 to 28 deg E,Lesotho - east of 26 deg East. South Africa - between 26 and 28 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1461,South Africa - 28 to 30 deg E,South Africa - between 28 and 30 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1462,South Africa - 30 to 32 deg E,South Africa - between 30 and 32 deg East. Swaziland.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1463,South Africa - E of 32 deg E,South Africa - east of 32 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1464,Iran - W of 48 deg E,Islamic Republic of Iran - west of 48 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1465,Iran - 48 to 54 deg E,Islamic Republic of Iran - between 48 and 54 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1466,Iran - 54 to 60 deg E,Islamic Republic of Iran - between 54 and 60 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1467,Iran - E of 60 deg E,Islamic Republic of Iran - east of 60 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1468,Guinea - W of 12 deg W,Guinea - west of 12 deg West.,,,,,EPSG,EPSG,1999-12-09 00:00:00,,0
+1469,Guinea - E of 12 deg W,Guinea - east of 12 deg West.,,,,,EPSG,EPSG,1999-12-09 00:00:00,,0
+1470,Libya - W of 10 degrees E,Libyan Arab Jamahiriya - west of 10 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1471,Libya - 10 to 12 degrees E,Libyan Arab Jamahiriya - between 10 and 12 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1472,Libya - 12 to 14 degrees E,Libyan Arab Jamahiriya - between 12 and 14 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1473,Libya - 14 to 16 degrees E,Libyan Arab Jamahiriya - between 14 and 16 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1474,Libya - 16 to 18 degrees E,Libyan Arab Jamahiriya - between 16 and 18 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1475,Libya - 18 to 20 degrees E,Libyan Arab Jamahiriya - between 18 and 20 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1476,Libya - 20 to 22 degrees E,Libyan Arab Jamahiriya - between 20 and 22 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1477,Libya - 22 to 24 degrees E,Libyan Arab Jamahiriya - between 22 and 24 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1478,Libya - E of 24 degrees E,Libyan Arab Jamahiriya - east of 24 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1479,Libya - W of 12 degrees E,Libyan Arab Jamahiriya - west of 12 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1480,Libya - 12 to 18 degrees E,Libyan Arab Jamahiriya - between 12 and 18 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1481,Libya - 18 to 24 degrees E,Libyan Arab Jamahiriya - between 18 and 24 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1482,Libya - W of 15 degrees E,Libyan Arab Jamahiriya - west of 15 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1483,Argentina - Neuquen province - 70.5 to 67.5 deg W,Argentina - Neuquen province between 70 deg 30 min and 67 deg 30 min West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1484,Argentina - Comodoro Rivadavia - W of 67.5 deg W,Argentina - Comodoro Rivadavia area west of 67 deg 30 min West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1485,Argentina - Tierra del Fuego - onshore W of 67.5 deg W,Argentina - Tierra del Fuego onshore west of 67 deg 30 min West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1486,Argentina - Tierra del Fuego - offshore,Argentina - Tierra del Fuego offshore.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1487,Cuba - N of 21.5 deg N,Cuba - north of 21deg 30min North.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1488,Cuba - S of 21.5 deg N,Cuba - south of 21deg 30min North.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1489,Tunisia - offshore,Tunisia - offshore.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1490,Yemen - W of 48 deg E,Yemen - west of 48 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1491,Yemen - E of 48 deg E,Yemen - east of 48 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1492,Yemen - South Yemen - W of 48 deg E,Yemen - South Yemen west of 48 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1493,Yemen - South Yemen - E of 48 deg E,Yemen - South Yemen east of 48 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1494,Vietnam - Meekong delta,Vietnam - Meekong delta.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1495,Vietnam - offshore Nam Con Son basin,Vietnam - offshore Nam Con Son basin.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1496,South Korea - E of 128 deg E,Republic of Korea (South Korea) - east of 128 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1497,South Korea - 126 to 128 deg E.,Republic of Korea (South Korea) - between 126 and 128 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1498,South Korea - W of 126 deg E,Republic of Korea (South Korea) - west of 126 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1499,Venezuela - Maracaibo - blocks I II and III..,"Venezuela - Maracaibo area offshore blocks I, II and III.",,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1500,New Zealand - North Island,New Zealand - North Island.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1501,New Zealand - South Island,New Zealand - South Island.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1502,New Zealand - offshore W of 168 deg E,New Zealand - offshore west of 168 deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1503,New Zealand - offshore 168 to 174 deg E,New Zealand - offshore between 168 and 174 deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1504,New Zealand - offshore E of 174 deg E,New Zealand - offshore east of 174 deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1505,Ghana - offshore,Ghana - offshore.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1506,Canada - Saskatchewan - E of 108 deg W,Canada - Saskatchewan east of 108 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1507,Canada - Alberta and Saskatchewan - 114 to 108 deg W,Canada - Alberta east of 114 deg West; Saskatchewan west of 108 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1508,Canada - Alberta W of 114 deg W,Canada - Alberta west of 114 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1509,Sierra Leone - W of 12 deg W,Sierra Leone - west of 12 deg West.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1510,Sierra Leone - E of 12 deg W,Sierra Leone - east of 12 deg West.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1511,USA - conus and Alaska,United States (USA) - 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; [...]
+1512,Germany - east Germany - W of 10.5 deg E,Germany - states of former East Germany (DDR) west of 10 deg 30 min East - Thuringen.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1513,Germany - east Germany - 10.5 to 13.5 deg E,Germany - states of former East Germany (DDR) between 10 deg 30 min and 13 deg 30 min East - Brandenburg; Mecklenburg-Vorpommern; Sachsen; Sachsen-Anhalt; Thuringen.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1514,Germany - east Germany - E of 13.5 deg E,Germany - states of former East Germany (DDR) east of 13 deg 30 min East - Brandenburg; Mecklenburg-Vorpommern; Sachsen.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1515,Poland - zone I,Poland - southeast - south of 52 deg 20 min North and east of 18 deg East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1516,Poland - zone II,Poland - northeast - north of 51 deg 20 min North and east of 19 deg East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1517,Poland - zone III,Poland - northwest - north of 52 deg 10 min North and west of 20 deg East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1518,Poland - zone IV,Poland - southwest - south of 53 deg 20 min North and west of 19 deg 05 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1519,Poland - zone V,"Poland - south central - between 49 deg 20 min North and 51 deg 20 min North, 18 deg 20 min East and 19 deg 40min East.",,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1520,Poland - W of 16.5 deg E,Poland - west of 16 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1521,Poland - 16.5 to 19.5 deg E,Poland - between 16 deg 30 min and 19 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1522,Poland - 19.5 to 22.5 deg E,Poland - between 19 deg 30 min and 22 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1523,Poland - E of 22.5 deg E,Poland - east of 22 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1524,Turkey - W of 28.5 deg E,Turkey west of 28 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1525,Turkey - 28.5 to 31.5 deg E,Turkey between 28 deg 30 min and 31 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1526,Turkey - 31.5 to 34.5 deg E,Turkey between 31 deg 30 min and 34 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1527,Turkey - 34.5 to 37.5 deg E,Turkey between 34 deg 30 min and 37 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1528,Turkey - 37.5 to 40.5 deg E,Turkey between 37 deg 30 min and 40 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1529,Turkey - 40.5 to 43.5 deg E,Turkey between 40 deg 30 min and 43 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1530,Turkey - E of 43.5 deg E,Turkey east of 43 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1531,Canada - New Brunswick - W of 66 deg W,Canada - New Brunswick - west of 66 deg West.,,,,,EPSG,EPSG,1997-07-22 00:00:00,,0
+1532,Canada - Maritime Provinces - E of 66 deg W,Canada - New Brunswick - east of 66 deg W.; Canada - Nova Scotia; Canada - Prince Edward Island.,,,,,EPSG,EPSG,1997-07-22 00:00:00,,0
+1533,Canada - Prince Edward Island,Canada - Prince Edward Island.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1534,Canada - Nova Scotia - E of 63 deg W,Canada - Nova Scotia - east of 63 deg West.,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+1535,Canada - Nova Scotia - W of 63 deg W,Canada - Nova Scotia - west of 63 deg West.,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+1536,Finland - W of 22.5 deg E,Finland - west of 22 deg 30 min East.,,,,,EPSG,EPSG,1997-07-22 00:00:00,,0
+1537,Finland - 22.5 deg to 25.5 deg E,Finland - between 22 deg 30 min and 25 deg 30 min East.,,,,,EPSG,EPSG,1997-07-22 00:00:00,,0
+1538,Finland - zone 3,Finland - between 25 deg 30 min and 28 deg 30 min East for Basic Coordinate System and all Finland for Uniform Coordinate System.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1539,Finland - E of 28.5 deg E,Finland - east of 28 deg 30 min East.,,,,,EPSG,EPSG,1997-07-22 00:00:00,,0
+1540,Mozambique - W of 36 deg E,Mozambique - west of 36 deg East.,,,,,EPSG,EPSG,1998-04-16 00:00:00,,0
+1541,Mozambique - E of 36 deg E,Mozambique - east of 36 deg East.,,,,,EPSG,EPSG,1998-04-16 00:00:00,,0
+1542,Asia - Cambodia and Vietnam - W of 108 deg E,Cambodia; Vietnam west of 108 deg East.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1544,Oman - W of 54 deg E,Oman - west of 54 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1545,Oman - E of 54 deg E,Oman - east of 54 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1546,USA - Hawaii - island of Hawaii,United States (USA) - Hawaii - island of Hawaii.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1547,USA - Hawaii - Maui; Kahoolawe; Lanai; Molokai.,United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1548,USA - Hawaii - Oahu.,United States (USA) - Hawaii - Oahu.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1549,USA - Hawaii - Kauai.,United States (USA) - Hawaii - Kauai.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1550,USA - Hawaii - Niihau.,United States (USA) - Hawaii - Niihau.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1551,Grenada including Grenada Grenadines,Grenada (including Grenada Grenadines).,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+1552,Africa - Ethiopia and Sudan - W of 42 deg E,Ethiopia - west of 42 degrees East. Sudan - west of 42 degrees East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1553,Africa - Ethiopia and Sudan - E of 42 deg E,Ethiopia - east of 42 degrees East. Sudan - east of 42 degrees East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1554,Somalia - W of 48 deg E,Somalia - west of 48 degrees East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1555,Somalia - E of 48 deg E,Somalia - east of 48 degrees East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1556,Australia - 102 to 108 deg E,Australia - between 102 and 108 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1557,Australia - 108 to 114 deg E,Australia - between 108 and 114 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1558,Australia - 114 to 120 deg E,Australia - between 114 and 120 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1559,Australia - 120 to 126 deg E,Australia - between 120 and 126 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1560,Australia - 126 to 132 deg E,Australia - between 126 and 132 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1561,Australia - 132 to 138 deg E,Australia - between 132 and 138 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1562,Australia - 138 to 144 deg E,Australia - between 138 and 144 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1563,Australia - 144 to 150 deg E,Australia - between 144 and 150 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1564,Australia - 150 to 156 deg E,Australia - between 150 and 156 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1565,Australia - 156 to 162 deg E,Australia - between 156 and 162 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1566,Australia - 162 to 168 deg E,Australia - between 162 and 168 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1567,Australasia - Australia and PNG - 138 to 144 deg E,Australia - between 138 and 144 deg East. Papua New Guinea (PNG) - west of 144 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1568,Australasia - Australia and PNG - 144 to 150 deg E,Australia - between 144 and 150 deg East. Papua New Guinea (PNG) - east of 144 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1569,Saudi Arabia - W of 42 deg E,Saudi Arabia - west of 42 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1570,Saudi Arabia - E of 48 deg E,Saudi Arabia - east of 48 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1571,Asia - Middle East - Kuwait and Saudi - 42 to 48 deg E,Kuwait. Saudi Arabia - between 42 and 48 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1572,Brazil - Aratu - W of 48 deg W,Brazil - coastal areas south of 2 deg 55 min South and west of 48 deg West.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1573,Brazil - Aratu - 48 to 42 deg W,Brazil - coastal areas south of 2 deg 55 min South and between 48 and 42 deg West; offshore Santos basin.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1574,Brazil - Aratu - E of 42 deg W,Brazil - coastal areas south of 2 deg 55 min South and east of 42 deg West; offshore Campos basin.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1575,Africa - Botswana and Zambia - W of 24 deg E,Botswana and Zambia - west of 24 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1576,"Africa - Botswana, Zambia and Zimbabwe - 24 to 30 deg E",Botswana - east of 24 deg East; Zambia - between 24 and 30 deg East; Zimbabwe west of 30 deg East .,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1577,"Africa - Malawi, Zambia and Zimbabwe - E of 30 deg E",Malawi. Zambia and Zimbabwe - east of 30 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1578,Uganda - N of equator and W of 30 deg E,Uganda - north of equator and west of 30 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1579,Africa - Tanzania and Uganda - S of equator and W of 30 deg E,Tanzania - west of 30 deg East; Uganda south of equator and west of 30 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1580,Africa - Kenya and Uganda - N of equator and 30 to 36 deg E,Kenya - north of equator and west of 36 deg East; Uganda north of equator and east of 30 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1581,"Africa - Kenya, Tanzania and Uganda - S of equator and 30 to 36 deg E",Kenya - south of equator and west of 36 deg East; Tanzania - 30 to 36 deg East; Uganda south of equator and east of 30 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1582,Kenya - N of equator and E of 36 deg E,Kenya - north of equator and east of 36 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1583,Africa - Kenya and Tanzania - S of equator and E of 36 deg E,Kenya - south of equator and east of 36 deg East; Tanzania - east of 36 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1584,Indonesia - Java - W of 108 deg E,Indonesia - Java - west of 108 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1585,Indonesia - Java - E of 114 deg E,Indonesia - Java - east of 114 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1586,Indonesia - Java - 108 to 114 deg E,Indonesia - Java - between 108 and 114 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1587,China - W of 78 deg E,China - west of 78 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1588,China - 78 to 84 deg E,China - between 78 and 84 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1589,China - 84 to 90 deg E,China - between 84 and 90 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1590,China - 90 to 96 deg E,China - between 90 and 96 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1591,China - 96 to 102 deg E,China - between 96 and 102 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1592,China - 102 to 108 deg E,China - between 102 and 108 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1593,China - 108 to 114 deg E,China - between 108 and 114 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1594,China - 114 to 120 deg E,China - between 114 and 120 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1595,China - 120 to 126 deg E,China - between 120 and 126 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1596,China - 126 to 132 deg E,China - between 126 and 132 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1597,China - E of 132 deg E,China - east of 132 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1598,Colombia - W of 75d 35m W,Colombia - west of 1 deg 30 min W of Bogota (75d 34m 51.30s W of Greenwich).,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+1599,Colombia - 75d 35m to 72d 35m W,Colombia - between 1 deg 30 min W and 1 deg 30 min E of Bogota (75d 35m W and 72d 35m W of Greenwich).,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+1600,Colombia - 72d 35m to 69d 35m W,Colombia - between 1 deg 30 min and 4 deg 30 min E of Bogota (72d 35m and 69d 34m W of Greenwich).,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+1601,Colombia - E of 69d 35m W,Colombia - east of 4 deg 30 min E of Bogota (69d 34m 51.3s W of Greenwich).,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+1602,Colombia - offshore W of 78 deg W,Colombia - offshore west of 78 deg W of Greenwich.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1603,Colombia - offshore E of 78 deg W,Colombia - offshore east of 78 deg W of Greenwich.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1604,Angola - Angola proper - offshore,Angola - Angola proper - offshore,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1605,Angola - Angola proper - offshore block 15,Angola - Angola proper - offshore block 15,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1606,Angola - Angola proper - offshore - W of 12 deg E,Angola - Angola proper - offshore - west of 12 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1607,Angola - 12 to 18 deg E,Angola - between 12 and 18 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1608,Argentina - W of 70.5 deg W,Argentina - west of 70 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1609,Argentina - 70.5 to 67.5 deg W,Argentina - between 70 deg 30 min and 67 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1610,Argentina - 67.5 to 64.5 deg W,Argentina - between 67 deg 30 min and 64 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1611,Argentina - 64.5 to 61.5 deg W,Argentina - between 64 deg 30 min and 61 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1612,Argentina - 61.5 to 58.5 deg W,Argentina - between 61 deg 30 min and 58 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1613,Argentina - 58.5 to 55.5 deg W,Argentina - between 58 deg 30 min and 55 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1614,Argentina - E of 55.5 deg W,Argentina - east of 55 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1615,Botswana - W of 21 deg E,Botswana - west of 21 deg East.,,,,,EPSG,EPSG,1995-12-08 00:00:00,,0
+1616,Botswana - 21 to 27 deg E,Botswana - between 21 and 27deg East.,,,,,EPSG,EPSG,1995-12-08 00:00:00,,0
+1617,Botswana - E of 27 deg E,Botswana - east of 27 deg East.,,,,,EPSG,EPSG,1995-12-08 00:00:00,,0
+1618,Tunisia - onshore,Tunisia - onshore.,,,,,EPSG,EPSG,1999-11-15 00:00:00,,0
+1619,Tunisia - N of 34 deg 39 min N,Tunisia - north of 38.5 grads (34 deg 39 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1620,Tunisia - S of 34 deg 39 min N,Tunisia - south of 38.5 grads (34 deg 39 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1621,Brazil - Corrego Alegre - W of 42 deg W,Brazil - NE coastal area between 45 deg West and 42 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1622,Brazil - Corrego Alegre - E of 42 deg W,Brazil - NE coastal area between 42 deg West and 40 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1623,Asia - Middle East - Lebanon and Syria,Lebanon. Syrian Arab Republic.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1624,Germany - W of 7.5 deg E,"Germany west of 7 deg 30 min East - Niedersachsen, Nordrhein-Westfalen, Rheinland-Pfalz, Saarland.",,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1625,Germany - 7.5 to 10.5 deg E,"Germany - former West Germany onshore between 7 deg 30 min and 10 deg 30 min East - Baden-Wurtemberg, Bayern, Hessen, Niedersachsen, Nordrhein-Westfalen, Rhineland-Pfalz, Schleswig-Holstein. Also former East German (DDR) state of Thuringen by transformation.",,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1626,Germany - 10.5 to 13.5 deg E,"Germany - former West Germany onshore between 10 deg 30 min and 13 deg 30 min East - Bayern, Niedersachsen, Schleswig-Holstein. Also former East German (DDR) states of Sachsen and Thuringen by transformation.",,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1627,Germany - 13.5 to 16.5 deg E,Germany - former West Germany onshore east of 13 deg 30 min East - Bayern. Also former East German (DDR) state of Sachsen by transformation.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1628,Germany - W of 4.5 deg E,Germany - onshore west of 4 deg 30 min East.,,,,Not valid - do not use !,EPSG,EPSG,2000-03-07 00:00:00,,1
+1629,UK - offshore North Sea,United Kingdom (UKCS) - offshore North Sea.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1630,Netherlands - offshore,Netherlands - offshore North Sea.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1631,Europe - ED50 / UTM 28,Europe - between 18 and 12 deg West - Ireland offshore; Spain (Canary Islands); United Kingdom (UKCS) offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1632,Europe - ED50 / UTM 29,Europe - between 12 and 6 deg West - Portugal; Spain; Ireland offshore; United Kingdom (UKCS) offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1633,Europe - ED50 / UTM 30,Europe - between 6 deg West and 0 deg East - Faroe Islands; France offshore; Gibraltar; Ireland offshore; Spain; United Kingdom - UKCS offshore - North Sea west of 0 d eg East).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1634,Europe - ED50 / UTM 31,Europe - between 0 and 6 deg East - Denmark (North Sea); Germany offshore; Netherlands offshore; Norway; Spain (Balearic Islands); United Kingdom (UKCS) offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1635,Europe - ED50 / UTM 32,Europe - between 6 and 12 deg East - Denmark; Germany offshore; Italy; Netherlands offshore; Norway.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1636,Europe - ED50 / UTM 33,Europe - between 12 and 18 deg East - Denmark (Bornholm); Italy; Norway.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1637,Europe - ED50 / UTM 34,Europe - between 18 and 24 deg East - Greece; Norway.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1638,Europe - ED50 / UTM 35,Europe - between 24 and 30 deg East - Greece; Norway; Turkey. Egypt - Western Desert.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1639,Europe - ED50 / UTM 36,Europe - between 30 and 36 deg East - Turkey.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1640,Europe - ED50 / UTM 37,Europe - between 36 and 42 deg East - Turkey.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1641,Europe - ED50 / UTM 38,Europe - between 42 and 48 deg East - Turkey.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1642,Egypt - Sinai peninsula,Egypt - Sinai peninsula.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+1643,Egypt - E of 29 deg E,Egypt - east of 29 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1644,Egypt - W of 29 deg E; N of 28 deg 11 min N,Egypt - west of 29 deg E; north of approximately 28 deg 11 min North.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1645,Egypt - W of 29 deg E; S of 28 deg 11 min N,Egypt - west of 29 deg E; south of approximately 28 deg 11 min North.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1646,Europe - Estonia; Latvia; Lithuania.,Estonia; Latvia; Lithuania.,,,,,EPSG,EPSG,1998-12-14 00:00:00,,0
+1647,Indonesia - N of equator and W of 96 deg E,Indonesia - north of equator and west of 96 deg East.,,,,,EPSG,EPSG,1995-08-08 00:00:00,,0
+1648,Indonesia - S of equator and W of 96 deg E,Indonesia - south of equator and west of 96 deg East.,,,,,EPSG,EPSG,1995-08-08 00:00:00,,0
+1649,Indonesia - N of equator and 96 to 102 deg E,Indonesia - north of equator and between 96 and 102 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1650,Indonesia - S of equator and 96 to 102 deg E,Indonesia - south of equator and between 96 and 102 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1651,Indonesia - N of equator and 102 to 108 deg E,Indonesia - north of equator and between 102 and 108 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1652,Indonesia - S of equator and 102 to 108 deg E,Indonesia - south of equator and between 102 and 108 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1653,Indonesia - N of equator and 108 to 114 deg E,Indonesia - north of equator and between 108 and 114 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1654,Indonesia - S of equator and 108 to 114 deg E,Indonesia - south of equator and between 108 and 114 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1655,Indonesia - N of equator and 114 to 120 deg E,Indonesia - north of equator and between 114 and 120 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1656,Indonesia - S of equator and 114 to 120 deg E,Indonesia - south of equator and between 114 and 120 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1657,Indonesia - N of equator and 120 to 126 deg E,Indonesia - north of equator and between 120 and 126 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1658,Indonesia - S of equator and 120 to 126 deg E,Indonesia - south of equator and between 120 and 126 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1659,Indonesia - N of equator and 126 to 132 deg E,Indonesia - north of equator and between 126 and 132 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1660,Indonesia - S of equator and 126 to 132 deg E,Indonesia - south of equator and between 126 and 132 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1661,Indonesia - N of equator and 132 to 138 deg E,Indonesia - north of equator and east of 132 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1662,Indonesia - S of equator and 132 to 138 deg E,Indonesia - south of equator and between 132 and 138 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1663,Indonesia - S of equator and E of 138 deg E,Indonesia - south of equator and east of 138 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1664,Myanmar (Burma) - W of 96 deg E,Myanmar (Burma) - west of 96 deg East.,,,,,EPSG,EPSG,1998-06-13 00:00:00,,0
+1665,Asia - Myanmar and Thailand - 96 to 102 deg E,Myanmar (Burma) - east of 96 deg East; Thailand - west of 102 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1666,Thailand - E of 102 deg E,Thailand - east of 102 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1667,Thailand - W of 102 deg E,Thailand - west of 102 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1668,Pakistan - N of 35 deg 35 min N,Pakistan - north of 35 deg 35 min North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1669,Asia - India; Pakistan - 28 to 35.5 deg N,India north of 28 deg North; Pakistan 28 deg to 35 deg 35 min North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1670,Asia - India; Pakistan - zone IIa,India - between 21 and 28 deg North and west of 82 deg East; Pakistan - south of 28 deg North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1671,Asia - Bangladesh; India; Myanmur; Pakistan - zone IIb,Bangladesh; India - north of 22 deg North and east of 82 deg East; Myanmar (Burma) - north of 22 deg North.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1672,India - 15 to 21 deg N,India - between 15 and 21 deg North.,,,,,EPSG,EPSG,2000-04-23 00:00:00,,0
+1673,India - S of 15 deg N,India - south of 15 deg North.,,,,,EPSG,EPSG,2000-04-23 00:00:00,,0
+1674,Bangladesh - W of 90 deg E,Bangladesh - west of 90 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1675,Bangladesh - E of 90 deg E,Bangladesh - east of 90 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1676,India - N of 28 deg N,India - north of 28 deg North.,,,,,EPSG,EPSG,2000-04-23 00:00:00,,0
+1677,India - 21 to 28deg N and W of 82 deg E,India - between 21 and 28 deg North and west of 82 deg East.,,,,,EPSG,EPSG,2000-04-23 00:00:00,,0
+1678,India - N of 21 deg N and E of 82 deg E,India - north of 21 deg North and east of 82 deg East.,,,,,EPSG,EPSG,2000-04-23 00:00:00,,0
+1679,India - W of 72 deg E,India - west of 72 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1680,India - 72 to 78 deg E,India - between 72 and 78 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1681,India - 78 to 84 deg E,India - between 78 and 84 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1682,India - 84 to 90 deg E,India - between 84 and 90 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1683,India - 90 to 96 deg E,India - between 90 and 96 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1684,India - E of 96 deg E,India - east of 96 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1685,Pakistan - N of 28 deg N,Pakistan - north of 28 deg North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1686,Pakistan - S of 28 deg N,Pakistan - south of 28 deg North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1687,Pakistan - W of 66 deg E,Pakistan - west of 66 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1688,Pakistan - 66 to 72 deg E,Pakistan - between 66 and 72 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1689,Pakistan - E of 72 deg E,Pakistan - east of 72 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1690,Malaysia - West Malaysia,Malaysia - West Malaysia.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1691,Malaysia - West Malaysia - W of 102 deg E,Malaysia - West Malaysia west of 102 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1692,Malaysia - West Malaysia - E of 102 deg E,Malaysia - West Malaysia east of 102 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1693,Venezuela - W of 72 deg W,Venezuela - west of 72 deg West.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1694,Venezuela - 72 to 66 deg W,Venezuela - between 72 and 66 deg West.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1695,Venezuela - E of 66 deg W,Venezuela - east of 66 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1696,Gabon - N of equator,Gabon - north of equator.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1697,Gabon - S of equator,Gabon - south of equator.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1698,Philippines - zone I,Philippines - west of 118 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1699,Philippines - zone II,Philippines - Palawan; Calamian Islands.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1700,Philippines - zone III,Philippines - Luzon (except SE part;); Mindoro.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1701,Philippines - zone IV,Philippines - SE Luzon; Tablas; Masbate; Panay; Cebu; Negros; west Mindanao.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1702,Philippines - zone V,Philippines - east Mindanao; Bohol; Samar.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1703,Morocco - N of 31.5 deg N,Morocco north of 35 grads (31 deg 30 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1704,Morocco - 27.9 to 31.5 deg N,Morocco between 31 and 35 grads (27 deg 54 min and 31 deg 30 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1705,Morocco - S of 27.9 deg N,Morocco south of 31grads (27 deg 54 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1706,Austria - W of 11 deg 50 min E,Austria west of 11deg 50min East of Greenwich (29 deg 30 min East of Ferro).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1707,Austria - 11 deg 50 min to 14deg 50min E,Austria between 11deg 50min and 14deg 50min East of Greenwich (29 deg 30 min and 32 deg 30 min East of Ferro).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1708,Austria - E of 14 deg 50 min E,Austria east of 14deg 50min East of Greenwich (32 deg 30 min East of Ferro).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1709,Europe - former Yugoslavia - W of 16.5 deg E,Bosnia and Herzegowina west of 16 deg 30 min E; Croatia west of 16 deg 30 min E; Slovenia.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1710,Europe - former Yugoslavia - 16.5 to 29.5 deg E,Bosnia and Herzegowina east of 16 deg 30 min E; Croatia east of 16 deg 30 min E; Yugoslavia west of 19 deg 30 min E.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1711,Europe - former Yugoslavia - 19.5 to 22.5 deg E,FYR Macedonia west of 22 deg 30 min E; Yugoslavia between 19 deg 30 min and 22 deg 30 min E.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1712,Europe - former Yugoslavia - E of 22.5 deg E,FYR Macedonia and Yugoslavia east of 22 deg 30 min E.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1713,Nigeria - E of 10.5 deg E,Nigeria east of 10 deg 30 min East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1714,Nigeria - 6.5 to10.5 deg E,Nigeria between 6 deg 30 min and 10 deg 30 min East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1715,Nigeria - W of 6.5 deg E,Nigeria west of 6 deg 30 min East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1716,Nigeria - offshore deep water - W of 6 deg E,Nigeria - offshore beyond continental shelf west of 6 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1717,Nigeria - offshore deep water,Nigeria - offshore beyond continental shelf.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1718,Italy - W of 12 deg E,Italy - west of 12 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1719,Italy - E of 12 deg E,Italy - east of 12 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1720,USA - Michigan - SPCS - E,United States (USA) - Michigan - counties of Alcona; Alpena; Arenac; Bay; Cheboygan; Clinton; Crawford; Genesee; Gladwin; Gratiot; Hillsdale; Huron; Ingham; Iosco; Jackson; Lapeer; Lenawee; Livingston; Macomb; Midland; Monroe; Montmorency; Oakland; Ogemaw; Oscoda; Otsego; Presque Isle; Roscommon; Saginaw; Sanilac; Shiawassee; St. Clair; Tuscola; Washtenaw; Wayne.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1721,USA - Michigan - SPCS - old central,United States (USA) - Michigan - counties of Allegan; Antrim; Barry; Benzie; Berrien; Branch; Calhoun; Cass; Charlevoix; Clare; Eaton; Emmet; Grand Traverse; Ionia; Isabella; Kalamazoo; Kalkaska; Kent; Lake; Leelanau; Manistee; Mason; Mecosta; Missaukee; Montcalm; Muskegon; Newaygo; Oceana; Osceola; Ottawa; St. Joseph; Van Buren; Wexford.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1722,USA - Michigan - SPCS - W,United States (USA) - Michigan - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1723,USA - Michigan - SPCS - N,United States (USA) - Michigan north of approximately 45d 45m North - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+1724,USA - Michigan - SPCS - central,United States (USA) - Michigan between approximately 45d 45m & 43d 55m North - counties of Alcona; Alpena; Antrim; Arenac; Benzie; Charlevoix; Cheboygan; Clare; Crawford; Emmet; Gladwin; Grand Traverse; Iosco; Kalkaska; Lake; Leelanau; Manistee; Mason; Missaukee; Montmorency; Ogemaw; Osceola; Oscoda; Otsego; Presque Isle; Roscommon; Wexford.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+1725,USA - Michigan - SPCS - S,United States (USA) - Michigan south of approximately 43d 55m North - counties of Allegan; Barry; Bay; Berrien; Branch; Calhoun; Cass; Clinton; Eaton; Genesee; Gratiot; Hillsdale; Huron; Ingham; Ionia; Isabella; Jackson; Kalamazoo; Kent; Lapeer; Lenawee; Livingston; Macomb; Mecosta; Midland; Monroe; Montcalm; Muskegon; Newaygo; Oakland; Oceana; Ottawa; Saginaw; Sanilac; Shiawassee; St. Clair; St. Joseph; Tuscola; Van Buren; Washtenaw; Wayne.,,,,,EPSG,EPSG,2 [...]
+1726,Mozambique - offshore,Mozambique - offshore.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1727,Suriname - offshore,Suriname - offshore.,,,,,EPSG,EPSG,2000-06-10 00:00:00,,0
+1728,Algeria - N of 34 deg 39 min N,Algeria - north of 38.5 grads (34 deg 39 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1729,Algeria - 31 deg 30 min of 34 deg 39 min N,Algeria - 35 grads to 38.5 grads (31 deg 30 min to 34 deg 39 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1730,North America - NAVD88,North America: Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland; North West Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon. United States (USA) - 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; N [...]
+1731,France - N of 48.15 deg N,France north of 53.5 grads (48 deg 09 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1732,France - 45.45 to 48.15 deg N,France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1733,France - S of 45.45 deg N,France south of 50.5 grads (45 deg 27 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1734,France - 45.45 to 48.15 deg N. Also all mainland.,France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North. Also used over all mainland France.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1735,Algeria - W of 6 deg W,Algeria - west of 6 deg West (of Greenwich).,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1736,Algeria - 6 to 0 deg W,Algeria - between 6 deg West and 0 deg East (of Greenwich).,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1737,Algeria - 0 to 6 deg E,Algeria - between 0 and 6 deg East (of Greenwich).,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1738,Algeria - E of 6 deg E,Algeria - east of 6 deg East (of Greenwich).,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1739,Kuwait - W of 48 deg E,Kuwait - west of 48 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1740,Kuwait - E of 48 deg E,Kuwait - east of 48 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1741,Norway - zone I,Norway - west of 3deg 30min W of Oslo (7deg 13min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1742,Norway - zone II,Norway - between 3deg 30min W and 1deg 10min W of Oslo (7deg 13min 22.5sec E and 9deg 33min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1743,Norway - zone III,Norway - between 1deg 10min W and 1deg 15min E of Oslo (9deg 33min 22.5sec E and 11deg 58min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1744,Norway - zone IV,Norway - between 1deg 15min E and 4deg 20min E of Oslo (11deg 58min 22.5sec E and 15deg 03min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1745,Norway - zone V,Norway - between 4deg 20min E and 8deg 10min E of Oslo (15deg 03min 22.5sec E and 18deg 53min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1746,Norway - zone VI,Norway - between 8deg 10min E and 12deg 10min E of Oslo (18deg 53min 22.5sec E and 22deg 53min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1747,Norway - zone VII,Norway - between 12deg 10min E and 16deg 15min E of Oslo (22deg 53min 22.5sec E and 26deg 58min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1748,Norway - zone VIII,Norway - east of 16deg 15min E of Oslo (26deg 58min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1749,Asia - Middle East - Nahrwan / UTM 39,Kuwait east of 48 deg East. Qatar - offshore. United Arab Emirates (UAE) - Abu Dhabi - west of 54 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1750,UAE - E of 54 deg E,United Arab Emirates (UAE) - Abu Dhabi east of 54 deg East; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1751,Peru - E of 73 deg W,Peru - east of 73 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1752,Peru - 79 to 73 deg W,Peru - between 79 and 73 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1753,Peru - W of 79 deg W,Peru - west of 79 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1754,Brazil - offshore Amazon Cone,Brazil - offshore Amazon Cone.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+1755,South America - PSAD56 / UTM 17S,"South America (Chile; Ecuador; Peru) between 84 and 78 deg West, southern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1756,South America - PSAD56 / UTM 18N,"South America (Ecuador; [Venezuela]) between 78 and 72 deg West, northern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1757,South America - PSAD56 / UTM 18S,"South America (Chile; Ecuador; Peru) between 78 and 72 deg West, southern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1758,South America - PSAD56 / UTM 19N,"South America (Netherlands Antilles; [Venezuela]) between 72 and 66 deg West, northern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1759,South America - PSAD56 / UTM 19S,"South America (Bolivia; Chile; Peru) between 72 and 66 deg West, southern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1760,South America - PSAD56 / UTM 20N,"South America (Guyana; [Venezuela]) between 66 and 60 deg West, northern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1761,South America - PSAD56 / UTM 20S,"South America (Bolivia) between 66 and 60 deg West, southern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1762,South America - PSAD56 / UTM 21N,"South America (Guyana) between 60 and 54 deg West, northern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1763,Russia - W of 24 deg E,Russian Federation - west of 24 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1764,Russia - 24 to 30 deg E,Russian Federation - between 24 and 30 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1765,Russia - 30 to 36 deg E,Russian Federation - between 30 and 36 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1766,Russia - 36 to 42 deg E,Russian Federation - between 36 and 42 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1767,Russia - 42 to 48 deg E,Russian Federation - between 42 and 48 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1768,Russia - 48 to 54 deg E,Russian Federation - between 48 and 54 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1769,Russia - 54 to 60 deg E,Russian Federation - between 54 and 60 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1770,Russia - 60 to 66 deg E,Russian Federation - between 60 and 66 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1771,Russia - 66 to 72 deg E,Russian Federation - between 66 and 72 deg East .,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1772,Russia - 72 to 78 deg E,Russian Federation - between 72 and 78 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1773,Russia - 78 to 84 deg E,Russian Federation - between 78 and 84 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1774,Russia - 84 to 90 deg E,Russian Federation - between 84 and 90 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1775,Russia - 90 to 96 deg E,Russian Federation - between 90 and 96 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1776,Russia - 96 to 102 deg E,Russian Federation - between 96 and 102 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1777,Russia - 102 to 108 deg E,Russian Federation - between 102 and 108 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1778,Russia - 108 to 114 deg E,Russian Federation - between 108 and 114 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1779,Russia - 114 to 120 deg E,Russian Federation - between 114 and 120 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1780,Russia - 120 to 126 deg E,Russian Federation - between 120 and 126 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1781,Russia - 126 to 132 deg E,Russian Federation - between 126 and 132 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1782,Russia - 132 to 138 deg E,Russian Federation - between 132 and 138 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1783,Russia - 138 to 144 deg E,Russian Federation - between 138 and 144 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1784,Russia - 144 to 150 deg E,Russian Federation - between 144 and 150 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1785,Russia - 150 to 156 deg E,Russian Federation - between 150 and 156 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1786,Russia - 156 to 162 deg E,Russian Federation - between 156 and 162 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1787,Russia - 162 to 168 deg E,Russian Federation - between 162 and 168 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1788,Russia - 168 to 174 deg E,Russian Federation - between 168 and 174 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1789,Russia - 174 to 180 deg E,Russian Federation - between 174 and 180 deg East .,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1790,Russia - 180 to 174 deg W,Russian Federation - between 180 deg East and 174 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1791,Russia - E of 174 deg W,Russian Federation - east of 174 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1792,Europe - 6deg GK CM 15,Czech Republic and Germany ( former DDR) - east of 12 deg East; Poland and Slovakia - west of 18 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1793,Europe - 6deg GK CM 21,Estonia; Latvia; Lithuania; Russian Federation; Ukraine; - west of 24 deg East; Poland - east of 24 deg East; Slovakia east of 18 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1794,Europe - 6deg GK CM 27,Belarus - west of 30 deg East; Estonia; Latvia & Lithuania - east of 24 deg East; Moldova; Russian Federation & Ukraine - 24 to 30 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1795,Europe - 6deg GK CM 33,Belarus - east of 30 deg East; Russian Federation & Ukraine - 30 to 36 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1796,Europe - 6deg GK CM 39,Georgia - west of 36 deg East; Russian Federation - 36 to 42 deg East; Ukraine - east of 36 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1797,Europe - 6deg GK CM 45,Armenia - west of 48 deg East; Azerbaijan - west of 48 deg East; Georgia - east of 42 deg East; Russian Federation - 42 to 48 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1798,Asia - 6deg GK CM 51,Azerbaijan - east of 48 deg East; Kazakstan - west of 54 deg East; Russian Federation - 48 to 54 deg East; Turkmenistan - west of 54 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1799,Asia - 6deg GK CM 57,Kazakstan; Russian Federation; Turkmenistan - 54 deg to 60 deg East; Uzbekistan - west of 60 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1800,Asia - 6deg GK CM 63,Kazakstan; Russian Federation; Uzbekistan - 60 to 66 deg East; Turkmenistan - east of 60 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1801,Asia - 6deg GK CM 69,Kazakstan & Russian Federation - 66 to 72 deg East; Kirgistan & Tadzhikstan - west of 72 deg East; Uzbekistan - east of 66 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1802,Asia - 6deg GK CM 75,Kazakstan; Kirgizstan; Russian Federation - 72 to 78 deg East; Tadzhikstan - east of 72 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1803,Asia - 6deg GK CM 81,Kazakstan & Russian Federation - 78 to 84 deg East; Kirgizstan - east of 78 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1804,Asia - 6deg GK CM 87,Kazakstan - east of 84 deg East; Russian Federation - 84 to 90 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1805,Europe - 6deg GK CM 9,Czech Republic and Germany (former DDR) - west of 12 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1806,South America - SAD69 / UTM 17S,South America - between 84 and 78 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1807,South America - SAD69 / UTM 18N,South America - between 78 and 72 deg West; northern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1808,South America - SAD69 / UTM 18S,South America - Brazil - between 78 and 72 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1809,South America - SAD69 / UTM 19N,South America - between 72 and 66 deg West; northern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1810,South America - SAD69 / UTM 19S,South America - Brazil - between 72 and 66 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1811,South America - SAD69 / UTM 20N,South America - between 66 and 60 deg West; northern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1812,South America - SAD69 / UTM 20S,South America - Brazil - between 66 and 60 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1813,South America - SAD69 / UTM 21N,South America - between 60 and 54 deg West; northern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1814,South America - SAD69 / UTM 21S,South America - Brazil - between 60 and 54 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1815,South America - SAD69 / UTM 22N,South America - 54deg West to 48deg West; northern hemisphere. Brazil - offshore - Amazon cone.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1816,South America - SAD69 / UTM 22S,South America - Brazil - between 54 and 48 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1817,South America - SAD69 / UTM 23S,South America - between 48 and 42 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1818,South America - SAD69 / UTM 24S,South America - Brazil - between 42 and 36 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1819,South America - SAD69 / UTM 25S,South America - between 36 and 30 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1820,Falkland Islands - W of 60 deg W,Falkland Islands (Malvinas) - west of 60 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1821,Falkland Islands - E of 60 deg W,Falkland Islands (Malvinas) - east of 60 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1822,Namibia - offshore,Namibia - offshore.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1823,South America - SIRGAS / UTM 17N,Between 84 and 78deg West; northern hemisphere. Ecuador - north of equator. Colombia.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1824,South America - SIRGAS / UTM 17S,Between 84 and 78deg West; southern hemisphere. Chile. Colombia. Ecuador. Peru.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1825,South America - SIRGAS / UTM 18N,Between 78 and 72deg West; northern hemisphere. Colombia. Ecuador. Venezuela.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1826,South America - SIRGAS / UTM 18S,Between 78 and 72deg West; southern hemisphere. Argentina. Brazil. Chile. Colombia. Ecuador. Peru.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1827,South America - SIRGAS / UTM 19N,Between 72 and 66deg West; northern hemisphere. Brazil. Colombia. Venezuela.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1828,South America - SIRGAS / UTM 19S,Between 72 and 66deg West; southern hemisphere. Argentina. Bolivia. Brazil. Chile. Colombia. Peru.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1829,South America - SIRGAS / UTM 20N,Between 66 and 60deg West; northern hemisphere. Brazil. Guyana. Venezuela,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1830,South America - SIRGAS / UTM 20S,Between 66 and 60deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1831,South America - SIRGAS / UTM 21N,Between 60 and 54deg West; northern hemisphere. Brazil. French Guiana. Guyana. Suriname.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1832,South America - SIRGAS / UTM 21S,Between 60 and 54deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay. Uruguay.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1833,South America - SIRGAS / UTM 22N,Between 54 and 48deg West; northern hemisphere. Brazil. French Guiana.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1834,South America - SIRGAS / UTM 22S,Between 54 and 48deg West; southern hemisphere. Brazil. Uruguay.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1835,South America - SIRGAS / UTM 23S,Between 48 and 42deg West; southern hemisphere. Brazil.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1836,South America - SIRGAS / UTM 24S,Between 42 and 36deg West; southern hemisphere. Brazil,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1837,South America - SIRGAS / UTM 25S,Between 36 and 30deg West; southern hemisphere. Brazil.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1838,Namibia - W of 12 deg E,Namibia - west of 12 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1839,Namibia - 12 to 14 deg E,Namibia - between 12 and 14 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1840,Namibia - 14 to 16 deg E,Namibia - between 14 and 16 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1841,Namibia - 16 to 18 deg E,Namibia - between 16 and 18 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1842,Namibia - 18 to 20 deg E,Namibia - between 18 and 20 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1843,Namibia - 20 to 22 deg E,Namibia - between 20 and 22 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1844,Namibia - 22 to 24 deg E,Namibia - between 22 and 24 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1845,Namibia - E of 24 deg E,Namibia - east of 24 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1846,Sudan - south - W of 30 deg E,Sudan south - west of 30 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1847,Sudan - south - E of 30 deg E,Sudan south - east of 30 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1848,Madagascar - offshore - W of 48 deg E,Madagascar - offshore west of 48 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1849,Madagascar - offshore - E of 48 deg E,Madagascar - offshore east of 48 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1850,UAE - Abu Dhabi - W of 54 deg E,United Arab Emirates (UAE) - Abu Dhabi west of 54 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1851,Malaysia - East Malaysia,Malaysia - East Malaysia (Sabah; Sarawak).,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1852,Asia - Brunei and East Malaysia - UTM zone 49,Brunei - offshore; Malaysia - East Malaysia (Sarawak).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1853,Asia - Brunei and East Malaysia - UTM zone 50,Brunei - offshore; Malaysia - East Malaysia (Sabah).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1854,Japan - zone I,Japan - Kyushu west of approximately 130 deg East - Nagasaki-ken; islands of Kagoshima-ken between 27 and 32 deg N and between 128 deg 18 min and 130 deg E (between 128 deg 18 min and 30 deg 13 min E for Amami islands).,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1855,Japan - zone II,Japan - Kyushu east of approximately 130 deg East - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinate System zone I).,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1856,Japan - zone III,Japan - Honshu west of approximately 133 deg 15 min East - Yamaguchi-ken; Shimane-ken; Hiroshima-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1857,Japan - zone IV,Japan - Shikoku - Kagawa-ken; Ehime-ken; Tokushima-ken; Kochi-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1858,Japan - zone V,Japan - Honshu between approximately 133 deg 15 min and 135 deg 10 min East - Hyogo-ken; Tottori-ken; Okayama-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1859,Japan - zone VI,Japan - Honshu between approximately 135 deg 10 min and 136 deg 45 min East - Kyoto-fu; Osaka-fu; Fukui-ken; Shiga-ken; Mie-ken; Nara-ken; Wakayama-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1860,Japan - zone VII,Japan - Honshu between approximately 136 deg 15 min and 137 deg 45 min East - Ishikawa-ken; Toyama-ken; Gifu-ken; Aichi-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1861,Japan - zone VIII,Japan - Honshu between approximately 137 deg 45 min and 139 deg East - Niigata-ken; Nagano-ken; Yamanashi-ken; Shizuoka-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1862,Japan - zone IX,"Japan - Honshu - Tokyo-to. (Excludes offshore island areas of Tokyo-to covered by Japan Plane Rectangular Coordinate System zones XIV, XVIII and XIX).",,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1863,Japan - zone X,Japan - Honshu north of 38 deg North approximately - Aomori-ken; Akita-ken; Yamagata-ken; Iwate-ken; Miyagi-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1864,Japan - zone XI,Japan - Hokkaido west of approximately 141 deg East - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1865,Japan - zone XII,Japan - Hokkaido between approximately 141 and 143 deg min East - Sapporo city; Asahikawa city; Wakkanai city; Rumoi city; Bibai city; Yubari city; Iwamizawa city; Tomakomai city; Muroran city; Shibetsu city; Nayoro city; Ashibetsu city; Akabira city; Mikasa city; Takikawa city; Sunagawa city; Ebetsu city; Chitose city; Utashinai city; Fukagawa city; Monbetsu city; Furano city; Noboribetsu city; Eniwa city; Ishikari-shicyo; Monbetsu-gun of Abashiri-shicyo; Kamikawa- [...]
+1866,Japan - zone XIII,Japan - Hokkaido east of approximately 143 deg East - Kitami city; Obihiro city; Kushiro city; Abashiri city; Nemuro city; Nemuro-shicyo; Kushiro-shicyo; Abashiri-shicyo (except Monbetsu-gun); Tokachi-shicyo.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1867,Japan - zone XIV,Japan - Tokyo-to south of 28 deg North & between 140 deg 30 min & 143 deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1868,Japan - zone XV,Japan - Okinawa-ken between 126 and 130 deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1869,Japan - zone XVI,Japan - Okinawa-ken west of 126 deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1870,Japan - zone XVII,Japan - Okinawa-ken east of 130 deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1871,Japan - zone XVIII,Japan - Tokyo-to south of 28 deg North and west of 140 deg 30 min East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1872,Japan - zone XIX,Japan - Tokyo-to south of 28 deg North & east of 143 deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1873,6-degree TM - N hemisphere CM 177 deg W,Between 180 deg and 174 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1874,6-degree TM - S hemisphere CM 177 deg W,Between 180 deg and 174 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1875,6-degree TM - N hemisphere CM 171 deg W,Between 174 and 168 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1876,6-degree TM - S hemisphere CM 171 deg W,Between 174 and 168 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1877,6-degree TM - N hemisphere CM 165 deg W,Between 168 and 162 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1878,6-degree TM - S hemisphere CM 165 deg W,Between 168 and 162 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1879,6-degree TM - N hemisphere CM 159 deg W,Between 162 and 156 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1880,6-degree TM - S hemisphere CM 159 deg W,Between 162 and 156 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1881,6-degree TM - N hemisphere CM 153 deg W,Between 156 and 150 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1882,6-degree TM - S hemisphere CM 153 deg W,Between 156 and 150 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1883,6-degree TM - N hemisphere CM 147 deg W,Between 150 and 144 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1884,6-degree TM - S hemisphere CM 147 deg W,Between 150 and 144 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1885,6-degree TM - N hemisphere CM 141 deg W,Between 144 and 138 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1886,6-degree TM - S hemisphere CM 141 deg W,Between 144 and 138 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1887,6-degree TM - N hemisphere CM 135 deg W,Between 138 and 132 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1888,6-degree TM - S hemisphere CM 135 deg W,Between 138 and 132 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1889,6-degree TM - N hemisphere CM 129 deg W,Between 132 and 126 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1890,6-degree TM - S hemisphere CM 129 deg W,Between 132 and 126 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1891,6-degree TM - N hemisphere CM 123 deg W,Between 126 and 120 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1892,6-degree TM - S hemisphere CM 123 deg W,Between 126 and 120 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1893,6-degree TM - N hemisphere CM 117 deg W,Between 120 and 114 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1894,6-degree TM - S hemisphere CM 117 deg W,Between 120 and 114 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1895,6-degree TM - N hemisphere CM 111 deg W,Between 114 and 108 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1896,6-degree TM - S hemisphere CM 111 deg W,Between 114 and 108 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1897,6-degree TM - N hemisphere CM 105 deg W,Between 108 and 102 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1898,6-degree TM - S hemisphere CM 105 deg W,Between 108 and 102 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1899,6-degree TM - N hemisphere CM 99 deg W,Between 102 and 96 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1900,6-degree TM - S hemisphere CM 99 deg W,Between 102 and 96 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1901,6-degree TM - N hemisphere CM 93 deg W,Between 96 and 90 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1902,6-degree TM - S hemisphere CM 93 deg W,Between 96 and 90 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1903,6-degree TM - N hemisphere CM 87 deg W,Between 90 and 84 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1904,6-degree TM - S hemisphere CM 87 deg W,Between 90 and 84 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1905,6-degree TM - N hemisphere CM 81 deg W,Between 84 and 78 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1906,6-degree TM - S hemisphere CM 81 deg W,Between 84 and 78 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1907,6-degree TM - N hemisphere CM 75 deg W,Between 78 and 72 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1908,6-degree TM - S hemisphere CM 75 deg W,Between 78 and 72 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1909,6-degree TM - N hemisphere CM 69 deg W,Between 72 and 66 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1910,6-degree TM - S hemisphere CM 69 deg W,Between 72 and 66 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1911,6-degree TM - N hemisphere CM 63 deg W,Between 66 and 60 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1912,6-degree TM - S hemisphere CM 63 deg W,Between 66 and 60 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1913,6-degree TM - N hemisphere CM 57 deg W,Between 60 and 54 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1914,6-degree TM - S hemisphere CM 57 deg W,Between 60 and 54 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1915,6-degree TM - N hemisphere CM 51 deg W,Between 54 and 48 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1916,6-degree TM - S hemisphere CM 51 deg W,Between 54 and 48 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1917,6-degree TM - N hemisphere CM 45 deg W,Between 48 and 42 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1918,6-degree TM - S hemisphere CM 45 deg W,Between 48 and 42 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1919,6-degree TM - N hemisphere CM 39 deg W,Between 42 and 36 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1920,6-degree TM - S hemisphere CM 39 deg W,Between 42 and 36 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1921,6-degree TM - N hemisphere CM 33 deg W,Between 36 and 30 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1922,6-degree TM - S hemisphere CM 33 deg W,Between 36 and 30 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1923,6-degree TM - N hemisphere CM 27 deg W,Between 30 and 24 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1924,6-degree TM - S hemisphere CM 27 deg W,Between 30 and 24 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1925,6-degree TM - N hemisphere CM 21 deg W,Between 24 and 18 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1926,6-degree TM - S hemisphere CM 21 deg W,Between 24 and 18 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1927,6-degree TM - N hemisphere CM 15 deg W,Between 18 and 12 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1928,6-degree TM - S hemisphere CM 15 deg W,Between 18 and 12 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1929,6-degree TM - N hemisphere CM 9 deg W,Between 12 and 6 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1930,6-degree TM - S hemisphere CM 9 deg W,Between 12 and 6 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1931,6-degree TM - N hemisphere CM 3 deg W,Between 6 deg West and 0 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1932,6-degree TM - S hemisphere CM 3 deg W,Between 6 deg West and 0 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1933,6-degree TM - N hemisphere CM 3 deg E,Between 0 and 6 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1934,6-degree TM - S hemisphere CM 3 deg E,Between 0 and 6 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1935,6-degree TM - N hemisphere CM 9 deg E,Between 6 and 12 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1936,6-degree TM - S hemisphere CM 9 deg E,Between 6 and 12 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1937,6-degree TM - N hemisphere CM 15 deg E,Between 12 and 18 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1938,6-degree TM - S hemisphere CM 15 deg E,Between 12 and 18 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1939,6-degree TM - N hemisphere CM 21 deg E,Between 18 and 24 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1940,6-degree TM - S hemisphere CM 21 deg E,Between 18 and 24 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1941,6-degree TM - N hemisphere CM 27 deg E,Between 24 and 30 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1942,6-degree TM - S hemisphere CM 27 deg E,Between 24 and 30 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1943,6-degree TM - N hemisphere CM 33 deg E,Between 30 and 36 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1944,6-degree TM - S hemisphere CM 33 deg E,Between 30 and 36 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1945,6-degree TM - N hemisphere CM 39 deg E,Between 36 and 42 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1946,6-degree TM - S hemisphere CM 39 deg E,Between 36 and 42 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1947,6-degree TM - N hemisphere CM 45 deg E,Between 42 and 48 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1948,6-degree TM - S hemisphere CM 45 deg E,Between 42 and 48 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1949,6-degree TM - N hemisphere CM 51 deg E,Between 48 and 54 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1950,6-degree TM - S hemisphere CM 51 deg E,Between 48 and 54 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1951,6-degree TM - N hemisphere CM 57 deg E,Between 54 and 60 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1952,6-degree TM - S hemisphere CM 57 deg E,Between 54 and 60 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1953,6-degree TM - N hemisphere CM 63 deg E,Between 60 and 66 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1954,6-degree TM - S hemisphere CM 63 deg E,Between 60 and 66 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1955,6-degree TM - N hemisphere CM 69 deg E,Between 66 and 72 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1956,6-degree TM - S hemisphere CM 69 deg E,Between 66 and 72 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1957,6-degree TM - N hemisphere CM 75 deg E,Between 72 and 78 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1958,6-degree TM - S hemisphere CM 75 deg E,Between 72 and 78 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1959,6-degree TM - N hemisphere CM 81 deg E,Between 78 and 84 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1960,6-degree TM - S hemisphere CM 81 deg E,Between 78 and 84 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1961,6-degree TM - N hemisphere CM 87 deg E,Between 84 and 90 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1962,6-degree TM - S hemisphere CM 87 deg E,Between 84 and 90 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1963,6-degree TM - N hemisphere CM 93 deg E,Between 90 and 96 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1964,6-degree TM - S hemisphere CM 93 deg E,Between 90 and 96 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1965,6-degree TM - N hemisphere CM 99 deg E,Between 96 and 102eg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1966,6-degree TM - S hemisphere CM 99 deg E,Between 96 and 102eg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1967,6-degree TM - N hemisphere CM 105 deg E,Between 102 and 108 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1968,6-degree TM - S hemisphere CM 105 deg E,Between 102 and 108 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1969,6-degree TM - N hemisphere CM 111 deg E,Between 108 and 114 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1970,6-degree TM - S hemisphere CM 111 deg E,Between 108 and 114 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1971,6-degree TM - N hemisphere CM 117 deg E,Between 114 and 120 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1972,6-degree TM - S hemisphere CM 117 deg E,Between 114 and 120 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1973,6-degree TM - N hemisphere CM 123 deg E,Between 120 and 126 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1974,6-degree TM - S hemisphere CM 123 deg E,Between 120 and 126 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1975,6-degree TM - N hemisphere CM 129 deg E,Between 126 and 132 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1976,6-degree TM - S hemisphere CM 129 deg E,Between 126 and 132 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1977,6-degree TM - N hemisphere CM 135 deg E,Between 132 and 138 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1978,6-degree TM - S hemisphere CM 135 deg E,Between 132 and 138 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1979,6-degree TM - N hemisphere CM 141 deg E,Between 138 and 144 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1980,6-degree TM - S hemisphere CM 141 deg E,Between 138 and 144 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1981,6-degree TM - N hemisphere CM 147 deg E,Between 144 and 150 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1982,6-degree TM - S hemisphere CM 147 deg E,Between 144 and 150 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1983,6-degree TM - N hemisphere CM 153 deg E,Between 150 and 156 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1984,6-degree TM - S hemisphere CM 153 deg E,Between 150 and 156 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1985,6-degree TM - N hemisphere CM 159 deg E,Between 156 and 162 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1986,6-degree TM - S hemisphere CM 159 deg E,Between 156 and 162 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1987,6-degree TM - N hemisphere CM 165 deg E,Between 162 and 168 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1988,6-degree TM - S hemisphere CM 165 deg E,Between 162 and 168 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1989,6-degree TM - N hemisphere CM 171 deg E,Between 168 and 174 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1990,6-degree TM - S hemisphere CM 171 deg E,Between 168 and 174 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1991,6-degree TM - N hemisphere CM 177 deg E,Between 174 and 180 deg; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1992,6-degree TM - S hemisphere CM 177 deg E,Between 174 and 180 deg; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1993,WGS72BE / UTM zone 48N,Between 102 and 108 deg East; northern hemisphere. Vietnam - offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1994,WGS72BE / UTM zone 49N,Between 108 and 114 deg East; northern hemisphere. Vietnam - offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1995,WGS72BE / UTM zone 49S,Between 108 and 114 deg East; southern hemisphere. Indonesia - offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1996,UPS - north,Northern hemisphere polar area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1997,UPS - south,Southern hemisphere polar area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1998,UTM north,Northern hemisphere between equator and 84 deg North.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1999,UTM south,Southern hemisphere between equator and 80 deg South.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2000,WGS84 / UTM zone 1N,Between 180 deg and 174 deg West; northern hemisphere; Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2001,WGS84 / UTM zone 1S,Between 180 deg and 174 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2002,WGS84 / UTM zone 2N,Between 174 and 168 deg West; northern hemisphere. Russian Federation; United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2003,WGS84 / UTM zone 2S,Between 174 and 168 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2004,WGS84 / UTM zone 3N,Between 168 and 162 deg West; northern hemisphere. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2005,WGS84 / UTM zone 3S,Between 168 and 162 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2006,WGS84 / UTM zone 4N,Between 162 and 156 deg West; northern hemisphere. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2007,WGS84 / UTM zone 4S,Between 162 and 156 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2008,WGS84 / UTM zone 5N,Between 156 and 150 deg West; northern hemisphere. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2009,WGS84 / UTM zone 5S,Between 156 and 150 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2010,WGS84 / UTM zone 6N,Between 150 and 144 deg West; northern hemisphere. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2011,WGS84 / UTM zone 6S,Between 150 and 144 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2012,WGS84 / UTM zone 7N,Between 144 and 138 deg West; northern hemisphere. Canada - British Columbia (BC); Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2013,WGS84 / UTM zone 7S,Between 144 and 138 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2014,WGS84 / UTM zone 8N,Between 138 and 132 deg West; northern hemisphere. Canada - British Columbia (BC); North West Territiories; Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2015,WGS84 / UTM zone 8S,Between 138 and 132 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2016,WGS84 / UTM zone 9N,Between 132 and 126 deg West; northern hemisphere. Canada - British Columbia (BC); North West Territories; Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2017,WGS84 / UTM zone 9S,Between 132 and 126 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2018,WGS84 / UTM zone 10N,Between 126 and 120 deg West; northern hemisphere. Canada - British Columbia (BC); North West Territories; Nunavut; Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2019,WGS84 / UTM zone 10S,Between 126 and 120 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2020,WGS84 / UTM zone 11N,Between 120 and 114 deg West; northern hemisphere. Canada - Alberta; British Columbia (BC); North West Territories; Nunavut. Mexico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2021,WGS84 / UTM zone 11S,Between 120 and 114 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2022,WGS84 / UTM zone 12N,Between 114 and 108 deg West; northern hemisphere. Canada - Alberta; North West Territories; Nunavut; Saskatchewan. Mexico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2023,WGS84 / UTM zone 12S,Between 114 and 108 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2024,WGS84 / UTM zone 13N,Between 108 and 102 deg West; northern hemisphere. Canada - North West Territories; Nunavut; Saskatchewan. Mexico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2025,WGS84 / UTM zone 13S,Between 108 and 102 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2026,WGS84 / UTM zone 14N,Between 102 and 96 deg West; northern hemisphere. Canada - Manitoba; Nunavut; Saskatchewan. Mexico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2027,WGS84 / UTM zone 14S,Between 102 and 96 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2028,WGS84 / UTM zone 15N,Between 96 and 90 deg West; northern hemisphere. Canada - Manitoba; Nunavut; Ontario. Guatemala. Mexico. United States (USA) - Gulf of Mexico (GoM).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2029,WGS84 / UTM zone 15S,Between 96 and 90 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2030,WGS84 / UTM zone 16N,Between 90 and 84 deg West; northern hemisphere. Belize. Canada - Manitoba; Nunavut; Ontario. Costa Rica. Cuba. El Salvador. Guatemala. Honduras. Mexico. Nicaragua. Puerto Rico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2031,WGS84 / UTM zone 16S,Between 90 and 84 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2032,WGS84 / UTM zone 17N,Between 84 and 78 deg West; northern hemisphere. Bahamas. Ecuador - north of equator. Canada - Nunavut; Ontario; Quebec. Cayman Islands. Colombia. Costa Rica. Jamaica. Nicaragua. Panama. Puerto Rico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2033,WGS84 / UTM zone 17S,Between 84 and 78 deg West; southern hemisphere. Ecuador. Peru.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2034,WGS84 / UTM zone 18N,Between 78 and 72 deg West; northern hemisphere. Bahamas. Canada - Nunavut; Ontario; Quebec. Colombia. Cuba. Ecuador. Greenland. Haiti. Jamica. Panama. Turks and Caicos Islands. United States (USA). Venezuela.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2035,WGS84 / UTM zone 18S,Between 78 and 72 deg West; southern hemisphere. Argentina. Brazil. Chile. Colombia. Ecuador. Peru.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2036,WGS84 / UTM zone 19N,Between 72 and 66 deg West; northern hemisphere. Aruba. Bahamas. Brazil. Canada - New Brunswick (NB); Newfoundland; Nunavut; Nova Scotia (NS); Quebec. Colombia. Dominican Republic. Greenland. Netherlands Antilles. Puerto Rico. Turks and Caicos Islands. United States. Venezuela.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2037,WGS84 / UTM zone 19S,Between 72 and 66 deg West; southern hemisphere. Argentina. Bolivia. Brazil. Chile. Colombia. Peru.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2038,WGS84 / UTM zone 20N,Between 66 and 60 deg West; northern hemisphere. Anguilla. Antigua & Barbuda. Bermuda. Brazil. Canada - New Brunswick (NB); Newfoundland; North west Territories; Nova Scotia (NS); Prince Edward Island; Quebec. Dominica. Greenland. Grenada. Guadeloupe. Guyana. Martinique. Montserrat. Saint Kitts and Nevis. Saint Lucia. Saint Vncent and the Grenadines. Trinidad and Tobago. Venezuela. Virgin islands.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2039,WGS84 / UTM zone 20S,Between 66 and 60 deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2086,WGS84 / UTM zone 44N,Between 78 and 84 deg East; northern hemisphere. China. India. Kazakstan. Kyrgyzstan. Nepal. Russian Federation. Sri Lanka.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2087,WGS84 / UTM zone 44S,Between 78 and 84 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2088,WGS84 / UTM zone 45N,Between 84 and 90 deg East; northern hemisphere. Bangladesh. Bhutan. China. India. Kazakstan. Mongolia. Nepal. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2089,WGS84 / UTM zone 45S,Between 84 and 90 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2090,WGS84 / UTM zone 46N,Between 90 and 96 deg East; northern hemisphere. Bangladesh. Bhutan. China. Indonesia. Mongolia. Myanmar (Burma). Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2091,WGS84 / UTM zone 46S,Between 90 and 96 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2092,WGS84 / UTM zone 47N,Between 96 and 102 deg East; northern hemisphere. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Myanmar (Burma). Russian Federation. Thailand.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2093,WGS84 / UTM zone 47S,Between 96 and 102 deg East; southern hemisphere. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2094,WGS84 / UTM zone 48N,Between 102 and 108 deg East; northern hemisphere. Cambodia. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Russian Federation. Singapore. Thailand. Vietnam.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2095,WGS84 / UTM zone 48S,Between 102 and 108 deg East; southern hemisphere. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2096,WGS84 / UTM zone 49N,Between 108 and 114 deg East; northern hemisphere. China. Hong Kong. Indonesia. Macau. Malaysia - East Malaysia - Sarawak. Mongolia. Russian Federation. Vietnam.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2097,WGS84 / UTM zone 49S,Between 108 and 114 deg East; southern hemisphere. Australia. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2098,WGS84 / UTM zone 50N,Between 114 and 120 deg East; northern hemisphere. Brunei. China. Hong Kong. Indonesia. Malaysia - East Malaysia - Sarawak. Mongolia. Philippines. Russian Federation. Taiwan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2099,WGS84 / UTM zone 50S,Between 114 and 120 deg East; southern hemisphere. Australia. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2100,WGS84 / UTM zone 51N,Between 120 and 126 deg East; northern hemisphere. China. Indonesia. Japan. North Korea. Philippines. Russian Federation. South Korea. Taiwan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2101,WGS84 / UTM zone 51S,Between 120 and 126 deg East; southern hemisphere. Australia. East Timor. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2102,WGS84 / UTM zone 52N,Between 126 and 132 deg East; northern hemisphere. China. Indonesia. Japan. North Korea. Russian Federation. South Korea.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2103,WGS84 / UTM zone 52S,Between 126 and 132 deg East; southern hemisphere. Australia. East Timor. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2104,WGS84 / UTM zone 53N,Between 132 and 138 deg East; northern hemisphere. China. Japan. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2105,WGS84 / UTM zone 53S,Between 132 and 138 deg East; southern hemisphere. Australia. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2106,WGS84 / UTM zone 54N,Between 138 and 144 deg East; northern hemisphere. Japan. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2107,WGS84 / UTM zone 54S,Between 138 and 144 deg East; southern hemisphere. Australia. Indonesia. Papua New Guinea.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2108,WGS84 / UTM zone 55N,Between 144 and 150 deg East; northern hemisphere. Japan. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2109,WGS84 / UTM zone 55S,Between 144 and 150 deg East; southern hemisphere. Australia. Papua New Guinea.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2110,WGS84 / UTM zone 56N,Between 150 and 156 deg East; northern hemisphere. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2111,WGS84 / UTM zone 56S,Between 150 and 156 deg East; southern hemisphere. Australia. Papua New Guinea.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2112,WGS84 / UTM zone 57N,Between 156 and 162 deg East; northern hemisphere. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2113,WGS84 / UTM zone 57S,Between 156 and 162 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2114,WGS84 / UTM zone 58N,Between 162 and 168 deg East; northern hemisphere. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2115,WGS84 / UTM zone 58S,Between 162 and 168 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2116,WGS84 / UTM zone 59N,Between 168 and 174 deg East; northern hemisphere. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2117,WGS84 / UTM zone 59S,Between 168 and 174 deg East; southern hemisphere. New Zealand.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2118,WGS84 / UTM zone 60N,Between 174 and 180 deg East; northern hemisphere. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2119,WGS84 / UTM zone 60S,Between 174 and 180 deg East; southern hemisphere. New Zealand.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2120,Guatemala - N of 15 deg 50 min N,Guatemala - north of 15 deg 50 min North.,,,,,EPSG,EPSG,1999-08-16 00:00:00,,0
+2121,Guatemala - S of 15 deg 50 min N,Guatemala - south of 15 deg 50 min North.,,,,,EPSG,EPSG,2000-01-06 00:00:00,,0
+2122,Europe - ETRS89 / UTM 28,Europe - between 18 and 12 deg West - United Kingdom (UKCS) offshore.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2123,Europe - ETRS89 / UTM 29,Europe - between 12 and 6 deg West - United Kingdom (UKCS) offshore.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2124,Europe - ETRS89 / UTM 30,Europe - between 6 and 0 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2125,Europe - ETRS89 / UTM 31,Europe - between 0 and 6 deg East - Norway.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2126,Europe - ETRS89 / UTM 32,Europe - between 6 and 12deg East - Norway.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2127,Europe - ETRS89 / UTM 33,Europe - between 12 and 18deg East - Germany - Brandenburg; Norway.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2128,Europe - ETRS89 / UTM 34,Europe - between 18 and 24deg East - Norway.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2129,Europe - ETRS89 / UTM 35,Europe - between 24 and 30deg East - Norway.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2130,Europe - ETRS89 / UTM 36,Europe - between 30 and 36deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2131,Europe - ETRS89 / UTM 37,Europe - between 36 and 42deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2132,Europe - ETRS89 / UTM 38,Europe - between 42 and 48deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2133,North America - UTM zone 3,North America - between 168 and 162 deg West. United States (USA) - Alaska.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2134,North America - UTM zone 4,North America - between 162 and 156 deg West. United States (USA) - Alaska.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2135,North America - UTM zone 5,North America - between 156 and 150 deg West. United States (USA) - Alaska.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2136,North America - UTM zone 6,North America - between 150 and 144 deg West. United States (USA) - Alaska.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2137,North America - UTM zone 7,North America - between 144 and 138 deg West. Canada - British Columbia (BC); Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2138,North America - UTM zone 8,North America - between 138 and 132 deg West. Canada - British Columbia (BC); North West Territiories; Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2139,North America - UTM zone 9,North America - between 132 and 126 deg West. Canada - British Columbia (BC); North West Territories; Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2140,North America - UTM zone 10,North America - between 130 and 120 deg West. Canada - British Columbia (BC); North West Territories; Nunavut; Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2141,North America - UTM zone 11,North America - between 120 and 114 deg West. Canada - Alberta; British Columbia (BC); North West Territories; Nunavut. Mexico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2142,North America - UTM zone 12,North America - between 114 and 108 deg West. Canada - Alberta; North West Territories; Nunavut; Saskatchewan. Mexico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2143,North America - UTM zone 13,North America - between 108 and 102 deg West. Canada - North West Territories; Nunavut; Saskatchewan. Mexico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2144,North America - UTM zone 14,North America - between 102 and 96 deg West. Canada - Manitoba; Nunavut; Saskatchewan. Mexico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2145,North America - UTM zone 15,North America - between 96 and 90 deg West. Canada - Manitoba; Nunavut; Ontario. Guatemala. Mexico. United States (USA) - Gulf of Mexico (GoM).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2146,North America - UTM zone 16,North America - between 90 and 84 deg West. Belize. Canada - Manitoba; Nunavut; Ontario. Costa Rica. Cuba. El Salvador. Guatemala. Honduras. Mexico. Nicaragua. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2147,North America - UTM zone 17,North America - between 84 and 78 deg West. Canada - Nunavut; Ontario; Quebec. Mexico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2148,North America - UTM zone 18,North America - between 78 and 72 deg West. Canada - Nunavut; Ontario; Quebec. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2149,North America - UTM zone 19,North America - between 72 and 66 deg West. Canada - New Brunswick (NB); Newfoundland; Nunavut; Nova Scotia (NS); Quebec. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2150,North America - UTM zone 20,North America - between 66 and 60 deg West. Canada - New Brunswick (NB); Newfoundland; North west Territories; Nova Scotia (NS); Prince Edward Island; Quebec. United States (USA) offshore Atlantic,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2151,Canada - UTM zone 21,North America - between 60 and 54 deg West. Canada - Newfoundland; Quebec.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2152,Canada - UTM zone 22,North America - between 54 and 48 deg West. Canada - Newfoundland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2153,Canada - UTM zone 23,North America - Canada offshore Atlantic - between 48 and 42 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2154,USA - Alabama - SPCS - E,United States (USA) - Alabama east of approximately 86d 37m West - counties Barbour; Bullock; Calhoun; Chambers; Cherokee; Clay; Cleburne; Coffee; Coosa; Covington; Crenshaw; Dale; De Kalb; Elmore; Etowah; Geneva; Henry; Houston; Jackson; Lee; Macon; Madison; Marshall; Montgomery; Pike; Randolph; Russell; St.Clair; Talladega; Tallapoosa.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2155,USA - Alabama - SPCS - W,United States (USA) - Alabama west of approximately 86d 37m West - counties Autauga; Baldwin; Bibb; Blount; Butler; Chilton; Choctaw; Clarke; Colbert; Conecuh; Cullman; Dallas; Escambia; Fayette; Franklin; Greene; Hale; Jefferson; Lamar; Lauderdale; Lawrence; Limestone; Lowndes; Marengo; Marion; Mobile; Monroe; Morgan; Perry; Pickens; Shelby; Sumter; Tuscaloosa; Walker; Washington; Wilcox; Winston.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2156,USA - Alaska - Panhandle,United States (USA) - Alaska - east of 141 deg West; i.e. Panhandle.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+2157,USA - Alaska - Aleutian Islands,United States (USA) - Alaska - Aleutian Islands.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2158,USA - Alaska - 144 to 141 deg W,United States (USA) - Alaska - 144 to 141 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2159,USA - Alaska - 148 to 144 deg W,United States (USA) - Alaska - 148 to 144 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2160,USA - Alaska - 152 to 148 deg W,United States (USA) - Alaska - 152 to 148 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2161,USA - Alaska - 156 to 152 deg W,United States (USA) - Alaska - 156 to 152 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2162,USA - Alaska - 160 to 156 deg W,United States (USA) - Alaska - 160 to 156 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2163,USA - Alaska - 164 to 160 deg W,United States (USA) - Alaska - 164 to 160 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2164,USA - Alaska - N of 54.5 deg N; 168 to 164 deg W,United States (USA) - Alaska - north of 54d 30m North and between 168 to 164 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2165,USA - Alaska - N of 54.5 deg N; W of 168 deg W,United States (USA) - Alaska - north of 54d 30m North and west of 168 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2166,USA - Arizona - SPCS - central,United States (USA) - Arizona between approximately 110d 45m and 113d 20m West - counties Coconino; Maricopa; Pima; Pinal; Santa Cruz; Yavapai.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2167,USA - Arizona - SPCS - E,United States (USA) - Arizona east of approximately 110d 45m West - counties Apache; Cochise; Gila; Graham; Greenlee; Navajo.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2168,USA - Arizona - SPCS - W,United States (USA) - Arizona west of approximately 113d 20m West - counties La Paz; Mohave; Yuma.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2169,USA - Arkansas - SPCS - N,United States (USA) - Arkansas north of approximately 34d 50m North - counties Baxter; Benton; Boone; Carroll; Clay; Cleburne; Conway; Craighead; Crawford; Crittenden; Cross; Faulkner; Franklin; Fulton; Greene; Independence; Izard; Jackson; Johnson; Lawrence; Logan; Madison; Marion; Mississippi; Newton; Perry; Poinsett; Pope; Randolph; Scott; Searcy; Sebastian; Sharp; St. Francis; Stone; Van Buren; Washington; White; Woodruff; Yell.,,,,,EPSG,EPSG,1999-04-22 [...]
+2170,USA - Arkansas - SPCS - S,United States (USA) - Arkansas south of approximately 34d 50m North - counties Arkansas; Ashley; Bradley; Calhoun; Chicot; Clark; Cleveland; Columbia; Dallas; Desha; Drew; Garland; Grant; Hempstead; Hot Spring; Howard; Jefferson; Lafayette; Lee; Lincoln; Little River; Lonoke; Miller; Monroe; Montgomery; Nevada; Ouachita; Phillips; Pike; Polk; Prairie; Pulaski; Saline; Sevier; Union.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2171,USA - GoM OCS - W of 96 deg W,United States (USA) - Gulf of Mexico outer continental shelf (GoM OCS) west of approximately 96 deg West - protraction areas Corpus Christi; Port Isabel.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2172,USA - GoM OCS - 96 to 90 deg W,United States (USA) - Gulf of Mexico outer continental shelf (GoM OCS) between approximately 96 deg and 90 deg West - protraction areas East Breaks (EB); Alaminos Canyon (AC); Garden Banks (GB); Keathley Canyon (KC); Ewing Bank (EW); Green Canyon (GC); Walker Ridge (WR).,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2173,USA - GoM OCS - 90 to 84 deg W,United States (USA) - Gulf of Mexico outer continental shelf (GoM OCS) between approximately 90 deg and 84 deg West - protraction areas Mobile (MO); Viosca Knoll (VK); Mississippi Canyon (MC); Atwater Valley (AT); Lund; Pensacola; Destin Dome (DD); De Soto Canyon; Lloyd; Henderson; Apalachicola; Florida Middle Ground; The Elbow; Vernon Basin; Howell Hook; Rankin.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2174,USA - GoM OCS - E of 84 deg W,United States (USA) - Gulf of Mexico outer continental shelf (GoM OCS) east of approximately 84 deg West - protraction areas Gainesville; Tarpon Springs; St. Petersburg; Charlotte Harbor; Pulley Ridge; Dry Tortugas; Miami; Key West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2175,USA - California - SPCS - 1,United States (USA) - California north of approximately 40 deg North - counties Del Norte; Humboldt; Lassen; Modoc; Plumas; Shasta; Siskiyou; Tehama; Trinity.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2176,USA - California - SPCS - 2,United States (USA) - California between approximately 40 deg & 38d 15m North - counties Alpine; Amador; Butte; Colusa; El Dorado; Glenn; Lake; Mendocino; Napa; Nevada; Placer; Sacramento; Sierra; Solano; Sonoma; Sutter; Yolo; Yuba.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2177,USA - California - SPCS - 3,United States (USA) - California between approximately 38d 15m & 37d North - counties Alameda; Calaveras; Contra Costa; Madera; Marin; Mariposa; Merced; Mono; San Francisco; San Joaquin; San Mateo; Santa Clara; Santa Cruz; Stanislaus; Tuolumne.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2178,USA - California - SPCS - 4,United States (USA) - California between approximately 37d & 35d 30m North - counties Fresno; Inyo; Kings; Monterey; San Benito; Tulare.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2179,USA - California - SPCS27 - 5,United States (USA) - California between approximately 35d 50m & 34d North excluding LA - counties Kern; San Bernardino; San Luis Obispo; Santa Barbara; Ventura.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2180,USA - California - SPCS - 6,United States (USA) - California south of approximately 38d 30m North - counties Imperial; Orange; Riverside; San Diego.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2181,USA - California - SPCS27 - 7,United States (USA) - California - Los Angeles county.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2182,USA - California - SPCS83 - 5,United States (USA) - California between approximately 35d 50m & 34d North - counties Kern; Los Angeles; San Bernardino; San Luis Obispo; Santa Barbara; Ventura.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2183,USA - Colorado - SPCS - C,United States (USA) - Colorado between approximately 39d 50m & 38d 30m North - counties Arapahoe; Chaffee; Cheyenne; Clear Creek; Delta; Denver; Douglas; Eagle; El Paso; Elbert; Fremont; Garfield; Gunnison; Jefferson; Kit Carson; Lake; Lincoln; Mesa; Park; Pitkin; Summit; Teller.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2184,USA - Colorado - SPCS - N,United States (USA) - Colorado north of approximately 39d 50m North - counties Adams; Boulder; Gilpin; Grand; Jackson; Larimer; Logan; Moffat; Morgan; Phillips; Rio Blanco; Routt; Sedgwick; Washington; Weld; Yuma.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2185,USA - Colorado - SPCS - S,United States (USA) - Colorado south of approximately 38d 30m North - counties Alamosa; Archuleta; Baca; Bent; Conejos; Costilla; Crowley; Custer; Dolores; Hinsdale; Huerfano; Kiowa; La Plata; Las Animas; Mineral; Montezuma; Montrose; Otero; Ouray; Prowers; Pueblo; Rio Grande; Saguache; San Juan; San Miguel.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2186,USA - Florida - SPCS - E,United States (USA) - Florida east of approximately 81d 45m West - counties of Brevard; Broward; Clay; Collier; Dade; Duval; Flagler; Glades; Hendry; Highlands; Indian River; Lake; Martin; Monroe; Nassau; Okeechobee; Orange; Osceola; Palm Beach; Putnam; Seminole; St. Johns; St. Lucie; Volusia.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2187,USA - Florida - SPCS - N,United States (USA) - Florida north of approximately 29d 30m North & west of approximately 82d West - counties of Alachua; Baker; Bay; Bradford; Calhoun; Columbia; Dixie; Escambia; Franklin; Gadsden; Gilchrist; Gulf; Hamilton; Holmes; Jackson; Jefferson; Lafayette; Leon; Liberty; Madison; Okaloosa; Santa Rosa; Suwannee; Taylor; Union; Wakulla; Walton; Washington.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2188,USA - Florida - SPCS - W,United States (USA) - Florida west of approximately 81d 45m West & south of approximately 29d 30m North - counties of Charlotte; Citrus; De Soto; Hardee; Hernando; Hillsborough; Lee; Levy; Manatee; Marion; Pasco; Pinellas; Polk; Sarasota; Sumter.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2189,USA - Georgia - SPCS - E,United States (USA) - Georgia east of approximately 83d 15m West - counties of Appling; Atkinson; Bacon; Baldwin; Brantley; Bryan; Bulloch; Burke; Camden; Candler; Charlton; Chatham; Clinch; Coffee; Columbia; Dodge; Echols; Effingham; Elbert; Emanuel; Evans; Franklin; Glascock; Glynn; Greene; Hancock; Hart; Jeff Davis; Jefferson; Jenkins; Johnson; Lanier; Laurens; Liberty; Lincoln; Long; Madison; McDuffie; McIntosh; Montgomery; Oglethorpe; Pierce; Richmond; [...]
+2190,USA - Georgia - SPCS - W,United States (USA) - Georgia west of approximately 83d 15m West - counties of Baker; Banks; Barrow; Bartow; Ben Hill; Berrien; Bibb; Bleckley; Brooks; Butts; Calhoun; Carroll; Catoosa; Chattahoochee; Chattooga; Cherokee; Clarke; Clay; Clayton; Cobb; Colquitt; Cook; Coweta; Crawford; Crisp; Dade; Dawson; De Kalb; Decatur; Dooly; Dougherty; Douglas; Early; Fannin; Fayette; Floyd; Forsyth; Fulton; Gilmer; Gordon; Grady; Gwinnett; Habersham; Hall; Haralson; Har [...]
+2191,USA - Idaho - SPCS - central,United States (USA) - Idaho between approximately 113d & 115d West - counties of Blaine; Butte; Camas; Cassia; Custer; Gooding; Jerome; Lemhi; Lincoln; Minidoka; Twin Falls.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2192,USA - Idaho - SPCS - E,United States (USA) - Idaho east of approximately 113d West - counties of Bannock; Bear Lake; Bingham; Bonneville; Caribou; Clark; Franklin; Fremont; Jefferson; Madison; Oneida; Power; Teton.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2193,USA - Idaho - SPCS - W,United States (USA) - Idaho - west of approximately 115d West - counties of Ada; Adams; Benewah; Boise; Bonner; Boundary; Canyon; Clearwater; Elmore; Gem; Idaho; Kootenai; Latah; Lewis; Nez Perce; Owyhee; Payette; Shoshone; Valley; Washington.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2194,USA - Illinois - SPCS - E,United States (USA) - Illinois east of approximately 89d 05m West - counties of Boone; Champaign; Clark; Clay; Coles; Cook; Crawford; Cumberland; De Kalb; De Witt; Douglas; Du Page; Edgar; Edwards; Effingham; Fayette; Ford; Franklin; Gallatin; Grundy; Hamilton; Hardin; Iroquois; Jasper; Jefferson; Johnson; Kane; Kankakee; Kendall; La Salle; Lake; Lawrence; Livingston; Macon; Marion; Massac; McHenry; McLean; Moultrie; Piatt; Pope; Richland; Saline; Shelby; V [...]
+2195,USA - Illinois - SPCS - W,United States (USA) - Illinois west of approximately 89d 05m West - counties of Adams; Alexander; Bond; Brown; Bureau; Calhoun; Carroll; Cass; Christian; Clinton; Fulton; Greene; Hancock; Henderson; Henry; Jackson; Jersey; Jo Daviess; Knox; Lee; Logan; Macoupin; Madison; Marshall; Mason; McDonough; Menard; Mercer; Monroe; Montgomery; Morgan; Ogle; Peoria; Perry; Pike; Pulaski; Putnam; Randolph; Rock Island; Sangamon; Schuyler; Scott; St. Clair; Stark; Steph [...]
+2196,USA - Indiana - SPCS - E,United States (USA) - Indiana east of approximately 86d 25m West - counties of Adams; Allen; Bartholomew; Blackford; Brown; Cass; Clark; De Kalb; Dearborn; Decatur; Delaware; Elkhart; Fayette; Floyd; Franklin; Fulton; Grant; Hamilton; Hancock; Harrison; Henry; Howard; Huntington; Jackson; Jay; Jefferson; Jennings; Johnson; Kosciusko; Lagrange; Madison; Marion; Marshall; Miami; Noble; Ohio; Randolph; Ripley; Rush; Scott; Shelby; St. Joseph; Steuben; Switzerla [...]
+2197,USA - Indiana - SPCS - W,United States (USA) - Indiana west of approximately 86d 25m West - counties of Benton; Boone; Carroll; Clay; Clinton; Crawford; Daviess; Dubois; Fountain; Gibson; Greene; Hendricks; Jasper; Knox; La Porte; Lake; Lawrence; Martin; Monroe; Montgomery; Morgan; Newton; Orange; Owen; Parke; Perry; Pike; Porter; Posey; Pulaski; Putnam; Spencer; Starke; Sullivan; Tippecanoe; Vanderburgh; Vermillion; Vigo; Warren; Warrick; White.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2198,USA - Iowa - SPCS - N,United States (USA) - Iowa north of approximately 42deg North - counties of Allamakee; Benton; Black Hawk; Boone; Bremer; Buchanan; Buena Vista; Butler; Calhoun; Carroll; Cerro Gordo; Cherokee; Chickasaw; Clay; Clayton; Crawford; Delaware; Dickinson; Dubuque; Emmet; Fayette; Floyd; Franklin; Greene; Grundy; Hamilton; Hancock; Hardin; Howard; Humboldt; Ida; Jackson; Jones; Kossuth; Linn; Lyon; Marshall; Mitchell; Monona; O'Brien; Osceola; Palo Alto; Plymouth; Po [...]
+2199,USA - Iowa - SPCS - S,United States (USA) - Iowa south of approximately 42deg North - counties of Adair; Adams; Appanoose; Audubon; Cass; Cedar; Clarke; Clinton; Dallas; Davis; Decatur; Des Moines; Fremont; Guthrie; Harrison; Henry; Iowa; Jasper; Jefferson; Johnson; Keokuk; Lee; Louisa; Lucas; Madison; Mahaska; Marion; Mills; Monroe; Montgomery; Muscatine; Page; Polk; Pottawattamie; Poweshiek; Ringgold; Scott; Shelby; Taylor; Union; Van Buren; Wapello; Warren; Washington; Wayne.,,,, [...]
+2200,USA - Kansas - SPCS - N,United States (USA) - Kansas north of approximately 38d 45m North - counties of Atchison; Brown; Cheyenne; Clay; Cloud; Decatur; Dickinson; Doniphan; Douglas; Ellis; Ellsworth; Geary; Gove; Graham; Jackson; Jefferson; Jewell; Johnson; Leavenworth; Lincoln; Logan; Marshall; Mitchell; Morris; Nemaha; Norton; Osborne; Ottawa; Phillips; Pottawatomie; Rawlins; Republic; Riley; Rooks; Russell; Saline; Shawnee; Sheridan; Sherman; Smith; Thomas; Trego; Wabaunsee; Wal [...]
+2201,USA - Kansas - SPCS - S,United States (USA) - Kansas south of approximately 38d 45m North - counties of Allen; Anderson; Barber; Barton; Bourbon; Butler; Chase; Chautauqua; Cherokee; Clark; Coffey; Comanche; Cowley; Crawford; Edwards; Elk; Finney; Ford; Franklin; Grant; Gray; Greeley; Greenwood; Hamilton; Harper; Harvey; Haskell; Hodgeman; Kearny; Kingman; Kiowa; Labette; Lane; Linn; Lyon; Marion; McPherson; Meade; Miami; Montgomery; Morton; Neosho; Ness; Osage; Pawnee; Pratt; Reno; [...]
+2202,USA - Kentucky - SPCS - N,United States (USA) - Kentucky north of approximately 37d 55m North - counties of Anderson; Bath; Boone; Bourbon; Boyd; Bracken; Bullitt; Campbell; Carroll; Carter; Clark; Elliott; Fayette; Fleming; Franklin; Gallatin; Grant; Greenup; Harrison; Henry; Jefferson; Jessamine; Kenton; Lawrence; Lewis; Mason; Menifee; Montgomery; Morgan; Nicholas; Oldham; Owen; Pendleton; Robertson; Rowan; Scott; Shelby; Spencer; Trimble; Woodford.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2203,USA - Kentucky - SPCS - S,United States (USA) - Kentucky south of approximately 37d 55m North - counties of Adair; Allen; Ballard; Barren; Bell; Boyle; Breathitt; Breckinridge; Butler; Caldwell; Calloway; Carlisle; Casey; Christian; Clay; Clinton; Crittenden; Cumberland; Daviess; Edmonson; Estill; Floyd; Fulton; Garrard; Graves; Grayson; Green; Hancock; Hardin; Harlan; Hart; Henderson; Hickman; Hopkins; Jackson; Johnson; Knott; Knox; Larue; Laurel; Lee; Leslie; Letcher; Lincoln; Liv [...]
+2204,USA - Louisiana - SPCS - N,United States (USA) - Louisiana north of approximately 30d 55m North - counties of Avoyelles; Bienville; Bossier; Caddo; Caldwell; Catahoula; Claiborne; Concordia; De Soto; East Carroll; Franklin; Grant; Jackson; La Salle; Lincoln; Madison; Morehouse; Natchitoches; Ouachita; Rapides; Red River; Richland; Sabine; Tensas; Union; Vernon; Webster; West Carroll; Winn.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2205,USA - Louisiana - SPCS27 - S,United States (USA) - Louisiana south of approximately 30d 55m North - counties of Acadia; Allen; Ascension; Assumption; Beauregard; Calcasieu; Cameron; East Baton Rouge; East Feliciana; Evangeline; Iberia; Iberville; Jefferson; Jefferson Davis; Lafayette; LaFourche; Livingston; Orleans; Plaquemines; Pointe Coupee; St. Bernard; St. Charles; St. Helena; St. James; St. John the Baptist; St. Landry; St. Martin; St. Mary; St. Tammany; Tangipahoa; Terrebonne; [...]
+2206,USA - Maine - SPCS - E,United States (USA) - Maine east of approximately 69d 30m West - counties of Aroostook; Hancock; Knox; Penobscot; Piscataquis; Waldo; Washington.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2207,USA - Maine - SPCS - W,United States (USA) - Maine west of approximately 69d 30m West - counties of Androscoggin; Cumberland; Franklin; Kennebec; Lincoln; Oxford; Sagadahoc; Somerset; York.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2208,USA - Massachusetts - SPCS - islands,United States (USA) - Massachusetts offshore - counties of Dukes; Nantucket.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2209,USA - Massachusetts - SPCS - mainland,United States (USA) - Massachusetts onshore - counties of Barnstable; Berkshire; Bristol; Essex; Franklin; Hampden; Hampshire; Middlesex; Norfolk; Plymouth; Suffolk; Worcester.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2210,USA - Montana - SPCS27 - central,United States (USA) - Montana between approximately 47d 50m & 46d 40m North - counties of Cascade; Dawson; Fergus; Garfield; Judith Basin; Lake; Lewis and Clark; McCone; Meagher; Mineral; Missoula; Petroleum; Powell; Prairie; Richland; Sanders; Wibaux.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2211,USA - Montana - SPCS27 - N,United States (USA) - Montana north of approximately 47d 50m North - counties of Blaine; Chouteau; Daniels; Flathead; Glacier; Hill; Liberty; Lincoln; Phillips; Pondera; Roosevelt; Sheridan; Teton; Toole; Valley.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2212,USA - Montana - SPCS27 - S,United States (USA) - Montana south of approximately 46d 40m North - counties of Beaverhead; Big Horn; Broadwater; Carbon; Carter; Custer; Deer Lodge; Fallon; Gallatin; Golden Valley; Granite; Jefferson; Madison; Musselshell; Park; Powder River; Ravalli; Rosebud; Silver Bow; Stillwater; Sweet Grass; Treasure; Wheatland; Yellowstone.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2213,USA - Minnesota - SPCS - central,United States (USA) - Minnesota between approximately 47d 10m & 45d 30m North - counties of Aitkin; Becker; Benton; Carlton; Cass; Chisago; Clay; Crow Wing; Douglas; Grant; Hubbard; Isanti; Kanabec; Mille Lacs; Morrison; Otter Tail; Pine; Pope; Stearns; Stevens; Todd; Traverse; Wadena; Wilkin.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2214,USA - Minnesota - SPCS - N,United States (USA) - Minnesota north of approximately 47d 10m North - counties of Beltrami; Clearwater; Cook; Itasca; Kittson; Koochiching; Lake; Lake of the Woods; Mahnomen; Marshall; Norman; Pennington; Polk; Red Lake; Roseau; St. Louis.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2215,USA - Minnesota - SPCS - S,United States (USA) - Minnesota south of approximately 45d 30m North - counties of Anoka; Big Stone; Blue Earth; Brown; Carver; Chippewa; Cottonwood; Dakota; Dodge; Faribault; Fillmore; Freeborn; Goodhue; Hennepin; Houston; Jackson; Kandiyohi; Lac Qui Parle; Le Sueur; Lincoln; Lyon; Martin; McLeod; Meeker; Mower; Murray; Nicollet; Nobles; Olmsted; Pipestone; Ramsey; Redwood; Renville; Rice; Rock; Scott; Sherburne; Sibley; Steele; Swift; Wabasha; Waseca; Wa [...]
+2216,USA - Mississippi - SPCS - E,United States (USA) - Mississippi east of approximately 89d 40m West - counties of Alcorn; Attala; Benton; Calhoun; Chickasaw; Choctaw; Clarke; Clay; Covington; Forrest; George; Greene; Hancock; Harrison; Itawamba; Jackson; Jasper; Jones; Kemper; Lafayette; Lamar; Lauderdale; Leake; Lee; Lowndes; Marshall; Monroe; Neshoba; Newton; Noxubee; Oktibbeha; Pearl River; Perry; Pontotoc; Prentiss; Scott; Smith; Stone; Tippah; Tishomingo; Union; Wayne; Webster; W [...]
+2217,USA - Mississippi - SPCS - W,United States (USA) - Mississippi west of approximately 89d 40m West - counties of Adams; Amite; Bolivar; Carroll; Claiborne; Coahoma; Copiah; De Soto; Franklin; Grenada; Hinds; Holmes; Humphreys; Issaquena; Jefferson; Jefferson Davis; Lawrence; Leflore; Lincoln; Madison; Marion; Montgomery; Panola; Pike; Quitman; Rankin; Sharkey; Simpson; Sunflower; Tallahatchie; Tate; Tunica; Walthall; Warren; Washington; Wilkinson; Yalobusha; Yazoo.,,,,,EPSG,EPSG,2001 [...]
+2218,USA - Missouri - SPCS - central,United States (USA) - Missouri between approximately 91d 45m & 93d 35m West - counties of Adair; Audrain; Benton; Boone; Callaway; Camden; Carroll; Chariton; Christian; Cole; Cooper; Dallas; Douglas; Greene; Grundy; Hickory; Howard; Howell; Knox; Laclede; Linn; Livingston; Macon; Maries; Mercer; Miller; Moniteau; Monroe; Morgan; Osage; Ozark; Pettis; Phelps; Polk; Pulaski; Putnam; Randolph; Saline; Schuyler; Scotland; Shelby; Stone; Sullivan; Taney; T [...]
+2219,USA - Missouri - SPCS - E,United States (USA) - Missouri east of approximately 91d 45m West - counties of Bollinger; Butler; Cape Girardeau; Carter; Clark; Crawford; Dent; Dunklin; Franklin; Gasconade; Iron; Jefferson; Lewis; Lincoln; Madison; Marion; Mississippi; Montgomery; New Madrid; Oregon; Pemiscot; Perry; Pike; Ralls; Reynolds; Ripley; Scott; Shannon; St. Charles; St. Francois; St. Louis; Ste. Genevieve; Stoddard; Warren; Washington; Wayne.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2220,USA - Missouri - SPCS - W,United States (USA) - Missouri west of approximately 93d 35m West - counties of Andrew; Atchison; Barry; Barton; Bates; Buchanan; Caldwell; Cass; Cedar; Clay; Clinton; Dade; Daviess; De Kalb; Gentry; Harrison; Henry; Holt; Jackson; Jasper; Johnson; Lafayette; Lawrence; McDonald; Newton; Nodaway; Platte; Ray; St. Clair; Vernon; Worth.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2221,USA - Nebraska - SPCS27 - N,United States (USA) - Nebraska - counties of Antelope; Blaine; Box Butte; Boyd; Brown; Burt; Cedar; Cherry; Cuming; Dakota; Dawes; Dixon; Garfield; Grant; Holt; Hooker; Keya Paha; Knox; Loup; Madison; Pierce; Rock; Sheridan; Sioux; Stanton; Thomas; Thurston; Wayne; Wheeler.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2222,USA - Nebraska - SPCS27 - S,United States (USA) - Nebraska - counties of Adams; Arthur; Banner; Boone; Buffalo; Butler; Cass; Chase; Cheyenne; Clay; Colfax; Custer; Dawson; Deuel; Dodge; Douglas; Dundy; Fillmore; Franklin; Frontier; Furnas; Gage; Garden; Gosper; Greeley; Hall; Hamilton; Harlan; Hayes; Hitchcock; Howard; Jefferson; Johnson; Kearney; Keith; Kimball; Lancaster; Lincoln; Logan; McPherson; Merrick; Morrill; Nance; Nemaha; Nuckolls; Otoe; Pawnee; Perkins; Phelps; Platte; [...]
+2223,USA - Nevada - SPCS - central,United States (USA) - Nevada between approximately 117d 15m and 116d West - counties of Lander; Nye.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2224,USA - Nevada - SPCS - E,United States (USA) - Nevada east of approximately 116d West - counties of Clark; Elko; Eureka; Lincoln; White Pine.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2225,USA - Nevada - SPCS - W,United States (USA) - Nevada west of approximately 117d 15m West - counties of Churchill; Douglas; Esmeralda; Humboldt; Lyon; Mineral; Pershing; Storey; Washoe.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2226,Canada - Newfoundland - E of 54.5 deg W,Canada - Newfoundland - east of 54 deg 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2227,Canada - Newfoundland - 57.5 to 54.5 deg W,Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2228,USA - New Mexico - SPCS - E,United States (USA) - New Mexico east of approximately 105d West - counties of Chaves; Colfax; Curry; De Baca; Eddy; Guadalupe; Harding; Lea; Mora; Quay; Roosevelt; San Miguel; Union.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2229,USA - New Mexico - SPCS27 - central,United States (USA) - New Mexico between approximately 105d & 107d 15m West - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2230,USA - New Mexico - SPCS27 - W,United States (USA) - New Mexico west of approximately 107d 15m West - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra; Valencia.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2231,USA - New Mexico - SPCS83 - central,United States (USA) - New Mexico between approximately 105d & 107d 15m West - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance; Valencia.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2232,USA - New Mexico - SPCS83 - W,United States (USA) - New Mexico west of approximately 107d 15m West - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2233,USA - New York - SPCS - central,United States (USA) - New York between approximately 75d 15m & 77d 30m West - counties of Broome; Cayuga; Chemung; Chenango; Cortland; Jefferson; Lewis; Madison; Oneida; Onondaga; Ontario; Oswego; Schuyler; Seneca; Steuben; Tioga; Tompkins; Wayne; Yates.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2234,USA - New York - SPCS - E,United States (USA) - New York mainland east of approximately 75d 15m West - counties of Albany; Clinton; Columbia; Delaware; Dutchess; Essex; Franklin; Fulton; Greene; Hamilton; Herkimer; Montgomery; Orange; Otsego; Putnam; Rensselaer; Rockland; Saratoga; Schenectady; Schoharie; St. Lawrence; Sullivan; Ulster; Warren; Washington; Westchester.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2235,USA - New York - SPCS - Long island,United States (USA) - New York - counties of Bronx; Kings; Nassau; New York; Queens; Richmond; Suffolk.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2236,USA - New York - SPCS - W,United States (USA) - New York west of approximately 77d 30m West - counties of Allegany; Cattaraugus; Chautauqua; Erie; Genesee; Livingston; Monroe; Niagara; Orleans; Wyoming.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2237,USA - North Dakota - SPCS - N,United States (USA) - North Dakota north of approximately 47d 25m North - counties of Benson; Bottineau; Burke; Cavalier; Divide; Eddy; Foster; Grand Forks; Griggs; McHenry; McKenzie; McLean; Mountrial; Nelson; Pembina; Pierce; Ramsey; Renville; Rolette; Sheridan; Steele; Towner; Traill; Walsh; Ward; Wells; Williams.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2238,USA - North Dakota - SPCS - S,United States (USA) - North Dakota south of approximately 47d 25m North - counties of Adams; Barnes; Billings; Bowman; Burleigh; Cass; Dickey; Dunn; Emmons; Golden Valley; Grant; Hettinger; Kidder; La Moure; Logan; McIntosh; Mercer; Morton; Oliver; Ransom; Richland; Sargent; Sioux; Slope; Stark; Stutsman.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2239,USA - Ohio - SPCS - N,United States (USA) - Ohio north of approximately 40d 15m North - counties of Allen;Ashland; Ashtabula; Auglaize; Carroll; Columbiana; Coshocton; Crawford; Cuyahoga; Defiance; Delaware; Erie; Fulton; Geauga; Hancock; Hardin; Harrison; Henry; Holmes; Huron; Jefferson; Knox; Lake; Logan; Lorain; Lucas; Mahoning; Marion; Medina; Mercer; Morrow; Ottawa; Paulding; Portage; Putnam; Richland; Sandusky; Seneca; Shelby; Stark; Summit; Trumbull; Tuscarawas; Union; Van We [...]
+2240,USA - Ohio - SPCS - S,United States (USA) - Ohio south of approximately 40d 15m North - counties of Adams; Athens; Belmont; Brown; Butler; Champaign; Clark; Clermont; Clinton; Darke; Fairfield; Fayette; Franklin; Gallia; Greene; Guernsey; Hamilton; Highland; Hocking; Jackson; Lawrence; Licking; Madison; Meigs; Miami; Monroe; Montgomery; Morgan; Muskingum; Noble; Perry; Pickaway; Pike; Preble; Ross; Scioto; Vinton; Warren; Washington.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2241,USA - Oklahoma - SPCS - N,United States (USA) - Oklahoma north of approximately 35d 20m North - counties of Adair; Alfalfa; Beaver; Blaine; Canadian; Cherokee; Cimarron; Craig; Creek; Custer; Delaware; Dewey; Ellis; Garfield; Grant; Harper; Kay; Kingfisher; Lincoln; Logan; Major; Mayes; Muskogee; Noble; Nowata; Okfuskee; Oklahoma; Okmulgee; Osage; Ottawa; Pawnee; Payne; Roger Mills; Rogers; Sequoyah; Texas; Tulsa; Wagoner; Washington; Woods; Woodward.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2242,USA - Oklahoma - SPCS - S,United States (USA) - Oklahoma south of approximately 35d 20m North - counties of Atoka; Beckham; Bryan; Caddo; Carter; Choctaw; Cleveland; Coal; Comanche; Cotton; Garvin; Grady; Greer; Harmon; Haskell; Hughes; Jackson; Jefferson; Johnston; Kiowa; Latimer; Le Flore; Love; Marshall; McClain; McCurtain; McIntosh; Murray; Pittsburg; Pontotoc; Pottawatomie; Pushmataha; Seminole; Stephens; Tillman; Washita.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2243,USA - Oregon - SPCS - N,United States (USA) - Oregon north of approximately 44d 15m North - counties of Baker; Benton; Clackamas; Clatsop; Columbia; Gilliam; Grant; Hood River; Jefferson; Lincoln; Linn; Marion; Morrow; Multnomah; Polk; Sherman; Tillamook; Umatilla; Union; Wallowa; Wasco; Washington; Wheeler; Yamhill.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2244,USA - Oregon - SPCS - S,United States (USA) - Oregon south of approximately 44d 15m North - counties of Coos; Crook; Curry; Deschutes; Douglas; Harney; Jackson; Josephine; Klamath; Lake; Lane; Malheur.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2245,USA - Pennsylvania - SPCS - N,United States (USA) - Pennsylvania north of approximately 40d 50m North - counties of Bradford; Cameron; Carbon; Centre; Clarion; Clearfield; Clinton; Columbia; Crawford; Elk; Erie; Forest; Jefferson; Lackawanna; Luzerne; Lycoming; McKean; Mercer; Monroe; Montour; Northumberland; Pike; Potter; Sullivan; Susquehanna; Tioga; Union; Venango; Warren; Wayne; Wyoming.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2246,USA - Pennsylvania - SPCS - S,United States (USA) - Pennsylvania south of approximately 40d 50m North - counties of Adams; Allegheny; Armstrong; Beaver; Bedford; Berks; Blair; Bucks; Butler; Cambria; Chester; Cumberland; Dauphin; Delaware; Fayette; Franklin; Fulton; Greene; Huntingdon; Indiana; Juniata; Lancaster; Lawrence; Lebanon; Lehigh; Mifflin; Montgomery; Northampton; Perry; Philadelphia; Schuylkill; Snyder; Somerset; Washington; Westmoreland; York.,,,,,EPSG,EPSG,2001-11-06 00 [...]
+2247,USA - South Carolina - SPCS27 - N,United States (USA) - South Carolina - counties of Abbeville; Anderson; Calhoun; Cherokee; Chester; Chesterfield; Darlington; Dillon; Edgefield; Fairfield; Florence; Greenville; Greenwood; Horry; Kershaw; Lancaster; Laurens; Lee; Lexington; Marion; Marlboro; McCormick; Newberry; Oconee; Pickens; Richland; Saluda; Spartanburg; Sumter; Union; York.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2248,USA - South Carolina - SPCS27 - S,United States (USA) - South Carolina - counties of Aiken; Allendale; Bamberg; Barnwell; Beaufort; Berkeley; Charleston; Clarendon; Colleton; Dorchester; Georgetown; Hampton; Jasper; Orangeburg; Williamsburg.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2249,USA - South Dakota - SPCS - N,United States (USA) - South Dakota north of approximately 44d 20m North - counties of Beadle; Brookings; Brown; Butte; Campbell; Clark; Codington; Corson; Day; Deuel; Dewey; Edmunds; Faulk; Grant; Hamlin; Hand; Harding; Hyde; Kingsbury; Lawrence; Marshall; McPherson; Meade; Perkins; Potter; Roberts; Spink; Sully; Walworth; Ziebach.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2250,USA - South Dakota - SPCS - S,United States (USA) - South Dakota south of approximately 44d 20m North - counties of Aurora; Bennett; Bon Homme; Brule; Buffalo; Charles Mix; Clay; Custer; Davison; Douglas; Fall River; Gregory; Haakon; Hanson; Hughes; Hutchinson; Jackson; Jerauld; Jones; Lake; Lincoln; Lyman; McCook; Mellette; Miner; Minnehaha; Moody; Pennington; Sanborn; Shannon; Stanley; Todd; Tripp; Turner; Union; Yankton.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2251,Caribbean - Puerto Rico and the US Virgin Islands,Puerto Rico and Virgin Islands (US).,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2252,USA - Texas - SPCS - central,United States (USA) - Texas between approximately 32deg & 30d 10m North - counties of Anderson; Angelina; Bastrop; Bell; Blanco; Bosque; Brazos; Brown; Burleson; Burnet; Cherokee; Coke; Coleman; Comanche; Concho; Coryell; Crane; Crockett; Culberson; Ector; El Paso; Falls; Freestone; Gillespie; Glasscock; Grimes; Hamilton; Hardin; Houston; Hudspeth; Irion; Jasper; Jeff Davis; Kimble; Lampasas; Lee; Leon; Liberty; Limestone; Llano; Loving; Madison; Mason; [...]
+2253,USA - Texas - SPCS - N,United States (USA) - Texas north of approximately 34d 20m North - counties of: Armstrong; Briscoe; Carson; Castro; Childress; Collingsworth; Dallam; Deaf Smith; Donley; Gray; Hall; Hansford; Hartley; Hemphill; Hutchinson; Lipscomb; Moore; Ochiltree; Oldham; Parmer; Potter; Randall; Roberts; Sherman; Swisher; Wheeler.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2254,USA - Texas - SPCS - N central,United States (USA) - Texas between approximately 34d 20m & 32deg North - counties of: Andrews; Archer; Bailey; Baylor; Borden; Bowie; Callahan; Camp; Cass; Clay; Cochran; Collin; Cooke; Cottle; Crosby; Dallas; Dawson; Delta; Denton; Dickens; Eastland; Ellis; Erath; Fannin; Fisher; Floyd; Foard; Franklin; Gaines; Garza; Grayson; Gregg; Hale; Hardeman; Harrison; Haskell; Henderson; Hill; Hockley; Hood; Hopkins; Howard; Hunt; Jack; Johnson; Jones; Kaufma [...]
+2255,USA - Texas - SPCS27 - S,United States (USA) - Texas south of approximately 28d 05m North - counties of Brooks; Cameron; Duval; Hidalgo; Jim Hogg; Jim Wells; Kenedy; Kleberg; Nueces; San Patricio; Starr; Webb; Willacy; Zapata. Gulf of Mexico outer continental shelf (GoM OCS) protraction areas: South Padre Island; North Padre Island; Mustang Island.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2256,USA - Texas - SPCS27 - S central,United States (USA) - Texas between approximately 30d 10m & 28d 05m North - counties of Aransas; Atascosa; Austin; Bandera; Bee; Bexar; Brazoria; Brewster; Caldwell; Calhoun; Chambers; Colorado; Comal; De Witt; Dimmit; Edwards; Fayette; Fort Bend; Frio; Galveston; Goliad; Gonzales; Guadalupe; Harris; Hays; Jackson; Jefferson; Karnes; Kendall; Kerr; Kinney; La Salle; Lavaca; Live Oak; Matagorda; Maverick; McMullen; Medina; Presidio; Real; Refugio; Ter [...]
+2257,USA - Utah - SPCS - central,United States (USA) - Utah between approximately 40d 50m & 38d 30m North - counties of Carbon; Duchesne; Emery; Grand; Juab; Millard; Salt Lake; Sanpete; Sevier; Tooele; Uintah; Utah; Wasatch.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2258,USA - Utah - SPCS - N,United States (USA) - Utah north of approximately 40d 50m North - counties of Box Elder; Cache; Daggett; Davis; Morgan; Rich; Summit; Weber.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2259,USA - Utah - SPCS - S,United States (USA) - Utah south of approximately 38d 30m North - counties of Beaver; Garfield; Iron; Kane; Piute; San Juan; Washington; Wayne.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2260,USA - Virginia - SPCS - N,United States (USA) - Virginia north of approximately 38d 05m North - counties of Arlington; Augusta; Bath; Caroline; Clarke; Culpeper; Fairfax; Fauquier; Frederick; Greene; Highland; King George; Loudoun; Madison; Orange; Page; Prince William; Rappahannock; Rockingham; Shenandoah; Spotsylvania; Stafford; Warren; Westmoreland.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2261,USA - Virginia - SPCS - S,United States (USA) - Virginia south of approximately 38d 05m North - counties of Accomack; Albemarle; Alleghany; Amelia; Amherst; Appomattox; Bedford; Bland; Botetourt; Bristol; Brunswick; Buchanan; Buckingham; Campbell; Carroll; Charles City; Charlotte; Chesapeake; Chesterfield; Colonial Heights; Craig; Cumberland; Dickenson; Dinwiddie; Essex; Floyd; Fluvanna; Franklin; Giles; Gloucester; Goochland; Grayson; Greensville; Halifax; Hampton; Hanover; Henrico [...]
+2262,USA - Washington - SPCS27 - N,United States (USA) - Washington north of approximately 47d 30m North - counties of Chelan; Clallam; Douglas; Ferry; Island; Jefferson; King; Kitsap; Lincoln; Okanogan; Pend Oreille; San Juan; Skagit; Snohomish; Spokane; Stevens; Whatcom.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2263,USA - Washington - SPCS27 - S,United States (USA) - Washington south of approximately 47d 30m North - counties of Adams; Asotin; Benton; Clark; Columbia; Cowlitz; Franklin; Garfield; Grant; Grays Harbor; Kittitas; Klickitat; Lewis; Mason; Pacific; Pierce; Skamania; Thurston; Wahkiakum; Walla Walla; Whitman; Yakima.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2264,USA - West Virginia - SPCS - N,United States (USA) - West Virginia north of approximately 39deg North - counties of Barbour; Berkeley; Brooke; Doddridge; Grant; Hampshire; Hancock; Hardy; Harrison; Jefferson; Marion; Marshall; Mineral; Monongalia; Morgan; Ohio; Pleasants; Preston; Ritchie; Taylor; Tucker; Tyler; Wetzel; Wirt; Wood.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2265,USA - West Virginia - SPCS - S,United States (USA) - West Virginia south of approximately 39deg North - counties of Boone; Braxton; Cabell; Calhoun; Clay; Fayette; Gilmer; Greenbrier; Jackson; Kanawha; Lewis; Lincoln; Logan; Mason; McDowell; Mercer; Mingo; Monroe; Nicholas; Pendleton; Pocahontas; Putnam; Raleigh; Randolph; Roane; Summers; Upshur; Wayne; Webster; Wyoming.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2266,USA - Wisconsin - SPCS - central,United States (USA) - Wisconsin between approximately 45d 35m & 44d 15m North - counties of Barron; Brown; Buffalo; Chippewa; Clark; Door; Dunn; Eau Claire; Jackson; Kewaunee; Langlade; Lincoln; Marathon; Marinette; Menominee; Oconto; Outagamie; Pepin; Pierce; Polk; Portage; Rusk; Shawano; St. Croix; Taylor; Trempealeau; Waupaca; Wood.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2267,USA - Wisconsin - SPCS - N,United States (USA) - Wisconsin north of approximately 45d 35m North - counties of Ashland; Bayfield; Burnett; Douglas; Florence; Forest; Iron; Oneida; Price; Sawyer; Vilas; Washburn.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2268,USA - Wisconsin - SPCS - S,United States (USA) - Wisconsin south of approximately 44d 15m North - counties of Adams; Calumet; Columbia; Crawford; Dane; Dodge; Fond Du Lac; Grant; Green; Green Lake; Iowa; Jefferson; Juneau; Kenosha; La Crosse; Lafayette; Manitowoc; Marquette; Milwaukee; Monroe; Ozaukee; Racine; Richland; Rock; Sauk; Sheboygan; Vernon; Walworth; Washington; Waukesha; Waushara; Winnebago.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2269,USA - Wyoming - SPCS - E,United States (USA) - Wyoming east of approximately 106d West - counties of Albany; Campbell; Converse; Crook; Goshen; Laramie; Niobrara; Platte; Weston.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2270,USA - Wyoming - SPCS - E central,United States (USA) - Wyoming between approximately 106d & 108d 10m West - counties of Big Horn; Carbon; Johnson; Natrona; Sheridan; Washakie.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2271,USA - Wyoming - SPCS - W,United States (USA) - Wyoming west of approximately 109d 40m West - counties of Lincoln; Sublette; Teton; Uinta.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2272,USA - Wyoming - SPCS - W central,United States (USA) - Wyoming between approximately 108d 10m & 109d 40m West - counties of Fremont; Hot Springs; Park; Sweetwater.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2273,USA - Washington - SPCS83 - N,United States (USA) - Washington north of approximately 47d 30m North - counties of Chelan; Clallam; Douglas; Ferry; Grant north of approximately 47d30m; Island; Jefferson; King; Kitsap; Lincoln; Okanogan; Pend Oreille; San Juan; Skagit; Snohomish; Spokane; Stevens; Whatcom.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2274,USA - Washington - SPCS83 - S,United States (USA) - Washington south of approximately 47d 30m North - counties of Adams; Asotin; Benton; Clark; Columbia; Cowlitz; Franklin; Garfield; Grant south of approximately 47d30m; Grays Harbor; Kittitas; Klickitat; Lewis; Mason; Pacific; Pierce; Skamania; Thurston; Wahkiakum; Walla Walla; Whitman; Yakima.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2275,Canada - Newfoundland - 60.5 to 57.5 deg W,Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2276,Canada - Quebec and Newfoundland - 63 to 60 deg W,Canada - Quebec and Newfoundland (Labrador) between 63 deg and 60 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2277,Canada - Quebec and Newfoundland - 66 to 63 deg W,Canada - Quebec and Newfoundland (Labrador) between 66 deg and 63 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2278,Canada - Quebec and Newfoundland - 69 to 66 deg W,Canada - Quebec and Newfoundland (Labrador) between 69 deg and 66 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2279,Canada - Quebec and Ontario - 75 to 72 deg W,Canada - Quebec between 75 deg and 72 deg West.; Canada - Ontario - east of 75 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2280,Canada - Quebec and Ontario - 78 to 75 deg W,Canada - Quebec and Ontario - between 78 deg and 75 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2281,Canada - Quebec and Ontario - MTM zone 10,Canada - Quebec west of 78 deg West; Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2282,Cote d'Ivoire (Ivory Coast) - Abidjan area,C�te d'Ivoire (Ivory Coast) - Abidjan area.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+2283,Australia - Australian Capital Territory (ACT),Australia - Australian Capital Territory (ACT).,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2284,Australia - Northern Territory (NT),Australia - Northern Territory (NT).,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2285,Australia - Victoria,Australia - Victoria.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2286,Australia - New South Wales (NSW and Victoria,Australia - New South Wales (NSW) and Victoria.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2287,Australia - SE Australia (ACT NSW VIC),"Australia - Australian Capital Territory (ACT), New South Wales (NSW), Victoria.",,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2288,American Samoa - Tutuila and Aunu'u islands,American Samoa - Tutuila and Aunu'u islands.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2289,"American Samoa - Ofu, Olesega and Ta'u islands","American Samoa - Ofu, Olesega and Ta'u islands.",,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2290,Canada - Quebec and Newfoundland - MTM zone 3,Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West; Canada - Quebec between 60 deg and 57 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2291,Australasia - Australia and PNG - 150 to 156 deg E,Australia - between 150 and 156 deg East. Papua New Guinea east of 150 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2292,Myanmar (Burma) - 15 to 21 deg N,Myanmar (Burma) - between 15 and 21 deg North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+2293,Myanmar (Burma) - S of 15 deg N,Myanmar (Burma) - south of 15 deg North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+2294,Asia - Middle East - Iraq zone,Islamic Republic of Iran - south of 36 deg North. Iraq. Kuwait.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+2295,Caribbean - Windward and Leeward Islands,Windward Islands - Dominica Grenada Saint Lucia Saint Vincent; Leeward Islands - Anguilla Antigua (excluding Barbuda) Montserrat Saint Kitts and Nevis; Barbados.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2296,Cote d'Ivoire (Ivory Coast) - offshore.,C�te d'Ivoire (Ivory Coast) - offshore.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2297,USA - California - N of 38 deg N,United States (USA) - California north of 38 deg North.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2298,USA - California - S of 38 deg N,United States (USA) - California south of 38 deg North,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2299,3-degree TM - N hemisphere CM 3 deg E,"Between 1 deg 30 min and 4 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2300,3-degree TM - N hemisphere CM 6 deg E,"Between 4 deg 30 min and 7 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2301,3-degree TM - N hemisphere CM 9 deg E,"Between 7 deg 30 min and 10 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2302,3-degree TM - N hemisphere CM 12 deg E,"Between 10 deg 30 min and 13 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2303,3-degree TM - N hemisphere CM 15 deg E,"Between 13 deg 30 min and 16 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2304,3-degree TM - N hemisphere CM 18 deg E,"Between 16 deg 30 min and 19 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2305,3-degree TM - N hemisphere CM 21 deg E,"Between 19 deg 30 min and 22 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2306,3-degree TM - N hemisphere CM 24 deg E,"Between 22 deg 30 min and 25 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2307,Brazil - Campos; Espirito Santo and Santos basins,Brazil - Campos; Espirito Santo and Santos basins.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2308,Brazil - Tucano basin north,Brazil - Tucano basin north.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2309,Brazil - Tucano basin central,Brazil - Tucano basin central.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2310,Brazil - Tucano basin south,Brazil - Tucano basin south.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2311,Africa - Kenya and Tanzania,Kenya; Tanzania.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2312,"Africa - Botswana, Lesotho, Malawi, Swaziland, Zaire, Zambia, Zimbabwe",Botswana; Lesotho; Malawi; Swaziland; Zaire; Zambia; Zimbabwe.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2313,Canada - Nova Scotia,Canada - Nova Scotia.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2314,Asia - Caspian FSU states,Azerbaijan; Kazakstan; Russian Federation; Turkmenistan - Caspian Sea,,,,,EPSG,EPSG,1999-09-07 00:00:00,,0
+2315,Colombia - Cusiana,Colombia - Casanare province BP Cusiana/Cupiagua field areas. Also used by Total in Rivera and Gatanas blocks.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2316,Angola - offshore block 5,Angola - offshore block 5.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2317,Angola - offshore block 2,Angola - offshore block 2.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2318,Angola - offshore block 3,Angola - offshore block 3.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2319,Angola - offshore block 7,Angola - offshore block 7.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2320,Angola - offshore blocks 7 8 24 + WGC spec,Angola - offshore blocks 7 and 8. Also used rounded to integer metre in offshore block 24 and for GSI/HGS/Western Geophysical speculative seismic data throughout offshore Angola.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2321,Angola - offshore blocks 1 and 16,Angola - offshore blocks 1 and 16.,,,,,EPSG,EPSG,1998-12-14 00:00:00,,0
+2322,Angola - offshore blocks 3 7 15 and 17.,"Angola - offshore blocks 3, 7,15 and 17.",,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2323,Angola - offshore blocks 1 16 and 18.,"Angola - offshore blocks 1, 16 and 18.",,,,,EPSG,EPSG,1998-12-14 00:00:00,,0
+2324,Angola - offshore blocks 2 3 17 and 31-33.,"Angola - offshore blocks 2, 3, 17 and 31-33.",,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2325,Argentina - Neuquen province Chos Malal area,Argentina - Neuquen province - Chos Malal area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2326,Germany - former west Germany,Germany - former west Germany.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2327,Syria - Al Whaleed area,Syrian Arab Republic - Al Whaleed area,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2328,Syria - Shaddadeh area,Syrian Arab Republic - Shaddadeh area (36d N 41d E),,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2329,Syria - Deir area,Syrian Arab Republic - Deir area (35d 22m N 40d 06m E),,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2330,Europe - North Sea,Denmark - North Sea; Germany - North Sea; Netherlands - offshore; Norway - North Sea south of 62 deg N; United Kingdom (UKCS) - North Sea south of 62 deg N.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2331,Norway - offshore N of 65 deg N,Norway - offshore north of 65 deg North.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2332,Norway - offshore N of 65 deg N; Svalbard; Jan Mayen,Norway - offshore north of 65 deg N; Svalbard and Jan Mayen Islands.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2333,Norway - offshore 62 to 65 deg N and W of 5 deg E,Norway - offshore between 62 and 65 deg North and west of 5 deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2334,Norway - North Sea - offshore S of 62 deg N.,Norway - North Sea - offshore south of 62 deg North.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2335,Spain - Balearic Islands,Spain - Balearic Islands.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2336,Spain - mainland except northwest,Spain - mainland except northwest (north of 41 deg 30m N and west of 4 deg 30 min W).,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2337,Spain - northwest,Spain - northwest (north of 41 deg 30m N and west of 4 deg 30 min W).,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2338,Europe - Portugal and Spain,Portugal; Spain.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2339,Italy - Sardinia,Italy - Sardinia.,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+2340,Italy - Sicily,Italy - Sicily.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2341,Egypt - Gulf of Suez,Egypt - Gulf of Suez.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2342,Europe - common offshore,Denmark - offshore. United Kingdom - UKCS offshore east of 6 deg West.,,,,,EPSG,EPSG,1998-06-30 00:00:00,,0
+2343,Europe - British Isles,Ireland; United Kingdom (UK).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2344,Europe - Finland and Norway,Finland; Norway.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2345,Asia - Middle East - Iraq; Israel; Jordan; Lebanon; Kuwait; Saudi Arabia; Syria.,Iraq; Israel; Jordan; Lebanon; Kuwait; Saudi Arabia; Syria.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2346,WGS72BE to WGS84,World. Vietnam - offshore.,,,,,EPSG,EPSG,1996-12-12 00:00:00,,0
+2347,Algeria - N of 31.5 deg North,Algeria - north of 35g (31 deg 30 min) North.,,,,,EPSG,EPSG,1998-03-12 00:00:00,,0
+2348,Brunei - offshore,Brunei Darussalam - offshore.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2349,Brunei - onshore,Brunei Darussalam - onshore.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2350,Mozambique - A,Mozambique - Maputo province and southern part of Gaza province; i.e. south of approximately 24 deg S.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2351,Mozambique - B,Mozambique - provinces of Gaza; Inhambane and southern parts of Sofala and Manhica; i.e. between approximately 24 and 20 deg South.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2352,Mozambique - C,Mozambique - provinces of Sofala north of Beira corridor; Manhica; Tete and Zambezia; i.e. between approximately 20 and 16 deg South.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2353,Mozambique - D,Mozambique - provinces of Nampula; Niassa; Cabo Delgado; i.e. north of approximately 16 deg S.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2354,Indonesia - Kalimantan,Indonesia - Kalimantan.,,,,,EPSG,EPSG,1998-03-12 00:00:00,,0
+2355,Falkland Islands - East Falkland Island,Falkland Islands (Malvinas) - East Falkland Island.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2356,Ecuador - Galapagos,Ecuador - Baltra; Galapagos.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2357,Argentina - Tierra del Fuego,Argentina - Tierra del Fuego,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2358,Thailand - Bongkot field,Thailand - Bongkot field.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2359,Vietnam - near 16 deg N,Vietnam - near 16 deg North.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2360,Vietnam - Con Son Island,Vietnam - Con Son Island.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2361,Myanmar (Burma) - Moattama area,Myanmar (Burma) - Moattama area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2362,Iran - Kangan district,Islamic Republic of Iran - Kangan district.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+2363,Venezuela - east,Venezuela - east - Delta Amacuro; Anzoategui; Bolivar; Monagas; Sucre states.,,,,,EPSG,EPSG,1999-11-05 00:00:00,,0
+2364,Philippines - excluding Mindanao,Philippines (excluding Mindanao).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2365,Philippines - Mindanao,Philippines - Mindanao.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2366,Spain - mainland,Spain - mainland.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2367,Spain - mainland NE,Spain - mainland north of the parallel of 42 deg N from the Atlantic Ocean to 42 deg N 4 deg W of Greenwich and then a line from 42 deg N 4 deg W of Greenwich through 40 deg N 0 deg E of Greenwich.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2368,Spain - mainland SW,Spain - mainland south of the parallel of 42 deg N from the Atlantic Ocean to 42 deg N 4 deg W of Greenwich and then a line from 42 deg N 4 deg W of Greenwich through 40 deg N 0 deg E of Greenwich.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2369,Seychelles - Mahe Island,Seychelles - Mahe Island.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2370,Europe - Boznia and Herzegovina; Croatia; Serbia; Slovenia.,Boznia and Herzegovina; Croatia; Serbia; Slovenia.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2371,Nigeria - south,Nigeria - south.,,,,,EPSG,EPSG,2001-08-28 00:00:00,,0
+2372,Italy - mainland,Italy - mainland.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2373,USA - Alaska including EEZ.,United States (USA) - Alaska including EEZ.,,,,,EPSG,EPSG,2001-08-28 00:00:00,,0
+2374,USA - conus including EEZ.,United States (USA) - lower 48 states including EEZ - Alabama; 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; Sout [...]
+2375,Canada - Saskatchewan,Canada - Saskatchewan.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2376,Canada - Alberta,Canada - Alberta,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2377,USA - Delaware and Maryland,United States (USA) - Delaware and Maryland.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2378,"USA - New England - south (CT, MA, NH, RI, VT)",United States (USA) - Connecticut; Massachusetts; New Hampshire; Rhode Island; Vermont.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2379,USA - Texas E of 100 deg W,United States (USA) - Texas east of 100 deg West.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2380,USA - Texas W of 100 deg W,United States (USA) - Texas west of 100 deg West.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2381,USA - Oregon and Washington.,United States (USA) - Oregon and Washington.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2382,USA - Idaho and Montana - E of 113 deg W,United States (USA) - Idaho and Montana - east of 113 deg West.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2383,USA - Idaho and Montana - W of 113 deg W,United States (USA) - Idaho and Montana - west of 113 deg West.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2384,Canada - Alberta and British Columbia.,Canada - Alberta; British Columbia.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2385,Panama - Canal Zone,Panama - Canal Zone.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2386,Greenland - Hayes Peninsula,Greenland - Hayes Peninsula.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2387,USA - Alaska - Aleutian Islands east of 180 deg,United States (USA) - Alaska - Aleutian Islands east of 180 deg.,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+2388,USA - Alaska - Aleutian Islands west of 180 deg,United States (USA) - Alaska - Aleutian Islands west of 180 deg.,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+2389,USA - conus east of Mississippi River,United States (USA) - CONUS east of Mississippi River including Louisiana; Missouri; Minnesota.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2390,USA - conus west of Mississippi River,United States (USA) - CONUS west of Mississippi River.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2391,Oman - Masirah Island,Oman - Masirah Island.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2392,UAE - Abu al Bu Khoosh,United Arab Emirates (UAE) - Abu Dhabi - Abu al Bu Khoosh,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2393,Algeria - Hassi Messaoud,Algeria - Hassi Messaoud.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+2394,UK - Great Britain and UKCS,United Kingdom (UKCS) - Great Britain (GB) - England; Scotland; Wales; - North Sea.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2395,UK - England,United Kingdom (UK) - England.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2396,UK - England; Wales; Isle of Man,United Kingdom (UK) - England; Wales; Isle of Man.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2397,UK - Scotland,United Kingdom (UK) - Scotland (including Shetland Islands).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2398,UK - Wales,United Kingdom (UK) - Wales.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2399,South America - Bolivia; Chile; Colombia; Ecuador; Guyana; Peru; Venezuela.,Bolivia; Chile; Colombia; Ecuador; Guyana; Peru; Venezuela.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2400,Bolivia - Madidi,Bolivia - Madidi.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2401,Bolivia - Block 20,Bolivia - Block 20.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2402,Chile - north,Chile - north (near 19 deg South).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2403,Chile - south,Chile - south (near 43 deg South).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2404,Oman - block 4,Oman - block 4.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2405,Kazakstan - Caspian Sea,Kazakstan - Caspian Sea.,,,,,EPSG,EPSG,2000-02-02 00:00:00,,0
+2406,Qatar - offshore,Qatar - offshore.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2407,Greenland - south,Greenland (South).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2408,Japan - Okinawa,Japan - Okinawa.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2409,Asia - Japan and South Korea,Japan; South Korea; Okinawa.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2410,Canada - NWT; Nunavut; Saskatchewan,Canada - Northwest Territories; Nunavut; Saskatchewan.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2411,Asia - India and Nepal,India; Nepal.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+2412,USA - Alaska excluding Aleutian Islands,United States (USA) - Alaska (Excluding Aleutian Islands).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2413,Bahamas (Except San Salvador Island).,Bahamas (Except San Salvador Island).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2414,Bahamas (San Salvador Island).,Bahamas (San Salvador Island).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2415,Canada - Manitoba and Ontario,Canada - Manitoba; Ontario.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2416,Canada - New Brunswick; Newfoundland; Nova Scotia; Quebec,Canada - New Brunswick; Newfoundland; Nova Scotia; Quebec.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2417,Canada - Yukon,Canada - Yukon.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2418,Caribbean - central,Antigua; Barbados; Barbuda; Caicos Islands; Cuba; Dominican Republic; Grand Cayman; Jamaica; Turks and Caicos Islands.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2419,Central America -,Belize; Costa Rica; El Salvador; Guatemala; Honduras; Nicaragua.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2420,Europe - west,Austria; Belgium; Denmark; Faroe Islands; Finland; France; Germany (west); Gibraltar; Greece; Italy; Luxembourg; Netherlands; Norway; Portugal; Spain; Sweden; Switzerland.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2421,Europe - west central,Austria; Denmark; France; Germany (west); Netherlands; Switzerland.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2424,USA - HARN,American Samoa; Puerto Rico and the Virgin Islands; 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; [...]
+2425,Japan - 45d 20m to 46d N; 141d to 142d E.,Japan - 45deg 20min to 46deg North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2426,Japan - 45d 20m to 46d N; 142d to 143d E.,Japan - 45deg 20min to 46deg North; 142deg to 143deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2427,Japan - 44deg 40min to 45deg 20min N; 141deg to 142deg E.,Japan - 44deg 40min to 45deg 20min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2428,Japan - 44deg 40min to 45deg 20min N; 142deg to 143deg E.,Japan - 44deg 40min to 45deg 20min North; 142deg to 143deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2429,Japan - 44deg to 44deg 40min N; 141deg to 142deg E.,Japan - 44deg to 44deg 40min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2430,Japan - 44deg to 44deg 40min N; 142deg to 143deg E.,Japan - 44deg to 44deg 40min North; 142deg to 143deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2431,Japan - 44deg to 44deg 40min N; 143deg to 144deg E.,Japan - 44deg to 44deg 40min North; 143deg to 144deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2432,Japan - 44deg to 44deg 40min N; 144deg to 145deg E.,Japan - 44deg to 44deg 40min North; 144deg to 145deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2433,Japan - 43deg 20min to 44deg N; 141deg to 142deg E.,Japan - 43deg 20min to 44deg North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2434,Japan - 43deg 20min to 44deg N; 142deg to 143deg E.,Japan - 43deg 20min to 44deg North; 142deg to 143deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2435,Japan - 43deg 20min to 44deg N; 143deg to 144deg E.,Japan - 43deg 20min to 44deg North; 143deg to 144deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2436,Japan - 43deg 20min to 44deg N; 144deg to 145deg E.,Japan - 43deg 20min to 44deg North; 144deg to 145deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2437,Japan - 43deg 20min to 44deg N; 145deg to 146deg E.,Japan - 43deg 20min to 44deg North; 145deg to 146deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2438,Japan - 42deg 40min to 43deg 20min N; 140deg to 141deg E.,Japan - 42deg 40min to 43deg 20min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2439,Japan - 42deg 40min to 43deg 20min N; 141deg to 142deg E.,Japan - 42deg 40min to 43deg 20min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1999-11-12 00:00:00,,0
+2440,Japan - 42deg 40min to 43deg 20min N; 142deg to 143deg E.,Japan - 42deg 40min to 43deg 20min North; 142deg to 143deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2441,Japan - 42deg 40min to 43deg 20min N; 143deg to 144deg E.,Japan - 42deg 40min to 43deg 20min North; 143deg to 144deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2442,Japan - 42deg 40min to 43deg 20min N; 144deg to 145deg E.,Japan - 42deg 40min to 43deg 20min North; 144deg to 145deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2443,Japan - 42deg 40min to 43deg 20min N; 145deg to 146deg E.,Japan - 42deg 40min to 43deg 20min North; 145deg to 146deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2444,Japan - 42deg to 42deg 40min N; 139deg to 140deg E.,Japan - 42deg to 42deg 40min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2445,Japan - 42deg to 42deg 40min N; 140deg to 141deg E.,Japan - 42deg to 42deg 40min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2446,Japan - 42deg to 42deg 40min N; 141deg to 142deg E.,Japan - 42deg to 42deg 40min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2447,Japan - 42deg to 42deg 40min N; 142deg to 143deg E.,Japan - 42deg to 42deg 40min North; 142deg to 143deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2448,Japan - 42deg to 42deg 40min N; 143deg to 144deg E.,Japan - 42deg to 42deg 40min North; 143deg to 144deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2449,Japan - 41deg 20min to 42deg N; 140deg to 141deg E.,Japan - 41deg 20min to 42deg North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2450,Japan - 41deg 20min to 42deg N; 141deg to 142deg E.,Japan - 41deg 20min to 42deg North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2451,Japan - 40deg 40min to 41deg 20min N; 140deg to 141deg E.,Japan - 40deg 40min to 41deg 20min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2452,Japan - 40deg 40min to 41deg 20min N; 141deg to 142deg E.,Japan - 40deg 40min to 41deg 20min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2453,Japan - 40deg to 40deg 40min N; 139deg to 140deg E.,Japan - 40deg to 40deg 40min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2454,Japan - 40deg to 40deg 40min N; 140deg to 141deg E.,Japan - 40deg to 40deg 40min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2455,Japan - 40deg to 40deg 40min N; 141deg to 142deg E.,Japan - 40deg to 40deg 40min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2456,Japan - 39deg 20min to 40deg N; 139deg to 140deg E.,Japan - 39deg 20min to 40deg North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2457,Japan - 39deg 20min to 40deg N; 140deg to 141deg E.,Japan - 39deg 20min to 40deg North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2458,Japan - 39deg 20min to 40deg N; 141deg to 142deg E.,Japan - 39deg 20min to 40deg North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2459,Japan - 38deg 40min to 39deg 20min N; 139deg to 140deg E.,Japan - 38deg 40min to 39deg 20min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2460,Japan - 38deg 40min to 39deg 20min N; 140deg to 141deg E.,Japan - 38deg 40min to 39deg 20min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2461,Japan - 38deg 40min to 39deg 20min N; 141deg to 142deg E.,Japan - 38deg 40min to 39deg 20min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2462,Japan - 38deg to 38deg 40min N; 139deg to 140deg E.,Japan - 38deg to 38deg 40min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2463,Japan - 38deg to 38deg 40min N; 140deg to 141deg E.,Japan - 38deg to 38deg 40min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2464,Japan - 38deg to 38deg 40min N; 141deg to 142deg E.,Japan - 38deg to 38deg 40min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2465,Japan - 37deg 20min to 38deg N; 136deg to 137deg E.,Japan - 37deg 20min to 38deg North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2466,Japan - 37deg 20min to 38deg N; 137deg to 138deg E.,Japan - 37deg 20min to 38deg North; 137deg to 138deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2467,Japan - 37deg 20min to 38deg N; 138deg to 139deg E.,Japan - 37deg 20min to 38deg North; 138deg to 139deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2468,Japan - 37deg 20min to 38deg N; 139deg to 140deg E.,Japan - 37deg 20min to 38deg North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2469,Japan - 37deg 20min to 38deg N; 140deg to 141deg E.,Japan - 37deg 20min to 38deg North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2470,Japan - 37deg 20min to 38deg N; 141deg to 142deg E.,Japan - 37deg 20min to 38deg North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2471,Japan - 36deg 40min to 37deg 20min N; 136deg to 137deg E.,Japan - 36deg 40min to 37deg 20min North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2472,Japan - 36deg 40min to 37deg 20min N; 137deg to 138deg E.,Japan - 36deg 40min to 37deg 20min North; 137deg to 138deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2473,Japan - 36deg 40min to 37deg 20min N; 138deg to 139deg E.,Japan - 36deg 40min to 37deg 20min North; 138deg to 139deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2474,Japan - 36deg 40min to 37deg 20min N; 139deg to 140deg E.,Japan - 36deg 40min to 37deg 20min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2475,Japan - 36deg 40min to 37deg 20min N; 140deg to 141deg E.,Japan - 36deg 40min to 37deg 20min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2476,Japan - 36deg to 37deg 40min N; 136deg to 137deg E.,Japan - 36deg to 36deg 40min North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2477,Japan - 36deg to 37deg 40min N; 137deg to 138deg E.,Japan - 36deg to 36deg 40min North; 137deg to 138deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2478,Japan - 36deg to 37deg 40min N; 138deg to 139deg E.,Japan - 36deg to 36deg 40min North; 138deg to 139deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2479,Japan - 36deg to 37deg 40min N; 139deg to 140deg E.,Japan - 36deg to 36deg 40min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2480,Japan - 36deg to 37deg 40min N; 140deg to 141deg E.,Japan - 36deg to 36deg 40min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2481,Japan - 35deg 20min to 36deg N; 132deg to 133deg E.,Japan - 35deg 20min to 36deg North; 132deg to 133deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2482,Japan - 35deg 20min to 36deg N; 133deg to 134deg E.,Japan - 35deg 20min to 36deg North; 133deg to 134deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2483,Japan - 35deg 20min to 36deg N; 134deg to 135deg E.,Japan - 35deg 20min to 36deg North; 134deg to 135deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2484,Japan - 35deg 20min to 36deg N; 135deg to 136deg E.,Japan - 35deg 20min to 36deg North; 135deg to 136deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2485,Japan - 35deg 20min to 36deg N; 136deg to 137deg E.,Japan - 35deg 20min to 36deg North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2486,Japan - 35deg 20min to 36deg N; 137deg to 138deg E.,Japan - 35deg 20min to 36deg North; 137deg to 138deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2487,Japan - 35deg 20min to 36deg N; 138deg to 139deg E.,Japan - 35deg 20min to 36deg North; 138deg to 139deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2488,Japan - 35deg 20min to 36deg N; 139deg to 140deg E.,Japan - 35deg 20min to 36deg North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2489,Japan - 35deg 20min to 36deg N; 140deg to 141deg E.,Japan - 35deg 20min to 36deg North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2490,Japan - 34deg 40min to 35deg 20min N; 132deg to 133deg E.,Japan - 34deg 40min to 35deg 20min North; 132deg to 133deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2491,Japan - 34deg 40min to 35deg 20min N; 133deg to 134deg E.,Japan - 34deg 40min to 35deg 20min North; 133deg to 134deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2492,Japan - 34deg 40min to 35deg 20min N; 134deg to 135deg E.,Japan - 34deg 40min to 35deg 20min North; 134deg to 135deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2493,Japan - 34deg 40min to 35deg 20min N; 135deg to 136deg E.,Japan - 34deg 40min to 35deg 20min North; 135deg to 136deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2494,Japan - 34deg 40min to 35deg 20min N; 136deg to 137deg E.,Japan - 34deg 40min to 35deg 20min North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2495,Japan - 34deg 40min to 35deg 20min N; 137deg to 138deg E.,Japan - 34deg 40min to 35deg 20min North; 137deg to 138deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2496,Japan - 34deg 40min to 35deg 20min N; 138deg to 139deg E.,Japan - 34deg 40min to 35deg 20min North; 138deg to 139deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2497,Japan - 34deg 40min to 35deg 20min N; 139deg to 140deg E.,Japan - 34deg 40min to 35deg 20min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2498,Japan - 34deg 40min to 35deg 20min N; 140deg to 141deg E.,Japan - 34deg 40min to 35deg 20min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2499,Japan - 34deg to 34deg 40min N; 130deg to 131deg E.,Japan - 34deg to 34deg 40min North; 130deg to 131deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2500,Japan - 34deg to 34deg 40min N; 131deg to 132deg E.,Japan - 34deg to 34deg 40min North; 131deg to 132deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2501,Japan - 34deg to 34deg 40min N; 132deg to 133deg E.,Japan - 34deg to 34deg 40min North; 132deg to 133deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2502,Japan - 34deg to 34deg 40min N; 133deg to 134deg E.,Japan - 34deg to 34deg 40min North; 133deg to 134deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2503,Japan - 34deg to 34deg 40min N; 134deg to 135deg E.,Japan - 34deg to 34deg 40min North; 134deg to 135deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2504,Japan - 34deg to 34deg 40min N; 135deg to 136deg E.,Japan - 34deg to 34deg 40min North; 135deg to 136deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2505,Japan - 34deg to 34deg 40min N; 136deg to 137deg E.,Japan - 34deg to 34deg 40min North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2506,Japan - 34deg to 34deg 40min N; 137deg to 138deg E.,Japan - 34deg to 34deg 40min North; 137deg to 138deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2507,Japan - 34deg to 34deg 40min N; 138deg to 139deg E.,Japan - 34deg to 34deg 40min North; 138deg to 139deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2508,Japan - 33deg 20min to 34deg N; 129deg to 130deg E.,Japan - 33deg 20min to 34deg North; 129deg to 130deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2509,Japan - 33deg 20min to 34deg N; 130deg to 131deg E.,Japan - 33deg 20min to 34deg North; 130deg to 131deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2510,Japan - 33deg 20min to 34deg N; 131deg to 132deg E.,Japan - 33deg 20min to 34deg North; 131deg to 132deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2511,Japan - 33deg 20min to 34deg N; 132deg to 133deg E.,Japan - 33deg 20min to 34deg North; 132deg to 133deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2512,Japan - 33deg 20min to 34deg N; 133deg to 134deg E.,Japan - 33deg 20min to 34deg North; 133deg to 134deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2513,Japan - 33deg 20min to 34deg N; 134deg to 135deg E.,Japan - 33deg 20min to 34deg North; 134deg to 135deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2514,Japan - 33deg 20min to 34deg N; 135deg to 136deg E.,Japan - 33deg 20min to 34deg North; 135deg to 136deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2515,Japan - 33deg 20min to 34deg N; 136deg to 137deg E.,Japan - 33deg 20min to 34deg North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2516,Japan - 32deg 40min to 33deg 20min N; 129deg to 130deg E.,Japan - 32deg 40min to 33deg 20min North; 129deg to 130deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2517,Japan - 32deg 40min to 33deg 20min N; 130deg to 131deg E.,Japan - 32deg 40min to 33deg 20min North; 130deg to 131deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2518,Japan - 32deg 40min to 33deg 20min N; 131deg to 132deg E.,Japan - 32deg 40min to 33deg 20min North; 131deg to 132deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2519,Japan - 32deg 40min to 33deg 20min N; 132deg to 133deg E.,Japan - 32deg 40min to 33deg 20min North; 132deg to 133deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2520,Japan - 32deg 40min to 33deg 20min N; 133deg to 134deg E.,Japan - 32deg 40min to 33deg 20min North; 133deg to 134deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2521,Japan - 32deg 40min to 33deg 20min N; 134deg to 135deg E.,Japan - 32deg 40min to 33deg 20min North; 134deg to 135deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2522,Japan - 32deg to 32deg 40min N; 130deg to 131deg E.,Japan - 32deg to 32deg 40min North; 130deg to 131deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2523,Japan - 32deg to 32deg 40min N; 131deg to 132deg E.,Japan - 32deg to 32deg 40min North; 131deg to 132deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2524,Japan - 31deg 20min to 32deg N; 130deg to 131deg E.,Japan - 31deg 20min to 32deg North; 130deg to 131deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2525,Japan - 31deg 20min to 32deg N; 131deg to 132deg E.,Japan - 31deg 20min to 32deg North; 131deg to 132deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2526,Japan - 30deg 40min to 31deg 20min N; 130deg to 131deg E.,Japan - 30deg 40min to 31deg 20min North; 130deg to 131deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2527,USA - Texas - SPCS83 - S central,United States (USA) - Texas between approximately 30d 10m & 28d 05m North - counties of Aransas; Atascosa; Austin; Bandera; Bee; Bexar; Brazoria; Brewster; Caldwell; Calhoun; Chambers; Colorado; Comal; De Witt; Dimmit; Edwards; Fayette; Fort Bend; Frio; Galveston; Goliad; Gonzales; Guadalupe; Harris; Hays; Jackson; Jefferson; Karnes; Kendall; Kerr; Kinney; La Salle; Lavaca; Live Oak; Matagorda; Maverick; McMullen; Medina; Presidio; Real; Refugio; Ter [...]
+2528,USA - Texas - SPCS83 - S,United States (USA) - Texas south of approximately 28d 05m North - counties of Brooks; Cameron; Duval; Hidalgo; Jim Hogg; Jim Wells; Kenedy; Kleberg; Nueces; San Patricio; Starr; Webb; Willacy; Zapata.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2529,USA - Louisiana - SPCS83 - S,United States (USA) - Louisiana south of approximately 30d 55m North - counties of Acadia; Allen; Ascension; Assumption; Beauregard; Calcasieu; Cameron; East Baton Rouge; East Feliciana; Evangeline; Iberia; Iberville; Jefferson; Jefferson Davis; Lafayette; LaFourche; Livingston; Orleans; Plaquemines; Pointe Coupee; St. Bernard; St. Charles; St. Helena; St. James; St. John the Baptist; St. Landry; St. Martin; St. Mary; St. Tammany; Tangipahoa; Terrebonne; [...]
+2530,UK - Northern Ireland,United Kingdom (UK) - Northern Ireland (Ulster).,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2531,Denmark - Jutland and Fuen,Denmark - Jutland and Fuen.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2532,Denmark - Zealand and Lolland,Denmark - Zealand and Lolland.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2533,Denmark - Bornholm,Denmark - Bornholm.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2534,3-degree TM - N hemisphere CM 27 deg E,"Between 25 deg 30 min and 28 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2535,3-degree TM - N hemisphere CM 30 deg E,"Between 28 deg 30 min and 31 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2536,3-degree TM - N hemisphere CM 33 deg E,"Between 31 deg 30 min and 34 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2537,3-degree TM - N hemisphere CM 36 deg E,"Between 34 deg 30 min and 37 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2538,3-degree TM - N hemisphere CM 39 deg E,"Between 37 deg 30 min and 40 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2539,3-degree TM - N hemisphere CM 42 deg E,"Between 40 deg 30 min and 43 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2540,3-degree TM - N hemisphere CM 45 deg E,"Between 43 deg 30 min and 46 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2541,Germany - former west Germany N,Germany - former west Germany north of 52deg 20min N.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2542,Germany - former west Germany C,Germany - former west Germany between 50deg 20min and 52deg 20min N.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2543,Germany - former west Germany S,Germany - former west Germany south of 50deg 20min N.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2544,Germany - Thuringen,Germany - Thuringen.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2545,Germany - Sachsen,Germany - Sachsen.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2546,Romania - offshore,Romania - offshore.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2547,Yugoslavia - Montenegro,Yugoslavia - Montenegro.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2548,Africa - AOF W of 10deg W,French West Africa west of 10deg West.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2549,Africa - AOF 10 to 3.5deg W,French West Africa between 10deg and 3deg 30min West.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2550,Africa - AOF 3.5deg W to 4deg E,French West Africa between 3deg 30min West and 4deg East.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2551,Africa - AOF 4 to 9deg E,French West Africa between 4deg and 9deg East.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2552,Africa - AEF 9 to 14deg E,French Equatorial Africa between 9deg and 14deg East.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2553,Africa - AEF 14 to 21deg E,French Equatorial Africa between 14deg and 21deg East.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2554,Africa - AEF east of 21deg E,French Equatorial Africa east of 21deg East.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2555,Cameroon - coastal area,Cameroon - coastal area.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2556,Greenland - north of 81 deg N,Greenland - north of 81 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2557,Greenland - east - 78 to 81 deg N,Greenland - east of 44 deg West and between 78 deg and 81 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2558,Greenland - east - 75 to 78 deg N,Greenland - east of 42 deg West and between 75 deg and 78 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2559,Greenland - east - 72 to 75 deg N,Greenland - east of 38 deg West and between 72 deg and 75 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2560,Greenland - east - 69 to 72 deg N,Greenland - east of 38 deg West and between 69 deg and 72 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2561,Greenland - east - 66 to 69 deg N,Greenland - east of 42 deg West and between 66 deg and 69 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2562,Greenland - east - 63 to 66 deg N,Greenland - east of 46 deg West and between 63 deg and 66 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2563,Greenland - west - 78 to 81 deg N,Greenland - west of 44 deg West and between 78 deg and 81 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2564,Greenland - west - 75 to 78 deg N,Greenland - west of 44 deg West and between 75 deg and 78 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2565,Greenland - west - 72 to 75 deg N,Greenland - west of 38 deg West and between 72 deg and 75 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2566,Greenland - west - 69 to 72 deg N,Greenland - west of 38 deg West and between 69 deg and 72 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2567,Greenland - west - 66 to 69 deg N,Greenland - west of 42 deg West and between 66 deg and 69 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2568,Greenland - west - 63 to 66 deg N,Greenland - west of 46 deg West and between 63 deg and 66 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2569,Greenland - south of 63 deg N,Greenland - south of 63 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2570,Greenland - Scoresbysund area,Greenland - Scoresbysund area.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2571,Greenland - Ammassalik area,Greenland - Ammassalik area.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2572,Greenland - E of 48d W,Greenland east of 48 deg West.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2573,Greenland - W of 48d W,Greenland west of 48 deg West.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2574,Congo - coastal area and offshore,Congo - coastal area and offshore.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2575,Australia - all states,Australia - Australian Capital Territory (ACT); New South Wales (NSW); Northern Territories (NT); Queensland (Qld); South Australia (SA); Tasmania (Tas); Western Australia (WA); Victoria (Vic).,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2576,Australia - AGD84,"Australia - Queensland (Qld), South Australia (SA), Western Australia (WA).",,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2577,Indonesia - Java Sea - ONWJ,Indonesia - Java Sea - offshore northwest Java.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2588,Indonesia - Java Sea - E,Indonesia - eastern Java Sea.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2589,Indonesia - Irian Jaya - Tangguh,Indonesia - Irian Jaya - Tangguh.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2590,Cameroon - Garoua area,Cameroon - Garoua area.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2591,Cameroon - N'Djamena area,Cameroon - N'Djamena area.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2592,Azerbaijan - offshore and Sangachal,Azerbaijan - offshore and Sangachal terminal.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2593,Asia - Azerbaijan and Georgia,Azerbaijan and Georgia,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2594,Azerbaijan - coastal area Baku to Astara,Azerbaijan - coastal area Baku to Astara.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2595,Egypt - Western Desert,Egypt - Western Desert.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2596,Argentina - Tierra del Fuego - offshore W of 66W,Argentina - Tierra del Fuego offshore west of 66 deg West.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2597,Argentina - Tierra del Fuego - offshore E of 66W,Argentina - Tierra del Fuego offshore east of 66 deg West.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2598,Algeria - District 3,Algeria - District 3 (In Salah).,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2599,Algeria - In Amenas,Algeria - In Amenas block.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2600,Algeria - Hassi Bir Reikaz,Algeria - Hassi Bir Reikaz.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2601,Norway - offshore N of 62 deg N; Svalbard; Jan Mayen,Norway - offshore north of 62 deg N; Svalbard and Jan Mayen Islands.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2602,"Palestine Territory, Occupied","Palestine Territory, Occupied.",PS,PSE,275,,ISO 3166 Maintenance Agency. ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,,0
+2603,Asia - Middle East - Israel and Palestine Territory,Asia - Middle East - Israel and Palestine Territory.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2604,3-degree TM - N hemisphere CM 48 deg E,"Between 46 deg 30 min and 49 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2605,3-degree TM - N hemisphere CM 51 deg E,"Between 49 deg 30 min and 52 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2606,3-degree TM - N hemisphere CM 54 deg E,"Between 52 deg 30 min and 55 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2607,3-degree TM - N hemisphere CM 57 deg E,"Between 55 deg 30 min and 58 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2608,3-degree TM - N hemisphere CM 60 deg E,"Between 58 deg 30 min and 61 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2609,3-degree TM - N hemisphere CM 63 deg E,"Between 61 deg 30 min and 64 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2610,3-degree TM - N hemisphere CM 66 deg E,"Between 64 deg 30 min and 67 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2611,3-degree TM - N hemisphere CM 69 deg E,"Between 67 deg 30 min and 70 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2612,3-degree TM - N hemisphere CM 72 deg E,"Between 70 deg 30 min and 73 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2613,3-degree TM - N hemisphere CM 75 deg E,"Between 73 deg 30 min and 76 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2614,3-degree TM - N hemisphere CM 78 deg E,"Between 76 deg 30 min and 79 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2615,3-degree TM - N hemisphere CM 81 deg E,"Between 79 deg 30 min and 82 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2616,3-degree TM - N hemisphere CM 84 deg E,"Between 82 deg 30 min and 85 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2617,3-degree TM - N hemisphere CM 87 deg E,"Between 85 deg 30 min and 88 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2618,3-degree TM - N hemisphere CM 90 deg E,"Between 88 deg 30 min and 91 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2619,3-degree TM - N hemisphere CM 93 deg E,"Between 91 deg 30 min and 94 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2620,3-degree TM - N hemisphere CM 96 deg E,"Between 94 deg 30 min and 97 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2621,3-degree TM - N hemisphere CM 99 deg E,"Between 97 deg 30 min and 100 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2622,3-degree TM - N hemisphere CM 102 deg E,"Between 100 deg 30 min and 103 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2623,3-degree TM - N hemisphere CM 105 deg E,"Between 103 deg 30 min and 106 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2624,3-degree TM - N hemisphere CM 108 deg E,"Between 106 deg 30 min and 109 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2625,3-degree TM - N hemisphere CM 111 deg E,"Between 109 deg 30 min and 112 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2626,3-degree TM - N hemisphere CM 114 deg E,"Between 112 deg 30 min and 115 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2627,3-degree TM - N hemisphere CM 117 deg E,"Between 115 deg 30 min and 118 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2628,3-degree TM - N hemisphere CM 120 deg E,"Between 118 deg 30 min and 121 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2629,3-degree TM - N hemisphere CM 123 deg E,"Between 121 deg 30 min and 124 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2630,3-degree TM - N hemisphere CM 126 deg E,"Between 124 deg 30 min and 127 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2631,3-degree TM - N hemisphere CM 129 deg E,"Between 127 deg 30 min and 130 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2632,3-degree TM - N hemisphere CM 132 deg E,"Between 130 deg 30 min and 133 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2633,3-degree TM - N hemisphere CM 135 deg E,"Between 133 deg 30 min and 136 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2634,3-degree TM - N hemisphere CM 138 deg E,"Between 136 deg 30 min and 139 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2635,3-degree TM - N hemisphere CM 141 deg E,"Between 139 deg 30 min and 142 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2636,3-degree TM - N hemisphere CM 144 deg E,"Between 142 deg 30 min and 145 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2637,3-degree TM - N hemisphere CM 147 deg E,"Between 145 deg 30 min and 148 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2638,3-degree TM - N hemisphere CM 150 deg E,"Between 148 deg 30 min and 151 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2639,3-degree TM - N hemisphere CM 153 deg E,"Between 151 deg 30 min and 154 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2640,3-degree TM - N hemisphere CM 156 deg E,"Between 154 deg 30 min and 157 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2641,3-degree TM - N hemisphere CM 159 deg E,"Between 157 deg 30 min and 160 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2642,3-degree TM - N hemisphere CM 162 deg E,"Between 160 deg 30 min and 163 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2643,3-degree TM - N hemisphere CM 165 deg E,"Between 163 deg 30 min and 166 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2644,3-degree TM - N hemisphere CM 168 deg E,"Between 166 deg 30 min and 169 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2645,3-degree TM - N hemisphere CM 171 deg E,"Between 169 deg 30 min and 172 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2646,3-degree TM - N hemisphere CM 174 deg E,"Between 172 deg 30 min and 175 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2647,3-degree TM - N hemisphere CM 177 deg E,"Between 175 deg 30 min and 178 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2648,3-degree TM - N hemisphere CM 180 deg,"Between 178 deg 30 min East and 178 deg 30 min West, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2649,3-degree TM - N hemisphere CM 177 deg W,"Between 178 deg 30 min and 175 deg 30 min West, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2650,3-degree TM - N hemisphere CM 174 deg W,"Between 175 deg 30 min and 172 deg 30 min West, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2651,3-degree TM - N hemisphere CM 171 deg W,"Between 172 deg 30 min and 169 deg 30 min West, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2652,3-degree TM - N hemisphere CM 168 deg W,"Between 169 deg 30 min and 166 deg 30 min West, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2653,Europe - 3deg GK CM 21 deg E,Russian Federation and Ukraine - between 19 deg 30 min and 22 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2654,Europe - 3deg GK CM 24 deg E,"Belarus, Russian Federation and Ukraine - between 22 deg 30 min and 25 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2655,Europe - 3deg GK CM 27 deg E,"Belarus, Moldova, Russian Federation and Ukraine - between 25 deg 30 min and 28 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2656,Europe - 3deg GK CM 30 deg E,"Belarus, Moldova, Russian Federation and Ukraine - between 28 deg 30 min and 31 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2657,Europe - 3deg GK CM 33 deg E,"Belarus, Russian Federation and Ukraine - between 31 deg 30 min and 34 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2658,Europe - 3deg GK CM 36 deg E,Russian Federation and Ukraine - between 34 deg 30 min and 37 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2659,Europe - 3deg GK CM 39 deg E,"Georgia, Russian Federation and Ukraine - between 37 deg 30 min and 40 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2660,Europe - 3deg GK CM 42 deg E,"Georgia, Russian Federation - between 40 deg 30 min and 43 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2661,Europe - 3deg GK CM 45 deg E,"Armenia, Azerbaijan, Georgia and Russian Federation - between 43 deg 30 min and 46 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2662,Europe - 3deg GK CM 48 deg E,"Azerbaijan, Georgia and Russian Federation - between 46 deg 30 min and 49 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2663,Europe - 3deg GK CM 51 deg E,"Azerbaijan, Georgia and Russian Federation - between 49 deg 30 min and 52 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2664,Asia - 3deg GK CM 54 deg E,"Kazakstan, Russian Federation and Turkmenistan - between 52 deg 30 min and 55 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2665,Asia - 3deg GK CM 57 deg E,"Kazakstan, Russian Federation and Turkmenistan - between 55 deg 30 min and 58 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2666,Asia - 3deg GK CM 60 deg E,"Kazakstan, Russian Federation, Turkmenistan and Uzbekistan - between 58 deg 30 min and 61 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2667,Asia - 3deg GK CM 63 deg E,"Kazakstan, Russian Federation, Turkmenistan and Uzbekistan - between 61 deg 30 min and 64 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2668,Asia - 3deg GK CM 66 deg E,"Kazakstan, Russian Federation, Turkmenistan and Uzbekistan - between 64 deg 30 min and 67 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2669,Asia - 3deg GK CM 69 deg E,"Kazakstan, Kyrgyzstan, Russian Federation, Tajikistan and Uzbekistan - between 67 deg 30 min and 70 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2670,Asia - 3deg GK CM 72 deg E,"Kazakstan, Kyrgyzstan, Russian Federation, Tajikistan and Uzbekistan - between 70 deg 30 min and 73 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2671,Asia - 3deg GK CM 75 deg E,"Kazakstan, Kyrgyzstan, Russian Federation and Tajikistan - between 73 deg 30 min and 76 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2672,Asia - 3deg GK CM 78 deg E,"Kazakstan, Kyrgyzstan and Russian Federation - between 76 deg 30 min and 79 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2673,Asia - 3deg GK CM 81 deg E,"Kazakstan, Kyrgyzstan and Russian Federation - between 79 deg 30 min and 82 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2674,Asia - 3deg GK CM 84 deg E,Kazakstan and Russian Federation - between 82 deg 30 min and 85 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2675,Asia - 3deg GK CM 87 deg E,Kazakstan and Russian Federation - between 85 deg 30 min and 88 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2676,Russia - 88.5 to 91.5 deg E,Russian Federation - between 88 deg 30 min and 91 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2677,Russia - 91.5 to 94.5 deg E,Russian Federation - between 91 deg 30 min and 94 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2678,Russia - 94.5 to 97.5 deg E,Russian Federation - between 94 deg 30 min and 97 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2679,Russia - 97.5 to 100.5 deg E,Russian Federation - between 97 deg 30 min and 100 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2680,Russia - 100.5 to 103.5 deg E,Russian Federation - between 100 deg 30 min and 103 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2681,Russia - 103.5 to 106.5 deg E,Russian Federation - between 103 deg 30 min and 106 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2682,Russia - 106.5 to 109.5 deg E,Russian Federation - between 106 deg 30 min and 109 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2683,Russia - 109.5 to 112.5 deg E,Russian Federation - between 109 deg 30 min and 112 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2684,Russia - 112.5 to 115.5 deg E,Russian Federation - between 112 deg 30 min and 115 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2685,Russia - 115.5 to 118.5 deg E,Russian Federation - between 115 deg 30 min and 118 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2686,Russia - 118.5 to 121.5 deg E,Russian Federation - between 118 deg 30 min and 121 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2687,Russia - 121.5 to 124.5 deg E,Russian Federation - between 121 deg 30 min and 124 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2688,Russia - 124.5 to 127.5 deg E,Russian Federation - between 124 deg 30 min and 127 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2689,Russia - 127.5 to 130.5 deg E,Russian Federation - between 127 deg 30 min and 130 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2690,Russia - 130.5 to 133.5 deg E,Russian Federation - between 130 deg 30 min and 133 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2691,Russia - 133.5 to 136.5 deg E,Russian Federation - between 133 deg 30 min and 136 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2692,Russia - 136.5 to 139.5 deg E,Russian Federation - between 136 deg 30 min and 139 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2693,Russia - 139.5 to 142.5 deg E,Russian Federation - between 139 deg 30 min and 142 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2694,Russia - 142.5 to 145.5 deg E,Russian Federation - between 142 deg 30 min and 145 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2695,Russia - 145.5 to 148.5 deg E,Russian Federation - between 145 deg 30 min and 148 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2696,Russia - 148.5 to 151.5 deg E,Russian Federation - between 148 deg 30 min and 151 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2697,Russia - 151.5 to 154.5 deg E,Russian Federation - between 151 deg 30 min and 154 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2698,Russia - 154.5 to 157.5 deg E,Russian Federation - between 154 deg 30 min and 157 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2699,Russia - 157.5 to 160.5 deg E,Russian Federation - between 157 deg 30 min and 160 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2700,Russia - 160.5 to 163.5 deg E,Russian Federation - between 160 deg 30 min and 163 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2701,Russia - 163.5 to 166.5 deg E,Russian Federation - between 163 deg 30 min and 166 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2702,Russia - 166.5 to 170.5 deg E,Russian Federation - between 166 deg 30 min and 169 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2703,Russia - 169.5 to 172.5 deg E,Russian Federation - between 169 deg 30 min and 172 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2704,Russia - 172.5 to 175.5 deg E,Russian Federation - between 172 deg 30 min and 175 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2705,Russia - 175.5 to 178.5 deg E,Russian Federation - between 175 deg 30 min and 178 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2706,Russia - 178.5E to 178.5 deg W,Russian Federation - between 178 deg 30 min East and 178 deg 30 min West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2707,Russia - 178.5 to 175.5 deg W,Russian Federation - between 178 deg 30 min and 175 deg 30 min West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2708,Russia - 175.5 to 172.5 deg W,Russian Federation - between 175 deg 30 min and 172 deg 30 min West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2709,Russia - 172.5 to 169.5 deg W,Russian Federation - between 172 deg 30 min and 169 deg 30 min West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2710,Russia - 169.5 to 166.5 deg W,Russian Federation - between 169 deg 30 min and 166 deg 30 min West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2711,China - 73.5 to 76.5 deg E,China - between 73 deg 30 min and 76 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2712,China - 76.5 to 79.5 deg E,China - between 76 deg 30 min and 79 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2713,China - 79.5 to 82.5 deg E,China - between 79 deg 30 min and 82 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2714,China - 82.5 to 85.5 deg E,China - between 82 deg 30 min and 85 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2715,China - 85.5 to 88.5 deg E,China - between 85 deg 30 min and 88 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2716,China - 88.5 to 91.5 deg E,China - between 88 deg 30 min and 91 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2717,China - 91.5 to 94.5 deg E,China - between 91 deg 30 min and 94 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2718,China - 94.5 to 97.5 deg E,China - between 94 deg 30 min and 97 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2719,China - 97.5 to 100.5 deg E,China - between 97 deg 30 min and 100 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2720,China - 100.5 to 103.5 deg E,China - between 100 deg 30 min and 103 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2721,China - 103.5 to 106.5 deg E,China - between 103 deg 30 min and 106 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2722,China - 106.5 to 109.5 deg E,China - between 106 deg 30 min and 109 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2723,China - 109.5 to 112.5 deg E,China - between 109 deg 30 min and 112 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2724,China - 112.5 to 115.5 deg E,China - between 112 deg 30 min and 115 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2725,China - 115.5 to 118.5 deg E,China - between 115 deg 30 min and 118 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2726,China - 118.5 to 121.5 deg E,China - between 118 deg 30 min and 121 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2727,China - 121.5 to 124.5 deg E,China - between 121 deg 30 min and 124 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2728,China - 124.5 to 127.5 deg E,China - between 124 deg 30 min and 127 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2729,China - 127.5 to 130.5 deg E,China - between 127 deg 30 min and 130 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2730,China - 130.5 to 133.5 deg E,China - between 130 deg 30 min and 133 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2731,China - 133.5 to 136.5 deg E,China - between 133 deg 30 min and 136 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2732,6-degree TM - CM 81 deg W,Between 84 and 78 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2733,6-degree TM - CM 75 deg W,Between 78 and 72 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2734,6-degree TM - CM 69 deg W,Between 72 and 66 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2735,6-degree TM - CM 63 deg W,Between 66 and 60 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2736,6-degree TM - CM 57 deg W,Between 60 and 54 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2737,6-degree TM - CM 51 deg W,Between 54 and 48 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2738,6-degree TM - CM 45 deg W,Between 48 and 42 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2739,6-degree TM - CM 39 deg W,Between 42 and 36 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2740,6-degree TM - CM 33 deg W,Between 36 and 30 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2741,6-degree TM - CM 9 deg E,Between 6 and 12 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2742,6-degree TM - CM 15 deg E,Between 12 and 18 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2743,6-degree TM - CM 21 deg E,Between 18 and 24 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2744,6-degree TM - CM 27 deg E,Between 24 and 30 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2745,6-degree TM - CM 33 deg E,Between 30 and 36 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2746,6-degree TM - CM 39 deg E,Between 36 and 42 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2747,Russia - 19.5 to 22.5 deg E,Russian Federation - between 19 deg 30 min and 22 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2748,Russia - 22.5 to 25.5 deg E,Russian Federation - between 22 deg 30 min and 25 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2749,Russia - 25.5 to 28.5 deg E,Russian Federation - between 25 deg 30 min and 28 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2750,Russia - 28.5 to 31.5 deg E,Russian Federation - between 28 deg 30 min and 31 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2751,Russia - 31.5 to 34.5 deg E,Russian Federation - between 31 deg 30 min and 34 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2752,Russia - 34.5 to 37.5 deg E,Russian Federation - between 34 deg 30 min and 37 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2753,Russia - 37.5 to 40.5 deg E,Russian Federation - between 37 deg 30 min and 40 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2754,Russia - 40.5 to 43.5 deg E,Russian Federation - between 40 deg 30 min and 43 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2755,Russia - 43.5 to 46.5 deg E,Russian Federation - between 43 deg 30 min and 46 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2756,Russia - 46.5 to 49.5 deg E,Russian Federation - between 46 deg 30 min and 49 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2757,Russia - 49.5 to 52.5 deg E,Russian Federation - between 49 deg 30 min and 52 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2758,Russia - 52.5 to 55.5 deg E,Russian Federation - between 52 deg 30 min and 55 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2759,Russia - 55.5 to 58.5 deg E,Russian Federation - between 55 deg 30 min and 58 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2760,Russia - 58.5 to 61.5 deg E,Russian Federation - between 58 deg 30 min and 61 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2761,Russia - 61.5 to 64.5 deg E,Russian Federation - between 61 deg 30 min and 64 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2762,Russia - 64.5 to 67.5 deg E,Russian Federation - between 64 deg 30 min and 67 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2763,Russia - 67.5 to 70.5 deg E,Russian Federation - between 67 deg 30 min and 70 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2764,Russia - 70.5 to 73.5 deg E,Russian Federation - between 70 deg 30 min and 73 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2765,Russia - 73.5 to 76.5 deg E,Russian Federation - between 73 deg 30 min and 76 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2766,Russia - 76.5 to 79.5 deg E,Russian Federation - between 76 deg 30 min and 79 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2767,Russia - 79.5 to 82.5 deg E,Russian Federation - between 79 deg 30 min and 82 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2768,Russia - 82.5 to 85.5 deg E,Russian Federation - between 82 deg 30 min and 85 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2769,Russia - 85.5 to 88.5 deg E,Russian Federation - between 85 deg 30 min and 88 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2770,Indonesia - Kalimantan NE,Indonesia - northeast Kalimantan.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2771,Niger - SE,Niger - south east,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2772,Asia - CS63 zone A1,Armenia and Georgia west of 43deg 02min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2773,Asia - CS63 zone A2,Armenia and Georgia between 43 deg 02min and 46 deg 02 min E; Azerbaijan west of 46 deg 02 min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2774,Asia - CS63 zone A3,Armenia and Georgia east of 46 deg 02 min E; Azerbaijan between 46 deg 02min and 49 deg 02 min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2775,Asia - CS63 zone A4,Azerbaijan east of 49 deg 02 min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2776,Asia - CS63 zone K2,Kazakstan between 49 deg 16 min and 52 deg 16 min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2777,Asia - CS63 zone K3,Kazakstan between 52 deg 16 min and 55 deg 16 min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2778,Asia - CS63 zone K4,Kazakstan between 55 deg 16 min and 58 deg 16 min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2779,Portugal - Selvagens,Portugal - Selvagens island (Madeira group).,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2780,Malaysia - East Malaysia - offshore,Malaysia - East Malaysia (Sabah; Sarawak) - offshore.,,,,,EPSG,EPSG,2002-07-13 00:00:00,,0
+2781,Iran - Kharg Island,Islamic Republic of Iran - Kharg Island.,,,,,EPSG,EPSG,2002-07-13 00:00:00,,0
+2782,Iran - Lavan Island and Balal field,Islamic Republic of Iran - Lavan Island and Balal field.,,,,,EPSG,EPSG,2002-07-13 00:00:00,,0
+2783,Iran - South Pars block 2,Islamic Republic of Iran - South Pars field blocks 2 and 3.,,,,,EPSG,EPSG,2002-07-13 00:00:00,,0
+2784,Canada - CSRS,Canada - Alberta; New Brunswick; Nova Scotia; Saskatchewan; Prince Edward Island; and Quebec.,,,,,EPSG,EPSG,2002-07-13 00:00:00,,0
+2785,Libya - Murzuq,Libyan Arab Jamahiriya - Murzuq field,,,,,EPSG,EPSG,2002-07-16 00:00:00,,0
+2786,Libya - Mabruk,Libyan Arab Jamahiriya - Mabruk field,,,,,EPSG,EPSG,2002-07-16 00:00:00,,0
diff --git a/src/tiff/csv/codes.csv b/src/tiff/csv/codes.csv
new file mode 100644
index 0000000..9bd878f
--- /dev/null
+++ b/src/tiff/csv/codes.csv
@@ -0,0 +1,84 @@
+"RECORD_ID","TABLE_NAME","TABLE_CONTENTS","CODE_MINIMUM","CODE_MAXIMUM","ALLOCATED_LOW","ALLOCATED_HIGH","REMARKS"
+0.01,Note: EPSG codes reserved range.,,0,32767,,,EPSG reserved code range 0-32766. Users should allocated codes outside of this range.
+1.0,Alias,Aliases for data in all tables.,1,,1,2020,Autonumbered. Code range also used in other tables.
+2.0,Area,Area of use,1024,32767,1024,2784,Allocated sequentially - codes have no meaning. Code range also used in other tables.
+3.0,Change,Change records,,,,,Allocated sequentially with calendar year.
+4.0,Codes,EPSG codes,,,,,(This table)
+5.0,Coordinate Axis,Coordinate system attributes,,,,,No codes allocated - intersection table using dual key codes of related tables.
+6.0,Coordinate Axis Name,Coordinate system axis names,9900,9999,9901,9928,Allocated sequentially - codes have no meaning.
+7.0,Coordinate Reference System,Coordinate Reference System data,,,,,
+7.1,Coordinate Reference System, Geographic coordinate reference systems,,,,,
+7.11,Coordinate Reference System, geogCRS unspecified datum,4000,4099,4001,4047,
+7.12,Coordinate Reference System, geogCRS non-WGS systems (1),4120,4139,4120,4139,Form ProjCRS 20yy to 39yy. Range full.
+7.13,Coordinate Reference System, geogCRS non-WGS systems (2),4140,4199,4140,4199,Added sequentially - codes have no meaning. Range full.
+7.14,Coordinate Reference System, geogCRS non-WGS systems (3),4200,4319,4200,4319,Form ProjCRS 200yy to 319yy. Range full.
+7.15,Coordinate Reference System, geogCRS non-WGS systems (4),4600,4799,4600,4617,Added sequentially - codes have no meaning.
+7.16,Coordinate Reference System, geogCRS NAD systems overflow,4320,4321,4320,4321,Form ProjCRS 320yy to 321yy. Range full.
+7.17,Coordinate Reference System, geogCRS WGS systems,4322,4327,4322,4327,Form ProjCRS 322yy to 327yy. Range full.
+7.18,Coordinate Reference System, geogCRS non-Greenwich prime meridian equivalent,4800,4899,4801,4820,Form ProjCRS 20yy to 39yy and 200yy to 319yy as in 6.12 and 6.14.
+7.19,Coordinate Reference System, geogCRS no Greenwich prime meridian,4900,4999,4901,4904,
+7.3,Coordinate Reference System, Projected coordinate reference systems,,,,,
+7.31,Coordinate Reference System, projCRS (1a),2000,3999,2000,3992,Historically allocated from geogCRS 4120-4139. Now being infilled sequentially.
+7.32,Coordinate Reference System, projCRS (1b),2000,3999,2000,2963,Now being allocated sequentially around codes previously allocated from geogCRS 4120-4139.
+7.35,Coordinate Reference System, projCRS (2),20000,32766,20004,32766,Historically allocated from geogCRS 4200-4327. Will be infilled sequentially after range 2000-3999 full.
+7.4,Coordinate Reference System, Vertical coordinate reference systems,,,,,
+7.41,Coordinate Reference System, using ellipsoidal datum,,,,,Deleted in v3.2
+7.42,Coordinate Reference System, using geoidal datum,5600,5799,5701,5739,
+7.5,Coordinate Reference System, Engineering coordinate reference systems,5800,5999,5800,5816,
+7.6,Coordinate Reference System, Compound coordinate reference systems,7400,7999,7401,7413,
+8.0,Coordinate System,Coordinate System descriptions,,,,,
+8.1,Coordinate System, Cartesian coordinate systems used in geocentric CRSs,6500,6500,6500,6500,
+8.2,Coordinate System, Cartesian coordinate systems used in projected CRSs,4400,4599,4400,4532,
+8.3,Coordinate System, Cartesian coordinate systems used only in Engineering CRSs,6501,6599,,,
+8.4,Coordinate System, Ellipsoidal and spherical coordinate systems,6400,6449,6401,6404,
+8.5,Coordinate System, Gravity-related coordinate systems,6450,6499,6497,6499,
+9.0,Coordinate_Operation,Coordinate Operations,,,,,
+9.1,Coordinate_Operation, Map Projections (Coordinate Conversions),,,,,Codes between 10000 and 19999.
+9.11,Coordinate_Operation, US State Plane,10000,15999,10001,15917,non-continuous allocation due to semi-heirarchical coding by State.
+9.12,Coordinate_Operation, global zoned systems,16000,16399,160,163,last two digits indicate zone number
+9.13,Coordinate_Operation, TM (pseudo UTM) systems NE hem.,16400,16580,16400,16506,systems in the N and E hemispheres. Digits indicate longitude of origin.
+9.14,Coordinate_Operation, TM (pseudo UTM) systems SE hem.,16600,16780,16611,16732,systems in the S and E hemispheres. Digits indicate longitude of origin.
+9.15,Coordinate_Operation, TM (pseudo UTM) systems SW hem.,16800,16980,,,systems in the S and W hemispheres. Digits indicate longitude of origin.
+9.16,Coordinate_Operation, TM (pseudo UTM) systems NW hem.,17000,17180,17001,17054,systems in the N and W hemispheres. Digits indicate longitude of origin.
+9.17,Coordinate_Operation, large zoned systems,17200,17999,173,179,last two digits usually indicate zone number
+9.18,Coordinate_Operation, small zoned systems,18000,18999,1801,1844,last digit indicates zone number
+9.19,Coordinate_Operation, individual zones,19000,19999,19000,19979,
+9.3,Coordinate_Operation, Coordinate Transformations,,,,,
+9.31,Coordinate_Operation, Single-step geodetic transformations,1024,1099,1025,1038,
+9.32,Coordinate_Operation, Single-step geodetic transformations,1100,1099,1025,1864,
+9.34,Coordinate_Operation, Concatenated geodetic transformations,8000,8999,8046,8635,
+9.37,Coordinate_Operation, Vertical offset data,5400,5599,5400,5405,
+10.0,Coordinate_Operation Method,Coordinate Operation methods and required parameter names,,,,,
+10.1,Coordinate_Operation Method, transformation methods,9600,9699,9601,9636,
+10.2,Coordinate_Operation Method, reserved for operation methods,9700,9799,,,
+10.3,Coordinate_Operation Method, conversion (map projection) methods,9800,9899,9801,9828,
+11.0,Coordinate_Operation Parameter,Coordinate Operation parameter names and descriptions,8600,8899,,,
+11.1,Coordinate_Operation Parameter, Parameters used in transformations,8600,8699,8601,8667,
+11.2,Coordinate_Operation Parameter, reserved for operation parameters,8700,8799,,,
+11.3,Coordinate_Operation Parameter, Parameters used in conversions,8880,8899,8801,8831,
+12.0,Coordinate_Operation Parameter Usage,Links parameters with operation methods,,,,,No codes allocated - intersection table using dual key codes of related tables.
+13.0,Coordinate_Operation Parameter Value,Values of transformation and conversion parameters,,,,,No codes allocated - intersection table using triple key codes of related tables.
+14.0,Coordinate_Operation Path,Concatenated transformation steps,,,,,No codes allocated - intersection table using dual key codes of related tables.
+15.1,Datum,Geodetic Datum data,,,,,
+15.11,Datum, unspecified datum,6000,6099,6001,6047,Form GeogCRS 4000 to 4099.
+15.12,Datum, WGS systems,6322,6327,6322,6327,Form GeogCRS 4322 to 4327. Range full.
+15.13,Datum, NAD systems overflow,6320,6321,6320,6321,Form GeogCRS 4320 to 4321. Range full.
+15.14,Datum, non-WGS systems (1),6120,6139,6120,6139,Form GeogCRS 4120 to 4139. Range full.
+15.15,Datum, non-WGS systems (2),6140,6199,6140,6199,Form GeogCRS 4140 to 4199. Range full.
+15.16,Datum, non-WGS systems (3),6200,6319,6200,6319,Form GeogCRS 4200 to 4319. Range full.
+15.17,Datum, non-WGS systems (4),6600,6799,6600,6617,Form GeogCRS 4600 to 4799.
+15.18,Datum, non-Greenwich prime meridian equivalent,6800,6899,6801,6820,Form GeogCRS 4800 to 4899.
+15.19,Datum, no Greenwich prime meridian,6900,6999,6901,6904,Form GeogCRS 4900 to 4999.
+15.3,Datum,Vertical datum data,,,,,
+15.31,Datum, ellipsoidal datum,,,,,Deleted in v3.2
+15.32,Datum, geoidal datum,5000,5199,5100,5137,
+15.4,Datum,Engineering Datum data,9300,9599,9300,9313,
+16.0,Deprecation,Deprecated records reasons and replacement trail,1,,2,426,Autonumbered. Code range also used in other tables.
+17.0,Ellipsoid,Ellipsoid data,7000,7299,7001,7049,
+18.0,Naming System,Naming System names,7300,7399,7300,7311,
+19.0,Prime Meridian,Prime Meridian data,8900,8999,8901,8913,
+20.0,Unit of Measure,,,,,,
+20.1,Unit of Measure,Angle unit data,9100,9199,9101,9115,
+20.2,Unit of Measure,Length unit data,9000,9099,9001,9094,
+20.3,Unit of Measure,Scale unit data,9200,9299,9201,9211,
+21.0,Version History,,,,,,
diff --git a/src/tiff/csv/compd_cs.c b/src/tiff/csv/compd_cs.c
new file mode 100644
index 0000000..ff62cb7
--- /dev/null
+++ b/src/tiff/csv/compd_cs.c
@@ -0,0 +1,12 @@
+#include "defs.h"
+datafile_rows_t compd_cs_row_1[] = {"COMPOUNDCS_CODE","COMPOUNDCS_EPSG_NAME","COMPOUNDCS_EPSG_ABBR","COMPOUNDCS_USER_NAME","DESCRIPTION","AREA_OF_USE","HORIZCS_CODE","VERTCS_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t compd_cs_row_2[] = {"7400","NTF (Paris) + NGF IGN69","","","","France - mainland.","4807","5720","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t compd_cs_row_3[] = {"7401","NTF (Paris) / France II + NGF Lallemand","NTF / France II + Lalle","","","France - mainland.","27582","5719","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t compd_cs_row_4[] = {"7402","NTF (Paris) / France II + NGF IGN69","NTF / France II + IGN69","","","France - mainland.","27582","5720","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t compd_cs_row_5[] = {"7403","NTF (Paris) / France III + NGF IGN69","NTF / France III + IGN69","","","France south of 50.5 grads (45 deg 27 min) North.","27583","5720","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t compd_cs_row_6[] = {"7404","RT90 + RH70","","","","Sweden.","4124","5718","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","When combined with geoid model RN92 forms geographic 3D coordinate system RR92.","",NULL};
+datafile_rows_t compd_cs_row_7[] = {"7405","OSGB36 / British National Grid + ODN","GB National Grid + ODN","","","United Kingdom (UK) - Great Britain.","27700","5701","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t compd_cs_row_8[] = {"7406","NAD27 + NGVD29","","","","United States (USA).","4267","5702","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t compd_cs_row_9[] = {"7407","NAD27 / Texas North + NGVD29","NAD27 / TX_N + NGVD29","","","United States (USA) - Texas.","32037","5702","1997-11-13 00:00:00","","EPSG","","",NULL};
+
+datafile_rows_t *compd_cs_rows[] = {compd_cs_row_1,compd_cs_row_2,compd_cs_row_3,compd_cs_row_4,compd_cs_row_5,compd_cs_row_6,compd_cs_row_7,compd_cs_row_8,compd_cs_row_9,NULL};
diff --git a/src/tiff/csv/compd_cs.csv b/src/tiff/csv/compd_cs.csv
new file mode 100644
index 0000000..6cd788a
--- /dev/null
+++ b/src/tiff/csv/compd_cs.csv
@@ -0,0 +1,9 @@
+"COMPOUNDCS_CODE","COMPOUNDCS_EPSG_NAME","COMPOUNDCS_EPSG_ABBR","COMPOUNDCS_USER_NAME","DESCRIPTION","AREA_OF_USE","HORIZCS_CODE","VERTCS_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+7400,NTF (Paris) + NGF IGN69,,,,France - mainland.,4807,5720,1997-11-13 00:00:00,,EPSG,,
+7401,NTF (Paris) / France II + NGF Lallemand,NTF / France II + Lalle,,,France - mainland.,27582,5719,1997-11-13 00:00:00,,EPSG,,
+7402,NTF (Paris) / France II + NGF IGN69,NTF / France II + IGN69,,,France - mainland.,27582,5720,1997-11-13 00:00:00,,EPSG,,
+7403,NTF (Paris) / France III + NGF IGN69,NTF / France III + IGN69,,,France south of 50.5 grads (45 deg 27 min) North.,27583,5720,1997-11-13 00:00:00,,EPSG,,
+7404,RT90 + RH70,,,,Sweden.,4124,5718,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,When combined with geoid model RN92 forms geographic 3D coordinate system RR92.,
+7405,OSGB36 / British National Grid + ODN,GB National Grid + ODN,,,United Kingdom (UK) - Great Britain.,27700,5701,1997-11-13 00:00:00,,EPSG,,
+7406,NAD27 + NGVD29,,,,United States (USA).,4267,5702,1997-11-13 00:00:00,,EPSG,,
+7407,NAD27 / Texas North + NGVD29,NAD27 / TX_N + NGVD29,,,United States (USA) - Texas.,32037,5702,1997-11-13 00:00:00,,EPSG,,
diff --git a/src/tiff/csv/coordinate_axis.csv b/src/tiff/csv/coordinate_axis.csv
new file mode 100644
index 0000000..70f8d47
--- /dev/null
+++ b/src/tiff/csv/coordinate_axis.csv
@@ -0,0 +1,75 @@
+"COORD_SYS_CODE","COORD_AXIS_NAME_CODE","COORD_AXIS_ORIENTATION","COORD_AXIS_ABBREVIATION","UOM_CODE","ORDER"
+4400,9906,east,E,9001,1
+4400,9907,north,N,9001,2
+4401,9906,east,E,9062,1
+4401,9907,north,N,9062,2
+4402,9906,east,E,9042,1
+4402,9907,north,N,9042,2
+4403,9906,east,E,9005,1
+4403,9907,north,N,9005,2
+4404,9906,east,E,9094,1
+4404,9907,north,N,9094,2
+4405,9906,east,E,9041,1
+4405,9907,north,N,9041,2
+4406,9906,east,X,9036,1
+4406,9907,north,Y,9036,2
+4407,9906,east,E,9039,1
+4407,9907,north,N,9039,2
+4408,9906,east,E,9084,1
+4408,9907,north,N,9084,2
+4409,9906,east,E,9040,1
+4409,9907,north,N,9040,2
+4495,9906,east,X,9002,1
+4495,9907,north,Y,9002,2
+4496,9906,east,E(X),9001,1
+4496,9907,north,N(Y),9001,2
+4497,9906,east,X,9003,1
+4497,9907,north,Y,9003,2
+4498,9906,east,Y,9001,1
+4498,9907,north,X,9001,2
+4499,9906,east,X,9001,1
+4499,9907,north,Y,9001,2
+4500,9906,east,E,9001,2
+4500,9907,north,N,9001,1
+4501,9907,north,N,9001,1
+4501,9908,west,E,9001,2
+4530,9906,east,Y,9001,2
+4530,9907,north,X,9001,1
+4531,9906,east,y,9001,2
+4531,9907,north,x,9001,1
+4532,9906,east,X,9001,2
+4532,9907,north,Y,9001,1
+6401,9901,north,Lat,9108,1
+6401,9902,east,Long,9108,2
+6401,9903,up,h,9001,3
+6402,9901,north,Lat,9108,1
+6402,9902,east,Long,9108,2
+6403,9901,north,Lat,9105,1
+6403,9902,east,Long,9105,2
+6404,9926,north,lat,9102,1
+6404,9927,east,long,9102,2
+6404,9928,up,R,9001,3
+6497,9904,up,H,9003,1
+6498,9905,down,D,9001,1
+6499,9904,up,H,9001,1
+6500,9910,Geocentre > equator/PM,X,9001,1
+6500,9911,Geocentre > equator/90dE,Y,9001,2
+6500,9912,Geocentre > north pole,Z,9001,3
+6501,9908,west,Y,9001,2
+6501,9909,south,X,9001,1
+6502,9908,west,Y,9031,1
+6502,9909,south,X,9031,2
+6503,9908,west,Y,9001,1
+6503,9909,south,X,9001,2
+6504,9918,north-east,e,9001,2
+6504,9919,north-west,n,9001,1
+6505,9913,north-west,n,9001,1
+6505,9914,north-east,e,9001,2
+6506,9913,east-south-east,I,9205,1
+6506,9914,north-north-east,J,9204,2
+6507,9913,north,X,9001,1
+6507,9914,west,Y,9001,2
+6508,9920,east south east,I,9208,2
+6508,9921,north north east,J,9209,1
+6509,9908,west,M,9001,2
+6509,9909,south,P,9001,1
diff --git a/src/tiff/csv/coordinate_axis_name.csv b/src/tiff/csv/coordinate_axis_name.csv
new file mode 100644
index 0000000..9b98cdb
--- /dev/null
+++ b/src/tiff/csv/coordinate_axis_name.csv
@@ -0,0 +1,29 @@
+"COORD_AXIS_NAME_CODE","COORD_AXIS_NAME","DESCRIPTION","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+9901,Geodetic latitude,"Angle from the equatorial plane to the perpendicular to the ellipsoid through a given point, northwards usually treated as positive.",Used in geographic 2D and geographic 3D coordinate systems.,EPSG,EPSG,2000-03-07 00:00:00,,0
+9902,Geodetic longitude,"Angle from the prime meridian plane to the meridian plane passing through the given point, eastwards usually treated as positive.",Used in geographic 2D and geographic 3D coordinate systems.,EPSG,EPSG,2000-03-07 00:00:00,,0
+9903,Ellipsoidal height,Distance of a point from the ellipsoid measured along the perpendicular from the ellipsoid to this point. Positive if upwards or outside of the ellipsoid.,"Used only as part of a geographic 3D coordinate system, never on its own.",EPSG based on ISO 19111,EPSG,2000-03-07 00:00:00,,0
+9904,Gravity-related height,"Height influenced by the Earth's gravity field. In particular, orthometric height or normal height which are both approximations of the distance of a point above sea level. Positive upwards.",Used in a 1D vertical coordinate system.,"ISO 19111 ""Geographical Information - Spatial Referencing by Coordinates"".",EPSG,2000-03-07 00:00:00,,0
+9905,Gravity-related depth,"Depth influenced by the Earth's gravity field, positive downwards.","Similar to gravity-related height, but with the positive increments in the opposite direction.",EPSG,EPSG,2000-03-07 00:00:00,,0
+9906,Easting,East pointing axis used in 2D projected coordinate systems.,,EPSG,EPSG,2000-03-07 00:00:00,,0
+9907,Northing,North pointing axis used in 2D projected coordinate systems.,,EPSG,EPSG,2000-03-07 00:00:00,,0
+9908,Westing,West pointing axis used in 2D projected coordinate systems (e.g. south oriented transverse Mercator),,EPSG,EPSG,2000-03-07 00:00:00,,0
+9909,Southing,South pointing axis used in 2D projected coordinate systems (e.g. south oriented transverse Mercator),,EPSG,EPSG,2000-03-07 00:00:00,,0
+9910,Geocentric X,"First axis of a right-handed earth centered 3D cartesian coordinate system; lies in the zero-longitude plane, such that a vector pointing in the direction of the positive X will have a longitude of zero.",,EPSG,EPSG,2000-03-07 00:00:00,,0
+9911,Geocentric Y,"Second axis of a right-handed earth centered 3D cartesian coordinate system; perpendicular to the zero-longitude plane, pointing eastward",,EPSG,EPSG,2000-03-07 00:00:00,,0
+9912,Geocentric Z,"Third axis of a right-handed earth centered 3D coordinate system; perpendicular to both X and Y, such that it completes a right-handed coordinate system, the Z-axis is approximately parallel to the earth's rotation axis, positive towards the north pole.",,EPSG,EPSG,2000-03-07 00:00:00,,0
+9913,First local axis,First axis of any local coordinate system.,First and second local coordinate axes are assumed to be horizontal and may be supplemented by 'local height' or 'local depth' to form a local 3D coordinate system.,EPSG,EPSG,2000-03-07 00:00:00,,0
+9914,Second local axis,Second axis of any local coordinate system.,,EPSG,EPSG,2000-03-07 00:00:00,,0
+9915,Third local axis,Third axis of any local coordinate system.,"If the local coordinate system is 3-dimensional, then the first and second local coordinate axes shall be horizontal and the third axis vertical.",EPSG,EPSG,2000-06-22 00:00:00,,0
+9916,Local height,"Height influenced by the Earth's gravity field, positive upwards.",Differs from gravity-related height in having an origin offset from sea level.,EPSG,EPSG,2000-03-07 00:00:00,,0
+9917,Local depth,"Depth influenced by the Earth's gravity field, positive downwards.","Similar to local height, but with the positive increments in the opposite direction.",EPSG,EPSG,2000-03-07 00:00:00,,0
+9918,Plant East,An axis of a local engineering grid 2D or 3D coordinate system. Plant East is 90 degrees clockwise from the Plant North axis when viewed from above the plane containing the two axes.,Not necessarily orientated to geographical east.,EPSG,EPSG,2000-06-23 00:00:00,,0
+9919,Plant North,An axis of a local engineering grid 2D or 3D coordinate system. Plant North is 90 degrees counter-clockwise from the Plant East axis when viewed from above the plane containing the two axes.,Not necessarily orientated to geographical north.,EPSG,EPSG,2000-06-23 00:00:00,,0
+9920,Bin grid I,First axis of seismic bin grid; positive I is 90 degrees clockwise from positive J-axis when viewed from above the plane containing the two axes.,,EPSG,EPSG,2000-03-07 00:00:00,,0
+9921,Bin grid J,Second axis of seismic bin grid; positive J is 90 degrees counter-clockwise from positive I-axis when viewed from above the plane containing the two axes.,,EPSG,EPSG,2000-03-07 00:00:00,,0
+9922,Inline,First axis of a seismic bingrid.,"Inline is an ambiguous term, varying by usage.",EPSG,EPSG,2000-03-07 00:00:00,,0
+9923,Crossline,Second axis of a seismic bingrid.,"Crossline is an ambiguous term, varying by usage.",EPSG,EPSG,2000-03-07 00:00:00,,0
+9924,Platform East,An axis of an offshore platform engineering grid 2D or 3D coordinate system. Platform East is 90 degrees clockwise from the Platform North axis when viewed from above the plane containing the two axes.,Not necessarily orientated to geographical east.,EPSG,EPSG,2000-06-23 00:00:00,,0
+9925,Platform North,An axis of an offshore platform engineering grid 2D or 3D coordinate system. Platform North is 90 degrees counter-clockwise from the Platform East axis when viewed from above the plane containing the two axes.,Not necessarily orientated to geographical east.,EPSG,EPSG,2000-06-23 00:00:00,,0
+9926,Spherical latitude,"Angle from the equatorial plane to the geocentric point vector, northwards usually treated as positive.",,Open GIS Consortium,EPSG,2002-02-12 00:00:00,,0
+9927,Spherical longitude,"Angle from the prime meridian plane to the meridian plane passing through a point, eastwards usually treated as positive.",,Open GIS Consortium,EPSG,2002-02-12 00:00:00,,0
+9928,Geocentric radius,The distance from the (geocentric) coordinate system origin to a point. The third axis of a spherical coordinate system.,Used to avoid the singularity when the two angles in a 3D polar coordinate system lie in the same plane.,Open GIS Consortium,EPSG,2002-02-12 00:00:00,,0
diff --git a/src/tiff/csv/coordinate_operation.csv b/src/tiff/csv/coordinate_operation.csv
new file mode 100644
index 0000000..d8ca81b
--- /dev/null
+++ b/src/tiff/csv/coordinate_operation.csv
@@ -0,0 +1,2020 @@
+"COORD_OP_CODE","COORD_OP_NAME","COORD_OP_TYPE","SOURCE_CRS_CODE","TARGET_CRS_CODE","COORD_TFM_VERSION","COORD_OP_VARIANT","AREA_OF_USE_CODE","COORD_OP_SCOPE","COORD_OP_METHOD_CODE","UOM_CODE_SOURCE_OFFSETS","UOM_CODE_TARGET_OFFSETS","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","SHOW_OPERATION","DEPRECATED"
+1025,ED50 to ED87 (1),transformation,4230,4231,5Nat-NSea-90,1,2330,?,9630,9102,9102,Latitude differences from ED50 to ED87 in decimal degrees given by coefficients A0 through A14 where m=(latitude - 55) degrees and n=longitude in decimal degrees. Longitude differences given through coefficients B0 through B14.,Norwegian Mapping Authority publication 1990:1,EPSG,2002-06-22 00:00:00,99.74 2000.55 2002.40,1,0
+1026,Madrid 1870 (Madrid) to ED50 (1),transformation,4903,4230,IGB-Esp,1,2366,?,9617,,,It is preferable to use whichever of either Madrid 1870 (Madrid) to ED50 (2) (code 1002) or Madrid 1870 (Madrid) to ED50 (3) (code 1003) is applicable to the area.,Institut de Geomatica; Barcelona,EPSG,2000-03-07 00:00:00,99.82 99.74,1,0
+1027,Madrid 1870 (Madrid) to ED50 (2),transformation,4903,4230,IGB-Esp N,2,2367,?,9617,,,Use in preference to Madrid 1870 (Madrid) to ED50 (1) (code 1001).,Institut de Geomatica; Barcelona,EPSG,2000-03-07 00:00:00,99.82 99.74,1,0
+1028,Madrid 1870 (Madrid) to ED50 (3),transformation,4903,4230,IGB-Esp S,3,2368,?,9617,,,Use in preference to Madrid 1870 (Madrid) to ED50 (1) (code 1001).,Institut de Geomatica; Barcelona,EPSG,2000-03-07 00:00:00,99.82 99.74,1,0
+1029,Amersfoort / RD New to ED50 / UTM zone 31N (1),transformation,28992,23031,NCG-Nld,1,1172,?,9632,9001,9001,For reverse transformation see ED50 / UTM 31N to Amersfoort / RD New (1) (code 1030).,"Nederlandse Commissie voor Geodesie publication 30; ""Globale en Lokale Geodetische Systemen""; G. Strang van Hees.",EPSG,2000-03-07 00:00:00,,1,0
+1030,ED50 / UTM zone 31N to Amersfoort / RD New (1),transformation,23031,28992,NCG-Nld,1,1172,?,9632,9001,9001,For reverse transformation see Amersfoort / RD New to ED50 / UTM zone 31 (1) (code 1029).,"Nederlandse Commissie voor Geodesie publication 30; ""Globale en Lokale Geodetische Systemen""; G. Strang van Hees.",EPSG,2000-03-07 00:00:00,,1,0
+1031,Amersfoort / RD New to ED50 / UTM zone 31N (2),transformation,28992,23031,NAM-Nld,2,1172,Oil exploration.,9632,9001,9001,Used by NAM. For reverse transformation see ED50 / UTM zone 31N to Amersfoort / RD New (2) (code 1032).,Shell / NAM,EPSG,2000-03-07 00:00:00,,1,0
+1032,ED50 / UTM zone 31N to Amersfoort / RD New (2),transformation,23031,28992,NAM-Nld,2,1172,Oil exploration.,9632,9001,9001,Used by NAM. For reverse transformation see Amersfoort / RD New to ED50 / UTM zone 31 (2) (code 1031).,Shell / NAM,EPSG,2000-03-07 00:00:00,,1,0
+1033,Belge 72 / Lambert to ED50 / UTM zone 31N (1),transformation,31300,23031,NCG-Bel,1,1044,?,9631,9001,9001,For reverse transformation see ED50 / UTM 31N to Belge 72 / Lambert (code 1034).,"Nederlandse Commissie voor Geodesie publication 30; ""Globale en Lokale Geodetische Systemen""; G. Strang van Hees.",EPSG,2000-03-07 00:00:00,,1,0
+1034,ED50 / UTM zone 31N to Belge 72 / Lambert (1),transformation,23031,31300,NCG-Bel,1,1044,?,9631,9001,9001,For reverse transformation see Belge 72 / Lambert to ED50 / UTM 31N (code 1033).,"Nederlandse Commissie voor Geodesie publication 30; ""Globale en Lokale Geodetische Systemen""; G. Strang van Hees.",EPSG,2000-03-07 00:00:00,,1,0
+1035,Astra Minas to Campo Inchauspe / Argentina 2,transformation,5800,22192,IHS-Arg ComRiv,1,1265,Oil exploration.,9621,,,,IHS Energy,EPSG,2000-06-23 00:00:00,,1,0
+1036,OSGB 1936 / British National Grid to ETRS89 (1),transformation,27700,4258,OSGB-Gbr,1,1264,Accuracy 0.2m at 67% confidence level.,9633,,,May be taken as approximate transformation OSGB 1936 / British National Grid to WGS 84 - see code 1681.,http://www.gps.gov.uk/gpssurveying.asp,EPSG,2000-10-19 00:00:00,,1,0
+1037,Amersfoort / RD New to ED50 / TM 5 NE (1),transformation,28992,23095,NAM-Nld,1,1630,Oil exploration.,9632,9001,9001,Used by NAM. For reverse transformation see ED50 / TM 5 NE to Amersfoort / RD New (1) (code 1038).,Shell / NAM,EPSG,2002-07-13 00:00:00,,1,0
+1038,ED50 / TM 5 NE to Amersfoort / RD New (1),transformation,23095,28992,NAM-Nld,2,1630,Oil exploration.,9632,9001,9001,Used by NAM. For reverse transformation see Amersfoort / RD New to ED50 / TM 5 NE (1) (code 1037).,Shell / NAM,EPSG,2002-07-13 00:00:00,,1,0
+1100,Adindan to WGS 84 (1),transformation,4201,4326,DMA-Eth Sud,1,1271,For military purposes only. Accuracy 5m in each axis.,9603,,,Derived at 22 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1101,Adindan to WGS 84 (2),transformation,4201,4326,DMA-Bfa,2,1057,For military purposes. Accuracy 25m in each axis.,9603,,,"Derived at 1 station connected to the Adindan network through the 1968-69 12th parallel traverse. Note: Adindan datum is used in Ethiopia and Sudan, not Burkino Faso.",U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,2002-06-22 00:00:00,2002.38,1,0
+1102,Adindan to WGS 84 (3),transformation,4201,4326,DMA-Cmr,3,1060,For military purposes. Accuracy 25m in each axis.,9603,,,"Derived at 1 station connected to the Adindan network through the 1968-69 12th parallel traverse. Note: Adindan datum is used in Ethiopia and Sudan, not Cameroon.",U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,2002-06-22 00:00:00,2002.38,1,0
+1103,Adindan to WGS 84 (4),transformation,4201,4326,DMA-Eth,4,1091,For military purposes. Accuracy 3m in each axis.,9603,,,Derived at 8 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1104,Adindan to WGS 84 (5),transformation,4201,4326,DMA-Mli,5,1153,For military purposes. Accuracy 25m in each axis.,9603,,,"Derived at 1 station connected to the Adindan network through the 1968-69 12th parallel traverse. Note: Adindan datum is used in Ethiopia and Sudan, not Mali.",U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,2002-06-22 00:00:00,2002.38,1,0
+1105,Adindan to WGS 84 (6),transformation,4201,4326,DMA-Sen,6,1207,For military purposes. Accuracy 25m in each axis.,9603,,,"Derived at 2 stations connected to the Adindan network through the 1968-69 12th parallel traverse. Note: Adindan datum is used in Ethiopia and Sudan, not Senegal.",U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,2002-06-22 00:00:00,2002.38,1,0
+1106,Adindan to WGS 84 (7),transformation,4201,4326,DMA-Sud,7,1221,"For military purposes. Accuracy 3m, 5m and 3m in X, Y and Z axes.",9603,,,Derived at 14 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1107,Afgooye to WGS 84 (1),transformation,4205,4326,DMA-Som,1,1214,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1108,AGD66 to WGS 84 (1),transformation,4202,4326,DMA-Aus,1,1036,For military purposes only. Accuracy 3m in each axis.,9603,,,Derived at 105 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1109,AGD84 to WGS 84 (1),transformation,4203,4326,DMA-Aus,1,1036,For military purposes only. Accuracy 2m in each axis.,9603,,,Derived at 90 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1110,Ain el Abd to WGS 84 (1),transformation,4204,4326,DMA-Bhr,1,1040,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,97.06,1,0
+1111,Ain el Abd to WGS 84 (2),transformation,4204,4326,DMA-Sau,2,1206,For military purposes. Accuracy 10m in each axis.,9603,,,Derived at 9 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1112,Amersfoort to WGS 84 (1),transformation,4289,4326,NCG-Nld 93,1,1172,?,9606,,,Superseded by Amersfoort to ETRS89 (2) (code 1751) and Amersfoort to WGS 84 (2) (code 1672).,Nederlandse Commissie voor Geodesie publication 30; 1993.,EPSG,1997-04-11 00:00:00,97.07,1,0
+1113,Arc 1950 to WGS 84 (1),transformation,4209,4326,DMA-mean,1,2312,"For military purposes only. Accuracy 20m, 33m and 20m in X, Y and Z axes.",9603,,,Derived at 41 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1114,Arc 1950 to WGS 84 (2),transformation,4209,4326,DMA-Bwa,2,1051,"For military purposes. Accuracy 3m, 5m and 3m in X, Y and Z axes.",9603,,,Derived at 9 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1115,Arc 1950 to WGS 84 (3),transformation,4209,4326,DMA-Bdi,3,1058,For military purposes. Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1116,Arc 1950 to WGS 84 (4),transformation,4209,4326,DMA-Lso,4,1141,"For military purposes. Accuracy 3m, 3m and 8m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1117,Arc 1950 to WGS 84 (5),transformation,4209,4326,DMA-Mwi,5,1150,"For military purposes. Accuracy 9m, 24m and 8m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1118,Arc 1950 to WGS 84 (6),transformation,4209,4326,DMA-Swz,6,1224,For military purposes. Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1119,Arc 1950 to WGS 84 (7),transformation,4209,4326,DMA-Cod,7,1259,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1120,Arc 1950 to WGS 84 (8),transformation,4209,4326,DMA-Zmb,8,1260,"For military purposes. Accuracy 21m, 21m and 27m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1121,Arc 1950 to WGS 84 (9),transformation,4209,4326,DMA-Zwe,9,1261,"For military purposes. Accuracy 5m, 8m and 11m in X, Y and Z axes.",9603,,,Derived at 10 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1122,Arc 1960 to WGS 84 (1),transformation,4210,4326,DMA-Ken Tza,1,2311,For military purposes only. Accuracy 20m in each axis.,9603,,,Derived at 25 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1123,Batavia to WGS 84 (1),transformation,4211,4326,DMA-Idn Sumatra,1,1355,For military purposes. Accuracy 3m in each axis.,9603,,,Note: The area of use cited for this transformation (Sumatra) is not consistent with the area of use (Java) for the Batavia (Genuk) coordinate system. Derived at 5 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1124,Bermuda 1957 to WGS 84 (1),transformation,4216,4326,DMA-Bmu,1,1047,For military purposes. Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1125,Bogota 1975 to WGS 84 (1),transformation,4218,4326,DMA-Col,1,1070,"For military purposes. Accuracy 6m, 5m and 6m in X, Y and Z axes.",9603,,,Derived in 1987 at 7 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1126,Bukit Rimpah to WGS 84 (1),transformation,4219,4326,DMA-Idn BBI,1,1287,For military purposes.,9603,,,Accuracy estimates unavailable.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,2002-06-22 00:00:00,2002.151,1,0
+1127,Campo Inchauspe to WGS 84 (1),transformation,4221,4326,DMA-Arg,1,1033,For military purposes. Accuracy 5m in each axis.,9603,,,Derived at 20 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1128,Cape to WGS 84 (1),transformation,4222,4326,DMA-Zaf,1,1215,"For military purposes. Accuracy 3m, 6m and 6m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1129,Cape to WGS 84 (2),transformation,4222,4326,DSLI-Zaf,2,1215,?,9603,,,Parameter values are from Cape to Hartebeesthoek94 (1) (code 1504) assuming that Hartebeesthoek94 and WGS 84 are equivalent within the accuracy of the transformation.,"Private Communication, Directorate of Surveys and Land Information, Cape Town.",EPSG,1996-10-18 00:00:00,,1,0
+1130,Carthage to WGS 84 (1),transformation,4223,4326,DMA-Tun,1,1236,"For military purposes. Accuracy 6m, 9m and 8m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1131,Chua to WGS 84 (1),transformation,4224,4326,DMA-Pry,1,1188,"For military purposes. Accuracy 6m, 9m and 5m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1132,Corrego Alegre to WGS 84 (1),transformation,4225,4326,DMA-Bra,1,1053,"For military purposes. Accuracy 5m, 3m and 5m in X, Y and Z axes.",9603,,,Derived at 17 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1133,ED50 to WGS 84 (1),transformation,4230,4326,DMA-mean,1,2420,"For military purposes only. Accuracy 3m, 8m and 5m in X, Y and Z axes.",9603,,,Derived at 85 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,97.02,1,0
+1134,ED50 to WGS 84 (2),transformation,4230,4326,DMA-cenEur,2,2421,For military purposes only. Accuracy 3m each axis.,9603,,,Derived at 52 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1135,ED50 to WGS 84 (3),transformation,4230,4326,DMA-midEast,3,2345,For military purposes only.,9603,,,Accuracy estimate not available.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1136,ED50 to WGS 84 (4),transformation,4230,4326,DMA-Cyp,4,1078,For military purposes only. Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1137,ED50 to WGS 84 (5),transformation,4230,4326,DMA-Egy,5,1086,"For military purposes. Accuracy 6m, 8m and 8m in X, Y and Z axes.",9603,,,Derived at 14 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1138,ED50 to WGS 84 (6),transformation,4230,4326,DMA-Irl Gbr,6,2343,For military purposes only. Accuracy 3m in each axis.,9603,,,Derived at 40 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1139,ED50 to WGS 84 (7),transformation,4230,4326,DMA-Fin Nor,7,2344,"For military purposes. Accuracy 3m, 5m and 3m in X, Y and Z axes.",9603,,,Derived at 20 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1140,ED50 to WGS 84 (8),transformation,4230,4326,DMA-Grc,8,1106,For military purposes only. Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1141,ED50(ED77) to WGS 84 (2),transformation,4154,4326,DMA-Irn,2,1123,"For military purposes. Accuracy 9m, 12m and 11m in X, Y and Z axes.",9603,,,Given by DMA as from ED50. EPSG interpret that as ED50(ED77) in Iran. Derived at 27 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,2000-03-07 00:00:00,2000.06,1,0
+1142,ED50 to WGS 84 (10),transformation,4230,4326,DMA-Ita Sard,10,2339,For military purposes only. Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1143,ED50 to WGS 84 (11),transformation,4230,4326,DMA-Ita Sic,11,2340,For military purposes only. Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1144,ED50 to WGS 84 (12),transformation,4230,4326,DMA-Mlt,12,1154,For military purposes only. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1145,ED50 to WGS 84 (13),transformation,4230,4326,DMA-Prt Esp,13,2338,"For military purposes only. Accuracy 5m, 6m and 3m in X, Y and Z axes.",9603,,,Derived at 18 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1146,ED87 to WGS 84 (1),transformation,4231,4326,5Nat-NSea-90,1,2330,?,9606,,,,"Norwegian Mapping Authority publication 1990:1 and note of 13-Feb-1991 ""Om Transformasjon mellom Geodetiske Datum i Norge""",EPSG,1997-04-11 00:00:00,97.03 97.04,1,0
+1147,ED50 to ED87 (2),transformation,4230,4231,NMA-Nor N65,2,2331,Geodetic purposes.,9606,,,,"Norwegian Mapping Authority note of 13-Feb-1991 ""Om Transformasjon mellom Geodetiske Datum i Norge""",EPSG,1997-04-11 00:00:00,97.04,1,0
+1148,Egypt 1907 to WGS 84 (1),transformation,4229,4326,DMA-Egy,1,1086,"For military purposes. Accuracy 3m, 6m and 8m in X, Y and Z axes.",9603,,,Derived at 14 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1149,ETRS89 to WGS 84 (1),transformation,4258,4326,EPSG-eur,1,2420,ETRS89 is a realisation of WGS 84 coincident to within 1.5 metres. This transformation has an accuracy equal to the coincidence figure.,9603,,,,EPSG,EPSG,2000-10-19 00:00:00,97.24 2000.72,1,0
+1150,GDA94 to WGS 84 (1),transformation,4283,4326,EPSG-Aus,1,1036,GDA94 is a realisation of WGS 84 coincident to within 1.5 metres. This transformation has an accuracy equal to the coincidence figure.,9603,,,,EPSG,EPSG,1996-10-18 00:00:00,,1,0
+1151,NZGD49 to WGS 84 (1),transformation,4272,4326,DMA-Nzl,1,1175,"For military purposes only. Accuracy 5m, 3m and 5m in X, Y and Z axes.",9603,,,Derived at 14 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1152,Hu Tzu Shan to WGS 84 (1),transformation,4236,4326,DMA-Twn,1,1228,For military purposes. Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1153,Indian 1954 to WGS 84 (1),transformation,4239,4326,DMA-Tha,1,1231,"For military purposes. Accuracy 15m, 6m and 12m in X, Y and Z axes.",9603,,,Derived at 11 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,97.06,1,0
+1154,Indian 1975 to WGS 84 (1),transformation,4240,4326,DMA-Tha,1,1231,"For military purposes. Accuracy 3m, 2m and 3m in X, Y and Z axes.",9603,,,Derived at 62 stations.,U.S. Defense Mapping Agency TR8350.2 second edition September 1991,EPSG,1996-10-18 00:00:00,,1,0
+1155,Kalianpur 1937 to WGS 84 (1),transformation,4144,4326,DMA-Bgd,1,1041,"For military purposes. Accuracy 10m, 8m and 12m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1999-10-20 00:00:00,97.235,1,0
+1156,Kalianpur 1975 to WGS 84 (1),transformation,4146,4326,DMA-Ind Npl,1,2411,"For military purposes. Accuracy 12m, 10m and 15m in X, Y and Z axes.",9603,,,Care! DMA ellipsoid is inconsistent with EPSG ellipsoid - transformation parameter values may not be appropriate. Derived at 7 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1999-10-20 00:00:00,97.235,1,0
+1157,Kandawala to WGS 84 (1),transformation,4244,4326,DMA-Lka,1,1218,For military purposes. Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1158,Kertau to WGS 84 (1),transformation,4245,4326,DMA-Mys Sgp,1,1309,"For military purposes. Accuracy 10m, 8m and 6m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1159,Leigon to WGS 84 (1),transformation,4250,4326,DMA-Gha,1,1104,"For military purposes. Accuracy 2m, 3m and 2m in X, Y and Z axes.",9603,,,Derived at 8 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1160,Liberia 1964 to WGS 84 (1),transformation,4251,4326,DMA-Lbr,1,1142,For military purposes only. Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1161,Luzon 1911 to WGS 84 (1),transformation,4253,4326,DMA-Phl N,1,2364,"For military purposes. Accuracy 8m, 11m and 9m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1162,Luzon 1911 to WGS 84 (2),transformation,4253,4326,DMA-Phl Min,2,2365,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1163,M'poraloko to WGS 84 (1),transformation,4266,4326,DMA-Gab,1,1100,For military purposes only. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1164,Mahe 1971 to WGS 84 (1),transformation,4256,4326,DMA-Syc,1,2369,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1165,Massawa to WGS 84 (1),transformation,4262,4326,DMA-Eth,1,1089,For military purposes only. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1166,Merchich to WGS 84 (1),transformation,4261,4326,DMA-Mar,1,1166,"For military purposes. Accuracy 5m, 3m and 3m in X, Y and Z axes.",9603,,,Derived at 9 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1167,Minna to WGS 84 (1),transformation,4263,4326,DMA-Cmr,1,1060,For military purposes only. Accuracy 25m in each axis.,9603,,,"Derived at 2 stations. Note: Minna is used in Nigeria, not Cameroon.",U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1168,Minna to WGS 84 (2),transformation,4263,4326,DMA-Nga,2,1178,"For military purposes. Accuracy 3m, 6m and 5m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1169,Monte Mario to WGS 84 (1),transformation,4265,4326,DMA-Ita Sar,1,2339,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1170,NAD27 to WGS 84 (1),transformation,4267,4326,DMA-Carib,1,2418,"For military purposes. Accuracy 3m, 9m and 12m in X, Y and Z axes.",9603,,,Derived at 15 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1171,NAD27 to WGS 84 (2),transformation,4267,4326,DMA-Cen Am,2,2419,"For military purposes only. Accuracy 8m, 3m and 5m in X, Y and Z axes.",9603,,,Derived at 19 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1172,NAD27 to WGS 84 (3),transformation,4267,4326,DMA-Can,3,1061,"For military purposes only. Accuracy 15m, 11m and 6m in X, Y and Z axes.",9603,,,Derived at 112 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1173,NAD27 to WGS 84 (4),transformation,4267,4326,DMA-Conus,4,1323,"For military purposes only. Accuracy 5m, 5m and 6m in X, Y and Z axes.",9603,,,Derived at 405 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1174,NAD27 to WGS 84 (5),transformation,4267,4326,DMA-ConusE,5,2389,"For military purposes only. Accuracy 5m, 5m and 8m in X, Y and Z axes.",9603,,,Derived at 129 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1175,NAD27 to WGS 84 (6),transformation,4267,4326,DMA-ConusW,6,2390,"For military purposes only. Accuracy 5m, 3m and 3m in X, Y and Z axes.",9603,,,Derived at 276 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1176,NAD27 to WGS 84 (7),transformation,4267,4326,DMA-USA AK,7,2412,"For military purposes only. Accuracy 5m, 9m and 5m in X, Y and Z axes.",9603,,,Derived at 47 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1177,NAD27 to WGS 84 (8),transformation,4267,4326,DMA-Bha xSalv,8,2413,"For military purposes. Accuracy 5m, 3m and 5m in X, Y and Z axes.",9603,,,Derived at 11 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1178,NAD27 to WGS 84 (9),transformation,4267,4326,DMA-Bha Salv,9,2414,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1179,NAD27 to WGS 84 (10),transformation,4267,4326,DMA-Can AB BC,10,2384,"For military purposes only. Accuracy 8m, 8m and 6m in X, Y and Z axes.",9603,,,Derived at 25 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1180,NAD27 to WGS 84 (11),transformation,4267,4326,DMA-Can MN ON,11,2415,"For military purposes only. Accuracy 9m, 5m and 5m in X, Y and Z axes.",9603,,,Derived at 25 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1181,NAD27 to WGS 84 (12),transformation,4267,4326,DMA-Can E,12,2416,"For military purposes only. Accuracy 6m, 6m and 3m in X, Y and Z axes.",9603,,,Derived at 37 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1182,NAD27 to WGS 84 (13),transformation,4267,4326,DMA-Can NWT,13,2410,"For military purposes only. Accuracy 5m, 5m and 3m in X, Y and Z axes.",9603,,,Derived at 17 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1183,NAD27 to WGS 84 (14),transformation,4267,4326,DMA-Can Yuk,14,2417,"For military purposes only. Accuracy 5m, 8m and 3m in X, Y and Z axes.",9603,,,Derived at 8 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1184,NAD27 to WGS 84 (15),transformation,4267,4326,DMA-Pan,15,2385,For military purposes. Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1185,NAD27 to WGS 84 (16),transformation,4267,4326,DMA-Cuba,16,1077,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1186,NAD27 to WGS 84 (17),transformation,4267,4326,DMA-Grl,17,2386,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1187,NAD27 to WGS 84 (18),transformation,4267,4326,DMA-Mex,18,1160,"For military purposes only. Accuracy 8m, 6m and 6m in X, Y and Z axes.",9603,,,Derived at 22 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1188,NAD83 to WGS 84 (1),transformation,4269,4326,DMA-N Am,1,1325,Accuracy 2m in each axis.,9603,,,Derived at 312 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,97.06,1,0
+1189,Nahrwan 1967 to WGS 84 (1),transformation,4270,4326,DMA-Omn Mas,1,2391,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1190,Nahrwan 1967 to WGS 84 (2),transformation,4270,4326,DMA-Sau,2,1206,For military purposes. Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1191,Nahrwan 1967 to WGS 84 (3),transformation,4270,4326,DMA-UAE,3,1243,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1192,Naparima 1972 to WGS 84 (1),transformation,4271,4326,DMA-Tto,1,1235,For military purposes only.,9603,,,CAUTION: EPSG believes that these parameter values include a blunder and that if NIMA transformation parameters are to be used the 1987 version (EPSG code 1307) be used.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1998-06-30 00:00:00,98.102,1,0
+1193,NTF to WGS 84 (1),transformation,4275,4326,IGN-Fra,1,1096,For applications to an accuracy of 2 metres.,9603,,,,IGN technical report RT/G 14; January 1988.,EPSG,1996-10-18 00:00:00,,1,0
+1195,OSGB 1936 to WGS 84 (1),transformation,4277,4326,DMA-Gbr,1,1264,"For military purposes only. Accuracy 10m, 10m and 15m in X, Y and Z axes.",9603,,,Derived at 38 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1196,OSGB 1936 to WGS 84 (2),transformation,4277,4326,DMA-Gbr Eng,2,2395,"For military purposes only. Accuracy 5m, 5m and 6m in X, Y and Z axes.",9603,,,Derived at 24 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1197,OSGB 1936 to WGS 84 (3),transformation,4277,4326,DMA-Gbr E&W,3,2396,"For military purposes only. Accuracy 10m, 10m and 15m in X, Y and Z axes.",9603,,,Derived at 25 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1198,OSGB 1936 to WGS 84 (4),transformation,4277,4326,DMA-Gbr Sco,4,2397,For military purposes only. Accuracy 10m in each axis.,9603,,,Derived at 13 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1199,OSGB 1936 to WGS 84 (5),transformation,4277,4326,DMA-Gbr Wal,5,2398,For military purposes only. Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1200,Pointe Noire to WGS 84 (1),transformation,4282,4326,DMA-Cog,1,1072,For military purposes only. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1201,PSAD56 to WGS 84 (1),transformation,4248,4326,DMA-mean,1,2399,"For military purposes only. Accuracy 17m, 27m and 27m in X, Y and Z axes.",9603,,,Derived at 63 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1202,PSAD56 to WGS 84 (2),transformation,4248,4326,DMA-Bol,2,1049,"For military purposes only. Accuracy 5m, 11m and 14m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1203,PSAD56 to WGS 84 (3),transformation,4248,4326,DMA-Chl N,3,2402,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1204,PSAD56 to WGS 84 (4),transformation,4248,4326,DMA-Chl S,4,2403,For military purposes. Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1205,PSAD56 to WGS 84 (5),transformation,4248,4326,DMA-Col,5,1070,For military purposes. Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1206,PSAD56 to WGS 84 (6),transformation,4248,4326,DMA-Ecu,6,1085,"For military purposes. Accuracy 3m, 5m and 3m in X, Y and Z axes.",9603,,,Derived at 11 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1207,PSAD56 to WGS 84 (7),transformation,4248,4326,DMA-Guy,7,1114,"For military purposes. Accuracy 6m, 14m and 5m in X, Y and Z axes.",9603,,,Derived at 9 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1208,PSAD56 to WGS 84 (8),transformation,4248,4326,DMA-Per,8,1189,"For military purposes only. Accuracy 6m, 8m and 12m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1209,PSAD56 to WGS 84 (9),transformation,4248,4326,DMA-Ven,9,1251,"For military purposes only. Accuracy 9m, 14m and 15m in X, Y and Z axes.",9603,,,Derived at 24 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1211,Qornoq to WGS 84 (1),transformation,4287,4326,DMA-Grl S,1,2407,"For military purposes. Accuracy 25m, 25m and 32m in X, Y and Z axes.",9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,1
+1212,SAD69 to WGS 84 (1),transformation,4291,4326,DMA-mean,1,1341,"For military purposes only. Accuracy 15m, 6m and 9m in X, Y and Z axes.",9603,,,Derived at 84 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1213,SAD69 to WGS 84 (2),transformation,4291,4326,DMA-Arg,2,1033,For military purposes only. Accuracy 5m in each axis.,9603,,,Derived at 10 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1214,SAD69 to WGS 84 (3),transformation,4291,4326,DMA-Bol,3,1049,For military purposes. Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1215,SAD69 to WGS 84 (4),transformation,4291,4326,DMA-Bra,4,1053,"For military purposes only. Accuracy 3m, 5m and 5m in X, Y and Z axes.",9603,,,Derived at 22 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1216,SAD69 to WGS 84 (5),transformation,4291,4326,DMA-Chile,5,1066,"For military purposes only. Accuracy 15m, 8m and 11m in X, Y and Z axes.",9603,,,Derived at 9 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1217,SAD69 to WGS 84 (6),transformation,4291,4326,DMA-Col,6,1070,"For military purposes only. Accuracy 6m, 6m and 5m in X, Y and Z axes.",9603,,,Derived at 7 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1218,SAD69 to WGS 84 (7),transformation,4291,4326,DMA-Ecu,7,1085,For military purposes. Accuracy 3m in each axis.,9603,,,Derived at 11 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1219,SAD69 to WGS 84 (8),transformation,4291,4326,DMA-Ecu Gal,8,2356,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1220,SAD69 to WGS 84 (9),transformation,4291,4326,DMA-Guy,9,1114,"For military purposes only. Accuracy 9m, 5m and 5m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1221,SAD69 to WGS 84 (10),transformation,4291,4326,DMA-Pgy,10,1188,For military purposes. Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1222,SAD69 to WGS 84 (11),transformation,4291,4326,DMA-Peru,11,1189,For military purposes. Accuracy 5m in each axis.,9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1223,SAD69 to WGS 84 (12),transformation,4291,4326,DMA-Tto,12,1235,For military purposes only. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1224,SAD69 to WGS 84 (13),transformation,4291,4326,DMA-Ven,13,1251,"For military purposes only. Accuracy 3m, 6m and 3m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1225,Sapper Hill 1943 to WGS 84 (1),transformation,4292,4326,DMA-Flk E,1,2355,For military purposes. Accuracy 1m in each axis.,9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1226,Schwarzeck to WGS 84 (1),transformation,4293,4326,DMA-Nam,1,1169,For military purposes only. Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1227,Tananarive to WGS 84 (1),transformation,4297,4326,DMA-Mdg,1,1149,For military purposes.,9603,,,Accuracy estimate not available.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1228,Timbalai 1948 to WGS 84 (1),transformation,4298,4326,DMA-Borneo,1,1362,"For military purposes. Accuracy 10m, 10m and 12m in X, Y and Z axes.",9603,,,Derived at 8 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1229,TM65 to WGS 84 (1),transformation,4299,4326,DMA-Ire,1,1305,For military purposes only. Accuracy 3m in each axis.,9603,,,Derived at 7 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1230,Tokyo to WGS 84 (1),transformation,4301,4326,DMA-Jpn Kor,1,2409,"For military purposes only. Accuracy 20m, 5m and 20m in X, Y and Z axes.",9603,,,Derived at 31 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,97.06,1,0
+1231,Tokyo to WGS 84 (2),transformation,4301,4326,DMA-Jpn,2,1129,"For military purposes only. Accuracy 8m, 5m and 8m in X, Y and Z axes.",9603,,,Derived at 16 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1232,Tokyo to WGS 84 (3),transformation,4301,4326,DMA-Kor,3,1135,For military purposes only. Accuracy 2m in each axis.,9603,,,Derived at 29 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,97.06,1,0
+1233,Tokyo to WGS 84 (4),transformation,4301,4326,DMA-Jpn Ok,4,2408,"For military purposes only. Accuracy 20m, 5m and 20m in X, Y and Z axes.",9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1234,Yacare to WGS 84 (1),transformation,4309,4326,DMA-Ury,1,1247,For military purposes.,9603,,,Accuracy estimate not available.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1235,Zanderij to WGS 84 (1),transformation,4311,4326,DMA-Sur,1,1222,"For military purposes. Accuracy 5m, 5m and 8m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1236,AGD84 to WGS 84 (2),transformation,4203,4326,Auslig-Aus old,2,1036,Preliminary estimate - now superseded.,9607,,,"""Higgins parameters"". Superseded by AGD84 to GDA94 (2) (code 1280) and AGD84 to WGS 84 (7) (code 1669).",Australian Surveying and Land Information Group - www.auslig.gov.au/geodesy,EPSG,1997-11-13 00:00:00,,1,0
+1237,WGS 72 to WGS 84 (1),transformation,4322,4326,DMA1,1,1262,For scientific purposes.,9606,,,,,EPSG,1996-12-12 00:00:00,,1,0
+1238,WGS 72 to WGS 84 (2),transformation,4322,4326,DMA2,2,1262,For scientific purposes.,9606,,,,,EPSG,1996-12-12 00:00:00,,1,0
+1239,WGS 72BE to WGS 72 (1),transformation,4324,4322,DMA,1,1262,Geodesy.,9606,,,,,EPSG,1996-12-12 00:00:00,,1,0
+1240,WGS 72BE to WGS 84 (1),transformation,4324,4326,DMA,1,2346,Geodesy.,9606,,,,,EPSG,1996-12-12 00:00:00,,1,0
+1241,NAD27 to NAD83 (1),transformation,4267,4269,NGS-Usa Conus,1,2374,"Accuracy at 67% confidence level is 0.15m onshore, 5m nearshore and undetermined farther offshore.",9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,98.201 98.53 2000.14,1,0
+1243,NAD27 to NAD83 (2),transformation,4267,4269,NGS-Usa AK,2,2373,"Accuracy at 67% confidence level is 0.5m onshore, 5m nearshore and undetermined farther offshore.",9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,98.201 98.53 2000.14,1,0
+1245,ED50 to WGS 84 (16),transformation,4230,4326,DMA-Tun,16,1236,For military purposes only. Accuracy 25m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1998-04-16 00:00:00,98.11,1,0
+1246,Herat North to WGS 84 (1),transformation,4255,4326,DMA-Afg,1,1024,For military purposes only.,9603,,,No accuracy estimate available.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1247,Kalianpur 1962 to WGS 84 (1),transformation,4145,4326,DMA-Pak,1,1184,For military purposes.,9603,,,Care! DMA ellipsoid is inconsistent with EPSG ellipsoid - transformation parameter values may not be appropriate. No accuracy estimate available.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1999-10-20 00:00:00,97.235,1,0
+1248,ID74 to WGS 84 (1),transformation,4238,4326,DMA-Idn,1,1122,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,2002-06-22 00:00:00,2002.151,1,0
+1249,NAD27 to WGS 84 (21),transformation,4267,4326,DMA-AK AluE,21,2387,"For military purposes only. Accuracy 6m, 8m and 10m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1250,NAD27 to WGS 84 (22),transformation,4267,4326,DMA-AK AluW,22,2388,For military purposes. Accuracy 10m in each axis.,9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1251,NAD83 to WGS 84 (2),transformation,4269,4326,DMA-AK Alu,2,2157,"For military purposes only. Accuracy 5m, 2m and 5m in X, Y and Z axes.",9603,,,Derived at 42 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1252,NAD83 to WGS 84 (3),transformation,4269,4326,DMA-USA Hi,3,1334,For military purposes only. Accuracy 2m in each axis.,9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1253,Nord Sahara 1959 to WGS 84 (1),transformation,4307,4326,DMA-Alg,1,1026,For military purposes only. Accuracy 25m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1254,Pulkovo 1942 to WGS 84 (1),transformation,4284,4326,DMA-Rus,1,1198,For military purposes.,9603,,,Accuracy estimate not available.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1255,Nord Sahara 1959 to WGS 84 (2),transformation,4307,4326,DMA-Dza N,2,1365,For military purposes only. Accuracy 25m in each axis.,9603,,,CAUTION: Source CRS described by DMA as from Voirol 1960. EPSG believes that the data used in the derivation of these parameters contains a blunder. We recommend using transformation North Sahara 1959 to WGS84 (1) (code 1253). Derived at 2 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,2000-06-23 00:00:00,98.15 2000.47,1,0
+1256,Fahud to WGS 84 (1),transformation,4232,4326,DMA-Omn,1,1183,"For military purposes. Accuracy 3m, 3m and 9m in X, Y and Z axes.",9603,,,"Derived at 7 stations. Source CRS in information source is called ""Oman"".",U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1258,Bogota 1975 (Bogota) to Bogota 1975 (Greenwich),transformation,4802,4218,IGAC-Col,1,1070,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,1
+1259,Lisbon (Lisbon) to Lisbon (Greenwich),transformation,4803,4207,IGC-Prt,1,1294,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,1
+1260,Makassar (Jakarta) to Makassar,transformation,4804,4257,EPSG-Idn Sulawesi,1,1316,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,0
+1261,MGI (Ferro) to MGI (Greenwich),transformation,4805,4312,BEV-Aut balk,1,1166,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,1
+1262,Monte Mario (Rome) to Monte Mario,transformation,4806,4265,EPSG-Ita,1,1127,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,98.37 99.79,1,0
+1263,Padang (Jakarta) to Padang (Greenwich),transformation,4808,4280,EPSG-Idn Sumatra,1,1355,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,1
+1264,Belge 1950 (Brussels) to Belge 1950,transformation,4809,4215,IGN-Bel,1,1347,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,0
+1265,Tananarive (Paris) to Tananarive,transformation,4810,4297,EPSG-Mdg,1,1149,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,0
+1266,Voirol 1875 (Paris) to Voirol 1875,transformation,4811,4304,IGN-Dza,1,2347,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,0
+1268,Batavia (Jakarta) to Batavia (Greenwich),transformation,4813,4211,EPSG-Idn Java,1,1285,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,1
+1269,RT38 (Stockholm) to RT38 (Greenwich),transformation,4814,4308,NLS-Swe,1,1225,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,1
+1270,Greek (Athens) to Greek (Greenwich),transformation,4815,4120,NTU-Grc,1,1106,Change of prime meridian.,9601,,,,Topography Department; National Technical University of Athens.,EPSG,1999-11-12 00:00:00,99.79,1,1
+1271,Schwarzeck to WGS 84 (2),transformation,4293,4326,SLI-Nam,2,1169,?,9603,,,Beware! Schwarzeck CRS uses German legal metres. Example: Schwarzeck Lat 19d 35m 46.952s S Long 20d 41m 50.649s E; X=5623409.40 Y=2124618.00 Z=-2125847.62 GLM; X=5623485.86 Y=2124646.89 Z=-2125876.53 m; WGS84 X=5624101.50 Y=2124748.97 Z=2126132.34 m.,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-11-13 00:00:00,97.48,1,0
+1272,GGRS87 to WGS 84 (1),transformation,4121,4326,Hel-Grc,1,1106,?,9603,,,,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,1997-06-16 00:00:00,,1,0
+1273,HD72 to ETRS89 (1),transformation,4237,4258,ELTE-Hun,1,1119,?,9607,,,May be taken as approximate transformation HD72 to WGS 84 - see code 1677.,http://lazarus.elte.hu/gb/geodez/geod5.htm,EPSG,1997-11-13 00:00:00,97.47,1,1
+1274,Pulkovo 1942 to LKS94(ETRS89) (1),transformation,4284,4126,HNIT-Ltu,1,1145,?,9607,,,May be taken as approximate transformation Pulkovo 1942 to WGS 84 - see code 1679.,HNIT-BALTIC GeoInfoServisas.,EPSG,1998-03-12 00:00:00,,1,0
+1275,ED50 to WGS 84 (17),transformation,4230,4326,IGN-Fra,17,1096,For applications to an accuracy of 2 metres.,9603,,,,IGN technical report 14 (January 1988).,EPSG,1998-04-16 00:00:00,98.11,1,0
+1276,NTF to ED50 (1),transformation,4275,4230,IGN-Fra,1,1096,For applications to an accuracy of 2 metres.,9603,,,,IGN technical report 7 (October 1981).,EPSG,1997-11-13 00:00:00,,1,0
+1277,NTF to WGS 72 (1),transformation,4275,4322,IGN-Fra,1,1096,For applications to an accuracy of 2 metres.,9603,,,,IGN technical report 7 (October 1981).,EPSG,1997-11-13 00:00:00,,1,0
+1278,AGD66 to GDA94 (1),transformation,4202,4283,Auslig-Aus 5m,1,1036,5m accuracy.,9603,,,Parameter values are given to greater precision but no better accuracy at http://www.dehaa.sa.gov.au/res_inform/sicom/where/geobas14.html For higher accuracy requirements see various regional transformations.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/molodens.htm,EPSG,1997-11-13 00:00:00,,1,0
+1279,AGD84 to GDA94 (1),transformation,4203,4283,Auslig-Aus 5m,1,1036,5m accuracy.,9603,,,Parameter values are given to greater precision but no better accuracy at http://www.dehaa.sa.gov.au/res_inform/sicom/where/geobas14.html,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/molodens.htm,EPSG,1997-11-13 00:00:00,,1,0
+1280,AGD84 to GDA94 (2),transformation,4203,4283,Auslig-Aus 1m,2,1036,1m accuracy.,9607,,,Supersedes AGD84 to WGS 84 (2) (code 1236). May be taken as approximate transformation AGD84 to WGS 84 - see code 1669.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/simil.htm,EPSG,1997-11-13 00:00:00,,1,0
+1282,Samboja to WGS 84 (1),transformation,4125,4326,TOT-Idn Mah,1,1328,Oil exploration.,9603,,,Datum shift derived through ITRF93.,Total Indonesia.,EPSG,2000-03-07 00:00:00,2000.23,1,1
+1283,LKS94(ETRS89) to WGS 84 (1),transformation,4126,4326,HNIT-Ltu,1,1145,LKS94 is a realisation of WGS 84 coincident to within 1.5 metres. This transformation has an accuracy equal to the coincidence figure.,9603,,,,HNIT-BALTIC GeoInfoServisas.,EPSG,1998-03-12 00:00:00,98.13,1,0
+1284,Arc 1960 to WGS 84 (2),transformation,4210,4326,NIMA-Ken,2,1132,"For military purposes. Accuracy 4m, 3m and 3m in X, Y and Z axes.",9603,,,Derived at 24 stations.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-03-12 00:00:00,,1,0
+1285,Arc 1960 to WGS 84 (3),transformation,4210,4326,NIMA-Tza,3,1230,"For military purposes. Accuracy 6m, 9m and 10m in X, Y and Z axes.",9603,,,Derived at 12 stations.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-03-12 00:00:00,,1,0
+1286,Segora to WGS 84 (1),transformation,4294,4326,NIMA-Idn Kal,1,2354,For military purposes.,9603,,,Accuracy estimate not available.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-03-12 00:00:00,,1,1
+1287,Pulkovo 1942 to WGS 84 (3),transformation,4284,4326,NIMA-Hun,3,1119,For military purposes. Accuracy 2m in each axis.,9603,,,Derived at 5 stations.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1288,Pulkovo 1942 to WGS 84 (4),transformation,4284,4326,NIMA-Pol,4,1192,"For military purposes only. Accuracy 4m, 2m and 4m in X, Y and Z axes.",9603,,,Derived at 11 stations.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1289,Pulkovo 1942 to WGS 84 (5),transformation,4284,4326,NIMA-Cze,5,1079,"For military purposes only. Accuracy 3m, 3m and 2m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1290,Pulkovo 1942 to WGS 84 (6),transformation,4284,4326,NIMA-Lva,6,1139,For military purposes. Accuracy 2m in each axis.,9603,,,Derived at 5 stations.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1291,Pulkovo 1942 to WGS 84 (7),transformation,4284,4326,NIMA-Kaz,7,1131,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1292,Pulkovo 1942 to WGS 84 (8),transformation,4284,4326,NIMA-Alb,8,1025,For military purposes. Accuracy 3m in each axis.,9603,,,Derived at 7 stations.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1293,Pulkovo 1942 to WGS 84 (9),transformation,4284,4326,NIMA-Rom,9,1197,"For military purposes. Accuracy 3m, 5m and 3m in X, Y and Z axes.",9603,,,Derived at 4 stations.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1294,Voirol 1875 to WGS 84 (1),transformation,4304,4326,NIMA-Dza N,1,2347,For military purposes.,9603,,,Accuracy estimate not available.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,1998-03-12 00:00:00,,1,0
+1296,Trinidad 1903 to WGS 84 (1),transformation,4302,4326,Amoco-Tto Trin,1,1339,Oil exploration.,9603,,,Derived in 1989 by ONI for Amoco.,Trinidad Ministry of Energy and Energy Industries.,EPSG,1998-11-11 00:00:00,98.38,1,0
+1297,Tete to Moznet (1),transformation,4127,4130,DNGC-Moz,1,1167,Residuals as high as 30 metres.,9607,,,Mean of 32 stations. To reduce the size of the residuals; four regional parameter sets (see codes 1298-1301) were developed. May be taken as approximate transformation Moznet to WGS 84 - see code 1683.,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+1298,Tete to Moznet (2),transformation,4127,4130,DNGC-Moz A,2,2350,Residuals are generally under 1 metre.,9607,,,Mean of 9 stations. May be taken as approximate transformation Moznet to WGS 84 - see code 1684.,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+1299,Tete to Moznet (3),transformation,4127,4130,DNGC-Moz B,3,2351,Residuals are generally under 4 metres.,9607,,,Mean of 6 stations. May be taken as approximate transformation Moznet to WGS 84 - see code 1685.,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+1300,Tete to Moznet (4),transformation,4127,4130,DNGC-Moz C,4,2352,Residuals are generally under 3 metres.,9607,,,Mean of 11 stations. May be taken as approximate transformation Moznet to WGS 84 - see code 1686.,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+1301,Tete to Moznet (5),transformation,4127,4130,DNGC-Moz D,5,2353,Residuals are 5-10 metres.,9607,,,Mean of 7 stations. May be taken as approximate transformation Moznet to WGS 84 - see code 1687.,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+1302,Moznet to WGS 84 (1),transformation,4130,4326,EPSG-Moz,1,1167,For many purposes Moznet can be considered to be coincident with WGS 84. Accuracy better than 1 metre.,9607,,,,EPSG,EPSG,1998-04-16 00:00:00,,1,0
+1303,Pulkovo 1942 to WGS 84 (10),transformation,4284,4326,KCS-Kaz Cas,10,2405,Residuals under 2 m.,9606,,,Mean of 13 stations along entire Kazak coastline.,KazakCaspiShelf consortium.,EPSG,2000-02-02 00:00:00,2000.05,1,0
+1304,Indian 1975 to WGS 84 (2),transformation,4240,4326,NIMA-Tha,2,1231,"For military purposes. Accuracy 3m, 2m and 3m in X, Y and Z axes.",9603,,,Derived at 62 stations.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,,1,0
+1305,Tokyo to WGS 84 (5),transformation,4301,4326,NIMA-Kor,5,1135,For military purposes.,9603,,,Derived at 29 stations.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,,1,0
+1306,MGI to WGS 84 (1),transformation,4312,4326,NIMA-balk,1,2370,For military purposes only.,9603,,,Accuracy estimate not available.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,,1,0
+1307,Naparima 1972 to WGS 84 (3),transformation,4271,4326,NIMA-Tto Tob,3,1322,For military purposes only. Accuracy 15m in each axis.,9603,,,(1) See remarks for tfm code 1192. (2) Naparima 1972 is an extension to Tobago of the Napaima 1955 geographic CRS of Trindad. In Trinidad this transformation may also be considered to use Napaima 1955 (code 4158) as its source CRS: see tfm code 1556.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,1998-04-16 00:00:00,,1,0
+1308,NAD83 to WGS 84 (4),transformation,4269,4326,NGS-Usa ITRF94,4,1323,Historical record only - superseded - see remarks.,9607,,,Strictly between NAD83 and ITRF94(1996.0). Superseded by NAD83 to WGS 84 (5) (code 1515).,US National Geodetic Survey http://www.ngs.noaa.gov/CORS/Derivation.html,EPSG,1999-04-22 00:00:00,99.12 99.38,1,0
+1309,DHDN to ETRS89 (1),transformation,4314,4258,IfAG-Deu W,1,2326,For applications with an accuracy at 5 m level.,9607,,,Mean of 69 stations. May be taken as approximate transformation DHDN to WGS 84 - see code 1673. Also given by EuroGeographics at http://crs.ifag.de/ as a Position Vector transformation with changed values for rotations.,Institute for Cartography and Geodesy; Leipzig.,EPSG,2000-10-19 00:00:00,2000.72,1,0
+1310,Pulkovo 1942 to ETRS89 (1),transformation,4284,4258,IfAG-Deu E,1,1343,Residuals under 2 m.,9607,,,Mean of 20 stations.,Institute for Cartography and Geodesy; Leipzig.,EPSG,2000-10-19 00:00:00,2000.72,1,1
+1311,ED50 to WGS 84 (Common Offshore),transformation,4230,4326,UKOOA-CO,18,2342,Recommended transformation for UKCS petroleum purposes.,9606,,,Based on ED50 to WGS72 (precise ephemeris) 6-nations agreement of 1981 to which precise to broadcast and broadcast to WGS 84 transformations have been concatenated.,The Hydrographic Journal; vol 52 page 50.,EPSG,1998-06-30 00:00:00,98.27,1,0
+1312,NAD27 to NAD83 (3),transformation,4267,4269,GC-Can NT1,3,1061,Historic record only - now superseded - see remarks.,9614,,,Uses NTv1 method. Superseded in Quebec by code 1462 and elsewhere in 1997 by NTv2 (transformation code 1313). Input expects longitudes to be positive west; EPSG GeogCRS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,Geomatics Canada - Geodetic Survey Division.,EPSG,2000-03-07 00:00:00,98.57 2000.14,1,0
+1313,NAD27 to NAD83 (4),transformation,4267,4269,GC-Can NT2,4,1061,Accuracy 1-2 metres.,9615,,,Uses NTv2 data files. Supersedes NTv1 (transformation code 1312) except in Quebec. Input expects longitudes to be positive west; EPSG GeogCRS NAD27 (code 4267) and (code 4269) have longitudes positive east.,http://www.geod.nrcan.gc.ca/products/html-public/GSDapps/English/NTv2_Fact_Sheet.html,EPSG,2000-03-07 00:00:00,98.57 2000.14,1,0
+1314,OSGB 1936 to WGS 84 (Petroleum),transformation,4277,4326,UKOOA-Pet,6,2394,Oil exploration. Accuracy better than 4m and generally better than 2m.,9606,,,For a more accurate transformation see OSGB 1936 / British National Grid to ETRS89 (1) (code 1036): contact the Ordnance Survey of Great Britain (http://www.gps.gov.uk/gpssurveying.asp) for details.,UK Offshore Operators Association. Also at EuroGeographics at http://crs.ifag.de,EPSG,1998-11-11 00:00:00,,1,0
+1315,OSGB 1936 to ED50 (UKOOA),transformation,4277,4230,UKOOA-UKCS,1,2394,For oil exploration. Accuracy better than 4m and generally better than 2m.,9606,,,This transformation is concatenated from OSGB36 to WGS 84 (Petroleum) (code 1314) minus ED50 to WGS 84 (Common Offshore) (code 1311).,UK Offshore Operators Association.,EPSG,1998-11-11 00:00:00,,1,0
+1316,Manoca to WGS 84 (1),transformation,4260,4326,SCS-Cmr,1,1060,?,9603,,,,Stolt Comex Seaway and Geoid for Elf.,EPSG,1998-11-11 00:00:00,,1,1
+1317,Camacupa to WGS 72BE (1),transformation,4220,4324,GSI-Ago,1,1604,Oil exploration.,9603,,,Derived by Geophysical Services Inc. in 1979 from mean of Transit results at 7 stations.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1318,Camacupa to WGS 84 (1),transformation,4220,4326,CON-Ago B5,1,2316,Used for oil exploration by Conoco.,9603,,,,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1319,Camacupa to WGS 84 (2),transformation,4220,4326,TEX-Ago B2,2,2317,Used for oil exploration by Texaco.,9603,,,,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1320,Camacupa to WGS 84 (3),transformation,4220,4326,SHL-Ago old,3,2321,Used by Shell prior to 1994.,9606,,,Superseded by Camacupa to WGS 84 (9).,EPSG,EPSG,1998-12-14 00:00:00,98.56,1,0
+1321,Camacupa to WGS 84 (4),transformation,4220,4326,GSI-Ago,4,2320,Used for oil exploration.,9603,,,"Derived as mean of 123 Transit passes at station Cabo Ledo NE base in November 1990. Used by Elf for block 7 up to December 1992 then superseded by Camacupa to WGS 84 (7). Used by Total in block 8, ExxonMobil block 24, Western Geophysical for spec. data.",EPSG,EPSG,2000-03-07 00:00:00,2000.16,1,0
+1322,Camacupa to WGS 84 (5),transformation,4220,4326,ELF-Ago B3 old,5,2318,Used for oil exploration by Elf for block 3 up to December 1992 then Superseded by Camacupa to WGS 84 (7).,9603,,,Derived at station Djeno during coordination of platform PAL F2 in February 1992.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1323,Camacupa to WGS 84 (6),transformation,4220,4326,ELF-Ago B7 old,6,2319,Used for oil exploration by Elf for 1993 block 7 shallow water survey.,9603,,,Derived at Luanda observatory December 1992.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1324,Camacupa to WGS 84 (7),transformation,4220,4326,ELF-Ago B15,7,2322,"Used for oil exploration by Elf for blocks 3, 7 and 17 between December 1992 and 1994 then Superseded by Camacupa to WGS 84 (10). Used by Exxon for block 15 since 1993.",9603,,,Derived at platform PAL F2 in December 1992.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1325,Camacupa to WGS 84 (8),transformation,4220,4326,ELF-Ago B2 old,8,2317,Used for oil exploration by Total for block 2 between December 1992 and 1994 then Superseded by Camacupa to WGS 84 (10).,9603,,,Derived at platform PAL F2 in December 1992.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1326,Camacupa to WGS 84 (9),transformation,4220,4326,SHL-Ago B16,9,2323,Used by Shell since 1994.,9606,,,Supersedes Camacupa to WGS 84 (3).,EPSG,EPSG,1998-12-14 00:00:00,98.56,1,0
+1327,Camacupa to WGS 84 (10),transformation,4220,4326,ELF-Ago N,10,2324,Used for oil exploration by Elf in blocks 3 and 17 since 1994. Used by Total in block 2 since 1994. Adopted by BP-Amoco Elf and Exxon for blocks 31-33.,9603,,,Derived at platform PAL F2 in 1994 by Topnav using Doris.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1328,Malongo 1987 to Mhast (1),transformation,4259,4264,CHV-Ago Cab,1,1317,Used for oil exploration.,9603,,,Malongo 1987 is an offshore extension of Mhast adopted by Chevron in 1987.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1329,Mhast to WGS 84 (1),transformation,4264,4326,CHV-Ago Cab,1,1317,"Used for oil exploration by Chevron until superseded in 1990 by trf Malongo 1987 to WGS 84 (2), code 1557.",9603,,,"Superseded in 1990 by trf Malongo 1987 to WGS 84 (2), code 1557. Malongo 1987 is an offshore extension of the Mhast cooordinate system.",Chevron.,EPSG,1998-11-11 00:00:00,,1,0
+1330,Malongo 1987 to WGS 84 (1),transformation,4259,4326,CHV-Ago Cab89,1,1317,"Used for oil exploration by Chevron until superseded in 1990 by trf Malongo 1987 to WGS 84 (2), code 1557.",9603,,,Derived at Station Y in 1989 via WGS72.,Chevron.,EPSG,1998-11-11 00:00:00,,1,0
+1331,EST92 to ETRS89 (1),transformation,4133,4258,UT-Est,1,1090,?,9607,,,,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,2000-10-19 00:00:00,2000.72,1,0
+1332,Pulkovo 1942 to EST92 (1),transformation,4284,4133,UT-Est,1,1090,?,9607,,,,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,1,0
+1333,EST92 to WGS 84 (1),transformation,4133,4326,UT-Est,1,1090,?,9607,,,,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,1,0
+1334,Pulkovo 1942 to WGS 84 (12),transformation,4284,4326,UT-Est,12,1090,?,9607,,,,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,1,0
+1335,Tokyo to WGS 84 (6),transformation,4301,4326,GSI-Jpn 452141,6,2425,For medium accuracy.,9618,,,,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,1998-12-12 00:00:00,,1,1
+1336,Tokyo to WGS 84 (7),transformation,4301,4326,GSI-Jpn 452142,7,2426,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1337,Tokyo to WGS 84 (8),transformation,4301,4326,GSI-Jpn 444141,8,2427,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1338,Tokyo to WGS 84 (9),transformation,4301,4326,GSI-Jpn 444142,9,2428,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1339,Tokyo to WGS 84 (10),transformation,4301,4326,GSI-Jpn 440141,10,2429,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1340,Tokyo to WGS 84 (11),transformation,4301,4326,GSI-Jpn 440142,11,2430,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1341,Tokyo to WGS 84 (12),transformation,4301,4326,GSI-Jpn 440143,12,2431,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1342,Tokyo to WGS 84 (13),transformation,4301,4326,GSI-Jpn 440144,13,2432,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1343,Tokyo to WGS 84 (14),transformation,4301,4326,GSI-Jpn 432141,14,2433,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1344,Tokyo to WGS 84 (15),transformation,4301,4326,GSI-Jpn 432142,15,2434,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1345,Tokyo to WGS 84 (16),transformation,4301,4326,GSI-Jpn 432143,16,2435,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1346,Tokyo to WGS 84 (17),transformation,4301,4326,GSI-Jpn 432144,17,2436,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1347,Tokyo to WGS 84 (18),transformation,4301,4326,GSI-Jpn 432145,18,2437,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1348,Tokyo to WGS 84 (19),transformation,4301,4326,GSI-Jpn 424140,19,2438,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1349,Tokyo to WGS 84 (20),transformation,4301,4326,GSI-Jpn 424141,20,2439,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,99.77 2002.08,1,0
+1350,Tokyo to WGS 84 (21),transformation,4301,4326,GSI-Jpn 424142,21,2440,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1351,Tokyo to WGS 84 (22),transformation,4301,4326,GSI-Jpn 424143,22,2441,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1352,Tokyo to WGS 84 (23),transformation,4301,4326,GSI-Jpn 424144,23,2442,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1353,Tokyo to WGS 84 (24),transformation,4301,4326,GSI-Jpn 424145,24,2443,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1354,Tokyo to WGS 84 (25),transformation,4301,4326,GSI-Jpn 420139,25,2444,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1355,Tokyo to WGS 84 (26),transformation,4301,4326,GSI-Jpn 420140,26,2445,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1356,Tokyo to WGS 84 (27),transformation,4301,4326,GSI-Jpn 420141,27,2446,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1357,Tokyo to WGS 84 (28),transformation,4301,4326,GSI-Jpn 420142,28,2447,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1358,Tokyo to WGS 84 (29),transformation,4301,4326,GSI-Jpn 420143,29,2448,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1359,Tokyo to WGS 84 (30),transformation,4301,4326,GSI-Jpn 412140,30,2449,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1360,Tokyo to WGS 84 (31),transformation,4301,4326,GSI-Jpn 412141,31,2450,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1361,Tokyo to WGS 84 (32),transformation,4301,4326,GSI-Jpn 404140,32,2451,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1362,Tokyo to WGS 84 (33),transformation,4301,4326,GSI-Jpn 404141,33,2452,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1363,Tokyo to WGS 84 (34),transformation,4301,4326,GSI-Jpn 400139,34,2453,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1364,Tokyo to WGS 84 (35),transformation,4301,4326,GSI-Jpn 400140,35,2454,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1365,Tokyo to WGS 84 (36),transformation,4301,4326,GSI-Jpn 400141,36,2455,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1366,Tokyo to WGS 84 (37),transformation,4301,4326,GSI-Jpn 392139,37,2456,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1367,Tokyo to WGS 84 (38),transformation,4301,4326,GSI-Jpn 392140,38,2457,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1368,Tokyo to WGS 84 (39),transformation,4301,4326,GSI-Jpn 392141,39,2458,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1369,Tokyo to WGS 84 (40),transformation,4301,4326,GSI-Jpn 384139,40,2459,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1370,Tokyo to WGS 84 (41),transformation,4301,4326,GSI-Jpn 384140,41,2460,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1371,Tokyo to WGS 84 (42),transformation,4301,4326,GSI-Jpn 384141,42,2461,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1372,Tokyo to WGS 84 (43),transformation,4301,4326,GSI-Jpn 380139,43,2462,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1373,Tokyo to WGS 84 (44),transformation,4301,4326,GSI-Jpn 380140,44,2463,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1374,Tokyo to WGS 84 (45),transformation,4301,4326,GSI-Jpn 380141,45,2464,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1375,Tokyo to WGS 84 (46),transformation,4301,4326,GSI-Jpn 372136,46,2465,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1376,Tokyo to WGS 84 (47),transformation,4301,4326,GSI-Jpn 372137,47,2466,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1377,Tokyo to WGS 84 (48),transformation,4301,4326,GSI-Jpn 372138,48,2467,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1378,Tokyo to WGS 84 (49),transformation,4301,4326,GSI-Jpn 372139,49,2468,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1379,Tokyo to WGS 84 (50),transformation,4301,4326,GSI-Jpn 372140,50,2469,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1380,Tokyo to WGS 84 (51),transformation,4301,4326,GSI-Jpn 372141,51,2470,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1381,Tokyo to WGS 84 (52),transformation,4301,4326,GSI-Jpn 364136,52,2471,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1382,Tokyo to WGS 84 (53),transformation,4301,4326,GSI-Jpn 364137,53,2472,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1383,Tokyo to WGS 84 (54),transformation,4301,4326,GSI-Jpn 364138,54,2473,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1384,Tokyo to WGS 84 (55),transformation,4301,4326,GSI-Jpn 364139,55,2474,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1385,Tokyo to WGS 84 (56),transformation,4301,4326,GSI-Jpn 364140,56,2475,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1386,Tokyo to WGS 84 (57),transformation,4301,4326,GSI-Jpn 360136,57,2476,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1387,Tokyo to WGS 84 (58),transformation,4301,4326,GSI-Jpn 360137,58,2477,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1388,Tokyo to WGS 84 (59),transformation,4301,4326,GSI-Jpn 360138,59,2478,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1389,Tokyo to WGS 84 (60),transformation,4301,4326,GSI-Jpn 360139,60,2479,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1390,Tokyo to WGS 84 (61),transformation,4301,4326,GSI-Jpn 360140,61,2480,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1391,Tokyo to WGS 84 (62),transformation,4301,4326,GSI-Jpn 352132,62,2481,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1392,Tokyo to WGS 84 (63),transformation,4301,4326,GSI-Jpn 352133,63,2482,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1393,Tokyo to WGS 84 (64),transformation,4301,4326,GSI-Jpn 352134,64,2483,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1394,Tokyo to WGS 84 (65),transformation,4301,4326,GSI-Jpn 352135,65,2484,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1395,Tokyo to WGS 84 (66),transformation,4301,4326,GSI-Jpn 352136,66,2485,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1396,Tokyo to WGS 84 (67),transformation,4301,4326,GSI-Jpn 352137,67,2486,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1397,Tokyo to WGS 84 (68),transformation,4301,4326,GSI-Jpn 352138,68,2487,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1398,Tokyo to WGS 84 (69),transformation,4301,4326,GSI-Jpn 352139,69,2488,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1399,Tokyo to WGS 84 (70),transformation,4301,4326,GSI-Jpn 352140,70,2489,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1400,Tokyo to WGS 84 (71),transformation,4301,4326,GSI-Jpn 344132,71,2490,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1401,Tokyo to WGS 84 (72),transformation,4301,4326,GSI-Jpn 344133,72,2491,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1402,Tokyo to WGS 84 (73),transformation,4301,4326,GSI-Jpn 344134,73,2492,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1403,Tokyo to WGS 84 (74),transformation,4301,4326,GSI-Jpn 344135,74,2493,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1404,Tokyo to WGS 84 (75),transformation,4301,4326,GSI-Jpn 344136,75,2494,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1405,Tokyo to WGS 84 (76),transformation,4301,4326,GSI-Jpn 344137,76,2495,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1406,Tokyo to WGS 84 (77),transformation,4301,4326,GSI-Jpn 344138,77,2496,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1407,Tokyo to WGS 84 (78),transformation,4301,4326,GSI-Jpn 344139,78,2497,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1408,Tokyo to WGS 84 (79),transformation,4301,4326,GSI-Jpn 344140,79,2498,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1409,Tokyo to WGS 84 (80),transformation,4301,4326,GSI-Jpn 340130,80,2499,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1410,Tokyo to WGS 84 (81),transformation,4301,4326,GSI-Jpn 340131,81,2500,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1411,Tokyo to WGS 84 (82),transformation,4301,4326,GSI-Jpn 340132,82,2501,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1412,Tokyo to WGS 84 (83),transformation,4301,4326,GSI-Jpn 340133,83,2502,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1413,Tokyo to WGS 84 (84),transformation,4301,4326,GSI-Jpn 340134,84,2503,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1414,Tokyo to WGS 84 (85),transformation,4301,4326,GSI-Jpn 340135,85,2504,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1415,Tokyo to WGS 84 (86),transformation,4301,4326,GSI-Jpn 340136,86,2505,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1416,Tokyo to WGS 84 (87),transformation,4301,4326,GSI-Jpn 340137,87,2506,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1417,Tokyo to WGS 84 (88),transformation,4301,4326,GSI-Jpn 340138,88,2507,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1418,Tokyo to WGS 84 (89),transformation,4301,4326,GSI-Jpn 332129,89,2508,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1419,Tokyo to WGS 84 (90),transformation,4301,4326,GSI-Jpn 332130,90,2509,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1420,Tokyo to WGS 84 (91),transformation,4301,4326,GSI-Jpn 332131,91,2510,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1421,Tokyo to WGS 84 (92),transformation,4301,4326,GSI-Jpn 332132,92,2511,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1422,Tokyo to WGS 84 (93),transformation,4301,4326,GSI-Jpn 332133,93,2512,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1423,Tokyo to WGS 84 (94),transformation,4301,4326,GSI-Jpn 332134,94,2513,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1424,Tokyo to WGS 84 (95),transformation,4301,4326,GSI-Jpn 332135,95,2514,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1425,Tokyo to WGS 84 (96),transformation,4301,4326,GSI-Jpn 332136,96,2515,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1426,Tokyo to WGS 84 (97),transformation,4301,4326,GSI-Jpn 324129,97,2516,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1427,Tokyo to WGS 84 (98),transformation,4301,4326,GSI-Jpn 324130,98,2517,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1428,Tokyo to WGS 84 (99),transformation,4301,4326,GSI-Jpn 324131,99,2518,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1429,Tokyo to WGS 84 (100),transformation,4301,4326,GSI-Jpn 324132,100,2519,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1430,Tokyo to WGS 84 (101),transformation,4301,4326,GSI-Jpn 324133,101,2520,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1431,Tokyo to WGS 84 (102),transformation,4301,4326,GSI-Jpn 324134,102,2521,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1432,Tokyo to WGS 84 (103),transformation,4301,4326,GSI-Jpn 320130,103,2522,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1433,Tokyo to WGS 84 (104),transformation,4301,4326,GSI-Jpn 320131,104,2523,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1434,Tokyo to WGS 84 (105),transformation,4301,4326,GSI-Jpn 320132,105,2524,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1435,Tokyo to WGS 84 (106),transformation,4301,4326,GSI-Jpn 312130,106,2525,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1436,Tokyo to WGS 84 (107),transformation,4301,4326,GSI-Jpn 312131,107,2526,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1437,RT90 to ETRS89 (1),transformation,4124,4258,NLS-Swe,1,1225,Accuracy 0.5m.,9607,,,This transformation is actually between ETRS89 and RR92. RR92 is a geographic 3D coordinate system where the horizontal component is RT90. Also at EuroGeographics; http:/crs.ifag.de/ with change of rotation convention (transformation method). Derived at,National Land Survey of Sweden.,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+1438,Fahud to WGS 84 (2),transformation,4232,4326,PDO-Omn,2,1183,Oil exploration.,9606,,,,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,1,0
+1439,PSD93 to WGS 84 (1),transformation,4134,4326,PDO-Omn 97,1,1183,Oil exploration. Residuals 0.5m at 67% probability level.,9606,,,Superseded PSD93 to WGS 84 (2) (code 8581) in 1997.,Petroleum Development Oman,EPSG,2001-06-05 00:00:00,2000.28,1,0
+1440,ED50 to WGS 84 (19),transformation,4230,4326,HEL-Grc,19,1106,Used in oil industry.,9603,,,,Geodesy Department; Hellenic Petroleum s.a.,EPSG,1999-04-22 00:00:00,,1,0
+1441,Antigua 1943 to WGS 84 (1),transformation,4601,4326,DOS-Atg Ant,1,1273,?,9603,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1442,Dominica 1945 to WGS 84 (1),transformation,4602,4326,DOS-Dma,1,1082,?,9603,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1443,Grenada 1953 to WGS 84 (1),transformation,4603,4326,DOS-Grd,1,1108,?,9603,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1444,Montserrat 1958 to WGS 84 (1),transformation,4604,4326,DOS-Msr,1,1165,?,9603,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1445,St. Kitts 1955 to WGS 84 (1),transformation,4605,4326,DOS-Kna,1,1200,?,9603,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1446,St. Lucia 1955 to WGS 84 (1),transformation,4606,4326,DOS-Lca,1,1201,?,9603,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1447,Anguilla 1957 to WGS 84 (1),transformation,4600,4326,DOS-Aia,1,1030,?,9619,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1450,ED50 to WGS 84 (20),transformation,4230,4326,NMA-Nor 6265W,20,2333,Oil exploration before 1997/2001.,9620,,,Valid 1991-1997. Superseded in 1997 by ED50 to WGS 84 (22) (code 1590) and in 2001 by ED50 to WGS 84 (23) (code 1612).,"Norwegian Mapping Authority note of 13-Feb-1991 ""Om Transformasjon mellom Geodetiske Datum i Norge"".",EPSG,2000-03-07 00:00:00,2000.14,1,0
+1451,NAD27(CGQ77) to NAD83 (1),transformation,4609,4269,SGQ-Can QC NT1,1,1368,Historic record only - now superseded - see remarks.,9614,,,Superseded by NAD27(CGQ77) to NAD83 (2) (code 1575). Uses NT method which expects longitudes positive west; EPSG GeogCRSs CGQ77 (code 4609) and NAD83 (code 4269) have longitudes positive east.,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1454,Old Hawaiian to NAD83 (1),transformation,4135,4269,NGS-Usa HI,1,1334,Accuracy at 67% confidence level is 0.2m.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs Old Hawaiian (code 4135) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from Old Hawaiian Datum to but makes the transformation appear to be from NAD27.,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1455,St. Lawrence Island to NAD83 (1),transformation,4136,4269,NGS-Usa AK StL,1,1332,Accuracy 0.5m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs St. Lawrence (code 4136) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. Lawrence Datum to but makes the transformation appear to be from NAD27.,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1456,St. Paul Island to NAD83 (1),transformation,4137,4269,NGS-Usa AK StP,1,1333,Accuracy 0.5m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs St. Paul (code 4137) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. Paul Datum to but makes the transformation appear to be from NAD27.,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1457,St. George Island to NAD83 (1),transformation,4138,4269,NGS-Usa AK StG,1,1331,Accuracy 0.5m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs St. George (code 4138) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. George Datum to but makes the transformation appear to be from NAD27.,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1458,AGD66 to GDA94 (2),transformation,4202,4283,Auslig-ACT 1m,2,2283,Recommended for mid-accuracy use in A.C.T. 1m accuracy.,9607,,,For higher accuracy requirements see AGD66 to GDA94 (10) (code 1596). May be taken as approximate transformation AGD66 to WGS 84 - see code 1665.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,1999-05-25 00:00:00,,1,0
+1459,AGD66 to GDA94 (3),transformation,4202,4283,Auslig-Tas 1m old,3,1282,1m accuracy.,9607,,,Superseded in 2000 by AGD66 to GDA94 (8) (code 1594). Differences are sub-metre.,GDA Technical Manual version Dec 1998. http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,1999-05-25 00:00:00,2000.68,1,0
+1460,AGD66 to GDA94 (4),transformation,4202,4283,Auslig-NSW Vic 1m,4,2286,Recommended for mid-accuracy use in NSW and Victoria. 1m accuracy.,9607,,,For higher accuracy requirements see AGD66 to GDA94 (10) (code 1596). May be taken as approximate transformation AGD66 to WGS 84 - see code 1666.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,1999-05-25 00:00:00,,1,0
+1461,Puerto Rico to NAD83 (1),transformation,4139,4269,NGS-PRVI,1,1335,Accuracy 0.05m at 67% confidence level.,9613,,,,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1462,NAD27 to NAD83 (5),transformation,4267,4269,SGQ-Can QC NT1,5,1368,Historic record only - now superseded - see remarks.,9614,,,Densification for Quebec of code 1312. Superseded by NAD27 to NAD83 (6) (code 1573). Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1463,NAD27(76) to NAD83 (1),transformation,4608,4269,SGQ-Can Ont,1,1367,?,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27(76) (code 4608) and NAD83 (code 4269) have longitudes positive east. May be taken as approximate transformation NAD27(76) to WGS 84 - see code 1690.,Geodetic Survey of Canada http://www.geod.emr.ca/html-public/GSDapps/English/NTv2_Fact_Sheet.html,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1464,AGD66 to GDA94 (5),transformation,4202,4283,OSG-Aus Vic old,5,2285,0.1m accuracy.,9615,,,Superseded by AGD66 to GDA94 (10) (code 1596) and then by AGD66 to GDA94 (11) (code 1803). Input expects longitudes to be positive west; EPSG GeogCRS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,http://www.osg.vic.gov.au/tools.htm,EPSG,2000-03-07 00:00:00,99.67 2000.14 2000.68,1,0
+1466,NGO 1948 (Oslo) to NGO1948 (Greenwich),transformation,4817,4273,NGO-Nor,1,1352,Change of prime meridian.,9601,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-11-12 00:00:00,99.79,1,1
+1467,NTF (Paris) to NTF (Greenwich) (1),transformation,4807,4275,IGN-Fra,1,1096,Change of prime meridian.,9601,,,,IGN Paris.,EPSG,1999-11-12 00:00:00,99.63 99.79,1,1
+1468,NTF (Paris) to NTF (Greenwich) (2),transformation,4807,4275,RGS,2,1096,Change of prime meridian.,9601,,,EPSG prefers value from IGN Paris (code 1467).,Royal Geographic Society; London,EPSG,1999-11-12 00:00:00,99.63 99.79,1,1
+1469,Locodjo 1965 to WGS 84 (1),transformation,4142,4326,IGN-Civ,1,2282,?,9603,,,,IGN Paris,EPSG,1999-10-20 00:00:00,,1,0
+1470,Abidjan 1987 to WGS 84 (1),transformation,4143,4326,IGN-Civ,1,2282,?,9603,,,,IGN Paris,EPSG,1999-10-20 00:00:00,,1,0
+1471,MGI to WGS 84 (2),transformation,4312,4326,BEV-Aut,1,1037,For applications to an accuracy of 1.5 metres.,9606,,,,Bundesamt f�r Eich- und Vermessungswesen,EPSG,1999-10-20 00:00:00,,1,1
+1472,ATS77 to NAD83(CSRS98) (1),transformation,4122,4140,GIC-Can NB,1,1447,?,9615,,,Introduced in 1999. Can be taken as an approximate transformation ATS77 to WGS 84 - see code 1688.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,2000-10-19 00:00:00,2000.14 2000.66,1,1
+1473,NAD83(CSRS98) to WGS 84 (1),transformation,4140,4326,EPSG-Can,1,1336,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,9603,,,For many purposes NAD83(CSRS98) can be considered to be coincident with WGS 84.,EPSG,EPSG,1999-10-20 00:00:00,,1,1
+1474,NAD83 to NAD83(HARN) (1),transformation,4269,4152,NGS-Usa AL,1,1372,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1717.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1475,NAD83 to NAD83(HARN) (2),transformation,4269,4152,NGS-Usa AZ,2,1373,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1728.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1476,NAD83 to NAD83(HARN) (3),transformation,4269,4152,NGS-Usa CA n,3,2297,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1739.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1477,NAD83 to NAD83(HARN) (4),transformation,4269,4152,NGS-Usa CA s,4,2298,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1750.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1478,NAD83 to NAD83(HARN) (5),transformation,4269,4152,NGS-Usa CO,5,1376,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1712.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1479,NAD83 to NAD83(HARN) (6),transformation,4269,4152,NGS-Usa GA,6,1380,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1713.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1480,NAD83 to NAD83(HARN) (7),transformation,4269,4152,NGS-Usa FL,7,1379,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1714.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1481,NAD83 to NAD83(HARN) (8),transformation,4269,4152,NGS-Usa ID MT e,8,2382,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1715.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1482,NAD83 to NAD83(HARN) (9),transformation,4269,4152,NGS-Usa ID MT w,9,2383,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1716.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1483,NAD83 to NAD83(HARN) (10),transformation,4269,4152,NGS-Usa KY,10,1386,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1718.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1484,NAD83 to NAD83(HARN) (11),transformation,4269,4152,NGS-Usa LA,11,1387,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1719.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1485,NAD83 to NAD83(HARN) (12),transformation,4269,4152,NGS-Usa DE MD,12,2377,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1720.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1486,NAD83 to NAD83(HARN) (13),transformation,4269,4152,NGS-Usa ME,13,1388,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1721.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1487,NAD83 to NAD83(HARN) (14),transformation,4269,4152,NGS-Usa MI,14,1391,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1722.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1488,NAD83 to NAD83(HARN) (15),transformation,4269,4152,NGS-Usa MS,15,1393,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1723.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1489,NAD83 to NAD83(HARN) (16),transformation,4269,4152,NGS-Usa NE,16,1396,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1724.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1490,NAD83 to NAD83(HARN) (17),transformation,4269,4152,NGS-Usa NewEng,17,2378,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1725.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1491,NAD83 to NAD83(HARN) (18),transformation,4269,4152,NGS-Usa NM,18,1400,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1726.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1492,NAD83 to NAD83(HARN) (19),transformation,4269,4152,NGS-Usa NY,19,1401,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1727.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1493,NAD83 to NAD83(HARN) (20),transformation,4269,4152,NGS-Usa ND,20,1403,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1729.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1494,NAD83 to NAD83(HARN) (21),transformation,4269,4152,NGS-Usa OK,21,1405,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1730.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1495,NAD83 to NAD83(HARN) (22),transformation,4269,4152,NGS-PRVI,22,1335,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1731.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1496,NAD83 to NAD83(HARN) (23),transformation,4269,4152,NGS-Usa SD,23,1410,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1732.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1497,NAD83 to NAD83(HARN) (24),transformation,4269,4152,NGS-Usa TN,24,1411,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1733.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1498,NAD83 to NAD83(HARN) (25),transformation,4269,4152,NGS-Usa TX e,25,2379,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1734.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1499,NAD83 to NAD83(HARN) (26),transformation,4269,4152,NGS-Usa TX w,26,2380,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1735.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1500,NAD83 to NAD83(HARN) (27),transformation,4269,4152,NGS-Usa VA,27,1415,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1736.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1501,NAD83 to NAD83(HARN) (28),transformation,4269,4152,NGS-Usa OR WA,28,2381,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1737.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1502,NAD83 to NAD83(HARN) (29),transformation,4269,4152,NGS-Usa WI,29,1418,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1738.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1503,NAD83 to NAD83(HARN) (30),transformation,4269,4152,NGS-Usa WY,30,1419,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1740.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-03-07 00:00:00,99.931 2000.14,1,0
+1504,Cape to Hartebeesthoek94 (1),transformation,4222,4148,DSM-Zaf,1,1215,?,9603,,,Also used to transform Cape to WGS 84 - see code 1129.,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-01-06 00:00:00,99.96,1,0
+1505,Hartebeesthoek94 to WGS 84 (1),transformation,4148,4326,EPSG-Zaf,1,1215,For many purposes Hartebeesthoek94 datum can be considered to be coincident with WGS 84.,9603,,,,EPSG,EPSG,2000-01-06 00:00:00,99.96,1,0
+1506,AGD66 to GDA94 (6),transformation,4202,4283,OSG-Tas 0.1m,6,1282,0.1m accuracy.,9615,,,Superseded by AGD66 to GDA94 (11) (code 1803). Input expects longitudes to be positive west; EPSG GeogCRS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,http://www.delm.tas.gov.au/osg/Geodetic_transform.htm,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1507,AGD66 to GDA94 (7),transformation,4202,4283,Auslig-NT 0.1m,7,2284,0.1m accuracy.,9615,,,Superseded by AGD66 to GDA94 (11) (code 1803). Input expects longitudes to be positive west; EPSG GeogCRS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/chapter7.htm#high,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1508,CH1903 to WGS 84 (1),transformation,4149,4326,BfL-CH 1,1,1286,?,9607,,,Implemented in Bundesamt f�r Landestopographie programme GRANIT.,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,1999-10-20 00:00:00,,1,1
+1509,CH1903+ to CHTRF95 (1),transformation,4150,4151,BfL-CH,1,1286,For applications to an accuracy of 0.1 metres.,9603,,,This transformation is also given as CH1903+ to ETRS89 (1) (code 1647). CHTRF95 is a realisation of ETRS89. May be taken as approximate transformation CH1903+ to WGS 84 - see code 1676.,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,1999-10-20 00:00:00,,1,0
+1510,CH1903 to WGS 84 (2),transformation,4149,4326,BfL-CH 2,2,1286,Accuracy 1.5 metres.,9603,,,These parameters are strictly between CH1903+ and CHTRF95 but are used from CH1903 as an approximation which is within the accuracy of the distortions in the CH1903 network.,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,1999-10-20 00:00:00,,1,1
+1511,CHTRF95 to WGS 84 (1),transformation,4151,4326,EPSG-CH,1,1286,For many purposes CHTRF95 can be considered to be coincident with WGS 84.,9603,,,,EPSG,EPSG,1999-10-20 00:00:00,,1,0
+1512,Rassadiran to WGS 84 (1),transformation,4153,4326,TOT-Irn Taheri,1,1338,Oil industry engineering survey. Used only for terminal site.,9603,,,Derived in 1998 at Assaluyeh (Taheri refinery) by Geoid for Total. Used for South Pars phases 2 and 3.,Total-Fina,EPSG,1999-10-20 00:00:00,,1,0
+1513,FD58 to WGS 84 (1),transformation,4132,4326,TOT-Irn Kangan,1,2362,Oil exploration.,9603,,,Derived in 1998 in Kangan district by Geoid for Total. Used for South Pars phases 2 and 3.,Total-Fina,EPSG,1999-10-20 00:00:00,,1,0
+1514,ED50(ED77) to WGS 84 (1),transformation,4154,4326,NCCI-Irn,1,1123,?,9606,,,"Used for South Pars phases 6, 7 and 8.",National Cartographic Centre of Iran,EPSG,1999-10-20 00:00:00,,1,0
+1515,NAD83 to WGS 84 (5),transformation,4269,4326,NGS-Usa ITRF96,5,1323,Geodesy.,9607,,,Strictly between NAD83 and ITRF96(1997.0). Supersedes NAD83 to WGS 84 (4) (code 1308)., http://www.ngs.noaa.gov/CORS/Derivation.html,EPSG,1999-11-05 00:00:00,,1,0
+1516,La Canoa to WGS 84 (1),transformation,4247,4326,LAG-Ven E,1,2363,Parameter values estimated accuracy: � 2.0m; � 2.7m; � 1.3m respectively.,9603,,,Also used for PSAD56 to WGS 84 transformations.,"Lagoven; Gonzalez Losano y Rodriguez; ""Determination de los Parametros de Transformacion para el Oriente del Pais""; VII Venezuelan Geophysical Congress; September 1994.",EPSG,1999-11-05 00:00:00,,1,0
+1517,Conakry 1905 to WGS 84 (1),transformation,4315,4326,IGN-Gin,1,1112,?,9603,,,,IGN Paris,EPSG,1999-12-09 00:00:00,,1,0
+1518,Dabola 1981 to WGS 84 (1),transformation,4155,4326,IGN-Gin,1,1112,?,9603,,,,IGN Paris,EPSG,1999-12-09 00:00:00,,1,0
+1519,Bern 1898 (Bern) to CH1903 (Greenwich),transformation,4801,4149,BfL-CH,1,1286,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-12-09 00:00:00,,1,1
+1520,NAD83 to NAD83(HARN) (31),transformation,4269,4152,NGS-Usa HI,31,1334,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1741.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1521,NAD83 to NAD83(HARN) (32),transformation,4269,4152,NGS-Usa IN,32,1383,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1742.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,2000-01-06 00:00:00,,1,0
+1522,NAD83 to NAD83(HARN) (33),transformation,4269,4152,NGS-Usa KS,33,1385,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1743.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1523,NAD83 to NAD83(HARN) (34),transformation,4269,4152,NGS-Usa NV,34,1397,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1744.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1524,NAD83 to NAD83(HARN) (35),transformation,4269,4152,NGS-Usa OH,35,1404,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1745.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1525,NAD83 to NAD83(HARN) (36),transformation,4269,4152,NGS-Usa UT,36,1413,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1746.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1526,NAD83 to NAD83(HARN) (37),transformation,4269,4152,NGS-Usa WV,37,1417,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1747.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1527,Campo Inchauspe to WGS 84 (2),transformation,4221,4326,TOT-Arg Neu,2,2325,Oil exploration.,9603,,,Derived through ties at 2 stations (Cerro Colorado and Chihuido Sur) to 4 IGS stations,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+1528,Chos Malal 1914 to Campo Inchauspe (1),transformation,4160,4221,TOT-Arg Neu,1,2325,Oil exploration. Accuracy 10 metres.,9603,,,Derived through common coordinates at 5 stations.,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+1529,Hito XVIII to WGS 84 (1),transformation,4254,4326,TOT-Arg TdF,1,2357,Oil exploration.,9606,,,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+1530,NAD27 to WGS 84 (30),transformation,4267,4326,ICH-Cub,30,1077,?,9603,,,,Institut Cubano di Hidrografia (ICH),EPSG,2000-03-07 00:00:00,,1,0
+1531,Nahrwan 1967 to WGS 84 (4),transformation,4270,4326,TOT-UAE Abk,4,2392,Oil exploration.,9603,,,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+1532,M'poraloko to WGS 84 (2),transformation,4266,4326,Elf-Gab94,2,1100,Oil exploration.,9603,,,Derived as mean of Doris determinations at 3 stations in Port Gentil area.,TotalFinaElf,EPSG,2000-03-07 00:00:00,,1,0
+1533,Kalianpur 1937 to WGS 84 (2),transformation,4144,4326,TOT-Mmr Moat,2,2361,Oil exploration.,9603,,,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+1534,Minna to WGS 84 (3),transformation,4263,4326,SHL-Nig S,3,2371,Oil exploration.,9606,,,,Shell Petroleum Development Company,EPSG,2000-03-07 00:00:00,,1,1
+1536,Nahrwan 1967 to WGS 84 (5),transformation,4270,4326,B&R-Qat off,5,1346,Oil exploration.,9603,,,Derived by Brown & Root in 1992 for Qatar General Petroleum Corporation North Field development. Adopted by QGPC for all offshore Qatar.,Qatar General Petroleum Corporation and Total-Fina,EPSG,2000-03-07 00:00:00,2000.53,1,0
+1537,Indian 1975 to WGS 84 (3),transformation,4240,4326,Fug-Tha,3,2358,Oil exploration.,9603,,,Derived in 1995 at point RTSD181.,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+1538,Carthage to WGS 84 (2),transformation,4223,4326,Elf-Tun,2,1489,Oil exploration.,9603,,,Derived at station Chaffar January 1995.,Total / Elf,EPSG,2000-03-07 00:00:00,,1,0
+1539,South Yemen to Yemen NGN96 (1),transformation,4164,4163,IGN-Yem South,1,1340,?,9603,,,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,0
+1540,Yemen NGN96 to WGS 84 (1),transformation,4163,4326,IGN-Yem,1,1257,Accuracy better than 1 metre.,9603,,,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,0
+1541,Indian 1960 to WGS 72BE (1),transformation,4131,4324,PV-Vnm,1,1495,Oil exploration.,9603,,,Derived in Vung Tau area by Technical Navigation for Deminex in 1978.,PetroVietnam,EPSG,2000-03-07 00:00:00,,1,0
+1542,Indian 1960 to WGS 84 (2),transformation,4131,4326,DMA-Vnm 16N,2,2359,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,2000-03-07 00:00:00,,1,0
+1543,Indian 1960 to WGS 84 (3),transformation,4131,4326,DMA-Vnm ConSon,3,2360,For military purposes. Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,2000-03-07 00:00:00,,1,0
+1544,Hanoi 1972 to WGS 84 (1),transformation,4147,4326,BP-Vnm,1,1494,Oil exploration.,9603,,,Derived in Vung Tau area.,BP Amoco,EPSG,2000-03-07 00:00:00,,1,0
+1545,Egypt 1907 to WGS 72 (1),transformation,4229,4322,MCE-Egy,1,1086,?,9603,,,,UK Mapping and Charting Establishment,EPSG,2000-03-07 00:00:00,,1,0
+1546,Egypt 1907 to WGS 84 (3),transformation,4229,4326,Racal-Egy GoS,3,2341,Used for oil exploration by GUPCO.,9603,,,,Maridive,EPSG,2000-03-07 00:00:00,,1,0
+1547,Bissau to WGS 84 (1),transformation,4165,4326,DMA-Gnb,1,1113,For military purposes only. Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency TR8350.2 second edition September 1991,EPSG,2000-03-07 00:00:00,,1,0
+1548,SAD69 to WGS 84 (14),transformation,4291,4326,IGBE-Bra,14,1053,Medium and small scale mapping.,9603,,,Derived by Brazilean Institute of Geography and Statistics (IGBE) in 1989. Used by ANP.,Agencia Nacional do Petroleo (ANP).,EPSG,2000-03-07 00:00:00,,1,0
+1549,Aratu to WGS 84 (1),transformation,4208,4326,PB-Bra Camp,1,2307,Oil exploration.,9603,,,,Petrobras.,EPSG,2000-03-07 00:00:00,,1,0
+1550,Aratu to WGS 84 (2),transformation,4208,4326,PB-Bra TucN,2,2308,Oil exploration.,9603,,,,Petrobras.,EPSG,2000-03-07 00:00:00,,1,0
+1551,Aratu to WGS 84 (3),transformation,4208,4326,PB-Bra TucC,3,2309,Oil exploration.,9603,,,,Petrobras.,EPSG,2000-03-07 00:00:00,,1,0
+1552,Aratu to WGS 84 (4),transformation,4208,4326,PB-Bra TucS,4,2310,Oil exploration.,9603,,,,Petrobras.,EPSG,2000-03-07 00:00:00,,1,0
+1553,NAD83 to NAD83(HARN) (38),transformation,4269,4152,NGS-Usa IL,38,1382,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1748.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1554,NAD83 to NAD83(HARN) (39),transformation,4269,4152,NGS-Usa NJ,39,1399,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1749.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1555,Naparima 1955 to WGS 84 (2),transformation,4158,4326,Amoco-Tto Trin,2,1339,Oil exploration.,9603,,,Derived in 1989 by ONI for Amoco.,Trinidad Ministry of Energy and Energy Industries.,EPSG,2000-03-07 00:00:00,2000.351,1,0
+1556,Naparima 1955 to WGS 84 (3),transformation,4158,4326,NIMA-Tto Trin,3,1339,For military purposes.,9603,,,Described by NIMA as Naparima 1972 to WGS 84. In Trinidad the source CRS is better known as Napaima 1955. EPSG has duplicated the tfm using the alternative source CRSs. See also tfm code 1307.,EPSG after U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,2000-03-07 00:00:00,2000.351,1,0
+1557,Malongo 1987 to WGS 84 (2),transformation,4259,4326,CHV-Ago Cab90,2,1317,Used for oil exploration by Chevron since 1990.,9603,,,Supersedes trf code 1330. Derived at station Y.,Chevron.,EPSG,2000-05-08 00:00:00,,1,0
+1558,Korean 1995 to WGS 84 (1),transformation,4166,4326,NIMA-Kor,1,1135,For military purposes. Accuracy better than 1 metre.,9603,,,Derived at 5 stations.,NIMA TR8350.2 ftp://164.214.2.65/pub/gg/tr8350.2/changes.pdf,EPSG,2000-06-10 00:00:00,,1,0
+1559,AGD84 to GDA94 (3),transformation,4203,4283,DOLA-Aus WA 0.1m old,3,1280,0.1m accuracy.,9615,,,Superseded by AGD84 to GDA94 (4) (code 1593) (binary file format error) and then by AGD84 to GDA94 (5) (code 1804). Input expects longitudes to be positive west; EPSG GeogCRS AGD84 (code 4203) and GDA94 (code 4283) both have longitudes positive east.,http://www.dola.wa.gov.au/lotl/survey_geodesy/gda1994/download.html,EPSG,2000-06-10 00:00:00,2000.68,1,1
+1560,Nord Sahara 1959 to WGS 72BE (1),transformation,4307,4324,CGG-Alg HM,1,2393,Oil exploration.,9603,,,Derived at IGN monument CFP19 using Transit.,Various oil company sources.,EPSG,2000-06-23 00:00:00,,1,0
+1561,Qatar 1974 to WGS 84 (1),transformation,4285,4326,DMA-Qat,1,1195,For military purposes only. Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,2000-10-19 00:00:00,,1,0
+1562,Qatar 1974 to WGS 84 (2),transformation,4285,4326,B&R-Qat off,2,2406,Oil exploration.,9603,,,Derived by Brown & Root in 1992 for Qatar General Petroleum Corporation.,Qatar General Petroleum Corporation and Total-Fina,EPSG,2000-10-19 00:00:00,,1,0
+1563,Qatar 1974 to WGS 84 (3),transformation,4285,4326,CGIS-Qat,3,1346,Oil exploration.,9603,,,Derived by Qatar Centre for GIS. See Qatar 1974 to WGS 84 (2) (code 1562) for transformation used by QGPC for offshore petroleum industry.,Qatar Centre for GIS,EPSG,2000-10-19 00:00:00,,1,0
+1564,NZGD49 to WGS 84 (2),transformation,4272,4326,OSG-Nzl 4m,2,1175,Transformation accuracy about 4 metres.,9607,,,These parameter values are taken from NZGD49 to NZGD2000 (4) (code 1701) and assume that NZGD2000 and WGS 84 are coincident to within the accuracy of the transformation. For improved accuracy use NZGD49 to WGS 84 (4) (code 1670).,Land Information New Zealand Office of Surveyor General policy statement 97/3.,EPSG,2000-10-19 00:00:00,,1,0
+1565,NZGD2000 to WGS 84 (1),transformation,4167,4326,OSG-Nzl,1,1175,Assumes NZGD2000 is coincident to WGS 84 to the 1m accuracy level.,9603,,,,http://www.linz.govt.nz/services/surveysystem/osgpublications/nzgd2000_trans.html,EPSG,2000-10-19 00:00:00,,1,0
+1566,NZGD49 to NZGD2000 (1),transformation,4272,4167,OSG-Nzl 5m,1,1175,5m accuracy.,9603,,,For better accuracy use NZGD49 to NZGD2000 (4) (code 1701) or NZGD49 to NZGD2000 (3) (code 1568).,http://www.linz.govt.nz/services/surveysystem/osgpublications/nzgd2000_trans.html,EPSG,2000-10-19 00:00:00,,1,0
+1567,NZGD49 to NZGD2000 (2),transformation,4272,4167,OSG-Nzl 4m,2,1175,4m accuracy.,9607,,,4m accuracy. For better accuracy use NZGD49 to NZGD2000 (3) (code 1568),http://www.linz.govt.nz/services/surveysystem/osgpublications/nzgd2000_trans.html,EPSG,2000-10-19 00:00:00,,1,1
+1568,NZGD49 to NZGD2000 (3),transformation,4272,4167,OSG-Nzl 1m,3,1175,0.2m accuracy.,9615,,,These same parameter values may be used to transform to WGS 84 - see NZGD49 to WGS 84 (4) (code 1670).,http://www.linz.govt.nz/services/surveysystem/osgpublications/nzgd2000_trans.html,EPSG,2000-10-19 00:00:00,,1,0
+1569,Accra to WGS 84 (1),transformation,4168,4326,MCE-Gha,1,1104,Military survey,9603,,,Derived at 3 common points.,Ordnance Survey International,EPSG,2000-10-19 00:00:00,,1,0
+1570,Accra to WGS 72BE (1),transformation,4168,4324,GSI-Gha,1,1505,Oil exploration.,9603,,,Derived be single point Transit observation at several locations.,Various oil industry sources,EPSG,2000-10-19 00:00:00,,1,0
+1571,Amersfoort to ETRS89 (1),transformation,4258,4326,NCG-Nld 2000,1,1172,Accuracy 0.5m,9607,,,"Dutch sources also quote an equivalent transformation with parameter values dX=+593.032 dY=+26.000 dZ=+478.741m, rX rY rZ and dS as this tfm. These values belong to a different transformation method and cannot be used with the Coordinate Frame method.",http://rdnap.kadaster.nl/rd/index.html Also Nederlandse Commissie voor Geodesie publication 30; 3rd edition 1997. Also with change of method [...]
+1572,NAD83 to NAD83(CSRS98) (1),transformation,4269,4140,SGQ-Can QC,1,1368,Accuracy 1-2 metres.,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(CSRS98) (code 4140) have longitudes positive east. Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1696.,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-10-19 00:00:00,,1,1
+1573,NAD27 to NAD83 (6),transformation,4267,4269,SGQ-Can QC NT2,6,1368,Accuracy 1-2 metres.,9615,,,Supersedes NAD27 to NAD83 (5) (code 1462). Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-10-19 00:00:00,,1,0
+1574,NAD27 to NAD83(CSRS98) (1),transformation,4267,4140,SGQ-Can QC,1,1368,Accuracy 1-2 metres.,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27 (code 4267) and NAD83(CSRS98) (code 4140) have longitudes positive east. Can be taken as an approximate transformation NAD27 to WGS 84 - see code 1692.,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-10-19 00:00:00,,1,1
+1575,NAD27(CGQ77) to NAD83 (2),transformation,4609,4269,SGQ-Can QC NT2,2,1368,Accuracy 1-2 metres.,9615,,,Supersedes NAD27(CGQ77) to NAD83 (1) (code 1451). Uses NT method which expects longitudes positive west; EPSG GeogCRSs CGQ77 and NAD83 (codes 4609 and 4269) have longitudes positive east. Can be taken as approx transformation to WGS 84 - see code 1691.,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-10-19 00:00:00,,1,0
+1576,NAD27(CGQ77) to NAD83(CSRS98) (1),transformation,4609,4140,SGQ-Can QC,1,1368,Accuracy 1-2 metres.,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27(CGQ77) (code 4609) and NAD83(CSRS98) (code 4140) have longitudes positive east. Can be taken as an approximate transformation NAD27(CGQ77) to WGS 84 - see code 1691.,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-10-19 00:00:00,,1,1
+1577,American Samoa 1962 to WGS 84 (1),transformation,4169,4326,NIMA-Asm,1,1027,For military purposes. One sigma uncertainty is 25m in each axis.,9603,,,Transformation based on observations at 2 stations in 1993.,NIMA TR8350.2 revision of January 2000.,EPSG,2000-10-19 00:00:00,,1,0
+1578,American Samoa 1962 to NAD83(HARN) (1),transformation,4169,4152,NGS-Asm W,1,2288,Geodetic survey. No accuracy stated.,9613,,,NADCON method which expects longitudes positive west; EPSG GeogCRSs American Samoa 1962 and NAD83(HARN) (codes 4169 and 4159) have longitudes positive east. NADCON expects latitudes in northern hemisphere and values must be made positive prior to input.,ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon/samoa_readme.txt,EPSG,2000-10-19 00:00:00,,1,0
+1579,American Samoa 1962 to NAD83(HARN) (2),transformation,4169,4152,NGS-Asm E,2,2289,Geodetic survey. No accuracy stated.,9613,,,NADCON method which expects longitudes positive west; EPSG GeogCRSs American Samoa 1962 and NAD83(HARN) (codes 4169 and 4159) have longitudes positive east. NADCON expects latitudes in northern hemisphere and values must be made positive prior to input.,ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon/samoa_readme.txt,EPSG,2000-10-19 00:00:00,,1,0
+1580,NAD83(HARN) to WGS 84 (1),transformation,4152,4326,EPSG-Usa,1,2424,Approximation at the +/- 1m level assuming that NAD83(HARN) is equivalent to WGS 84.,9603,,,For many purposes NAD83(HARN) can be considered to be coincident with WGS 84.,EPSG,EPSG,2000-10-19 00:00:00,,1,0
+1581,SIRGAS to WGS 84 (1),transformation,4170,4326,NIMA-S America,1,1341,For military purposes.,9603,,,,NIMA TR8350.2 revision of January 2000.,EPSG,2000-10-19 00:00:00,2001.33,1,0
+1582,PSAD56 to WGS 84 (10),transformation,4248,4326,TOT-Bol Mad,10,2400,Oil exploration.,9603,,,Derived May 1995 by Geoid for Total. OSU91A geoid model used.,TotalFinaElf,EPSG,2000-10-19 00:00:00,,1,0
+1583,PSAD56 to WGS 84 (11),transformation,4248,4326,TOT-Bol B20,11,2401,Oil exploration.,9603,,,Derived July 1997 by Geoid from data recorded by UGA for Total. OSU91A geoid model used.,Total-Fina,EPSG,2000-10-19 00:00:00,,1,0
+1584,Deir ez Zor to WGS 72BE (1),transformation,4227,4324,GECO-Syr,1,2329,Oil exploration.,9603,,,Derived by Transit at station 254 Deir.,Elf,EPSG,2000-10-19 00:00:00,,1,0
+1585,Deir ez Zor to WGS 84 (2),transformation,4227,4326,IGN-Syr,2,1227,?,9603,,,,IGN Paris,EPSG,2000-10-19 00:00:00,,1,0
+1586,Deir ez Zor to WGS 84 (3),transformation,4227,4326,SHL-Syr Whal,3,2327,Oil exploration.,9606,,,Derived in 1995.,Elf,EPSG,2000-10-19 00:00:00,,1,0
+1587,Deir ez Zor to WGS 84 (4),transformation,4227,4326,ELF-Syr Shad,4,2328,Oil exploration.,9603,,,Derived at four stations by Topnav in 1997.,Elf,EPSG,2000-10-19 00:00:00,,1,0
+1588,ED50 to ETRS89 (1),transformation,4230,4258,NMA-Nor N65 1997,1,2332,Accuracy 1m.,9606,,,Included in Statens Kartverk programme wsktrans from 1997. The same parameter values were adopted for ED50 to WGS84 (variant 23) transformation offshore Norway north of 62N from April 2001 - see code 1612.,Statens Kartverk.,EPSG,2001-06-05 00:00:00,2001.06,1,0
+1589,ED50 to ETRS89 (3),transformation,4230,4258,NMA-Nor 6265W,3,2333,Accuracy 2m.,9620,,,Included in Statens Kartverk programme wsktrans from 1997. See ED50 to WGS84 (23) (code 1612) for a simpler transformation accurate to better than 4m.,Statens Kartverk,EPSG,2000-10-19 00:00:00,,1,0
+1590,ED50 to WGS 84 (22),transformation,4230,4326,NMA-Nor 6265W 1997,22,2333,Oil exploration before 2001.,9620,,,Included in Statens Kartverk programme wsktrans between 1997 (v3.1) and 2001 (v4.0). Superseded ED50 to WGS 84 (20) (code 1450) in 1997. Superseded by ED50 to WGS 84 (23) (code 1612) in April 2001.,Statens Kartverk.,EPSG,2000-10-19 00:00:00,,1,0
+1591,RGF93 to ETRS89 (1),transformation,4171,4258,IGN-Fra,1,1096,RGF93 is a regional realisation of ETRS89.,9603,,,May be taken as approximate transformation RGF93 to WGS 84 - see code 1671.,TotalFinaElf,EPSG,2000-10-10 00:00:00,,1,0
+1592,Timbalai 1948 to WGS 84 (2),transformation,4298,4326,BSP-Brn,2,2348,Offshore oil exploration.,9603,,,These parameters produce a coordinate difference of 10m horizontally and 50m vertically compared to Timbalai 1948 to WGS 84 (3) (code 1615).,Brunei Shell Petroleum,EPSG,2002-10-19 00:00:00,,1,0
+1593,AGD84 to GDA94 (4),transformation,4203,4283,DOLA-Aus WA 0.1m,4,1280,0.1m accuracy.,9615,,,Replaced AGD84 to GDA94 (3) (code 1559) but then superseded by AGD84 to GDA94 (5) (code 1804). Input expects longitudes to be positive west; EPSG GeogCRS AGD84 (code 4203) and GDA94 (code 4283) both have longitudes positive east.,http://www.dola.wa.gov.au/lotl/survey_geodesy/gda1994/download.html,EPSG,2000-10-19 00:00:00,,1,0
+1594,AGD66 to GDA94 (8),transformation,4202,4283,OSG-Tas 1m,8,1282,Recommended for mid-accuracy use in Tasmania. 1m accuracy.,9607,,,Supersedes AGD66 to GDA94 (3) (code 1459) from August 2000. For higher accuracy requirements see AGD66 to GDA94 (6) (code 1506). May be taken as approximate transformation AGD66 to WGS 84 - see code 1667.,GDA Technical Manual (August 2000 revision) and http://www.delm.tas.gov.au/osg/Geodetic_transform.htm,EPSG,2000-10-19 00:00:00,,1,0
+1595,AGD66 to GDA94 (9),transformation,4202,4283,Auslig-NT 1m,9,2284,Recommended for mid-accuracy use in Northern Territory. 1m accuracy.,9607,,,For higher accuracy requirements see AGD66 to GDA94 (7) (code 1507). May be taken as approximate transformation AGD66 to WGS 84 - see code 1668.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,2000-10-19 00:00:00,,1,0
+1596,AGD66 to GDA94 (10),transformation,4202,4283,OSG-Aus SE 0.1m,10,2287,0.1m accuracy.,9615,,,In Victoria supersedes AGD66 to GDA94 (5) (code 1464). Superseded by AGD66 to GDA94 (11) (code 1803). Input expects longitudes to be positive west; EPSG GeogCRS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,http://www.osg.vic.gov.au/tools.htm,EPSG,2000-10-19 00:00:00,,1,0
+1597,Bogota 1975 to WGS 84 (2),transformation,4218,4326,BP-Col CusCup,2,2315,Oil exploration.,9603,,,Derived in 1995 by WGC at first order stations Recreo and Mena via multi-day ties to 4 IGS stations. Residuals under 20cm.,Various industry sources,EPSG,2000-10-19 00:00:00,,1,0
+1598,POSGAR to WGS 84 (1),transformation,4172,4326,EPSG-Arg,1,1033,?,9603,,,,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+1599,ATS77 to NAD83(CSRS98) (2),transformation,4122,4140,PEI DOT-Can PEI,2,1533,?,9615,,,Can be taken as an approximate transformation ATS77 to WGS 84 - see code 1689.,PEI Department of Transportation & Public Works,EPSG,2000-10-19 00:00:00,,1,1
+1600,NAD27 to NAD83(CSRS98) (2),transformation,4267,4140,SK PMC-Can SK,2,2375,Accuracy 1-2 metres.,9615,,,Can be taken as an approximate transformation NAD27 to WGS 84 - see code 1703.,Dir Geodetic Surveys; SaskGeomatics Div.; Saskatchewan Property Management Company.,EPSG,2000-10-19 00:00:00,,1,1
+1601,NAD83 to NAD83(CSRS98) (2),transformation,4269,4140,SK PMC-Can SK,2,2375,Accuracy 1-2 metres.,9615,,,Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1697.,Dir Geodetic Surveys; SaskGeomatics Div.; Saskatchewan Property Management Company.,EPSG,2000-10-19 00:00:00,,1,1
+1602,NAD83 to NAD83(CSRS98) (3),transformation,4267,4140,AB Env-Can AB,2,2376,Accuracy 1-2 metres.,9615,,,"This gridded difference file AB_CSRS.DAC will need to be renamed to AB_CSRS.gsb to run in some software suites. Formats identical, but AB file is provincial fit only.",Geodetic Control Section; Land and Forest Svc; Alberta Environment; http://www.gov.ab.ca/env/land/dos/ or email to geoff.banham at gov.ab.ca,EPSG,2000-10-19 00:00:00,,1,1
+1603,NAD27 to ATS77 (1),transformation,4267,4122,SNB-Can NB,1,1447,?,9634,,,For reverse transformation see ATS77 to NAD27 (1) (code 1606),Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,1,0
+1604,NAD27 to ATS77 (2),transformation,4267,4122,SNB-Can PEI,2,1533,?,9634,,,For reverse transformation see ATS77 to NAD27 (2) (code 1607),Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,1,0
+1605,NAD27 to ATS77 (3),transformation,4267,4122,SNB-Can NS,3,2313,?,9634,,,For reverse transformation see ATS77 to NAD27 (3) (code 1608),Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,1,0
+1606,ATS77 to NAD27 (1),transformation,4122,4267,SNB-Can NB,1,1447,?,9634,,,For reverse transformation see NAD27 to ATS77 (1) (code 1603),Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,1,0
+1607,ATS77 to NAD27 (2),transformation,4122,4267,SNB-Can NS,2,2313,?,9634,,,For reverse transformation see NAD27 to ATS77 (2) (code 1604),Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,1,0
+1608,ATS77 to NAD27 (3),transformation,4122,4267,SNB-Can PEI,3,1533,?,9634,,,For reverse transformation see NAD27 to ATS77 (3) (code 1605),Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,1,0
+1609,BD72 to WGS 84 (1),transformation,4313,4326,IGN-Bel 7,1,1044,For applications to an accuracy of 1 metre.,9607,,,,IGN Brussels www.ngi.be/FR/FR2-1-5-1.shtm,EPSG,2000-10-19 00:00:00,,1,0
+1610,BD72 to WGS 84 (2),transformation,4313,4326,IGN-Bel 3,2,1044,For applications to an accuracy of 5 metres.,9603,,,,IGN Brussels www.ngi.be/FR/FR2-1-5-1.shtm,EPSG,2000-10-19 00:00:00,,1,0
+1611,IRENET95 to ETRS89 (1),transformation,4173,4258,OSI-Ire,1,1305,?,9603,,,May be taken as approximate transformation IRENET95 to WGS 84 - see code 1678.,Ordnance Survey of Ireland,EPSG,2000-10-19 00:00:00,,1,0
+1612,ED50 to WGS 84 (23),transformation,4230,4326,EPSG-Nor N62 2001,23,2601,Oil industry offshore.,9606,,,"Parameter values are taken from ED50 to ETRS89 (1), code 1588. Adopted for ED50 to WGS84 transformations offshore Norway north of 62N from April 2001 when it superseded code 1590. Included in Statens Kartverk programme wsktrans from v4.0.",EPSG Guidance Note #10,EPSG,2001-06-05 00:00:00,,1,0
+1613,ED50 to WGS 84 (24),transformation,4230,4326,EPSG-Nor S62 2001,24,2334,Approximation to 1 metre for oil industry use.,9606,,,"Approximation to 1 metre of concatenated transformation ED50 to WGS 84 (14), code 8046. 8046 remains the transformation promulgated by Statens Kartverk but 1613 recommended by EPSG for practical oil industry usage.",EPSG Guidance Note #10,EPSG,2001-06-05 00:00:00,,1,0
+1614,Sierra Leone 1968 to WGS 84 (1),transformation,4175,4326,NIMA-Sle,1,1209,Accuracy +/- 15m in each axis.,9603,,,Determined at 8 stations. Info. source has the source CRS as Sierra Leone 1960. Sierra Leone 1968 is a readjustment of the 1960 network: coordinates changed by less than 3 metres.,"NIMA TR8350.2 revision 3, 1997.",EPSG,2001-06-05 00:00:00,,1,0
+1615,Timbalai 1948 to WGS 84 (3),transformation,4298,4326,SD-Brn,3,2349,Topographic and engineering survey onshore.,9603,,,These parameters produce a coordinate difference of 10m horizontally and 50m vertically compared to Timbalai 1948 to WGS 84 (2) (code 1592).,Brunei Survey Department,EPSG,2001-06-05 00:00:00,,1,0
+1616,PSD93 to WGS 72 (1),transformation,4134,4322,PDO-Omn 93,1,1183,Oil exploration. Residuals 1.2m at 67% probability level.,9606,,,,Petroleum Development Oman,EPSG,2001-06-05 00:00:00,,1,0
+1617,PSD93 to WGS 84 (3),transformation,4134,4326,Tot-Omn 95,3,2404,Oil exploration.,9606,,,Accuracy better than 0.5m in block 4.,TotalFinaElf,EPSG,2001-06-05 00:00:00,,1,0
+1618,MGI to WGS 84 (3),transformation,4312,4326,BEV-Aut,3,1037,For applications to an accuracy of 1.5 metres.,9606,,,Same transformation parameters but to lesser precision used for MGI to ETRS89 (1) (code 1619).,Bundesamt f�r Eich- und Vermessungswesen via EuroGeographics http://crs.ifag.de,EPSG,2001-06-05 00:00:00,,1,0
+1619,MGI to ETRS89 (1),transformation,4312,4258,BEV-Aut,1,1037,For applications to an accuracy of 1.5 metres.,9606,,,Same transformation parameters but to greater precision used for MGI to WGS 84 (3) (code 1618).,Bundesamt f�r Eich- und Vermessungswesen via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1620,MGI to ETRS89 (2),transformation,4312,4258,DGU-Hrv,2,1076,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation MGI to WGS 84 - see code 1621.,Drzavna Geodetska Uprava via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1621,MGI to WGS 84 (4),transformation,4312,4326,EPSG-Hrv,4,1076,For applications to an accuracy of 1 metre.,9606,,,Parameter values from MGI to ETRS89 (2) (code 1620). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1622,S-JTSK to ETRS89 (1),transformation,4156,4258,CUZK-Cze,1,1079,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation S-JTSK to WGS 84 - see code 1623.,Cesky Urad Zememericky a Katastraln via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1623,S-JTSK to WGS 84 (1),transformation,4156,4326,EPSG-Cze,1,1079,For applications to an accuracy of 1 metre.,9606,,,Parameter values from S-JTSK to ETRS89 (1) (code 1622). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1624,S-JTSK to ETRS89 (2),transformation,4156,4258,UGKK-Svk,2,1211,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation S-JTSK to WGS 84 - see code 1625.,"Urad Geodezie, Kartografie a Katastra via EuroGeographics; http://crs.ifag.de/",EPSG,2001-06-05 00:00:00,,1,0
+1625,S-JTSK to WGS 84 (2),transformation,4156,4326,EPSG-Svk,2,1211,For applications to an accuracy of 1 metre.,9606,,,Parameter values from S-JTSK to ETRS89 (2) (code 1624). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1626,ED50 to ETRS89 (4),transformation,4230,4258,KMS-Dnk,4,1080,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation ED50 to WGS 84 - see code 1627.,Kort & Matrikelstyrelsen via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1627,ED50 to WGS 84 (25),transformation,4230,4326,EPSG-Dnk,25,1080,For applications to an accuracy of 1 metre.,9606,,,Parameter values from ED50 to ETRS89 (4) (code 1626). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1628,ED50 to ETRS89 (5),transformation,4230,4258,DGC-Gib,5,1105,For applications to an accuracy of 1 metre.,9603,,,May be taken as approximate transformation ED50 to WGS 84 - see code 1629.,UK Defence Geographic and Imagery Intelligence Agency via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1629,ED50 to WGS 84 (26),transformation,4230,4326,EPSG-Gib,26,1105,For applications to an accuracy of 1 metre.,9603,,,Parameter values from ED50 to ETRS89 (5) (code 1628). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1630,ED50 to ETRS89 (6),transformation,4230,4258,IGN-Esp Bal,6,2335,For applications to an accuracy of 1.5 metres.,9606,,,May be taken as approximate transformation ED50 to WGS 84 - see code 1631.,Centro Nacional de Informacion Geografica via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1631,ED50 to WGS 84 (27),transformation,4230,4326,EPSG-Esp Bal,27,2335,For applications to an accuracy of 1.5 metres.,9606,,,Parameter values from ED50 to ETRS89 (6) (code 1630). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1632,ED50 to ETRS89 (7),transformation,4230,4258,IGN-Esp,7,2336,For applications to an accuracy of 1.5 metres.,9606,,,May be taken as approximate transformation ED50 to WGS 84 - see code 1633.,Centro Nacional de Informacion Geografica via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1633,ED50 to WGS 84 (28),transformation,4230,4326,EPSG-Esp,28,2336,For applications to an accuracy of 1.5 metres.,9606,,,Parameter values from ED50 to ETRS89 (7) (code 1632). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1634,ED50 to ETRS89 (8),transformation,4230,4258,IGN-Esp NW,8,2337,For applications to an accuracy of 1.5 metres.,9606,,,May be taken as approximate transformation ED50 to WGS 84 - see code 1635.,Centro Nacional de Informacion Geografica via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1635,ED50 to WGS 84 (29),transformation,4230,4326,EPSG-Esp NW,29,2337,For applications to an accuracy of 1.5 metres.,9606,,,Parameter values from ED50 to ETRS89 (8) (code 1634). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1638,KKJ to ETRS89 (1),transformation,4123,4258,NLS-Fin,1,1095,For applications to an accuracy of 1 to 2 metres.,9606,,,May be taken as approximate transformation KKJ to WGS 84 - see code 1639.,National Land Survey of Finland via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1639,KKJ to WGS 84 (1),transformation,4123,4326,EPSG-Fin,1,1095,For applications to an accuracy of 1 to 2 metres.,9606,,,Parameter values from KKJ to ETRS89 (1) (code 1638). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1640,TM65 to ETRS89 (1),transformation,4299,4258,OSI-Ire,1,1305,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation TM65 to WGS 84 - see code 1641.,Ordnance Survey Ireland via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1641,TM65 to WGS 84 (2),transformation,4299,4326,EPSG-Ire,2,1305,For applications to an accuracy of 1 metre.,9606,,,Parameter values from TM65 to ETRS89 (1) (code 1640). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1642,Luxembourg 1930 to ETRS89 (1),transformation,4181,4258,ACT-Lux,1,1146,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation Luxembourg 1930 to WGS 84 - see code 1643.,Administration du Cadastre et de la Topographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1643,Luxembourg 1930 to WGS 84 (1),transformation,4181,4326,EPSG-Lux,1,1146,For applications to an accuracy of 1 metre.,9606,,,Parameter values from Luxembourg 1930 to ETRS89 (1) (code 1642). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1644,Pulkovo 1942(58) to ETRS89 (1),transformation,4179,4258,GUGK-Pol,1,1192,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation Pulkovo 1942(58) to WGS 84 - see code 1645.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1645,Pulkovo 1942(58) to WGS 84 (1),transformation,4179,4326,EPSG-Pol,1,1192,For applications to an accuracy of 1 metre.,9606,,,Parameter values from Pulkovo 1942(58) to ETRS89 (1) (code 1644). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1646,CH1903 to ETRS89 (1),transformation,4149,4258,BfL-Che,1,1286,Accuracy 1.5 metres.,9603,,,These parameters are strictly from CH1903+ to CHTRF95 or ETRS89 but are used as from CH1903 as an approximation which is within the accuracy of the distortions in the CH1903 network. They are given to full precision as CH1903 to WGS 84 (1) (code 1510).,Bundesamt f�r Landestopographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1647,CH1903+ to ETRS89 (1),transformation,4150,4258,BfL-Che,1,1286,For applications to an accuracy of 0.1 metres.,9603,,,This transformation is also given as CH1903+ to CHTRF95 (1) (code 1509). CHTRF95 is a local realisation of ETRS89.,Bundesamt f�r Landestopographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1648,EST97 to ETRS89 (1),transformation,4180,4258,NLB-Est,1,1090,EST97 is a realisation of ETRS89.,9603,,,May be taken as approximate transformation EST97 to WGS 84 - see code 1649.,Estonian National Land Board via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1649,EST97 to WGS 84 (1),transformation,4180,4326,EPSG-Est,1,1090,For applications to an accuracy of 1 metre.,9603,,,Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1650,ED50 to ETRS89 (10),transformation,4230,4258,IGN-Fra,10,1096,For applications to an accuracy of 2 metres.,9603,,,These same parameter values are used to transform to WGS 84. See ED50 to WGS 84 (17) (code 1275).,Institut Geographique National via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1651,NTF to ETRS89 (1),transformation,4275,4258,IGN-Fra,1,1096,For applications to an accuracy of 2 metres.,9603,,,These same parameter values are used to transform to WGS 84. See NTF to WGS 84 (1) (code 1193).,Institut Geographique National via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1652,BD72 to ETRS89 (1),transformation,4313,4258,IGN-Bel,1,1044,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation BD72 to WGS 84 - see code 1609.,Institut Geographique National via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1653,NGO 1948 to ETRS89 (1),transformation,4273,4258,SKV-Nor,1,1352,For applications to an accuracy of 3 metres.,9606,,,May be taken as approximate transformation NGO 1948 to WGS 84 - see code 1654.,Statens Kartverk via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1654,NGO 1948 to WGS 84 (1),transformation,4273,4326,EPSG-Nor,1,1352,For applications to an accuracy of 3 metres.,9606,,,Parameter values from NGO 1948 to ETRS89 (1) (code 1653). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1655,Lisbon to ETRS89 (1),transformation,4207,4258,ICC-Prt 2000,1,1294,For applications to an accuracy of 3 metres.,9606,,,Derived in 2000 at 8 stations. Superseded by 2001 derivation (code 1790).,Instituto Portugues de Cartografia e Cadastro via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1656,Lisbon to WGS 84 (1),transformation,4207,4258,EPSG-Prt 2000,1,1294,For applications to an accuracy of 3 metres.,9606,,,Parameter values from Lisbon to ETRS89 (1) (code 1655). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,1
+1657,Datum 73 to ETRS89 (1),transformation,4274,4258,ICC-Prt 2000,1,1294,For applications to an accuracy of 2 metres.,9606,,,Derived in 2000 at 8 stations. Superseded by 2001 derivation (code 1792).,Instituto Portugues de Cartografia e Cadastro via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1658,Datum 73 to WGS 84 (1),transformation,4274,4258,EPSG-Prt 2000,1,1294,For applications to an accuracy of 2 metres.,9606,,,Parameter values from Datum 73 to ETRS89 (1) (code 1657). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,1
+1659,Monte Mario to ETRS89 (1),transformation,4265,4258,IGM-Ita main,1,2372,Accuracy: 4 metres,9606,,,May be taken as approximate transformation Monte Mario to WGS 84 - see code 1660.,Istituto Geografico Militare Italiano via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1660,Monte Mario to WGS 84 (4),transformation,4265,4326,EPSG-Ita main,4,2372,Accuracy: 4 metres,9606,,,Parameter values from Monte Mario to ETRS89 (1) (code 1659). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1661,Monte Mario to ETRS89 (2),transformation,4265,4258,IGM-Ita Sar,2,2339,Accuracy: 4 metres,9606,,,May be taken as approximate transformation Monte Mario to WGS 84 - see code 1662.,Istituto Geografico Militare Italiano via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1662,Monte Mario to WGS 84 (2),transformation,4265,4326,EPSG-Ita Sar,2,2339,Accuracy: 4 metres,9606,,,Parameter values from Monte Mario to ETRS89 (2) (code 1661). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1663,Monte Mario to ETRS89 (3),transformation,4265,4258,IGM-Ita Sic,3,2340,Accuracy: 4 metres,9606,,,May be taken as approximate transformation Monte Mario to WGS 84 - see code 1664.,Istituto Geografico Militare Italiano via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1664,Monte Mario to WGS 84 (3),transformation,4265,4326,EPSG-Ita Sic,3,2340,Accuracy: 4 metres,9606,,,Parameter values from Monte Mario to ETRS89 (3) (code 1663). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1665,AGD66 to WGS 84 (12),transformation,4202,4326,EPSG-ACT 1m,12,2283,Recommended for mid-accuracy use in A.C.T. 1m accuracy.,9607,,,Parameter values from AGD66 to GDA94 (2) (code 1458). Assumes GDA94 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1666,AGD66 to WGS 84 (13),transformation,4202,4326,EPSG-NSW Vic 1m,13,2286,Recommended for mid-accuracy use in NSW and Victoria. 1m accuracy.,9607,,,Parameter values from AGD66 to GDA94 (4) (code 1460). Assumes GDA94 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1667,AGD66 to WGS 84 (14),transformation,4202,4326,EPSG-Tas 1m,14,1282,Recommended for mid-accuracy use in Tasmania. 1m accuracy.,9607,,,Parameter values from AGD66 to GDA94 (8) (code 1594). Assumes GDA94 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1668,AGD66 to WGS 84 (15),transformation,4202,4326,EPSG-NT 1m,15,2284,Recommended for mid-accuracy use in Northern Territory. 1m accuracy.,9607,,,Parameter values from AGD66 to GDA94 (9) (code 1595). Assumes GDA94 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1669,AGD84 to WGS 84 (7),transformation,4203,4326,EPSG-Aus 1m,7,1036,1m accuracy.,9607,,,Parameter values from AGD84 to GDA94 (2) (code 1280). Assumes GDA94 and WGS 84 can be considered the same to within the accuracy of the transformation. Supersedes AGD84 to WGS 84 (2) (code 1236).,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1670,NZGD49 to WGS 84 (3),transformation,4272,4326,EPSG-Nzl 1m,3,1175,Accuracy about 1m.,9615,,,Parameter file is from NZGD49 to NZGD2000 (3) (code 1568) and assumes WGS 84 is coincident with NZGD2000 to the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1671,RGF93 to WGS 84 (1),transformation,4171,4326,EPSG-Fra,1,1096,Approximation at the +/- 1m level.,9603,,,Parameter values from RGF93 to ETRS89 (1) (code 1591) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1672,Amersfoort to WGS 84 (2),transformation,4289,4326,EPSG-Nld,2,1275,Approximation at the +/- 1m level.,9607,,,Parameter values from Amersfoort to ETRS89 (2) (code 1751) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation. Supersedes Amersfoort to WGS 84 (1) (code 1112).,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1673,DHDN to WGS 84 (1),transformation,4314,4326,EPSG-Deu W,1,2326,For applications with an accuracy at 5 m level.,9607,,,Parameter values from DHDN to ETRS89 (1) (code 1309) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1674,Pulkovo 1942(83) to ETRS89 (1),transformation,4178,4258,IfAG-Deu E,1,1343,Residuals under 2 m.,9607,,,Mean of 20 stations. May be taken as approximate transformation to WGS 84 - see code 1675. Also given by EuroGeographics at http://crs.ifag.de/ as a Position Vector transformation with changed values for rotations. Superseded in 2001 by code 1775.,Institute for Cartography and Geodesy; Leipzig.,EPSG,2001-08-15 00:00:00,,1,0
+1675,Pulkovo 1942(83) to WGS 84 (1),transformation,4178,4326,EPSG-Deu E,1,1343,Residuals under 2 m.,9607,,,Parameter values from Pulkovo 1942(83) to ETRS89 (1) (code 1674) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1676,CH1903+ to WGS 84 (1),transformation,4150,4326,BfL-CH,1,1286,Approximation at the +/- 1m level.,9603,,,Parameter values are from CH1903+ to CHTRF95 (1) (code 1509) assuming that CHTRF95 is equivalent to WGS 84. That transformation is also given as CH1903+ to ETRS89 (1) (code 1647). CHTRF95 is a realisation of ETRS89.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1677,HD72 to WGS 84 (1),transformation,4237,4326,EPSG-Hun,1,1119,Approximation at the +/- 1m level.,9607,,,Parameter values taken from HD72 to ETRS89 (1) (code 1273) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,1
+1678,IRENET95 to WGS 84 (1),transformation,4173,4326,EPSG-Ire,1,1305,Approximation at the +/- 1m level.,9603,,,Assumes that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1679,Pulkovo 1942 to WGS 84 (2),transformation,4284,4326,EPSG-Ltu,2,1145,Approximation at the +/- 1m level.,9607,,,Parameter values taken from Pulkovo 1942 to LKS94(ETRS89) (1) (code 1274) assuming that LKS94(ETRS89) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1680,RT90 to WGS 84 (1),transformation,4124,4326,EPSG-Swe,1,1225,Approximation at the +/- 1m level.,9607,,,Parameter values from RT90 to ETRS89 (1) (code 1437) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1681,OSGB 1936 / British National Grid to WGS 84 (1),transformation,27700,4326,EPSG-Gbr,1,1264,Accuracy about 0.5m.,9633,,,Parameter values taken from OSGB 1936 / British National Grid to ETRS89 (1) (code 1036) assuming that ETRS89 is coincident with WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1682,South Yemen to WGS 84 (1),transformation,4164,4326,EPSG-Yem South,1,1340,Approximation at the +/- 1m level.,9603,,,Parameter values taken from South Yemen to Yemen NGN96 (1) (code 1539) assuming that NGN96 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1683,Tete to WGS 84 (1),transformation,4127,4326,EPSG-Moz,1,1167,Residuals as high as 30 metres.,9607,,,Parameter values taken from Tete to Moznet (1) (code 1297) assuming that Moznet is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1684,Tete to WGS 84 (2),transformation,4127,4326,EPSG-Moz A,2,2350,Residuals are generally under 1 metre.,9607,,,Parameter values taken from Tete to Moznet (2) (code 1298) assuming that Moznet is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1685,Tete to WGS 84 (3),transformation,4127,4326,EPSG-Moz B,3,2351,Residuals are generally under 4 metres.,9607,,,Parameter values taken from Tete to Moznet (3) (code 1299) assuming that Moznet is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1686,Tete to WGS 84 (4),transformation,4127,4326,EPSG-Moz C,4,2352,Residuals are generally under 3 metres.,9607,,,Parameter values taken from Tete to Moznet (4) (code 1300) assuming that Moznet is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1687,Tete to WGS 84 (5),transformation,4127,4326,EPSG-Moz D,5,2353,Residuals are 5-10 metres.,9607,,,Parameter values taken from Tete to Moznet (5) (code 1301) assuming that Moznet is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1688,ATS77 to WGS 84 (1),transformation,4122,4326,EPSG-Can NB,1,1447,Approximation at the +/- 1m level.,9615,,,Parameter file is from ATS77 to NAD83(CSRS) (1) (code 1841) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1689,ATS77 to WGS 84 (2),transformation,4122,4326,EPSG-Can PEI,2,1533,Approximation at the +/- 1m level.,9615,,,Parameter file is from ATS77 to NAD83(CSRS) (2) (code 1846) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1690,NAD27(76) to WGS 84 (1),transformation,4608,4326,EPSG-Can On,1,1367,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD27(76) to NAD83 (1) (code 1463) assuming that NAD83 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1691,NAD27(CGQ77) to WGS 84 (3),transformation,4609,4326,EPSG-Can Qc NT2,3,1368,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD27(CGQ77) to NAD83(CSRS) (1) (code 1845) assuming that NAD83(CSRS98) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1692,NAD27 to WGS 84 (34),transformation,4267,4326,EPSG-Can QC,34,1368,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD27 to NAD83(CSRS) (1) (code 1844) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1693,NAD27 to WGS 84 (33),transformation,4267,4326,EPSG-Can,33,1061,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD27 to NAD83 (4) (code 1313) assuming that NAD83 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1694,American Samoa 1962 to WGS 84 (2),transformation,4169,4326,EPSG-Asm W,2,2288,Accuracy 1m.,9613,,,"Parameter files are from American Samoa 1962 to NAD83(HARN) (1) (code 1578), but for many purposes NAD83(HARN) can be considered to be coincident with WGS 84 within the accuracy of the transformation.",EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1695,American Samoa 1962 to WGS 84 (3),transformation,4169,4326,EPSG-Asm E,3,2289,Accuracy 1m.,9613,,,"Parameter files are from American Samoa 1962 to NAD83(HARN) (2) (code 1579), but for many purposes NAD83(HARN) can be considered to be coincident with WGS 84 within the accuracy of the transformation.",EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1696,NAD83 to WGS 84 (6),transformation,4269,4326,EPSG-Can QC,6,1368,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD83 to NAD83(CSRS) (1) (code 1843) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1697,NAD83 to WGS 84 (7),transformation,4269,4326,EPSG-Can SK,7,2375,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD83 to NAD83(CSRS8) (2) (code 1848) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1698,St. George Island to WGS 84 (1),transformation,4138,4326,EPSG-Usa AK StG,1,1331,Approximation at the +/- 1 to 2m level.,9613,,,Parameter files are from St. George Island to NAD83 (1) (code 1457) assuming that NAD83 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1699,St. Lawrence Island to WGS 84 (1),transformation,4136,4326,EPSG-Usa AK StL,1,1332,Approximation at the +/- 1 to 2m level.,9613,,,Parameter files are from St. Lawrence Island to NAD83 (1) (code 1455) assuming that NAD83 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1700,St. Paul Island to WGS 84 (1),transformation,4137,4326,EPSG-Usa AK StP,1,1333,Approximation at the +/- 1 to 2m level.,9613,,,Parameter files are from St. Paul Island to NAD83 (1) (code 1456) assuming that NAD83 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1701,NZGD49 to NZGD2000 (2),transformation,4272,4167,OSG-Nzl 4m,2,1175,4m accuracy.,9607,,,For better accuracy use NZGD49 to NZGD2000 (3) (code 1568).,http://www.linz.govt.nz/services/surveysystem/osgpublications/nzgd2000_trans.html,EPSG,2001-08-28 00:00:00,,1,0
+1702,NAD83 to WGS 84 (8),transformation,4269,4326,EPSG-Can AB,8,2376,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD83 to NAD83(CSRS) (3) (code 1849) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation. This file AB_CSRS.DAC will need to be renamed to AB_CSRS.gsb to run in some sodtware.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1703,NAD27 to WGS 84 (32),transformation,4267,4326,EPSG-Can SK,32,2375,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD27 to NAD83(CSRS98) (1) (code 1600) assuming that NAD83(CSRS98) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1704,NAD83 to NAD83(HARN) (40),transformation,4269,4152,NGS-Usa AR,40,1374,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1708.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+1705,NAD83 to NAD83(HARN) (41),transformation,4269,4152,NGS-Usa IA,41,1384,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1709.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+1706,NAD83 to NAD83(HARN) (42),transformation,4269,4152,NGS-Usa MN,42,1392,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1710.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+1707,NAD83 to NAD83(HARN) (43),transformation,4269,4152,NGS-Usa MO,43,1394,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east. May be taken as approximate transformation NAD83-WGS 84 - see code 1711.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+1708,NAD83 to WGS 84 (12),transformation,4269,4326,EPSG-USA Ar,12,1374,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (40) (code 1704) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1709,NAD83 to WGS 84 (13),transformation,4269,4326,EPSG-Usa IA,13,1384,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (41) (code 1705) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1710,NAD83 to WGS 84 (14),transformation,4269,4326,EPSG-Usa MN,14,1392,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (42) (code 1706) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1711,NAD83 to WGS 84 (15),transformation,4269,4326,EPSG-Usa MO,15,1394,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (43) (code 1707) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1712,NAD83 to WGS 84 (16),transformation,4269,4326,EPSG-Usa CO,16,1376,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (5) (code 1478) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1713,NAD83 to WGS 84 (17),transformation,4269,4326,EPSG-Usa GA,17,1380,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (6) (code 1479) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1714,NAD83 to WGS 84 (18),transformation,4269,4326,EPSG-Usa FL,18,1379,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (7) (code 1480) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1715,NAD83 to WGS 84 (19),transformation,4269,4326,EPSG-Usa ID MT e,19,2382,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (8) (code 1481) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1716,NAD83 to WGS 84 (20),transformation,4269,4326,EPSG-Usa ID MT w,20,2383,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (9) (code 1482) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1717,NAD83 to WGS 84 (21),transformation,4269,4326,EPSG-Usa AL,21,1372,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (1) (code 1474) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1718,NAD83 to WGS 84 (22),transformation,4269,4326,EPSG-Usa KY,22,1386,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (10) (code 1483) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1719,NAD83 to WGS 84 (23),transformation,4269,4326,EPSG-Usa LA,23,1387,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (11) (code 1484) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1720,NAD83 to WGS 84 (24),transformation,4269,4326,EPSG-Usa DE MD,24,2377,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (12) (code 1485) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1721,NAD83 to WGS 84 (25),transformation,4269,4326,EPSG-Usa ME,25,1388,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (13) (code 1486) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1722,NAD83 to WGS 84 (26),transformation,4269,4326,EPSG-Usa MI,26,1391,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (14) (code 1487) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1723,NAD83 to WGS 84 (27),transformation,4269,4326,EPSG-Usa MS,27,1393,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (15) (code 1488) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1724,NAD83 to WGS 84 (28),transformation,4269,4326,EPSG-Usa NE,28,1396,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (16) (code 1489) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1725,NAD83 to WGS 84 (29),transformation,4269,4326,EPSG-Usa NewEng,29,2378,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (17) (code 1490) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1726,NAD83 to WGS 84 (30),transformation,4269,4326,EPSG-Usa NM,30,1400,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (18) (code 1491) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1727,NAD83 to WGS 84 (31),transformation,4269,4326,EPSG-Usa NY,31,1401,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (19) (code 1492) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1728,NAD83 to WGS 84 (32),transformation,4269,4326,EPSG-Usa AZ,32,1373,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (2) (code 1475) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1729,NAD83 to WGS 84 (33),transformation,4269,4326,EPSG-Usa ND,33,1403,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (20) (code 1493) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1730,NAD83 to WGS 84 (34),transformation,4269,4326,EPSG-Usa OK,34,1405,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (21) (code 1494) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1731,NAD83 to WGS 84 (35),transformation,4269,4326,EPSG-PRVI,35,1335,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (22) (code 1495) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1732,NAD83 to WGS 84 (36),transformation,4269,4326,EPSG-Usa SD,36,1410,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (23) (code 1496) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1733,NAD83 to WGS 84 (37),transformation,4269,4326,EPSG-Usa TN,37,1411,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (24) (code 1497) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1734,NAD83 to WGS 84 (38),transformation,4269,4326,EPSG-Usa TX e,38,2379,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (25) (code 1498) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1735,NAD83 to WGS 84 (39),transformation,4269,4326,EPSG-Usa TX w,39,2380,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (26) (code 1499) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1736,NAD83 to WGS 84 (40),transformation,4269,4326,EPSG-Usa VA,40,1415,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (27) (code 1500) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1737,NAD83 to WGS 84 (41),transformation,4269,4326,EPSG-Usa OR WA,41,2381,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (28) (code 1501) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1738,NAD83 to WGS 84 (42),transformation,4269,4326,EPSG-Usa WI,42,1418,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (29) (code 1502) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1739,NAD83 to WGS 84 (43),transformation,4269,4326,EPSG-Usa CA n,43,2297,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (3) (code 1476) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1740,NAD83 to WGS 84 (44),transformation,4269,4326,EPSG-Usa WY,44,1419,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (30) (code 1503) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1741,NAD83 to WGS 84 (45),transformation,4269,4326,EPSG-Usa HI,45,1334,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (31) (code 1520) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1742,NAD83 to WGS 84 (46),transformation,4269,4326,EPSG-Usa IN,46,1383,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (32) (code 1521) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1743,NAD83 to WGS 84 (47),transformation,4269,4326,EPSG-Usa KS,47,1385,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (33) (code 1522) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1744,NAD83 to WGS 84 (48),transformation,4269,4326,EPSG-Usa NV,48,1397,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (34) (code 1523) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1745,NAD83 to WGS 84 (49),transformation,4269,4326,EPSG-Usa OH,49,1404,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (35) (code 1524) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1746,NAD83 to WGS 84 (50),transformation,4269,4326,EPSG-Usa UT,50,1413,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (36) (code 1525) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1747,NAD83 to WGS 84 (51),transformation,4269,4326,EPSG-Usa WV,51,1417,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (37) (code 1526) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1748,NAD83 to WGS 84 (52),transformation,4269,4326,EPSG-Usa IL,52,1382,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (38) (code 1553) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1749,NAD83 to WGS 84 (53),transformation,4269,4326,EPSG-Usa NJ,53,1399,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (39) (code 1554) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1750,NAD83 to WGS 84 (54),transformation,4269,4326,EPSG-Usa CA s,54,2298,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (4) (code 1477) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1751,Amersfoort to ETRS89 (1),transformation,4289,4258,NCG-Nld 2000,1,1172,Accuracy 0.5m,9607,,,"Dutch sources also quote an equivalent transformation with parameter values dX=+593.032 dY=+26.000 dZ=+478.741m, rX rY rZ and dS as this tfm. These values belong to a different transformation method and cannot be used with the Coordinate Frame method.",http://rdnap.kadaster.nl/rd/index.html Also Nederlandse Commissie voor Geodesie publication 30; 3rd edition 1997. Also with change of method [...]
+1752,NAD83 to NAD83(CSRS98) (3),transformation,4269,4140,AB Env-Can AB,3,2376,?,9615,,,"This gridded difference file AB_CSRS.DAC will need to be renamed to AB_CSRS.gsb to run in some software suites. Formats identical, but AB file is provincial fit only. Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1702.",Geodetic Control Section; Land and Forest Svc; Alberta Environment; http://www.gov.ab.ca/env/land/dos/ or email to geoff.banham at gov.ab.ca,EPSG,2000-10-19 [...]
+1753,CH1903 to WGS 84 (1),transformation,4149,4326,BfL-CH 1,1,1286,?,9607,,,Implemented in Bundesamt f�r Landestopographie programme GRANIT.,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,2001-08-28 00:00:00,,1,0
+1754,Minna to WGS 84 (3),transformation,4263,4326,SHL-Nga S,3,2371,Oil exploration.,9606,,,"Used by Shell SPDC throughout southern Nigeria onshore, delta and shallow offshore from 1994; adopted by Total for offshore OPL246.",Shell Petroleum Development Company,EPSG,2002-03-15 00:00:00,2001.38 2002.29,1,0
+1755,Bogota 1975 (Bogota) to Bogota 1975,transformation,4802,4218,IGAC-Col,1,1070,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1756,Lisbon (Lisbon) to Lisbon,transformation,4803,4207,IGC-Prt,1,1294,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1757,MGI (Ferro) to MGI,transformation,4805,4312,BEV-Aut balk,1,1166,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1758,Padang (Jakarta) to Padang,transformation,4808,4280,EPSG-Idn Sumatra,1,1355,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1759,Batavia (Jakarta) to Batavia,transformation,4813,4211,EPSG-Idn Java,1,1285,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1760,RT38 (Stockholm) to RT38,transformation,4814,4308,NLS-Swe,1,1225,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1761,Greek (Athens) to Greek,transformation,4815,4120,NTU-Grc,1,1106,Change of prime meridian.,9601,,,,Topography Department; National Technical University of Athens.,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1762,NGO 1948 (Oslo) to NGO1948,transformation,4817,4273,NGO-Nor,1,1352,Change of prime meridian.,9601,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,2001-10-04 00:00:00,2001.39,1,0
+1763,NTF (Paris) to NTF (1),transformation,4807,4275,IGN-Fra,1,1096,Change of prime meridian.,9601,,,,IGN Paris.,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1764,NTF (Paris) to NTF (2),transformation,4807,4275,RGS,2,1096,Change of prime meridian.,9601,,,EPSG prefers value from IGN Paris (code 1467).,Royal Geographic Society; London,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1765,Bern 1898 (Bern) to CH1903,transformation,4801,4149,BfL-CH,1,1286,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1766,CH1903 to WGS 84 (2),transformation,4149,4326,BfL-CH 2,2,1286,Accuracy 1.5 metres.,9603,,,These parameters are strictly between CH1903+ and CHTRF95 (code 1509) or ETRS89 (code 1647) but are used given to lesser precision from CH1903 to WGS 84 as an approximation which is within the accuracy of the distortions in the CH1903 network.,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,200 [...]
+1767,REGVEN to SIRGAS (1),transformation,4189,4170,CN-Ven,1,1251,Accuracy 2 centimetres.,9603,,,,Instituto Geografia de Venezuela Simon Bolivar,EPSG,2001-11-06 00:00:00,,1,0
+1768,REGVEN to WGS 84 (1),transformation,4189,4326,EPSG-Ven,1,1251,Approximation at the +/- 1m level.,9603,,,,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1769,PSAD56 to REGVEN (1),transformation,4248,4189,IGSB-Ven,1,1251,?,9636,,,,Instituto Geografia de Venezuela Simon Bolivar,EPSG,2001-11-06 00:00:00,,1,0
+1770,PSAD56 to WGS84 (1),transformation,4248,4326,EPSG-Ven,1,1251,Approximation at the +/- 1m level.,9636,,,Parameter vales are from PSAD56 to REGVEN (1) (code 1769) assuming that REGVEN is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1771,La Canoa to REGVEN (1),transformation,4247,4189,IGSB-Ven,1,1251,?,9636,,,,Instituto Geografia de Venezuela Simon Bolivar,EPSG,2001-11-06 00:00:00,,1,0
+1772,La Canoa to WGS84 (1),transformation,4247,4326,EPSG-Ven,1,1251,Approximation at the +/- 1m level.,9636,,,Parameter vales are from La Canoa to REGVEN (1) (code 1771) assuming that REGVEN is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1773,POSGAR 98 to WGS 84 (1),transformation,4190,4326,EPSG-Arg,1,1033,Approximation at the +/- 1m level.,9603,,,,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1774,POSGAR 98 to SIRGAS (1),transformation,4190,4170,IGM-Arg,1,1033,POSGAR 98 is a densification of SIRGAS.,9603,,,,ISBN 85-240-0647-1. Sistema de Refer�ncia Geoc�ntrico para a Am�rica do Sul: Relat�rio Final. IGBE Rio de Janeiro 1997.,EPSG,2001-11-06 00:00:00,,1,0
+1775,Pulkovo 1942(83) to ETRS89 (2),transformation,4178,4258,IfAG-Deu E 0.1m,2,1343,For applications with an accuracy at 0.1m level,9606,,,Derived at 35 points of the German GPS Network DREF. From 2001 supersedes Pulkovo 1942(83) to ETRS89 (1) (code 1674).,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1776,DHDN to ETRS89 (2),transformation,4314,4258,IfAG-Deu W 3m,2,2326,For applications with an accuracy at 3 m level,9606,,,Mean of 109 stations. May be taken as approximate transformation DHDN to WGS 84 - see code 1777.,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1777,DHDN to WGS 84 (2),transformation,4314,4326,EPSG-Deu W 3m,2,2326,For applications with an accuracy at 3 m level,9606,,,Parameter values from DHDN to ETRS89 (2) (code 1776) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1778,DHDN to ETRS89 (3),transformation,4314,4258,IfAG-Deu W-S,3,2543,For applications with an accuracy at 0.1m level,9606,,,Derived at 10 points of the German GPS Network DREF.,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1779,DHDN to ETRS89 (4),transformation,4314,4258,IfAG-Deu W-cen,4,2542,For applications with an accuracy at 0.1m level,9606,,,Derived at 27 points of the German GPS Network DREF.,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1780,DHDN to ETRS89 (5),transformation,4314,4258,IfAG-Deu W-N,5,2541,For applications with an accuracy at 0.1m level,9606,,,Derived at 21 points of the German GPS Network DREF.,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1781,DHDN to ETRS89 (6),transformation,4314,4258,IfAG-Deu Thur,6,2544,For applications with an accuracy at 0.1m level,9606,,,Derived at 10 points of the German GPS Network DREF.,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1782,DHDN to ETRS89 (7),transformation,4314,4258,IfAG-Deu Sach,7,2545,For applications with an accuracy at 0.1m level,9606,,,Derived at 35 points of the German GPS Network DREF.,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1783,ED50 to ETRS89 (9),transformation,4230,4258,HGK-Tur,9,1237,For applications to an accuracy of 2 metres.,9606,,,May be taken as approximate transformation ED50 to WGS 84 - see code 1784.,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1784,ED50 to WGS 84 (30),transformation,4230,4326,EPSG-Tur,30,1237,For applications to an accuracy of 2 metres.,9606,,,Parameter values from ED50 to ETRS89 (9) (code 1783). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1785,MGI to ETRS89 (3),transformation,4312,4258,GURS-Svn,3,1212,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation MGI to WGS 84 - see code 1786.,Geodetska Uprava Republike Slovenij via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1786,MGI to WGS 84 (5),transformation,4312,4326,EPSG-Svn,5,1212,For applications to an accuracy of 1 metre.,9606,,,Parameter values from MGI to ETRS89 (3) (code 1785). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1787,RT90 to ETRS89 (2),transformation,4124,4258,NLS-Swe 2001,2,1225,Accuracy 0.1m.,9607,,,Derived at 165 points. Supersedes RT90 to ETRS89 (1) (code 1437). May be taken as approximate transformation RT90 to WGS 84 - see code 1787.,National Land Survey of Sweden (http://www.lm.se/geodesi/refsys/eng/refsys-eng.htm) via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1788,RT90 to WGS 84 (2),transformation,4124,4326,EPSG-Swe 2001,2,1225,Approximation at the +/- 1m level.,9607,,,Parameter values from RT90 to ETRS89 (1) (code 1787) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1789,Dealui Piscului 1933 to WGS 84 (1),transformation,4316,4326,NAMR-Rom,1,1197,?,9603,,,,Petromar and NAMR,EPSG,2001-11-06 00:00:00,,1,0
+1790,Lisbon to ETRS89 (2),transformation,4207,4258,ICC-Prt 2001,2,1294,For applications to an accuracy of 2 metres.,9606,,,Derived in 2001. Supersedes Lisbon to ETRS89 (1) (code 1655). May be taken as approximate transformation Lisbon to WGS 84 - see code 1791.,Instituto Portugues de Cartografia e Cadastro via EuroGeographics; http://crs.ifag.de/,EPSG,2002-01-18 00:00:00,,1,0
+1791,Lisbon to WGS 84 (2),transformation,4207,4258,EPSG-Prt 2001,2,1294,For applications to an accuracy of 2 metres.,9606,,,Parameter values from Lisbon to ETRS89 (2) (code 1790). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2002-01-18 00:00:00,,1,0
+1792,Datum 73 to ETRS89 (2),transformation,4274,4258,ICC-Prt 2001,2,1294,For applications to an accuracy of 1 metre.,9606,,,Derived in 2001. Supersedes Datum 73 to ETRS89 (1) (code 1657). May be taken as approximate transformation Datum 73 to WGS 84 - see code 1793.,Instituto Portugues de Cartografia e Cadastro via EuroGeographics; http://crs.ifag.de/,EPSG,2002-01-18 00:00:00,,1,0
+1793,Datum 73 to WGS 84 (2),transformation,4274,4258,EPSG-Prt 2001,2,1294,For applications to an accuracy of 1 metre.,9606,,,Parameter values from Datum 73 to ETRS89 (2) (code 1792). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2002-01-18 00:00:00,,1,0
+1794,MGI to WGS 84 (6),transformation,4312,4326,JPet-Yug,6,2547,Oil industry,9603,,,For more accurate transformation see MGI to WGS 84 (7) (code 1795).,Jugopetrol,EPSG,2002-01-18 00:00:00,,1,0
+1795,MGI to WGS 84 (7),transformation,4312,4326,JPET-Yug MB,7,2547,Oil industry,9636,,,,Jugopetrol,EPSG,2002-01-18 00:00:00,,1,0
+1796,Manoca 1962 to WGS 84 (1),transformation,4193,4326,ELF94-Cmr,1,2555,Oil industry,9603,,,"Derived at two points, checked at a third by Stolt Comex Seaway and Geoid for Elf.",TotalFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+1797,Qornoq 1927 to WGS 84 (1),transformation,4194,4326,DMA-Grl S,1,2407,"For military purposes. Accuracy 25m, 25m and 32m in X, Y and Z axes.",9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,2002-01-18 00:00:00,,1,0
+1798,Qornoq 1927 to WGS 84 (2),transformation,4194,4326,KMS-Grl,2,1107,Topographic mapping.,9606,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+1799,Scoresbysund 1952 to WGS 84 (1),transformation,4195,4326,KMS-Grl Scosd,1,2570,Topographic mapping.,9606,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+1800,Ammassalik 1958 to WGS 84 (1),transformation,4196,4326,KMS-Grl Ammlk,1,2571,Topographic mapping.,9606,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+1801,Pointe Noire to WGS 84 (2),transformation,4282,4326,CGG94-Cog,2,2574,?,9603,,,Derived in 1994 by CGG/Topnav using DORIS system on various stations along the coastline.,TotalFinaElf,EPSG,2002-02-08 00:00:00,,1,0
+1802,Pointe Noire to WGS 84 (3),transformation,4282,4326,ELF95-Cog,3,2574,Used by Elf since May 1995 for all offshore Congo operations.,9606,,,Derived by Geoid for Elf in May 1995 using GPS and IGS data by tying 4 geodetic points to ITRF93 epoch 1995.4.,TotalFinaElf,EPSG,2002-02-08 00:00:00,,1,0
+1803,AGD66 to GDA94 (11),transformation,4202,4283,ICSM-Aus 0.1m,11,2575,0.1m accuracy.,9615,,,"Supersedes AGD66 to GDA94 variants 6, 7 and 10 (codes 1506 1507 1596). Variant 10 (1596) superseded #5 (1464). Input expects longitudes to be positive west; EPSG GeogCRS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.",GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/chapter7.htm,EPSG,2002-01-18 00:00:00,,1,0
+1804,AGD84 to GDA94 (5),transformation,4203,4283,Auslig-Aus 0.1m,5,2576,0.1m accuracy.,9615,,,Supersedes AGD84 to GDA94 (4) (code 1593) which itself replaced variant 3 (code1159). Input expects longitudes to be positive west; EPSG GeogCRS AGD84 (code 4203) and GDA94 (code 4283) both have longitudes positive east.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/chapter7.htm,EPSG,2002-01-18 00:00:00,,1,0
+1805,Garoua to WGS 72BE (1),transformation,4197,4324,ELF-Cmr,1,2590,Oil industry exploration.,9603,,,Derived in 1981 by Decca Survey France for Elf Serepca.,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+1806,Kousseri to WGS 72BE (1),transformation,4198,4324,ELF-Cmr,1,2591,Oil industry expoloration.,9603,,,Derived in 1981 by Decca Survey France for Elf Serepca.,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+1807,Pulkovo 1942 to WGS 84 (13),transformation,4284,4326,BP-Aze Aioc95,13,1038,Oil industry operations by AIOC prior to 1997.,9606,,,"Derived via WGS72 values taken from SOCAR Magnavox 1502 manual. Used by AIOC 1995-1997 then superseded by the AIOC97 values (tfm code 1808).
+Do not confuse with AIOC95 vertical datum as used in southern Caspian Sea and at Sangachal terminal by AIOC.",BP,EPSG,2002-02-12 00:00:00,,1,0
+1808,Pulkovo 1942 to WGS 84 (14),transformation,4284,4326,BP-Aze Aioc97,14,2593,Oil industry operations.,9606,,,"Mean of 3 stations in western Georgia, 4 stations in eastern Georgia and 4 stations in eastern Azerbaijan. Derived for use on AIOC early oil western export pipeline, but adopted for all AIOC work superseding the 1995 AIOC transformation (code 1807).",BP,EPSG,2002-02-12 00:00:00,,1,0
+1809,Pulkovo 1942 to WGS 84 (15),transformation,4284,4326,TFE-Aze97,15,2594,Oil industry operations.,9606,,,Parameter values calculated by Elf Exp[loration and Production based on geodetic survey carried out by Azerbaijan State Committee for Geodesy and Cartography.,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+1810,ED50 to WGS 84 (31),transformation,4230,4326,wgc72-Egy,31,2595,Oil industry exploration and production operations.,9606,,,Derived via concatenation through WGS72. The ED50 to WGS72 step is the Sepplin 1974 value for all Europe.,Western Geophysical,EPSG,2002-02-12 00:00:00,,1,0
+1811,PSAD56 to WGS 84 (12),transformation,4248,4326,PB-Braz N,12,1754,Oil industry exploration.,9603,,,Used by Petrobras for shelf operations.,Petrobras,EPSG,2002-02-12 00:00:00,,1,0
+1812,Indian 1975 to WGS 84 (4),transformation,4240,4326,Auslig-Tha,4,1231,Cadastral survey.,9606,,,,Auslig via GPS World.,EPSG,2002-02-12 00:00:00,,1,0
+1813,Batavia to WGS 84 (2),transformation,4211,4326,ARCO-Idn ONWJ,2,2577,Oil industry operations.,9603,,,,Arco geodetic database,EPSG,2002-02-12 00:00:00,,1,0
+1814,Batavia to WGS 84 (3),transformation,4211,4326,KOM-Idn EJGP,3,2588,Oil industry operations.,9603,,,Used by PT Komaritim for Nippon Steel during East Java Gas Pipeline construction.,PT Komaritim report S808/91.,EPSG,2002-02-12 00:00:00,,1,0
+1815,Nord Sahara 1959 to WGS 84 (4),transformation,4307,4326,BP-Alg D3,4,2598,Oil industry operations.,9606,,,Used by BP in District 3 and In Salah Gas.,BP,EPSG,2002-02-12 00:00:00,,1,0
+1816,Nord Sahara 1959 to WGS 84 (5),transformation,4307,4326,BPA-Alg InAm,5,2599,Oil industry operations.,9603,,,Derived at astro station central to concession. Significant and varying differences (>100m) at 4 neighbouring astro stations.,BP,EPSG,2002-02-12 00:00:00,,1,0
+1817,Nord Sahara 1959 to WGS 84 (6),transformation,4307,4326,ARCO-Alg HBR,6,2600,Oil industry operations.,9603,,,Derived at astro station Guerrara.,Arco geodetic database,EPSG,2002-02-12 00:00:00,,1,0
+1818,Minna to WGS 84 (4),transformation,4263,4326,RSL-Nga,4,1717,Oil industry operations.,9606,,,Concatenated via WGS 72BE. Adopted by Statoil.,Racal Survey Nigeria,EPSG,2002-02-12 00:00:00,,1,0
+1819,Minna to WGS 84 (5),transformation,4263,4326,SPD-Nga S,5,2371,Oil industry operations.,9606,,,Used by Shell in southern Nigeria and Total in OPL246.,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,1
+1820,Minna to WGS 84 (6),transformation,4263,4326,CON89-Nga,6,1717,Oil industry operations.,9603,,,Derived by Nortech at station L40 Minna using NNPC 1989 GPS network tied to 4 ADOS stations. Used by Conoco in OPLs 219-220 to cm precision and ExxonMobil in OPL 209 to dm precision..,TotalFinaElf,EPSG,2002-07-16 00:00:00,2002.29,1,0
+1821,Minna to WGS 84 (7),transformation,4263,4326,ELF94-Nga,7,1717,Oil industry operations.,9603,,,"Derived by Elf Petroleum Nigeria in 1994 at 3 stations (M101 onshore, offshore platforms XSW06 and XSV39) and used in OMLs 99-102 and OPLs 222-223.",TotalFinaElf,EPSG,2002-07-16 00:00:00,2002.29,1,0
+1822,Minna to WGS 84 (8),transformation,4263,4326,SHL-Nga OPL W,8,1717,Oil industry exploration and production.,9603,,,"Used by Shell SNEPCO for OPLs 209-213 and 316. Derived during 1990 Niger Delta control survey at 4 stations (XSU27, 30 31 and 35).",Shell Nigeria Exploration and Production Company,EPSG,2002-03-15 00:00:00,,1,0
+1823,Minna to WGS 84 (9),transformation,4263,4326,SHL-Nga OPL S,9,1717,Oil industry exploration and production.,9603,,,"Used by Shell SNEPCO for OPLs 217-223. Derived during 1990 Niger Delta control survey at 4 stations (XSU38, 41, 44 and 45).",Shell Nigeria Exploration and Production Company,EPSG,2002-03-15 00:00:00,,1,0
+1824,Minna to WGS 84 (10),transformation,4263,4326,SHL-Nga Gongola,10,2371,Oil industry exploration and production.,9603,,,Used by Shell SNEPCO for Gongola basin.,Shell International Exploration and Production,EPSG,2002-03-15 00:00:00,,1,0
+1825,Hong Kong 1980 to WGS 84 (1),transformation,4611,4326,LSD-HKG 2002,1,1118,Accuracy to 1m level.,9606,,,Published 1st March 2002.,"Geodetic Survey Section, Survey and Mapping Office, Lands Department, Hong Kong. http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+1826,JGD2000 to WGS 84 (1),transformation,4612,4326,EPSG-Jpn,1,1129,Approximation at the +/- 1m level.,9603,,,,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+1827,Tokyo to WGS 84 (6),transformation,4301,4326,GSI-Jpn 452141,6,2425,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,,1,0
+1828,Yoff to WGS 72 (1),transformation,4310,4322,DMA-SEN,1,1207,Military survey.,9603,,,,DMA,EPSG,2002-06-22 00:00:00,,1,0
+1829,HD72 to ETRS89 (1),transformation,4237,4258,FOMI-Hun,1,1119,Accuracy at decimetre level throughout Hungary.,9607,,,May be taken as approximate transformation HD72 to WGS 84 - see code 1830.,Institute of Geodetic Survey and Remote Sensing (FOMI) reflected at http://lazarus.elte.hu/gb/geodez/geod5.htm,EPSG,2002-06-22 00:00:00,,1,0
+1830,HD72 to WGS 84 (1),transformation,4237,4326,EPSG-Hun,1,1119,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,9607,,,Parameter values taken from HD72 to ETRS89 (1) (code 1829) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+1831,HD72 to WGS 84 (2),transformation,4237,4326,ELTE-Hun,2,1119,Accuracy better than 1m in all three dimensions throughout Hungary.,9603,,,Derived at fundamental point Szolohegy and tested at 99 stations throughout Hungary.,"Timar, Molnar and Pasztor; Eotvos University, in Geodezia es Kartografia 54(1) pp11-16. www.fomi.hu/internet/magyar/szaklap/geodkart.htm",EPSG,2002-06-22 00:00:00,,1,0
+1832,ID74 to WGS 84 (2),transformation,4238,4326,Rac91-Idn,2,1122,For oil industry purposes.,9606,,,Derived via coordinates of 2 Pulse8 stations. Use of D74 to WGS 84 (3) (code 1833) is recommended.,Racal Survey,EPSG,2002-06-22 00:00:00,,1,0
+1833,ID74 to WGS 84 (3),transformation,4238,4326,Bak-Idn,3,1122,"Standard deviations of translations are 1.3, 1.1 and 3.6m, of rotations 0.11, 0.06 and 0.04 sec and ppm 0.18.",9607,,,Derived at 38 stations.,Bakosurtanal.,EPSG,2002-06-22 00:00:00,,1,0
+1834,Segara to WGS 84 (1),transformation,4294,4326,NIMA-Idn Kal,1,2354,For military purposes.,9603,,,Accuracy estimate not available.,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,2002-06-22 00:00:00,,1,0
+1835,Segara to WGS 84 (2),transformation,4294,4326,Shl-Idn Kal E,2,1360,Oil exploration.,9603,,,,Shell,EPSG,2002-06-22 00:00:00,,1,0
+1836,Segara to WGS 84 (3),transformation,4294,4326,Shl-Idn Kal NE,3,2770,Oil exploration.,9603,,,,Shell,EPSG,2002-06-22 00:00:00,,1,0
+1837,Makassar to WGS 84 (1),transformation,4257,4326,Shl-Idn Sul SW,1,1316,Oil exploration.,9603,,,,Shell,EPSG,2002-06-22 00:00:00,,1,0
+1838,Segara to WGS 84 (4),transformation,4613,4326,TOT-Idn Mah,4,1328,Oil exploration.,9603,,,Datum shift derived through ITRF93.,Total Indonesia.,EPSG,2002-06-22 00:00:00,,1,0
+1839,Beduaram to WGS 72BE (1),transformation,4213,4324,ELF-Ner SE,1,2771,Oil exploration.,9603,,,,TotalFinaElf,EPSG,2002-06-28 00:00:00,,1,0
+1840,QND95 to WGS 84 (1),transformation,4614,4326,CGIS-Qat,1,1346,Parameter values are defined and therefore exact.,9606,,,"Transformation defines QND95. May be approximated to 1m throughout Qatar by geocentric translation transformation with dX=-127.78098m, dY=-283.37477m, dZ=+21.24081m.",Qatar Centre for Geographic Information.,EPSG,2002-06-28 00:00:00,,1,0
+1841,ATS77 to NAD83(CSRS) (1),transformation,4122,4617,GIC-Can NB,1,1447,Accuracy 1-2 metres.,9615,,,Introduced in 1999. Can be taken as an approximate transformation ATS77 to WGS 84 - see code 1688.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,2002-07-13 00:00:00,,1,0
+1842,NAD83(CSRS) to WGS 84 (1),transformation,4617,4326,EPSG-Can,1,1336,Approximation at the +/- 1m level assuming that NAD83(CSRS) is equivalent to WGS 84.,9603,,,For many purposes NAD83(CSRS) can be considered to be coincident with WGS 84.,EPSG,EPSG,2002-07-13 00:00:00,,1,0
+1843,NAD83 to NAD83(CSRS) (1),transformation,4269,4617,SGQ-Can QC,1,1368,Accuracy 1-2 metres.,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(CSRS) (code 4617) have longitudes positive east. Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1696.,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2002-07-13 00:00:00,,1,0
+1844,NAD27 to NAD83(CSRS) (1),transformation,4267,4617,SGQ-Can QC,1,1368,Accuracy 1-2 metres.,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27 (code 4267) and NAD83(CSRS) (code 4617) have longitudes positive east. Can be taken as an approximate transformation NAD27 to WGS 84 - see code 1692.,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2002-07-13 00:00:00,,1,0
+1845,NAD27(CGQ77) to NAD83(CSRS) (1),transformation,4609,4617,SGQ-Can QC,1,1368,Accuracy 1-2 metres.,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27(CGQ77) (code 4609) and NAD83(CSRS) (code 4617) have longitudes positive east. Can be taken as an approximate transformation NAD27(CGQ77) to WGS 84 - see code 1691.,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2002-07-13 00:00:00,,1,0
+1846,ATS77 to NAD83(CSRS) (2),transformation,4122,4617,PEI DOT-Can PEI,2,1533,Accuracy 1-2 metres.,9615,,,Can be taken as an approximate transformation ATS77 to WGS 84 - see code 1689.,PEI Department of Transportation & Public Works,EPSG,2002-07-13 00:00:00,,1,0
+1847,NAD27 to NAD83(CSRS) (2),transformation,4267,4617,SK PMC-Can SK,2,2375,Accuracy 1-2 metres.,9615,,,Can be taken as an approximate transformation NAD27 to WGS 84 - see code 1703.,Dir Geodetic Surveys; SaskGeomatics Div.; Saskatchewan Property Management Company.,EPSG,2002-07-13 00:00:00,,1,0
+1848,NAD83 to NAD83(CSRS) (2),transformation,4269,4617,SK PMC-Can SK,2,2375,Accuracy 1-2 metres.,9615,,,Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1697.,Dir Geodetic Surveys; SaskGeomatics Div.; Saskatchewan Property Management Company.,EPSG,2002-07-13 00:00:00,,1,0
+1849,NAD83 to NAD83(CSRS) (3),transformation,4269,4617,AB Env-Can AB,3,2376,Accuracy 1-2 metres.,9615,,,"This gridded difference file AB_CSRS.DAC will need to be renamed to AB_CSRS.gsb to run in some software suites. Formats identical, but AB file is provincial fit only. Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1702.",Geodetic Control Section; Land and Forest Svc; Alberta Environment; http://www.gov.ab.ca/env/land/dos/ or email to geoff.banham at gov.ab.ca [...]
+1850,ATS77 to NAD83(CSRS) (3),transformation,4122,4617,NSGC-Can NS,2,2313,Accuracy 1-2 metres.,9615,,,Can be taken as an approximate transformation ATS77 to WGS 84 - see code 1851.,Nova Scotia Geomatics Centre - Contact aflemmin at linux1.nsgc.gov.ns.ca or telephone 902-667-6409,EPSG,2002-07-13 00:00:00,,1,0
+1851,ATS77 to WGS 84 (3),transformation,4122,4326,EPSG-Can NS,2,2313,Approximation at the +/- 1m level.,9615,,,Parameter file is from ATS77 to NAD83(CSRS) (3) (code 1850) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2002-07-13 00:00:00,,1,0
+1852,Timbalai 1948 to WGS 84 (4),transformation,4298,4326,SSB-Mys E,4,2780,Oil exploration.,9606,,,Derived by Racal Survey for SSB at 24 coastal stations (including Timbalai fundamental point and 6 other primary triangulation stations) between in Sabah (Kudat southwards) and Sarawak (Sibu northwards).,Sarawak Shell Berhard,EPSG,2002-07-13 00:00:00,,1,0
+1854,FD58 to WGS 84 (2),transformation,4132,4326,TFE-Irn Lavan,2,2782,Oil Exploration,9603,,,Derived by Geoid for Elf in 1999. EGM96 geoid used.,TotalFinaElf,EPSG,2002-07-13 00:00:00,,1,0
+1855,FD58 to WGS 84 (3),transformation,4132,4326,TFE-Irn Kharg,3,2781,Oil Exploration,9603,,,Derived by Geoid for Elf in 1999. EGM96 geoid used.,TotalFinaElf,EPSG,2002-07-13 00:00:00,,1,0
+1856,ED50(ED77) to WGS 84 (3),transformation,4154,4326,TFE-Irn SPars,3,2783,Oil Exploration,9603,,,Derived in Kangan district by Geoid for Total in 1998. Used for South Pars phases 2 and 3.,TotalFinaElf,EPSG,2002-07-13 00:00:00,,1,0
+1857,ED50(ED77) to WGS 84 (4),transformation,4154,4326,TFE-Irn Lavan,4,2782,Oil Exploration,9603,,,Derived in 1999 on Lavan island by Geoid for Elf.,TotalFinaElf,EPSG,2002-07-13 00:00:00,,1,0
+1858,ED50(ED77) to WGS 84 (5),transformation,4154,4326,TFE-Irn Kharg,5,2781,Oil Exploration,9603,,,Derived by Geoid for Elf in 1999. EGM96 geoid used.,TotalFinaElf,EPSG,2002-07-13 00:00:00,,1,0
+1859,ELD79 to WGS 84 (1),transformation,4159,4326,REP-Lby MZQ,1,2785,Oil Exploration,9603,,,Used by Repsol. Reliability of connection to ELD79 questionned.,Oil industry sources.,EPSG,2002-07-16 00:00:00,,1,0
+1860,ELD79 to WGS 84 (2),transformation,4159,4326,TFE-Lby MZQ,2,2785,Oil Exploration. 3-dimensional SD at 11 points is 0.5m.,9603,,,Derived December 2001 by NAGECO. Connected to ITRF via Remsa 2000 data. Used by TotalFinaElf.,TotalFinaElf,EPSG,2002-07-16 00:00:00,,1,0
+1861,ELD79 to WGS 84 (3),transformation,4159,4326,TFE-Lby MBK94,3,2786,Oil Exploration,9603,,,Derived by GEOID in 1994 from Transit satellite data. Used by TotalFinaElf.,TotalFinaElf,EPSG,2002-07-16 00:00:00,,1,0
+1862,ELD79 to WGS 84 (4),transformation,4159,4326,TFE-Lby MBK00,4,2786,Oil Exploration,9606,,,Derived by Geoid in 2000 from ITRF connection by NAGECO for TotalFinaElf. For historic compatibility TFE use the 1994 tfm ELD79 to WGS 84 (3) (code 1861).,TotalFinaElf,EPSG,2002-07-16 00:00:00,,1,0
+1863,ELD79 to WGS 84 (5),transformation,4159,4326,GMRA-Lby,5,2786,Engineering survey and oil exploration,9607,,,Derived for the Great Man-made River Authority (GMRA). Used by Saga in Mabruk blocks A and B.,Norsk Hydro,EPSG,2002-07-16 00:00:00,,1,0
+5400,Baltic to Caspian,transformation,5705,5706,Caspian Sea,1,2314,Vertical datum change for hydrographic charting.,9616,,,Baltic datum is 28m above Caspian datum.,,EPSG,1999-09-07 00:00:00,97.61,1,0
+5401,Belfast to Malin Head,transformation,5732,5731,OSNI-Gbr NI,1,1305,Vertical datum change for large scale topographic mapping and engineering survey.,9616,,,Belfast datum is 37mm above Malin Head datum.,,EPSG,2001-11-06 00:00:00,,1,0
+5402,Baltic to AIOC95,transformation,5705,5734,AIOC95-Aze,1,2592,Vertical datum change for engineering surveying.,9616,,,Baltic datum is 26.3m above AIOC95 datum.,BP,EPSG,2002-02-12 00:00:00,,1,0
+5403,AIOC95 to Caspian,transformation,5734,5706,AIOC95-Aze,1,2592,Vertical datum change for hydrographic charting.,9616,,,AIOC95 datum is 1.7m above Caspian datum.,BP,EPSG,2002-02-12 00:00:00,,1,0
+5404,Baltic to Black Sea,transformation,5705,5735,Black Sea,1,1102,Vertical datum change.,9616,,,Baltic datum is 0.4m above Black Sea datum.,BP,EPSG,2002-02-12 00:00:00,,1,0
+5405,Hong Kong Principal height to Hong Kong Chart depth,transformation,5738,5739,SMO-HK,1,1118,Vertical datum change for hydrographic charting.,9616,,,HKPD is 0.146m above chart datum.,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+8046,ED50 to WGS 84 (14),concatenated operation,4230,4326,5Nat-NSea90,14,2330,Primarily oil industry usage.,,,,"1990 agreement between Denmark, Germany, Great Britain, Netherlands and Norway. Supersedes 1981 6-nations agreement between ED50 and WGS72 or WGS72BE. Only actively used offshore Norway but see ED50 to WGS 84 (24) (code 1613) for simpler transformation.","Norwegian Mapping Authority publication 1990:1 ""The transformation between ED50 and WGS84 for exploration purposes in the [...]
+8047,ED50 to WGS 84 (15),concatenated operation,4230,4326,NMA-Nor N65 1991,15,2331,Oil exploration before 2001.,,,,"Superseded by codes 8569 and 1612 in 1997 and 2001.
+The concatenation of transformations 1147 and 1146 gives the following position vector tfm: dX=-84.491 dY=-100.559 dZ=-114.209 metres rX= -2.4006 rY=-0.5367 rZ=-2.3742 microradians dS=+0.2947 ppm.","Statenskartverk note of January 1991 ""Om transformasjon mellom geodetiske datum i Norge"".",EPSG,1996-10-18 00:00:00,,1,0
+8094,NTF (Paris) to WGS 84 (1),concatenated operation,4807,4326,EPSG-Fra,1,1096,?,,,,,EPSG,EPSG,1996-10-18 00:00:00,,1,0
+8174,Bogota 1975 (Bogota) to WGS 84 (1),concatenated operation,4802,4326,DMA-Col,1,1070,"For military purposes. Accuracy 6m, 5m and 6m in X, Y and Z axes.",,,,,EPSG,EPSG,1997-04-11 00:00:00,,1,0
+8175,Monte Mario (Rome) to WGS 84 (1),concatenated operation,4806,4326,EPSG-Ita,1,2339,For military purposes. Accuracy 25m in each axis.,,,,,EPSG,EPSG,1997-04-11 00:00:00,,1,0
+8176,Tananarive (Paris) to WGS 84 (1),concatenated operation,4810,4326,EPSG-Mdg,1,1149,For military purposes. Accuracy not available.,,,,,EPSG,EPSG,1997-04-11 00:00:00,,1,0
+8178,Batavia (Jakarta) to WGS 84 (1),concatenated operation,4813,4326,EPSG-Idn Sumatra,1,1355,For military purposes. Accuracy 3m in each axis.,,,,,EPSG,EPSG,1997-04-11 00:00:00,,1,0
+8183,HD72 to WGS 84 (1),concatenated operation,4237,4326,EPSG-Hun,1,1119,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that ETRF89 is equivalent to WGS 84.,EPSG,EPSG,1997-07-22 00:00:00,,1,1
+8186,NTF (Paris) to ED50 (1),concatenated operation,4807,4230,EPSG-Fra,1,1096,?,,,,,EPSG,EPSG,1997-11-13 00:00:00,,1,0
+8188,NTF (Paris) to WGS 72 (1),concatenated operation,4807,4322,EPSG-Fra,1,1096,?,,,,,EPSG,EPSG,1997-11-13 00:00:00,,1,0
+8190,AGD66 to WGS 84 (2),concatenated operation,4202,4326,EPSG-Aus 5m,2,1036,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84. 0.1m accuracy.,EPSG,EPSG,1998-12-16 00:00:00,98.50,1,1
+8192,AGD84 to WGS 84 (3),concatenated operation,4203,4326,EPSG-Aus 5m,3,1036,5m accuracy. Approximation assuming that GDA94 is equivalent to WGS 84.,,,,Approximation assuming that GDA94 is equivalent to WGS 84.,EPSG,EPSG,1998-12-16 00:00:00,98.50,1,1
+8194,AGD84 to WGS 84 (4),concatenated operation,4203,4326,EPSG-Aus 1m,4,1036,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,EPSG,EPSG,1998-12-16 00:00:00,98.50,1,1
+8195,RT90 to WGS 84 (1),concatenated operation,4124,4326,EPSG-Swe,1,1225,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that ETRF89 is equivalent to WGS 84.,EPSG,EPSG,1999-04-22 00:00:00,99.11,1,1
+8199,Pulkovo 1942 to WGS 84 (2),concatenated operation,4284,4326,EPSG-Ltu,2,1145,Approximation at the +/- 1m level assuming that LKS94(ETRS89) is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that LKS94(ETRS89) is equivalent to WGS 84.,EPSG,EPSG,1998-03-12 00:00:00,,1,1
+8211,Voirol 1875 (Paris) to WGS 84 (1),concatenated operation,4811,4326,EPSG-Dza N,1,2347,Oil exploration.,,,,,EPSG,EPSG,1998-03-12 00:00:00,,1,0
+8215,Tete to WGS 84 (1),concatenated operation,4127,4326,EPSG-Moz,1,1167,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,EPSG,EPSG,1998-04-16 00:00:00,,1,1
+8217,Tete to WGS 84 (2),concatenated operation,4127,4326,EPSG-Moz A,2,2350,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,EPSG,EPSG,1998-04-16 00:00:00,,1,1
+8219,Tete to WGS 84 (3),concatenated operation,4127,4326,EPSG-Moz B,3,2351,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,EPSG,EPSG,1998-04-16 00:00:00,,1,1
+8221,Tete to WGS 84 (4),concatenated operation,4127,4326,EPSG-Moz C,4,2352,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,EPSG,EPSG,1998-04-16 00:00:00,,1,1
+8223,Tete to WGS 84 (5),concatenated operation,4127,4326,EPSG-Moz D,5,2353,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,EPSG,EPSG,1998-04-16 00:00:00,,1,1
+8234,DHDN to WGS 84 (1),concatenated operation,4314,4326,EPSG-Deu W,1,2326,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that ETRF89 is equivalent to WGS 84.,EPSG,EPSG,1998-06-30 00:00:00,,1,1
+8236,Pulkovo 1942 to WGS 84 (11),concatenated operation,4284,4326,EPSG-Deu E,11,1343,Approximation at the +/- 1m level assuming that ETRF89 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that ETRF89 is equivalent to WGS 84.,EPSG,EPSG,1998-06-30 00:00:00,,1,1
+8241,Madrid 1870 (Madrid) to WGS 84 (1),concatenated operation,4903,4326,EPSG-Esp,1,1217,?,,,,,See individual transformations.,EPSG,1998-11-11 00:00:00,,1,0
+8243,NAD27 to WGS 84 (25),concatenated operation,4267,4326,EPSG-Can old,25,1061,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84. Superseded by NAD27 to WGS 84 (27) (code 8404) in Quebec and NAD27 to WGS 84 (26) (code 8245) elsewhere in Canada.,EPSG,EPSG,1998-11-11 00:00:00,,1,1
+8245,NAD27 to WGS 84 (26),concatenated operation,4267,4326,EPSG-Can,26,1061,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1998-11-11 00:00:00,,1,1
+8263,MGI (Ferro) to WGS 84 (1),concatenated operation,4805,4326,DMA-balk,1,2370,For military purposes only.,,,,Accuracy estimate is not available.,EPSG,EPSG,1998-12-12 00:00:00,,1,0
+8386,Old Hawaiian to WGS 84 (1),concatenated operation,4135,4326,EPSG-Usa Hi,1,1334,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8388,St. Lawrence Island to WGS 84 (1),concatenated operation,4136,4326,EPSG-Usa AK StL,1,1332,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8390,St. Paul Island to WGS 84 (1),concatenated operation,4137,4326,EPSG-Usa AK StP,1,1333,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8392,St. George Island to WGS 84 (1),concatenated operation,4138,4326,EPSG-Usa AK StG,1,1331,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8394,NAD27(CGQ77) to WGS 84 (1),concatenated operation,4609,4326,EPSG-Can Qc NT1,1,1368,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84. Superseded by NAD27(CGQ77) to WGS 84 (2) (code 8564).,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8396,AGD66 to WGS 84 (3),concatenated operation,4202,4326,EPSG-Aus ACT 1m,3,2283,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84. Superseded by AGD66 to WGS 84 (11) (code 8581).,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8398,AGD66 to WGS 84 (4),concatenated operation,4202,4326,EPSG-Aus Tas 1m,4,1282,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84. Superseded by AGD66 to WGS 84 (9) (code 8576).,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8400,AGD66 to WGS 84 (5),concatenated operation,4202,4326,EPSG-Aus NSW Vic 1m,5,2286,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8402,Puerto Rico to WGS 84 (1),concatenated operation,4139,4326,EPSG-PRVI,1,1335,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8404,NAD27 to WGS 84 (27),concatenated operation,4267,4326,EPSG-Can QC,27,1368,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84. Superseded by NAD27 to WGS 84 (31) (code 8565).,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8406,NAD27(76) to WGS 84 (1),concatenated operation,4608,4326,EPSG-Can On,1,1367,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8408,AGD66 to WGS 84 (6),concatenated operation,4202,4326,EPSG-Aus Vic 0.1m,6,2285,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84. Superseded by AGD66 to WGS 84 (11) (code 8578).,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8418,ATS77 to WGS 84 (1),concatenated operation,4122,4326,EPSG-Can NB,1,1447,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,EPSG,EPSG,1999-10-20 00:00:00,,1,1
+8419,ATS77 to WGS 84 (2),concatenated operation,4122,4326,EPSG-Can PEI,2,1533,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8420,NAD27 to WGS 84 (32),concatenated operation,4267,4326,SK PMC-Can SK,32,2375,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,,Dir Geodetic Surveys; SaskGeomatics Div.; Saskatchewan Property Management Company.,EPSG,2000-10-19 00:00:00,,1,1
+8421,NAD83 to WGS 84 (7),concatenated operation,4269,4326,SK PMC-Can SK,7,2375,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,,Dir Geodetic Surveys; SaskGeomatics Div.; Saskatchewan Property Management Company.,EPSG,2000-10-19 00:00:00,,1,1
+8422,NAD83 to WGS 84 (8),concatenated operation,4269,4326,Alb Env-Can AB,8,2376,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,"The gridded difference file AB_CSRS.DAC in STEP 1 will need to be renamed to AB_CSRS.gsb to run in some software suites. Formats identical, but AB file is provincial fit only.",Geodetic Control Section; Land and Forest Svc; Alberta Environment; http://www.gov.ab.ca/env/land/dos/ or email to geoff.banham at gov.ab.ca,EPSG [...]
+8453,AGD66 to WGS 84 (7),concatenated operation,4202,4326,EPSG-Aus Tas 0.1m,7,1282,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,EPSG,EPSG,1999-10-20 00:00:00,,1,1
+8454,AGD66 to WGS 84 (8),concatenated operation,4202,4326,EPSG-Aus NT 0.1m,8,2284,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,EPSG,EPSG,1999-10-20 00:00:00,,1,1
+8457,CH1903+ to WGS 84 (1),concatenated operation,4150,4326,EPSG-CH,1,1286,Approximation at the +/- 1m level assuming that CHTRF95 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that CHTRF95 is equivalent to WGS 84.,EPSG,EPSG,1999-10-20 00:00:00,,1,1
+8460,NAD27 to NAD83(HARN) (1),concatenated operation,4267,4152,NGS-Usa AL,1,1372,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8590.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8461,NAD27 to NAD83(HARN) (2),concatenated operation,4267,4152,NGS-Usa AZ,2,1373,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8591.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8462,NAD27 to NAD83(HARN) (3),concatenated operation,4267,4152,NGS-Usa CA n,3,2297,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8593.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8463,NAD27 to NAD83(HARN) (4),concatenated operation,4267,4152,NGS-Usa CA s,4,2298,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8594.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8464,NAD27 to NAD83(HARN) (5),concatenated operation,4267,4152,NGS-Usa CO,5,1376,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8595.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8465,NAD27 to NAD83(HARN) (6),concatenated operation,4267,4152,NGS-Usa GA,6,1380,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8597.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8466,NAD27 to NAD83(HARN) (7),concatenated operation,4267,4152,NGS-Usa FL,7,1379,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8596.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8467,NAD27 to NAD83(HARN) (8),concatenated operation,4267,4152,NGS-Usa ID MT e,8,2382,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8611.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8468,NAD27 to NAD83(HARN) (9),concatenated operation,4267,4152,NGS-Usa ID MT w,9,2383,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8612.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8469,NAD27 to NAD83(HARN) (10),concatenated operation,4267,4152,NGS-Usa KY,10,1386,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8602.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8470,NAD27 to NAD83(HARN) (11),concatenated operation,4267,4152,NGS-Usa LA,11,1387,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8603.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8471,NAD27 to NAD83(HARN) (12),concatenated operation,4267,4152,NGS-Usa DE MD,12,2377,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8605.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8472,NAD27 to NAD83(HARN) (13),concatenated operation,4267,4152,NGS-Usa ME,13,1388,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8604.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8473,NAD27 to NAD83(HARN) (14),concatenated operation,4267,4152,NGS-Usa MI,14,1391,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8607.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8474,NAD27 to NAD83(HARN) (15),concatenated operation,4267,4152,NGS-Usa MS,15,1393,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8609.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8475,NAD27 to NAD83(HARN) (16),concatenated operation,4267,4152,NGS-Usa NE,16,1396,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8613.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8476,NAD27 to NAD83(HARN) (17),concatenated operation,4267,4152,NGS-Usa NewEng,17,2378,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8606.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8477,NAD27 to NAD83(HARN) (18),concatenated operation,4267,4152,NGS-Usa NM,18,1400,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8616.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8478,NAD27 to NAD83(HARN) (19),concatenated operation,4267,4152,NGS-Usa NY,19,1401,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8617.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8479,NAD27 to NAD83(HARN) (20),concatenated operation,4267,4152,NGS-Usa ND,20,1403,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8618.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8480,NAD27 to NAD83(HARN) (21),concatenated operation,4267,4152,NGS-Usa OK,21,1405,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8620.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8481,Puerto Rico to NAD83(HARN) (1),concatenated operation,4139,4152,NGS-PRVI,1,1335,Accuracy 0.1m at 67% confidence level.,,,,May be taken as approximate transformation Puerto Rico to WGS 84 - see code 8583.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8482,NAD27 to NAD83(HARN) (22),concatenated operation,4267,4152,NGS-Usa SD,22,1410,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8622.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8483,NAD27 to NAD83(HARN) (23),concatenated operation,4267,4152,NGS-Usa TN,23,1411,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8623.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8484,NAD27 to NAD83(HARN) (24),concatenated operation,4267,4152,NGS-Usa TX e,24,2379,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8624.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8485,NAD27 to NAD83(HARN) (25),concatenated operation,4267,4152,NGS-Usa TX w,25,2380,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8625.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8486,NAD27 to NAD83(HARN) (26),concatenated operation,4267,4152,NGS-Usa VA,26,1415,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8627.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8487,NAD27 to NAD83(HARN) (27),concatenated operation,4267,4152,NGS-Usa OR WA,27,2381,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8621.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8488,NAD27 to NAD83(HARN) (28),concatenated operation,4267,4152,NGS-Usa WI,28,1418,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8629.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8489,NAD27 to NAD83(HARN) (29),concatenated operation,4267,4152,NGS-Usa WY,29,1419,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8630.,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8496,NAD27 to WGS 84 (28),concatenated operation,4267,4326,NGS-Usa conus,28,2374,Geodetic survey.,,,,,Both transformations from US National Geodetic Survey.,EPSG,1999-10-20 00:00:00,,1,0
+8497,NAD27 to WGS 84 (29),concatenated operation,4267,4326,NGS-Usa AK,29,2373,Geodetic survey.,,,,,Both transformations from US National Geodetic Survey.,EPSG,1999-10-20 00:00:00,,1,1
+8508,Old Hawaiian to NAD83(HARN) (1),concatenated operation,4135,4152,NGS-Usa HI,1,1334,Assumes NAD83 is coincident with NAD83(HARN). Accuracy about 1m.,,,,"Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs Old Hawaiian (code 4135), NAD83 (code 4269) and NAD83(HARN) have longitudes positive east. May be taken as approximate transformation Old Hawaiin to WGS 84 - see code 8582.",US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00 [...]
+8509,NAD27 to NAD83(HARN) (30),concatenated operation,4267,4152,NGS-Usa IN,30,1383,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8599.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8510,NAD27 to NAD83(HARN) (31),concatenated operation,4267,4152,NGS-Usa KS,31,1385,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8601.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8511,NAD27 to NAD83(HARN) (32),concatenated operation,4267,4152,NGS-Usa NV,32,1397,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8614.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8512,NAD27 to NAD83(HARN) (33),concatenated operation,4267,4152,NGS-Usa OH,33,1404,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8619.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8513,NAD27 to NAD83(HARN) (34),concatenated operation,4267,4152,NGS-Usa UT,34,1413,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8626.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8514,NAD27 to NAD83(HARN) (35),concatenated operation,4267,4152,NGS-Usa WV,35,1417,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8628.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8517,Chos Malal 1914 to WGS 84 (1),concatenated operation,4160,4326,TOT-Arg Neu,1,2325,Oil exploration,,,,May be implemented using a single step geocentric translations of dx=+5.5m dY=+176.7m dZ=+141.4m.,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+8530,South Yemen to WGS 84 (1),concatenated operation,4164,4326,IGN-Yem South,1,1340,Approximation at the +/- 1m level assuming that NGN96 is equivalent to WGS 84.,,,,May be implemented as a single transformation using geocentric translations transformation method with parameter values dX=-76m dY=-138m dZ=+67m.,IGN Paris,EPSG,2000-03-07 00:00:00,,1,1
+8532,Indian 1960 to WGS 84 (1),concatenated operation,4131,4326,PV-Vnm,1,1495,Oil exploration.,,,,May be implemented as a single transformation using position vector 7-parameter geocentric transformation method with parameter values dX=+199m dY=+931m dZ=+318.9m rX=rY=0 sec rZ=+0.814 sec dS=-0.38 ppm.,Various oil company sources.,EPSG,2000-03-07 00:00:00,,1,0
+8537,Egypt 1907 to WGS 84 (2),concatenated operation,4229,4326,MCE-Egy,2,1086,Oil exploration.,,,,Used by Shell. May be implemented as a single transformation using position vector 7-parameter geocentric transformation method with parameter values dX=-121.8m dY=+98.1m dZ=-10.7m rX=rY=0 sec rZ=+0.554 sec dS=+0.2263 ppm.,Maridive,EPSG,2000-03-07 00:00:00,,1,0
+8553,NAD27 to NAD83(HARN) (36),concatenated operation,4267,4152,NGS-Usa IL,36,1382,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8598.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8554,NAD27 to NAD83(HARN) (37),concatenated operation,4267,4152,NGS-Usa NJ,37,1399,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8615.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8560,AGD84 to WGS 84 (5),concatenated operation,4203,4326,EPSG-Aus WA,5,1280,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84. Superseded by AGD84 to WGS 84 (6) (code 8579).,EPSG,EPSG,2000-06-10 00:00:00,,1,1
+8562,Nord Sahara 1959 to WGS 84 (3),concatenated operation,4307,4326,CGG-Alg HM,3,2393,Oil exploration.,,,,Derived at IGN monument CFP19 using Transit. Can be implemented as a single 7-param Position Vector transformation with parameter values of dX=-156m dY=-87.2m dZ=+287.8m; rX=rY=0 rZ=+0.814sec; dS=-0.38ppm.,,EPSG,2000-06-23 00:00:00,,1,0
+8563,NZGD49 to WGS 84 (3),concatenated operation,4272,4326,OSG-Nzl 1m,3,1175,Assumes WGS 84 is coincident with NZGD2000. Accuracy about 1m.,,,,Assumes WGS 84 is coincident with NZGD2000. Accuracy about 1m.,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8564,NAD27(CGQ77) to WGS 84 (2),concatenated operation,4609,4326,EPSG-Can Qc NT2,2,1368,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8565,NAD27 to WGS 84 (31),concatenated operation,4267,4326,EPSG-Can Que,31,1368,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8566,NAD83 to WGS 84 (6),concatenated operation,4269,4326,EPSG-Can Qc,6,1368,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8567,OSGB36 / National Grid to WGS 84 (1),concatenated operation,27700,4326,EPSG-Gbr,1,1264,Assumes ETRS89 is coincident with WGS 84. Accuracy about 0.5m.,,,,Assumes ETRF89 is coincident with WGS 84. Accuracy about 0.5m.,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8568,Deir ez Zor to WGS 84 (1),concatenated operation,4227,4326,EPSG-Syr,1,2329,Oil exploration,,,,"Can be implemented as a position vector tfm with param. values dX=-174.6 dY=-3.1 dZ=238.1m; rX=rY=0 rZ=0.814""; dS=-0.38 ppm.",EPSG,EPSG,2000-10-19 00:00:00,,1,0
+8569,ED50 to WGS 84 (21),concatenated operation,4230,4326,EPSG-Nor N65 1997,21,2332,Oil exploration before 1997/2001.,,,,Included in Statens Kartverk programme wsktrans between 1997 (v3.1) and 2001 (v4.0). Superseded by ED50 to WGS 84 (23) (code 1612) in April 2001.,EPSG guidance note #10.,EPSG,2000-10-19 00:00:00,2001.224,1,0
+8570,ED50 to ETRS89 (2),concatenated operation,4230,4258,5Nat-NSea98,2,2330,Offshore.,,,,Taken from ED50 to WGS 84 (14) (code 8046). In 1998 agreed that within the accuracy of that transformation WGS 84 equates to ETRS89 and the transformation would relate ED50 to ETRS89.,Statens Kartverk.,EPSG,2001-06-05 00:00:00,2000.72 2001.06,1,0
+8571,Accra to WGS 84 (2),concatenated operation,4168,4326,EPSG-Gha,2,1505,Oil industry.,,,,"Can be implemented as a position vector tfm with param. values dX=-171.16 dY=17.29 dZ=325.21m; rX=rY=0 rZ=0.814""; dS=-0.38 ppm. Found in use within oil industry erroneously concatenated as dX=-171.16 dY=17.29 dZ=327.81m; rX=rY0 rZ=0.554"" dS=0.2263 ppm.",EPSG,EPSG,2000-10-19 00:00:00,,1,0
+8572,Amersfoort to WGS 84 (2),concatenated operation,4289,4326,EPSG-Nld,2,1275,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,,,,Parameter values for step 1 from Amersfoort to ETRS89 (2) (code 1751). Step 2 assumes that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation. Supersedes Amersfoort to WGS 84 (1) (code 1112).,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8573,RGF93 to WGS 84 (1),concatenated operation,4171,4326,EPSG-Fra,1,1096,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8574,American Samoa 1962 to WGS 84 (2),concatenated operation,4169,4326,EPSG-Asm,2,2288,"Transformation actually to NAD83(HARN), but for many purposes NAD83(HARN) can be considered to be coincident with WGS 84.",,,,"Transformation actually to NAD83(HARN), but for many purposes NAD83(HARNS) can be considered to be coincident with WGS 84.",EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8575,American Samoa 1962 to WGS 84 (3),concatenated operation,4169,4326,EPSG-Asm,3,2289,"Transformation actually to NAD83(HARN), but for many purposes NAD83(HARN) can be considered to be coincident with WGS 84.",,,,"Transformation actually to NAD83(HARN), but for many purposes NAD83(HARNS) can be considered to be coincident with WGS 84.",EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8576,AGD66 to WGS 84 (9),concatenated operation,4202,4326,EPSG-Aus Tas 1m,9,1282,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84. Supersedes AGD66 to WGS 84 (4) (code 8398).,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8577,AGD66 to WGS 84 (10),concatenated operation,4202,4326,EPSG-Aus NT,10,2284,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8578,AGD66 to WGS 84 (11),concatenated operation,4202,4326,EPSG-Aus,11,2287,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84. Supersedes AGD66 to WGS 84 (3) (code 8396) and AGD66 to WGS 84 (6) (code 8408).,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8579,AGD84 to WGS 84 (6),concatenated operation,4203,4326,EPSG-Aus WA,6,1280,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84. Supersedes AGD84 to WGS 84 (5) (code 8560).,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8580,IRENET95 to WGS 84 (1),concatenated operation,4173,4326,OSI-Ire,1,1305,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8581,PSD93 to WGS 84 (2),concatenated operation,4134,4326,PDO-Omn 93,2,1183,Oil exploration.,,,,"Superseded by PSD93 to WGS 84 (1) (code 1439) in 1997. Can be implemented as a position vector tfm with parameter values dX= -182.046 dY= -225.604 dZ=+173.384m rX= -0.616 rY= -1.655 rZ=+8.378"" dS=16.8673ppm.",Petroleum Development Oman,EPSG,2001-06-05 00:00:00,,1,0
+8582,Old Hawaiian to WGS 84 (2),concatenated operation,4135,4326,EPSG-Usa Hi,2,1334,Approximation at the +/- 1m level.,,,,Transformation steps are from Old Hawaiian to NAD83(HARN) (1) (code 8508) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8583,Puerto Rico to WGS 84 (2),concatenated operation,4139,4326,EPSG-PRVI,2,1335,Approximation at the +/- 1m level.,,,,Transformation steps are from Puerto Rico to NAD83(HARN) (1) (code 8481) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2002-01-18 00:00:00,2002.02,1,0
+8584,NAD27 to NAD83(CSRS98) (3),concatenated operation,4267,4140,EPSG-Can AB,3,2376,Accuracy 1-2 metres.,,,,Can be taken as an approximate transformation NAD27 to WGS 84 - see code 8585.,EPSG,EPSG,2001-08-15 00:00:00,,1,1
+8585,NAD27 to WGS 84 (36),concatenated operation,4267,4326,EPSG-Can AB,36,2376,Approximation at the +/- 1m level.,,,,Steps based on concatenated transformation NAD27 to NAD83(CSRS) (3) (code 8635) assuming that NAD83(CSRS) is equivalent to WGS 84.,EPSG,EPSG,2002-07-13 00:00:00,2002.41,1,0
+8586,NAD27 to NAD83(HARN) (38),concatenated operation,4267,4152,NGS-Usa AR,38,1374,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8592.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+8587,NAD27 to NAD83(HARN) (39),concatenated operation,4267,4152,NGS-Usa IA,39,1384,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8600.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+8588,NAD27 to NAD83(HARN) (40),concatenated operation,4267,4152,NGS-Usa MN,40,1392,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8608.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+8589,NAD27 to NAD83(HARN) (41),concatenated operation,4267,4152,NGS-Usa MO,41,1394,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8610.,US Coast & Geodetic Survey ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+8590,NAD27 to WGS 84 (37),concatenated operation,4267,4152,EPSG-Usa AL,37,1372,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (1) (code 8460) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8591,NAD27 to WGS 84 (38),concatenated operation,4267,4326,EPSG-Usa AZ,38,1373,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (2) (code 8461) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8592,NAD27 to WGS 84 (39),concatenated operation,4267,4326,EPSG-Usa AR,39,1374,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (38) (code 8586) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8593,NAD27 to WGS 84 (40),concatenated operation,4267,4326,EPSG-Usa CA n,40,2297,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (3) (code 8462) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8594,NAD27 to WGS 84 (41),concatenated operation,4267,4326,EPSG-Usa CA s,41,2298,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (4) (code 8463) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8595,NAD27 to WGS 84 (42),concatenated operation,4267,4326,EPSG-Usa CO,42,1376,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (5) (code 8464) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8596,NAD27 to WGS 84 (43),concatenated operation,4267,4326,EPSG-Usa FL,43,1379,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (7) (code 8466) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8597,NAD27 to WGS 84 (44),concatenated operation,4267,4326,EPSG-Usa GA,44,1380,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (6) (code 8465) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8598,NAD27 to WGS 84 (45),concatenated operation,4267,4326,EPSG-Usa IL,45,1382,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (36) (code 8553) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8599,NAD27 to WGS 84 (46),concatenated operation,4267,4326,EPSG-Usa IN,46,1383,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (30) (code 8509) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8600,NAD27 to WGS 84 (47),concatenated operation,4267,4326,EPSG-Usa IA,47,1384,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (39) (code 8587) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8601,NAD27 to WGS 84 (48),concatenated operation,4267,4326,EPSG-Usa KS,48,1385,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (31) (code 8510) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8602,NAD27 to WGS 84 (49),concatenated operation,4267,4326,EPSG-Usa KY,49,1386,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (10) (code 8469) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8603,NAD27 to WGS 84 (50),concatenated operation,4267,4326,EPSG-Usa LA,50,1387,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (11) (code 8470) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8604,NAD27 to WGS 84 (51),concatenated operation,4267,4326,EPSG-Usa ME,51,1388,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (13) (code 8472) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8605,NAD27 to WGS 84 (52),concatenated operation,4267,4326,EPSG-Usa DE MD,52,2377,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (12) (code 8471) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8606,NAD27 to WGS 84 (53),concatenated operation,4267,4326,EPSG-Usa NewEng,53,2378,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (17) (code 8476) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8607,NAD27 to WGS 84 (54),concatenated operation,4267,4326,EPSG-Usa MI,54,1391,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (14) (code 8473) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8608,NAD27 to WGS 84 (55),concatenated operation,4267,4326,EPSG-Usa MN,55,1392,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (40) (code 8588) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8609,NAD27 to WGS 84 (56),concatenated operation,4267,4326,EPSG-Usa MS,56,1393,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (15) (code 8474) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8610,NAD27 to WGS 84 (57),concatenated operation,4267,4326,EPSG-Usa MO,57,1394,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (41) (code 8589) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8611,NAD27 to WGS 84 (58),concatenated operation,4267,4326,EPSG-Usa ID MT e,58,2382,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (8) (code 8467) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8612,NAD27 to WGS 84 (59),concatenated operation,4267,4326,EPSG-Usa ID MT w,59,2383,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (9) (code 8468) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8613,NAD27 to WGS 84 (60),concatenated operation,4267,4326,EPSG-Usa NE,60,1396,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (16) (code 8475) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8614,NAD27 to WGS 84 (61),concatenated operation,4267,4326,EPSG-Usa NV,61,1397,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (32) (code 8511) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8615,NAD27 to WGS 84 (62),concatenated operation,4267,4326,EPSG-Usa NJ,62,1399,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (37) (code 8554) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8616,NAD27 to WGS 84 (63),concatenated operation,4267,4326,EPSG-Usa NM,63,1400,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (18) (code 8477) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8617,NAD27 to WGS 84 (64),concatenated operation,4267,4326,EPSG-Usa NY,64,1401,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (19) (code 8478) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8618,NAD27 to WGS 84 (65),concatenated operation,4267,4326,EPSG-Usa ND,65,1403,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (20) (code 8479) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8619,NAD27 to WGS 84 (66),concatenated operation,4267,4326,EPSG-Usa OH,66,1404,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (33) (code 8512) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8620,NAD27 to WGS 84 (67),concatenated operation,4267,4326,EPSG-Usa OK,67,1405,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (21) (code 8480) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8621,NAD27 to WGS 84 (68),concatenated operation,4267,4326,EPSG-Usa OR WA,68,2381,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (27) (code 8487) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8622,NAD27 to WGS 84 (69),concatenated operation,4267,4326,EPSG-Usa SD,69,1410,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (22) (code 8482) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8623,NAD27 to WGS 84 (70),concatenated operation,4267,4326,EPSG-Usa TN,70,1411,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (23) (code 8483) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8624,NAD27 to WGS 84 (71),concatenated operation,4267,4326,EPSG-Usa TX e,71,2379,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (24) (code 8484) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8625,NAD27 to WGS 84 (72),concatenated operation,4267,4326,EPSG-Usa TX w,72,2380,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (25) (code 8485) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8626,NAD27 to WGS 84 (73),concatenated operation,4267,4326,EPSG-Usa UT,73,1413,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (34) (code 8513) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8627,NAD27 to WGS 84 (74),concatenated operation,4267,4326,EPSG-Usa VA,74,1415,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (26) (code 8486) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8628,NAD27 to WGS 84 (75),concatenated operation,4267,4326,EPSG-Usa WV,75,1417,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (35) (code 8514) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8629,NAD27 to WGS 84 (76),concatenated operation,4267,4326,EPSG-Usa WI,76,1418,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (28) (code 8488) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8630,NAD27 to WGS 84 (77),concatenated operation,4267,4326,EPSG-Usa WY,77,1419,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (29) (code 8489) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8631,Garoua to WGS 84 (1),concatenated operation,4197,4326,EPSG-Cmr,1,2590,Oil industry.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,1,0
+8632,Kousseri to WGS 84 (1),concatenated operation,4198,4326,EPSG-Cmr,1,2591,Oil industry.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,1,0
+8633,Yoff to WGS 84 (1),concatenated operation,4310,4326,EPSG-SEN,1,1207,Military purposes.,,,,"Derived via WGS72. Can be used as a single positon vector transformation with parameter vaues of dX = -37 m, dY = +157 m, dZ = +89.5 m, rX = rY = 0 sec, RZ = 0.554 sec, dS = 0.219 ppm",TotalFinaElf,EPSG,2002-06-22 00:00:00,,1,0
+8634,Beduaram to WGS 84 (1),concatenated operation,4213,4326,ELF-Ner SE,1,2771,Oil exploration.,,,,"Derived via WGS72BE. Can be used as a single positon vector transformation with parameter vaues of dX = -101 m, dY = -111 m, dZ = +188.9 m, rX = rY = 0 sec, RZ = 0.814 sec, dS = -0.38 ppm",TotalFinaElf,EPSG,2002-06-28 00:00:00,,1,0
+8635,NAD27 to NAD83(CSRS) (3),concatenated operation,4267,4617,EPSG-Can AB,3,2376,Accuracy 1-2 metres.,,,,Can be taken as an approximate transformation NAD27 to WGS 84 - see code 8585.,EPSG,EPSG,2002-07-13 00:00:00,,1,0
+10101,Alabama CS27 East zone,conversion,,,,,2154,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+10102,Alabama CS27 West zone,conversion,,,,,2155,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+10131,SPCS83 Alabama East zone (meters),conversion,,,,,2154,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+10132,SPCS83 Alabama West zone (meters),conversion,,,,,2155,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+10201,Arizona Coordinate System East zone,conversion,,,,,2167,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+10202,Arizona Coordinate System Central zone,conversion,,,,,2166,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+10203,Arizona Coordinate System West zone,conversion,,,,,2168,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+10231,SPCS83 Arizona East zone (meters),conversion,,,,,2167,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines origin in International feet. FE = 700000ft. See code 15304 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2000.093 2001.03,1,0
+10232,SPCS83 Arizona Central zone (meters),conversion,,,,,2166,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines origin in International feet. FE = 700000ft. See code 15305 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+10233,SPCS83 Arizona West zone (meters),conversion,,,,,2168,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines origin in International feet. FE = 700000ft. See code 15306 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2000.093 2001.03,1,0
+10301,Arkansas CS27 North,conversion,,,,,2169,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10302,Arkansas CS27 South,conversion,,,,,2170,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10331,SPCS83 Arkansas North zone (meters),conversion,,,,,2169,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+10332,SPCS83 Arkansas South zone (meters),conversion,,,,,2170,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+10401,California CS27 zone I,conversion,,,,,2175,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10402,California CS27 zone II,conversion,,,,,2176,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10403,California CS27 zone III,conversion,,,,,2177,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10404,California CS27 zone IV,conversion,,,,,2178,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10405,California CS27 zone V,conversion,,,,,2179,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10406,California CS27 zone VI,conversion,,,,,2180,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10407,California CS27 zone VII,conversion,,,,,2181,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10431,SPCS83 California zone 1 (meters),conversion,,,,,2175,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15307 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+10432,SPCS83 California zone 2 (meters),conversion,,,,,2176,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15308 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+10433,SPCS83 California zone 3 (meters),conversion,,,,,2177,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15309 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+10434,SPCS83 California zone 4 (meters),conversion,,,,,2178,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15310 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+10435,SPCS83 California zone 5 (meters),conversion,,,,,2182,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15311 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+10436,SPCS83 California zone 6 (meters),conversion,,,,,2180,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15312 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+10501,Colorado CS27 North zone,conversion,,,,,2184,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10502,Colorado CS27 Central zone,conversion,,,,,2183,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10503,Colorado CS27 South zone,conversion,,,,,2185,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10531,SPCS83 Colorado North zone (meters),conversion,,,,,2184,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15313 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+10532,SPCS83 Colorado Central zone (meters),conversion,,,,,2183,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15314 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+10533,SPCS83 Colorado South zone (meters),conversion,,,,,2185,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15315 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+10600,Connecticut CS27,conversion,,,,,1377,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 99.28 2000.094,1,0
+10630,SPCS83 Connecticut zone (meters),conversion,,,,,1377,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15316 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2000.094 2001.03,1,0
+10700,Delaware CS27,conversion,,,,,1378,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+10730,SPCS83 Delaware zone (meters),conversion,,,,,1378,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15317 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2000.094 2001.03,1,0
+10901,Florida CS27 East zone,conversion,,,,,2186,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+10902,Florida CS27 West zone,conversion,,,,,2188,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+10903,Florida CS27 North zone,conversion,,,,,2187,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+10931,SPCS83 Florida East zone (meters),conversion,,,,,2186,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15318 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+10932,SPCS83 Florida West zone (meters),conversion,,,,,2188,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15319 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+10933,SPCS83 Florida North zone (meters),conversion,,,,,2187,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15320 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+11001,Georgia CS27 East zone,conversion,,,,,2189,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+11002,Georgia CS27 West zone,conversion,,,,,2190,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+11031,SPCS83 Georgia East zone (meters),conversion,,,,,2189,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15321 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+11032,SPCS83 Georgia West zone (meters),conversion,,,,,2190,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15322 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+11101,Idaho CS27 East zone,conversion,,,,,2192,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+11102,Idaho CS27 Central zone,conversion,,,,,2191,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+11103,Idaho CS27 West zone,conversion,,,,,2193,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+11131,SPCS83 Idaho East zone (meters),conversion,,,,,2192,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15323 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+11132,SPCS83 Idaho Central zone (meters),conversion,,,,,2191,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15324 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+11133,SPCS83 Idaho West zone (meters),conversion,,,,,2193,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15325 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+11201,Illinois CS27 East zone,conversion,,,,,2194,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+11202,Illinois CS27 West zone,conversion,,,,,2195,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+11231,SPCS83 Illinois East zone (meters),conversion,,,,,2194,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+11232,SPCS83 Illinois West zone (meters),conversion,,,,,2195,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+11301,Indiana CS27 East zone,conversion,,,,,2196,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+11302,Indiana CS27 West zone,conversion,,,,,2197,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+11331,SPCS83 Indiana East zone (meters),conversion,,,,,2196,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15326 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+11332,SPCS83 Indiana West zone (meters),conversion,,,,,2197,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15327 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+11401,Iowa CS27 North zone,conversion,,,,,2198,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+11402,Iowa CS27 South zone,conversion,,,,,2199,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+11431,SPCS83 Iowa North zone (meters),conversion,,,,,2198,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+11432,SPCS83 Iowa South zone (meters),conversion,,,,,2199,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+11501,Kansas CS27 North zone,conversion,,,,,2200,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+11502,Kansas CS27 South zone,conversion,,,,,2201,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+11531,SPCS83 Kansas North zone (meters),conversion,,,,,2200,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+11532,SPCS83 Kansas South zone (meters),conversion,,,,,2201,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+11601,Kentucky CS27 North zone,conversion,,,,,2202,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+11602,Kentucky CS27 South zone,conversion,,,,,2203,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+11631,Kentucky CS83 North zone,conversion,,,,,2202,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28,1,1
+11632,SPCS83 Kentucky South zone (meters),conversion,,,,,2203,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15329 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+11701,Louisiana CS27 North zone,conversion,,,,,2204,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+11702,Louisiana CS27 South zone,conversion,,,,,2205,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+11731,SPCS83 Louisiana North zone (meters),conversion,,,,,2204,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+11732,SPCS83 Louisiana South zone (meters),conversion,,,,,2529,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+11801,Maine CS27 East zone,conversion,,,,,2206,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+11802,Maine CS27 West zone,conversion,,,,,2207,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+11831,SPCS83 Maine East zone (meters),conversion,,,,,2206,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+11832,SPCS83 Maine West zone (meters),conversion,,,,,2207,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+11900,Maryland CS27,conversion,,,,,1389,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 99.28 2000.094,1,0
+11930,SPCS83 Maryland zone (meters),conversion,,,,,1389,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15330 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2000.094 2001.03,1,0
+12001,Massachusetts CS27 Mainland zone,conversion,,,,,2209,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+12002,Massachusetts CS27 Island zone,conversion,,,,,2208,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+12031,SPCS83 Massachusetts Mainland zone (meters),conversion,,,,,2209,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15331 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28 2001.03,1,0
+12032,SPCS83 Massachusetts Island zone (meters),conversion,,,,,2208,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15332 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+12101,Michigan State Plane East zone,conversion,,,,,1720,Obsolete.,9807,,,Superseded by north central and south zones.,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 98.22 2000.092,1,0
+12102,Michigan State Plane Old Central zone,conversion,,,,,1721,Obsolete.,9807,,,Superseded by north central and south zones.,USGS Professional Paper #1395,EPSG,1998-11-11 00:00:00,95.30 96.29 98.22,1,0
+12103,Michigan State Plane West zone,conversion,,,,,1722,Obsolete.,9807,,,Superseded by north central and south zones.,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 98.22 2000.092,1,0
+12111,Michigan CS27 North zone,conversion,,,,,1723,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.28 96.29 98.22 99.28,1,0
+12112,Michigan CS27 Central zone,conversion,,,,,1724,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.28 96.29 98.22 99.28,1,0
+12113,Michigan CS27 South zone,conversion,,,,,1725,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.28 96.29 98.22 99.28,1,0
+12141,SPCS83 Michigan North zone (meters),conversion,,,,,1723,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15333 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+12142,SPCS83 Michigan Central zone (meters),conversion,,,,,1724,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15334 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+12143,SPCS83 Michigan South zone (meters),conversion,,,,,1725,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15335 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+12201,Minnesota CS27 North zone,conversion,,,,,2214,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+12202,Minnesota CS27 Central zone,conversion,,,,,2213,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+12203,Minnesota CS27 South zone,conversion,,,,,2215,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+12231,SPCS83 Minnesota North zone (meters),conversion,,,,,2214,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+12232,SPCS83 Minnesota Central zone (meters),conversion,,,,,2213,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+12233,SPCS83 Minnesota South zone (meters),conversion,,,,,2215,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+12301,Mississippi CS27 East zone,conversion,,,,,2216,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+12302,Mississippi CS27 West zone,conversion,,,,,2217,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+12331,SPCS83 Mississippi East zone (meters),conversion,,,,,2216,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15336 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+12332,SPCS83 Mississippi West zone (meters),conversion,,,,,2217,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15337 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+12401,Missouri CS27 East zone,conversion,,,,,2219,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.18 95.30 96.29 2000.092,1,0
+12402,Missouri CS27 Central zone,conversion,,,,,2218,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+12403,Missouri CS27 West zone,conversion,,,,,2220,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+12431,SPCS83 Missouri East zone (meters),conversion,,,,,2219,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+12432,SPCS83 Missouri Central zone (meters),conversion,,,,,2218,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+12433,SPCS83 Missouri West zone (meters),conversion,,,,,2220,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+12501,Montana CS27 North zone,conversion,,,,,2211,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+12502,Montana CS27 Central zone,conversion,,,,,2210,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+12503,Montana CS27 South zone,conversion,,,,,2212,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+12530,SPCS83 Montana zone (meters),conversion,,,,,1395,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15338 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2000.094 2001.03,1,0
+12601,Nebraska CS27 North zone,conversion,,,,,2221,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+12602,Nebraska CS27 South zone,conversion,,,,,2222,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+12630,SPCS83 Nebraska zone (meters),conversion,,,,,1396,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2000.094 2001.03,1,0
+12701,Nevada CS27 East zone,conversion,,,,,2224,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+12702,Nevada CS27 Central zone,conversion,,,,,2223,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.093,1,0
+12703,Nevada CS27 West zone,conversion,,,,,2225,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+12731,SPCS83 Nevada East zone (meters),conversion,,,,,2224,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+12732,SPCS83 Nevada Central zone (meters),conversion,,,,,2223,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+12733,SPCS83 Nevada West zone (meters),conversion,,,,,2225,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+12800,New Hampshire CS27,conversion,,,,,1398,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+12830,SPCS83 New Hampshire zone (meters),conversion,,,,,1398,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2000.094 2001.03,1,0
+12900,New Jersey CS27,conversion,,,,,1399,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.094,1,0
+12930,SPCS83 New Jersey zone (meters),conversion,,,,,1399,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2000.094 2001.03,1,0
+13001,New Mexico CS27 East zone,conversion,,,,,2228,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+13002,New Mexico CS27 Central zone,conversion,,,,,2229,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+13003,New Mexico CS27 West zone,conversion,,,,,2230,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+13031,SPCS83 New Mexico East zone (meters),conversion,,,,,2228,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15339 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+13032,SPCS83 New Mexico Central zone (meters),conversion,,,,,2231,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15340 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+13033,SPCS83 New Mexico West zone (meters),conversion,,,,,2232,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15341 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+13101,New York CS27 East zone,conversion,,,,,2234,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.18 95.30 96.29 2000.092,1,0
+13102,New York CS27 Central zone,conversion,,,,,2233,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+13103,New York CS27 West zone,conversion,,,,,2236,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+13104,New York CS27 Long Island zone,conversion,,,,,2235,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13131,SPCS83 New York East zone (meters),conversion,,,,,2234,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15342 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+13132,SPCS83 New York Central zone (meters),conversion,,,,,2233,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15343 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+13133,SPCS83 New York West zone (meters),conversion,,,,,2236,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15344 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+13134,SPCS83 New York Long Island zone (meters),conversion,,,,,2235,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15345 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+13200,North Carolina CS27,conversion,,,,,1402,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 99.28 2000.094,1,0
+13230,SPCS83 North Carolina zone (meters),conversion,,,,,1402,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15346 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2000.094 2001.03,1,0
+13301,North Dakota CS27 North zone,conversion,,,,,2237,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13302,North Dakota CS27 South zone,conversion,,,,,2238,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13331,SPCS83 North Dakota North zone (meters),conversion,,,,,2237,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15347 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+13332,SPCS83 North Dakota South zone (meters),conversion,,,,,2238,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15348 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+13401,Ohio CS27 North zone,conversion,,,,,2239,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13402,Ohio CS27 South zone,conversion,,,,,2240,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13431,SPCS83 Ohio North zone (meters),conversion,,,,,2239,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+13432,SPCS83 Ohio South zone (meters),conversion,,,,,2240,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+13501,Oklahoma CS27 North zone,conversion,,,,,2241,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13502,Oklahoma CS27 South zone,conversion,,,,,2242,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13531,SPCS83 Oklahoma North zone (meters),conversion,,,,,2241,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15349 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+13532,SPCS83 Oklahoma South zone (meters),conversion,,,,,2242,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15350 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+13601,Oregon CS27 North zone,conversion,,,,,2243,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13602,Oregon CS27 South zone,conversion,,,,,2244,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13631,SPCS83 Oregon North zone (meters),conversion,,,,,2243,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15351 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+13632,SPCS83 Oregon South zone (meters),conversion,,,,,2244,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15352 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+13701,Pennsylvania CS27 North zone,conversion,,,,,2245,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13702,Pennsylvania CS27 South zone,conversion,,,,,2246,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13731,SPCS83 Pennsylvania North zone (meters),conversion,,,,,2245,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15353 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+13732,SPCS83 Pennsylvania South zone (meters),conversion,,,,,2246,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15354 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+13800,Rhode Island CS27,conversion,,,,,1408,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.094,1,0
+13830,SPCS83 Rhode Island zone (meters),conversion,,,,,1408,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2000.094 2001.03,1,0
+13901,South Carolina CS27 North zone,conversion,,,,,2247,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13902,South Carolina CS27 South zone,conversion,,,,,2248,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+13930,SPCS83 South Carolina zone (meters),conversion,,,,,1409,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15355 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2000.094 2001.03,1,0
+14001,South Dakota CS27 North zone,conversion,,,,,2249,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14002,South Dakota CS27 South zone,conversion,,,,,2250,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14031,SPCS83 South Dakota North zone (meters),conversion,,,,,2249,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14032,SPCS83 South Dakota South zone (meters),conversion,,,,,2250,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14100,Tennessee CS27,conversion,,,,,1411,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 99.28 2000.094,1,1
+14130,SPCS83 Tennessee zone (meters),conversion,,,,,1411,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15356 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2000.094 2001.03,1,0
+14201,Texas CS27 North zone,conversion,,,,,2253,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14202,Texas CS27 North Central zone,conversion,,,,,2254,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14203,Texas CS27 Central zone,conversion,,,,,2252,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14204,Texas CS27 South Central zone,conversion,,,,,2256,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14205,Texas CS27 South zone,conversion,,,,,2255,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14231,SPCS83 Texas North zone (meters),conversion,,,,,2253,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15357 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14232,SPCS83 Texas North Central zone (meters),conversion,,,,,2254,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15358 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14233,SPCS83 Texas Central zone (meters),conversion,,,,,2252,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15359 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14234,SPCS83 Texas South Central zone (meters),conversion,,,,,2527,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15360 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14235,SPCS83 Texas South zone (meters),conversion,,,,,2528,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15361 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14301,Utah CS27 North zone,conversion,,,,,2258,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14302,Utah CS27 Central zone,conversion,,,,,2257,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14303,Utah CS27 South zone,conversion,,,,,2259,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14331,SPCS83 Utah North zone (meters),conversion,,,,,2258,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15362 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14332,SPCS83 Utah Central zone (meters),conversion,,,,,2257,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15363 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14333,SPCS83 Utah South zone (meters),conversion,,,,,2259,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15364 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14400,Vermont CS27,conversion,,,,,1414,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.094,1,0
+14430,SPCS83 Vermont zone (meters),conversion,,,,,1414,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2000.094 2001.03,1,0
+14501,Virginia CS27 North zone,conversion,,,,,2260,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14502,Virginia CS27 South zone,conversion,,,,,2261,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14531,SPCS83 Virginia North zone (meters),conversion,,,,,2260,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15365 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14532,SPCS83 Virginia South zone (meters),conversion,,,,,2261,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15366 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14601,Washington CS27 North zone,conversion,,,,,2262,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14602,Washington CS27 South zone,conversion,,,,,2263,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14631,SPCS83 Washington North zone (meters),conversion,,,,,2273,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15367 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14632,SPCS83 Washington South zone (meters),conversion,,,,,2274,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15368 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14701,West Virginia CS27 North zone,conversion,,,,,2264,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14702,West Virginia CS27 South zone,conversion,,,,,2265,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14731,SPCS83 West Virginia North zone (meters),conversion,,,,,2264,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14732,SPCS83 West Virginia South zone (meters),conversion,,,,,2265,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14801,Wisconsin CS27 North zone,conversion,,,,,2267,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14802,Wisconsin CS27 Central zone,conversion,,,,,2266,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14803,Wisconsin CS27 South zone,conversion,,,,,2268,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+14831,SPCS83 Wisconsin North zone (meters),conversion,,,,,2267,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15369 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14832,SPCS83 Wisconsin Central zone (meters),conversion,,,,,2266,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15370 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14833,SPCS83 Wisconsin South zone (meters),conversion,,,,,2268,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15371 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+14901,Wyoming CS27 East zone,conversion,,,,,2269,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+14902,Wyoming CS27 East Central zone,conversion,,,,,2270,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+14903,Wyoming CS27 West Central zone,conversion,,,,,2272,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+14904,Wyoming CS27 West zone,conversion,,,,,2271,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 2000.092,1,0
+14931,SPCS83 Wyoming East zone (meters),conversion,,,,,2269,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2000.092 2001.03,1,0
+14932,SPCS83 Wyoming East Central zone (meters),conversion,,,,,2270,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2000.092 2001.03,1,0
+14933,SPCS83 Wyoming West Central zone (meters),conversion,,,,,2272,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2000.092 2001.03,1,0
+14934,SPCS83 Wyoming West zone (meters),conversion,,,,,2271,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2000.092 2001.03,1,0
+15001,Alaska CS27 zone 1,conversion,,,,,2156,Used for large and medium scale topographic mapping and engineering survey.,9812,,,"If using Oblique Mercator method (code 9815), Ec=2685642.82 ftUS, Nc=1887198.47 ftUS.",USGS Professional Paper #1395,EPSG,1997-04-11 00:00:00,96.29 97.08,1,0
+15002,Alaska CS27 zone 2,conversion,,,,,2158,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15003,Alaska CS27 zone 3,conversion,,,,,2159,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15004,Alaska CS27 zone 4,conversion,,,,,2160,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15005,Alaska CS27 zone 5,conversion,,,,,2161,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15006,Alaska CS27 zone 6,conversion,,,,,2162,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15007,Alaska CS27 zone 7,conversion,,,,,2163,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15008,Alaska CS27 zone 8,conversion,,,,,2164,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15009,Alaska CS27 zone 9,conversion,,,,,2165,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15010,Alaska CS27 zone 10,conversion,,,,,2157,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+15031,SPCS83 Alaska zone 1 (meters),conversion,,,,,2156,Used for large and medium scale topographic mapping and engineering survey.,9812,,,"If using Oblique Mercator method (code 9815), Ec=818585.57 m, Nc=575219.25 m.",NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,96.29 2001.03,1,0
+15032,SPCS83 Alaska zone 2 (meters),conversion,,,,,2158,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15033,SPCS83 Alaska zone 3 (meters),conversion,,,,,2159,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15034,SPCS83 Alaska zone 4 (meters),conversion,,,,,2160,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15035,SPCS83 Alaska zone 5 (meters),conversion,,,,,2161,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15036,SPCS83 Alaska zone 6 (meters),conversion,,,,,2162,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15037,SPCS83 Alaska zone 7 (meters),conversion,,,,,2163,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15038,SPCS83 Alaska zone 8 (meters),conversion,,,,,2164,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15039,SPCS83 Alaska zone 9 (meters),conversion,,,,,2165,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15040,SPCS83 Alaska zone 10 (meters),conversion,,,,,2157,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+15101,Hawaii CS27 zone 1,conversion,,,,,1546,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15102,Hawaii CS27 zone 2,conversion,,,,,1547,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15103,Hawaii CS27 zone 3,conversion,,,,,1548,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15104,Hawaii CS27 zone 4,conversion,,,,,1549,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15105,Hawaii CS27 zone 5,conversion,,,,,1550,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+15131,SPCS83 Hawaii zone 1 (meters),conversion,,,,,1546,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15132,SPCS83 Hawaii zone 2 (meters),conversion,,,,,1547,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15133,SPCS83 Hawaii zone 3 (meters),conversion,,,,,1548,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15134,SPCS83 Hawaii zone 4 (meters),conversion,,,,,1549,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15135,SPCS83 Hawaii zone 5 (meters),conversion,,,,,1550,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 2001.03,1,0
+15201,Puerto Rico CS27,conversion,,,,,1194,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 99.28 2000.094,1,0
+15202,St. Croix CS27,conversion,,,,,1254,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30 96.29 99.28 2000.094,1,0
+15230,SPCS83 Puerto Rico & Virgin Islands zone (meters),conversion,,,,,2251,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30 96.29 99.28 2001.03,1,0
+15300,American Samoa Lambert,conversion,,,,,1027,Used for large and medium scale topographic mapping and engineering survey.,9801,,,Per Snyder: Map Projections - a Working Manual: At origin x=500000 ft; y=o but radius to latitude of origin = -82000000 feet. US National Geodetic Survey confirms use of zero for False Northing.,US National Geodetic Survey (NGS),EPSG,2000-10-19 00:00:00,,1,1
+15301,American Samoa Lambert,conversion,,,,,1027,Used for large and medium scale topographic mapping and engineering survey.,9801,,,Per Snyder: Map Projections - a Working Manual: At origin x=500000 ft; y=o but radius to latitude of origin = -82000000 feet. US National Geodetic Survey confirms use of zero for False Northing.,US National Geodetic Survey (NGS),EPSG,2001-08-28 00:00:00,,1,0
+15302,Tennessee CS27,conversion,,,,,1411,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2001-10-04 00:00:00,2001.45,1,0
+15303,SPCS83 Kentucky North zone (meters),conversion,,,,,2202,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15328 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-10-04 00:00:00,2001.03 2001.45,1,0
+15304,SPCS83 Arizona East zone (International feet),conversion,,,,,2167,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 10231.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15305,SPCS83 Arizona Central zone (International feet),conversion,,,,,2166,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 10232.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15306,SPCS83 Arizona West zone (International feet),conversion,,,,,2168,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 10233.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15307,SPCS83 California zone 1 (US Survey feet),conversion,,,,,2175,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10431.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15308,SPCS83 California zone 2 (US Survey feet),conversion,,,,,2176,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10432.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15309,SPCS83 California zone 3 (US Survey feet),conversion,,,,,2177,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10433.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15310,SPCS83 California zone 4 (US Survey feet),conversion,,,,,2178,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10434.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15311,SPCS83 California zone 5 (US Survey feet),conversion,,,,,2182,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10435.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15312,SPCS83 California zone 6 (US Survey feet),conversion,,,,,2180,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10436.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15313,SPCS83 Colorado North zone (US Survey feet),conversion,,,,,2184,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10531.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15314,SPCS83 Colorado Central zone (US Survey feet),conversion,,,,,2183,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10532.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15315,SPCS83 Colorado South zone (US Survey feet),conversion,,,,,2185,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10533.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15316,SPCS83 Connecticut zone (US Survey feet),conversion,,,,,1377,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10630.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15317,SPCS83 Delaware zone (US Survey feet),conversion,,,,,1378,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10730.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15318,SPCS83 Florida East zone (US Survey feet),conversion,,,,,2186,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10931.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15319,SPCS83 Florida West zone (US Survey feet),conversion,,,,,2188,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10932.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15320,SPCS83 Florida North zone (US Survey feet),conversion,,,,,2187,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10933.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15321,SPCS83 Georgia East zone (US Survey feet),conversion,,,,,2189,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11031.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15322,SPCS83 Georgia West zone (US Survey feet),conversion,,,,,2190,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10031.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15323,SPCS83 Idaho East zone (US Survey feet),conversion,,,,,2192,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11131.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15324,SPCS83 Idaho Central zone (US Survey feet),conversion,,,,,2191,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11132.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15325,SPCS83 Idaho West zone (US Survey feet),conversion,,,,,2193,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11133.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15326,SPCS83 Indiana East zone (US Survey feet),conversion,,,,,2196,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11331.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15327,SPCS83 Indiana West zone (US Survey feet),conversion,,,,,2197,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11332.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15328,SPCS83 Kentucky North zone (US Survey feet),conversion,,,,,2202,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 15303.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15329,SPCS83 Kentucky South zone (US Survey feet),conversion,,,,,2203,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11632.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15330,SPCS83 Maryland zone (US Survey feet),conversion,,,,,1389,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11930.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15331,SPCS83 Massachusetts Mainland zone (US Survey feet),conversion,,,,,2209,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 12031.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15332,SPCS83 Massachusetts Island zone (US Survey feet),conversion,,,,,2208,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 12032.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15333,SPCS83 Michigan North zone (International feet),conversion,,,,,1723,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 12141.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15334,SPCS83 Michigan Central zone (International feet),conversion,,,,,1724,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 12142.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15335,SPCS83 Michigan South zone (International feet),conversion,,,,,1725,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 12143.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15336,SPCS83 Mississippi East zone (US Survey feet),conversion,,,,,2216,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 12331.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15337,SPCS83 Mississippi West zone (US Survey feet),conversion,,,,,2217,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 12332.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15338,SPCS83 Montana zone (International feet),conversion,,,,,1395,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 12530.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15339,SPCS83 New Mexico East zone (US Survey feet),conversion,,,,,2228,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13031.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15340,SPCS83 New Mexico Central zone (US Survey feet),conversion,,,,,2231,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13032.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15341,SPCS83 New Mexico West zone (US Survey feet),conversion,,,,,2232,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13033.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15342,SPCS83 New York East zone (US Survey feet),conversion,,,,,2234,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13131.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15343,SPCS83 New York Central zone (US Survey feet),conversion,,,,,2233,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13132.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15344,SPCS83 New York West zone (US Survey feet),conversion,,,,,2236,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13133.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15345,SPCS83 New York Long Island zone (US Survey feet),conversion,,,,,2235,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13134.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15346,SPCS83 North Carolina zone (US Survey feet),conversion,,,,,1402,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13230.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15347,SPCS83 North Dakota North zone (International feet),conversion,,,,,2237,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 13331.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15348,SPCS83 North Dakota South zone (International feet),conversion,,,,,2238,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 13332.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15349,SPCS83 Oklahoma North zone (US Survey feet),conversion,,,,,2241,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13531.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15350,SPCS83 Oklahoma South zone (US Survey feet),conversion,,,,,2242,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13532.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15351,SPCS83 Oregon North zone (International feet),conversion,,,,,2243,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 13631.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15352,SPCS83 Oregon South zone (International feet),conversion,,,,,2244,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 13632.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15353,SPCS83 Pennsylvania North zone (US Survey feet),conversion,,,,,2245,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13731.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15354,SPCS83 Pennsylvania South zone (US Survey feet),conversion,,,,,2246,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13732.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15355,SPCS83 South Carolina zone (International feet),conversion,,,,,1409,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 13930.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15356,SPCS83 Tennessee zone (US Survey feet),conversion,,,,,1411,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14130.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15357,SPCS83 Texas North zone (US Survey feet),conversion,,,,,2253,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14231.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15358,SPCS83 Texas North Central zone (US Survey feet),conversion,,,,,2254,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14232.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15359,SPCS83 Texas Central zone (US Survey feet),conversion,,,,,2252,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14233.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15360,SPCS83 Texas South Central zone (US Survey feet),conversion,,,,,2527,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14234.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15361,SPCS83 Texas South zone (US Survey feet),conversion,,,,,2528,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14235.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15362,SPCS83 Utah North zone (International feet),conversion,,,,,2258,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 14331.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15363,SPCS83 Utah Central zone (International feet),conversion,,,,,2257,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 14333.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15364,SPCS83 Utah South zone (International feet),conversion,,,,,2259,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 14334.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15365,SPCS83 Virginia North zone (US Survey feet),conversion,,,,,2260,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14531.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15366,SPCS83 Virginia South zone (US Survey feet),conversion,,,,,2261,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14532.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15367,SPCS83 Washington North zone (US Survey feet),conversion,,,,,2273,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14631.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15368,SPCS83 Washington South zone (US Survey feet),conversion,,,,,2274,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14632.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15369,SPCS83 Wisconsin North zone (US Survey feet),conversion,,,,,2267,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14831.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15370,SPCS83 Wisconsin Central zone (US Survey feet),conversion,,,,,2266,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14832.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15371,SPCS83 Wisconsin South zone (US Survey feet),conversion,,,,,2268,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14833.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15914,BLM zone 14N (US survey feet),conversion,,,,,2171,US survey foot form of UTM zone 14N,9807,,,"Sometimes locally referred to as ""UTM zone 14"".",Minerals Management Service offshore protraction diagrams.,EPSG,2002-02-12 00:00:00,95.30 96.29 2002.12,1,0
+15915,BLM zone 15N (US survey feet),conversion,,,,,2172,US survey foot form of UTM zone 15N,9807,,,"Sometimes locally referred to as ""UTM zone 15"".",Minerals Management Service offshore protraction diagrams.,EPSG,2002-02-12 00:00:00,95.30 96.29 2002.12,1,0
+15916,BLM zone 16N (US survey feet),conversion,,,,,2173,US survey foot form of UTM zone 16N,9807,,,"Sometimes locally referred to as ""UTM zone 16"".",Minerals Management Service offshore protraction diagrams.,EPSG,2002-02-12 00:00:00,95.30 96.29 2002.12,1,0
+15917,BLM zone 17N (US survey feet),conversion,,,,,2174,US survey foot form of UTM zone 17N,9807,,,"Sometimes locally referred to as ""UTM zone 17"".",Minerals Management Service offshore protraction diagrams.,EPSG,2002-02-12 00:00:00,95.30 96.29 2002.12,1,0
+16000,UTM grid system (northern hemisphere),conversion,,,,,1998,For strict use within zone boundaries,9824,,,Use UTM zone xx N (codes 16001-16060) for use outwith zone boundary or when easting is not prefixed by zone number.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+16001,UTM zone 1N,conversion,,,,,1873,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16002,UTM zone 2N,conversion,,,,,1875,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16003,UTM zone 3N,conversion,,,,,1877,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16004,UTM zone 4N,conversion,,,,,1879,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16005,UTM zone 5N,conversion,,,,,1881,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16006,UTM zone 6N,conversion,,,,,1883,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16007,UTM zone 7N,conversion,,,,,1885,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16008,UTM zone 8N,conversion,,,,,1887,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16009,UTM zone 9N,conversion,,,,,1889,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16010,UTM zone 10N,conversion,,,,,1891,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16011,UTM zone 11N,conversion,,,,,1893,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16012,UTM zone 12N,conversion,,,,,1895,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16013,UTM zone 13N,conversion,,,,,1897,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16014,UTM zone 14N,conversion,,,,,1899,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16015,UTM zone 15N,conversion,,,,,1901,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16016,UTM zone 16N,conversion,,,,,1903,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16017,UTM zone 17N,conversion,,,,,1905,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16018,UTM zone 18N,conversion,,,,,1907,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16019,UTM zone 19N,conversion,,,,,1909,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16020,UTM zone 20N,conversion,,,,,1911,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16021,UTM zone 21N,conversion,,,,,1913,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16022,UTM zone 22N,conversion,,,,,1915,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16023,UTM zone 23N,conversion,,,,,1917,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16024,UTM zone 24N,conversion,,,,,1919,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16025,UTM zone 25N,conversion,,,,,1921,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16026,UTM zone 26N,conversion,,,,,1923,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16027,UTM zone 27N,conversion,,,,,1925,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16028,UTM zone 28N,conversion,,,,,1927,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16029,UTM zone 29N,conversion,,,,,1929,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16030,UTM zone 30N,conversion,,,,,1931,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16031,UTM zone 31N,conversion,,,,,1933,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16032,UTM zone 32N,conversion,,,,,1935,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16033,UTM zone 33N,conversion,,,,,1937,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16034,UTM zone 34N,conversion,,,,,1939,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16035,UTM zone 35N,conversion,,,,,1941,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16036,UTM zone 36N,conversion,,,,,1943,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16037,UTM zone 37N,conversion,,,,,1945,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16038,UTM zone 38N,conversion,,,,,1947,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16039,UTM zone 39N,conversion,,,,,1949,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16040,UTM zone 40N,conversion,,,,,1951,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16041,UTM zone 41N,conversion,,,,,1953,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16042,UTM zone 42N,conversion,,,,,1955,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16043,UTM zone 43N,conversion,,,,,1957,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16044,UTM zone 44N,conversion,,,,,1959,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16045,UTM zone 45N,conversion,,,,,1961,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16046,UTM zone 46N,conversion,,,,,1963,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16047,UTM zone 47N,conversion,,,,,1965,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16048,UTM zone 48N,conversion,,,,,1967,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16049,UTM zone 49N,conversion,,,,,1969,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16050,UTM zone 50N,conversion,,,,,1971,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16051,UTM zone 51N,conversion,,,,,1973,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16052,UTM zone 52N,conversion,,,,,1975,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16053,UTM zone 53N,conversion,,,,,1977,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16054,UTM zone 54N,conversion,,,,,1979,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16055,UTM zone 55N,conversion,,,,,1981,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16056,UTM zone 56N,conversion,,,,,1983,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16057,UTM zone 57N,conversion,,,,,1985,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16058,UTM zone 58N,conversion,,,,,1987,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16059,UTM zone 59N,conversion,,,,,1989,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16060,UTM zone 60N,conversion,,,,,1991,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16061,Universal Polar Stereographic North,conversion,,,,,1996,Large and medium scale topographic mapping and engineering survey.,9810,,,,,EPSG,2000-03-07 00:00:00,97.18 2000.094,1,0
+16070,3-degree Gauss-Kruger zone 40,conversion,,,,,2628,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 120E (code 16170). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16071,3-degree Gauss-Kruger zone 41,conversion,,,,,2629,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 123E (code 16171). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16072,3-degree Gauss-Kruger zone 42,conversion,,,,,2630,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 126E (code 16172). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16073,3-degree Gauss-Kruger zone 43,conversion,,,,,2631,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 129E (code 16173). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16074,3-degree Gauss-Kruger zone 44,conversion,,,,,2632,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 132E (code 16174). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16075,3-degree Gauss-Kruger zone 45,conversion,,,,,2633,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 135E (code 16175). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16076,3-degree Gauss-Kruger zone 46,conversion,,,,,2634,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 138E (code 16176). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16077,3-degree Gauss-Kruger zone 47,conversion,,,,,2635,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 141E (code 16177). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16078,3-degree Gauss-Kruger zone 48,conversion,,,,,2636,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 144E (code 16178). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16079,3-degree Gauss-Kruger zone 49,conversion,,,,,2637,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 147E (code 16179). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16080,3-degree Gauss-Kruger zone 50,conversion,,,,,2638,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 150E (code 16180). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16081,3-degree Gauss-Kruger zone 51,conversion,,,,,2639,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 153E (code 16181). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16082,3-degree Gauss-Kruger zone 52,conversion,,,,,2640,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 156E (code 16182). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16083,3-degree Gauss-Kruger zone 53,conversion,,,,,2641,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 159E (code 16183). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16084,3-degree Gauss-Kruger zone 54,conversion,,,,,2642,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 162E (code 16184). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16085,3-degree Gauss-Kruger zone 55,conversion,,,,,2643,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 165E (code 16185). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16086,3-degree Gauss-Kruger zone 56,conversion,,,,,2644,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 168E (code 16186). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16087,3-degree Gauss-Kruger zone 57,conversion,,,,,2645,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 171E (code 16187). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16088,3-degree Gauss-Kruger zone 58,conversion,,,,,2646,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 174E (code 16188). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16089,3-degree Gauss-Kruger zone 59,conversion,,,,,2647,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 177E (code 16189). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16090,3-degree Gauss-Kruger zone 60,conversion,,,,,2648,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 180 (code 16190). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16091,3-degree Gauss-Kruger zone 61,conversion,,,,,2649,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 177W (code 16191). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16092,3-degree Gauss-Kruger zone 62,conversion,,,,,2650,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 174W (code 16192). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16093,3-degree Gauss-Kruger zone 63,conversion,,,,,2651,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 171W (code 16193). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16094,3-degree Gauss-Kruger zone 64,conversion,,,,,2652,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 168W (code 16194). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16100,UTM grid system (southern hemisphere),conversion,,,,,1999,For strict use within zone boundaries,9824,,,Use UTM zone xx S (codes 16101-16160) for use outwith zone boundary or when easting is not prefixed by zone number.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+16101,UTM zone 1S,conversion,,,,,1874,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16102,UTM zone 2S,conversion,,,,,1876,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16103,UTM zone 3S,conversion,,,,,1878,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16104,UTM zone 4S,conversion,,,,,1880,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16105,UTM zone 5S,conversion,,,,,1882,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16106,UTM zone 6S,conversion,,,,,1884,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16107,UTM zone 7S,conversion,,,,,1886,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16108,UTM zone 8S,conversion,,,,,1888,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16109,UTM zone 9S,conversion,,,,,1890,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16110,UTM zone 10S,conversion,,,,,1892,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16111,UTM zone 11S,conversion,,,,,1894,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16112,UTM zone 12S,conversion,,,,,1896,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16113,UTM zone 13S,conversion,,,,,1898,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16114,UTM zone 14S,conversion,,,,,1900,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16115,UTM zone 15S,conversion,,,,,1902,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16116,UTM zone 16S,conversion,,,,,1904,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16117,UTM zone 17S,conversion,,,,,1906,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16118,UTM zone 18S,conversion,,,,,1908,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16119,UTM zone 19S,conversion,,,,,1910,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16120,UTM zone 20S,conversion,,,,,1912,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16121,UTM zone 21S,conversion,,,,,1914,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16122,UTM zone 22S,conversion,,,,,1916,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16123,UTM zone 23S,conversion,,,,,1918,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16124,UTM zone 24S,conversion,,,,,1920,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16125,UTM zone 25S,conversion,,,,,1922,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16126,UTM zone 26S,conversion,,,,,1924,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16127,UTM zone 27S,conversion,,,,,1926,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16128,UTM zone 28S,conversion,,,,,1928,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16129,UTM zone 29S,conversion,,,,,1930,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16130,UTM zone 30S,conversion,,,,,1932,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16131,UTM zone 31S,conversion,,,,,1934,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16132,UTM zone 32S,conversion,,,,,1936,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16133,UTM zone 33S,conversion,,,,,1938,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16134,UTM zone 34S,conversion,,,,,1940,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16135,UTM zone 35S,conversion,,,,,1942,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16136,UTM zone 36S,conversion,,,,,1944,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16137,UTM zone 37S,conversion,,,,,1946,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16138,UTM zone 38S,conversion,,,,,1948,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16139,UTM zone 39S,conversion,,,,,1950,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16140,UTM zone 40S,conversion,,,,,1952,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16141,UTM zone 41S,conversion,,,,,1954,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16142,UTM zone 42S,conversion,,,,,1956,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16143,UTM zone 43S,conversion,,,,,1958,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16144,UTM zone 44S,conversion,,,,,1960,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16145,UTM zone 45S,conversion,,,,,1962,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16146,UTM zone 46S,conversion,,,,,1964,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16147,UTM zone 47S,conversion,,,,,1966,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16148,UTM zone 48S,conversion,,,,,1968,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16149,UTM zone 49S,conversion,,,,,1970,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16150,UTM zone 50S,conversion,,,,,1972,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16151,UTM zone 51S,conversion,,,,,1974,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16152,UTM zone 52S,conversion,,,,,1976,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16153,UTM zone 53S,conversion,,,,,1978,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16154,UTM zone 54S,conversion,,,,,1980,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16155,UTM zone 55S,conversion,,,,,1982,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16156,UTM zone 56S,conversion,,,,,1984,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16157,UTM zone 57S,conversion,,,,,1986,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16158,UTM zone 58S,conversion,,,,,1988,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16159,UTM zone 59S,conversion,,,,,1990,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16160,UTM zone 60S,conversion,,,,,1992,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16161,Universal Polar Stereographic South,conversion,,,,,1997,Large and medium scale topographic mapping and engineering survey.,9810,,,,,EPSG,2000-03-07 00:00:00,97.18 2000.094,1,0
+16170,3-degree Gauss-Kruger CM 120E,conversion,,,,,2628,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 40N (code 16070) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16171,3-degree Gauss-Kruger CM 123E,conversion,,,,,2629,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 41N (code 16071) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16172,3-degree Gauss-Kruger CM 126E,conversion,,,,,2630,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 42N (code 16072) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16173,3-degree Gauss-Kruger CM 129E,conversion,,,,,2631,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 43N (code 16073) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16174,3-degree Gauss-Kruger CM 132E,conversion,,,,,2632,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 44N (code 16074) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16175,3-degree Gauss-Kruger CM 135E,conversion,,,,,2633,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 45N (code 16075) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16176,3-degree Gauss-Kruger CM 138E,conversion,,,,,2634,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 46N (code 16076) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16177,3-degree Gauss-Kruger CM 141E,conversion,,,,,2635,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 47N (code 16077) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16178,3-degree Gauss-Kruger CM 144E,conversion,,,,,2636,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 48N (code 16078) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16179,3-degree Gauss-Kruger CM 147E,conversion,,,,,2637,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 49N (code 16079) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16180,3-degree Gauss-Kruger CM 150E,conversion,,,,,2638,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 50N (code 16080) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16181,3-degree Gauss-Kruger CM 153E,conversion,,,,,2639,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 51N (code 16081) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16182,3-degree Gauss-Kruger CM 156E,conversion,,,,,2640,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 52N (code 16082) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16183,3-degree Gauss-Kruger CM 159E,conversion,,,,,2641,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 53N (code 16083) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16184,3-degree Gauss-Kruger CM 162E,conversion,,,,,2642,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 54N (code 16084) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16185,3-degree Gauss-Kruger CM 165E,conversion,,,,,2643,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 55N (code 16085) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16186,3-degree Gauss-Kruger CM 168E,conversion,,,,,2644,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 56N (code 16086) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16187,3-degree Gauss-Kruger CM 171E,conversion,,,,,2645,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 57N (code 16087) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16188,3-degree Gauss-Kruger CM 174E,conversion,,,,,2646,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 58N (code 16088) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16189,3-degree Gauss-Kruger CM 177E,conversion,,,,,2647,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 59N (code 16089) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16190,3-degree Gauss-Kruger CM 180,conversion,,,,,2648,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 60N (code 16090) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16191,3-degree Gauss-Kruger CM 177W,conversion,,,,,2649,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 61N (code 16091) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16192,3-degree Gauss-Kruger CM 174W,conversion,,,,,2650,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 62N (code 16092) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16193,3-degree Gauss-Kruger CM 171W,conversion,,,,,2651,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 63N (code 16093) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16194,3-degree Gauss-Kruger CM 168W,conversion,,,,,2652,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 64N (code 16094) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16201,6-degree Gauss-Kruger zone 1,conversion,,,,,1933,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 3E (code 16301). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16202,6-degree Gauss-Kruger zone 2,conversion,,,,,2741,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 9E (code 16302). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16203,6-degree Gauss-Kruger zone 3,conversion,,,,,2742,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 15E (code 16303). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16204,6-degree Gauss-Kruger zone 4,conversion,,,,,2743,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 21E (code 16304). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16205,6-degree Gauss-Kruger zone 5,conversion,,,,,2744,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 27E (code 16305). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16206,6-degree Gauss-Kruger zone 6,conversion,,,,,2745,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 33E (code 16306). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16207,6-degree Gauss-Kruger zone 7,conversion,,,,,2746,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 39E (code 16307). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16208,6-degree Gauss-Kruger zone 8,conversion,,,,,1947,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 45E (code 16308). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16209,6-degree Gauss-Kruger zone 9,conversion,,,,,1949,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 51E (code 16309). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16210,6-degree Gauss-Kruger zone 10,conversion,,,,,1951,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 57E (code 16310). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16211,6-degree Gauss-Kruger zone 11,conversion,,,,,1953,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 63E (code 16311). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16212,6-degree Gauss-Kruger zone 12,conversion,,,,,1955,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 69E (code 16312). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16213,6-degree Gauss-Kruger zone 13,conversion,,,,,1957,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 75E (code 16313). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16214,6-degree Gauss-Kruger zone 14,conversion,,,,,1959,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 81E (code 16314). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16215,6-degree Gauss-Kruger zone 15,conversion,,,,,1961,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 87E (code 16315). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16216,6-degree Gauss-Kruger zone 16,conversion,,,,,1963,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 93E (code 16316). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16217,6-degree Gauss-Kruger zone 17,conversion,,,,,1965,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 99E (code 16317). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16218,6-degree Gauss-Kruger zone 18,conversion,,,,,1967,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 105E (code 16318). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16219,6-degree Gauss-Kruger zone 19,conversion,,,,,1969,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 111E (code 16319). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16220,6-degree Gauss-Kruger zone 20,conversion,,,,,1971,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 117E (code 16320). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16221,6-degree Gauss-Kruger zone 21,conversion,,,,,1973,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 123E (code 16321). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16222,6-degree Gauss-Kruger zone 22,conversion,,,,,1975,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 129E (code 16322). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16223,6-degree Gauss-Kruger zone 23,conversion,,,,,1977,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 135E (code 16323). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16224,6-degree Gauss-Kruger zone 24,conversion,,,,,1979,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 141E (code 16324). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16225,6-degree Gauss-Kruger zone 25,conversion,,,,,1981,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 147E (code 16325). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16226,6-degree Gauss-Kruger zone 26,conversion,,,,,1983,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 153E (code 16326). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16227,6-degree Gauss-Kruger zone 27,conversion,,,,,1985,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 159E (code 16327). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16228,6-degree Gauss-Kruger zone 28,conversion,,,,,1987,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 165E (code 16328). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16229,6-degree Gauss-Kruger zone 29,conversion,,,,,1989,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 171E (code 16329). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16230,6-degree Gauss-Kruger zone 30,conversion,,,,,1991,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 177E (code 16330). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16231,6-degree Gauss-Kruger zone 31,conversion,,,,,1873,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 177W (code 16331). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16232,6-degree Gauss-Kruger zone 32,conversion,,,,,1875,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 171W (code 16332). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16233,6-degree Gauss-Kruger zone 33,conversion,,,,,1877,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 165W (code 16333). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16234,6-degree Gauss-Kruger zone 34,conversion,,,,,1879,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 159W (code 16334). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16235,6-degree Gauss-Kruger zone 35,conversion,,,,,1881,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 153W (code 16335). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16236,6-degree Gauss-Kruger zone 36,conversion,,,,,1883,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 147W (code 16336). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16237,6-degree Gauss-Kruger zone 37,conversion,,,,,1885,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 141W (code 16337). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16238,6-degree Gauss-Kruger zone 38,conversion,,,,,1887,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 135W (code 16338). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16239,6-degree Gauss-Kruger zone 39,conversion,,,,,1889,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 129W (code 16339). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16240,6-degree Gauss-Kruger zone 40,conversion,,,,,1891,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 123W (code 16340). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16241,6-degree Gauss-Kruger zone 41,conversion,,,,,1893,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 117W (code 16341). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16242,6-degree Gauss-Kruger zone 42,conversion,,,,,1895,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 111W (code 16342). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16243,6-degree Gauss-Kruger zone 43,conversion,,,,,1897,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 105W (code 16343). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16244,6-degree Gauss-Kruger zone 44,conversion,,,,,1899,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 99W (code 16344). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16245,6-degree Gauss-Kruger zone 45,conversion,,,,,1901,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 93W (code 16345). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16246,6-degree Gauss-Kruger zone 46,conversion,,,,,1903,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 87W (code 16346). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16247,6-degree Gauss-Kruger zone 47,conversion,,,,,2732,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 81W (code 16347). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16248,6-degree Gauss-Kruger zone 48,conversion,,,,,2733,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 75W (code 16348). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16249,6-degree Gauss-Kruger zone 49,conversion,,,,,2734,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 69W (code 16349). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16250,6-degree Gauss-Kruger zone 50,conversion,,,,,2735,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 63W (code 16350). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16251,6-degree Gauss-Kruger zone 51,conversion,,,,,2736,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 57W (code 16351). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16252,6-degree Gauss-Kruger zone 52,conversion,,,,,2737,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 51W (code 16352). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16253,6-degree Gauss-Kruger zone 53,conversion,,,,,2738,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 45W (code 16353). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16254,6-degree Gauss-Kruger zone 54,conversion,,,,,2739,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 39W (code 16354). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16255,6-degree Gauss-Kruger zone 55,conversion,,,,,1921,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 33W (code 16355). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16256,6-degree Gauss-Kruger zone 56,conversion,,,,,1923,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 27W (code 16356). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16257,6-degree Gauss-Kruger zone 57,conversion,,,,,1925,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 21W (code 16357). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16258,6-degree Gauss-Kruger zone 58,conversion,,,,,1927,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 15W (code 16358). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16259,6-degree Gauss-Kruger zone 59,conversion,,,,,1929,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 9W (code 16359). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16260,6-degree Gauss-Kruger zone 60,conversion,,,,,1931,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 3W (code 16360). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16261,3-degree Gauss-Kruger zone 1,conversion,,,,,2299,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 3E (code 16361). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16262,3-degree Gauss-Kruger zone 2,conversion,,,,,2300,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 6E (code 16362). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16263,3-degree Gauss-Kruger zone 3,conversion,,,,,2301,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 9E (code 16363). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16264,3-degree Gauss-Kruger zone 4,conversion,,,,,2302,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 12E (code 16364). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16265,3-degree Gauss-Kruger zone 5,conversion,,,,,2303,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 15E (code 16365). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16266,3-degree Gauss-Kruger zone 6,conversion,,,,,2304,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 18E (code 16366). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16267,3-degree Gauss-Kruger zone 7,conversion,,,,,2305,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 21E (code 16367). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16268,3-degree Gauss-Kruger zone 8,conversion,,,,,2306,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 24E (code 16368). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16269,3-degree Gauss-Kruger zone 9,conversion,,,,,2534,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 27E (code 16369). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16270,3-degree Gauss-Kruger zone 10,conversion,,,,,2535,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 30E (code 16370). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16271,3-degree Gauss-Kruger zone 11,conversion,,,,,2536,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 33E (code 16371). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16272,3-degree Gauss-Kruger zone 12,conversion,,,,,2537,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 36E (code 16372). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16273,3-degree Gauss-Kruger zone 13,conversion,,,,,2538,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 39E (code 16373). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16274,3-degree Gauss-Kruger zone 14,conversion,,,,,2539,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 42E (code 16374). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16275,3-degree Gauss-Kruger zone 15,conversion,,,,,2540,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 45E (code 16375). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16276,3-degree Gauss-Kruger zone 16,conversion,,,,,2604,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 48E (code 16376). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16277,3-degree Gauss-Kruger zone 17,conversion,,,,,2605,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 51E (code 16377). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16278,3-degree Gauss-Kruger zone 18,conversion,,,,,2606,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 54E (code 16378). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16279,3-degree Gauss-Kruger zone 19,conversion,,,,,2607,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 57E (code 16379). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16280,3-degree Gauss-Kruger zone 20,conversion,,,,,2608,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 60E (code 16380). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16281,3-degree Gauss-Kruger zone 21,conversion,,,,,2609,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 63E (code 16381). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16282,3-degree Gauss-Kruger zone 22,conversion,,,,,2610,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 66E (code 16382). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16283,3-degree Gauss-Kruger zone 23,conversion,,,,,2611,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 69E (code 16383). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16284,3-degree Gauss-Kruger zone 24,conversion,,,,,2612,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 72E (code 16384). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16285,3-degree Gauss-Kruger zone 25,conversion,,,,,2613,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 75E (code 16385). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16286,3-degree Gauss-Kruger zone 26,conversion,,,,,2614,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 78E (code 16386). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16287,3-degree Gauss-Kruger zone 27,conversion,,,,,2615,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 81E (code 16387). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16288,3-degree Gauss-Kruger zone 28,conversion,,,,,2616,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 84E (code 16388). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16289,3-degree Gauss-Kruger zone 29,conversion,,,,,2617,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 87E (code 16389). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16290,3-degree Gauss-Kruger zone 30,conversion,,,,,2618,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 90E (code 16390). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16291,3-degree Gauss-Kruger zone 31,conversion,,,,,2619,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 93E (code 16391). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16292,3-degree Gauss-Kruger zone 32,conversion,,,,,2620,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 96E (code 16392). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16293,3-degree Gauss-Kruger zone 33,conversion,,,,,2621,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 99E (code 16393). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16294,3-degree Gauss-Kruger zone 34,conversion,,,,,2622,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 102E (code 16394). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16295,3-degree Gauss-Kruger zone 35,conversion,,,,,2623,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 105E (code 16395). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16296,3-degree Gauss-Kruger zone 36,conversion,,,,,2624,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 108E (code 16396). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16297,3-degree Gauss-Kruger zone 37,conversion,,,,,2625,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 111E (code 16397). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16298,3-degree Gauss-Kruger zone 38,conversion,,,,,2626,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 114E (code 16398). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16299,3-degree Gauss-Kruger zone 39,conversion,,,,,2627,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 117E (code 16399). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16301,6-degree Gauss-Kruger CM 3E,conversion,,,,,1933,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 1N (code 16201) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16302,6-degree Gauss-Kruger CM 9E,conversion,,,,,1935,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 2N (code 16202) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16303,6-degree Gauss-Kruger CM 15E,conversion,,,,,1937,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 3N (code 16203) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16304,6-degree Gauss-Kruger CM 21E,conversion,,,,,1939,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 4N (code 16204) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16305,6-degree Gauss-Kruger CM 27E,conversion,,,,,1941,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 5N (code 16205) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16306,6-degree Gauss-Kruger CM 33E,conversion,,,,,1943,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 6N (code 16206) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16307,6-degree Gauss-Kruger CM 39E,conversion,,,,,1945,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 7N (code 16207) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16308,6-degree Gauss-Kruger CM 45E,conversion,,,,,1947,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 8N (code 16208) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16309,6-degree Gauss-Kruger CM 51E,conversion,,,,,1949,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 9N (code 16209) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16310,6-degree Gauss-Kruger CM 57E,conversion,,,,,1951,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 10N (code 16210) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16311,6-degree Gauss-Kruger CM 63E,conversion,,,,,1953,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 11N (code 16211) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16312,6-degree Gauss-Kruger CM 69E,conversion,,,,,1955,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 12N (code 16212) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16313,6-degree Gauss-Kruger CM 75E,conversion,,,,,1957,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 13N (code 16213) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16314,6-degree Gauss-Kruger CM 81E,conversion,,,,,1959,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 14N (code 16214) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16315,6-degree Gauss-Kruger CM 87E,conversion,,,,,1961,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 15N (code 16215) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16316,6-degree Gauss-Kruger CM 93E,conversion,,,,,1963,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 16N (code 16216) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16317,6-degree Gauss-Kruger CM 99E,conversion,,,,,1965,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 17N (code 16217) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16318,6-degree Gauss-Kruger CM 105E,conversion,,,,,1967,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 18N (code 16218) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16319,6-degree Gauss-Kruger CM 111E,conversion,,,,,1969,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 19N (code 16219) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16320,6-degree Gauss-Kruger CM 117E,conversion,,,,,1971,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 20N (code 16220) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16321,6-degree Gauss-Kruger CM 123E,conversion,,,,,1973,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 21N (code 16221) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16322,6-degree Gauss-Kruger CM 129E,conversion,,,,,1975,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 22N (code 16222) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16323,6-degree Gauss-Kruger CM 135E,conversion,,,,,1977,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 23N (code 16223) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16324,6-degree Gauss-Kruger CM 141E,conversion,,,,,1979,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 24N (code 16224) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16325,6-degree Gauss-Kruger CM 147E,conversion,,,,,1981,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 25N (code 16225) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16326,6-degree Gauss-Kruger CM 153E,conversion,,,,,1983,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 26N (code 16226) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16327,6-degree Gauss-Kruger CM 159E,conversion,,,,,1985,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 27N (code 16227) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16328,6-degree Gauss-Kruger CM 165E,conversion,,,,,1987,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 28N (code 16228) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16329,6-degree Gauss-Kruger CM 171E,conversion,,,,,1989,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 29N (code 16229) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16330,6-degree Gauss-Kruger CM 177E,conversion,,,,,1991,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 30N (code 16230) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16331,6-degree Gauss-Kruger CM 177W,conversion,,,,,1873,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 31N (code 16231) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16332,6-degree Gauss-Kruger CM 171W,conversion,,,,,1875,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 32N (code 16232) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16333,6-degree Gauss-Kruger CM 165W,conversion,,,,,1877,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 33N (code 16233) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16334,6-degree Gauss-Kruger CM 159W,conversion,,,,,1879,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 34N (code 16234) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16335,6-degree Gauss-Kruger CM 153W,conversion,,,,,1881,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 35N (code 16235) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16336,6-degree Gauss-Kruger CM 147W,conversion,,,,,1883,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 36N (code 16236) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16337,6-degree Gauss-Kruger CM 141W,conversion,,,,,1885,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 37N (code 16237) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16338,6-degree Gauss-Kruger CM 135W,conversion,,,,,1887,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 38N (code 16238) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16339,6-degree Gauss-Kruger CM 129W,conversion,,,,,1889,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 39N (code 16239) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16340,6-degree Gauss-Kruger CM 123W,conversion,,,,,1891,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 40N (code 16240) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16341,6-degree Gauss-Kruger CM 117W,conversion,,,,,1893,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 41N (code 16241) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16342,6-degree Gauss-Kruger CM 111W,conversion,,,,,1895,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 42N (code 16242) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16343,6-degree Gauss-Kruger CM 105W,conversion,,,,,1897,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 43N (code 16243) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16344,6-degree Gauss-Kruger CM 99W,conversion,,,,,1899,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 44N (code 16244) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16345,6-degree Gauss-Kruger CM 93W,conversion,,,,,1901,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 45N (code 16245) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16346,6-degree Gauss-Kruger CM 87W,conversion,,,,,1903,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 46N (code 16246) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16347,6-degree Gauss-Kruger CM 81W,conversion,,,,,1905,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 47N (code 16247) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16348,6-degree Gauss-Kruger CM 75W,conversion,,,,,1907,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 48N (code 16248) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16349,6-degree Gauss-Kruger CM 69W,conversion,,,,,1909,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 49N (code 16249) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16350,6-degree Gauss-Kruger CM 63W,conversion,,,,,1911,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 50N (code 16250) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16351,6-degree Gauss-Kruger CM 57W,conversion,,,,,1913,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 51N (code 16251) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16352,6-degree Gauss-Kruger CM 51W,conversion,,,,,1915,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 52N (code 16252) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16353,6-degree Gauss-Kruger CM 45W,conversion,,,,,1917,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 53N (code 16253) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16354,6-degree Gauss-Kruger CM 39W,conversion,,,,,1919,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 54N (code 16254) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16355,6-degree Gauss-Kruger CM 33W,conversion,,,,,1921,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 55N (code 16255) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16356,6-degree Gauss-Kruger CM 27W,conversion,,,,,1923,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 56N (code 16256) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16357,6-degree Gauss-Kruger CM 21W,conversion,,,,,1925,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 57N (code 16257) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16358,6-degree Gauss-Kruger CM 15W,conversion,,,,,1927,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 58N (code 16258) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16359,6-degree Gauss-Kruger CM 9W,conversion,,,,,1929,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 59N (code 16259) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16360,6-degree Gauss-Kruger CM 3W,conversion,,,,,1931,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 60N (code 16260) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16361,3-degree Gauss-Kruger CM 3E,conversion,,,,,2299,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 1N (code 16261) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16362,3-degree Gauss-Kruger CM 6E,conversion,,,,,2300,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 2N (code 16262) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16363,3-degree Gauss-Kruger CM 9E,conversion,,,,,2301,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 3N (code 16263) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16364,3-degree Gauss-Kruger CM 12E,conversion,,,,,2302,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 4N (code 16264) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16365,3-degree Gauss-Kruger CM 15E,conversion,,,,,2303,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 5N (code 16265) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16366,3-degree Gauss-Kruger CM 18E,conversion,,,,,2304,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 6N (code 16266) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16367,3-degree Gauss-Kruger CM 21E,conversion,,,,,2305,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 7N (code 16267) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16368,3-degree Gauss-Kruger CM 24E,conversion,,,,,2306,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 8N (code 16268) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16369,3-degree Gauss-Kruger CM 27E,conversion,,,,,2534,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 9N (code 16269) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16370,3-degree Gauss-Kruger CM 30E,conversion,,,,,2535,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 10N (code 16270) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16371,3-degree Gauss-Kruger CM 33E,conversion,,,,,2536,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 11N (code 16271) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16372,3-degree Gauss-Kruger CM 36E,conversion,,,,,2537,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 12N (code 16272) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16373,3-degree Gauss-Kruger CM 39E,conversion,,,,,2538,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 13N (code 16273) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16374,3-degree Gauss-Kruger CM 42E,conversion,,,,,2539,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 14N (code 16274) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16375,3-degree Gauss-Kruger CM 45E,conversion,,,,,2540,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 15N (code 16275) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16376,3-degree Gauss-Kruger CM 48E,conversion,,,,,2604,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 16N (code 16276) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16377,3-degree Gauss-Kruger CM 51E,conversion,,,,,2605,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 17N (code 16277) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16378,3-degree Gauss-Kruger CM 54E,conversion,,,,,2606,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 18N (code 16278) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16379,3-degree Gauss-Kruger CM 57E,conversion,,,,,2607,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 19N (code 16279) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16380,3-degree Gauss-Kruger CM 60E,conversion,,,,,2608,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 20N (code 16280) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16381,3-degree Gauss-Kruger CM 63E,conversion,,,,,2609,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 21N (code 16281) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16382,3-degree Gauss-Kruger CM 66E,conversion,,,,,2610,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 22N (code 16282) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16383,3-degree Gauss-Kruger CM 69E,conversion,,,,,2611,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 23N (code 16283) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16384,3-degree Gauss-Kruger CM 72E,conversion,,,,,2612,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 24N (code 16284) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16385,3-degree Gauss-Kruger CM 75E,conversion,,,,,2613,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 25N (code 16285) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16386,3-degree Gauss-Kruger CM 78E,conversion,,,,,2614,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 26N (code 16286) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16387,3-degree Gauss-Kruger CM 81E,conversion,,,,,2615,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 27N (code 16287) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16388,3-degree Gauss-Kruger CM 84E,conversion,,,,,2616,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 28N (code 16288) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16389,3-degree Gauss-Kruger CM 87E,conversion,,,,,2617,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 29N (code 16289) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16390,3-degree Gauss-Kruger CM 90E,conversion,,,,,2618,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 30N (code 16290) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16391,3-degree Gauss-Kruger CM 93E,conversion,,,,,2619,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 31N (code 16291) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16392,3-degree Gauss-Kruger CM 96E,conversion,,,,,2620,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 32N (code 16292) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16393,3-degree Gauss-Kruger CM 99E,conversion,,,,,2621,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 33N (code 16293) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16394,3-degree Gauss-Kruger CM 102E,conversion,,,,,2622,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 34N (code 16294) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16395,3-degree Gauss-Kruger CM 105E,conversion,,,,,2623,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 35N (code 16295) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16396,3-degree Gauss-Kruger CM 108E,conversion,,,,,2624,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 36N (code 16296) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16397,3-degree Gauss-Kruger CM 111E,conversion,,,,,2625,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 37N (code 16297) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16398,3-degree Gauss-Kruger CM 114E,conversion,,,,,2626,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 38N (code 16298) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16399,3-degree Gauss-Kruger CM 117E,conversion,,,,,2627,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 39N (code 16299) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16400,TM 0 N,conversion,,,,,1629,Oil exploration.,9807,,,,Shell UK,EPSG,1998-11-11 00:00:00,,1,0
+16405,TM 5 NE,conversion,,,,,1630,Oil exploration.,9807,,,,NAM,EPSG,1998-11-11 00:00:00,,1,0
+16406,TM 6 NE,conversion,,,,,1717,Oil exploration.,9807,,,Used by ExxonMobil for deepwater blocks offshore Nigeria.,ExxonMobil,EPSG,2002-02-12 00:00:00,,1,0
+16411,TM 11 NE,conversion,,,,,1489,Oil exploration.,9807,,,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+16412,TM 12 NE,conversion,,,,,1143,Oil exploration.,9807,,,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+16413,TM 13 NE,conversion,,,,,2771,Oil exploration.,9807,,,,TotalFinaElf,EPSG,2002-06-28 00:00:00,,1,0
+16430,TM 30 NE,conversion,,,,,2546,Oil exploration.,9807,,,,TotalFinaElf,EPSG,2001-11-06 00:00:00,,1,0
+16506,TM 106 NE,conversion,,,,,1495,Oil exploration.,9807,,,,PetroVietnam,EPSG,2000-03-07 00:00:00,,1,0
+16586,GK 106 NE,conversion,,,,,1494,Oil exploration.,9807,,,,BP Amoco,EPSG,2000-03-07 00:00:00,,1,0
+16611,TM 11.30 SE,conversion,,,,,1605,Oil exploration.,9807,,,,Esso Angola,EPSG,1998-11-11 00:00:00,,1,0
+16612,TM 12 SE,conversion,,,,,1604,Oil exploration.,9807,,,,Shell Angola,EPSG,1998-11-11 00:00:00,,1,0
+16636,TM 36 SE,conversion,,,,,1726,Oil exploration.,9807,,,,BP Mozambique,EPSG,1998-11-11 00:00:00,,1,0
+16709,TM 109 SE,conversion,,,,,2577,Oil exploration.,9807,,,Used by Arco and BP for ONWJ.,BP,EPSG,2002-02-12 00:00:00,,1,0
+16716,TM 116 SE,conversion,,,,,2588,Oil exploration.,9807,,,Used by BP for Terang-Sirasun.,BP,EPSG,2002-02-12 00:00:00,,1,0
+16732,TM 132 SE,conversion,,,,,2589,Oil exploration.,9807,,,Used for Tangguh developments.,BP,EPSG,2002-02-12 00:00:00,,1,0
+17001,TM 1 NW,conversion,,,,,1505,Oil exploration.,9807,,,,Various industry sources,EPSG,2000-10-19 00:00:00,,1,0
+17005,TM 5 NW,conversion,,,,,2296,Oil exploration.,9807,,,,Various oil industry sources,EPSG,2001-06-05 00:00:00,,1,0
+17054,TM 54 NW,conversion,,,,,1727,Oil exploration.,9807,,,,Shell,EPSG,2000-06-10 00:00:00,,1,0
+17348,Map Grid of Australia zone 48,conversion,,,,,1556,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17349,Map Grid of Australia zone 49,conversion,,,,,1557,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17350,Map Grid of Australia zone 50,conversion,,,,,1558,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17351,Map Grid of Australia zone 51,conversion,,,,,1559,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17352,Map Grid of Australia zone 52,conversion,,,,,1560,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17353,Map Grid of Australia zone 53,conversion,,,,,1561,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17354,Map Grid of Australia zone 54,conversion,,,,,1562,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17355,Map Grid of Australia zone 55,conversion,,,,,1563,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17356,Map Grid of Australia zone 56,conversion,,,,,1564,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17357,Map Grid of Australia zone 57,conversion,,,,,1565,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17358,Map Grid of Australia zone 58,conversion,,,,,1566,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17448,Australian Map Grid zone 48,conversion,,,,,1556,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17449,Australian Map Grid zone 49,conversion,,,,,1557,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17450,Australian Map Grid zone 50,conversion,,,,,1558,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17451,Australian Map Grid zone 51,conversion,,,,,1559,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17452,Australian Map Grid zone 52,conversion,,,,,1560,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17453,Australian Map Grid zone 53,conversion,,,,,1561,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17454,Australian Map Grid zone 54,conversion,,,,,1567,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17455,Australian Map Grid zone 55,conversion,,,,,1568,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17456,Australian Map Grid zone 56,conversion,,,,,2291,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17457,Australian Map Grid zone 57,conversion,,,,,1565,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17458,Australian Map Grid zone 58,conversion,,,,,1566,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+17515,South African Survey Grid zone 15,conversion,,,,,1454,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30 96.29,1,0
+17517,South African Survey Grid zone 17,conversion,,,,,1455,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30 96.29,1,0
+17519,South African Survey Grid zone 19,conversion,,,,,1456,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30 96.29,1,0
+17521,South African Survey Grid zone 21,conversion,,,,,1457,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30 96.29,1,0
+17523,South African Survey Grid zone 23,conversion,,,,,1458,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30 96.29,1,0
+17525,South African Survey Grid zone 25,conversion,,,,,1459,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30 96.29,1,0
+17527,South African Survey Grid zone 27,conversion,,,,,1460,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30 96.29,1,0
+17529,South African Survey Grid zone 29,conversion,,,,,1461,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30 96.29,1,0
+17531,South African Survey Grid zone 31,conversion,,,,,1462,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30 96.29,1,0
+17533,South African Survey Grid zone 33,conversion,,,,,1463,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30 96.29,1,0
+17611,South West African Survey Grid zone 11,conversion,,,,,1838,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30 96.29 97.16,1,0
+17613,South West African Survey Grid zone 13,conversion,,,,,1839,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30 96.29 97.16,1,0
+17615,South West African Survey Grid zone 15,conversion,,,,,1840,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30 96.29 97.16,1,0
+17617,South West African Survey Grid zone 17,conversion,,,,,1841,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30 96.29 97.16,1,0
+17619,South West African Survey Grid zone 19,conversion,,,,,1842,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30 96.29 97.16,1,0
+17621,South West African Survey Grid zone 21,conversion,,,,,1843,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30 96.29 97.16,1,0
+17623,South West African Survey Grid zone 23,conversion,,,,,1844,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30 96.29 97.16,1,0
+17625,South West African Survey Grid zone 25,conversion,,,,,1845,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30 96.29 97.16,1,0
+17700,MTM Quebec zone 2,conversion,,,,,1420,Large and medium scale topographic mapping and engineering survey.,9807,,,,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,1997-11-13 00:00:00,,1,0
+17701,MTM zone 1,conversion,,,,,2226,Large and medium scale topographic mapping and engineering survey.,9807,,,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+17702,MTM Newfoundland zone 2,conversion,,,,,2227,Large and medium scale topographic mapping and engineering survey.,9807,,,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+17703,MTM zone 3,conversion,,,,,2290,Large and medium scale topographic mapping and engineering survey.,9807,,,,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+17704,MTM zone 4,conversion,,,,,2276,Large and medium scale topographic mapping and engineering survey.,9807,,,,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+17705,MTM zone 5,conversion,,,,,2277,Large and medium scale topographic mapping and engineering survey.,9807,,,,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+17706,MTM zone 6,conversion,,,,,2278,Large and medium scale topographic mapping and engineering survey.,9807,,,,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+17707,MTM zone 7,conversion,,,,,1425,Large and medium scale topographic mapping and engineering survey.,9807,,,,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,1997-11-13 00:00:00,,1,0
+17708,MTM zone 8,conversion,,,,,2279,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17709,MTM zone 9,conversion,,,,,2280,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17710,MTM zone 10,conversion,,,,,2281,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17711,MTM zone 11,conversion,,,,,1432,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17712,MTM zone 12,conversion,,,,,1433,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17713,MTM zone 13,conversion,,,,,1434,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17714,MTM zone 14,conversion,,,,,1435,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17715,MTM zone 15,conversion,,,,,1436,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17716,MTM zone 16,conversion,,,,,1437,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17717,MTM zone 17,conversion,,,,,1438,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17794,MTM Nova Scotia zone 4,conversion,,,,,1534,Large and medium scale topographic mapping and engineering survey.,9807,,,,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,1999-05-24 00:00:00,99.042,1,0
+17795,MTM Nova Scotia zone 5,conversion,,,,,1535,Large and medium scale topographic mapping and engineering survey.,9807,,,,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,1999-05-24 00:00:00,99.042,1,0
+17801,Japan Plane Rectangular CS zone I,conversion,,,,,1854,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17802,Japan Plane Rectangular CS zone II,conversion,,,,,1855,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17803,Japan Plane Rectangular CS zone III,conversion,,,,,1856,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17804,Japan Plane Rectangular CS zone IV,conversion,,,,,1857,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17805,Japan Plane Rectangular CS zone V,conversion,,,,,1858,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17806,Japan Plane Rectangular CS zone VI,conversion,,,,,1859,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17807,Japan Plane Rectangular CS zone VII,conversion,,,,,1860,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17808,Japan Plane Rectangular CS zone VIII,conversion,,,,,1861,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17809,Japan Plane Rectangular CS zone IX,conversion,,,,,1862,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17810,Japan Plane Rectangular CS zone X,conversion,,,,,1863,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17811,Japan Plane Rectangular CS zone XI,conversion,,,,,1864,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17812,Japan Plane Rectangular CS zone XII,conversion,,,,,1865,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17813,Japan Plane Rectangular CS zone XIII,conversion,,,,,1866,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17814,Japan Plane Rectangular CS zone XIV,conversion,,,,,1867,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+17815,Japan Plane Rectangular CS zone XV,conversion,,,,,1868,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+17816,Japan Plane Rectangular CS zone XVI,conversion,,,,,1869,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+17817,Japan Plane Rectangular CS zone XVII,conversion,,,,,1870,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+17818,Japan Plane Rectangular CS zone XVIII,conversion,,,,,1871,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+17819,Japan Plane Rectangular CS zone XIX,conversion,,,,,1872,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+17901,Mount Eden Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Mount Eden Circuit 2000 (code 17931) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17902,Bay of Plenty Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Bay of Plenty Circuit 2000 (code 17932) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17903,Poverty Bay Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Poverty Bay Circuit 2000 (code 17933) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17904,Hawkes Bay Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Hawkes Bay Circuit 2000 (code 17934) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17905,Taranaki Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Taranaki Circuit 2000 (code 17935) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17906,Tuhirangi Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Tuhirangi Circuit 2000 (code 17936) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17907,Wanganui Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Wanganui Circuit 2000 (code 17937) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17908,Wairarapa Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Wairarapa Circuit 2000 (code 17938) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17909,Wellington Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Wellington Circuit 2000 (code 17939) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17910,Collingwood Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Collingwood Circuit 2000 (code 17940) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17911,Nelson Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Nelson Circuit 2000 (code 17941) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17912,Karamea Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Karamea Circuit 2000 (code 17942) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17913,Buller Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Buller Circuit 2000 (code 17943) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17914,Grey Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Grey Circuit 2000 (code 17944) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17915,Amuri Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Amuri Circuit 2000 (code 17945) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17916,Marlborough Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Marlborough Circuit 2000 (code 17946) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17917,Hokitika Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Hokitika Circuit 2000 (code 17947) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17918,Okarito Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Okarito Circuit 2000 (code 17948) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17919,Jacksons Bay Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Jacksons Bay Circuit 2000 (code 17949) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17920,Mount Pleasant Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Mount Pleasant Circuit 2000 (code 17950) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17921,Gawler Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Gawler Circuit 2000 (code 17951) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17922,Timaru Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Timaru Circuit 2000 (code 17952) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17923,Lindis Peak Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Lindis Peak Circuit 2000 (code 17953) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17924,Mount Nicholas Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Mount Nicholas Circuit 2000 (code 17954) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17925,Mount York Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Mount York Circuit 2000 (code 17955) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17926,Observation Point Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Observation Point Circuit 2000 (code 17956) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17927,North Taieri Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by North Taieri Circuit 2000 (code 17957) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17928,Bluff Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972. Superseded by Bluff Circuit 2000 (code 17958) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17931,Mount Eden Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Mount Eden Circuit (code 17901) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17932,Bay of Plenty Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Bay of Plenty Circuit (code 17902) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17933,Poverty Bay Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Poverty Bay Circuit (code 17903) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17934,Hawkes Bay Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Hawkes Bay Circuit (code 17904) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17935,Taranaki Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Taranaki Circuit (code 17905) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17936,Tuhirangi Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Tuhirangi Circuit (code 17906) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17937,Wanganui Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Wanganui Circuit (code 17907) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17938,Wairarapa Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Wairarapa Circuit (code 17908) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17939,Wellington Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Wellington Circuit (code 17909) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17940,Collingwood Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Collingwood Circuit (code 17910) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17941,Nelson Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Nelson Circuit (code 17911) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17942,Karamea Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Karamea Circuit (code 17912) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17943,Buller Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Buller Circuit (code 17913) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17944,Grey Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Grey Circuit (code 17914) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17945,Amuri Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Amuri Circuit (code 17915) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17946,Marlborough Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Marlborough Circuit (code 17916) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17947,Hokitika Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Hokitika Circuit (code 17917) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17948,Okarito Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Okarito Circuit (code 17918) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17949,Jacksons Bay Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Jacksons Bay Circuit (code 17919) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17950,Mount Pleasant Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Mount Pleasant Circuit (code 17920) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17951,Gawler Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Gawler Circuit (code 17921) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17952,Timaru Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Timaru Circuit (code 17922) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17953,Lindis Peak Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Lindis Peak Circuit (code 17923) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17954,Mount Nicholas Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Mount Nicholas Circuit (code 17924) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17955,Mount York Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Mount York Circuit (code 17925) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17956,Observation Point Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Observation Point Circuit (code 17926) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17957,North Taieri Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes North Taieri Circuit (code 17927) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17958,Bluff Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Bluff Circuit (code 17928) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+18011,Nord Algerie (ancienne),conversion,,,,,1728,Large and medium scale topographic mapping and engineering survey.,9801,,,Used with Voirol 1875 datum - now superseded.,,EPSG,1996-09-12 00:00:00,,1,0
+18012,Sud Algerie (ancienne),conversion,,,,,1729,Large and medium scale topographic mapping and engineering survey.,9801,,,Used with Voirol 1875 datum - now superseded.,,EPSG,1996-09-12 00:00:00,,1,0
+18021,Nord Algerie,conversion,,,,,1728,Large and medium scale topographic mapping and engineering survey.,9801,,,Use with Nord Sahara 1959 datum.,,EPSG,1996-09-12 00:00:00,,1,0
+18022,Sud Algerie,conversion,,,,,1729,Large and medium scale topographic mapping and engineering survey.,9801,,,Use with Nord Sahara 1959 datum.,,EPSG,1996-09-12 00:00:00,,1,0
+18031,Argentina zone 1,conversion,,,,,1608,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18032,Argentina zone 2,conversion,,,,,1609,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18033,Argentina zone 3,conversion,,,,,1610,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18034,Argentina zone 4,conversion,,,,,1611,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18035,Argentina zone 5,conversion,,,,,1612,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18036,Argentina zone 6,conversion,,,,,1613,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18037,Argentina zone 7,conversion,,,,,1614,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18041,Austria West Zone,conversion,,,,,1706,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded by M28 (EPSG code 18044).,,EPSG,1997-04-11 00:00:00,95.30 96.29 97.01 98.48,1,0
+18042,Austria Central Zone,conversion,,,,,1707,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded by M31 (EPSG code 18045).,,EPSG,1997-04-11 00:00:00,95.30 96.29 97.01 98.48,1,0
+18043,Austria East Zone,conversion,,,,,1708,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded by M34 (EPSG code 18046).,,EPSG,1997-04-11 00:00:00,95.30 96.29 97.01 98.48,1,0
+18044,Austria M28,conversion,,,,,1706,Large and medium scale topographic mapping and engineering survey.,9807,,,Supersedes Austria West zone (EPSG code 18041).,Bundesamt f�r Eich- und Vermessungswesen,EPSG,1999-10-20 00:00:00,,1,0
+18045,Austria M31,conversion,,,,,1707,Large and medium scale topographic mapping and engineering survey.,9807,,,Supersedes Austria Central zone (EPSG code 18042).,Bundesamt f�r Eich- und Vermessungswesen,EPSG,1999-10-20 00:00:00,,1,0
+18046,Austria M34,conversion,,,,,1708,Large and medium scale topographic mapping and engineering survey.,9807,,,Supersedes Austria East zone (EPSG code 18043).,Bundesamt f�r Eich- und Vermessungswesen,EPSG,1999-10-20 00:00:00,,1,0
+18051,Colombia West zone,conversion,,,,,1598,Large and medium scale topographic mapping and engineering survey.,9807,,,"Original transformation by Gauss-Kruger formula. Zone name sometimes referred to as ""6 west"".",,EPSG,1997-04-11 00:00:00,95.30 96.29 97.11,1,0
+18052,Colombia Bogota zone,conversion,,,,,1599,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,1997-04-11 00:00:00,95.30 96.29 97.11,1,0
+18053,Colombia East Central zone,conversion,,,,,1600,Large and medium scale topographic mapping and engineering survey.,9807,,,"Original transformation by Gauss-Kruger formula. Zone name sometimes referred to as ""3 east"".",,EPSG,1997-04-11 00:00:00,95.30 96.29 97.11,1,0
+18054,Colombia East zone,conversion,,,,,1601,Large and medium scale topographic mapping and engineering survey.,9807,,,"Original transformation by Gauss-Kruger formula. Zone name sometimes referred to as ""6 east"".",,EPSG,1997-04-11 00:00:00,95.30 96.29 97.11,1,0
+18061,Cuba Norte,conversion,,,,,1487,Large and medium scale topographic mapping and engineering survey.,9801,,,,,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+18062,Cuba Sur,conversion,,,,,1488,Large and medium scale topographic mapping and engineering survey.,9801,,,,,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+18071,Egypt Blue Belt,conversion,,,,,1642,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,2002-07-16 00:00:00,2002.49,1,0
+18072,Egypt Red Belt,conversion,,,,,1643,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30,1,0
+18073,Egypt Purple Belt,conversion,,,,,1644,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30,1,0
+18074,Egypt Extended Purple Belt,conversion,,,,,1645,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30,1,0
+18081,Lambert zone I,conversion,,,,,1731,Large and medium scale topographic mapping and engineering survey.,9801,,,Introduced 1972. Supersedes Lambert Nord France (code 18091).,IGN Paris.,EPSG,2001-11-06 00:00:00,95.26 2001.54,1,0
+18082,Lambert zone II,conversion,,,,,1734,Large and medium scale topographic mapping and engineering survey.,9801,,,Introduced 1972. Supersedes Lambert Centre France (code 18092).,IGN Paris.,EPSG,2001-11-06 00:00:00,95.26 2001.54,1,0
+18083,Lambert zone III,conversion,,,,,1733,Large and medium scale topographic mapping and engineering survey.,9801,,,Introduced 1972. Supersedes Lambert Sud France (code 18093).,IGN Paris.,EPSG,2001-11-06 00:00:00,95.26 2001.54,1,0
+18084,Lambert zone IV,conversion,,,,,1327,Large and medium scale topographic mapping and engineering survey.,9801,,,Introduced 1972. Supersedes Lambert Corse (code 18094).,IGN Paris.,EPSG,2001-11-06 00:00:00,2001.54,1,0
+18085,Lambert-93,conversion,,,,,1326,Large and medium scale topographic mapping and engineering survey.,9802,,,,IGN - Paris,EPSG,2000-10-19 00:00:00,,1,0
+18086,France EuroLambert,conversion,,,,,1326,Medium scale topographic and statistical mapping.,9801,,,This is Lambert zone II (code 18082) parameters converted from grads/Paris to degrees/Greenwich for use with ED50.,IGN Paris via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18091,Lambert Nord France,conversion,,,,,1731,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded in 1972 by Lambert zone I (code 18081).,IGN Paris.,EPSG,2001-11-06 00:00:00,95.26 2001.54,1,0
+18092,Lambert Centre France,conversion,,,,,1734,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded in 1972 by Lambert zone II (code 18082).,IGN Paris.,EPSG,2001-11-06 00:00:00,95.26 2001.54,1,0
+18093,Lambert Sud France,conversion,,,,,1733,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded in 1972 by Lambert zone III (code 18083).,IGN Paris.,EPSG,2001-11-06 00:00:00,95.26 2001.54,1,0
+18094,Lambert Corse,conversion,,,,,1327,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded in 1972 by Lambert zone IV (code 18084).,IGN Paris.,EPSG,2001-11-06 00:00:00,2001.54,1,0
+18110,India zone 0,conversion,,,,,1668,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,1999-10-20 00:00:00,95.30 96.01 96.02 96.29 97.23,1,0
+18111,India zone I,conversion,,,,,1669,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,1999-10-20 00:00:00,95.30 96.02 96.29 97.23,1,0
+18112,India zone IIa,conversion,,,,,1670,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,1999-10-20 00:00:00,95.28 96.02 97.23,1,0
+18113,India zone IIb,conversion,,,,,1671,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,2000-03-07 00:00:00,95.28 96.02 97.23 2000.094,1,0
+18114,India zone IIIa,conversion,,,,,1672,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,2000-03-07 00:00:00,95.28 96.02 97.23 2000.094,1,0
+18115,India zone IIIb,conversion,,,,,2292,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,1999-10-20 00:00:00,95.28 96.02 97.23,1,0
+18116,India zone IVa,conversion,,,,,1673,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,2000-03-07 00:00:00,95.28 96.02 97.23 2000.094,1,0
+18117,India zone IVb,conversion,,,,,2293,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,1999-10-20 00:00:00,95.28 96.02 97.23,1,0
+18121,Italy zone 1,conversion,,,,,1718,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Boaga formula,,EPSG,1995-12-02 00:00:00,,1,0
+18122,Italy zone 2,conversion,,,,,1719,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Boaga formula,,EPSG,1995-12-02 00:00:00,,1,0
+18131,Nord Maroc,conversion,,,,,1703,Large and medium scale topographic mapping and engineering survey.,9801,,,A projection with the same parameter values used the Lambert Conic Near-Conformal method (EPSG code 9817) prior to 1953.,IGN Paris.,EPSG,1996-09-12 00:00:00,99.203,1,0
+18132,Sud Maroc,conversion,,,,,1704,Large and medium scale topographic mapping and engineering survey.,9801,,,A projection with the same parameter values used the Lambert Conic Near-Conformal method (EPSG code 9817) prior to 1953.,IGN Paris.,EPSG,1996-09-12 00:00:00,99.203,1,0
+18133,Sahara,conversion,,,,,1705,Large and medium scale topographic mapping and engineering survey.,9801,,,Created in 1977 to cover Sahara Marocain (ex Spanish Sahara),IGN Paris.,EPSG,1996-09-12 00:00:00,,1,0
+18141,New Zealand North Island National Grid,conversion,,,,,1500,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded by New Zealand Map Grid (code 19917). Used for topographic mapping.,,EPSG,1999-10-20 00:00:00,95.30 96.29 97.231,1,0
+18142,New Zealand South Island National Grid,conversion,,,,,1501,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded by New Zealand Map Grid (code 19917). Used for topographic mapping.,,EPSG,1999-10-20 00:00:00,95.30 96.29 97.231,1,0
+18151,Nigeria West Belt,conversion,,,,,1715,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+18152,Nigeria Mid Belt,conversion,,,,,1714,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+18153,Nigeria East Belt,conversion,,,,,1713,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+18161,Peru west zone,conversion,,,,,1753,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+18162,Peru central zone,conversion,,,,,1752,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+18163,Peru east zone,conversion,,,,,1751,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+18171,Philippines zone I,conversion,,,,,1698,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,2000-03-07 00:00:00,95.30 2000.93,1,0
+18172,Philippines zone II,conversion,,,,,1699,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,2000-03-07 00:00:00,95.30 2000.93,1,0
+18173,Philippines zone III,conversion,,,,,1700,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,2000-03-07 00:00:00,95.30 2000.93,1,0
+18174,Philippines zone IV,conversion,,,,,1701,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,2000-03-07 00:00:00,95.30 2000.93,1,0
+18175,Philippines zone V,conversion,,,,,1702,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,2000-03-07 00:00:00,95.30 2000.93,1,0
+18181,Nord Tunisie,conversion,,,,,1619,Large and medium scale topographic mapping and engineering survey.,9801,,,,,EPSG,1996-09-12 00:00:00,95.30,1,0
+18182,Sud Tunisie,conversion,,,,,1620,Large and medium scale topographic mapping and engineering survey.,9801,,,,,EPSG,1996-09-12 00:00:00,,1,0
+18191,Finland zone 1,conversion,,,,,1536,Large and medium scale topographic mapping and engineering survey.,9807,,,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+18192,Finland zone 2,conversion,,,,,1537,Large and medium scale topographic mapping and engineering survey.,9807,,,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+18193,Finland Uniform Coordinate System,conversion,,,,,1095,Large and medium scale topographic mapping and engineering survey.,9807,,,Used by Uniform Coordinate System over all country and also by zone 3 of Basic Coordinate System at larger scales.,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+18194,Finland zone 4,conversion,,,,,1539,Large and medium scale topographic mapping and engineering survey.,9807,,,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+18201,Palestine Grid,conversion,,,,,1356,Large and medium scale topographic mapping and engineering survey.,9806,,,Also encountered as a Transverse Mercator projection with scale factor of 1. The difference in conversion caused by the change of formula does not exceed 2m within Israel. Within the State of Israel superseded by the Israeli CS Grid (EPSG code 18203).,,EPSG,1999-04-22 00:00:00,,1,0
+18202,Palestine Belt,conversion,,,,,1356,Large and medium scale topographic mapping and engineering survey.,9807,,,"Originally constructed as the Palestine Grid - EPSG code 18201. Adopted by the US Army Map Service as ""Palestine Belt"" with change of projection method and false northing (FN). Sometimes seen with unchanged FN of 126867.909.",,EPSG,1999-04-22 00:00:00,,1,0
+18203,Israeli CS,conversion,,,,,2603,Large and medium scale topographic mapping and engineering survey.,9806,,,,Survey of Israel ftp://ftp.rd.soi.gov.il/doc,EPSG,2002-06-22 00:00:00,2002.34,1,0
+18204,Israeli TM,conversion,,,,,2603,Large and medium scale topographic mapping and engineering survey.,9807,,,Designed to approximate Israeli CRS grid in north-central Israel.,Survey of Israel ftp://ftp.rd.soi.gov.il/doc,EPSG,2002-06-22 00:00:00,2002.34,1,0
+18211,Guatemala Norte,conversion,,,,,2120,Large and medium scale topographic mapping and engineering survey.,9801,,,,,EPSG,1999-08-16 00:00:00,,1,0
+18212,Guatemala Sur,conversion,,,,,2121,Large and medium scale topographic mapping and engineering survey.,9801,,,,,EPSG,2000-01-06 00:00:00,99.95,1,0
+18221,NGO zone I,conversion,,,,,1741,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18222,NGO zone II,conversion,,,,,1742,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18223,NGO zone III,conversion,,,,,1743,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18224,NGO zone IV,conversion,,,,,1744,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18225,NGO zone V,conversion,,,,,1745,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18226,NGO zone VI,conversion,,,,,1746,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18227,NGO zone VII,conversion,,,,,1747,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18228,NGO zone VIII,conversion,,,,,1748,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18231,India zone I (1975 metres),conversion,,,,,1676,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,2000-04-23 00:00:00,2000.39,1,0
+18232,India zone IIa (1975 metres),conversion,,,,,1677,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,2000-04-23 00:00:00,2000.39,1,0
+18233,India zone IIIa (1975 metres),conversion,,,,,1672,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,2000-04-23 00:00:00,2000.39,1,0
+18234,India zone IVa (1975 metres),conversion,,,,,1673,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,2000-04-23 00:00:00,2000.39,1,0
+18235,India zone IIb (1975 metres),conversion,,,,,1678,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,2000-04-23 00:00:00,2000.39,1,0
+18236,India zone I (1962 metres),conversion,,,,,1685,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,1999-10-20 00:00:00,,1,0
+18237,India zone IIa (1962 metres),conversion,,,,,1686,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,1999-10-20 00:00:00,,1,0
+18238,India zone IIb (1937 metres),conversion,,,,,1041,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,2000-04-23 00:00:00,2000.39,1,0
+18240,Libya zone 5,conversion,,,,,1470,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18241,Libya zone 6,conversion,,,,,1471,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18242,Libya zone 7,conversion,,,,,1472,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18243,Libya zone 8,conversion,,,,,1473,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18244,Libya zone 9,conversion,,,,,1474,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18245,Libya zone 10,conversion,,,,,1475,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18246,Libya zone 11,conversion,,,,,1476,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18247,Libya zone 12,conversion,,,,,1477,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18248,Libya zone 13,conversion,,,,,1478,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18251,Korea East Belt,conversion,,,,,1496,Large and medium scale topographic mapping and engineering survey.,9807,,,,Clifford J. Mugnier; Photogrammertric Engineering and Remote Sensing,EPSG,2000-03-07 00:00:00,,1,0
+18252,Korea Central Belt,conversion,,,,,1497,Large and medium scale topographic mapping and engineering survey.,9807,,,,Clifford J. Mugnier; Photogrammertric Engineering and Remote Sensing,EPSG,2000-03-07 00:00:00,,1,0
+18253,Korea West Belt,conversion,,,,,1498,Large and medium scale topographic mapping and engineering survey.,9807,,,,Clifford J. Mugnier; Photogrammertric Engineering and Remote Sensing,EPSG,2000-03-07 00:00:00,,1,0
+18260,Maracaibo Grid (M1),conversion,,,,,1319,Oil exploration.,9801,,,Grid coordinates are (0 0) at Maracaibo Cathedral.,Various oil company sources.,EPSG,2000-03-07 00:00:00,,1,0
+18261,Maracaibo Grid,conversion,,,,,1319,Oil exploration.,9801,,,Grid coordinates are (200000 200000) at Maracaibo Cathedral.,Various oil company sources.,EPSG,2000-03-07 00:00:00,,1,0
+18262,Maracaibo Grid (M3),conversion,,,,,1319,Oil exploration.,9801,,,Grid coordinates are (500000 500000) at Maracaibo Cathedral.,Various oil company sources.,EPSG,2000-03-07 00:00:00,,1,0
+18263,Maracaibo La Rosa Grid,conversion,,,,,1319,Oil exploration.,9801,,,Grid coordinates are (-17044E 29545N) at Maracaibo Cathedral.,Various oil company sources.,EPSG,2000-06-23 00:00:00,,1,0
+18275,Balkans zone 5,conversion,,,,,1709,Large and medium scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+18276,Balkans zone 6,conversion,,,,,1710,Large and medium scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+18277,Balkans zone 7,conversion,,,,,1711,Large and medium scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+18278,Balkans zone 8,conversion,,,,,1712,Large and medium scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+18281,Poland zone I,conversion,,,,,1515,"Civilian topographic mapping, cadastral and engineering survey.",9809,,,,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18282,Poland zone II,conversion,,,,,1516,"Civilian topographic mapping, cadastral and engineering survey.",9809,,,,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18283,Poland zone III,conversion,,,,,1517,"Civilian topographic mapping, cadastral and engineering survey.",9809,,,,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18284,Poland zone IV,conversion,,,,,1518,"Civilian topographic mapping, cadastral and engineering survey.",9809,,,,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18285,Poland zone V,conversion,,,,,1519,"Civilian topographic mapping, cadastral and engineering survey.",9807,,,,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18300,Poland CS92,conversion,,,,,1192,"Mapping at scales of 1:10,000 and smaller",9807,,,See Poland CS2000 zones (codes 18305-08) for cadastral survey and mapping at larger scales.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18305,Poland CS2000 zone 5,conversion,,,,,1520,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See Poland CS92 (code 18300) for mapping at 1:10,000 and smaller scales.",Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18306,Poland CS2000 zone 6,conversion,,,,,1521,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See Poland CS92 (code 18300) for mapping at 1:10,000 and smaller scales.",Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18307,Poland CS2000 zone 7,conversion,,,,,1522,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See Poland CS92 (code 18300) for mapping at 1:10,000 and smaller scales.",Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18308,Poland CS2000 zone 8,conversion,,,,,1523,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See Poland CS92 (code 18300) for mapping at 1:10,000 and smaller scales.",Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18401,Kp2000 Jylland og Fyn,conversion,,,,,2531,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See UTM zone 32N (code 16032) for mapping at 1:10,000 and smaller scales.",Kort og Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+18402,Kp2000 Sjaelland,conversion,,,,,2532,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See UTM zone 32N (code 16032) for mapping at 1:10,000 and smaller scales.",Kort og Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+18403,Kp2000 Bornholm,conversion,,,,,2533,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See UTM zone 33N (code 16033) for mapping at 1:10,000 and smaller scales.",Kort og Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+18411,French West Africa Senegal zone,conversion,,,,,2548,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18412,French West Africa Ivory Coast zone,conversion,,,,,2549,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18413,French West Africa Dahomey zone,conversion,,,,,2550,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18414,French West Africa Niger zone,conversion,,,,,2551,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18415,French Equatorial Africa west zone,conversion,,,,,2552,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18416,French Equatorial Africa central zone,conversion,,,,,2553,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18417,French Equatorial Africa east zone,conversion,,,,,2554,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18421,Greenland zone 1 east,conversion,,,,,2556,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18422,Greenland zone 2 east,conversion,,,,,2557,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18423,Greenland zone 3 east,conversion,,,,,2558,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18424,Greenland zone 4 east,conversion,,,,,2559,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18425,Greenland zone 5 east,conversion,,,,,2560,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18426,Greenland zone 6 east,conversion,,,,,2561,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18427,Greenland zone 7 east,conversion,,,,,2562,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18428,Greenland zone 8 east,conversion,,,,,2569,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18432,Greenland zone 2 west,conversion,,,,,2563,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18433,Greenland zone 3 west,conversion,,,,,2564,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18434,Greenland zone 4 west,conversion,,,,,2565,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18435,Greenland zone 5 west,conversion,,,,,2566,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18436,Greenland zone 6 west,conversion,,,,,2567,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18437,Greenland zone 7 west,conversion,,,,,2568,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18441,CS63 zone A1,conversion,,,,,2772,Large scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+18442,CS63 zone A2,conversion,,,,,2773,Large scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+18443,CS63 zone A3,conversion,,,,,2774,Large scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+18444,CS63 zone A4,conversion,,,,,2775,Large scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+18446,CS63 zone K2,conversion,,,,,2776,Large scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+18447,CS63 zone K3,conversion,,,,,2777,Large scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+18448,CS63 zone K4,conversion,,,,,2778,Large scale topographic mapping and engineering survey.,9807,,,,KazGeodezia,EPSG,2002-06-28 00:00:00,,1,0
+19900,Bahrain State Grid,conversion,,,,,1040,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30,1,0
+19901,Belge Lambert 50,conversion,,,,,1347,Large and medium scale topographic mapping and engineering survey.,9802,,,"If software cannot handle latitude of false origin of 90 deg N, use latitude of false origin = 50.5 sexagesimal degrees with northing at false origin = 131983.890 m.","""Systemes de reference et formules de transformation en usage en Belgique""; IGN Brussels",EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+19902,Belge Lambert 72,conversion,,,,,1347,Large and medium scale topographic mapping and engineering survey.,9803,,,"Rotation from Belge Lambert 50 to Belge Lambert 72 is +29.2985sec. An equivalent using the conventional Lambert Conic Conformal (2SP) method (Belgian Lambert 72, code 19961) was introduced in 2000.","""Systemes de reference et formules de transformation en usage en Belgique""; IGN Brussels",EPSG,1999-04-22 00:00:00,95.30 96.29 99.28,1,0
+19903,Nord de Guerre,conversion,,,,,1369,Obsolete.,9801,,,,,EPSG,1996-09-12 00:00:00,,1,0
+19904,Ghana Metre Grid,conversion,,,,,1104,Large and medium scale topographic mapping and engineering survey.,9807,,,Supersedes Ghana National Grid (code 19959) from 1978. British foot (Sears 1922) used to convert projection defining parameters.,Ordnance Survey International,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+19905,Netherlands East Indies Equatorial Zone,conversion,,,,,1122,Large and medium scale topographic mapping and engineering survey.,9804,,,,US Army Map Service projection tables; 1943.,EPSG,1995-12-02 00:00:00,95.30,1,0
+19906,Iraq zone,conversion,,,,,2294,Large and medium scale topographic mapping and engineering survey.,9801,,,,US Army Map Service projection tables; 1943.,EPSG,1996-04-12 00:00:00,95.30 96.29,1,0
+19907,Iraq National Grid,conversion,,,,,1124,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+19908,Irish National Grid,conversion,,,,,1305,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30 96.29,1,1
+19909,Jamaica (Old Grid),conversion,,,,,1128,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded by Jamaica (New Grid).,,EPSG,1995-12-02 00:00:00,95.28,1,0
+19910,Jamaica National Grid,conversion,,,,,1128,Large and medium scale topographic mapping and engineering survey.,9801,,,Supersedes Jamaica (Old Grid).,,EPSG,1995-12-02 00:00:00,95.28,1,0
+19911,Laborde Grid,conversion,,,,,1149,Large and medium scale topographic mapping and engineering survey.,9815,,,Can also use transformation method 9813.,,EPSG,1997-11-13 00:00:00,97.613,1,0
+19913,RD Old,conversion,,,,,1275,Large and medium scale topographic mapping and engineering survey.,9809,,,,Nederlandse Commissie voor Geodesie publication 30.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+19914,RD New,conversion,,,,,1275,Large and medium scale topographic mapping and engineering survey.,9809,,,,Nederlandse Commissie voor Geodesie publication 30.,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+19915,Aden Zone,conversion,,,,,1257,Large and medium scale topographic mapping and engineering survey.,9801,,,,US Army Map Service projection tables; 1943.,EPSG,1995-12-02 00:00:00,95.28,1,0
+19916,British National Grid,conversion,,,,,1264,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30,1,0
+19917,New Zealand Map Grid,conversion,,,,,1175,Large and medium scale topographic mapping and engineering survey.,9811,,,Supersedes North and South Island National Grids (codes 18141-2). Used for topographic mapping.,Dept. of Lands and Surveys Technical Circular 1973/32; 23 Nov 1973.,EPSG,1995-12-02 00:00:00,95.28,1,0
+19919,Qatar National Grid,conversion,,,,,1195,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+19920,Singapore Grid,conversion,,,,,1210,Large and medium scale topographic mapping and engineering survey.,9806,,,,,EPSG,1995-12-02 00:00:00,95.30 96.29,1,0
+19921,Spain,conversion,,,,,1217,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded by UTM,,EPSG,1995-12-02 00:00:00,95.28,1,0
+19922,Swiss New Grid,conversion,,,,,1286,Large and medium scale topographic mapping and engineering survey.,9815,,,,"""Die Projektionen der schweizerischen Plan- und Kartenwerke""; J. Bolliger 1967",EPSG,1997-11-13 00:00:00,95.30 96.29 97.27 97.612 97.62,1,0
+19923,Swiss Old Grid,conversion,,,,,1286,Large and medium scale topographic mapping and engineering survey.,9815,,,Superseded by LV03 (19922).,"""Die Projektionen der schweizerischen Plan- und Kartenwerke""; J. Bolliger 1967",EPSG,1997-11-13 00:00:00,95.30 96.29 97.612 97.62,1,0
+19924,Tobago Grid,conversion,,,,,1322,Large and medium scale topographic mapping and engineering survey.,9806,,,,,EPSG,1999-10-20 00:00:00,95.30 96.29 97.231,1,0
+19925,Trinidad Grid,conversion,,,,,1339,Large and medium scale topographic mapping and engineering survey.,9806,,,,,EPSG,1999-10-20 00:00:00,95.30 96.29 97.231,1,0
+19926,Stereo 70,conversion,,,,,1197,Large and medium scale topographic mapping and engineering survey.,9809,,,Supersedes Stereo 33 (code 19927).,,EPSG,1996-04-12 00:00:00,,1,0
+19927,Stereo 33,conversion,,,,,1197,Large and medium scale topographic mapping and engineering survey.,9809,,,Superseded by Stereo 70 (code 19926),,EPSG,1996-04-12 00:00:00,96.29,1,0
+19928,Kuwait TM,conversion,,,,,1310,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1996-04-12 00:00:00,,1,0
+19929,Swedish National Projection,conversion,,,,,1225,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,"Used since 1938 superseding 6 old zones. Longitude of natural origin is 2.5 gon west of Stockholm prime meridian; transformation is also known as ""2.5 gon West of old Stockholm observatory"".",Lantmateriet of Sweden; private communication.,EPSG,1997-11-13 00:00:00,96.29 97.39,1,0
+19930,Greek Grid,conversion,,,,,1106,Large and medium scale topographic mapping and engineering survey.,9807,,,Created for use with GGRS87.,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,1997-06-16 00:00:00,,1,0
+19931,Egyseges Orszagos Vetuleti,conversion,,,,,1119,Large and medium scale topographic mapping and engineering survey.,9815,,,EOV = Uniform National Projection,http://lazarus.elte.hu/gb/geodez/geod2.htm,EPSG,1997-07-22 00:00:00,,1,0
+19933,Prince Edward Island Stereographic (ATS77),conversion,,,,,1533,Large and medium scale topographic mapping and engineering survey.,9809,,,In use from 1979. To be phased out in late 1990's.,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,1997-11-13 00:00:00,,1,0
+19934,Lithuania 1994,conversion,,,,,1145,Large and medium scale topographic mapping and engineering survey.,9807,,,,HNIT-BALTIC GeoInfoServisas,EPSG,1998-03-12 00:00:00,,1,0
+19935,Rectified Skew Orthomorphic Malaya Grid,conversion,,,,,1690,Large and medium scale topographic mapping and engineering survey.,9812,,,"If using Oblique Mercator method (code 9815), Ec=23505.515 chSe, Nc=21992.646 chSe.",UK Directorate of Overseas Surveys paper,EPSG,1999-10-20 00:00:00,97.231,1,0
+19936,Portuguese National Grid,conversion,,,,,1294,Large and medium scale topographic mapping and engineering survey for military purposes.,9807,,,Original transformation by Gauss-Kruger formula.,Instituto Portugues de Cartografia e Cadastro,EPSG,1998-11-11 00:00:00,95.30 96.29 98.42,1,0
+19937,Tunisia Mining Grid,conversion,,,,,1618,Minerals licencing,9816,,,Origin: Djebel Kebar,Mining decree of 1st January 1953,EPSG,1999-11-15 00:00:00,99.81,1,0
+19938,Estonian National Grid,conversion,,,,,1090,Large and medium scale topographic mapping and engineering survey.,9802,,,Coordinates at the projection origin match those of TM Baltic 93.,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1999-04-22 00:00:00,99.28,1,0
+19939,TM Baltic 93,conversion,,,,,1646,Large and medium scale topographic mapping and engineering survey.,9807,,,,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,1,0
+19940,Levant Zone,conversion,,,,,1623,Large and medium scale topographic mapping and engineering survey.,9817,,,Superseded by projection using full Lambert formula (EPSG code 19948) from 1973.,US Army Map Service projection tables; 1943.,EPSG,1999-04-22 00:00:00,,1,0
+19941,Brazil Polyconic,conversion,,,,,1053,Small scale mapping,9818,,,,PetroBras,EPSG,1999-10-20 00:00:00,99.55,1,0
+19942,British West Indies Grid,conversion,,,,,2295,Large and medium scale topographic mapping and engineering survey.,9807,,,,"UK Royal Engineers projection tables P10/25, 1943.",EPSG,1999-04-22 00:00:00,,1,0
+19943,Barbados National Grid,conversion,,,,,1042,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded British West Indies Grid (19942) after 1983.,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+19944,Quebec Lambert Projection,conversion,,,,,1368,Medium and small scale mapping,9802,,,,Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec,EPSG,1999-10-22 00:00:00,,1,0
+19945,New Brunswick Stereographic (ATS77),conversion,,,,,1447,Large and medium scale topographic mapping and engineering survey.,9809,,,In use from 1979. To be phased out in late 1990's.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1999-10-20 00:00:00,99.61,1,0
+19946,New Brunswick Stereographic (NAD83),conversion,,,,,1447,Large and medium scale topographic mapping and engineering survey.,9809,,,In use from 1999.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1999-10-20 00:00:00,,1,0
+19947,Austria Lambert,conversion,,,,,1037,Medium and small scale mapping,9802,,,,Bundesamt f�r Eich- und Vermessungswesen,EPSG,2000-01-07 00:00:00,99.94,1,0
+19948,Syria Lambert,conversion,,,,,1623,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded Levant zone using same parameters but truncated near-conformal method (code 19940) from 1973.,IGN Paris,EPSG,1999-10-20 00:00:00,,1,0
+19949,Levant Stereographic,conversion,,,,,1623,Large and medium scale topographic mapping and engineering survey.,9809,,,Used prior to World War II for cadastral and large scale topographic mapping.,IGN Paris,EPSG,1999-10-20 00:00:00,,1,0
+19950,Landesvermessung 1995,conversion,,,,,1286,Large and medium scale topographic mapping and engineering survey.,9815,,,,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,1999-10-20 00:00:00,,1,0
+19951,Nakhl e Taqi Oblique Mercator,conversion,,,,,1338,Large and medium scale topographic mapping and engineering survey.,9815,,,Used only for terminal site.,Total-Fina,EPSG,1999-10-20 00:00:00,,1,0
+19952,Krovak,conversion,,,,,1306,Large and medium scale topographic mapping and engineering survey.,9819,,,,Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2000-03-07 00:00:00,,1,0
+19953,Qatar Grid,conversion,,,,,1346,Large and medium scale topographic mapping and engineering survey.,9806,,,,Maersk Oil and Gas,EPSG,2000-03-07 00:00:00,,1,0
+19954,Suriname Old TM,conversion,,,,,1222,Large and medium scale topographic mapping and engineering survey.,9807,,,Introduced in 1975. Superseded by Suriname TM in 1979.,Shell International,EPSG,2000-06-10 00:00:00,,1,0
+19955,Suriname TM,conversion,,,,,1222,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded Suriname Old TM in 1979 (scale factor changed).,Shell International,EPSG,2000-06-10 00:00:00,,1,0
+19956,Rectified Skew Orthomorphic Borneo Grid (chains),conversion,,,,,1362,Large and medium scale topographic mapping and engineering survey.,9815,,,See 19957 and 19958 for feet and metres versions. If using Hotine Oblique Mercator method (code 9812) FE = FN = 0 chSe. Being superseded by metric version (code 19958).,Directorate of Colonial Surveys projection tables 1954 revision.,EPSG,2002-07-13 00:00:00,2002.47,1,0
+19957,Rectified Skew Orthomorphic Borneo Grid (feet),conversion,,,,,1851,Large and medium scale topographic mapping and engineering survey.,9815,,,See 19956 and 19958 for chains and metres versions. If using Hotine Oblique Mercator method (code 9812) FE = FN = 0 ftSe. Being superseded by metric version (code 19958).,EPSG unit conversion of Directorate of Colonial Surveys projection tables 1954 revision.,EPSG,2002-07-13 00:00:00,2002.47,1,0
+19958,Rectified Skew Orthomorphic Borneo Grid (metres),conversion,,,,,1362,Large and medium scale topographic mapping and engineering survey.,9815,,,See 19956 and 19957 for chains and feet versions. Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. If using Hotine Oblique Mercator method (code 9812) FE = FN = 0 m.,EPSG unit conversion of Directorate of Colonial Surveys projection tables 1954 revision.,EPSG,2000-10-19 00:00:00,,1,0
+19959,Ghana National Grid,conversion,,,,,1104,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded by Ghana metric grid (code 19904).,Ordnance Survey International,EPSG,2000-10-19 00:00:00,,1,0
+19960,Prince Edward Isl. Stereographic (NAD83),conversion,,,,,1533,Large and medium scale topographic mapping and engineering survey.,9809,,,False Easting and False Northing changed from values used with ATS77 (which were FE=700000m; FN=400000m) to these new values when used with NAD83 (CSRS). New values are FE=400000m; FN=800000m; adopted in 2000.,PEI Department of Transportation & Public Works; Mr. Serge Bernard,EPSG,2000-10-19 00:00:00,,1,0
+19961,Belgian Lambert 72,conversion,,,,,1347,Large and medium scale topographic mapping and engineering survey.,9802,,,"Introduced in 2000. Equivalent to Belge Lambert 72 (code 19902).
+If software cannot handle latitude of false origin of 90 deg N, use latitude of false origin = 50� 47' 57.704"" with northing at false origin = 165 372.956 m.",IGN Brussels www.ngi.be/FR/FR2-1-5-1.shtm and EuroGeographics; http://crs.ifag.de/,EPSG,2000-10-19 00:00:00,,1,0
+19962,Irish Transverse Mercator,conversion,,,,,1305,Large and medium scale topographic mapping and engineering survey.,9807,,,,Ordnance Survey of Ireland,EPSG,2000-10-19 00:00:00,,1,0
+19963,Sierra Leone New Colony Grid,conversion,,,,,1342,Topographic mapping and engineering survey.,9807,,,Supersedes the Sierra Leone Colony Grid. New grid is 422.3 ft west and 112.1 ft south of old grid.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+19964,New War Office Sierra Leone Grid,conversion,,,,,1342,Topographic mapping and engineering survey.,9807,,,Supersedes the War Office Sierra Leone Grid. New grid is 422.3 ft west and 112.1 ft south of old grid.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+19965,US National Atlas Equal Area,conversion,,,,,1245,Statistical mapping,9821,,,,"United States Geological Survey, Western Geographic Science Center.",EPSG,2001-06-05 00:00:00,,1,0
+19966,Luxembourg Gauss,conversion,,,,,1146,Large and medium scale topographic mapping and engineering survey.,9807,,,,Administration du Cadastre et de la Topographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+19967,Slovenia Grid,conversion,,,,,1212,Large and medium scale topographic mapping and engineering survey.,9807,,,,Geodetska Uprava Republike Slovenije via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+19968,Plate Carree,conversion,,,,,1262,Graticule coordinates in rectangular Cartesian form.,9823,,,Origin at intersection of equator and prime meridian.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+19969,Portuguese Grid,conversion,,,,,1294,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula.,Instituto Portugues de Cartografia e Cadastro via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+19971,New Zealand Transverse Mercator,conversion,,,,,1175,Large and medium scale topographic mapping and engineering survey.,9807,,,,Land Information New Zealand,EPSG,2001-08-28 00:00:00,,1,0
+19972,Irish Grid,conversion,,,,,1305,Large and medium scale topographic mapping and engineering survey.,9807,,,Defined as part of the 1965 and 1975 mapping adustments in which the scale factor was introduced as a best fit to retain existing grid coordinates.,Ordnance Survey of Ireland.,EPSG,2001-11-06 00:00:00,,1,0
+19973,Irish National Grid,conversion,,,,,2530,Large and medium scale topographic mapping and engineering survey.,9807,,,Used only with the 1952 geodetic adjustment. Superseded by the 1975 Mapping Adjustment: see code 19972.,Ordnance Survey of Northern Ireland.,EPSG,2001-11-06 00:00:00,,1,0
+19974,Modified Portuguese Grid,conversion,,,,,1294,Large and medium scale topographic mapping and engineering survey.,9807,,,Applied to Datum 73. Grid position at origin is coincident with the unmodified grid applied to Lisbon datum.,Instituto Portugues de Cartografia e Cadastro via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+19975,Trinidad Grid (Clarke's feet),conversion,,,,,1339,Oil industry exploration and production.,9806,,,"Foot version of EPSG code 19925. Not an official system, but used by some US-based organisations including Amoco Trinidad.",BP,EPSG,2002-02-12 00:00:00,,1,0
+19976,ICN Regional,conversion,,,,,1251,Small scale topographic and geological mapping.,9802,,,,Institute Cartografica Nacional,EPSG,2002-02-12 00:00:00,,1,0
+19977,Aramco Lambert,conversion,,,,,1206,Oil industry exploration and production.,9802,,,Used by Saudi Aramco when area of interest crosses UTM zone boundary. Adopted by partners for Core Venture 1 (South Ghawar) area.,Saudi Aramco,EPSG,2002-02-12 00:00:00,,1,0
+19978,Hong Kong 1980 Grid,conversion,,,,,1118,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,"Grid origin is Partiridge Hill triangulation station (old trig ""2"").","Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+19979,Portugal Bonne,conversion,,,,,1294,"1:50,000 topographic mapping.",9828,,,,"Instituto Portugues de Cartografia e Cadastro, http://www.ipcc.pt/portuguese/produtos/cartografia/50m.html",EPSG,2002-07-13 00:00:00,,1,0
diff --git a/src/tiff/csv/coordinate_operation_method.csv b/src/tiff/csv/coordinate_operation_method.csv
new file mode 100644
index 0000000..bc0956c
--- /dev/null
+++ b/src/tiff/csv/coordinate_operation_method.csv
@@ -0,0 +1,1513 @@
+"COORD_OP_METHOD_CODE","COORD_OP_METHOD_NAME","REVERSE_OP","FORMULA","EXAMPLE","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+9601,Longitude rotation,1,Target_longitude = Source_longitude + longitude_offset.,,This transformation allows calculation of the longitude of a point in the target system by adding the parameter value to the longitude value of the point in the source system.,EPSG guidance note #7.,EPSG,1999-11-12 00:00:00,99.79,0
+9602,Geographic/geocentric conversions,1,"Latitude, P, and Longitude, L, in terms of Geographic Coordinate Reference System A may
+be expressed in terms of a geocentric (earth centred) Cartesian coordinate reference system X, Y, Z
+with the Z axis corresponding with the Polar axis positive northwards, the X axis through
+the intersection of the Greenwich meridian and equator, and the Y axis through the
+intersection of the equator with longitude 90 degrees E. If the prime meridian for geogCRS A is not
+Greewich, longitudes must first be transformed to their Greenwich equivalent. If the earth's
+spheroidal semi major axis is a, semi minor axis b, and inverse flattening 1/f, then
+
+ XA= (nu + hA) cos P cos L
+ YA= (nu + hA) cos P sin L
+ ZA= ((1 - e^2) nu + hA) sin P
+
+where nu is the prime vertical radius of curvature at latitude P and is equal to
+ nu = a /(1 - e^2*sin^2(P))^0.5,
+ P and L are respectively the latitude and longitude (related to Greenwich) of the point
+ h is height above the ellipsoid, (topographic height plus geoidal height), and
+ e is the eccentricity of the ellipsoid where e^2 = (a^2 -b^2)/a^2 = 2f -f^2
+
+Cartesian coordinates in geocentric coordinate reference system B may be used to derive geographical coordinates in terms of geographic coordinate reference system B by:
+ P = arctan (ZB + e^2* nu*sin P) / (XB^2 + YB^2)^0.5 by iteration
+ L = arctan YB/XB
+ hB = XB sec L sec P - nu
+
+where LB is relative to Greenwich. If the geographic system has a non Greenwich prime
+meridian, the Greenwich value of the local prime meridian should be applied to longitude.
+
+(Note that h is the height above the ellipsoid. This is the height value which is
+delivered by Transit and GPS satellite observations but is not the topographic
+height value which is normally used for national mapping and levelling operations.
+The topographic height is usually the height above mean sea level or an alternative
+level reference for the country. If one starts with a topographic height, it will be
+necessary to convert it to an ellipsoid height before using the above transformation
+formulas. h = N + H, where N is the geoid height above the ellipsoid at the point
+and is sometimes negative, and H is the height of the point above the geoid. The
+height above the geoid is often taken to be that above mean sea level, perhaps with
+a constant correction applied. Geoid heights of points above the nationally used
+ellipsoid may not be readily available. For the WGS84 ellipsoid the value of N,
+representing the height of the geoid relative to the ellipsoid, can vary between
+values of -100m in the Sri Lanka area to +60m in the North Atlantic.)","Consider a North Sea point with coordinates derived by GPS satellite in the WGS 84 geographical coordinate system with coordinates of:
+
+ latitude 53 deg 48 min 33.82 sec N,
+ longitude 02 deg 07 min 46.38 sec E,
+ and ellipsoidal height 73.0m,
+
+whose coordinates are required in terms of the ED50 geographical coordinate system which takes the International 1924 ellipsoid. The three parameter datum shift from WGS 84 to ED50 for this North Sea area is given as dX = +84.87m, dY = +96.49m, dZ = +116.95m.
+
+The WGS 84 geographical coordinates convert to the following geocentric values using the above formulas for X, Y, Z:
+
+ XA = 3771 793.97m
+ YA = 140 253.34m
+ ZA = 5124 304.35m
+
+Applying the quoted datum shifts to these, we obtain new geocentric values now related to ED50:
+
+ XB = 3771 878.84m
+ YB = 140 349.83m
+ ZB = 5124 421.30m
+
+These convert to ED50 values on the International 1924 ellipsoid as:
+ latitude 53 deg 48 min 36.565 sec N,
+ longitude 02 deg 07 min 51.477 sec E,
+ and ellipsoidal height 28.02 m,
+
+Note that the derived height is referred to the International 1924 ellipsoidal surface and will need a further correction for the height of the geoid at this point in order to relate it to Mean Sea Level.","This is a parameter-less conversion. It is often concatenated in applications with the 3- or 7-parameter transformations 9603, 9606 and 9607 to form a geographic to geographic transformation.","EPSG guidance note #7 from ""Transformation from spatial to geographical coordinates""; B [...]
+9603,Geocentric translations,1,Xt = Xs + dX; Yt = Ys + dY; Zt = Zs + dZ,"Given a three parameter datum shift from WGS 84 to ED50 for this North Sea area is given as
+dX = +84.87m, dY = +96.49m, dZ = +116.95m.
+
+The WGS84 geographical coordinates convert to the following WGS 84 geocentric values using
+the above formulas for X, Y, Z:
+
+ XA = 3771 793.97m
+ YA = 140 253.34m
+ ZA = 5124 304.35m
+
+Applying the given datum shifts to these, we obtain new geocentric values now related
+to ED50:
+
+ XB = 3771 878.84m
+ YB = 140 349.83m
+ ZB = 5124 421.30m",This transformation allows calculation of coordinates in the target system by adding the parameter value to the corresponding coordinate values of the point in the source system.,EPSG guidance note #7.,EPSG,1996-09-18 00:00:00,,0
+9604,Molodenski,1,See information source.,See information source.,,,EPSG,1996-09-18 00:00:00,,0
+9605,Abridged Molodenski,1,"As an alternative to the computation of the new latitude, longitude and height above ellipsoid in discrete steps through geocentric coordinates, the changes in these geographic coordinates may be derived directly by formulas derived by Molodenski. Abridged versions of these formulas, which are quite satisfactory for three parameter transformations, are as follows:
+
+Dlat "" = [(-dX*sin(lat)*cos(lon)) - (dY*sin(lat)*sin(lon)) + (dZ*cos(lat)) + (((a*Df) + (f*Da))*sin(2*lat))] / (rho * sin(1""))
+
+Dlon "" = (-dX*sin(lon) + dY*cos(lon)) / ((nu*cos(lat)) * sin(1""))
+
+Dh = (dX*cos(lat)*cos(lon)) + (dY*cos(lat)*sin(lon)) + (dZ*sin(lat)) + ((a*Df + f*Da)*(sin(lat)^2)) - Da
+
+where the dX, dY and dZ terms are as before, and rho and nu are the meridian and prime vertical radii of curvature at the given latitude (lat) on the first ellipsoid, Da is the difference in the semi-major axes (a1 - a2) of the first and second ellipsoids and Df is the difference in the flattening of the two ellipsoids.
+
+The formulas for Dlat and Dlon indicate changes in latitude and longitude in arc-seconds.",See information source.,"This transformation is a truncated Taylor series expansion of a transformation between two geographic coordinate systems, modelled as a set of geocentric translations.",EPSG guidance note #7.,EPSG,1999-04-22 00:00:00,99.01,0
+9606,Position Vector 7-param. transformation,1,"Transformation of coordinates from one geographic coordinate reference system into another (also known as a ""datum transformation"") is usually carried out as an implicit concatenation of three transformations:
+[geographical to geocentric >> geocentric to geocentric >> geocentric to geographic]
+
+The middle part of the concatenated transformation, from geocentric to geocentric, is usually described as a simplified 7-parameter Helmert transformation, expressed in matrix form with 7 parameters, in what is known as the ""Bursa-Wolf"" formula:
+
+ (Xt) ( 1 -Rz +Ry) (Xs) (dX)
+ (Yt) = M * ( +Rz 1 -Rx) * (Ys) + (dY)
+ (Zt) ( -Ry +Rx 1 ) (Zs) (dZ)
+
+The parameters are commonly referred to defining the transformation ""from source coordinate reference system to target coordinate reference system"", whereby (Xs, Ys, Zs) are the coordinates of the point in the source geocentric coordinate reference system and (Xt, Yt, Zt) are the coordinates of the point in the target geocentric coordinate reference system. But that does not define the parameters uniquely; neither is the definition of the parameters implied in the formula, as is often [...]
+
+(dX, dY, dZ) :Translation vector, to be added to the point's position vector in the source coordinate reference system in order to transform from source system to target system; also: the coordinates of the origin of the source coordinate reference system in the target coordinate reference system.
+
+(Rx, Ry, Rz) :Rotations to be applied to the point's vector. The sign convention is such that a positive rotation about an axis is defined as a clockwise rotation of the position vector when viewed from the origin of the Cartesian coordinate reference system in the positive direction of that axis; e.g. a positive rotation about the Z-axis only from source system to target system will result in a larger longitude value for the point in the target system. Although rotation angles may b [...]
+
+M :The scale correction to be made to the position vector in the source coordinate reference system in order to obtain the correct scale in the target coordinate reference system. M = (1 + dS*10^-6), where dS is the scale correction expressed in parts per million.
+
+<<<<<This text continues in the description of the Coordinate Frame Rotation formula>>>>>","Input point:
+Coordinate reference system: WGS 72 (geographic 3D)
+ Latitude = 55 deg 00 min 00 sec
+ Longitude = 4 deg 00 min 00 sec
+ Ellipsoidal height = 0 m
+
+This transforms to Cartesian geocentric coords:
+ X = 3 657 660.66 (m)
+ Y = 255 768.55 (m)
+ Z = 5 201 382.11 (m)
+
+Transformation parameters WGS 72 to WGS 84:
+ dX (m) = 0.000
+ dY (m) = 0.000
+ dZ (m) = +4.5
+ RX ("") = 0.000
+ RY ("") = 0.000
+ RZ ("") = +0.554
+ Scale (ppm) = +0.219
+
+Application of the 7 parameter Position Vector Transformation results in WGS 84 coordinates of:
+ X = 3 657 660.78 (m)
+ Y = 255 778.43 (m)
+ Z = 5 201 387.75 (m)
+
+This converts into:
+ Latitude = 55 deg 00 min 00.090 sec
+ Longitude = 4 deg 00 min 00.554 sec
+ Ellipsoidal height = +3.22 m
+on the WGS 84 geographic 3D coordinate reference system.",Note the analogy with the Coordinate Frame Rotation (code 9607) but beware of the differences! The Position Vector convention is used by IAG and recommended by ISO 19111.,EPSG guidance note #7.,EPSG,1996-09-18 00:00:00,98.16,0
+9607,Coordinate Frame rotation,1,"<<<<<This text is continued from the description of the Position Vector Transformation formula>>>>>
+
+Although being common practice particularly in the European E&P industry, the Position Vector Transformation sign convention is not universally accepted. A variation on this formula is also used, particularly in the USA E&P industry. That formula is based on the same definition of translation and scale parameters, but a different definition of the rotation parameters. The associated convention is known as the ""Coordinate Frame Rotation"" convention (EPSG coordinate operation method c [...]
+The formula is:
+
+ (X�) ( 1 +Rz -Ry) (X) (dX)
+ (Y�) = M * ( -Rz 1 +Rx) * (Y) + (dY)
+ (Z�) ( +Ry -Rx 1 ) (Z) (dZ)
+
+and the parameters are defined as:
+
+(dX, dY, dZ) : Translation vector, to be added to the point's position vector in the source coordinate reference system in order to transform from source coordinate reference system to target coordinate reference system; also: the coordinates of the origin of source coordinate reference system in the target frame.
+
+(Rx, Ry, Rz) : Rotations to be applied to the coordinate reference frame. The sign convention is such that a positive rotation of the frame about an axis is defined as a clockwise rotation of the coordinate reference frame when viewed from the origin of the Cartesian coordinate reference system in the positive direction of that axis, that is a positive rotation about the Z-axis only from source coordinate reference system to target coordinate reference system will result in a smaller [...]
+
+M : The scale factor to be applied to the position vector in the source coordinate reference system in order to obtain the correct scale of the target coordinate reference system. M = (1+dS*10^-6), where dS is the scale correction expressed in parts per million.
+
+In the absence of rotations the two formulas are identical; the difference is solely in the rotations. The name of the second method reflects this.
+
+Note that the same rotation that is defined as positive in the first method is consequently negative in the second and vice versa. It is therefore crucial that the convention underlying the definition of the rotation parameters is clearly understood and is communicated when exchanging datum transformation parameters, so that the parameters may be associated with the correct coordinate transformation method (algorithm).","The same example as for the Position Vector Transformation (coordi [...]
+
+Transformation parameters Coordinate Frame Rotation convention:
+dX (m) = 0.000
+dY (m) = 0.000
+dZ (m) = +4.5
+RX ("") = 0.000
+RY ("") = 0.000
+RZ ("") = -0.554
+Scale (ppm) = +0.219
+
+Please note that only the rotation has changed sign as compared to the Position Vector Transformation.",Note the analogy with the Position Vector transformation (code 9606) but beware of the differences! The Position Vector convention is used by IAG and recommended by ISO 19111.,EPSG guidance note #7.,EPSG,1996-09-18 00:00:00,,0
+9613,NADCON,1,See information source.,,Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation. Input expects longitudes to be positive west.,US Coast and geodetic Survey - http://www.ngs.noaa.gov,EPSG,1996-09-18 00:00:00,,0
+9614,NTv1,1,See information source.,,Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation. Superseded in 1997 by NTv2 (transformation method code 9615). Input expects longitudes to be positive west.,Geomatics Canada - Geodetic Survey Division.,EPSG,1997-11-13 00:00:00,,0
+9615,NTv2,1,See information source.,,Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation. Supersedes NTv1 (transformation method code 9614). Input expects longitudes to be positive west.,http://www.geod.nrcan.gc.ca/products/html-public/GSDapps/English/NTv2_Fact_Sheet.html,EPSG,1997-11-13 00:00:00,,0
+9616,Vertical Offset,1,"Xt = [(Xs * Us) + (A * Ua)] * (m / Ut)
+
+where
+Xt = value in the target vertical coordinate reference system.
+
+Xs = value in the source vertical coordinate reference system;
+
+A is the value of the origin of the target system in the source system.
+
+m is unit direction multiplier (m=1 if both systems are height or both are depth; m = �1 if one system is height and the other system is depth; the value of m is implied through the vertical coordinate reference system type attribute).
+
+Us Ut and Ua are unit conversion ratios to metres for the source and target systems and the offset value A respectively.",,This transformation allows calculation of height (or depth) in the target system by adding the parameter value to the height (or depth)-value of the point in the source system.,EPSG guidance note #7.,EPSG,1999-11-12 00:00:00,99.79,0
+9617,Madrid to ED50,0,"The polynomial expressions are:
+
+ dLat seconds = A0 + (A1*lat) + (A2*lon) + (A3*H)
+ dLon seconds = B00 + B0 + (B1*lat) + (B2*lon) + (B3*H)
+
+where latitude lat and longitude lon are in decimal degrees referred to the Madrid 1870 (Madrid) geographic coordinate reference system and H is gravity-related height in metres. B00 is the longitude (in seconds) of the Madrid meridian measured from the Greenwich meridian; it is the value to be applied to a longitude relative to the Madrid meridian to transform it to a longitude relative to the Greenwich meridan.
+
+The results of these expressions are applied through the formulae:
+Lat(ED50) = Lat(M1870(M)) + dLat
+and Lon(ED50) = Lon(M1870(M)) + dLon.","Input point coordinate system: Madrid 1870 (Madrid) (geographic 3D)
+ Latitude = 42 deg 38 min 52.77 sec N
+ = 42.647992 degrees
+ Longitude = 3 deg 39 min 34.57 sec E of Madrid
+ = +3.659603 degrees from the Madrid meridian.
+ Height = 0 m
+
+For the north zone transformation:
+A1 = 11.328779
+A2 = -0.1674
+A3 = -0.03852
+A4 = 0.0000379
+B0 = -13276.58
+B1 = 2.5079425
+B2 = 0.8352
+B3 = -0.00864
+B4 = -0.0000038
+
+dLat = +4.05 seconds
+
+Then ED50 latitude = 42 deg 38 min 52.77 sec N + 4.05sec
+ = 42 deg 38 min 56.82 sec N
+
+
+dLon = -13270.54 seconds = -3 deg 41 min 10.54 sec
+
+Then ED50 longitude = 3 deg 39 min 34.57 sec E - 3 deg 41 min 10.54 sec
+ = 0 deg 01 min 35.97 sec W of Greenwich.",,"EPSG guidance note #7, after Institut de Geomatica; Barcelona.",EPSG,2000-03-07 00:00:00,99.284 99.82 99.64,0
+9618,Geographical and Height Offsets,1,"Lat_T = Lat_S + latitude_offset
+Lon_T = Lon_S + longitude_offset
+EllipsoidHeight_T = GravityHeight_S + gravity-related_to_ellipsoid_height_offset.",,This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.,EPSG guidance note #7.,EPSG,1999-11-12 00:00:00,99.79,0
+9619,Geographical Offsets,1,"Lat_T = Lat_S + latitude_offset
+Lon_T = Lon_S + longitude_offset.",,This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.,EPSG guidance note #7.,EPSG,1999-11-12 00:00:00,99.79,0
+9620,Norway Offshore Interpolation,0,See information source.,,,"Norwegian Mapping Authority note of 13-Feb-1991 ""Om Transformasjon mellom Geodetiske Datum i Norge"".",EPSG,1999-04-22 00:00:00,,0
+9621,Similarity transformation,0,"The similarity transformation in algebraic form is:
+
+XT = XT0 + XS. dS. cos q + YS. dS . sin q
+YT = YT0 � XS. dS. sin q + YS. dS . cos q
+
+where:
+XT0 , YT0 = the coordinates of the origin point of the source coordinate reference system expressed in the target coordinate reference system;
+1+dS = the length of one unit in the source coordinate reference system expressed in units of the target coordinate reference system;
+q = the angle about which the axes of the source coordinate reference system need to be rotated to coincide with the axes of the target coordinate reference system, counter-clockwise being positive. Alternatively, the bearing of the source coordinate reference system Y-axis measured relative to target coordinate reference system north.
+
+The similarity transformation can also be described as a special case of the parametric affine transformation where coefficients A1 = B2 and A2 = - B1.
+
+Reversibility
+In contrast with the affine transformation, the similarity transformation parameters are reversible, but only on the condition that the scale difference between the two coordinate systems is small (order of several parts per million). Then dS is the deviation from unity of the ratio of the units of measure of the two coordinate reference systems. In these cases the reverse transformation would require a scale correction of 1/(1+dS) * (1-dS). This enables usage of the same scale and rot [...]
+Target coordinate system: Campo Inchauspe / Argentina 2 (projected 2D system)
+
+Note that for the Astra Minas Grid the coordinate axes are:
+X (positive axis oriented north)
+Y (positive axis oriented west)
+and coordinates are quoted in that order.
+
+whereas for Campo Inchauspe / Argentina 2 the axes are:
+X (positive axis oriented north)
+Y (positive axis oriented east)
+and coordinates are quoted in that order.
+
+Thus the Astra Minas grid X and Y axes map to the Campo Inchauspe / Argentina 2 Y and X-axes respectively. With respect to the symbols in the formulas,
+XS = Astra Minas X
+YS = Astra Minas Y
+XT = Campo Inchauspe / Argentina 2 Y
+YT = Campo Inchauspe / Argentina 2 X
+
+Parameters of the similarity transformation:
+XT0 = 2610200.48 metre
+YT0 = 4905282.73 metre
+* = 271o 05� 30� = 271.0916667 degrees
+k = 0 whence (1+k)=1.0
+
+Forward calculation for Astra Minas point : X (north) =10000 m, Y (west) =50000 m.
+
+XS = Astra Minas X = 10000
+YS = Astra Minas Y = 50000
+
+Gauss-Kruger zone 2 Easting (Y) = XT = XT0 + XS. dS. cos q + YS. dS . sin q
+ = 2610200.48 + (50000 * 1.0 * cos(271.0916667deg))
+ + (10000 * 1.0 * sin(271.0916667deg))
+ = 2601154.90 m.
+
+Gauss-Kruger zone 2 Northing (X) =YT = YT0 � XS. dS. sin q + YS. dS . cos q
+ = 4905282.73 - (50000*1.0* sin(271.0916667deg))
+ + (10000 * 1.0 * cos(271.0916667deg))
+ = 4955464.17 m.",Defined for two-dimensional coordinate systems.,EPSG guidance note #7.,EPSG,2000-10-19 00:00:00,2000.83,0
+9622,Affine orthogonal geometric transformation,0,"XT = XT0 + XS . k . dSX . cos q + YS . k . dSY . sin q
+YT = YT0 � XS . k . dSX . sin q + YS . k . dSY . cos q
+
+where:
+
+XT0 ,YT0 = the coordinates of the origin point of the source coordinate reference system, expressed in the target coordinate reference system;
+dSX , dSY = the length of one unit of the source axis, expressed in units of the target axis, for the X axes and the Y- axes respectively;
+k = point scale factor of the target coordinate reference system in a chosen reference point;
+q = the angle through which the source coordinate reference system axes must be rotated to coincide with the target coordinate refderence system axes (counter-clockwise is positive). Alternatively, the bearing (clockwise positive) of the source coordinate reference system Y-axis measured relative to target coordinate reference system north.","Source coordinate system: imaginary 3D seismic acquisition bin grid. The two axes are orthogonal, but the unit on the I-axis is 25 metres, whilst [...]
+The target projected coordinate system is WGS 84 / UTM Zone 31N and the origin of the bin grid (centre of bin 0,0) is defined at E = 456781.0, N = 5836723.0. The projected coordinate system point scale factor at the bin grid origin is 0.99984.
+The map grid bearing of the I and J axes are 110* and 20* respectively. Thus the angle through which both the positive I and J axes need to be rotated to coincide with the positive Easting axis and Northing axis respectively is +20 degrees.
+
+Hence:
+XT0 , = 456 781.0 m
+YT0 = 5 836 723.0 m
+dSX = 25
+dSY = 12.5
+k = 0.99984
+q = +20 degrees
+
+Forward calculation for centre of bin with coordinates: I = 300, J = 247:
+
+XT = Easting = XT0 + XS . k . dSX . cos q + YS . k . dSY . sin q = 464 855.62 m.
+
+YT = Northing = YT0 � XS . k . dSX . sin q + YS . k . dSY . cos q = 5 837 055.90 m
+
+Reverse calculation for this point:
+XS = [( XT � XT0) . cos qY � (YT � YT0) . sin qY ] / [k . dSX . cos (qX � qY)] = 230 bins
+
+YS = [(XT � XT0) . sin qX + (YT � YT0) . cos qX ] / [k . dSY . cos (qX � qY)] = 162 bins",,EPSG guidance note #7.,EPSG,2000-06-10 00:00:00,,0
+9623,Affine general geometric transformation,0,"The geometric representation of the general affine transformation:
+XT = XT0 + XS . k . dSX . cos qX + YS . k . dSY . sin qY
+YT = YT0 � XS . k . dSX . sin qX + YS . k. dSY . cos qY
+where:
+
+XT0 ,YT0 = the coordinates of the origin point of the source coordinate reference system, expressed in the target coordinate reference system;
+dSX , dSY = the length of one unit of the source axis, expressed in units of the target axis, for the first and second source and target axis pairs respectively;
+qX , qY = the angles about which the source coordinate reference system axes XS and YS must be rotated to coincide with the target coordinate reference system axes XT and YT respectively (counter-clockwise being positive).
+k = point scale factor of the target coordinate reference system in a chosen reference point;
+
+Comparing the algebraic representation with the parameters of the parameteric form (code 9624) it can be seen that the parametric and geometric forms of the affine transformation are related as follows:
+A0 = XT0
+A1 = k . dSX . cos qX
+A2 = k . dSY . sin qY
+B0 = YT0
+B1 = � k . dSX . sin qX
+B2 = k . dSY . cos qY
+
+Reversibility
+The parameters for an affine transformation cannot be used for the reverse transformation. However, the reverse transformation is another affine transformation using the same formulas but with different parameters. The reverse parameter values can be calculated from from the formulae provided above and applying those to same algorithm. Alternatively the reverse transformation can be described by a different formula, as shown below, using the same parameters as the forward transformation:
+
+XS = [( XT � XT0) . cos qY � (YT � YT0) . sin qY ] / [k . dSX . cos (qX � qY)]
+YS = [(XT � XT0) . sin qX + (YT � YT0) . cos qX ] / [k . dSY . cos (qX � qY)]",,,EPSG guidance note #7.,EPSG,2000-06-10 00:00:00,,0
+9624,Affine general parametric transformation,0,"XT = A0 + A1. XS + A2.YS
+YT = B0 + B1. XS + B2.YS
+where
+XT , YT are the coordinates of a point P in the target coordinate reference system;
+XS , YS are the coordinates of P in the source coordinate reference system.
+
+Reversibility
+The parameter values for an affine transformation cannot be used for the reverse transformation. However, the reverse transformation is another affine transformation using the same formulas but with different parameter values. The reverse parameter values, indicated by a prime (�), can be calculated from those of the forward transformation as follows:
+
+D = A1 . B2 � A2 . B1
+A0� = (A2 . B0 � B2 . A0) / D
+B0� = (B1 . A0 � A1 . B0) / D
+A1� = +B2 / D
+A2� = � A2 / D
+B1� = � B1 / D
+B2� = +A1 / D",,,EPSG guidance note #7,EPSG,2000-06-10 00:00:00,,0
+9625,General polynomial (2nd-order),0,"The simplest of all polynomials is the general polynomial function. In order to avoid problems of numerical instability this type of polynomial should be used after reducing the input parameters, usually coordinate offsets U and V relative to a central evaluation point, to �manageable� numbers, between �10 and +10 at most.
+
+U = XS - XS0 in defined units (which may not be those of the coordinate reference system),
+V = YS - YS0
+
+Then (XT - XT0) = (XS - XS0) + dX
+ (YT - YT0) = (YS - YS0) + dY
+or
+XT = XS - XS0 + XT0 + dX
+YT = YS - YS0 + YT0 + dY
+
+where
+XT , YT are coordinates in the target coordinate reference system,
+XS , YS are coordinates in the source coordinate reference system,
+XS0 , YS0 are coordinates of the evaluation point in the source coordinate reference system,
+XT0 , YT0 are coordinates of the evaluation point in the target coordinate reference system.
+
+and where
+dX = A0 + A1.U + A2.V + A3.U2 + A4.U.V + A5.V2
+dY = B0 + B1.U + B2.V +B3.U2 +B4.U.V +B5.V2",,,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,,0
+9626,General polynomial (3rd-order),0,"The simplest of all polynomials is the general polynomial function. In order to avoid problems of numerical instability this type of polynomial should be used after reducing the input parameters, usually coordinate offsets U and V relative to a central evaluation point, to �manageable� numbers, between �10 and +10 at most.
+
+U = XS - XS0 in defined units (which may not be those of the coordinate reference system),
+V = YS - YS0
+
+Then (XT - XT0) = (XS - XS0) + dX
+ (YT - YT0) = (YS - YS0) + dY
+or
+XT = XS - XS0 + XT0 + dX
+YT = YS - YS0 + YT0 + dY
+
+where
+XT , YT are coordinates in the target coordinate reference system,
+XS , YS are coordinates in the source coordinate reference system,
+XS0 , YS0 are coordinates of the evaluation point in the source coordinate reference system,
+XT0 , YT0 are coordinates of the evaluation point in the target coordinate reference system.
+
+and where
+dX = A0 + A1.U + A2.V + A3.U2 + A4.U.V + A5.V2 + A6.U3 + A7.U2.V + A8.U.V2 + A9.V3
+dY = B0 + B1.U + B2.V +B3.U2 +B4.U.V +B5.V2 + B6.U3 +B7.U2.V +B8.U.V2 +B9.V3",,,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,,0
+9627,General polynomial (4th-order),0,"The simplest of all polynomials is the general polynomial function. In order to avoid problems of numerical instability this type of polynomial should be used after reducing the input parameters, usually coordinate offsets U and V relative to a central evaluation point, to �manageable� numbers, between �10 and +10 at most.
+
+U = XS - XS0 in defined units (which may not be those of the coordinate reference system),
+V = YS - YS0
+
+Then (XT - XT0) = (XS - XS0) + dX
+ (YT - YT0) = (YS - YS0) + dY
+or
+XT = XS - XS0 + XT0 + dX
+YT = YS - YS0 + YT0 + dY
+
+where
+XT , YT are coordinates in the target coordinate reference system,
+XS , YS are coordinates in the source coordinate reference system,
+XS0 , YS0 are coordinates of the evaluation point in the source coordinate reference system,
+XT0 , YT0 are coordinates of the evaluation point in the target coordinate reference system.
+
+and where
+dX = A0 + A1.U + A2.V + A3.U2 + A4.U.V + A5.V2 + A6.U3 + A7.U2.V + A8.U.V2 + A9.V3 + A10.U4 + A11.U3.V + A12.U2.V2 + A13.U.V3 + A14.V4
+
+dY = B0 + B1.U + B2.V +B3.U2 +B4.U.V +B5.V2 + B6.U3 +B7.U2.V +B8.U.V2 +B9.V3 + B10.U4 + B11.U3.V + B12.U2.V2 + B13.U.V3 + B14.V4",,,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,,0
+9628,Reversible polynomial (2nd-order),1,See EPSG Guidance Note 7.,,Reversibility is subject to constraints. See Guidance Note 7 for clarification.,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,99.64,0
+9629,Reversible polynomial (3rd-order),1,See EPSG Guidance Note 7.,,Reversibility is subject to constraints. See Guidance Note 7 for clarification.,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,99.64,0
+9630,Reversible polynomial (4th-order),1,See EPSG Guidance Note 7.,"For geodetic transformation ED50 to ED87 (1)
+
+Offset unit: degree
+Ordinate 1 of evaluation point X0 = 55� 00' 00.000""N = +55 degrees
+Ordinate 2 of evaluation point Y0 = 0� 00' 00.000""E = +0 degrees
+
+Parameters:
+A0 = -5.56098E-06 A1 = -1.55391E-06 ... A14 = -4.01383E-09
+B0 = +1.48944E-05 B2 = +2.68191E-05 ... B14 = +7.62236E-09
+
+Forward calculation for:
+ED50 Latitude = Xs =52* 30�30""N = +52.508333333 degrees
+ED50 Longitude = Ys = 2*E= +2.0 degrees
+
+U = XS - X0 = * ED50 - X0 = 52.508333333 - 55.0 = -2.491666667 degrees
+V = YS - Y0 = * ED50 - Y0 = 2.0 - 0.0 = 2.0 degrees
+
+dX = A0 + A1.U + ... + A14.V4
+ = -5.56098E-06 + (-1.55391E-06 * -2.491666667) + ... + (-4.01383E-09 * 2.0^4)
+ = -3.12958E-06 degrees
+
+dY = B0 + B1.U + ... + B14.V4
+ = +1.48944E-05 + (2.68191E-05 * -2.491666667) + ... + (7.62236E-09 * 2.0^4)
+ = +9.80126E-06 degrees
+
+Then ED87 Latitude = XT = XS + dX
+ = 52.508333333 - 3.12958E-06 degrees
+ = 52* 30� 29.9887"" N
+
+ED87 Longitude = YT = YS + dY
+ = 2* 00� 00.0353"" E
+
+
+Reverse calculation for transformation ED50 to ED87 (1).
+The transformation method for the ED50 to ED87 (1) transformation, 4th-order reversible polynomial, is reversible. The same formulas may be applied for the reverse calculation, but coefficients A0 through A14 and B0 through B14 are applied with reversal of their signs. Sign reversal is not applied to the coordinates of the evaluation point. Thus:
+Ordinate 1 of evaluation point X0 = 55� 00' 00.000""N = +55 degrees
+Ordinate 2 of evaluation point Y0 = 0� 00' 00.000""E = +0 degrees
+A0 = +5.56098E-06 A1 = +1.55391E-06 ... A14 = +4.01383E-09
+B0 = -1.48944E-05 B1 = -2.68191E-05 ... B14 = -7.62236E-09
+
+Reverse calculation for:
+ED87 Latitude = XS = 52� 30�29.9887""N = +52.5083301944 degrees
+ED87 Longitude = YS = 2� 00� 00.0353"" E = +2.0000098055 degrees
+
+U = 52.5083301944 - 55.0 = -2.4916698056 degrees
+V = 2.0000098055 - 0.0 = 2.0000098055 degrees
+
+dX = A0 + A1.U + ... + A14.V4
+ = +5.56098E-06 + (1.55391E-06 * -2.491666667) + ... + (4.01383E-09 * 2.0000098055^4)
+ = +3.12957E-06 degrees
+
+dY = B0 + B1.U + ... + B14.V4
+ = -1.48944E-05 + (-2.68191E-05 * -2.491666667) + ... + (-7.62236E-09 * 2.0000098055^4)
+ = -9.80124E-06 degrees
+
+Then ED50 Latitude = XT = XS + dX
+ = 52.5083301944 + 3.12957E-06 degrees
+ = 52� 30� 30.000"" N
+
+ED50 Longitude = YT = YS + dY
+ = 2� 00� 00.000"" E",Reversibility is subject to constraints. See Guidance Note 7 for clarification.,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,99.64,0
+9631,Complex polynomial (3rd-order),0,"The relationship between two projected coordinate reference systems may be approximated more elegantly by a single polynomial regression formula written in terms of complex numbers. The advantage is that the dependence between the �A� and �B� coefficients (for U and V) is taken into account in the formula, resulting in fewer coefficients for the same order polynomial. A third-order polynomial in complex numbers is used in Belgium. A fourth-order po [...]
+
+(dX + i. dY) = (A1 + i. A2).(U + i.V) + (A3 + i. A4).(U + i.V)^2 + (A5 + i. A6).(U + i.V)^3
+
+where U = (XS - XS0).10-5
+and V = (YS - YS0).10-5
+
+Then
+XT = XS - XS0 + XT0 + dX
+YT = YS - YS0 + YT0 + dY
+
+where
+XT , YT are coordinates in the target coordinate reference system,
+XS , YS are coordinates in the source coordinate reference system,
+XS0 , YS0 are coordinates of the evaluation point in the source coordinate reference system,
+XT0 , YT0 are coordinates of the evaluation point in the target coordinate reference system.
+
+Note that the zero order coefficients of the general polynomial, A0 and B0, have apparently disappeared. In reality they are absorbed by the different coordinates of the source and of the target evaluation point, which in this case, are numerically very different because of the use of two different projected coordinate reference systems for source and target.
+
+The transformation parameter values (the coefficients) are not reversible. For the reverse transformation a different set of parameter values are required, used within the same formulas as the forward direction","For transformation Belge Lambert 72 to ED50 / UTM zone 31N,
+
+Eo1 = 0
+No1 = 0
+Eo2 = 449681.702
+No2 = 5460505.326
+A1 = -71.3747
+A2 = 1858.8407
+A3 = -5.4504
+A4 = -16.9681
+A5 = 4.0783
+A6 = 0.2193
+
+For source coordinate system E1=200000 N1=100000, then
+E2 = 647737.377 N2 = 5564124.227.",Coordinate pairs treated as complex numbers. This exploits the correlation between the polynomial coefficients and leads to a smaller number of coefficients than the regular 3rd-order polynomial.,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,,0
+9632,Complex polynomial (4th-order),0,"The relationship between two projected coordinate reference systems may be approximated more elegantly by a single polynomial regression formula written in terms of complex numbers. The advantage is that the dependence between the �A� and �B� coefficients (for U and V) is taken into account in the formula, resulting in fewer coefficients for the same order polynomial. A third-order polynomial in complex numbers is used in Belgium. A fourth-order po [...]
+
+(dX + i. dY) = (A1 + i. A2).(U + i.V) + (A3 + i. A4).(U + i.V)^2 + (A5 + i. A6).(U + i.V)^3 + (A7 + i.A8).(U + i.V)^4
+
+where U = (XS - XS0).10-5
+and V = (YS - YS0).10-5
+
+Then
+XT = XS - XS0 + XT0 + dX
+YT = YS - YS0 + YT0 + dY
+
+where
+XT , YT are coordinates in the target coordinate reference system,
+XS , YS are coordinates in the source coordinate reference system,
+XS0 , YS0 are coordinates of the evaluation point in the source coordinate reference system,
+XT0 , YT0 are coordinates of the evaluation point in the target coordinate reference system.
+
+Note that the zero order coefficients of the general polynomial, A0 and B0, have apparently disappeared. In reality they are absorbed by the different coordinates of the source and of the target evaluation point, which in this case, are numerically very different because of the use of two different projected coordinate reference systems for source and target.
+
+The transformation parameter values (the coefficients) are not reversible. For the reverse transformation a different set of parameter values are required, used within the same formulas as the forward direction.","For transformation RD / Netherlands New to ED50 / UTM zone 31N,
+
+Eo1 = 155000
+No1 = 463000
+Eo2 = 663395.607
+No2 = 5781194.380
+A1 = -51.681
+A2 = 3290.525
+A3 = 20.172
+A4 = 1.133
+A5 = 2.075
+A6 = 0.251
+A7 = 0.075
+A8 = -0.012
+
+For source coordinate system E1=200000 N1=500000, then
+E2 =707155.557 N2 = 5819663.128.",Coordinate pairs treated as complex numbers. This exploits the correlation between the polynomial coefficients and leads to a smaller number of coefficients than the regular 4th-order polynomial.,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,,0
+9633,Ordnance Survey National Transformation,1,See information source.,See information source.,Geodetic transformation between ETRS89 (or WGS 84) and OSGB36 / National Grid. Uses ETRS89 / National Grid as an intermediate coordinate system for bi-linear interpolation of gridded grid coordinate differences.,http://www.gps.gov.uk/gpssurveying.asp,EPSG,2000-10-19 00:00:00,,0
+9634,Maritime Provinces polynomial interpolation,0,"The transformation makes use of a residual file for each Canadian maritime province. The process of residual interpolation accounts for local variations in the coordinate system and provides a transformation accuracy of +/- 5 cm.
+
+By using a second residual file, the transformation may be reversed. Only one residual file is in use by the method during any given execution.",,This transformation is an executable module within the application NBGeocalc. It is an adaptation of the ESTPM program developed by Geodetic Survey of Canada.,Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,0
+9635,Geographic3D to Geographic2D+GravityRelatedHeight,1,"This is a complex, multi-step transformation, involving the application of a geoid height difference interpolated at a point in a ""geoid model"". The geoid model should be available as a regular grid of latitude and longitude with the height of the geoid above the ellipsoid at each grid node. Only the height is affected by this transformation; the geodetic latitude and longitude are not.
+
+The transformation involves the following sequence of steps:
+� Selection of a subset of the geoid file covering the extent of the points to be transformed.
+� If the geoid file is not based on the source or target CRS, it needs to be transformed first. This involves transformation of the chosen subset of the geoid file from its orignal Geographic 3D CRS to the Geographic 3D CRS that is the source or the target of this transformation.
+� Calculation of the height of the geoid above the ellipsoid (""geoid undulation"") at the relevant point(s). This is achieved through a bi-linear interpolation of the geoid undulation, using the latitude and longitude to locate the point in the sub-grid. This step results in the height of the geoid above the ellipsoid (N) of the Geographic 3D CRS, whether source or target.
+� At each point, the application of the calculated geoid undulation to the height to be transformed.
+
+H=h-N for Geographic3D to Geographic2D+GravityRelatedHeight
+
+h=H+N for Geographic2D+GravityRelatedHeight to Geographic3D
+
+where h = the ellipsoidal height (height above the ellipsoid in a geographic 3D CRS)
+and H = the Gravity-Related Height component of the compound CRS.",,"Transformation from a Geographic 3D CRS to a Compound CRS consisting of a Geographic 2D CRS and a Vertical CRS, or vice versa. The Geographic 3D and the Geographic 2D CRS must be based on the same Geodetic Datum.",,EPSG,2001-06-05 00:00:00,,0
+9636,Molodenski-Badekas transformation,1,"To eliminate high correlation between the translations and rotations in the derivation of parameter values for the Helmert transformation methods (coordinate operation metghod codes 9606 and 9607), instead of the rotations being derived about the geocentric coordinate reference system origin they may be derived at a location within the points used in the determination. Three additional parameters, the coordinates of the rotation point, are then r [...]
+
+ (Xt) ( 1 +Rz -Ry) (Xs - Xp) (Xp) (dX)
+ (Yt) = M * ( -Rz 1 +Rx) * (Ys - Yp) + (Yp) + (dY)
+ (Zt) ( +Ry -Rx 1 ) (Zs - Zp) (Zp) (dZ)
+
+and the parameters are defined as:
+
+(dX, dY, dZ) : Translation vector, to be added to the point's position vector in the source coordinate system in order to transform from source coordinate reference system to target coordinate reference system; also: the coordinates of the origin of source coordinate reference system in the target frame.
+
+(Rx, Ry, Rz) : Rotations to be applied to the coordinate reference frame. The sign convention is such that a positive rotation of the frame about an axis is defined as a clockwise rotation of the coordinate reference frame when viewed from the origin of the Cartesian coordinate system in the positive direction of that axis, that is a positive rotation about the Z-axis only from source coordinate reference system to target coordinate reference system will result in a smaller longitude [...]
+
+(Xp, Yp, Zp) : Coordinates of the point about which the coordinate reference frame is rotated, given in the source Cartesian coordinate reference system.
+
+M : The scale factor to be applied to the position vector in the source coordinate reference system in order to obtain the correct scale of the target coordinate reference system. M = (1+dS*10^-6), where dS is the scale correction expressed in parts per million.
+
+Reversibility.
+The Molodensky-Badekas transformation in a strict mathematical sense is not reversible, i.e. in principle the same parameter values cannot be used to execute the reverse transformation. This is because the evaluation point coordinates are in the forward direction source coordinate reference system and the rotations have been derived about this point. They should not be applied about the point having the same coordinate values in the target coordinate reference system, as is required for [...]
+9801,Lambert Conic Conformal (1SP),1,"To derive the projected Easting and Northing coordinates of a point with geographical coordinates (lat,lon) the formulas for the one standard parallel case are:
+
+E = FE + r sin(theta)
+N = FN + r0 - r cos(theta)
+where
+n = sin lat0
+r = a F t^n k0 for r0, and r
+m = cos(lat)/(1 - e^2 sin^2(lat))^0.5 for m0, lat0, and m2, lat2 where lat1 and lat2 are the latitudes of the standard parallels.
+t = tan(pi/4 - lat/2)/[(1 - e sin(lat))/(1 + e sin(lat))]^(e/2) for t0 and t using lat0 and lat respectively.
+F = m0/(n t1^n)
+theta = n(lon - lon0)
+
+The reverse formulas to derive the latitude and longitude of a point from its Easting and Northing values are:
+
+lat = pi/2 - 2arctan{t'[(1 - esin(lat))/(1 + esin(lat))]^(e/2)}
+lon = theta'/n +lon0
+where
+theta' = arctan[(E - FE)/{r0 -(N - FN)}]
+r' = +/-[(E - FE)^2 + {r0 - (N - FN)}^2]^0.5
+t' = (r'/(a k0 F))^(1/n)
+and n, F, and rF are derived as for the forward calculation.","For Projected Coordinate System JAD69 / Jamaica National Grid
+
+Parameters:
+Ellipsoid: Clarke 1866, a = 6378206.400 m., 1/f = 294.97870
+ then e = 0.08227185 and e^2 = 0.00676866
+
+Latitude Natural Origin 18 deg 00 min 00 sec N = 0.31415927 rad
+Longitude Natural Origin 77 deg 00 min 00 sec W = -1.34390352 rad
+Scale factor at origin 1.000000
+False Eastings FE 250000.00 m
+False Northings FN 150000.00 m
+
+Forward calculation for:
+Latitude: 17 deg 55 min 55.80 sec N = 0.31297535 rad
+Longitude: 76 deg 56 min 37.26 sec W = -1.34292061 rad
+first gives
+m0 = 0.95136402 t0 = 0.72806411
+F = 3.39591092 n = 0.30901699
+r = 19643955.26 r0 = 19636447.86
+theta = 0.00030374 t = 0.728965259
+
+Then Easting E = 255966.58 m
+ Northing N = 142493.51 m
+
+Reverse calculation for the same easting and northing first gives
+
+theta' = 0.000303736
+t' = 0.728965259
+m0 = 0.95136402
+r' = 19643955.26
+
+Then Latitude = 17 deg 55 min 55.800 sec N
+ Longitude = 76 deg 56 min 37.260 sec W",,EPSG guidance note #7.,EPSG,2001-06-05 00:00:00,2001.08,0
+9802,Lambert Conic Conformal (2SP),1,"To derive the projected Easting and Northing coordinates of a point with geographical coordinates (lat,lon) the formulas for the one standard parallel case are:
+
+E = EF + r sin(theta)
+N = NF + rF - r cos(theta)
+where
+m = cos(lat)/(1 - e^2 sin^2(lat))^0.5 for m1, lat1, and m2, lat2 where lat1 and lat2 are the latitudes of the standard parallels.
+t = tan(pi/4 - lat/2)/[(1 - e sin(lat))/(1 + e sin(lat))]^(e/2) for t1, t2, tF and t using lat1, lat2, latF and lat respectively.
+n = (loge(m1) - loge(m2))/(loge(t1) - loge(t2))
+F = m1/(n t1^n)
+r = a F t^n for rF and r, where rF is the radius of the parallel of latitude of the false origin.
+theta = n(lon - lon0)
+
+The reverse formulas to derive the latitude and longitude of a point from its Easting and Northing values are:
+
+lat = pi/2 - 2arctan{t'[(1 - esin(lat))/(1 + esin(lat))]^(e/2)}
+lon = theta'/n +lon0
+where
+r' = +/-[(E - EF)^2 + {rF - (N - NF)}^2]^0.5 , taking the sign of n
+t' = (r'/(aF))^(1/n)
+theta' = arctan [(E- EF)/(rF - (N- NF))]
+and n, F, and rF are derived as for the forward calculation.","For Projected Coordinate System NAD27 / Texas South Central
+
+Parameters:
+Ellipsoid Clarke 1866, a = 6378206.400 metres = 20925832.16 US survey feet
+ 1/f = 294.97870
+then e = 0.08227185 and e^2 = 0.00676866
+
+First Standard Parallel 28o23'00""N = 0.49538262 rad
+Second Standard Parallel 30o17'00""N = 0.52854388 rad
+Latitude False Origin 27o50'00""N = 0.48578331 rad
+Longitude False Origin 99o00'00""W = -1.72787596 rad
+Easting at false origin 2000000.00 US survey feet
+Northing at false origin 0.00 US survey feet
+
+Forward calculation for:
+Latitude 28o30'00.00""N = 0.49741884 rad
+Longitude 96o00'00.00""W = -1.67551608 rad
+
+first gives :
+m1 = 0.88046050 m2 = 0.86428642
+t = 0.59686306 tF = 0.60475101
+t1 = 0.59823957 t2 = 0.57602212
+n = 0.48991263 F = 2.31154807
+r = 37565039.86 rF = 37807441.20
+theta = 0.02565177
+
+Then Easting E = 2963503.91 US survey feet
+ Northing N = 254759.80 US survey feet
+
+Reverse calculation for same easting and northing first gives:
+theta' = 0.025651765 r' = 37565039.86
+t' = 0.59686306
+
+Then Latitude = 28o30'00.000""N
+ Longitude = 96o00'00.000""W",,EPSG guidance note #7.,EPSG,2001-06-05 00:00:00,99.281 2001.08,0
+9803,Lambert Conic Conformal (2SP Belgium),1,"For the Lambert Conic Conformal (2 SP Belgium), the formulas for the regular two standard parallel case (coordinate operation method code 9802) are used except for:
+
+Easting, E = EF + r sin (theta - alpha)
+Northing, N = NF + rF - r cos (theta - alpha)
+
+and for the reverse formulas
+lon = ((theta' + alpha)/n) +lon0
+where alpha = 29.2985 seconds.","For Projected Coordinate System Belge 1972 / Belge Lambert 72
+
+Parameters:
+Ellipsoid International 1924, a = 6378388 metres
+ 1/f = 297
+then e = 0.08199189 and e^2 = 0.006722670
+
+First Standard Parallel 49o50'00""N = 0.86975574 rad
+Second Standard Parallel 51o10'00""N = 0.89302680 rad
+Latitude False Origin 90o00'00""N = 1.57079633 rad
+Longitude False Origin 4o21'24.983""E = 0.07604294 rad
+Easting at false origin EF 150000.01 metres
+Northing at false origin NF 5400088.44 metres
+
+Forward calculation for:
+Latitude 50o40'46.461""N = 0.88452540 rad
+Longitude 5o48'26.533""E = 0.10135773 rad
+
+first gives :
+m1 = 0.64628304 m2 = 0.62834001
+t = 0.59686306 tF = 0.00000000
+t1 = 0.36750382 t2 = 0.35433583
+n = 0.77164219 F = 1.81329763
+r = 37565039.86 rF = 0.00
+alpha = 0.00014204 theta = 0.01953396
+
+Then Easting E = 251763.20 metres
+ Northing N = 153034.13 metres
+
+Reverse calculation for same easting and northing first gives:
+theta' = 0.01939192 r' = 548041.03
+t' = 0.35913403
+Then Latitude = 50o40'46.461""N
+ Longitude = 5o48'26.533""E",In 2000 this modification was replaced through use of the regular Lambert Conic Conformal (2SP) method [9802] with appropriately modified parameter values.,EPSG guidance note #7.,EPSG,1999-04-22 00:00:00,99.281,0
+9804,Mercator (1SP),1,"The formulas to derive projected Easting and Northing coordinates are:
+
+E = FE + a*k0(lon - lon0)
+N = FN + a*k0* ln{tan(pi/4 + lat/2)[(1 - esin(lat))/(1 + esin(lat))]^e/2} where symbols are as listed above and logarithms are natural.
+
+The reverse formulas to derive latitude and longitude from E and N values are:
+
+lat = chi + (esq/2 + 5e^4/24 + e^6/12 + 13e^8/360) sin(2chi)
++ (7e^4/48 + 29e^6/240 + 811e^8/11520) sin(4chi)
++ (7e^6/120 + 81e^8/1120) sin(6chi) + (4279e^8/161280) sin(8chi)
+
+where chi = pi/2 - 2 arctan t
+t = B^((FN-N)/(a*k0))
+B = base of the natural logarithm, 2.7182818...
+and for the 2 SP Case, k0 is calculated as for the forward transformation above.
+lon = ((E - FE)/(a*k0)) + lon0","For Projected Coordinate System Makassar / NEIEZ
+
+Parameters:
+Ellipsoid Bessel 1841 a = 6377397.155 m 1/f = 299.15281
+then e = 0.08169683
+
+Latitude Natural Origin 00o00'00""N = 0.0000000 rad
+Longitude Natural Origin 110o00'00""E = 1.91986218 rad
+Scale factor ko 0.997
+False Eastings FE 3900000.00 m
+False Northings FN 900000.00 m
+
+Forward calculation for:
+Latitude 3o00'00.00""S = -0.05235988 rad
+Longitude 120o00'00.00""E = 2.09439510 rad
+gives
+Easting E = 5009726.58 m
+Northing N = 569150.82 m
+
+Reverse calculation for same easting and northing first gives :
+t = 1.0534121
+chi = -0.0520110
+
+Then Latitude = 3o00'00.000""S
+ Longitude = 120o00'00.000""E",,EPSG guidance note #7.,EPSG,2001-06-05 00:00:00,2001.08,0
+9805,Mercator (2SP),1,"The formulas to derive projected Easting and Northing coordinates are:
+
+For the two standard parallel case, k0 is first calculated from
+
+k0 = cos(latSP1)/(1 - e^2*sin^2(latSP1))^0.5
+
+where latSP1 is the absolute value of the first standard parallel (i.e. positive).
+
+Then, for both one and two standard parallel cases,
+
+E = FE + a*k0(lon - lon0)
+N = FN + a*k0* ln{tan(pi/4 + lat/2)[(1 - esin(lat))(1 + esin(lat))]^e/2} where symbols are as listed above and logarithms are natural.
+
+The reverse formulas to derive latitude and longitude from E and N values are:
+
+lat = chi + (esq/2 + 5e^4/24 + e^6/12 + 13e^8/360) sin(2chi)
++ (7e^4/48 + 29e^6/240 + 811e^8/11520) sin(4chi)
++ (7e^6/120 + 81e^8/1120) sin(6chi) + (4279e^8/161280) sin(8chi)
+
+where chi = pi/2 - 2 arctan t
+t = B^((FN-N)/a*k0)
+B = base of the natural logarithm, 2.7182818...
+and for the 2 SP Case, k0 is calculated as for the forward transformation above.
+lon = ((E - FE)/a*k0) + lon0","For Projected Coordinate System Pulkovo 1942 / Mercator Caspian Sea
+
+Parameters:
+Ellipsoid Krassowski 1940 a = 6378245.00m 1/f = 298.300
+then e = 0.08181333 and e^2 = 0.00669342
+
+Latitude first SP 42o00'00""N = 0.73303829 rad
+Longitude Natural Origin 51o00'00""E = 0.89011792 rad
+False Eastings FE 0.00 m
+False Northings (at equator) FN 0.00 m
+
+then natural origin at latitude of 0oN has scale factor k0= 0.74426089
+
+Forward calculation for:
+Latitude 53o00'00.00""N = 0.9250245 rad
+Longitude 53o00'00.00""E = 0.9250245 rad
+
+gives Easting E = 165704.29 m
+ Northing N = 5171848.07 m
+
+Reverse calculation for same easting and northing first gives :
+t = 0.33639129 chi = 0.92179596
+
+Then Latitude = 53o00'00.000""N
+ Longitude = 53o00'00.000""E",,EPSG guidance note #7.,EPSG,1996-09-18 00:00:00,,0
+9806,Cassini-Soldner,1,"The formulas to derive projected Easting and Northing coordinates are:
+
+Easting E = FE + nu[A - TA^3/6 -(8 - T + 8C)TA^5/120]
+
+Northing N = FN + M - M0 + nu*tan(lat)*[A^2/2 + (5 - T + 6C)A^4/24]
+
+where A = (lon - lon0)cos(lat)
+T = tan^2(lat)
+C = e2 cos2*/(1 - e2) nu = a /(1 - esq*sin^2(lat))^0.5
+and M, the distance along the meridian from equator to latitude lat, is given by
+M = a[1 - e^2/4 - 3e^4/64 - 5e^6/256 -....)*lat - (3e^2/8 + 3e^4/32 + 45e^6/1024 +....)sin(2*lat) + (15e^4/256 + 45e^6/1024 +.....)sin(4*lat) - (35e^6/3072 + ....)sin(6*lat) + .....]
+with lat in radians.
+
+M0 is the value of M calculated for the latitude of the chosen origin. This may not necessarily be chosen as the equator.
+
+To compute latitude and longitude from Easting and Northing the reverse formulas are:
+lat = lat1 - (nu1tan(lat1)/rho1)[D2/2 - (1 + 3*T1)D^4/24]
+lon = lon0 + [D - T1*D^3/3 + (1 + 3*T1)T1*D^5/15]/cos(lat1)
+
+where lat1 is the latitude of the point on the central meridian which has the same Northing as the point whose coordinates are sought, and is found from:
+lat1 = mu1 + (3*e1/2 - 27*e1^3/32 +.....)sin(2*mu1) + (21*e1^2/16 - 55*e1^4/32 + ....)sin(4*mu1)+ (151*e1^3/96 +.....)sin(6*mu1) + (1097*e1^4/512 - ....)sin(8*mu1) + ......
+where
+e1 = [1- (1 - esq)^0.5]/[1 + (1 - esq)^0.5]
+mu1 = M1/[a(1 - esq/4 - 3e^4/64 - 5e^6/256 - ....)]
+M1 = M0 + (N - FN)
+T1 = tan^2(lat1)
+D = (E - FE)/nu1","For Projected Coordinate System Trinidad 1903 / Trinidad Grid
+Parameters:
+Ellipsoid Clarke 1858 a = 20926348 ft = 31706587.88 links
+ b = 20855233 ft
+
+then 1/f = 294.97870 and e^2 = 0.00676866
+
+Latitude Natural Origin 10o26'30""N = 0.182241463 rad
+Longitude Natural Origin 61o20'00""W = -1.07046861 rad
+False Eastings FE 430000.00 links
+False Northings FN 325000.00 links
+
+Forward calculation for:
+Latitude 10o00'00.00"" N = 0.17453293 rad
+Longitude 62o00'00.00""W = -1.08210414 rad
+
+A = -0.01145876 C = 0.00662550
+T = 0.03109120 M = 5496860.24 nu = 31709831.92 M0 = 5739691.12
+
+Then Easting E = 66644.94 links
+ Northing N = 82536.22 links
+
+Reverse calculation for same easting and northing first gives :
+e1 = 0.00170207 D = -0.01145875
+T1 = 0.03109544 M1 = 5497227.34
+nu1 = 31709832.34 mu1 = 0.17367306
+phi1 = 0.17454458 rho1 = 31501122.40
+
+
+Then Latitude = 10o00'00.000""N
+ Longitude = 62o00'00.000""W",,EPSG guidance note #7.,EPSG,1996-09-18 00:00:00,,0
+9807,Transverse Mercator,1,"The formulas to derive the projected Easting and Northing coordinates are in the form of a series as follows:
+
+Easting, E = FE + k0*nu[A + (1 - T + C)A^3/6 + (5 - 18T + T^2 + 72C - 58e'sq)A^5/120]
+
+Northing, N = FN + k0{M - M0 + nu*tan(lat)[A^2/2 + (5 - T + 9C + 4C^2)A^4/24 + (61 - 58T + T^2 + 600C - 330e'sq)A^6/720]}
+where T = tan^2(lat) nu = a /(1 - esq*sin^2(lat))^0.5
+C = esq*cos^2(lat)/(1 - esq)
+A = (lon - lon0)cos(lat), with lon and lon0 in radians.
+M = a[(1 - esq/4 - 3e^4/64 - 5e^6/256 -....)lat - (3esq/8 + 3e^4/32 + 45e^6/1024+....)sin(2*lat) + (15e^4/256 + 45e^6/1024 +.....)sin(4*lat) - (35e^6/3072 + ....)sin(6*lat) + .....]
+with lat in radians and M0 for lat0, the latitude of the origin, derived in the same way.
+
+The reverse formulas to convert Easting and Northing projected coordinates to latitude and longitude are:
+
+lat = lat1 - (nu1*tan(lat1)/rho1)[D^2/2 - (5 + 3*T1 + 10*C1 - 4*C1^2 - 9*e'^2)D^4/24 + (61 + 90*T1 + 298*C1 + 45*T1^2 - 252*e'^2 - 3*C1^2)D^6/720]
+lon = lon0 + [D - (1 + 2*T1 + C1)D^3/6 + (5 - 2*C1 + 28*T1 - 3*C1^2 + 8*e'^2 + 24*T1^2)D^5/120] / cos(lat1)
+where lat1 may be found as for the Cassini projection from:
+
+lat1 = mu1 + ((3*e1)/2 - 27*e1^3/32 +.....)sin(2*lat1) + (21*e1^2/16 -55*e1^4/32 + ....)sin(4*lat1)+ (151*e1^3/96 +.....)sin(6*lat1) + (1097*e1^4/512 - ....)sin(8*lat1) + ......
+and where nu1 = a /(1 - esq*sin^2(lat1))^0.5 rho1 = a(1 - esq)/(1 - esq*sin^2(lat1))^1.5
+e1 = [1- (1 - esq)^0.5]/[1 + (1 - esq)^0.5]
+mu1 = M1/[a(1 - esq/4 - 3e^4/64 - 5e^6/256 - ....)]
+M1 = M0 + (N - FN)/k0
+T1 = tan^2(lat1)
+C1 = e'^2*cos^2(lat1)
+D = (E - FE)/(nu1*k0), with nu1 = nu for lat1
+
+For areas south of the equator the value of latitude lat will be negative and the formulas above, to compute the E and N, will automatically result in the correct values. Note that the false northings of the origin, if the equator, will need to be large to avoid negative northings and for the UTM projection is in fact 10,000,000m. Alternatively, as in the case of Argentina's Transverse Mercator (Gauss-Kruger) zones, the origin is at the south pole with a northings of zero. However each [...]
+different zones having the same eastings, every point in the country, irrespective of its projection zone, will have a unique set of projected system coordinates. Strict application of the above formulas, with south latitudes negative, will result in the derivation of the correct Eastings and Northings.
+
+Similarly, in applying the reverse formulas to determine a latitude south of the equator, a negative sign for lat results from a negative lat1 which in turn results from a negative M1.","For Projected Coordinate System OSGB 1936 / British National Grid
+
+Parameters:
+Ellipsoid Airy 1830 a = 6377563.396 m 1/f = 299.32496
+then e'^2 = 0.00671534 and e^2 = 0.00667054
+
+Latitude Natural Origin 49o00'00""N = 0.85521133 rad
+Longitude Natural Origin 2o00'00""W = -0.03490659 rad
+Scale factor ko 0.9996013 False Eastings FE 400000.00 m
+False Northings FN -100000.00 m
+
+Forward calculation for:
+Latitude 50o30'00.00""N = 0.88139127 rad
+Longitude 00o30'00.00""E = 0.00872665 rad
+A = 0.02775415 C = 0.00271699
+T = 1.47160434 M = 5596050.46
+M0 = 5429228.60 nu = 6390266.03
+
+Then Easting E = 577274.99 m
+ Northing N = 69740.50 m
+
+Reverse calculations for same easting and northing first gives :
+e1 = 0.00167322 mu1 = 0.87939562
+M1 = 5599036.80 nu1 = 6390275.88
+phi1 = 0.88185987 D = 0.02775243
+rho1 =6372980.21 C1 = 0.00271391
+T1 = 1.47441726
+
+Then Latitude = 50o30'00.000""N
+ Longitude = 00o30'00.000""E",,EPSG guidance note #7.,EPSG,1996-09-18 00:00:00,,0
+9808,Transverse Mercator (South Orientated),1,"For the mapping of southern Africa a south oriented Transverse Mercator projection is used. Here the coordinate axes are called Westings and Southings and increment to the West and South from the origin respectively. The standard Transverse Mercator formulas (coordinate operation method code 9807) need to be modified to cope with this arrangement with
+
+Westing, W = FE - k0 nu[A + (1 - T + C)A^3/6 + (5 - 18*T + T^2 + 72*C - 58*e'^2)A^5/120]
+
+Southing, S = FN - k0{M - M0 + nu*tan(lat)*[A^2/2 + (5 - T + 9*C + 4*C^2)A^4/24 + (61 - 58*T + T^2 + 600*C - 330*e'^2)A^6/720]}
+
+In these formulas the terms FE and FN retain their definition, i.e. in the Transverse Mercator (South Orientated) method they increase the Westing and Southing value at the natural origin. In this method they are effectively false westing (FW) and false southing (FS) respectively.
+
+For the reverse formulas, those for the standard Transverse Mercator above apply, with the exception that:
+
+M1 = M0 - (S - FN)/k0
+and D = -(W - FE)/(nu1*k0), with nu1 = nu for lat1",,,EPSG guidance note #7.,EPSG,2002-07-31 00:00:00,2002.51,0
+9809,Oblique Stereographic,1,"Given the geodetic origin of the projection at the tangent point (lat0, lon0), the parameters defining the conformal sphere are:
+
+R= sqrt( rho0 * nu0)
+n= sqrt{1+[(e2*cos^4(lat0))/(1-e2)}
+c= [(n+sin(lat0)) (1-sin(chi0))]/[(n-sin(lat0)) (1+sin(chi0))]
+
+where: sin(chi0) = (w1-1)/(w1+1)
+w1 = (S1.(S2)^e)^n
+S1 = (1+sin(lat0))/(1-sin(lat0))
+S2 = (1-e sin(lat0))/(1+e sin(lat0))
+
+The conformal latitude and longitude (chi0,lambda0) of the origin are then computed from :
+
+chi0 = asin[(w2-1)/(w2+1)]
+
+where S1 and S2 are as above and w2 = c (S1(S2)^e)^n
+
+lambda0 = lon0
+
+For any point with geodetic coordinates (lat, lon) the equivalent conformal latitude and longitude (chi, lambda) are computed from
+lambda = n(lon-lambda0) + lambda0
+chi = asin[(w-1)/(w+1)]
+
+where w = c (Ss (Sb)^e)^n
+Sa = (1+sin(lat))/(1-sin(lat))
+Sb = (1-e.sin(lat))/(1+e.sin(lat))
+
+Then B = [1+sin(chi) sin(chi0) + cos(chi) cos(chi0) cos(lambda-lambda0)]
+
+N = FN + 2 R k0 [sin(chi) cos(chi0) - cos(chi) sin(chi0) cos(lambda-lambda0)] / B
+
+E = FE + 2 R k0 cos(chi) sin(lambda-lambda0) / B
+
+
+The reverse formulae to compute the geodetic coordinates from the grid coordinates involves computing the conformal values, then the isometric latitude and finally the geodetic values.
+
+The parameters of the conformal sphere and conformal latitude and longitude at the origin are computed as above. Then for any point with Stereographic grid coordinates (E,N) :
+
+chi = chi0 + 2 atan[{(N-FN)-(E-FE) tan (j/2)} / (2 R k0)]
+
+lambda = j + 2 i + lambda0
+
+where g = 2 R k0 tan(pi/4 - chi0/2)
+h = 4 R k0 tan(chi0) + g
+i = atan[(E-FE) / {h+(N-FN)}]
+j = atan[(E-FE) / (g-(N-FN)] - i
+
+Geodetic longitude lon = (lambda-lambda0 ) / n + lambda0
+
+Isometric latitude psi = 0.5 ln [(1+ sin(chi)) / { c (1- sin(chi))}] / n
+
+First approximation lat1 = 2 atan(e^psi) - pi/2 where e=base of natural logarithms.
+
+psii = isometric latitude at lati
+
+where psii= ln[{tan(lati/2 + pi/4} {(1-e sin(lati))/(1+e sin(lati))}^(e/2)]
+
+Then iterate lat(i+1) = lati - ( psii - psi ) cos(lati) (1 -e^2 sin^2(lati)) / (1 - e^2)
+
+until the change in lat is sufficiently small.
+
+For Oblique Stereographic projections centred on points in the southern hemisphere, the signs of E, N, lon0, lon, must be reversed to be used in the equations and lat will be negative anyway as a southerly latitude.
+
+An alternative approach is given by Snyder, where, instead of defining a single conformal sphere at the origin point, the conformal latitude at each point on the ellipsoid is computed. The conformal longitude is then always equivalent to the geodetic longitude. This approach is a valid alternative to the above, but gives slightly different results away from the origin point. It is therefore considered by EPSG to be a different coordinate operation method to that described above.","For [...]
+
+Parameters:
+Ellipsoid Bessel 1841 a = 6377397.155 m 1/f = 299.15281
+then e = 0.08169683
+
+Latitude Natural Origin 52o09'22.178""N = 0.910296727 rad
+Longitude Natural Origin 5o23'15.500""E = 0.094032038 rad
+Scale factor k0 0.9999079
+False Eastings FE 155000.00 m
+False Northings FN 463000.00 m
+
+Forward calculation for:
+
+Latitude 53oN = 0.925024504 rad
+Longitude 6oE = 0.104719755 rad
+
+first gives the conformal sphere constants:
+
+rho0 = 6374588.71 nu0 = 6390710.613
+R = 6382644.571 n = 1.000475857 c = 1.007576465
+
+where S1 = 8.509582274 S2 = 0.878790173 w1 = 8.428769183
+sin chi0 = 0.787883237
+
+w = 8.492629457 chi0 = 0.909684757 D0 = d0
+
+for the point chi = 0.924394997 D = 0.104724841
+
+hence B = 1.999870665 N = 557057.739 E = 196105.283
+
+reverse calculation for the same Easting and Northing first gives:
+
+g = 4379954.188 h = 37197327.96 i = 0.001102255 j = 0.008488122
+
+then D = 0.10472467 Longitude = 0.104719584 rad = 6 deg E
+
+chi = 0.924394767 psi = 1.089495123
+phi1 = 0.921804948 psi1 = 1.084170164
+phi2 = 0.925031162 psi2 = 1.089506925
+phi3 = 0.925024504 psi3 = 1.089495505
+phi4 = 0.925024504
+
+Then Latitude = 53o00'00.000""N
+ Longitude = 6o00'00.000""E","This is not the same as the projection method of the same name in USGS Professional Paper no. 1395, ""Map Projections - A Working Manual"" by John P. Snyder.",EPSG guidance note #7.,EPSG,1999-11-15 00:00:00,99.811,0
+9810,Polar Stereographic,1,"For the forward transformation from latitude and longitude,
+
+E = FE + rho sin(lon - lon0)
+N = FN - rho cos(lon - lon0)
+where
+rho = 2 a ko t /{[((1+e)^(1+e)) ((1-e)^(1-e))]^0.5}
+t = tan (pi/4 - lat/2) / [(1-esin(lat) ) / (1 + e sin(lat))]^(e/2)
+
+For the reverse transformation,
+
+lat = chi+ (e^2/2 + 5e^4/24 + e^6/12 + 13e^8/360) sin(2 chi)
++ (7e^4/48 + 29e^6/240 + 811e^8/11520) sin(4 chi)
++ (7e^6/120 + 81e^8/1120) sin(6 chi) + (4279e^8/161280) sin(8 chi)
+
+lon = lon0+ arctan [(E-FE) / (FN-N)]
+
+where chi = pi/2 - 2 arctan t
+t = rho [((1+e)^(1+e)) ((1-e)^(1-e))]^0.5} / 2 a ko
+rho = [(E-FE)^2 + (N - FN)^2]^0.5",,,"US Geological Survey Professional Paper 1395; ""Map Projections - A Working Manual""; J. Snyder",EPSG,1996-09-18 00:00:00,,0
+9811,New Zealand Map Grid,1,b,,,New Zealand Department of Lands technical circular 1973/32,EPSG,1996-09-18 00:00:00,,0
+9812,Hotine Oblique Mercator,1,"The following constants for the projection may be calculated :
+
+B = (1 + esq * cos^4(latc) / (1 - esq ))^0.5
+A = a * B * kc *(1 - esq )^0.5 / ( 1 - esq * sin^2(latc))
+t0 = tan(pi/4 - latc/2) / ((1 - e*sin(latc)) / (1 + e*sin(latc)))^(e/2)
+D = B (1 - esq)^0.5 / (cos(latc) * ( 1 - esq*sin^2(latc))^0.5)
+if D < 1 to avoid problems with computation of F make D^2 = 1
+F = D + (D^2 - 1)^0.5 * SIGN(latc)
+H = F* t0*B
+G = (F - 1/F) / 2
+gamma0 = asin(sin(alphac) / D)
+lon0 = lonc - (asin(G*tan(gamma0))) / B
+
+Then compute the (uc , vc) co-ordinates for the centre point (fc , lc).
+vc =0
+
+In general: uc = (A / B) atan((Dsq - 1)^0.5 / cos (alphac) ) * SIGN(latc)
+but for the special cases where alphac = 90 degrees then
+uc = A*(lonc - lon0)
+
+
+Forward case: To compute (E,N) from a given (lat,lon) :
+
+t = tan(pi/4 - lat/2) / ((1 - e sin (lat)) / (1 + e sin (lat)))^(e/2)
+Q = H / t^B
+S = (Q - 1 / Q) / 2
+T = (Q + 1 / Q) / 2
+V = sin(B (lon - lon0))
+U = (- V cos(gamma0) + S sin(gamma0)) / T
+v = A ln((1 - U) / (1 + U)) / 2 B
+u = A atan((S cos(gamma0) + V sin(gamma0)) / cos(B (lon - lon0 ))) / B
+
+The rectified skew co-ordinates are then derived from:
+E = v cos(gammac) + u sin(gammac) + FE
+N = u cos(gammac) - v sin(gammac) + FN
+
+Reverse case: Compute (lat,lon) from a given (E,N) :
+
+v� = (E - FE) cos(gammac) - (N - FN) sin(gammac)
+u� = (N - FN) cos(gammac) + (E - FE) sin(gammac)
+
+Q� = e- (B v �/ A) where e is the base of natural logarithms.
+S' = (Q� - 1 / Q�) / 2
+T� = (Q� + 1 / Q�) / 2
+V� = sin (B u� / A)
+U� = (V� cos(gammac) + S� sin(gammac)) / T�
+t� = (H / ((1 + U�) / (1 - U�))^0.5)^(1 / B)
+
+chi = pi / 2 - 2 atan(t�)
+
+lat = chi + sin(2chi).( e^2 / 2 + 5*e^4 / 24 + e^6 / 12 + 13*e^8 / 360) + sin(4*chi).( 7*e^4 /48 + 29*e^6 / 240 + 811*e8 / 11520) + sin(6chi).( 7*e^6 / 120 + 81*e8 / 1120) + sin(8chi).(4279 e^8 / 161280)
+
+lon= lon0 - atan ((S� cos(gammac) - V� sin(gammac)) / cos(B*u� / A)) / B","For Projected Coordinate System Timbalai 1948 / R.S.O. Borneo (m)
+
+Parameters:
+Ellipsoid: Everest 1830 (1967 Definition)
+a = 6377298.556 metres 1/f = 300.8017
+then e = 0.081472981and e2 = 0.006637847
+
+Latitude Projection Centre fc = 4o00'00""N = 0.069813170 rad
+Longitude Projection Centre lc = 115o00'00""E = 2.007128640 rad
+Azimuth of central line ac = 53o18'56.9537"" = 0.930536611 rad
+Rectified to skew gc= 53o07'48.3685"" = 0.927295218 rad
+Scale factor ko= 0.99984
+False Eastings FE = 0.00 m
+False Northings FN = 0.00 m
+
+Forward calculation for:
+Latitude lat = 5o23'14.1129""N = 0.094025313 rad
+Longitude lon = 115o48'19.8196""E = 2.021187362 rad
+
+B = 1.003303209 F = 1.072121256
+A =6376278.686 H = 1.000002991
+to = 0.932946976 g0 = 0.927295218
+D = 1.002425787 lon0 = 1.914373469
+D2 =1.004857458
+uc =738096.09 vc =0.00
+
+t =0.910700729 Q =1.098398182
+S =0.093990763 T = 1.004407419
+V =0.106961709 U = 0.010967247
+v =-69702.787 u =901334.257
+
+Then Easting E = 679245.73 m
+ Northing N = 596562.78 m
+
+Reverse calculations for same easting and northing first gives :
+v� = -69702.787 u� =901334.257
+Q� = 1.011028053
+S� = 0.010967907 T� = 1.000060146
+V� = 0.141349378 U� = 0.093578324
+t� = 0.910700729 c = 0.093404829
+
+Then Latitude = 5o23'14.113""N
+ Longitude = 115o48'19.820""E",,EPSG guidance note #7.,EPSG,1999-11-15 00:00:00,97.62 99.811,0
+9813,Laborde Oblique Mercator,1,See information source.,See information source.,Can be accomodated by Oblique Mercator method (code 9815).,"""La nouvelle projection du Service Geographique de Madagascar""; J. Laborde; 1928",EPSG,1996-09-18 00:00:00,97.613,0
+9814,Swiss Oblique Cylindrical,1,See information source.,See information source.,Can be accomodated by Oblique Mercator method (code 9815).,"""Die projecktionen der Schweizerischen Plan und Kartenwerke""; J Bollinger; 1967",EPSG,1996-09-18 00:00:00,97.612,0
+9815,Oblique Mercator,1,"The following constants for the projection may be calculated :
+
+B = (1 + e^2 * cos^4(latc) / (1 - e^2 ))^0.5
+A = a * B * kc *(1 - e^2 )^0.5 / ( 1 - e^2 * sin^2(latc))
+t0 = tan(pi/4 - latc/2) / ((1 - e*sin(latc)) / (1 + e*sin(latc)))^(e/2)
+D = B (1 - e^2)^0.5 / (cos(latc) * ( 1 - e^2*sin^2(latc))^0.5)
+if D < 1 to avoid problems with computation of F make D^2 = 1
+F = D + (D^2 - 1)^0.5 * SIGN(latc)
+H = F* t0*B
+G = (F - 1/F) / 2
+gamma0 = asin(sin(alphac) / D)
+lon0 = lonc - (asin(G*tan(gamma0))) / B
+vc =0
+In general: uc = (A / B) atan((Dsq - 1)^0.5 / cos (alphac) ) * SIGN(latc)
+but for the special cases where alphac = 90 degrees (e.g. Hungary, Switzerland) then
+uc = A*(lonc - lon0)
+
+
+Forward case: To compute (E,N) from a given (lat,lon) :
+
+t = tan(pi/4 - lat/2) / ((1 - e sin (lat)) / (1 + e sin (lat)))^(e/2)
+Q = H / t^B
+S = (Q - 1 / Q) / 2
+T = (Q + 1 / Q) / 2
+V = sin(B (lon - lon0))
+U = (- V cos(gamma0) + S sin(gamma0)) / T
+v = A ln((1 - U) / (1 + U)) / 2 B
+u = (A atan((S cos(gamma0) + V sin(gamma0)) / cos(B (lon - lon0 ))) / B) - (uc . SIGN(lon - lonc))
+
+The rectified skew co-ordinates are then derived from:
+E = v cos(gammac) + u sin(gammac) + Ec
+N = u cos(gammac) - v sin(gammac) + Nc
+
+Reverse case: Compute (lat,lon) from a given (E,N) :
+
+v� = (E - Ec) cos(gammac) - (N - Nc) sin(gammac)
+u� = (N - Nc) cos(gammac) + (E - Ec) sin(gammac) + uc
+
+Q� = e- (B v �/ A) where e is the base of natural logarithms.
+S' = (Q� - 1 / Q�) / 2
+T� = (Q� + 1 / Q�) / 2
+V� = sin (B u� / A)
+U� = (V� cos(gammac) + S� sin(gammac)) / T�
+t� = (H / ((1 + U�) / (1 - U�))^0.5)^(1 / B)
+
+chi = pi / 2 - 2 atan(t�)
+
+lat = chi + sin(2chi).( e^2 / 2 + 5*e^4 / 24 + e^6 / 12 + 13*e^8 / 360) + sin(4*chi).( 7*e^4 /48 + 29*e^6 / 240 + 811*e8 / 11520) + sin(6chi).( 7*e^6 / 120 + 81*e8 / 1120) + sin(8chi).(4279 e^8 / 161280)
+
+lon= lon0 - atan ((S� cos(gammac) - V� sin(gammac)) / cos(B*u� / A)) / B","For Projected Coordinate System Timbalai 1948 / R.S.O. Borneo (m)
+
+Parameters:
+Ellipsoid: Everest 1830 (1967 Definition)
+a = 6377298.556 metres 1/f = 300.8017
+then e = 0.081472981and e2 = 0.006637847
+
+Latitude Projection Centre fc = 4o00'00""N = 0.069813170 rad
+Longitude Projection Centre lc = 115o00'00""E = 2.007128640 rad
+Azimuth of central line ac = 53o18'56.9537"" = 0.930536611 rad
+Rectified to skew gc= 53o07'48.3685"" = 0.927295218 rad
+Scale factor ko= 0.99984
+Easting at projection centre Ec = 590476.87 m
+Northing at projection centre Nc = 442857.65 m
+
+Forward calculation for:
+Latitude lat = 5o23'14.1129""N = 0.094025313 rad
+Longitude lon = 115o48'19.8196""E = 2.021187362 rad
+
+B = 1.003303209 F = 1.072121256
+A =6376278.686 H = 1.000002991
+to = 0.932946976 g0 = 0.927295218
+D = 1.002425787 lon0 = 1.914373469
+D2 =1.004857458
+uc =738096.09 vc =0.00
+
+t =0.910700729 Q =1.098398182
+S =0.093990763 T = 1.004407419
+V =0.106961709 U = 0.010967247
+v =-69702.787 u =163238.163
+
+Then Easting E = 679245.73 m
+ Northing N = 596562.78 m
+
+Reverse calculations for same easting and northing first gives :
+v� = -69702.787 u� =901334.257
+Q� = 1.011028053
+S� = 0.010967907 T� = 1.000060146
+V� = 0.141349378 U� = 0.093578324
+t� = 0.910700729 c = 0.093404829
+
+Then Latitude = 5o23'14.113""N
+ Longitude = 115o48'19.820""E",,EPSG guidance note #7.,EPSG,1999-11-15 00:00:00,99.811,0
+9816,Tunisia Mining Grid,1,"This grid is used as the basis for mineral leasing in Tunsia. Lease areas are approximately 2 x 2 km or 400 hectares. The corners of these blocks are defined through a six figure grid reference where the first three digits are an easting in kilometres and the last three digits are a northing. The latitudes and longitudes for block corners at 2 km intervals are tabulated in a mining decree dated 1st January 1953. From this tabulation in which geographical c [...]
+a) the minimum easting is 94 km, on which the longitude is 5.68989 grads east of Paris.
+b) the maximum easting is 490 km, on which the longitude is 10.51515 grads east of Paris.
+c) each 2 km grid easting interval equals 0.02437 grads.
+d) the minimum northing is 40 km, on which the latitude is 33.39 grads.
+e) the maximum northing is 860 km, on which the latitude is 41.6039 grads.
+f) between 40 km N and 360 km N, each 2 km grid northing interval equals 0.02004 grads.
+g) between 360 km N and 860 km N, each 2 km grid northing interval equals 0.02003 grads.
+
+Formulae are:
+
+Grads from Paris
+
+Lat (grads) = 36.5964 + [(N - 360) * A]
+where N is in kilometres and A = 0.010015 if N > 360, else A = 0.01002.
+
+LonParis (grads) = 7.83445 + [(E - 270) * 0.012185], where E is in kilometres.
+
+The reverse formulae are:
+
+E (km) = 270 + [(LonParis - 7.83445) / 0.012185] where LonParis is in grads.
+
+N (km) = 360 + [(Lat - 36.5964) / B]
+where Lat is in grads and B = 0.010015 if lat>36.5964, else B = 0.01002.
+
+Degrees from Greenwich.
+
+Modern practice in Tunisia is to quote latitude and longitude in degrees with longitudes referenced to the Greenwich meridian. The formulae required in addition to the above are:
+
+Lat (degrees) = (Latg * 0.9) where Latg is in grads.
+LonGreenwich (degrees) = [(LonParis + 2.5969213) * 0.9] where LonParis is in grads.
+
+
+Lat (grads) = (Latd / 0.9) where Latd is in decimal degrees.
+LonParis (grads) = [(LonGreenwich / 0.9) - 2.5969213)] where LonGreenwich is in decimal degrees.","For grid location 302598,
+Latitude = 36.5964 + [(598 - 360) * A]. As N > 360, A = 0.010015.
+Latitude = 38.97997 grads = 35.08197 degrees.
+
+Longitude = 7.83445 + [(E - 270) * 0.012185, where E = 302.
+Longitude = 8.22437 grads east of Paris = 9.73916 degrees east of Greenwich.",,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,99.811 2000.08,0
+9817,Lambert Conic Near-Conformal,1,"To compute the Lambert Conic Near-Conformal the following formulae are used;
+
+E = FE + r sin(theta)
+N = FN + M + r sin(theta) tan(theta/2) using the natural origin rather than the false origin.
+
+Compute constants for the ellipse:
+
+n = (a-b)/(a+b)
+A� = a [ 1- n + 5 (n^2 - n^3 ) / 4 + 81 ( n^4 - n^5 ) / 64]*pi /180
+B� = 3 a [ n - n^2 + 7 ( n^3 - n^4 ) / 8 + 55 n^5 / 64] / 2
+C� = 15 a [ n^2 -n^3 + 3 ( n^4 - n^5 ) / 4 ] / 16
+D� = 35 a [ n^3 - n^4 + 11 n^5 / 16 ] / 48
+E� = 315 a [ n^4 - n^5 ] / 512
+
+Then compute the meridional arc from the equator to the parallel.
+s0 = A� lat0 - B� sin(2 lat0) + C� sin(4 lat0) - D� sin(6 lat0) + E� sin(8 lat0) where lat0 in the first term is in degrees
+s0 = A� lat - B� sin(2 lat) + C� sin(4 lat) - D� sin(6 lat) + E� sin(8 lat) where lat0 in the first term is in degrees
+m = s - s0
+A = 1 / (6 rho0 nu0)
+M = ko ( m + A m^3. This is the term that is truncated to the third order.
+Ms = M per second of arc = M / ((lat - lat0) * 3600)
+
+theta = (lon - lon0) sin(lat0)
+ro = ko nu0 / tan(lat0)
+r = ro - M
+
+The reverse formulas for lat and lon from E and N with r0 and Ms as above:
+
+lat = M�/ (Ms * 3600) + lat0 where lat0 and lat are in degrees
+lon = lon0 + theta� / sin(lat0) where lont0 and lon are in radians
+
+where
+E� = E - FE N� = N - FN
+theta� = arctan [E� / (r0 - N�)]
+r� = E� / sin(theta�)
+M� = r0 - r'","For Projected Coordinate System: Deir ez Zor / Levant Zone
+
+Parameters:
+Ellipsoid Clarke 1880 (IGN) a = 6378249.2 m 1/f = 293.46602
+then b = 6356515.000 n = 0.001706682563
+
+Latitude Natural Origin = 34o 39'00"" N = 0.604756586 rad
+Longitude Natural Origin = 37o 21'00"" E= 0.651880476 rad
+Scale factor at origin ko = 0.99962560
+False Eastings FE = 300000.00 m
+False Northings FN = 300000.00 m
+
+Forward calculation for:
+Latitude of 37d 31' 17.625"" N = 0.654874806 rad
+Longitude of 34d 08' 11.291"" E = 0.595793792 rad
+first gives
+A = 4.1067494 * 10e-15 A�=111131.8633
+B�= 16300.64407 C�= 17.38751 D�= 0.02308 E�= 0.000033
+so = 3835482.233 s = 4154101.458 m = 318619.225
+M = 318632.72 Ms = 30.82262319
+q = -0.03188875 ro = 9235264.405 r = 8916631.685
+
+Then Easting E = 15707.96 m (c.f. E = 15708.00 using full formulae)
+ Northing N = 623165.96 m (c.f. N = 623167.20 using full formulae)
+
+Reverse calculation for the same easting and northing first gives
+
+q' = -0.03188875
+r� = 8916631.685
+M�= 318632.72
+
+Latitude = 0.654874806 rad = 37d 31' 17.625"" N
+Longitude = 0.595793792 rad = 34d 08' 11.291"" E",The Lambert Near-Conformal projection is derived from the Lambert Conformal Conic projection by truncating the series expansion of the projection formulae.,EPSG guidance note #7.,EPSG,1999-11-15 00:00:00,99.811,0
+9818,American Polyconic,1,See information source.,,See information source for formula and example.,"US Geological Survey Professional Paper 1395; ""Map Projections - A Working Manual""; J. Snyder",EPSG,1999-10-20 00:00:00,99.55,0
+9819,Krovak Oblique Conic Conformal,1,"From the defining parameters the following constants for the projection may be calculated :
+
+B=((1 + e^2 cos^4(latC)) / (1 - e^2 ))^0.5
+A=a (1 - e^2 )^0.5 / ( 1 - e^2 sin^2 (latC))
+gamma0=asin(sin (latC) / B)
+t0 =tan(pi / 4 + gamma0 / 2) . ((1 + e sin(latC)) / (1 - e sin (latC)))^(e.B/2) / tan(pi / 4 + latC/ 2)^B
+n = sin lat1
+r0=kc A / tan (lat1)
+
+To derive the projected Southing and Westing coordinates of a point with geographical coordinates (lat, lon) the formulas for the oblique conic conformal are:
+
+Southing: X = Ec + r cos theta
+Westing: Y = Nc + r sin theta
+
+where
+
+U=2 (atan ( k tan^B (lat/2 + pi / 4 ) ((1 + e sin (lat)) / (1 - e sin (lat)))^(e.B/2 )) - pi / 4)
+V=B (lonc - lon)
+S=asin ( cos (alphaC) sin ( U ) + sin (alphaC) cos (U) cos (V) )
+D=asin ( cos ( U ) sin ( V ) / cos ( S ) )
+theta=n D
+r=r0 tan(pi / 4 + gamma0/ 2) / tan^n ( S/2 + pi / 4 )
+
+The reverse formulas to derive the latitude and longitude of a point from its Southing and Westing values are:
+
+latj = 2*(atan(k^(-1/B) tan^(1/B) ( U�/2 + pi / 4 ) ((1 + e sin ( lat j-1) / (1 - e sin ( latj-1))^(e/2) ) - pi / 4)
+where j = 1,2 and the latitude is found by iteration.
+lon = lonc - V' / B
+where
+r' =[(X - Ec)^2 + (Y - Nc)^2]^(1/2)
+theta'=arctan [(X- Ec)/(Y- Nc)]
+D'=theta' / sin ( lat1)
+S'=2*(atan((r0 / r )^(1/n) tan(pi / 4 + lat0/ 2)) - pi / 4)
+U'=asin ( cos (alphaC) sin ( S' ) - sin (alphaC) cos (S') cos (D') )
+V'=asin ( cos (S') sin (D') / cos (U'))","For Projected Coordinate Reference System: S-JTSK (Ferro) / Krovak
+
+N.B. Krovak projection uses Ferro as the prime meridian. This has a longitude with reference to Greenwich of 17 deg 40 min West. To apply the formulae the defining longitudes must be corrected to the Greenwich meridian.
+
+Parameters:
+Ellipsoid Bessel 1841 a = 6377397.155m 1/f = 299.15281
+ then e = 0.081696831 e2 = 0.006674372
+
+Latitude of projection centre = 49o 30'00"" N = 0.604756586 rad
+Longitude of Origin = 42o 30'00"" East of Ferro
+Longitude of Ferro is 17o 40'00"" West of Greenwich
+Longitude of Origin = 24o 50'00"" East of Greenwich = 0.433423431 rad
+Latitude of pseudo standard parallel = 78o 30'00"" N
+Azimuth of centre line = 30o 17' 17.303""
+Scale factor on pseudo Standard Parallel (ko) = 0.99990
+Easting at projection centre (Ec) = 0.00 m
+Northing at projection centre = 0.00 m
+
+Projection constants:
+B=1.000597498
+A=6380703.61
+*gamma0=0.863239103
+t0=1.003419164
+n= 0.979924705
+r0=1298039.005
+
+Forward calculation for:
+Latitude = 50o 12' 32.4416"" N = 0.876312566 rad
+Longitude = 16o 50' 59.1790"" E = 0.294083999 rad
+
+Gives
+
+U=0.875596949
+V=0.139422687
+S=1.386275049
+D=0.506554623
+theta=0.496385389
+r0=1194731.014
+
+Then Southing X = 1050538.643 m
+ Westing Y = 568990.997 m
+
+Reverse calculation for the same Southing and Westing gives
+
+r' =1194731.014
+theta' =0.496385389
+D'=0.506554623
+S'=1.386275049
+U'=0.875596949
+V'=0.139422687
+lat(iteration 1)=0.876310601
+lat(iteration 2)=0.876312560
+lat(iteration3)=0.876312566
+
+Latitude = 0.876312566 rad = 50o 12' 32.4416"" N
+Longitude = 0.595793792 rad = 16o 50' 59.1790"" E",,Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2000-03-07 00:00:00,,0
+9820,Lambert Azimuthal Equal Area,1,See information source or EPSG Guidance Note 7.,See information source.,This is the ellipsoidal form of the projection.,"USGS Professional Paper 1395, ""Map Projections - A Working Manual"" by John P. Snyder.",EPSG,2001-06-05 00:00:00,,0
+9821,Lambert Azimuthal Equal Area (Spherical),1,See information source.,See information source.,This is the spherical form of the projection. See coordinate operation method Lambert Azimuthal Equal Area (code 9820) for ellipsoidal form. Differences of several tens of metres result from comparison of the two methods.,"USGS Professional Paper 1395, ""Map Projections - A Working Manual"" by John P. Snyder.",EPSG,2001-06-05 00:00:00,,0
+9822,Albers Equal Area,1,See information source or EPSG Guidance Note 7.,See Information Source.,,"USGS Professional Paper 1395, ""Map Projections - A Working Manual"" by John P. Snyder.",EPSG,2001-06-05 00:00:00,,0
+9823,Equidistant Cylindrical,1,"This method has one of the simplest formulas available. If the latitude of natural origin (*O) is at the equator the method is also known as Plate Carr�e. It is not used for rigorous topographic mapping because its distortion characteristics are unsuitable. Formulas are included to distinguish this map projection method from an approach sometimes mistakenly called by the same name and used for simple computer display of geographic coordinates � see Pseudo [...]
+
+For the forward calculation:
+
+X = R . (lon - lonO) . cos(latO)
+Y = R . lat
+
+where R = [a^2 * (1 � e^2)]^0.5
+and lat and lon are expressed in radians.
+
+For the reverse calculation:
+
+lat = Y / R
+lon = lonO + (X / R cos(latO))
+
+where R is as for the forward method.",See information source.,"If the latitude of natural origin is at the equator, also known as Plate Carr�e. See also Pseudo Plate Carree, method code 9825.","US Geological Survey Professional Paper 1395; ""Map Projections - A Working Manual""; J. Snyder.",EPSG,2001-11-06 00:00:00,,0
+9824,Transverse Mercator Zoned Grid System,1,"The standard Transverse Mercator formulas (coordinate operation method 9807) are modified as follows:
+
+Zone number, Z, = int((Long + LongI + W) / W) with Long, LongI and W in degrees.
+where (LongI) is the Initial Longitude of the zoned grid system
+and W is the width of each zone of the zoned grid system.
+If Long < 0, Long = (Long + 360) degrees.
+
+Then,
+ Long0 = [Z * W] � [LongI + (W/2)]
+
+For the forward calculation,
+ Easting, E = Z*10^6 + FE + k0.nu[A + (1 - T + C)A^3/6 + (5 - 18T + T^2 + 72C - 58e'^2)A^5/120]
+
+and in the reverse calculation for longitude,
+ D = (E � [FE + Z*10^6])/(nu1.k0)",,If locations fall outwith the fixed zones the general Transverse Mercator method (code 9807) must be used for each zone.,EPSG Guidance Note #7.,EPSG,2001-06-05 00:00:00,,0
+9825,Pseudo Plate Carree,1,"X = Lon
+Y = Lat
+
+Lat = Y
+Lon = X",,"Used only for depiction of graticule (latitude/longitude) coordinates on a computer display. The axes units are decimal degrees and of variable scale. The origin is at Lat = 0, Long = 0. See Equidistant Cylindrical, code 9823, for proper Plate Carr�e.",EPSG,EPSG,2001-11-06 00:00:00,,0
+9826,Lambert Conic Conformal (West Orientated),1,"In older mapping of Denmark and Greenland the Lambert Conic Conformal is used with axes positive north and west. To derive the projected Westing and Northing coordinates of a point with geographical coordinates (Lat, Lon) the formulas are as for the standard Lambert Conic Conformal (1SP) case (coordinate operation method code 9801) except for:
+
+W = FE � r.sin(theta)
+
+In this formula the term FE retains its definition, i.e. in the Lambert Conic Conformal (West Orientated) method it increases the Westing value at the natural origin. In this method it is effectively false westing (FW).
+
+The reverse formulas to derive the latitude and longitude of a point from its Westing and Northing values are as for the standard Lambert Conic Conformal (1SP) case except for:
+
+theta' = arctan[(FE � W)/{r0 � (N � FN)}]
+r' = +/-[(FE � W)^2 + {r0 � (N � FN)}^2]^0.5",,,EPSG guidance note #7.,EPSG,2002-01-16 00:00:00,,0
+9827,Bonne,1,See information source or EPSG Guidance Note 7.,See information source.,,"US Geological Survey Professional Paper 1395, ""Map Projections - A Working Manual"" by John P Snyder.",EPSG,2002-07-13 00:00:00,,0
+9828,Bonne (South Orientated),1,See EPSG Guidance Note 7.,,,EPSG Guidance Note number 7.,EPSG,2002-07-13 00:00:00,,0
diff --git a/src/tiff/csv/coordinate_operation_parameter.csv b/src/tiff/csv/coordinate_operation_parameter.csv
new file mode 100644
index 0000000..480aa35
--- /dev/null
+++ b/src/tiff/csv/coordinate_operation_parameter.csv
@@ -0,0 +1,99 @@
+"PARAMETER_CODE","PARAMETER_NAME","DESCRIPTION","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+8601,Latitude offset,The difference between the latitude values of a point in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8602,Longitude offset,The difference between the longitude values of a point in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8603,Vertical Offset,The difference between the height or depth values of a point in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8604,Geoid undulation,"The height of the geoid above a specified ellipsoid. Indicated by symbol N. Usually interpolated within a geoid model.
+N = h - H, where h is the height above the ellipsoid and H is the gravity-related height.",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8605,X-axis translation,The difference between the X values of a point in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8606,Y-axis translation,The difference between the Y values of a point in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8607,Z-axis translation,The difference between the Z values of a point in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8608,X-axis rotation,"The angular difference between the Y and Z axes directions of target and source coordinate reference systems. This is a rotation about the X axis as viewed from the origin looking along that axis. The particular method defines which direction is positive, and what is being rotated (point or axis).",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8609,Y-axis rotation,"The angular difference between the X and Z axes directions of target and source coordinate reference systems. This is a rotation about theY axis as viewed from the origin looking along that axis. The particular method defines which direction is positive, and what is being rotated (point or axis).",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8610,Z-axis rotation,"The angular difference between the X and Y axes directions of target and source coordinate reference systems. This is a rotation about the Z axis as viewed from the origin looking along that axis. The particular method defines which direction is positive, and what is being rotated (point or axis).",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8611,Scale difference,"The scale difference increased by unity equals the ratio of an the length of an arbitrary distance between two points in target and source coordinate reference systems. This is usually averaged for the intersection area of the two coordinate reference systems.
+
+If a distance of 100 km in the source coordinate reference system translates into a distance of 100.001 km in the target coordinate reference system, the scale difference is 1 ppm (the ratio being 1.000001).",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8612,Scale factor for source coordinate reference system first axis,"The unit of measure of the source coordinate reference system first axis, expressed in the unit of measure of the target coordinate reference system.",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8613,Scale factor for source coordinate reference system second axis,"The unit of measure of the source coordinate reference system second axis, expressed in the unit of measure of the target coordinate reference system",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8614,Rotation angle of source coordinate reference system axes,"Angle (counter-clockwise positive) through which both of the source coordinate reference system axes need to rotated to coincide with the corresponding target coordinate reference system axes.
+
+Alternatively, the bearing (clockwise positive) of the source coordinate reference system YS-axis measured relative to target coordinate reference system north.",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8615,Rotation angle of source coordinate reference system first axis,Angle (counter-clockwise positive) through which the source coordinate reference system's first axis needs to rotated to coincide with the corresponding axis of the target coordinate reference system.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8616,Rotation angle of source coordinate reference system second axis,Angle (counter-clockwise positive) through which the source coordinate reference system's second axis needs to rotated to coincide with the corresponding axis of the target coordinate reference system.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8617,Ordinate 1 of evaluation point,The value of the first ordinate value of the evaluation point.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8618,Ordinate 2 of evaluation point,The value of the second ordinate of the evaluation point.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8619,Ordinate 1 of evaluation point in source CRS,The value of the first ordinate of the evaluation point expressed in the source coordinate reference system.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8620,Ordinate 2 of evaluation point in source CRS,The value of the second ordinate of the evaluation point expressed in the source coordinate reference system.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8621,Ordinate 1 of evaluation point in target CRS,The value of the first ordinate of the evaluation point expressed in the target coordinate reference system. In the case of an affine transformation the evaluation point is the origin of the source coordinate reference system.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8622,Ordinate 2 of evaluation point in target CRS,The value of the second ordinate of the evaluation point expressed in the target coordinate reference system. In the case of an affine transformation the evaluation point is the origin of the source coordinate reference system.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8623,A0,Coefficient used in affine (general parametric) and polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8624,A1,Coefficient used in affine (general parametric) and polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8625,A2,Coefficient used in affine (general parametric) and polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8626,A3,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8627,A4,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8628,A5,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8629,A6,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8630,A7,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8631,A8,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8632,A9,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8633,A10,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8634,A11,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8635,A12,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8636,A13,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8637,A14,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8638,B00,Coefficient used only in the Madrid to ED50 polynomial transformation method.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8639,B0,Coefficient used in affine (general parametric) and polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8640,B1,Coefficient used in affine (general parametric) and polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8641,B2,Coefficient used in affine (general parametric) and polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8642,B3,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8643,B4,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8644,B5,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8645,B6,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8646,B7,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8647,B8,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8648,B9,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8649,B10,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8650,B11,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8651,B12,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8652,B13,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8653,B14,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8654,Semi-major axis length difference,The difference between the semi-major axis values of the ellipsoids used in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8655,Flattening difference,"The difference between the flattening values of the ellipsoids used in the target and source coordinate reference systems.
+
+flattening = 1 / (inverse_flattening).",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8656,Latitude and longitude difference file,The name of the [path and] file containing latitude and longitude differences.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8657,Latitude difference file,The name of the [path and] file containing latitude differences.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8658,Longitude difference file,The name of the [path and] file containing longitude differences.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8659,Geod. tfm. code for northern boundary,The EPSG code for the geodetic transformation applied at the northern boundary of the interpolation area. Applies to Norwegian offshore interpolation method.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8660,Geod. tfm. code for southern boundary,The EPSG code for the geodetic transformation applied at the southern boundary of the interpolation area. Applies to Norwegian offshore interpolation method.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8661,Geod. tfm. name for northern boundary,The EPSG name for the geodetic transformation applied at the northern boundary of the interpolation area. Applies to Norwegian offshore interpolation method.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8662,Geod. tfm. name for southern boundary,The EPSG name for the geodetic transformation applied at the southern boundary of the interpolation area. Applies to Norwegian offshore interpolation method.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8663,Point scale factor,The point scale factor in a selected point of the target coordinate reference system. to be used as representative figure of the scale of the target coordinate reference system in a the area to which a coordinate transformation is defined.,EPSG guidance note number 7 (June 2000 Revision),EPSG,2000-06-29 00:00:00,,0
+8664,Easting and northing difference file,The name of the [path and] file containing easting and northing differences.,Ordnance Survey of Great Britain,EPSG,2000-10-19 00:00:00,,0
+8665,Maritime Province residual file,Coordinate differences at control points,Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,0
+8666,Geoid model file,The name of the [path and] file containing geoid heights.,EPSG,EPSG,2001-06-05 00:00:00,,0
+8667,Ordinate 3 of evaluation point,The value of the third ordinate of the evaluation point.,EPSG guidance note number 7.,EPSG,2001-11-06 00:00:00,,0
+8801,Latitude of natural origin,"The latitude of the point from which the values of both the geographical coordinates on the ellipsoid and the grid coordinates on the projection are deemed to increment or decrement for computational purposes. Alternatively it may be considered as the latitude of the point which in the absence of application of false coordinates has grid coordinates of (0,0).",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8802,Longitude of natural origin,"The longitude of the point from which the values of both the geographical coordinates on the ellipsoid and the grid coordinates on the projection are deemed to increment or decrement for computational purposes. Alternatively it may be considered as the longitude of the point which in the absence of application of false coordinates has grid coordinates of (0,0). Sometimes known as ""central meridian (CM)"".",EPSG guidance note number 7.,EPSG,2002-06-22 0 [...]
+8805,Scale factor at natural origin,"The factor by which the map grid is reduced or enlarged during the projection process, defined by its value at the natural origin.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8806,False easting,"Since the natural origin may be at or near the centre of the projection and under normal coordinate circumstances would thus give rise to negative coordinates over parts of the mapped area, this origin is usually given false coordinates which are large enough to avoid this inconvenience. The False Easting, FE, is the value assigned to the abscissa (east or west) axis of the projection grid at the natural origin.",EPSG guidance note number 7.,EPSG,2002-07-31 00:00:00,2 [...]
+8807,False northing,"Since the natural origin may be at or near the centre of the projection and under normal coordinate circumstances would thus give rise to negative coordinates over parts of the mapped area, this origin is usually given false coordinates which are large enough to avoid this inconvenience. The False Northing, FN, is the value assigned to the ordinate (north or south) axis of the projection grid at the natural origin.",EPSG guidance note number 7.,EPSG,2002-07-31 00:00: [...]
+8811,Latitude of projection centre,"For an oblique projection, this is the latitude of the point at which the azimuth of the central line is defined.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8812,Longitude of projection centre,"For an oblique projection, this is the longitude of the point at which the azimuth of the central line is defined.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8813,Azimuth of initial line,"The azimuthal direction (north zero, east of north being positive) of the great circle which is the centre line of an oblique projection. The azimuth is given at the projection center.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8814,Angle from Rectified to Skew Grid,The angle at the natural origin of an oblique projection through which the natural coordinate reference system is rotated to make the projection north axis parallel with true north.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8815,Scale factor on initial line,"The factor by which the map grid is reduced or enlarged during the projection process, defined by its value at the projection center.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8816,Easting at projection centre,The easting value assigned to the projection centre.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8817,Northing at projection centre,The northing value assigned to the projection centre.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8818,Latitude of pseudo standard parallel,"Latitude of the parallel on which the conic or cylindrical projection is based. This latitude is not geographic, but is defined on the conformal sphere AFTER its rotation to obtain the oblique aspect of the projection",EPSG guidance note number 7,EPSG,2000-03-07 00:00:00,,0
+8819,Scale factor on pseudo standard parallel,"The factor by which the map grid is reduced or enlarged during the projection process, defined by its value at the pseudo-standard parallel.",EPSG guidance note number 7.,EPSG,2000-03-07 00:00:00,,0
+8821,Latitude of false origin,The latitude of the point which is not the natural origin and at which grid coordinate values false easting and false northing are defined.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8822,Longitude of false origin,The longitude of the point which is not the natural origin and at which grid coordinate values false easting and false northing are defined.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8823,Latitude of 1st standard parallel,"For a conic projection with two standard parallels, this is the latitude of intersection of the cone with the ellipsoid that is nearest the pole. Scale is true along this parallel.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8824,Latitude of 2nd standard parallel,"For a conic projection with two standard parallels, this is the latitude of intersection of the cone with the ellipsoid that is furthest from the pole. Scale is true along this parallel.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8826,Easting at false origin,The easting value assigned to the false origin.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8827,Northing at false origin,The northing value assigned to the false origin.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8828,Spherical latitude of origin,The latitude of the point from which the values of both the geographical coordinates on the sphere and the grid coordinates on a spherical projection are deemed to increment or decrement for computational purposes.,EPSG guidance note number 7.,EPSG,2001-06-05 00:00:00,,0
+8829,Spherical longitude of origin,The longitude of the point from which the values of both the geographical coordinates on the sphere and the grid coordinates on a spherical projection are deemed to increment or decrement for computational purposes.,EPSG guidance note number 7.,EPSG,2001-06-05 00:00:00,,0
+8830,Initial longitude,The longitude of the western limit of the first zone of a Transverse Mercator zoned grid system.,EPSG,EPSG,2001-06-05 00:00:00,,0
+8831,Zone width,The longitude width of a zone of a Transverse Mercator zoned grid system.,EPSG,EPSG,2001-06-05 00:00:00,,0
diff --git a/src/tiff/csv/coordinate_operation_parameter_value.csv b/src/tiff/csv/coordinate_operation_parameter_value.csv
new file mode 100644
index 0000000..dc26765
--- /dev/null
+++ b/src/tiff/csv/coordinate_operation_parameter_value.csv
@@ -0,0 +1,8406 @@
+"COORD_OP_CODE","COORD_OP_METHOD_CODE","PARAMETER_CODE","PARAMETER_VALUE","PARAM_VALUE_FILE_REF","UOM_CODE"
+1025,9630,8617,55.0,,9102
+1025,9630,8618,0.0,,9102
+1025,9630,8623,-0.00000556098,,9203
+1025,9630,8624,-0.00000155391,,9203
+1025,9630,8625,-0.00000040262,,9203
+1025,9630,8626,-0.000000509693,,9203
+1025,9630,8627,-0.000000819775,,9203
+1025,9630,8628,-0.000000247592,,9203
+1025,9630,8629,0.000000136682,,9203
+1025,9630,8630,0.000000186198,,9203
+1025,9630,8631,0.00000012335,,9203
+1025,9630,8632,0.0000000568797,,9203
+1025,9630,8633,-0.00000000232217,,9203
+1025,9630,8634,-0.00000000769931,,9203
+1025,9630,8635,-0.00000000786953,,9203
+1025,9630,8636,-0.00000000612216,,9203
+1025,9630,8637,-0.00000000401382,,9203
+1025,9630,8639,0.0000148944,,9203
+1025,9630,8640,0.00000268191,,9203
+1025,9630,8641,0.0000024529,,9203
+1025,9630,8642,0.0000002944,,9203
+1025,9630,8643,0.0000015226,,9203
+1025,9630,8644,0.000000910592,,9203
+1025,9630,8645,-0.000000382241,,9203
+1025,9630,8646,-0.000000851732,,9203
+1025,9630,8647,-0.000000566713,,9203
+1025,9630,8648,-0.000000185188,,9203
+1025,9630,8649,0.0000000284312,,9203
+1025,9630,8650,0.0000000684853,,9203
+1025,9630,8651,0.0000000500828,,9203
+1025,9630,8652,0.0000000415937,,9203
+1025,9630,8653,0.00000000762236,,9203
+1026,9617,8623,8.4386918,,9203
+1026,9617,8624,-0.0972,,9203
+1026,9617,8625,-0.03672,,9203
+1026,9617,8626,0.0000406,,9203
+1026,9617,8638,-13276.58,,9203
+1026,9617,8639,2.6620443,,9203
+1026,9617,8640,0.07992,,9203
+1026,9617,8641,-0.0036,,9203
+1026,9617,8642,-0.0000109,,9203
+1027,9617,8623,11.328779,,9203
+1027,9617,8624,-0.1674,,9203
+1027,9617,8625,-0.03852,,9203
+1027,9617,8626,0.0000379,,9203
+1027,9617,8638,-13276.58,,9203
+1027,9617,8639,2.5079425,,9203
+1027,9617,8640,0.08352,,9203
+1027,9617,8641,-0.00864,,9203
+1027,9617,8642,-0.0000038,,9203
+1028,9617,8623,6.2280987,,9203
+1028,9617,8624,-0.03924,,9203
+1028,9617,8625,-0.03276,,9203
+1028,9617,8626,0.0000284,,9203
+1028,9617,8638,-13276.58,,9104
+1028,9617,8639,2.9368989,,9203
+1028,9617,8640,0.07272,,9203
+1028,9617,8641,0.00216,,9203
+1028,9617,8642,-0.0000179,,9203
+1029,9632,8619,155000.0,,9001
+1029,9632,8620,463000.0,,9001
+1029,9632,8621,663395.607,,9001
+1029,9632,8622,5781194.38,,9001
+1029,9632,8624,-51.681,,9203
+1029,9632,8625,3290.525,,9203
+1029,9632,8626,20.172,,9203
+1029,9632,8627,1.133,,9203
+1029,9632,8628,2.075,,9203
+1029,9632,8629,0.251,,9203
+1029,9632,8630,0.075,,9203
+1029,9632,8631,-0.012,,9203
+1030,9632,8619,663395.607,,9001
+1030,9632,8620,5781194.38,,9001
+1030,9632,8621,155000.0,,9001
+1030,9632,8622,463000.0,,9001
+1030,9632,8624,56.619,,9203
+1030,9632,8625,3290.362,,9203
+1030,9632,8626,20.184,,9203
+1030,9632,8627,-0.861,,9203
+1030,9632,8628,2.082,,9203
+1030,9632,8629,-0.023,,9203
+1030,9632,8630,0.07,,9203
+1030,9632,8631,-0.025,,9203
+1031,9632,8619,155000.0,,9001
+1031,9632,8620,463000.0,,9001
+1031,9632,8621,663395.563,,9001
+1031,9632,8622,5781194.442,,9001
+1031,9632,8624,-51.718,,9203
+1031,9632,8625,3290.521,,9203
+1031,9632,8626,20.154,,9203
+1031,9632,8627,1.152,,9203
+1031,9632,8628,2.061,,9203
+1031,9632,8629,0.238,,9203
+1031,9632,8630,0.058,,9203
+1031,9632,8631,-0.013,,9203
+1032,9632,8619,663395.563,,9001
+1032,9632,8620,5781194.442,,9001
+1032,9632,8621,155000.0,,9001
+1032,9632,8622,463000.0,,9001
+1032,9632,8624,99943.4175,,9203
+1032,9632,8625,-3290.3612,,9203
+1032,9632,8626,-20.1673,,9203
+1032,9632,8627,0.8387,,9203
+1032,9632,8628,-2.0651,,9203
+1032,9632,8629,0.0334,,9203
+1032,9632,8630,-0.0523,,9203
+1032,9632,8631,0.23,,9203
+1033,9631,8619,0.0,,9001
+1033,9631,8620,0.0,,9001
+1033,9631,8621,449681.702,,9001
+1033,9631,8622,5460505.326,,9001
+1033,9631,8624,-71.3747,,9203
+1033,9631,8625,1858.8407,,9203
+1033,9631,8626,-5.4504,,9203
+1033,9631,8627,-16.9681,,9203
+1033,9631,8628,4.0783,,9203
+1033,9631,8629,0.2193,,9203
+1034,9631,8619,500000.0,,9001
+1034,9631,8620,5500000.0,,9001
+1034,9631,8621,448933.793,,9001
+1034,9631,8622,5461423.984,,9001
+1034,9631,8624,28.7827,,9203
+1034,9631,8625,-1843.8236,,9203
+1034,9631,8626,0.0864,,9203
+1034,9631,8627,11.9065,,9203
+1034,9631,8628,-4.0793,,9203
+1034,9631,8629,0.0809,,9203
+1035,9621,8611,0.0,,9202
+1035,9621,8614,271.053,,9110
+1035,9621,8621,2610200.48,,9001
+1035,9621,8622,4905282.73,,9001
+1036,9633,8664,,ostn97.txt,
+1037,9632,8619,155000.0,,9001
+1037,9632,8620,463000.0,,9001
+1037,9632,8621,526577.124,,9001
+1037,9632,8622,5778575.474,,9001
+1037,9632,8624,99969.1014,,9203
+1037,9632,8625,533.6385,,9203
+1037,9632,8626,3.3943,,9203
+1037,9632,8627,-0.1391,,9203
+1037,9632,8628,2.0658,,9203
+1037,9632,8629,0.0677,,9203
+1037,9632,8630,0.0561,,9203
+1037,9632,8631,-0.0148,,9203
+1038,9632,8619,526577.124,,9001
+1038,9632,8620,5778575.474,,9001
+1038,9632,8621,155000.0,,9001
+1038,9632,8622,463000.0,,9001
+1038,9632,8624,100028.0577,,9203
+1038,9632,8625,-533.9532,,9203
+1038,9632,8626,-3.3943,,9203
+1038,9632,8627,0.1935,,9203
+1038,9632,8628,-2.0687,,9203
+1038,9632,8629,-0.0235,,9203
+1038,9632,8630,-0.0554,,9203
+1038,9632,8631,0.0167,,9203
+1100,9603,8605,-166.0,,9001
+1100,9603,8606,-15.0,,9001
+1100,9603,8607,204.0,,9001
+1101,9603,8605,-118.0,,9001
+1101,9603,8606,-14.0,,9001
+1101,9603,8607,218.0,,9001
+1102,9603,8605,-134.0,,9001
+1102,9603,8606,-2.0,,9001
+1102,9603,8607,210.0,,9001
+1103,9603,8605,-165.0,,9001
+1103,9603,8606,-11.0,,9001
+1103,9603,8607,206.0,,9001
+1104,9603,8605,-123.0,,9001
+1104,9603,8606,-20.0,,9001
+1104,9603,8607,220.0,,9001
+1105,9603,8605,-128.0,,9001
+1105,9603,8606,-18.0,,9001
+1105,9603,8607,224.0,,9001
+1106,9603,8605,-161.0,,9001
+1106,9603,8606,-14.0,,9001
+1106,9603,8607,205.0,,9001
+1107,9603,8605,-43.0,,9001
+1107,9603,8606,-163.0,,9001
+1107,9603,8607,45.0,,9001
+1108,9603,8605,-133.0,,9001
+1108,9603,8606,-48.0,,9001
+1108,9603,8607,148.0,,9001
+1109,9603,8605,-134.0,,9001
+1109,9603,8606,-48.0,,9001
+1109,9603,8607,149.0,,9001
+1110,9603,8605,-150.0,,9001
+1110,9603,8606,-250.0,,9001
+1110,9603,8607,-1.0,,9001
+1111,9603,8605,-143.0,,9001
+1111,9603,8606,-236.0,,9001
+1111,9603,8607,7.0,,9001
+1112,9606,8605,593.16,,9001
+1112,9606,8606,26.15,,9001
+1112,9606,8607,478.54,,9001
+1112,9606,8608,-6.3239,,9109
+1112,9606,8609,-0.5008,,9109
+1112,9606,8610,-5.5487,,9109
+1112,9606,8611,4.0775,,9202
+1113,9603,8605,-143.0,,9001
+1113,9603,8606,-90.0,,9001
+1113,9603,8607,-294.0,,9001
+1114,9603,8605,-138.0,,9001
+1114,9603,8606,-105.0,,9001
+1114,9603,8607,-289.0,,9001
+1115,9603,8605,-153.0,,9001
+1115,9603,8606,-5.0,,9001
+1115,9603,8607,-292.0,,9001
+1116,9603,8605,-125.0,,9001
+1116,9603,8606,-108.0,,9001
+1116,9603,8607,-295.0,,9001
+1117,9603,8605,-161.0,,9001
+1117,9603,8606,-73.0,,9001
+1117,9603,8607,-317.0,,9001
+1118,9603,8605,-134.0,,9001
+1118,9603,8606,-105.0,,9001
+1118,9603,8607,-295.0,,9001
+1119,9603,8605,-169.0,,9001
+1119,9603,8606,-19.0,,9001
+1119,9603,8607,-278.0,,9001
+1120,9603,8605,-147.0,,9001
+1120,9603,8606,-74.0,,9001
+1120,9603,8607,-283.0,,9001
+1121,9603,8605,-142.0,,9001
+1121,9603,8606,-96.0,,9001
+1121,9603,8607,-293.0,,9001
+1122,9603,8605,-160.0,,9001
+1122,9603,8606,-6.0,,9001
+1122,9603,8607,-302.0,,9001
+1123,9603,8605,-377.0,,9001
+1123,9603,8606,681.0,,9001
+1123,9603,8607,-50.0,,9001
+1124,9603,8605,-73.0,,9001
+1124,9603,8606,213.0,,9001
+1124,9603,8607,296.0,,9001
+1125,9603,8605,307.0,,9001
+1125,9603,8606,304.0,,9001
+1125,9603,8607,-318.0,,9001
+1126,9603,8605,-384.0,,9001
+1126,9603,8606,664.0,,9001
+1126,9603,8607,-48.0,,9001
+1127,9603,8605,-148.0,,9001
+1127,9603,8606,136.0,,9001
+1127,9603,8607,90.0,,9001
+1128,9603,8605,-136.0,,9001
+1128,9603,8606,-108.0,,9001
+1128,9603,8607,-292.0,,9001
+1129,9603,8605,-134.73,,9001
+1129,9603,8606,-110.92,,9001
+1129,9603,8607,-292.66,,9001
+1130,9603,8605,-263.0,,9001
+1130,9603,8606,6.0,,9001
+1130,9603,8607,431.0,,9001
+1131,9603,8605,-134.0,,9001
+1131,9603,8606,229.0,,9001
+1131,9603,8607,-29.0,,9001
+1132,9603,8605,-206.0,,9001
+1132,9603,8606,172.0,,9001
+1132,9603,8607,-6.0,,9001
+1133,9603,8605,-87.0,,9001
+1133,9603,8606,-98.0,,9001
+1133,9603,8607,-121.0,,9001
+1134,9603,8605,-87.0,,9001
+1134,9603,8606,-96.0,,9001
+1134,9603,8607,-120.0,,9001
+1135,9603,8605,-103.0,,9001
+1135,9603,8606,-106.0,,9001
+1135,9603,8607,-141.0,,9001
+1136,9603,8605,-104.0,,9001
+1136,9603,8606,-101.0,,9001
+1136,9603,8607,-140.0,,9001
+1137,9603,8605,-130.0,,9001
+1137,9603,8606,-117.0,,9001
+1137,9603,8607,-151.0,,9001
+1138,9603,8605,-86.0,,9001
+1138,9603,8606,-96.0,,9001
+1138,9603,8607,-120.0,,9001
+1139,9603,8605,-87.0,,9001
+1139,9603,8606,-95.0,,9001
+1139,9603,8607,-120.0,,9001
+1140,9603,8605,-84.0,,9001
+1140,9603,8606,-95.0,,9001
+1140,9603,8607,-130.0,,9001
+1141,9603,8605,-117.0,,9001
+1141,9603,8606,-132.0,,9001
+1141,9603,8607,-164.0,,9001
+1142,9603,8605,-97.0,,9001
+1142,9603,8606,-103.0,,9001
+1142,9603,8607,-120.0,,9001
+1143,9603,8605,-97.0,,9001
+1143,9603,8606,-88.0,,9001
+1143,9603,8607,-135.0,,9001
+1144,9603,8605,-107.0,,9001
+1144,9603,8606,-88.0,,9001
+1144,9603,8607,-149.0,,9001
+1145,9603,8605,-84.0,,9001
+1145,9603,8606,-107.0,,9001
+1145,9603,8607,-120.0,,9001
+1146,9606,8605,-82.981,,9001
+1146,9606,8606,-99.719,,9001
+1146,9606,8607,-110.709,,9001
+1146,9606,8608,-0.5076,,9109
+1146,9606,8609,0.1503,,9109
+1146,9606,8610,0.3898,,9109
+1146,9606,8611,-0.3143,,9202
+1147,9606,8605,-1.51,,9001
+1147,9606,8606,-0.84,,9001
+1147,9606,8607,-3.5,,9001
+1147,9606,8608,-1.893,,9109
+1147,9606,8609,-0.687,,9109
+1147,9606,8610,-2.764,,9109
+1147,9606,8611,0.609,,9202
+1148,9603,8605,-130.0,,9001
+1148,9603,8606,110.0,,9001
+1148,9603,8607,-13.0,,9001
+1149,9603,8605,0.0,,9001
+1149,9603,8606,0.0,,9001
+1149,9603,8607,0.0,,9001
+1150,9603,8605,0.0,,9001
+1150,9603,8606,0.0,,9001
+1150,9603,8607,0.0,,9001
+1151,9603,8605,84.0,,9001
+1151,9603,8606,-22.0,,9001
+1151,9603,8607,209.0,,9001
+1152,9603,8605,-637.0,,9001
+1152,9603,8606,-549.0,,9001
+1152,9603,8607,-203.0,,9001
+1153,9603,8605,217.0,,9001
+1153,9603,8606,823.0,,9001
+1153,9603,8607,299.0,,9001
+1154,9603,8605,209.0,,9001
+1154,9603,8606,818.0,,9001
+1154,9603,8607,290.0,,9001
+1155,9603,8605,282.0,,9001
+1155,9603,8606,726.0,,9001
+1155,9603,8607,254.0,,9001
+1156,9603,8605,295.0,,9001
+1156,9603,8606,736.0,,9001
+1156,9603,8607,257.0,,9001
+1157,9603,8605,-97.0,,9001
+1157,9603,8606,787.0,,9001
+1157,9603,8607,86.0,,9001
+1158,9603,8605,-11.0,,9001
+1158,9603,8606,851.0,,9001
+1158,9603,8607,5.0,,9001
+1159,9603,8605,-130.0,,9001
+1159,9603,8606,29.0,,9001
+1159,9603,8607,364.0,,9001
+1160,9603,8605,-90.0,,9001
+1160,9603,8606,40.0,,9001
+1160,9603,8607,88.0,,9001
+1161,9603,8605,-133.0,,9001
+1161,9603,8606,-77.0,,9001
+1161,9603,8607,-51.0,,9001
+1162,9603,8605,-133.0,,9001
+1162,9603,8606,-79.0,,9001
+1162,9603,8607,-72.0,,9001
+1163,9603,8605,-74.0,,9001
+1163,9603,8606,-130.0,,9001
+1163,9603,8607,42.0,,9001
+1164,9603,8605,41.0,,9001
+1164,9603,8606,-220.0,,9001
+1164,9603,8607,-134.0,,9001
+1165,9603,8605,639.0,,9001
+1165,9603,8606,405.0,,9001
+1165,9603,8607,60.0,,9001
+1166,9603,8605,31.0,,9001
+1166,9603,8606,146.0,,9001
+1166,9603,8607,47.0,,9001
+1167,9603,8605,-81.0,,9001
+1167,9603,8606,-84.0,,9001
+1167,9603,8607,115.0,,9001
+1168,9603,8605,-92.0,,9001
+1168,9603,8606,-93.0,,9001
+1168,9603,8607,122.0,,9001
+1169,9603,8605,-225.0,,9001
+1169,9603,8606,-65.0,,9001
+1169,9603,8607,9.0,,9001
+1170,9603,8605,-3.0,,9001
+1170,9603,8606,142.0,,9001
+1170,9603,8607,183.0,,9001
+1171,9603,8605,0.0,,9001
+1171,9603,8606,125.0,,9001
+1171,9603,8607,194.0,,9001
+1172,9603,8605,-10.0,,9001
+1172,9603,8606,158.0,,9001
+1172,9603,8607,187.0,,9001
+1173,9603,8605,-8.0,,9001
+1173,9603,8606,160.0,,9001
+1173,9603,8607,176.0,,9001
+1174,9603,8605,-9.0,,9001
+1174,9603,8606,161.0,,9001
+1174,9603,8607,179.0,,9001
+1175,9603,8605,-8.0,,9001
+1175,9603,8606,159.0,,9001
+1175,9603,8607,175.0,,9001
+1176,9603,8605,-5.0,,9001
+1176,9603,8606,135.0,,9001
+1176,9603,8607,172.0,,9001
+1177,9603,8605,-4.0,,9001
+1177,9603,8606,154.0,,9001
+1177,9603,8607,178.0,,9001
+1178,9603,8605,1.0,,9001
+1178,9603,8606,140.0,,9001
+1178,9603,8607,165.0,,9001
+1179,9603,8605,-7.0,,9001
+1179,9603,8606,162.0,,9001
+1179,9603,8607,188.0,,9001
+1180,9603,8605,-9.0,,9001
+1180,9603,8606,157.0,,9001
+1180,9603,8607,184.0,,9001
+1181,9603,8605,-22.0,,9001
+1181,9603,8606,160.0,,9001
+1181,9603,8607,190.0,,9001
+1182,9603,8605,4.0,,9001
+1182,9603,8606,159.0,,9001
+1182,9603,8607,188.0,,9001
+1183,9603,8605,-7.0,,9001
+1183,9603,8606,139.0,,9001
+1183,9603,8607,181.0,,9001
+1184,9603,8605,0.0,,9001
+1184,9603,8606,125.0,,9001
+1184,9603,8607,201.0,,9001
+1185,9603,8605,-9.0,,9001
+1185,9603,8606,152.0,,9001
+1185,9603,8607,178.0,,9001
+1186,9603,8605,11.0,,9001
+1186,9603,8606,114.0,,9001
+1186,9603,8607,195.0,,9001
+1187,9603,8605,-12.0,,9001
+1187,9603,8606,130.0,,9001
+1187,9603,8607,190.0,,9001
+1188,9603,8605,0.0,,9001
+1188,9603,8606,0.0,,9001
+1188,9603,8607,0.0,,9001
+1189,9603,8605,-247.0,,9001
+1189,9603,8606,-148.0,,9001
+1189,9603,8607,369.0,,9001
+1190,9603,8605,-243.0,,9001
+1190,9603,8606,-192.0,,9001
+1190,9603,8607,477.0,,9001
+1191,9603,8605,-249.0,,9001
+1191,9603,8606,-156.0,,9001
+1191,9603,8607,381.0,,9001
+1192,9603,8605,-10.0,,9001
+1192,9603,8606,375.0,,9001
+1192,9603,8607,165.0,,9001
+1193,9603,8605,-168.0,,9001
+1193,9603,8606,-60.0,,9001
+1193,9603,8607,320.0,,9001
+1195,9603,8605,375.0,,9001
+1195,9603,8606,-111.0,,9001
+1195,9603,8607,431.0,,9001
+1196,9603,8605,371.0,,9001
+1196,9603,8606,-112.0,,9001
+1196,9603,8607,434.0,,9001
+1197,9603,8605,371.0,,9001
+1197,9603,8606,-111.0,,9001
+1197,9603,8607,434.0,,9001
+1198,9603,8605,384.0,,9001
+1198,9603,8606,-111.0,,9001
+1198,9603,8607,425.0,,9001
+1199,9603,8605,370.0,,9001
+1199,9603,8606,-108.0,,9001
+1199,9603,8607,434.0,,9001
+1200,9603,8605,-148.0,,9001
+1200,9603,8606,51.0,,9001
+1200,9603,8607,-291.0,,9001
+1201,9603,8605,-288.0,,9001
+1201,9603,8606,175.0,,9001
+1201,9603,8607,-376.0,,9001
+1202,9603,8605,-270.0,,9001
+1202,9603,8606,188.0,,9001
+1202,9603,8607,-388.0,,9001
+1203,9603,8605,-270.0,,9001
+1203,9603,8606,183.0,,9001
+1203,9603,8607,-390.0,,9001
+1204,9603,8605,-305.0,,9001
+1204,9603,8606,243.0,,9001
+1204,9603,8607,-442.0,,9001
+1205,9603,8605,-282.0,,9001
+1205,9603,8606,169.0,,9001
+1205,9603,8607,-371.0,,9001
+1206,9603,8605,-278.0,,9001
+1206,9603,8606,171.0,,9001
+1206,9603,8607,-367.0,,9001
+1207,9603,8605,-298.0,,9001
+1207,9603,8606,159.0,,9001
+1207,9603,8607,-369.0,,9001
+1208,9603,8605,-279.0,,9001
+1208,9603,8606,175.0,,9001
+1208,9603,8607,-379.0,,9001
+1209,9603,8605,-295.0,,9001
+1209,9603,8606,173.0,,9001
+1209,9603,8607,-371.0,,9001
+1211,9603,8605,164.0,,9001
+1211,9603,8606,138.0,,9001
+1211,9603,8607,-189.0,,9001
+1212,9603,8605,-57.0,,9001
+1212,9603,8606,1.0,,9001
+1212,9603,8607,-41.0,,9001
+1213,9603,8605,-62.0,,9001
+1213,9603,8606,-1.0,,9001
+1213,9603,8607,-37.0,,9001
+1214,9603,8605,-61.0,,9001
+1214,9603,8606,2.0,,9001
+1214,9603,8607,-48.0,,9001
+1215,9603,8605,-60.0,,9001
+1215,9603,8606,-2.0,,9001
+1215,9603,8607,-41.0,,9001
+1216,9603,8605,-75.0,,9001
+1216,9603,8606,-1.0,,9001
+1216,9603,8607,-44.0,,9001
+1217,9603,8605,-44.0,,9001
+1217,9603,8606,6.0,,9001
+1217,9603,8607,-36.0,,9001
+1218,9603,8605,-48.0,,9001
+1218,9603,8606,3.0,,9001
+1218,9603,8607,-44.0,,9001
+1219,9603,8605,-47.0,,9001
+1219,9603,8606,26.0,,9001
+1219,9603,8607,-42.0,,9001
+1220,9603,8605,-53.0,,9001
+1220,9603,8606,3.0,,9001
+1220,9603,8607,-47.0,,9001
+1221,9603,8605,-61.0,,9001
+1221,9603,8606,2.0,,9001
+1221,9603,8607,-33.0,,9001
+1222,9603,8605,-58.0,,9001
+1222,9603,8606,0.0,,9001
+1222,9603,8607,-44.0,,9001
+1223,9603,8605,-45.0,,9001
+1223,9603,8606,12.0,,9001
+1223,9603,8607,-33.0,,9001
+1224,9603,8605,-45.0,,9001
+1224,9603,8606,8.0,,9001
+1224,9603,8607,-33.0,,9001
+1225,9603,8605,-355.0,,9001
+1225,9603,8606,21.0,,9001
+1225,9603,8607,72.0,,9001
+1226,9603,8605,616.0,,9001
+1226,9603,8606,97.0,,9001
+1226,9603,8607,-251.0,,9001
+1227,9603,8605,-189.0,,9001
+1227,9603,8606,-242.0,,9001
+1227,9603,8607,-91.0,,9001
+1228,9603,8605,-679.0,,9001
+1228,9603,8606,669.0,,9001
+1228,9603,8607,-48.0,,9001
+1229,9603,8605,506.0,,9001
+1229,9603,8606,-122.0,,9001
+1229,9603,8607,611.0,,9001
+1230,9603,8605,-148.0,,9001
+1230,9603,8606,507.0,,9001
+1230,9603,8607,685.0,,9001
+1231,9603,8605,-148.0,,9001
+1231,9603,8606,507.0,,9001
+1231,9603,8607,685.0,,9001
+1232,9603,8605,-146.0,,9001
+1232,9603,8606,507.0,,9001
+1232,9603,8607,687.0,,9001
+1233,9603,8605,-158.0,,9001
+1233,9603,8606,507.0,,9001
+1233,9603,8607,676.0,,9001
+1234,9603,8605,-155.0,,9001
+1234,9603,8606,171.0,,9001
+1234,9603,8607,37.0,,9001
+1235,9603,8605,-265.0,,9001
+1235,9603,8606,120.0,,9001
+1235,9603,8607,-358.0,,9001
+1236,9607,8605,-116.0,,9001
+1236,9607,8606,-50.47,,9001
+1236,9607,8607,141.69,,9001
+1236,9607,8608,-0.23,,9104
+1236,9607,8609,-0.39,,9104
+1236,9607,8610,-0.344,,9104
+1236,9607,8611,0.0983,,9202
+1237,9606,8605,0.0,,9001
+1237,9606,8606,0.0,,9001
+1237,9606,8607,4.5,,9001
+1237,9606,8608,0.0,,9104
+1237,9606,8609,0.0,,9104
+1237,9606,8610,0.554,,9104
+1237,9606,8611,0.2263,,9202
+1238,9606,8605,0.0,,9001
+1238,9606,8606,0.0,,9001
+1238,9606,8607,4.5,,9001
+1238,9606,8608,0.0,,9104
+1238,9606,8609,0.0,,9104
+1238,9606,8610,0.554,,9104
+1238,9606,8611,0.219,,9202
+1239,9606,8605,0.0,,9001
+1239,9606,8606,0.0,,9001
+1239,9606,8607,-2.6,,9001
+1239,9606,8608,0.0,,9104
+1239,9606,8609,0.0,,9104
+1239,9606,8610,0.26,,9104
+1239,9606,8611,-0.6063,,9202
+1240,9606,8605,0.0,,9001
+1240,9606,8606,0.0,,9001
+1240,9606,8607,1.9,,9001
+1240,9606,8608,0.0,,9104
+1240,9606,8609,0.0,,9104
+1240,9606,8610,0.814,,9104
+1240,9606,8611,-0.38,,9202
+1241,9613,8657,,conus.las,
+1241,9613,8658,,conus.los,
+1243,9613,8657,,alaska.las,
+1243,9613,8658,,alaska.los,
+1245,9603,8605,-112.0,,9001
+1245,9603,8606,-77.0,,9001
+1245,9603,8607,-145.0,,9001
+1246,9603,8605,-333.0,,9001
+1246,9603,8606,-222.0,,9001
+1246,9603,8607,114.0,,9001
+1247,9603,8605,283.0,,9001
+1247,9603,8606,682.0,,9001
+1247,9603,8607,231.0,,9001
+1248,9603,8605,-24.0,,9001
+1248,9603,8606,-15.0,,9001
+1248,9603,8607,5.0,,9001
+1249,9603,8605,-2.0,,9001
+1249,9603,8606,152.0,,9001
+1249,9603,8607,149.0,,9001
+1250,9603,8605,2.0,,9001
+1250,9603,8606,204.0,,9001
+1250,9603,8607,105.0,,9001
+1251,9603,8605,-2.0,,9001
+1251,9603,8606,0.0,,9001
+1251,9603,8607,4.0,,9001
+1252,9603,8605,1.0,,9001
+1252,9603,8606,1.0,,9001
+1252,9603,8607,-1.0,,9001
+1253,9603,8605,-186.0,,9001
+1253,9603,8606,-93.0,,9001
+1253,9603,8607,310.0,,9001
+1254,9603,8605,28.0,,9001
+1254,9603,8606,-130.0,,9001
+1254,9603,8607,-95.0,,9001
+1255,9603,8605,-123.0,,9001
+1255,9603,8606,-206.0,,9001
+1255,9603,8607,219.0,,9001
+1256,9603,8605,-346.0,,9001
+1256,9603,8606,-1.0,,9001
+1256,9603,8607,224.0,,9001
+1258,9601,8602,-74.04513,,9110
+1259,9601,8602,-9.0754862,,9110
+1260,9601,8602,106.482779,,9110
+1261,9601,8602,-17.4,,9110
+1262,9601,8602,12.27084,,9110
+1263,9601,8602,106.482779,,9110
+1264,9601,8602,4.220471,,9110
+1265,9601,8602,2.5969213,,9105
+1266,9601,8602,2.5969213,,9105
+1268,9601,8602,106.482779,,9110
+1269,9601,8602,18.03298,,9110
+1270,9601,8602,23.4258815,,9110
+1271,9603,8605,615.64,,9001
+1271,9603,8606,102.08,,9001
+1271,9603,8607,-255.81,,9001
+1272,9603,8605,-199.87,,9001
+1272,9603,8606,74.79,,9001
+1272,9603,8607,246.62,,9001
+1273,9607,8605,-56.0,,9001
+1273,9607,8606,75.77,,9001
+1273,9607,8607,15.31,,9001
+1273,9607,8608,-0.37,,9104
+1273,9607,8609,-0.2,,9104
+1273,9607,8610,-0.21,,9104
+1273,9607,8611,-1.01,,9202
+1274,9607,8605,-40.595,,9001
+1274,9607,8606,-18.55,,9001
+1274,9607,8607,-69.339,,9001
+1274,9607,8608,-2.508,,9104
+1274,9607,8609,-1.832,,9104
+1274,9607,8610,2.611,,9104
+1274,9607,8611,-4.299,,9202
+1275,9603,8605,-84.0,,9001
+1275,9603,8606,-97.0,,9001
+1275,9603,8607,-117.0,,9001
+1276,9603,8605,-84.0,,9001
+1276,9603,8606,37.0,,9001
+1276,9603,8607,437.0,,9001
+1277,9603,8605,-168.0,,9001
+1277,9603,8606,-72.0,,9001
+1277,9603,8607,314.0,,9001
+1278,9603,8605,-127.8,,9001
+1278,9603,8606,-52.3,,9001
+1278,9603,8607,152.9,,9001
+1279,9603,8605,-128.5,,9001
+1279,9603,8606,-53.0,,9001
+1279,9603,8607,153.4,,9001
+1280,9607,8605,-117.763,,9001
+1280,9607,8606,-51.51,,9001
+1280,9607,8607,139.061,,9001
+1280,9607,8608,-0.292,,9104
+1280,9607,8609,-0.443,,9104
+1280,9607,8610,-0.277,,9104
+1280,9607,8611,-0.191,,9202
+1282,9603,8605,-404.78,,9001
+1282,9603,8606,685.68,,9001
+1282,9603,8607,45.47,,9001
+1283,9603,8605,0.0,,9001
+1283,9603,8606,0.0,,9001
+1283,9603,8607,0.0,,9001
+1284,9603,8605,-157.0,,9001
+1284,9603,8606,-2.0,,9001
+1284,9603,8607,-299.0,,9001
+1285,9603,8605,-175.0,,9001
+1285,9603,8606,-23.0,,9001
+1285,9603,8607,-303.0,,9001
+1286,9603,8605,-403.0,,9001
+1286,9603,8606,684.0,,9001
+1286,9603,8607,41.0,,9001
+1287,9603,8605,28.0,,9001
+1287,9603,8606,-121.0,,9001
+1287,9603,8607,-77.0,,9001
+1288,9603,8605,23.0,,9001
+1288,9603,8606,-124.0,,9001
+1288,9603,8607,-82.0,,9001
+1289,9603,8605,26.0,,9001
+1289,9603,8606,-121.0,,9001
+1289,9603,8607,-78.0,,9001
+1290,9603,8605,24.0,,9001
+1290,9603,8606,-124.0,,9001
+1290,9603,8607,-82.0,,9001
+1291,9603,8605,15.0,,9001
+1291,9603,8606,-130.0,,9001
+1291,9603,8607,-84.0,,9001
+1292,9603,8605,24.0,,9001
+1292,9603,8606,-130.0,,9001
+1292,9603,8607,-92.0,,9001
+1293,9603,8605,28.0,,9001
+1293,9603,8606,-121.0,,9001
+1293,9603,8607,-77.0,,9001
+1294,9603,8605,-73.0,,9001
+1294,9603,8606,-247.0,,9001
+1294,9603,8607,227.0,,9001
+1296,9603,8605,-61.702,,9001
+1296,9603,8606,284.488,,9001
+1296,9603,8607,472.052,,9001
+1297,9607,8605,-115.064,,9001
+1297,9607,8606,-87.39,,9001
+1297,9607,8607,-101.716,,9001
+1297,9607,8608,0.058,,9104
+1297,9607,8609,-4.001,,9104
+1297,9607,8610,2.062,,9104
+1297,9607,8611,9.366,,9202
+1298,9607,8605,-82.875,,9001
+1298,9607,8606,-57.097,,9001
+1298,9607,8607,-156.768,,9001
+1298,9607,8608,2.158,,9104
+1298,9607,8609,-1.524,,9104
+1298,9607,8610,0.982,,9104
+1298,9607,8611,-0.359,,9202
+1299,9607,8605,-138.527,,9001
+1299,9607,8606,-91.999,,9001
+1299,9607,8607,-114.591,,9001
+1299,9607,8608,0.14,,9104
+1299,9607,8609,-3.363,,9104
+1299,9607,8610,2.217,,9104
+1299,9607,8611,11.748,,9202
+1300,9607,8605,-73.472,,9001
+1300,9607,8606,-51.66,,9001
+1300,9607,8607,-112.482,,9001
+1300,9607,8608,-0.953,,9104
+1300,9607,8609,-4.6,,9104
+1300,9607,8610,2.368,,9104
+1300,9607,8611,0.586,,9202
+1301,9607,8605,219.315,,9001
+1301,9607,8606,168.975,,9001
+1301,9607,8607,-166.145,,9001
+1301,9607,8608,-0.198,,9104
+1301,9607,8609,-5.926,,9104
+1301,9607,8610,2.356,,9104
+1301,9607,8611,-57.104,,9202
+1302,9607,8605,0.0,,9001
+1302,9607,8606,0.0,,9001
+1302,9607,8607,0.0,,9001
+1302,9607,8608,0.0,,9104
+1302,9607,8609,0.0,,9104
+1302,9607,8610,0.0,,9104
+1302,9607,8611,0.0,,9202
+1303,9606,8605,43.822,,9001
+1303,9606,8606,-108.842,,9001
+1303,9606,8607,-119.585,,9001
+1303,9606,8608,1.455,,9104
+1303,9606,8609,-0.761,,9104
+1303,9606,8610,0.737,,9104
+1303,9606,8611,0.549,,9202
+1304,9603,8605,210.0,,9001
+1304,9603,8606,814.0,,9001
+1304,9603,8607,289.0,,9001
+1305,9603,8605,-147.0,,9001
+1305,9603,8606,506.0,,9001
+1305,9603,8607,687.0,,9001
+1306,9603,8605,682.0,,9001
+1306,9603,8606,-203.0,,9001
+1306,9603,8607,480.0,,9001
+1307,9603,8605,-2.0,,9001
+1307,9603,8606,374.0,,9001
+1307,9603,8607,172.0,,9001
+1308,9607,8605,-0.9738,,9001
+1308,9607,8606,1.9453,,9001
+1308,9607,8607,0.5486,,9001
+1308,9607,8608,-0.00000013357,,9101
+1308,9607,8609,-0.00000004872,,9101
+1308,9607,8610,-0.00000005507,,9101
+1308,9607,8611,0.0,,9202
+1309,9607,8605,582.0,,9001
+1309,9607,8606,105.0,,9001
+1309,9607,8607,414.0,,9001
+1309,9607,8608,-1.04,,9104
+1309,9607,8609,-0.35,,9104
+1309,9607,8610,3.08,,9104
+1309,9607,8611,8.3,,9202
+1310,9607,8605,24.0,,9001
+1310,9607,8606,-123.0,,9001
+1310,9607,8607,-94.0,,9001
+1310,9607,8608,-0.02,,9104
+1310,9607,8609,0.25,,9104
+1310,9607,8610,0.13,,9104
+1310,9607,8611,1.1,,9202
+1311,9606,8605,-89.5,,9001
+1311,9606,8606,-93.8,,9001
+1311,9606,8607,-123.1,,9001
+1311,9606,8608,0.0,,9104
+1311,9606,8609,0.0,,9104
+1311,9606,8610,-0.156,,9104
+1311,9606,8611,1.2,,9202
+1312,9614,8656,,NTv1_0.gsb,
+1313,9615,8656,,NTv2_0.gsb,
+1314,9606,8605,446.448,,9001
+1314,9606,8606,-125.157,,9001
+1314,9606,8607,542.06,,9001
+1314,9606,8608,0.15,,9104
+1314,9606,8609,0.247,,9104
+1314,9606,8610,0.842,,9104
+1314,9606,8611,-20.489,,9202
+1315,9606,8605,535.948,,9001
+1315,9606,8606,-31.357,,9001
+1315,9606,8607,665.16,,9001
+1315,9606,8608,0.15,,9104
+1315,9606,8609,0.247,,9104
+1315,9606,8610,0.998,,9104
+1315,9606,8611,-21.689,,9202
+1316,9603,8605,-70.9,,9001
+1316,9603,8606,-151.8,,9001
+1316,9603,8607,-41.4,,9001
+1317,9603,8605,-37.2,,9001
+1317,9603,8606,-370.6,,9001
+1317,9603,8607,-228.5,,9001
+1318,9603,8605,-42.01,,9001
+1318,9603,8606,-332.21,,9001
+1318,9603,8607,-229.75,,9001
+1319,9603,8605,-40.0,,9001
+1319,9603,8606,-354.0,,9001
+1319,9603,8607,-224.0,,9001
+1320,9606,8605,-37.2,,9001
+1320,9606,8606,-370.6,,9001
+1320,9606,8607,-224.0,,9001
+1320,9606,8608,0.0,,9104
+1320,9606,8609,0.0,,9104
+1320,9606,8610,0.554,,9104
+1320,9606,8611,0.219,,9202
+1321,9603,8605,-41.8,,9001
+1321,9603,8606,-342.2,,9001
+1321,9603,8607,-228.2,,9001
+1322,9603,8605,-55.5,,9001
+1322,9603,8606,-348.0,,9001
+1322,9603,8607,-229.2,,9001
+1323,9603,8605,-43.0,,9001
+1323,9603,8606,-337.0,,9001
+1323,9603,8607,-233.0,,9001
+1324,9603,8605,-48.0,,9001
+1324,9603,8606,-345.0,,9001
+1324,9603,8607,-231.0,,9001
+1325,9603,8605,-48.6,,9001
+1325,9603,8606,-345.1,,9001
+1325,9603,8607,-230.8,,9001
+1326,9606,8605,-41.057,,9001
+1326,9606,8606,-374.564,,9001
+1326,9606,8607,-226.287,,9001
+1326,9606,8608,0.0,,9104
+1326,9606,8609,0.0,,9104
+1326,9606,8610,0.554,,9104
+1326,9606,8611,0.219,,9202
+1327,9603,8605,-50.9,,9001
+1327,9603,8606,-347.6,,9001
+1327,9603,8607,-231.0,,9001
+1328,9603,8605,0.0,,9001
+1328,9603,8606,0.0,,9001
+1328,9603,8607,0.0,,9001
+1329,9603,8605,-252.95,,9001
+1329,9603,8606,-4.11,,9001
+1329,9603,8607,-96.38,,9001
+1330,9603,8605,-252.95,,9001
+1330,9603,8606,-4.11,,9001
+1330,9603,8607,-96.38,,9001
+1331,9607,8605,0.0,,9001
+1331,9607,8606,0.0,,9001
+1331,9607,8607,0.0,,9001
+1331,9607,8608,0.0,,9104
+1331,9607,8609,0.0,,9104
+1331,9607,8610,0.0,,9104
+1331,9607,8611,0.0,,9202
+1332,9607,8605,21.53219,,9001
+1332,9607,8606,-97.00027,,9001
+1332,9607,8607,-60.74046,,9001
+1332,9607,8608,-0.99548,,9104
+1332,9607,8609,-0.58147,,9104
+1332,9607,8610,-0.2418,,9104
+1332,9607,8611,-4.5981,,9202
+1333,9607,8605,0.055,,9001
+1333,9607,8606,-0.541,,9001
+1333,9607,8607,-0.185,,9001
+1333,9607,8608,-0.0183,,9104
+1333,9607,8609,0.0003,,9104
+1333,9607,8610,0.007,,9104
+1333,9607,8611,-0.014,,9202
+1334,9607,8605,21.58719,,9001
+1334,9607,8606,-97.54127,,9001
+1334,9607,8607,-60.92546,,9001
+1334,9607,8608,-1.01378,,9104
+1334,9607,8609,-0.58117,,9104
+1334,9607,8610,-0.2348,,9104
+1334,9607,8611,-4.6121,,9202
+1335,9618,8601,7.92,,9108
+1335,9618,8602,-13.88,,9104
+1335,9618,8604,26.1,,9001
+1336,9618,8601,7.94,,9104
+1336,9618,8602,-13.97,,9104
+1336,9618,8604,26.9,,9001
+1337,9618,8601,8.1,,9104
+1337,9618,8602,-13.81,,9104
+1337,9618,8604,27.2,,9001
+1338,9618,8601,8.15,,9104
+1338,9618,8602,-13.95,,9104
+1338,9618,8604,28.4,,9001
+1339,9618,8601,8.37,,9104
+1339,9618,8602,-13.65,,9104
+1339,9618,8604,29.0,,9001
+1340,9618,8601,8.44,,9104
+1340,9618,8602,-13.87,,9104
+1340,9618,8604,30.9,,9001
+1341,9618,8601,8.61,,9104
+1341,9618,8602,-14.08,,9104
+1341,9618,8604,30.7,,9001
+1342,9618,8601,8.73,,9104
+1342,9618,8602,-14.3,,9104
+1342,9618,8604,30.9,,9001
+1343,9618,8601,8.63,,9104
+1343,9618,8602,-13.49,,9104
+1343,9618,8604,30.9,,9001
+1344,9618,8601,8.71,,9104
+1344,9618,8602,-13.73,,9104
+1344,9618,8604,31.6,,9001
+1345,9618,8601,8.84,,9104
+1345,9618,8602,-14.03,,9104
+1345,9618,8604,31.2,,9001
+1346,9618,8601,8.98,,9104
+1346,9618,8602,-14.33,,9104
+1346,9618,8604,32.5,,9001
+1347,9618,8601,9.1,,9104
+1347,9618,8602,-14.56,,9104
+1347,9618,8604,32.6,,9001
+1348,9618,8601,8.79,,9104
+1348,9618,8602,-13.0,,9104
+1348,9618,8604,33.3,,9001
+1349,9618,8601,8.84,,9104
+1349,9618,8602,-13.31,,9104
+1349,9618,8604,31.4,,9001
+1350,9618,8601,8.98,,9104
+1350,9618,8602,-13.59,,9104
+1350,9618,8604,30.9,,9001
+1351,9618,8601,9.1,,9104
+1351,9618,8602,-13.91,,9104
+1351,9618,8604,29.3,,9001
+1352,9618,8601,9.17,,9104
+1352,9618,8602,-14.27,,9104
+1352,9618,8604,31.3,,9001
+1353,9618,8601,9.23,,9104
+1353,9618,8602,-14.52,,9104
+1353,9618,8604,31.4,,9001
+1354,9618,8601,8.9,,9104
+1354,9618,8602,-12.68,,9104
+1354,9618,8604,34.4,,9001
+1355,9618,8601,8.99,,9104
+1355,9618,8602,-12.8,,9104
+1355,9618,8604,34.2,,9001
+1356,9618,8601,9.0,,9104
+1356,9618,8602,-13.07,,9104
+1356,9618,8604,31.7,,9001
+1357,9618,8601,9.21,,9104
+1357,9618,8602,-13.51,,9104
+1357,9618,8604,27.5,,9001
+1358,9618,8601,9.33,,9104
+1358,9618,8602,-13.66,,9104
+1358,9618,8604,23.8,,9001
+1359,9618,8601,9.25,,9104
+1359,9618,8602,-12.72,,9104
+1359,9618,8604,34.2,,9001
+1360,9618,8601,9.39,,9104
+1360,9618,8602,-12.91,,9104
+1360,9618,8604,31.8,,9001
+1361,9618,8601,9.55,,9104
+1361,9618,8602,-12.63,,9104
+1361,9618,8604,35.6,,9001
+1362,9618,8601,9.62,,9104
+1362,9618,8602,-12.82,,9104
+1362,9618,8604,34.7,,9001
+1363,9618,8601,9.81,,9104
+1363,9618,8602,-12.29,,9104
+1363,9618,8604,36.6,,9001
+1364,9618,8601,9.81,,9104
+1364,9618,8602,-12.45,,9104
+1364,9618,8604,37.5,,9001
+1365,9618,8601,9.92,,9104
+1365,9618,8602,-12.79,,9104
+1365,9618,8604,38.3,,9001
+1366,9618,8601,9.91,,9104
+1366,9618,8602,-12.21,,9104
+1366,9618,8604,36.6,,9001
+1367,9618,8601,10.08,,9104
+1367,9618,8602,-12.35,,9104
+1367,9618,8604,39.0,,9001
+1368,9618,8601,10.19,,9104
+1368,9618,8602,-12.74,,9104
+1368,9618,8604,40.3,,9001
+1369,9618,8601,10.29,,9104
+1369,9618,8602,-12.13,,9104
+1369,9618,8604,38.5,,9001
+1370,9618,8601,10.33,,9104
+1370,9618,8602,-12.27,,9104
+1370,9618,8604,40.1,,9001
+1371,9618,8601,10.45,,9104
+1371,9618,8602,-12.61,,9104
+1371,9618,8604,41.7,,9001
+1372,9618,8601,10.54,,9104
+1372,9618,8602,-11.96,,9104
+1372,9618,8604,39.1,,9001
+1373,9618,8601,10.65,,9104
+1373,9618,8602,-12.27,,9104
+1373,9618,8604,41.7,,9001
+1374,9618,8601,10.67,,9104
+1374,9618,8602,-12.5,,9104
+1374,9618,8604,41.1,,9001
+1375,9618,8601,10.67,,9104
+1375,9618,8602,-10.86,,9104
+1375,9618,8604,38.5,,9001
+1376,9618,8601,10.68,,9104
+1376,9618,8602,-10.97,,9104
+1376,9618,8604,36.0,,9001
+1377,9618,8601,10.8,,9104
+1377,9618,8602,-11.53,,9104
+1377,9618,8604,39.7,,9001
+1378,9618,8601,10.8,,9104
+1378,9618,8602,-11.73,,9104
+1378,9618,8604,40.9,,9001
+1379,9618,8601,10.92,,9104
+1379,9618,8602,-12.16,,9104
+1379,9618,8604,42.3,,9001
+1380,9618,8601,11.0,,9104
+1380,9618,8602,-12.25,,9104
+1380,9618,8604,41.2,,9001
+1381,9618,8601,10.83,,9104
+1381,9618,8602,-10.77,,9104
+1381,9618,8604,36.2,,9001
+1382,9618,8601,10.95,,9104
+1382,9618,8602,-11.0,,9104
+1382,9618,8604,38.7,,9001
+1383,9618,8601,10.97,,9104
+1383,9618,8602,-11.34,,9104
+1383,9618,8604,40.8,,9001
+1384,9618,8601,11.04,,9104
+1384,9618,8602,-11.69,,9104
+1384,9618,8604,43.3,,9001
+1385,9618,8601,11.17,,9104
+1385,9618,8602,-12.05,,9104
+1385,9618,8604,42.6,,9001
+1386,9618,8601,11.11,,9104
+1386,9618,8602,-10.59,,9104
+1386,9618,8604,37.3,,9001
+1387,9618,8601,11.16,,9104
+1387,9618,8602,-10.97,,9104
+1387,9618,8604,40.3,,9001
+1388,9618,8601,11.29,,9104
+1388,9618,8602,-11.23,,9104
+1388,9618,8604,42.4,,9001
+1389,9618,8601,11.36,,9104
+1389,9618,8602,-11.59,,9104
+1389,9618,8604,42.5,,9001
+1390,9618,8601,11.44,,9104
+1390,9618,8602,-11.88,,9104
+1390,9618,8604,40.3,,9001
+1391,9618,8601,11.27,,9104
+1391,9618,8602,-9.31,,9104
+1391,9618,8604,30.9,,9001
+1392,9618,8601,11.33,,9104
+1392,9618,8602,-9.52,,9104
+1392,9618,8604,33.8,,9001
+1393,9618,8601,11.38,,9104
+1393,9618,8602,-9.86,,9104
+1393,9618,8604,34.9,,9001
+1394,9618,8601,11.41,,9104
+1394,9618,8602,-10.14,,9104
+1394,9618,8604,35.7,,9001
+1395,9618,8601,11.39,,9104
+1395,9618,8602,-10.52,,9104
+1395,9618,8604,37.5,,9001
+1396,9618,8601,11.49,,9104
+1396,9618,8602,-10.83,,9104
+1396,9618,8604,39.3,,9001
+1397,9618,8601,11.58,,9104
+1397,9618,8602,-11.21,,9104
+1397,9618,8604,41.7,,9001
+1398,9618,8601,11.65,,9104
+1398,9618,8602,-11.53,,9104
+1398,9618,8604,38.5,,9001
+1399,9618,8601,11.72,,9104
+1399,9618,8602,-11.8,,9104
+1399,9618,8604,34.5,,9001
+1400,9618,8601,11.44,,9104
+1400,9618,8602,-9.21,,9104
+1400,9618,8604,32.7,,9001
+1401,9618,8601,11.47,,9104
+1401,9618,8602,-9.52,,9104
+1401,9618,8604,35.2,,9001
+1402,9618,8601,11.55,,9104
+1402,9618,8602,-9.8,,9104
+1402,9618,8604,35.4,,9001
+1403,9618,8601,11.61,,9104
+1403,9618,8602,-10.12,,9104
+1403,9618,8604,35.9,,9001
+1404,9618,8601,11.66,,9104
+1404,9618,8602,-10.47,,9104
+1404,9618,8604,37.0,,9001
+1405,9618,8601,11.78,,9104
+1405,9618,8602,-10.79,,9104
+1405,9618,8604,39.8,,9001
+1406,9618,8601,11.85,,9104
+1406,9618,8602,-11.13,,9104
+1406,9618,8604,39.9,,9001
+1407,9618,8601,11.9,,9104
+1407,9618,8602,-11.47,,9104
+1407,9618,8604,36.9,,9001
+1408,9618,8601,11.91,,9104
+1408,9618,8602,-11.69,,9104
+1408,9618,8604,33.7,,9001
+1409,9618,8601,11.65,,9104
+1409,9618,8602,-8.59,,9104
+1409,9618,8604,29.7,,9001
+1410,9618,8601,11.68,,9104
+1410,9618,8602,-8.8,,9104
+1410,9618,8604,30.5,,9001
+1411,9618,8601,11.73,,9104
+1411,9618,8602,-9.04,,9104
+1411,9618,8604,30.9,,9001
+1412,9618,8601,11.72,,9104
+1412,9618,8602,-9.48,,9104
+1412,9618,8604,35.1,,9001
+1413,9618,8601,11.81,,9104
+1413,9618,8602,9.74,,9104
+1413,9618,8604,35.8,,9001
+1414,9618,8601,11.88,,9104
+1414,9618,8602,-10.1,,9104
+1414,9618,8604,37.1,,9001
+1415,9618,8601,11.91,,9104
+1415,9618,8602,-10.35,,9104
+1415,9618,8604,37.9,,9001
+1416,9618,8601,11.9,,9104
+1416,9618,8602,-10.7,,9104
+1416,9618,8604,39.3,,9001
+1417,9618,8601,12.02,,9104
+1417,9618,8602,-11.09,,9104
+1417,9618,8604,38.2,,9001
+1418,9618,8601,11.87,,9104
+1418,9618,8602,-8.23,,9104
+1418,9618,8604,29.7,,9001
+1419,9618,8601,11.84,,9104
+1419,9618,8602,-8.44,,9104
+1419,9618,8604,30.6,,9001
+1420,9618,8601,11.94,,9104
+1420,9618,8602,-8.71,,9104
+1420,9618,8604,30.2,,9001
+1421,9618,8601,11.99,,9104
+1421,9618,8602,-9.02,,9104
+1421,9618,8604,30.9,,9001
+1422,9618,8601,12.05,,9104
+1422,9618,8602,-9.36,,9104
+1422,9618,8604,35.0,,9001
+1423,9618,8601,12.1,,9104
+1423,9618,8602,-9.64,,9104
+1423,9618,8604,35.5,,9001
+1424,9618,8601,12.1,,9104
+1424,9618,8602,-10.08,,9104
+1424,9618,8604,37.3,,9001
+1425,9618,8601,12.07,,9104
+1425,9618,8602,-10.25,,9104
+1425,9618,8604,37.3,,9001
+1426,9618,8601,12.0,,9104
+1426,9618,8602,-8.15,,9104
+1426,9618,8604,32.1,,9001
+1427,9618,8601,12.06,,9104
+1427,9618,8602,-8.38,,9104
+1427,9618,8604,31.0,,9001
+1428,9618,8601,12.17,,9104
+1428,9618,8602,-8.69,,9104
+1428,9618,8604,30.3,,9001
+1429,9618,8601,12.23,,9104
+1429,9618,8602,-8.99,,9104
+1429,9618,8604,31.7,,9001
+1430,9618,8601,12.21,,9104
+1430,9618,8602,-9.21,,9104
+1430,9618,8604,34.3,,9001
+1431,9618,8601,12.28,,9104
+1431,9618,8602,-9.6,,9104
+1431,9618,8604,33.3,,9001
+1432,9618,8601,12.28,,9104
+1432,9618,8602,-8.25,,9104
+1432,9618,8604,31.0,,9001
+1433,9618,8601,12.37,,9104
+1433,9618,8602,-8.55,,9104
+1433,9618,8604,29.1,,9001
+1434,9618,8601,12.53,,9104
+1434,9618,8602,-8.21,,9104
+1434,9618,8604,31.0,,9001
+1435,9618,8601,12.57,,9104
+1435,9618,8602,-8.4,,9104
+1435,9618,8604,28.4,,9001
+1436,9618,8601,12.71,,9104
+1436,9618,8602,-8.17,,9104
+1436,9618,8604,29.9,,9001
+1437,9607,8605,419.3836,,9001
+1437,9607,8606,99.3335,,9001
+1437,9607,8607,591.3451,,9001
+1437,9607,8608,-0.850389,,9104
+1437,9607,8609,-1.817277,,9104
+1437,9607,8610,7.862238,,9104
+1437,9607,8611,-0.99496,,9202
+1438,9606,8605,-333.102,,9001
+1438,9606,8606,-11.02,,9001
+1438,9606,8607,230.69,,9001
+1438,9606,8608,0.0,,9104
+1438,9606,8609,0.0,,9104
+1438,9606,8610,0.554,,9104
+1438,9606,8611,0.219,,9202
+1439,9606,8605,-180.624,,9001
+1439,9606,8606,-225.516,,9001
+1439,9606,8607,173.919,,9001
+1439,9606,8608,-0.81,,9104
+1439,9606,8609,-1.898,,9104
+1439,9606,8610,8.336,,9104
+1439,9606,8611,16.71006,,9202
+1440,9603,8605,-86.0,,9001
+1440,9603,8606,-92.2,,9001
+1440,9603,8607,-127.5,,9001
+1441,9603,8605,-255.0,,9001
+1441,9603,8606,-15.0,,9001
+1441,9603,8607,71.0,,9001
+1442,9603,8605,725.0,,9001
+1442,9603,8606,685.0,,9001
+1442,9603,8607,536.0,,9001
+1443,9603,8605,72.0,,9001
+1443,9603,8606,213.7,,9001
+1443,9603,8607,93.0,,9001
+1444,9603,8605,174.0,,9001
+1444,9603,8606,359.0,,9001
+1444,9603,8607,365.0,,9001
+1445,9603,8605,9.0,,9001
+1445,9603,8606,183.0,,9001
+1445,9603,8607,236.0,,9001
+1446,9603,8605,-149.0,,9001
+1446,9603,8606,128.0,,9001
+1446,9603,8607,296.0,,9001
+1447,9619,8601,-18.0,,9104
+1447,9619,8602,4.4,,9104
+1450,9620,8659,8047.0,,
+1450,9620,8660,8046.0,,
+1450,9620,8661,,ED50 to WGS 84 (15),
+1450,9620,8662,,ED50 to WGS 84 (14),
+1451,9614,8656,,PQV4.DAC,
+1454,9613,8657,,hawaii.las,
+1454,9613,8658,,hawaii.los,
+1455,9613,8657,,stlrnc.las,
+1455,9613,8658,,stlrnc.los,
+1456,9613,8657,,stpaul.las,
+1456,9613,8658,,stpaul.los,
+1457,9613,8657,,stgeorge.las,
+1457,9613,8658,,stgeorge.los,
+1458,9607,8605,-129.193,,9001
+1458,9607,8606,-41.212,,9001
+1458,9607,8607,130.73,,9001
+1458,9607,8608,-0.246,,9104
+1458,9607,8609,-0.374,,9104
+1458,9607,8610,-0.329,,9104
+1458,9607,8611,-2.955,,9202
+1459,9607,8605,-120.695,,9001
+1459,9607,8606,-62.73,,9001
+1459,9607,8607,165.46,,9001
+1459,9607,8608,-0.109,,9104
+1459,9607,8609,0.141,,9104
+1459,9607,8610,0.116,,9104
+1459,9607,8611,2.733,,9202
+1460,9607,8605,-119.353,,9001
+1460,9607,8606,-48.301,,9001
+1460,9607,8607,139.484,,9001
+1460,9607,8608,-0.415,,9104
+1460,9607,8609,-0.26,,9104
+1460,9607,8610,-0.437,,9104
+1460,9607,8611,-0.613,,9202
+1461,9613,8657,,prvi.las,
+1461,9613,8658,,prvi.los,
+1462,9614,8656,,GS2783v1.QUE,
+1463,9615,8656,,May76v20.gsb,
+1464,9615,8656,,vic_0799.gsb,
+1466,9601,8602,10.43225,,9110
+1467,9601,8602,2.5969213,,9105
+1468,9601,8602,2.201395,,9110
+1469,9603,8605,-125.0,,9001
+1469,9603,8606,53.0,,9001
+1469,9603,8607,467.0,,9001
+1470,9603,8605,-124.76,,9001
+1470,9603,8606,53.0,,9001
+1470,9603,8607,466.79,,9001
+1471,9606,8605,-577.326,,9001
+1471,9606,8606,-90.129,,9001
+1471,9606,8607,-463.919,,9001
+1471,9606,8608,-15.8537,,9113
+1471,9606,8609,-4.55,,9113
+1471,9606,8610,-16.3489,,9113
+1471,9606,8611,-2.4232,,9201
+1472,9615,8656,,NB7783v2.gsb,
+1473,9603,8605,0.0,,9001
+1473,9603,8606,0.0,,9001
+1473,9603,8607,0.0,,9001
+1474,9613,8657,,alhpgn.las,
+1474,9613,8658,,alhpgn.los,
+1475,9613,8657,,azhpgn.las,
+1475,9613,8658,,azhpgn.los,
+1476,9613,8657,,cnhpgn.las,
+1476,9613,8658,,cnhpgn.los,
+1477,9613,8657,,cshpgn.las,
+1477,9613,8658,,cshpgn.los,
+1478,9613,8657,,cohpgn.las,
+1478,9613,8658,,cohpgn.los,
+1479,9613,8657,,gahpgn.las,
+1479,9613,8658,,gahpgn.los,
+1480,9613,8657,,flhpgn.las,
+1480,9613,8658,,flhpgn.los,
+1481,9613,8657,,emhpgn.las,
+1481,9613,8658,,emhpgn.los,
+1482,9613,8657,,wmhpgn.las,
+1482,9613,8658,,wmhpgn.los,
+1483,9613,8657,,kyhpgn.las,
+1483,9613,8658,,kyhpgn.los,
+1484,9613,8657,,lahpgn.las,
+1484,9613,8658,,lahpgn.los,
+1485,9613,8657,,mdhpgn.las,
+1485,9613,8658,,mdhpgn.los,
+1486,9613,8657,,mehpgn.las,
+1486,9613,8658,,mehpgn.los,
+1487,9613,8657,,mihpgn.las,
+1487,9613,8658,,mihpgn.los,
+1488,9613,8657,,mshpgn.las,
+1488,9613,8658,,mshpgn.los,
+1489,9613,8657,,nbhpgn.las,
+1489,9613,8658,,nbhpgn.los,
+1490,9613,8657,,nehpgn.las,
+1490,9613,8658,,nehpgn.los,
+1491,9613,8657,,nmhpgn.las,
+1491,9613,8658,,nmhpgn.los,
+1492,9613,8657,,nyhpgn.las,
+1492,9613,8658,,nyhpgn.los,
+1493,9613,8657,,ndhpgn.las,
+1493,9613,8658,,ndhpgn.los,
+1494,9613,8657,,okhpgn.las,
+1494,9613,8658,,okhpgn.los,
+1495,9613,8657,,pvhpgn.las,
+1495,9613,8658,,pvhpgn.los,
+1496,9613,8657,,sdhpgn.las,
+1496,9613,8658,,sdhpgn.los,
+1497,9613,8657,,tnhpgn.las,
+1497,9613,8658,,tnhpgn.los,
+1498,9613,8657,,ethpgn.las,
+1498,9613,8658,,ethpgn.los,
+1499,9613,8657,,wthpgn.las,
+1499,9613,8658,,wthpgn.los,
+1500,9613,8657,,vahpgn.las,
+1500,9613,8658,,vahpgn.los,
+1501,9613,8657,,wohpgn.las,
+1501,9613,8658,,wohpgn.los,
+1502,9613,8657,,wihpgn.las,
+1502,9613,8658,,wihpgn.los,
+1503,9613,8657,,wyhpgn.las,
+1503,9613,8658,,wyhpgn.los,
+1504,9603,8605,-134.73,,9001
+1504,9603,8606,-110.92,,9001
+1504,9603,8607,-292.66,,9001
+1505,9603,8605,0.0,,9001
+1505,9603,8606,0.0,,9001
+1505,9603,8607,0.0,,9001
+1506,9615,8656,,tas_1098.gsb,
+1507,9615,8656,,nt_0599.gsb,
+1508,9607,8605,660.077,,9001
+1508,9607,8606,13.551,,9001
+1508,9607,8607,369.344,,9001
+1508,9607,8608,2.484,,9113
+1508,9607,8609,1.783,,9113
+1508,9607,8610,2.939,,9113
+1508,9607,8611,5.66,,9201
+1509,9603,8605,674.374,,9001
+1509,9603,8606,15.056,,9001
+1509,9603,8607,405.346,,9001
+1510,9603,8605,674.374,,9001
+1510,9603,8606,15.056,,9001
+1510,9603,8607,405.346,,9001
+1511,9603,8605,0.0,,9001
+1511,9603,8606,0.0,,9001
+1511,9603,8607,0.0,,9001
+1512,9603,8605,-133.63,,9001
+1512,9603,8606,-157.5,,9001
+1512,9603,8607,-158.62,,9001
+1513,9603,8605,-241.54,,9001
+1513,9603,8606,-163.64,,9001
+1513,9603,8607,396.06,,9001
+1514,9606,8605,-110.33,,9001
+1514,9606,8606,-97.73,,9001
+1514,9606,8607,-119.85,,9001
+1514,9606,8608,0.3423,,9104
+1514,9606,8609,1.1634,,9104
+1514,9606,8610,0.2715,,9104
+1514,9606,8611,0.063,,9202
+1515,9607,8605,-0.991,,9001
+1515,9607,8606,1.9072,,9001
+1515,9607,8607,0.5129,,9001
+1515,9607,8608,-0.000000125033,,9101
+1515,9607,8609,-0.000000046785,,9101
+1515,9607,8610,-0.000000056529,,9101
+1515,9607,8611,0.0,,9202
+1516,9603,8605,-273.5,,9001
+1516,9603,8606,110.6,,9001
+1516,9603,8607,-357.9,,9001
+1517,9603,8605,-23.0,,9001
+1517,9603,8606,259.0,,9001
+1517,9603,8607,-9.0,,9001
+1518,9603,8605,-83.0,,9001
+1518,9603,8606,37.0,,9001
+1518,9603,8607,124.0,,9001
+1519,9601,8602,7.26225,,9110
+1520,9613,8657,,hihpgn.las,
+1520,9613,8658,,hihpgn.los,
+1521,9613,8657,,inhpgn.las,
+1521,9613,8658,,inhpgn.los,
+1522,9613,8657,,kshpgn.las,
+1522,9613,8658,,kshpgn.los,
+1523,9613,8657,,nvhpgn.las,
+1523,9613,8658,,nvhpgn.los,
+1524,9613,8657,,ohhpgn.las,
+1524,9613,8658,,ohhpgn.los,
+1525,9613,8657,,uthpgn.las,
+1525,9613,8658,,uthpgn.los,
+1526,9613,8657,,wvhpgn.las,
+1526,9613,8658,,wvhpgn.los,
+1527,9603,8605,-154.5,,9001
+1527,9603,8606,150.7,,9001
+1527,9603,8607,100.4,,9001
+1528,9603,8605,160.0,,9001
+1528,9603,8606,26.0,,9001
+1528,9603,8607,41.0,,9001
+1529,9606,8605,18.38,,9001
+1529,9606,8606,192.45,,9001
+1529,9606,8607,96.82,,9001
+1529,9606,8608,0.056,,9104
+1529,9606,8609,-0.142,,9104
+1529,9606,8610,-0.2,,9104
+1529,9606,8611,-0.0013,,9202
+1530,9603,8605,-4.2,,9001
+1530,9603,8606,135.4,,9001
+1530,9603,8607,181.9,,9001
+1531,9603,8605,-245.0,,9001
+1531,9603,8606,-153.9,,9001
+1531,9603,8607,382.8,,9001
+1532,9603,8605,-80.7,,9001
+1532,9603,8606,-132.5,,9001
+1532,9603,8607,41.1,,9001
+1533,9603,8605,214.0,,9001
+1533,9603,8606,804.0,,9001
+1533,9603,8607,268.0,,9001
+1534,9606,8605,-111.92,,9001
+1534,9606,8606,-87.85,,9001
+1534,9606,8607,114.5,,9001
+1534,9606,8608,1.875,,9104
+1534,9606,8609,0.202,,9104
+1534,9606,8610,0.219,,9104
+1534,9606,8611,0.032,,9201
+1536,9603,8605,-250.2,,9001
+1536,9603,8606,-153.09,,9001
+1536,9603,8607,391.7,,9001
+1537,9603,8605,204.64,,9001
+1537,9603,8606,834.74,,9001
+1537,9603,8607,293.8,,9001
+1538,9603,8605,-260.1,,9001
+1538,9603,8606,5.5,,9001
+1538,9603,8607,432.2,,9001
+1539,9603,8605,-76.0,,9001
+1539,9603,8606,-138.0,,9001
+1539,9603,8607,67.0,,9001
+1540,9603,8605,0.0,,9001
+1540,9603,8606,0.0,,9001
+1540,9603,8607,0.0,,9001
+1541,9603,8605,199.0,,9001
+1541,9603,8606,931.0,,9001
+1541,9603,8607,317.0,,9001
+1542,9603,8605,198.0,,9001
+1542,9603,8606,881.0,,9001
+1542,9603,8607,317.0,,9001
+1543,9603,8605,182.0,,9001
+1543,9603,8606,915.0,,9001
+1543,9603,8607,344.0,,9001
+1544,9603,8605,-17.51,,9001
+1544,9603,8606,-108.32,,9001
+1544,9603,8607,-62.39,,9001
+1545,9603,8605,-121.8,,9001
+1545,9603,8606,98.1,,9001
+1545,9603,8607,-15.2,,9001
+1546,9603,8605,-146.21,,9001
+1546,9603,8606,112.63,,9001
+1546,9603,8607,4.05,,9001
+1547,9603,8605,-173.0,,9001
+1547,9603,8606,253.0,,9001
+1547,9603,8607,27.0,,9001
+1548,9603,8605,-66.87,,9001
+1548,9603,8606,4.37,,9001
+1548,9603,8607,-38.52,,9001
+1549,9603,8605,-158.0,,9001
+1549,9603,8606,315.0,,9001
+1549,9603,8607,-148.0,,9001
+1550,9603,8605,-139.62,,9001
+1550,9603,8606,290.53,,9001
+1550,9603,8607,-150.29,,9001
+1551,9603,8605,-141.15,,9001
+1551,9603,8606,293.44,,9001
+1551,9603,8607,-150.56,,9001
+1552,9603,8605,-142.48,,9001
+1552,9603,8606,296.03,,9001
+1552,9603,8607,-149.74,,9001
+1553,9613,8657,,ilhpgn.las,
+1553,9613,8658,,ilhpgn.los,
+1554,9613,8657,,njhpgn.las,
+1554,9613,8658,,njhpgn.los,
+1555,9603,8605,-0.465,,9001
+1555,9603,8606,372.095,,9001
+1555,9603,8607,171.736,,9001
+1556,9603,8605,-2.0,,9001
+1556,9603,8606,374.0,,9001
+1556,9603,8607,172.0,,9001
+1557,9603,8605,-254.1,,9001
+1557,9603,8606,-5.4,,9001
+1557,9603,8607,-100.3,,9001
+1558,9603,8605,0.0,,9001
+1558,9603,8606,0.0,,9001
+1558,9603,8607,0.0,,9001
+1559,9615,8656,,wa_0400.gsb,
+1560,9603,8605,-156.5,,9001
+1560,9603,8606,-87.2,,9001
+1560,9603,8607,285.9,,9001
+1561,9603,8605,-128.0,,9001
+1561,9603,8606,-283.0,,9001
+1561,9603,8607,22.0,,9001
+1562,9603,8605,-128.16,,9001
+1562,9603,8606,-282.42,,9001
+1562,9603,8607,21.93,,9001
+1563,9603,8605,-128.033,,9001
+1563,9603,8606,-283.697,,9001
+1563,9603,8607,21.052,,9001
+1564,9607,8605,59.47,,9001
+1564,9607,8606,-5.04,,9001
+1564,9607,8607,187.44,,9001
+1564,9607,8608,-0.47,,9104
+1564,9607,8609,0.1,,9104
+1564,9607,8610,-1.024,,9104
+1564,9607,8611,-4.5993,,9202
+1565,9603,8605,0.0,,9001
+1565,9603,8606,0.0,,9001
+1565,9603,8607,0.0,,9001
+1566,9603,8605,54.4,,9001
+1566,9603,8606,-20.1,,9001
+1566,9603,8607,183.1,,9001
+1567,9607,8605,59.47,,9001
+1567,9607,8606,-5.04,,9001
+1567,9607,8607,187.44,,9001
+1567,9607,8608,-0.47,,9104
+1567,9607,8609,0.1,,9104
+1567,9607,8610,1.024,,9104
+1567,9607,8611,-4.5993,,9202
+1568,9615,8656,,nzgd2kgrid0005.gsb,
+1569,9603,8605,-199.0,,9001
+1569,9603,8606,32.0,,9001
+1569,9603,8607,322.0,,9001
+1570,9603,8605,-171.16,,9001
+1570,9603,8606,17.29,,9001
+1570,9603,8607,323.31,,9001
+1571,9607,8605,565.04,,9001
+1571,9607,8606,49.91,,9001
+1571,9607,8607,465.84,,9001
+1571,9607,8608,1.9848,,9109
+1571,9607,8609,-1.7439,,9109
+1571,9607,8610,9.0587,,9109
+1571,9607,8611,4.0772,,9202
+1572,9615,8656,,NAD83-98.gsb,
+1573,9615,8656,,QUE27-83.gsb,
+1574,9615,8656,,QUE27-98.gsb,
+1575,9615,8656,,CGQ77-83.gsb,
+1576,9615,8656,,CGQ77-98.gsb,
+1577,9603,8605,-115.0,,9001
+1577,9603,8606,118.0,,9001
+1577,9603,8607,426.0,,9001
+1578,9613,8657,,wshpgn.las,
+1578,9613,8658,,wshpgn.los,
+1579,9613,8657,,eshpgn.las,
+1579,9613,8658,,eshpgn.los,
+1580,9603,8605,0.0,,9001
+1580,9603,8606,0.0,,9001
+1580,9603,8607,0.0,,9001
+1581,9603,8605,0.0,,9001
+1581,9603,8606,0.0,,9001
+1581,9603,8607,0.0,,9001
+1582,9603,8605,-259.73,,9001
+1582,9603,8606,173.12,,9001
+1582,9603,8607,-398.27,,9001
+1583,9603,8605,-307.7,,9001
+1583,9603,8606,265.3,,9001
+1583,9603,8607,-363.5,,9001
+1584,9603,8605,-174.6,,9001
+1584,9603,8606,-3.1,,9001
+1584,9603,8607,236.2,,9001
+1585,9603,8605,-177.5,,9001
+1585,9603,8606,14.1,,9001
+1585,9603,8607,237.6,,9001
+1586,9606,8605,-175.09,,9001
+1586,9606,8606,1.218,,9001
+1586,9606,8607,238.831,,9001
+1586,9606,8608,-0.047,,9104
+1586,9606,8609,0.019,,9104
+1586,9606,8610,0.808,,9104
+1586,9606,8611,0.1698,,9202
+1587,9603,8605,-191.77,,9001
+1587,9603,8606,15.01,,9001
+1587,9603,8607,235.07,,9001
+1588,9606,8605,-116.641,,9001
+1588,9606,8606,-56.931,,9001
+1588,9606,8607,-110.559,,9001
+1588,9606,8608,4.327,,9109
+1588,9606,8609,4.464,,9109
+1588,9606,8610,-4.444,,9109
+1588,9606,8611,-3.52,,9202
+1589,9620,8659,1588.0,,
+1589,9620,8660,8570.0,,
+1589,9620,8661,,ED50 to ETRF89 (1),
+1589,9620,8662,,ED50 to ETRF89 (2),
+1590,9620,8659,8569.0,,
+1590,9620,8660,8046.0,,
+1590,9620,8661,,ED50 to WGS 84 (21),
+1590,9620,8662,,ED50 to WGS 84 (14),
+1591,9603,8605,0.0,,9001
+1591,9603,8606,0.0,,9001
+1591,9603,8607,0.0,,9001
+1592,9603,8605,-678.0,,9001
+1592,9603,8606,670.0,,9001
+1592,9603,8607,-48.0,,9001
+1593,9615,8656,,wa_0700.gsb,
+1594,9607,8605,-120.271,,9001
+1594,9607,8606,-64.543,,9001
+1594,9607,8607,161.632,,9001
+1594,9607,8608,-0.217,,9104
+1594,9607,8609,0.067,,9104
+1594,9607,8610,0.129,,9104
+1594,9607,8611,2.499,,9202
+1595,9607,8605,-124.133,,9001
+1595,9607,8606,-42.003,,9001
+1595,9607,8607,137.4,,9001
+1595,9607,8608,0.008,,9104
+1595,9607,8609,-0.557,,9104
+1595,9607,8610,-0.178,,9104
+1595,9607,8611,-1.854,,9202
+1596,9615,8656,,SEAust_21_06_00.gsb,
+1597,9603,8605,304.5,,9001
+1597,9603,8606,306.5,,9001
+1597,9603,8607,-318.1,,9001
+1598,9603,8605,0.0,,9001
+1598,9603,8606,0.0,,9001
+1598,9603,8607,0.0,,9001
+1599,9615,8656,,PE7783V2.gsb,
+1600,9615,8656,,SK27-98.gsb,
+1601,9615,8656,,SK83-98.gsb,
+1602,9615,8656,,AB_CSRS.DAC,
+1603,9634,8665,,TRNB2777.DAT,
+1604,9634,8665,,TRNS2777.DAT,
+1605,9634,8665,,TRPE2777.DAT,
+1606,9634,8665,,TRNB2777.DAT,
+1607,9634,8665,,TRNS2777.DAT,
+1608,9634,8665,,TRPE2777.DAT,
+1609,9607,8605,-99.059,,9001
+1609,9607,8606,53.322,,9001
+1609,9607,8607,-112.486,,9001
+1609,9607,8608,-0.419,,9104
+1609,9607,8609,0.83,,9104
+1609,9607,8610,-1.885,,9104
+1609,9607,8611,0.999999,,9201
+1610,9603,8605,-125.8,,9001
+1610,9603,8606,79.9,,9001
+1610,9603,8607,-100.5,,9001
+1611,9603,8605,0.0,,9001
+1611,9603,8606,0.0,,9001
+1611,9603,8607,0.0,,9001
+1612,9606,8605,-116.641,,9001
+1612,9606,8606,-56.931,,9001
+1612,9606,8607,-110.559,,9001
+1612,9606,8608,0.893,,9104
+1612,9606,8609,0.921,,9104
+1612,9606,8610,-0.917,,9104
+1612,9606,8611,-3.52,,9202
+1613,9606,8605,-90.365,,9001
+1613,9606,8606,-101.13,,9001
+1613,9606,8607,-123.384,,9001
+1613,9606,8608,0.333,,9104
+1613,9606,8609,0.077,,9104
+1613,9606,8610,0.894,,9104
+1613,9606,8611,1.994,,9202
+1614,9603,8605,-88.0,,9001
+1614,9603,8606,4.0,,9001
+1614,9603,8607,101.0,,9001
+1615,9603,8605,-726.282,,9001
+1615,9603,8606,703.611,,9001
+1615,9603,8607,-48.999,,9001
+1616,9606,8605,-182.046,,9001
+1616,9606,8606,-225.604,,9001
+1616,9606,8607,168.884,,9001
+1616,9606,8608,-0.616,,9104
+1616,9606,8609,-1.655,,9104
+1616,9606,8610,7.824,,9104
+1616,9606,8611,16.641,,9202
+1617,9606,8605,-191.808,,9001
+1617,9606,8606,-250.512,,9001
+1617,9606,8607,167.861,,9001
+1617,9606,8608,-0.792,,9104
+1617,9606,8609,-1.653,,9104
+1617,9606,8610,8.558,,9104
+1617,9606,8611,20.703,,9202
+1618,9606,8605,577.326,,9001
+1618,9606,8606,90.129,,9001
+1618,9606,8607,463.919,,9001
+1618,9606,8608,5.137,,9104
+1618,9606,8609,1.474,,9104
+1618,9606,8610,5.297,,9104
+1618,9606,8611,2.4232,,9202
+1619,9606,8605,577.3,,9001
+1619,9606,8606,90.1,,9001
+1619,9606,8607,463.9,,9001
+1619,9606,8608,5.137,,9104
+1619,9606,8609,1.474,,9104
+1619,9606,8610,5.297,,9104
+1619,9606,8611,2.42,,9202
+1620,9606,8605,551.7,,9001
+1620,9606,8606,162.9,,9001
+1620,9606,8607,467.9,,9001
+1620,9606,8608,6.04,,9104
+1620,9606,8609,1.96,,9104
+1620,9606,8610,-11.38,,9104
+1620,9606,8611,-4.82,,9202
+1621,9606,8605,551.7,,9001
+1621,9606,8606,162.9,,9001
+1621,9606,8607,467.9,,9001
+1621,9606,8608,6.04,,9104
+1621,9606,8609,1.96,,9104
+1621,9606,8610,-11.38,,9104
+1621,9606,8611,-4.82,,9202
+1622,9606,8605,570.8,,9001
+1622,9606,8606,85.7,,9001
+1622,9606,8607,462.8,,9001
+1622,9606,8608,4.998,,9104
+1622,9606,8609,1.587,,9104
+1622,9606,8610,5.261,,9104
+1622,9606,8611,3.56,,9202
+1623,9606,8605,570.8,,9001
+1623,9606,8606,85.7,,9001
+1623,9606,8607,462.8,,9001
+1623,9606,8608,4.998,,9104
+1623,9606,8609,1.587,,9104
+1623,9606,8610,5.261,,9104
+1623,9606,8611,3.56,,9202
+1624,9606,8605,559.0,,9001
+1624,9606,8606,68.7,,9001
+1624,9606,8607,451.5,,9001
+1624,9606,8608,7.92,,9104
+1624,9606,8609,4.073,,9104
+1624,9606,8610,4.251,,9104
+1624,9606,8611,5.71,,9202
+1625,9606,8605,559.0,,9001
+1625,9606,8606,68.7,,9001
+1625,9606,8607,451.5,,9001
+1625,9606,8608,7.92,,9104
+1625,9606,8609,4.073,,9104
+1625,9606,8610,4.251,,9104
+1625,9606,8611,5.71,,9202
+1626,9606,8605,-81.1,,9001
+1626,9606,8606,-89.4,,9001
+1626,9606,8607,-115.8,,9001
+1626,9606,8608,0.485,,9104
+1626,9606,8609,0.024,,9104
+1626,9606,8610,0.413,,9104
+1626,9606,8611,-0.54,,9202
+1627,9606,8605,-81.1,,9001
+1627,9606,8606,-89.4,,9001
+1627,9606,8607,-115.8,,9001
+1627,9606,8608,0.485,,9104
+1627,9606,8609,0.024,,9104
+1627,9606,8610,0.413,,9104
+1627,9606,8611,-0.54,,9202
+1628,9603,8605,-116.8,,9001
+1628,9603,8606,-106.4,,9001
+1628,9603,8607,-154.4,,9001
+1629,9603,8605,-116.8,,9001
+1629,9603,8606,-106.4,,9001
+1629,9603,8607,-154.4,,9001
+1630,9606,8605,-181.5,,9001
+1630,9606,8606,-90.3,,9001
+1630,9606,8607,-187.2,,9001
+1630,9606,8608,0.144,,9104
+1630,9606,8609,0.492,,9104
+1630,9606,8610,-0.394,,9104
+1630,9606,8611,17.57,,9202
+1631,9606,8605,-181.5,,9001
+1631,9606,8606,-90.3,,9001
+1631,9606,8607,-187.2,,9001
+1631,9606,8608,0.144,,9104
+1631,9606,8609,0.492,,9104
+1631,9606,8610,-0.394,,9104
+1631,9606,8611,17.57,,9202
+1632,9606,8605,-131.0,,9001
+1632,9606,8606,-100.3,,9001
+1632,9606,8607,-163.4,,9001
+1632,9606,8608,-1.244,,9104
+1632,9606,8609,-0.02,,9104
+1632,9606,8610,-1.144,,9104
+1632,9606,8611,9.39,,9202
+1633,9606,8605,-131.0,,9001
+1633,9606,8606,-100.3,,9001
+1633,9606,8607,-163.4,,9001
+1633,9606,8608,-1.244,,9104
+1633,9606,8609,-0.02,,9104
+1633,9606,8610,-1.144,,9104
+1633,9606,8611,9.39,,9202
+1634,9606,8605,-178.4,,9001
+1634,9606,8606,-83.2,,9001
+1634,9606,8607,-221.3,,9001
+1634,9606,8608,0.54,,9104
+1634,9606,8609,-0.532,,9104
+1634,9606,8610,-0.126,,9104
+1634,9606,8611,21.2,,9202
+1635,9606,8605,-178.4,,9001
+1635,9606,8606,-83.2,,9001
+1635,9606,8607,-221.3,,9001
+1635,9606,8608,0.54,,9104
+1635,9606,8609,-0.532,,9104
+1635,9606,8610,-0.126,,9104
+1635,9606,8611,21.2,,9202
+1638,9606,8605,-90.7,,9001
+1638,9606,8606,-106.1,,9001
+1638,9606,8607,-119.2,,9001
+1638,9606,8608,4.09,,9104
+1638,9606,8609,0.218,,9104
+1638,9606,8610,-1.05,,9104
+1638,9606,8611,1.37,,9202
+1639,9606,8605,-90.7,,9001
+1639,9606,8606,-106.1,,9001
+1639,9606,8607,-119.2,,9001
+1639,9606,8608,4.09,,9104
+1639,9606,8609,0.218,,9104
+1639,9606,8610,-1.05,,9104
+1639,9606,8611,1.37,,9202
+1640,9606,8605,482.5,,9001
+1640,9606,8606,-130.6,,9001
+1640,9606,8607,564.6,,9001
+1640,9606,8608,-1.042,,9104
+1640,9606,8609,-0.214,,9104
+1640,9606,8610,-0.631,,9104
+1640,9606,8611,8.15,,9202
+1641,9606,8605,482.5,,9001
+1641,9606,8606,-130.6,,9001
+1641,9606,8607,564.6,,9001
+1641,9606,8608,-1.042,,9104
+1641,9606,8609,-0.214,,9104
+1641,9606,8610,-0.631,,9104
+1641,9606,8611,8.15,,9202
+1642,9606,8605,-193.0,,9001
+1642,9606,8606,13.7,,9001
+1642,9606,8607,-39.3,,9001
+1642,9606,8608,-0.41,,9104
+1642,9606,8609,-2.933,,9104
+1642,9606,8610,2.688,,9104
+1642,9606,8611,0.43,,9202
+1643,9606,8605,-193.0,,9001
+1643,9606,8606,13.7,,9001
+1643,9606,8607,-39.3,,9001
+1643,9606,8608,-0.41,,9104
+1643,9606,8609,-2.933,,9104
+1643,9606,8610,2.688,,9104
+1643,9606,8611,0.43,,9202
+1644,9606,8605,33.4,,9001
+1644,9606,8606,-146.6,,9001
+1644,9606,8607,-76.3,,9001
+1644,9606,8608,-0.359,,9104
+1644,9606,8609,-0.053,,9104
+1644,9606,8610,0.844,,9104
+1644,9606,8611,-0.84,,9202
+1645,9606,8605,33.4,,9001
+1645,9606,8606,-146.6,,9001
+1645,9606,8607,-76.3,,9001
+1645,9606,8608,-0.359,,9104
+1645,9606,8609,-0.053,,9104
+1645,9606,8610,0.844,,9104
+1645,9606,8611,-0.84,,9202
+1646,9603,8605,674.4,,9001
+1646,9603,8606,15.1,,9001
+1646,9603,8607,405.3,,9001
+1647,9603,8605,674.374,,9001
+1647,9603,8606,15.056,,9001
+1647,9603,8607,405.346,,9001
+1648,9603,8605,0.0,,9001
+1648,9603,8606,0.0,,9001
+1648,9603,8607,0.0,,9001
+1649,9603,8605,0.0,,9001
+1649,9603,8606,0.0,,9001
+1649,9603,8607,0.0,,9001
+1650,9603,8605,-84.0,,9001
+1650,9603,8606,-97.0,,9001
+1650,9603,8607,-117.0,,9001
+1651,9603,8605,-168.0,,9001
+1651,9603,8606,-60.0,,9001
+1651,9603,8607,320.0,,9001
+1652,9606,8605,-99.1,,9001
+1652,9606,8606,53.3,,9001
+1652,9606,8607,-112.5,,9001
+1652,9606,8608,0.419,,9104
+1652,9606,8609,-0.83,,9104
+1652,9606,8610,1.885,,9104
+1652,9606,8611,-1.0,,9202
+1653,9606,8605,278.3,,9001
+1653,9606,8606,93.0,,9001
+1653,9606,8607,474.5,,9001
+1653,9606,8608,7.889,,9104
+1653,9606,8609,0.05,,9104
+1653,9606,8610,-6.61,,9104
+1653,9606,8611,6.21,,9202
+1654,9606,8605,278.3,,9001
+1654,9606,8606,93.0,,9001
+1654,9606,8607,474.5,,9001
+1654,9606,8608,7.889,,9104
+1654,9606,8609,0.05,,9104
+1654,9606,8610,-6.61,,9104
+1654,9606,8611,6.21,,9202
+1655,9606,8605,-280.9,,9001
+1655,9606,8606,-89.8,,9001
+1655,9606,8607,130.2,,9001
+1655,9606,8608,-1.721,,9104
+1655,9606,8609,0.355,,9104
+1655,9606,8610,-0.371,,9104
+1655,9606,8611,-5.92,,9202
+1656,9606,8605,-280.9,,9001
+1656,9606,8606,-89.8,,9001
+1656,9606,8607,130.2,,9001
+1656,9606,8608,-1.721,,9104
+1656,9606,8609,0.355,,9104
+1656,9606,8610,-0.371,,9104
+1656,9606,8611,-5.92,,9202
+1657,9606,8605,-238.2,,9001
+1657,9606,8606,85.2,,9001
+1657,9606,8607,29.9,,9001
+1657,9606,8608,0.166,,9104
+1657,9606,8609,0.046,,9104
+1657,9606,8610,1.248,,9104
+1657,9606,8611,2.03,,9202
+1658,9606,8605,-238.2,,9001
+1658,9606,8606,85.2,,9001
+1658,9606,8607,29.9,,9001
+1658,9606,8608,0.166,,9104
+1658,9606,8609,0.046,,9104
+1658,9606,8610,1.248,,9104
+1658,9606,8611,2.03,,9202
+1659,9606,8605,-104.1,,9001
+1659,9606,8606,-49.1,,9001
+1659,9606,8607,-9.9,,9001
+1659,9606,8608,0.971,,9104
+1659,9606,8609,-2.917,,9104
+1659,9606,8610,0.714,,9104
+1659,9606,8611,-11.68,,9202
+1660,9606,8605,-104.1,,9001
+1660,9606,8606,-49.1,,9001
+1660,9606,8607,-9.9,,9001
+1660,9606,8608,0.971,,9104
+1660,9606,8609,-2.917,,9104
+1660,9606,8610,0.714,,9104
+1660,9606,8611,-11.68,,9202
+1661,9606,8605,-168.6,,9001
+1661,9606,8606,-34.0,,9001
+1661,9606,8607,38.6,,9001
+1661,9606,8608,-0.374,,9104
+1661,9606,8609,-0.679,,9104
+1661,9606,8610,-1.379,,9104
+1661,9606,8611,-9.48,,9202
+1662,9606,8605,-168.6,,9001
+1662,9606,8606,-34.0,,9001
+1662,9606,8607,38.6,,9001
+1662,9606,8608,-0.374,,9104
+1662,9606,8609,-0.679,,9104
+1662,9606,8610,-1.379,,9104
+1662,9606,8611,-9.48,,9202
+1663,9606,8605,-50.2,,9001
+1663,9606,8606,-50.4,,9001
+1663,9606,8607,84.8,,9001
+1663,9606,8608,-0.69,,9104
+1663,9606,8609,-2.012,,9104
+1663,9606,8610,0.459,,9104
+1663,9606,8611,-28.08,,9202
+1664,9606,8605,-50.2,,9001
+1664,9606,8606,-50.4,,9001
+1664,9606,8607,84.8,,9001
+1664,9606,8608,-0.69,,9104
+1664,9606,8609,-2.012,,9104
+1664,9606,8610,0.459,,9104
+1664,9606,8611,-28.08,,9202
+1665,9607,8605,-129.193,,9001
+1665,9607,8606,-41.212,,9001
+1665,9607,8607,130.73,,9001
+1665,9607,8608,-0.246,,9104
+1665,9607,8609,-0.374,,9104
+1665,9607,8610,-0.329,,9104
+1665,9607,8611,-2.955,,9202
+1666,9607,8605,-119.353,,9001
+1666,9607,8606,-48.301,,9001
+1666,9607,8607,139.484,,9001
+1666,9607,8608,-0.415,,9104
+1666,9607,8609,-0.26,,9104
+1666,9607,8610,-0.437,,9104
+1666,9607,8611,-0.613,,9202
+1667,9607,8605,-120.271,,9001
+1667,9607,8606,-64.543,,9001
+1667,9607,8607,161.632,,9001
+1667,9607,8608,-0.217,,9104
+1667,9607,8609,0.067,,9104
+1667,9607,8610,0.129,,9104
+1667,9607,8611,2.499,,9202
+1668,9607,8605,-124.133,,9001
+1668,9607,8606,-42.003,,9001
+1668,9607,8607,137.4,,9001
+1668,9607,8608,0.008,,9104
+1668,9607,8609,-0.557,,9104
+1668,9607,8610,-0.178,,9104
+1668,9607,8611,-1.854,,9202
+1669,9607,8605,-117.763,,9001
+1669,9607,8606,-51.51,,9001
+1669,9607,8607,139.061,,9001
+1669,9607,8608,-0.292,,9104
+1669,9607,8609,-0.443,,9104
+1669,9607,8610,-0.277,,9104
+1669,9607,8611,-0.191,,9202
+1670,9615,8656,,nzgd2kgrid0005.gsb,
+1671,9603,8605,0.0,,9001
+1671,9603,8606,0.0,,9001
+1671,9603,8607,0.0,,9001
+1672,9607,8605,565.04,,9001
+1672,9607,8606,49.91,,9001
+1672,9607,8607,465.84,,9001
+1672,9607,8608,1.9848,,9109
+1672,9607,8609,-1.7439,,9109
+1672,9607,8610,9.0587,,9109
+1672,9607,8611,4.0772,,9202
+1673,9607,8605,582.0,,9001
+1673,9607,8606,105.0,,9001
+1673,9607,8607,414.0,,9001
+1673,9607,8608,-1.04,,9104
+1673,9607,8609,-0.35,,9104
+1673,9607,8610,3.08,,9104
+1673,9607,8611,8.3,,9202
+1674,9607,8605,24.0,,9001
+1674,9607,8606,-123.0,,9001
+1674,9607,8607,-94.0,,9001
+1674,9607,8608,-0.02,,9104
+1674,9607,8609,0.25,,9104
+1674,9607,8610,0.13,,9104
+1674,9607,8611,1.1,,9202
+1675,9607,8605,24.0,,9001
+1675,9607,8606,-123.0,,9001
+1675,9607,8607,-94.0,,9001
+1675,9607,8608,-0.02,,9104
+1675,9607,8609,0.25,,9104
+1675,9607,8610,0.13,,9104
+1675,9607,8611,1.1,,9202
+1676,9603,8605,674.374,,9001
+1676,9603,8606,15.056,,9001
+1676,9603,8607,405.346,,9001
+1677,9607,8605,56.0,,9001
+1677,9607,8606,75.77,,9001
+1677,9607,8607,15.31,,9001
+1677,9607,8608,-0.37,,9104
+1677,9607,8609,-0.2,,9104
+1677,9607,8610,-0.21,,9104
+1677,9607,8611,-1.01,,9202
+1678,9603,8605,0.0,,9001
+1678,9603,8606,0.0,,9001
+1678,9603,8607,0.0,,9001
+1679,9607,8605,-40.595,,9001
+1679,9607,8606,-18.55,,9001
+1679,9607,8607,-69.339,,9001
+1679,9607,8608,-2.508,,9104
+1679,9607,8609,-1.832,,9104
+1679,9607,8610,2.611,,9104
+1679,9607,8611,-4.299,,9202
+1680,9607,8605,419.3836,,9001
+1680,9607,8606,99.3335,,9001
+1680,9607,8607,591.3451,,9001
+1680,9607,8608,-0.850389,,9104
+1680,9607,8609,-1.817277,,9104
+1680,9607,8610,7.862238,,9104
+1680,9607,8611,-0.99496,,9202
+1681,9633,8664,,ostn97.txt,
+1682,9603,8605,-76.0,,9001
+1682,9603,8606,-138.0,,9001
+1682,9603,8607,67.0,,9001
+1683,9607,8605,-115.064,,9001
+1683,9607,8606,-87.39,,9001
+1683,9607,8607,-101.716,,9001
+1683,9607,8608,0.058,,9104
+1683,9607,8609,-4.001,,9104
+1683,9607,8610,2.062,,9104
+1683,9607,8611,9.366,,9202
+1684,9607,8605,-82.875,,9001
+1684,9607,8606,-57.097,,9001
+1684,9607,8607,-156.768,,9001
+1684,9607,8608,2.158,,9104
+1684,9607,8609,-1.524,,9104
+1684,9607,8610,0.982,,9104
+1684,9607,8611,-0.359,,9202
+1685,9607,8605,-138.527,,9001
+1685,9607,8606,-91.999,,9001
+1685,9607,8607,-114.591,,9001
+1685,9607,8608,0.14,,9104
+1685,9607,8609,-3.363,,9104
+1685,9607,8610,2.217,,9104
+1685,9607,8611,11.748,,9202
+1686,9607,8605,-73.472,,9001
+1686,9607,8606,-51.66,,9001
+1686,9607,8607,-112.482,,9001
+1686,9607,8608,-0.953,,9104
+1686,9607,8609,-4.6,,9104
+1686,9607,8610,2.368,,9104
+1686,9607,8611,0.586,,9202
+1687,9607,8605,219.315,,9001
+1687,9607,8606,168.975,,9001
+1687,9607,8607,-166.145,,9001
+1687,9607,8608,-0.198,,9104
+1687,9607,8609,-5.926,,9104
+1687,9607,8610,2.356,,9104
+1687,9607,8611,-57.104,,9202
+1688,9615,8656,,NB7783v2.gsb,
+1689,9615,8656,,PE7783V2.gsb,
+1690,9615,8656,,May76v20.gsb,
+1691,9615,8656,,CGQ77-98.gsb,
+1692,9615,8656,,QUE27-98.gsb,
+1693,9615,8656,,NTv2_0.gsb,
+1694,9613,8657,,wshpgn.las,
+1694,9613,8658,,wshpgn.los,
+1695,9613,8657,,eshpgn.las,
+1695,9613,8658,,eshpgn.los,
+1696,9615,8656,,NAD83-98.gsb,
+1697,9615,8656,,SK83-98.gsb,
+1698,9613,8657,,stgeorge.las,
+1698,9613,8658,,stgeorge.los,
+1699,9613,8657,,stlrnc.las,
+1699,9613,8658,,stlrnc.los,
+1700,9613,8657,,stpaul.las,
+1700,9613,8658,,stpaul.los,
+1701,9607,8605,59.47,,9001
+1701,9607,8606,-5.04,,9001
+1701,9607,8607,187.44,,9001
+1701,9607,8608,-0.47,,9104
+1701,9607,8609,0.1,,9104
+1701,9607,8610,-1.024,,9104
+1701,9607,8611,-4.5993,,9202
+1702,9615,8656,,AB_CSRS.DAC,
+1703,9615,8656,,SK27-98.gsb,
+1704,9613,8657,,arhpgn.las,
+1704,9613,8658,,arhpgn.los,
+1705,9613,8657,,iahpgn.las,
+1705,9613,8658,,iahpgn.los,
+1706,9613,8657,,mnhpgn.las,
+1706,9613,8658,,mnhpgn.los,
+1707,9613,8657,,mohpgn.las,
+1707,9613,8658,,mohpgn.los,
+1708,9613,8657,,arhpgn.las,
+1708,9613,8658,,arhpgn.los,
+1709,9613,8657,,iahpgn.las,
+1709,9613,8658,,iahpgn.los,
+1710,9613,8657,,mnhpgn.las,
+1710,9613,8658,,mnhpgn.los,
+1711,9613,8657,,mohpgn.las,
+1711,9613,8658,,mohpgn.los,
+1712,9613,8657,,cohpgn.las,
+1712,9613,8658,,cohpgn.los,
+1713,9613,8657,,gahpgn.las,
+1713,9613,8658,,gahpgn.los,
+1714,9613,8657,,flhpgn.las,
+1714,9613,8658,,flhpgn.los,
+1715,9613,8657,,emhpgn.las,
+1715,9613,8658,,emhpgn.los,
+1716,9613,8657,,wmhpgn.las,
+1716,9613,8658,,wmhpgn.los,
+1717,9613,8657,,alhpgn.las,
+1717,9613,8658,,alhpgn.los,
+1718,9613,8657,,kyhpgn.las,
+1718,9613,8658,,kyhpgn.los,
+1719,9613,8657,,lahpgn.las,
+1719,9613,8658,,lahpgn.los,
+1720,9613,8657,,mdhpgn.las,
+1720,9613,8658,,mdhpgn.los,
+1721,9613,8657,,mehpgn.las,
+1721,9613,8658,,mehpgn.los,
+1722,9613,8657,,mihpgn.las,
+1722,9613,8658,,mihpgn.los,
+1723,9613,8657,,mshpgn.las,
+1723,9613,8658,,mshpgn.los,
+1724,9613,8657,,nbhpgn.las,
+1724,9613,8658,,nbhpgn.los,
+1725,9613,8657,,nehpgn.las,
+1725,9613,8658,,nehpgn.los,
+1726,9613,8657,,nmhpgn.las,
+1726,9613,8658,,nmhpgn.los,
+1727,9613,8657,,nyhpgn.las,
+1727,9613,8658,,nyhpgn.los,
+1728,9613,8657,,azhpgn.las,
+1728,9613,8658,,azhpgn.los,
+1729,9613,8657,,ndhpgn.las,
+1729,9613,8658,,ndhpgn.los,
+1730,9613,8657,,okhpgn.las,
+1730,9613,8658,,okhpgn.los,
+1731,9613,8657,,pvhpgn.las,
+1731,9613,8658,,pvhpgn.los,
+1732,9613,8657,,sdhpgn.las,
+1732,9613,8658,,sdhpgn.los,
+1733,9613,8657,,tnhpgn.las,
+1733,9613,8658,,tnhpgn.los,
+1734,9613,8657,,ethpgn.las,
+1734,9613,8658,,ethpgn.los,
+1735,9613,8657,,wthpgn.las,
+1735,9613,8658,,wthpgn.los,
+1736,9613,8657,,vahpgn.las,
+1736,9613,8658,,vahpgn.los,
+1737,9613,8657,,wohpgn.las,
+1737,9613,8658,,wohpgn.los,
+1738,9613,8657,,wihpgn.las,
+1738,9613,8658,,wihpgn.los,
+1739,9613,8657,,cnhpgn.las,
+1739,9613,8658,,cnhpgn.los,
+1740,9613,8657,,wyhpgn.las,
+1740,9613,8658,,wyhpgn.los,
+1741,9613,8657,,hihpgn.las,
+1741,9613,8658,,hihpgn.los,
+1742,9613,8657,,inhpgn.las,
+1742,9613,8658,,inhpgn.los,
+1743,9613,8657,,kshpgn.las,
+1743,9613,8658,,kshpgn.los,
+1744,9613,8657,,nvhpgn.las,
+1744,9613,8658,,nvhpgn.los,
+1745,9613,8657,,ohhpgn.las,
+1745,9613,8658,,ohhpgn.los,
+1746,9613,8657,,uthpgn.las,
+1746,9613,8658,,uthpgn.los,
+1747,9613,8657,,wvhpgn.las,
+1747,9613,8658,,wvhpgn.los,
+1748,9613,8657,,ilhpgn.las,
+1748,9613,8658,,ilhpgn.los,
+1749,9613,8657,,njhpgn.las,
+1749,9613,8658,,njhpgn.los,
+1750,9613,8657,,cshpgn.las,
+1750,9613,8658,,cshpgn.los,
+1751,9607,8605,565.04,,9001
+1751,9607,8606,49.91,,9001
+1751,9607,8607,465.84,,9001
+1751,9607,8608,1.9848,,9109
+1751,9607,8609,-1.7439,,9109
+1751,9607,8610,9.0587,,9109
+1751,9607,8611,4.0772,,9202
+1752,9615,8656,,AB_CSRS.DAC,
+1753,9607,8605,660.077,,9001
+1753,9607,8606,13.551,,9001
+1753,9607,8607,369.344,,9001
+1753,9607,8608,2.484,,9113
+1753,9607,8609,1.783,,9113
+1753,9607,8610,2.939,,9113
+1753,9607,8611,5.66,,9202
+1754,9606,8605,-111.92,,9001
+1754,9606,8606,-87.85,,9001
+1754,9606,8607,114.5,,9001
+1754,9606,8608,1.875,,9104
+1754,9606,8609,0.202,,9104
+1754,9606,8610,0.219,,9104
+1754,9606,8611,0.032,,9202
+1755,9601,8602,-74.04513,,9110
+1756,9601,8602,-9.0754862,,9110
+1757,9601,8602,-17.4,,9110
+1758,9601,8602,106.482779,,9110
+1759,9601,8602,106.482779,,9110
+1760,9601,8602,18.03298,,9110
+1761,9601,8602,23.4258815,,9110
+1762,9601,8602,10.43225,,9110
+1763,9601,8602,2.5969213,,9105
+1764,9601,8602,2.201395,,9110
+1765,9601,8602,7.26225,,9110
+1766,9603,8605,674.4,,9001
+1766,9603,8606,15.1,,9001
+1766,9603,8607,405.3,,9001
+1767,9603,8605,0.0,,9001
+1767,9603,8606,0.0,,9001
+1767,9603,8607,0.0,,9001
+1768,9603,8605,0.0,,9001
+1768,9603,8606,0.0,,9001
+1768,9603,8607,0.0,,9001
+1769,9636,8605,-270.933,,9001
+1769,9636,8606,115.599,,9001
+1769,9636,8607,-360.226,,9001
+1769,9636,8608,-5.266,,9104
+1769,9636,8609,-1.238,,9104
+1769,9636,8610,2.381,,9104
+1769,9636,8611,-5.109,,9202
+1769,9636,8617,2464351.59,,9001
+1769,9636,8618,-5783466.61,,9001
+1769,9636,8667,974809.81,,9001
+1770,9636,8605,-270.933,,9001
+1770,9636,8606,115.599,,9001
+1770,9636,8607,-360.226,,9001
+1770,9636,8608,-5.266,,9104
+1770,9636,8609,-1.238,,9104
+1770,9636,8610,2.381,,9104
+1770,9636,8611,-5.109,,9202
+1770,9636,8617,2464351.59,,9001
+1770,9636,8618,-5783466.61,,9001
+1770,9636,8667,974809.81,,9001
+1771,9636,8605,-270.933,,9001
+1771,9636,8606,115.599,,9001
+1771,9636,8607,-360.226,,9001
+1771,9636,8608,-5.266,,9104
+1771,9636,8609,-1.238,,9104
+1771,9636,8610,2.381,,9104
+1771,9636,8611,-5.109,,9202
+1771,9636,8617,2464351.59,,9001
+1771,9636,8618,-5783466.61,,9001
+1771,9636,8667,974809.81,,9001
+1772,9636,8605,-270.933,,9001
+1772,9636,8606,115.599,,9001
+1772,9636,8607,-360.226,,9001
+1772,9636,8608,-5.266,,9104
+1772,9636,8609,-1.238,,9104
+1772,9636,8610,2.381,,9104
+1772,9636,8611,-5.109,,9202
+1772,9636,8617,2464351.59,,9001
+1772,9636,8618,-5783466.61,,9001
+1772,9636,8667,974809.81,,9001
+1773,9603,8605,0.0,,9001
+1773,9603,8606,0.0,,9001
+1773,9603,8607,0.0,,9001
+1774,9603,8605,0.0,,9001
+1774,9603,8606,0.0,,9001
+1774,9603,8607,0.0,,9001
+1775,9606,8605,24.9,,9001
+1775,9606,8606,-126.4,,9001
+1775,9606,8607,-93.2,,9001
+1775,9606,8608,-0.063,,9104
+1775,9606,8609,-0.247,,9104
+1775,9606,8610,-0.041,,9104
+1775,9606,8611,1.01,,9202
+1776,9606,8605,598.1,,9001
+1776,9606,8606,73.7,,9001
+1776,9606,8607,418.2,,9001
+1776,9606,8608,0.202,,9104
+1776,9606,8609,0.045,,9104
+1776,9606,8610,-2.455,,9104
+1776,9606,8611,6.7,,9202
+1777,9606,8605,598.1,,9001
+1777,9606,8606,73.7,,9001
+1777,9606,8607,418.2,,9001
+1777,9606,8608,0.202,,9104
+1777,9606,8609,0.045,,9104
+1777,9606,8610,-2.455,,9104
+1777,9606,8611,6.7,,9202
+1778,9606,8605,597.1,,9001
+1778,9606,8606,71.4,,9001
+1778,9606,8607,412.1,,9001
+1778,9606,8608,0.894,,9104
+1778,9606,8609,0.068,,9104
+1778,9606,8610,-1.563,,9104
+1778,9606,8611,7.58,,9202
+1779,9606,8605,584.8,,9001
+1779,9606,8606,67.0,,9001
+1779,9606,8607,400.3,,9001
+1779,9606,8608,0.105,,9104
+1779,9606,8609,0.013,,9104
+1779,9606,8610,-2.378,,9104
+1779,9606,8611,10.29,,9202
+1780,9606,8605,590.5,,9001
+1780,9606,8606,69.5,,9001
+1780,9606,8607,411.6,,9001
+1780,9606,8608,-0.796,,9104
+1780,9606,8609,-0.052,,9104
+1780,9606,8610,-3.601,,9104
+1780,9606,8611,8.3,,9202
+1781,9606,8605,599.4,,9001
+1781,9606,8606,72.4,,9001
+1781,9606,8607,419.2,,9001
+1781,9606,8608,-0.062,,9104
+1781,9606,8609,-0.022,,9104
+1781,9606,8610,-2.723,,9104
+1781,9606,8611,6.46,,9202
+1782,9606,8605,612.4,,9001
+1782,9606,8606,77.0,,9001
+1782,9606,8607,440.2,,9001
+1782,9606,8608,-0.054,,9104
+1782,9606,8609,0.057,,9104
+1782,9606,8610,-2.797,,9104
+1782,9606,8611,2.55,,9202
+1783,9606,8605,-84.1,,9001
+1783,9606,8606,-101.8,,9001
+1783,9606,8607,-129.7,,9001
+1783,9606,8608,0.0,,9104
+1783,9606,8609,0.0,,9104
+1783,9606,8610,0.468,,9104
+1783,9606,8611,1.05,,9202
+1784,9606,8605,-84.1,,9001
+1784,9606,8606,-101.8,,9001
+1784,9606,8607,-129.7,,9001
+1784,9606,8608,0.0,,9104
+1784,9606,8609,0.0,,9104
+1784,9606,8610,0.468,,9104
+1784,9606,8611,1.05,,9202
+1785,9606,8605,426.9,,9001
+1785,9606,8606,142.6,,9001
+1785,9606,8607,460.1,,9001
+1785,9606,8608,4.91,,9104
+1785,9606,8609,4.49,,9104
+1785,9606,8610,-12.42,,9104
+1785,9606,8611,17.1,,9202
+1786,9606,8605,426.9,,9001
+1786,9606,8606,142.6,,9001
+1786,9606,8607,460.1,,9001
+1786,9606,8608,4.91,,9104
+1786,9606,8609,4.49,,9104
+1786,9606,8610,-12.42,,9104
+1786,9606,8611,17.1,,9202
+1787,9607,8605,414.1,,9001
+1787,9607,8606,41.3,,9001
+1787,9607,8607,603.1,,9001
+1787,9607,8608,-0.855,,9104
+1787,9607,8609,2.141,,9104
+1787,9607,8610,-7.023,,9104
+1787,9607,8611,0.0,,9202
+1788,9607,8605,414.1,,9001
+1788,9607,8606,41.3,,9001
+1788,9607,8607,603.1,,9001
+1788,9607,8608,-0.855,,9104
+1788,9607,8609,2.141,,9104
+1788,9607,8610,-7.023,,9104
+1788,9607,8611,0.0,,9202
+1789,9603,8605,103.25,,9001
+1789,9603,8606,-100.4,,9001
+1789,9603,8607,-307.19,,9001
+1790,9606,8605,-282.1,,9001
+1790,9606,8606,-72.2,,9001
+1790,9606,8607,120.0,,9001
+1790,9606,8608,-1.592,,9104
+1790,9606,8609,0.145,,9104
+1790,9606,8610,-0.89,,9104
+1790,9606,8611,-4.46,,9202
+1791,9606,8605,-282.1,,9001
+1791,9606,8606,-72.2,,9001
+1791,9606,8607,120.0,,9001
+1791,9606,8608,-1.592,,9104
+1791,9606,8609,0.145,,9104
+1791,9606,8610,-0.89,,9104
+1791,9606,8611,-4.46,,9202
+1792,9606,8605,-231.0,,9001
+1792,9606,8606,102.6,,9001
+1792,9606,8607,29.8,,9001
+1792,9606,8608,0.615,,9104
+1792,9606,8609,-0.198,,9104
+1792,9606,8610,0.881,,9104
+1792,9606,8611,1.79,,9202
+1793,9606,8605,-231.0,,9001
+1793,9606,8606,102.6,,9001
+1793,9606,8607,29.8,,9001
+1793,9606,8608,0.615,,9104
+1793,9606,8609,-0.198,,9104
+1793,9606,8610,0.881,,9104
+1793,9606,8611,1.79,,9202
+1794,9603,8605,695.5,,9001
+1794,9603,8606,-216.6,,9001
+1794,9603,8607,491.1,,9001
+1795,9636,8605,408.0895,,9001
+1795,9636,8606,-288.9616,,9001
+1795,9636,8607,791.5498,,9001
+1795,9636,8608,-4.078662,,9104
+1795,9636,8609,0.022669,,9104
+1795,9636,8610,9.825424,,9104
+1795,9636,8611,94.060626,,9202
+1795,9636,8617,4444943.0248,,9001
+1795,9636,8618,1518098.4827,,9001
+1795,9636,8667,4302370.0765,,9001
+1796,9603,8605,-70.9,,9001
+1796,9603,8606,-151.8,,9001
+1796,9603,8607,-41.4,,9001
+1797,9603,8605,164.0,,9001
+1797,9603,8606,138.0,,9001
+1797,9603,8607,-189.0,,9001
+1798,9606,8605,163.511,,9001
+1798,9606,8606,127.533,,9001
+1798,9606,8607,-159.789,,9001
+1798,9606,8608,0.0,,9104
+1798,9606,8609,0.0,,9104
+1798,9606,8610,0.814,,9104
+1798,9606,8611,-0.6,,9202
+1799,9606,8605,105.0,,9001
+1799,9606,8606,326.0,,9001
+1799,9606,8607,-102.5,,9001
+1799,9606,8608,0.0,,9104
+1799,9606,8609,0.0,,9104
+1799,9606,8610,0.814,,9104
+1799,9606,8611,-0.6,,9202
+1800,9606,8605,-45.0,,9001
+1800,9606,8606,417.0,,9001
+1800,9606,8607,-3.5,,9001
+1800,9606,8608,0.0,,9104
+1800,9606,8609,0.0,,9104
+1800,9606,8610,0.814,,9104
+1800,9606,8611,-0.6,,9202
+1801,9603,8605,-145.0,,9001
+1801,9603,8606,52.7,,9001
+1801,9603,8607,-291.6,,9001
+1802,9606,8605,-178.3,,9001
+1802,9606,8606,-316.7,,9001
+1802,9606,8607,-131.5,,9001
+1802,9606,8608,5.278,,9104
+1802,9606,8609,6.077,,9104
+1802,9606,8610,10.979,,9104
+1802,9606,8611,19.166,,9202
+1803,9615,8656,,A66 National (13.09.01).gsb,
+1804,9615,8656,,National 84 (02.07.01).gsb,
+1805,9603,8605,-56.1,,9001
+1805,9603,8606,-167.8,,9001
+1805,9603,8607,13.1,,9001
+1806,9603,8605,-104.4,,9001
+1806,9603,8606,-136.6,,9001
+1806,9603,8607,201.2,,9001
+1807,9606,8605,27.0,,9001
+1807,9606,8606,-135.0,,9001
+1807,9606,8607,-84.5,,9001
+1807,9606,8608,0.0,,9104
+1807,9606,8609,0.0,,9104
+1807,9606,8610,0.554,,9104
+1807,9606,8611,0.2263,,9202
+1808,9606,8605,686.1,,9001
+1808,9606,8606,-123.5,,9001
+1808,9606,8607,-574.4,,9001
+1808,9606,8608,8.045,,9104
+1808,9606,8609,-23.366,,9104
+1808,9606,8610,10.791,,9104
+1808,9606,8611,-2.926,,9202
+1809,9606,8605,926.4,,9001
+1809,9606,8606,-715.9,,9001
+1809,9606,8607,-186.4,,9001
+1809,9606,8608,-10.364,,9104
+1809,9606,8609,-20.78,,9104
+1809,9606,8610,26.452,,9104
+1809,9606,8611,-7.224,,9202
+1810,9606,8605,-84.0,,9001
+1810,9606,8606,-103.0,,9001
+1810,9606,8607,-122.5,,9001
+1810,9606,8608,0.0,,9104
+1810,9606,8609,0.0,,9104
+1810,9606,8610,0.554,,9104
+1810,9606,8611,0.2263,,9202
+1811,9603,8605,-291.87,,9001
+1811,9603,8606,106.37,,9001
+1811,9603,8607,-364.52,,9001
+1812,9606,8605,293.0,,9001
+1812,9606,8606,836.0,,9001
+1812,9606,8607,318.0,,9001
+1812,9606,8608,0.5,,9104
+1812,9606,8609,1.6,,9104
+1812,9606,8610,-2.8,,9104
+1812,9606,8611,2.1,,9202
+1813,9603,8605,-378.873,,9001
+1813,9603,8606,676.002,,9001
+1813,9603,8607,-46.255,,9001
+1814,9603,8605,-377.7,,9001
+1814,9603,8606,675.1,,9001
+1814,9603,8607,-52.2,,9001
+1815,9606,8605,-152.9,,9001
+1815,9606,8606,43.8,,9001
+1815,9606,8607,358.3,,9001
+1815,9606,8608,2.714,,9104
+1815,9606,8609,1.386,,9104
+1815,9606,8610,-2.788,,9104
+1815,9606,8611,-6.743,,9202
+1816,9603,8605,-95.7,,9001
+1816,9603,8606,10.2,,9001
+1816,9603,8607,158.9,,9001
+1817,9603,8605,-165.914,,9001
+1817,9603,8606,-70.607,,9001
+1817,9603,8607,305.009,,9001
+1818,9606,8605,-89.0,,9001
+1818,9606,8606,-112.0,,9001
+1818,9606,8607,125.9,,9001
+1818,9606,8608,0.0,,9104
+1818,9606,8609,0.0,,9104
+1818,9606,8610,0.814,,9104
+1818,9606,8611,-0.38,,9202
+1819,9606,8605,-111.92,,9001
+1819,9606,8606,-87.85,,9001
+1819,9606,8607,114.5,,9001
+1819,9606,8608,1.875,,9104
+1819,9606,8609,0.202,,9104
+1819,9606,8610,0.219,,9104
+1819,9606,8611,0.032,,9202
+1820,9603,8605,-93.2,,9001
+1820,9603,8606,-93.31,,9001
+1820,9603,8607,121.156,,9001
+1821,9603,8605,-88.98,,9001
+1821,9603,8606,-83.23,,9001
+1821,9603,8607,113.55,,9001
+1822,9603,8605,-92.726,,9001
+1822,9603,8606,-90.304,,9001
+1822,9603,8607,115.735,,9001
+1823,9603,8605,-93.134,,9001
+1823,9603,8606,-86.647,,9001
+1823,9603,8607,114.196,,9001
+1824,9603,8605,-93.0,,9001
+1824,9603,8606,-94.0,,9001
+1824,9603,8607,124.0,,9001
+1825,9606,8605,-162.619,,9001
+1825,9606,8606,-276.959,,9001
+1825,9606,8607,-161.764,,9001
+1825,9606,8608,0.067753,,9104
+1825,9606,8609,-2.243649,,9104
+1825,9606,8610,-1.158827,,9104
+1825,9606,8611,-1.094246,,9202
+1826,9603,8605,0.0,,9001
+1826,9603,8606,0.0,,9001
+1826,9603,8607,0.0,,9001
+1827,9618,8601,7.92,,9104
+1827,9618,8602,-13.88,,9104
+1827,9618,8604,26.1,,9001
+1828,9603,8605,-37.0,,9001
+1828,9603,8606,157.0,,9001
+1828,9603,8607,85.0,,9001
+1829,9607,8605,56.0,,9001
+1829,9607,8606,-75.77,,9001
+1829,9607,8607,-15.31,,9001
+1829,9607,8608,0.37,,9104
+1829,9607,8609,0.2,,9104
+1829,9607,8610,0.21,,9104
+1829,9607,8611,1.01,,9202
+1830,9607,8605,56.0,,9001
+1830,9607,8606,-75.77,,9001
+1830,9607,8607,-15.31,,9001
+1830,9607,8608,0.37,,9104
+1830,9607,8609,0.2,,9104
+1830,9607,8610,0.21,,9104
+1830,9607,8611,1.01,,9202
+1831,9603,8605,57.01,,9001
+1831,9603,8606,-69.97,,9001
+1831,9603,8607,-9.29,,9001
+1832,9606,8605,2.691,,9001
+1832,9606,8606,-14.757,,9001
+1832,9606,8607,4.724,,9001
+1832,9606,8608,0.0,,9104
+1832,9606,8609,0.0,,9104
+1832,9606,8610,0.774,,9104
+1832,9606,8611,-0.6,,9202
+1833,9607,8605,-1.977,,9001
+1833,9607,8606,-13.06,,9001
+1833,9607,8607,-9.993,,9001
+1833,9607,8608,-0.364,,9104
+1833,9607,8609,-0.254,,9104
+1833,9607,8610,-0.689,,9104
+1833,9607,8611,-1.037,,9202
+1834,9603,8605,-403.0,,9001
+1834,9603,8606,684.0,,9001
+1834,9603,8607,41.0,,9001
+1835,9603,8605,-387.06,,9001
+1835,9603,8606,636.53,,9001
+1835,9603,8607,46.29,,9001
+1836,9603,8605,-403.4,,9001
+1836,9603,8606,681.12,,9001
+1836,9603,8607,46.56,,9001
+1837,9603,8605,-587.8,,9001
+1837,9603,8606,519.75,,9001
+1837,9603,8607,145.76,,9001
+1838,9603,8605,-404.78,,9001
+1838,9603,8606,685.68,,9001
+1838,9603,8607,45.47,,9001
+1839,9603,8605,-101.0,,9001
+1839,9603,8606,-111.0,,9001
+1839,9603,8607,187.0,,9001
+1840,9606,8605,-119.4248,,9001
+1840,9606,8606,-303.65872,,9001
+1840,9606,8607,-11.00061,,9001
+1840,9606,8608,1.164298,,9104
+1840,9606,8609,0.174458,,9104
+1840,9606,8610,1.096259,,9104
+1840,9606,8611,3.657065,,9202
+1841,9615,8656,,NB7783v2.gsb,
+1842,9603,8605,0.0,,9001
+1842,9603,8606,0.0,,9001
+1842,9603,8607,0.0,,9001
+1843,9615,8656,,NAD83-98.gsb,
+1844,9615,8656,,QUE27-98.gsb,
+1845,9615,8656,,CGQ77-98.gsb,
+1846,9615,8656,,PE7783V2.gsb,
+1847,9615,8656,,SK27-98.gsb,
+1848,9615,8656,,SK83-98.gsb,
+1849,9615,8656,,AB_CSRS.DAC,
+1850,9615,8656,,NS778301.gsb,
+1851,9615,8656,,NS778301.gsb,
+1852,9606,8605,-533.4,,9001
+1852,9606,8606,669.2,,9001
+1852,9606,8607,-52.5,,9001
+1852,9606,8608,0.0,,9104
+1852,9606,8609,0.0,,9104
+1852,9606,8610,4.28,,9104
+1852,9606,8611,9.4,,9202
+1854,9603,8605,-239.1,,9001
+1854,9603,8606,-170.02,,9001
+1854,9603,8607,397.5,,9001
+1855,9603,8605,-244.72,,9001
+1855,9603,8606,-162.773,,9001
+1855,9603,8607,400.75,,9001
+1856,9603,8605,-122.89,,9001
+1856,9603,8606,-159.08,,9001
+1856,9603,8607,-168.74,,9001
+1857,9603,8605,-84.78,,9001
+1857,9603,8606,-107.55,,9001
+1857,9603,8607,-137.25,,9001
+1858,9603,8605,-123.92,,9001
+1858,9603,8606,-155.515,,9001
+1858,9603,8607,-157.721,,9001
+1859,9603,8605,-69.06,,9001
+1859,9603,8606,-90.71,,9001
+1859,9603,8607,-142.56,,9001
+1860,9603,8605,-113.997,,9001
+1860,9603,8606,-97.076,,9001
+1860,9603,8607,-152.312,,9001
+1861,9603,8605,-114.5,,9001
+1861,9603,8606,-96.1,,9001
+1861,9603,8607,-151.9,,9001
+1862,9606,8605,-194.513,,9001
+1862,9606,8606,-63.978,,9001
+1862,9606,8607,-25.759,,9001
+1862,9606,8608,-3.4027,,9104
+1862,9606,8609,3.756,,9104
+1862,9606,8610,-3.352,,9104
+1862,9606,8611,-0.9175,,9202
+1863,9607,8605,-389.691,,9001
+1863,9607,8606,64.502,,9001
+1863,9607,8607,210.209,,9001
+1863,9607,8608,-0.086,,9104
+1863,9607,8609,-14.314,,9104
+1863,9607,8610,6.39,,9104
+1863,9607,8611,0.9264,,9202
+5400,9616,8603,-28.0,,9001
+5401,9616,8603,-0.037,,9001
+5402,9616,8603,-26.3,,9001
+5403,9616,8603,-1.7,,9001
+5404,9616,8603,-0.4,,9001
+5405,9616,8603,0.146,,9001
+10101,9807,8801,30.3,,9110
+10101,9807,8802,-85.5,,9110
+10101,9807,8805,0.99996,,9201
+10101,9807,8806,500000.0,,9003
+10101,9807,8807,0.0,,9003
+10102,9807,8801,30.0,,9110
+10102,9807,8802,-87.3,,9110
+10102,9807,8805,0.999933333,,9201
+10102,9807,8806,500000.0,,9003
+10102,9807,8807,0.0,,9003
+10131,9807,8801,30.3,,9110
+10131,9807,8802,-85.5,,9110
+10131,9807,8805,0.99996,,9201
+10131,9807,8806,200000.0,,9001
+10131,9807,8807,0.0,,9001
+10132,9807,8801,30.0,,9110
+10132,9807,8802,-87.3,,9110
+10132,9807,8805,0.999933333,,9201
+10132,9807,8806,600000.0,,9001
+10132,9807,8807,0.0,,9001
+10201,9807,8801,31.0,,9110
+10201,9807,8802,-110.1,,9110
+10201,9807,8805,0.9999,,9201
+10201,9807,8806,500000.0,,9003
+10201,9807,8807,0.0,,9003
+10202,9807,8801,31.0,,9110
+10202,9807,8802,-111.55,,9110
+10202,9807,8805,0.9999,,9201
+10202,9807,8806,500000.0,,9003
+10202,9807,8807,0.0,,9003
+10203,9807,8801,31.0,,9110
+10203,9807,8802,-113.45,,9110
+10203,9807,8805,0.999933333,,9201
+10203,9807,8806,500000.0,,9003
+10203,9807,8807,0.0,,9003
+10231,9807,8801,31.0,,9110
+10231,9807,8802,-110.1,,9110
+10231,9807,8805,0.9999,,9201
+10231,9807,8806,213360.0,,9001
+10231,9807,8807,0.0,,9001
+10232,9807,8801,31.0,,9110
+10232,9807,8802,-111.55,,9110
+10232,9807,8805,0.9999,,9201
+10232,9807,8806,213360.0,,9001
+10232,9807,8807,0.0,,9001
+10233,9807,8801,31.0,,9110
+10233,9807,8802,-113.45,,9110
+10233,9807,8805,0.999933333,,9201
+10233,9807,8806,213360.0,,9001
+10233,9807,8807,0.0,,9001
+10301,9802,8821,34.2,,9110
+10301,9802,8822,-92.0,,9110
+10301,9802,8823,36.14,,9110
+10301,9802,8824,34.56,,9110
+10301,9802,8826,2000000.0,,9003
+10301,9802,8827,0.0,,9003
+10302,9802,8821,32.4,,9110
+10302,9802,8822,-92.0,,9110
+10302,9802,8823,34.46,,9110
+10302,9802,8824,33.18,,9110
+10302,9802,8826,2000000.0,,9003
+10302,9802,8827,0.0,,9003
+10331,9802,8821,34.2,,9110
+10331,9802,8822,-92.0,,9110
+10331,9802,8823,36.14,,9110
+10331,9802,8824,34.56,,9110
+10331,9802,8826,400000.0,,9001
+10331,9802,8827,0.0,,9001
+10332,9802,8821,32.4,,9110
+10332,9802,8822,-92.0,,9110
+10332,9802,8823,34.46,,9110
+10332,9802,8824,33.18,,9110
+10332,9802,8826,400000.0,,9001
+10332,9802,8827,400000.0,,9001
+10401,9802,8821,39.2,,9110
+10401,9802,8822,-122.0,,9110
+10401,9802,8823,41.4,,9110
+10401,9802,8824,40.0,,9110
+10401,9802,8826,2000000.0,,9003
+10401,9802,8827,0.0,,9003
+10402,9802,8821,37.4,,9110
+10402,9802,8822,-122.0,,9110
+10402,9802,8823,39.5,,9110
+10402,9802,8824,38.2,,9110
+10402,9802,8826,2000000.0,,9003
+10402,9802,8827,0.0,,9003
+10403,9802,8821,36.3,,9110
+10403,9802,8822,-120.3,,9110
+10403,9802,8823,38.26,,9110
+10403,9802,8824,37.04,,9110
+10403,9802,8826,2000000.0,,9003
+10403,9802,8827,0.0,,9003
+10404,9802,8821,35.2,,9110
+10404,9802,8822,-119.0,,9110
+10404,9802,8823,37.15,,9110
+10404,9802,8824,36.0,,9110
+10404,9802,8826,2000000.0,,9003
+10404,9802,8827,0.0,,9003
+10405,9802,8821,33.3,,9110
+10405,9802,8822,-118.0,,9110
+10405,9802,8823,35.28,,9110
+10405,9802,8824,34.02,,9110
+10405,9802,8826,2000000.0,,9003
+10405,9802,8827,0.0,,9003
+10406,9802,8821,32.1,,9110
+10406,9802,8822,-116.15,,9110
+10406,9802,8823,33.53,,9110
+10406,9802,8824,32.47,,9110
+10406,9802,8826,2000000.0,,9003
+10406,9802,8827,0.0,,9003
+10407,9802,8821,34.08,,9110
+10407,9802,8822,-118.2,,9110
+10407,9802,8823,34.25,,9110
+10407,9802,8824,33.52,,9110
+10407,9802,8826,4186692.58,,9003
+10407,9802,8827,416926.74,,9003
+10431,9802,8821,39.2,,9110
+10431,9802,8822,-122.0,,9110
+10431,9802,8823,41.4,,9110
+10431,9802,8824,40.0,,9110
+10431,9802,8826,2000000.0,,9001
+10431,9802,8827,500000.0,,9001
+10432,9802,8821,37.4,,9110
+10432,9802,8822,-122.0,,9110
+10432,9802,8823,39.5,,9110
+10432,9802,8824,38.2,,9110
+10432,9802,8826,2000000.0,,9001
+10432,9802,8827,500000.0,,9001
+10433,9802,8821,36.3,,9110
+10433,9802,8822,-120.3,,9110
+10433,9802,8823,38.26,,9110
+10433,9802,8824,37.04,,9110
+10433,9802,8826,2000000.0,,9001
+10433,9802,8827,500000.0,,9001
+10434,9802,8821,35.2,,9110
+10434,9802,8822,-119.0,,9110
+10434,9802,8823,37.15,,9110
+10434,9802,8824,36.0,,9110
+10434,9802,8826,2000000.0,,9001
+10434,9802,8827,500000.0,,9001
+10435,9802,8821,33.3,,9110
+10435,9802,8822,-118.0,,9110
+10435,9802,8823,35.28,,9110
+10435,9802,8824,34.02,,9110
+10435,9802,8826,2000000.0,,9001
+10435,9802,8827,500000.0,,9001
+10436,9802,8821,32.1,,9110
+10436,9802,8822,-116.15,,9110
+10436,9802,8823,33.53,,9110
+10436,9802,8824,32.47,,9110
+10436,9802,8826,2000000.0,,9001
+10436,9802,8827,500000.0,,9001
+10501,9802,8821,39.2,,9110
+10501,9802,8822,-105.3,,9110
+10501,9802,8823,39.43,,9110
+10501,9802,8824,40.47,,9110
+10501,9802,8826,2000000.0,,9003
+10501,9802,8827,0.0,,9003
+10502,9802,8821,37.5,,9110
+10502,9802,8822,-105.3,,9110
+10502,9802,8823,39.45,,9110
+10502,9802,8824,38.27,,9110
+10502,9802,8826,2000000.0,,9003
+10502,9802,8827,0.0,,9003
+10503,9802,8821,36.4,,9110
+10503,9802,8822,-105.3,,9110
+10503,9802,8823,38.26,,9110
+10503,9802,8824,37.14,,9110
+10503,9802,8826,2000000.0,,9003
+10503,9802,8827,0.0,,9003
+10531,9802,8821,39.2,,9110
+10531,9802,8822,-105.3,,9110
+10531,9802,8823,40.47,,9110
+10531,9802,8824,39.43,,9110
+10531,9802,8826,914401.8289,,9001
+10531,9802,8827,304800.6096,,9001
+10532,9802,8821,37.5,,9110
+10532,9802,8822,-105.3,,9110
+10532,9802,8823,39.45,,9110
+10532,9802,8824,38.27,,9110
+10532,9802,8826,914401.8289,,9001
+10532,9802,8827,304800.6096,,9001
+10533,9802,8821,36.4,,9110
+10533,9802,8822,-105.3,,9110
+10533,9802,8823,38.26,,9110
+10533,9802,8824,37.14,,9110
+10533,9802,8826,914401.8289,,9001
+10533,9802,8827,304800.6096,,9001
+10600,9802,8821,40.5,,9110
+10600,9802,8822,-72.45,,9110
+10600,9802,8823,41.52,,9110
+10600,9802,8824,41.12,,9110
+10600,9802,8826,600000.0,,9003
+10600,9802,8827,0.0,,9003
+10630,9802,8821,40.5,,9110
+10630,9802,8822,-72.45,,9110
+10630,9802,8823,41.52,,9110
+10630,9802,8824,41.12,,9110
+10630,9802,8826,304800.6096,,9001
+10630,9802,8827,152400.3048,,9001
+10700,9807,8801,38.0,,9110
+10700,9807,8802,-75.25,,9110
+10700,9807,8805,0.999995,,9201
+10700,9807,8806,500000.0,,9003
+10700,9807,8807,0.0,,9003
+10730,9807,8801,38.0,,9110
+10730,9807,8802,-75.25,,9110
+10730,9807,8805,0.999995,,9201
+10730,9807,8806,200000.0,,9001
+10730,9807,8807,0.0,,9001
+10901,9807,8801,24.2,,9110
+10901,9807,8802,-81.0,,9110
+10901,9807,8805,0.999941177,,9201
+10901,9807,8806,500000.0,,9003
+10901,9807,8807,0.0,,9003
+10902,9807,8801,24.2,,9110
+10902,9807,8802,-82.0,,9110
+10902,9807,8805,0.999941177,,9201
+10902,9807,8806,500000.0,,9003
+10902,9807,8807,0.0,,9003
+10903,9802,8821,29.0,,9110
+10903,9802,8822,-84.3,,9110
+10903,9802,8823,30.45,,9110
+10903,9802,8824,29.35,,9110
+10903,9802,8826,2000000.0,,9003
+10903,9802,8827,0.0,,9003
+10931,9807,8801,24.2,,9110
+10931,9807,8802,-81.0,,9110
+10931,9807,8805,0.999941177,,9201
+10931,9807,8806,200000.0,,9001
+10931,9807,8807,0.0,,9001
+10932,9807,8801,24.2,,9110
+10932,9807,8802,-82.0,,9110
+10932,9807,8805,0.999941177,,9201
+10932,9807,8806,200000.0,,9001
+10932,9807,8807,0.0,,9001
+10933,9802,8821,29.0,,9110
+10933,9802,8822,-84.3,,9110
+10933,9802,8823,30.45,,9110
+10933,9802,8824,29.35,,9110
+10933,9802,8826,600000.0,,9001
+10933,9802,8827,0.0,,9001
+11001,9807,8801,30.0,,9110
+11001,9807,8802,-82.1,,9110
+11001,9807,8805,0.9999,,9201
+11001,9807,8806,500000.0,,9003
+11001,9807,8807,0.0,,9003
+11002,9807,8801,30.0,,9110
+11002,9807,8802,-84.1,,9110
+11002,9807,8805,0.9999,,9201
+11002,9807,8806,500000.0,,9003
+11002,9807,8807,0.0,,9003
+11031,9807,8801,30.0,,9110
+11031,9807,8802,-82.1,,9110
+11031,9807,8805,0.9999,,9201
+11031,9807,8806,200000.0,,9001
+11031,9807,8807,0.0,,9001
+11032,9807,8801,30.0,,9110
+11032,9807,8802,-84.1,,9110
+11032,9807,8805,0.9999,,9201
+11032,9807,8806,700000.0,,9001
+11032,9807,8807,0.0,,9001
+11101,9807,8801,41.4,,9110
+11101,9807,8802,-112.1,,9110
+11101,9807,8805,0.999947368,,9201
+11101,9807,8806,500000.0,,9003
+11101,9807,8807,0.0,,9003
+11102,9807,8801,41.4,,9110
+11102,9807,8802,-114.0,,9110
+11102,9807,8805,0.999947368,,9201
+11102,9807,8806,500000.0,,9003
+11102,9807,8807,0.0,,9003
+11103,9807,8801,41.4,,9110
+11103,9807,8802,-115.45,,9110
+11103,9807,8805,0.999933333,,9201
+11103,9807,8806,500000.0,,9003
+11103,9807,8807,0.0,,9003
+11131,9807,8801,41.4,,9110
+11131,9807,8802,-112.1,,9110
+11131,9807,8805,0.999947368,,9201
+11131,9807,8806,200000.0,,9001
+11131,9807,8807,0.0,,9001
+11132,9807,8801,41.4,,9110
+11132,9807,8802,-114.0,,9110
+11132,9807,8805,0.999947368,,9201
+11132,9807,8806,500000.0,,9001
+11132,9807,8807,0.0,,9001
+11133,9807,8801,41.4,,9110
+11133,9807,8802,-115.45,,9110
+11133,9807,8805,0.999933333,,9201
+11133,9807,8806,800000.0,,9001
+11133,9807,8807,0.0,,9001
+11201,9807,8801,36.4,,9110
+11201,9807,8802,-88.2,,9110
+11201,9807,8805,0.999975,,9201
+11201,9807,8806,500000.0,,9003
+11201,9807,8807,0.0,,9003
+11202,9807,8801,36.4,,9110
+11202,9807,8802,-90.1,,9110
+11202,9807,8805,0.999941177,,9201
+11202,9807,8806,500000.0,,9003
+11202,9807,8807,0.0,,9003
+11231,9807,8801,36.4,,9110
+11231,9807,8802,-88.2,,9110
+11231,9807,8805,0.999975,,9201
+11231,9807,8806,300000.0,,9001
+11231,9807,8807,0.0,,9001
+11232,9807,8801,36.4,,9110
+11232,9807,8802,-90.1,,9110
+11232,9807,8805,0.999941177,,9201
+11232,9807,8806,700000.0,,9001
+11232,9807,8807,0.0,,9001
+11301,9807,8801,37.3,,9110
+11301,9807,8802,-85.4,,9110
+11301,9807,8805,0.999966667,,9201
+11301,9807,8806,500000.0,,9003
+11301,9807,8807,0.0,,9003
+11302,9807,8801,37.3,,9110
+11302,9807,8802,-87.05,,9110
+11302,9807,8805,0.999966667,,9201
+11302,9807,8806,500000.0,,9003
+11302,9807,8807,0.0,,9003
+11331,9807,8801,37.3,,9110
+11331,9807,8802,-85.4,,9110
+11331,9807,8805,0.999966667,,9201
+11331,9807,8806,100000.0,,9001
+11331,9807,8807,250000.0,,9001
+11332,9807,8801,37.3,,9110
+11332,9807,8802,-87.05,,9110
+11332,9807,8805,0.999966667,,9201
+11332,9807,8806,900000.0,,9001
+11332,9807,8807,250000.0,,9001
+11401,9802,8821,41.3,,9110
+11401,9802,8822,-93.3,,9110
+11401,9802,8823,43.16,,9110
+11401,9802,8824,42.04,,9110
+11401,9802,8826,2000000.0,,9003
+11401,9802,8827,0.0,,9003
+11402,9802,8821,40.0,,9110
+11402,9802,8822,-93.3,,9110
+11402,9802,8823,41.47,,9110
+11402,9802,8824,40.37,,9110
+11402,9802,8826,2000000.0,,9003
+11402,9802,8827,0.0,,9003
+11431,9802,8821,41.3,,9110
+11431,9802,8822,-93.3,,9110
+11431,9802,8823,43.16,,9110
+11431,9802,8824,42.04,,9110
+11431,9802,8826,1500000.0,,9001
+11431,9802,8827,1000000.0,,9001
+11432,9802,8821,40.0,,9110
+11432,9802,8822,-93.3,,9110
+11432,9802,8823,41.47,,9110
+11432,9802,8824,40.37,,9110
+11432,9802,8826,500000.0,,9001
+11432,9802,8827,0.0,,9001
+11501,9802,8821,38.2,,9110
+11501,9802,8822,-98.0,,9110
+11501,9802,8823,39.47,,9110
+11501,9802,8824,38.43,,9110
+11501,9802,8826,2000000.0,,9003
+11501,9802,8827,0.0,,9003
+11502,9802,8821,36.4,,9110
+11502,9802,8822,-98.3,,9110
+11502,9802,8823,38.34,,9110
+11502,9802,8824,37.16,,9110
+11502,9802,8826,2000000.0,,9003
+11502,9802,8827,0.0,,9003
+11531,9802,8821,38.2,,9110
+11531,9802,8822,-98.0,,9110
+11531,9802,8823,39.47,,9110
+11531,9802,8824,38.43,,9110
+11531,9802,8826,400000.0,,9001
+11531,9802,8827,0.0,,9001
+11532,9802,8821,36.4,,9110
+11532,9802,8822,-98.3,,9110
+11532,9802,8823,38.34,,9110
+11532,9802,8824,37.16,,9110
+11532,9802,8826,400000.0,,9001
+11532,9802,8827,400000.0,,9001
+11601,9802,8821,37.3,,9110
+11601,9802,8822,-84.15,,9110
+11601,9802,8823,37.58,,9110
+11601,9802,8824,38.58,,9110
+11601,9802,8826,2000000.0,,9003
+11601,9802,8827,0.0,,9003
+11602,9802,8821,36.2,,9110
+11602,9802,8822,-85.45,,9110
+11602,9802,8823,36.44,,9110
+11602,9802,8824,37.56,,9110
+11602,9802,8826,2000000.0,,9003
+11602,9802,8827,0.0,,9003
+11631,9802,8821,37.3,,9110
+11631,9802,8822,-84.15,,9110
+11631,9802,8823,37.58,,9110
+11631,9802,8824,37.58,,9110
+11631,9802,8826,500000.0,,9001
+11631,9802,8827,0.0,,9001
+11632,9802,8821,36.2,,9110
+11632,9802,8822,-85.45,,9110
+11632,9802,8823,37.56,,9110
+11632,9802,8824,36.44,,9110
+11632,9802,8826,500000.0,,9001
+11632,9802,8827,500000.0,,9001
+11701,9802,8821,30.4,,9110
+11701,9802,8822,-92.3,,9110
+11701,9802,8823,31.1,,9110
+11701,9802,8824,32.4,,9110
+11701,9802,8826,2000000.0,,9003
+11701,9802,8827,0.0,,9003
+11702,9802,8821,28.4,,9110
+11702,9802,8822,-91.2,,9110
+11702,9802,8823,29.18,,9110
+11702,9802,8824,30.42,,9110
+11702,9802,8826,2000000.0,,9003
+11702,9802,8827,0.0,,9003
+11731,9802,8821,30.3,,9110
+11731,9802,8822,-92.3,,9110
+11731,9802,8823,32.4,,9110
+11731,9802,8824,31.1,,9110
+11731,9802,8826,1000000.0,,9001
+11731,9802,8827,0.0,,9001
+11732,9802,8821,28.3,,9110
+11732,9802,8822,-91.2,,9110
+11732,9802,8823,30.42,,9110
+11732,9802,8824,29.18,,9110
+11732,9802,8826,1000000.0,,9001
+11732,9802,8827,0.0,,9001
+11801,9807,8801,43.5,,9110
+11801,9807,8802,-68.3,,9110
+11801,9807,8805,0.9999,,9201
+11801,9807,8806,500000.0,,9003
+11801,9807,8807,0.0,,9003
+11802,9807,8801,42.5,,9110
+11802,9807,8802,-70.1,,9110
+11802,9807,8805,0.999966667,,9201
+11802,9807,8806,500000.0,,9003
+11802,9807,8807,0.0,,9003
+11831,9807,8801,43.4,,9110
+11831,9807,8802,-68.3,,9110
+11831,9807,8805,0.9999,,9201
+11831,9807,8806,300000.0,,9001
+11831,9807,8807,0.0,,9001
+11832,9807,8801,42.5,,9110
+11832,9807,8802,-70.1,,9110
+11832,9807,8805,0.999966667,,9201
+11832,9807,8806,900000.0,,9001
+11832,9807,8807,0.0,,9001
+11900,9802,8821,37.5,,9110
+11900,9802,8822,-77.0,,9110
+11900,9802,8823,38.18,,9110
+11900,9802,8824,39.27,,9110
+11900,9802,8826,800000.0,,9003
+11900,9802,8827,0.0,,9003
+11930,9802,8821,37.4,,9110
+11930,9802,8822,-77.0,,9110
+11930,9802,8823,39.27,,9110
+11930,9802,8824,38.18,,9110
+11930,9802,8826,400000.0,,9001
+11930,9802,8827,0.0,,9001
+12001,9802,8821,41.0,,9110
+12001,9802,8822,-71.3,,9110
+12001,9802,8823,41.43,,9110
+12001,9802,8824,42.41,,9110
+12001,9802,8826,600000.0,,9003
+12001,9802,8827,0.0,,9003
+12002,9802,8821,41.0,,9110
+12002,9802,8822,-70.3,,9110
+12002,9802,8823,41.17,,9110
+12002,9802,8824,41.29,,9110
+12002,9802,8826,200000.0,,9003
+12002,9802,8827,0.0,,9003
+12031,9802,8821,41.0,,9110
+12031,9802,8822,-71.3,,9110
+12031,9802,8823,42.41,,9110
+12031,9802,8824,41.43,,9110
+12031,9802,8826,200000.0,,9001
+12031,9802,8827,750000.0,,9001
+12032,9802,8821,41.0,,9110
+12032,9802,8822,-70.3,,9110
+12032,9802,8823,41.29,,9110
+12032,9802,8824,41.17,,9110
+12032,9802,8826,500000.0,,9001
+12032,9802,8827,0.0,,9001
+12101,9807,8801,41.3,,9110
+12101,9807,8802,-83.4,,9110
+12101,9807,8805,0.999942857,,9201
+12101,9807,8806,500000.0,,9003
+12101,9807,8807,0.0,,9003
+12102,9807,8801,41.3,,9110
+12102,9807,8802,-85.45,,9110
+12102,9807,8805,0.999909091,,9201
+12102,9807,8806,500000.0,,9003
+12102,9807,8807,0.0,,9003
+12103,9807,8801,41.3,,9110
+12103,9807,8802,-88.45,,9110
+12103,9807,8805,0.999909091,,9201
+12103,9807,8806,500000.0,,9003
+12103,9807,8807,0.0,,9003
+12111,9802,8821,44.47,,9110
+12111,9802,8822,-87.0,,9110
+12111,9802,8823,45.29,,9110
+12111,9802,8824,47.05,,9110
+12111,9802,8826,2000000.0,,9003
+12111,9802,8827,0.0,,9003
+12112,9802,8821,43.19,,9110
+12112,9802,8822,-84.2,,9110
+12112,9802,8823,44.11,,9110
+12112,9802,8824,45.42,,9110
+12112,9802,8826,2000000.0,,9003
+12112,9802,8827,0.0,,9003
+12113,9802,8821,41.3,,9110
+12113,9802,8822,-84.2,,9110
+12113,9802,8823,42.06,,9110
+12113,9802,8824,43.4,,9110
+12113,9802,8826,2000000.0,,9003
+12113,9802,8827,0.0,,9003
+12141,9802,8821,44.47,,9110
+12141,9802,8822,-87.0,,9110
+12141,9802,8823,47.05,,9110
+12141,9802,8824,45.29,,9110
+12141,9802,8826,8000000.0,,9001
+12141,9802,8827,0.0,,9001
+12142,9802,8821,43.19,,9110
+12142,9802,8822,-84.22,,9110
+12142,9802,8823,45.42,,9110
+12142,9802,8824,44.11,,9110
+12142,9802,8826,6000000.0,,9001
+12142,9802,8827,0.0,,9001
+12143,9802,8821,41.3,,9110
+12143,9802,8822,-84.22,,9110
+12143,9802,8823,43.4,,9110
+12143,9802,8824,42.06,,9110
+12143,9802,8826,4000000.0,,9001
+12143,9802,8827,0.0,,9001
+12201,9802,8821,46.3,,9110
+12201,9802,8822,-93.06,,9110
+12201,9802,8823,47.02,,9110
+12201,9802,8824,48.38,,9110
+12201,9802,8826,2000000.0,,9003
+12201,9802,8827,0.0,,9003
+12202,9802,8821,45.0,,9110
+12202,9802,8822,-94.15,,9110
+12202,9802,8823,45.37,,9110
+12202,9802,8824,47.03,,9110
+12202,9802,8826,2000000.0,,9003
+12202,9802,8827,0.0,,9003
+12203,9802,8821,43.0,,9110
+12203,9802,8822,-94.0,,9110
+12203,9802,8823,43.47,,9110
+12203,9802,8824,45.13,,9110
+12203,9802,8826,2000000.0,,9003
+12203,9802,8827,0.0,,9003
+12231,9802,8821,46.3,,9110
+12231,9802,8822,-93.06,,9110
+12231,9802,8823,48.38,,9110
+12231,9802,8824,47.02,,9110
+12231,9802,8826,800000.0,,9001
+12231,9802,8827,100000.0,,9001
+12232,9802,8821,45.0,,9110
+12232,9802,8822,-94.15,,9110
+12232,9802,8823,47.03,,9110
+12232,9802,8824,45.37,,9110
+12232,9802,8826,800000.0,,9001
+12232,9802,8827,100000.0,,9001
+12233,9802,8821,43.0,,9110
+12233,9802,8822,-94.0,,9110
+12233,9802,8823,45.13,,9110
+12233,9802,8824,43.47,,9110
+12233,9802,8826,800000.0,,9001
+12233,9802,8827,100000.0,,9001
+12301,9807,8801,29.4,,9110
+12301,9807,8802,-88.5,,9110
+12301,9807,8805,0.99996,,9201
+12301,9807,8806,500000.0,,9003
+12301,9807,8807,0.0,,9003
+12302,9807,8801,30.3,,9110
+12302,9807,8802,-90.2,,9110
+12302,9807,8805,0.999941177,,9201
+12302,9807,8806,500000.0,,9003
+12302,9807,8807,0.0,,9003
+12331,9807,8801,29.3,,9110
+12331,9807,8802,-88.5,,9110
+12331,9807,8805,0.99995,,9201
+12331,9807,8806,300000.0,,9001
+12331,9807,8807,0.0,,9001
+12332,9807,8801,29.3,,9110
+12332,9807,8802,-90.2,,9110
+12332,9807,8805,0.99995,,9201
+12332,9807,8806,700000.0,,9001
+12332,9807,8807,0.0,,9001
+12401,9807,8801,35.5,,9110
+12401,9807,8802,-90.3,,9110
+12401,9807,8805,0.999933333,,9201
+12401,9807,8806,500000.0,,9003
+12401,9807,8807,0.0,,9003
+12402,9807,8801,35.5,,9110
+12402,9807,8802,-92.3,,9110
+12402,9807,8805,0.999933333,,9201
+12402,9807,8806,500000.0,,9003
+12402,9807,8807,0.0,,9003
+12403,9807,8801,36.1,,9110
+12403,9807,8802,-94.3,,9110
+12403,9807,8805,0.999941177,,9201
+12403,9807,8806,500000.0,,9003
+12403,9807,8807,0.0,,9003
+12431,9807,8801,35.5,,9110
+12431,9807,8802,-90.3,,9110
+12431,9807,8805,0.999933333,,9201
+12431,9807,8806,250000.0,,9001
+12431,9807,8807,0.0,,9001
+12432,9807,8801,35.5,,9110
+12432,9807,8802,-92.3,,9110
+12432,9807,8805,0.999933333,,9201
+12432,9807,8806,500000.0,,9001
+12432,9807,8807,0.0,,9001
+12433,9807,8801,36.1,,9110
+12433,9807,8802,-94.3,,9110
+12433,9807,8805,0.999941177,,9201
+12433,9807,8806,850000.0,,9001
+12433,9807,8807,0.0,,9001
+12501,9802,8821,47.0,,9110
+12501,9802,8822,-109.3,,9110
+12501,9802,8823,48.43,,9110
+12501,9802,8824,47.51,,9110
+12501,9802,8826,2000000.0,,9003
+12501,9802,8827,0.0,,9003
+12502,9802,8821,45.5,,9110
+12502,9802,8822,-109.3,,9110
+12502,9802,8823,47.53,,9110
+12502,9802,8824,46.27,,9110
+12502,9802,8826,2000000.0,,9003
+12502,9802,8827,0.0,,9003
+12503,9802,8821,44.0,,9110
+12503,9802,8822,-109.3,,9110
+12503,9802,8823,46.24,,9110
+12503,9802,8824,44.52,,9110
+12503,9802,8826,2000000.0,,9003
+12503,9802,8827,0.0,,9003
+12530,9802,8821,44.15,,9110
+12530,9802,8822,-109.3,,9110
+12530,9802,8823,49.0,,9110
+12530,9802,8824,45.0,,9110
+12530,9802,8826,600000.0,,9001
+12530,9802,8827,0.0,,9001
+12601,9802,8821,41.2,,9110
+12601,9802,8822,-100.0,,9110
+12601,9802,8823,41.51,,9110
+12601,9802,8824,42.49,,9110
+12601,9802,8826,2000000.0,,9003
+12601,9802,8827,0.0,,9003
+12602,9802,8821,39.4,,9110
+12602,9802,8822,-99.3,,9110
+12602,9802,8823,40.17,,9110
+12602,9802,8824,41.43,,9110
+12602,9802,8826,2000000.0,,9003
+12602,9802,8827,0.0,,9003
+12630,9802,8821,39.5,,9110
+12630,9802,8822,-100.0,,9110
+12630,9802,8823,43.0,,9110
+12630,9802,8824,40.0,,9110
+12630,9802,8826,500000.0,,9001
+12630,9802,8827,0.0,,9001
+12701,9807,8801,34.45,,9110
+12701,9807,8802,-115.35,,9110
+12701,9807,8805,0.9999,,9201
+12701,9807,8806,500000.0,,9003
+12701,9807,8807,0.0,,9003
+12702,9807,8801,34.45,,9110
+12702,9807,8802,-116.4,,9110
+12702,9807,8805,0.9999,,9201
+12702,9807,8806,500000.0,,9003
+12702,9807,8807,0.0,,9003
+12703,9807,8801,34.45,,9110
+12703,9807,8802,-118.35,,9110
+12703,9807,8805,0.9999,,9201
+12703,9807,8806,500000.0,,9003
+12703,9807,8807,0.0,,9003
+12731,9807,8801,34.45,,9110
+12731,9807,8802,-115.35,,9110
+12731,9807,8805,0.9999,,9201
+12731,9807,8806,200000.0,,9001
+12731,9807,8807,8000000.0,,9001
+12732,9807,8801,34.45,,9110
+12732,9807,8802,-116.4,,9110
+12732,9807,8805,0.9999,,9201
+12732,9807,8806,500000.0,,9001
+12732,9807,8807,6000000.0,,9001
+12733,9807,8801,34.45,,9110
+12733,9807,8802,-118.35,,9110
+12733,9807,8805,0.9999,,9201
+12733,9807,8806,800000.0,,9001
+12733,9807,8807,4000000.0,,9001
+12800,9807,8801,42.3,,9110
+12800,9807,8802,-71.4,,9110
+12800,9807,8805,0.999966667,,9201
+12800,9807,8806,500000.0,,9003
+12800,9807,8807,0.0,,9003
+12830,9807,8801,42.3,,9110
+12830,9807,8802,-71.4,,9110
+12830,9807,8805,0.999966667,,9201
+12830,9807,8806,300000.0,,9001
+12830,9807,8807,0.0,,9001
+12900,9807,8801,38.5,,9110
+12900,9807,8802,-74.4,,9110
+12900,9807,8805,0.999975,,9201
+12900,9807,8806,2000000.0,,9003
+12900,9807,8807,0.0,,9003
+12930,9807,8801,38.5,,9110
+12930,9807,8802,-74.3,,9110
+12930,9807,8805,0.9999,,9201
+12930,9807,8806,150000.0,,9001
+12930,9807,8807,0.0,,9001
+13001,9807,8801,31.0,,9110
+13001,9807,8802,-104.2,,9110
+13001,9807,8805,0.999909091,,9201
+13001,9807,8806,500000.0,,9003
+13001,9807,8807,0.0,,9003
+13002,9807,8801,31.0,,9110
+13002,9807,8802,-106.15,,9110
+13002,9807,8805,0.9999,,9201
+13002,9807,8806,500000.0,,9003
+13002,9807,8807,0.0,,9003
+13003,9807,8801,31.0,,9110
+13003,9807,8802,-107.5,,9110
+13003,9807,8805,0.999916667,,9201
+13003,9807,8806,500000.0,,9003
+13003,9807,8807,0.0,,9003
+13031,9807,8801,31.0,,9110
+13031,9807,8802,-104.2,,9110
+13031,9807,8805,0.999909091,,9201
+13031,9807,8806,165000.0,,9001
+13031,9807,8807,0.0,,9001
+13032,9807,8801,31.0,,9110
+13032,9807,8802,-106.15,,9110
+13032,9807,8805,0.9999,,9201
+13032,9807,8806,500000.0,,9001
+13032,9807,8807,0.0,,9001
+13033,9807,8801,31.0,,9110
+13033,9807,8802,-107.5,,9110
+13033,9807,8805,0.999916667,,9201
+13033,9807,8806,830000.0,,9001
+13033,9807,8807,0.0,,9001
+13101,9807,8801,40.0,,9110
+13101,9807,8802,-74.2,,9110
+13101,9807,8805,0.999966667,,9201
+13101,9807,8806,500000.0,,9003
+13101,9807,8807,0.0,,9003
+13102,9807,8801,40.0,,9110
+13102,9807,8802,-76.35,,9110
+13102,9807,8805,0.9999375,,9201
+13102,9807,8806,500000.0,,9003
+13102,9807,8807,0.0,,9003
+13103,9807,8801,40.0,,9110
+13103,9807,8802,-78.35,,9110
+13103,9807,8805,0.9999375,,9201
+13103,9807,8806,500000.0,,9003
+13103,9807,8807,0.0,,9003
+13104,9802,8821,40.3,,9110
+13104,9802,8822,-74.0,,9110
+13104,9802,8823,41.02,,9110
+13104,9802,8824,40.4,,9110
+13104,9802,8826,1000000.0,,9003
+13104,9802,8827,0.0,,9003
+13131,9807,8801,38.5,,9110
+13131,9807,8802,-74.3,,9110
+13131,9807,8805,0.9999,,9201
+13131,9807,8806,150000.0,,9001
+13131,9807,8807,0.0,,9001
+13132,9807,8801,40.0,,9110
+13132,9807,8802,-76.35,,9110
+13132,9807,8805,0.9999375,,9201
+13132,9807,8806,250000.0,,9001
+13132,9807,8807,0.0,,9001
+13133,9807,8801,40.0,,9110
+13133,9807,8802,-78.35,,9110
+13133,9807,8805,0.9999375,,9201
+13133,9807,8806,350000.0,,9001
+13133,9807,8807,0.0,,9001
+13134,9802,8821,40.1,,9110
+13134,9802,8822,-74.0,,9110
+13134,9802,8823,41.02,,9110
+13134,9802,8824,40.4,,9110
+13134,9802,8826,300000.0,,9001
+13134,9802,8827,0.0,,9001
+13200,9802,8821,33.45,,9110
+13200,9802,8822,-79.0,,9110
+13200,9802,8823,34.2,,9110
+13200,9802,8824,36.1,,9110
+13200,9802,8826,2000000.0,,9003
+13200,9802,8827,0.0,,9003
+13230,9802,8821,33.45,,9110
+13230,9802,8822,-79.0,,9110
+13230,9802,8823,36.1,,9110
+13230,9802,8824,34.2,,9110
+13230,9802,8826,609601.22,,9001
+13230,9802,8827,0.0,,9001
+13301,9802,8821,47.0,,9110
+13301,9802,8822,-100.3,,9110
+13301,9802,8823,47.26,,9110
+13301,9802,8824,48.44,,9110
+13301,9802,8826,2000000.0,,9003
+13301,9802,8827,0.0,,9003
+13302,9802,8821,45.4,,9110
+13302,9802,8822,-100.3,,9110
+13302,9802,8823,46.11,,9110
+13302,9802,8824,47.29,,9110
+13302,9802,8826,2000000.0,,9003
+13302,9802,8827,0.0,,9003
+13331,9802,8821,47.0,,9110
+13331,9802,8822,-100.3,,9110
+13331,9802,8823,48.44,,9110
+13331,9802,8824,47.26,,9110
+13331,9802,8826,600000.0,,9001
+13331,9802,8827,0.0,,9001
+13332,9802,8821,45.4,,9110
+13332,9802,8822,-100.3,,9110
+13332,9802,8823,47.29,,9110
+13332,9802,8824,46.11,,9110
+13332,9802,8826,600000.0,,9001
+13332,9802,8827,0.0,,9001
+13401,9802,8821,39.4,,9110
+13401,9802,8822,-82.3,,9110
+13401,9802,8823,40.26,,9110
+13401,9802,8824,41.42,,9110
+13401,9802,8826,2000000.0,,9003
+13401,9802,8827,0.0,,9003
+13402,9802,8821,38.0,,9110
+13402,9802,8822,-82.3,,9110
+13402,9802,8823,38.44,,9110
+13402,9802,8824,40.02,,9110
+13402,9802,8826,2000000.0,,9003
+13402,9802,8827,0.0,,9003
+13431,9802,8821,39.4,,9110
+13431,9802,8822,-82.3,,9110
+13431,9802,8823,41.42,,9110
+13431,9802,8824,40.26,,9110
+13431,9802,8826,600000.0,,9001
+13431,9802,8827,0.0,,9001
+13432,9802,8821,38.0,,9110
+13432,9802,8822,-82.3,,9110
+13432,9802,8823,40.02,,9110
+13432,9802,8824,38.44,,9110
+13432,9802,8826,600000.0,,9001
+13432,9802,8827,0.0,,9001
+13501,9802,8821,35.0,,9110
+13501,9802,8822,-98.0,,9110
+13501,9802,8823,35.34,,9110
+13501,9802,8824,36.46,,9110
+13501,9802,8826,2000000.0,,9003
+13501,9802,8827,0.0,,9003
+13502,9802,8821,33.2,,9110
+13502,9802,8822,-98.0,,9110
+13502,9802,8823,33.56,,9110
+13502,9802,8824,35.14,,9110
+13502,9802,8826,2000000.0,,9003
+13502,9802,8827,0.0,,9003
+13531,9802,8821,35.0,,9110
+13531,9802,8822,-98.0,,9110
+13531,9802,8823,36.46,,9110
+13531,9802,8824,35.34,,9110
+13531,9802,8826,600000.0,,9001
+13531,9802,8827,0.0,,9001
+13532,9802,8821,33.2,,9110
+13532,9802,8822,-98.0,,9110
+13532,9802,8823,35.14,,9110
+13532,9802,8824,33.56,,9110
+13532,9802,8826,600000.0,,9001
+13532,9802,8827,0.0,,9001
+13601,9802,8821,43.4,,9110
+13601,9802,8822,-120.3,,9110
+13601,9802,8823,44.2,,9110
+13601,9802,8824,46.0,,9110
+13601,9802,8826,2000000.0,,9003
+13601,9802,8827,0.0,,9003
+13602,9802,8821,41.4,,9110
+13602,9802,8822,-120.3,,9110
+13602,9802,8823,42.2,,9110
+13602,9802,8824,44.0,,9110
+13602,9802,8826,2000000.0,,9003
+13602,9802,8827,0.0,,9003
+13631,9802,8821,43.4,,9110
+13631,9802,8822,-120.3,,9110
+13631,9802,8823,46.0,,9110
+13631,9802,8824,44.2,,9110
+13631,9802,8826,2500000.0,,9001
+13631,9802,8827,0.0,,9001
+13632,9802,8821,41.4,,9110
+13632,9802,8822,-120.3,,9110
+13632,9802,8823,44.0,,9110
+13632,9802,8824,42.2,,9110
+13632,9802,8826,1500000.0,,9001
+13632,9802,8827,0.0,,9001
+13701,9802,8821,40.1,,9110
+13701,9802,8822,-77.45,,9110
+13701,9802,8823,40.53,,9110
+13701,9802,8824,41.57,,9110
+13701,9802,8826,2000000.0,,9003
+13701,9802,8827,0.0,,9003
+13702,9802,8821,39.2,,9110
+13702,9802,8822,-77.45,,9110
+13702,9802,8823,39.56,,9110
+13702,9802,8824,40.48,,9110
+13702,9802,8826,2000000.0,,9003
+13702,9802,8827,0.0,,9003
+13731,9802,8821,40.1,,9110
+13731,9802,8822,-77.45,,9110
+13731,9802,8823,41.57,,9110
+13731,9802,8824,40.53,,9110
+13731,9802,8826,600000.0,,9001
+13731,9802,8827,0.0,,9001
+13732,9802,8821,39.2,,9110
+13732,9802,8822,-77.45,,9110
+13732,9802,8823,40.58,,9110
+13732,9802,8824,39.56,,9110
+13732,9802,8826,600000.0,,9001
+13732,9802,8827,0.0,,9001
+13800,9807,8801,41.05,,9110
+13800,9807,8802,-71.3,,9110
+13800,9807,8805,0.9999938,,9201
+13800,9807,8806,500000.0,,9003
+13800,9807,8807,0.0,,9003
+13830,9807,8801,41.05,,9110
+13830,9807,8802,-71.3,,9110
+13830,9807,8805,0.99999375,,9201
+13830,9807,8806,100000.0,,9001
+13830,9807,8807,0.0,,9001
+13901,9802,8821,33.0,,9110
+13901,9802,8822,-81.0,,9110
+13901,9802,8823,33.46,,9110
+13901,9802,8824,34.58,,9110
+13901,9802,8826,2000000.0,,9003
+13901,9802,8827,0.0,,9003
+13902,9802,8821,31.5,,9110
+13902,9802,8822,-81.0,,9110
+13902,9802,8823,32.2,,9110
+13902,9802,8824,33.4,,9110
+13902,9802,8826,2000000.0,,9003
+13902,9802,8827,0.0,,9003
+13930,9802,8821,31.5,,9110
+13930,9802,8822,-81.0,,9110
+13930,9802,8823,34.5,,9110
+13930,9802,8824,32.3,,9110
+13930,9802,8826,609600.0,,9001
+13930,9802,8827,0.0,,9001
+14001,9802,8821,43.5,,9110
+14001,9802,8822,-100.0,,9110
+14001,9802,8823,44.25,,9110
+14001,9802,8824,45.41,,9110
+14001,9802,8826,2000000.0,,9003
+14001,9802,8827,0.0,,9003
+14002,9802,8821,42.2,,9110
+14002,9802,8822,-100.2,,9110
+14002,9802,8823,42.5,,9110
+14002,9802,8824,44.24,,9110
+14002,9802,8826,2000000.0,,9003
+14002,9802,8827,0.0,,9003
+14031,9802,8821,43.5,,9110
+14031,9802,8822,-100.0,,9110
+14031,9802,8823,45.41,,9110
+14031,9802,8824,44.25,,9110
+14031,9802,8826,600000.0,,9001
+14031,9802,8827,0.0,,9001
+14032,9802,8821,42.2,,9110
+14032,9802,8822,-100.2,,9110
+14032,9802,8823,44.24,,9110
+14032,9802,8824,42.5,,9110
+14032,9802,8826,600000.0,,9001
+14032,9802,8827,0.0,,9001
+14100,9802,8821,34.4,,9110
+14100,9802,8822,-86.0,,9110
+14100,9802,8823,35.15,,9110
+14100,9802,8824,36.25,,9110
+14100,9802,8826,100000.0,,9003
+14100,9802,8827,0.0,,9003
+14130,9802,8821,34.2,,9110
+14130,9802,8822,-86.0,,9110
+14130,9802,8823,36.25,,9110
+14130,9802,8824,35.15,,9110
+14130,9802,8826,600000.0,,9001
+14130,9802,8827,0.0,,9001
+14201,9802,8821,34.0,,9110
+14201,9802,8822,-101.3,,9110
+14201,9802,8823,34.39,,9110
+14201,9802,8824,36.11,,9110
+14201,9802,8826,2000000.0,,9003
+14201,9802,8827,0.0,,9003
+14202,9802,8821,31.4,,9110
+14202,9802,8822,-97.3,,9110
+14202,9802,8823,32.08,,9110
+14202,9802,8824,33.58,,9110
+14202,9802,8826,2000000.0,,9003
+14202,9802,8827,0.0,,9003
+14203,9802,8821,29.4,,9110
+14203,9802,8822,-100.2,,9110
+14203,9802,8823,30.07,,9110
+14203,9802,8824,31.53,,9110
+14203,9802,8826,2000000.0,,9003
+14203,9802,8827,0.0,,9003
+14204,9802,8821,27.5,,9110
+14204,9802,8822,-99.0,,9110
+14204,9802,8823,28.23,,9110
+14204,9802,8824,30.17,,9110
+14204,9802,8826,2000000.0,,9003
+14204,9802,8827,0.0,,9003
+14205,9802,8821,25.4,,9110
+14205,9802,8822,-98.3,,9110
+14205,9802,8823,26.1,,9110
+14205,9802,8824,27.5,,9110
+14205,9802,8826,2000000.0,,9003
+14205,9802,8827,0.0,,9003
+14231,9802,8821,34.0,,9110
+14231,9802,8822,-101.3,,9110
+14231,9802,8823,36.11,,9110
+14231,9802,8824,34.39,,9110
+14231,9802,8826,200000.0,,9001
+14231,9802,8827,1000000.0,,9001
+14232,9802,8821,31.4,,9110
+14232,9802,8822,-98.3,,9110
+14232,9802,8823,33.58,,9110
+14232,9802,8824,32.08,,9110
+14232,9802,8826,600000.0,,9001
+14232,9802,8827,2000000.0,,9001
+14233,9802,8821,29.4,,9110
+14233,9802,8822,-100.2,,9110
+14233,9802,8823,31.53,,9110
+14233,9802,8824,30.07,,9110
+14233,9802,8826,700000.0,,9001
+14233,9802,8827,3000000.0,,9001
+14234,9802,8821,27.5,,9110
+14234,9802,8822,-99.0,,9110
+14234,9802,8823,30.17,,9110
+14234,9802,8824,28.23,,9110
+14234,9802,8826,600000.0,,9001
+14234,9802,8827,4000000.0,,9001
+14235,9802,8821,25.4,,9110
+14235,9802,8822,-98.3,,9110
+14235,9802,8823,27.5,,9110
+14235,9802,8824,26.1,,9110
+14235,9802,8826,300000.0,,9001
+14235,9802,8827,5000000.0,,9001
+14301,9802,8821,40.2,,9110
+14301,9802,8822,-111.3,,9110
+14301,9802,8823,40.43,,9110
+14301,9802,8824,41.47,,9110
+14301,9802,8826,2000000.0,,9003
+14301,9802,8827,0.0,,9003
+14302,9802,8821,38.2,,9110
+14302,9802,8822,-111.3,,9110
+14302,9802,8823,39.01,,9110
+14302,9802,8824,40.39,,9110
+14302,9802,8826,2000000.0,,9003
+14302,9802,8827,0.0,,9003
+14303,9802,8821,36.4,,9110
+14303,9802,8822,-111.3,,9110
+14303,9802,8823,37.13,,9110
+14303,9802,8824,38.21,,9110
+14303,9802,8826,2000000.0,,9003
+14303,9802,8827,0.0,,9003
+14331,9802,8821,40.2,,9110
+14331,9802,8822,-111.3,,9110
+14331,9802,8823,41.47,,9110
+14331,9802,8824,40.43,,9110
+14331,9802,8826,500000.0,,9001
+14331,9802,8827,1000000.0,,9001
+14332,9802,8821,38.2,,9110
+14332,9802,8822,-111.3,,9110
+14332,9802,8823,40.39,,9110
+14332,9802,8824,39.01,,9110
+14332,9802,8826,500000.0,,9001
+14332,9802,8827,2000000.0,,9001
+14333,9802,8821,36.4,,9110
+14333,9802,8822,-111.3,,9110
+14333,9802,8823,38.21,,9110
+14333,9802,8824,37.13,,9110
+14333,9802,8826,500000.0,,9001
+14333,9802,8827,3000000.0,,9001
+14400,9807,8801,42.3,,9110
+14400,9807,8802,-72.3,,9110
+14400,9807,8805,0.999964286,,9201
+14400,9807,8806,500000.0,,9003
+14400,9807,8807,0.0,,9003
+14430,9807,8801,42.3,,9110
+14430,9807,8802,-72.3,,9110
+14430,9807,8805,0.999964286,,9201
+14430,9807,8806,500000.0,,9001
+14430,9807,8807,0.0,,9001
+14501,9802,8821,37.4,,9110
+14501,9802,8822,-78.3,,9110
+14501,9802,8823,38.02,,9110
+14501,9802,8824,39.12,,9110
+14501,9802,8826,2000000.0,,9003
+14501,9802,8827,0.0,,9003
+14502,9802,8821,36.2,,9110
+14502,9802,8822,-78.3,,9110
+14502,9802,8823,36.46,,9110
+14502,9802,8824,37.58,,9110
+14502,9802,8826,2000000.0,,9003
+14502,9802,8827,0.0,,9003
+14531,9802,8821,37.4,,9110
+14531,9802,8822,-78.3,,9110
+14531,9802,8823,39.12,,9110
+14531,9802,8824,38.02,,9110
+14531,9802,8826,3500000.0,,9001
+14531,9802,8827,2000000.0,,9001
+14532,9802,8821,36.2,,9110
+14532,9802,8822,-78.3,,9110
+14532,9802,8823,37.58,,9110
+14532,9802,8824,36.46,,9110
+14532,9802,8826,3500000.0,,9001
+14532,9802,8827,1000000.0,,9001
+14601,9802,8821,47.0,,9110
+14601,9802,8822,-120.5,,9110
+14601,9802,8823,47.3,,9110
+14601,9802,8824,48.44,,9110
+14601,9802,8826,2000000.0,,9003
+14601,9802,8827,0.0,,9003
+14602,9802,8821,45.2,,9110
+14602,9802,8822,-120.3,,9110
+14602,9802,8823,45.5,,9110
+14602,9802,8824,47.2,,9110
+14602,9802,8826,2000000.0,,9003
+14602,9802,8827,0.0,,9003
+14631,9802,8821,47.0,,9110
+14631,9802,8822,-120.5,,9110
+14631,9802,8823,48.44,,9110
+14631,9802,8824,47.3,,9110
+14631,9802,8826,500000.0,,9001
+14631,9802,8827,0.0,,9001
+14632,9802,8821,45.2,,9110
+14632,9802,8822,-120.3,,9110
+14632,9802,8823,47.2,,9110
+14632,9802,8824,45.5,,9110
+14632,9802,8826,500000.0,,9001
+14632,9802,8827,0.0,,9001
+14701,9802,8821,38.3,,9110
+14701,9802,8822,-79.3,,9110
+14701,9802,8823,39.0,,9110
+14701,9802,8824,40.15,,9110
+14701,9802,8826,2000000.0,,9003
+14701,9802,8827,0.0,,9003
+14702,9802,8821,37.0,,9110
+14702,9802,8822,-81.0,,9110
+14702,9802,8823,37.29,,9110
+14702,9802,8824,38.53,,9110
+14702,9802,8826,2000000.0,,9003
+14702,9802,8827,0.0,,9003
+14731,9802,8821,38.3,,9110
+14731,9802,8822,-79.3,,9110
+14731,9802,8823,40.15,,9110
+14731,9802,8824,39.0,,9110
+14731,9802,8826,600000.0,,9001
+14731,9802,8827,0.0,,9001
+14732,9802,8821,37.0,,9110
+14732,9802,8822,-81.0,,9110
+14732,9802,8823,38.53,,9110
+14732,9802,8824,37.29,,9110
+14732,9802,8826,600000.0,,9001
+14732,9802,8827,0.0,,9001
+14801,9802,8821,45.1,,9110
+14801,9802,8822,-90.0,,9110
+14801,9802,8823,45.34,,9110
+14801,9802,8824,46.46,,9110
+14801,9802,8826,2000000.0,,9003
+14801,9802,8827,0.0,,9003
+14802,9802,8821,43.5,,9110
+14802,9802,8822,-90.0,,9110
+14802,9802,8823,44.15,,9110
+14802,9802,8824,45.3,,9110
+14802,9802,8826,2000000.0,,9003
+14802,9802,8827,0.0,,9003
+14803,9802,8821,42.0,,9110
+14803,9802,8822,-90.0,,9110
+14803,9802,8823,42.44,,9110
+14803,9802,8824,44.04,,9110
+14803,9802,8826,2000000.0,,9003
+14803,9802,8827,0.0,,9003
+14831,9802,8821,45.1,,9110
+14831,9802,8822,-90.0,,9110
+14831,9802,8823,46.46,,9110
+14831,9802,8824,45.34,,9110
+14831,9802,8826,600000.0,,9001
+14831,9802,8827,0.0,,9001
+14832,9802,8821,43.5,,9110
+14832,9802,8822,-90.0,,9110
+14832,9802,8823,45.3,,9110
+14832,9802,8824,44.15,,9110
+14832,9802,8826,600000.0,,9001
+14832,9802,8827,0.0,,9001
+14833,9802,8821,42.0,,9110
+14833,9802,8822,-90.0,,9110
+14833,9802,8823,44.04,,9110
+14833,9802,8824,42.44,,9110
+14833,9802,8826,600000.0,,9001
+14833,9802,8827,0.0,,9001
+14901,9807,8801,40.4,,9110
+14901,9807,8802,-105.1,,9110
+14901,9807,8805,0.999941177,,9201
+14901,9807,8806,500000.0,,9003
+14901,9807,8807,0.0,,9003
+14902,9807,8801,40.4,,9110
+14902,9807,8802,-107.2,,9110
+14902,9807,8805,0.999941177,,9201
+14902,9807,8806,500000.0,,9003
+14902,9807,8807,0.0,,9003
+14903,9807,8801,40.4,,9110
+14903,9807,8802,-108.45,,9110
+14903,9807,8805,0.999941177,,9201
+14903,9807,8806,500000.0,,9003
+14903,9807,8807,0.0,,9003
+14904,9807,8801,40.4,,9110
+14904,9807,8802,-110.05,,9110
+14904,9807,8805,0.999941177,,9201
+14904,9807,8806,500000.0,,9003
+14904,9807,8807,0.0,,9003
+14931,9807,8801,40.3,,9110
+14931,9807,8802,-105.1,,9110
+14931,9807,8805,0.9999375,,9201
+14931,9807,8806,200000.0,,9001
+14931,9807,8807,0.0,,9001
+14932,9807,8801,40.3,,9110
+14932,9807,8802,-107.2,,9110
+14932,9807,8805,0.9999375,,9201
+14932,9807,8806,400000.0,,9001
+14932,9807,8807,100000.0,,9001
+14933,9807,8801,40.3,,9110
+14933,9807,8802,-108.45,,9110
+14933,9807,8805,0.9999375,,9201
+14933,9807,8806,600000.0,,9001
+14933,9807,8807,0.0,,9001
+14934,9807,8801,40.3,,9110
+14934,9807,8802,-110.05,,9110
+14934,9807,8805,0.9999375,,9201
+14934,9807,8806,800000.0,,9001
+14934,9807,8807,100000.0,,9001
+15001,9812,8806,16404166.67,,9003
+15001,9812,8807,-16404166.67,,9003
+15001,9812,8811,57.0,,9110
+15001,9812,8812,-133.4,,9110
+15001,9812,8813,323.07483685,,9110
+15001,9812,8814,323.07483685,,9110
+15001,9812,8815,0.9999,,9201
+15002,9807,8801,54.0,,9102
+15002,9807,8802,-142.0,,9102
+15002,9807,8805,0.9999,,9201
+15002,9807,8806,500000.0,,9003
+15002,9807,8807,0.0,,9003
+15003,9807,8801,54.0,,9102
+15003,9807,8802,-146.0,,9102
+15003,9807,8805,0.9999,,9201
+15003,9807,8806,500000.0,,9003
+15003,9807,8807,0.0,,9003
+15004,9807,8801,54.0,,9102
+15004,9807,8802,-150.0,,9102
+15004,9807,8805,0.9999,,9201
+15004,9807,8806,500000.0,,9003
+15004,9807,8807,0.0,,9003
+15005,9807,8801,54.0,,9102
+15005,9807,8802,-154.0,,9102
+15005,9807,8805,0.9999,,9201
+15005,9807,8806,500000.0,,9003
+15005,9807,8807,0.0,,9003
+15006,9807,8801,54.0,,9102
+15006,9807,8802,-158.0,,9102
+15006,9807,8805,0.9999,,9201
+15006,9807,8806,500000.0,,9003
+15006,9807,8807,0.0,,9003
+15007,9807,8801,54.0,,9102
+15007,9807,8802,-162.0,,9102
+15007,9807,8805,0.9999,,9201
+15007,9807,8806,700000.0,,9003
+15007,9807,8807,0.0,,9003
+15008,9807,8801,54.0,,9102
+15008,9807,8802,-166.0,,9102
+15008,9807,8805,0.9999,,9201
+15008,9807,8806,500000.0,,9003
+15008,9807,8807,0.0,,9003
+15009,9807,8801,54.0,,9102
+15009,9807,8802,-170.0,,9102
+15009,9807,8805,0.9999,,9201
+15009,9807,8806,600000.0,,9003
+15009,9807,8807,0.0,,9003
+15010,9802,8821,51.0,,9110
+15010,9802,8822,-176.0,,9110
+15010,9802,8823,53.5,,9110
+15010,9802,8824,51.5,,9110
+15010,9802,8826,3000000.0,,9003
+15010,9802,8827,0.0,,9003
+15031,9812,8806,5000000.0,,9001
+15031,9812,8807,-5000000.0,,9001
+15031,9812,8811,57.0,,9110
+15031,9812,8812,-133.4,,9110
+15031,9812,8813,323.07483685,,9110
+15031,9812,8814,323.07483685,,9110
+15031,9812,8815,0.9999,,9201
+15032,9807,8801,54.0,,9102
+15032,9807,8802,-142.0,,9102
+15032,9807,8805,0.9999,,9201
+15032,9807,8806,500000.0,,9001
+15032,9807,8807,0.0,,9001
+15033,9807,8801,54.0,,9102
+15033,9807,8802,-146.0,,9102
+15033,9807,8805,0.9999,,9201
+15033,9807,8806,500000.0,,9001
+15033,9807,8807,0.0,,9001
+15034,9807,8801,54.0,,9102
+15034,9807,8802,-150.0,,9102
+15034,9807,8805,0.9999,,9201
+15034,9807,8806,500000.0,,9001
+15034,9807,8807,0.0,,9001
+15035,9807,8801,54.0,,9102
+15035,9807,8802,-154.0,,9102
+15035,9807,8805,0.9999,,9201
+15035,9807,8806,500000.0,,9001
+15035,9807,8807,0.0,,9001
+15036,9807,8801,54.0,,9102
+15036,9807,8802,-158.0,,9102
+15036,9807,8805,0.9999,,9201
+15036,9807,8806,500000.0,,9001
+15036,9807,8807,0.0,,9001
+15037,9807,8801,54.0,,9102
+15037,9807,8802,-162.0,,9102
+15037,9807,8805,0.9999,,9201
+15037,9807,8806,500000.0,,9001
+15037,9807,8807,0.0,,9001
+15038,9807,8801,54.0,,9102
+15038,9807,8802,-166.0,,9102
+15038,9807,8805,0.9999,,9201
+15038,9807,8806,500000.0,,9001
+15038,9807,8807,0.0,,9001
+15039,9807,8801,54.0,,9102
+15039,9807,8802,-170.0,,9102
+15039,9807,8805,0.9999,,9201
+15039,9807,8806,500000.0,,9001
+15039,9807,8807,0.0,,9001
+15040,9802,8821,51.0,,9110
+15040,9802,8822,-176.0,,9110
+15040,9802,8823,53.5,,9110
+15040,9802,8824,51.5,,9110
+15040,9802,8826,1000000.0,,9001
+15040,9802,8827,0.0,,9001
+15101,9807,8801,18.5,,9110
+15101,9807,8802,-155.3,,9110
+15101,9807,8805,0.999966667,,9201
+15101,9807,8806,500000.0,,9003
+15101,9807,8807,0.0,,9003
+15102,9807,8801,20.2,,9110
+15102,9807,8802,-156.4,,9110
+15102,9807,8805,0.999966667,,9201
+15102,9807,8806,500000.0,,9003
+15102,9807,8807,0.0,,9003
+15103,9807,8801,21.1,,9110
+15103,9807,8802,-158.0,,9110
+15103,9807,8805,0.99999,,9201
+15103,9807,8806,500000.0,,9003
+15103,9807,8807,0.0,,9003
+15104,9807,8801,21.5,,9110
+15104,9807,8802,-159.3,,9110
+15104,9807,8805,0.99999,,9201
+15104,9807,8806,500000.0,,9003
+15104,9807,8807,0.0,,9003
+15105,9807,8801,21.4,,9110
+15105,9807,8802,-160.1,,9110
+15105,9807,8805,1.0,,9201
+15105,9807,8806,500000.0,,9003
+15105,9807,8807,0.0,,9003
+15131,9807,8801,18.5,,9110
+15131,9807,8802,-155.3,,9110
+15131,9807,8805,0.999966667,,9201
+15131,9807,8806,500000.0,,9001
+15131,9807,8807,0.0,,9001
+15132,9807,8801,20.2,,9110
+15132,9807,8802,-156.4,,9110
+15132,9807,8805,0.999966667,,9201
+15132,9807,8806,500000.0,,9001
+15132,9807,8807,0.0,,9001
+15133,9807,8801,21.1,,9110
+15133,9807,8802,-158.0,,9110
+15133,9807,8805,0.99999,,9201
+15133,9807,8806,500000.0,,9001
+15133,9807,8807,0.0,,9001
+15134,9807,8801,21.5,,9110
+15134,9807,8802,-159.3,,9110
+15134,9807,8805,0.99999,,9201
+15134,9807,8806,500000.0,,9001
+15134,9807,8807,0.0,,9001
+15135,9807,8801,21.4,,9110
+15135,9807,8802,-160.1,,9110
+15135,9807,8805,1.0,,9201
+15135,9807,8806,500000.0,,9001
+15135,9807,8807,0.0,,9001
+15201,9802,8821,17.5,,9110
+15201,9802,8822,-66.26,,9110
+15201,9802,8823,18.26,,9110
+15201,9802,8824,18.02,,9110
+15201,9802,8826,500000.0,,9003
+15201,9802,8827,0.0,,9003
+15202,9802,8821,17.5,,9110
+15202,9802,8822,-66.26,,9110
+15202,9802,8823,18.26,,9110
+15202,9802,8824,18.02,,9110
+15202,9802,8826,500000.0,,9003
+15202,9802,8827,100000.0,,9003
+15230,9802,8821,17.5,,9110
+15230,9802,8822,-66.26,,9110
+15230,9802,8823,18.26,,9110
+15230,9802,8824,18.02,,9110
+15230,9802,8826,200000.0,,9001
+15230,9802,8827,200000.0,,9001
+15300,9801,8801,-14.16,,9110
+15300,9801,8802,170.0,,9110
+15300,9801,8805,1.0,,9201
+15300,9801,8806,500000.0,,9003
+15300,9801,8807,0.0,,9003
+15301,9801,8801,-14.16,,9110
+15301,9801,8802,-170.0,,9110
+15301,9801,8805,1.0,,9201
+15301,9801,8806,500000.0,,9003
+15301,9801,8807,0.0,,9003
+15302,9802,8821,34.4,,9110
+15302,9802,8822,-86.0,,9110
+15302,9802,8823,35.15,,9110
+15302,9802,8824,36.25,,9110
+15302,9802,8826,2000000.0,,9003
+15302,9802,8827,100000.0,,9003
+15303,9802,8821,37.3,,9110
+15303,9802,8822,-84.15,,9110
+15303,9802,8823,37.58,,9110
+15303,9802,8824,38.58,,9110
+15303,9802,8826,500000.0,,9001
+15303,9802,8827,0.0,,9001
+15304,9807,8801,31.0,,9110
+15304,9807,8802,-110.1,,9110
+15304,9807,8805,0.9999,,9201
+15304,9807,8806,700000.0,,9002
+15304,9807,8807,0.0,,9002
+15305,9807,8801,31.0,,9110
+15305,9807,8802,-111.55,,9110
+15305,9807,8805,0.9999,,9201
+15305,9807,8806,700000.0,,9002
+15305,9807,8807,0.0,,9002
+15306,9807,8801,31.0,,9110
+15306,9807,8802,-113.45,,9110
+15306,9807,8805,0.999933333,,9201
+15306,9807,8806,700000.0,,9002
+15306,9807,8807,0.0,,9002
+15307,9802,8821,39.2,,9110
+15307,9802,8822,-122.0,,9110
+15307,9802,8823,41.4,,9110
+15307,9802,8824,40.0,,9110
+15307,9802,8826,6561666.667,,9003
+15307,9802,8827,1640416.667,,9003
+15308,9802,8821,37.4,,9110
+15308,9802,8822,-122.0,,9110
+15308,9802,8823,39.5,,9110
+15308,9802,8824,38.2,,9110
+15308,9802,8826,6561666.667,,9003
+15308,9802,8827,1640416.667,,9003
+15309,9802,8821,36.3,,9110
+15309,9802,8822,-120.3,,9110
+15309,9802,8823,38.26,,9110
+15309,9802,8824,37.04,,9110
+15309,9802,8826,6561666.667,,9003
+15309,9802,8827,1640416.667,,9003
+15310,9802,8821,35.2,,9110
+15310,9802,8822,-119.0,,9110
+15310,9802,8823,37.15,,9110
+15310,9802,8824,36.0,,9110
+15310,9802,8826,6561666.667,,9003
+15310,9802,8827,1640416.667,,9003
+15311,9802,8821,33.3,,9110
+15311,9802,8822,-118.0,,9110
+15311,9802,8823,35.28,,9110
+15311,9802,8824,34.02,,9110
+15311,9802,8826,6561666.667,,9003
+15311,9802,8827,1640416.667,,9003
+15312,9802,8821,32.1,,9110
+15312,9802,8822,-116.15,,9110
+15312,9802,8823,33.53,,9110
+15312,9802,8824,32.47,,9110
+15312,9802,8826,6561666.667,,9003
+15312,9802,8827,1640416.667,,9003
+15313,9802,8821,39.2,,9110
+15313,9802,8822,-105.3,,9110
+15313,9802,8823,40.47,,9110
+15313,9802,8824,39.43,,9110
+15313,9802,8826,3000000.0,,9003
+15313,9802,8827,1000000.0,,9003
+15314,9802,8821,37.5,,9110
+15314,9802,8822,-105.3,,9110
+15314,9802,8823,39.45,,9110
+15314,9802,8824,38.27,,9110
+15314,9802,8826,3000000.0,,9003
+15314,9802,8827,1000000.0,,9003
+15315,9802,8821,36.4,,9110
+15315,9802,8822,-105.3,,9110
+15315,9802,8823,38.26,,9110
+15315,9802,8824,37.14,,9110
+15315,9802,8826,3000000.0,,9003
+15315,9802,8827,1000000.0,,9003
+15316,9802,8821,40.5,,9110
+15316,9802,8822,-72.45,,9110
+15316,9802,8823,41.52,,9110
+15316,9802,8824,41.12,,9110
+15316,9802,8826,1000000.0,,9003
+15316,9802,8827,500000.0,,9003
+15317,9807,8801,38.0,,9110
+15317,9807,8802,-75.25,,9110
+15317,9807,8805,0.999995,,9201
+15317,9807,8806,656166.667,,9003
+15317,9807,8807,0.0,,9003
+15318,9807,8801,24.2,,9110
+15318,9807,8802,-81.0,,9110
+15318,9807,8805,0.999941177,,9201
+15318,9807,8806,656166.667,,9003
+15318,9807,8807,0.0,,9003
+15319,9807,8801,24.2,,9110
+15319,9807,8802,-82.0,,9110
+15319,9807,8805,0.999941177,,9201
+15319,9807,8806,656166.667,,9003
+15319,9807,8807,0.0,,9003
+15320,9802,8821,29.0,,9110
+15320,9802,8822,-84.3,,9110
+15320,9802,8823,30.45,,9110
+15320,9802,8824,29.35,,9110
+15320,9802,8826,1968500.0,,9003
+15320,9802,8827,0.0,,9003
+15321,9807,8801,30.0,,9110
+15321,9807,8802,-82.1,,9110
+15321,9807,8805,0.9999,,9201
+15321,9807,8806,656166.667,,9003
+15321,9807,8807,0.0,,9003
+15322,9807,8801,30.0,,9110
+15322,9807,8802,-84.1,,9110
+15322,9807,8805,0.9999,,9201
+15322,9807,8806,2296583.333,,9003
+15322,9807,8807,0.0,,9003
+15323,9807,8801,41.4,,9110
+15323,9807,8802,-112.1,,9110
+15323,9807,8805,0.999947368,,9201
+15323,9807,8806,656166.667,,9003
+15323,9807,8807,0.0,,9003
+15324,9807,8801,41.4,,9110
+15324,9807,8802,-114.0,,9110
+15324,9807,8805,0.999947368,,9201
+15324,9807,8806,1640416.667,,9003
+15324,9807,8807,0.0,,9003
+15325,9807,8801,41.4,,9110
+15325,9807,8802,-115.45,,9110
+15325,9807,8805,0.999933333,,9201
+15325,9807,8806,2624666.667,,9003
+15325,9807,8807,0.0,,9003
+15326,9807,8801,37.3,,9110
+15326,9807,8802,-85.4,,9110
+15326,9807,8805,0.999966667,,9201
+15326,9807,8806,328083.333,,9003
+15326,9807,8807,818125.0,,9003
+15327,9807,8801,37.3,,9110
+15327,9807,8802,-87.05,,9110
+15327,9807,8805,0.999966667,,9201
+15327,9807,8806,2952750.0,,9003
+15327,9807,8807,818125.0,,9003
+15328,9802,8821,37.3,,9110
+15328,9802,8822,-84.15,,9110
+15328,9802,8823,37.58,,9110
+15328,9802,8824,38.58,,9110
+15328,9802,8826,1640416.667,,9003
+15328,9802,8827,0.0,,9003
+15329,9802,8821,36.2,,9110
+15329,9802,8822,-85.45,,9110
+15329,9802,8823,37.56,,9110
+15329,9802,8824,36.44,,9110
+15329,9802,8826,1640416.667,,9003
+15329,9802,8827,1640416.667,,9003
+15330,9802,8821,37.4,,9110
+15330,9802,8822,-77.0,,9110
+15330,9802,8823,39.27,,9110
+15330,9802,8824,38.18,,9110
+15330,9802,8826,1312333.333,,9003
+15330,9802,8827,0.0,,9003
+15331,9802,8821,41.0,,9110
+15331,9802,8822,-71.3,,9110
+15331,9802,8823,42.41,,9110
+15331,9802,8824,41.43,,9110
+15331,9802,8826,656166.667,,9003
+15331,9802,8827,2460625.0,,9003
+15332,9802,8821,41.0,,9110
+15332,9802,8822,-70.3,,9110
+15332,9802,8823,41.29,,9110
+15332,9802,8824,41.17,,9110
+15332,9802,8826,1640416.667,,9003
+15332,9802,8827,0.0,,9003
+15333,9802,8821,44.47,,9110
+15333,9802,8822,-87.0,,9110
+15333,9802,8823,47.05,,9110
+15333,9802,8824,45.29,,9110
+15333,9802,8826,26246719.16,,9002
+15333,9802,8827,0.0,,9002
+15334,9802,8821,43.19,,9110
+15334,9802,8822,-84.22,,9110
+15334,9802,8823,45.42,,9110
+15334,9802,8824,44.11,,9110
+15334,9802,8826,19685039.37,,9002
+15334,9802,8827,0.0,,9002
+15335,9802,8821,41.3,,9110
+15335,9802,8822,-84.22,,9110
+15335,9802,8823,43.4,,9110
+15335,9802,8824,42.06,,9110
+15335,9802,8826,13123359.58,,9002
+15335,9802,8827,0.0,,9002
+15336,9807,8801,29.3,,9110
+15336,9807,8802,-88.5,,9110
+15336,9807,8805,0.99995,,9201
+15336,9807,8806,984250.0,,9003
+15336,9807,8807,0.0,,9003
+15337,9807,8801,29.3,,9110
+15337,9807,8802,-90.2,,9110
+15337,9807,8805,0.99995,,9201
+15337,9807,8806,2296583.333,,9003
+15337,9807,8807,0.0,,9003
+15338,9802,8821,44.15,,9110
+15338,9802,8822,-109.3,,9110
+15338,9802,8823,49.0,,9110
+15338,9802,8824,45.0,,9110
+15338,9802,8826,1968503.937,,9002
+15338,9802,8827,0.0,,9002
+15339,9807,8801,31.0,,9110
+15339,9807,8802,-104.2,,9110
+15339,9807,8805,0.999909091,,9201
+15339,9807,8806,541337.5,,9003
+15339,9807,8807,0.0,,9003
+15340,9807,8801,31.0,,9110
+15340,9807,8802,-106.15,,9110
+15340,9807,8805,0.9999,,9201
+15340,9807,8806,1640416.667,,9003
+15340,9807,8807,0.0,,9003
+15341,9807,8801,31.0,,9110
+15341,9807,8802,-107.5,,9110
+15341,9807,8805,0.999916667,,9201
+15341,9807,8806,2723091.667,,9003
+15341,9807,8807,0.0,,9003
+15342,9807,8801,38.5,,9110
+15342,9807,8802,-74.3,,9110
+15342,9807,8805,0.9999,,9201
+15342,9807,8806,492125.0,,9003
+15342,9807,8807,0.0,,9003
+15343,9807,8801,40.0,,9110
+15343,9807,8802,-76.35,,9110
+15343,9807,8805,0.9999375,,9201
+15343,9807,8806,820208.333,,9003
+15343,9807,8807,0.0,,9003
+15344,9807,8801,40.0,,9110
+15344,9807,8802,-78.35,,9110
+15344,9807,8805,0.9999375,,9201
+15344,9807,8806,1148291.667,,9003
+15344,9807,8807,0.0,,9003
+15345,9802,8821,40.1,,9110
+15345,9802,8822,-74.0,,9110
+15345,9802,8823,41.02,,9110
+15345,9802,8824,40.4,,9110
+15345,9802,8826,984250.0,,9003
+15345,9802,8827,0.0,,9003
+15346,9802,8821,33.45,,9110
+15346,9802,8822,-79.0,,9110
+15346,9802,8823,36.1,,9110
+15346,9802,8824,34.2,,9110
+15346,9802,8826,2000000.0,,9003
+15346,9802,8827,0.0,,9003
+15347,9802,8821,47.0,,9110
+15347,9802,8822,-100.3,,9110
+15347,9802,8823,48.44,,9110
+15347,9802,8824,47.26,,9110
+15347,9802,8826,1968503.937,,9002
+15347,9802,8827,0.0,,9002
+15348,9802,8821,45.4,,9110
+15348,9802,8822,-100.3,,9110
+15348,9802,8823,47.29,,9110
+15348,9802,8824,46.11,,9110
+15348,9802,8826,1968503.937,,9002
+15348,9802,8827,0.0,,9002
+15349,9802,8821,35.0,,9110
+15349,9802,8822,-98.0,,9110
+15349,9802,8823,36.46,,9110
+15349,9802,8824,35.34,,9110
+15349,9802,8826,1968500.0,,9003
+15349,9802,8827,0.0,,9003
+15350,9802,8821,33.2,,9110
+15350,9802,8822,-98.0,,9110
+15350,9802,8823,35.14,,9110
+15350,9802,8824,33.56,,9110
+15350,9802,8826,1968500.0,,9003
+15350,9802,8827,0.0,,9003
+15351,9802,8821,43.4,,9110
+15351,9802,8822,-120.3,,9110
+15351,9802,8823,46.0,,9110
+15351,9802,8824,44.2,,9110
+15351,9802,8826,8202099.738,,9002
+15351,9802,8827,0.0,,9002
+15352,9802,8821,41.4,,9110
+15352,9802,8822,-120.3,,9110
+15352,9802,8823,44.0,,9110
+15352,9802,8824,42.2,,9110
+15352,9802,8826,4921259.843,,9002
+15352,9802,8827,0.0,,9002
+15353,9802,8821,40.1,,9110
+15353,9802,8822,-77.45,,9110
+15353,9802,8823,41.57,,9110
+15353,9802,8824,40.53,,9110
+15353,9802,8826,1968500.0,,9003
+15353,9802,8827,0.0,,9003
+15354,9802,8821,39.2,,9110
+15354,9802,8822,-77.45,,9110
+15354,9802,8823,40.58,,9110
+15354,9802,8824,39.56,,9110
+15354,9802,8826,1968500.0,,9003
+15354,9802,8827,0.0,,9003
+15355,9802,8821,31.5,,9110
+15355,9802,8822,-81.0,,9110
+15355,9802,8823,34.5,,9110
+15355,9802,8824,32.3,,9110
+15355,9802,8826,2000000.0,,9002
+15355,9802,8827,0.0,,9002
+15356,9802,8821,34.2,,9110
+15356,9802,8822,-86.0,,9110
+15356,9802,8823,36.25,,9110
+15356,9802,8824,35.15,,9110
+15356,9802,8826,1968500.0,,9003
+15356,9802,8827,0.0,,9003
+15357,9802,8821,34.0,,9110
+15357,9802,8822,-101.3,,9110
+15357,9802,8823,36.11,,9110
+15357,9802,8824,34.39,,9110
+15357,9802,8826,656166.667,,9003
+15357,9802,8827,3280833.333,,9003
+15358,9802,8821,31.4,,9110
+15358,9802,8822,-98.3,,9110
+15358,9802,8823,33.58,,9110
+15358,9802,8824,32.08,,9110
+15358,9802,8826,1968500.0,,9003
+15358,9802,8827,6561666.667,,9003
+15359,9802,8821,29.4,,9110
+15359,9802,8822,-100.2,,9110
+15359,9802,8823,31.53,,9110
+15359,9802,8824,30.07,,9110
+15359,9802,8826,2296583.333,,9003
+15359,9802,8827,9842500.0,,9003
+15360,9802,8821,27.5,,9110
+15360,9802,8822,-99.0,,9110
+15360,9802,8823,30.17,,9110
+15360,9802,8824,28.23,,9110
+15360,9802,8826,1968500.0,,9003
+15360,9802,8827,13123333.333,,9003
+15361,9802,8821,25.4,,9110
+15361,9802,8822,-98.3,,9110
+15361,9802,8823,27.5,,9110
+15361,9802,8824,26.1,,9110
+15361,9802,8826,984250.0,,9003
+15361,9802,8827,16404166.667,,9003
+15362,9802,8821,40.2,,9110
+15362,9802,8822,-111.3,,9110
+15362,9802,8823,41.47,,9110
+15362,9802,8824,40.43,,9110
+15362,9802,8826,1640419.948,,9002
+15362,9802,8827,3280839.895,,9002
+15363,9802,8821,38.2,,9110
+15363,9802,8822,-111.3,,9110
+15363,9802,8823,40.39,,9110
+15363,9802,8824,39.01,,9110
+15363,9802,8826,1640419.948,,9002
+15363,9802,8827,6561679.79,,9002
+15364,9802,8821,36.4,,9110
+15364,9802,8822,-111.3,,9110
+15364,9802,8823,38.21,,9110
+15364,9802,8824,37.13,,9110
+15364,9802,8826,1640419.948,,9002
+15364,9802,8827,9842519.685,,9002
+15365,9802,8821,37.4,,9110
+15365,9802,8822,-78.3,,9110
+15365,9802,8823,39.12,,9110
+15365,9802,8824,38.02,,9110
+15365,9802,8826,11482916.667,,9003
+15365,9802,8827,6561666.667,,9003
+15366,9802,8821,36.2,,9110
+15366,9802,8822,-78.3,,9110
+15366,9802,8823,37.58,,9110
+15366,9802,8824,36.46,,9110
+15366,9802,8826,11482916.667,,9003
+15366,9802,8827,3280833.333,,9003
+15367,9802,8821,47.0,,9110
+15367,9802,8822,-120.5,,9110
+15367,9802,8823,48.44,,9110
+15367,9802,8824,47.3,,9110
+15367,9802,8826,1640416.667,,9003
+15367,9802,8827,0.0,,9003
+15368,9802,8821,45.2,,9110
+15368,9802,8822,-120.3,,9110
+15368,9802,8823,47.2,,9110
+15368,9802,8824,45.5,,9110
+15368,9802,8826,1640416.667,,9003
+15368,9802,8827,0.0,,9003
+15369,9802,8821,45.1,,9110
+15369,9802,8822,-90.0,,9110
+15369,9802,8823,46.46,,9110
+15369,9802,8824,45.34,,9110
+15369,9802,8826,1968500.0,,9003
+15369,9802,8827,0.0,,9003
+15370,9802,8821,43.5,,9110
+15370,9802,8822,-90.0,,9110
+15370,9802,8823,45.3,,9110
+15370,9802,8824,44.15,,9110
+15370,9802,8826,1968500.0,,9003
+15370,9802,8827,0.0,,9003
+15371,9802,8821,42.0,,9110
+15371,9802,8822,-90.0,,9110
+15371,9802,8823,44.04,,9110
+15371,9802,8824,42.44,,9110
+15371,9802,8826,1968500.0,,9003
+15371,9802,8827,0.0,,9003
+15914,9807,8801,0.0,,9102
+15914,9807,8802,-99.0,,9102
+15914,9807,8805,0.9996,,9201
+15914,9807,8806,1640416.67,,9003
+15914,9807,8807,0.0,,9003
+15915,9807,8801,0.0,,9102
+15915,9807,8802,-93.0,,9102
+15915,9807,8805,0.9996,,9201
+15915,9807,8806,1640416.67,,9003
+15915,9807,8807,0.0,,9003
+15916,9807,8801,0.0,,9102
+15916,9807,8802,-87.0,,9102
+15916,9807,8805,0.9996,,9201
+15916,9807,8806,1640416.67,,9003
+15916,9807,8807,0.0,,9003
+15917,9807,8801,0.0,,9102
+15917,9807,8802,-81.0,,9102
+15917,9807,8805,0.9996,,9201
+15917,9807,8806,1640416.67,,9003
+15917,9807,8807,0.0,,9003
+16000,9824,8801,0.0,,9102
+16000,9824,8805,0.9996,,9201
+16000,9824,8806,500000.0,,9001
+16000,9824,8807,0.0,,9001
+16000,9824,8830,-180.0,,9102
+16000,9824,8831,6.0,,9102
+16001,9807,8801,0.0,,9102
+16001,9807,8802,-177.0,,9102
+16001,9807,8805,0.9996,,9201
+16001,9807,8806,500000.0,,9001
+16001,9807,8807,0.0,,9001
+16002,9807,8801,0.0,,9102
+16002,9807,8802,-171.0,,9102
+16002,9807,8805,0.9996,,9201
+16002,9807,8806,500000.0,,9001
+16002,9807,8807,0.0,,9001
+16003,9807,8801,0.0,,9102
+16003,9807,8802,-165.0,,9102
+16003,9807,8805,0.9996,,9201
+16003,9807,8806,500000.0,,9001
+16003,9807,8807,0.0,,9001
+16004,9807,8801,0.0,,9102
+16004,9807,8802,-159.0,,9102
+16004,9807,8805,0.9996,,9201
+16004,9807,8806,500000.0,,9001
+16004,9807,8807,0.0,,9001
+16005,9807,8801,0.0,,9102
+16005,9807,8802,-153.0,,9102
+16005,9807,8805,0.9996,,9201
+16005,9807,8806,500000.0,,9001
+16005,9807,8807,0.0,,9001
+16006,9807,8801,0.0,,9102
+16006,9807,8802,-147.0,,9102
+16006,9807,8805,0.9996,,9201
+16006,9807,8806,500000.0,,9001
+16006,9807,8807,0.0,,9001
+16007,9807,8801,0.0,,9102
+16007,9807,8802,-141.0,,9102
+16007,9807,8805,0.9996,,9201
+16007,9807,8806,500000.0,,9001
+16007,9807,8807,0.0,,9001
+16008,9807,8801,0.0,,9102
+16008,9807,8802,-135.0,,9102
+16008,9807,8805,0.9996,,9201
+16008,9807,8806,500000.0,,9001
+16008,9807,8807,0.0,,9001
+16009,9807,8801,0.0,,9102
+16009,9807,8802,-129.0,,9102
+16009,9807,8805,0.9996,,9201
+16009,9807,8806,500000.0,,9001
+16009,9807,8807,0.0,,9001
+16010,9807,8801,0.0,,9102
+16010,9807,8802,-123.0,,9102
+16010,9807,8805,0.9996,,9201
+16010,9807,8806,500000.0,,9001
+16010,9807,8807,0.0,,9001
+16011,9807,8801,0.0,,9102
+16011,9807,8802,-117.0,,9102
+16011,9807,8805,0.9996,,9201
+16011,9807,8806,500000.0,,9001
+16011,9807,8807,0.0,,9001
+16012,9807,8801,0.0,,9102
+16012,9807,8802,-111.0,,9102
+16012,9807,8805,0.9996,,9201
+16012,9807,8806,500000.0,,9001
+16012,9807,8807,0.0,,9001
+16013,9807,8801,0.0,,9102
+16013,9807,8802,-105.0,,9102
+16013,9807,8805,0.9996,,9201
+16013,9807,8806,500000.0,,9001
+16013,9807,8807,0.0,,9001
+16014,9807,8801,0.0,,9102
+16014,9807,8802,-99.0,,9102
+16014,9807,8805,0.9996,,9201
+16014,9807,8806,500000.0,,9001
+16014,9807,8807,0.0,,9001
+16015,9807,8801,0.0,,9102
+16015,9807,8802,-93.0,,9102
+16015,9807,8805,0.9996,,9201
+16015,9807,8806,500000.0,,9001
+16015,9807,8807,0.0,,9001
+16016,9807,8801,0.0,,9102
+16016,9807,8802,-87.0,,9102
+16016,9807,8805,0.9996,,9201
+16016,9807,8806,500000.0,,9001
+16016,9807,8807,0.0,,9001
+16017,9807,8801,0.0,,9102
+16017,9807,8802,-81.0,,9102
+16017,9807,8805,0.9996,,9201
+16017,9807,8806,500000.0,,9001
+16017,9807,8807,0.0,,9001
+16018,9807,8801,0.0,,9102
+16018,9807,8802,-75.0,,9102
+16018,9807,8805,0.9996,,9201
+16018,9807,8806,500000.0,,9001
+16018,9807,8807,0.0,,9001
+16019,9807,8801,0.0,,9102
+16019,9807,8802,-69.0,,9102
+16019,9807,8805,0.9996,,9201
+16019,9807,8806,500000.0,,9001
+16019,9807,8807,0.0,,9001
+16020,9807,8801,0.0,,9102
+16020,9807,8802,-63.0,,9102
+16020,9807,8805,0.9996,,9201
+16020,9807,8806,500000.0,,9001
+16020,9807,8807,0.0,,9001
+16021,9807,8801,0.0,,9102
+16021,9807,8802,-57.0,,9102
+16021,9807,8805,0.9996,,9201
+16021,9807,8806,500000.0,,9001
+16021,9807,8807,0.0,,9001
+16022,9807,8801,0.0,,9102
+16022,9807,8802,-51.0,,9102
+16022,9807,8805,0.9996,,9201
+16022,9807,8806,500000.0,,9001
+16022,9807,8807,0.0,,9001
+16023,9807,8801,0.0,,9102
+16023,9807,8802,-45.0,,9102
+16023,9807,8805,0.9996,,9201
+16023,9807,8806,500000.0,,9001
+16023,9807,8807,0.0,,9001
+16024,9807,8801,0.0,,9102
+16024,9807,8802,-39.0,,9102
+16024,9807,8805,0.9996,,9201
+16024,9807,8806,500000.0,,9001
+16024,9807,8807,0.0,,9001
+16025,9807,8801,0.0,,9102
+16025,9807,8802,-33.0,,9102
+16025,9807,8805,0.9996,,9201
+16025,9807,8806,500000.0,,9001
+16025,9807,8807,0.0,,9001
+16026,9807,8801,0.0,,9102
+16026,9807,8802,-27.0,,9102
+16026,9807,8805,0.9996,,9201
+16026,9807,8806,500000.0,,9001
+16026,9807,8807,0.0,,9001
+16027,9807,8801,0.0,,9102
+16027,9807,8802,-21.0,,9102
+16027,9807,8805,0.9996,,9201
+16027,9807,8806,500000.0,,9001
+16027,9807,8807,0.0,,9001
+16028,9807,8801,0.0,,9102
+16028,9807,8802,-15.0,,9102
+16028,9807,8805,0.9996,,9201
+16028,9807,8806,500000.0,,9001
+16028,9807,8807,0.0,,9001
+16029,9807,8801,0.0,,9102
+16029,9807,8802,-9.0,,9102
+16029,9807,8805,0.9996,,9201
+16029,9807,8806,500000.0,,9001
+16029,9807,8807,0.0,,9001
+16030,9807,8801,0.0,,9102
+16030,9807,8802,-3.0,,9102
+16030,9807,8805,0.9996,,9201
+16030,9807,8806,500000.0,,9001
+16030,9807,8807,0.0,,9001
+16031,9807,8801,0.0,,9102
+16031,9807,8802,3.0,,9102
+16031,9807,8805,0.9996,,9201
+16031,9807,8806,500000.0,,9001
+16031,9807,8807,0.0,,9001
+16032,9807,8801,0.0,,9102
+16032,9807,8802,9.0,,9102
+16032,9807,8805,0.9996,,9201
+16032,9807,8806,500000.0,,9001
+16032,9807,8807,0.0,,9001
+16033,9807,8801,0.0,,9102
+16033,9807,8802,15.0,,9102
+16033,9807,8805,0.9996,,9201
+16033,9807,8806,500000.0,,9001
+16033,9807,8807,0.0,,9001
+16034,9807,8801,0.0,,9102
+16034,9807,8802,21.0,,9102
+16034,9807,8805,0.9996,,9201
+16034,9807,8806,500000.0,,9001
+16034,9807,8807,0.0,,9001
+16035,9807,8801,0.0,,9102
+16035,9807,8802,27.0,,9102
+16035,9807,8805,0.9996,,9201
+16035,9807,8806,500000.0,,9001
+16035,9807,8807,0.0,,9001
+16036,9807,8801,0.0,,9102
+16036,9807,8802,33.0,,9102
+16036,9807,8805,0.9996,,9201
+16036,9807,8806,500000.0,,9001
+16036,9807,8807,0.0,,9001
+16037,9807,8801,0.0,,9102
+16037,9807,8802,39.0,,9102
+16037,9807,8805,0.9996,,9201
+16037,9807,8806,500000.0,,9001
+16037,9807,8807,0.0,,9001
+16038,9807,8801,0.0,,9102
+16038,9807,8802,45.0,,9102
+16038,9807,8805,0.9996,,9201
+16038,9807,8806,500000.0,,9001
+16038,9807,8807,0.0,,9001
+16039,9807,8801,0.0,,9102
+16039,9807,8802,51.0,,9102
+16039,9807,8805,0.9996,,9201
+16039,9807,8806,500000.0,,9001
+16039,9807,8807,0.0,,9001
+16040,9807,8801,0.0,,9102
+16040,9807,8802,57.0,,9102
+16040,9807,8805,0.9996,,9201
+16040,9807,8806,500000.0,,9001
+16040,9807,8807,0.0,,9001
+16041,9807,8801,0.0,,9102
+16041,9807,8802,63.0,,9102
+16041,9807,8805,0.9996,,9201
+16041,9807,8806,500000.0,,9001
+16041,9807,8807,0.0,,9001
+16042,9807,8801,0.0,,9102
+16042,9807,8802,69.0,,9102
+16042,9807,8805,0.9996,,9201
+16042,9807,8806,500000.0,,9001
+16042,9807,8807,0.0,,9001
+16043,9807,8801,0.0,,9102
+16043,9807,8802,75.0,,9102
+16043,9807,8805,0.9996,,9201
+16043,9807,8806,500000.0,,9001
+16043,9807,8807,0.0,,9001
+16044,9807,8801,0.0,,9102
+16044,9807,8802,81.0,,9102
+16044,9807,8805,0.9996,,9201
+16044,9807,8806,500000.0,,9001
+16044,9807,8807,0.0,,9001
+16045,9807,8801,0.0,,9102
+16045,9807,8802,87.0,,9102
+16045,9807,8805,0.9996,,9201
+16045,9807,8806,500000.0,,9001
+16045,9807,8807,0.0,,9001
+16046,9807,8801,0.0,,9102
+16046,9807,8802,93.0,,9102
+16046,9807,8805,0.9996,,9201
+16046,9807,8806,500000.0,,9001
+16046,9807,8807,0.0,,9001
+16047,9807,8801,0.0,,9102
+16047,9807,8802,99.0,,9102
+16047,9807,8805,0.9996,,9201
+16047,9807,8806,500000.0,,9001
+16047,9807,8807,0.0,,9001
+16048,9807,8801,0.0,,9102
+16048,9807,8802,105.0,,9102
+16048,9807,8805,0.9996,,9201
+16048,9807,8806,500000.0,,9001
+16048,9807,8807,0.0,,9001
+16049,9807,8801,0.0,,9102
+16049,9807,8802,111.0,,9102
+16049,9807,8805,0.9996,,9201
+16049,9807,8806,500000.0,,9001
+16049,9807,8807,0.0,,9001
+16050,9807,8801,0.0,,9102
+16050,9807,8802,117.0,,9102
+16050,9807,8805,0.9996,,9201
+16050,9807,8806,500000.0,,9001
+16050,9807,8807,0.0,,9001
+16051,9807,8801,0.0,,9102
+16051,9807,8802,123.0,,9102
+16051,9807,8805,0.9996,,9201
+16051,9807,8806,500000.0,,9001
+16051,9807,8807,0.0,,9001
+16052,9807,8801,0.0,,9102
+16052,9807,8802,129.0,,9102
+16052,9807,8805,0.9996,,9201
+16052,9807,8806,500000.0,,9001
+16052,9807,8807,0.0,,9001
+16053,9807,8801,0.0,,9102
+16053,9807,8802,135.0,,9102
+16053,9807,8805,0.9996,,9201
+16053,9807,8806,500000.0,,9001
+16053,9807,8807,0.0,,9001
+16054,9807,8801,0.0,,9102
+16054,9807,8802,141.0,,9102
+16054,9807,8805,0.9996,,9201
+16054,9807,8806,500000.0,,9001
+16054,9807,8807,0.0,,9001
+16055,9807,8801,0.0,,9102
+16055,9807,8802,147.0,,9102
+16055,9807,8805,0.9996,,9201
+16055,9807,8806,500000.0,,9001
+16055,9807,8807,0.0,,9001
+16056,9807,8801,0.0,,9102
+16056,9807,8802,153.0,,9102
+16056,9807,8805,0.9996,,9201
+16056,9807,8806,500000.0,,9001
+16056,9807,8807,0.0,,9001
+16057,9807,8801,0.0,,9102
+16057,9807,8802,159.0,,9102
+16057,9807,8805,0.9996,,9201
+16057,9807,8806,500000.0,,9001
+16057,9807,8807,0.0,,9001
+16058,9807,8801,0.0,,9102
+16058,9807,8802,165.0,,9102
+16058,9807,8805,0.9996,,9201
+16058,9807,8806,500000.0,,9001
+16058,9807,8807,0.0,,9001
+16059,9807,8801,0.0,,9102
+16059,9807,8802,171.0,,9102
+16059,9807,8805,0.9996,,9201
+16059,9807,8806,500000.0,,9001
+16059,9807,8807,0.0,,9001
+16060,9807,8801,0.0,,9102
+16060,9807,8802,177.0,,9102
+16060,9807,8805,0.9996,,9201
+16060,9807,8806,500000.0,,9001
+16060,9807,8807,0.0,,9001
+16061,9810,8801,90.0,,9102
+16061,9810,8802,0.0,,9102
+16061,9810,8805,0.994,,9201
+16061,9810,8806,2000000.0,,9001
+16061,9810,8807,2000000.0,,9001
+16070,9807,8801,0.0,,9102
+16070,9807,8802,120.0,,9102
+16070,9807,8805,1.0,,9201
+16070,9807,8806,40500000.0,,9001
+16070,9807,8807,0.0,,9001
+16071,9807,8801,0.0,,9102
+16071,9807,8802,123.0,,9102
+16071,9807,8805,1.0,,9201
+16071,9807,8806,41500000.0,,9001
+16071,9807,8807,0.0,,9001
+16072,9807,8801,0.0,,9102
+16072,9807,8802,126.0,,9102
+16072,9807,8805,1.0,,9201
+16072,9807,8806,42500000.0,,9001
+16072,9807,8807,0.0,,9001
+16073,9807,8801,0.0,,9102
+16073,9807,8802,129.0,,9102
+16073,9807,8805,1.0,,9201
+16073,9807,8806,43500000.0,,9001
+16073,9807,8807,0.0,,9001
+16074,9807,8801,0.0,,9102
+16074,9807,8802,132.0,,9102
+16074,9807,8805,1.0,,9201
+16074,9807,8806,44500000.0,,9001
+16074,9807,8807,0.0,,9001
+16075,9807,8801,0.0,,9102
+16075,9807,8802,135.0,,9102
+16075,9807,8805,1.0,,9201
+16075,9807,8806,45500000.0,,9001
+16075,9807,8807,0.0,,9001
+16076,9807,8801,0.0,,9102
+16076,9807,8802,138.0,,9102
+16076,9807,8805,1.0,,9201
+16076,9807,8806,46500000.0,,9001
+16076,9807,8807,0.0,,9001
+16077,9807,8801,0.0,,9102
+16077,9807,8802,141.0,,9102
+16077,9807,8805,1.0,,9201
+16077,9807,8806,47500000.0,,9001
+16077,9807,8807,0.0,,9001
+16078,9807,8801,0.0,,9102
+16078,9807,8802,144.0,,9102
+16078,9807,8805,1.0,,9201
+16078,9807,8806,48500000.0,,9001
+16078,9807,8807,0.0,,9001
+16079,9807,8801,0.0,,9102
+16079,9807,8802,147.0,,9102
+16079,9807,8805,1.0,,9201
+16079,9807,8806,49500000.0,,9001
+16079,9807,8807,0.0,,9001
+16080,9807,8801,0.0,,9102
+16080,9807,8802,150.0,,9102
+16080,9807,8805,1.0,,9201
+16080,9807,8806,50500000.0,,9001
+16080,9807,8807,0.0,,9001
+16081,9807,8801,0.0,,9102
+16081,9807,8802,153.0,,9102
+16081,9807,8805,1.0,,9201
+16081,9807,8806,51500000.0,,9001
+16081,9807,8807,0.0,,9001
+16082,9807,8801,0.0,,9102
+16082,9807,8802,156.0,,9102
+16082,9807,8805,1.0,,9201
+16082,9807,8806,52500000.0,,9001
+16082,9807,8807,0.0,,9001
+16083,9807,8801,0.0,,9102
+16083,9807,8802,159.0,,9102
+16083,9807,8805,1.0,,9201
+16083,9807,8806,53500000.0,,9001
+16083,9807,8807,0.0,,9001
+16084,9807,8801,0.0,,9102
+16084,9807,8802,162.0,,9102
+16084,9807,8805,1.0,,9201
+16084,9807,8806,54500000.0,,9001
+16084,9807,8807,0.0,,9001
+16085,9807,8801,0.0,,9102
+16085,9807,8802,165.0,,9102
+16085,9807,8805,1.0,,9201
+16085,9807,8806,55500000.0,,9001
+16085,9807,8807,0.0,,9001
+16086,9807,8801,0.0,,9102
+16086,9807,8802,168.0,,9102
+16086,9807,8805,1.0,,9201
+16086,9807,8806,56500000.0,,9001
+16086,9807,8807,0.0,,9001
+16087,9807,8801,0.0,,9102
+16087,9807,8802,171.0,,9102
+16087,9807,8805,1.0,,9201
+16087,9807,8806,57500000.0,,9001
+16087,9807,8807,0.0,,9001
+16088,9807,8801,0.0,,9102
+16088,9807,8802,174.0,,9102
+16088,9807,8805,1.0,,9201
+16088,9807,8806,58500000.0,,9001
+16088,9807,8807,0.0,,9001
+16089,9807,8801,0.0,,9102
+16089,9807,8802,177.0,,9102
+16089,9807,8805,1.0,,9201
+16089,9807,8806,59500000.0,,9001
+16089,9807,8807,0.0,,9001
+16090,9807,8801,0.0,,9102
+16090,9807,8802,180.0,,9102
+16090,9807,8805,1.0,,9201
+16090,9807,8806,60000000.0,,9001
+16090,9807,8807,0.0,,9001
+16091,9807,8801,0.0,,9102
+16091,9807,8802,-177.0,,9102
+16091,9807,8805,1.0,,9201
+16091,9807,8806,61500000.0,,9001
+16091,9807,8807,0.0,,9001
+16092,9807,8801,0.0,,9102
+16092,9807,8802,-174.0,,9102
+16092,9807,8805,1.0,,9201
+16092,9807,8806,62500000.0,,9001
+16092,9807,8807,0.0,,9001
+16093,9807,8801,0.0,,9102
+16093,9807,8802,-171.0,,9102
+16093,9807,8805,1.0,,9201
+16093,9807,8806,63500000.0,,9001
+16093,9807,8807,0.0,,9001
+16094,9807,8801,0.0,,9102
+16094,9807,8802,-168.0,,9102
+16094,9807,8805,1.0,,9201
+16094,9807,8806,64500000.0,,9001
+16094,9807,8807,0.0,,9001
+16100,9824,8801,0.0,,9102
+16100,9824,8805,0.9996,,9201
+16100,9824,8806,500000.0,,9001
+16100,9824,8807,10000000.0,,9001
+16100,9824,8830,-180.0,,9102
+16100,9824,8831,6.0,,9102
+16101,9807,8801,0.0,,9102
+16101,9807,8802,-177.0,,9102
+16101,9807,8805,0.9996,,9201
+16101,9807,8806,500000.0,,9001
+16101,9807,8807,10000000.0,,9001
+16102,9807,8801,0.0,,9102
+16102,9807,8802,-171.0,,9102
+16102,9807,8805,0.9996,,9201
+16102,9807,8806,500000.0,,9001
+16102,9807,8807,10000000.0,,9001
+16103,9807,8801,0.0,,9102
+16103,9807,8802,-165.0,,9102
+16103,9807,8805,0.9996,,9201
+16103,9807,8806,500000.0,,9001
+16103,9807,8807,10000000.0,,9001
+16104,9807,8801,0.0,,9102
+16104,9807,8802,-159.0,,9102
+16104,9807,8805,0.9996,,9201
+16104,9807,8806,500000.0,,9001
+16104,9807,8807,10000000.0,,9001
+16105,9807,8801,0.0,,9102
+16105,9807,8802,-153.0,,9102
+16105,9807,8805,0.9996,,9201
+16105,9807,8806,500000.0,,9001
+16105,9807,8807,10000000.0,,9001
+16106,9807,8801,0.0,,9102
+16106,9807,8802,-147.0,,9102
+16106,9807,8805,0.9996,,9201
+16106,9807,8806,500000.0,,9001
+16106,9807,8807,10000000.0,,9001
+16107,9807,8801,0.0,,9102
+16107,9807,8802,-141.0,,9102
+16107,9807,8805,0.9996,,9201
+16107,9807,8806,500000.0,,9001
+16107,9807,8807,10000000.0,,9001
+16108,9807,8801,0.0,,9102
+16108,9807,8802,-135.0,,9102
+16108,9807,8805,0.9996,,9201
+16108,9807,8806,500000.0,,9001
+16108,9807,8807,10000000.0,,9001
+16109,9807,8801,0.0,,9102
+16109,9807,8802,-129.0,,9102
+16109,9807,8805,0.9996,,9201
+16109,9807,8806,500000.0,,9001
+16109,9807,8807,10000000.0,,9001
+16110,9807,8801,0.0,,9102
+16110,9807,8802,-123.0,,9102
+16110,9807,8805,0.9996,,9201
+16110,9807,8806,500000.0,,9001
+16110,9807,8807,10000000.0,,9001
+16111,9807,8801,0.0,,9102
+16111,9807,8802,-117.0,,9102
+16111,9807,8805,0.9996,,9201
+16111,9807,8806,500000.0,,9001
+16111,9807,8807,10000000.0,,9001
+16112,9807,8801,0.0,,9102
+16112,9807,8802,-111.0,,9102
+16112,9807,8805,0.9996,,9201
+16112,9807,8806,500000.0,,9001
+16112,9807,8807,10000000.0,,9001
+16113,9807,8801,0.0,,9102
+16113,9807,8802,-105.0,,9102
+16113,9807,8805,0.9996,,9201
+16113,9807,8806,500000.0,,9001
+16113,9807,8807,10000000.0,,9001
+16114,9807,8801,0.0,,9102
+16114,9807,8802,-99.0,,9102
+16114,9807,8805,0.9996,,9201
+16114,9807,8806,500000.0,,9001
+16114,9807,8807,10000000.0,,9001
+16115,9807,8801,0.0,,9102
+16115,9807,8802,-93.0,,9102
+16115,9807,8805,0.9996,,9201
+16115,9807,8806,500000.0,,9001
+16115,9807,8807,10000000.0,,9001
+16116,9807,8801,0.0,,9102
+16116,9807,8802,-87.0,,9102
+16116,9807,8805,0.9996,,9201
+16116,9807,8806,500000.0,,9001
+16116,9807,8807,10000000.0,,9001
+16117,9807,8801,0.0,,9102
+16117,9807,8802,-81.0,,9102
+16117,9807,8805,0.9996,,9201
+16117,9807,8806,500000.0,,9001
+16117,9807,8807,10000000.0,,9001
+16118,9807,8801,0.0,,9102
+16118,9807,8802,-75.0,,9102
+16118,9807,8805,0.9996,,9201
+16118,9807,8806,500000.0,,9001
+16118,9807,8807,10000000.0,,9001
+16119,9807,8801,0.0,,9102
+16119,9807,8802,-69.0,,9102
+16119,9807,8805,0.9996,,9201
+16119,9807,8806,500000.0,,9001
+16119,9807,8807,10000000.0,,9001
+16120,9807,8801,0.0,,9102
+16120,9807,8802,-63.0,,9102
+16120,9807,8805,0.9996,,9201
+16120,9807,8806,500000.0,,9001
+16120,9807,8807,10000000.0,,9001
+16121,9807,8801,0.0,,9102
+16121,9807,8802,-57.0,,9102
+16121,9807,8805,0.9996,,9201
+16121,9807,8806,500000.0,,9001
+16121,9807,8807,10000000.0,,9001
+16122,9807,8801,0.0,,9102
+16122,9807,8802,-51.0,,9102
+16122,9807,8805,0.9996,,9201
+16122,9807,8806,500000.0,,9001
+16122,9807,8807,10000000.0,,9001
+16123,9807,8801,0.0,,9102
+16123,9807,8802,-45.0,,9102
+16123,9807,8805,0.9996,,9201
+16123,9807,8806,500000.0,,9001
+16123,9807,8807,10000000.0,,9001
+16124,9807,8801,0.0,,9102
+16124,9807,8802,-39.0,,9102
+16124,9807,8805,0.9996,,9201
+16124,9807,8806,500000.0,,9001
+16124,9807,8807,10000000.0,,9001
+16125,9807,8801,0.0,,9102
+16125,9807,8802,-33.0,,9102
+16125,9807,8805,0.9996,,9201
+16125,9807,8806,500000.0,,9001
+16125,9807,8807,10000000.0,,9001
+16126,9807,8801,0.0,,9102
+16126,9807,8802,-27.0,,9102
+16126,9807,8805,0.9996,,9201
+16126,9807,8806,500000.0,,9001
+16126,9807,8807,10000000.0,,9001
+16127,9807,8801,0.0,,9102
+16127,9807,8802,-21.0,,9102
+16127,9807,8805,0.9996,,9201
+16127,9807,8806,500000.0,,9001
+16127,9807,8807,10000000.0,,9001
+16128,9807,8801,0.0,,9102
+16128,9807,8802,-15.0,,9102
+16128,9807,8805,0.9996,,9201
+16128,9807,8806,500000.0,,9001
+16128,9807,8807,10000000.0,,9001
+16129,9807,8801,0.0,,9102
+16129,9807,8802,-9.0,,9102
+16129,9807,8805,0.9996,,9201
+16129,9807,8806,500000.0,,9001
+16129,9807,8807,10000000.0,,9001
+16130,9807,8801,0.0,,9102
+16130,9807,8802,-3.0,,9102
+16130,9807,8805,0.9996,,9201
+16130,9807,8806,500000.0,,9001
+16130,9807,8807,10000000.0,,9001
+16131,9807,8801,0.0,,9102
+16131,9807,8802,3.0,,9102
+16131,9807,8805,0.9996,,9201
+16131,9807,8806,500000.0,,9001
+16131,9807,8807,10000000.0,,9001
+16132,9807,8801,0.0,,9102
+16132,9807,8802,9.0,,9102
+16132,9807,8805,0.9996,,9201
+16132,9807,8806,500000.0,,9001
+16132,9807,8807,10000000.0,,9001
+16133,9807,8801,0.0,,9102
+16133,9807,8802,15.0,,9102
+16133,9807,8805,0.9996,,9201
+16133,9807,8806,500000.0,,9001
+16133,9807,8807,10000000.0,,9001
+16134,9807,8801,0.0,,9102
+16134,9807,8802,21.0,,9102
+16134,9807,8805,0.9996,,9201
+16134,9807,8806,500000.0,,9001
+16134,9807,8807,10000000.0,,9001
+16135,9807,8801,0.0,,9102
+16135,9807,8802,27.0,,9102
+16135,9807,8805,0.9996,,9201
+16135,9807,8806,500000.0,,9001
+16135,9807,8807,10000000.0,,9001
+16136,9807,8801,0.0,,9102
+16136,9807,8802,33.0,,9102
+16136,9807,8805,0.9996,,9201
+16136,9807,8806,500000.0,,9001
+16136,9807,8807,10000000.0,,9001
+16137,9807,8801,0.0,,9102
+16137,9807,8802,39.0,,9102
+16137,9807,8805,0.9996,,9201
+16137,9807,8806,500000.0,,9001
+16137,9807,8807,10000000.0,,9001
+16138,9807,8801,0.0,,9102
+16138,9807,8802,45.0,,9102
+16138,9807,8805,0.9996,,9201
+16138,9807,8806,500000.0,,9001
+16138,9807,8807,10000000.0,,9001
+16139,9807,8801,0.0,,9102
+16139,9807,8802,51.0,,9102
+16139,9807,8805,0.9996,,9201
+16139,9807,8806,500000.0,,9001
+16139,9807,8807,10000000.0,,9001
+16140,9807,8801,0.0,,9102
+16140,9807,8802,57.0,,9102
+16140,9807,8805,0.9996,,9201
+16140,9807,8806,500000.0,,9001
+16140,9807,8807,10000000.0,,9001
+16141,9807,8801,0.0,,9102
+16141,9807,8802,63.0,,9102
+16141,9807,8805,0.9996,,9201
+16141,9807,8806,500000.0,,9001
+16141,9807,8807,10000000.0,,9001
+16142,9807,8801,0.0,,9102
+16142,9807,8802,69.0,,9102
+16142,9807,8805,0.9996,,9201
+16142,9807,8806,500000.0,,9001
+16142,9807,8807,10000000.0,,9001
+16143,9807,8801,0.0,,9102
+16143,9807,8802,75.0,,9102
+16143,9807,8805,0.9996,,9201
+16143,9807,8806,500000.0,,9001
+16143,9807,8807,10000000.0,,9001
+16144,9807,8801,0.0,,9102
+16144,9807,8802,81.0,,9102
+16144,9807,8805,0.9996,,9201
+16144,9807,8806,500000.0,,9001
+16144,9807,8807,10000000.0,,9001
+16145,9807,8801,0.0,,9102
+16145,9807,8802,87.0,,9102
+16145,9807,8805,0.9996,,9201
+16145,9807,8806,500000.0,,9001
+16145,9807,8807,10000000.0,,9001
+16146,9807,8801,0.0,,9102
+16146,9807,8802,93.0,,9102
+16146,9807,8805,0.9996,,9201
+16146,9807,8806,500000.0,,9001
+16146,9807,8807,10000000.0,,9001
+16147,9807,8801,0.0,,9102
+16147,9807,8802,99.0,,9102
+16147,9807,8805,0.9996,,9201
+16147,9807,8806,500000.0,,9001
+16147,9807,8807,10000000.0,,9001
+16148,9807,8801,0.0,,9102
+16148,9807,8802,105.0,,9102
+16148,9807,8805,0.9996,,9201
+16148,9807,8806,500000.0,,9001
+16148,9807,8807,10000000.0,,9001
+16149,9807,8801,0.0,,9102
+16149,9807,8802,111.0,,9102
+16149,9807,8805,0.9996,,9201
+16149,9807,8806,500000.0,,9001
+16149,9807,8807,10000000.0,,9001
+16150,9807,8801,0.0,,9102
+16150,9807,8802,117.0,,9102
+16150,9807,8805,0.9996,,9201
+16150,9807,8806,500000.0,,9001
+16150,9807,8807,10000000.0,,9001
+16151,9807,8801,0.0,,9102
+16151,9807,8802,123.0,,9102
+16151,9807,8805,0.9996,,9201
+16151,9807,8806,500000.0,,9001
+16151,9807,8807,10000000.0,,9001
+16152,9807,8801,0.0,,9102
+16152,9807,8802,129.0,,9102
+16152,9807,8805,0.9996,,9201
+16152,9807,8806,500000.0,,9001
+16152,9807,8807,10000000.0,,9001
+16153,9807,8801,0.0,,9102
+16153,9807,8802,135.0,,9102
+16153,9807,8805,0.9996,,9201
+16153,9807,8806,500000.0,,9001
+16153,9807,8807,10000000.0,,9001
+16154,9807,8801,0.0,,9102
+16154,9807,8802,141.0,,9102
+16154,9807,8805,0.9996,,9201
+16154,9807,8806,500000.0,,9001
+16154,9807,8807,10000000.0,,9001
+16155,9807,8801,0.0,,9102
+16155,9807,8802,147.0,,9102
+16155,9807,8805,0.9996,,9201
+16155,9807,8806,500000.0,,9001
+16155,9807,8807,10000000.0,,9001
+16156,9807,8801,0.0,,9102
+16156,9807,8802,153.0,,9102
+16156,9807,8805,0.9996,,9201
+16156,9807,8806,500000.0,,9001
+16156,9807,8807,10000000.0,,9001
+16157,9807,8801,0.0,,9102
+16157,9807,8802,159.0,,9102
+16157,9807,8805,0.9996,,9201
+16157,9807,8806,500000.0,,9001
+16157,9807,8807,10000000.0,,9001
+16158,9807,8801,0.0,,9102
+16158,9807,8802,165.0,,9102
+16158,9807,8805,0.9996,,9201
+16158,9807,8806,500000.0,,9001
+16158,9807,8807,10000000.0,,9001
+16159,9807,8801,0.0,,9102
+16159,9807,8802,171.0,,9102
+16159,9807,8805,0.9996,,9201
+16159,9807,8806,500000.0,,9001
+16159,9807,8807,10000000.0,,9001
+16160,9807,8801,0.0,,9102
+16160,9807,8802,177.0,,9102
+16160,9807,8805,0.9996,,9201
+16160,9807,8806,500000.0,,9001
+16160,9807,8807,10000000.0,,9001
+16161,9810,8801,-90.0,,9102
+16161,9810,8802,0.0,,9102
+16161,9810,8805,0.994,,9201
+16161,9810,8806,2000000.0,,9001
+16161,9810,8807,2000000.0,,9001
+16170,9807,8801,0.0,,9102
+16170,9807,8802,120.0,,9102
+16170,9807,8805,1.0,,9201
+16170,9807,8806,500000.0,,9001
+16170,9807,8807,0.0,,9001
+16171,9807,8801,0.0,,9102
+16171,9807,8802,123.0,,9102
+16171,9807,8805,1.0,,9201
+16171,9807,8806,500000.0,,9001
+16171,9807,8807,0.0,,9001
+16172,9807,8801,0.0,,9102
+16172,9807,8802,126.0,,9102
+16172,9807,8805,1.0,,9201
+16172,9807,8806,500000.0,,9001
+16172,9807,8807,0.0,,9001
+16173,9807,8801,0.0,,9102
+16173,9807,8802,129.0,,9102
+16173,9807,8805,1.0,,9201
+16173,9807,8806,500000.0,,9001
+16173,9807,8807,0.0,,9001
+16174,9807,8801,0.0,,9102
+16174,9807,8802,132.0,,9102
+16174,9807,8805,1.0,,9201
+16174,9807,8806,500000.0,,9001
+16174,9807,8807,0.0,,9001
+16175,9807,8801,0.0,,9102
+16175,9807,8802,135.0,,9102
+16175,9807,8805,1.0,,9201
+16175,9807,8806,500000.0,,9001
+16175,9807,8807,0.0,,9001
+16176,9807,8801,0.0,,9102
+16176,9807,8802,138.0,,9102
+16176,9807,8805,1.0,,9201
+16176,9807,8806,500000.0,,9001
+16176,9807,8807,0.0,,9001
+16177,9807,8801,0.0,,9102
+16177,9807,8802,141.0,,9102
+16177,9807,8805,1.0,,9201
+16177,9807,8806,500000.0,,9001
+16177,9807,8807,0.0,,9001
+16178,9807,8801,0.0,,9102
+16178,9807,8802,144.0,,9102
+16178,9807,8805,1.0,,9201
+16178,9807,8806,500000.0,,9001
+16178,9807,8807,0.0,,9001
+16179,9807,8801,0.0,,9102
+16179,9807,8802,147.0,,9102
+16179,9807,8805,1.0,,9201
+16179,9807,8806,500000.0,,9001
+16179,9807,8807,0.0,,9001
+16180,9807,8801,0.0,,9102
+16180,9807,8802,150.0,,9102
+16180,9807,8805,1.0,,9201
+16180,9807,8806,500000.0,,9001
+16180,9807,8807,0.0,,9001
+16181,9807,8801,0.0,,9102
+16181,9807,8802,153.0,,9102
+16181,9807,8805,1.0,,9201
+16181,9807,8806,500000.0,,9001
+16181,9807,8807,0.0,,9001
+16182,9807,8801,0.0,,9102
+16182,9807,8802,156.0,,9102
+16182,9807,8805,1.0,,9201
+16182,9807,8806,500000.0,,9001
+16182,9807,8807,0.0,,9001
+16183,9807,8801,0.0,,9102
+16183,9807,8802,159.0,,9102
+16183,9807,8805,1.0,,9201
+16183,9807,8806,500000.0,,9001
+16183,9807,8807,0.0,,9001
+16184,9807,8801,0.0,,9102
+16184,9807,8802,162.0,,9102
+16184,9807,8805,1.0,,9201
+16184,9807,8806,500000.0,,9001
+16184,9807,8807,0.0,,9001
+16185,9807,8801,0.0,,9102
+16185,9807,8802,165.0,,9102
+16185,9807,8805,1.0,,9201
+16185,9807,8806,500000.0,,9001
+16185,9807,8807,0.0,,9001
+16186,9807,8801,0.0,,9102
+16186,9807,8802,168.0,,9102
+16186,9807,8805,1.0,,9201
+16186,9807,8806,500000.0,,9001
+16186,9807,8807,0.0,,9001
+16187,9807,8801,0.0,,9102
+16187,9807,8802,171.0,,9102
+16187,9807,8805,1.0,,9201
+16187,9807,8806,500000.0,,9001
+16187,9807,8807,0.0,,9001
+16188,9807,8801,0.0,,9102
+16188,9807,8802,174.0,,9102
+16188,9807,8805,1.0,,9201
+16188,9807,8806,500000.0,,9001
+16188,9807,8807,0.0,,9001
+16189,9807,8801,0.0,,9102
+16189,9807,8802,177.0,,9102
+16189,9807,8805,1.0,,9201
+16189,9807,8806,500000.0,,9001
+16189,9807,8807,0.0,,9001
+16190,9807,8801,0.0,,9102
+16190,9807,8802,180.0,,9102
+16190,9807,8805,1.0,,9201
+16190,9807,8806,500000.0,,9001
+16190,9807,8807,0.0,,9001
+16191,9807,8801,0.0,,9102
+16191,9807,8802,-177.0,,9102
+16191,9807,8805,1.0,,9201
+16191,9807,8806,500000.0,,9001
+16191,9807,8807,0.0,,9001
+16192,9807,8801,0.0,,9102
+16192,9807,8802,-174.0,,9102
+16192,9807,8805,1.0,,9201
+16192,9807,8806,500000.0,,9001
+16192,9807,8807,0.0,,9001
+16193,9807,8801,0.0,,9102
+16193,9807,8802,-171.0,,9102
+16193,9807,8805,1.0,,9201
+16193,9807,8806,500000.0,,9001
+16193,9807,8807,0.0,,9001
+16194,9807,8801,0.0,,9102
+16194,9807,8802,-168.0,,9102
+16194,9807,8805,1.0,,9201
+16194,9807,8806,500000.0,,9001
+16194,9807,8807,0.0,,9001
+16201,9807,8801,0.0,,9102
+16201,9807,8802,3.0,,9102
+16201,9807,8805,1.0,,9201
+16201,9807,8806,1500000.0,,9001
+16201,9807,8807,0.0,,9001
+16202,9807,8801,0.0,,9102
+16202,9807,8802,9.0,,9102
+16202,9807,8805,1.0,,9201
+16202,9807,8806,2500000.0,,9001
+16202,9807,8807,0.0,,9001
+16203,9807,8801,0.0,,9102
+16203,9807,8802,15.0,,9102
+16203,9807,8805,1.0,,9201
+16203,9807,8806,3500000.0,,9001
+16203,9807,8807,0.0,,9001
+16204,9807,8801,0.0,,9102
+16204,9807,8802,21.0,,9102
+16204,9807,8805,1.0,,9201
+16204,9807,8806,4500000.0,,9001
+16204,9807,8807,0.0,,9001
+16205,9807,8801,0.0,,9102
+16205,9807,8802,27.0,,9102
+16205,9807,8805,1.0,,9201
+16205,9807,8806,5500000.0,,9001
+16205,9807,8807,0.0,,9001
+16206,9807,8801,0.0,,9102
+16206,9807,8802,33.0,,9102
+16206,9807,8805,1.0,,9201
+16206,9807,8806,6500000.0,,9001
+16206,9807,8807,0.0,,9001
+16207,9807,8801,0.0,,9102
+16207,9807,8802,39.0,,9102
+16207,9807,8805,1.0,,9201
+16207,9807,8806,7500000.0,,9001
+16207,9807,8807,0.0,,9001
+16208,9807,8801,0.0,,9102
+16208,9807,8802,45.0,,9102
+16208,9807,8805,1.0,,9201
+16208,9807,8806,8500000.0,,9001
+16208,9807,8807,0.0,,9001
+16209,9807,8801,0.0,,9102
+16209,9807,8802,51.0,,9102
+16209,9807,8805,1.0,,9201
+16209,9807,8806,9500000.0,,9001
+16209,9807,8807,0.0,,9001
+16210,9807,8801,0.0,,9102
+16210,9807,8802,57.0,,9102
+16210,9807,8805,1.0,,9201
+16210,9807,8806,10500000.0,,9001
+16210,9807,8807,0.0,,9001
+16211,9807,8801,0.0,,9102
+16211,9807,8802,63.0,,9102
+16211,9807,8805,1.0,,9201
+16211,9807,8806,11500000.0,,9001
+16211,9807,8807,0.0,,9001
+16212,9807,8801,0.0,,9102
+16212,9807,8802,69.0,,9102
+16212,9807,8805,1.0,,9201
+16212,9807,8806,12500000.0,,9001
+16212,9807,8807,0.0,,9001
+16213,9807,8801,0.0,,9102
+16213,9807,8802,75.0,,9102
+16213,9807,8805,1.0,,9201
+16213,9807,8806,13500000.0,,9001
+16213,9807,8807,0.0,,9001
+16214,9807,8801,0.0,,9102
+16214,9807,8802,81.0,,9102
+16214,9807,8805,1.0,,9201
+16214,9807,8806,14500000.0,,9001
+16214,9807,8807,0.0,,9001
+16215,9807,8801,0.0,,9102
+16215,9807,8802,87.0,,9102
+16215,9807,8805,1.0,,9201
+16215,9807,8806,15500000.0,,9001
+16215,9807,8807,0.0,,9001
+16216,9807,8801,0.0,,9102
+16216,9807,8802,93.0,,9102
+16216,9807,8805,1.0,,9201
+16216,9807,8806,16500000.0,,9001
+16216,9807,8807,0.0,,9001
+16217,9807,8801,0.0,,9102
+16217,9807,8802,99.0,,9102
+16217,9807,8805,1.0,,9201
+16217,9807,8806,17500000.0,,9001
+16217,9807,8807,0.0,,9001
+16218,9807,8801,0.0,,9102
+16218,9807,8802,105.0,,9102
+16218,9807,8805,1.0,,9201
+16218,9807,8806,18500000.0,,9001
+16218,9807,8807,0.0,,9001
+16219,9807,8801,0.0,,9102
+16219,9807,8802,111.0,,9102
+16219,9807,8805,1.0,,9201
+16219,9807,8806,19500000.0,,9001
+16219,9807,8807,0.0,,9001
+16220,9807,8801,0.0,,9102
+16220,9807,8802,117.0,,9102
+16220,9807,8805,1.0,,9201
+16220,9807,8806,20500000.0,,9001
+16220,9807,8807,0.0,,9001
+16221,9807,8801,0.0,,9102
+16221,9807,8802,123.0,,9102
+16221,9807,8805,1.0,,9201
+16221,9807,8806,21500000.0,,9001
+16221,9807,8807,0.0,,9001
+16222,9807,8801,0.0,,9102
+16222,9807,8802,129.0,,9102
+16222,9807,8805,1.0,,9201
+16222,9807,8806,22500000.0,,9001
+16222,9807,8807,0.0,,9001
+16223,9807,8801,0.0,,9102
+16223,9807,8802,135.0,,9102
+16223,9807,8805,1.0,,9201
+16223,9807,8806,23500000.0,,9001
+16223,9807,8807,0.0,,9001
+16224,9807,8801,0.0,,9102
+16224,9807,8802,141.0,,9102
+16224,9807,8805,1.0,,9201
+16224,9807,8806,24500000.0,,9001
+16224,9807,8807,0.0,,9001
+16225,9807,8801,0.0,,9102
+16225,9807,8802,147.0,,9102
+16225,9807,8805,1.0,,9201
+16225,9807,8806,25500000.0,,9001
+16225,9807,8807,0.0,,9001
+16226,9807,8801,0.0,,9102
+16226,9807,8802,153.0,,9102
+16226,9807,8805,1.0,,9201
+16226,9807,8806,26500000.0,,9001
+16226,9807,8807,0.0,,9001
+16227,9807,8801,0.0,,9102
+16227,9807,8802,159.0,,9102
+16227,9807,8805,1.0,,9201
+16227,9807,8806,27500000.0,,9001
+16227,9807,8807,0.0,,9001
+16228,9807,8801,0.0,,9102
+16228,9807,8802,165.0,,9102
+16228,9807,8805,1.0,,9201
+16228,9807,8806,28500000.0,,9001
+16228,9807,8807,0.0,,9001
+16229,9807,8801,0.0,,9102
+16229,9807,8802,171.0,,9102
+16229,9807,8805,1.0,,9201
+16229,9807,8806,29500000.0,,9001
+16229,9807,8807,0.0,,9001
+16230,9807,8801,0.0,,9102
+16230,9807,8802,177.0,,9102
+16230,9807,8805,1.0,,9201
+16230,9807,8806,30500000.0,,9001
+16230,9807,8807,0.0,,9001
+16231,9807,8801,0.0,,9102
+16231,9807,8802,-177.0,,9102
+16231,9807,8805,1.0,,9201
+16231,9807,8806,31500000.0,,9001
+16231,9807,8807,0.0,,9001
+16232,9807,8801,0.0,,9102
+16232,9807,8802,-171.0,,9102
+16232,9807,8805,1.0,,9201
+16232,9807,8806,32500000.0,,9001
+16232,9807,8807,0.0,,9001
+16233,9807,8801,0.0,,9102
+16233,9807,8802,-165.0,,9102
+16233,9807,8805,1.0,,9201
+16233,9807,8806,33500000.0,,9001
+16233,9807,8807,0.0,,9001
+16234,9807,8801,0.0,,9102
+16234,9807,8802,-159.0,,9102
+16234,9807,8805,1.0,,9201
+16234,9807,8806,34500000.0,,9001
+16234,9807,8807,0.0,,9001
+16235,9807,8801,0.0,,9102
+16235,9807,8802,-153.0,,9102
+16235,9807,8805,1.0,,9201
+16235,9807,8806,35500000.0,,9001
+16235,9807,8807,0.0,,9001
+16236,9807,8801,0.0,,9102
+16236,9807,8802,-147.0,,9102
+16236,9807,8805,1.0,,9201
+16236,9807,8806,36500000.0,,9001
+16236,9807,8807,0.0,,9001
+16237,9807,8801,0.0,,9102
+16237,9807,8802,-141.0,,9102
+16237,9807,8805,1.0,,9201
+16237,9807,8806,37500000.0,,9001
+16237,9807,8807,0.0,,9001
+16238,9807,8801,0.0,,9102
+16238,9807,8802,-135.0,,9102
+16238,9807,8805,1.0,,9201
+16238,9807,8806,38500000.0,,9001
+16238,9807,8807,0.0,,9001
+16239,9807,8801,0.0,,9102
+16239,9807,8802,-129.0,,9102
+16239,9807,8805,1.0,,9201
+16239,9807,8806,39500000.0,,9001
+16239,9807,8807,0.0,,9001
+16240,9807,8801,0.0,,9102
+16240,9807,8802,-123.0,,9102
+16240,9807,8805,1.0,,9201
+16240,9807,8806,40500000.0,,9001
+16240,9807,8807,0.0,,9001
+16241,9807,8801,0.0,,9102
+16241,9807,8802,-117.0,,9102
+16241,9807,8805,1.0,,9201
+16241,9807,8806,41500000.0,,9001
+16241,9807,8807,0.0,,9001
+16242,9807,8801,0.0,,9102
+16242,9807,8802,-111.0,,9102
+16242,9807,8805,1.0,,9201
+16242,9807,8806,42500000.0,,9001
+16242,9807,8807,0.0,,9001
+16243,9807,8801,0.0,,9102
+16243,9807,8802,-105.0,,9102
+16243,9807,8805,1.0,,9201
+16243,9807,8806,43500000.0,,9001
+16243,9807,8807,0.0,,9001
+16244,9807,8801,0.0,,9102
+16244,9807,8802,-99.0,,9102
+16244,9807,8805,1.0,,9201
+16244,9807,8806,44500000.0,,9001
+16244,9807,8807,0.0,,9001
+16245,9807,8801,0.0,,9102
+16245,9807,8802,-93.0,,9102
+16245,9807,8805,1.0,,9201
+16245,9807,8806,45500000.0,,9001
+16245,9807,8807,0.0,,9001
+16246,9807,8801,0.0,,9102
+16246,9807,8802,-87.0,,9102
+16246,9807,8805,1.0,,9201
+16246,9807,8806,46500000.0,,9001
+16246,9807,8807,0.0,,9001
+16247,9807,8801,0.0,,9102
+16247,9807,8802,-81.0,,9102
+16247,9807,8805,1.0,,9201
+16247,9807,8806,47500000.0,,9001
+16247,9807,8807,0.0,,9001
+16248,9807,8801,0.0,,9102
+16248,9807,8802,-75.0,,9102
+16248,9807,8805,1.0,,9201
+16248,9807,8806,48500000.0,,9001
+16248,9807,8807,0.0,,9001
+16249,9807,8801,0.0,,9102
+16249,9807,8802,-69.0,,9102
+16249,9807,8805,1.0,,9201
+16249,9807,8806,49500000.0,,9001
+16249,9807,8807,0.0,,9001
+16250,9807,8801,0.0,,9102
+16250,9807,8802,-63.0,,9102
+16250,9807,8805,1.0,,9201
+16250,9807,8806,50500000.0,,9001
+16250,9807,8807,0.0,,9001
+16251,9807,8801,0.0,,9102
+16251,9807,8802,-57.0,,9102
+16251,9807,8805,1.0,,9201
+16251,9807,8806,51500000.0,,9001
+16251,9807,8807,0.0,,9001
+16252,9807,8801,0.0,,9102
+16252,9807,8802,-51.0,,9102
+16252,9807,8805,1.0,,9201
+16252,9807,8806,52500000.0,,9001
+16252,9807,8807,0.0,,9001
+16253,9807,8801,0.0,,9102
+16253,9807,8802,-45.0,,9102
+16253,9807,8805,1.0,,9201
+16253,9807,8806,53500000.0,,9001
+16253,9807,8807,0.0,,9001
+16254,9807,8801,0.0,,9102
+16254,9807,8802,-39.0,,9102
+16254,9807,8805,1.0,,9201
+16254,9807,8806,54500000.0,,9001
+16254,9807,8807,0.0,,9001
+16255,9807,8801,0.0,,9102
+16255,9807,8802,-33.0,,9102
+16255,9807,8805,1.0,,9201
+16255,9807,8806,55500000.0,,9001
+16255,9807,8807,0.0,,9001
+16256,9807,8801,0.0,,9102
+16256,9807,8802,-27.0,,9102
+16256,9807,8805,1.0,,9201
+16256,9807,8806,56500000.0,,9001
+16256,9807,8807,0.0,,9001
+16257,9807,8801,0.0,,9102
+16257,9807,8802,-21.0,,9102
+16257,9807,8805,1.0,,9201
+16257,9807,8806,57500000.0,,9001
+16257,9807,8807,0.0,,9001
+16258,9807,8801,0.0,,9102
+16258,9807,8802,-15.0,,9102
+16258,9807,8805,1.0,,9201
+16258,9807,8806,58500000.0,,9001
+16258,9807,8807,0.0,,9001
+16259,9807,8801,0.0,,9102
+16259,9807,8802,-9.0,,9102
+16259,9807,8805,1.0,,9201
+16259,9807,8806,59500000.0,,9001
+16259,9807,8807,0.0,,9001
+16260,9807,8801,0.0,,9102
+16260,9807,8802,-3.0,,9102
+16260,9807,8805,1.0,,9201
+16260,9807,8806,60500000.0,,9001
+16260,9807,8807,0.0,,9001
+16261,9807,8801,0.0,,9102
+16261,9807,8802,3.0,,9102
+16261,9807,8805,1.0,,9201
+16261,9807,8806,1500000.0,,9001
+16261,9807,8807,0.0,,9001
+16262,9807,8801,0.0,,9102
+16262,9807,8802,6.0,,9102
+16262,9807,8805,1.0,,9201
+16262,9807,8806,2500000.0,,9001
+16262,9807,8807,0.0,,9001
+16263,9807,8801,0.0,,9102
+16263,9807,8802,9.0,,9102
+16263,9807,8805,1.0,,9201
+16263,9807,8806,3500000.0,,9001
+16263,9807,8807,0.0,,9001
+16264,9807,8801,0.0,,9102
+16264,9807,8802,12.0,,9102
+16264,9807,8805,1.0,,9201
+16264,9807,8806,4500000.0,,9001
+16264,9807,8807,0.0,,9001
+16265,9807,8801,0.0,,9102
+16265,9807,8802,15.0,,9102
+16265,9807,8805,1.0,,9201
+16265,9807,8806,5500000.0,,9001
+16265,9807,8807,0.0,,9001
+16266,9807,8801,0.0,,9102
+16266,9807,8802,18.0,,9102
+16266,9807,8805,1.0,,9201
+16266,9807,8806,6500000.0,,9001
+16266,9807,8807,0.0,,9001
+16267,9807,8801,0.0,,9102
+16267,9807,8802,21.0,,9102
+16267,9807,8805,1.0,,9201
+16267,9807,8806,7500000.0,,9001
+16267,9807,8807,0.0,,9001
+16268,9807,8801,0.0,,9102
+16268,9807,8802,24.0,,9102
+16268,9807,8805,1.0,,9201
+16268,9807,8806,8500000.0,,9001
+16268,9807,8807,0.0,,9001
+16269,9807,8801,0.0,,9102
+16269,9807,8802,27.0,,9102
+16269,9807,8805,1.0,,9201
+16269,9807,8806,9500000.0,,9001
+16269,9807,8807,0.0,,9001
+16270,9807,8801,0.0,,9102
+16270,9807,8802,30.0,,9102
+16270,9807,8805,1.0,,9201
+16270,9807,8806,10500000.0,,9001
+16270,9807,8807,0.0,,9001
+16271,9807,8801,0.0,,9102
+16271,9807,8802,33.0,,9102
+16271,9807,8805,1.0,,9201
+16271,9807,8806,11500000.0,,9001
+16271,9807,8807,0.0,,9001
+16272,9807,8801,0.0,,9102
+16272,9807,8802,36.0,,9102
+16272,9807,8805,1.0,,9201
+16272,9807,8806,12500000.0,,9001
+16272,9807,8807,0.0,,9001
+16273,9807,8801,0.0,,9102
+16273,9807,8802,39.0,,9102
+16273,9807,8805,1.0,,9201
+16273,9807,8806,13500000.0,,9001
+16273,9807,8807,0.0,,9001
+16274,9807,8801,0.0,,9102
+16274,9807,8802,42.0,,9102
+16274,9807,8805,1.0,,9201
+16274,9807,8806,14500000.0,,9001
+16274,9807,8807,0.0,,9001
+16275,9807,8801,0.0,,9102
+16275,9807,8802,45.0,,9102
+16275,9807,8805,1.0,,9201
+16275,9807,8806,15500000.0,,9001
+16275,9807,8807,0.0,,9001
+16276,9807,8801,0.0,,9102
+16276,9807,8802,48.0,,9102
+16276,9807,8805,1.0,,9201
+16276,9807,8806,16500000.0,,9001
+16276,9807,8807,0.0,,9001
+16277,9807,8801,0.0,,9102
+16277,9807,8802,51.0,,9102
+16277,9807,8805,1.0,,9201
+16277,9807,8806,17500000.0,,9001
+16277,9807,8807,0.0,,9001
+16278,9807,8801,0.0,,9102
+16278,9807,8802,54.0,,9102
+16278,9807,8805,1.0,,9201
+16278,9807,8806,18500000.0,,9001
+16278,9807,8807,0.0,,9001
+16279,9807,8801,0.0,,9102
+16279,9807,8802,57.0,,9102
+16279,9807,8805,1.0,,9201
+16279,9807,8806,19500000.0,,9001
+16279,9807,8807,0.0,,9001
+16280,9807,8801,0.0,,9102
+16280,9807,8802,60.0,,9102
+16280,9807,8805,1.0,,9201
+16280,9807,8806,20500000.0,,9001
+16280,9807,8807,0.0,,9001
+16281,9807,8801,0.0,,9102
+16281,9807,8802,63.0,,9102
+16281,9807,8805,1.0,,9201
+16281,9807,8806,21500000.0,,9001
+16281,9807,8807,0.0,,9001
+16282,9807,8801,0.0,,9102
+16282,9807,8802,66.0,,9102
+16282,9807,8805,1.0,,9201
+16282,9807,8806,22500000.0,,9001
+16282,9807,8807,0.0,,9001
+16283,9807,8801,0.0,,9102
+16283,9807,8802,69.0,,9102
+16283,9807,8805,1.0,,9201
+16283,9807,8806,23500000.0,,9001
+16283,9807,8807,0.0,,9001
+16284,9807,8801,0.0,,9102
+16284,9807,8802,72.0,,9102
+16284,9807,8805,1.0,,9201
+16284,9807,8806,24500000.0,,9001
+16284,9807,8807,0.0,,9001
+16285,9807,8801,0.0,,9102
+16285,9807,8802,75.0,,9102
+16285,9807,8805,1.0,,9201
+16285,9807,8806,25500000.0,,9001
+16285,9807,8807,0.0,,9001
+16286,9807,8801,0.0,,9102
+16286,9807,8802,78.0,,9102
+16286,9807,8805,1.0,,9201
+16286,9807,8806,26500000.0,,9001
+16286,9807,8807,0.0,,9001
+16287,9807,8801,0.0,,9102
+16287,9807,8802,81.0,,9102
+16287,9807,8805,1.0,,9201
+16287,9807,8806,27500000.0,,9001
+16287,9807,8807,0.0,,9001
+16288,9807,8801,0.0,,9102
+16288,9807,8802,84.0,,9102
+16288,9807,8805,1.0,,9201
+16288,9807,8806,28500000.0,,9001
+16288,9807,8807,0.0,,9001
+16289,9807,8801,0.0,,9102
+16289,9807,8802,87.0,,9102
+16289,9807,8805,1.0,,9201
+16289,9807,8806,29500000.0,,9001
+16289,9807,8807,0.0,,9001
+16290,9807,8801,0.0,,9102
+16290,9807,8802,90.0,,9102
+16290,9807,8805,1.0,,9201
+16290,9807,8806,30500000.0,,9001
+16290,9807,8807,0.0,,9001
+16291,9807,8801,0.0,,9102
+16291,9807,8802,93.0,,9102
+16291,9807,8805,1.0,,9201
+16291,9807,8806,31500000.0,,9001
+16291,9807,8807,0.0,,9001
+16292,9807,8801,0.0,,9102
+16292,9807,8802,96.0,,9102
+16292,9807,8805,1.0,,9201
+16292,9807,8806,32500000.0,,9001
+16292,9807,8807,0.0,,9001
+16293,9807,8801,0.0,,9102
+16293,9807,8802,99.0,,9102
+16293,9807,8805,1.0,,9201
+16293,9807,8806,33500000.0,,9001
+16293,9807,8807,0.0,,9001
+16294,9807,8801,0.0,,9102
+16294,9807,8802,102.0,,9102
+16294,9807,8805,1.0,,9201
+16294,9807,8806,34500000.0,,9001
+16294,9807,8807,0.0,,9001
+16295,9807,8801,0.0,,9102
+16295,9807,8802,105.0,,9102
+16295,9807,8805,1.0,,9201
+16295,9807,8806,35500000.0,,9001
+16295,9807,8807,0.0,,9001
+16296,9807,8801,0.0,,9102
+16296,9807,8802,108.0,,9102
+16296,9807,8805,1.0,,9201
+16296,9807,8806,36500000.0,,9001
+16296,9807,8807,0.0,,9001
+16297,9807,8801,0.0,,9102
+16297,9807,8802,111.0,,9102
+16297,9807,8805,1.0,,9201
+16297,9807,8806,37500000.0,,9001
+16297,9807,8807,0.0,,9001
+16298,9807,8801,0.0,,9102
+16298,9807,8802,114.0,,9102
+16298,9807,8805,1.0,,9201
+16298,9807,8806,38500000.0,,9001
+16298,9807,8807,0.0,,9001
+16299,9807,8801,0.0,,9102
+16299,9807,8802,117.0,,9102
+16299,9807,8805,1.0,,9201
+16299,9807,8806,39500000.0,,9001
+16299,9807,8807,0.0,,9001
+16301,9807,8801,0.0,,9102
+16301,9807,8802,3.0,,9102
+16301,9807,8805,1.0,,9201
+16301,9807,8806,500000.0,,9001
+16301,9807,8807,0.0,,9001
+16302,9807,8801,0.0,,9102
+16302,9807,8802,9.0,,9102
+16302,9807,8805,1.0,,9201
+16302,9807,8806,500000.0,,9001
+16302,9807,8807,0.0,,9001
+16303,9807,8801,0.0,,9102
+16303,9807,8802,15.0,,9102
+16303,9807,8805,1.0,,9201
+16303,9807,8806,500000.0,,9001
+16303,9807,8807,0.0,,9001
+16304,9807,8801,0.0,,9102
+16304,9807,8802,21.0,,9102
+16304,9807,8805,1.0,,9201
+16304,9807,8806,500000.0,,9001
+16304,9807,8807,0.0,,9001
+16305,9807,8801,0.0,,9102
+16305,9807,8802,27.0,,9102
+16305,9807,8805,1.0,,9201
+16305,9807,8806,500000.0,,9001
+16305,9807,8807,0.0,,9001
+16306,9807,8801,0.0,,9102
+16306,9807,8802,33.0,,9102
+16306,9807,8805,1.0,,9201
+16306,9807,8806,500000.0,,9001
+16306,9807,8807,0.0,,9001
+16307,9807,8801,0.0,,9102
+16307,9807,8802,39.0,,9102
+16307,9807,8805,1.0,,9201
+16307,9807,8806,500000.0,,9001
+16307,9807,8807,0.0,,9001
+16308,9807,8801,0.0,,9102
+16308,9807,8802,45.0,,9102
+16308,9807,8805,1.0,,9201
+16308,9807,8806,500000.0,,9001
+16308,9807,8807,0.0,,9001
+16309,9807,8801,0.0,,9102
+16309,9807,8802,51.0,,9102
+16309,9807,8805,1.0,,9201
+16309,9807,8806,500000.0,,9001
+16309,9807,8807,0.0,,9001
+16310,9807,8801,0.0,,9102
+16310,9807,8802,57.0,,9102
+16310,9807,8805,1.0,,9201
+16310,9807,8806,500000.0,,9001
+16310,9807,8807,0.0,,9001
+16311,9807,8801,0.0,,9102
+16311,9807,8802,63.0,,9102
+16311,9807,8805,1.0,,9201
+16311,9807,8806,500000.0,,9001
+16311,9807,8807,0.0,,9001
+16312,9807,8801,0.0,,9102
+16312,9807,8802,69.0,,9102
+16312,9807,8805,1.0,,9201
+16312,9807,8806,500000.0,,9001
+16312,9807,8807,0.0,,9001
+16313,9807,8801,0.0,,9102
+16313,9807,8802,75.0,,9102
+16313,9807,8805,1.0,,9201
+16313,9807,8806,500000.0,,9001
+16313,9807,8807,0.0,,9001
+16314,9807,8801,0.0,,9102
+16314,9807,8802,81.0,,9102
+16314,9807,8805,1.0,,9201
+16314,9807,8806,500000.0,,9001
+16314,9807,8807,0.0,,9001
+16315,9807,8801,0.0,,9102
+16315,9807,8802,87.0,,9102
+16315,9807,8805,1.0,,9201
+16315,9807,8806,500000.0,,9001
+16315,9807,8807,0.0,,9001
+16316,9807,8801,0.0,,9102
+16316,9807,8802,93.0,,9102
+16316,9807,8805,1.0,,9201
+16316,9807,8806,500000.0,,9001
+16316,9807,8807,0.0,,9001
+16317,9807,8801,0.0,,9102
+16317,9807,8802,99.0,,9102
+16317,9807,8805,1.0,,9201
+16317,9807,8806,500000.0,,9001
+16317,9807,8807,0.0,,9001
+16318,9807,8801,0.0,,9102
+16318,9807,8802,105.0,,9102
+16318,9807,8805,1.0,,9201
+16318,9807,8806,500000.0,,9001
+16318,9807,8807,0.0,,9001
+16319,9807,8801,0.0,,9102
+16319,9807,8802,111.0,,9102
+16319,9807,8805,1.0,,9201
+16319,9807,8806,500000.0,,9001
+16319,9807,8807,0.0,,9001
+16320,9807,8801,0.0,,9102
+16320,9807,8802,117.0,,9102
+16320,9807,8805,1.0,,9201
+16320,9807,8806,500000.0,,9001
+16320,9807,8807,0.0,,9001
+16321,9807,8801,0.0,,9102
+16321,9807,8802,123.0,,9102
+16321,9807,8805,1.0,,9201
+16321,9807,8806,500000.0,,9001
+16321,9807,8807,0.0,,9001
+16322,9807,8801,0.0,,9102
+16322,9807,8802,129.0,,9102
+16322,9807,8805,1.0,,9201
+16322,9807,8806,500000.0,,9001
+16322,9807,8807,0.0,,9001
+16323,9807,8801,0.0,,9102
+16323,9807,8802,135.0,,9102
+16323,9807,8805,1.0,,9201
+16323,9807,8806,500000.0,,9001
+16323,9807,8807,0.0,,9001
+16324,9807,8801,0.0,,9102
+16324,9807,8802,141.0,,9102
+16324,9807,8805,1.0,,9201
+16324,9807,8806,500000.0,,9001
+16324,9807,8807,0.0,,9001
+16325,9807,8801,0.0,,9102
+16325,9807,8802,147.0,,9102
+16325,9807,8805,1.0,,9201
+16325,9807,8806,500000.0,,9001
+16325,9807,8807,0.0,,9001
+16326,9807,8801,0.0,,9102
+16326,9807,8802,153.0,,9102
+16326,9807,8805,1.0,,9201
+16326,9807,8806,500000.0,,9001
+16326,9807,8807,0.0,,9001
+16327,9807,8801,0.0,,9102
+16327,9807,8802,159.0,,9102
+16327,9807,8805,1.0,,9201
+16327,9807,8806,500000.0,,9001
+16327,9807,8807,0.0,,9001
+16328,9807,8801,0.0,,9102
+16328,9807,8802,165.0,,9102
+16328,9807,8805,1.0,,9201
+16328,9807,8806,500000.0,,9001
+16328,9807,8807,0.0,,9001
+16329,9807,8801,0.0,,9102
+16329,9807,8802,171.0,,9102
+16329,9807,8805,1.0,,9201
+16329,9807,8806,500000.0,,9001
+16329,9807,8807,0.0,,9001
+16330,9807,8801,0.0,,9102
+16330,9807,8802,177.0,,9102
+16330,9807,8805,1.0,,9201
+16330,9807,8806,500000.0,,9001
+16330,9807,8807,0.0,,9001
+16331,9807,8801,0.0,,9102
+16331,9807,8802,-177.0,,9102
+16331,9807,8805,1.0,,9201
+16331,9807,8806,500000.0,,9001
+16331,9807,8807,0.0,,9001
+16332,9807,8801,0.0,,9102
+16332,9807,8802,-171.0,,9102
+16332,9807,8805,1.0,,9201
+16332,9807,8806,500000.0,,9001
+16332,9807,8807,0.0,,9001
+16333,9807,8801,0.0,,9102
+16333,9807,8802,-165.0,,9102
+16333,9807,8805,1.0,,9201
+16333,9807,8806,500000.0,,9001
+16333,9807,8807,0.0,,9001
+16334,9807,8801,0.0,,9102
+16334,9807,8802,-159.0,,9102
+16334,9807,8805,1.0,,9201
+16334,9807,8806,500000.0,,9001
+16334,9807,8807,0.0,,9001
+16335,9807,8801,0.0,,9102
+16335,9807,8802,-153.0,,9102
+16335,9807,8805,1.0,,9201
+16335,9807,8806,500000.0,,9001
+16335,9807,8807,0.0,,9001
+16336,9807,8801,0.0,,9102
+16336,9807,8802,-147.0,,9102
+16336,9807,8805,1.0,,9201
+16336,9807,8806,500000.0,,9001
+16336,9807,8807,0.0,,9001
+16337,9807,8801,0.0,,9102
+16337,9807,8802,-141.0,,9102
+16337,9807,8805,1.0,,9201
+16337,9807,8806,500000.0,,9001
+16337,9807,8807,0.0,,9001
+16338,9807,8801,0.0,,9102
+16338,9807,8802,-135.0,,9102
+16338,9807,8805,1.0,,9201
+16338,9807,8806,500000.0,,9001
+16338,9807,8807,0.0,,9001
+16339,9807,8801,0.0,,9102
+16339,9807,8802,-129.0,,9102
+16339,9807,8805,1.0,,9201
+16339,9807,8806,500000.0,,9001
+16339,9807,8807,0.0,,9001
+16340,9807,8801,0.0,,9102
+16340,9807,8802,-123.0,,9102
+16340,9807,8805,1.0,,9201
+16340,9807,8806,500000.0,,9001
+16340,9807,8807,0.0,,9001
+16341,9807,8801,0.0,,9102
+16341,9807,8802,-117.0,,9102
+16341,9807,8805,1.0,,9201
+16341,9807,8806,500000.0,,9001
+16341,9807,8807,0.0,,9001
+16342,9807,8801,0.0,,9102
+16342,9807,8802,-111.0,,9102
+16342,9807,8805,1.0,,9201
+16342,9807,8806,500000.0,,9001
+16342,9807,8807,0.0,,9001
+16343,9807,8801,0.0,,9102
+16343,9807,8802,-105.0,,9102
+16343,9807,8805,1.0,,9201
+16343,9807,8806,500000.0,,9001
+16343,9807,8807,0.0,,9001
+16344,9807,8801,0.0,,9102
+16344,9807,8802,-99.0,,9102
+16344,9807,8805,1.0,,9201
+16344,9807,8806,500000.0,,9001
+16344,9807,8807,0.0,,9001
+16345,9807,8801,0.0,,9102
+16345,9807,8802,-93.0,,9102
+16345,9807,8805,1.0,,9201
+16345,9807,8806,500000.0,,9001
+16345,9807,8807,0.0,,9001
+16346,9807,8801,0.0,,9102
+16346,9807,8802,-87.0,,9102
+16346,9807,8805,1.0,,9201
+16346,9807,8806,500000.0,,9001
+16346,9807,8807,0.0,,9001
+16347,9807,8801,0.0,,9102
+16347,9807,8802,-81.0,,9102
+16347,9807,8805,1.0,,9201
+16347,9807,8806,500000.0,,9001
+16347,9807,8807,0.0,,9001
+16348,9807,8801,0.0,,9102
+16348,9807,8802,-75.0,,9102
+16348,9807,8805,1.0,,9201
+16348,9807,8806,500000.0,,9001
+16348,9807,8807,0.0,,9001
+16349,9807,8801,0.0,,9102
+16349,9807,8802,-69.0,,9102
+16349,9807,8805,1.0,,9201
+16349,9807,8806,500000.0,,9001
+16349,9807,8807,0.0,,9001
+16350,9807,8801,0.0,,9102
+16350,9807,8802,-63.0,,9102
+16350,9807,8805,1.0,,9201
+16350,9807,8806,500000.0,,9001
+16350,9807,8807,0.0,,9001
+16351,9807,8801,0.0,,9102
+16351,9807,8802,-57.0,,9102
+16351,9807,8805,1.0,,9201
+16351,9807,8806,500000.0,,9001
+16351,9807,8807,0.0,,9001
+16352,9807,8801,0.0,,9102
+16352,9807,8802,-51.0,,9102
+16352,9807,8805,1.0,,9201
+16352,9807,8806,500000.0,,9001
+16352,9807,8807,0.0,,9001
+16353,9807,8801,0.0,,9102
+16353,9807,8802,-45.0,,9102
+16353,9807,8805,1.0,,9201
+16353,9807,8806,500000.0,,9001
+16353,9807,8807,0.0,,9001
+16354,9807,8801,0.0,,9102
+16354,9807,8802,-39.0,,9102
+16354,9807,8805,1.0,,9201
+16354,9807,8806,500000.0,,9001
+16354,9807,8807,0.0,,9001
+16355,9807,8801,0.0,,9102
+16355,9807,8802,-33.0,,9102
+16355,9807,8805,1.0,,9201
+16355,9807,8806,500000.0,,9001
+16355,9807,8807,0.0,,9001
+16356,9807,8801,0.0,,9102
+16356,9807,8802,-27.0,,9102
+16356,9807,8805,1.0,,9201
+16356,9807,8806,500000.0,,9001
+16356,9807,8807,0.0,,9001
+16357,9807,8801,0.0,,9102
+16357,9807,8802,-21.0,,9102
+16357,9807,8805,1.0,,9201
+16357,9807,8806,500000.0,,9001
+16357,9807,8807,0.0,,9001
+16358,9807,8801,0.0,,9102
+16358,9807,8802,-15.0,,9102
+16358,9807,8805,1.0,,9201
+16358,9807,8806,500000.0,,9001
+16358,9807,8807,0.0,,9001
+16359,9807,8801,0.0,,9102
+16359,9807,8802,-9.0,,9102
+16359,9807,8805,1.0,,9201
+16359,9807,8806,500000.0,,9001
+16359,9807,8807,0.0,,9001
+16360,9807,8801,0.0,,9102
+16360,9807,8802,-3.0,,9102
+16360,9807,8805,1.0,,9201
+16360,9807,8806,500000.0,,9001
+16360,9807,8807,0.0,,9001
+16361,9807,8801,0.0,,9102
+16361,9807,8802,3.0,,9102
+16361,9807,8805,1.0,,9201
+16361,9807,8806,500000.0,,9001
+16361,9807,8807,0.0,,9001
+16362,9807,8801,0.0,,9102
+16362,9807,8802,6.0,,9102
+16362,9807,8805,1.0,,9201
+16362,9807,8806,500000.0,,9001
+16362,9807,8807,0.0,,9001
+16363,9807,8801,0.0,,9102
+16363,9807,8802,9.0,,9102
+16363,9807,8805,1.0,,9201
+16363,9807,8806,500000.0,,9001
+16363,9807,8807,0.0,,9001
+16364,9807,8801,0.0,,9102
+16364,9807,8802,12.0,,9102
+16364,9807,8805,1.0,,9201
+16364,9807,8806,500000.0,,9001
+16364,9807,8807,0.0,,9001
+16365,9807,8801,0.0,,9102
+16365,9807,8802,15.0,,9102
+16365,9807,8805,1.0,,9201
+16365,9807,8806,500000.0,,9001
+16365,9807,8807,0.0,,9001
+16366,9807,8801,0.0,,9102
+16366,9807,8802,18.0,,9102
+16366,9807,8805,1.0,,9201
+16366,9807,8806,500000.0,,9001
+16366,9807,8807,0.0,,9001
+16367,9807,8801,0.0,,9102
+16367,9807,8802,21.0,,9102
+16367,9807,8805,1.0,,9201
+16367,9807,8806,500000.0,,9001
+16367,9807,8807,0.0,,9001
+16368,9807,8801,0.0,,9102
+16368,9807,8802,24.0,,9102
+16368,9807,8805,1.0,,9201
+16368,9807,8806,500000.0,,9001
+16368,9807,8807,0.0,,9001
+16369,9807,8801,0.0,,9102
+16369,9807,8802,27.0,,9102
+16369,9807,8805,1.0,,9201
+16369,9807,8806,500000.0,,9001
+16369,9807,8807,0.0,,9001
+16370,9807,8801,0.0,,9102
+16370,9807,8802,30.0,,9102
+16370,9807,8805,1.0,,9201
+16370,9807,8806,500000.0,,9001
+16370,9807,8807,0.0,,9001
+16371,9807,8801,0.0,,9102
+16371,9807,8802,33.0,,9102
+16371,9807,8805,1.0,,9201
+16371,9807,8806,500000.0,,9001
+16371,9807,8807,0.0,,9001
+16372,9807,8801,0.0,,9102
+16372,9807,8802,36.0,,9102
+16372,9807,8805,1.0,,9201
+16372,9807,8806,500000.0,,9001
+16372,9807,8807,0.0,,9001
+16373,9807,8801,0.0,,9102
+16373,9807,8802,39.0,,9102
+16373,9807,8805,1.0,,9201
+16373,9807,8806,500000.0,,9001
+16373,9807,8807,0.0,,9001
+16374,9807,8801,0.0,,9102
+16374,9807,8802,42.0,,9102
+16374,9807,8805,1.0,,9201
+16374,9807,8806,500000.0,,9001
+16374,9807,8807,0.0,,9001
+16375,9807,8801,0.0,,9102
+16375,9807,8802,45.0,,9102
+16375,9807,8805,1.0,,9201
+16375,9807,8806,500000.0,,9001
+16375,9807,8807,0.0,,9001
+16376,9807,8801,0.0,,9102
+16376,9807,8802,48.0,,9102
+16376,9807,8805,1.0,,9001
+16376,9807,8806,500000.0,,9001
+16376,9807,8807,0.0,,9201
+16377,9807,8801,0.0,,9102
+16377,9807,8802,51.0,,9102
+16377,9807,8805,1.0,,9201
+16377,9807,8806,500000.0,,9001
+16377,9807,8807,0.0,,9001
+16378,9807,8801,0.0,,9102
+16378,9807,8802,54.0,,9102
+16378,9807,8805,1.0,,9201
+16378,9807,8806,500000.0,,9001
+16378,9807,8807,0.0,,9001
+16379,9807,8801,0.0,,9102
+16379,9807,8802,57.0,,9102
+16379,9807,8805,1.0,,9201
+16379,9807,8806,500000.0,,9001
+16379,9807,8807,0.0,,9001
+16380,9807,8801,0.0,,9102
+16380,9807,8802,60.0,,9102
+16380,9807,8805,1.0,,9201
+16380,9807,8806,500000.0,,9001
+16380,9807,8807,0.0,,9001
+16381,9807,8801,0.0,,9102
+16381,9807,8802,63.0,,9102
+16381,9807,8805,1.0,,9201
+16381,9807,8806,500000.0,,9001
+16381,9807,8807,0.0,,9001
+16382,9807,8801,0.0,,9102
+16382,9807,8802,66.0,,9102
+16382,9807,8805,1.0,,9201
+16382,9807,8806,500000.0,,9001
+16382,9807,8807,0.0,,9001
+16383,9807,8801,0.0,,9102
+16383,9807,8802,69.0,,9102
+16383,9807,8805,1.0,,9201
+16383,9807,8806,500000.0,,9001
+16383,9807,8807,0.0,,9001
+16384,9807,8801,0.0,,9102
+16384,9807,8802,72.0,,9102
+16384,9807,8805,1.0,,9201
+16384,9807,8806,500000.0,,9001
+16384,9807,8807,0.0,,9001
+16385,9807,8801,0.0,,9102
+16385,9807,8802,75.0,,9102
+16385,9807,8805,1.0,,9201
+16385,9807,8806,500000.0,,9001
+16385,9807,8807,0.0,,9001
+16386,9807,8801,0.0,,9102
+16386,9807,8802,78.0,,9102
+16386,9807,8805,1.0,,9201
+16386,9807,8806,500000.0,,9001
+16386,9807,8807,0.0,,9001
+16387,9807,8801,0.0,,9102
+16387,9807,8802,81.0,,9102
+16387,9807,8805,1.0,,9201
+16387,9807,8806,500000.0,,9001
+16387,9807,8807,0.0,,9001
+16388,9807,8801,0.0,,9102
+16388,9807,8802,84.0,,9102
+16388,9807,8805,1.0,,9201
+16388,9807,8806,500000.0,,9001
+16388,9807,8807,0.0,,9001
+16389,9807,8801,0.0,,9102
+16389,9807,8802,87.0,,9102
+16389,9807,8805,1.0,,9201
+16389,9807,8806,500000.0,,9001
+16389,9807,8807,0.0,,9001
+16390,9807,8801,0.0,,9102
+16390,9807,8802,90.0,,9102
+16390,9807,8805,1.0,,9201
+16390,9807,8806,500000.0,,9001
+16390,9807,8807,0.0,,9001
+16391,9807,8801,0.0,,9102
+16391,9807,8802,93.0,,9102
+16391,9807,8805,1.0,,9201
+16391,9807,8806,500000.0,,9001
+16391,9807,8807,0.0,,9001
+16392,9807,8801,0.0,,9102
+16392,9807,8802,96.0,,9102
+16392,9807,8805,1.0,,9201
+16392,9807,8806,500000.0,,9001
+16392,9807,8807,0.0,,9001
+16393,9807,8801,0.0,,9102
+16393,9807,8802,99.0,,9102
+16393,9807,8805,1.0,,9201
+16393,9807,8806,500000.0,,9001
+16393,9807,8807,0.0,,9001
+16394,9807,8801,0.0,,9102
+16394,9807,8802,102.0,,9102
+16394,9807,8805,1.0,,9201
+16394,9807,8806,500000.0,,9001
+16394,9807,8807,0.0,,9001
+16395,9807,8801,0.0,,9102
+16395,9807,8802,105.0,,9102
+16395,9807,8805,1.0,,9201
+16395,9807,8806,500000.0,,9001
+16395,9807,8807,0.0,,9001
+16396,9807,8801,0.0,,9102
+16396,9807,8802,108.0,,9102
+16396,9807,8805,1.0,,9201
+16396,9807,8806,500000.0,,9001
+16396,9807,8807,0.0,,9001
+16397,9807,8801,0.0,,9102
+16397,9807,8802,111.0,,9102
+16397,9807,8805,1.0,,9201
+16397,9807,8806,500000.0,,9001
+16397,9807,8807,0.0,,9001
+16398,9807,8801,0.0,,9102
+16398,9807,8802,114.0,,9102
+16398,9807,8805,1.0,,9201
+16398,9807,8806,500000.0,,9001
+16398,9807,8807,0.0,,9001
+16399,9807,8801,0.0,,9102
+16399,9807,8802,117.0,,9102
+16399,9807,8805,1.0,,9201
+16399,9807,8806,500000.0,,9001
+16399,9807,8807,0.0,,9001
+16400,9807,8801,0.0,,9102
+16400,9807,8802,0.0,,9102
+16400,9807,8805,0.9996,,9201
+16400,9807,8806,500000.0,,9001
+16400,9807,8807,0.0,,9001
+16405,9807,8801,0.0,,9102
+16405,9807,8802,5.0,,9102
+16405,9807,8805,0.9996,,9201
+16405,9807,8806,500000.0,,9001
+16405,9807,8807,0.0,,9001
+16406,9807,8801,0.0,,9102
+16406,9807,8802,6.0,,9102
+16406,9807,8805,0.9996,,9201
+16406,9807,8806,500000.0,,9001
+16406,9807,8807,0.0,,9001
+16411,9807,8801,0.0,,9102
+16411,9807,8802,11.0,,9102
+16411,9807,8805,0.9996,,9201
+16411,9807,8806,500000.0,,9001
+16411,9807,8807,0.0,,9001
+16412,9807,8801,0.0,,9102
+16412,9807,8802,12.0,,9102
+16412,9807,8805,0.9996,,9201
+16412,9807,8806,500000.0,,9001
+16412,9807,8807,0.0,,9001
+16413,9807,8801,0.0,,9102
+16413,9807,8802,13.0,,9102
+16413,9807,8805,0.9996,,9201
+16413,9807,8806,500000.0,,9001
+16413,9807,8807,0.0,,9001
+16430,9807,8801,0.0,,9102
+16430,9807,8802,30.0,,9102
+16430,9807,8805,0.9996,,9201
+16430,9807,8806,500000.0,,9001
+16430,9807,8807,0.0,,9001
+16506,9807,8801,0.0,,9102
+16506,9807,8802,106.0,,9102
+16506,9807,8805,0.9996,,9201
+16506,9807,8806,500000.0,,9001
+16506,9807,8807,0.0,,9001
+16586,9807,8801,0.0,,9102
+16586,9807,8802,106.0,,9102
+16586,9807,8805,1.0,,9201
+16586,9807,8806,500000.0,,9001
+16586,9807,8807,0.0,,9001
+16611,9807,8801,0.0,,9110
+16611,9807,8802,11.3,,9110
+16611,9807,8805,0.9996,,9201
+16611,9807,8806,500000.0,,9001
+16611,9807,8807,10000000.0,,9001
+16612,9807,8801,0.0,,9102
+16612,9807,8802,12.0,,9102
+16612,9807,8805,0.9996,,9201
+16612,9807,8806,500000.0,,9001
+16612,9807,8807,10000000.0,,9001
+16636,9807,8801,0.0,,9102
+16636,9807,8802,36.0,,9102
+16636,9807,8805,0.9996,,9201
+16636,9807,8806,500000.0,,9001
+16636,9807,8807,10000000.0,,9001
+16709,9807,8801,0.0,,9102
+16709,9807,8802,109.0,,9102
+16709,9807,8805,0.9996,,9201
+16709,9807,8806,500000.0,,9001
+16709,9807,8807,10000000.0,,9001
+16716,9807,8801,0.0,,9102
+16716,9807,8802,116.0,,9102
+16716,9807,8805,0.9996,,9201
+16716,9807,8806,500000.0,,9001
+16716,9807,8807,10000000.0,,9001
+16732,9807,8801,0.0,,9102
+16732,9807,8802,132.0,,9102
+16732,9807,8805,0.9996,,9201
+16732,9807,8806,500000.0,,9001
+16732,9807,8807,10000000.0,,9001
+17001,9807,8801,0.0,,9102
+17001,9807,8802,-1.0,,9102
+17001,9807,8805,0.9996,,9201
+17001,9807,8806,500000.0,,9001
+17001,9807,8807,0.0,,9001
+17005,9807,8801,0.0,,9102
+17005,9807,8802,-5.0,,9102
+17005,9807,8805,0.9996,,9201
+17005,9807,8806,500000.0,,9001
+17005,9807,8807,0.0,,9001
+17054,9807,8801,0.0,,9102
+17054,9807,8802,-54.0,,9102
+17054,9807,8805,0.9996,,9201
+17054,9807,8806,500000.0,,9001
+17054,9807,8807,0.0,,9001
+17348,9807,8801,0.0,,9102
+17348,9807,8802,105.0,,9102
+17348,9807,8805,0.9996,,9201
+17348,9807,8806,500000.0,,9001
+17348,9807,8807,10000000.0,,9001
+17349,9807,8801,0.0,,9102
+17349,9807,8802,111.0,,9102
+17349,9807,8805,0.9996,,9201
+17349,9807,8806,500000.0,,9001
+17349,9807,8807,10000000.0,,9001
+17350,9807,8801,0.0,,9102
+17350,9807,8802,117.0,,9102
+17350,9807,8805,0.9996,,9201
+17350,9807,8806,500000.0,,9001
+17350,9807,8807,10000000.0,,9001
+17351,9807,8801,0.0,,9102
+17351,9807,8802,123.0,,9102
+17351,9807,8805,0.9996,,9201
+17351,9807,8806,500000.0,,9001
+17351,9807,8807,10000000.0,,9001
+17352,9807,8801,0.0,,9102
+17352,9807,8802,129.0,,9102
+17352,9807,8805,0.9996,,9201
+17352,9807,8806,500000.0,,9001
+17352,9807,8807,10000000.0,,9001
+17353,9807,8801,0.0,,9102
+17353,9807,8802,135.0,,9102
+17353,9807,8805,0.9996,,9201
+17353,9807,8806,500000.0,,9001
+17353,9807,8807,10000000.0,,9001
+17354,9807,8801,0.0,,9102
+17354,9807,8802,141.0,,9102
+17354,9807,8805,0.9996,,9201
+17354,9807,8806,500000.0,,9001
+17354,9807,8807,10000000.0,,9001
+17355,9807,8801,0.0,,9102
+17355,9807,8802,147.0,,9102
+17355,9807,8805,0.9996,,9201
+17355,9807,8806,500000.0,,9001
+17355,9807,8807,10000000.0,,9001
+17356,9807,8801,0.0,,9102
+17356,9807,8802,153.0,,9102
+17356,9807,8805,0.9996,,9201
+17356,9807,8806,500000.0,,9001
+17356,9807,8807,10000000.0,,9001
+17357,9807,8801,0.0,,9102
+17357,9807,8802,159.0,,9102
+17357,9807,8805,0.9996,,9201
+17357,9807,8806,500000.0,,9001
+17357,9807,8807,10000000.0,,9001
+17358,9807,8801,0.0,,9102
+17358,9807,8802,165.0,,9102
+17358,9807,8805,0.9996,,9201
+17358,9807,8806,500000.0,,9001
+17358,9807,8807,10000000.0,,9001
+17448,9807,8801,0.0,,9102
+17448,9807,8802,105.0,,9102
+17448,9807,8805,0.9996,,9201
+17448,9807,8806,500000.0,,9001
+17448,9807,8807,10000000.0,,9001
+17449,9807,8801,0.0,,9102
+17449,9807,8802,111.0,,9102
+17449,9807,8805,0.9996,,9201
+17449,9807,8806,500000.0,,9001
+17449,9807,8807,10000000.0,,9001
+17450,9807,8801,0.0,,9102
+17450,9807,8802,117.0,,9102
+17450,9807,8805,0.9996,,9201
+17450,9807,8806,500000.0,,9001
+17450,9807,8807,10000000.0,,9001
+17451,9807,8801,0.0,,9102
+17451,9807,8802,123.0,,9102
+17451,9807,8805,0.9996,,9201
+17451,9807,8806,500000.0,,9001
+17451,9807,8807,10000000.0,,9001
+17452,9807,8801,0.0,,9102
+17452,9807,8802,129.0,,9102
+17452,9807,8805,0.9996,,9201
+17452,9807,8806,500000.0,,9001
+17452,9807,8807,10000000.0,,9001
+17453,9807,8801,0.0,,9102
+17453,9807,8802,135.0,,9102
+17453,9807,8805,0.9996,,9201
+17453,9807,8806,500000.0,,9001
+17453,9807,8807,10000000.0,,9001
+17454,9807,8801,0.0,,9102
+17454,9807,8802,141.0,,9102
+17454,9807,8805,0.9996,,9201
+17454,9807,8806,500000.0,,9001
+17454,9807,8807,10000000.0,,9001
+17455,9807,8801,0.0,,9102
+17455,9807,8802,147.0,,9102
+17455,9807,8805,0.9996,,9201
+17455,9807,8806,500000.0,,9001
+17455,9807,8807,10000000.0,,9001
+17456,9807,8801,0.0,,9102
+17456,9807,8802,153.0,,9102
+17456,9807,8805,0.9996,,9201
+17456,9807,8806,500000.0,,9001
+17456,9807,8807,10000000.0,,9001
+17457,9807,8801,0.0,,9102
+17457,9807,8802,159.0,,9102
+17457,9807,8805,0.9996,,9201
+17457,9807,8806,500000.0,,9001
+17457,9807,8807,10000000.0,,9001
+17458,9807,8801,0.0,,9102
+17458,9807,8802,165.0,,9102
+17458,9807,8805,0.9996,,9201
+17458,9807,8806,500000.0,,9001
+17458,9807,8807,10000000.0,,9001
+17515,9808,8801,0.0,,9102
+17515,9808,8802,15.0,,9102
+17515,9808,8805,1.0,,9201
+17515,9808,8806,0.0,,9001
+17515,9808,8807,0.0,,9001
+17517,9808,8801,0.0,,9102
+17517,9808,8802,17.0,,9102
+17517,9808,8805,1.0,,9201
+17517,9808,8806,0.0,,9001
+17517,9808,8807,0.0,,9001
+17519,9808,8801,0.0,,9102
+17519,9808,8802,19.0,,9102
+17519,9808,8805,1.0,,9201
+17519,9808,8806,0.0,,9001
+17519,9808,8807,0.0,,9001
+17521,9808,8801,0.0,,9102
+17521,9808,8802,21.0,,9102
+17521,9808,8805,1.0,,9201
+17521,9808,8806,0.0,,9001
+17521,9808,8807,0.0,,9001
+17523,9808,8801,0.0,,9102
+17523,9808,8802,23.0,,9102
+17523,9808,8805,1.0,,9201
+17523,9808,8806,0.0,,9001
+17523,9808,8807,0.0,,9001
+17525,9808,8801,0.0,,9102
+17525,9808,8802,25.0,,9102
+17525,9808,8805,1.0,,9201
+17525,9808,8806,0.0,,9001
+17525,9808,8807,0.0,,9001
+17527,9808,8801,0.0,,9102
+17527,9808,8802,27.0,,9102
+17527,9808,8805,1.0,,9201
+17527,9808,8806,0.0,,9001
+17527,9808,8807,0.0,,9001
+17529,9808,8801,0.0,,9102
+17529,9808,8802,29.0,,9102
+17529,9808,8805,1.0,,9201
+17529,9808,8806,0.0,,9001
+17529,9808,8807,0.0,,9001
+17531,9808,8801,0.0,,9102
+17531,9808,8802,31.0,,9102
+17531,9808,8805,1.0,,9201
+17531,9808,8806,0.0,,9001
+17531,9808,8807,0.0,,9001
+17533,9808,8801,0.0,,9102
+17533,9808,8802,33.0,,9102
+17533,9808,8805,1.0,,9201
+17533,9808,8806,0.0,,9001
+17533,9808,8807,0.0,,9001
+17611,9808,8801,-22.0,,9102
+17611,9808,8802,11.0,,9102
+17611,9808,8805,1.0,,9201
+17611,9808,8806,0.0,,9031
+17611,9808,8807,0.0,,9031
+17613,9808,8801,-22.0,,9102
+17613,9808,8802,13.0,,9102
+17613,9808,8805,1.0,,9201
+17613,9808,8806,0.0,,9031
+17613,9808,8807,0.0,,9031
+17615,9808,8801,-22.0,,9102
+17615,9808,8802,15.0,,9102
+17615,9808,8805,1.0,,9201
+17615,9808,8806,0.0,,9031
+17615,9808,8807,0.0,,9031
+17617,9808,8801,-22.0,,9102
+17617,9808,8802,17.0,,9102
+17617,9808,8805,1.0,,9201
+17617,9808,8806,0.0,,9031
+17617,9808,8807,0.0,,9031
+17619,9808,8801,-22.0,,9102
+17619,9808,8802,19.0,,9102
+17619,9808,8805,1.0,,9201
+17619,9808,8806,0.0,,9031
+17619,9808,8807,0.0,,9031
+17621,9808,8801,-22.0,,9102
+17621,9808,8802,21.0,,9102
+17621,9808,8805,1.0,,9201
+17621,9808,8806,0.0,,9031
+17621,9808,8807,0.0,,9031
+17623,9808,8801,-22.0,,9102
+17623,9808,8802,23.0,,9102
+17623,9808,8805,1.0,,9201
+17623,9808,8806,0.0,,9031
+17623,9808,8807,0.0,,9031
+17625,9808,8801,-22.0,,9102
+17625,9808,8802,25.0,,9102
+17625,9808,8805,1.0,,9201
+17625,9808,8806,0.0,,9031
+17625,9808,8807,0.0,,9031
+17700,9807,8801,0.0,,9110
+17700,9807,8802,-55.3,,9110
+17700,9807,8805,0.9999,,9201
+17700,9807,8806,304800.0,,9001
+17700,9807,8807,0.0,,9001
+17701,9807,8801,0.0,,9102
+17701,9807,8802,-53.0,,9102
+17701,9807,8805,0.9999,,9201
+17701,9807,8806,304800.0,,9001
+17701,9807,8807,0.0,,9001
+17702,9807,8801,0.0,,9102
+17702,9807,8802,-56.0,,9102
+17702,9807,8805,0.9999,,9201
+17702,9807,8806,304800.0,,9001
+17702,9807,8807,0.0,,9001
+17703,9807,8801,0.0,,9110
+17703,9807,8802,-58.3,,9110
+17703,9807,8805,0.9999,,9201
+17703,9807,8806,304800.0,,9001
+17703,9807,8807,0.0,,9001
+17704,9807,8801,0.0,,9110
+17704,9807,8802,-61.3,,9110
+17704,9807,8805,0.9999,,9201
+17704,9807,8806,304800.0,,9001
+17704,9807,8807,0.0,,9001
+17705,9807,8801,0.0,,9110
+17705,9807,8802,-64.3,,9110
+17705,9807,8805,0.9999,,9201
+17705,9807,8806,304800.0,,9001
+17705,9807,8807,0.0,,9001
+17706,9807,8801,0.0,,9110
+17706,9807,8802,-67.3,,9110
+17706,9807,8805,0.9999,,9201
+17706,9807,8806,304800.0,,9001
+17706,9807,8807,0.0,,9001
+17707,9807,8801,0.0,,9110
+17707,9807,8802,-70.3,,9110
+17707,9807,8805,0.9999,,9201
+17707,9807,8806,304800.0,,9001
+17707,9807,8807,0.0,,9001
+17708,9807,8801,0.0,,9110
+17708,9807,8802,-73.3,,9110
+17708,9807,8805,0.9999,,9201
+17708,9807,8806,304800.0,,9001
+17708,9807,8807,0.0,,9001
+17709,9807,8801,0.0,,9110
+17709,9807,8802,-76.3,,9110
+17709,9807,8805,0.9999,,9201
+17709,9807,8806,304800.0,,9001
+17709,9807,8807,0.0,,9001
+17710,9807,8801,0.0,,9110
+17710,9807,8802,-79.3,,9110
+17710,9807,8805,0.9999,,9201
+17710,9807,8806,304800.0,,9001
+17710,9807,8807,0.0,,9001
+17711,9807,8801,0.0,,9110
+17711,9807,8802,-82.3,,9110
+17711,9807,8805,0.9999,,9201
+17711,9807,8806,304800.0,,9001
+17711,9807,8807,0.0,,9001
+17712,9807,8801,0.0,,9102
+17712,9807,8802,-81.0,,9102
+17712,9807,8805,0.9999,,9201
+17712,9807,8806,304800.0,,9001
+17712,9807,8807,0.0,,9001
+17713,9807,8801,0.0,,9102
+17713,9807,8802,-84.0,,9102
+17713,9807,8805,0.9999,,9201
+17713,9807,8806,304800.0,,9001
+17713,9807,8807,0.0,,9001
+17714,9807,8801,0.0,,9102
+17714,9807,8802,-87.0,,9102
+17714,9807,8805,0.9999,,9201
+17714,9807,8806,304800.0,,9001
+17714,9807,8807,0.0,,9001
+17715,9807,8801,0.0,,9102
+17715,9807,8802,-90.0,,9102
+17715,9807,8805,0.9999,,9201
+17715,9807,8806,304800.0,,9001
+17715,9807,8807,0.0,,9001
+17716,9807,8801,0.0,,9102
+17716,9807,8802,-93.0,,9102
+17716,9807,8805,0.9999,,9201
+17716,9807,8806,304800.0,,9001
+17716,9807,8807,0.0,,9001
+17717,9807,8801,0.0,,9102
+17717,9807,8802,-96.0,,9102
+17717,9807,8805,0.9999,,9201
+17717,9807,8806,304800.0,,9001
+17717,9807,8807,0.0,,9001
+17794,9807,8801,0.0,,9110
+17794,9807,8802,-61.3,,9110
+17794,9807,8805,0.9999,,9201
+17794,9807,8806,4500000.0,,9001
+17794,9807,8807,0.0,,9001
+17795,9807,8801,0.0,,9110
+17795,9807,8802,-64.3,,9110
+17795,9807,8805,0.9999,,9201
+17795,9807,8806,5500000.0,,9001
+17795,9807,8807,0.0,,9001
+17801,9807,8801,33.0,,9110
+17801,9807,8802,129.3,,9110
+17801,9807,8805,0.9999,,9201
+17801,9807,8806,0.0,,9001
+17801,9807,8807,0.0,,9001
+17802,9807,8801,33.0,,9110
+17802,9807,8802,131.0,,9110
+17802,9807,8805,0.9999,,9201
+17802,9807,8806,0.0,,9001
+17802,9807,8807,0.0,,9001
+17803,9807,8801,36.0,,9110
+17803,9807,8802,132.1,,9110
+17803,9807,8805,0.9999,,9201
+17803,9807,8806,0.0,,9001
+17803,9807,8807,0.0,,9001
+17804,9807,8801,33.0,,9110
+17804,9807,8802,133.3,,9110
+17804,9807,8805,0.9999,,9201
+17804,9807,8806,0.0,,9001
+17804,9807,8807,0.0,,9001
+17805,9807,8801,36.0,,9110
+17805,9807,8802,134.2,,9110
+17805,9807,8805,0.9999,,9201
+17805,9807,8806,0.0,,9001
+17805,9807,8807,0.0,,9001
+17806,9807,8801,36.0,,9110
+17806,9807,8802,136.0,,9110
+17806,9807,8805,0.9999,,9201
+17806,9807,8806,0.0,,9001
+17806,9807,8807,0.0,,9001
+17807,9807,8801,36.0,,9110
+17807,9807,8802,137.1,,9110
+17807,9807,8805,0.9999,,9201
+17807,9807,8806,0.0,,9001
+17807,9807,8807,0.0,,9001
+17808,9807,8801,36.0,,9110
+17808,9807,8802,138.3,,9110
+17808,9807,8805,0.9999,,9201
+17808,9807,8806,0.0,,9001
+17808,9807,8807,0.0,,9001
+17809,9807,8801,36.0,,9110
+17809,9807,8802,139.5,,9110
+17809,9807,8805,0.9999,,9201
+17809,9807,8806,0.0,,9001
+17809,9807,8807,0.0,,9001
+17810,9807,8801,40.0,,9110
+17810,9807,8802,140.5,,9110
+17810,9807,8805,0.9999,,9201
+17810,9807,8806,0.0,,9001
+17810,9807,8807,0.0,,9001
+17811,9807,8801,44.0,,9110
+17811,9807,8802,140.15,,9110
+17811,9807,8805,0.9999,,9201
+17811,9807,8806,0.0,,9001
+17811,9807,8807,0.0,,9001
+17812,9807,8801,44.0,,9110
+17812,9807,8802,142.15,,9110
+17812,9807,8805,0.9999,,9201
+17812,9807,8806,0.0,,9001
+17812,9807,8807,0.0,,9001
+17813,9807,8801,44.0,,9110
+17813,9807,8802,144.15,,9110
+17813,9807,8805,0.9999,,9201
+17813,9807,8806,0.0,,9001
+17813,9807,8807,0.0,,9001
+17814,9807,8801,26.0,,9110
+17814,9807,8802,142.0,,9110
+17814,9807,8805,0.9999,,9201
+17814,9807,8806,0.0,,9001
+17814,9807,8807,0.0,,9001
+17815,9807,8801,26.0,,9110
+17815,9807,8802,127.3,,9110
+17815,9807,8805,0.9999,,9201
+17815,9807,8806,0.0,,9001
+17815,9807,8807,0.0,,9001
+17816,9807,8801,26.0,,9110
+17816,9807,8802,124.0,,9110
+17816,9807,8805,0.9999,,9201
+17816,9807,8806,0.0,,9001
+17816,9807,8807,0.0,,9001
+17817,9807,8801,26.0,,9110
+17817,9807,8802,131.0,,9110
+17817,9807,8805,0.9999,,9201
+17817,9807,8806,0.0,,9001
+17817,9807,8807,0.0,,9001
+17818,9807,8801,20.0,,9110
+17818,9807,8802,136.0,,9110
+17818,9807,8805,0.9999,,9201
+17818,9807,8806,0.0,,9001
+17818,9807,8807,0.0,,9001
+17819,9807,8801,26.0,,9110
+17819,9807,8802,154.0,,9110
+17819,9807,8805,0.9999,,9201
+17819,9807,8806,0.0,,9001
+17819,9807,8807,0.0,,9001
+17901,9807,8801,-36.5247515,,9110
+17901,9807,8802,174.45516217,,9110
+17901,9807,8805,0.9999,,9201
+17901,9807,8806,300000.0,,9001
+17901,9807,8807,700000.0,,9001
+17902,9807,8801,-37.45404993,,9110
+17902,9807,8802,176.27583101,,9110
+17902,9807,8805,1.0,,9201
+17902,9807,8806,300000.0,,9001
+17902,9807,8807,700000.0,,9001
+17903,9807,8801,-38.372893,,9110
+17903,9807,8802,177.53082906,,9110
+17903,9807,8805,1.0,,9201
+17903,9807,8806,300000.0,,9001
+17903,9807,8807,700000.0,,9001
+17904,9807,8801,-39.39033455,,9110
+17904,9807,8802,176.40252499,,9110
+17904,9807,8805,1.0,,9201
+17904,9807,8806,300000.0,,9001
+17904,9807,8807,700000.0,,9001
+17905,9807,8801,-39.08087299,,9110
+17905,9807,8802,174.13408423,,9110
+17905,9807,8805,1.0,,9201
+17905,9807,8806,300000.0,,9001
+17905,9807,8807,700000.0,,9001
+17906,9807,8801,-39.30448934,,9110
+17906,9807,8802,175.38241325,,9110
+17906,9807,8805,1.0,,9201
+17906,9807,8806,300000.0,,9001
+17906,9807,8807,700000.0,,9001
+17907,9807,8801,-40.14310097,,9110
+17907,9807,8802,175.29171586,,9110
+17907,9807,8805,1.0,,9201
+17907,9807,8806,300000.0,,9001
+17907,9807,8807,700000.0,,9001
+17908,9807,8801,-40.55319175,,9110
+17908,9807,8802,175.38504588,,9110
+17908,9807,8805,1.0,,9201
+17908,9807,8806,300000.0,,9001
+17908,9807,8807,700000.0,,9001
+17909,9807,8801,-41.18047507,,9110
+17909,9807,8802,174.46358432,,9110
+17909,9807,8805,1.0,,9201
+17909,9807,8806,300000.0,,9001
+17909,9807,8807,700000.0,,9001
+17910,9807,8801,-40.42531326,,9110
+17910,9807,8802,172.40193674,,9110
+17910,9807,8805,1.0,,9201
+17910,9807,8806,300000.0,,9001
+17910,9807,8807,700000.0,,9001
+17911,9807,8801,-41.1628361,,9110
+17911,9807,8802,173.17575405,,9110
+17911,9807,8805,1.0,,9201
+17911,9807,8806,300000.0,,9001
+17911,9807,8807,700000.0,,9001
+17912,9807,8801,-41.17236815,,9110
+17912,9807,8802,172.06325015,,9110
+17912,9807,8805,1.0,,9201
+17912,9807,8806,300000.0,,9001
+17912,9807,8807,700000.0,,9001
+17913,9807,8801,-41.48388903,,9110
+17913,9807,8802,171.34525362,,9110
+17913,9807,8805,1.0,,9201
+17913,9807,8806,300000.0,,9001
+17913,9807,8807,700000.0,,9001
+17914,9807,8801,-42.20012994,,9110
+17914,9807,8802,171.32591767,,9110
+17914,9807,8805,1.0,,9201
+17914,9807,8806,300000.0,,9001
+17914,9807,8807,700000.0,,9001
+17915,9807,8801,-42.41208197,,9110
+17915,9807,8802,173.00364802,,9110
+17915,9807,8805,1.0,,9201
+17915,9807,8806,300000.0,,9001
+17915,9807,8807,700000.0,,9001
+17916,9807,8801,-41.3240152,,9110
+17916,9807,8802,173.48074668,,9110
+17916,9807,8805,1.0,,9201
+17916,9807,8806,300000.0,,9001
+17916,9807,8807,700000.0,,9001
+17917,9807,8801,-42.53107605,,9110
+17917,9807,8802,170.58479766,,9110
+17917,9807,8805,1.0,,9201
+17917,9807,8806,300000.0,,9001
+17917,9807,8807,700000.0,,9001
+17918,9807,8801,-43.06364613,,9110
+17918,9807,8802,170.1539333,,9110
+17918,9807,8805,1.0,,9201
+17918,9807,8806,300000.0,,9001
+17918,9807,8807,700000.0,,9001
+17919,9807,8801,-43.58400904,,9110
+17919,9807,8802,168.36225612,,9110
+17919,9807,8805,1.0,,9201
+17919,9807,8806,300000.0,,9001
+17919,9807,8807,700000.0,,9001
+17920,9807,8801,-43.35262953,,9110
+17920,9807,8802,172.43378969,,9110
+17920,9807,8805,1.0,,9201
+17920,9807,8806,300000.0,,9001
+17920,9807,8807,700000.0,,9001
+17921,9807,8801,-43.44553616,,9110
+17921,9807,8802,171.21386945,,9110
+17921,9807,8805,1.0,,9201
+17921,9807,8806,300000.0,,9001
+17921,9807,8807,700000.0,,9001
+17922,9807,8801,-44.24079933,,9110
+17922,9807,8802,171.0326103,,9110
+17922,9807,8805,1.0,,9201
+17922,9807,8806,300000.0,,9001
+17922,9807,8807,700000.0,,9001
+17923,9807,8801,-44.44069647,,9110
+17923,9807,8802,169.28039183,,9110
+17923,9807,8805,1.0,,9201
+17923,9807,8806,300000.0,,9001
+17923,9807,8807,700000.0,,9001
+17924,9807,8801,-45.07584493,,9110
+17924,9807,8802,168.23551083,,9110
+17924,9807,8805,1.0,,9201
+17924,9807,8806,300000.0,,9001
+17924,9807,8807,700000.0,,9001
+17925,9807,8801,-45.33494142,,9110
+17925,9807,8802,167.44199024,,9110
+17925,9807,8805,1.0,,9201
+17925,9807,8806,300000.0,,9001
+17925,9807,8807,700000.0,,9001
+17926,9807,8801,-45.48583078,,9110
+17926,9807,8802,170.37429426,,9110
+17926,9807,8805,1.0,,9201
+17926,9807,8806,300000.0,,9001
+17926,9807,8807,700000.0,,9001
+17927,9807,8801,-45.51414481,,9110
+17927,9807,8802,170.16573208,,9110
+17927,9807,8805,0.99996,,9201
+17927,9807,8806,300000.0,,9001
+17927,9807,8807,700000.0,,9001
+17928,9807,8801,-46.36000346,,9110
+17928,9807,8802,168.20343392,,9110
+17928,9807,8805,1.0,,9201
+17928,9807,8806,300002.66,,9001
+17928,9807,8807,699999.58,,9001
+17931,9807,8801,-36.5247,,9110
+17931,9807,8802,174.4551,,9110
+17931,9807,8805,0.9999,,9201
+17931,9807,8806,400000.0,,9001
+17931,9807,8807,800000.0,,9001
+17932,9807,8801,-37.454,,9110
+17932,9807,8802,176.2758,,9110
+17932,9807,8805,1.0,,9201
+17932,9807,8806,400000.0,,9001
+17932,9807,8807,800000.0,,9001
+17933,9807,8801,-38.3728,,9110
+17933,9807,8802,177.5308,,9110
+17933,9807,8805,1.0,,9201
+17933,9807,8806,400000.0,,9001
+17933,9807,8807,800000.0,,9001
+17934,9807,8801,-39.3903,,9110
+17934,9807,8802,176.4025,,9110
+17934,9807,8805,1.0,,9201
+17934,9807,8806,400000.0,,9001
+17934,9807,8807,800000.0,,9001
+17935,9807,8801,-39.0808,,9110
+17935,9807,8802,174.134,,9110
+17935,9807,8805,1.0,,9201
+17935,9807,8806,400000.0,,9001
+17935,9807,8807,800000.0,,9001
+17936,9807,8801,-39.3044,,9110
+17936,9807,8802,175.3824,,9110
+17936,9807,8805,1.0,,9201
+17936,9807,8806,400000.0,,9001
+17936,9807,8807,800000.0,,9001
+17937,9807,8801,-40.1431,,9110
+17937,9807,8802,175.2917,,9110
+17937,9807,8805,1.0,,9201
+17937,9807,8806,400000.0,,9001
+17937,9807,8807,800000.0,,9001
+17938,9807,8801,-40.5531,,9110
+17938,9807,8802,175.385,,9110
+17938,9807,8805,1.0,,9201
+17938,9807,8806,400000.0,,9001
+17938,9807,8807,800000.0,,9001
+17939,9807,8801,-41.1804,,9110
+17939,9807,8802,174.4635,,9110
+17939,9807,8805,1.0,,9201
+17939,9807,8806,400000.0,,9001
+17939,9807,8807,800000.0,,9001
+17940,9807,8801,-40.4253,,9110
+17940,9807,8802,172.4019,,9110
+17940,9807,8805,1.0,,9201
+17940,9807,8806,400000.0,,9001
+17940,9807,8807,800000.0,,9001
+17941,9807,8801,-41.1628,,9110
+17941,9807,8802,173.1757,,9110
+17941,9807,8805,1.0,,9201
+17941,9807,8806,400000.0,,9001
+17941,9807,8807,800000.0,,9001
+17942,9807,8801,-41.1723,,9110
+17942,9807,8802,172.0632,,9110
+17942,9807,8805,1.0,,9201
+17942,9807,8806,400000.0,,9001
+17942,9807,8807,800000.0,,9001
+17943,9807,8801,-41.4838,,9110
+17943,9807,8802,171.3452,,9110
+17943,9807,8805,1.0,,9201
+17943,9807,8806,400000.0,,9001
+17943,9807,8807,800000.0,,9001
+17944,9807,8801,-42.2001,,9110
+17944,9807,8802,171.3259,,9110
+17944,9807,8805,1.0,,9201
+17944,9807,8806,400000.0,,9001
+17944,9807,8807,800000.0,,9001
+17945,9807,8801,-42.412,,9110
+17945,9807,8802,173.0036,,9110
+17945,9807,8805,1.0,,9201
+17945,9807,8806,400000.0,,9001
+17945,9807,8807,800000.0,,9001
+17946,9807,8801,-41.324,,9110
+17946,9807,8802,173.4807,,9110
+17946,9807,8805,1.0,,9201
+17946,9807,8806,400000.0,,9001
+17946,9807,8807,800000.0,,9001
+17947,9807,8801,-42.531,,9110
+17947,9807,8802,170.5847,,9110
+17947,9807,8805,1.0,,9201
+17947,9807,8806,400000.0,,9001
+17947,9807,8807,800000.0,,9001
+17948,9807,8801,-43.0636,,9110
+17948,9807,8802,170.1539,,9110
+17948,9807,8805,1.0,,9201
+17948,9807,8806,400000.0,,9001
+17948,9807,8807,800000.0,,9001
+17949,9807,8801,-43.584,,9110
+17949,9807,8802,168.3622,,9110
+17949,9807,8805,1.0,,9201
+17949,9807,8806,400000.0,,9001
+17949,9807,8807,800000.0,,9001
+17950,9807,8801,-43.3526,,9110
+17950,9807,8802,172.4337,,9110
+17950,9807,8805,1.0,,9201
+17950,9807,8806,400000.0,,9001
+17950,9807,8807,800000.0,,9001
+17951,9807,8801,-43.4455,,9110
+17951,9807,8802,171.2138,,9110
+17951,9807,8805,1.0,,9201
+17951,9807,8806,400000.0,,9001
+17951,9807,8807,800000.0,,9001
+17952,9807,8801,-44.2407,,9110
+17952,9807,8802,171.0326,,9110
+17952,9807,8805,1.0,,9201
+17952,9807,8806,400000.0,,9001
+17952,9807,8807,800000.0,,9001
+17953,9807,8801,-44.4406,,9110
+17953,9807,8802,169.2803,,9110
+17953,9807,8805,1.0,,9201
+17953,9807,8806,400000.0,,9001
+17953,9807,8807,800000.0,,9001
+17954,9807,8801,-45.0758,,9110
+17954,9807,8802,168.2355,,9110
+17954,9807,8805,1.0,,9201
+17954,9807,8806,400000.0,,9001
+17954,9807,8807,800000.0,,9001
+17955,9807,8801,-45.3349,,9110
+17955,9807,8802,167.4419,,9110
+17955,9807,8805,1.0,,9201
+17955,9807,8806,400000.0,,9001
+17955,9807,8807,800000.0,,9001
+17956,9807,8801,-45.4858,,9110
+17956,9807,8802,170.3742,,9110
+17956,9807,8805,1.0,,9201
+17956,9807,8806,400000.0,,9001
+17956,9807,8807,800000.0,,9001
+17957,9807,8801,-45.5141,,9110
+17957,9807,8802,170.1657,,9110
+17957,9807,8805,0.99996,,9201
+17957,9807,8806,400000.0,,9001
+17957,9807,8807,800000.0,,9001
+17958,9807,8801,-46.36,,9110
+17958,9807,8802,168.2034,,9110
+17958,9807,8805,1.0,,9201
+17958,9807,8806,400000.0,,9001
+17958,9807,8807,800000.0,,9001
+18011,9801,8801,40.0,,9105
+18011,9801,8802,3.0,,9105
+18011,9801,8805,0.999625544,,9201
+18011,9801,8806,500000.0,,9001
+18011,9801,8807,300000.0,,9001
+18012,9801,8801,37.0,,9105
+18012,9801,8802,3.0,,9105
+18012,9801,8805,0.999625769,,9201
+18012,9801,8806,500000.0,,9001
+18012,9801,8807,300000.0,,9001
+18021,9801,8801,40.0,,9105
+18021,9801,8802,3.0,,9105
+18021,9801,8805,0.999625544,,9201
+18021,9801,8806,500135.0,,9001
+18021,9801,8807,300090.0,,9001
+18022,9801,8801,37.0,,9105
+18022,9801,8802,3.0,,9105
+18022,9801,8805,0.999625769,,9201
+18022,9801,8806,500135.0,,9001
+18022,9801,8807,300090.0,,9001
+18031,9807,8801,-90.0,,9102
+18031,9807,8802,-72.0,,9102
+18031,9807,8805,1.0,,9201
+18031,9807,8806,1500000.0,,9001
+18031,9807,8807,0.0,,9001
+18032,9807,8801,-90.0,,9102
+18032,9807,8802,-69.0,,9102
+18032,9807,8805,1.0,,9201
+18032,9807,8806,2500000.0,,9001
+18032,9807,8807,0.0,,9001
+18033,9807,8801,-90.0,,9102
+18033,9807,8802,-66.0,,9102
+18033,9807,8805,1.0,,9201
+18033,9807,8806,3500000.0,,9001
+18033,9807,8807,0.0,,9001
+18034,9807,8801,-90.0,,9102
+18034,9807,8802,-63.0,,9102
+18034,9807,8805,1.0,,9201
+18034,9807,8806,4500000.0,,9001
+18034,9807,8807,0.0,,9001
+18035,9807,8801,-90.0,,9102
+18035,9807,8802,-60.0,,9102
+18035,9807,8805,1.0,,9201
+18035,9807,8806,5500000.0,,9001
+18035,9807,8807,0.0,,9001
+18036,9807,8801,-90.0,,9102
+18036,9807,8802,-57.0,,9102
+18036,9807,8805,1.0,,9201
+18036,9807,8806,6500000.0,,9001
+18036,9807,8807,0.0,,9001
+18037,9807,8801,-90.0,,9102
+18037,9807,8802,-54.0,,9102
+18037,9807,8805,1.0,,9201
+18037,9807,8806,7500000.0,,9001
+18037,9807,8807,0.0,,9001
+18041,9807,8801,0.0,,9102
+18041,9807,8802,28.0,,9102
+18041,9807,8805,1.0,,9201
+18041,9807,8806,0.0,,9001
+18041,9807,8807,0.0,,9001
+18042,9807,8801,0.0,,9102
+18042,9807,8802,31.0,,9102
+18042,9807,8805,1.0,,9201
+18042,9807,8806,0.0,,9001
+18042,9807,8807,0.0,,9001
+18043,9807,8801,0.0,,9102
+18043,9807,8802,34.0,,9102
+18043,9807,8805,1.0,,9201
+18043,9807,8806,0.0,,9001
+18043,9807,8807,0.0,,9001
+18044,9807,8801,0.0,,9110
+18044,9807,8802,10.2,,9110
+18044,9807,8805,1.0,,9201
+18044,9807,8806,150000.0,,9001
+18044,9807,8807,0.0,,9001
+18045,9807,8801,0.0,,9110
+18045,9807,8802,13.2,,9110
+18045,9807,8805,1.0,,9201
+18045,9807,8806,450000.0,,9001
+18045,9807,8807,0.0,,9001
+18046,9807,8801,0.0,,9110
+18046,9807,8802,16.2,,9110
+18046,9807,8805,1.0,,9201
+18046,9807,8806,750000.0,,9001
+18046,9807,8807,0.0,,9001
+18051,9807,8801,4.355657,,9110
+18051,9807,8802,-77.04513,,9110
+18051,9807,8805,1.0,,9201
+18051,9807,8806,1000000.0,,9001
+18051,9807,8807,1000000.0,,9001
+18052,9807,8801,4.355657,,9110
+18052,9807,8802,-74.04513,,9110
+18052,9807,8805,1.0,,9201
+18052,9807,8806,1000000.0,,9001
+18052,9807,8807,1000000.0,,9001
+18053,9807,8801,4.355657,,9110
+18053,9807,8802,-71.04513,,9110
+18053,9807,8805,1.0,,9201
+18053,9807,8806,1000000.0,,9001
+18053,9807,8807,1000000.0,,9001
+18054,9807,8801,4.355657,,9110
+18054,9807,8802,-68.04513,,9110
+18054,9807,8805,1.0,,9201
+18054,9807,8806,1000000.0,,9001
+18054,9807,8807,1000000.0,,9001
+18061,9801,8801,22.21,,9110
+18061,9801,8802,-81.0,,9110
+18061,9801,8805,0.99993602,,9201
+18061,9801,8806,500000.0,,9001
+18061,9801,8807,280296.016,,9001
+18062,9801,8801,20.43,,9110
+18062,9801,8802,-76.5,,9110
+18062,9801,8805,0.99994848,,9201
+18062,9801,8806,500000.0,,9001
+18062,9801,8807,229126.939,,9001
+18071,9807,8801,30.0,,9102
+18071,9807,8802,35.0,,9102
+18071,9807,8805,1.0,,9201
+18071,9807,8806,300000.0,,9001
+18071,9807,8807,1100000.0,,9001
+18072,9807,8801,30.0,,9102
+18072,9807,8802,31.0,,9102
+18072,9807,8805,1.0,,9201
+18072,9807,8806,615000.0,,9001
+18072,9807,8807,810000.0,,9001
+18073,9807,8801,30.0,,9102
+18073,9807,8802,27.0,,9102
+18073,9807,8805,1.0,,9201
+18073,9807,8806,700000.0,,9001
+18073,9807,8807,200000.0,,9001
+18074,9807,8801,30.0,,9102
+18074,9807,8802,27.0,,9102
+18074,9807,8805,1.0,,9201
+18074,9807,8806,700000.0,,9001
+18074,9807,8807,1200000.0,,9001
+18081,9801,8801,55.0,,9105
+18081,9801,8802,0.0,,9105
+18081,9801,8805,0.999877341,,9201
+18081,9801,8806,600000.0,,9001
+18081,9801,8807,1200000.0,,9001
+18082,9801,8801,52.0,,9105
+18082,9801,8802,0.0,,9105
+18082,9801,8805,0.99987742,,9201
+18082,9801,8806,600000.0,,9001
+18082,9801,8807,2200000.0,,9001
+18083,9801,8801,49.0,,9105
+18083,9801,8802,0.0,,9105
+18083,9801,8805,0.999877499,,9201
+18083,9801,8806,600000.0,,9001
+18083,9801,8807,3200000.0,,9001
+18084,9801,8801,46.85,,9105
+18084,9801,8802,0.0,,9105
+18084,9801,8805,0.99994471,,9201
+18084,9801,8806,234.358,,9001
+18084,9801,8807,4185861.369,,9001
+18085,9802,8821,46.3,,9110
+18085,9802,8822,3.0,,9110
+18085,9802,8823,49.0,,9110
+18085,9802,8824,44.0,,9110
+18085,9802,8826,700000.0,,9001
+18085,9802,8827,6600000.0,,9001
+18086,9801,8801,46.48,,9110
+18086,9801,8802,2.2014025,,9110
+18086,9801,8805,0.99987742,,9201
+18086,9801,8806,600000.0,,9001
+18086,9801,8807,2200000.0,,9001
+18091,9801,8801,55.0,,9105
+18091,9801,8802,0.0,,9105
+18091,9801,8805,0.999877341,,9201
+18091,9801,8806,600000.0,,9001
+18091,9801,8807,200000.0,,9001
+18092,9801,8801,52.0,,9105
+18092,9801,8802,0.0,,9105
+18092,9801,8805,0.99987742,,9201
+18092,9801,8806,600000.0,,9001
+18092,9801,8807,200000.0,,9001
+18093,9801,8801,49.0,,9105
+18093,9801,8802,0.0,,9105
+18093,9801,8805,0.999877499,,9201
+18093,9801,8806,600000.0,,9001
+18093,9801,8807,200000.0,,9001
+18094,9801,8801,46.85,,9105
+18094,9801,8802,0.0,,9105
+18094,9801,8805,0.99994471,,9201
+18094,9801,8806,234.358,,9001
+18094,9801,8807,185861.369,,9001
+18110,9801,8801,39.3,,9110
+18110,9801,8802,68.0,,9110
+18110,9801,8805,0.99846154,,9201
+18110,9801,8806,2355500.0,,9084
+18110,9801,8807,2590000.0,,9084
+18111,9801,8801,32.3,,9110
+18111,9801,8802,68.0,,9110
+18111,9801,8805,0.99878641,,9201
+18111,9801,8806,3000000.0,,9084
+18111,9801,8807,1000000.0,,9084
+18112,9801,8801,26.0,,9102
+18112,9801,8802,74.0,,9102
+18112,9801,8805,0.99878641,,9201
+18112,9801,8806,3000000.0,,9084
+18112,9801,8807,1000000.0,,9084
+18113,9801,8801,26.0,,9102
+18113,9801,8802,90.0,,9102
+18113,9801,8805,0.99878641,,9201
+18113,9801,8806,3000000.0,,9084
+18113,9801,8807,1000000.0,,9084
+18114,9801,8801,19.0,,9102
+18114,9801,8802,80.0,,9102
+18114,9801,8805,0.99878641,,9201
+18114,9801,8806,3000000.0,,9084
+18114,9801,8807,1000000.0,,9084
+18115,9801,8801,19.0,,9102
+18115,9801,8802,100.0,,9102
+18115,9801,8805,0.99878641,,9201
+18115,9801,8806,3000000.0,,9084
+18115,9801,8807,1000000.0,,9084
+18116,9801,8801,12.0,,9102
+18116,9801,8802,80.0,,9102
+18116,9801,8805,0.99878641,,9201
+18116,9801,8806,3000000.0,,9084
+18116,9801,8807,1000000.0,,9084
+18117,9801,8801,12.0,,9102
+18117,9801,8802,100.0,,9102
+18117,9801,8805,0.99878641,,9201
+18117,9801,8806,3000000.0,,9084
+18117,9801,8807,1000000.0,,9084
+18121,9807,8801,0.0,,9102
+18121,9807,8802,9.0,,9102
+18121,9807,8805,0.9996,,9201
+18121,9807,8806,1500000.0,,9001
+18121,9807,8807,0.0,,9001
+18122,9807,8801,0.0,,9102
+18122,9807,8802,15.0,,9102
+18122,9807,8805,0.9996,,9201
+18122,9807,8806,2520000.0,,9001
+18122,9807,8807,0.0,,9001
+18131,9801,8801,37.0,,9105
+18131,9801,8802,-6.0,,9105
+18131,9801,8805,0.999625769,,9201
+18131,9801,8806,500000.0,,9001
+18131,9801,8807,300000.0,,9001
+18132,9801,8801,33.0,,9105
+18132,9801,8802,-6.0,,9105
+18132,9801,8805,0.999615596,,9201
+18132,9801,8806,500000.0,,9001
+18132,9801,8807,300000.0,,9001
+18133,9801,8801,29.0,,9105
+18133,9801,8802,-6.0,,9105
+18133,9801,8805,0.9996,,9201
+18133,9801,8806,1200000.0,,9001
+18133,9801,8807,400000.0,,9001
+18141,9807,8801,-39.0,,9110
+18141,9807,8802,175.3,,9110
+18141,9807,8805,1.0,,9201
+18141,9807,8806,300000.0,,9040
+18141,9807,8807,400000.0,,9040
+18142,9807,8801,-44.0,,9110
+18142,9807,8802,171.3,,9110
+18142,9807,8805,1.0,,9201
+18142,9807,8806,500000.0,,9040
+18142,9807,8807,500000.0,,9040
+18151,9807,8801,4.0,,9110
+18151,9807,8802,4.3,,9110
+18151,9807,8805,0.99975,,9201
+18151,9807,8806,230738.26,,9001
+18151,9807,8807,0.0,,9001
+18152,9807,8801,4.0,,9110
+18152,9807,8802,8.3,,9110
+18152,9807,8805,0.99975,,9201
+18152,9807,8806,670553.98,,9001
+18152,9807,8807,0.0,,9001
+18153,9807,8801,4.0,,9110
+18153,9807,8802,12.3,,9110
+18153,9807,8805,0.99975,,9201
+18153,9807,8806,1110369.7,,9001
+18153,9807,8807,0.0,,9001
+18161,9807,8801,-6.0,,9110
+18161,9807,8802,-80.3,,9110
+18161,9807,8805,0.99983008,,9201
+18161,9807,8806,222000.0,,9001
+18161,9807,8807,1426834.743,,9001
+18162,9807,8801,-9.3,,9110
+18162,9807,8802,-76.0,,9110
+18162,9807,8805,0.99932994,,9201
+18162,9807,8806,720000.0,,9001
+18162,9807,8807,1039979.159,,9001
+18163,9807,8801,-9.3,,9110
+18163,9807,8802,-70.3,,9110
+18163,9807,8805,0.99952992,,9201
+18163,9807,8806,1324000.0,,9001
+18163,9807,8807,1040084.558,,9001
+18171,9807,8801,0.0,,9102
+18171,9807,8802,117.0,,9102
+18171,9807,8805,0.99995,,9201
+18171,9807,8806,500000.0,,9001
+18171,9807,8807,0.0,,9001
+18172,9807,8801,0.0,,9102
+18172,9807,8802,119.0,,9102
+18172,9807,8805,0.99995,,9201
+18172,9807,8806,500000.0,,9001
+18172,9807,8807,0.0,,9001
+18173,9807,8801,0.0,,9102
+18173,9807,8802,121.0,,9102
+18173,9807,8805,0.99995,,9201
+18173,9807,8806,500000.0,,9001
+18173,9807,8807,0.0,,9001
+18174,9807,8801,0.0,,9102
+18174,9807,8802,123.0,,9102
+18174,9807,8805,0.99995,,9201
+18174,9807,8806,500000.0,,9001
+18174,9807,8807,0.0,,9001
+18175,9807,8801,0.0,,9102
+18175,9807,8802,125.0,,9102
+18175,9807,8805,0.99995,,9201
+18175,9807,8806,500000.0,,9001
+18175,9807,8807,0.0,,9001
+18181,9801,8801,40.0,,9105
+18181,9801,8802,11.0,,9105
+18181,9801,8805,0.999625544,,9201
+18181,9801,8806,500000.0,,9001
+18181,9801,8807,300000.0,,9001
+18182,9801,8801,37.0,,9105
+18182,9801,8802,11.0,,9105
+18182,9801,8805,0.999625769,,9201
+18182,9801,8806,500000.0,,9001
+18182,9801,8807,300000.0,,9001
+18191,9807,8801,0.0,,9102
+18191,9807,8802,21.0,,9102
+18191,9807,8805,1.0,,9201
+18191,9807,8806,1500000.0,,9001
+18191,9807,8807,0.0,,9001
+18192,9807,8801,0.0,,9102
+18192,9807,8802,24.0,,9102
+18192,9807,8805,1.0,,9201
+18192,9807,8806,2500000.0,,9001
+18192,9807,8807,0.0,,9001
+18193,9807,8801,0.0,,9102
+18193,9807,8802,27.0,,9102
+18193,9807,8805,1.0,,9201
+18193,9807,8806,3500000.0,,9001
+18193,9807,8807,0.0,,9001
+18194,9807,8801,0.0,,9102
+18194,9807,8802,30.0,,9102
+18194,9807,8805,1.0,,9201
+18194,9807,8806,4500000.0,,9001
+18194,9807,8807,0.0,,9001
+18201,9806,8801,31.4402749,,9110
+18201,9806,8802,35.124349,,9110
+18201,9806,8806,170251.555,,9001
+18201,9806,8807,126867.909,,9001
+18202,9807,8801,31.4402749,,9110
+18202,9807,8802,35.124349,,9110
+18202,9807,8805,1.0,,9201
+18202,9807,8806,170251.555,,9001
+18202,9807,8807,1126867.909,,9001
+18203,9806,8801,31.4402749,,9110
+18203,9806,8802,35.124349,,9110
+18203,9806,8806,170251.555,,9001
+18203,9806,8807,1126867.909,,9001
+18204,9807,8801,31.4403817,,9110
+18204,9807,8802,35.1216261,,9110
+18204,9807,8805,1.0000067,,9201
+18204,9807,8806,219529.584,,9001
+18204,9807,8807,626907.39,,9001
+18211,9801,8801,16.49,,9110
+18211,9801,8802,-90.2,,9110
+18211,9801,8805,0.99992226,,9201
+18211,9801,8806,500000.0,,9001
+18211,9801,8807,292209.579,,9001
+18212,9801,8801,14.54,,9110
+18212,9801,8802,-90.2,,9110
+18212,9801,8805,0.99989906,,9201
+18212,9801,8806,500000.0,,9001
+18212,9801,8807,325992.681,,9001
+18221,9807,8801,58.0,,9110
+18221,9807,8802,-4.4,,9110
+18221,9807,8805,1.0,,9201
+18221,9807,8806,0.0,,9001
+18221,9807,8807,0.0,,9001
+18222,9807,8801,58.0,,9110
+18222,9807,8802,-2.2,,9110
+18222,9807,8805,1.0,,9201
+18222,9807,8806,0.0,,9001
+18222,9807,8807,0.0,,9001
+18223,9807,8801,58.0,,9110
+18223,9807,8802,0.0,,9110
+18223,9807,8805,1.0,,9201
+18223,9807,8806,0.0,,9001
+18223,9807,8807,0.0,,9001
+18224,9807,8801,58.0,,9110
+18224,9807,8802,2.3,,9110
+18224,9807,8805,1.0,,9201
+18224,9807,8806,0.0,,9001
+18224,9807,8807,0.0,,9001
+18225,9807,8801,58.0,,9110
+18225,9807,8802,6.1,,9110
+18225,9807,8805,1.0,,9201
+18225,9807,8806,0.0,,9001
+18225,9807,8807,0.0,,9001
+18226,9807,8801,58.0,,9110
+18226,9807,8802,10.1,,9110
+18226,9807,8805,1.0,,9201
+18226,9807,8806,0.0,,9001
+18226,9807,8807,0.0,,9001
+18227,9807,8801,58.0,,9110
+18227,9807,8802,14.1,,9110
+18227,9807,8805,1.0,,9201
+18227,9807,8806,0.0,,9001
+18227,9807,8807,0.0,,9001
+18228,9807,8801,58.0,,9110
+18228,9807,8802,18.2,,9110
+18228,9807,8805,1.0,,9201
+18228,9807,8806,0.0,,9001
+18228,9807,8807,0.0,,9001
+18231,9801,8801,32.3,,9110
+18231,9801,8802,68.0,,9110
+18231,9801,8805,0.99878641,,9201
+18231,9801,8806,2743195.5,,9001
+18231,9801,8807,914398.5,,9001
+18232,9801,8801,26.0,,9102
+18232,9801,8802,74.0,,9102
+18232,9801,8805,0.99878641,,9201
+18232,9801,8806,2743195.5,,9001
+18232,9801,8807,914398.5,,9001
+18233,9801,8801,19.0,,9102
+18233,9801,8802,80.0,,9102
+18233,9801,8805,0.99878641,,9201
+18233,9801,8806,2743195.5,,9001
+18233,9801,8807,914398.5,,9001
+18234,9801,8801,12.0,,9102
+18234,9801,8802,80.0,,9102
+18234,9801,8805,0.99878641,,9201
+18234,9801,8806,2743195.5,,9001
+18234,9801,8807,914398.5,,9001
+18235,9801,8801,26.0,,9102
+18235,9801,8802,90.0,,9102
+18235,9801,8805,0.99878641,,9201
+18235,9801,8806,2743195.5,,9001
+18235,9801,8807,914398.5,,9001
+18236,9801,8801,32.3,,9110
+18236,9801,8802,68.0,,9110
+18236,9801,8805,0.99878641,,9201
+18236,9801,8806,2743196.4,,9001
+18236,9801,8807,914398.8,,9001
+18237,9801,8801,26.0,,9102
+18237,9801,8802,74.0,,9102
+18237,9801,8805,0.99878641,,9201
+18237,9801,8806,2743196.4,,9001
+18237,9801,8807,914398.8,,9001
+18238,9801,8801,26.0,,9102
+18238,9801,8802,90.0,,9102
+18238,9801,8805,0.99878641,,9201
+18238,9801,8806,2743185.69,,9001
+18238,9801,8807,914395.23,,9001
+18240,9807,8801,0.0,,9102
+18240,9807,8802,9.0,,9102
+18240,9807,8805,0.9999,,9201
+18240,9807,8806,200000.0,,9001
+18240,9807,8807,0.0,,9001
+18241,9807,8801,0.0,,9102
+18241,9807,8802,11.0,,9102
+18241,9807,8805,0.9999,,9201
+18241,9807,8806,200000.0,,9001
+18241,9807,8807,0.0,,9001
+18242,9807,8801,0.0,,9102
+18242,9807,8802,13.0,,9102
+18242,9807,8805,0.9999,,9201
+18242,9807,8806,200000.0,,9001
+18242,9807,8807,0.0,,9001
+18243,9807,8801,0.0,,9102
+18243,9807,8802,15.0,,9102
+18243,9807,8805,0.9999,,9201
+18243,9807,8806,200000.0,,9001
+18243,9807,8807,0.0,,9001
+18244,9807,8801,0.0,,9102
+18244,9807,8802,17.0,,9102
+18244,9807,8805,0.9999,,9201
+18244,9807,8806,200000.0,,9001
+18244,9807,8807,0.0,,9001
+18245,9807,8801,0.0,,9102
+18245,9807,8802,19.0,,9102
+18245,9807,8805,0.9999,,9201
+18245,9807,8806,200000.0,,9001
+18245,9807,8807,0.0,,9001
+18246,9807,8801,0.0,,9102
+18246,9807,8802,21.0,,9102
+18246,9807,8805,0.9999,,9201
+18246,9807,8806,200000.0,,9001
+18246,9807,8807,0.0,,9001
+18247,9807,8801,0.0,,9102
+18247,9807,8802,23.0,,9102
+18247,9807,8805,0.9999,,9201
+18247,9807,8806,200000.0,,9001
+18247,9807,8807,0.0,,9001
+18248,9807,8801,0.0,,9102
+18248,9807,8802,25.0,,9102
+18248,9807,8805,0.9999,,9201
+18248,9807,8806,200000.0,,9001
+18248,9807,8807,0.0,,9001
+18251,9807,8801,38.0,,9102
+18251,9807,8802,129.0,,9102
+18251,9807,8805,1.0,,9201
+18251,9807,8806,200000.0,,9001
+18251,9807,8807,500000.0,,9001
+18252,9807,8801,38.0,,9102
+18252,9807,8802,127.0,,9102
+18252,9807,8805,1.0,,9201
+18252,9807,8806,200000.0,,9001
+18252,9807,8807,500000.0,,9001
+18253,9807,8801,38.0,,9102
+18253,9807,8802,125.0,,9102
+18253,9807,8805,1.0,,9201
+18253,9807,8806,200000.0,,9001
+18253,9807,8807,500000.0,,9001
+18260,9801,8801,10.1,,9110
+18260,9801,8802,-71.3620224,,9110
+18260,9801,8805,1.0,,9201
+18260,9801,8806,0.0,,9001
+18260,9801,8807,-52684.972,,9001
+18261,9801,8801,10.1,,9110
+18261,9801,8802,-71.3620224,,9110
+18261,9801,8805,1.0,,9201
+18261,9801,8806,200000.0,,9001
+18261,9801,8807,147315.028,,9001
+18262,9801,8801,10.1,,9110
+18262,9801,8802,-71.3620224,,9110
+18262,9801,8805,1.0,,9201
+18262,9801,8806,500000.0,,9001
+18262,9801,8807,447315.028,,9001
+18263,9801,8801,10.1,,9110
+18263,9801,8802,-71.3620224,,9110
+18263,9801,8805,1.0,,9201
+18263,9801,8806,-17044.0,,9001
+18263,9801,8807,-23139.97,,9001
+18275,9807,8801,0.0,,9102
+18275,9807,8802,15.0,,9102
+18275,9807,8805,0.9999,,9201
+18275,9807,8806,5500000.0,,9001
+18275,9807,8807,0.0,,9001
+18276,9807,8801,0.0,,9102
+18276,9807,8802,18.0,,9102
+18276,9807,8805,0.9999,,9201
+18276,9807,8806,6500000.0,,9001
+18276,9807,8807,0.0,,9001
+18277,9807,8801,0.0,,9102
+18277,9807,8802,21.0,,9102
+18277,9807,8805,0.9999,,9201
+18277,9807,8806,7500000.0,,9001
+18277,9807,8807,0.0,,9001
+18278,9807,8801,0.0,,9102
+18278,9807,8802,24.0,,9102
+18278,9807,8805,0.9999,,9201
+18278,9807,8806,8500000.0,,9001
+18278,9807,8807,0.0,,9001
+18281,9809,8801,50.373,,9110
+18281,9809,8802,21.05,,9110
+18281,9809,8805,0.9998,,9201
+18281,9809,8806,4637000.0,,9001
+18281,9809,8807,5647000.0,,9001
+18282,9809,8801,53.0007,,9110
+18282,9809,8802,21.301,,9110
+18282,9809,8805,0.9998,,9201
+18282,9809,8806,4603000.0,,9001
+18282,9809,8807,5806000.0,,9001
+18283,9809,8801,53.35,,9110
+18283,9809,8802,17.003,,9110
+18283,9809,8805,0.9998,,9201
+18283,9809,8806,3501000.0,,9001
+18283,9809,8807,5999000.0,,9001
+18284,9809,8801,51.4015,,9110
+18284,9809,8802,16.402,,9110
+18284,9809,8805,0.9998,,9201
+18284,9809,8806,3703000.0,,9001
+18284,9809,8807,5627000.0,,9001
+18285,9807,8801,0.0,,9110
+18285,9807,8802,18.573,,9110
+18285,9807,8805,0.999983,,9201
+18285,9807,8806,237000.0,,9001
+18285,9807,8807,-4700000.0,,9001
+18300,9807,8801,0.0,,9102
+18300,9807,8802,19.0,,9102
+18300,9807,8805,0.9993,,9201
+18300,9807,8806,500000.0,,9001
+18300,9807,8807,-5300000.0,,9001
+18305,9807,8801,0.0,,9102
+18305,9807,8802,15.0,,9102
+18305,9807,8805,0.999923,,9201
+18305,9807,8806,5500000.0,,9001
+18305,9807,8807,0.0,,9001
+18306,9807,8801,0.0,,9102
+18306,9807,8802,18.0,,9102
+18306,9807,8805,0.999923,,9201
+18306,9807,8806,6500000.0,,9001
+18306,9807,8807,0.0,,9001
+18307,9807,8801,0.0,,9102
+18307,9807,8802,21.0,,9102
+18307,9807,8805,0.999923,,9201
+18307,9807,8806,7500000.0,,9001
+18307,9807,8807,0.0,,9001
+18308,9807,8801,0.0,,9102
+18308,9807,8802,24.0,,9102
+18308,9807,8805,0.999923,,9201
+18308,9807,8806,8500000.0,,9001
+18308,9807,8807,0.0,,9001
+18401,9807,8801,0.0,,9110
+18401,9807,8802,9.3,,9110
+18401,9807,8805,0.99995,,9201
+18401,9807,8806,200000.0,,9001
+18401,9807,8807,0.0,,9001
+18402,9807,8801,0.0,,9102
+18402,9807,8802,12.0,,9102
+18402,9807,8805,0.99995,,9201
+18402,9807,8806,500000.0,,9001
+18402,9807,8807,0.0,,9001
+18403,9807,8801,0.0,,9102
+18403,9807,8802,15.0,,9102
+18403,9807,8805,1.0,,9201
+18403,9807,8806,900000.0,,9001
+18403,9807,8807,0.0,,9001
+18411,9807,8801,0.0,,9110
+18411,9807,8802,-13.3,,9110
+18411,9807,8805,0.999,,9201
+18411,9807,8806,1000000.0,,9001
+18411,9807,8807,1000000.0,,9001
+18412,9807,8801,0.0,,9110
+18412,9807,8802,-6.3,,9110
+18412,9807,8805,0.999,,9201
+18412,9807,8806,1000000.0,,9001
+18412,9807,8807,1000000.0,,9001
+18413,9807,8801,0.0,,9110
+18413,9807,8802,0.3,,9110
+18413,9807,8805,0.999,,9201
+18413,9807,8806,1000000.0,,9001
+18413,9807,8807,1000000.0,,9001
+18414,9807,8801,0.0,,9110
+18414,9807,8802,7.3,,9110
+18414,9807,8805,0.999,,9201
+18414,9807,8806,1000000.0,,9001
+18414,9807,8807,1000000.0,,9001
+18415,9807,8801,0.0,,9110
+18415,9807,8802,10.3,,9110
+18415,9807,8805,0.999,,9201
+18415,9807,8806,1000000.0,,9001
+18415,9807,8807,1000000.0,,9001
+18416,9807,8801,0.0,,9110
+18416,9807,8802,17.4,,9110
+18416,9807,8805,0.999,,9201
+18416,9807,8806,1000000.0,,9001
+18416,9807,8807,1000000.0,,9001
+18417,9807,8801,0.0,,9110
+18417,9807,8802,24.3,,9110
+18417,9807,8805,0.999,,9201
+18417,9807,8806,1000000.0,,9001
+18417,9807,8807,1000000.0,,9001
+18421,9826,8801,82.3,,9110
+18421,9826,8802,-40.0,,9110
+18421,9826,8805,1.0,,9201
+18421,9826,8806,0.0,,9001
+18421,9826,8807,0.0,,9001
+18422,9826,8801,79.3,,9110
+18422,9826,8802,-24.0,,9110
+18422,9826,8805,1.0,,9201
+18422,9826,8806,0.0,,9001
+18422,9826,8807,0.0,,9001
+18423,9826,8801,76.3,,9110
+18423,9826,8802,-20.0,,9110
+18423,9826,8805,1.0,,9201
+18423,9826,8806,0.0,,9001
+18423,9826,8807,0.0,,9001
+18424,9826,8801,73.3,,9110
+18424,9826,8802,-24.0,,9110
+18424,9826,8805,1.0,,9201
+18424,9826,8806,0.0,,9001
+18424,9826,8807,0.0,,9001
+18425,9826,8801,70.3,,9110
+18425,9826,8802,-24.0,,9110
+18425,9826,8805,1.0,,9201
+18425,9826,8806,0.0,,9001
+18425,9826,8807,0.0,,9001
+18426,9826,8801,67.3,,9110
+18426,9826,8802,-32.0,,9110
+18426,9826,8805,1.0,,9201
+18426,9826,8806,0.0,,9001
+18426,9826,8807,0.0,,9001
+18427,9826,8801,64.3,,9110
+18427,9826,8802,-40.0,,9110
+18427,9826,8805,1.0,,9201
+18427,9826,8806,0.0,,9001
+18427,9826,8807,0.0,,9001
+18428,9826,8801,61.3,,9110
+18428,9826,8802,-48.0,,9110
+18428,9826,8805,1.0,,9201
+18428,9826,8806,0.0,,9001
+18428,9826,8807,0.0,,9001
+18432,9826,8801,79.3,,9110
+18432,9826,8802,-64.0,,9110
+18432,9826,8805,1.0,,9201
+18432,9826,8806,0.0,,9001
+18432,9826,8807,0.0,,9001
+18433,9826,8801,76.3,,9110
+18433,9826,8802,-64.0,,9110
+18433,9826,8805,1.0,,9201
+18433,9826,8806,0.0,,9001
+18433,9826,8807,0.0,,9001
+18434,9826,8801,73.3,,9110
+18434,9826,8802,-52.0,,9110
+18434,9826,8805,1.0,,9201
+18434,9826,8806,0.0,,9001
+18434,9826,8807,0.0,,9001
+18435,9826,8801,70.3,,9110
+18435,9826,8802,-52.0,,9110
+18435,9826,8805,1.0,,9201
+18435,9826,8806,0.0,,9001
+18435,9826,8807,0.0,,9001
+18436,9826,8801,67.3,,9110
+18436,9826,8802,-52.0,,9110
+18436,9826,8805,1.0,,9201
+18436,9826,8806,0.0,,9001
+18436,9826,8807,0.0,,9001
+18437,9826,8801,64.3,,9110
+18437,9826,8802,-52.0,,9110
+18437,9826,8805,1.0,,9201
+18437,9826,8806,0.0,,9001
+18437,9826,8807,0.0,,9001
+18441,9807,8801,0.07,,9110
+18441,9807,8802,41.32,,9110
+18441,9807,8805,1.0,,9003
+18441,9807,8806,1300000.0,,9001
+18441,9807,8807,0.0,,9001
+18442,9807,8801,0.07,,9110
+18442,9807,8802,44.32,,9110
+18442,9807,8805,1.0,,9003
+18442,9807,8806,2300000.0,,9001
+18442,9807,8807,0.0,,9001
+18443,9807,8801,0.07,,9110
+18443,9807,8802,47.32,,9110
+18443,9807,8805,1.0,,9201
+18443,9807,8806,3300000.0,,9001
+18443,9807,8807,0.0,,9001
+18444,9807,8801,0.07,,9110
+18444,9807,8802,50.32,,9110
+18444,9807,8805,1.0,,9201
+18444,9807,8806,4300000.0,,9001
+18444,9807,8807,0.0,,9001
+18446,9807,8801,0.08,,9110
+18446,9807,8802,50.46,,9110
+18446,9807,8805,1.0,,9201
+18446,9807,8806,2300000.0,,9001
+18446,9807,8807,0.0,,9001
+18447,9807,8801,0.08,,9110
+18447,9807,8802,53.46,,9110
+18447,9807,8805,1.0,,9201
+18447,9807,8806,3300000.0,,9001
+18447,9807,8807,0.0,,9001
+18448,9807,8801,0.08,,9110
+18448,9807,8802,56.46,,9110
+18448,9807,8805,1.0,,9201
+18448,9807,8806,4300000.0,,9001
+18448,9807,8807,0.0,,9001
+19900,9807,8801,0.0,,9102
+19900,9807,8802,51.0,,9102
+19900,9807,8805,0.9996,,9201
+19900,9807,8806,500000.0,,9001
+19900,9807,8807,0.0,,9001
+19901,9802,8821,90.0,,9110
+19901,9802,8822,0.0,,9110
+19901,9802,8823,49.5,,9110
+19901,9802,8824,51.1,,9110
+19901,9802,8826,150000.0,,9001
+19901,9802,8827,5400000.0,,9001
+19902,9803,8821,90.0,,9110
+19902,9803,8822,4.2124983,,9110
+19902,9803,8823,49.5,,9110
+19902,9803,8824,51.1,,9110
+19902,9803,8826,150000.01256,,9001
+19902,9803,8827,5400088.4378,,9001
+19903,9801,8801,55.0,,9105
+19903,9801,8802,6.0,,9105
+19903,9801,8805,0.99950908,,9201
+19903,9801,8806,500000.0,,9001
+19903,9801,8807,300000.0,,9001
+19904,9807,8801,4.4,,9110
+19904,9807,8802,-1.0,,9110
+19904,9807,8805,0.99975,,9201
+19904,9807,8806,274319.51,,9001
+19904,9807,8807,0.0,,9001
+19905,9804,8801,0.0,,9102
+19905,9804,8802,110.0,,9102
+19905,9804,8805,0.997,,9201
+19905,9804,8806,3900000.0,,9001
+19905,9804,8807,900000.0,,9001
+19906,9801,8801,32.3,,9110
+19906,9801,8802,45.0,,9110
+19906,9801,8805,0.9987864078,,9201
+19906,9801,8806,1500000.0,,9001
+19906,9801,8807,1166200.0,,9001
+19907,9807,8801,29.0134566,,9110
+19907,9807,8802,46.3,,9110
+19907,9807,8805,0.9994,,9201
+19907,9807,8806,800000.0,,9001
+19907,9807,8807,0.0,,9001
+19908,9807,8801,53.3,,9110
+19908,9807,8802,-8.0,,9110
+19908,9807,8805,1.000035,,9201
+19908,9807,8806,200000.0,,9001
+19908,9807,8807,250000.0,,9001
+19909,9801,8801,18.0,,9102
+19909,9801,8802,-77.0,,9102
+19909,9801,8805,1.0,,9201
+19909,9801,8806,550000.0,,9005
+19909,9801,8807,400000.0,,9005
+19910,9801,8801,18.0,,9102
+19910,9801,8802,-77.0,,9102
+19910,9801,8805,1.0,,9201
+19910,9801,8806,250000.0,,9001
+19910,9801,8807,150000.0,,9001
+19911,9815,8811,-21.0,,9105
+19911,9815,8812,49.0,,9105
+19911,9815,8813,21.0,,9105
+19911,9815,8814,21.0,,9105
+19911,9815,8815,0.9995,,9201
+19911,9815,8816,400000.0,,9001
+19911,9815,8817,800000.0,,9001
+19913,9809,8801,52.0922178,,9110
+19913,9809,8802,5.23155,,9110
+19913,9809,8805,0.9999079,,9201
+19913,9809,8806,0.0,,9001
+19913,9809,8807,0.0,,9001
+19914,9809,8801,52.0922178,,9110
+19914,9809,8802,5.23155,,9110
+19914,9809,8805,0.9999079,,9201
+19914,9809,8806,155000.0,,9001
+19914,9809,8807,463000.0,,9001
+19915,9801,8801,15.0,,9102
+19915,9801,8802,45.0,,9102
+19915,9801,8805,0.999365678,,9201
+19915,9801,8806,1500000.0,,9001
+19915,9801,8807,1000000.0,,9001
+19916,9807,8801,49.0,,9102
+19916,9807,8802,-2.0,,9102
+19916,9807,8805,0.999601272,,9201
+19916,9807,8806,400000.0,,9001
+19916,9807,8807,-100000.0,,9001
+19917,9811,8801,-41.0,,9102
+19917,9811,8802,173.0,,9102
+19917,9811,8806,2510000.0,,9001
+19917,9811,8807,6023150.0,,9001
+19919,9807,8801,24.27,,9110
+19919,9807,8802,51.13,,9110
+19919,9807,8805,0.99999,,9201
+19919,9807,8806,200000.0,,9001
+19919,9807,8807,300000.0,,9001
+19920,9806,8801,1.1715528,,9110
+19920,9806,8802,103.5110808,,9110
+19920,9806,8806,30000.0,,9001
+19920,9806,8807,30000.0,,9001
+19921,9801,8801,40.0,,9102
+19921,9801,8802,0.0,,9102
+19921,9801,8805,0.9988085293,,9201
+19921,9801,8806,600000.0,,9001
+19921,9801,8807,600000.0,,9001
+19922,9815,8811,46.570866,,9110
+19922,9815,8812,7.26225,,9110
+19922,9815,8813,90.0,,9110
+19922,9815,8814,90.0,,9110
+19922,9815,8815,1.0,,9201
+19922,9815,8816,600000.0,,9001
+19922,9815,8817,200000.0,,9001
+19923,9815,8811,46.570866,,9110
+19923,9815,8812,0.0,,9110
+19923,9815,8813,90.0,,9110
+19923,9815,8814,90.0,,9110
+19923,9815,8815,1.0,,9201
+19923,9815,8816,0.0,,9001
+19923,9815,8817,0.0,,9001
+19924,9806,8801,11.1507843,,9110
+19924,9806,8802,-60.4109632,,9110
+19924,9806,8806,187500.0,,9039
+19924,9806,8807,180000.0,,9039
+19925,9806,8801,10.263,,9110
+19925,9806,8802,-61.2,,9110
+19925,9806,8806,430000.0,,9039
+19925,9806,8807,325000.0,,9039
+19926,9809,8801,46.0,,9102
+19926,9809,8802,25.0,,9102
+19926,9809,8805,0.99975,,9201
+19926,9809,8806,500000.0,,9001
+19926,9809,8807,500000.0,,9001
+19927,9809,8801,45.54,,9110
+19927,9809,8802,25.23328772,,9110
+19927,9809,8805,0.9996667,,9201
+19927,9809,8806,500000.0,,9001
+19927,9809,8807,500000.0,,9001
+19928,9807,8801,0.0,,9102
+19928,9807,8802,48.0,,9102
+19928,9807,8805,0.9996,,9201
+19928,9807,8806,500000.0,,9001
+19928,9807,8807,0.0,,9001
+19929,9807,8801,0.0,,9110
+19929,9807,8802,15.48298,,9110
+19929,9807,8805,1.0,,9201
+19929,9807,8806,1500000.0,,9001
+19929,9807,8807,0.0,,9001
+19930,9807,8801,0.0,,9102
+19930,9807,8802,24.0,,9102
+19930,9807,8805,0.9996,,9201
+19930,9807,8806,500000.0,,9001
+19930,9807,8807,0.0,,9001
+19931,9815,8811,47.08398174,,9110
+19931,9815,8812,19.02548584,,9110
+19931,9815,8813,90.0,,9110
+19931,9815,8814,90.0,,9110
+19931,9815,8815,0.99993,,9201
+19931,9815,8816,650000.0,,9001
+19931,9815,8817,200000.0,,9001
+19933,9809,8801,47.15,,9110
+19933,9809,8802,-63.0,,9110
+19933,9809,8805,0.999912,,9201
+19933,9809,8806,700000.0,,9001
+19933,9809,8807,400000.0,,9001
+19934,9807,8801,0.0,,9102
+19934,9807,8802,24.0,,9102
+19934,9807,8805,0.9998,,9201
+19934,9807,8806,500000.0,,9001
+19934,9807,8807,0.0,,9001
+19935,9812,8806,40000.0,,9062
+19935,9812,8807,0.0,,9062
+19935,9812,8811,4.0,,9110
+19935,9812,8812,102.15,,9110
+19935,9812,8813,323.01328458,,9110
+19935,9812,8814,323.07483685,,9110
+19935,9812,8815,0.99984,,9201
+19936,9807,8801,39.4,,9110
+19936,9807,8802,1.0,,9110
+19936,9807,8805,1.0,,9201
+19936,9807,8806,200000.0,,9001
+19936,9807,8807,300000.0,,9001
+19937,9816,8821,38.81973,,9105
+19937,9816,8822,7.83445,,9105
+19937,9816,8826,270.0,,9036
+19937,9816,8827,582.0,,9036
+19938,9802,8821,57.310319415,,9110
+19938,9802,8822,24.0,,9110
+19938,9802,8823,59.2,,9110
+19938,9802,8824,58.0,,9110
+19938,9802,8826,500000.0,,9001
+19938,9802,8827,6375000.0,,9001
+19939,9807,8801,0.0,,9102
+19939,9807,8802,24.0,,9102
+19939,9807,8805,0.9996,,9201
+19939,9807,8806,500000.0,,9001
+19939,9807,8807,0.0,,9001
+19940,9817,8801,34.39,,9110
+19940,9817,8802,37.21,,9110
+19940,9817,8805,0.9996256,,9201
+19940,9817,8806,300000.0,,9001
+19940,9817,8807,300000.0,,9001
+19941,9818,8801,0.0,,9102
+19941,9818,8802,-54.0,,9102
+19941,9818,8806,5000000.0,,9001
+19941,9818,8807,10000000.0,,9001
+19942,9807,8801,0.0,,9102
+19942,9807,8802,-62.0,,9102
+19942,9807,8805,0.9995,,9201
+19942,9807,8806,400000.0,,9001
+19942,9807,8807,0.0,,9001
+19943,9807,8801,13.1035,,9110
+19943,9807,8802,-59.3335,,9110
+19943,9807,8805,0.9999986,,9201
+19943,9807,8806,30000.0,,9001
+19943,9807,8807,75000.0,,9001
+19944,9802,8821,44.0,,9110
+19944,9802,8822,-68.3,,9110
+19944,9802,8823,60.0,,9110
+19944,9802,8824,46.0,,9110
+19944,9802,8826,0.0,,9001
+19944,9802,8827,0.0,,9001
+19945,9809,8801,46.3,,9110
+19945,9809,8802,-66.3,,9110
+19945,9809,8805,0.999912,,9201
+19945,9809,8806,300000.0,,9001
+19945,9809,8807,800000.0,,9001
+19946,9809,8801,46.3,,9110
+19946,9809,8802,-66.3,,9110
+19946,9809,8805,0.999912,,9201
+19946,9809,8806,2500000.0,,9001
+19946,9809,8807,7500000.0,,9001
+19947,9802,8821,47.3,,9110
+19947,9802,8822,13.2,,9110
+19947,9802,8823,49.0,,9110
+19947,9802,8824,46.0,,9110
+19947,9802,8826,400000.0,,9001
+19947,9802,8827,400000.0,,9001
+19948,9801,8801,34.39,,9110
+19948,9801,8802,37.21,,9110
+19948,9801,8805,0.9996256,,9201
+19948,9801,8806,300000.0,,9001
+19948,9801,8807,300000.0,,9001
+19949,9809,8801,38.0,,9105
+19949,9809,8802,43.5,,9105
+19949,9809,8805,0.9995341,,9201
+19949,9809,8806,0.0,,9001
+19949,9809,8807,0.0,,9001
+19950,9815,8811,46.570866,,9110
+19950,9815,8812,7.26225,,9110
+19950,9815,8813,90.0,,9110
+19950,9815,8814,90.0,,9110
+19950,9815,8815,1.0,,9201
+19950,9815,8816,2600000.0,,9001
+19950,9815,8817,1200000.0,,9001
+19951,9815,8811,27.31077837,,9110
+19951,9815,8812,52.3612741,,9110
+19951,9815,8813,0.34179803,,9110
+19951,9815,8814,0.34179803,,9110
+19951,9815,8815,0.999895934,,9201
+19951,9815,8816,658377.437,,9001
+19951,9815,8817,3044969.194,,9001
+19952,9819,8811,49.3,,9110
+19952,9819,8812,42.3,,9110
+19952,9819,8813,30.1717303,,9110
+19952,9819,8816,0.0,,9001
+19952,9819,8817,0.0,,9001
+19952,9819,8818,78.3,,9110
+19952,9819,8819,0.9999,,9201
+19953,9806,8801,25.22565,,9110
+19953,9806,8802,50.4541,,9110
+19953,9806,8806,100000.0,,9001
+19953,9806,8807,100000.0,,9001
+19954,9807,8801,0.0,,9110
+19954,9807,8802,-55.41,,9110
+19954,9807,8805,0.9996,,9201
+19954,9807,8806,500000.0,,9001
+19954,9807,8807,0.0,,9001
+19955,9807,8801,0.0,,9110
+19955,9807,8802,-55.41,,9110
+19955,9807,8805,0.9999,,9201
+19955,9807,8806,500000.0,,9001
+19955,9807,8807,0.0,,9001
+19956,9815,8811,4.0,,9110
+19956,9815,8812,115.0,,9110
+19956,9815,8813,53.18569537,,9110
+19956,9815,8814,53.07483685,,9110
+19956,9815,8815,0.99984,,9201
+19956,9815,8816,29352.4763,,9042
+19956,9815,8817,22014.3572,,9042
+19957,9815,8811,4.0,,9110
+19957,9815,8812,115.0,,9110
+19957,9815,8813,53.18569537,,9110
+19957,9815,8814,53.07483685,,9110
+19957,9815,8815,0.99984,,9201
+19957,9815,8816,1937263.44,,9041
+19957,9815,8817,1452947.58,,9041
+19958,9815,8811,4.0,,9110
+19958,9815,8812,115.0,,9110
+19958,9815,8813,53.18569537,,9110
+19958,9815,8814,53.07483685,,9110
+19958,9815,8815,0.99984,,9201
+19958,9815,8816,590476.87,,9001
+19958,9815,8817,442857.65,,9001
+19959,9807,8801,4.4,,9110
+19959,9807,8802,-1.0,,9110
+19959,9807,8805,0.99975,,9201
+19959,9807,8806,900000.0,,9094
+19959,9807,8807,0.0,,9094
+19960,9809,8801,47.15,,9110
+19960,9809,8802,-63.0,,9110
+19960,9809,8805,0.999912,,9201
+19960,9809,8806,400000.0,,9001
+19960,9809,8807,800000.0,,9001
+19961,9802,8821,90.0,,9110
+19961,9802,8822,4.2202952,,9110
+19961,9802,8823,51.100000204,,9110
+19961,9802,8824,49.500000204,,9110
+19961,9802,8826,150000.013,,9001
+19961,9802,8827,5400088.438,,9001
+19962,9807,8801,53.3,,9110
+19962,9807,8802,-8.0,,9110
+19962,9807,8805,0.99982,,9201
+19962,9807,8806,600000.0,,9001
+19962,9807,8807,750000.0,,9001
+19963,9807,8801,6.4,,9110
+19963,9807,8802,-12.0,,9110
+19963,9807,8805,1.0,,9201
+19963,9807,8806,500000.0,,9094
+19963,9807,8807,0.0,,9094
+19964,9807,8801,6.4,,9110
+19964,9807,8802,-12.0,,9110
+19964,9807,8805,1.0,,9201
+19964,9807,8806,800000.0,,9094
+19964,9807,8807,600000.0,,9094
+19965,9821,8806,0.0,,9001
+19965,9821,8807,0.0,,9001
+19965,9821,8828,45.0,,9102
+19965,9821,8829,-100.0,,9102
+19966,9807,8801,49.5,,9110
+19966,9807,8802,6.1,,9110
+19966,9807,8805,1.0,,9201
+19966,9807,8806,80000.0,,9001
+19966,9807,8807,100000.0,,9001
+19967,9807,8801,0.0,,9110
+19967,9807,8802,15.0,,9110
+19967,9807,8805,0.9999,,9201
+19967,9807,8806,500000.0,,9001
+19967,9807,8807,0.0,,9001
+19968,9823,8801,0.0,,9102
+19968,9823,8802,0.0,,9102
+19969,9807,8801,39.4,,9110
+19969,9807,8802,1.0,,9110
+19969,9807,8805,1.0,,9201
+19969,9807,8806,0.0,,9001
+19969,9807,8807,0.0,,9001
+19971,9807,8801,0.0,,9102
+19971,9807,8802,173.0,,9102
+19971,9807,8805,0.9996,,9201
+19971,9807,8806,1600000.0,,9001
+19971,9807,8807,10000000.0,,9001
+19972,9807,8801,53.3,,9110
+19972,9807,8802,-8.0,,9110
+19972,9807,8805,1.000035,,9201
+19972,9807,8806,200000.0,,9001
+19972,9807,8807,250000.0,,9001
+19973,9807,8801,53.3,,9110
+19973,9807,8802,-8.0,,9110
+19973,9807,8805,1.0,,9201
+19973,9807,8806,200000.0,,9001
+19973,9807,8807,250000.0,,9001
+19974,9807,8801,39.4,,9110
+19974,9807,8802,-8.0754862,,9110
+19974,9807,8805,1.0,,9201
+19974,9807,8806,180.598,,9001
+19974,9807,8807,-86.99,,9001
+19975,9806,8801,10.263,,9110
+19975,9806,8802,-61.2,,9110
+19975,9806,8806,283800.0,,9005
+19975,9806,8807,214500.0,,9005
+19976,9802,8821,6.0,,9102
+19976,9802,8822,-66.0,,9102
+19976,9802,8823,9.0,,9102
+19976,9802,8824,3.0,,9102
+19976,9802,8826,1000000.0,,9001
+19976,9802,8827,1000000.0,,9001
+19977,9802,8821,25.0522236,,9110
+19977,9802,8822,48.0,,9102
+19977,9802,8823,17.0,,9102
+19977,9802,8824,33.0,,9102
+19977,9802,8826,0.0,,9001
+19977,9802,8827,0.0,,9001
+19978,9807,8801,22.184368,,9110
+19978,9807,8802,114.10428,,9110
+19978,9807,8805,1.0,,9201
+19978,9807,8806,836694.05,,9001
+19978,9807,8807,819069.8,,9001
+19979,9828,8801,39.4,,9110
+19979,9828,8802,1.0,,9110
+19979,9828,8806,0.0,,9001
+19979,9828,8807,0.0,,9001
diff --git a/src/tiff/csv/coordinate_operation_path.csv b/src/tiff/csv/coordinate_operation_path.csv
new file mode 100644
index 0000000..afaf70b
--- /dev/null
+++ b/src/tiff/csv/coordinate_operation_path.csv
@@ -0,0 +1,336 @@
+"CONCAT_OPERATION_CODE","SINGLE_OPERATION_CODE","OP_PATH_STEP"
+8046,1025,1
+8046,1146,2
+8047,1146,2
+8047,1147,1
+8094,1193,2
+8094,1763,1
+8174,1125,2
+8174,1755,1
+8175,1169,2
+8175,1262,1
+8176,1227,2
+8176,1265,1
+8178,1123,2
+8178,1759,1
+8183,1149,2
+8183,1273,1
+8186,1276,2
+8186,1763,1
+8188,1277,2
+8188,1763,1
+8190,1150,2
+8190,1278,1
+8192,1150,2
+8192,1279,1
+8194,1150,2
+8194,1280,1
+8195,1149,2
+8195,1437,1
+8199,1274,1
+8199,1283,2
+8211,1266,1
+8211,1294,2
+8215,1297,1
+8215,1302,2
+8217,1298,1
+8217,1302,2
+8219,1299,1
+8219,1302,2
+8221,1300,1
+8221,1302,2
+8223,1301,1
+8223,1302,2
+8234,1149,2
+8234,1309,1
+8236,1149,2
+8236,1310,1
+8241,1026,1
+8241,1145,2
+8243,1188,2
+8243,1312,1
+8245,1188,2
+8245,1313,1
+8263,1306,2
+8263,1757,1
+8386,1188,2
+8386,1454,1
+8388,1188,2
+8388,1455,1
+8390,1188,2
+8390,1456,1
+8392,1188,2
+8392,1457,1
+8394,1188,2
+8394,1451,1
+8396,1150,2
+8396,1458,1
+8398,1150,2
+8398,1459,1
+8400,1150,2
+8400,1460,1
+8402,1188,2
+8402,1461,1
+8404,1188,2
+8404,1462,1
+8406,1188,2
+8406,1463,1
+8408,1150,2
+8408,1464,1
+8418,1472,1
+8418,1473,2
+8419,1473,2
+8419,1599,1
+8420,1473,2
+8420,1600,1
+8421,1473,2
+8421,1601,1
+8422,1473,2
+8422,1602,1
+8453,1150,2
+8453,1506,1
+8454,1150,2
+8454,1507,1
+8457,1509,1
+8457,1511,2
+8460,1241,1
+8460,1474,2
+8461,1241,1
+8461,1475,2
+8462,1241,1
+8462,1476,2
+8463,1241,1
+8463,1477,2
+8464,1241,1
+8464,1478,2
+8465,1241,1
+8465,1479,2
+8466,1241,1
+8466,1480,2
+8467,1241,1
+8467,1481,2
+8468,1241,1
+8468,1482,2
+8469,1241,1
+8469,1483,2
+8470,1241,1
+8470,1484,2
+8471,1241,1
+8471,1485,2
+8472,1241,1
+8472,1486,2
+8473,1241,1
+8473,1487,2
+8474,1241,1
+8474,1488,2
+8475,1241,1
+8475,1489,2
+8476,1241,1
+8476,1490,2
+8477,1241,1
+8477,1491,2
+8478,1241,1
+8478,1492,2
+8479,1241,1
+8479,1493,2
+8480,1241,1
+8480,1494,2
+8481,1241,1
+8481,1495,2
+8482,1496,2
+8482,1747,1
+8483,1241,1
+8483,1497,2
+8484,1241,1
+8484,1498,2
+8485,1241,1
+8485,1499,2
+8486,1241,1
+8486,1500,2
+8487,1241,1
+8487,1501,2
+8488,1241,1
+8488,1502,2
+8489,1241,1
+8489,1503,2
+8496,1241,1
+8496,1515,2
+8497,1243,1
+8497,1515,2
+8508,1454,1
+8508,1520,2
+8509,1241,1
+8509,1521,2
+8510,1241,1
+8510,1522,2
+8511,1241,1
+8511,1523,2
+8512,1241,1
+8512,1524,2
+8513,1241,1
+8513,1525,2
+8514,1241,1
+8514,1526,2
+8517,1527,2
+8517,1528,1
+8530,1539,1
+8530,1540,2
+8532,1240,2
+8532,1541,1
+8537,1237,2
+8537,1545,1
+8553,1241,1
+8553,1553,2
+8554,1241,1
+8554,1554,2
+8560,1150,2
+8560,1559,1
+8562,1240,2
+8562,1560,1
+8563,1565,2
+8563,1568,1
+8564,1473,2
+8564,1576,1
+8565,1188,2
+8565,1574,1
+8566,1188,2
+8566,1572,1
+8567,1036,1
+8567,1149,2
+8568,1240,2
+8568,1584,1
+8569,1149,2
+8569,1588,1
+8570,1025,1
+8570,1146,2
+8570,1149,3
+8571,1240,2
+8571,1570,1
+8572,1149,2
+8572,1571,1
+8573,1149,2
+8573,1591,1
+8574,1578,1
+8574,1580,2
+8575,1579,1
+8575,1580,2
+8576,1150,2
+8576,1594,1
+8577,1150,2
+8577,1595,1
+8578,1150,2
+8578,1596,1
+8579,1150,2
+8579,1593,1
+8580,1149,2
+8580,1611,1
+8581,1237,2
+8581,1616,1
+8582,1454,1
+8582,1741,2
+8583,1461,1
+8583,1731,2
+8584,1313,1
+8584,1752,2
+8585,1313,1
+8585,1702,2
+8586,1241,1
+8586,1704,2
+8587,1241,1
+8587,1705,2
+8588,1241,1
+8588,1706,2
+8589,1241,1
+8589,1707,2
+8590,1241,1
+8590,1717,2
+8591,1241,1
+8591,1728,2
+8592,1241,1
+8592,1708,2
+8593,1241,1
+8593,1739,2
+8594,1241,1
+8594,1750,2
+8595,1241,1
+8595,1712,2
+8596,1241,1
+8596,1714,2
+8597,1241,1
+8597,1713,2
+8598,1241,1
+8598,1748,2
+8599,1241,1
+8599,1742,2
+8600,1241,1
+8600,1709,2
+8601,1241,1
+8601,1743,2
+8602,1241,1
+8602,1718,2
+8603,1241,1
+8603,1719,2
+8604,1241,1
+8604,1721,2
+8605,1241,1
+8605,1720,2
+8606,1241,1
+8606,1725,2
+8607,1241,1
+8607,1722,2
+8608,1241,1
+8608,1710,2
+8609,1241,1
+8609,1723,2
+8610,1241,1
+8610,1711,2
+8611,1241,1
+8611,1715,2
+8612,1241,1
+8612,1716,2
+8613,1241,1
+8613,1724,2
+8614,1241,1
+8614,1744,2
+8615,1241,1
+8615,1749,2
+8616,1241,1
+8616,1726,2
+8617,1241,1
+8617,1727,2
+8618,1241,1
+8618,1729,2
+8619,1241,1
+8619,1745,2
+8620,1241,1
+8620,1730,2
+8621,1241,1
+8621,1737,2
+8622,1241,1
+8622,1732,2
+8623,1241,1
+8623,1733,2
+8624,1241,1
+8624,1734,2
+8625,1241,1
+8625,1735,2
+8626,1241,1
+8626,1746,2
+8627,1241,1
+8627,1736,2
+8628,1241,1
+8628,1747,2
+8629,1241,1
+8629,1738,2
+8630,1241,1
+8630,1740,2
+8631,1240,2
+8631,1805,1
+8632,1240,2
+8632,1806,1
+8633,1238,2
+8633,1828,1
+8634,1240,2
+8634,1839,1
+8635,1313,1
+8635,1849,2
diff --git a/src/tiff/csv/coordinate_reference_system.csv b/src/tiff/csv/coordinate_reference_system.csv
new file mode 100644
index 0000000..f6e94b7
--- /dev/null
+++ b/src/tiff/csv/coordinate_reference_system.csv
@@ -0,0 +1,2609 @@
+"COORD_REF_SYS_CODE","COORD_REF_SYS_NAME","AREA_OF_USE_CODE","COORD_REF_SYS_KIND","COORD_SYS_CODE","DATUM_CODE","SOURCE_GEOGCRS_CODE","PROJECTION_CONV_CODE","CMPD_HORIZCRS_CODE","CMPD_VERTCRS_CODE","CRS_SCOPE","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","SHOW_CRS","DEPRECATED"
+2100,GGRS87 / Greek Grid,1106,projected,4400,,4121,19930,,,Large and medium scale topographic mapping and engineering survey.,Oil industry uses ED50 / UTM zone 34N and ED50 / UTM zone 35N.,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,1997-06-16 00:00:00,,1,0
+2101,Lake / Maracaibo Grid M1,1319,projected,4499,,4249,18260,,,Oil exploration.,Grid coordinates are (0 0) at Maracaibo Cathedral (10deg 38min 34.678sec N; 71deg 36min 20.224sec W; Lake datum). Used by Creole; MGO and Sun.,Various oil company sources.,EPSG,2000-06-10 00:00:00,,1,0
+2102,Lake / Maracaibo Grid,1319,projected,4499,,4249,18261,,,Oil exploration.,Grid coordinates are (200000 200000) at Maracaibo Cathedral (10deg 38min 34.678sec N; 71deg 36min 20.224sec W; Lake datum). Used for Lake triangulation coordinate listing.,Various oil company sources.,EPSG,2000-06-10 00:00:00,,1,0
+2103,Lake / Maracaibo Grid M3,1319,projected,4499,,4249,18262,,,Oil exploration.,Grid coordinates are (500000 500000) at Maracaibo Cathedral (10deg 38min 34.678sec N; 71deg 36min 20.224sec W; Lake datum). Used by Varco.,Various oil company sources.,EPSG,2000-06-10 00:00:00,,1,0
+2104,Lake / Maracaibo La Rosa Grid,1499,projected,4499,,4249,18263,,,Oil exploration.,"Grid coordinates are (X=-17044 Y=29545) at Maracaibo Cathedral (10deg 38min 34.678sec N; 71deg 36min 20.224sec W; Lake datum).
+Do not confuse with the La Rosa grid used in the Cabinas area (code 5810).",Various oil company sources.,EPSG,2000-06-23 00:00:00,,1,0
+2105,NZGD2000 / Mount Eden Circuit 2000,1500,projected,4500,,4167,17931,,,Cadastral surveys.,Superseded NZGD49 / Mount Eden Circuit 2000 (code 27205) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2106,NZGD2000 / Bay of Plenty Circuit 2000,1500,projected,4500,,4167,17932,,,Cadastral surveys.,Superseded NZGD49 / Bay of Plenty Circuit 2000 (code 27206) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2107,NZGD2000 / Poverty Bay Circuit 2000,1500,projected,4500,,4167,17933,,,Cadastral surveys.,Superseded NZGD49 / Poverty Bay 2000 (code 27207) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2108,NZGD2000 / Hawkes Bay Circuit 2000,1500,projected,4500,,4167,17934,,,Cadastral surveys.,Superseded NZGD49 / Hawkes Bay Circuit 2000 (code 27208) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2109,NZGD2000 / Taranaki Circuit 2000,1500,projected,4500,,4167,17935,,,Cadastral surveys.,Superseded NZGD49 / Taranaki Circuit 2000 (code 27209) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2110,NZGD2000 / Tuhirangi Circuit 2000,1500,projected,4500,,4167,17936,,,Cadastral surveys.,Superseded NZGD49 / Tuhirangi Circuit 2000 (code 27210) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2111,NZGD2000 / Wanganui Circuit 2000,1500,projected,4500,,4167,17937,,,Cadastral surveys.,Superseded NZGD49 / Wanganui Circuit 2000 (code 27211) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2112,NZGD2000 / Wairarapa Circuit 2000,1500,projected,4500,,4167,17938,,,Cadastral surveys.,Superseded NZGD49 / Wairarapa Circuit 2000 (code 27212) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2113,NZGD2000 / Wellington Circuit 2000,1500,projected,4500,,4167,17939,,,Cadastral surveys.,Superseded NZGD49 / Wellington Circuit 2000 (code 27213) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2114,NZGD2000 / Collingwood Circuit 2000,1501,projected,4500,,4167,17940,,,Cadastral surveys.,Superseded NZGD49 / Collingwood Circuit 2000 (code 27214) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2115,NZGD2000 / Nelson Circuit 2000,1501,projected,4500,,4167,17941,,,Cadastral surveys.,Superseded NZGD49 / Nelson Circuit 2000 (code 27215) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2116,NZGD2000 / Karamea Circuit 2000,1501,projected,4500,,4167,17942,,,Cadastral surveys.,Superseded NZGD49 / Karamea Circuit 2000 (code 27216) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2117,NZGD2000 / Buller Circuit 2000,1501,projected,4500,,4167,17943,,,Cadastral surveys.,Superseded NZGD49 / Buller Circuit 2000 (code 27217) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2118,NZGD2000 / Grey Circuit 2000,1501,projected,4500,,4167,17944,,,Cadastral surveys.,Superseded NZGD49 / Grey Circuit 2000 (code 27218) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2119,NZGD2000 / Amuri Circuit 2000,1501,projected,4500,,4167,17945,,,Cadastral surveys.,Superseded NZGD49 / Amuri Circuit 2000 (code 27219) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2120,NZGD2000 / Marlborough Circuit 2000,1501,projected,4500,,4167,17946,,,Cadastral surveys.,Superseded NZGD49 / Marlborough Circuit 2000 (code 27220) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2121,NZGD2000 / Hokitika Circuit 2000,1501,projected,4500,,4167,17947,,,Cadastral surveys.,Superseded NZGD49 / Hokitika Circuit 2000 (code 27221) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2122,NZGD2000 / Okarito Circuit 2000,1501,projected,4500,,4167,17948,,,Cadastral surveys.,Superseded NZGD49 / Okarito Circuit 2000 (code 27222) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2123,NZGD2000 / Jacksons Bay Circuit 2000,1501,projected,4500,,4167,17949,,,Cadastral surveys.,Superseded NZGD49 / Jacksons Bay Circuit 2000 (code 27223) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2124,NZGD2000 / Mount Pleasant Circuit 2000,1501,projected,4500,,4167,17950,,,Cadastral surveys.,Superseded NZGD49 / Mount Pleasant Circuit 2000 (code 27224) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2125,NZGD2000 / Gawler Circuit 2000,1501,projected,4500,,4167,17951,,,Cadastral surveys.,Superseded NZGD49 / Gawler Circuit 2000 (code 27225) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2126,NZGD2000 / Timaru Circuit 2000,1501,projected,4500,,4167,17952,,,Cadastral surveys.,Superseded NZGD49 / Timaru Circuit 2000 (code 27226) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2127,NZGD2000 / Lindis Peak Circuit 2000,1501,projected,4500,,4167,17953,,,Cadastral surveys.,Superseded NZGD49 / Lindis Peak Circuit 2000 (code 27227) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2128,NZGD2000 / Mount Nicholas Circuit 2000,1501,projected,4500,,4167,17954,,,Cadastral surveys.,Superseded NZGD49 / Mount Nicholas Circuit 2000 (code 27228) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2129,NZGD2000 / Mount York Circuit 2000,1501,projected,4500,,4167,17955,,,Cadastral surveys.,Superseded NZGD49 / Mount York Circuit 2000 (code 27229) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2130,NZGD2000 / Observation Point Circuit 2000,1501,projected,4500,,4167,17956,,,Cadastral surveys.,Superseded NZGD49 / Observation Point Circuit 2000 (code 27230) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2131,NZGD2000 / North Taieri Circuit 2000,1501,projected,4500,,4167,17957,,,Cadastral surveys.,Superseded NZGD49 / North Taieri Circuit 2000 (code 27231) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2132,NZGD2000 / Bluff Circuit 2000,1501,projected,4500,,4167,17958,,,Cadastral surveys.,Superseded NZGD49 / Bluff Circuit 2000 (code 27232) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2133,NZGD2000 / UTM zone 58S,1502,projected,4400,,4167,16158,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NZGD49 / UTM zone 58S (code 27258) from March 2000.,,EPSG,2000-10-19 00:00:00,,1,0
+2134,NZGD2000 / UTM zone 59S,1503,projected,4400,,4167,16159,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NZGD49 / UTM zone 59S (code 27259) from March 2000.,,EPSG,2000-10-19 00:00:00,,1,0
+2135,NZGD2000 / UTM zone 60S,1504,projected,4400,,4167,16160,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NZGD49 / UTM zone 60S (code 27260) from March 2000.,,EPSG,2000-10-19 00:00:00,,1,0
+2136,Accra / Ghana National Grid,1104,projected,4404,,4168,19959,,,Large and medium scale topographic mapping and engineering survey.,"Ellipsoid semi-major axis (a)=20926201 Gold Coast feet. ProjCRS sometimes found in metric form: 1 Gold Coast foot = 0.3047997101815 m.
+Superseded by Leigon / Ghana Metric Grid from 1978.",Ordnance Survey International,EPSG,2000-10-19 00:00:00,,1,0
+2137,Accra / TM 1 NW,1505,projected,4400,,4168,17001,,,Oil exploration.,,Various oil industry sources,EPSG,2000-10-19 00:00:00,,1,0
+2138,NAD27(CGQ77) / Quebec Lambert,1368,projected,4499,,4609,19944,,,Medium and small scale mapping.,Superseded NAD27 / Quebec Lambert (code 32098) in 1977.,Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec,EPSG,2000-10-19 00:00:00,,1,0
+2139,NAD83(CSRS98) / SCoPQ zone 2,1420,projected,4499,,4140,17700,,,Large and medium scale topographic mapping and engineering survey.,,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2140,NAD83(CSRS98) / MTM zone 3,1421,projected,4496,,4140,17703,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 3"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2141,NAD83(CSRS98) / MTM zone 4,1422,projected,4496,,4140,17704,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 4"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2142,NAD83(CSRS98) / MTM zone 5,1423,projected,4496,,4140,17705,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 5"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2143,NAD83(CSRS98) / MTM zone 6,1424,projected,4496,,4140,17706,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 6"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2144,NAD83(CSRS98) / MTM zone 7,1425,projected,4496,,4140,17707,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 7"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2145,NAD83(CSRS98) / MTM zone 8,1426,projected,4496,,4140,17708,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 8"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2146,NAD83(CSRS98) / MTM zone 9,1427,projected,4496,,4140,17709,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 9"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2147,NAD83(CSRS98) / MTM zone 10,1428,projected,4496,,4140,17710,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 10"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2148,NAD83(CSRS98) / UTM zone 21N,1446,projected,4400,,4140,16021,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2000-10-19 00:00:00,,1,1
+2149,NAD83(CSRS98) / UTM zone 18N,1443,projected,4400,,4140,16018,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2000-10-19 00:00:00,,1,1
+2150,NAD83(CSRS98) / UTM zone 17N,1428,projected,4400,,4140,16017,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2000-10-19 00:00:00,,1,1
+2151,NAD83(CSRS98) / UTM zone 13N,1506,projected,4400,,4140,16013,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2000-10-19 00:00:00,,1,1
+2152,NAD83(CSRS98) / UTM zone 12N,1507,projected,4400,,4140,16012,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2000-10-19 00:00:00,,1,1
+2153,NAD83(CSRS98) / UTM zone 11N,1508,projected,4400,,4140,16011,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2000-10-19 00:00:00,,1,1
+2154,RGF93 / Lambert-93,1326,projected,4499,,4171,18085,,,Large and medium scale topographic mapping and engineering survey.,,IGN - Paris,EPSG,2000-10-19 00:00:00,,1,0
+2155,American Samoa 1962 / American Samoa Lambert,1027,projected,4497,,4169,15300,,,Large and medium scale topographic mapping and engineering survey.,Superseded by projCRS 2156 as of mid-2000.,US National Geodetic Survey (NGS) http://www.ngs.noaa.gov/,EPSG,2000-10-19 00:00:00,,1,1
+2156,NAD83(HARN) / UTM zone 59S,1027,projected,4400,,4152,16159,,,Large and medium scale topographic mapping and engineering survey.,Supersedes projCRS 2155; effective in 2000. Deprecated due to error in projection and replaced by code 2195.,US National Geodetic Survey (NGS) http://www.ngs.noaa.gov/,EPSG,2000-10-19 00:00:00,,1,1
+2157,IRENET95 / Irish Transverse Mercator,1305,projected,4400,,4173,19962,,,Large and medium scale topographic mapping and engineering survey.,Supersedes TM75 / Irish Grid (code 29903) from 1/1/2001.,Ordnance Survey of Ireland,EPSG,2000-10-19 00:00:00,,1,0
+2158,IRENET95 / UTM zone 29N,1305,projected,4400,,4173,16029,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Ireland,EPSG,2000-10-19 00:00:00,,1,0
+2159,Sierra Leone 1924 / New Colony Grid,1342,projected,4404,,4174,19963,,,Topographic mapping and engineering survey.,Supersedes the Sierra Leone 1924 / Colony Grid. New grid is 422.3 ft west and 112.1 ft south of old grid. Ellipsoid semi-major axis (a)=20926201 Gold Coast feet; 1 Gold Coast foot = 0.3047997101815 m.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+2160,Sierra Leone 1924 / New War Office Grid,1342,projected,4404,,4174,19964,,,Topographic mapping,Supersedes the Sierra Leone War Office Grid. New grid is 422.3 ft west and 112.1 ft south of old grid. Ellipsoid semi-major axis (a)=20926201 Gold Coast feet; 1 Gold Coast foot = 0.3047997101815 m.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+2161,Sierra Leone 1968 / UTM zone 28N,1509,projected,4400,,4175,16028,,,Topographic mapping and engineering survey.,Supersedes Sierra Leone 1960 / UTM zone 28N. The 1968 readjustment coordinates are within 3m of the 1960 provisional adjustment.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+2162,Sierra Leone 1968 / UTM zone 29N,1510,projected,4400,,4175,16029,,,Topographic mapping and engineering survey.,Supersedes Sierra Leone 1960 / UTM zone 29N. The 1968 readjustment coordinates are within 3m of the 1960 provisional adjustment.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+2163,US National Atlas Equal Area,1245,projected,4499,,4047,19965,,,For small scale (1:1million and smaller) statistical mapping.,Uses spherical projection formulae. USGS describe geogCRS as NAD83 but this would require ellipsoidal projection formulae.,"United States Geological Survey, Western Geographic Science Center",EPSG,2001-06-05 00:00:00,,1,0
+2164,Locodjo 1965 / TM 5 NW,2296,projected,4400,,4142,17005,,,Oil industry use.,,Various oil industry sources,EPSG,2001-06-05 00:00:00,,1,0
+2165,Abidjan 1987 / TM 5 NW,2296,projected,4400,,4143,17005,,,Oil Industry,,Various oil industry sources,EPSG,2001-06-05 00:00:00,,1,0
+2166,Pulkovo 1942(83) / Gauss Kruger zone 3,1512,projected,4530,,4178,16263,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",In Thuringen superseded by DHDN / Gauss Kruger zone 3.,EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,1
+2167,Pulkovo 1942(83) / Gauss Kruger zone 4,1513,projected,4530,,4178,16264,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.","In Brandenburg superseded by ETRS89 / UTM zone 33N.
+In Sachsen and Thuringen superseded by DHDN / Gauss Kruger zone 4.",Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,1
+2168,Pulkovo 1942(83) / Gauss Kruger zone 5,1512,projected,4530,,4178,16265,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.","In Brandenburg superseded by ETRS89 / UTM zone 33N.
+In Sachsen superseded by DHDN / Gauss Kruger zone 5.",Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,1
+2169,Luxembourg 1930 / Gauss,1146,projected,4530,,4181,19966,,,Large and medium scale topographic mapping and engineering survey.,,Administration du Cadastre et de la Topographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2170,MGI / Slovenia Grid,1212,projected,4530,,4312,19967,,,Large and medium scale topographic mapping and engineering survey.,Truncated form of MGI / Balkans zone 5 (code 31275).,,EPSG,2001-06-05 00:00:00,,1,0
+2171,Pulkovo 1942(58) / Poland zone I,1515,projected,4530,,4179,18281,,,Large and medium scale topographic mapping and engineering survey.,To be phased out after 2009. Superseded by ETRS89 / Poland CS2000 zones 7 and 8 (codes 2178-79).,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2172,Pulkovo 1942(58) / Poland zone II,1516,projected,4530,,4179,18282,,,Large and medium scale topographic mapping and engineering survey.,To be phased out after 2009. Superseded by ETRS89 / Poland CS2000 zones 7 and 8 (codes 2178-79).,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2173,Pulkovo 1942(58) / Poland zone III,1517,projected,4530,,4179,18283,,,Large and medium scale topographic mapping and engineering survey.,To be phased out after 2009. Superseded by ETRS89 / Poland CS2000 zones 5 and 6 (codes 2176-77).,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2174,Pulkovo 1942(58) / Poland zone IV,1518,projected,4530,,4179,18284,,,Large and medium scale topographic mapping and engineering survey.,To be phased out after 2009. Superseded by ETRS89 / Poland CS2000 zones 5 and 6 (codes 2176-77).,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2175,Pulkovo 1942(58) / Poland zone V,1519,projected,4530,,4179,18285,,,Large and medium scale topographic mapping and engineering survey.,To be phased out after 2009. Superseded by ETRS89 / Poland CS2000 zone 6 (code 2177).,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2176,ETRS89 / Poland CS2000 zone 5,1520,projected,4531,,4258,18305,,,"Large (1:5,000 and greater) scale topographic mapping and cadastral survey.",See ETRS89 / Poland CS92 (code 2170) for smaller scale mapping.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2177,ETRS89 / Poland CS2000 zone 6,1521,projected,4531,,4258,18306,,,"Large (1:5,000 and greater) scale topographic mapping and cadastral survey.",See ETRS89 / Poland CS92 (code 2170) for smaller scale mapping.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2178,ETRS89 / Poland CS2000 zone 7,1522,projected,4531,,4258,18307,,,"Large (1:5,000 and greater) scale topographic mapping and cadastral survey.",See ETRS89 / Poland CS92 (code 2170) for smaller scale mapping.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2179,ETRS89 / Poland CS2000 zone 8,1523,projected,4531,,4258,18308,,,"Large (1:5,000 and greater) scale topographic mapping and cadastral survey.",See ETRS89 / Poland CS92 (code 2170) for smaller scale mapping.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2180,ETRS89 / Poland CS92,1192,projected,4531,,4258,18300,,,"Medium and small scale topographic mapping (1:10,000 and smaller).",See ETRS89 / Poland CS2000 zones 5- 8 (codes 2176-79) for large scale purposes.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2188,Azores Occidental 1939 / UTM zone 25N,1344,projected,4400,,4182,16025,,,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2189,Azores Central 1948 / UTM zone 26N,1301,projected,4400,,4183,16026,,,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2190,Azores Oriental 1940 / UTM zone 26N,1345,projected,4400,,4184,16026,,,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2191,Madeira 1936 / UTM zone 28N,1314,projected,4400,,4185,16028,,,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,1
+2192,ED50 / France EuroLambert,1326,projected,4499,,4230,18086,,,Medium scale topographic and statistical mapping.,,IGN Paris via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2193,NZGD2000 / New Zealand Transverse Mercator,1175,projected,4500,,4167,19971,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NZGD49 / New Zealand Map Grid (code 27200) from July 2001.,Shell Todd Oil Services.,EPSG,2001-08-28 00:00:00,,1,0
+2194,American Samoa 1962 / American Samoa Lambert,1027,projected,4497,,4169,15301,,,Large and medium scale topographic mapping and engineering survey.,Superseded by projCRS 2156 as of mid-2000.,US National Geodetic Survey (NGS) http://www.ngs.noaa.gov/,EPSG,2001-08-28 00:00:00,,1,0
+2195,NAD83(HARN) / UTM zone 2S,1027,projected,4400,,4152,16102,,,Large and medium scale topographic mapping and engineering survey.,Supersedes projCRS 2194; effective in 2000,US National Geodetic Survey (NGS) http://www.ngs.noaa.gov/,EPSG,2001-08-28 00:00:00,,1,0
+2196,ETRS89 / Kp2000 Jutland,2531,projected,4400,,4258,18401,,,"Large and scale topographic mapping, cadastral and engineering survey. Note: for medium scale topographic mapping ETRS89 / UTM zone 32N (code 25832) is used.",Supersedes System 34 Jutland zone.,Kort & Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+2197,ETRS89 / Kp2000 Zealand,2532,projected,4400,,4258,18402,,,"Large and scale topographic mapping, cadastral and engineering survey. Note: for medium scale topographic mapping ETRS89 / UTM zone 32N (code 25832) is used.",Supersedes System 34 Zealand zone.,Kort & Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+2198,ETRS89 / Kp2000 Bornholm,2533,projected,4400,,4258,18403,,,"Large and scale topographic mapping, cadastral and engineering survey. Note: for medium scale topographic mapping ETRS89 / UTM zone 33N (code 25833) is used.",Supersedes System 45.,Kort & Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+2199,Albanian 1987 / Gauss Kruger zone 4,1025,projected,4530,,4191,16204,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",,EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,1
+2200,ATS77 / New Brunswick Stereographic (ATS77),1447,projected,4500,,4122,19945,,,Large and medium scale topographic mapping and engineering survey.,In use from 1979. To be phased out in late 1990's.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1999-10-20 00:00:00,99.61,1,0
+2201,REGVEN / UTM zone 18N,1693,projected,4400,,4189,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,,1,0
+2000,Anguilla 1957 / British West Indies Grid,1030,projected,4400,,4600,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2001,Antigua 1943 / British West Indies Grid,1273,projected,4400,,4601,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2002,Dominica 1945 / British West Indies Grid,1082,projected,4400,,4602,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2003,Grenada 1953 / British West Indies Grid,1551,projected,4400,,4603,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2004,Montserrat 58 / British West Indies Grid,1165,projected,4400,,4604,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2005,St Kitts 1955 / British West Indies Grid,1200,projected,4400,,4605,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2006,St Lucia 1955 / British West Indies Grid,1201,projected,4400,,4606,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2007,St Vincent 45 / British West Indies Grid,1202,projected,4400,,4607,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2008,NAD27(CGQ77) / SCoPQ zone 2,1420,projected,4499,,4609,17700,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2009,NAD27(CGQ77) / SCoPQ zone 3,1421,projected,4499,,4609,17703,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2010,NAD27(CGQ77) / SCoPQ zone 4,1422,projected,4499,,4609,17704,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2011,NAD27(CGQ77) / SCoPQ zone 5,1423,projected,4499,,4609,17705,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2012,NAD27(CGQ77) / SCoPQ zone 6,1424,projected,4499,,4609,17706,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2013,NAD27(CGQ77) / SCoPQ zone 7,1425,projected,4499,,4609,17707,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2014,NAD27(CGQ77) / SCoPQ zone 8,1426,projected,4499,,4609,17708,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2015,NAD27(CGQ77) / SCoPQ zone 9,1427,projected,4499,,4609,17709,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2016,NAD27(CGQ77) / SCoPQ zone 10,1428,projected,4499,,4609,17710,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2017,NAD27(76) / MTM zone 8,1429,projected,4499,,4608,17708,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2018,NAD27(76) / MTM zone 9,1430,projected,4499,,4608,17709,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2019,NAD27(76) / MTM zone 10,1431,projected,4499,,4608,17710,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2020,NAD27(76) / MTM zone 11,1432,projected,4400,,4608,17711,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2021,NAD27(76) / MTM zone 12,1433,projected,4400,,4608,17712,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2022,NAD27(76) / MTM zone 13,1434,projected,4400,,4608,17713,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2023,NAD27(76) / MTM zone 14,1435,projected,4400,,4608,17714,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2024,NAD27(76) / MTM zone 15,1436,projected,4400,,4608,17715,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2025,NAD27(76) / MTM zone 16,1437,projected,4400,,4608,17716,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2026,NAD27(76) / MTM zone 17,1438,projected,4400,,4608,17717,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2027,NAD27(76) / UTM zone 15N,1439,projected,4400,,4608,16015,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 15N (code 26715).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2028,NAD27(76) / UTM zone 16N,1440,projected,4400,,4608,16016,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 16N (code 26716).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2029,NAD27(76) / UTM zone 17N,1441,projected,4400,,4608,16017,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 17N (code 26717).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2030,NAD27(76) / UTM zone 18N,1442,projected,4400,,4608,16018,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 18N (code 26718).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2031,NAD27(CGQ77) / UTM zone 17N,1428,projected,4400,,4609,16017,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 17N (code 26717).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2032,NAD27(CGQ77) / UTM zone 18N,1443,projected,4400,,4609,16018,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 18N (code 26718).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2033,NAD27(CGQ77) / UTM zone 19N,1444,projected,4400,,4609,16019,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 19N (code 26719).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2034,NAD27(CGQ77) / UTM zone 20N,1445,projected,4400,,4609,16020,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 20N (code 26720).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2035,NAD27(CGQ77) / UTM zone 21N,1446,projected,4400,,4609,16021,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 21N (code 26721).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2036,NAD83(CSRS98) / New Brunswick Stereo,1447,projected,4500,,4140,19946,,,Large and medium scale topographic mapping and engineering survey.,In use from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2000-03-07 00:00:00,99.74 99.90,1,1
+2037,NAD83(CSRS98) / UTM zone 19N,1448,projected,4400,,4140,16019,,,Large and medium scale topographic mapping and engineering survey.,In use from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2000-03-07 00:00:00,99.74 99.90,1,1
+2038,NAD83(CSRS98) / UTM zone 20N,1449,projected,4400,,4140,16020,,,Large and medium scale topographic mapping and engineering survey.,In use from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2000-03-07 00:00:00,99.74 99.90,1,1
+2039,Israel / Israeli TM Grid,2603,projected,4400,,4141,18204,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Israeli CS Grid (EPSG code 28193).,Survey of Israel.,EPSG,2002-06-22 00:00:00,99.74 2002.34,1,0
+2040,Locodjo 1965 / UTM zone 30N,1450,projected,4400,,4142,16030,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Abidjan 87 / UTM 30N (EPSG code 2041).,IGN Paris,EPSG,2000-03-07 00:00:00,99.74,1,0
+2041,Abidjan 1987 / UTM zone 30N,1450,projected,4400,,4143,16030,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Locodjo 65 / UTM 30N (EPSG code 2040).,IGN Paris,EPSG,2000-03-07 00:00:00,99.74,1,0
+2042,Locodjo 1965 / UTM zone 29N,1451,projected,4400,,4142,16029,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Abidjan 87 / UTM 29N (EPSG code 2043).,IGN Paris,EPSG,2000-03-07 00:00:00,99.74,1,0
+2043,Abidjan 1987 / UTM zone 29N,1451,projected,4400,,4143,16029,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Locodjo 65 / UTM 29N (EPSG code 2042).,IGN Paris,EPSG,2000-03-07 00:00:00,99.74,1,0
+2044,Hanoi 1972 / Gauss-Kruger zone 18,1452,projected,4530,,4147,16218,,,Large and medium scale topographic mapping and engineering survey.,Replaces use of Indian 1960 / UTM zone 48 after 1988.,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2045,Hanoi 1972 / Gauss-Kruger zone 19,1453,projected,4530,,4147,16219,,,Large and medium scale topographic mapping and engineering survey.,Replaces use of Indian 1960 / UTM zone 49 after 1988.,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2046,Hartebeesthoek94 / Lo15,1454,projected,6503,,4148,17515,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74 99.96 99.98 2000.04,1,0
+2047,Hartebeesthoek94 / Lo17,1455,projected,6503,,4148,17517,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74 99.96 99.98 2000.04,1,0
+2048,Hartebeesthoek94 / Lo19,1456,projected,6503,,4148,17519,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74 99.96 99.98 2000.04,1,0
+2049,Hartebeesthoek94 / Lo21,1457,projected,6503,,4148,17521,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74 99.96 99.98 2000.04,1,0
+2050,Hartebeesthoek94 / Lo23,1458,projected,6503,,4148,17523,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74 99.96 99.98 2000.04,1,0
+2051,Hartebeesthoek94 / Lo25,1459,projected,6503,,4148,17525,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74 99.96 99.98 2000.04,1,0
+2052,Hartebeesthoek94 / Lo27,1460,projected,6503,,4148,17527,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74 99.96 99.98 2000.04,1,0
+2053,Hartebeesthoek94 / Lo29,1461,projected,6503,,4148,17529,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74 99.96 99.98 2000.04,1,0
+2054,Hartebeesthoek94 / Lo31,1462,projected,6503,,4148,17531,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74 99.96 99.98 2000.04,1,0
+2055,Hartebeesthoek94 / Lo33,1463,projected,6503,,4148,17533,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74 99.96 99.98 2000.04,1,0
+2056,CH1903+ / LV95,1286,projected,4498,,4150,19950,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes CH1903/LV03 (code 21781).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2057,Rassadiran / Nakhl e Taqi,1338,projected,4400,,4153,19951,,,Engineering survey for terminal site only.,,Total-Fina,EPSG,2000-03-07 00:00:00,99.74,1,0
+2058,ED50(ED77) / UTM zone 38N,1464,projected,4400,,4154,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2059,ED50(ED77) / UTM zone 39N,1465,projected,4400,,4154,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2060,ED50(ED77) / UTM zone 40N,1466,projected,4400,,4154,16040,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2061,ED50(ED77) / UTM zone 41N,1467,projected,4400,,4154,16041,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2062,Madrid 1870 (Madrid) / Spain,1217,projected,4499,,4903,19921,,,Large and medium scale topographic mapping and engineering survey.,Superseded by ED50 / UTM after 1966.,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2063,Dabola 1981 / UTM zone 28N,1468,projected,4400,,4315,16028,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Conakry 1905 / UTM zone 28 (EPSG code 31528).,,EPSG,1999-12-09 00:00:00,,1,0
+2064,Dabola 1981 / UTM zone 29N,1469,projected,4400,,4315,16029,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Conakry 1905 / UTM zone 29 (EPSG code 31529).,,EPSG,1999-12-09 00:00:00,,1,0
+2065,S-JTSK (Ferro) / Krovak,1306,projected,6501,,4818,19952,,,Large and medium scale topographic mapping and engineering survey.,,Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2000-03-07 00:00:00,,1,0
+2066,Mount Dillon / Tobago Grid,1322,projected,4407,,4157,19924,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,,1,0
+2067,Naparima 1955 / UTM zone 20N,1339,projected,4400,,4158,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,,1,0
+2068,ELD79 / Libya zone 5,1470,projected,4499,,4159,18240,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2069,ELD79 / Libya zone 6,1471,projected,4499,,4159,18241,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2070,ELD79 / Libya zone 7,1472,projected,4499,,4159,18242,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2071,ELD79 / Libya zone 8,1473,projected,4499,,4159,18243,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2072,ELD79 / Libya zone 9,1474,projected,4499,,4159,18244,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2073,ELD79 / Libya zone 10,1475,projected,4499,,4159,18245,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2074,ELD79 / Libya zone 11,1476,projected,4499,,4159,18246,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2075,ELD79 / Libya zone 12,1477,projected,4499,,4159,18247,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2076,ELD79 / Libya zone 13,1478,projected,4499,,4159,18248,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2077,ELD79 / UTM zone 32N,1479,projected,4400,,4159,16032,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2078,ELD79 / UTM zone 33N,1480,projected,4400,,4159,16033,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2079,ELD79 / UTM zone 34N,1481,projected,4400,,4159,16034,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2080,ELD79 / UTM zone 35N,1478,projected,4400,,4159,16035,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2081,Chos Malal 1914 / Argentina zone 2,1483,projected,4530,,4160,18032,,,Oil exploration.,,Various oil industry records,EPSG,2002-06-22 00:00:00,2002.36,1,0
+2082,Pampa del Castillo / Argentina zone 2,1484,projected,4530,,4161,18032,,,Oil exploration.,,Various oil industry records,EPSG,2002-06-22 00:00:00,2002.36,1,0
+2083,Hito XVIII 1963 / Argentina zone 2,1485,projected,4530,,4254,18032,,,Large and medium scale topographic mapping and engineering survey.,,Total-Fina,EPSG,2002-06-22 00:00:00,2002.36,1,0
+2084,Hito XVIII 1963 / UTM zone 19S,1486,projected,4400,,4254,16119,,,Large and medium scale topographic mapping and engineering survey.,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+2085,NAD27 / Cuba Norte,1487,projected,4532,,4267,18061,,,Large and medium scale topographic mapping and engineering survey.,,Institut Cubano di Hidrografia (ICH),EPSG,2000-03-07 00:00:00,,1,0
+2086,NAD27 / Cuba Sur,1488,projected,4532,,4267,18062,,,Large and medium scale topographic mapping and engineering survey.,,Institut Cubano di Hidrografia (ICH),EPSG,2000-03-07 00:00:00,,1,0
+2087,ELD79 / TM 12 NE,1482,projected,4400,,4159,16412,,,Oil exploration.,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+2088,Carthage / TM 11 NE,1489,projected,4400,,4223,16411,,,Oil exploration by Total.,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+2089,Yemen NGN96 / UTM zone 38N,1490,projected,4400,,4163,16038,,,Large and medium scale topographic mapping and engineering survey.,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,0
+2090,Yemen NGN96 / UTM zone 39N,1491,projected,4400,,4163,16039,,,Large and medium scale topographic mapping and engineering survey.,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,0
+2091,South Yemen / Gauss Kruger zone 8,1492,projected,4530,,4164,16208,,,Large and medium scale topographic mapping and engineering survey.,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,1
+2092,South Yemen / Gauss Kruger zone 9,1493,projected,4530,,4164,16209,,,Large and medium scale topographic mapping and engineering survey.,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,1
+2093,Hanoi 1972 / GK 106 NE,1494,projected,4530,,4147,16586,,,Used for cadastral and large scale topographic mapping.,,BP Amoco,EPSG,2000-03-07 00:00:00,,1,0
+2094,WGS 72BE / TM 106 NE,1495,projected,4400,,4324,16506,,,Oil exploration by Total for blocks 10 and 11-1.,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+2095,Bissau / UTM zone 28N,1113,projected,4400,,4165,16028,,,Large and medium scale topographic mapping and engineering survey.,,US National Imagery and Mapping Agency TR8350.2.,EPSG,2000-03-07 00:00:00,,1,0
+2096,Korean 1985 / Korea East Belt,1496,projected,4530,,4162,18251,,,Large and medium scale topographic mapping and engineering survey.,,Clifford J. Mugnier; in Photogrammetric Engineering & Remote Sensing November 1999. http://www.asprs.org/resources.html,EPSG,2000-03-07 00:00:00,2001.28,1,0
+2097,Korean 1985 / Korea Central Belt,1497,projected,4530,,4162,18252,,,Large and medium scale topographic mapping and engineering survey.,,Clifford J. Mugnier; in Photogrammetric Engineering & Remote Sensing November 1999. http://www.asprs.org/resources.html,EPSG,2000-03-07 00:00:00,2001.28,1,0
+2098,Korean 1985 / Korea West Belt,1498,projected,4530,,4162,18253,,,Large and medium scale topographic mapping and engineering survey.,,Clifford J. Mugnier; in Photogrammetric Engineering & Remote Sensing November 1999. http://www.asprs.org/resources.html,EPSG,2000-03-07 00:00:00,2001.28,1,0
+2099,Qatar 1948 / Qatar Grid,1346,projected,4400,,4286,19953,,,Large and medium scale topographic mapping and engineering survey.,Also known as Qatar Plane Coordinate or QPC system. Superseded by Qatar National Grid (code 28600).,,EPSG,2000-03-07 00:00:00,,1,0
+2202,REGVEN / UTM zone 19N,1694,projected,4400,,4189,16019,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,,1,0
+2203,REGVEN / UTM zone 20N,1695,projected,4400,,4189,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,,1,0
+2204,NAD27 / Tennessee,1411,projected,4497,,4267,15302,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,2001.45,1,0
+2205,NAD83 / Kentucky North,2202,projected,4499,,4269,15303,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2246 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2001-11-06 00:00:00,2001.45,1,0
+2206,ED50 / 3-degree Gauss-Kruger zone 9,1524,projected,4530,,4230,16269,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM27 (code 2319).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2207,ED50 / 3-degree Gauss-Kruger zone 10,1525,projected,4530,,4230,16270,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM30 (code 2320).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2208,ED50 / 3-degree Gauss-Kruger zone 11,1526,projected,4530,,4230,16271,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM33 (code 2321).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2209,ED50 / 3-degree Gauss-Kruger zone 12,1527,projected,4530,,4230,16272,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM36 (code 2322).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2210,ED50 / 3-degree Gauss-Kruger zone 13,1528,projected,4530,,4230,16273,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM39 (code 2323).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2211,ED50 / 3-degree Gauss-Kruger zone 14,1529,projected,4530,,4230,16274,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM42 (code 2324).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2212,ED50 / 3-degree Gauss-Kruger zone 15,1530,projected,4530,,4230,16275,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM45 (code 2325).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2213,ETRS89 / TM 30 NE,2546,projected,4400,,4258,16430,,,Oil industry usage.,,,EPSG,2001-11-06 00:00:00,,1,0
+2214,Douala 1948 / AOF west,1060,projected,4400,,4192,18415,,,Medium and small scale topographic mapping and engineering survey.,Superseded by Manoca 1962 / UTM zone 32N (code 2215).,,EPSG,2002-01-18 00:00:00,,1,0
+2215,Manoca 1962 / UTM zone 32N,1060,projected,4400,,4193,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-01-18 00:00:00,,1,0
+2216,Qornoq 1927 / UTM zone 22N,2573,projected,4400,,4194,16022,,,Topographic mapping.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,1,0
+2217,Qornoq 1927 / UTM zone 23N,2572,projected,4400,,4194,16023,,,Topographic mapping.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,1,0
+2218,Scoresbysund 1952 / Greenland zone 5 east,2560,projected,4501,,4195,18425,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2219,ATS77 / UTM zone 19N,1531,projected,4400,,4122,16019,,,Large and medium scale topographic mapping and engineering survey.,In use from 1979. To be phased out in late 1990's.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1997-07-22 00:00:00,,1,0
+2220,ATS77 / UTM zone 20N,1532,projected,4400,,4122,16020,,,Large and medium scale topographic mapping and engineering survey.,In use from 1979. To be phased out in late 1990's.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1997-07-22 00:00:00,,1,0
+2221,Scoresbysund 1952 / Greenland zone 6 east,2561,projected,4501,,4195,18426,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2222,NAD83 / Arizona East (ft),2167,projected,4495,,4269,15304,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 26948. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2223,NAD83 / Arizona Central (ft),2166,projected,4495,,4269,15305,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 26949. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2224,NAD83 / Arizona West (ft),2168,projected,4495,,4269,15306,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 26950. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2225,NAD83 / California zone 1 (ftUS),2175,projected,4497,,4269,15307,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26941. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2226,NAD83 / California zone 2 (ftUS),2176,projected,4497,,4269,15308,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26942. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2227,NAD83 / California zone 3 (ftUS),2177,projected,4497,,4269,15309,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26943. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2228,NAD83 / California zone 4 (ftUS),2178,projected,4497,,4269,15310,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26944. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2229,NAD83 / California zone 5 (ftUS),2182,projected,4497,,4269,15311,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26945. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2230,NAD83 / California zone 6 (ftUS),2180,projected,4497,,4269,15312,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26946. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2231,NAD83 / Colorado North (ftUS),2184,projected,4497,,4269,15313,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26953. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2232,NAD83 / Colorado Central (ftUS),2183,projected,4497,,4269,15314,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26954. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2233,NAD83 / Colorado South (ftUS),2185,projected,4497,,4269,15315,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26955. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2234,NAD83 / Connecticut (ftUS),1377,projected,4497,,4269,15316,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26956. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2235,NAD83 / Delaware (ftUS),1378,projected,4497,,4269,15317,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26957. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2236,NAD83 / Florida East (ftUS),2186,projected,4497,,4269,15318,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26958. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2237,NAD83 / Florida West (ftUS),2188,projected,4497,,4269,15319,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26959. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2238,NAD83 / Florida North (ftUS),2187,projected,4497,,4269,15320,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26960. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2239,NAD83 / Georgia East (ftUS),2189,projected,4497,,4269,15321,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26966. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2240,NAD83 / Georgia West (ftUS),2190,projected,4497,,4269,15322,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26967. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2241,NAD83 / Idaho East (ftUS),2192,projected,4497,,4269,15323,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26968. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2242,NAD83 / Idaho Central (ftUS),2191,projected,4497,,4269,15324,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26969. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2243,NAD83 / Idaho West (ftUS),2193,projected,4497,,4269,15325,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26970. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2244,NAD83 / Indiana East (ftUS),2196,projected,4497,,4269,15326,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26973. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2245,NAD83 / Indiana West (ftUS),2197,projected,4497,,4269,15327,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26974. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2246,NAD83 / Kentucky North (ftUS),2202,projected,4497,,4269,15328,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 2205. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2247,NAD83 / Kentucky South (ftUS),2203,projected,4497,,4269,15329,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26980. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2248,NAD83 / Maryland (ftUS),1389,projected,4497,,4269,15330,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26985. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2249,NAD83 / Massachusetts Mainland (ftUS),2209,projected,4497,,4269,15331,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26986. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2250,NAD83 / Massachusetts Island (ftUS),2208,projected,4497,,4269,15332,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26987. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2251,NAD83 / Michigan North (ft),1723,projected,4495,,4269,15333,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 26988. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2252,NAD83 / Michigan Central (ft),1724,projected,4495,,4269,15334,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 26989. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2253,NAD83 / Michigan South (ft),1725,projected,4495,,4269,15335,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 26990. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2254,NAD83 / Mississippi East (ftUS),2216,projected,4497,,4269,15336,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26994. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2255,NAD83 / Mississippi West (ftUS),2217,projected,4497,,4269,15337,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 26995. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2256,NAD83 / Montana (ft),1395,projected,4495,,4269,15338,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32100. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2257,NAD83 / New Mexico East (ftUS),2228,projected,4497,,4269,15339,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32112. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2258,NAD83 / New Mexico Central (ftUS),2231,projected,4497,,4269,15340,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32113. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2259,NAD83 / New Mexico West (ftUS),2232,projected,4497,,4269,15341,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32114. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2260,NAD83 / New York East (ftUS),2234,projected,4497,,4269,15342,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32115. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2261,NAD83 / New York Central (ftUS),2233,projected,4497,,4269,15343,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32116. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2262,NAD83 / New York West (ftUS),2236,projected,4497,,4269,15344,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32117. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2263,NAD83 / New York Long Island (ftUS),2235,projected,4497,,4269,15345,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32118. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2264,NAD83 / North Carolina (ftUS),1402,projected,4497,,4269,15346,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32119.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2265,NAD83 / North Dakota North (ft),2237,projected,4495,,4269,15347,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32120. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2266,NAD83 / North Dakota South (ft),2238,projected,4495,,4269,15348,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32121. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2267,NAD83 / Oklahoma North (ftUS),2241,projected,4497,,4269,15349,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32124. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2268,NAD83 / Oklahoma South (ftUS),2242,projected,4497,,4269,15350,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32125. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2269,NAD83 / Oregon North (ft),2243,projected,4495,,4269,15351,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32126. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2270,NAD83 / Oregon South (ft),2244,projected,4495,,4269,15352,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32127. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2271,NAD83 / Pennsylvania North (ftUS),2245,projected,4497,,4269,15353,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32128.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2272,NAD83 / Pennsylvania South (ftUS),2246,projected,4497,,4269,15354,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32129.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2273,NAD83 / South Carolina (ft),1409,projected,4495,,4269,15355,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32133.,National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2274,NAD83 / Tennessee (ftUS),1411,projected,4497,,4269,15356,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32136. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2275,NAD83 / Texas North (ftUS),2253,projected,4497,,4269,15357,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32137. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2276,NAD83 / Texas North Central (ftUS),2254,projected,4497,,4269,15358,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32138. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2277,NAD83 / Texas Central (ftUS),2252,projected,4497,,4269,15359,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32139. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2278,NAD83 / Texas South Central (ftUS),2527,projected,4497,,4269,15360,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32140. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2279,NAD83 / Texas South (ftUS),2528,projected,4497,,4269,15361,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32141. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2280,NAD83 / Utah North (ft),2258,projected,4495,,4269,15362,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32142. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2281,NAD83 / Utah Central (ft),2257,projected,4495,,4269,15363,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32143. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2282,NAD83 / Utah South (ft),2259,projected,4495,,4269,15364,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32144. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2283,NAD83 / Virginia North (ftUS),2260,projected,4497,,4269,15365,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32146. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2284,NAD83 / Virginia South (ftUS),2261,projected,4497,,4269,15366,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32147. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2285,NAD83 / Washington North (ftUS),2273,projected,4497,,4269,15367,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32148. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2286,NAD83 / Washington South (ftUS),2274,projected,4497,,4269,15368,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32149. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2287,NAD83 / Wisconsin North (ftUS),2267,projected,4497,,4269,15369,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32152. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2288,NAD83 / Wisconsin Central (ftUS),2266,projected,4497,,4269,15370,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32153. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2289,NAD83 / Wisconsin South (ftUS),2268,projected,4497,,4269,15371,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. Federal definition is metric - see code 32154. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2290,ATS77 / Prince Edward Isl. Stereographic (ATS77),1533,projected,4496,,4122,19933,,,Large and medium scale topographic mapping and engineering survey.,In use from 1979. To be phased out in late 1990's.,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,1997-11-13 00:00:00,,1,0
+2291,NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83),1533,projected,4496,,4122,19960,,,Large and medium scale topographic mapping and engineering survey.,Deprecated due to error in source geogCRS.,PEI Department of Transportation & Public Works,EPSG,2000-10-19 00:00:00,,1,1
+2292,NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83),1533,projected,4496,,4140,19960,,,Large and medium scale topographic mapping and engineering survey.,,PEI Department of Transportation & Public Works,EPSG,2001-08-28 00:00:00,,1,1
+2294,ATS77 / MTM Nova Scotia zone 4,1534,projected,4400,,4122,17794,,,Large and medium scale topographic mapping and engineering survey.,In use from 1979. To be phased out in late 1990's.,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,1997-11-13 00:00:00,,1,0
+2295,ATS77 / MTM Nova Scotia zone 5,1535,projected,4400,,4122,17795,,,Large and medium scale topographic mapping and engineering survey.,In use from 1979. To be phased out in late 1990's.,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,1997-11-13 00:00:00,,1,0
+2296,Ammassalik 1958 / Greenland zone 7 east,2562,projected,4501,,4196,18427,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2297,Qornoq 1927 / Greenland zone 1 east,2556,projected,4501,,4194,18421,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2298,Qornoq 1927 / Greenland zone 2 east,2557,projected,4501,,4194,18422,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2299,Qornoq 1927 / Greenland zone 2 west,2563,projected,4501,,4194,18432,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2300,Qornoq 1927 / Greenland zone 3 east,2558,projected,4501,,4194,18423,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2301,Qornoq 1927 / Greenland zone 3 west,2564,projected,4501,,4194,18433,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2302,Qornoq 1927 / Greenland zone 4 east,2559,projected,4501,,4194,18424,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2303,Qornoq 1927 / Greenland zone 4 west,2565,projected,4501,,4194,18434,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2304,Qornoq 1927 / Greenland zone 5 west,2566,projected,4501,,4194,18435,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2305,Qornoq 1927 / Greenland zone 6 west,2567,projected,4501,,4194,18436,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2306,Qornoq 1927 / Greenland zone 7 west,2568,projected,4501,,4194,18437,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2307,Qornoq 1927 / Greenland zone 8 east,2569,projected,4501,,4194,18428,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2308,Batavia / TM 109 SE,2577,projected,4400,,4211,16709,,,Used by Arco and BP for ONWJ.,,BP Indonesia.,EPSG,2002-02-12 00:00:00,,1,0
+2309,WGS 84 / TM 116 SE,2588,projected,4400,,4326,16716,,,Used by BP for Terang-Sirasun.,,BP Indonesia.,EPSG,2002-06-22 00:00:00,2002.151,1,0
+2310,WGS 84 / TM 132 SE,2589,projected,4400,,4326,16732,,,Used for hydrocarbons exploration and development.,,BP Indonesia.,EPSG,2002-06-22 00:00:00,2002.151,1,0
+2311,WGS 84 / TM 6 NE,1717,projected,4400,,4326,16406,,,Used for oil exploration by ExxonMobil.,,ExxonMobil.,EPSG,2002-02-12 00:00:00,,1,0
+2312,Garoua / UTM zone 33N,2590,projected,4400,,4197,16033,,,Large and medium scale topographic mapping and engineering survey.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+2313,Kousseri / UTM zone 33N,2591,projected,4400,,4198,16033,,,Large and medium scale topographic mapping and engineering survey.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+2314,Trinidad 1903 / Trinidad Grid (ftCla),1322,projected,4403,,4302,19975,,,Oil industry exploration and production.,Foot version of Trinidad 1903 / Trinidad Grid (code 30200) used by some US-based companies including Amoco Trinidad.,BP,EPSG,2002-02-12 00:00:00,,1,0
+2315,Campo Inchauspe / UTM zone 19S,2596,projected,4400,,4221,16119,,,Oil industry exploration.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+2316,Campo Inchauspe / UTM zone 20S,2597,projected,4400,,4221,16120,,,Oil industry exploration.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+2317,PSAD56 / ICN Regional,1251,projected,4499,,4248,19976,,,Small scale topographic and geological mapping.,,Institute Cartografica Nacional,EPSG,2002-02-12 00:00:00,,1,0
+2318,Ain el Abd / Aramco Lambert,1206,projected,4400,,4204,19977,,,Oil industry exploration and production.,Used by Saudi Aramco when area of interest crosses UTM zone boundary. Adopted by partners for Core Venture 1 (South Ghawar) area.,Saudi Aramco,EPSG,2002-02-12 00:00:00,,1,0
+2319,ED50 / TM27,1524,projected,4530,,4230,16369,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 9 (code 2206).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2320,ED50 / TM30,1525,projected,4530,,4230,16370,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 10 (code 2207).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2321,ED50 / TM33,1526,projected,4530,,4230,16371,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 11 (code 2208).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2322,ED50 / TM36,1527,projected,4530,,4230,16372,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 12 (code 2209).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2323,ED50 / TM39,1528,projected,4530,,4230,16373,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 13 (code 2210).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2324,ED50 / TM42,1529,projected,4530,,4230,16374,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 14 (code 2211).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2325,ED50 / TM45,1530,projected,4530,,4230,16375,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 15 (code 2212).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2326,Hong Kong 1980 Grid System,1118,projected,4500,,4611,19978,,,"Large scale topographic mapping, cadastral and engineering survey.",Supersedes Hong Kong 1963 Grid system and its 1976 metric variant.,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+2327,Xian 1980 / Gauss-Kruger zone 13,1587,projected,4530,,4610,16213,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 75E (code 2338).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2328,Xian 1980 / Gauss-Kruger zone 14,1588,projected,4530,,4610,16214,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 81E (code 2339).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2329,Xian 1980 / Gauss-Kruger zone 15,1589,projected,4530,,4610,16215,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 87E (code 2340).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2330,Xian 1980 / Gauss-Kruger zone 16,1590,projected,4530,,4610,16216,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 93E (code 2341).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2331,Xian 1980 / Gauss-Kruger zone 17,1591,projected,4530,,4610,16217,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 99E (code 2342).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2332,Xian 1980 / Gauss-Kruger zone 18,1592,projected,4530,,4610,16218,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 105E (code 2343).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2333,Xian 1980 / Gauss-Kruger zone 19,1593,projected,4530,,4610,16219,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 111E (code 2344).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2334,Xian 1980 / Gauss-Kruger zone 20,1594,projected,4530,,4610,16220,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 117E (code 2345).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2335,Xian 1980 / Gauss-Kruger zone 21,1595,projected,4530,,4610,16221,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 123E (code 2346).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2336,Xian 1980 / Gauss-Kruger zone 22,1596,projected,4530,,4610,16222,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 129E (code 2347).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2337,Xian 1980 / Gauss-Kruger zone 23,1597,projected,4530,,4610,16223,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 135E (code 2348).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2338,Xian 1980 / Gauss-Kruger CM 75E,1587,projected,4530,,4610,16313,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 13 (code 2327).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2339,Xian 1980 / Gauss-Kruger CM 81E,1588,projected,4530,,4610,16314,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 14 (code 2328).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2340,Xian 1980 / Gauss-Kruger CM 87E,1589,projected,4530,,4610,16315,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 15 (code 2329).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2341,Xian 1980 / Gauss-Kruger CM 93E,1590,projected,4530,,4610,16316,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 16 (code 2330).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2342,Xian 1980 / Gauss-Kruger CM 99E,1591,projected,4530,,4610,16317,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 17 (code 2331).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2343,Xian 1980 / Gauss-Kruger CM 105E,1592,projected,4530,,4610,16318,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 18 (code 2332).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2344,Xian 1980 / Gauss-Kruger CM 111E,1593,projected,4530,,4610,16319,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 19 (code 2333).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2345,Xian 1980 / Gauss-Kruger CM 117E,1594,projected,4530,,4610,16320,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 20 (code 2334).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2346,Xian 1980 / Gauss-Kruger CM 123E,1595,projected,4530,,4610,16321,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 21 (code 2335).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2347,Xian 1980 / Gauss-Kruger CM 129E,1596,projected,4530,,4610,16322,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 22 (code 2336).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2348,Xian 1980 / Gauss-Kruger CM 135E,1597,projected,4530,,4610,16323,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 23 (code 2337).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2349,Xian 1980 / 3-degree Gauss-Kruger zone 25,2711,projected,4530,,4610,16285,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 75E (code 2370).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2350,Xian 1980 / 3-degree Gauss-Kruger zone 26,2712,projected,4530,,4610,16286,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 78E (code 2371).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2351,Xian 1980 / 3-degree Gauss-Kruger zone 27,2713,projected,4530,,4610,16287,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 81E (code 2372).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2352,Xian 1980 / 3-degree Gauss-Kruger zone 28,2714,projected,4530,,4610,16288,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 84E (code 2373).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2353,Xian 1980 / 3-degree Gauss-Kruger zone 29,2715,projected,4530,,4610,16289,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 87E (code 2374).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2354,Xian 1980 / 3-degree Gauss-Kruger zone 30,2716,projected,4530,,4610,16290,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 90E (code 2375).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2355,Xian 1980 / 3-degree Gauss-Kruger zone 31,2717,projected,4530,,4610,16291,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 93E (code 2376).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2356,Xian 1980 / 3-degree Gauss-Kruger zone 32,2718,projected,4530,,4610,16292,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 96E (code 2377).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2357,Xian 1980 / 3-degree Gauss-Kruger zone 33,2719,projected,4530,,4610,16293,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 99E (code 2378).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2358,Xian 1980 / 3-degree Gauss-Kruger zone 34,2720,projected,4530,,4610,16294,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 102E (code 2379).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2359,Xian 1980 / 3-degree Gauss-Kruger zone 35,2721,projected,4530,,4610,16295,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 105E (code 2380).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2360,Xian 1980 / 3-degree Gauss-Kruger zone 36,2722,projected,4530,,4610,16296,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 108E (code 2381).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2361,Xian 1980 / 3-degree Gauss-Kruger zone 37,2723,projected,4530,,4610,16297,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 111E (code 2382).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2362,Xian 1980 / 3-degree Gauss-Kruger zone 38,2724,projected,4530,,4610,16298,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 114E (code 2383).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2363,Xian 1980 / 3-degree Gauss-Kruger zone 39,2725,projected,4530,,4610,16299,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 117E (code 2384).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2364,Xian 1980 / 3-degree Gauss-Kruger zone 40,2726,projected,4530,,4610,16070,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 123E (code 2385).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2365,Xian 1980 / 3-degree Gauss-Kruger zone 41,2727,projected,4530,,4610,16071,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 126E (code 2386).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2366,Xian 1980 / 3-degree Gauss-Kruger zone 42,2728,projected,4530,,4610,16072,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 126E (code 2387).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2367,Xian 1980 / 3-degree Gauss-Kruger zone 43,2729,projected,4530,,4610,16073,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 129E (code 2388).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2368,Xian 1980 / 3-degree Gauss-Kruger zone 44,2730,projected,4530,,4610,16074,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 132E (code 2389).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2369,Xian 1980 / 3-degree Gauss-Kruger zone 45,2731,projected,4530,,4610,16075,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 135E (code 2390).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2370,Xian 1980 / 3-degree Gauss-Kruger CM 75E,2711,projected,4530,,4610,16385,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 25 (code 2349).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2371,Xian 1980 / 3-degree Gauss-Kruger CM 78E,2712,projected,4530,,4610,16386,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 26 (code 2350).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2372,Xian 1980 / 3-degree Gauss-Kruger CM 81E,2713,projected,4530,,4610,16387,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 27 (code 2351).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2373,Xian 1980 / 3-degree Gauss-Kruger CM 84E,2714,projected,4530,,4610,16388,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 28 (code 2352).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2374,Xian 1980 / 3-degree Gauss-Kruger CM 87E,2715,projected,4530,,4610,16389,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 29 (code 2353).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2375,Xian 1980 / 3-degree Gauss-Kruger CM 90E,2716,projected,4530,,4610,16390,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 30 (code 2354).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2376,Xian 1980 / 3-degree Gauss-Kruger CM 93E,2717,projected,4530,,4610,16391,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 31 (code 2355).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2377,Xian 1980 / 3-degree Gauss-Kruger CM 96E,2718,projected,4530,,4610,16392,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 32 (code 2356).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2378,Xian 1980 / 3-degree Gauss-Kruger CM 99E,2719,projected,4530,,4610,16393,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 33 (code 2357).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2379,Xian 1980 / 3-degree Gauss-Kruger CM 102E,2720,projected,4530,,4610,16394,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 34 (code 2358).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2380,Xian 1980 / 3-degree Gauss-Kruger CM 105E,2721,projected,4530,,4610,16395,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 35 (code 2359).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2381,Xian 1980 / 3-degree Gauss-Kruger CM 108E,2722,projected,4530,,4610,16396,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 36 (code 2360).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2382,Xian 1980 / 3-degree Gauss-Kruger CM 111E,2723,projected,4530,,4610,16397,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 37 (code 2361).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2383,Xian 1980 / 3-degree Gauss-Kruger CM 114E,2724,projected,4530,,4610,16398,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 38 (code 2362).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2384,Xian 1980 / 3-degree Gauss-Kruger CM 117E,2725,projected,4530,,4610,16399,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 39 (code 2363).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2385,Xian 1980 / 3-degree Gauss-Kruger CM 120E,2726,projected,4530,,4610,16170,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 40 (code 2364).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2386,Xian 1980 / 3-degree Gauss-Kruger CM 123E,2727,projected,4530,,4610,16171,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 41 (code 2365).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2387,Xian 1980 / 3-degree Gauss-Kruger CM 126E,2728,projected,4530,,4610,16172,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 42 (code 2366).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2388,Xian 1980 / 3-degree Gauss-Kruger CM 129E,2729,projected,4530,,4610,16173,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 43 (code 2367).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2389,Xian 1980 / 3-degree Gauss-Kruger CM 132E,2730,projected,4530,,4610,16174,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 44 (code 2368).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2390,Xian 1980 / 3-degree Gauss-Kruger CM 135E,2731,projected,4530,,4610,16175,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 45 (code 2369).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2391,KKJ / Finland zone 1,1536,projected,4530,,4123,18191,,,Large and medium scale topographic mapping and engineering survey.,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+2392,KKJ / Finland zone 2,1537,projected,4530,,4123,18192,,,Large and medium scale topographic mapping and engineering survey.,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+2393,KKJ / Finland Uniform Coordinate System,1538,projected,4530,,4123,18193,,,Large and medium scale topographic mapping and engineering survey.,Known as Uniform Coordinate System when used over all country and also as Basic Coordinate System zone 3 at larger scales.,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+2394,KKJ / Finland zone 4,1539,projected,4530,,4123,18194,,,Large and medium scale topographic mapping and engineering survey.,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+2395,South Yemen / Gauss-Kruger zone 8,1492,projected,4530,,4164,16208,,,Large and medium scale topographic mapping and engineering survey.,,IGN Paris,EPSG,2002-06-22 00:00:00,,1,0
+2396,South Yemen / Gauss-Kruger zone 9,1493,projected,4530,,4164,16209,,,Large and medium scale topographic mapping and engineering survey.,,IGN Paris,EPSG,2002-06-22 00:00:00,,1,0
+2397,Pulkovo 1942(83) / Gauss-Kruger zone 3,1512,projected,4530,,4178,16263,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",In Thuringen superseded by DHDN / Gauss Kruger zone 3.,EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2398,Pulkovo 1942(83) / Gauss-Kruger zone 4,1513,projected,4530,,4178,16264,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.","In Brandenburg superseded by ETRS89 / UTM zone 33N.
+In Sachsen and Thuringen superseded by DHDN / Gauss Kruger zone 4.",Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2399,Pulkovo 1942(83) / Gauss-Kruger zone 5,1512,projected,4530,,4178,16265,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.","In Brandenburg superseded by ETRS89 / UTM zone 33N.
+In Sachsen superseded by DHDN / Gauss Kruger zone 5.",Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2400,RT90 2.5 gon W,1225,projected,4530,,4124,19929,,,Large and medium scale topographic mapping and engineering survey.,,National Land Survey of Sweden,EPSG,1997-11-13 00:00:00,,1,0
+2401,Beijing 1954 / 3-degree Gauss-Kruger zone 25,2711,projected,4530,,4214,16285,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 75E (code 2422). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 25 (code 2349).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2402,Beijing 1954 / 3-degree Gauss-Kruger zone 26,2712,projected,4530,,4214,16286,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 78E (code 2423). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 26 (code 2350).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2403,Beijing 1954 / 3-degree Gauss-Kruger zone 27,2713,projected,4530,,4214,16287,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 81E (code 2424). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 27 (code 2351).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2404,Beijing 1954 / 3-degree Gauss-Kruger zone 28,2714,projected,4530,,4214,16288,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 84E (code 2425). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 28 (code 2352).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2405,Beijing 1954 / 3-degree Gauss-Kruger zone 29,2715,projected,4530,,4214,16289,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 87E (code 2426). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 29 (code 2353).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2406,Beijing 1954 / 3-degree Gauss-Kruger zone 30,2716,projected,4530,,4214,16290,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 90E (code 2427). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 30 (code 2354).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2407,Beijing 1954 / 3-degree Gauss-Kruger zone 31,2717,projected,4530,,4214,16291,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 93E (code 2428). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 31 (code 2355).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2408,Beijing 1954 / 3-degree Gauss-Kruger zone 32,2718,projected,4530,,4214,16292,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 96E (code 2429). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 32 (code 2356).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2409,Beijing 1954 / 3-degree Gauss-Kruger zone 33,2719,projected,4530,,4214,16293,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 99E (code 2430). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 33 (code 2357).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2410,Beijing 1954 / 3-degree Gauss-Kruger zone 34,2720,projected,4530,,4214,16294,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 102E (code 2431). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 34 (code 2358).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2411,Beijing 1954 / 3-degree Gauss-Kruger zone 35,2721,projected,4530,,4214,16295,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 105E (code 2432). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 35 (code 2359).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2412,Beijing 1954 / 3-degree Gauss-Kruger zone 36,2722,projected,4530,,4214,16296,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 108E (code 2433). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 36 (code 2360).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2413,Beijing 1954 / 3-degree Gauss-Kruger zone 37,2723,projected,4530,,4214,16297,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 111E (code 2434). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 37 (code 2361).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2414,Beijing 1954 / 3-degree Gauss-Kruger zone 38,2724,projected,4530,,4214,16298,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 114E (code 2435). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 38 (code 2362).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2415,Beijing 1954 / 3-degree Gauss-Kruger zone 39,2725,projected,4530,,4214,16299,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 117E (code 2436). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 39 (code 2363).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2416,Beijing 1954 / 3-degree Gauss-Kruger zone 40,2726,projected,4530,,4214,16070,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 120E (code 2437). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 40 (code 2364).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2417,Beijing 1954 / 3-degree Gauss-Kruger zone 41,2727,projected,4530,,4214,16071,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 123E (code 2438). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 41 (code 2365).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2418,Beijing 1954 / 3-degree Gauss-Kruger zone 42,2728,projected,4530,,4214,16072,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 126E (code 2439). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 42 (code 2366).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2419,Beijing 1954 / 3-degree Gauss-Kruger zone 43,2729,projected,4530,,4214,16073,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 129E (code 2440). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 43 (code 2367).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2420,Beijing 1954 / 3-degree Gauss-Kruger zone 44,2730,projected,4530,,4214,16074,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 132E (code 2441). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 44 (code 2368).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2421,Beijing 1954 / 3-degree Gauss-Kruger zone 45,2731,projected,4530,,4214,16075,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 135E (code 2442). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 45 (code 2369).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2422,Beijing 1954 / 3-degree Gauss-Kruger CM 75E,2711,projected,4530,,4214,16385,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 25 (code 2401). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 75E (code 2370).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2423,Beijing 1954 / 3-degree Gauss-Kruger CM 78E,2712,projected,4530,,4214,16386,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 26 (code 2402). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 78E (code 2371).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2424,Beijing 1954 / 3-degree Gauss-Kruger CM 81E,2713,projected,4530,,4214,16387,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 27 (code 2403). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 81E (code 2372).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2425,Beijing 1954 / 3-degree Gauss-Kruger CM 84E,2714,projected,4530,,4214,16388,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 28 (code 2404). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 84E (code 2373).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2426,Beijing 1954 / 3-degree Gauss-Kruger CM 87E,2715,projected,4530,,4214,16389,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 29 (code 2405). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 87E (code 2374).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2427,Beijing 1954 / 3-degree Gauss-Kruger CM 90E,2716,projected,4530,,4214,16390,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 30 (code 2406). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 90E (code 2375).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2428,Beijing 1954 / 3-degree Gauss-Kruger CM 93E,2717,projected,4530,,4214,16391,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 31 (code 2407). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 93E (code 2376).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2429,Beijing 1954 / 3-degree Gauss-Kruger CM 96E,2718,projected,4530,,4214,16392,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 32 (code 2408). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 96E (code 2377).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2430,Beijing 1954 / 3-degree Gauss-Kruger CM 99E,2719,projected,4530,,4214,16393,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 33 (code 2409). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 99E (code 2378).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2431,Beijing 1954 / 3-degree Gauss-Kruger CM 102E,2720,projected,4530,,4214,16394,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 45 (code 2421). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 102E (code 2379).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2432,Beijing 1954 / 3-degree Gauss-Kruger CM 105E,2721,projected,4530,,4214,16395,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 35 (code 2411). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 105E (code 2380).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2433,Beijing 1954 / 3-degree Gauss-Kruger CM 108E,2722,projected,4530,,4214,16396,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 36 (code 2412). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 108E (code 2381).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2434,Beijing 1954 / 3-degree Gauss-Kruger CM 111E,2723,projected,4530,,4214,16397,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 37 (code 2413). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 111E (code 2382).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2435,Beijing 1954 / 3-degree Gauss-Kruger CM 114E,2724,projected,4530,,4214,16398,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 38 (code 2414). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 114E (code 2383).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2436,Beijing 1954 / 3-degree Gauss-Kruger CM 117E,2725,projected,4530,,4214,16399,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 39 (code 2415). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 117E (code 2384).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2437,Beijing 1954 / 3-degree Gauss-Kruger CM 120E,2726,projected,4530,,4214,16170,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 40 (code 2416). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 120E (code 2385).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2438,Beijing 1954 / 3-degree Gauss-Kruger CM 123E,2727,projected,4530,,4214,16171,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 41 (code 2417). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 123E (code 2386).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2439,Beijing 1954 / 3-degree Gauss-Kruger CM 126E,2728,projected,4530,,4214,16172,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 42 (code 2418). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 126E (code 2387).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2440,Beijing 1954 / 3-degree Gauss-Kruger CM 129E,2729,projected,4530,,4214,16173,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 43 (code 2419). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 129E (code 2388).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2441,Beijing 1954 / 3-degree Gauss-Kruger CM 132E,2730,projected,4530,,4214,16174,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 44 (code 2420). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 132E (code 2389).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2442,Beijing 1954 / 3-degree Gauss-Kruger CM 135E,2731,projected,4530,,4214,16175,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 45 (code 2421). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 135E (code 2390).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2443,JGD2000 / Japan Plane Rectangular CS I,1854,projected,4530,,4612,17801,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS I (code 30161).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2444,JGD2000 / Japan Plane Rectangular CS II,1855,projected,4530,,4612,17802,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS II (code 30162).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2445,JGD2000 / Japan Plane Rectangular CS III,1856,projected,4530,,4612,17803,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS III (code 30163).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2446,JGD2000 / Japan Plane Rectangular CS IV,1857,projected,4530,,4612,17804,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS IV (code 30164).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2447,JGD2000 / Japan Plane Rectangular CS V,1858,projected,4530,,4612,17805,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS V (code 30165).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2448,JGD2000 / Japan Plane Rectangular CS VI,1859,projected,4530,,4612,17806,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS VI (code 30166).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2449,JGD2000 / Japan Plane Rectangular CS VII,1860,projected,4530,,4612,17807,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS VII (code 30167).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2450,JGD2000 / Japan Plane Rectangular CS VIII,1861,projected,4530,,4612,17808,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS VIII (code 30168).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2451,JGD2000 / Japan Plane Rectangular CS IX,1862,projected,4530,,4612,17809,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS IX (code 30169).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2452,JGD2000 / Japan Plane Rectangular CS X,1863,projected,4530,,4612,17810,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS X (code 30170).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2453,JGD2000 / Japan Plane Rectangular CS XI,1864,projected,4530,,4612,17811,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XI (code 30171).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2454,JGD2000 / Japan Plane Rectangular CS XII,1865,projected,4530,,4612,17812,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XII (code 30172).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2455,JGD2000 / Japan Plane Rectangular CS XIII,1866,projected,4530,,4612,17813,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XIII (code 30173).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2456,JGD2000 / Japan Plane Rectangular CS XIV,1867,projected,4530,,4612,17814,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XIV (code 30174).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2457,JGD2000 / Japan Plane Rectangular CS XV,1868,projected,4530,,4612,17815,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XV (code 30175).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2458,JGD2000 / Japan Plane Rectangular CS XVI,1869,projected,4530,,4612,17816,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XVI (code 30176).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2459,JGD2000 / Japan Plane Rectangular CS XVII,1870,projected,4530,,4612,17817,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XVII (code 30177).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2460,JGD2000 / Japan Plane Rectangular CS XVIII,1871,projected,4530,,4612,17818,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XVIII (code 30178).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2461,JGD2000 / Japan Plane Rectangular CS XIX,1872,projected,4530,,4612,17819,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XIX (code 30179).,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2462,Albanian 1987 / Gauss-Kruger zone 4,1025,projected,4530,,4191,16204,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",,EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2463,Pulkovo 1995 / Gauss-Kruger CM 21E,1763,projected,4530,,4200,16304,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 4 (code 20004).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,0
+2464,Pulkovo 1995 / Gauss-Kruger CM 27E,1764,projected,4530,,4200,16305,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 5 (code 20005).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2465,Pulkovo 1995 / Gauss-Kruger CM 33E,1765,projected,4530,,4200,16306,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 6 (code 20006).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2466,Pulkovo 1995 / Gauss-Kruger CM 39E,1766,projected,4530,,4200,16307,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 7 (code 20007).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2467,Pulkovo 1995 / Gauss-Kruger CM 45E,1767,projected,4530,,4200,16308,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 8 (code 20008).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2468,Pulkovo 1995 / Gauss-Kruger CM 51E,1768,projected,4530,,4200,16309,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 9 (code 20009).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2469,Pulkovo 1995 / Gauss-Kruger CM 57E,1769,projected,4530,,4200,16310,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 10 (code 20010).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2470,Pulkovo 1995 / Gauss-Kruger CM 63E,1770,projected,4530,,4200,16311,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 11 (code 20011).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2471,Pulkovo 1995 / Gauss-Kruger CM 69E,1771,projected,4530,,4200,16312,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 12 (code 20012).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2472,Pulkovo 1995 / Gauss-Kruger CM 75E,1772,projected,4530,,4200,16313,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 13 (code 20013).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2473,Pulkovo 1995 / Gauss-Kruger CM 81E,1773,projected,4530,,4200,16314,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 14 (code 20014).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2474,Pulkovo 1995 / Gauss-Kruger CM 87E,1774,projected,4530,,4200,16315,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 15 (code 20015).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2475,Pulkovo 1995 / Gauss-Kruger CM 93E,1775,projected,4530,,4200,16316,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 16 (code 20016).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2476,Pulkovo 1995 / Gauss-Kruger CM 99E,1776,projected,4530,,4200,16317,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 17 (code 20017).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2477,Pulkovo 1995 / Gauss-Kruger CM 105E,1777,projected,4530,,4200,16318,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 18 (code 20018).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2478,Pulkovo 1995 / Gauss-Kruger CM 111E,1778,projected,4530,,4200,16319,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 19 (code 20019).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2479,Pulkovo 1995 / Gauss-Kruger CM 117E,1779,projected,4530,,4200,16320,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 20 (code 20020).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2480,Pulkovo 1995 / Gauss-Kruger CM 123E,1780,projected,4530,,4200,16321,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 21 (code 20021).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2481,Pulkovo 1995 / Gauss-Kruger CM 129E,1781,projected,4530,,4200,16322,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 22 (code 20022).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2482,Pulkovo 1995 / Gauss-Kruger CM 135E,1782,projected,4530,,4200,16323,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 23 (code 20023).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2483,Pulkovo 1995 / Gauss-Kruger CM 141E,1783,projected,4530,,4200,16324,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 24 (code 20024).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2484,Pulkovo 1995 / Gauss-Kruger CM 147E,1784,projected,4530,,4200,16325,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 25 (code 20025).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2485,Pulkovo 1995 / Gauss-Kruger CM 153E,1785,projected,4530,,4200,16326,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 26 (code 20026).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2486,Pulkovo 1995 / Gauss-Kruger CM 159E,1786,projected,4530,,4200,16327,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 27 (code 20027).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2487,Pulkovo 1995 / Gauss-Kruger CM 165E,1787,projected,4530,,4200,16328,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 28 (code 20028).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2488,Pulkovo 1995 / Gauss-Kruger CM 171E,1788,projected,4530,,4200,16329,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 29 (code 20029).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2489,Pulkovo 1995 / Gauss-Kruger CM 177E,1789,projected,4530,,4200,16330,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 30 (code 20030).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2490,Pulkovo 1995 / Gauss-Kruger CM 177W,1790,projected,4530,,4200,16331,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 31 (code 20031).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2491,Pulkovo 1995 / Gauss-Kruger CM 171W,1791,projected,4530,,4200,16332,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 32 (code 20032).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2492,Pulkovo 1942 / Gauss-Kruger CM 9E,1805,projected,4530,,4284,16302,,,Military mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 2 (code 28402).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2493,Pulkovo 1942 / Gauss-Kruger CM 15E,1792,projected,4530,,4284,16303,,,Military mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 3 (code 28403).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2494,Pulkovo 1942 / Gauss-Kruger CM 21E,1793,projected,4530,,4284,16304,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 4 (code 28404).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2495,Pulkovo 1942 / Gauss-Kruger CM 27E,1794,projected,4530,,4284,16305,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 5 (code 28405).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2496,Pulkovo 1942 / Gauss-Kruger CM 33E,1795,projected,4530,,4284,16306,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 6 (code 28406).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2497,Pulkovo 1942 / Gauss-Kruger CM 39E,1796,projected,4530,,4284,16307,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 7 (code 28407).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2498,Pulkovo 1942 / Gauss-Kruger CM 45E,1797,projected,4530,,4284,16308,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 8 (code 28408).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2499,Pulkovo 1942 / Gauss-Kruger CM 51E,1798,projected,4530,,4284,16309,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 9 (code 28409).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2500,Pulkovo 1942 / Gauss-Kruger CM 57E,1799,projected,4530,,4284,16310,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 10 (code 28410).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2501,Pulkovo 1942 / Gauss-Kruger CM 63E,1800,projected,4530,,4284,16311,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 11 (code 28411).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2502,Pulkovo 1942 / Gauss-Kruger CM 69E,1801,projected,4530,,4284,16312,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 12 (code 28412).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2503,Pulkovo 1942 / Gauss-Kruger CM 75E,1802,projected,4530,,4284,16313,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 13 (code 28413).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2504,Pulkovo 1942 / Gauss-Kruger CM 81E,1803,projected,4530,,4284,16314,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 14 (code 28414).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2505,Pulkovo 1942 / Gauss-Kruger CM 87E,1804,projected,4530,,4284,16315,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 15 (code 28415).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2506,Pulkovo 1942 / Gauss-Kruger CM 93E,1775,projected,4530,,4284,16316,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 16 (code 28416).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2507,Pulkovo 1942 / Gauss-Kruger CM 99E,1776,projected,4530,,4284,16317,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 17 (code 28417).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2508,Pulkovo 1942 / Gauss-Kruger CM 105E,1777,projected,4530,,4284,16318,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 18 (code 28418).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2509,Pulkovo 1942 / Gauss-Kruger CM 111E,1778,projected,4530,,4284,16319,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 19 (code 28419).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2510,Pulkovo 1942 / Gauss-Kruger CM 117E,1779,projected,4530,,4284,16320,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 20 (code 28420).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2511,Pulkovo 1942 / Gauss-Kruger CM 123E,1780,projected,4530,,4284,16321,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 21 (code 28421).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2512,Pulkovo 1942 / Gauss-Kruger CM 129E,1781,projected,4530,,4284,16322,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 22 (code 28422).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2513,Pulkovo 1942 / Gauss-Kruger CM 135E,1782,projected,4530,,4284,16323,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 23 (code 28423).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2514,Pulkovo 1942 / Gauss-Kruger CM 141E,1783,projected,4530,,4284,16324,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 24 (code 28424).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2515,Pulkovo 1942 / Gauss-Kruger CM 147E,1784,projected,4530,,4284,16325,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 25 (code 28425).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2516,Pulkovo 1942 / Gauss-Kruger CM 153E,1785,projected,4530,,4284,16326,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 26 (code 28426).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2517,Pulkovo 1942 / Gauss-Kruger CM 159E,1786,projected,4530,,4284,16327,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 27 (code 28427).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2518,Pulkovo 1942 / Gauss-Kruger CM 165E,1787,projected,4530,,4284,16328,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 28 (code 28428).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2519,Pulkovo 1942 / Gauss-Kruger CM 171E,1788,projected,4530,,4284,16329,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 29 (code 28429).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2520,Pulkovo 1942 / Gauss-Kruger CM 177E,1789,projected,4530,,4284,16330,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 30 (code 28430).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2521,Pulkovo 1942 / Gauss-Kruger CM 177W,1790,projected,4530,,4284,16331,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 31 (code 28431).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2522,Pulkovo 1942 / Gauss-Kruger CM 171W,1791,projected,4530,,4284,16332,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 32 (code 28432).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2523,Pulkovo 1942 / 3-degree Gauss-Kruger zone 7,2653,projected,4530,,4284,16267,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 21E (code 2582).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2524,Pulkovo 1942 / 3-degree Gauss-Kruger zone 8,2654,projected,4530,,4284,16268,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 24E (code 2583).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2525,Pulkovo 1942 / 3-degree Gauss-Kruger zone 9,2655,projected,4530,,4284,16269,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 27E (code 2584).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2526,Pulkovo 1942 / 3-degree Gauss-Kruger zone 10,2656,projected,4530,,4284,16270,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 30E (code 2585).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2527,Pulkovo 1942 / 3-degree Gauss-Kruger zone 11,2657,projected,4530,,4284,16271,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 33E (code 2586).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2528,Pulkovo 1942 / 3-degree Gauss-Kruger zone 12,2658,projected,4530,,4284,16272,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 36E (code 2587).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2529,Pulkovo 1942 / 3-degree Gauss-Kruger zone 13,2659,projected,4530,,4284,16273,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 39E (code 2588).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2530,Pulkovo 1942 / 3-degree Gauss-Kruger zone 14,2660,projected,4530,,4284,16274,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 42E (code 2589).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2531,Pulkovo 1942 / 3-degree Gauss-Kruger zone 15,2661,projected,4530,,4284,16275,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 45E (code 2590).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2532,Pulkovo 1942 / 3-degree Gauss-Kruger zone 16,2662,projected,4530,,4284,16276,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 48E (code 2591).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2533,Pulkovo 1942 / 3-degree Gauss-Kruger zone 17,2663,projected,4530,,4284,16277,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 51E (code 2592).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2534,Pulkovo 1942 / 3-degree Gauss-Kruger zone 18,2664,projected,4530,,4284,16278,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 54E (code 2593).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2535,Pulkovo 1942 / 3-degree Gauss-Kruger zone 19,2665,projected,4530,,4284,16279,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 57E (code 2594).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2536,Pulkovo 1942 / 3-degree Gauss-Kruger zone 20,2666,projected,4530,,4284,16280,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 60E (code 2595).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2537,Pulkovo 1942 / 3-degree Gauss-Kruger zone 21,2667,projected,4530,,4284,16281,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 63E (code 2596).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2538,Pulkovo 1942 / 3-degree Gauss-Kruger zone 22,2668,projected,4530,,4284,16282,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 66E (code 2597).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2539,Pulkovo 1942 / 3-degree Gauss-Kruger zone 23,2669,projected,4530,,4284,16283,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 69E (code 2598).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2540,Pulkovo 1942 / 3-degree Gauss-Kruger zone 24,2670,projected,4530,,4284,16284,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 72E (code 2599).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2541,Pulkovo 1942 / 3-degree Gauss-Kruger zone 25,2671,projected,4530,,4284,16285,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 75E (code 2601).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2542,Pulkovo 1942 / 3-degree Gauss-Kruger zone 26,2672,projected,4530,,4284,16286,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 78E (code 2602).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2543,Pulkovo 1942 / 3-degree Gauss-Kruger zone 27,2673,projected,4530,,4284,16287,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 81E (code 2603).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2544,Pulkovo 1942 / 3-degree Gauss-Kruger zone 28,2674,projected,4530,,4284,16288,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 84E (code 2604).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2545,Pulkovo 1942 / 3-degree Gauss-Kruger zone 29,2675,projected,4530,,4284,16289,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 87E (code 2605).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2546,Pulkovo 1942 / 3-degree Gauss-Kruger zone 30,2676,projected,4530,,4284,16290,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 90E (code 2606).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2547,Pulkovo 1942 / 3-degree Gauss-Kruger zone 31,2677,projected,4530,,4284,16291,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 93E (code 2607).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2548,Pulkovo 1942 / 3-degree Gauss-Kruger zone 32,2678,projected,4530,,4284,16292,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 96E (code 2608).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2549,Pulkovo 1942 / 3-degree Gauss-Kruger zone 33,2679,projected,4530,,4284,16293,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 99E (code 2609).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2550,Samboja / UTM zone 50S,1328,projected,4400,,4125,16150,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,1
+2551,Pulkovo 1942 / 3-degree Gauss-Kruger zone 34,2680,projected,4530,,4284,16294,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 102E (code 2610).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2552,Pulkovo 1942 / 3-degree Gauss-Kruger zone 35,2681,projected,4530,,4284,16295,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 105E (code 2611).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2553,Pulkovo 1942 / 3-degree Gauss-Kruger zone 36,2682,projected,4530,,4284,16296,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 108E (code 2612).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2554,Pulkovo 1942 / 3-degree Gauss-Kruger zone 37,2683,projected,4530,,4284,16297,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 111E (code 2613).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2555,Pulkovo 1942 / 3-degree Gauss-Kruger zone 38,2684,projected,4530,,4284,16298,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 114E (code 2614).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2556,Pulkovo 1942 / 3-degree Gauss-Kruger zone 39,2685,projected,4530,,4284,16299,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 117E (code 2615).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2557,Pulkovo 1942 / 3-degree Gauss-Kruger zone 40,2686,projected,4530,,4284,16070,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 120E (code 2616).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2558,Pulkovo 1942 / 3-degree Gauss-Kruger zone 41,2687,projected,4530,,4284,16071,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 123E (code 2617).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2559,Pulkovo 1942 / 3-degree Gauss-Kruger zone 42,2688,projected,4530,,4284,16072,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 126E (code 2618).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2560,Pulkovo 1942 / 3-degree Gauss-Kruger zone 43,2689,projected,4530,,4284,16073,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 129E (code 2619).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2561,Pulkovo 1942 / 3-degree Gauss-Kruger zone 44,2690,projected,4530,,4284,16074,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 132E (code 2620).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2562,Pulkovo 1942 / 3-degree Gauss-Kruger zone 45,2691,projected,4530,,4284,16075,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 135E (code 2621).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2563,Pulkovo 1942 / 3-degree Gauss-Kruger zone 46,2692,projected,4530,,4284,16076,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 138E (code 2622).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2564,Pulkovo 1942 / 3-degree Gauss-Kruger zone 47,2693,projected,4530,,4284,16077,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 141E (code 2623).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2565,Pulkovo 1942 / 3-degree Gauss-Kruger zone 48,2694,projected,4530,,4284,16078,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 144E (code 2624).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2566,Pulkovo 1942 / 3-degree Gauss-Kruger zone 49,2695,projected,4530,,4284,16079,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 147E (code 2625).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2567,Pulkovo 1942 / 3-degree Gauss-Kruger zone 50,2696,projected,4530,,4284,16080,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 150E (code 2626).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2568,Pulkovo 1942 / 3-degree Gauss-Kruger zone 51,2697,projected,4530,,4284,16081,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 153E (code 2627).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2569,Pulkovo 1942 / 3-degree Gauss-Kruger zone 52,2698,projected,4530,,4284,16082,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 156E (code 2628).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2570,Pulkovo 1942 / 3-degree Gauss-Kruger zone 53,2699,projected,4530,,4284,16083,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 159E (code 2629).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2571,Pulkovo 1942 / 3-degree Gauss-Kruger zone 54,2700,projected,4530,,4284,16084,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 162E (code 2630).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2572,Pulkovo 1942 / 3-degree Gauss-Kruger zone 55,2701,projected,4530,,4284,16085,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 165E (code 2631).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2573,Pulkovo 1942 / 3-degree Gauss-Kruger zone 56,2702,projected,4530,,4284,16086,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 168E (code 2632).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2574,Pulkovo 1942 / 3-degree Gauss-Kruger zone 57,2703,projected,4530,,4284,16087,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 171E (code 2633).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2575,Pulkovo 1942 / 3-degree Gauss-Kruger zone 58,2704,projected,4530,,4284,16088,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 174E (code 2634).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2576,Pulkovo 1942 / 3-degree Gauss-Kruger zone 59,2705,projected,4530,,4284,16089,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 177E (code 2635).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2577,Pulkovo 1942 / 3-degree Gauss-Kruger zone 60,2706,projected,4530,,4284,16090,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 180E (code 2636).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2578,Pulkovo 1942 / 3-degree Gauss-Kruger zone 61,2707,projected,4530,,4284,16091,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 177W (code 2637).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2579,Pulkovo 1942 / 3-degree Gauss-Kruger zone 62,2708,projected,4530,,4284,16092,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 174W (code 2638).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2580,Pulkovo 1942 / 3-degree Gauss-Kruger zone 63,2709,projected,4530,,4284,16093,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 171W (code 2639).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2581,Pulkovo 1942 / 3-degree Gauss-Kruger zone 64,2710,projected,4530,,4284,16094,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 168W (code 2640).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2582,Pulkovo 1942 / 3-degree Gauss-Kruger CM 21E,2747,projected,4530,,4284,16367,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 7 (code 2523).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2583,Pulkovo 1942 / 3-degree Gauss-Kruger CM 24E,2654,projected,4530,,4284,16368,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 8 (code 2524).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2584,Pulkovo 1942 / 3-degree Gauss-Kruger CM 27E,2655,projected,4530,,4284,16369,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 9 (code 2525).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2585,Pulkovo 1942 / 3-degree Gauss-Kruger CM 30E,2656,projected,4530,,4284,16370,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 10 (code 2526).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2586,Pulkovo 1942 / 3-degree Gauss-Kruger CM 33E,2657,projected,4530,,4284,16371,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 11 (code 2527).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2587,Pulkovo 1942 / 3-degree Gauss-Kruger CM 36E,2658,projected,4530,,4284,16372,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 12 (code 2528).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2588,Pulkovo 1942 / 3-degree Gauss-Kruger CM 39E,2659,projected,4530,,4284,16373,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 13 (code 2529).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2589,Pulkovo 1942 / 3-degree Gauss-Kruger CM 42E,2660,projected,4530,,4284,16374,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 14 (code 2530).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2590,Pulkovo 1942 / 3-degree Gauss-Kruger CM 45E,2661,projected,4530,,4284,16375,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 15 (code 2531).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2591,Pulkovo 1942 / 3-degree Gauss-Kruger CM 48E,2662,projected,4530,,4284,16376,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 16 (code 2532).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2592,Pulkovo 1942 / 3-degree Gauss-Kruger CM 51E,2663,projected,4530,,4284,16377,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 17 (code 2533).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2593,Pulkovo 1942 / 3-degree Gauss-Kruger CM 54E,2664,projected,4530,,4284,16378,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 18 (code 2534).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2594,Pulkovo 1942 / 3-degree Gauss-Kruger CM 57E,2665,projected,4530,,4284,16379,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 19 (code 2535).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2595,Pulkovo 1942 / 3-degree Gauss-Kruger CM 60E,2666,projected,4530,,4284,16380,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 20 (code 2536).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2596,Pulkovo 1942 / 3-degree Gauss-Kruger CM 63E,2667,projected,4530,,4284,16381,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 21 (code 2537).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2597,Pulkovo 1942 / 3-degree Gauss-Kruger CM 66E,2668,projected,4530,,4284,16382,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 22 (code 2538).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2598,Pulkovo 1942 / 3-degree Gauss-Kruger CM 69E,2669,projected,4530,,4284,16383,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 23 (code 2539).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2599,Pulkovo 1942 / 3-degree Gauss-Kruger CM 72E,2670,projected,4530,,4284,16384,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 24 (code 2540).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2600,Lietuvos Koordinoei Sistema 1994,1145,projected,4530,,4126,19934,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1998-03-12 00:00:00,,1,0
+2601,Pulkovo 1942 / 3-degree Gauss-Kruger CM 75E,2671,projected,4530,,4284,16385,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 25 (code 2541).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2602,Pulkovo 1942 / 3-degree Gauss-Kruger CM 78E,2672,projected,4530,,4284,16386,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 26 (code 2542).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2603,Pulkovo 1942 / 3-degree Gauss-Kruger CM 81E,2673,projected,4530,,4284,16387,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 27 (code 2543).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2604,Pulkovo 1942 / 3-degree Gauss-Kruger CM 84E,2674,projected,4530,,4284,16388,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 28 (code 2544).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2605,Pulkovo 1942 / 3-degree Gauss-Kruger CM 87E,2675,projected,4530,,4284,16389,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 29 (code 2545).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2606,Pulkovo 1942 / 3-degree Gauss-Kruger CM 90E,2676,projected,4530,,4284,16390,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 30 (code 2546).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2607,Pulkovo 1942 / 3-degree Gauss-Kruger CM 93E,2677,projected,4530,,4284,16391,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 31 (code 2547).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2608,Pulkovo 1942 / 3-degree Gauss-Kruger CM 96E,2678,projected,4530,,4284,16392,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 32 (code 2548).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2609,Pulkovo 1942 / 3-degree Gauss-Kruger CM 99E,2679,projected,4530,,4284,16393,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 33 (code 2549).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2610,Pulkovo 1942 / 3-degree Gauss-Kruger CM 102E,2680,projected,4530,,4284,16394,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 34 (code 2551).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2611,Pulkovo 1942 / 3-degree Gauss-Kruger CM 105E,2681,projected,4530,,4284,16395,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 35 (code 2552).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2612,Pulkovo 1942 / 3-degree Gauss-Kruger CM 108E,2682,projected,4530,,4284,16396,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 36 (code 2553).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2613,Pulkovo 1942 / 3-degree Gauss-Kruger CM 111E,2683,projected,4530,,4284,16397,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 37 (code 2554).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2614,Pulkovo 1942 / 3-degree Gauss-Kruger CM 114E,2684,projected,4530,,4284,16398,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 38 (code 2555).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2615,Pulkovo 1942 / 3-degree Gauss-Kruger CM 117E,2685,projected,4530,,4284,16399,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 39 (code 2556).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2616,Pulkovo 1942 / 3-degree Gauss-Kruger CM 120E,2686,projected,4530,,4284,16170,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 40 (code 2557).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2617,Pulkovo 1942 / 3-degree Gauss-Kruger CM 123E,2687,projected,4530,,4284,16171,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 41 (code 2558).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2618,Pulkovo 1942 / 3-degree Gauss-Kruger CM 126E,2688,projected,4530,,4284,16172,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 42 (code 2559).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2619,Pulkovo 1942 / 3-degree Gauss-Kruger CM 129E,2689,projected,4530,,4284,16173,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 43 (code 2560).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2620,Pulkovo 1942 / 3-degree Gauss-Kruger CM 132E,2690,projected,4530,,4284,16174,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 44 (code 2561).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2621,Pulkovo 1942 / 3-degree Gauss-Kruger CM 135E,2691,projected,4530,,4284,16175,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 45 (code 2562).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2622,Pulkovo 1942 / 3-degree Gauss-Kruger CM 138E,2692,projected,4530,,4284,16176,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 46 (code 2563).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2623,Pulkovo 1942 / 3-degree Gauss-Kruger CM 141E,2693,projected,4530,,4284,16177,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 47 (code 2564).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2624,Pulkovo 1942 / 3-degree Gauss-Kruger CM 144E,2694,projected,4530,,4284,16178,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 48 (code 2565).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2625,Pulkovo 1942 / 3-degree Gauss-Kruger CM 147E,2695,projected,4530,,4284,16179,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 49 (code 2566).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2626,Pulkovo 1942 / 3-degree Gauss-Kruger CM 150E,2696,projected,4530,,4284,16180,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 50 (code 2567).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2627,Pulkovo 1942 / 3-degree Gauss-Kruger CM 153E,2697,projected,4530,,4284,16181,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 51 (code 2568).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2628,Pulkovo 1942 / 3-degree Gauss-Kruger CM 156E,2698,projected,4530,,4284,16182,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 52 (code 2569).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2629,Pulkovo 1942 / 3-degree Gauss-Kruger CM 159E,2699,projected,4530,,4284,16183,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 53 (code 2570).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2630,Pulkovo 1942 / 3-degree Gauss-Kruger CM 162E,2700,projected,4530,,4284,16184,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 54 (code 2571).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2631,Pulkovo 1942 / 3-degree Gauss-Kruger CM 165E,2701,projected,4530,,4284,16185,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 55 (code 2572).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2632,Pulkovo 1942 / 3-degree Gauss-Kruger CM 168E,2702,projected,4530,,4284,16186,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 56 (code 2573).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2633,Pulkovo 1942 / 3-degree Gauss-Kruger CM 171E,2703,projected,4530,,4284,16187,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 57 (code 2574).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2634,Pulkovo 1942 / 3-degree Gauss-Kruger CM 174E,2704,projected,4530,,4284,16188,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 58 (code 2575).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2635,Pulkovo 1942 / 3-degree Gauss-Kruger CM 177E,2705,projected,4530,,4284,16189,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 59 (code 2576).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2636,Pulkovo 1942 / 3-degree Gauss-Kruger CM 180E,2706,projected,4530,,4284,16190,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 60 (code 2577).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2637,Pulkovo 1942 / 3-degree Gauss-Kruger CM 177W,2707,projected,4530,,4284,16191,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 61 (code 2578).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2638,Pulkovo 1942 / 3-degree Gauss-Kruger CM 174W,2708,projected,4530,,4284,16192,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 62 (code 2579).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2639,Pulkovo 1942 / 3-degree Gauss-Kruger CM 171W,2709,projected,4530,,4284,16193,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 63 (code 2580).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2640,Pulkovo 1942 / 3-degree Gauss-Kruger CM 168W,2710,projected,4530,,4284,16194,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 64 (code 2581).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2641,Pulkovo 1995 / 3-degree Gauss-Kruger zone 7,2747,projected,4530,,4284,16267,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 21E (code 2699).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2642,Pulkovo 1995 / 3-degree Gauss-Kruger zone 8,2748,projected,4530,,4284,16268,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 24E (code 2700).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2643,Pulkovo 1995 / 3-degree Gauss-Kruger zone 9,2749,projected,4530,,4284,16269,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 27E (code 2701).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2644,Pulkovo 1995 / 3-degree Gauss-Kruger zone 10,2750,projected,4530,,4284,16270,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 30E (code 2702).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2645,Pulkovo 1995 / 3-degree Gauss-Kruger zone 11,2751,projected,4530,,4284,16271,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 33E (code 2703).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2646,Pulkovo 1995 / 3-degree Gauss-Kruger zone 12,2752,projected,4530,,4284,16272,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 36E (code 2704).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2647,Pulkovo 1995 / 3-degree Gauss-Kruger zone 13,2753,projected,4530,,4284,16273,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 39E (code 2705).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2648,Pulkovo 1995 / 3-degree Gauss-Kruger zone 14,2754,projected,4530,,4284,16274,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 42E (code 2706).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2649,Pulkovo 1995 / 3-degree Gauss-Kruger zone 15,2755,projected,4530,,4284,16275,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 45E (code 2707).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2650,Pulkovo 1995 / 3-degree Gauss-Kruger zone 16,2756,projected,4530,,4284,16276,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 48E (code 2708).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2651,Pulkovo 1995 / 3-degree Gauss-Kruger zone 17,2757,projected,4530,,4284,16277,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 51E (code 2709).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2652,Pulkovo 1995 / 3-degree Gauss-Kruger zone 18,2758,projected,4530,,4284,16278,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 54E (code 2710).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2653,Pulkovo 1995 / 3-degree Gauss-Kruger zone 19,2759,projected,4530,,4284,16279,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 57E (code 2711).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2654,Pulkovo 1995 / 3-degree Gauss-Kruger zone 20,2760,projected,4530,,4284,16280,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 60E (code 2712).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2655,Pulkovo 1995 / 3-degree Gauss-Kruger zone 21,2761,projected,4530,,4284,16281,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 63E (code 2713).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2656,Pulkovo 1995 / 3-degree Gauss-Kruger zone 22,2762,projected,4530,,4284,16282,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 66E (code 2714).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2657,Pulkovo 1995 / 3-degree Gauss-Kruger zone 23,2763,projected,4530,,4284,16283,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 69E (code 2715).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2658,Pulkovo 1995 / 3-degree Gauss-Kruger zone 24,2764,projected,4530,,4284,16284,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 72E (code 2716).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2659,Pulkovo 1995 / 3-degree Gauss-Kruger zone 25,2765,projected,4530,,4284,16285,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 75E (code 2717).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2660,Pulkovo 1995 / 3-degree Gauss-Kruger zone 26,2766,projected,4530,,4284,16286,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 78E (code 2718).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2661,Pulkovo 1995 / 3-degree Gauss-Kruger zone 27,2767,projected,4530,,4284,16287,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 81E (code 2719).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2662,Pulkovo 1995 / 3-degree Gauss-Kruger zone 28,2768,projected,4530,,4284,16288,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 84E (code 2720).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2663,Pulkovo 1995 / 3-degree Gauss-Kruger zone 29,2769,projected,4530,,4284,16289,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 87E (code 2721).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2664,Pulkovo 1995 / 3-degree Gauss-Kruger zone 30,2676,projected,4530,,4284,16290,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 90E (code 2722).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2665,Pulkovo 1995 / 3-degree Gauss-Kruger zone 31,2677,projected,4530,,4284,16291,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 93E (code 2723).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2666,Pulkovo 1995 / 3-degree Gauss-Kruger zone 32,2678,projected,4530,,4284,16292,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 96E (code 2724).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2667,Pulkovo 1995 / 3-degree Gauss-Kruger zone 33,2679,projected,4530,,4284,16293,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 99E (code 2725).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2668,Pulkovo 1995 / 3-degree Gauss-Kruger zone 34,2680,projected,4530,,4284,16294,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 102E (code 2726).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2669,Pulkovo 1995 / 3-degree Gauss-Kruger zone 35,2681,projected,4530,,4284,16295,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 105E (code 2727).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2670,Pulkovo 1995 / 3-degree Gauss-Kruger zone 36,2682,projected,4530,,4284,16296,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 108E (code 2728).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2671,Pulkovo 1995 / 3-degree Gauss-Kruger zone 37,2683,projected,4530,,4284,16297,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 111E (code 2729).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2672,Pulkovo 1995 / 3-degree Gauss-Kruger zone 38,2684,projected,4530,,4284,16298,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 114E (code 2730).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2673,Pulkovo 1995 / 3-degree Gauss-Kruger zone 39,2685,projected,4530,,4284,16299,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 117E (code 2731).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2674,Pulkovo 1995 / 3-degree Gauss-Kruger zone 40,2686,projected,4530,,4284,16070,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 120E (code 2732).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2675,Pulkovo 1995 / 3-degree Gauss-Kruger zone 41,2687,projected,4530,,4284,16071,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 123E (code 2733).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2676,Pulkovo 1995 / 3-degree Gauss-Kruger zone 42,2688,projected,4530,,4284,16072,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 126E (code 2734).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2677,Pulkovo 1995 / 3-degree Gauss-Kruger zone 43,2689,projected,4530,,4284,16073,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 129E (code 2735).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2678,Pulkovo 1995 / 3-degree Gauss-Kruger zone 44,2690,projected,4530,,4284,16074,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 132E (code 2738).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2679,Pulkovo 1995 / 3-degree Gauss-Kruger zone 45,2691,projected,4530,,4284,16075,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 135E (code 2739).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2680,Pulkovo 1995 / 3-degree Gauss-Kruger zone 46,2692,projected,4530,,4284,16076,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 138E (code 2740).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2681,Pulkovo 1995 / 3-degree Gauss-Kruger zone 47,2693,projected,4530,,4284,16077,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 141E (code 2741).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2682,Pulkovo 1995 / 3-degree Gauss-Kruger zone 48,2694,projected,4530,,4284,16078,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 144E (code 2742).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2683,Pulkovo 1995 / 3-degree Gauss-Kruger zone 49,2695,projected,4530,,4284,16079,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 147E (code 2743).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2684,Pulkovo 1995 / 3-degree Gauss-Kruger zone 50,2696,projected,4530,,4284,16080,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 150E (code 2744).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2685,Pulkovo 1995 / 3-degree Gauss-Kruger zone 51,2697,projected,4530,,4284,16081,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 153E (code 2745).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2686,Pulkovo 1995 / 3-degree Gauss-Kruger zone 52,2698,projected,4530,,4284,16082,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 156E (code 2746).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2687,Pulkovo 1995 / 3-degree Gauss-Kruger zone 53,2699,projected,4530,,4284,16083,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 159E (code 2747).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2688,Pulkovo 1995 / 3-degree Gauss-Kruger zone 54,2700,projected,4530,,4284,16084,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 162E (code 2748).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2689,Pulkovo 1995 / 3-degree Gauss-Kruger zone 55,2701,projected,4530,,4284,16085,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 165E (code 2749).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2690,Pulkovo 1995 / 3-degree Gauss-Kruger zone 56,2702,projected,4530,,4284,16086,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 168E (code 2750).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2691,Pulkovo 1995 / 3-degree Gauss-Kruger zone 57,2703,projected,4530,,4284,16087,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 171E (code 2751).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2692,Pulkovo 1995 / 3-degree Gauss-Kruger zone 58,2704,projected,4530,,4284,16088,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 174E (code 2752).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2693,Pulkovo 1995 / 3-degree Gauss-Kruger zone 59,2705,projected,4530,,4284,16089,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 177E (code 2753).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2694,Pulkovo 1995 / 3-degree Gauss-Kruger zone 60,2706,projected,4530,,4284,16090,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 180E (code 2754).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2695,Pulkovo 1995 / 3-degree Gauss-Kruger zone 61,2707,projected,4530,,4284,16091,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 177W (code 2755).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2696,Pulkovo 1995 / 3-degree Gauss-Kruger zone 62,2708,projected,4530,,4284,16092,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 174W (code 2756).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2697,Pulkovo 1995 / 3-degree Gauss-Kruger zone 63,2709,projected,4530,,4284,16093,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 171W (code 2757).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2698,Pulkovo 1995 / 3-degree Gauss-Kruger zone 64,2710,projected,4530,,4284,16094,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 168W (code 2758).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2699,Pulkovo 1995 / 3-degree Gauss-Kruger CM 21E,2747,projected,4530,,4284,16367,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 7 (code 2641).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2700,Pulkovo 1995 / 3-degree Gauss-Kruger CM 24E,2654,projected,4530,,4284,16368,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 8 (code 2642).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2701,Pulkovo 1995 / 3-degree Gauss-Kruger CM 27E,2655,projected,4530,,4284,16369,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 9 (code 2643).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2702,Pulkovo 1995 / 3-degree Gauss-Kruger CM 30E,2656,projected,4530,,4284,16370,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 10 (code 2644).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2703,Pulkovo 1995 / 3-degree Gauss-Kruger CM 33E,2657,projected,4530,,4284,16371,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 11 (code 2645).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2704,Pulkovo 1995 / 3-degree Gauss-Kruger CM 36E,2658,projected,4530,,4284,16372,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 12 (code 2646).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2705,Pulkovo 1995 / 3-degree Gauss-Kruger CM 39E,2659,projected,4530,,4284,16373,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 13 (code 2647).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2706,Pulkovo 1995 / 3-degree Gauss-Kruger CM 42E,2660,projected,4530,,4284,16374,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 14 (code 2648).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2707,Pulkovo 1995 / 3-degree Gauss-Kruger CM 45E,2661,projected,4530,,4284,16375,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 15 (code 2649).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2708,Pulkovo 1995 / 3-degree Gauss-Kruger CM 48E,2662,projected,4530,,4284,16376,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 16 (code 2650).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2709,Pulkovo 1995 / 3-degree Gauss-Kruger CM 51E,2663,projected,4530,,4284,16377,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 17 (code 2651).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2710,Pulkovo 1995 / 3-degree Gauss-Kruger CM 54E,2664,projected,4530,,4284,16378,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 18 (code 2652).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2711,Pulkovo 1995 / 3-degree Gauss-Kruger CM 57E,2665,projected,4530,,4284,16379,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 19 (code 2653).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2712,Pulkovo 1995 / 3-degree Gauss-Kruger CM 60E,2666,projected,4530,,4284,16380,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 20 (code 2654).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2713,Pulkovo 1995 / 3-degree Gauss-Kruger CM 63E,2667,projected,4530,,4284,16381,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 21 (code 2655).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2714,Pulkovo 1995 / 3-degree Gauss-Kruger CM 66E,2668,projected,4530,,4284,16382,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 22 (code 2656).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2715,Pulkovo 1995 / 3-degree Gauss-Kruger CM 69E,2669,projected,4530,,4284,16383,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 23 (code 2657).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2716,Pulkovo 1995 / 3-degree Gauss-Kruger CM 72E,2670,projected,4530,,4284,16384,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 24 (code 2658).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2717,Pulkovo 1995 / 3-degree Gauss-Kruger CM 75E,2671,projected,4530,,4284,16385,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 25 (code 2659).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2718,Pulkovo 1995 / 3-degree Gauss-Kruger CM 78E,2672,projected,4530,,4284,16386,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 26 (code 2660).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2719,Pulkovo 1995 / 3-degree Gauss-Kruger CM 81E,2673,projected,4530,,4284,16387,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 27 (code 2661).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2720,Pulkovo 1995 / 3-degree Gauss-Kruger CM 84E,2674,projected,4530,,4284,16388,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 28 (code 2662).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2721,Pulkovo 1995 / 3-degree Gauss-Kruger CM 87E,2675,projected,4530,,4284,16389,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 29 (code 2663).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2722,Pulkovo 1995 / 3-degree Gauss-Kruger CM 90E,2676,projected,4530,,4284,16390,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 30 (code 2664).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2723,Pulkovo 1995 / 3-degree Gauss-Kruger CM 93E,2677,projected,4530,,4284,16391,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 31 (code 2665).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2724,Pulkovo 1995 / 3-degree Gauss-Kruger CM 96E,2678,projected,4530,,4284,16392,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 32 (code 2666).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2725,Pulkovo 1995 / 3-degree Gauss-Kruger CM 99E,2679,projected,4530,,4284,16393,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 33 (code 2667).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2726,Pulkovo 1995 / 3-degree Gauss-Kruger CM 102E,2680,projected,4530,,4284,16394,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 34 (code 2668).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2727,Pulkovo 1995 / 3-degree Gauss-Kruger CM 105E,2681,projected,4530,,4284,16395,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 35 (code 2669).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2728,Pulkovo 1995 / 3-degree Gauss-Kruger CM 108E,2682,projected,4530,,4284,16396,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 36 (code 2670).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2729,Pulkovo 1995 / 3-degree Gauss-Kruger CM 111E,2683,projected,4530,,4284,16397,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 37 (code 2671).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2730,Pulkovo 1995 / 3-degree Gauss-Kruger CM 114E,2684,projected,4530,,4284,16398,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 38 (code 2672).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2731,Pulkovo 1995 / 3-degree Gauss-Kruger CM 117E,2685,projected,4530,,4284,16399,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 39 (code 2673).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2732,Pulkovo 1995 / 3-degree Gauss-Kruger CM 120E,2686,projected,4530,,4284,16170,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 40 (code 2674).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2733,Pulkovo 1995 / 3-degree Gauss-Kruger CM 123E,2687,projected,4530,,4284,16171,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 41 (code 2675).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2734,Pulkovo 1995 / 3-degree Gauss-Kruger CM 126E,2688,projected,4530,,4284,16172,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 42 (code 2676).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2735,Pulkovo 1995 / 3-degree Gauss-Kruger CM 129E,2689,projected,4530,,4284,16173,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 43 (code 2677).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2736,Tete / UTM zone 36S,1540,projected,4400,,4127,16136,,,Large and medium scale topographic mapping and engineering survey.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+2737,Tete / UTM zone 37S,1541,projected,4400,,4127,16137,,,Large and medium scale topographic mapping and engineering survey.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+2738,Pulkovo 1995 / 3-degree Gauss-Kruger CM 132E,2690,projected,4530,,4284,16174,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 44 (code 2678).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2739,Pulkovo 1995 / 3-degree Gauss-Kruger CM 135E,2691,projected,4530,,4284,16175,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 45 (code 2679).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2740,Pulkovo 1995 / 3-degree Gauss-Kruger CM 138E,2692,projected,4530,,4284,16176,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 46 (code 2680).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2741,Pulkovo 1995 / 3-degree Gauss-Kruger CM 141E,2693,projected,4530,,4284,16177,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 47 (code 2681).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2742,Pulkovo 1995 / 3-degree Gauss-Kruger CM 144E,2694,projected,4530,,4284,16178,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 48 (code 2682).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2743,Pulkovo 1995 / 3-degree Gauss-Kruger CM 147E,2695,projected,4530,,4284,16179,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 49 (code 2683).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2744,Pulkovo 1995 / 3-degree Gauss-Kruger CM 150E,2696,projected,4530,,4284,16180,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 50 (code 2684).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2745,Pulkovo 1995 / 3-degree Gauss-Kruger CM 153E,2697,projected,4530,,4284,16181,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 51 (code 2685).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2746,Pulkovo 1995 / 3-degree Gauss-Kruger CM 156E,2698,projected,4530,,4284,16182,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 52 (code 2686).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2747,Pulkovo 1995 / 3-degree Gauss-Kruger CM 159E,2699,projected,4530,,4284,16183,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 53 (code 2687).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2748,Pulkovo 1995 / 3-degree Gauss-Kruger CM 162E,2700,projected,4530,,4284,16184,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 54 (code 2688).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2749,Pulkovo 1995 / 3-degree Gauss-Kruger CM 165E,2701,projected,4530,,4284,16185,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 55 (code 2689).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2750,Pulkovo 1995 / 3-degree Gauss-Kruger CM 168E,2702,projected,4530,,4284,16186,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 56 (code 2690).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2751,Pulkovo 1995 / 3-degree Gauss-Kruger CM 171E,2703,projected,4530,,4284,16187,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 57 (code 2691).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2752,Pulkovo 1995 / 3-degree Gauss-Kruger CM 174E,2704,projected,4530,,4284,16188,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 58 (code 2692).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2753,Pulkovo 1995 / 3-degree Gauss-Kruger CM 177E,2705,projected,4530,,4284,16189,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 59 (code 2693).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2754,Pulkovo 1995 / 3-degree Gauss-Kruger CM 180E,2706,projected,4530,,4284,16190,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 60 (code 2694).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2755,Pulkovo 1995 / 3-degree Gauss-Kruger CM 177W,2707,projected,4530,,4284,16191,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 61 (code 2695).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2756,Pulkovo 1995 / 3-degree Gauss-Kruger CM 174W,2708,projected,4530,,4284,16192,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 62 (code 2696).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2757,Pulkovo 1995 / 3-degree Gauss-Kruger CM 171W,2709,projected,4530,,4284,16193,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 63 (code 2697).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2758,Pulkovo 1995 / 3-degree Gauss-Kruger CM 168W,2710,projected,4530,,4284,16194,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 64 (code 2698).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2759,NAD83(HARN) / Alabama East,2154,projected,4499,,4152,10131,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2760,NAD83(HARN) / Alabama West,2155,projected,4499,,4152,10132,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2761,NAD83(HARN) / Arizona East,2167,projected,4499,,4152,10231,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2222 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2762,NAD83(HARN) / Arizona Central,2166,projected,4499,,4152,10232,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2223 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2763,NAD83(HARN) / Arizona West,2168,projected,4499,,4152,10233,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2224 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2764,NAD83(HARN) / Arkansas North,2169,projected,4499,,4152,10331,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2765,NAD83(HARN) / Arkansas South,2170,projected,4499,,4152,10332,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2766,NAD83(HARN) / California zone 1,2175,projected,4499,,4152,10431,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2225 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2767,NAD83(HARN) / California zone 2,2176,projected,4499,,4152,10432,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2226 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2768,NAD83(HARN) / California zone 3,2177,projected,4499,,4152,10433,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2227 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2769,NAD83(HARN) / California zone 4,2178,projected,4499,,4152,10434,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2228 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2770,NAD83(HARN) / California zone 5,2182,projected,4499,,4152,10435,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2229 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2771,NAD83(HARN) / California zone 6,2180,projected,4499,,4152,10436,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2230 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2772,NAD83(HARN) / Colorado North,2184,projected,4499,,4152,10531,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2231 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2773,NAD83(HARN) / Colorado Central,2183,projected,4499,,4152,10532,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2232 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2774,NAD83(HARN) / Colorado South,2185,projected,4499,,4152,10533,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2233 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2775,NAD83(HARN) / Connecticut,1377,projected,4499,,4152,10630,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2234 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2776,NAD83(HARN) / Delaware,1378,projected,4499,,4152,10730,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2235 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2777,NAD83(HARN) / Florida East,2186,projected,4499,,4152,10931,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2236 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2778,NAD83(HARN) / Florida West,2188,projected,4499,,4152,10932,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2237 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2779,NAD83(HARN) / Florida North,2187,projected,4499,,4152,10933,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2238 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2780,NAD83(HARN) / Georgia East,2189,projected,4499,,4152,11031,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2239 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2781,NAD83(HARN) / Georgia West,2190,projected,4499,,4152,11032,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2240 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2782,NAD83(HARN) / Hawaii zone 1,1546,projected,4499,,4152,15131,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2783,NAD83(HARN) / Hawaii zone 2,1547,projected,4499,,4152,15132,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2784,NAD83(HARN) / Hawaii zone 3,1548,projected,4499,,4152,15133,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2785,NAD83(HARN) / Hawaii zone 4,1549,projected,4499,,4152,15134,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2786,NAD83(HARN) / Hawaii zone 5,1550,projected,4499,,4152,15135,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2787,NAD83(HARN) / Idaho East,2192,projected,4499,,4152,11131,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2241 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2788,NAD83(HARN) / Idaho Central,2191,projected,4499,,4152,11132,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2242 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2789,NAD83(HARN) / Idaho West,2193,projected,4499,,4152,11133,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2243 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2790,NAD83(HARN) / Illinois East,2194,projected,4499,,4152,11231,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2791,NAD83(HARN) / Illinois West,2195,projected,4499,,4152,11232,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2792,NAD83(HARN) / Indiana East,2196,projected,4499,,4152,11331,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2244 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2793,NAD83(HARN) / Indiana West,2197,projected,4499,,4152,11332,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2245 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2794,NAD83(HARN) / Iowa North,2198,projected,4499,,4152,11431,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2795,NAD83(HARN) / Iowa South,2199,projected,4499,,4152,11432,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2796,NAD83(HARN) / Kansas North,2200,projected,4499,,4152,11531,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2797,NAD83(HARN) / Kansas South,2201,projected,4499,,4152,11532,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2798,NAD83(HARN) / Kentucky North,2202,projected,4499,,4152,15303,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2246 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2799,NAD83(HARN) / Kentucky South,2203,projected,4499,,4152,11632,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2247 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2800,NAD83(HARN) / Louisiana North,2204,projected,4499,,4152,11731,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2801,NAD83(HARN) / Louisiana South,2529,projected,4499,,4152,11732,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2802,NAD83(HARN) / Maine East,2206,projected,4499,,4152,11831,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2803,NAD83(HARN) / Maine West,2207,projected,4499,,4152,11832,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2804,NAD83(HARN) / Maryland,1389,projected,4499,,4152,11930,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2248 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2805,NAD83(HARN) / Massachusetts Mainland,2209,projected,4499,,4152,12031,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2249 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2806,NAD83(HARN) / Massachusetts Island,2208,projected,4499,,4152,12032,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2250 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2807,NAD83(HARN) / Michigan North,1723,projected,4499,,4152,12141,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2251 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2808,NAD83(HARN) / Michigan Central,1724,projected,4499,,4152,12142,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2252 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2809,NAD83(HARN) / Michigan South,1725,projected,4499,,4152,12143,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2253 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2810,NAD83(HARN) / Minnesota North,2214,projected,4499,,4152,12231,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2811,NAD83(HARN) / Minnesota Central,2213,projected,4499,,4152,12232,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2812,NAD83(HARN) / Minnesota South,2215,projected,4499,,4152,12233,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2813,NAD83(HARN) / Mississippi East,2216,projected,4499,,4152,12331,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2254 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2814,NAD83(HARN) / Mississippi West,2217,projected,4499,,4152,12332,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2255 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2815,NAD83(HARN) / Missouri East,2219,projected,4499,,4152,12431,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2816,NAD83(HARN) / Missouri Central,2218,projected,4499,,4152,12432,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2817,NAD83(HARN) / Missouri West,2220,projected,4499,,4152,12433,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2818,NAD83(HARN) / Montana,1395,projected,4499,,4152,12530,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2256 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2819,NAD83(HARN) / Nebraska,1396,projected,4499,,4152,12630,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2820,NAD83(HARN) / Nevada East,2224,projected,4499,,4152,12731,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2821,NAD83(HARN) / Nevada Central,2223,projected,4499,,4152,12732,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2822,NAD83(HARN) / Nevada West,2225,projected,4499,,4152,12733,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2823,NAD83(HARN) / New Hampshire,1398,projected,4499,,4152,12830,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2824,NAD83(HARN) / New Jersey,1399,projected,4499,,4152,12930,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2825,NAD83(HARN) / New Mexico East,2228,projected,4499,,4152,13031,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2257 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2826,NAD83(HARN) / New Mexico Central,2231,projected,4499,,4152,13032,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2258 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2827,NAD83(HARN) / New Mexico West,2232,projected,4499,,4152,13033,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2259 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2828,NAD83(HARN) / New York East,2234,projected,4499,,4152,13131,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2260 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2829,NAD83(HARN) / New York Central,2233,projected,4499,,4152,13132,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2261 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2830,NAD83(HARN) / New York West,2236,projected,4499,,4152,13133,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2263 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2831,NAD83(HARN) / New York Long Island,2235,projected,4499,,4152,13134,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2264 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2832,NAD83(HARN) / North Dakota North,2237,projected,4499,,4152,13331,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2265 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2833,NAD83(HARN) / North Dakota South,2238,projected,4499,,4152,13332,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2266 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2834,NAD83(HARN) / Ohio North,2239,projected,4499,,4152,13431,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2835,NAD83(HARN) / Ohio South,2240,projected,4499,,4152,13432,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2836,NAD83(HARN) / Oklahoma North,2241,projected,4499,,4152,13531,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2267 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2837,NAD83(HARN) / Oklahoma South,2242,projected,4499,,4152,13532,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2268 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2838,NAD83(HARN) / Oregon North,2243,projected,4499,,4152,13631,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2269 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2839,NAD83(HARN) / Oregon South,2244,projected,4499,,4152,13632,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2270 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2840,NAD83(HARN) / Rhode Island,1408,projected,4499,,4152,13830,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2841,NAD83(HARN) / South Dakota North,2249,projected,4499,,4152,14031,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2842,NAD83(HARN) / South Dakota South,2250,projected,4499,,4152,14032,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2843,NAD83(HARN) / Tennessee,1411,projected,4499,,4152,14130,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2274 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2844,NAD83(HARN) / Texas North,2253,projected,4499,,4152,14231,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2275 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2845,NAD83(HARN) / Texas North Central,2254,projected,4499,,4152,14232,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2276 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2846,NAD83(HARN) / Texas Central,2252,projected,4499,,4152,14233,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2277 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2847,NAD83(HARN) / Texas South Central,2527,projected,4499,,4152,14234,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2278 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2848,NAD83(HARN) / Texas South,2528,projected,4499,,4152,14235,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2279 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2849,NAD83(HARN) / Utah North,2258,projected,4499,,4152,14331,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2280 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2850,NAD83(HARN) / Utah Central,2257,projected,4499,,4152,14332,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2281 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2851,NAD83(HARN) / Utah South,2259,projected,4499,,4152,14333,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2282 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2852,NAD83(HARN) / Vermont,1414,projected,4499,,4152,14430,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2853,NAD83(HARN) / Virginia North,2260,projected,4499,,4152,14531,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2283 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2854,NAD83(HARN) / Virginia South,2261,projected,4499,,4152,14532,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2284 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2855,NAD83(HARN) / Washington North,2273,projected,4499,,4152,14631,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2285 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2856,NAD83(HARN) / Washington South,2274,projected,4499,,4152,14632,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2286 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2857,NAD83(HARN) / West Virginia North,2264,projected,4499,,4152,14731,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2858,NAD83(HARN) / West Virginia South,2265,projected,4499,,4152,14732,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2859,NAD83(HARN) / Wisconsin North,2267,projected,4499,,4152,14831,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2287 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2860,NAD83(HARN) / Wisconsin Central,2266,projected,4499,,4152,14832,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2288 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2861,NAD83(HARN) / Wisconsin South,2268,projected,4499,,4152,14833,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2289 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2862,NAD83(HARN) / Wyoming East,2269,projected,4499,,4152,14931,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2863,NAD83(HARN) / Wyoming East Central,2270,projected,4499,,4152,14932,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2864,NAD83(HARN) / Wyoming West Central,2272,projected,4499,,4152,14933,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2865,NAD83(HARN) / Wyoming West,2271,projected,4499,,4152,14934,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2866,NAD83(HARN) / Puerto Rico & Virgin Is.,2251,projected,4499,,4152,15230,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2867,NAD83(HARN) / Arizona East (ft),2167,projected,4495,,4152,15304,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 26948.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2868,NAD83(HARN) / Arizona Central (ft),2166,projected,4495,,4152,15305,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 26949.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2869,NAD83(HARN) / Arizona West (ft),2168,projected,4495,,4152,15306,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 26950.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2870,NAD83(HARN) / California zone 1 (ftUS),2175,projected,4497,,4152,15307,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26941.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2871,NAD83(HARN) / California zone 2 (ftUS),2176,projected,4497,,4152,15308,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26942.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2872,NAD83(HARN) / California zone 3 (ftUS),2177,projected,4497,,4152,15309,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26943.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2873,NAD83(HARN) / California zone 4 (ftUS),2178,projected,4497,,4152,15310,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26944.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2874,NAD83(HARN) / California zone 5 (ftUS),2182,projected,4497,,4152,15311,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26945.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2875,NAD83(HARN) / California zone 6 (ftUS),2180,projected,4497,,4152,15312,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26946.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2876,NAD83(HARN) / Colorado North (ftUS),2184,projected,4497,,4152,15313,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26953.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2877,NAD83(HARN) / Colorado Central (ftUS),2183,projected,4497,,4152,15314,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26954.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2878,NAD83(HARN) / Colorado South (ftUS),2185,projected,4497,,4152,15315,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26955.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2879,NAD83(HARN) / Connecticut (ftUS),1377,projected,4497,,4152,15316,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26956.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2880,NAD83(HARN) / Delaware (ftUS),1378,projected,4497,,4152,15317,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26957.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2881,NAD83(HARN) / Florida East (ftUS),2186,projected,4497,,4152,15318,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26958.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2882,NAD83(HARN) / Florida West (ftUS),2188,projected,4497,,4152,15319,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26959.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2883,NAD83(HARN) / Florida North (ftUS),2187,projected,4497,,4152,15320,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26960.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2884,NAD83(HARN) / Georgia East (ftUS),2189,projected,4497,,4152,15321,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26966.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2885,NAD83(HARN) / Georgia West (ftUS),2190,projected,4497,,4152,15322,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26967.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2886,NAD83(HARN) / Idaho East (ftUS),2192,projected,4497,,4152,15323,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26968.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2887,NAD83(HARN) / Idaho Central (ftUS),2191,projected,4497,,4152,15324,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26969.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2888,NAD83(HARN) / Idaho West (ftUS),2193,projected,4497,,4152,15325,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26970.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2889,NAD83(HARN) / Indiana East (ftUS),2196,projected,4497,,4152,15326,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26973.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2890,NAD83(HARN) / Indiana West (ftUS),2197,projected,4497,,4152,15327,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26974.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2891,NAD83(HARN) / Kentucky North (ftUS),2202,projected,4497,,4152,15328,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26979.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2892,NAD83(HARN) / Kentucky South (ftUS),2203,projected,4497,,4152,15329,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26980.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2893,NAD83(HARN) / Maryland (ftUS),1389,projected,4497,,4152,15330,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26985.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2894,NAD83(HARN) / Massachusetts Mainland (ftUS),2209,projected,4497,,4152,15331,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26986.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2895,NAD83(HARN) / Massachusetts Island (ftUS),2208,projected,4497,,4152,15332,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26987.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2896,NAD83(HARN) / Michigan North (ft),1723,projected,4495,,4152,15333,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 26988.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2897,NAD83(HARN) / Michigan Central (ft),1724,projected,4495,,4152,15334,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 26989.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2898,NAD83(HARN) / Michigan South (ft),1725,projected,4495,,4152,15335,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 26990.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2899,NAD83(HARN) / Mississippi East (ftUS),2216,projected,4497,,4152,15336,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26994.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2900,NAD83(HARN) / Mississippi West (ftUS),2217,projected,4497,,4152,15337,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 26995.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2901,NAD83(HARN) / Montana (ft),1395,projected,4495,,4152,15338,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32100.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2902,NAD83(HARN) / New Mexico East (ftUS),2228,projected,4497,,4152,15339,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32112.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2903,NAD83(HARN) / New Mexico Central (ftUS),2231,projected,4497,,4152,15340,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32113.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2904,NAD83(HARN) / New Mexico West (ftUS),2232,projected,4497,,4152,15341,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32114.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2905,NAD83(HARN) / New York East (ftUS),2234,projected,4497,,4152,15342,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32115.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2906,NAD83(HARN) / New York Central (ftUS),2233,projected,4497,,4152,15343,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32116.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2907,NAD83(HARN) / New York West (ftUS),2236,projected,4497,,4152,15344,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32117.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2908,NAD83(HARN) / New York Long Island (ftUS),2235,projected,4497,,4152,15345,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32118.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2909,NAD83(HARN) / North Dakota North (ft),2237,projected,4495,,4152,15347,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32120.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2910,NAD83(HARN) / North Dakota South (ft),2238,projected,4495,,4152,15348,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32121.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2911,NAD83(HARN) / Oklahoma North (ftUS),2241,projected,4497,,4152,15349,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32124.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2912,NAD83(HARN) / Oklahoma South (ftUS),2242,projected,4497,,4152,15350,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32125.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2913,NAD83(HARN) / Oregon North (ft),2243,projected,4495,,4152,15351,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32126.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2914,NAD83(HARN) / Oregon South (ft),2244,projected,4495,,4152,15352,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32127.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2915,NAD83(HARN) / Tennessee (ftUS),1411,projected,4497,,4152,15356,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32136.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2916,NAD83(HARN) / Texas North (ftUS),2253,projected,4497,,4152,15357,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32137.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2917,NAD83(HARN) / Texas North Central (ftUS),2254,projected,4497,,4152,15358,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32138.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2918,NAD83(HARN) / Texas Central (ftUS),2252,projected,4497,,4152,15359,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32139.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2919,NAD83(HARN) / Texas South Central (ftUS),2527,projected,4497,,4152,15360,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32140.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2920,NAD83(HARN) / Texas South (ftUS),2528,projected,4497,,4152,15361,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32141.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2921,NAD83(HARN) / Utah North (ft),2258,projected,4495,,4152,15362,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32142.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2922,NAD83(HARN) / Utah Central (ft),2257,projected,4495,,4152,15363,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32143.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2923,NAD83(HARN) / Utah South (ft),2259,projected,4495,,4152,15364,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). Federal definition is metric - see code 32144.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2924,NAD83(HARN) / Virginia North (ftUS),2260,projected,4497,,4152,15365,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32146.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2925,NAD83(HARN) / Virginia South (ftUS),2261,projected,4497,,4152,15366,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32147.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2926,NAD83(HARN) / Washington North (ftUS),2273,projected,4497,,4152,15367,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32148.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2927,NAD83(HARN) / Washington South (ftUS),2274,projected,4497,,4152,15368,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32149.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2928,NAD83(HARN) / Wisconsin North (ftUS),2267,projected,4497,,4152,15369,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32152.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2929,NAD83(HARN) / Wisconsin Central (ftUS),2266,projected,4497,,4152,15370,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32153.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2930,NAD83(HARN) / Wisconsin South (ftUS),2268,projected,4497,,4152,15371,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. Federal definition is metric - see code 32154.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2931,Beduaram / TM 13 NE,2771,projected,4497,,4213,16413,,,Oil exploration.,Used by Elf in 1986.,TotalFinaElf,EPSG,2002-06-28 00:00:00,,1,0
+2932,QND95 / Qatar National Grid,1346,projected,4400,,4614,19919,,,Large and medium scale topographic mapping and engineering survey.,,Qatar Centre for Geographic Information.,EPSG,2002-06-28 00:00:00,,1,0
+2933,Segara / UTM zone 50S,1328,projected,4400,,4613,16150,,,Large and medium scale topographic mapping and engineering survey.,,TotalFinaElf,EPSG,2002-06-22 00:00:00,,1,0
+2934,Segara (Jakarta) / NEIEZ,1360,projected,4499,,4820,19905,,,Large and medium scale topographic mapping and engineering survey.,,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2935,Pulkovo 1942 / CS63 zone A1,2772,projected,4530,,4284,18441,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2936,Pulkovo 1942 / CS63 zone A2,2773,projected,4530,,4284,18442,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2937,Pulkovo 1942 / CS63 zone A3,2774,projected,4530,,4284,18443,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2938,Pulkovo 1942 / CS63 zone A4,2775,projected,4530,,4284,18444,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2939,Pulkovo 1942 / CS63 zone K2,2776,projected,4530,,4284,18446,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2940,Pulkovo 1942 / CS63 zone K3,2777,projected,4530,,4284,18447,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2941,Pulkovo 1942 / CS63 zone K4,2778,projected,4530,,4284,18448,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2942,Porto Santo / UTM zone 28N,1314,projected,4400,,4615,16028,,,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon; http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,1,0
+2943,Selvagem Grande / UTM zone 28N,2779,projected,4400,,4616,16028,,,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon; http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,1,0
+2944,NAD83(CSRS) / SCoPQ zone 2,1420,projected,4499,,4617,17700,,,Large and medium scale topographic mapping and engineering survey.,,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2945,NAD83(CSRS) / MTM zone 3,1421,projected,4496,,4617,17703,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 3"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2946,NAD83(CSRS) / MTM zone 4,1422,projected,4496,,4617,17704,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 4"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2947,NAD83(CSRS) / MTM zone 5,1423,projected,4496,,4617,17705,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 5"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2948,NAD83(CSRS) / MTM zone 6,1424,projected,4496,,4617,17706,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 6"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2949,NAD83(CSRS) / MTM zone 7,1425,projected,4496,,4617,17707,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 7"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2950,NAD83(CSRS) / MTM zone 8,1426,projected,4496,,4617,17708,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 8"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2951,NAD83(CSRS) / MTM zone 9,1427,projected,4496,,4617,17709,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 9"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2952,NAD83(CSRS) / MTM zone 10,1428,projected,4496,,4617,17710,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 10"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2953,NAD83(CSRS) / New Brunswick Stereo,1447,projected,4500,,4617,19946,,,Large and medium scale topographic mapping and engineering survey.,In use from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2002-07-13 00:00:00,,1,0
+2954,NAD83(CSRS) / Prince Edward Isl. Stereographic (NAD83),1533,projected,4496,,4617,19960,,,Large and medium scale topographic mapping and engineering survey.,,PEI Department of Transportation & Public Works,EPSG,2002-07-13 00:00:00,,1,0
+2955,NAD83(CSRS) / UTM zone 11N,1508,projected,4400,,4617,16011,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2002-07-13 00:00:00,,1,0
+2956,NAD83(CSRS) / UTM zone 12N,1507,projected,4400,,4617,16012,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2002-07-13 00:00:00,,1,0
+2957,NAD83(CSRS) / UTM zone 13N,1506,projected,4400,,4617,16013,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2002-07-13 00:00:00,,1,0
+2958,NAD83(CSRS) / UTM zone 17N,1428,projected,4400,,4617,16017,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2002-07-13 00:00:00,,1,0
+2959,NAD83(CSRS) / UTM zone 18N,1443,projected,4400,,4617,16018,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2002-07-13 00:00:00,,1,0
+2960,NAD83(CSRS) / UTM zone 19N,1448,projected,4400,,4617,16019,,,Large and medium scale topographic mapping and engineering survey.,In use from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2002-07-13 00:00:00,,1,0
+2961,NAD83(CSRS) / UTM zone 20N,1449,projected,4400,,4617,16020,,,Large and medium scale topographic mapping and engineering survey.,In use from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2002-07-13 00:00:00,,1,0
+2962,NAD83(CSRS) / UTM zone 21N,1446,projected,4400,,4617,16021,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2002-07-13 00:00:00,,1,0
+2963,Lisbon 1890 (Lisbon) / Portugal Bonne,1294,projected,6509,,4904,19979,,,Medium scale topographic mapping.,,Instituto Geografico e Cadastral Lisbon; http://www.ipcc.pt/portuguese/produtos/cartografia/50m.html,EPSG,2002-07-13 00:00:00,,1,0
+3036,Moznet / UTM zone 36S,1540,projected,4400,,4130,16136,,,Large and medium scale topographic mapping and engineering survey.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+3037,Moznet / UTM zone 37S,1541,projected,4400,,4130,16137,,,Large and medium scale topographic mapping and engineering survey.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+3148,Indian 1960 / UTM zone 48N,1542,projected,4400,,4131,16048,,,Large and medium scale topographic mapping and engineering survey.,In Vietnam superseded by Hanoi 72 / Gauss zone 18 from 1988 onwards.,,EPSG,1998-11-11 00:00:00,,1,0
+3149,Indian 1960 / UTM zone 49N,1453,projected,4400,,4131,16049,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Hanoi 72 / Gauss zone 18 from 1988 onwards.,,EPSG,1998-11-11 00:00:00,,1,0
+3176,Indian 1960 / TM 106 NE,1495,projected,4400,,4131,16506,,,Used by Petrovietnam for offshore block 15.,,Petrovietnam,EPSG,1998-11-11 00:00:00,,1,0
+3200,FD58 / Iraq zone,1300,projected,4400,,4132,19906,,,Large and medium scale topographic mapping and engineering survey.,,IOEPC records.,EPSG,1998-11-11 00:00:00,,1,0
+3300,Estonian Coordinate System of 1992,1090,projected,4530,,4133,19938,,,Used for 1:20000 and larger scale mapping.,Superseded by Estonian Coordinate System of 1997 (code 3301).,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,1,0
+3301,Estonian Coordinate System of 1997,1090,projected,4530,,4180,19938,,,Used for 1:20000 and larger scale mapping.,Supersedes Estonian Coordinate System of 1992 (code 3300).,Estonian National Land Board via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+3439,PSD93 / UTM zone 39N,1544,projected,4400,,4134,16039,,,Oil exploration and production.,Supersedes Fahud / UTM zone 39N projCS (code 23239). Maximum differences to Fahud adjustment are 20 metres.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,1,0
+3440,PSD93 / UTM zone 40N,1545,projected,4400,,4134,16040,,,Oil exploration and production.,Supersedes Fahud / UTM zone 40N projCS (code 23240). Maximum differences to Fahud adjustment are 20 metres.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,1,0
+3561,Old Hawaiian / Hawaii zone 1,1546,projected,4497,,4135,15101,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / Hawaii zone 1.,,EPSG,1999-05-24 00:00:00,99.322,1,0
+3562,Old Hawaiian / Hawaii zone 2,1547,projected,4497,,4135,15102,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / Hawaii zone 2.,,EPSG,1999-05-24 00:00:00,99.322,1,0
+3563,Old Hawaiian / Hawaii zone 3,1548,projected,4497,,4135,15103,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / Hawaii zone 3.,,EPSG,1999-05-24 00:00:00,99.322,1,0
+3564,Old Hawaiian / Hawaii zone 4,1549,projected,4497,,4135,15104,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / Hawaii zone 4.,,EPSG,1999-05-24 00:00:00,99.322,1,0
+3565,Old Hawaiian / Hawaii zone 5,1550,projected,4497,,4135,15105,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / Hawaii zone 5.,,EPSG,1999-05-24 00:00:00,99.322,1,0
+3920,Puerto Rico / UTM zone 20N,1253,projected,4400,,4139,16020,,,Large and medium scale topographic mapping and engineering survey.,NAD27 / UTM zone 20 N (code 26720) used for military purposes.,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+3991,Puerto Rico State Plane CS of 1927,1194,projected,4497,,4139,15201,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / Puerto Rico State Plane CS.,US National Geodetic Survey,EPSG,1999-05-24 00:00:00,99.323,1,0
+3992,Puerto Rico / St. Croix,1254,projected,4497,,4139,15202,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / St. Croix State Plane CS.,US National Geodetic Survey,EPSG,1999-05-24 00:00:00,99.323,1,0
+4001,Unknown datum based upon the Airy 1830 ellipsoid,1263,geographic 2D,6402,6001,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4002,Unknown datum based upon the Airy Modified 1849 ellipsoid,1263,geographic 2D,6402,6002,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4003,Unknown datum based upon the Australian National Spheroid,1263,geographic 2D,6402,6003,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4004,Unknown datum based upon the Bessel 1841 ellipsoid,1263,geographic 2D,6402,6004,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4005,Unknown datum based upon the Bessel Modified ellipsoid,1263,geographic 2D,6402,6005,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4006,Unknown datum based upon the Bessel Namibia ellipsoid,1263,geographic 2D,6402,6006,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4007,Unknown datum based upon the Clarke 1858 ellipsoid,1263,geographic 2D,6402,6007,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4008,Unknown datum based upon the Clarke 1866 ellipsoid,1263,geographic 2D,6402,6008,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4009,Unknown datum based upon the Clarke 1866 Michigan ellipsoid,1263,geographic 2D,6402,6009,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4010,Unknown datum based upon the Clarke 1880 (Benoit) ellipsoid,1263,geographic 2D,6402,6010,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4011,Unknown datum based upon the Clarke 1880 (IGN) ellipsoid,1263,geographic 2D,6402,6011,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4012,Unknown datum based upon the Clarke 1880 (RGS) ellipsoid,1263,geographic 2D,6402,6012,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4013,Unknown datum based upon the Clarke 1880 (Arc) ellipsoid,1263,geographic 2D,6402,6013,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4014,Unknown datum based upon the Clarke 1880 (SGA 1922) ellipsoid,1263,geographic 2D,6402,6014,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4015,Unknown datum based upon the Everest 1830 (1937 Adjustment) ellipsoid,1263,geographic 2D,6402,6015,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4016,Unknown datum based upon the Everest 1830 (1967 Definition) ellipsoid,1263,geographic 2D,6402,6016,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4018,Unknown datum based upon the Everest 1830 Modified ellipsoid,1263,geographic 2D,6402,6018,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4019,Unknown datum based upon the GRS 1980 ellipsoid,1263,geographic 2D,6402,6019,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4020,Unknown datum based upon the Helmert 1906 ellipsoid,1263,geographic 2D,6402,6020,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4021,Unknown datum based upon the Indonesian National Spheroid,1263,geographic 2D,6402,6021,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4022,Unknown datum based upon the International 1924 ellipsoid,1263,geographic 2D,6402,6022,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4024,Unknown datum based upon the Krassowsky 1940 ellipsoid,1263,geographic 2D,6402,6024,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4025,Unknown datum based upon the NWL 9D ellipsoid,1263,geographic 2D,6402,6025,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4027,Unknown datum based upon the Plessis 1817 ellipsoid,1263,geographic 2D,6402,6027,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4028,Unknown datum based upon the Struve 1860 ellipsoid,1263,geographic 2D,6402,6028,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4029,Unknown datum based upon the War Office ellipsoid,1263,geographic 2D,6402,6029,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4030,Unknown datum based upon the WGS 84 ellipsoid,1263,geographic 2D,6402,6030,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4031,Unknown datum based upon the GEM 10C ellipsoid,1263,geographic 2D,6402,6031,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4032,Unknown datum based upon the OSU86F ellipsoid,1263,geographic 2D,6402,6032,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4033,Unknown datum based upon the OSU91A ellipsoid,1263,geographic 2D,6402,6033,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4034,Unknown datum based upon the Clarke 1880 ellipsoid,1263,geographic 2D,6402,6034,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,0
+4035,Unknown datum based upon the Authalic Sphere,1263,geographic 2D,6402,6035,,,,,Not recommended.,Deprecated. Use code 4047.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0,1
+4036,Unknown datum based upon the GRS 1967 ellipsoid,1263,geographic 2D,6402,6036,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0,0
+4041,Unknown datum based upon the Average Terrestrial System 1977 ellipsoid,1263,geographic 2D,6402,6041,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0,0
+4042,Unknown datum based upon the Everest (1830 Definition) ellipsoid,1263,geographic 2D,6402,6042,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0,0
+4043,Unknown datum based upon the WGS 72 ellipsoid,1263,geographic 2D,6402,6043,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0,0
+4044,Unknown datum based upon the Everest 1830 (1962 Definition) ellipsoid,1263,geographic 2D,6402,6044,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0,0
+4045,Unknown datum based upon the Everest 1830 (1975 Definition) ellipsoid,1263,geographic 2D,6402,6045,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0,0
+4047,Unspecified based upon the GRS 1980 Authalic Sphere,1263,geographic 2D,6402,6047,,,,,Small scale statistical mapping.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2001-06-05 00:00:00,,0,0
+4120,Greek,1106,geographic 2D,6402,6120,,,,,Geodetic survey.,,Topography Department; National Technical University of Greece.,EPSG,1997-06-16 00:00:00,,1,0
+4121,GGRS87,1106,geographic 2D,6402,6121,,,,,Geodetic survey.,,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,1997-06-16 00:00:00,,1,0
+4122,ATS77,1283,geographic 2D,6402,6122,,,,,Geodetic survey.,In use from 1979. To be phased out in late 1990's.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1997-07-22 00:00:00,,1,0
+4123,KKJ,1095,geographic 2D,6402,6123,,,,,Geodetic survey.,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+4124,RT90,1225,geographic 2D,6402,6124,,,,,Geodetic survey.,,National Land Survey of Sweden,EPSG,1997-11-13 00:00:00,,1,0
+4125,Samboja,1328,geographic 2D,6402,6125,,,,,Geodetic survey.,,,EPSG,1997-11-13 00:00:00,,1,1
+4126,LKS94 (ETRS89),1145,geographic 2D,6402,6126,,,,,Geodetic survey.,,,EPSG,1998-03-13 00:00:00,,1,0
+4127,Tete,1167,geographic 2D,6402,6127,,,,,Geodetic survey.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+4128,Madzansua,1315,geographic 2D,6402,6128,,,,,Geodetic survey.,Superseded by values transformed to Tete geogCS (code 4127).,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+4129,Observatario,1329,geographic 2D,6402,6129,,,,,Geodetic survey.,Superseded by values transformed to Tete geogCS (code 4127).,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+4130,Moznet,1167,geographic 2D,6402,6130,,,,,Geodetic survey.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+4131,Indian 1960,1302,geographic 2D,6402,6131,,,,,Geodetic survey.,,,EPSG,1998-11-11 00:00:00,,1,0
+4132,FD58,1300,geographic 2D,6402,6132,,,,,Geodetic survey.,,IOEPC records.,EPSG,1998-11-11 00:00:00,,1,0
+4133,EST92,1090,geographic 2D,6402,6133,,,,,Geodetic survey.,Superseded by EST97 (code 4180).,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,1,0
+4134,PDO Survey Datum 1993,1183,geographic 2D,6402,6134,,,,,Geodetic survey.,Supersedes Fahud geogCS (code 4232). Maximum differences to Fahud adjustment are 20 metres.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,1,0
+4135,Old Hawaiian,1334,geographic 2D,6402,6135,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-24 00:00:00,,1,0
+4136,St. Lawrence Island,1332,geographic 2D,6402,6136,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-24 00:00:00,,1,0
+4137,St. Paul Island,1333,geographic 2D,6402,6137,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-24 00:00:00,,1,0
+4138,St. George Island,1331,geographic 2D,6402,6138,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-24 00:00:00,,1,0
+4139,Puerto Rico,1335,geographic 2D,6402,6139,,,,,Geodetic surveying for civilian purposes.,NAD27 (code 4267) used for military purposes. Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-24 00:00:00,,1,0
+4140,NAD83(CSRS98),1336,geographic 2D,6402,6140,,,,,Geodetic survey.,In New Brunswick superseded ATS77 from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2000-10-19 00:00:00,99.90,1,1
+4141,Israel,2603,geographic 2D,6402,6141,,,,,Geodetic survey.,Supersedes Palestine 1923.,Survey of Israel,EPSG,2002-06-22 00:00:00,2002.34,1,0
+4142,Locodjo 1965,1075,geographic 2D,6402,6142,,,,,Geodetic survey.,Superseded by Abidjan 1987 (EPSG code 4143).,IGN Paris,EPSG,1999-10-20 00:00:00,,1,0
+4143,Abidjan 1987,1075,geographic 2D,6402,6143,,,,,Geodetic survey.,Supersedes Locodjo 1965 (EPSG code 4142).,IGN Paris,EPSG,2001-06-05 00:00:00,2001.11,1,0
+4144,Kalianpur 1937,1308,geographic 2D,6402,6144,,,,,Geodetic survey.,Adopts 1937 metric conversion of 0.30479841 metres per Indian foot.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,1999-10-20 00:00:00,,1,0
+4145,Kalianpur 1962,1184,geographic 2D,6402,6145,,,,,Geodetic survey.,Adopts 1962 metric conversion of 0.3047996 metres per Indian foot.,,EPSG,1999-10-20 00:00:00,,1,0
+4146,Kalianpur 1975,1121,geographic 2D,6402,6146,,,,,Geodetic survey.,Adopts 1975 metric conversion of 0.3047995 metres per Indian foot.,,EPSG,1999-10-20 00:00:00,,1,0
+4147,Hanoi 1972,1252,geographic 2D,6402,6147,,,,,Geodetic survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+4148,Hartebeesthoek94,1215,geographic 2D,6402,6148,,,,,Geodetic survey.,Supersedes Cape (code 4222) from 1999.,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-01-06 00:00:00,99.96 2000.04,1,0
+4149,CH1903,1286,geographic 2D,6402,6149,,,,,Geodetic survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+4150,CH1903+,1286,geographic 2D,6402,6150,,,,,Geodetic survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+4151,CHTRF95,1286,geographic 2D,6402,6151,,,,,Geodetic survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+4152,NAD83(HARN),1337,geographic 2D,6402,6152,,,,,Geodetic survey.,,National Geodetic Survey,EPSG,1999-10-20 00:00:00,,1,0
+4153,Rassadiran,1338,geographic 2D,6402,6153,,,,,Geodetic survey.,,Total-Fina,EPSG,1999-10-20 00:00:00,,1,0
+4154,ED50(ED77),1123,geographic 2D,6402,6154,,,,,Geodetic survey.,,National Cartographic Centre of Iran,EPSG,1999-10-20 00:00:00,,1,0
+4155,Dabola 1981,1112,geographic 2D,6402,6155,,,,,Geodetic survey.,Supersedes Conakry 1905 (EPSG code 4315).,IGN Paris,EPSG,1999-12-09 00:00:00,,1,0
+4156,S-JTSK,1306,geographic 2D,6402,6156,,,,,Geodetic survey.,"S-JTSK is the Uniform Trigonometric Cadastral Network. It is a modification of the Austrian MGI geogCRS, code 4312.",Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2001-08-28 00:00:00,2001.26,1,0
+4157,Mount Dillon,1322,geographic 2D,6402,6157,,,,,Geodetic survey.,,University of the West Indies Geodetic Services.,EPSG,2000-03-07 00:00:00,,1,0
+4158,Naparima 1955,1339,geographic 2D,6402,6158,,,,,Geodetic survey.,Naparima 1972 is an extension of the Naparima 1955 network of Trinidad to include Tobago.,Ordnance Survey International.,EPSG,2000-03-07 00:00:00,,1,0
+4159,ELD79,1143,geographic 2D,6402,6159,,,,,Geodetic survey.,,Various oil company records.,EPSG,2000-03-07 00:00:00,,1,0
+4160,Chos Malal 1914,1292,geographic 2D,6402,6160,,,,,Geodetic survey.,Superseded by Campo Inchauspe (geogCS code 4221).,Various oil company records.,EPSG,2000-03-07 00:00:00,,1,0
+4161,Pampa del Castillo,1265,geographic 2D,6402,6161,,,,,Geodetic surveying within the oil industry.,Superseded by Campo Inchauspe (geogCS code 4221).,Various oil company records.,EPSG,2000-03-07 00:00:00,,1,0
+4162,Korean 1985,1135,geographic 2D,6402,6162,,,,,Geodetic survey.,Supersedes use of Tokyo datum.,Clifford J. Mugnier; in Photogrammetric Engineering & Remote Sensing November 1999. http://www.asprs.org/resources.html,EPSG,2000-03-07 00:00:00,2001.28,1,0
+4163,Yemen NGN96,1257,geographic 2D,6402,6163,,,,,Geodetic survey.,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,0
+4164,South Yemen,1340,geographic 2D,6402,6164,,,,,Geodetic survey.,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,0
+4165,Bissau,1113,geographic 2D,6402,6165,,,,,Geodetic survey.,,NIMA,EPSG,2000-03-07 00:00:00,,1,0
+4166,Korean 1995,1135,geographic 2D,6402,6166,,,,,Geodetic survey.,,NIMA TR8350.2 ftp://164.214.2.65/pub/gg/tr8350.2/changes.pdf,EPSG,2000-05-08 00:00:00,,1,0
+4167,NZGD2000,1175,geographic 2D,6402,6167,,,,,Geodetic survey.,Supersedes NZGD49 (code 4272) from March 2000.,Land Information New Zealand.,EPSG,2000-10-19 00:00:00,,1,0
+4168,Accra,1104,geographic 2D,6402,6168,,,,,Geodetic survey.,"Ellipsoid semi-major axis (a)=20926201 exactly Gold Coast feet.
+Superseded by Leigon (code 4250) in 1978.",Ordnance Survey International,EPSG,2000-10-19 00:00:00,,1,0
+4169,American Samoa 1962,1027,geographic 2D,6402,6169,,,,,Geodetic survey.,,NIMA TR8350.2 revision of January 2000 and ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon/samoa_readme.txt,EPSG,2000-10-19 00:00:00,,1,0
+4170,SIRGAS,1341,geographic 2D,6402,6170,,,,,Geodetic survey.,,NIMA TR8350.2 revision of January 2000.,EPSG,2000-10-19 00:00:00,2001.33,1,0
+4171,RGF93,1096,geographic 2D,6402,6171,,,,,Geodetic survey.,,TotalFinaElf,EPSG,2000-10-19 00:00:00,,1,0
+4172,POSGAR,1033,geographic 2D,6402,6172,,,,,Geodetic survey.,"A geodetic network of 127 high accuracy surved points that define the National Geodetic System (Sistema Geod�sico Nacional), adopted by IGM in May 1997",http://www.igm.gov.ar/posgar.html,EPSG,2000-10-19 00:00:00,2001.051,1,1
+4173,IRENET95,1305,geographic 2D,6402,6173,,,,,Geodetic survey.,,Ordnance Survey of Ireland,EPSG,2000-10-19 00:00:00,,1,0
+4174,Sierra Leone 1924,1342,geographic 2D,6402,6174,,,,,Geodetic survey.,Ellipsoid semi-major axis (a)=20926201 exactly Gold Coast feet; 1 Gold Coast foot = 0.3047997101815 m.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+4175,Sierra Leone 1968,1209,geographic 2D,6402,6175,,,,,Geodetic survey.,Supersedes Sierra Leone 1960. The 1968 readjustment coordinates are within 3m of the 1960 provisional adjustment.,Ordnance Survey International.,EPSG,2001-06-05 00:00:00,,1,0
+4176,Australian Antarctic,1278,geographic 2D,6402,6176,,,,,Geodetic survey.,,Standards Australia,ISO 19127,2001-06-05 00:00:00,,1,0
+4178,Pulkovo 1942(83),1343,geographic 2D,6402,6178,,,,,Geodetic survey.,"In Brandenburg superseded by ETRS89.
+In Sachsen and Thuringen superseded by DHDN.",Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4179,Pulkovo 1942(58),1192,geographic 2D,6402,6179,,,,,Geodetic survey.,,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4180,EST97,1090,geographic 2D,6402,6180,,,,,Geodetic survey.,Supersedes EST92 (code 4133).,Estonian National Land Board via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4181,Luxembourg 1930,1146,geographic 2D,6402,6181,,,,,Geodetic survey,,Administration du Cadastre et de la Topographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4182,Azores Occidental 1939,1344,geographic 2D,6402,6182,,,,,Geodetic survey.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4183,Azores Central 1948,1301,geographic 2D,6402,6183,,,,,Geodetic survey.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4184,Azores Oriental 1940,1345,geographic 2D,6402,6184,,,,,Geodetic survey.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4185,Madeira 1936,1314,geographic 2D,6402,6185,,,,,Geodetic survey.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,1
+4188,OSNI 1952,2530,geographic 2D,6402,6188,,,,,Geodesy and topographic mapping.,Superseded by 1975 Mapping Adjustment. See code 4300.,Ordnance Survey of Northern Ireland.,EPSG,2001-11-06 00:00:00,,0,0
+4189,REGVEN,1251,geographic 2D,6402,6189,,,,,Geodetic survey.,Densification in Venezuela of SIRGAS.,Servicio Autonomo de Geografia y Cartografia Nacional.,EPSG,2001-11-06 00:00:00,,1,0
+4190,POSGAR 98,1033,geographic 2D,6402,6190,,,,,Geodetic survey.,A geodetic network of 127 high accuracy surved points that define the National Geodetic System (Sistema Geod�sico Nacional). Densification of SIRGAS 1995.,http://www.igm.gov.ar/posgar.html,EPSG,2001-11-06 00:00:00,,1,0
+4191,Albanian 1987,1025,geographic 2D,6402,6191,,,,,Geodetic survey.,,EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+4192,Douala 1948,1060,geographic 2D,6402,6192,,,,,Geodetic survey.,Superseded by Manoca 1962 (code 4193).,TotalFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+4193,Manoca 1962,1060,geographic 2D,6402,6193,,,,,Geodetic survey.,Supersedes Doula 1948 (code 4192). The intent of the Bukuva 1953 conference was to adopt the Clarke 1880 (RGN) ellipsoid (code 7012) but in practice this datum has used the IGN version.,TotalFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+4194,Qornoq 1927,1107,geographic 2D,6402,6194,,,,,Geodetic survey.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,1,0
+4195,Scoresbysund 1952,2570,geographic 2D,6402,6195,,,,,Geodetic survey.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,1,0
+4196,Ammassalik 1958,2571,geographic 2D,6402,6196,,,,,Geodetic survey.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,1,0
+4197,Garoua,2590,geographic 2D,6402,6197,,,,,Geodetic survey.,The intent of the Bukuva 1953 conference was to adopt the Clarke 1880 (RGN) ellipsoid (code 7012) but in practice this datum has used the IGN version.,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+4198,Kousseri,2591,geographic 2D,6402,6198,,,,,Geodetic survey.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+4199,Egypt 1930,1086,geographic 2D,6402,6199,,,,,Scientific purposes only.,"Note that Egypt 1930 uses the International 1924 ellipsoid, unlike the Egypt 1907 CRS (code 4229) which uses the Helmert ellipsoid. Oil industry references to the Egypt 1930 name and the Helmert ellipsoid probably mean Egypt 1907.",,EPSG,2002-02-12 00:00:00,,1,0
+4200,Pulkovo 1995,1198,geographic 2D,6402,6200,,,,,Geodetic survey.,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,0
+4201,Adindan,1271,geographic 2D,6402,6201,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4202,AGD66,1279,geographic 2D,6402,6202,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4203,AGD84,1036,geographic 2D,6402,6203,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4204,Ain el Abd,1272,geographic 2D,6402,6204,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4205,Afgooye,1214,geographic 2D,6402,6205,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4206,Agadez,1177,geographic 2D,6402,6206,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4207,Lisbon,1294,geographic 2D,6402,6207,,,,,Geodetic survey.,Supersedes Lisbon 1890 system which used Bessel 1841 ellipsoid. Superseded by Datum 73 (code 4274).,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,2001.551,1,0
+4208,Aratu,1274,geographic 2D,6402,6208,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4209,Arc 1950,1276,geographic 2D,6402,6209,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4210,Arc 1960,1277,geographic 2D,6402,6210,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4211,Batavia,1285,geographic 2D,6402,6211,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4212,Barbados 1938,1042,geographic 2D,6402,6212,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,99.171,1,0
+4213,Beduaram,2771,geographic 2D,6402,6213,,,,,Geodetic survey.,,,EPSG,2002-06-28 00:00:00,2002.43,1,0
+4214,Beijing 1954,1067,geographic 2D,6402,6214,,,,,Geodetic survey.,Superseded by Xian 1980 (code 4610).,,EPSG,1995-06-02 00:00:00,,1,0
+4215,Belge 1950,1347,geographic 2D,6402,6215,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4216,Bermuda 1957,1047,geographic 2D,6402,6216,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4218,Bogota 1975,1070,geographic 2D,6402,6218,,,,,Geodetic survey.,"Supersedes earlier 3 adjustments of 1951, 1944 and 1941.","IGAC special publication no. 1, ""Geodesia"" 4th edition, 1975.",EPSG,2000-10-19 00:00:00,2000.20,1,0
+4219,Bukit Rimpah,1287,geographic 2D,6402,6219,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4220,Camacupa,1288,geographic 2D,6402,6220,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4221,Campo Inchauspe,1033,geographic 2D,6402,6221,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4222,Cape,1290,geographic 2D,6402,6222,,,,,Geodetic survey.,Superseded by Hartbeesthoek94 from 1999.,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,1995-06-02 00:00:00,2000.04,1,0
+4223,Carthage,1236,geographic 2D,6402,6223,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4224,Chua,1053,geographic 2D,6402,6224,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4225,Corrego Alegre,1293,geographic 2D,6402,6225,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4226,Cote d'Ivoire,1075,geographic 2D,6402,6226,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+4227,Deir ez Zor,1623,geographic 2D,6402,6227,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4228,Douala,1060,geographic 2D,6402,6228,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+4229,Egypt 1907,1086,geographic 2D,6402,6229,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4230,ED50,1296,geographic 2D,6402,6230,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4231,ED87,1297,geographic 2D,6402,6231,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4232,Fahud,1183,geographic 2D,6402,6232,,,,,Geodetic survey.,Since 1993 superseded by PSD93 geogCS (code 4134). Maximum differences to Fahud adjustment are 20 metres.,,EPSG,1995-06-02 00:00:00,,1,0
+4233,Gandajika 1970,1152,geographic 2D,6402,6233,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4234,Garoua,1060,geographic 2D,6402,6234,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+4235,Guyane Francaise,1097,geographic 2D,6402,6235,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4236,Hu Tzu Shan,1228,geographic 2D,6402,6236,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4237,HD72,1119,geographic 2D,6402,6237,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4238,ID74,1122,geographic 2D,6402,6238,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4239,Indian 1954,1304,geographic 2D,6402,6239,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4240,Indian 1975,1231,geographic 2D,6402,6240,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4241,Jamaica 1875,1128,geographic 2D,6402,6241,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4242,JAD69,1128,geographic 2D,6402,6242,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4243,Kalianpur 1880,1307,geographic 2D,6402,6243,,,,,Geodetic survey.,,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,1999-10-20 00:00:00,97.23,1,0
+4244,Kandawala,1218,geographic 2D,6402,6244,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4245,Kertau,1309,geographic 2D,6402,6245,,,,,Geodetic survey.,Adopts metric conversion of 39.370113 inches per metre.,,EPSG,1995-06-02 00:00:00,,1,0
+4246,KOC,1136,geographic 2D,6402,6246,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4247,La Canoa,1251,geographic 2D,6402,6247,,,,,Geodetic survey.,PSAD56 uses same origin.,,EPSG,1995-06-02 00:00:00,,1,0
+4248,PSAD56,1348,geographic 2D,6402,6248,,,,,Geodetic survey.,Origin is same as La Canoa. In Venezuela known as La Canoa.,,EPSG,1995-06-02 00:00:00,,1,0
+4249,Lake,1312,geographic 2D,6402,6249,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4250,Leigon,1104,geographic 2D,6402,6250,,,,,Geodetic survey.,Superseded Accra (code 4168) from 1978.,Ordnance Survey International,EPSG,1995-06-02 00:00:00,,1,0
+4251,Liberia 1964,1142,geographic 2D,6402,6251,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4252,Lome,1232,geographic 2D,6402,6252,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4253,Luzon 1911,1190,geographic 2D,6402,6253,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4254,Hito XVIII 1963,1303,geographic 2D,6402,6254,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4255,Herat North,1024,geographic 2D,6402,6255,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4256,Mahe 1971,1208,geographic 2D,6402,6256,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4257,Makassar,1316,geographic 2D,6402,6257,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4258,ETRS89,1298,geographic 2D,6402,6258,,,,,Geodetic survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,Norwegian Geodetic Institute geodetic publication 1990:1,EPSG,2000-10-19 00:00:00,97.11 99.11 2000.72,1,0
+4259,Malongo 1987,1317,geographic 2D,6402,6259,,,,,Geodetic survey.,Offshore extension of Mhast GeogCS (4264) using Transit translocation from Station Y at Malongo base camp.,Chevron Petroleum Technology,EPSG,1995-06-02 00:00:00,,1,0
+4260,Manoca,1060,geographic 2D,6402,6260,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,2002.01,1,1
+4261,Merchich,1166,geographic 2D,6402,6261,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4262,Massawa,1089,geographic 2D,6402,6262,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4263,Minna,1178,geographic 2D,6402,6263,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4264,Mhast,1318,geographic 2D,6402,6264,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4265,Monte Mario,1127,geographic 2D,6402,6265,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4266,M'poraloko,1100,geographic 2D,6402,6266,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4267,NAD27,1349,geographic 2D,6402,6267,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST. Superseded by NAD27(76) (code 4608) in Ontario and CGQ77 (code 4609) in Quebec.,,EPSG,1995-06-02 00:00:00,99.04,1,0
+4268,NAD27 Michigan,1391,geographic 2D,6402,6268,,,,,Geodetic survey.,Ellipsoid taken to be 800ft above geoid. Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1996-12-12 00:00:00,96.28,1,0
+4269,NAD83,1350,geographic 2D,6402,6269,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1995-06-02 00:00:00,,1,0
+4270,Nahrwan 1967,1351,geographic 2D,6402,6270,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4271,Naparima 1972,1322,geographic 2D,6402,6271,,,,,Geodetic survey.,Naparima 1972 is an extension of the Naparima 1955 network of Trinidad to include Tobago.,Ordnance Survey International.,EPSG,1995-06-02 00:00:00,,1,0
+4272,NZGD49,1175,geographic 2D,6402,6272,,,,,Geodetic survey.,Superseded by NZGD49 in March 2000.,New Zealand Department of Lands and Surveys Technical Report No. 1; 1978.,EPSG,2000-10-19 00:00:00,2000.702,1,0
+4273,NGO 1948,1352,geographic 2D,6402,6273,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4274,Datum 73,1294,geographic 2D,6402,6274,,,,,Geodetic survey.,,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,,1,0
+4275,NTF,1353,geographic 2D,6402,6275,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4276,NSWC 9Z-2,1262,geographic 2D,6402,6276,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4277,OSGB 1936,1264,geographic 2D,6402,6277,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4278,OSGB70,1264,geographic 2D,6402,6278,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4279,OS(SN)80,1354,geographic 2D,6402,6279,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4280,Padang,1355,geographic 2D,6402,6280,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4281,Palestine 1923,1356,geographic 2D,6402,6281,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4282,Pointe Noire,1072,geographic 2D,6402,6282,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,2002.05,1,0
+4283,GDA94,1036,geographic 2D,6402,6283,,,,,Geodetic survey.,,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-06-02 00:00:00,,1,0
+4284,Pulkovo 1942,1357,geographic 2D,6402,6284,,,,,Geodetic survey.,For Germany see Pulkovo 1942(83); for Poland see Pulkovo 1942(58).,,EPSG,1995-06-02 00:00:00,,1,0
+4285,Qatar 1974,1346,geographic 2D,6402,6285,,,,,Geodetic survey.,,Qatar Centre for Geographic Information.,EPSG,2000-03-07 00:00:00,2000.29 (2001.27),1,0
+4286,Qatar 1948,1346,geographic 2D,6402,6286,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4287,Qornoq,1107,geographic 2D,6402,6287,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+4288,Loma Quintana,1313,geographic 2D,6402,6288,,,,,Geodetic survey.,Superseded by La Canoa (code 4247).,,EPSG,1995-06-02 00:00:00,,1,0
+4289,Amersfoort,1275,geographic 2D,6402,6289,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4291,SAD69,1358,geographic 2D,6402,6291,,,,,Geodetic survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.251. Error introduced if not using the truncated precision is 0 to 31mm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+4292,Sapper Hill 1943,1092,geographic 2D,6402,6292,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4293,Schwarzeck,1169,geographic 2D,6402,6293,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4294,Segora,1359,geographic 2D,6402,6294,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+4295,Serindung,1360,geographic 2D,6402,6295,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4296,Sudan,1361,geographic 2D,6402,6296,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4297,Tananarive,1149,geographic 2D,6402,6297,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4298,Timbalai 1948,1362,geographic 2D,6402,6298,,,,,Geodetic survey.,Adopts metric conversion of 39.370147 inches per metre.,,EPSG,1995-06-02 00:00:00,,1,0
+4299,TM65,1125,geographic 2D,6402,6299,,,,,Basis for topographic mapping in Republic of Ireland between 1965 and 1975; for scientific purposes only in Northern Ireland.,Superseded by 1975 Mapping Adjustment. See code 4300.,,EPSG,1995-06-02 00:00:00,,1,0
+4300,TM75,1305,geographic 2D,6402,6300,,,,,Basis for topographic mapping.,,,EPSG,1995-06-02 00:00:00,,1,0
+4301,Tokyo,1364,geographic 2D,6402,6301,,,,,Geodetic survey.,Superseded by JGD2000 (code 4612) from April 2002.,Geographic Survey Institute; Japan; Bulletin 40 (March 1994). Also http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,2002.08,1,0
+4302,Trinidad 1903,1322,geographic 2D,6402,6302,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4303,TC(1948),1363,geographic 2D,6402,6303,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4304,Voirol 1875,1365,geographic 2D,6402,6304,,,,,Geodetic survey.,,IGN Paris,EPSG,1995-06-02 00:00:00,,1,0
+4306,Bern 1938,1286,geographic 2D,6402,6306,,,,,Used for the geographic coordinates overprinted on topographic maps constructed on the CH1903 / LV03 projected CS (code 21781).,,,EPSG,1995-06-02 00:00:00,,1,0
+4307,Nord Sahara 1959,1366,geographic 2D,6402,6307,,,,,Geodetic survey.,Sometimes incorrectly referred to as Voirol Unifie 1960. Voirol Unifie 1960 is NOT a GeogCRS: it is two projected coordinate reference systems based on Nord Sahara 1959. See codes 30791 and 30792.,"""Le System Geodesique Nord-Sahara""; IGN Paris",EPSG,2002-08-29 00:00:00,2000.47 2002.56,1,0
+4308,RT38,1225,geographic 2D,6402,6308,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,97.09,1,0
+4309,Yacare,1247,geographic 2D,6402,6309,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4310,Yoff,1207,geographic 2D,6402,6310,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4311,Zanderij,1222,geographic 2D,6402,6311,,,,,Geodetic survey.,Introduced in 1975.,Shell International,EPSG,1995-06-02 00:00:00,,1,0
+4312,MGI,1321,geographic 2D,6402,6312,,,,,Geodetic survey.,,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,1995-06-02 00:00:00,,1,0
+4313,Belge 1972,1347,geographic 2D,6402,6313,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4314,DHDN,1295,geographic 2D,6402,6314,,,,,Geodetic survey.,,EPSG,EPSG,1995-06-02 00:00:00,,1,0
+4315,Conakry 1905,1112,geographic 2D,6402,6315,,,,,Geodetic survey.,Superseded by Dabola 1981 (EPSG code 4155).,IGN Paris,EPSG,1995-06-02 00:00:00,,1,0
+4316,Dealul Piscului 1933,1197,geographic 2D,6402,6316,,,,,Geodetic survey.,Superseded by 1970 system (geogCS code 4317).,,EPSG,1996-04-12 00:00:00,,1,0
+4317,Dealul Piscului 1970,1197,geographic 2D,6402,6317,,,,,Geodetic survey.,Supersedes 1933 system (geogCS code 4316).,,EPSG,1996-04-12 00:00:00,,1,0
+4318,NGN,1136,geographic 2D,6402,6318,,,,,Geodetic survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+4319,KUDAMS,1310,geographic 2D,6402,6319,,,,,Geodetic survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+4322,WGS 72,1262,geographic 2D,6402,6322,,,,,Geodetic survey.,Superseded by WGS 84.,,EPSG,1995-06-02 00:00:00,,1,0
+4324,WGS 72BE,1262,geographic 2D,6402,6324,,,,,Geodetic survey.,Broadcast ephemeris. Superseded by WGS 84.,,EPSG,1995-06-02 00:00:00,,1,0
+4326,WGS 84,1262,geographic 2D,6402,6326,,,,,Used by the GPS satellite navigation system and for NATO military geodetic surveying.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+4327,WGS 84 (geographic 3D),1262,geographic 3D,6401,6326,,,,,Used by the GPS satellite navigation system.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+4328,WGS 84 (geocentric),1262,geocentric,6500,6326,,,,,Used by the GPS satellite navigation system.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+4600,Anguilla 1957,1030,geographic 2D,6402,6600,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4601,Antigua 1943,1273,geographic 2D,6402,6601,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4602,Dominica 1945,1082,geographic 2D,6402,6602,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4603,Grenada 1953,1551,geographic 2D,6402,6603,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4604,Montserrat 1958,1165,geographic 2D,6402,6604,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4605,St. Kitts 1955,1200,geographic 2D,6402,6605,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4606,St. Lucia 1955,1201,geographic 2D,6402,6606,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4607,St. Vincent 1945,1202,geographic 2D,6402,6607,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4608,NAD27(76),1367,geographic 2D,6402,6608,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-12 00:00:00,,1,0
+4609,NAD27(CGQ77),1368,geographic 2D,6402,6609,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-12 00:00:00,,1,0
+4610,Xian 1980,1067,geographic 2D,6402,6610,,,,,Geodesy.,Supersedes Beijing 1954 (code 4214).,,EPSG,2002-02-12 00:00:00,,1,0
+4611,Hong Kong 1980,1118,geographic 2D,6402,6611,,,,,Geodetic and engineering surveying.,Supersedes Hong Kong 1963.,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+4612,JGD2000,1129,geographic 2D,6402,6612,,,,,Geodesy.,Supersedes Tokyo (code 4301) from April 2002.,Japanese Survey Federation.,EPSG,2002-04-25 00:00:00,,1,0
+4613,Segara,1360,geographic 2D,6402,6613,,,,,Geodetic survey.,,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+4614,QND95,1346,geographic 2D,6402,6614,,,,,Geodetic survey.,,Qatar Centre for Geographic Information.,EPSG,2002-06-28 00:00:00,,1,0
+4615,Porto Santo,1314,geographic 2D,6402,6615,,,,,Geodetic survey.,,Instituto Geografico e Cadastral Lisbon; http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,1,0
+4616,Selvagem Grande,2779,geographic 2D,6402,6616,,,,,Geodetic survey.,,Instituto Geografico e Cadastral Lisbon; http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,1,0
+4617,NAD83(CSRS),1336,geographic 2D,6402,6140,,,,,Geodetic survey.,In New Brunswick superseded ATS77 from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2002-07-13 00:00:00,,1,0
+4801,Bern 1898 (Bern),1286,geographic 2D,6402,6801,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4802,Bogota 1975 (Bogota),1070,geographic 2D,6402,6802,,,,,Geodetic survey.,"Supersedes earlier 3 adjustments of 1951, 1944 and 1941.","IGAC special publication no. 1, ""Geodesia"" 4th edition, 1975.",EPSG,2000-10-19 00:00:00,2000.07 2000.20,1,0
+4803,Lisbon (Lisbon),1294,geographic 2D,6402,6803,,,,,Geodetic survey.,Supersedes Lisbon 1890 system which used Bessel 1841 ellipsoid. Superseded by Datum 73 (code 4274).,Instituto Geografico e Cadastral; Lisbon,EPSG,2000-03-07 00:00:00,97.12 2000.07 2001.551,1,0
+4804,Makassar (Jakarta),1316,geographic 2D,6402,6804,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4805,MGI (Ferro),1321,geographic 2D,6402,6805,,,,,Geodetic survey.,,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4806,Monte Mario (Rome),1127,geographic 2D,6402,6806,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4807,NTF (Paris),1353,geographic 2D,6403,6807,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4808,Padang (Jakarta),1355,geographic 2D,6402,6808,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4809,Belge 1950 (Brussels),1347,geographic 2D,6402,6809,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4810,Tananarive (Paris),1149,geographic 2D,6403,6810,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4811,Voirol 1875 (Paris),1365,geographic 2D,6403,6811,,,,,Geodetic survey.,Superseded by Nord Sahara 1959 (Paris) (code 4812).,IGN Paris,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4813,Batavia (Jakarta),1285,geographic 2D,6402,6813,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4814,RT38 (Stockholm),1225,geographic 2D,6402,6814,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4815,Greek (Athens),1106,geographic 2D,6402,6815,,,,,Geodetic survey.,,Topography Department; National Technical University of Greece.,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4816,Carthage (Paris),1236,geographic 2D,6403,6816,,,,,Geodetic survey.,Superseded by Greenwich-based Carthage geogCS.,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4817,NGO 1948 (Oslo),1352,geographic 2D,6402,6817,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4818,S-JTSK (Ferro),1306,geographic 2D,6402,6818,,,,,Geodetic survey.,"S-JTSK(Ferro) is the Uniform Trigonometric Cadastral Network. It is a modification of the Austrian MGI (Ferro) geogCS, code 4805.",Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2000-03-07 00:00:00,,1,0
+4819,Nord Sahara 1959 (Paris),1366,geographic 2D,6403,6819,,,,,Geodetic survey.,,"""Le System Geodesique Nord-Sahara""; IGN Paris",EPSG,2000-10-19 00:00:00,2000.74,1,0
+4820,Segara (Jakarta),1285,geographic 2D,6402,6820,,,,,Geodetic survey.,,,EPSG,2002-06-22 00:00:00,,1,0
+4901,ATF (Paris),1326,geographic 2D,6403,6901,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4902,NDG (Paris),1369,geographic 2D,6403,6902,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4903,Madrid 1870 (Madrid),1217,geographic 2D,6402,6903,,,,,Geodetic survey.,,Institut de Geomatica; Barcelona.,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4904,Lisbon 1890 (Lisbon),1294,geographic 2D,6402,6904,,,,,Geodetic survey.,Superseded by Lisbon 1937 system which uses International 1924 ellipsoid.,Instituto Geografico e Cadastral; Lisbon,EPSG,2002-07-13 00:00:00,,1,0
+5701,Newlyn,1264,vertical,6499,5101,,,,,Geodetic and engineering surveying.,,,EPSG,1995-06-02 00:00:00,,1,0
+5702,National Geodetic Vertical Datum of 1929,1323,vertical,6497,5102,,,,,Geodetic and engineering surveying.,,,EPSG,1996-10-18 00:00:00,,1,0
+5703,North American Vertical Datum of 1988,1730,vertical,6499,5103,,,,,Geodetic and engineering surveying.,,,EPSG,1996-10-18 00:00:00,,1,0
+5704,Yellow Sea,1067,vertical,6499,5104,,,,,Geodetic and engineering surveying.,,,EPSG,1995-06-02 00:00:00,,1,1
+5705,Baltic,1284,vertical,6499,5105,,,,,Geodetic and engineering surveying.,,,EPSG,1996-09-12 00:00:00,,1,0
+5706,Caspian,1291,vertical,6498,5106,,,,,Used for Soviet Union nautical charting of the Caspian Sea.,Capsian Sea water levels are now offset appreciably from this datum.,,EPSG,1996-09-12 00:00:00,,1,0
+5709,Normaal Amsterdams Peil,1275,vertical,6499,5109,,,,,Geodetic and engineering surveying.,,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,2000-03-07 00:00:00,2000.10,1,0
+5710,Oostende,1347,vertical,6499,5110,,,,,Geodetic and engineering surveying.,,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,1996-09-12 00:00:00,,1,0
+5711,Australian Height Datum,1281,vertical,6499,5111,,,,,Geodetic and engineering surveying.,,http://www.auslig.gov.au/geodesy,EPSG,1996-09-12 00:00:00,,1,0
+5712,Australian Height Datum (Tasmania),1282,vertical,6499,5112,,,,,Geodetic and engineering surveying.,,,EPSG,1996-09-12 00:00:00,,1,0
+5713,Canadian Vertical Datum of 1928,1289,vertical,6499,5114,,,,,Geodetic and engineering surveying.,,,EPSG,1996-12-12 00:00:00,,1,0
+5714,mean sea level height,1262,vertical,6499,5100,,,,,Used for hydrographic surveying.,Approximates geoid. Not specific to any location or epoch.,,EPSG,1996-04-12 00:00:00,,1,0
+5715,mean sea level depth,1262,vertical,6498,5100,,,,,Used for hydrographic surveying.,Approximates geoid. Not specific to any location or epoch.,,EPSG,1996-10-18 00:00:00,,1,0
+5716,Piraeus,1106,vertical,6499,5115,,,,,Geodetic and engineering surveying.,,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,1997-06-16 00:00:00,,1,0
+5717,N60,1095,vertical,6499,5116,,,,,Geodetic and engineering surveying.,In use since 1968.,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+5718,RH70,1225,vertical,6499,5117,,,,,Geodetic and engineering surveying.,,National and Survey of Sweden,EPSG,1997-11-13 00:00:00,,1,0
+5719,NGF Lallemand,1326,vertical,6499,5118,,,,,Geodetic and engineering surveying.,Generally but not entirely superseded by NGF IGN69 (code 5720).,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994",EPSG,1997-11-13 00:00:00,,1,0
+5720,NGF IGN69,1326,vertical,6499,5119,,,,,Geodetic and engineering surveying.,,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994",EPSG,1997-11-13 00:00:00,,1,0
+5721,NGF IGN78,1327,vertical,6499,5120,,,,,Geodetic and engineering surveying.,,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994",EPSG,1997-11-13 00:00:00,,1,0
+5722,Maputo,1167,vertical,6499,5121,,,,,Geodetic and engineering surveying.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+5723,Japanese Standard Levelling Datum,1129,vertical,6499,5122,,,,,Geodetic and engineering surveying.,,Ministry of Construction; Japan. http://vldb.gsi-mc.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+5724,PDO Height Datum 1993,1183,vertical,6499,5123,,,,,Geodetic and engineering surveying.,Supersedes Fahud vertical datum (code 5725) from 1993.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,1,0
+5725,Fahud Height Datum 1993,1183,vertical,6499,5124,,,,,Geodetic and engineering surveying.,Superseded by PHD93 (code 5724) from 1993.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,1,0
+5726,Ha Tien 1960,1302,vertical,6499,5125,,,,,Geodetic and engineering surveying.,In Vietnam superseded by Hon Dau from 1992.,,EPSG,1999-10-20 00:00:00,,1,0
+5727,Hon Dau 1992,1252,vertical,6499,5126,,,,,Geodetic and engineering surveying.,In Vietnam supersedes Ha Tien from 1992.,,EPSG,1999-10-20 00:00:00,,1,0
+5728,Landesnivellement 1902,1286,vertical,6499,5127,,,,,Geodetic and engineering surveying.,To be superseded by LHN95 (code 5729).,Bundesamt f�r Landestopographie,EPSG,1999-10-20 00:00:00,,1,0
+5729,Landeshohennetz 1995,1286,vertical,6499,5128,,,,,Geodetic and engineering surveying.,To supersede LN02 (code 5728).,Bundesamt f�r Landestopographie,EPSG,1999-10-20 00:00:00,,1,0
+5730,European Vertical Reference System 2000,1298,vertical,6499,5129,,,,,For pan-European products and services.,,IAG subcommission for Europe,EPSG,2000-10-19 00:00:00,,1,0
+5731,Malin Head,1305,vertical,6499,5130,,,,,Topographic mapping at all scales in Republic and medium and small scales in Northern Ireland.,Belfast (code 5732) used for large scale topographic mapping in Northern Ireland.,Ordnance Survey of Ireland.,EPSG,2001-11-06 00:00:00,,1,0
+5732,Belfast,2530,vertical,6499,5131,,,,,Large scale topographic mapping.,Malin Head (code 5731) used for medium and small scale topographic mapping.,Ordnance Survey of Northern Ireland.,EPSG,2001-11-06 00:00:00,,1,0
+5733,Dansk Normal Nul,1080,vertical,6499,5132,,,,,Topographic mapping and engineering survey.,,Kort & Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+5734,AIOC95 depths,2592,vertical,6498,5133,,,,,Used by AIOC and BP for all offshore Azerbaijan activities and also as a height system for engineering survey at Sangachal terminal.,AIOC95 datum is 1.7m above Caspian datum and 26.3m below Baltic datum.,BP,EPSG,2002-02-12 00:00:00,,1,0
+5735,Black Sea,1102,vertical,6499,5134,,,,,Hydrographic surveying and since breakup of Former Soviet Union also topographic mapping.,Black Sea datum is 0.4m below Baltic datum.,BP,EPSG,2002-02-12 00:00:00,,1,0
+5736,Yellow Sea 1956,1067,vertical,6499,5104,,,,,Geodetic and engineering surveying.,Superseded by Yellow Sea 1985 (code 5737).,Guangdong Province Land Resource Information Centre,EPSG,2002-06-22 00:00:00,,1,0
+5737,Yellow Sea 1985,1067,vertical,6499,5137,,,,,Geodetic and engineering surveying.,Supersedes Yellow Sea 1956 (code 5736).,Guangdong Province Land Resource Information Centre,EPSG,2002-06-22 00:00:00,,1,0
+5738,Hong Kong Principal Datum,1118,vertical,6499,5135,,,,,"Geodetic, topographic and engineering surveying.",,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+5739,Hong Kong Chart Datum,1118,vertical,6498,5136,,,,,Hydrographic charting.,Chart datum is 0.15 metres below Hong Kong Principal Datum (CRS code 5738) and 1.38m below MSL at Quarry Bay.,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+5800,Astra Minas Grid,1265,engineering,6507,9300,,,,,Oil exploration.,,,EPSG,2000-03-07 00:00:00,,1,0
+5801,Barcelona Grid B1,1266,engineering,4500,9301,,,,,Oil exploration by MGO and Talon.,Centre of the gateway of San Cristobal chuch; Plaza Boyaca; Barcelona. 500000E 300000 N at 10deg 08min 06sec N 64deg 41min 17sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-03-07 00:00:00,,1,0
+5802,Barcelona Grid B2,1266,engineering,4500,9301,,,,,Oil exploration by Phillips; Mobil; Texas; Mercedes; Varco.,Centre of the gateway of San Cristobal chuch; Plaza Boyaca; Barcelona. 500000E 300000 N at 10deg 08min 06sec N 64deg 41min 07.5sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-03-07 00:00:00,,1,0
+5803,Maturin Grid,1320,engineering,4500,9302,,,,,Oil exploration by MGO and Talon.,Centre of the gateway of San Cristobal chuch; Plaza Boyaca; Barcelona. 500000E 300000 N at 10deg 08min 06sec N 64deg 41min 17sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-03-07 00:00:00,,1,0
+5804,EPSG seismic bin grid example A,1263,engineering,6508,9312,,,,,Example only - fictitious.,"Bin grid I=J=1 at WGS 84 / UTM zone 31N 456781E 5836723N.
+Bin grid orientation = 20 degrees grid. Bin width I=25m, J=12.5m. Bin increment I=1, J=1. Scale factor at origin 0.99984",UKOOA P6/98 seismic bin grid guideline.,EPSG,2000-06-23 00:00:00,,1,0
+5805,EPSG seismic bin grid example B,1263,engineering,6506,9312,,,,,Example only - fictitious.,,,EPSG,2000-06-23 00:00:00,,1,0
+5806,EPSG local engineering grid example A,1263,engineering,6505,9313,,,,,Example only - fictitious.,"Coordinates are 0,0 at conductor slot A1.",EPSG,EPSG,2000-06-23 00:00:00,,1,0
+5807,EPSG local engineering grid example B,1263,engineering,6504,9313,,,,,Example only - fictitious.,"Shows alternative use of coordinate axis name.
+
+Coordinates are 0,0 at conductor slot A1.",EPSG,EPSG,2000-06-23 00:00:00,,1,0
+5808,Maracaibo Cross Grid M4,1319,engineering,4500,9303,,,,,Oil exploration by Chevron and CVP.,Grid coordinates 200000N 200000E at Cruz Canada Morillo in Maracaibo. The cross is ascribed coordinates of 10deg 38min 22sec N; 71deg 37min 18sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5809,Maracaibo Cross Grid M5,1319,engineering,4500,9303,,,,,Oil exploration by Texas.,Grid coordinates 200000N 200000E at Cruz Canada Morillo in Maracaibo. The cross is ascribed coordinates of 10deg 38min 32.3sec N; 71deg 37min 12.1sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5810,La Rosa Grid,1311,engineering,4500,9304,,,,,Oil exploration.,Grid coordinates (0 0) at the monument in La Rosa (10deg 22min 40.417sec N 71deg 26min 59.488sec W; Loma Qunitana datum). Origin possibly at Cerro Penal (71deg 12min 58sec W) where grid north aligned to true north. See Lake / Maracaibo La Rosa grid.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5811,Mene Grande,1270,engineering,4500,9305,,,,,Oil exploration by Shell.,Grid coordinates (0 0) at the monument in Santa Barabara; Mene Grande. The monument is ascribed coordinates of 9deg 52min 25.488sec N; 70deg 54min 35.310sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5812,El Cubo,1269,engineering,4500,9306,,,,,Oil exploration by Shell.,Grid coordinates (0 0) at El Cubo (8deg 44min 17.258sec N; 72deg 30min 09.01sec W).,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5813,Dabajuro,1268,engineering,4500,9307,,,,,Oil exploration by Chevron Creole and Texas.,Grid coordinates 200000N 200000E at the centre of the tower of the church at Dabajuro. The tower is ascribed coordinates of 11deg 01min 19sec N; 70deg 40min 40sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5814,Tucupita,1370,engineering,4500,9308,,,,,Oil exploration by Creole and Texas.,Grid coordinates 200000N 200000E at centre of the Bolivar plaza in Tucupita. The plaza is ascribed coordinates of 9deg 03min 32sec N; 62deg 03min 07.6sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5815,Santa Maria de Ipire,1371,engineering,4500,9310,,,,,Oil exploration by Creole Phillips and Varco.,Grid coordinates 200000N 200000E at concrete monument PR-1 in the Bolivar plaza in Santa Maria de Ipire. The monument is ascribed coordinates of 8deg 40min 06sec N; 65deg 19min 09sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5816,Barinas west base,1267,engineering,4500,9311,,,,,Oil exploration by Sinclair.,Grid coordinates 200000N 200000E at the west base monument in Barinas.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+7400,NTF (Paris) + NGF IGN69,1326,compound,,,,,4807,5720,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+7401,NTF (Paris) / France II + NGF Lallemand,1326,compound,,,,,27582,5719,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,1
+7402,NTF (Paris) / France II + NGF IGN69,1326,compound,,,,,27582,5720,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,1
+7403,NTF (Paris) / France III + NGF IGN69,1733,compound,,,,,27583,5720,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,1
+7404,RT90 + RH70,1225,compound,,,,,4124,5718,Large and medium scale topographic mapping and engineering survey.,When combined with geoid model RN92 forms geographic 3D coordinate system RR92.,National Land Survey of Sweden,EPSG,1997-11-13 00:00:00,,1,0
+7405,OSGB36 / British National Grid + ODN,1264,compound,,,,,27700,5701,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+7406,NAD27 + NGVD29,1323,compound,,,,,4267,5702,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+7407,NAD27 / Texas North + NGVD29,2253,compound,,,,,32037,5702,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+7408,RD/NAP,1275,compound,,,,,4289,5709,Large and medium scale topographic mapping and engineering survey.,,http://rdnap.kadaster.nl/rd/index.html,EPSG,2000-10-19 00:00:00,,1,0
+7409,ETRS89 + EVRS2000,1298,compound,,,,,4258,5730,For pan-European products and services.,,IAG subcommission for Europe,EPSG,2000-10-19 00:00:00,,1,0
+7410,PSHD93,1183,compound,,,,,4134,5724,Oil exploration.,,Petroleum Development Oman,EPSG,2001-06-05 00:00:00,,1,0
+7411,NTF (Paris) / Lambert zone II + NGF Lallemand,1326,compound,,,,,27572,5719,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,,1,0
+7412,NTF (Paris) / Lambert zone II + NGF IGN69,1326,compound,,,,,27572,5719,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,,1,0
+7413,NTF (Paris) / Lambert zone III + NGF IGN69,1733,compound,,,,,27573,5719,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,,1,0
+20004,Pulkovo 1995 / Gauss-Kruger zone 4,1763,projected,4530,,4200,16204,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 21E (code 2463).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20005,Pulkovo 1995 / Gauss-Kruger zone 5,1764,projected,4530,,4200,16205,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 27E (code 2464).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20006,Pulkovo 1995 / Gauss-Kruger zone 6,1765,projected,4530,,4200,16206,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 33E (code 2465).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20007,Pulkovo 1995 / Gauss-Kruger zone 7,1766,projected,4530,,4200,16207,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 39E (code 2466).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20008,Pulkovo 1995 / Gauss-Kruger zone 8,1767,projected,4530,,4200,16208,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 45E (code 2467).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20009,Pulkovo 1995 / Gauss-Kruger zone 9,1768,projected,4530,,4200,16209,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 51E (code 2468).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20010,Pulkovo 1995 / Gauss-Kruger zone 10,1769,projected,4530,,4200,16210,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 57E (code 2469).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20011,Pulkovo 1995 / Gauss-Kruger zone 11,1770,projected,4530,,4200,16211,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 63E (code 2470).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20012,Pulkovo 1995 / Gauss-Kruger zone 12,1771,projected,4530,,4200,16212,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 69E (code 2471).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20013,Pulkovo 1995 / Gauss-Kruger zone 13,1772,projected,4530,,4200,16213,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 75E (code 2472).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20014,Pulkovo 1995 / Gauss-Kruger zone 14,1773,projected,4530,,4200,16214,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 81E (code 2473).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20015,Pulkovo 1995 / Gauss-Kruger zone 15,1774,projected,4530,,4200,16215,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 87E (code 2474).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20016,Pulkovo 1995 / Gauss-Kruger zone 16,1775,projected,4530,,4200,16216,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 93E (code 2475).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20017,Pulkovo 1995 / Gauss-Kruger zone 17,1776,projected,4530,,4200,16217,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 99E (code 2476).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20018,Pulkovo 1995 / Gauss-Kruger zone 18,1777,projected,4530,,4200,16218,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 105E (code 2477).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20019,Pulkovo 1995 / Gauss-Kruger zone 19,1778,projected,4530,,4200,16219,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 111E (code 2478).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20020,Pulkovo 1995 / Gauss-Kruger zone 20,1779,projected,4530,,4200,16220,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 117E (code 2479).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20021,Pulkovo 1995 / Gauss-Kruger zone 21,1780,projected,4530,,4200,16221,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 123E (code 2480).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20022,Pulkovo 1995 / Gauss-Kruger zone 22,1781,projected,4530,,4200,16222,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 129E (code 2481).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20023,Pulkovo 1995 / Gauss-Kruger zone 23,1782,projected,4530,,4200,16223,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 135E (code 2482).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20024,Pulkovo 1995 / Gauss-Kruger zone 24,1783,projected,4530,,4200,16224,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 141E (code 2483).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20025,Pulkovo 1995 / Gauss-Kruger zone 25,1784,projected,4530,,4200,16225,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 147E (code 2484).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20026,Pulkovo 1995 / Gauss-Kruger zone 26,1785,projected,4530,,4200,16226,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 153E (code 2485).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20027,Pulkovo 1995 / Gauss-Kruger zone 27,1786,projected,4530,,4200,16227,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 159E (code 2486).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20028,Pulkovo 1995 / Gauss-Kruger zone 28,1787,projected,4530,,4200,16228,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 165E (code 2487).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20029,Pulkovo 1995 / Gauss-Kruger zone 29,1788,projected,4530,,4200,16229,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 171E (code 2488).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20030,Pulkovo 1995 / Gauss-Kruger zone 30,1789,projected,4530,,4200,16230,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 177E (code 2489).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20031,Pulkovo 1995 / Gauss-Kruger zone 31,1790,projected,4530,,4200,16231,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 177W (code 2490).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20032,Pulkovo 1995 / Gauss-Kruger zone 32,1791,projected,4530,,4200,16232,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 171W (code 2491).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20064,Pulkovo 1995 / Gauss-Kruger 4N,1763,projected,4530,,4200,16304,,,Truncated form of Gauss-Kruger zone 4,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20065,Pulkovo 1995 / Gauss-Kruger 5N,1764,projected,4530,,4200,16305,,,Truncated form of Gauss-Kruger zone 5,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20066,Pulkovo 1995 / Gauss-Kruger 6N,1765,projected,4530,,4200,16306,,,Truncated form of Gauss-Kruger zone 6,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20067,Pulkovo 1995 / Gauss-Kruger 7N,1766,projected,4530,,4200,16307,,,Truncated form of Gauss-Kruger zone 7,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20068,Pulkovo 1995 / Gauss-Kruger 8N,1767,projected,4530,,4200,16308,,,Truncated form of Gauss-Kruger zone 8,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20069,Pulkovo 1995 / Gauss-Kruger 9N,1768,projected,4530,,4200,16309,,,Truncated form of Gauss-Kruger zone 9,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20070,Pulkovo 1995 / Gauss-Kruger 10N,1769,projected,4530,,4200,16310,,,Truncated form of Gauss-Kruger zone 10,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20071,Pulkovo 1995 / Gauss-Kruger 11N,1770,projected,4530,,4200,16311,,,Truncated form of Gauss-Kruger zone 11,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20072,Pulkovo 1995 / Gauss-Kruger 12N,1771,projected,4530,,4200,16312,,,Truncated form of Gauss-Kruger zone 12,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20073,Pulkovo 1995 / Gauss-Kruger 13N,1772,projected,4530,,4200,16313,,,Truncated form of Gauss-Kruger zone 13,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20074,Pulkovo 1995 / Gauss-Kruger 14N,1773,projected,4530,,4200,16314,,,Truncated form of Gauss-Kruger zone 14,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20075,Pulkovo 1995 / Gauss-Kruger 15N,1774,projected,4530,,4200,16315,,,Truncated form of Gauss-Kruger zone 15,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20076,Pulkovo 1995 / Gauss-Kruger 16N,1775,projected,4530,,4200,16316,,,Truncated form of Gauss-Kruger zone 16,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20077,Pulkovo 1995 / Gauss-Kruger 17N,1776,projected,4530,,4200,16317,,,Truncated form of Gauss-Kruger zone 17,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20078,Pulkovo 1995 / Gauss-Kruger 18N,1777,projected,4530,,4200,16318,,,Truncated form of Gauss-Kruger zone 18,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20079,Pulkovo 1995 / Gauss-Kruger 19N,1778,projected,4530,,4200,16319,,,Truncated form of Gauss-Kruger zone 19,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20080,Pulkovo 1995 / Gauss-Kruger 20N,1779,projected,4530,,4200,16320,,,Truncated form of Gauss-Kruger zone 20,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20081,Pulkovo 1995 / Gauss-Kruger 21N,1780,projected,4530,,4200,16321,,,Truncated form of Gauss-Kruger zone 21,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20082,Pulkovo 1995 / Gauss-Kruger 22N,1781,projected,4530,,4200,16322,,,Truncated form of Gauss-Kruger zone 22,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20083,Pulkovo 1995 / Gauss-Kruger 23N,1782,projected,4530,,4200,16323,,,Truncated form of Gauss-Kruger zone 23,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20084,Pulkovo 1995 / Gauss-Kruger 24N,1783,projected,4530,,4200,16324,,,Truncated form of Gauss-Kruger zone 24,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20085,Pulkovo 1995 / Gauss-Kruger 25N,1784,projected,4530,,4200,16325,,,Truncated form of Gauss-Kruger zone 25,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20086,Pulkovo 1995 / Gauss-Kruger 26N,1785,projected,4530,,4200,16326,,,Truncated form of Gauss-Kruger zone 26,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20087,Pulkovo 1995 / Gauss-Kruger 27N,1786,projected,4530,,4200,16327,,,Truncated form of Gauss-Kruger zone 27,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20088,Pulkovo 1995 / Gauss-Kruger 28N,1787,projected,4530,,4200,16328,,,Truncated form of Gauss-Kruger zone 28,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20089,Pulkovo 1995 / Gauss-Kruger 29N,1788,projected,4530,,4200,16329,,,Truncated form of Gauss-Kruger zone 29,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20090,Pulkovo 1995 / Gauss-Kruger 30N,1789,projected,4530,,4200,16330,,,Truncated form of Gauss-Kruger zone 30,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20091,Pulkovo 1995 / Gauss-Kruger 31N,1790,projected,4530,,4200,16331,,,Truncated form of Gauss-Kruger zone 31,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20092,Pulkovo 1995 / Gauss-Kruger 32N,1791,projected,4530,,4200,16332,,,Truncated form of Gauss-Kruger zone 32,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20137,Adindan / UTM zone 37N,1552,projected,4400,,4201,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20138,Adindan / UTM zone 38N,1553,projected,4400,,4201,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20248,AGD66 / AMG zone 48,1556,projected,4400,,4202,17448,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20249,AGD66 / AMG zone 49,1557,projected,4400,,4202,17449,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20250,AGD66 / AMG zone 50,1558,projected,4400,,4202,17450,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20251,AGD66 / AMG zone 51,1559,projected,4400,,4202,17451,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20252,AGD66 / AMG zone 52,1560,projected,4400,,4202,17452,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20253,AGD66 / AMG zone 53,1561,projected,4400,,4202,17453,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20254,AGD66 / AMG zone 54,1567,projected,4400,,4202,17454,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20255,AGD66 / AMG zone 55,1568,projected,4400,,4202,17455,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20256,AGD66 / AMG zone 56,1564,projected,4400,,4202,17456,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20257,AGD66 / AMG zone 57,1565,projected,4400,,4202,17457,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20258,AGD66 / AMG zone 58,1566,projected,4400,,4202,17458,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20348,AGD84 / AMG zone 48,1556,projected,4400,,4203,17448,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20349,AGD84 / AMG zone 49,1557,projected,4400,,4203,17449,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20350,AGD84 / AMG zone 50,1558,projected,4400,,4203,17450,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20351,AGD84 / AMG zone 51,1559,projected,4400,,4203,17451,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20352,AGD84 / AMG zone 52,1560,projected,4400,,4203,17452,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20353,AGD84 / AMG zone 53,1561,projected,4400,,4203,17453,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20354,AGD84 / AMG zone 54,1562,projected,4400,,4203,17454,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20355,AGD84 / AMG zone 55,1563,projected,4400,,4203,17455,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20356,AGD84 / AMG zone 56,1564,projected,4400,,4203,17456,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20357,AGD84 / AMG zone 57,1565,projected,4400,,4203,17457,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20358,AGD84 / AMG zone 58,1566,projected,4400,,4203,17458,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20437,Ain el Abd / UTM zone 37N,1569,projected,4400,,4204,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,97.59,1,0
+20438,Ain el Abd / UTM zone 38N,1571,projected,4400,,4204,16038,,,"Large and medium scale topographic mapping and engineering survey. In Kuwait Oil production (but not exploration - see KOC Lambert, code 24600).","Known in Kuwait as ""KOC UTM"". Used by KOC for engineering but not explorartion (see KOC Lambert, code 24600).",,EPSG,1997-11-13 00:00:00,97.59,1,0
+20439,Ain el Abd / UTM zone 39N,1570,projected,4400,,4204,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,97.59,1,0
+20499,Ain el Abd / Bahrain Grid,1040,projected,4400,,4204,19900,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20538,Afgooye / UTM zone 38N,1554,projected,4400,,4205,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20539,Afgooye / UTM zone 39N,1555,projected,4400,,4205,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20790,Lisbon (Lisbon)/Portuguese National Grid,1294,projected,4499,,4803,19936,,,Large and medium scale topographic mapping and engineering survey for military purposes.,,Instituto Geografico e Cadastral; Lisbon,EPSG,1998-11-11 00:00:00,98.42 2000.551,1,0
+20791,Lisbon (Lisbon)/Portuguese Grid,1294,projected,4499,,4803,19969,,,Large and medium scale topographic mapping and engineering survey.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+20822,Aratu / UTM zone 22S,1572,projected,4400,,4208,16122,,,Oil exploration and production.,,,EPSG,1995-07-21 00:00:00,95.191,1,0
+20823,Aratu / UTM zone 23S,1573,projected,4400,,4208,16123,,,Oil exploration and production.,,,EPSG,1995-07-21 00:00:00,95.191,1,0
+20824,Aratu / UTM zone 24S,1574,projected,4400,,4208,16124,,,Oil exploration and production.,,,EPSG,1995-07-21 00:00:00,95.191,1,0
+20934,Arc 1950 / UTM zone 34S,1575,projected,4400,,4209,16134,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+20935,Arc 1950 / UTM zone 35S,1576,projected,4400,,4209,16135,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+20936,Arc 1950 / UTM zone 36S,1577,projected,4400,,4209,16136,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21035,Arc 1960 / UTM zone 35S,1579,projected,4400,,4210,16135,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21036,Arc 1960 / UTM zone 36S,1581,projected,4400,,4210,16136,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21037,Arc 1960 / UTM zone 37S,1583,projected,4400,,4210,16137,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21095,Arc 1960 / UTM zone 35N,1578,projected,4400,,4210,16035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21096,Arc 1960 / UTM zone 36N,1580,projected,4400,,4210,16036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21097,Arc 1960 / UTM zone 37N,1582,projected,4400,,4210,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21100,Batavia (Jakarta) / NEIEZ,1285,projected,4499,,4813,19905,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+21148,Batavia / UTM zone 48S,1584,projected,4400,,4211,16148,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+21149,Batavia / UTM zone 49S,1586,projected,4400,,4211,16149,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+21150,Batavia / UTM zone 50S,1585,projected,4400,,4211,16150,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+21291,Barbados 1938 / British West Indies Grid,1042,projected,4400,,4212,19942,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by Barbados National Grid (code 21292) from 1983.,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+21292,Barbados 1938 / Barbados National Grid,1042,projected,4400,,4212,19943,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Barbados 1938 / BWI Grid (code 21291) from 1983.,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+21413,Beijing 1954 / Gauss-Kruger zone 13,1587,projected,4530,,4214,16213,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 75E (code 24153). Superseded by Xian 1980 / Gauss-Kruger zone 13 (code 2327).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21414,Beijing 1954 / Gauss-Kruger zone 14,1588,projected,4530,,4214,16214,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 81E (code 24154). Superseded by Xian 1980 / Gauss-Kruger zone 14 (code 2328).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21415,Beijing 1954 / Gauss-Kruger zone 15,1589,projected,4530,,4214,16215,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 87E (code 24155). Superseded by Xian 1980 / Gauss-Kruger zone 15 (code 2329).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21416,Beijing 1954 / Gauss-Kruger zone 16,1590,projected,4530,,4214,16216,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 93E (code 24156). Superseded by Xian 1980 / Gauss-Kruger zone 16 (code 2330).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21417,Beijing 1954 / Gauss-Kruger zone 17,1591,projected,4530,,4214,16217,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 99E (code 24157). Superseded by Xian 1980 / Gauss-Kruger zone 17 (code 2331).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21418,Beijing 1954 / Gauss-Kruger zone 18,1592,projected,4530,,4214,16218,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 105E (code 24158). Superseded by Xian 1980 / Gauss-Kruger zone 18 (code 2332).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21419,Beijing 1954 / Gauss-Kruger zone 19,1593,projected,4530,,4214,16219,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 111E (code 24159). Superseded by Xian 1980 / Gauss-Kruger zone 19 (code 2333).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21420,Beijing 1954 / Gauss-Kruger zone 20,1594,projected,4530,,4214,16220,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 117E (code 24160). Superseded by Xian 1980 / Gauss-Kruger zone 20 (code 2334).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21421,Beijing 1954 / Gauss-Kruger zone 21,1595,projected,4530,,4214,16221,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 123E (code 24161). Superseded by Xian 1980 / Gauss-Kruger zone 21 (code 2335).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21422,Beijing 1954 / Gauss-Kruger zone 22,1596,projected,4530,,4214,16222,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 129E (code 24162). Superseded by Xian 1980 / Gauss-Kruger zone 22 (code 2336).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21423,Beijing 1954 / Gauss-Kruger zone 23,1597,projected,4530,,4214,16223,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 135E (code 24163). Superseded by Xian 1980 / Gauss-Kruger zone 23 (code 2337).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21453,Beijing 1954 / Gauss-Kruger CM 75E,1587,projected,4530,,4214,16313,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 13 (code 21413). Superseded by Xian 1980 / Gauss-Kruger CM 75E (code 2338).,,EPSG,2002-06-22 00:00:00,,1,0
+21454,Beijing 1954 / Gauss-Kruger CM 81E,1588,projected,4530,,4214,16314,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 14 (code 21414). Superseded by Xian 1980 / Gauss-Kruger CM 81E (code 2339).,,EPSG,2002-06-22 00:00:00,,1,0
+21455,Beijing 1954 / Gauss-Kruger CM 87E,1589,projected,4530,,4214,16315,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 15 (code 21415). Superseded by Xian 1980 / Gauss-Kruger CM 87E (code 2340).,,EPSG,2002-06-22 00:00:00,,1,0
+21456,Beijing 1954 / Gauss-Kruger CM 93E,1590,projected,4530,,4214,16316,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 16 (code 21416). Superseded by Xian 1980 / Gauss-Kruger CM 93E (code 2341).,,EPSG,2002-06-22 00:00:00,,1,0
+21457,Beijing 1954 / Gauss-Kruger CM 99E,1591,projected,4530,,4214,16317,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 17 (code 21417). Superseded by Xian 1980 / Gauss-Kruger CM 99E (code 2342).,,EPSG,2002-06-22 00:00:00,,1,0
+21458,Beijing 1954 / Gauss-Kruger CM 105E,1592,projected,4530,,4214,16318,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 18 (code 21418). Superseded by Xian 1980 / Gauss-Kruger CM 105E (code 2343).,,EPSG,2002-06-22 00:00:00,,1,0
+21459,Beijing 1954 / Gauss-Kruger CM 111E,1593,projected,4530,,4214,16319,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 19 (code 21419). Superseded by Xian 1980 / Gauss-Kruger CM 111E (code 2344).,,EPSG,2002-06-22 00:00:00,,1,0
+21460,Beijing 1954 / Gauss-Kruger CM 117E,1594,projected,4530,,4214,16320,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 20 (code 21420). Superseded by Xian 1980 / Gauss-Kruger CM 117E (code 2345).,,EPSG,2002-06-22 00:00:00,,1,0
+21461,Beijing 1954 / Gauss-Kruger CM 123E,1595,projected,4530,,4214,16321,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 21 (code 21421). Superseded by Xian 1980 / Gauss-Kruger CM 123E (code 2346).,,EPSG,2002-06-22 00:00:00,,1,0
+21462,Beijing 1954 / Gauss-Kruger CM 129E,1596,projected,4530,,4214,16322,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 22 (code 21422). Superseded by Xian 1980 / Gauss-Kruger CM 129E (code 2347).,,EPSG,2002-06-22 00:00:00,,1,0
+21463,Beijing 1954 / Gauss-Kruger CM 135E,1597,projected,4530,,4214,16323,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 33 (code 21423). Superseded by Xian 1980 / Gauss-Kruger CM 135E (code 2348).,,EPSG,2002-06-22 00:00:00,,1,0
+21473,Beijing 1954 / Gauss-Kruger 13N,1587,projected,4530,,4214,16313,,,Truncated form of Gauss-Kruger zone 13,,,EPSG,1995-06-02 00:00:00,,1,1
+21474,Beijing 1954 / Gauss-Kruger 14N,1588,projected,4530,,4214,16314,,,Truncated form of Gauss-Kruger zone 14,,,EPSG,1995-06-02 00:00:00,,1,1
+21475,Beijing 1954 / Gauss-Kruger 15N,1589,projected,4530,,4214,16315,,,Truncated form of Gauss-Kruger zone 15,,,EPSG,1995-06-02 00:00:00,,1,1
+21476,Beijing 1954 / Gauss-Kruger 16N,1590,projected,4530,,4214,16316,,,Truncated form of Gauss-Kruger zone 16,,,EPSG,1995-06-02 00:00:00,,1,1
+21477,Beijing 1954 / Gauss-Kruger 17N,1591,projected,4530,,4214,16317,,,Truncated form of Gauss-Kruger zone 17,,,EPSG,1995-06-02 00:00:00,,1,1
+21478,Beijing 1954 / Gauss-Kruger 18N,1592,projected,4530,,4214,16318,,,Truncated form of Gauss-Kruger zone 18,,,EPSG,1995-06-02 00:00:00,,1,1
+21479,Beijing 1954 / Gauss-Kruger 19N,1593,projected,4530,,4214,16319,,,Truncated form of Gauss-Kruger zone 19,,,EPSG,1995-06-02 00:00:00,,1,1
+21480,Beijing 1954 / Gauss-Kruger 20N,1594,projected,4530,,4214,16320,,,Truncated form of Gauss-Kruger zone 20,,,EPSG,1995-06-02 00:00:00,,1,1
+21481,Beijing 1954 / Gauss-Kruger 21N,1595,projected,4530,,4214,16321,,,Truncated form of Gauss-Kruger zone 21,,,EPSG,1995-06-02 00:00:00,,1,1
+21482,Beijing 1954 / Gauss-Kruger 22N,1596,projected,4530,,4214,16322,,,Truncated form of Gauss-Kruger zone 22,,,EPSG,1995-06-02 00:00:00,,1,1
+21483,Beijing 1954 / Gauss-Kruger 23N,1597,projected,4530,,4214,16323,,,Truncated form of Gauss-Kruger zone 23,,,EPSG,1995-06-02 00:00:00,,1,1
+21500,Belge 1950 (Brussels) / Belge Lambert 50,1347,projected,4499,,4809,19901,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Belge 1972 / Belge Lambert 72 (code 31300) and Belge 1972 / Belgian Lambert 72 (code 31370).,,EPSG,1997-04-11 00:00:00,97.13,1,0
+21780,Bern 1898 (Bern) / LV03C,1286,projected,4498,,4801,19923,,,Large and medium scale topographic mapping and engineering survey.,Superseded by CH1903 / LV03 (code 21781).,,EPSG,1997-06-30 00:00:00,97.27 97.62,1,0
+21781,CH1903 / LV03,1286,projected,4498,,4149,19922,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes LV03C (code 21780). Superseded by CH1903+/LV95 (code 2056).,,EPSG,1999-10-20 00:00:00,2001.29,1,0
+21817,Bogota 1975 / UTM zone 17N,1602,projected,4400,,4218,16017,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,2000.20,1,0
+21818,Bogota 1975 / UTM zone 18N,1603,projected,4400,,4218,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,2000.20,1,0
+21891,Bogota 1975 / Colombia West zone,1598,projected,4499,,4218,18051,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,97.11 97.57 2000.20,1,0
+21892,Bogota 1975 / Colombia Bogota zone,1599,projected,4499,,4218,18052,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,97.11 97.57 2000.20,1,0
+21893,Bogota 1975 / Colombia East Central zone,1600,projected,4499,,4218,18053,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,97.11 97.57 2000.20,1,0
+21894,Bogota 1975 / Colombia East,1601,projected,4499,,4218,18054,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,97.11 97.57 2000.20,1,0
+22032,Camacupa / UTM zone 32S,1606,projected,4400,,4220,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,97.58,1,0
+22033,Camacupa / UTM zone 33S,1607,projected,4400,,4220,16133,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,97.58,1,0
+22091,Camacupa / TM 11.30 SE,1605,projected,4400,,4220,16611,,,Oil exploration by Esso Angola offshore blocks 15 and 24.,,Esso Angola,EPSG,1998-11-11 00:00:00,,1,0
+22092,Camacupa / TM 12 SE,1604,projected,4400,,4220,16612,,,"Oil exploration by Shell Angola for offshore blocks 1 and 16 and by BP Amoco, Elf and Esso for offshore blocks 31-33.",,Shell Angola,EPSG,1998-11-11 00:00:00,,1,0
+22191,Campo Inchauspe / Argentina 1,1608,projected,4530,,4221,18031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22192,Campo Inchauspe / Argentina 2,1609,projected,4530,,4221,18032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22193,Campo Inchauspe / Argentina 3,1610,projected,4530,,4221,18033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22194,Campo Inchauspe / Argentina 4,1611,projected,4530,,4221,18034,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22195,Campo Inchauspe / Argentina 5,1612,projected,4530,,4221,18035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22196,Campo Inchauspe / Argentina 6,1613,projected,4530,,4221,18036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22197,Campo Inchauspe / Argentina 7,1614,projected,4530,,4221,18037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22234,Cape / UTM zone 34S,1615,projected,4400,,4222,16134,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-12-08 00:00:00,,1,0
+22235,Cape / UTM zone 35S,1617,projected,4400,,4222,16135,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-12-08 00:00:00,,1,0
+22236,Cape / UTM zone 36S,1616,projected,4400,,4222,16136,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-12-08 00:00:00,,1,0
+22275,South African Coordinate System zone 15,1454,projected,6503,,4222,17515,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98 2000.04,1,0
+22277,South African Coordinate System zone 17,1455,projected,6503,,4222,17517,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98 2000.04,1,0
+22279,South African Coordinate System zone 19,1456,projected,6503,,4222,17519,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98 2000.04,1,0
+22281,South African Coordinate System zone 21,1457,projected,6503,,4222,17521,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98 2000.04,1,0
+22283,South African Coordinate System zone 23,1458,projected,6503,,4222,17523,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98 2000.04,1,0
+22285,South African Coordinate System zone 25,1459,projected,6503,,4222,17525,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98 2000.04,1,0
+22287,South African Coordinate System zone 27,1460,projected,6503,,4222,17527,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98 2000.04,1,0
+22289,South African Coordinate System zone 29,1461,projected,6503,,4222,17529,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98 2000.04,1,0
+22291,South African Coordinate System zone 31,1462,projected,6503,,4222,17531,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98 2000.04,1,0
+22293,South African Coordinate System zone 33,1463,projected,6503,,4222,17533,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98 2000.04,1,0
+22300,Carthage (Paris) / Tunisia Mining Grid,1618,projected,4406,,4816,19937,,,Large and medium scale topographic mapping and engineering survey.,CAUTION: Carthage datum did not exist when the 1953 decree was issued and an inference is that grid should be applied to the Voirol 1875 geogCS. Common practice assumes that the current Tunisian geodetic datum of Carthage applies.,,EPSG,1998-11-11 00:00:00,,1,0
+22332,Carthage / UTM zone 32N,1489,projected,4400,,4223,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+22391,Carthage / Nord Tunisie,1619,projected,4499,,4223,18181,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+22392,Carthage / Sud Tunisie,1620,projected,4499,,4223,18182,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+22523,Corrego Alegre / UTM zone 23S,1621,projected,4400,,4225,16123,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+22524,Corrego Alegre / UTM zone 24S,1622,projected,4400,,4225,16124,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+22700,Deir ez Zor / Levant Zone,1623,projected,4499,,4227,19940,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Deir ez Zor / Syria Lambert (EPSG code 22770) from 1973.,,EPSG,1999-04-22 00:00:00,,1,0
+22770,Deir ez Zor / Syria Lambert,1623,projected,4499,,4227,19948,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Deir ez Zor / Levant zone (EPSG code 22700) from 1973.,,EPSG,1999-10-20 00:00:00,,1,0
+22780,Deir ez Zor / Levant Stereographic,1623,projected,4499,,4227,19949,,,Used prior to World War II for cadastral and large scale topographic mapping.,,,EPSG,2000-10-19 00:00:00,,1,0
+22832,Douala / UTM zone 32N,1060,projected,4400,,4228,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+22991,Egypt 1907 / Blue Belt,1642,projected,4400,,4229,18071,,,Military topographic mapping. Oil industry usually uses Egypt 1907 / Red Belt rather than this projected CRS.,Also known as Egypt 1907 / Green Belt.,,EPSG,2002-07-16 00:00:00,2002.49,1,0
+22992,Egypt 1907 / Red Belt,1643,projected,4400,,4229,18072,,,Large and medium scale topographic mapping and engineering survey.,See also Egypt 1907 / Blue Belt for non oil industry usage in Sinai peninsula.,,EPSG,1995-06-02 00:00:00,,1,0
+22993,Egypt 1907 / Purple Belt,1644,projected,4400,,4229,18073,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+22994,Egypt 1907 / Extended Purple Belt,1645,projected,4400,,4229,18074,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23028,ED50 / UTM zone 28N,1631,projected,4400,,4230,16028,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23029,ED50 / UTM zone 29N,1632,projected,4400,,4230,16029,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23030,ED50 / UTM zone 30N,1633,projected,4400,,4230,16030,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23031,ED50 / UTM zone 31N,1634,projected,4400,,4230,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23032,ED50 / UTM zone 32N,1635,projected,4400,,4230,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23033,ED50 / UTM zone 33N,1636,projected,4400,,4230,16033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23034,ED50 / UTM zone 34N,1637,projected,4400,,4230,16034,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23035,ED50 / UTM zone 35N,1638,projected,4400,,4230,16035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23036,ED50 / UTM zone 36N,1639,projected,4400,,4230,16036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23037,ED50 / UTM zone 37N,1640,projected,4400,,4230,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23038,ED50 / UTM zone 38N,1641,projected,4400,,4230,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23090,ED50 / TM 0 N,1629,projected,4400,,4230,16400,,,Used by Shell UK for UKCS North Sea oil exploration and production.,,Shell UK,EPSG,1998-11-11 00:00:00,,1,0
+23095,ED50 / TM 5 NE,1630,projected,4400,,4230,16405,,,Used by NAM for Dutch Sector of the North Sea oil exploration and production.,,NAM,EPSG,1998-11-11 00:00:00,,1,0
+23239,Fahud / UTM zone 39N,1544,projected,4400,,4232,16039,,,Large and medium scale topographic mapping and engineering survey.,Since 1993 superseded by PSD93 / UTM zone 39N projCS (code 3439). Maximum differences to Fahud adjustment are 20 metres.,,EPSG,1995-06-02 00:00:00,,1,0
+23240,Fahud / UTM zone 40N,1545,projected,4400,,4232,16040,,,Large and medium scale topographic mapping and engineering survey.,Since 1993 superseded by PSD93 / UTM zone 40N projCS (code 3440). Maximum differences to Fahud adjustment are 20 metres.,,EPSG,1995-06-02 00:00:00,,1,0
+23433,Garoua / UTM zone 33N,1060,projected,4400,,4234,16033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+23700,HD72 / EOV,1119,projected,4498,,4237,19931,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-07-22 00:00:00,,1,0
+23846,ID74 / UTM zone 46N,1647,projected,4400,,4238,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-08-08 00:00:00,95.193 95.20,1,0
+23847,ID74 / UTM zone 47N,1649,projected,4400,,4238,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23848,ID74 / UTM zone 48N,1651,projected,4400,,4238,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23849,ID74 / UTM zone 49N,1653,projected,4400,,4238,16049,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23850,ID74 / UTM zone 50N,1655,projected,4400,,4238,16050,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23851,ID74 / UTM zone 51N,1657,projected,4400,,4238,16051,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23852,ID74 / UTM zone 52N,1659,projected,4400,,4238,16052,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23853,ID74 / UTM zone 53N,1661,projected,4400,,4238,16053,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23886,ID74 / UTM zone 46S,1648,projected,4400,,4238,16146,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-08-08 00:00:00,95.193 95.20,1,0
+23887,ID74 / UTM zone 47S,1650,projected,4400,,4238,16147,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23888,ID74 / UTM zone 48S,1652,projected,4400,,4238,16148,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23889,ID74 / UTM zone 49S,1654,projected,4400,,4238,16149,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23890,ID74 / UTM zone 50S,1656,projected,4400,,4238,16150,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23891,ID74 / UTM zone 51S,1658,projected,4400,,4238,16151,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23892,ID74 / UTM zone 52S,1660,projected,4400,,4238,16152,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23893,ID74 / UTM zone 53S,1662,projected,4400,,4238,16153,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23894,ID74 / UTM zone 54S,1663,projected,4400,,4238,16154,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23946,Indian 1954 / UTM zone 46N,1664,projected,4400,,4239,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1998-06-13 00:00:00,,1,0
+23947,Indian 1954 / UTM zone 47N,1665,projected,4400,,4239,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23948,Indian 1954 / UTM zone 48N,1666,projected,4400,,4239,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24047,Indian 1975 / UTM zone 47N,1667,projected,4400,,4240,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24048,Indian 1975 / UTM zone 48N,1666,projected,4400,,4240,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24100,Jamaica 1875 / Jamaica (Old Grid),1128,projected,4403,,4241,19909,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by 24200 (JAD69 / Jamaica National Grid).,,EPSG,1995-06-02 00:00:00,,1,0
+24200,JAD69 / Jamaica National Grid,1128,projected,4400,,4242,19910,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes 24100 (JAD69 / Jamaica National Grid).,,EPSG,1995-06-02 00:00:00,,1,0
+24305,Kalianpur 1937 / UTM zone 45N,1674,projected,4400,,4144,16045,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24306,Kalianpur 1937 / UTM zone 46N,1675,projected,4400,,4144,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24311,Kalianpur 1962 / UTM zone 41N,1687,projected,4400,,4145,16041,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24312,Kalianpur 1962 / UTM zone 42N,1688,projected,4400,,4145,16042,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24313,Kalianpur 1962 / UTM zone 43N,1689,projected,4400,,4145,16043,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24342,Kalianpur 1975 / UTM zone 42N,1679,projected,4400,,4146,16042,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24343,Kalianpur 1975 / UTM zone 43N,1680,projected,4400,,4146,16043,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24344,Kalianpur 1975 / UTM zone 44N,1681,projected,4400,,4146,16044,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24345,Kalianpur 1975 / UTM zone 45N,1682,projected,4400,,4146,16045,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24346,Kalianpur 1975 / UTM zone 46N,1683,projected,4400,,4146,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24347,Kalianpur 1975 / UTM zone 47N,1684,projected,4400,,4146,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24370,Kalianpur 1880 / India zone 0,1668,projected,4408,,4243,18110,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24371,Kalianpur 1880 / India zone I,1669,projected,4408,,4243,18111,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24372,Kalianpur 1880 / India zone IIa,1670,projected,4408,,4243,18112,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24373,Kalianpur 1880 / India zone III,1672,projected,4408,,4243,18114,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24374,Kalianpur 1880 / India zone IV,1673,projected,4408,,4243,18116,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24375,Kalianpur 1937 / India zone IIb,1041,projected,4400,,4144,18238,,,Large and medium scale topographic mapping and engineering survey.,Used by Bangladesh since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and Benoit's 1895 British inch-metre ratio of 39.370115 rounded as Ind ft = 0.30479841m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24376,Kalianpur 1962 / India zone I,1685,projected,4400,,4145,18236,,,Large and medium scale topographic mapping and engineering survey.,Used by Pakistan since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded by G.Bomford with slight error as Ind ft = 0.3048996m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24377,Kalianpur 1962 / India zone IIa,1686,projected,4400,,4145,18237,,,Large and medium scale topographic mapping and engineering survey.,Used by Pakistan since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded by G.Bomford with slight error as Ind ft = 0.3048996m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24378,Kalianpur 1975 / India zone I,1676,projected,4400,,4146,18231,,,Large and medium scale topographic mapping and engineering survey.,Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24379,Kalianpur 1975 / India zone IIa,1677,projected,4400,,4146,18232,,,Large and medium scale topographic mapping and engineering survey.,Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24380,Kalianpur 1975 / India zone IIb,1678,projected,4400,,4146,18235,,,Large and medium scale topographic mapping and engineering survey.,Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24381,Kalianpur 1975 / India zone III,1672,projected,4400,,4146,18233,,,Large and medium scale topographic mapping and engineering survey.,Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24382,Kalianpur 1880 / India zone IIb,1671,projected,4408,,4243,18113,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24383,Kalianpur 1975 / India zone IV,1673,projected,4400,,4146,18234,,,Large and medium scale topographic mapping and engineering survey.,Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24500,Kertau / Singapore Grid,1210,projected,4400,,4245,19920,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24547,Kertau / UTM zone 47N,1691,projected,4400,,4245,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24548,Kertau / UTM zone 48N,1692,projected,4400,,4245,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.192,1,0
+24571,Kertau / R.S.O. Malaya (ch),1690,projected,4401,,4245,19935,,,Large and medium scale topographic mapping and engineering survey.,Adopts metric conversion of 39.370113 inches per metre.,,EPSG,1999-10-20 00:00:00,97.231,1,0
+24600,KOC Lambert,1136,projected,4400,,4246,19906,,,"Oil industry exploration (but not production - see Ain el Abd / UTM zone 38N, code 20438).","Used by KOC for exploration but not engineering (see Ain el Abd / UTM zone 38N, code 24600).",,EPSG,1996-04-12 00:00:00,,1,0
+24718,La Canoa / UTM zone 18N,1693,projected,4400,,4247,16018,,,Large and medium scale topographic mapping and engineering survey.,Sometimes referred to as PSAD56 / UTM zone 18N.,,EPSG,1999-10-20 00:00:00,,1,0
+24719,La Canoa / UTM zone 19N,1694,projected,4400,,4247,16019,,,Large and medium scale topographic mapping and engineering survey.,Sometimes referred to as PSAD56 / UTM zone 19N.,,EPSG,1999-10-20 00:00:00,,1,0
+24720,La Canoa / UTM zone 20N,1695,projected,4400,,4247,16020,,,Large and medium scale topographic mapping and engineering survey.,Sometimes referred to as PSAD56 / UTM zone 20N.,,EPSG,1995-06-02 00:00:00,,1,0
+24818,PSAD56 / UTM zone 18N,1756,projected,4400,,4248,16018,,,Large and medium scale topographic mapping and engineering survey.,In Venezuela also known as La Canoa / UTM zone 18N.,,EPSG,1995-06-02 00:00:00,,1,0
+24819,PSAD56 / UTM zone 19N,1758,projected,4400,,4248,16019,,,Large and medium scale topographic mapping and engineering survey.,In Venezuela also known as La Canoa / UTM zone 19N.,,EPSG,1995-06-02 00:00:00,,1,0
+24820,PSAD56 / UTM zone 20N,1760,projected,4400,,4248,16020,,,Large and medium scale topographic mapping and engineering survey.,In Venezuela also known as La Canoa / UTM zone 20N.,,EPSG,1995-06-02 00:00:00,,1,0
+24821,PSAD56 / UTM zone 21N,1762,projected,4400,,4248,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24877,PSAD56 / UTM zone 17S,1755,projected,4400,,4248,16117,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24878,PSAD56 / UTM zone 18S,1757,projected,4400,,4248,16118,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24879,PSAD56 / UTM zone 19S,1759,projected,4400,,4248,16119,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24880,PSAD56 / UTM zone 20S,1761,projected,4400,,4248,16120,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24882,PSAD56 / UTM zone 22S,1754,projected,4400,,4248,16122,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+24891,PSAD56 / Peru west zone,1753,projected,4499,,4248,18161,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24892,PSAD56 / Peru central zone,1752,projected,4499,,4248,18162,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24893,PSAD56 / Peru east zone,1751,projected,4499,,4248,18163,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25000,Leigon / Ghana Metre Grid,1104,projected,4400,,4250,19904,,,Large and medium scale topographic mapping and engineering survey.,Superseded Accra / Ghana National Grid (code 2136) in 1978.,,EPSG,1995-06-02 00:00:00,,1,0
+25231,Lome / UTM zone 31N,1232,projected,4400,,4252,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25391,Luzon 1911 / Philippines zone I,1698,projected,4499,,4253,18171,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25392,Luzon 1911 / Philippines zone II,1699,projected,4499,,4253,18172,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25393,Luzon 1911 / Philippines zone III,1700,projected,4499,,4253,18173,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25394,Luzon 1911 / Philippines zone IV,1701,projected,4499,,4253,18174,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25395,Luzon 1911 / Philippines zone V,1702,projected,4499,,4253,18175,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25700,Makassar (Jakarta) / NEIEZ,1316,projected,4499,,4804,19905,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25828,ETRS89 / UTM zone 28N,2122,projected,4400,,4258,16028,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25829,ETRS89 / UTM zone 29N,2123,projected,4400,,4258,16029,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25830,ETRS89 / UTM zone 30N,2124,projected,4400,,4258,16030,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25831,ETRS89 / UTM zone 31N,2125,projected,4400,,4258,16031,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25832,ETRS89 / UTM zone 32N,2126,projected,4400,,4258,16032,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25833,ETRS89 / UTM zone 33N,2127,projected,4400,,4258,16033,,,Large and medium scale topographic mapping and engineering survey.,Used for all state of Brandenburg including those areas west of 12 deg E.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25834,ETRS89 / UTM zone 34N,2128,projected,4400,,4258,16034,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25835,ETRS89 / UTM zone 35N,2129,projected,4400,,4258,16035,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25836,ETRS89 / UTM zone 36N,2130,projected,4400,,4258,16036,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25837,ETRS89 / UTM zone 37N,2131,projected,4400,,4258,16037,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25838,ETRS89 / UTM zone 38N,2132,projected,4400,,4258,16038,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25884,ETRS89 / TM Baltic93,1646,projected,4530,,4258,19939,,,Large and medium scale topographic mapping and engineering survey.,Used as a common coordinate system for the Baltic states and for medium and small scale mapping in Estonia since 1993.,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25932,Malongo 1987 / UTM zone 32S,1317,projected,4400,,4259,16132,,,Oil exploration,,,EPSG,1995-06-02 00:00:00,,1,0
+26191,Merchich / Nord Maroc,1703,projected,4499,,4261,18131,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26192,Merchich / Sud Maroc,1704,projected,4499,,4261,18132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26193,Merchich / Sahara,1705,projected,4499,,4261,18133,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26237,Massawa / UTM zone 37N,1089,projected,4400,,4262,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26331,Minna / UTM zone 31N,1716,projected,4400,,4263,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26332,Minna / UTM zone 32N,1717,projected,4400,,4263,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26391,Minna / Nigeria West Belt,1715,projected,4400,,4263,18151,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26392,Minna / Nigeria Mid Belt,1714,projected,4400,,4263,18152,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26393,Minna / Nigeria East Belt,1713,projected,4400,,4263,18153,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26432,Mhast / UTM zone 32S,1318,projected,4400,,4264,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26591,Monte Mario (Rome) / Italy zone 1,1718,projected,4499,,4806,18121,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26592,Monte Mario (Rome) / Italy zone 2,1719,projected,4499,,4806,18122,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26632,M'poraloko / UTM zone 32N,1696,projected,4400,,4266,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26692,M'poraloko / UTM zone 32S,1697,projected,4400,,4266,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26703,NAD27 / UTM zone 3N,2133,projected,4400,,4267,16003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26704,NAD27 / UTM zone 4N,2134,projected,4400,,4267,16004,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26705,NAD27 / UTM zone 5N,2135,projected,4400,,4267,16005,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26706,NAD27 / UTM zone 6N,2136,projected,4400,,4267,16006,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26707,NAD27 / UTM zone 7N,2137,projected,4400,,4267,16007,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26708,NAD27 / UTM zone 8N,2138,projected,4400,,4267,16008,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26709,NAD27 / UTM zone 9N,2139,projected,4400,,4267,16009,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26710,NAD27 / UTM zone 10N,2140,projected,4400,,4267,16010,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26711,NAD27 / UTM zone 11N,2141,projected,4400,,4267,16011,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26712,NAD27 / UTM zone 12N,2142,projected,4400,,4267,16012,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26713,NAD27 / UTM zone 13N,2143,projected,4400,,4267,16013,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26714,NAD27 / UTM zone 14N,2144,projected,4400,,4267,16014,,,Large and medium scale topographic mapping and engineering survey.,See NAD27 / BLM 14N (feet) (code 32064) for non-metric equivalent used in US Gulf of Mexico.,,EPSG,1995-06-02 00:00:00,,1,0
+26715,NAD27 / UTM zone 15N,2145,projected,4400,,4267,16015,,,Large and medium scale topographic mapping and engineering survey.,In Ontario superseded by NAD27(76) / UTM zone 15N (code 2027). See NAD27 / BLM 15N (feet) (code 32065) for non-metric equivalent used in US Gulf of Mexico.,,EPSG,1995-06-02 00:00:00,,1,0
+26716,NAD27 / UTM zone 16N,2146,projected,4400,,4267,16016,,,Large and medium scale topographic mapping and engineering survey.,In Ontario superseded by NAD27(76) / UTM zone 16N (code 2028). See NAD27 / BLM 16N (feet) (code 32066) for non-metric equivalent used in US Gulf of Mexico.,,EPSG,1995-06-02 00:00:00,,1,0
+26717,NAD27 / UTM zone 17N,2147,projected,4400,,4267,16017,,,Large and medium scale topographic mapping and engineering survey.,In Ontario superseded by NAD27(76) / UTM zone 17N (code 2029). In Quebec superseded by NAD27(CGQ77) / UTM zone 17N (code 2031). See NAD27 / BLM 17N (feet) (code 32067) for non-metric equivalent used in US Gulf of Mexico.,,EPSG,1995-06-02 00:00:00,,1,0
+26718,NAD27 / UTM zone 18N,2148,projected,4400,,4267,16018,,,Large and medium scale topographic mapping and engineering survey.,In Ontario superseded by NAD27(76) / UTM zone 18N (code 2030). In Quebec superseded by NAD27(CGQ77) / UTM zone 18N (code 2032).,,EPSG,1995-06-02 00:00:00,,1,0
+26719,NAD27 / UTM zone 19N,2149,projected,4400,,4267,16019,,,Large and medium scale topographic mapping and engineering survey.,In Quebec superseded by NAD27(CGQ77) / UTM zone 19N (code 2033).,,EPSG,1995-06-02 00:00:00,,1,0
+26720,NAD27 / UTM zone 20N,2150,projected,4400,,4267,16020,,,Large and medium scale topographic mapping and engineering survey.,In Quebec superseded by NAD27(CGQ77) / UTM zone 20N (code 2034).,,EPSG,1995-06-02 00:00:00,,1,0
+26721,NAD27 / UTM zone 21N,2151,projected,4400,,4267,16021,,,Large and medium scale topographic mapping and engineering survey.,In Quebec superseded by NAD27(CGQ77) / UTM zone 21N (code 2035).,,EPSG,1995-06-02 00:00:00,,1,0
+26722,NAD27 / UTM zone 22N,2152,projected,4400,,4267,16022,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26729,NAD27 / Alabama East,2154,projected,4497,,4267,10101,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26730,NAD27 / Alabama West,2155,projected,4497,,4267,10102,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26731,NAD27 / Alaska zone 1,2156,projected,4497,,4267,15001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26732,NAD27 / Alaska zone 2,2158,projected,4497,,4267,15002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26733,NAD27 / Alaska zone 3,2159,projected,4497,,4267,15003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26734,NAD27 / Alaska zone 4,2160,projected,4497,,4267,15004,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26735,NAD27 / Alaska zone 5,2161,projected,4497,,4267,15005,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26736,NAD27 / Alaska zone 6,2162,projected,4497,,4267,15006,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26737,NAD27 / Alaska zone 7,2163,projected,4497,,4267,15007,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26738,NAD27 / Alaska zone 8,2164,projected,4497,,4267,15008,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26739,NAD27 / Alaska zone 9,2165,projected,4497,,4267,15009,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26740,NAD27 / Alaska zone 10,2157,projected,4497,,4267,15010,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26741,NAD27 / California zone I,2175,projected,4497,,4267,10401,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26742,NAD27 / California zone II,2176,projected,4497,,4267,10402,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26743,NAD27 / California zone III,2177,projected,4497,,4267,10403,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26744,NAD27 / California zone IV,2178,projected,4497,,4267,10404,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26745,NAD27 / California zone V,2179,projected,4497,,4267,10405,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26746,NAD27 / California zone VI,2180,projected,4497,,4267,10406,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26747,NAD27 / California zone VII,2181,projected,4497,,4267,10407,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26748,NAD27 / Arizona East,2167,projected,4497,,4267,10201,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,95.25 2000.091,1,0
+26749,NAD27 / Arizona Central,2166,projected,4497,,4267,10202,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-08-22 00:00:00,95.25,1,0
+26750,NAD27 / Arizona West,2168,projected,4497,,4267,10203,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,95.25 2000.091,1,0
+26751,NAD27 / Arkansas North,2169,projected,4497,,4267,10301,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26752,NAD27 / Arkansas South,2170,projected,4497,,4267,10302,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26753,NAD27 / Colorado North,2184,projected,4497,,4267,10501,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26754,NAD27 / Colorado Central,2183,projected,4497,,4267,10502,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26755,NAD27 / Colorado South,2185,projected,4497,,4267,10503,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26756,NAD27 / Connecticut,1377,projected,4497,,4267,10600,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26757,NAD27 / Delaware,1378,projected,4497,,4267,10700,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26758,NAD27 / Florida East,2186,projected,4497,,4267,10901,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26759,NAD27 / Florida West,2188,projected,4497,,4267,10902,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26760,NAD27 / Florida North,2187,projected,4497,,4267,10903,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26766,NAD27 / Georgia East,2189,projected,4497,,4267,11001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26767,NAD27 / Georgia West,2190,projected,4497,,4267,11002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26768,NAD27 / Idaho East,2192,projected,4497,,4267,11101,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26769,NAD27 / Idaho Central,2191,projected,4497,,4267,11102,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26770,NAD27 / Idaho West,2193,projected,4497,,4267,11103,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26771,NAD27 / Illinois East,2194,projected,4497,,4267,11201,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26772,NAD27 / Illinois West,2195,projected,4497,,4267,11202,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26773,NAD27 / Indiana East,2196,projected,4497,,4267,11301,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26774,NAD27 / Indiana West,2197,projected,4497,,4267,11302,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26775,NAD27 / Iowa North,2198,projected,4497,,4267,11401,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26776,NAD27 / Iowa South,2199,projected,4497,,4267,11402,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26777,NAD27 / Kansas North,2200,projected,4497,,4267,11501,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26778,NAD27 / Kansas South,2201,projected,4497,,4267,11502,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26779,NAD27 / Kentucky North,2202,projected,4497,,4267,11601,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26780,NAD27 / Kentucky South,2203,projected,4497,,4267,11602,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26781,NAD27 / Louisiana North,2204,projected,4497,,4267,11701,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26782,NAD27 / Louisiana South,2205,projected,4497,,4267,11702,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26783,NAD27 / Maine East,2206,projected,4497,,4267,11801,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26784,NAD27 / Maine West,2207,projected,4497,,4267,11802,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26785,NAD27 / Maryland,1389,projected,4497,,4267,11900,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26786,NAD27 / Massachusetts Mainland,2209,projected,4497,,4267,12001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26787,NAD27 / Massachusetts Island,2208,projected,4497,,4267,12002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26791,NAD27 / Minnesota North,2214,projected,4497,,4267,12201,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26792,NAD27 / Minnesota Central,2213,projected,4497,,4267,12202,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26793,NAD27 / Minnesota South,2215,projected,4497,,4267,12203,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26794,NAD27 / Mississippi East,2216,projected,4497,,4267,12301,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26795,NAD27 / Mississippi West,2217,projected,4497,,4267,12302,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26796,NAD27 / Missouri East,2219,projected,4497,,4267,12401,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26797,NAD27 / Missouri Central,2218,projected,4497,,4267,12402,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26798,NAD27 / Missouri West,2220,projected,4497,,4267,12403,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26801,NAD Michigan / Michigan East,1720,projected,4497,,4268,12101,,,Large and medium scale topographic mapping and engineering survey.,Superseded by 26811 26812 and 26813.,,EPSG,1998-11-11 00:00:00,95.25 97.19 98.22 2000.091,1,0
+26802,NAD Michigan / Michigan Old Central,1721,projected,4497,,4268,12102,,,Large and medium scale topographic mapping and engineering survey.,Superseded by 26811 26812 and 26813.,,EPSG,1998-11-11 00:00:00,95.25 97.19 98.22,1,0
+26803,NAD Michigan / Michigan West,1722,projected,4497,,4268,12103,,,Large and medium scale topographic mapping and engineering survey.,Superseded by 26811 26812 and 26813.,,EPSG,1998-11-11 00:00:00,95.25 97.19 98.22 2000.091,1,0
+26811,NAD Michigan / Michigan North,1723,projected,4497,,4268,12111,,,Large and medium scale topographic mapping and engineering survey.,Supersedes 26801 26802 and 26803.,,EPSG,1998-11-11 00:00:00,96.28 98.22,1,0
+26812,NAD Michigan / Michigan Central,1724,projected,4497,,4268,12112,,,Large and medium scale topographic mapping and engineering survey.,Supersedes 26801 26802 and 26803.,,EPSG,1998-11-11 00:00:00,96.28 97.19 98.22,1,0
+26813,NAD Michigan / Michigan South,1725,projected,4497,,4268,12113,,,Large and medium scale topographic mapping and engineering survey.,Supersedes 26801 26802 and 26803.,,EPSG,1998-11-11 00:00:00,96.28 97.19 98.22,1,0
+26903,NAD83 / UTM zone 3N,2133,projected,4400,,4269,16003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26904,NAD83 / UTM zone 4N,2134,projected,4400,,4269,16004,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26905,NAD83 / UTM zone 5N,2135,projected,4400,,4269,16005,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26906,NAD83 / UTM zone 6N,2136,projected,4400,,4269,16006,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26907,NAD83 / UTM zone 7N,2137,projected,4400,,4269,16007,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26908,NAD83 / UTM zone 8N,2138,projected,4400,,4269,16008,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26909,NAD83 / UTM zone 9N,2139,projected,4400,,4269,16009,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26910,NAD83 / UTM zone 10N,2140,projected,4400,,4269,16010,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26911,NAD83 / UTM zone 11N,2141,projected,4400,,4269,16011,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26912,NAD83 / UTM zone 12N,2142,projected,4400,,4269,16012,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26913,NAD83 / UTM zone 13N,2143,projected,4400,,4269,16013,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26914,NAD83 / UTM zone 14N,2144,projected,4400,,4269,16014,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26915,NAD83 / UTM zone 15N,2145,projected,4400,,4269,16015,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26916,NAD83 / UTM zone 16N,2146,projected,4400,,4269,16016,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26917,NAD83 / UTM zone 17N,2147,projected,4400,,4269,16017,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26918,NAD83 / UTM zone 18N,2148,projected,4400,,4269,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26919,NAD83 / UTM zone 19N,2149,projected,4400,,4269,16019,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26920,NAD83 / UTM zone 20N,2150,projected,4400,,4269,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26921,NAD83 / UTM zone 21N,2151,projected,4400,,4269,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26922,NAD83 / UTM zone 22N,2152,projected,4400,,4269,16022,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26923,NAD83 / UTM zone 23N,2153,projected,4400,,4269,16023,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26929,NAD83 / Alabama East,2154,projected,4499,,4269,10131,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26930,NAD83 / Alabama West,2155,projected,4499,,4269,10132,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26931,NAD83 / Alaska zone 1,2156,projected,4499,,4269,15031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26932,NAD83 / Alaska zone 2,2158,projected,4499,,4269,15032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26933,NAD83 / Alaska zone 3,2159,projected,4499,,4269,15033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26934,NAD83 / Alaska zone 4,2160,projected,4499,,4269,15034,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26935,NAD83 / Alaska zone 5,2161,projected,4499,,4269,15035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26936,NAD83 / Alaska zone 6,2162,projected,4499,,4269,15036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26937,NAD83 / Alaska zone 7,2163,projected,4499,,4269,15037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26938,NAD83 / Alaska zone 8,2164,projected,4499,,4269,15038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26939,NAD83 / Alaska zone 9,2165,projected,4499,,4269,15039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26940,NAD83 / Alaska zone 10,2157,projected,4499,,4269,15040,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26941,NAD83 / California zone 1,2175,projected,4499,,4269,10431,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2225 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26942,NAD83 / California zone 2,2176,projected,4499,,4269,10432,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2226 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26943,NAD83 / California zone 3,2177,projected,4499,,4269,10433,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2227 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26944,NAD83 / California zone 4,2178,projected,4499,,4269,10434,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2228 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26945,NAD83 / California zone 5,2182,projected,4499,,4269,10435,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2229 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26946,NAD83 / California zone 6,2180,projected,4499,,4269,10436,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2230 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26948,NAD83 / Arizona East,2167,projected,4499,,4269,10231,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2222 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26949,NAD83 / Arizona Central,2166,projected,4499,,4269,10232,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2223 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26950,NAD83 / Arizona West,2168,projected,4499,,4269,10233,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2224 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26951,NAD83 / Arkansas North,2169,projected,4499,,4269,10331,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26952,NAD83 / Arkansas South,2170,projected,4499,,4269,10332,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26953,NAD83 / Colorado North,2184,projected,4499,,4269,10531,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2231 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26954,NAD83 / Colorado Central,2183,projected,4499,,4269,10532,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2232 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26955,NAD83 / Colorado South,2185,projected,4499,,4269,10533,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2233 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26956,NAD83 / Connecticut,1377,projected,4499,,4269,10630,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2234 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26957,NAD83 / Delaware,1378,projected,4499,,4269,10730,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2235 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26958,NAD83 / Florida East,2186,projected,4499,,4269,10931,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2236 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26959,NAD83 / Florida West,2188,projected,4499,,4269,10932,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2237 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26960,NAD83 / Florida North,2187,projected,4499,,4269,10933,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2238 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26961,NAD83 / Hawaii zone 1,1546,projected,4499,,4269,15131,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26962,NAD83 / Hawaii zone 2,1547,projected,4499,,4269,15132,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26963,NAD83 / Hawaii zone 3,1548,projected,4499,,4269,15133,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26964,NAD83 / Hawaii zone 4,1549,projected,4499,,4269,15134,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26965,NAD83 / Hawaii zone 5,1550,projected,4499,,4269,15135,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26966,NAD83 / Georgia East,2189,projected,4499,,4269,11031,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2239 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26967,NAD83 / Georgia West,2190,projected,4499,,4269,11032,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2240 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26968,NAD83 / Idaho East,2192,projected,4499,,4269,11131,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2241 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26969,NAD83 / Idaho Central,2191,projected,4499,,4269,11132,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2242 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26970,NAD83 / Idaho West,2193,projected,4499,,4269,11133,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2243 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26971,NAD83 / Illinois East,2194,projected,4499,,4269,11231,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26972,NAD83 / Illinois West,2195,projected,4499,,4269,11232,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26973,NAD83 / Indiana East,2196,projected,4499,,4269,11331,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2244 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26974,NAD83 / Indiana West,2197,projected,4499,,4269,11332,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2245 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26975,NAD83 / Iowa North,2198,projected,4499,,4269,11431,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26976,NAD83 / Iowa South,2199,projected,4499,,4269,11432,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26977,NAD83 / Kansas North,2200,projected,4499,,4269,11531,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26978,NAD83 / Kansas South,2201,projected,4499,,4269,11532,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26979,NAD83 / Kentucky North,2202,projected,4499,,4269,11631,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,1
+26980,NAD83 / Kentucky South,2203,projected,4499,,4269,11632,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2247 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26981,NAD83 / Louisiana North,2204,projected,4499,,4269,11731,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26982,NAD83 / Louisiana South,2529,projected,4499,,4269,11732,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26983,NAD83 / Maine East,2206,projected,4499,,4269,11831,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26984,NAD83 / Maine West,2207,projected,4499,,4269,11832,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26985,NAD83 / Maryland,1389,projected,4499,,4269,11930,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2248 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26986,NAD83 / Massachusetts Mainland,2209,projected,4499,,4269,12031,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2249 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26987,NAD83 / Massachusetts Island,2208,projected,4499,,4269,12032,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2250 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26988,NAD83 / Michigan North,1723,projected,4499,,4269,12141,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2251 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26989,NAD83 / Michigan Central,1724,projected,4499,,4269,12142,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2252 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26990,NAD83 / Michigan South,1725,projected,4499,,4269,12143,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2253 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26991,NAD83 / Minnesota North,2214,projected,4499,,4269,12231,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26992,NAD83 / Minnesota Central,2213,projected,4499,,4269,12232,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26993,NAD83 / Minnesota South,2215,projected,4499,,4269,12233,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26994,NAD83 / Mississippi East,2216,projected,4499,,4269,12331,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2254 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26995,NAD83 / Mississippi West,2217,projected,4499,,4269,12332,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2255 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26996,NAD83 / Missouri East,2219,projected,4499,,4269,12431,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26997,NAD83 / Missouri Central,2218,projected,4499,,4269,12432,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26998,NAD83 / Missouri West,2220,projected,4499,,4269,12433,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+27038,Nahrwan 1967 / UTM zone 38N,1739,projected,4400,,4270,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+27039,Nahrwan 1967 / UTM zone 39N,1749,projected,4400,,4270,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,96.12,1,0
+27040,Nahrwan 1967 / UTM zone 40N,1750,projected,4400,,4270,16040,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+27120,Naparima 1972 / UTM zone 20N,1322,projected,4400,,4271,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.351,1,0
+27200,NZGD49 / New Zealand Map Grid,1175,projected,4400,,4272,19917,,,Large and medium scale topographic mapping and engineering survey.,Supersedes 27291 (NZGD49 / North Island Grid) and 27292 (NZGD49 / South Island Grid) from 1972.,,EPSG,2000-10-19 00:00:00,2000.702,1,0
+27205,NZGD49 / Mount Eden Circuit,1501,projected,4500,,4272,17901,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Mount Eden Circuit 2000 (code 2105) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27206,NZGD49 / Bay of Plenty Circuit,1500,projected,4500,,4272,17902,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Bay of Plenty Circuit 2000 (code 2106) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27207,NZGD49 / Poverty Bay Circuit,1500,projected,4500,,4272,17903,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Poverty Bay Circuit 2000 (code 2107) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27208,NZGD49 / Hawkes Bay Circuit,1500,projected,4500,,4272,17904,,,Cadastral survey.,Superseded Hawkes Bay 1931 datum with Imperial measure version of projection in 1972. Superseded by NZGD2000 / Hawkes Bay Circuit 2000 (code 2108) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27209,NZGD49 / Taranaki Circuit,1500,projected,4500,,4272,17905,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Taranaki Circuit 2000 (code 2109) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27210,NZGD49 / Tuhirangi Circuit,1500,projected,4500,,4272,17906,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Tuhirangi Circuit 2000 (code 2110) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27211,NZGD49 / Wanganui Circuit,1500,projected,4500,,4272,17907,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Wanganui Circuit 2000 (code 2111) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27212,NZGD49 / Wairarapa Circuit,1500,projected,4500,,4272,17908,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Wairarapa Circuit 2000 (code 2112) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27213,NZGD49 / Wellington Circuit,1500,projected,4500,,4272,17909,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Wellington Circuit 2000 (code 2113) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27214,NZGD49 / Collingwood Circuit,1501,projected,4500,,4272,17910,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Collingwood Circuit 2000 (code 2114) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27215,NZGD49 / Nelson Circuit,1501,projected,4500,,4272,17911,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Nelson Circuit 2000 (code 2115) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27216,NZGD49 / Karamea Circuit,1501,projected,4500,,4272,17912,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Karamea Circuit 2000 (code 2116) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27217,NZGD49 / Buller Circuit,1501,projected,4500,,4272,17913,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Buller Circuit 2000 (code 2117) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27218,NZGD49 / Grey Circuit,1501,projected,4500,,4272,17914,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Grey Circuit 2000 (code 2118) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27219,NZGD49 / Amuri Circuit,1501,projected,4500,,4272,17915,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Amuri Circuit 2000 (code 2119) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27220,NZGD49 / Marlborough Circuit,1501,projected,4500,,4272,17916,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Marlborough Circuit 2000 (code 2120) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27221,NZGD49 / Hokitika Circuit,1501,projected,4500,,4272,17917,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Hokitika Circuit 2000 (code 2121) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27222,NZGD49 / Okarito Circuit,1501,projected,4500,,4272,17918,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Okarito Circuit 2000 (code 2122) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27223,NZGD49 / Jacksons Bay Circuit,1501,projected,4500,,4272,17919,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Jacksons Bay Circuit 2000 (code 2123) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27224,NZGD49 / Mount Pleasant Circuit,1501,projected,4500,,4272,17920,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Mount Pleasant Circuit 2000 (code 2124) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27225,NZGD49 / Gawler Circuit,1501,projected,4500,,4272,17921,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Gawler Circuit 2000 (code 2125) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27226,NZGD49 / Timaru Circuit,1501,projected,4500,,4272,17922,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Timaru Circuit 2000 (code 2126) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27227,NZGD49 / Lindis Peak Circuit,1501,projected,4500,,4272,17923,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Lindis Peak Circuit 2000 (code 2127) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27228,NZGD49 / Mount Nicholas Circuit,1501,projected,4500,,4272,17924,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Mount Nicholas Circuit 2000 (code 2128) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27229,NZGD49 / Mount York Circuit,1501,projected,4500,,4272,17925,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Mount York Circuit 2000 (code 2129) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27230,NZGD49 / Observation Point Circuit,1501,projected,4500,,4272,17926,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Observation Point Circuit 2000 (code 2130) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27231,NZGD49 / North Taieri Circuit,1501,projected,4500,,4272,17927,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / North Taieri Circuit 2000 (code 2131) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27232,NZGD49 / Bluff Circuit,1501,projected,4500,,4272,17928,,,Cadastral survey.,Superseded Imperial measure version in 1972. Superseded by NZGD2000 / Bluff Circuit 2000 (code 2132) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27258,NZGD49 / UTM zone 58S,1502,projected,4400,,4272,16158,,,Oil exploration.,Superseded by NZGD2000 / UTM zone 58S (code 2133) from March 2000.,,EPSG,2000-10-19 00:00:00,,1,0
+27259,NZGD49 / UTM zone 59S,1503,projected,4400,,4272,16159,,,Oil exploration.,Superseded by NZGD2000 / UTM zone 59S (code 2134) from March 2000.,,EPSG,2000-10-19 00:00:00,,1,0
+27260,NZGD49 / UTM zone 60S,1504,projected,4400,,4272,16160,,,Oil exploration.,Superseded by NZGD2000 / UTM zone 60S (code 2135) from March 2000.,,EPSG,2000-10-19 00:00:00,,1,0
+27291,NZGD49 / North Island Grid,1500,projected,4409,,4272,18141,,,Large and medium scale topographic mapping and engineering survey.,Sears 1922 British foot-metre conversion factor applied to ellipsoid. Superseded by 27200 (GD49 / New Zealand Map Grid) in 1972.,,EPSG,2000-10-19 00:00:00,97.231 2000.702,1,0
+27292,NZGD49 / South Island Grid,1501,projected,4409,,4272,18142,,,Large and medium scale topographic mapping and engineering survey.,Sears 1922 British foot-metre conversion factor applied to ellipsoid. Superseded by 27200 (GD49 / New Zealand Map Grid) in 1972.,,EPSG,2000-10-19 00:00:00,97.231 2000.702,1,0
+27391,NGO 1948 (Oslo) / NGO zone I,1741,projected,4531,,4817,18221,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 32N.,,EPSG,1999-10-20 00:00:00,,1,0
+27392,NGO 1948 (Oslo) / NGO zone II,1742,projected,4531,,4817,18222,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 32N.,,EPSG,1999-10-20 00:00:00,,1,0
+27393,NGO 1948 (Oslo) / NGO zone III,1743,projected,4531,,4817,18223,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 32N.,,EPSG,1999-10-20 00:00:00,,1,0
+27394,NGO 1948 (Oslo) / NGO zone IV,1744,projected,4531,,4817,18224,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 32N and ETRF89 / UTM zone 33N.,,EPSG,1999-10-20 00:00:00,,1,0
+27395,NGO 1948 (Oslo) / NGO zone V,1745,projected,4531,,4817,18225,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 33N and ETRF89 / UTM zone 34N.,,EPSG,1999-10-20 00:00:00,,1,0
+27396,NGO 1948 (Oslo) / NGO zone VI,1746,projected,4531,,4817,18226,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 34N.,,EPSG,1999-10-20 00:00:00,,1,0
+27397,NGO 1948 (Oslo) / NGO zone VII,1747,projected,4531,,4817,18227,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 34N and ETRF89 / UTM zone 35N.,,EPSG,1999-10-20 00:00:00,,1,0
+27398,NGO 1948 (Oslo) / NGO zone VIII,1748,projected,4531,,4817,18228,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 35N.,,EPSG,1999-10-20 00:00:00,,1,0
+27429,Datum 73 / UTM zone 29N,1294,projected,4400,,4274,16029,,,Large and medium scale topographic mapping and engineering survey.,,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,,1,0
+27492,Datum 73 / Modified Portuguese Grid,1294,projected,4530,,4274,19974,,,Large and medium scale topographic mapping and engineering survey.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+27500,ATF (Paris) / Nord de Guerre,1369,projected,4499,,4901,19903,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+27561,NTF (Paris) / Lambert Nord France,1731,projected,4499,,4807,18091,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF (Paris) / France zone I (code 27571) from 1972.,,EPSG,2001-11-06 00:00:00,,1,0
+27562,NTF (Paris) / Lambert Centre France,1732,projected,4499,,4807,18092,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF (Paris) / France zone II (code 27572) from 1972.,,EPSG,2001-11-06 00:00:00,,1,0
+27563,NTF (Paris) / Lambert Sud France,1733,projected,4499,,4807,18093,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF (Paris) / France zone III (code 27573) from 1972.,,EPSG,2001-11-06 00:00:00,,1,0
+27564,NTF (Paris) / Lambert Corse,1327,projected,4499,,4807,18094,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF (Paris) / France zone IV (code 27574) from 1972.,,EPSG,2001-11-06 00:00:00,,1,0
+27571,NTF (Paris) / Lambert zone I,1731,projected,4499,,4807,18081,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF (Paris) / Lambert Nord France (code 27561).,,EPSG,2001-11-06 00:00:00,,1,0
+27572,NTF (Paris) / Lambert zone II,1734,projected,4499,,4807,18082,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF (Paris) / Lambert Centre France (code 27562).,,EPSG,2001-11-06 00:00:00,,1,0
+27573,NTF (Paris) / Lambert zone III,1733,projected,4499,,4807,18083,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF (Paris) / Lambert Sud France (code 27563).,,EPSG,2001-11-06 00:00:00,,1,0
+27574,NTF (Paris) / Lambert zone IV,1327,projected,4499,,4807,18084,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF (Paris) / Lambert Corse (code 27564).,,EPSG,2001-11-06 00:00:00,,1,0
+27581,NTF (Paris) / France I,1731,projected,4499,,4807,18081,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF / Nord France (code 27591).,,EPSG,1996-04-12 00:00:00,95.26,1,1
+27582,NTF (Paris) / France II,1734,projected,4499,,4807,18082,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF / Centre France (code 27592).,,EPSG,1996-04-12 00:00:00,95.26,1,1
+27583,NTF (Paris) / France III,1733,projected,4499,,4807,18083,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF / Sud France (code 27593).,,EPSG,1996-04-12 00:00:00,95.26,1,1
+27584,NTF (Paris) / France IV,1327,projected,4499,,4807,18084,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF / Corse (code 27594).,,EPSG,1996-04-12 00:00:00,,1,1
+27591,NTF (Paris) / Nord France,1731,projected,4499,,4807,18091,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF / France I (code 27581) from 1972.,,EPSG,1996-04-12 00:00:00,95.26,1,1
+27592,NTF (Paris) / Centre France,1732,projected,4499,,4807,18092,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF / France II (code 27582) from 1972.,,EPSG,1996-04-12 00:00:00,95.26,1,1
+27593,NTF (Paris) / Sud France,1733,projected,4499,,4807,18093,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF / France III (code 27583) from 1972.,,EPSG,1996-04-12 00:00:00,95.26,1,1
+27594,NTF (Paris) / Corse,1327,projected,4499,,4807,18094,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF / France IV (code 27584) from 1972.,,EPSG,1996-04-12 00:00:00,,1,1
+27700,OSGB 1936 / British National Grid,1264,projected,4400,,4277,19916,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28191,Palestine 1923 / Palestine Grid,1356,projected,4400,,4281,18201,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+28192,Palestine 1923 / Palestine Belt,1356,projected,4400,,4281,18202,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+28193,Palestine 1923 / Israeli CS Grid,2603,projected,4400,,4281,18203,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Israeli TM Grid (EPSG code 2039).,Survey of Israel.,EPSG,2002-06-22 00:00:00,2002.34,1,0
+28232,Pointe Noire / UTM zone 32S,1072,projected,4400,,4282,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,2002.05,1,0
+28348,GDA94 / MGA zone 48,1556,projected,4400,,4283,17348,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28349,GDA94 / MGA zone 49,1557,projected,4400,,4283,17349,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28350,GDA94 / MGA zone 50,1558,projected,4400,,4283,17350,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28351,GDA94 / MGA zone 51,1559,projected,4400,,4283,17351,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28352,GDA94 / MGA zone 52,1560,projected,4400,,4283,17352,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28353,GDA94 / MGA zone 53,1561,projected,4400,,4283,17353,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28354,GDA94 / MGA zone 54,1562,projected,4400,,4283,17354,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28355,GDA94 / MGA zone 55,1563,projected,4400,,4283,17355,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28356,GDA94 / MGA zone 56,1564,projected,4400,,4283,17356,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28357,GDA94 / MGA zone 57,1565,projected,4400,,4283,17357,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28358,GDA94 / MGA zone 58,1566,projected,4400,,4283,17358,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28402,Pulkovo 1942 / Gauss-Kruger zone 2,1805,projected,4530,,4284,16202,,,Military mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 9E (code 2492).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28403,Pulkovo 1942 / Gauss-Kruger zone 3,1792,projected,4530,,4284,16203,,,Military mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 15E (code 2493).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28404,Pulkovo 1942 / Gauss-Kruger zone 4,1793,projected,4530,,4284,16204,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 21E (code 2494).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28405,Pulkovo 1942 / Gauss-Kruger zone 5,1794,projected,4530,,4284,16205,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 27E (code 2495).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28406,Pulkovo 1942 / Gauss-Kruger zone 6,1795,projected,4530,,4284,16206,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 33E (code 2496).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28407,Pulkovo 1942 / Gauss-Kruger zone 7,1796,projected,4530,,4284,16207,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 39E (code 2497).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28408,Pulkovo 1942 / Gauss-Kruger zone 8,1797,projected,4530,,4284,16208,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 45E (code 2498).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28409,Pulkovo 1942 / Gauss-Kruger zone 9,1798,projected,4530,,4284,16209,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 51E (code 2499).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28410,Pulkovo 1942 / Gauss-Kruger zone 10,1799,projected,4530,,4284,16210,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 57E (code 2500).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28411,Pulkovo 1942 / Gauss-Kruger zone 11,1800,projected,4530,,4284,16211,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 63E (code 2501).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28412,Pulkovo 1942 / Gauss-Kruger zone 12,1801,projected,4530,,4284,16212,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 69E (code 2502).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28413,Pulkovo 1942 / Gauss-Kruger zone 13,1802,projected,4530,,4284,16213,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 75E (code 2503).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28414,Pulkovo 1942 / Gauss-Kruger zone 14,1803,projected,4530,,4284,16214,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 81E (code 2504).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28415,Pulkovo 1942 / Gauss-Kruger zone 15,1804,projected,4530,,4284,16215,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 87E (code 2505).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28416,Pulkovo 1942 / Gauss-Kruger zone 16,1775,projected,4530,,4284,16216,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 93E (code 2506).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28417,Pulkovo 1942 / Gauss-Kruger zone 17,1776,projected,4530,,4284,16217,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 99E (code 2507).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28418,Pulkovo 1942 / Gauss-Kruger zone 18,1777,projected,4530,,4284,16218,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 105E (code 2508).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28419,Pulkovo 1942 / Gauss-Kruger zone 19,1778,projected,4530,,4284,16219,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 111E (code 2509).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28420,Pulkovo 1942 / Gauss-Kruger zone 20,1779,projected,4530,,4284,16220,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 117E (code 2510).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28421,Pulkovo 1942 / Gauss-Kruger zone 21,1780,projected,4530,,4284,16221,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 123E (code 2511).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28422,Pulkovo 1942 / Gauss-Kruger zone 22,1781,projected,4530,,4284,16222,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 129E (code 2512).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28423,Pulkovo 1942 / Gauss-Kruger zone 23,1782,projected,4530,,4284,16223,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 135E (code 2513).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28424,Pulkovo 1942 / Gauss-Kruger zone 24,1783,projected,4530,,4284,16224,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 141E (code 2514).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28425,Pulkovo 1942 / Gauss-Kruger zone 25,1784,projected,4530,,4284,16225,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 147E (code 2515).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28426,Pulkovo 1942 / Gauss-Kruger zone 26,1785,projected,4530,,4284,16226,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 153E (code 2516).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28427,Pulkovo 1942 / Gauss-Kruger zone 27,1786,projected,4530,,4284,16227,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 159E (code 2517).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28428,Pulkovo 1942 / Gauss-Kruger zone 28,1787,projected,4530,,4284,16228,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 165E (code 2518).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28429,Pulkovo 1942 / Gauss-Kruger zone 29,1788,projected,4530,,4284,16229,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 171E (code 2519).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28430,Pulkovo 1942 / Gauss-Kruger zone 30,1789,projected,4530,,4284,16230,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 177E (code 2520).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28431,Pulkovo 1942 / Gauss-Kruger zone 31,1790,projected,4530,,4284,16231,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 177W (code 2521).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28432,Pulkovo 1942 / Gauss-Kruger zone 32,1791,projected,4530,,4284,16232,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 171W (code 2522).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28462,Pulkovo 1942 / Gauss-Kruger 2N,1805,projected,4530,,4284,16302,,,Truncated form of Gauss-Kruger zone 2,,,EPSG,1998-06-30 00:00:00,,1,1
+28463,Pulkovo 1942 / Gauss-Kruger 3N,1792,projected,4530,,4284,16303,,,Military mapping.,Truncated form of Gauss-Kruger zone 3,,EPSG,1998-06-30 00:00:00,,1,1
+28464,Pulkovo 1942 / Gauss-Kruger 4N,1793,projected,4530,,4284,16304,,,Military mapping.,,,EPSG,1995-06-02 00:00:00,,1,1
+28465,Pulkovo 1942 / Gauss-Kruger 5N,1794,projected,4530,,4284,16305,,,Truncated form of Gauss-Kruger zone 5,,,EPSG,1995-06-02 00:00:00,,1,1
+28466,Pulkovo 1942 / Gauss-Kruger 6N,1795,projected,4530,,4284,16306,,,Truncated form of Gauss-Kruger zone 6,,,EPSG,1995-06-02 00:00:00,,1,1
+28467,Pulkovo 1942 / Gauss-Kruger 7N,1796,projected,4530,,4284,16307,,,Truncated form of Gauss-Kruger zone 7,,,EPSG,1995-06-02 00:00:00,,1,1
+28468,Pulkovo 1942 / Gauss-Kruger 8N,1797,projected,4530,,4284,16308,,,Truncated form of Gauss-Kruger zone 8,,,EPSG,1995-06-02 00:00:00,,1,1
+28469,Pulkovo 1942 / Gauss-Kruger 9N,1798,projected,4530,,4284,16309,,,Truncated form of Gauss-Kruger zone 9,,,EPSG,1995-06-02 00:00:00,,1,1
+28470,Pulkovo 1942 / Gauss-Kruger 10N,1799,projected,4530,,4284,16310,,,Truncated form of Gauss-Kruger zone 10,,,EPSG,1995-06-02 00:00:00,,1,1
+28471,Pulkovo 1942 / Gauss-Kruger 11N,1800,projected,4530,,4284,16311,,,Truncated form of Gauss-Kruger zone 11,,,EPSG,1995-06-02 00:00:00,,1,1
+28472,Pulkovo 1942 / Gauss-Kruger 12N,1801,projected,4530,,4284,16312,,,Truncated form of Gauss-Kruger zone 12,,,EPSG,1995-06-02 00:00:00,,1,1
+28473,Pulkovo 1942 / Gauss-Kruger 13N,1802,projected,4530,,4284,16313,,,Truncated form of Gauss-Kruger zone 13,,,EPSG,1995-06-02 00:00:00,,1,1
+28474,Pulkovo 1942 / Gauss-Kruger 14N,1803,projected,4530,,4284,16314,,,Truncated form of Gauss-Kruger zone 14,,,EPSG,1995-06-02 00:00:00,,1,1
+28475,Pulkovo 1942 / Gauss-Kruger 15N,1804,projected,4530,,4284,16315,,,Truncated form of Gauss-Kruger zone 15,,,EPSG,1995-06-02 00:00:00,,1,1
+28476,Pulkovo 1942 / Gauss-Kruger 16N,1775,projected,4530,,4284,16316,,,Truncated form of Gauss-Kruger zone 16,,,EPSG,1995-06-02 00:00:00,,1,1
+28477,Pulkovo 1942 / Gauss-Kruger 17N,1776,projected,4530,,4284,16317,,,Truncated form of Gauss-Kruger zone 17,,,EPSG,1995-06-02 00:00:00,,1,1
+28478,Pulkovo 1942 / Gauss-Kruger 18N,1777,projected,4530,,4284,16318,,,Truncated form of Gauss-Kruger zone 18,,,EPSG,1995-06-02 00:00:00,,1,1
+28479,Pulkovo 1942 / Gauss-Kruger 19N,1778,projected,4530,,4284,16319,,,Truncated form of Gauss-Kruger zone 19,,,EPSG,1995-06-02 00:00:00,,1,1
+28480,Pulkovo 1942 / Gauss-Kruger 20N,1779,projected,4530,,4284,16320,,,Truncated form of Gauss-Kruger zone 20,,,EPSG,1995-06-02 00:00:00,,1,1
+28481,Pulkovo 1942 / Gauss-Kruger 21N,1780,projected,4530,,4284,16321,,,Truncated form of Gauss-Kruger zone 21,,,EPSG,1995-06-02 00:00:00,,1,1
+28482,Pulkovo 1942 / Gauss-Kruger 22N,1781,projected,4530,,4284,16322,,,Truncated form of Gauss-Kruger zone 22,,,EPSG,1995-06-02 00:00:00,,1,1
+28483,Pulkovo 1942 / Gauss-Kruger 23N,1782,projected,4530,,4284,16323,,,Truncated form of Gauss-Kruger zone 23,,,EPSG,1995-06-02 00:00:00,,1,1
+28484,Pulkovo 1942 / Gauss-Kruger 24N,1783,projected,4530,,4284,16324,,,Truncated form of Gauss-Kruger zone 24,,,EPSG,1995-06-02 00:00:00,,1,1
+28485,Pulkovo 1942 / Gauss-Kruger 25N,1784,projected,4530,,4284,16325,,,Truncated form of Gauss-Kruger zone 25,,,EPSG,1995-06-02 00:00:00,,1,1
+28486,Pulkovo 1942 / Gauss-Kruger 26N,1785,projected,4530,,4284,16326,,,Truncated form of Gauss-Kruger zone 26,,,EPSG,1995-06-02 00:00:00,,1,1
+28487,Pulkovo 1942 / Gauss-Kruger 27N,1786,projected,4530,,4284,16327,,,Truncated form of Gauss-Kruger zone 27,,,EPSG,1995-06-02 00:00:00,,1,1
+28488,Pulkovo 1942 / Gauss-Kruger 28N,1787,projected,4530,,4284,16328,,,Truncated form of Gauss-Kruger zone 28,,,EPSG,1995-06-02 00:00:00,,1,1
+28489,Pulkovo 1942 / Gauss-Kruger 29N,1788,projected,4530,,4284,16329,,,Truncated form of Gauss-Kruger zone 29,,,EPSG,1995-06-02 00:00:00,,1,1
+28490,Pulkovo 1942 / Gauss-Kruger 30N,1789,projected,4530,,4284,16330,,,Truncated form of Gauss-Kruger zone 30,,,EPSG,1995-06-02 00:00:00,,1,1
+28491,Pulkovo 1942 / Gauss-Kruger 31N,1790,projected,4530,,4284,16331,,,Truncated form of Gauss-Kruger zone 31,,,EPSG,1995-06-02 00:00:00,,1,1
+28492,Pulkovo 1942 / Gauss-Kruger 32N,1791,projected,4530,,4284,16332,,,Truncated form of Gauss-Kruger zone 32,,,EPSG,1995-06-02 00:00:00,,1,1
+28600,Qatar 1974 / Qatar National Grid,1346,projected,4400,,4285,19919,,,Large and medium scale topographic mapping and engineering survey.,,Qatar Centre for Geographic Information.,EPSG,2000-03-07 00:00:00,2000.29,1,0
+28991,Amersfoort / RD Old,1275,projected,4499,,4289,19913,,,Large and medium scale topographic mapping and engineering survey.,Superseded by 28992 (Amersfoort / RD New).,,EPSG,2000-03-07 00:00:00,2000.37,1,0
+28992,Amersfoort / RD New,1275,projected,4499,,4289,19914,,,Large and medium scale topographic mapping and engineering survey.,Supersedes 28991 (Amersfoort / RD Old).,,EPSG,2000-03-07 00:00:00,2000.37,1,0
+29100,SAD69 / Brazil Polyconic,1053,projected,4499,,4291,19941,,,Small scale mapping.,,PetroBras,EPSG,1999-04-22 00:00:00,,1,0
+29118,SAD69 / UTM zone 18N,1807,projected,4400,,4291,16018,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.251. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29119,SAD69 / UTM zone 19N,1809,projected,4400,,4291,16019,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29120,SAD69 / UTM zone 20N,1811,projected,4400,,4291,16020,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29121,SAD69 / UTM zone 21N,1813,projected,4400,,4291,16021,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29122,SAD69 / UTM zone 22N,1815,projected,4400,,4291,16022,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29177,SAD69 / UTM zone 17S,1806,projected,4400,,4291,16117,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29178,SAD69 / UTM zone 18S,1808,projected,4400,,4291,16118,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29179,SAD69 / UTM zone 19S,1810,projected,4400,,4291,16119,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29180,SAD69 / UTM zone 20S,1812,projected,4400,,4291,16120,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29181,SAD69 / UTM zone 21S,1814,projected,4400,,4291,16121,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29182,SAD69 / UTM zone 22S,1816,projected,4400,,4291,16122,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29183,SAD69 / UTM zone 23S,1817,projected,4400,,4291,16123,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29184,SAD69 / UTM zone 24S,1818,projected,4400,,4291,16124,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29185,SAD69 / UTM zone 25S,1819,projected,4400,,4291,16125,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29220,Sapper Hill 1943 / UTM zone 20S,1820,projected,4400,,4292,16120,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29221,Sapper Hill 1943 / UTM zone 21S,1821,projected,4400,,4292,16121,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29333,Schwarzeck / UTM zone 33S,1822,projected,4400,,4293,16133,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+29371,South West African Coord. System zone 11,1838,projected,6502,,4293,17611,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16 99.98,1,0
+29373,South West African Coord. System zone 13,1839,projected,6502,,4293,17613,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16 99.98,1,0
+29375,South West African Coord. System zone 15,1840,projected,6502,,4293,17615,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16 99.98,1,0
+29377,South West African Coord. System zone 17,1841,projected,6502,,4293,17617,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16 99.98,1,0
+29379,South West African Coord. System zone 19,1842,projected,6502,,4293,17619,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16 99.98,1,0
+29381,South West African Coord. System zone 21,1843,projected,6502,,4293,17621,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16 99.98,1,0
+29383,South West African Coord. System zone 23,1844,projected,6502,,4293,17623,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16 99.98,1,0
+29385,South West African Coord. System zone 25,1845,projected,6502,,4293,17625,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16 99.98,1,0
+29635,Sudan / UTM zone 35N,1846,projected,4400,,4296,16035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29636,Sudan / UTM zone 36N,1847,projected,4400,,4296,16036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29700,Tananarive (Paris) / Laborde Grid,1149,projected,4499,,4810,19911,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29738,Tananarive / UTM zone 38S,1848,projected,4400,,4297,16138,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29739,Tananarive / UTM zone 39S,1849,projected,4400,,4297,16139,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29849,Timbalai 1948 / UTM zone 49N,1852,projected,4400,,4298,16049,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29850,Timbalai 1948 / UTM zone 50N,1853,projected,4400,,4298,16050,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29871,Timbalai 1948 / R.S.O. Borneo (ch),1362,projected,4402,,4298,19956,,,Large and medium scale topographic mapping and engineering survey.,Adopts metric conversion of 39.370147 inches per metre. Being superseded by metric version (code 29873).,,EPSG,2002-07-13 00:00:00,97.231 2000.60 2002.47,1,0
+29872,Timbalai 1948 / R.S.O. Borneo (ft),1851,projected,4405,,4298,19957,,,Large and medium scale topographic mapping and engineering survey.,Original projection definition in chains. 1 chain = 66 feet. Adopts Sears 1922 metric conversion of 39.370147 inches per metre. Being superseded by metric version (code 29873).,,EPSG,2002-07-13 00:00:00,97.231 2000.60 2002.47,1,0
+29873,Timbalai 1948 / R.S.O. Borneo (m),1362,projected,4400,,4298,19958,,,Large and medium scale topographic mapping and engineering survey.,Original projection definition in chains. 1 chain = 66 feet=792 inches. Adopts Sears 1922 metric conversion of 39.370147 inches per metre.,,EPSG,2000-10-19 00:00:00,2000.60,1,0
+29900,TM65 / Irish National Grid,1305,projected,4400,,4299,19908,,,Large and medium scale topographic mapping and engineering survey.,Superseded by IRENET95 / Irish Transverse Mercator (code 2157) from 1/1/2001. Deprecated due to change of name - see 29902.,Ordnance Survey of Ireland,EPSG,1995-06-02 00:00:00,,1,1
+29901,OSNI 1952 / Irish National Grid,2530,projected,4400,,4188,19973,,,Large and medium scale topographic mapping and engineering survey.,Not used in Republic of Ireland. Superseded in 1975 by TM75 / Irish Grid (code 29903).,Ordnance Survey of Northern Ireland.,EPSG,2001-11-06 00:00:00,,1,0
+29902,TM65 / Irish Grid,1125,projected,4400,,4299,19972,,,Large and medium scale topographic mapping and engineering survey.,Not used in Northern Ireland. Superseded by TM75 / Irish Grid (code 29903) in 1975.,Ordnance Survey of Ireland.,EPSG,2001-11-06 00:00:00,,1,0
+29903,TM75 / Irish Grid,1305,projected,4400,,4300,19972,,,Large and medium scale topographic mapping and engineering survey.,Supersedes both OSNI 1952 / Irish National Grid (code 29901) and TM65 / Irish Grid (code 29902) from 1975. Superseded by IRENET95 / Irish Transverse Mercator (code 2157) from 1/1/2001.,Ordnance Survey of Ireland,EPSG,2001-11-06 00:00:00,,1,0
+30161,Tokyo / Japan Plane Rectangular CS I,1854,projected,4530,,4301,17801,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS I (code 2443) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30162,Tokyo / Japan Plane Rectangular CS II,1855,projected,4530,,4301,17802,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS II (code 2444) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30163,Tokyo / Japan Plane Rectangular CS III,1856,projected,4530,,4301,17803,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS III (code 2445) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30164,Tokyo / Japan Plane Rectangular CS IV,1857,projected,4530,,4301,17804,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS IV (code 2446) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30165,Tokyo / Japan Plane Rectangular CS V,1858,projected,4530,,4301,17805,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS V (code 2447) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30166,Tokyo / Japan Plane Rectangular CS VI,1859,projected,4530,,4301,17806,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS VI (code 2448) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30167,Tokyo / Japan Plane Rectangular CS VII,1860,projected,4530,,4301,17807,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS VII (code 2449) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30168,Tokyo / Japan Plane Rectangular CS VIII,1861,projected,4530,,4301,17808,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS VIII (code 2450) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30169,Tokyo / Japan Plane Rectangular CS IX,1862,projected,4530,,4301,17809,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS IX (code 2451) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30170,Tokyo / Japan Plane Rectangular CS X,1863,projected,4530,,4301,17810,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS X (code 2452) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30171,Tokyo / Japan Plane Rectangular CS XI,1864,projected,4530,,4301,17811,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS XI (code 2453) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30172,Tokyo / Japan Plane Rectangular CS XII,1865,projected,4530,,4301,17812,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS XII (code 2454) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30173,Tokyo / Japan Plane Rectangular CS XIII,1866,projected,4530,,4301,17813,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS XIII (code 2455) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30174,Tokyo / Japan Plane Rectangular CS XIV,1867,projected,4530,,4301,17814,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low. Superseded by JGD2000 / Japan Plane Rectangular CS XIV (code 2456) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,2002.08,1,0
+30175,Tokyo / Japan Plane Rectangular CS XV,1868,projected,4530,,4301,17815,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS XV (code 2457) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30176,Tokyo / Japan Plane Rectangular CS XVI,1869,projected,4530,,4301,17816,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS XVI (code 2458) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,2002.08,1,0
+30177,Tokyo / Japan Plane Rectangular CS XVII,1870,projected,4530,,4301,17817,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low. Superseded by JGD2000 / Japan Plane Rectangular CS XVII (code 2459) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30178,Tokyo / Japan Plane Rectangular CS XVIII,1871,projected,4530,,4301,17818,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low. Superseded by JGD2000 / Japan Plane Rectangular CS XVIII (code 2460) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30179,Tokyo / Japan Plane Rectangular CS XIX,1872,projected,4530,,4301,17819,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low. Superseded by JGD2000 / Japan Plane Rectangular CS XIX (code 2461) from April 2002.,Geographic Survey Institute; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30200,Trinidad 1903 / Trinidad Grid,1322,projected,4407,,4302,19925,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.231,1,0
+30339,TC(1948) / UTM zone 39N,1850,projected,4400,,4303,16039,,,Oil exploration.,,,EPSG,1995-06-02 00:00:00,,1,0
+30340,TC(1948) / UTM zone 40N,1750,projected,4400,,4303,16040,,,Oil exploration.,,,EPSG,1995-06-02 00:00:00,,1,0
+30491,Voirol 1875 / Nord Algerie (ancienne),1728,projected,4499,,4304,18011,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Nord Sahara 1959 / Voirol Unifie Nord (code 30791).,,EPSG,1995-06-02 00:00:00,,1,0
+30492,Voirol 1875 / Sud Algerie (ancienne),1729,projected,4499,,4304,18012,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Nord Sahara 1959 / Voirol Unifie Nord (code 30792).,,EPSG,1995-06-02 00:00:00,,1,0
+30729,Nord Sahara 1959 / UTM zone 29N,1735,projected,4400,,4307,16029,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+30730,Nord Sahara 1959 / UTM zone 30N,1736,projected,4400,,4307,16030,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+30731,Nord Sahara 1959 / UTM zone 31N,1737,projected,4400,,4307,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+30732,Nord Sahara 1959 / UTM zone 32N,1738,projected,4400,,4307,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+30791,Nord Sahara 1959 / Voirol Unifie Nord,1728,projected,4499,,4307,18021,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Voirol 1875 / Nord Algeria ancienne (code 30491). Grid coordinates on average across Algeria are unchanged although local differences reach 30 metres; geographic coordinate equivalents do change.,"""Le System Geodesique Nord-Sahara""; IGN Paris",EPSG,2002-08-29 00:00:00,2002.56,1,0
+30792,Nord Sahara 1959 / Voirol Unifie Sud,1729,projected,4499,,4307,18022,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Voirol 1875 / Sud Algeria ancienne (code 30492). Grid coordinates on average across Algeria are unchanged although local differences reach 30 metres; geographic coordinate equivalents do change.,"""Le System Geodesique Nord-Sahara""; IGN Paris",EPSG,2002-08-29 00:00:00,2002.56,1,0
+30800,RT38 2.5 gon W,1225,projected,4530,,4308,19929,,,Large and medium scale topographic mapping and engineering survey.,,National Land Survey of Sweden,EPSG,1997-11-13 00:00:00,97.14 97.39,1,0
+31028,Yoff / UTM zone 28N,1207,projected,4400,,4310,16028,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+31121,Zanderij / UTM zone 21N,1222,projected,4400,,4311,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+31154,Zanderij / TM 54 NW,1727,projected,4400,,4311,17054,,,Large and medium scale topographic mapping and engineering survey.,,Shell International,EPSG,2000-06-10 00:00:00,,1,0
+31170,Zanderij / Suriname Old TM,1222,projected,4400,,4311,19954,,,Large and medium scale topographic mapping and engineering survey.,Introduced in 1975. Superseded by Zanderij / Suriname TM in 1979.,Shell International,EPSG,2000-06-10 00:00:00,,1,0
+31171,Zanderij / Suriname TM,1222,projected,4400,,4311,19955,,,Large and medium scale topographic mapping and engineering survey.,Superseded Zanderij / Suriname Old TM in 1979.,Shell International,EPSG,2000-06-10 00:00:00,,1,0
+31265,MGI / 3-degree Gauss zone 5,1709,projected,4499,,4312,16265,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,,1,1
+31266,MGI / 3-degree Gauss zone 6,1710,projected,4499,,4312,16266,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,,1,1
+31267,MGI / 3-degree Gauss zone 7,1711,projected,4499,,4312,16267,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,,1,1
+31268,MGI / 3-degree Gauss zone 8,1712,projected,4499,,4312,16268,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,,1,1
+31275,MGI / Balkans zone 5,1709,projected,4530,,4312,18275,,,Large and medium scale topographic mapping and engineering survey.,In Slovenia the truncated form MGI / Slovenia Grid (code 2169) is preferred.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+31276,MGI / Balkans zone 6,1710,projected,4530,,4312,18276,,,Large and medium scale topographic mapping and engineering survey.,,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+31277,MGI / Balkans zone 7,1711,projected,4530,,4312,18277,,,Large and medium scale topographic mapping and engineering survey.,,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+31278,MGI / Balkans zone 8,1712,projected,4530,,4312,18277,,,Large and medium scale topographic mapping and engineering survey.,,EPSG,EPSG,2001-06-05 00:00:00,,1,1
+31279,MGI / Balkans zone 8,1712,projected,4530,,4312,18278,,,Large and medium scale topographic mapping and engineering survey.,,EPSG,EPSG,2001-08-28 00:00:00,,1,0
+31281,MGI (Ferro) / Austria West Zone,1706,projected,4530,,4805,18041,,,Large and medium scale topographic mapping and engineering survey.,Superseded by MGI / M28 (EPSG code 31284) based on Greenwich meridian.,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31282,MGI (Ferro) / Austria Central Zone,1708,projected,4530,,4805,18042,,,Large and medium scale topographic mapping and engineering survey.,Superseded by MGI / M31 (EPSG code 31285) based on Greenwich meridian.,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31283,MGI (Ferro) / Austria East Zone,1707,projected,4530,,4805,18043,,,Large and medium scale topographic mapping and engineering survey.,Superseded by MGI / M34 (EPSG code 31286) based on Greenwich meridian.,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31284,MGI / M28,1706,projected,4530,,4312,18044,,,Large and medium scale topographic mapping and engineering survey.,Supersedes MGI (Ferro) / Austria West zone (EPSG code 31281).,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31285,MGI / M31,1707,projected,4530,,4312,18045,,,Large and medium scale topographic mapping and engineering survey.,Supersedes MGI (Ferro) / Austria Central zone (EPSG code 31282).,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31286,MGI / M34,1708,projected,4530,,4312,18046,,,Large and medium scale topographic mapping and engineering survey.,Supersedes MGI (Ferro) / Austria East zone (EPSG code 31283).,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31287,MGI / Austria Lambert,1037,projected,4530,,4312,19947,,,Medium and small scale mapping.,,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31291,MGI (Ferro) / Austria West Zone,1706,projected,4499,,4805,18041,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,97.01,1,1
+31292,MGI (Ferro) / Austria Central Zone,1708,projected,4499,,4805,18042,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,97.01,1,1
+31293,MGI (Ferro) / Austria East Zone,1707,projected,4499,,4805,18043,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,97.01,1,1
+31294,MGI / M28,1706,projected,4499,,4312,18044,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.01,1,1
+31295,MGI / M31,1707,projected,4499,,4312,18045,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.01,1,1
+31296,MGI / M34,1708,projected,4499,,4312,18046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.01,1,1
+31297,MGI / Austria Lambert,1037,projected,4499,,4312,19947,,,Medium and small scale mapping.,,,EPSG,1999-10-20 00:00:00,97.01,1,1
+31300,Belge 1972 / Belge Lambert 72,1347,projected,4499,,4313,19902,,,Large and medium scale topographic mapping and engineering survey.,Supersedes 21500 (Belge 1950 / Belge Lambert 50). An alternative - Belge 1972 / Belgian Lambert 72 (code 31370) - was introduced in 2000 to use the standard Lambert Conic Conformal (2SP) projection method (code 9802). EPSG recommends this alternative.,IGN Brussels.,EPSG,1995-06-02 00:00:00,,1,0
+31370,Belge 1972 / Belgian Lambert 72,1347,projected,4499,,4313,19961,,,Large and medium scale topographic mapping and engineering survey.,"Introduced in 2000 as an alternative to CRS code 31300 to avoid the special projection method LCC (2SP Belgium) (code 9803). If software cannot handle latitude of origin 90�N, use latitude of origin = 50� 47' 57.704""N with Nf = 165372.956 m.",IGN Brussels www.ngi.be/html-files/french/0038.html,EPSG,2000-10-19 00:00:00,,1,0
+31461,DHDN / 3-degree Gauss zone 1,1628,projected,4499,,4314,16261,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.101,1,1
+31462,DHDN / 3-degree Gauss zone 2,1624,projected,4499,,4314,16262,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.101,1,1
+31463,DHDN / 3-degree Gauss zone 3,1625,projected,4499,,4314,16263,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.101,1,1
+31464,DHDN / 3-degree Gauss zone 4,1626,projected,4499,,4314,16264,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.101,1,1
+31465,DHDN / 3-degree Gauss zone 5,1627,projected,4499,,4314,16265,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.101,1,1
+31466,DHDN / Gauss-Kruger zone 2,1624,projected,4530,,4314,16262,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",Zone width 3 degrees.,Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+31467,DHDN / Gauss-Kruger zone 3,1625,projected,4530,,4314,16263,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",Zone width 3 degrees.,Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+31468,DHDN / Gauss-Kruger zone 4,1626,projected,4530,,4314,16264,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",Zone width 3 degrees.,Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+31469,DHDN / Gauss-Kruger zone 5,1627,projected,4530,,4314,16265,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",Zone width 3 degrees.,Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+31528,Conakry 1905 / UTM zone 28N,1468,projected,4400,,4315,16028,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Dabola 1981 / UTM zone 28 (EPSG code 2063).,,EPSG,1999-12-09 00:00:00,,1,0
+31529,Conakry 1905 / UTM zone 29N,1469,projected,4400,,4315,16029,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Dabola 1981 / UTM zone 29 (EPSG code 2064).,,EPSG,1999-12-09 00:00:00,,1,0
+31600,Dealul Piscului 1933/ Stereo 33,1197,projected,4499,,4316,19927,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Stereo 70 system (ProjCS code 31700).,,EPSG,1996-04-12 00:00:00,,1,0
+31700,Dealul Piscului 1970/ Stereo 70,1197,projected,4530,,4317,19926,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Stereo 33 system.,,EPSG,1996-04-12 00:00:00,,1,0
+31838,NGN / UTM zone 38N,1739,projected,4400,,4318,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+31839,NGN / UTM zone 39N,1740,projected,4400,,4318,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+31900,KUDAMS / KTM,1310,projected,4400,,4319,19928,,,Large scale engineering and utility mapping.,,,EPSG,1996-04-12 00:00:00,,1,0
+31986,SIRGAS / UTM zone 17N,1823,projected,4400,,4170,16017,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31987,SIRGAS / UTM zone 18N,1825,projected,4400,,4170,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31988,SIRGAS / UTM zone 19N,1827,projected,4400,,4170,16019,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31989,SIRGAS / UTM zone 20N,1829,projected,4400,,4170,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31990,SIRGAS / UTM zone 21N,1831,projected,4400,,4170,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31991,SIRGAS / UTM zone 22N,1833,projected,4400,,4170,16022,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31992,SIRGAS / UTM zone 17S,1824,projected,4400,,4170,16117,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31993,SIRGAS / UTM zone 18S,1826,projected,4400,,4170,16118,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31994,SIRGAS / UTM zone 19S,1828,projected,4400,,4170,16119,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31995,SIRGAS / UTM zone 20S,1830,projected,4400,,4170,16120,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31996,SIRGAS / UTM zone 21S,1832,projected,4400,,4170,16121,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31997,SIRGAS / UTM zone 22S,1834,projected,4400,,4170,16122,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31998,SIRGAS / UTM zone 23S,1835,projected,4400,,4170,16123,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31999,SIRGAS / UTM zone 24S,1836,projected,4400,,4170,16124,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+32000,SIRGAS / UTM zone 25S,1837,projected,4400,,4170,16125,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+32001,NAD27 / Montana North,2211,projected,4497,,4267,12501,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32002,NAD27 / Montana Central,2210,projected,4497,,4267,12502,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32003,NAD27 / Montana South,2212,projected,4497,,4267,12503,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32005,NAD27 / Nebraska North,2221,projected,4497,,4267,12601,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32006,NAD27 / Nebraska South,2222,projected,4497,,4267,12602,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32007,NAD27 / Nevada East,2224,projected,4497,,4267,12701,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32008,NAD27 / Nevada Central,2223,projected,4497,,4267,12702,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32009,NAD27 / Nevada West,2225,projected,4497,,4267,12703,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32010,NAD27 / New Hampshire,1398,projected,4497,,4267,12800,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32011,NAD27 / New Jersey,1399,projected,4497,,4267,12900,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32012,NAD27 / New Mexico East,2228,projected,4497,,4267,13001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32013,NAD27 / New Mexico Central,2229,projected,4497,,4267,13002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32014,NAD27 / New Mexico West,2230,projected,4497,,4267,13003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32015,NAD27 / New York East,2234,projected,4497,,4267,13101,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32016,NAD27 / New York Central,2233,projected,4497,,4267,13102,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32017,NAD27 / New York West,2236,projected,4497,,4267,13103,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32018,NAD27 / New York Long Island,2235,projected,4497,,4267,13104,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32019,NAD27 / North Carolina,1402,projected,4497,,4267,13200,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32020,NAD27 / North Dakota North,2237,projected,4497,,4267,13301,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32021,NAD27 / North Dakota South,2238,projected,4497,,4267,13302,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32022,NAD27 / Ohio North,2239,projected,4497,,4267,13401,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32023,NAD27 / Ohio South,2240,projected,4497,,4267,13402,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32024,NAD27 / Oklahoma North,2241,projected,4497,,4267,13501,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32025,NAD27 / Oklahoma South,2242,projected,4497,,4267,13502,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32026,NAD27 / Oregon North,2243,projected,4497,,4267,13601,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32027,NAD27 / Oregon South,2244,projected,4497,,4267,13602,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32028,NAD27 / Pennsylvania North,2245,projected,4497,,4267,13701,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32029,NAD27 / Pennsylvania South,2246,projected,4497,,4267,13702,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32030,NAD27 / Rhode Island,1408,projected,4497,,4267,13800,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32031,NAD27 / South Carolina North,2247,projected,4497,,4267,13901,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32033,NAD27 / South Carolina South,2248,projected,4497,,4267,13902,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32034,NAD27 / South Dakota North,2249,projected,4497,,4267,14001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32035,NAD27 / South Dakota South,2250,projected,4497,,4267,14002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32036,NAD27 / Tennessee,1411,projected,4497,,4267,14100,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,1
+32037,NAD27 / Texas North,2253,projected,4497,,4267,14201,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32038,NAD27 / Texas North Central,2254,projected,4497,,4267,14202,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32039,NAD27 / Texas Central,2252,projected,4497,,4267,14203,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32040,NAD27 / Texas South Central,2256,projected,4497,,4267,14204,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32041,NAD27 / Texas South,2255,projected,4497,,4267,14205,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32042,NAD27 / Utah North,2258,projected,4497,,4267,14301,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32043,NAD27 / Utah Central,2257,projected,4497,,4267,14302,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32044,NAD27 / Utah South,2259,projected,4497,,4267,14303,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32045,NAD27 / Vermont,1414,projected,4497,,4267,14400,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32046,NAD27 / Virginia North,2260,projected,4497,,4267,14501,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32047,NAD27 / Virginia South,2261,projected,4497,,4267,14502,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32048,NAD27 / Washington North,2262,projected,4497,,4267,14601,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32049,NAD27 / Washington South,2263,projected,4497,,4267,14602,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32050,NAD27 / West Virginia North,2264,projected,4497,,4267,14701,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32051,NAD27 / West Virginia South,2265,projected,4497,,4267,14702,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32052,NAD27 / Wisconsin North,2267,projected,4497,,4267,14801,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32053,NAD27 / Wisconsin Central,2266,projected,4497,,4267,14802,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32054,NAD27 / Wisconsin South,2268,projected,4497,,4267,14803,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32055,NAD27 / Wyoming East,2269,projected,4497,,4267,14901,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32056,NAD27 / Wyoming East Central,2270,projected,4497,,4267,14902,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32057,NAD27 / Wyoming West Central,2272,projected,4497,,4267,14903,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32058,NAD27 / Wyoming West,2271,projected,4497,,4267,14904,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32061,NAD27 / Guatemala Norte,2120,projected,4499,,4267,18211,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-08-18 00:00:00,,1,0
+32062,NAD27 / Guatemala Sur,2121,projected,4499,,4267,18212,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-01-06 00:00:00,99.95,1,0
+32064,NAD27 / BLM 14N (ftUS),2171,projected,4497,,4267,15914,,,"Minerals (including oil) management, exploration and production.",,EPSG,EPSG,2002-02-12 00:00:00,,1,0
+32065,NAD27 / BLM 15N (ftUS),2171,projected,4497,,4267,15915,,,"Minerals (including oil) management, exploration and production.",,EPSG,EPSG,2002-02-12 00:00:00,,1,0
+32066,NAD27 / BLM 16N (ftUS),2171,projected,4497,,4267,15916,,,"Minerals (including oil) management, exploration and production.",,EPSG,EPSG,2002-02-12 00:00:00,,1,0
+32067,NAD27 / BLM 17N (ftUS),2171,projected,4497,,4267,15917,,,"Minerals (including oil) management, exploration and production.",,EPSG,EPSG,2002-02-12 00:00:00,,1,0
+32074,NAD27 / BLM 14N (feet),2171,projected,4497,,4267,15914,,,"Minerals (including oil) management, exploration and production.",,,EPSG,1996-04-12 00:00:00,96.03,1,1
+32075,NAD27 / BLM 15N (feet),2172,projected,4497,,4267,15915,,,"Minerals (including oil) management, exploration and production.",,,EPSG,1996-04-12 00:00:00,96.03,1,1
+32076,NAD27 / BLM 16N (feet),2173,projected,4497,,4267,15916,,,"Minerals (including oil) management, exploration and production.",,,EPSG,1996-04-12 00:00:00,95.27 96.03,1,1
+32077,NAD27 / BLM 17N (feet),2174,projected,4497,,4267,15917,,,"Minerals (including oil) management, exploration and production.",,,EPSG,1996-04-12 00:00:00,96.03,1,1
+32081,NAD27 / MTM zone 1,2226,projected,4400,,4267,17701,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32082,NAD27 / MTM zone 2,2227,projected,4400,,4267,17702,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32083,NAD27 / MTM zone 3,2275,projected,4400,,4267,17703,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32084,NAD27 / MTM zone 4,2276,projected,4400,,4267,17704,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32085,NAD27 / MTM zone 5,2277,projected,4400,,4267,17705,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32086,NAD27 / MTM zone 6,2278,projected,4400,,4267,17706,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32098,NAD27 / Quebec Lambert,1368,projected,4499,,4267,19944,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NAD27(CGQ77) / Quebec Lambert (code 2137) in 1977.,Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec,EPSG,2000-10-19 00:00:00,,1,0
+32100,NAD83 / Montana,1395,projected,4499,,4269,12530,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2256 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32104,NAD83 / Nebraska,1396,projected,4499,,4269,12630,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32107,NAD83 / Nevada East,2224,projected,4499,,4269,12731,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32108,NAD83 / Nevada Central,2223,projected,4499,,4269,12732,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32109,NAD83 / Nevada West,2225,projected,4499,,4269,12733,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32110,NAD83 / New Hampshire,1398,projected,4499,,4269,12830,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32111,NAD83 / New Jersey,1399,projected,4499,,4269,12930,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32112,NAD83 / New Mexico East,2228,projected,4499,,4269,13031,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2257 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32113,NAD83 / New Mexico Central,2231,projected,4499,,4269,13032,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2258 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32114,NAD83 / New Mexico West,2232,projected,4499,,4269,13033,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2259 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32115,NAD83 / New York East,2234,projected,4499,,4269,13131,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2260 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32116,NAD83 / New York Central,2233,projected,4499,,4269,13132,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2261 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32117,NAD83 / New York West,2236,projected,4499,,4269,13133,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2263 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32118,NAD83 / New York Long Island,2235,projected,4499,,4269,13134,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2264 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32119,NAD83 / North Carolina,1402,projected,4499,,4269,13230,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2264 for equivalent non-metric definition.,,EPSG,2000-03-07 00:00:00,98.30 2000.091,1,0
+32120,NAD83 / North Dakota North,2237,projected,4499,,4269,13331,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2265 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32121,NAD83 / North Dakota South,2238,projected,4499,,4269,13332,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2266 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32122,NAD83 / Ohio North,2239,projected,4499,,4269,13431,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32123,NAD83 / Ohio South,2240,projected,4499,,4269,13432,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32124,NAD83 / Oklahoma North,2241,projected,4499,,4269,13531,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2267 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32125,NAD83 / Oklahoma South,2242,projected,4499,,4269,13532,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2268 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32126,NAD83 / Oregon North,2243,projected,4499,,4269,13631,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2269 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32127,NAD83 / Oregon South,2244,projected,4499,,4269,13632,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2270 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32128,NAD83 / Pennsylvania North,2245,projected,4499,,4269,13731,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2271 for equivalent non-metric definition.,,EPSG,1995-06-02 00:00:00,,1,0
+32129,NAD83 / Pennsylvania South,2246,projected,4499,,4269,13732,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet. See code 2272 for equivalent non-metric definition.,,EPSG,1995-06-02 00:00:00,,1,0
+32130,NAD83 / Rhode Island,1408,projected,4499,,4269,13830,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32133,NAD83 / South Carolina,1409,projected,4499,,4269,13930,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet). See code 2273 for equivalent non-metric definition.,,EPSG,1995-06-02 00:00:00,,1,0
+32134,NAD83 / South Dakota North,2249,projected,4499,,4269,14031,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32135,NAD83 / South Dakota South,2250,projected,4499,,4269,14032,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32136,NAD83 / Tennessee,1411,projected,4499,,4269,14130,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2274 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32137,NAD83 / Texas North,2253,projected,4499,,4269,14231,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2275 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32138,NAD83 / Texas North Central,2254,projected,4499,,4269,14232,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2276 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32139,NAD83 / Texas Central,2252,projected,4499,,4269,14233,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2277 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32140,NAD83 / Texas South Central,2527,projected,4499,,4269,14234,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2278 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32141,NAD83 / Texas South,2528,projected,4499,,4269,14235,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2279 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32142,NAD83 / Utah North,2258,projected,4499,,4269,14331,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2280 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32143,NAD83 / Utah Central,2257,projected,4499,,4269,14332,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2281 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32144,NAD83 / Utah South,2259,projected,4499,,4269,14333,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet). See code 2282 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32145,NAD83 / Vermont,1414,projected,4499,,4269,14430,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32146,NAD83 / Virginia North,2260,projected,4499,,4269,14531,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2283 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32147,NAD83 / Virginia South,2261,projected,4499,,4269,14532,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2284 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32148,NAD83 / Washington North,2273,projected,4499,,4269,14631,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2285 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32149,NAD83 / Washington South,2274,projected,4499,,4269,14632,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2286 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32150,NAD83 / West Virginia North,2264,projected,4499,,4269,14731,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32151,NAD83 / West Virginia South,2265,projected,4499,,4269,14732,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32152,NAD83 / Wisconsin North,2267,projected,4499,,4269,14831,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2287 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32153,NAD83 / Wisconsin Central,2266,projected,4499,,4269,14832,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2288 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32154,NAD83 / Wisconsin South,2268,projected,4499,,4269,14833,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet. See code 2289 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32155,NAD83 / Wyoming East,2269,projected,4499,,4269,14931,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32156,NAD83 / Wyoming East Central,2270,projected,4499,,4269,14932,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32157,NAD83 / Wyoming West Central,2272,projected,4499,,4269,14933,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32158,NAD83 / Wyoming West,2271,projected,4499,,4269,14934,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32161,NAD83 / Puerto Rico & Virgin Is.,2251,projected,4499,,4269,15230,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32180,NAD83 / SCoPQ zone 2,1420,projected,4499,,4269,17700,,,Large and medium scale topographic mapping and engineering survey.,,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,1997-11-13 00:00:00,,1,0
+32181,NAD83 / MTM zone 1,2226,projected,4496,,4269,17701,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32182,NAD83 / MTM zone 2,2227,projected,4496,,4269,17702,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32183,NAD83 / MTM zone 3,2275,projected,4496,,4269,17703,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 3"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32184,NAD83 / MTM zone 4,2276,projected,4496,,4269,17704,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 4"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32185,NAD83 / MTM zone 5,2277,projected,4496,,4269,17705,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 5"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32186,NAD83 / MTM zone 6,2278,projected,4496,,4269,17706,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 6"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32187,NAD83 / MTM zone 7,1425,projected,4496,,4269,17707,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 7"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,1997-11-13 00:00:00,,1,0
+32188,NAD83 / MTM zone 8,2279,projected,4496,,4269,17708,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 8"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32189,NAD83 / MTM zone 9,2280,projected,4496,,4269,17709,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 9"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32190,NAD83 / MTM zone 10,2281,projected,4496,,4269,17710,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 10"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32191,NAD83 / MTM zone 11,1432,projected,4400,,4269,17711,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32192,NAD83 / MTM zone 12,1433,projected,4400,,4269,17712,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32193,NAD83 / MTM zone 13,1434,projected,4400,,4269,17713,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32194,NAD83 / MTM zone 14,1435,projected,4400,,4269,17714,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32195,NAD83 / MTM zone 15,1436,projected,4400,,4269,17715,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32196,NAD83 / MTM zone 16,1437,projected,4400,,4269,17716,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32197,NAD83 / MTM zone 17,1438,projected,4400,,4269,17717,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32198,NAD83 / Quebec Lambert,1368,projected,4499,,4269,19944,,,Large and medium scale topographic mapping and engineering survey.,,Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec,EPSG,1999-10-20 00:00:00,,1,0
+32201,WGS 72 / UTM zone 1N,1873,projected,4400,,4322,16001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32202,WGS 72 / UTM zone 2N,1875,projected,4400,,4322,16002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32203,WGS 72 / UTM zone 3N,1877,projected,4400,,4322,16003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32204,WGS 72 / UTM zone 4N,1879,projected,4400,,4322,16004,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32205,WGS 72 / UTM zone 5N,1881,projected,4400,,4322,16005,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32206,WGS 72 / UTM zone 6N,1883,projected,4400,,4322,16006,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32207,WGS 72 / UTM zone 7N,1885,projected,4400,,4322,16007,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32208,WGS 72 / UTM zone 8N,1887,projected,4400,,4322,16008,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32209,WGS 72 / UTM zone 9N,1889,projected,4400,,4322,16009,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32210,WGS 72 / UTM zone 10N,1891,projected,4400,,4322,16010,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32211,WGS 72 / UTM zone 11N,1893,projected,4400,,4322,16011,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32212,WGS 72 / UTM zone 12N,1895,projected,4400,,4322,16012,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32213,WGS 72 / UTM zone 13N,1897,projected,4400,,4322,16013,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32214,WGS 72 / UTM zone 14N,1899,projected,4400,,4322,16014,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32215,WGS 72 / UTM zone 15N,1901,projected,4400,,4322,16015,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32216,WGS 72 / UTM zone 16N,1903,projected,4400,,4322,16016,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32217,WGS 72 / UTM zone 17N,1905,projected,4400,,4322,16017,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32218,WGS 72 / UTM zone 18N,1907,projected,4400,,4322,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32219,WGS 72 / UTM zone 19N,1909,projected,4400,,4322,16019,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32220,WGS 72 / UTM zone 20N,1911,projected,4400,,4322,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32221,WGS 72 / UTM zone 21N,1913,projected,4400,,4322,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32222,WGS 72 / UTM zone 22N,1915,projected,4400,,4322,16022,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32223,WGS 72 / UTM zone 23N,1917,projected,4400,,4322,16023,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32224,WGS 72 / UTM zone 24N,1919,projected,4400,,4322,16024,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32225,WGS 72 / UTM zone 25N,1921,projected,4400,,4322,16025,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32226,WGS 72 / UTM zone 26N,1923,projected,4400,,4322,16026,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32227,WGS 72 / UTM zone 27N,1925,projected,4400,,4322,16027,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32228,WGS 72 / UTM zone 28N,1927,projected,4400,,4322,16028,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32229,WGS 72 / UTM zone 29N,1929,projected,4400,,4322,16029,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32230,WGS 72 / UTM zone 30N,1931,projected,4400,,4322,16030,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32231,WGS 72 / UTM zone 31N,1933,projected,4400,,4322,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32232,WGS 72 / UTM zone 32N,1935,projected,4400,,4322,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32233,WGS 72 / UTM zone 33N,1937,projected,4400,,4322,16033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32234,WGS 72 / UTM zone 34N,1939,projected,4400,,4322,16034,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32235,WGS 72 / UTM zone 35N,1941,projected,4400,,4322,16035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32236,WGS 72 / UTM zone 36N,1943,projected,4400,,4322,16036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32237,WGS 72 / UTM zone 37N,1945,projected,4400,,4322,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32238,WGS 72 / UTM zone 38N,1947,projected,4400,,4322,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32239,WGS 72 / UTM zone 39N,1949,projected,4400,,4322,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32240,WGS 72 / UTM zone 40N,1951,projected,4400,,4322,16040,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32241,WGS 72 / UTM zone 41N,1953,projected,4400,,4322,16041,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32242,WGS 72 / UTM zone 42N,1955,projected,4400,,4322,16042,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32243,WGS 72 / UTM zone 43N,1957,projected,4400,,4322,16043,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32244,WGS 72 / UTM zone 44N,1959,projected,4400,,4322,16044,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32245,WGS 72 / UTM zone 45N,1961,projected,4400,,4322,16045,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32246,WGS 72 / UTM zone 46N,1963,projected,4400,,4322,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32247,WGS 72 / UTM zone 47N,1965,projected,4400,,4322,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32248,WGS 72 / UTM zone 48N,1967,projected,4400,,4322,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32249,WGS 72 / UTM zone 49N,1969,projected,4400,,4322,16049,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32250,WGS 72 / UTM zone 50N,1971,projected,4400,,4322,16050,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32251,WGS 72 / UTM zone 51N,1973,projected,4400,,4322,16051,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32252,WGS 72 / UTM zone 52N,1975,projected,4400,,4322,16052,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32253,WGS 72 / UTM zone 53N,1977,projected,4400,,4322,16053,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32254,WGS 72 / UTM zone 54N,1979,projected,4400,,4322,16054,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32255,WGS 72 / UTM zone 55N,1981,projected,4400,,4322,16055,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32256,WGS 72 / UTM zone 56N,1983,projected,4400,,4322,16056,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32257,WGS 72 / UTM zone 57N,1985,projected,4400,,4322,16057,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32258,WGS 72 / UTM zone 58N,1987,projected,4400,,4322,16058,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32259,WGS 72 / UTM zone 59N,1989,projected,4400,,4322,16059,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32260,WGS 72 / UTM zone 60N,1991,projected,4400,,4322,16060,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32301,WGS 72 / UTM zone 1S,1874,projected,4400,,4322,16101,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32302,WGS 72 / UTM zone 2S,1876,projected,4400,,4322,16102,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32303,WGS 72 / UTM zone 3S,1878,projected,4400,,4322,16103,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32304,WGS 72 / UTM zone 4S,1880,projected,4400,,4322,16104,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32305,WGS 72 / UTM zone 5S,1882,projected,4400,,4322,16105,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32306,WGS 72 / UTM zone 6S,1884,projected,4400,,4322,16106,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32307,WGS 72 / UTM zone 7S,1886,projected,4400,,4322,16107,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32308,WGS 72 / UTM zone 8S,1888,projected,4400,,4322,16108,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32309,WGS 72 / UTM zone 9S,1890,projected,4400,,4322,16109,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32310,WGS 72 / UTM zone 10S,1892,projected,4400,,4322,16110,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32311,WGS 72 / UTM zone 11S,1894,projected,4400,,4322,16111,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32312,WGS 72 / UTM zone 12S,1896,projected,4400,,4322,16112,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32313,WGS 72 / UTM zone 13S,1898,projected,4400,,4322,16113,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32314,WGS 72 / UTM zone 14S,1900,projected,4400,,4322,16114,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32315,WGS 72 / UTM zone 15S,1902,projected,4400,,4322,16115,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32316,WGS 72 / UTM zone 16S,1904,projected,4400,,4322,16116,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32317,WGS 72 / UTM zone 17S,1906,projected,4400,,4322,16117,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32318,WGS 72 / UTM zone 18S,1908,projected,4400,,4322,16118,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32319,WGS 72 / UTM zone 19S,1910,projected,4400,,4322,16119,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32320,WGS 72 / UTM zone 20S,1912,projected,4400,,4322,16120,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32321,WGS 72 / UTM zone 21S,1914,projected,4400,,4322,16121,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32322,WGS 72 / UTM zone 22S,1916,projected,4400,,4322,16122,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32323,WGS 72 / UTM zone 23S,1918,projected,4400,,4322,16123,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32324,WGS 72 / UTM zone 24S,1920,projected,4400,,4322,16124,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32325,WGS 72 / UTM zone 25S,1922,projected,4400,,4322,16125,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32326,WGS 72 / UTM zone 26S,1924,projected,4400,,4322,16126,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32327,WGS 72 / UTM zone 27S,1926,projected,4400,,4322,16127,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32328,WGS 72 / UTM zone 28S,1928,projected,4400,,4322,16128,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32329,WGS 72 / UTM zone 29S,1930,projected,4400,,4322,16129,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32330,WGS 72 / UTM zone 30S,1932,projected,4400,,4322,16130,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32331,WGS 72 / UTM zone 31S,1934,projected,4400,,4322,16131,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32332,WGS 72 / UTM zone 32S,1936,projected,4400,,4322,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32333,WGS 72 / UTM zone 33S,1938,projected,4400,,4322,16133,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32334,WGS 72 / UTM zone 34S,1940,projected,4400,,4322,16134,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32335,WGS 72 / UTM zone 35S,1942,projected,4400,,4322,16135,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32336,WGS 72 / UTM zone 36S,1944,projected,4400,,4322,16136,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32337,WGS 72 / UTM zone 37S,1946,projected,4400,,4322,16137,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32338,WGS 72 / UTM zone 38S,1948,projected,4400,,4322,16138,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32339,WGS 72 / UTM zone 39S,1950,projected,4400,,4322,16139,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32340,WGS 72 / UTM zone 40S,1952,projected,4400,,4322,16140,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32341,WGS 72 / UTM zone 41S,1954,projected,4400,,4322,16141,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32342,WGS 72 / UTM zone 42S,1956,projected,4400,,4322,16142,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32343,WGS 72 / UTM zone 43S,1958,projected,4400,,4322,16143,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32344,WGS 72 / UTM zone 44S,1960,projected,4400,,4322,16144,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32345,WGS 72 / UTM zone 45S,1962,projected,4400,,4322,16145,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32346,WGS 72 / UTM zone 46S,1964,projected,4400,,4322,16146,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32347,WGS 72 / UTM zone 47S,1966,projected,4400,,4322,16147,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32348,WGS 72 / UTM zone 48S,1968,projected,4400,,4322,16148,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32349,WGS 72 / UTM zone 49S,1970,projected,4400,,4322,16149,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32350,WGS 72 / UTM zone 50S,1972,projected,4400,,4322,16150,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32351,WGS 72 / UTM zone 51S,1974,projected,4400,,4322,16151,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32352,WGS 72 / UTM zone 52S,1976,projected,4400,,4322,16152,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32353,WGS 72 / UTM zone 53S,1978,projected,4400,,4322,16153,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32354,WGS 72 / UTM zone 54S,1980,projected,4400,,4322,16154,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32355,WGS 72 / UTM zone 55S,1982,projected,4400,,4322,16155,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32356,WGS 72 / UTM zone 56S,1984,projected,4400,,4322,16156,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32357,WGS 72 / UTM zone 57S,1986,projected,4400,,4322,16157,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32358,WGS 72 / UTM zone 58S,1988,projected,4400,,4322,16158,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32359,WGS 72 / UTM zone 59S,1990,projected,4400,,4322,16159,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32360,WGS 72 / UTM zone 60S,1992,projected,4400,,4322,16160,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32401,WGS 72BE / UTM zone 1N,1873,projected,4400,,4324,16001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32402,WGS 72BE / UTM zone 2N,1876,projected,4400,,4324,16002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32403,WGS 72BE / UTM zone 3N,1877,projected,4400,,4324,16003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32404,WGS 72BE / UTM zone 4N,1879,projected,4400,,4324,16004,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32405,WGS 72BE / UTM zone 5N,1881,projected,4400,,4324,16005,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32406,WGS 72BE / UTM zone 6N,1883,projected,4400,,4324,16006,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32407,WGS 72BE / UTM zone 7N,1885,projected,4400,,4324,16007,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32408,WGS 72BE / UTM zone 8N,1887,projected,4400,,4324,16008,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32409,WGS 72BE / UTM zone 9N,1889,projected,4400,,4324,16009,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32410,WGS 72BE / UTM zone 10N,1891,projected,4400,,4324,16010,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32411,WGS 72BE / UTM zone 11N,1893,projected,4400,,4324,16011,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32412,WGS 72BE / UTM zone 12N,1895,projected,4400,,4324,16012,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32413,WGS 72BE / UTM zone 13N,1897,projected,4400,,4324,16013,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32414,WGS 72BE / UTM zone 14N,1899,projected,4400,,4324,16014,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32415,WGS 72BE / UTM zone 15N,1901,projected,4400,,4324,16015,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32416,WGS 72BE / UTM zone 16N,1903,projected,4400,,4324,16016,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32417,WGS 72BE / UTM zone 17N,1905,projected,4400,,4324,16017,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32418,WGS 72BE / UTM zone 18N,1907,projected,4400,,4324,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32419,WGS 72BE / UTM zone 19N,1909,projected,4400,,4324,16019,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32420,WGS 72BE / UTM zone 20N,1911,projected,4400,,4324,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32421,WGS 72BE / UTM zone 21N,1913,projected,4400,,4324,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32422,WGS 72BE / UTM zone 22N,1915,projected,4400,,4324,16022,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32423,WGS 72BE / UTM zone 23N,1917,projected,4400,,4324,16023,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32424,WGS 72BE / UTM zone 24N,1919,projected,4400,,4324,16024,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32425,WGS 72BE / UTM zone 25N,1921,projected,4400,,4324,16025,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32426,WGS 72BE / UTM zone 26N,1923,projected,4400,,4324,16026,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32427,WGS 72BE / UTM zone 27N,1925,projected,4400,,4324,16027,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32428,WGS 72BE / UTM zone 28N,1927,projected,4400,,4324,16028,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32429,WGS 72BE / UTM zone 29N,1929,projected,4400,,4324,16029,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32430,WGS 72BE / UTM zone 30N,1931,projected,4400,,4324,16030,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32431,WGS 72BE / UTM zone 31N,1933,projected,4400,,4324,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32432,WGS 72BE / UTM zone 32N,1935,projected,4400,,4324,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32433,WGS 72BE / UTM zone 33N,1937,projected,4400,,4324,16033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32434,WGS 72BE / UTM zone 34N,1939,projected,4400,,4324,16034,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32435,WGS 72BE / UTM zone 35N,1941,projected,4400,,4324,16035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32436,WGS 72BE / UTM zone 36N,1943,projected,4400,,4324,16036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32437,WGS 72BE / UTM zone 37N,1945,projected,4400,,4324,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32438,WGS 72BE / UTM zone 38N,1947,projected,4400,,4324,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32439,WGS 72BE / UTM zone 39N,1949,projected,4400,,4324,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32440,WGS 72BE / UTM zone 40N,1951,projected,4400,,4324,16040,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32441,WGS 72BE / UTM zone 41N,1953,projected,4400,,4324,16041,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32442,WGS 72BE / UTM zone 42N,1955,projected,4400,,4324,16042,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32443,WGS 72BE / UTM zone 43N,1957,projected,4400,,4324,16043,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32444,WGS 72BE / UTM zone 44N,1959,projected,4400,,4324,16044,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32445,WGS 72BE / UTM zone 45N,1961,projected,4400,,4324,16045,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32446,WGS 72BE / UTM zone 46N,1963,projected,4400,,4324,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32447,WGS 72BE / UTM zone 47N,1965,projected,4400,,4324,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32448,WGS 72BE / UTM zone 48N,1993,projected,4400,,4324,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32449,WGS 72BE / UTM zone 49N,1994,projected,4400,,4324,16049,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32450,WGS 72BE / UTM zone 50N,1971,projected,4400,,4324,16050,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32451,WGS 72BE / UTM zone 51N,1973,projected,4400,,4324,16051,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32452,WGS 72BE / UTM zone 52N,1975,projected,4400,,4324,16052,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32453,WGS 72BE / UTM zone 53N,1977,projected,4400,,4324,16053,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32454,WGS 72BE / UTM zone 54N,1979,projected,4400,,4324,16054,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32455,WGS 72BE / UTM zone 55N,1981,projected,4400,,4324,16055,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32456,WGS 72BE / UTM zone 56N,1983,projected,4400,,4324,16056,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32457,WGS 72BE / UTM zone 57N,1985,projected,4400,,4324,16057,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32458,WGS 72BE / UTM zone 58N,1987,projected,4400,,4324,16058,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32459,WGS 72BE / UTM zone 59N,1989,projected,4400,,4324,16059,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32460,WGS 72BE / UTM zone 60N,1991,projected,4400,,4324,16060,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32501,WGS 72BE / UTM zone 1S,1874,projected,4400,,4324,16101,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32502,WGS 72BE / UTM zone 2S,1876,projected,4400,,4324,16102,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32503,WGS 72BE / UTM zone 3S,1878,projected,4400,,4324,16103,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32504,WGS 72BE / UTM zone 4S,1880,projected,4400,,4324,16104,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32505,WGS 72BE / UTM zone 5S,1882,projected,4400,,4324,16105,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32506,WGS 72BE / UTM zone 6S,1884,projected,4400,,4324,16106,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32507,WGS 72BE / UTM zone 7S,1886,projected,4400,,4324,16107,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32508,WGS 72BE / UTM zone 8S,1888,projected,4400,,4324,16108,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32509,WGS 72BE / UTM zone 9S,1890,projected,4400,,4324,16109,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32510,WGS 72BE / UTM zone 10S,1892,projected,4400,,4324,16110,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32511,WGS 72BE / UTM zone 11S,1894,projected,4400,,4324,16111,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32512,WGS 72BE / UTM zone 12S,1896,projected,4400,,4324,16112,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32513,WGS 72BE / UTM zone 13S,1898,projected,4400,,4324,16113,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32514,WGS 72BE / UTM zone 14S,1900,projected,4400,,4324,16114,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32515,WGS 72BE / UTM zone 15S,1902,projected,4400,,4324,16115,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32516,WGS 72BE / UTM zone 16S,1904,projected,4400,,4324,16116,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32517,WGS 72BE / UTM zone 17S,1906,projected,4400,,4324,16117,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32518,WGS 72BE / UTM zone 18S,1908,projected,4400,,4324,16118,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32519,WGS 72BE / UTM zone 19S,1910,projected,4400,,4324,16119,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32520,WGS 72BE / UTM zone 20S,1912,projected,4400,,4324,16120,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32521,WGS 72BE / UTM zone 21S,1914,projected,4400,,4324,16121,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32522,WGS 72BE / UTM zone 22S,1916,projected,4400,,4324,16122,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32523,WGS 72BE / UTM zone 23S,1918,projected,4400,,4324,16123,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32524,WGS 72BE / UTM zone 24S,1920,projected,4400,,4324,16124,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32525,WGS 72BE / UTM zone 25S,1922,projected,4400,,4324,16125,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32526,WGS 72BE / UTM zone 26S,1924,projected,4400,,4324,16126,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32527,WGS 72BE / UTM zone 27S,1926,projected,4400,,4324,16127,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32528,WGS 72BE / UTM zone 28S,1928,projected,4400,,4324,16128,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32529,WGS 72BE / UTM zone 29S,1930,projected,4400,,4324,16129,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32530,WGS 72BE / UTM zone 30S,1932,projected,4400,,4324,16130,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32531,WGS 72BE / UTM zone 31S,1934,projected,4400,,4324,16131,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32532,WGS 72BE / UTM zone 32S,1936,projected,4400,,4324,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32533,WGS 72BE / UTM zone 33S,1938,projected,4400,,4324,16133,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32534,WGS 72BE / UTM zone 34S,1940,projected,4400,,4324,16134,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32535,WGS 72BE / UTM zone 35S,1942,projected,4400,,4324,16135,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32536,WGS 72BE / UTM zone 36S,1944,projected,4400,,4324,16136,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32537,WGS 72BE / UTM zone 37S,1946,projected,4400,,4324,16137,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32538,WGS 72BE / UTM zone 38S,1948,projected,4400,,4324,16138,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32539,WGS 72BE / UTM zone 39S,1950,projected,4400,,4324,16139,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32540,WGS 72BE / UTM zone 40S,1952,projected,4400,,4324,16140,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32541,WGS 72BE / UTM zone 41S,1954,projected,4400,,4324,16141,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32542,WGS 72BE / UTM zone 42S,1956,projected,4400,,4324,16142,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32543,WGS 72BE / UTM zone 43S,1958,projected,4400,,4324,16143,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32544,WGS 72BE / UTM zone 44S,1960,projected,4400,,4324,16144,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32545,WGS 72BE / UTM zone 45S,1962,projected,4400,,4324,16145,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32546,WGS 72BE / UTM zone 46S,1964,projected,4400,,4324,16146,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32547,WGS 72BE / UTM zone 47S,1966,projected,4400,,4324,16147,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32548,WGS 72BE / UTM zone 48S,1968,projected,4400,,4324,16148,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32549,WGS 72BE / UTM zone 49S,1995,projected,4400,,4324,16149,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32550,WGS 72BE / UTM zone 50S,1972,projected,4400,,4324,16150,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32551,WGS 72BE / UTM zone 51S,1974,projected,4400,,4324,16151,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32552,WGS 72BE / UTM zone 52S,1976,projected,4400,,4324,16152,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32553,WGS 72BE / UTM zone 53S,1978,projected,4400,,4324,16153,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32554,WGS 72BE / UTM zone 54S,1980,projected,4400,,4324,16154,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32555,WGS 72BE / UTM zone 55S,1982,projected,4400,,4324,16155,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32556,WGS 72BE / UTM zone 56S,1984,projected,4400,,4324,16156,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32557,WGS 72BE / UTM zone 57S,1986,projected,4400,,4324,16157,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32558,WGS 72BE / UTM zone 58S,1988,projected,4400,,4324,16158,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32559,WGS 72BE / UTM zone 59S,1990,projected,4400,,4324,16159,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32560,WGS 72BE / UTM zone 60S,1992,projected,4400,,4324,16160,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32600,WGS 84 / UTM grid system (northern hemisphere),1998,projected,4400,,4326,16000,,,For strict use within zone boundaries,Use WGS 84 / UTM zone xx N (codes 32601-32660) for use outwith zone boundary or when easting is not prefixed by zone number.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+32601,WGS 84 / UTM zone 1N,2000,projected,4400,,4326,16001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32602,WGS 84 / UTM zone 2N,2002,projected,4400,,4326,16002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32603,WGS 84 / UTM zone 3N,2004,projected,4400,,4326,16003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32604,WGS 84 / UTM zone 4N,2006,projected,4400,,4326,16004,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32605,WGS 84 / UTM zone 5N,2008,projected,4400,,4326,16005,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32606,WGS 84 / UTM zone 6N,2010,projected,4400,,4326,16006,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32607,WGS 84 / UTM zone 7N,2012,projected,4400,,4326,16007,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32608,WGS 84 / UTM zone 8N,2014,projected,4400,,4326,16008,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32609,WGS 84 / UTM zone 9N,2016,projected,4400,,4326,16009,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32610,WGS 84 / UTM zone 10N,2018,projected,4400,,4326,16010,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32611,WGS 84 / UTM zone 11N,2020,projected,4400,,4326,16011,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32612,WGS 84 / UTM zone 12N,2022,projected,4400,,4326,16012,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32613,WGS 84 / UTM zone 13N,2024,projected,4400,,4326,16013,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32614,WGS 84 / UTM zone 14N,2026,projected,4400,,4326,16014,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32615,WGS 84 / UTM zone 15N,2028,projected,4400,,4326,16015,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32616,WGS 84 / UTM zone 16N,2030,projected,4400,,4326,16016,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32617,WGS 84 / UTM zone 17N,2032,projected,4400,,4326,16017,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32618,WGS 84 / UTM zone 18N,2034,projected,4400,,4326,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32619,WGS 84 / UTM zone 19N,2036,projected,4400,,4326,16019,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32620,WGS 84 / UTM zone 20N,2038,projected,4400,,4326,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32621,WGS 84 / UTM zone 21N,2040,projected,4400,,4326,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32622,WGS 84 / UTM zone 22N,2042,projected,4400,,4326,16022,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32623,WGS 84 / UTM zone 23N,2044,projected,4400,,4326,16023,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32624,WGS 84 / UTM zone 24N,2046,projected,4400,,4326,16024,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32625,WGS 84 / UTM zone 25N,2048,projected,4400,,4326,16025,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32626,WGS 84 / UTM zone 26N,2050,projected,4400,,4326,16026,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32627,WGS 84 / UTM zone 27N,2052,projected,4400,,4326,16027,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32628,WGS 84 / UTM zone 28N,2054,projected,4400,,4326,16028,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32629,WGS 84 / UTM zone 29N,2056,projected,4400,,4326,16029,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32630,WGS 84 / UTM zone 30N,2058,projected,4400,,4326,16030,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32631,WGS 84 / UTM zone 31N,2060,projected,4400,,4326,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32632,WGS 84 / UTM zone 32N,2062,projected,4400,,4326,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32633,WGS 84 / UTM zone 33N,2064,projected,4400,,4326,16033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32634,WGS 84 / UTM zone 34N,2066,projected,4400,,4326,16034,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32635,WGS 84 / UTM zone 35N,2068,projected,4400,,4326,16035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32636,WGS 84 / UTM zone 36N,2070,projected,4400,,4326,16036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32637,WGS 84 / UTM zone 37N,2072,projected,4400,,4326,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32638,WGS 84 / UTM zone 38N,2074,projected,4400,,4326,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32639,WGS 84 / UTM zone 39N,2076,projected,4400,,4326,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32640,WGS 84 / UTM zone 40N,2078,projected,4400,,4326,16040,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32641,WGS 84 / UTM zone 41N,2080,projected,4400,,4326,16041,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32642,WGS 84 / UTM zone 42N,2082,projected,4400,,4326,16042,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32643,WGS 84 / UTM zone 43N,2084,projected,4400,,4326,16043,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32644,WGS 84 / UTM zone 44N,2086,projected,4400,,4326,16044,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32645,WGS 84 / UTM zone 45N,2088,projected,4400,,4326,16045,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32646,WGS 84 / UTM zone 46N,2090,projected,4400,,4326,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32647,WGS 84 / UTM zone 47N,2092,projected,4400,,4326,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32648,WGS 84 / UTM zone 48N,2094,projected,4400,,4326,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32649,WGS 84 / UTM zone 49N,2096,projected,4400,,4326,16049,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32650,WGS 84 / UTM zone 50N,2098,projected,4400,,4326,16050,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32651,WGS 84 / UTM zone 51N,2100,projected,4400,,4326,16051,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32652,WGS 84 / UTM zone 52N,2102,projected,4400,,4326,16052,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32653,WGS 84 / UTM zone 53N,2104,projected,4400,,4326,16053,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32654,WGS 84 / UTM zone 54N,2106,projected,4400,,4326,16054,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32655,WGS 84 / UTM zone 55N,2108,projected,4400,,4326,16055,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32656,WGS 84 / UTM zone 56N,2110,projected,4400,,4326,16056,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32657,WGS 84 / UTM zone 57N,2112,projected,4400,,4326,16057,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32658,WGS 84 / UTM zone 58N,2114,projected,4400,,4326,16058,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32659,WGS 84 / UTM zone 59N,2116,projected,4400,,4326,16059,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32660,WGS 84 / UTM zone 60N,2118,projected,4400,,4326,16060,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32661,WGS 84 / UPS North,1996,projected,4400,,4326,16061,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-09-12 00:00:00,,1,0
+32662,WGS 84 / Plate Carree,1262,projected,4499,,4326,19968,,,Graticule coordinates expressed in simple Cartesian form.,Origin is at intersection of equator and Greenwich meridian. Note: this is not the same as plotting unrectified graticule coordinates on a computer display using the so-called pseudo Plate Carr�e method: here the grid units are metres.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+32700,WGS 84 / UTM grid system (southern hemisphere),1999,projected,4400,,4326,16100,,,For strict use within zone boundaries,Use WGS 84 / UTM zone xx S (codes 32701-32760) for use outwith zone boundary or when easting is not prefixed by zone number.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+32701,WGS 84 / UTM zone 1S,2001,projected,4400,,4326,16101,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32702,WGS 84 / UTM zone 2S,2003,projected,4400,,4326,16102,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32703,WGS 84 / UTM zone 3S,2005,projected,4400,,4326,16103,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32704,WGS 84 / UTM zone 4S,2007,projected,4400,,4326,16104,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32705,WGS 84 / UTM zone 5S,2009,projected,4400,,4326,16105,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32706,WGS 84 / UTM zone 6S,2011,projected,4400,,4326,16106,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32707,WGS 84 / UTM zone 7S,2013,projected,4400,,4326,16107,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32708,WGS 84 / UTM zone 8S,2015,projected,4400,,4326,16108,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32709,WGS 84 / UTM zone 9S,2017,projected,4400,,4326,16109,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32710,WGS 84 / UTM zone 10S,2019,projected,4400,,4326,16110,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32711,WGS 84 / UTM zone 11S,2021,projected,4400,,4326,16111,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32712,WGS 84 / UTM zone 12S,2023,projected,4400,,4326,16112,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32713,WGS 84 / UTM zone 13S,2025,projected,4400,,4326,16113,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32714,WGS 84 / UTM zone 14S,2027,projected,4400,,4326,16114,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32715,WGS 84 / UTM zone 15S,2029,projected,4400,,4326,16115,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32716,WGS 84 / UTM zone 16S,2031,projected,4400,,4326,16116,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32717,WGS 84 / UTM zone 17S,2033,projected,4400,,4326,16117,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32718,WGS 84 / UTM zone 18S,2035,projected,4400,,4326,16118,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32719,WGS 84 / UTM zone 19S,2037,projected,4400,,4326,16119,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32720,WGS 84 / UTM zone 20S,2039,projected,4400,,4326,16120,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32721,WGS 84 / UTM zone 21S,2041,projected,4400,,4326,16121,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32722,WGS 84 / UTM zone 22S,2043,projected,4400,,4326,16122,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32723,WGS 84 / UTM zone 23S,2045,projected,4400,,4326,16123,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32724,WGS 84 / UTM zone 24S,2047,projected,4400,,4326,16124,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32725,WGS 84 / UTM zone 25S,2049,projected,4400,,4326,16125,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32726,WGS 84 / UTM zone 26S,2051,projected,4400,,4326,16126,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32727,WGS 84 / UTM zone 27S,2053,projected,4400,,4326,16127,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32728,WGS 84 / UTM zone 28S,2055,projected,4400,,4326,16128,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32729,WGS 84 / UTM zone 29S,2057,projected,4400,,4326,16129,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32730,WGS 84 / UTM zone 30S,2059,projected,4400,,4326,16130,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32731,WGS 84 / UTM zone 31S,2061,projected,4400,,4326,16131,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32732,WGS 84 / UTM zone 32S,2063,projected,4400,,4326,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32733,WGS 84 / UTM zone 33S,2065,projected,4400,,4326,16133,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32734,WGS 84 / UTM zone 34S,2067,projected,4400,,4326,16134,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32735,WGS 84 / UTM zone 35S,2069,projected,4400,,4326,16135,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32736,WGS 84 / UTM zone 36S,2071,projected,4400,,4326,16136,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32737,WGS 84 / UTM zone 37S,2073,projected,4400,,4326,16137,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32738,WGS 84 / UTM zone 38S,2075,projected,4400,,4326,16138,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32739,WGS 84 / UTM zone 39S,2077,projected,4400,,4326,16139,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32740,WGS 84 / UTM zone 40S,2079,projected,4400,,4326,16140,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32741,WGS 84 / UTM zone 41S,2081,projected,4400,,4326,16141,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32742,WGS 84 / UTM zone 42S,2083,projected,4400,,4326,16142,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32743,WGS 84 / UTM zone 43S,2085,projected,4400,,4326,16143,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32744,WGS 84 / UTM zone 44S,2087,projected,4400,,4326,16144,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32745,WGS 84 / UTM zone 45S,2089,projected,4400,,4326,16145,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32746,WGS 84 / UTM zone 46S,2091,projected,4400,,4326,16146,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32747,WGS 84 / UTM zone 47S,2093,projected,4400,,4326,16147,,,Large and medium scale topographic mapping and engineering survey.Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32748,WGS 84 / UTM zone 48S,2095,projected,4400,,4326,16148,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32749,WGS 84 / UTM zone 49S,2097,projected,4400,,4326,16149,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32750,WGS 84 / UTM zone 50S,2099,projected,4400,,4326,16150,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32751,WGS 84 / UTM zone 51S,2101,projected,4400,,4326,16151,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32752,WGS 84 / UTM zone 52S,2103,projected,4400,,4326,16152,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32753,WGS 84 / UTM zone 53S,2105,projected,4400,,4326,16153,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32754,WGS 84 / UTM zone 54S,2107,projected,4400,,4326,16154,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32755,WGS 84 / UTM zone 55S,2109,projected,4400,,4326,16155,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32756,WGS 84 / UTM zone 56S,2111,projected,4400,,4326,16156,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32757,WGS 84 / UTM zone 57S,2113,projected,4400,,4326,16157,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32758,WGS 84 / UTM zone 58S,2115,projected,4400,,4326,16158,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32759,WGS 84 / UTM zone 59S,2117,projected,4400,,4326,16159,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32760,WGS 84 / UTM zone 60S,2119,projected,4400,,4326,16160,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32761,WGS 84 / UPS South,1997,projected,4400,,4326,16161,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-09-12 00:00:00,,1,0
+32766,WGS 84 / TM 36 SE,1726,projected,4400,,4326,16636,,,Used for oil exploration by BP Mozambique for Offshore Zambezi block oil exploration.,,BP Mozambique.,EPSG,1998-11-11 00:00:00,,1,0
diff --git a/src/tiff/csv/coordinate_system.csv b/src/tiff/csv/coordinate_system.csv
new file mode 100644
index 0000000..bd6c254
--- /dev/null
+++ b/src/tiff/csv/coordinate_system.csv
@@ -0,0 +1,38 @@
+"COORD_SYS_CODE","COORD_SYS_NAME","COORD_SYS_TYPE","DIMENSION","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+4400,"Cartesian 2D CS. Axes: easting, northing (E,N). Orientations: east, north. UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4401,"Cartesian 2D CS. Axes: easting, northing (E,N). Orientations: east, north. UoM: chBnB.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4402,"Cartesian 2D CS. Axes: easting, northing (E,N). Orientations: east, north. UoM: chSe.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4403,"Cartesian 2D CS. Axes: easting, northing (E,N). Orientations: east, north. UoM: ftCla.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4404,"Cartesian 2D CS. Axes: easting, northing (E,N). Orientations: east, north. UoM: ftGC.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4405,"Cartesian 2D CS. Axes: easting, northing (E,N). Orientations: east, north. UoM: ftSe.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4406,"Cartesian 2D CS. Axes: easting, northing (E,N). Orientations: east, north. UoM: km.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4407,"Cartesian 2D CS. Axes: easting, northing (E,N). Orientations: east, north. UoM: lkCla.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4408,"Cartesian 2D CS. Axes: easting, northing (E,N). Orientations: east, north. UoM: ydInd.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4409,"Cartesian 2D CS. Axes: easting, northing (E,N). Orientations: east, north. UoM: ydSe.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4495,"Cartesian 2D CS. Axes: easting, northing (X,Y). Orientations: east, north. UoM: ft.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-11-06 00:00:00,,0
+4496,"Cartesian 2D CS. Axes: easting, northing [E(X),N(Y)]. Orientations: east, north. UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4497,"Cartesian 2D CS. Axes: easting, northing (X,Y). Orientations: east, north. UoM: ftUS.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4498,"Cartesian 2D CS. Axes: easting, northing (Y,X). Orientations: east, north. UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4499,"Cartesian 2D CS. Axes: easting, northing (X,Y). Orientations: east, north. UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4500,"Cartesian 2D CS. Axes: northing, easting (N,E). Orientations: north, east. UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4501,"Cartesian 2D CS. Axes: northing, westing (N,E). Orientations: north, west. UoM: m.",Cartesian,2,Used in Danish projected coordinate reference systems. Note that second axis has abbreviation E but is positive west.,EPSG,EPSG,2002-01-26 00:00:00,,0
+4530,"Cartesian 2D CS. Axes: northing, easting (X,Y). Orientations: north, east. UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4531,"Cartesian 2D CS. Axes: northing, easting (x,y). Orientations: north, east. UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4532,"Cartesian 2D CS. Axes: northing, easting (Y,X). Orientations: north, east. UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+6401,"Ellipsoidal 3D CS. Axes: latitude, longitude, ellipsoidal height. Orientations: east, north, up. UoM: DMSH,metres.",ellipsoidal,3,Used in geographic 3D coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6402,"Ellipsoidal 2D CS. Axes: latitude, longitude. Orientations: east, north. UoM: DMSH.",ellipsoidal,2,Used in geographic 2D coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6403,"Ellipsoidal 2D CS. Axes: latitude, longitude. Orientations: east, north. UoM: grads.",ellipsoidal,2,Used in geographic 2D coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6404,"Spherical 3D CS. Axes: latitude, longitude, radius. Orientations: north, east, up. UoM: degrees, degrees, metres.",spherical,3,Used in geocentric 3D coordinate reference systems.,Open GIS Consortium,EPSG,2002-06-22 00:00:00,2002.30,0
+6497,Gravity-related CS. Axis: height (H). Orientation: up. UoM: ftUS.,gravity-related,1,Used in vertical coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6498,Gravity-related CS. Axis: depth (D). Orientation: down. UoM: m.,gravity-related,1,Used in vertical coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6499,Gravity-related CS. Axis: height (H). Orientation: up. UoM: m.,gravity-related,1,Used in vertical coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6500,"Earth centred, earth fixed, righthanded 3D coordinate system, consisting of 3 orthogonal axes with X and Y axes in the equatorial plane, positive Z-axis parallel to mean earth rotation axis and pointing towards North Pole. UoM: m.",Cartesian,3,"Cartesian 3D CS, used in geocentric coordinate reference systems.",EPSG,EPSG,2001-01-19 00:00:00,,0
+6501,"Cartesian 2D CS. Axes: southing, westing (X,Y). Orientations: south, west. UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+6502,"Cartesian 2D CS. Axes: westing, southing (Y,X). Orientations: west, south. UoM: GLM.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+6503,"Cartesian 2D CS. Axes: westing, southing (Y,X). Orientations: west, south. UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+6504,"Cartesian 2D CS. Axes: plant N, Plant E (n,e). Orientations: northwest, northeast. UoM: m.",Cartesian,2,Used in engineering coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6505,"Cartesian 2D CS. Axes: 1st local axis, 2nd local axis (n,e). Orientations: northwest, northeast. UoM: m.",Cartesian,2,Used in engineering coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6506,"Cartesian 2D CS. Axes: 1st local axis, 2nd local axis (I,J). Orientations: ese/nne. UoM: 165 x 330 ftUS.",Cartesian,2,Used in engineering coordinate reference systems for seismic bin grids.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6507,"Cartesian 2D CS. Axes: 1st local axis, 2nd local axis (X,Y). Orientations: north, west. UoM: m.",Cartesian,2,Used in engineering coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6508,"Cartesian 2D CS. Axes: bin grid J, bin grid I (J,I). Orientations: nne/ese. UoM: 12.5 x 25m.",Cartesian,2,Used in engineering coordinate reference systems for seismic bin grids.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6509,"Cartesian 2D CS. Axes: southing, westing (P,M). Orientations: south, west. UoM: m.",Cartesian,2,Used in old projected coordinate reference systems in Portugal.,EPSG,EPSG,2002-07-13 00:00:00,,0
diff --git a/src/tiff/csv/datum.csv b/src/tiff/csv/datum.csv
new file mode 100644
index 0000000..de0f951
--- /dev/null
+++ b/src/tiff/csv/datum.csv
@@ -0,0 +1,332 @@
+"DATUM_CODE","DATUM_NAME","DATUM_TYPE","ORIGIN_DESCRIPTION","REALIZATION_EPOCH","ELLIPSOID_CODE","PRIME_MERIDIAN_CODE","AREA_OF_USE_CODE","DATUM_SCOPE","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+5100,Mean Sea Level,vertical,,,,,1262,Hydrography.,"msl has geographic and temporal components. Users are advised to not use this generic vertical datum but to define specific instances of msl based on knowledge of these components; for instance ""msl at xxx during 19yy"".",,EPSG,1996-04-12 00:00:00,,0
+5101,Ordnance Datum Newlyn,vertical,,,,,1264,"Topographic mapping, geodesy.",,,EPSG,1996-10-18 00:00:00,,0
+5102,National Geodetic Vertical Datum 1929,vertical,26 tide gauges in the US and Canada.,1929,,,1323,"Topographic mapping, geodesy.",,,EPSG,1996-09-12 00:00:00,,0
+5103,North American Vertical Datum 1988,vertical,"Father's Point, Rimouski, Quebec.",1988,,,1325,"Topographic mapping, geodesy.",,,EPSG,1996-09-12 00:00:00,,0
+5104,Yellow Sea 1956,vertical,2 years tide readings at Qingdao.,1956,,,1067,"Topographic mapping, geodesy.",Superseded by Yellow Sea 1985 datum.,,EPSG,2002-06-22 00:00:00,2002.16,0
+5105,Baltic Sea,vertical,Average water level at Kronshtadt,,,,1284,"Topographic mapping, geodesy.",,,EPSG,1996-09-12 00:00:00,,0
+5106,Caspian Sea,vertical,Defined as -28.0m Baltic datum,,,,1291,Hydrography.,,,EPSG,1996-09-12 00:00:00,,0
+5107,Nivellement general de la France,vertical,Mean sea level at Marseille,,,,1326,"Topographic mapping, geodesy.",The CNIG states that NGF is a general term applying to all vertical network readjustments of France and recommends more specific terminology. See codes 5118-5120.,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994.",EPSG,1996-09-12 00:00:00,,1
+5109,Normaal Amsterdams Peil,vertical,,,,,1172,"Topographic mapping, geodesy, hydrography.",,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,1996-09-12 00:00:00,,0
+5110,Oostende,vertical,Mean low water during 1958,1958,,,1044,"Topographic mapping, geodesy.",,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,1996-09-12 00:00:00,,0
+5111,Australian Height Datum,vertical,MSL 1966-68 at 30 gauges around coast.,1968,,,1281,"Topographic mapping, geodesy.",,http://www.auslig.gov.au/geodesy,EPSG,1996-09-12 00:00:00,,0
+5112,Australian Height Datum (Tasmania),vertical,MSL 1972 at Hobart and Burnie.,1972,,,1282,"Topographic mapping, geodesy.",,,EPSG,1996-09-12 00:00:00,,0
+5113,Sea Level,vertical,,,,,1262,Hydrography.,An unspecified local vertical datum not recommended for use.,,EPSG,1996-09-12 00:00:00,,0
+5114,Canadian Vertical Datum of 1928,vertical,,1928,,,1289,"Topographic mapping, geodesy.",,,EPSG,1996-12-12 00:00:00,,0
+5115,Piraeus Harbour 1986,vertical,MSL determined during 1986.,1986,,,1106,"Topographic mapping, geodesy.",,Geodesy Department; Public Pertoleum Corporation of Greece,EPSG,1997-06-16 00:00:00,,0
+5116,Helsinki 1960,vertical,MSL at Helsinki during 1960.,1960,,,1095,"Topographic mapping, geodesy.",,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,0
+5117,Rikets hoghtsystem 1970,vertical,,1970,,,1225,"Topographic mapping, geodesy.",,National Land Survey of Sweden,EPSG,1997-11-13 00:00:00,,0
+5118,Nivellement general de la France - Lalle,vertical,Mean sea level at Marseille.,,,,1326,"Geodesy, topographic mapping, engineering survey.",,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994.",EPSG,1997-11-13 00:00:00,2001.47,0
+5119,Nivellement general de la France - IGN69,vertical,Mean sea level at Marseille.,1969,,,1326,"Geodesy, topographic mapping, engineering survey.",,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994.",EPSG,1997-11-13 00:00:00,2001.47,0
+5120,Nivellement general de la France - IGN78,vertical,,1978,,,1327,"Geodesy, topographic mapping, engineering survey.",,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994.",EPSG,1997-11-13 00:00:00,2001.47,0
+5121,Maputo,vertical,Mean sea level at Maputo.,,,,1167,Topographic mapping.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,0
+5122,Japanese Standard Levelling Datum 1949,vertical,24.4140 metres above mean sea level Tokyo Bay.,1949,,,1129,"Topographic mapping, geodesy.",,Ministry of Construction; Japan. http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,2002.08,0
+5123,PDO Height Datum 1993,vertical,,1993,,,1183,Oil industry mapping.,Misclosure between Muscat and Salalah less than .5 meters with differences from of up to 5 meters from old Fahud Datum. The PHD93 adjustment was initially known as the Spine. Supercedes Fahud Vertical Datum (Code 5124) from 1993.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,0
+5124,Fahud Height Datum,vertical,,,,,1183,Oil industry mapping.,Superceded by PHD93 Datum (Code 5123) in 1993. Based on reciprocal trigonometric heighting based on single MSL determination at Mina Al Fahal.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,0
+5125,Ha Tien 1960,vertical,,1960,,,1302,"Topographic mapping, geodesy.",In Vietnam replaced by Hon Dau in 1992.,,EPSG,1999-10-20 00:00:00,,0
+5126,Hon Dau 1992,vertical,,1992,,,1252,"Topographic mapping, geodesy.",Supersedes Ha Tien in Vietnam.,,EPSG,1999-10-20 00:00:00,,0
+5127,Landesnivellement 1902,vertical,Origin at Repere Pierre du Niton (RPN) 373.6 metres above msl derived at Marseille.,1902,,,1286,"Topographic mapping, geodesy.",,Bundesamt f�r Landestopographie,EPSG,1999-10-20 00:00:00,,0
+5128,Landeshohennetz 1995,vertical,Origin at Repere Pierre du Niton (RPN) 373.6 metres above msl derived at Marseille.,1995,,,1286,"Geodesy, cadastre, topographic mapping, engineering survey.",,Bundesamt f�r Landestopographie,EPSG,1999-10-20 00:00:00,,0
+5129,European Vertical Reference Frame 2000,vertical,Geopotential number at Normaal Amsterdams Peil is zero.,2000,,,1299,Geodesy.,Realised by geopotential numbers and normal heights of the United European Levelling Network.,,EPSG,2000-10-19 00:00:00,,0
+5130,Malin Head,vertical,Mean sea level between January 1960 and December 1969.,1970,,,1305,Topographic mapping,,Ordnance Survey Ireland,EPSG,2001-11-06 00:00:00,,0
+5131,Belfast,vertical,"Mean sea level between 1951 and 1956 at Clarendon Dock, Belfast.",1957,,,2530,Large scale topographic mapping,,Ordnance Survey Northern Ireland,EPSG,2001-11-06 00:00:00,,0
+5132,Dansk Normal Nul,vertical,,,,,1080,Topographic mapping and engineering survey,,Kort & Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,0
+5133,AIOC 1995,vertical,Average level of Caspian Sea at the Oil Rocks tide gauge June-September 1995.,1995,,,2592,Oil industry mapping.,AIOC 1995 datum is 1.7m above Caspian datum and 26.3m below Baltic datum.,BP,EPSG,2002-02-12 00:00:00,,0
+5134,Black Sea,vertical,,,,,1102,Hydrographic surveying and since break-up of Former Soviet Union also topographic mapping.,Black Sea datum is 0.4m below Baltic datum.,BP,EPSG,2002-02-12 00:00:00,,0
+5135,Hong Kong Principal Datum,vertical,"1.23m below the mean of 19 years (1965-83) observations of tide levels at North Point, Victoria Harbour.",1980,,,1118,"Geodesy, engineering survey, cadastre.",,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,0
+5136,Hong Kong Chart Datum,vertical,Approximates to Lowest Astronomic Tide level (LAT).,,,,1118,Hydrographic survey and charting.,Chart datum is 0.15 metres below Hong Kong Principal Datum (code 5135) and 1.38m below MSL at Quarry Bay.,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,0
+5137,Yellow Sea 1985,vertical,20 years tide readings at Qingdao.,1985,,,1067,"Topographic mapping, geodesy.",Supersedes Yellow Sea 1956 datum.,Guangdong Province Land Resource Information Centre,EPSG,2002-06-22 00:00:00,,0
+6001,Not specified (based on Airy 1830 ellipsoid),geodetic,,,7001,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6002,Not specified (based on Airy Modified 1849 ellipsoid),geodetic,,,7002,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6003,Not specified (based on Australian National Spheroid),geodetic,,,7003,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6004,Not specified (based on Bessel 1841 ellipsoid),geodetic,,,7004,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6005,Not specified (based on Bessel Modified ellipsoid),geodetic,,,7005,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6006,Not specified (based on Bessel Namibia ellipsoid),geodetic,,,7046,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2001-01-21 00:00:00,96.08 2000.42 2001.15,0
+6007,Not specified (based on Clarke 1858 ellipsoid),geodetic,,,7007,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6008,Not specified (based on Clarke 1866 ellipsoid),geodetic,,,7008,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6009,Not specified (based on Clarke 1866 Michigan ellipsoid),geodetic,,,7009,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6010,Not specified (based on Clarke 1880 (Benoit) ellipsoid),geodetic,,,7010,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6011,Not specified (based on Clarke 1880 (IGN) ellipsoid),geodetic,,,7011,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6012,Not specified (based on Clarke 1880 (RGS) ellipsoid),geodetic,,,7012,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6013,Not specified (based on Clarke 1880 (Arc) ellipsoid),geodetic,,,7013,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6014,Not specified (based on Clarke 1880 (SGA 1922) ellipsoid),geodetic,,,7014,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6015,Not specified (based on Everest 1830 (1937 Adjustment) ellipsoid),geodetic,,,7015,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6016,Not specified (based on Everest 1830 (1967 Definition) ellipsoid),geodetic,,,7016,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6018,Not specified (based on Everest 1830 Modified ellipsoid),geodetic,,,7018,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6019,Not specified (based on GRS 1980 ellipsoid),geodetic,,,7019,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6020,Not specified (based on Helmert 1906 ellipsoid),geodetic,,,7020,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6021,Not specified (based on Indonesian National Spheroid),geodetic,,,7021,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6022,Not specified (based on International 1924 ellipsoid),geodetic,,,7022,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6024,Not specified (based on Krassowsky 1940 ellipsoid),geodetic,,,7024,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6025,Not specified (based on NWL 9D ellipsoid),geodetic,,,7025,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6027,Not specified (based on Plessis 1817 ellipsoid),geodetic,,,7027,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6028,Not specified (based on Struve 1860 ellipsoid),geodetic,,,7028,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6029,Not specified (based on War Office ellipsoid),geodetic,,,7029,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6030,Not specified (based on WGS 84 ellipsoid),geodetic,,,7030,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6031,Not specified (based on GEM 10C ellipsoid),geodetic,,,7031,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6032,Not specified (based on OSU86F ellipsoid),geodetic,,,7032,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6033,Not specified (based on OSU91A ellipsoid),geodetic,,,7033,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6034,Not specified (based on Clarke 1880 ellipsoid),geodetic,,,7034,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08 2000.42,0
+6035,Not specified (based on Authalic Sphere),geodetic,,,7035,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown. Deprecated and superseded by 6047.,EPSG,EPSG,2001-06-05 00:00:00,96.08 2000.42,1
+6036,Not specified (based on GRS 1967 ellipsoid),geodetic,,,7036,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0
+6041,Not specified (based on Average Terrestrial System 1977 ellipsoid),geodetic,,,7041,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0
+6042,Not specified (based on Everest (1830 Definition) ellipsoid),geodetic,,,7042,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0
+6043,Not specified (based on WGS 72 ellipsoid),geodetic,,,7043,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0
+6044,Not specified (based on Everest 1830 (1962 Definition) ellipsoid),geodetic,,,7044,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0
+6045,Not specified (based on Everest 1830 (1975 Definition) ellipsoid),geodetic,,,7045,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0
+6047,Not specified (based on GRS 1980 Authalic Sphere),geodetic,,,7047,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2001-06-25 00:00:00,2001.19,0
+6120,Greek,geodetic,Fundamental point: Athens Observatory; latitude 37 deg 58 min 20.132 sec N; longitude 23 deg 42 min 58.815 sec E of Greenwich,,7004,8901,1106,Topographic mapping.,See geodetic datum alias 6404. Used as basis of topographic mapping based on Hatt projection.,Topography Department; National Technical University of Athens,EPSG,1997-06-16 00:00:00,,0
+6121,Greek Geodetic Reference System 1987,geodetic,Fundamental point: Dionysos; latitude 38 deg 04 min 33.8 sec N; longitude 23 deg 55 min 51.0 sec E of Greenwich; geoid height 7.0 m.,1987,7019,8901,1106,Topographic mapping.,Superseded (old) Greek datum. Oil industry work based on ED50.,L. Portokalakis; Public Petroleum Corporation of Greece,EPSG,1997-06-16 00:00:00,,0
+6122,Average Terrestrial System 1977,geodetic,,1977,7041,8901,1283,Topographic mapping.,In use from 1979. To be phased out in late 1990's.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1997-07-02 00:00:00,,0
+6123,Kartasto Koordinaati Jarjestelma 1966,geodetic,Adjustment with fundamental point SF31 based on ED50 transformed to best fit the older VVJ adjustment.,1966,7022,8901,1095,"Geodesy, cadastre, topographic mapping, engineering survey.",Adopted in 1970.,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,0
+6124,Rikets koordinatsystem 1990,geodetic,,1982,7004,8901,1225,"Geodesy, cadastre, topographic mapping, engineering survey.",Supersedes RT38 adjustment (datum code 6308),National Land Survey of Sweden,EPSG,1997-11-13 00:00:00,,0
+6125,Samboja,geodetic,Original origin station P2 Exc now destroyed. Extensions recomputed using Toran station T9 as origin.,,7004,8901,1328,Topographic mapping.,,Total Indonesia.,EPSG,1997-11-13 00:00:00,,1
+6126,Lithuania 1994 (ETRS89),geodetic,Densification from 4 ETRS89 points.,1994,7019,8901,1145,"Topographic mapping, geodesy.",Densification of ETRS89 during the 1992 Baltic campaign.,HNIT-Baltic GeoInfoServisas,EPSG,1998-03-12 00:00:00,,0
+6127,Tete,geodetic,Fundamental point: Tete.,,7008,8901,1167,Topographic mapping.,,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,0
+6128,Madzansua,geodetic,Fundamental point: Madzansua.,,7008,8901,1315,Topographic mapping.,Superseded by transformation to Tete datum (datum code 6127).,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,0
+6129,Observatario,geodetic,Fundamental point: Maputo observatory.,,7008,8901,1329,Topographic mapping.,Superseded by transformation to Tete datum (datum code 6127).,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,0
+6130,Moznet (ITRF94),geodetic,ITRF 1994 epoch 20,,7030,8901,1167,Topographic mapping.,,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,0
+6131,Indian 1960,geodetic,,,7015,8901,1302,Topographic mapping.,DMA adjustment of IndoChina part of the Indian 1954 network to better fit local geoid. Also known as Indian (DMA Reduced).,,EPSG,1998-11-11 00:00:00,,0
+6132,Final Datum 1958,geodetic,Fundamental point: Maniyur. Latitude: 31 deg 23 min 59.19 sec N; Longitude: 48 deg 32 min 31.38 sec E (of Greenwich).,,7012,8901,1300,Oil industry mapping.,Network included in Nahrwan 1967 adjustment.,IOEPC records,EPSG,1998-11-11 00:00:00,,0
+6133,Estonia 1992,geodetic,Densification from 4 ETRS89 points.,1992,7019,8901,1090,"Topographic mapping, geodesy.",Based on ETRS89 as established during the 1992 Baltic campaign. Superseded by Estonia 1997 adjustment (code 6180).,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,0
+6134,PDO Survey Datum 1993,geodetic,Adjustment best fitted to Fahud network.,1993,7012,8901,1183,Oil industry mapping.,Supersedes Fahud datum (code 6232). Maximum differences to Fahud adjustment are 20 metres.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,0
+6135,Old Hawaiian,geodetic,Fundamental Point: Oahu West Base Astro. Latitude: 21 deg 18 min 13.89 sec N; longitude 157 deg 50 min 55.79 sec W (of Greenwich),,7008,8901,1334,Topographic mapping.,Hawaiian Islands were never on NAD27 but rather on Old Hawaiian Datum. NADCON conversion program provides transformation from Old Hawaiian Datum to NAD83 (original 1986 realization) but making the transformation appear to user as if from NAD27.,http://www.ngs.noaa.gov/ (NADCON readme file) and t [...]
+6136,St. Lawrence Island,geodetic,,,7008,8901,1332,Topographic mapping.,Many Alaskan islands were never on NAD27 but rather on independent datums. NADCON conversion program provides transformation from St. Lawrence Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.,http://www.ngs.noaa.gov/ (NADCON readme file),EPSG,1999-05-24 00:00:00,,0
+6137,St. Paul Island,geodetic,,,7008,8901,1333,Topographic mapping.,Many Alaskan islands were never on NAD27 but rather on independent datums. NADCON conversion program provides transformation from St. Paul Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.,http://www.ngs.noaa.gov/ (NADCON readme file),EPSG,1999-05-24 00:00:00,,0
+6138,St. George Island,geodetic,,,7008,8901,1331,Topographic mapping.,Many Alaskan islands were never on NAD27 but rather on independent datums. NADCON conversion program provides transformation from St. George Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.,http://www.ngs.noaa.gov/ (NADCON readme file),EPSG,1999-05-24 00:00:00,,0
+6139,Puerto Rico,geodetic,,,7008,8901,1335,Topographic mapping.,NADCON conversion program provides transformation from Puerto Rico Datum to NAD83 (original 1986 realization) but making the transformation appear to user as if from NAD27.,Ordnance Survey of Great Britain and http://www.ngs.noaa.gov/ (NADCON readme file).,EPSG,1999-05-24 00:00:00,,0
+6140,NAD83 Canadian Spatial Reference System,geodetic,,1998,7019,8901,1336,Geodesy.,Supersedes ATS77 from 1999 in New Brunswick.,Service New Brunswick Land and Information Standards Manual,EPSG,1999-10-20 00:00:00,,0
+6141,Israel,geodetic,Fundamental Point: Latitude: 31 deg 44 min 03.817 sec N; Longitude: 35 deg 12 min 16.261 sec E (of Greenwich).,,7019,8901,2603,Topographic mapping.,,Survey of Israel.,EPSG,2002-06-22 00:00:00,2002.34,0
+6142,Locodjo 1965,geodetic,Fundamental Point: T5 Banco. Latitude: 5 deg 18 min 50.5 sec N; Longitude: 4 deg 02 min 05.1 sec W (of Greenwich).,1965,7012,8901,1075,Topographic mapping.,,IGN Paris.,EPSG,1999-10-20 00:00:00,,0
+6143,Abidjan 1987,geodetic,Fundamental Point: Abidjan I. Latitude: 5 deg 18 min 51.01 sec N; Longitude: 4 deg 02 min 06.04 sec W (of Greenwich).,1987,7012,8901,1075,Topographic mapping.,,IGN Paris.,EPSG,1999-10-20 00:00:00,,0
+6144,Kalianpur 1937,geodetic,Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,1937,7015,8901,1308,Topographic mapping.,Supersedes 1880 adjustment except for topographic mapping. Superseded in Pakistan by 1962 metrication conversion and in India by 1975 metrication conversion.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,1999-10-20 00:00:00,,0
+6145,Kalianpur 1962,geodetic,Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,1962,7044,8901,1184,Topographic mapping.,1937 adjustment rescaled by ratio metric conversions of Indian foot (1937) to Indian foot (1962).,,EPSG,1999-10-20 00:00:00,,0
+6146,Kalianpur 1975,geodetic,Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,1975,7045,8901,1121,Topographic mapping.,1937 adjustment rescaled by ratio metric conversions of Indian foot (1937) to Indian foot (1975).,,EPSG,1999-10-20 00:00:00,,0
+6147,Hanoi 1972,geodetic,,1972,7024,8901,1252,"Geodesy, cadastre, topographic mapping, engineering survey.",,PetroVietnam,EPSG,1999-10-20 00:00:00,,0
+6148,Hartebeesthoek94,geodetic,Coincident with ITRF91 (1994.0) at Hartebeesthoek astronomical observatory near Pretoria.,1994,7030,8901,1215,"Geodesy, cadastre, topographic mapping, engineering survey.",Supersedes Cape datum (code 6222).,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-01-06 00:00:00,99.96,0
+6149,CH1903,geodetic,Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min 8.660 sec N; Longitude: 7 deg 26 min 22.500 sec E (of Greenwich).,1903,7004,8901,1286,Topographic mapping.,,Bundesamt f�r Landestopographie,EPSG,1999-10-20 00:00:00,,0
+6150,CH1903+,geodetic,Fundamental Point: Zimmerwald observatory.,,7004,8901,1286,"Geodesy, topographic mapping.",,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,2001-11-06 00:00:00,2001.52,0
+6151,Swiss Terrestrial Reference Frame 1995,geodetic,ETRF89 at 1993.0,1995,7019,8901,1286,"Geodesy, cadastre, topographic mapping, engineering survey.",,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,1999-10-20 00:00:00,,0
+6152,NAD83 (High Accuracy Regional Network),geodetic,,,7019,8901,1337,Geodesy.,,National Geodetic Survey,EPSG,1999-10-20 00:00:00,,0
+6153,Rassadiran,geodetic,Fundamental Point: Total1. Latitude: 27 deg 31 min 07.784 sec N; Longitude: 52 deg 36 min 12.741 sec E (of Greenwich).,,7022,8901,1338,Oil industry mapping.,,Total-Fina,EPSG,1999-11-20 00:00:00,,0
+6154,European Datum 1950(1977),geodetic,Extension of ED50 over Iran.,1977,7022,8901,1123,Topographic mapping.,Sometimes referred to as ED50-ED77.,National Cartographic Centre of Iran,EPSG,1999-11-20 00:00:00,,0
+6155,Dabola 1981,geodetic,,1981,7011,8901,1112,Topographic mapping.,,IGN Paris,EPSG,1999-12-09 00:00:00,,0
+6156,Jednotne Trigonometricke Site Katastralni,geodetic,"Modification of Austrian MGI datum, code 6312.",,7004,8901,1306,"Geodesy, cadastre, topographic mapping, engineering survey.",S-JTSK = System of the Unified Trigonometrical Cadastral Network.,Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2001-11-06 00:00:00,2001.26 2001.51,0
+6157,Mount Dillon,geodetic,Fundamental Point: Mount Dillon triangulation station. Latitude: 11 deg 15 min 07.843 sec N; Longitude: 60 deg 41 min 09.632 sec W (of Greenwich).,,7007,8901,1322,Topographic mapping.,,University of the West Indies Geodetic Services.,EPSG,2000-03-07 00:00:00,,0
+6158,Naparima 1955,geodetic,Fundamental Point: Naparima. Latitude: 10 deg 16 min 44.860 sec N; Longitude: 61 deg 27 min 34.620 sec W (of Greenwich).,1955,7022,8901,1339,Topographic mapping.,Naparima 1972 is an extension of the Naparima 1955 network of Trinidad to include Tobago.,Ordnance Survey International.,EPSG,2000-03-07 00:00:00,,0
+6159,European Libyan Datum 1979,geodetic,,1979,7022,8901,1143,Topographic mapping.,,Brown and Root,EPSG,2000-03-07 00:00:00,,0
+6160,Chos Malal 1914,geodetic,Chos Malal police station.,1914,7022,8901,1292,Oil industry mapping.,Also known as Quini-Huao. Superseded by Campo Inchauspe (code 6221).,Various oil company records.,EPSG,2000-03-07 00:00:00,,0
+6161,Pampa del Castillo,geodetic,,,7022,8901,1265,Oil industry mapping.,Used in Comodoro Rivadavia area. Superseded by Campo Inchauspe (code 6221).,Various oil company records.,EPSG,2000-03-07 00:00:00,,0
+6162,Korean Datum 1985,geodetic,Fundamental point: Suwon; latitude 37 deg 16 min 31.9034 sec N; longitude 127 deg 03 min 05.1451 sec E of Greenwich.,1985,7004,8901,1135,Topographic mapping.,,Clifford J. Mugnier; in Photogrammetric Engineering & Remote Sensing November 1999. http://www.asprs.org/resources.html,EPSG,2000-03-07 00:00:00,2001.28,0
+6163,Yemen National Geodetic Network 1996,geodetic,Sana'a IGN reference marker,1996,7030,8901,1257,Topographic mapping.,,IGN Paris,EPSG,2000-03-07 00:00:00,,0
+6164,South Yemen,geodetic,,,7024,8901,1340,Topographic mapping.,,IGN Paris,EPSG,2000-03-07 00:00:00,,0
+6165,Bissau,geodetic,,,7022,8901,1113,Topographic mapping.,,NIMA TR8350.2,EPSG,2000-03-07 00:00:00,,0
+6166,Korean Datum 1995,geodetic,,1995,7030,8901,1135,Topographic mapping.,,NIMA TR8350.2 ftp://164.214.2.65/pub/gg/tr8350.2/changes.pdf,EPSG,2000-05-08 00:00:00,,0
+6167,New Zealand Geodetic Datum 2000,geodetic,Based on ITRF96 epoch 2000.0,2000,7019,8901,1175,"Geodesy, cadastre, topographic mapping, engineering survey.",,Land Information New Zealand.,EPSG,2000-10-19 00:00:00,,0
+6168,Accra,geodetic,Fundamental Point: GCS Station 547. Latitude: 5 deg 23 min 43.3 sec N; Longitude: 0 deg 11 min 52.3 sec W (of Greenwich).,,7029,8901,1104,Topographic mapping.,Superseded in 1978 by Leigon datum (code 6250).,Ordnance Survey International,EPSG,2000-10-12 00:00:00,,0
+6169,American Samoa 1962,geodetic,,1962,7008,8901,1027,Topographic mapping.,,NIMA TR8350.2 revision of January 2000,EPSG,2000-10-19 00:00:00,,0
+6170,Sistema de Referencia Geocentrico para America del Sur,geodetic,ITRF94 epoch 1995.42.,1995,7019,8901,1342,Geodesy.,Realised by a frame of 58 stations observed in 1995 and adjusted in the ITRF94.,NIMA TR8350.2 revision of January 2000.,EPSG,2000-10-19 00:00:00,,0
+6171,Reseau Geodesique Francais 1993,geodetic,Coincident with ETRS89,1993,7019,8901,1096,Geodesy.,,TotalFinaElf,EPSG,2001-11-06 00:00:00,2001.51,0
+6172,Posiciones Geodesicas Argentinas,geodetic,,1994,7019,8901,1033,"Topographic mapping, geodesy.","Una red geod�sica de 127 puntos materializados
+en el terreno que definen el Sistema Geod�sico Nacional. [A geodetic network of 127 points defining the National Geodetic System.] Superseded by POSGAR98 (code 6190).",http://www.igm.gov.ar/posgar.html,EPSG,2000-10-19 00:00:00,,1
+6173,IRENET95,geodetic,ETRS89 stations in Ireland,1995,7019,8901,1305,Geodesy.,Densification of ETRS89,Ordnance Survey of Ireland,EPSG,2000-10-19 00:00:00,,0
+6174,Sierra Leone Colony 1924,geodetic,Fundamental Point: Kortright. Latitude: 8 deg 28 min 44.4 sec N; Longitude: 13 deg 13 min 03.81 sec W (of Greenwich).,1924,7029,8901,1342,"Topographic mapping, engineering survey.",,Ordnance Survey International.,EPSG,2001-06-05 00:00:00,,0
+6175,Sierra Leone 1968,geodetic,Fundamental Point: SLX2 Astro. Latitude: 8 deg 27 min 17.567 sec N; Longitude: 12 deg 49 min 40.186 sec W (of Greenwich).,1968,7012,8901,1209,"Topographic mapping, engineering survey.",Extension and readjustment with additional observations of 1960 network. Coordinates of 1960 stations change by less than 3 metres.,Ordnance Survey International.,EPSG,2001-06-05 00:00:00,,0
+6176,Australian Antarctic Datum 1998,geodetic,,1998,7019,8901,1278,Topographic mapping.,,Standards Australia,ISO 19127,2001-06-05 00:00:00,,0
+6178,Pulkovo 1942/83,geodetic,Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 18.550 sec N; Longitude: 30 deg 19 min 42.090 sec E (of Greenwich).,1983,7024,8901,1343,"Geodesy, cadastre, topographic mapping, engineering survey.",International adjustment of Uniforrm Astro-Geodetic Network of countries of central and eastern Europe.,Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+6179,Pulkovo 1942/58,geodetic,Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 18.550 sec N; Longitude: 30 deg 19 min 42.090 sec E (of Greenwich).,1958,7024,8901,1192,"Geodesy, cadastre, topographic mapping, engineering survey.",,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+6180,Estonia 1997,geodetic,Densification of ETRS89 during EUREF-ESTONIA97 campaign through transformation from ITRF96 epoch 1997.56.,1997,7019,8901,1090,"Geodesy, cadastre, topographic mapping, engineering survey.",Supersedes Estonia 1992 adjustment (code 6133).,Estonian National Land Board via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+6181,Luxembourg 1930,geodetic,Northern station of Habay-la-Neuve baseline in Belgium.,1930,7022,8901,1146,"Geodesy, cadastre, topographic mapping, engineering survey.",,Administration du Cadastre et de la Topographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+6182,Azores Occidental Islands 1939,geodetic,Fundamental Point: Observatario Meteorologico Flores.,1939,7022,8901,1344,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+6183,Azores Central Islands 1948,geodetic,Fundamental Point: Graciosa west base.,1948,7022,8901,1301,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2002-07-13 00:00:00,2002.25,0
+6184,Azores Oriental Islands 1940,geodetic,Fundamental Point: Forte de S�o Bras.,1940,7022,8901,1345,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+6185,Madeira 1936,geodetic,Fundamental Point: Madeira SE Base.,1936,7022,8901,1314,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1
+6188,OSNI 1952,geodetic,Position fixed to the coordinates from the 19th century Principle Triangulation of station Divis. Scale and orientation controlled by position of Principle Triangulation stations Knocklayd and Trostan.,1952,7001,8901,2530,Geodesy and topographic mapping.,Superseded by 1975 Mapping Adjustment.,Ordnance Survey of Northern Ireland.,EPSG,2001-11-06 00:00:00,,0
+6189,Red Geodesica Venezolana,geodetic,Realised by a frame of 67 stations observed in 1995 as a densification of the SIRGAS campaign and adjusted in the ITRF94.,2000,7019,8901,1251,Geodesy.,,Servicio Autonomo de Geografia y Cartografia Nacional.,EPSG,2001-06-11 00:00:00,,0
+6190,Posiciones Geodesicas Argentinas 1998,geodetic,Densification of SIRGAS 1995; ITRF94 epoch 1995.42.,1998,7019,8901,1033,"Topographic mapping, geodesy.",Una red geod�sica de 127 puntos materializados en el terreno que definen el Sistema Geod�sico Nacional. [A geodetic network of 127 points defining the National Geodetic System.] Supersedes the 1994 POSGAR adjustment (code 6172).,http://www.igm.gov.ar/posgar.html,EPSG,2001-11-06 00:00:00,,0
+6191,Albanian 1987,geodetic,,1987,7024,8901,1025,"Geodesy, cadastre, topographic mapping, engineering survey.",,EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,0
+6192,Douala 1948,geodetic,"South pillar of Doula base; 4deg 00min 40.64sec N, 9deg 42min 30.41sec E",1948,7022,8901,1060,Topographic mapping.,Superseded by Manoca 1962 datum (code 6193).,TotalFinaElf,EPSG,2002-01-18 00:00:00,,0
+6193,Manoca 1962,geodetic,"Reservoir centre at the Manoca tower (""tube Suel""), 3deg 51min 49.896sec N, 9deg 36min 49.347sec E.",1962,7011,8901,1060,Topographic mapping.,The intent of the Bukavu 1953 conference was to adopt the Clarke 1880 (RGN) ellipsoid (code 7012) but in practice this datum has used the IGN version. Supersedes Douala 1948 (code 6192).,TotalFinaElf,EPSG,2002-01-18 00:00:00,,0
+6194,Qornoq 1927,geodetic,,1927,7022,8901,1107,Topographic mapping.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,0
+6195,Scoresbysund 1952,geodetic,,1952,7022,8901,2570,Topographic mapping.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,0
+6196,Ammassalik 1958,geodetic,,1958,7022,8901,2571,Topographic mapping.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,0
+6197,Garoua,geodetic,IGN astronomical station and benchmark no. 16 at Tongo; 8deg 55min 08.74sec N 13deg 30min 43.19sec E.,,7012,8901,2590,Topographic mapping.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,0
+6198,Kousseri,geodetic,IGN astronomical station Dabanga; 11deg 55min 05.9sec N 14deg 38min 40.8sec E.,,7012,8901,2591,Topographic mapping.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,0
+6199,Egypt 1930,geodetic,Fundamental Point: Station F1. Latitude: 30 deg 01 min 42.86 sec N; Longitude: 31 deg 16 min 37.05 sec E (of Greenwich).,1930,7022,8901,1086,Used for scientific purposes only.,"Note that Egypt 1930 uses the International 1924 ellipsoid, unlike the Egypt 1907 datum (code 6229) which uses the Helmert ellipsoid. Oil industry references to the Egypt 1930 datum name and the Helmert ellipsoid probably mean Egypt 1907 datum.",,EPSG,2002-02-12 00:00:00,,0
+6200,Pulkovo 1995,geodetic,Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 15.359 sec N; Longitude: 30 deg 19 min 28.318 sec E (of Greenwich).,1995,7024,8901,1198,Scientific adjustment.,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,0
+6201,Adindan,geodetic,Fundamental Point: Station 15; Adindan. Latitude: 22 deg 10 min 7.110 sec N; Longitude: 31 deg 29 min 21.608 sec E (of Greenwich).,,7012,8901,1271,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6202,Australian Geodetic Datum 1966,geodetic,Fundamental Point: Johnson Memorial. Latitude: 25 deg 56 min 54.551 sec S; Longitude: 133 deg 12 min 30.077 sec E (of Greenwich).,1966,7003,8901,1279,Topographic mapping.,,Australian Map Grid Technical Manual. National Mapping Council of Australia Technical Publication 7; 1972.,EPSG,1995-06-02 00:00:00,,0
+6203,Australian Geodetic Datum 1984,geodetic,,1984,7003,8901,1280,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6204,Ain el Abd 1970,geodetic,Fundamental Point: Ain El Abd. Latitude: 28 deg 14 min 06.171 sec N; Longitude: 48 deg 16 min 20.906 sec E (of Greenwich).,1970,7022,8901,1272,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6205,Afgooye,geodetic,,,7024,8901,1214,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6206,Agadez,geodetic,,,7011,8901,1177,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6207,Lisbon 1937,geodetic,Fundamental Point: Castelo Sao Jorge; Lisbon. Latitude: 38 deg 42 min 43.631 sec N; Longitude: 9 deg 07 min 54.862 sec W (of Greenwich).,1937,7022,8901,1294,Topographic mapping.,Supersedes Lisbon 1890 adjustment (which used Bessel 1841 ellipsoid).,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,2001.551,0
+6208,Aratu,geodetic,,,7022,8901,1274,Oil industry geodetic purposes.,,,EPSG,1995-06-02 00:00:00,,0
+6209,Arc 1950,geodetic,Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).,1950,7013,8901,1276,"Topographic mapping, geodesy.",,,EPSG,1995-06-02 00:00:00,,0
+6210,Arc 1960,geodetic,Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).,1960,7012,8901,1277,"Topographic mapping, geodesy.",,,EPSG,1995-06-02 00:00:00,,0
+6211,Batavia,geodetic,Fundamental Point: Longitude at Batavia Astro. Station. Latitude: 6 deg 7 min 39.520 sec S; Longitude: 106 deg 48 min 27.790 sec E (of Greenwich). Latitude and azimuth at Genuk.,,7004,8901,1285,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6212,Barbados 1938,geodetic,Fundamental point: HMS Challenger astro station M1; latitude 13 deg 04 min 32.53 sec N; longitude 59 deg 36 min 29.34 sec W (of Greenwich).,1938,7012,8901,1042,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,99.171,0
+6213,Beduaram,geodetic,,,7011,8901,1177,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6214,Beijing 1954,geodetic,,1954,7024,8901,1067,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6215,Reseau National Belge 1950,geodetic,Fundamental Point: Lommel (tower). Latitude: 51 deg 13 min 47.334 sec N; Longitude: 0 deg 56 min 44.773 sec E (of Brussels).,1950,7022,8901,1347,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6216,Bermuda 1957,geodetic,,1957,7008,8901,1047,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6218,Bogota 1975,geodetic,Fundamental Point: Bogota observatory. Latitude: 4 deg 35 min 56.570 sec N; Longitude: 74 deg 4 min 51.300 sec W (of Greenwich).,1975,7022,8901,1070,Topographic mapping.,Supersedes 1951 adjustment.,"Instituto Geografico Agustin Caduzzi (IGAC) special publication no. 1, 4th edition (1975) ""Geodesia: Resultados Definitvos de Parte de las Redes Geodesicas Establecidas en el Pais"".",EPSG,2000-10-19 00:00:00,2000.20,0
+6219,Bukit Rimpah,geodetic,2deg 00min 40.16sec S 105deg 51min 39.76sec E (of Greenwich).,,7004,8901,1287,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6220,Camacupa,geodetic,,,7012,8901,1288,Coastal hydrography.,,,EPSG,1995-06-02 00:00:00,,0
+6221,Campo Inchauspe,geodetic,Fundamental Point: Campo Inchauspe. Latitude: 35 deg 58 min 17.000 sec S; Longitude: 62 deg 10 min 12.000 sec W (of Greenwich).,,7022,8901,1033,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6222,Cape,geodetic,Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).,,7013,8901,1290,"Geodesy, cadastre, topographic mapping, engineering survey.",,"Private Communication, Directorate of Surveys and Land Information, Cape Town.",EPSG,1996-10-18 00:00:00,96.25 99.69,0
+6223,Carthage,geodetic,,,7011,8901,1236,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6224,Chua,geodetic,Fundamental Point: Chua. Latitude: 19 deg 45 min 41.160 sec S; Longitude: 48 deg 6 min 7.560 sec W (of Greenwich).,,7022,8901,1053,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6225,Corrego Alegre,geodetic,Fundamental Point: Corrego Alegre. Latitude: 19 deg 50 min 15.140 sec S; Longitude: 48 deg 57 min 42.750 sec W (of Greenwich).,,7022,8901,1293,"Topographic mapping, geodesy.",,,EPSG,1995-06-02 00:00:00,,0
+6226,Cote d'Ivoire,geodetic,,,7011,8901,1075,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,2001.11,1
+6227,Deir ez Zor,geodetic,Fundamental Point: Trig. 254 Deir. Latitude: 35 deg 21 min 49.975 sec N; Longitude: 40 deg 5 min 46.770 sec E (of Greenwich).,,7011,8901,1623,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6228,Douala,geodetic,,,7011,8901,1060,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,1
+6229,Egypt 1907,geodetic,Fundamental Point: Station F1. Latitude: 30 deg 01 min 42.86 sec N; Longitude: 31 deg 16 min 33.60 sec E (of Greenwich).,1907,7020,8901,1086,"Geodesy, cadastre, topographic mapping, engineering survey.",,,EPSG,1995-06-02 00:00:00,,0
+6230,European Datum 1950,geodetic,Fundamental Point: Potsdam (Helmert Tower). Latitude: 52 deg 22 min 51.4456 sec N; Longitude: 13 deg 3 min 58.9283 sec E (of Greenwich).,1950,7022,8901,1296,"Topographic mapping, geodesy.",,,EPSG,1995-06-02 00:00:00,,0
+6231,European Datum 1987,geodetic,,1987,7022,8901,2420,Scientific network.,,,EPSG,1995-06-02 00:00:00,,0
+6232,Fahud,geodetic,Fundamental Point: Station NO68-024 Fahud. Latitude: 22 deg 17 min 31.182 sec N; Longitude: 56 deg 29 min 18.820 sec E (of Greenwich).,,7012,8901,1183,Oil industry mapping.,Superseded by PSD93 (code 6134).,Petroleum Development Oman.,EPSG,1995-06-02 00:00:00,,0
+6233,Gandajika 1970,geodetic,,1970,7022,8901,1152,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6234,Garoua,geodetic,,,7011,8901,1060,Topographic mapping.,The intent of the Bukavu 1953 conference was to adopt the Clarke 1880 (RGN) ellipsoid (code 7012) but in practice this datum has used the IGN version.,,EPSG,1995-06-02 00:00:00,,1
+6235,Guyane Francaise,geodetic,,,7022,8901,1097,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6236,Hu Tzu Shan,geodetic,,,7022,8901,1228,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6237,Hungarian Datum 1972,geodetic,"Fundamental Point: Szolohegy. Latitude: 47 deg 17 min 32,6156 sec N; Longitude 19 deg 36 min 09.9865 sec E; geoid height 6.56m.",1972,7036,8901,1119,Topographic mapping.,,http://lazarus.elte.hu/gb/geodez/geod3.htm,EPSG,1996-10-18 00:00:00,96.09,0
+6238,Indonesian Datum 1974,geodetic,"Fundamental Point: Padang. Latitude: 0 deg 56 min 38.414 sec S; Longitude: 100 deg 22 min 8.804 sec E (of Greenwich). Ellipsoidal height 3.190m, gravity-related height 14.0m above mean sea level.",1974,7021,8901,1122,Topographic mapping.,,Bakosurtanal 1979 paper by Jacob Rais.,EPSG,2002-06-22 00:00:00,2002.151,0
+6239,Indian 1954,geodetic,Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,1954,7015,8901,1304,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6240,Indian 1975,geodetic,Fundamental Point: Khau Sakaerang,1975,7015,8901,1231,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6241,Jamaica 1875,geodetic,Fundamental Point: Fort Charles Flagstaff. Latitude: 17 deg 55 min 55.800 sec N; Longitude: 76 deg 56 min 37.260 sec W (of Greenwich).,1875,7034,8901,1128,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6242,Jamaica 1969,geodetic,Fundamental Point: Fort Charles Flagstaff. Latitude: 17 deg 55 min 55.800 sec N; Longitude: 76 deg 56 min 37.260 sec W (of Greenwich).,1969,7008,8901,1128,"Geodesy, cadastre, topographic mapping, engineering survey.",,,EPSG,1995-06-02 00:00:00,,0
+6243,Kalianpur 1880,geodetic,Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,1880,7042,8901,1307,Topographic mapping.,Includes 1916 extrension into Burma (Myanmar). Superseded by 1937 adjustment.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,1999-10-20 00:00:00,97.23,0
+6244,Kandawala,geodetic,,,7015,8901,1218,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6245,Kertau,geodetic,Fundamental Point: Kertau. Latitude: 3 deg 27 min 50.710 sec N; Longitude: 102 deg 37 min 24.550 sec E (of Greenwich).,,7018,8901,1309,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6246,Kuwait Oil Company,geodetic,,,7012,8901,1136,Oil industry mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6247,La Canoa,geodetic,Fundamental Point: La Canoa. Latitude: 8 deg 34 min 17.170 sec N; Longitude: 63 deg 51 min 34.880 sec W (of Greenwich).,,7022,8901,1251,"Geodesy, topographic mapping, engineering survey.",Origin also adopted for PSAD56.,,EPSG,1995-06-02 00:00:00,,0
+6248,Provisional South American Datum 1956,geodetic,Fundamental Point: La Canoa. Latitude: 8 deg 34 min 17.170 sec N; Longitude: 63 deg 51 min 34.880 sec W (of Greenwich).,1956,7022,8901,1348,Topographic mapping.,Same origin as La Canoa datum.,,EPSG,1995-06-02 00:00:00,,0
+6249,Lake,geodetic,Fundamental Point: Maracaibo Cathedral. Latitude: 10 deg 38 min 34.678 sec N; Longitude: 71 deg 36 min 20.224 sec W (of Greenwich).,,7022,8901,1312,Oil industry mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6250,Leigon,geodetic,"Fundamental Point: GCS Station 121, Leigon. Latitude: 5 deg 38 min 52.27 sec N; Longitude: 0 deg 11 min 46.08 sec W (of Greenwich).",,7012,8901,1104,Topographic mapping.,Superseded Accra datum (code 6168) from 1978. Coordinates at Leigon fundamental point defined as Accra datum values for that point.,Ordnance Survey International,EPSG,1995-06-02 00:00:00,,0
+6251,Liberia 1964,geodetic,,1964,7012,8901,1142,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6252,Lome,geodetic,,,7011,8901,1232,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6253,Luzon 1911,geodetic,Fundamental Point: Balacan. Latitude: 13 deg 33 min 41.000 sec N; Longitude: 121 deg 52 min 03.000 sec E (of Greenwich).,1911,7008,8901,1190,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6254,Hito XVIII 1963,geodetic,Chile-Argentina boundary survey.,1963,7022,8901,1303,Geodesy.,Used in Tierra del Fuego.,Various oil company records.,EPSG,1995-06-02 00:00:00,,0
+6255,Herat North,geodetic,,,7022,8901,1024,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6256,Mahe 1971,geodetic,Fundamental Point: Mahe,1971,7012,8901,1208,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6257,Makassar,geodetic,Fundamental Point: Moncongloe,,7004,8901,1316,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6258,European Terrestrial Reference System 1989,geodetic,,1989,7019,8901,1298,Geodesy.,"Coincides with WGS84 at the one metre level.
+The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used for the realisation.",,EPSG,2000-10-19 00:00:00,97.11 97.55 99.111 2000.72,0
+6259,Malongo 1987,geodetic,Fundamental Point: Station Y at Malongo base camp. Latitude: 5 deg 23 min 34.327 sec S; Longitude: 12 deg 12 min 02.393 sec E (of Greenwich).,1987,7022,8901,1317,Oil industry mapping.,Offshore extension of Mhast datum (6264) using Transit translocation.,Chevron Petroleum Technology.,EPSG,1995-06-02 00:00:00,,0
+6260,Manoca,geodetic,,,7012,8901,1060,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,1
+6261,Merchich,geodetic,"Fundamental Point: Merchich. Latitude: 33� 26' 59.672"" N; Longitude: 7� 33' 27.295"" W (of Greenwich).",1922,7011,8901,1166,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6262,Massawa,geodetic,,,7004,8901,1089,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6263,Minna,geodetic,Fundamental Point: Minna base station L40. Latitude: 9 deg 38 min 09.000 sec N; Longitude: 6 deg 30 min 59.000 sec E (of Greenwich).,,7012,8901,1178,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6264,Mhast,geodetic,,,7022,8901,1318,Coastal hydrography.,,,EPSG,1995-06-02 00:00:00,,0
+6265,Monte Mario,geodetic,Fundamental Point: Monte Mario. Latitude: 41 deg 55 min 25.510 sec N; Longitude: 0 deg 00 min 00.000 sec E (of Rome).,,7022,8901,1127,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6266,M'poraloko,geodetic,,,7011,8901,1100,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6267,North American Datum 1927,geodetic,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,1927,7008,8901,1349,Topographic mapping.,Superseded by North American Datum 1983 (NAD83),,EPSG,1995-06-02 00:00:00,,0
+6268,NAD Michigan,geodetic,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,,7009,8901,1391,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6269,North American Datum 1983,geodetic,Origin at geocentre.,1986,7019,8901,1350,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6270,Nahrwan 1967,geodetic,Fundamental point: Nahrwan south base. Latitude: 33 deg 19 min 10.87 sec N; Longitude: 44 deg 43 min 25.54 sec E (of Greenwich).,1967,7012,8901,1351,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6271,Naparima 1972,geodetic,Fundamental Point: Naparima. Latitude: 10 deg 16 min 44.860 sec N; Longitude: 61 deg 27 min 34.620 sec W (of Greenwich).,1972,7022,8901,1322,Topographic mapping.,Naparima 1972 is an extension of the Naparima 1955 network of Trinidad to include Tobago.,Ordnance Survey International.,EPSG,1995-06-02 00:00:00,,0
+6272,New Zealand Geodetic Datum 1949,geodetic,Fundamental Point: Papatahi. Latitude: 41 deg 19 min 8.900 sec S; Longitude: 175 deg 02 min 51.000 sec E (of Greenwich).,1949,7022,8901,1175,"Geodesy, cadastre, topographic mapping, engineering survey.",,,EPSG,2000-10-19 00:00:00,2000.702,0
+6273,NGO 1948,geodetic,,1948,7005,8901,1352,"Geodesy, cadastre, topographic mapping, engineering survey.",,,EPSG,1995-06-02 00:00:00,,0
+6274,Datum 73,geodetic,"Fundamental Point: TF4, Melrica. Latitude: 39 deg 41 min 37.30 sec N; Longitude: 8 deg 07 min 53.31 sec W (of Greenwich).",1964,7022,8901,1294,Topographic mapping.,,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,,0
+6275,Nouvelle Triangulation Francaise,geodetic,Fundamental Point: Pantheon. Latitude: 48 deg 50 min 46.52 sec N; Longitude: 2 deg 20 min 48.67 sec E (of Greenwich).,1898,7011,8901,1353,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6276,NSWC 9Z-2,geodetic,,,7025,8901,1262,Satellite navigation.,Transit precise ephemeris before 1991.,,EPSG,1995-06-02 00:00:00,,0
+6277,OSGB 1936,geodetic,Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).,1936,7001,8901,1264,Topographic mapping.Topographic mapping.Topographic mapping.Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6278,OSGB 1970 (SN),geodetic,Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).,1970,7001,8901,1354,Scientific network.,,,EPSG,1995-06-02 00:00:00,,0
+6279,OS (SN) 1980,geodetic,Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).,1980,7001,8901,1354,Scientific network.,,,EPSG,1995-06-02 00:00:00,,0
+6280,Padang 1884,geodetic,Fundamental Point: Padang,1884,7004,8901,1355,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6281,Palestine 1923,geodetic,Fundamental Point: Point 82'M Jerusalem. Latitude: 31 deg 44 min 2.749 sec N; Longitude: 35 deg 12 min 43.490 sec E (of Greenwich).,1923,7010,8901,1356,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6282,Congo 1960 Pointe Noire,geodetic,Fundamental Point: Point Noire Astro. Latitude: 4 deg 47 min 0.100 sec S; Longitude: 11 deg 51 min 1.550 sec E (of Greenwich).,1960,7011,8901,1072,Topographic mapping.,,,EPSG,2002-01-18 00:00:00,2002.05,0
+6283,Geocentric Datum of Australia 1994,geodetic,,1994,7019,8901,1036,"Topographic mapping, geodesy.",Coincident with WGS84 to within 1 metre.,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-06-02 00:00:00,,0
+6284,Pulkovo 1942,geodetic,Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 18.550 sec N; Longitude: 30 deg 19 min 42.090 sec E (of Greenwich).,1942,7024,8901,1357,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6285,Qatar 1974,geodetic,Fundamental Point: Station G3,1974,7022,8901,1346,Topographic mapping.,,,EPSG,2001-08-28 00:00:00,2001.27,0
+6286,Qatar 1948,geodetic,Fundamental Point: Sokey 0 M. Latitude: 25 deg 22 min 56.500 sec N; Longitude: 50 deg 45 min 41.000 sec E (of Greenwich).,1948,7020,8901,1346,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6287,Qornoq,geodetic,,1927,7022,8901,1107,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,1
+6288,Loma Quintana,geodetic,Fundamental Point: Loma Quintana,,7022,8901,1313,Topographic mapping.,Superseded by La Canoa (code 6247).,,EPSG,1995-06-02 00:00:00,,0
+6289,Amersfoort,geodetic,Fundamental Point: Amersfoort. Latitude: 52 deg 09 min 22.178 sec N; Longitude: 5 deg 23 min 15.478 sec E (of Greenwich).,,7004,8901,1275,"Geodesy, cadastre, topographic mapping, engineering survey.",,,EPSG,2000-10-19 00:00:00,2000.56,0
+6291,South American Datum 1969,geodetic,,1969,7036,8901,1358,Topographic mapping.,SAD69 uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision is 0 to 31mm.,,EPSG,1996-10-18 00:00:00,96.09 97.252,0
+6292,Sapper Hill 1943,geodetic,,1943,7022,8901,1092,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6293,Schwarzeck,geodetic,,,7046,8901,1169,Topographic mapping.,,"Private Communication, Directorate of Surveys and Land Information, Cape Town.",EPSG,2001-01-21 00:00:00,2001.15,0
+6294,Segora,geodetic,,,7004,8901,1359,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,1
+6295,Serindung,geodetic,,,7004,8901,1360,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6296,Sudan,geodetic,,,7011,8901,1361,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6297,Tananarive 1925,geodetic,Fundamental Point: Tananarive observatory. Latitude: 18 deg 55 min 2.100 sec S; Longitude: 45 deg 12 min 52.800 sec E (of Greenwich).,2025,7022,8901,1149,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6298,Timbalai 1948,geodetic,Fundamental Point: Timbalai. Latitude: 5 deg 17 min 3.548 sec N; Longitude: 115 deg 10 min 56.409 sec E (of Greenwich).,1948,7016,8901,1362,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6299,TM65,geodetic,Adjusted to best mean fit 12 stations of the OSNI 1952 primary adjustment to within 0.5m.,1965,7002,8901,1305,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6300,TM75,geodetic,Adjusted to best mean fit 9 stations of the OSNI 1952 primary adjustment in Northern Ireland plus the 1965 values of 3 stations in the Republic of Ireland.,1975,7002,8901,1305,"Geodesy, topographic mapping and engineering survey.",,,EPSG,1995-06-02 00:00:00,,0
+6301,Tokyo,geodetic,Fundamental Point: Nikon-Keido-Genten. Latitude: 35 deg 39 min 17.5148 sec N; Longitude: 139 deg 44 min 40.5020 sec E (of Greenwich).,,7004,8901,1364,"Geodesy, cadastre, topographic mapping, engineering survey.",Superseded by Japanese Geodetic Datum 2000 (code 6611).,Geographic Survey Institute; Japan; Bulletin 40 (March 1994). Also http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,98.46 2002.08,0
+6302,Trinidad 1903,geodetic,Harbour Master's Flagstaff; Port of Spain.,1903,7007,8901,1339,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6303,Trucial Coast 1948,geodetic,Fundamental Point: TC1. Latitude: 25 deg 23 min 50.190 sec N; Longitude: 55 deg 26 min 43.950 sec E (of Greenwich).,1948,7020,8901,1363,Oil industry mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6304,Voirol 1875,geodetic,Fundamental Point: Voirol. Latitude: 40.835864 grads N; Longitude: 0.788735 grads E of Paris.,1875,7011,8901,1365,Topographic mapping.,,IGN Paris,EPSG,1995-06-02 00:00:00,,0
+6306,Bern 1938,geodetic,Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min 7.890 sec N; Longitude: 7 deg 26 min 22.335 sec E (of Greenwich).,1938,7004,8901,1286,Topographic mapping.,This redetermination of the coordinates of fundamental point is used for scientific purposes and as the graticule overprinted on topographic maps constructed on the CH1903 / LV03 projected CS (code 21781).,"""Die Projektionen der schweizerischen Plan- und Kartenwerke""; J. Bolliger 1967",EPSG,1 [...]
+6307,Nord Sahara 1959,geodetic,,1959,7012,8901,1366,Topographic mapping.,Sometimes incorrectly referred to as Voirol Unifie 1960. Voirol Unifie 1960 is NOT a datum: it is two projected coordinate systems based on Nord Sahara 1959. See coordinate system codes 30791 and 30792.,"""Le System Geodesique Nord-Sahara""; IGN Paris",EPSG,1999-10-20 00:00:00,99.62,0
+6308,Stockholm 1938,geodetic,Fundamental Point: Stockholm observatory,1938,7004,8901,1225,"Geodesy, cadastre, topographic mapping, engineering survey.",Superseded by RT90 adjustment (datum code 6124),,EPSG,1996-04-12 00:00:00,,0
+6309,Yacare,geodetic,,,7022,8901,1247,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6310,Yoff,geodetic,,,7011,8901,1207,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6311,Zanderij,geodetic,,,7022,8901,1222,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6312,Militar-Geographische Institut,geodetic,Fundamental Point: Hermannskogel. Latitude: 48 deg 16 min 15.29 sec N; Longitude: 16 deg 17 min 41.06 sec E (of Greenwich).,1901,7004,8901,1321,Topographic mapping.,Croatia is planning to define a new modern datum to supersede HR1901 (info from EuroGeographics; http://crs.ifag.de/).,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,1995-06-02 00:00:00,,0
+6313,Reseau National Belge 1972,geodetic,Fundamental Point: Uccle observatory. Latitude: 50 deg 47 min 57.704 sec N; Longitude: 4 deg 21 min 24.983 sec E (of Greenwich).,1972,7022,8901,1347,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6314,Deutsches Hauptdreiecksnetz,geodetic,Fundamental Point: Rauenberg. Latitude: 52 deg 27 min 12.021 sec N; Longitude: 13 deg 22 min 04.928 sec E (of Greenwich).,,7004,8901,1295,"Geodesy, cadastre, topographic mapping, engineering survey.",Deprecated because name misspelt.,,EPSG,2001-11-06 00:00:00,2001.511,0
+6315,Conakry 1905,geodetic,Fundamental Point: Conakry. Latitude: 10.573766g N; Longitude: 17.833682g W (of Paris).,1905,7011,8901,1112,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6316,Dealul Piscului 1933,geodetic,Fundamental point: latitude 44 deg 24 min 33.9606 sec N; longitude 26 deg 06 min 44.8772 sec E (of Greenwich).,1933,7022,8901,1197,Topographic mapping.,Superseded by 1970 adjustment (datum code 6317),Institute for Geodesy Photogrametry and Land Management,EPSG,1996-04-12 00:00:00,,0
+6317,Dealul Piscului 1970,geodetic,Fundamental point: latitude 44 deg 24 min 23.7709 sec N; longitude 26deg 06 min 44.1265 sec E (of Greenwich).,1970,7024,8901,1197,Topographic mapping.,Supersedes 1933 adjustment (datum code 6316),Institute for Geodesy Photogrametry and Land Management,EPSG,1996-04-12 00:00:00,,0
+6318,National Geodetic Network,geodetic,,,7030,8901,1136,Geodesy.,,,EPSG,1996-04-12 00:00:00,,0
+6319,Kuwait Utility,geodetic,,,7019,8901,1310,"Cadastre, engineering survey.",,,EPSG,1996-04-12 00:00:00,,0
+6322,World Geodetic System 1972,geodetic,,1972,7043,8901,1262,Satellite navigation.,Used by GPS before 1987. For Transit satellite positioning see also WGS 72BE. Datum code 6323 reserved for southern hemisphere ProjCS's.,,EPSG,1999-04-22 00:00:00,99.03,0
+6324,WGS 72 Transit Broadcast Ephemeris,geodetic,,1972,7043,8901,1262,Satellite navigation.,Alleged datum for use with Transit broadcast ephemeris prior to 1989. Relationship to WGS 72 has changed over time. Datum code 6325 reserved for southern hemisphere ProjCS's.,,EPSG,1999-04-22 00:00:00,99.03,0
+6326,World Geodetic System 1984,geodetic,Origin at geocentre.,1984,7030,8901,1262,Satellite navigation.,Datum code 6327 reserved for southern hemisphere ProjCS's,,EPSG,2002-06-22 00:00:00,2002.151,0
+6600,Anguilla 1957,geodetic,Fundamental point: station A4.,1957,7012,8901,1030,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6601,Antigua 1943,geodetic,Fundamental point: station A14.,1943,7012,8901,1273,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6602,Dominica 1945,geodetic,Fundamental point: station M12.,1945,7012,8901,1082,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6603,Grenada 1953,geodetic,Fundamental point: station GS8.,1953,7012,8901,1551,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6604,Montserrat 1958,geodetic,Fundamental point: station M36.,1958,7012,8901,1165,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6605,St. Kitts 1955,geodetic,Fundamental point: station K12.,1955,7012,8901,1200,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6606,St. Lucia 1955,geodetic,Fundamental point: station DCS3.,1955,7012,8901,1201,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6607,St. Vincent 1945,geodetic,Fundamental point: station V1.,1945,7012,8901,1202,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6608,North American Datum 1927 (1976),geodetic,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,1976,7008,8901,1367,"Geodesy, cadastre, topographic mapping, engineering survey.",NAD27(76) used in Ontario for all maps at scale 1/20 000 and larger; elsewhere in Canada for selected purposes.,Geodetic Survey of Canada.,EPSG,1999-05-12 00:00:00,,0
+6609,North American Datum 1927 (CGQ77),geodetic,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,1977,7008,8901,1368,"Geodesy, cadastre, topographic mapping, engineering survey.",NAD27 (CGQ77) used in Quebec for all maps at scale 1/20 000 and larger; generally for maps issued by the Quebec cartography office whose reference system is CGQ77.,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,1 [...]
+6610,Xian 1980,geodetic,,1980,7049,8901,1067,"Geodesy, topographic and engineering survey.",,BP,EPSG,2002-02-12 00:00:00,,0
+6611,Hong Kong 1980,geodetic,"Trig ""Zero"", 38.4 feet south along the transit circle of the Kowloon Observatory. Latitude 22deg 18min 12.82sec North, longitude 114deg 10min 18.75sec East.",1980,7022,8901,1118,"Geodesy, topgraphic and engineering survey, cadastre.",Supersedes Hong Kong 1963 datum and 1973 metric adjustment.,"Survey and Mapping Office, Lands Department. http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,0
+6612,Japanese Geodetic Datum 2000,geodetic,ITRF94,2000,7019,8901,1129,"Geodesy, topographic and engineering survey.",Instigated under amendment to the Japanese Surveying Law with effect from April 2002. Supersedes Tokyo datum (code 6301).,Japanese Survey Federation.,EPSG,2002-06-22 00:00:00,,0
+6613,Gunung Segara,geodetic,Station P5 (Gunung Segara) 0deg 32min 12.83sec S 117deg 08min 48.47sec E (of Greenwich).,,7004,8901,1360,Topographic mapping.,,TotalFinaElf.,EPSG,2002-06-22 00:00:00,,0
+6614,Qatar National Datum 1995,geodetic,Defined by transformation from WGS 84 - see coordinate operation code 1840.,1995,7022,8901,1346,Topographic mapping.,,Qatar Centre for Geographic Information.,EPSG,2002-06-28 00:00:00,,0
+6615,Porto Santo,geodetic,,1936,7022,8901,1314,Topographic mapping.,For Selvagens island see Selvagem Grande (code 6616).,Instituto Geografico e Cadastral Lisbon http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,0
+6616,Selvagem Grande,geodetic,,,7022,8901,2779,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,0
+6801,CH1903 (Bern),geodetic,Fundamental Point: Bern observatory. Latitude: 46 deg 57 min 8.660 sec N; Longitude: 0,1903,7004,8907,1286,Topographic mapping.,,Bundesamt f�r Landestopographie,EPSG,1999-10-20 00:00:00,,0
+6802,Bogota 1975 (Bogota),geodetic,Fundamental Point: Bogota observatory. Latitude: 4 deg 35 min 56.570 sec N; Longitude: 0,1975,7022,8904,1070,Topographic mapping.,,,EPSG,2000-10-19 00:00:00,2000.20,0
+6803,Lisbon 1937 (Lisbon),geodetic,Fundamental Point: Castelo Sao Jorge; Lisbon. Latitude: 38 deg 42 min 43.631 sec N; Longitude: 0,1937,7022,8902,1294,Topographic mapping.,Supersedes Lisbon 1890 adjustment (which used Bessel 1841 ellipsoid).,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,2001.551,0
+6804,Makassar (Jakarta),geodetic,Fundamental Point: Moncongloe,,7004,8908,1316,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6805,Militar-Geographische Institut (Ferro),geodetic,Fundamental Point: Hermannskogel. Latitude: 48 deg 16 min 15.29 sec N; Longitude: 33 deg 57 min 41.06 sec E of Ferro.,1901,7004,8909,1321,Topographic mapping.,,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,1995-06-02 00:00:00,,0
+6806,Monte Mario (Rome),geodetic,Fundamental Point: Monte Mario. Latitude: 41 deg 55 min 25.510 sec N; Longitude: 0 deg 00 min 00.000 sec E (of Rome).,,7022,8906,1127,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6807,Nouvelle Triangulation Francaise (Paris),geodetic,Fundamental Point: Pantheon,,7011,8903,1353,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6808,Padang 1884 (Jakarta),geodetic,Fundamental Point: Padang,1884,7004,8908,1355,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6809,Reseau National Belge 1950 (Brussels),geodetic,Fundamental Point: Lommel (tower). Latitude: 51 deg 13 min 47.334 sec N; Longitude: 0 deg 56 min 44.773 sec E (of Brussels).,1950,7022,8910,1347,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6810,Tananarive 1925 (Paris),geodetic,Fundamental Point: Tananarive observatory. Latitude: 18 deg 55 min 2.100 sec S; Longitude: 0,1925,7022,8903,1149,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6811,Voirol 1875 (Paris),geodetic,Fundamental Point: Voirol. Latitude: 40.835864 grads N; Longitude: 0.788735 grads E of Paris.,1875,7011,8903,1365,Topographic mapping.,,IGN Paris,EPSG,1995-06-02 00:00:00,,0
+6813,Batavia (Jakarta),geodetic,Fundamental Point: Longitude at Batavia Astro. Station. Latitude: 6 deg 7 min 39.520 sec S; Longitude: 106 deg 48 min 27.790 sec E (of Greenwich). Latitude and azimuth at Genuk.,,7004,8908,1285,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6814,Stockholm 1938 (Stockholm),geodetic,Fundamental Point: Stockholm observatory,1938,7004,8911,1225,"Geodesy, cadastre, topographic mapping, engineering survey.",Superseded by RT90 adjustment (datum code 6124),,EPSG,1996-04-12 00:00:00,,0
+6815,Greek (Athens),geodetic,Fundamental point: Athens Observatory; latitude 37 deg 58 min 20.132 sec N; longitude 0 deg E of Athens.,,7004,8912,1106,Topographic mapping.,See geodetic datum alias 6404. Used as basis of topographic mapping based on Hatt projection.,Topography Department; National Technical University of Athens,EPSG,1997-06-16 00:00:00,,0
+6816,Carthage (Paris),geodetic,,,7011,8903,1236,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6817,NGO 1948 (Oslo),geodetic,,1948,7005,8913,1352,"Geodesy, cadastre, topographic mapping, engineering survey.",,,EPSG,1995-06-02 00:00:00,,0
+6818,S-JTSK (Ferro),geodetic,Modification of Austrian MGI (Ferro) datum.,1920,7004,8909,1306,"Geodesy, cadastre, topographic mapping, engineering survey.",,Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2001-08-28 00:00:00,2001.26,0
+6819,Nord Sahara 1959 (Paris),geodetic,,1959,7012,8903,1366,Topographic mapping.,Conformal transformation from adjustment in ED50 terms.,"""Le System Geodesique Nord-Sahara""; IGN Paris",EPSG,2000-06-23 00:00:00,,0
+6820,Gunung Segara (Jakarta),geodetic,Station P5 (Gunung Segara) 0deg 32min 12.83sec S 117deg 08min 48.47sec E of Greenwich (8deg 20min 20.68sec E of Jakarta).,,7004,8908,1360,Topographic mapping.,,,EPSG,2002-06-22 00:00:00,,0
+6901,Ancienne Triangulation Francaise (Paris),geodetic,,,7027,8903,1326,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6902,Nord de Guerre (Paris),geodetic,,,7027,8903,1369,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6903,Madrid 1870 (Madrid),geodetic,Fundamental point: Madrid observatory.,1870,7028,8905,1217,Topographic mapping.,,Institut de Geomatica; Barcelona,EPSG,1998-11-11 00:00:00,,0
+6904,Lisbon 1890 (Lisbon),geodetic,Fundamental Point: Castelo Sao Jorge; Lisbon. Latitude: 38 deg 42 min 43.631 sec N; Longitude: 0,1937,7004,8902,1294,Topographic mapping.,Superseded by Lisbon 1937 adjustment (which uses International 1924 ellipsoid).,Instituto Geografico e Cadastral; Lisbon. http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,0
+9300,Astra Minas,engineering,Origin at 45 deg 59 min 54.79 sec S; 67 deg 34 min 38.94 sec W.,,,,1265,Oil industry mapping.,,,EPSG,2000-03-07 00:00:00,,0
+9301,Barcelona,engineering,Centre of the gateway of San Cristobal chuch; Plaza Boyaca; Barcelona.,,,,1266,Oil industry mapping.,Coordinates variously given as 10deg 08min 06sec N 64deg 41min 17sec W and 10deg 08min 06sec N 64deg 41min 07.5sec W. It is not clear whether there should be two local datums.,"Ministry of Mines standards manual, 1974.",EPSG,2000-03-07 00:00:00,,0
+9302,Maturin,engineering,Concrete post PR-1 in Plaza Bolivar; Maturin. 9deg 44min 55sec N 63deg 10min 40sec W.,,,,1320,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9303,Maracaibo Cross,engineering,Cruz Canada Morillo in Maracaibo; 10deg 38min 32.328sec N 71deg 37min 12.12sec W Loma Quintana datum.,,,,1319,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9304,La Rosa,engineering,Monument in La Rosa; 10deg 22min 40.417sec N 71deg 26min 59.488sec W Loma Quintana datum.,,,,1311,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9305,Mene Grande,engineering,Monument in Santa Barbara; Mene Grande. 9deg 52min 25.488sec N 70deg 54min 35.310sec W.,,,,1270,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9306,El Cubo,engineering,8deg 44min 17.258sec N 72deg 30min 09.01sec W.,,,,1269,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9307,Dabajuro,engineering,Church tower at Dabajuro; 11deg 01min 19sec N 70deg 40min 40sec W.,,,,1268,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9308,Tucupita,engineering,Centre of Plaza Bolivar; Tucupita; 9deg 03min 32sec N 62deg 03min 07.6sec W.,,,,1370,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9309,El Mene,engineering,10deg 04min 49.1sec N 71deg 02min 10sec W.,,,,1270,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9310,Santa Maria de Ipire,engineering,Concrete post PR-1 in Plaza Bolivar; Santa Maria de Ipire; 8deg 40min 06sec N 65deg 19min 09sec W.,,,,1371,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9311,Barinas west base,engineering,Concrete pillar,,,,1267,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9312,EPSG example X,engineering,Bin grid I=J=1 at WGS 84 / UTM zone 31N 456781E 5836723N.,,,,1263,Example only.,"Bin grid orientation = 20 degrees grid. Bin width I=25m, J=12.5m. Bin increment I=1, J=1. Scale factor at origin 0.99984.
+
+Example only!",UKOOA P6/98 documentation,EPSG,2000-06-23 00:00:00,,0
+9313,EPSG example Platform Y,engineering,Conductor slot A1,,,,1263,Example only.,Example only,EPSG,EPSG,2000-06-23 00:00:00,,0
diff --git a/src/tiff/csv/deprecation.csv b/src/tiff/csv/deprecation.csv
new file mode 100644
index 0000000..4910cce
--- /dev/null
+++ b/src/tiff/csv/deprecation.csv
@@ -0,0 +1,276 @@
+"DEPRECATION_ID","DEPRECATION_DATE","CHANGE_ID","OBJECT_TABLE_NAME","OBJECT_CODE","REPLACED_BY","DEPRECATION_REASON"
+2,2001-08-15 00:00:00,2001.223,Coordinate_Operation,8563,1670,Replaced concatenated tfm with zero step by single tfm.
+3,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8457,1676,Replaced concatenated tfm with zero step by single tfm.
+4,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8236,1675,Replaced concatenated tfm with zero step by single tfm.
+5,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8183,1677,Replaced concatenated tfm with zero step by single tfm.
+6,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8195,1680,Replaced concatenated tfm with zero step by single tfm.
+7,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8199,1679,Replaced concatenated tfm with zero step by single tfm.
+8,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8234,1673,Replaced concatenated tfm with zero step by single tfm.
+9,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8567,1681,Replaced concatenated tfm with zero step by single tfm.
+10,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8572,1672,Replaced concatenated tfm with zero step by single tfm.
+11,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8573,1671,Replaced concatenated tfm with zero step by single tfm.
+12,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8580,1678,Replaced concatenated tfm with zero step by single tfm.
+13,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8396,1665,Replaced concatenated tfm with zero step by single tfm.
+14,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8400,1666,Replaced concatenated tfm with zero step by single tfm.
+15,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8576,1667,Replaced concatenated tfm with zero step by single tfm.
+16,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8577,1668,Replaced concatenated tfm with zero step by single tfm.
+17,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8194,1669,Replaced concatenated tfm with zero step by single tfm.
+18,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8190,1665,Replaced concatenated tfms with zero step by single tfm with 1m accuracy.
+19,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8192,1669,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+20,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8398,1667,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+21,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8408,1666,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+22,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8453,1667,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+23,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8454,1668,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+24,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8560,1669,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+25,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8578,1665,Replaced concatenated tfm with zero step by single tfms with 1m accuracy.
+26,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8579,1669,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+27,2001-10-04 00:00:00,2001.121,Coordinate_Operation,1510,1766,NMA has reduced precision with which it quotes parameter values for this tfm.
+28,2001-10-04 00:00:00,2001.45,Coordinate_Operation,14100,15302,Error in parameter values for easting and northing at grid origin.
+29,2001-10-04 00:00:00,2001.45,Coordinate_Operation,11631,15303,Error in parameter value for latitude of 2nd standard parallel.
+30,2001-08-28 00:00:00,2001.37,Coordinate_Operation,1508,1753,Incorrect unit assigned to scale difference parameter value.
+32,2001-06-05 00:00:00,2001.07,Ellipsoid,7035,7047,"Changed from general ""Sphere"" to specific ""GRS 1980 Authalic Sphere""."
+33,2001-06-25 00:00:00,2001.19,Ellipsoid,7047,7048,Incorrect radius (semi-major and semi-minor axes).
+34,2001-06-21 00:00:00,2001.07,Datum,6035,6047,"Name changed to reflect use of specific ""GRS 1980 Authalic Sphere"" rather than general ""Sphere""."
+35,1997-11-13 00:00:00,97.372,Datum,5107,5118,Replace this general name to specific.
+38,,2001.181,Datum,6314,6177,Correction to name spelling.
+39,2001-08-28 00:00:00,2001.32,Coordinate Reference System,2156,2195,ProjCRS 2156 invalid as linked to projection in wrong hemisphere and has wrong name.
+40,2001-08-28 00:00:00,2001.32,Coordinate_Operation,15300,15301,Longitude of natural origin has incorrect value (wrong hemisphere).
+41,2001-08-28 00:00:00,2001.3,Coordinate Reference System,2291,2292,Source geogCRS code is in error.
+42,2001-06-05 00:00:00,2001.07,Coordinate Reference System,4035,4047,"Changed from general ""Sphere"" to specific ""GRS 1980 Authalic Sphere""."
+43,2001-08-28 00:00:00,2001.47,Datum,6226,6142,Does not exist except as an alias of 6142 and 6143.
+44,2001-06-05 00:00:00,2001.11,Coordinate Reference System,4226,4142,Does not exist except as an alias of 4142 and 4143.
+45,2001-06-05 00:00:00,2001.181,Coordinate Reference System,31461,,ProjCRS zone not used.
+46,2001-06-05 00:00:00,2001.181,Coordinate Reference System,31462,31466,ProjCRS related to inappropriate coordinate system resulting in incorrect axes and name.
+47,2001-06-05 00:00:00,2001.181,Coordinate Reference System,31463,31467,ProjCRS related to inappropriate coordinate system resulting in incorrect axes and name.
+48,2001-06-05 00:00:00,2001.181,Coordinate Reference System,31464,31468,ProjCRS related to inappropriate coordinate system resulting in incorrect axes and name.
+49,2001-06-05 00:00:00,2001.181,Coordinate Reference System,31465,31469,ProjCRS related to inappropriate coordinate system resulting in incorrect axes and name.
+50,2001-06-05 00:00:00,2001.18,Coordinate Reference System,31265,31275,ProjCRS related to inappropriate projection (coordinate operation) and CS resulting in incorrect scale factor and axes order and abbreviation.
+51,2001-06-05 00:00:00,2001.18,Coordinate Reference System,31266,31276,ProjCRS related to inappropriate projection (coordinate operation) and CS resulting in incorrect scale factor and axes order and abbreviation.
+52,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8564,1691,Replaced concatenated tfm with zero step by single tfm.
+53,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8404,1692,Replaced concatenated tfm with zero step by single tfm.
+54,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8565,1692,Replaced concatenated tfm with zero step by single tfm.
+55,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8243,1693,Replaced concatenated tfm with zero step by single tfm.
+56,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8245,1693,Replaced concatenated tfm with zero step by single tfm.
+57,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8574,1694,Replaced concatenated tfm with zero step by single tfm.
+58,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8575,1695,Replaced concatenated tfm with zero step by single tfm.
+59,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8566,1696,Replaced concatenated tfm with zero step by single tfm.
+60,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8421,1697,Replaced concatenated tfm with zero step by single tfm.
+61,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8388,1698,Replaced concatenated tfm with zero step by single tfm.
+62,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8390,1699,Replaced concatenated tfm with zero step by single tfm.
+63,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8392,1700,Replaced concatenated tfm with zero step by single tfm.
+64,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8422,1702,Replaced concatenated tfm with zero step by single tfm.
+65,2001-08-15 00:00:00,2001.226,Coordinate_Operation,8215,1683,Replaced concatenated tfm with zero step by single tfm.
+66,2001-08-15 00:00:00,2001.226,Coordinate_Operation,8217,1684,Replaced concatenated tfm with zero step by single tfm.
+67,2001-08-15 00:00:00,2001.226,Coordinate_Operation,8219,1685,Replaced concatenated tfm with zero step by single tfm.
+68,2001-08-15 00:00:00,2001.226,Coordinate_Operation,8221,1686,Replaced concatenated tfm with zero step by single tfm.
+69,2001-08-15 00:00:00,2001.226,Coordinate_Operation,8223,1687,Replaced concatenated tfm with zero step by single tfm.
+70,2001-08-15 00:00:00,2001.225,Coordinate_Operation,8530,1682,Replaced concatenated tfm with zero step by single tfm.
+71,2001-06-05 00:00:00,2001.18,Coordinate Reference System,31267,31277,ProjCRS related to inappropriate projection (coordinate operation) and CS resulting in incorrect scale factor and axes order and abbreviation.
+72,2001-06-05 00:00:00,2001.18,Coordinate Reference System,31268,31278,ProjCRS related to inappropriate projection (coordinate operation) and CS resulting in incorrect scale factor and axes order and abbreviation.
+73,2001-08-28 00:00:00,2001.31,Coordinate Reference System,31278,31279,ProjCRS related to incorrect projection.
+74,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31291,31281,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+75,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31292,31282,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+76,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31293,31283,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+77,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31294,31284,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+78,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31295,31285,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+79,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31296,31286,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+80,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31297,31287,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+81,2001-06-05 00:00:00,2001.183,Coordinate_Operation,1471,1618,Error in signs of all transformation parameter values and for scale factor also incorrect units.
+82,2001-08-15 00:00:00,2001.122,Coordinate_Operation,1310,1674,Change of source CRS.
+83,2001-08-28 00:00:00,2001.4,Coordinate_Operation,8497,,Invalid concatenation: area of use of steps 1 and 2 do not overlap.
+84,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1258,1755,Correction to name.
+85,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1259,1756,Correction to name.
+86,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1261,1757,Correction to name.
+87,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1263,1758,Correction to name.
+88,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1268,1759,Correction to name.
+89,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1269,1760,Correction to name.
+90,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1270,1761,Correction to name.
+91,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1466,1762,Correction to name.
+92,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1467,1763,Correction to name.
+93,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1468,1764,Correction to name.
+94,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1519,1765,Correction to name.
+95,2001-08-28 00:00:00,2001.38,Coordinate_Operation,1534,1754,Incorrect unit assigned to scale difference parameter value.
+96,2001-08-28 00:00:00,2001.35,Coordinate_Operation,1602,1752,Incorrect source geogCRS code assigned.
+97,2001-08-28 00:00:00,2001.34,Coordinate_Operation,1571,1751,Incorrect source and target geogCRS codes assigned.
+98,2001-08-28 00:00:00,2001.23,Coordinate_Operation,1567,1701,Incorrect parameter value for z-axis rotation.
+99,2001-08-15 00:00:00,2001.228,Coordinate_Operation,8386,8582,Changed second step from zero to HARN.
+100,2001-08-15 00:00:00,2001.228,Coordinate_Operation,8402,8583,Changed second step from zero to HARN.
+101,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8418,1688,Replaced concatenated tfm with zero step by single tfm.
+102,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8419,1689,Replaced concatenated tfm with zero step by single tfm.
+103,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8406,1690,Replaced concatenated tfm with zero step by single tfm.
+104,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8394,1691,Replaced concatenated tfm with zero step by single tfm.
+105,2001-11-06 00:00:00,2001.48,Coordinate_Operation,19908,19972,Change name.
+106,2001-08-28 00:00:00,2001.48,Coordinate Reference System,29900,29902,Change name.
+107,2001-06-05 00:00:00,2001.181,Area,1628,,Invalid area - country does not extend into this longitude range..
+108,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8420,1703,Replaced concatenated tfm with zero step by single tfm.
+109,2001-08-28 00:00:00,2001.32,Coordinate Reference System,2155,2194,Dependent upon deprecated coordinate operation 15300.
+112,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8190,1666,Replaced concatenated tfms with zero step by single tfm with 1m accuracy.
+117,1997-11-13 00:00:00,97.372,Datum,5107,5120,Replace this general name to specific.
+135,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8190,1667,Replaced concatenated tfms with zero step by single tfm with 1m accuracy.
+142,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8578,1666,Replaced concatenated tfm with zero step by single tfms with 1m accuracy.
+160,2001-08-28 00:00:00,2001.47,Datum,6226,6143,Does not exist except as an alias of 6142 and 6143.
+161,2001-06-05 00:00:00,2001.11,Coordinate Reference System,4226,4143,Does not exist except as an alias of 4142 and 4143.
+229,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8190,1668,Replaced concatenated tfms with zero step by single tfm with 1m accuracy.
+233,1997-11-13 00:00:00,97.372,Datum,5107,5119,Replace this general name to specific.
+237,2001-11-06 00:00:00,2001.53,Datum,6172,6190,Original name POSGAR is ambiguous given 1994 and 1998 adjustments.
+240,2001-11-06 00:00:00,2001.53,Coordinate Reference System,4172,4190,Original name POSGAR is ambiguous given 1994 and 1998 adjustments.
+242,2001-11-06 00:00:00,2001.53,Coordinate_Operation,1598,1773,Dependent upon deprecated source CRS 4172.
+244,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27581,27571,Changed projCRS name.
+245,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27582,27572,Changed projCRS name.
+246,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27583,27573,Changed projCRS name.
+247,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27584,27574,Changed projCRS name.
+248,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27591,27561,Changed projCRS name.
+249,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27592,27562,Changed projCRS name.
+250,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27593,27563,Changed projCRS name.
+251,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27594,27564,Changed projCRS name.
+260,2001-11-06 00:00:00,2001.54,Coordinate Reference System,7401,7411,Dependent projCRS name changed.
+261,2001-11-06 00:00:00,2001.54,Coordinate Reference System,7402,7412,Dependent projCRS name changed.
+262,2001-11-06 00:00:00,2001.54,Coordinate Reference System,7403,7413,Dependent projCRS name changed.
+266,2001-01-21 00:00:00,2001.15,Ellipsoid,7006,7046,Change of axis unit from International metre to German Legal Metre to reflect local usage.
+268,2001-11-06 00:00:00,2001.45,Coordinate Reference System,32036,2204,Dependent map projection 11631 in error.
+270,2001-11-06 00:00:00,2001.45,Coordinate Reference System,26979,2205,Dependent map projection 14100 in error.
+272,2002-01-18 00:00:00,2001.03,Coordinate_Operation,1656,,EPSG copy of ITRF transformation superseded by tfm code 1791.
+273,2002-01-18 00:00:00,2001.03,Coordinate_Operation,1658,,EPSG copy of ITRF transformation superseded by tfm code 1793.
+274,2002-01-18 00:00:00,2002.01,Datum,6228,6192,Incorrect ellipsoid attached.
+276,2002-01-18 00:00:00,2002.01,Datum,6260,6193,Incorrect ellipsoid attached.
+278,2002-01-18 00:00:00,2002.01,Coordinate Reference System,4228,4192,Dependent datum 6228 in error.
+280,2002-01-18 00:00:00,2002.01,Coordinate Reference System,4260,4193,Dependent datum 6260 in error.
+282,2002-01-18 00:00:00,2002.01,Coordinate Reference System,22832,2214,Dependent geogCRS 4228 deprecated due to datum error.
+285,2002-01-18 00:00:00,2001.17,Datum,6287,6194,Change of name.
+287,2002-01-18 00:00:00,2001.17,Coordinate Reference System,4287,4194,Change of name (adjustment date added).
+288,2002-01-18 00:00:00,2001.17,Coordinate_Operation,1211,1797,Dependent source CRS name changed.
+289,2002-02-12 00:00:00,2002.06,Coordinate_Operation,1559,1593,8-bit binary grid file format inconsistent with NTv2 16-bit format.
+290,2002-02-12 00:00:00,2002.01,Datum,6234,6197,Incorrect ellipsoid attached.
+291,2002-02-12 00:00:00,2002.21,Coordinate Reference System,32074,32064,Change name to include unit abbreviation per US State Plane CRSs.
+294,2002-02-12 00:00:00,2002.21,Coordinate Reference System,32075,32065,Change name to include unit abbreviation per US State Plane CRSs.
+295,2002-02-12 00:00:00,2002.21,Coordinate Reference System,32076,32066,Change name to include unit abbreviation per US State Plane CRSs.
+296,2002-02-12 00:00:00,2002.21,Coordinate Reference System,32077,32067,Change name to include unit abbreviation per US State Plane CRSs.
+297,2002-03-15 00:00:00,2002.29,Coordinate_Operation,1819,1754,Duplication of data already given in transformation 1754.
+298,2002-06-22 00:00:00,2002.16,Coordinate Reference System,5704,5736,Change of name following readjustment.
+299,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21473,21453,Change of CRS name to indicate longitude of origin.
+300,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21474,21454,Change of CRS name to indicate longitude of origin.
+301,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21475,21455,Change of CRS name to indicate longitude of origin.
+302,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21476,21456,Change of CRS name to indicate longitude of origin.
+303,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21477,21457,Change of CRS name to indicate longitude of origin.
+304,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21478,21458,Change of CRS name to indicate longitude of origin.
+305,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21479,21459,Change of CRS name to indicate longitude of origin.
+306,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21480,21460,Change of CRS name to indicate longitude of origin.
+307,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21481,21461,Change of CRS name to indicate longitude of origin.
+308,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21482,21462,Change of CRS name to indicate longitude of origin.
+309,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21483,21463,Change of CRS name to indicate longitude of origin.
+311,2002-06-22 00:00:00,2002.36,Coordinate Reference System,2199,2462,Added hyphen to Gauss-Kruger in CRS name.
+312,2002-06-22 00:00:00,2002.36,Coordinate Reference System,2166,2397,Added hyphen to Gauss-Kruger in CRS name.
+313,2002-06-22 00:00:00,2002.36,Coordinate Reference System,2167,2398,Added hyphen to Gauss-Kruger in CRS name.
+314,2002-06-22 00:00:00,2002.36,Coordinate Reference System,2168,2399,Added hyphen to Gauss-Kruger in CRS name.
+315,2002-06-22 00:00:00,2002.36,Coordinate Reference System,2091,2395,Added hyphen to Gauss-Kruger in CRS name.
+316,2002-06-22 00:00:00,2002.36,Coordinate Reference System,2092,2396,Added hyphen to Gauss-Kruger in CRS name.
+317,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20092,2491,Change of CRS name to indicate longitude of origin.
+318,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20091,2490,Change of CRS name to indicate longitude of origin.
+319,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20090,2489,Change of CRS name to indicate longitude of origin.
+320,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20089,2488,Change of CRS name to indicate longitude of origin.
+321,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20088,2487,Change of CRS name to indicate longitude of origin.
+322,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20087,2486,Change of CRS name to indicate longitude of origin.
+323,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20086,2485,Change of CRS name to indicate longitude of origin.
+324,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20085,2484,Change of CRS name to indicate longitude of origin.
+325,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20084,2483,Change of CRS name to indicate longitude of origin.
+326,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20083,2482,Change of CRS name to indicate longitude of origin.
+327,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20082,2481,Change of CRS name to indicate longitude of origin.
+328,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20081,2480,Change of CRS name to indicate longitude of origin.
+329,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20080,2479,Change of CRS name to indicate longitude of origin.
+330,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20079,2478,Change of CRS name to indicate longitude of origin.
+331,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20078,2477,Change of CRS name to indicate longitude of origin.
+332,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20077,2476,Change of CRS name to indicate longitude of origin.
+333,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20076,2475,Change of CRS name to indicate longitude of origin.
+334,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20075,2474,Change of CRS name to indicate longitude of origin.
+335,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20074,2473,Change of CRS name to indicate longitude of origin.
+336,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20073,2472,Change of CRS name to indicate longitude of origin.
+337,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20072,2471,Change of CRS name to indicate longitude of origin.
+338,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20071,2470,Change of CRS name to indicate longitude of origin.
+339,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20070,2469,Change of CRS name to indicate longitude of origin.
+340,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20069,2468,Change of CRS name to indicate longitude of origin.
+341,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20068,2467,Change of CRS name to indicate longitude of origin.
+342,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20067,2466,Change of CRS name to indicate longitude of origin.
+343,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20066,2465,Change of CRS name to indicate longitude of origin.
+344,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20065,2464,Change of CRS name to indicate longitude of origin.
+345,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20064,2463,Change of CRS name to indicate longitude of origin.
+346,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28462,2492,Change of CRS name to indicate longitude of origin.
+347,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28463,2493,Change of CRS name to indicate longitude of origin.
+348,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28464,2494,Change of CRS name to indicate longitude of origin.
+349,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28465,2495,Change of CRS name to indicate longitude of origin.
+350,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28466,2496,Change of CRS name to indicate longitude of origin.
+351,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28467,2497,Change of CRS name to indicate longitude of origin.
+352,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28468,2498,Change of CRS name to indicate longitude of origin.
+353,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28469,2499,Change of CRS name to indicate longitude of origin.
+354,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28470,2500,Change of CRS name to indicate longitude of origin.
+355,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28471,2501,Change of CRS name to indicate longitude of origin.
+356,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28472,2502,Change of CRS name to indicate longitude of origin.
+357,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28473,2503,Change of CRS name to indicate longitude of origin.
+358,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28474,2504,Change of CRS name to indicate longitude of origin.
+359,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28475,2505,Change of CRS name to indicate longitude of origin.
+360,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28476,2506,Change of CRS name to indicate longitude of origin.
+361,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28477,2507,Change of CRS name to indicate longitude of origin.
+362,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28478,2508,Change of CRS name to indicate longitude of origin.
+363,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28479,2509,Change of CRS name to indicate longitude of origin.
+364,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28480,2510,Change of CRS name to indicate longitude of origin.
+365,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28481,2511,Change of CRS name to indicate longitude of origin.
+366,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28482,2512,Change of CRS name to indicate longitude of origin.
+367,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28483,2513,Change of CRS name to indicate longitude of origin.
+368,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28484,2514,Change of CRS name to indicate longitude of origin.
+369,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28485,2515,Change of CRS name to indicate longitude of origin.
+370,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28486,2516,Change of CRS name to indicate longitude of origin.
+371,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28487,2517,Change of CRS name to indicate longitude of origin.
+372,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28488,2518,Change of CRS name to indicate longitude of origin.
+373,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28489,2519,Change of CRS name to indicate longitude of origin.
+374,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28490,2520,Change of CRS name to indicate longitude of origin.
+375,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28491,2521,Change of CRS name to indicate longitude of origin.
+376,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28492,2522,Change of CRS name to indicate longitude of origin.
+377,2002-06-22 00:00:00,2002.32,Coordinate_Operation,1316,1796,Change of source CRS name.
+378,2002-06-22 00:00:00,2002.4,Coordinate_Operation,1335,1827,Incorrect unit for latitude offset.
+379,2002-06-22 00:00:00,2002.37,Coordinate_Operation,1273,1829,Incorrect sign of transformation parameter values for direction of transformation.
+380,2002-06-22 00:00:00,2002.37,Coordinate_Operation,1677,1830,Error in in sign of dX relative to source transformation 1273. Incorrect sign of transformation parameter values (other than dX) for direction of transformation.
+381,2002-06-22 00:00:00,2002.151,Datum,6294,6613,Change of spelling of name.
+382,2002-06-22 00:00:00,2002.151,Coordinate Reference System,4294,4613,Change of spelling of name.
+383,2002-06-22 00:00:00,2002.151,Coordinate_Operation,1286,1834,Change of spelling of name of source CRS.
+384,2002-06-22 00:00:00,2002.151,Datum,6125,6613,Not a self-standing datum but an extension of the Segara datum.
+385,2002-06-22 00:00:00,2002.151,Coordinate Reference System,4125,4613,Samboja is not a separate geogCRS but an extension of the Segara CRS.
+386,2002-06-22 00:00:00,2002.151,Coordinate_Operation,1282,1838,Change of name of source CRS
+387,2002-06-22 00:00:00,2002.151,Coordinate Reference System,2550,2933,Change name of source geogCRS.
+388,2002-07-13 00:00:00,2002.25,Datum,6185,6615,Information from Portugal suggests EuroGeographics information is incomplete.
+389,2002-07-13 00:00:00,2002.25,Datum,6185,6616,Information from Portugal suggests EuroGeographics information is incomplete.
+390,2002-07-13 00:00:00,2002.25,Coordinate Reference System,4185,4615,Information from Portugal suggests EuroGeographics information is incomplete.
+391,2002-07-13 00:00:00,2002.25,Coordinate Reference System,4185,4616,Information from Portugal suggests EuroGeographics information is incomplete.
+392,2002-07-13 00:00:00,2002.25,Coordinate Reference System,2191,2942,Information from Portugal suggests EuroGeographics information is incomplete.
+393,2002-07-13 00:00:00,2002.25,Coordinate Reference System,2191,2943,Information from Portugal suggests EuroGeographics information is incomplete.
+394,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1473,1842,Change of Source CRS name
+395,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1472,1841,Change in Target CRS name.
+396,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1599,1846,Change in Target CRS name.
+397,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1574,1844,Change in Target CRS name.
+398,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1600,1847,Change in Target CRS name.
+399,2002-07-13 00:00:00,2002.41,Coordinate_Operation,8584,8635,Change in Target CRS name.
+400,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1576,1845,Change in Target CRS name.
+401,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1572,1843,Change in Target CRS name.
+402,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1601,1848,Change in Target CRS name.
+403,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1752,1849,Change in Target CRS name.
+404,2002-07-13 00:00:00,2002.41,Coordinate Reference System,4140,4617,Change of CRS name to accord with revised Geomatics Canada practice.
+405,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2147,2952,Change of geogCRS name to accord with revised Geomatics Canada practice.
+406,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2140,2945,Change of geogCRS name to accord with revised Geomatics Canada practice.
+407,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2141,2946,Change of geogCRS name to accord with revised Geomatics Canada practice.
+408,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2142,2947,Change of geogCRS name to accord with revised Geomatics Canada practice.
+409,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2143,2948,Change of geogCRS name to accord with revised Geomatics Canada practice.
+410,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2144,2949,Change of geogCRS name to accord with revised Geomatics Canada practice.
+411,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2145,2950,Change of geogCRS name to accord with revised Geomatics Canada practice.
+412,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2146,2951,Change of geogCRS name to accord with revised Geomatics Canada practice.
+413,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2036,2953,Change of geogCRS name to accord with revised Geomatics Canada practice.
+414,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2292,2954,Change of geogCRS name to accord with revised Geomatics Canada practice.
+415,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2139,2944,Change of geogCRS name to accord with revised Geomatics Canada practice.
+416,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2153,2955,Change of geogCRS name to accord with revised Geomatics Canada practice.
+417,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2152,2956,Change of geogCRS name to accord with revised Geomatics Canada practice.
+418,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2151,2957,Change of geogCRS name to accord with revised Geomatics Canada practice.
+419,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2150,2958,Change of geogCRS name to accord with revised Geomatics Canada practice.
+420,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2149,2959,Change of geogCRS name to accord with revised Geomatics Canada practice.
+421,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2037,2960,Change of geogCRS name to accord with revised Geomatics Canada practice.
+422,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2038,2961,Change of geogCRS name to accord with revised Geomatics Canada practice.
+423,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2148,2962,Change of geogCRS name to accord with revised Geomatics Canada practice.
+424,2002-02-12 00:00:00,2002.01,Coordinate Reference System,4234,4197,Dependent datum 6228 deprecated due to ellipsoid error.
+425,2002-02-12 00:00:00,2002.01,Coordinate Reference System,23433,2312,Dependent geogCRS 4234 deprecated due to ellipsoid error.
+426,2002-07-13 00:00:00,2002.41,Area,1336,2784,Expansion of area of use.
diff --git a/src/tiff/csv/ellips_alias.c b/src/tiff/csv/ellips_alias.c
new file mode 100644
index 0000000..6cdda23
--- /dev/null
+++ b/src/tiff/csv/ellips_alias.c
@@ -0,0 +1,10 @@
+#include "defs.h"
+datafile_rows_t ellips_alias_row_1[] = {"ELLIPSOID_ALIAS_CODE","ELLIPSOID_ALIAS_NAME","ELLIPSOID_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t ellips_alias_row_2[] = {"7023","International 1967","7036","1996-10-18 00:00:00","","EPSG","Adopted by IUGG 1967 Lucerne. Inverse flattening defined to 2 d.p. More usually known as GRS 1967 to avoid confusion with the International 1924 figure.","96.09",NULL};
+datafile_rows_t ellips_alias_row_3[] = {"7026","NWL 10D","7043","1999-04-22 00:00:00","","EPSG","Used by Transit Broadcast Ephemeris before 1989. Also referred to as WGS72 spheroid.","99.03",NULL};
+datafile_rows_t ellips_alias_row_4[] = {"7037","Clarke Modified 1880","7012","1996-10-18 00:00:00","","EPSG","The Clarke 1880 (RGS) figure is one of several modifications to the original definition. The name Clarke Modified is usually taken to be the RGS modification.","",NULL};
+datafile_rows_t ellips_alias_row_5[] = {"7038","International 1979","7019","1996-10-18 00:00:00","","EPSG","Adopted by IUGG 1979 Canberra as the Geodetic Reference Spheroid of 1980 (GRS 1980).","",NULL};
+datafile_rows_t ellips_alias_row_6[] = {"7039","Hayford 1909","7022","1996-10-18 00:00:00","\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser","EPSG","Described as a=6378388 m. and b=6356909 m. from which 1/f derived to be 296.95926... The figure was adopted as the International ellipsoid in 1924 but with 1/f taken as 297 exactly from which b is derved as 6356911.946 m.","",NULL};
+datafile_rows_t ellips_alias_row_7[] = {"7040","WGS84","7030","1996-10-18 00:00:00","","EPSG","","",NULL};
+
+datafile_rows_t *ellips_alias_rows[] = {ellips_alias_row_1,ellips_alias_row_2,ellips_alias_row_3,ellips_alias_row_4,ellips_alias_row_5,ellips_alias_row_6,ellips_alias_row_7,NULL};
diff --git a/src/tiff/csv/ellips_alias.csv b/src/tiff/csv/ellips_alias.csv
new file mode 100644
index 0000000..22ae710
--- /dev/null
+++ b/src/tiff/csv/ellips_alias.csv
@@ -0,0 +1,7 @@
+"ELLIPSOID_ALIAS_CODE","ELLIPSOID_ALIAS_NAME","ELLIPSOID_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+7023,International 1967,7036,1996-10-18 00:00:00,,EPSG,Adopted by IUGG 1967 Lucerne. Inverse flattening defined to 2 d.p. More usually known as GRS 1967 to avoid confusion with the International 1924 figure.,96.09
+7026,NWL 10D,7043,1999-04-22 00:00:00,,EPSG,Used by Transit Broadcast Ephemeris before 1989. Also referred to as WGS72 spheroid.,99.03
+7037,Clarke Modified 1880,7012,1996-10-18 00:00:00,,EPSG,The Clarke 1880 (RGS) figure is one of several modifications to the original definition. The name Clarke Modified is usually taken to be the RGS modification.,
+7038,International 1979,7019,1996-10-18 00:00:00,,EPSG,Adopted by IUGG 1979 Canberra as the Geodetic Reference Spheroid of 1980 (GRS 1980).,
+7039,Hayford 1909,7022,1996-10-18 00:00:00,"\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser",EPSG,Described as a=6378388 m. and b=6356909 m. from which 1/f derived to be 296.95926... The figure was adopted as the International ellipsoid in 1924 but with 1/f taken as 297 exactly from which b is derved as 6356911.946 m.,
+7040,WGS84,7030,1996-10-18 00:00:00,,EPSG,,
diff --git a/src/tiff/csv/ellipsoid.c b/src/tiff/csv/ellipsoid.c
new file mode 100644
index 0000000..35c6e2e
--- /dev/null
+++ b/src/tiff/csv/ellipsoid.c
@@ -0,0 +1,42 @@
+#include "defs.h"
+datafile_rows_t ellipsoid_row_1[] = {"ELLIPSOID_CODE","ELLIPSOID_EPSG_NAME","ELLIPSOID_USER_NAME","SEMI_MAJOR_AXIS","UOM_LENGTH_CODE","INV_FLATTENING","SEMI_MINOR_AXIS","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t ellipsoid_row_2[] = {"7001","Airy 1830","","6377563.396","9001","299.3249646","","1995-06-02 00:00:00","Ordnance Survey of Great Britain.","EPSG","Original definition is a=20923713 and b=20853810 feet of 1796. For the 1936 retriangulation OSGB defines the relationship of feet of 1796 to the International metre through log(1.48401603) exactly [=0.3048007491...]. 1/f is given to 7 decimal places.","98.321 98.34",NULL};
+datafile_rows_t ellipsoid_row_3[] = {"7002","Airy Modified 1849","","6377340.189","9001","299.3249646","","1995-06-02 00:00:00","","EPSG","OSGB Airy 1830 figure rescaled by 1.000035 to best fit the primary triangulation of Ireland.","98.321",NULL};
+datafile_rows_t ellipsoid_row_4[] = {"7003","Australian National Spheroid","","6378160.0","9001","298.25","","1995-06-02 00:00:00","\"Australian Map Grid Technical Manual\"; National Mapping Council of Australia Special Publication #7; 1972","EPSG","Based on the GRS 1967 figure but with 1/f taken to 2 decimal places exactly.","",NULL};
+datafile_rows_t ellipsoid_row_5[] = {"7004","Bessel 1841","","6377397.155","9001","299.1528128","","1999-04-22 00:00:00","US Army Map Service Technical Manual; 1943.","EPSG","Original Bessel definition is a=3272077.14 and b=3261139.33 toise. This used a weighted mean of values from several authors but did not account for differences in the length of the various toise: the \"Bessel toise\" is therefore of uncertain length.","98.321 98.34",NULL};
+datafile_rows_t ellipsoid_row_6[] = {"7005","Bessel Modified","","6377492.018","9001","299.1528128","","1999-04-22 00:00:00","","EPSG","Used in Norway and also in Sweden with a 1mm increase in semi-major axis.","98.321",NULL};
+datafile_rows_t ellipsoid_row_7[] = {"7006","Bessel Namibia","","6377483.865","9001","299.1528128","","1999-04-22 00:00:00","","EPSG","a = 6377397.155 German legal metres. This is the same value as the Bessel 1841 figure (code 7004) but in different units. Used in Namibia.","97.16",NULL};
+datafile_rows_t ellipsoid_row_8[] = {"7007","Clarke 1858","","20926348.0","9005","","20855233.0","1995-06-02 00:00:00","\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser.","EPSG","Clarke's 1858/II solution. Derived parameters: a = 6378293.645m using his 1865 ratio of 0.304797265 feet per metre; 1/f = 294.26068� In historic usage in Australia 1/f taken to two decimal places (294.26 exactly); elsewhere a and b used to derive 1/f.","99.70",NULL};
+datafile_rows_t ellipsoid_row_9[] = {"7008","Clarke 1866","","6378206.4","9001","","6356583.8","1995-06-02 00:00:00","US Army Map Service Technical Manual No. 7; 1943.","EPSG","Original definition a=20926062 and b=20855121 (British) feet. Uses Clarke's 1865 inch-metre ratio of 39.370432 to obtain metres. (Metric value then converted to US survey feet for use in the United States using 39.37 exactly giving a=20925832.16 ft US).","98.34",NULL};
+datafile_rows_t ellipsoid_row_10[] = {"7009","Clarke 1866 Michigan","","20926631.531","9003","","20855688.674","1995-06-02 00:00:00","USGS Professional Paper #1395.","EPSG","Used for Michigan NAD27 State Plane zones. Radius = ellipsoid radius + 800 feet; this approximates the average elevation of the state. Derived parameter: 1/f = 294.97870","98.22",NULL};
+datafile_rows_t ellipsoid_row_11[] = {"7010","Clarke 1880 (Benoit)","","6378300.789","9001","","6356566.435","1995-06-02 00:00:00","","EPSG","Adopts Clarke's values for a and b. Uses Benoit's 1895 ratio of 0.9143992 metres per yard to convert to metres.","",NULL};
+datafile_rows_t ellipsoid_row_12[] = {"7011","Clarke 1880 (IGN)","","6378249.2","9001","","6356515.0","1998-04-16 00:00:00","","EPSG","Adopts Clarke's values for a and b using his 1865 ratio of 39.370432 inches per metre to convert axes to metres.","98.12",NULL};
+datafile_rows_t ellipsoid_row_13[] = {"7012","Clarke 1880 (RGS)","","6378249.145","9001","293.465","","1995-06-02 00:00:00","Empire Survey Review #32; 1939.","EPSG","Adopts Clarke's values for a and 1/f. Adopts his 1865 ratio of 39.370432 inches per metre to convert semi-major axis to metres. Also known as Clarke Modified 1880.","",NULL};
+datafile_rows_t ellipsoid_row_14[] = {"7013","Clarke 1880 (Arc)","","6378249.145","9001","293.4663077","","1999-04-22 00:00:00","","EPSG","Adopts Clarke's value for a with derived 1/f. Uses his 1865 ratio of 39.370432 inch per metre to convert semi-major axis to metres.","",NULL};
+datafile_rows_t ellipsoid_row_15[] = {"7014","Clarke 1880 (SGA 1922)","","6378249.2","9001","293.46598","","1995-06-02 00:00:00","","EPSG","Used in Old French Triangulation (ATF). Uses Clarke's 1865 inch-metre ratio of 39.370432 to convert axes to metres.","",NULL};
+datafile_rows_t ellipsoid_row_16[] = {"7015","Everest 1830 (1937 Adjustment)","","6377276.345","9001","300.8017","","1996-10-18 00:00:00","Survey of India professional paper #28; 1939","EPSG","Used for the 1937 readjustment of Indian triangulation. Clarke's 1865 Indian-British foot ratio (0.99999566) and Benoit's 1898 British inch-metre ratio (39.370113) rounded as 0.30479841 exactly and applied to Everest's 1830 definition taken as a and 1/f","96.20",NULL};
+datafile_rows_t ellipsoid_row_17[] = {"7016","Everest 1830 (1967 Definition)","","6377298.556","9001","300.8017","","1995-06-02 00:00:00","","EPSG","Adopted 1967 for use in East Malaysia. Applies Sears 1922 inch-metre ratio of 39.370147 to Everest 1830 original definition of a and 1/f but with a taken to be in British rather than Indian feet.","",NULL};
+datafile_rows_t ellipsoid_row_18[] = {"7018","Everest 1830 Modified","","6377304.063","9001","300.8017","","1995-06-02 00:00:00","","EPSG","Adopted 1967 for use in West Malaysia. Applies Benoit 1898 inch-metre ratio of 39.370113 to Everest 1830 original definition of a and 1/f but with a taken to be in British rather than Indian feet.","",NULL};
+datafile_rows_t ellipsoid_row_19[] = {"7019","GRS 1980","","6378137.0","9001","298.257222101","","1998-11-11 00:00:00","\"Geodetic Reference System 1980\" by H. Moritz; Bulletin Geodesique","EPSG","Adopted by IUGG 1979 Canberra. Inverse flattening is derived from geocentric gravitational constant GM = 3986005e8 m*m*m/s/s; dynamic form factor J2 = 108263e8 and Earth's angular velocity = 7292115e-11 rad/s.","98.11 98.32",NULL};
+datafile_rows_t ellipsoid_row_20[] = {"7020","Helmert 1906","","6378200.0","9001","298.3","","1995-06-02 00:00:00","\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser","EPSG","Helmert 1906/III solution.","",NULL};
+datafile_rows_t ellipsoid_row_21[] = {"7021","Indonesian National Spheroid","","6378160.0","9001","298.247","","1995-06-02 00:00:00","Rais paper.","EPSG","Based on the GRS 1967 figure but with 1/f taken to 3 decimal places exactly.","",NULL};
+datafile_rows_t ellipsoid_row_22[] = {"7022","International 1924","","6378388.0","9001","297.0","","1995-06-02 00:00:00","","EPSG","Adopted by IUGG 1924 in Madrid. Based on Hayford 1909/1910 figures.","",NULL};
+datafile_rows_t ellipsoid_row_23[] = {"7024","Krassowsky 1940","","6378245.0","9001","298.3","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t ellipsoid_row_24[] = {"7025","NWL 9D","","6378145.0","9001","298.25","","1995-06-02 00:00:00","","EPSG","Used by Transit Precise Ephemeris between October 1971 and January 1987.","",NULL};
+datafile_rows_t ellipsoid_row_25[] = {"7027","Plessis 1817","","6376523.0","9001","308.64","","1995-06-02 00:00:00","IGN Paris \"Constants d'Ellipsoides\" February 1972.","EPSG","Rescaling of Delambre 1810 figure (a=6376985 m) to make meridional arc from equator to pole equal to 10000000 metres exactly. (Ref: Strasser).","",NULL};
+datafile_rows_t ellipsoid_row_26[] = {"7028","Struve 1860","","6378298.3","9001","294.73","","1998-11-11 00:00:00","\"Geodesia y Cartografia Matematica\" by Fernando Martin Asin; ISBN 84-398-0248-X.","EPSG","Original definition of semi-major axis given as 3272539 toise. In \"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" , Strasser suggests a conversion factor of 1.94903631 which gives a=6378297.337 metres.","98.07 98.34",NULL};
+datafile_rows_t ellipsoid_row_27[] = {"7029","War Office","","6378300.583","9001","296.0","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t ellipsoid_row_28[] = {"7030","WGS 84","","6378137.0","9001","298.257223563","","1998-11-11 00:00:00","DMA Technical Manual 8350.2-B","EPSG","Inverse flattening derived from four defining parameters (semi-major axis; C20 = -484.16685*10e-6; earth's angular velocity w = 7292115e11 rad/sec; gravitational constant GM = 3986005e8 m*m*m/s/s).","98.32",NULL};
+datafile_rows_t ellipsoid_row_29[] = {"7031","GEM 10C","","6378137.0","9001","298.257223563","","1995-06-02 00:00:00","","EPSG","Used for GEM 10C Gravity Potential Model.","98.32",NULL};
+datafile_rows_t ellipsoid_row_30[] = {"7032","OSU86F","","6378136.2","9001","298.257223563","","1995-06-02 00:00:00","","EPSG","Used for OSU86 gravity potential (geoidal) model.","98.32",NULL};
+datafile_rows_t ellipsoid_row_31[] = {"7033","OSU91A","","6378136.3","9001","298.257223563","","1995-06-02 00:00:00","","EPSG","Used for OSU91 gravity potential (geoidal) model.","98.32",NULL};
+datafile_rows_t ellipsoid_row_32[] = {"7034","Clarke 1880","","20926202.0","9005","293.465","20854895.0","1995-06-02 00:00:00","\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser.","EPSG","Clarke gave a and b and also 1/f=293.465 (to 3 decimal places). 1/f derived from a and b = 293.4663077�","",NULL};
+datafile_rows_t ellipsoid_row_33[] = {"7035","Sphere","","6371000.0","9001","","6371000.0","1995-06-02 00:00:00","","EPSG","Authalic sphere. 1/f is infinite.","",NULL};
+datafile_rows_t ellipsoid_row_34[] = {"7036","GRS 1967","","6378160.0","9001","298.247167427","","1998-11-11 00:00:00","\"Geodetic Reference System 1967\"; International Association of Geodesy special publication number 3; August 1971.","EPSG","Adopted by IUGG 1967 Lucerne. Inverse flattening given is derived from geocentric gravitational constant (GM)= 398603e9 m*m*m/s/s; dynamic form factor (J2) = 0.0010827 and Earth's angular velocity w = 7.2921151467e-5 rad/s.","96.09 97.252 98.32 [...]
+datafile_rows_t ellipsoid_row_35[] = {"7041","Average Terrestrial System 1977","","6378135.0","9001","298.257","","1997-07-22 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual","EPSG","","98.321",NULL};
+datafile_rows_t ellipsoid_row_36[] = {"7042","Everest (1830 Definition)","","20922931.8","9080","300.8017","20853374.58","1999-10-20 00:00:00","\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser","EPSG","Everest gave a and b to 2 decimal places and also 1/f=300.8017 (to 4 decimal places).","97.23",NULL};
+datafile_rows_t ellipsoid_row_37[] = {"7043","WGS 72","","6378135.0","9001","298.26","","1999-04-22 00:00:00","","EPSG","","99.03",NULL};
+datafile_rows_t ellipsoid_row_38[] = {"7044","Everest 1830 (1962 Definition)","","6377301.243","9001","300.8017255","","1999-10-20 00:00:00","","EPSG","Used by Pakistan since metrication. Clarke's 1865 Indian foot-British foot ratio (0.99999566) and his 1865 British inch-metre ratio (39.369971) rounded with slight error as 1 Ind ft = 0.3047995m exactly and applied to Everest's 1830 definition of a & b.","",NULL};
+datafile_rows_t ellipsoid_row_39[] = {"7045","Everest 1830 (1975 Definition)","","6377299.151","9001","300.8017255","","1999-10-20 00:00:00","","EPSG","Used by India since metrication. Clarke's 1865 Indian foot-British foot ratio (0.99999566) and his 1865 British inch-metre ratio (39.369971) rounded as 1 Ind ft = 0.3047995m exactly applied to Everest's 1830 original definition taken as a and b.","",NULL};
+
+datafile_rows_t *ellipsoid_rows[] = {ellipsoid_row_1,ellipsoid_row_2,ellipsoid_row_3,ellipsoid_row_4,ellipsoid_row_5,ellipsoid_row_6,ellipsoid_row_7,ellipsoid_row_8,ellipsoid_row_9,ellipsoid_row_10,ellipsoid_row_11,ellipsoid_row_12,ellipsoid_row_13,ellipsoid_row_14,ellipsoid_row_15,ellipsoid_row_16,ellipsoid_row_17,ellipsoid_row_18,ellipsoid_row_19,ellipsoid_row_20,ellipsoid_row_21,ellipsoid_row_22,ellipsoid_row_23,ellipsoid_row_24,ellipsoid_row_25,ellipsoid_row_26,ellipsoid_row_27,ellip [...]
diff --git a/src/tiff/csv/ellipsoid.csv b/src/tiff/csv/ellipsoid.csv
new file mode 100644
index 0000000..ca0cda9
--- /dev/null
+++ b/src/tiff/csv/ellipsoid.csv
@@ -0,0 +1,39 @@
+"ELLIPSOID_CODE","ELLIPSOID_EPSG_NAME","ELLIPSOID_USER_NAME","SEMI_MAJOR_AXIS","UOM_LENGTH_CODE","INV_FLATTENING","SEMI_MINOR_AXIS","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+7001,Airy 1830,,6377563.396,9001,299.3249646,,1995-06-02 00:00:00,Ordnance Survey of Great Britain.,EPSG,Original definition is a=20923713 and b=20853810 feet of 1796. For the 1936 retriangulation OSGB defines the relationship of feet of 1796 to the International metre through log(1.48401603) exactly [=0.3048007491...]. 1/f is given to 7 decimal places.,98.321 98.34
+7002,Airy Modified 1849,,6377340.189,9001,299.3249646,,1995-06-02 00:00:00,,EPSG,OSGB Airy 1830 figure rescaled by 1.000035 to best fit the primary triangulation of Ireland.,98.321
+7003,Australian National Spheroid,,6378160.0,9001,298.25,,1995-06-02 00:00:00,"\"Australian Map Grid Technical Manual\"; National Mapping Council of Australia Special Publication #7; 1972",EPSG,Based on the GRS 1967 figure but with 1/f taken to 2 decimal places exactly.,
+7004,Bessel 1841,,6377397.155,9001,299.1528128,,1999-04-22 00:00:00,US Army Map Service Technical Manual; 1943.,EPSG,"Original Bessel definition is a=3272077.14 and b=3261139.33 toise. This used a weighted mean of values from several authors but did not account for differences in the length of the various toise: the \"Bessel toise\" is therefore of uncertain length.",98.321 98.34
+7005,Bessel Modified,,6377492.018,9001,299.1528128,,1999-04-22 00:00:00,,EPSG,Used in Norway and also in Sweden with a 1mm increase in semi-major axis.,98.321
+7006,Bessel Namibia,,6377483.865,9001,299.1528128,,1999-04-22 00:00:00,,EPSG,a = 6377397.155 German legal metres. This is the same value as the Bessel 1841 figure (code 7004) but in different units. Used in Namibia.,97.16
+7007,Clarke 1858,,20926348.0,9005,,20855233.0,1995-06-02 00:00:00,"\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser.",EPSG,Clarke's 1858/II solution. Derived parameters: a = 6378293.645m using his 1865 ratio of 0.304797265 feet per metre; 1/f = 294.26068� In historic usage in Australia 1/f taken to two decimal places (294.26 exactly); elsewhere a and b used to derive 1/f.,99.70
+7008,Clarke 1866,,6378206.4,9001,,6356583.8,1995-06-02 00:00:00,US Army Map Service Technical Manual No. 7; 1943.,EPSG,Original definition a=20926062 and b=20855121 (British) feet. Uses Clarke's 1865 inch-metre ratio of 39.370432 to obtain metres. (Metric value then converted to US survey feet for use in the United States using 39.37 exactly giving a=20925832.16 ft US).,98.34
+7009,Clarke 1866 Michigan,,20926631.531,9003,,20855688.674,1995-06-02 00:00:00,USGS Professional Paper #1395.,EPSG,Used for Michigan NAD27 State Plane zones. Radius = ellipsoid radius + 800 feet; this approximates the average elevation of the state. Derived parameter: 1/f = 294.97870,98.22
+7010,Clarke 1880 (Benoit),,6378300.789,9001,,6356566.435,1995-06-02 00:00:00,,EPSG,Adopts Clarke's values for a and b. Uses Benoit's 1895 ratio of 0.9143992 metres per yard to convert to metres.,
+7011,Clarke 1880 (IGN),,6378249.2,9001,,6356515.0,1998-04-16 00:00:00,,EPSG,Adopts Clarke's values for a and b using his 1865 ratio of 39.370432 inches per metre to convert axes to metres.,98.12
+7012,Clarke 1880 (RGS),,6378249.145,9001,293.465,,1995-06-02 00:00:00,Empire Survey Review #32; 1939.,EPSG,Adopts Clarke's values for a and 1/f. Adopts his 1865 ratio of 39.370432 inches per metre to convert semi-major axis to metres. Also known as Clarke Modified 1880.,
+7013,Clarke 1880 (Arc),,6378249.145,9001,293.4663077,,1999-04-22 00:00:00,,EPSG,Adopts Clarke's value for a with derived 1/f. Uses his 1865 ratio of 39.370432 inch per metre to convert semi-major axis to metres.,
+7014,Clarke 1880 (SGA 1922),,6378249.2,9001,293.46598,,1995-06-02 00:00:00,,EPSG,Used in Old French Triangulation (ATF). Uses Clarke's 1865 inch-metre ratio of 39.370432 to convert axes to metres.,
+7015,Everest 1830 (1937 Adjustment),,6377276.345,9001,300.8017,,1996-10-18 00:00:00,Survey of India professional paper #28; 1939,EPSG,Used for the 1937 readjustment of Indian triangulation. Clarke's 1865 Indian-British foot ratio (0.99999566) and Benoit's 1898 British inch-metre ratio (39.370113) rounded as 0.30479841 exactly and applied to Everest's 1830 definition taken as a and 1/f,96.20
+7016,Everest 1830 (1967 Definition),,6377298.556,9001,300.8017,,1995-06-02 00:00:00,,EPSG,Adopted 1967 for use in East Malaysia. Applies Sears 1922 inch-metre ratio of 39.370147 to Everest 1830 original definition of a and 1/f but with a taken to be in British rather than Indian feet.,
+7018,Everest 1830 Modified,,6377304.063,9001,300.8017,,1995-06-02 00:00:00,,EPSG,Adopted 1967 for use in West Malaysia. Applies Benoit 1898 inch-metre ratio of 39.370113 to Everest 1830 original definition of a and 1/f but with a taken to be in British rather than Indian feet.,
+7019,GRS 1980,,6378137.0,9001,298.257222101,,1998-11-11 00:00:00,"\"Geodetic Reference System 1980\" by H. Moritz; Bulletin Geodesique",EPSG,Adopted by IUGG 1979 Canberra. Inverse flattening is derived from geocentric gravitational constant GM = 3986005e8 m*m*m/s/s; dynamic form factor J2 = 108263e8 and Earth's angular velocity = 7292115e-11 rad/s.,98.11 98.32
+7020,Helmert 1906,,6378200.0,9001,298.3,,1995-06-02 00:00:00,"\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser",EPSG,Helmert 1906/III solution.,
+7021,Indonesian National Spheroid,,6378160.0,9001,298.247,,1995-06-02 00:00:00,Rais paper.,EPSG,Based on the GRS 1967 figure but with 1/f taken to 3 decimal places exactly.,
+7022,International 1924,,6378388.0,9001,297.0,,1995-06-02 00:00:00,,EPSG,Adopted by IUGG 1924 in Madrid. Based on Hayford 1909/1910 figures.,
+7024,Krassowsky 1940,,6378245.0,9001,298.3,,1995-06-02 00:00:00,,EPSG,,
+7025,NWL 9D,,6378145.0,9001,298.25,,1995-06-02 00:00:00,,EPSG,Used by Transit Precise Ephemeris between October 1971 and January 1987.,
+7027,Plessis 1817,,6376523.0,9001,308.64,,1995-06-02 00:00:00,"IGN Paris \"Constants d'Ellipsoides\" February 1972.",EPSG,Rescaling of Delambre 1810 figure (a=6376985 m) to make meridional arc from equator to pole equal to 10000000 metres exactly. (Ref: Strasser).,
+7028,Struve 1860,,6378298.3,9001,294.73,,1998-11-11 00:00:00,"\"Geodesia y Cartografia Matematica\" by Fernando Martin Asin; ISBN 84-398-0248-X.",EPSG,"Original definition of semi-major axis given as 3272539 toise. In \"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" , Strasser suggests a conversion factor of 1.94903631 which gives a=6378297.337 metres.",98.07 98.34
+7029,War Office,,6378300.583,9001,296.0,,1995-06-02 00:00:00,,EPSG,,
+7030,WGS 84,,6378137.0,9001,298.257223563,,1998-11-11 00:00:00,DMA Technical Manual 8350.2-B,EPSG,Inverse flattening derived from four defining parameters (semi-major axis; C20 = -484.16685*10e-6; earth's angular velocity w = 7292115e11 rad/sec; gravitational constant GM = 3986005e8 m*m*m/s/s).,98.32
+7031,GEM 10C,,6378137.0,9001,298.257223563,,1995-06-02 00:00:00,,EPSG,Used for GEM 10C Gravity Potential Model.,98.32
+7032,OSU86F,,6378136.2,9001,298.257223563,,1995-06-02 00:00:00,,EPSG,Used for OSU86 gravity potential (geoidal) model.,98.32
+7033,OSU91A,,6378136.3,9001,298.257223563,,1995-06-02 00:00:00,,EPSG,Used for OSU91 gravity potential (geoidal) model.,98.32
+7034,Clarke 1880,,20926202.0,9005,293.465,20854895.0,1995-06-02 00:00:00,"\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser.",EPSG,Clarke gave a and b and also 1/f=293.465 (to 3 decimal places). 1/f derived from a and b = 293.4663077�,
+7035,Sphere,,6371000.0,9001,,6371000.0,1995-06-02 00:00:00,,EPSG,Authalic sphere. 1/f is infinite.,
+7036,GRS 1967,,6378160.0,9001,298.247167427,,1998-11-11 00:00:00,"\"Geodetic Reference System 1967\"; International Association of Geodesy special publication number 3; August 1971.",EPSG,Adopted by IUGG 1967 Lucerne. Inverse flattening given is derived from geocentric gravitational constant (GM)= 398603e9 m*m*m/s/s; dynamic form factor (J2) = 0.0010827 and Earth's angular velocity w = 7.2921151467e-5 rad/s.,96.09 97.252 98.32
+7041,Average Terrestrial System 1977,,6378135.0,9001,298.257,,1997-07-22 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual,EPSG,,98.321
+7042,Everest (1830 Definition),,20922931.8,9080,300.8017,20853374.58,1999-10-20 00:00:00,"\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser",EPSG,Everest gave a and b to 2 decimal places and also 1/f=300.8017 (to 4 decimal places).,97.23
+7043,WGS 72,,6378135.0,9001,298.26,,1999-04-22 00:00:00,,EPSG,,99.03
+7044,Everest 1830 (1962 Definition),,6377301.243,9001,300.8017255,,1999-10-20 00:00:00,,EPSG,Used by Pakistan since metrication. Clarke's 1865 Indian foot-British foot ratio (0.99999566) and his 1865 British inch-metre ratio (39.369971) rounded with slight error as 1 Ind ft = 0.3047995m exactly and applied to Everest's 1830 definition of a & b.,
+7045,Everest 1830 (1975 Definition),,6377299.151,9001,300.8017255,,1999-10-20 00:00:00,,EPSG,Used by India since metrication. Clarke's 1865 Indian foot-British foot ratio (0.99999566) and his 1865 British inch-metre ratio (39.369971) rounded as 1 Ind ft = 0.3047995m exactly applied to Everest's 1830 original definition taken as a and b.,
diff --git a/src/tiff/csv/gcs.csv b/src/tiff/csv/gcs.csv
new file mode 100644
index 0000000..5c92614
--- /dev/null
+++ b/src/tiff/csv/gcs.csv
@@ -0,0 +1,278 @@
+"COORD_REF_SYS_CODE","COORD_REF_SYS_NAME","DATUM_CODE","DATUM_NAME","GREENWICH_DATUM","UOM_CODE","ELLIPSOID_CODE","PRIME_MERIDIAN_CODE","COORD_OP_METHOD_CODE","DX","DY","DZ","RX","RY","RZ","DS"
+4001,Unknown datum based upon the Airy 1830 ellipsoid,6001,"Not specified (based on Airy 1830 ellipsoid)",6001,9108,7001,8901,,,,,,,,
+4002,Unknown datum based upon the Airy Modified 1849 ellipsoid,6002,"Not specified (based on Airy Modified 1849 ellipsoid)",6002,9108,7002,8901,,,,,,,,
+4003,Unknown datum based upon the Australian National Spheroid,6003,"Not specified (based on Australian National Spheroid)",6003,9108,7003,8901,,,,,,,,
+4004,Unknown datum based upon the Bessel 1841 ellipsoid,6004,"Not specified (based on Bessel 1841 ellipsoid)",6004,9108,7004,8901,,,,,,,,
+4005,Unknown datum based upon the Bessel Modified ellipsoid,6005,"Not specified (based on Bessel Modified ellipsoid)",6005,9108,7005,8901,,,,,,,,
+4006,Unknown datum based upon the Bessel Namibia ellipsoid,6006,"Not specified (based on Bessel Namibia ellipsoid)",6006,9108,7046,8901,,,,,,,,
+4007,Unknown datum based upon the Clarke 1858 ellipsoid,6007,"Not specified (based on Clarke 1858 ellipsoid)",6007,9108,7007,8901,,,,,,,,
+4008,Unknown datum based upon the Clarke 1866 ellipsoid,6008,"Not specified (based on Clarke 1866 ellipsoid)",6008,9108,7008,8901,,,,,,,,
+4009,Unknown datum based upon the Clarke 1866 Michigan ellipsoid,6009,"Not specified (based on Clarke 1866 Michigan ellipsoid)",6009,9108,7009,8901,,,,,,,,
+4010,"Unknown datum based upon the Clarke 1880 (Benoit) ellipsoid",6010,"Not specified (based on Clarke 1880 (Benoit) ellipsoid)",6010,9108,7010,8901,,,,,,,,
+4011,"Unknown datum based upon the Clarke 1880 (IGN) ellipsoid",6011,"Not specified (based on Clarke 1880 (IGN) ellipsoid)",6011,9108,7011,8901,,,,,,,,
+4012,"Unknown datum based upon the Clarke 1880 (RGS) ellipsoid",6012,"Not specified (based on Clarke 1880 (RGS) ellipsoid)",6012,9108,7012,8901,,,,,,,,
+4013,"Unknown datum based upon the Clarke 1880 (Arc) ellipsoid",6013,"Not specified (based on Clarke 1880 (Arc) ellipsoid)",6013,9108,7013,8901,,,,,,,,
+4014,"Unknown datum based upon the Clarke 1880 (SGA 1922) ellipsoid",6014,"Not specified (based on Clarke 1880 (SGA 1922) ellipsoid)",6014,9108,7014,8901,,,,,,,,
+4015,"Unknown datum based upon the Everest 1830 (1937 Adjustment) ellipsoid",6015,"Not specified (based on Everest 1830 (1937 Adjustment) ellipsoid)",6015,9108,7015,8901,,,,,,,,
+4016,"Unknown datum based upon the Everest 1830 (1967 Definition) ellipsoid",6016,"Not specified (based on Everest 1830 (1967 Definition) ellipsoid)",6016,9108,7016,8901,,,,,,,,
+4018,Unknown datum based upon the Everest 1830 Modified ellipsoid,6018,"Not specified (based on Everest 1830 Modified ellipsoid)",6018,9108,7018,8901,,,,,,,,
+4019,Unknown datum based upon the GRS 1980 ellipsoid,6019,"Not specified (based on GRS 1980 ellipsoid)",6019,9108,7019,8901,,,,,,,,
+4020,Unknown datum based upon the Helmert 1906 ellipsoid,6020,"Not specified (based on Helmert 1906 ellipsoid)",6020,9108,7020,8901,,,,,,,,
+4021,Unknown datum based upon the Indonesian National Spheroid,6021,"Not specified (based on Indonesian National Spheroid)",6021,9108,7021,8901,,,,,,,,
+4022,Unknown datum based upon the International 1924 ellipsoid,6022,"Not specified (based on International 1924 ellipsoid)",6022,9108,7022,8901,,,,,,,,
+4024,Unknown datum based upon the Krassowsky 1940 ellipsoid,6024,"Not specified (based on Krassowsky 1940 ellipsoid)",6024,9108,7024,8901,,,,,,,,
+4025,Unknown datum based upon the NWL 9D ellipsoid,6025,"Not specified (based on NWL 9D ellipsoid)",6025,9108,7025,8901,,,,,,,,
+4027,Unknown datum based upon the Plessis 1817 ellipsoid,6027,"Not specified (based on Plessis 1817 ellipsoid)",6027,9108,7027,8901,,,,,,,,
+4028,Unknown datum based upon the Struve 1860 ellipsoid,6028,"Not specified (based on Struve 1860 ellipsoid)",6028,9108,7028,8901,,,,,,,,
+4029,Unknown datum based upon the War Office ellipsoid,6029,"Not specified (based on War Office ellipsoid)",6029,9108,7029,8901,,,,,,,,
+4030,Unknown datum based upon the WGS 84 ellipsoid,6030,"Not specified (based on WGS 84 ellipsoid)",6030,9108,7030,8901,,,,,,,,
+4031,Unknown datum based upon the GEM 10C ellipsoid,6031,"Not specified (based on GEM 10C ellipsoid)",6031,9108,7031,8901,,,,,,,,
+4032,Unknown datum based upon the OSU86F ellipsoid,6032,"Not specified (based on OSU86F ellipsoid)",6032,9108,7032,8901,,,,,,,,
+4033,Unknown datum based upon the OSU91A ellipsoid,6033,"Not specified (based on OSU91A ellipsoid)",6033,9108,7033,8901,,,,,,,,
+4034,Unknown datum based upon the Clarke 1880 ellipsoid,6034,"Not specified (based on Clarke 1880 ellipsoid)",6034,9108,7034,8901,,,,,,,,
+4035,Unknown datum based upon the Authalic Sphere,6035,"Not specified (based on Authalic Sphere)",6035,9108,7035,8901,,,,,,,,
+4036,Unknown datum based upon the GRS 1967 ellipsoid,6036,"Not specified (based on GRS 1967 ellipsoid)",6036,9108,7036,8901,,,,,,,,
+4041,Unknown datum based upon the Average Terrestrial System 1977 ellipsoid,6041,"Not specified (based on Average Terrestrial System 1977 ellipsoid)",6041,9108,7041,8901,,,,,,,,
+4042,"Unknown datum based upon the Everest (1830 Definition) ellipsoid",6042,"Not specified (based on Everest (1830 Definition) ellipsoid)",6042,9108,7042,8901,,,,,,,,
+4043,Unknown datum based upon the WGS 72 ellipsoid,6043,"Not specified (based on WGS 72 ellipsoid)",6043,9108,7043,8901,,,,,,,,
+4044,"Unknown datum based upon the Everest 1830 (1962 Definition) ellipsoid",6044,"Not specified (based on Everest 1830 (1962 Definition) ellipsoid)",6044,9108,7044,8901,,,,,,,,
+4045,"Unknown datum based upon the Everest 1830 (1975 Definition) ellipsoid",6045,"Not specified (based on Everest 1830 (1975 Definition) ellipsoid)",6045,9108,7045,8901,,,,,,,,
+4047,Unspecified based upon the GRS 1980 Authalic Sphere,6047,"Not specified (based on GRS 1980 Authalic Sphere)",6047,9108,7047,8901,,,,,,,,
+4120,Greek,6120,Greek,6120,9108,7004,8901,,,,,,,,
+4121,GGRS87,6121,Greek Geodetic Reference System 1987,6121,9108,7019,8901,9603,-199.87,74.79,246.62,,,,
+4122,ATS77,6122,Average Terrestrial System 1977,6122,9108,7041,8901,,,,,,,,
+4123,KKJ,6123,Kartasto Koordinaati Jarjestelma 1966,6123,9108,7022,8901,9606,-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37
+4124,RT90,6124,Rikets koordinatsystem 1990,6124,9108,7004,8901,,,,,,,,
+4125,Samboja,6125,Samboja,6125,9108,7004,8901,9603,-404.78,685.68,45.47,,,,
+4126,"LKS94 (ETRS89)",6126,"Lithuania 1994 (ETRS89)",6126,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4127,Tete,6127,Tete,6127,9108,7008,8901,,,,,,,,
+4128,Madzansua,6128,Madzansua,6128,9108,7008,8901,,,,,,,,
+4129,Observatario,6129,Observatario,6129,9108,7008,8901,,,,,,,,
+4130,Moznet,6130,"Moznet (ITRF94)",6130,9108,7030,8901,9607,0.0,0.0,0.0,0.0,0.0,0.0,0.0
+4131,Indian 1960,6131,Indian 1960,6131,9108,7015,8901,,,,,,,,
+4132,FD58,6132,Final Datum 1958,6132,9108,7012,8901,,,,,,,,
+4133,EST92,6133,Estonia 1992,6133,9108,7019,8901,9607,0.055,-0.541,-0.185,-0.0183,0.0003,0.007,-0.014
+4134,PDO Survey Datum 1993,6134,PDO Survey Datum 1993,6134,9108,7012,8901,,,,,,,,
+4135,Old Hawaiian,6135,Old Hawaiian,6135,9108,7008,8901,,,,,,,,
+4136,St. Lawrence Island,6136,St. Lawrence Island,6136,9108,7008,8901,,,,,,,,
+4137,St. Paul Island,6137,St. Paul Island,6137,9108,7008,8901,,,,,,,,
+4138,St. George Island,6138,St. George Island,6138,9108,7008,8901,,,,,,,,
+4139,Puerto Rico,6139,Puerto Rico,6139,9108,7008,8901,,,,,,,,
+4140,"NAD83(CSRS98)",6140,NAD83 Canadian Spatial Reference System,6140,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4141,Israel,6141,Israel,6141,9108,7019,8901,,,,,,,,
+4142,Locodjo 1965,6142,Locodjo 1965,6142,9108,7012,8901,9603,-125.0,53.0,467.0,,,,
+4143,Abidjan 1987,6143,Abidjan 1987,6143,9108,7012,8901,9603,-124.76,53.0,466.79,,,,
+4144,Kalianpur 1937,6144,Kalianpur 1937,6144,9108,7015,8901,,,,,,,,
+4145,Kalianpur 1962,6145,Kalianpur 1962,6145,9108,7044,8901,9603,283.0,682.0,231.0,,,,
+4146,Kalianpur 1975,6146,Kalianpur 1975,6146,9108,7045,8901,9603,295.0,736.0,257.0,,,,
+4147,Hanoi 1972,6147,Hanoi 1972,6147,9108,7024,8901,9603,-17.51,-108.32,-62.39,,,,
+4148,Hartebeesthoek94,6148,Hartebeesthoek94,6148,9108,7030,8901,9603,0.0,0.0,0.0,,,,
+4149,CH1903,6149,CH1903,6149,9108,7004,8901,,,,,,,,
+4150,"CH1903+",6150,"CH1903+",6150,9108,7004,8901,9603,674.374,15.056,405.346,,,,
+4151,CHTRF95,6151,Swiss Terrestrial Reference Frame 1995,6151,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4152,"NAD83(HARN)",6152,"NAD83 (High Accuracy Regional Network)",6152,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4153,Rassadiran,6153,Rassadiran,6153,9108,7022,8901,9603,-133.63,-157.5,-158.62,,,,
+4154,"ED50(ED77)",6154,"European Datum 1950(1977)",6154,9108,7022,8901,,,,,,,,
+4155,Dabola 1981,6155,Dabola 1981,6155,9108,7011,8901,9603,-83.0,37.0,124.0,,,,
+4156,S-JTSK,6156,Jednotne Trigonometricke Site Katastralni,6156,9108,7004,8901,,,,,,,,
+4157,Mount Dillon,6157,Mount Dillon,6157,9108,7007,8901,,,,,,,,
+4158,Naparima 1955,6158,Naparima 1955,6158,9108,7022,8901,,,,,,,,
+4159,ELD79,6159,European Libyan Datum 1979,6159,9108,7022,8901,,,,,,,,
+4160,Chos Malal 1914,6160,Chos Malal 1914,6160,9108,7022,8901,,,,,,,,
+4161,Pampa del Castillo,6161,Pampa del Castillo,6161,9108,7022,8901,,,,,,,,
+4162,Korean 1985,6162,Korean Datum 1985,6162,9108,7004,8901,,,,,,,,
+4163,Yemen NGN96,6163,Yemen National Geodetic Network 1996,6163,9108,7030,8901,9603,0.0,0.0,0.0,,,,
+4164,South Yemen,6164,South Yemen,6164,9108,7024,8901,9603,-76.0,-138.0,67.0,,,,
+4165,Bissau,6165,Bissau,6165,9108,7022,8901,9603,-173.0,253.0,27.0,,,,
+4166,Korean 1995,6166,Korean Datum 1995,6166,9108,7030,8901,9603,0.0,0.0,0.0,,,,
+4167,NZGD2000,6167,New Zealand Geodetic Datum 2000,6167,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4168,Accra,6168,Accra,6168,9108,7029,8901,9603,-199.0,32.0,322.0,,,,
+4169,American Samoa 1962,6169,American Samoa 1962,6169,9108,7008,8901,9603,-115.0,118.0,426.0,,,,
+4170,SIRGAS,6170,Sistema de Referencia Geocentrico para America del Sur,6170,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4171,RGF93,6171,Reseau Geodesique Francais 1993,6171,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4172,POSGAR,6172,Posiciones Geodesicas Argentinas,6172,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4173,IRENET95,6173,IRENET95,6173,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4174,Sierra Leone 1924,6174,Sierra Leone Colony 1924,6174,9108,7029,8901,,,,,,,,
+4175,Sierra Leone 1968,6175,Sierra Leone 1968,6175,9108,7012,8901,9603,-88.0,4.0,101.0,,,,
+4176,Australian Antarctic,6176,Australian Antarctic Datum 1998,6176,9108,7019,8901,,,,,,,,
+4178,"Pulkovo 1942(83)",6178,"Pulkovo 1942/83",6178,9108,7024,8901,9607,24.0,-123.0,-94.0,-0.02,0.25,0.13,1.1
+4179,"Pulkovo 1942(58)",6179,"Pulkovo 1942/58",6179,9108,7024,8901,9606,33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84
+4180,EST97,6180,Estonia 1997,6180,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4181,Luxembourg 1930,6181,Luxembourg 1930,6181,9108,7022,8901,9606,-193.0,13.7,-39.3,-0.41,-2.933,2.688,0.43
+4182,Azores Occidental 1939,6182,Azores Occidental Islands 1939,6182,9108,7022,8901,,,,,,,,
+4183,Azores Central 1948,6183,Azores Central Islands 1948,6183,9108,7022,8901,,,,,,,,
+4184,Azores Oriental 1940,6184,Azores Oriental Islands 1940,6184,9108,7022,8901,,,,,,,,
+4185,Madeira 1936,6185,Madeira 1936,6185,9108,7022,8901,,,,,,,,
+4188,OSNI 1952,6188,OSNI 1952,6188,9108,7001,8901,,,,,,,,
+4189,REGVEN,6189,Red Geodesica Venezolana,6189,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4190,POSGAR 98,6190,Posiciones Geodesicas Argentinas 1998,6190,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4191,Albanian 1987,6191,Albanian 1987,6191,9108,7024,8901,,,,,,,,
+4192,Douala 1948,6192,Douala 1948,6192,9108,7022,8901,,,,,,,,
+4193,Manoca 1962,6193,Manoca 1962,6193,9108,7011,8901,9603,-70.9,-151.8,-41.4,,,,
+4194,Qornoq 1927,6194,Qornoq 1927,6194,9108,7022,8901,,,,,,,,
+4195,Scoresbysund 1952,6195,Scoresbysund 1952,6195,9108,7022,8901,9606,105.0,326.0,-102.5,0.0,0.0,0.814,-0.6
+4196,Ammassalik 1958,6196,Ammassalik 1958,6196,9108,7022,8901,9606,-45.0,417.0,-3.5,0.0,0.0,0.814,-0.6
+4197,Garoua,6197,Garoua,6197,9108,7012,8901,,,,,,,,
+4198,Kousseri,6198,Kousseri,6198,9108,7012,8901,,,,,,,,
+4199,Egypt 1930,6199,Egypt 1930,6199,9108,7022,8901,,,,,,,,
+4200,Pulkovo 1995,6200,Pulkovo 1995,6200,9108,7024,8901,,,,,,,,
+4201,Adindan,6201,Adindan,6201,9108,7012,8901,,,,,,,,
+4202,AGD66,6202,Australian Geodetic Datum 1966,6202,9108,7003,8901,,,,,,,,
+4203,AGD84,6203,Australian Geodetic Datum 1984,6203,9108,7003,8901,,,,,,,,
+4204,Ain el Abd,6204,Ain el Abd 1970,6204,9108,7022,8901,,,,,,,,
+4205,Afgooye,6205,Afgooye,6205,9108,7024,8901,9603,-43.0,-163.0,45.0,,,,
+4206,Agadez,6206,Agadez,6206,9108,7011,8901,,,,,,,,
+4207,Lisbon,6207,Lisbon 1937,6207,9108,7022,8901,,,,,,,,
+4208,Aratu,6208,Aratu,6208,9108,7022,8901,,,,,,,,
+4209,Arc 1950,6209,Arc 1950,6209,9108,7013,8901,,,,,,,,
+4210,Arc 1960,6210,Arc 1960,6210,9108,7012,8901,,,,,,,,
+4211,Batavia,6211,Batavia,6211,9108,7004,8901,,,,,,,,
+4212,Barbados 1938,6212,Barbados 1938,6212,9108,7012,8901,,,,,,,,
+4213,Beduaram,6213,Beduaram,6213,9108,7011,8901,,,,,,,,
+4214,Beijing 1954,6214,Beijing 1954,6214,9108,7024,8901,,,,,,,,
+4215,Belge 1950,6215,Reseau National Belge 1950,6215,9108,7022,8901,,,,,,,,
+4216,Bermuda 1957,6216,Bermuda 1957,6216,9108,7008,8901,9603,-73.0,213.0,296.0,,,,
+4218,Bogota 1975,6218,Bogota 1975,6218,9108,7022,8901,,,,,,,,
+4219,Bukit Rimpah,6219,Bukit Rimpah,6219,9108,7004,8901,9603,-384.0,664.0,-48.0,,,,
+4220,Camacupa,6220,Camacupa,6220,9108,7012,8901,,,,,,,,
+4221,Campo Inchauspe,6221,Campo Inchauspe,6221,9108,7022,8901,,,,,,,,
+4222,Cape,6222,Cape,6222,9108,7013,8901,,,,,,,,
+4223,Carthage,6223,Carthage,6223,9108,7011,8901,,,,,,,,
+4224,Chua,6224,Chua,6224,9108,7022,8901,9603,-134.0,229.0,-29.0,,,,
+4225,Corrego Alegre,6225,Corrego Alegre,6225,9108,7022,8901,9603,-206.0,172.0,-6.0,,,,
+4226,"Cote d'Ivoire",6226,"Cote d'Ivoire",6226,9108,7011,8901,,,,,,,,
+4227,Deir ez Zor,6227,Deir ez Zor,6227,9108,7011,8901,,,,,,,,
+4228,Douala,6228,Douala,6228,9108,7011,8901,,,,,,,,
+4229,Egypt 1907,6229,Egypt 1907,6229,9108,7020,8901,,,,,,,,
+4230,ED50,6230,European Datum 1950,6230,9108,7022,8901,,,,,,,,
+4231,ED87,6231,European Datum 1987,6231,9108,7022,8901,9606,-82.981,-99.719,-110.709,-0.5076,0.1503,0.3898,-0.3143
+4232,Fahud,6232,Fahud,6232,9108,7012,8901,,,,,,,,
+4233,Gandajika 1970,6233,Gandajika 1970,6233,9108,7022,8901,,,,,,,,
+4234,Garoua,6234,Garoua,6234,9108,7011,8901,,,,,,,,
+4235,Guyane Francaise,6235,Guyane Francaise,6235,9108,7022,8901,,,,,,,,
+4236,Hu Tzu Shan,6236,Hu Tzu Shan,6236,9108,7022,8901,9603,-637.0,-549.0,-203.0,,,,
+4237,HD72,6237,Hungarian Datum 1972,6237,9108,7036,8901,,,,,,,,
+4238,ID74,6238,Indonesian Datum 1974,6238,9108,7021,8901,,,,,,,,
+4239,Indian 1954,6239,Indian 1954,6239,9108,7015,8901,9603,217.0,823.0,299.0,,,,
+4240,Indian 1975,6240,Indian 1975,6240,9108,7015,8901,,,,,,,,
+4241,Jamaica 1875,6241,Jamaica 1875,6241,9108,7034,8901,,,,,,,,
+4242,JAD69,6242,Jamaica 1969,6242,9108,7008,8901,,,,,,,,
+4243,Kalianpur 1880,6243,Kalianpur 1880,6243,9108,7042,8901,,,,,,,,
+4244,Kandawala,6244,Kandawala,6244,9108,7015,8901,9603,-97.0,787.0,86.0,,,,
+4245,Kertau,6245,Kertau,6245,9108,7018,8901,9603,-11.0,851.0,5.0,,,,
+4246,KOC,6246,Kuwait Oil Company,6246,9108,7012,8901,,,,,,,,
+4247,La Canoa,6247,La Canoa,6247,9108,7022,8901,9603,-273.5,110.6,-357.9,,,,
+4248,PSAD56,6248,Provisional South American Datum 1956,6248,9108,7022,8901,,,,,,,,
+4249,Lake,6249,Lake,6249,9108,7022,8901,,,,,,,,
+4250,Leigon,6250,Leigon,6250,9108,7012,8901,9603,-130.0,29.0,364.0,,,,
+4251,Liberia 1964,6251,Liberia 1964,6251,9108,7012,8901,9603,-90.0,40.0,88.0,,,,
+4252,Lome,6252,Lome,6252,9108,7011,8901,,,,,,,,
+4253,Luzon 1911,6253,Luzon 1911,6253,9108,7008,8901,,,,,,,,
+4254,Hito XVIII 1963,6254,Hito XVIII 1963,6254,9108,7022,8901,9606,18.38,192.45,96.82,0.056,-0.142,-0.2,-0.0013
+4255,Herat North,6255,Herat North,6255,9108,7022,8901,9603,-333.0,-222.0,114.0,,,,
+4256,Mahe 1971,6256,Mahe 1971,6256,9108,7012,8901,9603,41.0,-220.0,-134.0,,,,
+4257,Makassar,6257,Makassar,6257,9108,7004,8901,9603,-587.8,519.75,145.76,,,,
+4258,ETRS89,6258,European Terrestrial Reference System 1989,6258,9108,7019,8901,,,,,,,,
+4259,Malongo 1987,6259,Malongo 1987,6259,9108,7022,8901,,,,,,,,
+4260,Manoca,6260,Manoca,6260,9108,7012,8901,9603,-70.9,-151.8,-41.4,,,,
+4261,Merchich,6261,Merchich,6261,9108,7011,8901,9603,31.0,146.0,47.0,,,,
+4262,Massawa,6262,Massawa,6262,9108,7004,8901,9603,639.0,405.0,60.0,,,,
+4263,Minna,6263,Minna,6263,9108,7012,8901,,,,,,,,
+4264,Mhast,6264,Mhast,6264,9108,7022,8901,9603,-252.95,-4.11,-96.38,,,,
+4265,Monte Mario,6265,Monte Mario,6265,9108,7022,8901,,,,,,,,
+4266,"M'poraloko",6266,"M'poraloko",6266,9108,7011,8901,,,,,,,,
+4267,NAD27,6267,North American Datum 1927,6267,9108,7008,8901,,,,,,,,
+4268,NAD27 Michigan,6268,NAD Michigan,6268,9108,7009,8901,,,,,,,,
+4269,NAD83,6269,North American Datum 1983,6269,9108,7019,8901,,,,,,,,
+4270,Nahrwan 1967,6270,Nahrwan 1967,6270,9108,7012,8901,,,,,,,,
+4271,Naparima 1972,6271,Naparima 1972,6271,9108,7022,8901,,,,,,,,
+4272,NZGD49,6272,New Zealand Geodetic Datum 1949,6272,9108,7022,8901,,,,,,,,
+4273,NGO 1948,6273,NGO 1948,6273,9108,7005,8901,9606,278.3,93.0,474.5,7.889,0.05,-6.61,6.21
+4274,Datum 73,6274,Datum 73,6274,9108,7022,8901,,,,,,,,
+4275,NTF,6275,Nouvelle Triangulation Francaise,6275,9108,7011,8901,9603,-168.0,-60.0,320.0,,,,
+4276,NSWC 9Z-2,6276,NSWC 9Z-2,6276,9108,7025,8901,,,,,,,,
+4277,OSGB 1936,6277,OSGB 1936,6277,9108,7001,8901,,,,,,,,
+4278,OSGB70,6278,"OSGB 1970 (SN)",6278,9108,7001,8901,,,,,,,,
+4279,"OS(SN)80",6279,"OS (SN) 1980",6279,9108,7001,8901,,,,,,,,
+4280,Padang,6280,Padang 1884,6280,9108,7004,8901,,,,,,,,
+4281,Palestine 1923,6281,Palestine 1923,6281,9108,7010,8901,,,,,,,,
+4282,Pointe Noire,6282,Congo 1960 Pointe Noire,6282,9108,7011,8901,,,,,,,,
+4283,GDA94,6283,Geocentric Datum of Australia 1994,6283,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4284,Pulkovo 1942,6284,Pulkovo 1942,6284,9108,7024,8901,,,,,,,,
+4285,Qatar 1974,6285,Qatar 1974,6285,9108,7022,8901,,,,,,,,
+4286,Qatar 1948,6286,Qatar 1948,6286,9108,7020,8901,,,,,,,,
+4287,Qornoq,6287,Qornoq,6287,9108,7022,8901,9603,164.0,138.0,-189.0,,,,
+4288,Loma Quintana,6288,Loma Quintana,6288,9108,7022,8901,,,,,,,,
+4289,Amersfoort,6289,Amersfoort,6289,9108,7004,8901,,,,,,,,
+4291,SAD69,6291,South American Datum 1969,6291,9108,7036,8901,,,,,,,,
+4292,Sapper Hill 1943,6292,Sapper Hill 1943,6292,9108,7022,8901,9603,-355.0,21.0,72.0,,,,
+4293,Schwarzeck,6293,Schwarzeck,6293,9108,7046,8901,,,,,,,,
+4294,Segora,6294,Segora,6294,9108,7004,8901,,,,,,,,
+4295,Serindung,6295,Serindung,6295,9108,7004,8901,,,,,,,,
+4296,Sudan,6296,Sudan,6296,9108,7011,8901,,,,,,,,
+4297,Tananarive,6297,Tananarive 1925,6297,9108,7022,8901,9603,-189.0,-242.0,-91.0,,,,
+4298,Timbalai 1948,6298,Timbalai 1948,6298,9108,7016,8901,,,,,,,,
+4299,TM65,6299,TM65,6299,9108,7002,8901,,,,,,,,
+4300,TM75,6300,TM75,6300,9108,7002,8901,,,,,,,,
+4301,Tokyo,6301,Tokyo,6301,9108,7004,8901,,,,,,,,
+4302,Trinidad 1903,6302,Trinidad 1903,6302,9108,7007,8901,9603,-61.702,284.488,472.052,,,,
+4303,"TC(1948)",6303,Trucial Coast 1948,6303,9108,7020,8901,,,,,,,,
+4304,Voirol 1875,6304,Voirol 1875,6304,9108,7011,8901,9603,-73.0,-247.0,227.0,,,,
+4306,Bern 1938,6306,Bern 1938,6306,9108,7004,8901,,,,,,,,
+4307,Nord Sahara 1959,6307,Nord Sahara 1959,6307,9108,7012,8901,,,,,,,,
+4308,RT38,6308,Stockholm 1938,6308,9108,7004,8901,,,,,,,,
+4309,Yacare,6309,Yacare,6309,9108,7022,8901,9603,-155.0,171.0,37.0,,,,
+4310,Yoff,6310,Yoff,6310,9108,7011,8901,,,,,,,,
+4311,Zanderij,6311,Zanderij,6311,9108,7022,8901,9603,-265.0,120.0,-358.0,,,,
+4312,MGI,6312,Militar-Geographische Institut,6312,9108,7004,8901,,,,,,,,
+4313,Belge 1972,6313,Reseau National Belge 1972,6313,9108,7022,8901,,,,,,,,
+4314,DHDN,6314,Deutsches Hauptdreiecksnetz,6314,9108,7004,8901,,,,,,,,
+4315,Conakry 1905,6315,Conakry 1905,6315,9108,7011,8901,9603,-23.0,259.0,-9.0,,,,
+4316,Dealul Piscului 1933,6316,Dealul Piscului 1933,6316,9108,7022,8901,9603,103.25,-100.4,-307.19,,,,
+4317,Dealul Piscului 1970,6317,Dealul Piscului 1970,6317,9108,7024,8901,,,,,,,,
+4318,NGN,6318,National Geodetic Network,6318,9108,7030,8901,,,,,,,,
+4319,KUDAMS,6319,Kuwait Utility,6319,9108,7019,8901,,,,,,,,
+4322,WGS 72,6322,World Geodetic System 1972,6322,9108,7043,8901,,,,,,,,
+4324,WGS 72BE,6324,WGS 72 Transit Broadcast Ephemeris,6324,9108,7043,8901,9606,0.0,0.0,1.9,0.0,0.0,0.814,-0.38
+4326,WGS 84,6326,World Geodetic System 1984,6326,9108,7030,8901,,,,,,,,
+4600,Anguilla 1957,6600,Anguilla 1957,6600,9108,7012,8901,,,,,,,,
+4601,Antigua 1943,6601,Antigua 1943,6601,9108,7012,8901,9603,-255.0,-15.0,71.0,,,,
+4602,Dominica 1945,6602,Dominica 1945,6602,9108,7012,8901,9603,725.0,685.0,536.0,,,,
+4603,Grenada 1953,6603,Grenada 1953,6603,9108,7012,8901,9603,72.0,213.7,93.0,,,,
+4604,Montserrat 1958,6604,Montserrat 1958,6604,9108,7012,8901,9603,174.0,359.0,365.0,,,,
+4605,St. Kitts 1955,6605,St. Kitts 1955,6605,9108,7012,8901,9603,9.0,183.0,236.0,,,,
+4606,St. Lucia 1955,6606,St. Lucia 1955,6606,9108,7012,8901,9603,-149.0,128.0,296.0,,,,
+4607,St. Vincent 1945,6607,St. Vincent 1945,6607,9108,7012,8901,,,,,,,,
+4608,"NAD27(76)",6608,"North American Datum 1927 (1976)",6608,9108,7008,8901,,,,,,,,
+4609,"NAD27(CGQ77)",6609,"North American Datum 1927 (CGQ77)",6609,9108,7008,8901,,,,,,,,
+4610,Xian 1980,6610,Xian 1980,6610,9108,7049,8901,,,,,,,,
+4611,Hong Kong 1980,6611,Hong Kong 1980,6611,9108,7022,8901,9606,-162.619,-276.959,-161.764,0.067753,-2.243649,-1.158827,-1.094246
+4612,JGD2000,6612,Japanese Geodetic Datum 2000,6612,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4613,Segara,6613,Gunung Segara,6613,9108,7004,8901,9603,-404.78,685.68,45.47,,,,
+4614,QND95,6614,Qatar National Datum 1995,6614,9108,7022,8901,9606,-119.4248,-303.65872,-11.00061,1.164298,0.174458,1.096259,3.657065
+4615,Porto Santo,6615,Porto Santo,6615,9108,7022,8901,,,,,,,,
+4616,Selvagem Grande,6616,Selvagem Grande,6616,9108,7022,8901,,,,,,,,
+4617,"NAD83(CSRS)",6140,NAD83 Canadian Spatial Reference System,6140,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4801,"Bern 1898 (Bern)",6801,"CH1903 (Bern)",6149,9108,7004,8907,,,,,,,,
+4802,"Bogota 1975 (Bogota)",6802,"Bogota 1975 (Bogota)",6218,9108,7022,8904,,,,,,,,
+4803,"Lisbon (Lisbon)",6803,"Lisbon 1937 (Lisbon)",6207,9108,7022,8902,,,,,,,,
+4804,"Makassar (Jakarta)",6804,"Makassar (Jakarta)",6257,9108,7004,8908,9603,-587.8,519.75,145.76,,,,
+4805,"MGI (Ferro)",6805,"Militar-Geographische Institut (Ferro)",6312,9108,7004,8909,,,,,,,,
+4806,"Monte Mario (Rome)",6806,"Monte Mario (Rome)",6265,9108,7022,8906,,,,,,,,
+4807,"NTF (Paris)",6807,"Nouvelle Triangulation Francaise (Paris)",6275,9105,7011,8903,9603,-168.0,-60.0,320.0,,,,
+4808,"Padang (Jakarta)",6808,"Padang 1884 (Jakarta)",6280,9108,7004,8908,,,,,,,,
+4809,"Belge 1950 (Brussels)",6809,"Reseau National Belge 1950 (Brussels)",6215,9108,7022,8910,,,,,,,,
+4810,"Tananarive (Paris)",6810,"Tananarive 1925 (Paris)",6297,9105,7022,8903,9603,-189.0,-242.0,-91.0,,,,
+4811,"Voirol 1875 (Paris)",6811,"Voirol 1875 (Paris)",6304,9105,7011,8903,9603,-73.0,-247.0,227.0,,,,
+4813,"Batavia (Jakarta)",6813,"Batavia (Jakarta)",6211,9108,7004,8908,,,,,,,,
+4814,"RT38 (Stockholm)",6814,"Stockholm 1938 (Stockholm)",6308,9108,7004,8911,,,,,,,,
+4815,"Greek (Athens)",6815,"Greek (Athens)",6120,9108,7004,8912,,,,,,,,
+4816,"Carthage (Paris)",6816,"Carthage (Paris)",6816,9105,7011,8903,,,,,,,,
+4817,"NGO 1948 (Oslo)",6817,"NGO 1948 (Oslo)",6273,9108,7005,8913,9606,278.3,93.0,474.5,7.889,0.05,-6.61,6.21
+4818,"S-JTSK (Ferro)",6818,"S-JTSK (Ferro)",6818,9108,7004,8909,,,,,,,,
+4819,"Nord Sahara 1959 (Paris)",6819,"Nord Sahara 1959 (Paris)",6819,9105,7012,8903,,,,,,,,
+4820,"Segara (Jakarta)",6820,"Gunung Segara (Jakarta)",6820,9108,7004,8908,,,,,,,,
+4901,"ATF (Paris)",6901,"Ancienne Triangulation Francaise (Paris)",6901,9105,7027,8903,,,,,,,,
+4902,"NDG (Paris)",6902,"Nord de Guerre (Paris)",6902,9105,7027,8903,,,,,,,,
+4903,"Madrid 1870 (Madrid)",6903,"Madrid 1870 (Madrid)",6903,9108,7028,8905,,,,,,,,
+4904,"Lisbon 1890 (Lisbon)",6904,"Lisbon 1890 (Lisbon)",6904,9108,7004,8902,,,,,,,,
diff --git a/src/tiff/csv/gdatum_alias.c b/src/tiff/csv/gdatum_alias.c
new file mode 100644
index 0000000..997aa7a
--- /dev/null
+++ b/src/tiff/csv/gdatum_alias.c
@@ -0,0 +1,11 @@
+#include "defs.h"
+datafile_rows_t gdatum_alias_row_1[] = {"GEOD_DATUM_ALIAS_CODE","GEOD_DATUM_ALIAS_NAME","GEOD_DATUM_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t gdatum_alias_row_2[] = {"6400","ETRS89","6258","1999-04-22 00:00:00","","EPSG","Coincides with WGS84 at the one metre level.","99.111",NULL};
+datafile_rows_t gdatum_alias_row_3[] = {"6401","South Africa","6222","1996-10-18 00:00:00","Private Communication, Directorate of Surveys and Land Information, Cape Town.","EPSG","","",NULL};
+datafile_rows_t gdatum_alias_row_4[] = {"6402","Genuk","6211","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t gdatum_alias_row_5[] = {"6403","NAD83 (1986)","6269","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t gdatum_alias_row_6[] = {"6404","Old Greek","6120","1997-06-16 00:00:00","Topographic Department; National Technical University of Greece.","EPSG","Adjective \"Old\" applied since introduction of GGRS87 (code 6121)","",NULL};
+datafile_rows_t gdatum_alias_row_7[] = {"6405","Rikets koordinatsystem 1938","6308","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","","",NULL};
+datafile_rows_t gdatum_alias_row_8[] = {"6406","Samboja P2 exc T9","6125","1997-11-13 00:00:00","Total Indonesia","EPSG","","",NULL};
+
+datafile_rows_t *gdatum_alias_rows[] = {gdatum_alias_row_1,gdatum_alias_row_2,gdatum_alias_row_3,gdatum_alias_row_4,gdatum_alias_row_5,gdatum_alias_row_6,gdatum_alias_row_7,gdatum_alias_row_8,NULL};
diff --git a/src/tiff/csv/gdatum_alias.csv b/src/tiff/csv/gdatum_alias.csv
new file mode 100644
index 0000000..5f79125
--- /dev/null
+++ b/src/tiff/csv/gdatum_alias.csv
@@ -0,0 +1,8 @@
+"GEOD_DATUM_ALIAS_CODE","GEOD_DATUM_ALIAS_NAME","GEOD_DATUM_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+6400,ETRS89,6258,1999-04-22 00:00:00,,EPSG,Coincides with WGS84 at the one metre level.,99.111
+6401,South Africa,6222,1996-10-18 00:00:00,"Private Communication, Directorate of Surveys and Land Information, Cape Town.",EPSG,,
+6402,Genuk,6211,1996-10-18 00:00:00,,EPSG,,
+6403,NAD83 (1986),6269,1996-12-12 00:00:00,,EPSG,,
+6404,Old Greek,6120,1997-06-16 00:00:00,Topographic Department; National Technical University of Greece.,EPSG,"Adjective \"Old\" applied since introduction of GGRS87 (code 6121)",
+6405,Rikets koordinatsystem 1938,6308,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,,
+6406,Samboja P2 exc T9,6125,1997-11-13 00:00:00,Total Indonesia,EPSG,,
diff --git a/src/tiff/csv/geod_datum.c b/src/tiff/csv/geod_datum.c
new file mode 100644
index 0000000..e4ea816
--- /dev/null
+++ b/src/tiff/csv/geod_datum.c
@@ -0,0 +1,213 @@
+#include "defs.h"
+datafile_rows_t geod_datum_row_1[] = {"GEOD_DATUM_CODE","GEOD_DAT_EPSG_NAME","GEOD_DAT_EPSG_ABBR","GEOD_DAT_USER_NAME","ORIGIN_DESCRIPTION","ELLIPSOID_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t geod_datum_row_2[] = {"6001","Not specified (based on ellipsoid 7001)","","","","7001","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_3[] = {"6002","Not specified (based on ellipsoid 7002)","","","","7002","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_4[] = {"6003","Not specified (based on ellipsoid 7003)","","","","7003","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_5[] = {"6004","Not specified (based on ellipsoid 7004)","","","","7004","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_6[] = {"6005","Not specified (based on ellipsoid 7005)","","","","7005","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_7[] = {"6006","Not specified (based on ellipsoid 7006)","","","","7006","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_8[] = {"6007","Not specified (based on ellipsoid 7007)","","","","7007","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_9[] = {"6008","Not specified (based on ellipsoid 7008)","","","","7008","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_10[] = {"6009","Not specified (based on ellipsoid 7009)","","","","7009","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_11[] = {"6010","Not specified (based on ellipsoid 7010)","","","","7010","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_12[] = {"6011","Not specified (based on ellipsoid 7011)","","","","7011","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_13[] = {"6012","Not specified (based on ellipsoid 7012)","","","","7012","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_14[] = {"6013","Not specified (based on ellipsoid 7013)","","","","7013","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_15[] = {"6014","Not specified (based on ellipsoid 7014)","","","","7014","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_16[] = {"6015","Not specified (based on ellipsoid 7015)","","","","7015","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_17[] = {"6016","Not specified (based on ellipsoid 7016)","","","","7016","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_18[] = {"6017","Not specified (based on ellipsoid 7017)","","","","7044","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_19[] = {"6018","Not specified (based on ellipsoid 7018)","","","","7018","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_20[] = {"6019","Not specified (based on ellipsoid 7019)","","","","7019","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_21[] = {"6020","Not specified (based on ellipsoid 7020)","","","","7020","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_22[] = {"6021","Not specified (based on ellipsoid 7021)","","","","7021","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_23[] = {"6022","Not specified (based on ellipsoid 7022)","","","","7022","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_24[] = {"6024","Not specified (based on ellipsoid 7024)","","","","7024","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_25[] = {"6025","Not specified (based on ellipsoid 7025)","","","","7025","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_26[] = {"6027","Not specified (based on ellipsoid 7027)","","","","7027","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_27[] = {"6028","Not specified (based on ellipsoid 7028)","","","","7028","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_28[] = {"6029","Not specified (based on ellipsoid 7029)","","","","7029","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_29[] = {"6030","Not specified (based on ellipsoid 7030)","","","","7030","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_30[] = {"6031","Not specified (based on ellipsoid 7031)","","","","7031","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_31[] = {"6032","Not specified (based on ellipsoid 7032)","","","","7032","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_32[] = {"6033","Not specified (based on ellipsoid 7033)","","","","7033","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_33[] = {"6034","Not specified (based on ellipsoid 7034)","","","","7034","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_34[] = {"6035","Not specified (based on ellipsoid 7035)","","","","7035","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_35[] = {"6036","Not specified (based on ellipsoid 7036)","","","","7036","1996-09-12 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","",NULL};
+datafile_rows_t geod_datum_row_36[] = {"6041","Not specified (based on ellipsoid 7041)","","","","7041","1999-10-20 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","",NULL};
+datafile_rows_t geod_datum_row_37[] = {"6042","Not specified (based on ellipsoid 7042)","","","","7042","1999-10-20 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","",NULL};
+datafile_rows_t geod_datum_row_38[] = {"6043","Not specified (based on ellipsoid 7043)","","","","7043","1999-10-20 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","",NULL};
+datafile_rows_t geod_datum_row_39[] = {"6044","Not specified (based on ellipsoid 7044)","","","","7044","1999-10-20 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","",NULL};
+datafile_rows_t geod_datum_row_40[] = {"6045","Not specified (based on ellipsoid 7045)","","","","7045","1999-10-20 00:00:00","","EPSG","Not a valid datum. Included for coordinate systems where datum is unknown.","",NULL};
+datafile_rows_t geod_datum_row_41[] = {"6120","Greek","","","Fundamental point: Athens Observatory; latitude 37 deg 58 min 20.132 sec N; longitude 23 deg 42 min 58.815 sec E of Greenwich","7004","1997-06-16 00:00:00","Topography Department; National Technical University of Athens","EPSG","See geodetic datum alias 6404. Used as basis of topographic mapping based on Hatt projection.","",NULL};
+datafile_rows_t geod_datum_row_42[] = {"6121","Greek Geodetic Reference System 1987","GGRS87","","Fundamental point: Dionysos; latitude 38 deg 04 min 33.8 sec N; longitude 23 deg 55 min 51.0 sec E of Greenwich; geoid height 7.0 m.","7019","1997-06-16 00:00:00","L. Portokalakis; Public Petroleum Corporation of Greece","EPSG","Superseded (old) Greek datum. Oil industry work based on ED50.","",NULL};
+datafile_rows_t geod_datum_row_43[] = {"6122","Average Terrestrial System 1977","ATS77","","","7041","1997-07-02 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1979. To be phased out in late 1990's.","",NULL};
+datafile_rows_t geod_datum_row_44[] = {"6123","Kartastokoordinaattijarjestelma","KKJ","","Adjustment with fundamental point based on ED50 transformed to best fit the older VVJ adjustment.","7022","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","Adopted in 1970.","",NULL};
+datafile_rows_t geod_datum_row_45[] = {"6124","Rikets koordinatsystem 1990","RT90","","","7004","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","Supersedes RT38 adjustment (datum code 6308)","",NULL};
+datafile_rows_t geod_datum_row_46[] = {"6125","Samboja","","","Original origin station P2 Exc now destroyed. Extensions recomputed using Toran station T9 as origin.","7004","1997-11-13 00:00:00","Total Indonesia.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_47[] = {"6126","Lithuania 1994 (ETRS89)","LKS94 (ETRS89)","","Densification from 4 ETRF89 points.","7019","1998-03-12 00:00:00","HNIT-Baltic GeoInfoServisas","EPSG","Densification of ETRS89 during the 1992 Baltic campaign.","",NULL};
+datafile_rows_t geod_datum_row_48[] = {"6127","Tete","","","Fundamental point: Tete.","7008","1998-04-16 00:00:00","Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_49[] = {"6128","Madzansua","","","Fundamental point: Madzansua.","7008","1998-04-16 00:00:00","Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Superseded by transformation to Tete datum (datum code 6127).","",NULL};
+datafile_rows_t geod_datum_row_50[] = {"6129","Observatario","","","Fundamental point: Maputo observatory.","7008","1998-04-16 00:00:00","Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Superseded by transformation to Tete datum (datum code 6127).","",NULL};
+datafile_rows_t geod_datum_row_51[] = {"6130","Moznet (ITRF94)","Moznet","","ITRF 1994 epoch 20","7030","1998-04-16 00:00:00","Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_52[] = {"6131","Indian 1960","","","","7015","1998-11-11 00:00:00","","EPSG","DMA adjustment of IndoChina part of the Indian 1954 network to better fit local geoid. Also known as Indian (DMA Reduced).","",NULL};
+datafile_rows_t geod_datum_row_53[] = {"6132","Final Datum 1958","FD58","","Fundamental point: Maniyur. Latitude: 31 deg 23 min 59.19 sec N; Longitude: 48 deg 32 min 31.38 sec E (of Greenwich).","7012","1998-11-11 00:00:00","IOEPC records","EPSG","Network included in Nahrwan 1967 adjustment.","",NULL};
+datafile_rows_t geod_datum_row_54[] = {"6133","Estonia 1992","EST92","","Densification from 4 ETRS89 points.","7019","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","Based on ETRS89 as established during the 1992 Baltic campaign.","",NULL};
+datafile_rows_t geod_datum_row_55[] = {"6134","PDO Survey Datum 1993","PSD93","","Adjustment best fitted to Fahud network.","7012","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Supersedes Fahud datum (code 6232). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t geod_datum_row_56[] = {"6135","Old Hawaiian","","","Fundamental Point: Oahu West Base Astro. Latitude: 21 deg 18 min 13.89 sec N; longitude 157 deg 50 min 55.79 sec W (of Greenwich)","7008","1999-05-24 00:00:00","http://www.ngs.noaa.gov/ (NADCON readme file) and the NIMA publication http://164.214.2.59/publications/guides/Datum_Pamphlet/datum.html","EPSG","Hawaiian Islands were never on NAD27 but rather on Old Hawaiian Datum. NADCON conversion program provides transform [...]
+datafile_rows_t geod_datum_row_57[] = {"6136","St. Lawrence Island","","","","7008","1999-05-24 00:00:00","http://www.ngs.noaa.gov/ (NADCON readme file)","EPSG","Many Alaskan islands were never on NAD27 but rather on independent datums. NADCON conversion program provides transformation from St. Lawrence Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.","",NULL};
+datafile_rows_t geod_datum_row_58[] = {"6137","St. Paul Island","","","","7008","1999-05-24 00:00:00","http://www.ngs.noaa.gov/ (NADCON readme file)","EPSG","Many Alaskan islands were never on NAD27 but rather on independent datums. NADCON conversion program provides transformation from St. Paul Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.","",NULL};
+datafile_rows_t geod_datum_row_59[] = {"6138","St. George Island","","","","7008","1999-05-24 00:00:00","http://www.ngs.noaa.gov/ (NADCON readme file)","EPSG","Many Alaskan islands were never on NAD27 but rather on independent datums. NADCON conversion program provides transformation from St. George Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.","",NULL};
+datafile_rows_t geod_datum_row_60[] = {"6139","Puerto Rico","","","","7008","1999-05-24 00:00:00","Ordnance Survey of Great Britain and http://www.ngs.noaa.gov/ (NADCON readme file).","EPSG","NADCON conversion program provides transformation from Puerto Rico Datum to NAD83 (original 1986 realization) but making the transformation appear to user as if from NAD27.","",NULL};
+datafile_rows_t geod_datum_row_61[] = {"6140","NAD83 Canadian Spatial Reference System","NAD83(CSRS98)","","","7019","1999-10-20 00:00:00","Service New Brunswick Land and Information Standards Manual","EPSG","Supersedes ATS77 from 1999 in New Brunswick.","",NULL};
+datafile_rows_t geod_datum_row_62[] = {"6141","Israel","","","Fundamental Point: Latitude: 31 deg 44 min 03.817 sec N; Longitude: 35 deg 12 min 16.261 sec E (of Greenwich).","7019","1999-10-20 00:00:00","Survey of Israel.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_63[] = {"6142","Locodjo 1965","","","Fundamental Point: T5 Banco. Latitude: 5 deg 18 min 50.5 sec N; Longitude: 4 deg 02 min 05.1 sec W (of Greenwich).","7012","1999-10-20 00:00:00","IGN Paris.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_64[] = {"6143","Abidjan 1987","","","Fundamental Point: Abidjan I. Latitude: 5 deg 18 min 51.01 sec N; Longitude: 4 deg 02 min 06.04 sec W (of Greenwich).","7012","1999-10-20 00:00:00","IGN Paris.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_65[] = {"6144","Kalianpur 1937","","","Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).","7015","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Supercedes 1880 adjustment except for topographic mapping. Superseded in Pakistan by 1962 metrication conversion and in India by 1975 metrication conv [...]
+datafile_rows_t geod_datum_row_66[] = {"6145","Kalianpur 1962","","","Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).","7044","1999-10-20 00:00:00","","EPSG","1937 adjustment rescaled by ratio metric conversions of Indian foot (1937) to Indian foot (1962).","",NULL};
+datafile_rows_t geod_datum_row_67[] = {"6146","Kalianpur 1975","","","Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).","7045","1999-10-20 00:00:00","","EPSG","1937 adjustment rescaled by ratio metric conversions of Indian foot (1937) to Indian foot (1975).","",NULL};
+datafile_rows_t geod_datum_row_68[] = {"6147","Hanoi 1972","","","","7024","1999-10-20 00:00:00","PetroVietnam","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_69[] = {"6148","Hartbeesthoek94","","","Coincident with ITRF91 (1994.0) at Hartbeesthoek astronomical observatory near Pretoria.","7030","1999-10-22 00:00:00","Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm","EPSG","Supersedes Cape datum (code 6222).","",NULL};
+datafile_rows_t geod_datum_row_70[] = {"6149","CH1903","","","Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min 8.660 sec N; Longitude: 7 deg 26 min 22.500 sec E (of Greenwich).","7004","1999-10-20 00:00:00","Bundesamt f�r Landestopographie","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_71[] = {"6150","CH1903+","","","Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min 8.660 sec N; Longitude: 7 deg 26 min 22.500 sec E (of Greenwich).","7004","1999-10-20 00:00:00","Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_72[] = {"6151","Swiss Terrestrial Reference Frame 1995","CHTRF95","","ETRF89 at 1993.0","7019","1999-10-20 00:00:00","Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_73[] = {"6152","NAD83 (High Accuracy Regional Network)","NAD83(HARN)","","","7019","1999-10-20 00:00:00","National Geodetic Survey","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_74[] = {"6153","Rassadiran","","","Fundamental point: Total 1","7022","1999-11-20 00:00:00","Total-Fina","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_75[] = {"6154","ED50(ED77)","","","Extension of ED50 over Iran","7022","1999-11-20 00:00:00","National Cartographic Centre of Iran","EPSG","Sometimes referred to as ED50-ED77","",NULL};
+datafile_rows_t geod_datum_row_76[] = {"6200","Pulkovo 1995","","","Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 15.359 sec N; Longitude: 30 deg 19 min 28.318 sec E (of Greenwich).","7024","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_77[] = {"6201","Adindan","","","Fundamental Point: Station 15; Adindan. Latitude: 22 deg 10 min 7.110 sec N; Longitude: 31 deg 29 min 21.608 sec E (of Greenwich).","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_78[] = {"6202","Australian Geodetic Datum 1966","AGD66","","Fundamental Point: Johnson Memorial. Latitude: 25 deg 56 min 54.551 sec S; Longitude: 133 deg 12 min 30.077 sec E (of Greenwich).","7003","1995-06-02 00:00:00","Australian Map Grid Technical Manual. National Mapping Council of Australia Technical Publication 7; 1972.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_79[] = {"6203","Australian Geodetic Datum 1984","AGD84","","","7003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_80[] = {"6204","Ain el Abd 1970","Ain el Abd","","Fundamental Point: Ain El Abd. Latitude: 28 deg 14 min 06.171 sec N; Longitude: 48 deg 16 min 20.906 sec E (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_81[] = {"6205","Afgooye","","","","7024","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_82[] = {"6206","Agadez","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_83[] = {"6207","Lisbon","","","Fundamental Point: Castelo Sao Jorge; Lisbon. Latitude: 38 deg 42 min 43.631 sec N; Longitude: 9 deg 07 min 54.862 sec W (of Greenwich).","7022","1995-06-02 00:00:00","Instituto Geografico e Cadastral; Lisbon","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_84[] = {"6208","Aratu","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_85[] = {"6209","Arc 1950","","","Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).","7013","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_86[] = {"6210","Arc 1960","","","Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_87[] = {"6211","Batavia","","","Fundamental Point: Batavia Astro. Station. Latitude: 6 deg 7 min 39.520 sec S; Longitude: 106 deg 48 min 27.790 sec E (of Greenwich).","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_88[] = {"6212","Barbados 1938","","","Fundamental point: HMS Challenger astro station M1; latitude 13 deg 04 min 32.53 sec N; longitude 59 deg 36 min 29.34 sec W (of Greenwich).","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","99.171",NULL};
+datafile_rows_t geod_datum_row_89[] = {"6213","Beduaram","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_90[] = {"6214","Beijing 1954","","","","7024","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_91[] = {"6215","Reseau National Belge 1950","Belge 1950","","Fundamental Point: Lommel (tower). Latitude: 51 deg 13 min 47.334 sec N; Longitude: 0 deg 56 min 44.773 sec E (of Brussels).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_92[] = {"6216","Bermuda 1957","","","","7008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_93[] = {"6218","Bogota","","","Fundamental Point: Bogota observatory. Latitude: 4 deg 35 min 56.570 sec N; Longitude: 74 deg 4 min 51.300 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_94[] = {"6219","Bukit Rimpah","","","","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_95[] = {"6220","Camacupa","","","","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_96[] = {"6221","Campo Inchauspe","","","Fundamental Point: Campo Inchauspe. Latitude: 35 deg 58 min 17.000 sec S; Longitude: 62 deg 10 min 12.000 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_97[] = {"6222","Cape","","","Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).","7013","1996-10-18 00:00:00","Private Communication, Directorate of Surveys and Land Information, Cape Town.","EPSG","","96.25 99.69",NULL};
+datafile_rows_t geod_datum_row_98[] = {"6223","Carthage","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_99[] = {"6224","Chua","","","Fundamental Point: Chua. Latitude: 19 deg 45 min 41.160 sec S; Longitude: 48 deg 6 min 7.560 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_100[] = {"6225","Corrego Alegre","","","Fundamental Point: Corrego Alegre. Latitude: 19 deg 50 min 15.140 sec S; Longitude: 48 deg 57 min 42.750 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_101[] = {"6226","Cote d'Ivoire","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_102[] = {"6227","Deir ez Zor","","","Fundamental Point: Trig. 254 Deir. Latitude: 35 deg 21 min 49.975 sec N; Longitude: 40 deg 5 min 46.770 sec E (of Greenwich).","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_103[] = {"6228","Douala","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_104[] = {"6229","Egypt 1907","","","Fundamental Point: Station F1. Latitude: 30 deg 1 min 42.860 sec N; Longitude: 31 deg 16 min 33.600 sec E (of Greenwich).","7020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_105[] = {"6230","European Datum 1950","ED50","","Fundamental Point: Potsdam (Helmert Tower). Latitude: 52 deg 22 min 51.450 sec N; Longitude: 13 deg 3 min 58.740 sec E (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_106[] = {"6231","European Datum 1987","ED87","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_107[] = {"6232","Fahud","","","Fundamental Point: Station NO68-024 Fahud. Latitude: 22 deg 17 min 31.182 sec N; Longitude: 56 deg 29 min 18.820 sec E (of Greenwich).","7012","1995-06-02 00:00:00","Petroleum Development Oman.","EPSG","Superseded by PSD93 (code 6134).","",NULL};
+datafile_rows_t geod_datum_row_108[] = {"6233","Gandajika 1970","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_109[] = {"6234","Garoua","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_110[] = {"6235","Guyane Francaise","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_111[] = {"6236","Hu Tzu Shan","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_112[] = {"6237","Hungarian Datum 1972","HD72","","Fundamental Point: Szolohegy. Latitude: 47 deg 17 min 32,6156 sec N; Longitude 19 deg 36 min 09.9865 sec E; geoid height 6.56m.","7036","1996-10-18 00:00:00","http://lazarus.elte.hu/gb/geodez/geod3.htm","EPSG","","96.09",NULL};
+datafile_rows_t geod_datum_row_113[] = {"6238","Indonesian Datum 1974","ID74","","Fundamental Point: Padang. Latitude: 0 deg 56 min 38.414 sec S; Longitude: 100 deg 22 min 8.804 sec E (of Greenwich).","7021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_114[] = {"6239","Indian 1954","","","Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).","7015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_115[] = {"6240","Indian 1975","","","Fundamental Point: Khau Sakaerang","7015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_116[] = {"6241","Jamaica 1875","","","Fundamental Point: Fort Charles Flagstaff. Latitude: 17 deg 55 min 55.800 sec N; Longitude: 76 deg 56 min 37.260 sec W (of Greenwich).","7034","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_117[] = {"6242","Jamaica 1969","JAD69","","Fundamental Point: Fort Charles Flagstaff. Latitude: 17 deg 55 min 55.800 sec N; Longitude: 76 deg 56 min 37.260 sec W (of Greenwich).","7008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_118[] = {"6243","Kalianpur 1880","","","Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).","7042","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Includes 1916 extrension into Burma (Myanmar). Superseded by 1937 adjustment.","97.23",NULL};
+datafile_rows_t geod_datum_row_119[] = {"6244","Kandawala","","","","7015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_120[] = {"6245","Kertau","","","Fundamental Point: Kertau. Latitude: 3 deg 27 min 50.710 sec N; Longitude: 102 deg 37 min 24.550 sec E (of Greenwich).","7018","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_121[] = {"6246","Kuwait Oil Company","KOC","","","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_122[] = {"6247","La Canoa","","","Fundamental Point: La Canoa. Latitude: 8 deg 34 min 17.170 sec N; Longitude: 63 deg 51 min 34.880 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","Origin also adopted for PSAD56.","",NULL};
+datafile_rows_t geod_datum_row_123[] = {"6248","Provisional South American Datum 1956","PSAD56","","Fundamental Point: La Canoa. Latitude: 8 deg 34 min 17.170 sec N; Longitude: 63 deg 51 min 34.880 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","Same origin as La Canoa datum.","",NULL};
+datafile_rows_t geod_datum_row_124[] = {"6249","Lake","","","Fundamental Point: Maracaibo Cathedral. Latitude: 10 deg 38 min 34.678 sec N; Longitude: 71 deg 36 min 20.224 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_125[] = {"6250","Leigon","","","Fundamental Point: GCS Station 121. Latitude: 5 deg 38 min 52.270 sec N; Longitude: 0 deg 11 min 46.080 sec W (of Greenwich).","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_126[] = {"6251","Liberia 1964","","","","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_127[] = {"6252","Lome","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_128[] = {"6253","Luzon 1911","","","Fundamental Point: Balacan. Latitude: 13 deg 33 min 41.000 sec N; Longitude: 121 deg 52 min 03.000 sec E (of Greenwich).","7008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_129[] = {"6254","Hito XVIII 1963","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_130[] = {"6255","Herat North","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_131[] = {"6256","Mahe 1971","","","Fundamental Point: Mahe","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_132[] = {"6257","Makassar","","","Fundamental Point: Moncongloe","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_133[] = {"6258","European Terrestrial Reference Frame 89","ETRF89","","","7019","1999-04-22 00:00:00","","EPSG","Coincides with WGS84 at the one metre level.","97.11 97.55 99.111",NULL};
+datafile_rows_t geod_datum_row_134[] = {"6259","Malongo 1987","","","Fundamental Point: Station Y at Malongo base camp. Latitude: 5 deg 23 min 34.327 sec S; Longitude: 12 deg 12 min 02.393 sec E (of Greenwich).","7022","1995-06-02 00:00:00","Chevron Petroleum Technology.","EPSG","Offshore extension of Mhast datum (6264) using Transit translocation.","",NULL};
+datafile_rows_t geod_datum_row_135[] = {"6260","Manoca","","","","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_136[] = {"6261","Merchich","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_137[] = {"6262","Massawa","","","","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_138[] = {"6263","Minna","","","Fundamental Point: Minna base station L40. Latitude: 9 deg 38 min 09.000 sec N; Longitude: 6 deg 30 min 59.000 sec E (of Greenwich).","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_139[] = {"6264","Mhast","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_140[] = {"6265","Monte Mario","","","Fundamental Point: Monte Mario. Latitude: 41 deg 55 min 25.510 sec N; Longitude: 0 deg 00 min 00.000 sec E (of Rome).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_141[] = {"6266","M'poraloko","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_142[] = {"6267","North American Datum 1927","NAD27","","Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).","7008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_143[] = {"6268","NAD Michigan","","","Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).","7009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_144[] = {"6269","North American Datum 1983","NAD83","","Origin at geocentre.","7019","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_145[] = {"6270","Nahrwan 1967","","","Fundamental point: Nahrwan south base. Latitude: 33 deg 19 min 10.87 sec N; Longitude: 44 deg 43 min 25.54 sec E (of Greenwich).","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_146[] = {"6271","Naparima 1972","","","Fundamental Point: Naparima. Latitude: 10 deg 16 min 44.860 sec N; Longitude: 61 deg 27 min 34.620 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_147[] = {"6272","New Zealand Geodetic Datum 1949","GD49","","Fundamental Point: Papatahi. Latitude: 41 deg 19 min 8.900 sec S; Longitude: 175 deg 02 min 51.000 sec E (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_148[] = {"6273","NGO 1948","","","","7005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_149[] = {"6274","Datum 73","","","Fundamental Point: Latitude: 39 deg 41 min 37.30 sec N; Longitude: 8 deg 07 min 53.31 sec W (of Greenwich).","7022","1995-06-02 00:00:00","Instituto Geografico e Cadastral; Lisbon","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_150[] = {"6275","Nouvelle Triangulation Francaise","NTF","","Fundamental Point: Pantheon","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_151[] = {"6276","NSWC 9Z-2","","","","7025","1995-06-02 00:00:00","","EPSG","Transit precise ephemeris before 1991.","",NULL};
+datafile_rows_t geod_datum_row_152[] = {"6277","OSGB 1936","","","Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).","7001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_153[] = {"6278","OSGB 1970 (SN)","OSGB70","","Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).","7001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_154[] = {"6279","OS (SN) 1980","OS(SN)80","","Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).","7001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_155[] = {"6280","Padang 1884","Padang","","Fundamental Point: Padang","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_156[] = {"6281","Palestine 1923","","","Fundamental Point: Point 82'M Jerusalem. Latitude: 31 deg 44 min 2.749 sec N; Longitude: 35 deg 12 min 43.490 sec E (of Greenwich).","7010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_157[] = {"6282","Pointe Noire","","","Fundamental Point: Point Noire Astro. Latitude: 4 deg 47 min 0.100 sec S; Longitude: 11 deg 51 min 1.550 sec E (of Greenwich).","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_158[] = {"6283","Geocentric Datum of Australia 1994","GDA94","","","7019","1995-06-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Coincident with WGS84 to within 1 metre.","",NULL};
+datafile_rows_t geod_datum_row_159[] = {"6284","Pulkovo 1942","","","Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 18.550 sec N; Longitude: 30 deg 19 min 42.090 sec E (of Greenwich).","7024","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_160[] = {"6285","Qatar","","","Fundamental Point: Station G3","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_161[] = {"6286","Qatar 1948","","","Fundamental Point: Sokey 0 M. Latitude: 25 deg 22 min 56.500 sec N; Longitude: 50 deg 45 min 41.000 sec E (of Greenwich).","7020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_162[] = {"6287","Qornoq","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_163[] = {"6288","Loma Quintana","","","Fundamental Point: Loma Quintana","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_164[] = {"6289","Amersfoort","","","Fundamental Point: Amersfoort. Latitude: 52 deg 09 min 22.178 sec N; Longitude: 5 deg 23 min 15.478 sec E (of Greenwich).","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_165[] = {"6291","South American Datum 1969","SAD69","","","7036","1996-10-18 00:00:00","","EPSG","SAD69 uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision is 0 to 31mm.","96.09 97.252",NULL};
+datafile_rows_t geod_datum_row_166[] = {"6292","Sapper Hill 1943","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_167[] = {"6293","Schwarzeck","","","","7006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_168[] = {"6294","Segora","","","","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_169[] = {"6295","Serindung","","","","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_170[] = {"6296","Sudan","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_171[] = {"6297","Tananarive 1925","Tananarive","","Fundamental Point: Tananarive observatory. Latitude: 18 deg 55 min 2.100 sec S; Longitude: 45 deg 12 min 52.800 sec E (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_172[] = {"6298","Timbalai 1948","","","Fundamental Point: Timbalai. Latitude: 5 deg 17 min 3.548 sec N; Longitude: 115 deg 10 min 56.409 sec E (of Greenwich).","7016","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_173[] = {"6299","TM65","","","","7002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_174[] = {"6300","TM75","","","","7002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_175[] = {"6301","Tokyo","","","Fundamental Point: Nikon-Keido-Genten. Latitude: 35 deg 39 min 17.5148 sec N; Longitude: 139 deg 44 min 40.5020 sec E (of Greenwich).","7004","1995-06-02 00:00:00","Geographic Survey Institute; Japan; Bulletin 40 (March 1994). Also http://vldb.gsi-mc.go.jp/sokuchi/datum/tokyodatum.html","EPSG","","98.46",NULL};
+datafile_rows_t geod_datum_row_176[] = {"6302","Trinidad 1903","","","","7007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_177[] = {"6303","Trucial Coast 1948","TC(1948)","","Fundamental Point: TC1. Latitude: 25 deg 23 min 50.190 sec N; Longitude: 55 deg 26 min 43.950 sec E (of Greenwich).","7020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_178[] = {"6304","Voirol 1875","","","Fundamental Point: Voirol. Latitude: 40.835864 grads N; Longitude: 0.788735 grads E of Paris.","7011","1995-06-02 00:00:00","IGN Paris","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_179[] = {"6305","Voirol Unifie 1960","Voirol Unifie","","","7012","1999-10-20 00:00:00","\"Le System Geodesique Nord-Sahara\"; IGN Paris","EPSG","Conformal transformation from ED50. Used only with Lambert Algeria zones: in other cases use Nord Sahara 1959 geodetic datum.","99.62",NULL};
+datafile_rows_t geod_datum_row_180[] = {"6306","Bern 1938","","","Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min 7.890 sec N; Longitude: 7 deg 26 min 22.335 sec E (of Greenwich).","7004","1995-06-02 00:00:00","\"Die Projektionen der schweizerischen Plan- und Kartenwerke\"; J. Bolliger 1967","EPSG","This redetermination of the coordinates of fundamental point is used for scientific purposes and as the graticule overprinted on topographic maps constructed on the CH1903 / [...]
+datafile_rows_t geod_datum_row_181[] = {"6307","Nord Sahara 1959","","","","7012","1999-10-20 00:00:00","\"Le System Geodesique Nord-Sahara\"; IGN Paris","EPSG","Conformal transformation from ED50.","99.62",NULL};
+datafile_rows_t geod_datum_row_182[] = {"6308","Stockholm 1938","RT38","","Fundamental Point: Stockholm observatory","7004","1996-04-12 00:00:00","","EPSG","Superseded by RT90 adjustment (datum code 6124)","",NULL};
+datafile_rows_t geod_datum_row_183[] = {"6309","Yacare","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_184[] = {"6310","Yoff","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_185[] = {"6311","Zanderij","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_186[] = {"6312","Militar-Geographische Institut","MGI","","Fundamental Point: Hermannskogel. Latitude: 48 deg 16 min 15.29 sec N; Longitude: 16 deg 17 min 41.06 sec E (of Greenwich).","7004","1995-06-02 00:00:00","Bundesamt fur Eich- und Vermessungswesen; Wien","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_187[] = {"6313","Reseau National Belge 1972","Belge 1972","","Fundamental Point: Uccle observatory. Latitude: 50 deg 47 min 57.704 sec N; Longitude: 4 deg 21 min 24.983 sec E (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_188[] = {"6314","Deutsche Hauptdreiecksnetz","DHDN","","Fundamental Point: Potsdam. Latitude: 52 deg 22 min 53.954 sec N; Longitude: 13 deg 04 min 01.153 sec E (of Greenwich).","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_189[] = {"6315","Conakry 1905","","","Fundamental Point: Conakry. Latitude: 10.573766g N; Longitude: 17.833682g W (of Paris).","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_190[] = {"6316","Dealul Piscului 1933","","","Fundamental point: latitude 44 deg 24 min 33.9606 sec N; longitude 26 deg 06 min 44.8772 sec E (of Greenwich).","7022","1996-04-12 00:00:00","Institute for Geodesy Photogrametry and Land Management","EPSG","Superseded by 1970 adjustment (datum code 6317)","",NULL};
+datafile_rows_t geod_datum_row_191[] = {"6317","Dealul Piscului 1970","","","Fundamental point: latitude 44 deg 24 min 23.7709 sec N; longitude 26deg 06 min 44.1265 sec E (of Greenwich).","7024","1996-04-12 00:00:00","Institute for Geodesy Photogrametry and Land Management","EPSG","Supersedes 1933 adjustment (datum code 6316)","",NULL};
+datafile_rows_t geod_datum_row_192[] = {"6318","National Geodetic Network","NGN","","","7030","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_193[] = {"6319","Kuwait Utility","KUDAMS","","","7019","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_194[] = {"6322","World Geodetic System 1972","WGS 72","","","7043","1999-04-22 00:00:00","","EPSG","Used by GPS before 1987. For Transit satellite positioning see also WGS 72BE. \
+Datum code 6323 reserved for southern hemisphere ProjCS's.","99.03",NULL};
+datafile_rows_t geod_datum_row_195[] = {"6324","WGS 72 Transit Broadcast Ephemeris","WGS 72BE","","","7043","1999-04-22 00:00:00","","EPSG","Alleged datum for use with Transit broadcast ephemeris prior to 1989. Relationship to WGS 72 has changed over time. Datum code 6325 reserved for southern hemisphere ProjCS's.","99.03",NULL};
+datafile_rows_t geod_datum_row_196[] = {"6326","World Geodetic System 1984","WGS 84","","Origin at geocentre.","7030","1995-06-02 00:00:00","","EPSG","Datum code 6327 reserved for southern hemisphere ProjCS's","",NULL};
+datafile_rows_t geod_datum_row_197[] = {"6600","Anguilla 1957","","","Fundamental point: station A4.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_198[] = {"6601","Antigua 1943","","","Fundamental point: station A14.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_199[] = {"6602","Dominica 1945","","","Fundamental point: station M12.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_200[] = {"6603","Grenada 1953","","","Fundamental point: station GS8.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_201[] = {"6604","Montserrat 1958","","","Fundamental point: station M36.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_202[] = {"6605","St. Kitts 1955","","","Fundamental point: station K12.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_203[] = {"6606","St. Lucia 1955","","","Fundamental point: station DCS3.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_204[] = {"6607","St. Vincent 1945","","","Fundamental point: station V1.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_205[] = {"6608","North American Datum 1927 (1976)","NAD27(76)","","Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).","7008","1999-05-12 00:00:00","Geodetic Survey of Canada.","EPSG","NAD27(76) used in Ontario for all maps at scale 1/20 000 and larger; elsewhere in Canada for selected purposes.","",NULL};
+datafile_rows_t geod_datum_row_206[] = {"6609","North American Datum 1927 (CGQ77)","CGQ77","","Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).","7008","1999-05-12 00:00:00","Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca","EPSG","NAD27 (CGQ77) used in Quebec for all maps at scale 1/20 000 and larger; generally for maps issued by the Quebec cartography office whose reference system is CGQ77.", [...]
+datafile_rows_t geod_datum_row_207[] = {"6901","Ancienne Triangulation Francaise","ATF","","","7027","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_208[] = {"6902","Nord de Guerre","NDG","","","7027","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_209[] = {"6903","Madrid 1870","","","Fundamental point: Madrid observatory.","7028","1998-11-11 00:00:00","Institut de Geomatica; Barcelona","EPSG","","",NULL};
+
+datafile_rows_t *geod_datum_rows[] = {geod_datum_row_1,geod_datum_row_2,geod_datum_row_3,geod_datum_row_4,geod_datum_row_5,geod_datum_row_6,geod_datum_row_7,geod_datum_row_8,geod_datum_row_9,geod_datum_row_10,geod_datum_row_11,geod_datum_row_12,geod_datum_row_13,geod_datum_row_14,geod_datum_row_15,geod_datum_row_16,geod_datum_row_17,geod_datum_row_18,geod_datum_row_19,geod_datum_row_20,geod_datum_row_21,geod_datum_row_22,geod_datum_row_23,geod_datum_row_24,geod_datum_row_25,geod_datum_ro [...]
diff --git a/src/tiff/csv/geod_datum.csv b/src/tiff/csv/geod_datum.csv
new file mode 100644
index 0000000..94a13d9
--- /dev/null
+++ b/src/tiff/csv/geod_datum.csv
@@ -0,0 +1,210 @@
+"GEOD_DATUM_CODE","GEOD_DAT_EPSG_NAME","GEOD_DAT_EPSG_ABBR","GEOD_DAT_USER_NAME","ORIGIN_DESCRIPTION","ELLIPSOID_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+6001,Not specified (based on ellipsoid 7001),,,,7001,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6002,Not specified (based on ellipsoid 7002),,,,7002,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6003,Not specified (based on ellipsoid 7003),,,,7003,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6004,Not specified (based on ellipsoid 7004),,,,7004,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6005,Not specified (based on ellipsoid 7005),,,,7005,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6006,Not specified (based on ellipsoid 7006),,,,7006,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6007,Not specified (based on ellipsoid 7007),,,,7007,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6008,Not specified (based on ellipsoid 7008),,,,7008,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6009,Not specified (based on ellipsoid 7009),,,,7009,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6010,Not specified (based on ellipsoid 7010),,,,7010,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6011,Not specified (based on ellipsoid 7011),,,,7011,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6012,Not specified (based on ellipsoid 7012),,,,7012,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6013,Not specified (based on ellipsoid 7013),,,,7013,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6014,Not specified (based on ellipsoid 7014),,,,7014,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6015,Not specified (based on ellipsoid 7015),,,,7015,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6016,Not specified (based on ellipsoid 7016),,,,7016,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6017,Not specified (based on ellipsoid 7017),,,,7044,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6018,Not specified (based on ellipsoid 7018),,,,7018,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6019,Not specified (based on ellipsoid 7019),,,,7019,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6020,Not specified (based on ellipsoid 7020),,,,7020,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6021,Not specified (based on ellipsoid 7021),,,,7021,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6022,Not specified (based on ellipsoid 7022),,,,7022,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6024,Not specified (based on ellipsoid 7024),,,,7024,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6025,Not specified (based on ellipsoid 7025),,,,7025,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6027,Not specified (based on ellipsoid 7027),,,,7027,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6028,Not specified (based on ellipsoid 7028),,,,7028,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6029,Not specified (based on ellipsoid 7029),,,,7029,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6030,Not specified (based on ellipsoid 7030),,,,7030,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6031,Not specified (based on ellipsoid 7031),,,,7031,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6032,Not specified (based on ellipsoid 7032),,,,7032,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6033,Not specified (based on ellipsoid 7033),,,,7033,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6034,Not specified (based on ellipsoid 7034),,,,7034,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6035,Not specified (based on ellipsoid 7035),,,,7035,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,96.08
+6036,Not specified (based on ellipsoid 7036),,,,7036,1996-09-12 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,
+6041,Not specified (based on ellipsoid 7041),,,,7041,1999-10-20 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,
+6042,Not specified (based on ellipsoid 7042),,,,7042,1999-10-20 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,
+6043,Not specified (based on ellipsoid 7043),,,,7043,1999-10-20 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,
+6044,Not specified (based on ellipsoid 7044),,,,7044,1999-10-20 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,
+6045,Not specified (based on ellipsoid 7045),,,,7045,1999-10-20 00:00:00,,EPSG,Not a valid datum. Included for coordinate systems where datum is unknown.,
+6120,Greek,,,Fundamental point: Athens Observatory; latitude 37 deg 58 min 20.132 sec N; longitude 23 deg 42 min 58.815 sec E of Greenwich,7004,1997-06-16 00:00:00,Topography Department; National Technical University of Athens,EPSG,See geodetic datum alias 6404. Used as basis of topographic mapping based on Hatt projection.,
+6121,Greek Geodetic Reference System 1987,GGRS87,,Fundamental point: Dionysos; latitude 38 deg 04 min 33.8 sec N; longitude 23 deg 55 min 51.0 sec E of Greenwich; geoid height 7.0 m.,7019,1997-06-16 00:00:00,L. Portokalakis; Public Petroleum Corporation of Greece,EPSG,Superseded (old) Greek datum. Oil industry work based on ED50.,
+6122,Average Terrestrial System 1977,ATS77,,,7041,1997-07-02 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1979. To be phased out in late 1990's.,
+6123,Kartastokoordinaattijarjestelma,KKJ,,Adjustment with fundamental point based on ED50 transformed to best fit the older VVJ adjustment.,7022,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,Adopted in 1970.,
+6124,Rikets koordinatsystem 1990,RT90,,,7004,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,Supersedes RT38 adjustment (datum code 6308),
+6125,Samboja,,,Original origin station P2 Exc now destroyed. Extensions recomputed using Toran station T9 as origin.,7004,1997-11-13 00:00:00,Total Indonesia.,EPSG,,
+6126,Lithuania 1994 (ETRS89),LKS94 (ETRS89),,Densification from 4 ETRF89 points.,7019,1998-03-12 00:00:00,HNIT-Baltic GeoInfoServisas,EPSG,Densification of ETRS89 during the 1992 Baltic campaign.,
+6127,Tete,,,Fundamental point: Tete.,7008,1998-04-16 00:00:00,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+6128,Madzansua,,,Fundamental point: Madzansua.,7008,1998-04-16 00:00:00,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Superseded by transformation to Tete datum (datum code 6127).,
+6129,Observatario,,,Fundamental point: Maputo observatory.,7008,1998-04-16 00:00:00,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Superseded by transformation to Tete datum (datum code 6127).,
+6130,Moznet (ITRF94),Moznet,,ITRF 1994 epoch 20,7030,1998-04-16 00:00:00,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+6131,Indian 1960,,,,7015,1998-11-11 00:00:00,,EPSG,DMA adjustment of IndoChina part of the Indian 1954 network to better fit local geoid. Also known as Indian (DMA Reduced).,
+6132,Final Datum 1958,FD58,,Fundamental point: Maniyur. Latitude: 31 deg 23 min 59.19 sec N; Longitude: 48 deg 32 min 31.38 sec E (of Greenwich).,7012,1998-11-11 00:00:00,IOEPC records,EPSG,Network included in Nahrwan 1967 adjustment.,
+6133,Estonia 1992,EST92,,Densification from 4 ETRS89 points.,7019,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,Based on ETRS89 as established during the 1992 Baltic campaign.,
+6134,PDO Survey Datum 1993,PSD93,,Adjustment best fitted to Fahud network.,7012,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Supersedes Fahud datum (code 6232). Maximum differences to Fahud adjustment are 20 metres.,
+6135,Old Hawaiian,,,Fundamental Point: Oahu West Base Astro. Latitude: 21 deg 18 min 13.89 sec N; longitude 157 deg 50 min 55.79 sec W (of Greenwich),7008,1999-05-24 00:00:00,http://www.ngs.noaa.gov/ (NADCON readme file) and the NIMA publication http://164.214.2.59/publications/guides/Datum_Pamphlet/datum.html,EPSG,Hawaiian Islands were never on NAD27 but rather on Old Hawaiian Datum. NADCON conversion program provides transformation from Old Hawaiian Datum to NAD83 (original 1986 real [...]
+6136,St. Lawrence Island,,,,7008,1999-05-24 00:00:00,http://www.ngs.noaa.gov/ (NADCON readme file),EPSG,Many Alaskan islands were never on NAD27 but rather on independent datums. NADCON conversion program provides transformation from St. Lawrence Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.,
+6137,St. Paul Island,,,,7008,1999-05-24 00:00:00,http://www.ngs.noaa.gov/ (NADCON readme file),EPSG,Many Alaskan islands were never on NAD27 but rather on independent datums. NADCON conversion program provides transformation from St. Paul Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.,
+6138,St. George Island,,,,7008,1999-05-24 00:00:00,http://www.ngs.noaa.gov/ (NADCON readme file),EPSG,Many Alaskan islands were never on NAD27 but rather on independent datums. NADCON conversion program provides transformation from St. George Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.,
+6139,Puerto Rico,,,,7008,1999-05-24 00:00:00,Ordnance Survey of Great Britain and http://www.ngs.noaa.gov/ (NADCON readme file).,EPSG,NADCON conversion program provides transformation from Puerto Rico Datum to NAD83 (original 1986 realization) but making the transformation appear to user as if from NAD27.,
+6140,NAD83 Canadian Spatial Reference System,NAD83(CSRS98),,,7019,1999-10-20 00:00:00,Service New Brunswick Land and Information Standards Manual,EPSG,Supersedes ATS77 from 1999 in New Brunswick.,
+6141,Israel,,,Fundamental Point: Latitude: 31 deg 44 min 03.817 sec N; Longitude: 35 deg 12 min 16.261 sec E (of Greenwich).,7019,1999-10-20 00:00:00,Survey of Israel.,EPSG,,
+6142,Locodjo 1965,,,Fundamental Point: T5 Banco. Latitude: 5 deg 18 min 50.5 sec N; Longitude: 4 deg 02 min 05.1 sec W (of Greenwich).,7012,1999-10-20 00:00:00,IGN Paris.,EPSG,,
+6143,Abidjan 1987,,,Fundamental Point: Abidjan I. Latitude: 5 deg 18 min 51.01 sec N; Longitude: 4 deg 02 min 06.04 sec W (of Greenwich).,7012,1999-10-20 00:00:00,IGN Paris.,EPSG,,
+6144,Kalianpur 1937,,,Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,7015,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Supercedes 1880 adjustment except for topographic mapping. Superseded in Pakistan by 1962 metrication conversion and in India by 1975 metrication conversion.,
+6145,Kalianpur 1962,,,Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,7044,1999-10-20 00:00:00,,EPSG,1937 adjustment rescaled by ratio metric conversions of Indian foot (1937) to Indian foot (1962).,
+6146,Kalianpur 1975,,,Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,7045,1999-10-20 00:00:00,,EPSG,1937 adjustment rescaled by ratio metric conversions of Indian foot (1937) to Indian foot (1975).,
+6147,Hanoi 1972,,,,7024,1999-10-20 00:00:00,PetroVietnam,EPSG,,
+6148,Hartbeesthoek94,,,Coincident with ITRF91 (1994.0) at Hartbeesthoek astronomical observatory near Pretoria.,7030,1999-10-22 00:00:00,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,Supersedes Cape datum (code 6222).,
+6149,CH1903,,,Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min 8.660 sec N; Longitude: 7 deg 26 min 22.500 sec E (of Greenwich).,7004,1999-10-20 00:00:00,Bundesamt f�r Landestopographie,EPSG,,
+6150,CH1903+,,,Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min 8.660 sec N; Longitude: 7 deg 26 min 22.500 sec E (of Greenwich).,7004,1999-10-20 00:00:00,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,,
+6151,Swiss Terrestrial Reference Frame 1995,CHTRF95,,ETRF89 at 1993.0,7019,1999-10-20 00:00:00,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,,
+6152,NAD83 (High Accuracy Regional Network),NAD83(HARN),,,7019,1999-10-20 00:00:00,National Geodetic Survey,EPSG,,
+6153,Rassadiran,,,Fundamental point: Total 1,7022,1999-11-20 00:00:00,Total-Fina,EPSG,,
+6154,ED50(ED77),,,Extension of ED50 over Iran,7022,1999-11-20 00:00:00,National Cartographic Centre of Iran,EPSG,Sometimes referred to as ED50-ED77,
+6200,Pulkovo 1995,,,Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 15.359 sec N; Longitude: 30 deg 19 min 28.318 sec E (of Greenwich).,7024,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+6201,Adindan,,,Fundamental Point: Station 15; Adindan. Latitude: 22 deg 10 min 7.110 sec N; Longitude: 31 deg 29 min 21.608 sec E (of Greenwich).,7012,1995-06-02 00:00:00,,EPSG,,
+6202,Australian Geodetic Datum 1966,AGD66,,Fundamental Point: Johnson Memorial. Latitude: 25 deg 56 min 54.551 sec S; Longitude: 133 deg 12 min 30.077 sec E (of Greenwich).,7003,1995-06-02 00:00:00,Australian Map Grid Technical Manual. National Mapping Council of Australia Technical Publication 7; 1972.,EPSG,,
+6203,Australian Geodetic Datum 1984,AGD84,,,7003,1995-06-02 00:00:00,,EPSG,,
+6204,Ain el Abd 1970,Ain el Abd,,Fundamental Point: Ain El Abd. Latitude: 28 deg 14 min 06.171 sec N; Longitude: 48 deg 16 min 20.906 sec E (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6205,Afgooye,,,,7024,1995-06-02 00:00:00,,EPSG,,
+6206,Agadez,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6207,Lisbon,,,Fundamental Point: Castelo Sao Jorge; Lisbon. Latitude: 38 deg 42 min 43.631 sec N; Longitude: 9 deg 07 min 54.862 sec W (of Greenwich).,7022,1995-06-02 00:00:00,Instituto Geografico e Cadastral; Lisbon,EPSG,,
+6208,Aratu,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6209,Arc 1950,,,Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).,7013,1995-06-02 00:00:00,,EPSG,,
+6210,Arc 1960,,,Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).,7012,1995-06-02 00:00:00,,EPSG,,
+6211,Batavia,,,Fundamental Point: Batavia Astro. Station. Latitude: 6 deg 7 min 39.520 sec S; Longitude: 106 deg 48 min 27.790 sec E (of Greenwich).,7004,1995-06-02 00:00:00,,EPSG,,
+6212,Barbados 1938,,,Fundamental point: HMS Challenger astro station M1; latitude 13 deg 04 min 32.53 sec N; longitude 59 deg 36 min 29.34 sec W (of Greenwich).,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,99.171
+6213,Beduaram,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6214,Beijing 1954,,,,7024,1995-06-02 00:00:00,,EPSG,,
+6215,Reseau National Belge 1950,Belge 1950,,Fundamental Point: Lommel (tower). Latitude: 51 deg 13 min 47.334 sec N; Longitude: 0 deg 56 min 44.773 sec E (of Brussels).,7022,1995-06-02 00:00:00,,EPSG,,
+6216,Bermuda 1957,,,,7008,1995-06-02 00:00:00,,EPSG,,
+6218,Bogota,,,Fundamental Point: Bogota observatory. Latitude: 4 deg 35 min 56.570 sec N; Longitude: 74 deg 4 min 51.300 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6219,Bukit Rimpah,,,,7004,1995-06-02 00:00:00,,EPSG,,
+6220,Camacupa,,,,7012,1995-06-02 00:00:00,,EPSG,,
+6221,Campo Inchauspe,,,Fundamental Point: Campo Inchauspe. Latitude: 35 deg 58 min 17.000 sec S; Longitude: 62 deg 10 min 12.000 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6222,Cape,,,Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).,7013,1996-10-18 00:00:00,"Private Communication, Directorate of Surveys and Land Information, Cape Town.",EPSG,,96.25 99.69
+6223,Carthage,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6224,Chua,,,Fundamental Point: Chua. Latitude: 19 deg 45 min 41.160 sec S; Longitude: 48 deg 6 min 7.560 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6225,Corrego Alegre,,,Fundamental Point: Corrego Alegre. Latitude: 19 deg 50 min 15.140 sec S; Longitude: 48 deg 57 min 42.750 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6226,Cote d'Ivoire,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6227,Deir ez Zor,,,Fundamental Point: Trig. 254 Deir. Latitude: 35 deg 21 min 49.975 sec N; Longitude: 40 deg 5 min 46.770 sec E (of Greenwich).,7011,1995-06-02 00:00:00,,EPSG,,
+6228,Douala,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6229,Egypt 1907,,,Fundamental Point: Station F1. Latitude: 30 deg 1 min 42.860 sec N; Longitude: 31 deg 16 min 33.600 sec E (of Greenwich).,7020,1995-06-02 00:00:00,,EPSG,,
+6230,European Datum 1950,ED50,,Fundamental Point: Potsdam (Helmert Tower). Latitude: 52 deg 22 min 51.450 sec N; Longitude: 13 deg 3 min 58.740 sec E (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6231,European Datum 1987,ED87,,,7022,1995-06-02 00:00:00,,EPSG,,
+6232,Fahud,,,Fundamental Point: Station NO68-024 Fahud. Latitude: 22 deg 17 min 31.182 sec N; Longitude: 56 deg 29 min 18.820 sec E (of Greenwich).,7012,1995-06-02 00:00:00,Petroleum Development Oman.,EPSG,Superseded by PSD93 (code 6134).,
+6233,Gandajika 1970,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6234,Garoua,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6235,Guyane Francaise,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6236,Hu Tzu Shan,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6237,Hungarian Datum 1972,HD72,,"Fundamental Point: Szolohegy. Latitude: 47 deg 17 min 32,6156 sec N; Longitude 19 deg 36 min 09.9865 sec E; geoid height 6.56m.",7036,1996-10-18 00:00:00,http://lazarus.elte.hu/gb/geodez/geod3.htm,EPSG,,96.09
+6238,Indonesian Datum 1974,ID74,,Fundamental Point: Padang. Latitude: 0 deg 56 min 38.414 sec S; Longitude: 100 deg 22 min 8.804 sec E (of Greenwich).,7021,1995-06-02 00:00:00,,EPSG,,
+6239,Indian 1954,,,Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,7015,1995-06-02 00:00:00,,EPSG,,
+6240,Indian 1975,,,Fundamental Point: Khau Sakaerang,7015,1995-06-02 00:00:00,,EPSG,,
+6241,Jamaica 1875,,,Fundamental Point: Fort Charles Flagstaff. Latitude: 17 deg 55 min 55.800 sec N; Longitude: 76 deg 56 min 37.260 sec W (of Greenwich).,7034,1995-06-02 00:00:00,,EPSG,,
+6242,Jamaica 1969,JAD69,,Fundamental Point: Fort Charles Flagstaff. Latitude: 17 deg 55 min 55.800 sec N; Longitude: 76 deg 56 min 37.260 sec W (of Greenwich).,7008,1995-06-02 00:00:00,,EPSG,,
+6243,Kalianpur 1880,,,Fundamental Point: Kalianpur. Latitude: 24 deg 07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,7042,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Includes 1916 extrension into Burma (Myanmar). Superseded by 1937 adjustment.,97.23
+6244,Kandawala,,,,7015,1995-06-02 00:00:00,,EPSG,,
+6245,Kertau,,,Fundamental Point: Kertau. Latitude: 3 deg 27 min 50.710 sec N; Longitude: 102 deg 37 min 24.550 sec E (of Greenwich).,7018,1995-06-02 00:00:00,,EPSG,,
+6246,Kuwait Oil Company,KOC,,,7012,1995-06-02 00:00:00,,EPSG,,
+6247,La Canoa,,,Fundamental Point: La Canoa. Latitude: 8 deg 34 min 17.170 sec N; Longitude: 63 deg 51 min 34.880 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,Origin also adopted for PSAD56.,
+6248,Provisional South American Datum 1956,PSAD56,,Fundamental Point: La Canoa. Latitude: 8 deg 34 min 17.170 sec N; Longitude: 63 deg 51 min 34.880 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,Same origin as La Canoa datum.,
+6249,Lake,,,Fundamental Point: Maracaibo Cathedral. Latitude: 10 deg 38 min 34.678 sec N; Longitude: 71 deg 36 min 20.224 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6250,Leigon,,,Fundamental Point: GCS Station 121. Latitude: 5 deg 38 min 52.270 sec N; Longitude: 0 deg 11 min 46.080 sec W (of Greenwich).,7012,1995-06-02 00:00:00,,EPSG,,
+6251,Liberia 1964,,,,7012,1995-06-02 00:00:00,,EPSG,,
+6252,Lome,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6253,Luzon 1911,,,Fundamental Point: Balacan. Latitude: 13 deg 33 min 41.000 sec N; Longitude: 121 deg 52 min 03.000 sec E (of Greenwich).,7008,1995-06-02 00:00:00,,EPSG,,
+6254,Hito XVIII 1963,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6255,Herat North,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6256,Mahe 1971,,,Fundamental Point: Mahe,7012,1995-06-02 00:00:00,,EPSG,,
+6257,Makassar,,,Fundamental Point: Moncongloe,7004,1995-06-02 00:00:00,,EPSG,,
+6258,European Terrestrial Reference Frame 89,ETRF89,,,7019,1999-04-22 00:00:00,,EPSG,Coincides with WGS84 at the one metre level.,97.11 97.55 99.111
+6259,Malongo 1987,,,Fundamental Point: Station Y at Malongo base camp. Latitude: 5 deg 23 min 34.327 sec S; Longitude: 12 deg 12 min 02.393 sec E (of Greenwich).,7022,1995-06-02 00:00:00,Chevron Petroleum Technology.,EPSG,Offshore extension of Mhast datum (6264) using Transit translocation.,
+6260,Manoca,,,,7012,1995-06-02 00:00:00,,EPSG,,
+6261,Merchich,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6262,Massawa,,,,7004,1995-06-02 00:00:00,,EPSG,,
+6263,Minna,,,Fundamental Point: Minna base station L40. Latitude: 9 deg 38 min 09.000 sec N; Longitude: 6 deg 30 min 59.000 sec E (of Greenwich).,7012,1995-06-02 00:00:00,,EPSG,,
+6264,Mhast,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6265,Monte Mario,,,Fundamental Point: Monte Mario. Latitude: 41 deg 55 min 25.510 sec N; Longitude: 0 deg 00 min 00.000 sec E (of Rome).,7022,1995-06-02 00:00:00,,EPSG,,
+6266,M'poraloko,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6267,North American Datum 1927,NAD27,,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,7008,1995-06-02 00:00:00,,EPSG,,
+6268,NAD Michigan,,,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,7009,1995-06-02 00:00:00,,EPSG,,
+6269,North American Datum 1983,NAD83,,Origin at geocentre.,7019,1995-06-02 00:00:00,,EPSG,,
+6270,Nahrwan 1967,,,Fundamental point: Nahrwan south base. Latitude: 33 deg 19 min 10.87 sec N; Longitude: 44 deg 43 min 25.54 sec E (of Greenwich).,7012,1995-06-02 00:00:00,,EPSG,,
+6271,Naparima 1972,,,Fundamental Point: Naparima. Latitude: 10 deg 16 min 44.860 sec N; Longitude: 61 deg 27 min 34.620 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6272,New Zealand Geodetic Datum 1949,GD49,,Fundamental Point: Papatahi. Latitude: 41 deg 19 min 8.900 sec S; Longitude: 175 deg 02 min 51.000 sec E (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6273,NGO 1948,,,,7005,1995-06-02 00:00:00,,EPSG,,
+6274,Datum 73,,,Fundamental Point: Latitude: 39 deg 41 min 37.30 sec N; Longitude: 8 deg 07 min 53.31 sec W (of Greenwich).,7022,1995-06-02 00:00:00,Instituto Geografico e Cadastral; Lisbon,EPSG,,
+6275,Nouvelle Triangulation Francaise,NTF,,Fundamental Point: Pantheon,7011,1995-06-02 00:00:00,,EPSG,,
+6276,NSWC 9Z-2,,,,7025,1995-06-02 00:00:00,,EPSG,Transit precise ephemeris before 1991.,
+6277,OSGB 1936,,,Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).,7001,1995-06-02 00:00:00,,EPSG,,
+6278,OSGB 1970 (SN),OSGB70,,Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).,7001,1995-06-02 00:00:00,,EPSG,,
+6279,OS (SN) 1980,OS(SN)80,,Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).,7001,1995-06-02 00:00:00,,EPSG,,
+6280,Padang 1884,Padang,,Fundamental Point: Padang,7004,1995-06-02 00:00:00,,EPSG,,
+6281,Palestine 1923,,,Fundamental Point: Point 82'M Jerusalem. Latitude: 31 deg 44 min 2.749 sec N; Longitude: 35 deg 12 min 43.490 sec E (of Greenwich).,7010,1995-06-02 00:00:00,,EPSG,,
+6282,Pointe Noire,,,Fundamental Point: Point Noire Astro. Latitude: 4 deg 47 min 0.100 sec S; Longitude: 11 deg 51 min 1.550 sec E (of Greenwich).,7011,1995-06-02 00:00:00,,EPSG,,
+6283,Geocentric Datum of Australia 1994,GDA94,,,7019,1995-06-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Coincident with WGS84 to within 1 metre.,
+6284,Pulkovo 1942,,,Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 18.550 sec N; Longitude: 30 deg 19 min 42.090 sec E (of Greenwich).,7024,1995-06-02 00:00:00,,EPSG,,
+6285,Qatar,,,Fundamental Point: Station G3,7022,1995-06-02 00:00:00,,EPSG,,
+6286,Qatar 1948,,,Fundamental Point: Sokey 0 M. Latitude: 25 deg 22 min 56.500 sec N; Longitude: 50 deg 45 min 41.000 sec E (of Greenwich).,7020,1995-06-02 00:00:00,,EPSG,,
+6287,Qornoq,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6288,Loma Quintana,,,Fundamental Point: Loma Quintana,7022,1995-06-02 00:00:00,,EPSG,,
+6289,Amersfoort,,,Fundamental Point: Amersfoort. Latitude: 52 deg 09 min 22.178 sec N; Longitude: 5 deg 23 min 15.478 sec E (of Greenwich).,7004,1995-06-02 00:00:00,,EPSG,,
+6291,South American Datum 1969,SAD69,,,7036,1996-10-18 00:00:00,,EPSG,SAD69 uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision is 0 to 31mm.,96.09 97.252
+6292,Sapper Hill 1943,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6293,Schwarzeck,,,,7006,1995-06-02 00:00:00,,EPSG,,
+6294,Segora,,,,7004,1995-06-02 00:00:00,,EPSG,,
+6295,Serindung,,,,7004,1995-06-02 00:00:00,,EPSG,,
+6296,Sudan,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6297,Tananarive 1925,Tananarive,,Fundamental Point: Tananarive observatory. Latitude: 18 deg 55 min 2.100 sec S; Longitude: 45 deg 12 min 52.800 sec E (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6298,Timbalai 1948,,,Fundamental Point: Timbalai. Latitude: 5 deg 17 min 3.548 sec N; Longitude: 115 deg 10 min 56.409 sec E (of Greenwich).,7016,1995-06-02 00:00:00,,EPSG,,
+6299,TM65,,,,7002,1995-06-02 00:00:00,,EPSG,,
+6300,TM75,,,,7002,1995-06-02 00:00:00,,EPSG,,
+6301,Tokyo,,,Fundamental Point: Nikon-Keido-Genten. Latitude: 35 deg 39 min 17.5148 sec N; Longitude: 139 deg 44 min 40.5020 sec E (of Greenwich).,7004,1995-06-02 00:00:00,Geographic Survey Institute; Japan; Bulletin 40 (March 1994). Also http://vldb.gsi-mc.go.jp/sokuchi/datum/tokyodatum.html,EPSG,,98.46
+6302,Trinidad 1903,,,,7007,1995-06-02 00:00:00,,EPSG,,
+6303,Trucial Coast 1948,TC(1948),,Fundamental Point: TC1. Latitude: 25 deg 23 min 50.190 sec N; Longitude: 55 deg 26 min 43.950 sec E (of Greenwich).,7020,1995-06-02 00:00:00,,EPSG,,
+6304,Voirol 1875,,,Fundamental Point: Voirol. Latitude: 40.835864 grads N; Longitude: 0.788735 grads E of Paris.,7011,1995-06-02 00:00:00,IGN Paris,EPSG,,
+6305,Voirol Unifie 1960,Voirol Unifie,,,7012,1999-10-20 00:00:00,"\"Le System Geodesique Nord-Sahara\"; IGN Paris",EPSG,Conformal transformation from ED50. Used only with Lambert Algeria zones: in other cases use Nord Sahara 1959 geodetic datum.,99.62
+6306,Bern 1938,,,Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min 7.890 sec N; Longitude: 7 deg 26 min 22.335 sec E (of Greenwich).,7004,1995-06-02 00:00:00,"\"Die Projektionen der schweizerischen Plan- und Kartenwerke\"; J. Bolliger 1967",EPSG,This redetermination of the coordinates of fundamental point is used for scientific purposes and as the graticule overprinted on topographic maps constructed on the CH1903 / LV03 projected CS (code 21781).,
+6307,Nord Sahara 1959,,,,7012,1999-10-20 00:00:00,"\"Le System Geodesique Nord-Sahara\"; IGN Paris",EPSG,Conformal transformation from ED50.,99.62
+6308,Stockholm 1938,RT38,,Fundamental Point: Stockholm observatory,7004,1996-04-12 00:00:00,,EPSG,Superseded by RT90 adjustment (datum code 6124),
+6309,Yacare,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6310,Yoff,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6311,Zanderij,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6312,Militar-Geographische Institut,MGI,,Fundamental Point: Hermannskogel. Latitude: 48 deg 16 min 15.29 sec N; Longitude: 16 deg 17 min 41.06 sec E (of Greenwich).,7004,1995-06-02 00:00:00,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,,
+6313,Reseau National Belge 1972,Belge 1972,,Fundamental Point: Uccle observatory. Latitude: 50 deg 47 min 57.704 sec N; Longitude: 4 deg 21 min 24.983 sec E (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6314,Deutsche Hauptdreiecksnetz,DHDN,,Fundamental Point: Potsdam. Latitude: 52 deg 22 min 53.954 sec N; Longitude: 13 deg 04 min 01.153 sec E (of Greenwich).,7004,1995-06-02 00:00:00,,EPSG,,
+6315,Conakry 1905,,,Fundamental Point: Conakry. Latitude: 10.573766g N; Longitude: 17.833682g W (of Paris).,7011,1995-06-02 00:00:00,,EPSG,,
+6316,Dealul Piscului 1933,,,Fundamental point: latitude 44 deg 24 min 33.9606 sec N; longitude 26 deg 06 min 44.8772 sec E (of Greenwich).,7022,1996-04-12 00:00:00,Institute for Geodesy Photogrametry and Land Management,EPSG,Superseded by 1970 adjustment (datum code 6317),
+6317,Dealul Piscului 1970,,,Fundamental point: latitude 44 deg 24 min 23.7709 sec N; longitude 26deg 06 min 44.1265 sec E (of Greenwich).,7024,1996-04-12 00:00:00,Institute for Geodesy Photogrametry and Land Management,EPSG,Supersedes 1933 adjustment (datum code 6316),
+6318,National Geodetic Network,NGN,,,7030,1996-04-12 00:00:00,,EPSG,,
+6319,Kuwait Utility,KUDAMS,,,7019,1996-04-12 00:00:00,,EPSG,,
+6322,World Geodetic System 1972,WGS 72,,,7043,1999-04-22 00:00:00,,EPSG,"Used by GPS before 1987. For Transit satellite positioning see also WGS 72BE. \
+Datum code 6323 reserved for southern hemisphere ProjCS's.",99.03
+6324,WGS 72 Transit Broadcast Ephemeris,WGS 72BE,,,7043,1999-04-22 00:00:00,,EPSG,Alleged datum for use with Transit broadcast ephemeris prior to 1989. Relationship to WGS 72 has changed over time. Datum code 6325 reserved for southern hemisphere ProjCS's.,99.03
+6326,World Geodetic System 1984,WGS 84,,Origin at geocentre.,7030,1995-06-02 00:00:00,,EPSG,Datum code 6327 reserved for southern hemisphere ProjCS's,
+6600,Anguilla 1957,,,Fundamental point: station A4.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6601,Antigua 1943,,,Fundamental point: station A14.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6602,Dominica 1945,,,Fundamental point: station M12.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6603,Grenada 1953,,,Fundamental point: station GS8.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6604,Montserrat 1958,,,Fundamental point: station M36.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6605,St. Kitts 1955,,,Fundamental point: station K12.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6606,St. Lucia 1955,,,Fundamental point: station DCS3.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6607,St. Vincent 1945,,,Fundamental point: station V1.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6608,North American Datum 1927 (1976),NAD27(76),,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,7008,1999-05-12 00:00:00,Geodetic Survey of Canada.,EPSG,NAD27(76) used in Ontario for all maps at scale 1/20 000 and larger; elsewhere in Canada for selected purposes.,
+6609,North American Datum 1927 (CGQ77),CGQ77,,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,7008,1999-05-12 00:00:00,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,NAD27 (CGQ77) used in Quebec for all maps at scale 1/20 000 and larger; generally for maps issued by the Quebec cartography office whose reference system is CGQ77.,
+6901,Ancienne Triangulation Francaise,ATF,,,7027,1995-06-02 00:00:00,,EPSG,,
+6902,Nord de Guerre,NDG,,,7027,1995-06-02 00:00:00,,EPSG,,
+6903,Madrid 1870,,,Fundamental point: Madrid observatory.,7028,1998-11-11 00:00:00,Institut de Geomatica; Barcelona,EPSG,,
diff --git a/src/tiff/csv/geod_trf.c b/src/tiff/csv/geod_trf.c
new file mode 100644
index 0000000..9e6808c
--- /dev/null
+++ b/src/tiff/csv/geod_trf.c
@@ -0,0 +1,492 @@
+#include "defs.h"
+datafile_rows_t geod_trf_row_1[] = {"GEOD_TRF_CODE","GEOD_TRF_EPSG_NAME","GEOD_TRF_USER_NAME","DESCRIPTION","SOURCE_HORIZCS_CODE","TARGET_HORIZCS_CODE","COORD_TRF_VARIANT","CONCAT_TRF_AREA_OF_USE","COORD_TRF_PATH_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","CONCAT_TRF_REMARKS","CHANGE_ID",NULL};
+datafile_rows_t geod_trf_row_2[] = {"8000","Adindan to WGS 84 (1)","","DMA-Eth Sud","4201","4326","1","","8400","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_3[] = {"8001","Adindan to WGS 84 (2)","","DMA-Bfa","4201","4326","2","","8401","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_4[] = {"8002","Adindan to WGS 84 (3)","","DMA-Cmr","4201","4326","3","","8402","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_5[] = {"8003","Adindan to WGS 84 (4)","","DMA-Eth","4201","4326","4","","8403","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_6[] = {"8004","Adindan to WGS 84 (5)","","DMA-Mli","4201","4326","5","","8404","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_7[] = {"8005","Adindan to WGS 84 (6)","","DMA-Sen","4201","4326","6","","8405","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_8[] = {"8006","Adindan to WGS 84 (7)","","DMA-Sud","4201","4326","7","","8406","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_9[] = {"8007","Afgooye to WGS 84 (1)","","DMA-Som","4205","4326","1","","8407","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_10[] = {"8008","AGD66 to WGS 84 (1)","","DMA-Aus","4202","4326","1","","8408","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_11[] = {"8009","AGD84 to WGS 84 (1)","","DMA-Aus","4203","4326","1","","8409","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_12[] = {"8010","Ain el Abd to WGS 84 (1)","","DMA-Bhr","4204","4326","1","","8410","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_13[] = {"8011","Ain el Abd to WGS 84 (2)","","DMA-Sau","4204","4326","2","","8411","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_14[] = {"8012","Amersfoort to WGS 84 (1)","","NCG-Nld","4289","4326","1","","8412","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_15[] = {"8013","Arc 1950 to WGS 84 (1)","","DMA-mean","4209","4326","1","","8413","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_16[] = {"8014","Arc 1950 to WGS 84 (2)","","DMA-Bwa","4209","4326","2","","8414","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_17[] = {"8015","Arc 1950 to WGS 84 (3)","","DMA-Bdi","4209","4326","3","","8415","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_18[] = {"8016","Arc 1950 to WGS 84 (4)","","DMA-Lso","4209","4326","4","","8416","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_19[] = {"8017","Arc 1950 to WGS 84 (5)","","DMA-Mwi","4209","4326","5","","8417","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_20[] = {"8018","Arc 1950 to WGS 84 (6)","","DMA-Swz","4209","4326","6","","8418","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_21[] = {"8019","Arc 1950 to WGS 84 (7)","","DMA-Cod","4209","4326","7","","8419","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_22[] = {"8020","Arc 1950 to WGS 84 (8)","","DMA-Zmb","4209","4326","8","","8420","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_23[] = {"8021","Arc 1950 to WGS 84 (9)","","DMA-Zwe","4209","4326","9","","8421","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_24[] = {"8022","Arc 1960 to WGS 84 (1)","","DMA-Ken Tza","4210","4326","1","","8422","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_25[] = {"8023","Batavia to WGS 84 (1)","","DMA-Idn Sumatra","4211","4326","1","","8423","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_26[] = {"8024","Bermuda 1957 to WGS 84 (1)","","DMA-Bmu","4216","4326","1","","8424","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_27[] = {"8025","Bogota to WGS 84 (1)","","DMA-Col","4218","4326","1","","8425","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_28[] = {"8026","Bukit Rimpah to WGS 84 (1)","","DMA-Idn Beli","4219","4326","1","","8426","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_29[] = {"8027","Campo Inchauspe to WGS 84 (1)","","DMA-Arg","4221","4326","1","","8427","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_30[] = {"8028","Cape to WGS 84 (1)","","DMA-Zaf","4222","4326","1","","8428","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_31[] = {"8029","Cape to WGS 84 (2)","","DSLI-Zaf","4222","4326","2","","8429","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_32[] = {"8030","Carthage to WGS 84 (1)","","DMA-Tun","4223","4326","1","","8430","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_33[] = {"8031","Chua to WGS 84 (1)","","DMA-Pry","4224","4326","1","","8431","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_34[] = {"8032","Corrego Alegre to WGS 84 (1)","","DMA-Bra","4225","4326","1","","8432","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_35[] = {"8033","ED50 to WGS 84 (1)","","DMA-mean","4230","4326","1","","8433","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_36[] = {"8034","ED50 to WGS 84 (2)","","DMA-cenEur","4230","4326","2","","8434","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_37[] = {"8035","ED50 to WGS 84 (3)","","DMA-midEast","4230","4326","3","","8435","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_38[] = {"8036","ED50 to WGS 84 (4)","","DMA-Cyp","4230","4326","4","","8436","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_39[] = {"8037","ED50 to WGS 84 (5)","","DMA-Egy","4230","4326","5","","8437","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_40[] = {"8038","ED50 to WGS 84 (6)","","DMA-Irl Gbr","4230","4326","6","","8438","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_41[] = {"8039","ED50 to WGS 84 (7)","","DMA-Fin Nor","4230","4326","7","","8439","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_42[] = {"8040","ED50 to WGS 84 (8)","","DMA-Grc","4230","4326","8","","8440","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_43[] = {"8041","ED50 to WGS 84 (9)","","DMA-Irn","4230","4326","9","","8441","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_44[] = {"8042","ED50 to WGS 84 (10)","","DMA-Ita Sard","4230","4326","10","","8442","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_45[] = {"8043","ED50 to WGS 84 (11)","","DMA-Ita Sic","4230","4326","11","","8443","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_46[] = {"8044","ED50 to WGS 84 (12)","","DMA-Mlt","4230","4326","12","","8444","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_47[] = {"8045","ED50 to WGS 84 (13)","","DMA-Prt Esp","4230","4326","13","","8445","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_48[] = {"8046","ED50 to WGS 84 (14)","","6Nat-NSea","4230","4326","14","Denmark - North Sea; Germany - North Sea; Netherlands - offshore; Norway - North Sea south of 62 deg N; United Kingdom (UKCS) - North Sea south of 62 deg N.","8446","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_49[] = {"8047","ED50 to WGS 84 (15)","","NMA-Nor N65","4230","4326","15","Norway - offshore north of 65 deg N.","8447","1996-10-18 00:00:00","","EPSG","The concatenation of transformations 1147 and 1146 gives the following position vector tfm: dX=-84.491 dY=-100.559 dZ=-114.209 metres rX= -2.4006 rY=-0.5367 rZ=-2.3742 microradians dS=+0.2947 ppm.","",NULL};
+datafile_rows_t geod_trf_row_50[] = {"8048","Egypt 1907 to WGS 84 (1)","","DMA-Egy","4229","4326","1","","8448","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_51[] = {"8049","ETRF89 to WGS 84 (1)","","EPSG-eur","4258","4326","1","","8449","1997-06-19 00:00:00","","EPSG","","97.24",NULL};
+datafile_rows_t geod_trf_row_52[] = {"8050","GDA94 to WGS 84 (1)","","EPSG-Aus","4283","4326","1","","8450","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_53[] = {"8051","GD49 to WGS 84 (1)","","DMA-Nzl","4272","4326","1","","8451","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_54[] = {"8052","Hu Tzu Shan to WGS 84 (1)","","DMA-Twn","4236","4326","1","","8452","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_55[] = {"8053","Indian 1954 to WGS 84 (1)","","DMA-Tha","4239","4326","1","","8453","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_56[] = {"8054","Indian 1975 to WGS 84 (1)","","DMA-Tha","4240","4326","1","","8454","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_57[] = {"8055","Kalianpur 1937 to WGS 84 (1)","","DMA-Bgd","4144","4326","1","","8455","1999-10-20 00:00:00","","EPSG","","97.235",NULL};
+datafile_rows_t geod_trf_row_58[] = {"8056","Kalianpur 1975 to WGS 84 (1)","","DMA-Ind Npl","4146","4326","1","","8456","1999-10-20 00:00:00","","EPSG","","97.235",NULL};
+datafile_rows_t geod_trf_row_59[] = {"8057","Kandawala to WGS 84 (1)","","DMA-Lka","4244","4326","1","","8457","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_60[] = {"8058","Kertau to WGS 84 (1)","","DMA-Mys Sgp","4245","4326","1","","8458","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_61[] = {"8059","Leigon to WGS 84 (1)","","DMA-Gha","4250","4326","1","","8459","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_62[] = {"8060","Liberia 1964 to WGS 84 (1)","","DMA-Lbr","4251","4326","1","","8460","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_63[] = {"8061","Luzon 1911 to WGS 84 (1)","","DMA-Phl N","4253","4326","1","","8461","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_64[] = {"8062","Luzon 1911 to WGS 84 (2)","","DMA-Phl Min","4253","4326","2","","8462","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_65[] = {"8063","M'poraloko to WGS 84 (1)","","DMA-Gab","4266","4326","1","","8463","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_66[] = {"8064","Mahe 1971 to WGS 84 (1)","","DMA-Syc","4256","4326","1","","8464","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_67[] = {"8065","Massawa to WGS 84 (1)","","DMA-Eth","4262","4326","1","","8465","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_68[] = {"8066","Merchich to WGS 84 (1)","","DMA-Mar","4261","4326","1","","8466","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_69[] = {"8067","Minna to WGS 84 (1)","","DMA-Cmr","4263","4326","1","","8467","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_70[] = {"8068","Minna to WGS 84 (2)","","DMA-Nga","4263","4326","2","","8468","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_71[] = {"8069","Monte Mario to WGS 84 (1)","","DMA-Ita Sar","4265","4326","1","","8469","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_72[] = {"8070","NAD27 to WGS 84 (1)","","DMA-Carib","4267","4326","1","","8470","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_73[] = {"8071","NAD27 to WGS 84 (2)","","DMA-Cen Am","4267","4326","2","","8471","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_74[] = {"8072","NAD27 to WGS 84 (3)","","DMA-Can","4267","4326","3","","8472","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_75[] = {"8073","NAD27 to WGS 84 (4)","","DMA-Conus","4267","4326","4","","8473","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_76[] = {"8074","NAD27 to WGS 84 (5)","","DMA-ConusE","4267","4326","5","","8474","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_77[] = {"8075","NAD27 to WGS 84 (6)","","DMA-ConusW","4267","4326","6","","8475","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_78[] = {"8076","NAD27 to WGS 84 (7)","","DMA-USA AK","4267","4326","7","","8476","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_79[] = {"8077","NAD27 to WGS 84 (8)","","DMA-Bha xSalv","4267","4326","8","","8477","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_80[] = {"8078","NAD27 to WGS 84 (9)","","DMA-Bha Salv","4267","4326","9","","8478","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_81[] = {"8079","NAD27 to WGS 84 (10)","","DMA-Can AB BC","4267","4326","10","","8479","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_82[] = {"8080","NAD27 to WGS 84 (11)","","DMA-Can MN ON","4267","4326","11","","8480","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_83[] = {"8081","NAD27 to WGS 84 (12)","","DMA-Can E","4267","4326","12","","8481","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_84[] = {"8082","NAD27 to WGS 84 (13)","","DMA-Can NWT","4267","4326","13","","8482","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_85[] = {"8083","NAD27 to WGS 84 (14)","","DMA-Can Yuk","4267","4326","14","","8483","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_86[] = {"8084","NAD27 to WGS 84 (15)","","DMA-Pan","4267","4326","15","","8484","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_87[] = {"8085","NAD27 to WGS 84 (16)","","DMA-Cuba","4267","4326","16","","8485","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_88[] = {"8086","NAD27 to WGS 84 (17)","","DMA-Grl","4267","4326","17","","8486","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_89[] = {"8087","NAD27 to WGS 84 (18)","","DMA-Mex","4267","4326","18","","8487","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_90[] = {"8088","NAD83 to WGS 84 (1)","","DMA-N Am","4269","4326","1","","8488","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_91[] = {"8089","Nahrwan 1967 to WGS 84 (1)","","DMA-Omn Mas","4270","4326","1","","8489","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_92[] = {"8090","Nahrwan 1967 to WGS 84 (2)","","DMA-Sau","4270","4326","2","","8490","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_93[] = {"8091","Nahrwan 1967 to WGS 84 (3)","","DMA-UAE","4270","4326","3","","8491","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_94[] = {"8092","Naparima 1972 to WGS 84 (1)","","DMA-Tto","4271","4326","1","","8492","1998-06-30 00:00:00","","EPSG","","98.102",NULL};
+datafile_rows_t geod_trf_row_95[] = {"8093","NTF to WGS 84 (1)","","IGN-Fra","4275","4326","1","","8493","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_96[] = {"8094","NTF (Paris) to WGS 84 (1)","","EPSG-Fra","4807","4326","1","France..","8494","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_97[] = {"8095","OSGB 1936 to WGS 84 (1)","","DMA-Gbr","4277","4326","1","","8495","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_98[] = {"8096","OSGB 1936 to WGS 84 (2)","","DMA-Gbr Eng","4277","4326","2","","8496","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_99[] = {"8097","OSGB 1936 to WGS 84 (3)","","DMA-Gbr E&W","4277","4326","3","","8497","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_100[] = {"8098","OSGB 1936 to WGS 84 (4)","","DMA-Gbr Sco","4277","4326","4","","8498","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_101[] = {"8099","OSGB 1936 to WGS 84 (5)","","DMA-Gbr Wal","4277","4326","5","","8499","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_102[] = {"8100","Pointe Noire to WGS 84 (1)","","DMA-Cog","4282","4326","1","","8500","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_103[] = {"8101","PSAD56 to WGS 84 (1)","","DMA-mean","4248","4326","1","","8501","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_104[] = {"8102","PSAD56 to WGS 84 (2)","","DMA-Bol","4248","4326","2","","8502","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_105[] = {"8103","PSAD56 to WGS 84 (3)","","DMA-Chl N","4248","4326","3","","8503","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_106[] = {"8104","PSAD56 to WGS 84 (4)","","DMA Chl S","4248","4326","4","","8504","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_107[] = {"8105","PSAD56 to WGS 84 (5)","","DMA-Col","4248","4326","5","","8505","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_108[] = {"8106","PSAD56 to WGS 84 (6)","","DMA-Ecu","4248","4326","6","","8506","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_109[] = {"8107","PSAD56 to WGS 84 (7)","","DMA-Guy","4248","4326","7","","8507","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_110[] = {"8108","PSAD56 to WGS 84 (8)","","DMA-Per","4248","4326","8","","8508","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_111[] = {"8109","PSAD56 to WGS 84 (9)","","DMA-Ven","4248","4326","9","","8509","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_112[] = {"8110","Qatar to WGS 84 (1)","","DMA-Qat","4285","4326","1","","8510","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_113[] = {"8111","Qornoq to WGS 84 (1)","","DMA-Grl S","4287","4326","1","","8511","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_114[] = {"8112","SAD69 to WGS 84 (1)","","DMA-mean","4291","4326","1","","8512","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_115[] = {"8113","SAD69 to WGS 84 (2)","","DMA-Arg","4291","4326","2","","8513","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_116[] = {"8114","SAD69 to WGS 84 (3)","","DMA-Bol","4291","4326","3","","8514","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_117[] = {"8115","SAD69 to WGS 84 (4)","","DMA-Bra","4291","4326","4","","8515","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_118[] = {"8116","SAD69 to WGS 84 (5)","","DMA-Chile","4291","4326","5","","8516","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_119[] = {"8117","SAD69 to WGS 84 (6)","","DMA-Col","4291","4326","6","","8517","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_120[] = {"8118","SAD69 to WGS 84 (7)","","DMA-Ecu","4291","4326","7","","8518","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_121[] = {"8119","SAD69 to WGS 84 (8)","","DMA-Ecu Gal","4291","4326","8","","8519","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_122[] = {"8120","SAD69 to WGS 84 (9)","","DMA-Guyana","4291","4326","9","","8520","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_123[] = {"8121","SAD69 to WGS 84 (10)","","DMA-Pgy","4291","4326","10","","8521","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_124[] = {"8122","SAD69 to WGS 84 (11)","","DMA-Peru","4291","4326","11","","8522","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_125[] = {"8123","SAD69 to WGS 84 (12)","","DMA-Tto","4291","4326","12","","8523","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_126[] = {"8124","SAD69 to WGS 84 (13)","","DMA-Ven","4291","4326","13","","8524","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_127[] = {"8125","Sapper Hill 1943 to WGS 84 (1)","","DMA-Flk E","4292","4326","1","","8525","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_128[] = {"8126","Schwarzeck to WGS 84 (1)","","DMA-Nam","4293","4326","1","","8526","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_129[] = {"8127","Tananarive to WGS 84 (1)","","DMA-Mdg","4297","4326","1","","8527","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_130[] = {"8128","Timbalai 1948 to WGS 84 (1)","","DMA-Borneo","4298","4326","1","","8528","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_131[] = {"8129","TM65 to WGS 84 (1)","","DMA-Ire","4299","4326","1","","8529","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_132[] = {"8130","Tokyo to WGS 84 (1)","","DMA-Jpn Kor","4301","4326","1","","8530","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_133[] = {"8131","Tokyo to WGS 84 (2)","","DMA-Jpn","4301","4326","2","","8531","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_134[] = {"8132","Tokyo to WGS 84 (3)","","DMA-Kor","4301","4326","3","","8532","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_135[] = {"8133","Tokyo to WGS 84 (4)","","DMA-Jpn Ok","4301","4326","4","","8533","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_136[] = {"8134","Yacare to WGS 84 (1)","","DMA-Ury","4309","4326","1","","8534","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_137[] = {"8135","Zanderij to WGS 84 (1)","","DMA-Sur","4311","4326","1","","8535","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_138[] = {"8136","ED50 to ED87 (1)","","6Nat-NSea","4230","4231","1","","8536","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_139[] = {"8137","ED87 to WGS 84 (1)","","6Nat-NSea","4231","4326","1","","8537","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_140[] = {"8138","ED50 to ED87 (2)","","NMA-Nor N65","4230","4231","2","","8538","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_141[] = {"8139","AGD84 to WGS 84 (2)","","Auslig-Aus old","4203","4326","2","","8539","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_142[] = {"8140","WGS 72 to WGS 84 (1)","","DMA","4322","4326","1","","8540","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_143[] = {"8141","WGS 72 to WGS 84 (2)","","","4322","4326","2","","8541","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_144[] = {"8142","WGS 72BE to WGS 72 (1)","","","4324","4322","1","","8542","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_145[] = {"8143","WGS 72BE to WGS 84 (1)","","","4324","4326","1","","8543","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_146[] = {"8144","NAD27 to NAD83 (1)","","NGS-Conus","4267","4269","1","","8544","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_147[] = {"8146","NAD27 to NAD83 (2)","","NGS-Usa AK","4267","4269","2","","8546","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_148[] = {"8148","ED50 to WGS 84 (16)","","DMA-Tun","4230","4326","16","","8548","1997-06-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_149[] = {"8149","Herat North to WGS 84 (1)","","DMA-Afg","4255","4326","1","","8549","1997-06-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_150[] = {"8150","Kalianpur 1962 to WGS 84 (1)","","DMA-Pak","4145","4326","1","","8550","1999-10-20 00:00:00","","EPSG","","97.235",NULL};
+datafile_rows_t geod_trf_row_151[] = {"8151","ID74 to WGS 84 (1)","","DMA-Idn","4238","4326","1","","8551","1997-06-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_152[] = {"8152","NAD27 to WGS 84 (21)","","DMA-AK AluE","4267","4326","21","","8552","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_153[] = {"8153","NAD27 to WGS 84 (22)","","DMA-AK AluW","4267","4326","22","","8553","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_154[] = {"8154","NAD83 to WGS 84 (2)","","DMA-AK Alu","4269","4326","2","","8554","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_155[] = {"8155","NAD83 to WGS 84 (3)","","DMA-USA Hi","4269","4326","3","","8555","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_156[] = {"8156","Nord Sahara 1959 to WGS 84 (1)","","DMA-Alg","4307","4326","1","","8556","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_157[] = {"8157","Pulkovo 1942 to WGS 84 (1)","","DMA-Rus","4284","4326","1","","8557","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_158[] = {"8158","Voirol Unifie to WGS 84 (1)","","DMA-Alg N","4305","4326","1","","8558","1997-04-11 00:00:00","","EPSG","","98.15",NULL};
+datafile_rows_t geod_trf_row_159[] = {"8159","Fahud to WGS 84 (1)","","DMA-Omn","4232","4326","1","","8559","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_160[] = {"8160","NTF (Paris) to NTF (1)","","IGN-Fra","4807","4275","1","","8560","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_161[] = {"8161","Bern 1898 (Bern) to Bern 1898 (1)","","BfL-CH","4801","4217","1","","8561","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_162[] = {"8162","Bogota (Bogota) to Bogota (1)","","IGAC-Col","4802","4218","1","","8562","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_163[] = {"8163","Lisbon (Lisbon) to Lisbon (1)","","IGC-Prt","4803","4207","1","","8564","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_164[] = {"8164","Makassar (Jakarta) to Makassar (1)","","EPSG-Idn Sulawesi","4804","4257","1","","8565","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_165[] = {"8165","MGI (Ferro) to MGI (1)","","BEV-Aut balk","4805","4312","1","","8566","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_166[] = {"8166","Monte Mario (Rome) to Monte Mario (1)","","EPSG-Ita","4806","4265","1","","8567","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_167[] = {"8167","Padang (Jakarta) to Padang (1)","","EPSG-Idn Sumatra","4808","4280","1","","8569","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_168[] = {"8168","Belge 1950 (Brussels) to Belge 1950 (1)","","IGN-Bel","4809","4215","1","","8570","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_169[] = {"8169","Tananarive (Paris) to Tananarive (1)","","EPSG-Mdg","4810","4297","1","","8571","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_170[] = {"8170","Voirol 1875 (Paris) to Voirol 1875 (1)","","IGN-Dza","4811","4304","1","","8573","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_171[] = {"8171","Voirol Unifie (Paris) to Voirol Unifie(1","","IGN-Dza","4812","4305","1","","8574","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_172[] = {"8172","Batavia (Jakarta) to Batavia (1)","","EPSG-Idn Java","4813","4211","1","","8576","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_173[] = {"8173","RT38 (Stockholm) to RT38 (1)","","NLS-Swe","4814","4308","1","","8578","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_174[] = {"8174","Bogota (Bogota) to WGS 84 (1)","","EPSG-Col","4802","4326","1","Colombia.","8563","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_175[] = {"8175","Monte Mario (Rome) to WGS 84 (1)","","EPSG-Ita","4806","4326","1","Italy (Sardinia).","8568","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_176[] = {"8176","Tananarive (Paris) to WGS 84 (1)","","EPSG-Mdg","4810","4326","1","Madagascar.","8572","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_177[] = {"8177","Voirol Unifie (Paris) to WGS 84 (1)","","EPSG-Dza N","4812","4326","1","Algeria - north of 35g (31 deg 30 min) North","8575","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_178[] = {"8178","Batavia (Jakarta) to WGS 84 (1)","","EPSG-Idn Sumatra","4813","4326","1","Indonesia (Sumatra).","8577","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_179[] = {"8179","Greek (Athens) to Greek (1)","","NTU-Grc","4815","4120","1","","8579","1998-12-14 00:00:00","","EPSG","","98.52",NULL};
+datafile_rows_t geod_trf_row_180[] = {"8180","Schwarzeck to WGS 84 (2)","","SLI-Nam","4293","4326","2","","8580","1998-11-19 00:00:00","","EPSG","","98.46",NULL};
+datafile_rows_t geod_trf_row_181[] = {"8181","GGRS87 to WGS 84 (1)","","Hel-Grc","4121","4326","1","","8581","1997-06-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_182[] = {"8182","HD72 to ETRF89 (1)","","ELTE-Hun","4237","4258","1","","8582","1997-11-13 00:00:00","","EPSG","","97.47",NULL};
+datafile_rows_t geod_trf_row_183[] = {"8183","HD72 to WGS 84 (1)","","EPSG-Hun","4237","4326","1","Hungary.","8583","1997-07-22 00:00:00","","EPSG","For many purposes ETRF89 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_184[] = {"8184","ED50 to WGS 84 (17)","","IGN-Fra","4230","4326","17","","8584","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_185[] = {"8185","NTF to ED50 (1)","","IGN-Fra","4275","4230","1","","8585","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_186[] = {"8186","NTF (Paris) to ED50 (1)","","EPSG-Fra","4807","4230","1","France","8586","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_187[] = {"8187","NTF to WGS 72 (1)","","IGN-Fra","4275","4322","1","","8587","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_188[] = {"8188","NTF (Paris) to WGS 72 (1)","","EPSG-Fra","4807","4322","1","France.","8588","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_189[] = {"8189","AGD66 to GDA94 (1)","","Auslig-Aus 5m","4202","4283","1","","8589","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_190[] = {"8190","AGD66 to WGS 84 (2)","","EPSG-Aus 5m","4202","4326","2","Australia..","8590","1998-12-16 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","98.50",NULL};
+datafile_rows_t geod_trf_row_191[] = {"8191","AGD84 to GDA94 (1)","","Auslig-Aus 5m","4203","4283","1","","8591","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_192[] = {"8192","AGD84 to WGS 84 (3)","","EPSG-Aus 5m","4203","4326","3","Australia","8592","1998-12-16 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","98.50",NULL};
+datafile_rows_t geod_trf_row_193[] = {"8193","AGD84 to GDA94 (2)","","Auslig-Aus 1m","4203","4283","2","","8593","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_194[] = {"8194","AGD84 to WGS 84 (4)","","EPSG-Aus 1m","4203","4326","4","Australia.","8594","1998-12-16 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","98.50",NULL};
+datafile_rows_t geod_trf_row_195[] = {"8195","RT90 to WGS 84 (1)","","EPSG-Swe","4124","4326","1","Sweden.","8595","1999-04-22 00:00:00","","EPSG","For many purposes ETRF89 can be assumed to be coincident with WGS 84.","99.11",NULL};
+datafile_rows_t geod_trf_row_196[] = {"8196","Samboja to WGS 84 (1)","","TOT-Idn Mah","4125","4326","1","","8596","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_197[] = {"8197","Pulkovo 1942 to LKS94 (1)","","HNIT-Ltu","4284","4126","1","","8597","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_198[] = {"8198","LKS94 to WGS 84 (1)","","HNIT-Ltu","4126","4326","1","","8598","1998-04-16 00:00:00","","EPSG","For many purposes LKS94 can be assumed to be coincident with WGS 84.","98.13",NULL};
+datafile_rows_t geod_trf_row_199[] = {"8199","Pulkovo 1942 to WGS 84 (2)","","EPSG-Ltu","4284","4326","2","Lithuania.","8609","1998-03-12 00:00:00","","EPSG","For many purposes LKS94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_200[] = {"8200","Pulkovo 1942 to WGS 84 (3)","","NIMA-Hun","4284","4326","3","","8602","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_201[] = {"8201","Pulkovo 1942 to WGS 84 (4)","","NIMA-Pol","4284","4326","4","","8603","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_202[] = {"8202","Pulkovo 1942 to WGS 84 (5)","","NIMA-Cze","4284","4326","5","","8604","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_203[] = {"8203","Pulkovo 1942 to WGS 84 (6)","","NIMA-Lva","4284","4326","6","","8605","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_204[] = {"8204","Pulkovo 1942 to WGS 84 (7)","","NIMA-Kaz","4284","4326","7","","8606","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_205[] = {"8205","Pulkovo 1942 to WGS 84 (8)","","NIMA-Alb","4284","4326","8","","8607","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_206[] = {"8206","Pulkovo 1942 to WGS 84 (9)","","NIMA-Rom","4284","4326","9","","8608","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_207[] = {"8207","Arc 1960 to WGS 84 (2)","","NIMA-Ken","4210","4326","2","","8599","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_208[] = {"8208","Arc 1960 to WGS 84 (3)","","NIMA-Tza","4210","4326","3","","8600","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_209[] = {"8209","Segora to WGS 84 (1)","","NIMA-Idn Kal","4294","4326","1","","8601","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_210[] = {"8210","Voirol 1875 to WGS 84 (1)","","NIMA-Dza N","4304","4326","1","","8610","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_211[] = {"8211","Voirol 1875 (Paris) to WGS 84 (1)","","EPSG-Dza N","4811","4326","1","Algeria - north of 35g (31 deg 30 min) North.","8611","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_212[] = {"8212","Naparima 1972 to WGS 84 (2)","","MEEI-Tto","4271","4326","2","","8612","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_213[] = {"8213","Trinidad 1903 to WGS 84 (1)","","MEEI-Trin","4302","4326","1","","8613","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_214[] = {"8214","Tete to Moznet (1)","","DNGC-Moz","4127","4130","1","","8614","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_215[] = {"8215","Tete to WGS 84 (1)","","EPSG-Moz","4127","4326","1","Mozambique - average for whole country.","8615","1998-04-16 00:00:00","","EPSG","For many purposes Moznet can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_216[] = {"8216","Tete to Moznet (2)","","DNGC-Moz A","4127","4130","2","","8616","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_217[] = {"8217","Tete to WGS 84 (2)","","EPSG-Moz A","4127","4326","2","Mozambique - Maputo province and southern part of Gaza province; i.e. south of approximately 24 deg S.","8617","1998-04-16 00:00:00","","EPSG","For many purposes Moznet can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_218[] = {"8218","Tete to Moznet (3)","","DNGC-Moz B","4127","4130","3","","8618","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_219[] = {"8219","Tete to WGS 84 (3)","","EPSG-Moz B","4127","4326","3","Mozambique - provinces of Gaza; Inhambane and southern parts of Sofala and Manhica; i.e. between approximately 24 and 20 deg South.","8619","1998-04-16 00:00:00","","EPSG","For many purposes Moznet can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_220[] = {"8220","Tete to Moznet (4)","","DNGC-Moz C","4127","4130","4","","8620","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_221[] = {"8221","Tete to WGS 84 (4)","","EPSG-Moz C","4127","4326","4","Mozambique - provinces of Sofala north of Beira corridor; Manhica; Tete and Zambezia; i.e. between approximately 20 and 16 deg South.","8621","1998-04-16 00:00:00","","EPSG","For many purposes Moznet can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_222[] = {"8222","Tete to Moznet (5)","","DNGC-Moz D","4127","4130","5","","8622","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_223[] = {"8223","Tete to WGS 84 (5)","","EPSG-Moz D","4127","4326","5","Mozambique - provinces of Nampula; Niassa; Cabo Delgado; i.e. north of approximately 16 deg S.","8623","1998-04-16 00:00:00","","EPSG","For many purposes Moznet can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_224[] = {"8224","Moznet to WGS 84 (1)","","EPSG-Moz","4130","4326","1","","8624","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_225[] = {"8225","Pulkovo 1942 to WGS 84 (10)","","KCS-Kaz Cas","4284","4326","10","","8625","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_226[] = {"8226","Indian 1975 to WGS 84 (2)","","NIMA-Tha","4240","4326","2","","8626","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_227[] = {"8227","Tokyo to WGS 84 (5)","","NIMA-Kor","4301","4326","5","","8627","1998-11-19 00:00:00","","EPSG","","98.46",NULL};
+datafile_rows_t geod_trf_row_228[] = {"8228","MGI to WGS 84 (1)","","NIMA-balk","4312","4326","1","","8628","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_229[] = {"8229","Naparima 1972 to WGS 84 (3)","","NIMA-Tto","4271","4326","3","","8629","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_230[] = {"8233","DHDN to ETRF89 (1)","","IfAG-Deu W","4314","4258","1","","8633","1998-06-30 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_231[] = {"8234","DHDN to WGS 84 (1)","","EPSG-Deu W","4314","4326","1","Germany - former west Germany.","8634","1998-06-30 00:00:00","EPSG","EPSG","For many purposes ETRF89 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_232[] = {"8235","Pulkovo 1942 to ETRF89 (1)","","IfAG-Deu E","4284","4258","1","","8635","1998-06-30 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_233[] = {"8236","Pulkovo 1942 to WGS 84 (11)","","EPSG-Deu E","4284","4326","11","Germany - former east Germany - Brandenburg; Mecklenburg-Vorpommern; Sachsen-Anhalt.","8636","1998-06-30 00:00:00","","EPSG","For many purposes ETRF89 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_234[] = {"8237","ED50 to WGS 84 (Common Offshore)","","UKOOA-CO","4230","4326","18","","8637","1998-06-30 00:00:00","","EPSG","","98.27",NULL};
+datafile_rows_t geod_trf_row_235[] = {"8238","Madrid 1870 (Madrid) to ED50 (1)","","IGB-Esp","4903","4230","1","","8638","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_236[] = {"8239","Madrid 1870 (Madrid) to ED50 (2)","","IGB-Esp N","4903","4230","2","","8639","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_237[] = {"8240","Madrid 1870 (Madrid) to ED50 (3)","","IGB-Esp S","4903","4230","3","","8640","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_238[] = {"8241","Madrid 1870 (Madrid) to WGS 84 (1)","","EPSG-Esp","4903","4326","1","Spain.","8641","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_239[] = {"8242","NAD27 to NAD83 (3)","","GC-Can NT1","4267","4269","3","","8642","1998-11-11 00:00:00","","EPSG","","98.57",NULL};
+datafile_rows_t geod_trf_row_240[] = {"8243","NAD27 to WGS 84 (25)","","EPSG-Can old","4267","4326","25","Canada","8643","1998-11-11 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_241[] = {"8244","NAD27 to NAD83 (4)","","GC-Can","4267","4269","4","","8644","1998-11-11 00:00:00","","EPSG","","98.57",NULL};
+datafile_rows_t geod_trf_row_242[] = {"8245","NAD27 to WGS 84 (26)","","EPSG-Can","4267","4326","26","Canada.","8645","1998-11-11 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_243[] = {"8246","OSGB 1936 to WGS 84 (Petroleum)","","UKOOA-Pet","4277","4326","6","","8646","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_244[] = {"8247","OSGB 1936 to ED50 (UKOOA)","","UKOOA-UKCS","4277","4230","1","","8647","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_245[] = {"8248","Manoca to WGS 84 (1)","","SCS-Cmr","4260","4326","1","","8648","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_246[] = {"8249","Camacupa to WGS 72BE (1)","","GSI-Ago","4220","4324","1","","8649","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_247[] = {"8250","Camacupa to WGS 84 (1)","","CON-Ago B5","4220","4326","1","","8650","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_248[] = {"8251","Camacupa to WGS 84 (2)","","TEX-Ago B2","4220","4326","2","","8651","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_249[] = {"8252","Camacupa to WGS 84 (3)","","SHL-Ago old","4220","4326","3","","8652","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_250[] = {"8253","Camacupa to WGS 84 (4)","","GSI-Ago","4220","4326","4","","8653","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_251[] = {"8254","Camacupa to WGS 84 (5)","","ELF-Ago B3 old","4220","4326","5","","8654","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_252[] = {"8255","Camacupa to WGS 84 (6)","","ELF-Ago B7 old","4220","4326","6","","8655","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_253[] = {"8256","Camacupa to WGS 84 (7)","","ELF-Ago B15","4220","4326","7","","8656","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_254[] = {"8257","Camacupa to WGS 84 (8)","","ELF-Ago B2 old","4220","4326","8","","8657","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_255[] = {"8258","Camacupa to WGS 84 (9)","","SHL-Ago B16","4220","4326","9","","8658","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_256[] = {"8259","Camacupa to WGS 84 (10)","","ELF-Ago N","4220","4326","10","","8659","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_257[] = {"8260","Malongo 1987 to Mhast (1)","","CHV-Ago Cab","4259","4264","1","","8660","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_258[] = {"8261","Mhast to WGS 84 (1)","","CHV-Ago Cab","4264","4326","1","","8661","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_259[] = {"8262","Malongo 1987 to WGS 84 (1)","","CHV-Ago Cab","4259","4326","1","","8662","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_260[] = {"8263","MGI (Ferro) to WGS 84 (1)","","DMA-balk","4805","4326","1","MEAN FOR Boznia and Herzegovina; Croatia; Serbia; Slovenia.","8663","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_261[] = {"8264","EST92 to ETRF89 (1)","","UT-Est","4133","4258","1","","8664","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_262[] = {"8265","Pulkovo 1942 to EST92 (1)","","UT-Est","4284","4133","1","","8665","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_263[] = {"8266","EST92 to WGS 84 (1)","","UT-Est","4133","4326","1","","8666","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_264[] = {"8267","Pulkovo 1942 to WGS 84 (12)","","UT-Est","4284","4326","12","","8667","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_265[] = {"8268","Tokyo to WGS 84 (6)","","GSI-Jpn 452141","4301","4326","6","","8668","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_266[] = {"8269","Tokyo to WGS 84 (7)","","GSI-Jpn 452142","4301","4326","7","","8669","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_267[] = {"8270","Tokyo to WGS 84 (8)","","GSI-Jpn 444141","4301","4326","8","","8670","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_268[] = {"8271","Tokyo to WGS 84 (9)","","GSI-Jpn 444142","4301","4326","9","","8671","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_269[] = {"8272","Tokyo to WGS 84 (10)","","GSI-Jpn 440141","4301","4326","10","","8672","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_270[] = {"8273","Tokyo to WGS 84 (11)","","GSI-Jpn 440142","4301","4326","11","","8673","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_271[] = {"8274","Tokyo to WGS 84 (12)","","GSI-Jpn 440143","4301","4326","12","","8674","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_272[] = {"8275","Tokyo to WGS 84 (13)","","GSI-Jpn 440144","4301","4326","13","","8675","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_273[] = {"8276","Tokyo to WGS 84 (14)","","GSI-Jpn 432141","4301","4326","14","","8676","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_274[] = {"8277","Tokyo to WGS 84 (15)","","GSI-Jpn 432142","4301","4326","15","","8677","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_275[] = {"8278","Tokyo to WGS 84 (16)","","GSI-Jpn 432143","4301","4326","16","","8678","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_276[] = {"8279","Tokyo to WGS 84 (17)","","GSI-Jpn 432144","4301","4326","17","","8679","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_277[] = {"8280","Tokyo to WGS 84 (18)","","GSI-Jpn 432145","4301","4326","18","","8680","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_278[] = {"8281","Tokyo to WGS 84 (19)","","GSI-Jpn 424140","4301","4326","19","","8681","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_279[] = {"8282","Tokyo to WGS 84 (20)","","GSI-Jpn 424141","4301","4326","20","","8682","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_280[] = {"8283","Tokyo to WGS 84 (21)","","GSI-Jpn 424142","4301","4326","21","","8683","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_281[] = {"8284","Tokyo to WGS 84 (22)","","GSI-Jpn 424143","4301","4326","22","","8684","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_282[] = {"8285","Tokyo to WGS 84 (23)","","GSI-Jpn 424144","4301","4326","23","","8685","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_283[] = {"8286","Tokyo to WGS 84 (24)","","GSI-Jpn 424145","4301","4326","24","","8686","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_284[] = {"8287","Tokyo to WGS 84 (25)","","GSI-Jpn 420139","4301","4326","25","","8687","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_285[] = {"8288","Tokyo to WGS 84 (26)","","GSI-Jpn 420140","4301","4326","26","","8688","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_286[] = {"8289","Tokyo to WGS 84 (27)","","GSI-Jpn","4301","4326","27","","8689","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_287[] = {"8290","Tokyo to WGS 84 (28)","","GSI-Jpn","4301","4326","28","","8690","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_288[] = {"8291","Tokyo to WGS 84 (29)","","GSI-Jpn","4301","4326","29","","8691","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_289[] = {"8292","Tokyo to WGS 84 (30)","","GSI-Jpn","4301","4326","30","","8692","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_290[] = {"8293","Tokyo to WGS 84 (31)","","GSI-Jpn","4301","4326","31","","8693","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_291[] = {"8294","Tokyo to WGS 84 (32)","","GSI-Jpn","4301","4326","32","","8694","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_292[] = {"8295","Tokyo to WGS 84 (33)","","GSI-Jpn","4301","4326","33","","8695","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_293[] = {"8296","Tokyo to WGS 84 (34)","","GSI-Jpn","4301","4326","34","","8696","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_294[] = {"8297","Tokyo to WGS 84 (35)","","GSI-Jpn","4301","4326","35","","8697","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_295[] = {"8298","Tokyo to WGS 84 (36)","","GSI-Jpn","4301","4326","36","","8698","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_296[] = {"8299","Tokyo to WGS 84 (37)","","GSI-Jpn","4301","4326","37","","8699","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_297[] = {"8300","Tokyo to WGS 84 (38)","","GSI-Jpn","4301","4326","38","","8700","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_298[] = {"8301","Tokyo to WGS 84 (39)","","GSI-Jpn","4301","4326","39","","8701","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_299[] = {"8302","Tokyo to WGS 84 (40)","","GSI-Jpn","4301","4326","40","","8702","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_300[] = {"8303","Tokyo to WGS 84 (41)","","GSI-Jpn","4301","4326","41","","8703","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_301[] = {"8304","Tokyo to WGS 84 (42)","","GSI-Jpn","4301","4326","42","","8704","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_302[] = {"8305","Tokyo to WGS 84 (43)","","GSI-Jpn","4301","4326","43","","8705","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_303[] = {"8306","Tokyo to WGS 84 (44)","","GSI-Jpn","4301","4326","44","","8706","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_304[] = {"8307","Tokyo to WGS 84 (45)","","GSI-Jpn","4301","4326","45","","8707","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_305[] = {"8308","Tokyo to WGS 84 (46)","","GSI-Jpn","4301","4326","46","","8708","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_306[] = {"8309","Tokyo to WGS 84 (47)","","GSI-Jpn","4301","4326","47","","8709","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_307[] = {"8310","Tokyo to WGS 84 (48)","","GSI-Jpn","4301","4326","48","","8710","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_308[] = {"8311","Tokyo to WGS 84 (49)","","GSI-Jpn","4301","4326","49","","8711","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_309[] = {"8312","Tokyo to WGS 84 (50)","","GSI-Jpn","4301","4326","50","","8712","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_310[] = {"8313","Tokyo to WGS 84 (51)","","GSI-Jpn","4301","4326","51","","8713","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_311[] = {"8314","Tokyo to WGS 84 (52)","","GSI-Jpn","4301","4326","52","","8714","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_312[] = {"8315","Tokyo to WGS 84 (53)","","GSI-Jpn","4301","4326","53","","8715","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_313[] = {"8316","Tokyo to WGS 84 (54)","","GSI-Jpn","4301","4326","54","","8716","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_314[] = {"8317","Tokyo to WGS 84 (55)","","GSI-Jpn","4301","4326","55","","8717","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_315[] = {"8318","Tokyo to WGS 84 (56)","","GSI-Jpn","4301","4326","56","","8718","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_316[] = {"8319","Tokyo to WGS 84 (57)","","GSI-Jpn","4301","4326","57","","8719","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_317[] = {"8320","Tokyo to WGS 84 (58)","","GSI-Jpn","4301","4326","58","","8720","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_318[] = {"8321","Tokyo to WGS 84 (59)","","GSI-Jpn","4301","4326","59","","8721","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_319[] = {"8322","Tokyo to WGS 84 (60)","","GSI-Jpn","4301","4326","60","","8722","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_320[] = {"8323","Tokyo to WGS 84 (61)","","GSI-Jpn","4301","4326","61","","8723","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_321[] = {"8324","Tokyo to WGS 84 (62)","","GSI-Jpn","4301","4326","62","","8724","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_322[] = {"8325","Tokyo to WGS 84 (63)","","GSI-Jpn","4301","4326","63","","8725","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_323[] = {"8326","Tokyo to WGS 84 (64)","","GSI-Jpn","4301","4326","64","","8726","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_324[] = {"8327","Tokyo to WGS 84 (65)","","GSI-Jpn","4301","4326","65","","8727","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_325[] = {"8328","Tokyo to WGS 84 (66)","","GSI-Jpn","4301","4326","66","","8728","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_326[] = {"8329","Tokyo to WGS 84 (67)","","GSI-Jpn","4301","4326","67","","8729","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_327[] = {"8330","Tokyo to WGS 84 (68)","","GSI-Jpn","4301","4326","68","","8730","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_328[] = {"8331","Tokyo to WGS 84 (69)","","GSI-Jpn","4301","4326","69","","8731","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_329[] = {"8332","Tokyo to WGS 84 (70)","","GSI-Jpn","4301","4326","70","","8732","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_330[] = {"8333","Tokyo to WGS 84 (71)","","GSI-Jpn","4301","4326","71","","8733","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_331[] = {"8334","Tokyo to WGS 84 (72)","","GSI-Jpn","4301","4326","72","","8734","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_332[] = {"8335","Tokyo to WGS 84 (73)","","GSI-Jpn","4301","4326","73","","8735","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_333[] = {"8336","Tokyo to WGS 84 (74)","","GSI-Jpn","4301","4326","74","","8736","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_334[] = {"8337","Tokyo to WGS 84 (75)","","GSI-Jpn","4301","4326","75","","8737","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_335[] = {"8338","Tokyo to WGS 84 (76)","","GSI-Jpn","4301","4326","76","","8738","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_336[] = {"8339","Tokyo to WGS 84 (77)","","GSI-Jpn","4301","4326","77","","8739","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_337[] = {"8340","Tokyo to WGS 84 (78)","","GSI-Jpn","4301","4326","78","","8740","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_338[] = {"8341","Tokyo to WGS 84 (79)","","GSI-Jpn","4301","4326","79","","8741","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_339[] = {"8342","Tokyo to WGS 84 (80)","","GSI-Jpn","4301","4326","80","","8742","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_340[] = {"8343","Tokyo to WGS 84 (81)","","GSI-Jpn","4301","4326","81","","8743","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_341[] = {"8344","Tokyo to WGS 84 (82)","","GSI-Jpn","4301","4326","82","","8744","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_342[] = {"8345","Tokyo to WGS 84 (83)","","GSI-Jpn","4301","4326","83","","8745","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_343[] = {"8346","Tokyo to WGS 84 (84)","","GSI-Jpn","4301","4326","84","","8746","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_344[] = {"8347","Tokyo to WGS 84 (85)","","GSI-Jpn","4301","4326","85","","8747","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_345[] = {"8348","Tokyo to WGS 84 (86)","","GSI-Jpn","4301","4326","86","","8748","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_346[] = {"8349","Tokyo to WGS 84 (87)","","GSI-Jpn","4301","4326","87","","8749","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_347[] = {"8350","Tokyo to WGS 84 (88)","","GSI-Jpn","4301","4326","88","","8750","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_348[] = {"8351","Tokyo to WGS 84 (89)","","GSI-Jpn","4301","4326","89","","8751","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_349[] = {"8352","Tokyo to WGS 84 (90)","","GSI-Jpn","4301","4326","90","","8752","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_350[] = {"8353","Tokyo to WGS 84 (91)","","GSI-Jpn","4301","4326","91","","8753","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_351[] = {"8354","Tokyo to WGS 84 (92)","","GSI-Jpn","4301","4326","92","","8754","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_352[] = {"8355","Tokyo to WGS 84 (93)","","GSI-Jpn","4301","4326","93","","8755","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_353[] = {"8356","Tokyo to WGS 84 (94)","","GSI-Jpn","4301","4326","94","","8756","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_354[] = {"8357","Tokyo to WGS 84 (95)","","GSI-Jpn","4301","4326","95","","8757","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_355[] = {"8358","Tokyo to WGS 84 (96)","","GSI-Jpn","4301","4326","96","","8758","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_356[] = {"8359","Tokyo to WGS 84 (97)","","GSI-Jpn","4301","4326","97","","8759","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_357[] = {"8360","Tokyo to WGS 84 (98)","","GSI-Jpn","4301","4326","98","","8760","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_358[] = {"8361","Tokyo to WGS 84 (99)","","GSI-Jpn","4301","4326","99","","8761","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_359[] = {"8362","Tokyo to WGS 84 (100)","","GSI-Jpn 324132","4301","4326","100","","8762","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_360[] = {"8363","Tokyo to WGS 84 (101)","","GSI-Jpn 324133","4301","4326","101","","8763","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_361[] = {"8364","Tokyo to WGS 84 (102)","","GSI-Jpn 324134","4301","4326","102","","8764","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_362[] = {"8365","Tokyo to WGS 84 (103)","","GSI-Jpn 320130","4301","4326","103","","8765","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_363[] = {"8366","Tokyo to WGS 84 (104)","","GSI-Jpn 320131","4301","4326","104","","8766","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_364[] = {"8367","Tokyo to WGS 84 (105)","","GSI-Jpn 320132","4301","4326","105","","8767","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_365[] = {"8368","Tokyo to WGS 84 (106)","","GSI-Jpn 312130","4301","4326","106","","8768","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_366[] = {"8369","Tokyo to WGS 84 (107)","","GSI-Jpn 312131","4301","4326","107","","8769","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_367[] = {"8370","Fahud to WGS 84 (2)","","PDO-Omn","4232","4326","2","","8770","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_368[] = {"8371","PSD93 to WGS 84 (1)","","PDO-Omn","4134","4326","1","","8771","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_369[] = {"8372","ED50 to WGS 84 (19)","","HEL-Grc","4230","4326","19","","8772","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_370[] = {"8373","Antigua 1943 to WGS 84 (1)","","DOS-Atg Ant","4601","4326","1","","8773","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_371[] = {"8374","Dominica 1945 to WGS 84 (1)","","DOS-Dma","4602","4326","1","","8774","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_372[] = {"8375","Grenada 1953 to WGS 84 (1)","","DOS-Grd","4603","4326","1","","8775","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_373[] = {"8376","Montserrat 1958 to WGS 84 (1)","","DOS-Msr","4604","4326","1","","8776","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_374[] = {"8377","St. Kitts 1955 to WGS 84 (1)","","DOS-Kna","4605","4326","1","","8777","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_375[] = {"8378","St. Lucia 1955 to WGS 84 (1)","","DOS-Lca","4606","4326","1","","8778","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_376[] = {"8379","Anguilla 1957 to WGS 84 (1)","","DOS-Aia","4600","4326","1","","8779","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_377[] = {"8380","RT90 to ETRF89 (1)","","NLS-Swe","4124","4258","1","","8780","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_378[] = {"8384","ED50 to WGS 84 (20)","","NMA-Nor 6265W","4230","4326","20","","8784","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_379[] = {"8385","Old Hawaiian to NAD83 (1)","","NGS-Usa Hi","4135","4269","1","","8785","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_380[] = {"8386","Old Hawaiian to WGS 84 (1)","","EPSG-US Hi","4135","4326","1","United States - Hawaii","8786","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_381[] = {"8387","St. Lawrence Island to NAD83 (1)","","NGS-Usa AK StL","4136","4269","1","","8787","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_382[] = {"8388","St. Lawrence Island to WGS 84 (1)","","EPSG-US StL","4136","4326","1","United States - Alaska - St. Lawrence Island.","8788","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_383[] = {"8389","St. Paul Island to NAD83 (1)","","NGS-Usa AK StP","4137","4269","1","","8789","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_384[] = {"8390","St. Paul Island to WGS 84 (1)","","EPSG-US StP","4137","4326","1","United States - Alaska - St. Paul Island.","8790","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_385[] = {"8391","St. George Island to NAD83 (1)","","NGS-Usa AK StG","4138","4269","1","","8791","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_386[] = {"8392","St. George Island to WGS 84 (1)","","EPSG-USA StG","4138","4326","1","United States - Alaska - St. George Island.","8792","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_387[] = {"8393","NAD27(CGQ77) to NAD83 (1)","","SGQ-Can QC","4609","4269","1","","8793","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_388[] = {"8394","NAD27(CGQ77) to WGS 84 (1)","","EPSG-Can Qc","4609","4326","1","Canada - Quebec","8794","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_389[] = {"8395","AGD66 to GDA94 (2)","","Auslig-ACT 1m","4202","4283","2","","8795","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_390[] = {"8396","AGD66 to WGS 84 (3)","","EPSG-Aus ACT 1m","4202","4326","3","Australia - ACT.","8796","1999-05-24 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_391[] = {"8397","AGD66 to GDA94 (3)","","Auslig-Tas 1m","4202","4283","3","","8797","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_392[] = {"8398","AGD66 to WGS 84 (4)","","EPSG-Aus Tas 1m","4202","4326","4","Australia - Tasmania.","8798","1999-05-24 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_393[] = {"8399","AGD66 to GDA94 (4)","","Auslig-NSW Vic","4202","4283","4","","8799","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_394[] = {"8400","AGD66 to WGS 84 (5)","","EPSG-Aus NSW Vic 1m","4202","4326","5","Australia - New South Wales (NSW) and Victoria.","8800","1999-05-24 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_395[] = {"8401","Puerto Rico to NAD83 (1)","","NGS-PRVI","4139","4269","1","","8801","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_396[] = {"8402","Puerto Rico to WGS 84 (1)","","EPSG-PRVI","4139","4326","1","Puerto Rico; Virgin Islands (U.S.); Virgin Islands (British).","8802","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_397[] = {"8403","NAD27 to NAD83 (5)","","SGQ-Can QC","4267","4269","5","","8803","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_398[] = {"8404","NAD27 to WGS 84 (27)","","EPSG-Can QC","4267","4326","27","Canada - Quebec","8804","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_399[] = {"8405","NAD27(76) to NAD83 (1)","","SGQ-Can Ont","4608","4269","1","","8805","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_400[] = {"8406","NAD27(76) to WGS 84 (1)","","EPSG-Can On","4608","4326","1","Canada - Ontario","8806","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_401[] = {"8407","AGD66 to GDA94 (5)","","OSG-Aus Vic","4202","4283","5","","8807","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_402[] = {"8408","AGD66 to WGS 84 (6)","","EPSG-Aus Vic 0.1m","4202","4326","6","Australia - Victoria","8808","1999-05-24 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_403[] = {"8411","NGO 1948 (Oslo) to NGO 1948 (1)","","NGO-Nor","4817","4273","1","","8811","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_404[] = {"8412","NTF (Paris) to NTF (2)","","RGS","4807","4275","2","","8812","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_405[] = {"8413","Locodjo 1965 to WGS 84 (1)","","IGN-Civ","4142","4326","1","","8813","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_406[] = {"8414","Abidjan 1987 to WGS 84 (1)","","IGN-Civ","4143","4326","1","","8814","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_407[] = {"8415","MGI to WGS 84 (2)","","BEV-Aut","4312","4326","1","","8815","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_408[] = {"8416","ATS 77 to NAD83(CSRS98) (1)","","GIC-Can NB","4122","4140","1","","8816","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_409[] = {"8417","NAD83(CSRS98) to WGS 84 (1)","","EPSG-Can","4140","4326","1","","8817","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_410[] = {"8418","ATS 77 to WGS 84 (1)","","EPSG-Can NB","4122","4326","1","Canada - New Brunswick","8818","1999-10-20 00:00:00","EPSG","EPSG","For many purposes NAD83(CSRS) can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_411[] = {"8419","NAD83 to NAD83(HARN) (1)","","NGS-Usa AL","4269","4152","1","","8819","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_412[] = {"8420","NAD83 to NAD83(HARN) (2)","","NGS-Usa AZ","4269","4152","2","","8820","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_413[] = {"8421","NAD83 to NAD83(HARN) (3)","","NGS-Usa CA n","4269","4152","3","","8821","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_414[] = {"8422","NAD83 to NAD83(HARN) (4)","","NGS-Usa CA s","4269","4152","4","","8822","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_415[] = {"8423","NAD83 to NAD83(HARN) (5)","","NGS-Usa CO","4269","4152","5","","8823","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_416[] = {"8424","NAD83 to NAD83(HARN) (6)","","NGS-Usa GA","4269","4152","6","","8824","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_417[] = {"8425","NAD83 to NAD83(HARN) (7)","","NGS-Usa FL","4269","4152","7","","8825","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_418[] = {"8426","NAD83 to NAD83(HARN) (8)","","NGS-Usa ID MT e","4269","4152","8","","8826","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_419[] = {"8427","NAD83 to NAD83(HARN) (9)","","NGS-Usa ID MT w","4269","4152","9","","8827","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_420[] = {"8428","NAD83 to NAD83(HARN) (10)","","NGS-Usa KY","4269","4152","10","","8828","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_421[] = {"8429","NAD83 to NAD83(HARN) (11)","","NGS-Usa LA","4269","4152","11","","8829","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_422[] = {"8430","NAD83 to NAD83(HARN) (12)","","NGS-Usa DE MD","4269","4152","12","","8830","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_423[] = {"8431","NAD83 to NAD83(HARN) (13)","","NGS-Usa ME","4269","4152","13","","8831","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_424[] = {"8432","NAD83 to NAD83(HARN) (14)","","NGS-Usa MI","4269","4152","14","","8832","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_425[] = {"8433","NAD83 to NAD83(HARN) (15)","","NGS-Usa MS","4269","4152","15","","8833","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_426[] = {"8434","NAD83 to NAD83(HARN) (16)","","NGS-Usa NE","4269","4152","16","","8834","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_427[] = {"8435","NAD83 to NAD83(HARN) (17)","","NGS-US NewEng","4269","4152","17","","8835","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_428[] = {"8436","NAD83 to NAD83(HARN) (18)","","NGS-Usa NM","4269","4152","18","","8836","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_429[] = {"8437","NAD83 to NAD83(HARN) (19)","","NGS-Usa NY","4269","4152","19","","8837","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_430[] = {"8438","NAD83 to NAD83(HARN) (20)","","NGS-Usa ND","4269","4152","20","","8838","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_431[] = {"8439","NAD83 to NAD83(HARN) (21)","","NGS-Usa OK","4269","4152","21","","8839","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_432[] = {"8440","NAD83 to NAD83(HARN) (22)","","NGS-PRVI","4269","4152","22","","8840","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_433[] = {"8441","NAD83 to NAD83(HARN) (23)","","NGS-Usa SD","4269","4152","23","","8841","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_434[] = {"8442","NAD83 to NAD83(HARN) (24)","","NGS-Usa TN","4269","4152","24","","8842","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_435[] = {"8443","NAD83 to NAD83(HARN) (25)","","NGS-Usa TX e","4269","4152","25","","8843","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_436[] = {"8444","NAD83 to NAD83(HARN) (26)","","NGS-Usa TX w","4269","4152","26","","8844","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_437[] = {"8445","NAD83 to NAD83(HARN) (27)","","NGS-Usa VA","4269","4152","27","","8845","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_438[] = {"8446","NAD83 to NAD83(HARN) (28)","","NGS-Usa OR WA","4269","4152","28","","8846","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_439[] = {"8447","NAD83 to NAD83(HARN) (29)","","NGS-Usa WI","4269","4152","29","","8847","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_440[] = {"8448","NAD83 to NAD83(HARN) (30)","","NGS-Usa WY","4269","4152","30","","8848","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_441[] = {"8449","Cape to Hartbeesthoek94 (1)","","DSM-Zaf","4222","4148","1","","8849","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_442[] = {"8450","Hartbeesthoek94 to WGS 84 (1)","","EPSG-Zaf","4148","4326","1","","8850","1999-10-20 00:00:00","","EPSG","For many purposes Hartbeesthoek94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_443[] = {"8451","AGD66 to GDA94 (6)","","Auslig-Tas","4202","4283","6","","8851","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_444[] = {"8452","AGD66 to GDA94 (7)","","Auslig-NT","4202","4283","7","","8852","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_445[] = {"8453","AGD66 to WGS 84 (7)","","EPSG-Aus Tas 0.1m","4202","4326","7","Australia - Tasmania.","8853","1999-10-20 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_446[] = {"8454","AGD66 to WGS 84 (8)","","EPSG-Aus NT 0.1m","4202","4326","8","Australia - Northern Territory.","8854","1999-10-20 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_447[] = {"8455","CH1903 to WGS 84 (1)","","BfL-CH 1","4149","4326","1","","8855","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_448[] = {"8456","CH1903+ to CHTRF95 (1)","","BfL-CH","4150","4151","1","","8856","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_449[] = {"8457","CH1903+ to WGS 84 (1)","","EPSG-CH","4150","4326","1","Liechtenstein; Switzerland.","8857","1999-10-20 00:00:00","EPSG","EPSG","For many purposes CHTRF95 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_450[] = {"8458","CH1903 to WGS 84 (2)","","BfL-CH 2","4149","4326","2","","8858","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_451[] = {"8459","CHTRF95 to WGS 84 (1)","","EPSG-CH","4151","4326","1","","8859","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_452[] = {"8460","NAD27 to NAD83(HARN) (1)","","NGS-Usa AL","4267","4152","1","United States (USA) - Alabama.","8860","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_453[] = {"8461","NAD27 to NAD83(HARN) (2)","","NGS-Usa AZ","4267","4152","2","United States (USA) - Arizona.","8861","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_454[] = {"8462","NAD27 to NAD83(HARN) (3)","","NGS-Usa CA n","4267","4152","3","United States (USA) - California north of 38 deg N.","8862","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_455[] = {"8463","NAD27 to NAD83(HARN) (4)","","NGS-Usa CA s","4267","4152","4","United States (USA) - California south of 38 deg N.","8863","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_456[] = {"8464","NAD27 to NAD83(HARN) (5)","","NGS-Usa CO","4267","4152","5","United States (USA) - Colorado.","8864","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_457[] = {"8465","NAD27 to NAD83(HARN) (6)","","NGS-Usa GA","4267","4152","6","United States (USA) - Georgia.","8865","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_458[] = {"8466","NAD27 to NAD83(HARN) (7)","","NGS-Usa FL","4267","4152","7","United States (USA) - Florida.","8866","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_459[] = {"8467","NAD27 to NAD83(HARN) (8)","","NGS-Usa ID MT e","4267","4152","8","United States (USA) - Idaho and Montana - east of 113 deg W.","8867","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_460[] = {"8468","NAD27 to NAD83(HARN) (9)","","NGS-Usa ID MT w","4267","4152","9","United States (USA) - Idaho and Montana - west of 113 deg W.","8868","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_461[] = {"8469","NAD27 to NAD83(HARN) (10)","","NGS-Usa KY","4267","4152","10","United States (USA) - Kentucky.","8869","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_462[] = {"8470","NAD27 to NAD83(HARN) (11)","","NGS-Usa LA","4267","4152","11","United States (USA) - Louisiana.","8870","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_463[] = {"8471","NAD27 to NAD83(HARN) (12)","","NGS-Usa DE MD","4267","4152","12","United States (USA) - Delaware and Maryland.","8871","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_464[] = {"8472","NAD27 to NAD83(HARN) (13)","","NGS-Usa ME","4267","4152","13","United States (USA) - Maine.","8872","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_465[] = {"8473","NAD27 to NAD83(HARN) (14)","","NGS-Usa MI","4267","4152","14","United States (USA) - Michigan.","8873","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_466[] = {"8474","NAD27 to NAD83(HARN) (15)","","NGS-Usa MS","4267","4152","15","United States (USA) - Mississippi.","8874","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_467[] = {"8475","NAD27 to NAD83(HARN) (16)","","NGS-Usa NE","4267","4152","16","United States (USA) - Nebraska.","8875","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_468[] = {"8476","NAD27 to NAD83(HARN) (17)","","NGS-US NewEng","4267","4152","18","United States (USA) - Connecticut; Massachusetts; New Hampshire; Rhode Island; Vermont.","8876","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_469[] = {"8477","NAD27 to NAD83(HARN) (18)","","NGS-Usa NM","4267","4152","18","United States (USA) - New Mexico.","8877","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_470[] = {"8478","NAD27 to NAD83(HARN) (19)","","NGS-Usa NY","4267","4152","19","United States (USA) - New York.","8878","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_471[] = {"8479","NAD27 to NAD83(HARN) (20)","","NGS-Usa ND","4267","4152","20","United States (USA) - North Dakota.","8879","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_472[] = {"8480","NAD27 to NAD83(HARN) (21)","","NGS-Usa OK","4267","4152","21","United States (USA) - Oklahoma.","8880","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_473[] = {"8481","Puerto Rico to NAD83(HARN) (1)","","NGS-PRVI","4139","4152","1","United States (USA) - Puerto Rico and the Virgin Islands.","8881","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_474[] = {"8482","NAD27 to NAD83(HARN) (22)","","NGS-Usa SD","4267","4152","22","United States (USA) - South Dakota.","8882","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_475[] = {"8483","NAD27 to NAD83(HARN) (23)","","NGS-Usa TN","4267","4152","23","United States (USA) - Tennessee","8883","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_476[] = {"8484","NAD27 to NAD83(HARN) (24)","","NGS-Usa TX e","4267","4152","24","United States (USA) - Texas east of 100deg West.","8884","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_477[] = {"8485","NAD27 to NAD83(HARN) (25)","","NGS-Usa TX w","4267","4152","25","United States (USA) - Texas west of 100deg West.","8885","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_478[] = {"8486","NAD27 to NAD83(HARN) (26)","","NGS-Usa VA","4267","4152","26","United States (USA) - Virginia.","8886","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_479[] = {"8487","NAD27 to NAD83(HARN) (27)","","NGS-Usa OR WA","4267","4152","27","United States (USA) - Oregan; Washington.","8887","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_480[] = {"8488","NAD27 to NAD83(HARN) (28)","","NGS-Usa WI","4267","4152","28","United States (USA) - Wisconsin.","8888","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_481[] = {"8489","NAD27 to NAD83(HARN) (29)","","NGS-Usa WY","4267","4152","29","United States (USA) - Wyoming.","8889","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_482[] = {"8490","Rassadiran to WGS 84 (1)","","TOT-Taheri","4153","4326","1","Iran - Taheri refinery site.","8890","1999-10-20 00:00:00","Total-Fina","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_483[] = {"8491","FD58 to WGS 84 (1)","","TOT-Kangan","4132","4326","1","Iran - Kangan district","8891","1999-10-20 00:00:00","Total-Fina","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_484[] = {"8492","ED50(ED77) to WGS 84 (1)","","NCCI-Irn","4154","4326","1","Iran","8892","1999-10-20 00:00:00","National Cartographic Centre of Iran","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_485[] = {"8493","NAD83 to WGS 84 (4)","","NGS-Usa","4269","4326","4","United States (USA).","8893","1999-11-05 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_486[] = {"8494","NAD83 to WGS 84 (5)","","NGS-Usa","4269","4326","5","United States (USA).","8894","1999-11-05 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_487[] = {"8495","La Canoa to WGS 84 (1)","","LAG-Ven E","4247","4326","1","","8895","1999-11-05 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_488[] = {"8496","NAD27 to WGS 84 (28)","","NGS-Usa conus","4267","4326","28","United States (USA) - lower 48 states including EEZ.","8896","1999-10-20 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_489[] = {"8497","NAD27 to WGS 84 (29)","","NGS-Usa AK","4267","4326","29","United States (USA) - Alaska including EEZ.","8897","1999-10-20 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+
+datafile_rows_t *geod_trf_rows[] = {geod_trf_row_1,geod_trf_row_2,geod_trf_row_3,geod_trf_row_4,geod_trf_row_5,geod_trf_row_6,geod_trf_row_7,geod_trf_row_8,geod_trf_row_9,geod_trf_row_10,geod_trf_row_11,geod_trf_row_12,geod_trf_row_13,geod_trf_row_14,geod_trf_row_15,geod_trf_row_16,geod_trf_row_17,geod_trf_row_18,geod_trf_row_19,geod_trf_row_20,geod_trf_row_21,geod_trf_row_22,geod_trf_row_23,geod_trf_row_24,geod_trf_row_25,geod_trf_row_26,geod_trf_row_27,geod_trf_row_28,geod_trf_row_29,g [...]
diff --git a/src/tiff/csv/geod_trf.csv b/src/tiff/csv/geod_trf.csv
new file mode 100644
index 0000000..921ccc6
--- /dev/null
+++ b/src/tiff/csv/geod_trf.csv
@@ -0,0 +1,489 @@
+"GEOD_TRF_CODE","GEOD_TRF_EPSG_NAME","GEOD_TRF_USER_NAME","DESCRIPTION","SOURCE_HORIZCS_CODE","TARGET_HORIZCS_CODE","COORD_TRF_VARIANT","CONCAT_TRF_AREA_OF_USE","COORD_TRF_PATH_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","CONCAT_TRF_REMARKS","CHANGE_ID"
+8000,Adindan to WGS 84 (1),,DMA-Eth Sud,4201,4326,1,,8400,1996-10-18 00:00:00,,EPSG,,
+8001,Adindan to WGS 84 (2),,DMA-Bfa,4201,4326,2,,8401,1996-10-18 00:00:00,,EPSG,,
+8002,Adindan to WGS 84 (3),,DMA-Cmr,4201,4326,3,,8402,1996-10-18 00:00:00,,EPSG,,
+8003,Adindan to WGS 84 (4),,DMA-Eth,4201,4326,4,,8403,1996-10-18 00:00:00,,EPSG,,
+8004,Adindan to WGS 84 (5),,DMA-Mli,4201,4326,5,,8404,1996-10-18 00:00:00,,EPSG,,
+8005,Adindan to WGS 84 (6),,DMA-Sen,4201,4326,6,,8405,1996-10-18 00:00:00,,EPSG,,
+8006,Adindan to WGS 84 (7),,DMA-Sud,4201,4326,7,,8406,1996-10-18 00:00:00,,EPSG,,
+8007,Afgooye to WGS 84 (1),,DMA-Som,4205,4326,1,,8407,1996-10-18 00:00:00,,EPSG,,
+8008,AGD66 to WGS 84 (1),,DMA-Aus,4202,4326,1,,8408,1996-10-18 00:00:00,,EPSG,,
+8009,AGD84 to WGS 84 (1),,DMA-Aus,4203,4326,1,,8409,1996-10-18 00:00:00,,EPSG,,
+8010,Ain el Abd to WGS 84 (1),,DMA-Bhr,4204,4326,1,,8410,1996-10-18 00:00:00,,EPSG,,
+8011,Ain el Abd to WGS 84 (2),,DMA-Sau,4204,4326,2,,8411,1996-10-18 00:00:00,,EPSG,,
+8012,Amersfoort to WGS 84 (1),,NCG-Nld,4289,4326,1,,8412,1996-10-18 00:00:00,,EPSG,,
+8013,Arc 1950 to WGS 84 (1),,DMA-mean,4209,4326,1,,8413,1996-10-18 00:00:00,,EPSG,,
+8014,Arc 1950 to WGS 84 (2),,DMA-Bwa,4209,4326,2,,8414,1996-10-18 00:00:00,,EPSG,,
+8015,Arc 1950 to WGS 84 (3),,DMA-Bdi,4209,4326,3,,8415,1996-10-18 00:00:00,,EPSG,,
+8016,Arc 1950 to WGS 84 (4),,DMA-Lso,4209,4326,4,,8416,1996-10-18 00:00:00,,EPSG,,
+8017,Arc 1950 to WGS 84 (5),,DMA-Mwi,4209,4326,5,,8417,1996-10-18 00:00:00,,EPSG,,
+8018,Arc 1950 to WGS 84 (6),,DMA-Swz,4209,4326,6,,8418,1996-10-18 00:00:00,,EPSG,,
+8019,Arc 1950 to WGS 84 (7),,DMA-Cod,4209,4326,7,,8419,1996-10-18 00:00:00,,EPSG,,
+8020,Arc 1950 to WGS 84 (8),,DMA-Zmb,4209,4326,8,,8420,1996-10-18 00:00:00,,EPSG,,
+8021,Arc 1950 to WGS 84 (9),,DMA-Zwe,4209,4326,9,,8421,1996-10-18 00:00:00,,EPSG,,
+8022,Arc 1960 to WGS 84 (1),,DMA-Ken Tza,4210,4326,1,,8422,1996-10-18 00:00:00,,EPSG,,
+8023,Batavia to WGS 84 (1),,DMA-Idn Sumatra,4211,4326,1,,8423,1996-10-18 00:00:00,,EPSG,,
+8024,Bermuda 1957 to WGS 84 (1),,DMA-Bmu,4216,4326,1,,8424,1996-10-18 00:00:00,,EPSG,,
+8025,Bogota to WGS 84 (1),,DMA-Col,4218,4326,1,,8425,1996-10-18 00:00:00,,EPSG,,
+8026,Bukit Rimpah to WGS 84 (1),,DMA-Idn Beli,4219,4326,1,,8426,1996-10-18 00:00:00,,EPSG,,
+8027,Campo Inchauspe to WGS 84 (1),,DMA-Arg,4221,4326,1,,8427,1996-10-18 00:00:00,,EPSG,,
+8028,Cape to WGS 84 (1),,DMA-Zaf,4222,4326,1,,8428,1996-10-18 00:00:00,,EPSG,,
+8029,Cape to WGS 84 (2),,DSLI-Zaf,4222,4326,2,,8429,1996-10-18 00:00:00,,EPSG,,
+8030,Carthage to WGS 84 (1),,DMA-Tun,4223,4326,1,,8430,1996-10-18 00:00:00,,EPSG,,
+8031,Chua to WGS 84 (1),,DMA-Pry,4224,4326,1,,8431,1996-10-18 00:00:00,,EPSG,,
+8032,Corrego Alegre to WGS 84 (1),,DMA-Bra,4225,4326,1,,8432,1996-10-18 00:00:00,,EPSG,,
+8033,ED50 to WGS 84 (1),,DMA-mean,4230,4326,1,,8433,1996-10-18 00:00:00,,EPSG,,
+8034,ED50 to WGS 84 (2),,DMA-cenEur,4230,4326,2,,8434,1996-10-18 00:00:00,,EPSG,,
+8035,ED50 to WGS 84 (3),,DMA-midEast,4230,4326,3,,8435,1996-10-18 00:00:00,,EPSG,,
+8036,ED50 to WGS 84 (4),,DMA-Cyp,4230,4326,4,,8436,1996-10-18 00:00:00,,EPSG,,
+8037,ED50 to WGS 84 (5),,DMA-Egy,4230,4326,5,,8437,1996-10-18 00:00:00,,EPSG,,
+8038,ED50 to WGS 84 (6),,DMA-Irl Gbr,4230,4326,6,,8438,1996-10-18 00:00:00,,EPSG,,
+8039,ED50 to WGS 84 (7),,DMA-Fin Nor,4230,4326,7,,8439,1996-10-18 00:00:00,,EPSG,,
+8040,ED50 to WGS 84 (8),,DMA-Grc,4230,4326,8,,8440,1996-10-18 00:00:00,,EPSG,,
+8041,ED50 to WGS 84 (9),,DMA-Irn,4230,4326,9,,8441,1996-10-18 00:00:00,,EPSG,,
+8042,ED50 to WGS 84 (10),,DMA-Ita Sard,4230,4326,10,,8442,1996-10-18 00:00:00,,EPSG,,
+8043,ED50 to WGS 84 (11),,DMA-Ita Sic,4230,4326,11,,8443,1996-10-18 00:00:00,,EPSG,,
+8044,ED50 to WGS 84 (12),,DMA-Mlt,4230,4326,12,,8444,1996-10-18 00:00:00,,EPSG,,
+8045,ED50 to WGS 84 (13),,DMA-Prt Esp,4230,4326,13,,8445,1996-10-18 00:00:00,,EPSG,,
+8046,ED50 to WGS 84 (14),,6Nat-NSea,4230,4326,14,Denmark - North Sea; Germany - North Sea; Netherlands - offshore; Norway - North Sea south of 62 deg N; United Kingdom (UKCS) - North Sea south of 62 deg N.,8446,1996-10-18 00:00:00,,EPSG,,
+8047,ED50 to WGS 84 (15),,NMA-Nor N65,4230,4326,15,Norway - offshore north of 65 deg N.,8447,1996-10-18 00:00:00,,EPSG,The concatenation of transformations 1147 and 1146 gives the following position vector tfm: dX=-84.491 dY=-100.559 dZ=-114.209 metres rX= -2.4006 rY=-0.5367 rZ=-2.3742 microradians dS=+0.2947 ppm.,
+8048,Egypt 1907 to WGS 84 (1),,DMA-Egy,4229,4326,1,,8448,1996-10-18 00:00:00,,EPSG,,
+8049,ETRF89 to WGS 84 (1),,EPSG-eur,4258,4326,1,,8449,1997-06-19 00:00:00,,EPSG,,97.24
+8050,GDA94 to WGS 84 (1),,EPSG-Aus,4283,4326,1,,8450,1996-10-18 00:00:00,,EPSG,,
+8051,GD49 to WGS 84 (1),,DMA-Nzl,4272,4326,1,,8451,1996-10-18 00:00:00,,EPSG,,
+8052,Hu Tzu Shan to WGS 84 (1),,DMA-Twn,4236,4326,1,,8452,1996-10-18 00:00:00,,EPSG,,
+8053,Indian 1954 to WGS 84 (1),,DMA-Tha,4239,4326,1,,8453,1996-10-18 00:00:00,,EPSG,,
+8054,Indian 1975 to WGS 84 (1),,DMA-Tha,4240,4326,1,,8454,1996-10-18 00:00:00,,EPSG,,
+8055,Kalianpur 1937 to WGS 84 (1),,DMA-Bgd,4144,4326,1,,8455,1999-10-20 00:00:00,,EPSG,,97.235
+8056,Kalianpur 1975 to WGS 84 (1),,DMA-Ind Npl,4146,4326,1,,8456,1999-10-20 00:00:00,,EPSG,,97.235
+8057,Kandawala to WGS 84 (1),,DMA-Lka,4244,4326,1,,8457,1996-10-18 00:00:00,,EPSG,,
+8058,Kertau to WGS 84 (1),,DMA-Mys Sgp,4245,4326,1,,8458,1996-10-18 00:00:00,,EPSG,,
+8059,Leigon to WGS 84 (1),,DMA-Gha,4250,4326,1,,8459,1996-10-18 00:00:00,,EPSG,,
+8060,Liberia 1964 to WGS 84 (1),,DMA-Lbr,4251,4326,1,,8460,1996-10-18 00:00:00,,EPSG,,
+8061,Luzon 1911 to WGS 84 (1),,DMA-Phl N,4253,4326,1,,8461,1996-10-18 00:00:00,,EPSG,,
+8062,Luzon 1911 to WGS 84 (2),,DMA-Phl Min,4253,4326,2,,8462,1996-10-18 00:00:00,,EPSG,,
+8063,M'poraloko to WGS 84 (1),,DMA-Gab,4266,4326,1,,8463,1996-10-18 00:00:00,,EPSG,,
+8064,Mahe 1971 to WGS 84 (1),,DMA-Syc,4256,4326,1,,8464,1996-10-18 00:00:00,,EPSG,,
+8065,Massawa to WGS 84 (1),,DMA-Eth,4262,4326,1,,8465,1996-10-18 00:00:00,,EPSG,,
+8066,Merchich to WGS 84 (1),,DMA-Mar,4261,4326,1,,8466,1996-10-18 00:00:00,,EPSG,,
+8067,Minna to WGS 84 (1),,DMA-Cmr,4263,4326,1,,8467,1996-10-18 00:00:00,,EPSG,,
+8068,Minna to WGS 84 (2),,DMA-Nga,4263,4326,2,,8468,1996-10-18 00:00:00,,EPSG,,
+8069,Monte Mario to WGS 84 (1),,DMA-Ita Sar,4265,4326,1,,8469,1996-10-18 00:00:00,,EPSG,,
+8070,NAD27 to WGS 84 (1),,DMA-Carib,4267,4326,1,,8470,1996-10-18 00:00:00,,EPSG,,
+8071,NAD27 to WGS 84 (2),,DMA-Cen Am,4267,4326,2,,8471,1996-10-18 00:00:00,,EPSG,,
+8072,NAD27 to WGS 84 (3),,DMA-Can,4267,4326,3,,8472,1996-10-18 00:00:00,,EPSG,,
+8073,NAD27 to WGS 84 (4),,DMA-Conus,4267,4326,4,,8473,1996-10-18 00:00:00,,EPSG,,
+8074,NAD27 to WGS 84 (5),,DMA-ConusE,4267,4326,5,,8474,1996-10-18 00:00:00,,EPSG,,
+8075,NAD27 to WGS 84 (6),,DMA-ConusW,4267,4326,6,,8475,1996-10-18 00:00:00,,EPSG,,
+8076,NAD27 to WGS 84 (7),,DMA-USA AK,4267,4326,7,,8476,1996-10-18 00:00:00,,EPSG,,
+8077,NAD27 to WGS 84 (8),,DMA-Bha xSalv,4267,4326,8,,8477,1996-10-18 00:00:00,,EPSG,,
+8078,NAD27 to WGS 84 (9),,DMA-Bha Salv,4267,4326,9,,8478,1996-10-18 00:00:00,,EPSG,,
+8079,NAD27 to WGS 84 (10),,DMA-Can AB BC,4267,4326,10,,8479,1996-10-18 00:00:00,,EPSG,,
+8080,NAD27 to WGS 84 (11),,DMA-Can MN ON,4267,4326,11,,8480,1996-10-18 00:00:00,,EPSG,,
+8081,NAD27 to WGS 84 (12),,DMA-Can E,4267,4326,12,,8481,1996-10-18 00:00:00,,EPSG,,
+8082,NAD27 to WGS 84 (13),,DMA-Can NWT,4267,4326,13,,8482,1996-10-18 00:00:00,,EPSG,,
+8083,NAD27 to WGS 84 (14),,DMA-Can Yuk,4267,4326,14,,8483,1996-10-18 00:00:00,,EPSG,,
+8084,NAD27 to WGS 84 (15),,DMA-Pan,4267,4326,15,,8484,1996-10-18 00:00:00,,EPSG,,
+8085,NAD27 to WGS 84 (16),,DMA-Cuba,4267,4326,16,,8485,1996-10-18 00:00:00,,EPSG,,
+8086,NAD27 to WGS 84 (17),,DMA-Grl,4267,4326,17,,8486,1996-10-18 00:00:00,,EPSG,,
+8087,NAD27 to WGS 84 (18),,DMA-Mex,4267,4326,18,,8487,1996-10-18 00:00:00,,EPSG,,
+8088,NAD83 to WGS 84 (1),,DMA-N Am,4269,4326,1,,8488,1996-10-18 00:00:00,,EPSG,,
+8089,Nahrwan 1967 to WGS 84 (1),,DMA-Omn Mas,4270,4326,1,,8489,1996-10-18 00:00:00,,EPSG,,
+8090,Nahrwan 1967 to WGS 84 (2),,DMA-Sau,4270,4326,2,,8490,1996-10-18 00:00:00,,EPSG,,
+8091,Nahrwan 1967 to WGS 84 (3),,DMA-UAE,4270,4326,3,,8491,1996-10-18 00:00:00,,EPSG,,
+8092,Naparima 1972 to WGS 84 (1),,DMA-Tto,4271,4326,1,,8492,1998-06-30 00:00:00,,EPSG,,98.102
+8093,NTF to WGS 84 (1),,IGN-Fra,4275,4326,1,,8493,1996-10-18 00:00:00,,EPSG,,
+8094,NTF (Paris) to WGS 84 (1),,EPSG-Fra,4807,4326,1,France..,8494,1996-10-18 00:00:00,,EPSG,,
+8095,OSGB 1936 to WGS 84 (1),,DMA-Gbr,4277,4326,1,,8495,1996-10-18 00:00:00,,EPSG,,
+8096,OSGB 1936 to WGS 84 (2),,DMA-Gbr Eng,4277,4326,2,,8496,1996-10-18 00:00:00,,EPSG,,
+8097,OSGB 1936 to WGS 84 (3),,DMA-Gbr E&W,4277,4326,3,,8497,1996-10-18 00:00:00,,EPSG,,
+8098,OSGB 1936 to WGS 84 (4),,DMA-Gbr Sco,4277,4326,4,,8498,1996-10-18 00:00:00,,EPSG,,
+8099,OSGB 1936 to WGS 84 (5),,DMA-Gbr Wal,4277,4326,5,,8499,1996-10-18 00:00:00,,EPSG,,
+8100,Pointe Noire to WGS 84 (1),,DMA-Cog,4282,4326,1,,8500,1996-10-18 00:00:00,,EPSG,,
+8101,PSAD56 to WGS 84 (1),,DMA-mean,4248,4326,1,,8501,1996-10-18 00:00:00,,EPSG,,
+8102,PSAD56 to WGS 84 (2),,DMA-Bol,4248,4326,2,,8502,1996-10-18 00:00:00,,EPSG,,
+8103,PSAD56 to WGS 84 (3),,DMA-Chl N,4248,4326,3,,8503,1996-10-18 00:00:00,,EPSG,,
+8104,PSAD56 to WGS 84 (4),,DMA Chl S,4248,4326,4,,8504,1996-10-18 00:00:00,,EPSG,,
+8105,PSAD56 to WGS 84 (5),,DMA-Col,4248,4326,5,,8505,1996-10-18 00:00:00,,EPSG,,
+8106,PSAD56 to WGS 84 (6),,DMA-Ecu,4248,4326,6,,8506,1996-10-18 00:00:00,,EPSG,,
+8107,PSAD56 to WGS 84 (7),,DMA-Guy,4248,4326,7,,8507,1996-10-18 00:00:00,,EPSG,,
+8108,PSAD56 to WGS 84 (8),,DMA-Per,4248,4326,8,,8508,1996-10-18 00:00:00,,EPSG,,
+8109,PSAD56 to WGS 84 (9),,DMA-Ven,4248,4326,9,,8509,1996-10-18 00:00:00,,EPSG,,
+8110,Qatar to WGS 84 (1),,DMA-Qat,4285,4326,1,,8510,1996-10-18 00:00:00,,EPSG,,
+8111,Qornoq to WGS 84 (1),,DMA-Grl S,4287,4326,1,,8511,1996-10-18 00:00:00,,EPSG,,
+8112,SAD69 to WGS 84 (1),,DMA-mean,4291,4326,1,,8512,1996-10-18 00:00:00,,EPSG,,
+8113,SAD69 to WGS 84 (2),,DMA-Arg,4291,4326,2,,8513,1996-10-18 00:00:00,,EPSG,,
+8114,SAD69 to WGS 84 (3),,DMA-Bol,4291,4326,3,,8514,1996-10-18 00:00:00,,EPSG,,
+8115,SAD69 to WGS 84 (4),,DMA-Bra,4291,4326,4,,8515,1996-10-18 00:00:00,,EPSG,,
+8116,SAD69 to WGS 84 (5),,DMA-Chile,4291,4326,5,,8516,1996-10-18 00:00:00,,EPSG,,
+8117,SAD69 to WGS 84 (6),,DMA-Col,4291,4326,6,,8517,1996-10-18 00:00:00,,EPSG,,
+8118,SAD69 to WGS 84 (7),,DMA-Ecu,4291,4326,7,,8518,1996-10-18 00:00:00,,EPSG,,
+8119,SAD69 to WGS 84 (8),,DMA-Ecu Gal,4291,4326,8,,8519,1996-10-18 00:00:00,,EPSG,,
+8120,SAD69 to WGS 84 (9),,DMA-Guyana,4291,4326,9,,8520,1996-10-18 00:00:00,,EPSG,,
+8121,SAD69 to WGS 84 (10),,DMA-Pgy,4291,4326,10,,8521,1996-10-18 00:00:00,,EPSG,,
+8122,SAD69 to WGS 84 (11),,DMA-Peru,4291,4326,11,,8522,1996-10-18 00:00:00,,EPSG,,
+8123,SAD69 to WGS 84 (12),,DMA-Tto,4291,4326,12,,8523,1996-10-18 00:00:00,,EPSG,,
+8124,SAD69 to WGS 84 (13),,DMA-Ven,4291,4326,13,,8524,1996-10-18 00:00:00,,EPSG,,
+8125,Sapper Hill 1943 to WGS 84 (1),,DMA-Flk E,4292,4326,1,,8525,1996-10-18 00:00:00,,EPSG,,
+8126,Schwarzeck to WGS 84 (1),,DMA-Nam,4293,4326,1,,8526,1996-10-18 00:00:00,,EPSG,,
+8127,Tananarive to WGS 84 (1),,DMA-Mdg,4297,4326,1,,8527,1996-10-18 00:00:00,,EPSG,,
+8128,Timbalai 1948 to WGS 84 (1),,DMA-Borneo,4298,4326,1,,8528,1996-10-18 00:00:00,,EPSG,,
+8129,TM65 to WGS 84 (1),,DMA-Ire,4299,4326,1,,8529,1996-10-18 00:00:00,,EPSG,,
+8130,Tokyo to WGS 84 (1),,DMA-Jpn Kor,4301,4326,1,,8530,1996-10-18 00:00:00,,EPSG,,
+8131,Tokyo to WGS 84 (2),,DMA-Jpn,4301,4326,2,,8531,1996-10-18 00:00:00,,EPSG,,
+8132,Tokyo to WGS 84 (3),,DMA-Kor,4301,4326,3,,8532,1996-10-18 00:00:00,,EPSG,,
+8133,Tokyo to WGS 84 (4),,DMA-Jpn Ok,4301,4326,4,,8533,1996-10-18 00:00:00,,EPSG,,
+8134,Yacare to WGS 84 (1),,DMA-Ury,4309,4326,1,,8534,1996-10-18 00:00:00,,EPSG,,
+8135,Zanderij to WGS 84 (1),,DMA-Sur,4311,4326,1,,8535,1996-10-18 00:00:00,,EPSG,,
+8136,ED50 to ED87 (1),,6Nat-NSea,4230,4231,1,,8536,1996-10-18 00:00:00,,EPSG,,
+8137,ED87 to WGS 84 (1),,6Nat-NSea,4231,4326,1,,8537,1996-10-18 00:00:00,,EPSG,,
+8138,ED50 to ED87 (2),,NMA-Nor N65,4230,4231,2,,8538,1996-10-18 00:00:00,,EPSG,,
+8139,AGD84 to WGS 84 (2),,Auslig-Aus old,4203,4326,2,,8539,1996-12-12 00:00:00,,EPSG,,
+8140,WGS 72 to WGS 84 (1),,DMA,4322,4326,1,,8540,1996-12-12 00:00:00,,EPSG,,
+8141,WGS 72 to WGS 84 (2),,,4322,4326,2,,8541,1996-12-12 00:00:00,,EPSG,,
+8142,WGS 72BE to WGS 72 (1),,,4324,4322,1,,8542,1996-12-12 00:00:00,,EPSG,,
+8143,WGS 72BE to WGS 84 (1),,,4324,4326,1,,8543,1996-12-12 00:00:00,,EPSG,,
+8144,NAD27 to NAD83 (1),,NGS-Conus,4267,4269,1,,8544,1996-12-12 00:00:00,,EPSG,,
+8146,NAD27 to NAD83 (2),,NGS-Usa AK,4267,4269,2,,8546,1996-12-12 00:00:00,,EPSG,,
+8148,ED50 to WGS 84 (16),,DMA-Tun,4230,4326,16,,8548,1997-06-12 00:00:00,,EPSG,,
+8149,Herat North to WGS 84 (1),,DMA-Afg,4255,4326,1,,8549,1997-06-12 00:00:00,,EPSG,,
+8150,Kalianpur 1962 to WGS 84 (1),,DMA-Pak,4145,4326,1,,8550,1999-10-20 00:00:00,,EPSG,,97.235
+8151,ID74 to WGS 84 (1),,DMA-Idn,4238,4326,1,,8551,1997-06-12 00:00:00,,EPSG,,
+8152,NAD27 to WGS 84 (21),,DMA-AK AluE,4267,4326,21,,8552,1997-04-11 00:00:00,,EPSG,,
+8153,NAD27 to WGS 84 (22),,DMA-AK AluW,4267,4326,22,,8553,1997-04-11 00:00:00,,EPSG,,
+8154,NAD83 to WGS 84 (2),,DMA-AK Alu,4269,4326,2,,8554,1997-04-11 00:00:00,,EPSG,,
+8155,NAD83 to WGS 84 (3),,DMA-USA Hi,4269,4326,3,,8555,1997-04-11 00:00:00,,EPSG,,
+8156,Nord Sahara 1959 to WGS 84 (1),,DMA-Alg,4307,4326,1,,8556,1997-04-11 00:00:00,,EPSG,,
+8157,Pulkovo 1942 to WGS 84 (1),,DMA-Rus,4284,4326,1,,8557,1997-04-11 00:00:00,,EPSG,,
+8158,Voirol Unifie to WGS 84 (1),,DMA-Alg N,4305,4326,1,,8558,1997-04-11 00:00:00,,EPSG,,98.15
+8159,Fahud to WGS 84 (1),,DMA-Omn,4232,4326,1,,8559,1997-04-11 00:00:00,,EPSG,,
+8160,NTF (Paris) to NTF (1),,IGN-Fra,4807,4275,1,,8560,1997-04-11 00:00:00,,EPSG,,
+8161,Bern 1898 (Bern) to Bern 1898 (1),,BfL-CH,4801,4217,1,,8561,1997-04-11 00:00:00,,EPSG,,
+8162,Bogota (Bogota) to Bogota (1),,IGAC-Col,4802,4218,1,,8562,1997-04-11 00:00:00,,EPSG,,
+8163,Lisbon (Lisbon) to Lisbon (1),,IGC-Prt,4803,4207,1,,8564,1997-04-11 00:00:00,,EPSG,,
+8164,Makassar (Jakarta) to Makassar (1),,EPSG-Idn Sulawesi,4804,4257,1,,8565,1997-04-11 00:00:00,,EPSG,,
+8165,MGI (Ferro) to MGI (1),,BEV-Aut balk,4805,4312,1,,8566,1997-04-11 00:00:00,,EPSG,,
+8166,Monte Mario (Rome) to Monte Mario (1),,EPSG-Ita,4806,4265,1,,8567,1997-04-11 00:00:00,,EPSG,,
+8167,Padang (Jakarta) to Padang (1),,EPSG-Idn Sumatra,4808,4280,1,,8569,1997-04-11 00:00:00,,EPSG,,
+8168,Belge 1950 (Brussels) to Belge 1950 (1),,IGN-Bel,4809,4215,1,,8570,1997-04-11 00:00:00,,EPSG,,
+8169,Tananarive (Paris) to Tananarive (1),,EPSG-Mdg,4810,4297,1,,8571,1997-04-11 00:00:00,,EPSG,,
+8170,Voirol 1875 (Paris) to Voirol 1875 (1),,IGN-Dza,4811,4304,1,,8573,1997-04-11 00:00:00,,EPSG,,
+8171,Voirol Unifie (Paris) to Voirol Unifie(1,,IGN-Dza,4812,4305,1,,8574,1997-04-11 00:00:00,,EPSG,,
+8172,Batavia (Jakarta) to Batavia (1),,EPSG-Idn Java,4813,4211,1,,8576,1997-04-11 00:00:00,,EPSG,,
+8173,RT38 (Stockholm) to RT38 (1),,NLS-Swe,4814,4308,1,,8578,1997-04-11 00:00:00,,EPSG,,
+8174,Bogota (Bogota) to WGS 84 (1),,EPSG-Col,4802,4326,1,Colombia.,8563,1997-04-11 00:00:00,,EPSG,,
+8175,Monte Mario (Rome) to WGS 84 (1),,EPSG-Ita,4806,4326,1,Italy (Sardinia).,8568,1997-04-11 00:00:00,,EPSG,,
+8176,Tananarive (Paris) to WGS 84 (1),,EPSG-Mdg,4810,4326,1,Madagascar.,8572,1997-04-11 00:00:00,,EPSG,,
+8177,Voirol Unifie (Paris) to WGS 84 (1),,EPSG-Dza N,4812,4326,1,Algeria - north of 35g (31 deg 30 min) North,8575,1997-04-11 00:00:00,,EPSG,,
+8178,Batavia (Jakarta) to WGS 84 (1),,EPSG-Idn Sumatra,4813,4326,1,Indonesia (Sumatra).,8577,1997-04-11 00:00:00,,EPSG,,
+8179,Greek (Athens) to Greek (1),,NTU-Grc,4815,4120,1,,8579,1998-12-14 00:00:00,,EPSG,,98.52
+8180,Schwarzeck to WGS 84 (2),,SLI-Nam,4293,4326,2,,8580,1998-11-19 00:00:00,,EPSG,,98.46
+8181,GGRS87 to WGS 84 (1),,Hel-Grc,4121,4326,1,,8581,1997-06-16 00:00:00,,EPSG,,
+8182,HD72 to ETRF89 (1),,ELTE-Hun,4237,4258,1,,8582,1997-11-13 00:00:00,,EPSG,,97.47
+8183,HD72 to WGS 84 (1),,EPSG-Hun,4237,4326,1,Hungary.,8583,1997-07-22 00:00:00,,EPSG,For many purposes ETRF89 can be assumed to be coincident with WGS 84.,
+8184,ED50 to WGS 84 (17),,IGN-Fra,4230,4326,17,,8584,1997-11-13 00:00:00,,EPSG,,
+8185,NTF to ED50 (1),,IGN-Fra,4275,4230,1,,8585,1997-11-13 00:00:00,,EPSG,,
+8186,NTF (Paris) to ED50 (1),,EPSG-Fra,4807,4230,1,France,8586,1997-11-13 00:00:00,,EPSG,,
+8187,NTF to WGS 72 (1),,IGN-Fra,4275,4322,1,,8587,1997-11-13 00:00:00,,EPSG,,
+8188,NTF (Paris) to WGS 72 (1),,EPSG-Fra,4807,4322,1,France.,8588,1997-11-13 00:00:00,,EPSG,,
+8189,AGD66 to GDA94 (1),,Auslig-Aus 5m,4202,4283,1,,8589,1997-11-13 00:00:00,,EPSG,,
+8190,AGD66 to WGS 84 (2),,EPSG-Aus 5m,4202,4326,2,Australia..,8590,1998-12-16 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,98.50
+8191,AGD84 to GDA94 (1),,Auslig-Aus 5m,4203,4283,1,,8591,1997-11-13 00:00:00,,EPSG,,
+8192,AGD84 to WGS 84 (3),,EPSG-Aus 5m,4203,4326,3,Australia,8592,1998-12-16 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,98.50
+8193,AGD84 to GDA94 (2),,Auslig-Aus 1m,4203,4283,2,,8593,1997-11-13 00:00:00,,EPSG,,
+8194,AGD84 to WGS 84 (4),,EPSG-Aus 1m,4203,4326,4,Australia.,8594,1998-12-16 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,98.50
+8195,RT90 to WGS 84 (1),,EPSG-Swe,4124,4326,1,Sweden.,8595,1999-04-22 00:00:00,,EPSG,For many purposes ETRF89 can be assumed to be coincident with WGS 84.,99.11
+8196,Samboja to WGS 84 (1),,TOT-Idn Mah,4125,4326,1,,8596,1997-11-13 00:00:00,,EPSG,,
+8197,Pulkovo 1942 to LKS94 (1),,HNIT-Ltu,4284,4126,1,,8597,1998-03-12 00:00:00,,EPSG,,
+8198,LKS94 to WGS 84 (1),,HNIT-Ltu,4126,4326,1,,8598,1998-04-16 00:00:00,,EPSG,For many purposes LKS94 can be assumed to be coincident with WGS 84.,98.13
+8199,Pulkovo 1942 to WGS 84 (2),,EPSG-Ltu,4284,4326,2,Lithuania.,8609,1998-03-12 00:00:00,,EPSG,For many purposes LKS94 can be assumed to be coincident with WGS 84.,
+8200,Pulkovo 1942 to WGS 84 (3),,NIMA-Hun,4284,4326,3,,8602,1998-03-12 00:00:00,,EPSG,,
+8201,Pulkovo 1942 to WGS 84 (4),,NIMA-Pol,4284,4326,4,,8603,1998-03-12 00:00:00,,EPSG,,
+8202,Pulkovo 1942 to WGS 84 (5),,NIMA-Cze,4284,4326,5,,8604,1998-03-12 00:00:00,,EPSG,,
+8203,Pulkovo 1942 to WGS 84 (6),,NIMA-Lva,4284,4326,6,,8605,1998-03-12 00:00:00,,EPSG,,
+8204,Pulkovo 1942 to WGS 84 (7),,NIMA-Kaz,4284,4326,7,,8606,1998-03-12 00:00:00,,EPSG,,
+8205,Pulkovo 1942 to WGS 84 (8),,NIMA-Alb,4284,4326,8,,8607,1998-03-12 00:00:00,,EPSG,,
+8206,Pulkovo 1942 to WGS 84 (9),,NIMA-Rom,4284,4326,9,,8608,1998-03-12 00:00:00,,EPSG,,
+8207,Arc 1960 to WGS 84 (2),,NIMA-Ken,4210,4326,2,,8599,1998-03-12 00:00:00,,EPSG,,
+8208,Arc 1960 to WGS 84 (3),,NIMA-Tza,4210,4326,3,,8600,1998-03-12 00:00:00,,EPSG,,
+8209,Segora to WGS 84 (1),,NIMA-Idn Kal,4294,4326,1,,8601,1998-03-12 00:00:00,,EPSG,,
+8210,Voirol 1875 to WGS 84 (1),,NIMA-Dza N,4304,4326,1,,8610,1998-03-12 00:00:00,,EPSG,,
+8211,Voirol 1875 (Paris) to WGS 84 (1),,EPSG-Dza N,4811,4326,1,Algeria - north of 35g (31 deg 30 min) North.,8611,1998-03-12 00:00:00,,EPSG,,
+8212,Naparima 1972 to WGS 84 (2),,MEEI-Tto,4271,4326,2,,8612,1998-04-16 00:00:00,,EPSG,,
+8213,Trinidad 1903 to WGS 84 (1),,MEEI-Trin,4302,4326,1,,8613,1998-04-16 00:00:00,,EPSG,,
+8214,Tete to Moznet (1),,DNGC-Moz,4127,4130,1,,8614,1998-04-16 00:00:00,,EPSG,,
+8215,Tete to WGS 84 (1),,EPSG-Moz,4127,4326,1,Mozambique - average for whole country.,8615,1998-04-16 00:00:00,,EPSG,For many purposes Moznet can be assumed to be coincident with WGS 84.,
+8216,Tete to Moznet (2),,DNGC-Moz A,4127,4130,2,,8616,1998-04-16 00:00:00,,EPSG,,
+8217,Tete to WGS 84 (2),,EPSG-Moz A,4127,4326,2,Mozambique - Maputo province and southern part of Gaza province; i.e. south of approximately 24 deg S.,8617,1998-04-16 00:00:00,,EPSG,For many purposes Moznet can be assumed to be coincident with WGS 84.,
+8218,Tete to Moznet (3),,DNGC-Moz B,4127,4130,3,,8618,1998-04-16 00:00:00,,EPSG,,
+8219,Tete to WGS 84 (3),,EPSG-Moz B,4127,4326,3,Mozambique - provinces of Gaza; Inhambane and southern parts of Sofala and Manhica; i.e. between approximately 24 and 20 deg South.,8619,1998-04-16 00:00:00,,EPSG,For many purposes Moznet can be assumed to be coincident with WGS 84.,
+8220,Tete to Moznet (4),,DNGC-Moz C,4127,4130,4,,8620,1998-04-16 00:00:00,,EPSG,,
+8221,Tete to WGS 84 (4),,EPSG-Moz C,4127,4326,4,Mozambique - provinces of Sofala north of Beira corridor; Manhica; Tete and Zambezia; i.e. between approximately 20 and 16 deg South.,8621,1998-04-16 00:00:00,,EPSG,For many purposes Moznet can be assumed to be coincident with WGS 84.,
+8222,Tete to Moznet (5),,DNGC-Moz D,4127,4130,5,,8622,1998-04-16 00:00:00,,EPSG,,
+8223,Tete to WGS 84 (5),,EPSG-Moz D,4127,4326,5,Mozambique - provinces of Nampula; Niassa; Cabo Delgado; i.e. north of approximately 16 deg S.,8623,1998-04-16 00:00:00,,EPSG,For many purposes Moznet can be assumed to be coincident with WGS 84.,
+8224,Moznet to WGS 84 (1),,EPSG-Moz,4130,4326,1,,8624,1998-04-16 00:00:00,,EPSG,,
+8225,Pulkovo 1942 to WGS 84 (10),,KCS-Kaz Cas,4284,4326,10,,8625,1998-04-16 00:00:00,,EPSG,,
+8226,Indian 1975 to WGS 84 (2),,NIMA-Tha,4240,4326,2,,8626,1998-04-16 00:00:00,,EPSG,,
+8227,Tokyo to WGS 84 (5),,NIMA-Kor,4301,4326,5,,8627,1998-11-19 00:00:00,,EPSG,,98.46
+8228,MGI to WGS 84 (1),,NIMA-balk,4312,4326,1,,8628,1998-04-16 00:00:00,,EPSG,,
+8229,Naparima 1972 to WGS 84 (3),,NIMA-Tto,4271,4326,3,,8629,1998-04-16 00:00:00,,EPSG,,
+8233,DHDN to ETRF89 (1),,IfAG-Deu W,4314,4258,1,,8633,1998-06-30 00:00:00,,EPSG,,
+8234,DHDN to WGS 84 (1),,EPSG-Deu W,4314,4326,1,Germany - former west Germany.,8634,1998-06-30 00:00:00,EPSG,EPSG,For many purposes ETRF89 can be assumed to be coincident with WGS 84.,
+8235,Pulkovo 1942 to ETRF89 (1),,IfAG-Deu E,4284,4258,1,,8635,1998-06-30 00:00:00,,EPSG,,
+8236,Pulkovo 1942 to WGS 84 (11),,EPSG-Deu E,4284,4326,11,Germany - former east Germany - Brandenburg; Mecklenburg-Vorpommern; Sachsen-Anhalt.,8636,1998-06-30 00:00:00,,EPSG,For many purposes ETRF89 can be assumed to be coincident with WGS 84.,
+8237,ED50 to WGS 84 (Common Offshore),,UKOOA-CO,4230,4326,18,,8637,1998-06-30 00:00:00,,EPSG,,98.27
+8238,Madrid 1870 (Madrid) to ED50 (1),,IGB-Esp,4903,4230,1,,8638,1998-11-11 00:00:00,,EPSG,,
+8239,Madrid 1870 (Madrid) to ED50 (2),,IGB-Esp N,4903,4230,2,,8639,1998-11-11 00:00:00,,EPSG,,
+8240,Madrid 1870 (Madrid) to ED50 (3),,IGB-Esp S,4903,4230,3,,8640,1998-11-11 00:00:00,,EPSG,,
+8241,Madrid 1870 (Madrid) to WGS 84 (1),,EPSG-Esp,4903,4326,1,Spain.,8641,1998-11-11 00:00:00,,EPSG,,
+8242,NAD27 to NAD83 (3),,GC-Can NT1,4267,4269,3,,8642,1998-11-11 00:00:00,,EPSG,,98.57
+8243,NAD27 to WGS 84 (25),,EPSG-Can old,4267,4326,25,Canada,8643,1998-11-11 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8244,NAD27 to NAD83 (4),,GC-Can,4267,4269,4,,8644,1998-11-11 00:00:00,,EPSG,,98.57
+8245,NAD27 to WGS 84 (26),,EPSG-Can,4267,4326,26,Canada.,8645,1998-11-11 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8246,OSGB 1936 to WGS 84 (Petroleum),,UKOOA-Pet,4277,4326,6,,8646,1998-11-11 00:00:00,,EPSG,,
+8247,OSGB 1936 to ED50 (UKOOA),,UKOOA-UKCS,4277,4230,1,,8647,1998-11-11 00:00:00,,EPSG,,
+8248,Manoca to WGS 84 (1),,SCS-Cmr,4260,4326,1,,8648,1998-11-11 00:00:00,,EPSG,,
+8249,Camacupa to WGS 72BE (1),,GSI-Ago,4220,4324,1,,8649,1998-11-11 00:00:00,,EPSG,,
+8250,Camacupa to WGS 84 (1),,CON-Ago B5,4220,4326,1,,8650,1998-11-11 00:00:00,,EPSG,,
+8251,Camacupa to WGS 84 (2),,TEX-Ago B2,4220,4326,2,,8651,1998-11-11 00:00:00,,EPSG,,
+8252,Camacupa to WGS 84 (3),,SHL-Ago old,4220,4326,3,,8652,1998-11-11 00:00:00,,EPSG,,
+8253,Camacupa to WGS 84 (4),,GSI-Ago,4220,4326,4,,8653,1998-11-11 00:00:00,,EPSG,,
+8254,Camacupa to WGS 84 (5),,ELF-Ago B3 old,4220,4326,5,,8654,1998-11-11 00:00:00,,EPSG,,
+8255,Camacupa to WGS 84 (6),,ELF-Ago B7 old,4220,4326,6,,8655,1998-11-11 00:00:00,,EPSG,,
+8256,Camacupa to WGS 84 (7),,ELF-Ago B15,4220,4326,7,,8656,1998-11-11 00:00:00,,EPSG,,
+8257,Camacupa to WGS 84 (8),,ELF-Ago B2 old,4220,4326,8,,8657,1998-11-11 00:00:00,,EPSG,,
+8258,Camacupa to WGS 84 (9),,SHL-Ago B16,4220,4326,9,,8658,1998-11-11 00:00:00,,EPSG,,
+8259,Camacupa to WGS 84 (10),,ELF-Ago N,4220,4326,10,,8659,1998-11-11 00:00:00,,EPSG,,
+8260,Malongo 1987 to Mhast (1),,CHV-Ago Cab,4259,4264,1,,8660,1998-11-11 00:00:00,,EPSG,,
+8261,Mhast to WGS 84 (1),,CHV-Ago Cab,4264,4326,1,,8661,1998-11-11 00:00:00,,EPSG,,
+8262,Malongo 1987 to WGS 84 (1),,CHV-Ago Cab,4259,4326,1,,8662,1998-11-11 00:00:00,,EPSG,,
+8263,MGI (Ferro) to WGS 84 (1),,DMA-balk,4805,4326,1,MEAN FOR Boznia and Herzegovina; Croatia; Serbia; Slovenia.,8663,1998-12-14 00:00:00,,EPSG,,
+8264,EST92 to ETRF89 (1),,UT-Est,4133,4258,1,,8664,1998-12-14 00:00:00,,EPSG,,
+8265,Pulkovo 1942 to EST92 (1),,UT-Est,4284,4133,1,,8665,1998-12-14 00:00:00,,EPSG,,
+8266,EST92 to WGS 84 (1),,UT-Est,4133,4326,1,,8666,1998-12-14 00:00:00,,EPSG,,
+8267,Pulkovo 1942 to WGS 84 (12),,UT-Est,4284,4326,12,,8667,1998-12-14 00:00:00,,EPSG,,
+8268,Tokyo to WGS 84 (6),,GSI-Jpn 452141,4301,4326,6,,8668,1998-12-14 00:00:00,,EPSG,,
+8269,Tokyo to WGS 84 (7),,GSI-Jpn 452142,4301,4326,7,,8669,1998-12-14 00:00:00,,EPSG,,
+8270,Tokyo to WGS 84 (8),,GSI-Jpn 444141,4301,4326,8,,8670,1998-12-14 00:00:00,,EPSG,,
+8271,Tokyo to WGS 84 (9),,GSI-Jpn 444142,4301,4326,9,,8671,1998-12-14 00:00:00,,EPSG,,
+8272,Tokyo to WGS 84 (10),,GSI-Jpn 440141,4301,4326,10,,8672,1998-12-14 00:00:00,,EPSG,,
+8273,Tokyo to WGS 84 (11),,GSI-Jpn 440142,4301,4326,11,,8673,1998-12-14 00:00:00,,EPSG,,
+8274,Tokyo to WGS 84 (12),,GSI-Jpn 440143,4301,4326,12,,8674,1998-12-14 00:00:00,,EPSG,,
+8275,Tokyo to WGS 84 (13),,GSI-Jpn 440144,4301,4326,13,,8675,1998-12-14 00:00:00,,EPSG,,
+8276,Tokyo to WGS 84 (14),,GSI-Jpn 432141,4301,4326,14,,8676,1998-12-14 00:00:00,,EPSG,,
+8277,Tokyo to WGS 84 (15),,GSI-Jpn 432142,4301,4326,15,,8677,1998-12-14 00:00:00,,EPSG,,
+8278,Tokyo to WGS 84 (16),,GSI-Jpn 432143,4301,4326,16,,8678,1998-12-14 00:00:00,,EPSG,,
+8279,Tokyo to WGS 84 (17),,GSI-Jpn 432144,4301,4326,17,,8679,1998-12-14 00:00:00,,EPSG,,
+8280,Tokyo to WGS 84 (18),,GSI-Jpn 432145,4301,4326,18,,8680,1998-12-14 00:00:00,,EPSG,,
+8281,Tokyo to WGS 84 (19),,GSI-Jpn 424140,4301,4326,19,,8681,1998-12-14 00:00:00,,EPSG,,
+8282,Tokyo to WGS 84 (20),,GSI-Jpn 424141,4301,4326,20,,8682,1998-12-14 00:00:00,,EPSG,,
+8283,Tokyo to WGS 84 (21),,GSI-Jpn 424142,4301,4326,21,,8683,1998-12-14 00:00:00,,EPSG,,
+8284,Tokyo to WGS 84 (22),,GSI-Jpn 424143,4301,4326,22,,8684,1998-12-14 00:00:00,,EPSG,,
+8285,Tokyo to WGS 84 (23),,GSI-Jpn 424144,4301,4326,23,,8685,1998-12-14 00:00:00,,EPSG,,
+8286,Tokyo to WGS 84 (24),,GSI-Jpn 424145,4301,4326,24,,8686,1998-12-14 00:00:00,,EPSG,,
+8287,Tokyo to WGS 84 (25),,GSI-Jpn 420139,4301,4326,25,,8687,1998-12-14 00:00:00,,EPSG,,
+8288,Tokyo to WGS 84 (26),,GSI-Jpn 420140,4301,4326,26,,8688,1998-12-14 00:00:00,,EPSG,,
+8289,Tokyo to WGS 84 (27),,GSI-Jpn,4301,4326,27,,8689,1998-12-14 00:00:00,,EPSG,,
+8290,Tokyo to WGS 84 (28),,GSI-Jpn,4301,4326,28,,8690,1998-12-14 00:00:00,,EPSG,,
+8291,Tokyo to WGS 84 (29),,GSI-Jpn,4301,4326,29,,8691,1998-12-14 00:00:00,,EPSG,,
+8292,Tokyo to WGS 84 (30),,GSI-Jpn,4301,4326,30,,8692,1998-12-14 00:00:00,,EPSG,,
+8293,Tokyo to WGS 84 (31),,GSI-Jpn,4301,4326,31,,8693,1998-12-14 00:00:00,,EPSG,,
+8294,Tokyo to WGS 84 (32),,GSI-Jpn,4301,4326,32,,8694,1998-12-14 00:00:00,,EPSG,,
+8295,Tokyo to WGS 84 (33),,GSI-Jpn,4301,4326,33,,8695,1998-12-14 00:00:00,,EPSG,,
+8296,Tokyo to WGS 84 (34),,GSI-Jpn,4301,4326,34,,8696,1998-12-14 00:00:00,,EPSG,,
+8297,Tokyo to WGS 84 (35),,GSI-Jpn,4301,4326,35,,8697,1998-12-14 00:00:00,,EPSG,,
+8298,Tokyo to WGS 84 (36),,GSI-Jpn,4301,4326,36,,8698,1998-12-14 00:00:00,,EPSG,,
+8299,Tokyo to WGS 84 (37),,GSI-Jpn,4301,4326,37,,8699,1998-12-14 00:00:00,,EPSG,,
+8300,Tokyo to WGS 84 (38),,GSI-Jpn,4301,4326,38,,8700,1998-12-14 00:00:00,,EPSG,,
+8301,Tokyo to WGS 84 (39),,GSI-Jpn,4301,4326,39,,8701,1998-12-14 00:00:00,,EPSG,,
+8302,Tokyo to WGS 84 (40),,GSI-Jpn,4301,4326,40,,8702,1998-12-14 00:00:00,,EPSG,,
+8303,Tokyo to WGS 84 (41),,GSI-Jpn,4301,4326,41,,8703,1998-12-14 00:00:00,,EPSG,,
+8304,Tokyo to WGS 84 (42),,GSI-Jpn,4301,4326,42,,8704,1998-12-14 00:00:00,,EPSG,,
+8305,Tokyo to WGS 84 (43),,GSI-Jpn,4301,4326,43,,8705,1998-12-14 00:00:00,,EPSG,,
+8306,Tokyo to WGS 84 (44),,GSI-Jpn,4301,4326,44,,8706,1998-12-14 00:00:00,,EPSG,,
+8307,Tokyo to WGS 84 (45),,GSI-Jpn,4301,4326,45,,8707,1998-12-14 00:00:00,,EPSG,,
+8308,Tokyo to WGS 84 (46),,GSI-Jpn,4301,4326,46,,8708,1998-12-14 00:00:00,,EPSG,,
+8309,Tokyo to WGS 84 (47),,GSI-Jpn,4301,4326,47,,8709,1998-12-14 00:00:00,,EPSG,,
+8310,Tokyo to WGS 84 (48),,GSI-Jpn,4301,4326,48,,8710,1998-12-14 00:00:00,,EPSG,,
+8311,Tokyo to WGS 84 (49),,GSI-Jpn,4301,4326,49,,8711,1998-12-14 00:00:00,,EPSG,,
+8312,Tokyo to WGS 84 (50),,GSI-Jpn,4301,4326,50,,8712,1998-12-14 00:00:00,,EPSG,,
+8313,Tokyo to WGS 84 (51),,GSI-Jpn,4301,4326,51,,8713,1998-12-14 00:00:00,,EPSG,,
+8314,Tokyo to WGS 84 (52),,GSI-Jpn,4301,4326,52,,8714,1998-12-14 00:00:00,,EPSG,,
+8315,Tokyo to WGS 84 (53),,GSI-Jpn,4301,4326,53,,8715,1998-12-14 00:00:00,,EPSG,,
+8316,Tokyo to WGS 84 (54),,GSI-Jpn,4301,4326,54,,8716,1998-12-14 00:00:00,,EPSG,,
+8317,Tokyo to WGS 84 (55),,GSI-Jpn,4301,4326,55,,8717,1998-12-14 00:00:00,,EPSG,,
+8318,Tokyo to WGS 84 (56),,GSI-Jpn,4301,4326,56,,8718,1998-12-14 00:00:00,,EPSG,,
+8319,Tokyo to WGS 84 (57),,GSI-Jpn,4301,4326,57,,8719,1998-12-14 00:00:00,,EPSG,,
+8320,Tokyo to WGS 84 (58),,GSI-Jpn,4301,4326,58,,8720,1998-12-14 00:00:00,,EPSG,,
+8321,Tokyo to WGS 84 (59),,GSI-Jpn,4301,4326,59,,8721,1998-12-14 00:00:00,,EPSG,,
+8322,Tokyo to WGS 84 (60),,GSI-Jpn,4301,4326,60,,8722,1998-12-14 00:00:00,,EPSG,,
+8323,Tokyo to WGS 84 (61),,GSI-Jpn,4301,4326,61,,8723,1998-12-14 00:00:00,,EPSG,,
+8324,Tokyo to WGS 84 (62),,GSI-Jpn,4301,4326,62,,8724,1998-12-14 00:00:00,,EPSG,,
+8325,Tokyo to WGS 84 (63),,GSI-Jpn,4301,4326,63,,8725,1998-12-14 00:00:00,,EPSG,,
+8326,Tokyo to WGS 84 (64),,GSI-Jpn,4301,4326,64,,8726,1998-12-14 00:00:00,,EPSG,,
+8327,Tokyo to WGS 84 (65),,GSI-Jpn,4301,4326,65,,8727,1998-12-14 00:00:00,,EPSG,,
+8328,Tokyo to WGS 84 (66),,GSI-Jpn,4301,4326,66,,8728,1998-12-14 00:00:00,,EPSG,,
+8329,Tokyo to WGS 84 (67),,GSI-Jpn,4301,4326,67,,8729,1998-12-14 00:00:00,,EPSG,,
+8330,Tokyo to WGS 84 (68),,GSI-Jpn,4301,4326,68,,8730,1998-12-14 00:00:00,,EPSG,,
+8331,Tokyo to WGS 84 (69),,GSI-Jpn,4301,4326,69,,8731,1998-12-14 00:00:00,,EPSG,,
+8332,Tokyo to WGS 84 (70),,GSI-Jpn,4301,4326,70,,8732,1998-12-14 00:00:00,,EPSG,,
+8333,Tokyo to WGS 84 (71),,GSI-Jpn,4301,4326,71,,8733,1998-12-14 00:00:00,,EPSG,,
+8334,Tokyo to WGS 84 (72),,GSI-Jpn,4301,4326,72,,8734,1998-12-14 00:00:00,,EPSG,,
+8335,Tokyo to WGS 84 (73),,GSI-Jpn,4301,4326,73,,8735,1998-12-14 00:00:00,,EPSG,,
+8336,Tokyo to WGS 84 (74),,GSI-Jpn,4301,4326,74,,8736,1998-12-14 00:00:00,,EPSG,,
+8337,Tokyo to WGS 84 (75),,GSI-Jpn,4301,4326,75,,8737,1998-12-14 00:00:00,,EPSG,,
+8338,Tokyo to WGS 84 (76),,GSI-Jpn,4301,4326,76,,8738,1998-12-14 00:00:00,,EPSG,,
+8339,Tokyo to WGS 84 (77),,GSI-Jpn,4301,4326,77,,8739,1998-12-14 00:00:00,,EPSG,,
+8340,Tokyo to WGS 84 (78),,GSI-Jpn,4301,4326,78,,8740,1998-12-14 00:00:00,,EPSG,,
+8341,Tokyo to WGS 84 (79),,GSI-Jpn,4301,4326,79,,8741,1998-12-14 00:00:00,,EPSG,,
+8342,Tokyo to WGS 84 (80),,GSI-Jpn,4301,4326,80,,8742,1998-12-14 00:00:00,,EPSG,,
+8343,Tokyo to WGS 84 (81),,GSI-Jpn,4301,4326,81,,8743,1998-12-14 00:00:00,,EPSG,,
+8344,Tokyo to WGS 84 (82),,GSI-Jpn,4301,4326,82,,8744,1998-12-14 00:00:00,,EPSG,,
+8345,Tokyo to WGS 84 (83),,GSI-Jpn,4301,4326,83,,8745,1998-12-14 00:00:00,,EPSG,,
+8346,Tokyo to WGS 84 (84),,GSI-Jpn,4301,4326,84,,8746,1998-12-14 00:00:00,,EPSG,,
+8347,Tokyo to WGS 84 (85),,GSI-Jpn,4301,4326,85,,8747,1998-12-14 00:00:00,,EPSG,,
+8348,Tokyo to WGS 84 (86),,GSI-Jpn,4301,4326,86,,8748,1998-12-14 00:00:00,,EPSG,,
+8349,Tokyo to WGS 84 (87),,GSI-Jpn,4301,4326,87,,8749,1998-12-14 00:00:00,,EPSG,,
+8350,Tokyo to WGS 84 (88),,GSI-Jpn,4301,4326,88,,8750,1998-12-14 00:00:00,,EPSG,,
+8351,Tokyo to WGS 84 (89),,GSI-Jpn,4301,4326,89,,8751,1998-12-14 00:00:00,,EPSG,,
+8352,Tokyo to WGS 84 (90),,GSI-Jpn,4301,4326,90,,8752,1998-12-14 00:00:00,,EPSG,,
+8353,Tokyo to WGS 84 (91),,GSI-Jpn,4301,4326,91,,8753,1998-12-14 00:00:00,,EPSG,,
+8354,Tokyo to WGS 84 (92),,GSI-Jpn,4301,4326,92,,8754,1998-12-14 00:00:00,,EPSG,,
+8355,Tokyo to WGS 84 (93),,GSI-Jpn,4301,4326,93,,8755,1998-12-14 00:00:00,,EPSG,,
+8356,Tokyo to WGS 84 (94),,GSI-Jpn,4301,4326,94,,8756,1998-12-14 00:00:00,,EPSG,,
+8357,Tokyo to WGS 84 (95),,GSI-Jpn,4301,4326,95,,8757,1998-12-14 00:00:00,,EPSG,,
+8358,Tokyo to WGS 84 (96),,GSI-Jpn,4301,4326,96,,8758,1998-12-14 00:00:00,,EPSG,,
+8359,Tokyo to WGS 84 (97),,GSI-Jpn,4301,4326,97,,8759,1998-12-14 00:00:00,,EPSG,,
+8360,Tokyo to WGS 84 (98),,GSI-Jpn,4301,4326,98,,8760,1998-12-14 00:00:00,,EPSG,,
+8361,Tokyo to WGS 84 (99),,GSI-Jpn,4301,4326,99,,8761,1998-12-14 00:00:00,,EPSG,,
+8362,Tokyo to WGS 84 (100),,GSI-Jpn 324132,4301,4326,100,,8762,1998-12-14 00:00:00,,EPSG,,
+8363,Tokyo to WGS 84 (101),,GSI-Jpn 324133,4301,4326,101,,8763,1998-12-14 00:00:00,,EPSG,,
+8364,Tokyo to WGS 84 (102),,GSI-Jpn 324134,4301,4326,102,,8764,1998-12-14 00:00:00,,EPSG,,
+8365,Tokyo to WGS 84 (103),,GSI-Jpn 320130,4301,4326,103,,8765,1998-12-14 00:00:00,,EPSG,,
+8366,Tokyo to WGS 84 (104),,GSI-Jpn 320131,4301,4326,104,,8766,1998-12-14 00:00:00,,EPSG,,
+8367,Tokyo to WGS 84 (105),,GSI-Jpn 320132,4301,4326,105,,8767,1998-12-14 00:00:00,,EPSG,,
+8368,Tokyo to WGS 84 (106),,GSI-Jpn 312130,4301,4326,106,,8768,1998-12-14 00:00:00,,EPSG,,
+8369,Tokyo to WGS 84 (107),,GSI-Jpn 312131,4301,4326,107,,8769,1998-12-14 00:00:00,,EPSG,,
+8370,Fahud to WGS 84 (2),,PDO-Omn,4232,4326,2,,8770,1999-04-22 00:00:00,,EPSG,,
+8371,PSD93 to WGS 84 (1),,PDO-Omn,4134,4326,1,,8771,1999-04-22 00:00:00,,EPSG,,
+8372,ED50 to WGS 84 (19),,HEL-Grc,4230,4326,19,,8772,1999-04-22 00:00:00,,EPSG,,
+8373,Antigua 1943 to WGS 84 (1),,DOS-Atg Ant,4601,4326,1,,8773,1999-04-22 00:00:00,,EPSG,,
+8374,Dominica 1945 to WGS 84 (1),,DOS-Dma,4602,4326,1,,8774,1999-04-22 00:00:00,,EPSG,,
+8375,Grenada 1953 to WGS 84 (1),,DOS-Grd,4603,4326,1,,8775,1999-04-22 00:00:00,,EPSG,,
+8376,Montserrat 1958 to WGS 84 (1),,DOS-Msr,4604,4326,1,,8776,1999-04-22 00:00:00,,EPSG,,
+8377,St. Kitts 1955 to WGS 84 (1),,DOS-Kna,4605,4326,1,,8777,1999-04-22 00:00:00,,EPSG,,
+8378,St. Lucia 1955 to WGS 84 (1),,DOS-Lca,4606,4326,1,,8778,1999-04-22 00:00:00,,EPSG,,
+8379,Anguilla 1957 to WGS 84 (1),,DOS-Aia,4600,4326,1,,8779,1999-04-22 00:00:00,,EPSG,,
+8380,RT90 to ETRF89 (1),,NLS-Swe,4124,4258,1,,8780,1999-04-22 00:00:00,,EPSG,,
+8384,ED50 to WGS 84 (20),,NMA-Nor 6265W,4230,4326,20,,8784,1999-04-22 00:00:00,,EPSG,,
+8385,Old Hawaiian to NAD83 (1),,NGS-Usa Hi,4135,4269,1,,8785,1999-05-24 00:00:00,,EPSG,,
+8386,Old Hawaiian to WGS 84 (1),,EPSG-US Hi,4135,4326,1,United States - Hawaii,8786,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8387,St. Lawrence Island to NAD83 (1),,NGS-Usa AK StL,4136,4269,1,,8787,1999-05-24 00:00:00,,EPSG,,
+8388,St. Lawrence Island to WGS 84 (1),,EPSG-US StL,4136,4326,1,United States - Alaska - St. Lawrence Island.,8788,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8389,St. Paul Island to NAD83 (1),,NGS-Usa AK StP,4137,4269,1,,8789,1999-05-24 00:00:00,,EPSG,,
+8390,St. Paul Island to WGS 84 (1),,EPSG-US StP,4137,4326,1,United States - Alaska - St. Paul Island.,8790,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8391,St. George Island to NAD83 (1),,NGS-Usa AK StG,4138,4269,1,,8791,1999-05-24 00:00:00,,EPSG,,
+8392,St. George Island to WGS 84 (1),,EPSG-USA StG,4138,4326,1,United States - Alaska - St. George Island.,8792,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8393,NAD27(CGQ77) to NAD83 (1),,SGQ-Can QC,4609,4269,1,,8793,1999-05-24 00:00:00,,EPSG,,
+8394,NAD27(CGQ77) to WGS 84 (1),,EPSG-Can Qc,4609,4326,1,Canada - Quebec,8794,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8395,AGD66 to GDA94 (2),,Auslig-ACT 1m,4202,4283,2,,8795,1999-05-24 00:00:00,,EPSG,,
+8396,AGD66 to WGS 84 (3),,EPSG-Aus ACT 1m,4202,4326,3,Australia - ACT.,8796,1999-05-24 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,
+8397,AGD66 to GDA94 (3),,Auslig-Tas 1m,4202,4283,3,,8797,1999-05-24 00:00:00,,EPSG,,
+8398,AGD66 to WGS 84 (4),,EPSG-Aus Tas 1m,4202,4326,4,Australia - Tasmania.,8798,1999-05-24 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,
+8399,AGD66 to GDA94 (4),,Auslig-NSW Vic,4202,4283,4,,8799,1999-05-24 00:00:00,,EPSG,,
+8400,AGD66 to WGS 84 (5),,EPSG-Aus NSW Vic 1m,4202,4326,5,Australia - New South Wales (NSW) and Victoria.,8800,1999-05-24 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,
+8401,Puerto Rico to NAD83 (1),,NGS-PRVI,4139,4269,1,,8801,1999-05-24 00:00:00,,EPSG,,
+8402,Puerto Rico to WGS 84 (1),,EPSG-PRVI,4139,4326,1,Puerto Rico; Virgin Islands (U.S.); Virgin Islands (British).,8802,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8403,NAD27 to NAD83 (5),,SGQ-Can QC,4267,4269,5,,8803,1999-05-24 00:00:00,,EPSG,,
+8404,NAD27 to WGS 84 (27),,EPSG-Can QC,4267,4326,27,Canada - Quebec,8804,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8405,NAD27(76) to NAD83 (1),,SGQ-Can Ont,4608,4269,1,,8805,1999-05-24 00:00:00,,EPSG,,
+8406,NAD27(76) to WGS 84 (1),,EPSG-Can On,4608,4326,1,Canada - Ontario,8806,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8407,AGD66 to GDA94 (5),,OSG-Aus Vic,4202,4283,5,,8807,1999-05-24 00:00:00,,EPSG,,
+8408,AGD66 to WGS 84 (6),,EPSG-Aus Vic 0.1m,4202,4326,6,Australia - Victoria,8808,1999-05-24 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,
+8411,NGO 1948 (Oslo) to NGO 1948 (1),,NGO-Nor,4817,4273,1,,8811,1999-10-20 00:00:00,,EPSG,,
+8412,NTF (Paris) to NTF (2),,RGS,4807,4275,2,,8812,1999-10-20 00:00:00,,EPSG,,
+8413,Locodjo 1965 to WGS 84 (1),,IGN-Civ,4142,4326,1,,8813,1999-10-20 00:00:00,,EPSG,,
+8414,Abidjan 1987 to WGS 84 (1),,IGN-Civ,4143,4326,1,,8814,1999-10-20 00:00:00,,EPSG,,
+8415,MGI to WGS 84 (2),,BEV-Aut,4312,4326,1,,8815,1999-10-20 00:00:00,,EPSG,,
+8416,ATS 77 to NAD83(CSRS98) (1),,GIC-Can NB,4122,4140,1,,8816,1999-10-20 00:00:00,,EPSG,,
+8417,NAD83(CSRS98) to WGS 84 (1),,EPSG-Can,4140,4326,1,,8817,1999-10-20 00:00:00,,EPSG,,
+8418,ATS 77 to WGS 84 (1),,EPSG-Can NB,4122,4326,1,Canada - New Brunswick,8818,1999-10-20 00:00:00,EPSG,EPSG,For many purposes NAD83(CSRS) can be assumed to be coincident with WGS 84.,
+8419,NAD83 to NAD83(HARN) (1),,NGS-Usa AL,4269,4152,1,,8819,1999-10-20 00:00:00,,EPSG,,
+8420,NAD83 to NAD83(HARN) (2),,NGS-Usa AZ,4269,4152,2,,8820,1999-10-20 00:00:00,,EPSG,,
+8421,NAD83 to NAD83(HARN) (3),,NGS-Usa CA n,4269,4152,3,,8821,1999-10-20 00:00:00,,EPSG,,
+8422,NAD83 to NAD83(HARN) (4),,NGS-Usa CA s,4269,4152,4,,8822,1999-10-20 00:00:00,,EPSG,,
+8423,NAD83 to NAD83(HARN) (5),,NGS-Usa CO,4269,4152,5,,8823,1999-10-20 00:00:00,,EPSG,,
+8424,NAD83 to NAD83(HARN) (6),,NGS-Usa GA,4269,4152,6,,8824,1999-10-20 00:00:00,,EPSG,,
+8425,NAD83 to NAD83(HARN) (7),,NGS-Usa FL,4269,4152,7,,8825,1999-10-20 00:00:00,,EPSG,,
+8426,NAD83 to NAD83(HARN) (8),,NGS-Usa ID MT e,4269,4152,8,,8826,1999-10-20 00:00:00,,EPSG,,
+8427,NAD83 to NAD83(HARN) (9),,NGS-Usa ID MT w,4269,4152,9,,8827,1999-10-20 00:00:00,,EPSG,,
+8428,NAD83 to NAD83(HARN) (10),,NGS-Usa KY,4269,4152,10,,8828,1999-10-20 00:00:00,,EPSG,,
+8429,NAD83 to NAD83(HARN) (11),,NGS-Usa LA,4269,4152,11,,8829,1999-10-20 00:00:00,,EPSG,,
+8430,NAD83 to NAD83(HARN) (12),,NGS-Usa DE MD,4269,4152,12,,8830,1999-10-20 00:00:00,,EPSG,,
+8431,NAD83 to NAD83(HARN) (13),,NGS-Usa ME,4269,4152,13,,8831,1999-10-20 00:00:00,,EPSG,,
+8432,NAD83 to NAD83(HARN) (14),,NGS-Usa MI,4269,4152,14,,8832,1999-10-20 00:00:00,,EPSG,,
+8433,NAD83 to NAD83(HARN) (15),,NGS-Usa MS,4269,4152,15,,8833,1999-10-20 00:00:00,,EPSG,,
+8434,NAD83 to NAD83(HARN) (16),,NGS-Usa NE,4269,4152,16,,8834,1999-10-20 00:00:00,,EPSG,,
+8435,NAD83 to NAD83(HARN) (17),,NGS-US NewEng,4269,4152,17,,8835,1999-10-20 00:00:00,,EPSG,,
+8436,NAD83 to NAD83(HARN) (18),,NGS-Usa NM,4269,4152,18,,8836,1999-10-20 00:00:00,,EPSG,,
+8437,NAD83 to NAD83(HARN) (19),,NGS-Usa NY,4269,4152,19,,8837,1999-10-20 00:00:00,,EPSG,,
+8438,NAD83 to NAD83(HARN) (20),,NGS-Usa ND,4269,4152,20,,8838,1999-10-20 00:00:00,,EPSG,,
+8439,NAD83 to NAD83(HARN) (21),,NGS-Usa OK,4269,4152,21,,8839,1999-10-20 00:00:00,,EPSG,,
+8440,NAD83 to NAD83(HARN) (22),,NGS-PRVI,4269,4152,22,,8840,1999-10-20 00:00:00,,EPSG,,
+8441,NAD83 to NAD83(HARN) (23),,NGS-Usa SD,4269,4152,23,,8841,1999-10-20 00:00:00,,EPSG,,
+8442,NAD83 to NAD83(HARN) (24),,NGS-Usa TN,4269,4152,24,,8842,1999-10-20 00:00:00,,EPSG,,
+8443,NAD83 to NAD83(HARN) (25),,NGS-Usa TX e,4269,4152,25,,8843,1999-10-20 00:00:00,,EPSG,,
+8444,NAD83 to NAD83(HARN) (26),,NGS-Usa TX w,4269,4152,26,,8844,1999-10-20 00:00:00,,EPSG,,
+8445,NAD83 to NAD83(HARN) (27),,NGS-Usa VA,4269,4152,27,,8845,1999-10-20 00:00:00,,EPSG,,
+8446,NAD83 to NAD83(HARN) (28),,NGS-Usa OR WA,4269,4152,28,,8846,1999-10-20 00:00:00,,EPSG,,
+8447,NAD83 to NAD83(HARN) (29),,NGS-Usa WI,4269,4152,29,,8847,1999-10-20 00:00:00,,EPSG,,
+8448,NAD83 to NAD83(HARN) (30),,NGS-Usa WY,4269,4152,30,,8848,1999-10-20 00:00:00,,EPSG,,
+8449,Cape to Hartbeesthoek94 (1),,DSM-Zaf,4222,4148,1,,8849,1999-10-20 00:00:00,,EPSG,,
+8450,Hartbeesthoek94 to WGS 84 (1),,EPSG-Zaf,4148,4326,1,,8850,1999-10-20 00:00:00,,EPSG,For many purposes Hartbeesthoek94 can be assumed to be coincident with WGS 84.,
+8451,AGD66 to GDA94 (6),,Auslig-Tas,4202,4283,6,,8851,1999-10-20 00:00:00,,EPSG,,
+8452,AGD66 to GDA94 (7),,Auslig-NT,4202,4283,7,,8852,1999-10-20 00:00:00,,EPSG,,
+8453,AGD66 to WGS 84 (7),,EPSG-Aus Tas 0.1m,4202,4326,7,Australia - Tasmania.,8853,1999-10-20 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,
+8454,AGD66 to WGS 84 (8),,EPSG-Aus NT 0.1m,4202,4326,8,Australia - Northern Territory.,8854,1999-10-20 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,
+8455,CH1903 to WGS 84 (1),,BfL-CH 1,4149,4326,1,,8855,1999-10-20 00:00:00,,EPSG,,
+8456,CH1903+ to CHTRF95 (1),,BfL-CH,4150,4151,1,,8856,1999-10-20 00:00:00,,EPSG,,
+8457,CH1903+ to WGS 84 (1),,EPSG-CH,4150,4326,1,Liechtenstein; Switzerland.,8857,1999-10-20 00:00:00,EPSG,EPSG,For many purposes CHTRF95 can be assumed to be coincident with WGS 84.,
+8458,CH1903 to WGS 84 (2),,BfL-CH 2,4149,4326,2,,8858,1999-10-20 00:00:00,,EPSG,,
+8459,CHTRF95 to WGS 84 (1),,EPSG-CH,4151,4326,1,,8859,1999-10-20 00:00:00,,EPSG,,
+8460,NAD27 to NAD83(HARN) (1),,NGS-Usa AL,4267,4152,1,United States (USA) - Alabama.,8860,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8461,NAD27 to NAD83(HARN) (2),,NGS-Usa AZ,4267,4152,2,United States (USA) - Arizona.,8861,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8462,NAD27 to NAD83(HARN) (3),,NGS-Usa CA n,4267,4152,3,United States (USA) - California north of 38 deg N.,8862,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8463,NAD27 to NAD83(HARN) (4),,NGS-Usa CA s,4267,4152,4,United States (USA) - California south of 38 deg N.,8863,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8464,NAD27 to NAD83(HARN) (5),,NGS-Usa CO,4267,4152,5,United States (USA) - Colorado.,8864,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8465,NAD27 to NAD83(HARN) (6),,NGS-Usa GA,4267,4152,6,United States (USA) - Georgia.,8865,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8466,NAD27 to NAD83(HARN) (7),,NGS-Usa FL,4267,4152,7,United States (USA) - Florida.,8866,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8467,NAD27 to NAD83(HARN) (8),,NGS-Usa ID MT e,4267,4152,8,United States (USA) - Idaho and Montana - east of 113 deg W.,8867,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8468,NAD27 to NAD83(HARN) (9),,NGS-Usa ID MT w,4267,4152,9,United States (USA) - Idaho and Montana - west of 113 deg W.,8868,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8469,NAD27 to NAD83(HARN) (10),,NGS-Usa KY,4267,4152,10,United States (USA) - Kentucky.,8869,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8470,NAD27 to NAD83(HARN) (11),,NGS-Usa LA,4267,4152,11,United States (USA) - Louisiana.,8870,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8471,NAD27 to NAD83(HARN) (12),,NGS-Usa DE MD,4267,4152,12,United States (USA) - Delaware and Maryland.,8871,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8472,NAD27 to NAD83(HARN) (13),,NGS-Usa ME,4267,4152,13,United States (USA) - Maine.,8872,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8473,NAD27 to NAD83(HARN) (14),,NGS-Usa MI,4267,4152,14,United States (USA) - Michigan.,8873,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8474,NAD27 to NAD83(HARN) (15),,NGS-Usa MS,4267,4152,15,United States (USA) - Mississippi.,8874,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8475,NAD27 to NAD83(HARN) (16),,NGS-Usa NE,4267,4152,16,United States (USA) - Nebraska.,8875,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8476,NAD27 to NAD83(HARN) (17),,NGS-US NewEng,4267,4152,18,United States (USA) - Connecticut; Massachusetts; New Hampshire; Rhode Island; Vermont.,8876,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8477,NAD27 to NAD83(HARN) (18),,NGS-Usa NM,4267,4152,18,United States (USA) - New Mexico.,8877,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8478,NAD27 to NAD83(HARN) (19),,NGS-Usa NY,4267,4152,19,United States (USA) - New York.,8878,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8479,NAD27 to NAD83(HARN) (20),,NGS-Usa ND,4267,4152,20,United States (USA) - North Dakota.,8879,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8480,NAD27 to NAD83(HARN) (21),,NGS-Usa OK,4267,4152,21,United States (USA) - Oklahoma.,8880,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8481,Puerto Rico to NAD83(HARN) (1),,NGS-PRVI,4139,4152,1,United States (USA) - Puerto Rico and the Virgin Islands.,8881,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8482,NAD27 to NAD83(HARN) (22),,NGS-Usa SD,4267,4152,22,United States (USA) - South Dakota.,8882,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8483,NAD27 to NAD83(HARN) (23),,NGS-Usa TN,4267,4152,23,United States (USA) - Tennessee,8883,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8484,NAD27 to NAD83(HARN) (24),,NGS-Usa TX e,4267,4152,24,United States (USA) - Texas east of 100deg West.,8884,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8485,NAD27 to NAD83(HARN) (25),,NGS-Usa TX w,4267,4152,25,United States (USA) - Texas west of 100deg West.,8885,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8486,NAD27 to NAD83(HARN) (26),,NGS-Usa VA,4267,4152,26,United States (USA) - Virginia.,8886,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8487,NAD27 to NAD83(HARN) (27),,NGS-Usa OR WA,4267,4152,27,United States (USA) - Oregan; Washington.,8887,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8488,NAD27 to NAD83(HARN) (28),,NGS-Usa WI,4267,4152,28,United States (USA) - Wisconsin.,8888,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8489,NAD27 to NAD83(HARN) (29),,NGS-Usa WY,4267,4152,29,United States (USA) - Wyoming.,8889,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,,
+8490,Rassadiran to WGS 84 (1),,TOT-Taheri,4153,4326,1,Iran - Taheri refinery site.,8890,1999-10-20 00:00:00,Total-Fina,EPSG,,
+8491,FD58 to WGS 84 (1),,TOT-Kangan,4132,4326,1,Iran - Kangan district,8891,1999-10-20 00:00:00,Total-Fina,EPSG,,
+8492,ED50(ED77) to WGS 84 (1),,NCCI-Irn,4154,4326,1,Iran,8892,1999-10-20 00:00:00,National Cartographic Centre of Iran,EPSG,,
+8493,NAD83 to WGS 84 (4),,NGS-Usa,4269,4326,4,United States (USA).,8893,1999-11-05 00:00:00,,EPSG,,
+8494,NAD83 to WGS 84 (5),,NGS-Usa,4269,4326,5,United States (USA).,8894,1999-11-05 00:00:00,,EPSG,,
+8495,La Canoa to WGS 84 (1),,LAG-Ven E,4247,4326,1,,8895,1999-11-05 00:00:00,,EPSG,,
+8496,NAD27 to WGS 84 (28),,NGS-Usa conus,4267,4326,28,United States (USA) - lower 48 states including EEZ.,8896,1999-10-20 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8497,NAD27 to WGS 84 (29),,NGS-Usa AK,4267,4326,29,United States (USA) - Alaska including EEZ.,8897,1999-10-20 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
diff --git a/src/tiff/csv/horiz_cs.c b/src/tiff/csv/horiz_cs.c
new file mode 100644
index 0000000..4096f60
--- /dev/null
+++ b/src/tiff/csv/horiz_cs.c
@@ -0,0 +1,1496 @@
+#include "defs.h"
+datafile_rows_t horiz_cs_row_1[] = {"HORIZCS_CODE","HORIZCS_EPSG_NAME","HORIZCS_EPSG_ABBR","HORIZCS_USER_NAME","DESCRIPTION","AREA_OF_USE","COORD_SYS_TYPE","GEOD_DATUM_CODE","PRIME_MERIDIAN_CODE","ORIENT_POSITIVE_AXIS_1","ORIENT_POSITIVE_AXIS_2","COORD_SYS_AXIS_1_ABBR","COORD_SYS_AXIS_2_ABBR","UOM_LENGTH_CODE","UOM_ANGLE_CODE","SOURCE_GEOGCS_CODE","PROJECTION_TRF_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t horiz_cs_row_2[] = {"200","Anguilla 1957 / British West Indies Grid","Anguilla 1957 / BWI Grid","","","Anguilla","projected 2D","","","East","North","E","N","9001","","4600","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_3[] = {"201","Antigua 1943 / British West Indies Grid","Antigua 1943 / BWI Grid","","","Antigua and Barbuda - Antigua","projected 2D","","","East","North","E","N","9001","","4601","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_4[] = {"202","Dominica 1945 / British West Indies Grid","Dominica 1945 / BWI Grid","","","Dominica","projected 2D","","","East","North","E","N","9001","","4602","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_5[] = {"203","Grenada 1953 / British West Indies Grid","Grenada 1953 / BWI Grid","","","Grenada (including Grenada Grenadines)","projected 2D","","","East","North","E","N","9001","","4603","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_6[] = {"204","Montserrat 58 / British West Indies Grid","Montserrat 58 / BWI Grid","","","Montserrat","projected 2D","","","East","North","E","N","9001","","4604","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_7[] = {"205","St Kitts 1955 / British West Indies Grid","St Kitts 1955 / BWI Grid","","","Saint Kitts and Nevis","projected 2D","","","East","North","E","N","9001","","4605","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_8[] = {"206","St Lucia 1955 / British West Indies Grid","St Lucia 1955 / BWI Grid","","","Saint Lucia","projected 2D","","","East","North","E","N","9001","","4606","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_9[] = {"207","St Vincent 45 / British West Indies Grid","St Vincent 45 / BWI Grid","","","Saint Vincent and the Grenadines","projected 2D","","","East","North","E","N","9001","","4607","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_10[] = {"208","NAD27(CGQ77) / SCoPQ zone 2","CGQ77 / SCoPQ zone 2","","","Canada - Quebec - east of 57 deg East.","projected 2D","","","East","North","X","Y","9001","","4609","17700","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_11[] = {"209","NAD27(CGQ77) / SCoPQ zone 3","CGQ77 / SCoPQ zone 3","","","Canada - Quebec between 60 deg and 57 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17703","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_12[] = {"210","NAD27(CGQ77) / SCoPQ zone 4","CGQ77 / SCoPQ zone 4","","","Canada - Quebec between 63 deg and 60 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17704","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_13[] = {"211","NAD27(CGQ77) / SCoPQ zone 5","CGQ77 / SCoPQ zone 5","","","Canada - Quebec between 66 deg and 63 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17705","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_14[] = {"212","NAD27(CGQ77) / SCoPQ zone 6","CGQ77 / SCoPQ zone 6","","","Canada - Quebec between 69 deg and 66 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17706","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_15[] = {"213","NAD27(CGQ77) / SCoPQ zone 7","CGQ77 / SCoPQ zone 7","","","Canada - Quebec between 72 deg and 69 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17707","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_16[] = {"214","NAD27(CGQ77) / SCoPQ zone 8","CGQ77 / SCoPQ zone 8","","","Canada - Quebec between 75 deg and 72 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17708","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_17[] = {"215","NAD27(CGQ77) / SCoPQ zone 9","CGQ77 / SCoPQ zone 9","","","Canada - Quebec between 78 deg and 75 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17709","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_18[] = {"216","NAD27(CGQ77) / SCoPQ zone 10","CGQ77 / SCoPQ zone 10","","","Canada - Quebec west of 78 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17710","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_19[] = {"217","NAD27(76) / MTM zone 8","","","","Canada - Ontario - east of 75 deg West.","projected 2D","","","East","North","X","Y","9001","","4608","17708","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_20[] = {"218","NAD27(76) / MTM zone 9","","","","Canada - Ontario - between 78 deg and 75 deg West.","projected 2D","","","East","North","X","Y","9001","","4608","17709","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_21[] = {"219","NAD27(76) / MTM zone 10","","","","Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.","projected 2D","","","East","North","X","Y","9001","","4608","17710","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_22[] = {"220","NAD27(76) / MTM zone 11","","","","Canada - Ontario - south of 46 deg N and west of 81 deg West.","projected 2D","","","East","North","E","N","9001","","4608","17711","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_23[] = {"221","NAD27(76) / MTM zone 12","","","","Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.","projected 2D","","","East","North","E","N","9001","","4608","17712","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_24[] = {"222","NAD27(76) / MTM zone 13","","","","Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.","projected 2D","","","East","North","E","N","9001","","4608","17713","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_25[] = {"223","NAD27(76) / MTM zone 14","","","","Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4608","17714","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_26[] = {"224","NAD27(76) / MTM zone 15","","","","Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4608","17715","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_27[] = {"225","NAD27(76) / MTM zone 16","","","","Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4608","17716","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_28[] = {"226","NAD27(76) / MTM zone 17","","","","Canada - Ontario - west of 94 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4608","17717","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_29[] = {"227","NAD27(76) / UTM zone 15N","","","","Canada - Ontario - 96deg West to 90deg West.","projected 2D","","","East","North","E","N","9001","","4608","16015","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 15N (code 26715).","",NULL};
+datafile_rows_t horiz_cs_row_30[] = {"228","NAD27(76) / UTM zone 16N","","","","Canada - Ontario - 90deg West to 84deg West.","projected 2D","","","East","North","E","N","9001","","4608","16016","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 16N (code 26716).","",NULL};
+datafile_rows_t horiz_cs_row_31[] = {"229","NAD27(76) / UTM zone 17N","","","","Canada - Ontario - 84deg West to 78deg West.","projected 2D","","","East","North","E","N","9001","","4608","16017","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 17N (code 26717).","",NULL};
+datafile_rows_t horiz_cs_row_32[] = {"230","NAD27(76) / UTM zone 18N","","","","Canada - Ontario - east of 78 deg West.","projected 2D","","","East","North","E","N","9001","","4608","16018","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 18N (code 26718).","",NULL};
+datafile_rows_t horiz_cs_row_33[] = {"231","NAD27(CGQ77) / UTM zone 17N","CGQ77 / UTM zone 17N","","","Canada - Quebec - west of 78 deg West.","projected 2D","","","East","North","E","N","9001","","4609","16017","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 17N (code 26717).","",NULL};
+datafile_rows_t horiz_cs_row_34[] = {"232","NAD27(CGQ77) / UTM zone 18N","CGQ77 / UTM zone 18N","","","Canada - Quebec -78deg West to 72deg West.","projected 2D","","","East","North","E","N","9001","","4609","16018","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 18N (code 26718).","",NULL};
+datafile_rows_t horiz_cs_row_35[] = {"233","NAD27(CGQ77) / UTM zone 19N","CGQ77 / UTM zone 19N","","","Canada - Quebec - 72deg West to 66deg West.","projected 2D","","","East","North","E","N","9001","","4609","16019","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 19N (code 26719).","",NULL};
+datafile_rows_t horiz_cs_row_36[] = {"234","NAD27(CGQ77) / UTM zone 20N","CGQ77 / UTM zone 20N","","","Canada - Quebec - 66deg West to 60deg West.","projected 2D","","","East","North","E","N","9001","","4609","16020","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 20N (code 26720).","",NULL};
+datafile_rows_t horiz_cs_row_37[] = {"235","NAD27(CGQ77) / UTM zone 21N","CGQ77 / UTM zone 21N","","","Canada - Quebec - east of 60deg West.","projected 2D","","","East","North","E","N","9001","","4609","16021","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 21N (code 26721).","",NULL};
+datafile_rows_t horiz_cs_row_38[] = {"236","NAD83(CSRS98) / New Brunswick Stereo","NAD83(98) / NB Stereo","","","Canada - New Brunswick","projected 2D","","","North","East","N","E","9001","","4140","19946","1999-10-20 00:00:00","Service New Brunswick Land and Information Standards Manual","EPSG","In use from 1999.","",NULL};
+datafile_rows_t horiz_cs_row_39[] = {"237","NAD83(CSRS98) / UTM zone 19N","NAD83(98) / UTM 19N","","","Canada - New Brunswick west of 66 deg West.","projected 2D","","","East","North","E","N","9001","","4140","16019","1999-10-20 00:00:00","Service New Brunswick Land and Information Standards Manual","EPSG","In use from 1999.","",NULL};
+datafile_rows_t horiz_cs_row_40[] = {"238","NAD83(CSRS98) / UTM zone 20N","NAD83(98) / UTM 20N","","","Canada - New Brunswick east of 66 deg West.","projected 2D","","","East","North","E","N","9001","","4140","16020","1999-10-20 00:00:00","Service New Brunswick Land and Information Standards Manual","EPSG","In use from 1999.","",NULL};
+datafile_rows_t horiz_cs_row_41[] = {"239","Israel / Israeli TM Grid","Israeli TM Grid","","","Israel.","projected 2D","","","East","North","E","N","9001","","4141","18204","1999-10-20 00:00:00","Survey of Israel.","EPSG","Supercedes Israeli CS Grid (EPSG code 28193).","",NULL};
+datafile_rows_t horiz_cs_row_42[] = {"240","Locodjo 1965 / UTM zone 30N","Locodjo 65 / UTM 30N","","","Cote D'Ivoire (Ivory Coast) east of 6 deg West.","projected 2D","","","East","North","E","N","9001","","4142","16030","1999-10-20 00:00:00","IGN Paris","EPSG","Superseded by Abidjan 87 / UTM 30N (EPSG code 241).","",NULL};
+datafile_rows_t horiz_cs_row_43[] = {"241","Abidjan 1987 / UTM zone 30N","Abidjan 87 / UTM 30N","","","Cote D'Ivoire (Ivory Coast) east of 6 deg West.","projected 2D","","","East","North","E","N","9001","","4143","16030","1999-10-20 00:00:00","IGN Paris","EPSG","Supersedes Locodjo 65 / UTM 30N (EPSG code 240).","",NULL};
+datafile_rows_t horiz_cs_row_44[] = {"242","Locodjo 1965 / UTM zone 29N","Locodjo 65 / UTM 29N","","","Cote D'Ivoire (Ivory Coast) west of 6 deg West.","projected 2D","","","East","North","E","N","9001","","4142","16029","1999-10-20 00:00:00","IGN Paris","EPSG","Superseded by Abidjan 87 / UTM 29N (EPSG code 243).","",NULL};
+datafile_rows_t horiz_cs_row_45[] = {"243","Abidjan 1987 / UTM zone 29N","Abidjan 87 / UTM 29N","","","Cote D'Ivoire (Ivory Coast) west of 6 deg West.","projected 2D","","","East","North","E","N","9001","","4143","16029","1999-10-20 00:00:00","IGN Paris","EPSG","Supersedes Locodjo 65 / UTM 29N (EPSG code 242).","",NULL};
+datafile_rows_t horiz_cs_row_46[] = {"244","Hanoi 1972 / Gauss-Kruger zone 18","Hanoi 72 / Gauss zone 18","","","Vietnam - west of 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4147","16218","1999-10-20 00:00:00","","EPSG","Replaces use of Indian 1960 / UTM zone 48 after 1988.","",NULL};
+datafile_rows_t horiz_cs_row_47[] = {"245","Hanoi 1972 / Gauss-Kruger zone 19","Hanoi 72 / Gauss zone 19","","","Vietnam - east of 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4147","16219","1999-10-20 00:00:00","","EPSG","Replaces use of Indian 1960 / UTM zone 48 after 1988.","",NULL};
+datafile_rows_t horiz_cs_row_48[] = {"246","Hartbeesthoek94 / Lo15","New S African CS zone 15","","","South Africa - Walvis Bay.","projected 2D","","","West","South","W","S","9001","","4148","17515","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_49[] = {"247","Hartbeesthoek94 / Lo17","New S African CS zone 17","","","South Africa - west of 18 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17517","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_50[] = {"248","Hartbeesthoek94 / Lo19","New S African CS zone 19","","","South Africa - 18 to 20 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17519","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_51[] = {"249","Hartbeesthoek94 / Lo21","New S African CS zone 21","","","South Africa - 20 to 22 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17521","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_52[] = {"250","Hartbeesthoek94 / Lo23","New S African CS zone 23","","","South Africa - 22 to 24 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17523","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_53[] = {"251","Hartbeesthoek94 / Lo25","New S African CS zone 25","","","Lestho - west of 26 deg East; South Africa - 24 to 26 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17525","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_54[] = {"252","Hartbeesthoek94 / Lo27","New S African CS zone 27","","","Lestho - east of 26 deg East; South Africa - 26 to 28 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17527","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_55[] = {"253","Hartbeesthoek94 / Lo29","New S African CS zone 29","","","South Africa - 28 to 30 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17529","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_56[] = {"254","Hartbeesthoek94 / Lo31","New S African CS zone 31","","","South Africa - 30 to 32 deg East; Swaziland.","projected 2D","","","West","South","W","S","9001","","4148","17533","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_57[] = {"255","Hartbeesthoek94 / Lo33","New S African CS zone 33","","","South Africa - east of 32 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17533","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_58[] = {"256","CH1903+ / LV95","LV95","","","Liechtenstein; Switzerland.","projected 2D","","","East","North","Y","X","9001","","4150","19950","1999-10-20 00:00:00","","EPSG","Supersedes CH1903/LV03 (code 21781).","",NULL};
+datafile_rows_t horiz_cs_row_59[] = {"257","Rassadiran / Nakhl e Taqi","","","","Iran - Taheri refinery site only.","projected 2D","","","East","North","E","N","9001","","4153","19951","1999-10-20 00:00:00","Total-Fina","EPSG","Used for terminal site only.","",NULL};
+datafile_rows_t horiz_cs_row_60[] = {"258","ED50(ED77) / UTM zone 38N","","","","Iran - west of 48deg East.","projected 2D","","","East","North","E","N","9001","","4154","16038","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_61[] = {"259","ED50(ED77) / UTM zone 39N","","","","Iran - 48deg to 54 deg East.","projected 2D","","","East","North","E","N","9001","","4154","16039","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_62[] = {"260","ED50(ED77) / UTM zone 40N","","","","Iran - 54deg to 60 deg East.","projected 2D","","","East","North","E","N","9001","","4154","16040","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_63[] = {"261","ED50(ED77) / UTM zone 41N","","","","Iran - east of 60deg East.","projected 2D","","","East","North","E","N","9001","","4154","16041","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_64[] = {"300","Madrid 1870 (Madrid) / Spain","","","","Spain","projected 2D","","","East","North","X","Y","9001","","4903","19921","1998-11-11 00:00:00","","EPSG","Superseded by ED50 / UTM after 1966.","",NULL};
+datafile_rows_t horiz_cs_row_65[] = {"2100","GGRS87 / Greek Grid","","","","Greece","projected 2D","","","East","North","E","N","9001","","4121","19930","1997-06-16 00:00:00","Geodesy Department; Public Petroleum Corporation of Greece.","EPSG","Oil industry uses ED50 / UTM zone 34N and ED50 / UTM zone 35N.","",NULL};
+datafile_rows_t horiz_cs_row_66[] = {"2200","ATS77 / New Brunswick Stereographic","ATS77 / NB Stereographic","","","Canada - New Brunswick","projected 2D","","","North","East","N","E","9001","","4122","19945","1999-10-20 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1979. To be phased out in late 1990's.","99.61",NULL};
+datafile_rows_t horiz_cs_row_67[] = {"2219","ATS77 / UTM zone 19N","","","","Canada - New Brunswick - west of 66 deg W.","projected 2D","","","East","North","E","N","9001","","4122","16019","1997-07-22 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1979. To be phased out in late 1990's.","",NULL};
+datafile_rows_t horiz_cs_row_68[] = {"2220","ATS77 / UTM zone 20N","","","","Canada - New Brunswick - east of 66 deg W.; Canada - Nova Scotia; Canada - Prince Edward Island.","projected 2D","","","East","North","E","N","9001","","4122","16020","1997-07-22 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1979. To be phased out in late 1990's.","",NULL};
+datafile_rows_t horiz_cs_row_69[] = {"2290","ATS77 / Prince Edward Isl. Stereographic","ATS77 / PEI Stereo","","","Canada - Prince Edward Island","projected 2D","","","East","North","E(X)","N(Y)","9001","","4122","19933","1997-11-13 00:00:00","Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.","EPSG","In use from 1979. To be phased out in late 1990's.","",NULL};
+datafile_rows_t horiz_cs_row_70[] = {"2294","ATS77 / MTM Nova Scotia zone 4","ATS77 / MTM NS zone 4","","","Canada - Nova Scotia - east of 63 deg West.","projected 2D","","","East","North","E","N","9001","","4122","17794","1997-11-13 00:00:00","Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.","EPSG","In use from 1979. To be phased out in late 1990's.","",NULL};
+datafile_rows_t horiz_cs_row_71[] = {"2295","ATS77 / MTM Nova Scotia zone 5","ATS77 / MTM NS zone 5","","","Canada - Nova Scotia - west of 63 deg West.","projected 2D","","","East","North","E","N","9001","","4122","17795","1997-11-13 00:00:00","Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.","EPSG","In use from 1979. To be phased out in late 1990's.","",NULL};
+datafile_rows_t horiz_cs_row_72[] = {"2391","KKJ / Finland zone 1","","","","Finland - west of 22deg 30min E.","projected 2D","","","North","East","X","Y","9001","","4123","18191","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_73[] = {"2392","KKJ / Finland zone 2","","","","Finland - 22deg 30 min to 25deg 30min E.","projected 2D","","","North","East","X","Y","9001","","4123","18192","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_74[] = {"2393","KKJ / Finland Uniform Coordinate System","KKJ / Finland zone 3","","","Finland; Finland - 25 deg 30min E to 28deg 30min E.","projected 2D","","","North","East","X","Y","9001","","4123","18193","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","Known as Uniform Coordinate System when used over all country and also as Basic Coordinate System zone 3 at larger scales.","",NULL};
+datafile_rows_t horiz_cs_row_75[] = {"2394","KKJ / Finland zone 4","","","","Finland - east of 28deg 30 min E.","projected 2D","","","North","East","X","Y","9001","","4123","18194","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_76[] = {"2400","RT90 2.5 gon W","","","","Sweden","projected 2D","","","North","East","X","Y","9001","","4124","19929","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_77[] = {"2550","Samboja / UTM zone 50S","","","","Indonesia - east Kalimantan - Mahakam delta area.","projected 2D","","","East","North","E","N","9001","","4125","16150","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_78[] = {"2600","Lietuvos Koordinoei Sistema 1994","LKS94","","","Lithuania","projected 2D","","","North","East","X","Y","9001","","4126","19934","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_79[] = {"2736","Tete / UTM zone 36S","","","","Mozambique - west of 36 deg E.","projected 2D","","","East","North","E","N","9001","","4127","16136","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_80[] = {"2737","Tete / UTM zone 37S","","","","Mozambique - east of 36 deg E","projected 2D","","","East","North","E","N","9001","","4127","16137","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_81[] = {"3036","Moznet / UTM zone 36S","","","","Mozambique - west of 36 deg E.","projected 2D","","","East","North","E","N","9001","","4130","16136","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_82[] = {"3037","Moznet / UTM zone 37S","","","","Mozambique - east of 36 deg E","projected 2D","","","East","North","E","N","9001","","4130","16137","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_83[] = {"3148","Indian 1960 / UTM zone 48N","","","","Cambodia; Vietnam west of 108deg East.","projected 2D","","","East","North","E","N","9001","","4131","16048","1998-11-11 00:00:00","","EPSG","In Vietnam superseded by Hanoi 72 / Gauss zone 18 from 1988 onwards.","",NULL};
+datafile_rows_t horiz_cs_row_84[] = {"3149","Indian 1960 / UTM zone 49N","","","","Vietnam east of 108deg East.","projected 2D","","","East","North","E","N","9001","","4131","16049","1998-11-11 00:00:00","","EPSG","Superseded by Hanoi 72 / Gauss zone 18 from 1988 onwards.","",NULL};
+datafile_rows_t horiz_cs_row_85[] = {"3176","Indian 1960 / TM 106 NE","","","","Vietnam - offshore.","projected 2D","","","East","North","E","N","9001","","4131","16506","1998-11-11 00:00:00","Petrovietnam","EPSG","Used by Petrovietnam for offshore block 15.","",NULL};
+datafile_rows_t horiz_cs_row_86[] = {"3200","FD58 / Iraq zone","","","","Iran - Gulf coast and Arwaz areas.","projected 2D","","","East","North","E","N","9001","","4132","19906","1998-11-11 00:00:00","IOEPC records.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_87[] = {"3300","Estonian Coordinate System of 1992","","","","Estonia.","projected 2D","","","North","East","X","Y","9001","","4133","19938","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","Used for 1:20000 and larger scale mapping.","",NULL};
+datafile_rows_t horiz_cs_row_88[] = {"3439","PSD93 / UTM zone 39N","","","","Oman - west of 54 deg East.","projected 2D","","","East","North","E","N","9001","","4134","16039","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Supersedes Fahud / UTM zone 39N projCS (code 23239). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t horiz_cs_row_89[] = {"3440","PSD93 / UTM zone 40N","","","","Oman - east of 54 deg East.","projected 2D","","","East","North","E","N","9001","","4134","16040","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Supersedes Fahud / UTM zone 40N projCS (code 23240). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t horiz_cs_row_90[] = {"3561","Old Hawaiian / Hawaii zone 1","Old Hawaiian / SP zone 1","","","United States (USA) - Hawaii - island of Hawaii.","projected 2D","","","East","North","X","Y","9003","","4135","15101","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / Hawaii zone 1.","99.322",NULL};
+datafile_rows_t horiz_cs_row_91[] = {"3562","Old Hawaiian / Hawaii zone 2","Old Hawaiian / SP zone 2","","","United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.","projected 2D","","","East","North","X","Y","9003","","4135","15102","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / Hawaii zone 2.","99.322",NULL};
+datafile_rows_t horiz_cs_row_92[] = {"3563","Old Hawaiian / Hawaii zone 3","Old Hawaiian / SP zone 3","","","United States (USA) - Hawaii - Oahu.","projected 2D","","","East","North","X","Y","9003","","4135","15103","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / Hawaii zone 3.","99.322",NULL};
+datafile_rows_t horiz_cs_row_93[] = {"3564","Old Hawaiian / Hawaii zone 4","Old Hawaiian / SP zone 4","","","United States (USA) - Hawaii - Kauai.","projected 2D","","","East","North","X","Y","9003","","4135","15104","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / Hawaii zone 4.","99.322",NULL};
+datafile_rows_t horiz_cs_row_94[] = {"3565","Old Hawaiian / Hawaii zone 5","Old Hawaiian / SP zone 5","","","United States (USA) - Hawaii - Niihau.","projected 2D","","","East","North","X","Y","9003","","4135","15105","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / Hawaii zone 5.","99.322",NULL};
+datafile_rows_t horiz_cs_row_95[] = {"3920","Puerto Rico / UTM zone 20N","","","","British Virgin Islands (civilian).","projected 2D","","","East","North","E","N","9001","","4139","16020","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","NAD27 / UTM zone 20 N (code 26720) used for military purposes.","",NULL};
+datafile_rows_t horiz_cs_row_96[] = {"3991","Puerto Rico State Plane CS of 1927","Puerto Rico SPCS 27","","","Puerto Rico.","projected 2D","","","East","North","X","Y","9003","","4139","15201","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / Puerto Rico State Plane CS.","99.323",NULL};
+datafile_rows_t horiz_cs_row_97[] = {"3992","Puerto Rico / St. Croix","","","","US Virgin Islands (U.S.).","projected 2D","","","East","North","X","Y","9003","","4139","15202","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / St. Croix State Plane CS.","99.323",NULL};
+datafile_rows_t horiz_cs_row_98[] = {"4001","Unknown datum based upon ellipsoid 7001","","","","","geographic 2D","6001","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_99[] = {"4002","Unknown datum based upon ellipsoid 7002","","","","","geographic 2D","6002","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_100[] = {"4003","Unknown datum based upon ellipsoid 7003","","","","","geographic 2D","6003","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_101[] = {"4004","Unknown datum based upon ellipsoid 7004","","","","","geographic 2D","6004","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_102[] = {"4005","Unknown datum based upon ellipsoid 7005","","","","","geographic 2D","6005","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_103[] = {"4006","Unknown datum based upon ellipsoid 7006","","","","","geographic 2D","6006","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_104[] = {"4007","Unknown datum based upon ellipsoid 7007","","","","","geographic 2D","6007","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_105[] = {"4008","Unknown datum based upon ellipsoid 7008","","","","","geographic 2D","6008","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_106[] = {"4009","Unknown datum based upon ellipsoid 7009","","","","","geographic 2D","6009","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_107[] = {"4010","Unknown datum based upon ellipsoid 7010","","","","","geographic 2D","6010","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_108[] = {"4011","Unknown datum based upon ellipsoid 7011","","","","","geographic 2D","6011","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_109[] = {"4012","Unknown datum based upon ellipsoid 7012","","","","","geographic 2D","6012","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_110[] = {"4013","Unknown datum based upon ellipsoid 7013","","","","","geographic 2D","6013","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_111[] = {"4014","Unknown datum based upon ellipsoid 7014","","","","","geographic 2D","6014","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_112[] = {"4015","Unknown datum based upon ellipsoid 7015","","","","","geographic 2D","6015","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_113[] = {"4016","Unknown datum based upon ellipsoid 7016","","","","","geographic 2D","6016","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_114[] = {"4017","Unknown datum based upon ellipsoid 7017","","","","","geographic 2D","6017","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_115[] = {"4018","Unknown datum based upon ellipsoid 7018","","","","","geographic 2D","6018","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_116[] = {"4019","Unknown datum based upon ellipsoid 7019","","","","","geographic 2D","6019","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_117[] = {"4020","Unknown datum based upon ellipsoid 7020","","","","","geographic 2D","6020","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_118[] = {"4021","Unknown datum based upon ellipsoid 7021","","","","","geographic 2D","6021","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_119[] = {"4022","Unknown datum based upon ellipsoid 7022","","","","","geographic 2D","6022","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_120[] = {"4024","Unknown datum based upon ellipsoid 7024","","","","","geographic 2D","6024","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_121[] = {"4025","Unknown datum based upon ellipsoid 7025","","","","","geographic 2D","6025","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_122[] = {"4027","Unknown datum based upon ellipsoid 7027","","","","","geographic 2D","6027","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_123[] = {"4028","Unknown datum based upon ellipsoid 7028","","","","","geographic 2D","6028","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_124[] = {"4029","Unknown datum based upon ellipsoid 7029","","","","","geographic 2D","6029","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_125[] = {"4030","Unknown datum based upon ellipsoid 7030","","","","","geographic 2D","6030","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_126[] = {"4031","Unknown datum based upon ellipsoid 7031","","","","","geographic 2D","6031","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_127[] = {"4032","Unknown datum based upon ellipsoid 7032","","","","","geographic 2D","6032","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_128[] = {"4033","Unknown datum based upon ellipsoid 7033","","","","","geographic 2D","6033","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_129[] = {"4034","Unknown datum based upon ellipsoid 7034","","","","","geographic 2D","6034","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_130[] = {"4035","Unknown datum based upon ellipsoid 7035","","","","","geographic 2D","6035","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_131[] = {"4036","Unknown datum based upon ellipsoid 7036","","","","","geographic 2D","6036","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","",NULL};
+datafile_rows_t horiz_cs_row_132[] = {"4041","Unknown datum based upon ellipsoid 7041","","","","","geographic 2D","6041","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","",NULL};
+datafile_rows_t horiz_cs_row_133[] = {"4042","Unknown datum based upon ellipsoid 7042","","","","","geographic 2D","6042","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","",NULL};
+datafile_rows_t horiz_cs_row_134[] = {"4043","Unknown datum based upon ellipsoid 7043","","","","","geographic 2D","6043","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","",NULL};
+datafile_rows_t horiz_cs_row_135[] = {"4044","Unknown datum based upon ellipsoid 7044","","","","","geographic 2D","6044","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","",NULL};
+datafile_rows_t horiz_cs_row_136[] = {"4045","Unknown datum based upon ellipsoid 7045","","","","","geographic 2D","6045","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Not recommended. Use only in cases where geodetic datum unknown.","",NULL};
+datafile_rows_t horiz_cs_row_137[] = {"4120","Greek","","","","Greece","geographic 2D","6120","8901","North","East","Lat","Long","","9108","","","1997-06-16 00:00:00","Topography Department; National Technical University of Greece.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_138[] = {"4121","GGRS87","","","","Greece","geographic 2D","6121","8901","North","East","Lat","Long","","9108","","","1997-06-16 00:00:00","Geodesy Department; Public Petroleum Corporation of Greece.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_139[] = {"4122","ATS77","","","","Canada - New Brunswick; Canada - Nova Scotia - onshore; Canada - Prince Edward Island.","geographic 2D","6122","8901","North","East","Lat","Long","","9108","","","1997-07-22 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1979. To be phased out in late 1990's.","",NULL};
+datafile_rows_t horiz_cs_row_140[] = {"4123","KKJ","","","","Finland","geographic 2D","6123","8901","North","East","Lat","Long","","9108","","","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_141[] = {"4124","RT90","","","","Sweden","geographic 2D","6124","8901","North","East","Lat","Long","","9108","","","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_142[] = {"4125","Samboja","","","","Indonesia - east Kalimantan - Mahakam delta area.","geographic 2D","6125","8901","North","East","Lat","Long","","9108","","","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_143[] = {"4126","LKS94 (ETRS89)","","","","Lithuania","geographic 2D","6126","8901","North","East","Lat","Long","","9108","","","1998-03-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_144[] = {"4127","Tete","","","","Mozambique","geographic 2D","6127","8901","North","East","Lat","Long","","9108","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_145[] = {"4128","Madzansua","","","","Mozambique - west","geographic 2D","6128","8901","North","East","Lat","Long","","9108","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Superseded by values transformed to Tete geogCS (code 4127).","",NULL};
+datafile_rows_t horiz_cs_row_146[] = {"4129","Observatario","","","","Mozambique - south","geographic 2D","6129","8901","North","East","Lat","Long","","9108","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Superseded by values transformed to Tete geogCS (code 4127).","",NULL};
+datafile_rows_t horiz_cs_row_147[] = {"4130","Moznet","","","","Mozambique","geographic 2D","6130","8901","North","East","Lat","Long","","9108","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_148[] = {"4131","Indian 1960","","","","Cambodia; Vietnam","geographic 2D","6131","8901","North","East","Lat","Long","","9108","","","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_149[] = {"4132","FD58","","","","Iran - Gulf coast and Arwaz areas.","geographic 2D","6132","8901","North","East","Lat","Long","","9108","","","1998-11-11 00:00:00","IOEPC records.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_150[] = {"4133","EST92","","","","Estonia","geographic 2D","6133","8901","North","East","Lat","Long","","9108","","","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","Densification of ETRS89 as established during 1992 Baltic campaign.","",NULL};
+datafile_rows_t horiz_cs_row_151[] = {"4134","PDO Survey Datum 1993","PSD93","","","Oman","geographic 2D","6134","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Supersedes Fahud geogCS (code 4232). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t horiz_cs_row_152[] = {"4135","Old Hawaiian","","","","United States (USA) - Hawaii","geographic 2D","6135","8901","North","East","Lat","Long","","9108","","","1999-05-24 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_153[] = {"4136","St. Lawrence Island","","","","United States (USA) - Alaska - St. Lawrence Island","geographic 2D","6136","8901","North","East","Lat","Long","","9108","","","1999-05-24 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_154[] = {"4137","St. Paul Island","","","","United States (USA) - Alaska - St. Paul Island","geographic 2D","6137","8901","North","East","Lat","Long","","9108","","","1999-05-24 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_155[] = {"4138","St. George Island","","","","United States (USA) - Alaska - St. George Island","geographic 2D","6138","8901","North","East","Lat","Long","","9108","","","1999-05-24 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_156[] = {"4139","Puerto Rico","","","","Puerto Rico; Virgin Islands (British); Virgin Islands (U.S.).","geographic 2D","6139","8901","North","East","Lat","Long","","9108","","","1999-05-24 00:00:00","","EPSG","Used for civilian purposes. NAD27 (code 4267) used for military purposes. Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_157[] = {"4140","NAD83(CSRS98)","","","","Canada - New Brunswick","geographic 2D","6140","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","Service New Brunswick Land and Information Standards Manual","EPSG","Supersedes ATS77 from 1999 in New Brunswick.","",NULL};
+datafile_rows_t horiz_cs_row_158[] = {"4141","Israel","","","","Israel.","geographic 2D","6141","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","Survey of Israel","EPSG","Supersedes Palestine 1923 in Israel.","",NULL};
+datafile_rows_t horiz_cs_row_159[] = {"4142","Locodjo 1965","","","","Cote D'Ivoire (Ivory Coast).","geographic 2D","6142","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","IGN Paris","EPSG","Superseded by Abidjan 1987 (EPSG code 4143).","",NULL};
+datafile_rows_t horiz_cs_row_160[] = {"4143","Abidjan 1987","","","","Cote D'Ivoire (Ivory Coast).","geographic 2D","6143","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","IGN Paris","EPSG","Supersedes Locodjo 1967 (EPSG code 4142).","",NULL};
+datafile_rows_t horiz_cs_row_161[] = {"4144","Kalianpur 1937","","","","Bangladesh; India; Pakistan","geographic 2D","6144","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Adopts 1937 metric conversion of 0.30479841 metres per Indian foot.","",NULL};
+datafile_rows_t horiz_cs_row_162[] = {"4145","Kalianpur 1962","","","","Pakistan","geographic 2D","6145","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Adopts 1962 metric conversion of 0.3047996 metres per Indian foot.","",NULL};
+datafile_rows_t horiz_cs_row_163[] = {"4146","Kalianpur 1975","","","","India","geographic 2D","6146","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Adopts 1975 metric conversion of 0.3047995 metres per Indian foot.","",NULL};
+datafile_rows_t horiz_cs_row_164[] = {"4147","Hanoi 1972","","","","Vietnam","geographic 2D","6147","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_165[] = {"4148","Hartbeesthoek94","","","","South Africa.","geographic 2D","6148","8901","North","East","Lat","Long","","9108","","","1999-10-22 00:00:00","","EPSG","Supercedes Cape (code 4222) from 1999.","",NULL};
+datafile_rows_t horiz_cs_row_166[] = {"4149","CH1903","","","","Liechtenstein; Switzerland","geographic 2D","6149","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_167[] = {"4150","CH1903+","","","","Liechtenstein; Switzerland","geographic 2D","6150","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_168[] = {"4151","CHTRF95","","","","Liechtenstein; Switzerland","geographic 2D","6151","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_169[] = {"4152","NAD83(HARN)","","","","United States (US)","geographic 2D","6152","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","National Geodetic Survey","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_170[] = {"4153","Rassadiran","","","","Iran - Taheri refinery site only.","geographic 2D","6153","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Used only for onshore terminal site.","",NULL};
+datafile_rows_t horiz_cs_row_171[] = {"4154","ED50(ED77)","","","","Iran","geographic 2D","6154","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_172[] = {"4200","Pulkovo 1995","","","","Russia","geographic 2D","6200","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_173[] = {"4201","Adindan","","","","Ethiopia; Sudan","geographic 2D","6201","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_174[] = {"4202","AGD66","","","","Australia; Papua New Guinea","geographic 2D","6202","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_175[] = {"4203","AGD84","","","","Australia","geographic 2D","6203","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_176[] = {"4204","Ain el Abd","","","","Kuwait; Saudi Arabia","geographic 2D","6204","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_177[] = {"4205","Afgooye","","","","Somalia","geographic 2D","6205","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_178[] = {"4206","Agadez","","","","Niger","geographic 2D","6206","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_179[] = {"4207","Lisbon","","","","Portugal - onshore","geographic 2D","6207","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","Instituto Geografico e Cadastral; Lisbon","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_180[] = {"4208","Aratu","","","","Brazil - coastal areas south of 2 deg 55 min S.","geographic 2D","6208","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_181[] = {"4209","Arc 1950","","","","Botswana; Malawi; Zambia; Zimbabwe.","geographic 2D","6209","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_182[] = {"4210","Arc 1960","","","","Kenya; Tanzania; Uganda.","geographic 2D","6210","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_183[] = {"4211","Batavia","","","","Indonesia - Java","geographic 2D","6211","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_184[] = {"4212","Barbados 1938","","","","Barbados","geographic 2D","6212","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","99.171",NULL};
+datafile_rows_t horiz_cs_row_185[] = {"4213","Beduaram","","","","Niger","geographic 2D","6213","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_186[] = {"4214","Beijing 1954","","","","China","geographic 2D","6214","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_187[] = {"4215","Belge 1950","","","","Belgium - onshore","geographic 2D","6215","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_188[] = {"4216","Bermuda 1957","","","","Bermuda","geographic 2D","6216","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_189[] = {"4218","Bogota","","","","Colombia","geographic 2D","6218","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_190[] = {"4219","Bukit Rimpah","","","","Indonesia - Banga & Belitung Islands","geographic 2D","6219","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_191[] = {"4220","Camacupa","","","","Angola","geographic 2D","6220","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_192[] = {"4221","Campo Inchauspe","","","","Argentina","geographic 2D","6221","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_193[] = {"4222","Cape","","","","Botswana; South Africa.","geographic 2D","6222","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Superceded by Hartbeesthoek94 from 1999.","",NULL};
+datafile_rows_t horiz_cs_row_194[] = {"4223","Carthage","","","","Tunisia","geographic 2D","6223","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_195[] = {"4224","Chua","","","","Brazil","geographic 2D","6224","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_196[] = {"4225","Corrego Alegre","","","","Brazil - NE coastal area between 45 deg W and 40 deg W.","geographic 2D","6225","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_197[] = {"4226","Cote d'Ivoire","","","","Cote d'Ivoire","geographic 2D","6226","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_198[] = {"4227","Deir ez Zor","","","","Syrian Arab Republic","geographic 2D","6227","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_199[] = {"4228","Douala","","","","Cameroon","geographic 2D","6228","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_200[] = {"4229","Egypt 1907","","","","Egypt","geographic 2D","6229","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_201[] = {"4230","ED50","","","","Europe - west - Spain; France offshore; United Kingdom UKCS offshore; Netherlands offshore; Germany offshore North Sea; Denmark; Norway; Turkey.","geographic 2D","6230","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_202[] = {"4231","ED87","","","","Europe - west.","geographic 2D","6231","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_203[] = {"4232","Fahud","","","","Oman","geographic 2D","6232","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Since 1993 superseded by PSD93 geogCS (code 4134). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t horiz_cs_row_204[] = {"4233","Gandajika 1970","","","","Maldives","geographic 2D","6233","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_205[] = {"4234","Garoua","","","","Cameroon","geographic 2D","6234","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_206[] = {"4235","Guyane Francaise","","","","French Guyana","geographic 2D","6235","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_207[] = {"4236","Hu Tzu Shan","","","","Taiwan","geographic 2D","6236","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_208[] = {"4237","HD72","","","","Hungary","geographic 2D","6237","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_209[] = {"4238","ID74","","","","Indonesia","geographic 2D","6238","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_210[] = {"4239","Indian 1954","","","","Myanmar (Burma); Thailand","geographic 2D","6239","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_211[] = {"4240","Indian 1975","","","","Thailand","geographic 2D","6240","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_212[] = {"4241","Jamaica 1875","","","","Jamaica","geographic 2D","6241","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_213[] = {"4242","JAD69","","","","Jamaica","geographic 2D","6242","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_214[] = {"4243","Kalianpur 1880","","","","Bangladesh; India; Myanmar (Burma); Pakistan","geographic 2D","6243","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_215[] = {"4244","Kandawala","","","","Sri Lanka","geographic 2D","6244","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_216[] = {"4245","Kertau","","","","Malaysia - West Malaysia; Singapore","geographic 2D","6245","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Adopts metric conversion of 39.370113 inches per metre.","",NULL};
+datafile_rows_t horiz_cs_row_217[] = {"4246","KOC","","","","Kuwait","geographic 2D","6246","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_218[] = {"4247","La Canoa","","","","Venezuela","geographic 2D","6247","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","PSAD56 uses same origin.","",NULL};
+datafile_rows_t horiz_cs_row_219[] = {"4248","PSAD56","","","","Bolivia; Ecuador; Peru; [Venezuela]","geographic 2D","6248","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Origin is same as La Canoa. In Venezuela known as La Canoa.","",NULL};
+datafile_rows_t horiz_cs_row_220[] = {"4249","Lake","","","","Venezuela - Lake Maracaibo area","geographic 2D","6249","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_221[] = {"4250","Leigon","","","","Ghana","geographic 2D","6250","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_222[] = {"4251","Liberia 1964","","","","Liberia","geographic 2D","6251","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_223[] = {"4252","Lome","","","","Togo","geographic 2D","6252","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_224[] = {"4253","Luzon 1911","","","","Philippines","geographic 2D","6253","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_225[] = {"4254","Hito XVIII 1963","","","","Chile - Tierra del Fuego","geographic 2D","6254","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_226[] = {"4255","Herat North","","","","Afghanistan","geographic 2D","6255","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_227[] = {"4256","Mahe 1971","","","","Seychelles","geographic 2D","6256","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_228[] = {"4257","Makassar","","","","Indonesia - south west Sulawesi","geographic 2D","6257","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_229[] = {"4258","ETRF89","","","","Europe - Hungary; Norway; Sweden; United Kingdom (UKCS) offshore.","geographic 2D","6258","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","Norwegian Geodetic Institute geodetic publication 1990:1","EPSG","","97.11 99.11",NULL};
+datafile_rows_t horiz_cs_row_230[] = {"4259","Malongo 1987","","","","Angola - Cabinda offshore","geographic 2D","6259","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","Chevron Petroleum Technology","EPSG","Offshore extension of Mhast GeogCS (4264) using Transit translocation from Station Y at Malongo base camp.","",NULL};
+datafile_rows_t horiz_cs_row_231[] = {"4260","Manoca","","","","Cameroon","geographic 2D","6260","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_232[] = {"4261","Merchich","","","","Morocco","geographic 2D","6261","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_233[] = {"4262","Massawa","","","","Eritrea","geographic 2D","6262","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_234[] = {"4263","Minna","","","","Nigeria","geographic 2D","6263","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_235[] = {"4264","Mhast","","","","Angola - Cabinda","geographic 2D","6264","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_236[] = {"4265","Monte Mario","","","","Italy","geographic 2D","6265","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_237[] = {"4266","M'poraloko","","","","Gabon","geographic 2D","6266","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_238[] = {"4267","NAD27","","","","North and central America - Canada; Mexico; United States (USA).","geographic 2D","6267","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST. Superseded by NAD27(76) (code 4608) in Ontario and CGQ77 (code 4609) in Quebec.","99.04",NULL};
+datafile_rows_t horiz_cs_row_239[] = {"4268","NAD27 Michigan","NAD Michigan","","","United States (USA) - Michigan","geographic 2D","6268","8901","North","East","Lat","Long","","9108","","","1996-12-12 00:00:00","","EPSG","Ellipsoid taken to be 800ft above geoid. Note: this coordinate system includes longitudes which are POSITIVE EAST.","96.28",NULL};
+datafile_rows_t horiz_cs_row_240[] = {"4269","NAD83","","","","Canada: Greenland; Mexico; United States (USA)","geographic 2D","6269","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_241[] = {"4270","Nahrwan 1967","","","","Arabian Gulf; Kuwait; United Arab Emirates (UAE) - Abu Dhabi; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain.","geographic 2D","6270","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_242[] = {"4271","Naparima 1972","","","","Trinidad and Tobago","geographic 2D","6271","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_243[] = {"4272","GD49","","","","New Zealand","geographic 2D","6272","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_244[] = {"4273","NGO 1948","","","","Norway - onshore","geographic 2D","6273","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_245[] = {"4274","Datum 73","","","","Portugal - onshore","geographic 2D","6274","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","Instituto Geografico e Cadastral; Lisbon","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_246[] = {"4275","NTF","","","","France - onshore","geographic 2D","6275","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_247[] = {"4276","NSWC 9Z-2","","","","World","geographic 2D","6276","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_248[] = {"4277","OSGB 1936","","","","United Kingdom (UK) - Great Britain - England Scotland Wales - onshore; Isle of Man.","geographic 2D","6277","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_249[] = {"4278","OSGB70","","","","United Kingdom (UK) - Great Britain - England Scotland wales - onshore","geographic 2D","6278","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_250[] = {"4279","OS(SN)80","","","","Ireland - onshore; United Kingdom (UK) - England Scotland Wales Northern Ireland - onshore E","geographic 2D","6279","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_251[] = {"4280","Padang","","","","Indonesia - Sumatra","geographic 2D","6280","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_252[] = {"4281","Palestine 1923","","","","Israel; Jordan; Lebanon","geographic 2D","6281","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_253[] = {"4282","Pointe Noire","","","","Congo","geographic 2D","6282","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_254[] = {"4283","GDA94","","","","Australia","geographic 2D","6283","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_255[] = {"4284","Pulkovo 1942","","","","Armenia; Azerbaijan; Belarus; Estonia; Georgia; Kazakstan; Kirgistan; Latvia; Lithuania; Moldova; Russia; Tadzhikstan; Turkmenistan; Ukraine; Uzbekistan; Germany (former DDR); Czech Republic; Hungary; Poland; Romania; Latvia; Lithuania; Estonia; Albania","geographic 2D","6284","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_256[] = {"4285","Qatar","","","","Qatar - onshore","geographic 2D","6285","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_257[] = {"4286","Qatar 1948","","","","Qatar - onshore","geographic 2D","6286","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_258[] = {"4287","Qornoq","","","","Greenland","geographic 2D","6287","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_259[] = {"4288","Loma Quintana","","","","Venezuela - north","geographic 2D","6288","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_260[] = {"4289","Amersfoort","","","","Netherlands - onshore","geographic 2D","6289","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_261[] = {"4291","SAD69","","","","South America - Brazil","geographic 2D","6291","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.251. Error introduced if not using the truncated precision is 0 to 31mm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_262[] = {"4292","Sapper Hill 1943","","","","Falkland Islands","geographic 2D","6292","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_263[] = {"4293","Schwarzeck","","","","Namibia","geographic 2D","6293","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_264[] = {"4294","Segora","","","","Indonesia - southeast Kalimantan","geographic 2D","6294","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_265[] = {"4295","Serindung","","","","Indonesia - east Kalimantan","geographic 2D","6295","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_266[] = {"4296","Sudan","","","","Sudan - south","geographic 2D","6296","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_267[] = {"4297","Tananarive","","","","Madagascar","geographic 2D","6297","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_268[] = {"4298","Timbalai 1948","","","","Brunei; Malaysia - East Malaysia (Sabah; Sarawak).","geographic 2D","6298","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Adopts metric conversion of 39.370147 inches per metre.","",NULL};
+datafile_rows_t horiz_cs_row_269[] = {"4299","TM65","","","","Ireland - onshore; United Kingdom (UK) - Northern Ireland (Ulster) onshore","geographic 2D","6299","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_270[] = {"4300","TM75","","","","Ireland - onshore; United Kingdom (UK) - Northern Ireland (Ulster) onshore","geographic 2D","6300","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_271[] = {"4301","Tokyo","","","","Japan; North Korea; South Korea","geographic 2D","6301","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_272[] = {"4302","Trinidad 1903","","","","Trinidad and Tobago - Trinidad","geographic 2D","6302","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_273[] = {"4303","TC(1948)","","","","United Arab Emirates (UAE) - Abu Dhabi; Dubai","geographic 2D","6303","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_274[] = {"4304","Voirol 1875","","","","Algeria - north of 32 deg N","geographic 2D","6304","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","IGN Paris","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_275[] = {"4305","Voirol Unifie","","","","Algeria - north of 32 deg N","geographic 2D","6305","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","\"Le System Geodesique Nord-Sahara\"; IGN Paris","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_276[] = {"4306","Bern 1938","","","","Liechtenstein; Switzerland","geographic 2D","6306","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Used for the geographic coordinates overprinted on topographic maps constructed on the CH1903 / LV03 projected CS (code 21781).","",NULL};
+datafile_rows_t horiz_cs_row_277[] = {"4307","Nord Sahara 1959","","","","Algeria; Morocco; Tunisia","geographic 2D","6307","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","\"Le System Geodesique Nord-Sahara\"; IGN Paris","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_278[] = {"4308","RT38","","","","Sweden","geographic 2D","6308","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","97.09",NULL};
+datafile_rows_t horiz_cs_row_279[] = {"4309","Yacare","","","","Uruguay","geographic 2D","6309","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_280[] = {"4310","Yoff","","","","Senegal","geographic 2D","6310","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_281[] = {"4311","Zanderij","","","","Suriname","geographic 2D","6311","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_282[] = {"4312","MGI","","","","Austria; Yugoslavia","geographic 2D","6312","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","Bundesamt fur Eich- und Vermessungswesen; Wien","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_283[] = {"4313","Belge 1972","","","","Belgium - onshore","geographic 2D","6313","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_284[] = {"4314","DHDN","","","","Germany - onshore","geographic 2D","6314","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_285[] = {"4315","Conakry 1905","","","","Guinea","geographic 2D","6315","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_286[] = {"4316","Dealul Piscului 1933","","","","Romania","geographic 2D","6316","8901","North","East","Lat","Long","","9108","","","1996-04-12 00:00:00","","EPSG","Superseded by 1970 system (geogCS code 4317).","",NULL};
+datafile_rows_t horiz_cs_row_287[] = {"4317","Dealul Piscului 1970","","","","Romania","geographic 2D","6317","8901","North","East","Lat","Long","","9108","","","1996-04-12 00:00:00","","EPSG","Supersedes 1933 system (geogCS code 4316).","",NULL};
+datafile_rows_t horiz_cs_row_288[] = {"4318","NGN","","","","Kuwait","geographic 2D","6318","8901","North","East","Lat","Long","","9108","","","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_289[] = {"4319","KUDAMS","","","","Kuwait - Kuwait City","geographic 2D","6319","8901","North","East","Lat","Long","","9108","","","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_290[] = {"4322","WGS 72","","","","World","geographic 2D","6322","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","GeogCS code 4323 reserved for use with ProjCS's.","",NULL};
+datafile_rows_t horiz_cs_row_291[] = {"4324","WGS 72BE","","","","World","geographic 2D","6324","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","GeogCS code 4325 reserved for use with ProjCS's.","",NULL};
+datafile_rows_t horiz_cs_row_292[] = {"4326","WGS 84","","","","World","geographic 2D","6326","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","GeogCS code 4327 reserved for use with ProjCS's.","",NULL};
+datafile_rows_t horiz_cs_row_293[] = {"4600","Anguilla 1957","","","","Anguilla","geographic 2D","6600","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_294[] = {"4601","Antigua 1943","","","","Antigua and Barbuda - Antigua","geographic 2D","6601","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_295[] = {"4602","Dominica 1945","","","","Dominica","geographic 2D","6602","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_296[] = {"4603","Grenada 1953","","","","Grenada (including Grenada Grenadines)","geographic 2D","6603","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_297[] = {"4604","Montserrat 1958","","","","Montserrat","geographic 2D","6604","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_298[] = {"4605","St. Kitts 1955","","","","Saint Kitts and Nevis","geographic 2D","6605","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_299[] = {"4606","St. Lucia 1955","","","","Saint Lucia","geographic 2D","6606","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_300[] = {"4607","St. Vincent 1945","","","","Saint Vincent and the Grenadines","geographic 2D","6607","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_301[] = {"4608","NAD27(76)","","","","Canada - Ontario","geographic 2D","6608","8901","North","East","Lat","Long","","9108","","","1999-05-12 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_302[] = {"4609","NAD27(CGQ77)","CGQ77","","","Canada - Quebec","geographic 2D","6609","8901","North","East","Lat","Long","","9108","","","1999-05-12 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_303[] = {"4801","Bern 1898 (Bern)","","","","Liechtenstein; Switzerland","geographic 2D","6149","8907","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_304[] = {"4802","Bogota (Bogota)","","","","Colombia","geographic 2D","6218","8904","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_305[] = {"4803","Lisbon (Lisbon)","","","","Portugal - onshore","geographic 2D","6207","8902","North","East","Lat","Long","","9108","","","1997-04-11 00:00:00","Instituto Geografico e Cadastral; Lisbon","EPSG","","97.12",NULL};
+datafile_rows_t horiz_cs_row_306[] = {"4804","Makassar (Jakarta)","","","","Indonesia - south west Sulawesi","geographic 2D","6257","8908","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_307[] = {"4805","MGI (Ferro)","","","","Austria; Yugoslavia","geographic 2D","6312","8909","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","Bundesamt fur Eich- und Vermessungswesen; Wien","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_308[] = {"4806","Monte Mario (Rome)","","","","Italy","geographic 2D","6265","8906","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_309[] = {"4807","NTF (Paris)","","","","France - onshore","geographic 2D","6275","8903","North","East","Lat","Long","","9105","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_310[] = {"4808","Padang (Jakarta)","","","","Indonesia - Sumatra","geographic 2D","6280","8908","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_311[] = {"4809","Belge 1950 (Brussels)","","","","Belgium - onshore","geographic 2D","6215","8910","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_312[] = {"4810","Tananarive (Paris)","","","","Madagascar","geographic 2D","6297","8903","North","East","Lat","Long","","9105","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_313[] = {"4811","Voirol 1875 (Paris)","","","","Algeria - north of 32 deg N","geographic 2D","6304","8903","North","East","Lat","Long","","9105","","","1995-06-02 00:00:00","IGN Paris","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_314[] = {"4812","Voirol Unifie (Paris)","","","","Algeria - north of 32 deg N","geographic 2D","6305","8903","North","East","Lat","Long","","9105","","","1995-06-02 00:00:00","\"Le System Geodesique Nord-Sahara\"; IGN Paris","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_315[] = {"4813","Batavia (Jakarta)","","","","Indonesia - Java","geographic 2D","6211","8908","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_316[] = {"4814","RT38 (Stockholm)","","","","Sweden","geographic 2D","6308","8911","North","East","Lat","Long","","9108","","","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_317[] = {"4815","Greek (Athens)","","","","Greece","geographic 2D","6120","8912","North","East","Lat","Long","","9108","","","1997-06-16 00:00:00","Topography Department; National Technical University of Greece.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_318[] = {"4816","Carthage (Paris)","","","","Tunisia","geographic 2D","6223","8903","North","East","Lat","Long","","9105","","","1998-11-11 00:00:00","","EPSG","Superseded by Greenwich-based Carthage geogCS.","",NULL};
+datafile_rows_t horiz_cs_row_319[] = {"4817","NGO 1948 (Oslo)","","","","Norway - onshore","geographic 2D","6273","8913","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_320[] = {"4901","ATF (Paris)","","","","France","geographic 2D","6901","8903","North","East","Lat","Long","","9105","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_321[] = {"4902","NDG (Paris)","","","","France - Alsace","geographic 2D","6902","8903","North","East","Lat","Long","","9105","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_322[] = {"4903","Madrid 1870 (Madrid)","","","","Spain","geographic 2D","6903","8905","North","East","Lat","Long","","9108","","","1998-11-11 00:00:00","Institut de Geomatica; Barcelona.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_323[] = {"20004","Pulkovo 1995 / Gauss-Kruger zone 4","1995 Coord. Sys. zone 4","","","Russia - west of 24 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16204","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_324[] = {"20005","Pulkovo 1995 / Gauss-Kruger zone 5","1995 Coord. Sys. zone 5","","","Russia - 24 deg to 30 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16205","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_325[] = {"20006","Pulkovo 1995 / Gauss-Kruger zone 6","1995 Coord. Sys. zone 6","","","Russia - 30 deg to 36 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16206","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_326[] = {"20007","Pulkovo 1995 / Gauss-Kruger zone 7","1995 Coord. Sys. zone 7","","","Russia - 36 deg to 42 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16207","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_327[] = {"20008","Pulkovo 1995 / Gauss-Kruger zone 8","1995 Coord. Sys. zone 8","","","Russia - 42 deg to 48 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16208","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_328[] = {"20009","Pulkovo 1995 / Gauss-Kruger zone 9","1995 Coord. Sys. zone 9","","","Russia - 48 deg to 54 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16209","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_329[] = {"20010","Pulkovo 1995 / Gauss-Kruger zone 10","1995 Coord. Sys. zone 10","","","Russia - 54 deg to 60 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16210","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_330[] = {"20011","Pulkovo 1995 / Gauss-Kruger zone 11","1995 Coord. Sys. zone 11","","","Russia - 60 deg to 66 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16211","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_331[] = {"20012","Pulkovo 1995 / Gauss-Kruger zone 12","1995 Coord. Sys. zone 12","","","Russia - 66 deg to 72 deg East .","projected 2D","","","North","East","X","Y","9001","","4200","16212","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_332[] = {"20013","Pulkovo 1995 / Gauss-Kruger zone 13","1995 Coord. Sys. zone 13","","","Russia - 72 deg to 78 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16213","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_333[] = {"20014","Pulkovo 1995 / Gauss-Kruger zone 14","1995 Coord. Sys. zone 14","","","Russia - 78 deg to 84 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16214","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_334[] = {"20015","Pulkovo 1995 / Gauss-Kruger zone 15","1995 Coord. Sys. zone 15","","","Russia - 84 deg to 90 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16215","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_335[] = {"20016","Pulkovo 1995 / Gauss-Kruger zone 16","1995 Coord. Sys. zone 16","","","Russia - 90 deg to 96 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16216","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_336[] = {"20017","Pulkovo 1995 / Gauss-Kruger zone 17","1995 Coord. Sys. zone 17","","","Russia - 96 deg to 102deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16217","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_337[] = {"20018","Pulkovo 1995 / Gauss-Kruger zone 18","1995 Coord. Sys. zone 18","","","Russia - 102 deg to 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16218","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_338[] = {"20019","Pulkovo 1995 / Gauss-Kruger zone 19","1995 Coord. Sys. zone 19","","","Russia - 108 deg to 114 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16219","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_339[] = {"20020","Pulkovo 1995 / Gauss-Kruger zone 20","1995 Coord. Sys. zone 20","","","Russia - 114 deg to 120 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16220","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_340[] = {"20021","Pulkovo 1995 / Gauss-Kruger zone 21","1995 Coord. Sys. zone 21","","","Russia - 120 deg to 126 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16221","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_341[] = {"20022","Pulkovo 1995 / Gauss-Kruger zone 22","1995 Coord. Sys. zone 22","","","Russia - 126 deg to 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16222","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_342[] = {"20023","Pulkovo 1995 / Gauss-Kruger zone 23","1995 Coord. Sys. zone 23","","","Russia - 132 deg to 138 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16223","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_343[] = {"20024","Pulkovo 1995 / Gauss-Kruger zone 24","1995 Coord. Sys. zone 24","","","Russia - 138 deg to 144 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16224","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_344[] = {"20025","Pulkovo 1995 / Gauss-Kruger zone 25","1995 Coord. Sys. zone 25","","","Russia - 144 deg to 150 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16225","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_345[] = {"20026","Pulkovo 1995 / Gauss-Kruger zone 26","1995 Coord. Sys. zone 26","","","Russia - 150 deg to 156 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16226","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_346[] = {"20027","Pulkovo 1995 / Gauss-Kruger zone 27","1995 Coord. Sys. zone 27","","","Russia - 156 deg to 162 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16227","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_347[] = {"20028","Pulkovo 1995 / Gauss-Kruger zone 28","1995 Coord. Sys. zone 28","","","Russia - 162 deg to 168 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16228","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_348[] = {"20029","Pulkovo 1995 / Gauss-Kruger zone 29","1995 Coord. Sys. zone 29","","","Russia - 168 deg to 174 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16229","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_349[] = {"20030","Pulkovo 1995 / Gauss-Kruger zone 30","1995 Coord. Sys. zone 30","","","Russia - 174 deg East to 180 deg.","projected 2D","","","North","East","X","Y","9001","","4200","16230","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_350[] = {"20031","Pulkovo 1995 / Gauss-Kruger zone 31","1995 Coord. Sys. zone 31","","","Russia - 180 deg to 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4200","16231","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_351[] = {"20032","Pulkovo 1995 / Gauss-Kruger zone 32","1995 Coord. Sys. zone 32","","","Russia - east of 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4200","16232","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_352[] = {"20064","Pulkovo 1995 / Gauss-Kruger 4N","Pulkovo 1995 / Gauss 4N","","","Russia - west of 24 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16304","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_353[] = {"20065","Pulkovo 1995 / Gauss-Kruger 5N","Pulkovo 1995 / Gauss 5N","","","Russia - 24 deg to 30 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16305","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_354[] = {"20066","Pulkovo 1995 / Gauss-Kruger 6N","Pulkovo 1995 / Gauss 6N","","","Russia - 30 deg to 36 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16306","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_355[] = {"20067","Pulkovo 1995 / Gauss-Kruger 7N","Pulkovo 1995 / Gauss 7N","","","Russia - 36 deg to 42 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16307","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_356[] = {"20068","Pulkovo 1995 / Gauss-Kruger 8N","Pulkovo 1995 / Gauss 8N","","","Russia - 42 deg to 48 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16308","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_357[] = {"20069","Pulkovo 1995 / Gauss-Kruger 9N","Pulkovo 1995 / Gauss 9N","","","Russia - 48 deg to 54 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16309","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_358[] = {"20070","Pulkovo 1995 / Gauss-Kruger 10N","Pulkovo 1995 / Gauss 10N","","","Russia - 54 deg to 60 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16310","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_359[] = {"20071","Pulkovo 1995 / Gauss-Kruger 11N","Pulkovo 1995 / Gauss 11N","","","Russia - 60 deg to 66 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16311","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_360[] = {"20072","Pulkovo 1995 / Gauss-Kruger 12N","Pulkovo 1995 / Gauss 12N","","","Russia - 66 deg to 72 deg East .","projected 2D","","","North","East","X","Y","9001","","4200","16312","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_361[] = {"20073","Pulkovo 1995 / Gauss-Kruger 13N","Pulkovo 1995 / Gauss 13N","","","Russia - 72 deg to 78 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16313","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_362[] = {"20074","Pulkovo 1995 / Gauss-Kruger 14N","Pulkovo 1995 / Gauss 14N","","","Russia - 78 deg to 84 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16314","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_363[] = {"20075","Pulkovo 1995 / Gauss-Kruger 15N","Pulkovo 1995 / Gauss 15N","","","Russia - 84 deg to 90 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16315","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_364[] = {"20076","Pulkovo 1995 / Gauss-Kruger 16N","Pulkovo 1995 / Gauss 16N","","","Russia - 90 deg to 96 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16316","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_365[] = {"20077","Pulkovo 1995 / Gauss-Kruger 17N","Pulkovo 1995 / Gauss 17N","","","Russia - 96 deg to 102deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16317","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_366[] = {"20078","Pulkovo 1995 / Gauss-Kruger 18N","Pulkovo 1995 / Gauss 18N","","","Russia - 102 deg to 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16318","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_367[] = {"20079","Pulkovo 1995 / Gauss-Kruger 19N","Pulkovo 1995 / Gauss 19N","","","Russia - 108 deg to 114 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16319","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_368[] = {"20080","Pulkovo 1995 / Gauss-Kruger 20N","Pulkovo 1995 / Gauss 20N","","","Russia - 114 deg to 120 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16320","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_369[] = {"20081","Pulkovo 1995 / Gauss-Kruger 21N","Pulkovo 1995 / Gauss 21N","","","Russia - 120 deg to 126 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16321","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_370[] = {"20082","Pulkovo 1995 / Gauss-Kruger 22N","Pulkovo 1995 / Gauss 22N","","","Russia - 126 deg to 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16322","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_371[] = {"20083","Pulkovo 1995 / Gauss-Kruger 23N","Pulkovo 1995 / Gauss 23N","","","Russia - 132 deg to 138 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16323","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_372[] = {"20084","Pulkovo 1995 / Gauss-Kruger 24N","Pulkovo 1995 / Gauss 24N","","","Russia - 138 deg to 144 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16324","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_373[] = {"20085","Pulkovo 1995 / Gauss-Kruger 25N","Pulkovo 1995 / Gauss 25N","","","Russia - 144 deg to 150 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16325","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_374[] = {"20086","Pulkovo 1995 / Gauss-Kruger 26N","Pulkovo 1995 / Gauss 26N","","","Russia - 150 deg to 156 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16326","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_375[] = {"20087","Pulkovo 1995 / Gauss-Kruger 27N","Pulkovo 1995 / Gauss 27N","","","Russia - 156 deg to 162 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16327","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_376[] = {"20088","Pulkovo 1995 / Gauss-Kruger 28N","Pulkovo 1995 / Gauss 28N","","","Russia - 162 deg to 168 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16328","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_377[] = {"20089","Pulkovo 1995 / Gauss-Kruger 29N","Pulkovo 1995 / Gauss 29N","","","Russia - 168 deg to 174 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16329","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_378[] = {"20090","Pulkovo 1995 / Gauss-Kruger 30N","Pulkovo 1995 / Gauss 30N","","","Russia - 174 deg East to 180 deg.","projected 2D","","","North","East","X","Y","9001","","4200","16330","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_379[] = {"20091","Pulkovo 1995 / Gauss-Kruger 31N","Pulkovo 1995 / Gauss 31N","","","Russia - 180 deg to 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4200","16331","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_380[] = {"20092","Pulkovo 1995 / Gauss-Kruger 32N","Pulkovo 1995 / Gauss 32N","","","Russia - east of 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4200","16332","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_381[] = {"20137","Adindan / UTM zone 37N","","","","Ethiopia - west of 42 degrees East. Sudan - west of 42 degrees East.","projected 2D","","","East","North","E","N","9001","","4201","16037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_382[] = {"20138","Adindan / UTM zone 38N","","","","Ethiopia - east of 42 degrees East. Sudan - east of 42 degrees East.","projected 2D","","","East","North","E","N","9001","","4201","16038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_383[] = {"20248","AGD66 / AMG zone 48","","","","Australia - 102deg East to 108deg East.","projected 2D","","","East","North","E","N","9001","","4202","17448","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_384[] = {"20249","AGD66 / AMG zone 49","","","","Australia - 108deg East to 114deg East.","projected 2D","","","East","North","E","N","9001","","4202","17449","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_385[] = {"20250","AGD66 / AMG zone 50","","","","Australia - 114deg East to 120deg East.","projected 2D","","","East","North","E","N","9001","","4202","17450","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_386[] = {"20251","AGD66 / AMG zone 51","","","","Australia - 120deg East to 126deg East.","projected 2D","","","East","North","E","N","9001","","4202","17451","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_387[] = {"20252","AGD66 / AMG zone 52","","","","Australia - 126deg East to 132deg East.","projected 2D","","","East","North","E","N","9001","","4202","17452","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_388[] = {"20253","AGD66 / AMG zone 53","","","","Australia - 132deg East to 138deg East.","projected 2D","","","East","North","E","N","9001","","4202","17453","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_389[] = {"20254","AGD66 / AMG zone 54","","","","Australia - 138deg East to 144deg East. Papua New Guinea - west of 144deg East.","projected 2D","","","East","North","E","N","9001","","4202","17454","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_390[] = {"20255","AGD66 / AMG zone 55","","","","Australia - 144deg East to 150deg East. Papua New Guinea - 144deg East to 150deg East.","projected 2D","","","East","North","E","N","9001","","4202","17455","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_391[] = {"20256","AGD66 / AMG zone 56","","","","Australia - 150deg East to 156deg East.","projected 2D","","","East","North","E","N","9001","","4202","17456","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_392[] = {"20257","AGD66 / AMG zone 57","","","","Australia - 156deg East to 162deg East.","projected 2D","","","East","North","E","N","9001","","4202","17457","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_393[] = {"20258","AGD66 / AMG zone 58","","","","Australia - 162deg East to 168deg East.","projected 2D","","","East","North","E","N","9001","","4202","17458","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_394[] = {"20348","AGD84 / AMG zone 48","","","","Australia - 102deg East to 108deg East.","projected 2D","","","East","North","E","N","9001","","4203","17448","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_395[] = {"20349","AGD84 / AMG zone 49","","","","Australia - 108deg East to 114deg East.","projected 2D","","","East","North","E","N","9001","","4203","17449","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_396[] = {"20350","AGD84 / AMG zone 50","","","","Australia - 114deg East to 120deg East.","projected 2D","","","East","North","E","N","9001","","4203","17450","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_397[] = {"20351","AGD84 / AMG zone 51","","","","Australia - 120deg East to 126deg East.","projected 2D","","","East","North","E","N","9001","","4203","17451","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_398[] = {"20352","AGD84 / AMG zone 52","","","","Australia - 126deg East to 132deg East.","projected 2D","","","East","North","E","N","9001","","4203","17452","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_399[] = {"20353","AGD84 / AMG zone 53","","","","Australia - 132deg East to 138deg East.","projected 2D","","","East","North","E","N","9001","","4203","17453","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_400[] = {"20354","AGD84 / AMG zone 54","","","","Australia - 138deg East to 144deg East. Papua - New Guinea west of 144deg East.","projected 2D","","","East","North","E","N","9001","","4203","17454","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_401[] = {"20355","AGD84 / AMG zone 55","","","","Australia - 144deg East to 150deg East. Papua New Guinea - 144deg East to 150deg East.","projected 2D","","","East","North","E","N","9001","","4203","17455","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_402[] = {"20356","AGD84 / AMG zone 56","","","","Australia - 150deg East to 156deg East.","projected 2D","","","East","North","E","N","9001","","4203","17456","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_403[] = {"20357","AGD84 / AMG zone 57","","","","Australia - 156deg East to 162deg East.","projected 2D","","","East","North","E","N","9001","","4203","17457","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_404[] = {"20358","AGD84 / AMG zone 58","","","","Australia - 162deg East to 168deg East.","projected 2D","","","East","North","E","N","9001","","4203","17458","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_405[] = {"20437","Ain el Abd / UTM zone 37N","Ain el Abd / UTM 37N","","","Saudi Arabia - west of 42 degrees East.","projected 2D","","","East","North","E","N","9001","","4204","16037","1997-11-13 00:00:00","","EPSG","","97.59",NULL};
+datafile_rows_t horiz_cs_row_406[] = {"20438","Ain el Abd / UTM zone 38N","Ain el Abd / UTM 38N","","","Kuwait. Saudi Arabia - between 42 degrees and 48 degrees East.","projected 2D","","","East","North","E","N","9001","","4204","16038","1997-11-13 00:00:00","","EPSG","Known in Kuwait as \"KOC UTM\".","97.59",NULL};
+datafile_rows_t horiz_cs_row_407[] = {"20439","Ain el Abd / UTM zone 39N","Ain el Abd / UTM 39N","","","Saudi Arabia - east of 48 degrees East.","projected 2D","","","East","North","E","N","9001","","4204","16039","1997-11-13 00:00:00","","EPSG","","97.59",NULL};
+datafile_rows_t horiz_cs_row_408[] = {"20499","Ain el Abd / Bahrain Grid","","","","Bahrain.","projected 2D","","","East","North","E","N","9001","","4204","19900","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_409[] = {"20538","Afgooye / UTM zone 38N","","","","Somalia - west of 48 degrees East.","projected 2D","","","East","North","E","N","9001","","4205","16038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_410[] = {"20539","Afgooye / UTM zone 39N","","","","Somalia - east of 48 degrees East.","projected 2D","","","East","North","E","N","9001","","4205","16039","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_411[] = {"20790","Lisbon (Lisbon)/Portuguese National Grid","Lisbon / Portuguese Grid","","","Portugal - onshore.","projected 2D","","","East","North","X","Y","9001","","4803","19936","1998-11-11 00:00:00","","EPSG","","98.42",NULL};
+datafile_rows_t horiz_cs_row_412[] = {"20822","Aratu / UTM zone 22S","","","","Brazil - coastal areas south of 2 deg 55 min South and west of 48 deg West.","projected 2D","","","East","North","E","N","9001","","4208","16122","1995-07-21 00:00:00","","EPSG","","95.191",NULL};
+datafile_rows_t horiz_cs_row_413[] = {"20823","Aratu / UTM zone 23S","","","","Brazil - coastal areas south of 2 deg 55 min South and between 48 and 42 deg West; offshore Santos basin.","projected 2D","","","East","North","E","N","9001","","4208","16123","1995-07-21 00:00:00","","EPSG","","95.191",NULL};
+datafile_rows_t horiz_cs_row_414[] = {"20824","Aratu / UTM zone 24S","","","","Brazil - coastal areas south of 2 deg 55 min South and east of 42 deg West; offshore Campos basin.","projected 2D","","","East","North","E","N","9001","","4208","16124","1995-07-21 00:00:00","","EPSG","","95.191",NULL};
+datafile_rows_t horiz_cs_row_415[] = {"20934","Arc 1950 / UTM zone 34S","","","","Botswana & Zambia - west of 24 deg East.","projected 2D","","","East","North","E","N","9001","","4209","16134","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_416[] = {"20935","Arc 1950 / UTM zone 35S","","","","Botswana - east of 24 deg East; Zambia - 24 to 30 deg East; Zimbabwe west of 30 deg East .","projected 2D","","","East","North","E","N","9001","","4209","16135","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_417[] = {"20936","Arc 1950 / UTM zone 36S","","","","Malawi; Zambia & Zimbabwe - east of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4209","16136","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_418[] = {"21035","Arc 1960 / UTM zone 35S","","","","Tanzania - west of 30 deg East; Uganda south of equator and west of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4210","16135","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_419[] = {"21036","Arc 1960 / UTM zone 36S","","","","Kenya - south of equator and west of 36 deg East; Tanzania - 30 to 36 deg East; Uganda south of equator and east of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4210","16136","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_420[] = {"21037","Arc 1960 / UTM zone 37S","","","","Kenya - south of equator and east of 36 deg East; Tanzania - east of 36 deg East.","projected 2D","","","East","North","E","N","9001","","4210","16137","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_421[] = {"21095","Arc 1960 / UTM zone 35N","","","","Uganda north of equator and west of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4210","16035","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_422[] = {"21096","Arc 1960 / UTM zone 36N","","","","Kenya - north of equator and west of 36 deg East; Uganda north of equator and east of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4210","16036","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_423[] = {"21097","Arc 1960 / UTM zone 37N","","","","Kenya - north of equator and east of 36 deg East.","projected 2D","","","East","North","E","N","9001","","4210","16037","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_424[] = {"21100","Batavia (Jakarta) / NEIEZ","Batavia / NEIEZ","","","Indonesia - Java.","projected 2D","","","East","North","X","Y","9001","","4813","19905","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_425[] = {"21148","Batavia / UTM zone 48S","","","","Indonesia - Java west of 108 deg East.","projected 2D","","","East","North","E","N","9001","","4211","16148","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_426[] = {"21149","Batavia / UTM zone 49S","","","","Indonesia - Java between 108 and 114 deg East.","projected 2D","","","East","North","E","N","9001","","4211","16149","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_427[] = {"21150","Batavia / UTM zone 50S","","","","Indonesia - Java east of 114 deg East.","projected 2D","","","East","North","E","N","9001","","4211","16150","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_428[] = {"21291","Barbados 1938 / British West Indies Grid","Barbados 1938 / BWI Grid","","","Barbados","projected 2D","","","East","North","E","N","9001","","4212","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","Superseded by Barbados National Grid (code 21292) from 1983.","",NULL};
+datafile_rows_t horiz_cs_row_429[] = {"21292","Barbados 1938 / Barbados National Grid","Barbados NationaI Grid","","","Barbados","projected 2D","","","East","North","E","N","9001","","4212","19943","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","Supersedes Barbados 1938 / BWI Grid (code 21291) from 1983.","",NULL};
+datafile_rows_t horiz_cs_row_430[] = {"21413","Beijing 1954 / Gauss-Kruger zone 13","Beijing / Gauss zone 13","","","China - west of 78 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16213","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_431[] = {"21414","Beijing 1954 / Gauss-Kruger zone 14","Beijing / Gauss zone 14","","","China - 78 deg East to 84 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16214","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_432[] = {"21415","Beijing 1954 / Gauss-Kruger zone 15","Beijing / Gauss zone 15","","","China - 84 deg East to 90 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16215","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_433[] = {"21416","Beijing 1954 / Gauss-Kruger zone 16","Beijing / Gauss zone 16","","","China - 90 deg East to 96 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16216","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_434[] = {"21417","Beijing 1954 / Gauss-Kruger zone 17","Beijing / Gauss zone 17","","","China - 96 deg East to 102eg E","projected 2D","","","North","East","X","Y","9001","","4214","16217","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_435[] = {"21418","Beijing 1954 / Gauss-Kruger zone 18","Beijing / Gauss zone 18","","","China - 102 deg East to 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16218","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_436[] = {"21419","Beijing 1954 / Gauss-Kruger zone 19","Beijing / Gauss zone 19","","","China - 108 deg East to 114 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16219","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_437[] = {"21420","Beijing 1954 / Gauss-Kruger zone 20","Beijing / Gauss zone 20","","","China - 114 deg East to 120 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16220","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_438[] = {"21421","Beijing 1954 / Gauss-Kruger zone 21","Beijing / Gauss zone 21","","","China - 120 deg East to 126 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16221","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_439[] = {"21422","Beijing 1954 / Gauss-Kruger zone 22","Beijing / Gauss zone 22","","","China - 126 deg East to 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16222","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_440[] = {"21423","Beijing 1954 / Gauss-Kruger zone 23","Beijing / Gauss zone 23","","","China - east of 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16223","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_441[] = {"21473","Beijing 1954 / Gauss-Kruger 13N","Beijing / Gauss 13N","","","China - west of 78 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16313","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_442[] = {"21474","Beijing 1954 / Gauss-Kruger 14N","Beijing / Gauss 14N","","","China - 78 deg East to 84 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16314","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_443[] = {"21475","Beijing 1954 / Gauss-Kruger 15N","Beijing / Gauss 15N","","","China - 84 deg East to 90 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16315","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_444[] = {"21476","Beijing 1954 / Gauss-Kruger 16N","Beijing / Gauss 16N","","","China - 90 deg East to 96 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16316","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_445[] = {"21477","Beijing 1954 / Gauss-Kruger 17N","Beijing / Gauss 17N","","","China - 96 deg East to 102eg E","projected 2D","","","North","East","X","Y","9001","","4214","16317","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_446[] = {"21478","Beijing 1954 / Gauss-Kruger 18N","Beijing / Gauss 18N","","","China - 102 deg East to 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16318","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_447[] = {"21479","Beijing 1954 / Gauss-Kruger 19N","Beijing / Gauss 19N","","","China - 108 deg East to 114 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16319","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_448[] = {"21480","Beijing 1954 / Gauss-Kruger 20N","Beijing / Gauss 20N","","","China - 114 deg East to 120 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16320","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_449[] = {"21481","Beijing 1954 / Gauss-Kruger 21N","Beijing / Gauss 21N","","","China - 120 deg East to 126 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16321","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_450[] = {"21482","Beijing 1954 / Gauss-Kruger 22N","Beijing / Gauss 22N","","","China - 126 deg East to 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16322","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_451[] = {"21483","Beijing 1954 / Gauss-Kruger 23N","Beijing / Gauss 23N","","","China - east of 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16323","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_452[] = {"21500","Belge 1950 (Brussels) / Belge Lambert 50","Belge Lambert 50","","","Belgium - onshore.","projected 2D","","","East","North","X","Y","9001","","4809","19901","1997-04-11 00:00:00","","EPSG","Superseded by 31300 (Belge 1972 / Belge Lambert 72).","97.13",NULL};
+datafile_rows_t horiz_cs_row_453[] = {"21780","Bern 1898 (Bern) / LV03C","LV03C","","","Liechtenstein. Switzerland.","projected 2D","","","East","North","Y","X","9001","","4801","19923","1997-06-30 00:00:00","","EPSG","Superseded by CH1903 / LV03 (code 21781).","97.27 97.62",NULL};
+datafile_rows_t horiz_cs_row_454[] = {"21781","CH1903 / LV03","LV03","","","Liechtenstein; Switzerland.","projected 2D","","","East","North","Y","X","9001","","4149","19922","1999-10-20 00:00:00","","EPSG","Supersedes LV03C (code 21780). Superseded by CH1903+/LV95 (code 256).","",NULL};
+datafile_rows_t horiz_cs_row_455[] = {"21817","Bogota / UTM zone 17N","","","","Colombia - offshore west of 78 deg W of Greenwich.","projected 2D","","","East","North","E","N","9001","","4218","16017","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_456[] = {"21818","Bogota / UTM zone 18N","","","","Colombia - offshore east of 78 deg W of Greenwich.","projected 2D","","","East","North","E","N","9001","","4218","16018","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_457[] = {"21891","Bogota / Colombia West zone","Bogota / Colombia 3W","","","Colombia - west of 1 deg 30 min W of Bogota (75d 34m 51.30s W of Greenwich).","projected 2D","","","East","North","X","Y","9001","","4218","18051","1997-11-13 00:00:00","","EPSG","","97.11 97.57",NULL};
+datafile_rows_t horiz_cs_row_458[] = {"21892","Bogota / Colombia Bogota zone","Bogota / Colombia Bogota","","","Colombia - 1 deg 30 min W to 1 deg 30 min E of Bogota (75d 35m W to 72d 35m W of Greenwich).","projected 2D","","","East","North","X","Y","9001","","4218","18052","1997-11-13 00:00:00","","EPSG","","97.11 97.57",NULL};
+datafile_rows_t horiz_cs_row_459[] = {"21893","Bogota / Colombia East Central zone","Bogota / Colombia 3E","","","Colombia - 1 deg 30 min to 4 deg 30 min E of Bogota (72d 35m to 69d 34m W of Greenwich).","projected 2D","","","East","North","X","Y","9001","","4218","18053","1997-11-13 00:00:00","","EPSG","","97.11 97.57",NULL};
+datafile_rows_t horiz_cs_row_460[] = {"21894","Bogota / Colombia East","Bogota / Colombia 6E","","","Colombia - east of 4 deg 30 min E of Bogota (69d 34m 51.3s W of Greenwich).","projected 2D","","","East","North","X","Y","9001","","4218","18054","1997-11-13 00:00:00","","EPSG","","97.11 97.57",NULL};
+datafile_rows_t horiz_cs_row_461[] = {"22032","Camacupa / UTM zone 32S","","","","Angola - west of 12 deg East.","projected 2D","","","East","North","E","N","9001","","4220","16132","1997-11-13 00:00:00","","EPSG","","97.58",NULL};
+datafile_rows_t horiz_cs_row_462[] = {"22033","Camacupa / UTM zone 33S","","","","Angola - east of 12 deg East.","projected 2D","","","East","North","E","N","9001","","4220","16133","1997-11-13 00:00:00","","EPSG","","97.58",NULL};
+datafile_rows_t horiz_cs_row_463[] = {"22091","Camacupa / TM 11.30 SE","","","","Angola - offshore.","projected 2D","","","East","North","E","N","9001","","4220","16611","1998-11-11 00:00:00","Esso Angola","EPSG","Used by Esso Angola for offshore blocks 15 and 24.","",NULL};
+datafile_rows_t horiz_cs_row_464[] = {"22092","Camacupa / TM 12 SE","","","","Angola - offshore.","projected 2D","","","East","North","E","N","9001","","4220","16612","1998-11-11 00:00:00","Shell Angola","EPSG","Used by Shell Angola for offshore blocks 1 and 16. Used by BP Amoco, Elf and Esso for offshore blocks 31-33.","",NULL};
+datafile_rows_t horiz_cs_row_465[] = {"22191","Campo Inchauspe / Argentina 1","C Inchauspe /Argentina 1","","","Argentina - west of 70 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18031","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_466[] = {"22192","Campo Inchauspe / Argentina 2","C Inchauspe /Argentina 2","","","Argentina - between 70 deg 30 min and 67 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18032","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_467[] = {"22193","Campo Inchauspe / Argentina 3","C Inchauspe /Argentina 3","","","Argentina - between 67 deg 30 min and 64 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18033","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_468[] = {"22194","Campo Inchauspe / Argentina 4","C Inchauspe /Argentina 4","","","Argentina - between 64 deg 30 min and 61 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18034","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_469[] = {"22195","Campo Inchauspe / Argentina 5","C Inchauspe /Argentina 5","","","Argentina - between 61 deg 30 min and 58 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18035","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_470[] = {"22196","Campo Inchauspe / Argentina 6","C Inchauspe /Argentina 6","","","Argentina - between 58 deg 30 min and 55 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18036","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_471[] = {"22197","Campo Inchauspe / Argentina 7","C Inchauspe /Argentina 7","","","Argentina - east of 55 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18037","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_472[] = {"22234","Cape / UTM zone 34S","","","","Botswana - west of 21deg East.","projected 2D","","","East","North","E","N","9001","","4222","16134","1995-12-08 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_473[] = {"22235","Cape / UTM zone 35S","","","","Botswana - east of 27deg East.","projected 2D","","","East","North","E","N","9001","","4222","16135","1995-12-08 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_474[] = {"22236","Cape / UTM zone 36S","","","","Botswana - between 21 and 27deg East.","projected 2D","","","East","North","E","N","9001","","4222","16136","1995-12-08 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_475[] = {"22275","South African Coordinate System zone 15","South African CS zone 15","","","South Africa - Walvis Bay.","projected 2D","","","West","South","W","S","9001","","4222","17515","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_476[] = {"22277","South African Coordinate System zone 17","South African CS zone 17","","","South Africa - west of 18 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17517","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_477[] = {"22279","South African Coordinate System zone 19","South African CS zone 19","","","South Africa - 18 to 20 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17519","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_478[] = {"22281","South African Coordinate System zone 21","South African CS zone 21","","","South Africa - 20 to 22 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17521","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_479[] = {"22283","South African Coordinate System zone 23","South African CS zone 23","","","South Africa - 22 to 24 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17523","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_480[] = {"22285","South African Coordinate System zone 25","South African CS zone 25","","","Lestho - west of 26 deg East; South Africa - 24 to 26 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17525","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_481[] = {"22287","South African Coordinate System zone 27","South African CS zone 27","","","Lestho - east of 26 deg East; South Africa - 26 to 28 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17527","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_482[] = {"22289","South African Coordinate System zone 29","South African CS zone 29","","","South Africa - 28 to 30 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17529","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_483[] = {"22291","South African Coordinate System zone 31","South African CS zone 31","","","South Africa - 30 to 32 deg East; Swaziland.","projected 2D","","","West","South","W","S","9001","","4222","17531","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_484[] = {"22293","South African Coordinate System zone 33","South African CS zone 33","","","South Africa - east of 32 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17533","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_485[] = {"22300","Carthage (Paris) / Tunisia Mining Grid","Tunisia Mining Grid","","","Tunisia - onshore.","projected 2D","","","East","North","X","Y","9036","","4816","19937","1998-11-11 00:00:00","","EPSG","CAUTION: Carthage datum did not exist when the 1953 decree was issued and an inference is that grid should be applied to the Voirol 1875 geogCS. Common practice assumes that the current Tunisian geodetic datum of Carthage applies.","",NULL};
+datafile_rows_t horiz_cs_row_486[] = {"22332","Carthage / UTM zone 32N","","","","Tunisia - offshore.","projected 2D","","","East","North","X","Y","9001","","4223","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_487[] = {"22391","Carthage / Nord Tunisie","","","","Tunisia - north of 38.5 grads (34 deg 39 min) North.","projected 2D","","","East","North","X","Y","9001","","4223","18181","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_488[] = {"22392","Carthage / Sud Tunisie","","","","Tunisia - south of 38.5 grads (34 deg 39 min) North.","projected 2D","","","East","North","X","Y","9001","","4223","18182","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_489[] = {"22523","Corrego Alegre / UTM zone 23S","Corrego Alegre / UTM 23S","","","Brazil - NE coastal area between 45 deg W and 42 deg W.","projected 2D","","","East","North","E","N","9001","","4225","16123","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_490[] = {"22524","Corrego Alegre / UTM zone 24S","Corrego Alegre / UTM 24S","","","Brazil - NE coastal area between 42 deg W and 40 deg W.","projected 2D","","","East","North","E","N","9001","","4225","16124","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_491[] = {"22700","Deir ez Zor / Levant Zone","","","","Syrian Arab Republic west of 39 deg E.","projected 2D","","","East","North","X","Y","9001","","4227","19940","1999-04-22 00:00:00","","EPSG","Superseded by Deir ez Zor / Syria Lambert (EPSG code 22770) from 1973.","",NULL};
+datafile_rows_t horiz_cs_row_492[] = {"22770","Deir ez Zor / Syria Lambert","","","","Syrian Arab Republic","projected 2D","","","East","North","X","Y","9001","","4227","19948","1999-10-20 00:00:00","","EPSG","Supersedes Deir ez Zor / Levant zone (EPSG code 22700) from 1973.","",NULL};
+datafile_rows_t horiz_cs_row_493[] = {"22832","Douala / UTM zone 32N","","","","Cameroon.","projected 2D","","","East","North","E","N","9001","","4228","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_494[] = {"22991","Egypt 1907 / Blue Belt","","","","Egypt - Sinai peninsula.","projected 2D","","","East","North","E","N","9001","","4229","18071","1999-04-22 00:00:00","","EPSG","Also known as Egypt 1907 / Green Belt. Oil industry usually uses Egypt 1907 / Red Belt rather than this projected CS.","",NULL};
+datafile_rows_t horiz_cs_row_495[] = {"22992","Egypt 1907 / Red Belt","","","","Egypt - east of 29 deg East.","projected 2D","","","East","North","E","N","9001","","4229","18072","1995-06-02 00:00:00","","EPSG","See also Egypt 1907 / Blue Belt for non oil industry usage in Sinai peninsula.","",NULL};
+datafile_rows_t horiz_cs_row_496[] = {"22993","Egypt 1907 / Purple Belt","","","","Egypt - west of 29 deg E; north of approx 28 deg 11 min North.","projected 2D","","","East","North","E","N","9001","","4229","18073","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_497[] = {"22994","Egypt 1907 / Extended Purple Belt","Egypt 1907 / Ext. Purple","","","Egypt - west of 29 deg E; south of approx 28 deg 11 min North.","projected 2D","","","East","North","E","N","9001","","4229","18074","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_498[] = {"23028","ED50 / UTM zone 28N","","","","Europe - 18deg West to 12deg West - Ireland offshore; United Kingdom (UKCS) offshore.","projected 2D","","","East","North","E","N","9001","","4230","16028","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_499[] = {"23029","ED50 / UTM zone 29N","","","","Europe - 12deg West to 6deg West - Portugal; Spain; Ireland offshore; United Kingdom (UKCS) offshore.","projected 2D","","","East","North","E","N","9001","","4230","16029","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_500[] = {"23030","ED50 / UTM zone 30N","","","","Europe - 6deg West to 0deg - Spain; France offshore; Ireland offshore; United Kingdom - UKCS offshore - North Sea west of 0 deg East).","projected 2D","","","East","North","E","N","9001","","4230","16030","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_501[] = {"23031","ED50 / UTM zone 31N","","","","Europe - 0deg to 6deg East - Denmark (North Sea); Germany offshore; Netherlands offshore; Norway; United Kingdom (UKCS) offshore.","projected 2D","","","East","North","E","N","9001","","4230","16031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_502[] = {"23032","ED50 / UTM zone 32N","","","","Europe - 6deg East to 12deg East - Denmark; Germany offshore; Netherlands offshore; Norway.","projected 2D","","","East","North","E","N","9001","","4230","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_503[] = {"23033","ED50 / UTM zone 33N","","","","Europe - 12deg East to 18deg East - Denmark including Bornholm; Norway.","projected 2D","","","East","North","E","N","9001","","4230","16033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_504[] = {"23034","ED50 / UTM zone 34N","","","","Europe - 18deg East to 24deg East - Greece; Norway.","projected 2D","","","East","North","E","N","9001","","4230","16034","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_505[] = {"23035","ED50 / UTM zone 35N","","","","Europe - 24deg East to 30deg East - Greece; Norway; Turkey.","projected 2D","","","East","North","E","N","9001","","4230","16035","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_506[] = {"23036","ED50 / UTM zone 36N","","","","Europe - 30deg East to 36deg East - Turkey.","projected 2D","","","East","North","E","N","9001","","4230","16036","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_507[] = {"23037","ED50 / UTM zone 37N","","","","Europe - 36deg East to 42deg East - Turkey.","projected 2D","","","East","North","E","N","9001","","4230","16037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_508[] = {"23038","ED50 / UTM zone 38N","","","","Europe - 42deg East to 48deg East - Turkey.","projected 2D","","","East","North","E","N","9001","","4230","16038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_509[] = {"23090","ED50 / TM 0 N","","","","United Kingdom (UKCS) - offshore North Sea.","projected 2D","","","East","North","E","N","9001","","4230","16400","1998-11-11 00:00:00","Shell UK","EPSG","Used by Shell UK for North Sea","",NULL};
+datafile_rows_t horiz_cs_row_510[] = {"23095","ED50 / TM 5 NE","","","","Netherlands - offshore North Sea.","projected 2D","","","East","North","E","N","9001","","4230","16405","1998-11-11 00:00:00","NAM","EPSG","Used by NAM","",NULL};
+datafile_rows_t horiz_cs_row_511[] = {"23239","Fahud / UTM zone 39N","","","","Oman - west of 54 deg East.","projected 2D","","","East","North","E","N","9001","","4232","16039","1995-06-02 00:00:00","","EPSG","Since 1993 superseded by PSD93 / UTM zone 39N projCS (code 3439). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t horiz_cs_row_512[] = {"23240","Fahud / UTM zone 40N","","","","Oman - east of 54 deg East.","projected 2D","","","East","North","E","N","9001","","4232","16040","1995-06-02 00:00:00","","EPSG","Since 1993 superseded by PSD93 / UTM zone 40N projCS (code 3440). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t horiz_cs_row_513[] = {"23433","Garoua / UTM zone 33N","","","","Cameroon.","projected 2D","","","East","North","E","N","9001","","4234","16033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_514[] = {"23700","HD72 / EOV","","","","Hungary","projected 2D","","","East","North","Y","X","9001","","4237","19931","1997-07-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_515[] = {"23846","ID74 / UTM zone 46N","","","","Indonesia - north of equator and west of 96 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16046","1995-08-08 00:00:00","","EPSG","","95.193 95.20",NULL};
+datafile_rows_t horiz_cs_row_516[] = {"23847","ID74 / UTM zone 47N","","","","Indonesia - north of equator and between 96 deg and 102 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16047","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_517[] = {"23848","ID74 / UTM zone 48N","","","","Indonesia - north of equator and between 102 deg and 108 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16048","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_518[] = {"23849","ID74 / UTM zone 49N","","","","Indonesia - north of equator and between 108 deg and 114 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16049","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_519[] = {"23850","ID74 / UTM zone 50N","","","","Indonesia - north of equator and between 114 deg and 120 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16050","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_520[] = {"23851","ID74 / UTM zone 51N","","","","Indonesia - north of equator and between 120 deg and 126 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16051","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_521[] = {"23852","ID74 / UTM zone 52N","","","","Indonesia - north of equator and between 126 deg and 132 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16052","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_522[] = {"23853","ID74 / UTM zone 53N","","","","Indonesia - north of equator and east of 132 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16053","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_523[] = {"23886","ID74 / UTM zone 46S","","","","Indonesia - south of equator and west of 96 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16146","1995-08-08 00:00:00","","EPSG","","95.193 95.20",NULL};
+datafile_rows_t horiz_cs_row_524[] = {"23887","ID74 / UTM zone 47S","","","","Indonesia - south of equator and between 96 deg and 102 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16147","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_525[] = {"23888","ID74 / UTM zone 48S","","","","Indonesia - south of equator and between 102 deg and 108 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16148","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_526[] = {"23889","ID74 / UTM zone 49S","","","","Indonesia - south of equator and between 108 deg and 114 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16149","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_527[] = {"23890","ID74 / UTM zone 50S","","","","Indonesia - south of equator and between 114 deg and 120 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16150","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_528[] = {"23891","ID74 / UTM zone 51S","","","","Indonesia - south of equator and between 120 deg and 126 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16151","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_529[] = {"23892","ID74 / UTM zone 52S","","","","Indonesia - south of equator and between 126 deg and 132 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16152","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_530[] = {"23893","ID74 / UTM zone 53S","","","","Indonesia - south of equator and between 132 deg and 138 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16153","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_531[] = {"23894","ID74 / UTM zone 54S","","","","Indonesia - south of equator and east of 138 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16154","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_532[] = {"23946","Indian 1954 / UTM zone 46N","Indian 1954 / UTM 46N","","","Myanmar (Burma) - west of 96 deg East.","projected 2D","","","East","North","E","N","9001","","4239","16046","1998-06-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_533[] = {"23947","Indian 1954 / UTM zone 47N","Indian 1954 / UTM 47N","","","Myanmar (Burma) - east of 96 deg East; Thailand - west of 102 deg East.","projected 2D","","","East","North","E","N","9001","","4239","16047","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_534[] = {"23948","Indian 1954 / UTM zone 48N","Indian 1954 / UTM 48N","","","Thailand - east of 102 deg East.","projected 2D","","","East","North","E","N","9001","","4239","16048","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_535[] = {"24047","Indian 1975 / UTM zone 47N","Indian 1975 / UTM 47N","","","Thailand - west of 102 deg East.","projected 2D","","","East","North","E","N","9001","","4240","16047","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_536[] = {"24048","Indian 1975 / UTM zone 48N","Indian 1975 / UTM 48N","","","Thailand - east of 102 deg East.","projected 2D","","","East","North","E","N","9001","","4240","16048","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_537[] = {"24100","Jamaica 1875 / Jamaica (Old Grid)","Jamaica 1875 / Old Grid","","","Jamaica.","projected 2D","","","East","North","E","N","9005","","4241","19909","1995-06-02 00:00:00","","EPSG","Superseded by 24200 (JAD69 / Jamaica National Grid).","",NULL};
+datafile_rows_t horiz_cs_row_538[] = {"24200","JAD69 / Jamaica National Grid","JAD69 / Jamaica Grid","","","Jamaica.","projected 2D","","","East","North","E","N","9001","","4242","19910","1995-06-02 00:00:00","","EPSG","Supersedes 24100 (JAD69 / Jamaica National Grid).","",NULL};
+datafile_rows_t horiz_cs_row_539[] = {"24305","Kalianpur 1937 / UTM zone 45N","Kalianpur 37 / UTM 45N","","","Bangladesh - west of 90deg East.","projected 2D","","","East","North","E","N","9001","","4144","16045","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_540[] = {"24306","Kalianpur 1937 / UTM zone 46N","Kalianpur 37 / UTM 46N","","","Bangladesh - east of 90deg East.","projected 2D","","","East","North","E","N","9001","","4144","16046","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_541[] = {"24311","Kalianpur 1962 / UTM zone 41N","Kalianpur 62 / UTM 41N","","","Pakistan - west of 66deg East.","projected 2D","","","East","North","E","N","9001","","4145","16041","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_542[] = {"24312","Kalianpur 1962 / UTM zone 42N","Kalianpur 62 / UTM 42N","","","Pakistan - between 66 and 72deg East.","projected 2D","","","East","North","E","N","9001","","4145","16042","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_543[] = {"24313","Kalianpur 1962 / UTM zone 43N","Kalianpur 62 / UTM 43N","","","Pakistan - east of 72deg East.","projected 2D","","","East","North","E","N","9001","","4145","16043","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_544[] = {"24342","Kalianpur 1975 / UTM zone 42N","Kalianpur 75 / UTM 42N","","","India - west of 72deg East.","projected 2D","","","East","North","E","N","9001","","4146","16042","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_545[] = {"24343","Kalianpur 1975 / UTM zone 43N","Kalianpur 75 / UTM 43N","","","India - between 72 and 78deg East.","projected 2D","","","East","North","E","N","9001","","4146","16043","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_546[] = {"24344","Kalianpur 1975 / UTM zone 44N","Kalianpur 75 / UTM 44N","","","India - between 78 and 84deg East.","projected 2D","","","East","North","E","N","9001","","4146","16044","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_547[] = {"24345","Kalianpur 1975 / UTM zone 45N","Kalianpur 75 / UTM 45N","","","India - between 84 and 90deg East.","projected 2D","","","East","North","E","N","9001","","4146","16045","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_548[] = {"24346","Kalianpur 1975 / UTM zone 46N","Kalianpur 75 / UTM 46N","","","India - between 90 and 96deg East.","projected 2D","","","East","North","E","N","9001","","4146","16046","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_549[] = {"24347","Kalianpur 1975 / UTM zone 47N","Kalianpur 75 / UTM 47N","","","India - east of 96deg East.","projected 2D","","","East","North","E","N","9001","","4146","16047","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_550[] = {"24370","Kalianpur 1880 / India zone 0","Kalianpur / India 0","","","Pakistan north of 35 deg 35 min North.","projected 2D","","","East","North","E","N","9084","","4243","18110","1999-10-20 00:00:00","","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_551[] = {"24371","Kalianpur 1880 / India zone I","Kalianpur / India I","","","India north of 28 deg North; Pakistan 28 deg to 35 deg 35 min North.","projected 2D","","","East","North","E","N","9084","","4243","18111","1999-10-20 00:00:00","","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_552[] = {"24372","Kalianpur 1880 / India zone IIa","Kalianpur / India IIa","","","India - between 21 deg and 28 deg North and west of 82 deg East; Pakistan - south of 28 deg North.","projected 2D","","","East","North","E","N","9084","","4243","18112","1999-10-20 00:00:00","","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_553[] = {"24373","Kalianpur 1880 / India zone III","Kalianpur / India III","","","India - between 15 deg and 21 deg North.","projected 2D","","","East","North","E","N","9084","","4243","18114","1999-10-20 00:00:00","","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_554[] = {"24374","Kalianpur 1880 / India zone IV","Kalianpur / India IV","","","India - south of 15 deg North.","projected 2D","","","East","North","E","N","9084","","4243","18116","1999-10-20 00:00:00","","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_555[] = {"24375","Kalianpur 1937 / India zone IIb","Kalianpur 37 / India IIb","","","Bangladesh.","projected 2D","","","East","North","E","N","9001","","4144","18238","1999-10-20 00:00:00","","EPSG","Used by Bangladesh since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and Benoit's 1895 British inch-metre ratio of 39.370115 rounded as Ind ft = 0.30479841m exactly.","97.23",NULL};
+datafile_rows_t horiz_cs_row_556[] = {"24376","Kalianpur 1962 / India zone I","Kalianpur 62 / India I","","","Pakistan - north of 28deg North.","projected 2D","","","East","North","E","N","9001","","4145","18236","1999-10-20 00:00:00","","EPSG","Used by Pakistan since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded by G.Bomford with slight error as Ind ft = 0.3048996m exac [...]
+datafile_rows_t horiz_cs_row_557[] = {"24377","Kalianpur 1962 / India zone IIa","Kalianpur 62 / India IIa","","","Pakistan - south of 28deg North.","projected 2D","","","East","North","E","N","9001","","4145","18237","1999-10-20 00:00:00","","EPSG","Used by Pakistan since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded by G.Bomford with slight error as Ind ft = 0.3048996m [...]
+datafile_rows_t horiz_cs_row_558[] = {"24378","Kalianpur 1975 / India zone I","Kalianpur 75 / India I","","","India - north of 28deg North and west of 82deg East.","projected 2D","","","East","North","E","N","9001","","4146","18231","1999-10-20 00:00:00","","EPSG","Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.","97.23 [...]
+datafile_rows_t horiz_cs_row_559[] = {"24379","Kalianpur 1975 / India zone IIa","Kalianpur 75 / India IIa","","","India - between 28deg and 21deg North and west of 82deg East.","projected 2D","","","East","North","E","N","9001","","4146","18232","1999-10-20 00:00:00","","EPSG","Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exa [...]
+datafile_rows_t horiz_cs_row_560[] = {"24380","Kalianpur 1975 / India zone IIb","Kalianpur 75 / India IIb","","","India - north of 21deg North and east of 82deg East.","projected 2D","","","East","North","E","N","9001","","4146","18235","1999-10-20 00:00:00","","EPSG","Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.","9 [...]
+datafile_rows_t horiz_cs_row_561[] = {"24381","Kalianpur 1975 / India zone III","Kalianpur 75 / India III","","","India - between 21deg and 15deg North.","projected 2D","","","East","North","E","N","9001","","4146","18233","1999-10-20 00:00:00","","EPSG","Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.","97.23",NULL};
+datafile_rows_t horiz_cs_row_562[] = {"24382","Kalianpur 1880 / India zone IIb","Kalianpur / India IIb","","","Bangladesh; India - north of 22 deg North and east of 82 deg East; Myanmar (Burma) - north of 22 deg North.","projected 2D","","","East","North","E","N","9084","","4243","18113","1999-10-20 00:00:00","","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_563[] = {"24383","Kalianpur 1975 / India zone IV","Kalianpur 75 / India IV","","","India - south of 21deg North.","projected 2D","","","East","North","E","N","9001","","4146","18234","1999-10-20 00:00:00","","EPSG","Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.","97.23",NULL};
+datafile_rows_t horiz_cs_row_564[] = {"24500","Kertau / Singapore Grid","","","","Singapore.","projected 2D","","","East","North","E","N","9001","","4245","19920","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_565[] = {"24547","Kertau / UTM zone 47N","","","","Malaysia - West Malaysia west of 102 deg East.","projected 2D","","","East","North","E","N","9001","","4245","16047","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_566[] = {"24548","Kertau / UTM zone 48N","","","","Malaysia - West Malaysia east of 102 deg East.","projected 2D","","","East","North","E","N","9001","","4245","16048","1995-07-21 00:00:00","","EPSG","","95.192",NULL};
+datafile_rows_t horiz_cs_row_567[] = {"24571","Kertau / R.S.O. Malaya (ch)","","","","Malaysia - West Malaysia","projected 2D","","","East","North","E","N","9062","","4245","19935","1999-10-20 00:00:00","","EPSG","Adopts metric conversion of 39.370113 inches per metre.","97.231",NULL};
+datafile_rows_t horiz_cs_row_568[] = {"24600","KOC Lambert","","","","Kuwait.","projected 2D","","","East","North","E","N","9001","","4246","19906","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_569[] = {"24718","La Canoa / UTM zone 18N","","","","Venezuela - west of 72 deg West.","projected 2D","","","East","North","E","N","9001","","4247","16018","1999-10-20 00:00:00","","EPSG","Sometimes referred to as PSAD56 / UTM zone 18N.","",NULL};
+datafile_rows_t horiz_cs_row_570[] = {"24719","La Canoa / UTM zone 19N","","","","Venezuela - between 72 and 66 deg West.","projected 2D","","","East","North","E","N","9001","","4247","16019","1999-10-20 00:00:00","","EPSG","Sometimes referred to as PSAD56 / UTM zone 19N.","",NULL};
+datafile_rows_t horiz_cs_row_571[] = {"24720","La Canoa / UTM zone 20N","","","","Venezuela - east of 66 deg West.","projected 2D","","","East","North","E","N","9001","","4247","16020","1995-06-02 00:00:00","","EPSG","Sometimes referred to as PSAD56 / UTM zone 20N.","",NULL};
+datafile_rows_t horiz_cs_row_572[] = {"24818","PSAD56 / UTM zone 18N","","","","South America (Ecuador; [Venezuela]) 78deg West to 72deg West.","projected 2D","","","East","North","E","N","9001","","4248","16018","1995-06-02 00:00:00","","EPSG","In Venezuela also known as La Canoa / UTM zone 18N.","",NULL};
+datafile_rows_t horiz_cs_row_573[] = {"24819","PSAD56 / UTM zone 19N","","","","South America (Netherlands Antilles; [Venezuela]) 72deg West to 66deg West.","projected 2D","","","East","North","E","N","9001","","4248","16019","1995-06-02 00:00:00","","EPSG","In Venezuela also known as La Canoa / UTM zone 19N.","",NULL};
+datafile_rows_t horiz_cs_row_574[] = {"24820","PSAD56 / UTM zone 20N","","","","South America (Guyana; [Venezuela]) 66deg West to 60deg West.","projected 2D","","","East","North","E","N","9001","","4248","16020","1995-06-02 00:00:00","","EPSG","In Venezuela also known as La Canoa / UTM zone 20N.","",NULL};
+datafile_rows_t horiz_cs_row_575[] = {"24821","PSAD56 / UTM zone 21N","","","","South America (Guyana; Suriname) 60deg West to 54deg West.","projected 2D","","","East","North","E","N","9001","","4248","16021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_576[] = {"24877","PSAD56 / UTM zone 17S","","","","South America (Chile; Ecuador; Peru) 84deg West to 78deg West.","projected 2D","","","East","North","E","N","9001","","4248","16117","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_577[] = {"24878","PSAD56 / UTM zone 18S","","","","South America (Chile; Ecuador; Peru) 78deg West to 72deg West.","projected 2D","","","East","North","E","N","9001","","4248","16118","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_578[] = {"24879","PSAD56 / UTM zone 19S","","","","South America (Bolivia; Chile; Peru) 72deg West to 66deg West.","projected 2D","","","East","North","E","N","9001","","4248","16119","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_579[] = {"24880","PSAD56 / UTM zone 20S","","","","South America (Bolivia) 66deg West to 60deg West.","projected 2D","","","East","North","E","N","9001","","4248","16120","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_580[] = {"24882","PSAD56 / UTM zone 22S","","","","Brazil - offshore Amazon Cone","projected 2D","","","East","North","E","N","9001","","4248","16122","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_581[] = {"24891","PSAD56 / Peru west zone","","","","Peru west of 79 deg West.","projected 2D","","","East","North","X","Y","9001","","4248","18161","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_582[] = {"24892","PSAD56 / Peru central zone","PSAD56 / Peru central","","","Peru 79 to 73 deg West.","projected 2D","","","East","North","X","Y","9001","","4248","18162","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_583[] = {"24893","PSAD56 / Peru east zone","","","","Peru east of 73 deg West.","projected 2D","","","East","North","X","Y","9001","","4248","18163","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_584[] = {"25000","Leigon / Ghana Metre Grid","Leigon / Ghana Grid","","","Ghana.","projected 2D","","","East","North","E","N","9001","","4250","19904","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_585[] = {"25231","Lome / UTM zone 31N","","","","Togo.","projected 2D","","","East","North","E","N","9001","","4252","16031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_586[] = {"25391","Luzon 1911 / Philippines zone I","Luzon / Philippines I","","","Philippines - west of 118 deg East.","projected 2D","","","East","North","X","Y","9001","","4253","18171","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_587[] = {"25392","Luzon 1911 / Philippines zone II","Luzon / Philippines II","","","Philippines - Palawan; Calamian Islands.","projected 2D","","","East","North","X","Y","9001","","4253","18172","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_588[] = {"25393","Luzon 1911 / Philippines zone III","Luzon / Philippines III","","","Philippines - Luzon (except SE part;); Mindoro.","projected 2D","","","East","North","X","Y","9001","","4253","18173","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_589[] = {"25394","Luzon 1911 / Philippines zone IV","Luzon / Philippines IV","","","Philippines - SE Luzon; Tablas; Masbate; Panay; Cebu; Negros; west Mindanao.","projected 2D","","","East","North","X","Y","9001","","4253","18174","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_590[] = {"25395","Luzon 1911 / Philippines zone V","Luzon / Philippines V","","","Philippines - east Mindanao; Bohol; Samar.","projected 2D","","","East","North","X","Y","9001","","4253","18175","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_591[] = {"25700","Makassar (Jakarta) / NEIEZ","Makassar / NEIEZ","","","Indonesia - south west Sulawesi.","projected 2D","","","East","North","X","Y","9001","","4804","19905","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_592[] = {"25828","ETRF89 / UTM zone 28N","","","","Europe - 18deg West to 12deg West - United Kingdom (UKCS) offshore.","projected 2D","","","East","North","E","N","9001","","4258","16028","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_593[] = {"25829","ETRF89 / UTM zone 29N","","","","Europe - 12deg West to 6deg West - United Kingdom (UKCS) offshore.","projected 2D","","","East","North","E","N","9001","","4258","16029","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_594[] = {"25830","ETRF89 / UTM zone 30N","","","","Europe - 6deg West to 0deg.","projected 2D","","","East","North","E","N","9001","","4258","16030","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_595[] = {"25831","ETRF89 / UTM zone 31N","","","","Europe - 0deg to 6deg East - Norway.","projected 2D","","","East","North","E","N","9001","","4258","16031","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_596[] = {"25832","ETRF89 / UTM zone 32N","","","","Europe - 6deg East to 12deg East - Norway.","projected 2D","","","East","North","E","N","9001","","4258","16032","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_597[] = {"25833","ETRF89 / UTM zone 33N","","","","Europe - 12deg East to 18deg East - Norway.","projected 2D","","","East","North","E","N","9001","","4258","16033","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_598[] = {"25834","ETRF89 / UTM zone 34N","","","","Europe - 18deg East to 24deg East - Norway.","projected 2D","","","East","North","E","N","9001","","4258","16034","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_599[] = {"25835","ETRF89 / UTM zone 35N","","","","Europe - 24deg East to 30deg East - Norway.","projected 2D","","","East","North","E","N","9001","","4258","16035","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_600[] = {"25836","ETRF89 / UTM zone 36N","","","","Europe - 30deg East to 36deg East.","projected 2D","","","East","North","E","N","9001","","4258","16036","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_601[] = {"25837","ETRF89 / UTM zone 37N","","","","Europe - 36deg East to 42deg East.","projected 2D","","","East","North","E","N","9001","","4258","16037","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_602[] = {"25838","ETRF89 / UTM zone 38N","","","","Europe - 42deg East to 48deg East.","projected 2D","","","East","North","E","N","9001","","4258","16038","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_603[] = {"25884","ETRF89 / TM Baltic93","","","","Estonia; Latvia; Lithuania.","projected 2D","","","North","East","X","Y","9001","","4258","19939","1999-04-22 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","Used as a common coordinate system for the Baltic states and for medium and small scale mapping in Estonia since 1993.","99.11",NULL};
+datafile_rows_t horiz_cs_row_604[] = {"25932","Malongo 1987 / UTM zone 32S","Malongo 1987 / UTM 32S","","","Angola - Cabinda.","projected 2D","","","East","North","E","N","9001","","4259","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_605[] = {"26191","Merchich / Nord Maroc","","","","Morocco north of 35 grads (31 deg 30 min) North.","projected 2D","","","East","North","X","Y","9001","","4261","18131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_606[] = {"26192","Merchich / Sud Maroc","","","","Morocco 31grads to 35grads (27 deg 54 min to 31 deg 30 min) North.","projected 2D","","","East","North","X","Y","9001","","4261","18132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_607[] = {"26193","Merchich / Sahara","","","","Morocco south of 31grads (27 deg 54 min) North.","projected 2D","","","East","North","X","Y","9001","","4261","18133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_608[] = {"26237","Massawa / UTM zone 37N","","","","Eritrea.","projected 2D","","","East","North","E","N","9001","","4262","16037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_609[] = {"26331","Minna / UTM zone 31N","","","","Nigeria - offshore beyond continental shelf west of 6 deg East.","projected 2D","","","East","North","E","N","9001","","4263","16031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_610[] = {"26332","Minna / UTM zone 32N","","","","Nigeria - offshore beyond continental shelf.","projected 2D","","","East","North","E","N","9001","","4263","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_611[] = {"26391","Minna / Nigeria West Belt","Minna / Nigeria West","","","Nigeria west of 6 deg 30 min East.","projected 2D","","","East","North","E","N","9001","","4263","18151","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_612[] = {"26392","Minna / Nigeria Mid Belt","","","","Nigeria between 6 deg 30 min and 10 deg 30 min East.","projected 2D","","","East","North","E","N","9001","","4263","18152","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_613[] = {"26393","Minna / Nigeria East Belt","Minna / Nigeria East","","","Nigeria east of 10 deg 30 min East.","projected 2D","","","East","North","E","N","9001","","4263","18153","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_614[] = {"26432","Mhast / UTM zone 32S","","","","Angola - Cabinda.","projected 2D","","","East","North","E","N","9001","","4264","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_615[] = {"26591","Monte Mario (Rome) / Italy zone 1","Monte Mario / Italy 1","","","Italy west of 12 deg East.","projected 2D","","","East","North","X","Y","9001","","4806","18121","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_616[] = {"26592","Monte Mario (Rome) / Italy zone 2","Monte Mario / Italy 2","","","Italy east of 12 deg East.","projected 2D","","","East","North","X","Y","9001","","4806","18122","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_617[] = {"26632","M'poraloko / UTM zone 32N","M'poraloko / UTM 32N","","","Gabon - north of equator.","projected 2D","","","East","North","E","N","9001","","4266","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_618[] = {"26692","M'poraloko / UTM zone 32S","M'poraloko / UTM 32S","","","Gabon - south of equator.","projected 2D","","","East","North","E","N","9001","","4266","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_619[] = {"26703","NAD27 / UTM zone 3N","","","","North America - United States (USA) - Alaska - 168deg West to 162deg West.","projected 2D","","","East","North","E","N","9001","","4267","16003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_620[] = {"26704","NAD27 / UTM zone 4N","","","","North America - United States (USA) - Alaska - 162deg West to 156deg West.","projected 2D","","","East","North","E","N","9001","","4267","16004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_621[] = {"26705","NAD27 / UTM zone 5N","","","","North America - United States (USA) - Alaska - 156deg West to 150deg West.","projected 2D","","","East","North","E","N","9001","","4267","16005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_622[] = {"26706","NAD27 / UTM zone 6N","","","","North America - United States (USA) - Alaska - 150deg West to 144deg West.","projected 2D","","","East","North","E","N","9001","","4267","16006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_623[] = {"26707","NAD27 / UTM zone 7N","","","","North America - Canada; United States (USA) - Alaska - 144deg West to 138deg West.","projected 2D","","","East","North","E","N","9001","","4267","16007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_624[] = {"26708","NAD27 / UTM zone 8N","","","","North America - Canada; United States (USA) - 138deg West to 132deg West.","projected 2D","","","East","North","E","N","9001","","4267","16008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_625[] = {"26709","NAD27 / UTM zone 9N","","","","North America - Canada; United States (USA) - 132deg West to 126deg West.","projected 2D","","","East","North","E","N","9001","","4267","16009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_626[] = {"26710","NAD27 / UTM zone 10N","","","","North America - Canada; United States (USA) - 130deg West to 120deg West.","projected 2D","","","East","North","E","N","9001","","4267","16010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_627[] = {"26711","NAD27 / UTM zone 11N","","","","North America - Canada; Mexico; United States (USA) - 120deg West to 114deg West.","projected 2D","","","East","North","E","N","9001","","4267","16011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_628[] = {"26712","NAD27 / UTM zone 12N","","","","North America - Canada; Mexico; United States (USA) - 114deg West to 108deg West.","projected 2D","","","East","North","E","N","9001","","4267","16012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_629[] = {"26713","NAD27 / UTM zone 13N","","","","North America - Canada; Mexico; United States (USA) - 108deg West to 102deg West.","projected 2D","","","East","North","E","N","9001","","4267","16013","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_630[] = {"26714","NAD27 / UTM zone 14N","","","","North America - Canada; Mexico; United States (USA) - 102deg West to 96deg West.","projected 2D","","","East","North","E","N","9001","","4267","16014","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_631[] = {"26715","NAD27 / UTM zone 15N","","","","North America - Canada; Mexico; United States (USA) - 96deg West to 90deg West.","projected 2D","","","East","North","E","N","9001","","4267","16015","1995-06-02 00:00:00","","EPSG","In Ontario superseded by NAD27(76) / UTM zone 15N (code 227).","",NULL};
+datafile_rows_t horiz_cs_row_632[] = {"26716","NAD27 / UTM zone 16N","","","","North America - Canada; Mexico; United States (USA) - 90deg West to 84deg West.","projected 2D","","","East","North","E","N","9001","","4267","16016","1995-06-02 00:00:00","","EPSG","In Ontario superseded by NAD27(76) / UTM zone 16N (code 228).","",NULL};
+datafile_rows_t horiz_cs_row_633[] = {"26717","NAD27 / UTM zone 17N","","","","North America - Canada; Mexico; United States (USA) - 84deg West to 78deg West.","projected 2D","","","East","North","E","N","9001","","4267","16017","1995-06-02 00:00:00","","EPSG","In Ontario superseded by NAD27(76) / UTM zone 17N (code 229). In Quebec superseded by NAD27(CGQ77) / UTM zone 17N (code 231).","",NULL};
+datafile_rows_t horiz_cs_row_634[] = {"26718","NAD27 / UTM zone 18N","","","","North America - Canada; United States (USA) - 78deg West to 72deg West.","projected 2D","","","East","North","E","N","9001","","4267","16018","1995-06-02 00:00:00","","EPSG","In Ontario superseded by NAD27(76) / UTM zone 18N (code 230). In Quebec superseded by NAD27(CGQ77) / UTM zone 18N (code 232).","",NULL};
+datafile_rows_t horiz_cs_row_635[] = {"26719","NAD27 / UTM zone 19N","","","","North America - Canada; United States (USA) - 72deg West to 66deg West.","projected 2D","","","East","North","E","N","9001","","4267","16019","1995-06-02 00:00:00","","EPSG","In Quebec superseded by NAD27(CGQ77) / UTM zone 19N (code 233).","",NULL};
+datafile_rows_t horiz_cs_row_636[] = {"26720","NAD27 / UTM zone 20N","","","","North America - Antigua and Barbuda - Barbuda. British Virgin Islands (military). Canada; United States (USA) offshore Atlantic - 66deg West to 60deg West.","projected 2D","","","East","North","E","N","9001","","4267","16020","1995-06-02 00:00:00","","EPSG","In Quebec superseded by NAD27(CGQ77) / UTM zone 20N (code 234).","",NULL};
+datafile_rows_t horiz_cs_row_637[] = {"26721","NAD27 / UTM zone 21N","","","","North America - Canada - 60deg West to 54deg West.","projected 2D","","","East","North","E","N","9001","","4267","16021","1995-06-02 00:00:00","","EPSG","In Quebec superseded by NAD27(CGQ77) / UTM zone 21N (code 235).","",NULL};
+datafile_rows_t horiz_cs_row_638[] = {"26722","NAD27 / UTM zone 22N","","","","North America - Canada - 54deg West to 48deg West.","projected 2D","","","East","North","E","N","9001","","4267","16022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_639[] = {"26729","NAD27 / Alabama East","","","","United States (USA) - Alabama - AL_E - counties east of approx 86d 37m West - Barbour; Bullock; Calhoun; Chambers; Cherokee; Clay; Cleburne; Coffee; Coosa; Covington; Crenshaw; Dale; De Kalb; Elmore; Etowah; Geneva; Henry; Houston; Jackson; Lee; Macon; Mad","projected 2D","","","East","North","X","Y","9003","","4267","10101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_640[] = {"26730","NAD27 / Alabama West","","","","United States (USA) - Alabama - AL_W - counties west of approx 86d 37m West - Autauga; Baldwin; Bibb; Blount; Butler; Chilton; Choctaw; Clarke; Colbert; Conecuh; Cullman; Dallas; Escambia; Fayette; Franklin; Greene; Hale; Jefferson; Lamar; Lauderdale; Lawr","projected 2D","","","East","North","X","Y","9003","","4267","10102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_641[] = {"26731","NAD27 / Alaska zone 1","","","","United States - Alaska - Panhandle.","projected 2D","","","East","North","X","Y","9003","","4267","15001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_642[] = {"26732","NAD27 / Alaska zone 2","","","","United States - Alaska - 141deg to 144deg West.","projected 2D","","","East","North","X","Y","9003","","4267","15002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_643[] = {"26733","NAD27 / Alaska zone 3","","","","United States - Alaska - 144deg to 148deg West.","projected 2D","","","East","North","X","Y","9003","","4267","15003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_644[] = {"26734","NAD27 / Alaska zone 4","","","","United States - Alaska - 148deg to 152deg West.","projected 2D","","","East","North","X","Y","9003","","4267","15004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_645[] = {"26735","NAD27 / Alaska zone 5","","","","United States - Alaska - 152deg to 156deg West.","projected 2D","","","East","North","X","Y","9003","","4267","15005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_646[] = {"26736","NAD27 / Alaska zone 6","","","","United States - Alaska - 156deg to 160deg West.","projected 2D","","","East","North","X","Y","9003","","4267","15006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_647[] = {"26737","NAD27 / Alaska zone 7","","","","United States - Alaska - 160deg to 164deg West.","projected 2D","","","East","North","X","Y","9003","","4267","15007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_648[] = {"26738","NAD27 / Alaska zone 8","","","","United States - Alaska - 164deg to 168deg West; north of 54d 30m North.","projected 2D","","","East","North","X","Y","9003","","4267","15008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_649[] = {"26739","NAD27 / Alaska zone 9","","","","United States - Alaska - West of 168deg West and north of 54d 30m North.","projected 2D","","","East","North","X","Y","9003","","4267","15009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_650[] = {"26740","NAD27 / Alaska zone 10","","","","United States - Alaska - Aleutian Islands.","projected 2D","","","East","North","X","Y","9003","","4267","15010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_651[] = {"26741","NAD27 / California zone I","NAD27 / California I","","","United States (USA) - California - CA_1 - counties north of approx 40 deg North - Del Norte; Humboldt; Lassen; Modoc; Plumas; Shasta; Siskiyou; Tehama; Trinity","projected 2D","","","East","North","X","Y","9003","","4267","10401","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_652[] = {"26742","NAD27 / California zone II","NAD27 / California II","","","United States (USA) - California - CA_2 - counties between approx 40 deg & 38d 15m North - Alpine; Amador; Butte; Colusa; El Dorado; Glenn; Lake; Mendocino; Napa; Nevada; Placer; Sacramento; Sierra; Solano; Sonoma; Sutter; Yolo; Yuba","projected 2D","","","East","North","X","Y","9003","","4267","10402","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_653[] = {"26743","NAD27 / California zone III","NAD27 / California III","","","United States (USA) - California - CA_3 - counties between approx 38d 15m & 37d North - Alameda; Calaveras; Contra Costa; Madera; Marin; Mariposa; Merced; Mono; San Francisco; San Joaquin; San Mateo; Santa Clara; Santa Cruz; Stanislaus; Tuolumne","projected 2D","","","East","North","X","Y","9003","","4267","10403","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_654[] = {"26744","NAD27 / California zone IV","NAD27 / California IV","","","United States (USA) - California - CA_4 - counties between approx 37d & 35d 30m North - Fresno; Inyo; Kings; Monterey; San Benito; Tulare","projected 2D","","","East","North","X","Y","9003","","4267","10404","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_655[] = {"26745","NAD27 / California zone V","NAD27 / California V","","","United States (USA) - California - CA_5 - counties between approx 35d 50m & 34d North - Kern; San Bernardino; San Luis Obispo; Santa Barbara; Ventura","projected 2D","","","East","North","X","Y","9003","","4267","10405","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_656[] = {"26746","NAD27 / California zone VI","NAD27 / California VI","","","United States (USA) - California - CA_6 - counties south of approx 38d 30m North - Imperial; Orange; Riverside; San Diego","projected 2D","","","East","North","X","Y","9003","","4267","10406","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_657[] = {"26747","NAD27 / California zone VII","NAD27 / California VII","","","United States - California - Los Angeles.","projected 2D","","","East","North","X","Y","9003","","4267","10407","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_658[] = {"26748","NAD27 / Arizona East","","","","United States (USA) - Arizona - AZ_E - counties east of approx 110d 45m West - Apache; Cochise; Gila; Graham; Greenlee; Navajo","projected 2D","","","East","North","X","Y","9003","","4267","10201","1995-08-22 00:00:00","","EPSG","","95.25",NULL};
+datafile_rows_t horiz_cs_row_659[] = {"26749","NAD27 / Arizona Central","","","","United States (USA) - Arizona - AZ_C - counties between approx 110d 45m and 113d 20m West - Coconino; Maricopa; Pima; Pinal; Santa Cruz; Yavapai","projected 2D","","","East","North","X","Y","9003","","4267","10202","1995-08-22 00:00:00","","EPSG","","95.25",NULL};
+datafile_rows_t horiz_cs_row_660[] = {"26750","NAD27 / Arizona West","","","","United States (USA) - Arizona - AZ_W - counties west of approx 113d 20m West - La Paz; Mohave; Yuma","projected 2D","","","East","North","X","Y","9003","","4267","10203","1995-08-22 00:00:00","","EPSG","","95.25",NULL};
+datafile_rows_t horiz_cs_row_661[] = {"26751","NAD27 / Arkansas North","","","","United States (USA) - Arkansas - AR_N - counties north of approx 34d 50m North - Baxter; Benton; Boone; Carroll; Clay; Cleburne; Conway; Craighead; Crawford; Crittenden; Cross; Faulkner; Franklin; Fulton; Greene; Independence; Izard; Jackson; Johnson; Lawr","projected 2D","","","East","North","X","Y","9003","","4267","10301","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_662[] = {"26752","NAD27 / Arkansas South","","","","United States (USA) - Arkansas - AR_S - counties south of approx 34d 50m North - Arkansas; Ashley; Bradley; Calhoun; Chicot; Clark; Cleveland; Columbia; Dallas; Desha; Drew; Garland; Grant; Hempstead; Hot Spring; Howard; Jefferson; Lafayette; Lee; Lincoln;","projected 2D","","","East","North","X","Y","9003","","4267","10302","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_663[] = {"26753","NAD27 / Colorado North","","","","United States (USA) - Colorado - CO_N - counties north of approx 39d 50m North - Adams; Boulder; Gilpin; Grand; Jackson; Larimer; Logan; Moffat; Morgan; Phillips; Rio Blanco; Routt; Sedgwick; Washington; Weld; Yuma","projected 2D","","","East","North","X","Y","9003","","4267","10501","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_664[] = {"26754","NAD27 / Colorado Central","","","","United States (USA) - Colorado - CO_C - counties between approx 39d 50m & 38d 30m North - Arapahoe; Chaffee; Cheyenne; Clear Creek; Delta; Denver; Douglas; Eagle; El Paso; Elbert; Fremont; Garfield; Gunnison; Jefferson; Kit Carson; Lake; Lincoln; Mesa; Par","projected 2D","","","East","North","X","Y","9003","","4267","10502","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_665[] = {"26755","NAD27 / Colorado South","","","","United States (USA) - Colorado - CO_S - counties south of approx 38d 30m North - Alamosa; Archuleta; Baca; Bent; Conejos; Costilla; Crowley; Custer; Dolores; Hinsdale; Huerfano; Kiowa; La Plata; Las Animas; Mineral; Montezuma; Montrose; Otero; Ouray; Prowe","projected 2D","","","East","North","X","Y","9003","","4267","10503","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_666[] = {"26756","NAD27 / Connecticut","","","","United States (USA) - Connecticut - CT - counties of Fairfield; Hartford; Litchfield; Middlesex; New Haven; New London; Tolland; Windham","projected 2D","","","East","North","X","Y","9003","","4267","10600","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_667[] = {"26757","NAD27 / Delaware","","","","United States (USA) - Delaware - DE - counties of Kent; New Castle; Sussex","projected 2D","","","East","North","X","Y","9003","","4267","10700","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_668[] = {"26758","NAD27 / Florida East","","","","United States (USA) - Florida - FL_E - counties of Brevard; Broward; Clay; Collier; Dade; Duval; Flagler; Glades; Hendry; Highlands; Indian River; Lake; Martin; Monroe; Nassau; Okeechobee; Orange; Osceola; Palm Beach; Putnam; Seminole; St. Johns; St. Lucie","projected 2D","","","East","North","X","Y","9003","","4267","10901","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_669[] = {"26759","NAD27 / Florida West","","","","United States (USA) - Florida - FL_W - counties of Charlotte; Citrus; De Soto; Hardee; Hernando; Hillsborough; Lee; Levy; Manatee; Marion; Pasco; Pinellas; Polk; Sarasota; Sumter","projected 2D","","","East","North","X","Y","9003","","4267","10902","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_670[] = {"26760","NAD27 / Florida North","","","","United States (USA) - Florida - FL_N - counties of Alachua; Baker; Bay; Bradford; Calhoun; Columbia; Dixie; Escambia; Escambia; Franklin; Gadsden; Gilchrist; Gulf; Hamilton; Holmes; Jackson; Jefferson; Lafayette; Leon; Liberty; Madison; Okaloosa; Santa Ros","projected 2D","","","East","North","X","Y","9003","","4267","10903","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_671[] = {"26766","NAD27 / Georgia East","","","","United States (USA) - Georgia - GA_E - counties of Appling; Atkinson; Bacon; Baldwin; Brantley; Bryan; Bulloch; Burke; Camden; Candler; Charlton; Chatham; Clinch; Coffee; Columbia; Dodge; Echols; Effingham; Elbert; Emanuel; Evans; Franklin; Glascock; Glynn","projected 2D","","","East","North","X","Y","9003","","4267","11001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_672[] = {"26767","NAD27 / Georgia West","","","","United States (USA) - Georgia - GA_W - counties of Baker; Banks; Barrow; Bartow; Ben Hill; Berrien; Bibb; Bleckley; Brooks; Butts; Calhoun; Carroll; Catoosa; Chattahoochee; Chattooga; Cherokee; Clarke; Clay; Clayton; Cobb; Colquitt; Cook; Coweta; Crawford;","projected 2D","","","East","North","X","Y","9003","","4267","11002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_673[] = {"26768","NAD27 / Idaho East","","","","United States (USA) - Idaho - ID_E - counties of Bannock; Bear Lake; Bingham; Bonneville; Caribou; Clark; Franklin; Fremont; Jefferson; Madison; Oneida; Power; Teton","projected 2D","","","East","North","X","Y","9003","","4267","11101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_674[] = {"26769","NAD27 / Idaho Central","","","","United States (USA) - daho - ID_C - counties of Blaine; Butte; Camas; Cassia; Custer; Gooding; Jerome; Lemhi; Lincoln; Minidoka; Twin Falls","projected 2D","","","East","North","X","Y","9003","","4267","11102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_675[] = {"26770","NAD27 / Idaho West","","","","United States (USA) - Idaho - ID_W - counties of Ada; Adams; Benewah; Boise; Bonner; Boundary; Canyon; Clearwater; Elmore; Gem; Idaho; Kootenai; Latah; Lewis; Nez Perce; Owyhee; Payette; Shoshone; Valley; Washington","projected 2D","","","East","North","X","Y","9003","","4267","11103","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_676[] = {"26771","NAD27 / Illinois East","","","","United States (USA) - Illinois - IL_E - counties of Boone; Champaign; Clark; Clay; Coles; Cook; Crawford; Cumberland; De Kalb; De Witt; Douglas; Du Page; Edgar; Edwards; Effingham; Fayette; Ford; Franklin; Gallatin; Grundy; Hamilton; Hardin; Iroquois; Jasp","projected 2D","","","East","North","X","Y","9003","","4267","11201","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_677[] = {"26772","NAD27 / Illinois West","","","","United States (USA) - Illinois - IL_W - counties of Adams; Alexander; Bond; Brown; Bureau; Calhoun; Carroll; Cass; Christian; Clinton; Fulton; Greene; Hancock; Henderson; Henry; Jackson; Jersey; Jo Daviess; Knox; Lee; Logan; Macoupin; Madison; Marshall; Ma","projected 2D","","","East","North","X","Y","9003","","4267","11202","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_678[] = {"26773","NAD27 / Indiana East","","","","United States (USA) - Indiana - IN_E - counties of Adams; Allen; Bartholomew; Blackford; Brown; Cass; Clark; De Kalb; Dearborn; Decatur; Delaware; Elkhart; Fayette; Floyd; Franklin; Fulton; Grant; Hamilton; Hancock; Harrison; Henry; Howard; Huntington; Jac","projected 2D","","","East","North","X","Y","9003","","4267","11301","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_679[] = {"26774","NAD27 / Indiana West","","","","United States (USA) - Indiana - IN_W - counties of Benton; Boone; Carroll; Clay; Clinton; Crawford; Daviess; Dubois; Fountain; Gibson; Greene; Hendricks; Jasper; Knox; La Porte; Lake; Lawrence; Martin; Monroe; Montgomery; Morgan; Newton; Orange; Owen; Park","projected 2D","","","East","North","X","Y","9003","","4267","11302","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_680[] = {"26775","NAD27 / Iowa North","","","","United States (USA) - Iowa - IA_N - counties of Allamakee; Benton; Black Hawk; Boone; Bremer; Buchanan; Buena Vista; Butler; Calhoun; Carroll; Cerro Gordo; Cherokee; Chickasaw; Clay; Clayton; Crawford; Delaware; Dickinson; Dubuque; Emmet; Fayette; Floyd; F","projected 2D","","","East","North","X","Y","9003","","4267","11401","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_681[] = {"26776","NAD27 / Iowa South","","","","United States (USA) - Iowa - IA_S - counties of Adair; Adams; Appanoose; Audubon; Cass; Cedar; Clarke; Clinton; Dallas; Davis; Decatur; Des Moines; Fremont; Guthrie; Harrison; Henry; Iowa; Jasper; Jefferson; Johnson; Keokuk; Lee; Louisa; Lucas; Madison; Ma","projected 2D","","","East","North","X","Y","9003","","4267","11402","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_682[] = {"26777","NAD27 / Kansas North","","","","United States (USA) - Kansas - KS_N - counties of Atchison; Brown; Cheyenne; Clay; Cloud; Decatur; Dickinson; Doniphan; Douglas; Ellis; Ellsworth; Geary; Gove; Graham; Jackson; Jefferson; Jewell; Johnson; Leavenworth; Lincoln; Logan; Marshall; Mitchell; Mo","projected 2D","","","East","North","X","Y","9003","","4267","11501","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_683[] = {"26778","NAD27 / Kansas South","","","","United States (USA) - Kansas - KS_S - counties of Allen; Anderson; Barber; Barton; Bourbon; Butler; Chase; Chautauqua; Cherokee; Clark; Coffey; Comanche; Cowley; Crawford; Edwards; Elk; Finney; Ford; Franklin; Grant; Gray; Greeley; Greenwood; Hamilton; Har","projected 2D","","","East","North","X","Y","9003","","4267","11502","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_684[] = {"26779","NAD27 / Kentucky North","","","","United States (USA) - Kentucky - KY_N - counties of Anderson; Bath; Boone; Bourbon; Boyd; Bracken; Bullitt; Campbell; Carroll; Carter; Clark; Elliott; Fayette; Fleming; Franklin; Gallatin; Grant; Greenup; Harrison; Henry; Jefferson; Jessamine; Kenton; Lawr","projected 2D","","","East","North","X","Y","9003","","4267","11601","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_685[] = {"26780","NAD27 / Kentucky South","","","","United States (USA) - Kentucky - KY_S - counties of Adair; Allen; Ballard; Barren; Bell; Boyle; Breathitt; Breckinridge; Butler; Caldwell; Calloway; Carlisle; Casey; Christian; Clay; Clinton; Crittenden; Cumberland; Daviess; Edmonson; Estill; Floyd; Fulton","projected 2D","","","East","North","X","Y","9003","","4267","11602","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_686[] = {"26781","NAD27 / Louisiana North","","","","United States (USA) - Louisiana - LA_N - counties of Avoyelles; Bienville; Bossier; Caddo; Caldwell; Catahoula; Claiborne; Concordia; De Soto; East Carroll; Franklin; Grant; Jackson; La Salle; Lincoln; Madison; Morehouse; Natchitoches; Ouachita; Rapides; R","projected 2D","","","East","North","X","Y","9003","","4267","11701","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_687[] = {"26782","NAD27 / Louisiana South","","","","United States (USA) - Louisiana - LA_S - counties of Acadia; Allen; Ascension; Assumption; Beauregard; Calcasieu; Cameron; East Baton Rouge; East Feliciana; Evangeline; Iberia; Iberville; Jefferson; Jefferson Davis; Lafayette; LaFourche; Livingston; Orlean","projected 2D","","","East","North","X","Y","9003","","4267","11702","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_688[] = {"26783","NAD27 / Maine East","","","","United States (USA) - Maine - ME_E - counties of Aroostook; Hancock; Knox; Penobscot; Piscataquis; Waldo; Washington","projected 2D","","","East","North","X","Y","9003","","4267","11801","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_689[] = {"26784","NAD27 / Maine West","","","","United States (USA) - Maine - ME_W - counties of Androscoggin; Cumberland; Franklin; Kennebec; Lincoln; Oxford; Sagadahoc; Somerset; York","projected 2D","","","East","North","X","Y","9003","","4267","11802","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_690[] = {"26785","NAD27 / Maryland","","","","United States (USA) - Maryland -MD - counties of Allegany; Anne Arundel; Baltimore; Calvert; Caroline; Carroll; Cecil; Charles; Dorchester; Frederick; Garrett; Harford; Howard; Kent; Montgomery; Prince Georges; Queen Annes; Somerset; St. Marys; Talbot; Was","projected 2D","","","East","North","X","Y","9003","","4267","11900","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_691[] = {"26786","NAD27 / Massachusetts Mainland","NAD27 / Massachusetts","","","United States (USA) - Massachusetts - MA_M - counties of Barnstable; Berkshire; Bristol; Essex; Franklin; Hampden; Hampshire; Middlesex; Norfolk; Plymouth; Suffolk; Worcester","projected 2D","","","East","North","X","Y","9003","","4267","12001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_692[] = {"26787","NAD27 / Massachusetts Island","NAD27 / Massachusetts Is","","","United States (USA) - Massachusetts - MA_I - counties of Dukes; Nantucket","projected 2D","","","East","North","X","Y","9003","","4267","12002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_693[] = {"26791","NAD27 / Minnesota North","","","","United States (USA) - Minnesota - MN_N - counties of Beltrami; Clearwater; Cook; Itasca; Kittson; Koochiching; Lake; Lake of the Woods; Mahnomen; Marshall; Norman; Pennington; Polk; Red Lake; Roseau; St. Louis","projected 2D","","","East","North","X","Y","9003","","4267","12201","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_694[] = {"26792","NAD27 / Minnesota Central","NAD27 / Minnesota Cent.","","","United States (USA) - Minnesota - MN_C - counties of Aitkin; Becker; Benton; Carlton; Cass; Chisago; Clay; Crow Wing; Douglas; Grant; Hubbard; Isanti; Kanabec; Mille Lacs; Morrison; Otter Tail; Pine; Pope; Stearns; Stevens; Todd; Traverse; Wadena; Wilkin","projected 2D","","","East","North","X","Y","9003","","4267","12202","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_695[] = {"26793","NAD27 / Minnesota South","","","","United States (USA) - Minnesota - MN_S - counties of Anoka; Big Stone; Blue Earth; Brown; Carver; Chippewa; Cottonwood; Dakota; Dodge; Faribault; Fillmore; Freeborn; Goodhue; Hennepin; Houston; Jackson; Kandiyohi; Lac Qui Parle; Le Sueur; Lincoln; Lyon; Ma","projected 2D","","","East","North","X","Y","9003","","4267","12203","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_696[] = {"26794","NAD27 / Mississippi East","","","","United States (USA) - Mississippi - MS_E - counties of Alcorn; Attala; Benton; Calhoun; Chickasaw; Choctaw; Clarke; Clay; Covington; Forrest; George; Greene; Hancock; Harrison; Itawamba; Jackson; Jasper; Jones; Kemper; Lafayette; Lamar; Lauderdale; Leake; ","projected 2D","","","East","North","X","Y","9003","","4267","12301","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_697[] = {"26795","NAD27 / Mississippi West","","","","United States (USA) - Mississippi - MS_W - counties of Adams; Amite; Bolivar; Carroll; Claiborne; Coahoma; Copiah; De Soto; Franklin; Grenada; Hinds; Holmes; Humphreys; Issaquena; Jefferson; Jefferson Davis; Lawrence; Leflore; Lincoln; Madison; Marion; Mon","projected 2D","","","East","North","X","Y","9003","","4267","12302","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_698[] = {"26796","NAD27 / Missouri East","","","","United States (USA) - Missouri - MO_E - counties of Bollinger; Butler; Cape Girardeau; Carter; Clark; Crawford; Dent; Dunklin; Franklin; Gasconade; Iron; Jefferson; Lewis; Lincoln; Madison; Marion; Mississippi; Montgomery; New Madrid; Oregon; Pemiscot; Per","projected 2D","","","East","North","X","Y","9003","","4267","12401","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_699[] = {"26797","NAD27 / Missouri Central","","","","United States (USA) - Missouri - MO_C - counties of Adair; Audrain; Benton; Boone; Callaway; Camden; Carroll; Chariton; Christian; Cole; Cooper; Dallas; Douglas; Greene; Grundy; Hickory; Howard; Howell; Knox; Laclede; Linn; Livingston; Macon; Maries; Merce","projected 2D","","","East","North","X","Y","9003","","4267","12402","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_700[] = {"26798","NAD27 / Missouri West","","","","United States (USA) - Missouri - MO_W - counties of Andrew; Atchison; Barry; Barton; Bates; Buchanan; Caldwell; Cass; Cedar; Clay; Clinton; Dade; Daviess; De Kalb; Gentry; Harrison; Henry; Holt; Jackson; Jasper; Johnson; Lafayette; Lawrence; McDonald; Newt","projected 2D","","","East","North","X","Y","9003","","4267","12403","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_701[] = {"26801","NAD Michigan / Michigan East","NAD27 / Michigan East","","","United States (USA) - Michigan - MI_E - counties of Alcona; Alpena; Arenac; Bay; Cheboygan; Clinton; Crawford; Genesee; Gladwin; Gratiot; Hillsdale; Huron; Ingham; Iosco; Jackson; Lapeer; Lenawee; Livingston; Macomb; Midland; Monroe; Montmorency; Oakland; ","projected 2D","","","East","North","X","Y","9003","","4268","12101","1998-11-11 00:00:00","","EPSG","Superseded by 26811 2681 [...]
+datafile_rows_t horiz_cs_row_702[] = {"26802","NAD Michigan / Michigan Old Central","NAD27 / Michigan Old Cen","","","United States (USA) - Michigan - MI_C - counties of Allegan; Antrim; Barry; Benzie; Berrien; Branch; Calhoun; Cass; Charlevoix; Clare; Eaton; Emmet; Grand Traverse; Ionia; Isabella; Kalamazoo; Kalkaska; Kent; Lake; Leelanau; Manistee; Mason; Mecosta; Missa","projected 2D","","","East","North","X","Y","9003","","4268","12102","1998-11-11 00:00:00","","EPSG","Superseded by [...]
+datafile_rows_t horiz_cs_row_703[] = {"26803","NAD Michigan / Michigan West","NAD27 / Michigan West","","","United States (USA) - Michigan - MI_W - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft","projected 2D","","","East","North","X","Y","9003","","4268","12103","1998-11-11 00:00:00","","EPSG","Superseded by 26811 26812 and 26813.","95.25 97.19 98.22",NULL};
+datafile_rows_t horiz_cs_row_704[] = {"26811","NAD Michigan / Michigan North","NAD27 / Michigan North","","","United States (USA) - Michigan - MI_N - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft","projected 2D","","","East","North","X","Y","9003","","4268","12111","1998-11-11 00:00:00","","EPSG","Supersedes 26801 26802 and 26803.","96.28 98.22",NULL};
+datafile_rows_t horiz_cs_row_705[] = {"26812","NAD Michigan / Michigan Central","NAD27 / Michigan Central","","","United States (USA) - Michigan - MI_C - counties of Alcona; Alpena; Antrim; Arenac; Benzie; Charlevoix; Cheboygan; Clare; Crawford; Emmet; Gladwin; Grand Traverse; Iosco; Kalkaska; Lake; Leelanau; Manistee; Mason; Missaukee; Montmorency; Ogemaw; Osceola; O","projected 2D","","","East","North","X","Y","9003","","4268","12112","1998-11-11 00:00:00","","EPSG","Supersedes 26801 2 [...]
+datafile_rows_t horiz_cs_row_706[] = {"26813","NAD Michigan / Michigan South","NAD27 / Michigan South","","","United States (USA) - Michigan - MI_S - counties of Allegan; Barry; Bay; Berrien; Branch; Calhoun; Cass; Clinton; Eaton; Genesee; Gratiot; Hillsdale; Huron; Ingham; Ionia; Isabella; Jackson; Kalamazoo; Kent; Lapeer; Lenawee; Livingston; Macomb; Mecosta; Mi","projected 2D","","","East","North","X","Y","9003","","4268","12113","1998-11-11 00:00:00","","EPSG","Supersedes 26801 26802 [...]
+datafile_rows_t horiz_cs_row_707[] = {"26903","NAD83 / UTM zone 3N","","","","North America - United States (USA) - Alaska - 168deg West to 162deg West.","projected 2D","","","East","North","E","N","9001","","4269","16003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_708[] = {"26904","NAD83 / UTM zone 4N","","","","North America - United States (USA) - Alaska - 162deg West to 156deg West.","projected 2D","","","East","North","E","N","9001","","4269","16004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_709[] = {"26905","NAD83 / UTM zone 5N","","","","North America - United States (USA) - Alaska - 156deg West to 150deg West.","projected 2D","","","East","North","E","N","9001","","4269","16005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_710[] = {"26906","NAD83 / UTM zone 6N","","","","North America - United States (USA) - Alaska - 150deg West to 144deg West.","projected 2D","","","East","North","E","N","9001","","4269","16006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_711[] = {"26907","NAD83 / UTM zone 7N","","","","North America - Canada; United States (USA) - Alaska - 144deg West to 138deg West.","projected 2D","","","East","North","E","N","9001","","4269","16007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_712[] = {"26908","NAD83 / UTM zone 8N","","","","North America - Canada; United States (USA) - 138deg West to 132deg West.","projected 2D","","","East","North","E","N","9001","","4269","16008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_713[] = {"26909","NAD83 / UTM zone 9N","","","","North America - Canada; United States (USA) - 132deg West to 126deg West.","projected 2D","","","East","North","E","N","9001","","4269","16009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_714[] = {"26910","NAD83 / UTM zone 10N","","","","North America - Canada; United States (USA) - 130deg West to 120deg West.","projected 2D","","","East","North","E","N","9001","","4269","16010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_715[] = {"26911","NAD83 / UTM zone 11N","","","","North America - Canada; Mexico; United States (USA) - 120deg West to 114deg West.","projected 2D","","","East","North","E","N","9001","","4269","16011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_716[] = {"26912","NAD83 / UTM zone 12N","","","","North America - Canada; Mexico; United States (USA) - 114deg West to 108deg West.","projected 2D","","","East","North","E","N","9001","","4269","16012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_717[] = {"26913","NAD83 / UTM zone 13N","","","","North America - Canada; Mexico; United States (USA) - 108deg West to 102deg West.","projected 2D","","","East","North","E","N","9001","","4269","16013","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_718[] = {"26914","NAD83 / UTM zone 14N","","","","North America - Canada; Mexico; United States (USA) - 102deg West to 96deg West.","projected 2D","","","East","North","E","N","9001","","4269","16014","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_719[] = {"26915","NAD83 / UTM zone 15N","","","","North America - Canada; Mexico; United States (USA) - 96deg West to 90deg West.","projected 2D","","","East","North","E","N","9001","","4269","16015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_720[] = {"26916","NAD83 / UTM zone 16N","","","","North America - Canada; Mexico; United States (USA) - 90deg West to 84deg West.","projected 2D","","","East","North","E","N","9001","","4269","16016","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_721[] = {"26917","NAD83 / UTM zone 17N","","","","North America - Canada; Mexico; United States (USA) - 84deg West to 78deg West.","projected 2D","","","East","North","E","N","9001","","4269","16017","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_722[] = {"26918","NAD83 / UTM zone 18N","","","","North America - Canada; United States (USA) - 78deg West to 72deg West.","projected 2D","","","East","North","E","N","9001","","4269","16018","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_723[] = {"26919","NAD83 / UTM zone 19N","","","","North America - Canada; United States (USA) - 72deg West to 66deg West.","projected 2D","","","East","North","E","N","9001","","4269","16019","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_724[] = {"26920","NAD83 / UTM zone 20N","","","","North America - Canada; United States (USA) offshore Atlantic - 66deg West to 60deg West.","projected 2D","","","East","North","E","N","9001","","4269","16020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_725[] = {"26921","NAD83 / UTM zone 21N","","","","North America - Canada - 60deg West to 54deg West.","projected 2D","","","East","North","E","N","9001","","4269","16021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_726[] = {"26922","NAD83 / UTM zone 22N","","","","North America - Canada - Newfoundland - 54deg West to 48deg West.","projected 2D","","","East","North","E","N","9001","","4269","16022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_727[] = {"26923","NAD83 / UTM zone 23N","","","","North America - Canada offshore Atlantic - 48deg West to 42deg West.","projected 2D","","","East","North","E","N","9001","","4269","16023","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_728[] = {"26929","NAD83 / Alabama East","","","","United States (USA) - Alabama - AL_E - counties east of approx 86d 37m West - Barbour; Bullock; Calhoun; Chambers; Cherokee; Clay; Cleburne; Coffee; Coosa; Covington; Crenshaw; Dale; De Kalb; Elmore; Etowah; Geneva; Henry; Houston; Jackson; Lee; Macon; Mad","projected 2D","","","East","North","X","Y","9001","","4269","10131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_729[] = {"26930","NAD83 / Alabama West","","","","United States (USA) - Alabama - AL_W - counties west of approx 86d 37m West - Autauga; Baldwin; Bibb; Blount; Butler; Chilton; Choctaw; Clarke; Colbert; Conecuh; Cullman; Dallas; Escambia; Fayette; Franklin; Greene; Hale; Jefferson; Lamar; Lauderdale; Lawr","projected 2D","","","East","North","X","Y","9001","","4269","10132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_730[] = {"26931","NAD83 / Alaska zone 1","","","","United States - Alaska - Panhandle.","projected 2D","","","East","North","X","Y","9001","","4269","15031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_731[] = {"26932","NAD83 / Alaska zone 2","","","","United States - Alaska - 141deg to 144deg West.","projected 2D","","","East","North","X","Y","9001","","4269","15032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_732[] = {"26933","NAD83 / Alaska zone 3","","","","United States - Alaska - 144deg to 148deg West.","projected 2D","","","East","North","X","Y","9001","","4269","15033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_733[] = {"26934","NAD83 / Alaska zone 4","","","","United States - Alaska - 148deg to 152deg West.","projected 2D","","","East","North","X","Y","9001","","4269","15034","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_734[] = {"26935","NAD83 / Alaska zone 5","","","","United States - Alaska - 152deg to 156deg West.","projected 2D","","","East","North","X","Y","9001","","4269","15035","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_735[] = {"26936","NAD83 / Alaska zone 6","","","","United States - Alaska - 156deg to 160deg West.","projected 2D","","","East","North","X","Y","9001","","4269","15036","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_736[] = {"26937","NAD83 / Alaska zone 7","","","","United States - Alaska - 160deg to 164deg West.","projected 2D","","","East","North","X","Y","9001","","4269","15037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_737[] = {"26938","NAD83 / Alaska zone 8","","","","United States - Alaska - 164deg to 168deg West north of 54d 30m North.","projected 2D","","","East","North","X","Y","9001","","4269","15038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_738[] = {"26939","NAD83 / Alaska zone 9","","","","United States - Alaska - west of 168deg West and north of 54d 30m North.","projected 2D","","","East","North","X","Y","9001","","4269","15039","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_739[] = {"26940","NAD83 / Alaska zone 10","","","","United States - Alaska - Aleutian Islands.","projected 2D","","","East","North","X","Y","9001","","4269","15040","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_740[] = {"26941","NAD83 / California zone 1","NAD83 / California 1","","","United States (USA) - California - CA_1 - counties north of approx 40 deg North - Del Norte; Humboldt; Lassen; Modoc; Plumas; Shasta; Siskiyou; Tehama; Trinity","projected 2D","","","East","North","X","Y","9001","","4269","10431","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_741[] = {"26942","NAD83 / California zone 2","NAD83 / California 2","","","United States (USA) - California - CA_2 - counties between approx 40 deg & 38d 15m North - Alpine; Amador; Butte; Colusa; El Dorado; Glenn; Lake; Mendocino; Napa; Nevada; Placer; Sacramento; Sierra; Solano; Sonoma; Sutter; Yolo; Yuba","projected 2D","","","East","North","X","Y","9001","","4269","10432","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_742[] = {"26943","NAD83 / California zone 3","NAD83 / California 3","","","United States (USA) - California - CA_3 - counties between approx 38d 15m & 37d North - Alameda; Calaveras; Contra Costa; Madera; Marin; Mariposa; Merced; Mono; San Francisco; San Joaquin; San Mateo; Santa Clara; Santa Cruz; Stanislaus; Tuolumne","projected 2D","","","East","North","X","Y","9001","","4269","10433","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_743[] = {"26944","NAD83 / California zone 4","NAD83 / California 4","","","United States (USA) - California - CA_4 - counties between approx 37d & 35d 30m North - Fresno; Inyo; Kings; Monterey; San Benito; Tulare","projected 2D","","","East","North","X","Y","9001","","4269","10434","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_744[] = {"26945","NAD83 / California zone 5","NAD83 / California 5","","","United States (USA) - California - CA_5 - counties between approx 35d 50m & 34d North - Kern; Los Angeles; San Bernardino; San Luis Obispo; Santa Barbara; Ventura","projected 2D","","","East","North","X","Y","9001","","4269","10435","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_745[] = {"26946","NAD83 / California zone 6","NAD83 / California 6","","","United States (USA) - California - CA_6 - counties south of approx 38d 30m North - Imperial; Orange; Riverside; San Diego","projected 2D","","","East","North","X","Y","9001","","4269","10436","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_746[] = {"26948","NAD83 / Arizona East","","","","United States (USA) - Arizona - AZ_E - counties east of approx 110d 45m West - Apache; Cochise; Gila; Graham; Greenlee; Navajo","projected 2D","","","East","North","X","Y","9001","","4269","10231","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_747[] = {"26949","NAD83 / Arizona Central","","","","United States (USA) - Arizona - AZ_C - counties between approx 110d 45m and 113d 20m West - Coconino; Maricopa; Pima; Pinal; Santa Cruz; Yavapai","projected 2D","","","East","North","X","Y","9001","","4269","10232","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_748[] = {"26950","NAD83 / Arizona West","","","","United States (USA) - Arizona - AZ_W - counties west of approx 113d 20m West - La Paz; Mohave; Yuma","projected 2D","","","East","North","X","Y","9001","","4269","10233","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_749[] = {"26951","NAD83 / Arkansas North","","","","United States (USA) - Arkansas - AR_N - counties north of approx 34d 50m North - Baxter; Benton; Boone; Carroll; Clay; Cleburne; Conway; Craighead; Crawford; Crittenden; Cross; Faulkner; Franklin; Fulton; Greene; Independence; Izard; Jackson; Johnson; Lawr","projected 2D","","","East","North","X","Y","9001","","4269","10331","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_750[] = {"26952","NAD83 / Arkansas South","","","","United States (USA) - Arkansas - AR_S - counties south of approx 34d 50m North - Arkansas; Ashley; Bradley; Calhoun; Chicot; Clark; Cleveland; Columbia; Dallas; Desha; Drew; Garland; Grant; Hempstead; Hot Spring; Howard; Jefferson; Lafayette; Lee; Lincoln;","projected 2D","","","East","North","X","Y","9001","","4269","10332","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_751[] = {"26953","NAD83 / Colorado North","","","","United States (USA) - Colorado - CO_N - counties north of approx 39d 50m North - Adams; Boulder; Gilpin; Grand; Jackson; Larimer; Logan; Moffat; Morgan; Phillips; Rio Blanco; Routt; Sedgwick; Washington; Weld; Yuma","projected 2D","","","East","North","X","Y","9001","","4269","10531","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_752[] = {"26954","NAD83 / Colorado Central","","","","United States (USA) - Colorado - CO_C - counties between approx 39d 50m & 38d 30m North - Arapahoe; Chaffee; Cheyenne; Clear Creek; Delta; Denver; Douglas; Eagle; El Paso; Elbert; Fremont; Garfield; Gunnison; Jefferson; Kit Carson; Lake; Lincoln; Mesa; Par","projected 2D","","","East","North","X","Y","9001","","4269","10532","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_753[] = {"26955","NAD83 / Colorado South","","","","United States (USA) - Colorado - CO_S - counties south of approx 38d 30m North - Alamosa; Archuleta; Baca; Bent; Conejos; Costilla; Crowley; Custer; Dolores; Hinsdale; Huerfano; Kiowa; La Plata; Las Animas; Mineral; Montezuma; Montrose; Otero; Ouray; Prowe","projected 2D","","","East","North","X","Y","9001","","4269","10533","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_754[] = {"26956","NAD83 / Connecticut","","","","United States (USA) - Connecticut - CT - counties of Fairfield; Hartford; Litchfield; Middlesex; New Haven; New London; Tolland; Windham","projected 2D","","","East","North","X","Y","9001","","4269","10630","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_755[] = {"26957","NAD83 / Delaware","","","","United States (USA) - Delaware - DE - counties of Kent; New Castle; Sussex","projected 2D","","","East","North","X","Y","9001","","4269","10730","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_756[] = {"26958","NAD83 / Florida East","","","","United States (USA) - Florida - FL_E - counties of Brevard; Broward; Clay; Collier; Dade; Duval; Flagler; Glades; Hendry; Highlands; Indian River; Lake; Martin; Monroe; Nassau; Okeechobee; Orange; Osceola; Palm Beach; Putnam; Seminole; St. Johns; St. Lucie","projected 2D","","","East","North","X","Y","9001","","4269","10931","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_757[] = {"26959","NAD83 / Florida West","","","","United States (USA) - Florida - FL_W - counties of Charlotte; Citrus; De Soto; Hardee; Hernando; Hillsborough; Lee; Levy; Manatee; Marion; Pasco; Pinellas; Polk; Sarasota; Sumter","projected 2D","","","East","North","X","Y","9001","","4269","10932","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_758[] = {"26960","NAD83 / Florida North","","","","United States (USA) - Florida - FL_N - counties of Alachua; Baker; Bay; Bradford; Calhoun; Columbia; Dixie; Escambia; Escambia; Franklin; Gadsden; Gilchrist; Gulf; Hamilton; Holmes; Jackson; Jefferson; Lafayette; Leon; Liberty; Madison; Okaloosa; Santa Ros","projected 2D","","","East","North","X","Y","9001","","4269","10933","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_759[] = {"26961","NAD83 / Hawaii zone 1","","","","United States - Hawaii - island of Hawaii.","projected 2D","","","East","North","X","Y","9001","","4269","15131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_760[] = {"26962","NAD83 / Hawaii zone 2","","","","United States - Hawaii - Maui; Kahoolawe; Lanai; Molokai.","projected 2D","","","East","North","X","Y","9001","","4269","15132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_761[] = {"26963","NAD83 / Hawaii zone 3","","","","United States - Hawaii - Oahu.","projected 2D","","","East","North","X","Y","9001","","4269","15133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_762[] = {"26964","NAD83 / Hawaii zone 4","","","","United States - Hawaii - Kauai.","projected 2D","","","East","North","X","Y","9001","","4269","15134","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_763[] = {"26965","NAD83 / Hawaii zone 5","","","","United States - Hawaii - Niihau.","projected 2D","","","East","North","X","Y","9001","","4269","15135","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_764[] = {"26966","NAD83 / Georgia East","","","","United States (USA) - Georgia - GA_E - counties of Appling; Atkinson; Bacon; Baldwin; Brantley; Bryan; Bulloch; Burke; Camden; Candler; Charlton; Chatham; Clinch; Coffee; Columbia; Dodge; Echols; Effingham; Elbert; Emanuel; Evans; Franklin; Glascock; Glynn","projected 2D","","","East","North","X","Y","9001","","4269","11031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_765[] = {"26967","NAD83 / Georgia West","","","","United States (USA) - Georgia - GA_W - counties of Baker; Banks; Barrow; Bartow; Ben Hill; Berrien; Bibb; Bleckley; Brooks; Butts; Calhoun; Carroll; Catoosa; Chattahoochee; Chattooga; Cherokee; Clarke; Clay; Clayton; Cobb; Colquitt; Cook; Coweta; Crawford;","projected 2D","","","East","North","X","Y","9001","","4269","11032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_766[] = {"26968","NAD83 / Idaho East","","","","United States (USA) - Idaho - ID_E - counties of Bannock; Bear Lake; Bingham; Bonneville; Caribou; Clark; Franklin; Fremont; Jefferson; Madison; Oneida; Power; Teton","projected 2D","","","East","North","X","Y","9001","","4269","11131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_767[] = {"26969","NAD83 / Idaho Central","","","","United States (USA) - Idaho - ID_C - counties of Blaine; Butte; Camas; Cassia; Custer; Gooding; Jerome; Lemhi; Lincoln; Minidoka; Twin Falls","projected 2D","","","East","North","X","Y","9001","","4269","11132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_768[] = {"26970","NAD83 / Idaho West","","","","United States (USA) - Idaho - ID_W - counties of Ada; Adams; Benewah; Boise; Bonner; Boundary; Canyon; Clearwater; Elmore; Gem; Idaho; Kootenai; Latah; Lewis; Nez Perce; Owyhee; Payette; Shoshone; Valley; Washington","projected 2D","","","East","North","X","Y","9001","","4269","11133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_769[] = {"26971","NAD83 / Illinois East","","","","United States (USA) - Illinois - IL_E - counties of Boone; Champaign; Clark; Clay; Coles; Cook; Crawford; Cumberland; De Kalb; De Witt; Douglas; Du Page; Edgar; Edwards; Effingham; Fayette; Ford; Franklin; Gallatin; Grundy; Hamilton; Hardin; Iroquois; Jasp","projected 2D","","","East","North","X","Y","9001","","4269","11231","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_770[] = {"26972","NAD83 / Illinois West","","","","United States (USA) - Illinois - IL_W - counties of Adams; Alexander; Bond; Brown; Bureau; Calhoun; Carroll; Cass; Christian; Clinton; Fulton; Greene; Hancock; Henderson; Henry; Jackson; Jersey; Jo Daviess; Knox; Lee; Logan; Macoupin; Madison; Marshall; Ma","projected 2D","","","East","North","X","Y","9001","","4269","11232","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_771[] = {"26973","NAD83 / Indiana East","","","","United States (USA) - Indiana - IN_E - counties of Adams; Allen; Bartholomew; Blackford; Brown; Cass; Clark; De Kalb; Dearborn; Decatur; Delaware; Elkhart; Fayette; Floyd; Franklin; Fulton; Grant; Hamilton; Hancock; Harrison; Henry; Howard; Huntington; Jac","projected 2D","","","East","North","X","Y","9001","","4269","11331","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_772[] = {"26974","NAD83 / Indiana West","","","","United States (USA) - Indiana - IN_W - counties of Benton; Boone; Carroll; Clay; Clinton; Crawford; Daviess; Dubois; Fountain; Gibson; Greene; Hendricks; Jasper; Knox; La Porte; Lake; Lawrence; Martin; Monroe; Montgomery; Morgan; Newton; Orange; Owen; Park","projected 2D","","","East","North","X","Y","9001","","4269","11332","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_773[] = {"26975","NAD83 / Iowa North","","","","United States (USA) - Iowa - IA_N - counties of Allamakee; Benton; Black Hawk; Boone; Bremer; Buchanan; Buena Vista; Butler; Calhoun; Carroll; Cerro Gordo; Cherokee; Chickasaw; Clay; Clayton; Crawford; Delaware; Dickinson; Dubuque; Emmet; Fayette; Floyd; F","projected 2D","","","East","North","X","Y","9001","","4269","11431","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_774[] = {"26976","NAD83 / Iowa South","","","","United States (USA) - Iowa - IA_S - counties of Adair; Adams; Appanoose; Audubon; Cass; Cedar; Clarke; Clinton; Dallas; Davis; Decatur; Des Moines; Fremont; Guthrie; Harrison; Henry; Iowa; Jasper; Jefferson; Johnson; Keokuk; Lee; Louisa; Lucas; Madison; Ma","projected 2D","","","East","North","X","Y","9001","","4269","11432","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_775[] = {"26977","NAD83 / Kansas North","","","","United States (USA) - Kansas - KS_N - counties of Atchison; Brown; Cheyenne; Clay; Cloud; Decatur; Dickinson; Doniphan; Douglas; Ellis; Ellsworth; Geary; Gove; Graham; Jackson; Jefferson; Jewell; Johnson; Leavenworth; Lincoln; Logan; Marshall; Mitchell; Mo","projected 2D","","","East","North","X","Y","9001","","4269","11531","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_776[] = {"26978","NAD83 / Kansas South","","","","United States (USA) - Kansas - KS_S - counties of Allen; Anderson; Barber; Barton; Bourbon; Butler; Chase; Chautauqua; Cherokee; Clark; Coffey; Comanche; Cowley; Crawford; Edwards; Elk; Finney; Ford; Franklin; Grant; Gray; Greeley; Greenwood; Hamilton; Har","projected 2D","","","East","North","X","Y","9001","","4269","11532","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_777[] = {"26979","NAD83 / Kentucky North","","","","United States (USA) - Kentucky - KY_N - counties of Anderson; Bath; Boone; Bourbon; Boyd; Bracken; Bullitt; Campbell; Carroll; Carter; Clark; Elliott; Fayette; Fleming; Franklin; Gallatin; Grant; Greenup; Harrison; Henry; Jefferson; Jessamine; Kenton; Lawr","projected 2D","","","East","North","X","Y","9001","","4269","11631","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_778[] = {"26980","NAD83 / Kentucky South","","","","United States (USA) - Kentucky - KY_S - counties of Adair; Allen; Ballard; Barren; Bell; Boyle; Breathitt; Breckinridge; Butler; Caldwell; Calloway; Carlisle; Casey; Christian; Clay; Clinton; Crittenden; Cumberland; Daviess; Edmonson; Estill; Floyd; Fulton","projected 2D","","","East","North","X","Y","9001","","4269","11632","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_779[] = {"26981","NAD83 / Louisiana North","","","","United States (USA) - Louisiana - LA_N - counties of Avoyelles; Bienville; Bossier; Caddo; Caldwell; Catahoula; Claiborne; Concordia; De Soto; East Carroll; Franklin; Grant; Jackson; La Salle; Lincoln; Madison; Morehouse; Natchitoches; Ouachita; Rapides; R","projected 2D","","","East","North","X","Y","9001","","4269","11731","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_780[] = {"26982","NAD83 / Louisiana South","","","","United States (USA) - Louisiana - LA_S - counties of Acadia; Allen; Ascension; Assumption; Beauregard; Calcasieu; Cameron; East Baton Rouge; East Feliciana; Evangeline; Iberia; Iberville; Jefferson; Jefferson Davis; Lafayette; LaFourche; Livingston; Orlean","projected 2D","","","East","North","X","Y","9001","","4269","11732","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_781[] = {"26983","NAD83 / Maine East","","","","United States (USA) - Maine - ME_E - counties of Aroostook; Hancock; Knox; Penobscot; Piscataquis; Waldo; Washington","projected 2D","","","East","North","X","Y","9001","","4269","11831","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_782[] = {"26984","NAD83 / Maine West","","","","United States (USA) - Maine - ME_W - counties of Androscoggin; Cumberland; Franklin; Kennebec; Lincoln; Oxford; Sagadahoc; Somerset; York","projected 2D","","","East","North","X","Y","9001","","4269","11832","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_783[] = {"26985","NAD83 / Maryland","","","","United States (USA) - Maryland -MD - counties of Allegany; Anne Arundel; Baltimore; Calvert; Caroline; Carroll; Cecil; Charles; Dorchester; Frederick; Garrett; Harford; Howard; Kent; Montgomery; Prince Georges; Queen Annes; Somerset; St. Marys; Talbot; Was","projected 2D","","","East","North","X","Y","9001","","4269","11930","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_784[] = {"26986","NAD83 / Massachusetts Mainland","NAD83 / Massachusetts","","","United States (USA) - Massachusetts - MA_M - counties of Barnstable; Berkshire; Bristol; Essex; Franklin; Hampden; Hampshire; Middlesex; Norfolk; Plymouth; Suffolk; Worcester","projected 2D","","","East","North","X","Y","9001","","4269","12031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_785[] = {"26987","NAD83 / Massachusetts Island","NAD83 / Massachusetts Is","","","United States (USA) - Massachusetts - MA_I - counties of Dukes; Nantucket","projected 2D","","","East","North","X","Y","9001","","4269","12032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_786[] = {"26988","NAD83 / Michigan North","","","","United States (USA) - Michigan - MI_N - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft","projected 2D","","","East","North","X","Y","9001","","4269","12141","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_787[] = {"26989","NAD83 / Michigan Central","","","","United States (USA) - Michigan - MI_C - counties of Alcona; Alpena; Antrim; Arenac; Benzie; Charlevoix; Cheboygan; Clare; Crawford; Emmet; Gladwin; Grand Traverse; Iosco; Kalkaska; Lake; Leelanau; Manistee; Mason; Missaukee; Montmorency; Ogemaw; Osceola; O","projected 2D","","","East","North","X","Y","9001","","4269","12142","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_788[] = {"26990","NAD83 / Michigan South","","","","United States (USA) - Michigan - MI_S - counties of Allegan; Barry; Bay; Berrien; Branch; Calhoun; Cass; Clinton; Eaton; Genesee; Gratiot; Hillsdale; Huron; Ingham; Ionia; Isabella; Jackson; Kalamazoo; Kent; Lapeer; Lenawee; Livingston; Macomb; Mecosta; Mi","projected 2D","","","East","North","X","Y","9001","","4269","12143","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_789[] = {"26991","NAD83 / Minnesota North","","","","United States (USA) - Minnesota - MN_N - counties of Beltrami; Clearwater; Cook; Itasca; Kittson; Koochiching; Lake; Lake of the Woods; Mahnomen; Marshall; Norman; Pennington; Polk; Red Lake; Roseau; St. Louis","projected 2D","","","East","North","X","Y","9001","","4269","12231","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_790[] = {"26992","NAD83 / Minnesota Central","NAD83 / Minnesota Cent.","","","United States (USA) - Minnesota - MN_C - counties of Aitkin; Becker; Benton; Carlton; Cass; Chisago; Clay; Crow Wing; Douglas; Grant; Hubbard; Isanti; Kanabec; Mille Lacs; Morrison; Otter Tail; Pine; Pope; Stearns; Stevens; Todd; Traverse; Wadena; Wilkin","projected 2D","","","East","North","X","Y","9001","","4269","12232","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_791[] = {"26993","NAD83 / Minnesota South","","","","United States (USA) - Minnesota - MN_S - counties of Anoka; Big Stone; Blue Earth; Brown; Carver; Chippewa; Cottonwood; Dakota; Dodge; Faribault; Fillmore; Freeborn; Goodhue; Hennepin; Houston; Jackson; Kandiyohi; Lac Qui Parle; Le Sueur; Lincoln; Lyon; Ma","projected 2D","","","East","North","X","Y","9001","","4269","12233","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_792[] = {"26994","NAD83 / Mississippi East","","","","United States (USA) - Mississippi - MS_E - counties of Alcorn; Attala; Benton; Calhoun; Chickasaw; Choctaw; Clarke; Clay; Covington; Forrest; George; Greene; Hancock; Harrison; Itawamba; Jackson; Jasper; Jones; Kemper; Lafayette; Lamar; Lauderdale; Leake; ","projected 2D","","","East","North","X","Y","9001","","4269","12331","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_793[] = {"26995","NAD83 / Mississippi West","","","","United States (USA) - Mississippi - MS_W - counties of Adams; Amite; Bolivar; Carroll; Claiborne; Coahoma; Copiah; De Soto; Franklin; Grenada; Hinds; Holmes; Humphreys; Issaquena; Jefferson; Jefferson Davis; Lawrence; Leflore; Lincoln; Madison; Marion; Mon","projected 2D","","","East","North","X","Y","9001","","4269","12332","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_794[] = {"26996","NAD83 / Missouri East","","","","United States (USA) - Missouri - MO_E - counties of Bollinger; Butler; Cape Girardeau; Carter; Clark; Crawford; Dent; Dunklin; Franklin; Gasconade; Iron; Jefferson; Lewis; Lincoln; Madison; Marion; Mississippi; Montgomery; New Madrid; Oregon; Pemiscot; Per","projected 2D","","","East","North","X","Y","9001","","4269","12431","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_795[] = {"26997","NAD83 / Missouri Central","","","","United States (USA) - Missouri - MO_C - counties of Adair; Audrain; Benton; Boone; Callaway; Camden; Carroll; Chariton; Christian; Cole; Cooper; Dallas; Douglas; Greene; Grundy; Hickory; Howard; Howell; Knox; Laclede; Linn; Livingston; Macon; Maries; Merce","projected 2D","","","East","North","X","Y","9001","","4269","12432","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_796[] = {"26998","NAD83 / Missouri West","","","","United States (USA) - Missouri - MO_W - counties of Andrew; Atchison; Barry; Barton; Bates; Buchanan; Caldwell; Cass; Cedar; Clay; Clinton; Dade; Daviess; De Kalb; Gentry; Harrison; Henry; Holt; Jackson; Jasper; Johnson; Lafayette; Lawrence; McDonald; Newt","projected 2D","","","East","North","X","Y","9001","","4269","12433","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_797[] = {"27038","Nahrwan 1967 / UTM zone 38N","Nahrwan 1967 / UTM 38N","","","Kuwait west of 48 deg East.","projected 2D","","","East","North","E","N","9001","","4270","16038","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_798[] = {"27039","Nahrwan 1967 / UTM zone 39N","Nahrwan 1967 / UTM 39N","","","Kuwait east of 48 deg East. United Arab Emirates (UAE) - Abu Dhabi - west of 54 deg East.","projected 2D","","","East","North","E","N","9001","","4270","16039","1996-04-12 00:00:00","","EPSG","","96.12",NULL};
+datafile_rows_t horiz_cs_row_799[] = {"27040","Nahrwan 1967 / UTM zone 40N","Nahrwan 1967 / UTM 40N","","","United Arab Emirates (UAE) - Abu Dhabi east of 54 deg East; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain.","projected 2D","","","East","North","E","N","9001","","4270","16040","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_800[] = {"27120","Naparima 1972 / UTM zone 20N","Naparima / UTM 20N","","","Trinidad and Tobago.","projected 2D","","","East","North","E","N","9001","","4271","16020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_801[] = {"27200","GD49 / New Zealand Map Grid","GD49 / NZ Map Grid","","","New Zealand.","projected 2D","","","East","North","E","N","9001","","4272","19917","1995-06-02 00:00:00","","EPSG","Supersedes 27291 (GD49 / North Island Grid) and 27292 (GD49 / South Island Grid).","",NULL};
+datafile_rows_t horiz_cs_row_802[] = {"27291","GD49 / North Island Grid","","","","New Zealand - North Island.","projected 2D","","","East","North","E","N","9040","","4272","18141","1999-10-20 00:00:00","","EPSG","Sears 1922 British foot-metre conversion factor applied to ellipsoid. Superseded by 27200 (GD49 / New Zealand Map Grid).","97.231",NULL};
+datafile_rows_t horiz_cs_row_803[] = {"27292","GD49 / South Island Grid","","","","New Zealand - South Island.","projected 2D","","","East","North","E","N","9040","","4272","18142","1999-10-20 00:00:00","","EPSG","Sears 1922 British foot-metre conversion factor applied to ellipsoid. Superseded by 27200 (GD49 / New Zealand Map Grid).","97.231",NULL};
+datafile_rows_t horiz_cs_row_804[] = {"27391","NGO 1948 (Oslo) / NGO zone I","NGO 1948 / I","","","Norway - west of 3deg 30min W of Oslo (7deg 13min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18221","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 32N.","",NULL};
+datafile_rows_t horiz_cs_row_805[] = {"27392","NGO 1948 (Oslo) / NGO zone II","NGO 1948 / II","","","Norway - between 3deg 30min W and 1deg 10min W of Oslo (7deg 13min 20.5sec E and 9deg 33min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18222","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 32N.","",NULL};
+datafile_rows_t horiz_cs_row_806[] = {"27393","NGO 1948 (Oslo) / NGO zone III","NGO 1948 / III","","","Norway - between 1deg 10min W and 1deg 15min E of Oslo (9deg 33min 20.5sec E and 11deg 58min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18223","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 32N.","",NULL};
+datafile_rows_t horiz_cs_row_807[] = {"27394","NGO 1948 (Oslo) / NGO zone IV","NGO 1948 / IV","","","Norway - between 1deg 15min E and 4deg 20min E of Oslo (11deg 58min 20.5sec E and 15deg 03min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18224","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 32N and ETRF89 / UTM zone 33N.","",NULL};
+datafile_rows_t horiz_cs_row_808[] = {"27395","NGO 1948 (Oslo) / NGO zone V","NGO 1948 / V","","","Norway - between 4deg 20min E and 8deg 10min E of Oslo (15deg 03min 20.5sec E and 18deg 53min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18225","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 33N and ETRF89 / UTM zone 34N.","",NULL};
+datafile_rows_t horiz_cs_row_809[] = {"27396","NGO 1948 (Oslo) / NGO zone VI","NGO 1948 / VI","","","Norway - between 8deg 10min E and 12deg 10min E of Oslo (18deg 53min 20.5sec E and 22deg 53min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18226","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 34N.","",NULL};
+datafile_rows_t horiz_cs_row_810[] = {"27397","NGO 1948 (Oslo) / NGO zone VII","NGO 1948 / VII","","","Norway - between 12deg 10min E and 16deg 15min E of Oslo (22deg 53min 20.5sec E and 26deg 58min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18227","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 34N and ETRF89 / UTM zone 35N.","",NULL};
+datafile_rows_t horiz_cs_row_811[] = {"27398","NGO 1948 (Oslo) / NGO zone VIII","NGO 1948 / VIII","","","Norway - east of 16deg 15min E of Oslo (26deg 58min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18228","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 35N.","",NULL};
+datafile_rows_t horiz_cs_row_812[] = {"27429","Datum 73 / UTM zone 29N","","","","Portugal - onshore.","projected 2D","","","East","North","E","N","9001","","4274","16029","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_813[] = {"27500","ATF (Paris) / Nord de Guerre","ATF / Nord de Guerre","","","France - Alsace.","projected 2D","","","East","North","X","Y","9001","","4901","19903","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_814[] = {"27581","NTF (Paris) / France I","NTF / France I","","","France north of 53.5 grads (48 deg 09 min) North.","projected 2D","","","East","North","X","Y","9001","","4807","18081","1996-04-12 00:00:00","","EPSG","Introduced 1972. Supersedes NTF / Nord France (code 27591).","95.26",NULL};
+datafile_rows_t horiz_cs_row_815[] = {"27582","NTF (Paris) / France II","NTF / France II","","","France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North. Also used over all mainlanf France.","projected 2D","","","East","North","X","Y","9001","","4807","18082","1996-04-12 00:00:00","","EPSG","Introduced 1972. Supersedes NTF / Centre France (code 27592).","95.26",NULL};
+datafile_rows_t horiz_cs_row_816[] = {"27583","NTF (Paris) / France III","NTF / France III","","","France south of 50.5 grads (45 deg 27 min) North.","projected 2D","","","East","North","X","Y","9001","","4807","18083","1996-04-12 00:00:00","","EPSG","Introduced 1972. Supersedes NTF / Sud France (code 27593).","95.26",NULL};
+datafile_rows_t horiz_cs_row_817[] = {"27584","NTF (Paris) / France IV","NTF / France IV","","","France - Corsica","projected 2D","","","East","North","X","Y","9001","","4807","18084","1996-04-12 00:00:00","","EPSG","Introduced 1972. Supersedes NTF / Corse (code 27594).","",NULL};
+datafile_rows_t horiz_cs_row_818[] = {"27591","NTF (Paris) / Nord France","NTF / Nord France","","","France north of 53.5 grads (48 deg 09 min) North.","projected 2D","","","East","North","X","Y","9001","","4807","18091","1996-04-12 00:00:00","","EPSG","Superseded by NTF / France I (code 27581) from 1972.","95.26",NULL};
+datafile_rows_t horiz_cs_row_819[] = {"27592","NTF (Paris) / Centre France","NTF / Centre France","","","France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.","projected 2D","","","East","North","X","Y","9001","","4807","18092","1996-04-12 00:00:00","","EPSG","Superseded by NTF / France II (code 27582) from 1972.","95.26",NULL};
+datafile_rows_t horiz_cs_row_820[] = {"27593","NTF (Paris) / Sud France","NTF / Sud France","","","France south of 50.5 grads (45 deg 27 min) North.","projected 2D","","","East","North","X","Y","9001","","4807","18093","1996-04-12 00:00:00","","EPSG","Superseded by NTF / France III (code 27583) from 1972.","95.26",NULL};
+datafile_rows_t horiz_cs_row_821[] = {"27594","NTF (Paris) / Corse","NTF / Corse","","","France - Corsica","projected 2D","","","East","North","X","Y","9001","","4807","18094","1996-04-12 00:00:00","","EPSG","Superseded by NTF / France IV (code 27584) from 1972.","",NULL};
+datafile_rows_t horiz_cs_row_822[] = {"27700","OSGB 1936 / British National Grid","British National Grid","","","United Kingdom (UK) - onshore England; Scotland; Wales; Isle of Man.","projected 2D","","","East","North","E","N","9001","","4277","19916","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_823[] = {"28191","Palestine 1923 / Palestine Grid","Palestine Grid","","","Israel; Jordan","projected 2D","","","East","North","E","N","9001","","4281","18201","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_824[] = {"28192","Palestine 1923 / Palestine Belt","Palestine Belt","","","Israel; Jordan","projected 2D","","","East","North","E","N","9001","","4281","18202","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_825[] = {"28193","Palestine 1923 / Israeli CS Grid","Israeli CS Grid","","","Israel.","projected 2D","","","East","North","E","N","9001","","4281","18203","1999-10-20 00:00:00","Survey of Israel.","EPSG","Superceded by Israeli TM Grid (EPSG code 239).","",NULL};
+datafile_rows_t horiz_cs_row_826[] = {"28232","Pointe Noire / UTM zone 32S","Point Noire / UTM 32S","","","Congo.","projected 2D","","","East","North","E","N","9001","","4282","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_827[] = {"28348","GDA94 / MGA zone 48","","","","Australia - 102deg East to 108deg East.","projected 2D","","","East","North","E","N","9001","","4283","17348","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_828[] = {"28349","GDA94 / MGA zone 49","","","","Australia - 108deg East to 114deg East.","projected 2D","","","East","North","E","N","9001","","4283","17349","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_829[] = {"28350","GDA94 / MGA zone 50","","","","Australia - 114deg East to 120deg East.","projected 2D","","","East","North","E","N","9001","","4283","17350","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_830[] = {"28351","GDA94 / MGA zone 51","","","","Australia - 120deg East to 126deg East.","projected 2D","","","East","North","E","N","9001","","4283","17351","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_831[] = {"28352","GDA94 / MGA zone 52","","","","Australia - 126deg East to 132deg East.","projected 2D","","","East","North","E","N","9001","","4283","17352","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_832[] = {"28353","GDA94 / MGA zone 53","","","","Australia - 132deg East to 138deg East.","projected 2D","","","East","North","E","N","9001","","4283","17353","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_833[] = {"28354","GDA94 / MGA zone 54","","","","Australia - 138deg East to 144deg East.","projected 2D","","","East","North","E","N","9001","","4283","17354","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_834[] = {"28355","GDA94 / MGA zone 55","","","","Australia - 144deg East to 150deg East.","projected 2D","","","East","North","E","N","9001","","4283","17355","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_835[] = {"28356","GDA94 / MGA zone 56","","","","Australia - 150deg East to 156deg East.","projected 2D","","","East","North","E","N","9001","","4283","17356","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_836[] = {"28357","GDA94 / MGA zone 57","","","","Australia - 156deg East to 162deg East.","projected 2D","","","East","North","E","N","9001","","4283","17357","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_837[] = {"28358","GDA94 / MGA zone 58","","","","Australia - 162deg East to 168deg East.","projected 2D","","","East","North","E","N","9001","","4283","17358","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_838[] = {"28402","Pulkovo 1942 / Gauss-Kruger zone 2","1942 Coord. Sys. zone 2","","","Czech Republic and Germany (former DDR) - west of 12 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16202","1998-06-30 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_839[] = {"28403","Pulkovo 1942 / Gauss-Kruger zone 3","1942 Coord. Sys. zone 3","","","Czech Republic and Germany ( former DDR) - east of 12 deg East; Poland and Slovakia - west of 18 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16203","1998-06-30 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_840[] = {"28404","Pulkovo 1942 / Gauss-Kruger zone 4","1942 Coord. Sys. zone 4","","","Estonia; Latvia; Lithuania; Russia; Ukraine; - west of 24 deg East; Poland - east of 24 deg East; Slovakia east of 18 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16204","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_841[] = {"28405","Pulkovo 1942 / Gauss-Kruger zone 5","1942 Coord. Sys. zone 5","","","Belarus - west of 30 deg East; Estonia; Latvia & Lithuania - east of 24 deg East; Moldova; Russia & Ukraine - 24 deg to 30 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16205","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_842[] = {"28406","Pulkovo 1942 / Gauss-Kruger zone 6","1942 Coord. Sys. zone 6","","","Belarus - east of 30 deg East; Russia & Ukraine - 30 deg to 36 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16206","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_843[] = {"28407","Pulkovo 1942 / Gauss-Kruger zone 7","1942 Coord. Sys. zone 7","","","Georgia - west of 36 deg East; Russia - 36 deg to 42 deg East; Ukraine - east of 36 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16207","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_844[] = {"28408","Pulkovo 1942 / Gauss-Kruger zone 8","1942 Coord. Sys. zone 8","","","Armenia Azerbaijan - west of 48 deg East; Georgia - east of 42 deg East; Russia - 42 deg to 48 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16208","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_845[] = {"28409","Pulkovo 1942 / Gauss-Kruger zone 9","1942 Coord. Sys. zone 9","","","Azerbaijan - east of 48 deg East; Kazakstan - west of 54 deg East; Russia - 48 deg to 54 deg East; Turkmenistan - west of 54 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16209","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_846[] = {"28410","Pulkovo 1942 / Gauss-Kruger zone 10","1942 Coord. Sys. zone 10","","","Kazakstan; Russia; Turkmenistan - 54 deg to 60 deg East; Uzbekistan - west of 60 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16210","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_847[] = {"28411","Pulkovo 1942 / Gauss-Kruger zone 11","1942 Coord. Sys. zone 11","","","Kazakstan; Russia; Uzbekistan - 60 deg to 66 deg East; Turkmenistan - east of 60 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16211","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_848[] = {"28412","Pulkovo 1942 / Gauss-Kruger zone 12","1942 Coord. Sys. zone 12","","","Kazakstan & Russia - 66 deg to 72 deg East; Kirgistan & Tadzhikstan - west of 72 deg East; Uzbekistan - east of 66 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16212","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_849[] = {"28413","Pulkovo 1942 / Gauss-Kruger zone 13","1942 Coord. Sys. zone 13","","","Kazakstan; Kirgizstan; Russia - 72 deg to 78 deg East; Tadzhikstan - east of 72 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16213","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_850[] = {"28414","Pulkovo 1942 / Gauss-Kruger zone 14","1942 Coord. Sys. zone 14","","","Kazakstan & Russia - 78 deg to 84 deg East; Kirgizstan - east of 78 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16214","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_851[] = {"28415","Pulkovo 1942 / Gauss-Kruger zone 15","1942 Coord. Sys. zone 15","","","Kazakstan - east of 84 deg East; Russia - 84 deg to 90 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16215","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_852[] = {"28416","Pulkovo 1942 / Gauss-Kruger zone 16","1942 Coord. Sys. zone 16","","","Russia - 90 deg to 96 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16216","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_853[] = {"28417","Pulkovo 1942 / Gauss-Kruger zone 17","1942 Coord. Sys. zone 17","","","Russia - 96 deg to 102deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16217","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_854[] = {"28418","Pulkovo 1942 / Gauss-Kruger zone 18","1942 Coord. Sys. zone 18","","","Russia - 102 deg to 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16218","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_855[] = {"28419","Pulkovo 1942 / Gauss-Kruger zone 19","1942 Coord. Sys. zone 19","","","Russia - 108 deg to 114 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16219","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_856[] = {"28420","Pulkovo 1942 / Gauss-Kruger zone 20","1942 Coord. Sys. zone 20","","","Russia - 114 deg to 120 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16220","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_857[] = {"28421","Pulkovo 1942 / Gauss-Kruger zone 21","1942 Coord. Sys. zone 21","","","Russia - 120 deg to 126 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16221","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_858[] = {"28422","Pulkovo 1942 / Gauss-Kruger zone 22","1942 Coord. Sys. zone 22","","","Russia - 126 deg to 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16222","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_859[] = {"28423","Pulkovo 1942 / Gauss-Kruger zone 23","1942 Coord. Sys. zone 23","","","Russia - 132 deg to 138 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16223","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_860[] = {"28424","Pulkovo 1942 / Gauss-Kruger zone 24","1942 Coord. Sys. zone 24","","","Russia - 138 deg to 144 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16224","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_861[] = {"28425","Pulkovo 1942 / Gauss-Kruger zone 25","1942 Coord. Sys. zone 25","","","Russia - 144 deg to 150 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16225","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_862[] = {"28426","Pulkovo 1942 / Gauss-Kruger zone 26","1942 Coord. Sys. zone 26","","","Russia - 150 deg to 156 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16226","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_863[] = {"28427","Pulkovo 1942 / Gauss-Kruger zone 27","1942 Coord. Sys. zone 27","","","Russia - 156 deg to 162 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16227","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_864[] = {"28428","Pulkovo 1942 / Gauss-Kruger zone 28","1942 Coord. Sys. zone 28","","","Russia - 162 deg to 168 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16228","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_865[] = {"28429","Pulkovo 1942 / Gauss-Kruger zone 29","1942 Coord. Sys. zone 29","","","Russia - 168 deg to 174 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16229","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_866[] = {"28430","Pulkovo 1942 / Gauss-Kruger zone 30","1942 Coord. Sys. zone 30","","","Russia - 174 deg East to 180 deg.","projected 2D","","","North","East","X","Y","9001","","4284","16230","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_867[] = {"28431","Pulkovo 1942 / Gauss-Kruger zone 31","1942 Coord. Sys. zone 31","","","Russia - 180 deg to 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4284","16231","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_868[] = {"28432","Pulkovo 1942 / Gauss-Kruger zone 32","1942 Coord. Sys. zone 32","","","Russia - east of 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4284","16232","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_869[] = {"28462","Pulkovo 1942 / Gauss-Kruger 2N","Pulkovo / Gauss 2N","","","Czech Republic and Germany (former DDR) - west of 12 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16302","1998-06-30 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_870[] = {"28463","Pulkovo 1942 / Gauss-Kruger 3N","Pulkovo / Gauss 3N","","","Czech Republic and Germany ( former DDR) - east of 12 deg East; Poland and Slovakia - west of 18 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16303","1998-06-30 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_871[] = {"28464","Pulkovo 1942 / Gauss-Kruger 4N","Pulkovo / Gauss 4N","","","Estonia; Latvia; Lithuania; Russia; Ukraine; - west of 24 deg East; Poland - east of 24 deg East; Slovakia east of 18 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16304","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_872[] = {"28465","Pulkovo 1942 / Gauss-Kruger 5N","Pulkovo / Gauss 5N","","","Belarus - west of 30 deg East; Estonia; Latvia & Lithuania - east of 24 deg East; Moldova; Russia & Ukraine - 24 deg to 30 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16305","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_873[] = {"28466","Pulkovo 1942 / Gauss-Kruger 6N","Pulkovo / Gauss 6N","","","Belarus - east of 30 deg East; Russia & Ukraine - 30 deg to 36 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16306","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_874[] = {"28467","Pulkovo 1942 / Gauss-Kruger 7N","Pulkovo / Gauss 7N","","","Georgia - west of 36 deg East; Russia - 36 deg to 42 deg East; Ukraine - east of 36 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16307","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_875[] = {"28468","Pulkovo 1942 / Gauss-Kruger 8N","Pulkovo / Gauss 8N","","","Armenia - west of 48 deg East; Azerbaijan - west of 48 deg East; Georgia - east of 42 deg East; Russia - 42 deg to 48 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16308","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_876[] = {"28469","Pulkovo 1942 / Gauss-Kruger 9N","Pulkovo / Gauss 9N","","","Azerbaijan - east of 48 deg East; Kazakstan - west of 54 deg East; Russia - 48 deg to 54 deg East; Turkmenistan - west of 54 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16309","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_877[] = {"28470","Pulkovo 1942 / Gauss-Kruger 10N","Pulkovo / Gauss 10N","","","Kazakstan; Russia; Turkmenistan - 54 deg to 60 deg East; Uzbekistan - west of 60 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16310","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_878[] = {"28471","Pulkovo 1942 / Gauss-Kruger 11N","Pulkovo / Gauss 11N","","","Kazakstan; Russia; Uzbekistan - 60 deg to 66 deg East; Turkmenistan - east of 60 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16311","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_879[] = {"28472","Pulkovo 1942 / Gauss-Kruger 12N","Pulkovo / Gauss 12N","","","Kazakstan & Russia - 66 deg to 72 deg East; Kirgistan & Tadzhikstan - west of 72 deg East; Uzbekistan - east of 66 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16312","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_880[] = {"28473","Pulkovo 1942 / Gauss-Kruger 13N","Pulkovo / Gauss 13N","","","Kazakstan; Kirgizstan; Russia - 72 deg to 78 deg East; Tadzhikstan - east of 72 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16313","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_881[] = {"28474","Pulkovo 1942 / Gauss-Kruger 14N","Pulkovo / Gauss 14N","","","Kazakstan & Russia - 78 deg to 84 deg East; Kirgizstan - east of 78 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16314","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_882[] = {"28475","Pulkovo 1942 / Gauss-Kruger 15N","Pulkovo / Gauss 15N","","","Kazakstan - east of 84 deg East; Russia - 84 deg to 90 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16315","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_883[] = {"28476","Pulkovo 1942 / Gauss-Kruger 16N","Pulkovo / Gauss 16N","","","Russia - 90 deg to 96 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16316","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_884[] = {"28477","Pulkovo 1942 / Gauss-Kruger 17N","Pulkovo / Gauss 17N","","","Russia - 96 deg to 102deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16317","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_885[] = {"28478","Pulkovo 1942 / Gauss-Kruger 18N","Pulkovo / Gauss 18N","","","Russia - 102 deg to 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16318","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_886[] = {"28479","Pulkovo 1942 / Gauss-Kruger 19N","Pulkovo / Gauss 19N","","","Russia - 108 deg to 114 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16319","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_887[] = {"28480","Pulkovo 1942 / Gauss-Kruger 20N","Pulkovo / Gauss 20N","","","Russia - 114 deg to 120 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16320","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_888[] = {"28481","Pulkovo 1942 / Gauss-Kruger 21N","Pulkovo / Gauss 21N","","","Russia - 120 deg to 126 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16321","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_889[] = {"28482","Pulkovo 1942 / Gauss-Kruger 22N","Pulkovo / Gauss 22N","","","Russia - 126 deg to 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16322","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_890[] = {"28483","Pulkovo 1942 / Gauss-Kruger 23N","Pulkovo / Gauss 23N","","","Russia - 132 deg to 138 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16323","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_891[] = {"28484","Pulkovo 1942 / Gauss-Kruger 24N","Pulkovo / Gauss 24N","","","Russia - 138 deg to 144 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16324","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_892[] = {"28485","Pulkovo 1942 / Gauss-Kruger 25N","Pulkovo / Gauss 25N","","","Russia - 144 deg to 150 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16325","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_893[] = {"28486","Pulkovo 1942 / Gauss-Kruger 26N","Pulkovo / Gauss 26N","","","Russia - 150 deg to 156 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16326","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_894[] = {"28487","Pulkovo 1942 / Gauss-Kruger 27N","Pulkovo / Gauss 27N","","","Russia - 156 deg to 162 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16327","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_895[] = {"28488","Pulkovo 1942 / Gauss-Kruger 28N","Pulkovo / Gauss 28N","","","Russia - 162 deg to 168 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16328","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_896[] = {"28489","Pulkovo 1942 / Gauss-Kruger 29N","Pulkovo / Gauss 29N","","","Russia - 168 deg to 174 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16329","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_897[] = {"28490","Pulkovo 1942 / Gauss-Kruger 30N","Pulkovo / Gauss 30N","","","Russia - 174 deg East to 180 deg.","projected 2D","","","North","East","X","Y","9001","","4284","16330","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_898[] = {"28491","Pulkovo 1942 / Gauss-Kruger 31N","Pulkovo / Gauss 31N","","","Russia - 180 deg to 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4284","16331","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_899[] = {"28492","Pulkovo 1942 / Gauss-Kruger 32N","Pulkovo / Gauss 32N","","","Russia - east of 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4284","16332","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_900[] = {"28600","Qatar / Qatar National Grid","Qatar National Grid","","","Qatar - onshore.","projected 2D","","","East","North","E","N","9001","","4286","19919","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_901[] = {"28991","RD / Netherlands Old","","","","Netherlands - onshore.","projected 2D","","","East","North","X","Y","9001","","4289","19913","1995-06-02 00:00:00","","EPSG","Superseded by 28992 (RD / Netherlands New).","",NULL};
+datafile_rows_t horiz_cs_row_902[] = {"28992","RD / Netherlands New","","","","Netherlands - onshore.","projected 2D","","","East","North","X","Y","9001","","4289","19914","1995-06-02 00:00:00","","EPSG","Supersedes 28991 (RD / Netherlands Old).","",NULL};
+datafile_rows_t horiz_cs_row_903[] = {"29100","SAD69 / Brazil Polyconic","","","","Brazil","projected 2D","","","East","North","X","Y","9001","","4291","19941","1999-04-22 00:00:00","PetroBras","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_904[] = {"29118","SAD69 / UTM zone 18N","","","","South America - 78deg West to 72deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16018","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.251. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_905[] = {"29119","SAD69 / UTM zone 19N","","","","South America - 72deg West to 66deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16019","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_906[] = {"29120","SAD69 / UTM zone 20N","","","","South America - 66deg West to 60deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16020","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_907[] = {"29121","SAD69 / UTM zone 21N","","","","South America - 60deg West to 54deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16021","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_908[] = {"29122","SAD69 / UTM zone 22N","","","","South America - 54deg West to 48deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16022","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_909[] = {"29177","SAD69 / UTM zone 17S","","","","South America - 84deg West to 78deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16117","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_910[] = {"29178","SAD69 / UTM zone 18S","","","","South America - Brazil - 78deg West to 72deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16118","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_911[] = {"29179","SAD69 / UTM zone 19S","","","","South America - Brazil - 72deg West to 66deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16119","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_912[] = {"29180","SAD69 / UTM zone 20S","","","","South America - Brazil - 66deg West to 60deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16120","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_913[] = {"29181","SAD69 / UTM zone 21S","","","","South America - Brazil - 60deg West to 54deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16121","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_914[] = {"29182","SAD69 / UTM zone 22S","","","","South America - Brazil - 54deg West to 48deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16122","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_915[] = {"29183","SAD69 / UTM zone 23S","","","","South America - 48deg West to 42deg West.","projected 2D","","","East","North","E","N","9001","","4291","16123","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_916[] = {"29184","SAD69 / UTM zone 24S","","","","South America - Brazil - 42deg West to 36deg West.","projected 2D","","","East","North","E","N","9001","","4291","16124","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_917[] = {"29185","SAD69 / UTM zone 25S","","","","South America - 36deg West to 30deg West.","projected 2D","","","East","North","E","N","9001","","4291","16125","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_918[] = {"29220","Sapper Hill 1943 / UTM zone 20S","Sapper Hill / UTM 20S","","","Falkland Islands - west of 60 deg West.","projected 2D","","","East","North","E","N","9001","","4292","16120","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_919[] = {"29221","Sapper Hill 1943 / UTM zone 21S","Sapper Hill / UTM 21S","","","Falkland Islands - east of 60 deg West.","projected 2D","","","East","North","E","N","9001","","4292","16121","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_920[] = {"29333","Schwarzeck / UTM zone 33S","Schwarzeck / UTM 33S","","","Namibia - offshore.","projected 2D","","","East","North","E","N","9001","","4293","16133","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_921[] = {"29371","South West African Coord. System zone 11","SW African CS zone 11","","","Namibia - west of 12 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17611","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_922[] = {"29373","South West African Coord. System zone 13","SW African CS zone 13","","","Namibia - 12 to 14 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17613","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_923[] = {"29375","South West African Coord. System zone 15","SW African CS zone 15","","","Namibia - 14 to 16 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17615","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_924[] = {"29377","South West African Coord. System zone 17","SW African CS zone 17","","","Namibia - 16 to 18 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17617","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_925[] = {"29379","South West African Coord. System zone 19","SW African CS zone 19","","","Namibia - 18 to 20 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17619","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_926[] = {"29381","South West African Coord. System zone 21","SW African CS zone 21","","","Namibia - 20 to 22 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17621","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_927[] = {"29383","South West African Coord. System zone 23","SW African CS zone 23","","","Namibia - 22 to 24 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17623","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_928[] = {"29385","South West African Coord. System zone 25","SW African CS zone 25","","","Namibia - east of 24 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17625","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_929[] = {"29635","Sudan / UTM zone 35N","","","","Sudan - south - west of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4296","16035","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_930[] = {"29636","Sudan / UTM zone 36N","","","","Sudan - south - east of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4296","16036","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_931[] = {"29700","Tananarive (Paris) / Laborde Grid","Tananarive / Laborde","","","Madagascar.","projected 2D","","","East","North","X","Y","9001","","4810","19911","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_932[] = {"29738","Tananarive / UTM zone 38S","Tananarive / UTM 38S","","","Madagascar - offshore west of 48 deg East.","projected 2D","","","East","North","E","N","9001","","4297","16138","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_933[] = {"29739","Tananarive / UTM zone 39S","Tananarive / UTM 39S","","","Madagascar - offshore east of 48 deg East.","projected 2D","","","East","North","E","N","9001","","4297","16139","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_934[] = {"29849","Timbalai 1948 / UTM zone 49N","Timbalai 1948 / UTM 49N","","","Brunei - offshore; Malaysia - East Malaysia (Sarawak).","projected 2D","","","East","North","E","N","9001","","4298","16049","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_935[] = {"29850","Timbalai 1948 / UTM zone 50N","Timbalai 1948 / UTM 50N","","","Brunei - offshore; Malaysia - East Malaysia (Sabah).","projected 2D","","","East","North","E","N","9001","","4298","16050","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_936[] = {"29871","Timbalai 1948 / R.S.O. Borneo (ch)","Timbalai / Borneo (ch)","","","Malaysia - East Malaysia (Sabah; Sarawak).","projected 2D","","","East","North","E","N","9042","","4298","19912","1999-10-20 00:00:00","","EPSG","Adopts metric conversion of 39.370147 inches per metre.","97.231",NULL};
+datafile_rows_t horiz_cs_row_937[] = {"29872","Timbalai 1948 / R.S.O. Borneo (ft)","Timbalai / Borneo (ft)","","","Brunei; Malaysia - East Malaysia (Sabah; Sarawak).","projected 2D","","","East","North","E","N","9041","","4298","19912","1999-10-20 00:00:00","","EPSG","Original projection definition in chains. 1 chain = 66 feet=792 inches. Adopts metric conversion of 39.370147 inches per metre.","97.231",NULL};
+datafile_rows_t horiz_cs_row_938[] = {"29873","Timbalai 1948 / R.S.O. Borneo (m)","Timbalai / Borneo (m)","","","Brunei.","projected 2D","","","East","North","E","N","9001","","4298","19912","1997-07-22 00:00:00","","EPSG","Original projection definition in chains. 1 chain = 66 feet=792 inches. Adopts metric conversion of 39.370147 inches per metre.","",NULL};
+datafile_rows_t horiz_cs_row_939[] = {"29900","TM65 / Irish National Grid","TM65 / Irish Nat Grid","","","Ireland - onshore; United Kingdom (UK) - Northern Ireland (Ulster) onshore","projected 2D","","","East","North","E","N","9001","","4299","19908","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_940[] = {"30161","Tokyo / Japan Plane Rectangular CS I","Tokyo / Japan zone I","","","Japan - Kyushu - Nagasaki-ken; islands of Kagoshima-ken between 27 and 32 deg N and between 128 deg 18 min and 130 deg E (between 128 deg 18 min and 30 deg 13 min E for Amami islands).","projected 2D","","","North","East","X","Y","9001","","4301","17801","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_941[] = {"30162","Tokyo / Japan Plane Rectangular CS II","Tokyo / Japan zone II","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17802","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_942[] = {"30163","Tokyo / Japan Plane Rectangular CS III","Tokyo / Japan zone III","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17803","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_943[] = {"30164","Tokyo / Japan Plane Rectangular CS IV","Tokyo / Japan zone IV","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17804","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_944[] = {"30165","Tokyo / Japan Plane Rectangular CS V","Tokyo / Japan zone V","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17805","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_945[] = {"30166","Tokyo / Japan Plane Rectangular CS VI","Tokyo / Japan zone VI","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17806","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_946[] = {"30167","Tokyo / Japan Plane Rectangular CS VII","Tokyo / Japan zone VII","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17807","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_947[] = {"30168","Tokyo / Japan Plane Rectangular CS VIII","Tokyo / Japan zone VIII","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17808","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_948[] = {"30169","Tokyo / Japan Plane Rectangular CS IX","Tokyo / Japan zone IX","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17809","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_949[] = {"30170","Tokyo / Japan Plane Rectangular CS X","Tokyo / Japan zone X","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17810","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_950[] = {"30171","Tokyo / Japan Plane Rectangular CS XI","Tokyo / Japan zone XI","","","Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.","projected 2D","","","North","East","X","Y","9001","","4301","17811","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_951[] = {"30172","Tokyo / Japan Plane Rectangular CS XII","Tokyo / Japan zone XII","","","Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.","projected 2D","","","North","East","X","Y","9001","","4301","17812","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_952[] = {"30173","Tokyo / Japan Plane Rectangular CS XIII","Tokyo / Japan zone XIII","","","Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.","projected 2D","","","North","East","X","Y","9001","","4301","17813","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_953[] = {"30174","Tokyo / Japan Plane Rectangular CS XIV","Tokyo / Japan zone XIV","","","Japan - Tokyo-to south of 28 deg N & between 140 deg 30 min & 143 deg E.","projected 2D","","","North","East","X","Y","9001","","4301","17814","1998-12-12 00:00:00","","EPSG","Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.","",NULL};
+datafile_rows_t horiz_cs_row_954[] = {"30175","Tokyo / Japan Plane Rectangular CS XV","Tokyo / Japan zone XV","","","Japan - Okinawa-ken between 126 deg &130 deg E.","projected 2D","","","North","East","X","Y","9001","","4301","17815","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_955[] = {"30176","Tokyo / Japan Plane Rectangular CS XVI","Tokyo / Japan zone XVI","","","Japan - Okinawa-ken west of 126 deg E.","projected 2D","","","North","East","X","Y","9001","","4301","17816","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_956[] = {"30177","Tokyo / Japan Plane Rectangular CS XVII","Tokyo / Japan zone XVII","","","Japan - Okinawa-ken east of 130 deg E.","projected 2D","","","North","East","X","Y","9001","","4301","17817","1998-12-12 00:00:00","","EPSG","Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.","",NULL};
+datafile_rows_t horiz_cs_row_957[] = {"30178","Tokyo / Japan Plane Rectangular CS XVIII","Tokyo / Japan zone XVIII","","","Japan - Tokyo-to south of 28 N & west of 140 deg 30 min E.","projected 2D","","","North","East","X","Y","9001","","4301","17818","1998-12-12 00:00:00","","EPSG","Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.","",NULL};
+datafile_rows_t horiz_cs_row_958[] = {"30179","Tokyo / Japan Plane Rectangular CS XIX","Tokyo / Japan zone XIX","","","Japan - Tokyo-to south of 28 N & east of 143 deg E.","projected 2D","","","North","East","X","Y","9001","","4301","17819","1998-12-12 00:00:00","","EPSG","Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.","",NULL};
+datafile_rows_t horiz_cs_row_959[] = {"30200","Trinidad 1903 / Trinidad Grid","Trinidad 1903 / Trinidad","","","Trinidad and Tobago - Trinidad","projected 2D","","","East","North","E","N","9039","","4302","19925","1999-10-20 00:00:00","","EPSG","","97.231",NULL};
+datafile_rows_t horiz_cs_row_960[] = {"30339","TC(1948) / UTM zone 39N","","","","United Arab Emirates (UAE) - Abu Dhabi west of 54 deg East.","projected 2D","","","East","North","E","N","9001","","4303","16039","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_961[] = {"30340","TC(1948) / UTM zone 40N","","","","United Arab Emirates (UAE) - Abu Dhabi east of 54 deg East; Dubai.","projected 2D","","","East","North","E","N","9001","","4303","16040","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_962[] = {"30491","Voirol 1875 / Nord Algerie (ancienne)","Voirol /N Algerie ancien","","","Algeria - north of 38.5 grads (34 deg 39 min) North.","projected 2D","","","East","North","X","Y","9001","","4304","18011","1995-06-02 00:00:00","","EPSG","Superseded by 30591 (Voirol Unifie / Algeria Nord).","",NULL};
+datafile_rows_t horiz_cs_row_963[] = {"30492","Voirol 1875 / Sud Algerie (ancienne)","Voirol /S Algerie ancien","","","Algeria - 35 grads to 38.5 grads (31 deg 30 min to 34 deg 39 min) North.","projected 2D","","","East","North","X","Y","9001","","4304","18012","1995-06-02 00:00:00","","EPSG","Superseded by 30592 (Voirol Unifie / Algeria Sud).","",NULL};
+datafile_rows_t horiz_cs_row_964[] = {"30591","Voirol Unifie / Nord Algerie","Voirol Unifie /N Algerie","","","Algeria - north of 38.5 grads (34 deg 39 min) North.","projected 2D","","","East","North","X","Y","9001","","4305","18021","1995-06-02 00:00:00","","EPSG","Supersedes 30491 (Voirol 1875 / Nord Algeria ancienne).","",NULL};
+datafile_rows_t horiz_cs_row_965[] = {"30592","Voirol Unifie / Sud Algerie","Voirol Unifie /S Algerie","","","Algeria - 35 grads to 38.5 grads (31 deg 30 min to 34 deg 39 min) North.","projected 2D","","","East","North","X","Y","9001","","4305","18022","1995-06-02 00:00:00","","EPSG","Supersedes 30492 (Voirol 1875 / Sud Algeria ancienne).","",NULL};
+datafile_rows_t horiz_cs_row_966[] = {"30729","Nord Sahara 1959 / UTM zone 29N","Nord Sahara / UTM 29N","","","Algeria west of 6 deg West (of Greenwich).","projected 2D","","","East","North","E","N","9001","","4307","16029","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_967[] = {"30730","Nord Sahara 1959 / UTM zone 30N","Nord Sahara / UTM 30N","","","Algeria 6 deg West to 0 deg East (of Greenwich).","projected 2D","","","East","North","E","N","9001","","4307","16030","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_968[] = {"30731","Nord Sahara 1959 / UTM zone 31N","Nord Sahara / UTM 31N","","","Algeria 0 deg to 6 deg East (of Greenwich).","projected 2D","","","East","North","E","N","9001","","4307","16031","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_969[] = {"30732","Nord Sahara 1959 / UTM zone 32N","Nord Sahara / UTM 32N","","","Algeria east of 6 deg East (of Greenwich).","projected 2D","","","East","North","E","N","9001","","4307","16032","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_970[] = {"30800","RT38 2.5 gon W","","","","Sweden","projected 2D","","","North","East","X","Y","9001","","4308","19929","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","","97.14 97.39",NULL};
+datafile_rows_t horiz_cs_row_971[] = {"31028","Yoff / UTM zone 28N","","","","Senegal.","projected 2D","","","East","North","E","N","9001","","4310","16028","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_972[] = {"31121","Zanderij / UTM zone 21N","","","","Suriname.","projected 2D","","","East","North","E","N","9001","","4311","16021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_973[] = {"31291","MGI (Ferro) / Austria West Zone","MGI / Austria West","","","Austria west of 11deg 50min East of Greenwich (29 deg 30 min East of Ferro).","projected 2D","","","East","North","X","Y","9001","","4805","18041","1995-06-02 00:00:00","","EPSG","Superceded by MGI / M34 (EPSG code 31296).","97.01",NULL};
+datafile_rows_t horiz_cs_row_974[] = {"31292","MGI (Ferro) / Austria Central Zone","MGI / Austria Central","","","Austria between 11deg 50min and 14deg 50min East of Greenwich (29 deg 30 min and 32 deg 30 min East of Ferro).","projected 2D","","","East","North","X","Y","9001","","4805","18042","1995-06-02 00:00:00","","EPSG","Superceded by MGI / M31 (EPSG code 31295).","97.01",NULL};
+datafile_rows_t horiz_cs_row_975[] = {"31293","MGI (Ferro) / Austria East Zone","MGI / Austria East","","","Austria east of 14deg 50min East of Greenwich (32 deg 30 min East of Ferro).","projected 2D","","","East","North","X","Y","9001","","4805","18043","1995-06-02 00:00:00","","EPSG","Superceded by MGI / M28 (EPSG code 31294).","97.01",NULL};
+datafile_rows_t horiz_cs_row_976[] = {"31294","MGI / M28","","","","Austria west of 11deg 50min East of Greenwich (29 deg 30 min East of Ferro).","projected 2D","","","East","North","X","Y","9001","","4312","18044","1999-10-20 00:00:00","","EPSG","Supercedes MGI (Ferro) / Austria East zone (EPSG code 31293).","",NULL};
+datafile_rows_t horiz_cs_row_977[] = {"31295","MGI / M31","","","","Austria between 11deg 50min and 14deg 50min East of Greenwich (29 deg 30 min and 32 deg 30 min East of Ferro).","projected 2D","","","East","North","X","Y","9001","","4312","18045","1999-10-20 00:00:00","","EPSG","Supercedes MGI (Ferro) / Austria Central zone (EPSG code 31292).","",NULL};
+datafile_rows_t horiz_cs_row_978[] = {"31296","MGI / M34","","","","Austria east of 14deg 50min East of Greenwich (32 deg 30 min East of Ferro).","projected 2D","","","East","North","X","Y","9001","","4312","18046","1999-10-20 00:00:00","","EPSG","Supercedes MGI (Ferro) / Austria West zone (EPSG code 31291).","",NULL};
+datafile_rows_t horiz_cs_row_979[] = {"31297","MGI / Austria Lambert","","","","Austria","projected 2D","","","East","North","X","Y","9001","","4312","19947","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_980[] = {"31300","Belge 1972 / Belge Lambert 72","Belge Lambert 72","","","Belgium - onshore.","projected 2D","","","East","North","X","Y","9001","","4313","19902","1995-06-02 00:00:00","","EPSG","Supersedes 21500 (Belge 1950 / Belge Lambert 50).","",NULL};
+datafile_rows_t horiz_cs_row_981[] = {"31491","DHDN / Germany zone 1","","","","Germany - onshore west of 4 deg 30 min East.","projected 2D","","","East","North","X","Y","9001","","4314","18101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_982[] = {"31492","DHDN / Germany zone 2","","","","Germany - onshore between 4 deg 30 min and 7 deg 30 min East.","projected 2D","","","East","North","X","Y","9001","","4314","18102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_983[] = {"31493","DHDN / Germany zone 3","","","","Germany - onshore between 7 deg 30 min and 10 deg 30 min East.","projected 2D","","","East","North","X","Y","9001","","4314","18103","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_984[] = {"31494","DHDN / Germany zone 4","","","","Germany - onshore between 10 deg 30 min and 13 deg 30 min East.","projected 2D","","","East","North","X","Y","9001","","4314","18104","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_985[] = {"31495","DHDN / Germany zone 5","","","","Germany - onshore between 13 deg 30 min and 16 deg 30 min East.","projected 2D","","","East","North","X","Y","9001","","4314","18105","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_986[] = {"31600","Dealul Piscului 1933/ Stereo 33","Stereo 33","","","Romania.","projected 2D","","","East","North","X","Y","9001","","4316","19927","1996-04-12 00:00:00","","EPSG","Superseded by Stereo 70 system (ProjCS code 31700).","",NULL};
+datafile_rows_t horiz_cs_row_987[] = {"31700","Dealul Piscului 1970/ Stereo 70","Stereo 70","","","Romania.","projected 2D","","","North","East","X","Y","9001","","4317","19926","1996-04-12 00:00:00","","EPSG","Supersedes Stereo 33 system.","",NULL};
+datafile_rows_t horiz_cs_row_988[] = {"31838","NGN / UTM zone 38N","","","","Kuwait west of 48deg East.","projected 2D","","","East","North","E","N","9001","","4318","16038","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_989[] = {"31839","NGN / UTM zone 39N","","","","Kuwait east of 48deg East.","projected 2D","","","East","North","E","N","9001","","4318","16039","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_990[] = {"31900","KUDAMS / KTM","","","","Kuwait - Kuwait City.","projected 2D","","","East","North","E","N","9001","","4319","19928","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_991[] = {"32001","NAD27 / Montana North","","","","United States (USA) - Montana - MT_N - counties of Blaine; Chouteau; Daniels; Flathead; Glacier; Hill; Liberty; Lincoln; Phillips; Pondera; Roosevelt; Sheridan; Teton; Toole; Valley","projected 2D","","","East","North","X","Y","9003","","4267","12501","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_992[] = {"32002","NAD27 / Montana Central","","","","United States (USA) - Montana - MT_C - counties of Cascade; Dawson; Fergus; Garfield; Judith Basin; Lake; Lewis and Clark; McCone; Meagher; Mineral; Missoula; Petroleum; Powell; Prairie; Richland; Sanders; Wibaux","projected 2D","","","East","North","X","Y","9003","","4267","12502","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_993[] = {"32003","NAD27 / Montana South","","","","United States (USA) - Montana - MT_S - counties of Beaverhead; Big Horn; Broadwater; Carbon; Carter; Custer; Deer Lodge; Fallon; Gallatin; Golden Valley; Granite; Jefferson; Madison; Musselshell; Park; Powder River; Ravalli; Rosebud; Silver Bow; Stillwater","projected 2D","","","East","North","X","Y","9003","","4267","12503","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_994[] = {"32005","NAD27 / Nebraska North","","","","United States (USA) - Nebraska - NE_N - counties of Antelope; Blaine; Box Butte; Boyd; Brown; Burt; Cedar; Cherry; Cuming; Dakota; Dawes; Dixon; Garfield; Grant; Holt; Hooker; Keya Paha; Knox; Loup; Madison; Pierce; Rock; Sheridan; Sioux; Stanton; Thomas; ","projected 2D","","","East","North","X","Y","9003","","4267","12601","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_995[] = {"32006","NAD27 / Nebraska South","","","","United States (USA) - Nebraska - NE_S - counties of Adams; Arthur; Banner; Boone; Buffalo; Butler; Cass; Chase; Cheyenne; Clay; Colfax; Custer; Dawson; Deuel; Dodge; Douglas; Dundy; Fillmore; Franklin; Frontier; Furnas; Gage; Garden; Gosper; Greeley; Hall;","projected 2D","","","East","North","X","Y","9003","","4267","12602","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_996[] = {"32007","NAD27 / Nevada East","","","","United States (USA) - Nevada - NV_E - counties of Clark; Elko; Eureka; Lincoln; White Pine","projected 2D","","","East","North","X","Y","9003","","4267","12701","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_997[] = {"32008","NAD27 / Nevada Central","","","","United States (USA) - Nevada - NV_C - counties of Lander; Nye","projected 2D","","","East","North","X","Y","9003","","4267","12702","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_998[] = {"32009","NAD27 / Nevada West","","","","United States (USA) - Nevada - NV_W - counties of Churchill; Douglas; Esmeralda; Humboldt; Lyon; Mineral; Pershing; Storey; Washoe","projected 2D","","","East","North","X","Y","9003","","4267","12703","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_999[] = {"32010","NAD27 / New Hampshire","","","","United States (USA) - New Hampshire - NH - counties of Belknap; Carroll; Cheshire; Coos; Grafton; Hillsborough; Merrimack; Rockingham; Strafford; Sullivan","projected 2D","","","East","North","X","Y","9003","","4267","12800","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1000[] = {"32011","NAD27 / New Jersey","","","","United States (USA) - New Jersey - NJ - counties of Atlantic; Bergen; Burlington; Camden; Cape May; Cumberland; Essex; Gloucester; Hudson; Hunterdon; Mercer; Middlesex; Monmouth; Morris; Ocean; Passaic; Salem; Somerset; Sussex; Union; Warren","projected 2D","","","East","North","X","Y","9003","","4267","12900","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1001[] = {"32012","NAD27 / New Mexico East","","","","United States (USA) - New Mexico - NM_E - counties of Chaves; Colfax; Curry; De Baca; Eddy; Guadalupe; Harding; Lea; Mora; Quay; Roosevelt; San Miguel; Union","projected 2D","","","East","North","X","Y","9003","","4267","13001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1002[] = {"32013","NAD27 / New Mexico Central","NAD27 / New Mexico Cent.","","","United States (USA) - New Mexico - NM_C - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance","projected 2D","","","East","North","X","Y","9003","","4267","13002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1003[] = {"32014","NAD27 / New Mexico West","","","","United States (USA) - New Mexico - NM_W - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra; Valencia","projected 2D","","","East","North","X","Y","9003","","4267","13003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1004[] = {"32015","NAD27 / New York East","","","","United States (USA) - New York - NY_E - counties of Albany; Clinton; Columbia; Delaware; Dutchess; Essex; Franklin; Fulton; Greene; Hamilton; Herkimer; Montgomery; Orange; Otsego; Putnam; Rensselaer; Rockland; Saratoga; Schenectady; Schoharie; St. Lawrence","projected 2D","","","East","North","X","Y","9003","","4267","13101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1005[] = {"32016","NAD27 / New York Central","","","","United States (USA) - New York - NY_C - counties of Broome; Cayuga; Chemung; Chenango; Cortland; Jefferson; Lewis; Madison; Oneida; Onondaga; Ontario; Oswego; Schuyler; Seneca; Steuben; Tioga; Tompkins; Wayne; Yates","projected 2D","","","East","North","X","Y","9003","","4267","13102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1006[] = {"32017","NAD27 / New York West","","","","United States (USA) - New York - NY_W - counties of Allegany; Cattaraugus; Chautauqua; Erie; Genesee; Livingston; Monroe; Niagara; Orleans; Wyoming","projected 2D","","","East","North","X","Y","9003","","4267","13103","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1007[] = {"32018","NAD27 / New York Long Island","NAD27 / New York Long Is","","","United States (USA) - New York - NY_LI - counties of Bronx; Kings; Nassau; New York; Queens; Richmond; Suffolk","projected 2D","","","East","North","X","Y","9003","","4267","13104","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1008[] = {"32019","NAD27 / North Carolina","","","","United States (USA) - North Carolina - NC - counties of Alamance; Alexander; Alleghany; Anson; Ashe; Avery; Beaufort; Bertie; Bladen; Brunswick; Buncombe; Burke; Cabarrus; Caldwell; Camden; Carteret; Caswell; Catawba; Chatham; Cherokee; Chowan; Clay; Cleve","projected 2D","","","East","North","X","Y","9003","","4267","13200","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1009[] = {"32020","NAD27 / North Dakota North","NAD27 / North Dakota N","","","United States (USA) - North Dakota - ND_N - counties of Benson; Bottineau; Burke; Cavalier; Divide; Eddy; Foster; Grand Forks; Griggs; McHenry; McKenzie; McLean; Mountrial; Nelson; Pembina; Pierce; Ramsey; Renville; Rolette; Sheridan; Steele; Towner; Trail","projected 2D","","","East","North","X","Y","9003","","4267","13301","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1010[] = {"32021","NAD27 / North Dakota South","NAD27 / North Dakota S","","","United States (USA) - North Dakota - ND_S - counties of Adams; Barnes; Billings; Bowman; Burleigh; Cass; Dickey; Dunn; Emmons; Golden Valley; Grant; Hettinger; Kidder; La Moure; Logan; McIntosh; Mercer; Morton; Oliver; Ransom; Richland; Sargent; Sioux; Slo","projected 2D","","","East","North","X","Y","9003","","4267","13302","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1011[] = {"32022","NAD27 / Ohio North","","","","United States (USA) - Ohio - OH_N - counties of Allen;Ashland; Ashtabula; Auglaize; Carroll; Columbiana; Coshocton; Crawford; Cuyahoga; Defiance; Delaware; Erie; Fulton; Geauga; Hancock; Hardin; Harrison; Henry; Holmes; Huron; Jefferson; Knox; Lake; Logan;","projected 2D","","","East","North","X","Y","9003","","4267","13401","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1012[] = {"32023","NAD27 / Ohio South","","","","United States (USA) - Ohio - OH_S - counties of Adams; Athens; Belmont; Brown; Butler; Champaign; Clark; Clermont; Clinton; Darke; Fairfield; Fayette; Franklin; Gallia; Greene; Guernsey; Hamilton; Highland; Hocking; Jackson; Lawrence; Licking; Madison; Mei","projected 2D","","","East","North","X","Y","9003","","4267","13402","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1013[] = {"32024","NAD27 / Oklahoma North","","","","United States (USA) - Oklahoma - OK_N - counties of Adair; Alfalfa; Beaver; Blaine; Canadian; Cherokee; Cimarron; Craig; Creek; Custer; Delaware; Dewey; Ellis; Garfield; Grant; Harper; Kay; Kingfisher; Lincoln; Logan; Major; Mayes; Muskogee; Noble; Nowata;","projected 2D","","","East","North","X","Y","9003","","4267","13501","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1014[] = {"32025","NAD27 / Oklahoma South","","","","United States (USA) - Oklahoma - OK_S - counties of Atoka; Beckham; Bryan; Caddo; Carter; Choctaw; Cleveland; Coal; Comanche; Cotton; Garvin; Grady; Greer; Harmon; Haskell; Hughes; Jackson; Jefferson; Johnston; Kiowa; Latimer; Le Flore; Love; Marshall; McC","projected 2D","","","East","North","X","Y","9003","","4267","13502","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1015[] = {"32026","NAD27 / Oregon North","","","","United States (USA) - Oregon - OR_N - counties of Baker; Benton; Clackamas; Clatsop; Columbia; Gilliam; Grant; Hood River; Jefferson; Lincoln; Linn; Marion; Morrow; Multnomah; Polk; Sherman; Tillamook; Umatilla; Union; Wallowa; Wasco; Washington; Wheeler; ","projected 2D","","","East","North","X","Y","9003","","4267","13601","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1016[] = {"32027","NAD27 / Oregon South","","","","United States (USA) - Oregon - OR_S - counties of Coos; Crook; Curry; Deschutes; Douglas; Harney; Jackson; Josephine; Klamath; Lake; Lane; Malheur","projected 2D","","","East","North","X","Y","9003","","4267","13602","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1017[] = {"32028","NAD27 / Pennsylvania North","NAD27 / Pennsylvania N","","","United States (USA) - Pennsylvania - PA_N - counties of Bradford; Cameron; Carbon; Centre; Clarion; Clearfield; Clinton; Columbia; Crawford; Elk; Erie; Forest; Jefferson; Lackawanna; Luzerne; Lycoming; McKean; Mercer; Monroe; Montour; Northumberland; Pike;","projected 2D","","","East","North","X","Y","9003","","4267","13701","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1018[] = {"32029","NAD27 / Pennsylvania South","NAD27 / Pennsylvania S","","","United States (USA) - Pennsylvania - PA_S - counties of Adams; Allegheny; Armstrong; Beaver; Bedford; Berks; Blair; Bucks; Butler; Cambria; Chester; Cumberland; Dauphin; Delaware; Fayette; Franklin; Fulton; Greene; Huntingdon; Indiana; Juniata; Lancaster; ","projected 2D","","","East","North","X","Y","9003","","4267","13702","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1019[] = {"32030","NAD27 / Rhode Island","","","","United States (USA) - Rhode Island - RI - counties of Bristol; Kent; Newport; Providence; Washington","projected 2D","","","East","North","X","Y","9003","","4267","13800","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1020[] = {"32031","NAD27 / South Carolina North","NAD27 / South Carolina N","","","United States (USA) - South Carolina - SC_N - counties of Abbeville; Anderson; Calhoun; Cherokee; Chester; Chesterfield; Darlington; Dillon; Edgefield; Fairfield; Florence; Greenville; Greenwood; Horry; Kershaw; Lancaster; Laurens; Lee; Lexington; Marion; ","projected 2D","","","East","North","X","Y","9003","","4267","13901","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1021[] = {"32033","NAD27 / South Carolina South","NAD27 / South Carolina S","","","United States (USA) - South Carolina - SC_S - counties of Aiken; Allendale; Bamberg; Barnwell; Beaufort; Berkeley; Charleston; Clarendon; Colleton; Dorchester; Georgetown; Hampton; Jasper; Orangeburg; Williamsburg","projected 2D","","","East","North","X","Y","9003","","4267","13902","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1022[] = {"32034","NAD27 / South Dakota North","NAD27 / South Dakota N","","","United States (USA) - South Dakota - SD_N - counties of Beadle; Brookings; Brown; Butte; Campbell; Clark; Codington; Corson; Day; Deuel; Dewey; Edmunds; Faulk; Grant; Hamlin; Hand; Harding; Hyde; Kingsbury; Lawrence; Marshall; McPherson; Meade; Perkins; Po","projected 2D","","","East","North","X","Y","9003","","4267","14001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1023[] = {"32035","NAD27 / South Dakota South","NAD27 / South Dakota S","","","United States (USA) - South Dakota - SD_S - counties of Aurora; Bennett; Bon Homme; Brule; Buffalo; Charles Mix; Clay; Custer; Davison; Douglas; Fall River; Gregory; Haakon; Hanson; Hughes; Hutchinson; Jackson; Jerauld; Jones; Lake; Lincoln; Lyman; McCook;","projected 2D","","","East","North","X","Y","9003","","4267","14002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1024[] = {"32036","NAD27 / Tennessee","","","","United States (USA) - Tennessee - TN - counties of Anderson; Bedford; Benton; Bledsoe; Blount; Bradley; Campbell; Cannon; Carroll; Carter; Cheatham; Chester; Claiborne; Clay; Cocke; Coffee; Crockett; Cumberland; Davidson; De Kalb; Decatur; Dickson; Dyer; F","projected 2D","","","East","North","X","Y","9003","","4267","14100","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1025[] = {"32037","NAD27 / Texas North","","","","United States (USA) - Texas -TX_N - counties of: Armstrong; Briscoe; Carson; Castro; Childress; Collingsworth; Dallam; Deaf Smith; Donley; Gray; Hall; Hansford; Hartley; Hemphill; Hutchinson; Lipscomb; Moore; Ochiltree; Oldham; Parmer; Potter; Randall; Rob","projected 2D","","","East","North","X","Y","9003","","4267","14201","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1026[] = {"32038","NAD27 / Texas North Central","NAD27 / Texas North Cen.","","","United States (USA) - Texas -TX_NC - counties of: Andrews; Archer; Bailey; Baylor; Borden; Bowie; Callahan; Camp; Cass; Clay; Cochran; Collin; Cooke; Cottle; Crosby; Dallas; Dawson; Delta; Denton; Dickens; Eastland; Ellis; Erath; Fannin; Fisher; Floyd; Foa","projected 2D","","","East","North","X","Y","9003","","4267","14202","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1027[] = {"32039","NAD27 / Texas Central","","","","United States (USA) - Texas -TX_C - counties of Anderson; Angelina; Bastrop; Bell; Blanco; Bosque; Brazos; Brown; Burleson; Burnet; Cherokee; Coke; Coleman; Comanche; Concho; Coryell; Crane; Crockett; Culberson; Ector; El Paso; Falls; Freestone; Gillespie;","projected 2D","","","East","North","X","Y","9003","","4267","14203","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1028[] = {"32040","NAD27 / Texas South Central","NAD27 / Texas South Cen.","","","United States (USA) - Texas -TX_SC - counties of Aransas; Atascosa; Austin; Bandera; Bee; Bexar; Brazoria; Brewster; Caldwell; Calhoun; Chambers; Colorado; Comal; De Witt; Dimmit; Edwards; Fayette; Fort Bend; Frio; Galveston; Goliad; Gonzales; Guadalupe; H","projected 2D","","","East","North","X","Y","9003","","4267","14204","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1029[] = {"32041","NAD27 / Texas South","","","","United States (USA) - Texas -TX_S - counties of Brooks; Cameron; Duval; Hidalgo; Jim Hogg; Jim Wells; Kenedy; Kleberg; Nueces; San Patricio; Starr; Webb; Willacy; Zapata; - Gulf of Mexico outer continental shelf (OCS) protraction areas: South Padre Island","projected 2D","","","East","North","X","Y","9003","","4267","14205","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1030[] = {"32042","NAD27 / Utah North","","","","United States (USA) - Utah - UT_N - counties of Box Elder; Cache; Daggett; Davis; Morgan; Rich; Summit; Weber","projected 2D","","","East","North","X","Y","9003","","4267","14301","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1031[] = {"32043","NAD27 / Utah Central","","","","United States (USA) - Utah - UT_C - counties of Carbon; Duchesne; Emery; Grand; Juab; Millard; Salt Lake; Sanpete; Sevier; Tooele; Uintah; Utah; Wasatch","projected 2D","","","East","North","X","Y","9003","","4267","14302","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1032[] = {"32044","NAD27 / Utah South","","","","United States (USA) - Utah - UT_S - counties of Beaver; Garfield; Iron; Kane; Piute; San Juan; Washington; Wayne","projected 2D","","","East","North","X","Y","9003","","4267","14303","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1033[] = {"32045","NAD27 / Vermont","","","","United States (USA) - Vermont - VT - counties of Addison; Bennington; Caledonia; Chittenden; Essex; Franklin; Grand Isle; Lamoille; Orange; Orleans; Rutland; Washington; Windham; Windsor","projected 2D","","","East","North","X","Y","9003","","4267","14400","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1034[] = {"32046","NAD27 / Virginia North","","","","United States (USA) - Virginia - VA_N - counties of Arlington; Augusta; Bath; Caroline; Clarke; Culpeper; Fairfax; Fauquier; Frederick; Greene; Highland; King George; Loudoun; Madison; Orange; Page; Prince William; Rappahannock; Rockingham; Shenandoah; Spo","projected 2D","","","East","North","X","Y","9003","","4267","14501","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1035[] = {"32047","NAD27 / Virginia South","","","","United States (USA) - Virginia - VA_S - counties of Accomack; Albemarle; Alleghany; Amelia; Amherst; Appomattox; Bedford; Bland; Botetourt; Bristol; Brunswick; Buchanan; Buckingham; Campbell; Carroll; Charles City; Charlotte; Chesapeake; Chesterfield; Colo","projected 2D","","","East","North","X","Y","9003","","4267","14502","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1036[] = {"32048","NAD27 / Washington North","","","","United States (USA) - Washington - WA_N - counties of Chelan; Clallam; Douglas; Ferry; Island; Jefferson; King; Kitsap; Lincoln; Okanogan; Pend Oreille; San Juan; Skagit; Snohomish; Spokane; Stevens; Whatcom","projected 2D","","","East","North","X","Y","9003","","4267","14601","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1037[] = {"32049","NAD27 / Washington South","","","","United States (USA) - Washington - WA_S - counties of Adams; Asotin; Benton; Clark; Columbia; Cowlitz; Franklin; Garfield; Grant; Grays Harbor; Kittitas; Klickitat; Lewis; Mason; Pacific; Pierce; Skamania; Thurston; Wahkiakum; Walla Walla; Whitman; Yakima","projected 2D","","","East","North","X","Y","9003","","4267","14602","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1038[] = {"32050","NAD27 / West Virginia North","NAD27 / West Virginia N","","","United States (USA) - West Virginia - WV_N - counties of Barbour; Berkeley; Brooke; Doddridge; Grant; Hampshire; Hancock; Hardy; Harrison; Jefferson; Marion; Marshall; Mineral; Monongalia; Morgan; Ohio; Pleasants; Preston; Ritchie; Taylor; Tucker; Tyler; W","projected 2D","","","East","North","X","Y","9003","","4267","14701","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1039[] = {"32051","NAD27 / West Virginia South","NAD27 / West Virginia S","","","United States (USA) - West Virginia - WV_S - counties of Boone; Braxton; Cabell; Calhoun; Clay; Fayette; Gilmer; Greenbrier; Jackson; Kanawha; Lewis; Lincoln; Logan; Mason; McDowell; Mercer; Mingo; Monroe; Nicholas; Pendleton; Pocahontas; Putnam; Raleigh; ","projected 2D","","","East","North","X","Y","9003","","4267","14702","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1040[] = {"32052","NAD27 / Wisconsin North","","","","United States (USA) - Wisconsin - WI_N - counties of Ashland; Bayfield; Burnett; Douglas; Florence; Forest; Iron; Oneida; Price; Sawyer; Vilas; Washburn","projected 2D","","","East","North","X","Y","9003","","4267","14801","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1041[] = {"32053","NAD27 / Wisconsin Central","NAD27 / Wisconsin Cen.","","","United States (USA) - Wisconsin - WI_C - counties of Barron; Brown; Buffalo; Chippewa; Clark; Door; Dunn; Eau Claire; Jackson; Kewaunee; Langlade; Lincoln; Marathon; Marinette; Menominee; Oconto; Outagamie; Pepin; Pierce; Polk; Portage; Rusk; Shawano; St. ","projected 2D","","","East","North","X","Y","9003","","4267","14802","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1042[] = {"32054","NAD27 / Wisconsin South","","","","United States (USA) - Wisconsin - WI_S - counties of Adams; Calumet; Columbia; Crawford; Dane; Dodge; Fond Du Lac; Grant; Green; Green Lake; Iowa; Jefferson; Juneau; Kenosha; La Crosse; Lafayette; Manitowoc; Marquette; Milwaukee; Monroe; Ozaukee; Racine; R","projected 2D","","","East","North","X","Y","9003","","4267","14803","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1043[] = {"32055","NAD27 / Wyoming East","","","","United States (USA) - Wyoming - WY_E - counties of Albany; Campbell; Converse; Crook; Goshen; Laramie; Niobrara; Platte; Weston","projected 2D","","","East","North","X","Y","9003","","4267","14901","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1044[] = {"32056","NAD27 / Wyoming East Central","NAD27 / Wyoming E. Cen.","","","United States (USA) - Wyoming - WY_EC - counties of Big Horn; Carbon; Johnson; Natrona; Sheridan; Washakie","projected 2D","","","East","North","X","Y","9003","","4267","14902","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1045[] = {"32057","NAD27 / Wyoming West Central","NAD27 / Wyoming W. Cen.","","","United States (USA) - Wyoming - WY_WC - counties of Fremont; Hot Springs; Park; Sweetwater","projected 2D","","","East","North","X","Y","9003","","4267","14903","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1046[] = {"32058","NAD27 / Wyoming West","","","","United States (USA) - Wyoming - WY_W - counties of Lincoln; Sublette; Teton; Uinta","projected 2D","","","East","North","X","Y","9003","","4267","14904","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1047[] = {"32061","NAD27 / Guatemala Norte","","","","Guatemala - north of 15 deg 50 min North.","projected 2D","","","East","North","X","Y","9001","","4267","18211","1999-08-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1048[] = {"32062","NAD27 / Guatemala Sud","","","","Guatemala - south of 15 deg 50 min North.","projected 2D","","","East","North","X","Y","9001","","4267","18212","1999-08-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1049[] = {"32074","NAD27 / BLM 14N (feet)","","","","United States - Gulf of Mexico - west of approximately 96 deg West - outer continental shelf (OCS) protraction areas Corpus Christi; Port Isabel.","projected 2D","","","East","North","X","Y","9003","","4267","15914","1996-04-12 00:00:00","","EPSG","","96.03",NULL};
+datafile_rows_t horiz_cs_row_1050[] = {"32075","NAD27 / BLM 15N (feet)","","","","United States - Gulf of Mexico - 96 deg to 90 deg West - outer continental shelf (OCS) protraction areas East Breaks (EB); Alaminos Canyon (AC); Garden Banks (GB); Keathley Canyon (KC); Ewing Bank (EW); Green Canyon (GC); Walker Ridge (WR).","projected 2D","","","East","North","X","Y","9003","","4267","15915","1996-04-12 00:00:00","","EPSG","","96.03",NULL};
+datafile_rows_t horiz_cs_row_1051[] = {"32076","NAD27 / BLM 16N (feet)","","","","United States - Gulf of Mexico - 90 deg to 84 deg West - outer continental shelf (OCS) protraction areas Mobile (MO); Viosca Knoll (VK); Mississippi Canyon (MC); Atwater Valley (AT); Lund; Pensacola; Destin Dome (DD); De Soto Canyon; Lloyd; Henderson; Apal","projected 2D","","","East","North","X","Y","9003","","4267","15916","1996-04-12 00:00:00","","EPSG","","95.27 96.03",NULL};
+datafile_rows_t horiz_cs_row_1052[] = {"32077","NAD27 / BLM 17N (feet)","","","","United States - Gulf of Mexico - east of 84 deg West - outer continental shelf (OCS) protraction areas Gainesville; Tarpon Springs; St. Petersburg; Charlotte Harbor; Pulley Ridge; Dry Tortugas; Miami; Key West.","projected 2D","","","East","North","X","Y","9003","","4267","15917","1996-04-12 00:00:00","","EPSG","","96.03",NULL};
+datafile_rows_t horiz_cs_row_1053[] = {"32081","NAD27 / MTM zone 1","","","","Canada - Newfoundland - east of 54 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4267","17701","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1054[] = {"32082","NAD27 / MTM zone 2","","","","Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.","projected 2D","","","East","North","E","N","9001","","4267","17702","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1055[] = {"32083","NAD27 / MTM zone 3","","","","Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4267","17703","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1056[] = {"32084","NAD27 / MTM zone 4","","","","Canada - Newfoundland (Labrador) between 63 deg and 60 deg West.","projected 2D","","","East","North","E","N","9001","","4267","17704","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1057[] = {"32085","NAD27 / MTM zone 5","","","","Canada - Newfoundland (Labrador) between 66 deg and 63 deg West.","projected 2D","","","East","North","E","N","9001","","4267","17705","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1058[] = {"32086","NAD27 / MTM zone 6","","","","Canada - Newfoundland (Labrador) between 69 deg and 66 deg West.","projected 2D","","","East","North","E","N","9001","","4267","17706","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1059[] = {"32100","NAD83 / Montana","","","","United States (USA) - Montana - MT - counties of Beaverhead; Big Horn; Blaine; Broadwater; Carbon; Carter; Cascade; Chouteau; Custer; Daniels; Dawson; Deer Lodge; Fallon; Fergus; Flathead; Gallatin; Garfield; Glacier; Golden Valley; Granite; Hill; Jefferso","projected 2D","","","East","North","X","Y","9001","","4269","12530","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1060[] = {"32104","NAD83 / Nebraska","","","","United States (USA) - Nebraska - NE - counties of Adams; Antelope; Arthur; Banner; Blaine; Boone; Box Butte; Boyd; Brown; Buffalo; Burt; Butler; Cass; Cedar; Chase; Cherry; Cheyenne; Clay; Colfax; Cuming; Custer; Dakota; Dawes; Dawson; Deuel; Dixon; Dodge;","projected 2D","","","East","North","X","Y","9001","","4269","12630","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1061[] = {"32107","NAD83 / Nevada East","","","","United States (USA) - Nevada - NV_E - counties of Clark; Elko; Eureka; Lincoln; White Pine","projected 2D","","","East","North","X","Y","9001","","4269","12731","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1062[] = {"32108","NAD83 / Nevada Central","","","","United States (USA) - Nevada - NV_C - counties of Lander; Nye","projected 2D","","","East","North","X","Y","9001","","4269","12732","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1063[] = {"32109","NAD83 / Nevada West","","","","United States (USA) - Nevada - NV_W - counties of Churchill; Douglas; Esmeralda; Humboldt; Lyon; Mineral; Pershing; Storey; Washoe","projected 2D","","","East","North","X","Y","9001","","4269","12733","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1064[] = {"32110","NAD83 / New Hampshire","","","","United States (USA) - New Hampshire - NH - counties of Belknap; Carroll; Cheshire; Coos; Grafton; Hillsborough; Merrimack; Rockingham; Strafford; Sullivan","projected 2D","","","East","North","X","Y","9001","","4269","12830","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1065[] = {"32111","NAD83 / New Jersey","","","","United States (USA) - New Jersey - NJ - counties of Atlantic; Bergen; Burlington; Camden; Cape May; Cumberland; Essex; Gloucester; Hudson; Hunterdon; Mercer; Middlesex; Monmouth; Morris; Ocean; Passaic; Salem; Somerset; Sussex; Union; Warren","projected 2D","","","East","North","X","Y","9001","","4269","12930","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1066[] = {"32112","NAD83 / New Mexico East","","","","United States (USA) - New Mexico - NM_E - counties of Chaves; Colfax; Curry; De Baca; Eddy; Guadalupe; Harding; Lea; Mora; Quay; Roosevelt; San Miguel; Union","projected 2D","","","East","North","X","Y","9001","","4269","13031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1067[] = {"32113","NAD83 / New Mexico Central","NAD83 / New Mexico Cent.","","","United States (USA) - New Mexico - NM_C - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance; Valencia","projected 2D","","","East","North","X","Y","9001","","4269","13032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1068[] = {"32114","NAD83 / New Mexico West","","","","United States (USA) - New Mexico - NM_W - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra","projected 2D","","","East","North","X","Y","9001","","4269","13033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1069[] = {"32115","NAD83 / New York East","","","","United States (USA) - New York - NY_E - counties of Albany; Clinton; Columbia; Delaware; Dutchess; Essex; Franklin; Fulton; Greene; Hamilton; Herkimer; Montgomery; Orange; Otsego; Putnam; Rensselaer; Rockland; Saratoga; Schenectady; Schoharie; St. Lawrence","projected 2D","","","East","North","X","Y","9001","","4269","13131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1070[] = {"32116","NAD83 / New York Central","","","","United States (USA) - New York - NY_C - counties of Broome; Cayuga; Chemung; Chenango; Cortland; Jefferson; Lewis; Madison; Oneida; Onondaga; Ontario; Oswego; Schuyler; Seneca; Steuben; Tioga; Tompkins; Wayne; Yates","projected 2D","","","East","North","X","Y","9001","","4269","13132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1071[] = {"32117","NAD83 / New York West","","","","United States (USA) - New York - NY_W - counties of Allegany; Cattaraugus; Chautauqua; Erie; Genesee; Livingston; Monroe; Niagara; Orleans; Wyoming","projected 2D","","","East","North","X","Y","9001","","4269","13133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1072[] = {"32118","NAD83 / New York Long Island","NAD83 / New York Long Is","","","United States (USA) - New York - NY_LI - counties of Bronx; Kings; Nassau; New York; Queens; Richmond; Suffolk","projected 2D","","","East","North","X","Y","9001","","4269","13134","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1073[] = {"32119","NAD83 / North Carolina","","","","United States (USA) - North Carolina - NC - counties of Alamance; Alexander; Alleghany; Anson; Ashe; Avery; Beaufort; Bertie; Bladen; Brunswick; Buncombe; Burke; Cabarrus; Caldwell; Camden; Carteret; Caswell; Catawba; Chatham; Cherokee; Chowan; Clay; Cleve","projected 2D","","","East","North","X","Y","9001","","4269","13230","1998-11-11 00:00:00","","EPSG","","98.30",NULL};
+datafile_rows_t horiz_cs_row_1074[] = {"32120","NAD83 / North Dakota North","NAD83 / North Dakota N","","","United States (USA) - North Dakota - ND_N - counties of Benson; Bottineau; Burke; Cavalier; Divide; Eddy; Foster; Grand Forks; Griggs; McHenry; McKenzie; McLean; Mountrial; Nelson; Pembina; Pierce; Ramsey; Renville; Rolette; Sheridan; Steele; Towner; Trail","projected 2D","","","East","North","X","Y","9001","","4269","13331","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1075[] = {"32121","NAD83 / North Dakota South","NAD83 / North Dakota S","","","United States (USA) - North Dakota - ND_S - counties of Adams; Barnes; Billings; Bowman; Burleigh; Cass; Dickey; Dunn; Emmons; Golden Valley; Grant; Hettinger; Kidder; La Moure; Logan; McIntosh; Mercer; Morton; Oliver; Ransom; Richland; Sargent; Sioux; Slo","projected 2D","","","East","North","X","Y","9001","","4269","13332","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1076[] = {"32122","NAD83 / Ohio North","","","","United States (USA) - Ohio - OH_N - counties of Allen;Ashland; Ashtabula; Auglaize; Carroll; Columbiana; Coshocton; Crawford; Cuyahoga; Defiance; Delaware; Erie; Fulton; Geauga; Hancock; Hardin; Harrison; Henry; Holmes; Huron; Jefferson; Knox; Lake; Logan;","projected 2D","","","East","North","X","Y","9001","","4269","13431","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1077[] = {"32123","NAD83 / Ohio South","","","","United States (USA) - Ohio - OH_S - counties of Adams; Athens; Belmont; Brown; Butler; Champaign; Clark; Clermont; Clinton; Darke; Fairfield; Fayette; Franklin; Gallia; Greene; Guernsey; Hamilton; Highland; Hocking; Jackson; Lawrence; Licking; Madison; Mei","projected 2D","","","East","North","X","Y","9001","","4269","13432","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1078[] = {"32124","NAD83 / Oklahoma North","","","","United States (USA) - Oklahoma - OK_N - counties of Adair; Alfalfa; Beaver; Blaine; Canadian; Cherokee; Cimarron; Craig; Creek; Custer; Delaware; Dewey; Ellis; Garfield; Grant; Harper; Kay; Kingfisher; Lincoln; Logan; Major; Mayes; Muskogee; Noble; Nowata;","projected 2D","","","East","North","X","Y","9001","","4269","13531","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1079[] = {"32125","NAD83 / Oklahoma South","","","","United States (USA) - Oklahoma - OK_S - counties of Atoka; Beckham; Bryan; Caddo; Carter; Choctaw; Cleveland; Coal; Comanche; Cotton; Garvin; Grady; Greer; Harmon; Haskell; Hughes; Jackson; Jefferson; Johnston; Kiowa; Latimer; Le Flore; Love; Marshall; McC","projected 2D","","","East","North","X","Y","9001","","4269","13532","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1080[] = {"32126","NAD83 / Oregon North","","","","United States (USA) - Oregon - OR_N - counties of Baker; Benton; Clackamas; Clatsop; Columbia; Gilliam; Grant; Hood River; Jefferson; Lincoln; Linn; Marion; Morrow; Multnomah; Polk; Sherman; Tillamook; Umatilla; Union; Wallowa; Wasco; Washington; Wheeler; ","projected 2D","","","East","North","X","Y","9001","","4269","13631","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1081[] = {"32127","NAD83 / Oregon South","","","","United States (USA) - Oregon - OR_S - counties of Coos; Crook; Curry; Deschutes; Douglas; Harney; Jackson; Josephine; Klamath; Lake; Lane; Malheur","projected 2D","","","East","North","X","Y","9001","","4269","13632","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1082[] = {"32128","NAD83 / Pennsylvania North","NAD83 / Pennsylvania N","","","United States (USA) - Pennsylvania - PA_N - counties of Bradford; Cameron; Carbon; Centre; Clarion; Clearfield; Clinton; Columbia; Crawford; Elk; Erie; Forest; Jefferson; Lackawanna; Luzerne; Lycoming; McKean; Mercer; Monroe; Montour; Northumberland; Pike;","projected 2D","","","East","North","X","Y","9001","","4269","13731","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1083[] = {"32129","NAD83 / Pennsylvania South","NAD83 / Pennsylvania S","","","United States (USA) - Pennsylvania - PA_S - counties of Adams; Allegheny; Armstrong; Beaver; Bedford; Berks; Blair; Bucks; Butler; Cambria; Chester; Cumberland; Dauphin; Delaware; Fayette; Franklin; Fulton; Greene; Huntingdon; Indiana; Juniata; Lancaster; ","projected 2D","","","East","North","X","Y","9001","","4269","13732","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1084[] = {"32130","NAD83 / Rhode Island","","","","United States (USA) - Rhode Island - RI - counties of Bristol; Kent; Newport; Providence; Washington","projected 2D","","","East","North","X","Y","9001","","4269","13830","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1085[] = {"32133","NAD83 / South Carolina","","","","United States (USA) - South Carolina - SC - counties of Abbeville; Aiken; Allendale; Anderson; Bamberg; Barnwell; Beaufort; Berkeley; Calhoun; Charleston; Cherokee; Chester; Chesterfield; Clarendon; Colleton; Darlington; Dillon; Dorchester; Edgefield; Fair","projected 2D","","","East","North","X","Y","9001","","4269","13930","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1086[] = {"32134","NAD83 / South Dakota North","NAD83 / South Dakota N","","","United States (USA) - South Dakota - SD_N - counties of Beadle; Brookings; Brown; Butte; Campbell; Clark; Codington; Corson; Day; Deuel; Dewey; Edmunds; Faulk; Grant; Hamlin; Hand; Harding; Hyde; Kingsbury; Lawrence; Marshall; McPherson; Meade; Perkins; Po","projected 2D","","","East","North","X","Y","9001","","4269","14031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1087[] = {"32135","NAD83 / South Dakota South","NAD83 / South Dakota S","","","United States (USA) - South Dakota - SD_S - counties of Aurora; Bennett; Bon Homme; Brule; Buffalo; Charles Mix; Clay; Custer; Davison; Douglas; Fall River; Gregory; Haakon; Hanson; Hughes; Hutchinson; Jackson; Jerauld; Jones; Lake; Lincoln; Lyman; McCook;","projected 2D","","","East","North","X","Y","9001","","4269","14032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1088[] = {"32136","NAD83 / Tennessee","","","","United States (USA) - Tennessee - TN - counties of Anderson; Bedford; Benton; Bledsoe; Blount; Bradley; Campbell; Cannon; Carroll; Carter; Cheatham; Chester; Claiborne; Clay; Cocke; Coffee; Crockett; Cumberland; Davidson; De Kalb; Decatur; Dickson; Dyer; F","projected 2D","","","East","North","X","Y","9001","","4269","14130","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1089[] = {"32137","NAD83 / Texas North","","","","United States (USA) - Texas -TX_N - counties of: Armstrong; Briscoe; Carson; Castro; Childress; Collingsworth; Dallam; Deaf Smith; Donley; Gray; Hall; Hansford; Hartley; Hemphill; Hutchinson; Lipscomb; Moore; Ochiltree; Oldham; Parmer; Potter; Randall; Rob","projected 2D","","","East","North","X","Y","9001","","4269","14231","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1090[] = {"32138","NAD83 / Texas North Central","NAD83 / Texas North Cen.","","","United States (USA) - Texas -TX_NC - counties of: Andrews; Archer; Bailey; Baylor; Borden; Bowie; Callahan; Camp; Cass; Clay; Cochran; Collin; Cooke; Cottle; Crosby; Dallas; Dawson; Delta; Denton; Dickens; Eastland; Ellis; Erath; Fannin; Fisher; Floyd; Foa","projected 2D","","","East","North","X","Y","9001","","4269","14232","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1091[] = {"32139","NAD83 / Texas Central","","","","United States (USA) - Texas -TX_C - counties of Anderson; Angelina; Bastrop; Bell; Blanco; Bosque; Brazos; Brown; Burleson; Burnet; Cherokee; Coke; Coleman; Comanche; Concho; Coryell; Crane; Crockett; Culberson; Ector; El Paso; Falls; Freestone; Gillespie;","projected 2D","","","East","North","X","Y","9001","","4269","14233","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1092[] = {"32140","NAD83 / Texas South Central","NAD83 / Texas South Cen.","","","United States (USA) - Texas -TX_SC - counties of Aransas; Atascosa; Austin; Bandera; Bee; Bexar; Brazoria; Brewster; Caldwell; Calhoun; Chambers; Colorado; Comal; De Witt; Dimmit; Edwards; Fayette; Fort Bend; Frio; Galveston; Goliad; Gonzales; Guadalupe; H","projected 2D","","","East","North","X","Y","9001","","4269","14234","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1093[] = {"32141","NAD83 / Texas South","","","","United States (USA) - Texas -TX_S - counties of Brooks; Cameron; Duval; Hidalgo; Jim Hogg; Jim Wells; Kenedy; Kleberg; Nueces; San Patricio; Starr; Webb; Willacy; Zapata","projected 2D","","","East","North","X","Y","9001","","4269","14235","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1094[] = {"32142","NAD83 / Utah North","","","","United States (USA) - Utah - UT_N - counties of Box Elder; Cache; Daggett; Davis; Morgan; Rich; Summit; Weber","projected 2D","","","East","North","X","Y","9001","","4269","14331","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1095[] = {"32143","NAD83 / Utah Central","","","","United States (USA) - Utah - UT_C - counties of Carbon; Duchesne; Emery; Grand; Juab; Millard; Salt Lake; Sanpete; Sevier; Tooele; Uintah; Utah; Wasatch","projected 2D","","","East","North","X","Y","9001","","4269","14332","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1096[] = {"32144","NAD83 / Utah South","","","","United States (USA) - Utah - UT_S - counties of Beaver; Garfield; Iron; Kane; Piute; San Juan; Washington; Wayne","projected 2D","","","East","North","X","Y","9001","","4269","14333","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1097[] = {"32145","NAD83 / Vermont","","","","United States (USA) - Vermont - VT - counties of Addison; Bennington; Caledonia; Chittenden; Essex; Franklin; Grand Isle; Lamoille; Orange; Orleans; Rutland; Washington; Windham; Windsor","projected 2D","","","East","North","X","Y","9001","","4269","14430","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1098[] = {"32146","NAD83 / Virginia North","","","","United States (USA) - Virginia - VA_N - counties of Arlington; Augusta; Bath; Caroline; Clarke; Culpeper; Fairfax; Fauquier; Frederick; Greene; Highland; King George; Loudoun; Madison; Orange; Page; Prince William; Rappahannock; Rockingham; Shenandoah; Spo","projected 2D","","","East","North","X","Y","9001","","4269","14531","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1099[] = {"32147","NAD83 / Virginia South","","","","United States (USA) - Virginia - VA_S - counties of Accomack; Albemarle; Alleghany; Amelia; Amherst; Appomattox; Bedford; Bland; Botetourt; Bristol; Brunswick; Buchanan; Buckingham; Campbell; Carroll; Charles City; Charlotte; Chesapeake; Chesterfield; Colo","projected 2D","","","East","North","X","Y","9001","","4269","14532","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1100[] = {"32148","NAD83 / Washington North","","","","United States (USA) - Washington - WA_N - counties of Chelan; Clallam; Douglas; Ferry; Grant north of approx. 47d30m; Island; Jefferson; King; Kitsap; Lincoln; Okanogan; Pend Oreille; San Juan; Skagit; Snohomish; Spokane; Stevens; Whatcom","projected 2D","","","East","North","X","Y","9001","","4269","14631","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1101[] = {"32149","NAD83 / Washington South","","","","United States (USA) - Washington - WA_S - counties of Adams; Asotin; Benton; Clark; Columbia; Cowlitz; Franklin; Garfield; Grant south of approx. 47d30m; Grays Harbor; Kittitas; Klickitat; Lewis; Mason; Pacific; Pierce; Skamania; Thurston; Wahkiakum; Walla","projected 2D","","","East","North","X","Y","9001","","4269","14632","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1102[] = {"32150","NAD83 / West Virginia North","NAD83 / West Virginia N","","","United States (USA) - West Virginia - WV_N - counties of Barbour; Berkeley; Brooke; Doddridge; Grant; Hampshire; Hancock; Hardy; Harrison; Jefferson; Marion; Marshall; Mineral; Monongalia; Morgan; Ohio; Pleasants; Preston; Ritchie; Taylor; Tucker; Tyler; W","projected 2D","","","East","North","X","Y","9001","","4269","14731","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1103[] = {"32151","NAD83 / West Virginia South","NAD83 / West Virginia S","","","United States (USA) - West Virginia - WV_S - counties of Boone; Braxton; Cabell; Calhoun; Clay; Fayette; Gilmer; Greenbrier; Jackson; Kanawha; Lewis; Lincoln; Logan; Mason; McDowell; Mercer; Mingo; Monroe; Nicholas; Pendleton; Pocahontas; Putnam; Raleigh; ","projected 2D","","","East","North","X","Y","9001","","4269","14732","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1104[] = {"32152","NAD83 / Wisconsin North","","","","United States (USA) - Wisconsin - WI_N - counties of Ashland; Bayfield; Burnett; Douglas; Florence; Forest; Iron; Oneida; Price; Sawyer; Vilas; Washburn","projected 2D","","","East","North","X","Y","9001","","4269","14831","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1105[] = {"32153","NAD83 / Wisconsin Central","NAD83 / Wisconsin Cen.","","","United States (USA) - Wisconsin - WI_C - counties of Barron; Brown; Buffalo; Chippewa; Clark; Door; Dunn; Eau Claire; Jackson; Kewaunee; Langlade; Lincoln; Marathon; Marinette; Menominee; Oconto; Outagamie; Pepin; Pierce; Polk; Portage; Rusk; Shawano; St. ","projected 2D","","","East","North","X","Y","9001","","4269","14832","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1106[] = {"32154","NAD83 / Wisconsin South","","","","United States (USA) - Wisconsin - WI_S - counties of Adams; Calumet; Columbia; Crawford; Dane; Dodge; Fond Du Lac; Grant; Green; Green Lake; Iowa; Jefferson; Juneau; Kenosha; La Crosse; Lafayette; Manitowoc; Marquette; Milwaukee; Monroe; Ozaukee; Racine; R","projected 2D","","","East","North","X","Y","9001","","4269","14833","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1107[] = {"32155","NAD83 / Wyoming East","","","","United States (USA) - Wyoming - WY_E - counties of Albany; Campbell; Converse; Crook; Goshen; Laramie; Niobrara; Platte; Weston","projected 2D","","","East","North","X","Y","9001","","4269","14931","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1108[] = {"32156","NAD83 / Wyoming East Central","NAD83 / Wyoming E. Cen.","","","United States (USA) - Wyoming - WY_EC - counties of Big Horn; Carbon; Johnson; Natrona; Sheridan; Washakie","projected 2D","","","East","North","X","Y","9001","","4269","14932","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1109[] = {"32157","NAD83 / Wyoming West Central","NAD83 / Wyoming W. Cen.","","","United States (USA) - Wyoming - WY_WC - counties of Fremont; Hot Springs; Park; Sweetwater","projected 2D","","","East","North","X","Y","9001","","4269","14933","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1110[] = {"32158","NAD83 / Wyoming West","","","","United States (USA) - Wyoming - WY_W - counties of Lincoln; Sublette; Teton; Uinta","projected 2D","","","East","North","X","Y","9001","","4269","14934","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1111[] = {"32161","NAD83 / Puerto Rico & Virgin Is.","","","","Puerto Rico and U.S. Virgin Islands.","projected 2D","","","East","North","X","Y","9001","","4269","15230","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1112[] = {"32180","NAD83 / SCoPQ zone 2","","","","Canada - Quebec - east of 57 deg East.","projected 2D","","","East","North","X","Y","9001","","4269","17700","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1113[] = {"32181","NAD83 / MTM zone 1","","","","Canada - Newfoundland - east of 54 deg 30 min West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17701","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1114[] = {"32182","NAD83 / MTM zone 2","","","","Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17702","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1115[] = {"32183","NAD83 / MTM zone 3","","","","Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West; Canada - Quebec between 60 deg and 57 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17703","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","Known in Quebec as \"NAD83 / [...]
+datafile_rows_t horiz_cs_row_1116[] = {"32184","NAD83 / MTM zone 4","","","","Canada - Quebec and Newfoundland (Labrador) between 63 deg and 60 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17704","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","Known in Quebec as \"NAD83 / SCoPQ zone 4\" with axis 1 and 2 abbreviation [...]
+datafile_rows_t horiz_cs_row_1117[] = {"32185","NAD83 / MTM zone 5","","","","Canada - Quebec and Newfoundland (Labrador) between 66 deg and 63 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17705","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","Known in Quebec as \"NAD83 / SCoPQ zone 5\" with axis 1 and 2 abbreviation [...]
+datafile_rows_t horiz_cs_row_1118[] = {"32186","NAD83 / MTM zone 6","","","","Canada - Quebec and Newfoundland (Labrador) between 69 deg and 66 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17706","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","Known in Quebec as \"NAD83 / SCoPQ zone 6\" with axis 1 and 2 abbreviatio [...]
+datafile_rows_t horiz_cs_row_1119[] = {"32187","NAD83 / MTM zone 7","","","","Canada - Quebec between 72 deg and 69 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17707","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources.","EPSG","Known in Quebec as \"NAD83 / SCoPQ zone 7\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.","",NULL};
+datafile_rows_t horiz_cs_row_1120[] = {"32188","NAD83 / MTM zone 8","","","","Canada - Quebec between 75 deg and 72 deg West.; Canada - Ontario - east of 75 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17708","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","Known in Quebec as \"NAD83 / SCoPQ zone 8\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.","",NULL};
+datafile_rows_t horiz_cs_row_1121[] = {"32189","NAD83 / MTM zone 9","","","","Canada - Quebec and Ontario - between 78 deg and 75 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17709","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","Known in Quebec as \"NAD83 / SCoPQ zone 9\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.","",NULL};
+datafile_rows_t horiz_cs_row_1122[] = {"32190","NAD83 / MTM zone 10","","","","Canada - Quebec west of 78 deg West; Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17710","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.", [...]
+datafile_rows_t horiz_cs_row_1123[] = {"32191","NAD83 / MTM zone 11","","","","Canada - Ontario - south of 46 deg N and west of 81 deg West.","projected 2D","","","East","North","E","N","9001","","4269","17711","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1124[] = {"32192","NAD83 / MTM zone 12","","","","Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.","projected 2D","","","East","North","E","N","9001","","4269","17712","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1125[] = {"32193","NAD83 / MTM zone 13","","","","Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.","projected 2D","","","East","North","E","N","9001","","4269","17713","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1126[] = {"32194","NAD83 / MTM zone 14","","","","Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4269","17714","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1127[] = {"32195","NAD83 / MTM zone 15","","","","Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4269","17715","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1128[] = {"32196","NAD83 / MTM zone 16","","","","Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4269","17716","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1129[] = {"32197","NAD83 / MTM zone 17","","","","Canada - Ontario - west of 94 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4269","17717","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1130[] = {"32198","NAD83 / Quebec Lambert","","","","Canada - Quebec","projected 2D","","","East","North","X","Y","9001","","4269","19944","1999-10-20 00:00:00","Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1131[] = {"32201","WGS 72 / UTM zone 1N","","","","180deg to 174deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1132[] = {"32202","WGS 72 / UTM zone 2N","","","","174deg West to 168deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1133[] = {"32203","WGS 72 / UTM zone 3N","","","","168deg West to 162deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1134[] = {"32204","WGS 72 / UTM zone 4N","","","","162deg West to 156deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1135[] = {"32205","WGS 72 / UTM zone 5N","","","","156deg West to 150deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1136[] = {"32206","WGS 72 / UTM zone 6N","","","","150deg West to 144deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1137[] = {"32207","WGS 72 / UTM zone 7N","","","","144deg West to 138deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1138[] = {"32208","WGS 72 / UTM zone 8N","","","","138deg West to 132deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1139[] = {"32209","WGS 72 / UTM zone 9N","","","","132deg West to 126deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1140[] = {"32210","WGS 72 / UTM zone 10N","","","","130deg West to 120deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1141[] = {"32211","WGS 72 / UTM zone 11N","","","","120deg West to 114deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1142[] = {"32212","WGS 72 / UTM zone 12N","","","","114deg West to 108deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1143[] = {"32213","WGS 72 / UTM zone 13N","","","","108deg West to 102deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16013","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1144[] = {"32214","WGS 72 / UTM zone 14N","","","","102deg West to 96deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16014","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1145[] = {"32215","WGS 72 / UTM zone 15N","","","","96deg West to 90deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1146[] = {"32216","WGS 72 / UTM zone 16N","","","","90deg West to 84deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16016","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1147[] = {"32217","WGS 72 / UTM zone 17N","","","","84deg West to 78deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16017","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1148[] = {"32218","WGS 72 / UTM zone 18N","","","","78deg West to 72deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16018","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1149[] = {"32219","WGS 72 / UTM zone 19N","","","","72deg West to 66deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16019","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1150[] = {"32220","WGS 72 / UTM zone 20N","","","","66deg West to 60deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1151[] = {"32221","WGS 72 / UTM zone 21N","","","","60deg West to 54deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1152[] = {"32222","WGS 72 / UTM zone 22N","","","","54deg West to 48deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1153[] = {"32223","WGS 72 / UTM zone 23N","","","","48deg West to 42deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16023","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1154[] = {"32224","WGS 72 / UTM zone 24N","","","","42deg West to 36deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16024","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1155[] = {"32225","WGS 72 / UTM zone 25N","","","","36deg West to 30deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16025","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1156[] = {"32226","WGS 72 / UTM zone 26N","","","","30deg West to 24deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16026","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1157[] = {"32227","WGS 72 / UTM zone 27N","","","","24deg West to 18deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16027","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1158[] = {"32228","WGS 72 / UTM zone 28N","","","","18deg West to 12deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16028","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1159[] = {"32229","WGS 72 / UTM zone 29N","","","","12deg West to 6deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16029","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1160[] = {"32230","WGS 72 / UTM zone 30N","","","","6deg West to 0deg; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16030","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1161[] = {"32231","WGS 72 / UTM zone 31N","","","","0deg to 6deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1162[] = {"32232","WGS 72 / UTM zone 32N","","","","6deg East to 12deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1163[] = {"32233","WGS 72 / UTM zone 33N","","","","12deg East to 18deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1164[] = {"32234","WGS 72 / UTM zone 34N","","","","18deg East to 24deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16034","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1165[] = {"32235","WGS 72 / UTM zone 35N","","","","24deg East to 30deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16035","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1166[] = {"32236","WGS 72 / UTM zone 36N","","","","30deg East to 36deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16036","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1167[] = {"32237","WGS 72 / UTM zone 37N","","","","36deg East to 42deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1168[] = {"32238","WGS 72 / UTM zone 38N","","","","42deg East to 48deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1169[] = {"32239","WGS 72 / UTM zone 39N","","","","48deg East to 54deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16039","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1170[] = {"32240","WGS 72 / UTM zone 40N","","","","54deg East to 60deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16040","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1171[] = {"32241","WGS 72 / UTM zone 41N","","","","60deg East to 66deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16041","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1172[] = {"32242","WGS 72 / UTM zone 42N","","","","66deg East to 72deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16042","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1173[] = {"32243","WGS 72 / UTM zone 43N","","","","72deg East to 78deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16043","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1174[] = {"32244","WGS 72 / UTM zone 44N","","","","78deg East to 84deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16044","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1175[] = {"32245","WGS 72 / UTM zone 45N","","","","84deg East to 90deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16045","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1176[] = {"32246","WGS 72 / UTM zone 46N","","","","90deg East to 96deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16046","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1177[] = {"32247","WGS 72 / UTM zone 47N","","","","96deg East to 102eg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16047","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1178[] = {"32248","WGS 72 / UTM zone 48N","","","","102deg East to 108deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16048","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1179[] = {"32249","WGS 72 / UTM zone 49N","","","","108deg East to 114deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16049","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1180[] = {"32250","WGS 72 / UTM zone 50N","","","","114deg East to 120deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16050","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1181[] = {"32251","WGS 72 / UTM zone 51N","","","","120deg East to 126deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16051","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1182[] = {"32252","WGS 72 / UTM zone 52N","","","","126deg East to 132deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16052","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1183[] = {"32253","WGS 72 / UTM zone 53N","","","","132deg East to 138deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16053","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1184[] = {"32254","WGS 72 / UTM zone 54N","","","","138deg East to 144deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16054","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1185[] = {"32255","WGS 72 / UTM zone 55N","","","","144deg East to 150deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16055","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1186[] = {"32256","WGS 72 / UTM zone 56N","","","","150deg East to 156deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16056","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1187[] = {"32257","WGS 72 / UTM zone 57N","","","","156deg East to 162deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16057","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1188[] = {"32258","WGS 72 / UTM zone 58N","","","","162deg East to 168deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16058","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1189[] = {"32259","WGS 72 / UTM zone 59N","","","","168deg East to 174deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16059","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1190[] = {"32260","WGS 72 / UTM zone 60N","","","","174deg East to 180deg; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16060","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1191[] = {"32301","WGS 72 / UTM zone 1S","","","","180deg to 174deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1192[] = {"32302","WGS 72 / UTM zone 2S","","","","174deg West to 168deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1193[] = {"32303","WGS 72 / UTM zone 3S","","","","168deg West to 162deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16103","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1194[] = {"32304","WGS 72 / UTM zone 4S","","","","162deg West to 156deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16104","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1195[] = {"32305","WGS 72 / UTM zone 5S","","","","156deg West to 150deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16105","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1196[] = {"32306","WGS 72 / UTM zone 6S","","","","150deg West to 144deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16106","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1197[] = {"32307","WGS 72 / UTM zone 7S","","","","144deg West to 138deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16107","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1198[] = {"32308","WGS 72 / UTM zone 8S","","","","138deg West to 132deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16108","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1199[] = {"32309","WGS 72 / UTM zone 9S","","","","132deg West to 126deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16109","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1200[] = {"32310","WGS 72 / UTM zone 10S","","","","130deg West to 120deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16110","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1201[] = {"32311","WGS 72 / UTM zone 11S","","","","120deg West to 114deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16111","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1202[] = {"32312","WGS 72 / UTM zone 12S","","","","114deg West to 108deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16112","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1203[] = {"32313","WGS 72 / UTM zone 13S","","","","108deg West to 102deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16113","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1204[] = {"32314","WGS 72 / UTM zone 14S","","","","102deg West to 96deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16114","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1205[] = {"32315","WGS 72 / UTM zone 15S","","","","96deg West to 90deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16115","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1206[] = {"32316","WGS 72 / UTM zone 16S","","","","90deg West to 84deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16116","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1207[] = {"32317","WGS 72 / UTM zone 17S","","","","84deg West to 78deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16117","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1208[] = {"32318","WGS 72 / UTM zone 18S","","","","78deg West to 72deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16118","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1209[] = {"32319","WGS 72 / UTM zone 19S","","","","72deg West to 66deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16119","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1210[] = {"32320","WGS 72 / UTM zone 20S","","","","66deg West to 60deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16120","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1211[] = {"32321","WGS 72 / UTM zone 21S","","","","60deg West to 54deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16121","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1212[] = {"32322","WGS 72 / UTM zone 22S","","","","54deg West to 48deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16122","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1213[] = {"32323","WGS 72 / UTM zone 23S","","","","48deg West to 42deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16123","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1214[] = {"32324","WGS 72 / UTM zone 24S","","","","42deg West to 36deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16124","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1215[] = {"32325","WGS 72 / UTM zone 25S","","","","36deg West to 30deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16125","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1216[] = {"32326","WGS 72 / UTM zone 26S","","","","30deg West to 24deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16126","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1217[] = {"32327","WGS 72 / UTM zone 27S","","","","24deg West to 18deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16127","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1218[] = {"32328","WGS 72 / UTM zone 28S","","","","18deg West to 12deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16128","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1219[] = {"32329","WGS 72 / UTM zone 29S","","","","12deg West to 6deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16129","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1220[] = {"32330","WGS 72 / UTM zone 30S","","","","6deg West to 0deg; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16130","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1221[] = {"32331","WGS 72 / UTM zone 31S","","","","0deg to 6deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1222[] = {"32332","WGS 72 / UTM zone 32S","","","","6deg East to 12deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1223[] = {"32333","WGS 72 / UTM zone 33S","","","","12deg East to 18deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1224[] = {"32334","WGS 72 / UTM zone 34S","","","","18deg East to 24deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16134","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1225[] = {"32335","WGS 72 / UTM zone 35S","","","","24deg East to 30deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16135","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1226[] = {"32336","WGS 72 / UTM zone 36S","","","","30deg East to 36deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16136","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1227[] = {"32337","WGS 72 / UTM zone 37S","","","","36deg East to 42deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16137","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1228[] = {"32338","WGS 72 / UTM zone 38S","","","","42deg East to 48deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16138","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1229[] = {"32339","WGS 72 / UTM zone 39S","","","","48deg East to 54deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16139","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1230[] = {"32340","WGS 72 / UTM zone 40S","","","","54deg East to 60deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16140","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1231[] = {"32341","WGS 72 / UTM zone 41S","","","","60deg East to 66deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16141","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1232[] = {"32342","WGS 72 / UTM zone 42S","","","","66deg East to 72deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16142","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1233[] = {"32343","WGS 72 / UTM zone 43S","","","","72deg East to 78deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16143","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1234[] = {"32344","WGS 72 / UTM zone 44S","","","","78deg East to 84deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16144","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1235[] = {"32345","WGS 72 / UTM zone 45S","","","","84deg East to 90deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16145","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1236[] = {"32346","WGS 72 / UTM zone 46S","","","","90deg East to 96deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16146","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1237[] = {"32347","WGS 72 / UTM zone 47S","","","","96deg East to 102eg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16147","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1238[] = {"32348","WGS 72 / UTM zone 48S","","","","102deg East to 108deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16148","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1239[] = {"32349","WGS 72 / UTM zone 49S","","","","108deg East to 114deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16149","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1240[] = {"32350","WGS 72 / UTM zone 50S","","","","114deg East to 120deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16150","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1241[] = {"32351","WGS 72 / UTM zone 51S","","","","120deg East to 126deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16151","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1242[] = {"32352","WGS 72 / UTM zone 52S","","","","126deg East to 132deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16152","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1243[] = {"32353","WGS 72 / UTM zone 53S","","","","132deg East to 138deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16153","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1244[] = {"32354","WGS 72 / UTM zone 54S","","","","138deg East to 144deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16154","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1245[] = {"32355","WGS 72 / UTM zone 55S","","","","144deg East to 150deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16155","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1246[] = {"32356","WGS 72 / UTM zone 56S","","","","150deg East to 156deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16156","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1247[] = {"32357","WGS 72 / UTM zone 57S","","","","156deg East to 162deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16157","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1248[] = {"32358","WGS 72 / UTM zone 58S","","","","162deg East to 168deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16158","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1249[] = {"32359","WGS 72 / UTM zone 59S","","","","168deg East to 174deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16159","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1250[] = {"32360","WGS 72 / UTM zone 60S","","","","174deg East to 180deg; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16160","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1251[] = {"32401","WGS 72BE / UTM zone 1N","","","","180deg to 174deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1252[] = {"32402","WGS 72BE / UTM zone 2N","","","","174deg West to 168deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1253[] = {"32403","WGS 72BE / UTM zone 3N","","","","168deg West to 162deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1254[] = {"32404","WGS 72BE / UTM zone 4N","","","","162deg West to 156deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1255[] = {"32405","WGS 72BE / UTM zone 5N","","","","156deg West to 150deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1256[] = {"32406","WGS 72BE / UTM zone 6N","","","","150deg West to 144deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1257[] = {"32407","WGS 72BE / UTM zone 7N","","","","144deg West to 138deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1258[] = {"32408","WGS 72BE / UTM zone 8N","","","","138deg West to 132deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1259[] = {"32409","WGS 72BE / UTM zone 9N","","","","132deg West to 126deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1260[] = {"32410","WGS 72BE / UTM zone 10N","","","","130deg West to 120deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1261[] = {"32411","WGS 72BE / UTM zone 11N","","","","120deg West to 114deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1262[] = {"32412","WGS 72BE / UTM zone 12N","","","","114deg West to 108deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1263[] = {"32413","WGS 72BE / UTM zone 13N","","","","108deg West to 102deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16013","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1264[] = {"32414","WGS 72BE / UTM zone 14N","","","","102deg West to 96deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16014","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1265[] = {"32415","WGS 72BE / UTM zone 15N","","","","96deg West to 90deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1266[] = {"32416","WGS 72BE / UTM zone 16N","","","","90deg West to 84deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16016","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1267[] = {"32417","WGS 72BE / UTM zone 17N","","","","84deg West to 78deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16017","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1268[] = {"32418","WGS 72BE / UTM zone 18N","","","","78deg West to 72deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16018","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1269[] = {"32419","WGS 72BE / UTM zone 19N","","","","72deg West to 66deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16019","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1270[] = {"32420","WGS 72BE / UTM zone 20N","","","","66deg West to 60deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1271[] = {"32421","WGS 72BE / UTM zone 21N","","","","60deg West to 54deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1272[] = {"32422","WGS 72BE / UTM zone 22N","","","","54deg West to 48deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1273[] = {"32423","WGS 72BE / UTM zone 23N","","","","48deg West to 42deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16023","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1274[] = {"32424","WGS 72BE / UTM zone 24N","","","","42deg West to 36deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16024","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1275[] = {"32425","WGS 72BE / UTM zone 25N","","","","36deg West to 30deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16025","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1276[] = {"32426","WGS 72BE / UTM zone 26N","","","","30deg West to 24deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16026","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1277[] = {"32427","WGS 72BE / UTM zone 27N","","","","24deg West to 18deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16027","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1278[] = {"32428","WGS 72BE / UTM zone 28N","","","","18deg West to 12deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16028","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1279[] = {"32429","WGS 72BE / UTM zone 29N","","","","12deg West to 6deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16029","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1280[] = {"32430","WGS 72BE / UTM zone 30N","","","","6deg West to 0deg; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16030","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1281[] = {"32431","WGS 72BE / UTM zone 31N","","","","0deg to 6deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1282[] = {"32432","WGS 72BE / UTM zone 32N","","","","6deg East to 12deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1283[] = {"32433","WGS 72BE / UTM zone 33N","","","","12deg East to 18deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1284[] = {"32434","WGS 72BE / UTM zone 34N","","","","18deg East to 24deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16034","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1285[] = {"32435","WGS 72BE / UTM zone 35N","","","","24deg East to 30deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16035","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1286[] = {"32436","WGS 72BE / UTM zone 36N","","","","30deg East to 36deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16036","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1287[] = {"32437","WGS 72BE / UTM zone 37N","","","","36deg East to 42deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1288[] = {"32438","WGS 72BE / UTM zone 38N","","","","42deg East to 48deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1289[] = {"32439","WGS 72BE / UTM zone 39N","","","","48deg East to 54deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16039","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1290[] = {"32440","WGS 72BE / UTM zone 40N","","","","54deg East to 60deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16040","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1291[] = {"32441","WGS 72BE / UTM zone 41N","","","","60deg East to 66deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16041","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1292[] = {"32442","WGS 72BE / UTM zone 42N","","","","66deg East to 72deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16042","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1293[] = {"32443","WGS 72BE / UTM zone 43N","","","","72deg East to 78deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16043","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1294[] = {"32444","WGS 72BE / UTM zone 44N","","","","78deg East to 84deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16044","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1295[] = {"32445","WGS 72BE / UTM zone 45N","","","","84deg East to 90deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16045","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1296[] = {"32446","WGS 72BE / UTM zone 46N","","","","90deg East to 96deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16046","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1297[] = {"32447","WGS 72BE / UTM zone 47N","","","","96deg East to 102eg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16047","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1298[] = {"32448","WGS 72BE / UTM zone 48N","","","","102deg East to 108deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16048","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1299[] = {"32449","WGS 72BE / UTM zone 49N","","","","108deg East to 114deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16049","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1300[] = {"32450","WGS 72BE / UTM zone 50N","","","","114deg East to 120deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16050","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1301[] = {"32451","WGS 72BE / UTM zone 51N","","","","120deg East to 126deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16051","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1302[] = {"32452","WGS 72BE / UTM zone 52N","","","","126deg East to 132deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16052","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1303[] = {"32453","WGS 72BE / UTM zone 53N","","","","132deg East to 138deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16053","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1304[] = {"32454","WGS 72BE / UTM zone 54N","","","","138deg East to 144deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16054","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1305[] = {"32455","WGS 72BE / UTM zone 55N","","","","144deg East to 150deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16055","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1306[] = {"32456","WGS 72BE / UTM zone 56N","","","","150deg East to 156deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16056","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1307[] = {"32457","WGS 72BE / UTM zone 57N","","","","156deg East to 162deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16057","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1308[] = {"32458","WGS 72BE / UTM zone 58N","","","","162deg East to 168deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16058","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1309[] = {"32459","WGS 72BE / UTM zone 59N","","","","168deg East to 174deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16059","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1310[] = {"32460","WGS 72BE / UTM zone 60N","","","","174deg East to 180deg; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16060","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1311[] = {"32501","WGS 72BE / UTM zone 1S","","","","180deg to 174deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1312[] = {"32502","WGS 72BE / UTM zone 2S","","","","174deg West to 168deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1313[] = {"32503","WGS 72BE / UTM zone 3S","","","","168deg West to 162deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16103","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1314[] = {"32504","WGS 72BE / UTM zone 4S","","","","162deg West to 156deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16104","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1315[] = {"32505","WGS 72BE / UTM zone 5S","","","","156deg West to 150deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16105","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1316[] = {"32506","WGS 72BE / UTM zone 6S","","","","150deg West to 144deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16106","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1317[] = {"32507","WGS 72BE / UTM zone 7S","","","","144deg West to 138deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16107","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1318[] = {"32508","WGS 72BE / UTM zone 8S","","","","138deg West to 132deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16108","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1319[] = {"32509","WGS 72BE / UTM zone 9S","","","","132deg West to 126deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16109","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1320[] = {"32510","WGS 72BE / UTM zone 10S","","","","130deg West to 120deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16110","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1321[] = {"32511","WGS 72BE / UTM zone 11S","","","","120deg West to 114deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16111","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1322[] = {"32512","WGS 72BE / UTM zone 12S","","","","114deg West to 108deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16112","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1323[] = {"32513","WGS 72BE / UTM zone 13S","","","","108deg West to 102deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16113","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1324[] = {"32514","WGS 72BE / UTM zone 14S","","","","102deg West to 96deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16114","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1325[] = {"32515","WGS 72BE / UTM zone 15S","","","","96deg West to 90deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16115","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1326[] = {"32516","WGS 72BE / UTM zone 16S","","","","90deg West to 84deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16116","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1327[] = {"32517","WGS 72BE / UTM zone 17S","","","","84deg West to 78deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16117","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1328[] = {"32518","WGS 72BE / UTM zone 18S","","","","78deg West to 72deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16118","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1329[] = {"32519","WGS 72BE / UTM zone 19S","","","","72deg West to 66deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16119","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1330[] = {"32520","WGS 72BE / UTM zone 20S","","","","66deg West to 60deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16120","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1331[] = {"32521","WGS 72BE / UTM zone 21S","","","","60deg West to 54deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16121","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1332[] = {"32522","WGS 72BE / UTM zone 22S","","","","54deg West to 48deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16122","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1333[] = {"32523","WGS 72BE / UTM zone 23S","","","","48deg West to 42deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16123","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1334[] = {"32524","WGS 72BE / UTM zone 24S","","","","42deg West to 36deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16124","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1335[] = {"32525","WGS 72BE / UTM zone 25S","","","","36deg West to 30deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16125","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1336[] = {"32526","WGS 72BE / UTM zone 26S","","","","30deg West to 24deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16126","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1337[] = {"32527","WGS 72BE / UTM zone 27S","","","","24deg West to 18deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16127","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1338[] = {"32528","WGS 72BE / UTM zone 28S","","","","18deg West to 12deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16128","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1339[] = {"32529","WGS 72BE / UTM zone 29S","","","","12deg West to 6deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16129","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1340[] = {"32530","WGS 72BE / UTM zone 30S","","","","6deg West to 0deg; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16130","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1341[] = {"32531","WGS 72BE / UTM zone 31S","","","","0deg to 6deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1342[] = {"32532","WGS 72BE / UTM zone 32S","","","","6deg East to 12deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1343[] = {"32533","WGS 72BE / UTM zone 33S","","","","12deg East to 18deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1344[] = {"32534","WGS 72BE / UTM zone 34S","","","","18deg East to 24deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16134","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1345[] = {"32535","WGS 72BE / UTM zone 35S","","","","24deg East to 30deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16135","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1346[] = {"32536","WGS 72BE / UTM zone 36S","","","","30deg East to 36deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16136","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1347[] = {"32537","WGS 72BE / UTM zone 37S","","","","36deg East to 42deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16137","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1348[] = {"32538","WGS 72BE / UTM zone 38S","","","","42deg East to 48deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16138","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1349[] = {"32539","WGS 72BE / UTM zone 39S","","","","48deg East to 54deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16139","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1350[] = {"32540","WGS 72BE / UTM zone 40S","","","","54deg East to 60deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16140","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1351[] = {"32541","WGS 72BE / UTM zone 41S","","","","60deg East to 66deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16141","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1352[] = {"32542","WGS 72BE / UTM zone 42S","","","","66deg East to 72deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16142","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1353[] = {"32543","WGS 72BE / UTM zone 43S","","","","72deg East to 78deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16143","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1354[] = {"32544","WGS 72BE / UTM zone 44S","","","","78deg East to 84deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16144","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1355[] = {"32545","WGS 72BE / UTM zone 45S","","","","84deg East to 90deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16145","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1356[] = {"32546","WGS 72BE / UTM zone 46S","","","","90deg East to 96deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16146","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1357[] = {"32547","WGS 72BE / UTM zone 47S","","","","96deg East to 102eg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16147","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1358[] = {"32548","WGS 72BE / UTM zone 48S","","","","102deg East to 108deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16148","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1359[] = {"32549","WGS 72BE / UTM zone 49S","","","","108deg East to 114deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16149","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1360[] = {"32550","WGS 72BE / UTM zone 50S","","","","114deg East to 120deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16150","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1361[] = {"32551","WGS 72BE / UTM zone 51S","","","","120deg East to 126deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16151","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1362[] = {"32552","WGS 72BE / UTM zone 52S","","","","126deg East to 132deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16152","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1363[] = {"32553","WGS 72BE / UTM zone 53S","","","","132deg East to 138deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16153","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1364[] = {"32554","WGS 72BE / UTM zone 54S","","","","138deg East to 144deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16154","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1365[] = {"32555","WGS 72BE / UTM zone 55S","","","","144deg East to 150deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16155","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1366[] = {"32556","WGS 72BE / UTM zone 56S","","","","150deg East to 156deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16156","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1367[] = {"32557","WGS 72BE / UTM zone 57S","","","","156deg East to 162deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16157","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1368[] = {"32558","WGS 72BE / UTM zone 58S","","","","162deg East to 168deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16158","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1369[] = {"32559","WGS 72BE / UTM zone 59S","","","","168deg East to 174deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16159","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1370[] = {"32560","WGS 72BE / UTM zone 60S","","","","174deg East to 180deg; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16160","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1371[] = {"32601","WGS 84 / UTM zone 1N","","","","180deg to 174deg West; northern hemisphere; Russia.","projected 2D","","","East","North","E","N","9001","","4326","16001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1372[] = {"32602","WGS 84 / UTM zone 2N","","","","174deg West to 168deg West; northern hemisphere. Russia; United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1373[] = {"32603","WGS 84 / UTM zone 3N","","","","168deg West to 162deg West; northern hemisphere. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1374[] = {"32604","WGS 84 / UTM zone 4N","","","","162deg West to 156deg West; northern hemisphere. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1375[] = {"32605","WGS 84 / UTM zone 5N","","","","156deg West to 150deg West; northern hemisphere. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1376[] = {"32606","WGS 84 / UTM zone 6N","","","","150deg West to 144deg West; northern hemisphere. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1377[] = {"32607","WGS 84 / UTM zone 7N","","","","144deg West to 138deg West; northern hemisphere. Canada - British Columbia (BC); Yukon. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1378[] = {"32608","WGS 84 / UTM zone 8N","","","","138deg West to 132deg West; northern hemisphere. Canada - British Columbia (BC); North West Territiories; Yukon. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1379[] = {"32609","WGS 84 / UTM zone 9N","","","","132deg West to 126deg West; northern hemisphere. Canada - British Columbia (BC); North West Territories; Yukon. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1380[] = {"32610","WGS 84 / UTM zone 10N","","","","130deg West to 120deg West; northern hemisphere. Canada - British Columbia (BC); North West Territories; Nunavut; Yukon. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1381[] = {"32611","WGS 84 / UTM zone 11N","","","","120deg West to 114deg West; northern hemisphere. Canada - Alberta; British Columbia (BC); North West Territories; Nunavut. Mexico. United States (USA).","projected 2D","","","East","North","E","N","9001","","4326","16011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1382[] = {"32612","WGS 84 / UTM zone 12N","","","","114deg West to 108deg West; northern hemisphere. Canada - Alberta; North West Territories; Nunavut; Saskatchewan. Mexico. United States (USA).","projected 2D","","","East","North","E","N","9001","","4326","16012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1383[] = {"32613","WGS 84 / UTM zone 13N","","","","108deg West to 102deg West; northern hemisphere. Canada - North West Territories; Nunavut; Saskatchewan. Mexico. United States (USA).","projected 2D","","","East","North","E","N","9001","","4326","16013","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1384[] = {"32614","WGS 84 / UTM zone 14N","","","","102deg West to 96deg West; northern hemisphere. Canada - Manitoba; Nunavut; Saskatchewan. Mexico. United States (USA).","projected 2D","","","East","North","E","N","9001","","4326","16014","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1385[] = {"32615","WGS 84 / UTM zone 15N","","","","96deg West to 90deg West; northern hemisphere. Canada - Manitoba; Nunavut; Ontario. Guatemala. Mexico. United States (USA) - Gulf of Mexico (GoM).","projected 2D","","","East","North","E","N","9001","","4326","16015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1386[] = {"32616","WGS 84 / UTM zone 16N","","","","90deg West to 84deg West; northern hemisphere. Belize. Canada - Manitoba; Nunavut; Ontario. Costa Rica. Cuba. El Salvador. Guatemala. Honduras. Mexico. Nicaragua. Puerto Rico. United States (USA).","projected 2D","","","East","North","E","N","9001","","4326","16016","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1387[] = {"32617","WGS 84 / UTM zone 17N","","","","84deg West to 78deg West; northern hemisphere. Bahamas. Ecuador - north of equator. Canada - Nunavut; Ontario; Quebec. Cayman Islands. Colombia. Costa Rica. Jamaica. Nicaragua. Panama. Puerto Rico. United States (USA).","projected 2D","","","East","North","E","N","9001","","4326","16017","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1388[] = {"32618","WGS 84 / UTM zone 18N","","","","78deg West to 72deg West; northern hemisphere. Bahamas. Canada - Nunavut; Ontario; Quebec. Colombia. Cuba. Ecuador. Greenland. Haiti. Jamica. Panama. Turks and Caicos Islands. United States (USA). Venezuela.","projected 2D","","","East","North","E","N","9001","","4326","16018","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1389[] = {"32619","WGS 84 / UTM zone 19N","","","","72deg West to 66deg West; northern hemisphere. Aruba. Bahamas. Brazil. Canada - New Brunswick (NB); Newfoundland; Nunavut; Nova Scotia (NS); Quebec. Colombia. Dominican Republic. Greenland. Netherlands Antilles. Puerto Rico. Turks and Caicos Islands. Unite","projected 2D","","","East","North","E","N","9001","","4326","16019","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1390[] = {"32620","WGS 84 / UTM zone 20N","","","","66deg West to 60deg West; northern hemisphere. Anguilla. Antigua & Barbuda. Bermuda. Brazil. Canada - New Brunswick (NB); Newfoundland; North west Territories; Nova Scotia (NS); Prince Edward Island; Quebec. Dominica. Greenland. Grenada. Guadeloupe. Guyana","projected 2D","","","East","North","E","N","9001","","4326","16020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1391[] = {"32621","WGS 84 / UTM zone 21N","","","","60deg West to 54deg West; northern hemisphere. Barbados. Brazil. Canada - Newfoundland; Quebec. French Guiana. Greenland. Guyana. St. Pierre and Miquelon. Suriname.","projected 2D","","","East","North","E","N","9001","","4326","16021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1392[] = {"32622","WGS 84 / UTM zone 22N","","","","54deg West to 48deg West; northern hemisphere. Brazil. Canada - Newfoundland. French Guiana. Greenland.","projected 2D","","","East","North","E","N","9001","","4326","16022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1393[] = {"32623","WGS 84 / UTM zone 23N","","","","48deg West to 42deg West; northern hemisphere. Greenland.","projected 2D","","","East","North","E","N","9001","","4326","16023","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1394[] = {"32624","WGS 84 / UTM zone 24N","","","","42deg West to 36deg West; northern hemisphere. Greenland.","projected 2D","","","East","North","E","N","9001","","4326","16024","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1395[] = {"32625","WGS 84 / UTM zone 25N","","","","36deg West to 30deg West; northern hemisphere. Greenland.","projected 2D","","","East","North","E","N","9001","","4326","16025","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1396[] = {"32626","WGS 84 / UTM zone 26N","","","","30deg West to 24deg West; northern hemisphere. Greenland. Iceland.","projected 2D","","","East","North","E","N","9001","","4326","16026","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1397[] = {"32627","WGS 84 / UTM zone 27N","","","","24deg West to 18deg West; northern hemisphere. Greenland. Iceland.","projected 2D","","","East","North","E","N","9001","","4326","16027","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1398[] = {"32628","WGS 84 / UTM zone 28N","","","","18deg West to 12deg West; northern hemisphere. Gambia. Greenland. Guinea. Guinea-Bissau. Iceland. Ireland - offshore Porcupine Basin. Mauritania. Morocco. Senegal. Sierra Leone. Western Sahara.","projected 2D","","","East","North","E","N","9001","","4326","16028","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1399[] = {"32629","WGS 84 / UTM zone 29N","","","","12deg West to 6deg West; northern hemisphere. Algeria. Cote D'Ivoire (Ivory Coast). Faroe Islands. Guinea. Ireland. Mali. Mauritania. Morocco. Portugal. Sierra Leone. Spain. United Kingdom (UK). Western Sahara.","projected 2D","","","East","North","E","N","9001","","4326","16029","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1400[] = {"32630","WGS 84 / UTM zone 30N","","","","6deg West to 0deg; northern hemisphere. Algeria. Burkino Faso. Cote' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK).","projected 2D","","","East","North","E","N","9001","","4326","16030","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1401[] = {"32631","WGS 84 / UTM zone 31N","","","","0deg to 6deg East; northern hemisphere. Algeria. Andorra. Benin. Bukino Faso. Denmark - North Sea. France. Germany - North Sea. Ghana. Luxembourg. Mali. Netherlands. Niger. Nigeria. Norway. Spain. Togo. United Kingdom (UK) - North Sea.","projected 2D","","","East","North","E","N","9001","","4326","16031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1402[] = {"32632","WGS 84 / UTM zone 32N","","","","6deg East to 12deg East; northern hemisphere. Algeria. Austria. Cameroon. Denmark. Equatorial Guinea. France. Gabon. Germany. Italy. Libya. Liechtenstein. Monaco. Netherlands. Niger. Nigeria. Norway. Sao Tome and Principe. Svalbard and Jan Mayen Islands. S","projected 2D","","","East","North","E","N","9001","","4326","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1403[] = {"32633","WGS 84 / UTM zone 33N","","","","12deg East to 18deg East; northern hemisphere. Austria. Bosnia and Herzegowina. Cmeroon. Central African Republic. Chad. Congo. Croatia. Czech Republic. Democratic Republic of the Congo (Zaire). Gabon. Germany. Hungary. Italy. Libya. Malta. Niger. Nigeria.","projected 2D","","","East","North","E","N","9001","","4326","16033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1404[] = {"32634","WGS 84 / UTM zone 34N","","","","18deg East to 24deg East; northern hemisphere. Albania. Belarus. Bosnia and Herzegowina. Bulgaria. Central African Republic. Chad. Croatia. Democratic Republic of the Congo (Zaire). Estonia. Finland. FYR Macedonia. Greece. Hungary. Italy. Latvia. Libya. Li","projected 2D","","","East","North","E","N","9001","","4326","16034","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1405[] = {"32635","WGS 84 / UTM zone 35N","","","","24deg East to 30deg East; northern hemisphere. Belarus. Bulgaria. Central African Republic. Democratic Republic of the Congo (Zaire). Egypt. Estonia. Finland. Greece. Latvia. Lesotho. Libya. Lithuania. Moldova. Norway. Romania. Russia. Sudan. Svalbard. Tur","projected 2D","","","East","North","E","N","9001","","4326","16035","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1406[] = {"32636","WGS 84 / UTM zone 36N","","","","30deg East to 36deg East; northern hemisphere. Belarus. Cyprus. Egypt. Ethiopia. Finland. Israel. Jordan. Kenya. Lebanon. Norway. Russia. Saudi Arabia. Sudan. Syria. Turkey. Uganda. Ukraine.","projected 2D","","","East","North","E","N","9001","","4326","16036","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1407[] = {"32637","WGS 84 / UTM zone 37N","","","","36deg East to 42deg East; northern hemisphere. Djibouti. Egypt. Eritrea. Ethiopia. Georgia. Iraq. Jordan. Kenya. Lebanon. Russia. Saudi Arabia. Somalia. Sudan. Syria. Turkey. Ukraine.","projected 2D","","","East","North","E","N","9001","","4326","16037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1408[] = {"32638","WGS 84 / UTM zone 38N","","","","42deg East to 48deg East; northern hemisphere. Armenia. Azerbaijan. Djibouti. Eritrea. Ethiopia. Georgia. Iran. Iraq. Kazakhstan. Kuwait. Russia. Saudi Arabia. Somalia. Turkey. Yemen.","projected 2D","","","East","North","E","N","9001","","4326","16038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1409[] = {"32639","WGS 84 / UTM zone 39N","","","","48deg East to 54deg East; northern hemisphere. Azerbaijan. Bahrain. Iran. Kazakhstan. Kuwait. Oman. Qatar. Russia. Saudi Arabia. Somalia. Turkmenistan. United Arab Emirates. Yemen.","projected 2D","","","East","North","E","N","9001","","4326","16039","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1410[] = {"32640","WGS 84 / UTM zone 40N","","","","54deg East to 60deg East; northern hemisphere. Iran. Kazakhstan. Oman. Russia. Saudi Arabia. Turkmenistan. United Arab Emirates. Uzbekistan.","projected 2D","","","East","North","E","N","9001","","4326","16040","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1411[] = {"32641","WGS 84 / UTM zone 41N","","","","60deg East to 66deg East; northern hemisphere. Afghanistan. Iran. Kazakhstan. Pakistan. Russia. Turkmenistan. Uzbekistan.","projected 2D","","","East","North","E","N","9001","","4326","16041","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1412[] = {"32642","WGS 84 / UTM zone 42N","","","","66deg East to 72deg East; northern hemisphere. Afghanistan. India. Kazakhstan. Kyrgyzstan. Pakistan. Russia. Tajikistan. Uzbekistan.","projected 2D","","","East","North","E","N","9001","","4326","16042","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1413[] = {"32643","WGS 84 / UTM zone 43N","","","","72deg East to 78deg East; northern hemisphere. China. India. Kazakhstan. Kyrgyzstan. Maldives. Pakistan. Russia. Tajikistan.","projected 2D","","","East","North","E","N","9001","","4326","16043","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1414[] = {"32644","WGS 84 / UTM zone 44N","","","","78deg East to 84deg East; northern hemisphere. China. India. Kazakhstan. Kyrgyzstan. Nepal. Russia. Sri Lanka.","projected 2D","","","East","North","E","N","9001","","4326","16044","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1415[] = {"32645","WGS 84 / UTM zone 45N","","","","84deg East to 90deg East; northern hemisphere. Bangladesh. Bhutan. China. India. Kazakhstan. Mongolia. Nepal. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16045","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1416[] = {"32646","WGS 84 / UTM zone 46N","","","","90deg East to 96deg East; northern hemisphere. Bangladesh. Bhutan. China. Indonesia. Mongolia. Myanmar (Burma). Russia.","projected 2D","","","East","North","E","N","9001","","4326","16046","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1417[] = {"32647","WGS 84 / UTM zone 47N","","","","96deg East to 102eg East; northern hemisphere. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Myanmar (Burma). Russia. Thailand.","projected 2D","","","East","North","E","N","9001","","4326","16047","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1418[] = {"32648","WGS 84 / UTM zone 48N","","","","102deg East to 108deg East; northern hemisphere. Cambodia. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Russia. Singapore. Thailand. Vietnam.","projected 2D","","","East","North","E","N","9001","","4326","16048","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1419[] = {"32649","WGS 84 / UTM zone 49N","","","","108deg East to 114deg East; northern hemisphere. China. Hong Kong. Indonesia. Macau. Malaysia - East Malaysia - Sarawak. Mongolia. Russia. Vietnam.","projected 2D","","","East","North","E","N","9001","","4326","16049","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1420[] = {"32650","WGS 84 / UTM zone 50N","","","","114deg East to 120deg East; northern hemisphere. Brunei. China. Indonesia. Malaysia - East Malaysia - Sarawak. Mongolia. Philippines. Russia. Taiwan.","projected 2D","","","East","North","E","N","9001","","4326","16050","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1421[] = {"32651","WGS 84 / UTM zone 51N","","","","120deg East to 126deg East; northern hemisphere. China. Indonesia. Japan. North Korea. Philippines. Russia. South Korea. Taiwan.","projected 2D","","","East","North","E","N","9001","","4326","16051","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1422[] = {"32652","WGS 84 / UTM zone 52N","","","","126deg East to 132deg East; northern hemisphere. China. Indonesia. Japan. North Korea. Russia. South Korea.","projected 2D","","","East","North","E","N","9001","","4326","16052","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1423[] = {"32653","WGS 84 / UTM zone 53N","","","","132deg East to 138deg East; northern hemisphere. China. Japan. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16053","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1424[] = {"32654","WGS 84 / UTM zone 54N","","","","138deg East to 144deg East; northern hemisphere. Japan. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16054","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1425[] = {"32655","WGS 84 / UTM zone 55N","","","","144deg East to 150deg East; northern hemisphere. Japan. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16055","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1426[] = {"32656","WGS 84 / UTM zone 56N","","","","150deg East to 156deg East; northern hemisphere. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16056","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1427[] = {"32657","WGS 84 / UTM zone 57N","","","","156deg East to 162deg East; northern hemisphere. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16057","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1428[] = {"32658","WGS 84 / UTM zone 58N","","","","162deg East to 168deg East; northern hemisphere. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16058","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1429[] = {"32659","WGS 84 / UTM zone 59N","","","","168deg East to 174deg East; northern hemisphere. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16059","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1430[] = {"32660","WGS 84 / UTM zone 60N","","","","174deg East to 180deg; northern hemisphere. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16060","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1431[] = {"32661","WGS 84 / UPS North","","","","Polar areas north of 84 deg N.","projected 2D","","","East","North","E","N","9001","","4326","16061","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1432[] = {"32701","WGS 84 / UTM zone 1S","","","","180deg to 174deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1433[] = {"32702","WGS 84 / UTM zone 2S","","","","174deg West to 168deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1434[] = {"32703","WGS 84 / UTM zone 3S","","","","168deg West to 162deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16103","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1435[] = {"32704","WGS 84 / UTM zone 4S","","","","162deg West to 156deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16104","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1436[] = {"32705","WGS 84 / UTM zone 5S","","","","156deg West to 150deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16105","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1437[] = {"32706","WGS 84 / UTM zone 6S","","","","150deg West to 144deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16106","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1438[] = {"32707","WGS 84 / UTM zone 7S","","","","144deg West to 138deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16107","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1439[] = {"32708","WGS 84 / UTM zone 8S","","","","138deg West to 132deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16108","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1440[] = {"32709","WGS 84 / UTM zone 9S","","","","132deg West to 126deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16109","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1441[] = {"32710","WGS 84 / UTM zone 10S","","","","130deg West to 120deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16110","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1442[] = {"32711","WGS 84 / UTM zone 11S","","","","120deg West to 114deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16111","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1443[] = {"32712","WGS 84 / UTM zone 12S","","","","114deg West to 108deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16112","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1444[] = {"32713","WGS 84 / UTM zone 13S","","","","108deg West to 102deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16113","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1445[] = {"32714","WGS 84 / UTM zone 14S","","","","102deg West to 96deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16114","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1446[] = {"32715","WGS 84 / UTM zone 15S","","","","96deg West to 90deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16115","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1447[] = {"32716","WGS 84 / UTM zone 16S","","","","90deg West to 84deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16116","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1448[] = {"32717","WGS 84 / UTM zone 17S","","","","84deg West to 78deg West; southern hemisphere. Ecuador. Peru.","projected 2D","","","East","North","E","N","9001","","4326","16117","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1449[] = {"32718","WGS 84 / UTM zone 18S","","","","78deg West to 72deg West; southern hemisphere. Argentina. Brazil. Chile. Colombia. Ecuador. Peru.","projected 2D","","","East","North","E","N","9001","","4326","16118","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1450[] = {"32719","WGS 84 / UTM zone 19S","","","","72deg West to 66deg West; southern hemisphere. Argentina. Bolivia. Brazil. Chile. Colombia. Peru.","projected 2D","","","East","North","E","N","9001","","4326","16119","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1451[] = {"32720","WGS 84 / UTM zone 20S","","","","66deg West to 60deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay.","projected 2D","","","East","North","E","N","9001","","4326","16120","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1452[] = {"32721","WGS 84 / UTM zone 21S","","","","60deg West to 54deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay. Uruguay.","projected 2D","","","East","North","E","N","9001","","4326","16121","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1453[] = {"32722","WGS 84 / UTM zone 22S","","","","54deg West to 48deg West; southern hemisphere. Brazil. Uruguay.","projected 2D","","","East","North","E","N","9001","","4326","16122","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1454[] = {"32723","WGS 84 / UTM zone 23S","","","","48deg West to 42deg West; southern hemisphere. Brazil.","projected 2D","","","East","North","E","N","9001","","4326","16123","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1455[] = {"32724","WGS 84 / UTM zone 24S","","","","42deg West to 36deg West; southern hemisphere. Brazil. South Georgia and the South Sandwich Islands.","projected 2D","","","East","North","E","N","9001","","4326","16124","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1456[] = {"32725","WGS 84 / UTM zone 25S","","","","36deg West to 30deg West; southern hemisphere. Brazil.","projected 2D","","","East","North","E","N","9001","","4326","16125","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1457[] = {"32726","WGS 84 / UTM zone 26S","","","","30deg West to 24deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16126","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1458[] = {"32727","WGS 84 / UTM zone 27S","","","","24deg West to 18deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16127","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1459[] = {"32728","WGS 84 / UTM zone 28S","","","","18deg West to 12deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16128","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1460[] = {"32729","WGS 84 / UTM zone 29S","","","","12deg West to 6deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16129","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1461[] = {"32730","WGS 84 / UTM zone 30S","","","","6deg West to 0deg; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16130","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1462[] = {"32731","WGS 84 / UTM zone 31S","","","","0deg to 6deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1463[] = {"32732","WGS 84 / UTM zone 32S","","","","6deg East to 12deg East; southern hemisphere. Angola. Congo. Gabon. Namibia.","projected 2D","","","East","North","E","N","9001","","4326","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1464[] = {"32733","WGS 84 / UTM zone 33S","","","","12deg East to 18deg East; southern hemisphere. Angola. Congo. Democratic Republic of the Congo (Zaire). Gabon. Namibia. South Africa.","projected 2D","","","East","North","E","N","9001","","4326","16133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1465[] = {"32734","WGS 84 / UTM zone 34S","","","","18deg East to 24deg East; southern hemisphere. Angola. Botswana. Democratic Republic of the Congo (Zaire). Namibia. South Africa. Zambia.","projected 2D","","","East","North","E","N","9001","","4326","16134","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1466[] = {"32735","WGS 84 / UTM zone 35S","","","","24deg East to 30deg East; southern hemisphere. Botswana. Burundi. Democratic Republic of the Congo (Zaire). Rwanda. South Africa. Tanzania. Uganda. Zambia. Zimbabwe.","projected 2D","","","East","North","E","N","9001","","4326","16135","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1467[] = {"32736","WGS 84 / UTM zone 36S","","","","30deg East to 36deg East; southern hemisphere. Burundi. Kenya. Malawi. Mozambique. Rwanda. South Africa. Swaziland. Tanzania. Uganda. Zambia. Zimbabwe.","projected 2D","","","East","North","E","N","9001","","4326","16136","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1468[] = {"32737","WGS 84 / UTM zone 37S","","","","36deg East to 42deg East; southern hemisphere. Kenya. Mozambique. Tanzania.","projected 2D","","","East","North","E","N","9001","","4326","16137","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1469[] = {"32738","WGS 84 / UTM zone 38S","","","","42deg East to 48deg East; southern hemisphere. Madagascar.","projected 2D","","","East","North","E","N","9001","","4326","16138","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1470[] = {"32739","WGS 84 / UTM zone 39S","","","","48deg East to 54deg East; southern hemisphere. Madagascar.","projected 2D","","","East","North","E","N","9001","","4326","16139","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1471[] = {"32740","WGS 84 / UTM zone 40S","","","","54deg East to 60deg East; southern hemisphere. Seychelles.","projected 2D","","","East","North","E","N","9001","","4326","16140","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1472[] = {"32741","WGS 84 / UTM zone 41S","","","","60deg East to 66deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16141","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1473[] = {"32742","WGS 84 / UTM zone 42S","","","","66deg East to 72deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16142","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1474[] = {"32743","WGS 84 / UTM zone 43S","","","","72deg East to 78deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16143","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1475[] = {"32744","WGS 84 / UTM zone 44S","","","","78deg East to 84deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16144","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1476[] = {"32745","WGS 84 / UTM zone 45S","","","","84deg East to 90deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16145","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1477[] = {"32746","WGS 84 / UTM zone 46S","","","","90deg East to 96deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16146","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1478[] = {"32747","WGS 84 / UTM zone 47S","","","","96deg East to 102eg East; southern hemisphere. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16147","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1479[] = {"32748","WGS 84 / UTM zone 48S","","","","102deg East to 108deg East; southern hemisphere. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16148","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1480[] = {"32749","WGS 84 / UTM zone 49S","","","","108deg East to 114deg East; southern hemisphere. Australia. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16149","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1481[] = {"32750","WGS 84 / UTM zone 50S","","","","114deg East to 120deg East; southern hemisphere. Australia. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16150","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1482[] = {"32751","WGS 84 / UTM zone 51S","","","","120deg East to 126deg East; southern hemisphere. Australia. East Timor. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16151","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1483[] = {"32752","WGS 84 / UTM zone 52S","","","","126deg East to 132deg East; southern hemisphere. Australia. East Timor. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16152","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1484[] = {"32753","WGS 84 / UTM zone 53S","","","","132deg East to 138deg East; southern hemisphere. Australia. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16153","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1485[] = {"32754","WGS 84 / UTM zone 54S","","","","138deg East to 144deg East; southern hemisphere. Australia. Indonesia. Papua New Guinea.","projected 2D","","","East","North","E","N","9001","","4326","16154","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1486[] = {"32755","WGS 84 / UTM zone 55S","","","","144deg East to 150deg East; southern hemisphere. Australia. Papua New Guinea.","projected 2D","","","East","North","E","N","9001","","4326","16155","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1487[] = {"32756","WGS 84 / UTM zone 56S","","","","150deg East to 156deg East; southern hemisphere. Australia. Papua New Guinea.","projected 2D","","","East","North","E","N","9001","","4326","16156","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1488[] = {"32757","WGS 84 / UTM zone 57S","","","","156deg East to 162deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16157","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1489[] = {"32758","WGS 84 / UTM zone 58S","","","","162deg East to 168deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16158","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1490[] = {"32759","WGS 84 / UTM zone 59S","","","","168deg East to 174deg East; southern hemisphere. New Zealand.","projected 2D","","","East","North","E","N","9001","","4326","16159","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1491[] = {"32760","WGS 84 / UTM zone 60S","","","","174deg East to 180deg; southern hemisphere. New Zealand.","projected 2D","","","East","North","E","N","9001","","4326","16160","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1492[] = {"32761","WGS 84 / UPS South","","","","Polar areas south of 80 deg S.","projected 2D","","","East","North","E","N","9001","","4326","16161","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1493[] = {"32766","WGS 84 / TM 36 SE","","","","Mozambique - offshore.","projected 2D","","","East","North","E","N","9001","","4326","16636","1998-11-11 00:00:00","BP Mozambique","EPSG","Used by BP Mozambique for Offshore Zambezi block.","",NULL};
+
+datafile_rows_t *horiz_cs_rows[] = {horiz_cs_row_1,horiz_cs_row_2,horiz_cs_row_3,horiz_cs_row_4,horiz_cs_row_5,horiz_cs_row_6,horiz_cs_row_7,horiz_cs_row_8,horiz_cs_row_9,horiz_cs_row_10,horiz_cs_row_11,horiz_cs_row_12,horiz_cs_row_13,horiz_cs_row_14,horiz_cs_row_15,horiz_cs_row_16,horiz_cs_row_17,horiz_cs_row_18,horiz_cs_row_19,horiz_cs_row_20,horiz_cs_row_21,horiz_cs_row_22,horiz_cs_row_23,horiz_cs_row_24,horiz_cs_row_25,horiz_cs_row_26,horiz_cs_row_27,horiz_cs_row_28,horiz_cs_row_29,h [...]
diff --git a/src/tiff/csv/horiz_cs.csv b/src/tiff/csv/horiz_cs.csv
new file mode 100644
index 0000000..b0f757a
--- /dev/null
+++ b/src/tiff/csv/horiz_cs.csv
@@ -0,0 +1,1493 @@
+"HORIZCS_CODE","HORIZCS_EPSG_NAME","HORIZCS_EPSG_ABBR","HORIZCS_USER_NAME","DESCRIPTION","AREA_OF_USE","COORD_SYS_TYPE","GEOD_DATUM_CODE","PRIME_MERIDIAN_CODE","ORIENT_POSITIVE_AXIS_1","ORIENT_POSITIVE_AXIS_2","COORD_SYS_AXIS_1_ABBR","COORD_SYS_AXIS_2_ABBR","UOM_LENGTH_CODE","UOM_ANGLE_CODE","SOURCE_GEOGCS_CODE","PROJECTION_TRF_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+200,Anguilla 1957 / British West Indies Grid,Anguilla 1957 / BWI Grid,,,Anguilla,projected 2D,,,East,North,E,N,9001,,4600,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+201,Antigua 1943 / British West Indies Grid,Antigua 1943 / BWI Grid,,,Antigua and Barbuda - Antigua,projected 2D,,,East,North,E,N,9001,,4601,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+202,Dominica 1945 / British West Indies Grid,Dominica 1945 / BWI Grid,,,Dominica,projected 2D,,,East,North,E,N,9001,,4602,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+203,Grenada 1953 / British West Indies Grid,Grenada 1953 / BWI Grid,,,Grenada (including Grenada Grenadines),projected 2D,,,East,North,E,N,9001,,4603,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+204,Montserrat 58 / British West Indies Grid,Montserrat 58 / BWI Grid,,,Montserrat,projected 2D,,,East,North,E,N,9001,,4604,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+205,St Kitts 1955 / British West Indies Grid,St Kitts 1955 / BWI Grid,,,Saint Kitts and Nevis,projected 2D,,,East,North,E,N,9001,,4605,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+206,St Lucia 1955 / British West Indies Grid,St Lucia 1955 / BWI Grid,,,Saint Lucia,projected 2D,,,East,North,E,N,9001,,4606,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+207,St Vincent 45 / British West Indies Grid,St Vincent 45 / BWI Grid,,,Saint Vincent and the Grenadines,projected 2D,,,East,North,E,N,9001,,4607,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+208,NAD27(CGQ77) / SCoPQ zone 2,CGQ77 / SCoPQ zone 2,,,Canada - Quebec - east of 57 deg East.,projected 2D,,,East,North,X,Y,9001,,4609,17700,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+209,NAD27(CGQ77) / SCoPQ zone 3,CGQ77 / SCoPQ zone 3,,,Canada - Quebec between 60 deg and 57 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17703,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+210,NAD27(CGQ77) / SCoPQ zone 4,CGQ77 / SCoPQ zone 4,,,Canada - Quebec between 63 deg and 60 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17704,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+211,NAD27(CGQ77) / SCoPQ zone 5,CGQ77 / SCoPQ zone 5,,,Canada - Quebec between 66 deg and 63 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17705,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+212,NAD27(CGQ77) / SCoPQ zone 6,CGQ77 / SCoPQ zone 6,,,Canada - Quebec between 69 deg and 66 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17706,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+213,NAD27(CGQ77) / SCoPQ zone 7,CGQ77 / SCoPQ zone 7,,,Canada - Quebec between 72 deg and 69 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17707,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+214,NAD27(CGQ77) / SCoPQ zone 8,CGQ77 / SCoPQ zone 8,,,Canada - Quebec between 75 deg and 72 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17708,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+215,NAD27(CGQ77) / SCoPQ zone 9,CGQ77 / SCoPQ zone 9,,,Canada - Quebec between 78 deg and 75 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17709,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+216,NAD27(CGQ77) / SCoPQ zone 10,CGQ77 / SCoPQ zone 10,,,Canada - Quebec west of 78 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17710,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+217,NAD27(76) / MTM zone 8,,,,Canada - Ontario - east of 75 deg West.,projected 2D,,,East,North,X,Y,9001,,4608,17708,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+218,NAD27(76) / MTM zone 9,,,,Canada - Ontario - between 78 deg and 75 deg West.,projected 2D,,,East,North,X,Y,9001,,4608,17709,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+219,NAD27(76) / MTM zone 10,,,,Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.,projected 2D,,,East,North,X,Y,9001,,4608,17710,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+220,NAD27(76) / MTM zone 11,,,,Canada - Ontario - south of 46 deg N and west of 81 deg West.,projected 2D,,,East,North,E,N,9001,,4608,17711,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+221,NAD27(76) / MTM zone 12,,,,Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.,projected 2D,,,East,North,E,N,9001,,4608,17712,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+222,NAD27(76) / MTM zone 13,,,,Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.,projected 2D,,,East,North,E,N,9001,,4608,17713,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+223,NAD27(76) / MTM zone 14,,,,Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4608,17714,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+224,NAD27(76) / MTM zone 15,,,,Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4608,17715,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+225,NAD27(76) / MTM zone 16,,,,Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4608,17716,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+226,NAD27(76) / MTM zone 17,,,,Canada - Ontario - west of 94 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4608,17717,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+227,NAD27(76) / UTM zone 15N,,,,Canada - Ontario - 96deg West to 90deg West.,projected 2D,,,East,North,E,N,9001,,4608,16015,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 15N (code 26715).,
+228,NAD27(76) / UTM zone 16N,,,,Canada - Ontario - 90deg West to 84deg West.,projected 2D,,,East,North,E,N,9001,,4608,16016,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 16N (code 26716).,
+229,NAD27(76) / UTM zone 17N,,,,Canada - Ontario - 84deg West to 78deg West.,projected 2D,,,East,North,E,N,9001,,4608,16017,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 17N (code 26717).,
+230,NAD27(76) / UTM zone 18N,,,,Canada - Ontario - east of 78 deg West.,projected 2D,,,East,North,E,N,9001,,4608,16018,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 18N (code 26718).,
+231,NAD27(CGQ77) / UTM zone 17N,CGQ77 / UTM zone 17N,,,Canada - Quebec - west of 78 deg West.,projected 2D,,,East,North,E,N,9001,,4609,16017,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 17N (code 26717).,
+232,NAD27(CGQ77) / UTM zone 18N,CGQ77 / UTM zone 18N,,,Canada - Quebec -78deg West to 72deg West.,projected 2D,,,East,North,E,N,9001,,4609,16018,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 18N (code 26718).,
+233,NAD27(CGQ77) / UTM zone 19N,CGQ77 / UTM zone 19N,,,Canada - Quebec - 72deg West to 66deg West.,projected 2D,,,East,North,E,N,9001,,4609,16019,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 19N (code 26719).,
+234,NAD27(CGQ77) / UTM zone 20N,CGQ77 / UTM zone 20N,,,Canada - Quebec - 66deg West to 60deg West.,projected 2D,,,East,North,E,N,9001,,4609,16020,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 20N (code 26720).,
+235,NAD27(CGQ77) / UTM zone 21N,CGQ77 / UTM zone 21N,,,Canada - Quebec - east of 60deg West.,projected 2D,,,East,North,E,N,9001,,4609,16021,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 21N (code 26721).,
+236,NAD83(CSRS98) / New Brunswick Stereo,NAD83(98) / NB Stereo,,,Canada - New Brunswick,projected 2D,,,North,East,N,E,9001,,4140,19946,1999-10-20 00:00:00,Service New Brunswick Land and Information Standards Manual,EPSG,In use from 1999.,
+237,NAD83(CSRS98) / UTM zone 19N,NAD83(98) / UTM 19N,,,Canada - New Brunswick west of 66 deg West.,projected 2D,,,East,North,E,N,9001,,4140,16019,1999-10-20 00:00:00,Service New Brunswick Land and Information Standards Manual,EPSG,In use from 1999.,
+238,NAD83(CSRS98) / UTM zone 20N,NAD83(98) / UTM 20N,,,Canada - New Brunswick east of 66 deg West.,projected 2D,,,East,North,E,N,9001,,4140,16020,1999-10-20 00:00:00,Service New Brunswick Land and Information Standards Manual,EPSG,In use from 1999.,
+239,Israel / Israeli TM Grid,Israeli TM Grid,,,Israel.,projected 2D,,,East,North,E,N,9001,,4141,18204,1999-10-20 00:00:00,Survey of Israel.,EPSG,Supercedes Israeli CS Grid (EPSG code 28193).,
+240,Locodjo 1965 / UTM zone 30N,Locodjo 65 / UTM 30N,,,Cote D'Ivoire (Ivory Coast) east of 6 deg West.,projected 2D,,,East,North,E,N,9001,,4142,16030,1999-10-20 00:00:00,IGN Paris,EPSG,Superseded by Abidjan 87 / UTM 30N (EPSG code 241).,
+241,Abidjan 1987 / UTM zone 30N,Abidjan 87 / UTM 30N,,,Cote D'Ivoire (Ivory Coast) east of 6 deg West.,projected 2D,,,East,North,E,N,9001,,4143,16030,1999-10-20 00:00:00,IGN Paris,EPSG,Supersedes Locodjo 65 / UTM 30N (EPSG code 240).,
+242,Locodjo 1965 / UTM zone 29N,Locodjo 65 / UTM 29N,,,Cote D'Ivoire (Ivory Coast) west of 6 deg West.,projected 2D,,,East,North,E,N,9001,,4142,16029,1999-10-20 00:00:00,IGN Paris,EPSG,Superseded by Abidjan 87 / UTM 29N (EPSG code 243).,
+243,Abidjan 1987 / UTM zone 29N,Abidjan 87 / UTM 29N,,,Cote D'Ivoire (Ivory Coast) west of 6 deg West.,projected 2D,,,East,North,E,N,9001,,4143,16029,1999-10-20 00:00:00,IGN Paris,EPSG,Supersedes Locodjo 65 / UTM 29N (EPSG code 242).,
+244,Hanoi 1972 / Gauss-Kruger zone 18,Hanoi 72 / Gauss zone 18,,,Vietnam - west of 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4147,16218,1999-10-20 00:00:00,,EPSG,Replaces use of Indian 1960 / UTM zone 48 after 1988.,
+245,Hanoi 1972 / Gauss-Kruger zone 19,Hanoi 72 / Gauss zone 19,,,Vietnam - east of 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4147,16219,1999-10-20 00:00:00,,EPSG,Replaces use of Indian 1960 / UTM zone 48 after 1988.,
+246,Hartbeesthoek94 / Lo15,New S African CS zone 15,,,South Africa - Walvis Bay.,projected 2D,,,West,South,W,S,9001,,4148,17515,1999-10-20 00:00:00,,EPSG,,
+247,Hartbeesthoek94 / Lo17,New S African CS zone 17,,,South Africa - west of 18 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17517,1999-10-20 00:00:00,,EPSG,,
+248,Hartbeesthoek94 / Lo19,New S African CS zone 19,,,South Africa - 18 to 20 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17519,1999-10-20 00:00:00,,EPSG,,
+249,Hartbeesthoek94 / Lo21,New S African CS zone 21,,,South Africa - 20 to 22 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17521,1999-10-20 00:00:00,,EPSG,,
+250,Hartbeesthoek94 / Lo23,New S African CS zone 23,,,South Africa - 22 to 24 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17523,1999-10-20 00:00:00,,EPSG,,
+251,Hartbeesthoek94 / Lo25,New S African CS zone 25,,,Lestho - west of 26 deg East; South Africa - 24 to 26 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17525,1999-10-20 00:00:00,,EPSG,,
+252,Hartbeesthoek94 / Lo27,New S African CS zone 27,,,Lestho - east of 26 deg East; South Africa - 26 to 28 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17527,1999-10-20 00:00:00,,EPSG,,
+253,Hartbeesthoek94 / Lo29,New S African CS zone 29,,,South Africa - 28 to 30 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17529,1999-10-20 00:00:00,,EPSG,,
+254,Hartbeesthoek94 / Lo31,New S African CS zone 31,,,South Africa - 30 to 32 deg East; Swaziland.,projected 2D,,,West,South,W,S,9001,,4148,17533,1999-10-20 00:00:00,,EPSG,,
+255,Hartbeesthoek94 / Lo33,New S African CS zone 33,,,South Africa - east of 32 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17533,1999-10-20 00:00:00,,EPSG,,
+256,CH1903+ / LV95,LV95,,,Liechtenstein; Switzerland.,projected 2D,,,East,North,Y,X,9001,,4150,19950,1999-10-20 00:00:00,,EPSG,Supersedes CH1903/LV03 (code 21781).,
+257,Rassadiran / Nakhl e Taqi,,,,Iran - Taheri refinery site only.,projected 2D,,,East,North,E,N,9001,,4153,19951,1999-10-20 00:00:00,Total-Fina,EPSG,Used for terminal site only.,
+258,ED50(ED77) / UTM zone 38N,,,,Iran - west of 48deg East.,projected 2D,,,East,North,E,N,9001,,4154,16038,1999-10-20 00:00:00,,EPSG,,
+259,ED50(ED77) / UTM zone 39N,,,,Iran - 48deg to 54 deg East.,projected 2D,,,East,North,E,N,9001,,4154,16039,1999-10-20 00:00:00,,EPSG,,
+260,ED50(ED77) / UTM zone 40N,,,,Iran - 54deg to 60 deg East.,projected 2D,,,East,North,E,N,9001,,4154,16040,1999-10-20 00:00:00,,EPSG,,
+261,ED50(ED77) / UTM zone 41N,,,,Iran - east of 60deg East.,projected 2D,,,East,North,E,N,9001,,4154,16041,1999-10-20 00:00:00,,EPSG,,
+300,Madrid 1870 (Madrid) / Spain,,,,Spain,projected 2D,,,East,North,X,Y,9001,,4903,19921,1998-11-11 00:00:00,,EPSG,Superseded by ED50 / UTM after 1966.,
+2100,GGRS87 / Greek Grid,,,,Greece,projected 2D,,,East,North,E,N,9001,,4121,19930,1997-06-16 00:00:00,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,Oil industry uses ED50 / UTM zone 34N and ED50 / UTM zone 35N.,
+2200,ATS77 / New Brunswick Stereographic,ATS77 / NB Stereographic,,,Canada - New Brunswick,projected 2D,,,North,East,N,E,9001,,4122,19945,1999-10-20 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1979. To be phased out in late 1990's.,99.61
+2219,ATS77 / UTM zone 19N,,,,Canada - New Brunswick - west of 66 deg W.,projected 2D,,,East,North,E,N,9001,,4122,16019,1997-07-22 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1979. To be phased out in late 1990's.,
+2220,ATS77 / UTM zone 20N,,,,Canada - New Brunswick - east of 66 deg W.; Canada - Nova Scotia; Canada - Prince Edward Island.,projected 2D,,,East,North,E,N,9001,,4122,16020,1997-07-22 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1979. To be phased out in late 1990's.,
+2290,ATS77 / Prince Edward Isl. Stereographic,ATS77 / PEI Stereo,,,Canada - Prince Edward Island,projected 2D,,,East,North,E(X),N(Y),9001,,4122,19933,1997-11-13 00:00:00,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,In use from 1979. To be phased out in late 1990's.,
+2294,ATS77 / MTM Nova Scotia zone 4,ATS77 / MTM NS zone 4,,,Canada - Nova Scotia - east of 63 deg West.,projected 2D,,,East,North,E,N,9001,,4122,17794,1997-11-13 00:00:00,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,In use from 1979. To be phased out in late 1990's.,
+2295,ATS77 / MTM Nova Scotia zone 5,ATS77 / MTM NS zone 5,,,Canada - Nova Scotia - west of 63 deg West.,projected 2D,,,East,North,E,N,9001,,4122,17795,1997-11-13 00:00:00,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,In use from 1979. To be phased out in late 1990's.,
+2391,KKJ / Finland zone 1,,,,Finland - west of 22deg 30min E.,projected 2D,,,North,East,X,Y,9001,,4123,18191,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+2392,KKJ / Finland zone 2,,,,Finland - 22deg 30 min to 25deg 30min E.,projected 2D,,,North,East,X,Y,9001,,4123,18192,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+2393,KKJ / Finland Uniform Coordinate System,KKJ / Finland zone 3,,,Finland; Finland - 25 deg 30min E to 28deg 30min E.,projected 2D,,,North,East,X,Y,9001,,4123,18193,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,Known as Uniform Coordinate System when used over all country and also as Basic Coordinate System zone 3 at larger scales.,
+2394,KKJ / Finland zone 4,,,,Finland - east of 28deg 30 min E.,projected 2D,,,North,East,X,Y,9001,,4123,18194,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+2400,RT90 2.5 gon W,,,,Sweden,projected 2D,,,North,East,X,Y,9001,,4124,19929,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,,
+2550,Samboja / UTM zone 50S,,,,Indonesia - east Kalimantan - Mahakam delta area.,projected 2D,,,East,North,E,N,9001,,4125,16150,1997-11-13 00:00:00,,EPSG,,
+2600,Lietuvos Koordinoei Sistema 1994,LKS94,,,Lithuania,projected 2D,,,North,East,X,Y,9001,,4126,19934,1998-03-12 00:00:00,,EPSG,,
+2736,Tete / UTM zone 36S,,,,Mozambique - west of 36 deg E.,projected 2D,,,East,North,E,N,9001,,4127,16136,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+2737,Tete / UTM zone 37S,,,,Mozambique - east of 36 deg E,projected 2D,,,East,North,E,N,9001,,4127,16137,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+3036,Moznet / UTM zone 36S,,,,Mozambique - west of 36 deg E.,projected 2D,,,East,North,E,N,9001,,4130,16136,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+3037,Moznet / UTM zone 37S,,,,Mozambique - east of 36 deg E,projected 2D,,,East,North,E,N,9001,,4130,16137,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+3148,Indian 1960 / UTM zone 48N,,,,Cambodia; Vietnam west of 108deg East.,projected 2D,,,East,North,E,N,9001,,4131,16048,1998-11-11 00:00:00,,EPSG,In Vietnam superseded by Hanoi 72 / Gauss zone 18 from 1988 onwards.,
+3149,Indian 1960 / UTM zone 49N,,,,Vietnam east of 108deg East.,projected 2D,,,East,North,E,N,9001,,4131,16049,1998-11-11 00:00:00,,EPSG,Superseded by Hanoi 72 / Gauss zone 18 from 1988 onwards.,
+3176,Indian 1960 / TM 106 NE,,,,Vietnam - offshore.,projected 2D,,,East,North,E,N,9001,,4131,16506,1998-11-11 00:00:00,Petrovietnam,EPSG,Used by Petrovietnam for offshore block 15.,
+3200,FD58 / Iraq zone,,,,Iran - Gulf coast and Arwaz areas.,projected 2D,,,East,North,E,N,9001,,4132,19906,1998-11-11 00:00:00,IOEPC records.,EPSG,,
+3300,Estonian Coordinate System of 1992,,,,Estonia.,projected 2D,,,North,East,X,Y,9001,,4133,19938,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,Used for 1:20000 and larger scale mapping.,
+3439,PSD93 / UTM zone 39N,,,,Oman - west of 54 deg East.,projected 2D,,,East,North,E,N,9001,,4134,16039,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Supersedes Fahud / UTM zone 39N projCS (code 23239). Maximum differences to Fahud adjustment are 20 metres.,
+3440,PSD93 / UTM zone 40N,,,,Oman - east of 54 deg East.,projected 2D,,,East,North,E,N,9001,,4134,16040,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Supersedes Fahud / UTM zone 40N projCS (code 23240). Maximum differences to Fahud adjustment are 20 metres.,
+3561,Old Hawaiian / Hawaii zone 1,Old Hawaiian / SP zone 1,,,United States (USA) - Hawaii - island of Hawaii.,projected 2D,,,East,North,X,Y,9003,,4135,15101,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / Hawaii zone 1.,99.322
+3562,Old Hawaiian / Hawaii zone 2,Old Hawaiian / SP zone 2,,,United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.,projected 2D,,,East,North,X,Y,9003,,4135,15102,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / Hawaii zone 2.,99.322
+3563,Old Hawaiian / Hawaii zone 3,Old Hawaiian / SP zone 3,,,United States (USA) - Hawaii - Oahu.,projected 2D,,,East,North,X,Y,9003,,4135,15103,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / Hawaii zone 3.,99.322
+3564,Old Hawaiian / Hawaii zone 4,Old Hawaiian / SP zone 4,,,United States (USA) - Hawaii - Kauai.,projected 2D,,,East,North,X,Y,9003,,4135,15104,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / Hawaii zone 4.,99.322
+3565,Old Hawaiian / Hawaii zone 5,Old Hawaiian / SP zone 5,,,United States (USA) - Hawaii - Niihau.,projected 2D,,,East,North,X,Y,9003,,4135,15105,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / Hawaii zone 5.,99.322
+3920,Puerto Rico / UTM zone 20N,,,,British Virgin Islands (civilian).,projected 2D,,,East,North,E,N,9001,,4139,16020,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,NAD27 / UTM zone 20 N (code 26720) used for military purposes.,
+3991,Puerto Rico State Plane CS of 1927,Puerto Rico SPCS 27,,,Puerto Rico.,projected 2D,,,East,North,X,Y,9003,,4139,15201,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / Puerto Rico State Plane CS.,99.323
+3992,Puerto Rico / St. Croix,,,,US Virgin Islands (U.S.).,projected 2D,,,East,North,X,Y,9003,,4139,15202,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / St. Croix State Plane CS.,99.323
+4001,Unknown datum based upon ellipsoid 7001,,,,,geographic 2D,6001,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4002,Unknown datum based upon ellipsoid 7002,,,,,geographic 2D,6002,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4003,Unknown datum based upon ellipsoid 7003,,,,,geographic 2D,6003,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4004,Unknown datum based upon ellipsoid 7004,,,,,geographic 2D,6004,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4005,Unknown datum based upon ellipsoid 7005,,,,,geographic 2D,6005,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4006,Unknown datum based upon ellipsoid 7006,,,,,geographic 2D,6006,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4007,Unknown datum based upon ellipsoid 7007,,,,,geographic 2D,6007,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4008,Unknown datum based upon ellipsoid 7008,,,,,geographic 2D,6008,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4009,Unknown datum based upon ellipsoid 7009,,,,,geographic 2D,6009,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4010,Unknown datum based upon ellipsoid 7010,,,,,geographic 2D,6010,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4011,Unknown datum based upon ellipsoid 7011,,,,,geographic 2D,6011,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4012,Unknown datum based upon ellipsoid 7012,,,,,geographic 2D,6012,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4013,Unknown datum based upon ellipsoid 7013,,,,,geographic 2D,6013,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4014,Unknown datum based upon ellipsoid 7014,,,,,geographic 2D,6014,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4015,Unknown datum based upon ellipsoid 7015,,,,,geographic 2D,6015,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4016,Unknown datum based upon ellipsoid 7016,,,,,geographic 2D,6016,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4017,Unknown datum based upon ellipsoid 7017,,,,,geographic 2D,6017,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4018,Unknown datum based upon ellipsoid 7018,,,,,geographic 2D,6018,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4019,Unknown datum based upon ellipsoid 7019,,,,,geographic 2D,6019,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4020,Unknown datum based upon ellipsoid 7020,,,,,geographic 2D,6020,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4021,Unknown datum based upon ellipsoid 7021,,,,,geographic 2D,6021,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4022,Unknown datum based upon ellipsoid 7022,,,,,geographic 2D,6022,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4024,Unknown datum based upon ellipsoid 7024,,,,,geographic 2D,6024,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4025,Unknown datum based upon ellipsoid 7025,,,,,geographic 2D,6025,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4027,Unknown datum based upon ellipsoid 7027,,,,,geographic 2D,6027,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4028,Unknown datum based upon ellipsoid 7028,,,,,geographic 2D,6028,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4029,Unknown datum based upon ellipsoid 7029,,,,,geographic 2D,6029,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4030,Unknown datum based upon ellipsoid 7030,,,,,geographic 2D,6030,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4031,Unknown datum based upon ellipsoid 7031,,,,,geographic 2D,6031,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4032,Unknown datum based upon ellipsoid 7032,,,,,geographic 2D,6032,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4033,Unknown datum based upon ellipsoid 7033,,,,,geographic 2D,6033,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4034,Unknown datum based upon ellipsoid 7034,,,,,geographic 2D,6034,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4035,Unknown datum based upon ellipsoid 7035,,,,,geographic 2D,6035,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,96.08
+4036,Unknown datum based upon ellipsoid 7036,,,,,geographic 2D,6036,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,
+4041,Unknown datum based upon ellipsoid 7041,,,,,geographic 2D,6041,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,
+4042,Unknown datum based upon ellipsoid 7042,,,,,geographic 2D,6042,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,
+4043,Unknown datum based upon ellipsoid 7043,,,,,geographic 2D,6043,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,
+4044,Unknown datum based upon ellipsoid 7044,,,,,geographic 2D,6044,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,
+4045,Unknown datum based upon ellipsoid 7045,,,,,geographic 2D,6045,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Not recommended. Use only in cases where geodetic datum unknown.,
+4120,Greek,,,,Greece,geographic 2D,6120,8901,North,East,Lat,Long,,9108,,,1997-06-16 00:00:00,Topography Department; National Technical University of Greece.,EPSG,,
+4121,GGRS87,,,,Greece,geographic 2D,6121,8901,North,East,Lat,Long,,9108,,,1997-06-16 00:00:00,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,,
+4122,ATS77,,,,Canada - New Brunswick; Canada - Nova Scotia - onshore; Canada - Prince Edward Island.,geographic 2D,6122,8901,North,East,Lat,Long,,9108,,,1997-07-22 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1979. To be phased out in late 1990's.,
+4123,KKJ,,,,Finland,geographic 2D,6123,8901,North,East,Lat,Long,,9108,,,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+4124,RT90,,,,Sweden,geographic 2D,6124,8901,North,East,Lat,Long,,9108,,,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,,
+4125,Samboja,,,,Indonesia - east Kalimantan - Mahakam delta area.,geographic 2D,6125,8901,North,East,Lat,Long,,9108,,,1997-11-13 00:00:00,,EPSG,,
+4126,LKS94 (ETRS89),,,,Lithuania,geographic 2D,6126,8901,North,East,Lat,Long,,9108,,,1998-03-13 00:00:00,,EPSG,,
+4127,Tete,,,,Mozambique,geographic 2D,6127,8901,North,East,Lat,Long,,9108,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+4128,Madzansua,,,,Mozambique - west,geographic 2D,6128,8901,North,East,Lat,Long,,9108,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Superseded by values transformed to Tete geogCS (code 4127).,
+4129,Observatario,,,,Mozambique - south,geographic 2D,6129,8901,North,East,Lat,Long,,9108,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Superseded by values transformed to Tete geogCS (code 4127).,
+4130,Moznet,,,,Mozambique,geographic 2D,6130,8901,North,East,Lat,Long,,9108,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+4131,Indian 1960,,,,Cambodia; Vietnam,geographic 2D,6131,8901,North,East,Lat,Long,,9108,,,1998-11-11 00:00:00,,EPSG,,
+4132,FD58,,,,Iran - Gulf coast and Arwaz areas.,geographic 2D,6132,8901,North,East,Lat,Long,,9108,,,1998-11-11 00:00:00,IOEPC records.,EPSG,,
+4133,EST92,,,,Estonia,geographic 2D,6133,8901,North,East,Lat,Long,,9108,,,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,Densification of ETRS89 as established during 1992 Baltic campaign.,
+4134,PDO Survey Datum 1993,PSD93,,,Oman,geographic 2D,6134,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Supersedes Fahud geogCS (code 4232). Maximum differences to Fahud adjustment are 20 metres.,
+4135,Old Hawaiian,,,,United States (USA) - Hawaii,geographic 2D,6135,8901,North,East,Lat,Long,,9108,,,1999-05-24 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4136,St. Lawrence Island,,,,United States (USA) - Alaska - St. Lawrence Island,geographic 2D,6136,8901,North,East,Lat,Long,,9108,,,1999-05-24 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4137,St. Paul Island,,,,United States (USA) - Alaska - St. Paul Island,geographic 2D,6137,8901,North,East,Lat,Long,,9108,,,1999-05-24 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4138,St. George Island,,,,United States (USA) - Alaska - St. George Island,geographic 2D,6138,8901,North,East,Lat,Long,,9108,,,1999-05-24 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4139,Puerto Rico,,,,Puerto Rico; Virgin Islands (British); Virgin Islands (U.S.).,geographic 2D,6139,8901,North,East,Lat,Long,,9108,,,1999-05-24 00:00:00,,EPSG,Used for civilian purposes. NAD27 (code 4267) used for military purposes. Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4140,NAD83(CSRS98),,,,Canada - New Brunswick,geographic 2D,6140,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,Service New Brunswick Land and Information Standards Manual,EPSG,Supersedes ATS77 from 1999 in New Brunswick.,
+4141,Israel,,,,Israel.,geographic 2D,6141,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,Survey of Israel,EPSG,Supersedes Palestine 1923 in Israel.,
+4142,Locodjo 1965,,,,Cote D'Ivoire (Ivory Coast).,geographic 2D,6142,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,IGN Paris,EPSG,Superseded by Abidjan 1987 (EPSG code 4143).,
+4143,Abidjan 1987,,,,Cote D'Ivoire (Ivory Coast).,geographic 2D,6143,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,IGN Paris,EPSG,Supersedes Locodjo 1967 (EPSG code 4142).,
+4144,Kalianpur 1937,,,,Bangladesh; India; Pakistan,geographic 2D,6144,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Adopts 1937 metric conversion of 0.30479841 metres per Indian foot.,
+4145,Kalianpur 1962,,,,Pakistan,geographic 2D,6145,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Adopts 1962 metric conversion of 0.3047996 metres per Indian foot.,
+4146,Kalianpur 1975,,,,India,geographic 2D,6146,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Adopts 1975 metric conversion of 0.3047995 metres per Indian foot.,
+4147,Hanoi 1972,,,,Vietnam,geographic 2D,6147,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,,
+4148,Hartbeesthoek94,,,,South Africa.,geographic 2D,6148,8901,North,East,Lat,Long,,9108,,,1999-10-22 00:00:00,,EPSG,Supercedes Cape (code 4222) from 1999.,
+4149,CH1903,,,,Liechtenstein; Switzerland,geographic 2D,6149,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,,
+4150,CH1903+,,,,Liechtenstein; Switzerland,geographic 2D,6150,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,,
+4151,CHTRF95,,,,Liechtenstein; Switzerland,geographic 2D,6151,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,,
+4152,NAD83(HARN),,,,United States (US),geographic 2D,6152,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,National Geodetic Survey,EPSG,,
+4153,Rassadiran,,,,Iran - Taheri refinery site only.,geographic 2D,6153,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Used only for onshore terminal site.,
+4154,ED50(ED77),,,,Iran,geographic 2D,6154,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,,
+4200,Pulkovo 1995,,,,Russia,geographic 2D,6200,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+4201,Adindan,,,,Ethiopia; Sudan,geographic 2D,6201,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4202,AGD66,,,,Australia; Papua New Guinea,geographic 2D,6202,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4203,AGD84,,,,Australia,geographic 2D,6203,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4204,Ain el Abd,,,,Kuwait; Saudi Arabia,geographic 2D,6204,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4205,Afgooye,,,,Somalia,geographic 2D,6205,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4206,Agadez,,,,Niger,geographic 2D,6206,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4207,Lisbon,,,,Portugal - onshore,geographic 2D,6207,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,Instituto Geografico e Cadastral; Lisbon,EPSG,,
+4208,Aratu,,,,Brazil - coastal areas south of 2 deg 55 min S.,geographic 2D,6208,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4209,Arc 1950,,,,Botswana; Malawi; Zambia; Zimbabwe.,geographic 2D,6209,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4210,Arc 1960,,,,Kenya; Tanzania; Uganda.,geographic 2D,6210,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4211,Batavia,,,,Indonesia - Java,geographic 2D,6211,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4212,Barbados 1938,,,,Barbados,geographic 2D,6212,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,99.171
+4213,Beduaram,,,,Niger,geographic 2D,6213,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4214,Beijing 1954,,,,China,geographic 2D,6214,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4215,Belge 1950,,,,Belgium - onshore,geographic 2D,6215,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4216,Bermuda 1957,,,,Bermuda,geographic 2D,6216,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4218,Bogota,,,,Colombia,geographic 2D,6218,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4219,Bukit Rimpah,,,,Indonesia - Banga & Belitung Islands,geographic 2D,6219,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4220,Camacupa,,,,Angola,geographic 2D,6220,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4221,Campo Inchauspe,,,,Argentina,geographic 2D,6221,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4222,Cape,,,,Botswana; South Africa.,geographic 2D,6222,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Superceded by Hartbeesthoek94 from 1999.,
+4223,Carthage,,,,Tunisia,geographic 2D,6223,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4224,Chua,,,,Brazil,geographic 2D,6224,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4225,Corrego Alegre,,,,Brazil - NE coastal area between 45 deg W and 40 deg W.,geographic 2D,6225,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4226,Cote d'Ivoire,,,,Cote d'Ivoire,geographic 2D,6226,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4227,Deir ez Zor,,,,Syrian Arab Republic,geographic 2D,6227,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4228,Douala,,,,Cameroon,geographic 2D,6228,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4229,Egypt 1907,,,,Egypt,geographic 2D,6229,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4230,ED50,,,,Europe - west - Spain; France offshore; United Kingdom UKCS offshore; Netherlands offshore; Germany offshore North Sea; Denmark; Norway; Turkey.,geographic 2D,6230,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4231,ED87,,,,Europe - west.,geographic 2D,6231,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4232,Fahud,,,,Oman,geographic 2D,6232,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Since 1993 superseded by PSD93 geogCS (code 4134). Maximum differences to Fahud adjustment are 20 metres.,
+4233,Gandajika 1970,,,,Maldives,geographic 2D,6233,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4234,Garoua,,,,Cameroon,geographic 2D,6234,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4235,Guyane Francaise,,,,French Guyana,geographic 2D,6235,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4236,Hu Tzu Shan,,,,Taiwan,geographic 2D,6236,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4237,HD72,,,,Hungary,geographic 2D,6237,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4238,ID74,,,,Indonesia,geographic 2D,6238,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4239,Indian 1954,,,,Myanmar (Burma); Thailand,geographic 2D,6239,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4240,Indian 1975,,,,Thailand,geographic 2D,6240,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4241,Jamaica 1875,,,,Jamaica,geographic 2D,6241,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4242,JAD69,,,,Jamaica,geographic 2D,6242,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4243,Kalianpur 1880,,,,Bangladesh; India; Myanmar (Burma); Pakistan,geographic 2D,6243,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,,97.23
+4244,Kandawala,,,,Sri Lanka,geographic 2D,6244,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4245,Kertau,,,,Malaysia - West Malaysia; Singapore,geographic 2D,6245,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Adopts metric conversion of 39.370113 inches per metre.,
+4246,KOC,,,,Kuwait,geographic 2D,6246,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4247,La Canoa,,,,Venezuela,geographic 2D,6247,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,PSAD56 uses same origin.,
+4248,PSAD56,,,,Bolivia; Ecuador; Peru; [Venezuela],geographic 2D,6248,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Origin is same as La Canoa. In Venezuela known as La Canoa.,
+4249,Lake,,,,Venezuela - Lake Maracaibo area,geographic 2D,6249,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4250,Leigon,,,,Ghana,geographic 2D,6250,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4251,Liberia 1964,,,,Liberia,geographic 2D,6251,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4252,Lome,,,,Togo,geographic 2D,6252,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4253,Luzon 1911,,,,Philippines,geographic 2D,6253,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4254,Hito XVIII 1963,,,,Chile - Tierra del Fuego,geographic 2D,6254,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4255,Herat North,,,,Afghanistan,geographic 2D,6255,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4256,Mahe 1971,,,,Seychelles,geographic 2D,6256,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4257,Makassar,,,,Indonesia - south west Sulawesi,geographic 2D,6257,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4258,ETRF89,,,,Europe - Hungary; Norway; Sweden; United Kingdom (UKCS) offshore.,geographic 2D,6258,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,Norwegian Geodetic Institute geodetic publication 1990:1,EPSG,,97.11 99.11
+4259,Malongo 1987,,,,Angola - Cabinda offshore,geographic 2D,6259,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,Chevron Petroleum Technology,EPSG,Offshore extension of Mhast GeogCS (4264) using Transit translocation from Station Y at Malongo base camp.,
+4260,Manoca,,,,Cameroon,geographic 2D,6260,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4261,Merchich,,,,Morocco,geographic 2D,6261,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4262,Massawa,,,,Eritrea,geographic 2D,6262,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4263,Minna,,,,Nigeria,geographic 2D,6263,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4264,Mhast,,,,Angola - Cabinda,geographic 2D,6264,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4265,Monte Mario,,,,Italy,geographic 2D,6265,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4266,M'poraloko,,,,Gabon,geographic 2D,6266,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4267,NAD27,,,,North and central America - Canada; Mexico; United States (USA).,geographic 2D,6267,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST. Superseded by NAD27(76) (code 4608) in Ontario and CGQ77 (code 4609) in Quebec.,99.04
+4268,NAD27 Michigan,NAD Michigan,,,United States (USA) - Michigan,geographic 2D,6268,8901,North,East,Lat,Long,,9108,,,1996-12-12 00:00:00,,EPSG,Ellipsoid taken to be 800ft above geoid. Note: this coordinate system includes longitudes which are POSITIVE EAST.,96.28
+4269,NAD83,,,,Canada: Greenland; Mexico; United States (USA),geographic 2D,6269,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4270,Nahrwan 1967,,,,Arabian Gulf; Kuwait; United Arab Emirates (UAE) - Abu Dhabi; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain.,geographic 2D,6270,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4271,Naparima 1972,,,,Trinidad and Tobago,geographic 2D,6271,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4272,GD49,,,,New Zealand,geographic 2D,6272,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4273,NGO 1948,,,,Norway - onshore,geographic 2D,6273,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4274,Datum 73,,,,Portugal - onshore,geographic 2D,6274,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,Instituto Geografico e Cadastral; Lisbon,EPSG,,
+4275,NTF,,,,France - onshore,geographic 2D,6275,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4276,NSWC 9Z-2,,,,World,geographic 2D,6276,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4277,OSGB 1936,,,,United Kingdom (UK) - Great Britain - England Scotland Wales - onshore; Isle of Man.,geographic 2D,6277,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4278,OSGB70,,,,United Kingdom (UK) - Great Britain - England Scotland wales - onshore,geographic 2D,6278,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4279,OS(SN)80,,,,Ireland - onshore; United Kingdom (UK) - England Scotland Wales Northern Ireland - onshore E,geographic 2D,6279,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4280,Padang,,,,Indonesia - Sumatra,geographic 2D,6280,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4281,Palestine 1923,,,,Israel; Jordan; Lebanon,geographic 2D,6281,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4282,Pointe Noire,,,,Congo,geographic 2D,6282,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4283,GDA94,,,,Australia,geographic 2D,6283,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,,
+4284,Pulkovo 1942,,,,Armenia; Azerbaijan; Belarus; Estonia; Georgia; Kazakstan; Kirgistan; Latvia; Lithuania; Moldova; Russia; Tadzhikstan; Turkmenistan; Ukraine; Uzbekistan; Germany (former DDR); Czech Republic; Hungary; Poland; Romania; Latvia; Lithuania; Estonia; Albania,geographic 2D,6284,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4285,Qatar,,,,Qatar - onshore,geographic 2D,6285,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4286,Qatar 1948,,,,Qatar - onshore,geographic 2D,6286,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4287,Qornoq,,,,Greenland,geographic 2D,6287,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4288,Loma Quintana,,,,Venezuela - north,geographic 2D,6288,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4289,Amersfoort,,,,Netherlands - onshore,geographic 2D,6289,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4291,SAD69,,,,South America - Brazil,geographic 2D,6291,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.251. Error introduced if not using the truncated precision is 0 to 31mm.,97.252
+4292,Sapper Hill 1943,,,,Falkland Islands,geographic 2D,6292,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4293,Schwarzeck,,,,Namibia,geographic 2D,6293,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4294,Segora,,,,Indonesia - southeast Kalimantan,geographic 2D,6294,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4295,Serindung,,,,Indonesia - east Kalimantan,geographic 2D,6295,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4296,Sudan,,,,Sudan - south,geographic 2D,6296,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4297,Tananarive,,,,Madagascar,geographic 2D,6297,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4298,Timbalai 1948,,,,Brunei; Malaysia - East Malaysia (Sabah; Sarawak).,geographic 2D,6298,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Adopts metric conversion of 39.370147 inches per metre.,
+4299,TM65,,,,Ireland - onshore; United Kingdom (UK) - Northern Ireland (Ulster) onshore,geographic 2D,6299,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4300,TM75,,,,Ireland - onshore; United Kingdom (UK) - Northern Ireland (Ulster) onshore,geographic 2D,6300,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4301,Tokyo,,,,Japan; North Korea; South Korea,geographic 2D,6301,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4302,Trinidad 1903,,,,Trinidad and Tobago - Trinidad,geographic 2D,6302,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4303,TC(1948),,,,United Arab Emirates (UAE) - Abu Dhabi; Dubai,geographic 2D,6303,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4304,Voirol 1875,,,,Algeria - north of 32 deg N,geographic 2D,6304,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,IGN Paris,EPSG,,
+4305,Voirol Unifie,,,,Algeria - north of 32 deg N,geographic 2D,6305,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,"\"Le System Geodesique Nord-Sahara\"; IGN Paris",EPSG,,
+4306,Bern 1938,,,,Liechtenstein; Switzerland,geographic 2D,6306,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Used for the geographic coordinates overprinted on topographic maps constructed on the CH1903 / LV03 projected CS (code 21781).,
+4307,Nord Sahara 1959,,,,Algeria; Morocco; Tunisia,geographic 2D,6307,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,"\"Le System Geodesique Nord-Sahara\"; IGN Paris",EPSG,,
+4308,RT38,,,,Sweden,geographic 2D,6308,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,97.09
+4309,Yacare,,,,Uruguay,geographic 2D,6309,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4310,Yoff,,,,Senegal,geographic 2D,6310,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4311,Zanderij,,,,Suriname,geographic 2D,6311,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4312,MGI,,,,Austria; Yugoslavia,geographic 2D,6312,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,,
+4313,Belge 1972,,,,Belgium - onshore,geographic 2D,6313,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4314,DHDN,,,,Germany - onshore,geographic 2D,6314,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4315,Conakry 1905,,,,Guinea,geographic 2D,6315,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4316,Dealul Piscului 1933,,,,Romania,geographic 2D,6316,8901,North,East,Lat,Long,,9108,,,1996-04-12 00:00:00,,EPSG,Superseded by 1970 system (geogCS code 4317).,
+4317,Dealul Piscului 1970,,,,Romania,geographic 2D,6317,8901,North,East,Lat,Long,,9108,,,1996-04-12 00:00:00,,EPSG,Supersedes 1933 system (geogCS code 4316).,
+4318,NGN,,,,Kuwait,geographic 2D,6318,8901,North,East,Lat,Long,,9108,,,1996-04-12 00:00:00,,EPSG,,
+4319,KUDAMS,,,,Kuwait - Kuwait City,geographic 2D,6319,8901,North,East,Lat,Long,,9108,,,1996-04-12 00:00:00,,EPSG,,
+4322,WGS 72,,,,World,geographic 2D,6322,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,GeogCS code 4323 reserved for use with ProjCS's.,
+4324,WGS 72BE,,,,World,geographic 2D,6324,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,GeogCS code 4325 reserved for use with ProjCS's.,
+4326,WGS 84,,,,World,geographic 2D,6326,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,GeogCS code 4327 reserved for use with ProjCS's.,
+4600,Anguilla 1957,,,,Anguilla,geographic 2D,6600,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4601,Antigua 1943,,,,Antigua and Barbuda - Antigua,geographic 2D,6601,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4602,Dominica 1945,,,,Dominica,geographic 2D,6602,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4603,Grenada 1953,,,,Grenada (including Grenada Grenadines),geographic 2D,6603,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4604,Montserrat 1958,,,,Montserrat,geographic 2D,6604,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4605,St. Kitts 1955,,,,Saint Kitts and Nevis,geographic 2D,6605,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4606,St. Lucia 1955,,,,Saint Lucia,geographic 2D,6606,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4607,St. Vincent 1945,,,,Saint Vincent and the Grenadines,geographic 2D,6607,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4608,NAD27(76),,,,Canada - Ontario,geographic 2D,6608,8901,North,East,Lat,Long,,9108,,,1999-05-12 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4609,NAD27(CGQ77),CGQ77,,,Canada - Quebec,geographic 2D,6609,8901,North,East,Lat,Long,,9108,,,1999-05-12 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4801,Bern 1898 (Bern),,,,Liechtenstein; Switzerland,geographic 2D,6149,8907,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4802,Bogota (Bogota),,,,Colombia,geographic 2D,6218,8904,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4803,Lisbon (Lisbon),,,,Portugal - onshore,geographic 2D,6207,8902,North,East,Lat,Long,,9108,,,1997-04-11 00:00:00,Instituto Geografico e Cadastral; Lisbon,EPSG,,97.12
+4804,Makassar (Jakarta),,,,Indonesia - south west Sulawesi,geographic 2D,6257,8908,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4805,MGI (Ferro),,,,Austria; Yugoslavia,geographic 2D,6312,8909,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,,
+4806,Monte Mario (Rome),,,,Italy,geographic 2D,6265,8906,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4807,NTF (Paris),,,,France - onshore,geographic 2D,6275,8903,North,East,Lat,Long,,9105,,,1995-06-02 00:00:00,,EPSG,,
+4808,Padang (Jakarta),,,,Indonesia - Sumatra,geographic 2D,6280,8908,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4809,Belge 1950 (Brussels),,,,Belgium - onshore,geographic 2D,6215,8910,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4810,Tananarive (Paris),,,,Madagascar,geographic 2D,6297,8903,North,East,Lat,Long,,9105,,,1995-06-02 00:00:00,,EPSG,,
+4811,Voirol 1875 (Paris),,,,Algeria - north of 32 deg N,geographic 2D,6304,8903,North,East,Lat,Long,,9105,,,1995-06-02 00:00:00,IGN Paris,EPSG,,
+4812,Voirol Unifie (Paris),,,,Algeria - north of 32 deg N,geographic 2D,6305,8903,North,East,Lat,Long,,9105,,,1995-06-02 00:00:00,"\"Le System Geodesique Nord-Sahara\"; IGN Paris",EPSG,,
+4813,Batavia (Jakarta),,,,Indonesia - Java,geographic 2D,6211,8908,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4814,RT38 (Stockholm),,,,Sweden,geographic 2D,6308,8911,North,East,Lat,Long,,9108,,,1996-04-12 00:00:00,,EPSG,,
+4815,Greek (Athens),,,,Greece,geographic 2D,6120,8912,North,East,Lat,Long,,9108,,,1997-06-16 00:00:00,Topography Department; National Technical University of Greece.,EPSG,,
+4816,Carthage (Paris),,,,Tunisia,geographic 2D,6223,8903,North,East,Lat,Long,,9105,,,1998-11-11 00:00:00,,EPSG,Superseded by Greenwich-based Carthage geogCS.,
+4817,NGO 1948 (Oslo),,,,Norway - onshore,geographic 2D,6273,8913,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,,
+4901,ATF (Paris),,,,France,geographic 2D,6901,8903,North,East,Lat,Long,,9105,,,1995-06-02 00:00:00,,EPSG,,
+4902,NDG (Paris),,,,France - Alsace,geographic 2D,6902,8903,North,East,Lat,Long,,9105,,,1995-06-02 00:00:00,,EPSG,,
+4903,Madrid 1870 (Madrid),,,,Spain,geographic 2D,6903,8905,North,East,Lat,Long,,9108,,,1998-11-11 00:00:00,Institut de Geomatica; Barcelona.,EPSG,,
+20004,Pulkovo 1995 / Gauss-Kruger zone 4,1995 Coord. Sys. zone 4,,,Russia - west of 24 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16204,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20005,Pulkovo 1995 / Gauss-Kruger zone 5,1995 Coord. Sys. zone 5,,,Russia - 24 deg to 30 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16205,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20006,Pulkovo 1995 / Gauss-Kruger zone 6,1995 Coord. Sys. zone 6,,,Russia - 30 deg to 36 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16206,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20007,Pulkovo 1995 / Gauss-Kruger zone 7,1995 Coord. Sys. zone 7,,,Russia - 36 deg to 42 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16207,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20008,Pulkovo 1995 / Gauss-Kruger zone 8,1995 Coord. Sys. zone 8,,,Russia - 42 deg to 48 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16208,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20009,Pulkovo 1995 / Gauss-Kruger zone 9,1995 Coord. Sys. zone 9,,,Russia - 48 deg to 54 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16209,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20010,Pulkovo 1995 / Gauss-Kruger zone 10,1995 Coord. Sys. zone 10,,,Russia - 54 deg to 60 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16210,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20011,Pulkovo 1995 / Gauss-Kruger zone 11,1995 Coord. Sys. zone 11,,,Russia - 60 deg to 66 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16211,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20012,Pulkovo 1995 / Gauss-Kruger zone 12,1995 Coord. Sys. zone 12,,,Russia - 66 deg to 72 deg East .,projected 2D,,,North,East,X,Y,9001,,4200,16212,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20013,Pulkovo 1995 / Gauss-Kruger zone 13,1995 Coord. Sys. zone 13,,,Russia - 72 deg to 78 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16213,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20014,Pulkovo 1995 / Gauss-Kruger zone 14,1995 Coord. Sys. zone 14,,,Russia - 78 deg to 84 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16214,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20015,Pulkovo 1995 / Gauss-Kruger zone 15,1995 Coord. Sys. zone 15,,,Russia - 84 deg to 90 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16215,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20016,Pulkovo 1995 / Gauss-Kruger zone 16,1995 Coord. Sys. zone 16,,,Russia - 90 deg to 96 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16216,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20017,Pulkovo 1995 / Gauss-Kruger zone 17,1995 Coord. Sys. zone 17,,,Russia - 96 deg to 102deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16217,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20018,Pulkovo 1995 / Gauss-Kruger zone 18,1995 Coord. Sys. zone 18,,,Russia - 102 deg to 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16218,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20019,Pulkovo 1995 / Gauss-Kruger zone 19,1995 Coord. Sys. zone 19,,,Russia - 108 deg to 114 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16219,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20020,Pulkovo 1995 / Gauss-Kruger zone 20,1995 Coord. Sys. zone 20,,,Russia - 114 deg to 120 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16220,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20021,Pulkovo 1995 / Gauss-Kruger zone 21,1995 Coord. Sys. zone 21,,,Russia - 120 deg to 126 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16221,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20022,Pulkovo 1995 / Gauss-Kruger zone 22,1995 Coord. Sys. zone 22,,,Russia - 126 deg to 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16222,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20023,Pulkovo 1995 / Gauss-Kruger zone 23,1995 Coord. Sys. zone 23,,,Russia - 132 deg to 138 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16223,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20024,Pulkovo 1995 / Gauss-Kruger zone 24,1995 Coord. Sys. zone 24,,,Russia - 138 deg to 144 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16224,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20025,Pulkovo 1995 / Gauss-Kruger zone 25,1995 Coord. Sys. zone 25,,,Russia - 144 deg to 150 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16225,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20026,Pulkovo 1995 / Gauss-Kruger zone 26,1995 Coord. Sys. zone 26,,,Russia - 150 deg to 156 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16226,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20027,Pulkovo 1995 / Gauss-Kruger zone 27,1995 Coord. Sys. zone 27,,,Russia - 156 deg to 162 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16227,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20028,Pulkovo 1995 / Gauss-Kruger zone 28,1995 Coord. Sys. zone 28,,,Russia - 162 deg to 168 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16228,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20029,Pulkovo 1995 / Gauss-Kruger zone 29,1995 Coord. Sys. zone 29,,,Russia - 168 deg to 174 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16229,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20030,Pulkovo 1995 / Gauss-Kruger zone 30,1995 Coord. Sys. zone 30,,,Russia - 174 deg East to 180 deg.,projected 2D,,,North,East,X,Y,9001,,4200,16230,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20031,Pulkovo 1995 / Gauss-Kruger zone 31,1995 Coord. Sys. zone 31,,,Russia - 180 deg to 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4200,16231,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20032,Pulkovo 1995 / Gauss-Kruger zone 32,1995 Coord. Sys. zone 32,,,Russia - east of 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4200,16232,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20064,Pulkovo 1995 / Gauss-Kruger 4N,Pulkovo 1995 / Gauss 4N,,,Russia - west of 24 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16304,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20065,Pulkovo 1995 / Gauss-Kruger 5N,Pulkovo 1995 / Gauss 5N,,,Russia - 24 deg to 30 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16305,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20066,Pulkovo 1995 / Gauss-Kruger 6N,Pulkovo 1995 / Gauss 6N,,,Russia - 30 deg to 36 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16306,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20067,Pulkovo 1995 / Gauss-Kruger 7N,Pulkovo 1995 / Gauss 7N,,,Russia - 36 deg to 42 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16307,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20068,Pulkovo 1995 / Gauss-Kruger 8N,Pulkovo 1995 / Gauss 8N,,,Russia - 42 deg to 48 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16308,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20069,Pulkovo 1995 / Gauss-Kruger 9N,Pulkovo 1995 / Gauss 9N,,,Russia - 48 deg to 54 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16309,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20070,Pulkovo 1995 / Gauss-Kruger 10N,Pulkovo 1995 / Gauss 10N,,,Russia - 54 deg to 60 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16310,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20071,Pulkovo 1995 / Gauss-Kruger 11N,Pulkovo 1995 / Gauss 11N,,,Russia - 60 deg to 66 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16311,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20072,Pulkovo 1995 / Gauss-Kruger 12N,Pulkovo 1995 / Gauss 12N,,,Russia - 66 deg to 72 deg East .,projected 2D,,,North,East,X,Y,9001,,4200,16312,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20073,Pulkovo 1995 / Gauss-Kruger 13N,Pulkovo 1995 / Gauss 13N,,,Russia - 72 deg to 78 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16313,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20074,Pulkovo 1995 / Gauss-Kruger 14N,Pulkovo 1995 / Gauss 14N,,,Russia - 78 deg to 84 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16314,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20075,Pulkovo 1995 / Gauss-Kruger 15N,Pulkovo 1995 / Gauss 15N,,,Russia - 84 deg to 90 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16315,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20076,Pulkovo 1995 / Gauss-Kruger 16N,Pulkovo 1995 / Gauss 16N,,,Russia - 90 deg to 96 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16316,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20077,Pulkovo 1995 / Gauss-Kruger 17N,Pulkovo 1995 / Gauss 17N,,,Russia - 96 deg to 102deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16317,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20078,Pulkovo 1995 / Gauss-Kruger 18N,Pulkovo 1995 / Gauss 18N,,,Russia - 102 deg to 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16318,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20079,Pulkovo 1995 / Gauss-Kruger 19N,Pulkovo 1995 / Gauss 19N,,,Russia - 108 deg to 114 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16319,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20080,Pulkovo 1995 / Gauss-Kruger 20N,Pulkovo 1995 / Gauss 20N,,,Russia - 114 deg to 120 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16320,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20081,Pulkovo 1995 / Gauss-Kruger 21N,Pulkovo 1995 / Gauss 21N,,,Russia - 120 deg to 126 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16321,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20082,Pulkovo 1995 / Gauss-Kruger 22N,Pulkovo 1995 / Gauss 22N,,,Russia - 126 deg to 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16322,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20083,Pulkovo 1995 / Gauss-Kruger 23N,Pulkovo 1995 / Gauss 23N,,,Russia - 132 deg to 138 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16323,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20084,Pulkovo 1995 / Gauss-Kruger 24N,Pulkovo 1995 / Gauss 24N,,,Russia - 138 deg to 144 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16324,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20085,Pulkovo 1995 / Gauss-Kruger 25N,Pulkovo 1995 / Gauss 25N,,,Russia - 144 deg to 150 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16325,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20086,Pulkovo 1995 / Gauss-Kruger 26N,Pulkovo 1995 / Gauss 26N,,,Russia - 150 deg to 156 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16326,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20087,Pulkovo 1995 / Gauss-Kruger 27N,Pulkovo 1995 / Gauss 27N,,,Russia - 156 deg to 162 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16327,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20088,Pulkovo 1995 / Gauss-Kruger 28N,Pulkovo 1995 / Gauss 28N,,,Russia - 162 deg to 168 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16328,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20089,Pulkovo 1995 / Gauss-Kruger 29N,Pulkovo 1995 / Gauss 29N,,,Russia - 168 deg to 174 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16329,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20090,Pulkovo 1995 / Gauss-Kruger 30N,Pulkovo 1995 / Gauss 30N,,,Russia - 174 deg East to 180 deg.,projected 2D,,,North,East,X,Y,9001,,4200,16330,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20091,Pulkovo 1995 / Gauss-Kruger 31N,Pulkovo 1995 / Gauss 31N,,,Russia - 180 deg to 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4200,16331,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20092,Pulkovo 1995 / Gauss-Kruger 32N,Pulkovo 1995 / Gauss 32N,,,Russia - east of 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4200,16332,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20137,Adindan / UTM zone 37N,,,,Ethiopia - west of 42 degrees East. Sudan - west of 42 degrees East.,projected 2D,,,East,North,E,N,9001,,4201,16037,1995-06-02 00:00:00,,EPSG,,
+20138,Adindan / UTM zone 38N,,,,Ethiopia - east of 42 degrees East. Sudan - east of 42 degrees East.,projected 2D,,,East,North,E,N,9001,,4201,16038,1995-06-02 00:00:00,,EPSG,,
+20248,AGD66 / AMG zone 48,,,,Australia - 102deg East to 108deg East.,projected 2D,,,East,North,E,N,9001,,4202,17448,1995-06-02 00:00:00,,EPSG,,
+20249,AGD66 / AMG zone 49,,,,Australia - 108deg East to 114deg East.,projected 2D,,,East,North,E,N,9001,,4202,17449,1995-06-02 00:00:00,,EPSG,,
+20250,AGD66 / AMG zone 50,,,,Australia - 114deg East to 120deg East.,projected 2D,,,East,North,E,N,9001,,4202,17450,1995-06-02 00:00:00,,EPSG,,
+20251,AGD66 / AMG zone 51,,,,Australia - 120deg East to 126deg East.,projected 2D,,,East,North,E,N,9001,,4202,17451,1995-06-02 00:00:00,,EPSG,,
+20252,AGD66 / AMG zone 52,,,,Australia - 126deg East to 132deg East.,projected 2D,,,East,North,E,N,9001,,4202,17452,1995-06-02 00:00:00,,EPSG,,
+20253,AGD66 / AMG zone 53,,,,Australia - 132deg East to 138deg East.,projected 2D,,,East,North,E,N,9001,,4202,17453,1995-06-02 00:00:00,,EPSG,,
+20254,AGD66 / AMG zone 54,,,,Australia - 138deg East to 144deg East. Papua New Guinea - west of 144deg East.,projected 2D,,,East,North,E,N,9001,,4202,17454,1995-06-02 00:00:00,,EPSG,,
+20255,AGD66 / AMG zone 55,,,,Australia - 144deg East to 150deg East. Papua New Guinea - 144deg East to 150deg East.,projected 2D,,,East,North,E,N,9001,,4202,17455,1995-06-02 00:00:00,,EPSG,,
+20256,AGD66 / AMG zone 56,,,,Australia - 150deg East to 156deg East.,projected 2D,,,East,North,E,N,9001,,4202,17456,1995-06-02 00:00:00,,EPSG,,
+20257,AGD66 / AMG zone 57,,,,Australia - 156deg East to 162deg East.,projected 2D,,,East,North,E,N,9001,,4202,17457,1995-06-02 00:00:00,,EPSG,,
+20258,AGD66 / AMG zone 58,,,,Australia - 162deg East to 168deg East.,projected 2D,,,East,North,E,N,9001,,4202,17458,1995-06-02 00:00:00,,EPSG,,
+20348,AGD84 / AMG zone 48,,,,Australia - 102deg East to 108deg East.,projected 2D,,,East,North,E,N,9001,,4203,17448,1995-06-02 00:00:00,,EPSG,,
+20349,AGD84 / AMG zone 49,,,,Australia - 108deg East to 114deg East.,projected 2D,,,East,North,E,N,9001,,4203,17449,1995-06-02 00:00:00,,EPSG,,
+20350,AGD84 / AMG zone 50,,,,Australia - 114deg East to 120deg East.,projected 2D,,,East,North,E,N,9001,,4203,17450,1995-06-02 00:00:00,,EPSG,,
+20351,AGD84 / AMG zone 51,,,,Australia - 120deg East to 126deg East.,projected 2D,,,East,North,E,N,9001,,4203,17451,1995-06-02 00:00:00,,EPSG,,
+20352,AGD84 / AMG zone 52,,,,Australia - 126deg East to 132deg East.,projected 2D,,,East,North,E,N,9001,,4203,17452,1995-06-02 00:00:00,,EPSG,,
+20353,AGD84 / AMG zone 53,,,,Australia - 132deg East to 138deg East.,projected 2D,,,East,North,E,N,9001,,4203,17453,1995-06-02 00:00:00,,EPSG,,
+20354,AGD84 / AMG zone 54,,,,Australia - 138deg East to 144deg East. Papua - New Guinea west of 144deg East.,projected 2D,,,East,North,E,N,9001,,4203,17454,1995-06-02 00:00:00,,EPSG,,
+20355,AGD84 / AMG zone 55,,,,Australia - 144deg East to 150deg East. Papua New Guinea - 144deg East to 150deg East.,projected 2D,,,East,North,E,N,9001,,4203,17455,1995-06-02 00:00:00,,EPSG,,
+20356,AGD84 / AMG zone 56,,,,Australia - 150deg East to 156deg East.,projected 2D,,,East,North,E,N,9001,,4203,17456,1995-06-02 00:00:00,,EPSG,,
+20357,AGD84 / AMG zone 57,,,,Australia - 156deg East to 162deg East.,projected 2D,,,East,North,E,N,9001,,4203,17457,1995-06-02 00:00:00,,EPSG,,
+20358,AGD84 / AMG zone 58,,,,Australia - 162deg East to 168deg East.,projected 2D,,,East,North,E,N,9001,,4203,17458,1995-06-02 00:00:00,,EPSG,,
+20437,Ain el Abd / UTM zone 37N,Ain el Abd / UTM 37N,,,Saudi Arabia - west of 42 degrees East.,projected 2D,,,East,North,E,N,9001,,4204,16037,1997-11-13 00:00:00,,EPSG,,97.59
+20438,Ain el Abd / UTM zone 38N,Ain el Abd / UTM 38N,,,Kuwait. Saudi Arabia - between 42 degrees and 48 degrees East.,projected 2D,,,East,North,E,N,9001,,4204,16038,1997-11-13 00:00:00,,EPSG,"Known in Kuwait as \"KOC UTM\".",97.59
+20439,Ain el Abd / UTM zone 39N,Ain el Abd / UTM 39N,,,Saudi Arabia - east of 48 degrees East.,projected 2D,,,East,North,E,N,9001,,4204,16039,1997-11-13 00:00:00,,EPSG,,97.59
+20499,Ain el Abd / Bahrain Grid,,,,Bahrain.,projected 2D,,,East,North,E,N,9001,,4204,19900,1995-06-02 00:00:00,,EPSG,,
+20538,Afgooye / UTM zone 38N,,,,Somalia - west of 48 degrees East.,projected 2D,,,East,North,E,N,9001,,4205,16038,1995-06-02 00:00:00,,EPSG,,
+20539,Afgooye / UTM zone 39N,,,,Somalia - east of 48 degrees East.,projected 2D,,,East,North,E,N,9001,,4205,16039,1995-06-02 00:00:00,,EPSG,,
+20790,Lisbon (Lisbon)/Portuguese National Grid,Lisbon / Portuguese Grid,,,Portugal - onshore.,projected 2D,,,East,North,X,Y,9001,,4803,19936,1998-11-11 00:00:00,,EPSG,,98.42
+20822,Aratu / UTM zone 22S,,,,Brazil - coastal areas south of 2 deg 55 min South and west of 48 deg West.,projected 2D,,,East,North,E,N,9001,,4208,16122,1995-07-21 00:00:00,,EPSG,,95.191
+20823,Aratu / UTM zone 23S,,,,Brazil - coastal areas south of 2 deg 55 min South and between 48 and 42 deg West; offshore Santos basin.,projected 2D,,,East,North,E,N,9001,,4208,16123,1995-07-21 00:00:00,,EPSG,,95.191
+20824,Aratu / UTM zone 24S,,,,Brazil - coastal areas south of 2 deg 55 min South and east of 42 deg West; offshore Campos basin.,projected 2D,,,East,North,E,N,9001,,4208,16124,1995-07-21 00:00:00,,EPSG,,95.191
+20934,Arc 1950 / UTM zone 34S,,,,Botswana & Zambia - west of 24 deg East.,projected 2D,,,East,North,E,N,9001,,4209,16134,1997-11-13 00:00:00,,EPSG,,
+20935,Arc 1950 / UTM zone 35S,,,,Botswana - east of 24 deg East; Zambia - 24 to 30 deg East; Zimbabwe west of 30 deg East .,projected 2D,,,East,North,E,N,9001,,4209,16135,1997-11-13 00:00:00,,EPSG,,
+20936,Arc 1950 / UTM zone 36S,,,,Malawi; Zambia & Zimbabwe - east of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4209,16136,1997-11-13 00:00:00,,EPSG,,
+21035,Arc 1960 / UTM zone 35S,,,,Tanzania - west of 30 deg East; Uganda south of equator and west of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4210,16135,1997-11-13 00:00:00,,EPSG,,
+21036,Arc 1960 / UTM zone 36S,,,,Kenya - south of equator and west of 36 deg East; Tanzania - 30 to 36 deg East; Uganda south of equator and east of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4210,16136,1997-11-13 00:00:00,,EPSG,,
+21037,Arc 1960 / UTM zone 37S,,,,Kenya - south of equator and east of 36 deg East; Tanzania - east of 36 deg East.,projected 2D,,,East,North,E,N,9001,,4210,16137,1997-11-13 00:00:00,,EPSG,,
+21095,Arc 1960 / UTM zone 35N,,,,Uganda north of equator and west of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4210,16035,1997-11-13 00:00:00,,EPSG,,
+21096,Arc 1960 / UTM zone 36N,,,,Kenya - north of equator and west of 36 deg East; Uganda north of equator and east of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4210,16036,1997-11-13 00:00:00,,EPSG,,
+21097,Arc 1960 / UTM zone 37N,,,,Kenya - north of equator and east of 36 deg East.,projected 2D,,,East,North,E,N,9001,,4210,16037,1997-11-13 00:00:00,,EPSG,,
+21100,Batavia (Jakarta) / NEIEZ,Batavia / NEIEZ,,,Indonesia - Java.,projected 2D,,,East,North,X,Y,9001,,4813,19905,1995-06-02 00:00:00,,EPSG,,
+21148,Batavia / UTM zone 48S,,,,Indonesia - Java west of 108 deg East.,projected 2D,,,East,North,E,N,9001,,4211,16148,1995-06-02 00:00:00,,EPSG,,
+21149,Batavia / UTM zone 49S,,,,Indonesia - Java between 108 and 114 deg East.,projected 2D,,,East,North,E,N,9001,,4211,16149,1995-06-02 00:00:00,,EPSG,,
+21150,Batavia / UTM zone 50S,,,,Indonesia - Java east of 114 deg East.,projected 2D,,,East,North,E,N,9001,,4211,16150,1995-06-02 00:00:00,,EPSG,,
+21291,Barbados 1938 / British West Indies Grid,Barbados 1938 / BWI Grid,,,Barbados,projected 2D,,,East,North,E,N,9001,,4212,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,Superseded by Barbados National Grid (code 21292) from 1983.,
+21292,Barbados 1938 / Barbados National Grid,Barbados NationaI Grid,,,Barbados,projected 2D,,,East,North,E,N,9001,,4212,19943,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,Supersedes Barbados 1938 / BWI Grid (code 21291) from 1983.,
+21413,Beijing 1954 / Gauss-Kruger zone 13,Beijing / Gauss zone 13,,,China - west of 78 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16213,1995-06-02 00:00:00,,EPSG,,
+21414,Beijing 1954 / Gauss-Kruger zone 14,Beijing / Gauss zone 14,,,China - 78 deg East to 84 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16214,1995-06-02 00:00:00,,EPSG,,
+21415,Beijing 1954 / Gauss-Kruger zone 15,Beijing / Gauss zone 15,,,China - 84 deg East to 90 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16215,1995-06-02 00:00:00,,EPSG,,
+21416,Beijing 1954 / Gauss-Kruger zone 16,Beijing / Gauss zone 16,,,China - 90 deg East to 96 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16216,1995-06-02 00:00:00,,EPSG,,
+21417,Beijing 1954 / Gauss-Kruger zone 17,Beijing / Gauss zone 17,,,China - 96 deg East to 102eg E,projected 2D,,,North,East,X,Y,9001,,4214,16217,1995-06-02 00:00:00,,EPSG,,
+21418,Beijing 1954 / Gauss-Kruger zone 18,Beijing / Gauss zone 18,,,China - 102 deg East to 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16218,1995-06-02 00:00:00,,EPSG,,
+21419,Beijing 1954 / Gauss-Kruger zone 19,Beijing / Gauss zone 19,,,China - 108 deg East to 114 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16219,1995-06-02 00:00:00,,EPSG,,
+21420,Beijing 1954 / Gauss-Kruger zone 20,Beijing / Gauss zone 20,,,China - 114 deg East to 120 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16220,1995-06-02 00:00:00,,EPSG,,
+21421,Beijing 1954 / Gauss-Kruger zone 21,Beijing / Gauss zone 21,,,China - 120 deg East to 126 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16221,1995-06-02 00:00:00,,EPSG,,
+21422,Beijing 1954 / Gauss-Kruger zone 22,Beijing / Gauss zone 22,,,China - 126 deg East to 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16222,1995-06-02 00:00:00,,EPSG,,
+21423,Beijing 1954 / Gauss-Kruger zone 23,Beijing / Gauss zone 23,,,China - east of 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16223,1995-06-02 00:00:00,,EPSG,,
+21473,Beijing 1954 / Gauss-Kruger 13N,Beijing / Gauss 13N,,,China - west of 78 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16313,1995-06-02 00:00:00,,EPSG,,
+21474,Beijing 1954 / Gauss-Kruger 14N,Beijing / Gauss 14N,,,China - 78 deg East to 84 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16314,1995-06-02 00:00:00,,EPSG,,
+21475,Beijing 1954 / Gauss-Kruger 15N,Beijing / Gauss 15N,,,China - 84 deg East to 90 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16315,1995-06-02 00:00:00,,EPSG,,
+21476,Beijing 1954 / Gauss-Kruger 16N,Beijing / Gauss 16N,,,China - 90 deg East to 96 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16316,1995-06-02 00:00:00,,EPSG,,
+21477,Beijing 1954 / Gauss-Kruger 17N,Beijing / Gauss 17N,,,China - 96 deg East to 102eg E,projected 2D,,,North,East,X,Y,9001,,4214,16317,1995-06-02 00:00:00,,EPSG,,
+21478,Beijing 1954 / Gauss-Kruger 18N,Beijing / Gauss 18N,,,China - 102 deg East to 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16318,1995-06-02 00:00:00,,EPSG,,
+21479,Beijing 1954 / Gauss-Kruger 19N,Beijing / Gauss 19N,,,China - 108 deg East to 114 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16319,1995-06-02 00:00:00,,EPSG,,
+21480,Beijing 1954 / Gauss-Kruger 20N,Beijing / Gauss 20N,,,China - 114 deg East to 120 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16320,1995-06-02 00:00:00,,EPSG,,
+21481,Beijing 1954 / Gauss-Kruger 21N,Beijing / Gauss 21N,,,China - 120 deg East to 126 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16321,1995-06-02 00:00:00,,EPSG,,
+21482,Beijing 1954 / Gauss-Kruger 22N,Beijing / Gauss 22N,,,China - 126 deg East to 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16322,1995-06-02 00:00:00,,EPSG,,
+21483,Beijing 1954 / Gauss-Kruger 23N,Beijing / Gauss 23N,,,China - east of 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16323,1995-06-02 00:00:00,,EPSG,,
+21500,Belge 1950 (Brussels) / Belge Lambert 50,Belge Lambert 50,,,Belgium - onshore.,projected 2D,,,East,North,X,Y,9001,,4809,19901,1997-04-11 00:00:00,,EPSG,Superseded by 31300 (Belge 1972 / Belge Lambert 72).,97.13
+21780,Bern 1898 (Bern) / LV03C,LV03C,,,Liechtenstein. Switzerland.,projected 2D,,,East,North,Y,X,9001,,4801,19923,1997-06-30 00:00:00,,EPSG,Superseded by CH1903 / LV03 (code 21781).,97.27 97.62
+21781,CH1903 / LV03,LV03,,,Liechtenstein; Switzerland.,projected 2D,,,East,North,Y,X,9001,,4149,19922,1999-10-20 00:00:00,,EPSG,Supersedes LV03C (code 21780). Superseded by CH1903+/LV95 (code 256).,
+21817,Bogota / UTM zone 17N,,,,Colombia - offshore west of 78 deg W of Greenwich.,projected 2D,,,East,North,E,N,9001,,4218,16017,1995-06-02 00:00:00,,EPSG,,
+21818,Bogota / UTM zone 18N,,,,Colombia - offshore east of 78 deg W of Greenwich.,projected 2D,,,East,North,E,N,9001,,4218,16018,1995-06-02 00:00:00,,EPSG,,
+21891,Bogota / Colombia West zone,Bogota / Colombia 3W,,,Colombia - west of 1 deg 30 min W of Bogota (75d 34m 51.30s W of Greenwich).,projected 2D,,,East,North,X,Y,9001,,4218,18051,1997-11-13 00:00:00,,EPSG,,97.11 97.57
+21892,Bogota / Colombia Bogota zone,Bogota / Colombia Bogota,,,Colombia - 1 deg 30 min W to 1 deg 30 min E of Bogota (75d 35m W to 72d 35m W of Greenwich).,projected 2D,,,East,North,X,Y,9001,,4218,18052,1997-11-13 00:00:00,,EPSG,,97.11 97.57
+21893,Bogota / Colombia East Central zone,Bogota / Colombia 3E,,,Colombia - 1 deg 30 min to 4 deg 30 min E of Bogota (72d 35m to 69d 34m W of Greenwich).,projected 2D,,,East,North,X,Y,9001,,4218,18053,1997-11-13 00:00:00,,EPSG,,97.11 97.57
+21894,Bogota / Colombia East,Bogota / Colombia 6E,,,Colombia - east of 4 deg 30 min E of Bogota (69d 34m 51.3s W of Greenwich).,projected 2D,,,East,North,X,Y,9001,,4218,18054,1997-11-13 00:00:00,,EPSG,,97.11 97.57
+22032,Camacupa / UTM zone 32S,,,,Angola - west of 12 deg East.,projected 2D,,,East,North,E,N,9001,,4220,16132,1997-11-13 00:00:00,,EPSG,,97.58
+22033,Camacupa / UTM zone 33S,,,,Angola - east of 12 deg East.,projected 2D,,,East,North,E,N,9001,,4220,16133,1997-11-13 00:00:00,,EPSG,,97.58
+22091,Camacupa / TM 11.30 SE,,,,Angola - offshore.,projected 2D,,,East,North,E,N,9001,,4220,16611,1998-11-11 00:00:00,Esso Angola,EPSG,Used by Esso Angola for offshore blocks 15 and 24.,
+22092,Camacupa / TM 12 SE,,,,Angola - offshore.,projected 2D,,,East,North,E,N,9001,,4220,16612,1998-11-11 00:00:00,Shell Angola,EPSG,"Used by Shell Angola for offshore blocks 1 and 16. Used by BP Amoco, Elf and Esso for offshore blocks 31-33.",
+22191,Campo Inchauspe / Argentina 1,C Inchauspe /Argentina 1,,,Argentina - west of 70 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18031,1999-11-15 00:00:00,,EPSG,,97.72
+22192,Campo Inchauspe / Argentina 2,C Inchauspe /Argentina 2,,,Argentina - between 70 deg 30 min and 67 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18032,1999-11-15 00:00:00,,EPSG,,97.72
+22193,Campo Inchauspe / Argentina 3,C Inchauspe /Argentina 3,,,Argentina - between 67 deg 30 min and 64 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18033,1999-11-15 00:00:00,,EPSG,,97.72
+22194,Campo Inchauspe / Argentina 4,C Inchauspe /Argentina 4,,,Argentina - between 64 deg 30 min and 61 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18034,1999-11-15 00:00:00,,EPSG,,97.72
+22195,Campo Inchauspe / Argentina 5,C Inchauspe /Argentina 5,,,Argentina - between 61 deg 30 min and 58 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18035,1999-11-15 00:00:00,,EPSG,,97.72
+22196,Campo Inchauspe / Argentina 6,C Inchauspe /Argentina 6,,,Argentina - between 58 deg 30 min and 55 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18036,1999-11-15 00:00:00,,EPSG,,97.72
+22197,Campo Inchauspe / Argentina 7,C Inchauspe /Argentina 7,,,Argentina - east of 55 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18037,1999-11-15 00:00:00,,EPSG,,97.72
+22234,Cape / UTM zone 34S,,,,Botswana - west of 21deg East.,projected 2D,,,East,North,E,N,9001,,4222,16134,1995-12-08 00:00:00,,EPSG,,
+22235,Cape / UTM zone 35S,,,,Botswana - east of 27deg East.,projected 2D,,,East,North,E,N,9001,,4222,16135,1995-12-08 00:00:00,,EPSG,,
+22236,Cape / UTM zone 36S,,,,Botswana - between 21 and 27deg East.,projected 2D,,,East,North,E,N,9001,,4222,16136,1995-12-08 00:00:00,,EPSG,,
+22275,South African Coordinate System zone 15,South African CS zone 15,,,South Africa - Walvis Bay.,projected 2D,,,West,South,W,S,9001,,4222,17515,1996-04-12 00:00:00,,EPSG,,
+22277,South African Coordinate System zone 17,South African CS zone 17,,,South Africa - west of 18 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17517,1996-04-12 00:00:00,,EPSG,,
+22279,South African Coordinate System zone 19,South African CS zone 19,,,South Africa - 18 to 20 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17519,1996-04-12 00:00:00,,EPSG,,
+22281,South African Coordinate System zone 21,South African CS zone 21,,,South Africa - 20 to 22 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17521,1996-04-12 00:00:00,,EPSG,,
+22283,South African Coordinate System zone 23,South African CS zone 23,,,South Africa - 22 to 24 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17523,1996-04-12 00:00:00,,EPSG,,
+22285,South African Coordinate System zone 25,South African CS zone 25,,,Lestho - west of 26 deg East; South Africa - 24 to 26 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17525,1996-04-12 00:00:00,,EPSG,,
+22287,South African Coordinate System zone 27,South African CS zone 27,,,Lestho - east of 26 deg East; South Africa - 26 to 28 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17527,1996-04-12 00:00:00,,EPSG,,
+22289,South African Coordinate System zone 29,South African CS zone 29,,,South Africa - 28 to 30 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17529,1996-04-12 00:00:00,,EPSG,,
+22291,South African Coordinate System zone 31,South African CS zone 31,,,South Africa - 30 to 32 deg East; Swaziland.,projected 2D,,,West,South,W,S,9001,,4222,17531,1996-04-12 00:00:00,,EPSG,,
+22293,South African Coordinate System zone 33,South African CS zone 33,,,South Africa - east of 32 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17533,1996-04-12 00:00:00,,EPSG,,
+22300,Carthage (Paris) / Tunisia Mining Grid,Tunisia Mining Grid,,,Tunisia - onshore.,projected 2D,,,East,North,X,Y,9036,,4816,19937,1998-11-11 00:00:00,,EPSG,CAUTION: Carthage datum did not exist when the 1953 decree was issued and an inference is that grid should be applied to the Voirol 1875 geogCS. Common practice assumes that the current Tunisian geodetic datum of Carthage applies.,
+22332,Carthage / UTM zone 32N,,,,Tunisia - offshore.,projected 2D,,,East,North,X,Y,9001,,4223,16032,1995-06-02 00:00:00,,EPSG,,
+22391,Carthage / Nord Tunisie,,,,Tunisia - north of 38.5 grads (34 deg 39 min) North.,projected 2D,,,East,North,X,Y,9001,,4223,18181,1995-06-02 00:00:00,,EPSG,,
+22392,Carthage / Sud Tunisie,,,,Tunisia - south of 38.5 grads (34 deg 39 min) North.,projected 2D,,,East,North,X,Y,9001,,4223,18182,1995-06-02 00:00:00,,EPSG,,
+22523,Corrego Alegre / UTM zone 23S,Corrego Alegre / UTM 23S,,,Brazil - NE coastal area between 45 deg W and 42 deg W.,projected 2D,,,East,North,E,N,9001,,4225,16123,1995-06-02 00:00:00,,EPSG,,
+22524,Corrego Alegre / UTM zone 24S,Corrego Alegre / UTM 24S,,,Brazil - NE coastal area between 42 deg W and 40 deg W.,projected 2D,,,East,North,E,N,9001,,4225,16124,1995-06-02 00:00:00,,EPSG,,
+22700,Deir ez Zor / Levant Zone,,,,Syrian Arab Republic west of 39 deg E.,projected 2D,,,East,North,X,Y,9001,,4227,19940,1999-04-22 00:00:00,,EPSG,Superseded by Deir ez Zor / Syria Lambert (EPSG code 22770) from 1973.,
+22770,Deir ez Zor / Syria Lambert,,,,Syrian Arab Republic,projected 2D,,,East,North,X,Y,9001,,4227,19948,1999-10-20 00:00:00,,EPSG,Supersedes Deir ez Zor / Levant zone (EPSG code 22700) from 1973.,
+22832,Douala / UTM zone 32N,,,,Cameroon.,projected 2D,,,East,North,E,N,9001,,4228,16032,1995-06-02 00:00:00,,EPSG,,
+22991,Egypt 1907 / Blue Belt,,,,Egypt - Sinai peninsula.,projected 2D,,,East,North,E,N,9001,,4229,18071,1999-04-22 00:00:00,,EPSG,Also known as Egypt 1907 / Green Belt. Oil industry usually uses Egypt 1907 / Red Belt rather than this projected CS.,
+22992,Egypt 1907 / Red Belt,,,,Egypt - east of 29 deg East.,projected 2D,,,East,North,E,N,9001,,4229,18072,1995-06-02 00:00:00,,EPSG,See also Egypt 1907 / Blue Belt for non oil industry usage in Sinai peninsula.,
+22993,Egypt 1907 / Purple Belt,,,,Egypt - west of 29 deg E; north of approx 28 deg 11 min North.,projected 2D,,,East,North,E,N,9001,,4229,18073,1995-06-02 00:00:00,,EPSG,,
+22994,Egypt 1907 / Extended Purple Belt,Egypt 1907 / Ext. Purple,,,Egypt - west of 29 deg E; south of approx 28 deg 11 min North.,projected 2D,,,East,North,E,N,9001,,4229,18074,1995-06-02 00:00:00,,EPSG,,
+23028,ED50 / UTM zone 28N,,,,Europe - 18deg West to 12deg West - Ireland offshore; United Kingdom (UKCS) offshore.,projected 2D,,,East,North,E,N,9001,,4230,16028,1995-06-02 00:00:00,,EPSG,,
+23029,ED50 / UTM zone 29N,,,,Europe - 12deg West to 6deg West - Portugal; Spain; Ireland offshore; United Kingdom (UKCS) offshore.,projected 2D,,,East,North,E,N,9001,,4230,16029,1995-06-02 00:00:00,,EPSG,,
+23030,ED50 / UTM zone 30N,,,,Europe - 6deg West to 0deg - Spain; France offshore; Ireland offshore; United Kingdom - UKCS offshore - North Sea west of 0 deg East).,projected 2D,,,East,North,E,N,9001,,4230,16030,1995-06-02 00:00:00,,EPSG,,
+23031,ED50 / UTM zone 31N,,,,Europe - 0deg to 6deg East - Denmark (North Sea); Germany offshore; Netherlands offshore; Norway; United Kingdom (UKCS) offshore.,projected 2D,,,East,North,E,N,9001,,4230,16031,1995-06-02 00:00:00,,EPSG,,
+23032,ED50 / UTM zone 32N,,,,Europe - 6deg East to 12deg East - Denmark; Germany offshore; Netherlands offshore; Norway.,projected 2D,,,East,North,E,N,9001,,4230,16032,1995-06-02 00:00:00,,EPSG,,
+23033,ED50 / UTM zone 33N,,,,Europe - 12deg East to 18deg East - Denmark including Bornholm; Norway.,projected 2D,,,East,North,E,N,9001,,4230,16033,1995-06-02 00:00:00,,EPSG,,
+23034,ED50 / UTM zone 34N,,,,Europe - 18deg East to 24deg East - Greece; Norway.,projected 2D,,,East,North,E,N,9001,,4230,16034,1995-06-02 00:00:00,,EPSG,,
+23035,ED50 / UTM zone 35N,,,,Europe - 24deg East to 30deg East - Greece; Norway; Turkey.,projected 2D,,,East,North,E,N,9001,,4230,16035,1995-06-02 00:00:00,,EPSG,,
+23036,ED50 / UTM zone 36N,,,,Europe - 30deg East to 36deg East - Turkey.,projected 2D,,,East,North,E,N,9001,,4230,16036,1995-06-02 00:00:00,,EPSG,,
+23037,ED50 / UTM zone 37N,,,,Europe - 36deg East to 42deg East - Turkey.,projected 2D,,,East,North,E,N,9001,,4230,16037,1995-06-02 00:00:00,,EPSG,,
+23038,ED50 / UTM zone 38N,,,,Europe - 42deg East to 48deg East - Turkey.,projected 2D,,,East,North,E,N,9001,,4230,16038,1995-06-02 00:00:00,,EPSG,,
+23090,ED50 / TM 0 N,,,,United Kingdom (UKCS) - offshore North Sea.,projected 2D,,,East,North,E,N,9001,,4230,16400,1998-11-11 00:00:00,Shell UK,EPSG,Used by Shell UK for North Sea,
+23095,ED50 / TM 5 NE,,,,Netherlands - offshore North Sea.,projected 2D,,,East,North,E,N,9001,,4230,16405,1998-11-11 00:00:00,NAM,EPSG,Used by NAM,
+23239,Fahud / UTM zone 39N,,,,Oman - west of 54 deg East.,projected 2D,,,East,North,E,N,9001,,4232,16039,1995-06-02 00:00:00,,EPSG,Since 1993 superseded by PSD93 / UTM zone 39N projCS (code 3439). Maximum differences to Fahud adjustment are 20 metres.,
+23240,Fahud / UTM zone 40N,,,,Oman - east of 54 deg East.,projected 2D,,,East,North,E,N,9001,,4232,16040,1995-06-02 00:00:00,,EPSG,Since 1993 superseded by PSD93 / UTM zone 40N projCS (code 3440). Maximum differences to Fahud adjustment are 20 metres.,
+23433,Garoua / UTM zone 33N,,,,Cameroon.,projected 2D,,,East,North,E,N,9001,,4234,16033,1995-06-02 00:00:00,,EPSG,,
+23700,HD72 / EOV,,,,Hungary,projected 2D,,,East,North,Y,X,9001,,4237,19931,1997-07-22 00:00:00,,EPSG,,
+23846,ID74 / UTM zone 46N,,,,Indonesia - north of equator and west of 96 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16046,1995-08-08 00:00:00,,EPSG,,95.193 95.20
+23847,ID74 / UTM zone 47N,,,,Indonesia - north of equator and between 96 deg and 102 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16047,1995-07-21 00:00:00,,EPSG,,95.193
+23848,ID74 / UTM zone 48N,,,,Indonesia - north of equator and between 102 deg and 108 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16048,1995-07-21 00:00:00,,EPSG,,95.193
+23849,ID74 / UTM zone 49N,,,,Indonesia - north of equator and between 108 deg and 114 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16049,1995-07-21 00:00:00,,EPSG,,95.193
+23850,ID74 / UTM zone 50N,,,,Indonesia - north of equator and between 114 deg and 120 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16050,1995-07-21 00:00:00,,EPSG,,95.193
+23851,ID74 / UTM zone 51N,,,,Indonesia - north of equator and between 120 deg and 126 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16051,1995-07-21 00:00:00,,EPSG,,95.193
+23852,ID74 / UTM zone 52N,,,,Indonesia - north of equator and between 126 deg and 132 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16052,1995-07-21 00:00:00,,EPSG,,95.193
+23853,ID74 / UTM zone 53N,,,,Indonesia - north of equator and east of 132 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16053,1995-07-21 00:00:00,,EPSG,,95.193
+23886,ID74 / UTM zone 46S,,,,Indonesia - south of equator and west of 96 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16146,1995-08-08 00:00:00,,EPSG,,95.193 95.20
+23887,ID74 / UTM zone 47S,,,,Indonesia - south of equator and between 96 deg and 102 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16147,1995-07-21 00:00:00,,EPSG,,95.193
+23888,ID74 / UTM zone 48S,,,,Indonesia - south of equator and between 102 deg and 108 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16148,1995-07-21 00:00:00,,EPSG,,95.193
+23889,ID74 / UTM zone 49S,,,,Indonesia - south of equator and between 108 deg and 114 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16149,1995-07-21 00:00:00,,EPSG,,95.193
+23890,ID74 / UTM zone 50S,,,,Indonesia - south of equator and between 114 deg and 120 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16150,1995-07-21 00:00:00,,EPSG,,95.193
+23891,ID74 / UTM zone 51S,,,,Indonesia - south of equator and between 120 deg and 126 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16151,1995-07-21 00:00:00,,EPSG,,95.193
+23892,ID74 / UTM zone 52S,,,,Indonesia - south of equator and between 126 deg and 132 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16152,1995-07-21 00:00:00,,EPSG,,95.193
+23893,ID74 / UTM zone 53S,,,,Indonesia - south of equator and between 132 deg and 138 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16153,1995-07-21 00:00:00,,EPSG,,95.193
+23894,ID74 / UTM zone 54S,,,,Indonesia - south of equator and east of 138 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16154,1995-07-21 00:00:00,,EPSG,,95.193
+23946,Indian 1954 / UTM zone 46N,Indian 1954 / UTM 46N,,,Myanmar (Burma) - west of 96 deg East.,projected 2D,,,East,North,E,N,9001,,4239,16046,1998-06-13 00:00:00,,EPSG,,
+23947,Indian 1954 / UTM zone 47N,Indian 1954 / UTM 47N,,,Myanmar (Burma) - east of 96 deg East; Thailand - west of 102 deg East.,projected 2D,,,East,North,E,N,9001,,4239,16047,1995-06-02 00:00:00,,EPSG,,
+23948,Indian 1954 / UTM zone 48N,Indian 1954 / UTM 48N,,,Thailand - east of 102 deg East.,projected 2D,,,East,North,E,N,9001,,4239,16048,1995-06-02 00:00:00,,EPSG,,
+24047,Indian 1975 / UTM zone 47N,Indian 1975 / UTM 47N,,,Thailand - west of 102 deg East.,projected 2D,,,East,North,E,N,9001,,4240,16047,1995-06-02 00:00:00,,EPSG,,
+24048,Indian 1975 / UTM zone 48N,Indian 1975 / UTM 48N,,,Thailand - east of 102 deg East.,projected 2D,,,East,North,E,N,9001,,4240,16048,1995-06-02 00:00:00,,EPSG,,
+24100,Jamaica 1875 / Jamaica (Old Grid),Jamaica 1875 / Old Grid,,,Jamaica.,projected 2D,,,East,North,E,N,9005,,4241,19909,1995-06-02 00:00:00,,EPSG,Superseded by 24200 (JAD69 / Jamaica National Grid).,
+24200,JAD69 / Jamaica National Grid,JAD69 / Jamaica Grid,,,Jamaica.,projected 2D,,,East,North,E,N,9001,,4242,19910,1995-06-02 00:00:00,,EPSG,Supersedes 24100 (JAD69 / Jamaica National Grid).,
+24305,Kalianpur 1937 / UTM zone 45N,Kalianpur 37 / UTM 45N,,,Bangladesh - west of 90deg East.,projected 2D,,,East,North,E,N,9001,,4144,16045,1999-10-20 00:00:00,,EPSG,,
+24306,Kalianpur 1937 / UTM zone 46N,Kalianpur 37 / UTM 46N,,,Bangladesh - east of 90deg East.,projected 2D,,,East,North,E,N,9001,,4144,16046,1999-10-20 00:00:00,,EPSG,,
+24311,Kalianpur 1962 / UTM zone 41N,Kalianpur 62 / UTM 41N,,,Pakistan - west of 66deg East.,projected 2D,,,East,North,E,N,9001,,4145,16041,1999-10-20 00:00:00,,EPSG,,
+24312,Kalianpur 1962 / UTM zone 42N,Kalianpur 62 / UTM 42N,,,Pakistan - between 66 and 72deg East.,projected 2D,,,East,North,E,N,9001,,4145,16042,1999-10-20 00:00:00,,EPSG,,
+24313,Kalianpur 1962 / UTM zone 43N,Kalianpur 62 / UTM 43N,,,Pakistan - east of 72deg East.,projected 2D,,,East,North,E,N,9001,,4145,16043,1999-10-20 00:00:00,,EPSG,,
+24342,Kalianpur 1975 / UTM zone 42N,Kalianpur 75 / UTM 42N,,,India - west of 72deg East.,projected 2D,,,East,North,E,N,9001,,4146,16042,1999-10-20 00:00:00,,EPSG,,
+24343,Kalianpur 1975 / UTM zone 43N,Kalianpur 75 / UTM 43N,,,India - between 72 and 78deg East.,projected 2D,,,East,North,E,N,9001,,4146,16043,1999-10-20 00:00:00,,EPSG,,
+24344,Kalianpur 1975 / UTM zone 44N,Kalianpur 75 / UTM 44N,,,India - between 78 and 84deg East.,projected 2D,,,East,North,E,N,9001,,4146,16044,1999-10-20 00:00:00,,EPSG,,
+24345,Kalianpur 1975 / UTM zone 45N,Kalianpur 75 / UTM 45N,,,India - between 84 and 90deg East.,projected 2D,,,East,North,E,N,9001,,4146,16045,1999-10-20 00:00:00,,EPSG,,
+24346,Kalianpur 1975 / UTM zone 46N,Kalianpur 75 / UTM 46N,,,India - between 90 and 96deg East.,projected 2D,,,East,North,E,N,9001,,4146,16046,1999-10-20 00:00:00,,EPSG,,
+24347,Kalianpur 1975 / UTM zone 47N,Kalianpur 75 / UTM 47N,,,India - east of 96deg East.,projected 2D,,,East,North,E,N,9001,,4146,16047,1999-10-20 00:00:00,,EPSG,,
+24370,Kalianpur 1880 / India zone 0,Kalianpur / India 0,,,Pakistan north of 35 deg 35 min North.,projected 2D,,,East,North,E,N,9084,,4243,18110,1999-10-20 00:00:00,,EPSG,,97.23
+24371,Kalianpur 1880 / India zone I,Kalianpur / India I,,,India north of 28 deg North; Pakistan 28 deg to 35 deg 35 min North.,projected 2D,,,East,North,E,N,9084,,4243,18111,1999-10-20 00:00:00,,EPSG,,97.23
+24372,Kalianpur 1880 / India zone IIa,Kalianpur / India IIa,,,India - between 21 deg and 28 deg North and west of 82 deg East; Pakistan - south of 28 deg North.,projected 2D,,,East,North,E,N,9084,,4243,18112,1999-10-20 00:00:00,,EPSG,,97.23
+24373,Kalianpur 1880 / India zone III,Kalianpur / India III,,,India - between 15 deg and 21 deg North.,projected 2D,,,East,North,E,N,9084,,4243,18114,1999-10-20 00:00:00,,EPSG,,97.23
+24374,Kalianpur 1880 / India zone IV,Kalianpur / India IV,,,India - south of 15 deg North.,projected 2D,,,East,North,E,N,9084,,4243,18116,1999-10-20 00:00:00,,EPSG,,97.23
+24375,Kalianpur 1937 / India zone IIb,Kalianpur 37 / India IIb,,,Bangladesh.,projected 2D,,,East,North,E,N,9001,,4144,18238,1999-10-20 00:00:00,,EPSG,Used by Bangladesh since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and Benoit's 1895 British inch-metre ratio of 39.370115 rounded as Ind ft = 0.30479841m exactly.,97.23
+24376,Kalianpur 1962 / India zone I,Kalianpur 62 / India I,,,Pakistan - north of 28deg North.,projected 2D,,,East,North,E,N,9001,,4145,18236,1999-10-20 00:00:00,,EPSG,Used by Pakistan since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded by G.Bomford with slight error as Ind ft = 0.3048996m exactly.,97.23
+24377,Kalianpur 1962 / India zone IIa,Kalianpur 62 / India IIa,,,Pakistan - south of 28deg North.,projected 2D,,,East,North,E,N,9001,,4145,18237,1999-10-20 00:00:00,,EPSG,Used by Pakistan since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded by G.Bomford with slight error as Ind ft = 0.3048996m exactly.,97.23
+24378,Kalianpur 1975 / India zone I,Kalianpur 75 / India I,,,India - north of 28deg North and west of 82deg East.,projected 2D,,,East,North,E,N,9001,,4146,18231,1999-10-20 00:00:00,,EPSG,Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,97.23
+24379,Kalianpur 1975 / India zone IIa,Kalianpur 75 / India IIa,,,India - between 28deg and 21deg North and west of 82deg East.,projected 2D,,,East,North,E,N,9001,,4146,18232,1999-10-20 00:00:00,,EPSG,Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,97.23
+24380,Kalianpur 1975 / India zone IIb,Kalianpur 75 / India IIb,,,India - north of 21deg North and east of 82deg East.,projected 2D,,,East,North,E,N,9001,,4146,18235,1999-10-20 00:00:00,,EPSG,Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,97.23
+24381,Kalianpur 1975 / India zone III,Kalianpur 75 / India III,,,India - between 21deg and 15deg North.,projected 2D,,,East,North,E,N,9001,,4146,18233,1999-10-20 00:00:00,,EPSG,Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,97.23
+24382,Kalianpur 1880 / India zone IIb,Kalianpur / India IIb,,,Bangladesh; India - north of 22 deg North and east of 82 deg East; Myanmar (Burma) - north of 22 deg North.,projected 2D,,,East,North,E,N,9084,,4243,18113,1999-10-20 00:00:00,,EPSG,,97.23
+24383,Kalianpur 1975 / India zone IV,Kalianpur 75 / India IV,,,India - south of 21deg North.,projected 2D,,,East,North,E,N,9001,,4146,18234,1999-10-20 00:00:00,,EPSG,Used by India since metrication. Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,97.23
+24500,Kertau / Singapore Grid,,,,Singapore.,projected 2D,,,East,North,E,N,9001,,4245,19920,1995-06-02 00:00:00,,EPSG,,
+24547,Kertau / UTM zone 47N,,,,Malaysia - West Malaysia west of 102 deg East.,projected 2D,,,East,North,E,N,9001,,4245,16047,1995-06-02 00:00:00,,EPSG,,
+24548,Kertau / UTM zone 48N,,,,Malaysia - West Malaysia east of 102 deg East.,projected 2D,,,East,North,E,N,9001,,4245,16048,1995-07-21 00:00:00,,EPSG,,95.192
+24571,Kertau / R.S.O. Malaya (ch),,,,Malaysia - West Malaysia,projected 2D,,,East,North,E,N,9062,,4245,19935,1999-10-20 00:00:00,,EPSG,Adopts metric conversion of 39.370113 inches per metre.,97.231
+24600,KOC Lambert,,,,Kuwait.,projected 2D,,,East,North,E,N,9001,,4246,19906,1996-04-12 00:00:00,,EPSG,,
+24718,La Canoa / UTM zone 18N,,,,Venezuela - west of 72 deg West.,projected 2D,,,East,North,E,N,9001,,4247,16018,1999-10-20 00:00:00,,EPSG,Sometimes referred to as PSAD56 / UTM zone 18N.,
+24719,La Canoa / UTM zone 19N,,,,Venezuela - between 72 and 66 deg West.,projected 2D,,,East,North,E,N,9001,,4247,16019,1999-10-20 00:00:00,,EPSG,Sometimes referred to as PSAD56 / UTM zone 19N.,
+24720,La Canoa / UTM zone 20N,,,,Venezuela - east of 66 deg West.,projected 2D,,,East,North,E,N,9001,,4247,16020,1995-06-02 00:00:00,,EPSG,Sometimes referred to as PSAD56 / UTM zone 20N.,
+24818,PSAD56 / UTM zone 18N,,,,South America (Ecuador; [Venezuela]) 78deg West to 72deg West.,projected 2D,,,East,North,E,N,9001,,4248,16018,1995-06-02 00:00:00,,EPSG,In Venezuela also known as La Canoa / UTM zone 18N.,
+24819,PSAD56 / UTM zone 19N,,,,South America (Netherlands Antilles; [Venezuela]) 72deg West to 66deg West.,projected 2D,,,East,North,E,N,9001,,4248,16019,1995-06-02 00:00:00,,EPSG,In Venezuela also known as La Canoa / UTM zone 19N.,
+24820,PSAD56 / UTM zone 20N,,,,South America (Guyana; [Venezuela]) 66deg West to 60deg West.,projected 2D,,,East,North,E,N,9001,,4248,16020,1995-06-02 00:00:00,,EPSG,In Venezuela also known as La Canoa / UTM zone 20N.,
+24821,PSAD56 / UTM zone 21N,,,,South America (Guyana; Suriname) 60deg West to 54deg West.,projected 2D,,,East,North,E,N,9001,,4248,16021,1995-06-02 00:00:00,,EPSG,,
+24877,PSAD56 / UTM zone 17S,,,,South America (Chile; Ecuador; Peru) 84deg West to 78deg West.,projected 2D,,,East,North,E,N,9001,,4248,16117,1995-06-02 00:00:00,,EPSG,,
+24878,PSAD56 / UTM zone 18S,,,,South America (Chile; Ecuador; Peru) 78deg West to 72deg West.,projected 2D,,,East,North,E,N,9001,,4248,16118,1995-06-02 00:00:00,,EPSG,,
+24879,PSAD56 / UTM zone 19S,,,,South America (Bolivia; Chile; Peru) 72deg West to 66deg West.,projected 2D,,,East,North,E,N,9001,,4248,16119,1995-06-02 00:00:00,,EPSG,,
+24880,PSAD56 / UTM zone 20S,,,,South America (Bolivia) 66deg West to 60deg West.,projected 2D,,,East,North,E,N,9001,,4248,16120,1995-06-02 00:00:00,,EPSG,,
+24882,PSAD56 / UTM zone 22S,,,,Brazil - offshore Amazon Cone,projected 2D,,,East,North,E,N,9001,,4248,16122,1999-04-22 00:00:00,,EPSG,,
+24891,PSAD56 / Peru west zone,,,,Peru west of 79 deg West.,projected 2D,,,East,North,X,Y,9001,,4248,18161,1995-06-02 00:00:00,,EPSG,,
+24892,PSAD56 / Peru central zone,PSAD56 / Peru central,,,Peru 79 to 73 deg West.,projected 2D,,,East,North,X,Y,9001,,4248,18162,1995-06-02 00:00:00,,EPSG,,
+24893,PSAD56 / Peru east zone,,,,Peru east of 73 deg West.,projected 2D,,,East,North,X,Y,9001,,4248,18163,1995-06-02 00:00:00,,EPSG,,
+25000,Leigon / Ghana Metre Grid,Leigon / Ghana Grid,,,Ghana.,projected 2D,,,East,North,E,N,9001,,4250,19904,1995-06-02 00:00:00,,EPSG,,
+25231,Lome / UTM zone 31N,,,,Togo.,projected 2D,,,East,North,E,N,9001,,4252,16031,1995-06-02 00:00:00,,EPSG,,
+25391,Luzon 1911 / Philippines zone I,Luzon / Philippines I,,,Philippines - west of 118 deg East.,projected 2D,,,East,North,X,Y,9001,,4253,18171,1995-06-02 00:00:00,,EPSG,,
+25392,Luzon 1911 / Philippines zone II,Luzon / Philippines II,,,Philippines - Palawan; Calamian Islands.,projected 2D,,,East,North,X,Y,9001,,4253,18172,1995-06-02 00:00:00,,EPSG,,
+25393,Luzon 1911 / Philippines zone III,Luzon / Philippines III,,,Philippines - Luzon (except SE part;); Mindoro.,projected 2D,,,East,North,X,Y,9001,,4253,18173,1995-06-02 00:00:00,,EPSG,,
+25394,Luzon 1911 / Philippines zone IV,Luzon / Philippines IV,,,Philippines - SE Luzon; Tablas; Masbate; Panay; Cebu; Negros; west Mindanao.,projected 2D,,,East,North,X,Y,9001,,4253,18174,1995-06-02 00:00:00,,EPSG,,
+25395,Luzon 1911 / Philippines zone V,Luzon / Philippines V,,,Philippines - east Mindanao; Bohol; Samar.,projected 2D,,,East,North,X,Y,9001,,4253,18175,1995-06-02 00:00:00,,EPSG,,
+25700,Makassar (Jakarta) / NEIEZ,Makassar / NEIEZ,,,Indonesia - south west Sulawesi.,projected 2D,,,East,North,X,Y,9001,,4804,19905,1995-06-02 00:00:00,,EPSG,,
+25828,ETRF89 / UTM zone 28N,,,,Europe - 18deg West to 12deg West - United Kingdom (UKCS) offshore.,projected 2D,,,East,North,E,N,9001,,4258,16028,1999-04-22 00:00:00,,EPSG,,99.11
+25829,ETRF89 / UTM zone 29N,,,,Europe - 12deg West to 6deg West - United Kingdom (UKCS) offshore.,projected 2D,,,East,North,E,N,9001,,4258,16029,1999-04-22 00:00:00,,EPSG,,99.11
+25830,ETRF89 / UTM zone 30N,,,,Europe - 6deg West to 0deg.,projected 2D,,,East,North,E,N,9001,,4258,16030,1999-04-22 00:00:00,,EPSG,,99.11
+25831,ETRF89 / UTM zone 31N,,,,Europe - 0deg to 6deg East - Norway.,projected 2D,,,East,North,E,N,9001,,4258,16031,1999-04-22 00:00:00,,EPSG,,99.11
+25832,ETRF89 / UTM zone 32N,,,,Europe - 6deg East to 12deg East - Norway.,projected 2D,,,East,North,E,N,9001,,4258,16032,1999-04-22 00:00:00,,EPSG,,99.11
+25833,ETRF89 / UTM zone 33N,,,,Europe - 12deg East to 18deg East - Norway.,projected 2D,,,East,North,E,N,9001,,4258,16033,1999-04-22 00:00:00,,EPSG,,99.11
+25834,ETRF89 / UTM zone 34N,,,,Europe - 18deg East to 24deg East - Norway.,projected 2D,,,East,North,E,N,9001,,4258,16034,1999-04-22 00:00:00,,EPSG,,99.11
+25835,ETRF89 / UTM zone 35N,,,,Europe - 24deg East to 30deg East - Norway.,projected 2D,,,East,North,E,N,9001,,4258,16035,1999-04-22 00:00:00,,EPSG,,99.11
+25836,ETRF89 / UTM zone 36N,,,,Europe - 30deg East to 36deg East.,projected 2D,,,East,North,E,N,9001,,4258,16036,1999-04-22 00:00:00,,EPSG,,99.11
+25837,ETRF89 / UTM zone 37N,,,,Europe - 36deg East to 42deg East.,projected 2D,,,East,North,E,N,9001,,4258,16037,1999-04-22 00:00:00,,EPSG,,99.11
+25838,ETRF89 / UTM zone 38N,,,,Europe - 42deg East to 48deg East.,projected 2D,,,East,North,E,N,9001,,4258,16038,1999-04-22 00:00:00,,EPSG,,99.11
+25884,ETRF89 / TM Baltic93,,,,Estonia; Latvia; Lithuania.,projected 2D,,,North,East,X,Y,9001,,4258,19939,1999-04-22 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,Used as a common coordinate system for the Baltic states and for medium and small scale mapping in Estonia since 1993.,99.11
+25932,Malongo 1987 / UTM zone 32S,Malongo 1987 / UTM 32S,,,Angola - Cabinda.,projected 2D,,,East,North,E,N,9001,,4259,16132,1995-06-02 00:00:00,,EPSG,,
+26191,Merchich / Nord Maroc,,,,Morocco north of 35 grads (31 deg 30 min) North.,projected 2D,,,East,North,X,Y,9001,,4261,18131,1995-06-02 00:00:00,,EPSG,,
+26192,Merchich / Sud Maroc,,,,Morocco 31grads to 35grads (27 deg 54 min to 31 deg 30 min) North.,projected 2D,,,East,North,X,Y,9001,,4261,18132,1995-06-02 00:00:00,,EPSG,,
+26193,Merchich / Sahara,,,,Morocco south of 31grads (27 deg 54 min) North.,projected 2D,,,East,North,X,Y,9001,,4261,18133,1995-06-02 00:00:00,,EPSG,,
+26237,Massawa / UTM zone 37N,,,,Eritrea.,projected 2D,,,East,North,E,N,9001,,4262,16037,1995-06-02 00:00:00,,EPSG,,
+26331,Minna / UTM zone 31N,,,,Nigeria - offshore beyond continental shelf west of 6 deg East.,projected 2D,,,East,North,E,N,9001,,4263,16031,1995-06-02 00:00:00,,EPSG,,
+26332,Minna / UTM zone 32N,,,,Nigeria - offshore beyond continental shelf.,projected 2D,,,East,North,E,N,9001,,4263,16032,1995-06-02 00:00:00,,EPSG,,
+26391,Minna / Nigeria West Belt,Minna / Nigeria West,,,Nigeria west of 6 deg 30 min East.,projected 2D,,,East,North,E,N,9001,,4263,18151,1995-06-02 00:00:00,,EPSG,,
+26392,Minna / Nigeria Mid Belt,,,,Nigeria between 6 deg 30 min and 10 deg 30 min East.,projected 2D,,,East,North,E,N,9001,,4263,18152,1995-06-02 00:00:00,,EPSG,,
+26393,Minna / Nigeria East Belt,Minna / Nigeria East,,,Nigeria east of 10 deg 30 min East.,projected 2D,,,East,North,E,N,9001,,4263,18153,1995-06-02 00:00:00,,EPSG,,
+26432,Mhast / UTM zone 32S,,,,Angola - Cabinda.,projected 2D,,,East,North,E,N,9001,,4264,16132,1995-06-02 00:00:00,,EPSG,,
+26591,Monte Mario (Rome) / Italy zone 1,Monte Mario / Italy 1,,,Italy west of 12 deg East.,projected 2D,,,East,North,X,Y,9001,,4806,18121,1995-06-02 00:00:00,,EPSG,,
+26592,Monte Mario (Rome) / Italy zone 2,Monte Mario / Italy 2,,,Italy east of 12 deg East.,projected 2D,,,East,North,X,Y,9001,,4806,18122,1995-06-02 00:00:00,,EPSG,,
+26632,M'poraloko / UTM zone 32N,M'poraloko / UTM 32N,,,Gabon - north of equator.,projected 2D,,,East,North,E,N,9001,,4266,16032,1995-06-02 00:00:00,,EPSG,,
+26692,M'poraloko / UTM zone 32S,M'poraloko / UTM 32S,,,Gabon - south of equator.,projected 2D,,,East,North,E,N,9001,,4266,16132,1995-06-02 00:00:00,,EPSG,,
+26703,NAD27 / UTM zone 3N,,,,North America - United States (USA) - Alaska - 168deg West to 162deg West.,projected 2D,,,East,North,E,N,9001,,4267,16003,1995-06-02 00:00:00,,EPSG,,
+26704,NAD27 / UTM zone 4N,,,,North America - United States (USA) - Alaska - 162deg West to 156deg West.,projected 2D,,,East,North,E,N,9001,,4267,16004,1995-06-02 00:00:00,,EPSG,,
+26705,NAD27 / UTM zone 5N,,,,North America - United States (USA) - Alaska - 156deg West to 150deg West.,projected 2D,,,East,North,E,N,9001,,4267,16005,1995-06-02 00:00:00,,EPSG,,
+26706,NAD27 / UTM zone 6N,,,,North America - United States (USA) - Alaska - 150deg West to 144deg West.,projected 2D,,,East,North,E,N,9001,,4267,16006,1995-06-02 00:00:00,,EPSG,,
+26707,NAD27 / UTM zone 7N,,,,North America - Canada; United States (USA) - Alaska - 144deg West to 138deg West.,projected 2D,,,East,North,E,N,9001,,4267,16007,1995-06-02 00:00:00,,EPSG,,
+26708,NAD27 / UTM zone 8N,,,,North America - Canada; United States (USA) - 138deg West to 132deg West.,projected 2D,,,East,North,E,N,9001,,4267,16008,1995-06-02 00:00:00,,EPSG,,
+26709,NAD27 / UTM zone 9N,,,,North America - Canada; United States (USA) - 132deg West to 126deg West.,projected 2D,,,East,North,E,N,9001,,4267,16009,1995-06-02 00:00:00,,EPSG,,
+26710,NAD27 / UTM zone 10N,,,,North America - Canada; United States (USA) - 130deg West to 120deg West.,projected 2D,,,East,North,E,N,9001,,4267,16010,1995-06-02 00:00:00,,EPSG,,
+26711,NAD27 / UTM zone 11N,,,,North America - Canada; Mexico; United States (USA) - 120deg West to 114deg West.,projected 2D,,,East,North,E,N,9001,,4267,16011,1995-06-02 00:00:00,,EPSG,,
+26712,NAD27 / UTM zone 12N,,,,North America - Canada; Mexico; United States (USA) - 114deg West to 108deg West.,projected 2D,,,East,North,E,N,9001,,4267,16012,1995-06-02 00:00:00,,EPSG,,
+26713,NAD27 / UTM zone 13N,,,,North America - Canada; Mexico; United States (USA) - 108deg West to 102deg West.,projected 2D,,,East,North,E,N,9001,,4267,16013,1995-06-02 00:00:00,,EPSG,,
+26714,NAD27 / UTM zone 14N,,,,North America - Canada; Mexico; United States (USA) - 102deg West to 96deg West.,projected 2D,,,East,North,E,N,9001,,4267,16014,1995-06-02 00:00:00,,EPSG,,
+26715,NAD27 / UTM zone 15N,,,,North America - Canada; Mexico; United States (USA) - 96deg West to 90deg West.,projected 2D,,,East,North,E,N,9001,,4267,16015,1995-06-02 00:00:00,,EPSG,In Ontario superseded by NAD27(76) / UTM zone 15N (code 227).,
+26716,NAD27 / UTM zone 16N,,,,North America - Canada; Mexico; United States (USA) - 90deg West to 84deg West.,projected 2D,,,East,North,E,N,9001,,4267,16016,1995-06-02 00:00:00,,EPSG,In Ontario superseded by NAD27(76) / UTM zone 16N (code 228).,
+26717,NAD27 / UTM zone 17N,,,,North America - Canada; Mexico; United States (USA) - 84deg West to 78deg West.,projected 2D,,,East,North,E,N,9001,,4267,16017,1995-06-02 00:00:00,,EPSG,In Ontario superseded by NAD27(76) / UTM zone 17N (code 229). In Quebec superseded by NAD27(CGQ77) / UTM zone 17N (code 231).,
+26718,NAD27 / UTM zone 18N,,,,North America - Canada; United States (USA) - 78deg West to 72deg West.,projected 2D,,,East,North,E,N,9001,,4267,16018,1995-06-02 00:00:00,,EPSG,In Ontario superseded by NAD27(76) / UTM zone 18N (code 230). In Quebec superseded by NAD27(CGQ77) / UTM zone 18N (code 232).,
+26719,NAD27 / UTM zone 19N,,,,North America - Canada; United States (USA) - 72deg West to 66deg West.,projected 2D,,,East,North,E,N,9001,,4267,16019,1995-06-02 00:00:00,,EPSG,In Quebec superseded by NAD27(CGQ77) / UTM zone 19N (code 233).,
+26720,NAD27 / UTM zone 20N,,,,North America - Antigua and Barbuda - Barbuda. British Virgin Islands (military). Canada; United States (USA) offshore Atlantic - 66deg West to 60deg West.,projected 2D,,,East,North,E,N,9001,,4267,16020,1995-06-02 00:00:00,,EPSG,In Quebec superseded by NAD27(CGQ77) / UTM zone 20N (code 234).,
+26721,NAD27 / UTM zone 21N,,,,North America - Canada - 60deg West to 54deg West.,projected 2D,,,East,North,E,N,9001,,4267,16021,1995-06-02 00:00:00,,EPSG,In Quebec superseded by NAD27(CGQ77) / UTM zone 21N (code 235).,
+26722,NAD27 / UTM zone 22N,,,,North America - Canada - 54deg West to 48deg West.,projected 2D,,,East,North,E,N,9001,,4267,16022,1995-06-02 00:00:00,,EPSG,,
+26729,NAD27 / Alabama East,,,,United States (USA) - Alabama - AL_E - counties east of approx 86d 37m West - Barbour; Bullock; Calhoun; Chambers; Cherokee; Clay; Cleburne; Coffee; Coosa; Covington; Crenshaw; Dale; De Kalb; Elmore; Etowah; Geneva; Henry; Houston; Jackson; Lee; Macon; Madison; Marshall; Montgomery; Pike; Randolph; Russell; St.Clair; Talladega; Tallapoosa,projected 2D,,,East,North,X,Y,9003,,4267,10101,1995-06-02 00:00:00,,EPSG,,
+26730,NAD27 / Alabama West,,,,United States (USA) - Alabama - AL_W - counties west of approx 86d 37m West - Autauga; Baldwin; Bibb; Blount; Butler; Chilton; Choctaw; Clarke; Colbert; Conecuh; Cullman; Dallas; Escambia; Fayette; Franklin; Greene; Hale; Jefferson; Lamar; Lauderdale; Lawrence; Limestone; Lowndes; Marengo; Marion; Mobile; Monroe; Morgan; Perry; Pickens; Shelby; Sumter; Tuscaloosa; Walker; Washington; Wilcox; Winston,projected 2D,,,East,North,X,Y,9003,,4267,10102,1995-06-02 0 [...]
+26731,NAD27 / Alaska zone 1,,,,United States - Alaska - Panhandle.,projected 2D,,,East,North,X,Y,9003,,4267,15001,1995-06-02 00:00:00,,EPSG,,
+26732,NAD27 / Alaska zone 2,,,,United States - Alaska - 141deg to 144deg West.,projected 2D,,,East,North,X,Y,9003,,4267,15002,1995-06-02 00:00:00,,EPSG,,
+26733,NAD27 / Alaska zone 3,,,,United States - Alaska - 144deg to 148deg West.,projected 2D,,,East,North,X,Y,9003,,4267,15003,1995-06-02 00:00:00,,EPSG,,
+26734,NAD27 / Alaska zone 4,,,,United States - Alaska - 148deg to 152deg West.,projected 2D,,,East,North,X,Y,9003,,4267,15004,1995-06-02 00:00:00,,EPSG,,
+26735,NAD27 / Alaska zone 5,,,,United States - Alaska - 152deg to 156deg West.,projected 2D,,,East,North,X,Y,9003,,4267,15005,1995-06-02 00:00:00,,EPSG,,
+26736,NAD27 / Alaska zone 6,,,,United States - Alaska - 156deg to 160deg West.,projected 2D,,,East,North,X,Y,9003,,4267,15006,1995-06-02 00:00:00,,EPSG,,
+26737,NAD27 / Alaska zone 7,,,,United States - Alaska - 160deg to 164deg West.,projected 2D,,,East,North,X,Y,9003,,4267,15007,1995-06-02 00:00:00,,EPSG,,
+26738,NAD27 / Alaska zone 8,,,,United States - Alaska - 164deg to 168deg West; north of 54d 30m North.,projected 2D,,,East,North,X,Y,9003,,4267,15008,1995-06-02 00:00:00,,EPSG,,
+26739,NAD27 / Alaska zone 9,,,,United States - Alaska - West of 168deg West and north of 54d 30m North.,projected 2D,,,East,North,X,Y,9003,,4267,15009,1995-06-02 00:00:00,,EPSG,,
+26740,NAD27 / Alaska zone 10,,,,United States - Alaska - Aleutian Islands.,projected 2D,,,East,North,X,Y,9003,,4267,15010,1995-06-02 00:00:00,,EPSG,,
+26741,NAD27 / California zone I,NAD27 / California I,,,United States (USA) - California - CA_1 - counties north of approx 40 deg North - Del Norte; Humboldt; Lassen; Modoc; Plumas; Shasta; Siskiyou; Tehama; Trinity,projected 2D,,,East,North,X,Y,9003,,4267,10401,1995-06-02 00:00:00,,EPSG,,
+26742,NAD27 / California zone II,NAD27 / California II,,,United States (USA) - California - CA_2 - counties between approx 40 deg & 38d 15m North - Alpine; Amador; Butte; Colusa; El Dorado; Glenn; Lake; Mendocino; Napa; Nevada; Placer; Sacramento; Sierra; Solano; Sonoma; Sutter; Yolo; Yuba,projected 2D,,,East,North,X,Y,9003,,4267,10402,1995-06-02 00:00:00,,EPSG,,
+26743,NAD27 / California zone III,NAD27 / California III,,,United States (USA) - California - CA_3 - counties between approx 38d 15m & 37d North - Alameda; Calaveras; Contra Costa; Madera; Marin; Mariposa; Merced; Mono; San Francisco; San Joaquin; San Mateo; Santa Clara; Santa Cruz; Stanislaus; Tuolumne,projected 2D,,,East,North,X,Y,9003,,4267,10403,1995-06-02 00:00:00,,EPSG,,
+26744,NAD27 / California zone IV,NAD27 / California IV,,,United States (USA) - California - CA_4 - counties between approx 37d & 35d 30m North - Fresno; Inyo; Kings; Monterey; San Benito; Tulare,projected 2D,,,East,North,X,Y,9003,,4267,10404,1995-06-02 00:00:00,,EPSG,,
+26745,NAD27 / California zone V,NAD27 / California V,,,United States (USA) - California - CA_5 - counties between approx 35d 50m & 34d North - Kern; San Bernardino; San Luis Obispo; Santa Barbara; Ventura,projected 2D,,,East,North,X,Y,9003,,4267,10405,1995-06-02 00:00:00,,EPSG,,
+26746,NAD27 / California zone VI,NAD27 / California VI,,,United States (USA) - California - CA_6 - counties south of approx 38d 30m North - Imperial; Orange; Riverside; San Diego,projected 2D,,,East,North,X,Y,9003,,4267,10406,1995-06-02 00:00:00,,EPSG,,
+26747,NAD27 / California zone VII,NAD27 / California VII,,,United States - California - Los Angeles.,projected 2D,,,East,North,X,Y,9003,,4267,10407,1995-06-02 00:00:00,,EPSG,,
+26748,NAD27 / Arizona East,,,,United States (USA) - Arizona - AZ_E - counties east of approx 110d 45m West - Apache; Cochise; Gila; Graham; Greenlee; Navajo,projected 2D,,,East,North,X,Y,9003,,4267,10201,1995-08-22 00:00:00,,EPSG,,95.25
+26749,NAD27 / Arizona Central,,,,United States (USA) - Arizona - AZ_C - counties between approx 110d 45m and 113d 20m West - Coconino; Maricopa; Pima; Pinal; Santa Cruz; Yavapai,projected 2D,,,East,North,X,Y,9003,,4267,10202,1995-08-22 00:00:00,,EPSG,,95.25
+26750,NAD27 / Arizona West,,,,United States (USA) - Arizona - AZ_W - counties west of approx 113d 20m West - La Paz; Mohave; Yuma,projected 2D,,,East,North,X,Y,9003,,4267,10203,1995-08-22 00:00:00,,EPSG,,95.25
+26751,NAD27 / Arkansas North,,,,United States (USA) - Arkansas - AR_N - counties north of approx 34d 50m North - Baxter; Benton; Boone; Carroll; Clay; Cleburne; Conway; Craighead; Crawford; Crittenden; Cross; Faulkner; Franklin; Fulton; Greene; Independence; Izard; Jackson; Johnson; Lawrence; Logan; Madison; Marion; Mississippi; Newton; Perry; Poinsett; Pope; Randolph; Scott; Searcy; Sebastian; Sharp; St. Francis; Stone; Van Buren; Washington; White; Woodruff; Yell,projected 2D,,,East,No [...]
+26752,NAD27 / Arkansas South,,,,United States (USA) - Arkansas - AR_S - counties south of approx 34d 50m North - Arkansas; Ashley; Bradley; Calhoun; Chicot; Clark; Cleveland; Columbia; Dallas; Desha; Drew; Garland; Grant; Hempstead; Hot Spring; Howard; Jefferson; Lafayette; Lee; Lincoln; Little River; Lonoke; Miller; Monroe; Montgomery; Nevada; Ouachita; Phillips; Pike; Polk; Prairie; Pulaski; Saline; Sevier; Union,projected 2D,,,East,North,X,Y,9003,,4267,10302,1995-06-02 00:00:00,,EPSG,,
+26753,NAD27 / Colorado North,,,,United States (USA) - Colorado - CO_N - counties north of approx 39d 50m North - Adams; Boulder; Gilpin; Grand; Jackson; Larimer; Logan; Moffat; Morgan; Phillips; Rio Blanco; Routt; Sedgwick; Washington; Weld; Yuma,projected 2D,,,East,North,X,Y,9003,,4267,10501,1995-06-02 00:00:00,,EPSG,,
+26754,NAD27 / Colorado Central,,,,United States (USA) - Colorado - CO_C - counties between approx 39d 50m & 38d 30m North - Arapahoe; Chaffee; Cheyenne; Clear Creek; Delta; Denver; Douglas; Eagle; El Paso; Elbert; Fremont; Garfield; Gunnison; Jefferson; Kit Carson; Lake; Lincoln; Mesa; Park; Pitkin; Summit; Teller,projected 2D,,,East,North,X,Y,9003,,4267,10502,1995-06-02 00:00:00,,EPSG,,
+26755,NAD27 / Colorado South,,,,United States (USA) - Colorado - CO_S - counties south of approx 38d 30m North - Alamosa; Archuleta; Baca; Bent; Conejos; Costilla; Crowley; Custer; Dolores; Hinsdale; Huerfano; Kiowa; La Plata; Las Animas; Mineral; Montezuma; Montrose; Otero; Ouray; Prowers; Pueblo; Rio Grande; Saguache; San Juan; San Miguel,projected 2D,,,East,North,X,Y,9003,,4267,10503,1995-06-02 00:00:00,,EPSG,,
+26756,NAD27 / Connecticut,,,,United States (USA) - Connecticut - CT - counties of Fairfield; Hartford; Litchfield; Middlesex; New Haven; New London; Tolland; Windham,projected 2D,,,East,North,X,Y,9003,,4267,10600,1995-06-02 00:00:00,,EPSG,,
+26757,NAD27 / Delaware,,,,United States (USA) - Delaware - DE - counties of Kent; New Castle; Sussex,projected 2D,,,East,North,X,Y,9003,,4267,10700,1995-06-02 00:00:00,,EPSG,,
+26758,NAD27 / Florida East,,,,United States (USA) - Florida - FL_E - counties of Brevard; Broward; Clay; Collier; Dade; Duval; Flagler; Glades; Hendry; Highlands; Indian River; Lake; Martin; Monroe; Nassau; Okeechobee; Orange; Osceola; Palm Beach; Putnam; Seminole; St. Johns; St. Lucie; Volusia,projected 2D,,,East,North,X,Y,9003,,4267,10901,1995-06-02 00:00:00,,EPSG,,
+26759,NAD27 / Florida West,,,,United States (USA) - Florida - FL_W - counties of Charlotte; Citrus; De Soto; Hardee; Hernando; Hillsborough; Lee; Levy; Manatee; Marion; Pasco; Pinellas; Polk; Sarasota; Sumter,projected 2D,,,East,North,X,Y,9003,,4267,10902,1995-06-02 00:00:00,,EPSG,,
+26760,NAD27 / Florida North,,,,United States (USA) - Florida - FL_N - counties of Alachua; Baker; Bay; Bradford; Calhoun; Columbia; Dixie; Escambia; Escambia; Franklin; Gadsden; Gilchrist; Gulf; Hamilton; Holmes; Jackson; Jefferson; Lafayette; Leon; Liberty; Madison; Okaloosa; Santa Rosa; Suwannee; Taylor; Union; Wakulla; Walton; Washington,projected 2D,,,East,North,X,Y,9003,,4267,10903,1995-06-02 00:00:00,,EPSG,,
+26766,NAD27 / Georgia East,,,,United States (USA) - Georgia - GA_E - counties of Appling; Atkinson; Bacon; Baldwin; Brantley; Bryan; Bulloch; Burke; Camden; Candler; Charlton; Chatham; Clinch; Coffee; Columbia; Dodge; Echols; Effingham; Elbert; Emanuel; Evans; Franklin; Glascock; Glynn; Greene; Hancock; Hart; Jeff Davis; Jefferson; Jenkins; Johnson; Lanier; Laurens; Liberty; Lincoln; Long; Madison; McDuffie; McIntosh; Montgomery; Oglethorpe; Pierce; Richmond; Screven; Stephens; Taliaferr [...]
+26767,NAD27 / Georgia West,,,,United States (USA) - Georgia - GA_W - counties of Baker; Banks; Barrow; Bartow; Ben Hill; Berrien; Bibb; Bleckley; Brooks; Butts; Calhoun; Carroll; Catoosa; Chattahoochee; Chattooga; Cherokee; Clarke; Clay; Clayton; Cobb; Colquitt; Cook; Coweta; Crawford; Crisp; Dade; Dawson; De Kalb; Decatur; Dooly; Dougherty; Douglas; Early; Fannin; Fayette; Floyd; Forsyth; Fulton; Gilmer; Gordon; Grady; Gwinnett; Habersham; Hall; Haralson; Harris; Heard; Henry; Houston; [...]
+26768,NAD27 / Idaho East,,,,United States (USA) - Idaho - ID_E - counties of Bannock; Bear Lake; Bingham; Bonneville; Caribou; Clark; Franklin; Fremont; Jefferson; Madison; Oneida; Power; Teton,projected 2D,,,East,North,X,Y,9003,,4267,11101,1995-06-02 00:00:00,,EPSG,,
+26769,NAD27 / Idaho Central,,,,United States (USA) - daho - ID_C - counties of Blaine; Butte; Camas; Cassia; Custer; Gooding; Jerome; Lemhi; Lincoln; Minidoka; Twin Falls,projected 2D,,,East,North,X,Y,9003,,4267,11102,1995-06-02 00:00:00,,EPSG,,
+26770,NAD27 / Idaho West,,,,United States (USA) - Idaho - ID_W - counties of Ada; Adams; Benewah; Boise; Bonner; Boundary; Canyon; Clearwater; Elmore; Gem; Idaho; Kootenai; Latah; Lewis; Nez Perce; Owyhee; Payette; Shoshone; Valley; Washington,projected 2D,,,East,North,X,Y,9003,,4267,11103,1995-06-02 00:00:00,,EPSG,,
+26771,NAD27 / Illinois East,,,,United States (USA) - Illinois - IL_E - counties of Boone; Champaign; Clark; Clay; Coles; Cook; Crawford; Cumberland; De Kalb; De Witt; Douglas; Du Page; Edgar; Edwards; Effingham; Fayette; Ford; Franklin; Gallatin; Grundy; Hamilton; Hardin; Iroquois; Jasper; Jefferson; Johnson; Kane; Kankakee; Kendall; La Salle; Lake; Lawrence; Livingston; Macon; Marion; Massac; McHenry; McLean; Moultrie; Piatt; Pope; Richland; Saline; Shelby; Vermilion; Wabash; Wayne; Whi [...]
+26772,NAD27 / Illinois West,,,,United States (USA) - Illinois - IL_W - counties of Adams; Alexander; Bond; Brown; Bureau; Calhoun; Carroll; Cass; Christian; Clinton; Fulton; Greene; Hancock; Henderson; Henry; Jackson; Jersey; Jo Daviess; Knox; Lee; Logan; Macoupin; Madison; Marshall; Mason; McDonough; Menard; Mercer; Monroe; Montgomery; Morgan; Ogle; Peoria; Perry; Pike; Pulaski; Putnam; Randolph; Rock Island; Sangamon; Schuyler; Scott; St. Clair; Stark; Stephenson; Tazewell; Union; Warr [...]
+26773,NAD27 / Indiana East,,,,United States (USA) - Indiana - IN_E - counties of Adams; Allen; Bartholomew; Blackford; Brown; Cass; Clark; De Kalb; Dearborn; Decatur; Delaware; Elkhart; Fayette; Floyd; Franklin; Fulton; Grant; Hamilton; Hancock; Harrison; Henry; Howard; Huntington; Jackson; Jay; Jefferson; Jennings; Johnson; Kosciusko; Lagrange; Madison; Marion; Marshall; Miami; Noble; Ohio; Randolph; Ripley; Rush; Scott; Shelby; St. Joseph; Steuben; Switzerland; Tipton; Union; Wabash; W [...]
+26774,NAD27 / Indiana West,,,,United States (USA) - Indiana - IN_W - counties of Benton; Boone; Carroll; Clay; Clinton; Crawford; Daviess; Dubois; Fountain; Gibson; Greene; Hendricks; Jasper; Knox; La Porte; Lake; Lawrence; Martin; Monroe; Montgomery; Morgan; Newton; Orange; Owen; Parke; Perry; Pike; Porter; Posey; Pulaski; Putnam; Spencer; Starke; Sullivan; Tippecanoe; Vanderburgh; Vermillion; Vigo; Warren; Warrick; White,projected 2D,,,East,North,X,Y,9003,,4267,11302,1995-06-02 00:00:0 [...]
+26775,NAD27 / Iowa North,,,,United States (USA) - Iowa - IA_N - counties of Allamakee; Benton; Black Hawk; Boone; Bremer; Buchanan; Buena Vista; Butler; Calhoun; Carroll; Cerro Gordo; Cherokee; Chickasaw; Clay; Clayton; Crawford; Delaware; Dickinson; Dubuque; Emmet; Fayette; Floyd; Franklin; Greene; Grundy; Hamilton; Hancock; Hardin; Howard; Humboldt; Ida; Jackson; Jones; Kossuth; Linn; Lyon; Marshall; Mitchell; Monona; O'Brien; Osceola; Palo Alto; Plymouth; Pocahontas; Sac; Sioux; Story [...]
+26776,NAD27 / Iowa South,,,,United States (USA) - Iowa - IA_S - counties of Adair; Adams; Appanoose; Audubon; Cass; Cedar; Clarke; Clinton; Dallas; Davis; Decatur; Des Moines; Fremont; Guthrie; Harrison; Henry; Iowa; Jasper; Jefferson; Johnson; Keokuk; Lee; Louisa; Lucas; Madison; Mahaska; Marion; Mills; Monroe; Montgomery; Muscatine; Page; Polk; Pottawattamie; Poweshiek; Ringgold; Scott; Shelby; Taylor; Union; Van Buren; Wapello; Warren; Washington; Wayne,projected 2D,,,East,North,X,Y,9 [...]
+26777,NAD27 / Kansas North,,,,United States (USA) - Kansas - KS_N - counties of Atchison; Brown; Cheyenne; Clay; Cloud; Decatur; Dickinson; Doniphan; Douglas; Ellis; Ellsworth; Geary; Gove; Graham; Jackson; Jefferson; Jewell; Johnson; Leavenworth; Lincoln; Logan; Marshall; Mitchell; Morris; Nemaha; Norton; Osborne; Ottawa; Phillips; Pottawatomie; Rawlins; Republic; Riley; Rooks; Russell; Saline; Shawnee; Sheridan; Sherman; Smith; Thomas; Trego; Wabaunsee; Wallace; Washington; Wyandotte,p [...]
+26778,NAD27 / Kansas South,,,,United States (USA) - Kansas - KS_S - counties of Allen; Anderson; Barber; Barton; Bourbon; Butler; Chase; Chautauqua; Cherokee; Clark; Coffey; Comanche; Cowley; Crawford; Edwards; Elk; Finney; Ford; Franklin; Grant; Gray; Greeley; Greenwood; Hamilton; Harper; Harvey; Haskell; Hodgeman; Kearny; Kingman; Kiowa; Labette; Lane; Linn; Lyon; Marion; McPherson; Meade; Miami; Montgomery; Morton; Neosho; Ness; Osage; Pawnee; Pratt; Reno; Rice; Rush; Scott; Sedgwick; [...]
+26779,NAD27 / Kentucky North,,,,United States (USA) - Kentucky - KY_N - counties of Anderson; Bath; Boone; Bourbon; Boyd; Bracken; Bullitt; Campbell; Carroll; Carter; Clark; Elliott; Fayette; Fleming; Franklin; Gallatin; Grant; Greenup; Harrison; Henry; Jefferson; Jessamine; Kenton; Lawrence; Lewis; Mason; Menifee; Montgomery; Morgan; Nicholas; Oldham; Owen; Pendleton; Robertson; Rowan; Scott; Shelby; Spencer; Trimble; Woodford,projected 2D,,,East,North,X,Y,9003,,4267,11601,1995-06-02 00 [...]
+26780,NAD27 / Kentucky South,,,,United States (USA) - Kentucky - KY_S - counties of Adair; Allen; Ballard; Barren; Bell; Boyle; Breathitt; Breckinridge; Butler; Caldwell; Calloway; Carlisle; Casey; Christian; Clay; Clinton; Crittenden; Cumberland; Daviess; Edmonson; Estill; Floyd; Fulton; Garrard; Graves; Grayson; Green; Hancock; Hardin; Harlan; Hart; Henderson; Hickman; Hopkins; Jackson; Johnson; Knott; Knox; Larue; Laurel; Lee; Leslie; Letcher; Lincoln; Livingston; Logan; Lyon; Madison [...]
+26781,NAD27 / Louisiana North,,,,United States (USA) - Louisiana - LA_N - counties of Avoyelles; Bienville; Bossier; Caddo; Caldwell; Catahoula; Claiborne; Concordia; De Soto; East Carroll; Franklin; Grant; Jackson; La Salle; Lincoln; Madison; Morehouse; Natchitoches; Ouachita; Rapides; Red River; Richland; Sabine; Tensas; Union; Vernon; Webster; West Carroll; Winn,projected 2D,,,East,North,X,Y,9003,,4267,11701,1995-06-02 00:00:00,,EPSG,,
+26782,NAD27 / Louisiana South,,,,United States (USA) - Louisiana - LA_S - counties of Acadia; Allen; Ascension; Assumption; Beauregard; Calcasieu; Cameron; East Baton Rouge; East Feliciana; Evangeline; Iberia; Iberville; Jefferson; Jefferson Davis; Lafayette; LaFourche; Livingston; Orleans; Plaquemines; Pointe Coupee; St. Bernard; St. Charles; St. Helena; St. James; St. John the Baptist; St. Landry; St. Martin; St. Mary; St. Tammany; Tangipahoa; Terrebonne; Vermilion; Washington; West Ba [...]
+26783,NAD27 / Maine East,,,,United States (USA) - Maine - ME_E - counties of Aroostook; Hancock; Knox; Penobscot; Piscataquis; Waldo; Washington,projected 2D,,,East,North,X,Y,9003,,4267,11801,1995-06-02 00:00:00,,EPSG,,
+26784,NAD27 / Maine West,,,,United States (USA) - Maine - ME_W - counties of Androscoggin; Cumberland; Franklin; Kennebec; Lincoln; Oxford; Sagadahoc; Somerset; York,projected 2D,,,East,North,X,Y,9003,,4267,11802,1995-06-02 00:00:00,,EPSG,,
+26785,NAD27 / Maryland,,,,United States (USA) - Maryland -MD - counties of Allegany; Anne Arundel; Baltimore; Calvert; Caroline; Carroll; Cecil; Charles; Dorchester; Frederick; Garrett; Harford; Howard; Kent; Montgomery; Prince Georges; Queen Annes; Somerset; St. Marys; Talbot; Washington; Wicomico; Worcester,projected 2D,,,East,North,X,Y,9003,,4267,11900,1995-06-02 00:00:00,,EPSG,,
+26786,NAD27 / Massachusetts Mainland,NAD27 / Massachusetts,,,United States (USA) - Massachusetts - MA_M - counties of Barnstable; Berkshire; Bristol; Essex; Franklin; Hampden; Hampshire; Middlesex; Norfolk; Plymouth; Suffolk; Worcester,projected 2D,,,East,North,X,Y,9003,,4267,12001,1995-06-02 00:00:00,,EPSG,,
+26787,NAD27 / Massachusetts Island,NAD27 / Massachusetts Is,,,United States (USA) - Massachusetts - MA_I - counties of Dukes; Nantucket,projected 2D,,,East,North,X,Y,9003,,4267,12002,1995-06-02 00:00:00,,EPSG,,
+26791,NAD27 / Minnesota North,,,,United States (USA) - Minnesota - MN_N - counties of Beltrami; Clearwater; Cook; Itasca; Kittson; Koochiching; Lake; Lake of the Woods; Mahnomen; Marshall; Norman; Pennington; Polk; Red Lake; Roseau; St. Louis,projected 2D,,,East,North,X,Y,9003,,4267,12201,1995-06-02 00:00:00,,EPSG,,
+26792,NAD27 / Minnesota Central,NAD27 / Minnesota Cent.,,,United States (USA) - Minnesota - MN_C - counties of Aitkin; Becker; Benton; Carlton; Cass; Chisago; Clay; Crow Wing; Douglas; Grant; Hubbard; Isanti; Kanabec; Mille Lacs; Morrison; Otter Tail; Pine; Pope; Stearns; Stevens; Todd; Traverse; Wadena; Wilkin,projected 2D,,,East,North,X,Y,9003,,4267,12202,1995-06-02 00:00:00,,EPSG,,
+26793,NAD27 / Minnesota South,,,,United States (USA) - Minnesota - MN_S - counties of Anoka; Big Stone; Blue Earth; Brown; Carver; Chippewa; Cottonwood; Dakota; Dodge; Faribault; Fillmore; Freeborn; Goodhue; Hennepin; Houston; Jackson; Kandiyohi; Lac Qui Parle; Le Sueur; Lincoln; Lyon; Martin; McLeod; Meeker; Mower; Murray; Nicollet; Nobles; Olmsted; Pipestone; Ramsey; Redwood; Renville; Rice; Rock; Scott; Sherburne; Sibley; Steele; Swift; Wabasha; Waseca; Washington; Watonwan; Winona; W [...]
+26794,NAD27 / Mississippi East,,,,United States (USA) - Mississippi - MS_E - counties of Alcorn; Attala; Benton; Calhoun; Chickasaw; Choctaw; Clarke; Clay; Covington; Forrest; George; Greene; Hancock; Harrison; Itawamba; Jackson; Jasper; Jones; Kemper; Lafayette; Lamar; Lauderdale; Leake; Lee; Lowndes; Marshall; Monroe; Neshoba; Newton; Noxubee; Oktibbeha; Pearl River; Perry; Pontotoc; Prentiss; Scott; Smith; Stone; Tippah; Tishomingo; Union; Wayne; Webster; Winston,projected 2D,,,East,N [...]
+26795,NAD27 / Mississippi West,,,,United States (USA) - Mississippi - MS_W - counties of Adams; Amite; Bolivar; Carroll; Claiborne; Coahoma; Copiah; De Soto; Franklin; Grenada; Hinds; Holmes; Humphreys; Issaquena; Jefferson; Jefferson Davis; Lawrence; Leflore; Lincoln; Madison; Marion; Montgomery; Panola; Pike; Quitman; Rankin; Sharkey; Simpson; Sunflower; Tallahatchie; Tate; Tunica; Walthall; Warren; Washington; Wilkinson; Yalobusha; Yazoo,projected 2D,,,East,North,X,Y,9003,,4267,12302, [...]
+26796,NAD27 / Missouri East,,,,United States (USA) - Missouri - MO_E - counties of Bollinger; Butler; Cape Girardeau; Carter; Clark; Crawford; Dent; Dunklin; Franklin; Gasconade; Iron; Jefferson; Lewis; Lincoln; Madison; Marion; Mississippi; Montgomery; New Madrid; Oregon; Pemiscot; Perry; Pike; Ralls; Reynolds; Ripley; Scott; Shannon; St. Charles; St. Francois; St. Louis; Ste. Genevieve; Stoddard; Warren; Washington; Wayne,projected 2D,,,East,North,X,Y,9003,,4267,12401,1995-06-02 00:00: [...]
+26797,NAD27 / Missouri Central,,,,United States (USA) - Missouri - MO_C - counties of Adair; Audrain; Benton; Boone; Callaway; Camden; Carroll; Chariton; Christian; Cole; Cooper; Dallas; Douglas; Greene; Grundy; Hickory; Howard; Howell; Knox; Laclede; Linn; Livingston; Macon; Maries; Mercer; Miller; Moniteau; Monroe; Morgan; Osage; Ozark; Pettis; Phelps; Polk; Pulaski; Putnam; Randolph; Saline; Schuyler; Scotland; Shelby; Stone; Sullivan; Taney; Texas; Webster; Wright,projected 2D,,,East [...]
+26798,NAD27 / Missouri West,,,,United States (USA) - Missouri - MO_W - counties of Andrew; Atchison; Barry; Barton; Bates; Buchanan; Caldwell; Cass; Cedar; Clay; Clinton; Dade; Daviess; De Kalb; Gentry; Harrison; Henry; Holt; Jackson; Jasper; Johnson; Lafayette; Lawrence; McDonald; Newton; Nodaway; Platte; Ray; St. Clair; Vernon; Worth,projected 2D,,,East,North,X,Y,9003,,4267,12403,1995-06-02 00:00:00,,EPSG,,
+26801,NAD Michigan / Michigan East,NAD27 / Michigan East,,,United States (USA) - Michigan - MI_E - counties of Alcona; Alpena; Arenac; Bay; Cheboygan; Clinton; Crawford; Genesee; Gladwin; Gratiot; Hillsdale; Huron; Ingham; Iosco; Jackson; Lapeer; Lenawee; Livingston; Macomb; Midland; Monroe; Montmorency; Oakland; Ogemaw; Oscoda; Otsego; Presque Isle; Roscommon; Saginaw; Sanilac; Shiawassee; St. Clair; Tuscola; Washtenaw; Wayne,projected 2D,,,East,North,X,Y,9003,,4268,12101,1998-11-11 00: [...]
+26802,NAD Michigan / Michigan Old Central,NAD27 / Michigan Old Cen,,,United States (USA) - Michigan - MI_C - counties of Allegan; Antrim; Barry; Benzie; Berrien; Branch; Calhoun; Cass; Charlevoix; Clare; Eaton; Emmet; Grand Traverse; Ionia; Isabella; Kalamazoo; Kalkaska; Kent; Lake; Leelanau; Manistee; Mason; Mecosta; Missaukee; Montcalm; Muskegon; Newaygo; Oceana; Osceola; Ottawa; St. Joseph; Van Buren; Wexford,projected 2D,,,East,North,X,Y,9003,,4268,12102,1998-11-11 00:00:00,,EPSG,Sup [...]
+26803,NAD Michigan / Michigan West,NAD27 / Michigan West,,,United States (USA) - Michigan - MI_W - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft,projected 2D,,,East,North,X,Y,9003,,4268,12103,1998-11-11 00:00:00,,EPSG,Superseded by 26811 26812 and 26813.,95.25 97.19 98.22
+26811,NAD Michigan / Michigan North,NAD27 / Michigan North,,,United States (USA) - Michigan - MI_N - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft,projected 2D,,,East,North,X,Y,9003,,4268,12111,1998-11-11 00:00:00,,EPSG,Supersedes 26801 26802 and 26803.,96.28 98.22
+26812,NAD Michigan / Michigan Central,NAD27 / Michigan Central,,,United States (USA) - Michigan - MI_C - counties of Alcona; Alpena; Antrim; Arenac; Benzie; Charlevoix; Cheboygan; Clare; Crawford; Emmet; Gladwin; Grand Traverse; Iosco; Kalkaska; Lake; Leelanau; Manistee; Mason; Missaukee; Montmorency; Ogemaw; Osceola; Oscoda; Otsego; Presque Isle; Roscommon; Wexford,projected 2D,,,East,North,X,Y,9003,,4268,12112,1998-11-11 00:00:00,,EPSG,Supersedes 26801 26802 and 26803.,96.28 97.19 98.22
+26813,NAD Michigan / Michigan South,NAD27 / Michigan South,,,United States (USA) - Michigan - MI_S - counties of Allegan; Barry; Bay; Berrien; Branch; Calhoun; Cass; Clinton; Eaton; Genesee; Gratiot; Hillsdale; Huron; Ingham; Ionia; Isabella; Jackson; Kalamazoo; Kent; Lapeer; Lenawee; Livingston; Macomb; Mecosta; Midland; Monroe; Montcalm; Muskegon; Newaygo; Oakland; Oceana; Ottawa; Saginaw; Sanilac; Shiawassee; St. Clair; St. Joseph; Tuscola; Van Buren; Washtenaw; Wayne,projected 2D,,,E [...]
+26903,NAD83 / UTM zone 3N,,,,North America - United States (USA) - Alaska - 168deg West to 162deg West.,projected 2D,,,East,North,E,N,9001,,4269,16003,1995-06-02 00:00:00,,EPSG,,
+26904,NAD83 / UTM zone 4N,,,,North America - United States (USA) - Alaska - 162deg West to 156deg West.,projected 2D,,,East,North,E,N,9001,,4269,16004,1995-06-02 00:00:00,,EPSG,,
+26905,NAD83 / UTM zone 5N,,,,North America - United States (USA) - Alaska - 156deg West to 150deg West.,projected 2D,,,East,North,E,N,9001,,4269,16005,1995-06-02 00:00:00,,EPSG,,
+26906,NAD83 / UTM zone 6N,,,,North America - United States (USA) - Alaska - 150deg West to 144deg West.,projected 2D,,,East,North,E,N,9001,,4269,16006,1995-06-02 00:00:00,,EPSG,,
+26907,NAD83 / UTM zone 7N,,,,North America - Canada; United States (USA) - Alaska - 144deg West to 138deg West.,projected 2D,,,East,North,E,N,9001,,4269,16007,1995-06-02 00:00:00,,EPSG,,
+26908,NAD83 / UTM zone 8N,,,,North America - Canada; United States (USA) - 138deg West to 132deg West.,projected 2D,,,East,North,E,N,9001,,4269,16008,1995-06-02 00:00:00,,EPSG,,
+26909,NAD83 / UTM zone 9N,,,,North America - Canada; United States (USA) - 132deg West to 126deg West.,projected 2D,,,East,North,E,N,9001,,4269,16009,1995-06-02 00:00:00,,EPSG,,
+26910,NAD83 / UTM zone 10N,,,,North America - Canada; United States (USA) - 130deg West to 120deg West.,projected 2D,,,East,North,E,N,9001,,4269,16010,1995-06-02 00:00:00,,EPSG,,
+26911,NAD83 / UTM zone 11N,,,,North America - Canada; Mexico; United States (USA) - 120deg West to 114deg West.,projected 2D,,,East,North,E,N,9001,,4269,16011,1995-06-02 00:00:00,,EPSG,,
+26912,NAD83 / UTM zone 12N,,,,North America - Canada; Mexico; United States (USA) - 114deg West to 108deg West.,projected 2D,,,East,North,E,N,9001,,4269,16012,1995-06-02 00:00:00,,EPSG,,
+26913,NAD83 / UTM zone 13N,,,,North America - Canada; Mexico; United States (USA) - 108deg West to 102deg West.,projected 2D,,,East,North,E,N,9001,,4269,16013,1995-06-02 00:00:00,,EPSG,,
+26914,NAD83 / UTM zone 14N,,,,North America - Canada; Mexico; United States (USA) - 102deg West to 96deg West.,projected 2D,,,East,North,E,N,9001,,4269,16014,1995-06-02 00:00:00,,EPSG,,
+26915,NAD83 / UTM zone 15N,,,,North America - Canada; Mexico; United States (USA) - 96deg West to 90deg West.,projected 2D,,,East,North,E,N,9001,,4269,16015,1995-06-02 00:00:00,,EPSG,,
+26916,NAD83 / UTM zone 16N,,,,North America - Canada; Mexico; United States (USA) - 90deg West to 84deg West.,projected 2D,,,East,North,E,N,9001,,4269,16016,1995-06-02 00:00:00,,EPSG,,
+26917,NAD83 / UTM zone 17N,,,,North America - Canada; Mexico; United States (USA) - 84deg West to 78deg West.,projected 2D,,,East,North,E,N,9001,,4269,16017,1995-06-02 00:00:00,,EPSG,,
+26918,NAD83 / UTM zone 18N,,,,North America - Canada; United States (USA) - 78deg West to 72deg West.,projected 2D,,,East,North,E,N,9001,,4269,16018,1995-06-02 00:00:00,,EPSG,,
+26919,NAD83 / UTM zone 19N,,,,North America - Canada; United States (USA) - 72deg West to 66deg West.,projected 2D,,,East,North,E,N,9001,,4269,16019,1995-06-02 00:00:00,,EPSG,,
+26920,NAD83 / UTM zone 20N,,,,North America - Canada; United States (USA) offshore Atlantic - 66deg West to 60deg West.,projected 2D,,,East,North,E,N,9001,,4269,16020,1995-06-02 00:00:00,,EPSG,,
+26921,NAD83 / UTM zone 21N,,,,North America - Canada - 60deg West to 54deg West.,projected 2D,,,East,North,E,N,9001,,4269,16021,1995-06-02 00:00:00,,EPSG,,
+26922,NAD83 / UTM zone 22N,,,,North America - Canada - Newfoundland - 54deg West to 48deg West.,projected 2D,,,East,North,E,N,9001,,4269,16022,1995-06-02 00:00:00,,EPSG,,
+26923,NAD83 / UTM zone 23N,,,,North America - Canada offshore Atlantic - 48deg West to 42deg West.,projected 2D,,,East,North,E,N,9001,,4269,16023,1995-06-02 00:00:00,,EPSG,,
+26929,NAD83 / Alabama East,,,,United States (USA) - Alabama - AL_E - counties east of approx 86d 37m West - Barbour; Bullock; Calhoun; Chambers; Cherokee; Clay; Cleburne; Coffee; Coosa; Covington; Crenshaw; Dale; De Kalb; Elmore; Etowah; Geneva; Henry; Houston; Jackson; Lee; Macon; Madison; Marshall; Montgomery; Pike; Randolph; Russell; St.Clair; Talladega; Tallapoosa,projected 2D,,,East,North,X,Y,9001,,4269,10131,1995-06-02 00:00:00,,EPSG,,
+26930,NAD83 / Alabama West,,,,United States (USA) - Alabama - AL_W - counties west of approx 86d 37m West - Autauga; Baldwin; Bibb; Blount; Butler; Chilton; Choctaw; Clarke; Colbert; Conecuh; Cullman; Dallas; Escambia; Fayette; Franklin; Greene; Hale; Jefferson; Lamar; Lauderdale; Lawrence; Limestone; Lowndes; Marengo; Marion; Mobile; Monroe; Morgan; Perry; Pickens; Shelby; Sumter; Tuscaloosa; Walker; Washington; Wilcox; Winston,projected 2D,,,East,North,X,Y,9001,,4269,10132,1995-06-02 0 [...]
+26931,NAD83 / Alaska zone 1,,,,United States - Alaska - Panhandle.,projected 2D,,,East,North,X,Y,9001,,4269,15031,1995-06-02 00:00:00,,EPSG,,
+26932,NAD83 / Alaska zone 2,,,,United States - Alaska - 141deg to 144deg West.,projected 2D,,,East,North,X,Y,9001,,4269,15032,1995-06-02 00:00:00,,EPSG,,
+26933,NAD83 / Alaska zone 3,,,,United States - Alaska - 144deg to 148deg West.,projected 2D,,,East,North,X,Y,9001,,4269,15033,1995-06-02 00:00:00,,EPSG,,
+26934,NAD83 / Alaska zone 4,,,,United States - Alaska - 148deg to 152deg West.,projected 2D,,,East,North,X,Y,9001,,4269,15034,1995-06-02 00:00:00,,EPSG,,
+26935,NAD83 / Alaska zone 5,,,,United States - Alaska - 152deg to 156deg West.,projected 2D,,,East,North,X,Y,9001,,4269,15035,1995-06-02 00:00:00,,EPSG,,
+26936,NAD83 / Alaska zone 6,,,,United States - Alaska - 156deg to 160deg West.,projected 2D,,,East,North,X,Y,9001,,4269,15036,1995-06-02 00:00:00,,EPSG,,
+26937,NAD83 / Alaska zone 7,,,,United States - Alaska - 160deg to 164deg West.,projected 2D,,,East,North,X,Y,9001,,4269,15037,1995-06-02 00:00:00,,EPSG,,
+26938,NAD83 / Alaska zone 8,,,,United States - Alaska - 164deg to 168deg West north of 54d 30m North.,projected 2D,,,East,North,X,Y,9001,,4269,15038,1995-06-02 00:00:00,,EPSG,,
+26939,NAD83 / Alaska zone 9,,,,United States - Alaska - west of 168deg West and north of 54d 30m North.,projected 2D,,,East,North,X,Y,9001,,4269,15039,1995-06-02 00:00:00,,EPSG,,
+26940,NAD83 / Alaska zone 10,,,,United States - Alaska - Aleutian Islands.,projected 2D,,,East,North,X,Y,9001,,4269,15040,1995-06-02 00:00:00,,EPSG,,
+26941,NAD83 / California zone 1,NAD83 / California 1,,,United States (USA) - California - CA_1 - counties north of approx 40 deg North - Del Norte; Humboldt; Lassen; Modoc; Plumas; Shasta; Siskiyou; Tehama; Trinity,projected 2D,,,East,North,X,Y,9001,,4269,10431,1995-06-02 00:00:00,,EPSG,,
+26942,NAD83 / California zone 2,NAD83 / California 2,,,United States (USA) - California - CA_2 - counties between approx 40 deg & 38d 15m North - Alpine; Amador; Butte; Colusa; El Dorado; Glenn; Lake; Mendocino; Napa; Nevada; Placer; Sacramento; Sierra; Solano; Sonoma; Sutter; Yolo; Yuba,projected 2D,,,East,North,X,Y,9001,,4269,10432,1995-06-02 00:00:00,,EPSG,,
+26943,NAD83 / California zone 3,NAD83 / California 3,,,United States (USA) - California - CA_3 - counties between approx 38d 15m & 37d North - Alameda; Calaveras; Contra Costa; Madera; Marin; Mariposa; Merced; Mono; San Francisco; San Joaquin; San Mateo; Santa Clara; Santa Cruz; Stanislaus; Tuolumne,projected 2D,,,East,North,X,Y,9001,,4269,10433,1995-06-02 00:00:00,,EPSG,,
+26944,NAD83 / California zone 4,NAD83 / California 4,,,United States (USA) - California - CA_4 - counties between approx 37d & 35d 30m North - Fresno; Inyo; Kings; Monterey; San Benito; Tulare,projected 2D,,,East,North,X,Y,9001,,4269,10434,1995-06-02 00:00:00,,EPSG,,
+26945,NAD83 / California zone 5,NAD83 / California 5,,,United States (USA) - California - CA_5 - counties between approx 35d 50m & 34d North - Kern; Los Angeles; San Bernardino; San Luis Obispo; Santa Barbara; Ventura,projected 2D,,,East,North,X,Y,9001,,4269,10435,1995-06-02 00:00:00,,EPSG,,
+26946,NAD83 / California zone 6,NAD83 / California 6,,,United States (USA) - California - CA_6 - counties south of approx 38d 30m North - Imperial; Orange; Riverside; San Diego,projected 2D,,,East,North,X,Y,9001,,4269,10436,1995-06-02 00:00:00,,EPSG,,
+26948,NAD83 / Arizona East,,,,United States (USA) - Arizona - AZ_E - counties east of approx 110d 45m West - Apache; Cochise; Gila; Graham; Greenlee; Navajo,projected 2D,,,East,North,X,Y,9001,,4269,10231,1995-06-02 00:00:00,,EPSG,,
+26949,NAD83 / Arizona Central,,,,United States (USA) - Arizona - AZ_C - counties between approx 110d 45m and 113d 20m West - Coconino; Maricopa; Pima; Pinal; Santa Cruz; Yavapai,projected 2D,,,East,North,X,Y,9001,,4269,10232,1995-06-02 00:00:00,,EPSG,,
+26950,NAD83 / Arizona West,,,,United States (USA) - Arizona - AZ_W - counties west of approx 113d 20m West - La Paz; Mohave; Yuma,projected 2D,,,East,North,X,Y,9001,,4269,10233,1995-06-02 00:00:00,,EPSG,,
+26951,NAD83 / Arkansas North,,,,United States (USA) - Arkansas - AR_N - counties north of approx 34d 50m North - Baxter; Benton; Boone; Carroll; Clay; Cleburne; Conway; Craighead; Crawford; Crittenden; Cross; Faulkner; Franklin; Fulton; Greene; Independence; Izard; Jackson; Johnson; Lawrence; Logan; Madison; Marion; Mississippi; Newton; Perry; Poinsett; Pope; Randolph; Scott; Searcy; Sebastian; Sharp; St. Francis; Stone; Van Buren; Washington; White; Woodruff; Yell,projected 2D,,,East,No [...]
+26952,NAD83 / Arkansas South,,,,United States (USA) - Arkansas - AR_S - counties south of approx 34d 50m North - Arkansas; Ashley; Bradley; Calhoun; Chicot; Clark; Cleveland; Columbia; Dallas; Desha; Drew; Garland; Grant; Hempstead; Hot Spring; Howard; Jefferson; Lafayette; Lee; Lincoln; Little River; Lonoke; Miller; Monroe; Montgomery; Nevada; Ouachita; Phillips; Pike; Polk; Prairie; Pulaski; Saline; Sevier; Union,projected 2D,,,East,North,X,Y,9001,,4269,10332,1995-06-02 00:00:00,,EPSG,,
+26953,NAD83 / Colorado North,,,,United States (USA) - Colorado - CO_N - counties north of approx 39d 50m North - Adams; Boulder; Gilpin; Grand; Jackson; Larimer; Logan; Moffat; Morgan; Phillips; Rio Blanco; Routt; Sedgwick; Washington; Weld; Yuma,projected 2D,,,East,North,X,Y,9001,,4269,10531,1995-06-02 00:00:00,,EPSG,,
+26954,NAD83 / Colorado Central,,,,United States (USA) - Colorado - CO_C - counties between approx 39d 50m & 38d 30m North - Arapahoe; Chaffee; Cheyenne; Clear Creek; Delta; Denver; Douglas; Eagle; El Paso; Elbert; Fremont; Garfield; Gunnison; Jefferson; Kit Carson; Lake; Lincoln; Mesa; Park; Pitkin; Summit; Teller,projected 2D,,,East,North,X,Y,9001,,4269,10532,1995-06-02 00:00:00,,EPSG,,
+26955,NAD83 / Colorado South,,,,United States (USA) - Colorado - CO_S - counties south of approx 38d 30m North - Alamosa; Archuleta; Baca; Bent; Conejos; Costilla; Crowley; Custer; Dolores; Hinsdale; Huerfano; Kiowa; La Plata; Las Animas; Mineral; Montezuma; Montrose; Otero; Ouray; Prowers; Pueblo; Rio Grande; Saguache; San Juan; San Miguel,projected 2D,,,East,North,X,Y,9001,,4269,10533,1995-06-02 00:00:00,,EPSG,,
+26956,NAD83 / Connecticut,,,,United States (USA) - Connecticut - CT - counties of Fairfield; Hartford; Litchfield; Middlesex; New Haven; New London; Tolland; Windham,projected 2D,,,East,North,X,Y,9001,,4269,10630,1995-06-02 00:00:00,,EPSG,,
+26957,NAD83 / Delaware,,,,United States (USA) - Delaware - DE - counties of Kent; New Castle; Sussex,projected 2D,,,East,North,X,Y,9001,,4269,10730,1995-06-02 00:00:00,,EPSG,,
+26958,NAD83 / Florida East,,,,United States (USA) - Florida - FL_E - counties of Brevard; Broward; Clay; Collier; Dade; Duval; Flagler; Glades; Hendry; Highlands; Indian River; Lake; Martin; Monroe; Nassau; Okeechobee; Orange; Osceola; Palm Beach; Putnam; Seminole; St. Johns; St. Lucie; Volusia,projected 2D,,,East,North,X,Y,9001,,4269,10931,1995-06-02 00:00:00,,EPSG,,
+26959,NAD83 / Florida West,,,,United States (USA) - Florida - FL_W - counties of Charlotte; Citrus; De Soto; Hardee; Hernando; Hillsborough; Lee; Levy; Manatee; Marion; Pasco; Pinellas; Polk; Sarasota; Sumter,projected 2D,,,East,North,X,Y,9001,,4269,10932,1995-06-02 00:00:00,,EPSG,,
+26960,NAD83 / Florida North,,,,United States (USA) - Florida - FL_N - counties of Alachua; Baker; Bay; Bradford; Calhoun; Columbia; Dixie; Escambia; Escambia; Franklin; Gadsden; Gilchrist; Gulf; Hamilton; Holmes; Jackson; Jefferson; Lafayette; Leon; Liberty; Madison; Okaloosa; Santa Rosa; Suwannee; Taylor; Union; Wakulla; Walton; Washington,projected 2D,,,East,North,X,Y,9001,,4269,10933,1995-06-02 00:00:00,,EPSG,,
+26961,NAD83 / Hawaii zone 1,,,,United States - Hawaii - island of Hawaii.,projected 2D,,,East,North,X,Y,9001,,4269,15131,1995-06-02 00:00:00,,EPSG,,
+26962,NAD83 / Hawaii zone 2,,,,United States - Hawaii - Maui; Kahoolawe; Lanai; Molokai.,projected 2D,,,East,North,X,Y,9001,,4269,15132,1995-06-02 00:00:00,,EPSG,,
+26963,NAD83 / Hawaii zone 3,,,,United States - Hawaii - Oahu.,projected 2D,,,East,North,X,Y,9001,,4269,15133,1995-06-02 00:00:00,,EPSG,,
+26964,NAD83 / Hawaii zone 4,,,,United States - Hawaii - Kauai.,projected 2D,,,East,North,X,Y,9001,,4269,15134,1995-06-02 00:00:00,,EPSG,,
+26965,NAD83 / Hawaii zone 5,,,,United States - Hawaii - Niihau.,projected 2D,,,East,North,X,Y,9001,,4269,15135,1995-06-02 00:00:00,,EPSG,,
+26966,NAD83 / Georgia East,,,,United States (USA) - Georgia - GA_E - counties of Appling; Atkinson; Bacon; Baldwin; Brantley; Bryan; Bulloch; Burke; Camden; Candler; Charlton; Chatham; Clinch; Coffee; Columbia; Dodge; Echols; Effingham; Elbert; Emanuel; Evans; Franklin; Glascock; Glynn; Greene; Hancock; Hart; Jeff Davis; Jefferson; Jenkins; Johnson; Lanier; Laurens; Liberty; Lincoln; Long; Madison; McDuffie; McIntosh; Montgomery; Oglethorpe; Pierce; Richmond; Screven; Stephens; Taliafer [...]
+26967,NAD83 / Georgia West,,,,United States (USA) - Georgia - GA_W - counties of Baker; Banks; Barrow; Bartow; Ben Hill; Berrien; Bibb; Bleckley; Brooks; Butts; Calhoun; Carroll; Catoosa; Chattahoochee; Chattooga; Cherokee; Clarke; Clay; Clayton; Cobb; Colquitt; Cook; Coweta; Crawford; Crisp; Dade; Dawson; De Kalb; Decatur; Dooly; Dougherty; Douglas; Early; Fannin; Fayette; Floyd; Forsyth; Fulton; Gilmer; Gordon; Grady; Gwinnett; Habersham; Hall; Haralson; Harris; Heard; Henry; Houston; [...]
+26968,NAD83 / Idaho East,,,,United States (USA) - Idaho - ID_E - counties of Bannock; Bear Lake; Bingham; Bonneville; Caribou; Clark; Franklin; Fremont; Jefferson; Madison; Oneida; Power; Teton,projected 2D,,,East,North,X,Y,9001,,4269,11131,1995-06-02 00:00:00,,EPSG,,
+26969,NAD83 / Idaho Central,,,,United States (USA) - Idaho - ID_C - counties of Blaine; Butte; Camas; Cassia; Custer; Gooding; Jerome; Lemhi; Lincoln; Minidoka; Twin Falls,projected 2D,,,East,North,X,Y,9001,,4269,11132,1995-06-02 00:00:00,,EPSG,,
+26970,NAD83 / Idaho West,,,,United States (USA) - Idaho - ID_W - counties of Ada; Adams; Benewah; Boise; Bonner; Boundary; Canyon; Clearwater; Elmore; Gem; Idaho; Kootenai; Latah; Lewis; Nez Perce; Owyhee; Payette; Shoshone; Valley; Washington,projected 2D,,,East,North,X,Y,9001,,4269,11133,1995-06-02 00:00:00,,EPSG,,
+26971,NAD83 / Illinois East,,,,United States (USA) - Illinois - IL_E - counties of Boone; Champaign; Clark; Clay; Coles; Cook; Crawford; Cumberland; De Kalb; De Witt; Douglas; Du Page; Edgar; Edwards; Effingham; Fayette; Ford; Franklin; Gallatin; Grundy; Hamilton; Hardin; Iroquois; Jasper; Jefferson; Johnson; Kane; Kankakee; Kendall; La Salle; Lake; Lawrence; Livingston; Macon; Marion; Massac; McHenry; McLean; Moultrie; Piatt; Pope; Richland; Saline; Shelby; Vermilion; Wabash; Wayne; Wh [...]
+26972,NAD83 / Illinois West,,,,United States (USA) - Illinois - IL_W - counties of Adams; Alexander; Bond; Brown; Bureau; Calhoun; Carroll; Cass; Christian; Clinton; Fulton; Greene; Hancock; Henderson; Henry; Jackson; Jersey; Jo Daviess; Knox; Lee; Logan; Macoupin; Madison; Marshall; Mason; McDonough; Menard; Mercer; Monroe; Montgomery; Morgan; Ogle; Peoria; Perry; Pike; Pulaski; Putnam; Randolph; Rock Island; Sangamon; Schuyler; Scott; St. Clair; Stark; Stephenson; Tazewell; Union; War [...]
+26973,NAD83 / Indiana East,,,,United States (USA) - Indiana - IN_E - counties of Adams; Allen; Bartholomew; Blackford; Brown; Cass; Clark; De Kalb; Dearborn; Decatur; Delaware; Elkhart; Fayette; Floyd; Franklin; Fulton; Grant; Hamilton; Hancock; Harrison; Henry; Howard; Huntington; Jackson; Jay; Jefferson; Jennings; Johnson; Kosciusko; Lagrange; Madison; Marion; Marshall; Miami; Noble; Ohio; Randolph; Ripley; Rush; Scott; Shelby; St. Joseph; Steuben; Switzerland; Tipton; Union; Wabash; [...]
+26974,NAD83 / Indiana West,,,,United States (USA) - Indiana - IN_W - counties of Benton; Boone; Carroll; Clay; Clinton; Crawford; Daviess; Dubois; Fountain; Gibson; Greene; Hendricks; Jasper; Knox; La Porte; Lake; Lawrence; Martin; Monroe; Montgomery; Morgan; Newton; Orange; Owen; Parke; Perry; Pike; Porter; Posey; Pulaski; Putnam; Spencer; Starke; Sullivan; Tippecanoe; Vanderburgh; Vermillion; Vigo; Warren; Warrick; White,projected 2D,,,East,North,X,Y,9001,,4269,11332,1995-06-02 00:00: [...]
+26975,NAD83 / Iowa North,,,,United States (USA) - Iowa - IA_N - counties of Allamakee; Benton; Black Hawk; Boone; Bremer; Buchanan; Buena Vista; Butler; Calhoun; Carroll; Cerro Gordo; Cherokee; Chickasaw; Clay; Clayton; Crawford; Delaware; Dickinson; Dubuque; Emmet; Fayette; Floyd; Franklin; Greene; Grundy; Hamilton; Hancock; Hardin; Howard; Humboldt; Ida; Jackson; Jones; Kossuth; Linn; Lyon; Marshall; Mitchell; Monona; O'Brien; Osceola; Palo Alto; Plymouth; Pocahontas; Sac; Sioux; Story [...]
+26976,NAD83 / Iowa South,,,,United States (USA) - Iowa - IA_S - counties of Adair; Adams; Appanoose; Audubon; Cass; Cedar; Clarke; Clinton; Dallas; Davis; Decatur; Des Moines; Fremont; Guthrie; Harrison; Henry; Iowa; Jasper; Jefferson; Johnson; Keokuk; Lee; Louisa; Lucas; Madison; Mahaska; Marion; Mills; Monroe; Montgomery; Muscatine; Page; Polk; Pottawattamie; Poweshiek; Ringgold; Scott; Shelby; Taylor; Union; Van Buren; Wapello; Warren; Washington; Wayne,projected 2D,,,East,North,X,Y,9 [...]
+26977,NAD83 / Kansas North,,,,United States (USA) - Kansas - KS_N - counties of Atchison; Brown; Cheyenne; Clay; Cloud; Decatur; Dickinson; Doniphan; Douglas; Ellis; Ellsworth; Geary; Gove; Graham; Jackson; Jefferson; Jewell; Johnson; Leavenworth; Lincoln; Logan; Marshall; Mitchell; Morris; Nemaha; Norton; Osborne; Ottawa; Phillips; Pottawatomie; Rawlins; Republic; Riley; Rooks; Russell; Saline; Shawnee; Sheridan; Sherman; Smith; Thomas; Trego; Wabaunsee; Wallace; Washington; Wyandotte,p [...]
+26978,NAD83 / Kansas South,,,,United States (USA) - Kansas - KS_S - counties of Allen; Anderson; Barber; Barton; Bourbon; Butler; Chase; Chautauqua; Cherokee; Clark; Coffey; Comanche; Cowley; Crawford; Edwards; Elk; Finney; Ford; Franklin; Grant; Gray; Greeley; Greenwood; Hamilton; Harper; Harvey; Haskell; Hodgeman; Kearny; Kingman; Kiowa; Labette; Lane; Linn; Lyon; Marion; McPherson; Meade; Miami; Montgomery; Morton; Neosho; Ness; Osage; Pawnee; Pratt; Reno; Rice; Rush; Scott; Sedgwick; [...]
+26979,NAD83 / Kentucky North,,,,United States (USA) - Kentucky - KY_N - counties of Anderson; Bath; Boone; Bourbon; Boyd; Bracken; Bullitt; Campbell; Carroll; Carter; Clark; Elliott; Fayette; Fleming; Franklin; Gallatin; Grant; Greenup; Harrison; Henry; Jefferson; Jessamine; Kenton; Lawrence; Lewis; Mason; Menifee; Montgomery; Morgan; Nicholas; Oldham; Owen; Pendleton; Robertson; Rowan; Scott; Shelby; Spencer; Trimble; Woodford,projected 2D,,,East,North,X,Y,9001,,4269,11631,1995-06-02 00 [...]
+26980,NAD83 / Kentucky South,,,,United States (USA) - Kentucky - KY_S - counties of Adair; Allen; Ballard; Barren; Bell; Boyle; Breathitt; Breckinridge; Butler; Caldwell; Calloway; Carlisle; Casey; Christian; Clay; Clinton; Crittenden; Cumberland; Daviess; Edmonson; Estill; Floyd; Fulton; Garrard; Graves; Grayson; Green; Hancock; Hardin; Harlan; Hart; Henderson; Hickman; Hopkins; Jackson; Johnson; Knott; Knox; Larue; Laurel; Lee; Leslie; Letcher; Lincoln; Livingston; Logan; Lyon; Madison [...]
+26981,NAD83 / Louisiana North,,,,United States (USA) - Louisiana - LA_N - counties of Avoyelles; Bienville; Bossier; Caddo; Caldwell; Catahoula; Claiborne; Concordia; De Soto; East Carroll; Franklin; Grant; Jackson; La Salle; Lincoln; Madison; Morehouse; Natchitoches; Ouachita; Rapides; Red River; Richland; Sabine; Tensas; Union; Vernon; Webster; West Carroll; Winn,projected 2D,,,East,North,X,Y,9001,,4269,11731,1995-06-02 00:00:00,,EPSG,,
+26982,NAD83 / Louisiana South,,,,United States (USA) - Louisiana - LA_S - counties of Acadia; Allen; Ascension; Assumption; Beauregard; Calcasieu; Cameron; East Baton Rouge; East Feliciana; Evangeline; Iberia; Iberville; Jefferson; Jefferson Davis; Lafayette; LaFourche; Livingston; Orleans; Plaquemines; Pointe Coupee; St. Bernard; St. Charles; St. Helena; St. James; St. John the Baptist; St. Landry; St. Martin; St. Mary; St. Tammany; Tangipahoa; Terrebonne; Vermilion; Washington; West Ba [...]
+26983,NAD83 / Maine East,,,,United States (USA) - Maine - ME_E - counties of Aroostook; Hancock; Knox; Penobscot; Piscataquis; Waldo; Washington,projected 2D,,,East,North,X,Y,9001,,4269,11831,1995-06-02 00:00:00,,EPSG,,
+26984,NAD83 / Maine West,,,,United States (USA) - Maine - ME_W - counties of Androscoggin; Cumberland; Franklin; Kennebec; Lincoln; Oxford; Sagadahoc; Somerset; York,projected 2D,,,East,North,X,Y,9001,,4269,11832,1995-06-02 00:00:00,,EPSG,,
+26985,NAD83 / Maryland,,,,United States (USA) - Maryland -MD - counties of Allegany; Anne Arundel; Baltimore; Calvert; Caroline; Carroll; Cecil; Charles; Dorchester; Frederick; Garrett; Harford; Howard; Kent; Montgomery; Prince Georges; Queen Annes; Somerset; St. Marys; Talbot; Washington; Wicomico; Worcester,projected 2D,,,East,North,X,Y,9001,,4269,11930,1995-06-02 00:00:00,,EPSG,,
+26986,NAD83 / Massachusetts Mainland,NAD83 / Massachusetts,,,United States (USA) - Massachusetts - MA_M - counties of Barnstable; Berkshire; Bristol; Essex; Franklin; Hampden; Hampshire; Middlesex; Norfolk; Plymouth; Suffolk; Worcester,projected 2D,,,East,North,X,Y,9001,,4269,12031,1995-06-02 00:00:00,,EPSG,,
+26987,NAD83 / Massachusetts Island,NAD83 / Massachusetts Is,,,United States (USA) - Massachusetts - MA_I - counties of Dukes; Nantucket,projected 2D,,,East,North,X,Y,9001,,4269,12032,1995-06-02 00:00:00,,EPSG,,
+26988,NAD83 / Michigan North,,,,United States (USA) - Michigan - MI_N - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft,projected 2D,,,East,North,X,Y,9001,,4269,12141,1995-06-02 00:00:00,,EPSG,,
+26989,NAD83 / Michigan Central,,,,United States (USA) - Michigan - MI_C - counties of Alcona; Alpena; Antrim; Arenac; Benzie; Charlevoix; Cheboygan; Clare; Crawford; Emmet; Gladwin; Grand Traverse; Iosco; Kalkaska; Lake; Leelanau; Manistee; Mason; Missaukee; Montmorency; Ogemaw; Osceola; Oscoda; Otsego; Presque Isle; Roscommon; Wexford,projected 2D,,,East,North,X,Y,9001,,4269,12142,1995-06-02 00:00:00,,EPSG,,
+26990,NAD83 / Michigan South,,,,United States (USA) - Michigan - MI_S - counties of Allegan; Barry; Bay; Berrien; Branch; Calhoun; Cass; Clinton; Eaton; Genesee; Gratiot; Hillsdale; Huron; Ingham; Ionia; Isabella; Jackson; Kalamazoo; Kent; Lapeer; Lenawee; Livingston; Macomb; Mecosta; Midland; Monroe; Montcalm; Muskegon; Newaygo; Oakland; Oceana; Ottawa; Saginaw; Sanilac; Shiawassee; St. Clair; St. Joseph; Tuscola; Van Buren; Washtenaw; Wayne,projected 2D,,,East,North,X,Y,9001,,4269,1214 [...]
+26991,NAD83 / Minnesota North,,,,United States (USA) - Minnesota - MN_N - counties of Beltrami; Clearwater; Cook; Itasca; Kittson; Koochiching; Lake; Lake of the Woods; Mahnomen; Marshall; Norman; Pennington; Polk; Red Lake; Roseau; St. Louis,projected 2D,,,East,North,X,Y,9001,,4269,12231,1995-06-02 00:00:00,,EPSG,,
+26992,NAD83 / Minnesota Central,NAD83 / Minnesota Cent.,,,United States (USA) - Minnesota - MN_C - counties of Aitkin; Becker; Benton; Carlton; Cass; Chisago; Clay; Crow Wing; Douglas; Grant; Hubbard; Isanti; Kanabec; Mille Lacs; Morrison; Otter Tail; Pine; Pope; Stearns; Stevens; Todd; Traverse; Wadena; Wilkin,projected 2D,,,East,North,X,Y,9001,,4269,12232,1995-06-02 00:00:00,,EPSG,,
+26993,NAD83 / Minnesota South,,,,United States (USA) - Minnesota - MN_S - counties of Anoka; Big Stone; Blue Earth; Brown; Carver; Chippewa; Cottonwood; Dakota; Dodge; Faribault; Fillmore; Freeborn; Goodhue; Hennepin; Houston; Jackson; Kandiyohi; Lac Qui Parle; Le Sueur; Lincoln; Lyon; Martin; McLeod; Meeker; Mower; Murray; Nicollet; Nobles; Olmsted; Pipestone; Ramsey; Redwood; Renville; Rice; Rock; Scott; Sherburne; Sibley; Steele; Swift; Wabasha; Waseca; Washington; Watonwan; Winona; W [...]
+26994,NAD83 / Mississippi East,,,,United States (USA) - Mississippi - MS_E - counties of Alcorn; Attala; Benton; Calhoun; Chickasaw; Choctaw; Clarke; Clay; Covington; Forrest; George; Greene; Hancock; Harrison; Itawamba; Jackson; Jasper; Jones; Kemper; Lafayette; Lamar; Lauderdale; Leake; Lee; Lowndes; Marshall; Monroe; Neshoba; Newton; Noxubee; Oktibbeha; Pearl River; Perry; Pontotoc; Prentiss; Scott; Smith; Stone; Tippah; Tishomingo; Union; Wayne; Webster; Winston,projected 2D,,,East,N [...]
+26995,NAD83 / Mississippi West,,,,United States (USA) - Mississippi - MS_W - counties of Adams; Amite; Bolivar; Carroll; Claiborne; Coahoma; Copiah; De Soto; Franklin; Grenada; Hinds; Holmes; Humphreys; Issaquena; Jefferson; Jefferson Davis; Lawrence; Leflore; Lincoln; Madison; Marion; Montgomery; Panola; Pike; Quitman; Rankin; Sharkey; Simpson; Sunflower; Tallahatchie; Tate; Tunica; Walthall; Warren; Washington; Wilkinson; Yalobusha; Yazoo,projected 2D,,,East,North,X,Y,9001,,4269,12332, [...]
+26996,NAD83 / Missouri East,,,,United States (USA) - Missouri - MO_E - counties of Bollinger; Butler; Cape Girardeau; Carter; Clark; Crawford; Dent; Dunklin; Franklin; Gasconade; Iron; Jefferson; Lewis; Lincoln; Madison; Marion; Mississippi; Montgomery; New Madrid; Oregon; Pemiscot; Perry; Pike; Ralls; Reynolds; Ripley; Scott; Shannon; St. Charles; St. Francois; St. Louis; Ste. Genevieve; Stoddard; Warren; Washington; Wayne,projected 2D,,,East,North,X,Y,9001,,4269,12431,1995-06-02 00:00 [...]
+26997,NAD83 / Missouri Central,,,,United States (USA) - Missouri - MO_C - counties of Adair; Audrain; Benton; Boone; Callaway; Camden; Carroll; Chariton; Christian; Cole; Cooper; Dallas; Douglas; Greene; Grundy; Hickory; Howard; Howell; Knox; Laclede; Linn; Livingston; Macon; Maries; Mercer; Miller; Moniteau; Monroe; Morgan; Osage; Ozark; Pettis; Phelps; Polk; Pulaski; Putnam; Randolph; Saline; Schuyler; Scotland; Shelby; Stone; Sullivan; Taney; Texas; Webster; Wright,projected 2D,,,East [...]
+26998,NAD83 / Missouri West,,,,United States (USA) - Missouri - MO_W - counties of Andrew; Atchison; Barry; Barton; Bates; Buchanan; Caldwell; Cass; Cedar; Clay; Clinton; Dade; Daviess; De Kalb; Gentry; Harrison; Henry; Holt; Jackson; Jasper; Johnson; Lafayette; Lawrence; McDonald; Newton; Nodaway; Platte; Ray; St. Clair; Vernon; Worth,projected 2D,,,East,North,X,Y,9001,,4269,12433,1995-06-02 00:00:00,,EPSG,,
+27038,Nahrwan 1967 / UTM zone 38N,Nahrwan 1967 / UTM 38N,,,Kuwait west of 48 deg East.,projected 2D,,,East,North,E,N,9001,,4270,16038,1996-04-12 00:00:00,,EPSG,,
+27039,Nahrwan 1967 / UTM zone 39N,Nahrwan 1967 / UTM 39N,,,Kuwait east of 48 deg East. United Arab Emirates (UAE) - Abu Dhabi - west of 54 deg East.,projected 2D,,,East,North,E,N,9001,,4270,16039,1996-04-12 00:00:00,,EPSG,,96.12
+27040,Nahrwan 1967 / UTM zone 40N,Nahrwan 1967 / UTM 40N,,,United Arab Emirates (UAE) - Abu Dhabi east of 54 deg East; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain.,projected 2D,,,East,North,E,N,9001,,4270,16040,1995-06-02 00:00:00,,EPSG,,
+27120,Naparima 1972 / UTM zone 20N,Naparima / UTM 20N,,,Trinidad and Tobago.,projected 2D,,,East,North,E,N,9001,,4271,16020,1995-06-02 00:00:00,,EPSG,,
+27200,GD49 / New Zealand Map Grid,GD49 / NZ Map Grid,,,New Zealand.,projected 2D,,,East,North,E,N,9001,,4272,19917,1995-06-02 00:00:00,,EPSG,Supersedes 27291 (GD49 / North Island Grid) and 27292 (GD49 / South Island Grid).,
+27291,GD49 / North Island Grid,,,,New Zealand - North Island.,projected 2D,,,East,North,E,N,9040,,4272,18141,1999-10-20 00:00:00,,EPSG,Sears 1922 British foot-metre conversion factor applied to ellipsoid. Superseded by 27200 (GD49 / New Zealand Map Grid).,97.231
+27292,GD49 / South Island Grid,,,,New Zealand - South Island.,projected 2D,,,East,North,E,N,9040,,4272,18142,1999-10-20 00:00:00,,EPSG,Sears 1922 British foot-metre conversion factor applied to ellipsoid. Superseded by 27200 (GD49 / New Zealand Map Grid).,97.231
+27391,NGO 1948 (Oslo) / NGO zone I,NGO 1948 / I,,,Norway - west of 3deg 30min W of Oslo (7deg 13min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18221,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 32N.,
+27392,NGO 1948 (Oslo) / NGO zone II,NGO 1948 / II,,,Norway - between 3deg 30min W and 1deg 10min W of Oslo (7deg 13min 20.5sec E and 9deg 33min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18222,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 32N.,
+27393,NGO 1948 (Oslo) / NGO zone III,NGO 1948 / III,,,Norway - between 1deg 10min W and 1deg 15min E of Oslo (9deg 33min 20.5sec E and 11deg 58min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18223,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 32N.,
+27394,NGO 1948 (Oslo) / NGO zone IV,NGO 1948 / IV,,,Norway - between 1deg 15min E and 4deg 20min E of Oslo (11deg 58min 20.5sec E and 15deg 03min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18224,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 32N and ETRF89 / UTM zone 33N.,
+27395,NGO 1948 (Oslo) / NGO zone V,NGO 1948 / V,,,Norway - between 4deg 20min E and 8deg 10min E of Oslo (15deg 03min 20.5sec E and 18deg 53min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18225,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 33N and ETRF89 / UTM zone 34N.,
+27396,NGO 1948 (Oslo) / NGO zone VI,NGO 1948 / VI,,,Norway - between 8deg 10min E and 12deg 10min E of Oslo (18deg 53min 20.5sec E and 22deg 53min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18226,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 34N.,
+27397,NGO 1948 (Oslo) / NGO zone VII,NGO 1948 / VII,,,Norway - between 12deg 10min E and 16deg 15min E of Oslo (22deg 53min 20.5sec E and 26deg 58min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18227,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 34N and ETRF89 / UTM zone 35N.,
+27398,NGO 1948 (Oslo) / NGO zone VIII,NGO 1948 / VIII,,,Norway - east of 16deg 15min E of Oslo (26deg 58min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18228,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work. To be phased out and replaced by ETRF89 / UTM zone 35N.,
+27429,Datum 73 / UTM zone 29N,,,,Portugal - onshore.,projected 2D,,,East,North,E,N,9001,,4274,16029,1995-06-02 00:00:00,,EPSG,,
+27500,ATF (Paris) / Nord de Guerre,ATF / Nord de Guerre,,,France - Alsace.,projected 2D,,,East,North,X,Y,9001,,4901,19903,1995-06-02 00:00:00,,EPSG,,
+27581,NTF (Paris) / France I,NTF / France I,,,France north of 53.5 grads (48 deg 09 min) North.,projected 2D,,,East,North,X,Y,9001,,4807,18081,1996-04-12 00:00:00,,EPSG,Introduced 1972. Supersedes NTF / Nord France (code 27591).,95.26
+27582,NTF (Paris) / France II,NTF / France II,,,France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North. Also used over all mainlanf France.,projected 2D,,,East,North,X,Y,9001,,4807,18082,1996-04-12 00:00:00,,EPSG,Introduced 1972. Supersedes NTF / Centre France (code 27592).,95.26
+27583,NTF (Paris) / France III,NTF / France III,,,France south of 50.5 grads (45 deg 27 min) North.,projected 2D,,,East,North,X,Y,9001,,4807,18083,1996-04-12 00:00:00,,EPSG,Introduced 1972. Supersedes NTF / Sud France (code 27593).,95.26
+27584,NTF (Paris) / France IV,NTF / France IV,,,France - Corsica,projected 2D,,,East,North,X,Y,9001,,4807,18084,1996-04-12 00:00:00,,EPSG,Introduced 1972. Supersedes NTF / Corse (code 27594).,
+27591,NTF (Paris) / Nord France,NTF / Nord France,,,France north of 53.5 grads (48 deg 09 min) North.,projected 2D,,,East,North,X,Y,9001,,4807,18091,1996-04-12 00:00:00,,EPSG,Superseded by NTF / France I (code 27581) from 1972.,95.26
+27592,NTF (Paris) / Centre France,NTF / Centre France,,,France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.,projected 2D,,,East,North,X,Y,9001,,4807,18092,1996-04-12 00:00:00,,EPSG,Superseded by NTF / France II (code 27582) from 1972.,95.26
+27593,NTF (Paris) / Sud France,NTF / Sud France,,,France south of 50.5 grads (45 deg 27 min) North.,projected 2D,,,East,North,X,Y,9001,,4807,18093,1996-04-12 00:00:00,,EPSG,Superseded by NTF / France III (code 27583) from 1972.,95.26
+27594,NTF (Paris) / Corse,NTF / Corse,,,France - Corsica,projected 2D,,,East,North,X,Y,9001,,4807,18094,1996-04-12 00:00:00,,EPSG,Superseded by NTF / France IV (code 27584) from 1972.,
+27700,OSGB 1936 / British National Grid,British National Grid,,,United Kingdom (UK) - onshore England; Scotland; Wales; Isle of Man.,projected 2D,,,East,North,E,N,9001,,4277,19916,1995-06-02 00:00:00,,EPSG,,
+28191,Palestine 1923 / Palestine Grid,Palestine Grid,,,Israel; Jordan,projected 2D,,,East,North,E,N,9001,,4281,18201,1999-04-22 00:00:00,,EPSG,,
+28192,Palestine 1923 / Palestine Belt,Palestine Belt,,,Israel; Jordan,projected 2D,,,East,North,E,N,9001,,4281,18202,1999-04-22 00:00:00,,EPSG,,
+28193,Palestine 1923 / Israeli CS Grid,Israeli CS Grid,,,Israel.,projected 2D,,,East,North,E,N,9001,,4281,18203,1999-10-20 00:00:00,Survey of Israel.,EPSG,Superceded by Israeli TM Grid (EPSG code 239).,
+28232,Pointe Noire / UTM zone 32S,Point Noire / UTM 32S,,,Congo.,projected 2D,,,East,North,E,N,9001,,4282,16132,1995-06-02 00:00:00,,EPSG,,
+28348,GDA94 / MGA zone 48,,,,Australia - 102deg East to 108deg East.,projected 2D,,,East,North,E,N,9001,,4283,17348,1995-06-02 00:00:00,,EPSG,,
+28349,GDA94 / MGA zone 49,,,,Australia - 108deg East to 114deg East.,projected 2D,,,East,North,E,N,9001,,4283,17349,1995-06-02 00:00:00,,EPSG,,
+28350,GDA94 / MGA zone 50,,,,Australia - 114deg East to 120deg East.,projected 2D,,,East,North,E,N,9001,,4283,17350,1995-06-02 00:00:00,,EPSG,,
+28351,GDA94 / MGA zone 51,,,,Australia - 120deg East to 126deg East.,projected 2D,,,East,North,E,N,9001,,4283,17351,1995-06-02 00:00:00,,EPSG,,
+28352,GDA94 / MGA zone 52,,,,Australia - 126deg East to 132deg East.,projected 2D,,,East,North,E,N,9001,,4283,17352,1995-06-02 00:00:00,,EPSG,,
+28353,GDA94 / MGA zone 53,,,,Australia - 132deg East to 138deg East.,projected 2D,,,East,North,E,N,9001,,4283,17353,1995-06-02 00:00:00,,EPSG,,
+28354,GDA94 / MGA zone 54,,,,Australia - 138deg East to 144deg East.,projected 2D,,,East,North,E,N,9001,,4283,17354,1995-06-02 00:00:00,,EPSG,,
+28355,GDA94 / MGA zone 55,,,,Australia - 144deg East to 150deg East.,projected 2D,,,East,North,E,N,9001,,4283,17355,1995-06-02 00:00:00,,EPSG,,
+28356,GDA94 / MGA zone 56,,,,Australia - 150deg East to 156deg East.,projected 2D,,,East,North,E,N,9001,,4283,17356,1995-06-02 00:00:00,,EPSG,,
+28357,GDA94 / MGA zone 57,,,,Australia - 156deg East to 162deg East.,projected 2D,,,East,North,E,N,9001,,4283,17357,1995-06-02 00:00:00,,EPSG,,
+28358,GDA94 / MGA zone 58,,,,Australia - 162deg East to 168deg East.,projected 2D,,,East,North,E,N,9001,,4283,17358,1995-06-02 00:00:00,,EPSG,,
+28402,Pulkovo 1942 / Gauss-Kruger zone 2,1942 Coord. Sys. zone 2,,,Czech Republic and Germany (former DDR) - west of 12 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16202,1998-06-30 00:00:00,,EPSG,,
+28403,Pulkovo 1942 / Gauss-Kruger zone 3,1942 Coord. Sys. zone 3,,,Czech Republic and Germany ( former DDR) - east of 12 deg East; Poland and Slovakia - west of 18 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16203,1998-06-30 00:00:00,,EPSG,,
+28404,Pulkovo 1942 / Gauss-Kruger zone 4,1942 Coord. Sys. zone 4,,,Estonia; Latvia; Lithuania; Russia; Ukraine; - west of 24 deg East; Poland - east of 24 deg East; Slovakia east of 18 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16204,1995-06-02 00:00:00,,EPSG,,
+28405,Pulkovo 1942 / Gauss-Kruger zone 5,1942 Coord. Sys. zone 5,,,Belarus - west of 30 deg East; Estonia; Latvia & Lithuania - east of 24 deg East; Moldova; Russia & Ukraine - 24 deg to 30 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16205,1995-06-02 00:00:00,,EPSG,,
+28406,Pulkovo 1942 / Gauss-Kruger zone 6,1942 Coord. Sys. zone 6,,,Belarus - east of 30 deg East; Russia & Ukraine - 30 deg to 36 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16206,1995-06-02 00:00:00,,EPSG,,
+28407,Pulkovo 1942 / Gauss-Kruger zone 7,1942 Coord. Sys. zone 7,,,Georgia - west of 36 deg East; Russia - 36 deg to 42 deg East; Ukraine - east of 36 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16207,1995-06-02 00:00:00,,EPSG,,
+28408,Pulkovo 1942 / Gauss-Kruger zone 8,1942 Coord. Sys. zone 8,,,Armenia Azerbaijan - west of 48 deg East; Georgia - east of 42 deg East; Russia - 42 deg to 48 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16208,1995-06-02 00:00:00,,EPSG,,
+28409,Pulkovo 1942 / Gauss-Kruger zone 9,1942 Coord. Sys. zone 9,,,Azerbaijan - east of 48 deg East; Kazakstan - west of 54 deg East; Russia - 48 deg to 54 deg East; Turkmenistan - west of 54 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16209,1995-06-02 00:00:00,,EPSG,,
+28410,Pulkovo 1942 / Gauss-Kruger zone 10,1942 Coord. Sys. zone 10,,,Kazakstan; Russia; Turkmenistan - 54 deg to 60 deg East; Uzbekistan - west of 60 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16210,1995-06-02 00:00:00,,EPSG,,
+28411,Pulkovo 1942 / Gauss-Kruger zone 11,1942 Coord. Sys. zone 11,,,Kazakstan; Russia; Uzbekistan - 60 deg to 66 deg East; Turkmenistan - east of 60 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16211,1995-06-02 00:00:00,,EPSG,,
+28412,Pulkovo 1942 / Gauss-Kruger zone 12,1942 Coord. Sys. zone 12,,,Kazakstan & Russia - 66 deg to 72 deg East; Kirgistan & Tadzhikstan - west of 72 deg East; Uzbekistan - east of 66 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16212,1995-06-02 00:00:00,,EPSG,,
+28413,Pulkovo 1942 / Gauss-Kruger zone 13,1942 Coord. Sys. zone 13,,,Kazakstan; Kirgizstan; Russia - 72 deg to 78 deg East; Tadzhikstan - east of 72 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16213,1995-06-02 00:00:00,,EPSG,,
+28414,Pulkovo 1942 / Gauss-Kruger zone 14,1942 Coord. Sys. zone 14,,,Kazakstan & Russia - 78 deg to 84 deg East; Kirgizstan - east of 78 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16214,1995-06-02 00:00:00,,EPSG,,
+28415,Pulkovo 1942 / Gauss-Kruger zone 15,1942 Coord. Sys. zone 15,,,Kazakstan - east of 84 deg East; Russia - 84 deg to 90 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16215,1995-06-02 00:00:00,,EPSG,,
+28416,Pulkovo 1942 / Gauss-Kruger zone 16,1942 Coord. Sys. zone 16,,,Russia - 90 deg to 96 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16216,1995-06-02 00:00:00,,EPSG,,
+28417,Pulkovo 1942 / Gauss-Kruger zone 17,1942 Coord. Sys. zone 17,,,Russia - 96 deg to 102deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16217,1995-06-02 00:00:00,,EPSG,,
+28418,Pulkovo 1942 / Gauss-Kruger zone 18,1942 Coord. Sys. zone 18,,,Russia - 102 deg to 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16218,1995-06-02 00:00:00,,EPSG,,
+28419,Pulkovo 1942 / Gauss-Kruger zone 19,1942 Coord. Sys. zone 19,,,Russia - 108 deg to 114 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16219,1995-06-02 00:00:00,,EPSG,,
+28420,Pulkovo 1942 / Gauss-Kruger zone 20,1942 Coord. Sys. zone 20,,,Russia - 114 deg to 120 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16220,1995-06-02 00:00:00,,EPSG,,
+28421,Pulkovo 1942 / Gauss-Kruger zone 21,1942 Coord. Sys. zone 21,,,Russia - 120 deg to 126 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16221,1995-06-02 00:00:00,,EPSG,,
+28422,Pulkovo 1942 / Gauss-Kruger zone 22,1942 Coord. Sys. zone 22,,,Russia - 126 deg to 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16222,1995-06-02 00:00:00,,EPSG,,
+28423,Pulkovo 1942 / Gauss-Kruger zone 23,1942 Coord. Sys. zone 23,,,Russia - 132 deg to 138 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16223,1995-06-02 00:00:00,,EPSG,,
+28424,Pulkovo 1942 / Gauss-Kruger zone 24,1942 Coord. Sys. zone 24,,,Russia - 138 deg to 144 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16224,1995-06-02 00:00:00,,EPSG,,
+28425,Pulkovo 1942 / Gauss-Kruger zone 25,1942 Coord. Sys. zone 25,,,Russia - 144 deg to 150 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16225,1995-06-02 00:00:00,,EPSG,,
+28426,Pulkovo 1942 / Gauss-Kruger zone 26,1942 Coord. Sys. zone 26,,,Russia - 150 deg to 156 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16226,1995-06-02 00:00:00,,EPSG,,
+28427,Pulkovo 1942 / Gauss-Kruger zone 27,1942 Coord. Sys. zone 27,,,Russia - 156 deg to 162 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16227,1995-06-02 00:00:00,,EPSG,,
+28428,Pulkovo 1942 / Gauss-Kruger zone 28,1942 Coord. Sys. zone 28,,,Russia - 162 deg to 168 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16228,1995-06-02 00:00:00,,EPSG,,
+28429,Pulkovo 1942 / Gauss-Kruger zone 29,1942 Coord. Sys. zone 29,,,Russia - 168 deg to 174 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16229,1995-06-02 00:00:00,,EPSG,,
+28430,Pulkovo 1942 / Gauss-Kruger zone 30,1942 Coord. Sys. zone 30,,,Russia - 174 deg East to 180 deg.,projected 2D,,,North,East,X,Y,9001,,4284,16230,1995-06-02 00:00:00,,EPSG,,
+28431,Pulkovo 1942 / Gauss-Kruger zone 31,1942 Coord. Sys. zone 31,,,Russia - 180 deg to 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4284,16231,1995-06-02 00:00:00,,EPSG,,
+28432,Pulkovo 1942 / Gauss-Kruger zone 32,1942 Coord. Sys. zone 32,,,Russia - east of 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4284,16232,1995-06-02 00:00:00,,EPSG,,
+28462,Pulkovo 1942 / Gauss-Kruger 2N,Pulkovo / Gauss 2N,,,Czech Republic and Germany (former DDR) - west of 12 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16302,1998-06-30 00:00:00,,EPSG,,
+28463,Pulkovo 1942 / Gauss-Kruger 3N,Pulkovo / Gauss 3N,,,Czech Republic and Germany ( former DDR) - east of 12 deg East; Poland and Slovakia - west of 18 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16303,1998-06-30 00:00:00,,EPSG,,
+28464,Pulkovo 1942 / Gauss-Kruger 4N,Pulkovo / Gauss 4N,,,Estonia; Latvia; Lithuania; Russia; Ukraine; - west of 24 deg East; Poland - east of 24 deg East; Slovakia east of 18 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16304,1995-06-02 00:00:00,,EPSG,,
+28465,Pulkovo 1942 / Gauss-Kruger 5N,Pulkovo / Gauss 5N,,,Belarus - west of 30 deg East; Estonia; Latvia & Lithuania - east of 24 deg East; Moldova; Russia & Ukraine - 24 deg to 30 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16305,1995-06-02 00:00:00,,EPSG,,
+28466,Pulkovo 1942 / Gauss-Kruger 6N,Pulkovo / Gauss 6N,,,Belarus - east of 30 deg East; Russia & Ukraine - 30 deg to 36 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16306,1995-06-02 00:00:00,,EPSG,,
+28467,Pulkovo 1942 / Gauss-Kruger 7N,Pulkovo / Gauss 7N,,,Georgia - west of 36 deg East; Russia - 36 deg to 42 deg East; Ukraine - east of 36 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16307,1995-06-02 00:00:00,,EPSG,,
+28468,Pulkovo 1942 / Gauss-Kruger 8N,Pulkovo / Gauss 8N,,,Armenia - west of 48 deg East; Azerbaijan - west of 48 deg East; Georgia - east of 42 deg East; Russia - 42 deg to 48 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16308,1995-06-02 00:00:00,,EPSG,,
+28469,Pulkovo 1942 / Gauss-Kruger 9N,Pulkovo / Gauss 9N,,,Azerbaijan - east of 48 deg East; Kazakstan - west of 54 deg East; Russia - 48 deg to 54 deg East; Turkmenistan - west of 54 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16309,1995-06-02 00:00:00,,EPSG,,
+28470,Pulkovo 1942 / Gauss-Kruger 10N,Pulkovo / Gauss 10N,,,Kazakstan; Russia; Turkmenistan - 54 deg to 60 deg East; Uzbekistan - west of 60 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16310,1995-06-02 00:00:00,,EPSG,,
+28471,Pulkovo 1942 / Gauss-Kruger 11N,Pulkovo / Gauss 11N,,,Kazakstan; Russia; Uzbekistan - 60 deg to 66 deg East; Turkmenistan - east of 60 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16311,1995-06-02 00:00:00,,EPSG,,
+28472,Pulkovo 1942 / Gauss-Kruger 12N,Pulkovo / Gauss 12N,,,Kazakstan & Russia - 66 deg to 72 deg East; Kirgistan & Tadzhikstan - west of 72 deg East; Uzbekistan - east of 66 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16312,1995-06-02 00:00:00,,EPSG,,
+28473,Pulkovo 1942 / Gauss-Kruger 13N,Pulkovo / Gauss 13N,,,Kazakstan; Kirgizstan; Russia - 72 deg to 78 deg East; Tadzhikstan - east of 72 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16313,1995-06-02 00:00:00,,EPSG,,
+28474,Pulkovo 1942 / Gauss-Kruger 14N,Pulkovo / Gauss 14N,,,Kazakstan & Russia - 78 deg to 84 deg East; Kirgizstan - east of 78 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16314,1995-06-02 00:00:00,,EPSG,,
+28475,Pulkovo 1942 / Gauss-Kruger 15N,Pulkovo / Gauss 15N,,,Kazakstan - east of 84 deg East; Russia - 84 deg to 90 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16315,1995-06-02 00:00:00,,EPSG,,
+28476,Pulkovo 1942 / Gauss-Kruger 16N,Pulkovo / Gauss 16N,,,Russia - 90 deg to 96 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16316,1995-06-02 00:00:00,,EPSG,,
+28477,Pulkovo 1942 / Gauss-Kruger 17N,Pulkovo / Gauss 17N,,,Russia - 96 deg to 102deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16317,1995-06-02 00:00:00,,EPSG,,
+28478,Pulkovo 1942 / Gauss-Kruger 18N,Pulkovo / Gauss 18N,,,Russia - 102 deg to 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16318,1995-06-02 00:00:00,,EPSG,,
+28479,Pulkovo 1942 / Gauss-Kruger 19N,Pulkovo / Gauss 19N,,,Russia - 108 deg to 114 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16319,1995-06-02 00:00:00,,EPSG,,
+28480,Pulkovo 1942 / Gauss-Kruger 20N,Pulkovo / Gauss 20N,,,Russia - 114 deg to 120 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16320,1995-06-02 00:00:00,,EPSG,,
+28481,Pulkovo 1942 / Gauss-Kruger 21N,Pulkovo / Gauss 21N,,,Russia - 120 deg to 126 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16321,1995-06-02 00:00:00,,EPSG,,
+28482,Pulkovo 1942 / Gauss-Kruger 22N,Pulkovo / Gauss 22N,,,Russia - 126 deg to 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16322,1995-06-02 00:00:00,,EPSG,,
+28483,Pulkovo 1942 / Gauss-Kruger 23N,Pulkovo / Gauss 23N,,,Russia - 132 deg to 138 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16323,1995-06-02 00:00:00,,EPSG,,
+28484,Pulkovo 1942 / Gauss-Kruger 24N,Pulkovo / Gauss 24N,,,Russia - 138 deg to 144 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16324,1995-06-02 00:00:00,,EPSG,,
+28485,Pulkovo 1942 / Gauss-Kruger 25N,Pulkovo / Gauss 25N,,,Russia - 144 deg to 150 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16325,1995-06-02 00:00:00,,EPSG,,
+28486,Pulkovo 1942 / Gauss-Kruger 26N,Pulkovo / Gauss 26N,,,Russia - 150 deg to 156 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16326,1995-06-02 00:00:00,,EPSG,,
+28487,Pulkovo 1942 / Gauss-Kruger 27N,Pulkovo / Gauss 27N,,,Russia - 156 deg to 162 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16327,1995-06-02 00:00:00,,EPSG,,
+28488,Pulkovo 1942 / Gauss-Kruger 28N,Pulkovo / Gauss 28N,,,Russia - 162 deg to 168 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16328,1995-06-02 00:00:00,,EPSG,,
+28489,Pulkovo 1942 / Gauss-Kruger 29N,Pulkovo / Gauss 29N,,,Russia - 168 deg to 174 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16329,1995-06-02 00:00:00,,EPSG,,
+28490,Pulkovo 1942 / Gauss-Kruger 30N,Pulkovo / Gauss 30N,,,Russia - 174 deg East to 180 deg.,projected 2D,,,North,East,X,Y,9001,,4284,16330,1995-06-02 00:00:00,,EPSG,,
+28491,Pulkovo 1942 / Gauss-Kruger 31N,Pulkovo / Gauss 31N,,,Russia - 180 deg to 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4284,16331,1995-06-02 00:00:00,,EPSG,,
+28492,Pulkovo 1942 / Gauss-Kruger 32N,Pulkovo / Gauss 32N,,,Russia - east of 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4284,16332,1995-06-02 00:00:00,,EPSG,,
+28600,Qatar / Qatar National Grid,Qatar National Grid,,,Qatar - onshore.,projected 2D,,,East,North,E,N,9001,,4286,19919,1995-06-02 00:00:00,,EPSG,,
+28991,RD / Netherlands Old,,,,Netherlands - onshore.,projected 2D,,,East,North,X,Y,9001,,4289,19913,1995-06-02 00:00:00,,EPSG,Superseded by 28992 (RD / Netherlands New).,
+28992,RD / Netherlands New,,,,Netherlands - onshore.,projected 2D,,,East,North,X,Y,9001,,4289,19914,1995-06-02 00:00:00,,EPSG,Supersedes 28991 (RD / Netherlands Old).,
+29100,SAD69 / Brazil Polyconic,,,,Brazil,projected 2D,,,East,North,X,Y,9001,,4291,19941,1999-04-22 00:00:00,PetroBras,EPSG,,
+29118,SAD69 / UTM zone 18N,,,,South America - 78deg West to 72deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16018,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.251. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29119,SAD69 / UTM zone 19N,,,,South America - 72deg West to 66deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16019,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29120,SAD69 / UTM zone 20N,,,,South America - 66deg West to 60deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16020,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29121,SAD69 / UTM zone 21N,,,,South America - 60deg West to 54deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16021,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29122,SAD69 / UTM zone 22N,,,,South America - 54deg West to 48deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16022,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29177,SAD69 / UTM zone 17S,,,,South America - 84deg West to 78deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16117,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29178,SAD69 / UTM zone 18S,,,,South America - Brazil - 78deg West to 72deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16118,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29179,SAD69 / UTM zone 19S,,,,South America - Brazil - 72deg West to 66deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16119,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29180,SAD69 / UTM zone 20S,,,,South America - Brazil - 66deg West to 60deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16120,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29181,SAD69 / UTM zone 21S,,,,South America - Brazil - 60deg West to 54deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16121,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29182,SAD69 / UTM zone 22S,,,,South America - Brazil - 54deg West to 48deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16122,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29183,SAD69 / UTM zone 23S,,,,South America - 48deg West to 42deg West.,projected 2D,,,East,North,E,N,9001,,4291,16123,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29184,SAD69 / UTM zone 24S,,,,South America - Brazil - 42deg West to 36deg West.,projected 2D,,,East,North,E,N,9001,,4291,16124,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29185,SAD69 / UTM zone 25S,,,,South America - 36deg West to 30deg West.,projected 2D,,,East,North,E,N,9001,,4291,16125,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places. Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252. Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29220,Sapper Hill 1943 / UTM zone 20S,Sapper Hill / UTM 20S,,,Falkland Islands - west of 60 deg West.,projected 2D,,,East,North,E,N,9001,,4292,16120,1995-06-02 00:00:00,,EPSG,,
+29221,Sapper Hill 1943 / UTM zone 21S,Sapper Hill / UTM 21S,,,Falkland Islands - east of 60 deg West.,projected 2D,,,East,North,E,N,9001,,4292,16121,1995-06-02 00:00:00,,EPSG,,
+29333,Schwarzeck / UTM zone 33S,Schwarzeck / UTM 33S,,,Namibia - offshore.,projected 2D,,,East,North,E,N,9001,,4293,16133,1996-04-12 00:00:00,,EPSG,,
+29371,South West African Coord. System zone 11,SW African CS zone 11,,,Namibia - west of 12 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17611,1997-06-16 00:00:00,,EPSG,,97.16
+29373,South West African Coord. System zone 13,SW African CS zone 13,,,Namibia - 12 to 14 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17613,1997-06-16 00:00:00,,EPSG,,97.16
+29375,South West African Coord. System zone 15,SW African CS zone 15,,,Namibia - 14 to 16 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17615,1997-06-16 00:00:00,,EPSG,,97.16
+29377,South West African Coord. System zone 17,SW African CS zone 17,,,Namibia - 16 to 18 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17617,1997-06-16 00:00:00,,EPSG,,97.16
+29379,South West African Coord. System zone 19,SW African CS zone 19,,,Namibia - 18 to 20 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17619,1997-06-16 00:00:00,,EPSG,,97.16
+29381,South West African Coord. System zone 21,SW African CS zone 21,,,Namibia - 20 to 22 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17621,1997-06-16 00:00:00,,EPSG,,97.16
+29383,South West African Coord. System zone 23,SW African CS zone 23,,,Namibia - 22 to 24 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17623,1997-06-16 00:00:00,,EPSG,,97.16
+29385,South West African Coord. System zone 25,SW African CS zone 25,,,Namibia - east of 24 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17625,1997-06-16 00:00:00,,EPSG,,97.16
+29635,Sudan / UTM zone 35N,,,,Sudan - south - west of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4296,16035,1995-06-02 00:00:00,,EPSG,,
+29636,Sudan / UTM zone 36N,,,,Sudan - south - east of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4296,16036,1995-06-02 00:00:00,,EPSG,,
+29700,Tananarive (Paris) / Laborde Grid,Tananarive / Laborde,,,Madagascar.,projected 2D,,,East,North,X,Y,9001,,4810,19911,1995-06-02 00:00:00,,EPSG,,
+29738,Tananarive / UTM zone 38S,Tananarive / UTM 38S,,,Madagascar - offshore west of 48 deg East.,projected 2D,,,East,North,E,N,9001,,4297,16138,1995-06-02 00:00:00,,EPSG,,
+29739,Tananarive / UTM zone 39S,Tananarive / UTM 39S,,,Madagascar - offshore east of 48 deg East.,projected 2D,,,East,North,E,N,9001,,4297,16139,1995-06-02 00:00:00,,EPSG,,
+29849,Timbalai 1948 / UTM zone 49N,Timbalai 1948 / UTM 49N,,,Brunei - offshore; Malaysia - East Malaysia (Sarawak).,projected 2D,,,East,North,E,N,9001,,4298,16049,1995-06-02 00:00:00,,EPSG,,
+29850,Timbalai 1948 / UTM zone 50N,Timbalai 1948 / UTM 50N,,,Brunei - offshore; Malaysia - East Malaysia (Sabah).,projected 2D,,,East,North,E,N,9001,,4298,16050,1995-06-02 00:00:00,,EPSG,,
+29871,Timbalai 1948 / R.S.O. Borneo (ch),Timbalai / Borneo (ch),,,Malaysia - East Malaysia (Sabah; Sarawak).,projected 2D,,,East,North,E,N,9042,,4298,19912,1999-10-20 00:00:00,,EPSG,Adopts metric conversion of 39.370147 inches per metre.,97.231
+29872,Timbalai 1948 / R.S.O. Borneo (ft),Timbalai / Borneo (ft),,,Brunei; Malaysia - East Malaysia (Sabah; Sarawak).,projected 2D,,,East,North,E,N,9041,,4298,19912,1999-10-20 00:00:00,,EPSG,Original projection definition in chains. 1 chain = 66 feet=792 inches. Adopts metric conversion of 39.370147 inches per metre.,97.231
+29873,Timbalai 1948 / R.S.O. Borneo (m),Timbalai / Borneo (m),,,Brunei.,projected 2D,,,East,North,E,N,9001,,4298,19912,1997-07-22 00:00:00,,EPSG,Original projection definition in chains. 1 chain = 66 feet=792 inches. Adopts metric conversion of 39.370147 inches per metre.,
+29900,TM65 / Irish National Grid,TM65 / Irish Nat Grid,,,Ireland - onshore; United Kingdom (UK) - Northern Ireland (Ulster) onshore,projected 2D,,,East,North,E,N,9001,,4299,19908,1995-06-02 00:00:00,,EPSG,,
+30161,Tokyo / Japan Plane Rectangular CS I,Tokyo / Japan zone I,,,Japan - Kyushu - Nagasaki-ken; islands of Kagoshima-ken between 27 and 32 deg N and between 128 deg 18 min and 130 deg E (between 128 deg 18 min and 30 deg 13 min E for Amami islands).,projected 2D,,,North,East,X,Y,9001,,4301,17801,1998-12-12 00:00:00,,EPSG,,
+30162,Tokyo / Japan Plane Rectangular CS II,Tokyo / Japan zone II,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17802,1998-12-12 00:00:00,,EPSG,,
+30163,Tokyo / Japan Plane Rectangular CS III,Tokyo / Japan zone III,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17803,1998-12-12 00:00:00,,EPSG,,
+30164,Tokyo / Japan Plane Rectangular CS IV,Tokyo / Japan zone IV,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17804,1998-12-12 00:00:00,,EPSG,,
+30165,Tokyo / Japan Plane Rectangular CS V,Tokyo / Japan zone V,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17805,1998-12-12 00:00:00,,EPSG,,
+30166,Tokyo / Japan Plane Rectangular CS VI,Tokyo / Japan zone VI,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17806,1998-12-12 00:00:00,,EPSG,,
+30167,Tokyo / Japan Plane Rectangular CS VII,Tokyo / Japan zone VII,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17807,1998-12-12 00:00:00,,EPSG,,
+30168,Tokyo / Japan Plane Rectangular CS VIII,Tokyo / Japan zone VIII,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17808,1998-12-12 00:00:00,,EPSG,,
+30169,Tokyo / Japan Plane Rectangular CS IX,Tokyo / Japan zone IX,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17809,1998-12-12 00:00:00,,EPSG,,
+30170,Tokyo / Japan Plane Rectangular CS X,Tokyo / Japan zone X,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17810,1998-12-12 00:00:00,,EPSG,,
+30171,Tokyo / Japan Plane Rectangular CS XI,Tokyo / Japan zone XI,,,Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,projected 2D,,,North,East,X,Y,9001,,4301,17811,1998-12-12 00:00:00,,EPSG,,
+30172,Tokyo / Japan Plane Rectangular CS XII,Tokyo / Japan zone XII,,,Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,projected 2D,,,North,East,X,Y,9001,,4301,17812,1998-12-12 00:00:00,,EPSG,,
+30173,Tokyo / Japan Plane Rectangular CS XIII,Tokyo / Japan zone XIII,,,Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,projected 2D,,,North,East,X,Y,9001,,4301,17813,1998-12-12 00:00:00,,EPSG,,
+30174,Tokyo / Japan Plane Rectangular CS XIV,Tokyo / Japan zone XIV,,,Japan - Tokyo-to south of 28 deg N & between 140 deg 30 min & 143 deg E.,projected 2D,,,North,East,X,Y,9001,,4301,17814,1998-12-12 00:00:00,,EPSG,Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.,
+30175,Tokyo / Japan Plane Rectangular CS XV,Tokyo / Japan zone XV,,,Japan - Okinawa-ken between 126 deg &130 deg E.,projected 2D,,,North,East,X,Y,9001,,4301,17815,1998-12-12 00:00:00,,EPSG,,
+30176,Tokyo / Japan Plane Rectangular CS XVI,Tokyo / Japan zone XVI,,,Japan - Okinawa-ken west of 126 deg E.,projected 2D,,,North,East,X,Y,9001,,4301,17816,1998-12-12 00:00:00,,EPSG,,
+30177,Tokyo / Japan Plane Rectangular CS XVII,Tokyo / Japan zone XVII,,,Japan - Okinawa-ken east of 130 deg E.,projected 2D,,,North,East,X,Y,9001,,4301,17817,1998-12-12 00:00:00,,EPSG,Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.,
+30178,Tokyo / Japan Plane Rectangular CS XVIII,Tokyo / Japan zone XVIII,,,Japan - Tokyo-to south of 28 N & west of 140 deg 30 min E.,projected 2D,,,North,East,X,Y,9001,,4301,17818,1998-12-12 00:00:00,,EPSG,Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.,
+30179,Tokyo / Japan Plane Rectangular CS XIX,Tokyo / Japan zone XIX,,,Japan - Tokyo-to south of 28 N & east of 143 deg E.,projected 2D,,,North,East,X,Y,9001,,4301,17819,1998-12-12 00:00:00,,EPSG,Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.,
+30200,Trinidad 1903 / Trinidad Grid,Trinidad 1903 / Trinidad,,,Trinidad and Tobago - Trinidad,projected 2D,,,East,North,E,N,9039,,4302,19925,1999-10-20 00:00:00,,EPSG,,97.231
+30339,TC(1948) / UTM zone 39N,,,,United Arab Emirates (UAE) - Abu Dhabi west of 54 deg East.,projected 2D,,,East,North,E,N,9001,,4303,16039,1995-06-02 00:00:00,,EPSG,,
+30340,TC(1948) / UTM zone 40N,,,,United Arab Emirates (UAE) - Abu Dhabi east of 54 deg East; Dubai.,projected 2D,,,East,North,E,N,9001,,4303,16040,1995-06-02 00:00:00,,EPSG,,
+30491,Voirol 1875 / Nord Algerie (ancienne),Voirol /N Algerie ancien,,,Algeria - north of 38.5 grads (34 deg 39 min) North.,projected 2D,,,East,North,X,Y,9001,,4304,18011,1995-06-02 00:00:00,,EPSG,Superseded by 30591 (Voirol Unifie / Algeria Nord).,
+30492,Voirol 1875 / Sud Algerie (ancienne),Voirol /S Algerie ancien,,,Algeria - 35 grads to 38.5 grads (31 deg 30 min to 34 deg 39 min) North.,projected 2D,,,East,North,X,Y,9001,,4304,18012,1995-06-02 00:00:00,,EPSG,Superseded by 30592 (Voirol Unifie / Algeria Sud).,
+30591,Voirol Unifie / Nord Algerie,Voirol Unifie /N Algerie,,,Algeria - north of 38.5 grads (34 deg 39 min) North.,projected 2D,,,East,North,X,Y,9001,,4305,18021,1995-06-02 00:00:00,,EPSG,Supersedes 30491 (Voirol 1875 / Nord Algeria ancienne).,
+30592,Voirol Unifie / Sud Algerie,Voirol Unifie /S Algerie,,,Algeria - 35 grads to 38.5 grads (31 deg 30 min to 34 deg 39 min) North.,projected 2D,,,East,North,X,Y,9001,,4305,18022,1995-06-02 00:00:00,,EPSG,Supersedes 30492 (Voirol 1875 / Sud Algeria ancienne).,
+30729,Nord Sahara 1959 / UTM zone 29N,Nord Sahara / UTM 29N,,,Algeria west of 6 deg West (of Greenwich).,projected 2D,,,East,North,E,N,9001,,4307,16029,1996-04-12 00:00:00,,EPSG,,
+30730,Nord Sahara 1959 / UTM zone 30N,Nord Sahara / UTM 30N,,,Algeria 6 deg West to 0 deg East (of Greenwich).,projected 2D,,,East,North,E,N,9001,,4307,16030,1996-04-12 00:00:00,,EPSG,,
+30731,Nord Sahara 1959 / UTM zone 31N,Nord Sahara / UTM 31N,,,Algeria 0 deg to 6 deg East (of Greenwich).,projected 2D,,,East,North,E,N,9001,,4307,16031,1996-04-12 00:00:00,,EPSG,,
+30732,Nord Sahara 1959 / UTM zone 32N,Nord Sahara / UTM 32N,,,Algeria east of 6 deg East (of Greenwich).,projected 2D,,,East,North,E,N,9001,,4307,16032,1996-04-12 00:00:00,,EPSG,,
+30800,RT38 2.5 gon W,,,,Sweden,projected 2D,,,North,East,X,Y,9001,,4308,19929,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,,97.14 97.39
+31028,Yoff / UTM zone 28N,,,,Senegal.,projected 2D,,,East,North,E,N,9001,,4310,16028,1995-06-02 00:00:00,,EPSG,,
+31121,Zanderij / UTM zone 21N,,,,Suriname.,projected 2D,,,East,North,E,N,9001,,4311,16021,1995-06-02 00:00:00,,EPSG,,
+31291,MGI (Ferro) / Austria West Zone,MGI / Austria West,,,Austria west of 11deg 50min East of Greenwich (29 deg 30 min East of Ferro).,projected 2D,,,East,North,X,Y,9001,,4805,18041,1995-06-02 00:00:00,,EPSG,Superceded by MGI / M34 (EPSG code 31296).,97.01
+31292,MGI (Ferro) / Austria Central Zone,MGI / Austria Central,,,Austria between 11deg 50min and 14deg 50min East of Greenwich (29 deg 30 min and 32 deg 30 min East of Ferro).,projected 2D,,,East,North,X,Y,9001,,4805,18042,1995-06-02 00:00:00,,EPSG,Superceded by MGI / M31 (EPSG code 31295).,97.01
+31293,MGI (Ferro) / Austria East Zone,MGI / Austria East,,,Austria east of 14deg 50min East of Greenwich (32 deg 30 min East of Ferro).,projected 2D,,,East,North,X,Y,9001,,4805,18043,1995-06-02 00:00:00,,EPSG,Superceded by MGI / M28 (EPSG code 31294).,97.01
+31294,MGI / M28,,,,Austria west of 11deg 50min East of Greenwich (29 deg 30 min East of Ferro).,projected 2D,,,East,North,X,Y,9001,,4312,18044,1999-10-20 00:00:00,,EPSG,Supercedes MGI (Ferro) / Austria East zone (EPSG code 31293).,
+31295,MGI / M31,,,,Austria between 11deg 50min and 14deg 50min East of Greenwich (29 deg 30 min and 32 deg 30 min East of Ferro).,projected 2D,,,East,North,X,Y,9001,,4312,18045,1999-10-20 00:00:00,,EPSG,Supercedes MGI (Ferro) / Austria Central zone (EPSG code 31292).,
+31296,MGI / M34,,,,Austria east of 14deg 50min East of Greenwich (32 deg 30 min East of Ferro).,projected 2D,,,East,North,X,Y,9001,,4312,18046,1999-10-20 00:00:00,,EPSG,Supercedes MGI (Ferro) / Austria West zone (EPSG code 31291).,
+31297,MGI / Austria Lambert,,,,Austria,projected 2D,,,East,North,X,Y,9001,,4312,19947,1999-10-20 00:00:00,,EPSG,,
+31300,Belge 1972 / Belge Lambert 72,Belge Lambert 72,,,Belgium - onshore.,projected 2D,,,East,North,X,Y,9001,,4313,19902,1995-06-02 00:00:00,,EPSG,Supersedes 21500 (Belge 1950 / Belge Lambert 50).,
+31491,DHDN / Germany zone 1,,,,Germany - onshore west of 4 deg 30 min East.,projected 2D,,,East,North,X,Y,9001,,4314,18101,1995-06-02 00:00:00,,EPSG,,
+31492,DHDN / Germany zone 2,,,,Germany - onshore between 4 deg 30 min and 7 deg 30 min East.,projected 2D,,,East,North,X,Y,9001,,4314,18102,1995-06-02 00:00:00,,EPSG,,
+31493,DHDN / Germany zone 3,,,,Germany - onshore between 7 deg 30 min and 10 deg 30 min East.,projected 2D,,,East,North,X,Y,9001,,4314,18103,1995-06-02 00:00:00,,EPSG,,
+31494,DHDN / Germany zone 4,,,,Germany - onshore between 10 deg 30 min and 13 deg 30 min East.,projected 2D,,,East,North,X,Y,9001,,4314,18104,1995-06-02 00:00:00,,EPSG,,
+31495,DHDN / Germany zone 5,,,,Germany - onshore between 13 deg 30 min and 16 deg 30 min East.,projected 2D,,,East,North,X,Y,9001,,4314,18105,1995-06-02 00:00:00,,EPSG,,
+31600,Dealul Piscului 1933/ Stereo 33,Stereo 33,,,Romania.,projected 2D,,,East,North,X,Y,9001,,4316,19927,1996-04-12 00:00:00,,EPSG,Superseded by Stereo 70 system (ProjCS code 31700).,
+31700,Dealul Piscului 1970/ Stereo 70,Stereo 70,,,Romania.,projected 2D,,,North,East,X,Y,9001,,4317,19926,1996-04-12 00:00:00,,EPSG,Supersedes Stereo 33 system.,
+31838,NGN / UTM zone 38N,,,,Kuwait west of 48deg East.,projected 2D,,,East,North,E,N,9001,,4318,16038,1996-04-12 00:00:00,,EPSG,,
+31839,NGN / UTM zone 39N,,,,Kuwait east of 48deg East.,projected 2D,,,East,North,E,N,9001,,4318,16039,1996-04-12 00:00:00,,EPSG,,
+31900,KUDAMS / KTM,,,,Kuwait - Kuwait City.,projected 2D,,,East,North,E,N,9001,,4319,19928,1996-04-12 00:00:00,,EPSG,,
+32001,NAD27 / Montana North,,,,United States (USA) - Montana - MT_N - counties of Blaine; Chouteau; Daniels; Flathead; Glacier; Hill; Liberty; Lincoln; Phillips; Pondera; Roosevelt; Sheridan; Teton; Toole; Valley,projected 2D,,,East,North,X,Y,9003,,4267,12501,1995-06-02 00:00:00,,EPSG,,
+32002,NAD27 / Montana Central,,,,United States (USA) - Montana - MT_C - counties of Cascade; Dawson; Fergus; Garfield; Judith Basin; Lake; Lewis and Clark; McCone; Meagher; Mineral; Missoula; Petroleum; Powell; Prairie; Richland; Sanders; Wibaux,projected 2D,,,East,North,X,Y,9003,,4267,12502,1995-06-02 00:00:00,,EPSG,,
+32003,NAD27 / Montana South,,,,United States (USA) - Montana - MT_S - counties of Beaverhead; Big Horn; Broadwater; Carbon; Carter; Custer; Deer Lodge; Fallon; Gallatin; Golden Valley; Granite; Jefferson; Madison; Musselshell; Park; Powder River; Ravalli; Rosebud; Silver Bow; Stillwater; Sweet Grass; Treasure; Wheatland; Yellowstone,projected 2D,,,East,North,X,Y,9003,,4267,12503,1995-06-02 00:00:00,,EPSG,,
+32005,NAD27 / Nebraska North,,,,United States (USA) - Nebraska - NE_N - counties of Antelope; Blaine; Box Butte; Boyd; Brown; Burt; Cedar; Cherry; Cuming; Dakota; Dawes; Dixon; Garfield; Grant; Holt; Hooker; Keya Paha; Knox; Loup; Madison; Pierce; Rock; Sheridan; Sioux; Stanton; Thomas; Thurston; Wayne; Wheeler,projected 2D,,,East,North,X,Y,9003,,4267,12601,1995-06-02 00:00:00,,EPSG,,
+32006,NAD27 / Nebraska South,,,,United States (USA) - Nebraska - NE_S - counties of Adams; Arthur; Banner; Boone; Buffalo; Butler; Cass; Chase; Cheyenne; Clay; Colfax; Custer; Dawson; Deuel; Dodge; Douglas; Dundy; Fillmore; Franklin; Frontier; Furnas; Gage; Garden; Gosper; Greeley; Hall; Hamilton; Harlan; Hayes; Hitchcock; Howard; Jefferson; Johnson; Kearney; Keith; Kimball; Lancaster; Lincoln; Logan; McPherson; Merrick; Morrill; Nance; Nemaha; Nuckolls; Otoe; Pawnee; Perkins; Phelps; Pl [...]
+32007,NAD27 / Nevada East,,,,United States (USA) - Nevada - NV_E - counties of Clark; Elko; Eureka; Lincoln; White Pine,projected 2D,,,East,North,X,Y,9003,,4267,12701,1995-06-02 00:00:00,,EPSG,,
+32008,NAD27 / Nevada Central,,,,United States (USA) - Nevada - NV_C - counties of Lander; Nye,projected 2D,,,East,North,X,Y,9003,,4267,12702,1995-06-02 00:00:00,,EPSG,,
+32009,NAD27 / Nevada West,,,,United States (USA) - Nevada - NV_W - counties of Churchill; Douglas; Esmeralda; Humboldt; Lyon; Mineral; Pershing; Storey; Washoe,projected 2D,,,East,North,X,Y,9003,,4267,12703,1995-06-02 00:00:00,,EPSG,,
+32010,NAD27 / New Hampshire,,,,United States (USA) - New Hampshire - NH - counties of Belknap; Carroll; Cheshire; Coos; Grafton; Hillsborough; Merrimack; Rockingham; Strafford; Sullivan,projected 2D,,,East,North,X,Y,9003,,4267,12800,1995-06-02 00:00:00,,EPSG,,
+32011,NAD27 / New Jersey,,,,United States (USA) - New Jersey - NJ - counties of Atlantic; Bergen; Burlington; Camden; Cape May; Cumberland; Essex; Gloucester; Hudson; Hunterdon; Mercer; Middlesex; Monmouth; Morris; Ocean; Passaic; Salem; Somerset; Sussex; Union; Warren,projected 2D,,,East,North,X,Y,9003,,4267,12900,1995-06-02 00:00:00,,EPSG,,
+32012,NAD27 / New Mexico East,,,,United States (USA) - New Mexico - NM_E - counties of Chaves; Colfax; Curry; De Baca; Eddy; Guadalupe; Harding; Lea; Mora; Quay; Roosevelt; San Miguel; Union,projected 2D,,,East,North,X,Y,9003,,4267,13001,1995-06-02 00:00:00,,EPSG,,
+32013,NAD27 / New Mexico Central,NAD27 / New Mexico Cent.,,,United States (USA) - New Mexico - NM_C - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance,projected 2D,,,East,North,X,Y,9003,,4267,13002,1995-06-02 00:00:00,,EPSG,,
+32014,NAD27 / New Mexico West,,,,United States (USA) - New Mexico - NM_W - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra; Valencia,projected 2D,,,East,North,X,Y,9003,,4267,13003,1995-06-02 00:00:00,,EPSG,,
+32015,NAD27 / New York East,,,,United States (USA) - New York - NY_E - counties of Albany; Clinton; Columbia; Delaware; Dutchess; Essex; Franklin; Fulton; Greene; Hamilton; Herkimer; Montgomery; Orange; Otsego; Putnam; Rensselaer; Rockland; Saratoga; Schenectady; Schoharie; St. Lawrence; Sullivan; Ulster; Warren; Washington; Westchester,projected 2D,,,East,North,X,Y,9003,,4267,13101,1995-06-02 00:00:00,,EPSG,,
+32016,NAD27 / New York Central,,,,United States (USA) - New York - NY_C - counties of Broome; Cayuga; Chemung; Chenango; Cortland; Jefferson; Lewis; Madison; Oneida; Onondaga; Ontario; Oswego; Schuyler; Seneca; Steuben; Tioga; Tompkins; Wayne; Yates,projected 2D,,,East,North,X,Y,9003,,4267,13102,1995-06-02 00:00:00,,EPSG,,
+32017,NAD27 / New York West,,,,United States (USA) - New York - NY_W - counties of Allegany; Cattaraugus; Chautauqua; Erie; Genesee; Livingston; Monroe; Niagara; Orleans; Wyoming,projected 2D,,,East,North,X,Y,9003,,4267,13103,1995-06-02 00:00:00,,EPSG,,
+32018,NAD27 / New York Long Island,NAD27 / New York Long Is,,,United States (USA) - New York - NY_LI - counties of Bronx; Kings; Nassau; New York; Queens; Richmond; Suffolk,projected 2D,,,East,North,X,Y,9003,,4267,13104,1995-06-02 00:00:00,,EPSG,,
+32019,NAD27 / North Carolina,,,,United States (USA) - North Carolina - NC - counties of Alamance; Alexander; Alleghany; Anson; Ashe; Avery; Beaufort; Bertie; Bladen; Brunswick; Buncombe; Burke; Cabarrus; Caldwell; Camden; Carteret; Caswell; Catawba; Chatham; Cherokee; Chowan; Clay; Cleveland; Columbus; Craven; Cumberland; Currituck; Dare; Davidson; Davie; Duplin; Durham; Edgecombe; Forsyth; Franklin; Gaston; Gates; Graham; Granville; Greene; Guilford; Halifax; Harnett; Haywood; Henderson [...]
+32020,NAD27 / North Dakota North,NAD27 / North Dakota N,,,United States (USA) - North Dakota - ND_N - counties of Benson; Bottineau; Burke; Cavalier; Divide; Eddy; Foster; Grand Forks; Griggs; McHenry; McKenzie; McLean; Mountrial; Nelson; Pembina; Pierce; Ramsey; Renville; Rolette; Sheridan; Steele; Towner; Traill; Walsh; Ward; Wells; Williams,projected 2D,,,East,North,X,Y,9003,,4267,13301,1995-06-02 00:00:00,,EPSG,,
+32021,NAD27 / North Dakota South,NAD27 / North Dakota S,,,United States (USA) - North Dakota - ND_S - counties of Adams; Barnes; Billings; Bowman; Burleigh; Cass; Dickey; Dunn; Emmons; Golden Valley; Grant; Hettinger; Kidder; La Moure; Logan; McIntosh; Mercer; Morton; Oliver; Ransom; Richland; Sargent; Sioux; Slope; Stark; Stutsman,projected 2D,,,East,North,X,Y,9003,,4267,13302,1995-06-02 00:00:00,,EPSG,,
+32022,NAD27 / Ohio North,,,,United States (USA) - Ohio - OH_N - counties of Allen;Ashland; Ashtabula; Auglaize; Carroll; Columbiana; Coshocton; Crawford; Cuyahoga; Defiance; Delaware; Erie; Fulton; Geauga; Hancock; Hardin; Harrison; Henry; Holmes; Huron; Jefferson; Knox; Lake; Logan; Lorain; Lucas; Mahoning; Marion; Medina; Mercer; Morrow; Ottawa; Paulding; Portage; Putnam; Richland; Sandusky; Seneca; Shelby; Stark; Summit; Trumbull; Tuscarawas; Union; Van Wert; Wayne; Williams; Wood; Wy [...]
+32023,NAD27 / Ohio South,,,,United States (USA) - Ohio - OH_S - counties of Adams; Athens; Belmont; Brown; Butler; Champaign; Clark; Clermont; Clinton; Darke; Fairfield; Fayette; Franklin; Gallia; Greene; Guernsey; Hamilton; Highland; Hocking; Jackson; Lawrence; Licking; Madison; Meigs; Miami; Monroe; Montgomery; Morgan; Muskingum; Noble; Perry; Pickaway; Pike; Preble; Ross; Scioto; Vinton; Warren; Washington,projected 2D,,,East,North,X,Y,9003,,4267,13402,1995-06-02 00:00:00,,EPSG,,
+32024,NAD27 / Oklahoma North,,,,United States (USA) - Oklahoma - OK_N - counties of Adair; Alfalfa; Beaver; Blaine; Canadian; Cherokee; Cimarron; Craig; Creek; Custer; Delaware; Dewey; Ellis; Garfield; Grant; Harper; Kay; Kingfisher; Lincoln; Logan; Major; Mayes; Muskogee; Noble; Nowata; Okfuskee; Oklahoma; Okmulgee; Osage; Ottawa; Pawnee; Payne; Roger Mills; Rogers; Sequoyah; Texas; Tulsa; Wagoner; Washington; Woods; Woodward,projected 2D,,,East,North,X,Y,9003,,4267,13501,1995-06-02 00: [...]
+32025,NAD27 / Oklahoma South,,,,United States (USA) - Oklahoma - OK_S - counties of Atoka; Beckham; Bryan; Caddo; Carter; Choctaw; Cleveland; Coal; Comanche; Cotton; Garvin; Grady; Greer; Harmon; Haskell; Hughes; Jackson; Jefferson; Johnston; Kiowa; Latimer; Le Flore; Love; Marshall; McClain; McCurtain; McIntosh; Murray; Pittsburg; Pontotoc; Pottawatomie; Pushmataha; Seminole; Stephens; Tillman; Washita,projected 2D,,,East,North,X,Y,9003,,4267,13502,1995-06-02 00:00:00,,EPSG,,
+32026,NAD27 / Oregon North,,,,United States (USA) - Oregon - OR_N - counties of Baker; Benton; Clackamas; Clatsop; Columbia; Gilliam; Grant; Hood River; Jefferson; Lincoln; Linn; Marion; Morrow; Multnomah; Polk; Sherman; Tillamook; Umatilla; Union; Wallowa; Wasco; Washington; Wheeler; Yamhill,projected 2D,,,East,North,X,Y,9003,,4267,13601,1995-06-02 00:00:00,,EPSG,,
+32027,NAD27 / Oregon South,,,,United States (USA) - Oregon - OR_S - counties of Coos; Crook; Curry; Deschutes; Douglas; Harney; Jackson; Josephine; Klamath; Lake; Lane; Malheur,projected 2D,,,East,North,X,Y,9003,,4267,13602,1995-06-02 00:00:00,,EPSG,,
+32028,NAD27 / Pennsylvania North,NAD27 / Pennsylvania N,,,United States (USA) - Pennsylvania - PA_N - counties of Bradford; Cameron; Carbon; Centre; Clarion; Clearfield; Clinton; Columbia; Crawford; Elk; Erie; Forest; Jefferson; Lackawanna; Luzerne; Lycoming; McKean; Mercer; Monroe; Montour; Northumberland; Pike; Potter; Sullivan; Susquehanna; Tioga; Union; Venango; Warren; Wayne; Wyoming,projected 2D,,,East,North,X,Y,9003,,4267,13701,1995-06-02 00:00:00,,EPSG,,
+32029,NAD27 / Pennsylvania South,NAD27 / Pennsylvania S,,,United States (USA) - Pennsylvania - PA_S - counties of Adams; Allegheny; Armstrong; Beaver; Bedford; Berks; Blair; Bucks; Butler; Cambria; Chester; Cumberland; Dauphin; Delaware; Fayette; Franklin; Fulton; Greene; Huntingdon; Indiana; Juniata; Lancaster; Lawrence; Lebanon; Lehigh; Mifflin; Montgomery; Northampton; Perry; Philadelphia; Schuylkill; Snyder; Somerset; Washington; Westmoreland; York,projected 2D,,,East,North,X,Y,9003, [...]
+32030,NAD27 / Rhode Island,,,,United States (USA) - Rhode Island - RI - counties of Bristol; Kent; Newport; Providence; Washington,projected 2D,,,East,North,X,Y,9003,,4267,13800,1995-06-02 00:00:00,,EPSG,,
+32031,NAD27 / South Carolina North,NAD27 / South Carolina N,,,United States (USA) - South Carolina - SC_N - counties of Abbeville; Anderson; Calhoun; Cherokee; Chester; Chesterfield; Darlington; Dillon; Edgefield; Fairfield; Florence; Greenville; Greenwood; Horry; Kershaw; Lancaster; Laurens; Lee; Lexington; Marion; Marlboro; McCormick; Newberry; Oconee; Pickens; Richland; Saluda; Spartanburg; Sumter; Union; York,projected 2D,,,East,North,X,Y,9003,,4267,13901,1995-06-02 00:00:00,,EPSG,,
+32033,NAD27 / South Carolina South,NAD27 / South Carolina S,,,United States (USA) - South Carolina - SC_S - counties of Aiken; Allendale; Bamberg; Barnwell; Beaufort; Berkeley; Charleston; Clarendon; Colleton; Dorchester; Georgetown; Hampton; Jasper; Orangeburg; Williamsburg,projected 2D,,,East,North,X,Y,9003,,4267,13902,1995-06-02 00:00:00,,EPSG,,
+32034,NAD27 / South Dakota North,NAD27 / South Dakota N,,,United States (USA) - South Dakota - SD_N - counties of Beadle; Brookings; Brown; Butte; Campbell; Clark; Codington; Corson; Day; Deuel; Dewey; Edmunds; Faulk; Grant; Hamlin; Hand; Harding; Hyde; Kingsbury; Lawrence; Marshall; McPherson; Meade; Perkins; Potter; Roberts; Spink; Sully; Walworth; Ziebach,projected 2D,,,East,North,X,Y,9003,,4267,14001,1995-06-02 00:00:00,,EPSG,,
+32035,NAD27 / South Dakota South,NAD27 / South Dakota S,,,United States (USA) - South Dakota - SD_S - counties of Aurora; Bennett; Bon Homme; Brule; Buffalo; Charles Mix; Clay; Custer; Davison; Douglas; Fall River; Gregory; Haakon; Hanson; Hughes; Hutchinson; Jackson; Jerauld; Jones; Lake; Lincoln; Lyman; McCook; Mellette; Miner; Minnehaha; Moody; Pennington; Sanborn; Shannon; Stanley; Todd; Tripp; Turner; Union; Yankton,projected 2D,,,East,North,X,Y,9003,,4267,14002,1995-06-02 00:00:00,,EPSG,,
+32036,NAD27 / Tennessee,,,,United States (USA) - Tennessee - TN - counties of Anderson; Bedford; Benton; Bledsoe; Blount; Bradley; Campbell; Cannon; Carroll; Carter; Cheatham; Chester; Claiborne; Clay; Cocke; Coffee; Crockett; Cumberland; Davidson; De Kalb; Decatur; Dickson; Dyer; Fayette; Fentress; Franklin; Gibson; Giles; Grainger; Greene; Grundy; Hamblen; Hamilton; Hancock; Hardeman; Hardin; Hawkins; Haywood; Henderson; Henry; Hickman; Houston; Humphreys; Jackson; Jefferson; Johnson; [...]
+32037,NAD27 / Texas North,,,,United States (USA) - Texas -TX_N - counties of: Armstrong; Briscoe; Carson; Castro; Childress; Collingsworth; Dallam; Deaf Smith; Donley; Gray; Hall; Hansford; Hartley; Hemphill; Hutchinson; Lipscomb; Moore; Ochiltree; Oldham; Parmer; Potter; Randall; Roberts; Sherman; Swisher; Wheeler,projected 2D,,,East,North,X,Y,9003,,4267,14201,1995-06-02 00:00:00,,EPSG,,
+32038,NAD27 / Texas North Central,NAD27 / Texas North Cen.,,,United States (USA) - Texas -TX_NC - counties of: Andrews; Archer; Bailey; Baylor; Borden; Bowie; Callahan; Camp; Cass; Clay; Cochran; Collin; Cooke; Cottle; Crosby; Dallas; Dawson; Delta; Denton; Dickens; Eastland; Ellis; Erath; Fannin; Fisher; Floyd; Foard; Franklin; Gaines; Garza; Grayson,projected 2D,,,East,North,X,Y,9003,,4267,14202,1995-06-02 00:00:00,,EPSG,,
+32039,NAD27 / Texas Central,,,,United States (USA) - Texas -TX_C - counties of Anderson; Angelina; Bastrop; Bell; Blanco; Bosque; Brazos; Brown; Burleson; Burnet; Cherokee; Coke; Coleman; Comanche; Concho; Coryell; Crane; Crockett; Culberson; Ector; El Paso; Falls; Freestone; Gillespie; Glasscock; Grimes; Hamilton; Hardin; Houston; Hudspeth; Irion; Jasper; Jeff Davis; Kimble; Lampasas; Lee; Leon; Liberty; Limestone; Llano; Loving; Madison; Mason; McCulloch; McLennan; Menard; Midland; Mil [...]
+32040,NAD27 / Texas South Central,NAD27 / Texas South Cen.,,,United States (USA) - Texas -TX_SC - counties of Aransas; Atascosa; Austin; Bandera; Bee; Bexar; Brazoria; Brewster; Caldwell; Calhoun; Chambers; Colorado; Comal; De Witt; Dimmit; Edwards; Fayette; Fort Bend; Frio; Galveston; Goliad; Gonzales; Guadalupe; Harris; Hays; Jackson; Jefferson; Karnes; Kendall; Kerr; Kinney; La Salle; Lavaca; Live Oak; Matagorda; Maverick; McMullen; Medina; Presidio; Real; Refugio; Terrell; Uvalde; Va [...]
+32041,NAD27 / Texas South,,,,United States (USA) - Texas -TX_S - counties of Brooks; Cameron; Duval; Hidalgo; Jim Hogg; Jim Wells; Kenedy; Kleberg; Nueces; San Patricio; Starr; Webb; Willacy; Zapata; - Gulf of Mexico outer continental shelf (OCS) protraction areas: South Padre Island; North Padre Island; Mustang Island.,projected 2D,,,East,North,X,Y,9003,,4267,14205,1995-06-02 00:00:00,,EPSG,,
+32042,NAD27 / Utah North,,,,United States (USA) - Utah - UT_N - counties of Box Elder; Cache; Daggett; Davis; Morgan; Rich; Summit; Weber,projected 2D,,,East,North,X,Y,9003,,4267,14301,1995-06-02 00:00:00,,EPSG,,
+32043,NAD27 / Utah Central,,,,United States (USA) - Utah - UT_C - counties of Carbon; Duchesne; Emery; Grand; Juab; Millard; Salt Lake; Sanpete; Sevier; Tooele; Uintah; Utah; Wasatch,projected 2D,,,East,North,X,Y,9003,,4267,14302,1995-06-02 00:00:00,,EPSG,,
+32044,NAD27 / Utah South,,,,United States (USA) - Utah - UT_S - counties of Beaver; Garfield; Iron; Kane; Piute; San Juan; Washington; Wayne,projected 2D,,,East,North,X,Y,9003,,4267,14303,1995-06-02 00:00:00,,EPSG,,
+32045,NAD27 / Vermont,,,,United States (USA) - Vermont - VT - counties of Addison; Bennington; Caledonia; Chittenden; Essex; Franklin; Grand Isle; Lamoille; Orange; Orleans; Rutland; Washington; Windham; Windsor,projected 2D,,,East,North,X,Y,9003,,4267,14400,1995-06-02 00:00:00,,EPSG,,
+32046,NAD27 / Virginia North,,,,United States (USA) - Virginia - VA_N - counties of Arlington; Augusta; Bath; Caroline; Clarke; Culpeper; Fairfax; Fauquier; Frederick; Greene; Highland; King George; Loudoun; Madison; Orange; Page; Prince William; Rappahannock; Rockingham; Shenandoah; Spotsylvania; Stafford; Warren; Westmoreland,projected 2D,,,East,North,X,Y,9003,,4267,14501,1995-06-02 00:00:00,,EPSG,,
+32047,NAD27 / Virginia South,,,,United States (USA) - Virginia - VA_S - counties of Accomack; Albemarle; Alleghany; Amelia; Amherst; Appomattox; Bedford; Bland; Botetourt; Bristol; Brunswick; Buchanan; Buckingham; Campbell; Carroll; Charles City; Charlotte; Chesapeake; Chesterfield; Colonial Heights; Craig; Cumberland; Dickenson; Dinwiddie; Essex; Floyd; Fluvanna; Franklin; Giles; Gloucester; Goochland; Grayson; Greensville; Halifax; Hampton; Hanover; Henrico; Henry; Isle of Wight; James [...]
+32048,NAD27 / Washington North,,,,United States (USA) - Washington - WA_N - counties of Chelan; Clallam; Douglas; Ferry; Island; Jefferson; King; Kitsap; Lincoln; Okanogan; Pend Oreille; San Juan; Skagit; Snohomish; Spokane; Stevens; Whatcom,projected 2D,,,East,North,X,Y,9003,,4267,14601,1995-06-02 00:00:00,,EPSG,,
+32049,NAD27 / Washington South,,,,United States (USA) - Washington - WA_S - counties of Adams; Asotin; Benton; Clark; Columbia; Cowlitz; Franklin; Garfield; Grant; Grays Harbor; Kittitas; Klickitat; Lewis; Mason; Pacific; Pierce; Skamania; Thurston; Wahkiakum; Walla Walla; Whitman; Yakima,projected 2D,,,East,North,X,Y,9003,,4267,14602,1995-06-02 00:00:00,,EPSG,,
+32050,NAD27 / West Virginia North,NAD27 / West Virginia N,,,United States (USA) - West Virginia - WV_N - counties of Barbour; Berkeley; Brooke; Doddridge; Grant; Hampshire; Hancock; Hardy; Harrison; Jefferson; Marion; Marshall; Mineral; Monongalia; Morgan; Ohio; Pleasants; Preston; Ritchie; Taylor; Tucker; Tyler; Wetzel; Wirt; Wood,projected 2D,,,East,North,X,Y,9003,,4267,14701,1995-06-02 00:00:00,,EPSG,,
+32051,NAD27 / West Virginia South,NAD27 / West Virginia S,,,United States (USA) - West Virginia - WV_S - counties of Boone; Braxton; Cabell; Calhoun; Clay; Fayette; Gilmer; Greenbrier; Jackson; Kanawha; Lewis; Lincoln; Logan; Mason; McDowell; Mercer; Mingo; Monroe; Nicholas; Pendleton; Pocahontas; Putnam; Raleigh; Randolph; Roane; Summers; Upshur; Wayne; Webster; Wyoming,projected 2D,,,East,North,X,Y,9003,,4267,14702,1995-06-02 00:00:00,,EPSG,,
+32052,NAD27 / Wisconsin North,,,,United States (USA) - Wisconsin - WI_N - counties of Ashland; Bayfield; Burnett; Douglas; Florence; Forest; Iron; Oneida; Price; Sawyer; Vilas; Washburn,projected 2D,,,East,North,X,Y,9003,,4267,14801,1995-06-02 00:00:00,,EPSG,,
+32053,NAD27 / Wisconsin Central,NAD27 / Wisconsin Cen.,,,United States (USA) - Wisconsin - WI_C - counties of Barron; Brown; Buffalo; Chippewa; Clark; Door; Dunn; Eau Claire; Jackson; Kewaunee; Langlade; Lincoln; Marathon; Marinette; Menominee; Oconto; Outagamie; Pepin; Pierce; Polk; Portage; Rusk; Shawano; St. Croix; Taylor; Trempealeau; Waupaca; Wood,projected 2D,,,East,North,X,Y,9003,,4267,14802,1995-06-02 00:00:00,,EPSG,,
+32054,NAD27 / Wisconsin South,,,,United States (USA) - Wisconsin - WI_S - counties of Adams; Calumet; Columbia; Crawford; Dane; Dodge; Fond Du Lac; Grant; Green; Green Lake; Iowa; Jefferson; Juneau; Kenosha; La Crosse; Lafayette; Manitowoc; Marquette; Milwaukee; Monroe; Ozaukee; Racine; Richland; Rock; Sauk; Sheboygan; Vernon; Walworth; Washington; Waukesha; Waushara; Winnebago,projected 2D,,,East,North,X,Y,9003,,4267,14803,1995-06-02 00:00:00,,EPSG,,
+32055,NAD27 / Wyoming East,,,,United States (USA) - Wyoming - WY_E - counties of Albany; Campbell; Converse; Crook; Goshen; Laramie; Niobrara; Platte; Weston,projected 2D,,,East,North,X,Y,9003,,4267,14901,1995-06-02 00:00:00,,EPSG,,
+32056,NAD27 / Wyoming East Central,NAD27 / Wyoming E. Cen.,,,United States (USA) - Wyoming - WY_EC - counties of Big Horn; Carbon; Johnson; Natrona; Sheridan; Washakie,projected 2D,,,East,North,X,Y,9003,,4267,14902,1995-06-02 00:00:00,,EPSG,,
+32057,NAD27 / Wyoming West Central,NAD27 / Wyoming W. Cen.,,,United States (USA) - Wyoming - WY_WC - counties of Fremont; Hot Springs; Park; Sweetwater,projected 2D,,,East,North,X,Y,9003,,4267,14903,1995-06-02 00:00:00,,EPSG,,
+32058,NAD27 / Wyoming West,,,,United States (USA) - Wyoming - WY_W - counties of Lincoln; Sublette; Teton; Uinta,projected 2D,,,East,North,X,Y,9003,,4267,14904,1995-06-02 00:00:00,,EPSG,,
+32061,NAD27 / Guatemala Norte,,,,Guatemala - north of 15 deg 50 min North.,projected 2D,,,East,North,X,Y,9001,,4267,18211,1999-08-18 00:00:00,,EPSG,,
+32062,NAD27 / Guatemala Sud,,,,Guatemala - south of 15 deg 50 min North.,projected 2D,,,East,North,X,Y,9001,,4267,18212,1999-08-18 00:00:00,,EPSG,,
+32074,NAD27 / BLM 14N (feet),,,,United States - Gulf of Mexico - west of approximately 96 deg West - outer continental shelf (OCS) protraction areas Corpus Christi; Port Isabel.,projected 2D,,,East,North,X,Y,9003,,4267,15914,1996-04-12 00:00:00,,EPSG,,96.03
+32075,NAD27 / BLM 15N (feet),,,,United States - Gulf of Mexico - 96 deg to 90 deg West - outer continental shelf (OCS) protraction areas East Breaks (EB); Alaminos Canyon (AC); Garden Banks (GB); Keathley Canyon (KC); Ewing Bank (EW); Green Canyon (GC); Walker Ridge (WR).,projected 2D,,,East,North,X,Y,9003,,4267,15915,1996-04-12 00:00:00,,EPSG,,96.03
+32076,NAD27 / BLM 16N (feet),,,,United States - Gulf of Mexico - 90 deg to 84 deg West - outer continental shelf (OCS) protraction areas Mobile (MO); Viosca Knoll (VK); Mississippi Canyon (MC); Atwater Valley (AT); Lund; Pensacola; Destin Dome (DD); De Soto Canyon; Lloyd; Henderson; Apalachicola; Florida Middle Ground; The Elbow; Vernon Basin; Howell Hook.,projected 2D,,,East,North,X,Y,9003,,4267,15916,1996-04-12 00:00:00,,EPSG,,95.27 96.03
+32077,NAD27 / BLM 17N (feet),,,,United States - Gulf of Mexico - east of 84 deg West - outer continental shelf (OCS) protraction areas Gainesville; Tarpon Springs; St. Petersburg; Charlotte Harbor; Pulley Ridge; Dry Tortugas; Miami; Key West.,projected 2D,,,East,North,X,Y,9003,,4267,15917,1996-04-12 00:00:00,,EPSG,,96.03
+32081,NAD27 / MTM zone 1,,,,Canada - Newfoundland - east of 54 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4267,17701,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32082,NAD27 / MTM zone 2,,,,Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.,projected 2D,,,East,North,E,N,9001,,4267,17702,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32083,NAD27 / MTM zone 3,,,,Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4267,17703,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32084,NAD27 / MTM zone 4,,,,Canada - Newfoundland (Labrador) between 63 deg and 60 deg West.,projected 2D,,,East,North,E,N,9001,,4267,17704,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32085,NAD27 / MTM zone 5,,,,Canada - Newfoundland (Labrador) between 66 deg and 63 deg West.,projected 2D,,,East,North,E,N,9001,,4267,17705,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32086,NAD27 / MTM zone 6,,,,Canada - Newfoundland (Labrador) between 69 deg and 66 deg West.,projected 2D,,,East,North,E,N,9001,,4267,17706,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32100,NAD83 / Montana,,,,United States (USA) - Montana - MT - counties of Beaverhead; Big Horn; Blaine; Broadwater; Carbon; Carter; Cascade; Chouteau; Custer; Daniels; Dawson; Deer Lodge; Fallon; Fergus; Flathead; Gallatin; Garfield; Glacier; Golden Valley; Granite; Hill; Jefferson; Judith Basin; Lake; Lewis and Clark; Liberty; Lincoln; Madison; McCone; Meagher; Mineral; Missoula; Musselshell; Park; Petroleum; Phillips; Pondera; Powder River; Powell; Prairie; Ravalli; Richland; Roosevelt [...]
+32104,NAD83 / Nebraska,,,,United States (USA) - Nebraska - NE - counties of Adams; Antelope; Arthur; Banner; Blaine; Boone; Box Butte; Boyd; Brown; Buffalo; Burt; Butler; Cass; Cedar; Chase; Cherry; Cheyenne; Clay; Colfax; Cuming; Custer; Dakota; Dawes; Dawson; Deuel; Dixon; Dodge; Douglas; Dundy; Fillmore; Franklin; Frontier; Furnas; Gage; Garden; Garfield; Gosper; Grant; Greeley; Hall; Hamilton; Harlan; Hayes; Hitchcock; Holt; Hooker; Howard; Jefferson; Johnson; Kearney; Keith; Keya Pa [...]
+32107,NAD83 / Nevada East,,,,United States (USA) - Nevada - NV_E - counties of Clark; Elko; Eureka; Lincoln; White Pine,projected 2D,,,East,North,X,Y,9001,,4269,12731,1995-06-02 00:00:00,,EPSG,,
+32108,NAD83 / Nevada Central,,,,United States (USA) - Nevada - NV_C - counties of Lander; Nye,projected 2D,,,East,North,X,Y,9001,,4269,12732,1995-06-02 00:00:00,,EPSG,,
+32109,NAD83 / Nevada West,,,,United States (USA) - Nevada - NV_W - counties of Churchill; Douglas; Esmeralda; Humboldt; Lyon; Mineral; Pershing; Storey; Washoe,projected 2D,,,East,North,X,Y,9001,,4269,12733,1995-06-02 00:00:00,,EPSG,,
+32110,NAD83 / New Hampshire,,,,United States (USA) - New Hampshire - NH - counties of Belknap; Carroll; Cheshire; Coos; Grafton; Hillsborough; Merrimack; Rockingham; Strafford; Sullivan,projected 2D,,,East,North,X,Y,9001,,4269,12830,1995-06-02 00:00:00,,EPSG,,
+32111,NAD83 / New Jersey,,,,United States (USA) - New Jersey - NJ - counties of Atlantic; Bergen; Burlington; Camden; Cape May; Cumberland; Essex; Gloucester; Hudson; Hunterdon; Mercer; Middlesex; Monmouth; Morris; Ocean; Passaic; Salem; Somerset; Sussex; Union; Warren,projected 2D,,,East,North,X,Y,9001,,4269,12930,1995-06-02 00:00:00,,EPSG,,
+32112,NAD83 / New Mexico East,,,,United States (USA) - New Mexico - NM_E - counties of Chaves; Colfax; Curry; De Baca; Eddy; Guadalupe; Harding; Lea; Mora; Quay; Roosevelt; San Miguel; Union,projected 2D,,,East,North,X,Y,9001,,4269,13031,1995-06-02 00:00:00,,EPSG,,
+32113,NAD83 / New Mexico Central,NAD83 / New Mexico Cent.,,,United States (USA) - New Mexico - NM_C - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance; Valencia,projected 2D,,,East,North,X,Y,9001,,4269,13032,1995-06-02 00:00:00,,EPSG,,
+32114,NAD83 / New Mexico West,,,,United States (USA) - New Mexico - NM_W - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra,projected 2D,,,East,North,X,Y,9001,,4269,13033,1995-06-02 00:00:00,,EPSG,,
+32115,NAD83 / New York East,,,,United States (USA) - New York - NY_E - counties of Albany; Clinton; Columbia; Delaware; Dutchess; Essex; Franklin; Fulton; Greene; Hamilton; Herkimer; Montgomery; Orange; Otsego; Putnam; Rensselaer; Rockland; Saratoga; Schenectady; Schoharie; St. Lawrence; Sullivan; Ulster; Warren; Washington; Westchester,projected 2D,,,East,North,X,Y,9001,,4269,13131,1995-06-02 00:00:00,,EPSG,,
+32116,NAD83 / New York Central,,,,United States (USA) - New York - NY_C - counties of Broome; Cayuga; Chemung; Chenango; Cortland; Jefferson; Lewis; Madison; Oneida; Onondaga; Ontario; Oswego; Schuyler; Seneca; Steuben; Tioga; Tompkins; Wayne; Yates,projected 2D,,,East,North,X,Y,9001,,4269,13132,1995-06-02 00:00:00,,EPSG,,
+32117,NAD83 / New York West,,,,United States (USA) - New York - NY_W - counties of Allegany; Cattaraugus; Chautauqua; Erie; Genesee; Livingston; Monroe; Niagara; Orleans; Wyoming,projected 2D,,,East,North,X,Y,9001,,4269,13133,1995-06-02 00:00:00,,EPSG,,
+32118,NAD83 / New York Long Island,NAD83 / New York Long Is,,,United States (USA) - New York - NY_LI - counties of Bronx; Kings; Nassau; New York; Queens; Richmond; Suffolk,projected 2D,,,East,North,X,Y,9001,,4269,13134,1995-06-02 00:00:00,,EPSG,,
+32119,NAD83 / North Carolina,,,,United States (USA) - North Carolina - NC - counties of Alamance; Alexander; Alleghany; Anson; Ashe; Avery; Beaufort; Bertie; Bladen; Brunswick; Buncombe; Burke; Cabarrus; Caldwell; Camden; Carteret; Caswell; Catawba; Chatham; Cherokee; Chowan; Clay; Cleveland; Columbus; Craven; Cumberland; Currituck; Dare; Davidson; Davie; Duplin; Durham; Edgecombe; Forsyth; Franklin; Gaston; Gates; Graham; Granville; Greene; Guilford; Halifax; Harnett; Haywood; Henderson [...]
+32120,NAD83 / North Dakota North,NAD83 / North Dakota N,,,United States (USA) - North Dakota - ND_N - counties of Benson; Bottineau; Burke; Cavalier; Divide; Eddy; Foster; Grand Forks; Griggs; McHenry; McKenzie; McLean; Mountrial; Nelson; Pembina; Pierce; Ramsey; Renville; Rolette; Sheridan; Steele; Towner; Traill; Walsh; Ward; Wells; Williams,projected 2D,,,East,North,X,Y,9001,,4269,13331,1995-06-02 00:00:00,,EPSG,,
+32121,NAD83 / North Dakota South,NAD83 / North Dakota S,,,United States (USA) - North Dakota - ND_S - counties of Adams; Barnes; Billings; Bowman; Burleigh; Cass; Dickey; Dunn; Emmons; Golden Valley; Grant; Hettinger; Kidder; La Moure; Logan; McIntosh; Mercer; Morton; Oliver; Ransom; Richland; Sargent; Sioux; Slope; Stark; Stutsman,projected 2D,,,East,North,X,Y,9001,,4269,13332,1995-06-02 00:00:00,,EPSG,,
+32122,NAD83 / Ohio North,,,,United States (USA) - Ohio - OH_N - counties of Allen;Ashland; Ashtabula; Auglaize; Carroll; Columbiana; Coshocton; Crawford; Cuyahoga; Defiance; Delaware; Erie; Fulton; Geauga; Hancock; Hardin; Harrison; Henry; Holmes; Huron; Jefferson; Knox; Lake; Logan; Lorain; Lucas; Mahoning; Marion; Medina; Mercer; Morrow; Ottawa; Paulding; Portage; Putnam; Richland; Sandusky; Seneca; Shelby; Stark; Summit; Trumbull; Tuscarawas; Union; Van Wert; Wayne; Williams; Wood; Wy [...]
+32123,NAD83 / Ohio South,,,,United States (USA) - Ohio - OH_S - counties of Adams; Athens; Belmont; Brown; Butler; Champaign; Clark; Clermont; Clinton; Darke; Fairfield; Fayette; Franklin; Gallia; Greene; Guernsey; Hamilton; Highland; Hocking; Jackson; Lawrence; Licking; Madison; Meigs; Miami; Monroe; Montgomery; Morgan; Muskingum; Noble; Perry; Pickaway; Pike; Preble; Ross; Scioto; Vinton; Warren; Washington,projected 2D,,,East,North,X,Y,9001,,4269,13432,1995-06-02 00:00:00,,EPSG,,
+32124,NAD83 / Oklahoma North,,,,United States (USA) - Oklahoma - OK_N - counties of Adair; Alfalfa; Beaver; Blaine; Canadian; Cherokee; Cimarron; Craig; Creek; Custer; Delaware; Dewey; Ellis; Garfield; Grant; Harper; Kay; Kingfisher; Lincoln; Logan; Major; Mayes; Muskogee; Noble; Nowata; Okfuskee; Oklahoma; Okmulgee; Osage; Ottawa; Pawnee; Payne; Roger Mills; Rogers; Sequoyah; Texas; Tulsa; Wagoner; Washington; Woods; Woodward,projected 2D,,,East,North,X,Y,9001,,4269,13531,1995-06-02 00: [...]
+32125,NAD83 / Oklahoma South,,,,United States (USA) - Oklahoma - OK_S - counties of Atoka; Beckham; Bryan; Caddo; Carter; Choctaw; Cleveland; Coal; Comanche; Cotton; Garvin; Grady; Greer; Harmon; Haskell; Hughes; Jackson; Jefferson; Johnston; Kiowa; Latimer; Le Flore; Love; Marshall; McClain; McCurtain; McIntosh; Murray; Pittsburg; Pontotoc; Pottawatomie; Pushmataha; Seminole; Stephens; Tillman; Washita,projected 2D,,,East,North,X,Y,9001,,4269,13532,1995-06-02 00:00:00,,EPSG,,
+32126,NAD83 / Oregon North,,,,United States (USA) - Oregon - OR_N - counties of Baker; Benton; Clackamas; Clatsop; Columbia; Gilliam; Grant; Hood River; Jefferson; Lincoln; Linn; Marion; Morrow; Multnomah; Polk; Sherman; Tillamook; Umatilla; Union; Wallowa; Wasco; Washington; Wheeler; Yamhill,projected 2D,,,East,North,X,Y,9001,,4269,13631,1995-06-02 00:00:00,,EPSG,,
+32127,NAD83 / Oregon South,,,,United States (USA) - Oregon - OR_S - counties of Coos; Crook; Curry; Deschutes; Douglas; Harney; Jackson; Josephine; Klamath; Lake; Lane; Malheur,projected 2D,,,East,North,X,Y,9001,,4269,13632,1995-06-02 00:00:00,,EPSG,,
+32128,NAD83 / Pennsylvania North,NAD83 / Pennsylvania N,,,United States (USA) - Pennsylvania - PA_N - counties of Bradford; Cameron; Carbon; Centre; Clarion; Clearfield; Clinton; Columbia; Crawford; Elk; Erie; Forest; Jefferson; Lackawanna; Luzerne; Lycoming; McKean; Mercer; Monroe; Montour; Northumberland; Pike; Potter; Sullivan; Susquehanna; Tioga; Union; Venango; Warren; Wayne; Wyoming,projected 2D,,,East,North,X,Y,9001,,4269,13731,1995-06-02 00:00:00,,EPSG,,
+32129,NAD83 / Pennsylvania South,NAD83 / Pennsylvania S,,,United States (USA) - Pennsylvania - PA_S - counties of Adams; Allegheny; Armstrong; Beaver; Bedford; Berks; Blair; Bucks; Butler; Cambria; Chester; Cumberland; Dauphin; Delaware; Fayette; Franklin; Fulton; Greene; Huntingdon; Indiana; Juniata; Lancaster; Lawrence; Lebanon; Lehigh; Mifflin; Montgomery; Northampton; Perry; Philadelphia; Schuylkill; Snyder; Somerset; Washington; Westmoreland; York,projected 2D,,,East,North,X,Y,9001, [...]
+32130,NAD83 / Rhode Island,,,,United States (USA) - Rhode Island - RI - counties of Bristol; Kent; Newport; Providence; Washington,projected 2D,,,East,North,X,Y,9001,,4269,13830,1995-06-02 00:00:00,,EPSG,,
+32133,NAD83 / South Carolina,,,,United States (USA) - South Carolina - SC - counties of Abbeville; Aiken; Allendale; Anderson; Bamberg; Barnwell; Beaufort; Berkeley; Calhoun; Charleston; Cherokee; Chester; Chesterfield; Clarendon; Colleton; Darlington; Dillon; Dorchester; Edgefield; Fairfield; Florence; Georgetown; Greenville; Greenwood; Hampton; Horry; Jasper; Kershaw; Lancaster; Laurens; Lee; Lexington; Marion; Marlboro; McCormick; Newberry; Oconee; Orangeburg; Pickens; Richland; Salud [...]
+32134,NAD83 / South Dakota North,NAD83 / South Dakota N,,,United States (USA) - South Dakota - SD_N - counties of Beadle; Brookings; Brown; Butte; Campbell; Clark; Codington; Corson; Day; Deuel; Dewey; Edmunds; Faulk; Grant; Hamlin; Hand; Harding; Hyde; Kingsbury; Lawrence; Marshall; McPherson; Meade; Perkins; Potter; Roberts; Spink; Sully; Walworth; Ziebach,projected 2D,,,East,North,X,Y,9001,,4269,14031,1995-06-02 00:00:00,,EPSG,,
+32135,NAD83 / South Dakota South,NAD83 / South Dakota S,,,United States (USA) - South Dakota - SD_S - counties of Aurora; Bennett; Bon Homme; Brule; Buffalo; Charles Mix; Clay; Custer; Davison; Douglas; Fall River; Gregory; Haakon; Hanson; Hughes; Hutchinson; Jackson; Jerauld; Jones; Lake; Lincoln; Lyman; McCook; Mellette; Miner; Minnehaha; Moody; Pennington; Sanborn; Shannon; Stanley; Todd; Tripp; Turner; Union; Yankton,projected 2D,,,East,North,X,Y,9001,,4269,14032,1995-06-02 00:00:00,,EPSG,,
+32136,NAD83 / Tennessee,,,,United States (USA) - Tennessee - TN - counties of Anderson; Bedford; Benton; Bledsoe; Blount; Bradley; Campbell; Cannon; Carroll; Carter; Cheatham; Chester; Claiborne; Clay; Cocke; Coffee; Crockett; Cumberland; Davidson; De Kalb; Decatur; Dickson; Dyer; Fayette; Fentress; Franklin; Gibson; Giles; Grainger; Greene; Grundy; Hamblen; Hamilton; Hancock; Hardeman; Hardin; Hawkins; Haywood; Henderson; Henry; Hickman; Houston; Humphreys; Jackson; Jefferson; Johnson; [...]
+32137,NAD83 / Texas North,,,,United States (USA) - Texas -TX_N - counties of: Armstrong; Briscoe; Carson; Castro; Childress; Collingsworth; Dallam; Deaf Smith; Donley; Gray; Hall; Hansford; Hartley; Hemphill; Hutchinson; Lipscomb; Moore; Ochiltree; Oldham; Parmer; Potter; Randall; Roberts; Sherman; Swisher; Wheeler,projected 2D,,,East,North,X,Y,9001,,4269,14231,1995-06-02 00:00:00,,EPSG,,
+32138,NAD83 / Texas North Central,NAD83 / Texas North Cen.,,,United States (USA) - Texas -TX_NC - counties of: Andrews; Archer; Bailey; Baylor; Borden; Bowie; Callahan; Camp; Cass; Clay; Cochran; Collin; Cooke; Cottle; Crosby; Dallas; Dawson; Delta; Denton; Dickens; Eastland; Ellis; Erath; Fannin; Fisher; Floyd; Foard; Franklin; Gaines; Garza; Grayson,projected 2D,,,East,North,X,Y,9001,,4269,14232,1995-06-02 00:00:00,,EPSG,,
+32139,NAD83 / Texas Central,,,,United States (USA) - Texas -TX_C - counties of Anderson; Angelina; Bastrop; Bell; Blanco; Bosque; Brazos; Brown; Burleson; Burnet; Cherokee; Coke; Coleman; Comanche; Concho; Coryell; Crane; Crockett; Culberson; Ector; El Paso; Falls; Freestone; Gillespie; Glasscock; Grimes; Hamilton; Hardin; Houston; Hudspeth; Irion; Jasper; Jeff Davis; Kimble; Lampasas; Lee; Leon; Liberty; Limestone; Llano; Loving; Madison; Mason; McCulloch; McLennan; Menard; Midland; Mil [...]
+32140,NAD83 / Texas South Central,NAD83 / Texas South Cen.,,,United States (USA) - Texas -TX_SC - counties of Aransas; Atascosa; Austin; Bandera; Bee; Bexar; Brazoria; Brewster; Caldwell; Calhoun; Chambers; Colorado; Comal; De Witt; Dimmit; Edwards; Fayette; Fort Bend; Frio; Galveston; Goliad; Gonzales; Guadalupe; Harris; Hays; Jackson; Jefferson; Karnes; Kendall; Kerr; Kinney; La Salle; Lavaca; Live Oak; Matagorda; Maverick; McMullen; Medina; Presidio; Real; Refugio; Terrell; Uvalde; Va [...]
+32141,NAD83 / Texas South,,,,United States (USA) - Texas -TX_S - counties of Brooks; Cameron; Duval; Hidalgo; Jim Hogg; Jim Wells; Kenedy; Kleberg; Nueces; San Patricio; Starr; Webb; Willacy; Zapata,projected 2D,,,East,North,X,Y,9001,,4269,14235,1995-06-02 00:00:00,,EPSG,,
+32142,NAD83 / Utah North,,,,United States (USA) - Utah - UT_N - counties of Box Elder; Cache; Daggett; Davis; Morgan; Rich; Summit; Weber,projected 2D,,,East,North,X,Y,9001,,4269,14331,1995-06-02 00:00:00,,EPSG,,
+32143,NAD83 / Utah Central,,,,United States (USA) - Utah - UT_C - counties of Carbon; Duchesne; Emery; Grand; Juab; Millard; Salt Lake; Sanpete; Sevier; Tooele; Uintah; Utah; Wasatch,projected 2D,,,East,North,X,Y,9001,,4269,14332,1995-06-02 00:00:00,,EPSG,,
+32144,NAD83 / Utah South,,,,United States (USA) - Utah - UT_S - counties of Beaver; Garfield; Iron; Kane; Piute; San Juan; Washington; Wayne,projected 2D,,,East,North,X,Y,9001,,4269,14333,1995-06-02 00:00:00,,EPSG,,
+32145,NAD83 / Vermont,,,,United States (USA) - Vermont - VT - counties of Addison; Bennington; Caledonia; Chittenden; Essex; Franklin; Grand Isle; Lamoille; Orange; Orleans; Rutland; Washington; Windham; Windsor,projected 2D,,,East,North,X,Y,9001,,4269,14430,1995-06-02 00:00:00,,EPSG,,
+32146,NAD83 / Virginia North,,,,United States (USA) - Virginia - VA_N - counties of Arlington; Augusta; Bath; Caroline; Clarke; Culpeper; Fairfax; Fauquier; Frederick; Greene; Highland; King George; Loudoun; Madison; Orange; Page; Prince William; Rappahannock; Rockingham; Shenandoah; Spotsylvania; Stafford; Warren; Westmoreland,projected 2D,,,East,North,X,Y,9001,,4269,14531,1995-06-02 00:00:00,,EPSG,,
+32147,NAD83 / Virginia South,,,,United States (USA) - Virginia - VA_S - counties of Accomack; Albemarle; Alleghany; Amelia; Amherst; Appomattox; Bedford; Bland; Botetourt; Bristol; Brunswick; Buchanan; Buckingham; Campbell; Carroll; Charles City; Charlotte; Chesapeake; Chesterfield; Colonial Heights; Craig; Cumberland; Dickenson; Dinwiddie; Essex; Floyd; Fluvanna; Franklin; Giles; Gloucester; Goochland; Grayson; Greensville; Halifax; Hampton; Hanover; Henrico; Henry; Isle of Wight; James [...]
+32148,NAD83 / Washington North,,,,United States (USA) - Washington - WA_N - counties of Chelan; Clallam; Douglas; Ferry; Grant north of approx. 47d30m; Island; Jefferson; King; Kitsap; Lincoln; Okanogan; Pend Oreille; San Juan; Skagit; Snohomish; Spokane; Stevens; Whatcom,projected 2D,,,East,North,X,Y,9001,,4269,14631,1995-06-02 00:00:00,,EPSG,,
+32149,NAD83 / Washington South,,,,United States (USA) - Washington - WA_S - counties of Adams; Asotin; Benton; Clark; Columbia; Cowlitz; Franklin; Garfield; Grant south of approx. 47d30m; Grays Harbor; Kittitas; Klickitat; Lewis; Mason; Pacific; Pierce; Skamania; Thurston; Wahkiakum; Walla Walla; Whitman; Yakima,projected 2D,,,East,North,X,Y,9001,,4269,14632,1995-06-02 00:00:00,,EPSG,,
+32150,NAD83 / West Virginia North,NAD83 / West Virginia N,,,United States (USA) - West Virginia - WV_N - counties of Barbour; Berkeley; Brooke; Doddridge; Grant; Hampshire; Hancock; Hardy; Harrison; Jefferson; Marion; Marshall; Mineral; Monongalia; Morgan; Ohio; Pleasants; Preston; Ritchie; Taylor; Tucker; Tyler; Wetzel; Wirt; Wood,projected 2D,,,East,North,X,Y,9001,,4269,14731,1995-06-02 00:00:00,,EPSG,,
+32151,NAD83 / West Virginia South,NAD83 / West Virginia S,,,United States (USA) - West Virginia - WV_S - counties of Boone; Braxton; Cabell; Calhoun; Clay; Fayette; Gilmer; Greenbrier; Jackson; Kanawha; Lewis; Lincoln; Logan; Mason; McDowell; Mercer; Mingo; Monroe; Nicholas; Pendleton; Pocahontas; Putnam; Raleigh; Randolph; Roane; Summers; Upshur; Wayne; Webster; Wyoming,projected 2D,,,East,North,X,Y,9001,,4269,14732,1995-06-02 00:00:00,,EPSG,,
+32152,NAD83 / Wisconsin North,,,,United States (USA) - Wisconsin - WI_N - counties of Ashland; Bayfield; Burnett; Douglas; Florence; Forest; Iron; Oneida; Price; Sawyer; Vilas; Washburn,projected 2D,,,East,North,X,Y,9001,,4269,14831,1995-06-02 00:00:00,,EPSG,,
+32153,NAD83 / Wisconsin Central,NAD83 / Wisconsin Cen.,,,United States (USA) - Wisconsin - WI_C - counties of Barron; Brown; Buffalo; Chippewa; Clark; Door; Dunn; Eau Claire; Jackson; Kewaunee; Langlade; Lincoln; Marathon; Marinette; Menominee; Oconto; Outagamie; Pepin; Pierce; Polk; Portage; Rusk; Shawano; St. Croix; Taylor; Trempealeau; Waupaca; Wood,projected 2D,,,East,North,X,Y,9001,,4269,14832,1995-06-02 00:00:00,,EPSG,,
+32154,NAD83 / Wisconsin South,,,,United States (USA) - Wisconsin - WI_S - counties of Adams; Calumet; Columbia; Crawford; Dane; Dodge; Fond Du Lac; Grant; Green; Green Lake; Iowa; Jefferson; Juneau; Kenosha; La Crosse; Lafayette; Manitowoc; Marquette; Milwaukee; Monroe; Ozaukee; Racine; Richland; Rock; Sauk; Sheboygan; Vernon; Walworth; Washington; Waukesha; Waushara; Winnebago,projected 2D,,,East,North,X,Y,9001,,4269,14833,1995-06-02 00:00:00,,EPSG,,
+32155,NAD83 / Wyoming East,,,,United States (USA) - Wyoming - WY_E - counties of Albany; Campbell; Converse; Crook; Goshen; Laramie; Niobrara; Platte; Weston,projected 2D,,,East,North,X,Y,9001,,4269,14931,1995-06-02 00:00:00,,EPSG,,
+32156,NAD83 / Wyoming East Central,NAD83 / Wyoming E. Cen.,,,United States (USA) - Wyoming - WY_EC - counties of Big Horn; Carbon; Johnson; Natrona; Sheridan; Washakie,projected 2D,,,East,North,X,Y,9001,,4269,14932,1995-06-02 00:00:00,,EPSG,,
+32157,NAD83 / Wyoming West Central,NAD83 / Wyoming W. Cen.,,,United States (USA) - Wyoming - WY_WC - counties of Fremont; Hot Springs; Park; Sweetwater,projected 2D,,,East,North,X,Y,9001,,4269,14933,1995-06-02 00:00:00,,EPSG,,
+32158,NAD83 / Wyoming West,,,,United States (USA) - Wyoming - WY_W - counties of Lincoln; Sublette; Teton; Uinta,projected 2D,,,East,North,X,Y,9001,,4269,14934,1995-06-02 00:00:00,,EPSG,,
+32161,NAD83 / Puerto Rico & Virgin Is.,,,,Puerto Rico and U.S. Virgin Islands.,projected 2D,,,East,North,X,Y,9001,,4269,15230,1995-06-02 00:00:00,,EPSG,,
+32180,NAD83 / SCoPQ zone 2,,,,Canada - Quebec - east of 57 deg East.,projected 2D,,,East,North,X,Y,9001,,4269,17700,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,,
+32181,NAD83 / MTM zone 1,,,,Canada - Newfoundland - east of 54 deg 30 min West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17701,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32182,NAD83 / MTM zone 2,,,,Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17702,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32183,NAD83 / MTM zone 3,,,,Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West; Canada - Quebec between 60 deg and 57 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17703,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 3\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32184,NAD83 / MTM zone 4,,,,Canada - Quebec and Newfoundland (Labrador) between 63 deg and 60 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17704,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 4\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32185,NAD83 / MTM zone 5,,,,Canada - Quebec and Newfoundland (Labrador) between 66 deg and 63 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17705,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 5\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32186,NAD83 / MTM zone 6,,,,Canada - Quebec and Newfoundland (Labrador) between 69 deg and 66 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17706,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 6\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32187,NAD83 / MTM zone 7,,,,Canada - Quebec between 72 deg and 69 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17707,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 7\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32188,NAD83 / MTM zone 8,,,,Canada - Quebec between 75 deg and 72 deg West.; Canada - Ontario - east of 75 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17708,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 8\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32189,NAD83 / MTM zone 9,,,,Canada - Quebec and Ontario - between 78 deg and 75 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17709,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 9\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32190,NAD83 / MTM zone 10,,,,Canada - Quebec west of 78 deg West; Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17710,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 10\" with axis 1 and 2 abbrevia [...]
+32191,NAD83 / MTM zone 11,,,,Canada - Ontario - south of 46 deg N and west of 81 deg West.,projected 2D,,,East,North,E,N,9001,,4269,17711,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32192,NAD83 / MTM zone 12,,,,Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.,projected 2D,,,East,North,E,N,9001,,4269,17712,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32193,NAD83 / MTM zone 13,,,,Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.,projected 2D,,,East,North,E,N,9001,,4269,17713,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32194,NAD83 / MTM zone 14,,,,Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4269,17714,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32195,NAD83 / MTM zone 15,,,,Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4269,17715,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32196,NAD83 / MTM zone 16,,,,Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4269,17716,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32197,NAD83 / MTM zone 17,,,,Canada - Ontario - west of 94 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4269,17717,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32198,NAD83 / Quebec Lambert,,,,Canada - Quebec,projected 2D,,,East,North,X,Y,9001,,4269,19944,1999-10-20 00:00:00,Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec,EPSG,,
+32201,WGS 72 / UTM zone 1N,,,,180deg to 174deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16001,1995-06-02 00:00:00,,EPSG,,
+32202,WGS 72 / UTM zone 2N,,,,174deg West to 168deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16002,1995-06-02 00:00:00,,EPSG,,
+32203,WGS 72 / UTM zone 3N,,,,168deg West to 162deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16003,1995-06-02 00:00:00,,EPSG,,
+32204,WGS 72 / UTM zone 4N,,,,162deg West to 156deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16004,1995-06-02 00:00:00,,EPSG,,
+32205,WGS 72 / UTM zone 5N,,,,156deg West to 150deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16005,1995-06-02 00:00:00,,EPSG,,
+32206,WGS 72 / UTM zone 6N,,,,150deg West to 144deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16006,1995-06-02 00:00:00,,EPSG,,
+32207,WGS 72 / UTM zone 7N,,,,144deg West to 138deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16007,1995-06-02 00:00:00,,EPSG,,
+32208,WGS 72 / UTM zone 8N,,,,138deg West to 132deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16008,1995-06-02 00:00:00,,EPSG,,
+32209,WGS 72 / UTM zone 9N,,,,132deg West to 126deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16009,1995-06-02 00:00:00,,EPSG,,
+32210,WGS 72 / UTM zone 10N,,,,130deg West to 120deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16010,1995-06-02 00:00:00,,EPSG,,
+32211,WGS 72 / UTM zone 11N,,,,120deg West to 114deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16011,1995-06-02 00:00:00,,EPSG,,
+32212,WGS 72 / UTM zone 12N,,,,114deg West to 108deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16012,1995-06-02 00:00:00,,EPSG,,
+32213,WGS 72 / UTM zone 13N,,,,108deg West to 102deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16013,1995-06-02 00:00:00,,EPSG,,
+32214,WGS 72 / UTM zone 14N,,,,102deg West to 96deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16014,1995-06-02 00:00:00,,EPSG,,
+32215,WGS 72 / UTM zone 15N,,,,96deg West to 90deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16015,1995-06-02 00:00:00,,EPSG,,
+32216,WGS 72 / UTM zone 16N,,,,90deg West to 84deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16016,1995-06-02 00:00:00,,EPSG,,
+32217,WGS 72 / UTM zone 17N,,,,84deg West to 78deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16017,1995-06-02 00:00:00,,EPSG,,
+32218,WGS 72 / UTM zone 18N,,,,78deg West to 72deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16018,1995-06-02 00:00:00,,EPSG,,
+32219,WGS 72 / UTM zone 19N,,,,72deg West to 66deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16019,1995-06-02 00:00:00,,EPSG,,
+32220,WGS 72 / UTM zone 20N,,,,66deg West to 60deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16020,1995-06-02 00:00:00,,EPSG,,
+32221,WGS 72 / UTM zone 21N,,,,60deg West to 54deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16021,1995-06-02 00:00:00,,EPSG,,
+32222,WGS 72 / UTM zone 22N,,,,54deg West to 48deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16022,1995-06-02 00:00:00,,EPSG,,
+32223,WGS 72 / UTM zone 23N,,,,48deg West to 42deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16023,1995-06-02 00:00:00,,EPSG,,
+32224,WGS 72 / UTM zone 24N,,,,42deg West to 36deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16024,1995-06-02 00:00:00,,EPSG,,
+32225,WGS 72 / UTM zone 25N,,,,36deg West to 30deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16025,1995-06-02 00:00:00,,EPSG,,
+32226,WGS 72 / UTM zone 26N,,,,30deg West to 24deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16026,1995-06-02 00:00:00,,EPSG,,
+32227,WGS 72 / UTM zone 27N,,,,24deg West to 18deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16027,1995-06-02 00:00:00,,EPSG,,
+32228,WGS 72 / UTM zone 28N,,,,18deg West to 12deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16028,1995-06-02 00:00:00,,EPSG,,
+32229,WGS 72 / UTM zone 29N,,,,12deg West to 6deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16029,1995-06-02 00:00:00,,EPSG,,
+32230,WGS 72 / UTM zone 30N,,,,6deg West to 0deg; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16030,1995-06-02 00:00:00,,EPSG,,
+32231,WGS 72 / UTM zone 31N,,,,0deg to 6deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16031,1995-06-02 00:00:00,,EPSG,,
+32232,WGS 72 / UTM zone 32N,,,,6deg East to 12deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16032,1995-06-02 00:00:00,,EPSG,,
+32233,WGS 72 / UTM zone 33N,,,,12deg East to 18deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16033,1995-06-02 00:00:00,,EPSG,,
+32234,WGS 72 / UTM zone 34N,,,,18deg East to 24deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16034,1995-06-02 00:00:00,,EPSG,,
+32235,WGS 72 / UTM zone 35N,,,,24deg East to 30deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16035,1995-06-02 00:00:00,,EPSG,,
+32236,WGS 72 / UTM zone 36N,,,,30deg East to 36deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16036,1995-06-02 00:00:00,,EPSG,,
+32237,WGS 72 / UTM zone 37N,,,,36deg East to 42deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16037,1995-06-02 00:00:00,,EPSG,,
+32238,WGS 72 / UTM zone 38N,,,,42deg East to 48deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16038,1995-06-02 00:00:00,,EPSG,,
+32239,WGS 72 / UTM zone 39N,,,,48deg East to 54deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16039,1995-06-02 00:00:00,,EPSG,,
+32240,WGS 72 / UTM zone 40N,,,,54deg East to 60deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16040,1995-06-02 00:00:00,,EPSG,,
+32241,WGS 72 / UTM zone 41N,,,,60deg East to 66deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16041,1995-06-02 00:00:00,,EPSG,,
+32242,WGS 72 / UTM zone 42N,,,,66deg East to 72deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16042,1995-06-02 00:00:00,,EPSG,,
+32243,WGS 72 / UTM zone 43N,,,,72deg East to 78deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16043,1995-06-02 00:00:00,,EPSG,,
+32244,WGS 72 / UTM zone 44N,,,,78deg East to 84deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16044,1995-06-02 00:00:00,,EPSG,,
+32245,WGS 72 / UTM zone 45N,,,,84deg East to 90deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16045,1995-06-02 00:00:00,,EPSG,,
+32246,WGS 72 / UTM zone 46N,,,,90deg East to 96deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16046,1995-06-02 00:00:00,,EPSG,,
+32247,WGS 72 / UTM zone 47N,,,,96deg East to 102eg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16047,1995-06-02 00:00:00,,EPSG,,
+32248,WGS 72 / UTM zone 48N,,,,102deg East to 108deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16048,1995-06-02 00:00:00,,EPSG,,
+32249,WGS 72 / UTM zone 49N,,,,108deg East to 114deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16049,1995-06-02 00:00:00,,EPSG,,
+32250,WGS 72 / UTM zone 50N,,,,114deg East to 120deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16050,1995-06-02 00:00:00,,EPSG,,
+32251,WGS 72 / UTM zone 51N,,,,120deg East to 126deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16051,1995-06-02 00:00:00,,EPSG,,
+32252,WGS 72 / UTM zone 52N,,,,126deg East to 132deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16052,1995-06-02 00:00:00,,EPSG,,
+32253,WGS 72 / UTM zone 53N,,,,132deg East to 138deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16053,1995-06-02 00:00:00,,EPSG,,
+32254,WGS 72 / UTM zone 54N,,,,138deg East to 144deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16054,1995-06-02 00:00:00,,EPSG,,
+32255,WGS 72 / UTM zone 55N,,,,144deg East to 150deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16055,1995-06-02 00:00:00,,EPSG,,
+32256,WGS 72 / UTM zone 56N,,,,150deg East to 156deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16056,1995-06-02 00:00:00,,EPSG,,
+32257,WGS 72 / UTM zone 57N,,,,156deg East to 162deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16057,1995-06-02 00:00:00,,EPSG,,
+32258,WGS 72 / UTM zone 58N,,,,162deg East to 168deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16058,1995-06-02 00:00:00,,EPSG,,
+32259,WGS 72 / UTM zone 59N,,,,168deg East to 174deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16059,1995-06-02 00:00:00,,EPSG,,
+32260,WGS 72 / UTM zone 60N,,,,174deg East to 180deg; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16060,1995-06-02 00:00:00,,EPSG,,
+32301,WGS 72 / UTM zone 1S,,,,180deg to 174deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16101,1995-06-02 00:00:00,,EPSG,,
+32302,WGS 72 / UTM zone 2S,,,,174deg West to 168deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16102,1995-06-02 00:00:00,,EPSG,,
+32303,WGS 72 / UTM zone 3S,,,,168deg West to 162deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16103,1995-06-02 00:00:00,,EPSG,,
+32304,WGS 72 / UTM zone 4S,,,,162deg West to 156deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16104,1995-06-02 00:00:00,,EPSG,,
+32305,WGS 72 / UTM zone 5S,,,,156deg West to 150deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16105,1995-06-02 00:00:00,,EPSG,,
+32306,WGS 72 / UTM zone 6S,,,,150deg West to 144deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16106,1995-06-02 00:00:00,,EPSG,,
+32307,WGS 72 / UTM zone 7S,,,,144deg West to 138deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16107,1995-06-02 00:00:00,,EPSG,,
+32308,WGS 72 / UTM zone 8S,,,,138deg West to 132deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16108,1995-06-02 00:00:00,,EPSG,,
+32309,WGS 72 / UTM zone 9S,,,,132deg West to 126deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16109,1995-06-02 00:00:00,,EPSG,,
+32310,WGS 72 / UTM zone 10S,,,,130deg West to 120deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16110,1995-06-02 00:00:00,,EPSG,,
+32311,WGS 72 / UTM zone 11S,,,,120deg West to 114deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16111,1995-06-02 00:00:00,,EPSG,,
+32312,WGS 72 / UTM zone 12S,,,,114deg West to 108deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16112,1995-06-02 00:00:00,,EPSG,,
+32313,WGS 72 / UTM zone 13S,,,,108deg West to 102deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16113,1995-06-02 00:00:00,,EPSG,,
+32314,WGS 72 / UTM zone 14S,,,,102deg West to 96deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16114,1995-06-02 00:00:00,,EPSG,,
+32315,WGS 72 / UTM zone 15S,,,,96deg West to 90deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16115,1995-06-02 00:00:00,,EPSG,,
+32316,WGS 72 / UTM zone 16S,,,,90deg West to 84deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16116,1995-06-02 00:00:00,,EPSG,,
+32317,WGS 72 / UTM zone 17S,,,,84deg West to 78deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16117,1995-06-02 00:00:00,,EPSG,,
+32318,WGS 72 / UTM zone 18S,,,,78deg West to 72deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16118,1995-06-02 00:00:00,,EPSG,,
+32319,WGS 72 / UTM zone 19S,,,,72deg West to 66deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16119,1995-06-02 00:00:00,,EPSG,,
+32320,WGS 72 / UTM zone 20S,,,,66deg West to 60deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16120,1995-06-02 00:00:00,,EPSG,,
+32321,WGS 72 / UTM zone 21S,,,,60deg West to 54deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16121,1995-06-02 00:00:00,,EPSG,,
+32322,WGS 72 / UTM zone 22S,,,,54deg West to 48deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16122,1995-06-02 00:00:00,,EPSG,,
+32323,WGS 72 / UTM zone 23S,,,,48deg West to 42deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16123,1995-06-02 00:00:00,,EPSG,,
+32324,WGS 72 / UTM zone 24S,,,,42deg West to 36deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16124,1995-06-02 00:00:00,,EPSG,,
+32325,WGS 72 / UTM zone 25S,,,,36deg West to 30deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16125,1995-06-02 00:00:00,,EPSG,,
+32326,WGS 72 / UTM zone 26S,,,,30deg West to 24deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16126,1995-06-02 00:00:00,,EPSG,,
+32327,WGS 72 / UTM zone 27S,,,,24deg West to 18deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16127,1995-06-02 00:00:00,,EPSG,,
+32328,WGS 72 / UTM zone 28S,,,,18deg West to 12deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16128,1995-06-02 00:00:00,,EPSG,,
+32329,WGS 72 / UTM zone 29S,,,,12deg West to 6deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16129,1995-06-02 00:00:00,,EPSG,,
+32330,WGS 72 / UTM zone 30S,,,,6deg West to 0deg; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16130,1995-06-02 00:00:00,,EPSG,,
+32331,WGS 72 / UTM zone 31S,,,,0deg to 6deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16131,1995-06-02 00:00:00,,EPSG,,
+32332,WGS 72 / UTM zone 32S,,,,6deg East to 12deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16132,1995-06-02 00:00:00,,EPSG,,
+32333,WGS 72 / UTM zone 33S,,,,12deg East to 18deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16133,1995-06-02 00:00:00,,EPSG,,
+32334,WGS 72 / UTM zone 34S,,,,18deg East to 24deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16134,1995-06-02 00:00:00,,EPSG,,
+32335,WGS 72 / UTM zone 35S,,,,24deg East to 30deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16135,1995-06-02 00:00:00,,EPSG,,
+32336,WGS 72 / UTM zone 36S,,,,30deg East to 36deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16136,1995-06-02 00:00:00,,EPSG,,
+32337,WGS 72 / UTM zone 37S,,,,36deg East to 42deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16137,1995-06-02 00:00:00,,EPSG,,
+32338,WGS 72 / UTM zone 38S,,,,42deg East to 48deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16138,1995-06-02 00:00:00,,EPSG,,
+32339,WGS 72 / UTM zone 39S,,,,48deg East to 54deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16139,1995-06-02 00:00:00,,EPSG,,
+32340,WGS 72 / UTM zone 40S,,,,54deg East to 60deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16140,1995-06-02 00:00:00,,EPSG,,
+32341,WGS 72 / UTM zone 41S,,,,60deg East to 66deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16141,1995-06-02 00:00:00,,EPSG,,
+32342,WGS 72 / UTM zone 42S,,,,66deg East to 72deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16142,1995-06-02 00:00:00,,EPSG,,
+32343,WGS 72 / UTM zone 43S,,,,72deg East to 78deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16143,1995-06-02 00:00:00,,EPSG,,
+32344,WGS 72 / UTM zone 44S,,,,78deg East to 84deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16144,1995-06-02 00:00:00,,EPSG,,
+32345,WGS 72 / UTM zone 45S,,,,84deg East to 90deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16145,1995-06-02 00:00:00,,EPSG,,
+32346,WGS 72 / UTM zone 46S,,,,90deg East to 96deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16146,1995-06-02 00:00:00,,EPSG,,
+32347,WGS 72 / UTM zone 47S,,,,96deg East to 102eg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16147,1995-06-02 00:00:00,,EPSG,,
+32348,WGS 72 / UTM zone 48S,,,,102deg East to 108deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16148,1995-06-02 00:00:00,,EPSG,,
+32349,WGS 72 / UTM zone 49S,,,,108deg East to 114deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16149,1995-06-02 00:00:00,,EPSG,,
+32350,WGS 72 / UTM zone 50S,,,,114deg East to 120deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16150,1995-06-02 00:00:00,,EPSG,,
+32351,WGS 72 / UTM zone 51S,,,,120deg East to 126deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16151,1995-06-02 00:00:00,,EPSG,,
+32352,WGS 72 / UTM zone 52S,,,,126deg East to 132deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16152,1995-06-02 00:00:00,,EPSG,,
+32353,WGS 72 / UTM zone 53S,,,,132deg East to 138deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16153,1995-06-02 00:00:00,,EPSG,,
+32354,WGS 72 / UTM zone 54S,,,,138deg East to 144deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16154,1995-06-02 00:00:00,,EPSG,,
+32355,WGS 72 / UTM zone 55S,,,,144deg East to 150deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16155,1995-06-02 00:00:00,,EPSG,,
+32356,WGS 72 / UTM zone 56S,,,,150deg East to 156deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16156,1995-06-02 00:00:00,,EPSG,,
+32357,WGS 72 / UTM zone 57S,,,,156deg East to 162deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16157,1995-06-02 00:00:00,,EPSG,,
+32358,WGS 72 / UTM zone 58S,,,,162deg East to 168deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16158,1995-06-02 00:00:00,,EPSG,,
+32359,WGS 72 / UTM zone 59S,,,,168deg East to 174deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16159,1995-06-02 00:00:00,,EPSG,,
+32360,WGS 72 / UTM zone 60S,,,,174deg East to 180deg; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16160,1995-06-02 00:00:00,,EPSG,,
+32401,WGS 72BE / UTM zone 1N,,,,180deg to 174deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16001,1995-06-02 00:00:00,,EPSG,,
+32402,WGS 72BE / UTM zone 2N,,,,174deg West to 168deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16002,1995-06-02 00:00:00,,EPSG,,
+32403,WGS 72BE / UTM zone 3N,,,,168deg West to 162deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16003,1995-06-02 00:00:00,,EPSG,,
+32404,WGS 72BE / UTM zone 4N,,,,162deg West to 156deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16004,1995-06-02 00:00:00,,EPSG,,
+32405,WGS 72BE / UTM zone 5N,,,,156deg West to 150deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16005,1995-06-02 00:00:00,,EPSG,,
+32406,WGS 72BE / UTM zone 6N,,,,150deg West to 144deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16006,1995-06-02 00:00:00,,EPSG,,
+32407,WGS 72BE / UTM zone 7N,,,,144deg West to 138deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16007,1995-06-02 00:00:00,,EPSG,,
+32408,WGS 72BE / UTM zone 8N,,,,138deg West to 132deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16008,1995-06-02 00:00:00,,EPSG,,
+32409,WGS 72BE / UTM zone 9N,,,,132deg West to 126deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16009,1995-06-02 00:00:00,,EPSG,,
+32410,WGS 72BE / UTM zone 10N,,,,130deg West to 120deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16010,1995-06-02 00:00:00,,EPSG,,
+32411,WGS 72BE / UTM zone 11N,,,,120deg West to 114deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16011,1995-06-02 00:00:00,,EPSG,,
+32412,WGS 72BE / UTM zone 12N,,,,114deg West to 108deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16012,1995-06-02 00:00:00,,EPSG,,
+32413,WGS 72BE / UTM zone 13N,,,,108deg West to 102deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16013,1995-06-02 00:00:00,,EPSG,,
+32414,WGS 72BE / UTM zone 14N,,,,102deg West to 96deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16014,1995-06-02 00:00:00,,EPSG,,
+32415,WGS 72BE / UTM zone 15N,,,,96deg West to 90deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16015,1995-06-02 00:00:00,,EPSG,,
+32416,WGS 72BE / UTM zone 16N,,,,90deg West to 84deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16016,1995-06-02 00:00:00,,EPSG,,
+32417,WGS 72BE / UTM zone 17N,,,,84deg West to 78deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16017,1995-06-02 00:00:00,,EPSG,,
+32418,WGS 72BE / UTM zone 18N,,,,78deg West to 72deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16018,1995-06-02 00:00:00,,EPSG,,
+32419,WGS 72BE / UTM zone 19N,,,,72deg West to 66deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16019,1995-06-02 00:00:00,,EPSG,,
+32420,WGS 72BE / UTM zone 20N,,,,66deg West to 60deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16020,1995-06-02 00:00:00,,EPSG,,
+32421,WGS 72BE / UTM zone 21N,,,,60deg West to 54deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16021,1995-06-02 00:00:00,,EPSG,,
+32422,WGS 72BE / UTM zone 22N,,,,54deg West to 48deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16022,1995-06-02 00:00:00,,EPSG,,
+32423,WGS 72BE / UTM zone 23N,,,,48deg West to 42deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16023,1995-06-02 00:00:00,,EPSG,,
+32424,WGS 72BE / UTM zone 24N,,,,42deg West to 36deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16024,1995-06-02 00:00:00,,EPSG,,
+32425,WGS 72BE / UTM zone 25N,,,,36deg West to 30deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16025,1995-06-02 00:00:00,,EPSG,,
+32426,WGS 72BE / UTM zone 26N,,,,30deg West to 24deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16026,1995-06-02 00:00:00,,EPSG,,
+32427,WGS 72BE / UTM zone 27N,,,,24deg West to 18deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16027,1995-06-02 00:00:00,,EPSG,,
+32428,WGS 72BE / UTM zone 28N,,,,18deg West to 12deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16028,1995-06-02 00:00:00,,EPSG,,
+32429,WGS 72BE / UTM zone 29N,,,,12deg West to 6deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16029,1995-06-02 00:00:00,,EPSG,,
+32430,WGS 72BE / UTM zone 30N,,,,6deg West to 0deg; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16030,1995-06-02 00:00:00,,EPSG,,
+32431,WGS 72BE / UTM zone 31N,,,,0deg to 6deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16031,1995-06-02 00:00:00,,EPSG,,
+32432,WGS 72BE / UTM zone 32N,,,,6deg East to 12deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16032,1995-06-02 00:00:00,,EPSG,,
+32433,WGS 72BE / UTM zone 33N,,,,12deg East to 18deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16033,1995-06-02 00:00:00,,EPSG,,
+32434,WGS 72BE / UTM zone 34N,,,,18deg East to 24deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16034,1995-06-02 00:00:00,,EPSG,,
+32435,WGS 72BE / UTM zone 35N,,,,24deg East to 30deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16035,1995-06-02 00:00:00,,EPSG,,
+32436,WGS 72BE / UTM zone 36N,,,,30deg East to 36deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16036,1995-06-02 00:00:00,,EPSG,,
+32437,WGS 72BE / UTM zone 37N,,,,36deg East to 42deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16037,1995-06-02 00:00:00,,EPSG,,
+32438,WGS 72BE / UTM zone 38N,,,,42deg East to 48deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16038,1995-06-02 00:00:00,,EPSG,,
+32439,WGS 72BE / UTM zone 39N,,,,48deg East to 54deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16039,1995-06-02 00:00:00,,EPSG,,
+32440,WGS 72BE / UTM zone 40N,,,,54deg East to 60deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16040,1995-06-02 00:00:00,,EPSG,,
+32441,WGS 72BE / UTM zone 41N,,,,60deg East to 66deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16041,1995-06-02 00:00:00,,EPSG,,
+32442,WGS 72BE / UTM zone 42N,,,,66deg East to 72deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16042,1995-06-02 00:00:00,,EPSG,,
+32443,WGS 72BE / UTM zone 43N,,,,72deg East to 78deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16043,1995-06-02 00:00:00,,EPSG,,
+32444,WGS 72BE / UTM zone 44N,,,,78deg East to 84deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16044,1995-06-02 00:00:00,,EPSG,,
+32445,WGS 72BE / UTM zone 45N,,,,84deg East to 90deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16045,1995-06-02 00:00:00,,EPSG,,
+32446,WGS 72BE / UTM zone 46N,,,,90deg East to 96deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16046,1995-06-02 00:00:00,,EPSG,,
+32447,WGS 72BE / UTM zone 47N,,,,96deg East to 102eg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16047,1995-06-02 00:00:00,,EPSG,,
+32448,WGS 72BE / UTM zone 48N,,,,102deg East to 108deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16048,1995-06-02 00:00:00,,EPSG,,
+32449,WGS 72BE / UTM zone 49N,,,,108deg East to 114deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16049,1995-06-02 00:00:00,,EPSG,,
+32450,WGS 72BE / UTM zone 50N,,,,114deg East to 120deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16050,1995-06-02 00:00:00,,EPSG,,
+32451,WGS 72BE / UTM zone 51N,,,,120deg East to 126deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16051,1995-06-02 00:00:00,,EPSG,,
+32452,WGS 72BE / UTM zone 52N,,,,126deg East to 132deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16052,1995-06-02 00:00:00,,EPSG,,
+32453,WGS 72BE / UTM zone 53N,,,,132deg East to 138deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16053,1995-06-02 00:00:00,,EPSG,,
+32454,WGS 72BE / UTM zone 54N,,,,138deg East to 144deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16054,1995-06-02 00:00:00,,EPSG,,
+32455,WGS 72BE / UTM zone 55N,,,,144deg East to 150deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16055,1995-06-02 00:00:00,,EPSG,,
+32456,WGS 72BE / UTM zone 56N,,,,150deg East to 156deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16056,1995-06-02 00:00:00,,EPSG,,
+32457,WGS 72BE / UTM zone 57N,,,,156deg East to 162deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16057,1995-06-02 00:00:00,,EPSG,,
+32458,WGS 72BE / UTM zone 58N,,,,162deg East to 168deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16058,1995-06-02 00:00:00,,EPSG,,
+32459,WGS 72BE / UTM zone 59N,,,,168deg East to 174deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16059,1995-06-02 00:00:00,,EPSG,,
+32460,WGS 72BE / UTM zone 60N,,,,174deg East to 180deg; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16060,1995-06-02 00:00:00,,EPSG,,
+32501,WGS 72BE / UTM zone 1S,,,,180deg to 174deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16101,1995-06-02 00:00:00,,EPSG,,
+32502,WGS 72BE / UTM zone 2S,,,,174deg West to 168deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16102,1995-06-02 00:00:00,,EPSG,,
+32503,WGS 72BE / UTM zone 3S,,,,168deg West to 162deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16103,1995-06-02 00:00:00,,EPSG,,
+32504,WGS 72BE / UTM zone 4S,,,,162deg West to 156deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16104,1995-06-02 00:00:00,,EPSG,,
+32505,WGS 72BE / UTM zone 5S,,,,156deg West to 150deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16105,1995-06-02 00:00:00,,EPSG,,
+32506,WGS 72BE / UTM zone 6S,,,,150deg West to 144deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16106,1995-06-02 00:00:00,,EPSG,,
+32507,WGS 72BE / UTM zone 7S,,,,144deg West to 138deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16107,1995-06-02 00:00:00,,EPSG,,
+32508,WGS 72BE / UTM zone 8S,,,,138deg West to 132deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16108,1995-06-02 00:00:00,,EPSG,,
+32509,WGS 72BE / UTM zone 9S,,,,132deg West to 126deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16109,1995-06-02 00:00:00,,EPSG,,
+32510,WGS 72BE / UTM zone 10S,,,,130deg West to 120deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16110,1995-06-02 00:00:00,,EPSG,,
+32511,WGS 72BE / UTM zone 11S,,,,120deg West to 114deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16111,1995-06-02 00:00:00,,EPSG,,
+32512,WGS 72BE / UTM zone 12S,,,,114deg West to 108deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16112,1995-06-02 00:00:00,,EPSG,,
+32513,WGS 72BE / UTM zone 13S,,,,108deg West to 102deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16113,1995-06-02 00:00:00,,EPSG,,
+32514,WGS 72BE / UTM zone 14S,,,,102deg West to 96deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16114,1995-06-02 00:00:00,,EPSG,,
+32515,WGS 72BE / UTM zone 15S,,,,96deg West to 90deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16115,1995-06-02 00:00:00,,EPSG,,
+32516,WGS 72BE / UTM zone 16S,,,,90deg West to 84deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16116,1995-06-02 00:00:00,,EPSG,,
+32517,WGS 72BE / UTM zone 17S,,,,84deg West to 78deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16117,1995-06-02 00:00:00,,EPSG,,
+32518,WGS 72BE / UTM zone 18S,,,,78deg West to 72deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16118,1995-06-02 00:00:00,,EPSG,,
+32519,WGS 72BE / UTM zone 19S,,,,72deg West to 66deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16119,1995-06-02 00:00:00,,EPSG,,
+32520,WGS 72BE / UTM zone 20S,,,,66deg West to 60deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16120,1995-06-02 00:00:00,,EPSG,,
+32521,WGS 72BE / UTM zone 21S,,,,60deg West to 54deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16121,1995-06-02 00:00:00,,EPSG,,
+32522,WGS 72BE / UTM zone 22S,,,,54deg West to 48deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16122,1995-06-02 00:00:00,,EPSG,,
+32523,WGS 72BE / UTM zone 23S,,,,48deg West to 42deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16123,1995-06-02 00:00:00,,EPSG,,
+32524,WGS 72BE / UTM zone 24S,,,,42deg West to 36deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16124,1995-06-02 00:00:00,,EPSG,,
+32525,WGS 72BE / UTM zone 25S,,,,36deg West to 30deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16125,1995-06-02 00:00:00,,EPSG,,
+32526,WGS 72BE / UTM zone 26S,,,,30deg West to 24deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16126,1995-06-02 00:00:00,,EPSG,,
+32527,WGS 72BE / UTM zone 27S,,,,24deg West to 18deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16127,1995-06-02 00:00:00,,EPSG,,
+32528,WGS 72BE / UTM zone 28S,,,,18deg West to 12deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16128,1995-06-02 00:00:00,,EPSG,,
+32529,WGS 72BE / UTM zone 29S,,,,12deg West to 6deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16129,1995-06-02 00:00:00,,EPSG,,
+32530,WGS 72BE / UTM zone 30S,,,,6deg West to 0deg; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16130,1995-06-02 00:00:00,,EPSG,,
+32531,WGS 72BE / UTM zone 31S,,,,0deg to 6deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16131,1995-06-02 00:00:00,,EPSG,,
+32532,WGS 72BE / UTM zone 32S,,,,6deg East to 12deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16132,1995-06-02 00:00:00,,EPSG,,
+32533,WGS 72BE / UTM zone 33S,,,,12deg East to 18deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16133,1995-06-02 00:00:00,,EPSG,,
+32534,WGS 72BE / UTM zone 34S,,,,18deg East to 24deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16134,1995-06-02 00:00:00,,EPSG,,
+32535,WGS 72BE / UTM zone 35S,,,,24deg East to 30deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16135,1995-06-02 00:00:00,,EPSG,,
+32536,WGS 72BE / UTM zone 36S,,,,30deg East to 36deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16136,1995-06-02 00:00:00,,EPSG,,
+32537,WGS 72BE / UTM zone 37S,,,,36deg East to 42deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16137,1995-06-02 00:00:00,,EPSG,,
+32538,WGS 72BE / UTM zone 38S,,,,42deg East to 48deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16138,1995-06-02 00:00:00,,EPSG,,
+32539,WGS 72BE / UTM zone 39S,,,,48deg East to 54deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16139,1995-06-02 00:00:00,,EPSG,,
+32540,WGS 72BE / UTM zone 40S,,,,54deg East to 60deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16140,1995-06-02 00:00:00,,EPSG,,
+32541,WGS 72BE / UTM zone 41S,,,,60deg East to 66deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16141,1995-06-02 00:00:00,,EPSG,,
+32542,WGS 72BE / UTM zone 42S,,,,66deg East to 72deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16142,1995-06-02 00:00:00,,EPSG,,
+32543,WGS 72BE / UTM zone 43S,,,,72deg East to 78deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16143,1995-06-02 00:00:00,,EPSG,,
+32544,WGS 72BE / UTM zone 44S,,,,78deg East to 84deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16144,1995-06-02 00:00:00,,EPSG,,
+32545,WGS 72BE / UTM zone 45S,,,,84deg East to 90deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16145,1995-06-02 00:00:00,,EPSG,,
+32546,WGS 72BE / UTM zone 46S,,,,90deg East to 96deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16146,1995-06-02 00:00:00,,EPSG,,
+32547,WGS 72BE / UTM zone 47S,,,,96deg East to 102eg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16147,1995-06-02 00:00:00,,EPSG,,
+32548,WGS 72BE / UTM zone 48S,,,,102deg East to 108deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16148,1995-06-02 00:00:00,,EPSG,,
+32549,WGS 72BE / UTM zone 49S,,,,108deg East to 114deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16149,1995-06-02 00:00:00,,EPSG,,
+32550,WGS 72BE / UTM zone 50S,,,,114deg East to 120deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16150,1995-06-02 00:00:00,,EPSG,,
+32551,WGS 72BE / UTM zone 51S,,,,120deg East to 126deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16151,1995-06-02 00:00:00,,EPSG,,
+32552,WGS 72BE / UTM zone 52S,,,,126deg East to 132deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16152,1995-06-02 00:00:00,,EPSG,,
+32553,WGS 72BE / UTM zone 53S,,,,132deg East to 138deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16153,1995-06-02 00:00:00,,EPSG,,
+32554,WGS 72BE / UTM zone 54S,,,,138deg East to 144deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16154,1995-06-02 00:00:00,,EPSG,,
+32555,WGS 72BE / UTM zone 55S,,,,144deg East to 150deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16155,1995-06-02 00:00:00,,EPSG,,
+32556,WGS 72BE / UTM zone 56S,,,,150deg East to 156deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16156,1995-06-02 00:00:00,,EPSG,,
+32557,WGS 72BE / UTM zone 57S,,,,156deg East to 162deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16157,1995-06-02 00:00:00,,EPSG,,
+32558,WGS 72BE / UTM zone 58S,,,,162deg East to 168deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16158,1995-06-02 00:00:00,,EPSG,,
+32559,WGS 72BE / UTM zone 59S,,,,168deg East to 174deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16159,1995-06-02 00:00:00,,EPSG,,
+32560,WGS 72BE / UTM zone 60S,,,,174deg East to 180deg; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16160,1995-06-02 00:00:00,,EPSG,,
+32601,WGS 84 / UTM zone 1N,,,,180deg to 174deg West; northern hemisphere; Russia.,projected 2D,,,East,North,E,N,9001,,4326,16001,1995-06-02 00:00:00,,EPSG,,
+32602,WGS 84 / UTM zone 2N,,,,174deg West to 168deg West; northern hemisphere. Russia; United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16002,1995-06-02 00:00:00,,EPSG,,
+32603,WGS 84 / UTM zone 3N,,,,168deg West to 162deg West; northern hemisphere. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16003,1995-06-02 00:00:00,,EPSG,,
+32604,WGS 84 / UTM zone 4N,,,,162deg West to 156deg West; northern hemisphere. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16004,1995-06-02 00:00:00,,EPSG,,
+32605,WGS 84 / UTM zone 5N,,,,156deg West to 150deg West; northern hemisphere. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16005,1995-06-02 00:00:00,,EPSG,,
+32606,WGS 84 / UTM zone 6N,,,,150deg West to 144deg West; northern hemisphere. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16006,1995-06-02 00:00:00,,EPSG,,
+32607,WGS 84 / UTM zone 7N,,,,144deg West to 138deg West; northern hemisphere. Canada - British Columbia (BC); Yukon. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16007,1995-06-02 00:00:00,,EPSG,,
+32608,WGS 84 / UTM zone 8N,,,,138deg West to 132deg West; northern hemisphere. Canada - British Columbia (BC); North West Territiories; Yukon. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16008,1995-06-02 00:00:00,,EPSG,,
+32609,WGS 84 / UTM zone 9N,,,,132deg West to 126deg West; northern hemisphere. Canada - British Columbia (BC); North West Territories; Yukon. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16009,1995-06-02 00:00:00,,EPSG,,
+32610,WGS 84 / UTM zone 10N,,,,130deg West to 120deg West; northern hemisphere. Canada - British Columbia (BC); North West Territories; Nunavut; Yukon. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16010,1995-06-02 00:00:00,,EPSG,,
+32611,WGS 84 / UTM zone 11N,,,,120deg West to 114deg West; northern hemisphere. Canada - Alberta; British Columbia (BC); North West Territories; Nunavut. Mexico. United States (USA).,projected 2D,,,East,North,E,N,9001,,4326,16011,1995-06-02 00:00:00,,EPSG,,
+32612,WGS 84 / UTM zone 12N,,,,114deg West to 108deg West; northern hemisphere. Canada - Alberta; North West Territories; Nunavut; Saskatchewan. Mexico. United States (USA).,projected 2D,,,East,North,E,N,9001,,4326,16012,1995-06-02 00:00:00,,EPSG,,
+32613,WGS 84 / UTM zone 13N,,,,108deg West to 102deg West; northern hemisphere. Canada - North West Territories; Nunavut; Saskatchewan. Mexico. United States (USA).,projected 2D,,,East,North,E,N,9001,,4326,16013,1995-06-02 00:00:00,,EPSG,,
+32614,WGS 84 / UTM zone 14N,,,,102deg West to 96deg West; northern hemisphere. Canada - Manitoba; Nunavut; Saskatchewan. Mexico. United States (USA).,projected 2D,,,East,North,E,N,9001,,4326,16014,1995-06-02 00:00:00,,EPSG,,
+32615,WGS 84 / UTM zone 15N,,,,96deg West to 90deg West; northern hemisphere. Canada - Manitoba; Nunavut; Ontario. Guatemala. Mexico. United States (USA) - Gulf of Mexico (GoM).,projected 2D,,,East,North,E,N,9001,,4326,16015,1995-06-02 00:00:00,,EPSG,,
+32616,WGS 84 / UTM zone 16N,,,,90deg West to 84deg West; northern hemisphere. Belize. Canada - Manitoba; Nunavut; Ontario. Costa Rica. Cuba. El Salvador. Guatemala. Honduras. Mexico. Nicaragua. Puerto Rico. United States (USA).,projected 2D,,,East,North,E,N,9001,,4326,16016,1995-06-02 00:00:00,,EPSG,,
+32617,WGS 84 / UTM zone 17N,,,,84deg West to 78deg West; northern hemisphere. Bahamas. Ecuador - north of equator. Canada - Nunavut; Ontario; Quebec. Cayman Islands. Colombia. Costa Rica. Jamaica. Nicaragua. Panama. Puerto Rico. United States (USA).,projected 2D,,,East,North,E,N,9001,,4326,16017,1995-06-02 00:00:00,,EPSG,,
+32618,WGS 84 / UTM zone 18N,,,,78deg West to 72deg West; northern hemisphere. Bahamas. Canada - Nunavut; Ontario; Quebec. Colombia. Cuba. Ecuador. Greenland. Haiti. Jamica. Panama. Turks and Caicos Islands. United States (USA). Venezuela.,projected 2D,,,East,North,E,N,9001,,4326,16018,1995-06-02 00:00:00,,EPSG,,
+32619,WGS 84 / UTM zone 19N,,,,72deg West to 66deg West; northern hemisphere. Aruba. Bahamas. Brazil. Canada - New Brunswick (NB); Newfoundland; Nunavut; Nova Scotia (NS); Quebec. Colombia. Dominican Republic. Greenland. Netherlands Antilles. Puerto Rico. Turks and Caicos Islands. United States. Venezuela.,projected 2D,,,East,North,E,N,9001,,4326,16019,1995-06-02 00:00:00,,EPSG,,
+32620,WGS 84 / UTM zone 20N,,,,66deg West to 60deg West; northern hemisphere. Anguilla. Antigua & Barbuda. Bermuda. Brazil. Canada - New Brunswick (NB); Newfoundland; North west Territories; Nova Scotia (NS); Prince Edward Island; Quebec. Dominica. Greenland. Grenada. Guadeloupe. Guyana. Martinique. Montserrat. Saint Kitts and Nevis. Saint Lucia. Saint Vncent and the Grenadines. Trinidad and Tobago. Venezuela. Virgin islands.,projected 2D,,,East,North,E,N,9001,,4326,16020,1995-06-02 00:0 [...]
+32621,WGS 84 / UTM zone 21N,,,,60deg West to 54deg West; northern hemisphere. Barbados. Brazil. Canada - Newfoundland; Quebec. French Guiana. Greenland. Guyana. St. Pierre and Miquelon. Suriname.,projected 2D,,,East,North,E,N,9001,,4326,16021,1995-06-02 00:00:00,,EPSG,,
+32622,WGS 84 / UTM zone 22N,,,,54deg West to 48deg West; northern hemisphere. Brazil. Canada - Newfoundland. French Guiana. Greenland.,projected 2D,,,East,North,E,N,9001,,4326,16022,1995-06-02 00:00:00,,EPSG,,
+32623,WGS 84 / UTM zone 23N,,,,48deg West to 42deg West; northern hemisphere. Greenland.,projected 2D,,,East,North,E,N,9001,,4326,16023,1995-06-02 00:00:00,,EPSG,,
+32624,WGS 84 / UTM zone 24N,,,,42deg West to 36deg West; northern hemisphere. Greenland.,projected 2D,,,East,North,E,N,9001,,4326,16024,1995-06-02 00:00:00,,EPSG,,
+32625,WGS 84 / UTM zone 25N,,,,36deg West to 30deg West; northern hemisphere. Greenland.,projected 2D,,,East,North,E,N,9001,,4326,16025,1995-06-02 00:00:00,,EPSG,,
+32626,WGS 84 / UTM zone 26N,,,,30deg West to 24deg West; northern hemisphere. Greenland. Iceland.,projected 2D,,,East,North,E,N,9001,,4326,16026,1995-06-02 00:00:00,,EPSG,,
+32627,WGS 84 / UTM zone 27N,,,,24deg West to 18deg West; northern hemisphere. Greenland. Iceland.,projected 2D,,,East,North,E,N,9001,,4326,16027,1995-06-02 00:00:00,,EPSG,,
+32628,WGS 84 / UTM zone 28N,,,,18deg West to 12deg West; northern hemisphere. Gambia. Greenland. Guinea. Guinea-Bissau. Iceland. Ireland - offshore Porcupine Basin. Mauritania. Morocco. Senegal. Sierra Leone. Western Sahara.,projected 2D,,,East,North,E,N,9001,,4326,16028,1995-06-02 00:00:00,,EPSG,,
+32629,WGS 84 / UTM zone 29N,,,,12deg West to 6deg West; northern hemisphere. Algeria. Cote D'Ivoire (Ivory Coast). Faroe Islands. Guinea. Ireland. Mali. Mauritania. Morocco. Portugal. Sierra Leone. Spain. United Kingdom (UK). Western Sahara.,projected 2D,,,East,North,E,N,9001,,4326,16029,1995-06-02 00:00:00,,EPSG,,
+32630,WGS 84 / UTM zone 30N,,,,6deg West to 0deg; northern hemisphere. Algeria. Burkino Faso. Cote' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK).,projected 2D,,,East,North,E,N,9001,,4326,16030,1995-06-02 00:00:00,,EPSG,,
+32631,WGS 84 / UTM zone 31N,,,,0deg to 6deg East; northern hemisphere. Algeria. Andorra. Benin. Bukino Faso. Denmark - North Sea. France. Germany - North Sea. Ghana. Luxembourg. Mali. Netherlands. Niger. Nigeria. Norway. Spain. Togo. United Kingdom (UK) - North Sea.,projected 2D,,,East,North,E,N,9001,,4326,16031,1995-06-02 00:00:00,,EPSG,,
+32632,WGS 84 / UTM zone 32N,,,,6deg East to 12deg East; northern hemisphere. Algeria. Austria. Cameroon. Denmark. Equatorial Guinea. France. Gabon. Germany. Italy. Libya. Liechtenstein. Monaco. Netherlands. Niger. Nigeria. Norway. Sao Tome and Principe. Svalbard and Jan Mayen Islands. Sweden. Switzerland. Tunisia. Vatican City State.,projected 2D,,,East,North,E,N,9001,,4326,16032,1995-06-02 00:00:00,,EPSG,,
+32633,WGS 84 / UTM zone 33N,,,,12deg East to 18deg East; northern hemisphere. Austria. Bosnia and Herzegowina. Cmeroon. Central African Republic. Chad. Congo. Croatia. Czech Republic. Democratic Republic of the Congo (Zaire). Gabon. Germany. Hungary. Italy. Libya. Malta. Niger. Nigeria. Norway. Poland. San Marino. Slovakia. Slovenia. Svalbard and Jan Mayen Islands. Sweden.,projected 2D,,,East,North,E,N,9001,,4326,16033,1995-06-02 00:00:00,,EPSG,,
+32634,WGS 84 / UTM zone 34N,,,,18deg East to 24deg East; northern hemisphere. Albania. Belarus. Bosnia and Herzegowina. Bulgaria. Central African Republic. Chad. Croatia. Democratic Republic of the Congo (Zaire). Estonia. Finland. FYR Macedonia. Greece. Hungary. Italy. Latvia. Libya. Lithuania. Norway. Poland. Romania. Russia. Slovakia. Sudan. Svalbard. Sweden. Ukraine. Yugoslavia.,projected 2D,,,East,North,E,N,9001,,4326,16034,1995-06-02 00:00:00,,EPSG,,
+32635,WGS 84 / UTM zone 35N,,,,24deg East to 30deg East; northern hemisphere. Belarus. Bulgaria. Central African Republic. Democratic Republic of the Congo (Zaire). Egypt. Estonia. Finland. Greece. Latvia. Lesotho. Libya. Lithuania. Moldova. Norway. Romania. Russia. Sudan. Svalbard. Turkey. Uganda. Ukraine.,projected 2D,,,East,North,E,N,9001,,4326,16035,1995-06-02 00:00:00,,EPSG,,
+32636,WGS 84 / UTM zone 36N,,,,30deg East to 36deg East; northern hemisphere. Belarus. Cyprus. Egypt. Ethiopia. Finland. Israel. Jordan. Kenya. Lebanon. Norway. Russia. Saudi Arabia. Sudan. Syria. Turkey. Uganda. Ukraine.,projected 2D,,,East,North,E,N,9001,,4326,16036,1995-06-02 00:00:00,,EPSG,,
+32637,WGS 84 / UTM zone 37N,,,,36deg East to 42deg East; northern hemisphere. Djibouti. Egypt. Eritrea. Ethiopia. Georgia. Iraq. Jordan. Kenya. Lebanon. Russia. Saudi Arabia. Somalia. Sudan. Syria. Turkey. Ukraine.,projected 2D,,,East,North,E,N,9001,,4326,16037,1995-06-02 00:00:00,,EPSG,,
+32638,WGS 84 / UTM zone 38N,,,,42deg East to 48deg East; northern hemisphere. Armenia. Azerbaijan. Djibouti. Eritrea. Ethiopia. Georgia. Iran. Iraq. Kazakhstan. Kuwait. Russia. Saudi Arabia. Somalia. Turkey. Yemen.,projected 2D,,,East,North,E,N,9001,,4326,16038,1995-06-02 00:00:00,,EPSG,,
+32639,WGS 84 / UTM zone 39N,,,,48deg East to 54deg East; northern hemisphere. Azerbaijan. Bahrain. Iran. Kazakhstan. Kuwait. Oman. Qatar. Russia. Saudi Arabia. Somalia. Turkmenistan. United Arab Emirates. Yemen.,projected 2D,,,East,North,E,N,9001,,4326,16039,1995-06-02 00:00:00,,EPSG,,
+32640,WGS 84 / UTM zone 40N,,,,54deg East to 60deg East; northern hemisphere. Iran. Kazakhstan. Oman. Russia. Saudi Arabia. Turkmenistan. United Arab Emirates. Uzbekistan.,projected 2D,,,East,North,E,N,9001,,4326,16040,1995-06-02 00:00:00,,EPSG,,
+32641,WGS 84 / UTM zone 41N,,,,60deg East to 66deg East; northern hemisphere. Afghanistan. Iran. Kazakhstan. Pakistan. Russia. Turkmenistan. Uzbekistan.,projected 2D,,,East,North,E,N,9001,,4326,16041,1995-06-02 00:00:00,,EPSG,,
+32642,WGS 84 / UTM zone 42N,,,,66deg East to 72deg East; northern hemisphere. Afghanistan. India. Kazakhstan. Kyrgyzstan. Pakistan. Russia. Tajikistan. Uzbekistan.,projected 2D,,,East,North,E,N,9001,,4326,16042,1995-06-02 00:00:00,,EPSG,,
+32643,WGS 84 / UTM zone 43N,,,,72deg East to 78deg East; northern hemisphere. China. India. Kazakhstan. Kyrgyzstan. Maldives. Pakistan. Russia. Tajikistan.,projected 2D,,,East,North,E,N,9001,,4326,16043,1995-06-02 00:00:00,,EPSG,,
+32644,WGS 84 / UTM zone 44N,,,,78deg East to 84deg East; northern hemisphere. China. India. Kazakhstan. Kyrgyzstan. Nepal. Russia. Sri Lanka.,projected 2D,,,East,North,E,N,9001,,4326,16044,1995-06-02 00:00:00,,EPSG,,
+32645,WGS 84 / UTM zone 45N,,,,84deg East to 90deg East; northern hemisphere. Bangladesh. Bhutan. China. India. Kazakhstan. Mongolia. Nepal. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16045,1995-06-02 00:00:00,,EPSG,,
+32646,WGS 84 / UTM zone 46N,,,,90deg East to 96deg East; northern hemisphere. Bangladesh. Bhutan. China. Indonesia. Mongolia. Myanmar (Burma). Russia.,projected 2D,,,East,North,E,N,9001,,4326,16046,1995-06-02 00:00:00,,EPSG,,
+32647,WGS 84 / UTM zone 47N,,,,96deg East to 102eg East; northern hemisphere. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Myanmar (Burma). Russia. Thailand.,projected 2D,,,East,North,E,N,9001,,4326,16047,1995-06-02 00:00:00,,EPSG,,
+32648,WGS 84 / UTM zone 48N,,,,102deg East to 108deg East; northern hemisphere. Cambodia. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Russia. Singapore. Thailand. Vietnam.,projected 2D,,,East,North,E,N,9001,,4326,16048,1995-06-02 00:00:00,,EPSG,,
+32649,WGS 84 / UTM zone 49N,,,,108deg East to 114deg East; northern hemisphere. China. Hong Kong. Indonesia. Macau. Malaysia - East Malaysia - Sarawak. Mongolia. Russia. Vietnam.,projected 2D,,,East,North,E,N,9001,,4326,16049,1995-06-02 00:00:00,,EPSG,,
+32650,WGS 84 / UTM zone 50N,,,,114deg East to 120deg East; northern hemisphere. Brunei. China. Indonesia. Malaysia - East Malaysia - Sarawak. Mongolia. Philippines. Russia. Taiwan.,projected 2D,,,East,North,E,N,9001,,4326,16050,1995-06-02 00:00:00,,EPSG,,
+32651,WGS 84 / UTM zone 51N,,,,120deg East to 126deg East; northern hemisphere. China. Indonesia. Japan. North Korea. Philippines. Russia. South Korea. Taiwan.,projected 2D,,,East,North,E,N,9001,,4326,16051,1995-06-02 00:00:00,,EPSG,,
+32652,WGS 84 / UTM zone 52N,,,,126deg East to 132deg East; northern hemisphere. China. Indonesia. Japan. North Korea. Russia. South Korea.,projected 2D,,,East,North,E,N,9001,,4326,16052,1995-06-02 00:00:00,,EPSG,,
+32653,WGS 84 / UTM zone 53N,,,,132deg East to 138deg East; northern hemisphere. China. Japan. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16053,1995-06-02 00:00:00,,EPSG,,
+32654,WGS 84 / UTM zone 54N,,,,138deg East to 144deg East; northern hemisphere. Japan. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16054,1995-06-02 00:00:00,,EPSG,,
+32655,WGS 84 / UTM zone 55N,,,,144deg East to 150deg East; northern hemisphere. Japan. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16055,1995-06-02 00:00:00,,EPSG,,
+32656,WGS 84 / UTM zone 56N,,,,150deg East to 156deg East; northern hemisphere. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16056,1995-06-02 00:00:00,,EPSG,,
+32657,WGS 84 / UTM zone 57N,,,,156deg East to 162deg East; northern hemisphere. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16057,1995-06-02 00:00:00,,EPSG,,
+32658,WGS 84 / UTM zone 58N,,,,162deg East to 168deg East; northern hemisphere. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16058,1995-06-02 00:00:00,,EPSG,,
+32659,WGS 84 / UTM zone 59N,,,,168deg East to 174deg East; northern hemisphere. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16059,1995-06-02 00:00:00,,EPSG,,
+32660,WGS 84 / UTM zone 60N,,,,174deg East to 180deg; northern hemisphere. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16060,1995-06-02 00:00:00,,EPSG,,
+32661,WGS 84 / UPS North,,,,Polar areas north of 84 deg N.,projected 2D,,,East,North,E,N,9001,,4326,16061,1996-09-12 00:00:00,,EPSG,,
+32701,WGS 84 / UTM zone 1S,,,,180deg to 174deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16101,1995-06-02 00:00:00,,EPSG,,
+32702,WGS 84 / UTM zone 2S,,,,174deg West to 168deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16102,1995-06-02 00:00:00,,EPSG,,
+32703,WGS 84 / UTM zone 3S,,,,168deg West to 162deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16103,1995-06-02 00:00:00,,EPSG,,
+32704,WGS 84 / UTM zone 4S,,,,162deg West to 156deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16104,1995-06-02 00:00:00,,EPSG,,
+32705,WGS 84 / UTM zone 5S,,,,156deg West to 150deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16105,1995-06-02 00:00:00,,EPSG,,
+32706,WGS 84 / UTM zone 6S,,,,150deg West to 144deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16106,1995-06-02 00:00:00,,EPSG,,
+32707,WGS 84 / UTM zone 7S,,,,144deg West to 138deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16107,1995-06-02 00:00:00,,EPSG,,
+32708,WGS 84 / UTM zone 8S,,,,138deg West to 132deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16108,1995-06-02 00:00:00,,EPSG,,
+32709,WGS 84 / UTM zone 9S,,,,132deg West to 126deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16109,1995-06-02 00:00:00,,EPSG,,
+32710,WGS 84 / UTM zone 10S,,,,130deg West to 120deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16110,1995-06-02 00:00:00,,EPSG,,
+32711,WGS 84 / UTM zone 11S,,,,120deg West to 114deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16111,1995-06-02 00:00:00,,EPSG,,
+32712,WGS 84 / UTM zone 12S,,,,114deg West to 108deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16112,1995-06-02 00:00:00,,EPSG,,
+32713,WGS 84 / UTM zone 13S,,,,108deg West to 102deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16113,1995-06-02 00:00:00,,EPSG,,
+32714,WGS 84 / UTM zone 14S,,,,102deg West to 96deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16114,1995-06-02 00:00:00,,EPSG,,
+32715,WGS 84 / UTM zone 15S,,,,96deg West to 90deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16115,1995-06-02 00:00:00,,EPSG,,
+32716,WGS 84 / UTM zone 16S,,,,90deg West to 84deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16116,1995-06-02 00:00:00,,EPSG,,
+32717,WGS 84 / UTM zone 17S,,,,84deg West to 78deg West; southern hemisphere. Ecuador. Peru.,projected 2D,,,East,North,E,N,9001,,4326,16117,1995-06-02 00:00:00,,EPSG,,
+32718,WGS 84 / UTM zone 18S,,,,78deg West to 72deg West; southern hemisphere. Argentina. Brazil. Chile. Colombia. Ecuador. Peru.,projected 2D,,,East,North,E,N,9001,,4326,16118,1995-06-02 00:00:00,,EPSG,,
+32719,WGS 84 / UTM zone 19S,,,,72deg West to 66deg West; southern hemisphere. Argentina. Bolivia. Brazil. Chile. Colombia. Peru.,projected 2D,,,East,North,E,N,9001,,4326,16119,1995-06-02 00:00:00,,EPSG,,
+32720,WGS 84 / UTM zone 20S,,,,66deg West to 60deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay.,projected 2D,,,East,North,E,N,9001,,4326,16120,1995-06-02 00:00:00,,EPSG,,
+32721,WGS 84 / UTM zone 21S,,,,60deg West to 54deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay. Uruguay.,projected 2D,,,East,North,E,N,9001,,4326,16121,1995-06-02 00:00:00,,EPSG,,
+32722,WGS 84 / UTM zone 22S,,,,54deg West to 48deg West; southern hemisphere. Brazil. Uruguay.,projected 2D,,,East,North,E,N,9001,,4326,16122,1995-06-02 00:00:00,,EPSG,,
+32723,WGS 84 / UTM zone 23S,,,,48deg West to 42deg West; southern hemisphere. Brazil.,projected 2D,,,East,North,E,N,9001,,4326,16123,1995-06-02 00:00:00,,EPSG,,
+32724,WGS 84 / UTM zone 24S,,,,42deg West to 36deg West; southern hemisphere. Brazil. South Georgia and the South Sandwich Islands.,projected 2D,,,East,North,E,N,9001,,4326,16124,1995-06-02 00:00:00,,EPSG,,
+32725,WGS 84 / UTM zone 25S,,,,36deg West to 30deg West; southern hemisphere. Brazil.,projected 2D,,,East,North,E,N,9001,,4326,16125,1995-06-02 00:00:00,,EPSG,,
+32726,WGS 84 / UTM zone 26S,,,,30deg West to 24deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16126,1995-06-02 00:00:00,,EPSG,,
+32727,WGS 84 / UTM zone 27S,,,,24deg West to 18deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16127,1995-06-02 00:00:00,,EPSG,,
+32728,WGS 84 / UTM zone 28S,,,,18deg West to 12deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16128,1995-06-02 00:00:00,,EPSG,,
+32729,WGS 84 / UTM zone 29S,,,,12deg West to 6deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16129,1995-06-02 00:00:00,,EPSG,,
+32730,WGS 84 / UTM zone 30S,,,,6deg West to 0deg; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16130,1995-06-02 00:00:00,,EPSG,,
+32731,WGS 84 / UTM zone 31S,,,,0deg to 6deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16131,1995-06-02 00:00:00,,EPSG,,
+32732,WGS 84 / UTM zone 32S,,,,6deg East to 12deg East; southern hemisphere. Angola. Congo. Gabon. Namibia.,projected 2D,,,East,North,E,N,9001,,4326,16132,1995-06-02 00:00:00,,EPSG,,
+32733,WGS 84 / UTM zone 33S,,,,12deg East to 18deg East; southern hemisphere. Angola. Congo. Democratic Republic of the Congo (Zaire). Gabon. Namibia. South Africa.,projected 2D,,,East,North,E,N,9001,,4326,16133,1995-06-02 00:00:00,,EPSG,,
+32734,WGS 84 / UTM zone 34S,,,,18deg East to 24deg East; southern hemisphere. Angola. Botswana. Democratic Republic of the Congo (Zaire). Namibia. South Africa. Zambia.,projected 2D,,,East,North,E,N,9001,,4326,16134,1995-06-02 00:00:00,,EPSG,,
+32735,WGS 84 / UTM zone 35S,,,,24deg East to 30deg East; southern hemisphere. Botswana. Burundi. Democratic Republic of the Congo (Zaire). Rwanda. South Africa. Tanzania. Uganda. Zambia. Zimbabwe.,projected 2D,,,East,North,E,N,9001,,4326,16135,1995-06-02 00:00:00,,EPSG,,
+32736,WGS 84 / UTM zone 36S,,,,30deg East to 36deg East; southern hemisphere. Burundi. Kenya. Malawi. Mozambique. Rwanda. South Africa. Swaziland. Tanzania. Uganda. Zambia. Zimbabwe.,projected 2D,,,East,North,E,N,9001,,4326,16136,1995-06-02 00:00:00,,EPSG,,
+32737,WGS 84 / UTM zone 37S,,,,36deg East to 42deg East; southern hemisphere. Kenya. Mozambique. Tanzania.,projected 2D,,,East,North,E,N,9001,,4326,16137,1995-06-02 00:00:00,,EPSG,,
+32738,WGS 84 / UTM zone 38S,,,,42deg East to 48deg East; southern hemisphere. Madagascar.,projected 2D,,,East,North,E,N,9001,,4326,16138,1995-06-02 00:00:00,,EPSG,,
+32739,WGS 84 / UTM zone 39S,,,,48deg East to 54deg East; southern hemisphere. Madagascar.,projected 2D,,,East,North,E,N,9001,,4326,16139,1995-06-02 00:00:00,,EPSG,,
+32740,WGS 84 / UTM zone 40S,,,,54deg East to 60deg East; southern hemisphere. Seychelles.,projected 2D,,,East,North,E,N,9001,,4326,16140,1995-06-02 00:00:00,,EPSG,,
+32741,WGS 84 / UTM zone 41S,,,,60deg East to 66deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16141,1995-06-02 00:00:00,,EPSG,,
+32742,WGS 84 / UTM zone 42S,,,,66deg East to 72deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16142,1995-06-02 00:00:00,,EPSG,,
+32743,WGS 84 / UTM zone 43S,,,,72deg East to 78deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16143,1995-06-02 00:00:00,,EPSG,,
+32744,WGS 84 / UTM zone 44S,,,,78deg East to 84deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16144,1995-06-02 00:00:00,,EPSG,,
+32745,WGS 84 / UTM zone 45S,,,,84deg East to 90deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16145,1995-06-02 00:00:00,,EPSG,,
+32746,WGS 84 / UTM zone 46S,,,,90deg East to 96deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16146,1995-06-02 00:00:00,,EPSG,,
+32747,WGS 84 / UTM zone 47S,,,,96deg East to 102eg East; southern hemisphere. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16147,1995-06-02 00:00:00,,EPSG,,
+32748,WGS 84 / UTM zone 48S,,,,102deg East to 108deg East; southern hemisphere. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16148,1995-06-02 00:00:00,,EPSG,,
+32749,WGS 84 / UTM zone 49S,,,,108deg East to 114deg East; southern hemisphere. Australia. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16149,1995-06-02 00:00:00,,EPSG,,
+32750,WGS 84 / UTM zone 50S,,,,114deg East to 120deg East; southern hemisphere. Australia. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16150,1995-06-02 00:00:00,,EPSG,,
+32751,WGS 84 / UTM zone 51S,,,,120deg East to 126deg East; southern hemisphere. Australia. East Timor. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16151,1995-06-02 00:00:00,,EPSG,,
+32752,WGS 84 / UTM zone 52S,,,,126deg East to 132deg East; southern hemisphere. Australia. East Timor. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16152,1995-06-02 00:00:00,,EPSG,,
+32753,WGS 84 / UTM zone 53S,,,,132deg East to 138deg East; southern hemisphere. Australia. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16153,1995-06-02 00:00:00,,EPSG,,
+32754,WGS 84 / UTM zone 54S,,,,138deg East to 144deg East; southern hemisphere. Australia. Indonesia. Papua New Guinea.,projected 2D,,,East,North,E,N,9001,,4326,16154,1995-06-02 00:00:00,,EPSG,,
+32755,WGS 84 / UTM zone 55S,,,,144deg East to 150deg East; southern hemisphere. Australia. Papua New Guinea.,projected 2D,,,East,North,E,N,9001,,4326,16155,1995-06-02 00:00:00,,EPSG,,
+32756,WGS 84 / UTM zone 56S,,,,150deg East to 156deg East; southern hemisphere. Australia. Papua New Guinea.,projected 2D,,,East,North,E,N,9001,,4326,16156,1995-06-02 00:00:00,,EPSG,,
+32757,WGS 84 / UTM zone 57S,,,,156deg East to 162deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16157,1995-06-02 00:00:00,,EPSG,,
+32758,WGS 84 / UTM zone 58S,,,,162deg East to 168deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16158,1995-06-02 00:00:00,,EPSG,,
+32759,WGS 84 / UTM zone 59S,,,,168deg East to 174deg East; southern hemisphere. New Zealand.,projected 2D,,,East,North,E,N,9001,,4326,16159,1995-06-02 00:00:00,,EPSG,,
+32760,WGS 84 / UTM zone 60S,,,,174deg East to 180deg; southern hemisphere. New Zealand.,projected 2D,,,East,North,E,N,9001,,4326,16160,1995-06-02 00:00:00,,EPSG,,
+32761,WGS 84 / UPS South,,,,Polar areas south of 80 deg S.,projected 2D,,,East,North,E,N,9001,,4326,16161,1996-09-12 00:00:00,,EPSG,,
+32766,WGS 84 / TM 36 SE,,,,Mozambique - offshore.,projected 2D,,,East,North,E,N,9001,,4326,16636,1998-11-11 00:00:00,BP Mozambique,EPSG,Used by BP Mozambique for Offshore Zambezi block.,
diff --git a/src/tiff/csv/naming_system.csv b/src/tiff/csv/naming_system.csv
new file mode 100644
index 0000000..4867050
--- /dev/null
+++ b/src/tiff/csv/naming_system.csv
@@ -0,0 +1,13 @@
+"NAMING_SYSTEM_CODE","NAMING_SYSTEM_NAME","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+7300,EPSG alternative spelling,An alternative spelling of the EPSG name; assigned by EPSG.,EPSG,EPSG,2000-05-07 00:00:00,,0
+7301,EPSG alias,An alternative name assigned by EPSG.,EPSG,EPSG,2000-05-07 00:00:00,,0
+7302,EPSG abbreviation,An abbreviation assigned by EPSG.,EPSG,EPSG,2000-05-07 00:00:00,,0
+7303,User name,An alternative name assigned by user; not populated by EPSG.,(User to insert),EPSG,2000-05-07 00:00:00,,0
+7304,User alias,A secondary alternative name assigned by user; not populated by EPSG.,(User to insert),EPSG,2000-05-07 00:00:00,,0
+7305,User abbreviation,An abbreviation assigned by user; not populated by EPSG.,(User to insert),EPSG,2000-05-07 00:00:00,,0
+7306,POSC acronym,An abbreviation assigned by the Petrotechnical Open Software Corporation (POSC).,POSC,EPSG,2000-05-07 00:00:00,,0
+7307,EuroGeographics Identifier,A unique identifier used in the compilation of European national mapping agency data by EuroGeographics.,EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+7308,Croatia alternative identifier,,EPSG,EPSG,2001-06-05 00:00:00,,0
+7309,Slovenia alternative identifier,,EPSG,EPSG,2001-06-05 00:00:00,,0
+7310,Germany alternative identifier,An alternative name used by the BfK.,EPSG,EPSG,2001-06-05 00:00:00,,0
+7311,Indonesian alternative identifier,An alternative name used by Bakosurtanal.,EPSG,EPSG,2002-06-22 00:00:00,,0
diff --git a/src/tiff/csv/p_meridian.c b/src/tiff/csv/p_meridian.c
new file mode 100644
index 0000000..f39beb2
--- /dev/null
+++ b/src/tiff/csv/p_meridian.c
@@ -0,0 +1,17 @@
+#include "defs.h"
+datafile_rows_t p_meridian_row_1[] = {"PRIME_MERIDIAN_CODE","PRIME_MERID_EPSG_NAME","PRIME_MERID_USER_NAME","GREENWICH_LONGITUDE","UOM_ANGLE_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t p_meridian_row_2[] = {"8901","Greenwich","","0.0","9110","1995-06-02 00:00:00","","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_3[] = {"8902","Lisbon","","-9.0754862","9110","1995-06-02 00:00:00","Instituto Geografico e Cadastral; Lisbon","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_4[] = {"8903","Paris","","2.5969213","9105","1995-06-02 00:00:00","Institut Geographique National (IGN); Paris","EPSG","Value adopted by IGN (Paris) in 1936. Equivalent to 2 deg 20min 14.025sec. Preferred by EPSG to earlier value of 2deg 20min 13.95sec (2.596898 grads) used by RGS London.","",NULL};
+datafile_rows_t p_meridian_row_5[] = {"8904","Bogota","","-74.04513","9110","1995-06-02 00:00:00","Instituto Geografico \"Augustin Cadazzi\" (IGAC); Bogota","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_6[] = {"8905","Madrid","","-3.411658","9110","1995-06-02 00:00:00","","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_7[] = {"8906","Rome","","12.27084","9110","1995-06-02 00:00:00","","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_8[] = {"8907","Bern","","7.26225","9110","1995-06-02 00:00:00","Bundesamt f�r Landestopographie","EPSG","1895 value. Newer value of 7 deg 26 min 22.335 sec E determined in 1938.","96.29",NULL};
+datafile_rows_t p_meridian_row_9[] = {"8908","Jakarta","","106.482779","9110","1995-06-02 00:00:00","","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_10[] = {"8909","Ferro","","-17.4","9110","1995-06-02 00:00:00","","EPSG","Used in Austria and former Czechoslovakia.","96.29",NULL};
+datafile_rows_t p_meridian_row_11[] = {"8910","Brussels","","4.220471","9110","1995-06-02 00:00:00","","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_12[] = {"8911","Stockholm","","18.03298","9110","1995-06-02 00:00:00","","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_13[] = {"8912","Athens","","23.4258815","9110","1997-06-16 00:00:00","Topography Department; National Technical University of Athens.","EPSG","Used in Greece for older mapping based on Hatt projection.","",NULL};
+datafile_rows_t p_meridian_row_14[] = {"8913","Oslo","","10.43225","9110","1999-10-20 00:00:00","Statens kartverk - Geodesi dividsion","EPSG","Formerly known as Kristiana and Christiana.","",NULL};
+
+datafile_rows_t *p_meridian_rows[] = {p_meridian_row_1,p_meridian_row_2,p_meridian_row_3,p_meridian_row_4,p_meridian_row_5,p_meridian_row_6,p_meridian_row_7,p_meridian_row_8,p_meridian_row_9,p_meridian_row_10,p_meridian_row_11,p_meridian_row_12,p_meridian_row_13,p_meridian_row_14,NULL};
diff --git a/src/tiff/csv/p_meridian.csv b/src/tiff/csv/p_meridian.csv
new file mode 100644
index 0000000..9e289fe
--- /dev/null
+++ b/src/tiff/csv/p_meridian.csv
@@ -0,0 +1,14 @@
+"PRIME_MERIDIAN_CODE","PRIME_MERID_EPSG_NAME","PRIME_MERID_USER_NAME","GREENWICH_LONGITUDE","UOM_ANGLE_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+8901,Greenwich,,0.0,9110,1995-06-02 00:00:00,,EPSG,,96.29
+8902,Lisbon,,-9.0754862,9110,1995-06-02 00:00:00,Instituto Geografico e Cadastral; Lisbon,EPSG,,96.29
+8903,Paris,,2.5969213,9105,1995-06-02 00:00:00,Institut Geographique National (IGN); Paris,EPSG,Value adopted by IGN (Paris) in 1936. Equivalent to 2 deg 20min 14.025sec. Preferred by EPSG to earlier value of 2deg 20min 13.95sec (2.596898 grads) used by RGS London.,
+8904,Bogota,,-74.04513,9110,1995-06-02 00:00:00,"Instituto Geografico \"Augustin Cadazzi\" (IGAC); Bogota",EPSG,,96.29
+8905,Madrid,,-3.411658,9110,1995-06-02 00:00:00,,EPSG,,96.29
+8906,Rome,,12.27084,9110,1995-06-02 00:00:00,,EPSG,,96.29
+8907,Bern,,7.26225,9110,1995-06-02 00:00:00,Bundesamt f�r Landestopographie,EPSG,1895 value. Newer value of 7 deg 26 min 22.335 sec E determined in 1938.,96.29
+8908,Jakarta,,106.482779,9110,1995-06-02 00:00:00,,EPSG,,96.29
+8909,Ferro,,-17.4,9110,1995-06-02 00:00:00,,EPSG,Used in Austria and former Czechoslovakia.,96.29
+8910,Brussels,,4.220471,9110,1995-06-02 00:00:00,,EPSG,,96.29
+8911,Stockholm,,18.03298,9110,1995-06-02 00:00:00,,EPSG,,96.29
+8912,Athens,,23.4258815,9110,1997-06-16 00:00:00,Topography Department; National Technical University of Athens.,EPSG,Used in Greece for older mapping based on Hatt projection.,
+8913,Oslo,,10.43225,9110,1999-10-20 00:00:00,Statens kartverk - Geodesi dividsion,EPSG,Formerly known as Kristiana and Christiana.,
diff --git a/src/tiff/csv/pcs.csv b/src/tiff/csv/pcs.csv
new file mode 100644
index 0000000..f7c38a4
--- /dev/null
+++ b/src/tiff/csv/pcs.csv
@@ -0,0 +1,2251 @@
+"COORD_REF_SYS_CODE","COORD_REF_SYS_NAME","UOM_CODE","SOURCE_GEOGCRS_CODE","COORD_OP_CODE","COORD_OP_METHOD_CODE","PARAMETER_CODE_1","PARAMETER_VALUE_1","PARAMETER_UOM_1","PARAMETER_CODE_2","PARAMETER_VALUE_2","PARAMETER_UOM_2","PARAMETER_CODE_3","PARAMETER_VALUE_3","PARAMETER_UOM_3","PARAMETER_CODE_4","PARAMETER_VALUE_4","PARAMETER_UOM_4","PARAMETER_CODE_5","PARAMETER_VALUE_5","PARAMETER_UOM_5","PARAMETER_CODE_6","PARAMETER_VALUE_6","PARAMETER_UOM_6","PARAMETER_CODE_7","PARAMETER_VALUE_ [...]
+2000,"Anguilla 1957 / British West Indies Grid",9001,4600,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2001,"Antigua 1943 / British West Indies Grid",9001,4601,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2002,"Dominica 1945 / British West Indies Grid",9001,4602,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2003,"Grenada 1953 / British West Indies Grid",9001,4603,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2004,"Montserrat 58 / British West Indies Grid",9001,4604,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2005,"St Kitts 1955 / British West Indies Grid",9001,4605,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2006,"St Lucia 1955 / British West Indies Grid",9001,4606,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2007,"St Vincent 45 / British West Indies Grid",9001,4607,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2008,"NAD27(CGQ77) / SCoPQ zone 2",9001,4609,17700,9807,8801,0.0,9110,8802,-55.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2009,"NAD27(CGQ77) / SCoPQ zone 3",9001,4609,17703,9807,8801,0.0,9110,8802,-58.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2010,"NAD27(CGQ77) / SCoPQ zone 4",9001,4609,17704,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2011,"NAD27(CGQ77) / SCoPQ zone 5",9001,4609,17705,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2012,"NAD27(CGQ77) / SCoPQ zone 6",9001,4609,17706,9807,8801,0.0,9110,8802,-67.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2013,"NAD27(CGQ77) / SCoPQ zone 7",9001,4609,17707,9807,8801,0.0,9110,8802,-70.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2014,"NAD27(CGQ77) / SCoPQ zone 8",9001,4609,17708,9807,8801,0.0,9110,8802,-73.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2015,"NAD27(CGQ77) / SCoPQ zone 9",9001,4609,17709,9807,8801,0.0,9110,8802,-76.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2016,"NAD27(CGQ77) / SCoPQ zone 10",9001,4609,17710,9807,8801,0.0,9110,8802,-79.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2017,"NAD27(76) / MTM zone 8",9001,4608,17708,9807,8801,0.0,9110,8802,-73.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2018,"NAD27(76) / MTM zone 9",9001,4608,17709,9807,8801,0.0,9110,8802,-76.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2019,"NAD27(76) / MTM zone 10",9001,4608,17710,9807,8801,0.0,9110,8802,-79.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2020,"NAD27(76) / MTM zone 11",9001,4608,17711,9807,8801,0.0,9110,8802,-82.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2021,"NAD27(76) / MTM zone 12",9001,4608,17712,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2022,"NAD27(76) / MTM zone 13",9001,4608,17713,9807,8801,0.0,9102,8802,-84.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2023,"NAD27(76) / MTM zone 14",9001,4608,17714,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2024,"NAD27(76) / MTM zone 15",9001,4608,17715,9807,8801,0.0,9102,8802,-90.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2025,"NAD27(76) / MTM zone 16",9001,4608,17716,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2026,"NAD27(76) / MTM zone 17",9001,4608,17717,9807,8801,0.0,9102,8802,-96.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2027,"NAD27(76) / UTM zone 15N",9001,4608,16015,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2028,"NAD27(76) / UTM zone 16N",9001,4608,16016,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2029,"NAD27(76) / UTM zone 17N",9001,4608,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2030,"NAD27(76) / UTM zone 18N",9001,4608,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2031,"NAD27(CGQ77) / UTM zone 17N",9001,4609,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2032,"NAD27(CGQ77) / UTM zone 18N",9001,4609,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2033,"NAD27(CGQ77) / UTM zone 19N",9001,4609,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2034,"NAD27(CGQ77) / UTM zone 20N",9001,4609,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2035,"NAD27(CGQ77) / UTM zone 21N",9001,4609,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2036,"NAD83(CSRS98) / New Brunswick Stereo",9001,4140,19946,9809,8801,46.3,9110,8802,-66.3,9110,8805,0.999912,9201,8806,2500000.0,9001,8807,7500000.0,9001,,,,,,
+2037,"NAD83(CSRS98) / UTM zone 19N",9001,4140,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2038,"NAD83(CSRS98) / UTM zone 20N",9001,4140,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2039,"Israel / Israeli TM Grid",9001,4141,18204,9807,8801,31.4403817,9110,8802,35.1216261,9110,8805,1.0000067,9201,8806,219529.584,9001,8807,626907.39,9001,,,,,,
+2040,"Locodjo 1965 / UTM zone 30N",9001,4142,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2041,"Abidjan 1987 / UTM zone 30N",9001,4143,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2042,"Locodjo 1965 / UTM zone 29N",9001,4142,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2043,"Abidjan 1987 / UTM zone 29N",9001,4143,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2044,"Hanoi 1972 / Gauss-Kruger zone 18",9001,4147,16218,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+2045,"Hanoi 1972 / Gauss-Kruger zone 19",9001,4147,16219,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+2046,"Hartebeesthoek94 / Lo15",9001,4148,17515,9808,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2047,"Hartebeesthoek94 / Lo17",9001,4148,17517,9808,8801,0.0,9102,8802,17.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2048,"Hartebeesthoek94 / Lo19",9001,4148,17519,9808,8801,0.0,9102,8802,19.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2049,"Hartebeesthoek94 / Lo21",9001,4148,17521,9808,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2050,"Hartebeesthoek94 / Lo23",9001,4148,17523,9808,8801,0.0,9102,8802,23.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2051,"Hartebeesthoek94 / Lo25",9001,4148,17525,9808,8801,0.0,9102,8802,25.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2052,"Hartebeesthoek94 / Lo27",9001,4148,17527,9808,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2053,"Hartebeesthoek94 / Lo29",9001,4148,17529,9808,8801,0.0,9102,8802,29.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2054,"Hartebeesthoek94 / Lo31",9001,4148,17531,9808,8801,0.0,9102,8802,31.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2055,"Hartebeesthoek94 / Lo33",9001,4148,17533,9808,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2056,"CH1903+ / LV95",9001,4150,19950,9815,8811,46.570866,9110,8812,7.26225,9110,8813,90.0,9110,8814,90.0,9110,8815,1.0,9201,8816,2600000.0,9001,8817,1200000.0,9001
+2057,"Rassadiran / Nakhl e Taqi",9001,4153,19951,9815,8811,27.31077837,9110,8812,52.3612741,9110,8813,0.34179803,9110,8814,0.34179803,9110,8815,0.999895934,9201,8816,658377.437,9001,8817,3044969.194,9001
+2058,"ED50(ED77) / UTM zone 38N",9001,4154,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2059,"ED50(ED77) / UTM zone 39N",9001,4154,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2060,"ED50(ED77) / UTM zone 40N",9001,4154,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2061,"ED50(ED77) / UTM zone 41N",9001,4154,16041,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2062,"Madrid 1870 (Madrid) / Spain",9001,4903,19921,9801,8801,40.0,9102,8802,0.0,9102,8805,0.9988085293,9201,8806,600000.0,9001,8807,600000.0,9001,,,,,,
+2063,"Dabola 1981 / UTM zone 28N",9001,4315,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2064,"Dabola 1981 / UTM zone 29N",9001,4315,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2065,"S-JTSK (Ferro) / Krovak",9001,4818,19952,9819,8811,49.3,9110,8812,42.3,9110,8813,30.1717303,9110,8816,0.0,9001,8817,0.0,9001,8818,78.3,9110,8819,0.9999,9201
+2066,"Mount Dillon / Tobago Grid",9039,4157,19924,9806,8801,11.1507843,9110,8802,-60.4109632,9110,8806,187500.0,9039,8807,180000.0,9039,,,,,,,,,
+2067,"Naparima 1955 / UTM zone 20N",9001,4158,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2068,"ELD79 / Libya zone 5",9001,4159,18240,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2069,"ELD79 / Libya zone 6",9001,4159,18241,9807,8801,0.0,9102,8802,11.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2070,"ELD79 / Libya zone 7",9001,4159,18242,9807,8801,0.0,9102,8802,13.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2071,"ELD79 / Libya zone 8",9001,4159,18243,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2072,"ELD79 / Libya zone 9",9001,4159,18244,9807,8801,0.0,9102,8802,17.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2073,"ELD79 / Libya zone 10",9001,4159,18245,9807,8801,0.0,9102,8802,19.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2074,"ELD79 / Libya zone 11",9001,4159,18246,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2075,"ELD79 / Libya zone 12",9001,4159,18247,9807,8801,0.0,9102,8802,23.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2076,"ELD79 / Libya zone 13",9001,4159,18248,9807,8801,0.0,9102,8802,25.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2077,"ELD79 / UTM zone 32N",9001,4159,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2078,"ELD79 / UTM zone 33N",9001,4159,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2079,"ELD79 / UTM zone 34N",9001,4159,16034,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2080,"ELD79 / UTM zone 35N",9001,4159,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2081,"Chos Malal 1914 / Argentina zone 2",9001,4160,18032,9807,8801,-90.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+2082,"Pampa del Castillo / Argentina zone 2",9001,4161,18032,9807,8801,-90.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+2083,"Hito XVIII 1963 / Argentina zone 2",9001,4254,18032,9807,8801,-90.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+2084,"Hito XVIII 1963 / UTM zone 19S",9001,4254,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2085,"NAD27 / Cuba Norte",9001,4267,18061,9801,8801,22.21,9110,8802,-81.0,9110,8805,0.99993602,9201,8806,500000.0,9001,8807,280296.016,9001,,,,,,
+2086,"NAD27 / Cuba Sur",9001,4267,18062,9801,8801,20.43,9110,8802,-76.5,9110,8805,0.99994848,9201,8806,500000.0,9001,8807,229126.939,9001,,,,,,
+2087,"ELD79 / TM 12 NE",9001,4159,16412,9807,8801,0.0,9102,8802,12.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2088,"Carthage / TM 11 NE",9001,4223,16411,9807,8801,0.0,9102,8802,11.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2089,"Yemen NGN96 / UTM zone 38N",9001,4163,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2090,"Yemen NGN96 / UTM zone 39N",9001,4163,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2091,"South Yemen / Gauss Kruger zone 8",9001,4164,16208,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+2092,"South Yemen / Gauss Kruger zone 9",9001,4164,16209,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+2093,"Hanoi 1972 / GK 106 NE",9001,4147,16586,9807,8801,0.0,9102,8802,106.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2094,"WGS 72BE / TM 106 NE",9001,4324,16506,9807,8801,0.0,9102,8802,106.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2095,"Bissau / UTM zone 28N",9001,4165,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2096,"Korean 1985 / Korea East Belt",9001,4162,18251,9807,8801,38.0,9102,8802,129.0,9102,8805,1.0,9201,8806,200000.0,9001,8807,500000.0,9001,,,,,,
+2097,"Korean 1985 / Korea Central Belt",9001,4162,18252,9807,8801,38.0,9102,8802,127.0,9102,8805,1.0,9201,8806,200000.0,9001,8807,500000.0,9001,,,,,,
+2098,"Korean 1985 / Korea West Belt",9001,4162,18253,9807,8801,38.0,9102,8802,125.0,9102,8805,1.0,9201,8806,200000.0,9001,8807,500000.0,9001,,,,,,
+2099,"Qatar 1948 / Qatar Grid",9001,4286,19953,9806,8801,25.22565,9110,8802,50.4541,9110,8806,100000.0,9001,8807,100000.0,9001,,,,,,,,,
+2100,"GGRS87 / Greek Grid",9001,4121,19930,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2101,"Lake / Maracaibo Grid M1",9001,4249,18260,9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,0.0,9001,8807,-52684.972,9001,,,,,,
+2102,"Lake / Maracaibo Grid",9001,4249,18261,9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,200000.0,9001,8807,147315.028,9001,,,,,,
+2103,"Lake / Maracaibo Grid M3",9001,4249,18262,9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,500000.0,9001,8807,447315.028,9001,,,,,,
+2104,"Lake / Maracaibo La Rosa Grid",9001,4249,18263,9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,-17044.0,9001,8807,-23139.97,9001,,,,,,
+2105,"NZGD2000 / Mount Eden Circuit 2000",9001,4167,17931,9807,8801,-36.5247,9110,8802,174.4551,9110,8805,0.9999,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2106,"NZGD2000 / Bay of Plenty Circuit 2000",9001,4167,17932,9807,8801,-37.454,9110,8802,176.2758,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2107,"NZGD2000 / Poverty Bay Circuit 2000",9001,4167,17933,9807,8801,-38.3728,9110,8802,177.5308,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2108,"NZGD2000 / Hawkes Bay Circuit 2000",9001,4167,17934,9807,8801,-39.3903,9110,8802,176.4025,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2109,"NZGD2000 / Taranaki Circuit 2000",9001,4167,17935,9807,8801,-39.0808,9110,8802,174.134,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2110,"NZGD2000 / Tuhirangi Circuit 2000",9001,4167,17936,9807,8801,-39.3044,9110,8802,175.3824,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2111,"NZGD2000 / Wanganui Circuit 2000",9001,4167,17937,9807,8801,-40.1431,9110,8802,175.2917,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2112,"NZGD2000 / Wairarapa Circuit 2000",9001,4167,17938,9807,8801,-40.5531,9110,8802,175.385,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2113,"NZGD2000 / Wellington Circuit 2000",9001,4167,17939,9807,8801,-41.1804,9110,8802,174.4635,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2114,"NZGD2000 / Collingwood Circuit 2000",9001,4167,17940,9807,8801,-40.4253,9110,8802,172.4019,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2115,"NZGD2000 / Nelson Circuit 2000",9001,4167,17941,9807,8801,-41.1628,9110,8802,173.1757,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2116,"NZGD2000 / Karamea Circuit 2000",9001,4167,17942,9807,8801,-41.1723,9110,8802,172.0632,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2117,"NZGD2000 / Buller Circuit 2000",9001,4167,17943,9807,8801,-41.4838,9110,8802,171.3452,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2118,"NZGD2000 / Grey Circuit 2000",9001,4167,17944,9807,8801,-42.2001,9110,8802,171.3259,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2119,"NZGD2000 / Amuri Circuit 2000",9001,4167,17945,9807,8801,-42.412,9110,8802,173.0036,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2120,"NZGD2000 / Marlborough Circuit 2000",9001,4167,17946,9807,8801,-41.324,9110,8802,173.4807,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2121,"NZGD2000 / Hokitika Circuit 2000",9001,4167,17947,9807,8801,-42.531,9110,8802,170.5847,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2122,"NZGD2000 / Okarito Circuit 2000",9001,4167,17948,9807,8801,-43.0636,9110,8802,170.1539,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2123,"NZGD2000 / Jacksons Bay Circuit 2000",9001,4167,17949,9807,8801,-43.584,9110,8802,168.3622,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2124,"NZGD2000 / Mount Pleasant Circuit 2000",9001,4167,17950,9807,8801,-43.3526,9110,8802,172.4337,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2125,"NZGD2000 / Gawler Circuit 2000",9001,4167,17951,9807,8801,-43.4455,9110,8802,171.2138,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2126,"NZGD2000 / Timaru Circuit 2000",9001,4167,17952,9807,8801,-44.2407,9110,8802,171.0326,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2127,"NZGD2000 / Lindis Peak Circuit 2000",9001,4167,17953,9807,8801,-44.4406,9110,8802,169.2803,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2128,"NZGD2000 / Mount Nicholas Circuit 2000",9001,4167,17954,9807,8801,-45.0758,9110,8802,168.2355,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2129,"NZGD2000 / Mount York Circuit 2000",9001,4167,17955,9807,8801,-45.3349,9110,8802,167.4419,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2130,"NZGD2000 / Observation Point Circuit 2000",9001,4167,17956,9807,8801,-45.4858,9110,8802,170.3742,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2131,"NZGD2000 / North Taieri Circuit 2000",9001,4167,17957,9807,8801,-45.5141,9110,8802,170.1657,9110,8805,0.99996,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2132,"NZGD2000 / Bluff Circuit 2000",9001,4167,17958,9807,8801,-46.36,9110,8802,168.2034,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2133,"NZGD2000 / UTM zone 58S",9001,4167,16158,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2134,"NZGD2000 / UTM zone 59S",9001,4167,16159,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2135,"NZGD2000 / UTM zone 60S",9001,4167,16160,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2136,"Accra / Ghana National Grid",9094,4168,19959,9807,8801,4.4,9110,8802,-1.0,9110,8805,0.99975,9201,8806,900000.0,9094,8807,0.0,9094,,,,,,
+2137,"Accra / TM 1 NW",9001,4168,17001,9807,8801,0.0,9102,8802,-1.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2138,"NAD27(CGQ77) / Quebec Lambert",9001,4609,19944,9802,8821,44.0,9110,8822,-68.3,9110,8823,60.0,9110,8824,46.0,9110,8826,0.0,9001,8827,0.0,9001,,,
+2139,"NAD83(CSRS98) / SCoPQ zone 2",9001,4140,17700,9807,8801,0.0,9110,8802,-55.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2140,"NAD83(CSRS98) / MTM zone 3",9001,4140,17703,9807,8801,0.0,9110,8802,-58.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2141,"NAD83(CSRS98) / MTM zone 4",9001,4140,17704,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2142,"NAD83(CSRS98) / MTM zone 5",9001,4140,17705,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2143,"NAD83(CSRS98) / MTM zone 6",9001,4140,17706,9807,8801,0.0,9110,8802,-67.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2144,"NAD83(CSRS98) / MTM zone 7",9001,4140,17707,9807,8801,0.0,9110,8802,-70.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2145,"NAD83(CSRS98) / MTM zone 8",9001,4140,17708,9807,8801,0.0,9110,8802,-73.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2146,"NAD83(CSRS98) / MTM zone 9",9001,4140,17709,9807,8801,0.0,9110,8802,-76.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2147,"NAD83(CSRS98) / MTM zone 10",9001,4140,17710,9807,8801,0.0,9110,8802,-79.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2148,"NAD83(CSRS98) / UTM zone 21N",9001,4140,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2149,"NAD83(CSRS98) / UTM zone 18N",9001,4140,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2150,"NAD83(CSRS98) / UTM zone 17N",9001,4140,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2151,"NAD83(CSRS98) / UTM zone 13N",9001,4140,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2152,"NAD83(CSRS98) / UTM zone 12N",9001,4140,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2153,"NAD83(CSRS98) / UTM zone 11N",9001,4140,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2154,"RGF93 / Lambert-93",9001,4171,18085,9802,8821,46.3,9110,8822,3.0,9110,8823,49.0,9110,8824,44.0,9110,8826,700000.0,9001,8827,6600000.0,9001,,,
+2155,"American Samoa 1962 / American Samoa Lambert",9003,4169,15300,9801,8801,-14.16,9110,8802,170.0,9110,8805,1.0,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+2156,"NAD83(HARN) / UTM zone 59S",9001,4152,16159,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2157,"IRENET95 / Irish Transverse Mercator",9001,4173,19962,9807,8801,53.3,9110,8802,-8.0,9110,8805,0.99982,9201,8806,600000.0,9001,8807,750000.0,9001,,,,,,
+2158,"IRENET95 / UTM zone 29N",9001,4173,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2159,"Sierra Leone 1924 / New Colony Grid",9094,4174,19963,9807,8801,6.4,9110,8802,-12.0,9110,8805,1.0,9201,8806,500000.0,9094,8807,0.0,9094,,,,,,
+2160,"Sierra Leone 1924 / New War Office Grid",9094,4174,19964,9807,8801,6.4,9110,8802,-12.0,9110,8805,1.0,9201,8806,800000.0,9094,8807,600000.0,9094,,,,,,
+2161,"Sierra Leone 1968 / UTM zone 28N",9001,4175,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2162,"Sierra Leone 1968 / UTM zone 29N",9001,4175,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2163,US National Atlas Equal Area,9001,4047,19965,9821,8806,0.0,9001,8807,0.0,9001,8828,45.0,9102,8829,-100.0,9102,,,,,,,,,
+2164,"Locodjo 1965 / TM 5 NW",9001,4142,17005,9807,8801,0.0,9102,8802,-5.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2165,"Abidjan 1987 / TM 5 NW",9001,4143,17005,9807,8801,0.0,9102,8802,-5.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2166,"Pulkovo 1942(83) / Gauss Kruger zone 3",9001,4178,16263,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+2167,"Pulkovo 1942(83) / Gauss Kruger zone 4",9001,4178,16264,9807,8801,0.0,9102,8802,12.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+2168,"Pulkovo 1942(83) / Gauss Kruger zone 5",9001,4178,16265,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+2169,"Luxembourg 1930 / Gauss",9001,4181,19966,9807,8801,49.5,9110,8802,6.1,9110,8805,1.0,9201,8806,80000.0,9001,8807,100000.0,9001,,,,,,
+2170,"MGI / Slovenia Grid",9001,4312,19967,9807,8801,0.0,9110,8802,15.0,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2171,"Pulkovo 1942(58) / Poland zone I",9001,4179,18281,9809,8801,50.373,9110,8802,21.05,9110,8805,0.9998,9201,8806,4637000.0,9001,8807,5647000.0,9001,,,,,,
+2172,"Pulkovo 1942(58) / Poland zone II",9001,4179,18282,9809,8801,53.0007,9110,8802,21.301,9110,8805,0.9998,9201,8806,4603000.0,9001,8807,5806000.0,9001,,,,,,
+2173,"Pulkovo 1942(58) / Poland zone III",9001,4179,18283,9809,8801,53.35,9110,8802,17.003,9110,8805,0.9998,9201,8806,3501000.0,9001,8807,5999000.0,9001,,,,,,
+2174,"Pulkovo 1942(58) / Poland zone IV",9001,4179,18284,9809,8801,51.4015,9110,8802,16.402,9110,8805,0.9998,9201,8806,3703000.0,9001,8807,5627000.0,9001,,,,,,
+2175,"Pulkovo 1942(58) / Poland zone V",9001,4179,18285,9807,8801,0.0,9110,8802,18.573,9110,8805,0.999983,9201,8806,237000.0,9001,8807,-4700000.0,9001,,,,,,
+2176,"ETRS89 / Poland CS2000 zone 5",9001,4258,18305,9807,8801,0.0,9102,8802,15.0,9102,8805,0.999923,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+2177,"ETRS89 / Poland CS2000 zone 6",9001,4258,18306,9807,8801,0.0,9102,8802,18.0,9102,8805,0.999923,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+2178,"ETRS89 / Poland CS2000 zone 7",9001,4258,18307,9807,8801,0.0,9102,8802,21.0,9102,8805,0.999923,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+2179,"ETRS89 / Poland CS2000 zone 8",9001,4258,18308,9807,8801,0.0,9102,8802,24.0,9102,8805,0.999923,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+2180,"ETRS89 / Poland CS92",9001,4258,18300,9807,8801,0.0,9102,8802,19.0,9102,8805,0.9993,9201,8806,500000.0,9001,8807,-5300000.0,9001,,,,,,
+2188,"Azores Occidental 1939 / UTM zone 25N",9001,4182,16025,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2189,"Azores Central 1948 / UTM zone 26N",9001,4183,16026,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2190,"Azores Oriental 1940 / UTM zone 26N",9001,4184,16026,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2191,"Madeira 1936 / UTM zone 28N",9001,4185,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2192,"ED50 / France EuroLambert",9001,4230,18086,9801,8801,46.48,9110,8802,2.2014025,9110,8805,0.99987742,9201,8806,600000.0,9001,8807,2200000.0,9001,,,,,,
+2193,"NZGD2000 / New Zealand Transverse Mercator",9001,4167,19971,9807,8801,0.0,9102,8802,173.0,9102,8805,0.9996,9201,8806,1600000.0,9001,8807,10000000.0,9001,,,,,,
+2194,"American Samoa 1962 / American Samoa Lambert",9003,4169,15301,9801,8801,-14.16,9110,8802,-170.0,9110,8805,1.0,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+2195,"NAD83(HARN) / UTM zone 2S",9001,4152,16102,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2196,"ETRS89 / Kp2000 Jutland",9001,4258,18401,9807,8801,0.0,9110,8802,9.3,9110,8805,0.99995,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2197,"ETRS89 / Kp2000 Zealand",9001,4258,18402,9807,8801,0.0,9102,8802,12.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2198,"ETRS89 / Kp2000 Bornholm",9001,4258,18403,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,900000.0,9001,8807,0.0,9001,,,,,,
+2199,"Albanian 1987 / Gauss Kruger zone 4",9001,4191,16204,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+2200,"ATS77 / New Brunswick Stereographic (ATS77)",9001,4122,19945,9809,8801,46.3,9110,8802,-66.3,9110,8805,0.999912,9201,8806,300000.0,9001,8807,800000.0,9001,,,,,,
+2201,"REGVEN / UTM zone 18N",9001,4189,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2202,"REGVEN / UTM zone 19N",9001,4189,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2203,"REGVEN / UTM zone 20N",9001,4189,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2204,"NAD27 / Tennessee",9003,4267,15302,9802,8821,34.4,9110,8822,-86.0,9110,8823,35.15,9110,8824,36.25,9110,8826,2000000.0,9003,8827,100000.0,9003,,,
+2205,"NAD83 / Kentucky North",9001,4269,15303,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2206,"ED50 / 3-degree Gauss-Kruger zone 9",9001,4230,16269,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+2207,"ED50 / 3-degree Gauss-Kruger zone 10",9001,4230,16270,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+2208,"ED50 / 3-degree Gauss-Kruger zone 11",9001,4230,16271,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+2209,"ED50 / 3-degree Gauss-Kruger zone 12",9001,4230,16272,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+2210,"ED50 / 3-degree Gauss-Kruger zone 13",9001,4230,16273,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+2211,"ED50 / 3-degree Gauss-Kruger zone 14",9001,4230,16274,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+2212,"ED50 / 3-degree Gauss-Kruger zone 15",9001,4230,16275,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+2213,"ETRS89 / TM 30 NE",9001,4258,16430,9807,8801,0.0,9102,8802,30.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2214,"Douala 1948 / AOF west",9001,4192,18415,9807,8801,0.0,9110,8802,10.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+2215,"Manoca 1962 / UTM zone 32N",9001,4193,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2216,"Qornoq 1927 / UTM zone 22N",9001,4194,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2217,"Qornoq 1927 / UTM zone 23N",9001,4194,16023,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2218,"Scoresbysund 1952 / Greenland zone 5 east",9001,4195,18425,9826,8801,70.3,9110,8802,-24.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2219,"ATS77 / UTM zone 19N",9001,4122,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2220,"ATS77 / UTM zone 20N",9001,4122,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2221,"Scoresbysund 1952 / Greenland zone 6 east",9001,4195,18426,9826,8801,67.3,9110,8802,-32.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2222,"NAD83 / Arizona East (ft)",9002,4269,15304,9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+2223,"NAD83 / Arizona Central (ft)",9002,4269,15305,9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+2224,"NAD83 / Arizona West (ft)",9002,4269,15306,9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+2225,"NAD83 / California zone 1 (ftUS)",9003,4269,15307,9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2226,"NAD83 / California zone 2 (ftUS)",9003,4269,15308,9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2227,"NAD83 / California zone 3 (ftUS)",9003,4269,15309,9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2228,"NAD83 / California zone 4 (ftUS)",9003,4269,15310,9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2229,"NAD83 / California zone 5 (ftUS)",9003,4269,15311,9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2230,"NAD83 / California zone 6 (ftUS)",9003,4269,15312,9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2231,"NAD83 / Colorado North (ftUS)",9003,4269,15313,9802,8821,39.2,9110,8822,-105.3,9110,8823,40.47,9110,8824,39.43,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+2232,"NAD83 / Colorado Central (ftUS)",9003,4269,15314,9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+2233,"NAD83 / Colorado South (ftUS)",9003,4269,15315,9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+2234,"NAD83 / Connecticut (ftUS)",9003,4269,15316,9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,1000000.0,9003,8827,500000.0,9003,,,
+2235,"NAD83 / Delaware (ftUS)",9003,4269,15317,9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2236,"NAD83 / Florida East (ftUS)",9003,4269,15318,9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2237,"NAD83 / Florida West (ftUS)",9003,4269,15319,9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2238,"NAD83 / Florida North (ftUS)",9003,4269,15320,9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2239,"NAD83 / Georgia East (ftUS)",9003,4269,15321,9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2240,"NAD83 / Georgia West (ftUS)",9003,4269,15322,9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,2296583.333,9003,8807,0.0,9003,,,,,,
+2241,"NAD83 / Idaho East (ftUS)",9003,4269,15323,9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2242,"NAD83 / Idaho Central (ftUS)",9003,4269,15324,9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,1640416.667,9003,8807,0.0,9003,,,,,,
+2243,"NAD83 / Idaho West (ftUS)",9003,4269,15325,9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,2624666.667,9003,8807,0.0,9003,,,,,,
+2244,"NAD83 / Indiana East (ftUS)",9003,4269,15326,9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,328083.333,9003,8807,818125.0,9003,,,,,,
+2245,"NAD83 / Indiana West (ftUS)",9003,4269,15327,9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,2952750.0,9003,8807,818125.0,9003,,,,,,
+2246,"NAD83 / Kentucky North (ftUS)",9003,4269,15328,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2247,"NAD83 / Kentucky South (ftUS)",9003,4269,15329,9802,8821,36.2,9110,8822,-85.45,9110,8823,37.56,9110,8824,36.44,9110,8826,1640416.667,9003,8827,1640416.667,9003,,,
+2248,"NAD83 / Maryland (ftUS)",9003,4269,15330,9802,8821,37.4,9110,8822,-77.0,9110,8823,39.27,9110,8824,38.18,9110,8826,1312333.333,9003,8827,0.0,9003,,,
+2249,"NAD83 / Massachusetts Mainland (ftUS)",9003,4269,15331,9802,8821,41.0,9110,8822,-71.3,9110,8823,42.41,9110,8824,41.43,9110,8826,656166.667,9003,8827,2460625.0,9003,,,
+2250,"NAD83 / Massachusetts Island (ftUS)",9003,4269,15332,9802,8821,41.0,9110,8822,-70.3,9110,8823,41.29,9110,8824,41.17,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2251,"NAD83 / Michigan North (ft)",9002,4269,15333,9802,8821,44.47,9110,8822,-87.0,9110,8823,47.05,9110,8824,45.29,9110,8826,26246719.16,9002,8827,0.0,9002,,,
+2252,"NAD83 / Michigan Central (ft)",9002,4269,15334,9802,8821,43.19,9110,8822,-84.22,9110,8823,45.42,9110,8824,44.11,9110,8826,19685039.37,9002,8827,0.0,9002,,,
+2253,"NAD83 / Michigan South (ft)",9002,4269,15335,9802,8821,41.3,9110,8822,-84.22,9110,8823,43.4,9110,8824,42.06,9110,8826,13123359.58,9002,8827,0.0,9002,,,
+2254,"NAD83 / Mississippi East (ftUS)",9003,4269,15336,9807,8801,29.3,9110,8802,-88.5,9110,8805,0.99995,9201,8806,984250.0,9003,8807,0.0,9003,,,,,,
+2255,"NAD83 / Mississippi West (ftUS)",9003,4269,15337,9807,8801,29.3,9110,8802,-90.2,9110,8805,0.99995,9201,8806,2296583.333,9003,8807,0.0,9003,,,,,,
+2256,"NAD83 / Montana (ft)",9002,4269,15338,9802,8821,44.15,9110,8822,-109.3,9110,8823,49.0,9110,8824,45.0,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+2257,"NAD83 / New Mexico East (ftUS)",9003,4269,15339,9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,541337.5,9003,8807,0.0,9003,,,,,,
+2258,"NAD83 / New Mexico Central (ftUS)",9003,4269,15340,9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,1640416.667,9003,8807,0.0,9003,,,,,,
+2259,"NAD83 / New Mexico West (ftUS)",9003,4269,15341,9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,2723091.667,9003,8807,0.0,9003,,,,,,
+2260,"NAD83 / New York East (ftUS)",9003,4269,15342,9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,492125.0,9003,8807,0.0,9003,,,,,,
+2261,"NAD83 / New York Central (ftUS)",9003,4269,15343,9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,820208.333,9003,8807,0.0,9003,,,,,,
+2262,"NAD83 / New York West (ftUS)",9003,4269,15344,9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,1148291.667,9003,8807,0.0,9003,,,,,,
+2263,"NAD83 / New York Long Island (ftUS)",9003,4269,15345,9802,8821,40.1,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,984250.0,9003,8827,0.0,9003,,,
+2264,"NAD83 / North Carolina (ftUS)",9003,4269,15346,9802,8821,33.45,9110,8822,-79.0,9110,8823,36.1,9110,8824,34.2,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+2265,"NAD83 / North Dakota North (ft)",9002,4269,15347,9802,8821,47.0,9110,8822,-100.3,9110,8823,48.44,9110,8824,47.26,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+2266,"NAD83 / North Dakota South (ft)",9002,4269,15348,9802,8821,45.4,9110,8822,-100.3,9110,8823,47.29,9110,8824,46.11,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+2267,"NAD83 / Oklahoma North (ftUS)",9003,4269,15349,9802,8821,35.0,9110,8822,-98.0,9110,8823,36.46,9110,8824,35.34,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2268,"NAD83 / Oklahoma South (ftUS)",9003,4269,15350,9802,8821,33.2,9110,8822,-98.0,9110,8823,35.14,9110,8824,33.56,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2269,"NAD83 / Oregon North (ft)",9002,4269,15351,9802,8821,43.4,9110,8822,-120.3,9110,8823,46.0,9110,8824,44.2,9110,8826,8202099.738,9002,8827,0.0,9002,,,
+2270,"NAD83 / Oregon South (ft)",9002,4269,15352,9802,8821,41.4,9110,8822,-120.3,9110,8823,44.0,9110,8824,42.2,9110,8826,4921259.843,9002,8827,0.0,9002,,,
+2271,"NAD83 / Pennsylvania North (ftUS)",9003,4269,15353,9802,8821,40.1,9110,8822,-77.45,9110,8823,41.57,9110,8824,40.53,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2272,"NAD83 / Pennsylvania South (ftUS)",9003,4269,15354,9802,8821,39.2,9110,8822,-77.45,9110,8823,40.58,9110,8824,39.56,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2273,"NAD83 / South Carolina (ft)",9002,4269,15355,9802,8821,31.5,9110,8822,-81.0,9110,8823,34.5,9110,8824,32.3,9110,8826,2000000.0,9002,8827,0.0,9002,,,
+2274,"NAD83 / Tennessee (ftUS)",9003,4269,15356,9802,8821,34.2,9110,8822,-86.0,9110,8823,36.25,9110,8824,35.15,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2275,"NAD83 / Texas North (ftUS)",9003,4269,15357,9802,8821,34.0,9110,8822,-101.3,9110,8823,36.11,9110,8824,34.39,9110,8826,656166.667,9003,8827,3280833.333,9003,,,
+2276,"NAD83 / Texas North Central (ftUS)",9003,4269,15358,9802,8821,31.4,9110,8822,-98.3,9110,8823,33.58,9110,8824,32.08,9110,8826,1968500.0,9003,8827,6561666.667,9003,,,
+2277,"NAD83 / Texas Central (ftUS)",9003,4269,15359,9802,8821,29.4,9110,8822,-100.2,9110,8823,31.53,9110,8824,30.07,9110,8826,2296583.333,9003,8827,9842500.0,9003,,,
+2278,"NAD83 / Texas South Central (ftUS)",9003,4269,15360,9802,8821,27.5,9110,8822,-99.0,9110,8823,30.17,9110,8824,28.23,9110,8826,1968500.0,9003,8827,13123333.333,9003,,,
+2279,"NAD83 / Texas South (ftUS)",9003,4269,15361,9802,8821,25.4,9110,8822,-98.3,9110,8823,27.5,9110,8824,26.1,9110,8826,984250.0,9003,8827,16404166.667,9003,,,
+2280,"NAD83 / Utah North (ft)",9002,4269,15362,9802,8821,40.2,9110,8822,-111.3,9110,8823,41.47,9110,8824,40.43,9110,8826,1640419.948,9002,8827,3280839.895,9002,,,
+2281,"NAD83 / Utah Central (ft)",9002,4269,15363,9802,8821,38.2,9110,8822,-111.3,9110,8823,40.39,9110,8824,39.01,9110,8826,1640419.948,9002,8827,6561679.79,9002,,,
+2282,"NAD83 / Utah South (ft)",9002,4269,15364,9802,8821,36.4,9110,8822,-111.3,9110,8823,38.21,9110,8824,37.13,9110,8826,1640419.948,9002,8827,9842519.685,9002,,,
+2283,"NAD83 / Virginia North (ftUS)",9003,4269,15365,9802,8821,37.4,9110,8822,-78.3,9110,8823,39.12,9110,8824,38.02,9110,8826,11482916.667,9003,8827,6561666.667,9003,,,
+2284,"NAD83 / Virginia South (ftUS)",9003,4269,15366,9802,8821,36.2,9110,8822,-78.3,9110,8823,37.58,9110,8824,36.46,9110,8826,11482916.667,9003,8827,3280833.333,9003,,,
+2285,"NAD83 / Washington North (ftUS)",9003,4269,15367,9802,8821,47.0,9110,8822,-120.5,9110,8823,48.44,9110,8824,47.3,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2286,"NAD83 / Washington South (ftUS)",9003,4269,15368,9802,8821,45.2,9110,8822,-120.3,9110,8823,47.2,9110,8824,45.5,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2287,"NAD83 / Wisconsin North (ftUS)",9003,4269,15369,9802,8821,45.1,9110,8822,-90.0,9110,8823,46.46,9110,8824,45.34,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2288,"NAD83 / Wisconsin Central (ftUS)",9003,4269,15370,9802,8821,43.5,9110,8822,-90.0,9110,8823,45.3,9110,8824,44.15,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2289,"NAD83 / Wisconsin South (ftUS)",9003,4269,15371,9802,8821,42.0,9110,8822,-90.0,9110,8823,44.04,9110,8824,42.44,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2290,"ATS77 / Prince Edward Isl. Stereographic (ATS77)",9001,4122,19933,9809,8801,47.15,9110,8802,-63.0,9110,8805,0.999912,9201,8806,700000.0,9001,8807,400000.0,9001,,,,,,
+2291,"NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83)",9001,4122,19960,9809,8801,47.15,9110,8802,-63.0,9110,8805,0.999912,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2292,"NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83)",9001,4140,19960,9809,8801,47.15,9110,8802,-63.0,9110,8805,0.999912,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2294,"ATS77 / MTM Nova Scotia zone 4",9001,4122,17794,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+2295,"ATS77 / MTM Nova Scotia zone 5",9001,4122,17795,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+2296,"Ammassalik 1958 / Greenland zone 7 east",9001,4196,18427,9826,8801,64.3,9110,8802,-40.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2297,"Qornoq 1927 / Greenland zone 1 east",9001,4194,18421,9826,8801,82.3,9110,8802,-40.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2298,"Qornoq 1927 / Greenland zone 2 east",9001,4194,18422,9826,8801,79.3,9110,8802,-24.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2299,"Qornoq 1927 / Greenland zone 2 west",9001,4194,18432,9826,8801,79.3,9110,8802,-64.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2300,"Qornoq 1927 / Greenland zone 3 east",9001,4194,18423,9826,8801,76.3,9110,8802,-20.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2301,"Qornoq 1927 / Greenland zone 3 west",9001,4194,18433,9826,8801,76.3,9110,8802,-64.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2302,"Qornoq 1927 / Greenland zone 4 east",9001,4194,18424,9826,8801,73.3,9110,8802,-24.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2303,"Qornoq 1927 / Greenland zone 4 west",9001,4194,18434,9826,8801,73.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2304,"Qornoq 1927 / Greenland zone 5 west",9001,4194,18435,9826,8801,70.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2305,"Qornoq 1927 / Greenland zone 6 west",9001,4194,18436,9826,8801,67.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2306,"Qornoq 1927 / Greenland zone 7 west",9001,4194,18437,9826,8801,64.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2307,"Qornoq 1927 / Greenland zone 8 east",9001,4194,18428,9826,8801,61.3,9110,8802,-48.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2308,"Batavia / TM 109 SE",9001,4211,16709,9807,8801,0.0,9102,8802,109.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2309,"WGS 84 / TM 116 SE",9001,4326,16716,9807,8801,0.0,9102,8802,116.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2310,"WGS 84 / TM 132 SE",9001,4326,16732,9807,8801,0.0,9102,8802,132.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2311,"WGS 84 / TM 6 NE",9001,4326,16406,9807,8801,0.0,9102,8802,6.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2312,"Garoua / UTM zone 33N",9001,4197,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2313,"Kousseri / UTM zone 33N",9001,4198,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2314,"Trinidad 1903 / Trinidad Grid (ftCla)",9005,4302,19975,9806,8801,10.263,9110,8802,-61.2,9110,8806,283800.0,9005,8807,214500.0,9005,,,,,,,,,
+2315,"Campo Inchauspe / UTM zone 19S",9001,4221,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2316,"Campo Inchauspe / UTM zone 20S",9001,4221,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2317,"PSAD56 / ICN Regional",9001,4248,19976,9802,8821,6.0,9102,8822,-66.0,9102,8823,9.0,9102,8824,3.0,9102,8826,1000000.0,9001,8827,1000000.0,9001,,,
+2318,"Ain el Abd / Aramco Lambert",9001,4204,19977,9802,8821,25.0522236,9110,8822,48.0,9102,8823,17.0,9102,8824,33.0,9102,8826,0.0,9001,8827,0.0,9001,,,
+2319,"ED50 / TM27",9001,4230,16369,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2320,"ED50 / TM30",9001,4230,16370,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2321,"ED50 / TM33",9001,4230,16371,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2322,"ED50 / TM36",9001,4230,16372,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2323,"ED50 / TM39",9001,4230,16373,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2324,"ED50 / TM42",9001,4230,16374,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2325,"ED50 / TM45",9001,4230,16375,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2326,Hong Kong 1980 Grid System,9001,4611,19978,9807,8801,22.184368,9110,8802,114.10428,9110,8805,1.0,9201,8806,836694.05,9001,8807,819069.8,9001,,,,,,
+2327,"Xian 1980 / Gauss-Kruger zone 13",9001,4610,16213,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+2328,"Xian 1980 / Gauss-Kruger zone 14",9001,4610,16214,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+2329,"Xian 1980 / Gauss-Kruger zone 15",9001,4610,16215,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+2330,"Xian 1980 / Gauss-Kruger zone 16",9001,4610,16216,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+2331,"Xian 1980 / Gauss-Kruger zone 17",9001,4610,16217,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+2332,"Xian 1980 / Gauss-Kruger zone 18",9001,4610,16218,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+2333,"Xian 1980 / Gauss-Kruger zone 19",9001,4610,16219,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+2334,"Xian 1980 / Gauss-Kruger zone 20",9001,4610,16220,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+2335,"Xian 1980 / Gauss-Kruger zone 21",9001,4610,16221,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+2336,"Xian 1980 / Gauss-Kruger zone 22",9001,4610,16222,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+2337,"Xian 1980 / Gauss-Kruger zone 23",9001,4610,16223,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+2338,"Xian 1980 / Gauss-Kruger CM 75E",9001,4610,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2339,"Xian 1980 / Gauss-Kruger CM 81E",9001,4610,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2340,"Xian 1980 / Gauss-Kruger CM 87E",9001,4610,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2341,"Xian 1980 / Gauss-Kruger CM 93E",9001,4610,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2342,"Xian 1980 / Gauss-Kruger CM 99E",9001,4610,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2343,"Xian 1980 / Gauss-Kruger CM 105E",9001,4610,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2344,"Xian 1980 / Gauss-Kruger CM 111E",9001,4610,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2345,"Xian 1980 / Gauss-Kruger CM 117E",9001,4610,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2346,"Xian 1980 / Gauss-Kruger CM 123E",9001,4610,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2347,"Xian 1980 / Gauss-Kruger CM 129E",9001,4610,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2348,"Xian 1980 / Gauss-Kruger CM 135E",9001,4610,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2349,"Xian 1980 / 3-degree Gauss-Kruger zone 25",9001,4610,16285,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+2350,"Xian 1980 / 3-degree Gauss-Kruger zone 26",9001,4610,16286,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+2351,"Xian 1980 / 3-degree Gauss-Kruger zone 27",9001,4610,16287,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+2352,"Xian 1980 / 3-degree Gauss-Kruger zone 28",9001,4610,16288,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+2353,"Xian 1980 / 3-degree Gauss-Kruger zone 29",9001,4610,16289,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+2354,"Xian 1980 / 3-degree Gauss-Kruger zone 30",9001,4610,16290,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+2355,"Xian 1980 / 3-degree Gauss-Kruger zone 31",9001,4610,16291,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+2356,"Xian 1980 / 3-degree Gauss-Kruger zone 32",9001,4610,16292,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+2357,"Xian 1980 / 3-degree Gauss-Kruger zone 33",9001,4610,16293,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,33500000.0,9001,8807,0.0,9001,,,,,,
+2358,"Xian 1980 / 3-degree Gauss-Kruger zone 34",9001,4610,16294,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,34500000.0,9001,8807,0.0,9001,,,,,,
+2359,"Xian 1980 / 3-degree Gauss-Kruger zone 35",9001,4610,16295,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,35500000.0,9001,8807,0.0,9001,,,,,,
+2360,"Xian 1980 / 3-degree Gauss-Kruger zone 36",9001,4610,16296,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,36500000.0,9001,8807,0.0,9001,,,,,,
+2361,"Xian 1980 / 3-degree Gauss-Kruger zone 37",9001,4610,16297,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,37500000.0,9001,8807,0.0,9001,,,,,,
+2362,"Xian 1980 / 3-degree Gauss-Kruger zone 38",9001,4610,16298,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,38500000.0,9001,8807,0.0,9001,,,,,,
+2363,"Xian 1980 / 3-degree Gauss-Kruger zone 39",9001,4610,16299,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,39500000.0,9001,8807,0.0,9001,,,,,,
+2364,"Xian 1980 / 3-degree Gauss-Kruger zone 40",9001,4610,16070,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,40500000.0,9001,8807,0.0,9001,,,,,,
+2365,"Xian 1980 / 3-degree Gauss-Kruger zone 41",9001,4610,16071,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,41500000.0,9001,8807,0.0,9001,,,,,,
+2366,"Xian 1980 / 3-degree Gauss-Kruger zone 42",9001,4610,16072,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,42500000.0,9001,8807,0.0,9001,,,,,,
+2367,"Xian 1980 / 3-degree Gauss-Kruger zone 43",9001,4610,16073,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,43500000.0,9001,8807,0.0,9001,,,,,,
+2368,"Xian 1980 / 3-degree Gauss-Kruger zone 44",9001,4610,16074,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,44500000.0,9001,8807,0.0,9001,,,,,,
+2369,"Xian 1980 / 3-degree Gauss-Kruger zone 45",9001,4610,16075,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,45500000.0,9001,8807,0.0,9001,,,,,,
+2370,"Xian 1980 / 3-degree Gauss-Kruger CM 75E",9001,4610,16385,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2371,"Xian 1980 / 3-degree Gauss-Kruger CM 78E",9001,4610,16386,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2372,"Xian 1980 / 3-degree Gauss-Kruger CM 81E",9001,4610,16387,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2373,"Xian 1980 / 3-degree Gauss-Kruger CM 84E",9001,4610,16388,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2374,"Xian 1980 / 3-degree Gauss-Kruger CM 87E",9001,4610,16389,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2375,"Xian 1980 / 3-degree Gauss-Kruger CM 90E",9001,4610,16390,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2376,"Xian 1980 / 3-degree Gauss-Kruger CM 93E",9001,4610,16391,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2377,"Xian 1980 / 3-degree Gauss-Kruger CM 96E",9001,4610,16392,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2378,"Xian 1980 / 3-degree Gauss-Kruger CM 99E",9001,4610,16393,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2379,"Xian 1980 / 3-degree Gauss-Kruger CM 102E",9001,4610,16394,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2380,"Xian 1980 / 3-degree Gauss-Kruger CM 105E",9001,4610,16395,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2381,"Xian 1980 / 3-degree Gauss-Kruger CM 108E",9001,4610,16396,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2382,"Xian 1980 / 3-degree Gauss-Kruger CM 111E",9001,4610,16397,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2383,"Xian 1980 / 3-degree Gauss-Kruger CM 114E",9001,4610,16398,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2384,"Xian 1980 / 3-degree Gauss-Kruger CM 117E",9001,4610,16399,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2385,"Xian 1980 / 3-degree Gauss-Kruger CM 120E",9001,4610,16170,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2386,"Xian 1980 / 3-degree Gauss-Kruger CM 123E",9001,4610,16171,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2387,"Xian 1980 / 3-degree Gauss-Kruger CM 126E",9001,4610,16172,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2388,"Xian 1980 / 3-degree Gauss-Kruger CM 129E",9001,4610,16173,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2389,"Xian 1980 / 3-degree Gauss-Kruger CM 132E",9001,4610,16174,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2390,"Xian 1980 / 3-degree Gauss-Kruger CM 135E",9001,4610,16175,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2391,"KKJ / Finland zone 1",9001,4123,18191,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+2392,"KKJ / Finland zone 2",9001,4123,18192,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+2393,"KKJ / Finland Uniform Coordinate System",9001,4123,18193,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+2394,"KKJ / Finland zone 4",9001,4123,18194,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+2395,"South Yemen / Gauss-Kruger zone 8",9001,4164,16208,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+2396,"South Yemen / Gauss-Kruger zone 9",9001,4164,16209,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+2397,"Pulkovo 1942(83) / Gauss-Kruger zone 3",9001,4178,16263,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+2398,"Pulkovo 1942(83) / Gauss-Kruger zone 4",9001,4178,16264,9807,8801,0.0,9102,8802,12.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+2399,"Pulkovo 1942(83) / Gauss-Kruger zone 5",9001,4178,16265,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+2400,RT90 2.5 gon W,9001,4124,19929,9807,8801,0.0,9110,8802,15.48298,9110,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+2401,"Beijing 1954 / 3-degree Gauss-Kruger zone 25",9001,4214,16285,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+2402,"Beijing 1954 / 3-degree Gauss-Kruger zone 26",9001,4214,16286,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+2403,"Beijing 1954 / 3-degree Gauss-Kruger zone 27",9001,4214,16287,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+2404,"Beijing 1954 / 3-degree Gauss-Kruger zone 28",9001,4214,16288,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+2405,"Beijing 1954 / 3-degree Gauss-Kruger zone 29",9001,4214,16289,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+2406,"Beijing 1954 / 3-degree Gauss-Kruger zone 30",9001,4214,16290,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+2407,"Beijing 1954 / 3-degree Gauss-Kruger zone 31",9001,4214,16291,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+2408,"Beijing 1954 / 3-degree Gauss-Kruger zone 32",9001,4214,16292,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+2409,"Beijing 1954 / 3-degree Gauss-Kruger zone 33",9001,4214,16293,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,33500000.0,9001,8807,0.0,9001,,,,,,
+2410,"Beijing 1954 / 3-degree Gauss-Kruger zone 34",9001,4214,16294,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,34500000.0,9001,8807,0.0,9001,,,,,,
+2411,"Beijing 1954 / 3-degree Gauss-Kruger zone 35",9001,4214,16295,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,35500000.0,9001,8807,0.0,9001,,,,,,
+2412,"Beijing 1954 / 3-degree Gauss-Kruger zone 36",9001,4214,16296,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,36500000.0,9001,8807,0.0,9001,,,,,,
+2413,"Beijing 1954 / 3-degree Gauss-Kruger zone 37",9001,4214,16297,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,37500000.0,9001,8807,0.0,9001,,,,,,
+2414,"Beijing 1954 / 3-degree Gauss-Kruger zone 38",9001,4214,16298,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,38500000.0,9001,8807,0.0,9001,,,,,,
+2415,"Beijing 1954 / 3-degree Gauss-Kruger zone 39",9001,4214,16299,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,39500000.0,9001,8807,0.0,9001,,,,,,
+2416,"Beijing 1954 / 3-degree Gauss-Kruger zone 40",9001,4214,16070,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,40500000.0,9001,8807,0.0,9001,,,,,,
+2417,"Beijing 1954 / 3-degree Gauss-Kruger zone 41",9001,4214,16071,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,41500000.0,9001,8807,0.0,9001,,,,,,
+2418,"Beijing 1954 / 3-degree Gauss-Kruger zone 42",9001,4214,16072,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,42500000.0,9001,8807,0.0,9001,,,,,,
+2419,"Beijing 1954 / 3-degree Gauss-Kruger zone 43",9001,4214,16073,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,43500000.0,9001,8807,0.0,9001,,,,,,
+2420,"Beijing 1954 / 3-degree Gauss-Kruger zone 44",9001,4214,16074,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,44500000.0,9001,8807,0.0,9001,,,,,,
+2421,"Beijing 1954 / 3-degree Gauss-Kruger zone 45",9001,4214,16075,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,45500000.0,9001,8807,0.0,9001,,,,,,
+2422,"Beijing 1954 / 3-degree Gauss-Kruger CM 75E",9001,4214,16385,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2423,"Beijing 1954 / 3-degree Gauss-Kruger CM 78E",9001,4214,16386,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2424,"Beijing 1954 / 3-degree Gauss-Kruger CM 81E",9001,4214,16387,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2425,"Beijing 1954 / 3-degree Gauss-Kruger CM 84E",9001,4214,16388,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2426,"Beijing 1954 / 3-degree Gauss-Kruger CM 87E",9001,4214,16389,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2427,"Beijing 1954 / 3-degree Gauss-Kruger CM 90E",9001,4214,16390,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2428,"Beijing 1954 / 3-degree Gauss-Kruger CM 93E",9001,4214,16391,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2429,"Beijing 1954 / 3-degree Gauss-Kruger CM 96E",9001,4214,16392,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2430,"Beijing 1954 / 3-degree Gauss-Kruger CM 99E",9001,4214,16393,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2431,"Beijing 1954 / 3-degree Gauss-Kruger CM 102E",9001,4214,16394,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2432,"Beijing 1954 / 3-degree Gauss-Kruger CM 105E",9001,4214,16395,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2433,"Beijing 1954 / 3-degree Gauss-Kruger CM 108E",9001,4214,16396,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2434,"Beijing 1954 / 3-degree Gauss-Kruger CM 111E",9001,4214,16397,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2435,"Beijing 1954 / 3-degree Gauss-Kruger CM 114E",9001,4214,16398,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2436,"Beijing 1954 / 3-degree Gauss-Kruger CM 117E",9001,4214,16399,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2437,"Beijing 1954 / 3-degree Gauss-Kruger CM 120E",9001,4214,16170,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2438,"Beijing 1954 / 3-degree Gauss-Kruger CM 123E",9001,4214,16171,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2439,"Beijing 1954 / 3-degree Gauss-Kruger CM 126E",9001,4214,16172,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2440,"Beijing 1954 / 3-degree Gauss-Kruger CM 129E",9001,4214,16173,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2441,"Beijing 1954 / 3-degree Gauss-Kruger CM 132E",9001,4214,16174,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2442,"Beijing 1954 / 3-degree Gauss-Kruger CM 135E",9001,4214,16175,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2443,"JGD2000 / Japan Plane Rectangular CS I",9001,4612,17801,9807,8801,33.0,9110,8802,129.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2444,"JGD2000 / Japan Plane Rectangular CS II",9001,4612,17802,9807,8801,33.0,9110,8802,131.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2445,"JGD2000 / Japan Plane Rectangular CS III",9001,4612,17803,9807,8801,36.0,9110,8802,132.1,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2446,"JGD2000 / Japan Plane Rectangular CS IV",9001,4612,17804,9807,8801,33.0,9110,8802,133.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2447,"JGD2000 / Japan Plane Rectangular CS V",9001,4612,17805,9807,8801,36.0,9110,8802,134.2,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2448,"JGD2000 / Japan Plane Rectangular CS VI",9001,4612,17806,9807,8801,36.0,9110,8802,136.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2449,"JGD2000 / Japan Plane Rectangular CS VII",9001,4612,17807,9807,8801,36.0,9110,8802,137.1,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2450,"JGD2000 / Japan Plane Rectangular CS VIII",9001,4612,17808,9807,8801,36.0,9110,8802,138.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2451,"JGD2000 / Japan Plane Rectangular CS IX",9001,4612,17809,9807,8801,36.0,9110,8802,139.5,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2452,"JGD2000 / Japan Plane Rectangular CS X",9001,4612,17810,9807,8801,40.0,9110,8802,140.5,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2453,"JGD2000 / Japan Plane Rectangular CS XI",9001,4612,17811,9807,8801,44.0,9110,8802,140.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2454,"JGD2000 / Japan Plane Rectangular CS XII",9001,4612,17812,9807,8801,44.0,9110,8802,142.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2455,"JGD2000 / Japan Plane Rectangular CS XIII",9001,4612,17813,9807,8801,44.0,9110,8802,144.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2456,"JGD2000 / Japan Plane Rectangular CS XIV",9001,4612,17814,9807,8801,26.0,9110,8802,142.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2457,"JGD2000 / Japan Plane Rectangular CS XV",9001,4612,17815,9807,8801,26.0,9110,8802,127.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2458,"JGD2000 / Japan Plane Rectangular CS XVI",9001,4612,17816,9807,8801,26.0,9110,8802,124.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2459,"JGD2000 / Japan Plane Rectangular CS XVII",9001,4612,17817,9807,8801,26.0,9110,8802,131.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2460,"JGD2000 / Japan Plane Rectangular CS XVIII",9001,4612,17818,9807,8801,20.0,9110,8802,136.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2461,"JGD2000 / Japan Plane Rectangular CS XIX",9001,4612,17819,9807,8801,26.0,9110,8802,154.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2462,"Albanian 1987 / Gauss-Kruger zone 4",9001,4191,16204,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+2463,"Pulkovo 1995 / Gauss-Kruger CM 21E",9001,4200,16304,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2464,"Pulkovo 1995 / Gauss-Kruger CM 27E",9001,4200,16305,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2465,"Pulkovo 1995 / Gauss-Kruger CM 33E",9001,4200,16306,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2466,"Pulkovo 1995 / Gauss-Kruger CM 39E",9001,4200,16307,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2467,"Pulkovo 1995 / Gauss-Kruger CM 45E",9001,4200,16308,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2468,"Pulkovo 1995 / Gauss-Kruger CM 51E",9001,4200,16309,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2469,"Pulkovo 1995 / Gauss-Kruger CM 57E",9001,4200,16310,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2470,"Pulkovo 1995 / Gauss-Kruger CM 63E",9001,4200,16311,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2471,"Pulkovo 1995 / Gauss-Kruger CM 69E",9001,4200,16312,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2472,"Pulkovo 1995 / Gauss-Kruger CM 75E",9001,4200,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2473,"Pulkovo 1995 / Gauss-Kruger CM 81E",9001,4200,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2474,"Pulkovo 1995 / Gauss-Kruger CM 87E",9001,4200,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2475,"Pulkovo 1995 / Gauss-Kruger CM 93E",9001,4200,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2476,"Pulkovo 1995 / Gauss-Kruger CM 99E",9001,4200,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2477,"Pulkovo 1995 / Gauss-Kruger CM 105E",9001,4200,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2478,"Pulkovo 1995 / Gauss-Kruger CM 111E",9001,4200,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2479,"Pulkovo 1995 / Gauss-Kruger CM 117E",9001,4200,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2480,"Pulkovo 1995 / Gauss-Kruger CM 123E",9001,4200,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2481,"Pulkovo 1995 / Gauss-Kruger CM 129E",9001,4200,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2482,"Pulkovo 1995 / Gauss-Kruger CM 135E",9001,4200,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2483,"Pulkovo 1995 / Gauss-Kruger CM 141E",9001,4200,16324,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2484,"Pulkovo 1995 / Gauss-Kruger CM 147E",9001,4200,16325,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2485,"Pulkovo 1995 / Gauss-Kruger CM 153E",9001,4200,16326,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2486,"Pulkovo 1995 / Gauss-Kruger CM 159E",9001,4200,16327,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2487,"Pulkovo 1995 / Gauss-Kruger CM 165E",9001,4200,16328,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2488,"Pulkovo 1995 / Gauss-Kruger CM 171E",9001,4200,16329,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2489,"Pulkovo 1995 / Gauss-Kruger CM 177E",9001,4200,16330,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2490,"Pulkovo 1995 / Gauss-Kruger CM 177W",9001,4200,16331,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2491,"Pulkovo 1995 / Gauss-Kruger CM 171W",9001,4200,16332,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2492,"Pulkovo 1942 / Gauss-Kruger CM 9E",9001,4284,16302,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2493,"Pulkovo 1942 / Gauss-Kruger CM 15E",9001,4284,16303,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2494,"Pulkovo 1942 / Gauss-Kruger CM 21E",9001,4284,16304,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2495,"Pulkovo 1942 / Gauss-Kruger CM 27E",9001,4284,16305,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2496,"Pulkovo 1942 / Gauss-Kruger CM 33E",9001,4284,16306,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2497,"Pulkovo 1942 / Gauss-Kruger CM 39E",9001,4284,16307,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2498,"Pulkovo 1942 / Gauss-Kruger CM 45E",9001,4284,16308,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2499,"Pulkovo 1942 / Gauss-Kruger CM 51E",9001,4284,16309,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2500,"Pulkovo 1942 / Gauss-Kruger CM 57E",9001,4284,16310,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2501,"Pulkovo 1942 / Gauss-Kruger CM 63E",9001,4284,16311,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2502,"Pulkovo 1942 / Gauss-Kruger CM 69E",9001,4284,16312,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2503,"Pulkovo 1942 / Gauss-Kruger CM 75E",9001,4284,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2504,"Pulkovo 1942 / Gauss-Kruger CM 81E",9001,4284,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2505,"Pulkovo 1942 / Gauss-Kruger CM 87E",9001,4284,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2506,"Pulkovo 1942 / Gauss-Kruger CM 93E",9001,4284,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2507,"Pulkovo 1942 / Gauss-Kruger CM 99E",9001,4284,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2508,"Pulkovo 1942 / Gauss-Kruger CM 105E",9001,4284,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2509,"Pulkovo 1942 / Gauss-Kruger CM 111E",9001,4284,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2510,"Pulkovo 1942 / Gauss-Kruger CM 117E",9001,4284,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2511,"Pulkovo 1942 / Gauss-Kruger CM 123E",9001,4284,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2512,"Pulkovo 1942 / Gauss-Kruger CM 129E",9001,4284,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2513,"Pulkovo 1942 / Gauss-Kruger CM 135E",9001,4284,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2514,"Pulkovo 1942 / Gauss-Kruger CM 141E",9001,4284,16324,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2515,"Pulkovo 1942 / Gauss-Kruger CM 147E",9001,4284,16325,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2516,"Pulkovo 1942 / Gauss-Kruger CM 153E",9001,4284,16326,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2517,"Pulkovo 1942 / Gauss-Kruger CM 159E",9001,4284,16327,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2518,"Pulkovo 1942 / Gauss-Kruger CM 165E",9001,4284,16328,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2519,"Pulkovo 1942 / Gauss-Kruger CM 171E",9001,4284,16329,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2520,"Pulkovo 1942 / Gauss-Kruger CM 177E",9001,4284,16330,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2521,"Pulkovo 1942 / Gauss-Kruger CM 177W",9001,4284,16331,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2522,"Pulkovo 1942 / Gauss-Kruger CM 171W",9001,4284,16332,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2523,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 7",9001,4284,16267,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+2524,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 8",9001,4284,16268,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+2525,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 9",9001,4284,16269,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+2526,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 10",9001,4284,16270,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+2527,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 11",9001,4284,16271,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+2528,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 12",9001,4284,16272,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+2529,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 13",9001,4284,16273,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+2530,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 14",9001,4284,16274,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+2531,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 15",9001,4284,16275,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+2532,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 16",9001,4284,16276,9807,8801,0.0,9102,8802,48.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+2533,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 17",9001,4284,16277,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+2534,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 18",9001,4284,16278,9807,8801,0.0,9102,8802,54.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+2535,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 19",9001,4284,16279,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+2536,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 20",9001,4284,16280,9807,8801,0.0,9102,8802,60.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+2537,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 21",9001,4284,16281,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+2538,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 22",9001,4284,16282,9807,8801,0.0,9102,8802,66.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+2539,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 23",9001,4284,16283,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+2540,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 24",9001,4284,16284,9807,8801,0.0,9102,8802,72.0,9102,8805,1.0,9201,8806,24500000.0,9001,8807,0.0,9001,,,,,,
+2541,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 25",9001,4284,16285,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+2542,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 26",9001,4284,16286,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+2543,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 27",9001,4284,16287,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+2544,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 28",9001,4284,16288,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+2545,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 29",9001,4284,16289,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+2546,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 30",9001,4284,16290,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+2547,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 31",9001,4284,16291,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+2548,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 32",9001,4284,16292,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+2549,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 33",9001,4284,16293,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,33500000.0,9001,8807,0.0,9001,,,,,,
+2550,"Samboja / UTM zone 50S",9001,4125,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2551,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 34",9001,4284,16294,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,34500000.0,9001,8807,0.0,9001,,,,,,
+2552,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 35",9001,4284,16295,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,35500000.0,9001,8807,0.0,9001,,,,,,
+2553,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 36",9001,4284,16296,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,36500000.0,9001,8807,0.0,9001,,,,,,
+2554,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 37",9001,4284,16297,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,37500000.0,9001,8807,0.0,9001,,,,,,
+2555,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 38",9001,4284,16298,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,38500000.0,9001,8807,0.0,9001,,,,,,
+2556,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 39",9001,4284,16299,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,39500000.0,9001,8807,0.0,9001,,,,,,
+2557,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 40",9001,4284,16070,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,40500000.0,9001,8807,0.0,9001,,,,,,
+2558,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 41",9001,4284,16071,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,41500000.0,9001,8807,0.0,9001,,,,,,
+2559,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 42",9001,4284,16072,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,42500000.0,9001,8807,0.0,9001,,,,,,
+2560,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 43",9001,4284,16073,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,43500000.0,9001,8807,0.0,9001,,,,,,
+2561,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 44",9001,4284,16074,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,44500000.0,9001,8807,0.0,9001,,,,,,
+2562,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 45",9001,4284,16075,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,45500000.0,9001,8807,0.0,9001,,,,,,
+2563,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 46",9001,4284,16076,9807,8801,0.0,9102,8802,138.0,9102,8805,1.0,9201,8806,46500000.0,9001,8807,0.0,9001,,,,,,
+2564,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 47",9001,4284,16077,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,47500000.0,9001,8807,0.0,9001,,,,,,
+2565,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 48",9001,4284,16078,9807,8801,0.0,9102,8802,144.0,9102,8805,1.0,9201,8806,48500000.0,9001,8807,0.0,9001,,,,,,
+2566,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 49",9001,4284,16079,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,49500000.0,9001,8807,0.0,9001,,,,,,
+2567,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 50",9001,4284,16080,9807,8801,0.0,9102,8802,150.0,9102,8805,1.0,9201,8806,50500000.0,9001,8807,0.0,9001,,,,,,
+2568,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 51",9001,4284,16081,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,51500000.0,9001,8807,0.0,9001,,,,,,
+2569,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 52",9001,4284,16082,9807,8801,0.0,9102,8802,156.0,9102,8805,1.0,9201,8806,52500000.0,9001,8807,0.0,9001,,,,,,
+2570,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 53",9001,4284,16083,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,53500000.0,9001,8807,0.0,9001,,,,,,
+2571,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 54",9001,4284,16084,9807,8801,0.0,9102,8802,162.0,9102,8805,1.0,9201,8806,54500000.0,9001,8807,0.0,9001,,,,,,
+2572,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 55",9001,4284,16085,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,55500000.0,9001,8807,0.0,9001,,,,,,
+2573,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 56",9001,4284,16086,9807,8801,0.0,9102,8802,168.0,9102,8805,1.0,9201,8806,56500000.0,9001,8807,0.0,9001,,,,,,
+2574,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 57",9001,4284,16087,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,57500000.0,9001,8807,0.0,9001,,,,,,
+2575,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 58",9001,4284,16088,9807,8801,0.0,9102,8802,174.0,9102,8805,1.0,9201,8806,58500000.0,9001,8807,0.0,9001,,,,,,
+2576,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 59",9001,4284,16089,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,59500000.0,9001,8807,0.0,9001,,,,,,
+2577,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 60",9001,4284,16090,9807,8801,0.0,9102,8802,180.0,9102,8805,1.0,9201,8806,60000000.0,9001,8807,0.0,9001,,,,,,
+2578,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 61",9001,4284,16091,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,61500000.0,9001,8807,0.0,9001,,,,,,
+2579,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 62",9001,4284,16092,9807,8801,0.0,9102,8802,-174.0,9102,8805,1.0,9201,8806,62500000.0,9001,8807,0.0,9001,,,,,,
+2580,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 63",9001,4284,16093,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,63500000.0,9001,8807,0.0,9001,,,,,,
+2581,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 64",9001,4284,16094,9807,8801,0.0,9102,8802,-168.0,9102,8805,1.0,9201,8806,64500000.0,9001,8807,0.0,9001,,,,,,
+2582,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 21E",9001,4284,16367,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2583,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 24E",9001,4284,16368,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2584,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 27E",9001,4284,16369,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2585,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 30E",9001,4284,16370,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2586,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 33E",9001,4284,16371,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2587,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 36E",9001,4284,16372,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2588,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 39E",9001,4284,16373,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2589,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 42E",9001,4284,16374,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2590,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 45E",9001,4284,16375,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2591,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 48E",9001,4284,16376,9807,8801,0.0,9102,8802,48.0,9102,8805,1.0,9001,8806,500000.0,9001,8807,0.0,9201,,,,,,
+2592,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 51E",9001,4284,16377,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2593,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 54E",9001,4284,16378,9807,8801,0.0,9102,8802,54.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2594,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 57E",9001,4284,16379,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2595,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 60E",9001,4284,16380,9807,8801,0.0,9102,8802,60.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2596,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 63E",9001,4284,16381,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2597,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 66E",9001,4284,16382,9807,8801,0.0,9102,8802,66.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2598,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 69E",9001,4284,16383,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2599,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 72E",9001,4284,16384,9807,8801,0.0,9102,8802,72.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2600,Lietuvos Koordinoei Sistema 1994,9001,4126,19934,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9998,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2601,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 75E",9001,4284,16385,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2602,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 78E",9001,4284,16386,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2603,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 81E",9001,4284,16387,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2604,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 84E",9001,4284,16388,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2605,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 87E",9001,4284,16389,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2606,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 90E",9001,4284,16390,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2607,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 93E",9001,4284,16391,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2608,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 96E",9001,4284,16392,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2609,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 99E",9001,4284,16393,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2610,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 102E",9001,4284,16394,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2611,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 105E",9001,4284,16395,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2612,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 108E",9001,4284,16396,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2613,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 111E",9001,4284,16397,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2614,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 114E",9001,4284,16398,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2615,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 117E",9001,4284,16399,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2616,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 120E",9001,4284,16170,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2617,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 123E",9001,4284,16171,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2618,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 126E",9001,4284,16172,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2619,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 129E",9001,4284,16173,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2620,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 132E",9001,4284,16174,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2621,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 135E",9001,4284,16175,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2622,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 138E",9001,4284,16176,9807,8801,0.0,9102,8802,138.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2623,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 141E",9001,4284,16177,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2624,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 144E",9001,4284,16178,9807,8801,0.0,9102,8802,144.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2625,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 147E",9001,4284,16179,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2626,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 150E",9001,4284,16180,9807,8801,0.0,9102,8802,150.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2627,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 153E",9001,4284,16181,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2628,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 156E",9001,4284,16182,9807,8801,0.0,9102,8802,156.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2629,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 159E",9001,4284,16183,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2630,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 162E",9001,4284,16184,9807,8801,0.0,9102,8802,162.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2631,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 165E",9001,4284,16185,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2632,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 168E",9001,4284,16186,9807,8801,0.0,9102,8802,168.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2633,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 171E",9001,4284,16187,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2634,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 174E",9001,4284,16188,9807,8801,0.0,9102,8802,174.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2635,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 177E",9001,4284,16189,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2636,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 180E",9001,4284,16190,9807,8801,0.0,9102,8802,180.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2637,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 177W",9001,4284,16191,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2638,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 174W",9001,4284,16192,9807,8801,0.0,9102,8802,-174.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2639,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 171W",9001,4284,16193,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2640,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 168W",9001,4284,16194,9807,8801,0.0,9102,8802,-168.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2641,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 7",9001,4284,16267,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+2642,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 8",9001,4284,16268,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+2643,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 9",9001,4284,16269,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+2644,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 10",9001,4284,16270,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+2645,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 11",9001,4284,16271,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+2646,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 12",9001,4284,16272,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+2647,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 13",9001,4284,16273,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+2648,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 14",9001,4284,16274,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+2649,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 15",9001,4284,16275,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+2650,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 16",9001,4284,16276,9807,8801,0.0,9102,8802,48.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+2651,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 17",9001,4284,16277,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+2652,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 18",9001,4284,16278,9807,8801,0.0,9102,8802,54.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+2653,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 19",9001,4284,16279,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+2654,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 20",9001,4284,16280,9807,8801,0.0,9102,8802,60.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+2655,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 21",9001,4284,16281,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+2656,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 22",9001,4284,16282,9807,8801,0.0,9102,8802,66.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+2657,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 23",9001,4284,16283,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+2658,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 24",9001,4284,16284,9807,8801,0.0,9102,8802,72.0,9102,8805,1.0,9201,8806,24500000.0,9001,8807,0.0,9001,,,,,,
+2659,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 25",9001,4284,16285,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+2660,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 26",9001,4284,16286,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+2661,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 27",9001,4284,16287,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+2662,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 28",9001,4284,16288,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+2663,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 29",9001,4284,16289,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+2664,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 30",9001,4284,16290,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+2665,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 31",9001,4284,16291,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+2666,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 32",9001,4284,16292,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+2667,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 33",9001,4284,16293,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,33500000.0,9001,8807,0.0,9001,,,,,,
+2668,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 34",9001,4284,16294,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,34500000.0,9001,8807,0.0,9001,,,,,,
+2669,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 35",9001,4284,16295,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,35500000.0,9001,8807,0.0,9001,,,,,,
+2670,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 36",9001,4284,16296,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,36500000.0,9001,8807,0.0,9001,,,,,,
+2671,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 37",9001,4284,16297,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,37500000.0,9001,8807,0.0,9001,,,,,,
+2672,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 38",9001,4284,16298,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,38500000.0,9001,8807,0.0,9001,,,,,,
+2673,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 39",9001,4284,16299,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,39500000.0,9001,8807,0.0,9001,,,,,,
+2674,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 40",9001,4284,16070,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,40500000.0,9001,8807,0.0,9001,,,,,,
+2675,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 41",9001,4284,16071,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,41500000.0,9001,8807,0.0,9001,,,,,,
+2676,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 42",9001,4284,16072,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,42500000.0,9001,8807,0.0,9001,,,,,,
+2677,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 43",9001,4284,16073,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,43500000.0,9001,8807,0.0,9001,,,,,,
+2678,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 44",9001,4284,16074,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,44500000.0,9001,8807,0.0,9001,,,,,,
+2679,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 45",9001,4284,16075,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,45500000.0,9001,8807,0.0,9001,,,,,,
+2680,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 46",9001,4284,16076,9807,8801,0.0,9102,8802,138.0,9102,8805,1.0,9201,8806,46500000.0,9001,8807,0.0,9001,,,,,,
+2681,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 47",9001,4284,16077,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,47500000.0,9001,8807,0.0,9001,,,,,,
+2682,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 48",9001,4284,16078,9807,8801,0.0,9102,8802,144.0,9102,8805,1.0,9201,8806,48500000.0,9001,8807,0.0,9001,,,,,,
+2683,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 49",9001,4284,16079,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,49500000.0,9001,8807,0.0,9001,,,,,,
+2684,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 50",9001,4284,16080,9807,8801,0.0,9102,8802,150.0,9102,8805,1.0,9201,8806,50500000.0,9001,8807,0.0,9001,,,,,,
+2685,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 51",9001,4284,16081,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,51500000.0,9001,8807,0.0,9001,,,,,,
+2686,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 52",9001,4284,16082,9807,8801,0.0,9102,8802,156.0,9102,8805,1.0,9201,8806,52500000.0,9001,8807,0.0,9001,,,,,,
+2687,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 53",9001,4284,16083,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,53500000.0,9001,8807,0.0,9001,,,,,,
+2688,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 54",9001,4284,16084,9807,8801,0.0,9102,8802,162.0,9102,8805,1.0,9201,8806,54500000.0,9001,8807,0.0,9001,,,,,,
+2689,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 55",9001,4284,16085,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,55500000.0,9001,8807,0.0,9001,,,,,,
+2690,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 56",9001,4284,16086,9807,8801,0.0,9102,8802,168.0,9102,8805,1.0,9201,8806,56500000.0,9001,8807,0.0,9001,,,,,,
+2691,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 57",9001,4284,16087,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,57500000.0,9001,8807,0.0,9001,,,,,,
+2692,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 58",9001,4284,16088,9807,8801,0.0,9102,8802,174.0,9102,8805,1.0,9201,8806,58500000.0,9001,8807,0.0,9001,,,,,,
+2693,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 59",9001,4284,16089,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,59500000.0,9001,8807,0.0,9001,,,,,,
+2694,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 60",9001,4284,16090,9807,8801,0.0,9102,8802,180.0,9102,8805,1.0,9201,8806,60000000.0,9001,8807,0.0,9001,,,,,,
+2695,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 61",9001,4284,16091,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,61500000.0,9001,8807,0.0,9001,,,,,,
+2696,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 62",9001,4284,16092,9807,8801,0.0,9102,8802,-174.0,9102,8805,1.0,9201,8806,62500000.0,9001,8807,0.0,9001,,,,,,
+2697,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 63",9001,4284,16093,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,63500000.0,9001,8807,0.0,9001,,,,,,
+2698,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 64",9001,4284,16094,9807,8801,0.0,9102,8802,-168.0,9102,8805,1.0,9201,8806,64500000.0,9001,8807,0.0,9001,,,,,,
+2699,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 21E",9001,4284,16367,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2700,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 24E",9001,4284,16368,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2701,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 27E",9001,4284,16369,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2702,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 30E",9001,4284,16370,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2703,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 33E",9001,4284,16371,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2704,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 36E",9001,4284,16372,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2705,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 39E",9001,4284,16373,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2706,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 42E",9001,4284,16374,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2707,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 45E",9001,4284,16375,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2708,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 48E",9001,4284,16376,9807,8801,0.0,9102,8802,48.0,9102,8805,1.0,9001,8806,500000.0,9001,8807,0.0,9201,,,,,,
+2709,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 51E",9001,4284,16377,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2710,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 54E",9001,4284,16378,9807,8801,0.0,9102,8802,54.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2711,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 57E",9001,4284,16379,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2712,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 60E",9001,4284,16380,9807,8801,0.0,9102,8802,60.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2713,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 63E",9001,4284,16381,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2714,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 66E",9001,4284,16382,9807,8801,0.0,9102,8802,66.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2715,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 69E",9001,4284,16383,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2716,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 72E",9001,4284,16384,9807,8801,0.0,9102,8802,72.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2717,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 75E",9001,4284,16385,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2718,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 78E",9001,4284,16386,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2719,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 81E",9001,4284,16387,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2720,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 84E",9001,4284,16388,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2721,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 87E",9001,4284,16389,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2722,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 90E",9001,4284,16390,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2723,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 93E",9001,4284,16391,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2724,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 96E",9001,4284,16392,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2725,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 99E",9001,4284,16393,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2726,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 102E",9001,4284,16394,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2727,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 105E",9001,4284,16395,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2728,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 108E",9001,4284,16396,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2729,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 111E",9001,4284,16397,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2730,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 114E",9001,4284,16398,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2731,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 117E",9001,4284,16399,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2732,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 120E",9001,4284,16170,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2733,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 123E",9001,4284,16171,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2734,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 126E",9001,4284,16172,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2735,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 129E",9001,4284,16173,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2736,"Tete / UTM zone 36S",9001,4127,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2737,"Tete / UTM zone 37S",9001,4127,16137,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2738,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 132E",9001,4284,16174,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2739,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 135E",9001,4284,16175,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2740,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 138E",9001,4284,16176,9807,8801,0.0,9102,8802,138.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2741,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 141E",9001,4284,16177,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2742,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 144E",9001,4284,16178,9807,8801,0.0,9102,8802,144.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2743,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 147E",9001,4284,16179,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2744,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 150E",9001,4284,16180,9807,8801,0.0,9102,8802,150.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2745,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 153E",9001,4284,16181,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2746,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 156E",9001,4284,16182,9807,8801,0.0,9102,8802,156.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2747,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 159E",9001,4284,16183,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2748,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 162E",9001,4284,16184,9807,8801,0.0,9102,8802,162.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2749,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 165E",9001,4284,16185,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2750,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 168E",9001,4284,16186,9807,8801,0.0,9102,8802,168.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2751,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 171E",9001,4284,16187,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2752,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 174E",9001,4284,16188,9807,8801,0.0,9102,8802,174.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2753,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 177E",9001,4284,16189,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2754,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 180E",9001,4284,16190,9807,8801,0.0,9102,8802,180.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2755,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 177W",9001,4284,16191,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2756,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 174W",9001,4284,16192,9807,8801,0.0,9102,8802,-174.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2757,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 171W",9001,4284,16193,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2758,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 168W",9001,4284,16194,9807,8801,0.0,9102,8802,-168.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2759,"NAD83(HARN) / Alabama East",9001,4152,10131,9807,8801,30.3,9110,8802,-85.5,9110,8805,0.99996,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2760,"NAD83(HARN) / Alabama West",9001,4152,10132,9807,8801,30.0,9110,8802,-87.3,9110,8805,0.999933333,9201,8806,600000.0,9001,8807,0.0,9001,,,,,,
+2761,"NAD83(HARN) / Arizona East",9001,4152,10231,9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+2762,"NAD83(HARN) / Arizona Central",9001,4152,10232,9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+2763,"NAD83(HARN) / Arizona West",9001,4152,10233,9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+2764,"NAD83(HARN) / Arkansas North",9001,4152,10331,9802,8821,34.2,9110,8822,-92.0,9110,8823,36.14,9110,8824,34.56,9110,8826,400000.0,9001,8827,0.0,9001,,,
+2765,"NAD83(HARN) / Arkansas South",9001,4152,10332,9802,8821,32.4,9110,8822,-92.0,9110,8823,34.46,9110,8824,33.18,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+2766,"NAD83(HARN) / California zone 1",9001,4152,10431,9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+2767,"NAD83(HARN) / California zone 2",9001,4152,10432,9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+2768,"NAD83(HARN) / California zone 3",9001,4152,10433,9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+2769,"NAD83(HARN) / California zone 4",9001,4152,10434,9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+2770,"NAD83(HARN) / California zone 5",9001,4152,10435,9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+2771,"NAD83(HARN) / California zone 6",9001,4152,10436,9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+2772,"NAD83(HARN) / Colorado North",9001,4152,10531,9802,8821,39.2,9110,8822,-105.3,9110,8823,40.47,9110,8824,39.43,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+2773,"NAD83(HARN) / Colorado Central",9001,4152,10532,9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+2774,"NAD83(HARN) / Colorado South",9001,4152,10533,9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+2775,"NAD83(HARN) / Connecticut",9001,4152,10630,9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,304800.6096,9001,8827,152400.3048,9001,,,
+2776,"NAD83(HARN) / Delaware",9001,4152,10730,9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2777,"NAD83(HARN) / Florida East",9001,4152,10931,9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2778,"NAD83(HARN) / Florida West",9001,4152,10932,9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2779,"NAD83(HARN) / Florida North",9001,4152,10933,9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2780,"NAD83(HARN) / Georgia East",9001,4152,11031,9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2781,"NAD83(HARN) / Georgia West",9001,4152,11032,9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+2782,"NAD83(HARN) / Hawaii zone 1",9001,4152,15131,9807,8801,18.5,9110,8802,-155.3,9110,8805,0.999966667,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2783,"NAD83(HARN) / Hawaii zone 2",9001,4152,15132,9807,8801,20.2,9110,8802,-156.4,9110,8805,0.999966667,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2784,"NAD83(HARN) / Hawaii zone 3",9001,4152,15133,9807,8801,21.1,9110,8802,-158.0,9110,8805,0.99999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2785,"NAD83(HARN) / Hawaii zone 4",9001,4152,15134,9807,8801,21.5,9110,8802,-159.3,9110,8805,0.99999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2786,"NAD83(HARN) / Hawaii zone 5",9001,4152,15135,9807,8801,21.4,9110,8802,-160.1,9110,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2787,"NAD83(HARN) / Idaho East",9001,4152,11131,9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2788,"NAD83(HARN) / Idaho Central",9001,4152,11132,9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2789,"NAD83(HARN) / Idaho West",9001,4152,11133,9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,800000.0,9001,8807,0.0,9001,,,,,,
+2790,"NAD83(HARN) / Illinois East",9001,4152,11231,9807,8801,36.4,9110,8802,-88.2,9110,8805,0.999975,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+2791,"NAD83(HARN) / Illinois West",9001,4152,11232,9807,8801,36.4,9110,8802,-90.1,9110,8805,0.999941177,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+2792,"NAD83(HARN) / Indiana East",9001,4152,11331,9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,100000.0,9001,8807,250000.0,9001,,,,,,
+2793,"NAD83(HARN) / Indiana West",9001,4152,11332,9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,900000.0,9001,8807,250000.0,9001,,,,,,
+2794,"NAD83(HARN) / Iowa North",9001,4152,11431,9802,8821,41.3,9110,8822,-93.3,9110,8823,43.16,9110,8824,42.04,9110,8826,1500000.0,9001,8827,1000000.0,9001,,,
+2795,"NAD83(HARN) / Iowa South",9001,4152,11432,9802,8821,40.0,9110,8822,-93.3,9110,8823,41.47,9110,8824,40.37,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2796,"NAD83(HARN) / Kansas North",9001,4152,11531,9802,8821,38.2,9110,8822,-98.0,9110,8823,39.47,9110,8824,38.43,9110,8826,400000.0,9001,8827,0.0,9001,,,
+2797,"NAD83(HARN) / Kansas South",9001,4152,11532,9802,8821,36.4,9110,8822,-98.3,9110,8823,38.34,9110,8824,37.16,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+2798,"NAD83(HARN) / Kentucky North",9001,4152,15303,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2799,"NAD83(HARN) / Kentucky South",9001,4152,11632,9802,8821,36.2,9110,8822,-85.45,9110,8823,37.56,9110,8824,36.44,9110,8826,500000.0,9001,8827,500000.0,9001,,,
+2800,"NAD83(HARN) / Louisiana North",9001,4152,11731,9802,8821,30.3,9110,8822,-92.3,9110,8823,32.4,9110,8824,31.1,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+2801,"NAD83(HARN) / Louisiana South",9001,4152,11732,9802,8821,28.3,9110,8822,-91.2,9110,8823,30.42,9110,8824,29.18,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+2802,"NAD83(HARN) / Maine East",9001,4152,11831,9807,8801,43.4,9110,8802,-68.3,9110,8805,0.9999,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+2803,"NAD83(HARN) / Maine West",9001,4152,11832,9807,8801,42.5,9110,8802,-70.1,9110,8805,0.999966667,9201,8806,900000.0,9001,8807,0.0,9001,,,,,,
+2804,"NAD83(HARN) / Maryland",9001,4152,11930,9802,8821,37.4,9110,8822,-77.0,9110,8823,39.27,9110,8824,38.18,9110,8826,400000.0,9001,8827,0.0,9001,,,
+2805,"NAD83(HARN) / Massachusetts Mainland",9001,4152,12031,9802,8821,41.0,9110,8822,-71.3,9110,8823,42.41,9110,8824,41.43,9110,8826,200000.0,9001,8827,750000.0,9001,,,
+2806,"NAD83(HARN) / Massachusetts Island",9001,4152,12032,9802,8821,41.0,9110,8822,-70.3,9110,8823,41.29,9110,8824,41.17,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2807,"NAD83(HARN) / Michigan North",9001,4152,12141,9802,8821,44.47,9110,8822,-87.0,9110,8823,47.05,9110,8824,45.29,9110,8826,8000000.0,9001,8827,0.0,9001,,,
+2808,"NAD83(HARN) / Michigan Central",9001,4152,12142,9802,8821,43.19,9110,8822,-84.22,9110,8823,45.42,9110,8824,44.11,9110,8826,6000000.0,9001,8827,0.0,9001,,,
+2809,"NAD83(HARN) / Michigan South",9001,4152,12143,9802,8821,41.3,9110,8822,-84.22,9110,8823,43.4,9110,8824,42.06,9110,8826,4000000.0,9001,8827,0.0,9001,,,
+2810,"NAD83(HARN) / Minnesota North",9001,4152,12231,9802,8821,46.3,9110,8822,-93.06,9110,8823,48.38,9110,8824,47.02,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+2811,"NAD83(HARN) / Minnesota Central",9001,4152,12232,9802,8821,45.0,9110,8822,-94.15,9110,8823,47.03,9110,8824,45.37,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+2812,"NAD83(HARN) / Minnesota South",9001,4152,12233,9802,8821,43.0,9110,8822,-94.0,9110,8823,45.13,9110,8824,43.47,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+2813,"NAD83(HARN) / Mississippi East",9001,4152,12331,9807,8801,29.3,9110,8802,-88.5,9110,8805,0.99995,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+2814,"NAD83(HARN) / Mississippi West",9001,4152,12332,9807,8801,29.3,9110,8802,-90.2,9110,8805,0.99995,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+2815,"NAD83(HARN) / Missouri East",9001,4152,12431,9807,8801,35.5,9110,8802,-90.3,9110,8805,0.999933333,9201,8806,250000.0,9001,8807,0.0,9001,,,,,,
+2816,"NAD83(HARN) / Missouri Central",9001,4152,12432,9807,8801,35.5,9110,8802,-92.3,9110,8805,0.999933333,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2817,"NAD83(HARN) / Missouri West",9001,4152,12433,9807,8801,36.1,9110,8802,-94.3,9110,8805,0.999941177,9201,8806,850000.0,9001,8807,0.0,9001,,,,,,
+2818,"NAD83(HARN) / Montana",9001,4152,12530,9802,8821,44.15,9110,8822,-109.3,9110,8823,49.0,9110,8824,45.0,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2819,"NAD83(HARN) / Nebraska",9001,4152,12630,9802,8821,39.5,9110,8822,-100.0,9110,8823,43.0,9110,8824,40.0,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2820,"NAD83(HARN) / Nevada East",9001,4152,12731,9807,8801,34.45,9110,8802,-115.35,9110,8805,0.9999,9201,8806,200000.0,9001,8807,8000000.0,9001,,,,,,
+2821,"NAD83(HARN) / Nevada Central",9001,4152,12732,9807,8801,34.45,9110,8802,-116.4,9110,8805,0.9999,9201,8806,500000.0,9001,8807,6000000.0,9001,,,,,,
+2822,"NAD83(HARN) / Nevada West",9001,4152,12733,9807,8801,34.45,9110,8802,-118.35,9110,8805,0.9999,9201,8806,800000.0,9001,8807,4000000.0,9001,,,,,,
+2823,"NAD83(HARN) / New Hampshire",9001,4152,12830,9807,8801,42.3,9110,8802,-71.4,9110,8805,0.999966667,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+2824,"NAD83(HARN) / New Jersey",9001,4152,12930,9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+2825,"NAD83(HARN) / New Mexico East",9001,4152,13031,9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,165000.0,9001,8807,0.0,9001,,,,,,
+2826,"NAD83(HARN) / New Mexico Central",9001,4152,13032,9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2827,"NAD83(HARN) / New Mexico West",9001,4152,13033,9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,830000.0,9001,8807,0.0,9001,,,,,,
+2828,"NAD83(HARN) / New York East",9001,4152,13131,9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+2829,"NAD83(HARN) / New York Central",9001,4152,13132,9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,250000.0,9001,8807,0.0,9001,,,,,,
+2830,"NAD83(HARN) / New York West",9001,4152,13133,9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,350000.0,9001,8807,0.0,9001,,,,,,
+2831,"NAD83(HARN) / New York Long Island",9001,4152,13134,9802,8821,40.1,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,300000.0,9001,8827,0.0,9001,,,
+2832,"NAD83(HARN) / North Dakota North",9001,4152,13331,9802,8821,47.0,9110,8822,-100.3,9110,8823,48.44,9110,8824,47.26,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2833,"NAD83(HARN) / North Dakota South",9001,4152,13332,9802,8821,45.4,9110,8822,-100.3,9110,8823,47.29,9110,8824,46.11,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2834,"NAD83(HARN) / Ohio North",9001,4152,13431,9802,8821,39.4,9110,8822,-82.3,9110,8823,41.42,9110,8824,40.26,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2835,"NAD83(HARN) / Ohio South",9001,4152,13432,9802,8821,38.0,9110,8822,-82.3,9110,8823,40.02,9110,8824,38.44,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2836,"NAD83(HARN) / Oklahoma North",9001,4152,13531,9802,8821,35.0,9110,8822,-98.0,9110,8823,36.46,9110,8824,35.34,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2837,"NAD83(HARN) / Oklahoma South",9001,4152,13532,9802,8821,33.2,9110,8822,-98.0,9110,8823,35.14,9110,8824,33.56,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2838,"NAD83(HARN) / Oregon North",9001,4152,13631,9802,8821,43.4,9110,8822,-120.3,9110,8823,46.0,9110,8824,44.2,9110,8826,2500000.0,9001,8827,0.0,9001,,,
+2839,"NAD83(HARN) / Oregon South",9001,4152,13632,9802,8821,41.4,9110,8822,-120.3,9110,8823,44.0,9110,8824,42.2,9110,8826,1500000.0,9001,8827,0.0,9001,,,
+2840,"NAD83(HARN) / Rhode Island",9001,4152,13830,9807,8801,41.05,9110,8802,-71.3,9110,8805,0.99999375,9201,8806,100000.0,9001,8807,0.0,9001,,,,,,
+2841,"NAD83(HARN) / South Dakota North",9001,4152,14031,9802,8821,43.5,9110,8822,-100.0,9110,8823,45.41,9110,8824,44.25,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2842,"NAD83(HARN) / South Dakota South",9001,4152,14032,9802,8821,42.2,9110,8822,-100.2,9110,8823,44.24,9110,8824,42.5,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2843,"NAD83(HARN) / Tennessee",9001,4152,14130,9802,8821,34.2,9110,8822,-86.0,9110,8823,36.25,9110,8824,35.15,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2844,"NAD83(HARN) / Texas North",9001,4152,14231,9802,8821,34.0,9110,8822,-101.3,9110,8823,36.11,9110,8824,34.39,9110,8826,200000.0,9001,8827,1000000.0,9001,,,
+2845,"NAD83(HARN) / Texas North Central",9001,4152,14232,9802,8821,31.4,9110,8822,-98.3,9110,8823,33.58,9110,8824,32.08,9110,8826,600000.0,9001,8827,2000000.0,9001,,,
+2846,"NAD83(HARN) / Texas Central",9001,4152,14233,9802,8821,29.4,9110,8822,-100.2,9110,8823,31.53,9110,8824,30.07,9110,8826,700000.0,9001,8827,3000000.0,9001,,,
+2847,"NAD83(HARN) / Texas South Central",9001,4152,14234,9802,8821,27.5,9110,8822,-99.0,9110,8823,30.17,9110,8824,28.23,9110,8826,600000.0,9001,8827,4000000.0,9001,,,
+2848,"NAD83(HARN) / Texas South",9001,4152,14235,9802,8821,25.4,9110,8822,-98.3,9110,8823,27.5,9110,8824,26.1,9110,8826,300000.0,9001,8827,5000000.0,9001,,,
+2849,"NAD83(HARN) / Utah North",9001,4152,14331,9802,8821,40.2,9110,8822,-111.3,9110,8823,41.47,9110,8824,40.43,9110,8826,500000.0,9001,8827,1000000.0,9001,,,
+2850,"NAD83(HARN) / Utah Central",9001,4152,14332,9802,8821,38.2,9110,8822,-111.3,9110,8823,40.39,9110,8824,39.01,9110,8826,500000.0,9001,8827,2000000.0,9001,,,
+2851,"NAD83(HARN) / Utah South",9001,4152,14333,9802,8821,36.4,9110,8822,-111.3,9110,8823,38.21,9110,8824,37.13,9110,8826,500000.0,9001,8827,3000000.0,9001,,,
+2852,"NAD83(HARN) / Vermont",9001,4152,14430,9807,8801,42.3,9110,8802,-72.3,9110,8805,0.999964286,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2853,"NAD83(HARN) / Virginia North",9001,4152,14531,9802,8821,37.4,9110,8822,-78.3,9110,8823,39.12,9110,8824,38.02,9110,8826,3500000.0,9001,8827,2000000.0,9001,,,
+2854,"NAD83(HARN) / Virginia South",9001,4152,14532,9802,8821,36.2,9110,8822,-78.3,9110,8823,37.58,9110,8824,36.46,9110,8826,3500000.0,9001,8827,1000000.0,9001,,,
+2855,"NAD83(HARN) / Washington North",9001,4152,14631,9802,8821,47.0,9110,8822,-120.5,9110,8823,48.44,9110,8824,47.3,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2856,"NAD83(HARN) / Washington South",9001,4152,14632,9802,8821,45.2,9110,8822,-120.3,9110,8823,47.2,9110,8824,45.5,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2857,"NAD83(HARN) / West Virginia North",9001,4152,14731,9802,8821,38.3,9110,8822,-79.3,9110,8823,40.15,9110,8824,39.0,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2858,"NAD83(HARN) / West Virginia South",9001,4152,14732,9802,8821,37.0,9110,8822,-81.0,9110,8823,38.53,9110,8824,37.29,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2859,"NAD83(HARN) / Wisconsin North",9001,4152,14831,9802,8821,45.1,9110,8822,-90.0,9110,8823,46.46,9110,8824,45.34,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2860,"NAD83(HARN) / Wisconsin Central",9001,4152,14832,9802,8821,43.5,9110,8822,-90.0,9110,8823,45.3,9110,8824,44.15,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2861,"NAD83(HARN) / Wisconsin South",9001,4152,14833,9802,8821,42.0,9110,8822,-90.0,9110,8823,44.04,9110,8824,42.44,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2862,"NAD83(HARN) / Wyoming East",9001,4152,14931,9807,8801,40.3,9110,8802,-105.1,9110,8805,0.9999375,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2863,"NAD83(HARN) / Wyoming East Central",9001,4152,14932,9807,8801,40.3,9110,8802,-107.2,9110,8805,0.9999375,9201,8806,400000.0,9001,8807,100000.0,9001,,,,,,
+2864,"NAD83(HARN) / Wyoming West Central",9001,4152,14933,9807,8801,40.3,9110,8802,-108.45,9110,8805,0.9999375,9201,8806,600000.0,9001,8807,0.0,9001,,,,,,
+2865,"NAD83(HARN) / Wyoming West",9001,4152,14934,9807,8801,40.3,9110,8802,-110.05,9110,8805,0.9999375,9201,8806,800000.0,9001,8807,100000.0,9001,,,,,,
+2866,"NAD83(HARN) / Puerto Rico & Virgin Is.",9001,4152,15230,9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,200000.0,9001,8827,200000.0,9001,,,
+2867,"NAD83(HARN) / Arizona East (ft)",9002,4152,15304,9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+2868,"NAD83(HARN) / Arizona Central (ft)",9002,4152,15305,9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+2869,"NAD83(HARN) / Arizona West (ft)",9002,4152,15306,9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+2870,"NAD83(HARN) / California zone 1 (ftUS)",9003,4152,15307,9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2871,"NAD83(HARN) / California zone 2 (ftUS)",9003,4152,15308,9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2872,"NAD83(HARN) / California zone 3 (ftUS)",9003,4152,15309,9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2873,"NAD83(HARN) / California zone 4 (ftUS)",9003,4152,15310,9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2874,"NAD83(HARN) / California zone 5 (ftUS)",9003,4152,15311,9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2875,"NAD83(HARN) / California zone 6 (ftUS)",9003,4152,15312,9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2876,"NAD83(HARN) / Colorado North (ftUS)",9003,4152,15313,9802,8821,39.2,9110,8822,-105.3,9110,8823,40.47,9110,8824,39.43,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+2877,"NAD83(HARN) / Colorado Central (ftUS)",9003,4152,15314,9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+2878,"NAD83(HARN) / Colorado South (ftUS)",9003,4152,15315,9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+2879,"NAD83(HARN) / Connecticut (ftUS)",9003,4152,15316,9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,1000000.0,9003,8827,500000.0,9003,,,
+2880,"NAD83(HARN) / Delaware (ftUS)",9003,4152,15317,9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2881,"NAD83(HARN) / Florida East (ftUS)",9003,4152,15318,9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2882,"NAD83(HARN) / Florida West (ftUS)",9003,4152,15319,9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2883,"NAD83(HARN) / Florida North (ftUS)",9003,4152,15320,9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2884,"NAD83(HARN) / Georgia East (ftUS)",9003,4152,15321,9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2885,"NAD83(HARN) / Georgia West (ftUS)",9003,4152,15322,9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,2296583.333,9003,8807,0.0,9003,,,,,,
+2886,"NAD83(HARN) / Idaho East (ftUS)",9003,4152,15323,9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2887,"NAD83(HARN) / Idaho Central (ftUS)",9003,4152,15324,9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,1640416.667,9003,8807,0.0,9003,,,,,,
+2888,"NAD83(HARN) / Idaho West (ftUS)",9003,4152,15325,9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,2624666.667,9003,8807,0.0,9003,,,,,,
+2889,"NAD83(HARN) / Indiana East (ftUS)",9003,4152,15326,9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,328083.333,9003,8807,818125.0,9003,,,,,,
+2890,"NAD83(HARN) / Indiana West (ftUS)",9003,4152,15327,9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,2952750.0,9003,8807,818125.0,9003,,,,,,
+2891,"NAD83(HARN) / Kentucky North (ftUS)",9003,4152,15328,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2892,"NAD83(HARN) / Kentucky South (ftUS)",9003,4152,15329,9802,8821,36.2,9110,8822,-85.45,9110,8823,37.56,9110,8824,36.44,9110,8826,1640416.667,9003,8827,1640416.667,9003,,,
+2893,"NAD83(HARN) / Maryland (ftUS)",9003,4152,15330,9802,8821,37.4,9110,8822,-77.0,9110,8823,39.27,9110,8824,38.18,9110,8826,1312333.333,9003,8827,0.0,9003,,,
+2894,"NAD83(HARN) / Massachusetts Mainland (ftUS)",9003,4152,15331,9802,8821,41.0,9110,8822,-71.3,9110,8823,42.41,9110,8824,41.43,9110,8826,656166.667,9003,8827,2460625.0,9003,,,
+2895,"NAD83(HARN) / Massachusetts Island (ftUS)",9003,4152,15332,9802,8821,41.0,9110,8822,-70.3,9110,8823,41.29,9110,8824,41.17,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2896,"NAD83(HARN) / Michigan North (ft)",9002,4152,15333,9802,8821,44.47,9110,8822,-87.0,9110,8823,47.05,9110,8824,45.29,9110,8826,26246719.16,9002,8827,0.0,9002,,,
+2897,"NAD83(HARN) / Michigan Central (ft)",9002,4152,15334,9802,8821,43.19,9110,8822,-84.22,9110,8823,45.42,9110,8824,44.11,9110,8826,19685039.37,9002,8827,0.0,9002,,,
+2898,"NAD83(HARN) / Michigan South (ft)",9002,4152,15335,9802,8821,41.3,9110,8822,-84.22,9110,8823,43.4,9110,8824,42.06,9110,8826,13123359.58,9002,8827,0.0,9002,,,
+2899,"NAD83(HARN) / Mississippi East (ftUS)",9003,4152,15336,9807,8801,29.3,9110,8802,-88.5,9110,8805,0.99995,9201,8806,984250.0,9003,8807,0.0,9003,,,,,,
+2900,"NAD83(HARN) / Mississippi West (ftUS)",9003,4152,15337,9807,8801,29.3,9110,8802,-90.2,9110,8805,0.99995,9201,8806,2296583.333,9003,8807,0.0,9003,,,,,,
+2901,"NAD83(HARN) / Montana (ft)",9002,4152,15338,9802,8821,44.15,9110,8822,-109.3,9110,8823,49.0,9110,8824,45.0,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+2902,"NAD83(HARN) / New Mexico East (ftUS)",9003,4152,15339,9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,541337.5,9003,8807,0.0,9003,,,,,,
+2903,"NAD83(HARN) / New Mexico Central (ftUS)",9003,4152,15340,9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,1640416.667,9003,8807,0.0,9003,,,,,,
+2904,"NAD83(HARN) / New Mexico West (ftUS)",9003,4152,15341,9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,2723091.667,9003,8807,0.0,9003,,,,,,
+2905,"NAD83(HARN) / New York East (ftUS)",9003,4152,15342,9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,492125.0,9003,8807,0.0,9003,,,,,,
+2906,"NAD83(HARN) / New York Central (ftUS)",9003,4152,15343,9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,820208.333,9003,8807,0.0,9003,,,,,,
+2907,"NAD83(HARN) / New York West (ftUS)",9003,4152,15344,9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,1148291.667,9003,8807,0.0,9003,,,,,,
+2908,"NAD83(HARN) / New York Long Island (ftUS)",9003,4152,15345,9802,8821,40.1,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,984250.0,9003,8827,0.0,9003,,,
+2909,"NAD83(HARN) / North Dakota North (ft)",9002,4152,15347,9802,8821,47.0,9110,8822,-100.3,9110,8823,48.44,9110,8824,47.26,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+2910,"NAD83(HARN) / North Dakota South (ft)",9002,4152,15348,9802,8821,45.4,9110,8822,-100.3,9110,8823,47.29,9110,8824,46.11,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+2911,"NAD83(HARN) / Oklahoma North (ftUS)",9003,4152,15349,9802,8821,35.0,9110,8822,-98.0,9110,8823,36.46,9110,8824,35.34,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2912,"NAD83(HARN) / Oklahoma South (ftUS)",9003,4152,15350,9802,8821,33.2,9110,8822,-98.0,9110,8823,35.14,9110,8824,33.56,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2913,"NAD83(HARN) / Oregon North (ft)",9002,4152,15351,9802,8821,43.4,9110,8822,-120.3,9110,8823,46.0,9110,8824,44.2,9110,8826,8202099.738,9002,8827,0.0,9002,,,
+2914,"NAD83(HARN) / Oregon South (ft)",9002,4152,15352,9802,8821,41.4,9110,8822,-120.3,9110,8823,44.0,9110,8824,42.2,9110,8826,4921259.843,9002,8827,0.0,9002,,,
+2915,"NAD83(HARN) / Tennessee (ftUS)",9003,4152,15356,9802,8821,34.2,9110,8822,-86.0,9110,8823,36.25,9110,8824,35.15,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2916,"NAD83(HARN) / Texas North (ftUS)",9003,4152,15357,9802,8821,34.0,9110,8822,-101.3,9110,8823,36.11,9110,8824,34.39,9110,8826,656166.667,9003,8827,3280833.333,9003,,,
+2917,"NAD83(HARN) / Texas North Central (ftUS)",9003,4152,15358,9802,8821,31.4,9110,8822,-98.3,9110,8823,33.58,9110,8824,32.08,9110,8826,1968500.0,9003,8827,6561666.667,9003,,,
+2918,"NAD83(HARN) / Texas Central (ftUS)",9003,4152,15359,9802,8821,29.4,9110,8822,-100.2,9110,8823,31.53,9110,8824,30.07,9110,8826,2296583.333,9003,8827,9842500.0,9003,,,
+2919,"NAD83(HARN) / Texas South Central (ftUS)",9003,4152,15360,9802,8821,27.5,9110,8822,-99.0,9110,8823,30.17,9110,8824,28.23,9110,8826,1968500.0,9003,8827,13123333.333,9003,,,
+2920,"NAD83(HARN) / Texas South (ftUS)",9003,4152,15361,9802,8821,25.4,9110,8822,-98.3,9110,8823,27.5,9110,8824,26.1,9110,8826,984250.0,9003,8827,16404166.667,9003,,,
+2921,"NAD83(HARN) / Utah North (ft)",9002,4152,15362,9802,8821,40.2,9110,8822,-111.3,9110,8823,41.47,9110,8824,40.43,9110,8826,1640419.948,9002,8827,3280839.895,9002,,,
+2922,"NAD83(HARN) / Utah Central (ft)",9002,4152,15363,9802,8821,38.2,9110,8822,-111.3,9110,8823,40.39,9110,8824,39.01,9110,8826,1640419.948,9002,8827,6561679.79,9002,,,
+2923,"NAD83(HARN) / Utah South (ft)",9002,4152,15364,9802,8821,36.4,9110,8822,-111.3,9110,8823,38.21,9110,8824,37.13,9110,8826,1640419.948,9002,8827,9842519.685,9002,,,
+2924,"NAD83(HARN) / Virginia North (ftUS)",9003,4152,15365,9802,8821,37.4,9110,8822,-78.3,9110,8823,39.12,9110,8824,38.02,9110,8826,11482916.667,9003,8827,6561666.667,9003,,,
+2925,"NAD83(HARN) / Virginia South (ftUS)",9003,4152,15366,9802,8821,36.2,9110,8822,-78.3,9110,8823,37.58,9110,8824,36.46,9110,8826,11482916.667,9003,8827,3280833.333,9003,,,
+2926,"NAD83(HARN) / Washington North (ftUS)",9003,4152,15367,9802,8821,47.0,9110,8822,-120.5,9110,8823,48.44,9110,8824,47.3,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2927,"NAD83(HARN) / Washington South (ftUS)",9003,4152,15368,9802,8821,45.2,9110,8822,-120.3,9110,8823,47.2,9110,8824,45.5,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2928,"NAD83(HARN) / Wisconsin North (ftUS)",9003,4152,15369,9802,8821,45.1,9110,8822,-90.0,9110,8823,46.46,9110,8824,45.34,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2929,"NAD83(HARN) / Wisconsin Central (ftUS)",9003,4152,15370,9802,8821,43.5,9110,8822,-90.0,9110,8823,45.3,9110,8824,44.15,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2930,"NAD83(HARN) / Wisconsin South (ftUS)",9003,4152,15371,9802,8821,42.0,9110,8822,-90.0,9110,8823,44.04,9110,8824,42.44,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2931,"Beduaram / TM 13 NE",9003,4213,16413,9807,8801,0.0,9102,8802,13.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2932,"QND95 / Qatar National Grid",9001,4614,19919,9807,8801,24.27,9110,8802,51.13,9110,8805,0.99999,9201,8806,200000.0,9001,8807,300000.0,9001,,,,,,
+2933,"Segara / UTM zone 50S",9001,4613,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2934,"Segara (Jakarta) / NEIEZ",9001,4820,19905,9804,8801,0.0,9102,8802,110.0,9102,8805,0.997,9201,8806,3900000.0,9001,8807,900000.0,9001,,,,,,
+2935,"Pulkovo 1942 / CS63 zone A1",9001,4284,18441,9807,8801,0.07,9110,8802,41.32,9110,8805,1.0,9003,8806,1300000.0,9001,8807,0.0,9001,,,,,,
+2936,"Pulkovo 1942 / CS63 zone A2",9001,4284,18442,9807,8801,0.07,9110,8802,44.32,9110,8805,1.0,9003,8806,2300000.0,9001,8807,0.0,9001,,,,,,
+2937,"Pulkovo 1942 / CS63 zone A3",9001,4284,18443,9807,8801,0.07,9110,8802,47.32,9110,8805,1.0,9201,8806,3300000.0,9001,8807,0.0,9001,,,,,,
+2938,"Pulkovo 1942 / CS63 zone A4",9001,4284,18444,9807,8801,0.07,9110,8802,50.32,9110,8805,1.0,9201,8806,4300000.0,9001,8807,0.0,9001,,,,,,
+2939,"Pulkovo 1942 / CS63 zone K2",9001,4284,18446,9807,8801,0.08,9110,8802,50.46,9110,8805,1.0,9201,8806,2300000.0,9001,8807,0.0,9001,,,,,,
+2940,"Pulkovo 1942 / CS63 zone K3",9001,4284,18447,9807,8801,0.08,9110,8802,53.46,9110,8805,1.0,9201,8806,3300000.0,9001,8807,0.0,9001,,,,,,
+2941,"Pulkovo 1942 / CS63 zone K4",9001,4284,18448,9807,8801,0.08,9110,8802,56.46,9110,8805,1.0,9201,8806,4300000.0,9001,8807,0.0,9001,,,,,,
+2942,"Porto Santo / UTM zone 28N",9001,4615,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2943,"Selvagem Grande / UTM zone 28N",9001,4616,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2944,"NAD83(CSRS) / SCoPQ zone 2",9001,4617,17700,9807,8801,0.0,9110,8802,-55.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2945,"NAD83(CSRS) / MTM zone 3",9001,4617,17703,9807,8801,0.0,9110,8802,-58.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2946,"NAD83(CSRS) / MTM zone 4",9001,4617,17704,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2947,"NAD83(CSRS) / MTM zone 5",9001,4617,17705,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2948,"NAD83(CSRS) / MTM zone 6",9001,4617,17706,9807,8801,0.0,9110,8802,-67.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2949,"NAD83(CSRS) / MTM zone 7",9001,4617,17707,9807,8801,0.0,9110,8802,-70.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2950,"NAD83(CSRS) / MTM zone 8",9001,4617,17708,9807,8801,0.0,9110,8802,-73.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2951,"NAD83(CSRS) / MTM zone 9",9001,4617,17709,9807,8801,0.0,9110,8802,-76.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2952,"NAD83(CSRS) / MTM zone 10",9001,4617,17710,9807,8801,0.0,9110,8802,-79.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2953,"NAD83(CSRS) / New Brunswick Stereo",9001,4617,19946,9809,8801,46.3,9110,8802,-66.3,9110,8805,0.999912,9201,8806,2500000.0,9001,8807,7500000.0,9001,,,,,,
+2954,"NAD83(CSRS) / Prince Edward Isl. Stereographic (NAD83)",9001,4617,19960,9809,8801,47.15,9110,8802,-63.0,9110,8805,0.999912,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2955,"NAD83(CSRS) / UTM zone 11N",9001,4617,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2956,"NAD83(CSRS) / UTM zone 12N",9001,4617,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2957,"NAD83(CSRS) / UTM zone 13N",9001,4617,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2958,"NAD83(CSRS) / UTM zone 17N",9001,4617,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2959,"NAD83(CSRS) / UTM zone 18N",9001,4617,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2960,"NAD83(CSRS) / UTM zone 19N",9001,4617,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2961,"NAD83(CSRS) / UTM zone 20N",9001,4617,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2962,"NAD83(CSRS) / UTM zone 21N",9001,4617,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2963,"Lisbon 1890 (Lisbon) / Portugal Bonne",9001,4904,19979,9828,8801,39.4,9110,8802,1.0,9110,8806,0.0,9001,8807,0.0,9001,,,,,,,,,
+3036,"Moznet / UTM zone 36S",9001,4130,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+3037,"Moznet / UTM zone 37S",9001,4130,16137,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+3148,"Indian 1960 / UTM zone 48N",9001,4131,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+3149,"Indian 1960 / UTM zone 49N",9001,4131,16049,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+3176,"Indian 1960 / TM 106 NE",9001,4131,16506,9807,8801,0.0,9102,8802,106.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+3200,"FD58 / Iraq zone",9001,4132,19906,9801,8801,32.3,9110,8802,45.0,9110,8805,0.9987864078,9201,8806,1500000.0,9001,8807,1166200.0,9001,,,,,,
+3300,Estonian Coordinate System of 1992,9001,4133,19938,9802,8821,57.310319415,9110,8822,24.0,9110,8823,59.2,9110,8824,58.0,9110,8826,500000.0,9001,8827,6375000.0,9001,,,
+3301,Estonian Coordinate System of 1997,9001,4180,19938,9802,8821,57.310319415,9110,8822,24.0,9110,8823,59.2,9110,8824,58.0,9110,8826,500000.0,9001,8827,6375000.0,9001,,,
+3439,"PSD93 / UTM zone 39N",9001,4134,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+3440,"PSD93 / UTM zone 40N",9001,4134,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+3561,"Old Hawaiian / Hawaii zone 1",9003,4135,15101,9807,8801,18.5,9110,8802,-155.3,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+3562,"Old Hawaiian / Hawaii zone 2",9003,4135,15102,9807,8801,20.2,9110,8802,-156.4,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+3563,"Old Hawaiian / Hawaii zone 3",9003,4135,15103,9807,8801,21.1,9110,8802,-158.0,9110,8805,0.99999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+3564,"Old Hawaiian / Hawaii zone 4",9003,4135,15104,9807,8801,21.5,9110,8802,-159.3,9110,8805,0.99999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+3565,"Old Hawaiian / Hawaii zone 5",9003,4135,15105,9807,8801,21.4,9110,8802,-160.1,9110,8805,1.0,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+3920,"Puerto Rico / UTM zone 20N",9001,4139,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+3991,Puerto Rico State Plane CS of 1927,9003,4139,15201,9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,500000.0,9003,8827,0.0,9003,,,
+3992,"Puerto Rico / St. Croix",9003,4139,15202,9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,500000.0,9003,8827,100000.0,9003,,,
+20004,"Pulkovo 1995 / Gauss-Kruger zone 4",9001,4200,16204,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+20005,"Pulkovo 1995 / Gauss-Kruger zone 5",9001,4200,16205,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+20006,"Pulkovo 1995 / Gauss-Kruger zone 6",9001,4200,16206,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+20007,"Pulkovo 1995 / Gauss-Kruger zone 7",9001,4200,16207,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+20008,"Pulkovo 1995 / Gauss-Kruger zone 8",9001,4200,16208,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+20009,"Pulkovo 1995 / Gauss-Kruger zone 9",9001,4200,16209,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+20010,"Pulkovo 1995 / Gauss-Kruger zone 10",9001,4200,16210,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+20011,"Pulkovo 1995 / Gauss-Kruger zone 11",9001,4200,16211,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+20012,"Pulkovo 1995 / Gauss-Kruger zone 12",9001,4200,16212,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+20013,"Pulkovo 1995 / Gauss-Kruger zone 13",9001,4200,16213,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+20014,"Pulkovo 1995 / Gauss-Kruger zone 14",9001,4200,16214,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+20015,"Pulkovo 1995 / Gauss-Kruger zone 15",9001,4200,16215,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+20016,"Pulkovo 1995 / Gauss-Kruger zone 16",9001,4200,16216,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+20017,"Pulkovo 1995 / Gauss-Kruger zone 17",9001,4200,16217,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+20018,"Pulkovo 1995 / Gauss-Kruger zone 18",9001,4200,16218,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+20019,"Pulkovo 1995 / Gauss-Kruger zone 19",9001,4200,16219,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+20020,"Pulkovo 1995 / Gauss-Kruger zone 20",9001,4200,16220,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+20021,"Pulkovo 1995 / Gauss-Kruger zone 21",9001,4200,16221,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+20022,"Pulkovo 1995 / Gauss-Kruger zone 22",9001,4200,16222,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+20023,"Pulkovo 1995 / Gauss-Kruger zone 23",9001,4200,16223,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+20024,"Pulkovo 1995 / Gauss-Kruger zone 24",9001,4200,16224,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,24500000.0,9001,8807,0.0,9001,,,,,,
+20025,"Pulkovo 1995 / Gauss-Kruger zone 25",9001,4200,16225,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+20026,"Pulkovo 1995 / Gauss-Kruger zone 26",9001,4200,16226,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+20027,"Pulkovo 1995 / Gauss-Kruger zone 27",9001,4200,16227,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+20028,"Pulkovo 1995 / Gauss-Kruger zone 28",9001,4200,16228,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+20029,"Pulkovo 1995 / Gauss-Kruger zone 29",9001,4200,16229,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+20030,"Pulkovo 1995 / Gauss-Kruger zone 30",9001,4200,16230,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+20031,"Pulkovo 1995 / Gauss-Kruger zone 31",9001,4200,16231,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+20032,"Pulkovo 1995 / Gauss-Kruger zone 32",9001,4200,16232,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+20064,"Pulkovo 1995 / Gauss-Kruger 4N",9001,4200,16304,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20065,"Pulkovo 1995 / Gauss-Kruger 5N",9001,4200,16305,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20066,"Pulkovo 1995 / Gauss-Kruger 6N",9001,4200,16306,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20067,"Pulkovo 1995 / Gauss-Kruger 7N",9001,4200,16307,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20068,"Pulkovo 1995 / Gauss-Kruger 8N",9001,4200,16308,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20069,"Pulkovo 1995 / Gauss-Kruger 9N",9001,4200,16309,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20070,"Pulkovo 1995 / Gauss-Kruger 10N",9001,4200,16310,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20071,"Pulkovo 1995 / Gauss-Kruger 11N",9001,4200,16311,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20072,"Pulkovo 1995 / Gauss-Kruger 12N",9001,4200,16312,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20073,"Pulkovo 1995 / Gauss-Kruger 13N",9001,4200,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20074,"Pulkovo 1995 / Gauss-Kruger 14N",9001,4200,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20075,"Pulkovo 1995 / Gauss-Kruger 15N",9001,4200,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20076,"Pulkovo 1995 / Gauss-Kruger 16N",9001,4200,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20077,"Pulkovo 1995 / Gauss-Kruger 17N",9001,4200,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20078,"Pulkovo 1995 / Gauss-Kruger 18N",9001,4200,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20079,"Pulkovo 1995 / Gauss-Kruger 19N",9001,4200,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20080,"Pulkovo 1995 / Gauss-Kruger 20N",9001,4200,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20081,"Pulkovo 1995 / Gauss-Kruger 21N",9001,4200,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20082,"Pulkovo 1995 / Gauss-Kruger 22N",9001,4200,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20083,"Pulkovo 1995 / Gauss-Kruger 23N",9001,4200,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20084,"Pulkovo 1995 / Gauss-Kruger 24N",9001,4200,16324,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20085,"Pulkovo 1995 / Gauss-Kruger 25N",9001,4200,16325,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20086,"Pulkovo 1995 / Gauss-Kruger 26N",9001,4200,16326,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20087,"Pulkovo 1995 / Gauss-Kruger 27N",9001,4200,16327,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20088,"Pulkovo 1995 / Gauss-Kruger 28N",9001,4200,16328,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20089,"Pulkovo 1995 / Gauss-Kruger 29N",9001,4200,16329,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20090,"Pulkovo 1995 / Gauss-Kruger 30N",9001,4200,16330,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20091,"Pulkovo 1995 / Gauss-Kruger 31N",9001,4200,16331,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20092,"Pulkovo 1995 / Gauss-Kruger 32N",9001,4200,16332,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20137,"Adindan / UTM zone 37N",9001,4201,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20138,"Adindan / UTM zone 38N",9001,4201,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20248,"AGD66 / AMG zone 48",9001,4202,17448,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20249,"AGD66 / AMG zone 49",9001,4202,17449,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20250,"AGD66 / AMG zone 50",9001,4202,17450,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20251,"AGD66 / AMG zone 51",9001,4202,17451,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20252,"AGD66 / AMG zone 52",9001,4202,17452,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20253,"AGD66 / AMG zone 53",9001,4202,17453,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20254,"AGD66 / AMG zone 54",9001,4202,17454,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20255,"AGD66 / AMG zone 55",9001,4202,17455,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20256,"AGD66 / AMG zone 56",9001,4202,17456,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20257,"AGD66 / AMG zone 57",9001,4202,17457,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20258,"AGD66 / AMG zone 58",9001,4202,17458,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20348,"AGD84 / AMG zone 48",9001,4203,17448,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20349,"AGD84 / AMG zone 49",9001,4203,17449,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20350,"AGD84 / AMG zone 50",9001,4203,17450,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20351,"AGD84 / AMG zone 51",9001,4203,17451,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20352,"AGD84 / AMG zone 52",9001,4203,17452,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20353,"AGD84 / AMG zone 53",9001,4203,17453,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20354,"AGD84 / AMG zone 54",9001,4203,17454,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20355,"AGD84 / AMG zone 55",9001,4203,17455,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20356,"AGD84 / AMG zone 56",9001,4203,17456,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20357,"AGD84 / AMG zone 57",9001,4203,17457,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20358,"AGD84 / AMG zone 58",9001,4203,17458,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20437,"Ain el Abd / UTM zone 37N",9001,4204,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20438,"Ain el Abd / UTM zone 38N",9001,4204,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20439,"Ain el Abd / UTM zone 39N",9001,4204,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20499,"Ain el Abd / Bahrain Grid",9001,4204,19900,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20538,"Afgooye / UTM zone 38N",9001,4205,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20539,"Afgooye / UTM zone 39N",9001,4205,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20790,"Lisbon (Lisbon)/Portuguese National Grid",9001,4803,19936,9807,8801,39.4,9110,8802,1.0,9110,8805,1.0,9201,8806,200000.0,9001,8807,300000.0,9001,,,,,,
+20791,"Lisbon (Lisbon)/Portuguese Grid",9001,4803,19969,9807,8801,39.4,9110,8802,1.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+20822,"Aratu / UTM zone 22S",9001,4208,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20823,"Aratu / UTM zone 23S",9001,4208,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20824,"Aratu / UTM zone 24S",9001,4208,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20934,"Arc 1950 / UTM zone 34S",9001,4209,16134,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20935,"Arc 1950 / UTM zone 35S",9001,4209,16135,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20936,"Arc 1950 / UTM zone 36S",9001,4209,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21035,"Arc 1960 / UTM zone 35S",9001,4210,16135,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21036,"Arc 1960 / UTM zone 36S",9001,4210,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21037,"Arc 1960 / UTM zone 37S",9001,4210,16137,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21095,"Arc 1960 / UTM zone 35N",9001,4210,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21096,"Arc 1960 / UTM zone 36N",9001,4210,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21097,"Arc 1960 / UTM zone 37N",9001,4210,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21100,"Batavia (Jakarta) / NEIEZ",9001,4813,19905,9804,8801,0.0,9102,8802,110.0,9102,8805,0.997,9201,8806,3900000.0,9001,8807,900000.0,9001,,,,,,
+21148,"Batavia / UTM zone 48S",9001,4211,16148,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21149,"Batavia / UTM zone 49S",9001,4211,16149,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21150,"Batavia / UTM zone 50S",9001,4211,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21291,"Barbados 1938 / British West Indies Grid",9001,4212,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+21292,"Barbados 1938 / Barbados National Grid",9001,4212,19943,9807,8801,13.1035,9110,8802,-59.3335,9110,8805,0.9999986,9201,8806,30000.0,9001,8807,75000.0,9001,,,,,,
+21413,"Beijing 1954 / Gauss-Kruger zone 13",9001,4214,16213,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+21414,"Beijing 1954 / Gauss-Kruger zone 14",9001,4214,16214,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+21415,"Beijing 1954 / Gauss-Kruger zone 15",9001,4214,16215,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+21416,"Beijing 1954 / Gauss-Kruger zone 16",9001,4214,16216,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+21417,"Beijing 1954 / Gauss-Kruger zone 17",9001,4214,16217,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+21418,"Beijing 1954 / Gauss-Kruger zone 18",9001,4214,16218,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+21419,"Beijing 1954 / Gauss-Kruger zone 19",9001,4214,16219,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+21420,"Beijing 1954 / Gauss-Kruger zone 20",9001,4214,16220,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+21421,"Beijing 1954 / Gauss-Kruger zone 21",9001,4214,16221,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+21422,"Beijing 1954 / Gauss-Kruger zone 22",9001,4214,16222,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+21423,"Beijing 1954 / Gauss-Kruger zone 23",9001,4214,16223,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+21453,"Beijing 1954 / Gauss-Kruger CM 75E",9001,4214,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21454,"Beijing 1954 / Gauss-Kruger CM 81E",9001,4214,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21455,"Beijing 1954 / Gauss-Kruger CM 87E",9001,4214,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21456,"Beijing 1954 / Gauss-Kruger CM 93E",9001,4214,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21457,"Beijing 1954 / Gauss-Kruger CM 99E",9001,4214,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21458,"Beijing 1954 / Gauss-Kruger CM 105E",9001,4214,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21459,"Beijing 1954 / Gauss-Kruger CM 111E",9001,4214,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21460,"Beijing 1954 / Gauss-Kruger CM 117E",9001,4214,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21461,"Beijing 1954 / Gauss-Kruger CM 123E",9001,4214,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21462,"Beijing 1954 / Gauss-Kruger CM 129E",9001,4214,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21463,"Beijing 1954 / Gauss-Kruger CM 135E",9001,4214,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21473,"Beijing 1954 / Gauss-Kruger 13N",9001,4214,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21474,"Beijing 1954 / Gauss-Kruger 14N",9001,4214,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21475,"Beijing 1954 / Gauss-Kruger 15N",9001,4214,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21476,"Beijing 1954 / Gauss-Kruger 16N",9001,4214,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21477,"Beijing 1954 / Gauss-Kruger 17N",9001,4214,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21478,"Beijing 1954 / Gauss-Kruger 18N",9001,4214,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21479,"Beijing 1954 / Gauss-Kruger 19N",9001,4214,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21480,"Beijing 1954 / Gauss-Kruger 20N",9001,4214,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21481,"Beijing 1954 / Gauss-Kruger 21N",9001,4214,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21482,"Beijing 1954 / Gauss-Kruger 22N",9001,4214,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21483,"Beijing 1954 / Gauss-Kruger 23N",9001,4214,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21500,"Belge 1950 (Brussels) / Belge Lambert 50",9001,4809,19901,9802,8821,90.0,9110,8822,0.0,9110,8823,49.5,9110,8824,51.1,9110,8826,150000.0,9001,8827,5400000.0,9001,,,
+21780,"Bern 1898 (Bern) / LV03C",9001,4801,19923,9815,8811,46.570866,9110,8812,0.0,9110,8813,90.0,9110,8814,90.0,9110,8815,1.0,9201,8816,0.0,9001,8817,0.0,9001
+21781,"CH1903 / LV03",9001,4149,19922,9815,8811,46.570866,9110,8812,7.26225,9110,8813,90.0,9110,8814,90.0,9110,8815,1.0,9201,8816,600000.0,9001,8817,200000.0,9001
+21817,"Bogota 1975 / UTM zone 17N",9001,4218,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21818,"Bogota 1975 / UTM zone 18N",9001,4218,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21891,"Bogota 1975 / Colombia West zone",9001,4218,18051,9807,8801,4.355657,9110,8802,-77.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+21892,"Bogota 1975 / Colombia Bogota zone",9001,4218,18052,9807,8801,4.355657,9110,8802,-74.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+21893,"Bogota 1975 / Colombia East Central zone",9001,4218,18053,9807,8801,4.355657,9110,8802,-71.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+21894,"Bogota 1975 / Colombia East",9001,4218,18054,9807,8801,4.355657,9110,8802,-68.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+22032,"Camacupa / UTM zone 32S",9001,4220,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22033,"Camacupa / UTM zone 33S",9001,4220,16133,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22091,"Camacupa / TM 11.30 SE",9001,4220,16611,9807,8801,0.0,9110,8802,11.3,9110,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22092,"Camacupa / TM 12 SE",9001,4220,16612,9807,8801,0.0,9102,8802,12.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22191,"Campo Inchauspe / Argentina 1",9001,4221,18031,9807,8801,-90.0,9102,8802,-72.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+22192,"Campo Inchauspe / Argentina 2",9001,4221,18032,9807,8801,-90.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+22193,"Campo Inchauspe / Argentina 3",9001,4221,18033,9807,8801,-90.0,9102,8802,-66.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+22194,"Campo Inchauspe / Argentina 4",9001,4221,18034,9807,8801,-90.0,9102,8802,-63.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+22195,"Campo Inchauspe / Argentina 5",9001,4221,18035,9807,8801,-90.0,9102,8802,-60.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+22196,"Campo Inchauspe / Argentina 6",9001,4221,18036,9807,8801,-90.0,9102,8802,-57.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+22197,"Campo Inchauspe / Argentina 7",9001,4221,18037,9807,8801,-90.0,9102,8802,-54.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+22234,"Cape / UTM zone 34S",9001,4222,16134,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22235,"Cape / UTM zone 35S",9001,4222,16135,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22236,"Cape / UTM zone 36S",9001,4222,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22275,South African Coordinate System zone 15,9001,4222,17515,9808,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22277,South African Coordinate System zone 17,9001,4222,17517,9808,8801,0.0,9102,8802,17.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22279,South African Coordinate System zone 19,9001,4222,17519,9808,8801,0.0,9102,8802,19.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22281,South African Coordinate System zone 21,9001,4222,17521,9808,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22283,South African Coordinate System zone 23,9001,4222,17523,9808,8801,0.0,9102,8802,23.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22285,South African Coordinate System zone 25,9001,4222,17525,9808,8801,0.0,9102,8802,25.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22287,South African Coordinate System zone 27,9001,4222,17527,9808,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22289,South African Coordinate System zone 29,9001,4222,17529,9808,8801,0.0,9102,8802,29.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22291,South African Coordinate System zone 31,9001,4222,17531,9808,8801,0.0,9102,8802,31.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22293,South African Coordinate System zone 33,9001,4222,17533,9808,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22300,"Carthage (Paris) / Tunisia Mining Grid",9036,4816,19937,9816,8821,38.81973,9105,8822,7.83445,9105,8826,270.0,9036,8827,582.0,9036,,,,,,,,,
+22332,"Carthage / UTM zone 32N",9001,4223,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+22391,"Carthage / Nord Tunisie",9001,4223,18181,9801,8801,40.0,9105,8802,11.0,9105,8805,0.999625544,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+22392,"Carthage / Sud Tunisie",9001,4223,18182,9801,8801,37.0,9105,8802,11.0,9105,8805,0.999625769,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+22523,"Corrego Alegre / UTM zone 23S",9001,4225,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22524,"Corrego Alegre / UTM zone 24S",9001,4225,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22700,"Deir ez Zor / Levant Zone",9001,4227,19940,9817,8801,34.39,9110,8802,37.21,9110,8805,0.9996256,9201,8806,300000.0,9001,8807,300000.0,9001,,,,,,
+22770,"Deir ez Zor / Syria Lambert",9001,4227,19948,9801,8801,34.39,9110,8802,37.21,9110,8805,0.9996256,9201,8806,300000.0,9001,8807,300000.0,9001,,,,,,
+22780,"Deir ez Zor / Levant Stereographic",9001,4227,19949,9809,8801,38.0,9105,8802,43.5,9105,8805,0.9995341,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22832,"Douala / UTM zone 32N",9001,4228,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+22991,"Egypt 1907 / Blue Belt",9001,4229,18071,9807,8801,30.0,9102,8802,35.0,9102,8805,1.0,9201,8806,300000.0,9001,8807,1100000.0,9001,,,,,,
+22992,"Egypt 1907 / Red Belt",9001,4229,18072,9807,8801,30.0,9102,8802,31.0,9102,8805,1.0,9201,8806,615000.0,9001,8807,810000.0,9001,,,,,,
+22993,"Egypt 1907 / Purple Belt",9001,4229,18073,9807,8801,30.0,9102,8802,27.0,9102,8805,1.0,9201,8806,700000.0,9001,8807,200000.0,9001,,,,,,
+22994,"Egypt 1907 / Extended Purple Belt",9001,4229,18074,9807,8801,30.0,9102,8802,27.0,9102,8805,1.0,9201,8806,700000.0,9001,8807,1200000.0,9001,,,,,,
+23028,"ED50 / UTM zone 28N",9001,4230,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23029,"ED50 / UTM zone 29N",9001,4230,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23030,"ED50 / UTM zone 30N",9001,4230,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23031,"ED50 / UTM zone 31N",9001,4230,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23032,"ED50 / UTM zone 32N",9001,4230,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23033,"ED50 / UTM zone 33N",9001,4230,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23034,"ED50 / UTM zone 34N",9001,4230,16034,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23035,"ED50 / UTM zone 35N",9001,4230,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23036,"ED50 / UTM zone 36N",9001,4230,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23037,"ED50 / UTM zone 37N",9001,4230,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23038,"ED50 / UTM zone 38N",9001,4230,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23090,"ED50 / TM 0 N",9001,4230,16400,9807,8801,0.0,9102,8802,0.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23095,"ED50 / TM 5 NE",9001,4230,16405,9807,8801,0.0,9102,8802,5.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23239,"Fahud / UTM zone 39N",9001,4232,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23240,"Fahud / UTM zone 40N",9001,4232,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23433,"Garoua / UTM zone 33N",9001,4234,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23700,"HD72 / EOV",9001,4237,19931,9815,8811,47.08398174,9110,8812,19.02548584,9110,8813,90.0,9110,8814,90.0,9110,8815,0.99993,9201,8816,650000.0,9001,8817,200000.0,9001
+23846,"ID74 / UTM zone 46N",9001,4238,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23847,"ID74 / UTM zone 47N",9001,4238,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23848,"ID74 / UTM zone 48N",9001,4238,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23849,"ID74 / UTM zone 49N",9001,4238,16049,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23850,"ID74 / UTM zone 50N",9001,4238,16050,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23851,"ID74 / UTM zone 51N",9001,4238,16051,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23852,"ID74 / UTM zone 52N",9001,4238,16052,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23853,"ID74 / UTM zone 53N",9001,4238,16053,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23886,"ID74 / UTM zone 46S",9001,4238,16146,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23887,"ID74 / UTM zone 47S",9001,4238,16147,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23888,"ID74 / UTM zone 48S",9001,4238,16148,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23889,"ID74 / UTM zone 49S",9001,4238,16149,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23890,"ID74 / UTM zone 50S",9001,4238,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23891,"ID74 / UTM zone 51S",9001,4238,16151,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23892,"ID74 / UTM zone 52S",9001,4238,16152,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23893,"ID74 / UTM zone 53S",9001,4238,16153,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23894,"ID74 / UTM zone 54S",9001,4238,16154,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23946,"Indian 1954 / UTM zone 46N",9001,4239,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23947,"Indian 1954 / UTM zone 47N",9001,4239,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23948,"Indian 1954 / UTM zone 48N",9001,4239,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24047,"Indian 1975 / UTM zone 47N",9001,4240,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24048,"Indian 1975 / UTM zone 48N",9001,4240,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24100,"Jamaica 1875 / Jamaica (Old Grid)",9005,4241,19909,9801,8801,18.0,9102,8802,-77.0,9102,8805,1.0,9201,8806,550000.0,9005,8807,400000.0,9005,,,,,,
+24200,"JAD69 / Jamaica National Grid",9001,4242,19910,9801,8801,18.0,9102,8802,-77.0,9102,8805,1.0,9201,8806,250000.0,9001,8807,150000.0,9001,,,,,,
+24305,"Kalianpur 1937 / UTM zone 45N",9001,4144,16045,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24306,"Kalianpur 1937 / UTM zone 46N",9001,4144,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24311,"Kalianpur 1962 / UTM zone 41N",9001,4145,16041,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24312,"Kalianpur 1962 / UTM zone 42N",9001,4145,16042,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24313,"Kalianpur 1962 / UTM zone 43N",9001,4145,16043,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24342,"Kalianpur 1975 / UTM zone 42N",9001,4146,16042,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24343,"Kalianpur 1975 / UTM zone 43N",9001,4146,16043,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24344,"Kalianpur 1975 / UTM zone 44N",9001,4146,16044,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24345,"Kalianpur 1975 / UTM zone 45N",9001,4146,16045,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24346,"Kalianpur 1975 / UTM zone 46N",9001,4146,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24347,"Kalianpur 1975 / UTM zone 47N",9001,4146,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24370,"Kalianpur 1880 / India zone 0",9084,4243,18110,9801,8801,39.3,9110,8802,68.0,9110,8805,0.99846154,9201,8806,2355500.0,9084,8807,2590000.0,9084,,,,,,
+24371,"Kalianpur 1880 / India zone I",9084,4243,18111,9801,8801,32.3,9110,8802,68.0,9110,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+24372,"Kalianpur 1880 / India zone IIa",9084,4243,18112,9801,8801,26.0,9102,8802,74.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+24373,"Kalianpur 1880 / India zone III",9084,4243,18114,9801,8801,19.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+24374,"Kalianpur 1880 / India zone IV",9084,4243,18116,9801,8801,12.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+24375,"Kalianpur 1937 / India zone IIb",9001,4144,18238,9801,8801,26.0,9102,8802,90.0,9102,8805,0.99878641,9201,8806,2743185.69,9001,8807,914395.23,9001,,,,,,
+24376,"Kalianpur 1962 / India zone I",9001,4145,18236,9801,8801,32.3,9110,8802,68.0,9110,8805,0.99878641,9201,8806,2743196.4,9001,8807,914398.8,9001,,,,,,
+24377,"Kalianpur 1962 / India zone IIa",9001,4145,18237,9801,8801,26.0,9102,8802,74.0,9102,8805,0.99878641,9201,8806,2743196.4,9001,8807,914398.8,9001,,,,,,
+24378,"Kalianpur 1975 / India zone I",9001,4146,18231,9801,8801,32.3,9110,8802,68.0,9110,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+24379,"Kalianpur 1975 / India zone IIa",9001,4146,18232,9801,8801,26.0,9102,8802,74.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+24380,"Kalianpur 1975 / India zone IIb",9001,4146,18235,9801,8801,26.0,9102,8802,90.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+24381,"Kalianpur 1975 / India zone III",9001,4146,18233,9801,8801,19.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+24382,"Kalianpur 1880 / India zone IIb",9084,4243,18113,9801,8801,26.0,9102,8802,90.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+24383,"Kalianpur 1975 / India zone IV",9001,4146,18234,9801,8801,12.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+24500,"Kertau / Singapore Grid",9001,4245,19920,9806,8801,1.1715528,9110,8802,103.5110808,9110,8806,30000.0,9001,8807,30000.0,9001,,,,,,,,,
+24547,"Kertau / UTM zone 47N",9001,4245,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24548,"Kertau / UTM zone 48N",9001,4245,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24571,"Kertau / R.S.O. Malaya (ch)",9062,4245,19935,9812,8806,40000.0,9062,8807,0.0,9062,8811,4.0,9110,8812,102.15,9110,8813,323.01328458,9110,8814,323.07483685,9110,8815,0.99984,9201
+24600,KOC Lambert,9001,4246,19906,9801,8801,32.3,9110,8802,45.0,9110,8805,0.9987864078,9201,8806,1500000.0,9001,8807,1166200.0,9001,,,,,,
+24718,"La Canoa / UTM zone 18N",9001,4247,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24719,"La Canoa / UTM zone 19N",9001,4247,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24720,"La Canoa / UTM zone 20N",9001,4247,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24818,"PSAD56 / UTM zone 18N",9001,4248,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24819,"PSAD56 / UTM zone 19N",9001,4248,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24820,"PSAD56 / UTM zone 20N",9001,4248,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24821,"PSAD56 / UTM zone 21N",9001,4248,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24877,"PSAD56 / UTM zone 17S",9001,4248,16117,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+24878,"PSAD56 / UTM zone 18S",9001,4248,16118,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+24879,"PSAD56 / UTM zone 19S",9001,4248,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+24880,"PSAD56 / UTM zone 20S",9001,4248,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+24882,"PSAD56 / UTM zone 22S",9001,4248,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+24891,"PSAD56 / Peru west zone",9001,4248,18161,9807,8801,-6.0,9110,8802,-80.3,9110,8805,0.99983008,9201,8806,222000.0,9001,8807,1426834.743,9001,,,,,,
+24892,"PSAD56 / Peru central zone",9001,4248,18162,9807,8801,-9.3,9110,8802,-76.0,9110,8805,0.99932994,9201,8806,720000.0,9001,8807,1039979.159,9001,,,,,,
+24893,"PSAD56 / Peru east zone",9001,4248,18163,9807,8801,-9.3,9110,8802,-70.3,9110,8805,0.99952992,9201,8806,1324000.0,9001,8807,1040084.558,9001,,,,,,
+25000,"Leigon / Ghana Metre Grid",9001,4250,19904,9807,8801,4.4,9110,8802,-1.0,9110,8805,0.99975,9201,8806,274319.51,9001,8807,0.0,9001,,,,,,
+25231,"Lome / UTM zone 31N",9001,4252,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25391,"Luzon 1911 / Philippines zone I",9001,4253,18171,9807,8801,0.0,9102,8802,117.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25392,"Luzon 1911 / Philippines zone II",9001,4253,18172,9807,8801,0.0,9102,8802,119.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25393,"Luzon 1911 / Philippines zone III",9001,4253,18173,9807,8801,0.0,9102,8802,121.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25394,"Luzon 1911 / Philippines zone IV",9001,4253,18174,9807,8801,0.0,9102,8802,123.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25395,"Luzon 1911 / Philippines zone V",9001,4253,18175,9807,8801,0.0,9102,8802,125.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25700,"Makassar (Jakarta) / NEIEZ",9001,4804,19905,9804,8801,0.0,9102,8802,110.0,9102,8805,0.997,9201,8806,3900000.0,9001,8807,900000.0,9001,,,,,,
+25828,"ETRS89 / UTM zone 28N",9001,4258,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25829,"ETRS89 / UTM zone 29N",9001,4258,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25830,"ETRS89 / UTM zone 30N",9001,4258,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25831,"ETRS89 / UTM zone 31N",9001,4258,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25832,"ETRS89 / UTM zone 32N",9001,4258,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25833,"ETRS89 / UTM zone 33N",9001,4258,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25834,"ETRS89 / UTM zone 34N",9001,4258,16034,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25835,"ETRS89 / UTM zone 35N",9001,4258,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25836,"ETRS89 / UTM zone 36N",9001,4258,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25837,"ETRS89 / UTM zone 37N",9001,4258,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25838,"ETRS89 / UTM zone 38N",9001,4258,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25884,"ETRS89 / TM Baltic93",9001,4258,19939,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25932,"Malongo 1987 / UTM zone 32S",9001,4259,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+26191,"Merchich / Nord Maroc",9001,4261,18131,9801,8801,37.0,9105,8802,-6.0,9105,8805,0.999625769,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+26192,"Merchich / Sud Maroc",9001,4261,18132,9801,8801,33.0,9105,8802,-6.0,9105,8805,0.999615596,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+26193,"Merchich / Sahara",9001,4261,18133,9801,8801,29.0,9105,8802,-6.0,9105,8805,0.9996,9201,8806,1200000.0,9001,8807,400000.0,9001,,,,,,
+26237,"Massawa / UTM zone 37N",9001,4262,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26331,"Minna / UTM zone 31N",9001,4263,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26332,"Minna / UTM zone 32N",9001,4263,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26391,"Minna / Nigeria West Belt",9001,4263,18151,9807,8801,4.0,9110,8802,4.3,9110,8805,0.99975,9201,8806,230738.26,9001,8807,0.0,9001,,,,,,
+26392,"Minna / Nigeria Mid Belt",9001,4263,18152,9807,8801,4.0,9110,8802,8.3,9110,8805,0.99975,9201,8806,670553.98,9001,8807,0.0,9001,,,,,,
+26393,"Minna / Nigeria East Belt",9001,4263,18153,9807,8801,4.0,9110,8802,12.3,9110,8805,0.99975,9201,8806,1110369.7,9001,8807,0.0,9001,,,,,,
+26432,"Mhast / UTM zone 32S",9001,4264,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+26591,"Monte Mario (Rome) / Italy zone 1",9001,4806,18121,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+26592,"Monte Mario (Rome) / Italy zone 2",9001,4806,18122,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,2520000.0,9001,8807,0.0,9001,,,,,,
+26632,"M'poraloko / UTM zone 32N",9001,4266,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26692,"M'poraloko / UTM zone 32S",9001,4266,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+26703,"NAD27 / UTM zone 3N",9001,4267,16003,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26704,"NAD27 / UTM zone 4N",9001,4267,16004,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26705,"NAD27 / UTM zone 5N",9001,4267,16005,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26706,"NAD27 / UTM zone 6N",9001,4267,16006,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26707,"NAD27 / UTM zone 7N",9001,4267,16007,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26708,"NAD27 / UTM zone 8N",9001,4267,16008,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26709,"NAD27 / UTM zone 9N",9001,4267,16009,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26710,"NAD27 / UTM zone 10N",9001,4267,16010,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26711,"NAD27 / UTM zone 11N",9001,4267,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26712,"NAD27 / UTM zone 12N",9001,4267,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26713,"NAD27 / UTM zone 13N",9001,4267,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26714,"NAD27 / UTM zone 14N",9001,4267,16014,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26715,"NAD27 / UTM zone 15N",9001,4267,16015,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26716,"NAD27 / UTM zone 16N",9001,4267,16016,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26717,"NAD27 / UTM zone 17N",9001,4267,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26718,"NAD27 / UTM zone 18N",9001,4267,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26719,"NAD27 / UTM zone 19N",9001,4267,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26720,"NAD27 / UTM zone 20N",9001,4267,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26721,"NAD27 / UTM zone 21N",9001,4267,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26722,"NAD27 / UTM zone 22N",9001,4267,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26729,"NAD27 / Alabama East",9003,4267,10101,9807,8801,30.3,9110,8802,-85.5,9110,8805,0.99996,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26730,"NAD27 / Alabama West",9003,4267,10102,9807,8801,30.0,9110,8802,-87.3,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26731,"NAD27 / Alaska zone 1",9003,4267,15001,9812,8806,16404166.67,9003,8807,-16404166.67,9003,8811,57.0,9110,8812,-133.4,9110,8813,323.07483685,9110,8814,323.07483685,9110,8815,0.9999,9201
+26732,"NAD27 / Alaska zone 2",9003,4267,15002,9807,8801,54.0,9102,8802,-142.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26733,"NAD27 / Alaska zone 3",9003,4267,15003,9807,8801,54.0,9102,8802,-146.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26734,"NAD27 / Alaska zone 4",9003,4267,15004,9807,8801,54.0,9102,8802,-150.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26735,"NAD27 / Alaska zone 5",9003,4267,15005,9807,8801,54.0,9102,8802,-154.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26736,"NAD27 / Alaska zone 6",9003,4267,15006,9807,8801,54.0,9102,8802,-158.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26737,"NAD27 / Alaska zone 7",9003,4267,15007,9807,8801,54.0,9102,8802,-162.0,9102,8805,0.9999,9201,8806,700000.0,9003,8807,0.0,9003,,,,,,
+26738,"NAD27 / Alaska zone 8",9003,4267,15008,9807,8801,54.0,9102,8802,-166.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26739,"NAD27 / Alaska zone 9",9003,4267,15009,9807,8801,54.0,9102,8802,-170.0,9102,8805,0.9999,9201,8806,600000.0,9003,8807,0.0,9003,,,,,,
+26740,"NAD27 / Alaska zone 10",9003,4267,15010,9802,8821,51.0,9110,8822,-176.0,9110,8823,53.5,9110,8824,51.5,9110,8826,3000000.0,9003,8827,0.0,9003,,,
+26741,"NAD27 / California zone I",9003,4267,10401,9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26742,"NAD27 / California zone II",9003,4267,10402,9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26743,"NAD27 / California zone III",9003,4267,10403,9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26744,"NAD27 / California zone IV",9003,4267,10404,9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26745,"NAD27 / California zone V",9003,4267,10405,9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26746,"NAD27 / California zone VI",9003,4267,10406,9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26747,"NAD27 / California zone VII",9003,4267,10407,9802,8821,34.08,9110,8822,-118.2,9110,8823,34.25,9110,8824,33.52,9110,8826,4186692.58,9003,8827,416926.74,9003,,,
+26748,"NAD27 / Arizona East",9003,4267,10201,9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26749,"NAD27 / Arizona Central",9003,4267,10202,9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26750,"NAD27 / Arizona West",9003,4267,10203,9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26751,"NAD27 / Arkansas North",9003,4267,10301,9802,8821,34.2,9110,8822,-92.0,9110,8823,36.14,9110,8824,34.56,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26752,"NAD27 / Arkansas South",9003,4267,10302,9802,8821,32.4,9110,8822,-92.0,9110,8823,34.46,9110,8824,33.18,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26753,"NAD27 / Colorado North",9003,4267,10501,9802,8821,39.2,9110,8822,-105.3,9110,8823,39.43,9110,8824,40.47,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26754,"NAD27 / Colorado Central",9003,4267,10502,9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26755,"NAD27 / Colorado South",9003,4267,10503,9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26756,"NAD27 / Connecticut",9003,4267,10600,9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,600000.0,9003,8827,0.0,9003,,,
+26757,"NAD27 / Delaware",9003,4267,10700,9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26758,"NAD27 / Florida East",9003,4267,10901,9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26759,"NAD27 / Florida West",9003,4267,10902,9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26760,"NAD27 / Florida North",9003,4267,10903,9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26766,"NAD27 / Georgia East",9003,4267,11001,9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26767,"NAD27 / Georgia West",9003,4267,11002,9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26768,"NAD27 / Idaho East",9003,4267,11101,9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26769,"NAD27 / Idaho Central",9003,4267,11102,9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26770,"NAD27 / Idaho West",9003,4267,11103,9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26771,"NAD27 / Illinois East",9003,4267,11201,9807,8801,36.4,9110,8802,-88.2,9110,8805,0.999975,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26772,"NAD27 / Illinois West",9003,4267,11202,9807,8801,36.4,9110,8802,-90.1,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26773,"NAD27 / Indiana East",9003,4267,11301,9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26774,"NAD27 / Indiana West",9003,4267,11302,9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26775,"NAD27 / Iowa North",9003,4267,11401,9802,8821,41.3,9110,8822,-93.3,9110,8823,43.16,9110,8824,42.04,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26776,"NAD27 / Iowa South",9003,4267,11402,9802,8821,40.0,9110,8822,-93.3,9110,8823,41.47,9110,8824,40.37,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26777,"NAD27 / Kansas North",9003,4267,11501,9802,8821,38.2,9110,8822,-98.0,9110,8823,39.47,9110,8824,38.43,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26778,"NAD27 / Kansas South",9003,4267,11502,9802,8821,36.4,9110,8822,-98.3,9110,8823,38.34,9110,8824,37.16,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26779,"NAD27 / Kentucky North",9003,4267,11601,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26780,"NAD27 / Kentucky South",9003,4267,11602,9802,8821,36.2,9110,8822,-85.45,9110,8823,36.44,9110,8824,37.56,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26781,"NAD27 / Louisiana North",9003,4267,11701,9802,8821,30.4,9110,8822,-92.3,9110,8823,31.1,9110,8824,32.4,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26782,"NAD27 / Louisiana South",9003,4267,11702,9802,8821,28.4,9110,8822,-91.2,9110,8823,29.18,9110,8824,30.42,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26783,"NAD27 / Maine East",9003,4267,11801,9807,8801,43.5,9110,8802,-68.3,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26784,"NAD27 / Maine West",9003,4267,11802,9807,8801,42.5,9110,8802,-70.1,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26785,"NAD27 / Maryland",9003,4267,11900,9802,8821,37.5,9110,8822,-77.0,9110,8823,38.18,9110,8824,39.27,9110,8826,800000.0,9003,8827,0.0,9003,,,
+26786,"NAD27 / Massachusetts Mainland",9003,4267,12001,9802,8821,41.0,9110,8822,-71.3,9110,8823,41.43,9110,8824,42.41,9110,8826,600000.0,9003,8827,0.0,9003,,,
+26787,"NAD27 / Massachusetts Island",9003,4267,12002,9802,8821,41.0,9110,8822,-70.3,9110,8823,41.17,9110,8824,41.29,9110,8826,200000.0,9003,8827,0.0,9003,,,
+26791,"NAD27 / Minnesota North",9003,4267,12201,9802,8821,46.3,9110,8822,-93.06,9110,8823,47.02,9110,8824,48.38,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26792,"NAD27 / Minnesota Central",9003,4267,12202,9802,8821,45.0,9110,8822,-94.15,9110,8823,45.37,9110,8824,47.03,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26793,"NAD27 / Minnesota South",9003,4267,12203,9802,8821,43.0,9110,8822,-94.0,9110,8823,43.47,9110,8824,45.13,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26794,"NAD27 / Mississippi East",9003,4267,12301,9807,8801,29.4,9110,8802,-88.5,9110,8805,0.99996,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26795,"NAD27 / Mississippi West",9003,4267,12302,9807,8801,30.3,9110,8802,-90.2,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26796,"NAD27 / Missouri East",9003,4267,12401,9807,8801,35.5,9110,8802,-90.3,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26797,"NAD27 / Missouri Central",9003,4267,12402,9807,8801,35.5,9110,8802,-92.3,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26798,"NAD27 / Missouri West",9003,4267,12403,9807,8801,36.1,9110,8802,-94.3,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26801,"NAD Michigan / Michigan East",9003,4268,12101,9807,8801,41.3,9110,8802,-83.4,9110,8805,0.999942857,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26802,"NAD Michigan / Michigan Old Central",9003,4268,12102,9807,8801,41.3,9110,8802,-85.45,9110,8805,0.999909091,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26803,"NAD Michigan / Michigan West",9003,4268,12103,9807,8801,41.3,9110,8802,-88.45,9110,8805,0.999909091,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26811,"NAD Michigan / Michigan North",9003,4268,12111,9802,8821,44.47,9110,8822,-87.0,9110,8823,45.29,9110,8824,47.05,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26812,"NAD Michigan / Michigan Central",9003,4268,12112,9802,8821,43.19,9110,8822,-84.2,9110,8823,44.11,9110,8824,45.42,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26813,"NAD Michigan / Michigan South",9003,4268,12113,9802,8821,41.3,9110,8822,-84.2,9110,8823,42.06,9110,8824,43.4,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26903,"NAD83 / UTM zone 3N",9001,4269,16003,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26904,"NAD83 / UTM zone 4N",9001,4269,16004,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26905,"NAD83 / UTM zone 5N",9001,4269,16005,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26906,"NAD83 / UTM zone 6N",9001,4269,16006,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26907,"NAD83 / UTM zone 7N",9001,4269,16007,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26908,"NAD83 / UTM zone 8N",9001,4269,16008,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26909,"NAD83 / UTM zone 9N",9001,4269,16009,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26910,"NAD83 / UTM zone 10N",9001,4269,16010,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26911,"NAD83 / UTM zone 11N",9001,4269,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26912,"NAD83 / UTM zone 12N",9001,4269,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26913,"NAD83 / UTM zone 13N",9001,4269,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26914,"NAD83 / UTM zone 14N",9001,4269,16014,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26915,"NAD83 / UTM zone 15N",9001,4269,16015,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26916,"NAD83 / UTM zone 16N",9001,4269,16016,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26917,"NAD83 / UTM zone 17N",9001,4269,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26918,"NAD83 / UTM zone 18N",9001,4269,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26919,"NAD83 / UTM zone 19N",9001,4269,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26920,"NAD83 / UTM zone 20N",9001,4269,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26921,"NAD83 / UTM zone 21N",9001,4269,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26922,"NAD83 / UTM zone 22N",9001,4269,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26923,"NAD83 / UTM zone 23N",9001,4269,16023,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26929,"NAD83 / Alabama East",9001,4269,10131,9807,8801,30.3,9110,8802,-85.5,9110,8805,0.99996,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+26930,"NAD83 / Alabama West",9001,4269,10132,9807,8801,30.0,9110,8802,-87.3,9110,8805,0.999933333,9201,8806,600000.0,9001,8807,0.0,9001,,,,,,
+26931,"NAD83 / Alaska zone 1",9001,4269,15031,9812,8806,5000000.0,9001,8807,-5000000.0,9001,8811,57.0,9110,8812,-133.4,9110,8813,323.07483685,9110,8814,323.07483685,9110,8815,0.9999,9201
+26932,"NAD83 / Alaska zone 2",9001,4269,15032,9807,8801,54.0,9102,8802,-142.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26933,"NAD83 / Alaska zone 3",9001,4269,15033,9807,8801,54.0,9102,8802,-146.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26934,"NAD83 / Alaska zone 4",9001,4269,15034,9807,8801,54.0,9102,8802,-150.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26935,"NAD83 / Alaska zone 5",9001,4269,15035,9807,8801,54.0,9102,8802,-154.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26936,"NAD83 / Alaska zone 6",9001,4269,15036,9807,8801,54.0,9102,8802,-158.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26937,"NAD83 / Alaska zone 7",9001,4269,15037,9807,8801,54.0,9102,8802,-162.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26938,"NAD83 / Alaska zone 8",9001,4269,15038,9807,8801,54.0,9102,8802,-166.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26939,"NAD83 / Alaska zone 9",9001,4269,15039,9807,8801,54.0,9102,8802,-170.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26940,"NAD83 / Alaska zone 10",9001,4269,15040,9802,8821,51.0,9110,8822,-176.0,9110,8823,53.5,9110,8824,51.5,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+26941,"NAD83 / California zone 1",9001,4269,10431,9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+26942,"NAD83 / California zone 2",9001,4269,10432,9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+26943,"NAD83 / California zone 3",9001,4269,10433,9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+26944,"NAD83 / California zone 4",9001,4269,10434,9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+26945,"NAD83 / California zone 5",9001,4269,10435,9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+26946,"NAD83 / California zone 6",9001,4269,10436,9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+26948,"NAD83 / Arizona East",9001,4269,10231,9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+26949,"NAD83 / Arizona Central",9001,4269,10232,9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+26950,"NAD83 / Arizona West",9001,4269,10233,9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+26951,"NAD83 / Arkansas North",9001,4269,10331,9802,8821,34.2,9110,8822,-92.0,9110,8823,36.14,9110,8824,34.56,9110,8826,400000.0,9001,8827,0.0,9001,,,
+26952,"NAD83 / Arkansas South",9001,4269,10332,9802,8821,32.4,9110,8822,-92.0,9110,8823,34.46,9110,8824,33.18,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+26953,"NAD83 / Colorado North",9001,4269,10531,9802,8821,39.2,9110,8822,-105.3,9110,8823,40.47,9110,8824,39.43,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+26954,"NAD83 / Colorado Central",9001,4269,10532,9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+26955,"NAD83 / Colorado South",9001,4269,10533,9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+26956,"NAD83 / Connecticut",9001,4269,10630,9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,304800.6096,9001,8827,152400.3048,9001,,,
+26957,"NAD83 / Delaware",9001,4269,10730,9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+26958,"NAD83 / Florida East",9001,4269,10931,9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+26959,"NAD83 / Florida West",9001,4269,10932,9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+26960,"NAD83 / Florida North",9001,4269,10933,9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,600000.0,9001,8827,0.0,9001,,,
+26961,"NAD83 / Hawaii zone 1",9001,4269,15131,9807,8801,18.5,9110,8802,-155.3,9110,8805,0.999966667,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26962,"NAD83 / Hawaii zone 2",9001,4269,15132,9807,8801,20.2,9110,8802,-156.4,9110,8805,0.999966667,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26963,"NAD83 / Hawaii zone 3",9001,4269,15133,9807,8801,21.1,9110,8802,-158.0,9110,8805,0.99999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26964,"NAD83 / Hawaii zone 4",9001,4269,15134,9807,8801,21.5,9110,8802,-159.3,9110,8805,0.99999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26965,"NAD83 / Hawaii zone 5",9001,4269,15135,9807,8801,21.4,9110,8802,-160.1,9110,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26966,"NAD83 / Georgia East",9001,4269,11031,9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+26967,"NAD83 / Georgia West",9001,4269,11032,9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+26968,"NAD83 / Idaho East",9001,4269,11131,9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+26969,"NAD83 / Idaho Central",9001,4269,11132,9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26970,"NAD83 / Idaho West",9001,4269,11133,9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,800000.0,9001,8807,0.0,9001,,,,,,
+26971,"NAD83 / Illinois East",9001,4269,11231,9807,8801,36.4,9110,8802,-88.2,9110,8805,0.999975,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+26972,"NAD83 / Illinois West",9001,4269,11232,9807,8801,36.4,9110,8802,-90.1,9110,8805,0.999941177,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+26973,"NAD83 / Indiana East",9001,4269,11331,9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,100000.0,9001,8807,250000.0,9001,,,,,,
+26974,"NAD83 / Indiana West",9001,4269,11332,9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,900000.0,9001,8807,250000.0,9001,,,,,,
+26975,"NAD83 / Iowa North",9001,4269,11431,9802,8821,41.3,9110,8822,-93.3,9110,8823,43.16,9110,8824,42.04,9110,8826,1500000.0,9001,8827,1000000.0,9001,,,
+26976,"NAD83 / Iowa South",9001,4269,11432,9802,8821,40.0,9110,8822,-93.3,9110,8823,41.47,9110,8824,40.37,9110,8826,500000.0,9001,8827,0.0,9001,,,
+26977,"NAD83 / Kansas North",9001,4269,11531,9802,8821,38.2,9110,8822,-98.0,9110,8823,39.47,9110,8824,38.43,9110,8826,400000.0,9001,8827,0.0,9001,,,
+26978,"NAD83 / Kansas South",9001,4269,11532,9802,8821,36.4,9110,8822,-98.3,9110,8823,38.34,9110,8824,37.16,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+26979,"NAD83 / Kentucky North",9001,4269,11631,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,37.58,9110,8826,500000.0,9001,8827,0.0,9001,,,
+26980,"NAD83 / Kentucky South",9001,4269,11632,9802,8821,36.2,9110,8822,-85.45,9110,8823,37.56,9110,8824,36.44,9110,8826,500000.0,9001,8827,500000.0,9001,,,
+26981,"NAD83 / Louisiana North",9001,4269,11731,9802,8821,30.3,9110,8822,-92.3,9110,8823,32.4,9110,8824,31.1,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+26982,"NAD83 / Louisiana South",9001,4269,11732,9802,8821,28.3,9110,8822,-91.2,9110,8823,30.42,9110,8824,29.18,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+26983,"NAD83 / Maine East",9001,4269,11831,9807,8801,43.4,9110,8802,-68.3,9110,8805,0.9999,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+26984,"NAD83 / Maine West",9001,4269,11832,9807,8801,42.5,9110,8802,-70.1,9110,8805,0.999966667,9201,8806,900000.0,9001,8807,0.0,9001,,,,,,
+26985,"NAD83 / Maryland",9001,4269,11930,9802,8821,37.4,9110,8822,-77.0,9110,8823,39.27,9110,8824,38.18,9110,8826,400000.0,9001,8827,0.0,9001,,,
+26986,"NAD83 / Massachusetts Mainland",9001,4269,12031,9802,8821,41.0,9110,8822,-71.3,9110,8823,42.41,9110,8824,41.43,9110,8826,200000.0,9001,8827,750000.0,9001,,,
+26987,"NAD83 / Massachusetts Island",9001,4269,12032,9802,8821,41.0,9110,8822,-70.3,9110,8823,41.29,9110,8824,41.17,9110,8826,500000.0,9001,8827,0.0,9001,,,
+26988,"NAD83 / Michigan North",9001,4269,12141,9802,8821,44.47,9110,8822,-87.0,9110,8823,47.05,9110,8824,45.29,9110,8826,8000000.0,9001,8827,0.0,9001,,,
+26989,"NAD83 / Michigan Central",9001,4269,12142,9802,8821,43.19,9110,8822,-84.22,9110,8823,45.42,9110,8824,44.11,9110,8826,6000000.0,9001,8827,0.0,9001,,,
+26990,"NAD83 / Michigan South",9001,4269,12143,9802,8821,41.3,9110,8822,-84.22,9110,8823,43.4,9110,8824,42.06,9110,8826,4000000.0,9001,8827,0.0,9001,,,
+26991,"NAD83 / Minnesota North",9001,4269,12231,9802,8821,46.3,9110,8822,-93.06,9110,8823,48.38,9110,8824,47.02,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+26992,"NAD83 / Minnesota Central",9001,4269,12232,9802,8821,45.0,9110,8822,-94.15,9110,8823,47.03,9110,8824,45.37,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+26993,"NAD83 / Minnesota South",9001,4269,12233,9802,8821,43.0,9110,8822,-94.0,9110,8823,45.13,9110,8824,43.47,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+26994,"NAD83 / Mississippi East",9001,4269,12331,9807,8801,29.3,9110,8802,-88.5,9110,8805,0.99995,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+26995,"NAD83 / Mississippi West",9001,4269,12332,9807,8801,29.3,9110,8802,-90.2,9110,8805,0.99995,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+26996,"NAD83 / Missouri East",9001,4269,12431,9807,8801,35.5,9110,8802,-90.3,9110,8805,0.999933333,9201,8806,250000.0,9001,8807,0.0,9001,,,,,,
+26997,"NAD83 / Missouri Central",9001,4269,12432,9807,8801,35.5,9110,8802,-92.3,9110,8805,0.999933333,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26998,"NAD83 / Missouri West",9001,4269,12433,9807,8801,36.1,9110,8802,-94.3,9110,8805,0.999941177,9201,8806,850000.0,9001,8807,0.0,9001,,,,,,
+27038,"Nahrwan 1967 / UTM zone 38N",9001,4270,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+27039,"Nahrwan 1967 / UTM zone 39N",9001,4270,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+27040,"Nahrwan 1967 / UTM zone 40N",9001,4270,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+27120,"Naparima 1972 / UTM zone 20N",9001,4271,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+27200,"NZGD49 / New Zealand Map Grid",9001,4272,19917,9811,8801,-41.0,9102,8802,173.0,9102,8806,2510000.0,9001,8807,6023150.0,9001,,,,,,,,,
+27205,"NZGD49 / Mount Eden Circuit",9001,4272,17901,9807,8801,-36.5247515,9110,8802,174.45516217,9110,8805,0.9999,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27206,"NZGD49 / Bay of Plenty Circuit",9001,4272,17902,9807,8801,-37.45404993,9110,8802,176.27583101,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27207,"NZGD49 / Poverty Bay Circuit",9001,4272,17903,9807,8801,-38.372893,9110,8802,177.53082906,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27208,"NZGD49 / Hawkes Bay Circuit",9001,4272,17904,9807,8801,-39.39033455,9110,8802,176.40252499,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27209,"NZGD49 / Taranaki Circuit",9001,4272,17905,9807,8801,-39.08087299,9110,8802,174.13408423,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27210,"NZGD49 / Tuhirangi Circuit",9001,4272,17906,9807,8801,-39.30448934,9110,8802,175.38241325,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27211,"NZGD49 / Wanganui Circuit",9001,4272,17907,9807,8801,-40.14310097,9110,8802,175.29171586,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27212,"NZGD49 / Wairarapa Circuit",9001,4272,17908,9807,8801,-40.55319175,9110,8802,175.38504588,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27213,"NZGD49 / Wellington Circuit",9001,4272,17909,9807,8801,-41.18047507,9110,8802,174.46358432,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27214,"NZGD49 / Collingwood Circuit",9001,4272,17910,9807,8801,-40.42531326,9110,8802,172.40193674,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27215,"NZGD49 / Nelson Circuit",9001,4272,17911,9807,8801,-41.1628361,9110,8802,173.17575405,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27216,"NZGD49 / Karamea Circuit",9001,4272,17912,9807,8801,-41.17236815,9110,8802,172.06325015,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27217,"NZGD49 / Buller Circuit",9001,4272,17913,9807,8801,-41.48388903,9110,8802,171.34525362,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27218,"NZGD49 / Grey Circuit",9001,4272,17914,9807,8801,-42.20012994,9110,8802,171.32591767,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27219,"NZGD49 / Amuri Circuit",9001,4272,17915,9807,8801,-42.41208197,9110,8802,173.00364802,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27220,"NZGD49 / Marlborough Circuit",9001,4272,17916,9807,8801,-41.3240152,9110,8802,173.48074668,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27221,"NZGD49 / Hokitika Circuit",9001,4272,17917,9807,8801,-42.53107605,9110,8802,170.58479766,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27222,"NZGD49 / Okarito Circuit",9001,4272,17918,9807,8801,-43.06364613,9110,8802,170.1539333,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27223,"NZGD49 / Jacksons Bay Circuit",9001,4272,17919,9807,8801,-43.58400904,9110,8802,168.36225612,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27224,"NZGD49 / Mount Pleasant Circuit",9001,4272,17920,9807,8801,-43.35262953,9110,8802,172.43378969,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27225,"NZGD49 / Gawler Circuit",9001,4272,17921,9807,8801,-43.44553616,9110,8802,171.21386945,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27226,"NZGD49 / Timaru Circuit",9001,4272,17922,9807,8801,-44.24079933,9110,8802,171.0326103,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27227,"NZGD49 / Lindis Peak Circuit",9001,4272,17923,9807,8801,-44.44069647,9110,8802,169.28039183,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27228,"NZGD49 / Mount Nicholas Circuit",9001,4272,17924,9807,8801,-45.07584493,9110,8802,168.23551083,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27229,"NZGD49 / Mount York Circuit",9001,4272,17925,9807,8801,-45.33494142,9110,8802,167.44199024,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27230,"NZGD49 / Observation Point Circuit",9001,4272,17926,9807,8801,-45.48583078,9110,8802,170.37429426,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27231,"NZGD49 / North Taieri Circuit",9001,4272,17927,9807,8801,-45.51414481,9110,8802,170.16573208,9110,8805,0.99996,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27232,"NZGD49 / Bluff Circuit",9001,4272,17928,9807,8801,-46.36000346,9110,8802,168.20343392,9110,8805,1.0,9201,8806,300002.66,9001,8807,699999.58,9001,,,,,,
+27258,"NZGD49 / UTM zone 58S",9001,4272,16158,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+27259,"NZGD49 / UTM zone 59S",9001,4272,16159,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+27260,"NZGD49 / UTM zone 60S",9001,4272,16160,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+27291,"NZGD49 / North Island Grid",9040,4272,18141,9807,8801,-39.0,9110,8802,175.3,9110,8805,1.0,9201,8806,300000.0,9040,8807,400000.0,9040,,,,,,
+27292,"NZGD49 / South Island Grid",9040,4272,18142,9807,8801,-44.0,9110,8802,171.3,9110,8805,1.0,9201,8806,500000.0,9040,8807,500000.0,9040,,,,,,
+27391,"NGO 1948 (Oslo) / NGO zone I",9001,4817,18221,9807,8801,58.0,9110,8802,-4.4,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27392,"NGO 1948 (Oslo) / NGO zone II",9001,4817,18222,9807,8801,58.0,9110,8802,-2.2,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27393,"NGO 1948 (Oslo) / NGO zone III",9001,4817,18223,9807,8801,58.0,9110,8802,0.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27394,"NGO 1948 (Oslo) / NGO zone IV",9001,4817,18224,9807,8801,58.0,9110,8802,2.3,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27395,"NGO 1948 (Oslo) / NGO zone V",9001,4817,18225,9807,8801,58.0,9110,8802,6.1,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27396,"NGO 1948 (Oslo) / NGO zone VI",9001,4817,18226,9807,8801,58.0,9110,8802,10.1,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27397,"NGO 1948 (Oslo) / NGO zone VII",9001,4817,18227,9807,8801,58.0,9110,8802,14.1,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27398,"NGO 1948 (Oslo) / NGO zone VIII",9001,4817,18228,9807,8801,58.0,9110,8802,18.2,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27429,"Datum 73 / UTM zone 29N",9001,4274,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+27492,"Datum 73 / Modified Portuguese Grid",9001,4274,19974,9807,8801,39.4,9110,8802,-8.0754862,9110,8805,1.0,9201,8806,180.598,9001,8807,-86.99,9001,,,,,,
+27500,"ATF (Paris) / Nord de Guerre",9001,4901,19903,9801,8801,55.0,9105,8802,6.0,9105,8805,0.99950908,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+27561,"NTF (Paris) / Lambert Nord France",9001,4807,18091,9801,8801,55.0,9105,8802,0.0,9105,8805,0.999877341,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+27562,"NTF (Paris) / Lambert Centre France",9001,4807,18092,9801,8801,52.0,9105,8802,0.0,9105,8805,0.99987742,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+27563,"NTF (Paris) / Lambert Sud France",9001,4807,18093,9801,8801,49.0,9105,8802,0.0,9105,8805,0.999877499,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+27564,"NTF (Paris) / Lambert Corse",9001,4807,18094,9801,8801,46.85,9105,8802,0.0,9105,8805,0.99994471,9201,8806,234.358,9001,8807,185861.369,9001,,,,,,
+27571,"NTF (Paris) / Lambert zone I",9001,4807,18081,9801,8801,55.0,9105,8802,0.0,9105,8805,0.999877341,9201,8806,600000.0,9001,8807,1200000.0,9001,,,,,,
+27572,"NTF (Paris) / Lambert zone II",9001,4807,18082,9801,8801,52.0,9105,8802,0.0,9105,8805,0.99987742,9201,8806,600000.0,9001,8807,2200000.0,9001,,,,,,
+27573,"NTF (Paris) / Lambert zone III",9001,4807,18083,9801,8801,49.0,9105,8802,0.0,9105,8805,0.999877499,9201,8806,600000.0,9001,8807,3200000.0,9001,,,,,,
+27574,"NTF (Paris) / Lambert zone IV",9001,4807,18084,9801,8801,46.85,9105,8802,0.0,9105,8805,0.99994471,9201,8806,234.358,9001,8807,4185861.369,9001,,,,,,
+27581,"NTF (Paris) / France I",9001,4807,18081,9801,8801,55.0,9105,8802,0.0,9105,8805,0.999877341,9201,8806,600000.0,9001,8807,1200000.0,9001,,,,,,
+27582,"NTF (Paris) / France II",9001,4807,18082,9801,8801,52.0,9105,8802,0.0,9105,8805,0.99987742,9201,8806,600000.0,9001,8807,2200000.0,9001,,,,,,
+27583,"NTF (Paris) / France III",9001,4807,18083,9801,8801,49.0,9105,8802,0.0,9105,8805,0.999877499,9201,8806,600000.0,9001,8807,3200000.0,9001,,,,,,
+27584,"NTF (Paris) / France IV",9001,4807,18084,9801,8801,46.85,9105,8802,0.0,9105,8805,0.99994471,9201,8806,234.358,9001,8807,4185861.369,9001,,,,,,
+27591,"NTF (Paris) / Nord France",9001,4807,18091,9801,8801,55.0,9105,8802,0.0,9105,8805,0.999877341,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+27592,"NTF (Paris) / Centre France",9001,4807,18092,9801,8801,52.0,9105,8802,0.0,9105,8805,0.99987742,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+27593,"NTF (Paris) / Sud France",9001,4807,18093,9801,8801,49.0,9105,8802,0.0,9105,8805,0.999877499,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+27594,"NTF (Paris) / Corse",9001,4807,18094,9801,8801,46.85,9105,8802,0.0,9105,8805,0.99994471,9201,8806,234.358,9001,8807,185861.369,9001,,,,,,
+27700,"OSGB 1936 / British National Grid",9001,4277,19916,9807,8801,49.0,9102,8802,-2.0,9102,8805,0.999601272,9201,8806,400000.0,9001,8807,-100000.0,9001,,,,,,
+28191,"Palestine 1923 / Palestine Grid",9001,4281,18201,9806,8801,31.4402749,9110,8802,35.124349,9110,8806,170251.555,9001,8807,126867.909,9001,,,,,,,,,
+28192,"Palestine 1923 / Palestine Belt",9001,4281,18202,9807,8801,31.4402749,9110,8802,35.124349,9110,8805,1.0,9201,8806,170251.555,9001,8807,1126867.909,9001,,,,,,
+28193,"Palestine 1923 / Israeli CS Grid",9001,4281,18203,9806,8801,31.4402749,9110,8802,35.124349,9110,8806,170251.555,9001,8807,1126867.909,9001,,,,,,,,,
+28232,"Pointe Noire / UTM zone 32S",9001,4282,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28348,"GDA94 / MGA zone 48",9001,4283,17348,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28349,"GDA94 / MGA zone 49",9001,4283,17349,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28350,"GDA94 / MGA zone 50",9001,4283,17350,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28351,"GDA94 / MGA zone 51",9001,4283,17351,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28352,"GDA94 / MGA zone 52",9001,4283,17352,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28353,"GDA94 / MGA zone 53",9001,4283,17353,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28354,"GDA94 / MGA zone 54",9001,4283,17354,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28355,"GDA94 / MGA zone 55",9001,4283,17355,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28356,"GDA94 / MGA zone 56",9001,4283,17356,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28357,"GDA94 / MGA zone 57",9001,4283,17357,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28358,"GDA94 / MGA zone 58",9001,4283,17358,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28402,"Pulkovo 1942 / Gauss-Kruger zone 2",9001,4284,16202,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+28403,"Pulkovo 1942 / Gauss-Kruger zone 3",9001,4284,16203,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+28404,"Pulkovo 1942 / Gauss-Kruger zone 4",9001,4284,16204,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+28405,"Pulkovo 1942 / Gauss-Kruger zone 5",9001,4284,16205,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+28406,"Pulkovo 1942 / Gauss-Kruger zone 6",9001,4284,16206,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+28407,"Pulkovo 1942 / Gauss-Kruger zone 7",9001,4284,16207,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+28408,"Pulkovo 1942 / Gauss-Kruger zone 8",9001,4284,16208,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+28409,"Pulkovo 1942 / Gauss-Kruger zone 9",9001,4284,16209,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+28410,"Pulkovo 1942 / Gauss-Kruger zone 10",9001,4284,16210,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+28411,"Pulkovo 1942 / Gauss-Kruger zone 11",9001,4284,16211,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+28412,"Pulkovo 1942 / Gauss-Kruger zone 12",9001,4284,16212,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+28413,"Pulkovo 1942 / Gauss-Kruger zone 13",9001,4284,16213,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+28414,"Pulkovo 1942 / Gauss-Kruger zone 14",9001,4284,16214,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+28415,"Pulkovo 1942 / Gauss-Kruger zone 15",9001,4284,16215,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+28416,"Pulkovo 1942 / Gauss-Kruger zone 16",9001,4284,16216,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+28417,"Pulkovo 1942 / Gauss-Kruger zone 17",9001,4284,16217,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+28418,"Pulkovo 1942 / Gauss-Kruger zone 18",9001,4284,16218,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+28419,"Pulkovo 1942 / Gauss-Kruger zone 19",9001,4284,16219,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+28420,"Pulkovo 1942 / Gauss-Kruger zone 20",9001,4284,16220,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+28421,"Pulkovo 1942 / Gauss-Kruger zone 21",9001,4284,16221,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+28422,"Pulkovo 1942 / Gauss-Kruger zone 22",9001,4284,16222,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+28423,"Pulkovo 1942 / Gauss-Kruger zone 23",9001,4284,16223,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+28424,"Pulkovo 1942 / Gauss-Kruger zone 24",9001,4284,16224,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,24500000.0,9001,8807,0.0,9001,,,,,,
+28425,"Pulkovo 1942 / Gauss-Kruger zone 25",9001,4284,16225,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+28426,"Pulkovo 1942 / Gauss-Kruger zone 26",9001,4284,16226,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+28427,"Pulkovo 1942 / Gauss-Kruger zone 27",9001,4284,16227,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+28428,"Pulkovo 1942 / Gauss-Kruger zone 28",9001,4284,16228,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+28429,"Pulkovo 1942 / Gauss-Kruger zone 29",9001,4284,16229,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+28430,"Pulkovo 1942 / Gauss-Kruger zone 30",9001,4284,16230,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+28431,"Pulkovo 1942 / Gauss-Kruger zone 31",9001,4284,16231,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+28432,"Pulkovo 1942 / Gauss-Kruger zone 32",9001,4284,16232,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+28462,"Pulkovo 1942 / Gauss-Kruger 2N",9001,4284,16302,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28463,"Pulkovo 1942 / Gauss-Kruger 3N",9001,4284,16303,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28464,"Pulkovo 1942 / Gauss-Kruger 4N",9001,4284,16304,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28465,"Pulkovo 1942 / Gauss-Kruger 5N",9001,4284,16305,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28466,"Pulkovo 1942 / Gauss-Kruger 6N",9001,4284,16306,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28467,"Pulkovo 1942 / Gauss-Kruger 7N",9001,4284,16307,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28468,"Pulkovo 1942 / Gauss-Kruger 8N",9001,4284,16308,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28469,"Pulkovo 1942 / Gauss-Kruger 9N",9001,4284,16309,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28470,"Pulkovo 1942 / Gauss-Kruger 10N",9001,4284,16310,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28471,"Pulkovo 1942 / Gauss-Kruger 11N",9001,4284,16311,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28472,"Pulkovo 1942 / Gauss-Kruger 12N",9001,4284,16312,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28473,"Pulkovo 1942 / Gauss-Kruger 13N",9001,4284,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28474,"Pulkovo 1942 / Gauss-Kruger 14N",9001,4284,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28475,"Pulkovo 1942 / Gauss-Kruger 15N",9001,4284,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28476,"Pulkovo 1942 / Gauss-Kruger 16N",9001,4284,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28477,"Pulkovo 1942 / Gauss-Kruger 17N",9001,4284,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28478,"Pulkovo 1942 / Gauss-Kruger 18N",9001,4284,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28479,"Pulkovo 1942 / Gauss-Kruger 19N",9001,4284,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28480,"Pulkovo 1942 / Gauss-Kruger 20N",9001,4284,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28481,"Pulkovo 1942 / Gauss-Kruger 21N",9001,4284,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28482,"Pulkovo 1942 / Gauss-Kruger 22N",9001,4284,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28483,"Pulkovo 1942 / Gauss-Kruger 23N",9001,4284,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28484,"Pulkovo 1942 / Gauss-Kruger 24N",9001,4284,16324,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28485,"Pulkovo 1942 / Gauss-Kruger 25N",9001,4284,16325,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28486,"Pulkovo 1942 / Gauss-Kruger 26N",9001,4284,16326,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28487,"Pulkovo 1942 / Gauss-Kruger 27N",9001,4284,16327,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28488,"Pulkovo 1942 / Gauss-Kruger 28N",9001,4284,16328,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28489,"Pulkovo 1942 / Gauss-Kruger 29N",9001,4284,16329,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28490,"Pulkovo 1942 / Gauss-Kruger 30N",9001,4284,16330,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28491,"Pulkovo 1942 / Gauss-Kruger 31N",9001,4284,16331,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28492,"Pulkovo 1942 / Gauss-Kruger 32N",9001,4284,16332,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28600,"Qatar 1974 / Qatar National Grid",9001,4285,19919,9807,8801,24.27,9110,8802,51.13,9110,8805,0.99999,9201,8806,200000.0,9001,8807,300000.0,9001,,,,,,
+28991,"Amersfoort / RD Old",9001,4289,19913,9809,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+28992,"Amersfoort / RD New",9001,4289,19914,9809,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,155000.0,9001,8807,463000.0,9001,,,,,,
+29100,"SAD69 / Brazil Polyconic",9001,4291,19941,9818,8801,0.0,9102,8802,-54.0,9102,8806,5000000.0,9001,8807,10000000.0,9001,,,,,,,,,
+29118,"SAD69 / UTM zone 18N",9001,4291,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29119,"SAD69 / UTM zone 19N",9001,4291,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29120,"SAD69 / UTM zone 20N",9001,4291,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29121,"SAD69 / UTM zone 21N",9001,4291,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29122,"SAD69 / UTM zone 22N",9001,4291,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29177,"SAD69 / UTM zone 17S",9001,4291,16117,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29178,"SAD69 / UTM zone 18S",9001,4291,16118,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29179,"SAD69 / UTM zone 19S",9001,4291,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29180,"SAD69 / UTM zone 20S",9001,4291,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29181,"SAD69 / UTM zone 21S",9001,4291,16121,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29182,"SAD69 / UTM zone 22S",9001,4291,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29183,"SAD69 / UTM zone 23S",9001,4291,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29184,"SAD69 / UTM zone 24S",9001,4291,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29185,"SAD69 / UTM zone 25S",9001,4291,16125,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29220,"Sapper Hill 1943 / UTM zone 20S",9001,4292,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29221,"Sapper Hill 1943 / UTM zone 21S",9001,4292,16121,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29333,"Schwarzeck / UTM zone 33S",9001,4293,16133,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29371,South West African Coord. System zone 11,9031,4293,17611,9808,8801,-22.0,9102,8802,11.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29373,South West African Coord. System zone 13,9031,4293,17613,9808,8801,-22.0,9102,8802,13.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29375,South West African Coord. System zone 15,9031,4293,17615,9808,8801,-22.0,9102,8802,15.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29377,South West African Coord. System zone 17,9031,4293,17617,9808,8801,-22.0,9102,8802,17.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29379,South West African Coord. System zone 19,9031,4293,17619,9808,8801,-22.0,9102,8802,19.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29381,South West African Coord. System zone 21,9031,4293,17621,9808,8801,-22.0,9102,8802,21.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29383,South West African Coord. System zone 23,9031,4293,17623,9808,8801,-22.0,9102,8802,23.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29385,South West African Coord. System zone 25,9031,4293,17625,9808,8801,-22.0,9102,8802,25.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29635,"Sudan / UTM zone 35N",9001,4296,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29636,"Sudan / UTM zone 36N",9001,4296,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29700,"Tananarive (Paris) / Laborde Grid",9001,4810,19911,9815,8811,-21.0,9105,8812,49.0,9105,8813,21.0,9105,8814,21.0,9105,8815,0.9995,9201,8816,400000.0,9001,8817,800000.0,9001
+29738,"Tananarive / UTM zone 38S",9001,4297,16138,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29739,"Tananarive / UTM zone 39S",9001,4297,16139,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29849,"Timbalai 1948 / UTM zone 49N",9001,4298,16049,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29850,"Timbalai 1948 / UTM zone 50N",9001,4298,16050,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29871,"Timbalai 1948 / R.S.O. Borneo (ch)",9042,4298,19956,9815,8811,4.0,9110,8812,115.0,9110,8813,53.18569537,9110,8814,53.07483685,9110,8815,0.99984,9201,8816,29352.4763,9042,8817,22014.3572,9042
+29872,"Timbalai 1948 / R.S.O. Borneo (ft)",9041,4298,19957,9815,8811,4.0,9110,8812,115.0,9110,8813,53.18569537,9110,8814,53.07483685,9110,8815,0.99984,9201,8816,1937263.44,9041,8817,1452947.58,9041
+29873,"Timbalai 1948 / R.S.O. Borneo (m)",9001,4298,19958,9815,8811,4.0,9110,8812,115.0,9110,8813,53.18569537,9110,8814,53.07483685,9110,8815,0.99984,9201,8816,590476.87,9001,8817,442857.65,9001
+29900,"TM65 / Irish National Grid",9001,4299,19908,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.000035,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+29901,"OSNI 1952 / Irish National Grid",9001,4188,19973,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.0,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+29902,"TM65 / Irish Grid",9001,4299,19972,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.000035,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+29903,"TM75 / Irish Grid",9001,4300,19972,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.000035,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+30161,"Tokyo / Japan Plane Rectangular CS I",9001,4301,17801,9807,8801,33.0,9110,8802,129.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30162,"Tokyo / Japan Plane Rectangular CS II",9001,4301,17802,9807,8801,33.0,9110,8802,131.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30163,"Tokyo / Japan Plane Rectangular CS III",9001,4301,17803,9807,8801,36.0,9110,8802,132.1,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30164,"Tokyo / Japan Plane Rectangular CS IV",9001,4301,17804,9807,8801,33.0,9110,8802,133.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30165,"Tokyo / Japan Plane Rectangular CS V",9001,4301,17805,9807,8801,36.0,9110,8802,134.2,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30166,"Tokyo / Japan Plane Rectangular CS VI",9001,4301,17806,9807,8801,36.0,9110,8802,136.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30167,"Tokyo / Japan Plane Rectangular CS VII",9001,4301,17807,9807,8801,36.0,9110,8802,137.1,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30168,"Tokyo / Japan Plane Rectangular CS VIII",9001,4301,17808,9807,8801,36.0,9110,8802,138.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30169,"Tokyo / Japan Plane Rectangular CS IX",9001,4301,17809,9807,8801,36.0,9110,8802,139.5,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30170,"Tokyo / Japan Plane Rectangular CS X",9001,4301,17810,9807,8801,40.0,9110,8802,140.5,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30171,"Tokyo / Japan Plane Rectangular CS XI",9001,4301,17811,9807,8801,44.0,9110,8802,140.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30172,"Tokyo / Japan Plane Rectangular CS XII",9001,4301,17812,9807,8801,44.0,9110,8802,142.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30173,"Tokyo / Japan Plane Rectangular CS XIII",9001,4301,17813,9807,8801,44.0,9110,8802,144.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30174,"Tokyo / Japan Plane Rectangular CS XIV",9001,4301,17814,9807,8801,26.0,9110,8802,142.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30175,"Tokyo / Japan Plane Rectangular CS XV",9001,4301,17815,9807,8801,26.0,9110,8802,127.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30176,"Tokyo / Japan Plane Rectangular CS XVI",9001,4301,17816,9807,8801,26.0,9110,8802,124.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30177,"Tokyo / Japan Plane Rectangular CS XVII",9001,4301,17817,9807,8801,26.0,9110,8802,131.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30178,"Tokyo / Japan Plane Rectangular CS XVIII",9001,4301,17818,9807,8801,20.0,9110,8802,136.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30179,"Tokyo / Japan Plane Rectangular CS XIX",9001,4301,17819,9807,8801,26.0,9110,8802,154.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30200,"Trinidad 1903 / Trinidad Grid",9039,4302,19925,9806,8801,10.263,9110,8802,-61.2,9110,8806,430000.0,9039,8807,325000.0,9039,,,,,,,,,
+30339,"TC(1948) / UTM zone 39N",9001,4303,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+30340,"TC(1948) / UTM zone 40N",9001,4303,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+30491,"Voirol 1875 / Nord Algerie (ancienne)",9001,4304,18011,9801,8801,40.0,9105,8802,3.0,9105,8805,0.999625544,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+30492,"Voirol 1875 / Sud Algerie (ancienne)",9001,4304,18012,9801,8801,37.0,9105,8802,3.0,9105,8805,0.999625769,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+30729,"Nord Sahara 1959 / UTM zone 29N",9001,4307,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+30730,"Nord Sahara 1959 / UTM zone 30N",9001,4307,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+30731,"Nord Sahara 1959 / UTM zone 31N",9001,4307,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+30732,"Nord Sahara 1959 / UTM zone 32N",9001,4307,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+30791,"Nord Sahara 1959 / Voirol Unifie Nord",9001,4307,18021,9801,8801,40.0,9105,8802,3.0,9105,8805,0.999625544,9201,8806,500135.0,9001,8807,300090.0,9001,,,,,,
+30792,"Nord Sahara 1959 / Voirol Unifie Sud",9001,4307,18022,9801,8801,37.0,9105,8802,3.0,9105,8805,0.999625769,9201,8806,500135.0,9001,8807,300090.0,9001,,,,,,
+30800,RT38 2.5 gon W,9001,4308,19929,9807,8801,0.0,9110,8802,15.48298,9110,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+31028,"Yoff / UTM zone 28N",9001,4310,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31121,"Zanderij / UTM zone 21N",9001,4311,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31154,"Zanderij / TM 54 NW",9001,4311,17054,9807,8801,0.0,9102,8802,-54.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31170,"Zanderij / Suriname Old TM",9001,4311,19954,9807,8801,0.0,9110,8802,-55.41,9110,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31171,"Zanderij / Suriname TM",9001,4311,19955,9807,8801,0.0,9110,8802,-55.41,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31265,"MGI / 3-degree Gauss zone 5",9001,4312,16265,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+31266,"MGI / 3-degree Gauss zone 6",9001,4312,16266,9807,8801,0.0,9102,8802,18.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+31267,"MGI / 3-degree Gauss zone 7",9001,4312,16267,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+31268,"MGI / 3-degree Gauss zone 8",9001,4312,16268,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+31275,"MGI / Balkans zone 5",9001,4312,18275,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9999,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+31276,"MGI / Balkans zone 6",9001,4312,18276,9807,8801,0.0,9102,8802,18.0,9102,8805,0.9999,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+31277,"MGI / Balkans zone 7",9001,4312,18277,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9999,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+31278,"MGI / Balkans zone 8",9001,4312,18277,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9999,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+31279,"MGI / Balkans zone 8",9001,4312,18278,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9999,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+31281,"MGI (Ferro) / Austria West Zone",9001,4805,18041,9807,8801,0.0,9102,8802,28.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+31282,"MGI (Ferro) / Austria Central Zone",9001,4805,18042,9807,8801,0.0,9102,8802,31.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+31283,"MGI (Ferro) / Austria East Zone",9001,4805,18043,9807,8801,0.0,9102,8802,34.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+31284,"MGI / M28",9001,4312,18044,9807,8801,0.0,9110,8802,10.2,9110,8805,1.0,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+31285,"MGI / M31",9001,4312,18045,9807,8801,0.0,9110,8802,13.2,9110,8805,1.0,9201,8806,450000.0,9001,8807,0.0,9001,,,,,,
+31286,"MGI / M34",9001,4312,18046,9807,8801,0.0,9110,8802,16.2,9110,8805,1.0,9201,8806,750000.0,9001,8807,0.0,9001,,,,,,
+31287,"MGI / Austria Lambert",9001,4312,19947,9802,8821,47.3,9110,8822,13.2,9110,8823,49.0,9110,8824,46.0,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+31291,"MGI (Ferro) / Austria West Zone",9001,4805,18041,9807,8801,0.0,9102,8802,28.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+31292,"MGI (Ferro) / Austria Central Zone",9001,4805,18042,9807,8801,0.0,9102,8802,31.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+31293,"MGI (Ferro) / Austria East Zone",9001,4805,18043,9807,8801,0.0,9102,8802,34.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+31294,"MGI / M28",9001,4312,18044,9807,8801,0.0,9110,8802,10.2,9110,8805,1.0,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+31295,"MGI / M31",9001,4312,18045,9807,8801,0.0,9110,8802,13.2,9110,8805,1.0,9201,8806,450000.0,9001,8807,0.0,9001,,,,,,
+31296,"MGI / M34",9001,4312,18046,9807,8801,0.0,9110,8802,16.2,9110,8805,1.0,9201,8806,750000.0,9001,8807,0.0,9001,,,,,,
+31297,"MGI / Austria Lambert",9001,4312,19947,9802,8821,47.3,9110,8822,13.2,9110,8823,49.0,9110,8824,46.0,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+31300,"Belge 1972 / Belge Lambert 72",9001,4313,19902,9803,8821,90.0,9110,8822,4.2124983,9110,8823,49.5,9110,8824,51.1,9110,8826,150000.01256,9001,8827,5400088.4378,9001,,,
+31370,"Belge 1972 / Belgian Lambert 72",9001,4313,19961,9802,8821,90.0,9110,8822,4.2202952,9110,8823,51.100000204,9110,8824,49.500000204,9110,8826,150000.013,9001,8827,5400088.438,9001,,,
+31461,"DHDN / 3-degree Gauss zone 1",9001,4314,16261,9807,8801,0.0,9102,8802,3.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+31462,"DHDN / 3-degree Gauss zone 2",9001,4314,16262,9807,8801,0.0,9102,8802,6.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+31463,"DHDN / 3-degree Gauss zone 3",9001,4314,16263,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+31464,"DHDN / 3-degree Gauss zone 4",9001,4314,16264,9807,8801,0.0,9102,8802,12.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+31465,"DHDN / 3-degree Gauss zone 5",9001,4314,16265,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+31466,"DHDN / Gauss-Kruger zone 2",9001,4314,16262,9807,8801,0.0,9102,8802,6.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+31467,"DHDN / Gauss-Kruger zone 3",9001,4314,16263,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+31468,"DHDN / Gauss-Kruger zone 4",9001,4314,16264,9807,8801,0.0,9102,8802,12.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+31469,"DHDN / Gauss-Kruger zone 5",9001,4314,16265,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+31528,"Conakry 1905 / UTM zone 28N",9001,4315,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31529,"Conakry 1905 / UTM zone 29N",9001,4315,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31600,"Dealul Piscului 1933/ Stereo 33",9001,4316,19927,9809,8801,45.54,9110,8802,25.23328772,9110,8805,0.9996667,9201,8806,500000.0,9001,8807,500000.0,9001,,,,,,
+31700,"Dealul Piscului 1970/ Stereo 70",9001,4317,19926,9809,8801,46.0,9102,8802,25.0,9102,8805,0.99975,9201,8806,500000.0,9001,8807,500000.0,9001,,,,,,
+31838,"NGN / UTM zone 38N",9001,4318,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31839,"NGN / UTM zone 39N",9001,4318,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31900,"KUDAMS / KTM",9001,4319,19928,9807,8801,0.0,9102,8802,48.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31986,"SIRGAS / UTM zone 17N",9001,4170,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31987,"SIRGAS / UTM zone 18N",9001,4170,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31988,"SIRGAS / UTM zone 19N",9001,4170,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31989,"SIRGAS / UTM zone 20N",9001,4170,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31990,"SIRGAS / UTM zone 21N",9001,4170,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31991,"SIRGAS / UTM zone 22N",9001,4170,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31992,"SIRGAS / UTM zone 17S",9001,4170,16117,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31993,"SIRGAS / UTM zone 18S",9001,4170,16118,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31994,"SIRGAS / UTM zone 19S",9001,4170,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31995,"SIRGAS / UTM zone 20S",9001,4170,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31996,"SIRGAS / UTM zone 21S",9001,4170,16121,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31997,"SIRGAS / UTM zone 22S",9001,4170,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31998,"SIRGAS / UTM zone 23S",9001,4170,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31999,"SIRGAS / UTM zone 24S",9001,4170,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32000,"SIRGAS / UTM zone 25S",9001,4170,16125,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32001,"NAD27 / Montana North",9003,4267,12501,9802,8821,47.0,9110,8822,-109.3,9110,8823,48.43,9110,8824,47.51,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32002,"NAD27 / Montana Central",9003,4267,12502,9802,8821,45.5,9110,8822,-109.3,9110,8823,47.53,9110,8824,46.27,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32003,"NAD27 / Montana South",9003,4267,12503,9802,8821,44.0,9110,8822,-109.3,9110,8823,46.24,9110,8824,44.52,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32005,"NAD27 / Nebraska North",9003,4267,12601,9802,8821,41.2,9110,8822,-100.0,9110,8823,41.51,9110,8824,42.49,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32006,"NAD27 / Nebraska South",9003,4267,12602,9802,8821,39.4,9110,8822,-99.3,9110,8823,40.17,9110,8824,41.43,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32007,"NAD27 / Nevada East",9003,4267,12701,9807,8801,34.45,9110,8802,-115.35,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32008,"NAD27 / Nevada Central",9003,4267,12702,9807,8801,34.45,9110,8802,-116.4,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32009,"NAD27 / Nevada West",9003,4267,12703,9807,8801,34.45,9110,8802,-118.35,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32010,"NAD27 / New Hampshire",9003,4267,12800,9807,8801,42.3,9110,8802,-71.4,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32011,"NAD27 / New Jersey",9003,4267,12900,9807,8801,38.5,9110,8802,-74.4,9110,8805,0.999975,9201,8806,2000000.0,9003,8807,0.0,9003,,,,,,
+32012,"NAD27 / New Mexico East",9003,4267,13001,9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32013,"NAD27 / New Mexico Central",9003,4267,13002,9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32014,"NAD27 / New Mexico West",9003,4267,13003,9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32015,"NAD27 / New York East",9003,4267,13101,9807,8801,40.0,9110,8802,-74.2,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32016,"NAD27 / New York Central",9003,4267,13102,9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32017,"NAD27 / New York West",9003,4267,13103,9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32018,"NAD27 / New York Long Island",9003,4267,13104,9802,8821,40.3,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,1000000.0,9003,8827,0.0,9003,,,
+32019,"NAD27 / North Carolina",9003,4267,13200,9802,8821,33.45,9110,8822,-79.0,9110,8823,34.2,9110,8824,36.1,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32020,"NAD27 / North Dakota North",9003,4267,13301,9802,8821,47.0,9110,8822,-100.3,9110,8823,47.26,9110,8824,48.44,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32021,"NAD27 / North Dakota South",9003,4267,13302,9802,8821,45.4,9110,8822,-100.3,9110,8823,46.11,9110,8824,47.29,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32022,"NAD27 / Ohio North",9003,4267,13401,9802,8821,39.4,9110,8822,-82.3,9110,8823,40.26,9110,8824,41.42,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32023,"NAD27 / Ohio South",9003,4267,13402,9802,8821,38.0,9110,8822,-82.3,9110,8823,38.44,9110,8824,40.02,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32024,"NAD27 / Oklahoma North",9003,4267,13501,9802,8821,35.0,9110,8822,-98.0,9110,8823,35.34,9110,8824,36.46,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32025,"NAD27 / Oklahoma South",9003,4267,13502,9802,8821,33.2,9110,8822,-98.0,9110,8823,33.56,9110,8824,35.14,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32026,"NAD27 / Oregon North",9003,4267,13601,9802,8821,43.4,9110,8822,-120.3,9110,8823,44.2,9110,8824,46.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32027,"NAD27 / Oregon South",9003,4267,13602,9802,8821,41.4,9110,8822,-120.3,9110,8823,42.2,9110,8824,44.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32028,"NAD27 / Pennsylvania North",9003,4267,13701,9802,8821,40.1,9110,8822,-77.45,9110,8823,40.53,9110,8824,41.57,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32029,"NAD27 / Pennsylvania South",9003,4267,13702,9802,8821,39.2,9110,8822,-77.45,9110,8823,39.56,9110,8824,40.48,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32030,"NAD27 / Rhode Island",9003,4267,13800,9807,8801,41.05,9110,8802,-71.3,9110,8805,0.9999938,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32031,"NAD27 / South Carolina North",9003,4267,13901,9802,8821,33.0,9110,8822,-81.0,9110,8823,33.46,9110,8824,34.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32033,"NAD27 / South Carolina South",9003,4267,13902,9802,8821,31.5,9110,8822,-81.0,9110,8823,32.2,9110,8824,33.4,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32034,"NAD27 / South Dakota North",9003,4267,14001,9802,8821,43.5,9110,8822,-100.0,9110,8823,44.25,9110,8824,45.41,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32035,"NAD27 / South Dakota South",9003,4267,14002,9802,8821,42.2,9110,8822,-100.2,9110,8823,42.5,9110,8824,44.24,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32036,"NAD27 / Tennessee",9003,4267,14100,9802,8821,34.4,9110,8822,-86.0,9110,8823,35.15,9110,8824,36.25,9110,8826,100000.0,9003,8827,0.0,9003,,,
+32037,"NAD27 / Texas North",9003,4267,14201,9802,8821,34.0,9110,8822,-101.3,9110,8823,34.39,9110,8824,36.11,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32038,"NAD27 / Texas North Central",9003,4267,14202,9802,8821,31.4,9110,8822,-97.3,9110,8823,32.08,9110,8824,33.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32039,"NAD27 / Texas Central",9003,4267,14203,9802,8821,29.4,9110,8822,-100.2,9110,8823,30.07,9110,8824,31.53,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32040,"NAD27 / Texas South Central",9003,4267,14204,9802,8821,27.5,9110,8822,-99.0,9110,8823,28.23,9110,8824,30.17,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32041,"NAD27 / Texas South",9003,4267,14205,9802,8821,25.4,9110,8822,-98.3,9110,8823,26.1,9110,8824,27.5,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32042,"NAD27 / Utah North",9003,4267,14301,9802,8821,40.2,9110,8822,-111.3,9110,8823,40.43,9110,8824,41.47,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32043,"NAD27 / Utah Central",9003,4267,14302,9802,8821,38.2,9110,8822,-111.3,9110,8823,39.01,9110,8824,40.39,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32044,"NAD27 / Utah South",9003,4267,14303,9802,8821,36.4,9110,8822,-111.3,9110,8823,37.13,9110,8824,38.21,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32045,"NAD27 / Vermont",9003,4267,14400,9807,8801,42.3,9110,8802,-72.3,9110,8805,0.999964286,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32046,"NAD27 / Virginia North",9003,4267,14501,9802,8821,37.4,9110,8822,-78.3,9110,8823,38.02,9110,8824,39.12,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32047,"NAD27 / Virginia South",9003,4267,14502,9802,8821,36.2,9110,8822,-78.3,9110,8823,36.46,9110,8824,37.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32048,"NAD27 / Washington North",9003,4267,14601,9802,8821,47.0,9110,8822,-120.5,9110,8823,47.3,9110,8824,48.44,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32049,"NAD27 / Washington South",9003,4267,14602,9802,8821,45.2,9110,8822,-120.3,9110,8823,45.5,9110,8824,47.2,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32050,"NAD27 / West Virginia North",9003,4267,14701,9802,8821,38.3,9110,8822,-79.3,9110,8823,39.0,9110,8824,40.15,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32051,"NAD27 / West Virginia South",9003,4267,14702,9802,8821,37.0,9110,8822,-81.0,9110,8823,37.29,9110,8824,38.53,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32052,"NAD27 / Wisconsin North",9003,4267,14801,9802,8821,45.1,9110,8822,-90.0,9110,8823,45.34,9110,8824,46.46,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32053,"NAD27 / Wisconsin Central",9003,4267,14802,9802,8821,43.5,9110,8822,-90.0,9110,8823,44.15,9110,8824,45.3,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32054,"NAD27 / Wisconsin South",9003,4267,14803,9802,8821,42.0,9110,8822,-90.0,9110,8823,42.44,9110,8824,44.04,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32055,"NAD27 / Wyoming East",9003,4267,14901,9807,8801,40.4,9110,8802,-105.1,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32056,"NAD27 / Wyoming East Central",9003,4267,14902,9807,8801,40.4,9110,8802,-107.2,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32057,"NAD27 / Wyoming West Central",9003,4267,14903,9807,8801,40.4,9110,8802,-108.45,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32058,"NAD27 / Wyoming West",9003,4267,14904,9807,8801,40.4,9110,8802,-110.05,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32061,"NAD27 / Guatemala Norte",9001,4267,18211,9801,8801,16.49,9110,8802,-90.2,9110,8805,0.99992226,9201,8806,500000.0,9001,8807,292209.579,9001,,,,,,
+32062,"NAD27 / Guatemala Sur",9001,4267,18212,9801,8801,14.54,9110,8802,-90.2,9110,8805,0.99989906,9201,8806,500000.0,9001,8807,325992.681,9001,,,,,,
+32064,"NAD27 / BLM 14N (ftUS)",9003,4267,15914,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32065,"NAD27 / BLM 15N (ftUS)",9003,4267,15915,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32066,"NAD27 / BLM 16N (ftUS)",9003,4267,15916,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32067,"NAD27 / BLM 17N (ftUS)",9003,4267,15917,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32074,"NAD27 / BLM 14N (feet)",9003,4267,15914,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32075,"NAD27 / BLM 15N (feet)",9003,4267,15915,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32076,"NAD27 / BLM 16N (feet)",9003,4267,15916,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32077,"NAD27 / BLM 17N (feet)",9003,4267,15917,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32081,"NAD27 / MTM zone 1",9001,4267,17701,9807,8801,0.0,9102,8802,-53.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32082,"NAD27 / MTM zone 2",9001,4267,17702,9807,8801,0.0,9102,8802,-56.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32083,"NAD27 / MTM zone 3",9001,4267,17703,9807,8801,0.0,9110,8802,-58.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32084,"NAD27 / MTM zone 4",9001,4267,17704,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32085,"NAD27 / MTM zone 5",9001,4267,17705,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32086,"NAD27 / MTM zone 6",9001,4267,17706,9807,8801,0.0,9110,8802,-67.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32098,"NAD27 / Quebec Lambert",9001,4267,19944,9802,8821,44.0,9110,8822,-68.3,9110,8823,60.0,9110,8824,46.0,9110,8826,0.0,9001,8827,0.0,9001,,,
+32100,"NAD83 / Montana",9001,4269,12530,9802,8821,44.15,9110,8822,-109.3,9110,8823,49.0,9110,8824,45.0,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32104,"NAD83 / Nebraska",9001,4269,12630,9802,8821,39.5,9110,8822,-100.0,9110,8823,43.0,9110,8824,40.0,9110,8826,500000.0,9001,8827,0.0,9001,,,
+32107,"NAD83 / Nevada East",9001,4269,12731,9807,8801,34.45,9110,8802,-115.35,9110,8805,0.9999,9201,8806,200000.0,9001,8807,8000000.0,9001,,,,,,
+32108,"NAD83 / Nevada Central",9001,4269,12732,9807,8801,34.45,9110,8802,-116.4,9110,8805,0.9999,9201,8806,500000.0,9001,8807,6000000.0,9001,,,,,,
+32109,"NAD83 / Nevada West",9001,4269,12733,9807,8801,34.45,9110,8802,-118.35,9110,8805,0.9999,9201,8806,800000.0,9001,8807,4000000.0,9001,,,,,,
+32110,"NAD83 / New Hampshire",9001,4269,12830,9807,8801,42.3,9110,8802,-71.4,9110,8805,0.999966667,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+32111,"NAD83 / New Jersey",9001,4269,12930,9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+32112,"NAD83 / New Mexico East",9001,4269,13031,9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,165000.0,9001,8807,0.0,9001,,,,,,
+32113,"NAD83 / New Mexico Central",9001,4269,13032,9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32114,"NAD83 / New Mexico West",9001,4269,13033,9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,830000.0,9001,8807,0.0,9001,,,,,,
+32115,"NAD83 / New York East",9001,4269,13131,9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+32116,"NAD83 / New York Central",9001,4269,13132,9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,250000.0,9001,8807,0.0,9001,,,,,,
+32117,"NAD83 / New York West",9001,4269,13133,9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,350000.0,9001,8807,0.0,9001,,,,,,
+32118,"NAD83 / New York Long Island",9001,4269,13134,9802,8821,40.1,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,300000.0,9001,8827,0.0,9001,,,
+32119,"NAD83 / North Carolina",9001,4269,13230,9802,8821,33.45,9110,8822,-79.0,9110,8823,36.1,9110,8824,34.2,9110,8826,609601.22,9001,8827,0.0,9001,,,
+32120,"NAD83 / North Dakota North",9001,4269,13331,9802,8821,47.0,9110,8822,-100.3,9110,8823,48.44,9110,8824,47.26,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32121,"NAD83 / North Dakota South",9001,4269,13332,9802,8821,45.4,9110,8822,-100.3,9110,8823,47.29,9110,8824,46.11,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32122,"NAD83 / Ohio North",9001,4269,13431,9802,8821,39.4,9110,8822,-82.3,9110,8823,41.42,9110,8824,40.26,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32123,"NAD83 / Ohio South",9001,4269,13432,9802,8821,38.0,9110,8822,-82.3,9110,8823,40.02,9110,8824,38.44,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32124,"NAD83 / Oklahoma North",9001,4269,13531,9802,8821,35.0,9110,8822,-98.0,9110,8823,36.46,9110,8824,35.34,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32125,"NAD83 / Oklahoma South",9001,4269,13532,9802,8821,33.2,9110,8822,-98.0,9110,8823,35.14,9110,8824,33.56,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32126,"NAD83 / Oregon North",9001,4269,13631,9802,8821,43.4,9110,8822,-120.3,9110,8823,46.0,9110,8824,44.2,9110,8826,2500000.0,9001,8827,0.0,9001,,,
+32127,"NAD83 / Oregon South",9001,4269,13632,9802,8821,41.4,9110,8822,-120.3,9110,8823,44.0,9110,8824,42.2,9110,8826,1500000.0,9001,8827,0.0,9001,,,
+32128,"NAD83 / Pennsylvania North",9001,4269,13731,9802,8821,40.1,9110,8822,-77.45,9110,8823,41.57,9110,8824,40.53,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32129,"NAD83 / Pennsylvania South",9001,4269,13732,9802,8821,39.2,9110,8822,-77.45,9110,8823,40.58,9110,8824,39.56,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32130,"NAD83 / Rhode Island",9001,4269,13830,9807,8801,41.05,9110,8802,-71.3,9110,8805,0.99999375,9201,8806,100000.0,9001,8807,0.0,9001,,,,,,
+32133,"NAD83 / South Carolina",9001,4269,13930,9802,8821,31.5,9110,8822,-81.0,9110,8823,34.5,9110,8824,32.3,9110,8826,609600.0,9001,8827,0.0,9001,,,
+32134,"NAD83 / South Dakota North",9001,4269,14031,9802,8821,43.5,9110,8822,-100.0,9110,8823,45.41,9110,8824,44.25,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32135,"NAD83 / South Dakota South",9001,4269,14032,9802,8821,42.2,9110,8822,-100.2,9110,8823,44.24,9110,8824,42.5,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32136,"NAD83 / Tennessee",9001,4269,14130,9802,8821,34.2,9110,8822,-86.0,9110,8823,36.25,9110,8824,35.15,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32137,"NAD83 / Texas North",9001,4269,14231,9802,8821,34.0,9110,8822,-101.3,9110,8823,36.11,9110,8824,34.39,9110,8826,200000.0,9001,8827,1000000.0,9001,,,
+32138,"NAD83 / Texas North Central",9001,4269,14232,9802,8821,31.4,9110,8822,-98.3,9110,8823,33.58,9110,8824,32.08,9110,8826,600000.0,9001,8827,2000000.0,9001,,,
+32139,"NAD83 / Texas Central",9001,4269,14233,9802,8821,29.4,9110,8822,-100.2,9110,8823,31.53,9110,8824,30.07,9110,8826,700000.0,9001,8827,3000000.0,9001,,,
+32140,"NAD83 / Texas South Central",9001,4269,14234,9802,8821,27.5,9110,8822,-99.0,9110,8823,30.17,9110,8824,28.23,9110,8826,600000.0,9001,8827,4000000.0,9001,,,
+32141,"NAD83 / Texas South",9001,4269,14235,9802,8821,25.4,9110,8822,-98.3,9110,8823,27.5,9110,8824,26.1,9110,8826,300000.0,9001,8827,5000000.0,9001,,,
+32142,"NAD83 / Utah North",9001,4269,14331,9802,8821,40.2,9110,8822,-111.3,9110,8823,41.47,9110,8824,40.43,9110,8826,500000.0,9001,8827,1000000.0,9001,,,
+32143,"NAD83 / Utah Central",9001,4269,14332,9802,8821,38.2,9110,8822,-111.3,9110,8823,40.39,9110,8824,39.01,9110,8826,500000.0,9001,8827,2000000.0,9001,,,
+32144,"NAD83 / Utah South",9001,4269,14333,9802,8821,36.4,9110,8822,-111.3,9110,8823,38.21,9110,8824,37.13,9110,8826,500000.0,9001,8827,3000000.0,9001,,,
+32145,"NAD83 / Vermont",9001,4269,14430,9807,8801,42.3,9110,8802,-72.3,9110,8805,0.999964286,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32146,"NAD83 / Virginia North",9001,4269,14531,9802,8821,37.4,9110,8822,-78.3,9110,8823,39.12,9110,8824,38.02,9110,8826,3500000.0,9001,8827,2000000.0,9001,,,
+32147,"NAD83 / Virginia South",9001,4269,14532,9802,8821,36.2,9110,8822,-78.3,9110,8823,37.58,9110,8824,36.46,9110,8826,3500000.0,9001,8827,1000000.0,9001,,,
+32148,"NAD83 / Washington North",9001,4269,14631,9802,8821,47.0,9110,8822,-120.5,9110,8823,48.44,9110,8824,47.3,9110,8826,500000.0,9001,8827,0.0,9001,,,
+32149,"NAD83 / Washington South",9001,4269,14632,9802,8821,45.2,9110,8822,-120.3,9110,8823,47.2,9110,8824,45.5,9110,8826,500000.0,9001,8827,0.0,9001,,,
+32150,"NAD83 / West Virginia North",9001,4269,14731,9802,8821,38.3,9110,8822,-79.3,9110,8823,40.15,9110,8824,39.0,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32151,"NAD83 / West Virginia South",9001,4269,14732,9802,8821,37.0,9110,8822,-81.0,9110,8823,38.53,9110,8824,37.29,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32152,"NAD83 / Wisconsin North",9001,4269,14831,9802,8821,45.1,9110,8822,-90.0,9110,8823,46.46,9110,8824,45.34,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32153,"NAD83 / Wisconsin Central",9001,4269,14832,9802,8821,43.5,9110,8822,-90.0,9110,8823,45.3,9110,8824,44.15,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32154,"NAD83 / Wisconsin South",9001,4269,14833,9802,8821,42.0,9110,8822,-90.0,9110,8823,44.04,9110,8824,42.44,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32155,"NAD83 / Wyoming East",9001,4269,14931,9807,8801,40.3,9110,8802,-105.1,9110,8805,0.9999375,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+32156,"NAD83 / Wyoming East Central",9001,4269,14932,9807,8801,40.3,9110,8802,-107.2,9110,8805,0.9999375,9201,8806,400000.0,9001,8807,100000.0,9001,,,,,,
+32157,"NAD83 / Wyoming West Central",9001,4269,14933,9807,8801,40.3,9110,8802,-108.45,9110,8805,0.9999375,9201,8806,600000.0,9001,8807,0.0,9001,,,,,,
+32158,"NAD83 / Wyoming West",9001,4269,14934,9807,8801,40.3,9110,8802,-110.05,9110,8805,0.9999375,9201,8806,800000.0,9001,8807,100000.0,9001,,,,,,
+32161,"NAD83 / Puerto Rico & Virgin Is.",9001,4269,15230,9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,200000.0,9001,8827,200000.0,9001,,,
+32180,"NAD83 / SCoPQ zone 2",9001,4269,17700,9807,8801,0.0,9110,8802,-55.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32181,"NAD83 / MTM zone 1",9001,4269,17701,9807,8801,0.0,9102,8802,-53.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32182,"NAD83 / MTM zone 2",9001,4269,17702,9807,8801,0.0,9102,8802,-56.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32183,"NAD83 / MTM zone 3",9001,4269,17703,9807,8801,0.0,9110,8802,-58.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32184,"NAD83 / MTM zone 4",9001,4269,17704,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32185,"NAD83 / MTM zone 5",9001,4269,17705,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32186,"NAD83 / MTM zone 6",9001,4269,17706,9807,8801,0.0,9110,8802,-67.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32187,"NAD83 / MTM zone 7",9001,4269,17707,9807,8801,0.0,9110,8802,-70.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32188,"NAD83 / MTM zone 8",9001,4269,17708,9807,8801,0.0,9110,8802,-73.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32189,"NAD83 / MTM zone 9",9001,4269,17709,9807,8801,0.0,9110,8802,-76.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32190,"NAD83 / MTM zone 10",9001,4269,17710,9807,8801,0.0,9110,8802,-79.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32191,"NAD83 / MTM zone 11",9001,4269,17711,9807,8801,0.0,9110,8802,-82.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32192,"NAD83 / MTM zone 12",9001,4269,17712,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32193,"NAD83 / MTM zone 13",9001,4269,17713,9807,8801,0.0,9102,8802,-84.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32194,"NAD83 / MTM zone 14",9001,4269,17714,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32195,"NAD83 / MTM zone 15",9001,4269,17715,9807,8801,0.0,9102,8802,-90.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32196,"NAD83 / MTM zone 16",9001,4269,17716,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32197,"NAD83 / MTM zone 17",9001,4269,17717,9807,8801,0.0,9102,8802,-96.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32198,"NAD83 / Quebec Lambert",9001,4269,19944,9802,8821,44.0,9110,8822,-68.3,9110,8823,60.0,9110,8824,46.0,9110,8826,0.0,9001,8827,0.0,9001,,,
+32201,"WGS 72 / UTM zone 1N",9001,4322,16001,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32202,"WGS 72 / UTM zone 2N",9001,4322,16002,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32203,"WGS 72 / UTM zone 3N",9001,4322,16003,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32204,"WGS 72 / UTM zone 4N",9001,4322,16004,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32205,"WGS 72 / UTM zone 5N",9001,4322,16005,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32206,"WGS 72 / UTM zone 6N",9001,4322,16006,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32207,"WGS 72 / UTM zone 7N",9001,4322,16007,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32208,"WGS 72 / UTM zone 8N",9001,4322,16008,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32209,"WGS 72 / UTM zone 9N",9001,4322,16009,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32210,"WGS 72 / UTM zone 10N",9001,4322,16010,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32211,"WGS 72 / UTM zone 11N",9001,4322,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32212,"WGS 72 / UTM zone 12N",9001,4322,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32213,"WGS 72 / UTM zone 13N",9001,4322,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32214,"WGS 72 / UTM zone 14N",9001,4322,16014,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32215,"WGS 72 / UTM zone 15N",9001,4322,16015,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32216,"WGS 72 / UTM zone 16N",9001,4322,16016,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32217,"WGS 72 / UTM zone 17N",9001,4322,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32218,"WGS 72 / UTM zone 18N",9001,4322,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32219,"WGS 72 / UTM zone 19N",9001,4322,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32220,"WGS 72 / UTM zone 20N",9001,4322,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32221,"WGS 72 / UTM zone 21N",9001,4322,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32222,"WGS 72 / UTM zone 22N",9001,4322,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32223,"WGS 72 / UTM zone 23N",9001,4322,16023,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32224,"WGS 72 / UTM zone 24N",9001,4322,16024,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32225,"WGS 72 / UTM zone 25N",9001,4322,16025,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32226,"WGS 72 / UTM zone 26N",9001,4322,16026,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32227,"WGS 72 / UTM zone 27N",9001,4322,16027,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32228,"WGS 72 / UTM zone 28N",9001,4322,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32229,"WGS 72 / UTM zone 29N",9001,4322,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32230,"WGS 72 / UTM zone 30N",9001,4322,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32231,"WGS 72 / UTM zone 31N",9001,4322,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32232,"WGS 72 / UTM zone 32N",9001,4322,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32233,"WGS 72 / UTM zone 33N",9001,4322,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32234,"WGS 72 / UTM zone 34N",9001,4322,16034,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32235,"WGS 72 / UTM zone 35N",9001,4322,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32236,"WGS 72 / UTM zone 36N",9001,4322,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32237,"WGS 72 / UTM zone 37N",9001,4322,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32238,"WGS 72 / UTM zone 38N",9001,4322,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32239,"WGS 72 / UTM zone 39N",9001,4322,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32240,"WGS 72 / UTM zone 40N",9001,4322,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32241,"WGS 72 / UTM zone 41N",9001,4322,16041,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32242,"WGS 72 / UTM zone 42N",9001,4322,16042,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32243,"WGS 72 / UTM zone 43N",9001,4322,16043,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32244,"WGS 72 / UTM zone 44N",9001,4322,16044,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32245,"WGS 72 / UTM zone 45N",9001,4322,16045,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32246,"WGS 72 / UTM zone 46N",9001,4322,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32247,"WGS 72 / UTM zone 47N",9001,4322,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32248,"WGS 72 / UTM zone 48N",9001,4322,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32249,"WGS 72 / UTM zone 49N",9001,4322,16049,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32250,"WGS 72 / UTM zone 50N",9001,4322,16050,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32251,"WGS 72 / UTM zone 51N",9001,4322,16051,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32252,"WGS 72 / UTM zone 52N",9001,4322,16052,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32253,"WGS 72 / UTM zone 53N",9001,4322,16053,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32254,"WGS 72 / UTM zone 54N",9001,4322,16054,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32255,"WGS 72 / UTM zone 55N",9001,4322,16055,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32256,"WGS 72 / UTM zone 56N",9001,4322,16056,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32257,"WGS 72 / UTM zone 57N",9001,4322,16057,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32258,"WGS 72 / UTM zone 58N",9001,4322,16058,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32259,"WGS 72 / UTM zone 59N",9001,4322,16059,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32260,"WGS 72 / UTM zone 60N",9001,4322,16060,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32301,"WGS 72 / UTM zone 1S",9001,4322,16101,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32302,"WGS 72 / UTM zone 2S",9001,4322,16102,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32303,"WGS 72 / UTM zone 3S",9001,4322,16103,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32304,"WGS 72 / UTM zone 4S",9001,4322,16104,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32305,"WGS 72 / UTM zone 5S",9001,4322,16105,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32306,"WGS 72 / UTM zone 6S",9001,4322,16106,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32307,"WGS 72 / UTM zone 7S",9001,4322,16107,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32308,"WGS 72 / UTM zone 8S",9001,4322,16108,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32309,"WGS 72 / UTM zone 9S",9001,4322,16109,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32310,"WGS 72 / UTM zone 10S",9001,4322,16110,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32311,"WGS 72 / UTM zone 11S",9001,4322,16111,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32312,"WGS 72 / UTM zone 12S",9001,4322,16112,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32313,"WGS 72 / UTM zone 13S",9001,4322,16113,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32314,"WGS 72 / UTM zone 14S",9001,4322,16114,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32315,"WGS 72 / UTM zone 15S",9001,4322,16115,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32316,"WGS 72 / UTM zone 16S",9001,4322,16116,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32317,"WGS 72 / UTM zone 17S",9001,4322,16117,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32318,"WGS 72 / UTM zone 18S",9001,4322,16118,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32319,"WGS 72 / UTM zone 19S",9001,4322,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32320,"WGS 72 / UTM zone 20S",9001,4322,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32321,"WGS 72 / UTM zone 21S",9001,4322,16121,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32322,"WGS 72 / UTM zone 22S",9001,4322,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32323,"WGS 72 / UTM zone 23S",9001,4322,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32324,"WGS 72 / UTM zone 24S",9001,4322,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32325,"WGS 72 / UTM zone 25S",9001,4322,16125,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32326,"WGS 72 / UTM zone 26S",9001,4322,16126,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32327,"WGS 72 / UTM zone 27S",9001,4322,16127,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32328,"WGS 72 / UTM zone 28S",9001,4322,16128,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32329,"WGS 72 / UTM zone 29S",9001,4322,16129,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32330,"WGS 72 / UTM zone 30S",9001,4322,16130,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32331,"WGS 72 / UTM zone 31S",9001,4322,16131,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32332,"WGS 72 / UTM zone 32S",9001,4322,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32333,"WGS 72 / UTM zone 33S",9001,4322,16133,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32334,"WGS 72 / UTM zone 34S",9001,4322,16134,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32335,"WGS 72 / UTM zone 35S",9001,4322,16135,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32336,"WGS 72 / UTM zone 36S",9001,4322,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32337,"WGS 72 / UTM zone 37S",9001,4322,16137,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32338,"WGS 72 / UTM zone 38S",9001,4322,16138,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32339,"WGS 72 / UTM zone 39S",9001,4322,16139,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32340,"WGS 72 / UTM zone 40S",9001,4322,16140,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32341,"WGS 72 / UTM zone 41S",9001,4322,16141,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32342,"WGS 72 / UTM zone 42S",9001,4322,16142,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32343,"WGS 72 / UTM zone 43S",9001,4322,16143,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32344,"WGS 72 / UTM zone 44S",9001,4322,16144,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32345,"WGS 72 / UTM zone 45S",9001,4322,16145,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32346,"WGS 72 / UTM zone 46S",9001,4322,16146,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32347,"WGS 72 / UTM zone 47S",9001,4322,16147,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32348,"WGS 72 / UTM zone 48S",9001,4322,16148,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32349,"WGS 72 / UTM zone 49S",9001,4322,16149,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32350,"WGS 72 / UTM zone 50S",9001,4322,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32351,"WGS 72 / UTM zone 51S",9001,4322,16151,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32352,"WGS 72 / UTM zone 52S",9001,4322,16152,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32353,"WGS 72 / UTM zone 53S",9001,4322,16153,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32354,"WGS 72 / UTM zone 54S",9001,4322,16154,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32355,"WGS 72 / UTM zone 55S",9001,4322,16155,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32356,"WGS 72 / UTM zone 56S",9001,4322,16156,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32357,"WGS 72 / UTM zone 57S",9001,4322,16157,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32358,"WGS 72 / UTM zone 58S",9001,4322,16158,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32359,"WGS 72 / UTM zone 59S",9001,4322,16159,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32360,"WGS 72 / UTM zone 60S",9001,4322,16160,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32401,"WGS 72BE / UTM zone 1N",9001,4324,16001,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32402,"WGS 72BE / UTM zone 2N",9001,4324,16002,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32403,"WGS 72BE / UTM zone 3N",9001,4324,16003,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32404,"WGS 72BE / UTM zone 4N",9001,4324,16004,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32405,"WGS 72BE / UTM zone 5N",9001,4324,16005,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32406,"WGS 72BE / UTM zone 6N",9001,4324,16006,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32407,"WGS 72BE / UTM zone 7N",9001,4324,16007,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32408,"WGS 72BE / UTM zone 8N",9001,4324,16008,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32409,"WGS 72BE / UTM zone 9N",9001,4324,16009,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32410,"WGS 72BE / UTM zone 10N",9001,4324,16010,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32411,"WGS 72BE / UTM zone 11N",9001,4324,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32412,"WGS 72BE / UTM zone 12N",9001,4324,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32413,"WGS 72BE / UTM zone 13N",9001,4324,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32414,"WGS 72BE / UTM zone 14N",9001,4324,16014,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32415,"WGS 72BE / UTM zone 15N",9001,4324,16015,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32416,"WGS 72BE / UTM zone 16N",9001,4324,16016,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32417,"WGS 72BE / UTM zone 17N",9001,4324,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32418,"WGS 72BE / UTM zone 18N",9001,4324,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32419,"WGS 72BE / UTM zone 19N",9001,4324,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32420,"WGS 72BE / UTM zone 20N",9001,4324,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32421,"WGS 72BE / UTM zone 21N",9001,4324,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32422,"WGS 72BE / UTM zone 22N",9001,4324,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32423,"WGS 72BE / UTM zone 23N",9001,4324,16023,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32424,"WGS 72BE / UTM zone 24N",9001,4324,16024,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32425,"WGS 72BE / UTM zone 25N",9001,4324,16025,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32426,"WGS 72BE / UTM zone 26N",9001,4324,16026,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32427,"WGS 72BE / UTM zone 27N",9001,4324,16027,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32428,"WGS 72BE / UTM zone 28N",9001,4324,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32429,"WGS 72BE / UTM zone 29N",9001,4324,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32430,"WGS 72BE / UTM zone 30N",9001,4324,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32431,"WGS 72BE / UTM zone 31N",9001,4324,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32432,"WGS 72BE / UTM zone 32N",9001,4324,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32433,"WGS 72BE / UTM zone 33N",9001,4324,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32434,"WGS 72BE / UTM zone 34N",9001,4324,16034,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32435,"WGS 72BE / UTM zone 35N",9001,4324,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32436,"WGS 72BE / UTM zone 36N",9001,4324,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32437,"WGS 72BE / UTM zone 37N",9001,4324,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32438,"WGS 72BE / UTM zone 38N",9001,4324,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32439,"WGS 72BE / UTM zone 39N",9001,4324,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32440,"WGS 72BE / UTM zone 40N",9001,4324,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32441,"WGS 72BE / UTM zone 41N",9001,4324,16041,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32442,"WGS 72BE / UTM zone 42N",9001,4324,16042,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32443,"WGS 72BE / UTM zone 43N",9001,4324,16043,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32444,"WGS 72BE / UTM zone 44N",9001,4324,16044,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32445,"WGS 72BE / UTM zone 45N",9001,4324,16045,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32446,"WGS 72BE / UTM zone 46N",9001,4324,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32447,"WGS 72BE / UTM zone 47N",9001,4324,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32448,"WGS 72BE / UTM zone 48N",9001,4324,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32449,"WGS 72BE / UTM zone 49N",9001,4324,16049,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32450,"WGS 72BE / UTM zone 50N",9001,4324,16050,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32451,"WGS 72BE / UTM zone 51N",9001,4324,16051,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32452,"WGS 72BE / UTM zone 52N",9001,4324,16052,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32453,"WGS 72BE / UTM zone 53N",9001,4324,16053,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32454,"WGS 72BE / UTM zone 54N",9001,4324,16054,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32455,"WGS 72BE / UTM zone 55N",9001,4324,16055,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32456,"WGS 72BE / UTM zone 56N",9001,4324,16056,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32457,"WGS 72BE / UTM zone 57N",9001,4324,16057,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32458,"WGS 72BE / UTM zone 58N",9001,4324,16058,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32459,"WGS 72BE / UTM zone 59N",9001,4324,16059,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32460,"WGS 72BE / UTM zone 60N",9001,4324,16060,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32501,"WGS 72BE / UTM zone 1S",9001,4324,16101,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32502,"WGS 72BE / UTM zone 2S",9001,4324,16102,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32503,"WGS 72BE / UTM zone 3S",9001,4324,16103,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32504,"WGS 72BE / UTM zone 4S",9001,4324,16104,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32505,"WGS 72BE / UTM zone 5S",9001,4324,16105,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32506,"WGS 72BE / UTM zone 6S",9001,4324,16106,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32507,"WGS 72BE / UTM zone 7S",9001,4324,16107,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32508,"WGS 72BE / UTM zone 8S",9001,4324,16108,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32509,"WGS 72BE / UTM zone 9S",9001,4324,16109,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32510,"WGS 72BE / UTM zone 10S",9001,4324,16110,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32511,"WGS 72BE / UTM zone 11S",9001,4324,16111,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32512,"WGS 72BE / UTM zone 12S",9001,4324,16112,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32513,"WGS 72BE / UTM zone 13S",9001,4324,16113,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32514,"WGS 72BE / UTM zone 14S",9001,4324,16114,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32515,"WGS 72BE / UTM zone 15S",9001,4324,16115,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32516,"WGS 72BE / UTM zone 16S",9001,4324,16116,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32517,"WGS 72BE / UTM zone 17S",9001,4324,16117,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32518,"WGS 72BE / UTM zone 18S",9001,4324,16118,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32519,"WGS 72BE / UTM zone 19S",9001,4324,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32520,"WGS 72BE / UTM zone 20S",9001,4324,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32521,"WGS 72BE / UTM zone 21S",9001,4324,16121,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32522,"WGS 72BE / UTM zone 22S",9001,4324,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32523,"WGS 72BE / UTM zone 23S",9001,4324,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32524,"WGS 72BE / UTM zone 24S",9001,4324,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32525,"WGS 72BE / UTM zone 25S",9001,4324,16125,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32526,"WGS 72BE / UTM zone 26S",9001,4324,16126,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32527,"WGS 72BE / UTM zone 27S",9001,4324,16127,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32528,"WGS 72BE / UTM zone 28S",9001,4324,16128,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32529,"WGS 72BE / UTM zone 29S",9001,4324,16129,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32530,"WGS 72BE / UTM zone 30S",9001,4324,16130,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32531,"WGS 72BE / UTM zone 31S",9001,4324,16131,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32532,"WGS 72BE / UTM zone 32S",9001,4324,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32533,"WGS 72BE / UTM zone 33S",9001,4324,16133,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32534,"WGS 72BE / UTM zone 34S",9001,4324,16134,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32535,"WGS 72BE / UTM zone 35S",9001,4324,16135,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32536,"WGS 72BE / UTM zone 36S",9001,4324,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32537,"WGS 72BE / UTM zone 37S",9001,4324,16137,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32538,"WGS 72BE / UTM zone 38S",9001,4324,16138,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32539,"WGS 72BE / UTM zone 39S",9001,4324,16139,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32540,"WGS 72BE / UTM zone 40S",9001,4324,16140,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32541,"WGS 72BE / UTM zone 41S",9001,4324,16141,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32542,"WGS 72BE / UTM zone 42S",9001,4324,16142,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32543,"WGS 72BE / UTM zone 43S",9001,4324,16143,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32544,"WGS 72BE / UTM zone 44S",9001,4324,16144,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32545,"WGS 72BE / UTM zone 45S",9001,4324,16145,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32546,"WGS 72BE / UTM zone 46S",9001,4324,16146,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32547,"WGS 72BE / UTM zone 47S",9001,4324,16147,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32548,"WGS 72BE / UTM zone 48S",9001,4324,16148,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32549,"WGS 72BE / UTM zone 49S",9001,4324,16149,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32550,"WGS 72BE / UTM zone 50S",9001,4324,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32551,"WGS 72BE / UTM zone 51S",9001,4324,16151,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32552,"WGS 72BE / UTM zone 52S",9001,4324,16152,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32553,"WGS 72BE / UTM zone 53S",9001,4324,16153,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32554,"WGS 72BE / UTM zone 54S",9001,4324,16154,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32555,"WGS 72BE / UTM zone 55S",9001,4324,16155,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32556,"WGS 72BE / UTM zone 56S",9001,4324,16156,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32557,"WGS 72BE / UTM zone 57S",9001,4324,16157,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32558,"WGS 72BE / UTM zone 58S",9001,4324,16158,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32559,"WGS 72BE / UTM zone 59S",9001,4324,16159,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32560,"WGS 72BE / UTM zone 60S",9001,4324,16160,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32600,"WGS 84 / UTM grid system (northern hemisphere)",9001,4326,16000,9824,8801,0.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,8830,-180.0,9102,8831,6.0,9102,,,
+32601,"WGS 84 / UTM zone 1N",9001,4326,16001,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32602,"WGS 84 / UTM zone 2N",9001,4326,16002,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32603,"WGS 84 / UTM zone 3N",9001,4326,16003,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32604,"WGS 84 / UTM zone 4N",9001,4326,16004,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32605,"WGS 84 / UTM zone 5N",9001,4326,16005,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32606,"WGS 84 / UTM zone 6N",9001,4326,16006,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32607,"WGS 84 / UTM zone 7N",9001,4326,16007,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32608,"WGS 84 / UTM zone 8N",9001,4326,16008,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32609,"WGS 84 / UTM zone 9N",9001,4326,16009,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32610,"WGS 84 / UTM zone 10N",9001,4326,16010,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32611,"WGS 84 / UTM zone 11N",9001,4326,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32612,"WGS 84 / UTM zone 12N",9001,4326,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32613,"WGS 84 / UTM zone 13N",9001,4326,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32614,"WGS 84 / UTM zone 14N",9001,4326,16014,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32615,"WGS 84 / UTM zone 15N",9001,4326,16015,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32616,"WGS 84 / UTM zone 16N",9001,4326,16016,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32617,"WGS 84 / UTM zone 17N",9001,4326,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32618,"WGS 84 / UTM zone 18N",9001,4326,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32619,"WGS 84 / UTM zone 19N",9001,4326,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32620,"WGS 84 / UTM zone 20N",9001,4326,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32621,"WGS 84 / UTM zone 21N",9001,4326,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32622,"WGS 84 / UTM zone 22N",9001,4326,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32623,"WGS 84 / UTM zone 23N",9001,4326,16023,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32624,"WGS 84 / UTM zone 24N",9001,4326,16024,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32625,"WGS 84 / UTM zone 25N",9001,4326,16025,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32626,"WGS 84 / UTM zone 26N",9001,4326,16026,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32627,"WGS 84 / UTM zone 27N",9001,4326,16027,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32628,"WGS 84 / UTM zone 28N",9001,4326,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32629,"WGS 84 / UTM zone 29N",9001,4326,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32630,"WGS 84 / UTM zone 30N",9001,4326,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32631,"WGS 84 / UTM zone 31N",9001,4326,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32632,"WGS 84 / UTM zone 32N",9001,4326,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32633,"WGS 84 / UTM zone 33N",9001,4326,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32634,"WGS 84 / UTM zone 34N",9001,4326,16034,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32635,"WGS 84 / UTM zone 35N",9001,4326,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32636,"WGS 84 / UTM zone 36N",9001,4326,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32637,"WGS 84 / UTM zone 37N",9001,4326,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32638,"WGS 84 / UTM zone 38N",9001,4326,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32639,"WGS 84 / UTM zone 39N",9001,4326,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32640,"WGS 84 / UTM zone 40N",9001,4326,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32641,"WGS 84 / UTM zone 41N",9001,4326,16041,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32642,"WGS 84 / UTM zone 42N",9001,4326,16042,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32643,"WGS 84 / UTM zone 43N",9001,4326,16043,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32644,"WGS 84 / UTM zone 44N",9001,4326,16044,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32645,"WGS 84 / UTM zone 45N",9001,4326,16045,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32646,"WGS 84 / UTM zone 46N",9001,4326,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32647,"WGS 84 / UTM zone 47N",9001,4326,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32648,"WGS 84 / UTM zone 48N",9001,4326,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32649,"WGS 84 / UTM zone 49N",9001,4326,16049,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32650,"WGS 84 / UTM zone 50N",9001,4326,16050,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32651,"WGS 84 / UTM zone 51N",9001,4326,16051,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32652,"WGS 84 / UTM zone 52N",9001,4326,16052,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32653,"WGS 84 / UTM zone 53N",9001,4326,16053,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32654,"WGS 84 / UTM zone 54N",9001,4326,16054,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32655,"WGS 84 / UTM zone 55N",9001,4326,16055,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32656,"WGS 84 / UTM zone 56N",9001,4326,16056,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32657,"WGS 84 / UTM zone 57N",9001,4326,16057,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32658,"WGS 84 / UTM zone 58N",9001,4326,16058,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32659,"WGS 84 / UTM zone 59N",9001,4326,16059,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32660,"WGS 84 / UTM zone 60N",9001,4326,16060,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32661,"WGS 84 / UPS North",9001,4326,16061,9810,8801,90.0,9102,8802,0.0,9102,8805,0.994,9201,8806,2000000.0,9001,8807,2000000.0,9001,,,,,,
+32662,"WGS 84 / Plate Carree",9001,4326,19968,9823,8801,0.0,9102,8802,0.0,9102,,,,,,,,,,,,,,,
+32700,"WGS 84 / UTM grid system (southern hemisphere)",9001,4326,16100,9824,8801,0.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,8830,-180.0,9102,8831,6.0,9102,,,
+32701,"WGS 84 / UTM zone 1S",9001,4326,16101,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32702,"WGS 84 / UTM zone 2S",9001,4326,16102,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32703,"WGS 84 / UTM zone 3S",9001,4326,16103,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32704,"WGS 84 / UTM zone 4S",9001,4326,16104,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32705,"WGS 84 / UTM zone 5S",9001,4326,16105,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32706,"WGS 84 / UTM zone 6S",9001,4326,16106,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32707,"WGS 84 / UTM zone 7S",9001,4326,16107,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32708,"WGS 84 / UTM zone 8S",9001,4326,16108,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32709,"WGS 84 / UTM zone 9S",9001,4326,16109,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32710,"WGS 84 / UTM zone 10S",9001,4326,16110,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32711,"WGS 84 / UTM zone 11S",9001,4326,16111,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32712,"WGS 84 / UTM zone 12S",9001,4326,16112,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32713,"WGS 84 / UTM zone 13S",9001,4326,16113,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32714,"WGS 84 / UTM zone 14S",9001,4326,16114,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32715,"WGS 84 / UTM zone 15S",9001,4326,16115,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32716,"WGS 84 / UTM zone 16S",9001,4326,16116,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32717,"WGS 84 / UTM zone 17S",9001,4326,16117,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32718,"WGS 84 / UTM zone 18S",9001,4326,16118,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32719,"WGS 84 / UTM zone 19S",9001,4326,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32720,"WGS 84 / UTM zone 20S",9001,4326,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32721,"WGS 84 / UTM zone 21S",9001,4326,16121,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32722,"WGS 84 / UTM zone 22S",9001,4326,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32723,"WGS 84 / UTM zone 23S",9001,4326,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32724,"WGS 84 / UTM zone 24S",9001,4326,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32725,"WGS 84 / UTM zone 25S",9001,4326,16125,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32726,"WGS 84 / UTM zone 26S",9001,4326,16126,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32727,"WGS 84 / UTM zone 27S",9001,4326,16127,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32728,"WGS 84 / UTM zone 28S",9001,4326,16128,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32729,"WGS 84 / UTM zone 29S",9001,4326,16129,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32730,"WGS 84 / UTM zone 30S",9001,4326,16130,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32731,"WGS 84 / UTM zone 31S",9001,4326,16131,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32732,"WGS 84 / UTM zone 32S",9001,4326,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32733,"WGS 84 / UTM zone 33S",9001,4326,16133,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32734,"WGS 84 / UTM zone 34S",9001,4326,16134,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32735,"WGS 84 / UTM zone 35S",9001,4326,16135,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32736,"WGS 84 / UTM zone 36S",9001,4326,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32737,"WGS 84 / UTM zone 37S",9001,4326,16137,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32738,"WGS 84 / UTM zone 38S",9001,4326,16138,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32739,"WGS 84 / UTM zone 39S",9001,4326,16139,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32740,"WGS 84 / UTM zone 40S",9001,4326,16140,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32741,"WGS 84 / UTM zone 41S",9001,4326,16141,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32742,"WGS 84 / UTM zone 42S",9001,4326,16142,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32743,"WGS 84 / UTM zone 43S",9001,4326,16143,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32744,"WGS 84 / UTM zone 44S",9001,4326,16144,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32745,"WGS 84 / UTM zone 45S",9001,4326,16145,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32746,"WGS 84 / UTM zone 46S",9001,4326,16146,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32747,"WGS 84 / UTM zone 47S",9001,4326,16147,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32748,"WGS 84 / UTM zone 48S",9001,4326,16148,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32749,"WGS 84 / UTM zone 49S",9001,4326,16149,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32750,"WGS 84 / UTM zone 50S",9001,4326,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32751,"WGS 84 / UTM zone 51S",9001,4326,16151,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32752,"WGS 84 / UTM zone 52S",9001,4326,16152,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32753,"WGS 84 / UTM zone 53S",9001,4326,16153,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32754,"WGS 84 / UTM zone 54S",9001,4326,16154,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32755,"WGS 84 / UTM zone 55S",9001,4326,16155,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32756,"WGS 84 / UTM zone 56S",9001,4326,16156,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32757,"WGS 84 / UTM zone 57S",9001,4326,16157,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32758,"WGS 84 / UTM zone 58S",9001,4326,16158,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32759,"WGS 84 / UTM zone 59S",9001,4326,16159,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32760,"WGS 84 / UTM zone 60S",9001,4326,16160,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32761,"WGS 84 / UPS South",9001,4326,16161,9810,8801,-90.0,9102,8802,0.0,9102,8805,0.994,9201,8806,2000000.0,9001,8807,2000000.0,9001,,,,,,
+32766,"WGS 84 / TM 36 SE",9001,4326,16636,9807,8801,0.0,9102,8802,36.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
diff --git a/src/tiff/csv/prime_meridian.csv b/src/tiff/csv/prime_meridian.csv
new file mode 100644
index 0000000..3991922
--- /dev/null
+++ b/src/tiff/csv/prime_meridian.csv
@@ -0,0 +1,14 @@
+"PRIME_MERIDIAN_CODE","PRIME_MERIDIAN_NAME","GREENWICH_LONGITUDE","UOM_CODE","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+8901,Greenwich,0.0,9110,,,EPSG,1995-06-02 00:00:00,96.29,0
+8902,Lisbon,-9.0754862,9110,,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,96.29,0
+8903,Paris,2.5969213,9105,Value adopted by IGN (Paris) in 1936. Equivalent to 2 deg 20min 14.025sec. Preferred by EPSG to earlier value of 2deg 20min 13.95sec (2.596898 grads) used by RGS London.,Institut Geographique National (IGN); Paris,EPSG,1995-06-02 00:00:00,,0
+8904,Bogota,-74.04513,9110,,"Instituto Geografico ""Augustin Cadazzi"" (IGAC); Bogota",EPSG,1995-06-02 00:00:00,96.29,0
+8905,Madrid,-3.411658,9110,,,EPSG,1995-06-02 00:00:00,96.29,0
+8906,Rome,12.27084,9110,,,EPSG,1995-06-02 00:00:00,96.29,0
+8907,Bern,7.26225,9110,1895 value. Newer value of 7 deg 26 min 22.335 sec E determined in 1938.,Bundesamt f�r Landestopographie,EPSG,1995-06-02 00:00:00,96.29,0
+8908,Jakarta,106.482779,9110,,,EPSG,1995-06-02 00:00:00,96.29,0
+8909,Ferro,-17.4,9110,Used in Austria and former Czechoslovakia.,,EPSG,1995-06-02 00:00:00,96.29,0
+8910,Brussels,4.220471,9110,,,EPSG,1995-06-02 00:00:00,96.29,0
+8911,Stockholm,18.03298,9110,,,EPSG,1995-06-02 00:00:00,96.29,0
+8912,Athens,23.4258815,9110,Used in Greece for older mapping based on Hatt projection.,Topography Department; National Technical University of Athens.,EPSG,1997-06-16 00:00:00,,0
+8913,Oslo,10.43225,9110,Formerly known as Kristiania or Christiania.,Statens Kartverk - Geodesidivisjonen,EPSG,1999-10-20 00:00:00,,0
diff --git a/src/tiff/csv/projop_wparm.csv b/src/tiff/csv/projop_wparm.csv
new file mode 100644
index 0000000..092d7b6
--- /dev/null
+++ b/src/tiff/csv/projop_wparm.csv
@@ -0,0 +1,1083 @@
+"COORD_OP_CODE","COORD_OP_NAME","COORD_OP_METHOD_CODE","PARAMETER_CODE_1","PARAMETER_VALUE_1","PARAMETER_UOM_1","PARAMETER_CODE_2","PARAMETER_VALUE_2","PARAMETER_UOM_2","PARAMETER_CODE_3","PARAMETER_VALUE_3","PARAMETER_UOM_3","PARAMETER_CODE_4","PARAMETER_VALUE_4","PARAMETER_UOM_4","PARAMETER_CODE_5","PARAMETER_VALUE_5","PARAMETER_UOM_5","PARAMETER_CODE_6","PARAMETER_VALUE_6","PARAMETER_UOM_6","PARAMETER_CODE_7","PARAMETER_VALUE_7","PARAMETER_UOM_7"
+10101,Alabama CS27 East zone,9807,8801,30.3,9110,8802,-85.5,9110,8805,0.99996,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10102,Alabama CS27 West zone,9807,8801,30.0,9110,8802,-87.3,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10131,"SPCS83 Alabama East zone (meters)",9807,8801,30.3,9110,8802,-85.5,9110,8805,0.99996,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+10132,"SPCS83 Alabama West zone (meters)",9807,8801,30.0,9110,8802,-87.3,9110,8805,0.999933333,9201,8806,600000.0,9001,8807,0.0,9001,,,,,,
+10201,Arizona Coordinate System East zone,9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10202,Arizona Coordinate System Central zone,9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10203,Arizona Coordinate System West zone,9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10231,"SPCS83 Arizona East zone (meters)",9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+10232,"SPCS83 Arizona Central zone (meters)",9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+10233,"SPCS83 Arizona West zone (meters)",9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+10301,Arkansas CS27 North,9802,8821,34.2,9110,8822,-92.0,9110,8823,36.14,9110,8824,34.56,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10302,Arkansas CS27 South,9802,8821,32.4,9110,8822,-92.0,9110,8823,34.46,9110,8824,33.18,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10331,"SPCS83 Arkansas North zone (meters)",9802,8821,34.2,9110,8822,-92.0,9110,8823,36.14,9110,8824,34.56,9110,8826,400000.0,9001,8827,0.0,9001,,,
+10332,"SPCS83 Arkansas South zone (meters)",9802,8821,32.4,9110,8822,-92.0,9110,8823,34.46,9110,8824,33.18,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+10401,California CS27 zone I,9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10402,California CS27 zone II,9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10403,California CS27 zone III,9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10404,California CS27 zone IV,9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10405,California CS27 zone V,9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10406,California CS27 zone VI,9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10407,California CS27 zone VII,9802,8821,34.08,9110,8822,-118.2,9110,8823,34.25,9110,8824,33.52,9110,8826,4186692.58,9003,8827,416926.74,9003,,,
+10431,"SPCS83 California zone 1 (meters)",9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+10432,"SPCS83 California zone 2 (meters)",9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+10433,"SPCS83 California zone 3 (meters)",9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+10434,"SPCS83 California zone 4 (meters)",9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+10435,"SPCS83 California zone 5 (meters)",9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+10436,"SPCS83 California zone 6 (meters)",9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+10501,Colorado CS27 North zone,9802,8821,39.2,9110,8822,-105.3,9110,8823,39.43,9110,8824,40.47,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10502,Colorado CS27 Central zone,9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10503,Colorado CS27 South zone,9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10531,"SPCS83 Colorado North zone (meters)",9802,8821,39.2,9110,8822,-105.3,9110,8823,40.47,9110,8824,39.43,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+10532,"SPCS83 Colorado Central zone (meters)",9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+10533,"SPCS83 Colorado South zone (meters)",9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+10600,Connecticut CS27,9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,600000.0,9003,8827,0.0,9003,,,
+10630,"SPCS83 Connecticut zone (meters)",9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,304800.6096,9001,8827,152400.3048,9001,,,
+10700,Delaware CS27,9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10730,"SPCS83 Delaware zone (meters)",9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+10901,Florida CS27 East zone,9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10902,Florida CS27 West zone,9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10903,Florida CS27 North zone,9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10931,"SPCS83 Florida East zone (meters)",9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+10932,"SPCS83 Florida West zone (meters)",9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+10933,"SPCS83 Florida North zone (meters)",9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,600000.0,9001,8827,0.0,9001,,,
+11001,Georgia CS27 East zone,9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11002,Georgia CS27 West zone,9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11031,"SPCS83 Georgia East zone (meters)",9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+11032,"SPCS83 Georgia West zone (meters)",9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+11101,Idaho CS27 East zone,9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11102,Idaho CS27 Central zone,9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11103,Idaho CS27 West zone,9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11131,"SPCS83 Idaho East zone (meters)",9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+11132,"SPCS83 Idaho Central zone (meters)",9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+11133,"SPCS83 Idaho West zone (meters)",9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,800000.0,9001,8807,0.0,9001,,,,,,
+11201,Illinois CS27 East zone,9807,8801,36.4,9110,8802,-88.2,9110,8805,0.999975,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11202,Illinois CS27 West zone,9807,8801,36.4,9110,8802,-90.1,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11231,"SPCS83 Illinois East zone (meters)",9807,8801,36.4,9110,8802,-88.2,9110,8805,0.999975,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+11232,"SPCS83 Illinois West zone (meters)",9807,8801,36.4,9110,8802,-90.1,9110,8805,0.999941177,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+11301,Indiana CS27 East zone,9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11302,Indiana CS27 West zone,9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11331,"SPCS83 Indiana East zone (meters)",9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,100000.0,9001,8807,250000.0,9001,,,,,,
+11332,"SPCS83 Indiana West zone (meters)",9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,900000.0,9001,8807,250000.0,9001,,,,,,
+11401,Iowa CS27 North zone,9802,8821,41.3,9110,8822,-93.3,9110,8823,43.16,9110,8824,42.04,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11402,Iowa CS27 South zone,9802,8821,40.0,9110,8822,-93.3,9110,8823,41.47,9110,8824,40.37,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11431,"SPCS83 Iowa North zone (meters)",9802,8821,41.3,9110,8822,-93.3,9110,8823,43.16,9110,8824,42.04,9110,8826,1500000.0,9001,8827,1000000.0,9001,,,
+11432,"SPCS83 Iowa South zone (meters)",9802,8821,40.0,9110,8822,-93.3,9110,8823,41.47,9110,8824,40.37,9110,8826,500000.0,9001,8827,0.0,9001,,,
+11501,Kansas CS27 North zone,9802,8821,38.2,9110,8822,-98.0,9110,8823,39.47,9110,8824,38.43,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11502,Kansas CS27 South zone,9802,8821,36.4,9110,8822,-98.3,9110,8823,38.34,9110,8824,37.16,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11531,"SPCS83 Kansas North zone (meters)",9802,8821,38.2,9110,8822,-98.0,9110,8823,39.47,9110,8824,38.43,9110,8826,400000.0,9001,8827,0.0,9001,,,
+11532,"SPCS83 Kansas South zone (meters)",9802,8821,36.4,9110,8822,-98.3,9110,8823,38.34,9110,8824,37.16,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+11601,Kentucky CS27 North zone,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11602,Kentucky CS27 South zone,9802,8821,36.2,9110,8822,-85.45,9110,8823,36.44,9110,8824,37.56,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11631,Kentucky CS83 North zone,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,37.58,9110,8826,500000.0,9001,8827,0.0,9001,,,
+11632,"SPCS83 Kentucky South zone (meters)",9802,8821,36.2,9110,8822,-85.45,9110,8823,37.56,9110,8824,36.44,9110,8826,500000.0,9001,8827,500000.0,9001,,,
+11701,Louisiana CS27 North zone,9802,8821,30.4,9110,8822,-92.3,9110,8823,31.1,9110,8824,32.4,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11702,Louisiana CS27 South zone,9802,8821,28.4,9110,8822,-91.2,9110,8823,29.18,9110,8824,30.42,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11731,"SPCS83 Louisiana North zone (meters)",9802,8821,30.3,9110,8822,-92.3,9110,8823,32.4,9110,8824,31.1,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+11732,"SPCS83 Louisiana South zone (meters)",9802,8821,28.3,9110,8822,-91.2,9110,8823,30.42,9110,8824,29.18,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+11801,Maine CS27 East zone,9807,8801,43.5,9110,8802,-68.3,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11802,Maine CS27 West zone,9807,8801,42.5,9110,8802,-70.1,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11831,"SPCS83 Maine East zone (meters)",9807,8801,43.4,9110,8802,-68.3,9110,8805,0.9999,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+11832,"SPCS83 Maine West zone (meters)",9807,8801,42.5,9110,8802,-70.1,9110,8805,0.999966667,9201,8806,900000.0,9001,8807,0.0,9001,,,,,,
+11900,Maryland CS27,9802,8821,37.5,9110,8822,-77.0,9110,8823,38.18,9110,8824,39.27,9110,8826,800000.0,9003,8827,0.0,9003,,,
+11930,"SPCS83 Maryland zone (meters)",9802,8821,37.4,9110,8822,-77.0,9110,8823,39.27,9110,8824,38.18,9110,8826,400000.0,9001,8827,0.0,9001,,,
+12001,Massachusetts CS27 Mainland zone,9802,8821,41.0,9110,8822,-71.3,9110,8823,41.43,9110,8824,42.41,9110,8826,600000.0,9003,8827,0.0,9003,,,
+12002,Massachusetts CS27 Island zone,9802,8821,41.0,9110,8822,-70.3,9110,8823,41.17,9110,8824,41.29,9110,8826,200000.0,9003,8827,0.0,9003,,,
+12031,"SPCS83 Massachusetts Mainland zone (meters)",9802,8821,41.0,9110,8822,-71.3,9110,8823,42.41,9110,8824,41.43,9110,8826,200000.0,9001,8827,750000.0,9001,,,
+12032,"SPCS83 Massachusetts Island zone (meters)",9802,8821,41.0,9110,8822,-70.3,9110,8823,41.29,9110,8824,41.17,9110,8826,500000.0,9001,8827,0.0,9001,,,
+12101,Michigan State Plane East zone,9807,8801,41.3,9110,8802,-83.4,9110,8805,0.999942857,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12102,Michigan State Plane Old Central zone,9807,8801,41.3,9110,8802,-85.45,9110,8805,0.999909091,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12103,Michigan State Plane West zone,9807,8801,41.3,9110,8802,-88.45,9110,8805,0.999909091,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12111,Michigan CS27 North zone,9802,8821,44.47,9110,8822,-87.0,9110,8823,45.29,9110,8824,47.05,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12112,Michigan CS27 Central zone,9802,8821,43.19,9110,8822,-84.2,9110,8823,44.11,9110,8824,45.42,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12113,Michigan CS27 South zone,9802,8821,41.3,9110,8822,-84.2,9110,8823,42.06,9110,8824,43.4,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12141,"SPCS83 Michigan North zone (meters)",9802,8821,44.47,9110,8822,-87.0,9110,8823,47.05,9110,8824,45.29,9110,8826,8000000.0,9001,8827,0.0,9001,,,
+12142,"SPCS83 Michigan Central zone (meters)",9802,8821,43.19,9110,8822,-84.22,9110,8823,45.42,9110,8824,44.11,9110,8826,6000000.0,9001,8827,0.0,9001,,,
+12143,"SPCS83 Michigan South zone (meters)",9802,8821,41.3,9110,8822,-84.22,9110,8823,43.4,9110,8824,42.06,9110,8826,4000000.0,9001,8827,0.0,9001,,,
+12201,Minnesota CS27 North zone,9802,8821,46.3,9110,8822,-93.06,9110,8823,47.02,9110,8824,48.38,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12202,Minnesota CS27 Central zone,9802,8821,45.0,9110,8822,-94.15,9110,8823,45.37,9110,8824,47.03,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12203,Minnesota CS27 South zone,9802,8821,43.0,9110,8822,-94.0,9110,8823,43.47,9110,8824,45.13,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12231,"SPCS83 Minnesota North zone (meters)",9802,8821,46.3,9110,8822,-93.06,9110,8823,48.38,9110,8824,47.02,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+12232,"SPCS83 Minnesota Central zone (meters)",9802,8821,45.0,9110,8822,-94.15,9110,8823,47.03,9110,8824,45.37,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+12233,"SPCS83 Minnesota South zone (meters)",9802,8821,43.0,9110,8822,-94.0,9110,8823,45.13,9110,8824,43.47,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+12301,Mississippi CS27 East zone,9807,8801,29.4,9110,8802,-88.5,9110,8805,0.99996,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12302,Mississippi CS27 West zone,9807,8801,30.3,9110,8802,-90.2,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12331,"SPCS83 Mississippi East zone (meters)",9807,8801,29.3,9110,8802,-88.5,9110,8805,0.99995,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+12332,"SPCS83 Mississippi West zone (meters)",9807,8801,29.3,9110,8802,-90.2,9110,8805,0.99995,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+12401,Missouri CS27 East zone,9807,8801,35.5,9110,8802,-90.3,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12402,Missouri CS27 Central zone,9807,8801,35.5,9110,8802,-92.3,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12403,Missouri CS27 West zone,9807,8801,36.1,9110,8802,-94.3,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12431,"SPCS83 Missouri East zone (meters)",9807,8801,35.5,9110,8802,-90.3,9110,8805,0.999933333,9201,8806,250000.0,9001,8807,0.0,9001,,,,,,
+12432,"SPCS83 Missouri Central zone (meters)",9807,8801,35.5,9110,8802,-92.3,9110,8805,0.999933333,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+12433,"SPCS83 Missouri West zone (meters)",9807,8801,36.1,9110,8802,-94.3,9110,8805,0.999941177,9201,8806,850000.0,9001,8807,0.0,9001,,,,,,
+12501,Montana CS27 North zone,9802,8821,47.0,9110,8822,-109.3,9110,8823,48.43,9110,8824,47.51,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12502,Montana CS27 Central zone,9802,8821,45.5,9110,8822,-109.3,9110,8823,47.53,9110,8824,46.27,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12503,Montana CS27 South zone,9802,8821,44.0,9110,8822,-109.3,9110,8823,46.24,9110,8824,44.52,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12530,"SPCS83 Montana zone (meters)",9802,8821,44.15,9110,8822,-109.3,9110,8823,49.0,9110,8824,45.0,9110,8826,600000.0,9001,8827,0.0,9001,,,
+12601,Nebraska CS27 North zone,9802,8821,41.2,9110,8822,-100.0,9110,8823,41.51,9110,8824,42.49,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12602,Nebraska CS27 South zone,9802,8821,39.4,9110,8822,-99.3,9110,8823,40.17,9110,8824,41.43,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12630,"SPCS83 Nebraska zone (meters)",9802,8821,39.5,9110,8822,-100.0,9110,8823,43.0,9110,8824,40.0,9110,8826,500000.0,9001,8827,0.0,9001,,,
+12701,Nevada CS27 East zone,9807,8801,34.45,9110,8802,-115.35,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12702,Nevada CS27 Central zone,9807,8801,34.45,9110,8802,-116.4,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12703,Nevada CS27 West zone,9807,8801,34.45,9110,8802,-118.35,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12731,"SPCS83 Nevada East zone (meters)",9807,8801,34.45,9110,8802,-115.35,9110,8805,0.9999,9201,8806,200000.0,9001,8807,8000000.0,9001,,,,,,
+12732,"SPCS83 Nevada Central zone (meters)",9807,8801,34.45,9110,8802,-116.4,9110,8805,0.9999,9201,8806,500000.0,9001,8807,6000000.0,9001,,,,,,
+12733,"SPCS83 Nevada West zone (meters)",9807,8801,34.45,9110,8802,-118.35,9110,8805,0.9999,9201,8806,800000.0,9001,8807,4000000.0,9001,,,,,,
+12800,New Hampshire CS27,9807,8801,42.3,9110,8802,-71.4,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12830,"SPCS83 New Hampshire zone (meters)",9807,8801,42.3,9110,8802,-71.4,9110,8805,0.999966667,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+12900,New Jersey CS27,9807,8801,38.5,9110,8802,-74.4,9110,8805,0.999975,9201,8806,2000000.0,9003,8807,0.0,9003,,,,,,
+12930,"SPCS83 New Jersey zone (meters)",9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+13001,New Mexico CS27 East zone,9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13002,New Mexico CS27 Central zone,9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13003,New Mexico CS27 West zone,9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13031,"SPCS83 New Mexico East zone (meters)",9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,165000.0,9001,8807,0.0,9001,,,,,,
+13032,"SPCS83 New Mexico Central zone (meters)",9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+13033,"SPCS83 New Mexico West zone (meters)",9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,830000.0,9001,8807,0.0,9001,,,,,,
+13101,New York CS27 East zone,9807,8801,40.0,9110,8802,-74.2,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13102,New York CS27 Central zone,9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13103,New York CS27 West zone,9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13104,New York CS27 Long Island zone,9802,8821,40.3,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,1000000.0,9003,8827,0.0,9003,,,
+13131,"SPCS83 New York East zone (meters)",9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+13132,"SPCS83 New York Central zone (meters)",9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,250000.0,9001,8807,0.0,9001,,,,,,
+13133,"SPCS83 New York West zone (meters)",9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,350000.0,9001,8807,0.0,9001,,,,,,
+13134,"SPCS83 New York Long Island zone (meters)",9802,8821,40.1,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,300000.0,9001,8827,0.0,9001,,,
+13200,North Carolina CS27,9802,8821,33.45,9110,8822,-79.0,9110,8823,34.2,9110,8824,36.1,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13230,"SPCS83 North Carolina zone (meters)",9802,8821,33.45,9110,8822,-79.0,9110,8823,36.1,9110,8824,34.2,9110,8826,609601.22,9001,8827,0.0,9001,,,
+13301,North Dakota CS27 North zone,9802,8821,47.0,9110,8822,-100.3,9110,8823,47.26,9110,8824,48.44,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13302,North Dakota CS27 South zone,9802,8821,45.4,9110,8822,-100.3,9110,8823,46.11,9110,8824,47.29,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13331,"SPCS83 North Dakota North zone (meters)",9802,8821,47.0,9110,8822,-100.3,9110,8823,48.44,9110,8824,47.26,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13332,"SPCS83 North Dakota South zone (meters)",9802,8821,45.4,9110,8822,-100.3,9110,8823,47.29,9110,8824,46.11,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13401,Ohio CS27 North zone,9802,8821,39.4,9110,8822,-82.3,9110,8823,40.26,9110,8824,41.42,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13402,Ohio CS27 South zone,9802,8821,38.0,9110,8822,-82.3,9110,8823,38.44,9110,8824,40.02,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13431,"SPCS83 Ohio North zone (meters)",9802,8821,39.4,9110,8822,-82.3,9110,8823,41.42,9110,8824,40.26,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13432,"SPCS83 Ohio South zone (meters)",9802,8821,38.0,9110,8822,-82.3,9110,8823,40.02,9110,8824,38.44,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13501,Oklahoma CS27 North zone,9802,8821,35.0,9110,8822,-98.0,9110,8823,35.34,9110,8824,36.46,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13502,Oklahoma CS27 South zone,9802,8821,33.2,9110,8822,-98.0,9110,8823,33.56,9110,8824,35.14,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13531,"SPCS83 Oklahoma North zone (meters)",9802,8821,35.0,9110,8822,-98.0,9110,8823,36.46,9110,8824,35.34,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13532,"SPCS83 Oklahoma South zone (meters)",9802,8821,33.2,9110,8822,-98.0,9110,8823,35.14,9110,8824,33.56,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13601,Oregon CS27 North zone,9802,8821,43.4,9110,8822,-120.3,9110,8823,44.2,9110,8824,46.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13602,Oregon CS27 South zone,9802,8821,41.4,9110,8822,-120.3,9110,8823,42.2,9110,8824,44.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13631,"SPCS83 Oregon North zone (meters)",9802,8821,43.4,9110,8822,-120.3,9110,8823,46.0,9110,8824,44.2,9110,8826,2500000.0,9001,8827,0.0,9001,,,
+13632,"SPCS83 Oregon South zone (meters)",9802,8821,41.4,9110,8822,-120.3,9110,8823,44.0,9110,8824,42.2,9110,8826,1500000.0,9001,8827,0.0,9001,,,
+13701,Pennsylvania CS27 North zone,9802,8821,40.1,9110,8822,-77.45,9110,8823,40.53,9110,8824,41.57,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13702,Pennsylvania CS27 South zone,9802,8821,39.2,9110,8822,-77.45,9110,8823,39.56,9110,8824,40.48,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13731,"SPCS83 Pennsylvania North zone (meters)",9802,8821,40.1,9110,8822,-77.45,9110,8823,41.57,9110,8824,40.53,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13732,"SPCS83 Pennsylvania South zone (meters)",9802,8821,39.2,9110,8822,-77.45,9110,8823,40.58,9110,8824,39.56,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13800,Rhode Island CS27,9807,8801,41.05,9110,8802,-71.3,9110,8805,0.9999938,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13830,"SPCS83 Rhode Island zone (meters)",9807,8801,41.05,9110,8802,-71.3,9110,8805,0.99999375,9201,8806,100000.0,9001,8807,0.0,9001,,,,,,
+13901,South Carolina CS27 North zone,9802,8821,33.0,9110,8822,-81.0,9110,8823,33.46,9110,8824,34.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13902,South Carolina CS27 South zone,9802,8821,31.5,9110,8822,-81.0,9110,8823,32.2,9110,8824,33.4,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13930,"SPCS83 South Carolina zone (meters)",9802,8821,31.5,9110,8822,-81.0,9110,8823,34.5,9110,8824,32.3,9110,8826,609600.0,9001,8827,0.0,9001,,,
+14001,South Dakota CS27 North zone,9802,8821,43.5,9110,8822,-100.0,9110,8823,44.25,9110,8824,45.41,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14002,South Dakota CS27 South zone,9802,8821,42.2,9110,8822,-100.2,9110,8823,42.5,9110,8824,44.24,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14031,"SPCS83 South Dakota North zone (meters)",9802,8821,43.5,9110,8822,-100.0,9110,8823,45.41,9110,8824,44.25,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14032,"SPCS83 South Dakota South zone (meters)",9802,8821,42.2,9110,8822,-100.2,9110,8823,44.24,9110,8824,42.5,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14100,Tennessee CS27,9802,8821,34.4,9110,8822,-86.0,9110,8823,35.15,9110,8824,36.25,9110,8826,100000.0,9003,8827,0.0,9003,,,
+14130,"SPCS83 Tennessee zone (meters)",9802,8821,34.2,9110,8822,-86.0,9110,8823,36.25,9110,8824,35.15,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14201,Texas CS27 North zone,9802,8821,34.0,9110,8822,-101.3,9110,8823,34.39,9110,8824,36.11,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14202,Texas CS27 North Central zone,9802,8821,31.4,9110,8822,-97.3,9110,8823,32.08,9110,8824,33.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14203,Texas CS27 Central zone,9802,8821,29.4,9110,8822,-100.2,9110,8823,30.07,9110,8824,31.53,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14204,Texas CS27 South Central zone,9802,8821,27.5,9110,8822,-99.0,9110,8823,28.23,9110,8824,30.17,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14205,Texas CS27 South zone,9802,8821,25.4,9110,8822,-98.3,9110,8823,26.1,9110,8824,27.5,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14231,"SPCS83 Texas North zone (meters)",9802,8821,34.0,9110,8822,-101.3,9110,8823,36.11,9110,8824,34.39,9110,8826,200000.0,9001,8827,1000000.0,9001,,,
+14232,"SPCS83 Texas North Central zone (meters)",9802,8821,31.4,9110,8822,-98.3,9110,8823,33.58,9110,8824,32.08,9110,8826,600000.0,9001,8827,2000000.0,9001,,,
+14233,"SPCS83 Texas Central zone (meters)",9802,8821,29.4,9110,8822,-100.2,9110,8823,31.53,9110,8824,30.07,9110,8826,700000.0,9001,8827,3000000.0,9001,,,
+14234,"SPCS83 Texas South Central zone (meters)",9802,8821,27.5,9110,8822,-99.0,9110,8823,30.17,9110,8824,28.23,9110,8826,600000.0,9001,8827,4000000.0,9001,,,
+14235,"SPCS83 Texas South zone (meters)",9802,8821,25.4,9110,8822,-98.3,9110,8823,27.5,9110,8824,26.1,9110,8826,300000.0,9001,8827,5000000.0,9001,,,
+14301,Utah CS27 North zone,9802,8821,40.2,9110,8822,-111.3,9110,8823,40.43,9110,8824,41.47,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14302,Utah CS27 Central zone,9802,8821,38.2,9110,8822,-111.3,9110,8823,39.01,9110,8824,40.39,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14303,Utah CS27 South zone,9802,8821,36.4,9110,8822,-111.3,9110,8823,37.13,9110,8824,38.21,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14331,"SPCS83 Utah North zone (meters)",9802,8821,40.2,9110,8822,-111.3,9110,8823,41.47,9110,8824,40.43,9110,8826,500000.0,9001,8827,1000000.0,9001,,,
+14332,"SPCS83 Utah Central zone (meters)",9802,8821,38.2,9110,8822,-111.3,9110,8823,40.39,9110,8824,39.01,9110,8826,500000.0,9001,8827,2000000.0,9001,,,
+14333,"SPCS83 Utah South zone (meters)",9802,8821,36.4,9110,8822,-111.3,9110,8823,38.21,9110,8824,37.13,9110,8826,500000.0,9001,8827,3000000.0,9001,,,
+14400,Vermont CS27,9807,8801,42.3,9110,8802,-72.3,9110,8805,0.999964286,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+14430,"SPCS83 Vermont zone (meters)",9807,8801,42.3,9110,8802,-72.3,9110,8805,0.999964286,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+14501,Virginia CS27 North zone,9802,8821,37.4,9110,8822,-78.3,9110,8823,38.02,9110,8824,39.12,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14502,Virginia CS27 South zone,9802,8821,36.2,9110,8822,-78.3,9110,8823,36.46,9110,8824,37.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14531,"SPCS83 Virginia North zone (meters)",9802,8821,37.4,9110,8822,-78.3,9110,8823,39.12,9110,8824,38.02,9110,8826,3500000.0,9001,8827,2000000.0,9001,,,
+14532,"SPCS83 Virginia South zone (meters)",9802,8821,36.2,9110,8822,-78.3,9110,8823,37.58,9110,8824,36.46,9110,8826,3500000.0,9001,8827,1000000.0,9001,,,
+14601,Washington CS27 North zone,9802,8821,47.0,9110,8822,-120.5,9110,8823,47.3,9110,8824,48.44,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14602,Washington CS27 South zone,9802,8821,45.2,9110,8822,-120.3,9110,8823,45.5,9110,8824,47.2,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14631,"SPCS83 Washington North zone (meters)",9802,8821,47.0,9110,8822,-120.5,9110,8823,48.44,9110,8824,47.3,9110,8826,500000.0,9001,8827,0.0,9001,,,
+14632,"SPCS83 Washington South zone (meters)",9802,8821,45.2,9110,8822,-120.3,9110,8823,47.2,9110,8824,45.5,9110,8826,500000.0,9001,8827,0.0,9001,,,
+14701,West Virginia CS27 North zone,9802,8821,38.3,9110,8822,-79.3,9110,8823,39.0,9110,8824,40.15,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14702,West Virginia CS27 South zone,9802,8821,37.0,9110,8822,-81.0,9110,8823,37.29,9110,8824,38.53,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14731,"SPCS83 West Virginia North zone (meters)",9802,8821,38.3,9110,8822,-79.3,9110,8823,40.15,9110,8824,39.0,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14732,"SPCS83 West Virginia South zone (meters)",9802,8821,37.0,9110,8822,-81.0,9110,8823,38.53,9110,8824,37.29,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14801,Wisconsin CS27 North zone,9802,8821,45.1,9110,8822,-90.0,9110,8823,45.34,9110,8824,46.46,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14802,Wisconsin CS27 Central zone,9802,8821,43.5,9110,8822,-90.0,9110,8823,44.15,9110,8824,45.3,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14803,Wisconsin CS27 South zone,9802,8821,42.0,9110,8822,-90.0,9110,8823,42.44,9110,8824,44.04,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14831,"SPCS83 Wisconsin North zone (meters)",9802,8821,45.1,9110,8822,-90.0,9110,8823,46.46,9110,8824,45.34,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14832,"SPCS83 Wisconsin Central zone (meters)",9802,8821,43.5,9110,8822,-90.0,9110,8823,45.3,9110,8824,44.15,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14833,"SPCS83 Wisconsin South zone (meters)",9802,8821,42.0,9110,8822,-90.0,9110,8823,44.04,9110,8824,42.44,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14901,Wyoming CS27 East zone,9807,8801,40.4,9110,8802,-105.1,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+14902,Wyoming CS27 East Central zone,9807,8801,40.4,9110,8802,-107.2,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+14903,Wyoming CS27 West Central zone,9807,8801,40.4,9110,8802,-108.45,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+14904,Wyoming CS27 West zone,9807,8801,40.4,9110,8802,-110.05,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+14931,"SPCS83 Wyoming East zone (meters)",9807,8801,40.3,9110,8802,-105.1,9110,8805,0.9999375,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+14932,"SPCS83 Wyoming East Central zone (meters)",9807,8801,40.3,9110,8802,-107.2,9110,8805,0.9999375,9201,8806,400000.0,9001,8807,100000.0,9001,,,,,,
+14933,"SPCS83 Wyoming West Central zone (meters)",9807,8801,40.3,9110,8802,-108.45,9110,8805,0.9999375,9201,8806,600000.0,9001,8807,0.0,9001,,,,,,
+14934,"SPCS83 Wyoming West zone (meters)",9807,8801,40.3,9110,8802,-110.05,9110,8805,0.9999375,9201,8806,800000.0,9001,8807,100000.0,9001,,,,,,
+15001,Alaska CS27 zone 1,9812,8806,16404166.67,9003,8807,-16404166.67,9003,8811,57.0,9110,8812,-133.4,9110,8813,323.07483685,9110,8814,323.07483685,9110,8815,0.9999,9201
+15002,Alaska CS27 zone 2,9807,8801,54.0,9102,8802,-142.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15003,Alaska CS27 zone 3,9807,8801,54.0,9102,8802,-146.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15004,Alaska CS27 zone 4,9807,8801,54.0,9102,8802,-150.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15005,Alaska CS27 zone 5,9807,8801,54.0,9102,8802,-154.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15006,Alaska CS27 zone 6,9807,8801,54.0,9102,8802,-158.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15007,Alaska CS27 zone 7,9807,8801,54.0,9102,8802,-162.0,9102,8805,0.9999,9201,8806,700000.0,9003,8807,0.0,9003,,,,,,
+15008,Alaska CS27 zone 8,9807,8801,54.0,9102,8802,-166.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15009,Alaska CS27 zone 9,9807,8801,54.0,9102,8802,-170.0,9102,8805,0.9999,9201,8806,600000.0,9003,8807,0.0,9003,,,,,,
+15010,Alaska CS27 zone 10,9802,8821,51.0,9110,8822,-176.0,9110,8823,53.5,9110,8824,51.5,9110,8826,3000000.0,9003,8827,0.0,9003,,,
+15031,"SPCS83 Alaska zone 1 (meters)",9812,8806,5000000.0,9001,8807,-5000000.0,9001,8811,57.0,9110,8812,-133.4,9110,8813,323.07483685,9110,8814,323.07483685,9110,8815,0.9999,9201
+15032,"SPCS83 Alaska zone 2 (meters)",9807,8801,54.0,9102,8802,-142.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15033,"SPCS83 Alaska zone 3 (meters)",9807,8801,54.0,9102,8802,-146.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15034,"SPCS83 Alaska zone 4 (meters)",9807,8801,54.0,9102,8802,-150.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15035,"SPCS83 Alaska zone 5 (meters)",9807,8801,54.0,9102,8802,-154.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15036,"SPCS83 Alaska zone 6 (meters)",9807,8801,54.0,9102,8802,-158.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15037,"SPCS83 Alaska zone 7 (meters)",9807,8801,54.0,9102,8802,-162.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15038,"SPCS83 Alaska zone 8 (meters)",9807,8801,54.0,9102,8802,-166.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15039,"SPCS83 Alaska zone 9 (meters)",9807,8801,54.0,9102,8802,-170.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15040,"SPCS83 Alaska zone 10 (meters)",9802,8821,51.0,9110,8822,-176.0,9110,8823,53.5,9110,8824,51.5,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+15101,Hawaii CS27 zone 1,9807,8801,18.5,9110,8802,-155.3,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15102,Hawaii CS27 zone 2,9807,8801,20.2,9110,8802,-156.4,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15103,Hawaii CS27 zone 3,9807,8801,21.1,9110,8802,-158.0,9110,8805,0.99999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15104,Hawaii CS27 zone 4,9807,8801,21.5,9110,8802,-159.3,9110,8805,0.99999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15105,Hawaii CS27 zone 5,9807,8801,21.4,9110,8802,-160.1,9110,8805,1.0,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15131,"SPCS83 Hawaii zone 1 (meters)",9807,8801,18.5,9110,8802,-155.3,9110,8805,0.999966667,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15132,"SPCS83 Hawaii zone 2 (meters)",9807,8801,20.2,9110,8802,-156.4,9110,8805,0.999966667,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15133,"SPCS83 Hawaii zone 3 (meters)",9807,8801,21.1,9110,8802,-158.0,9110,8805,0.99999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15134,"SPCS83 Hawaii zone 4 (meters)",9807,8801,21.5,9110,8802,-159.3,9110,8805,0.99999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15135,"SPCS83 Hawaii zone 5 (meters)",9807,8801,21.4,9110,8802,-160.1,9110,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15201,Puerto Rico CS27,9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,500000.0,9003,8827,0.0,9003,,,
+15202,St. Croix CS27,9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,500000.0,9003,8827,100000.0,9003,,,
+15230,"SPCS83 Puerto Rico & Virgin Islands zone (meters)",9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,200000.0,9001,8827,200000.0,9001,,,
+15300,American Samoa Lambert,9801,8801,-14.16,9110,8802,170.0,9110,8805,1.0,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15301,American Samoa Lambert,9801,8801,-14.16,9110,8802,-170.0,9110,8805,1.0,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15302,Tennessee CS27,9802,8821,34.4,9110,8822,-86.0,9110,8823,35.15,9110,8824,36.25,9110,8826,2000000.0,9003,8827,100000.0,9003,,,
+15303,"SPCS83 Kentucky North zone (meters)",9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,500000.0,9001,8827,0.0,9001,,,
+15304,"SPCS83 Arizona East zone (International feet)",9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+15305,"SPCS83 Arizona Central zone (International feet)",9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+15306,"SPCS83 Arizona West zone (International feet)",9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+15307,"SPCS83 California zone 1 (US Survey feet)",9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+15308,"SPCS83 California zone 2 (US Survey feet)",9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+15309,"SPCS83 California zone 3 (US Survey feet)",9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+15310,"SPCS83 California zone 4 (US Survey feet)",9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+15311,"SPCS83 California zone 5 (US Survey feet)",9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+15312,"SPCS83 California zone 6 (US Survey feet)",9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+15313,"SPCS83 Colorado North zone (US Survey feet)",9802,8821,39.2,9110,8822,-105.3,9110,8823,40.47,9110,8824,39.43,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+15314,"SPCS83 Colorado Central zone (US Survey feet)",9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+15315,"SPCS83 Colorado South zone (US Survey feet)",9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+15316,"SPCS83 Connecticut zone (US Survey feet)",9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,1000000.0,9003,8827,500000.0,9003,,,
+15317,"SPCS83 Delaware zone (US Survey feet)",9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+15318,"SPCS83 Florida East zone (US Survey feet)",9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+15319,"SPCS83 Florida West zone (US Survey feet)",9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+15320,"SPCS83 Florida North zone (US Survey feet)",9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15321,"SPCS83 Georgia East zone (US Survey feet)",9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+15322,"SPCS83 Georgia West zone (US Survey feet)",9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,2296583.333,9003,8807,0.0,9003,,,,,,
+15323,"SPCS83 Idaho East zone (US Survey feet)",9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+15324,"SPCS83 Idaho Central zone (US Survey feet)",9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,1640416.667,9003,8807,0.0,9003,,,,,,
+15325,"SPCS83 Idaho West zone (US Survey feet)",9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,2624666.667,9003,8807,0.0,9003,,,,,,
+15326,"SPCS83 Indiana East zone (US Survey feet)",9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,328083.333,9003,8807,818125.0,9003,,,,,,
+15327,"SPCS83 Indiana West zone (US Survey feet)",9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,2952750.0,9003,8807,818125.0,9003,,,,,,
+15328,"SPCS83 Kentucky North zone (US Survey feet)",9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+15329,"SPCS83 Kentucky South zone (US Survey feet)",9802,8821,36.2,9110,8822,-85.45,9110,8823,37.56,9110,8824,36.44,9110,8826,1640416.667,9003,8827,1640416.667,9003,,,
+15330,"SPCS83 Maryland zone (US Survey feet)",9802,8821,37.4,9110,8822,-77.0,9110,8823,39.27,9110,8824,38.18,9110,8826,1312333.333,9003,8827,0.0,9003,,,
+15331,"SPCS83 Massachusetts Mainland zone (US Survey feet)",9802,8821,41.0,9110,8822,-71.3,9110,8823,42.41,9110,8824,41.43,9110,8826,656166.667,9003,8827,2460625.0,9003,,,
+15332,"SPCS83 Massachusetts Island zone (US Survey feet)",9802,8821,41.0,9110,8822,-70.3,9110,8823,41.29,9110,8824,41.17,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+15333,"SPCS83 Michigan North zone (International feet)",9802,8821,44.47,9110,8822,-87.0,9110,8823,47.05,9110,8824,45.29,9110,8826,26246719.16,9002,8827,0.0,9002,,,
+15334,"SPCS83 Michigan Central zone (International feet)",9802,8821,43.19,9110,8822,-84.22,9110,8823,45.42,9110,8824,44.11,9110,8826,19685039.37,9002,8827,0.0,9002,,,
+15335,"SPCS83 Michigan South zone (International feet)",9802,8821,41.3,9110,8822,-84.22,9110,8823,43.4,9110,8824,42.06,9110,8826,13123359.58,9002,8827,0.0,9002,,,
+15336,"SPCS83 Mississippi East zone (US Survey feet)",9807,8801,29.3,9110,8802,-88.5,9110,8805,0.99995,9201,8806,984250.0,9003,8807,0.0,9003,,,,,,
+15337,"SPCS83 Mississippi West zone (US Survey feet)",9807,8801,29.3,9110,8802,-90.2,9110,8805,0.99995,9201,8806,2296583.333,9003,8807,0.0,9003,,,,,,
+15338,"SPCS83 Montana zone (International feet)",9802,8821,44.15,9110,8822,-109.3,9110,8823,49.0,9110,8824,45.0,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+15339,"SPCS83 New Mexico East zone (US Survey feet)",9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,541337.5,9003,8807,0.0,9003,,,,,,
+15340,"SPCS83 New Mexico Central zone (US Survey feet)",9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,1640416.667,9003,8807,0.0,9003,,,,,,
+15341,"SPCS83 New Mexico West zone (US Survey feet)",9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,2723091.667,9003,8807,0.0,9003,,,,,,
+15342,"SPCS83 New York East zone (US Survey feet)",9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,492125.0,9003,8807,0.0,9003,,,,,,
+15343,"SPCS83 New York Central zone (US Survey feet)",9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,820208.333,9003,8807,0.0,9003,,,,,,
+15344,"SPCS83 New York West zone (US Survey feet)",9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,1148291.667,9003,8807,0.0,9003,,,,,,
+15345,"SPCS83 New York Long Island zone (US Survey feet)",9802,8821,40.1,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,984250.0,9003,8827,0.0,9003,,,
+15346,"SPCS83 North Carolina zone (US Survey feet)",9802,8821,33.45,9110,8822,-79.0,9110,8823,36.1,9110,8824,34.2,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+15347,"SPCS83 North Dakota North zone (International feet)",9802,8821,47.0,9110,8822,-100.3,9110,8823,48.44,9110,8824,47.26,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+15348,"SPCS83 North Dakota South zone (International feet)",9802,8821,45.4,9110,8822,-100.3,9110,8823,47.29,9110,8824,46.11,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+15349,"SPCS83 Oklahoma North zone (US Survey feet)",9802,8821,35.0,9110,8822,-98.0,9110,8823,36.46,9110,8824,35.34,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15350,"SPCS83 Oklahoma South zone (US Survey feet)",9802,8821,33.2,9110,8822,-98.0,9110,8823,35.14,9110,8824,33.56,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15351,"SPCS83 Oregon North zone (International feet)",9802,8821,43.4,9110,8822,-120.3,9110,8823,46.0,9110,8824,44.2,9110,8826,8202099.738,9002,8827,0.0,9002,,,
+15352,"SPCS83 Oregon South zone (International feet)",9802,8821,41.4,9110,8822,-120.3,9110,8823,44.0,9110,8824,42.2,9110,8826,4921259.843,9002,8827,0.0,9002,,,
+15353,"SPCS83 Pennsylvania North zone (US Survey feet)",9802,8821,40.1,9110,8822,-77.45,9110,8823,41.57,9110,8824,40.53,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15354,"SPCS83 Pennsylvania South zone (US Survey feet)",9802,8821,39.2,9110,8822,-77.45,9110,8823,40.58,9110,8824,39.56,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15355,"SPCS83 South Carolina zone (International feet)",9802,8821,31.5,9110,8822,-81.0,9110,8823,34.5,9110,8824,32.3,9110,8826,2000000.0,9002,8827,0.0,9002,,,
+15356,"SPCS83 Tennessee zone (US Survey feet)",9802,8821,34.2,9110,8822,-86.0,9110,8823,36.25,9110,8824,35.15,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15357,"SPCS83 Texas North zone (US Survey feet)",9802,8821,34.0,9110,8822,-101.3,9110,8823,36.11,9110,8824,34.39,9110,8826,656166.667,9003,8827,3280833.333,9003,,,
+15358,"SPCS83 Texas North Central zone (US Survey feet)",9802,8821,31.4,9110,8822,-98.3,9110,8823,33.58,9110,8824,32.08,9110,8826,1968500.0,9003,8827,6561666.667,9003,,,
+15359,"SPCS83 Texas Central zone (US Survey feet)",9802,8821,29.4,9110,8822,-100.2,9110,8823,31.53,9110,8824,30.07,9110,8826,2296583.333,9003,8827,9842500.0,9003,,,
+15360,"SPCS83 Texas South Central zone (US Survey feet)",9802,8821,27.5,9110,8822,-99.0,9110,8823,30.17,9110,8824,28.23,9110,8826,1968500.0,9003,8827,13123333.333,9003,,,
+15361,"SPCS83 Texas South zone (US Survey feet)",9802,8821,25.4,9110,8822,-98.3,9110,8823,27.5,9110,8824,26.1,9110,8826,984250.0,9003,8827,16404166.667,9003,,,
+15362,"SPCS83 Utah North zone (International feet)",9802,8821,40.2,9110,8822,-111.3,9110,8823,41.47,9110,8824,40.43,9110,8826,1640419.948,9002,8827,3280839.895,9002,,,
+15363,"SPCS83 Utah Central zone (International feet)",9802,8821,38.2,9110,8822,-111.3,9110,8823,40.39,9110,8824,39.01,9110,8826,1640419.948,9002,8827,6561679.79,9002,,,
+15364,"SPCS83 Utah South zone (International feet)",9802,8821,36.4,9110,8822,-111.3,9110,8823,38.21,9110,8824,37.13,9110,8826,1640419.948,9002,8827,9842519.685,9002,,,
+15365,"SPCS83 Virginia North zone (US Survey feet)",9802,8821,37.4,9110,8822,-78.3,9110,8823,39.12,9110,8824,38.02,9110,8826,11482916.667,9003,8827,6561666.667,9003,,,
+15366,"SPCS83 Virginia South zone (US Survey feet)",9802,8821,36.2,9110,8822,-78.3,9110,8823,37.58,9110,8824,36.46,9110,8826,11482916.667,9003,8827,3280833.333,9003,,,
+15367,"SPCS83 Washington North zone (US Survey feet)",9802,8821,47.0,9110,8822,-120.5,9110,8823,48.44,9110,8824,47.3,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+15368,"SPCS83 Washington South zone (US Survey feet)",9802,8821,45.2,9110,8822,-120.3,9110,8823,47.2,9110,8824,45.5,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+15369,"SPCS83 Wisconsin North zone (US Survey feet)",9802,8821,45.1,9110,8822,-90.0,9110,8823,46.46,9110,8824,45.34,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15370,"SPCS83 Wisconsin Central zone (US Survey feet)",9802,8821,43.5,9110,8822,-90.0,9110,8823,45.3,9110,8824,44.15,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15371,"SPCS83 Wisconsin South zone (US Survey feet)",9802,8821,42.0,9110,8822,-90.0,9110,8823,44.04,9110,8824,42.44,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15914,"BLM zone 14N (US survey feet)",9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+15915,"BLM zone 15N (US survey feet)",9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+15916,"BLM zone 16N (US survey feet)",9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+15917,"BLM zone 17N (US survey feet)",9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+16000,"UTM grid system (northern hemisphere)",9824,8801,0.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,8830,-180.0,9102,8831,6.0,9102,,,
+16001,UTM zone 1N,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16002,UTM zone 2N,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16003,UTM zone 3N,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16004,UTM zone 4N,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16005,UTM zone 5N,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16006,UTM zone 6N,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16007,UTM zone 7N,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16008,UTM zone 8N,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16009,UTM zone 9N,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16010,UTM zone 10N,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16011,UTM zone 11N,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16012,UTM zone 12N,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16013,UTM zone 13N,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16014,UTM zone 14N,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16015,UTM zone 15N,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16016,UTM zone 16N,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16017,UTM zone 17N,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16018,UTM zone 18N,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16019,UTM zone 19N,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16020,UTM zone 20N,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16021,UTM zone 21N,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16022,UTM zone 22N,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16023,UTM zone 23N,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16024,UTM zone 24N,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16025,UTM zone 25N,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16026,UTM zone 26N,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16027,UTM zone 27N,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16028,UTM zone 28N,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16029,UTM zone 29N,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16030,UTM zone 30N,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16031,UTM zone 31N,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16032,UTM zone 32N,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16033,UTM zone 33N,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16034,UTM zone 34N,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16035,UTM zone 35N,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16036,UTM zone 36N,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16037,UTM zone 37N,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16038,UTM zone 38N,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16039,UTM zone 39N,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16040,UTM zone 40N,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16041,UTM zone 41N,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16042,UTM zone 42N,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16043,UTM zone 43N,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16044,UTM zone 44N,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16045,UTM zone 45N,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16046,UTM zone 46N,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16047,UTM zone 47N,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16048,UTM zone 48N,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16049,UTM zone 49N,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16050,UTM zone 50N,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16051,UTM zone 51N,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16052,UTM zone 52N,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16053,UTM zone 53N,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16054,UTM zone 54N,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16055,UTM zone 55N,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16056,UTM zone 56N,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16057,UTM zone 57N,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16058,UTM zone 58N,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16059,UTM zone 59N,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16060,UTM zone 60N,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16061,Universal Polar Stereographic North,9810,8801,90.0,9102,8802,0.0,9102,8805,0.994,9201,8806,2000000.0,9001,8807,2000000.0,9001,,,,,,
+16070,3-degree Gauss-Kruger zone 40,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,40500000.0,9001,8807,0.0,9001,,,,,,
+16071,3-degree Gauss-Kruger zone 41,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,41500000.0,9001,8807,0.0,9001,,,,,,
+16072,3-degree Gauss-Kruger zone 42,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,42500000.0,9001,8807,0.0,9001,,,,,,
+16073,3-degree Gauss-Kruger zone 43,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,43500000.0,9001,8807,0.0,9001,,,,,,
+16074,3-degree Gauss-Kruger zone 44,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,44500000.0,9001,8807,0.0,9001,,,,,,
+16075,3-degree Gauss-Kruger zone 45,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,45500000.0,9001,8807,0.0,9001,,,,,,
+16076,3-degree Gauss-Kruger zone 46,9807,8801,0.0,9102,8802,138.0,9102,8805,1.0,9201,8806,46500000.0,9001,8807,0.0,9001,,,,,,
+16077,3-degree Gauss-Kruger zone 47,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,47500000.0,9001,8807,0.0,9001,,,,,,
+16078,3-degree Gauss-Kruger zone 48,9807,8801,0.0,9102,8802,144.0,9102,8805,1.0,9201,8806,48500000.0,9001,8807,0.0,9001,,,,,,
+16079,3-degree Gauss-Kruger zone 49,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,49500000.0,9001,8807,0.0,9001,,,,,,
+16080,3-degree Gauss-Kruger zone 50,9807,8801,0.0,9102,8802,150.0,9102,8805,1.0,9201,8806,50500000.0,9001,8807,0.0,9001,,,,,,
+16081,3-degree Gauss-Kruger zone 51,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,51500000.0,9001,8807,0.0,9001,,,,,,
+16082,3-degree Gauss-Kruger zone 52,9807,8801,0.0,9102,8802,156.0,9102,8805,1.0,9201,8806,52500000.0,9001,8807,0.0,9001,,,,,,
+16083,3-degree Gauss-Kruger zone 53,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,53500000.0,9001,8807,0.0,9001,,,,,,
+16084,3-degree Gauss-Kruger zone 54,9807,8801,0.0,9102,8802,162.0,9102,8805,1.0,9201,8806,54500000.0,9001,8807,0.0,9001,,,,,,
+16085,3-degree Gauss-Kruger zone 55,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,55500000.0,9001,8807,0.0,9001,,,,,,
+16086,3-degree Gauss-Kruger zone 56,9807,8801,0.0,9102,8802,168.0,9102,8805,1.0,9201,8806,56500000.0,9001,8807,0.0,9001,,,,,,
+16087,3-degree Gauss-Kruger zone 57,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,57500000.0,9001,8807,0.0,9001,,,,,,
+16088,3-degree Gauss-Kruger zone 58,9807,8801,0.0,9102,8802,174.0,9102,8805,1.0,9201,8806,58500000.0,9001,8807,0.0,9001,,,,,,
+16089,3-degree Gauss-Kruger zone 59,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,59500000.0,9001,8807,0.0,9001,,,,,,
+16090,3-degree Gauss-Kruger zone 60,9807,8801,0.0,9102,8802,180.0,9102,8805,1.0,9201,8806,60000000.0,9001,8807,0.0,9001,,,,,,
+16091,3-degree Gauss-Kruger zone 61,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,61500000.0,9001,8807,0.0,9001,,,,,,
+16092,3-degree Gauss-Kruger zone 62,9807,8801,0.0,9102,8802,-174.0,9102,8805,1.0,9201,8806,62500000.0,9001,8807,0.0,9001,,,,,,
+16093,3-degree Gauss-Kruger zone 63,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,63500000.0,9001,8807,0.0,9001,,,,,,
+16094,3-degree Gauss-Kruger zone 64,9807,8801,0.0,9102,8802,-168.0,9102,8805,1.0,9201,8806,64500000.0,9001,8807,0.0,9001,,,,,,
+16100,"UTM grid system (southern hemisphere)",9824,8801,0.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,8830,-180.0,9102,8831,6.0,9102,,,
+16101,UTM zone 1S,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16102,UTM zone 2S,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16103,UTM zone 3S,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16104,UTM zone 4S,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16105,UTM zone 5S,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16106,UTM zone 6S,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16107,UTM zone 7S,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16108,UTM zone 8S,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16109,UTM zone 9S,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16110,UTM zone 10S,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16111,UTM zone 11S,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16112,UTM zone 12S,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16113,UTM zone 13S,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16114,UTM zone 14S,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16115,UTM zone 15S,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16116,UTM zone 16S,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16117,UTM zone 17S,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16118,UTM zone 18S,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16119,UTM zone 19S,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16120,UTM zone 20S,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16121,UTM zone 21S,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16122,UTM zone 22S,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16123,UTM zone 23S,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16124,UTM zone 24S,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16125,UTM zone 25S,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16126,UTM zone 26S,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16127,UTM zone 27S,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16128,UTM zone 28S,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16129,UTM zone 29S,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16130,UTM zone 30S,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16131,UTM zone 31S,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16132,UTM zone 32S,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16133,UTM zone 33S,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16134,UTM zone 34S,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16135,UTM zone 35S,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16136,UTM zone 36S,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16137,UTM zone 37S,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16138,UTM zone 38S,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16139,UTM zone 39S,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16140,UTM zone 40S,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16141,UTM zone 41S,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16142,UTM zone 42S,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16143,UTM zone 43S,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16144,UTM zone 44S,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16145,UTM zone 45S,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16146,UTM zone 46S,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16147,UTM zone 47S,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16148,UTM zone 48S,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16149,UTM zone 49S,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16150,UTM zone 50S,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16151,UTM zone 51S,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16152,UTM zone 52S,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16153,UTM zone 53S,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16154,UTM zone 54S,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16155,UTM zone 55S,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16156,UTM zone 56S,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16157,UTM zone 57S,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16158,UTM zone 58S,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16159,UTM zone 59S,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16160,UTM zone 60S,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16161,Universal Polar Stereographic South,9810,8801,-90.0,9102,8802,0.0,9102,8805,0.994,9201,8806,2000000.0,9001,8807,2000000.0,9001,,,,,,
+16170,3-degree Gauss-Kruger CM 120E,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16171,3-degree Gauss-Kruger CM 123E,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16172,3-degree Gauss-Kruger CM 126E,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16173,3-degree Gauss-Kruger CM 129E,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16174,3-degree Gauss-Kruger CM 132E,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16175,3-degree Gauss-Kruger CM 135E,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16176,3-degree Gauss-Kruger CM 138E,9807,8801,0.0,9102,8802,138.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16177,3-degree Gauss-Kruger CM 141E,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16178,3-degree Gauss-Kruger CM 144E,9807,8801,0.0,9102,8802,144.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16179,3-degree Gauss-Kruger CM 147E,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16180,3-degree Gauss-Kruger CM 150E,9807,8801,0.0,9102,8802,150.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16181,3-degree Gauss-Kruger CM 153E,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16182,3-degree Gauss-Kruger CM 156E,9807,8801,0.0,9102,8802,156.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16183,3-degree Gauss-Kruger CM 159E,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16184,3-degree Gauss-Kruger CM 162E,9807,8801,0.0,9102,8802,162.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16185,3-degree Gauss-Kruger CM 165E,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16186,3-degree Gauss-Kruger CM 168E,9807,8801,0.0,9102,8802,168.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16187,3-degree Gauss-Kruger CM 171E,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16188,3-degree Gauss-Kruger CM 174E,9807,8801,0.0,9102,8802,174.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16189,3-degree Gauss-Kruger CM 177E,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16190,3-degree Gauss-Kruger CM 180,9807,8801,0.0,9102,8802,180.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16191,3-degree Gauss-Kruger CM 177W,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16192,3-degree Gauss-Kruger CM 174W,9807,8801,0.0,9102,8802,-174.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16193,3-degree Gauss-Kruger CM 171W,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16194,3-degree Gauss-Kruger CM 168W,9807,8801,0.0,9102,8802,-168.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16201,6-degree Gauss-Kruger zone 1,9807,8801,0.0,9102,8802,3.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+16202,6-degree Gauss-Kruger zone 2,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+16203,6-degree Gauss-Kruger zone 3,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+16204,6-degree Gauss-Kruger zone 4,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+16205,6-degree Gauss-Kruger zone 5,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+16206,6-degree Gauss-Kruger zone 6,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+16207,6-degree Gauss-Kruger zone 7,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+16208,6-degree Gauss-Kruger zone 8,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+16209,6-degree Gauss-Kruger zone 9,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+16210,6-degree Gauss-Kruger zone 10,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+16211,6-degree Gauss-Kruger zone 11,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+16212,6-degree Gauss-Kruger zone 12,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+16213,6-degree Gauss-Kruger zone 13,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+16214,6-degree Gauss-Kruger zone 14,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+16215,6-degree Gauss-Kruger zone 15,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+16216,6-degree Gauss-Kruger zone 16,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+16217,6-degree Gauss-Kruger zone 17,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+16218,6-degree Gauss-Kruger zone 18,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+16219,6-degree Gauss-Kruger zone 19,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+16220,6-degree Gauss-Kruger zone 20,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+16221,6-degree Gauss-Kruger zone 21,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+16222,6-degree Gauss-Kruger zone 22,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+16223,6-degree Gauss-Kruger zone 23,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+16224,6-degree Gauss-Kruger zone 24,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,24500000.0,9001,8807,0.0,9001,,,,,,
+16225,6-degree Gauss-Kruger zone 25,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+16226,6-degree Gauss-Kruger zone 26,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+16227,6-degree Gauss-Kruger zone 27,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+16228,6-degree Gauss-Kruger zone 28,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+16229,6-degree Gauss-Kruger zone 29,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+16230,6-degree Gauss-Kruger zone 30,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+16231,6-degree Gauss-Kruger zone 31,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+16232,6-degree Gauss-Kruger zone 32,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+16233,6-degree Gauss-Kruger zone 33,9807,8801,0.0,9102,8802,-165.0,9102,8805,1.0,9201,8806,33500000.0,9001,8807,0.0,9001,,,,,,
+16234,6-degree Gauss-Kruger zone 34,9807,8801,0.0,9102,8802,-159.0,9102,8805,1.0,9201,8806,34500000.0,9001,8807,0.0,9001,,,,,,
+16235,6-degree Gauss-Kruger zone 35,9807,8801,0.0,9102,8802,-153.0,9102,8805,1.0,9201,8806,35500000.0,9001,8807,0.0,9001,,,,,,
+16236,6-degree Gauss-Kruger zone 36,9807,8801,0.0,9102,8802,-147.0,9102,8805,1.0,9201,8806,36500000.0,9001,8807,0.0,9001,,,,,,
+16237,6-degree Gauss-Kruger zone 37,9807,8801,0.0,9102,8802,-141.0,9102,8805,1.0,9201,8806,37500000.0,9001,8807,0.0,9001,,,,,,
+16238,6-degree Gauss-Kruger zone 38,9807,8801,0.0,9102,8802,-135.0,9102,8805,1.0,9201,8806,38500000.0,9001,8807,0.0,9001,,,,,,
+16239,6-degree Gauss-Kruger zone 39,9807,8801,0.0,9102,8802,-129.0,9102,8805,1.0,9201,8806,39500000.0,9001,8807,0.0,9001,,,,,,
+16240,6-degree Gauss-Kruger zone 40,9807,8801,0.0,9102,8802,-123.0,9102,8805,1.0,9201,8806,40500000.0,9001,8807,0.0,9001,,,,,,
+16241,6-degree Gauss-Kruger zone 41,9807,8801,0.0,9102,8802,-117.0,9102,8805,1.0,9201,8806,41500000.0,9001,8807,0.0,9001,,,,,,
+16242,6-degree Gauss-Kruger zone 42,9807,8801,0.0,9102,8802,-111.0,9102,8805,1.0,9201,8806,42500000.0,9001,8807,0.0,9001,,,,,,
+16243,6-degree Gauss-Kruger zone 43,9807,8801,0.0,9102,8802,-105.0,9102,8805,1.0,9201,8806,43500000.0,9001,8807,0.0,9001,,,,,,
+16244,6-degree Gauss-Kruger zone 44,9807,8801,0.0,9102,8802,-99.0,9102,8805,1.0,9201,8806,44500000.0,9001,8807,0.0,9001,,,,,,
+16245,6-degree Gauss-Kruger zone 45,9807,8801,0.0,9102,8802,-93.0,9102,8805,1.0,9201,8806,45500000.0,9001,8807,0.0,9001,,,,,,
+16246,6-degree Gauss-Kruger zone 46,9807,8801,0.0,9102,8802,-87.0,9102,8805,1.0,9201,8806,46500000.0,9001,8807,0.0,9001,,,,,,
+16247,6-degree Gauss-Kruger zone 47,9807,8801,0.0,9102,8802,-81.0,9102,8805,1.0,9201,8806,47500000.0,9001,8807,0.0,9001,,,,,,
+16248,6-degree Gauss-Kruger zone 48,9807,8801,0.0,9102,8802,-75.0,9102,8805,1.0,9201,8806,48500000.0,9001,8807,0.0,9001,,,,,,
+16249,6-degree Gauss-Kruger zone 49,9807,8801,0.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,49500000.0,9001,8807,0.0,9001,,,,,,
+16250,6-degree Gauss-Kruger zone 50,9807,8801,0.0,9102,8802,-63.0,9102,8805,1.0,9201,8806,50500000.0,9001,8807,0.0,9001,,,,,,
+16251,6-degree Gauss-Kruger zone 51,9807,8801,0.0,9102,8802,-57.0,9102,8805,1.0,9201,8806,51500000.0,9001,8807,0.0,9001,,,,,,
+16252,6-degree Gauss-Kruger zone 52,9807,8801,0.0,9102,8802,-51.0,9102,8805,1.0,9201,8806,52500000.0,9001,8807,0.0,9001,,,,,,
+16253,6-degree Gauss-Kruger zone 53,9807,8801,0.0,9102,8802,-45.0,9102,8805,1.0,9201,8806,53500000.0,9001,8807,0.0,9001,,,,,,
+16254,6-degree Gauss-Kruger zone 54,9807,8801,0.0,9102,8802,-39.0,9102,8805,1.0,9201,8806,54500000.0,9001,8807,0.0,9001,,,,,,
+16255,6-degree Gauss-Kruger zone 55,9807,8801,0.0,9102,8802,-33.0,9102,8805,1.0,9201,8806,55500000.0,9001,8807,0.0,9001,,,,,,
+16256,6-degree Gauss-Kruger zone 56,9807,8801,0.0,9102,8802,-27.0,9102,8805,1.0,9201,8806,56500000.0,9001,8807,0.0,9001,,,,,,
+16257,6-degree Gauss-Kruger zone 57,9807,8801,0.0,9102,8802,-21.0,9102,8805,1.0,9201,8806,57500000.0,9001,8807,0.0,9001,,,,,,
+16258,6-degree Gauss-Kruger zone 58,9807,8801,0.0,9102,8802,-15.0,9102,8805,1.0,9201,8806,58500000.0,9001,8807,0.0,9001,,,,,,
+16259,6-degree Gauss-Kruger zone 59,9807,8801,0.0,9102,8802,-9.0,9102,8805,1.0,9201,8806,59500000.0,9001,8807,0.0,9001,,,,,,
+16260,6-degree Gauss-Kruger zone 60,9807,8801,0.0,9102,8802,-3.0,9102,8805,1.0,9201,8806,60500000.0,9001,8807,0.0,9001,,,,,,
+16261,3-degree Gauss-Kruger zone 1,9807,8801,0.0,9102,8802,3.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+16262,3-degree Gauss-Kruger zone 2,9807,8801,0.0,9102,8802,6.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+16263,3-degree Gauss-Kruger zone 3,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+16264,3-degree Gauss-Kruger zone 4,9807,8801,0.0,9102,8802,12.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+16265,3-degree Gauss-Kruger zone 5,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+16266,3-degree Gauss-Kruger zone 6,9807,8801,0.0,9102,8802,18.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+16267,3-degree Gauss-Kruger zone 7,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+16268,3-degree Gauss-Kruger zone 8,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+16269,3-degree Gauss-Kruger zone 9,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+16270,3-degree Gauss-Kruger zone 10,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+16271,3-degree Gauss-Kruger zone 11,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+16272,3-degree Gauss-Kruger zone 12,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+16273,3-degree Gauss-Kruger zone 13,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+16274,3-degree Gauss-Kruger zone 14,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+16275,3-degree Gauss-Kruger zone 15,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+16276,3-degree Gauss-Kruger zone 16,9807,8801,0.0,9102,8802,48.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+16277,3-degree Gauss-Kruger zone 17,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+16278,3-degree Gauss-Kruger zone 18,9807,8801,0.0,9102,8802,54.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+16279,3-degree Gauss-Kruger zone 19,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+16280,3-degree Gauss-Kruger zone 20,9807,8801,0.0,9102,8802,60.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+16281,3-degree Gauss-Kruger zone 21,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+16282,3-degree Gauss-Kruger zone 22,9807,8801,0.0,9102,8802,66.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+16283,3-degree Gauss-Kruger zone 23,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+16284,3-degree Gauss-Kruger zone 24,9807,8801,0.0,9102,8802,72.0,9102,8805,1.0,9201,8806,24500000.0,9001,8807,0.0,9001,,,,,,
+16285,3-degree Gauss-Kruger zone 25,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+16286,3-degree Gauss-Kruger zone 26,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+16287,3-degree Gauss-Kruger zone 27,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+16288,3-degree Gauss-Kruger zone 28,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+16289,3-degree Gauss-Kruger zone 29,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+16290,3-degree Gauss-Kruger zone 30,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+16291,3-degree Gauss-Kruger zone 31,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+16292,3-degree Gauss-Kruger zone 32,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+16293,3-degree Gauss-Kruger zone 33,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,33500000.0,9001,8807,0.0,9001,,,,,,
+16294,3-degree Gauss-Kruger zone 34,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,34500000.0,9001,8807,0.0,9001,,,,,,
+16295,3-degree Gauss-Kruger zone 35,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,35500000.0,9001,8807,0.0,9001,,,,,,
+16296,3-degree Gauss-Kruger zone 36,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,36500000.0,9001,8807,0.0,9001,,,,,,
+16297,3-degree Gauss-Kruger zone 37,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,37500000.0,9001,8807,0.0,9001,,,,,,
+16298,3-degree Gauss-Kruger zone 38,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,38500000.0,9001,8807,0.0,9001,,,,,,
+16299,3-degree Gauss-Kruger zone 39,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,39500000.0,9001,8807,0.0,9001,,,,,,
+16301,6-degree Gauss-Kruger CM 3E,9807,8801,0.0,9102,8802,3.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16302,6-degree Gauss-Kruger CM 9E,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16303,6-degree Gauss-Kruger CM 15E,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16304,6-degree Gauss-Kruger CM 21E,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16305,6-degree Gauss-Kruger CM 27E,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16306,6-degree Gauss-Kruger CM 33E,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16307,6-degree Gauss-Kruger CM 39E,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16308,6-degree Gauss-Kruger CM 45E,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16309,6-degree Gauss-Kruger CM 51E,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16310,6-degree Gauss-Kruger CM 57E,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16311,6-degree Gauss-Kruger CM 63E,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16312,6-degree Gauss-Kruger CM 69E,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16313,6-degree Gauss-Kruger CM 75E,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16314,6-degree Gauss-Kruger CM 81E,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16315,6-degree Gauss-Kruger CM 87E,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16316,6-degree Gauss-Kruger CM 93E,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16317,6-degree Gauss-Kruger CM 99E,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16318,6-degree Gauss-Kruger CM 105E,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16319,6-degree Gauss-Kruger CM 111E,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16320,6-degree Gauss-Kruger CM 117E,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16321,6-degree Gauss-Kruger CM 123E,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16322,6-degree Gauss-Kruger CM 129E,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16323,6-degree Gauss-Kruger CM 135E,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16324,6-degree Gauss-Kruger CM 141E,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16325,6-degree Gauss-Kruger CM 147E,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16326,6-degree Gauss-Kruger CM 153E,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16327,6-degree Gauss-Kruger CM 159E,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16328,6-degree Gauss-Kruger CM 165E,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16329,6-degree Gauss-Kruger CM 171E,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16330,6-degree Gauss-Kruger CM 177E,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16331,6-degree Gauss-Kruger CM 177W,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16332,6-degree Gauss-Kruger CM 171W,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16333,6-degree Gauss-Kruger CM 165W,9807,8801,0.0,9102,8802,-165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16334,6-degree Gauss-Kruger CM 159W,9807,8801,0.0,9102,8802,-159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16335,6-degree Gauss-Kruger CM 153W,9807,8801,0.0,9102,8802,-153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16336,6-degree Gauss-Kruger CM 147W,9807,8801,0.0,9102,8802,-147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16337,6-degree Gauss-Kruger CM 141W,9807,8801,0.0,9102,8802,-141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16338,6-degree Gauss-Kruger CM 135W,9807,8801,0.0,9102,8802,-135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16339,6-degree Gauss-Kruger CM 129W,9807,8801,0.0,9102,8802,-129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16340,6-degree Gauss-Kruger CM 123W,9807,8801,0.0,9102,8802,-123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16341,6-degree Gauss-Kruger CM 117W,9807,8801,0.0,9102,8802,-117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16342,6-degree Gauss-Kruger CM 111W,9807,8801,0.0,9102,8802,-111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16343,6-degree Gauss-Kruger CM 105W,9807,8801,0.0,9102,8802,-105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16344,6-degree Gauss-Kruger CM 99W,9807,8801,0.0,9102,8802,-99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16345,6-degree Gauss-Kruger CM 93W,9807,8801,0.0,9102,8802,-93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16346,6-degree Gauss-Kruger CM 87W,9807,8801,0.0,9102,8802,-87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16347,6-degree Gauss-Kruger CM 81W,9807,8801,0.0,9102,8802,-81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16348,6-degree Gauss-Kruger CM 75W,9807,8801,0.0,9102,8802,-75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16349,6-degree Gauss-Kruger CM 69W,9807,8801,0.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16350,6-degree Gauss-Kruger CM 63W,9807,8801,0.0,9102,8802,-63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16351,6-degree Gauss-Kruger CM 57W,9807,8801,0.0,9102,8802,-57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16352,6-degree Gauss-Kruger CM 51W,9807,8801,0.0,9102,8802,-51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16353,6-degree Gauss-Kruger CM 45W,9807,8801,0.0,9102,8802,-45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16354,6-degree Gauss-Kruger CM 39W,9807,8801,0.0,9102,8802,-39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16355,6-degree Gauss-Kruger CM 33W,9807,8801,0.0,9102,8802,-33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16356,6-degree Gauss-Kruger CM 27W,9807,8801,0.0,9102,8802,-27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16357,6-degree Gauss-Kruger CM 21W,9807,8801,0.0,9102,8802,-21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16358,6-degree Gauss-Kruger CM 15W,9807,8801,0.0,9102,8802,-15.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16359,6-degree Gauss-Kruger CM 9W,9807,8801,0.0,9102,8802,-9.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16360,6-degree Gauss-Kruger CM 3W,9807,8801,0.0,9102,8802,-3.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16361,3-degree Gauss-Kruger CM 3E,9807,8801,0.0,9102,8802,3.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16362,3-degree Gauss-Kruger CM 6E,9807,8801,0.0,9102,8802,6.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16363,3-degree Gauss-Kruger CM 9E,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16364,3-degree Gauss-Kruger CM 12E,9807,8801,0.0,9102,8802,12.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16365,3-degree Gauss-Kruger CM 15E,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16366,3-degree Gauss-Kruger CM 18E,9807,8801,0.0,9102,8802,18.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16367,3-degree Gauss-Kruger CM 21E,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16368,3-degree Gauss-Kruger CM 24E,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16369,3-degree Gauss-Kruger CM 27E,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16370,3-degree Gauss-Kruger CM 30E,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16371,3-degree Gauss-Kruger CM 33E,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16372,3-degree Gauss-Kruger CM 36E,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16373,3-degree Gauss-Kruger CM 39E,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16374,3-degree Gauss-Kruger CM 42E,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16375,3-degree Gauss-Kruger CM 45E,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16376,3-degree Gauss-Kruger CM 48E,9807,8801,0.0,9102,8802,48.0,9102,8805,1.0,9001,8806,500000.0,9001,8807,0.0,9201,,,,,,
+16377,3-degree Gauss-Kruger CM 51E,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16378,3-degree Gauss-Kruger CM 54E,9807,8801,0.0,9102,8802,54.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16379,3-degree Gauss-Kruger CM 57E,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16380,3-degree Gauss-Kruger CM 60E,9807,8801,0.0,9102,8802,60.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16381,3-degree Gauss-Kruger CM 63E,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16382,3-degree Gauss-Kruger CM 66E,9807,8801,0.0,9102,8802,66.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16383,3-degree Gauss-Kruger CM 69E,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16384,3-degree Gauss-Kruger CM 72E,9807,8801,0.0,9102,8802,72.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16385,3-degree Gauss-Kruger CM 75E,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16386,3-degree Gauss-Kruger CM 78E,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16387,3-degree Gauss-Kruger CM 81E,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16388,3-degree Gauss-Kruger CM 84E,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16389,3-degree Gauss-Kruger CM 87E,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16390,3-degree Gauss-Kruger CM 90E,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16391,3-degree Gauss-Kruger CM 93E,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16392,3-degree Gauss-Kruger CM 96E,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16393,3-degree Gauss-Kruger CM 99E,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16394,3-degree Gauss-Kruger CM 102E,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16395,3-degree Gauss-Kruger CM 105E,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16396,3-degree Gauss-Kruger CM 108E,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16397,3-degree Gauss-Kruger CM 111E,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16398,3-degree Gauss-Kruger CM 114E,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16399,3-degree Gauss-Kruger CM 117E,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16400,TM 0 N,9807,8801,0.0,9102,8802,0.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16405,TM 5 NE,9807,8801,0.0,9102,8802,5.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16406,TM 6 NE,9807,8801,0.0,9102,8802,6.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16411,TM 11 NE,9807,8801,0.0,9102,8802,11.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16412,TM 12 NE,9807,8801,0.0,9102,8802,12.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16413,TM 13 NE,9807,8801,0.0,9102,8802,13.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16430,TM 30 NE,9807,8801,0.0,9102,8802,30.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16506,TM 106 NE,9807,8801,0.0,9102,8802,106.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16586,GK 106 NE,9807,8801,0.0,9102,8802,106.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16611,TM 11.30 SE,9807,8801,0.0,9110,8802,11.3,9110,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16612,TM 12 SE,9807,8801,0.0,9102,8802,12.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16636,TM 36 SE,9807,8801,0.0,9102,8802,36.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16709,TM 109 SE,9807,8801,0.0,9102,8802,109.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16716,TM 116 SE,9807,8801,0.0,9102,8802,116.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16732,TM 132 SE,9807,8801,0.0,9102,8802,132.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17001,TM 1 NW,9807,8801,0.0,9102,8802,-1.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+17005,TM 5 NW,9807,8801,0.0,9102,8802,-5.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+17054,TM 54 NW,9807,8801,0.0,9102,8802,-54.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+17348,Map Grid of Australia zone 48,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17349,Map Grid of Australia zone 49,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17350,Map Grid of Australia zone 50,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17351,Map Grid of Australia zone 51,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17352,Map Grid of Australia zone 52,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17353,Map Grid of Australia zone 53,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17354,Map Grid of Australia zone 54,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17355,Map Grid of Australia zone 55,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17356,Map Grid of Australia zone 56,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17357,Map Grid of Australia zone 57,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17358,Map Grid of Australia zone 58,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17448,Australian Map Grid zone 48,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17449,Australian Map Grid zone 49,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17450,Australian Map Grid zone 50,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17451,Australian Map Grid zone 51,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17452,Australian Map Grid zone 52,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17453,Australian Map Grid zone 53,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17454,Australian Map Grid zone 54,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17455,Australian Map Grid zone 55,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17456,Australian Map Grid zone 56,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17457,Australian Map Grid zone 57,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17458,Australian Map Grid zone 58,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17515,South African Survey Grid zone 15,9808,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17517,South African Survey Grid zone 17,9808,8801,0.0,9102,8802,17.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17519,South African Survey Grid zone 19,9808,8801,0.0,9102,8802,19.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17521,South African Survey Grid zone 21,9808,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17523,South African Survey Grid zone 23,9808,8801,0.0,9102,8802,23.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17525,South African Survey Grid zone 25,9808,8801,0.0,9102,8802,25.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17527,South African Survey Grid zone 27,9808,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17529,South African Survey Grid zone 29,9808,8801,0.0,9102,8802,29.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17531,South African Survey Grid zone 31,9808,8801,0.0,9102,8802,31.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17533,South African Survey Grid zone 33,9808,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17611,South West African Survey Grid zone 11,9808,8801,-22.0,9102,8802,11.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17613,South West African Survey Grid zone 13,9808,8801,-22.0,9102,8802,13.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17615,South West African Survey Grid zone 15,9808,8801,-22.0,9102,8802,15.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17617,South West African Survey Grid zone 17,9808,8801,-22.0,9102,8802,17.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17619,South West African Survey Grid zone 19,9808,8801,-22.0,9102,8802,19.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17621,South West African Survey Grid zone 21,9808,8801,-22.0,9102,8802,21.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17623,South West African Survey Grid zone 23,9808,8801,-22.0,9102,8802,23.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17625,South West African Survey Grid zone 25,9808,8801,-22.0,9102,8802,25.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17700,MTM Quebec zone 2,9807,8801,0.0,9110,8802,-55.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17701,MTM zone 1,9807,8801,0.0,9102,8802,-53.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17702,MTM Newfoundland zone 2,9807,8801,0.0,9102,8802,-56.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17703,MTM zone 3,9807,8801,0.0,9110,8802,-58.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17704,MTM zone 4,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17705,MTM zone 5,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17706,MTM zone 6,9807,8801,0.0,9110,8802,-67.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17707,MTM zone 7,9807,8801,0.0,9110,8802,-70.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17708,MTM zone 8,9807,8801,0.0,9110,8802,-73.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17709,MTM zone 9,9807,8801,0.0,9110,8802,-76.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17710,MTM zone 10,9807,8801,0.0,9110,8802,-79.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17711,MTM zone 11,9807,8801,0.0,9110,8802,-82.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17712,MTM zone 12,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17713,MTM zone 13,9807,8801,0.0,9102,8802,-84.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17714,MTM zone 14,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17715,MTM zone 15,9807,8801,0.0,9102,8802,-90.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17716,MTM zone 16,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17717,MTM zone 17,9807,8801,0.0,9102,8802,-96.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17794,MTM Nova Scotia zone 4,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+17795,MTM Nova Scotia zone 5,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+17801,Japan Plane Rectangular CS zone I,9807,8801,33.0,9110,8802,129.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17802,Japan Plane Rectangular CS zone II,9807,8801,33.0,9110,8802,131.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17803,Japan Plane Rectangular CS zone III,9807,8801,36.0,9110,8802,132.1,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17804,Japan Plane Rectangular CS zone IV,9807,8801,33.0,9110,8802,133.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17805,Japan Plane Rectangular CS zone V,9807,8801,36.0,9110,8802,134.2,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17806,Japan Plane Rectangular CS zone VI,9807,8801,36.0,9110,8802,136.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17807,Japan Plane Rectangular CS zone VII,9807,8801,36.0,9110,8802,137.1,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17808,Japan Plane Rectangular CS zone VIII,9807,8801,36.0,9110,8802,138.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17809,Japan Plane Rectangular CS zone IX,9807,8801,36.0,9110,8802,139.5,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17810,Japan Plane Rectangular CS zone X,9807,8801,40.0,9110,8802,140.5,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17811,Japan Plane Rectangular CS zone XI,9807,8801,44.0,9110,8802,140.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17812,Japan Plane Rectangular CS zone XII,9807,8801,44.0,9110,8802,142.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17813,Japan Plane Rectangular CS zone XIII,9807,8801,44.0,9110,8802,144.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17814,Japan Plane Rectangular CS zone XIV,9807,8801,26.0,9110,8802,142.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17815,Japan Plane Rectangular CS zone XV,9807,8801,26.0,9110,8802,127.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17816,Japan Plane Rectangular CS zone XVI,9807,8801,26.0,9110,8802,124.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17817,Japan Plane Rectangular CS zone XVII,9807,8801,26.0,9110,8802,131.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17818,Japan Plane Rectangular CS zone XVIII,9807,8801,20.0,9110,8802,136.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17819,Japan Plane Rectangular CS zone XIX,9807,8801,26.0,9110,8802,154.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17901,Mount Eden Circuit,9807,8801,-36.5247515,9110,8802,174.45516217,9110,8805,0.9999,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17902,Bay of Plenty Circuit,9807,8801,-37.45404993,9110,8802,176.27583101,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17903,Poverty Bay Circuit,9807,8801,-38.372893,9110,8802,177.53082906,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17904,Hawkes Bay Circuit,9807,8801,-39.39033455,9110,8802,176.40252499,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17905,Taranaki Circuit,9807,8801,-39.08087299,9110,8802,174.13408423,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17906,Tuhirangi Circuit,9807,8801,-39.30448934,9110,8802,175.38241325,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17907,Wanganui Circuit,9807,8801,-40.14310097,9110,8802,175.29171586,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17908,Wairarapa Circuit,9807,8801,-40.55319175,9110,8802,175.38504588,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17909,Wellington Circuit,9807,8801,-41.18047507,9110,8802,174.46358432,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17910,Collingwood Circuit,9807,8801,-40.42531326,9110,8802,172.40193674,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17911,Nelson Circuit,9807,8801,-41.1628361,9110,8802,173.17575405,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17912,Karamea Circuit,9807,8801,-41.17236815,9110,8802,172.06325015,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17913,Buller Circuit,9807,8801,-41.48388903,9110,8802,171.34525362,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17914,Grey Circuit,9807,8801,-42.20012994,9110,8802,171.32591767,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17915,Amuri Circuit,9807,8801,-42.41208197,9110,8802,173.00364802,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17916,Marlborough Circuit,9807,8801,-41.3240152,9110,8802,173.48074668,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17917,Hokitika Circuit,9807,8801,-42.53107605,9110,8802,170.58479766,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17918,Okarito Circuit,9807,8801,-43.06364613,9110,8802,170.1539333,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17919,Jacksons Bay Circuit,9807,8801,-43.58400904,9110,8802,168.36225612,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17920,Mount Pleasant Circuit,9807,8801,-43.35262953,9110,8802,172.43378969,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17921,Gawler Circuit,9807,8801,-43.44553616,9110,8802,171.21386945,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17922,Timaru Circuit,9807,8801,-44.24079933,9110,8802,171.0326103,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17923,Lindis Peak Circuit,9807,8801,-44.44069647,9110,8802,169.28039183,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17924,Mount Nicholas Circuit,9807,8801,-45.07584493,9110,8802,168.23551083,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17925,Mount York Circuit,9807,8801,-45.33494142,9110,8802,167.44199024,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17926,Observation Point Circuit,9807,8801,-45.48583078,9110,8802,170.37429426,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17927,North Taieri Circuit,9807,8801,-45.51414481,9110,8802,170.16573208,9110,8805,0.99996,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17928,Bluff Circuit,9807,8801,-46.36000346,9110,8802,168.20343392,9110,8805,1.0,9201,8806,300002.66,9001,8807,699999.58,9001,,,,,,
+17931,Mount Eden Circuit 2000,9807,8801,-36.5247,9110,8802,174.4551,9110,8805,0.9999,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17932,Bay of Plenty Circuit 2000,9807,8801,-37.454,9110,8802,176.2758,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17933,Poverty Bay Circuit 2000,9807,8801,-38.3728,9110,8802,177.5308,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17934,Hawkes Bay Circuit 2000,9807,8801,-39.3903,9110,8802,176.4025,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17935,Taranaki Circuit 2000,9807,8801,-39.0808,9110,8802,174.134,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17936,Tuhirangi Circuit 2000,9807,8801,-39.3044,9110,8802,175.3824,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17937,Wanganui Circuit 2000,9807,8801,-40.1431,9110,8802,175.2917,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17938,Wairarapa Circuit 2000,9807,8801,-40.5531,9110,8802,175.385,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17939,Wellington Circuit 2000,9807,8801,-41.1804,9110,8802,174.4635,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17940,Collingwood Circuit 2000,9807,8801,-40.4253,9110,8802,172.4019,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17941,Nelson Circuit 2000,9807,8801,-41.1628,9110,8802,173.1757,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17942,Karamea Circuit 2000,9807,8801,-41.1723,9110,8802,172.0632,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17943,Buller Circuit 2000,9807,8801,-41.4838,9110,8802,171.3452,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17944,Grey Circuit 2000,9807,8801,-42.2001,9110,8802,171.3259,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17945,Amuri Circuit 2000,9807,8801,-42.412,9110,8802,173.0036,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17946,Marlborough Circuit 2000,9807,8801,-41.324,9110,8802,173.4807,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17947,Hokitika Circuit 2000,9807,8801,-42.531,9110,8802,170.5847,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17948,Okarito Circuit 2000,9807,8801,-43.0636,9110,8802,170.1539,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17949,Jacksons Bay Circuit 2000,9807,8801,-43.584,9110,8802,168.3622,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17950,Mount Pleasant Circuit 2000,9807,8801,-43.3526,9110,8802,172.4337,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17951,Gawler Circuit 2000,9807,8801,-43.4455,9110,8802,171.2138,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17952,Timaru Circuit 2000,9807,8801,-44.2407,9110,8802,171.0326,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17953,Lindis Peak Circuit 2000,9807,8801,-44.4406,9110,8802,169.2803,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17954,Mount Nicholas Circuit 2000,9807,8801,-45.0758,9110,8802,168.2355,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17955,Mount York Circuit 2000,9807,8801,-45.3349,9110,8802,167.4419,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17956,Observation Point Circuit 2000,9807,8801,-45.4858,9110,8802,170.3742,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17957,North Taieri Circuit 2000,9807,8801,-45.5141,9110,8802,170.1657,9110,8805,0.99996,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17958,Bluff Circuit 2000,9807,8801,-46.36,9110,8802,168.2034,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+18011,"Nord Algerie (ancienne)",9801,8801,40.0,9105,8802,3.0,9105,8805,0.999625544,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+18012,"Sud Algerie (ancienne)",9801,8801,37.0,9105,8802,3.0,9105,8805,0.999625769,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+18021,Nord Algerie,9801,8801,40.0,9105,8802,3.0,9105,8805,0.999625544,9201,8806,500135.0,9001,8807,300090.0,9001,,,,,,
+18022,Sud Algerie,9801,8801,37.0,9105,8802,3.0,9105,8805,0.999625769,9201,8806,500135.0,9001,8807,300090.0,9001,,,,,,
+18031,Argentina zone 1,9807,8801,-90.0,9102,8802,-72.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+18032,Argentina zone 2,9807,8801,-90.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+18033,Argentina zone 3,9807,8801,-90.0,9102,8802,-66.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+18034,Argentina zone 4,9807,8801,-90.0,9102,8802,-63.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+18035,Argentina zone 5,9807,8801,-90.0,9102,8802,-60.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+18036,Argentina zone 6,9807,8801,-90.0,9102,8802,-57.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+18037,Argentina zone 7,9807,8801,-90.0,9102,8802,-54.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+18041,Austria West Zone,9807,8801,0.0,9102,8802,28.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18042,Austria Central Zone,9807,8801,0.0,9102,8802,31.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18043,Austria East Zone,9807,8801,0.0,9102,8802,34.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18044,Austria M28,9807,8801,0.0,9110,8802,10.2,9110,8805,1.0,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+18045,Austria M31,9807,8801,0.0,9110,8802,13.2,9110,8805,1.0,9201,8806,450000.0,9001,8807,0.0,9001,,,,,,
+18046,Austria M34,9807,8801,0.0,9110,8802,16.2,9110,8805,1.0,9201,8806,750000.0,9001,8807,0.0,9001,,,,,,
+18051,Colombia West zone,9807,8801,4.355657,9110,8802,-77.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18052,Colombia Bogota zone,9807,8801,4.355657,9110,8802,-74.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18053,Colombia East Central zone,9807,8801,4.355657,9110,8802,-71.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18054,Colombia East zone,9807,8801,4.355657,9110,8802,-68.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18061,Cuba Norte,9801,8801,22.21,9110,8802,-81.0,9110,8805,0.99993602,9201,8806,500000.0,9001,8807,280296.016,9001,,,,,,
+18062,Cuba Sur,9801,8801,20.43,9110,8802,-76.5,9110,8805,0.99994848,9201,8806,500000.0,9001,8807,229126.939,9001,,,,,,
+18071,Egypt Blue Belt,9807,8801,30.0,9102,8802,35.0,9102,8805,1.0,9201,8806,300000.0,9001,8807,1100000.0,9001,,,,,,
+18072,Egypt Red Belt,9807,8801,30.0,9102,8802,31.0,9102,8805,1.0,9201,8806,615000.0,9001,8807,810000.0,9001,,,,,,
+18073,Egypt Purple Belt,9807,8801,30.0,9102,8802,27.0,9102,8805,1.0,9201,8806,700000.0,9001,8807,200000.0,9001,,,,,,
+18074,Egypt Extended Purple Belt,9807,8801,30.0,9102,8802,27.0,9102,8805,1.0,9201,8806,700000.0,9001,8807,1200000.0,9001,,,,,,
+18081,Lambert zone I,9801,8801,55.0,9105,8802,0.0,9105,8805,0.999877341,9201,8806,600000.0,9001,8807,1200000.0,9001,,,,,,
+18082,Lambert zone II,9801,8801,52.0,9105,8802,0.0,9105,8805,0.99987742,9201,8806,600000.0,9001,8807,2200000.0,9001,,,,,,
+18083,Lambert zone III,9801,8801,49.0,9105,8802,0.0,9105,8805,0.999877499,9201,8806,600000.0,9001,8807,3200000.0,9001,,,,,,
+18084,Lambert zone IV,9801,8801,46.85,9105,8802,0.0,9105,8805,0.99994471,9201,8806,234.358,9001,8807,4185861.369,9001,,,,,,
+18085,Lambert-93,9802,8821,46.3,9110,8822,3.0,9110,8823,49.0,9110,8824,44.0,9110,8826,700000.0,9001,8827,6600000.0,9001,,,
+18086,France EuroLambert,9801,8801,46.48,9110,8802,2.2014025,9110,8805,0.99987742,9201,8806,600000.0,9001,8807,2200000.0,9001,,,,,,
+18091,Lambert Nord France,9801,8801,55.0,9105,8802,0.0,9105,8805,0.999877341,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+18092,Lambert Centre France,9801,8801,52.0,9105,8802,0.0,9105,8805,0.99987742,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+18093,Lambert Sud France,9801,8801,49.0,9105,8802,0.0,9105,8805,0.999877499,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+18094,Lambert Corse,9801,8801,46.85,9105,8802,0.0,9105,8805,0.99994471,9201,8806,234.358,9001,8807,185861.369,9001,,,,,,
+18110,India zone 0,9801,8801,39.3,9110,8802,68.0,9110,8805,0.99846154,9201,8806,2355500.0,9084,8807,2590000.0,9084,,,,,,
+18111,India zone I,9801,8801,32.3,9110,8802,68.0,9110,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18112,India zone IIa,9801,8801,26.0,9102,8802,74.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18113,India zone IIb,9801,8801,26.0,9102,8802,90.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18114,India zone IIIa,9801,8801,19.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18115,India zone IIIb,9801,8801,19.0,9102,8802,100.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18116,India zone IVa,9801,8801,12.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18117,India zone IVb,9801,8801,12.0,9102,8802,100.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18121,Italy zone 1,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+18122,Italy zone 2,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,2520000.0,9001,8807,0.0,9001,,,,,,
+18131,Nord Maroc,9801,8801,37.0,9105,8802,-6.0,9105,8805,0.999625769,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+18132,Sud Maroc,9801,8801,33.0,9105,8802,-6.0,9105,8805,0.999615596,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+18133,Sahara,9801,8801,29.0,9105,8802,-6.0,9105,8805,0.9996,9201,8806,1200000.0,9001,8807,400000.0,9001,,,,,,
+18141,New Zealand North Island National Grid,9807,8801,-39.0,9110,8802,175.3,9110,8805,1.0,9201,8806,300000.0,9040,8807,400000.0,9040,,,,,,
+18142,New Zealand South Island National Grid,9807,8801,-44.0,9110,8802,171.3,9110,8805,1.0,9201,8806,500000.0,9040,8807,500000.0,9040,,,,,,
+18151,Nigeria West Belt,9807,8801,4.0,9110,8802,4.3,9110,8805,0.99975,9201,8806,230738.26,9001,8807,0.0,9001,,,,,,
+18152,Nigeria Mid Belt,9807,8801,4.0,9110,8802,8.3,9110,8805,0.99975,9201,8806,670553.98,9001,8807,0.0,9001,,,,,,
+18153,Nigeria East Belt,9807,8801,4.0,9110,8802,12.3,9110,8805,0.99975,9201,8806,1110369.7,9001,8807,0.0,9001,,,,,,
+18161,Peru west zone,9807,8801,-6.0,9110,8802,-80.3,9110,8805,0.99983008,9201,8806,222000.0,9001,8807,1426834.743,9001,,,,,,
+18162,Peru central zone,9807,8801,-9.3,9110,8802,-76.0,9110,8805,0.99932994,9201,8806,720000.0,9001,8807,1039979.159,9001,,,,,,
+18163,Peru east zone,9807,8801,-9.3,9110,8802,-70.3,9110,8805,0.99952992,9201,8806,1324000.0,9001,8807,1040084.558,9001,,,,,,
+18171,Philippines zone I,9807,8801,0.0,9102,8802,117.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+18172,Philippines zone II,9807,8801,0.0,9102,8802,119.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+18173,Philippines zone III,9807,8801,0.0,9102,8802,121.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+18174,Philippines zone IV,9807,8801,0.0,9102,8802,123.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+18175,Philippines zone V,9807,8801,0.0,9102,8802,125.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+18181,Nord Tunisie,9801,8801,40.0,9105,8802,11.0,9105,8805,0.999625544,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+18182,Sud Tunisie,9801,8801,37.0,9105,8802,11.0,9105,8805,0.999625769,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+18191,Finland zone 1,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+18192,Finland zone 2,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+18193,Finland Uniform Coordinate System,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+18194,Finland zone 4,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+18201,Palestine Grid,9806,8801,31.4402749,9110,8802,35.124349,9110,8806,170251.555,9001,8807,126867.909,9001,,,,,,,,,
+18202,Palestine Belt,9807,8801,31.4402749,9110,8802,35.124349,9110,8805,1.0,9201,8806,170251.555,9001,8807,1126867.909,9001,,,,,,
+18203,Israeli CS,9806,8801,31.4402749,9110,8802,35.124349,9110,8806,170251.555,9001,8807,1126867.909,9001,,,,,,,,,
+18204,Israeli TM,9807,8801,31.4403817,9110,8802,35.1216261,9110,8805,1.0000067,9201,8806,219529.584,9001,8807,626907.39,9001,,,,,,
+18211,Guatemala Norte,9801,8801,16.49,9110,8802,-90.2,9110,8805,0.99992226,9201,8806,500000.0,9001,8807,292209.579,9001,,,,,,
+18212,Guatemala Sur,9801,8801,14.54,9110,8802,-90.2,9110,8805,0.99989906,9201,8806,500000.0,9001,8807,325992.681,9001,,,,,,
+18221,NGO zone I,9807,8801,58.0,9110,8802,-4.4,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18222,NGO zone II,9807,8801,58.0,9110,8802,-2.2,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18223,NGO zone III,9807,8801,58.0,9110,8802,0.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18224,NGO zone IV,9807,8801,58.0,9110,8802,2.3,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18225,NGO zone V,9807,8801,58.0,9110,8802,6.1,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18226,NGO zone VI,9807,8801,58.0,9110,8802,10.1,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18227,NGO zone VII,9807,8801,58.0,9110,8802,14.1,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18228,NGO zone VIII,9807,8801,58.0,9110,8802,18.2,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18231,"India zone I (1975 metres)",9801,8801,32.3,9110,8802,68.0,9110,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+18232,"India zone IIa (1975 metres)",9801,8801,26.0,9102,8802,74.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+18233,"India zone IIIa (1975 metres)",9801,8801,19.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+18234,"India zone IVa (1975 metres)",9801,8801,12.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+18235,"India zone IIb (1975 metres)",9801,8801,26.0,9102,8802,90.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+18236,"India zone I (1962 metres)",9801,8801,32.3,9110,8802,68.0,9110,8805,0.99878641,9201,8806,2743196.4,9001,8807,914398.8,9001,,,,,,
+18237,"India zone IIa (1962 metres)",9801,8801,26.0,9102,8802,74.0,9102,8805,0.99878641,9201,8806,2743196.4,9001,8807,914398.8,9001,,,,,,
+18238,"India zone IIb (1937 metres)",9801,8801,26.0,9102,8802,90.0,9102,8805,0.99878641,9201,8806,2743185.69,9001,8807,914395.23,9001,,,,,,
+18240,Libya zone 5,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18241,Libya zone 6,9807,8801,0.0,9102,8802,11.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18242,Libya zone 7,9807,8801,0.0,9102,8802,13.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18243,Libya zone 8,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18244,Libya zone 9,9807,8801,0.0,9102,8802,17.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18245,Libya zone 10,9807,8801,0.0,9102,8802,19.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18246,Libya zone 11,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18247,Libya zone 12,9807,8801,0.0,9102,8802,23.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18248,Libya zone 13,9807,8801,0.0,9102,8802,25.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18251,Korea East Belt,9807,8801,38.0,9102,8802,129.0,9102,8805,1.0,9201,8806,200000.0,9001,8807,500000.0,9001,,,,,,
+18252,Korea Central Belt,9807,8801,38.0,9102,8802,127.0,9102,8805,1.0,9201,8806,200000.0,9001,8807,500000.0,9001,,,,,,
+18253,Korea West Belt,9807,8801,38.0,9102,8802,125.0,9102,8805,1.0,9201,8806,200000.0,9001,8807,500000.0,9001,,,,,,
+18260,"Maracaibo Grid (M1)",9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,0.0,9001,8807,-52684.972,9001,,,,,,
+18261,Maracaibo Grid,9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,200000.0,9001,8807,147315.028,9001,,,,,,
+18262,"Maracaibo Grid (M3)",9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,500000.0,9001,8807,447315.028,9001,,,,,,
+18263,Maracaibo La Rosa Grid,9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,-17044.0,9001,8807,-23139.97,9001,,,,,,
+18275,Balkans zone 5,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9999,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+18276,Balkans zone 6,9807,8801,0.0,9102,8802,18.0,9102,8805,0.9999,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+18277,Balkans zone 7,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9999,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+18278,Balkans zone 8,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9999,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+18281,Poland zone I,9809,8801,50.373,9110,8802,21.05,9110,8805,0.9998,9201,8806,4637000.0,9001,8807,5647000.0,9001,,,,,,
+18282,Poland zone II,9809,8801,53.0007,9110,8802,21.301,9110,8805,0.9998,9201,8806,4603000.0,9001,8807,5806000.0,9001,,,,,,
+18283,Poland zone III,9809,8801,53.35,9110,8802,17.003,9110,8805,0.9998,9201,8806,3501000.0,9001,8807,5999000.0,9001,,,,,,
+18284,Poland zone IV,9809,8801,51.4015,9110,8802,16.402,9110,8805,0.9998,9201,8806,3703000.0,9001,8807,5627000.0,9001,,,,,,
+18285,Poland zone V,9807,8801,0.0,9110,8802,18.573,9110,8805,0.999983,9201,8806,237000.0,9001,8807,-4700000.0,9001,,,,,,
+18300,Poland CS92,9807,8801,0.0,9102,8802,19.0,9102,8805,0.9993,9201,8806,500000.0,9001,8807,-5300000.0,9001,,,,,,
+18305,Poland CS2000 zone 5,9807,8801,0.0,9102,8802,15.0,9102,8805,0.999923,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+18306,Poland CS2000 zone 6,9807,8801,0.0,9102,8802,18.0,9102,8805,0.999923,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+18307,Poland CS2000 zone 7,9807,8801,0.0,9102,8802,21.0,9102,8805,0.999923,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+18308,Poland CS2000 zone 8,9807,8801,0.0,9102,8802,24.0,9102,8805,0.999923,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+18401,Kp2000 Jylland og Fyn,9807,8801,0.0,9110,8802,9.3,9110,8805,0.99995,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18402,Kp2000 Sjaelland,9807,8801,0.0,9102,8802,12.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+18403,Kp2000 Bornholm,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,900000.0,9001,8807,0.0,9001,,,,,,
+18411,French West Africa Senegal zone,9807,8801,0.0,9110,8802,-13.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18412,French West Africa Ivory Coast zone,9807,8801,0.0,9110,8802,-6.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18413,French West Africa Dahomey zone,9807,8801,0.0,9110,8802,0.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18414,French West Africa Niger zone,9807,8801,0.0,9110,8802,7.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18415,French Equatorial Africa west zone,9807,8801,0.0,9110,8802,10.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18416,French Equatorial Africa central zone,9807,8801,0.0,9110,8802,17.4,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18417,French Equatorial Africa east zone,9807,8801,0.0,9110,8802,24.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18421,Greenland zone 1 east,9826,8801,82.3,9110,8802,-40.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18422,Greenland zone 2 east,9826,8801,79.3,9110,8802,-24.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18423,Greenland zone 3 east,9826,8801,76.3,9110,8802,-20.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18424,Greenland zone 4 east,9826,8801,73.3,9110,8802,-24.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18425,Greenland zone 5 east,9826,8801,70.3,9110,8802,-24.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18426,Greenland zone 6 east,9826,8801,67.3,9110,8802,-32.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18427,Greenland zone 7 east,9826,8801,64.3,9110,8802,-40.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18428,Greenland zone 8 east,9826,8801,61.3,9110,8802,-48.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18432,Greenland zone 2 west,9826,8801,79.3,9110,8802,-64.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18433,Greenland zone 3 west,9826,8801,76.3,9110,8802,-64.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18434,Greenland zone 4 west,9826,8801,73.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18435,Greenland zone 5 west,9826,8801,70.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18436,Greenland zone 6 west,9826,8801,67.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18437,Greenland zone 7 west,9826,8801,64.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18441,CS63 zone A1,9807,8801,0.07,9110,8802,41.32,9110,8805,1.0,9003,8806,1300000.0,9001,8807,0.0,9001,,,,,,
+18442,CS63 zone A2,9807,8801,0.07,9110,8802,44.32,9110,8805,1.0,9003,8806,2300000.0,9001,8807,0.0,9001,,,,,,
+18443,CS63 zone A3,9807,8801,0.07,9110,8802,47.32,9110,8805,1.0,9201,8806,3300000.0,9001,8807,0.0,9001,,,,,,
+18444,CS63 zone A4,9807,8801,0.07,9110,8802,50.32,9110,8805,1.0,9201,8806,4300000.0,9001,8807,0.0,9001,,,,,,
+18446,CS63 zone K2,9807,8801,0.08,9110,8802,50.46,9110,8805,1.0,9201,8806,2300000.0,9001,8807,0.0,9001,,,,,,
+18447,CS63 zone K3,9807,8801,0.08,9110,8802,53.46,9110,8805,1.0,9201,8806,3300000.0,9001,8807,0.0,9001,,,,,,
+18448,CS63 zone K4,9807,8801,0.08,9110,8802,56.46,9110,8805,1.0,9201,8806,4300000.0,9001,8807,0.0,9001,,,,,,
+19900,Bahrain State Grid,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19901,Belge Lambert 50,9802,8821,90.0,9110,8822,0.0,9110,8823,49.5,9110,8824,51.1,9110,8826,150000.0,9001,8827,5400000.0,9001,,,
+19902,Belge Lambert 72,9803,8821,90.0,9110,8822,4.2124983,9110,8823,49.5,9110,8824,51.1,9110,8826,150000.01256,9001,8827,5400088.4378,9001,,,
+19903,Nord de Guerre,9801,8801,55.0,9105,8802,6.0,9105,8805,0.99950908,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+19904,Ghana Metre Grid,9807,8801,4.4,9110,8802,-1.0,9110,8805,0.99975,9201,8806,274319.51,9001,8807,0.0,9001,,,,,,
+19905,Netherlands East Indies Equatorial Zone,9804,8801,0.0,9102,8802,110.0,9102,8805,0.997,9201,8806,3900000.0,9001,8807,900000.0,9001,,,,,,
+19906,Iraq zone,9801,8801,32.3,9110,8802,45.0,9110,8805,0.9987864078,9201,8806,1500000.0,9001,8807,1166200.0,9001,,,,,,
+19907,Iraq National Grid,9807,8801,29.0134566,9110,8802,46.3,9110,8805,0.9994,9201,8806,800000.0,9001,8807,0.0,9001,,,,,,
+19908,Irish National Grid,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.000035,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+19909,"Jamaica (Old Grid)",9801,8801,18.0,9102,8802,-77.0,9102,8805,1.0,9201,8806,550000.0,9005,8807,400000.0,9005,,,,,,
+19910,Jamaica National Grid,9801,8801,18.0,9102,8802,-77.0,9102,8805,1.0,9201,8806,250000.0,9001,8807,150000.0,9001,,,,,,
+19911,Laborde Grid,9815,8811,-21.0,9105,8812,49.0,9105,8813,21.0,9105,8814,21.0,9105,8815,0.9995,9201,8816,400000.0,9001,8817,800000.0,9001
+19913,RD Old,9809,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+19914,RD New,9809,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,155000.0,9001,8807,463000.0,9001,,,,,,
+19915,Aden Zone,9801,8801,15.0,9102,8802,45.0,9102,8805,0.999365678,9201,8806,1500000.0,9001,8807,1000000.0,9001,,,,,,
+19916,British National Grid,9807,8801,49.0,9102,8802,-2.0,9102,8805,0.999601272,9201,8806,400000.0,9001,8807,-100000.0,9001,,,,,,
+19917,New Zealand Map Grid,9811,8801,-41.0,9102,8802,173.0,9102,8806,2510000.0,9001,8807,6023150.0,9001,,,,,,,,,
+19919,Qatar National Grid,9807,8801,24.27,9110,8802,51.13,9110,8805,0.99999,9201,8806,200000.0,9001,8807,300000.0,9001,,,,,,
+19920,Singapore Grid,9806,8801,1.1715528,9110,8802,103.5110808,9110,8806,30000.0,9001,8807,30000.0,9001,,,,,,,,,
+19921,Spain,9801,8801,40.0,9102,8802,0.0,9102,8805,0.9988085293,9201,8806,600000.0,9001,8807,600000.0,9001,,,,,,
+19922,Swiss New Grid,9815,8811,46.570866,9110,8812,7.26225,9110,8813,90.0,9110,8814,90.0,9110,8815,1.0,9201,8816,600000.0,9001,8817,200000.0,9001
+19923,Swiss Old Grid,9815,8811,46.570866,9110,8812,0.0,9110,8813,90.0,9110,8814,90.0,9110,8815,1.0,9201,8816,0.0,9001,8817,0.0,9001
+19924,Tobago Grid,9806,8801,11.1507843,9110,8802,-60.4109632,9110,8806,187500.0,9039,8807,180000.0,9039,,,,,,,,,
+19925,Trinidad Grid,9806,8801,10.263,9110,8802,-61.2,9110,8806,430000.0,9039,8807,325000.0,9039,,,,,,,,,
+19926,Stereo 70,9809,8801,46.0,9102,8802,25.0,9102,8805,0.99975,9201,8806,500000.0,9001,8807,500000.0,9001,,,,,,
+19927,Stereo 33,9809,8801,45.54,9110,8802,25.23328772,9110,8805,0.9996667,9201,8806,500000.0,9001,8807,500000.0,9001,,,,,,
+19928,Kuwait TM,9807,8801,0.0,9102,8802,48.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19929,Swedish National Projection,9807,8801,0.0,9110,8802,15.48298,9110,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+19930,Greek Grid,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19931,Egyseges Orszagos Vetuleti,9815,8811,47.08398174,9110,8812,19.02548584,9110,8813,90.0,9110,8814,90.0,9110,8815,0.99993,9201,8816,650000.0,9001,8817,200000.0,9001
+19933,"Prince Edward Island Stereographic (ATS77)",9809,8801,47.15,9110,8802,-63.0,9110,8805,0.999912,9201,8806,700000.0,9001,8807,400000.0,9001,,,,,,
+19934,Lithuania 1994,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9998,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19935,Rectified Skew Orthomorphic Malaya Grid,9812,8806,40000.0,9062,8807,0.0,9062,8811,4.0,9110,8812,102.15,9110,8813,323.01328458,9110,8814,323.07483685,9110,8815,0.99984,9201
+19936,Portuguese National Grid,9807,8801,39.4,9110,8802,1.0,9110,8805,1.0,9201,8806,200000.0,9001,8807,300000.0,9001,,,,,,
+19937,Tunisia Mining Grid,9816,8821,38.81973,9105,8822,7.83445,9105,8826,270.0,9036,8827,582.0,9036,,,,,,,,,
+19938,Estonian National Grid,9802,8821,57.310319415,9110,8822,24.0,9110,8823,59.2,9110,8824,58.0,9110,8826,500000.0,9001,8827,6375000.0,9001,,,
+19939,TM Baltic 93,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19940,Levant Zone,9817,8801,34.39,9110,8802,37.21,9110,8805,0.9996256,9201,8806,300000.0,9001,8807,300000.0,9001,,,,,,
+19941,Brazil Polyconic,9818,8801,0.0,9102,8802,-54.0,9102,8806,5000000.0,9001,8807,10000000.0,9001,,,,,,,,,
+19942,British West Indies Grid,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+19943,Barbados National Grid,9807,8801,13.1035,9110,8802,-59.3335,9110,8805,0.9999986,9201,8806,30000.0,9001,8807,75000.0,9001,,,,,,
+19944,Quebec Lambert Projection,9802,8821,44.0,9110,8822,-68.3,9110,8823,60.0,9110,8824,46.0,9110,8826,0.0,9001,8827,0.0,9001,,,
+19945,"New Brunswick Stereographic (ATS77)",9809,8801,46.3,9110,8802,-66.3,9110,8805,0.999912,9201,8806,300000.0,9001,8807,800000.0,9001,,,,,,
+19946,"New Brunswick Stereographic (NAD83)",9809,8801,46.3,9110,8802,-66.3,9110,8805,0.999912,9201,8806,2500000.0,9001,8807,7500000.0,9001,,,,,,
+19947,Austria Lambert,9802,8821,47.3,9110,8822,13.2,9110,8823,49.0,9110,8824,46.0,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+19948,Syria Lambert,9801,8801,34.39,9110,8802,37.21,9110,8805,0.9996256,9201,8806,300000.0,9001,8807,300000.0,9001,,,,,,
+19949,Levant Stereographic,9809,8801,38.0,9105,8802,43.5,9105,8805,0.9995341,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+19950,Landesvermessung 1995,9815,8811,46.570866,9110,8812,7.26225,9110,8813,90.0,9110,8814,90.0,9110,8815,1.0,9201,8816,2600000.0,9001,8817,1200000.0,9001
+19951,Nakhl e Taqi Oblique Mercator,9815,8811,27.31077837,9110,8812,52.3612741,9110,8813,0.34179803,9110,8814,0.34179803,9110,8815,0.999895934,9201,8816,658377.437,9001,8817,3044969.194,9001
+19952,Krovak,9819,8811,49.3,9110,8812,42.3,9110,8813,30.1717303,9110,8816,0.0,9001,8817,0.0,9001,8818,78.3,9110,8819,0.9999,9201
+19953,Qatar Grid,9806,8801,25.22565,9110,8802,50.4541,9110,8806,100000.0,9001,8807,100000.0,9001,,,,,,,,,
+19954,Suriname Old TM,9807,8801,0.0,9110,8802,-55.41,9110,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19955,Suriname TM,9807,8801,0.0,9110,8802,-55.41,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19956,"Rectified Skew Orthomorphic Borneo Grid (chains)",9815,8811,4.0,9110,8812,115.0,9110,8813,53.18569537,9110,8814,53.07483685,9110,8815,0.99984,9201,8816,29352.4763,9042,8817,22014.3572,9042
+19957,"Rectified Skew Orthomorphic Borneo Grid (feet)",9815,8811,4.0,9110,8812,115.0,9110,8813,53.18569537,9110,8814,53.07483685,9110,8815,0.99984,9201,8816,1937263.44,9041,8817,1452947.58,9041
+19958,"Rectified Skew Orthomorphic Borneo Grid (metres)",9815,8811,4.0,9110,8812,115.0,9110,8813,53.18569537,9110,8814,53.07483685,9110,8815,0.99984,9201,8816,590476.87,9001,8817,442857.65,9001
+19959,Ghana National Grid,9807,8801,4.4,9110,8802,-1.0,9110,8805,0.99975,9201,8806,900000.0,9094,8807,0.0,9094,,,,,,
+19960,"Prince Edward Isl. Stereographic (NAD83)",9809,8801,47.15,9110,8802,-63.0,9110,8805,0.999912,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+19961,Belgian Lambert 72,9802,8821,90.0,9110,8822,4.2202952,9110,8823,51.100000204,9110,8824,49.500000204,9110,8826,150000.013,9001,8827,5400088.438,9001,,,
+19962,Irish Transverse Mercator,9807,8801,53.3,9110,8802,-8.0,9110,8805,0.99982,9201,8806,600000.0,9001,8807,750000.0,9001,,,,,,
+19963,Sierra Leone New Colony Grid,9807,8801,6.4,9110,8802,-12.0,9110,8805,1.0,9201,8806,500000.0,9094,8807,0.0,9094,,,,,,
+19964,New War Office Sierra Leone Grid,9807,8801,6.4,9110,8802,-12.0,9110,8805,1.0,9201,8806,800000.0,9094,8807,600000.0,9094,,,,,,
+19965,US National Atlas Equal Area,9821,8806,0.0,9001,8807,0.0,9001,8828,45.0,9102,8829,-100.0,9102,,,,,,,,,
+19966,Luxembourg Gauss,9807,8801,49.5,9110,8802,6.1,9110,8805,1.0,9201,8806,80000.0,9001,8807,100000.0,9001,,,,,,
+19967,Slovenia Grid,9807,8801,0.0,9110,8802,15.0,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19968,Plate Carree,9823,8801,0.0,9102,8802,0.0,9102,,,,,,,,,,,,,,,
+19969,Portuguese Grid,9807,8801,39.4,9110,8802,1.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+19971,New Zealand Transverse Mercator,9807,8801,0.0,9102,8802,173.0,9102,8805,0.9996,9201,8806,1600000.0,9001,8807,10000000.0,9001,,,,,,
+19972,Irish Grid,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.000035,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+19973,Irish National Grid,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.0,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+19974,Modified Portuguese Grid,9807,8801,39.4,9110,8802,-8.0754862,9110,8805,1.0,9201,8806,180.598,9001,8807,-86.99,9001,,,,,,
+19975,"Trinidad Grid (Clarke's feet)",9806,8801,10.263,9110,8802,-61.2,9110,8806,283800.0,9005,8807,214500.0,9005,,,,,,,,,
+19976,ICN Regional,9802,8821,6.0,9102,8822,-66.0,9102,8823,9.0,9102,8824,3.0,9102,8826,1000000.0,9001,8827,1000000.0,9001,,,
+19977,Aramco Lambert,9802,8821,25.0522236,9110,8822,48.0,9102,8823,17.0,9102,8824,33.0,9102,8826,0.0,9001,8827,0.0,9001,,,
+19978,Hong Kong 1980 Grid,9807,8801,22.184368,9110,8802,114.10428,9110,8805,1.0,9201,8806,836694.05,9001,8807,819069.8,9001,,,,,,
+19979,Portugal Bonne,9828,8801,39.4,9110,8802,1.0,9110,8806,0.0,9001,8807,0.0,9001,,,,,,,,,
diff --git a/src/tiff/csv/stateplane.csv b/src/tiff/csv/stateplane.csv
new file mode 100644
index 0000000..506af15
--- /dev/null
+++ b/src/tiff/csv/stateplane.csv
@@ -0,0 +1,258 @@
+"ID","STATE","ZONE","PROJ_METHOD","DATUM","USGS_CODE","EPSG_PCS_CODE"
+101,ALABAMA,EAST,1,NAD83,101,26929
+102,ALABAMA,WEST,1,NAD83,102,26930
+201,ARIZONA,EAST,1,NAD83,201,26948
+202,ARIZONA,CENTRAL,1,NAD83,202,26949
+203,ARIZONA,WEST,1,NAD83,203,26950
+301,ARKANSAS,NORTH,2,NAD83,301,26951
+302,ARKANSAS,SOUTH,2,NAD83,302,26952
+401,CALIFORNIA,I,2,NAD83,401,26941
+402,CALIFORNIA,II,2,NAD83,402,26942
+403,CALIFORNIA,III,2,NAD83,403,26943
+404,CALIFORNIA,IV,2,NAD83,404,26944
+405,CALIFORNIA,V,2,NAD83,405,26945
+406,CALIFORNIA,VI,2,NAD83,406,26946
+501,COLORADO,NORTH,2,NAD83,501,26953
+502,COLORADO,CENTRAL,2,NAD83,502,26954
+503,COLORADO,SOUTH,2,NAD83,503,26955
+600,CONNECTICUT,,2,NAD83,600,26956
+700,DELAWARE,,1,NAD83,700,26957
+901,FLORIDA,EAST,1,NAD83,901,26958
+902,FLORIDA,WEST,1,NAD83,902,26959
+903,FLORIDA,NORTH,2,NAD83,903,26960
+1001,GEORGIA,EAST,1,NAD83,1001,26966
+1002,GEORGIA,WEST,1,NAD83,1002,26967
+1101,IDAHO,EAST,1,NAD83,1101,26968
+1102,IDAHO,CENTRAL,1,NAD83,1102,26969
+1103,IDAHO,WEST,1,NAD83,1103,26970
+1201,ILLINOIS,EAST,1,NAD83,1201,26971
+1202,ILLINOIS,WEST,1,NAD83,1202,26972
+1301,INDIANA,EAST,1,NAD83,1301,26973
+1302,INDIANA,WEST,1,NAD83,1302,26974
+1401,IOWA,NORTH,2,NAD83,1401,26975
+1402,IOWA,SOUTH,2,NAD83,1402,26976
+1501,KANSAS,NORTH,2,NAD83,1501,26977
+1502,KANSAS,SOUTH,2,NAD83,1502,26978
+1601,KENTUCKY,NORTH,2,NAD83,1601,2205
+1602,KENTUCKY,SOUTH,2,NAD83,1602,26980
+1701,LOUISIANA,NORTH,2,NAD83,1701,26981
+1702,LOUISIANA,SOUTH,2,NAD83,1702,26982
+1703,LOUISIANA,OFFSHORE,2,NAD83,1703,
+1801,MAINE,EAST,1,NAD83,1801,26983
+1802,MAINE,WEST,1,NAD83,1802,26984
+1900,MARYLAND,,2,NAD83,1900,26985
+2001,MASSACHUSETTS,MAINLAND,2,NAD83,2001,26986
+2002,MASSACHUSETTS,ISLAND,2,NAD83,2002,26987
+2111,MICHIGAN,NORTH,2,NAD83,2111,26988
+2112,MICHIGAN,CENTRAL,2,NAD83,2112,26989
+2113,MICHIGAN,SOUTH,2,NAD83,2113,26990
+2201,MINNESOTA,NORTH,2,NAD83,2201,26991
+2202,MINNESOTA,CENTRAL,2,NAD83,2202,26992
+2203,MINNESOTA,SOUTH,2,NAD83,2203,26993
+2301,MISSISSIPPI,EAST,1,NAD83,2301,26994
+2302,MISSISSIPPI,WEST,1,NAD83,2302,26995
+2401,MISSOURI,EAST,1,NAD83,2401,26996
+2402,MISSOURI,CENTRAL,1,NAD83,2402,26997
+2403,MISSOURI,WEST,1,NAD83,2403,26998
+2500,MONTANA,,2,NAD83,2500,32100
+2600,NEBRASKA,,2,NAD83,2600,32104
+2701,NEVADA,EAST,1,NAD83,2701,32107
+2702,NEVADA,CENTRAL,1,NAD83,2702,32108
+2703,NEVADA,WEST,1,NAD83,2703,32109
+2800,"NEW HAMPSHIRE",,1,NAD83,2800,32110
+2900,"NEW JERSEY",,1,NAD83,2900,32111
+3001,"NEW MEXICO",EAST,1,NAD83,3001,32112
+3002,"NEW MEXICO",CENTRAL,1,NAD83,3002,32113
+3003,"NEW MEXICO",WEST,1,NAD83,3003,32114
+3101,"NEW YORK",EAST,1,NAD83,3101,32115
+3102,"NEW YORK",CENTRAL,1,NAD83,3102,32116
+3103,"NEW YORK",WEST,1,NAD83,3103,32117
+3104,"NEW YORK","LONG ISLAND",2,NAD83,3104,32118
+3200,"NORTH CAROLINA",,2,NAD83,3200,32119
+3301,"NORTH DAKOTA",NORTH,2,NAD83,3301,32120
+3302,"NORTH DAKOTA",SOUTH,2,NAD83,3302,32121
+3401,OHIO,NORTH,2,NAD83,3401,32122
+3402,OHIO,SOUTH,2,NAD83,3402,32123
+3501,OKLAHOMA,NORTH,2,NAD83,3501,32124
+3502,OKLAHOMA,SOUTH,2,NAD83,3502,32125
+3601,OREGON,NORTH,2,NAD83,3601,32126
+3602,OREGON,SOUTH,2,NAD83,3602,32127
+3701,PENNSYLVANIA,NORTH,2,NAD83,3701,32128
+3702,PENNSYLVANIA,SOUTH,2,NAD83,3702,32129
+3800,"RHODE ISLAND",,1,NAD83,3800,32130
+3900,"SOUTH CAROLINA",,2,NAD83,3900,32133
+4001,"SOUTH DAKOTA",NORTH,2,NAD83,4001,32134
+4002,"SOUTH DAKOTA",SOUTH,2,NAD83,4002,32135
+4100,TENNESSEE,,2,NAD83,4100,32136
+4201,TEXAS,NORTH,2,NAD83,4201,32137
+4202,TEXAS,"NORTH CENTRAL",2,NAD83,4202,32138
+4203,TEXAS,CENTRAL,2,NAD83,4203,32139
+4204,TEXAS,"SOUTH CENTRAL",2,NAD83,4204,32140
+4205,TEXAS,SOUTH,2,NAD83,4205,32141
+4301,UTAH,NORTH,2,NAD83,4301,32142
+4302,UTAH,CENTRAL,2,NAD83,4302,32143
+4303,UTAH,SOUTH,2,NAD83,4303,32144
+4400,VERMONT,,1,NAD83,4400,32145
+4501,VIRGINIA,NORTH,2,NAD83,4501,32146
+4502,VIRGINIA,SOUTH,2,NAD83,4502,32147
+4601,WASHINGTON,NORTH,2,NAD83,4601,32148
+4602,WASHINGTON,SOUTH,2,NAD83,4602,32149
+4701,"WEST VIRGINIA",NORTH,2,NAD83,4701,32150
+4702,"WEST VIRGINIA",SOUTH,2,NAD83,4702,32151
+4801,WISCONSIN,NORTH,2,NAD83,4801,32152
+4802,WISCONSIN,CENTRAL,2,NAD83,4802,32153
+4803,WISCONSIN,SOUTH,2,NAD83,4803,32154
+4901,WYOMING,EAST,1,NAD83,4901,32155
+4902,WYOMING,"EAST CENTRAL",1,NAD83,4902,32156
+4903,WYOMING,"WEST CENTRAL",1,NAD83,4903,32157
+4904,WYOMING,WEST,1,NAD83,4904,32158
+5001,ALASKA,"ZONE NO. 1",4,NAD83,5001,26931
+5002,ALASKA,"ZONE NO. 2",1,NAD83,5002,26932
+5003,ALASKA,"ZONE NO. 3",1,NAD83,5003,26933
+5004,ALASKA,"ZONE NO. 4",1,NAD83,5004,26934
+5005,ALASKA,"ZONE NO. 5",1,NAD83,5005,26935
+5006,ALASKA,"ZONE NO. 6",1,NAD83,5006,26936
+5007,ALASKA,"ZONE NO. 7",1,NAD83,5007,26937
+5008,ALASKA,"ZONE NO. 8",1,NAD83,5008,26938
+5009,ALASKA,"ZONE NO. 9",1,NAD83,5009,26939
+5010,ALASKA,"ZONE NO. 10",2,NAD83,5010,26940
+5101,HAWAII,1,1,NAD83,5101,26961
+5102,HAWAII,2,1,NAD83,5102,26962
+5103,HAWAII,3,1,NAD83,5103,26963
+5104,HAWAII,4,1,NAD83,5104,26964
+5105,HAWAII,5,1,NAD83,5105,26965
+5200,"PUERTO RICO AND","VIRGIN ISLANDS",2,NAD83,5200,32161
+10101,ALABAMA,EAST,1,NAD27,101,26729
+10102,ALABAMA,WEST,1,NAD27,102,26730
+10201,ARIZONA,EAST,1,NAD27,201,26748
+10202,ARIZONA,CENTRAL,1,NAD27,202,26749
+10203,ARIZONA,WEST,1,NAD27,203,26750
+10301,ARKANSAS,NORTH,2,NAD27,301,26751
+10302,ARKANSAS,SOUTH,2,NAD27,302,26752
+10401,CALIFORNIA,I,2,NAD27,401,26741
+10402,CALIFORNIA,II,2,NAD27,402,26742
+10403,CALIFORNIA,III,2,NAD27,403,26743
+10404,CALIFORNIA,IV,2,NAD27,404,26744
+10405,CALIFORNIA,V,2,NAD27,405,26745
+10406,CALIFORNIA,VI,2,NAD27,406,26746
+10407,CALIFORNIA,VII,2,NAD27,407,26747
+10501,COLORADO,NORTH,2,NAD27,501,26753
+10502,COLORADO,CENTRAL,2,NAD27,502,26754
+10503,COLORADO,SOUTH,2,NAD27,503,26755
+10600,CONNECTICUT,,2,NAD27,600,26756
+10700,DELAWARE,,1,NAD27,700,26757
+10901,FLORIDA,EAST,1,NAD27,901,26758
+10902,FLORIDA,WEST,1,NAD27,902,26759
+10903,FLORIDA,NORTH,2,NAD27,903,26760
+11001,GEORGIA,EAST,1,NAD27,1001,26766
+11002,GEORGIA,WEST,1,NAD27,1002,26767
+11101,IDAHO,EAST,1,NAD27,1101,26768
+11102,IDAHO,CENTRAL,1,NAD27,1102,26769
+11103,IDAHO,WEST,1,NAD27,1103,26770
+11201,ILLINOIS,EAST,1,NAD27,1201,26771
+11202,ILLINOIS,WEST,1,NAD27,1202,26772
+11301,INDIANA,EAST,1,NAD27,1301,26773
+11302,INDIANA,WEST,1,NAD27,1302,26774
+11401,IOWA,NORTH,2,NAD27,1401,26775
+11402,IOWA,SOUTH,2,NAD27,1402,26776
+11501,KANSAS,NORTH,2,NAD27,1501,26777
+11502,KANSAS,SOUTH,2,NAD27,1502,26778
+11601,KENTUCKY,NORTH,2,NAD27,1601,26779
+11602,KENTUCKY,SOUTH,2,NAD27,1602,26780
+11701,LOUISIANA,NORTH,2,NAD27,1701,26781
+11702,LOUISIANA,SOUTH,2,NAD27,1702,26782
+11703,LOUISIANA,OFFSHORE,2,NAD27,1703,
+11801,MAINE,EAST,1,NAD27,1801,26783
+11802,MAINE,WEST,1,NAD27,1802,26784
+11900,MARYLAND,,2,NAD27,1900,26785
+12001,MASSACHUSETTS,MAINLAND,2,NAD27,2001,26786
+12002,MASSACHUSETTS,ISLAND,2,NAD27,2002,26787
+12101,MICHIGAN,EAST,1,NAD27,2101,26801
+12102,MICHIGAN,"CENTRAL/M",1,NAD27,2102,26802
+12103,MICHIGAN,WEST,1,NAD27,2103,26803
+12111,MICHIGAN,NORTH,2,NAD27,2111,26811
+12112,MICHIGAN,"CENTRAL/L",2,NAD27,2112,26812
+12113,MICHIGAN,SOUTH,2,NAD27,2113,26813
+12201,MINNESOTA,NORTH,2,NAD27,2201,26791
+12202,MINNESOTA,CENTRAL,2,NAD27,2202,26792
+12203,MINNESOTA,SOUTH,2,NAD27,2203,26793
+12301,MISSISSIPPI,EAST,1,NAD27,2301,26794
+12302,MISSISSIPPI,WEST,1,NAD27,2302,26795
+12401,MISSOURI,EAST,1,NAD27,2401,26796
+12402,MISSOURI,CENTRAL,1,NAD27,2402,26797
+12403,MISSOURI,WEST,1,NAD27,2403,26798
+12501,MONTANA,NORTH,2,NAD27,2501,32001
+12502,MONTANA,CENTRAL,2,NAD27,2502,32002
+12503,MONTANA,SOUTH,2,NAD27,2503,32003
+12601,NEBRASKA,NORTH,2,NAD27,2601,32005
+12602,NEBRASKA,SOUTH,2,NAD27,2602,32006
+12701,NEVADA,EAST,1,NAD27,2701,32007
+12702,NEVADA,CENTRAL,1,NAD27,2702,32008
+12703,NEVADA,WEST,1,NAD27,2703,32009
+12800,"NEW HAMPSHIRE",,1,NAD27,2800,32010
+12900,"NEW JERSEY",,1,NAD27,2900,32011
+13001,"NEW MEXICO",EAST,1,NAD27,3001,32012
+13002,"NEW MEXICO",CENTRAL,1,NAD27,3002,32013
+13003,"NEW MEXICO",WEST,1,NAD27,3003,32014
+13101,"NEW YORK",EAST,1,NAD27,3101,32015
+13102,"NEW YORK",CENTRAL,1,NAD27,3102,32016
+13103,"NEW YORK",WEST,1,NAD27,3103,32017
+13104,"NEW YORK","LONG ISLAND",2,NAD27,3104,32018
+13200,"NORTH CAROLINA",,2,NAD27,3200,32019
+13301,"NORTH DAKOTA",NORTH,2,NAD27,3301,32020
+13302,"NORTH DAKOTA",SOUTH,2,NAD27,3302,32021
+13401,OHIO,NORTH,2,NAD27,3401,32022
+13402,OHIO,SOUTH,2,NAD27,3402,32023
+13501,OKLAHOMA,NORTH,2,NAD27,3501,32024
+13502,OKLAHOMA,SOUTH,2,NAD27,3502,32025
+13601,OREGON,NORTH,2,NAD27,3601,32026
+13602,OREGON,SOUTH,2,NAD27,3602,32027
+13701,PENNSYLVANIA,NORTH,2,NAD27,3701,32028
+13702,PENNSYLVANIA,SOUTH,2,NAD27,3702,32029
+13800,"RHODE ISLAND",,1,NAD27,3800,32030
+13901,"SOUTH CAROLINA",NORTH,2,NAD27,3901,32031
+13902,"SOUTH CAROLINA",SOUTH,2,NAD27,3902,32033
+14001,"SOUTH DAKOTA",NORTH,2,NAD27,4001,32034
+14002,"SOUTH DAKOTA",SOUTH,2,NAD27,4002,32035
+14100,TENNESSEE,,2,NAD27,4100,2204
+14201,TEXAS,NORTH,2,NAD27,4201,32037
+14202,TEXAS,"NORTH CENTRAL",2,NAD27,4202,32038
+14203,TEXAS,CENTRAL,2,NAD27,4203,32039
+14204,TEXAS,"SOUTH CENTRAL",2,NAD27,4204,32040
+14205,TEXAS,SOUTH,2,NAD27,4205,32041
+14301,UTAH,NORTH,2,NAD27,4301,32042
+14302,UTAH,CENTRAL,2,NAD27,4302,32043
+14303,UTAH,SOUTH,2,NAD27,4303,32044
+14400,VERMONT,,1,NAD27,4400,32045
+14501,VIRGINIA,NORTH,2,NAD27,4501,32046
+14502,VIRGINIA,SOUTH,2,NAD27,4502,32047
+14601,WASHINGTON,NORTH,2,NAD27,4601,32048
+14602,WASHINGTON,SOUTH,2,NAD27,4602,32049
+14701,"WEST VIRGINIA",NORTH,2,NAD27,4701,32050
+14702,"WEST VIRGINIA",SOUTH,2,NAD27,4702,32051
+14801,WISCONSIN,NORTH,2,NAD27,4801,32052
+14802,WISCONSIN,CENTRAL,2,NAD27,4802,32053
+14803,WISCONSIN,SOUTH,2,NAD27,4803,32054
+14901,WYOMING,EAST,1,NAD27,4901,32055
+14902,WYOMING,"EAST CENTRAL",1,NAD27,4902,32056
+14903,WYOMING,"WEST CENTRAL",1,NAD27,4903,32057
+14904,WYOMING,WEST,1,NAD27,4904,32058
+15001,ALASKA,"ZONE NO. 1",4,NAD27,5001,26731
+15002,ALASKA,"ZONE NO. 2",1,NAD27,5002,26732
+15003,ALASKA,"ZONE NO. 3",1,NAD27,5003,26733
+15004,ALASKA,"ZONE NO. 4",1,NAD27,5004,26734
+15005,ALASKA,"ZONE NO. 5",1,NAD27,5005,26735
+15006,ALASKA,"ZONE NO. 6",1,NAD27,5006,26736
+15007,ALASKA,"ZONE NO. 7",1,NAD27,5007,26737
+15008,ALASKA,"ZONE NO. 8",1,NAD27,5008,26738
+15009,ALASKA,"ZONE NO. 9",1,NAD27,5009,26739
+15010,ALASKA,"ZONE NO. 10",2,NAD27,5010,26740
+15101,HAWAII,1,1,NAD27,5101,3561
+15102,HAWAII,2,1,NAD27,5102,3562
+15103,HAWAII,3,1,NAD27,5103,3563
+15104,HAWAII,4,1,NAD27,5104,3564
+15105,HAWAII,5,1,NAD27,5105,3565
+15201,"PUERTO RICO AND VIRGIN ISLANDS",,2,NAD27,5201,3991
+15202,"VIRGIN ISLANDS","ST. CROIX",2,NAD27,5202,3992
+15300,"AMERICAN SAMOA",,2,NAD27,5300,2155
+15400,"GUAM ISLAND",,3,NAD27,5400,
diff --git a/src/tiff/csv/trf_method.c b/src/tiff/csv/trf_method.c
new file mode 100644
index 0000000..dc7ecb6
--- /dev/null
+++ b/src/tiff/csv/trf_method.c
@@ -0,0 +1,205 @@
+#include "defs.h"
+datafile_rows_t trf_method_row_1[] = {"COORD_TRF_METHOD_CODE","CTRF_METHOD_EPSG_NAME","CTRF_METHOD_USER_NAME","DESCRIPTION","PARAM_1_NAME","PARAM_2_NAME","PARAM_3_NAME","PARAM_4_NAME","PARAM_5_NAME","PARAM_6_NAME","PARAM_7_NAME","PARAM_8_NAME","PARAM_9_NAME","PARAM_10_NAME","PARAM_11_NAME","PARAM_12_NAME","PARAM_13_NAME","PARAM_14_NAME","PARAM_15_NAME","PARAM_16_NAME","PARAM_17_NAME","PARAM_18_NAME","PARAM_19_NAME","PARAM_20_NAME","PARAM_21_NAME","PARAM_22_NAME","PARAM_23_NAME","PARAM_24 [...]
+datafile_rows_t trf_method_row_2[] = {"9601","Longitude rotation","","This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.","Longitude rotation","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Lon2 = Lon1 + longitude_rotation.","","1999-11-12 00:00:00","","EPSG","","99.79",NULL};
+datafile_rows_t trf_method_row_3[] = {"9602","Geodetic/geocentric conversions","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Latitude, P, and Longitude, L, in terms of Geographic Coordinate System (GCS) A may \
+be expressed in terms of a geocentric (earth centred) cartesian coordinate system X, Y, Z \
+with the Z axis corresponding with the Polar axis positive northwards, the X a","Consider a North Sea point with coordinates derived by GPS satellite in the WGS84 geographical coordinate system with coordinates of:\
+\
+ latitude 53 deg 48 min 33.82 sec N, \
+ longitude 02 deg 07 min 46.38 sec E, \
+ and ellipsoid","1996-09-18 00:00:00","\"Transformation from spatial to geographical coordinates\"; B. R. Bowring; Survey Review number 181; July 1976.","EPSG","","97.29",NULL};
+datafile_rows_t trf_method_row_4[] = {"9603","Geocentric translations","","","X-axis translation","Y-axis translation","Z-axis translation","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","If we may assume that the minor axes of the ellipsoids are parallel, then shifts dX, dY, dZ \
+in the sense from datum A to datum B may then be applied as\
+\
+ XB = XA + dX \
+ YB = YA + dY\
+ ZB = ZA + dZ","Given a three parameter datum shift from WGS84 to ED50 for this North Sea area is given as \
+dX = +84.87m, dY = +96.49m, dZ = +116.95m. \
+\
+The WGS84 geographical coordinates convert to the following GS84 geocentric values using \
+the above formulas for X,","1996-09-18 00:00:00","POSC Epicentre 2.2.1","EPSG","","",NULL};
+datafile_rows_t trf_method_row_5[] = {"9604","Molodenski","","","X-axis translation","Y-axis translation","Z-axis translation","Semi-major axis length difference","Flattening difference","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_method_row_6[] = {"9605","Abridged Molodenski","","","X-axis translation","Y-axis translation","Z-axis translation","Semi-major axis length difference","Flattening difference","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","As an alternative to the computation of the new latitude, longitude and height above ellipsoid in discrete steps through geocentric coordinates, the changes in these coordinates may be derived direct [...]
+datafile_rows_t trf_method_row_7[] = {"9606","Position Vector 7-param. transformation","","","X-axis translation","Y-axis translation","Z-axis translation","X-axis rotation","Y-axis rotation","Z-axis rotation","Scale difference","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Transformation of coordinates from one geographic coordinate system into another (also known as a \"datum transformation\") is usually carried out as an implicit concatenat [...]
+[geographical to geocentric >> geocentric to geocentric","Input point: \
+Coordinate system: WGS72 (geographic 3D)\
+ Latitude = 55 deg 00 min 00 sec \
+ Longitude = 4 deg 00 min 00 sec \
+ Ellipsoidal height = 0 m\
+This transforms to cartesian geocentric coords:\
+ X = 3 657 660.66 (m) \
+ Y = 255 768","1996-09-18 00:00:00","","EPSG","","98.16",NULL};
+datafile_rows_t trf_method_row_8[] = {"9607","Coordinate Frame rotation","","","X-axis translation","Y-axis translation","Z-axis translation","X-axis rotation","Y-axis rotation","Z-axis rotation","Scale difference","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","<<<<<This text is continued from the description of the Position Vector Transformation formula>>>>>\
+\
+Although being common practice in particularly the European E&P industry Position Vector Transformation sign convention is not universally accepted. A v","The same example as for the Position Vector Transformation can be calculated, however the following transformation parameters have to be applied to achieve the same input and output in terms of coordinate values:\
+\
+Transformation parameters Coordinate Fra","1996-09-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_method_row_9[] = {"9608","Similarity transform","","","A1","A2 * m","A3 * n","B1","B2 * m","B3 * n","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_method_row_10[] = {"9609","2-dimensional Affine transformation","","","A1","A2 * m","A3 * n","B1","B2 * m","B3 * n","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_method_row_11[] = {"9610","2nd-order Polynomial function","","","Ordinate 1 of source evaluation point","Ordinate 2 of source evaluation point","Ordinate 1 of target evaluation point","Ordinate 2 of target evaluation point","A1","A2 * m","A3 * n","A4 * mm","A5 * mn","A6 * nn","B1","B2 * m","B3 * n","B4 * mm","B5 * mn","B6 * nn","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_method_row_12[] = {"9611","3rd-order Polynomial function","","","Ordinate 1 of source evaluation point","Ordinate 2 of source evaluation point","Ordinate 1 of target evaluation point","Ordinate 2 of target evaluation point","A1","A2 * m","A3 * n","A4 * mm","A5 * mn","A6 * nn","A7 * mmm","A8 * mmn","A9 * mnn","A10 * nnn","B1","B2 * m","B3 * n","B4 * mm","B5 * mn","B6 * nn","B7 * mmm","B8 * mmn","B9 * mnn","B10 * nnn","","","","","","","","","","","","","","","","1996-0 [...]
+datafile_rows_t trf_method_row_13[] = {"9612","4th-order Polynomial function","","","Ordinate 1 of source evaluation point","Ordinate 2 of source evaluation point","Ordinate 1 of target evaluation point","Ordinate 2 of target evaluation point","A1","A2 * m","A3 * n","A4 * mm","A5 * mn","A6 * nn","A7 * mmm","A8 * mmn","A9 * mnn","A10 * nnn","A11 * mmmm","A12 * mmmn","A13 * mmnn","A14 * mnnn","A15 * nnnn","B1","B2 * m","B3 * n","B4 * mm","B5 * mn","B6 * nn","B7 * mmm","B8 * mmn","B9 * mnn" [...]
+datafile_rows_t trf_method_row_14[] = {"9613","NADCON","","Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation. Used specifically for some NAD27<->NAD83 transformations in USA.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Latitude difference gridded binary file","Longitude difference gridded binary file","","","","1996-09-18 00:00:00","US Coast and geodetic Survey - http://www.ngs.no [...]
+datafile_rows_t trf_method_row_15[] = {"9614","NTv1","","Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation. Used specifically for some NAD27<->NAD83 transformations in Canada.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Latitude and longitude difference file","","","","","1997-11-13 00:00:00","Geomatics Canada - Geodetic Survey Division.","EPSG","Superceded in 1997 by NTv2 (transf [...]
+datafile_rows_t trf_method_row_16[] = {"9615","NTv2","","Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Latitude and longitude difference file","","","","","1997-11-13 00:00:00","http://www.geod.nrcan.gc.ca/products/html-public/GSDapps/English/NTv2_Fact_Sheet.html","EPSG","Supercedes NTv1 (transformation method code 9614). Input exp [...]
+datafile_rows_t trf_method_row_17[] = {"9616","Vertical Offset","","This transformation allows calculation of ordinate in the target system by adding the parameter value to the ordinate value of the point in the source system.","Vertical offset","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","V2 = [(V1 * U1) + (O12 * Uoff)] * (m / U2) where V2 = value in second vertical coordinate system; V1 = value in first system; O12 is the [...]
+datafile_rows_t trf_method_row_18[] = {"9617","Madrid to ED50","","","","","","","A","B","C","D","E","F","G","H","J","","","","","","","","","","","","","","","","","","","","","","","","","The original geographic coordinate system for the Spanish mainland was based on Madrid 1870 datum, Struve 1860 ellipsoid, with longitudes related to the Madrid meridian. Three polynomial expressions have been empirically derived by El Servicio Geogr�fico ","Input point coordinate system: Madrid 1870 [...]
+ Latitude = 42 deg 38 min 52.77 sec N = 42.647992 degrees\
+ Longitude = 3 deg 39 min 34.57 sec E of Madrid \
+ = +3.659603 degrees from the Madrid merid","1999-11-15 00:00:00","Institut de Geomatica; Barcelona","EPSG","","99.284 99.82",NULL};
+datafile_rows_t trf_method_row_19[] = {"9618","Geographical and Height Offsets","","This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.","Latitude offset","Longitude offset","Gravity-related to ellipsoid height","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Lat2 = Lat1 + latitude_offset; Lon2 = Lon1 + longitude_offset; [...]
+datafile_rows_t trf_method_row_20[] = {"9619","Geographical Offsets","","This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.","Latitude offset","Longitude offset","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Lat2 = Lat1 + latitude_offset; Lon2 = Lon1 + longitude_offset.","","1999-11-12 00:00:00","","EPSG","","99.79",NULL};
+datafile_rows_t trf_method_row_21[] = {"9620","Norway Offshore Interpolation","","","","","","","","Geod. tfm. code for northern boundary","Geod. tfm. code for southern boundary","","","","","","","","","","","","","","","","","","","","","","","","","","","","Geod. tfm. name for northern boundary","Geod. tfm. name for southern boundary","","","","1999-04-22 00:00:00","Norwegian Mapping Authority note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\".","EPSG","","",NULL};
+datafile_rows_t trf_method_row_22[] = {"9801","Lambert Conic Conformal (1SP)","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","To derive the projected Easting and Northing coordinates of a point with geographical coordinates (lat,lon) the formulas for the one standard parallel case are:\
+\
+E = FE + r sin(theta)\
+N = FN + r0 - r cos(theta)\
+where\
+n = sin lat0\
+r = a F t^n k0 f","For Projected Coordinate System JAD69 / Jamaica National Grid\
+\
+Parameters:\
+Ellipsoid: Clarke 1866, a = 6378206.400 m., 1/f = 294.97870\
+ then e = 0.08227185 and e^2 = 0.00676866\
+\
+Latitude Natural Origin 18 d","1996-09-18 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1","EPSG","","",NULL};
+datafile_rows_t trf_method_row_23[] = {"9802","Lambert Conic Conformal (2SP)","","","Latitude of false origin","Longitude of false origin","Latitude of 1st standard parallel","Latitude of 2nd standard parallel","","Easting at false origin","Northing at false origin","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","To derive the projected Easting and Northing coordinates of a point with geographical coordinates (lat,lon) the formulas for the one s [...]
+\
+E = EF + r sin(theta)\
+N = NF + rF - r cos(theta)\
+where\
+m = cos(lat)/(1 - e^2 sin^2(lat))^","For Projected Coordinate System NAD27 / Texas South Central\
+\
+Parameters:\
+Ellipsoid Clarke 1866, a = 6378206.400 metres = 20925832.16 US survey feet\
+ 1/f = 294.97870\
+then e = 0.08227185 and e^2 = 0.00676866\
+\
+First S","1999-04-22 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1","EPSG","","99.281",NULL};
+datafile_rows_t trf_method_row_24[] = {"9803","Lambert Conic Conformal (2SP Belgium)","","","Latitude of false origin","Longitude of false origin","Latitude of 1st standard parallel","Latitude of 2nd standard parallel","","Easting at false origin","Northing at false origin","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Since 1972 a modified form of the two standard parallel case has been used in Belgium. For the Lambert Conic Conformal (2 SP [...]
+Easting, E = EF + r sin (theta - alpha)","For Projected Coordinate System Belge l972 / Belge Lambert 72\
+\
+Parameters:\
+Ellipsoid International 1924, a = 6378388 metres\
+ 1/f = 297\
+then e = 0.08199189 and e^2 = 0.006722670\
+\
+First Standard Parallel ","1999-04-22 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1","EPSG","","99.281",NULL};
+datafile_rows_t trf_method_row_25[] = {"9804","Mercator (1SP)","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The formulas to derive projected Easting and Northing coordinates are:\
+\
+E = FE + a*k0(lon - lon0) \
+N = FN + a*k0* ln{tan(pi/4 + lat/2)[(1 - esin(lat))(1 + esin(lat))]^e/2} where symbols are as listed above and logarithms are natural.\
+\
+The","For Projected Coordinate System Makassar / NEIEZ\
+\
+Parameters:\
+Ellipsoid Bessel 1841 a = 6377397.155 m 1/f = 299.15281\
+then e = 0.08169683\
+\
+Latitude Natural Origin 00o00'00\"N = 0.0000000 rad\
+Longitude Natural Origin 110o00'00\"E = 1.","1996-09-18 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.2","EPSG","","",NULL};
+datafile_rows_t trf_method_row_26[] = {"9805","Mercator (2SP)","","","Latitude of 1st standard parallel","Longitude of natural origin","","","","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The formulas to derive projected Easting and Northing coordinates are:\
+\
+For the two standard parallel case, k0 is first calculated from\
+\
+k0 = cos(latSP1)/(1 - e^2*sin^2(latSP1))^0.5 \
+ \
+where latSP1 is the absolute value of the first standard parallel","For Projected Coordinate System Pulkovo 1942 / Mercator Caspian Sea\
+\
+Parameters:\
+Ellipsoid Krassowski 1940 a = 6378245.00m 1/f = 298.300\
+then e = 0.08181333 and e^2 = 0.00669342\
+\
+Latitude first SP 42o00'00\"N = 0.73303","1996-09-18 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.2","EPSG","","",NULL};
+datafile_rows_t trf_method_row_27[] = {"9806","Cassini-Soldner","","","Latitude of natural origin","Longitude of natural origin","","","","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The formulas to derive projected Easting and Northing coordinates are:\
+\
+Easting E = FE + nu[A - TA^3/6 -(8 - T + 8C)TA^5/120]\
+\
+Northing N = FN + M - M0 + nu*tan(lat)*[A^2/2 + (5 - T + 6C)A^4/24]\
+\
+where A = (lon - lon0)cos(lat)\
+T = tan^2(lat)\
+C = e2","For Projected Coordinate System Trinidad 1903 / Trinidad Grid \
+Parameters:\
+Ellipsoid Clarke 1858 a = 20926348 ft = 31706587.88 links\
+ b = 20855233 ft\
+\
+then 1/f = 294.97870 and e^2 = 0.00676866\
+\
+Latitud","1996-09-18 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.3","EPSG","","",NULL};
+datafile_rows_t trf_method_row_28[] = {"9807","Transverse Mercator","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The formulas to derive the projected Easting and Northing coordinates are in the form of a series as follows:\
+\
+Easting, E = FE + k0*nu[A + (1 - T + C)A^3/6 + (5 - 18T + T^2 + 72C - 58e'sq)A^5/120] \
+\
+Northing, N = FN + k0{M - M0 + nu*tan(lat)[A^2/2 + ","For Projected Coordinate System OSGB 1936 / British National Grid\
+\
+Parameters:\
+Ellipsoid Airy 1830 a = 6377563.396 m 1/f = 299.32496\
+then e'^2 = 0.00671534 and e^2 = 0.00667054\
+\
+Latitude Natural Origin 49o00'00\"N = 0.85521133 rad\
+Longit","1996-09-18 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.4","EPSG","","",NULL};
+datafile_rows_t trf_method_row_29[] = {"9808","Transverse Mercator (South Orientated)","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","For the mapping of southern Africa a south oriented Transverse Mercator projection is used. Here the coordinate axes are called Westings and Southings and increment to the West [...]
+datafile_rows_t trf_method_row_30[] = {"9809","Oblique Stereographic","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The coordinate transformation from geographical to projected coordinates is executed via the distance and azimuth of the point from the centre point or origin. For a sphere the formulas are rela [...]
+\
+Parameters:\
+Ellipsoid Bessel 1841 a = 6377397.155 m 1/f = 299.15281\
+then e = 0.08169683\
+\
+Latitude Natural Origin 52o09'22.178\"N = 0.910296727 rad\
+Longitude Natural Origin 5o23'1","1999-11-15 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.6","EPSG","","99.811",NULL};
+datafile_rows_t trf_method_row_31[] = {"9810","Polar Stereographic","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","For the forward transformation from latitude and longitude,\
+\
+E = FE + rho sin(lon - lon0)\
+N = FN - rho cos(lon - lon0)\
+where\
+rho = 2 a ko t /{[((1+e)^(1+e)) ((1-e)^(1-e))]^0.5}\
+t = tan (pi/4 - lat/2) / [(1-esin(lat) ) / (1 + e sin(lat))]^(e/2)\
+\
+For","","1996-09-18 00:00:00","US Geological Survey Professional Paper 1395; \"Map Projections - A Working Manual\"; J. Snyder","EPSG","","",NULL};
+datafile_rows_t trf_method_row_32[] = {"9811","New Zealand Map Grid","","","Latitude of natural origin","Longitude of natural origin","","","","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","New Zealand Department of Lands technical circular 1973/32","EPSG","","",NULL};
+datafile_rows_t trf_method_row_33[] = {"9812","Hotine Oblique Mercator","","","Latitude of projection centre","Longitude of projection centre","Azimuth of initial line","Angle from Rectified to Skew Grid","Scale factor on initial line","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The following constants for the projection may be calculated :\
+\
+B = (1 + esq * cos^4(latc) / (1 - esq ))^0.5\
+A = a * B * kc *(1 - esq )^0.5 / ( 1 - esq * sin^2(latc))\
+t0 = tan(pi/4 - latc/2) / ((1 - e*sin(latc)) / (1 + e*sin(latc)))^(e/2)\
+D = B (1 - e","For Projected Coordinate System Timbalai 1948 / R.S.O. Borneo (m)\
+\
+Parameters:\
+ Ellipsoid: Everest 1830 (1967 Definition)\
+ a = 6377298.556 metres 1/f = 300.8017\
+ then e = 0.081472981 e2 = 0.006637847\
+ \
+ Latitude Projection Centre fc 4","1999-11-15 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.5","EPSG","","97.62 99.811",NULL};
+datafile_rows_t trf_method_row_34[] = {"9813","Laborde Oblique Mercator","","","Latitude of projection centre","Longitude of projection centre","Azimuth of initial line","","Scale factor on initial line","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","\"La nouvelle projection du Service Geographique de Madagascar\"; J. Laborde; 1928","EPSG","Can be accomodated by Oblique Mercator metho [...]
+datafile_rows_t trf_method_row_35[] = {"9814","Swiss Oblique Cylindrical","","","Latitude of projection centre","Longitude of projection centre","","","","Easting at projection centre","Northing at projection centre","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","\"Die projecktionen der Schweizerischen Plan und Kartenwerke\"; J Bollinger; 1967","EPSG","Can be accomodated by Oblique Mercator method (code 9815).","97.6 [...]
+datafile_rows_t trf_method_row_36[] = {"9815","Oblique Mercator","","","Latitude of projection centre","Longitude of projection centre","Azimuth of initial line","Angle from Rectified to Skew Grid","Scale factor on initial line","Easting at projection centre","Northing at projection centre","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The following constants for the projection may be calculated :\
+\
+B = (1 + esq * cos^4(latc) / (1 - esq ))^0.5\
+A = a * B * kc *(1 - esq )^0.5 / ( 1 - esq * sin^2(latc))\
+t0 = tan(pi/4 - latc/2) / ((1 - e*sin(latc)) / (1 + e*sin(latc)))^(e/2)\
+D = B (1 - e","","1999-11-15 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.5","EPSG","","99.811",NULL};
+datafile_rows_t trf_method_row_37[] = {"9816","Tunisia Mining Grid","","","Latitude of origin","Longitude of origin","","","","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","This grid is used as the basis for mineral leasing in Tunsia. Lease areas are approximately 2 x 2 km or 400 hectares. The corners of these blocks are defined through a six figure grid reference where the first three digits are an easting in [...]
+Latitude = 36.5964 + [(598 - 360) * A]. As N > 360, A = 0.010015.\
+Latitude = 38.97997 grads = 35.08197 degrees.\
+\
+Longitude = 7.83445 + [(E - 270) * 0.012185, where E = 302.\
+Longitude = 8.22437 grads east of Paris = 9.73916","1999-11-15 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.8","EPSG","","99.811",NULL};
+datafile_rows_t trf_method_row_38[] = {"9817","Lambert Conic Near-Conformal","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","To compute the Lambert Conic Near-Conformal the following formulae are used;\
+\
+E = FE + r sin(theta)\
+N = FN + M + r sin(theta) tan(theta/2) using the natural origin rather than the false origin.\
+\
+Compute constants for the ellipse:\
+\
+n = (a-b)/(a+b) ","For Projected Coordinate System: Deir ez Zor / Levant Zone\
+\
+Parameters:\
+Ellipsoid Clarke 1880 (IGN) a = 6378249.2 m 1/f = 293.46602\
+then b = 6356515.000 n = 0.001706682563\
+\
+Latitude Natural Origin = 34o 39'00\" N = 0.604756586 rad\
+Longitude Na","1999-11-15 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1.1","EPSG","","99.811",NULL};
+datafile_rows_t trf_method_row_39[] = {"9818","American Polyconic","","","Latitude of natural origin","Longitude of natural origin","","","","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1999-10-20 00:00:00","US Geological Survey Professional Paper 1395; \"Map Projections - A Working Manual\"; J. Snyder","EPSG","","99.55",NULL};
+
+datafile_rows_t *trf_method_rows[] = {trf_method_row_1,trf_method_row_2,trf_method_row_3,trf_method_row_4,trf_method_row_5,trf_method_row_6,trf_method_row_7,trf_method_row_8,trf_method_row_9,trf_method_row_10,trf_method_row_11,trf_method_row_12,trf_method_row_13,trf_method_row_14,trf_method_row_15,trf_method_row_16,trf_method_row_17,trf_method_row_18,trf_method_row_19,trf_method_row_20,trf_method_row_21,trf_method_row_22,trf_method_row_23,trf_method_row_24,trf_method_row_25,trf_method_ro [...]
diff --git a/src/tiff/csv/trf_method.csv b/src/tiff/csv/trf_method.csv
new file mode 100644
index 0000000..7caa6af
--- /dev/null
+++ b/src/tiff/csv/trf_method.csv
@@ -0,0 +1,984 @@
+"COORD_TRF_METHOD_CODE","CTRF_METHOD_EPSG_NAME","CTRF_METHOD_USER_NAME","DESCRIPTION","PARAM_1_NAME","PARAM_2_NAME","PARAM_3_NAME","PARAM_4_NAME","PARAM_5_NAME","PARAM_6_NAME","PARAM_7_NAME","PARAM_8_NAME","PARAM_9_NAME","PARAM_10_NAME","PARAM_11_NAME","PARAM_12_NAME","PARAM_13_NAME","PARAM_14_NAME","PARAM_15_NAME","PARAM_16_NAME","PARAM_17_NAME","PARAM_18_NAME","PARAM_19_NAME","PARAM_20_NAME","PARAM_21_NAME","PARAM_22_NAME","PARAM_23_NAME","PARAM_24_NAME","PARAM_25_NAME","PARAM_26_NAME" [...]
+9601,Longitude rotation,,This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.,Longitude rotation,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Lon2 = Lon1 + longitude_rotation.,,1999-11-12 00:00:00,,EPSG,,99.79
+9602,Geodetic/geocentric conversions,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Latitude, P, and Longitude, L, in terms of Geographic Coordinate System (GCS) A may \
+be expressed in terms of a geocentric (earth centred) cartesian coordinate system X, Y, Z \
+with the Z axis corresponding with the Polar axis positive northwards, the X axis through \
+the intersection of the Greenwich meridian and equator, and the Y axis through the \
+intersection of the equator with longitude 90 degrees E. If the GCS's prime meridian is not \
+Greewich, longitudes must first be converted to their Greenwich equivalent. If the earth's \
+spheroidal semi major axis is a, semi minor axis b, and inverse flattening 1/f, then\
+\
+ XA= (nu + hA) cos P cos L\
+ YA= (nu + hA) cos P sin L\
+ ZA= ((1 - e^2) nu + hA) sin P\
+\
+where nu is the prime vertical radius of curvature at latitude P and is equal to \
+ nu = a /(1 - e^2*sin^2(P))^0.5,\
+ P and L are respectively the latitude and longitude (related to Greenwich) of the \
+point \
+ h is height above the ellipsoid, (topographic height plus geoidal height), and\
+ e is the eccentricity of the ellipsoid where e^2 = (a^2 -b^2)/a^2 = 2f -f^2\
+ Cartesian coordinates in geocentric coordinate system B may be used \
+to derive geographical coordinates in terms of geographic coordinate system B by:\
+ P = arctan (ZB + e^2* nu*sin P) / (XB^2 + YB^2)^0.5 by iteration\
+ L = arctan YB/XB\
+ hB = XB sec L sec P - nu\
+\
+where LB is relative to Greenwich. If the geographic system has a non Greenwich prime \
+meridian, the Greenwich value of the local prime meridian should be applied to longitude.\
+\
+(Note that h is the height above the ellipsoid. This is the height value which is \
+delivered by Transit and GPS satellite observations but is not the topographic \
+height value which is normally used for national mapping and levelling operations. \
+The topographic height is usually the height above mean sea level or an alternative \
+level reference for the country. If one starts with a topographic height, it will be \
+necessary to convert it to an ellipsoid height before using the above transformation \
+formulas. h = N + H, where N is the geoid height above the ellipsoid at the point \
+and is sometimes negative, and H is the height of the point above the geoid. The \
+height above the geoid is often taken to be that above mean sea level, perhaps with \
+a constant correction applied. Geoid heights of points above the nationally used \
+ellipsoid may not be readily available. For the WGS84 ellipsoid the value of N, \
+representing the height of the geoid relative to the ellipsoid, can vary between \
+values of -100m in the Sri Lanka area to +60m in the North Atlantic.)","Consider a North Sea point with coordinates derived by GPS satellite in the WGS84 geographical coordinate system with coordinates of:\
+\
+ latitude 53 deg 48 min 33.82 sec N, \
+ longitude 02 deg 07 min 46.38 sec E, \
+ and ellipsoidal height 73.0m, \
+\
+whose coordinates are required in terms of the ED50 geographical coordinate system which takes the International 1924 ellipsoid. The three parameter datum shift from WGS84 to ED50 for this North Sea area is given as dX = +84.87m, dY = +96.49m, dZ = +116.95m. \
+\
+The WGS84 geographical coordinates convert to the following geocentric values using the above formulas for X, Y, Z:\
+\
+ XA = 3771 793.97m\
+ YA = 140 253.34m\
+ ZA = 5124 304.35m\
+\
+Applying the quoted datum shifts to these, we obtain new geocentric values now related to ED50:\
+\
+ XB = 3771 878.84m\
+ YB = 140 349.83m\
+ ZB = 5124 421.30m\
+\
+These convert to ED50 values on the International 1924 ellipsoid as:\
+ latitude 53 deg 48 min 36.565 sec N, \
+ longitude 02 deg 07 min 51.477 sec E, \
+ and ellipsoidal height 28.02 m, \
+\
+Note that the derived height is referred to the International 1924 ellipsoidal surface and will need a further correction for the height of the geoid at this point in order to relate it to Mean Sea Level.",1996-09-18 00:00:00,"\"Transformation from spatial to geographical coordinates\"; B. R. Bowring; Survey Review number 181; July 1976.",EPSG,,97.29
+9603,Geocentric translations,,,X-axis translation,Y-axis translation,Z-axis translation,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"If we may assume that the minor axes of the ellipsoids are parallel, then shifts dX, dY, dZ \
+in the sense from datum A to datum B may then be applied as\
+\
+ XB = XA + dX \
+ YB = YA + dY\
+ ZB = ZA + dZ","Given a three parameter datum shift from WGS84 to ED50 for this North Sea area is given as \
+dX = +84.87m, dY = +96.49m, dZ = +116.95m. \
+\
+The WGS84 geographical coordinates convert to the following GS84 geocentric values using \
+the above formulas for X, Y, Z:\
+\
+ XA = 3771 793.97m\
+ YA = 140 253.34m\
+ ZA = 5124 304.35m\
+\
+Applying the given datum shifts to these, we obtain new geocentric values now related \
+to ED50:\
+\
+ XB = 3771 878.84m\
+ YB = 140 349.83m\
+ ZB = 5124 421.30m",1996-09-18 00:00:00,POSC Epicentre 2.2.1,EPSG,,
+9604,Molodenski,,,X-axis translation,Y-axis translation,Z-axis translation,Semi-major axis length difference,Flattening difference,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,,EPSG,,
+9605,Abridged Molodenski,,,X-axis translation,Y-axis translation,Z-axis translation,Semi-major axis length difference,Flattening difference,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"As an alternative to the computation of the new latitude, longitude and height above ellipsoid in discrete steps through geocentric coordinates, the changes in these coordinates may be derived directly by formulas derived by Molodenski. Abridged versions of these formulas, which are quite satisfactory for three parame [...]
+\
+Dlat \" = [(-dX*sin(lat)*cos(lon)) - (dY*sin(lat)*sin(lon)) + (dZ*cos(lat)) + (((a*Df) + (f*Da))*sin(2*lat))] / (rho * sin(1\"))\
+\
+Dlon \" = (-dX*sin(lon) + dY*cos(lon)) / ((nu*cos(lat)) * sin(1\"))\
+\
+Dh = (dX*cos(lat)*cos(lon)) + (dY*cos(lat)*sin(lon)) + (dZ*sin(lat)) + ((a*Df + f*Da)*(sin(lat)^2)) - Da\
+\
+where the dX, dY and dZ terms are as before, and rho and nu are the meridian and prime vertical radii of curvature at the given latitude (lat) on the first ellipsoid (see section 1.4), Da is the difference in the semi-major axes (a1 - a2) of the first and second ellipsoids and Df is the difference in the flattening of the two ellipsoids.\
+\
+The formulas for Dlat and Dlon indicate changes in latitude and longitude in arc-seconds.",,1999-04-22 00:00:00,,EPSG,,99.01
+9606,Position Vector 7-param. transformation,,,X-axis translation,Y-axis translation,Z-axis translation,X-axis rotation,Y-axis rotation,Z-axis rotation,Scale difference,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Transformation of coordinates from one geographic coordinate system into another (also known as a \"datum transformation\") is usually carried out as an implicit concatenation of three transformations:\
+[geographical to geocentric >> geocentric to geocentric >> geocentric to geographic]\
+\
+The middle part of the concatenated transformation, from geocentric to geocentric, is usually described as a simplified 7-parameter Helmert transformation, expressed in matrix form with 7 parameters, in what is known as the \"Bursa-Wolf\" formula:\
+\
+ (X�) ( 1 -Rz +Ry) (X) (dX)\
+ (Y�) = M * ( +Rz 1 -Rx) * (Y) + (dY)\
+ (Z�) ( -Ry +Rx 1 ) (Z) (dZ)\
+\
+The parameters are commonly referred to defining the datum transformation \"from Datum 'A' to Datum 'B'\", whereby (X, Y, Z) are the geocentric coordinates of the point on Datum �A� and (X�, Y�, Z�) are the geocentric coordinates of the point on Datum �B�. However, that does not define the parameters uniquely; neither is the definition of the parameters implied in the formula, as is often believed. However, the following definition, which is consistent witth the \"Position Vector Trans [...]
+\
+(dX, dY, dZ) :Translation vector, to be added to the point's position vector in coordinate system 'A' in order to transform from system 'A' to system 'B'; also: the coordinates of the origin of system 'A' in the 'B' frame.\
+\
+(Rx, Ry, Rz) :Rotations to be applied to the point's vector. The sign convention is such that a positive rotation about an axis is defined as a clockwise rotation of the position vector when viewed from the origin of the Cartesian coordinate system in the positive direction of that axis. E.g. a positive rotation about the Z-axis only from system 'A' to system 'B' will result in a larger longitude value for the point in system 'B'.\
+\
+M : The scale correction to be made to the position vector in coordinate system 'A' in order to obtain the correct scale of coordinate system 'B'. M = (1+S*10 6), whereby S is the scale correction expressed in parts per million. \
+\
+<<<<<This text continues in the description of the Coordinate Frame Rotation formula>>>>>","Input point: \
+Coordinate system: WGS72 (geographic 3D)\
+ Latitude = 55 deg 00 min 00 sec \
+ Longitude = 4 deg 00 min 00 sec \
+ Ellipsoidal height = 0 m\
+This transforms to cartesian geocentric coords:\
+ X = 3 657 660.66 (m) \
+ Y = 255 768.55 (m)\
+ Z = 5 201 382.11 (m)\
+\
+Transformation parameters WGS72 to WGS84:\
+ dX (m) = 0.000 \
+ dY (m) = 0.000 \
+ dZ (m) = +4.5\
+ RX (\") = 0.000 \
+ RY (\") = 0.000\
+ RZ (\") = +0.554\
+ Scale (ppm) = +0.219\
+\
+Application of the 7 parameter Position Vector Transformation results in WGS 84 coordinates of:\
+ X = 3 657 660.78 (m)\
+ Y = 255 778.43 (m)\
+ Z = 5 201 387.75 (m)\
+This converts into:\
+ Latitude = 55 deg 00 min 00.090 sec\
+ Longitude = 4 deg 00 min 00.554 sec\
+ Ellipsoidal height = +3.22 m",1996-09-18 00:00:00,,EPSG,,98.16
+9607,Coordinate Frame rotation,,,X-axis translation,Y-axis translation,Z-axis translation,X-axis rotation,Y-axis rotation,Z-axis rotation,Scale difference,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"<<<<<This text is continued from the description of the Position Vector Transformation formula>>>>>\
+\
+Although being common practice in particularly the European E&P industry Position Vector Transformation sign convention is not universally accepted. A variation on this formula is also used, particularly in the USA E&P industry. That formula is based on the same definition of translation and scale parameters, but a different definition of the rotation parameters. The associated convention is known as the \"Coordinate Frame Rotation\" convention. \
+The formula is:\
+\
+ (X�) ( 1 +Rz -Ry) (X) (dX)\
+ (Y�) = M * ( -Rz 1 +Rx) * (Y) + (dY)\
+ (Z�) ( +Ry -Rx 1 ) (Z) (dZ)\
+\
+and the parameters are defined as:\
+\
+(dX, dY, dZ) : Translation vector, to be added to the point's position vector in coordinate system 'A' in order to transform from system 'A' to system 'B'; also: the coordinates of the origin of system 'A' in the 'B' frame.\
+\
+(Rx, Ry, Rz) : Rotations to be applied to the coordinate frame. The sign convention is such that a positive rotation of the frame about an axis is defined as a clockwise rotation of the coordinate frame when viewed from the origin of the Cartesian coordinate system in the positive direction of that axis, that is a positive rotation about the Z-axis only from system 'A' to system 'B' will result in a smaller longitude value for the point in system 'B'.\
+\
+M : The scale factor to be applied to the position vector in coordinate system 'A' in order to obtain the correct scale of coordinate system 'B'. M = (1+S*10 6), whereby S is the scale correction expressed in parts per million.\
+\
+In the absence of rotations the two formulas are identical; the difference is solely in the rotations. The name of the second method reflects this.\
+\
+Note that the same rotation that is defined as positive in the first method is consequently negative in the second and vice versa. It is therefore crucial that the convention underlying the definition of the rotation parameters is clearly understood and is communicated when exchanging datum transformation parameters, so that the parameters may be associated with the correct coordinate transformation method (algorithm).","The same example as for the Position Vector Transformation can be [...]
+\
+Transformation parameters Coordinate Frame Rotation convention:\
+dX (m) = 0.000 \
+dY (m) = 0.000 \
+dZ (m) = +4.5 \
+RX (\") = 0.000\
+RY (\") = 0.000\
+RZ (\") = -0.554\
+Scale (ppm) = +0.219\
+\
+Please note that only the rotation has changed sign as compared to the Position Vector Transformation.",1996-09-18 00:00:00,,EPSG,,
+9608,Similarity transform,,,A1,A2 * m,A3 * n,B1,B2 * m,B3 * n,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,,EPSG,,
+9609,2-dimensional Affine transformation,,,A1,A2 * m,A3 * n,B1,B2 * m,B3 * n,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,,EPSG,,
+9610,2nd-order Polynomial function,,,Ordinate 1 of source evaluation point,Ordinate 2 of source evaluation point,Ordinate 1 of target evaluation point,Ordinate 2 of target evaluation point,A1,A2 * m,A3 * n,A4 * mm,A5 * mn,A6 * nn,B1,B2 * m,B3 * n,B4 * mm,B5 * mn,B6 * nn,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,,EPSG,,
+9611,3rd-order Polynomial function,,,Ordinate 1 of source evaluation point,Ordinate 2 of source evaluation point,Ordinate 1 of target evaluation point,Ordinate 2 of target evaluation point,A1,A2 * m,A3 * n,A4 * mm,A5 * mn,A6 * nn,A7 * mmm,A8 * mmn,A9 * mnn,A10 * nnn,B1,B2 * m,B3 * n,B4 * mm,B5 * mn,B6 * nn,B7 * mmm,B8 * mmn,B9 * mnn,B10 * nnn,,,,,,,,,,,,,,,,1996-09-18 00:00:00,,EPSG,,
+9612,4th-order Polynomial function,,,Ordinate 1 of source evaluation point,Ordinate 2 of source evaluation point,Ordinate 1 of target evaluation point,Ordinate 2 of target evaluation point,A1,A2 * m,A3 * n,A4 * mm,A5 * mn,A6 * nn,A7 * mmm,A8 * mmn,A9 * mnn,A10 * nnn,A11 * mmmm,A12 * mmmn,A13 * mmnn,A14 * mnnn,A15 * nnnn,B1,B2 * m,B3 * n,B4 * mm,B5 * mn,B6 * nn,B7 * mmm,B8 * mmn,B9 * mnn,B10 * nnn,B11 * mmmm,B12 * mmmn,B13 * mmnn,B14 * mnnn,B15 * nnnn,,,,"For TRF_POLYNOMIAL 1000, m=Latitu [...]
+9613,NADCON,,Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation. Used specifically for some NAD27<->NAD83 transformations in USA.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Latitude difference gridded binary file,Longitude difference gridded binary file,,,,1996-09-18 00:00:00,US Coast and geodetic Survey - http://www.ngs.noaa.gov,EPSG,Input expects longitudes to be positive west.,
+9614,NTv1,,Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation. Used specifically for some NAD27<->NAD83 transformations in Canada.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Latitude and longitude difference file,,,,,1997-11-13 00:00:00,Geomatics Canada - Geodetic Survey Division.,EPSG,Superceded in 1997 by NTv2 (transformation method code 9615). Input expects longitudes to be positive west.,
+9615,NTv2,,Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Latitude and longitude difference file,,,,,1997-11-13 00:00:00,http://www.geod.nrcan.gc.ca/products/html-public/GSDapps/English/NTv2_Fact_Sheet.html,EPSG,Supercedes NTv1 (transformation method code 9614). Input expects longitudes to be positive west.,
+9616,Vertical Offset,,This transformation allows calculation of ordinate in the target system by adding the parameter value to the ordinate value of the point in the source system.,Vertical offset,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,V2 = [(V1 * U1) + (O12 * Uoff)] * (m / U2) where V2 = value in second vertical coordinate system; V1 = value in first system; O12 is the value of the the origin of system 2 in system 1; m is unit direction multiplier (m=1 if both systems are height or both ar [...]
+9617,Madrid to ED50,,,,,,,A,B,C,D,E,F,G,H,J,,,,,,,,,,,,,,,,,,,,,,,,,"The original geographic coordinate system for the Spanish mainland was based on Madrid 1870 datum, Struve 1860 ellipsoid, with longitudes related to the Madrid meridian. Three polynomial expressions have been empirically derived by El Servicio Geogr�fico del Ej�rcito to convert geographical coordinates based on this system to equivalent values based on the European Datum of 1950 (ED50). The polynomial coefficients der [...]
+\
+The polynomial expressions transformations are:\
+\
+ dLat seconds = A + (B*lon) + (C*lat) + (D*h)\
+ dLon seconds = (E+F) + (G*lon) + (H*lat) + (J*h)\
+\
+where latitude lat and longitude lon are in decimal degrees referred to the Madrid 1870 (Madrid) geographic coordinate system and h in metres. E is the longitude (in seconds) of the Madrid meridian measured from the Greenwich meridian; it is the value to be applied to a longitude relative to the Madrid meridian to transform it to a longitude relative to the Greenwich meridan.\
+\
+The results of these expressions are applied through the formulae:\
+Lat(ED50) = Lat(M1870(M)) + dLat\
+and Lon(ED50) = Lon(M1870(M)) + dLon.","Input point coordinate system: Madrid 1870 (Madrid) (geographic 3D)\
+ Latitude = 42 deg 38 min 52.77 sec N = 42.647992 degrees\
+ Longitude = 3 deg 39 min 34.57 sec E of Madrid \
+ = +3.659603 degrees from the Madrid meridian.\
+ Height = 0 m\
+\
+For the north zone transformation:\
+A = 11.3287790\
+B = -0.0385200\
+C = -0.1674000\
+D = 0.0000379\
+E = -13276.58\
+F = 2.5079425\
+G = -0.0086400\
+H = 0.835200\
+J = -0.0000038\
+\
+dLat = +4.05 seconds\
+\
+Then ED50 latitude = 42 deg 38 min 52.77 sec N + 4.05sec\
+= 42 deg 38 min 56.82 sec N\
+\
+\
+dLon = -13270.54 seconds = -3 deg 41 min 10.54 sec\
+\
+Then ED50 longitude = 3 deg 39 min 34.57 sec E - 3 deg 41 min 10.54 sec\
+= 0 deg 01 min 35.97 sec W of Greenwich.",1999-11-15 00:00:00,Institut de Geomatica; Barcelona,EPSG,,99.284 99.82
+9618,Geographical and Height Offsets,,This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.,Latitude offset,Longitude offset,Gravity-related to ellipsoid height,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Lat2 = Lat1 + latitude_offset; Lon2 = Lon1 + longitude_offset; EllipsoidHeight2 = GravityHeight1 + gravity-related_to_ellipsoid_height.,,1999-11-12 00:00:00,,EPSG,,99.79
+9619,Geographical Offsets,,This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.,Latitude offset,Longitude offset,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Lat2 = Lat1 + latitude_offset; Lon2 = Lon1 + longitude_offset.,,1999-11-12 00:00:00,,EPSG,,99.79
+9620,Norway Offshore Interpolation,,,,,,,,Geod. tfm. code for northern boundary,Geod. tfm. code for southern boundary,,,,,,,,,,,,,,,,,,,,,,,,,,,,Geod. tfm. name for northern boundary,Geod. tfm. name for southern boundary,,,,1999-04-22 00:00:00,"Norwegian Mapping Authority note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\".",EPSG,,
+9801,Lambert Conic Conformal (1SP),,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"To derive the projected Easting and Northing coordinates of a point with geographical coordinates (lat,lon) the formulas for the one standard parallel case are:\
+\
+E = FE + r sin(theta)\
+N = FN + r0 - r cos(theta)\
+where\
+n = sin lat0\
+r = a F t^n k0 for r0, and r\
+m = cos(lat)/(1 - e^2 sin^2(lat))^0.5 for m0, lat0, and m2, lat2 where lat1 and lat2 are the latitudes of the standard parallels.\
+t = tan(pi/4 - lat/2)/[(1 - e sin(lat))/(1 + e sin(lat))]^(e/2) for t0 and t using lat0 and lat respectively.\
+F = m0/(n t1^n)\
+theta = n(lon - lon0)\
+\
+The reverse formulas to derive the latitude and longitude of a point from its Easting and Northing values are:\
+\
+lat = pi/2 - 2arctan{t'[(1 - esin(lat))/(1 + esin(lat))]^(e/2)}\
+lon = theta'/n +lon0\
+where\
+theta' = arctan[(E - FE)/{r0 -(N - FN)}]\
+r' = +/-[(E - FE)^2 + {r0 - (N - FN)}^2]^0.5\
+t' = (r'/a k0 F)^(1/n)\
+and n, F, and rF are derived as for the forward calculation.","For Projected Coordinate System JAD69 / Jamaica National Grid\
+\
+Parameters:\
+Ellipsoid: Clarke 1866, a = 6378206.400 m., 1/f = 294.97870\
+ then e = 0.08227185 and e^2 = 0.00676866\
+\
+Latitude Natural Origin 18 deg 00 min 00 sec N = 0.31415927 rad\
+Longitude Natural Origin 77 deg 00 min 00 sec W = -1.34390352 rad\
+Scale factor at origin 1.000000\
+False Eastings FE 250000.00 m\
+False Northings FN 150000.00 m\
+\
+Forward calculation for: \
+Latitude: 17 deg 55 min 55.80 sec N = 0.31297535 rad\
+Longitude: 76 deg 56 min 37.26 sec W = -1.34292061 rad\
+first gives\
+m0 = 0.95136402 t0 = 0.72806411\
+F = 3.39591092 n = 0.30901699\
+r = 19643955.26 r0 = 19636447.86\
+theta = 0.00030374 t = 0.728965259\
+\
+Then Easting E = 255966.58 m\
+ Northing N = 142493.51 m\
+\
+Reverse calculation for the same easting and northing first gives\
+\
+theta' = 0.000303736\
+t' = 0.728965259\
+m0 = 0.95136402\
+r' = 19643955.26\
+\
+Then Latitude = 17 deg 55 min 55.800 sec N\
+ Longitude = 76 deg 56 min 37.260 sec W",1996-09-18 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1",EPSG,,
+9802,Lambert Conic Conformal (2SP),,,Latitude of false origin,Longitude of false origin,Latitude of 1st standard parallel,Latitude of 2nd standard parallel,,Easting at false origin,Northing at false origin,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"To derive the projected Easting and Northing coordinates of a point with geographical coordinates (lat,lon) the formulas for the one standard parallel case are:\
+\
+E = EF + r sin(theta)\
+N = NF + rF - r cos(theta)\
+where\
+m = cos(lat)/(1 - e^2 sin^2(lat))^0.5 for m1, lat1, and m2, lat2 where lat1 and lat2 are the latitudes of the standard parallels.\
+t = tan(pi/4 - lat/2)/[(1 - e sin(lat))/(1 + e sin(lat))]^(e/2) for t1, t2, tF and t using lat1, lat2, latF and lat respectively.\
+n = (loge(m1) - loge(m2))/(loge(t1) - loge(t2))\
+F = m1/(n t1^n)\
+r = a F t^n for rF and r, where rF is the radius of the parallel of latitude of the false origin.\
+theta = n(lon - lon0)\
+\
+The reverse formulas to derive the latitude and longitude of a point from its Easting and Northing values are:\
+\
+lat = pi/2 - 2arctan{t'[(1 - esin(lat))/(1 + esin(lat))]^(e/2)}\
+lon = theta'/n +lon0\
+where\
+r' = +/-[(E - EF)^2 + {rF - (N - NF)}^2]^0.5 , taking the sign of n\
+t' = (r'/aF)^(1/n)\
+theta' = arctan [(E- EF)/(rF - (N- NF))]\
+and n, F, and rF are derived as for the forward calculation.","For Projected Coordinate System NAD27 / Texas South Central\
+\
+Parameters:\
+Ellipsoid Clarke 1866, a = 6378206.400 metres = 20925832.16 US survey feet\
+ 1/f = 294.97870\
+then e = 0.08227185 and e^2 = 0.00676866\
+\
+First Standard Parallel 28o23'00\"N = 0.49538262 rad\
+Second Standard Parallel 30o17'00\"N = 0.52854388 rad\
+Latitude False Origin 27o50'00\"N = 0.48578331 rad\
+Longitude False Origin 99o00'00\"W = -1.72787596 rad\
+Easting at false origin 2000000.00 US survey feet\
+Northing at false origin 0.00 US survey feet\
+\
+Forward calculation for: \
+Latitude 28o30'00.00\"N = 0.49741884 rad\
+Longitude 96o00'00.00\"W = -1.67551608 rad\
+\
+first gives :\
+m1 = 0.88046050 m2 = 0.86428642\
+t = 0.59686306 tF = 0.60475101\
+t1 = 0.59823957 t2 = 0.57602212\
+n = 0.48991263 F = 2.31154807\
+r = 37565039.86 rF = 37807441.20\
+theta = 0.02565177\
+\
+Then Easting E = 2963503.91 US survey feet\
+ Northing N = 254759.80 US survey feet\
+\
+Reverse calculation for same easting and northing first gives:\
+theta' = 0.025651765 r' = 37565039.86\
+t' = 0.59686306\
+\
+Then Latitude = 28o30'00.000\"N\
+ Longitude = 96o00'00.000\"W",1999-04-22 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1",EPSG,,99.281
+9803,Lambert Conic Conformal (2SP Belgium),,,Latitude of false origin,Longitude of false origin,Latitude of 1st standard parallel,Latitude of 2nd standard parallel,,Easting at false origin,Northing at false origin,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Since 1972 a modified form of the two standard parallel case has been used in Belgium. For the Lambert Conic Conformal (2 SP Belgium), the formulas for the standard two standard parallel case are used except for: \
+Easting, E = EF + r sin (theta - alpha)\
+Northing, N = NF + rF - r cos (theta - alpha)\
+and for the reverse formulas\
+lon = ((theta' + alpha)/n) +lon0\
+where alpha = 29.2985 seconds.","For Projected Coordinate System Belge l972 / Belge Lambert 72\
+\
+Parameters:\
+Ellipsoid International 1924, a = 6378388 metres\
+ 1/f = 297\
+then e = 0.08199189 and e^2 = 0.006722670\
+\
+First Standard Parallel 49o50'00\"N = 0.86975574 rad\
+Second Standard Parallel 51o10'00\"N = 0.89302680 rad\
+Latitude False Origin 90o00'00\"N = 1.57079633 rad\
+Longitude False Origin 4o21'24.983\"E = 0.07604294 rad\
+Easting at false origin EF 150000.01 metres\
+Northing at false origin NF 5400088.44 metres\
+\
+Forward calculation for: \
+Latitude 50o40'46.461\"N = 0.88452540 rad\
+Longitude 5o48'26.533\"E = 0.10135773 rad\
+\
+first gives :\
+m1 = 0.64628304 m2 = 0.62834001\
+t = 0.59686306 tF = 0.00000000\
+t1 = 0.36750382 t2 = 0.35433583\
+n = 0.77164219 F = 1.81329763\
+r = 37565039.86 rF = 0.00\
+alpha = 0.00014204 theta = 0.01953396\
+\
+Then Easting E = 251763.20 metres\
+ Northing N = 153034.13 metres\
+\
+Reverse calculation for same easting and northing first gives:\
+theta' = 0.01939192 r' = 548041.03\
+t' = 0.35913403\
+Then Latitude = 50o40'46.461\"N\
+ Longitude = 5o48'26.533\"E",1999-04-22 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1",EPSG,,99.281
+9804,Mercator (1SP),,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The formulas to derive projected Easting and Northing coordinates are:\
+\
+E = FE + a*k0(lon - lon0) \
+N = FN + a*k0* ln{tan(pi/4 + lat/2)[(1 - esin(lat))(1 + esin(lat))]^e/2} where symbols are as listed above and logarithms are natural.\
+\
+The reverse formulas to derive latitude and longitude from E and N values are:\
+\
+lat = chi + (esq/2 + 5e^4/24 + e^6/12 + 13e^8/360) sin(2chi) \
++ (7e^4/48 + 29e^6/240 + 811e^8/11520) sin(4chi)\
++ (7e^6/120 + 81e^8/1120) sin(6chi) + (4279e^8/161280) sin(8chi)\
+\
+where chi = pi/2 - 2 arctan t\
+t = B^((FN-N)/a*k0) \
+B = base of the natural logarithm, 2.7182818...\
+and for the 2 SP Case, k0 is calculated as for the forward transformation above.\
+lon = ((E - FE)/a*k0) + lon0","For Projected Coordinate System Makassar / NEIEZ\
+\
+Parameters:\
+Ellipsoid Bessel 1841 a = 6377397.155 m 1/f = 299.15281\
+then e = 0.08169683\
+\
+Latitude Natural Origin 00o00'00\"N = 0.0000000 rad\
+Longitude Natural Origin 110o00'00\"E = 1.91986218 rad\
+Scale factor ko 0.997\
+False Eastings FE 3900000.00 m\
+False Northings FN 900000.00 m\
+\
+Forward calculation for: \
+Latitude 3o00'00.00\"S = -0.05235988 rad\
+Longitude 120o00'00.00\"E = 2.09439510 rad\
+gives\
+Easting E = 5009726.58 m\
+Northing N = 569150.82 m\
+\
+Reverse calculation for same easting and northing first gives :\
+t = 1.0534121\
+chi = -0.0520110\
+\
+Then Latitude = 3o00'00.000\"S\
+ Longitude = 120o00'00.000\"E",1996-09-18 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.2",EPSG,,
+9805,Mercator (2SP),,,Latitude of 1st standard parallel,Longitude of natural origin,,,,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The formulas to derive projected Easting and Northing coordinates are:\
+\
+For the two standard parallel case, k0 is first calculated from\
+\
+k0 = cos(latSP1)/(1 - e^2*sin^2(latSP1))^0.5 \
+ \
+where latSP1 is the absolute value of the first standard parallel (i.e. positive). \
+\
+Then, for both one and two standard parallel cases, \
+\
+E = FE + a*k0(lon - lon0) \
+N = FN + a*k0* ln{tan(pi/4 + lat/2)[(1 - esin(lat))(1 + esin(lat))]^e/2} where symbols are as listed above and logarithms are natural.\
+\
+The reverse formulas to derive latitude and longitude from E and N values are:\
+\
+lat = chi + (esq/2 + 5e^4/24 + e^6/12 + 13e^8/360) sin(2chi) \
++ (7e^4/48 + 29e^6/240 + 811e^8/11520) sin(4chi)\
++ (7e^6/120 + 81e^8/1120) sin(6chi) + (4279e^8/161280) sin(8chi)\
+\
+where chi = pi/2 - 2 arctan t\
+t = B^((FN-N)/a*k0) \
+B = base of the natural logarithm, 2.7182818...\
+and for the 2 SP Case, k0 is calculated as for the forward transformation above.\
+lon = ((E - FE)/a*k0) + lon0","For Projected Coordinate System Pulkovo 1942 / Mercator Caspian Sea\
+\
+Parameters:\
+Ellipsoid Krassowski 1940 a = 6378245.00m 1/f = 298.300\
+then e = 0.08181333 and e^2 = 0.00669342\
+\
+Latitude first SP 42o00'00\"N = 0.73303829 rad\
+Longitude Natural Origin 51o00'00\"E = 0.89011792 rad\
+False Eastings FE 0.00 m\
+False Northings (at equator) FN 0.00 m\
+ \
+then natural origin at latitude of 0oN has scale factor k0= 0.74426089\
+\
+Forward calculation for: \
+Latitude 53o00'00.00\"N = 0.9250245 rad\
+Longitude 53o00'00.00\"E = 0.9250245 rad\
+\
+gives Easting E = 165704.29 m \
+ Northing N = 5171848.07 m\
+\
+Reverse calculation for same easting and northing first gives :\
+t = 0.33639129 chi = 0.92179596\
+\
+Then Latitude = 53o00'00.000\"N\
+ Longitude = 53o00'00.000\"E",1996-09-18 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.2",EPSG,,
+9806,Cassini-Soldner,,,Latitude of natural origin,Longitude of natural origin,,,,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The formulas to derive projected Easting and Northing coordinates are:\
+\
+Easting E = FE + nu[A - TA^3/6 -(8 - T + 8C)TA^5/120]\
+\
+Northing N = FN + M - M0 + nu*tan(lat)*[A^2/2 + (5 - T + 6C)A^4/24]\
+\
+where A = (lon - lon0)cos(lat)\
+T = tan^2(lat)\
+C = e2 cos2*/(1 - e2) nu = a /(1 - esq*sin^2(lat))^0.5 \
+and M, the distance along the meridian from equator to latitude lat, is given by\
+M = a[1 - e^2/4 - 3e^4/64 - 5e^6/256 -....)*lat - (3e^2/8 + 3e^4/32 + 45e^6/1024 +....)sin(2*lat) + (15e^4/256 + 45e^6/1024 +.....)sin(4*lat) - (35e^6/3072 + ....)sin(6*lat) + .....]\
+with lat in radians.\
+\
+M0 is the value of M calculated for the latitude of the chosen origin. This may not necessarily be chosen as the equator.\
+\
+To compute latitude and longitude from Easting and Northing the reverse formulas are:\
+lat = lat1 - (nu1tan(lat1)/rho1)[D2/2 - (1 + 3*T1)D^4/24]\
+lon = lon0 + [D - T1*D^3/3 + (1 + 3*T1)T1*D^5/15]/cos(lat1)\
+\
+where lat1 is the latitude of the point on the central meridian which has the same Northing as the point whose coordinates are sought, and is found from:\
+lat1 = mu1 + (3*e1/2 - 27*e1^3/32 +.....)sin(2*mu1) + (21*e1^2/16 - 55*e1^4/32 + ....)sin(4*mu1)+ (151*e1^3/96 +.....)sin(6*mu1) + (1097*e1^4/512 - ....)sin(8*mu1) + ......\
+where\
+e1 = [1- (1 - esq)^0.5]/[1 + (1 - esq)^0.5]\
+mu1 = M1/[a(1 - esq/4 - 3e^4/64 - 5e^6/256 - ....)]\
+M1 = M0 + (N - FN)\
+T1 = tan^2(lat1)\
+D = (E - FE)/nu1","For Projected Coordinate System Trinidad 1903 / Trinidad Grid \
+Parameters:\
+Ellipsoid Clarke 1858 a = 20926348 ft = 31706587.88 links\
+ b = 20855233 ft\
+\
+then 1/f = 294.97870 and e^2 = 0.00676866\
+\
+Latitude Natural Origin 10o26'30\"N = 0.182241463 rad\
+Longitude Natural Origin 61o20'00\"W = -1.07046861 rad\
+False Eastings FE 430000.00 links\
+False Northings FN 325000.00 links\
+\
+Forward calculation for: \
+Latitude 10o00'00.00\" N = 0.17453293 rad\
+Longitude 62o00'00.00\"W = -1.08210414 rad\
+\
+A = -0.01145876 C = 0.00662550\
+T = 0.03109120 M = 5496860.24 nu = 31709831.92 M0 = 5739691.12\
+\
+Then Easting E = 66644.94 links\
+ Northing N = 82536.22 links\
+\
+Reverse calculation for same easting and northing first gives :\
+e1 = 0.00170207 D = -0.01145875\
+T1 = 0.03109544 M1 = 5497227.34\
+nu1 = 31709832.34 mu1 = 0.17367306\
+phi1 = 0.17454458 rho1 = 31501122.40\
+\
+\
+Then Latitude = 10o00'00.000\"N\
+ Longitude = 62o00'00.000\"W",1996-09-18 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.3",EPSG,,
+9807,Transverse Mercator,,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The formulas to derive the projected Easting and Northing coordinates are in the form of a series as follows:\
+\
+Easting, E = FE + k0*nu[A + (1 - T + C)A^3/6 + (5 - 18T + T^2 + 72C - 58e'sq)A^5/120] \
+\
+Northing, N = FN + k0{M - M0 + nu*tan(lat)[A^2/2 + (5 - T + 9C + 4C^2)A^4/24 + (61 - 58T + T^2 + 600C - 330e'sq)A^6/720]} \
+where T = tan^2(lat) nu = a /(1 - esq*sin^2(lat))^0.5\
+C = esq*cos^2(lat)/(1 - esq)\
+A = (lon - lon0)cos(lat), with lon and lon0 in radians.\
+M = a[(1 - esq/4 - 3e^4/64 - 5e^6/256 -....)lat - (3esq/8 + 3e^4/32 + 45e^6/1024+....)sin(2*lat) + (15e^4/256 + 45e^6/1024 +.....)sin(4*lat) - (35e^6/3072 + ....)sin(6*lat) + .....]\
+with lat in radians and M0 for lat0, the latitude of the origin, derived in the same way.\
+\
+The reverse formulas to convert Easting and Northing projected coordinates to latitude and longitude are:\
+\
+lat = lat1 - (nu1*tan(lat1)/rho1)[D^2/2 - (5 + 3*T1 + 10*C1 - 4*C1^2 - 9*e'^2)D^4/24 + (61 + 90*T1 + 298*C1 + 45*T1^2 - 252*e'^2 - 3*C1^2)D^6/720]\
+lon = lon0 + [D - (1 + 2*T1 + C1)D^3/6 + (5 - 2*C1 + 28*T1 - 3*C1^2 + 8*e'^2 + 24*T1^2)D^5/120] / cos(lat1)\
+where lat1 may be found as for the Cassini projection from:\
+\
+lat1 = mu1 + ((3*e1)/2 - 27*e1^3/32 +.....)sin(2*lat1) + (21*e1^2/16 -55*e1^4/32 + ....)sin(4*lat1)+ (151*e1^3/96 +.....)sin(6*lat1) + (1097*e1^4/512 - ....)sin(8*lat1) + ......\
+and where nu1 = a /(1 - esq*sin^2(lat1))^0.5 rho1 = a(1 - esq)/(1 - esq*sin^2(lat1))^1.5\
+e1 = [1- (1 - esq)^0.5]/[1 + (1 - esq)^0.5]\
+mu1 = M1/[a(1 - esq/4 - 3e^4/64 - 5e^6/256 - ....)]\
+M1 = M0 + (N - FN)/k0\
+T1 = tan^2(lat1)\
+C1 = e'^2*cos^2(lat1)\
+D = (E - FE)/(nu1*k0), with nu1 = nu for lat1\
+\
+For areas south of the equator the value of latitude lat will be negative and the formulas above, to compute the E and N, will automatically result in the correct values. Note that the false northings of the origin, if the equator, will need to be large to avoid negative northings and for the UTM projection is in fact 10,000,000m. Alternatively, as in the case of Argentina's Transverse Mercator (Gauss-Kruger) zones, the origin is at the south pole with a northings of zero. However each [...]
+different zones having the same eastings, every point in the country, irrespective of its projection zone, will have a unique set of projected system coordinates. Strict application of the above formulas, with south latitudes negative, will result in the derivation of the correct Eastings and Northings. \
+\
+Similarly, in applying the reverse formulas to determine a latitude south of the equator, a negative sign for lat results from a negative lat1 which in turn results from a negative M1.","For Projected Coordinate System OSGB 1936 / British National Grid\
+\
+Parameters:\
+Ellipsoid Airy 1830 a = 6377563.396 m 1/f = 299.32496\
+then e'^2 = 0.00671534 and e^2 = 0.00667054\
+\
+Latitude Natural Origin 49o00'00\"N = 0.85521133 rad\
+Longitude Natural Origin 2o00'00\"W = -0.03490659 rad\
+Scale factor ko 0.9996013 False Eastings FE 400000.00 m\
+False Northings FN -100000.00 m\
+\
+Forward calculation for: \
+Latitude 50o30'00.00\"N = 0.88139127 rad\
+Longitude 00o30'00.00\"E = 0.00872665 rad\
+A = 0.02775415 C = 0.00271699\
+T = 1.47160434 M = 5596050.46\
+M0 = 5429228.60 nu = 6390266.03\
+\
+Then Easting E = 577274.99 m\
+ Northing N = 69740.50 m\
+\
+Reverse calculations for same easting and northing first gives :\
+e1 = 0.00167322 mu1 = 0.87939562\
+M1 = 5599036.80 nu1 = 6390275.88\
+phi1 = 0.88185987 D = 0.02775243\
+rho1 =6372980.21 C1 = 0.00271391\
+T1 = 1.47441726\
+\
+Then Latitude = 50o30'00.000\"N\
+ Longitude = 00o30'00.000\"E",1996-09-18 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.4",EPSG,,
+9808,Transverse Mercator (South Orientated),,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"For the mapping of southern Africa a south oriented Transverse Mercator projection is used. Here the coordinate axes are called Westings and Southings and increment to the West and South from the origin respectively. The Transverse Mercator formulas need to \
+be modified to cope with this arrangement with\
+\
+Westing, W = k0 nu[A + (1 - T + C)A^3/6 + (5 - 18*T + T^2 + 72*C - 58*e'^2)A^5/120] - FE\
+\
+Southing, S = k0{M - M0 + nu*tan(lat)*[A^2/2 + (5 - T + 9*C + 4*C^2)A^4/24 + (61 - 58*T + T^2 + 600*C - 330*e'^2)A^6/720]}- FN\
+\
+In these formulas the terms FE and FN have been retained for consistency of the terminology. For the reverse formulas, those for the standard Transverse Mercator above apply, with the exception that:\
+\
+M1 = M0 + (S + FN)/k0\
+and D = (W + FE)/(nu1*k0), with nu1 = nu for lat1",,1996-09-18 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.4",EPSG,,
+9809,Oblique Stereographic,,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The coordinate transformation from geographical to projected coordinates is executed via the distance and azimuth of the point from the centre point or origin. For a sphere the formulas are relatively simple. For the ellipsoid the parameters defining the conformal sphere at the tangent point as origin are first de [...]
+\
+Oblique and Equatorial Stereographic Formula\
+\
+Given the geodetic origin of the projection at the tangent point (lat0, lon0), the parameters defining the conformal sphere are:\
+\
+R= sqrt( rho0 * nu0)\
+n= sqrt{1+[(e2*cos^4(lat0))/(1-e2)}\
+c= [(n+sin(lat0)) (1-sin(chi0))]/[(n-sin(lat0)) (1+sin(chi0))]\
+\
+where: sin(chi0) = (w1-1)/(w1+1)\
+w1 = (S1.(S2)^e)^n\
+S1 = (1+sin(lat0))/(1-sin(lat0))\
+S2 = (1-e sin(lat0))/(1+e sin(lat0))\
+\
+The conformal latitude and longitude (chi0,lambda0) of the origin are then computed from :\
+\
+chi0 = asin[(w2-1)/(w2+1)]\
+\
+where S1 and S2 are as above and w2 = c (S1(S2)^e)^n\
+ \
+lambda0 = lon0\
+\
+For any point with geodetic coordinates (lat, lon) the equivalent conformal latitude and longitude (chi, lambda) are computed from \
+lambda = n(lon-lambda0) + lambda0\
+chi = asin[(w-1)/(w+1)]\
+\
+where w = c (Ss (Sb)^e)^n\
+Sa = (1+sin(lat))/(1-sin(lat))\
+Sb = (1-e.sin(lat))/(1+e.sin(lat))\
+ \
+Then B = [1+sin(chi) sin(chi0) + cos(chi) cos(chi0) cos(lambda-lambda0)]\
+\
+N = FN + 2 R k0 [sin(chi) cos(chi0) - cos(chi) sin(chi0) cos(lambda-lambda0)] / B\
+\
+E = FE + 2 R k0 cos(chi) sin(lambda-lambda0) / B\
+\
+\
+The reverse formulae to compute the geodetic coordinates from the grid coordinates involves computing the conformal values, then the isometric latitude and finally the geodetic values.\
+\
+The parameters of the conformal sphere and conformal latitude and longitude at the origin are computed as above. Then for any point with Stereographic grid coordinates (E,N) :\
+\
+chi = chi0 + 2 atan[{(N-FN)-(E-FE) tan (j/2)} / (2 R k0)]\
+\
+lambda = j + 2 i + lambda0\
+\
+where g = 2 R k0 tan(pi/4 - chi0/2)\
+h = 4 R k0 tan(chi0) + g\
+i = atan[(E-FE) / {h+(N-FN)}]\
+j = atan[(E-FE) / (g-(N-FN)] - i\
+\
+Geodetic longitude lon = (lambda-lambda0 ) / n + lambda0\
+\
+Isometric latitude psi = 0.5 ln [(1+ sin(chi)) / { c (1- sin(chi))}] / n\
+\
+First approximation lat1 = 2 atan(e^psi) - pi/2 where e=base of natural logarithms.\
+\
+psii = isometric latitude at lati\
+\
+where psii= ln[{tan(lati/2 + pi/4} {(1-e sin(lati))/(1+e sin(lati))}^(e/2)]\
+ \
+Then iterate lat(i+1) = lati - ( psii - psi ) cos(lati) (1 -e^2 sin^2(lati)) / (1 - e^2)\
+\
+until the change in lat is sufficiently small.\
+\
+\
+For Oblique Stereographic projections centred on points in the southern hemisphere, the signs of E, N, lon0, lon, must be reversed to be used in the equations and lat will be negative anyway as a southerly latitude.\
+\
+An alternative approach is given by Snyder, where, instead of defining a single conformal sphere at the origin point, the conformal latitude at each point on the ellipsoid is computed. The conformal longitude is then always equivalent to the geodetic longitude. This approach is a valid alternative to the above, but gives slightly different results away from the origin point. It is therefore considered to be a different projection method.","For Projected Coordinate System RD / Netherlands New\
+\
+Parameters:\
+Ellipsoid Bessel 1841 a = 6377397.155 m 1/f = 299.15281\
+then e = 0.08169683\
+\
+Latitude Natural Origin 52o09'22.178\"N = 0.910296727 rad\
+Longitude Natural Origin 5o23'15.500\"E = 0.094032038 rad\
+Scale factor k0 0.9999079\
+False Eastings FE 155000.00 m\
+False Northings FN 463000.00 m\
+\
+Forward calculation for: \
+\
+Latitude 53oN = 0.925024504 rad\
+Longitude 6oE = 0.104719755 rad\
+\
+first gives the conformal sphere constants:\
+\
+rho0 = 6374588.71 nu0 = 6390710.613\
+R = 6382644.571 n = 1.000475857 c = 1.007576465\
+\
+where S1 = 8.509582274 S2 = 0.878790173 w1 = 8.428769183\
+sin chi0 = 0.787883237\
+\
+w = 8.492629457 chi0 = 0.909684757 D0 = d0 \
+\
+for the point chi = 0.924394997 D = 0.104724841\
+\
+hence B = 1.999870665 N = 557057.739 E = 196105.283\
+\
+reverse calculation for the same Easting and Northing first gives:\
+\
+g = 4379954.188 h = 37197327.96 i = 0.001102255 j = 0.008488122\
+\
+then D = 0.10472467 Longitude = 0.104719584 rad = 6 deg E\
+\
+chi = 0.924394767 psi = 1.089495123\
+phi1 = 0.921804948 psi1 = 1.084170164\
+phi2 = 0.925031162 psi2 = 1.089506925\
+phi3 = 0.925024504 psi3 = 1.089495505\
+phi4 = 0.925024504\
+\
+Then Latitude = 53o00'00.000\"N\
+ Longitude = 6o00'00.000\"E",1999-11-15 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.6",EPSG,,99.811
+9810,Polar Stereographic,,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"For the forward transformation from latitude and longitude,\
+\
+E = FE + rho sin(lon - lon0)\
+N = FN - rho cos(lon - lon0)\
+where\
+rho = 2 a ko t /{[((1+e)^(1+e)) ((1-e)^(1-e))]^0.5}\
+t = tan (pi/4 - lat/2) / [(1-esin(lat) ) / (1 + e sin(lat))]^(e/2)\
+\
+For the reverse transformation,\
+\
+lat = chi+ (e^2/2 + 5e^4/24 + e^6/12 + 13e^8/360) sin(2 chi) \
++ (7e^4/48 + 29e^6/240 + 811e^8/11520) sin(4 chi)\
++ (7e^6/120 + 81e^8/1120) sin(6 chi) + (4279e^8/161280) sin(8 chi)\
+\
+lon = lon0+ arctan [(E-FE) / (FN-N)]\
+\
+where chi = pi/2 - 2 arctan t\
+t = rho [((1+e)^(1+e)) ((1-e)^(1-e))]^0.5} / 2 a ko\
+rho = [(E-FE)^2 + (N - FN)^2]^0.5",,1996-09-18 00:00:00,"US Geological Survey Professional Paper 1395; \"Map Projections - A Working Manual\"; J. Snyder",EPSG,,
+9811,New Zealand Map Grid,,,Latitude of natural origin,Longitude of natural origin,,,,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,New Zealand Department of Lands technical circular 1973/32,EPSG,,
+9812,Hotine Oblique Mercator,,,Latitude of projection centre,Longitude of projection centre,Azimuth of initial line,Angle from Rectified to Skew Grid,Scale factor on initial line,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The following constants for the projection may be calculated :\
+\
+B = (1 + esq * cos^4(latc) / (1 - esq ))^0.5\
+A = a * B * kc *(1 - esq )^0.5 / ( 1 - esq * sin^2(latc))\
+t0 = tan(pi/4 - latc/2) / ((1 - e*sin(latc)) / (1 + e*sin(latc)))^(e/2)\
+D = B (1 - esq)^0.5 / (cos(latc) * ( 1 - esq*sin^2(latc))^0.5)\
+if D < 1 to avoid problems with computation of F make D^2 = 1 \
+F = D + (D^2 - 1)^0.5 * SIGN(latc)\
+H = F* t0*B\
+G = (F - 1/F) / 2\
+gamma0 = asin(sin(alphac) / D)\
+lon0 = lonc - (asin(G*tan(gamma0))) / B\
+\
+Then compute the (uc , vc) co-ordinates for the centre point (fc , lc).\
+vc =0\
+In general: uc = (A / B) atan((Dsq - 1)^0.5 / cos (alphac) ) * SIGN(latc)\
+\
+but for the special cases where alphac = 90 degrees (e.g. Hungary, Switzerland) then \
+uc = A*(lonc - lon0) \
+\
+ \
+Forward case: To compute (E,N) from a given (lat,lon) :\
+\
+t = tan(pi/4 - lat/2) / ((1 - e sin (lat)) / (1 + e sin (lat)))^(e/2)\
+Q = H / t^B\
+S = (Q - 1 / Q) / 2\
+T = (Q + 1 / Q) / 2\
+V = sin(B (lon - lon0))\
+U = (- V cos(gamma0) + S sin(gamma0)) / T\
+v = A ln((1 - U) / (1 + U)) / 2 B\
+u = A atan((S cos(gamma0) + V sin(gamma0)) / cos(B (lon - lon0 ))) / B\
+\
+\
+The rectified skew co-ordinates are then derived from:\
+\
+E = v cos(gammac) + u sin(gammac) + FE\
+N = u cos(gammac) - v sin(gammac) + FN\
+\
+Reverse case: Compute (lat,lon) from a given (E,N) :\
+\
+v� = (E - FE) cos(gammac) - (N - FN) sin(gammac)\
+u� = (N - FN) cos(gammac) + (E - FE) sin(gammac)\
+\
+Q� = e- (B v �/ A) where e is the base of natural logarithms.\
+S' = (Q� - 1 / Q�) / 2\
+T� = (Q� + 1 / Q�) / 2\
+V� = sin (B u� / A)\
+U� = (V� cos(gammac) + S� sin(gammac)) / T�\
+t� = (H / ((1 + U�) / (1 - U�))^0.5)^(1 / B)\
+\
+chi = pi / 2 - 2 atan(t�)\
+\
+lat = chi + sin(2chi).( e^2 / 2 + 5*e^4 / 24 + e^6 / 12 + 13*e^8 / 360) + sin(4*chi).( 7*e^4 /48 + 29*e^6 / 240 + 811*e8 / 11520) + sin(6chi).( 7*e^6 / 120 + 81*e8 / 1120) + sin(8chi).(4279 e^8 / 161280)\
+\
+lon= lon0 - atan ((S� cos(gammac) - V� sin(gammac)) / cos(B*u� / A)) / B","For Projected Coordinate System Timbalai 1948 / R.S.O. Borneo (m)\
+\
+Parameters:\
+ Ellipsoid: Everest 1830 (1967 Definition)\
+ a = 6377298.556 metres 1/f = 300.8017\
+ then e = 0.081472981 e2 = 0.006637847\
+ \
+ Latitude Projection Centre fc 4o00'00\"N = 0.069813170 rad\
+ Longitude Projection Centre lc 115o00'00\"E = 2.007128640 rad\
+ Azimuth of central line ac 53o18'56.9537\" = 0.930536611 rad\
+ Rectified to skew gc 53o07'48.3685\" = 0.927295218 rad\
+ Scale factor ko 0.99984\
+ False Eastings FE 0.00 m\
+ False Northings FN 0.00 m\
+\
+Forward calculation for: \
+ Latitude f 4o39'20.783\"N = 0.081258569 rad\
+ Longitude l 114o28'10.539\"E = 1.997871312 rad\
+ \
+B = 1.003303209 F = 1.07212156\
+A = 6376278.686 H = 1.00000299\
+ to = 0.932946976 g0 = 0.92729522\
+ D = 1.002425787 l0 = 1.91437347\
+ D2 = 1.004857458\
+ \
+ uc = 738096.09 vc = 0.00\
+ t = 0.922369529 Q = 1.084456854\
+ S = 0.081168129 T = 1.003288725\
+ V = 0.83675700 U = 0.014680803\
+ v = -93307.40 u = 734236.558\
+ u-uc = -3859.536\
+\
+ Then Easting E = 531404.81 m\
+ Northing N = 515187.85 m\
+\
+Reverse calculations for same easting and northing first gives :\
+ v� = -93307.40 u� = 734236.558\
+ u�+uc = 1472332.652 Q� = 1.014790165\
+ S� = 0.014682385 T� = 1.000107780 \
+ V� = 0.115274794 U� = 0.080902065\
+ t� = 0.922369529 c = 0.080721539 \
+ \
+Then Latitude f = 4o39'20.783\"N \
+ Longitude l = 114o28'10.539\"E",1999-11-15 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.5",EPSG,,97.62 99.811
+9813,Laborde Oblique Mercator,,,Latitude of projection centre,Longitude of projection centre,Azimuth of initial line,,Scale factor on initial line,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,"\"La nouvelle projection du Service Geographique de Madagascar\"; J. Laborde; 1928",EPSG,Can be accomodated by Oblique Mercator method (code 9815).,97.613
+9814,Swiss Oblique Cylindrical,,,Latitude of projection centre,Longitude of projection centre,,,,Easting at projection centre,Northing at projection centre,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,"\"Die projecktionen der Schweizerischen Plan und Kartenwerke\"; J Bollinger; 1967",EPSG,Can be accomodated by Oblique Mercator method (code 9815).,97.612
+9815,Oblique Mercator,,,Latitude of projection centre,Longitude of projection centre,Azimuth of initial line,Angle from Rectified to Skew Grid,Scale factor on initial line,Easting at projection centre,Northing at projection centre,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The following constants for the projection may be calculated :\
+\
+B = (1 + esq * cos^4(latc) / (1 - esq ))^0.5\
+A = a * B * kc *(1 - esq )^0.5 / ( 1 - esq * sin^2(latc))\
+t0 = tan(pi/4 - latc/2) / ((1 - e*sin(latc)) / (1 + e*sin(latc)))^(e/2)\
+D = B (1 - esq)^0.5 / (cos(latc) * ( 1 - esq*sin^2(latc))^0.5)\
+if D < 1 to avoid problems with computation of F make D^2 = 1 \
+F = D + (D^2 - 1)^0.5 * SIGN(latc)\
+H = F* t0*B\
+G = (F - 1/F) / 2\
+gamma0 = asin(sin(alphac) / D)\
+lon0 = lonc - (asin(G*tan(gamma0))) / B\
+\
+Then compute the (uc , vc) co-ordinates for the centre point (fc , lc).\
+vc =0\
+In general: uc = (A / B) atan((Dsq - 1)^0.5 / cos (alphac) ) * SIGN(latc)\
+\
+but for the special cases where alphac = 90 degrees (e.g. Hungary, Switzerland) then \
+uc = A*(lonc - lon0) \
+\
+ \
+Forward case: To compute (E,N) from a given (lat,lon) :\
+\
+t = tan(pi/4 - lat/2) / ((1 - e sin (lat)) / (1 + e sin (lat)))^(e/2)\
+Q = H / t^B\
+S = (Q - 1 / Q) / 2\
+T = (Q + 1 / Q) / 2\
+V = sin(B (lon - lon0))\
+U = (- V cos(gamma0) + S sin(gamma0)) / T\
+v = A ln((1 - U) / (1 + U)) / 2 B\
+u = (A atan((S cos(gamma0) + V sin(gamma0)) / cos(B (lon - lon0 ))) / B) + (uc . SIGN (lon - lonC))\
+\
+\
+The rectified skew co-ordinates are then derived from:\
+\
+E = v cos(gammac) + u sin(gammac) + Ec\
+N = u cos(gammac) - v sin(gammac) + Nc\
+\
+Reverse case: Compute (lat,lon) from a given (E,N) :\
+\
+v� = (E - Ec) cos(gammac) - (N - Nc) sin(gammac)\
+u� = (N - Nc) cos(gammac) + (E - Ec) sin(gammac) + uc\
+\
+Q� = e- (B v �/ A) where e is the base of natural logarithms.\
+S' = (Q� - 1 / Q�) / 2\
+T� = (Q� + 1 / Q�) / 2\
+V� = sin (B u� / A)\
+U� = (V� cos(gammac) + S� sin(gammac)) / T�\
+t� = (H / ((1 + U�) / (1 - U�))^0.5)^(1 / B)\
+\
+chi = pi / 2 - 2 atan(t�)\
+\
+lat = chi + sin(2chi).( e^2 / 2 + 5*e^4 / 24 + e^6 / 12 + 13*e^8 / 360) + sin(4*chi).( 7*e^4 /48 + 29*e^6 / 240 + 811*e8 / 11520) + sin(6chi).( 7*e^6 / 120 + 81*e8 / 1120) + sin(8chi).(4279 e^8 / 161280)\
+\
+lon= lon0 - atan ((S� cos(gammac) - V� sin(gammac)) / cos(B*u� / A)) / B",,1999-11-15 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.5",EPSG,,99.811
+9816,Tunisia Mining Grid,,,Latitude of origin,Longitude of origin,,,,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"This grid is used as the basis for mineral leasing in Tunsia. Lease areas are approximately 2 x 2 km or 400 hectares. The corners of these blocks are defined through a six figure grid reference where the first three digits are an easting in kilometres and the last three digits are a northing. The latitudes and longitudes for block corners at 2 km intervals a [...]
+a) the minimum easting is 94 km, on which the longitude is 5.68989 grads east of Paris.\
+b) the maximum easting is 490 km, on which the longitude is 10.51515 grads east of Paris.\
+c) each 2 km grid easting interval equals 0.02437 grads.\
+d) the minimum northing is 40 km, on which the latitude is 33.39 grads.\
+e) the maximum northing is 860 km, on which the latitude is 41.6039 grads.\
+f) between 40 km N and 360 km N, each 2 km grid northing interval equals 0.02004 grads.\
+g) between 360 km N and 860 km N, each 2 km grid northing interval equals 0.02003 grads.\
+\
+Formulae are:\
+\
+Grads from Paris\
+\
+Lat (grads) = 36.5964 + [(N - 360) * A] \
+where N is in kilometres and A = 0.010015 if N > 360, else A = 0.01002.\
+\
+LonParis (grads) = 7.83445 + [(E - 270) * 0.012185], where E is in kilometres.\
+\
+The reverse formulae are:\
+\
+E (km) = 270 + [(LonParis - 7.83445) / 0.012185] where LonParis is in grads.\
+\
+N (km) = 360 + [(Lat - 36.5964) / B] \
+where Lat is in grads and B = 0.010015 if lat>36.5964, else B = 0.01002.\
+\
+Degrees from Greenwich.\
+\
+Modern practice in Tunisia is to quote latitude and longitude in degrees with longitudes referenced to the Greenwich meridian. The formulae required in addition to the above are:\
+\
+Lat (degrees) = (Latg * 0.9) where Latg is in grads.\
+LonGreenwich (degrees) = [(LonParis + 2.5969213) * 0.9] where LonParis is in grads.\
+\
+\
+Lat (grads) = (Latd / 0.9) where Latd is in decimal degrees.\
+LonParis (grads) = [(LonGreenwich / 0.9) - 2.5969213)] where LonGreenwich is in decimal degrees.","For grid location 302598,\
+Latitude = 36.5964 + [(598 - 360) * A]. As N > 360, A = 0.010015.\
+Latitude = 38.97997 grads = 35.08197 degrees.\
+\
+Longitude = 7.83445 + [(E - 270) * 0.012185, where E = 302.\
+Longitude = 8.22437 grads east of Paris = 9.73916 degrees east of Greenwich.",1999-11-15 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.8",EPSG,,99.811
+9817,Lambert Conic Near-Conformal,,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"To compute the Lambert Conic Near-Conformal the following formulae are used;\
+\
+E = FE + r sin(theta)\
+N = FN + M + r sin(theta) tan(theta/2) using the natural origin rather than the false origin.\
+\
+Compute constants for the ellipse:\
+\
+n = (a-b)/(a+b) \
+A� = a [ 1- n + 5 (n^2 - n^3 ) / 4 + 81 ( n^4 - n^5 ) / 64]*pi /180 \
+B� = 3 a [ n - n^2 + 7 ( n^3 - n^4 ) / 8 + 55 n^5 / 64] / 2\
+C� = 15 a [ n^2 -n^3 + 3 ( n^4 - n^5 ) / 4 ] / 16\
+D� = 35 a [ n^3 - n^4 + 11 n^5 / 16 ] / 48\
+E� = 315 a [ n^4 - n^5 ] / 512\
+\
+Then compute the meridional arc from the equator to the parallel.\
+s0 = A� lat0 - B� sin(2 lat0) + C� sin(4 lat0) - D� sin(6 lat0) + E� sin(8 lat0) where lat0 in the first term is in degrees\
+s0 = A� lat - B� sin(2 lat) + C� sin(4 lat) - D� sin(6 lat) + E� sin(8 lat) where lat0 in the first term is in degrees\
+m = s - s0\
+A = 1 / (6 rho0 nu0) \
+M = ko ( m + A m^3. This is the term that is truncated to the third order.\
+Ms = M per second of arc = M / ((lat - lat0) * 3600)\
+\
+theta = (lon - lon0) sin(lat0)\
+ro = ko nu0 / tan(lat0)\
+r = ro - M\
+\
+The reverse formulas for lat and lon from E and N with r0 and Ms as above:\
+\
+lat = M�/ (Ms * 3600) + lat0 where lat0 and lat are in degrees\
+lon = lon0 + theta� / sin(lat0) where lont0 and lon are in radians\
+\
+where\
+E� = E - FE N� = N - FN\
+theta� = arctan [E� / (r0 - N�)]\
+r� = E� / sin(theta�) \
+M� = r0 - r'","For Projected Coordinate System: Deir ez Zor / Levant Zone\
+\
+Parameters:\
+Ellipsoid Clarke 1880 (IGN) a = 6378249.2 m 1/f = 293.46602\
+then b = 6356515.000 n = 0.001706682563\
+\
+Latitude Natural Origin = 34o 39'00\" N = 0.604756586 rad\
+Longitude Natural Origin = 37o 21'00\" E= 0.651880476 rad\
+Scale factor at origin ko = 0.99962560\
+False Eastings FE = 300000.00 m\
+False Northings FN = 300000.00 m\
+\
+Forward calculation for: \
+Latitude of 37d 31' 17.625\" N = 0.654874806 rad\
+Longitude of 34d 08' 11.291\" E = 0.595793792 rad\
+first gives\
+A = 4.1067494 * 10e-15 A�=111131.8633\
+B�= 16300.64407 C�= 17.38751 D�= 0.02308 E�= 0.000033\
+so = 3835482.233 s = 4154101.458 m = 318619.225\
+M = 318632.72 Ms = 30.82262319\
+q = -0.03188875 ro = 9235264.405 r = 8916631.685\
+\
+Then Easting E = 15707.96 m (c.f. E = 15708.00 using full formulae)\
+ Northing N = 623165.96 m (c.f. N = 623167.20 using full formulae)\
+\
+Reverse calculation for the same easting and northing first gives\
+\
+q' = -0.03188875\
+r� = 8916631.685\
+M�= 318632.72 \
+\
+Latitude = 0.654874806 rad = 37d 31' 17.625\" N\
+Longitude = 0.595793792 rad = 34d 08' 11.291\" E",1999-11-15 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1.1",EPSG,,99.811
+9818,American Polyconic,,,Latitude of natural origin,Longitude of natural origin,,,,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1999-10-20 00:00:00,"US Geological Survey Professional Paper 1395; \"Map Projections - A Working Manual\"; J. Snyder",EPSG,,99.55
diff --git a/src/tiff/csv/trf_nonpolynomial.c b/src/tiff/csv/trf_nonpolynomial.c
new file mode 100644
index 0000000..718a6b0
--- /dev/null
+++ b/src/tiff/csv/trf_nonpolynomial.c
@@ -0,0 +1,1082 @@
+#include "defs.h"
+datafile_rows_t trf_nonpolynomial_row_1[] = {"COORD_TRF_CODE","COORD_TRF_EPSG_NAME","COORD_TRF_EPSG_ABBR","COORD_TRF_USER_NAME","DESCRIPTION","AREA_OF_USE","COORD_TRF_METHOD_CODE","PARAMETER_1","PARAMETER_2","PARAMETER_3","PARAMETER_4","PARAMETER_5","PARAMETER_6","PARAMETER_7","UOM_LENGTH_CODE","UOM_ANGLE_CODE","PRIME_MERIDIAN_CODE","UOM_SCALE_CODE","PARAMETER_35","PARAMETER_36","PARAMETER_37","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t trf_nonpolynomial_row_2[] = {"1100","Adindan to WGS 84 (1)","","","","MEAN FOR Ethiopia; Sudan.","9603","-166.0","-15.0","204.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_3[] = {"1101","Adindan to WGS 84 (2)","","","","Burkina Faso.","9603","-118.0","-14.0","218.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_4[] = {"1102","Adindan to WGS 84 (3)","","","","Cameroon.","9603","-134.0","-2.0","210.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_5[] = {"1103","Adindan to WGS 84 (4)","","","","Ethiopia.","9603","-165.0","-11.0","206.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_6[] = {"1104","Adindan to WGS 84 (5)","","","","Mali.","9603","-123.0","-20.0","220.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_7[] = {"1105","Adindan to WGS 84 (6)","","","","Senegal.","9603","-128.0","-18.0","224.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_8[] = {"1106","Adindan to WGS 84 (7)","","","","Sudan.","9603","-161.0","-14.0","205.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_9[] = {"1107","Afgooye to WGS 84 (1)","","","","Somalia.","9603","-43.0","-163.0","45.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_10[] = {"1108","AGD66 to WGS 84 (1)","","","","Australia.","9603","-133.0","-48.0","148.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_11[] = {"1109","AGD84 to WGS 84 (1)","","","","Australia.","9603","-134.0","-48.0","149.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_12[] = {"1110","Ain el Abd to WGS 84 (1)","","","","Bahrain.","9603","-150.0","-250.0","-1.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","97.06",NULL};
+datafile_rows_t trf_nonpolynomial_row_13[] = {"1111","Ain el Abd to WGS 84 (2)","","","","Saudi Arabia.","9603","-143.0","-236.0","7.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_14[] = {"1112","Amersfoort to WGS 84 (1)","","","","Netherlands.","9606","593.16","26.15","478.54","-6.3239","-0.5008","-5.5487","4.0775","9001","9109","","9202","","","","1997-04-11 00:00:00","Nederlandse Commissie voor Geodesie publication 30; 1993.","EPSG","","97.07",NULL};
+datafile_rows_t trf_nonpolynomial_row_15[] = {"1113","Arc 1950 to WGS 84 (1)","","","","MEAN FOR Botswana; Lesotho; Malawi; Swaziland; Zaire; Zambia; Zimbabwe.","9603","-143.0","-90.0","-294.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_16[] = {"1114","Arc 1950 to WGS 84 (2)","","","","Botswana.","9603","-138.0","-105.0","-289.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_17[] = {"1115","Arc 1950 to WGS 84 (3)","","","","Burundi.","9603","-153.0","-5.0","-292.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_18[] = {"1116","Arc 1950 to WGS 84 (4)","","","","Lesotho.","9603","-125.0","-108.0","-295.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_19[] = {"1117","Arc 1950 to WGS 84 (5)","","","","Malawi.","9603","-161.0","-73.0","-317.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_20[] = {"1118","Arc 1950 to WGS 84 (6)","","","","Swaziland.","9603","-134.0","-105.0","-295.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_21[] = {"1119","Arc 1950 to WGS 84 (7)","","","","Zaire.","9603","-169.0","-19.0","-278.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_22[] = {"1120","Arc 1950 to WGS 84 (8)","","","","Zambia.","9603","-147.0","-74.0","-283.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_23[] = {"1121","Arc 1950 to WGS 84 (9)","","","","Zimbabwe.","9603","-142.0","-96.0","-293.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_24[] = {"1122","Arc 1960 to WGS 84 (1)","","","","MEAN FOR Kenya; Tanzania.","9603","-160.0","-6.0","-302.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_25[] = {"1123","Batavia to WGS 84 (1)","","","","Indonesia (Sumatra).","9603","-377.0","681.0","-50.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_26[] = {"1124","Bermuda 1957 to WGS 84 (1)","","","","Bermuda.","9603","-73.0","213.0","296.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_27[] = {"1125","Bogota to WGS 84 (1)","","","","Colombia.","9603","307.0","304.0","-318.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_28[] = {"1126","Bukit Rimpah to WGS 84 (1)","","","","Indonesia (Bangka & Belitung Islands).","9603","-384.0","664.0","-48.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_29[] = {"1127","Campo Inchauspe to WGS 84 (1)","","","","Argentina.","9603","-148.0","136.0","90.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_30[] = {"1128","Cape to WGS 84 (1)","","","","South Africa.","9603","-136.0","-108.0","-292.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_31[] = {"1129","Cape to WGS 84 (2)","","","","South Africa.","9603","-134.73","-110.92","-292.66","","","","","9001","","","","","","","1996-10-18 00:00:00","Private Communication, Directorate of Surveys and Land Information, Cape Town.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_32[] = {"1130","Carthage to WGS 84 (1)","","","","Tunisia.","9603","-263.0","6.0","431.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_33[] = {"1131","Chua to WGS 84 (1)","","","","Paraguay.","9603","-134.0","229.0","-29.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_34[] = {"1132","Corrego Alegre to WGS 84 (1)","","","","Brazil.","9603","-206.0","172.0","-6.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_35[] = {"1133","ED50 to WGS 84 (1)","","","","MEAN FOR Austria; Belgium; Denmark; Finland; France; Germany (west); Gibraltar; Greece; Italy; Luxembourg; Netherlands; Norway; Portugal; Spain; Sweden; Switzerland.","9603","-87.0","-98.0","-121.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","97.02",NULL};
+datafile_rows_t trf_nonpolynomial_row_36[] = {"1134","ED50 to WGS 84 (2)","","","","MEAN FOR Austria; Denmark; France; Germany (west); Netherlands; Switzerland.","9603","-87.0","-96.0","-120.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_37[] = {"1135","ED50 to WGS 84 (3)","","","","MEAN FOR Iraq; Israel; Jordan; Lebanon; Kuwait; Saudi Arabia; Syria.","9603","-103.0","-106.0","-141.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_38[] = {"1136","ED50 to WGS 84 (4)","","","","Cyprus.","9603","-104.0","-101.0","-140.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_39[] = {"1137","ED50 to WGS 84 (5)","","","","Egypt.","9603","-130.0","-117.0","-151.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_40[] = {"1138","ED50 to WGS 84 (6)","","","","Ireland; United Kingdom (UK).","9603","-86.0","-96.0","-120.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_41[] = {"1139","ED50 to WGS 84 (7)","","","","Finland; Norway.","9603","-87.0","-95.0","-120.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_42[] = {"1140","ED50 to WGS 84 (8)","","","","Greece.","9603","-84.0","-95.0","-130.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_43[] = {"1141","ED50 to WGS 84 (9)","","","","Iran.","9603","-117.0","-132.0","-164.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_44[] = {"1142","ED50 to WGS 84 (10)","","","","Italy (Sardinia).","9603","-97.0","-103.0","-120.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_45[] = {"1143","ED50 to WGS 84 (11)","","","","Italy (Sicily).","9603","-97.0","-88.0","-135.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_46[] = {"1144","ED50 to WGS 84 (12)","","","","Malta.","9603","-107.0","-88.0","-149.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_47[] = {"1145","ED50 to WGS 84 (13)","","","","Portugal; Spain.","9603","-84.0","-107.0","-120.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_48[] = {"1146","ED87 to WGS 84 (1)","","","","Denmark - North Sea; Germany - North Sea; Netherlands - offshore; Norway; United Kingdom (UKCS) - North Sea south of 62 deg N.","9606","-82.981","-99.719","-110.709","-0.5076","0.1503","0.3898","-0.3143","9001","9109","","9202","","","","1997-04-11 00:00:00","Norwegian Mapping Authority publication 1990:1 and note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\"","EPSG","","97.03 9 [...]
+datafile_rows_t trf_nonpolynomial_row_49[] = {"1147","ED50 to ED87 (2)","","","","Norway - offshore north of 65 deg N.","9606","-1.51","-0.84","-3.5","-1.893","-0.687","-2.764","0.609","9001","9109","","9202","","","","1997-04-11 00:00:00","Norwegian Mapping Authority note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\"","EPSG","","97.04",NULL};
+datafile_rows_t trf_nonpolynomial_row_50[] = {"1148","Egypt 1907 to WGS 84 (1)","","","","Egypt.","9603","-130.0","110.0","-13.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_51[] = {"1149","ETRF89 to WGS 84 (1)","","","","Europe.","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1997-06-16 00:00:00","EPSG","EPSG","ETRF89 is a realisation of WGS84 coincident to within 1.5 metres. This transformation has an accuracy equal to the coincidence figure.","97.24",NULL};
+datafile_rows_t trf_nonpolynomial_row_52[] = {"1150","GDA94 to WGS 84 (1)","","","","Australia.","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1996-10-18 00:00:00","EPSG","EPSG","GDA94 is a realisation of WGS84 coincident to within 1.5 metres. This transformation has an accuracy equal to the coincidence figure.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_53[] = {"1151","GD49 to WGS 84 (1)","","","","New Zealand.","9603","84.0","-22.0","209.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_54[] = {"1152","Hu Tzu Shan to WGS 84 (1)","","","","Taiwan.","9603","-637.0","-549.0","-203.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_55[] = {"1153","Indian 1954 to WGS 84 (1)","","","","Thailand.","9603","217.0","823.0","299.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","97.06",NULL};
+datafile_rows_t trf_nonpolynomial_row_56[] = {"1154","Indian 1975 to WGS 84 (1)","","","","Thailand.","9603","209.0","818.0","290.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 second edition September 1991","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_57[] = {"1155","Kalianpur 1937 to WGS 84 (1)","","","","Bangladesh.","9603","282.0","726.0","254.0","","","","","9001","","","","","","","1999-10-20 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","97.235",NULL};
+datafile_rows_t trf_nonpolynomial_row_58[] = {"1156","Kalianpur 1975 to WGS 84 (1)","","","","India; Nepal.","9603","295.0","736.0","257.0","","","","","9001","","","","","","","1999-10-20 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","Care! DMA ellipsoid is inconsistent with EPSG ellipsoid - transformation parameter values may not be appropriate.","97.235",NULL};
+datafile_rows_t trf_nonpolynomial_row_59[] = {"1157","Kandawala to WGS 84 (1)","","","","Sri Lanka.","9603","-97.0","787.0","86.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_60[] = {"1158","Kertau to WGS 84 (1)","","","","Malaysia - West Malaysia; Singapore.","9603","-11.0","851.0","5.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_61[] = {"1159","Leigon to WGS 84 (1)","","","","Ghana.","9603","-130.0","29.0","364.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_62[] = {"1160","Liberia 1964 to WGS 84 (1)","","","","Liberia.","9603","-90.0","40.0","88.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_63[] = {"1161","Luzon 1911 to WGS 84 (1)","","","","Philippines (excluding Mindanao).","9603","-133.0","-77.0","-51.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_64[] = {"1162","Luzon 1911 to WGS 84 (2)","","","","Philippines (Mindanao).","9603","-133.0","-79.0","-72.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_65[] = {"1163","M'poraloko to WGS 84 (1)","","","","Gabon.","9603","-74.0","-130.0","42.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_66[] = {"1164","Mahe 1971 to WGS 84 (1)","","","","Seychelles - Mahe Island.","9603","41.0","-220.0","-134.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_67[] = {"1165","Massawa to WGS 84 (1)","","","","Ethiopia (Eritrea).","9603","639.0","405.0","60.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_68[] = {"1166","Merchich to WGS 84 (1)","","","","Morocco.","9603","31.0","146.0","47.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_69[] = {"1167","Minna to WGS 84 (1)","","","","Cameroon.","9603","-81.0","-84.0","115.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_70[] = {"1168","Minna to WGS 84 (2)","","","","Nigeria.","9603","-92.0","-93.0","122.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_71[] = {"1169","Monte Mario to WGS 84 (1)","","","","Italy (Sardinia).","9603","-225.0","-65.0","9.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_72[] = {"1170","NAD27 to WGS 84 (1)","","","","MEAN FOR Antigua; Barbados; Barbuda; Caicos Islands; Cuba; Dominican Republic; Grand Cayman; Jamaica; Turks Islands.","9603","-3.0","142.0","183.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_73[] = {"1171","NAD27 to WGS 84 (2)","","","","MEAN FOR Belize; Costa Rica; El Salvador; Guatemala; Honduras; Nicaragua.","9603","0.0","125.0","194.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_74[] = {"1172","NAD27 to WGS 84 (3)","","","","MEAN FOR Canada.","9603","-10.0","158.0","187.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_75[] = {"1173","NAD27 to WGS 84 (4)","","","","MEAN FOR United States (USA) (CONUS).","9603","-8.0","160.0","176.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_76[] = {"1174","NAD27 to WGS 84 (5)","","","","MEAN FOR United States (USA) (CONUS East of Mississippi River including Louisiana; Missouri; Minnesota).","9603","-9.0","161.0","179.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_77[] = {"1175","NAD27 to WGS 84 (6)","","","","MEAN FOR United States (USA) (CONUS West of Mississippi River).","9603","-8.0","159.0","175.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_78[] = {"1176","NAD27 to WGS 84 (7)","","","","United States (USA) - Alaska (Excluding Aleutian Islands).","9603","-5.0","135.0","172.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_79[] = {"1177","NAD27 to WGS 84 (8)","","","","Bahamas (Except San Salvador Island).","9603","-4.0","154.0","178.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_80[] = {"1178","NAD27 to WGS 84 (9)","","","","Bahamas (San Salvador Island).","9603","1.0","140.0","165.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_81[] = {"1179","NAD27 to WGS 84 (10)","","","","Canada (Alberta; British Columbia).","9603","-7.0","162.0","188.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_82[] = {"1180","NAD27 to WGS 84 (11)","","","","Canada (Manitoba; Ontario).","9603","-9.0","157.0","184.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_83[] = {"1181","NAD27 to WGS 84 (12)","","","","Canada (New Brunswick; Newfoundland; Nova Scotia; Quebec).","9603","-22.0","160.0","190.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_84[] = {"1182","NAD27 to WGS 84 (13)","","","","Canada (Northwest Territories; Nunavut; Saskatchewan).","9603","4.0","159.0","188.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_85[] = {"1183","NAD27 to WGS 84 (14)","","","","Canada (Yukon).","9603","-7.0","139.0","181.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_86[] = {"1184","NAD27 to WGS 84 (15)","","","","Panama - Canal Zone.","9603","0.0","125.0","201.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_87[] = {"1185","NAD27 to WGS 84 (16)","","","","Cuba.","9603","-9.0","152.0","178.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_88[] = {"1186","NAD27 to WGS 84 (17)","","","","Greenland (Hayes Peninsula).","9603","11.0","114.0","195.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_89[] = {"1187","NAD27 to WGS 84 (18)","","","","Mexico.","9603","-12.0","130.0","190.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_90[] = {"1188","NAD83 to WGS 84 (1)","","","","Canada; Central America; Mexico; United States (USA) (Alaska (excluding Aleutian Islands); CONUS).","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","NAD83 is a realisation of WGS84 coincident to within 1.5 metres. This transformation has an accuracy equal to the coincidence figure.","97.06",NULL};
+datafile_rows_t trf_nonpolynomial_row_91[] = {"1189","Nahrwan 1967 to WGS 84 (1)","","","","Oman (Masirah Island).","9603","-247.0","-148.0","369.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_92[] = {"1190","Nahrwan 1967 to WGS 84 (2)","","","","Saudi Arabia.","9603","-243.0","-192.0","477.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_93[] = {"1191","Nahrwan 1967 to WGS 84 (3)","","","","United Arab Emirates (UAE).","9603","-249.0","-156.0","381.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_94[] = {"1192","Naparima 1972 to WGS 84 (1)","","","","Trinidad and Tobago.","9603","-10.0","375.0","165.0","","","","","9001","","","","","","","1998-06-30 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","CAUTION: EPSG believes that these parameter values include a blunder and that if NIMA transformation parameters are to be used the 1987 version (EPSG code 1307) be used.","98.102",NULL};
+datafile_rows_t trf_nonpolynomial_row_95[] = {"1193","NTF to WGS 84 (1)","","","","France.","9603","-168.0","-60.0","320.0","","","","","9001","","","","","","","1996-10-18 00:00:00","IGN technical report RT/G 14; January 1988.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_96[] = {"1195","OSGB 1936 to WGS 84 (1)","","","","MEAN FOR United Kingdom (UK) - Great Britain (England; Scotland; Wales); Isle of Man.","9603","375.0","-111.0","431.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_97[] = {"1196","OSGB 1936 to WGS 84 (2)","","","","United Kingdom (UK) - England.","9603","371.0","-112.0","434.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_98[] = {"1197","OSGB 1936 to WGS 84 (3)","","","","United Kingdom (UK) - England; Wales; Isle of Man.","9603","371.0","-111.0","434.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_99[] = {"1198","OSGB 1936 to WGS 84 (4)","","","","United Kingdom (UK) - Scotland (including Shetland Islands).","9603","384.0","-111.0","425.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_100[] = {"1199","OSGB 1936 to WGS 84 (5)","","","","United Kingdom (UK) - Wales.","9603","370.0","-108.0","434.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_101[] = {"1200","Pointe Noire to WGS 84 (1)","","","","Congo.","9603","-148.0","51.0","-291.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_102[] = {"1201","PSAD56 to WGS 84 (1)","","","","MEAN FOR Bolivia; Chile; Colombia; Ecuador; Guyana; Peru; Venezuela.","9603","-288.0","175.0","-376.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_103[] = {"1202","PSAD56 to WGS 84 (2)","","","","Bolivia.","9603","-270.0","188.0","-388.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_104[] = {"1203","PSAD56 to WGS 84 (3)","","","","Chile (Northern; near 19 deg S).","9603","-270.0","183.0","-390.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_105[] = {"1204","PSAD56 to WGS 84 (4)","","","","Chile (Southern; near 43 deg S).","9603","-305.0","243.0","-442.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_106[] = {"1205","PSAD56 to WGS 84 (5)","","","","Colombia.","9603","-282.0","169.0","-371.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_107[] = {"1206","PSAD56 to WGS 84 (6)","","","","Ecuador.","9603","-278.0","171.0","-367.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_108[] = {"1207","PSAD56 to WGS 84 (7)","","","","Guyana.","9603","-298.0","159.0","-369.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_109[] = {"1208","PSAD56 to WGS 84 (8)","","","","Peru.","9603","-279.0","175.0","-379.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_110[] = {"1209","PSAD56 to WGS 84 (9)","","","","Venezuela.","9603","-295.0","173.0","-371.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_111[] = {"1210","Qatar to WGS 84 (1)","","","","Qatar.","9603","-128.0","-283.0","22.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_112[] = {"1211","Qornoq to WGS 84 (1)","","","","Greenland (South).","9603","164.0","138.0","-189.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_113[] = {"1212","SAD69 to WGS 84 (1)","","","","MEAN FOR Argentina; Bolivia; Brazil; Chile; Colombia; Ecuador; Guyana; Paraguay; Peru; Trinidad & Tobago; Venezuela.","9603","-57.0","1.0","-41.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_114[] = {"1213","SAD69 to WGS 84 (2)","","","","Argentina.","9603","-62.0","-1.0","-37.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_115[] = {"1214","SAD69 to WGS 84 (3)","","","","Bolivia.","9603","-61.0","2.0","-48.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_116[] = {"1215","SAD69 to WGS 84 (4)","","","","Brazil.","9603","-60.0","-2.0","-41.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_117[] = {"1216","SAD69 to WGS 84 (5)","","","","Chile.","9603","-75.0","-1.0","-44.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_118[] = {"1217","SAD69 to WGS 84 (6)","","","","Colombia.","9603","-44.0","6.0","-36.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_119[] = {"1218","SAD69 to WGS 84 (7)","","","","Ecuador.","9603","-48.0","3.0","-44.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_120[] = {"1219","SAD69 to WGS 84 (8)","","","","Ecuador (Baltra; Galapagos).","9603","-47.0","26.0","-42.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_121[] = {"1220","SAD69 to WGS 84 (9)","","","","Guyana.","9603","-53.0","3.0","-47.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_122[] = {"1221","SAD69 to WGS 84 (10)","","","","Paraguay.","9603","-61.0","2.0","-33.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_123[] = {"1222","SAD69 to WGS 84 (11)","","","","Peru.","9603","-58.0","0.0","-44.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_124[] = {"1223","SAD69 to WGS 84 (12)","","","","Trinidad and Tobago.","9603","-45.0","12.0","-33.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_125[] = {"1224","SAD69 to WGS 84 (13)","","","","Venezuela.","9603","-45.0","8.0","-33.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_126[] = {"1225","Sapper Hill 1943 to WGS 84 (1)","","","","Falkland Islands - East Falkland Island.","9603","-355.0","21.0","72.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_127[] = {"1226","Schwarzeck to WGS 84 (1)","","","","Namibia.","9603","616.0","97.0","-251.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_128[] = {"1227","Tananarive to WGS 84 (1)","","","","Madagascar.","9603","-189.0","-242.0","-91.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_129[] = {"1228","Timbalai 1948 to WGS 84 (1)","","","","Brunei; Malaysia (Sabah; Sarawak).","9603","-679.0","669.0","-48.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_130[] = {"1229","TM65 to WGS 84 (1)","","","","Ireland.","9603","506.0","-122.0","611.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_131[] = {"1230","Tokyo to WGS 84 (1)","","","","MEAN FOR Japan; South Korea; Okinawa.","9603","-148.0","507.0","685.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","97.06",NULL};
+datafile_rows_t trf_nonpolynomial_row_132[] = {"1231","Tokyo to WGS 84 (2)","","","","Japan.","9603","-148.0","507.0","685.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_133[] = {"1232","Tokyo to WGS 84 (3)","","","","South Korea.","9603","-146.0","507.0","687.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","97.06",NULL};
+datafile_rows_t trf_nonpolynomial_row_134[] = {"1233","Tokyo to WGS 84 (4)","","","","Japan (Okinawa).","9603","-158.0","507.0","676.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_135[] = {"1234","Yacare to WGS 84 (1)","","","","Uruguay.","9603","-155.0","171.0","37.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_136[] = {"1235","Zanderij to WGS 84 (1)","","","","Suriname.","9603","-265.0","120.0","-358.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_137[] = {"1236","AGD84 to WGS 84 (2)","","","","Australia.","9607","-116.0","-50.47","141.69","-0.23","-0.39","-0.344","0.0983","9001","9104","","9202","","","","1997-11-13 00:00:00","Australian Surveying and Land Information Group - www.auslig.gov.au/geodesy","EPSG","Superseded by AGD84 to GDA94 (2) (code 1280).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_138[] = {"1237","WGS 72 to WGS 84 (1)","","","","World.","9606","0.0","0.0","4.5","0.0","0.0","0.554","0.2263","9001","9104","","9202","","","","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_139[] = {"1238","WGS 72 to WGS 84 (2)","","","","World.","9606","0.0","0.0","4.5","0.0","0.0","0.554","0.219","9001","9104","","9202","","","","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_140[] = {"1239","WGS 72BE to WGS 72 (1)","","","","World.","9606","0.0","0.0","-2.6","0.0","0.0","0.26","-0.6063","9001","9104","","9202","","","","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_141[] = {"1240","WGS 72BE to WGS 84 (1)","","","","World.","9606","0.0","0.0","1.9","0.0","0.0","0.814","-0.38","9001","9104","","9202","","","","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_142[] = {"1241","NAD27 to NAD83 (1)","","","","United States (USA) - lower 48 states including EEZ.","9613","","","","","","","","","9104","","","conus.las","conus.los","","1999-04-22 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.","98.201 98.53",NULL};
+datafile_rows_t trf_nonpolynomial_row_143[] = {"1243","NAD27 to NAD83 (2)","","","","United States (USA) - Alaska including EEZ.","9613","","","","","","","","","9104","","","alaska.las","alaska.los","","1999-04-22 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.","98.201 98.53",NULL};
+datafile_rows_t trf_nonpolynomial_row_144[] = {"1245","ED50 to WGS 84 (16)","","","","Tunisia.","9603","-112.0","-77.0","-145.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_145[] = {"1246","Herat North to WGS 84 (1)","","","","Afghanistan.","9603","-333.0","-222.0","114.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_146[] = {"1247","Kalianpur 1962 to WGS 84 (1)","","","","Pakistan.","9603","283.0","682.0","231.0","","","","","9001","","","","","","","1999-10-20 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","Care! DMA ellipsoid is inconsistent with EPSG ellipsoid - transformation parameter values may not be appropriate.","97.235",NULL};
+datafile_rows_t trf_nonpolynomial_row_147[] = {"1248","ID74 to WGS 84 (1)","","","","Indonesia.","9603","-24.0","-15.0","5.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_148[] = {"1249","NAD27 to WGS 84 (21)","","","","United States (USA) - Alaska - Aleutian Islands east of 180 deg.","9603","-2.0","152.0","149.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_149[] = {"1250","NAD27 to WGS 84 (22)","","","","United States (USA) - Alaska - Aleutian Islands west of 180 deg.","9603","2.0","204.0","105.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_150[] = {"1251","NAD83 to WGS 84 (2)","","","","United States (USA) - Alaska - Aleutian Islands.","9603","-2.0","0.0","4.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_151[] = {"1252","NAD83 to WGS 84 (3)","","","","United States (USA) - Hawaii.","9603","1.0","1.0","-1.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_152[] = {"1253","Nord Sahara 1959 to WGS 84 (1)","","","","Algeria.","9603","-186.0","-93.0","310.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_153[] = {"1254","Pulkovo 1942 to WGS 84 (1)","","","","Russia.","9603","28.0","-130.0","-95.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_154[] = {"1255","Voirol Unifie to WGS 84 (1)","","","","Algeria - north of 35g (31 deg 30 min) North.","9603","-123.0","-206.0","219.0","","","","","9001","","","","","","","1998-06-30 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","CAUTION: EPSG believes that the data used in the derivation of these parameters contains a blunder. We recommend using transformation 1253 [North Sahara 1959 to WGS84 (1)] as Voirol 1 [...]
+datafile_rows_t trf_nonpolynomial_row_155[] = {"1256","Fahud to WGS 84 (1)","","","","Oman.","9603","-346.0","-1.0","224.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_156[] = {"1257","Bern 1898 (Bern) to Bern 1898","","","","Liechtenstein; Switzerland.","9601","7.26225","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_157[] = {"1258","Bogota (Bogota) to Bogota","","","","Colombia.","9601","-74.04513","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_158[] = {"1259","Lisbon (Lisbon) to Lisbon","","","","Portugal - onshore.","9601","-9.0754862","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_159[] = {"1260","Makassar (Jakarta) to Makassar","","","","Indonesia - south west Sulawesi.","9601","106.482779","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_160[] = {"1261","MGI (Ferro) to MGI","","","","Austria.","9601","-17.4","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_161[] = {"1262","Monte Mario (Rome) to Monte Mario","","","","Italy.","9601","12.27084","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","98.37 99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_162[] = {"1263","Padang (Jakarta) to Padang","","","","Indonesia - Sumatra.","9601","106.482779","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_163[] = {"1264","Belge 1950 (Brussels) to Belge 1950","","","","Belgium - onshore.","9601","4.220471","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_164[] = {"1265","Tananarive (Paris) to Tananarive","","","","Madagascar.","9601","2.5969213","","","","","","","","9105","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_165[] = {"1266","Voirol 1875 (Paris) to Voirol 1875","","","","Algeria - north of 32 deg N.","9601","2.5969213","","","","","","","","9105","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_166[] = {"1267","Voirol Unifie (Paris) to Voirol Unifie","","","","Algeria - north of 32 deg N.","9601","2.5969213","","","","","","","","9105","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_167[] = {"1268","Batavia (Jakarta) to Batavia","","","","Indonesia - Java.","9601","106.482779","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_168[] = {"1269","RT38 (Stockholm) to RT38","","","","Sweden.","9601","18.03298","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_169[] = {"1270","Greek (Athens) to Greek","","","","Greece - onshore.","9601","23.4258815","","","","","","","","9110","","","","","","1999-11-12 00:00:00","Topography Department; National Technical University of Athens.","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_170[] = {"1271","Schwarzeck to WGS 84 (2)","","","","Namibia.","9603","615.64","102.08","-255.81","","","","","9001","","","","","","","1997-11-13 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Beware ! Schwarzeck CS uses German legal metres. Example: Schwarzeck Lat 19d 35m 46.952s S Long 20d 41m 50.649s E; X=5623409.40 Y=2124618.00 Z=-2125847.62 GLM; X=5623485.86 Y=2124646.89 Z=-2125876.53 m; WGS84 X=5 [...]
+datafile_rows_t trf_nonpolynomial_row_171[] = {"1272","GGRS87 to WGS 84 (1)","","","","Greece.","9603","-199.87","74.79","246.62","","","","","9001","","","","","","","1997-06-16 00:00:00","Geodesy Department; Public Petroleum Corporation of Greece.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_172[] = {"1273","HD72 to ETRF89 (1)","","","","Hungary.","9607","-56.0","75.77","15.31","-0.37","-0.2","-0.21","-1.01","9001","9104","","9202","","","","1997-11-13 00:00:00","http://lazarus.elte.hu/gb/geodez/geod5.htm","EPSG","","97.47",NULL};
+datafile_rows_t trf_nonpolynomial_row_173[] = {"1274","Pulkovo 1942 to LKS94(ETRS89) (1)","CS42 to LKS94 (1)","","","Lithuania.","9607","-40.595","-18.55","-69.339","-2.508","-1.832","2.611","-4.299","9001","9104","","9202","","","","1998-03-12 00:00:00","HNIT-BALTIC GeoInfoServisas.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_174[] = {"1275","ED50 to WGS 84 (17)","","","","France.","9603","-84.0","-97.0","-117.0","","","","","9001","","","","","","","1998-04-16 00:00:00","IGN technical report 14 (January 1988).","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_175[] = {"1276","NTF to ED50 (1)","","","","France.","9603","-84.0","37.0","437.0","","","","","9001","","","","","","","1997-11-13 00:00:00","IGN technical report 7 (October 1981).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_176[] = {"1277","NTF to WGS 72 (1)","","","","France.","9603","-168.0","-72.0","314.0","","","","","9001","","","","","","","1997-11-13 00:00:00","IGN technical report 7 (October 1981).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_177[] = {"1278","AGD66 to GDA94 (1)","","","","Australia.","9603","-127.8","-52.3","152.9","","","","","9001","","","","","","","1997-11-13 00:00:00","http://www.anzlic.org.au/icsm/gdatm/molodens.htm","EPSG","5m accuracy. Parameter values are given to greater precision but no better accuracy at http://www.dehaa.sa.gov.au/res_inform/sicom/where/geobas14.html","",NULL};
+datafile_rows_t trf_nonpolynomial_row_178[] = {"1279","AGD84 to GDA94 (1)","","","","Australia.","9603","-128.5","-53.0","153.4","","","","","9001","","","","","","","1997-11-13 00:00:00","http://www.anzlic.org.au/icsm/gdatm/molodens.htm","EPSG","5m accuracy. Parameter values are given to greater precision but no better accuracy at http://www.dehaa.sa.gov.au/res_inform/sicom/where/geobas14.html","",NULL};
+datafile_rows_t trf_nonpolynomial_row_179[] = {"1280","AGD84 to GDA94 (2)","","","","Australia.","9607","-117.763","-51.51","139.061","-0.292","-0.443","-0.277","-0.191","9001","9104","","9202","","","","1997-11-13 00:00:00","http://www.anzlic.org.au/icsm/gdatm/simil.htm","EPSG","1m accuracy. Supersedes AGD84 to WGS 84 (2) (code 1236).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_180[] = {"1282","Samboja to WGS 84 (1)","","","","Indonesia - east Kalimantan - Mahakam delta area.","9603","-404.78","-685.68","-45.47","","","","","9001","","","","","","","1997-11-13 00:00:00","Total Indonesia.","EPSG","Datum shift derived through ITRF93.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_181[] = {"1283","LKS94(ETRS89) to WGS 84 (1)","LKS94 to WGS 84 (1)","","","Lithuania.","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1998-03-12 00:00:00","HNIT-BALTIC GeoInfoServisas.","EPSG","LKS94 is a realisation of WGS84 coincident to within 1.5 metres. This transformation has an accuracy equal to the coincidence figure.","98.13",NULL};
+datafile_rows_t trf_nonpolynomial_row_182[] = {"1284","Arc 1960 to WGS 84 (2)","","","","Kenya.","9603","-157.0","-2.0","-299.0","","","","","9001","","","","","","","1998-03-12 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_183[] = {"1285","Arc 1960 to WGS 84 (3)","","","","Tanzania.","9603","-175.0","-23.0","-303.0","","","","","9001","","","","","","","1998-03-12 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_184[] = {"1286","Segora to WGS 84 (1)","","","","Indonesia - Kalimantan.","9603","-403.0","684.0","41.0","","","","","9001","","","","","","","1998-03-12 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_185[] = {"1287","Pulkovo 1942 to WGS 84 (3)","","","","Hungary.","9603","28.0","-121.0","-77.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_186[] = {"1288","Pulkovo 1942 to WGS 84 (4)","","","","Poland.","9603","23.0","-124.0","-82.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_187[] = {"1289","Pulkovo 1942 to WGS 84 (5)","","","","Czech Republic.","9603","26.0","-121.0","-78.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_188[] = {"1290","Pulkovo 1942 to WGS 84 (6)","","","","Latvia.","9603","24.0","-124.0","-82.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_189[] = {"1291","Pulkovo 1942 to WGS 84 (7)","","","","Kazakstan.","9603","15.0","-130.0","-84.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_190[] = {"1292","Pulkovo 1942 to WGS 84 (8)","","","","Albania.","9603","24.0","-130.0","-92.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_191[] = {"1293","Pulkovo 1942 to WGS 84 (9)","","","","Romania.","9603","28.0","-121.0","-77.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_192[] = {"1294","Voirol 1875 to WGS 84 (1)","","","","Algeria - north of 35g (31 deg 30 min) North.","9603","-73.0","-247.0","227.0","","","","","9001","","","","","","","1998-03-12 00:00:00","U.S. Defense Mapping Agency TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_193[] = {"1295","Naparima 1972 to WGS 84 (2)","","","","Trinidad and Tobago.","9603","-0.465","372.095","171.736","","","","","9001","","","","","","","1998-11-11 00:00:00","Trinidad Ministry of Energy and Energy Industries.","EPSG","","98/38",NULL};
+datafile_rows_t trf_nonpolynomial_row_194[] = {"1296","Trinidad 1903 to WGS 84 (1)","","","","Trinidad.","9603","-61.702","284.488","472.052","","","","","9001","","","","","","","1998-11-11 00:00:00","Trinidad Ministry of Energy and Energy Industries.","EPSG","","98/38",NULL};
+datafile_rows_t trf_nonpolynomial_row_195[] = {"1297","Tete to Moznet (1)","","","","Mozambique.","9607","-115.064","-87.39","-101.716","0.058","-4.001","2.062","9.366","9001","9104","","9202","","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Mean of 32 stations. Residuals as high as 30 metres. To reduce the size of the residuals; four regional parameter sets (codes 1298-1301) were developed.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_196[] = {"1298","Tete to Moznet (2)","","","","Mozambique - Maputo province and southern part of Gaza province; i.e. south of approximately 24 deg S.","9607","-82.875","-57.097","-156.768","2.158","-1.524","0.982","-0.359","9001","9104","","9202","","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Mean of 9 stations; residuals are generally under 1 metre.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_197[] = {"1299","Tete to Moznet (3)","","","","Mozambique - provinces of Gaza; Inhambane and southern parts of Sofala and Manhica; i.e. between approximately 24 and 20 deg South.","9607","-138.527","-91.999","-114.591","0.14","-3.363","2.217","11.748","9001","9104","","9202","","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Mean of 6 stations; residuals are generally under 4 metres.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_198[] = {"1300","Tete to Moznet (4)","","","","Mozambique - provinces of Sofala north of Beira corridor; Manhica; Tete and Zambezia; i.e. between approximately 20 and 16 deg South.","9607","-73.472","-51.66","-112.482","-0.953","-4.6","2.368","0.586","9001","9104","","9202","","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Mean of 11 stations; residuals are generally under 3 metres.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_199[] = {"1301","Tete to Moznet (5)","","","","Mozambique - provinces of Nampula; Niassa; Cabo Delgado; i.e. north of approximately 16 deg S.","9607","219.315","168.975","-166.145","-0.198","-5.926","2.356","-57.104","9001","9104","","9202","","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Mean of 7 stations; residuals are 5-10 metres.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_200[] = {"1302","Moznet to WGS 84 (1)","","","","Mozambique.","9607","0.0","0.0","0.0","0.0","0.0","0.0","0.0","9001","9104","","9202","","","","1998-04-16 00:00:00","EPSG","EPSG","For many purposes Moznet can be considered to be coincident with WGS 84. Accuracy better than 1 metre.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_201[] = {"1303","Pulkovo 1942 to WGS 84 (10)","","","","Kazakstan - Caspian.","9606","43.661","-103.342","-124.117","1.659","-0.824","0.653","0.59","9001","9104","","9202","","","","1998-04-16 00:00:00","KazakCaspiShelf consortium.","EPSG","Mean of 13 stations along entire Kazak coastline; residuals under 2 m.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_202[] = {"1304","Indian 1975 to WGS 84 (2)","","","","Thailand.","9603","210.0","814.0","289.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_203[] = {"1305","Tokyo to WGS 84 (5)","","","","South Korea.","9603","-147.0","506.0","687.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_204[] = {"1306","MGI to WGS 84 (1)","","","","MEAN FOR Boznia and Herzegovina; Croatia; Serbia; Slovenia.","9603","682.0","-203.0","480.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_205[] = {"1307","Naparima 1972 to WGS 84 (3)","","","","Trinidad & Tobago.","9603","-2.0","374.0","172.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. Defense Mapping Agency TR8350.2 December 1987.","EPSG","See remarks for code 1192.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_206[] = {"1308","NAD83 to WGS 84 (4)","","","","United States (USA)","9607","-0.9738","1.9453","0.5486","-0.00000013357","-0.00000004872","-0.00000005507","0.0","9001","9101","","9202","","","","1999-04-22 00:00:00"," http://www.ngs.noaa.gov/CORS/Derivation.html","EPSG","Strictly between NAD83 and ITRF94(1996.0). Superseded by NAD83 to WGS 84 (5) (code 1515).","99.12 99.38",NULL};
+datafile_rows_t trf_nonpolynomial_row_207[] = {"1309","DHDN to ETRF89 (1)","","","","Germany - former west Germany.","9607","582.0","105.0","414.0","-1.04","-0.35","3.08","8.3","9001","9104","","9202","","","","1998-06-30 00:00:00","Institute for Cartography and Geodesy; Leipzig.","EPSG","Mean of 69 stations; residuals under 5 m.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_208[] = {"1310","Pulkovo 1942 to ETRF89 (1)","","","","Germany - former east Germany - Brandenburg; Mecklenburg-Vorpommern; Sachsen-Anhalt.","9607","24.0","-123.0","-94.0","-0.02","0.25","0.13","1.1","9001","9104","","9202","","","","1998-06-30 00:00:00","Institute for Cartography and Geodesy; Leipzig.","EPSG","Mean of 20 stations; residuals under 2 m.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_209[] = {"1311","ED50 to WGS 84 (Common Offshore)","ED50 to WGS 84 (18)","","","United Kingdom - UKCS offshore east of 6 deg west.","9606","-89.5","-93.8","-123.1","0.0","0.0","-0.156","1.2","9001","9104","","9202","","","","1998-06-30 00:00:00","The Hydrographic Journal; vol 52 page 50.","EPSG","Recommended transformation for UKCS petroleum purposes. Based on ED50 to WGS72 (precise ephemeris) 6-nations agreement of 1981 to which precise to broadcas [...]
+datafile_rows_t trf_nonpolynomial_row_210[] = {"1312","NAD27 to NAD83 (3)","","","","Canada.","9614","","","","","","","","","9104","","","NTv1_0.gsb","","","1999-04-22 00:00:00","Geomatics Canada - Geodetic Survey Division.","EPSG","Uses NTv1 method. Superseded in 1997 by NTv2 (non-poly transformation code 1313) except in Quebec. Input expects longitudes to be positive west; EPSG GeogCS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_211[] = {"1313","NAD27 to NAD83 (4)","","","","Canada.","9615","","","","","","","","","9104","","","NTv2_0.gsb","","","1999-04-22 00:00:00","http://www.geod.nrcan.gc.ca/products/html-public/GSDapps/English/NTv2_Fact_Sheet.html","EPSG","Uses NTv2 data files. Supersedes NTv1 (non-poly transformation code 1312) except in Quebec. Input expects longitudes to be positive west; EPSG GeogCS NAD27 (code 4267) and (code 4269) have longitudes positive east. [...]
+datafile_rows_t trf_nonpolynomial_row_212[] = {"1314","OSGB 1936 to WGS 84 (Petroleum)","","","","United Kingdom (UKCS) - Great Britain (GB) - England; Scotland; Wales; - North Sea.","9606","446.448","-125.157","542.06","0.15","0.247","0.842","-20.489","9001","9104","","9202","","","","1998-11-11 00:00:00","UK Offshore Operators Association.","EPSG","Accuracy better than 4m and generally better than 2m. For a more accurate transformation contact the Ordnance Survey of Great Britain.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_213[] = {"1315","OSGB 1936 to ED50 (UKOOA)","","","","United Kingdom (UKCS) - Great Britain (GB) - England; Scotland; Wales; - North Sea.","9606","535.948","-31.357","665.16","0.15","0.247","0.998","-21.689","9001","9104","","9202","","","","1998-11-11 00:00:00","UK Offshore Operators Association.","EPSG","This transformation is concatenated from OSGB36 to WGS 84 (Petroleum) (code 1314) minus ED50 to WGS 84 (Common Offshore) (code 1311).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_214[] = {"1316","Manoca to WGS 84 (1)","","","","Cameroon.","9603","-70.9","-151.8","-41.4","","","","","9001","","","","","","","1998-11-11 00:00:00","Stolt Comex Seaway and Geoid for Elf.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_215[] = {"1317","Camacupa to WGS 72BE (1)","","","","Angola - offshore.","9603","-37.2","-370.6","-228.5","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived by Geophysical Services Inc. in 1979 from mean of Transit results at 7 stations.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_216[] = {"1318","Camacupa to WGS 84 (1)","","","","Angola - offshore block 5.","9603","-42.01","-332.21","-229.75","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Used by Conoco.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_217[] = {"1319","Camacupa to WGS 84 (2)","","","","Angola - offshore block 2.","9603","-40.0","-354.0","-224.0","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Used by Texaco.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_218[] = {"1320","Camacupa to WGS 84 (3)","","","","Angola - offshore blocks 1 and 16.","9606","-37.2","-370.6","-224.0","0.0","0.0","0.554","0.219","9001","9104","8901","9202","","","","1998-12-14 00:00:00","EPSG","EPSG","Used by Shell prior to 1994. Superseded by Camacupa to WGS 84 (9).","98.56",NULL};
+datafile_rows_t trf_nonpolynomial_row_219[] = {"1321","Camacupa to WGS 84 (4)","","","","Angola - offshore blocks 7 and 8. Also used rounded to integer metre for GSI/HGS/Western Geophysical speculative seismic data.","9603","-42.5","-342.5","-228.1","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived as mean of 123 Transit passes at station Cabo Ledo NE base in January 1989. Used by Total for block 8. Used by Elf for block 7 up to December 1992 then supers [...]
+datafile_rows_t trf_nonpolynomial_row_220[] = {"1322","Camacupa to WGS 84 (5)","","","","Angola - offshore block 3.","9603","-55.5","-348.0","-229.2","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived at station Djeno during coordination of platform PAL F2 in February 1992. Used by Elf for block 3 up to December 1992 then superseded by Camacupa to WGS 84 (7).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_221[] = {"1323","Camacupa to WGS 84 (6)","","","","Angola - offshore block 7.","9603","-43.0","-337.0","-233.0","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived at Luanda observatory December 1992. Used by Elf for 1993 block 7 shallow water survey.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_222[] = {"1324","Camacupa to WGS 84 (7)","","","","Angola - offshore blocks 3 7 15 and 17.","9603","-48.0","-345.0","-231.0","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived at platform PAL F2 in December 1992. Used by Elf for blocks 3, 7 and 17 between December 1992 and 1994 then superseded by Camacupa to WGS 84 (10). Used by Exxon for block 15 since 1993.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_223[] = {"1325","Camacupa to WGS 84 (8)","","","","Angola - offshore block 2.","9603","-48.6","-345.1","-230.8","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived at platform PAL F2 in December 1992. Used by Total for block 2 between December 1992 and 1994 then superseded by Camacupa to WGS 84 (10).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_224[] = {"1326","Camacupa to WGS 84 (9)","","","","Angola - offshore blocks 1 16 and 18.","9606","-41.057","-374.564","-226.287","0.0","0.0","0.554","0.219","9001","9104","8901","9202","","","","1998-12-14 00:00:00","EPSG","EPSG","Used by Shell since 1994. Supersedes Camacupa to WGS 84 (3).","98.56",NULL};
+datafile_rows_t trf_nonpolynomial_row_225[] = {"1327","Camacupa to WGS 84 (10)","","","","Angola - offshore blocks 2 3 17 and 31-33.","9603","-50.9","-347.6","-231.0","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived at platform PAL F2 in 1994 by Topnav using Doris. Used by Elf in blocks 3 and 17 since 1994. Used by Total in block 2 since 1994. Adopted by BP-Amoco Elf and Exxon for blocks 31-33.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_226[] = {"1328","Malongo 1987 to Mhast (1)","","","","Angola - Cabinda offshore.","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Malongo 1987 is an offshore extension of Mhast adopted by Chevron in 1987.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_227[] = {"1329","Mhast to WGS 84 (1)","","","","Angola - Cabinda offshore.","9603","-252.95","-4.11","-96.38","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_228[] = {"1330","Malongo 1987 to WGS 84 (1)","","","","Angola - Cabinda offshore.","9603","-252.95","-4.11","-96.38","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Used by Chevron.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_229[] = {"1331","EST92 to ETRF89 (1)","","","","Estonia","9607","0.0","0.0","0.0","0.0","0.0","0.0","0.0","9001","9104","","9202","","","","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_230[] = {"1332","Pulkovo 1942 to EST92 (1)","","","","Estonia.","9607","21.53219","-97.00027","-60.74046","-0.99548","-0.58147","-0.2418","-4.5981","9001","9104","","9202","","","","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_231[] = {"1333","EST92 to WGS84 (1)","","","","Estonia.","9607","0.055","-0.541","-0.185","-0.0183","0.0003","0.007","-0.014","9001","9104","","9202","","","","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_232[] = {"1334","Pulkovo 1942 to WGS84 (12)","","","","Estonia.","9607","21.58719","-97.54127","-60.92546","-1.01378","-0.58117","-0.2348","-4.6121","9001","9104","","9202","","","","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_233[] = {"1335","Tokyo to WGS 84 (6)","","","","Japan - 45d 20m to 46d N; 141d to 142d E.","9618","7.92","-13.88","26.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_234[] = {"1336","Tokyo to WGS 84 (7)","","","","Japan - 45d 20m to 46d N; 142d to 143d E.","9618","7.94","-13.97","26.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_235[] = {"1337","Tokyo to WGS 84 (8)","","","","Japan - 44deg 40min to 45deg 20min N; 141deg to 142deg E.","9618","8.1","-13.81","27.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_236[] = {"1338","Tokyo to WGS 84 (9)","","","","Japan - 44deg 40min to 45deg 20min N; 142deg to 143deg E.","9618","8.15","-13.95","28.4","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_237[] = {"1339","Tokyo to WGS 84 (10)","","","","Japan - 44deg to 44deg 40min N; 141deg to 142deg E.","9618","8.37","-13.65","29.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_238[] = {"1340","Tokyo to WGS 84 (11)","","","","Japan - 44deg to 44deg 40min N; 142deg to 143deg E.","9618","8.44","-13.87","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_239[] = {"1341","Tokyo to WGS 84 (12)","","","","Japan - 44deg to 44deg 40min N; 143deg to 144deg E.","9618","8.61","-14.08","30.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_240[] = {"1342","Tokyo to WGS 84 (13)","","","","Japan - 44deg to 44deg 40min N; 144deg to 145deg E.","9618","8.73","-14.3","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_241[] = {"1343","Tokyo to WGS 84 (14)","","","","Japan - 43deg 20min to 44deg N; 141deg to 142deg E.","9618","8.63","-13.49","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_242[] = {"1344","Tokyo to WGS 84 (15)","","","","Japan - 43deg 20min to 44deg N; 142deg to 143deg E.","9618","8.71","-13.73","31.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_243[] = {"1345","Tokyo to WGS 84 (16)","","","","Japan - 43deg 20min to 44deg N; 143deg to 144deg E.","9618","8.84","-14.03","31.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_244[] = {"1346","Tokyo to WGS 84 (17)","","","","Japan - 43deg 20min to 44deg N; 144deg to 145deg E.","9618","8.98","-14.33","32.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_245[] = {"1347","Tokyo to WGS 84 (18)","","","","Japan - 43deg 20min to 44deg N; 145deg to 146deg E.","9618","9.1","-14.56","32.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_246[] = {"1348","Tokyo to WGS 84 (19)","","","","Japan - 42deg 40min to 43deg 20min N; 140deg to 141deg E.","9618","8.79","-13.0","33.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_247[] = {"1349","Tokyo to WGS 84 (20)","","","","Japan - 42deg 40min to 43deg 20min N; 141deg to 142deg E.","9618","8.84","-13.31","31.4","","","","","9001","9104","","","","","","1999-11-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","99.77",NULL};
+datafile_rows_t trf_nonpolynomial_row_248[] = {"1350","Tokyo to WGS 84 (21)","","","","Japan - 42deg 40min to 43deg 20min N; 142deg to 143deg E.","9618","8.98","-13.59","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_249[] = {"1351","Tokyo to WGS 84 (22)","","","","Japan - 42deg 40min to 43deg 20min N; 143deg to 144deg E.","9618","9.1","-13.91","29.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_250[] = {"1352","Tokyo to WGS 84 (23)","","","","Japan - 42deg 40min to 43deg 20min N; 144deg to 145deg E.","9618","9.17","-14.27","31.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_251[] = {"1353","Tokyo to WGS 84 (24)","","","","Japan - 42deg 40min to 43deg 20min N; 145deg to 146deg E.","9618","9.23","-14.52","31.4","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_252[] = {"1354","Tokyo to WGS 84 (25)","","","","Japan - 42deg to 42deg 40min N; 139deg to 140deg E.","9618","8.9","-12.68","34.4","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_253[] = {"1355","Tokyo to WGS 84 (26)","","","","Japan - 42deg to 42deg 40min N; 140deg to 141deg E.","9618","8.99","-12.8","34.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_254[] = {"1356","Tokyo to WGS 84 (27)","","","","Japan - 42deg to 42deg 40min N; 141deg to 142deg E.","9618","9.0","-13.07","31.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_255[] = {"1357","Tokyo to WGS 84 (28)","","","","Japan - 42deg to 42deg 40min N; 142deg to 143deg E.","9618","9.21","-13.51","27.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_256[] = {"1358","Tokyo to WGS 84 (29)","","","","Japan - 42deg to 42deg 40min N; 143deg to 144deg E.","9618","9.33","-13.66","23.8","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_257[] = {"1359","Tokyo to WGS 84 (30)","","","","Japan - 41deg 20min to 42deg N; 140deg to 141deg E.","9618","9.25","-12.72","34.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_258[] = {"1360","Tokyo to WGS 84 (31)","","","","Japan - 41deg 20min to 42deg N; 141deg to 142deg E.","9618","9.39","-12.91","31.8","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_259[] = {"1361","Tokyo to WGS 84 (32)","","","","Japan - 40deg 40min to 41deg 20min N; 140deg to 141deg E.","9618","9.55","-12.63","35.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_260[] = {"1362","Tokyo to WGS 84 (33)","","","","Japan - 40deg 40min to 41deg 20min N; 141deg to 142deg E.","9618","9.62","-12.82","34.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_261[] = {"1363","Tokyo to WGS 84 (34)","","","","Japan - 40deg to 40deg 40min N; 139deg to 140deg E.","9618","9.81","-12.29","36.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_262[] = {"1364","Tokyo to WGS 84 (35)","","","","Japan - 40deg to 40deg 40min N; 140deg to 141deg E.","9618","9.81","-12.45","37.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_263[] = {"1365","Tokyo to WGS 84 (36)","","","","Japan - 40deg to 40deg 40min N; 141deg to 142deg E.","9618","9.92","-12.79","38.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_264[] = {"1366","Tokyo to WGS 84 (37)","","","","Japan - 39deg 20min to 40deg N; 139deg to 140deg E.","9618","9.91","-12.21","36.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_265[] = {"1367","Tokyo to WGS 84 (38)","","","","Japan - 39deg 20min to 40deg N; 140deg to 141deg E.","9618","10.08","-12.35","39.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_266[] = {"1368","Tokyo to WGS 84 (39)","","","","Japan - 39deg 20min to 40deg N; 141deg to 142deg E.","9618","10.19","-12.74","40.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_267[] = {"1369","Tokyo to WGS 84 (40)","","","","Japan - 38deg 40min to 39deg 20min N; 139deg to 140deg E.","9618","10.29","-12.13","38.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_268[] = {"1370","Tokyo to WGS 84 (41)","","","","Japan - 38deg 40min to 39deg 20min N; 140deg to 141deg E.","9618","10.33","-12.27","40.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_269[] = {"1371","Tokyo to WGS 84 (42)","","","","Japan - 38deg 40min to 39deg 20min N; 141deg to 142deg E.","9618","10.45","-12.61","41.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_270[] = {"1372","Tokyo to WGS 84 (43)","","","","Japan - 38deg to 38deg 40min N; 139deg to 140deg E.","9618","10.54","-11.96","39.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_271[] = {"1373","Tokyo to WGS 84 (44)","","","","Japan - 38deg to 38deg 40min N; 140deg to 141deg E.","9618","10.65","-12.27","41.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_272[] = {"1374","Tokyo to WGS 84 (45)","","","","Japan - 38deg to 38deg 40min N; 141deg to 142deg E.","9618","10.67","-12.5","41.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_273[] = {"1375","Tokyo to WGS 84 (46)","","","","Japan - 37deg 20min to 38deg N; 136deg to 137deg E.","9618","10.67","-10.86","38.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_274[] = {"1376","Tokyo to WGS 84 (47)","","","","Japan - 37deg 20min to 38deg N; 137deg to 138deg E.","9618","10.68","-10.97","36.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_275[] = {"1377","Tokyo to WGS 84 (48)","","","","Japan - 37deg 20min to 38deg N; 138deg to 139deg E.","9618","10.8","-11.53","39.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_276[] = {"1378","Tokyo to WGS 84 (49)","","","","Japan - 37deg 20min to 38deg N; 139deg to 140deg E.","9618","10.8","-11.73","40.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_277[] = {"1379","Tokyo to WGS 84 (50)","","","","Japan - 37deg 20min to 38deg N; 140deg to 141deg E.","9618","10.92","-12.16","42.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_278[] = {"1380","Tokyo to WGS 84 (51)","","","","Japan - 37deg 20min to 38deg N; 141deg to 142deg E.","9618","11.0","-12.25","41.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_279[] = {"1381","Tokyo to WGS 84 (52)","","","","Japan - 36deg 40min to 37deg 20min N; 136deg to 137deg E.","9618","10.83","-10.77","36.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_280[] = {"1382","Tokyo to WGS 84 (53)","","","","Japan - 36deg 40min to 37deg 20min N; 137deg to 138deg E.","9618","10.95","-11.0","38.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_281[] = {"1383","Tokyo to WGS 84 (54)","","","","Japan - 36deg 40min to 37deg 20min N; 138deg to 139deg E.","9618","10.97","-11.34","40.8","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_282[] = {"1384","Tokyo to WGS 84 (55)","","","","Japan - 36deg 40min to 37deg 20min N; 139deg to 140deg E.","9618","11.04","-11.69","43.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_283[] = {"1385","Tokyo to WGS 84 (56)","","","","Japan - 36deg 40min to 37deg 20min N; 140deg to 141deg E.","9618","11.17","-12.05","42.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_284[] = {"1386","Tokyo to WGS 84 (57)","","","","Japan - 36deg to 37deg 40min N; 136deg to 137deg E.","9618","11.11","-10.59","37.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_285[] = {"1387","Tokyo to WGS 84 (58)","","","","Japan - 36deg to 37deg 40min N; 137deg to 138deg E.","9618","11.16","-10.97","40.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_286[] = {"1388","Tokyo to WGS 84 (59)","","","","Japan - 36deg to 37deg 40min N; 138deg to 139deg E.","9618","11.29","-11.23","42.4","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_287[] = {"1389","Tokyo to WGS 84 (60)","","","","Japan - 36deg to 37deg 40min N; 139deg to 140deg E.","9618","11.36","-11.59","42.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_288[] = {"1390","Tokyo to WGS 84 (61)","","","","Japan - 36deg to 37deg 40min N; 140deg to 141deg E.","9618","11.44","-11.88","40.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_289[] = {"1391","Tokyo to WGS 84 (62)","","","","Japan - 35deg 20min to 36deg N; 132deg to 133deg E.","9618","11.27","-9.31","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_290[] = {"1392","Tokyo to WGS 84 (63)","","","","Japan - 35deg 20min to 36deg N; 133deg to 134deg E.","9618","11.33","-9.52","33.8","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_291[] = {"1393","Tokyo to WGS 84 (64)","","","","Japan - 35deg 20min to 36deg N; 134deg to 135deg E.","9618","11.38","-9.86","34.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_292[] = {"1394","Tokyo to WGS 84 (65)","","","","Japan - 35deg 20min to 36deg N; 135deg to 136deg E.","9618","11.41","-10.14","35.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_293[] = {"1395","Tokyo to WGS 84 (66)","","","","Japan - 35deg 20min to 36deg N; 136deg to 137deg E.","9618","11.39","-10.52","37.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_294[] = {"1396","Tokyo to WGS 84 (67)","","","","Japan - 35deg 20min to 36deg N; 137deg to 138deg E.","9618","11.49","-10.83","39.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_295[] = {"1397","Tokyo to WGS 84 (68)","","","","Japan - 35deg 20min to 36deg N; 138deg to 139deg E.","9618","11.58","-11.21","41.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_296[] = {"1398","Tokyo to WGS 84 (69)","","","","Japan - 35deg 20min to 36deg N; 139deg to 140deg E.","9618","11.65","-11.53","38.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_297[] = {"1399","Tokyo to WGS 84 (70)","","","","Japan - 35deg 20min to 36deg N; 140deg to 141deg E.","9618","11.72","-11.8","34.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_298[] = {"1400","Tokyo to WGS 84 (71)","","","","Japan - 34deg 40min to 35deg 20min N; 132deg to 133deg E.","9618","11.44","-9.21","32.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_299[] = {"1401","Tokyo to WGS 84 (72)","","","","Japan - 34deg 40min to 35deg 20min N; 133deg to 134deg E.","9618","11.47","-9.52","35.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_300[] = {"1402","Tokyo to WGS 84 (73)","","","","Japan - 34deg 40min to 35deg 20min N; 134deg to 135deg E.","9618","11.55","-9.8","35.4","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_301[] = {"1403","Tokyo to WGS 84 (74)","","","","Japan - 34deg 40min to 35deg 20min N; 135deg to 136deg E.","9618","11.61","-10.12","35.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_302[] = {"1404","Tokyo to WGS 84 (75)","","","","Japan - 34deg 40min to 35deg 20min N; 136deg to 137deg E.","9618","11.66","-10.47","37.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_303[] = {"1405","Tokyo to WGS 84 (76)","","","","Japan - 34deg 40min to 35deg 20min N; 137deg to 138deg E.","9618","11.78","-10.79","39.8","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_304[] = {"1406","Tokyo to WGS 84 (77)","","","","Japan - 34deg 40min to 35deg 20min N; 138deg to 139deg E.","9618","11.85","-11.13","39.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_305[] = {"1407","Tokyo to WGS 84 (78)","","","","Japan - 34deg 40min to 35deg 20min N; 139deg to 140deg E.","9618","11.9","-11.47","36.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_306[] = {"1408","Tokyo to WGS 84 (79)","","","","Japan - 34deg 40min to 35deg 20min N; 140deg to 141deg E.","9618","11.91","-11.69","33.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_307[] = {"1409","Tokyo to WGS 84 (80)","","","","Japan - 34deg to 34deg 40min N; 130deg to 131deg E.","9618","11.65","-8.59","29.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_308[] = {"1410","Tokyo to WGS 84 (81)","","","","Japan - 34deg to 34deg 40min N; 131deg to 132deg E.","9618","11.68","-8.8","30.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_309[] = {"1411","Tokyo to WGS 84 (82)","","","","Japan - 34deg to 34deg 40min N; 132deg to 133deg E.","9618","11.73","-9.04","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_310[] = {"1412","Tokyo to WGS 84 (83)","","","","Japan - 34deg to 34deg 40min N; 133deg to 134deg E.","9618","11.72","-9.48","35.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_311[] = {"1413","Tokyo to WGS 84 (84)","","","","Japan - 34deg to 34deg 40min N; 134deg to 135deg E.","9618","11.81","9.74","35.8","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_312[] = {"1414","Tokyo to WGS 84 (85)","","","","Japan - 34deg to 34deg 40min N; 135deg to 136deg E.","9618","11.88","-10.1","37.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_313[] = {"1415","Tokyo to WGS 84 (86)","","","","Japan - 34deg to 34deg 40min N; 136deg to 137deg E.","9618","11.91","-10.35","37.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_314[] = {"1416","Tokyo to WGS 84 (87)","","","","Japan - 34deg to 34deg 40min N; 137deg to 138deg E.","9618","11.9","-10.7","39.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_315[] = {"1417","Tokyo to WGS 84 (88)","","","","Japan - 34deg to 34deg 40min N; 138deg to 139deg E.","9618","12.02","-11.09","38.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_316[] = {"1418","Tokyo to WGS 84 (89)","","","","Japan - 33deg 20min to 34deg N; 129deg to 130deg E.","9618","11.87","-8.23","29.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_317[] = {"1419","Tokyo to WGS 84 (90)","","","","Japan - 33deg 20min to 34deg N; 130deg to 131deg E.","9618","11.84","-8.44","30.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_318[] = {"1420","Tokyo to WGS 84 (91)","","","","Japan - 33deg 20min to 34deg N; 131deg to 132deg E.","9618","11.94","-8.71","30.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_319[] = {"1421","Tokyo to WGS 84 (92)","","","","Japan - 33deg 20min to 34deg N; 132deg to 133deg E.","9618","11.99","-9.02","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_320[] = {"1422","Tokyo to WGS 84 (93)","","","","Japan - 33deg 20min to 34deg N; 133deg to 134deg E.","9618","12.05","-9.36","35.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_321[] = {"1423","Tokyo to WGS 84 (94)","","","","Japan - 33deg 20min to 34deg N; 134deg to 135deg E.","9618","12.1","-9.64","35.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_322[] = {"1424","Tokyo to WGS 84 (95)","","","","Japan - 33deg 20min to 34deg N; 135deg to 136deg E.","9618","12.1","-10.08","37.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_323[] = {"1425","Tokyo to WGS 84 (96)","","","","Japan - 33deg 20min to 34deg N; 136deg to 137deg E.","9618","12.07","-10.25","37.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_324[] = {"1426","Tokyo to WGS 84 (97)","","","","Japan - 32deg 40min to 33deg 20min N; 129deg to 130deg E.","9618","12.0","-8.15","32.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_325[] = {"1427","Tokyo to WGS 84 (98)","","","","Japan - 32deg 40min to 33deg 20min N; 130deg to 131deg E.","9618","12.06","-8.38","31.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_326[] = {"1428","Tokyo to WGS 84 (99)","","","","Japan - 32deg 40min to 33deg 20min N; 131deg to 132deg E.","9618","12.17","-8.69","30.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_327[] = {"1429","Tokyo to WGS 84 (100)","","","","Japan - 32deg 40min to 33deg 20min N; 132deg to 133deg E.","9618","12.23","-8.99","31.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_328[] = {"1430","Tokyo to WGS 84 (101)","","","","Japan - 32deg 40min to 33deg 20min N; 133deg to 134deg E.","9618","12.21","-9.21","34.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_329[] = {"1431","Tokyo to WGS 84 (102)","","","","Japan - 32deg 40min to 33deg 20min N; 134deg to 135deg E.","9618","12.28","-9.6","33.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_330[] = {"1432","Tokyo to WGS 84 (103)","","","","Japan - 32deg to 32deg 40min N; 130deg to 131deg E.","9618","12.28","-8.25","31.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_331[] = {"1433","Tokyo to WGS 84 (104)","","","","Japan - 32deg to 32deg 40min N; 131deg to 132deg E.","9618","12.37","-8.55","29.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_332[] = {"1434","Tokyo to WGS 84 (105)","","","","Japan - 31deg 20min to 32deg N; 130deg to 131deg E.","9618","12.53","-8.21","31.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_333[] = {"1435","Tokyo to WGS 84 (106)","","","","Japan - 31deg 20min to 32deg N; 131deg to 132deg E.","9618","12.57","-8.4","28.4","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_334[] = {"1436","Tokyo to WGS 84 (107)","","","","Japan - 30deg 40min to 31deg 20min N; 130deg to 131deg E.","9618","12.71","-8.17","29.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_335[] = {"1437","RT90 to ETRF89 (1)","","","","Sweden","9607","419.3836","99.3335","591.3451","-0.850389","-1.817277","7.862238","-0.99496","9001","9104","","9202","","","","1999-04-22 00:00:00","National Land Survey of Sweden.","EPSG","This transformation is actually between ETRF89 and RR92. RR92 is a geographic 3D coordinate system where the horizontal component is RT90.","99.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_336[] = {"1438","Fahud to WGS 84 (2)","","","","Oman.","9606","-333.102","-11.02","230.69","0.0","0.0","0.554","0.219","9001","9104","","9202","","","","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_337[] = {"1439","PSD93 to WGS 84 (1)","","","","Oman.","9606","-180.624","-225.516","173.919","-0.81","-1.898","8.336","16.71006","9001","9104","","9202","","","","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_338[] = {"1440","ED50 to WGS 84 (19)","","","","Greece.","9603","-86.0","-92.2","-127.5","","","","","9001","","","","","","","1999-04-22 00:00:00","Geodesy Department; Hellenic Petroleum s.a.","EPSG","Used in oil industry.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_339[] = {"1441","Antigua 1943 to WGS 84 (1)","","","","Antigua.","9603","-255.0","-15.0","71.0","","","","","9001","","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_340[] = {"1442","Dominica 1945 to WGS 84 (1)","","","","Dominica.","9603","725.0","685.0","536.0","","","","","9001","","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_341[] = {"1443","Grenada 1953 to WGS 84 (1)","","","","Grenada.","9603","72.0","213.7","93.0","","","","","9001","","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_342[] = {"1444","Montserrat 1958 to WGS 84 (1)","","","","Montserrat.","9603","174.0","359.0","365.0","","","","","9001","","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_343[] = {"1445","St. Kitts 1955 to WGS 84 (1)","","","","Saint Kitts and Nevis.","9603","9.0","183.0","236.0","","","","","9001","","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_344[] = {"1446","St. Lucia 1955 to WGS 84 (1)","","","","Saint Lucia.","9603","-149.0","128.0","296.0","","","","","9001","","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_345[] = {"1447","Anguilla 1957 to WGS 84 (1)","","","","Anguilla.","9619","-18.0","4.4","","","","","","","9104","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_346[] = {"1450","ED50 to WGS 84 (20)","","","","Norway - offshore between 62 and 65 deg North and west of 5 deg East.","9620","","","","","","8047.0","8046.0","","9102","","","ED50 to WGS 84 (15)","ED50 to WGS 84 (14)","","1999-04-22 00:00:00","Norwegian Mapping Authority note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\"","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_347[] = {"1451","NAD27(CGQ77) to NAD83 (1)","","","","Canada - Quebec","9614","","","","","","","","","9104","","","PQV4.DAC","","","1999-05-15 00:00:00","Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca","EPSG","Uses NT method which expects longitudes positive west; EPSG GeogCSs CGQ77 (code 4609) and NAD83 (code 4269) have longitudes positive east. Supersedes NAD27 to NAD83 (5) (code xxxx).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_348[] = {"1454","Old Hawaiian to NAD83 (1)","","","","United States (USA) - Hawaii including EEZ.","9613","","","","","","","","","9104","","","hawaii.las","hawaii.los","","1999-05-15 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs Old Hawaiian (code 4135) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from Old Hawaiian Datum to but ma [...]
+datafile_rows_t trf_nonpolynomial_row_349[] = {"1455","St. Lawrence Island to NAD83 (1)","","","","United States (USA) - Alaska - St. Lawrence Island.","9613","","","","","","","","","9104","","","stlrnc.las","stlrnc.los","","1999-05-15 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs St. Lawrence (code 4136) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. Lawrence D [...]
+datafile_rows_t trf_nonpolynomial_row_350[] = {"1456","St. Paul Island to NAD83 (1)","","","","United States (USA) - Alaska - St. Paul Island.","9613","","","","","","","","","9104","","","stpaul.las","stpaul.los","","1999-05-15 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs St. Paul (code 4137) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. Paul Datum to but make [...]
+datafile_rows_t trf_nonpolynomial_row_351[] = {"1457","St. George Island to NAD83 (1)","","","","United States (USA) - Alaska - St. George Island.","9613","","","","","","","","","9104","","","stgeorge.las","stgeorge.los","","1999-05-15 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs St. George (code 4138) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. George Datum [...]
+datafile_rows_t trf_nonpolynomial_row_352[] = {"1458","AGD66 to GDA94 (2)","","","","Australia - ACT.","9607","-129.193","-41.212","130.73","-0.246","-0.374","-0.329","-2.955","9001","9104","","9202","","","","1999-05-25 00:00:00","http://www.anzlic.org.au/icsm/gdatm/regional.htm","EPSG","1m accuracy. Recommended for mid-accuracy use in A.C.T.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_353[] = {"1459","AGD66 to GDA94 (3)","","","","Australia - Tasmania.","9607","-120.695","-62.73","165.46","-0.109","0.141","0.116","2.733","9001","9104","","9202","","","","1999-05-25 00:00:00","http://www.anzlic.org.au/icsm/gdatm/regional.htm","EPSG","1m accuracy. Recommended for mid-accuracy use in Tasmania.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_354[] = {"1460","AGD66 to GDA94 (4)","","","","Australia - New South Wales (NSW) and Victoria.","9607","-119.353","-48.301","139.484","-0.415","-0.26","-0.437","-0.613","9001","9104","","9202","","","","1999-05-25 00:00:00","http://www.anzlic.org.au/icsm/gdatm/regional.htm","EPSG","1m accuracy. Recommended for mid-accuracy use in NSW and Victoria.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_355[] = {"1461","Puerto Rico to NAD83 (1)","","","","Puerto Rico; Virgin Islands (U.S.); Virgin Islands (British).","9613","","","","","","","","","9104","","","prvi.las","prvi.los","","1999-05-24 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs Puerto Rico (code 4139) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from Puerto Rico Datum [...]
+datafile_rows_t trf_nonpolynomial_row_356[] = {"1462","NAD27 to NAD83 (5)","","","","Canada - Quebec","9614","","","","","","","","","9104","","","GS2783v1.QUE","","","1999-05-24 00:00:00","Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca","EPSG","Uses NT method which expects longitudes positive west; EPSG GeogCSs NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east. Superseded by NAD27(CGQ77) to NAD83 (1) (code 1451).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_357[] = {"1463","NAD27(76) to NAD83 (1)","","","","Canada - Ontario","9615","","","","","","","","","9104","","","May76v20.gsb","","","1999-05-24 00:00:00","Geodetic Survey of Canada http://www.geod.emr.ca/html-public/GSDapps/English/NTv2_Fact_Sheet.html","EPSG","Uses NT method which expects longitudes positive west; EPSG GeogCSs NAD27(76) (code 4608) and NAD83 (code 4269) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_358[] = {"1464","AGD66 to GDA94 (5)","","","","Australia - Victoria.","9615","","","","","","","","","9104","","","vic_0799.gsb","","","1999-10-20 00:00:00","http://www.osg.vic.gov.au/tools.htm","EPSG","0.1m accuracy. Input expects longitudes to be positive west; EPSG GeogCS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.","99.67",NULL};
+datafile_rows_t trf_nonpolynomial_row_359[] = {"1466","NGO 1948 (Oslo) to NGO1948","","","","Norway - onshore.","9601","10.43225","","","","","","","","9110","","","","","","1999-11-12 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_360[] = {"1467","NTF (Paris) to NTF (1)","","","","France - onshore.","9601","2.5969213","","","","","","","","9105","","","","","","1999-11-12 00:00:00","IGN Paris.","EPSG","Change of prime meridian.","99.63 99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_361[] = {"1468","NTF (Paris) to NTF (2)","","","","France - onshore.","9601","2.201395","","","","","","","","9110","","","","","","1999-11-12 00:00:00","Royal Geographic Society; London","EPSG","Change of prime meridian. EPSG prefers value from IGN Paris (code 1467).","99.63 99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_362[] = {"1469","Locodjo 1965 to WGS 84 (1)","","","","Cote D'Ivoire (Ivory Coast)","9603","-125.0","53.0","467.0","","","","","9001","","","","","","","1999-10-20 00:00:00","IGN Paris","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_363[] = {"1470","Abidjan 1987 to WGS 84 (1)","","","","Cote D'Ivoire (Ivory Coast)","9603","-124.76","53.0","466.79","","","","","9001","","","","","","","1999-10-20 00:00:00","IGN Paris","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_364[] = {"1471","MGI to WGS 84 (2)","","","","Austria","9606","-577.326","-90.129","-463.919","-15.8537","-4.55","-16.3489","-2.4232","9001","9113","","9202","","","","1999-10-20 00:00:00","Bundesamt f�r Eich- und Vermessungswesen","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_365[] = {"1472","ATS77 to NAD83(CSRS98) (1)","","","","Canada - New Brunswick","9615","","","","","","","","","9104","","","NT7783v2.gsb","","","1999-10-20 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","Introduced in 1999.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_366[] = {"1473","NAD83(CSRS98) to WGS 84 (1)","","","","Canada - New Brunswick","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1999-10-20 00:00:00","EPSG","EPSG","For many purposes NAD83 can be considered to be coincident with WGS 84.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_367[] = {"1474","NAD83 to NAD83(HARN) (1)","","","","United States (USA) - Alabama.","9613","","","","","","","","","9104","","","alhpgn.las","alhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_368[] = {"1475","NAD83 to NAD83(HARN) (2)","","","","United States (USA) - Arizona.","9613","","","","","","","","","9104","","","azhpgn.las","azhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_369[] = {"1476","NAD83 to NAD83(HARN) (3)","","","","United States (USA) - California north of 38 deg N.","9613","","","","","","","","","9104","","","cnhpgn.las","cnhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_370[] = {"1477","NAD83 to NAD83(HARN) (4)","","","","United States (USA) - California south of 38 deg N.","9613","","","","","","","","","9104","","","cshpgn.las","cshpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_371[] = {"1478","NAD83 to NAD83(HARN) (5)","","","","United States (USA) - Colorado.","9613","","","","","","","","","9104","","","cohpgn.las","cohpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_372[] = {"1479","NAD83 to NAD83(HARN) (6)","","","","United States (USA) - Georgia.","9613","","","","","","","","","9104","","","gahpgn.las","gahpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_373[] = {"1480","NAD83 to NAD83(HARN) (7)","","","","United States (USA) - Florida.","9613","","","","","","","","","9104","","","flhpgn.las","flhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_374[] = {"1481","NAD83 to NAD83(HARN) (8)","","","","United States (USA) - Idaho and Montana - east of 113 deg W.","9613","","","","","","","","","9104","","","emhpgn.las","emhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_375[] = {"1482","NAD83 to NAD83(HARN) (9)","","","","United States (USA) - Idaho and Montana - west of 113 deg W.","9613","","","","","","","","","9104","","","wmhpgn.las","wmhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_376[] = {"1483","NAD83 to NAD83(HARN) (10)","","","","United States (USA) - Kentucky.","9613","","","","","","","","","9104","","","kyhpgn.las","kyhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_377[] = {"1484","NAD83 to NAD83(HARN) (11)","","","","United States (USA) - Louisiana.","9613","","","","","","","","","9104","","","lahpgn.las","lahpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_378[] = {"1485","NAD83 to NAD83(HARN) (12)","","","","United States (USA) - Delaware and Maryland.","9613","","","","","","","","","9104","","","mdhpgn.las","mdhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_379[] = {"1486","NAD83 to NAD83(HARN) (13)","","","","United States (USA) - Maine.","9613","","","","","","","","","9104","","","mehpgn.las","mehpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_380[] = {"1487","NAD83 to NAD83(HARN) (14)","","","","United States (USA) - Michigan.","9613","","","","","","","","","9104","","","mihpgn.las","mihpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_381[] = {"1488","NAD83 to NAD83(HARN) (15)","","","","United States (USA) - Mississippi.","9613","","","","","","","","","9104","","","mshpgn.las","mshpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_382[] = {"1489","NAD83 to NAD83(HARN) (16)","","","","United States (USA) - Nebraska.","9613","","","","","","","","","9104","","","nbhpgn.las","nbhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_383[] = {"1490","NAD83 to NAD83(HARN) (17)","","","","United States (USA) - Connecticut; Massachusetts; New Hampshire; Rhode Island; Vermont.","9613","","","","","","","","","9104","","","nehpgn.las","nehpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positiv [...]
+datafile_rows_t trf_nonpolynomial_row_384[] = {"1491","NAD83 to NAD83(HARN) (18)","","","","United States (USA) - New Mexico.","9613","","","","","","","","","9104","","","nmhpgn.las","nmhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_385[] = {"1492","NAD83 to NAD83(HARN) (19)","","","","United States (USA) - New York.","9613","","","","","","","","","9104","","","nyhpgn.las","nyhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_386[] = {"1493","NAD83 to NAD83(HARN) (20)","","","","United States (USA) - North Dakota.","9613","","","","","","","","","9104","","","ndhpgn.las","ndhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_387[] = {"1494","NAD83 to NAD83(HARN) (21)","","","","United States (USA) - Oklahoma.","9613","","","","","","","","","9104","","","okhpgn.las","okhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_388[] = {"1495","NAD83 to NAD83(HARN) (22)","","","","United States (USA) - Puerto Rico and the Virgin Islands.","9613","","","","","","","","","9104","","","pvhpgn.las","pvhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_389[] = {"1496","NAD83 to NAD83(HARN) (23)","","","","United States (USA) - South Dakota.","9613","","","","","","","","","9104","","","sdhpgn.las","sdhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_390[] = {"1497","NAD83 to NAD83(HARN) (24)","","","","United States (USA) - Tennessee","9613","","","","","","","","","9104","","","tnhpgn.las","tnhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_391[] = {"1498","NAD83 to NAD83(HARN) (25)","","","","United States (USA) - Texas east of 100deg West.","9613","","","","","","","","","9104","","","ethpgn.las","ethpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_392[] = {"1499","NAD83 to NAD83(HARN) (26)","","","","United States (USA) - Texas west of 100deg West.","9613","","","","","","","","","9104","","","wthpgn.las","wthpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_393[] = {"1500","NAD83 to NAD83(HARN) (27)","","","","United States (USA) - Virginia.","9613","","","","","","","","","9104","","","vahpgn.las","vahpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_394[] = {"1501","NAD83 to NAD83(HARN) (28)","","","","United States (USA) - Oregan; Washington.","9613","","","","","","","","","9104","","","wohpgn.las","wohpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_395[] = {"1502","NAD83 to NAD83(HARN) (29)","","","","United States (USA) - Wisconsin.","9613","","","","","","","","","9104","","","wihpgn.las","wihpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_396[] = {"1503","NAD83 to NAD83(HARN) (30)","","","","United States (USA) - Wyoming.","9613","","","","","","","","","9104","","","wyhpgn.las","wyhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_397[] = {"1504","Cape to Hartbeesthoek94 (1)","","","","South Africa.","9603","-134.73","-110.92","-292.66","","","","","9001","","","","","","","1999-10-20 00:00:00","Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_398[] = {"1505","Hartbeesthoek94 to WGS 84 (1)","","","","South Africa.","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1999-10-20 00:00:00","EPSG","EPSG","For many purposes Hartbeesthoek94 datum can be considered to be coincident with WGS 84.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_399[] = {"1506","AGD66 to GDA94 (6)","","","","Australia - Tasmania.","9615","","","","","","","","","9104","","","tas_1098.gsb","","","1999-10-20 00:00:00","http://www.delm.tas.gov.au/osg/Geodetic_transform.htm","EPSG","0.1m accuracy. Input expects longitudes to be positive west; EPSG GeogCS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_400[] = {"1507","AGD66 to GDA94 (7)","","","","Australia - Northern Territory.","9615","","","","","","","","","9104","","","nt_0599.gsb","","","1999-10-20 00:00:00","http://www.anzlic.org.au/icsm/gdatm/chapter7.htm#high","EPSG","0.1m accuracy. Input expects longitudes to be positive west; EPSG GeogCS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_401[] = {"1508","CH1903 to WGS 84 (1)","","","","Liechtenstein; Switzerland.","9607","660.077","13.551","369.344","2.484","1.783","2.939","5.66","9001","9113","","9202","","","","1999-10-20 00:00:00","Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.","EPSG","Implemented in Bundesamt f�r Landestopographie programme GRANIT.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_402[] = {"1509","CH1903+ to CHTRF95 (1)","","","","Liechtenstein; Switzerland.","9603","674.374","15.056","405.346","","","","","9001","","","","","","","1999-10-20 00:00:00","Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_403[] = {"1510","CH1903 to WGS 84 (2)","","","","Liechtenstein; Switzerland.","9603","674.374","15.056","405.346","","","","","9001","","","","","","","1999-10-20 00:00:00","Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.","EPSG","These parameters are strictly between CH1903+ and CHTRF95 but are used from CH1903 as an approximation which is within the ac [...]
+datafile_rows_t trf_nonpolynomial_row_404[] = {"1511","CHTRF95 to WGS 84 (1)","","","","Liechtenstein; Switzerland.","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1999-10-20 00:00:00","EPSG","EPSG","For many purposes CHTRF95 can be considered to be coincident with WGS 84.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_405[] = {"1512","Rassadiran to WGS 84 (1)","","","","Iran - Taheri refinery site only.","9603","-133.63","-157.5","-158.62","","","","","9001","","","","","","","1999-10-20 00:00:00","Total-Fina","EPSG","Used only for terminal site.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_406[] = {"1513","FD58 to WGS 84 (1)","","","","Iran - Kangan district.","9603","-241.54","-163.64","396.06","","","","","9001","","","","","","","1999-10-20 00:00:00","Total-Fina","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_407[] = {"1514","ED50(ED77) to WGS 84 (1)","","","","Iran","9606","-110.33","-97.73","-119.85","0.3423","1.1634","0.2715","0.063","9001","9104","","9202","","","","1999-10-20 00:00:00","National Cartographic Centre of Iran","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_408[] = {"1515","NAD83 to WGS 84 (5)","","","","United States (USA)","9607","-0.991","1.9072","0.5129","-0.000000125033","-0.000000046785","-0.000000056529","0.0","9001","9101","","9202","","","","1999-11-05 00:00:00"," http://www.ngs.noaa.gov/CORS/Derivation.html","EPSG","Strictly between NAD83 and ITRF96(1997.0). Supersedes NAD83 to WGS 84 (4) (code 1308).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_409[] = {"1516","La Canoa to WGS 84 (1)","","","","Venezuela east - Delta Amacuro; Anzoategui; Bolivar; Monagas; Sucre states.","9603","-273.5","110.6","-357.9","","","","","9001","","","","","","","1999-11-05 00:00:00","Lagoven; Gonzalez Losano y Rodriguez; \"Determination de los Parametros de Transformacion para el Oriente del Pais\"; VII Venezuelan Geophysical Congress; September 1994.","EPSG","Also used for PSAD56 to WGS 84 transformations. Para [...]
+datafile_rows_t trf_nonpolynomial_row_410[] = {"10101","Alabama CS27 East zone","Alabama East","","","United States (USA) - Alabama - Counties east of 86d 37m West.","9807","30.3","-85.5","","","0.99996","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_411[] = {"10102","Alabama CS27 West zone","Alabama West","","","United States (USA) - Alabama - Counties east of 86d 37m West.","9807","30.0","-87.3","","","0.999933333","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_412[] = {"10131","Alabama CS83 East zone","Alabama East","","","United States (USA) - Alabama - Counties east of 86d 37m West.","9807","30.3","-85.5","","","0.99996","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_413[] = {"10132","Alabama CS83 West zone","Alabama West","","","United States (USA) - Alabama - Counties east of 86d 37m West.","9807","30.0","-87.3","","","0.999933333","600000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_414[] = {"10201","Arizona Coordinate System east zone","Arizona East","","","United States (USA) - Arizona - Apache; Cochise; Gila; Graham; Greenlee and Navajo counties; i.e. east of about 110d 45m West.","9807","31.0","-110.1","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_415[] = {"10202","Arizona Coordinate System Central zone","Arizona Central","","","United States (USA) - Arizona - Coconino; Maricopa; Pima; Pinal; Santa Cruz and Yavapai counties; i.e between about 110d 45m & 113d 20m west","9807","31.0","-111.55","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_416[] = {"10203","Arizona Coordinate System west zone","Arizona West","","","United States (USA) - Arizona - La Paz; Mohave and Yuma counties; i.e west of about 113d 20m","9807","31.0","-113.45","","","0.999933333","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_417[] = {"10231","Arizona CS83 east zone","Arizona East","","","United States (USA) - Arizona - counties east of 110d 45m West","9807","31.0","-110.1","","","0.9999","213360.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","State law defines origin in International feet. FE = 700000ft.","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_418[] = {"10232","Arizona CS83 Central zone","Arizona Central","","","United States (USA) - Arizona - Coconino; Maricopa; Pima; Pinal; Santa Cruz and Yavapai counties; i.e between about 110d 45m & 113d 20m west","9807","31.0","-111.55","","","0.9999","213360.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","State law defines origin in International feet. FE = 700000ft.","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_419[] = {"10233","Arizona CS83 west zone","Arizona West","","","United States (USA) - Arizona - La Paz; Mohave and Yuma counties; i.e west of about 113d 20m","9807","31.0","-113.45","","","0.999933333","213360.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","State law defines origin in International feet. FE = 700000ft.","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_420[] = {"10301","Arkansas CS27 North","Arkansas North","","","United States (USA) - Arkansas - counties north of 34d 50m North.","9802","34.2","-92.0","36.14","34.56","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_421[] = {"10302","Arkansas CS27 South","Arkansas South","","","United States (USA) - Arkansas - counties south of 34d 50m North.","9802","32.4","-92.0","34.46","33.18","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_422[] = {"10331","Arkansas CS83 North zone","Arkansas North","","","United States (USA) - Arkansas - counties north of 34d 50m North.","9802","34.2","-92.0","36.14","34.56","","400000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_423[] = {"10332","Arkansas CS83 South zone","Arkansas South","","","United States (USA) - Arkansas - counties south of 34d 50m North.","9802","32.4","-92.0","34.46","33.18","","400000.0","400000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_424[] = {"10401","California CS27 zone I","California zone I","","","United States (USA) - California - counties north of 40deg North.","9802","39.2","-122.0","41.4","40.0","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_425[] = {"10402","California CS27 zone II","California zone II","","","United States (USA) - California - counties between 40d & 38d 15m North.","9802","37.4","-122.0","39.5","38.2","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_426[] = {"10403","California CS27 zone III","California zone III","","","United States (USA) - California - counties between 38d 15m & 37d North.","9802","36.3","-120.3","38.26","37.04","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_427[] = {"10404","California CS27 zone IV","California zone IV","","","United States (USA) - California - counties between 37d & 35d 30m North.","9802","35.2","-119.0","37.15","36.0","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_428[] = {"10405","California CS27 zone V","California zone V","","","United States (USA) - California - counties between 35d 50m & 34d North.","9802","33.3","-118.0","35.28","34.02","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_429[] = {"10406","California CS27 zone VI","California zone VI","","","United States (USA) - California - counties south of 34deg North.","9802","32.1","-116.15","33.53","32.47","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_430[] = {"10407","California CS27 zone VII","California zone VII","","","United States (USA) - California - Los Angeles.","9802","34.08","-118.2","34.25","33.52","","4186692.58","416926.74","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_431[] = {"10431","California CS83 zone 1","California zone 1","","","United States (USA) - California - counties north of 40deg North.","9802","39.2","-122.0","41.4","40.0","","2000000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_432[] = {"10432","California CS83 zone 2","California zone 2","","","United States (USA) - California - counties between 40d & 38d 15m North.","9802","37.4","-122.0","39.5","38.2","","2000000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_433[] = {"10433","California CS83 zone 3","California zone 3","","","United States (USA) - California - counties between 38d 15m & 37d North.","9802","36.3","-120.3","38.26","37.04","","2000000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_434[] = {"10434","California CS83 zone 4","California zone 4","","","United States (USA) - California - counties between 37d & 35d 30m North.","9802","35.2","-119.0","37.15","36.0","","2000000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_435[] = {"10435","California CS83 zone 5","California zone 5","","","United States (USA) - California - counties between 35d 50m & 34d North.","9802","33.3","-118.0","35.28","34.02","","2000000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_436[] = {"10436","California CS83 zone 6","California zone 6","","","United States (USA) - California - counties south of 34deg North.","9802","32.1","-116.15","33.53","32.47","","2000000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_437[] = {"10501","Colorado CS27 North zone","Colorado North","","","United States (USA) - Colorado - counties north of 39d 50m North.","9802","39.2","-105.3","39.43","40.47","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_438[] = {"10502","Colorado CS27 Central zone","Colorado Central","","","United States (USA) - Colorado - counties between 39d 50m & 38d 30m North.","9802","37.5","-105.3","39.45","38.27","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_439[] = {"10503","Colorado CS27 South zone","Colorado South","","","United States (USA) - Colorado - counties south of 38d 30m North.","9802","36.4","-105.3","38.26","37.14","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_440[] = {"10531","Colorado CS83 North zone","Colorado North","","","United States (USA) - Colorado - counties north of 39d 50m North.","9802","39.2","-105.3","40.47","39.43","","914401.8289","304800.6096","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_441[] = {"10532","Colorado CS83 Central zone","Colorado Central","","","United States (USA) - Colorado - counties between 39d 50m & 38d 30m North.","9802","37.5","-105.3","39.45","38.27","","914401.8289","304800.6096","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_442[] = {"10533","Colorado CS83 South zone","Colorado South","","","United States (USA) - Colorado - counties south of 38d 30m North.","9802","36.4","-105.3","38.26","37.14","","914401.8289","304800.6096","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_443[] = {"10600","Connecticut CS27","Connecticut","","","United States (USA) - Connecticut.","9802","40.5","-72.45","41.52","41.12","","600000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_444[] = {"10630","Connecticut CS83","Connecticut","","","United States (USA) - Connecticut.","9802","40.5","-72.45","41.52","41.12","","304800.6096","152400.3048","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_445[] = {"10700","Delaware CS27","Delaware","","","United States (USA) - Delaware.","9807","38.0","-75.25","","","0.999995","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_446[] = {"10730","Delaware CS83","Delaware","","","United States (USA) - Delaware.","9807","38.0","-75.25","","","0.999995","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_447[] = {"10901","Florida CS27 East zone","Florida East","","","United States (USA) - Florida - counties east of 81d 45m West.","9807","24.2","-81.0","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_448[] = {"10902","Florida CS27 West zone","Florida West","","","United States (USA) - Florida - counties west of 81d 45m West & south of 29d 30m North.","9807","24.2","-82.0","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_449[] = {"10903","Florida CS27 North zone","Florida North","","","United States (USA) - Florida - north of 29d 30m North & west of 82d West.","9802","29.0","-84.3","30.45","29.35","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_450[] = {"10931","Florida CS83 East zone","Florida East","","","United States (USA) - Florida - counties east of 81d 45m West.","9807","24.2","-81.0","","","0.999941177","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_451[] = {"10932","Florida CS83 West zone","Florida West","","","United States (USA) - Florida - counties west of 81d 45m West & south of 29d 30m North.","9807","24.2","-82.0","","","0.999941177","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_452[] = {"10933","Florida CS83 North zone","Florida North","","","United States (USA) - Florida - north of 29d 30m North & west of 82d West.","9802","29.0","-84.3","30.45","29.35","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_453[] = {"11001","Georgia CS27 East zone","Georgia East","","","United States (USA) - Georgia - counties east of 83d 15m West.","9807","30.0","-82.1","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_454[] = {"11002","Georgia CS27 West zone","Georgia West","","","United States (USA) - Georgia - counties west of 83d 15m West.","9807","30.0","-84.1","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_455[] = {"11031","Georgia CS83 East zone","Georgia East","","","United States (USA) - Georgia - counties east of 83d 15m West.","9807","30.0","-82.1","","","0.9999","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_456[] = {"11032","Georgia CS83 West zone","Georgia West","","","United States (USA) - Georgia - counties west of 83d 15m West.","9807","30.0","-84.1","","","0.9999","700000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_457[] = {"11101","Idaho CS27 East zone","Idaho East","","","United States (USA) - Idaho - counties east of 113d West.","9807","41.4","-112.1","","","0.999947368","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_458[] = {"11102","Idaho CS27 Central zone","Idaho Central","","","United States (USA) - Idaho - counties between 113d & 115d West.","9807","41.4","-114.0","","","0.999947368","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_459[] = {"11103","Idaho CS27 West zone","Idaho West","","","United States (USA) - Idaho - counties west of 115d West.","9807","41.4","-115.45","","","0.999933333","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_460[] = {"11131","Idaho CS83 East zone","Idaho East","","","United States (USA) - Idaho - counties east of 113d West.","9807","41.4","-112.1","","","0.999947368","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_461[] = {"11132","Idaho CS83 Central zone","Idaho Central","","","United States (USA) - Idaho - counties between 113d & 115d West.","9807","41.4","-114.0","","","0.999947368","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_462[] = {"11133","Idaho CS83 West zone","Idaho West","","","United States (USA) - Idaho - counties west of 115d West.","9807","41.4","-115.45","","","0.999933333","800000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_463[] = {"11201","Illinois CS27 East zone","Illinois East","","","United States (USA) - Illinois - counties east of 89d 05m West.","9807","36.4","-88.2","","","0.999975","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_464[] = {"11202","Illinois CS27 West zone","Illinois West","","","United States (USA) - Illinois - counties west of 89d 05m West.","9807","36.4","-90.1","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_465[] = {"11231","Illinois CS83 East zone","Illinois East","","","United States (USA) - Illinois - counties east of 89d 05m West.","9807","36.4","-88.2","","","0.999975","300000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_466[] = {"11232","Illinois CS83 West zone","Illinois West","","","United States (USA) - Illinois - counties west of 89d 05m West.","9807","36.4","-90.1","","","0.999941177","700000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_467[] = {"11301","Indiana CS27 East zone","Indiana East","","","United States (USA) - Indiana - counties east of 86d 25m West.","9807","37.3","-85.4","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_468[] = {"11302","Indiana CS27 West zone","Indiana West","","","United States (USA) - Indiana - counties west of 86d 25m West.","9807","37.3","-87.05","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_469[] = {"11331","Indiana CS83 East zone","Indiana East","","","United States (USA) - Indiana - counties east of 86d 25m West.","9807","37.3","-85.4","","","0.999966667","100000.0","250000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_470[] = {"11332","Indiana CS83 West zone","Indiana West","","","United States (USA) - Indiana - counties west of 86d 25m West.","9807","37.3","-87.05","","","0.999966667","900000.0","250000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_471[] = {"11401","Iowa CS27 North zone","Iowa North","","","United States (USA) - Iowa - counties north of 42deg North.","9802","41.3","-93.3","43.16","42.04","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_472[] = {"11402","Iowa CS27 South zone","Iowa South","","","United States (USA) - Iowa - counties south of 42deg North.","9802","40.0","-93.3","41.47","40.37","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_473[] = {"11431","Iowa CS83 North zone","Iowa North","","","United States (USA) - Iowa - counties north of 42deg North.","9802","41.3","-93.3","43.16","42.04","","1500000.0","1000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_474[] = {"11432","Iowa CS83 South zone","Iowa South","","","United States (USA) - Iowa - counties south of 42deg North.","9802","40.0","-93.3","41.47","40.37","","500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_475[] = {"11501","Kansas CS27 North zone","Kansas North","","","United States (USA) - Kansas - counties north of 38d 45m North.","9802","38.2","-98.0","39.47","38.43","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_476[] = {"11502","Kansas CS27 South zone","Kansas South","","","United States (USA) - Kansas - counties south of 38d 45m North.","9802","36.4","-98.3","38.34","37.16","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_477[] = {"11531","Kansas CS83 North zone","Kansas North","","","United States (USA) - Kansas - counties north of 38d 45m North.","9802","38.2","-98.0","39.47","38.43","","400000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_478[] = {"11532","Kansas CS83 South zone","Kansas South","","","United States (USA) - Kansas - counties south of 38d 45m North.","9802","36.4","-98.3","38.34","37.16","","400000.0","400000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_479[] = {"11601","Kentucky CS27 North zone","Kentucky North","","","United States (USA) - Kentucky - counties north of 37d 55m North.","9802","37.3","-84.15","37.58","38.58","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_480[] = {"11602","Kentucky CS27 South zone","Kentucky South","","","United States (USA) - Kentucky - counties south of 37d 55m North.","9802","36.2","-85.45","36.44","37.56","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_481[] = {"11631","Kentucky CS83 North zone","Kentucky North","","","United States (USA) - Kentucky - counties north of 37d 55m North.","9802","37.3","-84.15","37.58","37.58","","500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_482[] = {"11632","Kentucky CS83 South zone","Kentucky South","","","United States (USA) - Kentucky - counties south of 37d 55m North.","9802","36.2","-85.45","37.56","36.44","","500000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_483[] = {"11701","Louisiana CS27 North zone","Louisiana North","","","United States (USA) - Louisiana - counties north of 30d 55m North.","9802","30.4","-92.3","31.1","32.4","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_484[] = {"11702","Louisiana CS27 South zone","Louisiana South","","","United States (USA) - Louisiana - counties south of 30d 55m North. Also Gulf of Mexico LA shelf.","9802","28.4","-91.2","29.18","30.42","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_485[] = {"11731","Louisiana CS83 North zone","Louisiana North","","","United States (USA) - Louisiana - counties north of 30d 55m North.","9802","30.3","-92.3","32.4","31.1","","1000000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_486[] = {"11732","Louisiana CS83 South zone","Louisiana South","","","United States (USA) - Louisiana - counties south of 30d 55m North.","9802","28.3","-91.2","30.42","29.18","","1000000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_487[] = {"11801","Maine CS27 East zone","Maine East","","","United States (USA) - Maine - counties east of 69d 30m West.","9807","43.5","-68.3","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_488[] = {"11802","Maine CS27 West zone","Maine West","","","United States (USA) - Maine - counties west of 69d 30m West.","9807","42.5","-70.1","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_489[] = {"11831","Maine CS83 East zone","Maine East","","","United States (USA) - Maine - counties east of 69d 30m West.","9807","43.4","-68.3","","","0.9999","300000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_490[] = {"11832","Maine CS83 West zone","Maine West","","","United States (USA) - Maine - counties west of 69d 30m West.","9807","42.5","-70.1","","","0.999966667","900000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_491[] = {"11900","Maryland CS27","Maryland","","","United States (USA) - Maryland.","9802","37.5","-77.0","38.18","39.27","","800000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_492[] = {"11930","Maryland CS83","Maryland","","","United States (USA) - Maryland.","9802","37.4","-77.0","39.27","38.18","","400000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_493[] = {"12001","Massachusetts CS27 Mainland zone","Massachusetts Mainland","","","United States (USA) - Massachusetts onshore.","9802","41.0","-71.3","41.43","42.41","","600000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_494[] = {"12002","Massachusetts CS27 Island zone","Massachusetts Island","","","United States (USA) - Massachusetts islands.","9802","41.0","-70.3","41.17","41.29","","200000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_495[] = {"12031","Massachusetts CS83 Mainland zone","Massachusetts Mainland","","","United States (USA) - Massachusetts onshore.","9802","41.0","-71.3","42.41","41.43","","200000.0","750000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_496[] = {"12032","Massachusetts CS83 Island zone","Massachusetts Island","","","United States (USA) - Massachusetts islands.","9802","41.0","-70.3","41.29","41.17","","500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_497[] = {"12101","Michigan State Plane East zone","Michigan East","","","United States (USA) - Michigan.","9807","41.3","-83.4","","","0.999942857","500000.0","0.0","9003","9110","8901","","","","","1998-11-11 00:00:00","USGS Professional Paper #1395","EPSG","Obsolete. Superseded by north central and south zones.","95.30 96.29 98.22",NULL};
+datafile_rows_t trf_nonpolynomial_row_498[] = {"12102","Michigan State Plane Old Central zone","Michigan Old Central","","","United States (USA) - Michigan.","9807","41.3","-85.45","","","0.999909091","500000.0","0.0","9003","9110","8901","","","","","1998-11-11 00:00:00","USGS Professional Paper #1395","EPSG","Obsolete. Superseded by north central and south zones.","95.30 96.29 98.22",NULL};
+datafile_rows_t trf_nonpolynomial_row_499[] = {"12103","Michigan State Plane West zone","Michigan West","","","United States (USA) - Michigan.","9807","41.3","-88.45","","","0.999909091","500000.0","0.0","9003","9110","8901","","","","","1998-11-11 00:00:00","USGS Professional Paper #1395","EPSG","Obsolete. Superseded by north central and south zones.","95.30 96.29 98.22",NULL};
+datafile_rows_t trf_nonpolynomial_row_500[] = {"12111","Michigan CS27 North zone","Michigan North","","","United States (USA) - Michigan - counties north of 45d 45m North.","9802","44.47","-87.0","45.29","47.05","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.28 96.29 98.22 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_501[] = {"12112","Michigan CS27 Central zone","Michigan Central","","","United States (USA) - Michigan - counties between 45d 45m & 43d 55m North.","9802","43.19","-84.2","44.11","45.42","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.28 96.29 98.22 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_502[] = {"12113","Michigan CS27 South zone","Michigan South","","","United States (USA) - Michigan - counties south of 43d 55m North.","9802","41.3","-84.2","42.06","43.4","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.28 96.29 98.22 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_503[] = {"12141","Michigan CS83 North zone","Michigan North","","","United States (USA) - Michigan - counties north of 45d 45m North.","9802","44.47","-87.0","47.05","45.29","","8000000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_504[] = {"12142","Michigan CS83 Central zone","Michigan Central","","","United States (USA) - Michigan - counties between 45d 45m & 43d 55m North.","9802","43.19","-84.22","45.42","44.11","","6000000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_505[] = {"12143","Michigan CS83 South zone","Michigan South","","","United States (USA) - Michigan - counties south of 43d 55m North.","9802","41.3","-84.22","43.4","42.06","","4000000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_506[] = {"12201","Minnesota CS27 North zone","Minnesota North","","","United States (USA) - Minnesota - counties north of 47d 10m North.","9802","46.3","-93.06","47.02","48.38","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_507[] = {"12202","Minnesota CS27 Central zone","Minnesota Central","","","United States (USA) - Minnesota - counties between 47d 10m & 45d 30m North.","9802","45.0","-94.15","45.37","47.03","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_508[] = {"12203","Minnesota CS27 South zone","Minnesota South","","","United States (USA) - Minnesota - counties south of 45d 30m North.","9802","43.0","-94.0","43.47","45.13","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_509[] = {"12231","Minnesota CS83 North zone","Minnesota North","","","United States (USA) - Minnesota - counties north of 47d 10m North.","9802","46.3","-93.06","48.38","47.02","","800000.0","100000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_510[] = {"12232","Minnesota CS83 Central zone","Minnesota Central","","","United States (USA) - Minnesota - counties between 47d 10m & 45d 30m North.","9802","45.0","-94.15","47.03","45.37","","800000.0","100000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_511[] = {"12233","Minnesota CS83 South zone","Minnesota South","","","United States (USA) - Minnesota - counties south of 45d 30m North.","9802","43.0","-94.0","45.13","43.47","","800000.0","100000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_512[] = {"12301","Mississippi CS27 East zone","Mississippi East","","","United States (USA) - Mississippi - counties east of 89d 40m West.","9807","29.4","-88.5","","","0.99996","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_513[] = {"12302","Mississippi CS27 West zone","Mississippi West","","","United States (USA) - Mississippi - counties west of 89d 40m West.","9807","30.3","-90.2","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_514[] = {"12331","Mississippi CS83 East zone","Mississippi East","","","United States (USA) - Mississippi - counties east of 89d 40m West.","9807","29.3","-88.5","","","0.99995","300000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_515[] = {"12332","Mississippi CS83 West zone","Mississippi West","","","United States (USA) - Mississippi - counties west of 89d 40m West.","9807","29.3","-90.2","","","0.99995","700000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_516[] = {"12401","Missouri CS27 East zone","Missouri East","","","United States (USA) - Missouri - counties east of 91d 45m West.","9807","35.5","-90.3","","","0.999933333","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.18 95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_517[] = {"12402","Missouri CS27 Central zone","Missouri Central","","","United States (USA) - Missouri - counties between 91d 45m & 93d 35m West.","9807","35.5","-92.3","","","0.999933333","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_518[] = {"12403","Missouri CS27 West zone","Missouri West","","","United States (USA) - Missouri - counties west of 93d 35m West.","9807","36.1","-94.3","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_519[] = {"12431","Missouri CS83 East zone","Missouri East","","","United States (USA) - Missouri - counties east of 91d 45m West..","9807","35.5","-90.3","","","0.999933333","250000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_520[] = {"12432","Missouri CS83 Central zone","Missouri Central","","","United States (USA) - Missouri - counties between 91d 45m & 93d 35m West","9807","35.5","-92.3","","","0.999933333","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_521[] = {"12433","Missouri CS83 West zone","Missouri West","","","United States (USA) - Missouri - counties west of 93d 35m West.","9807","36.1","-94.3","","","0.999941177","850000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_522[] = {"12501","Montana CS27 North zone","Montana North","","","United States (USA) - Montana - counties north of 47d 50m North.","9802","47.0","-109.3","48.43","47.51","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_523[] = {"12502","Montana CS27 Central zone","Montana Central","","","United States (USA) - Montana - counties between 47d 50m & 46d 40m North.","9802","45.5","-109.3","47.53","46.27","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_524[] = {"12503","Montana CS27 South zone","Montana South","","","United States (USA) - Montana - counties south of 46d 40m North.","9802","44.0","-109.3","46.24","44.52","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_525[] = {"12530","Montana CS83","Montana","","","United States (USA) - Montana.","9802","44.15","-109.3","49.0","45.0","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_526[] = {"12601","Nebraska CS27 North zone","Nebraska North","","","United States - Nebraska -Antelope; Blaine; Box Butte; Boyd; Brown; Burt; Cedar; Cherry; Cuming; Dakota; Dawes; Dixon; Garfield; Grant; Holt; Hooker; Keya Paha; Knox; Loup; Madison; Pierce; Rock; Sheridan; Sioux; Stanton; Thomas; Thurston; Wayne; Wheeler","9802","41.2","-100.0","41.51","42.49","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professio [...]
+datafile_rows_t trf_nonpolynomial_row_527[] = {"12602","Nebraska CS27 South zone","Nebraska South","","","United States (USA) - Nebraska - counties south of and including Scotts Bluff; Morrill; Garden; Arthur; McPherson; Logan; Custer; Valley; Greeley; Boome, Platte; Colfax; Dodge; Washington.","9802","39.4","-99.3","40.17","41.43","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_528[] = {"12630","Nebraska CS83","Nebraska","","","United States (USA) - Nebraska.","9802","39.5","-100.0","43.0","40.0","","500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_529[] = {"12701","Nevada CS27 East zone","Nevada East","","","United States (USA) - Nevada - counties east of 116d West & Eureka county.","9807","34.45","-115.35","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_530[] = {"12702","Nevada CS27 Central zone","Nevada Central","","","United States (USA) - Nevada - Lander & Nye counties.","9807","34.45","-116.4","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_531[] = {"12703","Nevada CS27 West zone","Nevada West","","","United States (USA) - Nevada - counties west of 117d 15m West.","9807","34.45","-118.35","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_532[] = {"12731","Nevada CS83 East zone","Nevada East","","","United States (USA) - Nevada - counties east of 116d West & Eureka county.","9807","34.45","-115.35","","","0.9999","200000.0","8000000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_533[] = {"12732","Nevada CS83 Central zone","Nevada Central","","","United States (USA) - Nevada - Lander & Nye counties.","9807","34.45","-116.4","","","0.9999","500000.0","6000000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_534[] = {"12733","Nevada CS83 West zone","Nevada West","","","United States (USA) - Nevada - counties west of 117d 15m West.","9807","34.45","-118.35","","","0.9999","800000.0","4000000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_535[] = {"12800","New Hampshire CS27","New Hampshire","","","United States (USA) - New Hampshire.","9807","42.3","-71.4","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_536[] = {"12830","New Hampshire CS83","New Hampshire","","","United States (USA) - New Hampshire.","9807","42.3","-71.4","","","0.999966667","300000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_537[] = {"12900","New Jersey CS27","New Jersey","","","United States (USA) - New Jersey.","9807","38.5","-74.4","","","0.999975","2000000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_538[] = {"12930","New Jersey CS83","New Jersey","","","United States (USA) - New Jersey.","9807","38.5","-74.3","","","0.9999","150000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_539[] = {"13001","New Mexico CS27 East zone","New Mexico East","","","United States (USA) - New Mexico - counties east of 105d West.","9807","31.0","-104.2","","","0.999909091","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_540[] = {"13002","New Mexico CS27 Central zone","New Mexico Central","","","United States (USA) - New Mexico - counties between 105d & 107d 15m West.","9807","31.0","-106.15","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_541[] = {"13003","New Mexico CS27 West zone","New Mexico West","","","United States (USA) - New Mexico - counties west of 107d 15m West.","9807","31.0","-107.5","","","0.999916667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_542[] = {"13031","New Mexico CS83 East zone","New Mexico East","","","United States (USA) - New Mexico - counties east of 105d West.","9807","31.0","-104.2","","","0.999909091","165000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_543[] = {"13032","New Mexico CS83 Central zone","New Mexico Central","","","United States (USA) - New Mexico - counties between 105d & 107d 15m West.","9807","31.0","-106.15","","","0.9999","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_544[] = {"13033","New Mexico CS83 West zone","New Mexico West","","","United States (USA) - New Mexico - counties west of 107d 15m West.","9807","31.0","-107.5","","","0.999916667","830000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_545[] = {"13101","New York CS27 East zone","New York East","","","United States (USA) - New York - counties east of 75d 15m West excluding Long Island.","9807","40.0","-74.2","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.18 95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_546[] = {"13102","New York CS27 Central zone","New York Central","","","United States (USA) - New York - counties between 75d 15m & 77d 30m West.","9807","40.0","-76.35","","","0.9999375","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_547[] = {"13103","New York CS27 West zone","New York West","","","United States (USA) - New York - counties west of 77d 30m West.","9807","40.0","-78.35","","","0.9999375","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_548[] = {"13104","New York CS27 Long Island zone","New York Long Island","","","United States (USA) - New York - Long Island.","9802","40.3","-74.0","41.02","40.4","","1000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_549[] = {"13131","New York CS83 East zone","New York East","","","United States (USA) - New York - counties east of 75d 15m West excluding Long Island.","9807","38.5","-74.3","","","0.9999","150000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_550[] = {"13132","New York CS83 Central zone","New York Central","","","United States (USA) - New York - counties between 75d 15m & 77d 30m West.","9807","40.0","-76.35","","","0.9999375","250000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_551[] = {"13133","New York CS83 West zone","New York West","","","United States (USA) - New York - counties west of 77d 30m West.","9807","40.0","-78.35","","","0.9999375","350000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_552[] = {"13134","New York CS83 Long Island zone","New York Long Island","","","United States (USA) - New York - Long Island.","9802","40.1","-74.0","41.02","40.4","","300000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_553[] = {"13200","North Carolina CS27","North Carolina","","","United States (USA) - North Carolina.","9802","33.45","-79.0","34.2","36.1","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_554[] = {"13230","North Carolina CS83","North Carolina","","","United States (USA) - North Carolina.","9802","33.45","-79.0","36.1","34.2","","609601.22","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_555[] = {"13301","North Dakota CS27 North zone","North Dakota North","","","United States (USA) - North Dakota - counties north of 47d 25m North.","9802","47.0","-100.3","47.26","48.44","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_556[] = {"13302","North Dakota CS27 South zone","North Dakota South","","","United States (USA) - North Dakota - counties south of 47d 25m North.","9802","45.4","-100.3","46.11","47.29","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_557[] = {"13331","North Dakota CS83 North zone","North Dakota North","","","United States (USA) - North Dakota - counties north of 47d 25m North.","9802","47.0","-100.3","48.44","47.26","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_558[] = {"13332","North Dakota CS83 South zone","North Dakota South","","","United States (USA) - North Dakota - counties south of 47d 25m North.","9802","45.4","-100.3","47.29","46.11","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_559[] = {"13401","Ohio CS27 North zone","Ohio North","","","United States (USA) - Ohio - counties north of 40d 15m North.","9802","39.4","-82.3","40.26","41.42","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_560[] = {"13402","Ohio CS27 South zone","Ohio South","","","United States (USA) - Ohio - counties south of 40d 15m North.","9802","38.0","-82.3","38.44","40.02","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_561[] = {"13431","Ohio CS83 North zone","Ohio North","","","United States (USA) - Ohio - counties north of 40d 15m North.","9802","39.4","-82.3","41.42","40.26","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_562[] = {"13432","Ohio CS83 South zone","Ohio South","","","United States (USA) - Ohio - counties south of 40d 15m North.","9802","38.0","-82.3","40.02","38.44","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_563[] = {"13501","Oklahoma CS27 North zone","Oklahoma North","","","United States (USA) - Oklahoma - counties north of 35d 20m North.","9802","35.0","-98.0","35.34","36.46","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_564[] = {"13502","Oklahoma CS27 South zone","Oklahoma South","","","United States (USA) - Oklahoma - counties south of 35d 20m North.","9802","33.2","-98.0","33.56","35.14","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_565[] = {"13531","Oklahoma CS83 North zone","Oklahoma North","","","United States (USA) - Oklahoma - counties north of 35d 20m North.","9802","35.0","-98.0","36.46","35.34","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_566[] = {"13532","Oklahoma CS83 South zone","Oklahoma South","","","United States (USA) - Oklahoma - counties south of 35d 20m North.","9802","33.2","-98.0","35.14","33.56","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_567[] = {"13601","Oregon CS27 North zone","Oregon North","","","United States (USA) - Oregon - counties north of 44d 15m North.","9802","43.4","-120.3","44.2","46.0","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_568[] = {"13602","Oregon CS27 South zone","Oregon South","","","United States (USA) - Oregon - counties south of 44d 15m North.","9802","41.4","-120.3","42.2","44.0","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_569[] = {"13631","Oregon CS83 North zone","Oregon North","","","United States (USA) - Oregon - counties north of 44d 15m North.","9802","43.4","-120.3","46.0","44.2","","2500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_570[] = {"13632","Oregon CS83 South zone","Oregon South","","","United States (USA) - Oregon - counties south of 44d 15m North.","9802","41.4","-120.3","44.0","42.2","","1500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_571[] = {"13701","Pennsylvania CS27 North zone","Pennsylvania North","","","United States (USA) - Pennsylvania - counties north of 40d 50m North.","9802","40.1","-77.45","40.53","41.57","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_572[] = {"13702","Pennsylvania CS27 South zone","Pennsylvania South","","","United States (USA) - Pennsylvania - counties south of 40d 50m North.","9802","39.2","-77.45","39.56","40.48","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_573[] = {"13731","Pennsylvania CS83 North zone","Pennsylvania North","","","United States (USA) - Pennsylvania - counties north of 40d 50m North.","9802","40.1","-77.45","41.57","40.53","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_574[] = {"13732","Pennsylvania CS83 South zone","Pennsylvania South","","","United States (USA) - Pennsylvania - counties south of 40d 50m North.","9802","39.2","-77.45","40.58","39.56","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_575[] = {"13800","Rhode Island CS27","Rhode Island","","","United States (USA) - Rhode Island.","9807","41.05","-71.3","","","0.9999938","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_576[] = {"13830","Rhode Island CS83","Rhode Island","","","United States (USA) - Rhode Island.","9807","41.05","-71.3","","","0.99999375","100000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_577[] = {"13901","South Carolina CS27 North zone","South Carolina North","","","United States (USA) - South Carolina counties north of and including Edgefield; Saluda; Lexington; Calhoun; Sumter; Florence; Marion & Horry.","9802","33.0","-81.0","33.46","34.58","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_578[] = {"13902","South Carolina CS27 South zone","South Carolina South","","","United States (USA) - South Carolina - Aiken; Allendale; Bamberg; Barnwell; Beaufort; Berkeley; Charleston; Clarendon; Colleton; Dorchester; Georgetown; Hampton; Jasper; Orangeburg & Williamsburg counties.","9802","31.5","-81.0","32.2","33.4","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 [...]
+datafile_rows_t trf_nonpolynomial_row_579[] = {"13930","South Carolina CS83","South Carolina","","","United States (USA) - South Carolina.","9802","31.5","-81.0","34.5","32.3","","609600.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_580[] = {"14001","South Dakota CS27 North zone","South Dakota North","","","United States (USA) - South Dakota - counties north of 44d 20m North.","9802","43.5","-100.0","44.25","45.41","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_581[] = {"14002","South Dakota CS27 South zone","South Dakota South","","","United States (USA) - South Dakota - counties south of 44d 20m North.","9802","42.2","-100.2","42.5","44.24","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_582[] = {"14031","South Dakota CS83 North zone","South Dakota North","","","United States (USA) - South Dakota - counties north of 44d 20m North.","9802","43.5","-100.0","45.41","44.25","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_583[] = {"14032","South Dakota CS83 South zone","South Dakota South","","","United States (USA) - South Dakota - counties south of 44d 20m North.","9802","42.2","-100.2","44.24","42.5","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_584[] = {"14100","Tennessee CS27","Tennessee","","","United States (USA) - Tennessee.","9802","34.4","-86.0","35.15","36.25","","100000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_585[] = {"14130","Tennessee CS83","Tennessee","","","United States (USA) - Tennessee.","9802","34.2","-86.0","36.25","35.15","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_586[] = {"14201","Texas CS27 North zone","Texas North","","","United States (USA) - Texas - counties north of 34d 20m North.","9802","34.0","-101.3","34.39","36.11","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_587[] = {"14202","Texas CS27 North Central zone","Texas North Central","","","United States (USA) - Texas - counties between 34d 20m & 32deg North.","9802","31.4","-97.3","32.08","33.58","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_588[] = {"14203","Texas CS27 Central zone","Texas Central","","","United States (USA) - Texas - counties between 32deg & 30d 10m North.","9802","29.4","-100.2","30.07","31.53","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_589[] = {"14204","Texas CS27 South Central zone","Texas South Central","","","United States (USA) - Texas - counties between 30d 10m & 28d 05m North.","9802","27.5","-99.0","28.23","30.17","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_590[] = {"14205","Texas CS27 South zone","Texas South","","","United States (USA) - Texas - counties south of 28d 05m North.","9802","25.4","-98.3","26.1","27.5","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_591[] = {"14231","Texas CS83 North zone","Texas North","","","United States (USA) - Texas - counties north of 34d 20m North.","9802","34.0","-101.3","36.11","34.39","","200000.0","1000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_592[] = {"14232","Texas CS83 North Central zone","Texas North Central","","","United States (USA) - Texas - counties between 34d 20m & 32deg North.","9802","31.4","-98.3","33.58","32.08","","600000.0","2000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_593[] = {"14233","Texas CS83 Central zone","Texas Central","","","United States (USA) - Texas - counties between 32deg & 30d 10m North.","9802","29.4","-100.2","31.53","30.07","","700000.0","3000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_594[] = {"14234","Texas CS83 South Central zone","Texas South Central","","","United States (USA) - Texas - counties between 30d 10m & 28d 05m North.","9802","27.5","-99.0","30.17","28.23","","600000.0","4000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_595[] = {"14235","Texas CS83 South zone","Texas South","","","United States (USA) - Texas - counties south of 28d 05m North.","9802","25.4","-98.3","27.5","26.1","","300000.0","5000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_596[] = {"14301","Utah CS27 North zone","Utah North","","","United States (USA) - Utah - counties north of 40d 50m North.","9802","40.2","-111.3","40.43","41.47","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_597[] = {"14302","Utah CS27 Central zone","Utah Central","","","United States (USA) - Utah - counties between 40d 50m & 38d 30m North.","9802","38.2","-111.3","39.01","40.39","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_598[] = {"14303","Utah CS27 South zone","Utah South","","","United States (USA) - Utah - counties south of 38d 30m North.","9802","36.4","-111.3","37.13","38.21","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_599[] = {"14331","Utah CS83 North zone","Utah North","","","United States (USA) - Utah - counties north of 40d 50m North.","9802","40.2","-111.3","41.47","40.43","","500000.0","1000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_600[] = {"14332","Utah CS83 Central zone","Utah Central","","","United States (USA) - Utah - counties between 40d 50m & 38d 30m North.","9802","38.2","-111.3","40.39","39.01","","500000.0","2000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_601[] = {"14333","Utah CS83 South zone","Utah South","","","United States (USA) - Utah - counties south of 38d 30m North.","9802","36.4","-111.3","38.21","37.13","","500000.0","3000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_602[] = {"14400","Vermont CS27","Vermont","","","United States (USA) - Vermont.","9807","42.3","-72.3","","","0.999964286","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_603[] = {"14430","Vermont CS83","Vermont","","","United States (USA) - Vermont.","9807","42.3","-72.3","","","0.999964286","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_604[] = {"14501","Virginia CS27 North zone","Virginia North","","","United States (USA) - Virginia - counties north of 38d 05m North.","9802","37.4","-78.3","38.02","39.12","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_605[] = {"14502","Virginia CS27 South zone","Virginia South","","","United States (USA) - Virginia - counties south of 38d 05m North.","9802","36.2","-78.3","36.46","37.58","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_606[] = {"14531","Virginia CS83 North zone","Virginia North","","","United States (USA) - Virginia - counties north of 38d 05m North.","9802","37.4","-78.3","39.12","38.02","","3500000.0","2000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_607[] = {"14532","Virginia CS83 South zone","Virginia South","","","United States (USA) - Virginia - counties south of 38d 05m North.","9802","36.2","-78.3","37.58","36.46","","3500000.0","1000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_608[] = {"14601","Washington CS27 North zone","Washington North","","","United States (USA) - Washington - counties north of 47d 30m North.","9802","47.0","-120.5","47.3","48.44","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_609[] = {"14602","Washington CS27 South zone","Washington South","","","United States (USA) - Washington - counties south of 47d 30m North.","9802","45.2","-120.3","45.5","47.2","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_610[] = {"14631","Washington CS83 North zone","Washington North","","","United States (USA) - Washington - counties north of 47d 30m North.","9802","47.0","-120.5","48.44","47.3","","500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_611[] = {"14632","Washington CS83 South zone","Washington South","","","United States (USA) - Washington - counties south of 47d 30m North.","9802","45.2","-120.3","47.2","45.5","","500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_612[] = {"14701","West Virginia CS27 North zone","West Virginia North","","","United States (USA) - West Virginia - counties north of 39deg North.","9802","38.3","-79.3","39.0","40.15","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_613[] = {"14702","West Virginia CS27 South zone","West Virginia South","","","United States (USA) - West Virginia - counties south of 39deg North.","9802","37.0","-81.0","37.29","38.53","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_614[] = {"14731","West Virginia CS83 North zone","West Virginia North","","","United States (USA) - West Virginia - counties north of 39deg North.","9802","38.3","-79.3","40.15","39.0","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_615[] = {"14732","West Virginia CS83 South zone","West Virginia South","","","United States (USA) - West Virginia - counties south of 39deg North.","9802","37.0","-81.0","38.53","37.29","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_616[] = {"14801","Wisconsin CS27 North zone","Wisconsin North","","","United States (USA) - Wisconsin - counties north of 45d 35m North.","9802","45.1","-90.0","45.34","46.46","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_617[] = {"14802","Wisconsin CS27 Central zone","Wisconsin Central","","","United States (USA) - Wisconsin - counties between 45d 35m & 44d 15m North.","9802","43.5","-90.0","44.15","45.3","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_618[] = {"14803","Wisconsin CS27 South zone","Wisconsin South","","","United States (USA) - Wisconsin - counties south of 44d 15m North.","9802","42.0","-90.0","42.44","44.04","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_619[] = {"14831","Wisconsin CS83 North zone","Wisconsin North","","","United States (USA) - Wisconsin - counties north of 45d 35m North.","9802","45.1","-90.0","46.46","45.34","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_620[] = {"14832","Wisconsin CS83 Central zone","Wisconsin Central","","","United States (USA) - Wisconsin - counties between 45d 35m & 44d 15m North.","9802","43.5","-90.0","45.3","44.15","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_621[] = {"14833","Wisconsin CS83 South zone","Wisconsin South","","","United States (USA) - Wisconsin - counties south of 44d 15m North.","9802","42.0","-90.0","44.04","42.44","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_622[] = {"14901","Wyoming CS27 East zone","Wyoming East","","","United States (USA) - Wyoming - counties east of 106d West.","9807","40.4","-105.1","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_623[] = {"14902","Wyoming CS27 East Central zone","Wyoming East Central","","","United States (USA) - Wyoming - counties between 106d & 108d 10m West.","9807","40.4","-107.2","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_624[] = {"14903","Wyoming CS27 West Central zone","Wyoming West Central","","","United States (USA) - Wyoming - counties between 108d 10m & 109d 40m West.","9807","40.4","-108.45","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_625[] = {"14904","Wyoming CS27 West zone","Wyoming West","","","United States (USA) - Wyoming - counties west of 109d 40m West.","9807","40.4","-110.05","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_626[] = {"14931","Wyoming CS83 East zone","Wyoming East","","","United States (USA) - Wyoming - counties east of 106d West.","9807","40.3","-105.1","","","0.9999375","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_627[] = {"14932","Wyoming CS83 East Central zone","Wyoming East Central","","","United States (USA) - Wyoming - counties between 106d & 108d 10m West.","9807","40.3","-107.2","","","0.9999375","400000.0","100000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_628[] = {"14933","Wyoming CS83 West Central zone","Wyoming West Central","","","United States (USA) - Wyoming - counties between 108d 10m & 109d 40m West.","9807","40.3","-108.45","","","0.9999375","600000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_629[] = {"14934","Wyoming CS83 West zone","Wyoming West","","","United States (USA) - Wyoming - counties west of 109d 40m West.","9807","40.3","-110.05","","","0.9999375","800000.0","100000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_630[] = {"15001","Alaska CS27 zone 1","Alaska zone 1","","","United States (USA) - Alaska - east of 141 deg West; i.e. Panhandle.","9812","57.0","-133.4","323.07483685","323.07483685","0.9999","16404166.67","-16404166.67","9003","9110","8901","","","","","1997-04-11 00:00:00","USGS Professional Paper #1395","EPSG","","96.29 97.08",NULL};
+datafile_rows_t trf_nonpolynomial_row_631[] = {"15002","Alaska CS27 zone 2","Alaska zone 2","","","United States (USA) - Alaska - 141deg to 144deg West.","9807","54.0","-142.0","","","0.9999","500000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_632[] = {"15003","Alaska CS27 zone 3","Alaska zone 3","","","United States (USA) - Alaska - 144deg to 148deg West excluding Kenai Peninsula; Perry Is. and Esther Is.","9807","54.0","-146.0","","","0.9999","500000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_633[] = {"15004","Alaska CS27 zone 4","Alaska zone 4","","","United States (USA) - Alaska - 148deg to 152deg West.","9807","54.0","-150.0","","","0.9999","500000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_634[] = {"15005","Alaska CS27 zone 5","Alaska zone 5","","","United States (USA) - Alaska - 152deg to 156deg West.","9807","54.0","-154.0","","","0.9999","500000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_635[] = {"15006","Alaska CS27 zone 6","Alaska zone 6","","","United States (USA) - Alaska - 156deg to 160deg West.","9807","54.0","-158.0","","","0.9999","500000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_636[] = {"15007","Alaska CS27 zone 7","Alaska zone 7","","","United States (USA) - Alaska - 160deg to 164deg West.","9807","54.0","-162.0","","","0.9999","700000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_637[] = {"15008","Alaska CS27 zone 8","Alaska zone 8","","","United States (USA) - Alaska - 164deg to 168deg West north of 54d 30m North.","9807","54.0","-166.0","","","0.9999","500000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_638[] = {"15009","Alaska CS27 zone 9","Alaska zone 9","","","United States (USA) - Alaska - west of 168deg West and north of 54d 30m North.","9807","54.0","-170.0","","","0.9999","600000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_639[] = {"15010","Alaska CS27 zone 10","Alaska zone 10","","","United States (USA) - Alaska - Aleutian Islands.","9802","51.0","-176.0","53.5","51.5","","3000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_640[] = {"15031","Alaska CS83 zone 1","Alaska zone 1","","","United States (USA) - Alaska - east of 141 deg West; i.e. Panhandle.","9812","57.0","-133.4","323.07483685","323.07483685","0.9999","5000000.0","-5000000.0","9001","9110","8901","","","","","1996-09-12 00:00:00","NOAA manual NOS NGS 5","EPSG","","96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_641[] = {"15032","Alaska CS83 zone 2","Alaska zone 2","","","United States (USA) - Alaska - 141deg to 144deg West.","9807","54.0","-142.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_642[] = {"15033","Alaska CS83 zone 3","Alaska zone 3","","","United States (USA) - Alaska - 144deg to 148deg West excluding Kenai Peninsula; Perry Is. and Esther Is.","9807","54.0","-146.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_643[] = {"15034","Alaska CS83 zone 4","Alaska zone 4","","","United States (USA) - Alaska - 148deg to 152deg West.","9807","54.0","-150.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_644[] = {"15035","Alaska CS83 zone 5","Alaska zone 5","","","United States (USA) - Alaska - 152deg to 156deg West.","9807","54.0","-154.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_645[] = {"15036","Alaska CS83 zone 6","Alaska zone 6","","","United States (USA) - Alaska - 156deg to 160deg West.","9807","54.0","-158.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_646[] = {"15037","Alaska CS83 zone 7","Alaska zone 7","","","United States (USA) - Alaska - 160deg to 164deg West.","9807","54.0","-162.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_647[] = {"15038","Alaska CS83 zone 8","Alaska zone 8","","","United States (USA) - Alaska - 164deg to 168deg West north of 54d 30m North.","9807","54.0","-166.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_648[] = {"15039","Alaska CS83 zone 9","Alaska zone 9","","","United States (USA) - Alaska - west of 168deg West and north of 54d 30m North.","9807","54.0","-170.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_649[] = {"15040","Alaska CS83 zone 10","Alaska zone 10","","","United States (USA) - Alaska - Aleutian Islands.","9802","51.0","-176.0","53.5","51.5","","1000000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_650[] = {"15101","Hawaii CS27 zone 1","Hawaii zone 1","","","United States (USA) - Hawaii - island of Hawaii.","9807","18.5","-155.3","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_651[] = {"15102","Hawaii CS27 zone 2","Hawaii zone 2","","","United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.","9807","20.2","-156.4","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_652[] = {"15103","Hawaii CS27 zone 3","Hawaii zone 3","","","United States (USA) - Hawaii - Oahu.","9807","21.1","-158.0","","","0.99999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_653[] = {"15104","Hawaii CS27 zone 4","Hawaii zone 4","","","United States (USA) - Hawaii - Kauai.","9807","21.5","-159.3","","","0.99999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_654[] = {"15105","Hawaii CS27 zone 5","Hawaii zone 5","","","United States (USA) - Hawaii - Niihau.","9807","21.4","-160.1","","","1.0","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_655[] = {"15131","Hawaii CS83 zone 1","Hawaii zone 1","","","United States (USA) - Hawaii - island of Hawaii.","9807","18.5","-155.3","","","0.999966667","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_656[] = {"15132","Hawaii CS83 zone 2","Hawaii zone 2","","","United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.","9807","20.2","-156.4","","","0.999966667","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_657[] = {"15133","Hawaii CS83 zone 3","Hawaii zone 3","","","United States (USA) - Hawaii - Oahu.","9807","21.1","-158.0","","","0.99999","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_658[] = {"15134","Hawaii CS83 zone 4","Hawaii zone 4","","","United States (USA) - Hawaii - Kauai.","9807","21.5","-159.3","","","0.99999","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_659[] = {"15135","Hawaii CS83 zone 5","Hawaii zone 5","","","United States (USA) - Hawaii - Niihau.","9807","21.4","-160.1","","","1.0","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_660[] = {"15201","Puerto Rico CS27","Puerto Rico","","","Puerto Rico.","9802","17.5","-66.26","18.26","18.02","","500000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_661[] = {"15202","St. Croix CS27","St. Croix","","","Virgin Islands of US - St. Croix.","9802","17.5","-66.26","18.26","18.02","","500000.0","100000.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_662[] = {"15230","Puerto Rico & Virgin Islands CS83","Puerto Rico & Virgin Is.","","","Puerto Rico & Virgin Islands of US","9802","17.5","-66.26","18.26","18.02","","200000.0","200000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_663[] = {"15914","BLM zone 14N in feet","BLM 14N (feet)","","","United States (USA) - Gulf of Mexico - west of 96 deg West approximately.","9807","0.0","-99.0","","","0.9996","1640416.67","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","Minerals Management Service offshore protraction diagrams.","EPSG","Sometimes locally referred to as \"UTM zone 14\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_664[] = {"15915","BLM zone 15N in feet","BLM 15N (feet)","","","United States (USA) - Gulf of Mexico - 96 deg to 90 deg West approximately.","9807","0.0","-93.0","","","0.9996","1640416.67","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","Minerals Management Service offshore protraction diagrams.","EPSG","Sometimes locally referred to as \"UTM zone 15\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_665[] = {"15916","BLM zone 16N in feet","BLM 16N (feet)","","","United States (USA) - Gulf of Mexico - 90 deg to 84 deg West approximately.","9807","0.0","-87.0","","","0.9996","1640416.67","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","Minerals Management Service offshore protraction diagrams.","EPSG","Sometimes locally referred to as \"UTM zone 16\".","95.27 95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_666[] = {"15917","BLM zone 17N in feet","BLM 17N (feet)","","","United States (USA) - Gulf of Mexico - east of 84 deg West approximately.","9807","0.0","-81.0","","","0.9996","1640416.67","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","Minerals Management Service offshore protraction diagrams.","EPSG","Sometimes locally referred to as \"UTM zone 17\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_667[] = {"16001","UTM zone 1N","","","","180deg to 174deg West; northern hemisphere.","9807","0.0","-177.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_668[] = {"16002","UTM zone 2N","","","","174deg West to 168deg West; northern hemisphere.","9807","0.0","-171.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_669[] = {"16003","UTM zone 3N","","","","168deg West to 162deg West; northern hemisphere.","9807","0.0","-165.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_670[] = {"16004","UTM zone 4N","","","","162deg West to 156deg West; northern hemisphere.","9807","0.0","-159.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_671[] = {"16005","UTM zone 5N","","","","156deg West to 150deg West; northern hemisphere.","9807","0.0","-153.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_672[] = {"16006","UTM zone 6N","","","","150deg West to 144deg West; northern hemisphere.","9807","0.0","-147.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_673[] = {"16007","UTM zone 7N","","","","144deg West to 138deg West; northern hemisphere.","9807","0.0","-141.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_674[] = {"16008","UTM zone 8N","","","","138deg West to 132deg West; northern hemisphere.","9807","0.0","-135.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_675[] = {"16009","UTM zone 9N","","","","132deg West to 126deg West; northern hemisphere.","9807","0.0","-129.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_676[] = {"16010","UTM zone 10N","","","","130deg West to 120deg West; northern hemisphere.","9807","0.0","-123.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_677[] = {"16011","UTM zone 11N","","","","120deg West to 114deg West; northern hemisphere.","9807","0.0","-117.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_678[] = {"16012","UTM zone 12N","","","","114deg West to 108deg West; northern hemisphere.","9807","0.0","-111.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_679[] = {"16013","UTM zone 13N","","","","108deg West to 102deg West; northern hemisphere.","9807","0.0","-105.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_680[] = {"16014","UTM zone 14N","","","","102deg West to 96deg West; northern hemisphere.","9807","0.0","-99.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_681[] = {"16015","UTM zone 15N","","","","96deg West to 90deg West; northern hemisphere.","9807","0.0","-93.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_682[] = {"16016","UTM zone 16N","","","","90deg West to 84deg West; northern hemisphere.","9807","0.0","-87.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_683[] = {"16017","UTM zone 17N","","","","84deg West to 78deg West; northern hemisphere.","9807","0.0","-81.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_684[] = {"16018","UTM zone 18N","","","","78deg West to 72deg West; northern hemisphere.","9807","0.0","-75.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_685[] = {"16019","UTM zone 19N","","","","72deg West to 66deg West; northern hemisphere.","9807","0.0","-69.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_686[] = {"16020","UTM zone 20N","","","","66deg West to 60deg West; northern hemisphere.","9807","0.0","-63.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_687[] = {"16021","UTM zone 21N","","","","60deg West to 54deg West; northern hemisphere.","9807","0.0","-57.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_688[] = {"16022","UTM zone 22N","","","","54deg West to 48deg West; northern hemisphere.","9807","0.0","-51.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_689[] = {"16023","UTM zone 23N","","","","48deg West to 42deg West; northern hemisphere.","9807","0.0","-45.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_690[] = {"16024","UTM zone 24N","","","","42deg West to 36deg West; northern hemisphere.","9807","0.0","-39.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_691[] = {"16025","UTM zone 25N","","","","36deg West to 30deg West; northern hemisphere.","9807","0.0","-33.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_692[] = {"16026","UTM zone 26N","","","","30deg West to 24deg West; northern hemisphere.","9807","0.0","-27.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_693[] = {"16027","UTM zone 27N","","","","24deg West to 18deg West; northern hemisphere.","9807","0.0","-21.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_694[] = {"16028","UTM zone 28N","","","","18deg West to 12deg West; northern hemisphere.","9807","0.0","-15.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_695[] = {"16029","UTM zone 29N","","","","12deg West to 6deg West; northern hemisphere.","9807","0.0","-9.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_696[] = {"16030","UTM zone 30N","","","","6deg West to 0deg; northern hemisphere.","9807","0.0","-3.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_697[] = {"16031","UTM zone 31N","","","","0deg to 6deg East; northern hemisphere.","9807","0.0","3.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_698[] = {"16032","UTM zone 32N","","","","6deg East to 12deg East; northern hemisphere.","9807","0.0","9.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_699[] = {"16033","UTM zone 33N","","","","12deg East to 18deg East; northern hemisphere.","9807","0.0","15.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_700[] = {"16034","UTM zone 34N","","","","18deg East to 24deg East; northern hemisphere.","9807","0.0","21.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_701[] = {"16035","UTM zone 35N","","","","24deg East to 30deg East; northern hemisphere.","9807","0.0","27.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_702[] = {"16036","UTM zone 36N","","","","30deg East to 36deg East; northern hemisphere.","9807","0.0","33.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_703[] = {"16037","UTM zone 37N","","","","36deg East to 42deg East; northern hemisphere.","9807","0.0","39.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_704[] = {"16038","UTM zone 38N","","","","42deg East to 48deg East; northern hemisphere.","9807","0.0","45.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_705[] = {"16039","UTM zone 39N","","","","48deg East to 54deg East; northern hemisphere.","9807","0.0","51.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_706[] = {"16040","UTM zone 40N","","","","54deg East to 60deg East; northern hemisphere.","9807","0.0","57.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_707[] = {"16041","UTM zone 41N","","","","60deg East to 66deg East; northern hemisphere.","9807","0.0","63.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_708[] = {"16042","UTM zone 42N","","","","66deg East to 72deg East; northern hemisphere.","9807","0.0","69.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_709[] = {"16043","UTM zone 43N","","","","72deg East to 78deg East; northern hemisphere.","9807","0.0","75.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_710[] = {"16044","UTM zone 44N","","","","78deg East to 84deg East; northern hemisphere.","9807","0.0","81.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_711[] = {"16045","UTM zone 45N","","","","84deg East to 90deg East; northern hemisphere.","9807","0.0","87.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_712[] = {"16046","UTM zone 46N","","","","90deg East to 96deg East; northern hemisphere.","9807","0.0","93.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_713[] = {"16047","UTM zone 47N","","","","96deg East to 102eg East; northern hemisphere.","9807","0.0","99.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_714[] = {"16048","UTM zone 48N","","","","102deg East to 108deg East; northern hemisphere.","9807","0.0","105.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_715[] = {"16049","UTM zone 49N","","","","108deg East to 114deg East; northern hemisphere.","9807","0.0","111.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_716[] = {"16050","UTM zone 50N","","","","114deg East to 120deg East; northern hemisphere.","9807","0.0","117.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_717[] = {"16051","UTM zone 51N","","","","120deg East to 126deg East; northern hemisphere.","9807","0.0","123.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_718[] = {"16052","UTM zone 52N","","","","126deg East to 132deg East; northern hemisphere.","9807","0.0","129.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_719[] = {"16053","UTM zone 53N","","","","132deg East to 138deg East; northern hemisphere.","9807","0.0","135.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_720[] = {"16054","UTM zone 54N","","","","138deg East to 144deg East; northern hemisphere.","9807","0.0","141.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_721[] = {"16055","UTM zone 55N","","","","144deg East to 150deg East; northern hemisphere.","9807","0.0","147.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_722[] = {"16056","UTM zone 56N","","","","150deg East to 156deg East; northern hemisphere.","9807","0.0","153.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_723[] = {"16057","UTM zone 57N","","","","156deg East to 162deg East; northern hemisphere.","9807","0.0","159.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_724[] = {"16058","UTM zone 58N","","","","162deg East to 168deg East; northern hemisphere.","9807","0.0","165.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_725[] = {"16059","UTM zone 59N","","","","168deg East to 174deg East; northern hemisphere.","9807","0.0","171.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_726[] = {"16060","UTM zone 60N","","","","174deg East to 180deg; northern hemisphere.","9807","0.0","177.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_727[] = {"16061","Universal Polar Stereographic North","UPS North","","","Northern hemisphere polar area.","9810","90.0","0.0","","","0.994","2000000.0","2000000.0","9001","9102","8901","","","","","1997-06-16 00:00:00","","EPSG","","97.18",NULL};
+datafile_rows_t trf_nonpolynomial_row_728[] = {"16101","UTM zone 1S","","","","180deg to 174deg West; southern hemisphere.","9807","0.0","-177.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_729[] = {"16102","UTM zone 2S","","","","174deg West to 168deg West; southern hemisphere.","9807","0.0","-171.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_730[] = {"16103","UTM zone 3S","","","","168deg West to 162deg West; southern hemisphere.","9807","0.0","-165.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_731[] = {"16104","UTM zone 4S","","","","162deg West to 156deg West; southern hemisphere.","9807","0.0","-159.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_732[] = {"16105","UTM zone 5S","","","","156deg West to 150deg West; southern hemisphere.","9807","0.0","-153.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_733[] = {"16106","UTM zone 6S","","","","150deg West to 144deg West; southern hemisphere.","9807","0.0","-147.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_734[] = {"16107","UTM zone 7S","","","","144deg West to 138deg West; southern hemisphere.","9807","0.0","-141.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_735[] = {"16108","UTM zone 8S","","","","138deg West to 132deg West; southern hemisphere.","9807","0.0","-135.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_736[] = {"16109","UTM zone 9S","","","","132deg West to 126deg West; southern hemisphere.","9807","0.0","-129.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_737[] = {"16110","UTM zone 10S","","","","130deg West to 120deg West; southern hemisphere.","9807","0.0","-123.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_738[] = {"16111","UTM zone 11S","","","","120deg West to 114deg West; southern hemisphere.","9807","0.0","-117.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_739[] = {"16112","UTM zone 12S","","","","114deg West to 108deg West; southern hemisphere.","9807","0.0","-111.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_740[] = {"16113","UTM zone 13S","","","","108deg West to 102deg West; southern hemisphere.","9807","0.0","-105.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_741[] = {"16114","UTM zone 14S","","","","102deg West to 96deg West; southern hemisphere.","9807","0.0","-99.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_742[] = {"16115","UTM zone 15S","","","","96deg West to 90deg West; southern hemisphere.","9807","0.0","-93.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_743[] = {"16116","UTM zone 16S","","","","90deg West to 84deg West; southern hemisphere.","9807","0.0","-87.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_744[] = {"16117","UTM zone 17S","","","","84deg West to 78deg West; southern hemisphere.","9807","0.0","-81.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_745[] = {"16118","UTM zone 18S","","","","78deg West to 72deg West; southern hemisphere.","9807","0.0","-75.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_746[] = {"16119","UTM zone 19S","","","","72deg West to 66deg West; southern hemisphere.","9807","0.0","-69.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_747[] = {"16120","UTM zone 20S","","","","66deg West to 60deg West; southern hemisphere.","9807","0.0","-63.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_748[] = {"16121","UTM zone 21S","","","","60deg West to 54deg West; southern hemisphere.","9807","0.0","-57.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_749[] = {"16122","UTM zone 22S","","","","54deg West to 48deg West; southern hemisphere.","9807","0.0","-51.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_750[] = {"16123","UTM zone 23S","","","","48deg West to 42deg West; southern hemisphere.","9807","0.0","-45.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_751[] = {"16124","UTM zone 24S","","","","42deg West to 36deg West; southern hemisphere.","9807","0.0","-39.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_752[] = {"16125","UTM zone 25S","","","","36deg West to 30deg West; southern hemisphere.","9807","0.0","-33.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_753[] = {"16126","UTM zone 26S","","","","30deg West to 24deg West; southern hemisphere.","9807","0.0","-27.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_754[] = {"16127","UTM zone 27S","","","","24deg West to 18deg West; southern hemisphere.","9807","0.0","-21.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_755[] = {"16128","UTM zone 28S","","","","18deg West to 12deg West; southern hemisphere.","9807","0.0","-15.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_756[] = {"16129","UTM zone 29S","","","","12deg West to 6deg West; southern hemisphere.","9807","0.0","-9.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_757[] = {"16130","UTM zone 30S","","","","6deg West to 0deg; southern hemisphere.","9807","0.0","-3.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_758[] = {"16131","UTM zone 31S","","","","0deg to 6deg East; southern hemisphere.","9807","0.0","3.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_759[] = {"16132","UTM zone 32S","","","","6deg East to 12deg East; southern hemisphere.","9807","0.0","9.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_760[] = {"16133","UTM zone 33S","","","","12deg East to 18deg East; southern hemisphere.","9807","0.0","15.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_761[] = {"16134","UTM zone 34S","","","","18deg East to 24deg East; southern hemisphere.","9807","0.0","21.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_762[] = {"16135","UTM zone 35S","","","","24deg East to 30deg East; southern hemisphere.","9807","0.0","27.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_763[] = {"16136","UTM zone 36S","","","","30deg East to 36deg East; southern hemisphere.","9807","0.0","33.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_764[] = {"16137","UTM zone 37S","","","","36deg East to 42deg East; southern hemisphere.","9807","0.0","39.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_765[] = {"16138","UTM zone 38S","","","","42deg East to 48deg East; southern hemisphere.","9807","0.0","45.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_766[] = {"16139","UTM zone 39S","","","","48deg East to 54deg East; southern hemisphere.","9807","0.0","51.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_767[] = {"16140","UTM zone 40S","","","","54deg East to 60deg East; southern hemisphere.","9807","0.0","57.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_768[] = {"16141","UTM zone 41S","","","","60deg East to 66deg East; southern hemisphere.","9807","0.0","63.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_769[] = {"16142","UTM zone 42S","","","","66deg East to 72deg East; southern hemisphere.","9807","0.0","69.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_770[] = {"16143","UTM zone 43S","","","","72deg East to 78deg East; southern hemisphere.","9807","0.0","75.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_771[] = {"16144","UTM zone 44S","","","","78deg East to 84deg East; southern hemisphere.","9807","0.0","81.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_772[] = {"16145","UTM zone 45S","","","","84deg East to 90deg East; southern hemisphere.","9807","0.0","87.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_773[] = {"16146","UTM zone 46S","","","","90deg East to 96deg East; southern hemisphere.","9807","0.0","93.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_774[] = {"16147","UTM zone 47S","","","","96deg East to 102eg East; southern hemisphere.","9807","0.0","99.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_775[] = {"16148","UTM zone 48S","","","","102deg East to 108deg East; southern hemisphere.","9807","0.0","105.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_776[] = {"16149","UTM zone 49S","","","","108deg East to 114deg East; southern hemisphere.","9807","0.0","111.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_777[] = {"16150","UTM zone 50S","","","","114deg East to 120deg East; southern hemisphere.","9807","0.0","117.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_778[] = {"16151","UTM zone 51S","","","","120deg East to 126deg East; southern hemisphere.","9807","0.0","123.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_779[] = {"16152","UTM zone 52S","","","","126deg East to 132deg East; southern hemisphere.","9807","0.0","129.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_780[] = {"16153","UTM zone 53S","","","","132deg East to 138deg East; southern hemisphere.","9807","0.0","135.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_781[] = {"16154","UTM zone 54S","","","","138deg East to 144deg East; southern hemisphere.","9807","0.0","141.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_782[] = {"16155","UTM zone 55S","","","","144deg East to 150deg East; southern hemisphere.","9807","0.0","147.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_783[] = {"16156","UTM zone 56S","","","","150deg East to 156deg East; southern hemisphere.","9807","0.0","153.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_784[] = {"16157","UTM zone 57S","","","","156deg East to 162deg East; southern hemisphere.","9807","0.0","159.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_785[] = {"16158","UTM zone 58S","","","","162deg East to 168deg East; southern hemisphere.","9807","0.0","165.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_786[] = {"16159","UTM zone 59S","","","","168deg East to 174deg East; southern hemisphere.","9807","0.0","171.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_787[] = {"16160","UTM zone 60S","","","","174deg East to 180deg; southern hemisphere.","9807","0.0","177.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_788[] = {"16161","Universal Polar Stereographic South","UPS South","","","Southern hemisphere polar area.","9810","-90.0","0.0","","","0.994","2000000.0","2000000.0","9001","9102","8901","","","","","1997-06-16 00:00:00","","EPSG","","97.18",NULL};
+datafile_rows_t trf_nonpolynomial_row_789[] = {"16202","Gauss-Kruger zone 2","","","","6deg East to 12deg East; northern hemisphere.","9807","0.0","9.0","","","1.0","2500000.0","0.0","9001","9102","8901","","","","","1998-06-30 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_790[] = {"16203","Gauss-Kruger zone 3","","","","12deg East to 18deg East; northern hemisphere.","9807","0.0","15.0","","","1.0","3500000.0","0.0","9001","9102","8901","","","","","1998-06-30 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_791[] = {"16204","Gauss-Kruger zone 4","","","","18deg East to 24deg East; northern hemisphere.","9807","0.0","21.0","","","1.0","4500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_792[] = {"16205","Gauss-Kruger zone 5","","","","24deg East to 30deg East; northern hemisphere.","9807","0.0","27.0","","","1.0","5500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_793[] = {"16206","Gauss-Kruger zone 6","","","","30deg East to 36deg East; northern hemisphere.","9807","0.0","33.0","","","1.0","6500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_794[] = {"16207","Gauss-Kruger zone 7","","","","36deg East to 42deg East; northern hemisphere.","9807","0.0","39.0","","","1.0","7500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_795[] = {"16208","Gauss-Kruger zone 8","","","","42deg East to 48deg East; northern hemisphere.","9807","0.0","45.0","","","1.0","8500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_796[] = {"16209","Gauss-Kruger zone 9","","","","48deg East to 54deg East; northern hemisphere.","9807","0.0","51.0","","","1.0","9500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_797[] = {"16210","Gauss-Kruger zone 10","","","","54deg East to 60deg East; northern hemisphere.","9807","0.0","57.0","","","1.0","10500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_798[] = {"16211","Gauss-Kruger zone 11","","","","60deg East to 66deg East; northern hemisphere.","9807","0.0","63.0","","","1.0","11500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_799[] = {"16212","Gauss-Kruger zone 12","","","","66deg East to 72deg East; northern hemisphere.","9807","0.0","69.0","","","1.0","12500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_800[] = {"16213","Gauss-Kruger zone 13","","","","72deg East to 78deg East; northern hemisphere.","9807","0.0","75.0","","","1.0","13500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_801[] = {"16214","Gauss-Kruger zone 14","","","","78deg East to 84deg East; northern hemisphere.","9807","0.0","81.0","","","1.0","14500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_802[] = {"16215","Gauss-Kruger zone 15","","","","84deg East to 90deg East; northern hemisphere.","9807","0.0","87.0","","","1.0","15500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_803[] = {"16216","Gauss-Kruger zone 16","","","","90deg East to 96deg East; northern hemisphere.","9807","0.0","93.0","","","1.0","16500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_804[] = {"16217","Gauss-Kruger zone 17","","","","96deg East to 102eg East; northern hemisphere.","9807","0.0","99.0","","","1.0","17500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_805[] = {"16218","Gauss-Kruger zone 18","","","","102deg East to 108deg East; northern hemisphere.","9807","0.0","105.0","","","1.0","18500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_806[] = {"16219","Gauss-Kruger zone 19","","","","108deg East to 114deg East; northern hemisphere.","9807","0.0","111.0","","","1.0","19500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_807[] = {"16220","Gauss-Kruger zone 20","","","","114deg East to 120deg East; northern hemisphere.","9807","0.0","117.0","","","1.0","20500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_808[] = {"16221","Gauss-Kruger zone 21","","","","120deg East to 126deg East; northern hemisphere.","9807","0.0","123.0","","","1.0","21500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_809[] = {"16222","Gauss-Kruger zone 22","","","","126deg East to 132deg East; northern hemisphere.","9807","0.0","129.0","","","1.0","22500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_810[] = {"16223","Gauss-Kruger zone 23","","","","132deg East to 138deg East; northern hemisphere.","9807","0.0","135.0","","","1.0","23500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_811[] = {"16224","Gauss-Kruger zone 24","","","","138deg East to 144deg East; northern hemisphere.","9807","0.0","141.0","","","1.0","24500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_812[] = {"16225","Gauss-Kruger zone 25","","","","144deg East to 150deg East; northern hemisphere.","9807","0.0","147.0","","","1.0","25500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_813[] = {"16226","Gauss-Kruger zone 26","","","","150deg East to 156deg East; northern hemisphere.","9807","0.0","153.0","","","1.0","26500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_814[] = {"16227","Gauss-Kruger zone 27","","","","156deg East to 162deg East; northern hemisphere.","9807","0.0","159.0","","","1.0","27500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_815[] = {"16228","Gauss-Kruger zone 28","","","","162deg East to 168deg East; northern hemisphere.","9807","0.0","165.0","","","1.0","28500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_816[] = {"16229","Gauss-Kruger zone 29","","","","168deg East to 174deg East; northern hemisphere.","9807","0.0","171.0","","","1.0","29500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_817[] = {"16230","Gauss-Kruger zone 30","","","","174deg East to 180deg; northern hemisphere.","9807","0.0","177.0","","","1.0","30500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_818[] = {"16231","Gauss-Kruger zone 31","","","","180deg to 174deg West; northern hemisphere.","9807","0.0","-177.0","","","1.0","31500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_819[] = {"16232","Gauss-Kruger zone 32","","","","174deg West to 168deg West; northern hemisphere.","9807","0.0","-171.0","","","1.0","32500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_820[] = {"16302","Gauss-Kruger 2N","","","","6deg East to 12deg East; northern hemisphere.","9807","0.0","9.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1998-06-30 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_821[] = {"16303","Gauss-Kruger 3N","","","","12deg East to 18deg East; northern hemisphere.","9807","0.0","15.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1998-06-30 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_822[] = {"16304","Gauss-Kruger 4N","","","","18deg East to 24deg East; northern hemisphere.","9807","0.0","21.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_823[] = {"16305","Gauss-Kruger 5N","","","","24deg East to 30deg East; northern hemisphere.","9807","0.0","27.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_824[] = {"16306","Gauss-Kruger 6N","","","","30deg East to 36deg East; northern hemisphere.","9807","0.0","33.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_825[] = {"16307","Gauss-Kruger 7N","","","","36deg East to 42deg East; northern hemisphere.","9807","0.0","39.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_826[] = {"16308","Gauss-Kruger 8N","","","","42deg East to 48deg East; northern hemisphere.","9807","0.0","45.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_827[] = {"16309","Gauss-Kruger 9N","","","","48deg East to 54deg East; northern hemisphere.","9807","0.0","51.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_828[] = {"16310","Gauss-Kruger 10N","","","","54deg East to 60deg East; northern hemisphere.","9807","0.0","57.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_829[] = {"16311","Gauss-Kruger 11N","","","","60deg East to 66deg East; northern hemisphere.","9807","0.0","63.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_830[] = {"16312","Gauss-Kruger 12N","","","","66deg East to 72deg East; northern hemisphere.","9807","0.0","69.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_831[] = {"16313","Gauss-Kruger 13N","","","","72deg East to 78deg East; northern hemisphere.","9807","0.0","75.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_832[] = {"16314","Gauss-Kruger 14N","","","","78deg East to 84deg East; northern hemisphere.","9807","0.0","81.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_833[] = {"16315","Gauss-Kruger 15N","","","","84deg East to 90deg East; northern hemisphere.","9807","0.0","87.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_834[] = {"16316","Gauss-Kruger 16N","","","","90deg East to 96deg East; northern hemisphere.","9807","0.0","93.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_835[] = {"16317","Gauss-Kruger 17N","","","","96deg East to 102eg East; northern hemisphere.","9807","0.0","99.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_836[] = {"16318","Gauss-Kruger 18N","","","","102deg East to 108deg East; northern hemisphere.","9807","0.0","105.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_837[] = {"16319","Gauss-Kruger 19N","","","","108deg East to 114deg East; northern hemisphere.","9807","0.0","111.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_838[] = {"16320","Gauss-Kruger 20N","","","","114deg East to 120deg East; northern hemisphere.","9807","0.0","117.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_839[] = {"16321","Gauss-Kruger 21N","","","","120deg East to 126deg East; northern hemisphere.","9807","0.0","123.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_840[] = {"16322","Gauss-Kruger 22N","","","","126deg East to 132deg East; northern hemisphere.","9807","0.0","129.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_841[] = {"16323","Gauss-Kruger 23N","","","","132deg East to 138deg East; northern hemisphere.","9807","0.0","135.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_842[] = {"16324","Gauss-Kruger 24N","","","","138deg East to 144deg East; northern hemisphere.","9807","0.0","141.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_843[] = {"16325","Gauss-Kruger 25N","","","","144deg East to 150deg East; northern hemisphere.","9807","0.0","147.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_844[] = {"16326","Gauss-Kruger 26N","","","","150deg East to 156deg East; northern hemisphere.","9807","0.0","153.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_845[] = {"16327","Gauss-Kruger 27N","","","","156deg East to 162deg East; northern hemisphere.","9807","0.0","159.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_846[] = {"16328","Gauss-Kruger 28N","","","","162deg East to 168deg East; northern hemisphere.","9807","0.0","165.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_847[] = {"16329","Gauss-Kruger 29N","","","","168deg East to 174deg East; northern hemisphere.","9807","0.0","171.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_848[] = {"16330","Gauss-Kruger 30N","","","","174deg East to 180deg; northern hemisphere.","9807","0.0","177.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_849[] = {"16331","Gauss-Kruger 31N","","","","180deg to 174deg West; northern hemisphere.","9807","0.0","-177.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_850[] = {"16332","Gauss-Kruger 32N","","","","174deg West to 168deg West; northern hemisphere.","9807","0.0","-171.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_851[] = {"16400","TM 0 N","","","","United Kingdom (UKCS) - offshore North Sea.","9807","0.0","0.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1998-11-11 00:00:00","Shell UK","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_852[] = {"16405","TM 5 NE","","","","Netherlands - offshore.","9807","0.0","5.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1998-11-11 00:00:00","NAM","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_853[] = {"16506","TM 106 NE","","","","Vietnam - offshore.","9807","0.0","106.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1998-11-11 00:00:00","PetroVietnam","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_854[] = {"16611","TM 11.30 SE","","","","Angola - offshore.","9807","0.0","11.3","","","0.9996","500000.0","10000000.0","9001","9110","8901","","","","","1998-11-11 00:00:00","Esso Angola","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_855[] = {"16612","TM 12 SE","","","","Angola - offshore.","9807","0.0","12.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1998-11-11 00:00:00","Shell Angola","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_856[] = {"16636","TM 36 SE","","","","Mozambique - offshore.","9807","0.0","36.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1998-11-11 00:00:00","BP Mozambique","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_857[] = {"17348","Map Grid of Australia zone 48","MGA zone 48","","","Australia 102deg East to 108deg East.","9807","0.0","105.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_858[] = {"17349","Map Grid of Australia zone 49","MGA zone 49","","","Australia 108deg East to 114deg East.","9807","0.0","111.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_859[] = {"17350","Map Grid of Australia zone 50","MGA zone 50","","","Australia 114deg East to 120deg East.","9807","0.0","117.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_860[] = {"17351","Map Grid of Australia zone 51","MGA zone 51","","","Australia 120deg East to 126deg East.","9807","0.0","123.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_861[] = {"17352","Map Grid of Australia zone 52","MGA zone 52","","","Australia 126deg East to 132deg East.","9807","0.0","129.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_862[] = {"17353","Map Grid of Australia zone 53","MGA zone 53","","","Australia 132deg East to 138deg East.","9807","0.0","135.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_863[] = {"17354","Map Grid of Australia zone 54","MGA zone 54","","","Australia 138deg East to 144deg East.","9807","0.0","141.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_864[] = {"17355","Map Grid of Australia zone 55","MGA zone 55","","","Australia 144deg East to 150deg East.","9807","0.0","147.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_865[] = {"17356","Map Grid of Australia zone 56","MGA zone 56","","","Australia 150deg East to 156deg East.","9807","0.0","153.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_866[] = {"17357","Map Grid of Australia zone 57","MGA zone 57","","","Australia 156deg East to 162deg East.","9807","0.0","159.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_867[] = {"17358","Map Grid of Australia zone 58","MGA zone 58","","","Australia 162deg East to 168deg East.","9807","0.0","165.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_868[] = {"17448","Australian Map Grid zone 48","AMG zone 48","","","Australia 102deg East to 108deg East.","9807","0.0","105.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_869[] = {"17449","Australian Map Grid zone 49","AMG zone 49","","","Australia 108deg East to 114deg East.","9807","0.0","111.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_870[] = {"17450","Australian Map Grid zone 50","AMG zone 50","","","Australia 114deg East to 120deg East.","9807","0.0","117.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_871[] = {"17451","Australian Map Grid zone 51","AMG zone 51","","","Australia 120deg East to 126deg East.","9807","0.0","123.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_872[] = {"17452","Australian Map Grid zone 52","AMG zone 52","","","Australia 126deg East to 132deg East.","9807","0.0","129.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_873[] = {"17453","Australian Map Grid zone 53","AMG zone 53","","","Australia 132deg East to 138deg East.","9807","0.0","135.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_874[] = {"17454","Australian Map Grid zone 54","AMG zone 54","","","Australia 138deg East to 144deg East. Papua New Guinea west of 144 deg East.","9807","0.0","141.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_875[] = {"17455","Australian Map Grid zone 55","AMG zone 55","","","Australia 144deg East to 150deg East. Papua New Guinea 144deg East to 150deg East.","9807","0.0","147.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_876[] = {"17456","Australian Map Grid zone 56","AMG zone 56","","","Australia 150deg East to 156deg East.","9807","0.0","153.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_877[] = {"17457","Australian Map Grid zone 57","AMG zone 57","","","Australia 156deg East to 162deg East.","9807","0.0","159.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_878[] = {"17458","Australian Map Grid zone 58","AMG zone 58","","","Australia 162deg East to 168deg East.","9807","0.0","165.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_879[] = {"17515","South African Survey Grid zone 15","S. African Grid zone 15","","","South Africa - Walvis Bay.","9808","0.0","15.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_880[] = {"17517","South African Survey Grid zone 17","S. African Grid zone 17","","","South Africa - west of 18 deg East.","9808","0.0","17.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_881[] = {"17519","South African Survey Grid zone 19","S. African Grid zone 19","","","South Africa - 18 to 20 deg East.","9808","0.0","19.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_882[] = {"17521","South African Survey Grid zone 21","S. African Grid zone 21","","","South Africa - 20 to 22 deg East.","9808","0.0","21.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_883[] = {"17523","South African Survey Grid zone 23","S. African Grid zone 23","","","South Africa - 22 to 24 deg East.","9808","0.0","23.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_884[] = {"17525","South African Survey Grid zone 25","S. African Grid zone 25","","","Lestho - west of 26 deg East; South Africa - 24 to 26 deg East.","9808","0.0","25.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_885[] = {"17527","South African Survey Grid zone 27","S. African Grid zone 27","","","Lestho - east of 26 deg East; South Africa - 26 to 28 deg East.","9808","0.0","27.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_886[] = {"17529","South African Survey Grid zone 29","S. African Grid zone 29","","","South Africa - 28 to 30 deg East.","9808","0.0","29.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_887[] = {"17531","South African Survey Grid zone 31","S. African Grid zone 31","","","South Africa - 30 to 32 deg East; Swaziland.","9808","0.0","31.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_888[] = {"17533","South African Survey Grid zone 33","S. African Grid zone 33","","","South Africa - east of 32 deg East.","9808","0.0","33.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_889[] = {"17611","South West African Survey Grid zone 11","SW African Grid zone 11","","","Namibia - west of 12 deg East.","9808","-22.0","11.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29 97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_890[] = {"17613","South West African Survey Grid zone 13","SW African Grid zone 13","","","Namibia - 12 to 14 deg East.","9808","-22.0","13.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29 97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_891[] = {"17615","South West African Survey Grid zone 15","SW African Grid zone 15","","","Namibia - 14 to 16 deg East.","9808","-22.0","15.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29 97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_892[] = {"17617","South West African Survey Grid zone 17","SW African Grid zone 17","","","Namibia - 16 to 18 deg East.","9808","-22.0","17.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29 97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_893[] = {"17619","South West African Survey Grid zone 19","SW African Grid zone 19","","","Namibia - 18 to 20 deg East.","9808","-22.0","19.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29 97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_894[] = {"17621","South West African Survey Grid zone 21","SW African Grid zone 21","","","Namibia - 20 to 22 deg East.","9808","-22.0","21.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29 97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_895[] = {"17623","South West African Survey Grid zone 23","SW African Grid zone 23","","","Namibia - 22 to 24 deg East.","9808","-22.0","23.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29 97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_896[] = {"17625","South West African Survey Grid zone 25","SW African Grid zone 25","","","Namibia - east of 24 deg East.","9808","-22.0","25.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30 96.29 97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_897[] = {"17700","MTM Quebec zone 2","","","","Canada - Quebec - east of 57 deg East.","9807","0.0","-55.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_898[] = {"17701","MTM zone 1","","","","Canada - Newfoundland - east of 54 deg 30 min West.","9807","0.0","-53.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_899[] = {"17702","MTM Newfoundland zone 2","MTM zone 2","","","Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.","9807","0.0","-56.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_900[] = {"17703","MTM zone 3","","","","Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West; Canada - Quebec between 60 deg and 57 deg West.","9807","0.0","-58.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_901[] = {"17704","MTM zone 4","","","","Canada - Quebec and Newfoundland (Labrador) between 63 deg and 60 deg West.","9807","0.0","-61.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_902[] = {"17705","MTM zone 5","","","","Canada - Quebec and Newfoundland (Labrador) between 66 deg and 63 deg West.","9807","0.0","-64.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_903[] = {"17706","MTM zone 6","","","","Canada - Quebec and Newfoundland (Labrador) between 69 deg and 66 deg West.","9807","0.0","-67.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_904[] = {"17707","MTM zone 7","","","","Canada - Quebec between 72 deg and 69 deg West.","9807","0.0","-70.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_905[] = {"17708","MTM zone 8","","","","Canada - Quebec between 75 deg and 72 deg West.; Canada - Ontario - east of 75 deg West.","9807","0.0","-73.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_906[] = {"17709","MTM zone 9","","","","Canada - Quebec and Ontario - between 78 deg and 75 deg West.","9807","0.0","-76.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_907[] = {"17710","MTM zone 10","","","","Canada - Quebec west of 78 deg West; Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.","9807","0.0","-79.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transp [...]
+datafile_rows_t trf_nonpolynomial_row_908[] = {"17711","MTM zone 11","","","","Canada - Ontario - south of 46 deg N and west of 81 deg West.","9807","0.0","-82.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_909[] = {"17712","MTM zone 12","","","","Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.","9807","0.0","-81.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation. [...]
+datafile_rows_t trf_nonpolynomial_row_910[] = {"17713","MTM zone 13","","","","Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.","9807","0.0","-84.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_911[] = {"17714","MTM zone 14","","","","Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.","9807","0.0","-87.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_912[] = {"17715","MTM zone 15","","","","Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.","9807","0.0","-90.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_913[] = {"17716","MTM zone 16","","","","Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.","9807","0.0","-93.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_914[] = {"17717","MTM zone 17","","","","Canada - Ontario - west of 94 deg 30 min West.","9807","0.0","-96.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_915[] = {"17794","MTM Nova Scotia zone 4","","","","Canada - Nova Scotia - east of 63 deg West.","9807","0.0","-61.3","","","0.9999","4500000.0","0.0","9001","9110","8901","","","","","1999-05-24 00:00:00","Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.","EPSG","","99.042",NULL};
+datafile_rows_t trf_nonpolynomial_row_916[] = {"17795","MTM Nova Scotia zone 5","","","","Canada - Nova Scotia - west of 63 deg West.","9807","0.0","-64.3","","","0.9999","5500000.0","0.0","9001","9110","8901","","","","","1999-05-24 00:00:00","Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.","EPSG","","99.042",NULL};
+datafile_rows_t trf_nonpolynomial_row_917[] = {"17801","Japan Plane Rectangular CS zone I","Japan zone I","","","Japan - Kyushu - Nagasaki-ken; islands of Kagoshima-ken between 27 and 32 deg N and between 128 deg 18 min and 130 deg E (between 128 deg 18 min and 30 deg 13 min E for Amami islands).","9807","33.0","129.3","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2 [...]
+datafile_rows_t trf_nonpolynomial_row_918[] = {"17802","Japan Plane Rectangular CS zone II","Japan zone II","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","33.0","131.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","O [...]
+datafile_rows_t trf_nonpolynomial_row_919[] = {"17803","Japan Plane Rectangular CS zone III","Japan zone III","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","36.0","132.1","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG", [...]
+datafile_rows_t trf_nonpolynomial_row_920[] = {"17804","Japan Plane Rectangular CS zone IV","Japan zone IV","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","33.0","133.3","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","O [...]
+datafile_rows_t trf_nonpolynomial_row_921[] = {"17805","Japan Plane Rectangular CS zone V","Japan zone V","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","36.0","134.2","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Ori [...]
+datafile_rows_t trf_nonpolynomial_row_922[] = {"17806","Japan Plane Rectangular CS zone VI","Japan zone VI","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","36.0","136.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","O [...]
+datafile_rows_t trf_nonpolynomial_row_923[] = {"17807","Japan Plane Rectangular CS zone VII","Japan zone VII","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","36.0","137.1","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG", [...]
+datafile_rows_t trf_nonpolynomial_row_924[] = {"17808","Japan Plane Rectangular CS zone VIII","Japan zone VIII","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","36.0","138.3","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG [...]
+datafile_rows_t trf_nonpolynomial_row_925[] = {"17809","Japan Plane Rectangular CS zone IX","Japan zone IX","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","36.0","139.5","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","O [...]
+datafile_rows_t trf_nonpolynomial_row_926[] = {"17810","Japan Plane Rectangular CS zone X","Japan zone X","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","40.0","140.5","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Ori [...]
+datafile_rows_t trf_nonpolynomial_row_927[] = {"17811","Japan Plane Rectangular CS zone XI","Japan zone XI","","","Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.","9807","44.0","140.15","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/ima [...]
+datafile_rows_t trf_nonpolynomial_row_928[] = {"17812","Japan Plane Rectangular CS zone XII","Japan zone XII","","","Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.","9807","44.0","142.15","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/i [...]
+datafile_rows_t trf_nonpolynomial_row_929[] = {"17813","Japan Plane Rectangular CS zone XIII","Japan zone XIII","","","Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.","9807","44.0","144.15","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum [...]
+datafile_rows_t trf_nonpolynomial_row_930[] = {"17814","Japan Plane Rectangular CS zone XIV","Japan zone XIV","","","Japan - Tokyo-to south of 28 deg N & between 140 deg 30 min & 143 deg E.","9807","26.0","142.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_931[] = {"17815","Japan Plane Rectangular CS zone XV","Japan zone XV","","","Japan - Okinawa-ken between 126 deg &130 deg E.","9807","26.0","127.3","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_932[] = {"17816","Japan Plane Rectangular CS zone XVI","Japan zone XVI","","","Japan - Okinawa-ken west of 126 deg E.","9807","26.0","124.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_933[] = {"17817","Japan Plane Rectangular CS zone XVII","Japan zone XVII","","","Japan - Okinawa-ken east of 130 deg E.","9807","26.0","131.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_934[] = {"17818","Japan Plane Rectangular CS zone XVIII","Japan zone XVIII","","","Japan - Tokyo-to south of 28 N & west of 140 deg 30 min E.","9807","20.0","136.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_935[] = {"17819","Japan Plane Rectangular CS zone XIX","Japan zone XIX","","","Japan - Tokyo-to south of 28 N & east of 143 deg E.","9807","26.0","154.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_936[] = {"18011","Nord Algerie (ancienne)","","","","Algeria north of 38.5g (34 deg 39 min) North.","9801","40.0","3.0","","","0.999625544","500000.0","300000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","Used with Voirol 1875 datum - now superseded.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_937[] = {"18012","Sud Algerie (ancienne)","","","","Algeria 35g to 38.5g (31 deg 30 min to 34 deg 39 min) North.","9801","37.0","3.0","","","0.999625769","500000.0","300000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","Used with Voirol 1875 datum - now superseded.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_938[] = {"18021","Nord Algerie","","","","Algeria north of 38.5g (34 deg 39 min) North.","9801","40.0","3.0","","","0.999625544","500135.0","300090.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","Use with Voirol Unifie 1960 datum.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_939[] = {"18022","Sud Algerie","","","","Algeria 35g to 38.5g (31 deg 30 min to 34 deg 39 min) North.","9801","37.0","3.0","","","0.999625769","500135.0","300090.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","Use with Voirol Unifie 1960 datum.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_940[] = {"18031","Argentina zone 1","Argentina 1","","","Argentina west of 70 deg 30 min West.","9807","-90.0","-72.0","","","1.0","1500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_941[] = {"18032","Argentina zone 2","Argentina 2","","","Argentina between 70 deg 30 min and 67 deg 30 min West.","9807","-90.0","-69.0","","","1.0","2500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_942[] = {"18033","Argentina zone 3","Argentina 3","","","Argentina between 67 deg 30 min and 64 deg 30 min West.","9807","-90.0","-66.0","","","1.0","3500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_943[] = {"18034","Argentina zone 4","Argentina 4","","","Argentina between 64 deg 30 min and 61 deg 30 min West.","9807","-90.0","-63.0","","","1.0","4500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_944[] = {"18035","Argentina zone 5","Argentina 5","","","Argentina between 61 deg 30 min and 58 deg 30 min West.","9807","-90.0","-60.0","","","1.0","5500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_945[] = {"18036","Argentina zone 6","Argentina 6","","","Argentina between 58 deg 30 min and 55 deg 30 min West.","9807","-90.0","-57.0","","","1.0","6500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_946[] = {"18037","Argentina zone 7","Argentina 7","","","Argentina east of 55 deg 30 min West.","9807","-90.0","-54.0","","","1.0","7500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_947[] = {"18041","Austria West Zone","","","","Austria west of 11deg 50min East of Greenwich (29deg 30min E of Ferro).","9807","0.0","28.0","","","1.0","0.0","0.0","9001","9102","8909","","","","","1997-04-11 00:00:00","","EPSG","Superseded by M28 (EPSG code 18044).","95.30 96.29 97.01 98.48",NULL};
+datafile_rows_t trf_nonpolynomial_row_948[] = {"18042","Austria Central Zone","","","","Austria between 11deg 50min and 14deg 50min East of Greenwich (29deg 30min and 32deg 30min East of Ferro).","9807","0.0","31.0","","","1.0","0.0","0.0","9001","9102","8909","","","","","1997-04-11 00:00:00","","EPSG","Superseded by M31 (EPSG code 18045).","95.30 96.29 97.01 98.48",NULL};
+datafile_rows_t trf_nonpolynomial_row_949[] = {"18043","Austria East Zone","","","","Austria east of 14deg 50min East of Greenwich (32deg 30min East of Ferro).","9807","0.0","34.0","","","1.0","0.0","0.0","9001","9102","8909","","","","","1997-04-11 00:00:00","","EPSG","Superseded by M34 (EPSG code 18046).","95.30 96.29 97.01 98.48",NULL};
+datafile_rows_t trf_nonpolynomial_row_950[] = {"18044","Austria M28","M28","","","Austria west of 11deg 50min East of Greenwich (29deg 30min E of Ferro).","9807","0.0","10.2","","","1.0","150000.0","0.0","9001","9110","8901","","","","","1999-10-20 00:00:00","Bundesamt f�r Eich- und Vermessungswesen","EPSG","Supersedes Austria West zone (EPSG code 18041).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_951[] = {"18045","Austria M31","M31","","","Austria between 11deg 50min and 14deg 50min East of Greenwich (29deg 30min and 32deg 30min East of Ferro).","9807","0.0","13.2","","","1.0","450000.0","0.0","9001","9110","8901","","","","","1999-10-20 00:00:00","Bundesamt f�r Eich- und Vermessungswesen","EPSG","Supersedes Austria Central zone (EPSG code 18042).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_952[] = {"18046","Austria M34","M34","","","Austria east of 14deg 50min East of Greenwich (32deg 30min East of Ferro).","9807","0.0","16.2","","","1.0","750000.0","0.0","9001","9110","8901","","","","","1999-10-20 00:00:00","Bundesamt f�r Eich- und Vermessungswesen","EPSG","Supersedes Austria East zone (EPSG code 18043).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_953[] = {"18051","Colombia West zone","Colombia 3W","","","Colombia west of 1 deg 30 min W of Bogota (75d 34m 51.30s W of Greenwich).","9807","4.355657","-77.04513","","","1.0","1000000.0","1000000.0","9001","9110","8901","","","","","1997-04-11 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula. Zone name sometimes referred to as \"6 west\".","95.30 96.29 97.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_954[] = {"18052","Colombia Bogota zone","Colombia Bogota","","","Colombia 1 deg 30 min W to 1 deg 30 min E of Bogota (75d 35m W to 72d 35m W of Greenwich).","9807","4.355657","-74.04513","","","1.0","1000000.0","1000000.0","9001","9110","8901","","","","","1997-04-11 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30 96.29 97.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_955[] = {"18053","Colombia East Central zone","Colombia 3E","","","Colombia 1 deg 30 min to 4 deg 30 min E of Bogota (72d 35m to 69d 34m W of Greenwich).","9807","4.355657","-71.04513","","","1.0","1000000.0","1000000.0","9001","9110","8901","","","","","1997-04-11 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula. Zone name sometimes referred to as \"3 east\".","95.30 96.29 97.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_956[] = {"18054","Colombia East zone","Colombia 6E","","","Colombia east of 4 deg 30 min E of Bogota (69d 34m 51.3s W of Greenwich).","9807","4.355657","-68.04513","","","1.0","1000000.0","1000000.0","9001","9110","8901","","","","","1997-04-11 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula. Zone name sometimes referred to as \"6 east\".","95.30 96.29 97.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_957[] = {"18061","Cuba Norte","","","","Cuba","9801","22.21","-81.0","","","0.99993602","500000.0","280296.016","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_958[] = {"18062","Cuba Sur","","","","Cuba","9801","20.43","-76.5","","","0.99994848","500000.0","229126.939","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_959[] = {"18071","Egypt Blue Belt","Blue Belt","","","Egypt - Sinai peninsula.","9807","30.0","35.0","","","1.0","300000.0","1100000.0","9001","9102","8901","","","","","1999-04-22 00:00:00","","EPSG","Also known as Green Belt.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_960[] = {"18072","Egypt Red Belt","Red Belt","","","Egypt east of 29 deg East.","9807","30.0","31.0","","","1.0","615000.0","810000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_961[] = {"18073","Egypt Purple Belt","Purple Belt","","","Egypt west of 29 deg East; north of approx 28 deg 11 min North.","9807","30.0","27.0","","","1.0","700000.0","200000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_962[] = {"18074","Egypt Extended Purple Belt","Extended Purple Belt","","","Egypt west of 29 deg East; south of approx 28 deg 11 min North.","9807","30.0","27.0","","","1.0","700000.0","1200000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_963[] = {"18081","France I","","","","France north of 53.5 grads (48 deg 09 min) North.","9801","55.0","0.0","","","0.999877341","600000.0","1200000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Introduced 1972. See 18091.","95.26",NULL};
+datafile_rows_t trf_nonpolynomial_row_964[] = {"18082","France II","","","","France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.","9801","52.0","0.0","","","0.99987742","600000.0","2200000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Introduced 1972. See 18092.","95.26",NULL};
+datafile_rows_t trf_nonpolynomial_row_965[] = {"18083","France III","","","","France south of 50.5 grads (45 deg 27 min) North.","9801","49.0","0.0","","","0.999877499","600000.0","3200000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Introduced 1972. See 18093.","95.26",NULL};
+datafile_rows_t trf_nonpolynomial_row_966[] = {"18084","France IV","","","","France - Corsica.","9801","46.85","0.0","","","0.99994471","234.358","4185861.369","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Introduced 1972. See 18094.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_967[] = {"18091","Nord France","","","","France north of 53.5 grads (48 deg 09 min) North.","9801","55.0","0.0","","","0.999877341","600000.0","200000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Superseded by 18081 from 1972.","95.26",NULL};
+datafile_rows_t trf_nonpolynomial_row_968[] = {"18092","Centre France","","","","France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.","9801","52.0","0.0","","","0.99987742","600000.0","200000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Superseded by 18082 from 1972.","95.26",NULL};
+datafile_rows_t trf_nonpolynomial_row_969[] = {"18093","Sud France","","","","France south of 50.5 grads (45 deg 27 min) North.","9801","49.0","0.0","","","0.999877499","600000.0","200000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Superseded by 18083 from 1972.","95.26",NULL};
+datafile_rows_t trf_nonpolynomial_row_970[] = {"18094","Corse","","","","France - Corsica.","9801","46.85","0.0","","","0.99994471","234.358","185861.369","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Superseded by 18084 from 1972.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_971[] = {"18101","Germany zone 1","","","","Germany - onshore west of 4 deg 30 min East.","9807","0.0","3.0","","","1.0","1500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_972[] = {"18102","Germany zone 2","","","","Germany - onshore between 4 deg 30 min and 7 deg 30 min East.","9807","0.0","6.0","","","1.0","2500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_973[] = {"18103","Germany zone 3","","","","Germany - onshore between 7 deg 30 min and 10 deg 30 min East.","9807","0.0","9.0","","","1.0","3500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_974[] = {"18104","Germany zone 4","","","","Germany - onshore between 10 deg 30 min and 13 deg 30 min East.","9807","0.0","12.0","","","1.0","4500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_975[] = {"18105","Germany zone 5","","","","Germany - onshore between 13 deg 30 min and 16 deg 30 min East.","9807","0.0","15.0","","","1.0","5500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_976[] = {"18110","India zone 0","","","","Pakistan north of 35 deg 35 min North.","9801","39.3","68.0","","","0.99846154","2355500.0","2590000.0","9084","9110","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","95.30 96.01 96.02 96.29 97.23",NULL};
+datafile_rows_t trf_nonpolynomial_row_977[] = {"18111","India zone I","","","","India north of 28 deg North. Pakistan 28 deg to 35 deg 35 min North.","9801","32.3","68.0","","","0.99878641","3000000.0","1000000.0","9084","9110","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","95.30 96.02 [...]
+datafile_rows_t trf_nonpolynomial_row_978[] = {"18112","India zone IIa","","","","India - between 21 deg and 28 deg North and west of 82 deg East; Pakistan - south of 28 deg North.","9801","26.0","74.0","","","0.99878641","3000000.0","1000000.0","9084","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion [...]
+datafile_rows_t trf_nonpolynomial_row_979[] = {"18113","India zone IIb","India zone II b","","","Bangladesh; India - north of 21 deg North and east of 82 deg East; Myanmar (Burma) - north of 21 deg North.","9801","26.0","90.0","","","0.99878641","3000000.0","1000000.0","9084","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas [...]
+datafile_rows_t trf_nonpolynomial_row_980[] = {"18114","India zone IIIa","India zone IIIa","","","India - between 15 deg and 21 deg North.","9801","19.0","80.0","","","0.99878641","3000000.0","1000000.0","9084","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","95.28 96.02 97.23",NULL};
+datafile_rows_t trf_nonpolynomial_row_981[] = {"18115","India zone IIIb","","","","Myanmar (Burma) - between 15 deg and 21 deg North.","9801","19.0","100.0","","","0.99878641","3000000.0","1000000.0","9084","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","95.28 96.02 97.23",NULL};
+datafile_rows_t trf_nonpolynomial_row_982[] = {"18116","India zone IVa","India zone Iva","","","India - south of 15 deg North.","9801","12.0","80.0","","","0.99878641","3000000.0","1000000.0","9084","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","95.28 96.02 97.23",NULL};
+datafile_rows_t trf_nonpolynomial_row_983[] = {"18117","India zone IVb","","","","Myanmar - south of 15 deg North.","9801","12.0","100.0","","","0.99878641","3000000.0","1000000.0","9084","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","95.28 96.02 97.23",NULL};
+datafile_rows_t trf_nonpolynomial_row_984[] = {"18121","Italy zone 1","","","","Italy west of 12 deg East (of Greenwich).","9807","0.0","9.0","","","0.9996","1500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Boaga formula","",NULL};
+datafile_rows_t trf_nonpolynomial_row_985[] = {"18122","Italy zone 2","","","","Italy east of 12 deg East (of Greenwich).","9807","0.0","15.0","","","0.9996","2520000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Boaga formula","",NULL};
+datafile_rows_t trf_nonpolynomial_row_986[] = {"18131","Nord Maroc","","","","Morocco north of 35 grads (31 deg 30 min) North.","9801","37.0","-6.0","","","0.999625769","500000.0","300000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","A projection with the same parameter values used the Lambert Conic Near-Conformal method (EPSG code 9817) prior to 1953.","99.203",NULL};
+datafile_rows_t trf_nonpolynomial_row_987[] = {"18132","Sud Maroc","","","","Morocco 31gr to 35gr (27 deg 54 min to 31 deg 30 min) North.","9801","33.0","-6.0","","","0.999615596","500000.0","300000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","A projection with the same parameter values used the Lambert Conic Near-Conformal method (EPSG code 9817) prior to 1953.","99.203",NULL};
+datafile_rows_t trf_nonpolynomial_row_988[] = {"18133","Sahara","","","","Morocco south of 31gr (27 deg 54 min) North.","9801","29.0","-6.0","","","0.9996","1200000.0","400000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","IGN Paris","EPSG","Created in 1977 to cover Sahara Marocain (ex Spanish Sahara)","",NULL};
+datafile_rows_t trf_nonpolynomial_row_989[] = {"18141","New Zealand North Island National Grid","North Island Grid","","","New Zealand - North Island.","9807","-39.0","175.3","","","1.0","300000.0","400000.0","9040","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","Superseded by New Zealand Map Grid.","95.30 96.29 97.231",NULL};
+datafile_rows_t trf_nonpolynomial_row_990[] = {"18142","New Zealand South Island National Grid","South Island Grid","","","New Zealand - South Island.","9807","-44.0","171.3","","","1.0","500000.0","500000.0","9040","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","Superseded by New Zealand Map Grid.","95.30 96.29 97.231",NULL};
+datafile_rows_t trf_nonpolynomial_row_991[] = {"18151","Nigeria West Belt","","","","Nigeria west of 6 deg 30 min East.","9807","4.0","4.3","","","0.99975","230738.26","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_992[] = {"18152","Nigeria Mid Belt","","","","Nigeria between 6 deg 30 min and 10 deg 30 min East.","9807","4.0","8.3","","","0.99975","670553.98","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_993[] = {"18153","Nigeria East Belt","","","","Nigeria east of 10 deg 30 min East.","9807","4.0","12.3","","","0.99975","1110369.7","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_994[] = {"18161","Peru west zone","","","","Peru west of 79 deg West.","9807","-6.0","-80.3","","","0.99983008","222000.0","1426834.743","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_995[] = {"18162","Peru central zone","","","","Peru 79 to 73 deg West.","9807","-9.3","-76.0","","","0.99932994","720000.0","1039979.159","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_996[] = {"18163","Peru east zone","","","","Peru east of 73 deg West.","9807","-9.3","-70.3","","","0.99952992","1324000.0","1040084.558","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_997[] = {"18171","Philippines zone I","","","","Philippines - west of 118 deg East.","9807","0.0","117.0","","","0.99995","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_998[] = {"18172","Philippines zone II","","","","Philippines - Palawan; Calamian Islands.","9807","0.0","119.0","","","0.99995","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_999[] = {"18173","Philippines zone III","","","","Philippines - Luzon (except SE part); Mindoro.","9807","0.0","121.0","","","0.99995","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1000[] = {"18174","Philippines zone IV","","","","Philippines - SE Luzon; Tablas; Masbate; Panay; Cebu; Negros; W. Mindanao.","9807","0.0","123.0","","","0.99995","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1001[] = {"18175","Philippines zone V","","","","Philippines - E. Mindanao; Bohol; Samar.","9807","0.0","125.0","","","0.99995","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1002[] = {"18181","Nord Tunisie","","","","Tunisia north of 38.5 grads (34 deg 39 min) North.","9801","40.0","11.0","","","0.999625544","500000.0","300000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1003[] = {"18182","Sud Tunisie","","","","Tunisia south of 38.5 grads (34 deg 39 min) North.","9801","37.0","11.0","","","0.999625769","500000.0","300000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1004[] = {"18191","Finland zone 1","","","","Finland - west of 22deg 30min E.","9807","0.0","21.0","","","1.0","1500000.0","0.0","9001","9102","8901","","","","","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1005[] = {"18192","Finland zone 2","","","","Finland - 22deg 30 min to 25deg 30min E.","9807","0.0","24.0","","","1.0","2500000.0","0.0","9001","9102","8901","","","","","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1006[] = {"18193","Finland Uniform Coordinate System","Finland zone 3","","","Finland; Finland - 25 deg 30min E to 28deg 30min E.","9807","0.0","27.0","","","1.0","3500000.0","0.0","9001","9102","8901","","","","","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","Used by Uniform Coordinate System over all country and also by zone 3 of Basic Coordinate System at larger scales.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1007[] = {"18194","Finland zone 4","","","","Finland - east of 28deg 30 min E.","9807","0.0","30.0","","","1.0","4500000.0","0.0","9001","9102","8901","","","","","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1008[] = {"18201","Palestine Grid","","","","Israel; Jordan","9806","31.4402749","35.124349","","","","170251.555","126867.909","9001","9110","8901","","","","","1999-04-22 00:00:00","","EPSG","Also encountered as a Transverse Mercator projection with scale factor of 1. The difference in conversion caused by the change of formula does not exceed 2m within Israel. Within the State of Israel superseded by the Israeli CS Grid (EPSG code 18203).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1009[] = {"18202","Palestine Belt","","","","Israel; Jordan","9807","31.4402749","35.124349","","","1.0","170251.555","1126867.909","9001","9110","8901","","","","","1999-04-22 00:00:00","","EPSG","Originally constructed as the Palestine Grid - EPSG code 18201. Adopted by the US Army Map Service as \"Palestine Belt\" with change of projection method and false northing (FN). Sometimes seen with unchanged FN of 126867.909.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1010[] = {"18203","Israeli CS","ICS","","","Israel","9806","31.4402749","35.124349","","","","170251.555","1126867.909","9001","9110","8901","","","","","1999-10-20 00:00:00","Survey of Israel ftp://ftp.rd.soi.gov.il/doc","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1011[] = {"18204","Israeli TM","ITM","","","Israel","9807","31.4403817","35.1216261","","","1.0000067","219529.584","626907.39","9001","9110","8901","","","","","1999-10-20 00:00:00","Survey of Israel ftp://ftp.rd.soi.gov.il/doc","EPSG","Designed to approximate Israeli CS grid in north-central Israel.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1012[] = {"18211","Guatemala Norte","","","","Guatemala north of 15 deg 50 min North.","9801","16.49","-90.2","","","0.99992226","500000.0","292209.579","9001","9110","8901","","","","","1999-08-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1013[] = {"18212","Guatemala Sud","","","","Guatemala south of 15 deg 50 min North.","9801","14.54","-90.2","","","0.99989906","500000.0","325992.681","9001","9110","8901","","","","","1999-08-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1014[] = {"18221","NGO zone I","","","","Norway - west of 3deg 30min W of Oslo (7deg 13min 22.5sec E of Greenwich).","9807","58.0","-4.4","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1015[] = {"18222","NGO zone II","","","","Norway - between 3deg 30min W and 1deg 10min W of Oslo (7deg 13min 22.5sec E and 9deg 33min 22.5sec E of Greenwich).","9807","58.0","-2.2","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1016[] = {"18223","NGO zone III","","","","Norway - between 1deg 10min W and 1deg 15min E of Oslo (9deg 33min 22.5sec E and 11deg 58min 22.5sec E of Greenwich).","9807","58.0","0.0","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1017[] = {"18224","NGO zone IV","","","","Norway - between 1deg 15min E and 4deg 20min E of Oslo (11deg 58min 22.5sec E and 15deg 03min 22.5sec E of Greenwich).","9807","58.0","2.3","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1018[] = {"18225","NGO zone V","","","","Norway - between 4deg 20min E and 8deg 10min E of Oslo (15deg 03min 22.5sec E and 18deg 53min 22.5sec E of Greenwich).","9807","58.0","6.1","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1019[] = {"18226","NGO zone VI","","","","Norway - between 8deg 10min E and 12deg 10min E of Oslo (18deg 53min 22.5sec E and 22deg 53min 22.5sec E of Greenwich).","9807","58.0","10.1","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1020[] = {"18227","NGO zone VII","","","","Norway - between 12deg 10min E and 16deg 15min E of Oslo (22deg 53min 22.5sec E and 26deg 58min 22.5sec E of Greenwich).","9807","58.0","14.1","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1021[] = {"18228","NGO zone VIII","","","","Norway - east of 16deg 15min E of Oslo (26deg 58min 22.5sec E of Greenwich).","9807","58.0","18.2","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1022[] = {"18231","India zone I (1975 metres)","India zone I","","","India north of 28 deg North.","9801","32.3","68.0","","","0.99878641","2743185.69","914395.23","9001","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1023[] = {"18232","India zone IIa (1975 metres)","India zone II a","","","India - between 21 deg and 28 deg North and west of 82 deg East.","9801","26.0","74.0","","","0.99878641","2743185.69","914395.23","9001","9102","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1024[] = {"18233","India zone IIIa (1975 metres)","India zone IIIa","","","India - between 15 deg and 21 deg North.","9801","19.0","80.0","","","0.99878641","2743185.69","914395.23","9001","9102","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1025[] = {"18234","India zone IVa (1975 metres)","India zone IV a","","","India - south of 15 deg North.","9801","12.0","80.0","","","0.99878641","2743185.69","914395.23","9001","9102","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1026[] = {"18235","India zone IIb (1975 metres)","India zone II b","","","India - north of 21 deg North and east of 82 deg East.","9801","26.0","90.0","","","0.99878641","2743185.69","914395.23","9001","9102","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1027[] = {"18236","India zone I (1962 metres)","India zone I","","","Pakistan - north of 28 deg North.","9801","32.3","68.0","","","0.99878641","2743196.4","914398.8","9001","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1028[] = {"18237","India zone IIa (1962 metres)","India zone II a","","","Pakistan - south of 28 deg North.","9801","26.0","74.0","","","0.99878641","2743196.4","914398.8","9001","9102","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1029[] = {"18238","India zone IIb (1937 metres)","India zone II b","","","Bangladesh.","9801","26.0","90.0","","","0.99878641","2743195.5","914398.5","9001","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1030[] = {"19900","Bahrain State Grid","Bahrain Grid","","","Bahrain.","9807","0.0","51.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1031[] = {"19901","Belge Lambert 50","","","","Belgium - onshore.","9802","90.0","0.0","49.5","51.1","","150000.0","5400000.0","9001","9110","8910","","","","","1999-04-22 00:00:00","\"Systemes de reference et formules de transformation en usage en Belgique\"; IGN Brussels","EPSG","","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1032[] = {"19902","Belge Lambert 72","","","","Belgium - onshore.","9803","90.0","4.2124983","49.5","51.1","","150000.01256","5400088.4378","9001","9110","8901","","","","","1999-04-22 00:00:00","\"Systemes de reference et formules de transformation en usage en Belgique\"; IGN Brussels","EPSG","Rotation from Belge Lambert 50 to Belge Lambert 72 is +29.2985sec.","95.30 96.29 99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1033[] = {"19903","Nord de Guerre","","","","France - Alsace.","9801","55.0","6.0","","","0.99950908","500000.0","300000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1034[] = {"19904","Ghana Metre Grid","","","","Ghana.","9807","4.4","-1.0","","","0.99975","274319.51","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1035[] = {"19905","Netherlands East Indies Equatorial Zone","NEIEZ","","","Indonesia.","9804","0.0","110.0","","","0.997","3900000.0","900000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","US Army Map Service projection tables; 1943.","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1036[] = {"19906","Iraq zone","","","","Iran -south of 36 deg North; Iraq; Kuwait.","9801","32.3","45.0","","","0.99878640776699","1500000.0","1166200.0","9001","9110","8901","","","","","1996-04-12 00:00:00","US Army Map Service projection tables; 1943.","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1037[] = {"19907","Iraq National Grid","","","","Iraq.","9807","29.0134566","46.3","","","0.9994","800000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1038[] = {"19908","Irish National Grid","","","","Ireland - onshore. United Kingdom (UK) - Northern Ireland onshore.","9807","53.3","-8.0","","","1.000035","200000.0","250000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1039[] = {"19909","Jamaica (Old Grid)","","","","Jamaica.","9801","18.0","-77.0","","","1.0","550000.0","400000.0","9005","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Superseded by Jamaica (New Grid).","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1040[] = {"19910","Jamaica National Grid","","","","Jamaica.","9801","18.0","-77.0","","","1.0","250000.0","150000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Supersedes Jamaica (Old Grid).","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1041[] = {"19911","Laborde Grid","","","","Madagascar.","9815","-21.0","49.0","21.0","21.0","0.9995","400000.0","800000.0","9001","9105","8903","","","","","1997-11-13 00:00:00","","EPSG","Can also use transformation method 9813.","97.613",NULL};
+datafile_rows_t trf_nonpolynomial_row_1042[] = {"19912","Rectified Skew Orthomorphic Borneo Grid","R.S.O. Borneo","","","Brunei; Malaysia - East Malaysia (Sabah; Sarawak).","9812","4.0","115.0","53.18569537","53.07483685","0.99984","0.0","0.0","9042","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","","95.30 96.29 97.231",NULL};
+datafile_rows_t trf_nonpolynomial_row_1043[] = {"19913","RD Old","","","","Netherlands - onshore.","9809","52.0922178","5.23155","","","0.9999079","0.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","Nederlandse Commissie voor Geodesie publication 30.","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1044[] = {"19914","RD New","","","","Netherlands - onshore.","9809","52.0922178","5.23155","","","0.9999079","155000.0","463000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","Nederlandse Commissie voor Geodesie publication 30.","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1045[] = {"19915","Aden Zone","","","","Yemen.","9801","15.0","45.0","","","0.999365678","1500000.0","1000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","US Army Map Service projection tables; 1943.","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1046[] = {"19916","British National Grid","","","","United Kingdom (UK) - onshore England; Scotland; Wales; Isle of Man.","9807","49.0","-2.0","","","0.999601272","400000.0","-100000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1047[] = {"19917","New Zealand Map Grid","","","","New Zealand.","9811","-41.0","173.0","","","","2510000.0","6023150.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Dept. of Lands and Surveys Technical Circular 1973/32; 23 Nov 1973.","EPSG","Supersedes North and South Island National Grids.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1048[] = {"19919","Qatar National Grid","","","","Qatar.","9807","24.27","51.13","","","0.99999","200000.0","300000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1049[] = {"19920","Singapore Grid","","","","Singapore.","9806","1.1715528","103.5110808","","","","30000.0","30000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30 96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1050[] = {"19921","Spain","","","","Spain.","9801","40.0","0.0","","","0.9988085293","600000.0","600000.0","9001","9102","8905","","","","","1995-12-02 00:00:00","","EPSG","Superseded by UTM","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1051[] = {"19922","Swiss New Grid","LV03","","","Liechtenstein; Switzerland.","9815","46.570866","7.26225","90.0","90.0","1.0","600000.0","200000.0","9001","9110","8901","","","","","1997-11-13 00:00:00","\"Die Projektionen der schweizerischen Plan- und Kartenwerke\"; J. Bolliger 1967","EPSG","","95.30 96.29 97.27 97.612 97.62",NULL};
+datafile_rows_t trf_nonpolynomial_row_1052[] = {"19923","Swiss Old Grid","LV03C","","","Liechtenstein; Switzerland.","9815","46.570866","0.0","90.0","90.0","1.0","0.0","0.0","9001","9110","8907","","","","","1997-11-13 00:00:00","\"Die Projektionen der schweizerischen Plan- und Kartenwerke\"; J. Bolliger 1967","EPSG","Superseded by LV03 (19922).","95.30 96.29 97.612 97.62",NULL};
+datafile_rows_t trf_nonpolynomial_row_1053[] = {"19924","Tobago Grid","","","","Trinidad and Tobago - Tobago.","9806","11.1507843","-60.4109632","","","","187500.0","180000.0","9039","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","","95.30 96.29 97.231",NULL};
+datafile_rows_t trf_nonpolynomial_row_1054[] = {"19925","Trinidad Grid","","","","Trinidad and Tobago - Trinidad.","9806","10.263","-61.2","","","","430000.0","325000.0","9039","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","","95.30 96.29 97.231",NULL};
+datafile_rows_t trf_nonpolynomial_row_1055[] = {"19926","Stereo 70","","","","Romania.","9809","46.0","25.0","","","0.99975","500000.0","500000.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Supersedes Stereo 33 (code 19927).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1056[] = {"19927","Stereo 33","","","","Romania.","9809","45.54","25.23328772","","","0.9996667","500000.0","500000.0","9001","9110","8901","","","","","1996-04-12 00:00:00","","EPSG","Superseded by Stereo 70 (code 19926)","96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1057[] = {"19928","Kuwait TM","KTM","","","Kuwait - Kuwait City.","9807","0.0","48.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1058[] = {"19929","Swedish National Projection","2.5 gon West","","","Sweden.","9807","0.0","15.48298","","","1.0","1500000.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Lantmateriet of Sweden; private communication.","EPSG","Used since 1938 superseding 6 old zones. Longitude of natural origin is 2.5 gon west of Stockholm prime meridian; transformation is also known as \"2.5 gon West of old Stockholm observatory\".","96.29 97.39",NULL};
+datafile_rows_t trf_nonpolynomial_row_1059[] = {"19930","Greek Grid","","","","Greece","9807","0.0","24.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1997-06-16 00:00:00","Geodesy Department; Public Petroleum Corporation of Greece.","EPSG","Created for use with GGRS87.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1060[] = {"19931","Egyseges Orszagos Vetuleti","EOV","","","Hungary","9815","47.08398174","19.02548584","90.0","90.0","0.99993","650000.0","200000.0","9001","9110","8901","","","","","1997-07-22 00:00:00","http://lazarus.elte.hu/gb/geodez/geod2.htm","EPSG","EOV = Uniform National Projection","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1061[] = {"19933","Prince Edward Island Stereographic","PEI Stereographic","","","Canada - Prince Edward Island","9809","47.15","-63.0","","","0.999912","700000.0","400000.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.","EPSG","In use from 1979. To be phased out in late 1990's.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1062[] = {"19934","Lithuania 1994","","","","Lithuania","9807","0.0","24.0","","","0.9998","500000.0","0.0","9001","9102","8901","","","","","1998-03-12 00:00:00","HNIT-BALTIC GeoInfoServisas","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1063[] = {"19935","Rectified Skew Orthomorphic Malaya Grid","R.S.O. Malaya","","","Malaysia - West Malaysia","9812","4.0","102.15","323.01328458","323.07483685","0.99984","40000.0","0.0","9062","9110","8901","","","","","1999-10-20 00:00:00","UK Directorate of Overseas Surveys paper","EPSG","","97.231",NULL};
+datafile_rows_t trf_nonpolynomial_row_1064[] = {"19936","Portuguese National Grid","","","","Portugal onshore.","9807","39.4","1.0","","","1.0","200000.0","300000.0","9001","9110","8902","","","","","1998-11-11 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.30 96.29 98.42",NULL};
+datafile_rows_t trf_nonpolynomial_row_1065[] = {"19937","Tunisia Mining Grid","","","","Tunisia - onshore","9816","38.81973","7.83445","","","","270.0","582.0","9036","9105","8903","","","","","1999-11-15 00:00:00","Mining decree of 1st January 1953","EPSG","Origin: Djebel Kebar","99.81",NULL};
+datafile_rows_t trf_nonpolynomial_row_1066[] = {"19938","Estonian National Grid","","","","Estonia","9802","57.310319415","24.0","59.2","58.0","","500000.0","6375000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","Coordinates at the projection origin match those of TM Baltic 93.","99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1067[] = {"19939","TM Baltic 93","","","","Estonia; Latvia; Lithuania.","9807","0.0","24.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1068[] = {"19940","Levant Zone","","","","Syrian Arab Republic west of 39 deg E.","9817","34.39","37.21","","","0.9996256","300000.0","300000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","US Army Map Service projection tables; 1943.","EPSG","Superseded by projection using full Lambert formula from 1973. (EPSG code 19948).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1069[] = {"19941","Brazil Polyconic","","","","Brazil","9818","0.0","-54.0","","","","5000000.0","10000000.0","9001","9102","8901","","","","","1999-10-20 00:00:00","PetroBras","EPSG","","99.55",NULL};
+datafile_rows_t trf_nonpolynomial_row_1070[] = {"19942","British West Indies Grid","","","","Windward Islands - Dominica Grenada Saint Lucia Saint Vincent; Leeward Islands - Anguilla Antigua (excluding Barbuda) Montserrat Saint Kitts and Nevis; Barbados.","9807","0.0","-62.0","","","0.9995","400000.0","0.0","9001","9102","8901","","","","","1999-04-22 00:00:00","UK Royal Engineers projection tables P10/25, 1943.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1071[] = {"19943","Barbados National Grid","","","","Barbados","9807","13.1035","-59.3335","","","0.9999986","30000.0","75000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","Superseded British West Indies Grid (19942) after 1983.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1072[] = {"19944","Quebec Lambert Projection","","","","Canada - Quebec","9802","44.0","-68.3","60.0","46.0","","0.0","0.0","9001","9110","8901","","","","","1999-10-22 00:00:00","Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1073[] = {"19945","New Brunswick Stereographic (ATS77)","NB Stereographic ATS77","","","Canada - New Brunswick - onshore","9809","46.3","-66.3","","","0.999912","300000.0","800000.0","9001","9110","8901","","","","","1999-10-20 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1979. To be phased out in late 1990's.","99.61",NULL};
+datafile_rows_t trf_nonpolynomial_row_1074[] = {"19946","New Brunswick Stereographic (NAD83)","NB Stereographic NAD83","","","Canada - New Brunswick - onshore","9809","46.3","-66.3","","","0.999912","2500000.0","7500000.0","9001","9110","8901","","","","","1999-10-20 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1999.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1075[] = {"19947","Austria Lambert","","","","Austria","9802","13.2","47.3","49.0","46.0","","400000.0","400000.0","9001","9110","8901","","","","","1999-10-20 00:00:00","Bundesamt f�r Eich- und Vermessungswesen","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1076[] = {"19948","Syria Lambert","","","","Syrian Arab Republic","9801","34.39","37.21","","","0.9996256","300000.0","300000.0","9001","9110","8901","","","","","1999-10-20 00:00:00","IGN Paris","EPSG","Superseded Levant zone (same parameters but using truncated near-conformal method) from 1973.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1077[] = {"19949","Levant Stereographic","","","","Lebanon","9809","38.0","43.5","","","0.9995341","0.0","0.0","9001","9105","8901","","","","","1999-10-20 00:00:00","IGN Paris","EPSG","Used prior to World War II for cadastral and large scale topographic mapping.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1078[] = {"19950","Landesvermessung 1995","LV95","","","Liechtenstein; Switzerland.","9815","46.570866","7.26225","90.0","90.0","1.0","2600000.0","1200000.0","9001","9110","8901","","","","","1999-10-20 00:00:00","Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1079[] = {"19951","Nakhl e Taqi Oblique Mercator","Nakhl e Taqi","","","Iran - Taheri refinery site only.","9815","27.31077837","52.3612741","0.34179803","0.34179803","0.999895934","658377.437","3044969.194","9001","9110","8901","","","","","1999-10-20 00:00:00","Total-Fina","EPSG","Used only for terminal site.","",NULL};
+
+datafile_rows_t *trf_nonpolynomial_rows[] = {trf_nonpolynomial_row_1,trf_nonpolynomial_row_2,trf_nonpolynomial_row_3,trf_nonpolynomial_row_4,trf_nonpolynomial_row_5,trf_nonpolynomial_row_6,trf_nonpolynomial_row_7,trf_nonpolynomial_row_8,trf_nonpolynomial_row_9,trf_nonpolynomial_row_10,trf_nonpolynomial_row_11,trf_nonpolynomial_row_12,trf_nonpolynomial_row_13,trf_nonpolynomial_row_14,trf_nonpolynomial_row_15,trf_nonpolynomial_row_16,trf_nonpolynomial_row_17,trf_nonpolynomial_row_18,trf_no [...]
diff --git a/src/tiff/csv/trf_nonpolynomial.csv b/src/tiff/csv/trf_nonpolynomial.csv
new file mode 100644
index 0000000..17ad8e6
--- /dev/null
+++ b/src/tiff/csv/trf_nonpolynomial.csv
@@ -0,0 +1,1079 @@
+"COORD_TRF_CODE","COORD_TRF_EPSG_NAME","COORD_TRF_EPSG_ABBR","COORD_TRF_USER_NAME","DESCRIPTION","AREA_OF_USE","COORD_TRF_METHOD_CODE","PARAMETER_1","PARAMETER_2","PARAMETER_3","PARAMETER_4","PARAMETER_5","PARAMETER_6","PARAMETER_7","UOM_LENGTH_CODE","UOM_ANGLE_CODE","PRIME_MERIDIAN_CODE","UOM_SCALE_CODE","PARAMETER_35","PARAMETER_36","PARAMETER_37","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+1100,Adindan to WGS 84 (1),,,,MEAN FOR Ethiopia; Sudan.,9603,-166.0,-15.0,204.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1101,Adindan to WGS 84 (2),,,,Burkina Faso.,9603,-118.0,-14.0,218.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1102,Adindan to WGS 84 (3),,,,Cameroon.,9603,-134.0,-2.0,210.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1103,Adindan to WGS 84 (4),,,,Ethiopia.,9603,-165.0,-11.0,206.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1104,Adindan to WGS 84 (5),,,,Mali.,9603,-123.0,-20.0,220.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1105,Adindan to WGS 84 (6),,,,Senegal.,9603,-128.0,-18.0,224.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1106,Adindan to WGS 84 (7),,,,Sudan.,9603,-161.0,-14.0,205.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1107,Afgooye to WGS 84 (1),,,,Somalia.,9603,-43.0,-163.0,45.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1108,AGD66 to WGS 84 (1),,,,Australia.,9603,-133.0,-48.0,148.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1109,AGD84 to WGS 84 (1),,,,Australia.,9603,-134.0,-48.0,149.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1110,Ain el Abd to WGS 84 (1),,,,Bahrain.,9603,-150.0,-250.0,-1.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,97.06
+1111,Ain el Abd to WGS 84 (2),,,,Saudi Arabia.,9603,-143.0,-236.0,7.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1112,Amersfoort to WGS 84 (1),,,,Netherlands.,9606,593.16,26.15,478.54,-6.3239,-0.5008,-5.5487,4.0775,9001,9109,,9202,,,,1997-04-11 00:00:00,Nederlandse Commissie voor Geodesie publication 30; 1993.,EPSG,,97.07
+1113,Arc 1950 to WGS 84 (1),,,,MEAN FOR Botswana; Lesotho; Malawi; Swaziland; Zaire; Zambia; Zimbabwe.,9603,-143.0,-90.0,-294.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1114,Arc 1950 to WGS 84 (2),,,,Botswana.,9603,-138.0,-105.0,-289.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1115,Arc 1950 to WGS 84 (3),,,,Burundi.,9603,-153.0,-5.0,-292.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1116,Arc 1950 to WGS 84 (4),,,,Lesotho.,9603,-125.0,-108.0,-295.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1117,Arc 1950 to WGS 84 (5),,,,Malawi.,9603,-161.0,-73.0,-317.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1118,Arc 1950 to WGS 84 (6),,,,Swaziland.,9603,-134.0,-105.0,-295.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1119,Arc 1950 to WGS 84 (7),,,,Zaire.,9603,-169.0,-19.0,-278.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1120,Arc 1950 to WGS 84 (8),,,,Zambia.,9603,-147.0,-74.0,-283.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1121,Arc 1950 to WGS 84 (9),,,,Zimbabwe.,9603,-142.0,-96.0,-293.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1122,Arc 1960 to WGS 84 (1),,,,MEAN FOR Kenya; Tanzania.,9603,-160.0,-6.0,-302.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1123,Batavia to WGS 84 (1),,,,Indonesia (Sumatra).,9603,-377.0,681.0,-50.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1124,Bermuda 1957 to WGS 84 (1),,,,Bermuda.,9603,-73.0,213.0,296.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1125,Bogota to WGS 84 (1),,,,Colombia.,9603,307.0,304.0,-318.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1126,Bukit Rimpah to WGS 84 (1),,,,Indonesia (Bangka & Belitung Islands).,9603,-384.0,664.0,-48.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1127,Campo Inchauspe to WGS 84 (1),,,,Argentina.,9603,-148.0,136.0,90.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1128,Cape to WGS 84 (1),,,,South Africa.,9603,-136.0,-108.0,-292.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1129,Cape to WGS 84 (2),,,,South Africa.,9603,-134.73,-110.92,-292.66,,,,,9001,,,,,,,1996-10-18 00:00:00,"Private Communication, Directorate of Surveys and Land Information, Cape Town.",EPSG,,
+1130,Carthage to WGS 84 (1),,,,Tunisia.,9603,-263.0,6.0,431.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1131,Chua to WGS 84 (1),,,,Paraguay.,9603,-134.0,229.0,-29.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1132,Corrego Alegre to WGS 84 (1),,,,Brazil.,9603,-206.0,172.0,-6.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1133,ED50 to WGS 84 (1),,,,MEAN FOR Austria; Belgium; Denmark; Finland; France; Germany (west); Gibraltar; Greece; Italy; Luxembourg; Netherlands; Norway; Portugal; Spain; Sweden; Switzerland.,9603,-87.0,-98.0,-121.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,97.02
+1134,ED50 to WGS 84 (2),,,,MEAN FOR Austria; Denmark; France; Germany (west); Netherlands; Switzerland.,9603,-87.0,-96.0,-120.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1135,ED50 to WGS 84 (3),,,,MEAN FOR Iraq; Israel; Jordan; Lebanon; Kuwait; Saudi Arabia; Syria.,9603,-103.0,-106.0,-141.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1136,ED50 to WGS 84 (4),,,,Cyprus.,9603,-104.0,-101.0,-140.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1137,ED50 to WGS 84 (5),,,,Egypt.,9603,-130.0,-117.0,-151.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1138,ED50 to WGS 84 (6),,,,Ireland; United Kingdom (UK).,9603,-86.0,-96.0,-120.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1139,ED50 to WGS 84 (7),,,,Finland; Norway.,9603,-87.0,-95.0,-120.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1140,ED50 to WGS 84 (8),,,,Greece.,9603,-84.0,-95.0,-130.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1141,ED50 to WGS 84 (9),,,,Iran.,9603,-117.0,-132.0,-164.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1142,ED50 to WGS 84 (10),,,,Italy (Sardinia).,9603,-97.0,-103.0,-120.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1143,ED50 to WGS 84 (11),,,,Italy (Sicily).,9603,-97.0,-88.0,-135.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1144,ED50 to WGS 84 (12),,,,Malta.,9603,-107.0,-88.0,-149.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1145,ED50 to WGS 84 (13),,,,Portugal; Spain.,9603,-84.0,-107.0,-120.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1146,ED87 to WGS 84 (1),,,,Denmark - North Sea; Germany - North Sea; Netherlands - offshore; Norway; United Kingdom (UKCS) - North Sea south of 62 deg N.,9606,-82.981,-99.719,-110.709,-0.5076,0.1503,0.3898,-0.3143,9001,9109,,9202,,,,1997-04-11 00:00:00,"Norwegian Mapping Authority publication 1990:1 and note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\"",EPSG,,97.03 97.04
+1147,ED50 to ED87 (2),,,,Norway - offshore north of 65 deg N.,9606,-1.51,-0.84,-3.5,-1.893,-0.687,-2.764,0.609,9001,9109,,9202,,,,1997-04-11 00:00:00,"Norwegian Mapping Authority note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\"",EPSG,,97.04
+1148,Egypt 1907 to WGS 84 (1),,,,Egypt.,9603,-130.0,110.0,-13.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1149,ETRF89 to WGS 84 (1),,,,Europe.,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1997-06-16 00:00:00,EPSG,EPSG,ETRF89 is a realisation of WGS84 coincident to within 1.5 metres. This transformation has an accuracy equal to the coincidence figure.,97.24
+1150,GDA94 to WGS 84 (1),,,,Australia.,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1996-10-18 00:00:00,EPSG,EPSG,GDA94 is a realisation of WGS84 coincident to within 1.5 metres. This transformation has an accuracy equal to the coincidence figure.,
+1151,GD49 to WGS 84 (1),,,,New Zealand.,9603,84.0,-22.0,209.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1152,Hu Tzu Shan to WGS 84 (1),,,,Taiwan.,9603,-637.0,-549.0,-203.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1153,Indian 1954 to WGS 84 (1),,,,Thailand.,9603,217.0,823.0,299.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,97.06
+1154,Indian 1975 to WGS 84 (1),,,,Thailand.,9603,209.0,818.0,290.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 second edition September 1991,EPSG,,
+1155,Kalianpur 1937 to WGS 84 (1),,,,Bangladesh.,9603,282.0,726.0,254.0,,,,,9001,,,,,,,1999-10-20 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,97.235
+1156,Kalianpur 1975 to WGS 84 (1),,,,India; Nepal.,9603,295.0,736.0,257.0,,,,,9001,,,,,,,1999-10-20 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,Care! DMA ellipsoid is inconsistent with EPSG ellipsoid - transformation parameter values may not be appropriate.,97.235
+1157,Kandawala to WGS 84 (1),,,,Sri Lanka.,9603,-97.0,787.0,86.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1158,Kertau to WGS 84 (1),,,,Malaysia - West Malaysia; Singapore.,9603,-11.0,851.0,5.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1159,Leigon to WGS 84 (1),,,,Ghana.,9603,-130.0,29.0,364.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1160,Liberia 1964 to WGS 84 (1),,,,Liberia.,9603,-90.0,40.0,88.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1161,Luzon 1911 to WGS 84 (1),,,,Philippines (excluding Mindanao).,9603,-133.0,-77.0,-51.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1162,Luzon 1911 to WGS 84 (2),,,,Philippines (Mindanao).,9603,-133.0,-79.0,-72.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1163,M'poraloko to WGS 84 (1),,,,Gabon.,9603,-74.0,-130.0,42.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1164,Mahe 1971 to WGS 84 (1),,,,Seychelles - Mahe Island.,9603,41.0,-220.0,-134.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1165,Massawa to WGS 84 (1),,,,Ethiopia (Eritrea).,9603,639.0,405.0,60.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1166,Merchich to WGS 84 (1),,,,Morocco.,9603,31.0,146.0,47.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1167,Minna to WGS 84 (1),,,,Cameroon.,9603,-81.0,-84.0,115.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1168,Minna to WGS 84 (2),,,,Nigeria.,9603,-92.0,-93.0,122.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1169,Monte Mario to WGS 84 (1),,,,Italy (Sardinia).,9603,-225.0,-65.0,9.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1170,NAD27 to WGS 84 (1),,,,MEAN FOR Antigua; Barbados; Barbuda; Caicos Islands; Cuba; Dominican Republic; Grand Cayman; Jamaica; Turks Islands.,9603,-3.0,142.0,183.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1171,NAD27 to WGS 84 (2),,,,MEAN FOR Belize; Costa Rica; El Salvador; Guatemala; Honduras; Nicaragua.,9603,0.0,125.0,194.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1172,NAD27 to WGS 84 (3),,,,MEAN FOR Canada.,9603,-10.0,158.0,187.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1173,NAD27 to WGS 84 (4),,,,MEAN FOR United States (USA) (CONUS).,9603,-8.0,160.0,176.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1174,NAD27 to WGS 84 (5),,,,MEAN FOR United States (USA) (CONUS East of Mississippi River including Louisiana; Missouri; Minnesota).,9603,-9.0,161.0,179.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1175,NAD27 to WGS 84 (6),,,,MEAN FOR United States (USA) (CONUS West of Mississippi River).,9603,-8.0,159.0,175.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1176,NAD27 to WGS 84 (7),,,,United States (USA) - Alaska (Excluding Aleutian Islands).,9603,-5.0,135.0,172.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1177,NAD27 to WGS 84 (8),,,,Bahamas (Except San Salvador Island).,9603,-4.0,154.0,178.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1178,NAD27 to WGS 84 (9),,,,Bahamas (San Salvador Island).,9603,1.0,140.0,165.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1179,NAD27 to WGS 84 (10),,,,Canada (Alberta; British Columbia).,9603,-7.0,162.0,188.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1180,NAD27 to WGS 84 (11),,,,Canada (Manitoba; Ontario).,9603,-9.0,157.0,184.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1181,NAD27 to WGS 84 (12),,,,Canada (New Brunswick; Newfoundland; Nova Scotia; Quebec).,9603,-22.0,160.0,190.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1182,NAD27 to WGS 84 (13),,,,Canada (Northwest Territories; Nunavut; Saskatchewan).,9603,4.0,159.0,188.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1183,NAD27 to WGS 84 (14),,,,Canada (Yukon).,9603,-7.0,139.0,181.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1184,NAD27 to WGS 84 (15),,,,Panama - Canal Zone.,9603,0.0,125.0,201.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1185,NAD27 to WGS 84 (16),,,,Cuba.,9603,-9.0,152.0,178.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1186,NAD27 to WGS 84 (17),,,,Greenland (Hayes Peninsula).,9603,11.0,114.0,195.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1187,NAD27 to WGS 84 (18),,,,Mexico.,9603,-12.0,130.0,190.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1188,NAD83 to WGS 84 (1),,,,Canada; Central America; Mexico; United States (USA) (Alaska (excluding Aleutian Islands); CONUS).,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,NAD83 is a realisation of WGS84 coincident to within 1.5 metres. This transformation has an accuracy equal to the coincidence figure.,97.06
+1189,Nahrwan 1967 to WGS 84 (1),,,,Oman (Masirah Island).,9603,-247.0,-148.0,369.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1190,Nahrwan 1967 to WGS 84 (2),,,,Saudi Arabia.,9603,-243.0,-192.0,477.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1191,Nahrwan 1967 to WGS 84 (3),,,,United Arab Emirates (UAE).,9603,-249.0,-156.0,381.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1192,Naparima 1972 to WGS 84 (1),,,,Trinidad and Tobago.,9603,-10.0,375.0,165.0,,,,,9001,,,,,,,1998-06-30 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,CAUTION: EPSG believes that these parameter values include a blunder and that if NIMA transformation parameters are to be used the 1987 version (EPSG code 1307) be used.,98.102
+1193,NTF to WGS 84 (1),,,,France.,9603,-168.0,-60.0,320.0,,,,,9001,,,,,,,1996-10-18 00:00:00,IGN technical report RT/G 14; January 1988.,EPSG,,
+1195,OSGB 1936 to WGS 84 (1),,,,MEAN FOR United Kingdom (UK) - Great Britain (England; Scotland; Wales); Isle of Man.,9603,375.0,-111.0,431.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1196,OSGB 1936 to WGS 84 (2),,,,United Kingdom (UK) - England.,9603,371.0,-112.0,434.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1197,OSGB 1936 to WGS 84 (3),,,,United Kingdom (UK) - England; Wales; Isle of Man.,9603,371.0,-111.0,434.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1198,OSGB 1936 to WGS 84 (4),,,,United Kingdom (UK) - Scotland (including Shetland Islands).,9603,384.0,-111.0,425.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1199,OSGB 1936 to WGS 84 (5),,,,United Kingdom (UK) - Wales.,9603,370.0,-108.0,434.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1200,Pointe Noire to WGS 84 (1),,,,Congo.,9603,-148.0,51.0,-291.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1201,PSAD56 to WGS 84 (1),,,,MEAN FOR Bolivia; Chile; Colombia; Ecuador; Guyana; Peru; Venezuela.,9603,-288.0,175.0,-376.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1202,PSAD56 to WGS 84 (2),,,,Bolivia.,9603,-270.0,188.0,-388.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1203,PSAD56 to WGS 84 (3),,,,Chile (Northern; near 19 deg S).,9603,-270.0,183.0,-390.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1204,PSAD56 to WGS 84 (4),,,,Chile (Southern; near 43 deg S).,9603,-305.0,243.0,-442.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1205,PSAD56 to WGS 84 (5),,,,Colombia.,9603,-282.0,169.0,-371.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1206,PSAD56 to WGS 84 (6),,,,Ecuador.,9603,-278.0,171.0,-367.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1207,PSAD56 to WGS 84 (7),,,,Guyana.,9603,-298.0,159.0,-369.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1208,PSAD56 to WGS 84 (8),,,,Peru.,9603,-279.0,175.0,-379.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1209,PSAD56 to WGS 84 (9),,,,Venezuela.,9603,-295.0,173.0,-371.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1210,Qatar to WGS 84 (1),,,,Qatar.,9603,-128.0,-283.0,22.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1211,Qornoq to WGS 84 (1),,,,Greenland (South).,9603,164.0,138.0,-189.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1212,SAD69 to WGS 84 (1),,,,MEAN FOR Argentina; Bolivia; Brazil; Chile; Colombia; Ecuador; Guyana; Paraguay; Peru; Trinidad & Tobago; Venezuela.,9603,-57.0,1.0,-41.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1213,SAD69 to WGS 84 (2),,,,Argentina.,9603,-62.0,-1.0,-37.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1214,SAD69 to WGS 84 (3),,,,Bolivia.,9603,-61.0,2.0,-48.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1215,SAD69 to WGS 84 (4),,,,Brazil.,9603,-60.0,-2.0,-41.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1216,SAD69 to WGS 84 (5),,,,Chile.,9603,-75.0,-1.0,-44.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1217,SAD69 to WGS 84 (6),,,,Colombia.,9603,-44.0,6.0,-36.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1218,SAD69 to WGS 84 (7),,,,Ecuador.,9603,-48.0,3.0,-44.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1219,SAD69 to WGS 84 (8),,,,Ecuador (Baltra; Galapagos).,9603,-47.0,26.0,-42.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1220,SAD69 to WGS 84 (9),,,,Guyana.,9603,-53.0,3.0,-47.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1221,SAD69 to WGS 84 (10),,,,Paraguay.,9603,-61.0,2.0,-33.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1222,SAD69 to WGS 84 (11),,,,Peru.,9603,-58.0,0.0,-44.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1223,SAD69 to WGS 84 (12),,,,Trinidad and Tobago.,9603,-45.0,12.0,-33.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1224,SAD69 to WGS 84 (13),,,,Venezuela.,9603,-45.0,8.0,-33.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1225,Sapper Hill 1943 to WGS 84 (1),,,,Falkland Islands - East Falkland Island.,9603,-355.0,21.0,72.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1226,Schwarzeck to WGS 84 (1),,,,Namibia.,9603,616.0,97.0,-251.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1227,Tananarive to WGS 84 (1),,,,Madagascar.,9603,-189.0,-242.0,-91.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1228,Timbalai 1948 to WGS 84 (1),,,,Brunei; Malaysia (Sabah; Sarawak).,9603,-679.0,669.0,-48.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1229,TM65 to WGS 84 (1),,,,Ireland.,9603,506.0,-122.0,611.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1230,Tokyo to WGS 84 (1),,,,MEAN FOR Japan; South Korea; Okinawa.,9603,-148.0,507.0,685.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,97.06
+1231,Tokyo to WGS 84 (2),,,,Japan.,9603,-148.0,507.0,685.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1232,Tokyo to WGS 84 (3),,,,South Korea.,9603,-146.0,507.0,687.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,97.06
+1233,Tokyo to WGS 84 (4),,,,Japan (Okinawa).,9603,-158.0,507.0,676.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1234,Yacare to WGS 84 (1),,,,Uruguay.,9603,-155.0,171.0,37.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1235,Zanderij to WGS 84 (1),,,,Suriname.,9603,-265.0,120.0,-358.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,,
+1236,AGD84 to WGS 84 (2),,,,Australia.,9607,-116.0,-50.47,141.69,-0.23,-0.39,-0.344,0.0983,9001,9104,,9202,,,,1997-11-13 00:00:00,Australian Surveying and Land Information Group - www.auslig.gov.au/geodesy,EPSG,Superseded by AGD84 to GDA94 (2) (code 1280).,
+1237,WGS 72 to WGS 84 (1),,,,World.,9606,0.0,0.0,4.5,0.0,0.0,0.554,0.2263,9001,9104,,9202,,,,1996-12-12 00:00:00,,EPSG,,
+1238,WGS 72 to WGS 84 (2),,,,World.,9606,0.0,0.0,4.5,0.0,0.0,0.554,0.219,9001,9104,,9202,,,,1996-12-12 00:00:00,,EPSG,,
+1239,WGS 72BE to WGS 72 (1),,,,World.,9606,0.0,0.0,-2.6,0.0,0.0,0.26,-0.6063,9001,9104,,9202,,,,1996-12-12 00:00:00,,EPSG,,
+1240,WGS 72BE to WGS 84 (1),,,,World.,9606,0.0,0.0,1.9,0.0,0.0,0.814,-0.38,9001,9104,,9202,,,,1996-12-12 00:00:00,,EPSG,,
+1241,NAD27 to NAD83 (1),,,,United States (USA) - lower 48 states including EEZ.,9613,,,,,,,,,9104,,,conus.las,conus.los,,1999-04-22 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,98.201 98.53
+1243,NAD27 to NAD83 (2),,,,United States (USA) - Alaska including EEZ.,9613,,,,,,,,,9104,,,alaska.las,alaska.los,,1999-04-22 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,98.201 98.53
+1245,ED50 to WGS 84 (16),,,,Tunisia.,9603,-112.0,-77.0,-145.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,98.11
+1246,Herat North to WGS 84 (1),,,,Afghanistan.,9603,-333.0,-222.0,114.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1247,Kalianpur 1962 to WGS 84 (1),,,,Pakistan.,9603,283.0,682.0,231.0,,,,,9001,,,,,,,1999-10-20 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,Care! DMA ellipsoid is inconsistent with EPSG ellipsoid - transformation parameter values may not be appropriate.,97.235
+1248,ID74 to WGS 84 (1),,,,Indonesia.,9603,-24.0,-15.0,5.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1249,NAD27 to WGS 84 (21),,,,United States (USA) - Alaska - Aleutian Islands east of 180 deg.,9603,-2.0,152.0,149.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1250,NAD27 to WGS 84 (22),,,,United States (USA) - Alaska - Aleutian Islands west of 180 deg.,9603,2.0,204.0,105.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1251,NAD83 to WGS 84 (2),,,,United States (USA) - Alaska - Aleutian Islands.,9603,-2.0,0.0,4.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1252,NAD83 to WGS 84 (3),,,,United States (USA) - Hawaii.,9603,1.0,1.0,-1.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1253,Nord Sahara 1959 to WGS 84 (1),,,,Algeria.,9603,-186.0,-93.0,310.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1254,Pulkovo 1942 to WGS 84 (1),,,,Russia.,9603,28.0,-130.0,-95.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1255,Voirol Unifie to WGS 84 (1),,,,Algeria - north of 35g (31 deg 30 min) North.,9603,-123.0,-206.0,219.0,,,,,9001,,,,,,,1998-06-30 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,CAUTION: EPSG believes that the data used in the derivation of these parameters contains a blunder. We recommend using transformation 1253 [North Sahara 1959 to WGS84 (1)] as Voirol 1960 geographical coordinates are the same as Nord Sahara 1959 geogs.,98.15
+1256,Fahud to WGS 84 (1),,,,Oman.,9603,-346.0,-1.0,224.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1257,Bern 1898 (Bern) to Bern 1898,,,,Liechtenstein; Switzerland.,9601,7.26225,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1258,Bogota (Bogota) to Bogota,,,,Colombia.,9601,-74.04513,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1259,Lisbon (Lisbon) to Lisbon,,,,Portugal - onshore.,9601,-9.0754862,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1260,Makassar (Jakarta) to Makassar,,,,Indonesia - south west Sulawesi.,9601,106.482779,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1261,MGI (Ferro) to MGI,,,,Austria.,9601,-17.4,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1262,Monte Mario (Rome) to Monte Mario,,,,Italy.,9601,12.27084,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,98.37 99.79
+1263,Padang (Jakarta) to Padang,,,,Indonesia - Sumatra.,9601,106.482779,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1264,Belge 1950 (Brussels) to Belge 1950,,,,Belgium - onshore.,9601,4.220471,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1265,Tananarive (Paris) to Tananarive,,,,Madagascar.,9601,2.5969213,,,,,,,,9105,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1266,Voirol 1875 (Paris) to Voirol 1875,,,,Algeria - north of 32 deg N.,9601,2.5969213,,,,,,,,9105,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1267,Voirol Unifie (Paris) to Voirol Unifie,,,,Algeria - north of 32 deg N.,9601,2.5969213,,,,,,,,9105,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1268,Batavia (Jakarta) to Batavia,,,,Indonesia - Java.,9601,106.482779,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1269,RT38 (Stockholm) to RT38,,,,Sweden.,9601,18.03298,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1270,Greek (Athens) to Greek,,,,Greece - onshore.,9601,23.4258815,,,,,,,,9110,,,,,,1999-11-12 00:00:00,Topography Department; National Technical University of Athens.,EPSG,Change of prime meridian.,99.79
+1271,Schwarzeck to WGS 84 (2),,,,Namibia.,9603,615.64,102.08,-255.81,,,,,9001,,,,,,,1997-11-13 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,Beware ! Schwarzeck CS uses German legal metres. Example: Schwarzeck Lat 19d 35m 46.952s S Long 20d 41m 50.649s E; X=5623409.40 Y=2124618.00 Z=-2125847.62 GLM; X=5623485.86 Y=2124646.89 Z=-2125876.53 m; WGS84 X=5624101.50 Y=2124748.97 Z=2126132.34 m.,97.48
+1272,GGRS87 to WGS 84 (1),,,,Greece.,9603,-199.87,74.79,246.62,,,,,9001,,,,,,,1997-06-16 00:00:00,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,,
+1273,HD72 to ETRF89 (1),,,,Hungary.,9607,-56.0,75.77,15.31,-0.37,-0.2,-0.21,-1.01,9001,9104,,9202,,,,1997-11-13 00:00:00,http://lazarus.elte.hu/gb/geodez/geod5.htm,EPSG,,97.47
+1274,Pulkovo 1942 to LKS94(ETRS89) (1),CS42 to LKS94 (1),,,Lithuania.,9607,-40.595,-18.55,-69.339,-2.508,-1.832,2.611,-4.299,9001,9104,,9202,,,,1998-03-12 00:00:00,HNIT-BALTIC GeoInfoServisas.,EPSG,,
+1275,ED50 to WGS 84 (17),,,,France.,9603,-84.0,-97.0,-117.0,,,,,9001,,,,,,,1998-04-16 00:00:00,IGN technical report 14 (January 1988).,EPSG,,98.11
+1276,NTF to ED50 (1),,,,France.,9603,-84.0,37.0,437.0,,,,,9001,,,,,,,1997-11-13 00:00:00,IGN technical report 7 (October 1981).,EPSG,,
+1277,NTF to WGS 72 (1),,,,France.,9603,-168.0,-72.0,314.0,,,,,9001,,,,,,,1997-11-13 00:00:00,IGN technical report 7 (October 1981).,EPSG,,
+1278,AGD66 to GDA94 (1),,,,Australia.,9603,-127.8,-52.3,152.9,,,,,9001,,,,,,,1997-11-13 00:00:00,http://www.anzlic.org.au/icsm/gdatm/molodens.htm,EPSG,5m accuracy. Parameter values are given to greater precision but no better accuracy at http://www.dehaa.sa.gov.au/res_inform/sicom/where/geobas14.html,
+1279,AGD84 to GDA94 (1),,,,Australia.,9603,-128.5,-53.0,153.4,,,,,9001,,,,,,,1997-11-13 00:00:00,http://www.anzlic.org.au/icsm/gdatm/molodens.htm,EPSG,5m accuracy. Parameter values are given to greater precision but no better accuracy at http://www.dehaa.sa.gov.au/res_inform/sicom/where/geobas14.html,
+1280,AGD84 to GDA94 (2),,,,Australia.,9607,-117.763,-51.51,139.061,-0.292,-0.443,-0.277,-0.191,9001,9104,,9202,,,,1997-11-13 00:00:00,http://www.anzlic.org.au/icsm/gdatm/simil.htm,EPSG,1m accuracy. Supersedes AGD84 to WGS 84 (2) (code 1236).,
+1282,Samboja to WGS 84 (1),,,,Indonesia - east Kalimantan - Mahakam delta area.,9603,-404.78,-685.68,-45.47,,,,,9001,,,,,,,1997-11-13 00:00:00,Total Indonesia.,EPSG,Datum shift derived through ITRF93.,
+1283,LKS94(ETRS89) to WGS 84 (1),LKS94 to WGS 84 (1),,,Lithuania.,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1998-03-12 00:00:00,HNIT-BALTIC GeoInfoServisas.,EPSG,LKS94 is a realisation of WGS84 coincident to within 1.5 metres. This transformation has an accuracy equal to the coincidence figure.,98.13
+1284,Arc 1960 to WGS 84 (2),,,,Kenya.,9603,-157.0,-2.0,-299.0,,,,,9001,,,,,,,1998-03-12 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,
+1285,Arc 1960 to WGS 84 (3),,,,Tanzania.,9603,-175.0,-23.0,-303.0,,,,,9001,,,,,,,1998-03-12 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,
+1286,Segora to WGS 84 (1),,,,Indonesia - Kalimantan.,9603,-403.0,684.0,41.0,,,,,9001,,,,,,,1998-03-12 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,
+1287,Pulkovo 1942 to WGS 84 (3),,,,Hungary.,9603,28.0,-121.0,-77.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1288,Pulkovo 1942 to WGS 84 (4),,,,Poland.,9603,23.0,-124.0,-82.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1289,Pulkovo 1942 to WGS 84 (5),,,,Czech Republic.,9603,26.0,-121.0,-78.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1290,Pulkovo 1942 to WGS 84 (6),,,,Latvia.,9603,24.0,-124.0,-82.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1291,Pulkovo 1942 to WGS 84 (7),,,,Kazakstan.,9603,15.0,-130.0,-84.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1292,Pulkovo 1942 to WGS 84 (8),,,,Albania.,9603,24.0,-130.0,-92.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1293,Pulkovo 1942 to WGS 84 (9),,,,Romania.,9603,28.0,-121.0,-77.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1294,Voirol 1875 to WGS 84 (1),,,,Algeria - north of 35g (31 deg 30 min) North.,9603,-73.0,-247.0,227.0,,,,,9001,,,,,,,1998-03-12 00:00:00,U.S. Defense Mapping Agency TR8350.2 revision of August 1993.,EPSG,,
+1295,Naparima 1972 to WGS 84 (2),,,,Trinidad and Tobago.,9603,-0.465,372.095,171.736,,,,,9001,,,,,,,1998-11-11 00:00:00,Trinidad Ministry of Energy and Energy Industries.,EPSG,,98/38
+1296,Trinidad 1903 to WGS 84 (1),,,,Trinidad.,9603,-61.702,284.488,472.052,,,,,9001,,,,,,,1998-11-11 00:00:00,Trinidad Ministry of Energy and Energy Industries.,EPSG,,98/38
+1297,Tete to Moznet (1),,,,Mozambique.,9607,-115.064,-87.39,-101.716,0.058,-4.001,2.062,9.366,9001,9104,,9202,,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Mean of 32 stations. Residuals as high as 30 metres. To reduce the size of the residuals; four regional parameter sets (codes 1298-1301) were developed.,
+1298,Tete to Moznet (2),,,,Mozambique - Maputo province and southern part of Gaza province; i.e. south of approximately 24 deg S.,9607,-82.875,-57.097,-156.768,2.158,-1.524,0.982,-0.359,9001,9104,,9202,,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Mean of 9 stations; residuals are generally under 1 metre.,
+1299,Tete to Moznet (3),,,,Mozambique - provinces of Gaza; Inhambane and southern parts of Sofala and Manhica; i.e. between approximately 24 and 20 deg South.,9607,-138.527,-91.999,-114.591,0.14,-3.363,2.217,11.748,9001,9104,,9202,,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Mean of 6 stations; residuals are generally under 4 metres.,
+1300,Tete to Moznet (4),,,,Mozambique - provinces of Sofala north of Beira corridor; Manhica; Tete and Zambezia; i.e. between approximately 20 and 16 deg South.,9607,-73.472,-51.66,-112.482,-0.953,-4.6,2.368,0.586,9001,9104,,9202,,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Mean of 11 stations; residuals are generally under 3 metres.,
+1301,Tete to Moznet (5),,,,Mozambique - provinces of Nampula; Niassa; Cabo Delgado; i.e. north of approximately 16 deg S.,9607,219.315,168.975,-166.145,-0.198,-5.926,2.356,-57.104,9001,9104,,9202,,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Mean of 7 stations; residuals are 5-10 metres.,
+1302,Moznet to WGS 84 (1),,,,Mozambique.,9607,0.0,0.0,0.0,0.0,0.0,0.0,0.0,9001,9104,,9202,,,,1998-04-16 00:00:00,EPSG,EPSG,For many purposes Moznet can be considered to be coincident with WGS 84. Accuracy better than 1 metre.,
+1303,Pulkovo 1942 to WGS 84 (10),,,,Kazakstan - Caspian.,9606,43.661,-103.342,-124.117,1.659,-0.824,0.653,0.59,9001,9104,,9202,,,,1998-04-16 00:00:00,KazakCaspiShelf consortium.,EPSG,Mean of 13 stations along entire Kazak coastline; residuals under 2 m.,
+1304,Indian 1975 to WGS 84 (2),,,,Thailand.,9603,210.0,814.0,289.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,
+1305,Tokyo to WGS 84 (5),,,,South Korea.,9603,-147.0,506.0,687.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,
+1306,MGI to WGS 84 (1),,,,MEAN FOR Boznia and Herzegovina; Croatia; Serbia; Slovenia.,9603,682.0,-203.0,480.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,
+1307,Naparima 1972 to WGS 84 (3),,,,Trinidad & Tobago.,9603,-2.0,374.0,172.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. Defense Mapping Agency TR8350.2 December 1987.,EPSG,See remarks for code 1192.,
+1308,NAD83 to WGS 84 (4),,,,United States (USA),9607,-0.9738,1.9453,0.5486,-0.00000013357,-0.00000004872,-0.00000005507,0.0,9001,9101,,9202,,,,1999-04-22 00:00:00, http://www.ngs.noaa.gov/CORS/Derivation.html,EPSG,Strictly between NAD83 and ITRF94(1996.0). Superseded by NAD83 to WGS 84 (5) (code 1515).,99.12 99.38
+1309,DHDN to ETRF89 (1),,,,Germany - former west Germany.,9607,582.0,105.0,414.0,-1.04,-0.35,3.08,8.3,9001,9104,,9202,,,,1998-06-30 00:00:00,Institute for Cartography and Geodesy; Leipzig.,EPSG,Mean of 69 stations; residuals under 5 m.,
+1310,Pulkovo 1942 to ETRF89 (1),,,,Germany - former east Germany - Brandenburg; Mecklenburg-Vorpommern; Sachsen-Anhalt.,9607,24.0,-123.0,-94.0,-0.02,0.25,0.13,1.1,9001,9104,,9202,,,,1998-06-30 00:00:00,Institute for Cartography and Geodesy; Leipzig.,EPSG,Mean of 20 stations; residuals under 2 m.,
+1311,ED50 to WGS 84 (Common Offshore),ED50 to WGS 84 (18),,,United Kingdom - UKCS offshore east of 6 deg west.,9606,-89.5,-93.8,-123.1,0.0,0.0,-0.156,1.2,9001,9104,,9202,,,,1998-06-30 00:00:00,The Hydrographic Journal; vol 52 page 50.,EPSG,Recommended transformation for UKCS petroleum purposes. Based on ED50 to WGS72 (precise ephemeris) 6-nations agreement of 1981 to which precise to broadcast and broadcast to WGS 84 transformations have been concatenated.,98.27
+1312,NAD27 to NAD83 (3),,,,Canada.,9614,,,,,,,,,9104,,,NTv1_0.gsb,,,1999-04-22 00:00:00,Geomatics Canada - Geodetic Survey Division.,EPSG,Uses NTv1 method. Superseded in 1997 by NTv2 (non-poly transformation code 1313) except in Quebec. Input expects longitudes to be positive west; EPSG GeogCS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,
+1313,NAD27 to NAD83 (4),,,,Canada.,9615,,,,,,,,,9104,,,NTv2_0.gsb,,,1999-04-22 00:00:00,http://www.geod.nrcan.gc.ca/products/html-public/GSDapps/English/NTv2_Fact_Sheet.html,EPSG,Uses NTv2 data files. Supersedes NTv1 (non-poly transformation code 1312) except in Quebec. Input expects longitudes to be positive west; EPSG GeogCS NAD27 (code 4267) and (code 4269) have longitudes positive east.,
+1314,OSGB 1936 to WGS 84 (Petroleum),,,,United Kingdom (UKCS) - Great Britain (GB) - England; Scotland; Wales; - North Sea.,9606,446.448,-125.157,542.06,0.15,0.247,0.842,-20.489,9001,9104,,9202,,,,1998-11-11 00:00:00,UK Offshore Operators Association.,EPSG,Accuracy better than 4m and generally better than 2m. For a more accurate transformation contact the Ordnance Survey of Great Britain.,
+1315,OSGB 1936 to ED50 (UKOOA),,,,United Kingdom (UKCS) - Great Britain (GB) - England; Scotland; Wales; - North Sea.,9606,535.948,-31.357,665.16,0.15,0.247,0.998,-21.689,9001,9104,,9202,,,,1998-11-11 00:00:00,UK Offshore Operators Association.,EPSG,This transformation is concatenated from OSGB36 to WGS 84 (Petroleum) (code 1314) minus ED50 to WGS 84 (Common Offshore) (code 1311).,
+1316,Manoca to WGS 84 (1),,,,Cameroon.,9603,-70.9,-151.8,-41.4,,,,,9001,,,,,,,1998-11-11 00:00:00,Stolt Comex Seaway and Geoid for Elf.,EPSG,,
+1317,Camacupa to WGS 72BE (1),,,,Angola - offshore.,9603,-37.2,-370.6,-228.5,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Derived by Geophysical Services Inc. in 1979 from mean of Transit results at 7 stations.,
+1318,Camacupa to WGS 84 (1),,,,Angola - offshore block 5.,9603,-42.01,-332.21,-229.75,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Used by Conoco.,
+1319,Camacupa to WGS 84 (2),,,,Angola - offshore block 2.,9603,-40.0,-354.0,-224.0,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Used by Texaco.,
+1320,Camacupa to WGS 84 (3),,,,Angola - offshore blocks 1 and 16.,9606,-37.2,-370.6,-224.0,0.0,0.0,0.554,0.219,9001,9104,8901,9202,,,,1998-12-14 00:00:00,EPSG,EPSG,Used by Shell prior to 1994. Superseded by Camacupa to WGS 84 (9).,98.56
+1321,Camacupa to WGS 84 (4),,,,Angola - offshore blocks 7 and 8. Also used rounded to integer metre for GSI/HGS/Western Geophysical speculative seismic data.,9603,-42.5,-342.5,-228.1,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Derived as mean of 123 Transit passes at station Cabo Ledo NE base in January 1989. Used by Total for block 8. Used by Elf for block 7 up to December 1992 then superseded by Camacupa to WGS 84 (7).,
+1322,Camacupa to WGS 84 (5),,,,Angola - offshore block 3.,9603,-55.5,-348.0,-229.2,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Derived at station Djeno during coordination of platform PAL F2 in February 1992. Used by Elf for block 3 up to December 1992 then superseded by Camacupa to WGS 84 (7).,
+1323,Camacupa to WGS 84 (6),,,,Angola - offshore block 7.,9603,-43.0,-337.0,-233.0,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Derived at Luanda observatory December 1992. Used by Elf for 1993 block 7 shallow water survey.,
+1324,Camacupa to WGS 84 (7),,,,Angola - offshore blocks 3 7 15 and 17.,9603,-48.0,-345.0,-231.0,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,"Derived at platform PAL F2 in December 1992. Used by Elf for blocks 3, 7 and 17 between December 1992 and 1994 then superseded by Camacupa to WGS 84 (10). Used by Exxon for block 15 since 1993.",
+1325,Camacupa to WGS 84 (8),,,,Angola - offshore block 2.,9603,-48.6,-345.1,-230.8,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Derived at platform PAL F2 in December 1992. Used by Total for block 2 between December 1992 and 1994 then superseded by Camacupa to WGS 84 (10).,
+1326,Camacupa to WGS 84 (9),,,,Angola - offshore blocks 1 16 and 18.,9606,-41.057,-374.564,-226.287,0.0,0.0,0.554,0.219,9001,9104,8901,9202,,,,1998-12-14 00:00:00,EPSG,EPSG,Used by Shell since 1994. Supersedes Camacupa to WGS 84 (3).,98.56
+1327,Camacupa to WGS 84 (10),,,,Angola - offshore blocks 2 3 17 and 31-33.,9603,-50.9,-347.6,-231.0,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Derived at platform PAL F2 in 1994 by Topnav using Doris. Used by Elf in blocks 3 and 17 since 1994. Used by Total in block 2 since 1994. Adopted by BP-Amoco Elf and Exxon for blocks 31-33.,
+1328,Malongo 1987 to Mhast (1),,,,Angola - Cabinda offshore.,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Malongo 1987 is an offshore extension of Mhast adopted by Chevron in 1987.,
+1329,Mhast to WGS 84 (1),,,,Angola - Cabinda offshore.,9603,-252.95,-4.11,-96.38,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,,
+1330,Malongo 1987 to WGS 84 (1),,,,Angola - Cabinda offshore.,9603,-252.95,-4.11,-96.38,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Used by Chevron.,
+1331,EST92 to ETRF89 (1),,,,Estonia,9607,0.0,0.0,0.0,0.0,0.0,0.0,0.0,9001,9104,,9202,,,,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,,
+1332,Pulkovo 1942 to EST92 (1),,,,Estonia.,9607,21.53219,-97.00027,-60.74046,-0.99548,-0.58147,-0.2418,-4.5981,9001,9104,,9202,,,,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,,
+1333,EST92 to WGS84 (1),,,,Estonia.,9607,0.055,-0.541,-0.185,-0.0183,0.0003,0.007,-0.014,9001,9104,,9202,,,,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,,
+1334,Pulkovo 1942 to WGS84 (12),,,,Estonia.,9607,21.58719,-97.54127,-60.92546,-1.01378,-0.58117,-0.2348,-4.6121,9001,9104,,9202,,,,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,,
+1335,Tokyo to WGS 84 (6),,,,Japan - 45d 20m to 46d N; 141d to 142d E.,9618,7.92,-13.88,26.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1336,Tokyo to WGS 84 (7),,,,Japan - 45d 20m to 46d N; 142d to 143d E.,9618,7.94,-13.97,26.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1337,Tokyo to WGS 84 (8),,,,Japan - 44deg 40min to 45deg 20min N; 141deg to 142deg E.,9618,8.1,-13.81,27.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1338,Tokyo to WGS 84 (9),,,,Japan - 44deg 40min to 45deg 20min N; 142deg to 143deg E.,9618,8.15,-13.95,28.4,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1339,Tokyo to WGS 84 (10),,,,Japan - 44deg to 44deg 40min N; 141deg to 142deg E.,9618,8.37,-13.65,29.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1340,Tokyo to WGS 84 (11),,,,Japan - 44deg to 44deg 40min N; 142deg to 143deg E.,9618,8.44,-13.87,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1341,Tokyo to WGS 84 (12),,,,Japan - 44deg to 44deg 40min N; 143deg to 144deg E.,9618,8.61,-14.08,30.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1342,Tokyo to WGS 84 (13),,,,Japan - 44deg to 44deg 40min N; 144deg to 145deg E.,9618,8.73,-14.3,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1343,Tokyo to WGS 84 (14),,,,Japan - 43deg 20min to 44deg N; 141deg to 142deg E.,9618,8.63,-13.49,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1344,Tokyo to WGS 84 (15),,,,Japan - 43deg 20min to 44deg N; 142deg to 143deg E.,9618,8.71,-13.73,31.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1345,Tokyo to WGS 84 (16),,,,Japan - 43deg 20min to 44deg N; 143deg to 144deg E.,9618,8.84,-14.03,31.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1346,Tokyo to WGS 84 (17),,,,Japan - 43deg 20min to 44deg N; 144deg to 145deg E.,9618,8.98,-14.33,32.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1347,Tokyo to WGS 84 (18),,,,Japan - 43deg 20min to 44deg N; 145deg to 146deg E.,9618,9.1,-14.56,32.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1348,Tokyo to WGS 84 (19),,,,Japan - 42deg 40min to 43deg 20min N; 140deg to 141deg E.,9618,8.79,-13.0,33.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1349,Tokyo to WGS 84 (20),,,,Japan - 42deg 40min to 43deg 20min N; 141deg to 142deg E.,9618,8.84,-13.31,31.4,,,,,9001,9104,,,,,,1999-11-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,99.77
+1350,Tokyo to WGS 84 (21),,,,Japan - 42deg 40min to 43deg 20min N; 142deg to 143deg E.,9618,8.98,-13.59,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1351,Tokyo to WGS 84 (22),,,,Japan - 42deg 40min to 43deg 20min N; 143deg to 144deg E.,9618,9.1,-13.91,29.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1352,Tokyo to WGS 84 (23),,,,Japan - 42deg 40min to 43deg 20min N; 144deg to 145deg E.,9618,9.17,-14.27,31.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1353,Tokyo to WGS 84 (24),,,,Japan - 42deg 40min to 43deg 20min N; 145deg to 146deg E.,9618,9.23,-14.52,31.4,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1354,Tokyo to WGS 84 (25),,,,Japan - 42deg to 42deg 40min N; 139deg to 140deg E.,9618,8.9,-12.68,34.4,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1355,Tokyo to WGS 84 (26),,,,Japan - 42deg to 42deg 40min N; 140deg to 141deg E.,9618,8.99,-12.8,34.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1356,Tokyo to WGS 84 (27),,,,Japan - 42deg to 42deg 40min N; 141deg to 142deg E.,9618,9.0,-13.07,31.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1357,Tokyo to WGS 84 (28),,,,Japan - 42deg to 42deg 40min N; 142deg to 143deg E.,9618,9.21,-13.51,27.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1358,Tokyo to WGS 84 (29),,,,Japan - 42deg to 42deg 40min N; 143deg to 144deg E.,9618,9.33,-13.66,23.8,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1359,Tokyo to WGS 84 (30),,,,Japan - 41deg 20min to 42deg N; 140deg to 141deg E.,9618,9.25,-12.72,34.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1360,Tokyo to WGS 84 (31),,,,Japan - 41deg 20min to 42deg N; 141deg to 142deg E.,9618,9.39,-12.91,31.8,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1361,Tokyo to WGS 84 (32),,,,Japan - 40deg 40min to 41deg 20min N; 140deg to 141deg E.,9618,9.55,-12.63,35.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1362,Tokyo to WGS 84 (33),,,,Japan - 40deg 40min to 41deg 20min N; 141deg to 142deg E.,9618,9.62,-12.82,34.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1363,Tokyo to WGS 84 (34),,,,Japan - 40deg to 40deg 40min N; 139deg to 140deg E.,9618,9.81,-12.29,36.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1364,Tokyo to WGS 84 (35),,,,Japan - 40deg to 40deg 40min N; 140deg to 141deg E.,9618,9.81,-12.45,37.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1365,Tokyo to WGS 84 (36),,,,Japan - 40deg to 40deg 40min N; 141deg to 142deg E.,9618,9.92,-12.79,38.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1366,Tokyo to WGS 84 (37),,,,Japan - 39deg 20min to 40deg N; 139deg to 140deg E.,9618,9.91,-12.21,36.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1367,Tokyo to WGS 84 (38),,,,Japan - 39deg 20min to 40deg N; 140deg to 141deg E.,9618,10.08,-12.35,39.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1368,Tokyo to WGS 84 (39),,,,Japan - 39deg 20min to 40deg N; 141deg to 142deg E.,9618,10.19,-12.74,40.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1369,Tokyo to WGS 84 (40),,,,Japan - 38deg 40min to 39deg 20min N; 139deg to 140deg E.,9618,10.29,-12.13,38.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1370,Tokyo to WGS 84 (41),,,,Japan - 38deg 40min to 39deg 20min N; 140deg to 141deg E.,9618,10.33,-12.27,40.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1371,Tokyo to WGS 84 (42),,,,Japan - 38deg 40min to 39deg 20min N; 141deg to 142deg E.,9618,10.45,-12.61,41.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1372,Tokyo to WGS 84 (43),,,,Japan - 38deg to 38deg 40min N; 139deg to 140deg E.,9618,10.54,-11.96,39.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1373,Tokyo to WGS 84 (44),,,,Japan - 38deg to 38deg 40min N; 140deg to 141deg E.,9618,10.65,-12.27,41.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1374,Tokyo to WGS 84 (45),,,,Japan - 38deg to 38deg 40min N; 141deg to 142deg E.,9618,10.67,-12.5,41.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1375,Tokyo to WGS 84 (46),,,,Japan - 37deg 20min to 38deg N; 136deg to 137deg E.,9618,10.67,-10.86,38.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1376,Tokyo to WGS 84 (47),,,,Japan - 37deg 20min to 38deg N; 137deg to 138deg E.,9618,10.68,-10.97,36.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1377,Tokyo to WGS 84 (48),,,,Japan - 37deg 20min to 38deg N; 138deg to 139deg E.,9618,10.8,-11.53,39.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1378,Tokyo to WGS 84 (49),,,,Japan - 37deg 20min to 38deg N; 139deg to 140deg E.,9618,10.8,-11.73,40.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1379,Tokyo to WGS 84 (50),,,,Japan - 37deg 20min to 38deg N; 140deg to 141deg E.,9618,10.92,-12.16,42.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1380,Tokyo to WGS 84 (51),,,,Japan - 37deg 20min to 38deg N; 141deg to 142deg E.,9618,11.0,-12.25,41.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1381,Tokyo to WGS 84 (52),,,,Japan - 36deg 40min to 37deg 20min N; 136deg to 137deg E.,9618,10.83,-10.77,36.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1382,Tokyo to WGS 84 (53),,,,Japan - 36deg 40min to 37deg 20min N; 137deg to 138deg E.,9618,10.95,-11.0,38.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1383,Tokyo to WGS 84 (54),,,,Japan - 36deg 40min to 37deg 20min N; 138deg to 139deg E.,9618,10.97,-11.34,40.8,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1384,Tokyo to WGS 84 (55),,,,Japan - 36deg 40min to 37deg 20min N; 139deg to 140deg E.,9618,11.04,-11.69,43.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1385,Tokyo to WGS 84 (56),,,,Japan - 36deg 40min to 37deg 20min N; 140deg to 141deg E.,9618,11.17,-12.05,42.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1386,Tokyo to WGS 84 (57),,,,Japan - 36deg to 37deg 40min N; 136deg to 137deg E.,9618,11.11,-10.59,37.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1387,Tokyo to WGS 84 (58),,,,Japan - 36deg to 37deg 40min N; 137deg to 138deg E.,9618,11.16,-10.97,40.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1388,Tokyo to WGS 84 (59),,,,Japan - 36deg to 37deg 40min N; 138deg to 139deg E.,9618,11.29,-11.23,42.4,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1389,Tokyo to WGS 84 (60),,,,Japan - 36deg to 37deg 40min N; 139deg to 140deg E.,9618,11.36,-11.59,42.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1390,Tokyo to WGS 84 (61),,,,Japan - 36deg to 37deg 40min N; 140deg to 141deg E.,9618,11.44,-11.88,40.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1391,Tokyo to WGS 84 (62),,,,Japan - 35deg 20min to 36deg N; 132deg to 133deg E.,9618,11.27,-9.31,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1392,Tokyo to WGS 84 (63),,,,Japan - 35deg 20min to 36deg N; 133deg to 134deg E.,9618,11.33,-9.52,33.8,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1393,Tokyo to WGS 84 (64),,,,Japan - 35deg 20min to 36deg N; 134deg to 135deg E.,9618,11.38,-9.86,34.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1394,Tokyo to WGS 84 (65),,,,Japan - 35deg 20min to 36deg N; 135deg to 136deg E.,9618,11.41,-10.14,35.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1395,Tokyo to WGS 84 (66),,,,Japan - 35deg 20min to 36deg N; 136deg to 137deg E.,9618,11.39,-10.52,37.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1396,Tokyo to WGS 84 (67),,,,Japan - 35deg 20min to 36deg N; 137deg to 138deg E.,9618,11.49,-10.83,39.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1397,Tokyo to WGS 84 (68),,,,Japan - 35deg 20min to 36deg N; 138deg to 139deg E.,9618,11.58,-11.21,41.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1398,Tokyo to WGS 84 (69),,,,Japan - 35deg 20min to 36deg N; 139deg to 140deg E.,9618,11.65,-11.53,38.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1399,Tokyo to WGS 84 (70),,,,Japan - 35deg 20min to 36deg N; 140deg to 141deg E.,9618,11.72,-11.8,34.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1400,Tokyo to WGS 84 (71),,,,Japan - 34deg 40min to 35deg 20min N; 132deg to 133deg E.,9618,11.44,-9.21,32.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1401,Tokyo to WGS 84 (72),,,,Japan - 34deg 40min to 35deg 20min N; 133deg to 134deg E.,9618,11.47,-9.52,35.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1402,Tokyo to WGS 84 (73),,,,Japan - 34deg 40min to 35deg 20min N; 134deg to 135deg E.,9618,11.55,-9.8,35.4,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1403,Tokyo to WGS 84 (74),,,,Japan - 34deg 40min to 35deg 20min N; 135deg to 136deg E.,9618,11.61,-10.12,35.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1404,Tokyo to WGS 84 (75),,,,Japan - 34deg 40min to 35deg 20min N; 136deg to 137deg E.,9618,11.66,-10.47,37.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1405,Tokyo to WGS 84 (76),,,,Japan - 34deg 40min to 35deg 20min N; 137deg to 138deg E.,9618,11.78,-10.79,39.8,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1406,Tokyo to WGS 84 (77),,,,Japan - 34deg 40min to 35deg 20min N; 138deg to 139deg E.,9618,11.85,-11.13,39.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1407,Tokyo to WGS 84 (78),,,,Japan - 34deg 40min to 35deg 20min N; 139deg to 140deg E.,9618,11.9,-11.47,36.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1408,Tokyo to WGS 84 (79),,,,Japan - 34deg 40min to 35deg 20min N; 140deg to 141deg E.,9618,11.91,-11.69,33.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1409,Tokyo to WGS 84 (80),,,,Japan - 34deg to 34deg 40min N; 130deg to 131deg E.,9618,11.65,-8.59,29.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1410,Tokyo to WGS 84 (81),,,,Japan - 34deg to 34deg 40min N; 131deg to 132deg E.,9618,11.68,-8.8,30.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1411,Tokyo to WGS 84 (82),,,,Japan - 34deg to 34deg 40min N; 132deg to 133deg E.,9618,11.73,-9.04,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1412,Tokyo to WGS 84 (83),,,,Japan - 34deg to 34deg 40min N; 133deg to 134deg E.,9618,11.72,-9.48,35.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1413,Tokyo to WGS 84 (84),,,,Japan - 34deg to 34deg 40min N; 134deg to 135deg E.,9618,11.81,9.74,35.8,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1414,Tokyo to WGS 84 (85),,,,Japan - 34deg to 34deg 40min N; 135deg to 136deg E.,9618,11.88,-10.1,37.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1415,Tokyo to WGS 84 (86),,,,Japan - 34deg to 34deg 40min N; 136deg to 137deg E.,9618,11.91,-10.35,37.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1416,Tokyo to WGS 84 (87),,,,Japan - 34deg to 34deg 40min N; 137deg to 138deg E.,9618,11.9,-10.7,39.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1417,Tokyo to WGS 84 (88),,,,Japan - 34deg to 34deg 40min N; 138deg to 139deg E.,9618,12.02,-11.09,38.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1418,Tokyo to WGS 84 (89),,,,Japan - 33deg 20min to 34deg N; 129deg to 130deg E.,9618,11.87,-8.23,29.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1419,Tokyo to WGS 84 (90),,,,Japan - 33deg 20min to 34deg N; 130deg to 131deg E.,9618,11.84,-8.44,30.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1420,Tokyo to WGS 84 (91),,,,Japan - 33deg 20min to 34deg N; 131deg to 132deg E.,9618,11.94,-8.71,30.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1421,Tokyo to WGS 84 (92),,,,Japan - 33deg 20min to 34deg N; 132deg to 133deg E.,9618,11.99,-9.02,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1422,Tokyo to WGS 84 (93),,,,Japan - 33deg 20min to 34deg N; 133deg to 134deg E.,9618,12.05,-9.36,35.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1423,Tokyo to WGS 84 (94),,,,Japan - 33deg 20min to 34deg N; 134deg to 135deg E.,9618,12.1,-9.64,35.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1424,Tokyo to WGS 84 (95),,,,Japan - 33deg 20min to 34deg N; 135deg to 136deg E.,9618,12.1,-10.08,37.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1425,Tokyo to WGS 84 (96),,,,Japan - 33deg 20min to 34deg N; 136deg to 137deg E.,9618,12.07,-10.25,37.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1426,Tokyo to WGS 84 (97),,,,Japan - 32deg 40min to 33deg 20min N; 129deg to 130deg E.,9618,12.0,-8.15,32.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1427,Tokyo to WGS 84 (98),,,,Japan - 32deg 40min to 33deg 20min N; 130deg to 131deg E.,9618,12.06,-8.38,31.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1428,Tokyo to WGS 84 (99),,,,Japan - 32deg 40min to 33deg 20min N; 131deg to 132deg E.,9618,12.17,-8.69,30.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1429,Tokyo to WGS 84 (100),,,,Japan - 32deg 40min to 33deg 20min N; 132deg to 133deg E.,9618,12.23,-8.99,31.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1430,Tokyo to WGS 84 (101),,,,Japan - 32deg 40min to 33deg 20min N; 133deg to 134deg E.,9618,12.21,-9.21,34.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1431,Tokyo to WGS 84 (102),,,,Japan - 32deg 40min to 33deg 20min N; 134deg to 135deg E.,9618,12.28,-9.6,33.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1432,Tokyo to WGS 84 (103),,,,Japan - 32deg to 32deg 40min N; 130deg to 131deg E.,9618,12.28,-8.25,31.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1433,Tokyo to WGS 84 (104),,,,Japan - 32deg to 32deg 40min N; 131deg to 132deg E.,9618,12.37,-8.55,29.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1434,Tokyo to WGS 84 (105),,,,Japan - 31deg 20min to 32deg N; 130deg to 131deg E.,9618,12.53,-8.21,31.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1435,Tokyo to WGS 84 (106),,,,Japan - 31deg 20min to 32deg N; 131deg to 132deg E.,9618,12.57,-8.4,28.4,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1436,Tokyo to WGS 84 (107),,,,Japan - 30deg 40min to 31deg 20min N; 130deg to 131deg E.,9618,12.71,-8.17,29.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html (Geographical Survey Institute).,EPSG,,
+1437,RT90 to ETRF89 (1),,,,Sweden,9607,419.3836,99.3335,591.3451,-0.850389,-1.817277,7.862238,-0.99496,9001,9104,,9202,,,,1999-04-22 00:00:00,National Land Survey of Sweden.,EPSG,This transformation is actually between ETRF89 and RR92. RR92 is a geographic 3D coordinate system where the horizontal component is RT90.,99.11
+1438,Fahud to WGS 84 (2),,,,Oman.,9606,-333.102,-11.02,230.69,0.0,0.0,0.554,0.219,9001,9104,,9202,,,,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,,
+1439,PSD93 to WGS 84 (1),,,,Oman.,9606,-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.71006,9001,9104,,9202,,,,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,,
+1440,ED50 to WGS 84 (19),,,,Greece.,9603,-86.0,-92.2,-127.5,,,,,9001,,,,,,,1999-04-22 00:00:00,Geodesy Department; Hellenic Petroleum s.a.,EPSG,Used in oil industry.,
+1441,Antigua 1943 to WGS 84 (1),,,,Antigua.,9603,-255.0,-15.0,71.0,,,,,9001,,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1442,Dominica 1945 to WGS 84 (1),,,,Dominica.,9603,725.0,685.0,536.0,,,,,9001,,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1443,Grenada 1953 to WGS 84 (1),,,,Grenada.,9603,72.0,213.7,93.0,,,,,9001,,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1444,Montserrat 1958 to WGS 84 (1),,,,Montserrat.,9603,174.0,359.0,365.0,,,,,9001,,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1445,St. Kitts 1955 to WGS 84 (1),,,,Saint Kitts and Nevis.,9603,9.0,183.0,236.0,,,,,9001,,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1446,St. Lucia 1955 to WGS 84 (1),,,,Saint Lucia.,9603,-149.0,128.0,296.0,,,,,9001,,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1447,Anguilla 1957 to WGS 84 (1),,,,Anguilla.,9619,-18.0,4.4,,,,,,,9104,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1450,ED50 to WGS 84 (20),,,,Norway - offshore between 62 and 65 deg North and west of 5 deg East.,9620,,,,,,8047.0,8046.0,,9102,,,ED50 to WGS 84 (15),ED50 to WGS 84 (14),,1999-04-22 00:00:00,"Norwegian Mapping Authority note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\"",EPSG,,
+1451,NAD27(CGQ77) to NAD83 (1),,,,Canada - Quebec,9614,,,,,,,,,9104,,,PQV4.DAC,,,1999-05-15 00:00:00,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,Uses NT method which expects longitudes positive west; EPSG GeogCSs CGQ77 (code 4609) and NAD83 (code 4269) have longitudes positive east. Supersedes NAD27 to NAD83 (5) (code xxxx).,
+1454,Old Hawaiian to NAD83 (1),,,,United States (USA) - Hawaii including EEZ.,9613,,,,,,,,,9104,,,hawaii.las,hawaii.los,,1999-05-15 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs Old Hawaiian (code 4135) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from Old Hawaiian Datum to but makes the transformation appear to be from NAD27.,
+1455,St. Lawrence Island to NAD83 (1),,,,United States (USA) - Alaska - St. Lawrence Island.,9613,,,,,,,,,9104,,,stlrnc.las,stlrnc.los,,1999-05-15 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs St. Lawrence (code 4136) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. Lawrence Datum to but makes the transformation appear to be from NAD27.,
+1456,St. Paul Island to NAD83 (1),,,,United States (USA) - Alaska - St. Paul Island.,9613,,,,,,,,,9104,,,stpaul.las,stpaul.los,,1999-05-15 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs St. Paul (code 4137) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. Paul Datum to but makes the transformation appear to be from NAD27.,
+1457,St. George Island to NAD83 (1),,,,United States (USA) - Alaska - St. George Island.,9613,,,,,,,,,9104,,,stgeorge.las,stgeorge.los,,1999-05-15 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs St. George (code 4138) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. George Datum to but makes the transformation appear to be from NAD27.,
+1458,AGD66 to GDA94 (2),,,,Australia - ACT.,9607,-129.193,-41.212,130.73,-0.246,-0.374,-0.329,-2.955,9001,9104,,9202,,,,1999-05-25 00:00:00,http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,1m accuracy. Recommended for mid-accuracy use in A.C.T.,
+1459,AGD66 to GDA94 (3),,,,Australia - Tasmania.,9607,-120.695,-62.73,165.46,-0.109,0.141,0.116,2.733,9001,9104,,9202,,,,1999-05-25 00:00:00,http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,1m accuracy. Recommended for mid-accuracy use in Tasmania.,
+1460,AGD66 to GDA94 (4),,,,Australia - New South Wales (NSW) and Victoria.,9607,-119.353,-48.301,139.484,-0.415,-0.26,-0.437,-0.613,9001,9104,,9202,,,,1999-05-25 00:00:00,http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,1m accuracy. Recommended for mid-accuracy use in NSW and Victoria.,
+1461,Puerto Rico to NAD83 (1),,,,Puerto Rico; Virgin Islands (U.S.); Virgin Islands (British).,9613,,,,,,,,,9104,,,prvi.las,prvi.los,,1999-05-24 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs Puerto Rico (code 4139) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from Puerto Rico Datum to but makes the transformation appear to be from NAD27.,
+1462,NAD27 to NAD83 (5),,,,Canada - Quebec,9614,,,,,,,,,9104,,,GS2783v1.QUE,,,1999-05-24 00:00:00,Geodetic Service of Quebec. Contact alain.bernard at mrn.gouv.qc.ca,EPSG,Uses NT method which expects longitudes positive west; EPSG GeogCSs NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east. Superseded by NAD27(CGQ77) to NAD83 (1) (code 1451).,
+1463,NAD27(76) to NAD83 (1),,,,Canada - Ontario,9615,,,,,,,,,9104,,,May76v20.gsb,,,1999-05-24 00:00:00,Geodetic Survey of Canada http://www.geod.emr.ca/html-public/GSDapps/English/NTv2_Fact_Sheet.html,EPSG,Uses NT method which expects longitudes positive west; EPSG GeogCSs NAD27(76) (code 4608) and NAD83 (code 4269) have longitudes positive east.,
+1464,AGD66 to GDA94 (5),,,,Australia - Victoria.,9615,,,,,,,,,9104,,,vic_0799.gsb,,,1999-10-20 00:00:00,http://www.osg.vic.gov.au/tools.htm,EPSG,0.1m accuracy. Input expects longitudes to be positive west; EPSG GeogCS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,99.67
+1466,NGO 1948 (Oslo) to NGO1948,,,,Norway - onshore.,9601,10.43225,,,,,,,,9110,,,,,,1999-11-12 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,Change of prime meridian.,99.79
+1467,NTF (Paris) to NTF (1),,,,France - onshore.,9601,2.5969213,,,,,,,,9105,,,,,,1999-11-12 00:00:00,IGN Paris.,EPSG,Change of prime meridian.,99.63 99.79
+1468,NTF (Paris) to NTF (2),,,,France - onshore.,9601,2.201395,,,,,,,,9110,,,,,,1999-11-12 00:00:00,Royal Geographic Society; London,EPSG,Change of prime meridian. EPSG prefers value from IGN Paris (code 1467).,99.63 99.79
+1469,Locodjo 1965 to WGS 84 (1),,,,Cote D'Ivoire (Ivory Coast),9603,-125.0,53.0,467.0,,,,,9001,,,,,,,1999-10-20 00:00:00,IGN Paris,EPSG,,
+1470,Abidjan 1987 to WGS 84 (1),,,,Cote D'Ivoire (Ivory Coast),9603,-124.76,53.0,466.79,,,,,9001,,,,,,,1999-10-20 00:00:00,IGN Paris,EPSG,,
+1471,MGI to WGS 84 (2),,,,Austria,9606,-577.326,-90.129,-463.919,-15.8537,-4.55,-16.3489,-2.4232,9001,9113,,9202,,,,1999-10-20 00:00:00,Bundesamt f�r Eich- und Vermessungswesen,EPSG,,
+1472,ATS77 to NAD83(CSRS98) (1),,,,Canada - New Brunswick,9615,,,,,,,,,9104,,,NT7783v2.gsb,,,1999-10-20 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,Introduced in 1999.,
+1473,NAD83(CSRS98) to WGS 84 (1),,,,Canada - New Brunswick,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1999-10-20 00:00:00,EPSG,EPSG,For many purposes NAD83 can be considered to be coincident with WGS 84.,
+1474,NAD83 to NAD83(HARN) (1),,,,United States (USA) - Alabama.,9613,,,,,,,,,9104,,,alhpgn.las,alhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1475,NAD83 to NAD83(HARN) (2),,,,United States (USA) - Arizona.,9613,,,,,,,,,9104,,,azhpgn.las,azhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1476,NAD83 to NAD83(HARN) (3),,,,United States (USA) - California north of 38 deg N.,9613,,,,,,,,,9104,,,cnhpgn.las,cnhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1477,NAD83 to NAD83(HARN) (4),,,,United States (USA) - California south of 38 deg N.,9613,,,,,,,,,9104,,,cshpgn.las,cshpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1478,NAD83 to NAD83(HARN) (5),,,,United States (USA) - Colorado.,9613,,,,,,,,,9104,,,cohpgn.las,cohpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1479,NAD83 to NAD83(HARN) (6),,,,United States (USA) - Georgia.,9613,,,,,,,,,9104,,,gahpgn.las,gahpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1480,NAD83 to NAD83(HARN) (7),,,,United States (USA) - Florida.,9613,,,,,,,,,9104,,,flhpgn.las,flhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1481,NAD83 to NAD83(HARN) (8),,,,United States (USA) - Idaho and Montana - east of 113 deg W.,9613,,,,,,,,,9104,,,emhpgn.las,emhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1482,NAD83 to NAD83(HARN) (9),,,,United States (USA) - Idaho and Montana - west of 113 deg W.,9613,,,,,,,,,9104,,,wmhpgn.las,wmhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1483,NAD83 to NAD83(HARN) (10),,,,United States (USA) - Kentucky.,9613,,,,,,,,,9104,,,kyhpgn.las,kyhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1484,NAD83 to NAD83(HARN) (11),,,,United States (USA) - Louisiana.,9613,,,,,,,,,9104,,,lahpgn.las,lahpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1485,NAD83 to NAD83(HARN) (12),,,,United States (USA) - Delaware and Maryland.,9613,,,,,,,,,9104,,,mdhpgn.las,mdhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1486,NAD83 to NAD83(HARN) (13),,,,United States (USA) - Maine.,9613,,,,,,,,,9104,,,mehpgn.las,mehpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1487,NAD83 to NAD83(HARN) (14),,,,United States (USA) - Michigan.,9613,,,,,,,,,9104,,,mihpgn.las,mihpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1488,NAD83 to NAD83(HARN) (15),,,,United States (USA) - Mississippi.,9613,,,,,,,,,9104,,,mshpgn.las,mshpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1489,NAD83 to NAD83(HARN) (16),,,,United States (USA) - Nebraska.,9613,,,,,,,,,9104,,,nbhpgn.las,nbhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1490,NAD83 to NAD83(HARN) (17),,,,United States (USA) - Connecticut; Massachusetts; New Hampshire; Rhode Island; Vermont.,9613,,,,,,,,,9104,,,nehpgn.las,nehpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1491,NAD83 to NAD83(HARN) (18),,,,United States (USA) - New Mexico.,9613,,,,,,,,,9104,,,nmhpgn.las,nmhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1492,NAD83 to NAD83(HARN) (19),,,,United States (USA) - New York.,9613,,,,,,,,,9104,,,nyhpgn.las,nyhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1493,NAD83 to NAD83(HARN) (20),,,,United States (USA) - North Dakota.,9613,,,,,,,,,9104,,,ndhpgn.las,ndhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1494,NAD83 to NAD83(HARN) (21),,,,United States (USA) - Oklahoma.,9613,,,,,,,,,9104,,,okhpgn.las,okhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1495,NAD83 to NAD83(HARN) (22),,,,United States (USA) - Puerto Rico and the Virgin Islands.,9613,,,,,,,,,9104,,,pvhpgn.las,pvhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1496,NAD83 to NAD83(HARN) (23),,,,United States (USA) - South Dakota.,9613,,,,,,,,,9104,,,sdhpgn.las,sdhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1497,NAD83 to NAD83(HARN) (24),,,,United States (USA) - Tennessee,9613,,,,,,,,,9104,,,tnhpgn.las,tnhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1498,NAD83 to NAD83(HARN) (25),,,,United States (USA) - Texas east of 100deg West.,9613,,,,,,,,,9104,,,ethpgn.las,ethpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1499,NAD83 to NAD83(HARN) (26),,,,United States (USA) - Texas west of 100deg West.,9613,,,,,,,,,9104,,,wthpgn.las,wthpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1500,NAD83 to NAD83(HARN) (27),,,,United States (USA) - Virginia.,9613,,,,,,,,,9104,,,vahpgn.las,vahpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1501,NAD83 to NAD83(HARN) (28),,,,United States (USA) - Oregan; Washington.,9613,,,,,,,,,9104,,,wohpgn.las,wohpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1502,NAD83 to NAD83(HARN) (29),,,,United States (USA) - Wisconsin.,9613,,,,,,,,,9104,,,wihpgn.las,wihpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1503,NAD83 to NAD83(HARN) (30),,,,United States (USA) - Wyoming.,9613,,,,,,,,,9104,,,wyhpgn.las,wyhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey www.ngs.noaa.gov NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1504,Cape to Hartbeesthoek94 (1),,,,South Africa.,9603,-134.73,-110.92,-292.66,,,,,9001,,,,,,,1999-10-20 00:00:00,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,,
+1505,Hartbeesthoek94 to WGS 84 (1),,,,South Africa.,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1999-10-20 00:00:00,EPSG,EPSG,For many purposes Hartbeesthoek94 datum can be considered to be coincident with WGS 84.,
+1506,AGD66 to GDA94 (6),,,,Australia - Tasmania.,9615,,,,,,,,,9104,,,tas_1098.gsb,,,1999-10-20 00:00:00,http://www.delm.tas.gov.au/osg/Geodetic_transform.htm,EPSG,0.1m accuracy. Input expects longitudes to be positive west; EPSG GeogCS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,
+1507,AGD66 to GDA94 (7),,,,Australia - Northern Territory.,9615,,,,,,,,,9104,,,nt_0599.gsb,,,1999-10-20 00:00:00,http://www.anzlic.org.au/icsm/gdatm/chapter7.htm#high,EPSG,0.1m accuracy. Input expects longitudes to be positive west; EPSG GeogCS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,
+1508,CH1903 to WGS 84 (1),,,,Liechtenstein; Switzerland.,9607,660.077,13.551,369.344,2.484,1.783,2.939,5.66,9001,9113,,9202,,,,1999-10-20 00:00:00,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,Implemented in Bundesamt f�r Landestopographie programme GRANIT.,
+1509,CH1903+ to CHTRF95 (1),,,,Liechtenstein; Switzerland.,9603,674.374,15.056,405.346,,,,,9001,,,,,,,1999-10-20 00:00:00,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,,
+1510,CH1903 to WGS 84 (2),,,,Liechtenstein; Switzerland.,9603,674.374,15.056,405.346,,,,,9001,,,,,,,1999-10-20 00:00:00,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,These parameters are strictly between CH1903+ and CHTRF95 but are used from CH1903 as an approximation which is within the accuracy of the distortions within the CH1903 network.,
+1511,CHTRF95 to WGS 84 (1),,,,Liechtenstein; Switzerland.,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1999-10-20 00:00:00,EPSG,EPSG,For many purposes CHTRF95 can be considered to be coincident with WGS 84.,
+1512,Rassadiran to WGS 84 (1),,,,Iran - Taheri refinery site only.,9603,-133.63,-157.5,-158.62,,,,,9001,,,,,,,1999-10-20 00:00:00,Total-Fina,EPSG,Used only for terminal site.,
+1513,FD58 to WGS 84 (1),,,,Iran - Kangan district.,9603,-241.54,-163.64,396.06,,,,,9001,,,,,,,1999-10-20 00:00:00,Total-Fina,EPSG,,
+1514,ED50(ED77) to WGS 84 (1),,,,Iran,9606,-110.33,-97.73,-119.85,0.3423,1.1634,0.2715,0.063,9001,9104,,9202,,,,1999-10-20 00:00:00,National Cartographic Centre of Iran,EPSG,,
+1515,NAD83 to WGS 84 (5),,,,United States (USA),9607,-0.991,1.9072,0.5129,-0.000000125033,-0.000000046785,-0.000000056529,0.0,9001,9101,,9202,,,,1999-11-05 00:00:00, http://www.ngs.noaa.gov/CORS/Derivation.html,EPSG,Strictly between NAD83 and ITRF96(1997.0). Supersedes NAD83 to WGS 84 (4) (code 1308).,
+1516,La Canoa to WGS 84 (1),,,,Venezuela east - Delta Amacuro; Anzoategui; Bolivar; Monagas; Sucre states.,9603,-273.5,110.6,-357.9,,,,,9001,,,,,,,1999-11-05 00:00:00,"Lagoven; Gonzalez Losano y Rodriguez; \"Determination de los Parametros de Transformacion para el Oriente del Pais\"; VII Venezuelan Geophysical Congress; September 1994.",EPSG,Also used for PSAD56 to WGS 84 transformations. Parameter values estimated accuracy: � 2.0m; � 2.7m; � 1.3m respectively.,
+10101,Alabama CS27 East zone,Alabama East,,,United States (USA) - Alabama - Counties east of 86d 37m West.,9807,30.3,-85.5,,,0.99996,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+10102,Alabama CS27 West zone,Alabama West,,,United States (USA) - Alabama - Counties east of 86d 37m West.,9807,30.0,-87.3,,,0.999933333,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+10131,Alabama CS83 East zone,Alabama East,,,United States (USA) - Alabama - Counties east of 86d 37m West.,9807,30.3,-85.5,,,0.99996,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+10132,Alabama CS83 West zone,Alabama West,,,United States (USA) - Alabama - Counties east of 86d 37m West.,9807,30.0,-87.3,,,0.999933333,600000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+10201,Arizona Coordinate System east zone,Arizona East,,,United States (USA) - Arizona - Apache; Cochise; Gila; Graham; Greenlee and Navajo counties; i.e. east of about 110d 45m West.,9807,31.0,-110.1,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+10202,Arizona Coordinate System Central zone,Arizona Central,,,United States (USA) - Arizona - Coconino; Maricopa; Pima; Pinal; Santa Cruz and Yavapai counties; i.e between about 110d 45m & 113d 20m west,9807,31.0,-111.55,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+10203,Arizona Coordinate System west zone,Arizona West,,,United States (USA) - Arizona - La Paz; Mohave and Yuma counties; i.e west of about 113d 20m,9807,31.0,-113.45,,,0.999933333,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+10231,Arizona CS83 east zone,Arizona East,,,United States (USA) - Arizona - counties east of 110d 45m West,9807,31.0,-110.1,,,0.9999,213360.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,State law defines origin in International feet. FE = 700000ft.,95.30 96.29
+10232,Arizona CS83 Central zone,Arizona Central,,,United States (USA) - Arizona - Coconino; Maricopa; Pima; Pinal; Santa Cruz and Yavapai counties; i.e between about 110d 45m & 113d 20m west,9807,31.0,-111.55,,,0.9999,213360.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,State law defines origin in International feet. FE = 700000ft.,95.30 96.29
+10233,Arizona CS83 west zone,Arizona West,,,United States (USA) - Arizona - La Paz; Mohave and Yuma counties; i.e west of about 113d 20m,9807,31.0,-113.45,,,0.999933333,213360.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,State law defines origin in International feet. FE = 700000ft.,95.30 96.29
+10301,Arkansas CS27 North,Arkansas North,,,United States (USA) - Arkansas - counties north of 34d 50m North.,9802,34.2,-92.0,36.14,34.56,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10302,Arkansas CS27 South,Arkansas South,,,United States (USA) - Arkansas - counties south of 34d 50m North.,9802,32.4,-92.0,34.46,33.18,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10331,Arkansas CS83 North zone,Arkansas North,,,United States (USA) - Arkansas - counties north of 34d 50m North.,9802,34.2,-92.0,36.14,34.56,,400000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+10332,Arkansas CS83 South zone,Arkansas South,,,United States (USA) - Arkansas - counties south of 34d 50m North.,9802,32.4,-92.0,34.46,33.18,,400000.0,400000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+10401,California CS27 zone I,California zone I,,,United States (USA) - California - counties north of 40deg North.,9802,39.2,-122.0,41.4,40.0,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10402,California CS27 zone II,California zone II,,,United States (USA) - California - counties between 40d & 38d 15m North.,9802,37.4,-122.0,39.5,38.2,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10403,California CS27 zone III,California zone III,,,United States (USA) - California - counties between 38d 15m & 37d North.,9802,36.3,-120.3,38.26,37.04,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10404,California CS27 zone IV,California zone IV,,,United States (USA) - California - counties between 37d & 35d 30m North.,9802,35.2,-119.0,37.15,36.0,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10405,California CS27 zone V,California zone V,,,United States (USA) - California - counties between 35d 50m & 34d North.,9802,33.3,-118.0,35.28,34.02,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10406,California CS27 zone VI,California zone VI,,,United States (USA) - California - counties south of 34deg North.,9802,32.1,-116.15,33.53,32.47,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10407,California CS27 zone VII,California zone VII,,,United States (USA) - California - Los Angeles.,9802,34.08,-118.2,34.25,33.52,,4186692.58,416926.74,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10431,California CS83 zone 1,California zone 1,,,United States (USA) - California - counties north of 40deg North.,9802,39.2,-122.0,41.4,40.0,,2000000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+10432,California CS83 zone 2,California zone 2,,,United States (USA) - California - counties between 40d & 38d 15m North.,9802,37.4,-122.0,39.5,38.2,,2000000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+10433,California CS83 zone 3,California zone 3,,,United States (USA) - California - counties between 38d 15m & 37d North.,9802,36.3,-120.3,38.26,37.04,,2000000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+10434,California CS83 zone 4,California zone 4,,,United States (USA) - California - counties between 37d & 35d 30m North.,9802,35.2,-119.0,37.15,36.0,,2000000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+10435,California CS83 zone 5,California zone 5,,,United States (USA) - California - counties between 35d 50m & 34d North.,9802,33.3,-118.0,35.28,34.02,,2000000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+10436,California CS83 zone 6,California zone 6,,,United States (USA) - California - counties south of 34deg North.,9802,32.1,-116.15,33.53,32.47,,2000000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+10501,Colorado CS27 North zone,Colorado North,,,United States (USA) - Colorado - counties north of 39d 50m North.,9802,39.2,-105.3,39.43,40.47,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10502,Colorado CS27 Central zone,Colorado Central,,,United States (USA) - Colorado - counties between 39d 50m & 38d 30m North.,9802,37.5,-105.3,39.45,38.27,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10503,Colorado CS27 South zone,Colorado South,,,United States (USA) - Colorado - counties south of 38d 30m North.,9802,36.4,-105.3,38.26,37.14,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10531,Colorado CS83 North zone,Colorado North,,,United States (USA) - Colorado - counties north of 39d 50m North.,9802,39.2,-105.3,40.47,39.43,,914401.8289,304800.6096,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+10532,Colorado CS83 Central zone,Colorado Central,,,United States (USA) - Colorado - counties between 39d 50m & 38d 30m North.,9802,37.5,-105.3,39.45,38.27,,914401.8289,304800.6096,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+10533,Colorado CS83 South zone,Colorado South,,,United States (USA) - Colorado - counties south of 38d 30m North.,9802,36.4,-105.3,38.26,37.14,,914401.8289,304800.6096,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+10600,Connecticut CS27,Connecticut,,,United States (USA) - Connecticut.,9802,40.5,-72.45,41.52,41.12,,600000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10630,Connecticut CS83,Connecticut,,,United States (USA) - Connecticut.,9802,40.5,-72.45,41.52,41.12,,304800.6096,152400.3048,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+10700,Delaware CS27,Delaware,,,United States (USA) - Delaware.,9807,38.0,-75.25,,,0.999995,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+10730,Delaware CS83,Delaware,,,United States (USA) - Delaware.,9807,38.0,-75.25,,,0.999995,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+10901,Florida CS27 East zone,Florida East,,,United States (USA) - Florida - counties east of 81d 45m West.,9807,24.2,-81.0,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+10902,Florida CS27 West zone,Florida West,,,United States (USA) - Florida - counties west of 81d 45m West & south of 29d 30m North.,9807,24.2,-82.0,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+10903,Florida CS27 North zone,Florida North,,,United States (USA) - Florida - north of 29d 30m North & west of 82d West.,9802,29.0,-84.3,30.45,29.35,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+10931,Florida CS83 East zone,Florida East,,,United States (USA) - Florida - counties east of 81d 45m West.,9807,24.2,-81.0,,,0.999941177,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+10932,Florida CS83 West zone,Florida West,,,United States (USA) - Florida - counties west of 81d 45m West & south of 29d 30m North.,9807,24.2,-82.0,,,0.999941177,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+10933,Florida CS83 North zone,Florida North,,,United States (USA) - Florida - north of 29d 30m North & west of 82d West.,9802,29.0,-84.3,30.45,29.35,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+11001,Georgia CS27 East zone,Georgia East,,,United States (USA) - Georgia - counties east of 83d 15m West.,9807,30.0,-82.1,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+11002,Georgia CS27 West zone,Georgia West,,,United States (USA) - Georgia - counties west of 83d 15m West.,9807,30.0,-84.1,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+11031,Georgia CS83 East zone,Georgia East,,,United States (USA) - Georgia - counties east of 83d 15m West.,9807,30.0,-82.1,,,0.9999,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+11032,Georgia CS83 West zone,Georgia West,,,United States (USA) - Georgia - counties west of 83d 15m West.,9807,30.0,-84.1,,,0.9999,700000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+11101,Idaho CS27 East zone,Idaho East,,,United States (USA) - Idaho - counties east of 113d West.,9807,41.4,-112.1,,,0.999947368,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+11102,Idaho CS27 Central zone,Idaho Central,,,United States (USA) - Idaho - counties between 113d & 115d West.,9807,41.4,-114.0,,,0.999947368,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+11103,Idaho CS27 West zone,Idaho West,,,United States (USA) - Idaho - counties west of 115d West.,9807,41.4,-115.45,,,0.999933333,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+11131,Idaho CS83 East zone,Idaho East,,,United States (USA) - Idaho - counties east of 113d West.,9807,41.4,-112.1,,,0.999947368,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+11132,Idaho CS83 Central zone,Idaho Central,,,United States (USA) - Idaho - counties between 113d & 115d West.,9807,41.4,-114.0,,,0.999947368,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+11133,Idaho CS83 West zone,Idaho West,,,United States (USA) - Idaho - counties west of 115d West.,9807,41.4,-115.45,,,0.999933333,800000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+11201,Illinois CS27 East zone,Illinois East,,,United States (USA) - Illinois - counties east of 89d 05m West.,9807,36.4,-88.2,,,0.999975,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+11202,Illinois CS27 West zone,Illinois West,,,United States (USA) - Illinois - counties west of 89d 05m West.,9807,36.4,-90.1,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+11231,Illinois CS83 East zone,Illinois East,,,United States (USA) - Illinois - counties east of 89d 05m West.,9807,36.4,-88.2,,,0.999975,300000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+11232,Illinois CS83 West zone,Illinois West,,,United States (USA) - Illinois - counties west of 89d 05m West.,9807,36.4,-90.1,,,0.999941177,700000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+11301,Indiana CS27 East zone,Indiana East,,,United States (USA) - Indiana - counties east of 86d 25m West.,9807,37.3,-85.4,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+11302,Indiana CS27 West zone,Indiana West,,,United States (USA) - Indiana - counties west of 86d 25m West.,9807,37.3,-87.05,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+11331,Indiana CS83 East zone,Indiana East,,,United States (USA) - Indiana - counties east of 86d 25m West.,9807,37.3,-85.4,,,0.999966667,100000.0,250000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+11332,Indiana CS83 West zone,Indiana West,,,United States (USA) - Indiana - counties west of 86d 25m West.,9807,37.3,-87.05,,,0.999966667,900000.0,250000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+11401,Iowa CS27 North zone,Iowa North,,,United States (USA) - Iowa - counties north of 42deg North.,9802,41.3,-93.3,43.16,42.04,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+11402,Iowa CS27 South zone,Iowa South,,,United States (USA) - Iowa - counties south of 42deg North.,9802,40.0,-93.3,41.47,40.37,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+11431,Iowa CS83 North zone,Iowa North,,,United States (USA) - Iowa - counties north of 42deg North.,9802,41.3,-93.3,43.16,42.04,,1500000.0,1000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+11432,Iowa CS83 South zone,Iowa South,,,United States (USA) - Iowa - counties south of 42deg North.,9802,40.0,-93.3,41.47,40.37,,500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+11501,Kansas CS27 North zone,Kansas North,,,United States (USA) - Kansas - counties north of 38d 45m North.,9802,38.2,-98.0,39.47,38.43,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+11502,Kansas CS27 South zone,Kansas South,,,United States (USA) - Kansas - counties south of 38d 45m North.,9802,36.4,-98.3,38.34,37.16,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+11531,Kansas CS83 North zone,Kansas North,,,United States (USA) - Kansas - counties north of 38d 45m North.,9802,38.2,-98.0,39.47,38.43,,400000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+11532,Kansas CS83 South zone,Kansas South,,,United States (USA) - Kansas - counties south of 38d 45m North.,9802,36.4,-98.3,38.34,37.16,,400000.0,400000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+11601,Kentucky CS27 North zone,Kentucky North,,,United States (USA) - Kentucky - counties north of 37d 55m North.,9802,37.3,-84.15,37.58,38.58,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+11602,Kentucky CS27 South zone,Kentucky South,,,United States (USA) - Kentucky - counties south of 37d 55m North.,9802,36.2,-85.45,36.44,37.56,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+11631,Kentucky CS83 North zone,Kentucky North,,,United States (USA) - Kentucky - counties north of 37d 55m North.,9802,37.3,-84.15,37.58,37.58,,500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+11632,Kentucky CS83 South zone,Kentucky South,,,United States (USA) - Kentucky - counties south of 37d 55m North.,9802,36.2,-85.45,37.56,36.44,,500000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+11701,Louisiana CS27 North zone,Louisiana North,,,United States (USA) - Louisiana - counties north of 30d 55m North.,9802,30.4,-92.3,31.1,32.4,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+11702,Louisiana CS27 South zone,Louisiana South,,,United States (USA) - Louisiana - counties south of 30d 55m North. Also Gulf of Mexico LA shelf.,9802,28.4,-91.2,29.18,30.42,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+11731,Louisiana CS83 North zone,Louisiana North,,,United States (USA) - Louisiana - counties north of 30d 55m North.,9802,30.3,-92.3,32.4,31.1,,1000000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+11732,Louisiana CS83 South zone,Louisiana South,,,United States (USA) - Louisiana - counties south of 30d 55m North.,9802,28.3,-91.2,30.42,29.18,,1000000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+11801,Maine CS27 East zone,Maine East,,,United States (USA) - Maine - counties east of 69d 30m West.,9807,43.5,-68.3,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+11802,Maine CS27 West zone,Maine West,,,United States (USA) - Maine - counties west of 69d 30m West.,9807,42.5,-70.1,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+11831,Maine CS83 East zone,Maine East,,,United States (USA) - Maine - counties east of 69d 30m West.,9807,43.4,-68.3,,,0.9999,300000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+11832,Maine CS83 West zone,Maine West,,,United States (USA) - Maine - counties west of 69d 30m West.,9807,42.5,-70.1,,,0.999966667,900000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+11900,Maryland CS27,Maryland,,,United States (USA) - Maryland.,9802,37.5,-77.0,38.18,39.27,,800000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+11930,Maryland CS83,Maryland,,,United States (USA) - Maryland.,9802,37.4,-77.0,39.27,38.18,,400000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+12001,Massachusetts CS27 Mainland zone,Massachusetts Mainland,,,United States (USA) - Massachusetts onshore.,9802,41.0,-71.3,41.43,42.41,,600000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+12002,Massachusetts CS27 Island zone,Massachusetts Island,,,United States (USA) - Massachusetts islands.,9802,41.0,-70.3,41.17,41.29,,200000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+12031,Massachusetts CS83 Mainland zone,Massachusetts Mainland,,,United States (USA) - Massachusetts onshore.,9802,41.0,-71.3,42.41,41.43,,200000.0,750000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+12032,Massachusetts CS83 Island zone,Massachusetts Island,,,United States (USA) - Massachusetts islands.,9802,41.0,-70.3,41.29,41.17,,500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+12101,Michigan State Plane East zone,Michigan East,,,United States (USA) - Michigan.,9807,41.3,-83.4,,,0.999942857,500000.0,0.0,9003,9110,8901,,,,,1998-11-11 00:00:00,USGS Professional Paper #1395,EPSG,Obsolete. Superseded by north central and south zones.,95.30 96.29 98.22
+12102,Michigan State Plane Old Central zone,Michigan Old Central,,,United States (USA) - Michigan.,9807,41.3,-85.45,,,0.999909091,500000.0,0.0,9003,9110,8901,,,,,1998-11-11 00:00:00,USGS Professional Paper #1395,EPSG,Obsolete. Superseded by north central and south zones.,95.30 96.29 98.22
+12103,Michigan State Plane West zone,Michigan West,,,United States (USA) - Michigan.,9807,41.3,-88.45,,,0.999909091,500000.0,0.0,9003,9110,8901,,,,,1998-11-11 00:00:00,USGS Professional Paper #1395,EPSG,Obsolete. Superseded by north central and south zones.,95.30 96.29 98.22
+12111,Michigan CS27 North zone,Michigan North,,,United States (USA) - Michigan - counties north of 45d 45m North.,9802,44.47,-87.0,45.29,47.05,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.28 96.29 98.22 99.28
+12112,Michigan CS27 Central zone,Michigan Central,,,United States (USA) - Michigan - counties between 45d 45m & 43d 55m North.,9802,43.19,-84.2,44.11,45.42,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.28 96.29 98.22 99.28
+12113,Michigan CS27 South zone,Michigan South,,,United States (USA) - Michigan - counties south of 43d 55m North.,9802,41.3,-84.2,42.06,43.4,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.28 96.29 98.22 99.28
+12141,Michigan CS83 North zone,Michigan North,,,United States (USA) - Michigan - counties north of 45d 45m North.,9802,44.47,-87.0,47.05,45.29,,8000000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+12142,Michigan CS83 Central zone,Michigan Central,,,United States (USA) - Michigan - counties between 45d 45m & 43d 55m North.,9802,43.19,-84.22,45.42,44.11,,6000000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+12143,Michigan CS83 South zone,Michigan South,,,United States (USA) - Michigan - counties south of 43d 55m North.,9802,41.3,-84.22,43.4,42.06,,4000000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+12201,Minnesota CS27 North zone,Minnesota North,,,United States (USA) - Minnesota - counties north of 47d 10m North.,9802,46.3,-93.06,47.02,48.38,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+12202,Minnesota CS27 Central zone,Minnesota Central,,,United States (USA) - Minnesota - counties between 47d 10m & 45d 30m North.,9802,45.0,-94.15,45.37,47.03,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+12203,Minnesota CS27 South zone,Minnesota South,,,United States (USA) - Minnesota - counties south of 45d 30m North.,9802,43.0,-94.0,43.47,45.13,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+12231,Minnesota CS83 North zone,Minnesota North,,,United States (USA) - Minnesota - counties north of 47d 10m North.,9802,46.3,-93.06,48.38,47.02,,800000.0,100000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+12232,Minnesota CS83 Central zone,Minnesota Central,,,United States (USA) - Minnesota - counties between 47d 10m & 45d 30m North.,9802,45.0,-94.15,47.03,45.37,,800000.0,100000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+12233,Minnesota CS83 South zone,Minnesota South,,,United States (USA) - Minnesota - counties south of 45d 30m North.,9802,43.0,-94.0,45.13,43.47,,800000.0,100000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+12301,Mississippi CS27 East zone,Mississippi East,,,United States (USA) - Mississippi - counties east of 89d 40m West.,9807,29.4,-88.5,,,0.99996,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+12302,Mississippi CS27 West zone,Mississippi West,,,United States (USA) - Mississippi - counties west of 89d 40m West.,9807,30.3,-90.2,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+12331,Mississippi CS83 East zone,Mississippi East,,,United States (USA) - Mississippi - counties east of 89d 40m West.,9807,29.3,-88.5,,,0.99995,300000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+12332,Mississippi CS83 West zone,Mississippi West,,,United States (USA) - Mississippi - counties west of 89d 40m West.,9807,29.3,-90.2,,,0.99995,700000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+12401,Missouri CS27 East zone,Missouri East,,,United States (USA) - Missouri - counties east of 91d 45m West.,9807,35.5,-90.3,,,0.999933333,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.18 95.30 96.29
+12402,Missouri CS27 Central zone,Missouri Central,,,United States (USA) - Missouri - counties between 91d 45m & 93d 35m West.,9807,35.5,-92.3,,,0.999933333,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+12403,Missouri CS27 West zone,Missouri West,,,United States (USA) - Missouri - counties west of 93d 35m West.,9807,36.1,-94.3,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+12431,Missouri CS83 East zone,Missouri East,,,United States (USA) - Missouri - counties east of 91d 45m West..,9807,35.5,-90.3,,,0.999933333,250000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+12432,Missouri CS83 Central zone,Missouri Central,,,United States (USA) - Missouri - counties between 91d 45m & 93d 35m West,9807,35.5,-92.3,,,0.999933333,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+12433,Missouri CS83 West zone,Missouri West,,,United States (USA) - Missouri - counties west of 93d 35m West.,9807,36.1,-94.3,,,0.999941177,850000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+12501,Montana CS27 North zone,Montana North,,,United States (USA) - Montana - counties north of 47d 50m North.,9802,47.0,-109.3,48.43,47.51,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+12502,Montana CS27 Central zone,Montana Central,,,United States (USA) - Montana - counties between 47d 50m & 46d 40m North.,9802,45.5,-109.3,47.53,46.27,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+12503,Montana CS27 South zone,Montana South,,,United States (USA) - Montana - counties south of 46d 40m North.,9802,44.0,-109.3,46.24,44.52,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+12530,Montana CS83,Montana,,,United States (USA) - Montana.,9802,44.15,-109.3,49.0,45.0,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+12601,Nebraska CS27 North zone,Nebraska North,,,United States - Nebraska -Antelope; Blaine; Box Butte; Boyd; Brown; Burt; Cedar; Cherry; Cuming; Dakota; Dawes; Dixon; Garfield; Grant; Holt; Hooker; Keya Paha; Knox; Loup; Madison; Pierce; Rock; Sheridan; Sioux; Stanton; Thomas; Thurston; Wayne; Wheeler,9802,41.2,-100.0,41.51,42.49,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+12602,Nebraska CS27 South zone,Nebraska South,,,"United States (USA) - Nebraska - counties south of and including Scotts Bluff; Morrill; Garden; Arthur; McPherson; Logan; Custer; Valley; Greeley; Boome, Platte; Colfax; Dodge; Washington.",9802,39.4,-99.3,40.17,41.43,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+12630,Nebraska CS83,Nebraska,,,United States (USA) - Nebraska.,9802,39.5,-100.0,43.0,40.0,,500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+12701,Nevada CS27 East zone,Nevada East,,,United States (USA) - Nevada - counties east of 116d West & Eureka county.,9807,34.45,-115.35,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+12702,Nevada CS27 Central zone,Nevada Central,,,United States (USA) - Nevada - Lander & Nye counties.,9807,34.45,-116.4,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+12703,Nevada CS27 West zone,Nevada West,,,United States (USA) - Nevada - counties west of 117d 15m West.,9807,34.45,-118.35,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+12731,Nevada CS83 East zone,Nevada East,,,United States (USA) - Nevada - counties east of 116d West & Eureka county.,9807,34.45,-115.35,,,0.9999,200000.0,8000000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+12732,Nevada CS83 Central zone,Nevada Central,,,United States (USA) - Nevada - Lander & Nye counties.,9807,34.45,-116.4,,,0.9999,500000.0,6000000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+12733,Nevada CS83 West zone,Nevada West,,,United States (USA) - Nevada - counties west of 117d 15m West.,9807,34.45,-118.35,,,0.9999,800000.0,4000000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+12800,New Hampshire CS27,New Hampshire,,,United States (USA) - New Hampshire.,9807,42.3,-71.4,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+12830,New Hampshire CS83,New Hampshire,,,United States (USA) - New Hampshire.,9807,42.3,-71.4,,,0.999966667,300000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+12900,New Jersey CS27,New Jersey,,,United States (USA) - New Jersey.,9807,38.5,-74.4,,,0.999975,2000000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+12930,New Jersey CS83,New Jersey,,,United States (USA) - New Jersey.,9807,38.5,-74.3,,,0.9999,150000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+13001,New Mexico CS27 East zone,New Mexico East,,,United States (USA) - New Mexico - counties east of 105d West.,9807,31.0,-104.2,,,0.999909091,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+13002,New Mexico CS27 Central zone,New Mexico Central,,,United States (USA) - New Mexico - counties between 105d & 107d 15m West.,9807,31.0,-106.15,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+13003,New Mexico CS27 West zone,New Mexico West,,,United States (USA) - New Mexico - counties west of 107d 15m West.,9807,31.0,-107.5,,,0.999916667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+13031,New Mexico CS83 East zone,New Mexico East,,,United States (USA) - New Mexico - counties east of 105d West.,9807,31.0,-104.2,,,0.999909091,165000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+13032,New Mexico CS83 Central zone,New Mexico Central,,,United States (USA) - New Mexico - counties between 105d & 107d 15m West.,9807,31.0,-106.15,,,0.9999,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+13033,New Mexico CS83 West zone,New Mexico West,,,United States (USA) - New Mexico - counties west of 107d 15m West.,9807,31.0,-107.5,,,0.999916667,830000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+13101,New York CS27 East zone,New York East,,,United States (USA) - New York - counties east of 75d 15m West excluding Long Island.,9807,40.0,-74.2,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.18 95.30 96.29
+13102,New York CS27 Central zone,New York Central,,,United States (USA) - New York - counties between 75d 15m & 77d 30m West.,9807,40.0,-76.35,,,0.9999375,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+13103,New York CS27 West zone,New York West,,,United States (USA) - New York - counties west of 77d 30m West.,9807,40.0,-78.35,,,0.9999375,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+13104,New York CS27 Long Island zone,New York Long Island,,,United States (USA) - New York - Long Island.,9802,40.3,-74.0,41.02,40.4,,1000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13131,New York CS83 East zone,New York East,,,United States (USA) - New York - counties east of 75d 15m West excluding Long Island.,9807,38.5,-74.3,,,0.9999,150000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+13132,New York CS83 Central zone,New York Central,,,United States (USA) - New York - counties between 75d 15m & 77d 30m West.,9807,40.0,-76.35,,,0.9999375,250000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+13133,New York CS83 West zone,New York West,,,United States (USA) - New York - counties west of 77d 30m West.,9807,40.0,-78.35,,,0.9999375,350000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+13134,New York CS83 Long Island zone,New York Long Island,,,United States (USA) - New York - Long Island.,9802,40.1,-74.0,41.02,40.4,,300000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+13200,North Carolina CS27,North Carolina,,,United States (USA) - North Carolina.,9802,33.45,-79.0,34.2,36.1,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13230,North Carolina CS83,North Carolina,,,United States (USA) - North Carolina.,9802,33.45,-79.0,36.1,34.2,,609601.22,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+13301,North Dakota CS27 North zone,North Dakota North,,,United States (USA) - North Dakota - counties north of 47d 25m North.,9802,47.0,-100.3,47.26,48.44,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13302,North Dakota CS27 South zone,North Dakota South,,,United States (USA) - North Dakota - counties south of 47d 25m North.,9802,45.4,-100.3,46.11,47.29,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13331,North Dakota CS83 North zone,North Dakota North,,,United States (USA) - North Dakota - counties north of 47d 25m North.,9802,47.0,-100.3,48.44,47.26,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+13332,North Dakota CS83 South zone,North Dakota South,,,United States (USA) - North Dakota - counties south of 47d 25m North.,9802,45.4,-100.3,47.29,46.11,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+13401,Ohio CS27 North zone,Ohio North,,,United States (USA) - Ohio - counties north of 40d 15m North.,9802,39.4,-82.3,40.26,41.42,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13402,Ohio CS27 South zone,Ohio South,,,United States (USA) - Ohio - counties south of 40d 15m North.,9802,38.0,-82.3,38.44,40.02,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13431,Ohio CS83 North zone,Ohio North,,,United States (USA) - Ohio - counties north of 40d 15m North.,9802,39.4,-82.3,41.42,40.26,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+13432,Ohio CS83 South zone,Ohio South,,,United States (USA) - Ohio - counties south of 40d 15m North.,9802,38.0,-82.3,40.02,38.44,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+13501,Oklahoma CS27 North zone,Oklahoma North,,,United States (USA) - Oklahoma - counties north of 35d 20m North.,9802,35.0,-98.0,35.34,36.46,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13502,Oklahoma CS27 South zone,Oklahoma South,,,United States (USA) - Oklahoma - counties south of 35d 20m North.,9802,33.2,-98.0,33.56,35.14,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13531,Oklahoma CS83 North zone,Oklahoma North,,,United States (USA) - Oklahoma - counties north of 35d 20m North.,9802,35.0,-98.0,36.46,35.34,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+13532,Oklahoma CS83 South zone,Oklahoma South,,,United States (USA) - Oklahoma - counties south of 35d 20m North.,9802,33.2,-98.0,35.14,33.56,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+13601,Oregon CS27 North zone,Oregon North,,,United States (USA) - Oregon - counties north of 44d 15m North.,9802,43.4,-120.3,44.2,46.0,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13602,Oregon CS27 South zone,Oregon South,,,United States (USA) - Oregon - counties south of 44d 15m North.,9802,41.4,-120.3,42.2,44.0,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13631,Oregon CS83 North zone,Oregon North,,,United States (USA) - Oregon - counties north of 44d 15m North.,9802,43.4,-120.3,46.0,44.2,,2500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+13632,Oregon CS83 South zone,Oregon South,,,United States (USA) - Oregon - counties south of 44d 15m North.,9802,41.4,-120.3,44.0,42.2,,1500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+13701,Pennsylvania CS27 North zone,Pennsylvania North,,,United States (USA) - Pennsylvania - counties north of 40d 50m North.,9802,40.1,-77.45,40.53,41.57,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13702,Pennsylvania CS27 South zone,Pennsylvania South,,,United States (USA) - Pennsylvania - counties south of 40d 50m North.,9802,39.2,-77.45,39.56,40.48,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13731,Pennsylvania CS83 North zone,Pennsylvania North,,,United States (USA) - Pennsylvania - counties north of 40d 50m North.,9802,40.1,-77.45,41.57,40.53,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+13732,Pennsylvania CS83 South zone,Pennsylvania South,,,United States (USA) - Pennsylvania - counties south of 40d 50m North.,9802,39.2,-77.45,40.58,39.56,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+13800,Rhode Island CS27,Rhode Island,,,United States (USA) - Rhode Island.,9807,41.05,-71.3,,,0.9999938,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+13830,Rhode Island CS83,Rhode Island,,,United States (USA) - Rhode Island.,9807,41.05,-71.3,,,0.99999375,100000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+13901,South Carolina CS27 North zone,South Carolina North,,,United States (USA) - South Carolina counties north of and including Edgefield; Saluda; Lexington; Calhoun; Sumter; Florence; Marion & Horry.,9802,33.0,-81.0,33.46,34.58,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13902,South Carolina CS27 South zone,South Carolina South,,,United States (USA) - South Carolina - Aiken; Allendale; Bamberg; Barnwell; Beaufort; Berkeley; Charleston; Clarendon; Colleton; Dorchester; Georgetown; Hampton; Jasper; Orangeburg & Williamsburg counties.,9802,31.5,-81.0,32.2,33.4,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+13930,South Carolina CS83,South Carolina,,,United States (USA) - South Carolina.,9802,31.5,-81.0,34.5,32.3,,609600.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14001,South Dakota CS27 North zone,South Dakota North,,,United States (USA) - South Dakota - counties north of 44d 20m North.,9802,43.5,-100.0,44.25,45.41,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14002,South Dakota CS27 South zone,South Dakota South,,,United States (USA) - South Dakota - counties south of 44d 20m North.,9802,42.2,-100.2,42.5,44.24,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14031,South Dakota CS83 North zone,South Dakota North,,,United States (USA) - South Dakota - counties north of 44d 20m North.,9802,43.5,-100.0,45.41,44.25,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14032,South Dakota CS83 South zone,South Dakota South,,,United States (USA) - South Dakota - counties south of 44d 20m North.,9802,42.2,-100.2,44.24,42.5,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14100,Tennessee CS27,Tennessee,,,United States (USA) - Tennessee.,9802,34.4,-86.0,35.15,36.25,,100000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14130,Tennessee CS83,Tennessee,,,United States (USA) - Tennessee.,9802,34.2,-86.0,36.25,35.15,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14201,Texas CS27 North zone,Texas North,,,United States (USA) - Texas - counties north of 34d 20m North.,9802,34.0,-101.3,34.39,36.11,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14202,Texas CS27 North Central zone,Texas North Central,,,United States (USA) - Texas - counties between 34d 20m & 32deg North.,9802,31.4,-97.3,32.08,33.58,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14203,Texas CS27 Central zone,Texas Central,,,United States (USA) - Texas - counties between 32deg & 30d 10m North.,9802,29.4,-100.2,30.07,31.53,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14204,Texas CS27 South Central zone,Texas South Central,,,United States (USA) - Texas - counties between 30d 10m & 28d 05m North.,9802,27.5,-99.0,28.23,30.17,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14205,Texas CS27 South zone,Texas South,,,United States (USA) - Texas - counties south of 28d 05m North.,9802,25.4,-98.3,26.1,27.5,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14231,Texas CS83 North zone,Texas North,,,United States (USA) - Texas - counties north of 34d 20m North.,9802,34.0,-101.3,36.11,34.39,,200000.0,1000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14232,Texas CS83 North Central zone,Texas North Central,,,United States (USA) - Texas - counties between 34d 20m & 32deg North.,9802,31.4,-98.3,33.58,32.08,,600000.0,2000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14233,Texas CS83 Central zone,Texas Central,,,United States (USA) - Texas - counties between 32deg & 30d 10m North.,9802,29.4,-100.2,31.53,30.07,,700000.0,3000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14234,Texas CS83 South Central zone,Texas South Central,,,United States (USA) - Texas - counties between 30d 10m & 28d 05m North.,9802,27.5,-99.0,30.17,28.23,,600000.0,4000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14235,Texas CS83 South zone,Texas South,,,United States (USA) - Texas - counties south of 28d 05m North.,9802,25.4,-98.3,27.5,26.1,,300000.0,5000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14301,Utah CS27 North zone,Utah North,,,United States (USA) - Utah - counties north of 40d 50m North.,9802,40.2,-111.3,40.43,41.47,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14302,Utah CS27 Central zone,Utah Central,,,United States (USA) - Utah - counties between 40d 50m & 38d 30m North.,9802,38.2,-111.3,39.01,40.39,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14303,Utah CS27 South zone,Utah South,,,United States (USA) - Utah - counties south of 38d 30m North.,9802,36.4,-111.3,37.13,38.21,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14331,Utah CS83 North zone,Utah North,,,United States (USA) - Utah - counties north of 40d 50m North.,9802,40.2,-111.3,41.47,40.43,,500000.0,1000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14332,Utah CS83 Central zone,Utah Central,,,United States (USA) - Utah - counties between 40d 50m & 38d 30m North.,9802,38.2,-111.3,40.39,39.01,,500000.0,2000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14333,Utah CS83 South zone,Utah South,,,United States (USA) - Utah - counties south of 38d 30m North.,9802,36.4,-111.3,38.21,37.13,,500000.0,3000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14400,Vermont CS27,Vermont,,,United States (USA) - Vermont.,9807,42.3,-72.3,,,0.999964286,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+14430,Vermont CS83,Vermont,,,United States (USA) - Vermont.,9807,42.3,-72.3,,,0.999964286,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+14501,Virginia CS27 North zone,Virginia North,,,United States (USA) - Virginia - counties north of 38d 05m North.,9802,37.4,-78.3,38.02,39.12,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14502,Virginia CS27 South zone,Virginia South,,,United States (USA) - Virginia - counties south of 38d 05m North.,9802,36.2,-78.3,36.46,37.58,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14531,Virginia CS83 North zone,Virginia North,,,United States (USA) - Virginia - counties north of 38d 05m North.,9802,37.4,-78.3,39.12,38.02,,3500000.0,2000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14532,Virginia CS83 South zone,Virginia South,,,United States (USA) - Virginia - counties south of 38d 05m North.,9802,36.2,-78.3,37.58,36.46,,3500000.0,1000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14601,Washington CS27 North zone,Washington North,,,United States (USA) - Washington - counties north of 47d 30m North.,9802,47.0,-120.5,47.3,48.44,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14602,Washington CS27 South zone,Washington South,,,United States (USA) - Washington - counties south of 47d 30m North.,9802,45.2,-120.3,45.5,47.2,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14631,Washington CS83 North zone,Washington North,,,United States (USA) - Washington - counties north of 47d 30m North.,9802,47.0,-120.5,48.44,47.3,,500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14632,Washington CS83 South zone,Washington South,,,United States (USA) - Washington - counties south of 47d 30m North.,9802,45.2,-120.3,47.2,45.5,,500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14701,West Virginia CS27 North zone,West Virginia North,,,United States (USA) - West Virginia - counties north of 39deg North.,9802,38.3,-79.3,39.0,40.15,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14702,West Virginia CS27 South zone,West Virginia South,,,United States (USA) - West Virginia - counties south of 39deg North.,9802,37.0,-81.0,37.29,38.53,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14731,West Virginia CS83 North zone,West Virginia North,,,United States (USA) - West Virginia - counties north of 39deg North.,9802,38.3,-79.3,40.15,39.0,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14732,West Virginia CS83 South zone,West Virginia South,,,United States (USA) - West Virginia - counties south of 39deg North.,9802,37.0,-81.0,38.53,37.29,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14801,Wisconsin CS27 North zone,Wisconsin North,,,United States (USA) - Wisconsin - counties north of 45d 35m North.,9802,45.1,-90.0,45.34,46.46,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14802,Wisconsin CS27 Central zone,Wisconsin Central,,,United States (USA) - Wisconsin - counties between 45d 35m & 44d 15m North.,9802,43.5,-90.0,44.15,45.3,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14803,Wisconsin CS27 South zone,Wisconsin South,,,United States (USA) - Wisconsin - counties south of 44d 15m North.,9802,42.0,-90.0,42.44,44.04,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+14831,Wisconsin CS83 North zone,Wisconsin North,,,United States (USA) - Wisconsin - counties north of 45d 35m North.,9802,45.1,-90.0,46.46,45.34,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14832,Wisconsin CS83 Central zone,Wisconsin Central,,,United States (USA) - Wisconsin - counties between 45d 35m & 44d 15m North.,9802,43.5,-90.0,45.3,44.15,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14833,Wisconsin CS83 South zone,Wisconsin South,,,United States (USA) - Wisconsin - counties south of 44d 15m North.,9802,42.0,-90.0,44.04,42.44,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+14901,Wyoming CS27 East zone,Wyoming East,,,United States (USA) - Wyoming - counties east of 106d West.,9807,40.4,-105.1,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+14902,Wyoming CS27 East Central zone,Wyoming East Central,,,United States (USA) - Wyoming - counties between 106d & 108d 10m West.,9807,40.4,-107.2,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+14903,Wyoming CS27 West Central zone,Wyoming West Central,,,United States (USA) - Wyoming - counties between 108d 10m & 109d 40m West.,9807,40.4,-108.45,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+14904,Wyoming CS27 West zone,Wyoming West,,,United States (USA) - Wyoming - counties west of 109d 40m West.,9807,40.4,-110.05,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+14931,Wyoming CS83 East zone,Wyoming East,,,United States (USA) - Wyoming - counties east of 106d West.,9807,40.3,-105.1,,,0.9999375,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+14932,Wyoming CS83 East Central zone,Wyoming East Central,,,United States (USA) - Wyoming - counties between 106d & 108d 10m West.,9807,40.3,-107.2,,,0.9999375,400000.0,100000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+14933,Wyoming CS83 West Central zone,Wyoming West Central,,,United States (USA) - Wyoming - counties between 108d 10m & 109d 40m West.,9807,40.3,-108.45,,,0.9999375,600000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+14934,Wyoming CS83 West zone,Wyoming West,,,United States (USA) - Wyoming - counties west of 109d 40m West.,9807,40.3,-110.05,,,0.9999375,800000.0,100000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15001,Alaska CS27 zone 1,Alaska zone 1,,,United States (USA) - Alaska - east of 141 deg West; i.e. Panhandle.,9812,57.0,-133.4,323.07483685,323.07483685,0.9999,16404166.67,-16404166.67,9003,9110,8901,,,,,1997-04-11 00:00:00,USGS Professional Paper #1395,EPSG,,96.29 97.08
+15002,Alaska CS27 zone 2,Alaska zone 2,,,United States (USA) - Alaska - 141deg to 144deg West.,9807,54.0,-142.0,,,0.9999,500000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15003,Alaska CS27 zone 3,Alaska zone 3,,,United States (USA) - Alaska - 144deg to 148deg West excluding Kenai Peninsula; Perry Is. and Esther Is.,9807,54.0,-146.0,,,0.9999,500000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15004,Alaska CS27 zone 4,Alaska zone 4,,,United States (USA) - Alaska - 148deg to 152deg West.,9807,54.0,-150.0,,,0.9999,500000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15005,Alaska CS27 zone 5,Alaska zone 5,,,United States (USA) - Alaska - 152deg to 156deg West.,9807,54.0,-154.0,,,0.9999,500000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15006,Alaska CS27 zone 6,Alaska zone 6,,,United States (USA) - Alaska - 156deg to 160deg West.,9807,54.0,-158.0,,,0.9999,500000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15007,Alaska CS27 zone 7,Alaska zone 7,,,United States (USA) - Alaska - 160deg to 164deg West.,9807,54.0,-162.0,,,0.9999,700000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15008,Alaska CS27 zone 8,Alaska zone 8,,,United States (USA) - Alaska - 164deg to 168deg West north of 54d 30m North.,9807,54.0,-166.0,,,0.9999,500000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15009,Alaska CS27 zone 9,Alaska zone 9,,,United States (USA) - Alaska - west of 168deg West and north of 54d 30m North.,9807,54.0,-170.0,,,0.9999,600000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15010,Alaska CS27 zone 10,Alaska zone 10,,,United States (USA) - Alaska - Aleutian Islands.,9802,51.0,-176.0,53.5,51.5,,3000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+15031,Alaska CS83 zone 1,Alaska zone 1,,,United States (USA) - Alaska - east of 141 deg West; i.e. Panhandle.,9812,57.0,-133.4,323.07483685,323.07483685,0.9999,5000000.0,-5000000.0,9001,9110,8901,,,,,1996-09-12 00:00:00,NOAA manual NOS NGS 5,EPSG,,96.29
+15032,Alaska CS83 zone 2,Alaska zone 2,,,United States (USA) - Alaska - 141deg to 144deg West.,9807,54.0,-142.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15033,Alaska CS83 zone 3,Alaska zone 3,,,United States (USA) - Alaska - 144deg to 148deg West excluding Kenai Peninsula; Perry Is. and Esther Is.,9807,54.0,-146.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15034,Alaska CS83 zone 4,Alaska zone 4,,,United States (USA) - Alaska - 148deg to 152deg West.,9807,54.0,-150.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15035,Alaska CS83 zone 5,Alaska zone 5,,,United States (USA) - Alaska - 152deg to 156deg West.,9807,54.0,-154.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15036,Alaska CS83 zone 6,Alaska zone 6,,,United States (USA) - Alaska - 156deg to 160deg West.,9807,54.0,-158.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15037,Alaska CS83 zone 7,Alaska zone 7,,,United States (USA) - Alaska - 160deg to 164deg West.,9807,54.0,-162.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15038,Alaska CS83 zone 8,Alaska zone 8,,,United States (USA) - Alaska - 164deg to 168deg West north of 54d 30m North.,9807,54.0,-166.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15039,Alaska CS83 zone 9,Alaska zone 9,,,United States (USA) - Alaska - west of 168deg West and north of 54d 30m North.,9807,54.0,-170.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15040,Alaska CS83 zone 10,Alaska zone 10,,,United States (USA) - Alaska - Aleutian Islands.,9802,51.0,-176.0,53.5,51.5,,1000000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+15101,Hawaii CS27 zone 1,Hawaii zone 1,,,United States (USA) - Hawaii - island of Hawaii.,9807,18.5,-155.3,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15102,Hawaii CS27 zone 2,Hawaii zone 2,,,United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.,9807,20.2,-156.4,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15103,Hawaii CS27 zone 3,Hawaii zone 3,,,United States (USA) - Hawaii - Oahu.,9807,21.1,-158.0,,,0.99999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15104,Hawaii CS27 zone 4,Hawaii zone 4,,,United States (USA) - Hawaii - Kauai.,9807,21.5,-159.3,,,0.99999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15105,Hawaii CS27 zone 5,Hawaii zone 5,,,United States (USA) - Hawaii - Niihau.,9807,21.4,-160.1,,,1.0,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29
+15131,Hawaii CS83 zone 1,Hawaii zone 1,,,United States (USA) - Hawaii - island of Hawaii.,9807,18.5,-155.3,,,0.999966667,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15132,Hawaii CS83 zone 2,Hawaii zone 2,,,United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.,9807,20.2,-156.4,,,0.999966667,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15133,Hawaii CS83 zone 3,Hawaii zone 3,,,United States (USA) - Hawaii - Oahu.,9807,21.1,-158.0,,,0.99999,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15134,Hawaii CS83 zone 4,Hawaii zone 4,,,United States (USA) - Hawaii - Kauai.,9807,21.5,-159.3,,,0.99999,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15135,Hawaii CS83 zone 5,Hawaii zone 5,,,United States (USA) - Hawaii - Niihau.,9807,21.4,-160.1,,,1.0,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29
+15201,Puerto Rico CS27,Puerto Rico,,,Puerto Rico.,9802,17.5,-66.26,18.26,18.02,,500000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+15202,St. Croix CS27,St. Croix,,,Virgin Islands of US - St. Croix.,9802,17.5,-66.26,18.26,18.02,,500000.0,100000.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30 96.29 99.28
+15230,Puerto Rico & Virgin Islands CS83,Puerto Rico & Virgin Is.,,,Puerto Rico & Virgin Islands of US,9802,17.5,-66.26,18.26,18.02,,200000.0,200000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30 96.29 99.28
+15914,BLM zone 14N in feet,BLM 14N (feet),,,United States (USA) - Gulf of Mexico - west of 96 deg West approximately.,9807,0.0,-99.0,,,0.9996,1640416.67,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,Minerals Management Service offshore protraction diagrams.,EPSG,"Sometimes locally referred to as \"UTM zone 14\".",95.30 96.29
+15915,BLM zone 15N in feet,BLM 15N (feet),,,United States (USA) - Gulf of Mexico - 96 deg to 90 deg West approximately.,9807,0.0,-93.0,,,0.9996,1640416.67,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,Minerals Management Service offshore protraction diagrams.,EPSG,"Sometimes locally referred to as \"UTM zone 15\".",95.30 96.29
+15916,BLM zone 16N in feet,BLM 16N (feet),,,United States (USA) - Gulf of Mexico - 90 deg to 84 deg West approximately.,9807,0.0,-87.0,,,0.9996,1640416.67,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,Minerals Management Service offshore protraction diagrams.,EPSG,"Sometimes locally referred to as \"UTM zone 16\".",95.27 95.30 96.29
+15917,BLM zone 17N in feet,BLM 17N (feet),,,United States (USA) - Gulf of Mexico - east of 84 deg West approximately.,9807,0.0,-81.0,,,0.9996,1640416.67,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,Minerals Management Service offshore protraction diagrams.,EPSG,"Sometimes locally referred to as \"UTM zone 17\".",95.30 96.29
+16001,UTM zone 1N,,,,180deg to 174deg West; northern hemisphere.,9807,0.0,-177.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16002,UTM zone 2N,,,,174deg West to 168deg West; northern hemisphere.,9807,0.0,-171.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16003,UTM zone 3N,,,,168deg West to 162deg West; northern hemisphere.,9807,0.0,-165.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16004,UTM zone 4N,,,,162deg West to 156deg West; northern hemisphere.,9807,0.0,-159.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16005,UTM zone 5N,,,,156deg West to 150deg West; northern hemisphere.,9807,0.0,-153.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16006,UTM zone 6N,,,,150deg West to 144deg West; northern hemisphere.,9807,0.0,-147.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16007,UTM zone 7N,,,,144deg West to 138deg West; northern hemisphere.,9807,0.0,-141.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16008,UTM zone 8N,,,,138deg West to 132deg West; northern hemisphere.,9807,0.0,-135.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16009,UTM zone 9N,,,,132deg West to 126deg West; northern hemisphere.,9807,0.0,-129.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16010,UTM zone 10N,,,,130deg West to 120deg West; northern hemisphere.,9807,0.0,-123.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16011,UTM zone 11N,,,,120deg West to 114deg West; northern hemisphere.,9807,0.0,-117.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16012,UTM zone 12N,,,,114deg West to 108deg West; northern hemisphere.,9807,0.0,-111.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16013,UTM zone 13N,,,,108deg West to 102deg West; northern hemisphere.,9807,0.0,-105.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16014,UTM zone 14N,,,,102deg West to 96deg West; northern hemisphere.,9807,0.0,-99.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16015,UTM zone 15N,,,,96deg West to 90deg West; northern hemisphere.,9807,0.0,-93.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16016,UTM zone 16N,,,,90deg West to 84deg West; northern hemisphere.,9807,0.0,-87.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16017,UTM zone 17N,,,,84deg West to 78deg West; northern hemisphere.,9807,0.0,-81.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16018,UTM zone 18N,,,,78deg West to 72deg West; northern hemisphere.,9807,0.0,-75.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16019,UTM zone 19N,,,,72deg West to 66deg West; northern hemisphere.,9807,0.0,-69.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16020,UTM zone 20N,,,,66deg West to 60deg West; northern hemisphere.,9807,0.0,-63.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16021,UTM zone 21N,,,,60deg West to 54deg West; northern hemisphere.,9807,0.0,-57.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16022,UTM zone 22N,,,,54deg West to 48deg West; northern hemisphere.,9807,0.0,-51.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16023,UTM zone 23N,,,,48deg West to 42deg West; northern hemisphere.,9807,0.0,-45.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16024,UTM zone 24N,,,,42deg West to 36deg West; northern hemisphere.,9807,0.0,-39.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16025,UTM zone 25N,,,,36deg West to 30deg West; northern hemisphere.,9807,0.0,-33.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16026,UTM zone 26N,,,,30deg West to 24deg West; northern hemisphere.,9807,0.0,-27.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16027,UTM zone 27N,,,,24deg West to 18deg West; northern hemisphere.,9807,0.0,-21.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16028,UTM zone 28N,,,,18deg West to 12deg West; northern hemisphere.,9807,0.0,-15.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16029,UTM zone 29N,,,,12deg West to 6deg West; northern hemisphere.,9807,0.0,-9.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16030,UTM zone 30N,,,,6deg West to 0deg; northern hemisphere.,9807,0.0,-3.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16031,UTM zone 31N,,,,0deg to 6deg East; northern hemisphere.,9807,0.0,3.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16032,UTM zone 32N,,,,6deg East to 12deg East; northern hemisphere.,9807,0.0,9.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16033,UTM zone 33N,,,,12deg East to 18deg East; northern hemisphere.,9807,0.0,15.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16034,UTM zone 34N,,,,18deg East to 24deg East; northern hemisphere.,9807,0.0,21.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16035,UTM zone 35N,,,,24deg East to 30deg East; northern hemisphere.,9807,0.0,27.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16036,UTM zone 36N,,,,30deg East to 36deg East; northern hemisphere.,9807,0.0,33.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16037,UTM zone 37N,,,,36deg East to 42deg East; northern hemisphere.,9807,0.0,39.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16038,UTM zone 38N,,,,42deg East to 48deg East; northern hemisphere.,9807,0.0,45.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16039,UTM zone 39N,,,,48deg East to 54deg East; northern hemisphere.,9807,0.0,51.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16040,UTM zone 40N,,,,54deg East to 60deg East; northern hemisphere.,9807,0.0,57.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16041,UTM zone 41N,,,,60deg East to 66deg East; northern hemisphere.,9807,0.0,63.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16042,UTM zone 42N,,,,66deg East to 72deg East; northern hemisphere.,9807,0.0,69.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16043,UTM zone 43N,,,,72deg East to 78deg East; northern hemisphere.,9807,0.0,75.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16044,UTM zone 44N,,,,78deg East to 84deg East; northern hemisphere.,9807,0.0,81.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16045,UTM zone 45N,,,,84deg East to 90deg East; northern hemisphere.,9807,0.0,87.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16046,UTM zone 46N,,,,90deg East to 96deg East; northern hemisphere.,9807,0.0,93.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16047,UTM zone 47N,,,,96deg East to 102eg East; northern hemisphere.,9807,0.0,99.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16048,UTM zone 48N,,,,102deg East to 108deg East; northern hemisphere.,9807,0.0,105.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16049,UTM zone 49N,,,,108deg East to 114deg East; northern hemisphere.,9807,0.0,111.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16050,UTM zone 50N,,,,114deg East to 120deg East; northern hemisphere.,9807,0.0,117.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16051,UTM zone 51N,,,,120deg East to 126deg East; northern hemisphere.,9807,0.0,123.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16052,UTM zone 52N,,,,126deg East to 132deg East; northern hemisphere.,9807,0.0,129.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16053,UTM zone 53N,,,,132deg East to 138deg East; northern hemisphere.,9807,0.0,135.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16054,UTM zone 54N,,,,138deg East to 144deg East; northern hemisphere.,9807,0.0,141.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16055,UTM zone 55N,,,,144deg East to 150deg East; northern hemisphere.,9807,0.0,147.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16056,UTM zone 56N,,,,150deg East to 156deg East; northern hemisphere.,9807,0.0,153.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16057,UTM zone 57N,,,,156deg East to 162deg East; northern hemisphere.,9807,0.0,159.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16058,UTM zone 58N,,,,162deg East to 168deg East; northern hemisphere.,9807,0.0,165.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16059,UTM zone 59N,,,,168deg East to 174deg East; northern hemisphere.,9807,0.0,171.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16060,UTM zone 60N,,,,174deg East to 180deg; northern hemisphere.,9807,0.0,177.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16061,Universal Polar Stereographic North,UPS North,,,Northern hemisphere polar area.,9810,90.0,0.0,,,0.994,2000000.0,2000000.0,9001,9102,8901,,,,,1997-06-16 00:00:00,,EPSG,,97.18
+16101,UTM zone 1S,,,,180deg to 174deg West; southern hemisphere.,9807,0.0,-177.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16102,UTM zone 2S,,,,174deg West to 168deg West; southern hemisphere.,9807,0.0,-171.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16103,UTM zone 3S,,,,168deg West to 162deg West; southern hemisphere.,9807,0.0,-165.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16104,UTM zone 4S,,,,162deg West to 156deg West; southern hemisphere.,9807,0.0,-159.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16105,UTM zone 5S,,,,156deg West to 150deg West; southern hemisphere.,9807,0.0,-153.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16106,UTM zone 6S,,,,150deg West to 144deg West; southern hemisphere.,9807,0.0,-147.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16107,UTM zone 7S,,,,144deg West to 138deg West; southern hemisphere.,9807,0.0,-141.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16108,UTM zone 8S,,,,138deg West to 132deg West; southern hemisphere.,9807,0.0,-135.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16109,UTM zone 9S,,,,132deg West to 126deg West; southern hemisphere.,9807,0.0,-129.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16110,UTM zone 10S,,,,130deg West to 120deg West; southern hemisphere.,9807,0.0,-123.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16111,UTM zone 11S,,,,120deg West to 114deg West; southern hemisphere.,9807,0.0,-117.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16112,UTM zone 12S,,,,114deg West to 108deg West; southern hemisphere.,9807,0.0,-111.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16113,UTM zone 13S,,,,108deg West to 102deg West; southern hemisphere.,9807,0.0,-105.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16114,UTM zone 14S,,,,102deg West to 96deg West; southern hemisphere.,9807,0.0,-99.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16115,UTM zone 15S,,,,96deg West to 90deg West; southern hemisphere.,9807,0.0,-93.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16116,UTM zone 16S,,,,90deg West to 84deg West; southern hemisphere.,9807,0.0,-87.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16117,UTM zone 17S,,,,84deg West to 78deg West; southern hemisphere.,9807,0.0,-81.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16118,UTM zone 18S,,,,78deg West to 72deg West; southern hemisphere.,9807,0.0,-75.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16119,UTM zone 19S,,,,72deg West to 66deg West; southern hemisphere.,9807,0.0,-69.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16120,UTM zone 20S,,,,66deg West to 60deg West; southern hemisphere.,9807,0.0,-63.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16121,UTM zone 21S,,,,60deg West to 54deg West; southern hemisphere.,9807,0.0,-57.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16122,UTM zone 22S,,,,54deg West to 48deg West; southern hemisphere.,9807,0.0,-51.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16123,UTM zone 23S,,,,48deg West to 42deg West; southern hemisphere.,9807,0.0,-45.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16124,UTM zone 24S,,,,42deg West to 36deg West; southern hemisphere.,9807,0.0,-39.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16125,UTM zone 25S,,,,36deg West to 30deg West; southern hemisphere.,9807,0.0,-33.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16126,UTM zone 26S,,,,30deg West to 24deg West; southern hemisphere.,9807,0.0,-27.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16127,UTM zone 27S,,,,24deg West to 18deg West; southern hemisphere.,9807,0.0,-21.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16128,UTM zone 28S,,,,18deg West to 12deg West; southern hemisphere.,9807,0.0,-15.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16129,UTM zone 29S,,,,12deg West to 6deg West; southern hemisphere.,9807,0.0,-9.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16130,UTM zone 30S,,,,6deg West to 0deg; southern hemisphere.,9807,0.0,-3.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16131,UTM zone 31S,,,,0deg to 6deg East; southern hemisphere.,9807,0.0,3.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16132,UTM zone 32S,,,,6deg East to 12deg East; southern hemisphere.,9807,0.0,9.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16133,UTM zone 33S,,,,12deg East to 18deg East; southern hemisphere.,9807,0.0,15.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16134,UTM zone 34S,,,,18deg East to 24deg East; southern hemisphere.,9807,0.0,21.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16135,UTM zone 35S,,,,24deg East to 30deg East; southern hemisphere.,9807,0.0,27.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16136,UTM zone 36S,,,,30deg East to 36deg East; southern hemisphere.,9807,0.0,33.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16137,UTM zone 37S,,,,36deg East to 42deg East; southern hemisphere.,9807,0.0,39.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16138,UTM zone 38S,,,,42deg East to 48deg East; southern hemisphere.,9807,0.0,45.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16139,UTM zone 39S,,,,48deg East to 54deg East; southern hemisphere.,9807,0.0,51.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16140,UTM zone 40S,,,,54deg East to 60deg East; southern hemisphere.,9807,0.0,57.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16141,UTM zone 41S,,,,60deg East to 66deg East; southern hemisphere.,9807,0.0,63.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16142,UTM zone 42S,,,,66deg East to 72deg East; southern hemisphere.,9807,0.0,69.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16143,UTM zone 43S,,,,72deg East to 78deg East; southern hemisphere.,9807,0.0,75.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16144,UTM zone 44S,,,,78deg East to 84deg East; southern hemisphere.,9807,0.0,81.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16145,UTM zone 45S,,,,84deg East to 90deg East; southern hemisphere.,9807,0.0,87.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16146,UTM zone 46S,,,,90deg East to 96deg East; southern hemisphere.,9807,0.0,93.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16147,UTM zone 47S,,,,96deg East to 102eg East; southern hemisphere.,9807,0.0,99.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16148,UTM zone 48S,,,,102deg East to 108deg East; southern hemisphere.,9807,0.0,105.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16149,UTM zone 49S,,,,108deg East to 114deg East; southern hemisphere.,9807,0.0,111.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16150,UTM zone 50S,,,,114deg East to 120deg East; southern hemisphere.,9807,0.0,117.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16151,UTM zone 51S,,,,120deg East to 126deg East; southern hemisphere.,9807,0.0,123.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16152,UTM zone 52S,,,,126deg East to 132deg East; southern hemisphere.,9807,0.0,129.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16153,UTM zone 53S,,,,132deg East to 138deg East; southern hemisphere.,9807,0.0,135.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16154,UTM zone 54S,,,,138deg East to 144deg East; southern hemisphere.,9807,0.0,141.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16155,UTM zone 55S,,,,144deg East to 150deg East; southern hemisphere.,9807,0.0,147.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16156,UTM zone 56S,,,,150deg East to 156deg East; southern hemisphere.,9807,0.0,153.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16157,UTM zone 57S,,,,156deg East to 162deg East; southern hemisphere.,9807,0.0,159.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16158,UTM zone 58S,,,,162deg East to 168deg East; southern hemisphere.,9807,0.0,165.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16159,UTM zone 59S,,,,168deg East to 174deg East; southern hemisphere.,9807,0.0,171.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16160,UTM zone 60S,,,,174deg East to 180deg; southern hemisphere.,9807,0.0,177.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16161,Universal Polar Stereographic South,UPS South,,,Southern hemisphere polar area.,9810,-90.0,0.0,,,0.994,2000000.0,2000000.0,9001,9102,8901,,,,,1997-06-16 00:00:00,,EPSG,,97.18
+16202,Gauss-Kruger zone 2,,,,6deg East to 12deg East; northern hemisphere.,9807,0.0,9.0,,,1.0,2500000.0,0.0,9001,9102,8901,,,,,1998-06-30 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,
+16203,Gauss-Kruger zone 3,,,,12deg East to 18deg East; northern hemisphere.,9807,0.0,15.0,,,1.0,3500000.0,0.0,9001,9102,8901,,,,,1998-06-30 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,
+16204,Gauss-Kruger zone 4,,,,18deg East to 24deg East; northern hemisphere.,9807,0.0,21.0,,,1.0,4500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16205,Gauss-Kruger zone 5,,,,24deg East to 30deg East; northern hemisphere.,9807,0.0,27.0,,,1.0,5500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16206,Gauss-Kruger zone 6,,,,30deg East to 36deg East; northern hemisphere.,9807,0.0,33.0,,,1.0,6500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16207,Gauss-Kruger zone 7,,,,36deg East to 42deg East; northern hemisphere.,9807,0.0,39.0,,,1.0,7500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16208,Gauss-Kruger zone 8,,,,42deg East to 48deg East; northern hemisphere.,9807,0.0,45.0,,,1.0,8500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16209,Gauss-Kruger zone 9,,,,48deg East to 54deg East; northern hemisphere.,9807,0.0,51.0,,,1.0,9500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16210,Gauss-Kruger zone 10,,,,54deg East to 60deg East; northern hemisphere.,9807,0.0,57.0,,,1.0,10500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16211,Gauss-Kruger zone 11,,,,60deg East to 66deg East; northern hemisphere.,9807,0.0,63.0,,,1.0,11500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16212,Gauss-Kruger zone 12,,,,66deg East to 72deg East; northern hemisphere.,9807,0.0,69.0,,,1.0,12500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16213,Gauss-Kruger zone 13,,,,72deg East to 78deg East; northern hemisphere.,9807,0.0,75.0,,,1.0,13500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16214,Gauss-Kruger zone 14,,,,78deg East to 84deg East; northern hemisphere.,9807,0.0,81.0,,,1.0,14500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16215,Gauss-Kruger zone 15,,,,84deg East to 90deg East; northern hemisphere.,9807,0.0,87.0,,,1.0,15500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16216,Gauss-Kruger zone 16,,,,90deg East to 96deg East; northern hemisphere.,9807,0.0,93.0,,,1.0,16500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16217,Gauss-Kruger zone 17,,,,96deg East to 102eg East; northern hemisphere.,9807,0.0,99.0,,,1.0,17500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16218,Gauss-Kruger zone 18,,,,102deg East to 108deg East; northern hemisphere.,9807,0.0,105.0,,,1.0,18500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16219,Gauss-Kruger zone 19,,,,108deg East to 114deg East; northern hemisphere.,9807,0.0,111.0,,,1.0,19500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16220,Gauss-Kruger zone 20,,,,114deg East to 120deg East; northern hemisphere.,9807,0.0,117.0,,,1.0,20500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16221,Gauss-Kruger zone 21,,,,120deg East to 126deg East; northern hemisphere.,9807,0.0,123.0,,,1.0,21500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16222,Gauss-Kruger zone 22,,,,126deg East to 132deg East; northern hemisphere.,9807,0.0,129.0,,,1.0,22500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16223,Gauss-Kruger zone 23,,,,132deg East to 138deg East; northern hemisphere.,9807,0.0,135.0,,,1.0,23500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16224,Gauss-Kruger zone 24,,,,138deg East to 144deg East; northern hemisphere.,9807,0.0,141.0,,,1.0,24500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16225,Gauss-Kruger zone 25,,,,144deg East to 150deg East; northern hemisphere.,9807,0.0,147.0,,,1.0,25500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16226,Gauss-Kruger zone 26,,,,150deg East to 156deg East; northern hemisphere.,9807,0.0,153.0,,,1.0,26500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16227,Gauss-Kruger zone 27,,,,156deg East to 162deg East; northern hemisphere.,9807,0.0,159.0,,,1.0,27500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16228,Gauss-Kruger zone 28,,,,162deg East to 168deg East; northern hemisphere.,9807,0.0,165.0,,,1.0,28500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16229,Gauss-Kruger zone 29,,,,168deg East to 174deg East; northern hemisphere.,9807,0.0,171.0,,,1.0,29500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16230,Gauss-Kruger zone 30,,,,174deg East to 180deg; northern hemisphere.,9807,0.0,177.0,,,1.0,30500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16231,Gauss-Kruger zone 31,,,,180deg to 174deg West; northern hemisphere.,9807,0.0,-177.0,,,1.0,31500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16232,Gauss-Kruger zone 32,,,,174deg West to 168deg West; northern hemisphere.,9807,0.0,-171.0,,,1.0,32500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16302,Gauss-Kruger 2N,,,,6deg East to 12deg East; northern hemisphere.,9807,0.0,9.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1998-06-30 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,
+16303,Gauss-Kruger 3N,,,,12deg East to 18deg East; northern hemisphere.,9807,0.0,15.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1998-06-30 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,
+16304,Gauss-Kruger 4N,,,,18deg East to 24deg East; northern hemisphere.,9807,0.0,21.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16305,Gauss-Kruger 5N,,,,24deg East to 30deg East; northern hemisphere.,9807,0.0,27.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16306,Gauss-Kruger 6N,,,,30deg East to 36deg East; northern hemisphere.,9807,0.0,33.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16307,Gauss-Kruger 7N,,,,36deg East to 42deg East; northern hemisphere.,9807,0.0,39.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16308,Gauss-Kruger 8N,,,,42deg East to 48deg East; northern hemisphere.,9807,0.0,45.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16309,Gauss-Kruger 9N,,,,48deg East to 54deg East; northern hemisphere.,9807,0.0,51.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16310,Gauss-Kruger 10N,,,,54deg East to 60deg East; northern hemisphere.,9807,0.0,57.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16311,Gauss-Kruger 11N,,,,60deg East to 66deg East; northern hemisphere.,9807,0.0,63.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16312,Gauss-Kruger 12N,,,,66deg East to 72deg East; northern hemisphere.,9807,0.0,69.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16313,Gauss-Kruger 13N,,,,72deg East to 78deg East; northern hemisphere.,9807,0.0,75.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16314,Gauss-Kruger 14N,,,,78deg East to 84deg East; northern hemisphere.,9807,0.0,81.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16315,Gauss-Kruger 15N,,,,84deg East to 90deg East; northern hemisphere.,9807,0.0,87.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16316,Gauss-Kruger 16N,,,,90deg East to 96deg East; northern hemisphere.,9807,0.0,93.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16317,Gauss-Kruger 17N,,,,96deg East to 102eg East; northern hemisphere.,9807,0.0,99.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16318,Gauss-Kruger 18N,,,,102deg East to 108deg East; northern hemisphere.,9807,0.0,105.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16319,Gauss-Kruger 19N,,,,108deg East to 114deg East; northern hemisphere.,9807,0.0,111.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16320,Gauss-Kruger 20N,,,,114deg East to 120deg East; northern hemisphere.,9807,0.0,117.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16321,Gauss-Kruger 21N,,,,120deg East to 126deg East; northern hemisphere.,9807,0.0,123.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16322,Gauss-Kruger 22N,,,,126deg East to 132deg East; northern hemisphere.,9807,0.0,129.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16323,Gauss-Kruger 23N,,,,132deg East to 138deg East; northern hemisphere.,9807,0.0,135.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16324,Gauss-Kruger 24N,,,,138deg East to 144deg East; northern hemisphere.,9807,0.0,141.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16325,Gauss-Kruger 25N,,,,144deg East to 150deg East; northern hemisphere.,9807,0.0,147.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16326,Gauss-Kruger 26N,,,,150deg East to 156deg East; northern hemisphere.,9807,0.0,153.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16327,Gauss-Kruger 27N,,,,156deg East to 162deg East; northern hemisphere.,9807,0.0,159.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16328,Gauss-Kruger 28N,,,,162deg East to 168deg East; northern hemisphere.,9807,0.0,165.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16329,Gauss-Kruger 29N,,,,168deg East to 174deg East; northern hemisphere.,9807,0.0,171.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16330,Gauss-Kruger 30N,,,,174deg East to 180deg; northern hemisphere.,9807,0.0,177.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16331,Gauss-Kruger 31N,,,,180deg to 174deg West; northern hemisphere.,9807,0.0,-177.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16332,Gauss-Kruger 32N,,,,174deg West to 168deg West; northern hemisphere.,9807,0.0,-171.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16400,TM 0 N,,,,United Kingdom (UKCS) - offshore North Sea.,9807,0.0,0.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1998-11-11 00:00:00,Shell UK,EPSG,,
+16405,TM 5 NE,,,,Netherlands - offshore.,9807,0.0,5.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1998-11-11 00:00:00,NAM,EPSG,,
+16506,TM 106 NE,,,,Vietnam - offshore.,9807,0.0,106.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1998-11-11 00:00:00,PetroVietnam,EPSG,,
+16611,TM 11.30 SE,,,,Angola - offshore.,9807,0.0,11.3,,,0.9996,500000.0,10000000.0,9001,9110,8901,,,,,1998-11-11 00:00:00,Esso Angola,EPSG,,
+16612,TM 12 SE,,,,Angola - offshore.,9807,0.0,12.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1998-11-11 00:00:00,Shell Angola,EPSG,,
+16636,TM 36 SE,,,,Mozambique - offshore.,9807,0.0,36.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1998-11-11 00:00:00,BP Mozambique,EPSG,,
+17348,Map Grid of Australia zone 48,MGA zone 48,,,Australia 102deg East to 108deg East.,9807,0.0,105.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17349,Map Grid of Australia zone 49,MGA zone 49,,,Australia 108deg East to 114deg East.,9807,0.0,111.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17350,Map Grid of Australia zone 50,MGA zone 50,,,Australia 114deg East to 120deg East.,9807,0.0,117.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17351,Map Grid of Australia zone 51,MGA zone 51,,,Australia 120deg East to 126deg East.,9807,0.0,123.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17352,Map Grid of Australia zone 52,MGA zone 52,,,Australia 126deg East to 132deg East.,9807,0.0,129.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17353,Map Grid of Australia zone 53,MGA zone 53,,,Australia 132deg East to 138deg East.,9807,0.0,135.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17354,Map Grid of Australia zone 54,MGA zone 54,,,Australia 138deg East to 144deg East.,9807,0.0,141.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17355,Map Grid of Australia zone 55,MGA zone 55,,,Australia 144deg East to 150deg East.,9807,0.0,147.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17356,Map Grid of Australia zone 56,MGA zone 56,,,Australia 150deg East to 156deg East.,9807,0.0,153.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17357,Map Grid of Australia zone 57,MGA zone 57,,,Australia 156deg East to 162deg East.,9807,0.0,159.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17358,Map Grid of Australia zone 58,MGA zone 58,,,Australia 162deg East to 168deg East.,9807,0.0,165.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17448,Australian Map Grid zone 48,AMG zone 48,,,Australia 102deg East to 108deg East.,9807,0.0,105.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17449,Australian Map Grid zone 49,AMG zone 49,,,Australia 108deg East to 114deg East.,9807,0.0,111.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17450,Australian Map Grid zone 50,AMG zone 50,,,Australia 114deg East to 120deg East.,9807,0.0,117.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17451,Australian Map Grid zone 51,AMG zone 51,,,Australia 120deg East to 126deg East.,9807,0.0,123.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17452,Australian Map Grid zone 52,AMG zone 52,,,Australia 126deg East to 132deg East.,9807,0.0,129.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17453,Australian Map Grid zone 53,AMG zone 53,,,Australia 132deg East to 138deg East.,9807,0.0,135.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17454,Australian Map Grid zone 54,AMG zone 54,,,Australia 138deg East to 144deg East. Papua New Guinea west of 144 deg East.,9807,0.0,141.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17455,Australian Map Grid zone 55,AMG zone 55,,,Australia 144deg East to 150deg East. Papua New Guinea 144deg East to 150deg East.,9807,0.0,147.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17456,Australian Map Grid zone 56,AMG zone 56,,,Australia 150deg East to 156deg East.,9807,0.0,153.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17457,Australian Map Grid zone 57,AMG zone 57,,,Australia 156deg East to 162deg East.,9807,0.0,159.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17458,Australian Map Grid zone 58,AMG zone 58,,,Australia 162deg East to 168deg East.,9807,0.0,165.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30 96.29
+17515,South African Survey Grid zone 15,S. African Grid zone 15,,,South Africa - Walvis Bay.,9808,0.0,15.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29
+17517,South African Survey Grid zone 17,S. African Grid zone 17,,,South Africa - west of 18 deg East.,9808,0.0,17.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29
+17519,South African Survey Grid zone 19,S. African Grid zone 19,,,South Africa - 18 to 20 deg East.,9808,0.0,19.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29
+17521,South African Survey Grid zone 21,S. African Grid zone 21,,,South Africa - 20 to 22 deg East.,9808,0.0,21.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29
+17523,South African Survey Grid zone 23,S. African Grid zone 23,,,South Africa - 22 to 24 deg East.,9808,0.0,23.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29
+17525,South African Survey Grid zone 25,S. African Grid zone 25,,,Lestho - west of 26 deg East; South Africa - 24 to 26 deg East.,9808,0.0,25.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29
+17527,South African Survey Grid zone 27,S. African Grid zone 27,,,Lestho - east of 26 deg East; South Africa - 26 to 28 deg East.,9808,0.0,27.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29
+17529,South African Survey Grid zone 29,S. African Grid zone 29,,,South Africa - 28 to 30 deg East.,9808,0.0,29.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29
+17531,South African Survey Grid zone 31,S. African Grid zone 31,,,South Africa - 30 to 32 deg East; Swaziland.,9808,0.0,31.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29
+17533,South African Survey Grid zone 33,S. African Grid zone 33,,,South Africa - east of 32 deg East.,9808,0.0,33.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29
+17611,South West African Survey Grid zone 11,SW African Grid zone 11,,,Namibia - west of 12 deg East.,9808,-22.0,11.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29 97.16
+17613,South West African Survey Grid zone 13,SW African Grid zone 13,,,Namibia - 12 to 14 deg East.,9808,-22.0,13.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29 97.16
+17615,South West African Survey Grid zone 15,SW African Grid zone 15,,,Namibia - 14 to 16 deg East.,9808,-22.0,15.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29 97.16
+17617,South West African Survey Grid zone 17,SW African Grid zone 17,,,Namibia - 16 to 18 deg East.,9808,-22.0,17.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29 97.16
+17619,South West African Survey Grid zone 19,SW African Grid zone 19,,,Namibia - 18 to 20 deg East.,9808,-22.0,19.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29 97.16
+17621,South West African Survey Grid zone 21,SW African Grid zone 21,,,Namibia - 20 to 22 deg East.,9808,-22.0,21.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29 97.16
+17623,South West African Survey Grid zone 23,SW African Grid zone 23,,,Namibia - 22 to 24 deg East.,9808,-22.0,23.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29 97.16
+17625,South West African Survey Grid zone 25,SW African Grid zone 25,,,Namibia - east of 24 deg East.,9808,-22.0,25.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30 96.29 97.16
+17700,MTM Quebec zone 2,,,,Canada - Quebec - east of 57 deg East.,9807,0.0,-55.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,,
+17701,MTM zone 1,,,,Canada - Newfoundland - east of 54 deg 30 min West.,9807,0.0,-53.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+17702,MTM Newfoundland zone 2,MTM zone 2,,,Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.,9807,0.0,-56.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+17703,MTM zone 3,,,,Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West; Canada - Quebec between 60 deg and 57 deg West.,9807,0.0,-58.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+17704,MTM zone 4,,,,Canada - Quebec and Newfoundland (Labrador) between 63 deg and 60 deg West.,9807,0.0,-61.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+17705,MTM zone 5,,,,Canada - Quebec and Newfoundland (Labrador) between 66 deg and 63 deg West.,9807,0.0,-64.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+17706,MTM zone 6,,,,Canada - Quebec and Newfoundland (Labrador) between 69 deg and 66 deg West.,9807,0.0,-67.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+17707,MTM zone 7,,,,Canada - Quebec between 72 deg and 69 deg West.,9807,0.0,-70.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,,
+17708,MTM zone 8,,,,Canada - Quebec between 75 deg and 72 deg West.; Canada - Ontario - east of 75 deg West.,9807,0.0,-73.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17709,MTM zone 9,,,,Canada - Quebec and Ontario - between 78 deg and 75 deg West.,9807,0.0,-76.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17710,MTM zone 10,,,,Canada - Quebec west of 78 deg West; Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.,9807,0.0,-79.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17711,MTM zone 11,,,,Canada - Ontario - south of 46 deg N and west of 81 deg West.,9807,0.0,-82.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17712,MTM zone 12,,,,Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.,9807,0.0,-81.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17713,MTM zone 13,,,,Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.,9807,0.0,-84.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17714,MTM zone 14,,,,Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.,9807,0.0,-87.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17715,MTM zone 15,,,,Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.,9807,0.0,-90.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17716,MTM zone 16,,,,Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.,9807,0.0,-93.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17717,MTM zone 17,,,,Canada - Ontario - west of 94 deg 30 min West.,9807,0.0,-96.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17794,MTM Nova Scotia zone 4,,,,Canada - Nova Scotia - east of 63 deg West.,9807,0.0,-61.3,,,0.9999,4500000.0,0.0,9001,9110,8901,,,,,1999-05-24 00:00:00,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,,99.042
+17795,MTM Nova Scotia zone 5,,,,Canada - Nova Scotia - west of 63 deg West.,9807,0.0,-64.3,,,0.9999,5500000.0,0.0,9001,9110,8901,,,,,1999-05-24 00:00:00,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,,99.042
+17801,Japan Plane Rectangular CS zone I,Japan zone I,,,Japan - Kyushu - Nagasaki-ken; islands of Kagoshima-ken between 27 and 32 deg N and between 128 deg 18 min and 130 deg E (between 128 deg 18 min and 30 deg 13 min E for Amami islands).,9807,33.0,129.3,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17802,Japan Plane Rectangular CS zone II,Japan zone II,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,33.0,131.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17803,Japan Plane Rectangular CS zone III,Japan zone III,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,36.0,132.1,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17804,Japan Plane Rectangular CS zone IV,Japan zone IV,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,33.0,133.3,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17805,Japan Plane Rectangular CS zone V,Japan zone V,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,36.0,134.2,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17806,Japan Plane Rectangular CS zone VI,Japan zone VI,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,36.0,136.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17807,Japan Plane Rectangular CS zone VII,Japan zone VII,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,36.0,137.1,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17808,Japan Plane Rectangular CS zone VIII,Japan zone VIII,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,36.0,138.3,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17809,Japan Plane Rectangular CS zone IX,Japan zone IX,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,36.0,139.5,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17810,Japan Plane Rectangular CS zone X,Japan zone X,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,40.0,140.5,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17811,Japan Plane Rectangular CS zone XI,Japan zone XI,,,Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,9807,44.0,140.15,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17812,Japan Plane Rectangular CS zone XII,Japan zone XII,,,Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,9807,44.0,142.15,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17813,Japan Plane Rectangular CS zone XIII,Japan zone XIII,,,Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,9807,44.0,144.15,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17814,Japan Plane Rectangular CS zone XIV,Japan zone XIV,,,Japan - Tokyo-to south of 28 deg N & between 140 deg 30 min & 143 deg E.,9807,26.0,142.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17815,Japan Plane Rectangular CS zone XV,Japan zone XV,,,Japan - Okinawa-ken between 126 deg &130 deg E.,9807,26.0,127.3,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17816,Japan Plane Rectangular CS zone XVI,Japan zone XVI,,,Japan - Okinawa-ken west of 126 deg E.,9807,26.0,124.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17817,Japan Plane Rectangular CS zone XVII,Japan zone XVII,,,Japan - Okinawa-ken east of 130 deg E.,9807,26.0,131.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17818,Japan Plane Rectangular CS zone XVIII,Japan zone XVIII,,,Japan - Tokyo-to south of 28 N & west of 140 deg 30 min E.,9807,20.0,136.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17819,Japan Plane Rectangular CS zone XIX,Japan zone XIX,,,Japan - Tokyo-to south of 28 N & east of 143 deg E.,9807,26.0,154.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+18011,Nord Algerie (ancienne),,,,Algeria north of 38.5g (34 deg 39 min) North.,9801,40.0,3.0,,,0.999625544,500000.0,300000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,Used with Voirol 1875 datum - now superseded.,
+18012,Sud Algerie (ancienne),,,,Algeria 35g to 38.5g (31 deg 30 min to 34 deg 39 min) North.,9801,37.0,3.0,,,0.999625769,500000.0,300000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,Used with Voirol 1875 datum - now superseded.,
+18021,Nord Algerie,,,,Algeria north of 38.5g (34 deg 39 min) North.,9801,40.0,3.0,,,0.999625544,500135.0,300090.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,Use with Voirol Unifie 1960 datum.,
+18022,Sud Algerie,,,,Algeria 35g to 38.5g (31 deg 30 min to 34 deg 39 min) North.,9801,37.0,3.0,,,0.999625769,500135.0,300090.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,Use with Voirol Unifie 1960 datum.,
+18031,Argentina zone 1,Argentina 1,,,Argentina west of 70 deg 30 min West.,9807,-90.0,-72.0,,,1.0,1500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18032,Argentina zone 2,Argentina 2,,,Argentina between 70 deg 30 min and 67 deg 30 min West.,9807,-90.0,-69.0,,,1.0,2500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18033,Argentina zone 3,Argentina 3,,,Argentina between 67 deg 30 min and 64 deg 30 min West.,9807,-90.0,-66.0,,,1.0,3500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18034,Argentina zone 4,Argentina 4,,,Argentina between 64 deg 30 min and 61 deg 30 min West.,9807,-90.0,-63.0,,,1.0,4500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18035,Argentina zone 5,Argentina 5,,,Argentina between 61 deg 30 min and 58 deg 30 min West.,9807,-90.0,-60.0,,,1.0,5500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18036,Argentina zone 6,Argentina 6,,,Argentina between 58 deg 30 min and 55 deg 30 min West.,9807,-90.0,-57.0,,,1.0,6500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18037,Argentina zone 7,Argentina 7,,,Argentina east of 55 deg 30 min West.,9807,-90.0,-54.0,,,1.0,7500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18041,Austria West Zone,,,,Austria west of 11deg 50min East of Greenwich (29deg 30min E of Ferro).,9807,0.0,28.0,,,1.0,0.0,0.0,9001,9102,8909,,,,,1997-04-11 00:00:00,,EPSG,Superseded by M28 (EPSG code 18044).,95.30 96.29 97.01 98.48
+18042,Austria Central Zone,,,,Austria between 11deg 50min and 14deg 50min East of Greenwich (29deg 30min and 32deg 30min East of Ferro).,9807,0.0,31.0,,,1.0,0.0,0.0,9001,9102,8909,,,,,1997-04-11 00:00:00,,EPSG,Superseded by M31 (EPSG code 18045).,95.30 96.29 97.01 98.48
+18043,Austria East Zone,,,,Austria east of 14deg 50min East of Greenwich (32deg 30min East of Ferro).,9807,0.0,34.0,,,1.0,0.0,0.0,9001,9102,8909,,,,,1997-04-11 00:00:00,,EPSG,Superseded by M34 (EPSG code 18046).,95.30 96.29 97.01 98.48
+18044,Austria M28,M28,,,Austria west of 11deg 50min East of Greenwich (29deg 30min E of Ferro).,9807,0.0,10.2,,,1.0,150000.0,0.0,9001,9110,8901,,,,,1999-10-20 00:00:00,Bundesamt f�r Eich- und Vermessungswesen,EPSG,Supersedes Austria West zone (EPSG code 18041).,
+18045,Austria M31,M31,,,Austria between 11deg 50min and 14deg 50min East of Greenwich (29deg 30min and 32deg 30min East of Ferro).,9807,0.0,13.2,,,1.0,450000.0,0.0,9001,9110,8901,,,,,1999-10-20 00:00:00,Bundesamt f�r Eich- und Vermessungswesen,EPSG,Supersedes Austria Central zone (EPSG code 18042).,
+18046,Austria M34,M34,,,Austria east of 14deg 50min East of Greenwich (32deg 30min East of Ferro).,9807,0.0,16.2,,,1.0,750000.0,0.0,9001,9110,8901,,,,,1999-10-20 00:00:00,Bundesamt f�r Eich- und Vermessungswesen,EPSG,Supersedes Austria East zone (EPSG code 18043).,
+18051,Colombia West zone,Colombia 3W,,,Colombia west of 1 deg 30 min W of Bogota (75d 34m 51.30s W of Greenwich).,9807,4.355657,-77.04513,,,1.0,1000000.0,1000000.0,9001,9110,8901,,,,,1997-04-11 00:00:00,,EPSG,"Original transformation by Gauss-Kruger formula. Zone name sometimes referred to as \"6 west\".",95.30 96.29 97.11
+18052,Colombia Bogota zone,Colombia Bogota,,,Colombia 1 deg 30 min W to 1 deg 30 min E of Bogota (75d 35m W to 72d 35m W of Greenwich).,9807,4.355657,-74.04513,,,1.0,1000000.0,1000000.0,9001,9110,8901,,,,,1997-04-11 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30 96.29 97.11
+18053,Colombia East Central zone,Colombia 3E,,,Colombia 1 deg 30 min to 4 deg 30 min E of Bogota (72d 35m to 69d 34m W of Greenwich).,9807,4.355657,-71.04513,,,1.0,1000000.0,1000000.0,9001,9110,8901,,,,,1997-04-11 00:00:00,,EPSG,"Original transformation by Gauss-Kruger formula. Zone name sometimes referred to as \"3 east\".",95.30 96.29 97.11
+18054,Colombia East zone,Colombia 6E,,,Colombia east of 4 deg 30 min E of Bogota (69d 34m 51.3s W of Greenwich).,9807,4.355657,-68.04513,,,1.0,1000000.0,1000000.0,9001,9110,8901,,,,,1997-04-11 00:00:00,,EPSG,"Original transformation by Gauss-Kruger formula. Zone name sometimes referred to as \"6 east\".",95.30 96.29 97.11
+18061,Cuba Norte,,,,Cuba,9801,22.21,-81.0,,,0.99993602,500000.0,280296.016,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+18062,Cuba Sur,,,,Cuba,9801,20.43,-76.5,,,0.99994848,500000.0,229126.939,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+18071,Egypt Blue Belt,Blue Belt,,,Egypt - Sinai peninsula.,9807,30.0,35.0,,,1.0,300000.0,1100000.0,9001,9102,8901,,,,,1999-04-22 00:00:00,,EPSG,Also known as Green Belt.,
+18072,Egypt Red Belt,Red Belt,,,Egypt east of 29 deg East.,9807,30.0,31.0,,,1.0,615000.0,810000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18073,Egypt Purple Belt,Purple Belt,,,Egypt west of 29 deg East; north of approx 28 deg 11 min North.,9807,30.0,27.0,,,1.0,700000.0,200000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18074,Egypt Extended Purple Belt,Extended Purple Belt,,,Egypt west of 29 deg East; south of approx 28 deg 11 min North.,9807,30.0,27.0,,,1.0,700000.0,1200000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18081,France I,,,,France north of 53.5 grads (48 deg 09 min) North.,9801,55.0,0.0,,,0.999877341,600000.0,1200000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Introduced 1972. See 18091.,95.26
+18082,France II,,,,France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.,9801,52.0,0.0,,,0.99987742,600000.0,2200000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Introduced 1972. See 18092.,95.26
+18083,France III,,,,France south of 50.5 grads (45 deg 27 min) North.,9801,49.0,0.0,,,0.999877499,600000.0,3200000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Introduced 1972. See 18093.,95.26
+18084,France IV,,,,France - Corsica.,9801,46.85,0.0,,,0.99994471,234.358,4185861.369,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Introduced 1972. See 18094.,
+18091,Nord France,,,,France north of 53.5 grads (48 deg 09 min) North.,9801,55.0,0.0,,,0.999877341,600000.0,200000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Superseded by 18081 from 1972.,95.26
+18092,Centre France,,,,France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.,9801,52.0,0.0,,,0.99987742,600000.0,200000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Superseded by 18082 from 1972.,95.26
+18093,Sud France,,,,France south of 50.5 grads (45 deg 27 min) North.,9801,49.0,0.0,,,0.999877499,600000.0,200000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Superseded by 18083 from 1972.,95.26
+18094,Corse,,,,France - Corsica.,9801,46.85,0.0,,,0.99994471,234.358,185861.369,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Superseded by 18084 from 1972.,
+18101,Germany zone 1,,,,Germany - onshore west of 4 deg 30 min East.,9807,0.0,3.0,,,1.0,1500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18102,Germany zone 2,,,,Germany - onshore between 4 deg 30 min and 7 deg 30 min East.,9807,0.0,6.0,,,1.0,2500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18103,Germany zone 3,,,,Germany - onshore between 7 deg 30 min and 10 deg 30 min East.,9807,0.0,9.0,,,1.0,3500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18104,Germany zone 4,,,,Germany - onshore between 10 deg 30 min and 13 deg 30 min East.,9807,0.0,12.0,,,1.0,4500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18105,Germany zone 5,,,,Germany - onshore between 13 deg 30 min and 16 deg 30 min East.,9807,0.0,15.0,,,1.0,5500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18110,India zone 0,,,,Pakistan north of 35 deg 35 min North.,9801,39.3,68.0,,,0.99846154,2355500.0,2590000.0,9084,9110,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.30 96.01 96.02 96.29 97.23
+18111,India zone I,,,,India north of 28 deg North. Pakistan 28 deg to 35 deg 35 min North.,9801,32.3,68.0,,,0.99878641,3000000.0,1000000.0,9084,9110,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.30 96.02 96.29 97.23
+18112,India zone IIa,,,,India - between 21 deg and 28 deg North and west of 82 deg East; Pakistan - south of 28 deg North.,9801,26.0,74.0,,,0.99878641,3000000.0,1000000.0,9084,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.28 96.02 97.23
+18113,India zone IIb,India zone II b,,,Bangladesh; India - north of 21 deg North and east of 82 deg East; Myanmar (Burma) - north of 21 deg North.,9801,26.0,90.0,,,0.99878641,3000000.0,1000000.0,9084,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.28 96.02 97.23
+18114,India zone IIIa,India zone IIIa,,,India - between 15 deg and 21 deg North.,9801,19.0,80.0,,,0.99878641,3000000.0,1000000.0,9084,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.28 96.02 97.23
+18115,India zone IIIb,,,,Myanmar (Burma) - between 15 deg and 21 deg North.,9801,19.0,100.0,,,0.99878641,3000000.0,1000000.0,9084,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.28 96.02 97.23
+18116,India zone IVa,India zone Iva,,,India - south of 15 deg North.,9801,12.0,80.0,,,0.99878641,3000000.0,1000000.0,9084,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.28 96.02 97.23
+18117,India zone IVb,,,,Myanmar - south of 15 deg North.,9801,12.0,100.0,,,0.99878641,3000000.0,1000000.0,9084,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.28 96.02 97.23
+18121,Italy zone 1,,,,Italy west of 12 deg East (of Greenwich).,9807,0.0,9.0,,,0.9996,1500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Boaga formula,
+18122,Italy zone 2,,,,Italy east of 12 deg East (of Greenwich).,9807,0.0,15.0,,,0.9996,2520000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Boaga formula,
+18131,Nord Maroc,,,,Morocco north of 35 grads (31 deg 30 min) North.,9801,37.0,-6.0,,,0.999625769,500000.0,300000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,A projection with the same parameter values used the Lambert Conic Near-Conformal method (EPSG code 9817) prior to 1953.,99.203
+18132,Sud Maroc,,,,Morocco 31gr to 35gr (27 deg 54 min to 31 deg 30 min) North.,9801,33.0,-6.0,,,0.999615596,500000.0,300000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,A projection with the same parameter values used the Lambert Conic Near-Conformal method (EPSG code 9817) prior to 1953.,99.203
+18133,Sahara,,,,Morocco south of 31gr (27 deg 54 min) North.,9801,29.0,-6.0,,,0.9996,1200000.0,400000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,IGN Paris,EPSG,Created in 1977 to cover Sahara Marocain (ex Spanish Sahara),
+18141,New Zealand North Island National Grid,North Island Grid,,,New Zealand - North Island.,9807,-39.0,175.3,,,1.0,300000.0,400000.0,9040,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,Superseded by New Zealand Map Grid.,95.30 96.29 97.231
+18142,New Zealand South Island National Grid,South Island Grid,,,New Zealand - South Island.,9807,-44.0,171.3,,,1.0,500000.0,500000.0,9040,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,Superseded by New Zealand Map Grid.,95.30 96.29 97.231
+18151,Nigeria West Belt,,,,Nigeria west of 6 deg 30 min East.,9807,4.0,4.3,,,0.99975,230738.26,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+18152,Nigeria Mid Belt,,,,Nigeria between 6 deg 30 min and 10 deg 30 min East.,9807,4.0,8.3,,,0.99975,670553.98,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+18153,Nigeria East Belt,,,,Nigeria east of 10 deg 30 min East.,9807,4.0,12.3,,,0.99975,1110369.7,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+18161,Peru west zone,,,,Peru west of 79 deg West.,9807,-6.0,-80.3,,,0.99983008,222000.0,1426834.743,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+18162,Peru central zone,,,,Peru 79 to 73 deg West.,9807,-9.3,-76.0,,,0.99932994,720000.0,1039979.159,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+18163,Peru east zone,,,,Peru east of 73 deg West.,9807,-9.3,-70.3,,,0.99952992,1324000.0,1040084.558,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+18171,Philippines zone I,,,,Philippines - west of 118 deg East.,9807,0.0,117.0,,,0.99995,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18172,Philippines zone II,,,,Philippines - Palawan; Calamian Islands.,9807,0.0,119.0,,,0.99995,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18173,Philippines zone III,,,,Philippines - Luzon (except SE part); Mindoro.,9807,0.0,121.0,,,0.99995,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18174,Philippines zone IV,,,,Philippines - SE Luzon; Tablas; Masbate; Panay; Cebu; Negros; W. Mindanao.,9807,0.0,123.0,,,0.99995,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18175,Philippines zone V,,,,Philippines - E. Mindanao; Bohol; Samar.,9807,0.0,125.0,,,0.99995,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18181,Nord Tunisie,,,,Tunisia north of 38.5 grads (34 deg 39 min) North.,9801,40.0,11.0,,,0.999625544,500000.0,300000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,,95.30
+18182,Sud Tunisie,,,,Tunisia south of 38.5 grads (34 deg 39 min) North.,9801,37.0,11.0,,,0.999625769,500000.0,300000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,,
+18191,Finland zone 1,,,,Finland - west of 22deg 30min E.,9807,0.0,21.0,,,1.0,1500000.0,0.0,9001,9102,8901,,,,,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+18192,Finland zone 2,,,,Finland - 22deg 30 min to 25deg 30min E.,9807,0.0,24.0,,,1.0,2500000.0,0.0,9001,9102,8901,,,,,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+18193,Finland Uniform Coordinate System,Finland zone 3,,,Finland; Finland - 25 deg 30min E to 28deg 30min E.,9807,0.0,27.0,,,1.0,3500000.0,0.0,9001,9102,8901,,,,,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,Used by Uniform Coordinate System over all country and also by zone 3 of Basic Coordinate System at larger scales.,
+18194,Finland zone 4,,,,Finland - east of 28deg 30 min E.,9807,0.0,30.0,,,1.0,4500000.0,0.0,9001,9102,8901,,,,,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+18201,Palestine Grid,,,,Israel; Jordan,9806,31.4402749,35.124349,,,,170251.555,126867.909,9001,9110,8901,,,,,1999-04-22 00:00:00,,EPSG,Also encountered as a Transverse Mercator projection with scale factor of 1. The difference in conversion caused by the change of formula does not exceed 2m within Israel. Within the State of Israel superseded by the Israeli CS Grid (EPSG code 18203).,
+18202,Palestine Belt,,,,Israel; Jordan,9807,31.4402749,35.124349,,,1.0,170251.555,1126867.909,9001,9110,8901,,,,,1999-04-22 00:00:00,,EPSG,"Originally constructed as the Palestine Grid - EPSG code 18201. Adopted by the US Army Map Service as \"Palestine Belt\" with change of projection method and false northing (FN). Sometimes seen with unchanged FN of 126867.909.",
+18203,Israeli CS,ICS,,,Israel,9806,31.4402749,35.124349,,,,170251.555,1126867.909,9001,9110,8901,,,,,1999-10-20 00:00:00,Survey of Israel ftp://ftp.rd.soi.gov.il/doc,EPSG,,
+18204,Israeli TM,ITM,,,Israel,9807,31.4403817,35.1216261,,,1.0000067,219529.584,626907.39,9001,9110,8901,,,,,1999-10-20 00:00:00,Survey of Israel ftp://ftp.rd.soi.gov.il/doc,EPSG,Designed to approximate Israeli CS grid in north-central Israel.,
+18211,Guatemala Norte,,,,Guatemala north of 15 deg 50 min North.,9801,16.49,-90.2,,,0.99992226,500000.0,292209.579,9001,9110,8901,,,,,1999-08-16 00:00:00,,EPSG,,
+18212,Guatemala Sud,,,,Guatemala south of 15 deg 50 min North.,9801,14.54,-90.2,,,0.99989906,500000.0,325992.681,9001,9110,8901,,,,,1999-08-16 00:00:00,,EPSG,,
+18221,NGO zone I,,,,Norway - west of 3deg 30min W of Oslo (7deg 13min 22.5sec E of Greenwich).,9807,58.0,-4.4,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18222,NGO zone II,,,,Norway - between 3deg 30min W and 1deg 10min W of Oslo (7deg 13min 22.5sec E and 9deg 33min 22.5sec E of Greenwich).,9807,58.0,-2.2,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18223,NGO zone III,,,,Norway - between 1deg 10min W and 1deg 15min E of Oslo (9deg 33min 22.5sec E and 11deg 58min 22.5sec E of Greenwich).,9807,58.0,0.0,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18224,NGO zone IV,,,,Norway - between 1deg 15min E and 4deg 20min E of Oslo (11deg 58min 22.5sec E and 15deg 03min 22.5sec E of Greenwich).,9807,58.0,2.3,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18225,NGO zone V,,,,Norway - between 4deg 20min E and 8deg 10min E of Oslo (15deg 03min 22.5sec E and 18deg 53min 22.5sec E of Greenwich).,9807,58.0,6.1,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18226,NGO zone VI,,,,Norway - between 8deg 10min E and 12deg 10min E of Oslo (18deg 53min 22.5sec E and 22deg 53min 22.5sec E of Greenwich).,9807,58.0,10.1,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18227,NGO zone VII,,,,Norway - between 12deg 10min E and 16deg 15min E of Oslo (22deg 53min 22.5sec E and 26deg 58min 22.5sec E of Greenwich).,9807,58.0,14.1,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18228,NGO zone VIII,,,,Norway - east of 16deg 15min E of Oslo (26deg 58min 22.5sec E of Greenwich).,9807,58.0,18.2,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18231,India zone I (1975 metres),India zone I,,,India north of 28 deg North.,9801,32.3,68.0,,,0.99878641,2743185.69,914395.23,9001,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18232,India zone IIa (1975 metres),India zone II a,,,India - between 21 deg and 28 deg North and west of 82 deg East.,9801,26.0,74.0,,,0.99878641,2743185.69,914395.23,9001,9102,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18233,India zone IIIa (1975 metres),India zone IIIa,,,India - between 15 deg and 21 deg North.,9801,19.0,80.0,,,0.99878641,2743185.69,914395.23,9001,9102,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18234,India zone IVa (1975 metres),India zone IV a,,,India - south of 15 deg North.,9801,12.0,80.0,,,0.99878641,2743185.69,914395.23,9001,9102,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18235,India zone IIb (1975 metres),India zone II b,,,India - north of 21 deg North and east of 82 deg East.,9801,26.0,90.0,,,0.99878641,2743185.69,914395.23,9001,9102,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18236,India zone I (1962 metres),India zone I,,,Pakistan - north of 28 deg North.,9801,32.3,68.0,,,0.99878641,2743196.4,914398.8,9001,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18237,India zone IIa (1962 metres),India zone II a,,,Pakistan - south of 28 deg North.,9801,26.0,74.0,,,0.99878641,2743196.4,914398.8,9001,9102,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18238,India zone IIb (1937 metres),India zone II b,,,Bangladesh.,9801,26.0,90.0,,,0.99878641,2743195.5,914398.5,9001,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE ! Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+19900,Bahrain State Grid,Bahrain Grid,,,Bahrain.,9807,0.0,51.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+19901,Belge Lambert 50,,,,Belgium - onshore.,9802,90.0,0.0,49.5,51.1,,150000.0,5400000.0,9001,9110,8910,,,,,1999-04-22 00:00:00,"\"Systemes de reference et formules de transformation en usage en Belgique\"; IGN Brussels",EPSG,,95.30 96.29 99.28
+19902,Belge Lambert 72,,,,Belgium - onshore.,9803,90.0,4.2124983,49.5,51.1,,150000.01256,5400088.4378,9001,9110,8901,,,,,1999-04-22 00:00:00,"\"Systemes de reference et formules de transformation en usage en Belgique\"; IGN Brussels",EPSG,Rotation from Belge Lambert 50 to Belge Lambert 72 is +29.2985sec.,95.30 96.29 99.28
+19903,Nord de Guerre,,,,France - Alsace.,9801,55.0,6.0,,,0.99950908,500000.0,300000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,,EPSG,,
+19904,Ghana Metre Grid,,,,Ghana.,9807,4.4,-1.0,,,0.99975,274319.51,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+19905,Netherlands East Indies Equatorial Zone,NEIEZ,,,Indonesia.,9804,0.0,110.0,,,0.997,3900000.0,900000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,US Army Map Service projection tables; 1943.,EPSG,,95.30
+19906,Iraq zone,,,,Iran -south of 36 deg North; Iraq; Kuwait.,9801,32.3,45.0,,,0.99878640776699,1500000.0,1166200.0,9001,9110,8901,,,,,1996-04-12 00:00:00,US Army Map Service projection tables; 1943.,EPSG,,95.30 96.29
+19907,Iraq National Grid,,,,Iraq.,9807,29.0134566,46.3,,,0.9994,800000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+19908,Irish National Grid,,,,Ireland - onshore. United Kingdom (UK) - Northern Ireland onshore.,9807,53.3,-8.0,,,1.000035,200000.0,250000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+19909,Jamaica (Old Grid),,,,Jamaica.,9801,18.0,-77.0,,,1.0,550000.0,400000.0,9005,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Superseded by Jamaica (New Grid).,95.28
+19910,Jamaica National Grid,,,,Jamaica.,9801,18.0,-77.0,,,1.0,250000.0,150000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Supersedes Jamaica (Old Grid).,95.28
+19911,Laborde Grid,,,,Madagascar.,9815,-21.0,49.0,21.0,21.0,0.9995,400000.0,800000.0,9001,9105,8903,,,,,1997-11-13 00:00:00,,EPSG,Can also use transformation method 9813.,97.613
+19912,Rectified Skew Orthomorphic Borneo Grid,R.S.O. Borneo,,,Brunei; Malaysia - East Malaysia (Sabah; Sarawak).,9812,4.0,115.0,53.18569537,53.07483685,0.99984,0.0,0.0,9042,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,,95.30 96.29 97.231
+19913,RD Old,,,,Netherlands - onshore.,9809,52.0922178,5.23155,,,0.9999079,0.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,Nederlandse Commissie voor Geodesie publication 30.,EPSG,,95.30 96.29
+19914,RD New,,,,Netherlands - onshore.,9809,52.0922178,5.23155,,,0.9999079,155000.0,463000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,Nederlandse Commissie voor Geodesie publication 30.,EPSG,,95.30 96.29
+19915,Aden Zone,,,,Yemen.,9801,15.0,45.0,,,0.999365678,1500000.0,1000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,US Army Map Service projection tables; 1943.,EPSG,,95.28
+19916,British National Grid,,,,United Kingdom (UK) - onshore England; Scotland; Wales; Isle of Man.,9807,49.0,-2.0,,,0.999601272,400000.0,-100000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+19917,New Zealand Map Grid,,,,New Zealand.,9811,-41.0,173.0,,,,2510000.0,6023150.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Dept. of Lands and Surveys Technical Circular 1973/32; 23 Nov 1973.,EPSG,Supersedes North and South Island National Grids.,95.28
+19919,Qatar National Grid,,,,Qatar.,9807,24.27,51.13,,,0.99999,200000.0,300000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+19920,Singapore Grid,,,,Singapore.,9806,1.1715528,103.5110808,,,,30000.0,30000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30 96.29
+19921,Spain,,,,Spain.,9801,40.0,0.0,,,0.9988085293,600000.0,600000.0,9001,9102,8905,,,,,1995-12-02 00:00:00,,EPSG,Superseded by UTM,95.28
+19922,Swiss New Grid,LV03,,,Liechtenstein; Switzerland.,9815,46.570866,7.26225,90.0,90.0,1.0,600000.0,200000.0,9001,9110,8901,,,,,1997-11-13 00:00:00,"\"Die Projektionen der schweizerischen Plan- und Kartenwerke\"; J. Bolliger 1967",EPSG,,95.30 96.29 97.27 97.612 97.62
+19923,Swiss Old Grid,LV03C,,,Liechtenstein; Switzerland.,9815,46.570866,0.0,90.0,90.0,1.0,0.0,0.0,9001,9110,8907,,,,,1997-11-13 00:00:00,"\"Die Projektionen der schweizerischen Plan- und Kartenwerke\"; J. Bolliger 1967",EPSG,Superseded by LV03 (19922).,95.30 96.29 97.612 97.62
+19924,Tobago Grid,,,,Trinidad and Tobago - Tobago.,9806,11.1507843,-60.4109632,,,,187500.0,180000.0,9039,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,,95.30 96.29 97.231
+19925,Trinidad Grid,,,,Trinidad and Tobago - Trinidad.,9806,10.263,-61.2,,,,430000.0,325000.0,9039,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,,95.30 96.29 97.231
+19926,Stereo 70,,,,Romania.,9809,46.0,25.0,,,0.99975,500000.0,500000.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,Supersedes Stereo 33 (code 19927).,
+19927,Stereo 33,,,,Romania.,9809,45.54,25.23328772,,,0.9996667,500000.0,500000.0,9001,9110,8901,,,,,1996-04-12 00:00:00,,EPSG,Superseded by Stereo 70 (code 19926),96.29
+19928,Kuwait TM,KTM,,,Kuwait - Kuwait City.,9807,0.0,48.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,,
+19929,Swedish National Projection,2.5 gon West,,,Sweden.,9807,0.0,15.48298,,,1.0,1500000.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Lantmateriet of Sweden; private communication.,EPSG,"Used since 1938 superseding 6 old zones. Longitude of natural origin is 2.5 gon west of Stockholm prime meridian; transformation is also known as \"2.5 gon West of old Stockholm observatory\".",96.29 97.39
+19930,Greek Grid,,,,Greece,9807,0.0,24.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1997-06-16 00:00:00,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,Created for use with GGRS87.,
+19931,Egyseges Orszagos Vetuleti,EOV,,,Hungary,9815,47.08398174,19.02548584,90.0,90.0,0.99993,650000.0,200000.0,9001,9110,8901,,,,,1997-07-22 00:00:00,http://lazarus.elte.hu/gb/geodez/geod2.htm,EPSG,EOV = Uniform National Projection,
+19933,Prince Edward Island Stereographic,PEI Stereographic,,,Canada - Prince Edward Island,9809,47.15,-63.0,,,0.999912,700000.0,400000.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,In use from 1979. To be phased out in late 1990's.,
+19934,Lithuania 1994,,,,Lithuania,9807,0.0,24.0,,,0.9998,500000.0,0.0,9001,9102,8901,,,,,1998-03-12 00:00:00,HNIT-BALTIC GeoInfoServisas,EPSG,,
+19935,Rectified Skew Orthomorphic Malaya Grid,R.S.O. Malaya,,,Malaysia - West Malaysia,9812,4.0,102.15,323.01328458,323.07483685,0.99984,40000.0,0.0,9062,9110,8901,,,,,1999-10-20 00:00:00,UK Directorate of Overseas Surveys paper,EPSG,,97.231
+19936,Portuguese National Grid,,,,Portugal onshore.,9807,39.4,1.0,,,1.0,200000.0,300000.0,9001,9110,8902,,,,,1998-11-11 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.30 96.29 98.42
+19937,Tunisia Mining Grid,,,,Tunisia - onshore,9816,38.81973,7.83445,,,,270.0,582.0,9036,9105,8903,,,,,1999-11-15 00:00:00,Mining decree of 1st January 1953,EPSG,Origin: Djebel Kebar,99.81
+19938,Estonian National Grid,,,,Estonia,9802,57.310319415,24.0,59.2,58.0,,500000.0,6375000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,Coordinates at the projection origin match those of TM Baltic 93.,99.28
+19939,TM Baltic 93,,,,Estonia; Latvia; Lithuania.,9807,0.0,24.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,,
+19940,Levant Zone,,,,Syrian Arab Republic west of 39 deg E.,9817,34.39,37.21,,,0.9996256,300000.0,300000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,US Army Map Service projection tables; 1943.,EPSG,Superseded by projection using full Lambert formula from 1973. (EPSG code 19948).,
+19941,Brazil Polyconic,,,,Brazil,9818,0.0,-54.0,,,,5000000.0,10000000.0,9001,9102,8901,,,,,1999-10-20 00:00:00,PetroBras,EPSG,,99.55
+19942,British West Indies Grid,,,,Windward Islands - Dominica Grenada Saint Lucia Saint Vincent; Leeward Islands - Anguilla Antigua (excluding Barbuda) Montserrat Saint Kitts and Nevis; Barbados.,9807,0.0,-62.0,,,0.9995,400000.0,0.0,9001,9102,8901,,,,,1999-04-22 00:00:00,"UK Royal Engineers projection tables P10/25, 1943.",EPSG,,
+19943,Barbados National Grid,,,,Barbados,9807,13.1035,-59.3335,,,0.9999986,30000.0,75000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,Superseded British West Indies Grid (19942) after 1983.,
+19944,Quebec Lambert Projection,,,,Canada - Quebec,9802,44.0,-68.3,60.0,46.0,,0.0,0.0,9001,9110,8901,,,,,1999-10-22 00:00:00,Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec,EPSG,,
+19945,New Brunswick Stereographic (ATS77),NB Stereographic ATS77,,,Canada - New Brunswick - onshore,9809,46.3,-66.3,,,0.999912,300000.0,800000.0,9001,9110,8901,,,,,1999-10-20 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1979. To be phased out in late 1990's.,99.61
+19946,New Brunswick Stereographic (NAD83),NB Stereographic NAD83,,,Canada - New Brunswick - onshore,9809,46.3,-66.3,,,0.999912,2500000.0,7500000.0,9001,9110,8901,,,,,1999-10-20 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1999.,
+19947,Austria Lambert,,,,Austria,9802,13.2,47.3,49.0,46.0,,400000.0,400000.0,9001,9110,8901,,,,,1999-10-20 00:00:00,Bundesamt f�r Eich- und Vermessungswesen,EPSG,,
+19948,Syria Lambert,,,,Syrian Arab Republic,9801,34.39,37.21,,,0.9996256,300000.0,300000.0,9001,9110,8901,,,,,1999-10-20 00:00:00,IGN Paris,EPSG,Superseded Levant zone (same parameters but using truncated near-conformal method) from 1973.,
+19949,Levant Stereographic,,,,Lebanon,9809,38.0,43.5,,,0.9995341,0.0,0.0,9001,9105,8901,,,,,1999-10-20 00:00:00,IGN Paris,EPSG,Used prior to World War II for cadastral and large scale topographic mapping.,
+19950,Landesvermessung 1995,LV95,,,Liechtenstein; Switzerland.,9815,46.570866,7.26225,90.0,90.0,1.0,2600000.0,1200000.0,9001,9110,8901,,,,,1999-10-20 00:00:00,Bundesamt f�r Landestopographie. Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,,
+19951,Nakhl e Taqi Oblique Mercator,Nakhl e Taqi,,,Iran - Taheri refinery site only.,9815,27.31077837,52.3612741,0.34179803,0.34179803,0.999895934,658377.437,3044969.194,9001,9110,8901,,,,,1999-10-20 00:00:00,Total-Fina,EPSG,Used only for terminal site.,
diff --git a/src/tiff/csv/trf_path.c b/src/tiff/csv/trf_path.c
new file mode 100644
index 0000000..0c38f03
--- /dev/null
+++ b/src/tiff/csv/trf_path.c
@@ -0,0 +1,568 @@
+#include "defs.h"
+datafile_rows_t trf_path_row_1[] = {"TRF_PATH_CODE","TRF_STEP_CODE","SOURCE_HORIZCS_CODE","TARGET_HORIZCS_CODE","POLYN_TRF_CODE","NONPOLYN_TRF_CODE","CHANGE_ID",NULL};
+datafile_rows_t trf_path_row_2[] = {"8400","1","4201","4326","","1100","",NULL};
+datafile_rows_t trf_path_row_3[] = {"8401","1","4201","4326","","1101","",NULL};
+datafile_rows_t trf_path_row_4[] = {"8402","1","4201","4326","","1102","",NULL};
+datafile_rows_t trf_path_row_5[] = {"8403","1","4201","4326","","1103","",NULL};
+datafile_rows_t trf_path_row_6[] = {"8404","1","4201","4326","","1104","",NULL};
+datafile_rows_t trf_path_row_7[] = {"8405","1","4201","4326","","1105","",NULL};
+datafile_rows_t trf_path_row_8[] = {"8406","1","4201","4326","","1106","",NULL};
+datafile_rows_t trf_path_row_9[] = {"8407","1","4205","4326","","1107","",NULL};
+datafile_rows_t trf_path_row_10[] = {"8408","1","4202","4326","","1108","",NULL};
+datafile_rows_t trf_path_row_11[] = {"8409","1","4203","4326","","1109","",NULL};
+datafile_rows_t trf_path_row_12[] = {"8410","1","4204","4326","","1110","",NULL};
+datafile_rows_t trf_path_row_13[] = {"8411","1","4204","4326","","1111","",NULL};
+datafile_rows_t trf_path_row_14[] = {"8412","1","4289","4326","","1112","",NULL};
+datafile_rows_t trf_path_row_15[] = {"8413","1","4209","4326","","1113","",NULL};
+datafile_rows_t trf_path_row_16[] = {"8414","1","4209","4326","","1114","",NULL};
+datafile_rows_t trf_path_row_17[] = {"8415","1","4209","4326","","1115","",NULL};
+datafile_rows_t trf_path_row_18[] = {"8416","1","4209","4326","","1116","",NULL};
+datafile_rows_t trf_path_row_19[] = {"8417","1","4209","4326","","1117","",NULL};
+datafile_rows_t trf_path_row_20[] = {"8418","1","4209","4326","","1118","",NULL};
+datafile_rows_t trf_path_row_21[] = {"8419","1","4209","4326","","1119","",NULL};
+datafile_rows_t trf_path_row_22[] = {"8420","1","4209","4326","","1120","",NULL};
+datafile_rows_t trf_path_row_23[] = {"8421","1","4209","4326","","1121","",NULL};
+datafile_rows_t trf_path_row_24[] = {"8422","1","4210","4326","","1122","",NULL};
+datafile_rows_t trf_path_row_25[] = {"8423","1","4211","4326","","1123","",NULL};
+datafile_rows_t trf_path_row_26[] = {"8424","1","4216","4326","","1124","",NULL};
+datafile_rows_t trf_path_row_27[] = {"8425","1","4218","4326","","1125","",NULL};
+datafile_rows_t trf_path_row_28[] = {"8426","1","4219","4326","","1126","",NULL};
+datafile_rows_t trf_path_row_29[] = {"8427","1","4221","4326","","1127","",NULL};
+datafile_rows_t trf_path_row_30[] = {"8428","1","4222","4326","","1128","",NULL};
+datafile_rows_t trf_path_row_31[] = {"8429","1","4222","4326","","1129","",NULL};
+datafile_rows_t trf_path_row_32[] = {"8430","1","4223","4326","","1130","",NULL};
+datafile_rows_t trf_path_row_33[] = {"8431","1","4224","4326","","1131","",NULL};
+datafile_rows_t trf_path_row_34[] = {"8432","1","4225","4326","","1132","",NULL};
+datafile_rows_t trf_path_row_35[] = {"8433","1","4230","4326","","1133","",NULL};
+datafile_rows_t trf_path_row_36[] = {"8434","1","4230","4326","","1134","",NULL};
+datafile_rows_t trf_path_row_37[] = {"8435","1","4230","4326","","1135","",NULL};
+datafile_rows_t trf_path_row_38[] = {"8436","1","4230","4326","","1136","",NULL};
+datafile_rows_t trf_path_row_39[] = {"8437","1","4230","4326","","1137","",NULL};
+datafile_rows_t trf_path_row_40[] = {"8438","1","4230","4326","","1138","",NULL};
+datafile_rows_t trf_path_row_41[] = {"8439","1","4230","4326","","1139","",NULL};
+datafile_rows_t trf_path_row_42[] = {"8440","1","4230","4326","","1140","",NULL};
+datafile_rows_t trf_path_row_43[] = {"8441","1","4230","4326","","1141","",NULL};
+datafile_rows_t trf_path_row_44[] = {"8442","1","4230","4326","","1142","",NULL};
+datafile_rows_t trf_path_row_45[] = {"8443","1","4230","4326","","1143","",NULL};
+datafile_rows_t trf_path_row_46[] = {"8444","1","4230","4326","","1144","",NULL};
+datafile_rows_t trf_path_row_47[] = {"8445","1","4230","4326","","1145","",NULL};
+datafile_rows_t trf_path_row_48[] = {"8446","1","4230","4231","1000","","",NULL};
+datafile_rows_t trf_path_row_49[] = {"8446","2","4231","4326","","1146","",NULL};
+datafile_rows_t trf_path_row_50[] = {"8447","1","4230","4231","","1147","",NULL};
+datafile_rows_t trf_path_row_51[] = {"8447","2","4231","4326","","1146","",NULL};
+datafile_rows_t trf_path_row_52[] = {"8448","1","4229","4326","","1148","",NULL};
+datafile_rows_t trf_path_row_53[] = {"8449","1","4258","4326","","1149","",NULL};
+datafile_rows_t trf_path_row_54[] = {"8450","1","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_55[] = {"8451","1","4272","4326","","1151","",NULL};
+datafile_rows_t trf_path_row_56[] = {"8452","1","4236","4326","","1152","",NULL};
+datafile_rows_t trf_path_row_57[] = {"8453","1","4239","4326","","1153","",NULL};
+datafile_rows_t trf_path_row_58[] = {"8454","1","4240","4326","","1154","",NULL};
+datafile_rows_t trf_path_row_59[] = {"8455","1","4144","4326","","1155","97.235",NULL};
+datafile_rows_t trf_path_row_60[] = {"8456","1","4146","4326","","1156","97.235",NULL};
+datafile_rows_t trf_path_row_61[] = {"8457","1","4244","4326","","1157","",NULL};
+datafile_rows_t trf_path_row_62[] = {"8458","1","4245","4326","","1158","",NULL};
+datafile_rows_t trf_path_row_63[] = {"8459","1","4250","4326","","1159","",NULL};
+datafile_rows_t trf_path_row_64[] = {"8460","1","4251","4326","","1160","",NULL};
+datafile_rows_t trf_path_row_65[] = {"8461","1","4253","4326","","1161","",NULL};
+datafile_rows_t trf_path_row_66[] = {"8462","1","4253","4326","","1162","",NULL};
+datafile_rows_t trf_path_row_67[] = {"8463","1","4266","4326","","1163","",NULL};
+datafile_rows_t trf_path_row_68[] = {"8464","1","4256","4326","","1164","",NULL};
+datafile_rows_t trf_path_row_69[] = {"8465","1","4262","4326","","1165","",NULL};
+datafile_rows_t trf_path_row_70[] = {"8466","1","4261","4326","","1166","",NULL};
+datafile_rows_t trf_path_row_71[] = {"8467","1","4263","4326","","1167","",NULL};
+datafile_rows_t trf_path_row_72[] = {"8468","1","4263","4326","","1168","",NULL};
+datafile_rows_t trf_path_row_73[] = {"8469","1","4265","4326","","1169","",NULL};
+datafile_rows_t trf_path_row_74[] = {"8470","1","4267","4326","","1170","",NULL};
+datafile_rows_t trf_path_row_75[] = {"8471","1","4267","4326","","1171","",NULL};
+datafile_rows_t trf_path_row_76[] = {"8472","1","4267","4326","","1172","",NULL};
+datafile_rows_t trf_path_row_77[] = {"8473","1","4267","4326","","1173","",NULL};
+datafile_rows_t trf_path_row_78[] = {"8474","1","4267","4326","","1174","",NULL};
+datafile_rows_t trf_path_row_79[] = {"8475","1","4267","4326","","1175","",NULL};
+datafile_rows_t trf_path_row_80[] = {"8476","1","4267","4326","","1176","",NULL};
+datafile_rows_t trf_path_row_81[] = {"8477","1","4267","4326","","1177","",NULL};
+datafile_rows_t trf_path_row_82[] = {"8478","1","4267","4326","","1178","",NULL};
+datafile_rows_t trf_path_row_83[] = {"8479","1","4267","4326","","1179","",NULL};
+datafile_rows_t trf_path_row_84[] = {"8480","1","4267","4326","","1180","",NULL};
+datafile_rows_t trf_path_row_85[] = {"8481","1","4267","4326","","1181","",NULL};
+datafile_rows_t trf_path_row_86[] = {"8482","1","4267","4326","","1182","",NULL};
+datafile_rows_t trf_path_row_87[] = {"8483","1","4267","4326","","1183","",NULL};
+datafile_rows_t trf_path_row_88[] = {"8484","1","4267","4326","","1184","",NULL};
+datafile_rows_t trf_path_row_89[] = {"8485","1","4267","4326","","1185","",NULL};
+datafile_rows_t trf_path_row_90[] = {"8486","1","4267","4326","","1186","",NULL};
+datafile_rows_t trf_path_row_91[] = {"8487","1","4267","4326","","1187","",NULL};
+datafile_rows_t trf_path_row_92[] = {"8488","1","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_93[] = {"8489","1","4270","4326","","1189","",NULL};
+datafile_rows_t trf_path_row_94[] = {"8490","1","4270","4326","","1190","",NULL};
+datafile_rows_t trf_path_row_95[] = {"8491","1","4270","4326","","1191","",NULL};
+datafile_rows_t trf_path_row_96[] = {"8492","1","4271","4326","","1192","",NULL};
+datafile_rows_t trf_path_row_97[] = {"8493","1","4275","4326","","1193","",NULL};
+datafile_rows_t trf_path_row_98[] = {"8494","1","4807","4275","","1467","97.05",NULL};
+datafile_rows_t trf_path_row_99[] = {"8494","2","4275","4326","","1193","",NULL};
+datafile_rows_t trf_path_row_100[] = {"8495","1","4277","4326","","1195","",NULL};
+datafile_rows_t trf_path_row_101[] = {"8496","1","4277","4326","","1196","",NULL};
+datafile_rows_t trf_path_row_102[] = {"8497","1","4277","4326","","1197","",NULL};
+datafile_rows_t trf_path_row_103[] = {"8498","1","4277","4326","","1198","",NULL};
+datafile_rows_t trf_path_row_104[] = {"8499","1","4277","4326","","1199","",NULL};
+datafile_rows_t trf_path_row_105[] = {"8500","1","4282","4326","","1200","",NULL};
+datafile_rows_t trf_path_row_106[] = {"8501","1","4248","4326","","1201","",NULL};
+datafile_rows_t trf_path_row_107[] = {"8502","1","4248","4326","","1202","",NULL};
+datafile_rows_t trf_path_row_108[] = {"8503","1","4248","4326","","1203","",NULL};
+datafile_rows_t trf_path_row_109[] = {"8504","1","4248","4326","","1204","",NULL};
+datafile_rows_t trf_path_row_110[] = {"8505","1","4248","4326","","1205","",NULL};
+datafile_rows_t trf_path_row_111[] = {"8506","1","4248","4326","","1206","",NULL};
+datafile_rows_t trf_path_row_112[] = {"8507","1","4248","4326","","1207","",NULL};
+datafile_rows_t trf_path_row_113[] = {"8508","1","4248","4326","","1208","",NULL};
+datafile_rows_t trf_path_row_114[] = {"8509","1","4248","4326","","1209","",NULL};
+datafile_rows_t trf_path_row_115[] = {"8510","1","4285","4326","","1210","",NULL};
+datafile_rows_t trf_path_row_116[] = {"8511","1","4287","4326","","1211","",NULL};
+datafile_rows_t trf_path_row_117[] = {"8512","1","4291","4326","","1212","",NULL};
+datafile_rows_t trf_path_row_118[] = {"8513","1","4291","4326","","1213","",NULL};
+datafile_rows_t trf_path_row_119[] = {"8514","1","4291","4326","","1214","",NULL};
+datafile_rows_t trf_path_row_120[] = {"8515","1","4291","4326","","1215","",NULL};
+datafile_rows_t trf_path_row_121[] = {"8516","1","4291","4326","","1216","",NULL};
+datafile_rows_t trf_path_row_122[] = {"8517","1","4291","4326","","1217","",NULL};
+datafile_rows_t trf_path_row_123[] = {"8518","1","4291","4326","","1218","",NULL};
+datafile_rows_t trf_path_row_124[] = {"8519","1","4291","4326","","1219","",NULL};
+datafile_rows_t trf_path_row_125[] = {"8520","1","4291","4326","","1220","",NULL};
+datafile_rows_t trf_path_row_126[] = {"8521","1","4291","4326","","1221","",NULL};
+datafile_rows_t trf_path_row_127[] = {"8522","1","4291","4326","","1222","",NULL};
+datafile_rows_t trf_path_row_128[] = {"8523","1","4291","4326","","1223","",NULL};
+datafile_rows_t trf_path_row_129[] = {"8524","1","4291","4326","","1224","",NULL};
+datafile_rows_t trf_path_row_130[] = {"8525","1","4292","4326","","1225","",NULL};
+datafile_rows_t trf_path_row_131[] = {"8526","1","4293","4326","","1226","",NULL};
+datafile_rows_t trf_path_row_132[] = {"8527","1","4297","4326","","1227","",NULL};
+datafile_rows_t trf_path_row_133[] = {"8528","1","4298","4326","","1228","",NULL};
+datafile_rows_t trf_path_row_134[] = {"8529","1","4299","4326","","1229","",NULL};
+datafile_rows_t trf_path_row_135[] = {"8530","1","4301","4326","","1230","",NULL};
+datafile_rows_t trf_path_row_136[] = {"8531","1","4301","4326","","1231","",NULL};
+datafile_rows_t trf_path_row_137[] = {"8532","1","4301","4326","","1232","",NULL};
+datafile_rows_t trf_path_row_138[] = {"8533","1","4301","4326","","1233","",NULL};
+datafile_rows_t trf_path_row_139[] = {"8534","1","4309","4326","","1234","",NULL};
+datafile_rows_t trf_path_row_140[] = {"8535","1","4311","4326","","1235","",NULL};
+datafile_rows_t trf_path_row_141[] = {"8536","1","4230","4231","1000","","",NULL};
+datafile_rows_t trf_path_row_142[] = {"8537","1","4231","4326","","1146","",NULL};
+datafile_rows_t trf_path_row_143[] = {"8538","1","4230","4231","","1147","",NULL};
+datafile_rows_t trf_path_row_144[] = {"8539","1","4203","4326","","1236","",NULL};
+datafile_rows_t trf_path_row_145[] = {"8540","1","4322","4326","","1237","",NULL};
+datafile_rows_t trf_path_row_146[] = {"8541","1","4322","4326","","1238","",NULL};
+datafile_rows_t trf_path_row_147[] = {"8542","1","4324","4322","","1239","",NULL};
+datafile_rows_t trf_path_row_148[] = {"8543","1","4324","4326","","1240","",NULL};
+datafile_rows_t trf_path_row_149[] = {"8544","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_150[] = {"8546","1","4267","4269","","1243","",NULL};
+datafile_rows_t trf_path_row_151[] = {"8548","1","4230","4326","","1245","",NULL};
+datafile_rows_t trf_path_row_152[] = {"8549","1","4255","4326","","1246","",NULL};
+datafile_rows_t trf_path_row_153[] = {"8550","1","4145","4326","","1247","97.235",NULL};
+datafile_rows_t trf_path_row_154[] = {"8551","1","4238","4326","","1248","",NULL};
+datafile_rows_t trf_path_row_155[] = {"8552","1","4267","4326","","1249","",NULL};
+datafile_rows_t trf_path_row_156[] = {"8553","1","4267","4326","","1250","",NULL};
+datafile_rows_t trf_path_row_157[] = {"8554","1","4269","4326","","1251","",NULL};
+datafile_rows_t trf_path_row_158[] = {"8555","1","4269","4326","","1252","",NULL};
+datafile_rows_t trf_path_row_159[] = {"8556","1","4307","4326","","1253","",NULL};
+datafile_rows_t trf_path_row_160[] = {"8557","1","4284","4326","","1254","",NULL};
+datafile_rows_t trf_path_row_161[] = {"8558","1","4305","4326","","1255","",NULL};
+datafile_rows_t trf_path_row_162[] = {"8559","1","4232","4326","","1256","",NULL};
+datafile_rows_t trf_path_row_163[] = {"8560","1","4807","4275","","1467","99.63",NULL};
+datafile_rows_t trf_path_row_164[] = {"8561","1","4801","4217","","1257","",NULL};
+datafile_rows_t trf_path_row_165[] = {"8562","1","4802","4218","","1258","",NULL};
+datafile_rows_t trf_path_row_166[] = {"8563","1","4802","4218","","1258","",NULL};
+datafile_rows_t trf_path_row_167[] = {"8563","2","4218","4326","","1125","",NULL};
+datafile_rows_t trf_path_row_168[] = {"8564","1","4803","4207","","1259","",NULL};
+datafile_rows_t trf_path_row_169[] = {"8565","1","4804","4257","","1260","",NULL};
+datafile_rows_t trf_path_row_170[] = {"8566","1","4805","4312","","1261","",NULL};
+datafile_rows_t trf_path_row_171[] = {"8567","1","4806","4265","","1262","",NULL};
+datafile_rows_t trf_path_row_172[] = {"8568","1","4806","4265","","1262","",NULL};
+datafile_rows_t trf_path_row_173[] = {"8568","2","4265","4326","","1169","",NULL};
+datafile_rows_t trf_path_row_174[] = {"8569","1","4808","4280","","1263","",NULL};
+datafile_rows_t trf_path_row_175[] = {"8570","1","4809","4215","","1264","",NULL};
+datafile_rows_t trf_path_row_176[] = {"8571","1","4810","4297","","1265","",NULL};
+datafile_rows_t trf_path_row_177[] = {"8572","1","4810","4297","","1265","",NULL};
+datafile_rows_t trf_path_row_178[] = {"8572","2","4297","4326","","1227","",NULL};
+datafile_rows_t trf_path_row_179[] = {"8573","1","4811","4304","","1266","",NULL};
+datafile_rows_t trf_path_row_180[] = {"8574","1","4812","4305","","1267","",NULL};
+datafile_rows_t trf_path_row_181[] = {"8575","1","4812","4305","","1267","",NULL};
+datafile_rows_t trf_path_row_182[] = {"8575","2","4305","4326","","1255","",NULL};
+datafile_rows_t trf_path_row_183[] = {"8576","1","4813","4211","","1268","",NULL};
+datafile_rows_t trf_path_row_184[] = {"8577","1","4813","4211","","1268","",NULL};
+datafile_rows_t trf_path_row_185[] = {"8577","2","4211","4326","","1123","",NULL};
+datafile_rows_t trf_path_row_186[] = {"8578","1","4814","4308","","1269","98.51",NULL};
+datafile_rows_t trf_path_row_187[] = {"8579","1","4815","4120","","1270","",NULL};
+datafile_rows_t trf_path_row_188[] = {"8580","1","4293","4326","","1271","",NULL};
+datafile_rows_t trf_path_row_189[] = {"8581","1","4121","4326","","1272","",NULL};
+datafile_rows_t trf_path_row_190[] = {"8582","1","4237","4258","","1273","",NULL};
+datafile_rows_t trf_path_row_191[] = {"8583","1","4237","4258","","1273","",NULL};
+datafile_rows_t trf_path_row_192[] = {"8583","2","4258","4326","","1149","",NULL};
+datafile_rows_t trf_path_row_193[] = {"8584","1","4230","4326","","1275","",NULL};
+datafile_rows_t trf_path_row_194[] = {"8585","1","4275","4230","","1276","",NULL};
+datafile_rows_t trf_path_row_195[] = {"8586","1","4807","4275","","1467","",NULL};
+datafile_rows_t trf_path_row_196[] = {"8586","2","4275","4230","","1276","",NULL};
+datafile_rows_t trf_path_row_197[] = {"8587","1","4275","4322","","1277","",NULL};
+datafile_rows_t trf_path_row_198[] = {"8588","1","4807","4275","","1467","",NULL};
+datafile_rows_t trf_path_row_199[] = {"8588","2","4275","4322","","1277","",NULL};
+datafile_rows_t trf_path_row_200[] = {"8589","1","4202","4283","","1278","",NULL};
+datafile_rows_t trf_path_row_201[] = {"8590","1","4202","4283","","1278","",NULL};
+datafile_rows_t trf_path_row_202[] = {"8590","2","4283","4326","","1150","98.50",NULL};
+datafile_rows_t trf_path_row_203[] = {"8591","1","4203","4283","","1279","",NULL};
+datafile_rows_t trf_path_row_204[] = {"8592","1","4203","4283","","1279","",NULL};
+datafile_rows_t trf_path_row_205[] = {"8592","2","4283","4326","","1150","98.50",NULL};
+datafile_rows_t trf_path_row_206[] = {"8593","1","4203","4283","","1280","",NULL};
+datafile_rows_t trf_path_row_207[] = {"8594","1","4203","4283","","1280","",NULL};
+datafile_rows_t trf_path_row_208[] = {"8594","2","4283","4326","","1150","98.50",NULL};
+datafile_rows_t trf_path_row_209[] = {"8595","1","4124","4258","","1437","99.11",NULL};
+datafile_rows_t trf_path_row_210[] = {"8595","2","4258","4326","","1149","99.11",NULL};
+datafile_rows_t trf_path_row_211[] = {"8596","1","4125","4326","","1282","",NULL};
+datafile_rows_t trf_path_row_212[] = {"8597","1","4284","4126","","1274","",NULL};
+datafile_rows_t trf_path_row_213[] = {"8598","1","4126","4326","","1283","",NULL};
+datafile_rows_t trf_path_row_214[] = {"8599","1","4210","4326","","1284","",NULL};
+datafile_rows_t trf_path_row_215[] = {"8600","1","4210","4326","","1285","",NULL};
+datafile_rows_t trf_path_row_216[] = {"8601","1","4294","4326","","1286","",NULL};
+datafile_rows_t trf_path_row_217[] = {"8602","1","4284","4326","","1287","",NULL};
+datafile_rows_t trf_path_row_218[] = {"8603","1","4284","4326","","1288","",NULL};
+datafile_rows_t trf_path_row_219[] = {"8604","1","4284","4326","","1289","",NULL};
+datafile_rows_t trf_path_row_220[] = {"8605","1","4284","4326","","1290","",NULL};
+datafile_rows_t trf_path_row_221[] = {"8606","1","4284","4326","","1291","",NULL};
+datafile_rows_t trf_path_row_222[] = {"8607","1","4284","4326","","1292","",NULL};
+datafile_rows_t trf_path_row_223[] = {"8608","1","4284","4326","","1293","",NULL};
+datafile_rows_t trf_path_row_224[] = {"8609","1","4284","4126","","1274","",NULL};
+datafile_rows_t trf_path_row_225[] = {"8609","2","4126","4326","","1283","",NULL};
+datafile_rows_t trf_path_row_226[] = {"8610","1","4304","4326","","1294","",NULL};
+datafile_rows_t trf_path_row_227[] = {"8611","1","4811","4304","","1266","",NULL};
+datafile_rows_t trf_path_row_228[] = {"8611","2","4304","4326","","1294","",NULL};
+datafile_rows_t trf_path_row_229[] = {"8612","1","4271","4326","","1295","",NULL};
+datafile_rows_t trf_path_row_230[] = {"8613","1","4302","4326","","1296","",NULL};
+datafile_rows_t trf_path_row_231[] = {"8614","1","4127","4130","","1297","",NULL};
+datafile_rows_t trf_path_row_232[] = {"8615","1","4127","4130","","1297","",NULL};
+datafile_rows_t trf_path_row_233[] = {"8615","2","4130","4326","","1302","",NULL};
+datafile_rows_t trf_path_row_234[] = {"8616","1","4127","4130","","1298","",NULL};
+datafile_rows_t trf_path_row_235[] = {"8617","1","4127","4130","","1298","",NULL};
+datafile_rows_t trf_path_row_236[] = {"8617","2","4130","4326","","1302","",NULL};
+datafile_rows_t trf_path_row_237[] = {"8618","1","4127","4130","","1299","",NULL};
+datafile_rows_t trf_path_row_238[] = {"8619","1","4127","4130","","1299","",NULL};
+datafile_rows_t trf_path_row_239[] = {"8619","2","4130","4326","","1302","",NULL};
+datafile_rows_t trf_path_row_240[] = {"8620","1","4127","4130","","1300","",NULL};
+datafile_rows_t trf_path_row_241[] = {"8621","1","4127","4130","","1300","",NULL};
+datafile_rows_t trf_path_row_242[] = {"8621","2","4130","4326","","1302","",NULL};
+datafile_rows_t trf_path_row_243[] = {"8622","1","4127","4130","","1301","",NULL};
+datafile_rows_t trf_path_row_244[] = {"8623","1","4127","4130","","1301","",NULL};
+datafile_rows_t trf_path_row_245[] = {"8623","2","4130","4326","","1302","",NULL};
+datafile_rows_t trf_path_row_246[] = {"8624","1","4130","4326","","1302","",NULL};
+datafile_rows_t trf_path_row_247[] = {"8625","1","4284","4326","","1303","",NULL};
+datafile_rows_t trf_path_row_248[] = {"8626","1","4240","4326","","1304","",NULL};
+datafile_rows_t trf_path_row_249[] = {"8627","1","4301","4326","","1305","",NULL};
+datafile_rows_t trf_path_row_250[] = {"8628","1","4312","4326","","1306","",NULL};
+datafile_rows_t trf_path_row_251[] = {"8629","1","4271","4326","","1307","",NULL};
+datafile_rows_t trf_path_row_252[] = {"8633","1","4314","4258","","1309","",NULL};
+datafile_rows_t trf_path_row_253[] = {"8634","1","4314","4258","","1309","",NULL};
+datafile_rows_t trf_path_row_254[] = {"8634","2","4258","4326","","1149","",NULL};
+datafile_rows_t trf_path_row_255[] = {"8635","1","4284","4258","","1310","",NULL};
+datafile_rows_t trf_path_row_256[] = {"8636","1","4284","4258","","1310","",NULL};
+datafile_rows_t trf_path_row_257[] = {"8636","2","4258","4326","","1149","",NULL};
+datafile_rows_t trf_path_row_258[] = {"8637","1","4230","4326","","1311","",NULL};
+datafile_rows_t trf_path_row_259[] = {"8638","1","4903","4230","1001","","",NULL};
+datafile_rows_t trf_path_row_260[] = {"8639","1","4903","4230","1002","","",NULL};
+datafile_rows_t trf_path_row_261[] = {"8640","1","4903","4230","1003","","",NULL};
+datafile_rows_t trf_path_row_262[] = {"8641","1","4903","4230","1001","","",NULL};
+datafile_rows_t trf_path_row_263[] = {"8641","2","4230","4326","","1145","",NULL};
+datafile_rows_t trf_path_row_264[] = {"8642","1","4267","4269","","1312","",NULL};
+datafile_rows_t trf_path_row_265[] = {"8643","1","4267","4269","","1312","",NULL};
+datafile_rows_t trf_path_row_266[] = {"8643","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_267[] = {"8644","1","4267","4269","","1313","",NULL};
+datafile_rows_t trf_path_row_268[] = {"8645","1","4267","4269","","1313","",NULL};
+datafile_rows_t trf_path_row_269[] = {"8645","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_270[] = {"8646","1","4277","4326","","1314","",NULL};
+datafile_rows_t trf_path_row_271[] = {"8647","1","4277","4230","","1315","",NULL};
+datafile_rows_t trf_path_row_272[] = {"8648","1","4260","4326","","1316","",NULL};
+datafile_rows_t trf_path_row_273[] = {"8649","1","4220","4324","","1317","",NULL};
+datafile_rows_t trf_path_row_274[] = {"8650","1","4220","4326","","1318","",NULL};
+datafile_rows_t trf_path_row_275[] = {"8651","1","4220","4326","","1319","",NULL};
+datafile_rows_t trf_path_row_276[] = {"8652","1","4220","4326","","1320","",NULL};
+datafile_rows_t trf_path_row_277[] = {"8653","1","4220","4326","","1321","",NULL};
+datafile_rows_t trf_path_row_278[] = {"8654","1","4220","4326","","1322","",NULL};
+datafile_rows_t trf_path_row_279[] = {"8655","1","4220","4326","","1323","",NULL};
+datafile_rows_t trf_path_row_280[] = {"8656","1","4220","4326","","1324","",NULL};
+datafile_rows_t trf_path_row_281[] = {"8657","1","4220","4326","","1325","",NULL};
+datafile_rows_t trf_path_row_282[] = {"8658","1","4220","4326","","1326","",NULL};
+datafile_rows_t trf_path_row_283[] = {"8659","1","4220","4326","","1327","",NULL};
+datafile_rows_t trf_path_row_284[] = {"8660","1","4259","4264","","1328","",NULL};
+datafile_rows_t trf_path_row_285[] = {"8661","1","4264","4326","","1329","",NULL};
+datafile_rows_t trf_path_row_286[] = {"8662","1","4259","4326","","1330","",NULL};
+datafile_rows_t trf_path_row_287[] = {"8663","1","4805","4312","","1261","",NULL};
+datafile_rows_t trf_path_row_288[] = {"8663","2","4312","4326","","1306","",NULL};
+datafile_rows_t trf_path_row_289[] = {"8664","1","4133","4258","","1331","",NULL};
+datafile_rows_t trf_path_row_290[] = {"8665","1","4284","4133","","1332","",NULL};
+datafile_rows_t trf_path_row_291[] = {"8666","1","4133","4326","","1333","",NULL};
+datafile_rows_t trf_path_row_292[] = {"8667","1","4284","4326","","1334","",NULL};
+datafile_rows_t trf_path_row_293[] = {"8668","1","4301","4326","","1335","",NULL};
+datafile_rows_t trf_path_row_294[] = {"8669","1","4301","4326","","1336","",NULL};
+datafile_rows_t trf_path_row_295[] = {"8670","1","4301","4326","","1337","",NULL};
+datafile_rows_t trf_path_row_296[] = {"8671","1","4301","4326","","1338","",NULL};
+datafile_rows_t trf_path_row_297[] = {"8672","1","4301","4326","","1339","",NULL};
+datafile_rows_t trf_path_row_298[] = {"8673","1","4301","4326","","1340","",NULL};
+datafile_rows_t trf_path_row_299[] = {"8674","1","4301","4326","","1341","",NULL};
+datafile_rows_t trf_path_row_300[] = {"8675","1","4301","4326","","1342","",NULL};
+datafile_rows_t trf_path_row_301[] = {"8676","1","4301","4326","","1343","",NULL};
+datafile_rows_t trf_path_row_302[] = {"8677","1","4301","4326","","1344","",NULL};
+datafile_rows_t trf_path_row_303[] = {"8678","1","4301","4326","","1345","",NULL};
+datafile_rows_t trf_path_row_304[] = {"8679","1","4301","4326","","1346","",NULL};
+datafile_rows_t trf_path_row_305[] = {"8680","1","4301","4326","","1347","",NULL};
+datafile_rows_t trf_path_row_306[] = {"8681","1","4301","4326","","1348","",NULL};
+datafile_rows_t trf_path_row_307[] = {"8682","1","4301","4326","","1349","",NULL};
+datafile_rows_t trf_path_row_308[] = {"8683","1","4301","4326","","1350","",NULL};
+datafile_rows_t trf_path_row_309[] = {"8684","1","4301","4326","","1351","",NULL};
+datafile_rows_t trf_path_row_310[] = {"8685","1","4301","4326","","1352","",NULL};
+datafile_rows_t trf_path_row_311[] = {"8686","1","4301","4326","","1353","",NULL};
+datafile_rows_t trf_path_row_312[] = {"8687","1","4301","4326","","1354","",NULL};
+datafile_rows_t trf_path_row_313[] = {"8688","1","4301","4326","","1355","",NULL};
+datafile_rows_t trf_path_row_314[] = {"8689","1","4301","4326","","1356","",NULL};
+datafile_rows_t trf_path_row_315[] = {"8690","1","4301","4326","","1357","",NULL};
+datafile_rows_t trf_path_row_316[] = {"8691","1","4301","4326","","1358","",NULL};
+datafile_rows_t trf_path_row_317[] = {"8692","1","4301","4326","","1359","",NULL};
+datafile_rows_t trf_path_row_318[] = {"8693","1","4301","4326","","1360","",NULL};
+datafile_rows_t trf_path_row_319[] = {"8694","1","4301","4326","","1361","",NULL};
+datafile_rows_t trf_path_row_320[] = {"8695","1","4301","4326","","1362","",NULL};
+datafile_rows_t trf_path_row_321[] = {"8696","1","4301","4326","","1363","",NULL};
+datafile_rows_t trf_path_row_322[] = {"8697","1","4301","4326","","1364","",NULL};
+datafile_rows_t trf_path_row_323[] = {"8698","1","4301","4326","","1365","",NULL};
+datafile_rows_t trf_path_row_324[] = {"8699","1","4301","4326","","1366","",NULL};
+datafile_rows_t trf_path_row_325[] = {"8700","1","4301","4326","","1367","",NULL};
+datafile_rows_t trf_path_row_326[] = {"8701","1","4301","4326","","1368","",NULL};
+datafile_rows_t trf_path_row_327[] = {"8702","1","4301","4326","","1369","",NULL};
+datafile_rows_t trf_path_row_328[] = {"8703","1","4301","4326","","1370","",NULL};
+datafile_rows_t trf_path_row_329[] = {"8704","1","4301","4326","","1371","",NULL};
+datafile_rows_t trf_path_row_330[] = {"8705","1","4301","4326","","1372","",NULL};
+datafile_rows_t trf_path_row_331[] = {"8706","1","4301","4326","","1373","",NULL};
+datafile_rows_t trf_path_row_332[] = {"8707","1","4301","4326","","1374","",NULL};
+datafile_rows_t trf_path_row_333[] = {"8708","1","4301","4326","","1375","",NULL};
+datafile_rows_t trf_path_row_334[] = {"8709","1","4301","4326","","1376","",NULL};
+datafile_rows_t trf_path_row_335[] = {"8710","1","4301","4326","","1377","",NULL};
+datafile_rows_t trf_path_row_336[] = {"8711","1","4301","4326","","1378","",NULL};
+datafile_rows_t trf_path_row_337[] = {"8712","1","4301","4326","","1379","",NULL};
+datafile_rows_t trf_path_row_338[] = {"8713","1","4301","4326","","1380","",NULL};
+datafile_rows_t trf_path_row_339[] = {"8714","1","4301","4326","","1381","",NULL};
+datafile_rows_t trf_path_row_340[] = {"8715","1","4301","4326","","1382","",NULL};
+datafile_rows_t trf_path_row_341[] = {"8716","1","4301","4326","","1383","",NULL};
+datafile_rows_t trf_path_row_342[] = {"8717","1","4301","4326","","1384","",NULL};
+datafile_rows_t trf_path_row_343[] = {"8718","1","4301","4326","","1385","",NULL};
+datafile_rows_t trf_path_row_344[] = {"8719","1","4301","4326","","1386","",NULL};
+datafile_rows_t trf_path_row_345[] = {"8720","1","4301","4326","","1387","",NULL};
+datafile_rows_t trf_path_row_346[] = {"8721","1","4301","4326","","1388","",NULL};
+datafile_rows_t trf_path_row_347[] = {"8722","1","4301","4326","","1389","",NULL};
+datafile_rows_t trf_path_row_348[] = {"8723","1","4301","4326","","1390","",NULL};
+datafile_rows_t trf_path_row_349[] = {"8724","1","4301","4326","","1391","",NULL};
+datafile_rows_t trf_path_row_350[] = {"8725","1","4301","4326","","1392","",NULL};
+datafile_rows_t trf_path_row_351[] = {"8726","1","4301","4326","","1393","",NULL};
+datafile_rows_t trf_path_row_352[] = {"8727","1","4301","4326","","1394","",NULL};
+datafile_rows_t trf_path_row_353[] = {"8728","1","4301","4326","","1395","",NULL};
+datafile_rows_t trf_path_row_354[] = {"8729","1","4301","4326","","1396","",NULL};
+datafile_rows_t trf_path_row_355[] = {"8730","1","4301","4326","","1397","",NULL};
+datafile_rows_t trf_path_row_356[] = {"8731","1","4301","4326","","1398","",NULL};
+datafile_rows_t trf_path_row_357[] = {"8732","1","4301","4326","","1399","",NULL};
+datafile_rows_t trf_path_row_358[] = {"8733","1","4301","4326","","1400","",NULL};
+datafile_rows_t trf_path_row_359[] = {"8734","1","4301","4326","","1401","",NULL};
+datafile_rows_t trf_path_row_360[] = {"8735","1","4301","4326","","1402","",NULL};
+datafile_rows_t trf_path_row_361[] = {"8736","1","4301","4326","","1403","",NULL};
+datafile_rows_t trf_path_row_362[] = {"8737","1","4301","4326","","1404","",NULL};
+datafile_rows_t trf_path_row_363[] = {"8738","1","4301","4326","","1405","",NULL};
+datafile_rows_t trf_path_row_364[] = {"8739","1","4301","4326","","1406","",NULL};
+datafile_rows_t trf_path_row_365[] = {"8740","1","4301","4326","","1407","",NULL};
+datafile_rows_t trf_path_row_366[] = {"8741","1","4301","4326","","1408","",NULL};
+datafile_rows_t trf_path_row_367[] = {"8742","1","4301","4326","","1409","",NULL};
+datafile_rows_t trf_path_row_368[] = {"8743","1","4301","4326","","1410","",NULL};
+datafile_rows_t trf_path_row_369[] = {"8744","1","4301","4326","","1411","",NULL};
+datafile_rows_t trf_path_row_370[] = {"8745","1","4301","4326","","1412","",NULL};
+datafile_rows_t trf_path_row_371[] = {"8746","1","4301","4326","","1413","",NULL};
+datafile_rows_t trf_path_row_372[] = {"8747","1","4301","4326","","1414","",NULL};
+datafile_rows_t trf_path_row_373[] = {"8748","1","4301","4326","","1415","",NULL};
+datafile_rows_t trf_path_row_374[] = {"8749","1","4301","4326","","1416","",NULL};
+datafile_rows_t trf_path_row_375[] = {"8750","1","4301","4326","","1417","",NULL};
+datafile_rows_t trf_path_row_376[] = {"8751","1","4301","4326","","1418","",NULL};
+datafile_rows_t trf_path_row_377[] = {"8752","1","4301","4326","","1419","",NULL};
+datafile_rows_t trf_path_row_378[] = {"8753","1","4301","4326","","1420","",NULL};
+datafile_rows_t trf_path_row_379[] = {"8754","1","4301","4326","","1421","",NULL};
+datafile_rows_t trf_path_row_380[] = {"8755","1","4301","4326","","1422","",NULL};
+datafile_rows_t trf_path_row_381[] = {"8756","1","4301","4326","","1423","",NULL};
+datafile_rows_t trf_path_row_382[] = {"8757","1","4301","4326","","1424","",NULL};
+datafile_rows_t trf_path_row_383[] = {"8758","1","4301","4326","","1425","",NULL};
+datafile_rows_t trf_path_row_384[] = {"8759","1","4301","4326","","1426","",NULL};
+datafile_rows_t trf_path_row_385[] = {"8760","1","4301","4326","","1427","",NULL};
+datafile_rows_t trf_path_row_386[] = {"8761","1","4301","4326","","1428","",NULL};
+datafile_rows_t trf_path_row_387[] = {"8762","1","4301","4326","","1429","",NULL};
+datafile_rows_t trf_path_row_388[] = {"8763","1","4301","4326","","1430","",NULL};
+datafile_rows_t trf_path_row_389[] = {"8764","1","4301","4326","","1431","",NULL};
+datafile_rows_t trf_path_row_390[] = {"8765","1","4301","4326","","1432","",NULL};
+datafile_rows_t trf_path_row_391[] = {"8766","1","4301","4326","","1433","",NULL};
+datafile_rows_t trf_path_row_392[] = {"8767","1","4301","4326","","1434","",NULL};
+datafile_rows_t trf_path_row_393[] = {"8768","1","4301","4326","","1435","",NULL};
+datafile_rows_t trf_path_row_394[] = {"8769","1","4301","4326","","1436","",NULL};
+datafile_rows_t trf_path_row_395[] = {"8770","1","4232","4326","","1438","",NULL};
+datafile_rows_t trf_path_row_396[] = {"8771","1","4134","4326","","1439","",NULL};
+datafile_rows_t trf_path_row_397[] = {"8772","1","4230","4326","","1440","",NULL};
+datafile_rows_t trf_path_row_398[] = {"8773","1","4601","4326","","1441","",NULL};
+datafile_rows_t trf_path_row_399[] = {"8774","1","4602","4326","","1442","",NULL};
+datafile_rows_t trf_path_row_400[] = {"8775","1","4603","4326","","1443","",NULL};
+datafile_rows_t trf_path_row_401[] = {"8776","1","4604","4326","","1444","",NULL};
+datafile_rows_t trf_path_row_402[] = {"8777","1","4605","4326","","1445","",NULL};
+datafile_rows_t trf_path_row_403[] = {"8778","1","4606","4326","","1446","",NULL};
+datafile_rows_t trf_path_row_404[] = {"8779","1","4600","4326","","1447","",NULL};
+datafile_rows_t trf_path_row_405[] = {"8780","1","4124","4258","","1437","",NULL};
+datafile_rows_t trf_path_row_406[] = {"8784","1","4230","4326","","1450","",NULL};
+datafile_rows_t trf_path_row_407[] = {"8785","1","4135","4269","","1454","",NULL};
+datafile_rows_t trf_path_row_408[] = {"8786","1","4135","4269","","1454","",NULL};
+datafile_rows_t trf_path_row_409[] = {"8786","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_410[] = {"8787","1","4136","4269","","1455","",NULL};
+datafile_rows_t trf_path_row_411[] = {"8788","1","4136","4269","","1455","",NULL};
+datafile_rows_t trf_path_row_412[] = {"8788","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_413[] = {"8789","1","4137","4269","","1456","",NULL};
+datafile_rows_t trf_path_row_414[] = {"8790","1","4137","4269","","1456","",NULL};
+datafile_rows_t trf_path_row_415[] = {"8790","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_416[] = {"8791","1","4138","4269","","1457","",NULL};
+datafile_rows_t trf_path_row_417[] = {"8792","1","4138","4269","","1457","",NULL};
+datafile_rows_t trf_path_row_418[] = {"8792","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_419[] = {"8793","1","4609","4269","","1451","",NULL};
+datafile_rows_t trf_path_row_420[] = {"8794","1","4609","4269","","1451","",NULL};
+datafile_rows_t trf_path_row_421[] = {"8794","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_422[] = {"8795","1","4202","4283","","1458","",NULL};
+datafile_rows_t trf_path_row_423[] = {"8796","1","4202","4283","","1458","",NULL};
+datafile_rows_t trf_path_row_424[] = {"8796","2","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_425[] = {"8797","1","4202","4283","","1459","",NULL};
+datafile_rows_t trf_path_row_426[] = {"8798","1","4202","4283","","1459","",NULL};
+datafile_rows_t trf_path_row_427[] = {"8798","2","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_428[] = {"8799","1","4202","4283","","1460","",NULL};
+datafile_rows_t trf_path_row_429[] = {"8800","1","4202","4283","","1460","",NULL};
+datafile_rows_t trf_path_row_430[] = {"8800","2","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_431[] = {"8801","1","4139","4269","","1461","",NULL};
+datafile_rows_t trf_path_row_432[] = {"8802","1","4139","4269","","1461","",NULL};
+datafile_rows_t trf_path_row_433[] = {"8802","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_434[] = {"8803","1","4267","4269","","1462","",NULL};
+datafile_rows_t trf_path_row_435[] = {"8804","1","4267","4269","","1462","",NULL};
+datafile_rows_t trf_path_row_436[] = {"8804","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_437[] = {"8805","1","4608","4269","","1463","",NULL};
+datafile_rows_t trf_path_row_438[] = {"8806","1","4608","4269","","1463","",NULL};
+datafile_rows_t trf_path_row_439[] = {"8806","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_440[] = {"8807","1","4202","4283","","1464","",NULL};
+datafile_rows_t trf_path_row_441[] = {"8808","1","4202","4283","","1464","",NULL};
+datafile_rows_t trf_path_row_442[] = {"8808","2","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_443[] = {"8811","1","4817","4273","","1466","",NULL};
+datafile_rows_t trf_path_row_444[] = {"8812","1","4807","4275","","1468","",NULL};
+datafile_rows_t trf_path_row_445[] = {"8813","1","4142","4326","","1469","",NULL};
+datafile_rows_t trf_path_row_446[] = {"8814","1","4143","4326","","1470","",NULL};
+datafile_rows_t trf_path_row_447[] = {"8815","1","4312","4326","","1471","",NULL};
+datafile_rows_t trf_path_row_448[] = {"8816","1","4122","4140","","1472","",NULL};
+datafile_rows_t trf_path_row_449[] = {"8817","1","4140","4326","","1473","",NULL};
+datafile_rows_t trf_path_row_450[] = {"8818","1","4122","4140","","1472","",NULL};
+datafile_rows_t trf_path_row_451[] = {"8818","2","4140","4326","","1473","",NULL};
+datafile_rows_t trf_path_row_452[] = {"8819","1","4269","4152","","1474","",NULL};
+datafile_rows_t trf_path_row_453[] = {"8820","1","4269","4152","","1475","",NULL};
+datafile_rows_t trf_path_row_454[] = {"8821","1","4269","4152","","1476","",NULL};
+datafile_rows_t trf_path_row_455[] = {"8822","1","4269","4152","","1477","",NULL};
+datafile_rows_t trf_path_row_456[] = {"8823","1","4269","4152","","1478","",NULL};
+datafile_rows_t trf_path_row_457[] = {"8824","1","4269","4152","","1479","",NULL};
+datafile_rows_t trf_path_row_458[] = {"8825","1","4269","4152","","1480","",NULL};
+datafile_rows_t trf_path_row_459[] = {"8826","1","4269","4152","","1481","",NULL};
+datafile_rows_t trf_path_row_460[] = {"8827","1","4269","4152","","1482","",NULL};
+datafile_rows_t trf_path_row_461[] = {"8828","1","4269","4152","","1483","",NULL};
+datafile_rows_t trf_path_row_462[] = {"8829","1","4269","4152","","1484","",NULL};
+datafile_rows_t trf_path_row_463[] = {"8830","1","4269","4152","","1485","",NULL};
+datafile_rows_t trf_path_row_464[] = {"8831","1","4269","4152","","1486","",NULL};
+datafile_rows_t trf_path_row_465[] = {"8832","1","4269","4152","","1487","",NULL};
+datafile_rows_t trf_path_row_466[] = {"8833","1","4269","4152","","1488","",NULL};
+datafile_rows_t trf_path_row_467[] = {"8834","1","4269","4152","","1489","",NULL};
+datafile_rows_t trf_path_row_468[] = {"8835","1","4269","4152","","1490","",NULL};
+datafile_rows_t trf_path_row_469[] = {"8836","1","4269","4152","","1491","",NULL};
+datafile_rows_t trf_path_row_470[] = {"8837","1","4269","4152","","1492","",NULL};
+datafile_rows_t trf_path_row_471[] = {"8838","1","4269","4152","","1493","",NULL};
+datafile_rows_t trf_path_row_472[] = {"8839","1","4269","4152","","1494","",NULL};
+datafile_rows_t trf_path_row_473[] = {"8840","1","4269","4152","","1495","",NULL};
+datafile_rows_t trf_path_row_474[] = {"8841","1","4269","4152","","1496","",NULL};
+datafile_rows_t trf_path_row_475[] = {"8842","1","4269","4152","","1497","",NULL};
+datafile_rows_t trf_path_row_476[] = {"8843","1","4269","4152","","1498","",NULL};
+datafile_rows_t trf_path_row_477[] = {"8844","1","4269","4152","","1499","",NULL};
+datafile_rows_t trf_path_row_478[] = {"8845","1","4269","4152","","1500","",NULL};
+datafile_rows_t trf_path_row_479[] = {"8846","1","4269","4152","","1501","",NULL};
+datafile_rows_t trf_path_row_480[] = {"8847","1","4269","4152","","1502","",NULL};
+datafile_rows_t trf_path_row_481[] = {"8848","1","4269","4152","","1503","",NULL};
+datafile_rows_t trf_path_row_482[] = {"8849","1","4222","4148","","1504","",NULL};
+datafile_rows_t trf_path_row_483[] = {"8850","1","4148","4326","","1505","",NULL};
+datafile_rows_t trf_path_row_484[] = {"8851","1","4202","4283","","1506","",NULL};
+datafile_rows_t trf_path_row_485[] = {"8852","1","4202","4283","","1507","",NULL};
+datafile_rows_t trf_path_row_486[] = {"8853","1","4202","4283","","1506","",NULL};
+datafile_rows_t trf_path_row_487[] = {"8853","2","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_488[] = {"8854","1","4202","4283","","1507","",NULL};
+datafile_rows_t trf_path_row_489[] = {"8854","2","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_490[] = {"8855","1","4149","4326","","1508","",NULL};
+datafile_rows_t trf_path_row_491[] = {"8856","1","4150","4151","","1509","",NULL};
+datafile_rows_t trf_path_row_492[] = {"8857","1","4150","4151","","1509","",NULL};
+datafile_rows_t trf_path_row_493[] = {"8857","2","4151","4326","","1511","",NULL};
+datafile_rows_t trf_path_row_494[] = {"8858","1","4149","4326","","1510","",NULL};
+datafile_rows_t trf_path_row_495[] = {"8859","1","4151","4326","","1511","",NULL};
+datafile_rows_t trf_path_row_496[] = {"8860","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_497[] = {"8860","2","4269","4152","","1474","",NULL};
+datafile_rows_t trf_path_row_498[] = {"8861","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_499[] = {"8861","2","4269","4152","","1475","",NULL};
+datafile_rows_t trf_path_row_500[] = {"8862","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_501[] = {"8862","2","4269","4152","","1476","",NULL};
+datafile_rows_t trf_path_row_502[] = {"8863","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_503[] = {"8863","2","4269","4152","","1477","",NULL};
+datafile_rows_t trf_path_row_504[] = {"8864","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_505[] = {"8864","2","4269","4152","","1478","",NULL};
+datafile_rows_t trf_path_row_506[] = {"8865","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_507[] = {"8865","2","4269","4152","","1479","",NULL};
+datafile_rows_t trf_path_row_508[] = {"8866","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_509[] = {"8866","2","4269","4152","","1480","",NULL};
+datafile_rows_t trf_path_row_510[] = {"8867","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_511[] = {"8867","2","4269","4152","","1481","",NULL};
+datafile_rows_t trf_path_row_512[] = {"8868","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_513[] = {"8868","2","4269","4152","","1482","",NULL};
+datafile_rows_t trf_path_row_514[] = {"8869","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_515[] = {"8869","2","4269","4152","","1483","",NULL};
+datafile_rows_t trf_path_row_516[] = {"8870","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_517[] = {"8870","2","4269","4152","","1484","",NULL};
+datafile_rows_t trf_path_row_518[] = {"8871","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_519[] = {"8871","2","4269","4152","","1485","",NULL};
+datafile_rows_t trf_path_row_520[] = {"8872","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_521[] = {"8872","2","4269","4152","","1486","",NULL};
+datafile_rows_t trf_path_row_522[] = {"8873","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_523[] = {"8873","2","4269","4152","","1487","",NULL};
+datafile_rows_t trf_path_row_524[] = {"8874","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_525[] = {"8874","2","4269","4152","","1488","",NULL};
+datafile_rows_t trf_path_row_526[] = {"8875","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_527[] = {"8875","2","4269","4152","","1489","",NULL};
+datafile_rows_t trf_path_row_528[] = {"8876","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_529[] = {"8876","2","4269","4152","","1490","",NULL};
+datafile_rows_t trf_path_row_530[] = {"8877","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_531[] = {"8877","2","4269","4152","","1491","",NULL};
+datafile_rows_t trf_path_row_532[] = {"8878","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_533[] = {"8878","2","4269","4152","","1492","",NULL};
+datafile_rows_t trf_path_row_534[] = {"8879","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_535[] = {"8879","2","4269","4152","","1493","",NULL};
+datafile_rows_t trf_path_row_536[] = {"8880","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_537[] = {"8880","2","4269","4152","","1494","",NULL};
+datafile_rows_t trf_path_row_538[] = {"8881","1","4139","4269","","1461","",NULL};
+datafile_rows_t trf_path_row_539[] = {"8881","2","4269","4152","","1495","",NULL};
+datafile_rows_t trf_path_row_540[] = {"8882","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_541[] = {"8882","2","4269","4152","","1496","",NULL};
+datafile_rows_t trf_path_row_542[] = {"8883","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_543[] = {"8883","2","4269","4152","","1497","",NULL};
+datafile_rows_t trf_path_row_544[] = {"8884","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_545[] = {"8884","2","4269","4152","","1498","",NULL};
+datafile_rows_t trf_path_row_546[] = {"8885","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_547[] = {"8885","2","4269","4152","","1499","",NULL};
+datafile_rows_t trf_path_row_548[] = {"8886","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_549[] = {"8886","2","4269","4152","","1500","",NULL};
+datafile_rows_t trf_path_row_550[] = {"8887","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_551[] = {"8887","2","4269","4152","","1501","",NULL};
+datafile_rows_t trf_path_row_552[] = {"8888","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_553[] = {"8888","2","4269","4152","","1502","",NULL};
+datafile_rows_t trf_path_row_554[] = {"8889","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_555[] = {"8889","2","4269","4152","","1503","",NULL};
+datafile_rows_t trf_path_row_556[] = {"8890","1","4153","4326","","1512","",NULL};
+datafile_rows_t trf_path_row_557[] = {"8891","1","4132","4326","","1513","",NULL};
+datafile_rows_t trf_path_row_558[] = {"8892","1","4154","4326","","1514","",NULL};
+datafile_rows_t trf_path_row_559[] = {"8893","1","4269","4326","","1308","",NULL};
+datafile_rows_t trf_path_row_560[] = {"8894","1","4269","4326","","1515","",NULL};
+datafile_rows_t trf_path_row_561[] = {"8895","1","4247","4326","","1516","",NULL};
+datafile_rows_t trf_path_row_562[] = {"8896","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_563[] = {"8896","2","4269","4326","","1515","",NULL};
+datafile_rows_t trf_path_row_564[] = {"8897","1","4267","4269","","1243","",NULL};
+datafile_rows_t trf_path_row_565[] = {"8897","2","4269","4326","","1515","",NULL};
+
+datafile_rows_t *trf_path_rows[] = {trf_path_row_1,trf_path_row_2,trf_path_row_3,trf_path_row_4,trf_path_row_5,trf_path_row_6,trf_path_row_7,trf_path_row_8,trf_path_row_9,trf_path_row_10,trf_path_row_11,trf_path_row_12,trf_path_row_13,trf_path_row_14,trf_path_row_15,trf_path_row_16,trf_path_row_17,trf_path_row_18,trf_path_row_19,trf_path_row_20,trf_path_row_21,trf_path_row_22,trf_path_row_23,trf_path_row_24,trf_path_row_25,trf_path_row_26,trf_path_row_27,trf_path_row_28,trf_path_row_29,t [...]
diff --git a/src/tiff/csv/trf_path.csv b/src/tiff/csv/trf_path.csv
new file mode 100644
index 0000000..edf31a1
--- /dev/null
+++ b/src/tiff/csv/trf_path.csv
@@ -0,0 +1,565 @@
+"TRF_PATH_CODE","TRF_STEP_CODE","SOURCE_HORIZCS_CODE","TARGET_HORIZCS_CODE","POLYN_TRF_CODE","NONPOLYN_TRF_CODE","CHANGE_ID"
+8400,1,4201,4326,,1100,
+8401,1,4201,4326,,1101,
+8402,1,4201,4326,,1102,
+8403,1,4201,4326,,1103,
+8404,1,4201,4326,,1104,
+8405,1,4201,4326,,1105,
+8406,1,4201,4326,,1106,
+8407,1,4205,4326,,1107,
+8408,1,4202,4326,,1108,
+8409,1,4203,4326,,1109,
+8410,1,4204,4326,,1110,
+8411,1,4204,4326,,1111,
+8412,1,4289,4326,,1112,
+8413,1,4209,4326,,1113,
+8414,1,4209,4326,,1114,
+8415,1,4209,4326,,1115,
+8416,1,4209,4326,,1116,
+8417,1,4209,4326,,1117,
+8418,1,4209,4326,,1118,
+8419,1,4209,4326,,1119,
+8420,1,4209,4326,,1120,
+8421,1,4209,4326,,1121,
+8422,1,4210,4326,,1122,
+8423,1,4211,4326,,1123,
+8424,1,4216,4326,,1124,
+8425,1,4218,4326,,1125,
+8426,1,4219,4326,,1126,
+8427,1,4221,4326,,1127,
+8428,1,4222,4326,,1128,
+8429,1,4222,4326,,1129,
+8430,1,4223,4326,,1130,
+8431,1,4224,4326,,1131,
+8432,1,4225,4326,,1132,
+8433,1,4230,4326,,1133,
+8434,1,4230,4326,,1134,
+8435,1,4230,4326,,1135,
+8436,1,4230,4326,,1136,
+8437,1,4230,4326,,1137,
+8438,1,4230,4326,,1138,
+8439,1,4230,4326,,1139,
+8440,1,4230,4326,,1140,
+8441,1,4230,4326,,1141,
+8442,1,4230,4326,,1142,
+8443,1,4230,4326,,1143,
+8444,1,4230,4326,,1144,
+8445,1,4230,4326,,1145,
+8446,1,4230,4231,1000,,
+8446,2,4231,4326,,1146,
+8447,1,4230,4231,,1147,
+8447,2,4231,4326,,1146,
+8448,1,4229,4326,,1148,
+8449,1,4258,4326,,1149,
+8450,1,4283,4326,,1150,
+8451,1,4272,4326,,1151,
+8452,1,4236,4326,,1152,
+8453,1,4239,4326,,1153,
+8454,1,4240,4326,,1154,
+8455,1,4144,4326,,1155,97.235
+8456,1,4146,4326,,1156,97.235
+8457,1,4244,4326,,1157,
+8458,1,4245,4326,,1158,
+8459,1,4250,4326,,1159,
+8460,1,4251,4326,,1160,
+8461,1,4253,4326,,1161,
+8462,1,4253,4326,,1162,
+8463,1,4266,4326,,1163,
+8464,1,4256,4326,,1164,
+8465,1,4262,4326,,1165,
+8466,1,4261,4326,,1166,
+8467,1,4263,4326,,1167,
+8468,1,4263,4326,,1168,
+8469,1,4265,4326,,1169,
+8470,1,4267,4326,,1170,
+8471,1,4267,4326,,1171,
+8472,1,4267,4326,,1172,
+8473,1,4267,4326,,1173,
+8474,1,4267,4326,,1174,
+8475,1,4267,4326,,1175,
+8476,1,4267,4326,,1176,
+8477,1,4267,4326,,1177,
+8478,1,4267,4326,,1178,
+8479,1,4267,4326,,1179,
+8480,1,4267,4326,,1180,
+8481,1,4267,4326,,1181,
+8482,1,4267,4326,,1182,
+8483,1,4267,4326,,1183,
+8484,1,4267,4326,,1184,
+8485,1,4267,4326,,1185,
+8486,1,4267,4326,,1186,
+8487,1,4267,4326,,1187,
+8488,1,4269,4326,,1188,
+8489,1,4270,4326,,1189,
+8490,1,4270,4326,,1190,
+8491,1,4270,4326,,1191,
+8492,1,4271,4326,,1192,
+8493,1,4275,4326,,1193,
+8494,1,4807,4275,,1467,97.05
+8494,2,4275,4326,,1193,
+8495,1,4277,4326,,1195,
+8496,1,4277,4326,,1196,
+8497,1,4277,4326,,1197,
+8498,1,4277,4326,,1198,
+8499,1,4277,4326,,1199,
+8500,1,4282,4326,,1200,
+8501,1,4248,4326,,1201,
+8502,1,4248,4326,,1202,
+8503,1,4248,4326,,1203,
+8504,1,4248,4326,,1204,
+8505,1,4248,4326,,1205,
+8506,1,4248,4326,,1206,
+8507,1,4248,4326,,1207,
+8508,1,4248,4326,,1208,
+8509,1,4248,4326,,1209,
+8510,1,4285,4326,,1210,
+8511,1,4287,4326,,1211,
+8512,1,4291,4326,,1212,
+8513,1,4291,4326,,1213,
+8514,1,4291,4326,,1214,
+8515,1,4291,4326,,1215,
+8516,1,4291,4326,,1216,
+8517,1,4291,4326,,1217,
+8518,1,4291,4326,,1218,
+8519,1,4291,4326,,1219,
+8520,1,4291,4326,,1220,
+8521,1,4291,4326,,1221,
+8522,1,4291,4326,,1222,
+8523,1,4291,4326,,1223,
+8524,1,4291,4326,,1224,
+8525,1,4292,4326,,1225,
+8526,1,4293,4326,,1226,
+8527,1,4297,4326,,1227,
+8528,1,4298,4326,,1228,
+8529,1,4299,4326,,1229,
+8530,1,4301,4326,,1230,
+8531,1,4301,4326,,1231,
+8532,1,4301,4326,,1232,
+8533,1,4301,4326,,1233,
+8534,1,4309,4326,,1234,
+8535,1,4311,4326,,1235,
+8536,1,4230,4231,1000,,
+8537,1,4231,4326,,1146,
+8538,1,4230,4231,,1147,
+8539,1,4203,4326,,1236,
+8540,1,4322,4326,,1237,
+8541,1,4322,4326,,1238,
+8542,1,4324,4322,,1239,
+8543,1,4324,4326,,1240,
+8544,1,4267,4269,,1241,
+8546,1,4267,4269,,1243,
+8548,1,4230,4326,,1245,
+8549,1,4255,4326,,1246,
+8550,1,4145,4326,,1247,97.235
+8551,1,4238,4326,,1248,
+8552,1,4267,4326,,1249,
+8553,1,4267,4326,,1250,
+8554,1,4269,4326,,1251,
+8555,1,4269,4326,,1252,
+8556,1,4307,4326,,1253,
+8557,1,4284,4326,,1254,
+8558,1,4305,4326,,1255,
+8559,1,4232,4326,,1256,
+8560,1,4807,4275,,1467,99.63
+8561,1,4801,4217,,1257,
+8562,1,4802,4218,,1258,
+8563,1,4802,4218,,1258,
+8563,2,4218,4326,,1125,
+8564,1,4803,4207,,1259,
+8565,1,4804,4257,,1260,
+8566,1,4805,4312,,1261,
+8567,1,4806,4265,,1262,
+8568,1,4806,4265,,1262,
+8568,2,4265,4326,,1169,
+8569,1,4808,4280,,1263,
+8570,1,4809,4215,,1264,
+8571,1,4810,4297,,1265,
+8572,1,4810,4297,,1265,
+8572,2,4297,4326,,1227,
+8573,1,4811,4304,,1266,
+8574,1,4812,4305,,1267,
+8575,1,4812,4305,,1267,
+8575,2,4305,4326,,1255,
+8576,1,4813,4211,,1268,
+8577,1,4813,4211,,1268,
+8577,2,4211,4326,,1123,
+8578,1,4814,4308,,1269,98.51
+8579,1,4815,4120,,1270,
+8580,1,4293,4326,,1271,
+8581,1,4121,4326,,1272,
+8582,1,4237,4258,,1273,
+8583,1,4237,4258,,1273,
+8583,2,4258,4326,,1149,
+8584,1,4230,4326,,1275,
+8585,1,4275,4230,,1276,
+8586,1,4807,4275,,1467,
+8586,2,4275,4230,,1276,
+8587,1,4275,4322,,1277,
+8588,1,4807,4275,,1467,
+8588,2,4275,4322,,1277,
+8589,1,4202,4283,,1278,
+8590,1,4202,4283,,1278,
+8590,2,4283,4326,,1150,98.50
+8591,1,4203,4283,,1279,
+8592,1,4203,4283,,1279,
+8592,2,4283,4326,,1150,98.50
+8593,1,4203,4283,,1280,
+8594,1,4203,4283,,1280,
+8594,2,4283,4326,,1150,98.50
+8595,1,4124,4258,,1437,99.11
+8595,2,4258,4326,,1149,99.11
+8596,1,4125,4326,,1282,
+8597,1,4284,4126,,1274,
+8598,1,4126,4326,,1283,
+8599,1,4210,4326,,1284,
+8600,1,4210,4326,,1285,
+8601,1,4294,4326,,1286,
+8602,1,4284,4326,,1287,
+8603,1,4284,4326,,1288,
+8604,1,4284,4326,,1289,
+8605,1,4284,4326,,1290,
+8606,1,4284,4326,,1291,
+8607,1,4284,4326,,1292,
+8608,1,4284,4326,,1293,
+8609,1,4284,4126,,1274,
+8609,2,4126,4326,,1283,
+8610,1,4304,4326,,1294,
+8611,1,4811,4304,,1266,
+8611,2,4304,4326,,1294,
+8612,1,4271,4326,,1295,
+8613,1,4302,4326,,1296,
+8614,1,4127,4130,,1297,
+8615,1,4127,4130,,1297,
+8615,2,4130,4326,,1302,
+8616,1,4127,4130,,1298,
+8617,1,4127,4130,,1298,
+8617,2,4130,4326,,1302,
+8618,1,4127,4130,,1299,
+8619,1,4127,4130,,1299,
+8619,2,4130,4326,,1302,
+8620,1,4127,4130,,1300,
+8621,1,4127,4130,,1300,
+8621,2,4130,4326,,1302,
+8622,1,4127,4130,,1301,
+8623,1,4127,4130,,1301,
+8623,2,4130,4326,,1302,
+8624,1,4130,4326,,1302,
+8625,1,4284,4326,,1303,
+8626,1,4240,4326,,1304,
+8627,1,4301,4326,,1305,
+8628,1,4312,4326,,1306,
+8629,1,4271,4326,,1307,
+8633,1,4314,4258,,1309,
+8634,1,4314,4258,,1309,
+8634,2,4258,4326,,1149,
+8635,1,4284,4258,,1310,
+8636,1,4284,4258,,1310,
+8636,2,4258,4326,,1149,
+8637,1,4230,4326,,1311,
+8638,1,4903,4230,1001,,
+8639,1,4903,4230,1002,,
+8640,1,4903,4230,1003,,
+8641,1,4903,4230,1001,,
+8641,2,4230,4326,,1145,
+8642,1,4267,4269,,1312,
+8643,1,4267,4269,,1312,
+8643,2,4269,4326,,1188,
+8644,1,4267,4269,,1313,
+8645,1,4267,4269,,1313,
+8645,2,4269,4326,,1188,
+8646,1,4277,4326,,1314,
+8647,1,4277,4230,,1315,
+8648,1,4260,4326,,1316,
+8649,1,4220,4324,,1317,
+8650,1,4220,4326,,1318,
+8651,1,4220,4326,,1319,
+8652,1,4220,4326,,1320,
+8653,1,4220,4326,,1321,
+8654,1,4220,4326,,1322,
+8655,1,4220,4326,,1323,
+8656,1,4220,4326,,1324,
+8657,1,4220,4326,,1325,
+8658,1,4220,4326,,1326,
+8659,1,4220,4326,,1327,
+8660,1,4259,4264,,1328,
+8661,1,4264,4326,,1329,
+8662,1,4259,4326,,1330,
+8663,1,4805,4312,,1261,
+8663,2,4312,4326,,1306,
+8664,1,4133,4258,,1331,
+8665,1,4284,4133,,1332,
+8666,1,4133,4326,,1333,
+8667,1,4284,4326,,1334,
+8668,1,4301,4326,,1335,
+8669,1,4301,4326,,1336,
+8670,1,4301,4326,,1337,
+8671,1,4301,4326,,1338,
+8672,1,4301,4326,,1339,
+8673,1,4301,4326,,1340,
+8674,1,4301,4326,,1341,
+8675,1,4301,4326,,1342,
+8676,1,4301,4326,,1343,
+8677,1,4301,4326,,1344,
+8678,1,4301,4326,,1345,
+8679,1,4301,4326,,1346,
+8680,1,4301,4326,,1347,
+8681,1,4301,4326,,1348,
+8682,1,4301,4326,,1349,
+8683,1,4301,4326,,1350,
+8684,1,4301,4326,,1351,
+8685,1,4301,4326,,1352,
+8686,1,4301,4326,,1353,
+8687,1,4301,4326,,1354,
+8688,1,4301,4326,,1355,
+8689,1,4301,4326,,1356,
+8690,1,4301,4326,,1357,
+8691,1,4301,4326,,1358,
+8692,1,4301,4326,,1359,
+8693,1,4301,4326,,1360,
+8694,1,4301,4326,,1361,
+8695,1,4301,4326,,1362,
+8696,1,4301,4326,,1363,
+8697,1,4301,4326,,1364,
+8698,1,4301,4326,,1365,
+8699,1,4301,4326,,1366,
+8700,1,4301,4326,,1367,
+8701,1,4301,4326,,1368,
+8702,1,4301,4326,,1369,
+8703,1,4301,4326,,1370,
+8704,1,4301,4326,,1371,
+8705,1,4301,4326,,1372,
+8706,1,4301,4326,,1373,
+8707,1,4301,4326,,1374,
+8708,1,4301,4326,,1375,
+8709,1,4301,4326,,1376,
+8710,1,4301,4326,,1377,
+8711,1,4301,4326,,1378,
+8712,1,4301,4326,,1379,
+8713,1,4301,4326,,1380,
+8714,1,4301,4326,,1381,
+8715,1,4301,4326,,1382,
+8716,1,4301,4326,,1383,
+8717,1,4301,4326,,1384,
+8718,1,4301,4326,,1385,
+8719,1,4301,4326,,1386,
+8720,1,4301,4326,,1387,
+8721,1,4301,4326,,1388,
+8722,1,4301,4326,,1389,
+8723,1,4301,4326,,1390,
+8724,1,4301,4326,,1391,
+8725,1,4301,4326,,1392,
+8726,1,4301,4326,,1393,
+8727,1,4301,4326,,1394,
+8728,1,4301,4326,,1395,
+8729,1,4301,4326,,1396,
+8730,1,4301,4326,,1397,
+8731,1,4301,4326,,1398,
+8732,1,4301,4326,,1399,
+8733,1,4301,4326,,1400,
+8734,1,4301,4326,,1401,
+8735,1,4301,4326,,1402,
+8736,1,4301,4326,,1403,
+8737,1,4301,4326,,1404,
+8738,1,4301,4326,,1405,
+8739,1,4301,4326,,1406,
+8740,1,4301,4326,,1407,
+8741,1,4301,4326,,1408,
+8742,1,4301,4326,,1409,
+8743,1,4301,4326,,1410,
+8744,1,4301,4326,,1411,
+8745,1,4301,4326,,1412,
+8746,1,4301,4326,,1413,
+8747,1,4301,4326,,1414,
+8748,1,4301,4326,,1415,
+8749,1,4301,4326,,1416,
+8750,1,4301,4326,,1417,
+8751,1,4301,4326,,1418,
+8752,1,4301,4326,,1419,
+8753,1,4301,4326,,1420,
+8754,1,4301,4326,,1421,
+8755,1,4301,4326,,1422,
+8756,1,4301,4326,,1423,
+8757,1,4301,4326,,1424,
+8758,1,4301,4326,,1425,
+8759,1,4301,4326,,1426,
+8760,1,4301,4326,,1427,
+8761,1,4301,4326,,1428,
+8762,1,4301,4326,,1429,
+8763,1,4301,4326,,1430,
+8764,1,4301,4326,,1431,
+8765,1,4301,4326,,1432,
+8766,1,4301,4326,,1433,
+8767,1,4301,4326,,1434,
+8768,1,4301,4326,,1435,
+8769,1,4301,4326,,1436,
+8770,1,4232,4326,,1438,
+8771,1,4134,4326,,1439,
+8772,1,4230,4326,,1440,
+8773,1,4601,4326,,1441,
+8774,1,4602,4326,,1442,
+8775,1,4603,4326,,1443,
+8776,1,4604,4326,,1444,
+8777,1,4605,4326,,1445,
+8778,1,4606,4326,,1446,
+8779,1,4600,4326,,1447,
+8780,1,4124,4258,,1437,
+8784,1,4230,4326,,1450,
+8785,1,4135,4269,,1454,
+8786,1,4135,4269,,1454,
+8786,2,4269,4326,,1188,
+8787,1,4136,4269,,1455,
+8788,1,4136,4269,,1455,
+8788,2,4269,4326,,1188,
+8789,1,4137,4269,,1456,
+8790,1,4137,4269,,1456,
+8790,2,4269,4326,,1188,
+8791,1,4138,4269,,1457,
+8792,1,4138,4269,,1457,
+8792,2,4269,4326,,1188,
+8793,1,4609,4269,,1451,
+8794,1,4609,4269,,1451,
+8794,2,4269,4326,,1188,
+8795,1,4202,4283,,1458,
+8796,1,4202,4283,,1458,
+8796,2,4283,4326,,1150,
+8797,1,4202,4283,,1459,
+8798,1,4202,4283,,1459,
+8798,2,4283,4326,,1150,
+8799,1,4202,4283,,1460,
+8800,1,4202,4283,,1460,
+8800,2,4283,4326,,1150,
+8801,1,4139,4269,,1461,
+8802,1,4139,4269,,1461,
+8802,2,4269,4326,,1188,
+8803,1,4267,4269,,1462,
+8804,1,4267,4269,,1462,
+8804,2,4269,4326,,1188,
+8805,1,4608,4269,,1463,
+8806,1,4608,4269,,1463,
+8806,2,4269,4326,,1188,
+8807,1,4202,4283,,1464,
+8808,1,4202,4283,,1464,
+8808,2,4283,4326,,1150,
+8811,1,4817,4273,,1466,
+8812,1,4807,4275,,1468,
+8813,1,4142,4326,,1469,
+8814,1,4143,4326,,1470,
+8815,1,4312,4326,,1471,
+8816,1,4122,4140,,1472,
+8817,1,4140,4326,,1473,
+8818,1,4122,4140,,1472,
+8818,2,4140,4326,,1473,
+8819,1,4269,4152,,1474,
+8820,1,4269,4152,,1475,
+8821,1,4269,4152,,1476,
+8822,1,4269,4152,,1477,
+8823,1,4269,4152,,1478,
+8824,1,4269,4152,,1479,
+8825,1,4269,4152,,1480,
+8826,1,4269,4152,,1481,
+8827,1,4269,4152,,1482,
+8828,1,4269,4152,,1483,
+8829,1,4269,4152,,1484,
+8830,1,4269,4152,,1485,
+8831,1,4269,4152,,1486,
+8832,1,4269,4152,,1487,
+8833,1,4269,4152,,1488,
+8834,1,4269,4152,,1489,
+8835,1,4269,4152,,1490,
+8836,1,4269,4152,,1491,
+8837,1,4269,4152,,1492,
+8838,1,4269,4152,,1493,
+8839,1,4269,4152,,1494,
+8840,1,4269,4152,,1495,
+8841,1,4269,4152,,1496,
+8842,1,4269,4152,,1497,
+8843,1,4269,4152,,1498,
+8844,1,4269,4152,,1499,
+8845,1,4269,4152,,1500,
+8846,1,4269,4152,,1501,
+8847,1,4269,4152,,1502,
+8848,1,4269,4152,,1503,
+8849,1,4222,4148,,1504,
+8850,1,4148,4326,,1505,
+8851,1,4202,4283,,1506,
+8852,1,4202,4283,,1507,
+8853,1,4202,4283,,1506,
+8853,2,4283,4326,,1150,
+8854,1,4202,4283,,1507,
+8854,2,4283,4326,,1150,
+8855,1,4149,4326,,1508,
+8856,1,4150,4151,,1509,
+8857,1,4150,4151,,1509,
+8857,2,4151,4326,,1511,
+8858,1,4149,4326,,1510,
+8859,1,4151,4326,,1511,
+8860,1,4267,4269,,1241,
+8860,2,4269,4152,,1474,
+8861,1,4267,4269,,1241,
+8861,2,4269,4152,,1475,
+8862,1,4267,4269,,1241,
+8862,2,4269,4152,,1476,
+8863,1,4267,4269,,1241,
+8863,2,4269,4152,,1477,
+8864,1,4267,4269,,1241,
+8864,2,4269,4152,,1478,
+8865,1,4267,4269,,1241,
+8865,2,4269,4152,,1479,
+8866,1,4267,4269,,1241,
+8866,2,4269,4152,,1480,
+8867,1,4267,4269,,1241,
+8867,2,4269,4152,,1481,
+8868,1,4267,4269,,1241,
+8868,2,4269,4152,,1482,
+8869,1,4267,4269,,1241,
+8869,2,4269,4152,,1483,
+8870,1,4267,4269,,1241,
+8870,2,4269,4152,,1484,
+8871,1,4267,4269,,1241,
+8871,2,4269,4152,,1485,
+8872,1,4267,4269,,1241,
+8872,2,4269,4152,,1486,
+8873,1,4267,4269,,1241,
+8873,2,4269,4152,,1487,
+8874,1,4267,4269,,1241,
+8874,2,4269,4152,,1488,
+8875,1,4267,4269,,1241,
+8875,2,4269,4152,,1489,
+8876,1,4267,4269,,1241,
+8876,2,4269,4152,,1490,
+8877,1,4267,4269,,1241,
+8877,2,4269,4152,,1491,
+8878,1,4267,4269,,1241,
+8878,2,4269,4152,,1492,
+8879,1,4267,4269,,1241,
+8879,2,4269,4152,,1493,
+8880,1,4267,4269,,1241,
+8880,2,4269,4152,,1494,
+8881,1,4139,4269,,1461,
+8881,2,4269,4152,,1495,
+8882,1,4267,4269,,1241,
+8882,2,4269,4152,,1496,
+8883,1,4267,4269,,1241,
+8883,2,4269,4152,,1497,
+8884,1,4267,4269,,1241,
+8884,2,4269,4152,,1498,
+8885,1,4267,4269,,1241,
+8885,2,4269,4152,,1499,
+8886,1,4267,4269,,1241,
+8886,2,4269,4152,,1500,
+8887,1,4267,4269,,1241,
+8887,2,4269,4152,,1501,
+8888,1,4267,4269,,1241,
+8888,2,4269,4152,,1502,
+8889,1,4267,4269,,1241,
+8889,2,4269,4152,,1503,
+8890,1,4153,4326,,1512,
+8891,1,4132,4326,,1513,
+8892,1,4154,4326,,1514,
+8893,1,4269,4326,,1308,
+8894,1,4269,4326,,1515,
+8895,1,4247,4326,,1516,
+8896,1,4267,4269,,1241,
+8896,2,4269,4326,,1515,
+8897,1,4267,4269,,1243,
+8897,2,4269,4326,,1515,
diff --git a/src/tiff/csv/unit_of_measure.csv b/src/tiff/csv/unit_of_measure.csv
new file mode 100644
index 0000000..805d97c
--- /dev/null
+++ b/src/tiff/csv/unit_of_measure.csv
@@ -0,0 +1,64 @@
+"UOM_CODE","UNIT_OF_MEAS_NAME","UNIT_OF_MEAS_TYPE","TARGET_UOM_CODE","FACTOR_B","FACTOR_C","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+9001,metre,length,9001,1.0,1.0,Also known as International metre.,ISO 1000.,EPSG,1995-06-02 00:00:00,,0
+9002,foot,length,9001,0.3048,1.0,,ISO; 1958,EPSG,1995-06-02 00:00:00,,0
+9003,US survey foot,length,9001,12.0,39.37,Used in USA.,EPSG,EPSG,2000-05-07 00:00:00,99.99,0
+9005,Clarke's foot,length,9001,0.304797265,1.0,"Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre. Used in older Australian, southern African & British West Indian mapping.",Australian Land Information Group www.auslig.gov.au/geodesy/histry.htm,EPSG,2001-01-21 00:00:00,97.234 99.99 2000.05,0
+9014,fathom,length,9001,1.8288,1.0,= 6 feet.,,EPSG,1995-06-02 00:00:00,,0
+9030,nautical mile,length,9001,1852.0,1.0,,,EPSG,1996-10-18 00:00:00,96.24,0
+9031,German legal metre,length,9001,1.0000135965,1.0,Used in Namibia.,Chief Directorate Surveys and Land Information; Mowbray; South Africa,EPSG,1997-06-16 00:00:00,,0
+9033,US survey chain,length,9001,792.0,39.37,Used in USA primarily for public lands cadastral work.,Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).,EPSG,2000-05-07 00:00:00,99.99,0
+9034,US survey link,length,9001,7.92,39.37,Used in USA primarily for public lands cadastral work.,Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).,EPSG,2000-05-07 00:00:00,99.99,0
+9035,US survey mile,length,9001,63360.0,39.37,Used in USA primarily for public lands cadastral work.,Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).,EPSG,2000-05-07 00:00:00,99.99,0
+9036,kilometre,length,9001,1000.0,1.0,,ISO 1000.,EPSG,1998-11-11 00:00:00,,0
+9037,Clarke's yard,length,9001,0.914391795,1.0,"=3 Clarke's feet. Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre. Used in older Australian, southern African & British West Indian mapping.",Australian Land Information Group www.auslig.gov.au/geodesy/histry.htm,EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9038,Clarke's chain,length,9001,20.11661949,1.0,"=22 Clarke's yards. Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre. Used in older Australian, southern African & British West Indian mapping.",Australian Land Information Group www.auslig.gov.au/geodesy/histry.htm,EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9039,Clarke's link,length,9001,0.2011661949,1.0,"=1/100 Clarke's chain. Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre. Used in older Australian, southern African & British West Indian mapping.",Australian Land Information Group www.auslig.gov.au/geodesy/histry.htm,EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9040,British yard (Sears 1922),length,9001,36.0,39.370147,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. Used in East Malaysian and older New Zealand mapping.,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9041,British foot (Sears 1922),length,9001,12.0,39.370147,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. Used in East Malaysian and older New Zealand mapping.,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9042,British chain (Sears 1922),length,9001,792.0,39.370147,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. Used in East Malaysian and older New Zealand mapping.,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9043,British link (Sears 1922),length,9001,7.92,39.370147,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. Used in East Malaysian and older New Zealand mapping.,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9050,British yard (Benoit 1895 A),length,9001,0.9143992,1.0,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard. Used for deriving metric size of ellipsoid in Palestine.,"J.S.Clark; ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9051,British foot (Benoit 1895 A),length,9001,0.9143992,3.0,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard. Used for deriving metric size of ellipsoid in Palestine.,"J.S.Clark; ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9052,British chain (Benoit 1895 A),length,9001,20.1167824,1.0,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard. Used for deriving metric size of ellipsoid in Palestine.,"J.S.Clark; ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9053,British link (Benoit 1895 A),length,9001,0.201167824,1.0,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard. Used for deriving metric size of ellipsoid in Palestine.,"J.S.Clark; ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9060,British yard (Benoit 1895 B),length,9001,36.0,39.370113,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.","G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9061,British foot (Benoit 1895 B),length,9001,12.0,39.370113,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre. Used in West Malaysian mapping.,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9062,British chain (Benoit 1895 B),length,9001,792.0,39.370113,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre. Used in West Malaysian mapping.,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9063,British link (Benoit 1895 B),length,9001,7.92,39.370113,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre. Used in West Malaysian mapping.,"G. Bomford; ""Geodesy""; 3rd edition 1975",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9070,British foot (1865),length,9001,0.9144025,3.0,Uses Clark's estimate of 1853-1865 British foot-metre ratio of 0.9144025 metres per yard. Used in 1962 and 1975 estimates of Indian foot.,"J.S.Clark; ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233 99.99,0
+9080,Indian foot,length,9001,12.0,39.370142,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (= 3 British feet) taken to be J.S.Clark's 1865 value of 0.9144025 metres.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,2000-05-07 00:00:00,97.231 99.99,0
+9081,Indian foot (1937),length,9001,0.30479841,1.0,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British foot taken to be 1895 Benoit value of 12/39.370113m. Rounded to 8 decimal places as 0.30479841. Used from Bangladesh to Vietnam. Previously used in India and Pakistan but superseded.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,2000-05-07 00:00:00,97.231 99.99,0
+9082,Indian foot (1962),length,9001,0.3047996,1.0,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures with a small error as 1 Ind ft=0.3048996m. Used in Pakistan since metrication.,"G. Bomford; ""Geodesy""; 2nd edition 1962",EPSG,2000-05-07 00:00:00,97.231 99.99,0
+9083,Indian foot (1975),length,9001,0.3047995,1.0,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures as 1 Ind ft=0.3048995m. Used in India since metrication.,"G. Bomford; ""Geodesy""; 3rd edition 1975",EPSG,2000-05-07 00:00:00,97.231 99.99,0
+9084,Indian yard,length,9001,36.0,39.370142,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (= 3 British feet) taken to be J.S.Clark's 1865 value of 0.9144025 metres.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,2000-05-07 00:00:00,97.231 99.99,0
+9085,Indian yard (1937),length,9001,0.91439523,1.0,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British foot taken to be 1895 Benoit value of 12/39.370113m. Rounded to 8 decimal places as 0.30479841. Used from Bangladesh to Vietnam. Previously used in India and Pakistan but superseded.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,2000-05-07 00:00:00,97.231 99.99,0
+9086,Indian yard (1962),length,9001,0.9143988,1.0,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures with a small error as 1 Ind ft=0.3048996m. Used in Pakistan since metrication.,"G. Bomford; ""Geodesy""; 2nd edition 1962",EPSG,2000-05-07 00:00:00,97.231 99.99,0
+9087,Indian yard (1975),length,9001,0.9143985,1.0,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures as 1 Ind ft=0.3048995m. Used in India since metrication.,"G. Bomford; ""Geodesy""; 3rd edition 1975",EPSG,2000-05-07 00:00:00,97.231 99.99,0
+9093,Statute mile,length,9001,1609.344,1.0,=5280 feet,EPSG,EPSG,2000-03-07 00:00:00,,0
+9094,Gold Coast foot,length,9001,6378300.0,20926201.0,"Used in Ghana and some adjacent parts of British west Africa prior to metrication, except for the metrication of projection defining parameters when British foot (Sears 1922) used.",Ordnance Survey International,EPSG,2001-01-21 00:00:00,2000.86,0
+9101,radian,angle,9101,1.0,1.0,SI standard unit.,ISO 1000.,EPSG,1995-06-02 00:00:00,,0
+9102,degree,angle,9101,3.14159265358979,180.0,=pi/180,,EPSG,1996-10-18 00:00:00,96.22,0
+9103,arc-minute,angle,9101,3.14159265358979,10800.0,1/60th degree. =(pi/180) / 60,,EPSG,1996-10-18 00:00:00,96.22,0
+9104,arc-second,angle,9101,3.14159265358979,648000.0,1/60th arc-minute. =(pi/180) / 3600,,EPSG,1996-10-18 00:00:00,96.22,0
+9105,grad,angle,9101,3.14159265358979,200.0,"=pi/200. In France also abbreviated as ""gr"".",,EPSG,1996-10-18 00:00:00,96.22 99.05,0
+9106,gon,angle,9101,3.14159265358979,200.0,=pi/200,,EPSG,1996-10-18 00:00:00,96.22,0
+9107,degree minute second,angle,9101,,,"Format: sign - degrees (integer) - symbol - arc-minutes (integer) - symbol - arc-seconds (real, any precision). Different symbol sets are in use as separators for example � ' "". Convert to degrees using formula. Not recommended for data storage.",EPSG,EPSG,2002-07-13 00:00:00,96.19 2002.07,0
+9108,degree minute second hemisphere,angle,9101,,,Format: degrees (integer) - symbol - arc-minutes (integer) - symbol - arc-seconds (real) - symbol - hemisphere (single character N S E or W). Different symbol sets are in use as separators. Convert to deg using formula. Not recommended for data storage.,EPSG,EPSG,2002-07-13 00:00:00,96.19 2002.07,0
+9109,microradian,angle,9101,1.0,1000000.0,rad * 10E-6,ISO 1000.,EPSG,1996-10-18 00:00:00,99.05,0
+9110,sexagesimal DMS,angle,9101,,,Format: sign - degrees - decimal point - minutes (two digits) - integer seconds (two digits) - fraction of seconds (any precision). Must include leading zero in minutes and seconds and exclude decimal point for seconds. Convert to degrees using formula.,EPSG,EPSG,2002-07-13 00:00:00,2002.27,0
+9111,sexagesimal DM,angle,9101,,,Format: sign - degrees - decimal point - integer minutes (two digits) - fraction of minutes (any precision). Must include leading zero in integer minutes. Must exclude decimal point for minutes. Convert to degrees using formula. Not recommended.,EPSG,EPSG,2002-06-22 00:00:00,2002.07,0
+9112,centesimal minute,angle,9101,3.14159265358979,20000.0,1/100 of a grad and gon. =(pi/200) / 100,http://www.geodesy.matav.hu/xgonmil.htm,EPSG,1999-10-20 00:00:00,98.48 99.51,0
+9113,centesimal second,angle,9101,3.14159265358979,2000000.0,"1/100 of a centesimal minute or 1/10,000th of a grad and gon. =(pi/200) / 10000",http://www.geodesy.matav.hu/xgonmil.htm,EPSG,1999-10-20 00:00:00,99.51,0
+9114,mil_6400,angle,9101,3.14159265358979,3200.0,Angle subtended by 1/6400 part of a circle. Approximates to 1/1000th radian. Note that other approximations (notably 1/6300 circle and 1/6000 circle) also exist.,http://www.geodesy.matav.hu/xgonmil.htm,EPSG,1999-10-20 00:00:00,99.51,0
+9115,degree minute,angle,9101,,,"Format: sign - degrees (integer) - symbol - arc-minutes (real, any precision) - symbol. Different symbol sets are in use as separators for example � '. Convert to degrees using formula. Not recommended for data storage.",EPSG,EPSG,2002-07-13 00:00:00,,0
+9201,unity,scale,9201,1.0,1.0,,,EPSG,1996-09-12 00:00:00,,0
+9202,parts per million,scale,9201,1.0,1000000.0,,,EPSG,1996-09-12 00:00:00,,0
+9203,coefficient,scale,9201,,,Used when parameters are coefficients. They inherently take the units which depend upon the term to which the coefficient applies.,EPSG,EPSG,2000-03-07 00:00:00,,0
+9204,Bin width 330 US survey feet,length,9001,3960.0,39.37,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9205,Bin width 165 US survey feet,length,9001,1980.0,39.37,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9206,Bin width 82.5 US survey feet,length,9001,990.0,39.37,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9207,Bin width 37.5 metres,length,9001,37.5,1.0,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9208,Bin width 25 metres,length,9001,25.0,1.0,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9209,Bin width 12.5 metres,length,9001,12.5,1.0,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9210,Bin width 6.25 metres,length,9001,6.25,1.0,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9211,Bin width 3.125 metres,length,9001,3.125,1.0,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
diff --git a/src/tiff/csv/uom_an_alias.c b/src/tiff/csv/uom_an_alias.c
new file mode 100644
index 0000000..59a31f8
--- /dev/null
+++ b/src/tiff/csv/uom_an_alias.c
@@ -0,0 +1,5 @@
+#include "defs.h"
+datafile_rows_t uom_an_alias_row_1[] = {"UOM_A_ALIAS_CODE","UOM_A_ALIAS_NAME","UOM_ANGLE_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t uom_an_alias_row_2[] = {"9115","mil","9114","1999-04-22 00:00:00","http://www.geodesy.matav.hu/xgonmil.htm","EPSG","Alias also applies to other variations of a mil, especially mil_6300 and mil_6000.","",NULL};
+
+datafile_rows_t *uom_an_alias_rows[] = {uom_an_alias_row_1,uom_an_alias_row_2,NULL};
diff --git a/src/tiff/csv/uom_an_alias.csv b/src/tiff/csv/uom_an_alias.csv
new file mode 100644
index 0000000..ee4178d
--- /dev/null
+++ b/src/tiff/csv/uom_an_alias.csv
@@ -0,0 +1,2 @@
+"UOM_A_ALIAS_CODE","UOM_A_ALIAS_NAME","UOM_ANGLE_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+9115,mil,9114,1999-04-22 00:00:00,http://www.geodesy.matav.hu/xgonmil.htm,EPSG,"Alias also applies to other variations of a mil, especially mil_6300 and mil_6000.",
diff --git a/src/tiff/csv/uom_angle.c b/src/tiff/csv/uom_angle.c
new file mode 100644
index 0000000..b671957
--- /dev/null
+++ b/src/tiff/csv/uom_angle.c
@@ -0,0 +1,18 @@
+#include "defs.h"
+datafile_rows_t uom_angle_row_1[] = {"UOM_ANGLE_CODE","UNIT_OF_MEAS_EPSG_NAME","UNIT_OF_MEAS_USER_NAME","ABBREVIATION","DESCRIPTION","TARGET_UOM_ANGLE_CODE","FACTOR_B","FACTOR_C","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t uom_angle_row_2[] = {"9101","radian","","rad","","9101","1.0","1.0","1995-06-02 00:00:00","ISO 1000.","EPSG","SI standard unit.","",NULL};
+datafile_rows_t uom_angle_row_3[] = {"9102","degree","","deg","","9101","3.14159265358979","180.0","1996-10-18 00:00:00","","EPSG","=pi/180","96.22",NULL};
+datafile_rows_t uom_angle_row_4[] = {"9103","arc-minute","","min","","9101","3.14159265358979","10800.0","1996-10-18 00:00:00","","EPSG","1/60th degree. =(pi/180) / 60","96.22",NULL};
+datafile_rows_t uom_angle_row_5[] = {"9104","arc-second","","sec","","9101","3.14159265358979","648000.0","1996-10-18 00:00:00","","EPSG","1/60th arc-minute. =(pi/180) / 3600","96.22",NULL};
+datafile_rows_t uom_angle_row_6[] = {"9105","grad","","g","","9101","3.14159265358979","200.0","1996-10-18 00:00:00","","EPSG","=pi/200. In France also abbreviated as \"gr\".","96.22 99.05",NULL};
+datafile_rows_t uom_angle_row_7[] = {"9106","gon","","","","9101","3.14159265358979","200.0","1996-10-18 00:00:00","","EPSG","=pi/200","96.22",NULL};
+datafile_rows_t uom_angle_row_8[] = {"9107","DMS","","","degree minute second","9101","","","1996-10-18 00:00:00","","EPSG","Format: degrees (integer) - space - arc-minutes (integer) - space - arc-seconds (real). Convert to degees using formula.","96.19",NULL};
+datafile_rows_t uom_angle_row_9[] = {"9108","DMSH","","","degree minute second hemisphere","9101","","","1996-10-18 00:00:00","","EPSG","Format: degrees (integer) - space - arc-minutes (integer) - space - arc-seconds (real) - hemisphere (single character N S E or W). Convert to degrees using formula.","96.19",NULL};
+datafile_rows_t uom_angle_row_10[] = {"9109","microradian","","�rad","rad * 10E-6","9101","1.0","1000000.0","1996-10-18 00:00:00","ISO 1000.","EPSG","","99.05",NULL};
+datafile_rows_t uom_angle_row_11[] = {"9110","DDD.MMSSsss","","","sexagesimal degrees","9101","","","1996-10-18 00:00:00","","EPSG","Format: degrees - decimal point - minutes (two digits) - integer seconds (two digits) - fraction of seconds (any precision). Must include leading zero in minutes and seconds. Must exclude decimal point for seconds. Convert to degrees using formula.","",NULL};
+datafile_rows_t uom_angle_row_12[] = {"9111","DDD.MMm","","","degrees and decimal minutes","9101","","","1999-04-22 00:00:00","","EPSG","Format: degrees - decimal point - integer minutes (two digits) - fraction of minutes. Must include leading zero in integer minutes. Must exclude decimal point for minutes. Any precision of minutes are allowed. Convert to degrees using formula.","",NULL};
+datafile_rows_t uom_angle_row_13[] = {"9112","centesimal minute","","c","","9101","3.14159265358979","20000.0","1999-10-20 00:00:00","http://www.geodesy.matav.hu/xgonmil.htm","EPSG","1/100 of a grad and gon. =(pi/200) / 100","98.48 99.51",NULL};
+datafile_rows_t uom_angle_row_14[] = {"9113","centesimal second","","cc","","9101","3.14159265358979","2000000.0","1999-10-20 00:00:00","http://www.geodesy.matav.hu/xgonmil.htm","EPSG","1/100 of a centesimal minute or 1/10,000th of a grad and gon. =(pi/200) / 10000","99.51",NULL};
+datafile_rows_t uom_angle_row_15[] = {"9114","mil_6400","","mil","Angle subtended by 1/6400 part of a circle","9101","3.14159265358979","3200.0","1999-10-20 00:00:00","http://www.geodesy.matav.hu/xgonmil.htm","EPSG","Angle subtended by 1/6400 part of a circle. Approximates to 1/1000th radian. Note that other approximations (notably 1/6300 circle and 1/6000 circle) also exist.","99.51",NULL};
+
+datafile_rows_t *uom_angle_rows[] = {uom_angle_row_1,uom_angle_row_2,uom_angle_row_3,uom_angle_row_4,uom_angle_row_5,uom_angle_row_6,uom_angle_row_7,uom_angle_row_8,uom_angle_row_9,uom_angle_row_10,uom_angle_row_11,uom_angle_row_12,uom_angle_row_13,uom_angle_row_14,uom_angle_row_15,NULL};
diff --git a/src/tiff/csv/uom_angle.csv b/src/tiff/csv/uom_angle.csv
new file mode 100644
index 0000000..5fa6a4a
--- /dev/null
+++ b/src/tiff/csv/uom_angle.csv
@@ -0,0 +1,15 @@
+"UOM_ANGLE_CODE","UNIT_OF_MEAS_EPSG_NAME","UNIT_OF_MEAS_USER_NAME","ABBREVIATION","DESCRIPTION","TARGET_UOM_ANGLE_CODE","FACTOR_B","FACTOR_C","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+9101,radian,,rad,,9101,1.0,1.0,1995-06-02 00:00:00,ISO 1000.,EPSG,SI standard unit.,
+9102,degree,,deg,,9101,3.14159265358979,180.0,1996-10-18 00:00:00,,EPSG,=pi/180,96.22
+9103,arc-minute,,min,,9101,3.14159265358979,10800.0,1996-10-18 00:00:00,,EPSG,1/60th degree. =(pi/180) / 60,96.22
+9104,arc-second,,sec,,9101,3.14159265358979,648000.0,1996-10-18 00:00:00,,EPSG,1/60th arc-minute. =(pi/180) / 3600,96.22
+9105,grad,,g,,9101,3.14159265358979,200.0,1996-10-18 00:00:00,,EPSG,"=pi/200. In France also abbreviated as \"gr\".",96.22 99.05
+9106,gon,,,,9101,3.14159265358979,200.0,1996-10-18 00:00:00,,EPSG,=pi/200,96.22
+9107,DMS,,,degree minute second,9101,,,1996-10-18 00:00:00,,EPSG,Format: degrees (integer) - space - arc-minutes (integer) - space - arc-seconds (real). Convert to degees using formula.,96.19
+9108,DMSH,,,degree minute second hemisphere,9101,,,1996-10-18 00:00:00,,EPSG,Format: degrees (integer) - space - arc-minutes (integer) - space - arc-seconds (real) - hemisphere (single character N S E or W). Convert to degrees using formula.,96.19
+9109,microradian,,�rad,rad * 10E-6,9101,1.0,1000000.0,1996-10-18 00:00:00,ISO 1000.,EPSG,,99.05
+9110,DDD.MMSSsss,,,sexagesimal degrees,9101,,,1996-10-18 00:00:00,,EPSG,Format: degrees - decimal point - minutes (two digits) - integer seconds (two digits) - fraction of seconds (any precision). Must include leading zero in minutes and seconds. Must exclude decimal point for seconds. Convert to degrees using formula.,
+9111,DDD.MMm,,,degrees and decimal minutes,9101,,,1999-04-22 00:00:00,,EPSG,Format: degrees - decimal point - integer minutes (two digits) - fraction of minutes. Must include leading zero in integer minutes. Must exclude decimal point for minutes. Any precision of minutes are allowed. Convert to degrees using formula.,
+9112,centesimal minute,,c,,9101,3.14159265358979,20000.0,1999-10-20 00:00:00,http://www.geodesy.matav.hu/xgonmil.htm,EPSG,1/100 of a grad and gon. =(pi/200) / 100,98.48 99.51
+9113,centesimal second,,cc,,9101,3.14159265358979,2000000.0,1999-10-20 00:00:00,http://www.geodesy.matav.hu/xgonmil.htm,EPSG,"1/100 of a centesimal minute or 1/10,000th of a grad and gon. =(pi/200) / 10000",99.51
+9114,mil_6400,,mil,Angle subtended by 1/6400 part of a circle,9101,3.14159265358979,3200.0,1999-10-20 00:00:00,http://www.geodesy.matav.hu/xgonmil.htm,EPSG,Angle subtended by 1/6400 part of a circle. Approximates to 1/1000th radian. Note that other approximations (notably 1/6300 circle and 1/6000 circle) also exist.,99.51
diff --git a/src/tiff/csv/uom_le_alias.c b/src/tiff/csv/uom_le_alias.c
new file mode 100644
index 0000000..3f7404b
--- /dev/null
+++ b/src/tiff/csv/uom_le_alias.c
@@ -0,0 +1,27 @@
+#include "defs.h"
+datafile_rows_t uom_le_alias_row_1[] = {"UOM_L_ALIAS_CODE","UOM_L_ALIAS_NAME","UOM_LENGTH_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t uom_le_alias_row_2[] = {"9015","International nautical mile","9030","1996-10-18 00:00:00","","EPSG","","9624",NULL};
+datafile_rows_t uom_le_alias_row_3[] = {"9016","meter","9001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_4[] = {"9018","International foot","9002","1995-06-02 00:00:00","ISO 1958.","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_5[] = {"9019","American foot","9003","1995-06-02 00:00:00","","EPSG","Used in USA.","",NULL};
+datafile_rows_t uom_le_alias_row_6[] = {"9020","Cape foot","9005","1995-06-02 00:00:00","","EPSG","Assumes Clarke's 1865 ratio of 1 French legal metre = 39.370432 imperial inches applies to the international metre. Used in southern African & Jamaica mapping.","",NULL};
+datafile_rows_t uom_le_alias_row_7[] = {"9022","Indian geodetic foot","9080","1995-06-02 00:00:00","","EPSG","Indian Foot = 0.9999566 British feet (A.R.Clarke). British yard (=3 feet) taken to be J.S.Clarke 1865 value of 0.9144025 metres.","97.23",NULL};
+datafile_rows_t uom_le_alias_row_8[] = {"9023","link (Clarke's ratio)","9039","1999-10-20 00:00:00","","EPSG","Assumes Clarke's 1865 ratio of 1 French legal metre = 39.370432 imperial inches applies to the international metre. Used in Trinidad and Tobago mapping.","97.231",NULL};
+datafile_rows_t uom_le_alias_row_9[] = {"9024","link","9063","1999-10-20 00:00:00","","EPSG","Used in West Malaysian mapping.","97.231",NULL};
+datafile_rows_t uom_le_alias_row_10[] = {"9025","link","9043","1999-10-20 00:00:00","","EPSG","Used in East Malaysian mapping.","97.231",NULL};
+datafile_rows_t uom_le_alias_row_11[] = {"9026","chain","9062","1999-10-20 00:00:00","","EPSG","Used in West Malaysian mapping.","97.231",NULL};
+datafile_rows_t uom_le_alias_row_12[] = {"9027","chain","9042","1999-10-20 00:00:00","","EPSG","Used in East Malaysian mapping.","97.231",NULL};
+datafile_rows_t uom_le_alias_row_13[] = {"9028","yard","9040","1999-10-20 00:00:00","","EPSG","Used in older New Zealand mapping.","97.231",NULL};
+datafile_rows_t uom_le_alias_row_14[] = {"9029","yard","9085","1999-10-20 00:00:00","","EPSG","= 3 Indian feet.","97.23",NULL};
+datafile_rows_t uom_le_alias_row_15[] = {"9044","foot","9041","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_16[] = {"9054","chain","9052","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_17[] = {"9055","foot","9051","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_18[] = {"9056","link","9053","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_19[] = {"9057","yard","9050","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_20[] = {"9064","foot","9061","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_21[] = {"9065","yard","9060","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_22[] = {"9071","foot","9070","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_23[] = {"9088","Indian geodetic foot","9081","1999-10-20 00:00:00","","EPSG","Indian Foot = 0.9999566 British feet (A.R.Clarke). British yard (=3 feet) taken to be Benoit's 1885 value of 0.9144992 metres.","",NULL};
+datafile_rows_t uom_le_alias_row_24[] = {"9090","yard","9084","1999-10-20 00:00:00","","EPSG","= 3 Indian feet.","97.23",NULL};
+
+datafile_rows_t *uom_le_alias_rows[] = {uom_le_alias_row_1,uom_le_alias_row_2,uom_le_alias_row_3,uom_le_alias_row_4,uom_le_alias_row_5,uom_le_alias_row_6,uom_le_alias_row_7,uom_le_alias_row_8,uom_le_alias_row_9,uom_le_alias_row_10,uom_le_alias_row_11,uom_le_alias_row_12,uom_le_alias_row_13,uom_le_alias_row_14,uom_le_alias_row_15,uom_le_alias_row_16,uom_le_alias_row_17,uom_le_alias_row_18,uom_le_alias_row_19,uom_le_alias_row_20,uom_le_alias_row_21,uom_le_alias_row_22,uom_le_alias_row_23,u [...]
diff --git a/src/tiff/csv/uom_le_alias.csv b/src/tiff/csv/uom_le_alias.csv
new file mode 100644
index 0000000..7bb11ea
--- /dev/null
+++ b/src/tiff/csv/uom_le_alias.csv
@@ -0,0 +1,24 @@
+"UOM_L_ALIAS_CODE","UOM_L_ALIAS_NAME","UOM_LENGTH_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+9015,International nautical mile,9030,1996-10-18 00:00:00,,EPSG,,9624
+9016,meter,9001,1995-06-02 00:00:00,,EPSG,,
+9018,International foot,9002,1995-06-02 00:00:00,ISO 1958.,EPSG,,
+9019,American foot,9003,1995-06-02 00:00:00,,EPSG,Used in USA.,
+9020,Cape foot,9005,1995-06-02 00:00:00,,EPSG,Assumes Clarke's 1865 ratio of 1 French legal metre = 39.370432 imperial inches applies to the international metre. Used in southern African & Jamaica mapping.,
+9022,Indian geodetic foot,9080,1995-06-02 00:00:00,,EPSG,Indian Foot = 0.9999566 British feet (A.R.Clarke). British yard (=3 feet) taken to be J.S.Clarke 1865 value of 0.9144025 metres.,97.23
+9023,link (Clarke's ratio),9039,1999-10-20 00:00:00,,EPSG,Assumes Clarke's 1865 ratio of 1 French legal metre = 39.370432 imperial inches applies to the international metre. Used in Trinidad and Tobago mapping.,97.231
+9024,link,9063,1999-10-20 00:00:00,,EPSG,Used in West Malaysian mapping.,97.231
+9025,link,9043,1999-10-20 00:00:00,,EPSG,Used in East Malaysian mapping.,97.231
+9026,chain,9062,1999-10-20 00:00:00,,EPSG,Used in West Malaysian mapping.,97.231
+9027,chain,9042,1999-10-20 00:00:00,,EPSG,Used in East Malaysian mapping.,97.231
+9028,yard,9040,1999-10-20 00:00:00,,EPSG,Used in older New Zealand mapping.,97.231
+9029,yard,9085,1999-10-20 00:00:00,,EPSG,= 3 Indian feet.,97.23
+9044,foot,9041,1999-10-20 00:00:00,,EPSG,,
+9054,chain,9052,1999-10-20 00:00:00,,EPSG,,
+9055,foot,9051,1999-10-20 00:00:00,,EPSG,,
+9056,link,9053,1999-10-20 00:00:00,,EPSG,,
+9057,yard,9050,1999-10-20 00:00:00,,EPSG,,
+9064,foot,9061,1999-10-20 00:00:00,,EPSG,,
+9065,yard,9060,1999-10-20 00:00:00,,EPSG,,
+9071,foot,9070,1999-10-20 00:00:00,,EPSG,,
+9088,Indian geodetic foot,9081,1999-10-20 00:00:00,,EPSG,Indian Foot = 0.9999566 British feet (A.R.Clarke). British yard (=3 feet) taken to be Benoit's 1885 value of 0.9144992 metres.,
+9090,yard,9084,1999-10-20 00:00:00,,EPSG,= 3 Indian feet.,97.23
diff --git a/src/tiff/csv/uom_length.c b/src/tiff/csv/uom_length.c
new file mode 100644
index 0000000..9f13b1e
--- /dev/null
+++ b/src/tiff/csv/uom_length.c
@@ -0,0 +1,39 @@
+#include "defs.h"
+datafile_rows_t uom_length_row_1[] = {"UOM_LENGTH_CODE","UNIT_OF_MEAS_EPSG_NAME","UNIT_OF_MEAS_USER_NAME","ABBREVIATION","DESCRIPTION","TARGET_UOM_LENGTH_CODE","FACTOR_B","FACTOR_C","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t uom_length_row_2[] = {"9001","metre","","m","","9001","1.0","1.0","1995-06-02 00:00:00","ISO 1000.","EPSG","Also known as International metre.","",NULL};
+datafile_rows_t uom_length_row_3[] = {"9002","foot","","ft","","9001","0.3048","1.0","1995-06-02 00:00:00","ISO; 1958","EPSG","","",NULL};
+datafile_rows_t uom_length_row_4[] = {"9003","US survey foot","","ft US","","9001","12.0","39.37","1995-06-02 00:00:00","","EPSG","Used in USA.","",NULL};
+datafile_rows_t uom_length_row_5[] = {"9005","Clarke's foot","","ft (Cla)","","9001","0.304797265","1.0","1999-10-20 00:00:00","Australian Land Information Group www.auslig.gov/au/geodesy/histry.htm","EPSG","Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre. Used in older Australian, southern African & British West Indian mapping.","97.234",NULL};
+datafile_rows_t uom_length_row_6[] = {"9014","fathom","","f","","9001","1.8288","1.0","1999-10-20 00:00:00","","EPSG","= 6 feet.","",NULL};
+datafile_rows_t uom_length_row_7[] = {"9030","nautical mile","","NM","","9001","1852.0","1.0","1996-10-18 00:00:00","","EPSG","","96.24",NULL};
+datafile_rows_t uom_length_row_8[] = {"9031","German legal metre","","GLM","","9001","1.0000135965","1.0","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa","EPSG","Used in Namibia.","",NULL};
+datafile_rows_t uom_length_row_9[] = {"9033","US survey chain","","ch US","","9001","792.0","39.37","1998-03-12 00:00:00","Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).","EPSG","Used in USA primarily for public lands cadastral work.","",NULL};
+datafile_rows_t uom_length_row_10[] = {"9034","US survey link","","lk US","","9001","7.92","39.37","1998-03-12 00:00:00","Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).","EPSG","Used in USA primarily for public lands cadastral work.","",NULL};
+datafile_rows_t uom_length_row_11[] = {"9035","US survey mile","","mile US","","9001","63360.0","39.37","1998-03-12 00:00:00","Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).","EPSG","Used in USA primarily for public lands cadastral work.","",NULL};
+datafile_rows_t uom_length_row_12[] = {"9036","kilometre","","km","","9001","1000.0","1.0","1998-11-11 00:00:00","ISO 1000.","EPSG","","",NULL};
+datafile_rows_t uom_length_row_13[] = {"9037","Clarke's yard","","yd (Cla)","","9001","0.914391795","1.0","1999-10-20 00:00:00","Australian Land Information Group www.auslig.gov/au/geodesy/histry.htm","EPSG","=3 Clarke's feet. Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre. Used in older Australian, southern African & British West Indian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_14[] = {"9038","Clarke's chain","","ch (Cla)","","9001","20.11661949","1.0","1999-10-20 00:00:00","Australian Land Information Group www.auslig.gov/au/geodesy/histry.htm","EPSG","=22 Clarke's yards. Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre. Used in older Australian, southern African & British West Indian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_15[] = {"9039","Clarke's link","","lk (Cla)","","9001","0.2011661949","1.0","1999-10-20 00:00:00","Australian Land Information Group www.auslig.gov/au/geodesy/histry.htm","EPSG","=1/100 Clarke's chain. Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre. Used in older Australian, southern African & British West Indian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_16[] = {"9040","British yard (Sears 1922)","","yd (Sears)","","9001","36.0","39.370147","1999-10-20 00:00:00","G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. Used in East Malaysian and older New Zealand mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_17[] = {"9041","British foot (Sears 1922)","","ft (Sears)","","9001","12.0","39.370147","1999-10-20 00:00:00","G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. Used in East Malaysian and older New Zealand mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_18[] = {"9042","British chain (Sears 1922)","","ch (Sears)","","9001","792.0","39.370147","1999-10-20 00:00:00","\"Geodesy\"; G. Bomford.","EPSG","Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. Used in East Malaysian and older New Zealand mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_19[] = {"9043","British link (Sears 1922)","","lk (Sears)","","9001","7.92","39.370147","1999-10-20 00:00:00","G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. Used in East Malaysian and older New Zealand mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_20[] = {"9050","British yard (Benoit 1895 A)","","yd (Ben A)","","9001","0.9143992","1.0","1999-10-20 00:00:00","J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard. Used for deriving metric size of ellipsoid in Palestine.","97.233",NULL};
+datafile_rows_t uom_length_row_21[] = {"9051","British foot (Benoit 1895 A)","","ft (Ben A)","","9001","0.9143992","3.0","1999-10-20 00:00:00","J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard. Used for deriving metric size of ellipsoid in Palestine.","97.233",NULL};
+datafile_rows_t uom_length_row_22[] = {"9052","British chain (Benoit 1895 A)","","ch (Ben A)","","9001","20.1167824","1.0","1999-10-20 00:00:00","J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard. Used for deriving metric size of ellipsoid in Palestine.","97.233",NULL};
+datafile_rows_t uom_length_row_23[] = {"9053","British link (Benoit 1895 A)","","lk (Ben A)","","9001","0.201167824","1.0","1999-10-20 00:00:00","J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard. Used for deriving metric size of ellipsoid in Palestine.","97.233",NULL};
+datafile_rows_t uom_length_row_24[] = {"9060","British yard (Benoit 1895 B)","","yd (Ben B)","","9001","36.0","39.370113","1999-10-20 00:00:00","G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre. Used in West Malaysian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_25[] = {"9061","British foot (Benoit 1895 B)","","ft (Ben B)","","9001","12.0","39.370113","1999-10-20 00:00:00","G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre. Used in West Malaysian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_26[] = {"9062","British chain (Benoit 1895 B)","","ch (Ben B)","","9001","792.0","39.370113","1999-10-20 00:00:00","G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre. Used in West Malaysian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_27[] = {"9063","British link (Benoit 1895 B)","","lk (Ben B)","","9001","7.92","39.370113","1999-10-20 00:00:00","\"Geodesy\"; G. Bomford.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre. Used in West Malaysian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_28[] = {"9070","British foot (1865)","","ft (1865)","","9001","0.9144025","3.0","1999-10-20 00:00:00","J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Clark's estimate of 1853-1865 British foot-metre ratio of 0.9144025 metres per yard. Used in 1962 and 1975 estimates of Indian foot.","97.233",NULL};
+datafile_rows_t uom_length_row_29[] = {"9080","Indian foot","","Ind ft (Cla)","","9001","12.0","39.370142","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (= 3 British feet) taken to be J.S.Clark's 1865 value of 0.9144025 metres.","97.231",NULL};
+datafile_rows_t uom_length_row_30[] = {"9081","Indian foot (1937)","","Ind ft (37)","","9001","0.30479841","1.0","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British foot taken to be 1895 Benoit value of 12/39.370113m. Rounded to 8 decimal places as 0.30479841. Used from Bangladesh to Vietnam. Previously used in India and Pakistan but [...]
+datafile_rows_t uom_length_row_31[] = {"9082","Indian foot (1962)","","Ind ft (62)","","9001","0.3047996","1.0","1999-10-20 00:00:00","G. Bomford; \"Geodesy\"; 2nd edition 1962","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures with a small error as 1 Ind ft=0.3048996m. Used in Pakistan since metrication.","97.231",NULL};
+datafile_rows_t uom_length_row_32[] = {"9083","Indian foot (1975)","","Ind ft (75)","","9001","0.3047995","1.0","1999-10-20 00:00:00","G. Bomford; \"Geodesy\"; 3rd edition 1975","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures as 1 Ind ft=0.3048995m. Used in India since metrication.","97.231",NULL};
+datafile_rows_t uom_length_row_33[] = {"9084","Indian yard","","Ind yd (Cla)","","9001","36.0","39.370142","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (= 3 British feet) taken to be J.S.Clark's 1865 value of 0.9144025 metres.","97.231",NULL};
+datafile_rows_t uom_length_row_34[] = {"9085","Indian yard (1937)","","Ind yd (37)","","9001","0.91439523","1.0","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British foot taken to be 1895 Benoit value of 12/39.370113m. Rounded to 8 decimal places as 0.30479841. Used from Bangladesh to Vietnam. Previously used in India and Pakistan but [...]
+datafile_rows_t uom_length_row_35[] = {"9086","Indian yard (1962)","","Ind yd (62)","","9001","0.9143988","1.0","1999-10-20 00:00:00","G. Bomford; \"Geodesy\"; 2nd edition 1962","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures with a small error as 1 Ind ft=0.3048996m. Used in Pakistan since metrication.","97.231",NULL};
+datafile_rows_t uom_length_row_36[] = {"9087","Indian yard (1975)","","Ind yd (75)","","9001","0.9143985","1.0","1999-10-20 00:00:00","G. Bomford; \"Geodesy\"; 3rd edition 1975","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures as 1 Ind ft=0.3048995m. Used in India since metrication.","97.231",NULL};
+
+datafile_rows_t *uom_length_rows[] = {uom_length_row_1,uom_length_row_2,uom_length_row_3,uom_length_row_4,uom_length_row_5,uom_length_row_6,uom_length_row_7,uom_length_row_8,uom_length_row_9,uom_length_row_10,uom_length_row_11,uom_length_row_12,uom_length_row_13,uom_length_row_14,uom_length_row_15,uom_length_row_16,uom_length_row_17,uom_length_row_18,uom_length_row_19,uom_length_row_20,uom_length_row_21,uom_length_row_22,uom_length_row_23,uom_length_row_24,uom_length_row_25,uom_length_ro [...]
diff --git a/src/tiff/csv/uom_length.csv b/src/tiff/csv/uom_length.csv
new file mode 100644
index 0000000..c8c77dd
--- /dev/null
+++ b/src/tiff/csv/uom_length.csv
@@ -0,0 +1,36 @@
+"UOM_LENGTH_CODE","UNIT_OF_MEAS_EPSG_NAME","UNIT_OF_MEAS_USER_NAME","ABBREVIATION","DESCRIPTION","TARGET_UOM_LENGTH_CODE","FACTOR_B","FACTOR_C","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+9001,metre,,m,,9001,1.0,1.0,1995-06-02 00:00:00,ISO 1000.,EPSG,Also known as International metre.,
+9002,foot,,ft,,9001,0.3048,1.0,1995-06-02 00:00:00,ISO; 1958,EPSG,,
+9003,US survey foot,,ft US,,9001,12.0,39.37,1995-06-02 00:00:00,,EPSG,Used in USA.,
+9005,Clarke's foot,,ft (Cla),,9001,0.304797265,1.0,1999-10-20 00:00:00,Australian Land Information Group www.auslig.gov/au/geodesy/histry.htm,EPSG,"Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre. Used in older Australian, southern African & British West Indian mapping.",97.234
+9014,fathom,,f,,9001,1.8288,1.0,1999-10-20 00:00:00,,EPSG,= 6 feet.,
+9030,nautical mile,,NM,,9001,1852.0,1.0,1996-10-18 00:00:00,,EPSG,,96.24
+9031,German legal metre,,GLM,,9001,1.0000135965,1.0,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa,EPSG,Used in Namibia.,
+9033,US survey chain,,ch US,,9001,792.0,39.37,1998-03-12 00:00:00,Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).,EPSG,Used in USA primarily for public lands cadastral work.,
+9034,US survey link,,lk US,,9001,7.92,39.37,1998-03-12 00:00:00,Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).,EPSG,Used in USA primarily for public lands cadastral work.,
+9035,US survey mile,,mile US,,9001,63360.0,39.37,1998-03-12 00:00:00,Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).,EPSG,Used in USA primarily for public lands cadastral work.,
+9036,kilometre,,km,,9001,1000.0,1.0,1998-11-11 00:00:00,ISO 1000.,EPSG,,
+9037,Clarke's yard,,yd (Cla),,9001,0.914391795,1.0,1999-10-20 00:00:00,Australian Land Information Group www.auslig.gov/au/geodesy/histry.htm,EPSG,"=3 Clarke's feet. Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre. Used in older Australian, southern African & British West Indian mapping.",97.233
+9038,Clarke's chain,,ch (Cla),,9001,20.11661949,1.0,1999-10-20 00:00:00,Australian Land Information Group www.auslig.gov/au/geodesy/histry.htm,EPSG,"=22 Clarke's yards. Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre. Used in older Australian, southern African & British West Indian mapping.",97.233
+9039,Clarke's link,,lk (Cla),,9001,0.2011661949,1.0,1999-10-20 00:00:00,Australian Land Information Group www.auslig.gov/au/geodesy/histry.htm,EPSG,"=1/100 Clarke's chain. Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre. Used in older Australian, southern African & British West Indian mapping.",97.233
+9040,British yard (Sears 1922),,yd (Sears),,9001,36.0,39.370147,1999-10-20 00:00:00,"G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. Used in East Malaysian and older New Zealand mapping.,97.233
+9041,British foot (Sears 1922),,ft (Sears),,9001,12.0,39.370147,1999-10-20 00:00:00,"G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. Used in East Malaysian and older New Zealand mapping.,97.233
+9042,British chain (Sears 1922),,ch (Sears),,9001,792.0,39.370147,1999-10-20 00:00:00,"\"Geodesy\"; G. Bomford.",EPSG,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. Used in East Malaysian and older New Zealand mapping.,97.233
+9043,British link (Sears 1922),,lk (Sears),,9001,7.92,39.370147,1999-10-20 00:00:00,"G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre. Used in East Malaysian and older New Zealand mapping.,97.233
+9050,British yard (Benoit 1895 A),,yd (Ben A),,9001,0.9143992,1.0,1999-10-20 00:00:00,"J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard. Used for deriving metric size of ellipsoid in Palestine.,97.233
+9051,British foot (Benoit 1895 A),,ft (Ben A),,9001,0.9143992,3.0,1999-10-20 00:00:00,"J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard. Used for deriving metric size of ellipsoid in Palestine.,97.233
+9052,British chain (Benoit 1895 A),,ch (Ben A),,9001,20.1167824,1.0,1999-10-20 00:00:00,"J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard. Used for deriving metric size of ellipsoid in Palestine.,97.233
+9053,British link (Benoit 1895 A),,lk (Ben A),,9001,0.201167824,1.0,1999-10-20 00:00:00,"J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard. Used for deriving metric size of ellipsoid in Palestine.,97.233
+9060,British yard (Benoit 1895 B),,yd (Ben B),,9001,36.0,39.370113,1999-10-20 00:00:00,"G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre. Used in West Malaysian mapping.,97.233
+9061,British foot (Benoit 1895 B),,ft (Ben B),,9001,12.0,39.370113,1999-10-20 00:00:00,"G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre. Used in West Malaysian mapping.,97.233
+9062,British chain (Benoit 1895 B),,ch (Ben B),,9001,792.0,39.370113,1999-10-20 00:00:00,"G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre. Used in West Malaysian mapping.,97.233
+9063,British link (Benoit 1895 B),,lk (Ben B),,9001,7.92,39.370113,1999-10-20 00:00:00,"\"Geodesy\"; G. Bomford.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre. Used in West Malaysian mapping.,97.233
+9070,British foot (1865),,ft (1865),,9001,0.9144025,3.0,1999-10-20 00:00:00,"J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Clark's estimate of 1853-1865 British foot-metre ratio of 0.9144025 metres per yard. Used in 1962 and 1975 estimates of Indian foot.,97.233
+9080,Indian foot,,Ind ft (Cla),,9001,12.0,39.370142,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (= 3 British feet) taken to be J.S.Clark's 1865 value of 0.9144025 metres.,97.231
+9081,Indian foot (1937),,Ind ft (37),,9001,0.30479841,1.0,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British foot taken to be 1895 Benoit value of 12/39.370113m. Rounded to 8 decimal places as 0.30479841. Used from Bangladesh to Vietnam. Previously used in India and Pakistan but superseded.,97.231
+9082,Indian foot (1962),,Ind ft (62),,9001,0.3047996,1.0,1999-10-20 00:00:00,"G. Bomford; \"Geodesy\"; 2nd edition 1962",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures with a small error as 1 Ind ft=0.3048996m. Used in Pakistan since metrication.,97.231
+9083,Indian foot (1975),,Ind ft (75),,9001,0.3047995,1.0,1999-10-20 00:00:00,"G. Bomford; \"Geodesy\"; 3rd edition 1975",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures as 1 Ind ft=0.3048995m. Used in India since metrication.,97.231
+9084,Indian yard,,Ind yd (Cla),,9001,36.0,39.370142,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (= 3 British feet) taken to be J.S.Clark's 1865 value of 0.9144025 metres.,97.231
+9085,Indian yard (1937),,Ind yd (37),,9001,0.91439523,1.0,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British foot taken to be 1895 Benoit value of 12/39.370113m. Rounded to 8 decimal places as 0.30479841. Used from Bangladesh to Vietnam. Previously used in India and Pakistan but superseded.,97.231
+9086,Indian yard (1962),,Ind yd (62),,9001,0.9143988,1.0,1999-10-20 00:00:00,"G. Bomford; \"Geodesy\"; 2nd edition 1962",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures with a small error as 1 Ind ft=0.3048996m. Used in Pakistan since metrication.,97.231
+9087,Indian yard (1975),,Ind yd (75),,9001,0.9143985,1.0,1999-10-20 00:00:00,"G. Bomford; \"Geodesy\"; 3rd edition 1975",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865). British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures as 1 Ind ft=0.3048995m. Used in India since metrication.,97.231
diff --git a/src/tiff/csv/uom_sc_alias.c b/src/tiff/csv/uom_sc_alias.c
new file mode 100644
index 0000000..e978f3f
--- /dev/null
+++ b/src/tiff/csv/uom_sc_alias.c
@@ -0,0 +1,4 @@
+#include "defs.h"
+datafile_rows_t uom_sc_alias_row_1[] = {"UOM_S_ALIAS_CODE","UOM_S_ALIAS_NAME","UOM_SCALE_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+
+datafile_rows_t *uom_sc_alias_rows[] = {uom_sc_alias_row_1,NULL};
diff --git a/src/tiff/csv/uom_sc_alias.csv b/src/tiff/csv/uom_sc_alias.csv
new file mode 100644
index 0000000..e896d13
--- /dev/null
+++ b/src/tiff/csv/uom_sc_alias.csv
@@ -0,0 +1 @@
+"UOM_S_ALIAS_CODE","UOM_S_ALIAS_NAME","UOM_SCALE_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
diff --git a/src/tiff/csv/uom_scale.c b/src/tiff/csv/uom_scale.c
new file mode 100644
index 0000000..57883dc
--- /dev/null
+++ b/src/tiff/csv/uom_scale.c
@@ -0,0 +1,6 @@
+#include "defs.h"
+datafile_rows_t uom_scale_row_1[] = {"UOM_SCALE_CODE","UNIT_OF_MEAS_EPSG_NAME","UNIT_OF_MEAS_USER_NAME","ABBREVIATION","DESCRIPTION","TARGET_UOM_SCALE_CODE","FACTOR_B","FACTOR_C","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t uom_scale_row_2[] = {"9201","unity","","","","9201","1.0","1.0","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_scale_row_3[] = {"9202","parts per million","","ppm","","9201","1.0","1000000.0","1996-09-12 00:00:00","","EPSG","","",NULL};
+
+datafile_rows_t *uom_scale_rows[] = {uom_scale_row_1,uom_scale_row_2,uom_scale_row_3,NULL};
diff --git a/src/tiff/csv/uom_scale.csv b/src/tiff/csv/uom_scale.csv
new file mode 100644
index 0000000..e7bf8e1
--- /dev/null
+++ b/src/tiff/csv/uom_scale.csv
@@ -0,0 +1,3 @@
+"UOM_SCALE_CODE","UNIT_OF_MEAS_EPSG_NAME","UNIT_OF_MEAS_USER_NAME","ABBREVIATION","DESCRIPTION","TARGET_UOM_SCALE_CODE","FACTOR_B","FACTOR_C","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+9201,unity,,,,9201,1.0,1.0,1996-09-12 00:00:00,,EPSG,,
+9202,parts per million,,ppm,,9201,1.0,1000000.0,1996-09-12 00:00:00,,EPSG,,
diff --git a/src/tiff/csv/version_history.csv b/src/tiff/csv/version_history.csv
new file mode 100644
index 0000000..efc06cd
--- /dev/null
+++ b/src/tiff/csv/version_history.csv
@@ -0,0 +1,23 @@
+"VERSION_DATE","VERSION_NUMBER","VERSION_REMARKS","SUPERCEDED_BY","SUPERCEDES"
+1999-11-19 00:00:00,4.4,Version 4.4 release.,5.0,4.3
+1999-07-26 00:00:00,4.3,Version 4.3 release.,4.4,4.2
+1998-11-25 00:00:00,4.2,Version 4.2 release.,4.3,4.1
+1998-09-29 00:00:00,4.1,Version 4.1 release.,4.2,4.0
+1998-03-24 00:00:00,4.0,Version 4.0 release. Access v7.,4.1,3.2
+1997-08-28 00:00:00,3.2,Version 3.2 release.,4.0,3.1
+1997-04-11 00:00:00,3.1,Version 3.1 release.,3.2,3.0
+1996-12-12 00:00:00,3.0,Version 3.0 release. Access v2.,3.1,2.1
+1996-06-02 00:00:00,2.1,Version 2.1 release. Excel v4.,3.0,
+2000-06-29 00:00:00,4.5,Version 4.5 release.,5.1,4.4
+2000-06-29 00:00:00,5.0,Version 5.0 release. Access97,5.01,4.4
+2000-12-31 00:00:00,5.1,Version 5.1 release.,5.2,5.01
+2001-06-11 00:00:00,5.2,Version 5.2 release.,5.21,5.1
+2001-09-03 00:00:00,6.02,v6.02 release to EPSG wg and ISO 1927 project team.,6.1,
+1994-06-01 00:00:00,1.0,Version 1.0 release. Excel v2.,,
+2000-07-09 00:00:00,5.01,Version 5.01 release.,5.1,5.0
+2001-06-26 00:00:00,5.21,Version 5.21 release.,6.1,5.2
+2002-02-21 00:00:00,5.3,Version 5.3 release. Same data as v6.1.,6.1,5.21
+2002-02-25 00:00:00,6.1,Version 6.1 release. ISO 19111 compliant data model and terminology.,6.2,5.21 6.02
+2002-07-31 00:00:00,6.2,Version 6.2 release.,6.2.1,5.3 6.1
+2002-09-05 00:00:00,6.2.1,v6.2 data; purged redundant Visual Basic code behind forms.,6.2.2,6.2
+2002-09-16 00:00:00,6.2.2,v6.2 data; purged further redundant Visual Basic code behind forms.,,6.2.1
diff --git a/src/tiff/csv/vert_cs.c b/src/tiff/csv/vert_cs.c
new file mode 100644
index 0000000..b323089
--- /dev/null
+++ b/src/tiff/csv/vert_cs.c
@@ -0,0 +1,31 @@
+#include "defs.h"
+datafile_rows_t vert_cs_row_1[] = {"VERTCS_CODE","VERTCS_EPSG_NAME","VERTCS_EPSG_ABBR","VERTCS_USER_NAME","DESCRIPTION","AREA_OF_USE","VERTCS_TYPE","VERTICAL_DATUM_CODE","VERTCS_AXIS_NAME","VERTCS_AXIS_ABBREV","VERTCS_AXIS_UOM_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t vert_cs_row_2[] = {"5701","Newlyn","ODN","","","United Kingdom (UK) - Great Britain.","height system","5101","height","","9001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_3[] = {"5702","National Geodetic Vertical Datum of 1929","NGVD29","","","United States (USA).","height system","5102","height","","9003","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_4[] = {"5703","North American Vertical Datum of 1988","NAVD88","","","Canada; United States (USA).","height system","5103","height","","9001","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_5[] = {"5704","Yellow Sea","","","","China.","height system","5104","height","","9001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_6[] = {"5705","Baltic","","","","Armenia; Azerbaijan; Belorus; Estonia; Georgia; Kazakstan; Kirgizstan; Latvia; Lithuania; Moldavia; Russia; Tadzhikistan; Turkmenistan; Ukraine; Uzbekistan.","height system","5105","height","","9001","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_7[] = {"5706","Caspian","","","","Azerbaijan - offshore; Kazakhstan - offshore; Russia - Caspian Sea; Turkmenistan - offshore.","depth system","5106","depth","","9001","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_8[] = {"5709","Noormal Amsterdams Piel","NAP","","","Netherlands.","height system","5109","height","","9001","1996-09-12 00:00:00","Nederlandse Commissie voor Geodesie publication 30; 1993","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_9[] = {"5710","Oostende","","","","Belgium.","height system","5110","height","","9001","1996-09-12 00:00:00","Nederlandse Commissie voor Geodesie publication 30; 1993","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_10[] = {"5711","Australian Height Datum","AHD","","","Australia (New South Wales; Northern Territories; Queensland; South Australia; Western Australia; Victoria).","height system","5111","height","","9001","1996-09-12 00:00:00","http://www.auslig.gov.au/geodesy","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_11[] = {"5712","Australian Height Datum (Tasmania)","AHD (Tasmania)","","","Australia - Tasmania.","height system","5112","height","","9001","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_12[] = {"5713","Canadian Vertical Datum of 1928","CVD28","","","Canada.","height system","5114","height","","9001","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_13[] = {"5714","mean sea level height","msl height","","","","height system","5100","height","","9001","1996-04-12 00:00:00","","EPSG","Approximates geoid. Not specific to any location or epoch.","",NULL};
+datafile_rows_t vert_cs_row_14[] = {"5715","mean sea level depth","msl depth","","","","depth system","5100","depth","","9001","1996-10-18 00:00:00","","EPSG","Approximates geoid. Not specific to any location or epoch.","",NULL};
+datafile_rows_t vert_cs_row_15[] = {"5716","Piraeus","","","","Greece.","height system","5115","height","","9001","1997-06-16 00:00:00","Geodesy Department; Public Petroleum Corporation of Greece.","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_16[] = {"5717","N60","","","","Finland.","height system","5116","height","","9001","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","In use since 1968.","",NULL};
+datafile_rows_t vert_cs_row_17[] = {"5718","RH70","","","","Sweden","height system","5117","height","","9001","1997-11-13 00:00:00","National and Survey of Sweden","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_18[] = {"5719","NGF Lallemand","","","","France - mainland.","height system","5118","height","","9001","1997-11-13 00:00:00","Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994","EPSG","Generally but not entirely superceded by NGF IGN69 (code 5720).","",NULL};
+datafile_rows_t vert_cs_row_19[] = {"5720","NGF IGN69","","","","France - mainland.","height system","5119","height","","9001","1997-11-13 00:00:00","Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_20[] = {"5721","NGF IGN78","","","","France - Corsica.","height system","5120","height","","9001","1997-11-13 00:00:00","Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_21[] = {"5722","Maputo","","","","Mozambique.","height system","5121","height","","9001","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_22[] = {"5723","Japanese Standard Levelling Datum","Japan Levelling Datum","","","Japan","height system","5122","height","","9001","1999-04-22 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_23[] = {"5724","PDO Height Datum 1993","PHD93","","","Oman","height system","5123","height","","9001","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Supersedes Fahud vertical datum (code 5725) from 1993.","",NULL};
+datafile_rows_t vert_cs_row_24[] = {"5725","Fahud Height Datum 1993","","","","Oman","height system","5124","height","","9001","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Superseded by PHD93 (code 5724) from 1993.","",NULL};
+datafile_rows_t vert_cs_row_25[] = {"5726","Ha Tien 1960","","","","Cambodia; Vietnam","height system","5125","height","","9001","1999-10-20 00:00:00","","EPSG","In Vietnam superseded by Hon Dau from 1992.","",NULL};
+datafile_rows_t vert_cs_row_26[] = {"5727","Hon Dau 1992","","","","Vietnam","height system","5126","height","","9001","1999-10-20 00:00:00","","EPSG","In Vietnam supersedes Ha Tien from 1992.","",NULL};
+datafile_rows_t vert_cs_row_27[] = {"5728","Landesnivellement 1902","LN02","","","Liechtenstein; Switzerland.","height system","5127","height","","9001","1999-10-20 00:00:00","Bundesamt f�r Landestopographie","EPSG","To be superseded by LHN95 (code 5729).","",NULL};
+datafile_rows_t vert_cs_row_28[] = {"5729","Landeshohennetz 1995","LHN95","","","Liechtenstein; Switzerland.","height system","5128","height","","9001","1999-10-20 00:00:00","Bundesamt f�r Landestopographie","EPSG","To supersede LN02 (code 5728).","",NULL};
+
+datafile_rows_t *vert_cs_rows[] = {vert_cs_row_1,vert_cs_row_2,vert_cs_row_3,vert_cs_row_4,vert_cs_row_5,vert_cs_row_6,vert_cs_row_7,vert_cs_row_8,vert_cs_row_9,vert_cs_row_10,vert_cs_row_11,vert_cs_row_12,vert_cs_row_13,vert_cs_row_14,vert_cs_row_15,vert_cs_row_16,vert_cs_row_17,vert_cs_row_18,vert_cs_row_19,vert_cs_row_20,vert_cs_row_21,vert_cs_row_22,vert_cs_row_23,vert_cs_row_24,vert_cs_row_25,vert_cs_row_26,vert_cs_row_27,vert_cs_row_28,NULL};
diff --git a/src/tiff/csv/vert_cs.csv b/src/tiff/csv/vert_cs.csv
new file mode 100644
index 0000000..edc345f
--- /dev/null
+++ b/src/tiff/csv/vert_cs.csv
@@ -0,0 +1,28 @@
+"VERTCS_CODE","VERTCS_EPSG_NAME","VERTCS_EPSG_ABBR","VERTCS_USER_NAME","DESCRIPTION","AREA_OF_USE","VERTCS_TYPE","VERTICAL_DATUM_CODE","VERTCS_AXIS_NAME","VERTCS_AXIS_ABBREV","VERTCS_AXIS_UOM_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+5701,Newlyn,ODN,,,United Kingdom (UK) - Great Britain.,height system,5101,height,,9001,1995-06-02 00:00:00,,EPSG,,
+5702,National Geodetic Vertical Datum of 1929,NGVD29,,,United States (USA).,height system,5102,height,,9003,1996-10-18 00:00:00,,EPSG,,
+5703,North American Vertical Datum of 1988,NAVD88,,,Canada; United States (USA).,height system,5103,height,,9001,1996-10-18 00:00:00,,EPSG,,
+5704,Yellow Sea,,,,China.,height system,5104,height,,9001,1995-06-02 00:00:00,,EPSG,,
+5705,Baltic,,,,Armenia; Azerbaijan; Belorus; Estonia; Georgia; Kazakstan; Kirgizstan; Latvia; Lithuania; Moldavia; Russia; Tadzhikistan; Turkmenistan; Ukraine; Uzbekistan.,height system,5105,height,,9001,1996-09-12 00:00:00,,EPSG,,
+5706,Caspian,,,,Azerbaijan - offshore; Kazakhstan - offshore; Russia - Caspian Sea; Turkmenistan - offshore.,depth system,5106,depth,,9001,1996-09-12 00:00:00,,EPSG,,
+5709,Noormal Amsterdams Piel,NAP,,,Netherlands.,height system,5109,height,,9001,1996-09-12 00:00:00,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,,
+5710,Oostende,,,,Belgium.,height system,5110,height,,9001,1996-09-12 00:00:00,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,,
+5711,Australian Height Datum,AHD,,,Australia (New South Wales; Northern Territories; Queensland; South Australia; Western Australia; Victoria).,height system,5111,height,,9001,1996-09-12 00:00:00,http://www.auslig.gov.au/geodesy,EPSG,,
+5712,Australian Height Datum (Tasmania),AHD (Tasmania),,,Australia - Tasmania.,height system,5112,height,,9001,1996-09-12 00:00:00,,EPSG,,
+5713,Canadian Vertical Datum of 1928,CVD28,,,Canada.,height system,5114,height,,9001,1996-12-12 00:00:00,,EPSG,,
+5714,mean sea level height,msl height,,,,height system,5100,height,,9001,1996-04-12 00:00:00,,EPSG,Approximates geoid. Not specific to any location or epoch.,
+5715,mean sea level depth,msl depth,,,,depth system,5100,depth,,9001,1996-10-18 00:00:00,,EPSG,Approximates geoid. Not specific to any location or epoch.,
+5716,Piraeus,,,,Greece.,height system,5115,height,,9001,1997-06-16 00:00:00,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,,
+5717,N60,,,,Finland.,height system,5116,height,,9001,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,In use since 1968.,
+5718,RH70,,,,Sweden,height system,5117,height,,9001,1997-11-13 00:00:00,National and Survey of Sweden,EPSG,,
+5719,NGF Lallemand,,,,France - mainland.,height system,5118,height,,9001,1997-11-13 00:00:00,"Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994",EPSG,Generally but not entirely superceded by NGF IGN69 (code 5720).,
+5720,NGF IGN69,,,,France - mainland.,height system,5119,height,,9001,1997-11-13 00:00:00,"Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994",EPSG,,
+5721,NGF IGN78,,,,France - Corsica.,height system,5120,height,,9001,1997-11-13 00:00:00,"Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994",EPSG,,
+5722,Maputo,,,,Mozambique.,height system,5121,height,,9001,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+5723,Japanese Standard Levelling Datum,Japan Levelling Datum,,,Japan,height system,5122,height,,9001,1999-04-22 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,,
+5724,PDO Height Datum 1993,PHD93,,,Oman,height system,5123,height,,9001,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Supersedes Fahud vertical datum (code 5725) from 1993.,
+5725,Fahud Height Datum 1993,,,,Oman,height system,5124,height,,9001,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Superseded by PHD93 (code 5724) from 1993.,
+5726,Ha Tien 1960,,,,Cambodia; Vietnam,height system,5125,height,,9001,1999-10-20 00:00:00,,EPSG,In Vietnam superseded by Hon Dau from 1992.,
+5727,Hon Dau 1992,,,,Vietnam,height system,5126,height,,9001,1999-10-20 00:00:00,,EPSG,In Vietnam supersedes Ha Tien from 1992.,
+5728,Landesnivellement 1902,LN02,,,Liechtenstein; Switzerland.,height system,5127,height,,9001,1999-10-20 00:00:00,Bundesamt f�r Landestopographie,EPSG,To be superseded by LHN95 (code 5729).,
+5729,Landeshohennetz 1995,LHN95,,,Liechtenstein; Switzerland.,height system,5128,height,,9001,1999-10-20 00:00:00,Bundesamt f�r Landestopographie,EPSG,To supersede LN02 (code 5728).,
diff --git a/src/tiff/csv/vert_datum.c b/src/tiff/csv/vert_datum.c
new file mode 100644
index 0000000..29f3761
--- /dev/null
+++ b/src/tiff/csv/vert_datum.c
@@ -0,0 +1,32 @@
+#include "defs.h"
+datafile_rows_t vert_datum_row_1[] = {"VERTICAL_DATUM_CODE","VERT_DAT_EPSG_NAME","VERT_DAT_EPSG_ABBREV","VERT_DAT_USER_NAME","DESCRIPTION","VERT_DAT_TYPE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t vert_datum_row_2[] = {"5100","Mean Sea Level","msl","","","geoidal","1996-04-12 00:00:00","","EPSG","msl has geographic and temporal components. Users are advised to not use this generic vertical datum but to define specific instances of msl based on knowledge of these components; for instance \"msl at xxx during 19yy\".","",NULL};
+datafile_rows_t vert_datum_row_3[] = {"5101","Ordnance Datum Newlyn","ODN","","","geoidal","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_4[] = {"5102","National Geodetic Vertical Datum 1929","NGVD29","","","geoidal","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_5[] = {"5103","North American Vertical Datum 1988","NAVD88","","","geoidal","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_6[] = {"5104","Yellow Sea 1956","Yellow Sea","","","geoidal","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_7[] = {"5105","Baltic Sea","Baltic","","","geoidal","1996-09-12 00:00:00","","EPSG","Average water level at Kronshtadt","",NULL};
+datafile_rows_t vert_datum_row_8[] = {"5106","Caspian Sea","Caspian","","","geoidal","1996-09-12 00:00:00","","EPSG","Defined as -28.0m Baltic datum","",NULL};
+datafile_rows_t vert_datum_row_9[] = {"5107","Nivellement general de la France","NGF","","","geoidal","1996-04-12 00:00:00","","EPSG","Mean sea level at Marseille","",NULL};
+datafile_rows_t vert_datum_row_10[] = {"5109","Normaal Amsterdams Peil","NAP","","","geoidal","1996-09-12 00:00:00","Nederlandse Commissie voor Geodesie publication 30; 1993","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_11[] = {"5110","Oostende","","","","geoidal","1996-09-12 00:00:00","Nederlandse Commissie voor Geodesie publication 30; 1993","EPSG","Mean low water during 1958","",NULL};
+datafile_rows_t vert_datum_row_12[] = {"5111","Australian Height Datum","AHD","","","geoidal","1996-09-12 00:00:00","http://www.auslig.gov.au/geodesy","EPSG","MSL 1966-68 at 30 gauges around coast.","",NULL};
+datafile_rows_t vert_datum_row_13[] = {"5112","Australian Height Datum (Tasmania)","AHD (Tasmania)","","","geoidal","1996-09-12 00:00:00","","EPSG","MSL 1972 at Hobart and Burnie.","",NULL};
+datafile_rows_t vert_datum_row_14[] = {"5113","Sea Level","","","","geoidal","1996-09-12 00:00:00","","EPSG","An unspecified local vertical datum not recommended for use.","",NULL};
+datafile_rows_t vert_datum_row_15[] = {"5114","Canadian Vertical Datum of 1928","CVD28","","","geoidal","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_16[] = {"5115","Piraeus Harbour 1986","Piraeus86","","","geoidal","1997-06-16 00:00:00","Geodesy Department; Public Pertoleum Corporation of Greece","EPSG","MSL determined during 1986.","",NULL};
+datafile_rows_t vert_datum_row_17[] = {"5116","Helsinki 1960","N60","","","geoidal","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","MSL at Helsinki during 1960.","",NULL};
+datafile_rows_t vert_datum_row_18[] = {"5117","Rikets hoghtsystem 1970","RH70","","","geoidal","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_19[] = {"5118","Nivellement general de la France - Lalle","NGF - Lallemand","","","geoidal","1997-11-13 00:00:00","Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994","EPSG","Mean sea level at Marseille.","",NULL};
+datafile_rows_t vert_datum_row_20[] = {"5119","Nivellement general de la France - IGN69","NGF - IGN69","","","geoidal","1997-11-13 00:00:00","Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994","EPSG","Mean sea level at Marseille.","",NULL};
+datafile_rows_t vert_datum_row_21[] = {"5120","Nivellement general de la France - IGN78","NGF - IGN78","","","geoidal","1997-11-13 00:00:00","Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_22[] = {"5121","Maputo","","","","geoidal","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Mean sea level at Maputo.","",NULL};
+datafile_rows_t vert_datum_row_23[] = {"5122","Japanese Standard Levelling Datum 1949","JapanVD","","","geoidal","1999-04-22 00:00:00","Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/tokyodatum.html","EPSG","24.4140 metres above mean sea level Tokyo Bay.","",NULL};
+datafile_rows_t vert_datum_row_24[] = {"5123","PDO Height Datum 1993","PHD93","","","geoidal","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Misclosure between Muscat and Salalah less than .5 meters with differences from of up to 5 meters from old Fahud Datum. The PHD93 adjustment was initially known as the Spine. Supercedes Fahud Vertical Datum (Code 5124) from 1993.","",NULL};
+datafile_rows_t vert_datum_row_25[] = {"5124","Fahud Height Datum","","","","geoidal","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Superceded by PHD93 Datum (Code 5123) in 1993. Based on reciprocal trigonometric heighting based on single MSL determination at Mina Al Fahal.","",NULL};
+datafile_rows_t vert_datum_row_26[] = {"5125","Ha Tien 1960","","","","geoidal","1999-10-20 00:00:00","","EPSG","In Vietnam replaced by Hon Dau in 1992.","",NULL};
+datafile_rows_t vert_datum_row_27[] = {"5126","Hon Dau 1992","","","","geoidal","1999-10-20 00:00:00","","EPSG","Supersedes Ha Tien in Vietnam.","",NULL};
+datafile_rows_t vert_datum_row_28[] = {"5127","Landesnivellement 1902","LN02","","","geoidal","1999-10-20 00:00:00","Bundesamt f�r Landestopographie","EPSG","Origin at Repere Pierre du Niton (RPN) 373.6 metres above msl derived at Marseille.","",NULL};
+datafile_rows_t vert_datum_row_29[] = {"5128","Landeshohennetz 1995","LHN95","","","geoidal","1999-10-20 00:00:00","Bundesamt f�r Landestopographie","EPSG","Origin at Repere Pierre du Niton (RPN) 373.6 metres above msl derived at Marseille.","",NULL};
+
+datafile_rows_t *vert_datum_rows[] = {vert_datum_row_1,vert_datum_row_2,vert_datum_row_3,vert_datum_row_4,vert_datum_row_5,vert_datum_row_6,vert_datum_row_7,vert_datum_row_8,vert_datum_row_9,vert_datum_row_10,vert_datum_row_11,vert_datum_row_12,vert_datum_row_13,vert_datum_row_14,vert_datum_row_15,vert_datum_row_16,vert_datum_row_17,vert_datum_row_18,vert_datum_row_19,vert_datum_row_20,vert_datum_row_21,vert_datum_row_22,vert_datum_row_23,vert_datum_row_24,vert_datum_row_25,vert_datum_ro [...]
diff --git a/src/tiff/csv/vert_datum.csv b/src/tiff/csv/vert_datum.csv
new file mode 100644
index 0000000..5cec1f9
--- /dev/null
+++ b/src/tiff/csv/vert_datum.csv
@@ -0,0 +1,29 @@
+"VERTICAL_DATUM_CODE","VERT_DAT_EPSG_NAME","VERT_DAT_EPSG_ABBREV","VERT_DAT_USER_NAME","DESCRIPTION","VERT_DAT_TYPE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+5100,Mean Sea Level,msl,,,geoidal,1996-04-12 00:00:00,,EPSG,"msl has geographic and temporal components. Users are advised to not use this generic vertical datum but to define specific instances of msl based on knowledge of these components; for instance \"msl at xxx during 19yy\".",
+5101,Ordnance Datum Newlyn,ODN,,,geoidal,1996-10-18 00:00:00,,EPSG,,
+5102,National Geodetic Vertical Datum 1929,NGVD29,,,geoidal,1996-09-12 00:00:00,,EPSG,,
+5103,North American Vertical Datum 1988,NAVD88,,,geoidal,1996-09-12 00:00:00,,EPSG,,
+5104,Yellow Sea 1956,Yellow Sea,,,geoidal,1995-06-02 00:00:00,,EPSG,,
+5105,Baltic Sea,Baltic,,,geoidal,1996-09-12 00:00:00,,EPSG,Average water level at Kronshtadt,
+5106,Caspian Sea,Caspian,,,geoidal,1996-09-12 00:00:00,,EPSG,Defined as -28.0m Baltic datum,
+5107,Nivellement general de la France,NGF,,,geoidal,1996-04-12 00:00:00,,EPSG,Mean sea level at Marseille,
+5109,Normaal Amsterdams Peil,NAP,,,geoidal,1996-09-12 00:00:00,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,,
+5110,Oostende,,,,geoidal,1996-09-12 00:00:00,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,Mean low water during 1958,
+5111,Australian Height Datum,AHD,,,geoidal,1996-09-12 00:00:00,http://www.auslig.gov.au/geodesy,EPSG,MSL 1966-68 at 30 gauges around coast.,
+5112,Australian Height Datum (Tasmania),AHD (Tasmania),,,geoidal,1996-09-12 00:00:00,,EPSG,MSL 1972 at Hobart and Burnie.,
+5113,Sea Level,,,,geoidal,1996-09-12 00:00:00,,EPSG,An unspecified local vertical datum not recommended for use.,
+5114,Canadian Vertical Datum of 1928,CVD28,,,geoidal,1996-12-12 00:00:00,,EPSG,,
+5115,Piraeus Harbour 1986,Piraeus86,,,geoidal,1997-06-16 00:00:00,Geodesy Department; Public Pertoleum Corporation of Greece,EPSG,MSL determined during 1986.,
+5116,Helsinki 1960,N60,,,geoidal,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,MSL at Helsinki during 1960.,
+5117,Rikets hoghtsystem 1970,RH70,,,geoidal,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,,
+5118,Nivellement general de la France - Lalle,NGF - Lallemand,,,geoidal,1997-11-13 00:00:00,"Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994",EPSG,Mean sea level at Marseille.,
+5119,Nivellement general de la France - IGN69,NGF - IGN69,,,geoidal,1997-11-13 00:00:00,"Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994",EPSG,Mean sea level at Marseille.,
+5120,Nivellement general de la France - IGN78,NGF - IGN78,,,geoidal,1997-11-13 00:00:00,"Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994",EPSG,,
+5121,Maputo,,,,geoidal,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Mean sea level at Maputo.,
+5122,Japanese Standard Levelling Datum 1949,JapanVD,,,geoidal,1999-04-22 00:00:00,Ministry of Construction; Japan. http://vldb.gsi-mc.go.jp/sokuchi/datum/tokyodatum.html,EPSG,24.4140 metres above mean sea level Tokyo Bay.,
+5123,PDO Height Datum 1993,PHD93,,,geoidal,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Misclosure between Muscat and Salalah less than .5 meters with differences from of up to 5 meters from old Fahud Datum. The PHD93 adjustment was initially known as the Spine. Supercedes Fahud Vertical Datum (Code 5124) from 1993.,
+5124,Fahud Height Datum,,,,geoidal,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Superceded by PHD93 Datum (Code 5123) in 1993. Based on reciprocal trigonometric heighting based on single MSL determination at Mina Al Fahal.,
+5125,Ha Tien 1960,,,,geoidal,1999-10-20 00:00:00,,EPSG,In Vietnam replaced by Hon Dau in 1992.,
+5126,Hon Dau 1992,,,,geoidal,1999-10-20 00:00:00,,EPSG,Supersedes Ha Tien in Vietnam.,
+5127,Landesnivellement 1902,LN02,,,geoidal,1999-10-20 00:00:00,Bundesamt f�r Landestopographie,EPSG,Origin at Repere Pierre du Niton (RPN) 373.6 metres above msl derived at Marseille.,
+5128,Landeshohennetz 1995,LHN95,,,geoidal,1999-10-20 00:00:00,Bundesamt f�r Landestopographie,EPSG,Origin at Repere Pierre du Niton (RPN) 373.6 metres above msl derived at Marseille.,
diff --git a/src/tiff/csv/vert_offset.c b/src/tiff/csv/vert_offset.c
new file mode 100644
index 0000000..57f097f
--- /dev/null
+++ b/src/tiff/csv/vert_offset.c
@@ -0,0 +1,5 @@
+#include "defs.h"
+datafile_rows_t vert_offset_row_1[] = {"OFFSET_CODE","INITIAL_VERTCS_CODE","TERMINAL_VERTCS_CODE","COORD_TRF_METHOD_CODE","OFFSET_VALUE","OFFSET_UOM_CODE","AREA_OF_USE","DESCRIPTION","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t vert_offset_row_2[] = {"5400","5705","5706","9616","28.0","9001","Azerbaijan; Kazakstan; Russia; Turkmenistan - Caspian Sea","","1999-11-12 00:00:00","","EPSG","","97.61 99.79",NULL};
+
+datafile_rows_t *vert_offset_rows[] = {vert_offset_row_1,vert_offset_row_2,NULL};
diff --git a/src/tiff/csv/vert_offset.csv b/src/tiff/csv/vert_offset.csv
new file mode 100644
index 0000000..a6a11e6
--- /dev/null
+++ b/src/tiff/csv/vert_offset.csv
@@ -0,0 +1,2 @@
+"OFFSET_CODE","INITIAL_VERTCS_CODE","TERMINAL_VERTCS_CODE","COORD_TRF_METHOD_CODE","OFFSET_VALUE","OFFSET_UOM_CODE","AREA_OF_USE","DESCRIPTION","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+5400,5705,5706,9616,28.0,9001,Azerbaijan; Kazakstan; Russia; Turkmenistan - Caspian Sea,,1999-11-12 00:00:00,,EPSG,,97.61 99.79
diff --git a/src/tiff/epsg_datum.inc b/src/tiff/epsg_datum.inc
new file mode 100644
index 0000000..198e78f
--- /dev/null
+++ b/src/tiff/epsg_datum.inc
@@ -0,0 +1,174 @@
+/*
+ * EPSG/POSC Datum database -- GeoTIFF Rev. 0.2
+ */
+
+/* C database for Geotiff include files. */
+/* the macro ValuePair() must be defined */
+/* by the enclosing include file */
+
+#ifdef INCLUDE_OLD_CODES
+#include old_datum.inc
+#endif /* OLD Codes */
+
+/* New datums */
+ValuePair(Datum_Dealul_Piscului_1970,6317)
+
+/* Datums for which only the ellipsoid is known */
+ValuePair(DatumE_Airy1830, 6001)
+ValuePair(DatumE_AiryModified1849, 6002)
+ValuePair(DatumE_AustralianNationalSpheroid, 6003)
+ValuePair(DatumE_Bessel1841, 6004)
+ValuePair(DatumE_BesselModified, 6005)
+ValuePair(DatumE_BesselNamibia, 6006)
+ValuePair(DatumE_Clarke1858, 6007)
+ValuePair(DatumE_Clarke1866, 6008)
+ValuePair(DatumE_Clarke1866Michigan, 6009)
+ValuePair(DatumE_Clarke1880_Benoit, 6010)
+ValuePair(DatumE_Clarke1880_IGN, 6011)
+ValuePair(DatumE_Clarke1880_RGS, 6012)
+ValuePair(DatumE_Clarke1880_Arc, 6013)
+ValuePair(DatumE_Clarke1880_SGA1922, 6014)
+ValuePair(DatumE_Everest1830_1937Adjustment, 6015)
+ValuePair(DatumE_Everest1830_1967Definition, 6016)
+ValuePair(DatumE_Everest1830_1975Definition, 6017)
+ValuePair(DatumE_Everest1830Modified, 6018)
+ValuePair(DatumE_GRS1980, 6019)
+ValuePair(DatumE_Helmert1906, 6020)
+ValuePair(DatumE_IndonesianNationalSpheroid, 6021)
+ValuePair(DatumE_International1924, 6022)
+ValuePair(DatumE_International1967, 6023)
+ValuePair(DatumE_Krassowsky1960, 6024)
+ValuePair(DatumE_NWL9D, 6025)
+ValuePair(DatumE_NWL10D, 6026)
+ValuePair(DatumE_Plessis1817, 6027)
+ValuePair(DatumE_Struve1860, 6028)
+ValuePair(DatumE_WarOffice, 6029)
+ValuePair(DatumE_WGS84, 6030)
+ValuePair(DatumE_GEM10C, 6031)
+ValuePair(DatumE_OSU86F, 6032)
+ValuePair(DatumE_OSU91A, 6033)
+ValuePair(DatumE_Clarke1880, 6034)
+ValuePair(DatumE_Sphere, 6035)
+
+/* standard datums */
+ValuePair(Datum_Adindan, 6201)
+ValuePair(Datum_Australian_Geodetic_Datum_1966, 6202)
+ValuePair(Datum_Australian_Geodetic_Datum_1984, 6203)
+ValuePair(Datum_Ain_el_Abd_1970, 6204)
+ValuePair(Datum_Afgooye, 6205)
+ValuePair(Datum_Agadez, 6206)
+ValuePair(Datum_Lisbon, 6207)
+ValuePair(Datum_Aratu, 6208)
+ValuePair(Datum_Arc_1950, 6209)
+ValuePair(Datum_Arc_1960, 6210)
+ValuePair(Datum_Batavia, 6211)
+ValuePair(Datum_Barbados, 6212)
+ValuePair(Datum_Beduaram, 6213)
+ValuePair(Datum_Beijing_1954, 6214)
+ValuePair(Datum_Reseau_National_Belge_1950, 6215)
+ValuePair(Datum_Bermuda_1957, 6216)
+ValuePair(Datum_Bern_1898, 6217)
+ValuePair(Datum_Bogota, 6218)
+ValuePair(Datum_Bukit_Rimpah, 6219)
+ValuePair(Datum_Camacupa, 6220)
+ValuePair(Datum_Campo_Inchauspe, 6221)
+ValuePair(Datum_Cape, 6222)
+ValuePair(Datum_Carthage, 6223)
+ValuePair(Datum_Chua, 6224)
+ValuePair(Datum_Corrego_Alegre, 6225)
+ValuePair(Datum_Cote_d_Ivoire, 6226)
+ValuePair(Datum_Deir_ez_Zor, 6227)
+ValuePair(Datum_Douala, 6228)
+ValuePair(Datum_Egypt_1907, 6229)
+ValuePair(Datum_European_Datum_1950, 6230)
+ValuePair(Datum_European_Datum_1987, 6231)
+ValuePair(Datum_Fahud, 6232)
+ValuePair(Datum_Gandajika_1970, 6233)
+ValuePair(Datum_Garoua, 6234)
+ValuePair(Datum_Guyane_Francaise, 6235)
+ValuePair(Datum_Hu_Tzu_Shan, 6236)
+ValuePair(Datum_Hungarian_Datum_1972, 6237)
+ValuePair(Datum_Indonesian_Datum_1974, 6238)
+ValuePair(Datum_Indian_1954, 6239)
+ValuePair(Datum_Indian_1975, 6240)
+ValuePair(Datum_Jamaica_1875, 6241)
+ValuePair(Datum_Jamaica_1969, 6242)
+ValuePair(Datum_Kalianpur, 6243)
+ValuePair(Datum_Kandawala, 6244)
+ValuePair(Datum_Kertau, 6245)
+ValuePair(Datum_Kuwait_Oil_Company, 6246)
+ValuePair(Datum_La_Canoa, 6247)
+ValuePair(Datum_Provisional_S_American_Datum_1956, 6248)
+ValuePair(Datum_Lake, 6249)
+ValuePair(Datum_Leigon, 6250)
+ValuePair(Datum_Liberia_1964, 6251)
+ValuePair(Datum_Lome, 6252)
+ValuePair(Datum_Luzon_1911, 6253)
+ValuePair(Datum_Hito_XVIII_1963, 6254)
+ValuePair(Datum_Herat_North, 6255)
+ValuePair(Datum_Mahe_1971, 6256)
+ValuePair(Datum_Makassar, 6257)
+ValuePair(Datum_European_Reference_System_1989, 6258)
+ValuePair(Datum_Malongo_1987, 6259)
+ValuePair(Datum_Manoca, 6260)
+ValuePair(Datum_Merchich, 6261)
+ValuePair(Datum_Massawa, 6262)
+ValuePair(Datum_Minna, 6263)
+ValuePair(Datum_Mhast, 6264)
+ValuePair(Datum_Monte_Mario, 6265)
+ValuePair(Datum_M_poraloko, 6266)
+ValuePair(Datum_North_American_Datum_1927, 6267)
+ValuePair(Datum_NAD_Michigan, 6268)
+ValuePair(Datum_North_American_Datum_1983, 6269)
+ValuePair(Datum_Nahrwan_1967, 6270)
+ValuePair(Datum_Naparima_1972, 6271)
+ValuePair(Datum_New_Zealand_Geodetic_Datum_1949, 6272)
+ValuePair(Datum_NGO_1948, 6273)
+ValuePair(Datum_Datum_73, 6274)
+ValuePair(Datum_Nouvelle_Triangulation_Francaise, 6275)
+ValuePair(Datum_NSWC_9Z_2, 6276)
+ValuePair(Datum_OSGB_1936, 6277)
+ValuePair(Datum_OSGB_1970_SN, 6278)
+ValuePair(Datum_OS_SN_1980, 6279)
+ValuePair(Datum_Padang_1884, 6280)
+ValuePair(Datum_Palestine_1923, 6281)
+ValuePair(Datum_Pointe_Noire, 6282)
+ValuePair(Datum_Geocentric_Datum_of_Australia_1994, 6283)
+ValuePair(Datum_Pulkovo_1942, 6284)
+ValuePair(Datum_Qatar, 6285)
+ValuePair(Datum_Qatar_1948, 6286)
+ValuePair(Datum_Qornoq, 6287)
+ValuePair(Datum_Loma_Quintana, 6288)
+ValuePair(Datum_Amersfoort, 6289)
+ValuePair(Datum_RT38, 6290)
+ValuePair(Datum_South_American_Datum_1969, 6291)
+ValuePair(Datum_Sapper_Hill_1943, 6292)
+ValuePair(Datum_Schwarzeck, 6293)
+ValuePair(Datum_Segora, 6294)
+ValuePair(Datum_Serindung, 6295)
+ValuePair(Datum_Sudan, 6296)
+ValuePair(Datum_Tananarive_1925, 6297)
+ValuePair(Datum_Timbalai_1948, 6298)
+ValuePair(Datum_TM65, 6299)
+ValuePair(Datum_TM75, 6300)
+ValuePair(Datum_Tokyo, 6301)
+ValuePair(Datum_Trinidad_1903, 6302)
+ValuePair(Datum_Trucial_Coast_1948, 6303)
+ValuePair(Datum_Voirol_1875, 6304)
+ValuePair(Datum_Voirol_Unifie_1960, 6305)
+ValuePair(Datum_Bern_1938, 6306)
+ValuePair(Datum_Nord_Sahara_1959, 6307)
+ValuePair(Datum_Stockholm_1938, 6308)
+ValuePair(Datum_Yacare, 6309)
+ValuePair(Datum_Yoff, 6310)
+ValuePair(Datum_Zanderij, 6311)
+ValuePair(Datum_Militar_Geographische_Institut, 6312)
+ValuePair(Datum_Reseau_National_Belge_1972, 6313)
+ValuePair(Datum_Deutsche_Hauptdreiecksnetz, 6314)
+ValuePair(Datum_Conakry_1905, 6315)
+ValuePair(Datum_WGS72, 6322)
+ValuePair(Datum_WGS72_Transit_Broadcast_Ephemeris, 6324)
+ValuePair(Datum_WGS84, 6326)
+ValuePair(Datum_Ancienne_Triangulation_Francaise, 6901)
+ValuePair(Datum_Nord_de_Guerre, 6902)
+/* end of list */
diff --git a/src/tiff/epsg_ellipse.inc b/src/tiff/epsg_ellipse.inc
new file mode 100644
index 0000000..95c1432
--- /dev/null
+++ b/src/tiff/epsg_ellipse.inc
@@ -0,0 +1,48 @@
+/*
+ * GeoTIFF Rev. 0.2 Ellipsoids
+ */
+
+/* C database for Geotiff include files. */
+/* the macro ValuePair() must be defined */
+/* by the enclosing include file */
+
+#ifdef INCLUDE_OLD_CODES
+#include old_ellipse.inc
+#endif /* OLD Codes */
+
+ValuePair(Ellipse_Airy_1830, 7001)
+ValuePair(Ellipse_Airy_Modified_1849, 7002)
+ValuePair(Ellipse_Australian_National_Spheroid, 7003)
+ValuePair(Ellipse_Bessel_1841, 7004)
+ValuePair(Ellipse_Bessel_Modified, 7005)
+ValuePair(Ellipse_Bessel_Namibia, 7006)
+ValuePair(Ellipse_Clarke_1858, 7007)
+ValuePair(Ellipse_Clarke_1866, 7008)
+ValuePair(Ellipse_Clarke_1866_Michigan, 7009)
+ValuePair(Ellipse_Clarke_1880_Benoit, 7010)
+ValuePair(Ellipse_Clarke_1880_IGN, 7011)
+ValuePair(Ellipse_Clarke_1880_RGS, 7012)
+ValuePair(Ellipse_Clarke_1880_Arc, 7013)
+ValuePair(Ellipse_Clarke_1880_SGA_1922, 7014)
+ValuePair(Ellipse_Everest_1830_1937_Adjustment, 7015)
+ValuePair(Ellipse_Everest_1830_1967_Definition, 7016)
+ValuePair(Ellipse_Everest_1830_1975_Definition, 7017)
+ValuePair(Ellipse_Everest_1830_Modified, 7018)
+ValuePair(Ellipse_GRS_1980, 7019)
+ValuePair(Ellipse_Helmert_1906, 7020)
+ValuePair(Ellipse_Indonesian_National_Spheroid, 7021)
+ValuePair(Ellipse_International_1924, 7022)
+ValuePair(Ellipse_International_1967, 7023)
+ValuePair(Ellipse_Krassowsky_1940, 7024)
+ValuePair(Ellipse_NWL_9D, 7025)
+ValuePair(Ellipse_NWL_10D, 7026)
+ValuePair(Ellipse_Plessis_1817, 7027)
+ValuePair(Ellipse_Struve_1860, 7028)
+ValuePair(Ellipse_War_Office, 7029)
+ValuePair(Ellipse_WGS_84, 7030)
+ValuePair(Ellipse_GEM_10C, 7031)
+ValuePair(Ellipse_OSU86F, 7032)
+ValuePair(Ellipse_OSU91A, 7033)
+ValuePair(Ellipse_Clarke_1880, 7034)
+ValuePair(Ellipse_Sphere, 7035)
+/* end of list */
diff --git a/src/tiff/epsg_gcs.inc b/src/tiff/epsg_gcs.inc
new file mode 100644
index 0000000..4917964
--- /dev/null
+++ b/src/tiff/epsg_gcs.inc
@@ -0,0 +1,193 @@
+/*
+ * EPSG/POSC GCS Codes -- GeoTIFF Rev. 0.2
+ */
+
+/* C database for Geotiff include files. */
+/* the macro ValuePair() must be defined */
+/* by the enclosing include file */
+
+#ifdef INCLUDE_OLD_CODES
+#include old_gcs.inc
+#endif /* OLD Codes */
+
+/* Unspecified GCS based on ellipsoid */
+ValuePair(GCSE_Airy1830, 4001)
+ValuePair(GCSE_AiryModified1849, 4002)
+ValuePair(GCSE_AustralianNationalSpheroid, 4003)
+ValuePair(GCSE_Bessel1841, 4004)
+ValuePair(GCSE_BesselModified, 4005)
+ValuePair(GCSE_BesselNamibia, 4006)
+ValuePair(GCSE_Clarke1858, 4007)
+ValuePair(GCSE_Clarke1866, 4008)
+ValuePair(GCSE_Clarke1866Michigan, 4009)
+ValuePair(GCSE_Clarke1880_Benoit, 4010)
+ValuePair(GCSE_Clarke1880_IGN, 4011)
+ValuePair(GCSE_Clarke1880_RGS, 4012)
+ValuePair(GCSE_Clarke1880_Arc, 4013)
+ValuePair(GCSE_Clarke1880_SGA1922, 4014)
+ValuePair(GCSE_Everest1830_1937Adjustment, 4015)
+ValuePair(GCSE_Everest1830_1967Definition, 4016)
+ValuePair(GCSE_Everest1830_1975Definition, 4017)
+ValuePair(GCSE_Everest1830Modified, 4018)
+ValuePair(GCSE_GRS1980, 4019)
+ValuePair(GCSE_Helmert1906, 4020)
+ValuePair(GCSE_IndonesianNationalSpheroid, 4021)
+ValuePair(GCSE_International1924, 4022)
+ValuePair(GCSE_International1967, 4023)
+ValuePair(GCSE_Krassowsky1940, 4024)
+ValuePair(GCSE_NWL9D, 4025)
+ValuePair(GCSE_NWL10D, 4026)
+ValuePair(GCSE_Plessis1817, 4027)
+ValuePair(GCSE_Struve1860, 4028)
+ValuePair(GCSE_WarOffice, 4029)
+ValuePair(GCSE_WGS84, 4030)
+ValuePair(GCSE_GEM10C, 4031)
+ValuePair(GCSE_OSU86F, 4032)
+ValuePair(GCSE_OSU91A, 4033)
+ValuePair(GCSE_Clarke1880, 4034)
+ValuePair(GCSE_Sphere, 4035)
+
+/* New GCS */
+ValuePair(GCS_Greek,4120)
+ValuePair(GCS_GGRS87,4121)
+ValuePair(GCS_KKJ,4123)
+ValuePair(GCS_RT90,4124)
+ValuePair(GCS_EST92,4133)
+ValuePair(GCS_Dealul_Piscului_1970,4317)
+ValuePair(GCS_Greek_Athens,4815)
+
+/* Standard GCS */
+ValuePair(GCS_Adindan, 4201)
+ValuePair(GCS_AGD66, 4202)
+ValuePair(GCS_AGD84, 4203)
+ValuePair(GCS_Ain_el_Abd, 4204)
+ValuePair(GCS_Afgooye, 4205)
+ValuePair(GCS_Agadez, 4206)
+ValuePair(GCS_Lisbon, 4207)
+ValuePair(GCS_Aratu, 4208)
+ValuePair(GCS_Arc_1950, 4209)
+ValuePair(GCS_Arc_1960, 4210)
+ValuePair(GCS_Batavia, 4211)
+ValuePair(GCS_Barbados, 4212)
+ValuePair(GCS_Beduaram, 4213)
+ValuePair(GCS_Beijing_1954, 4214)
+ValuePair(GCS_Belge_1950, 4215)
+ValuePair(GCS_Bermuda_1957, 4216)
+ValuePair(GCS_Bern_1898, 4217)
+ValuePair(GCS_Bogota, 4218)
+ValuePair(GCS_Bukit_Rimpah, 4219)
+ValuePair(GCS_Camacupa, 4220)
+ValuePair(GCS_Campo_Inchauspe, 4221)
+ValuePair(GCS_Cape, 4222)
+ValuePair(GCS_Carthage, 4223)
+ValuePair(GCS_Chua, 4224)
+ValuePair(GCS_Corrego_Alegre, 4225)
+ValuePair(GCS_Cote_d_Ivoire, 4226)
+ValuePair(GCS_Deir_ez_Zor, 4227)
+ValuePair(GCS_Douala, 4228)
+ValuePair(GCS_Egypt_1907, 4229)
+ValuePair(GCS_ED50, 4230)
+ValuePair(GCS_ED87, 4231)
+ValuePair(GCS_Fahud, 4232)
+ValuePair(GCS_Gandajika_1970, 4233)
+ValuePair(GCS_Garoua, 4234)
+ValuePair(GCS_Guyane_Francaise, 4235)
+ValuePair(GCS_Hu_Tzu_Shan, 4236)
+ValuePair(GCS_HD72, 4237)
+ValuePair(GCS_ID74, 4238)
+ValuePair(GCS_Indian_1954, 4239)
+ValuePair(GCS_Indian_1975, 4240)
+ValuePair(GCS_Jamaica_1875, 4241)
+ValuePair(GCS_JAD69, 4242)
+ValuePair(GCS_Kalianpur, 4243)
+ValuePair(GCS_Kandawala, 4244)
+ValuePair(GCS_Kertau, 4245)
+ValuePair(GCS_KOC, 4246)
+ValuePair(GCS_La_Canoa, 4247)
+ValuePair(GCS_PSAD56, 4248)
+ValuePair(GCS_Lake, 4249)
+ValuePair(GCS_Leigon, 4250)
+ValuePair(GCS_Liberia_1964, 4251)
+ValuePair(GCS_Lome, 4252)
+ValuePair(GCS_Luzon_1911, 4253)
+ValuePair(GCS_Hito_XVIII_1963, 4254)
+ValuePair(GCS_Herat_North, 4255)
+ValuePair(GCS_Mahe_1971, 4256)
+ValuePair(GCS_Makassar, 4257)
+ValuePair(GCS_EUREF89, 4258)
+ValuePair(GCS_Malongo_1987, 4259)
+ValuePair(GCS_Manoca, 4260)
+ValuePair(GCS_Merchich, 4261)
+ValuePair(GCS_Massawa, 4262)
+ValuePair(GCS_Minna, 4263)
+ValuePair(GCS_Mhast, 4264)
+ValuePair(GCS_Monte_Mario, 4265)
+ValuePair(GCS_M_poraloko, 4266)
+ValuePair(GCS_NAD27, 4267)
+ValuePair(GCS_NAD_Michigan, 4268)
+ValuePair(GCS_NAD83, 4269)
+ValuePair(GCS_Nahrwan_1967, 4270)
+ValuePair(GCS_Naparima_1972, 4271)
+ValuePair(GCS_GD49, 4272)
+ValuePair(GCS_NGO_1948, 4273)
+ValuePair(GCS_Datum_73, 4274)
+ValuePair(GCS_NTF, 4275)
+ValuePair(GCS_NSWC_9Z_2, 4276)
+ValuePair(GCS_OSGB_1936, 4277)
+ValuePair(GCS_OSGB70, 4278)
+ValuePair(GCS_OS_SN80, 4279)
+ValuePair(GCS_Padang, 4280)
+ValuePair(GCS_Palestine_1923, 4281)
+ValuePair(GCS_Pointe_Noire, 4282)
+ValuePair(GCS_GDA94, 4283)
+ValuePair(GCS_Pulkovo_1942, 4284)
+ValuePair(GCS_Qatar, 4285)
+ValuePair(GCS_Qatar_1948, 4286)
+ValuePair(GCS_Qornoq, 4287)
+ValuePair(GCS_Loma_Quintana, 4288)
+ValuePair(GCS_Amersfoort, 4289)
+ValuePair(GCS_RT38, 4290)
+ValuePair(GCS_SAD69, 4291)
+ValuePair(GCS_Sapper_Hill_1943, 4292)
+ValuePair(GCS_Schwarzeck, 4293)
+ValuePair(GCS_Segora, 4294)
+ValuePair(GCS_Serindung, 4295)
+ValuePair(GCS_Sudan, 4296)
+ValuePair(GCS_Tananarive, 4297)
+ValuePair(GCS_Timbalai_1948, 4298)
+ValuePair(GCS_TM65, 4299)
+ValuePair(GCS_TM75, 4300)
+ValuePair(GCS_Tokyo, 4301)
+ValuePair(GCS_Trinidad_1903, 4302)
+ValuePair(GCS_TC_1948, 4303)
+ValuePair(GCS_Voirol_1875, 4304)
+ValuePair(GCS_Voirol_Unifie, 4305)
+ValuePair(GCS_Bern_1938, 4306)
+ValuePair(GCS_Nord_Sahara_1959, 4307)
+ValuePair(GCS_Stockholm_1938, 4308)
+ValuePair(GCS_Yacare, 4309)
+ValuePair(GCS_Yoff, 4310)
+ValuePair(GCS_Zanderij, 4311)
+ValuePair(GCS_MGI, 4312)
+ValuePair(GCS_Belge_1972, 4313)
+ValuePair(GCS_DHDN, 4314)
+ValuePair(GCS_Conakry_1905, 4315)
+ValuePair(GCS_WGS_72, 4322)
+ValuePair(GCS_WGS_72BE, 4324)
+ValuePair(GCS_WGS_84, 4326)
+ValuePair(GCS_Bern_1898_Bern, 4801)
+ValuePair(GCS_Bogota_Bogota, 4802)
+ValuePair(GCS_Lisbon_Lisbon, 4803)
+ValuePair(GCS_Makassar_Jakarta, 4804)
+ValuePair(GCS_MGI_Ferro, 4805)
+ValuePair(GCS_Monte_Mario_Rome, 4806)
+ValuePair(GCS_NTF_Paris, 4807)
+ValuePair(GCS_Padang_Jakarta, 4808)
+ValuePair(GCS_Belge_1950_Brussels, 4809)
+ValuePair(GCS_Tananarive_Paris, 4810)
+ValuePair(GCS_Voirol_1875_Paris, 4811)
+ValuePair(GCS_Voirol_Unifie_Paris, 4812)
+ValuePair(GCS_Batavia_Jakarta, 4813)
+ValuePair(GCS_ATF_Paris, 4901)
+ValuePair(GCS_NDG_Paris, 4902)
+/* End of list */
diff --git a/src/tiff/epsg_pcs.inc b/src/tiff/epsg_pcs.inc
new file mode 100644
index 0000000..d54153a
--- /dev/null
+++ b/src/tiff/epsg_pcs.inc
@@ -0,0 +1,1003 @@
+/*
+ * EPSG PCS Codes - GeoTIFF Rev 0.2
+ */
+
+/* C database for Geotiff include files. */
+/* the macro ValuePair() must be defined */
+/* by the enclosing include file */
+
+#ifdef INCLUDE_OLD_CODES
+#include old_pcs.inc
+#endif /* OLD Codes */
+
+/* New PCS */
+ValuePair(PCS_GGRS87_Greek_Grid,2100)
+ValuePair(PCS_KKJ_Finland_zone_1,2391)
+ValuePair(PCS_KKJ_Finland_zone_2,2392)
+ValuePair(PCS_KKJ_Finland_zone_3,2393)
+ValuePair(PCS_KKJ_Finland_zone_4,2394)
+ValuePair(PCS_RT90_2_5_gon_W,2400)
+ValuePair(PCS_Lietuvos_Koordinoei_Sistema_1994,2600)
+ValuePair(PCS_Estonian_Coordinate_System_of_1992,3300)
+ValuePair(PCS_HD72_EOV,23700)
+ValuePair(PCS_Dealul_Piscului_1970_Stereo_70,31700)
+
+ValuePair(PCS_Adindan_UTM_zone_37N, 20137)
+ValuePair(PCS_Adindan_UTM_zone_38N, 20138)
+ValuePair(PCS_AGD66_AMG_zone_48, 20248)
+ValuePair(PCS_AGD66_AMG_zone_49, 20249)
+ValuePair(PCS_AGD66_AMG_zone_50, 20250)
+ValuePair(PCS_AGD66_AMG_zone_51, 20251)
+ValuePair(PCS_AGD66_AMG_zone_52, 20252)
+ValuePair(PCS_AGD66_AMG_zone_53, 20253)
+ValuePair(PCS_AGD66_AMG_zone_54, 20254)
+ValuePair(PCS_AGD66_AMG_zone_55, 20255)
+ValuePair(PCS_AGD66_AMG_zone_56, 20256)
+ValuePair(PCS_AGD66_AMG_zone_57, 20257)
+ValuePair(PCS_AGD66_AMG_zone_58, 20258)
+ValuePair(PCS_AGD84_AMG_zone_48, 20348)
+ValuePair(PCS_AGD84_AMG_zone_49, 20349)
+ValuePair(PCS_AGD84_AMG_zone_50, 20350)
+ValuePair(PCS_AGD84_AMG_zone_51, 20351)
+ValuePair(PCS_AGD84_AMG_zone_52, 20352)
+ValuePair(PCS_AGD84_AMG_zone_53, 20353)
+ValuePair(PCS_AGD84_AMG_zone_54, 20354)
+ValuePair(PCS_AGD84_AMG_zone_55, 20355)
+ValuePair(PCS_AGD84_AMG_zone_56, 20356)
+ValuePair(PCS_AGD84_AMG_zone_57, 20357)
+ValuePair(PCS_AGD84_AMG_zone_58, 20358)
+ValuePair(PCS_Ain_el_Abd_UTM_zone_37N, 20437)
+ValuePair(PCS_Ain_el_Abd_UTM_zone_38N, 20438)
+ValuePair(PCS_Ain_el_Abd_UTM_zone_39N, 20439)
+ValuePair(PCS_Ain_el_Abd_Bahrain_Grid, 20499)
+ValuePair(PCS_Afgooye_UTM_zone_38N, 20538)
+ValuePair(PCS_Afgooye_UTM_zone_39N, 20539)
+ValuePair(PCS_Lisbon_Portugese_Grid, 20700)
+ValuePair(PCS_Aratu_UTM_zone_22S, 20822)
+ValuePair(PCS_Aratu_UTM_zone_23S, 20823)
+ValuePair(PCS_Aratu_UTM_zone_24S, 20824)
+ValuePair(PCS_Arc_1950_Lo13, 20973)
+ValuePair(PCS_Arc_1950_Lo15, 20975)
+ValuePair(PCS_Arc_1950_Lo17, 20977)
+ValuePair(PCS_Arc_1950_Lo19, 20979)
+ValuePair(PCS_Arc_1950_Lo21, 20981)
+ValuePair(PCS_Arc_1950_Lo23, 20983)
+ValuePair(PCS_Arc_1950_Lo25, 20985)
+ValuePair(PCS_Arc_1950_Lo27, 20987)
+ValuePair(PCS_Arc_1950_Lo29, 20989)
+ValuePair(PCS_Arc_1950_Lo31, 20991)
+ValuePair(PCS_Arc_1950_Lo33, 20993)
+ValuePair(PCS_Arc_1950_Lo35, 20995)
+ValuePair(PCS_Batavia_NEIEZ, 21100)
+ValuePair(PCS_Batavia_UTM_zone_48S, 21148)
+ValuePair(PCS_Batavia_UTM_zone_49S, 21149)
+ValuePair(PCS_Batavia_UTM_zone_50S, 21150)
+ValuePair(PCS_Beijing_Gauss_zone_13, 21413)
+ValuePair(PCS_Beijing_Gauss_zone_14, 21414)
+ValuePair(PCS_Beijing_Gauss_zone_15, 21415)
+ValuePair(PCS_Beijing_Gauss_zone_16, 21416)
+ValuePair(PCS_Beijing_Gauss_zone_17, 21417)
+ValuePair(PCS_Beijing_Gauss_zone_18, 21418)
+ValuePair(PCS_Beijing_Gauss_zone_19, 21419)
+ValuePair(PCS_Beijing_Gauss_zone_20, 21420)
+ValuePair(PCS_Beijing_Gauss_zone_21, 21421)
+ValuePair(PCS_Beijing_Gauss_zone_22, 21422)
+ValuePair(PCS_Beijing_Gauss_zone_23, 21423)
+ValuePair(PCS_Beijing_Gauss_13N, 21473)
+ValuePair(PCS_Beijing_Gauss_14N, 21474)
+ValuePair(PCS_Beijing_Gauss_15N, 21475)
+ValuePair(PCS_Beijing_Gauss_16N, 21476)
+ValuePair(PCS_Beijing_Gauss_17N, 21477)
+ValuePair(PCS_Beijing_Gauss_18N, 21478)
+ValuePair(PCS_Beijing_Gauss_19N, 21479)
+ValuePair(PCS_Beijing_Gauss_20N, 21480)
+ValuePair(PCS_Beijing_Gauss_21N, 21481)
+ValuePair(PCS_Beijing_Gauss_22N, 21482)
+ValuePair(PCS_Beijing_Gauss_23N, 21483)
+ValuePair(PCS_Belge_Lambert_50, 21500)
+ValuePair(PCS_Bern_1898_Swiss_Old, 21790)
+ValuePair(PCS_Bogota_UTM_zone_17N, 21817)
+ValuePair(PCS_Bogota_UTM_zone_18N, 21818)
+ValuePair(PCS_Bogota_Colombia_3W, 21891)
+ValuePair(PCS_Bogota_Colombia_Bogota, 21892)
+ValuePair(PCS_Bogota_Colombia_3E, 21893)
+ValuePair(PCS_Bogota_Colombia_6E, 21894)
+ValuePair(PCS_Camacupa_UTM_32S, 22032)
+ValuePair(PCS_Camacupa_UTM_33S, 22033)
+ValuePair(PCS_C_Inchauspe_Argentina_1, 22191)
+ValuePair(PCS_C_Inchauspe_Argentina_2, 22192)
+ValuePair(PCS_C_Inchauspe_Argentina_3, 22193)
+ValuePair(PCS_C_Inchauspe_Argentina_4, 22194)
+ValuePair(PCS_C_Inchauspe_Argentina_5, 22195)
+ValuePair(PCS_C_Inchauspe_Argentina_6, 22196)
+ValuePair(PCS_C_Inchauspe_Argentina_7, 22197)
+ValuePair(PCS_Carthage_UTM_zone_32N, 22332)
+ValuePair(PCS_Carthage_Nord_Tunisie, 22391)
+ValuePair(PCS_Carthage_Sud_Tunisie, 22392)
+ValuePair(PCS_Corrego_Alegre_UTM_23S, 22523)
+ValuePair(PCS_Corrego_Alegre_UTM_24S, 22524)
+ValuePair(PCS_Douala_UTM_zone_32N, 22832)
+ValuePair(PCS_Egypt_1907_Red_Belt, 22992)
+ValuePair(PCS_Egypt_1907_Purple_Belt, 22993)
+ValuePair(PCS_Egypt_1907_Ext_Purple, 22994)
+ValuePair(PCS_ED50_UTM_zone_28N, 23028)
+ValuePair(PCS_ED50_UTM_zone_29N, 23029)
+ValuePair(PCS_ED50_UTM_zone_30N, 23030)
+ValuePair(PCS_ED50_UTM_zone_31N, 23031)
+ValuePair(PCS_ED50_UTM_zone_32N, 23032)
+ValuePair(PCS_ED50_UTM_zone_33N, 23033)
+ValuePair(PCS_ED50_UTM_zone_34N, 23034)
+ValuePair(PCS_ED50_UTM_zone_35N, 23035)
+ValuePair(PCS_ED50_UTM_zone_36N, 23036)
+ValuePair(PCS_ED50_UTM_zone_37N, 23037)
+ValuePair(PCS_ED50_UTM_zone_38N, 23038)
+ValuePair(PCS_Fahud_UTM_zone_39N, 23239)
+ValuePair(PCS_Fahud_UTM_zone_40N, 23240)
+ValuePair(PCS_Garoua_UTM_zone_33N, 23433)
+ValuePair(PCS_ID74_UTM_zone_46N, 23846)
+ValuePair(PCS_ID74_UTM_zone_47N, 23847)
+ValuePair(PCS_ID74_UTM_zone_48N, 23848)
+ValuePair(PCS_ID74_UTM_zone_49N, 23849)
+ValuePair(PCS_ID74_UTM_zone_50N, 23850)
+ValuePair(PCS_ID74_UTM_zone_51N, 23851)
+ValuePair(PCS_ID74_UTM_zone_52N, 23852)
+ValuePair(PCS_ID74_UTM_zone_53N, 23853)
+ValuePair(PCS_ID74_UTM_zone_46S, 23886)
+ValuePair(PCS_ID74_UTM_zone_47S, 23887)
+ValuePair(PCS_ID74_UTM_zone_48S, 23888)
+ValuePair(PCS_ID74_UTM_zone_49S, 23889)
+ValuePair(PCS_ID74_UTM_zone_50S, 23890)
+ValuePair(PCS_ID74_UTM_zone_51S, 23891)
+ValuePair(PCS_ID74_UTM_zone_52S, 23892)
+ValuePair(PCS_ID74_UTM_zone_53S, 23893)
+ValuePair(PCS_ID74_UTM_zone_54S, 23894)
+ValuePair(PCS_Indian_1954_UTM_47N, 23947)
+ValuePair(PCS_Indian_1954_UTM_48N, 23948)
+ValuePair(PCS_Indian_1975_UTM_47N, 24047)
+ValuePair(PCS_Indian_1975_UTM_48N, 24048)
+ValuePair(PCS_Jamaica_1875_Old_Grid, 24100)
+ValuePair(PCS_JAD69_Jamaica_Grid, 24200)
+ValuePair(PCS_Kalianpur_India_0, 24370)
+ValuePair(PCS_Kalianpur_India_I, 24371)
+ValuePair(PCS_Kalianpur_India_IIa, 24372)
+ValuePair(PCS_Kalianpur_India_IIIa, 24373)
+ValuePair(PCS_Kalianpur_India_IVa, 24374)
+ValuePair(PCS_Kalianpur_India_IIb, 24382)
+ValuePair(PCS_Kalianpur_India_IIIb, 24383)
+ValuePair(PCS_Kalianpur_India_IVb, 24384)
+ValuePair(PCS_Kertau_Singapore_Grid, 24500)
+ValuePair(PCS_Kertau_UTM_zone_47N, 24547)
+ValuePair(PCS_Kertau_UTM_zone_48N, 24548)
+ValuePair(PCS_La_Canoa_UTM_zone_20N, 24720)
+ValuePair(PCS_La_Canoa_UTM_zone_21N, 24721)
+ValuePair(PCS_PSAD56_UTM_zone_18N, 24818)
+ValuePair(PCS_PSAD56_UTM_zone_19N, 24819)
+ValuePair(PCS_PSAD56_UTM_zone_20N, 24820)
+ValuePair(PCS_PSAD56_UTM_zone_21N, 24821)
+ValuePair(PCS_PSAD56_UTM_zone_17S, 24877)
+ValuePair(PCS_PSAD56_UTM_zone_18S, 24878)
+ValuePair(PCS_PSAD56_UTM_zone_19S, 24879)
+ValuePair(PCS_PSAD56_UTM_zone_20S, 24880)
+ValuePair(PCS_PSAD56_Peru_west_zone, 24891)
+ValuePair(PCS_PSAD56_Peru_central, 24892)
+ValuePair(PCS_PSAD56_Peru_east_zone, 24893)
+ValuePair(PCS_Leigon_Ghana_Grid, 25000)
+ValuePair(PCS_Lome_UTM_zone_31N, 25231)
+ValuePair(PCS_Luzon_Philippines_I, 25391)
+ValuePair(PCS_Luzon_Philippines_II, 25392)
+ValuePair(PCS_Luzon_Philippines_III, 25393)
+ValuePair(PCS_Luzon_Philippines_IV, 25394)
+ValuePair(PCS_Luzon_Philippines_V, 25395)
+ValuePair(PCS_Makassar_NEIEZ, 25700)
+ValuePair(PCS_Malongo_1987_UTM_32S, 25932)
+ValuePair(PCS_Merchich_Nord_Maroc, 26191)
+ValuePair(PCS_Merchich_Sud_Maroc, 26192)
+ValuePair(PCS_Merchich_Sahara, 26193)
+ValuePair(PCS_Massawa_UTM_zone_37N, 26237)
+ValuePair(PCS_Minna_UTM_zone_31N, 26331)
+ValuePair(PCS_Minna_UTM_zone_32N, 26332)
+ValuePair(PCS_Minna_Nigeria_West, 26391)
+ValuePair(PCS_Minna_Nigeria_Mid_Belt, 26392)
+ValuePair(PCS_Minna_Nigeria_East, 26393)
+ValuePair(PCS_Mhast_UTM_zone_32S, 26432)
+ValuePair(PCS_Monte_Mario_Italy_1, 26591)
+ValuePair(PCS_Monte_Mario_Italy_2, 26592)
+ValuePair(PCS_M_poraloko_UTM_32N, 26632)
+ValuePair(PCS_M_poraloko_UTM_32S, 26692)
+ValuePair(PCS_NAD27_UTM_zone_3N, 26703)
+ValuePair(PCS_NAD27_UTM_zone_4N, 26704)
+ValuePair(PCS_NAD27_UTM_zone_5N, 26705)
+ValuePair(PCS_NAD27_UTM_zone_6N, 26706)
+ValuePair(PCS_NAD27_UTM_zone_7N, 26707)
+ValuePair(PCS_NAD27_UTM_zone_8N, 26708)
+ValuePair(PCS_NAD27_UTM_zone_9N, 26709)
+ValuePair(PCS_NAD27_UTM_zone_10N, 26710)
+ValuePair(PCS_NAD27_UTM_zone_11N, 26711)
+ValuePair(PCS_NAD27_UTM_zone_12N, 26712)
+ValuePair(PCS_NAD27_UTM_zone_13N, 26713)
+ValuePair(PCS_NAD27_UTM_zone_14N, 26714)
+ValuePair(PCS_NAD27_UTM_zone_15N, 26715)
+ValuePair(PCS_NAD27_UTM_zone_16N, 26716)
+ValuePair(PCS_NAD27_UTM_zone_17N, 26717)
+ValuePair(PCS_NAD27_UTM_zone_18N, 26718)
+ValuePair(PCS_NAD27_UTM_zone_19N, 26719)
+ValuePair(PCS_NAD27_UTM_zone_20N, 26720)
+ValuePair(PCS_NAD27_UTM_zone_21N, 26721)
+ValuePair(PCS_NAD27_UTM_zone_22N, 26722)
+ValuePair(PCS_NAD27_Alabama_East, 26729)
+ValuePair(PCS_NAD27_Alabama_West, 26730)
+ValuePair(PCS_NAD27_Alaska_zone_1, 26731)
+ValuePair(PCS_NAD27_Alaska_zone_2, 26732)
+ValuePair(PCS_NAD27_Alaska_zone_3, 26733)
+ValuePair(PCS_NAD27_Alaska_zone_4, 26734)
+ValuePair(PCS_NAD27_Alaska_zone_5, 26735)
+ValuePair(PCS_NAD27_Alaska_zone_6, 26736)
+ValuePair(PCS_NAD27_Alaska_zone_7, 26737)
+ValuePair(PCS_NAD27_Alaska_zone_8, 26738)
+ValuePair(PCS_NAD27_Alaska_zone_9, 26739)
+ValuePair(PCS_NAD27_Alaska_zone_10, 26740)
+ValuePair(PCS_NAD27_California_I, 26741)
+ValuePair(PCS_NAD27_California_II, 26742)
+ValuePair(PCS_NAD27_California_III, 26743)
+ValuePair(PCS_NAD27_California_IV, 26744)
+ValuePair(PCS_NAD27_California_V, 26745)
+ValuePair(PCS_NAD27_California_VI, 26746)
+ValuePair(PCS_NAD27_California_VII, 26747)
+ValuePair(PCS_NAD27_Arizona_East, 26748)
+ValuePair(PCS_NAD27_Arizona_Central, 26749)
+ValuePair(PCS_NAD27_Arizona_West, 26750)
+ValuePair(PCS_NAD27_Arkansas_North, 26751)
+ValuePair(PCS_NAD27_Arkansas_South, 26752)
+ValuePair(PCS_NAD27_Colorado_North, 26753)
+ValuePair(PCS_NAD27_Colorado_Central, 26754)
+ValuePair(PCS_NAD27_Colorado_South, 26755)
+ValuePair(PCS_NAD27_Connecticut, 26756)
+ValuePair(PCS_NAD27_Delaware, 26757)
+ValuePair(PCS_NAD27_Florida_East, 26758)
+ValuePair(PCS_NAD27_Florida_West, 26759)
+ValuePair(PCS_NAD27_Florida_North, 26760)
+ValuePair(PCS_NAD27_Hawaii_zone_1, 26761)
+ValuePair(PCS_NAD27_Hawaii_zone_2, 26762)
+ValuePair(PCS_NAD27_Hawaii_zone_3, 26763)
+ValuePair(PCS_NAD27_Hawaii_zone_4, 26764)
+ValuePair(PCS_NAD27_Hawaii_zone_5, 26765)
+ValuePair(PCS_NAD27_Georgia_East, 26766)
+ValuePair(PCS_NAD27_Georgia_West, 26767)
+ValuePair(PCS_NAD27_Idaho_East, 26768)
+ValuePair(PCS_NAD27_Idaho_Central, 26769)
+ValuePair(PCS_NAD27_Idaho_West, 26770)
+ValuePair(PCS_NAD27_Illinois_East, 26771)
+ValuePair(PCS_NAD27_Illinois_West, 26772)
+ValuePair(PCS_NAD27_Indiana_East, 26773)
+ValuePair(PCS_NAD27_BLM_14N_feet, 26774)
+ValuePair(PCS_NAD27_Indiana_West, 26774)
+ValuePair(PCS_NAD27_BLM_15N_feet, 26775)
+ValuePair(PCS_NAD27_Iowa_North, 26775)
+ValuePair(PCS_NAD27_BLM_16N_feet, 26776)
+ValuePair(PCS_NAD27_Iowa_South, 26776)
+ValuePair(PCS_NAD27_BLM_17N_feet, 26777)
+ValuePair(PCS_NAD27_Kansas_North, 26777)
+ValuePair(PCS_NAD27_Kansas_South, 26778)
+ValuePair(PCS_NAD27_Kentucky_North, 26779)
+ValuePair(PCS_NAD27_Kentucky_South, 26780)
+ValuePair(PCS_NAD27_Louisiana_North, 26781)
+ValuePair(PCS_NAD27_Louisiana_South, 26782)
+ValuePair(PCS_NAD27_Maine_East, 26783)
+ValuePair(PCS_NAD27_Maine_West, 26784)
+ValuePair(PCS_NAD27_Maryland, 26785)
+ValuePair(PCS_NAD27_Massachusetts, 26786)
+ValuePair(PCS_NAD27_Massachusetts_Is, 26787)
+ValuePair(PCS_NAD27_Michigan_North, 26788)
+ValuePair(PCS_NAD27_Michigan_Central, 26789)
+ValuePair(PCS_NAD27_Michigan_South, 26790)
+ValuePair(PCS_NAD27_Minnesota_North, 26791)
+ValuePair(PCS_NAD27_Minnesota_Cent, 26792)
+ValuePair(PCS_NAD27_Minnesota_South, 26793)
+ValuePair(PCS_NAD27_Mississippi_East, 26794)
+ValuePair(PCS_NAD27_Mississippi_West, 26795)
+ValuePair(PCS_NAD27_Missouri_East, 26796)
+ValuePair(PCS_NAD27_Missouri_Central, 26797)
+ValuePair(PCS_NAD27_Missouri_West, 26798)
+ValuePair(PCS_NAD_Michigan_Michigan_East, 26801)
+ValuePair(PCS_NAD_Michigan_Michigan_Old_Central, 26802)
+ValuePair(PCS_NAD_Michigan_Michigan_West, 26803)
+ValuePair(PCS_NAD83_UTM_zone_3N, 26903)
+ValuePair(PCS_NAD83_UTM_zone_4N, 26904)
+ValuePair(PCS_NAD83_UTM_zone_5N, 26905)
+ValuePair(PCS_NAD83_UTM_zone_6N, 26906)
+ValuePair(PCS_NAD83_UTM_zone_7N, 26907)
+ValuePair(PCS_NAD83_UTM_zone_8N, 26908)
+ValuePair(PCS_NAD83_UTM_zone_9N, 26909)
+ValuePair(PCS_NAD83_UTM_zone_10N, 26910)
+ValuePair(PCS_NAD83_UTM_zone_11N, 26911)
+ValuePair(PCS_NAD83_UTM_zone_12N, 26912)
+ValuePair(PCS_NAD83_UTM_zone_13N, 26913)
+ValuePair(PCS_NAD83_UTM_zone_14N, 26914)
+ValuePair(PCS_NAD83_UTM_zone_15N, 26915)
+ValuePair(PCS_NAD83_UTM_zone_16N, 26916)
+ValuePair(PCS_NAD83_UTM_zone_17N, 26917)
+ValuePair(PCS_NAD83_UTM_zone_18N, 26918)
+ValuePair(PCS_NAD83_UTM_zone_19N, 26919)
+ValuePair(PCS_NAD83_UTM_zone_20N, 26920)
+ValuePair(PCS_NAD83_UTM_zone_21N, 26921)
+ValuePair(PCS_NAD83_UTM_zone_22N, 26922)
+ValuePair(PCS_NAD83_UTM_zone_23N, 26923)
+ValuePair(PCS_NAD83_Alabama_East, 26929)
+ValuePair(PCS_NAD83_Alabama_West, 26930)
+ValuePair(PCS_NAD83_Alaska_zone_1, 26931)
+ValuePair(PCS_NAD83_Alaska_zone_2, 26932)
+ValuePair(PCS_NAD83_Alaska_zone_3, 26933)
+ValuePair(PCS_NAD83_Alaska_zone_4, 26934)
+ValuePair(PCS_NAD83_Alaska_zone_5, 26935)
+ValuePair(PCS_NAD83_Alaska_zone_6, 26936)
+ValuePair(PCS_NAD83_Alaska_zone_7, 26937)
+ValuePair(PCS_NAD83_Alaska_zone_8, 26938)
+ValuePair(PCS_NAD83_Alaska_zone_9, 26939)
+ValuePair(PCS_NAD83_Alaska_zone_10, 26940)
+ValuePair(PCS_NAD83_California_1, 26941)
+ValuePair(PCS_NAD83_California_2, 26942)
+ValuePair(PCS_NAD83_California_3, 26943)
+ValuePair(PCS_NAD83_California_4, 26944)
+ValuePair(PCS_NAD83_California_5, 26945)
+ValuePair(PCS_NAD83_California_6, 26946)
+ValuePair(PCS_NAD83_Arizona_East, 26948)
+ValuePair(PCS_NAD83_Arizona_Central, 26949)
+ValuePair(PCS_NAD83_Arizona_West, 26950)
+ValuePair(PCS_NAD83_Arkansas_North, 26951)
+ValuePair(PCS_NAD83_Arkansas_South, 26952)
+ValuePair(PCS_NAD83_Colorado_North, 26953)
+ValuePair(PCS_NAD83_Colorado_Central, 26954)
+ValuePair(PCS_NAD83_Colorado_South, 26955)
+ValuePair(PCS_NAD83_Connecticut, 26956)
+ValuePair(PCS_NAD83_Delaware, 26957)
+ValuePair(PCS_NAD83_Florida_East, 26958)
+ValuePair(PCS_NAD83_Florida_West, 26959)
+ValuePair(PCS_NAD83_Florida_North, 26960)
+ValuePair(PCS_NAD83_Hawaii_zone_1, 26961)
+ValuePair(PCS_NAD83_Hawaii_zone_2, 26962)
+ValuePair(PCS_NAD83_Hawaii_zone_3, 26963)
+ValuePair(PCS_NAD83_Hawaii_zone_4, 26964)
+ValuePair(PCS_NAD83_Hawaii_zone_5, 26965)
+ValuePair(PCS_NAD83_Georgia_East, 26966)
+ValuePair(PCS_NAD83_Georgia_West, 26967)
+ValuePair(PCS_NAD83_Idaho_East, 26968)
+ValuePair(PCS_NAD83_Idaho_Central, 26969)
+ValuePair(PCS_NAD83_Idaho_West, 26970)
+ValuePair(PCS_NAD83_Illinois_East, 26971)
+ValuePair(PCS_NAD83_Illinois_West, 26972)
+ValuePair(PCS_NAD83_Indiana_East, 26973)
+ValuePair(PCS_NAD83_Indiana_West, 26974)
+ValuePair(PCS_NAD83_Iowa_North, 26975)
+ValuePair(PCS_NAD83_Iowa_South, 26976)
+ValuePair(PCS_NAD83_Kansas_North, 26977)
+ValuePair(PCS_NAD83_Kansas_South, 26978)
+ValuePair(PCS_NAD83_Kentucky_North, 2205)
+ValuePair(PCS_NAD83_Kentucky_South, 26980)
+ValuePair(PCS_NAD83_Louisiana_North, 26981)
+ValuePair(PCS_NAD83_Louisiana_South, 26982)
+ValuePair(PCS_NAD83_Maine_East, 26983)
+ValuePair(PCS_NAD83_Maine_West, 26984)
+ValuePair(PCS_NAD83_Maryland, 26985)
+ValuePair(PCS_NAD83_Massachusetts, 26986)
+ValuePair(PCS_NAD83_Massachusetts_Is, 26987)
+ValuePair(PCS_NAD83_Michigan_North, 26988)
+ValuePair(PCS_NAD83_Michigan_Central, 26989)
+ValuePair(PCS_NAD83_Michigan_South, 26990)
+ValuePair(PCS_NAD83_Minnesota_North, 26991)
+ValuePair(PCS_NAD83_Minnesota_Cent, 26992)
+ValuePair(PCS_NAD83_Minnesota_South, 26993)
+ValuePair(PCS_NAD83_Mississippi_East, 26994)
+ValuePair(PCS_NAD83_Mississippi_West, 26995)
+ValuePair(PCS_NAD83_Missouri_East, 26996)
+ValuePair(PCS_NAD83_Missouri_Central, 26997)
+ValuePair(PCS_NAD83_Missouri_West, 26998)
+ValuePair(PCS_Nahrwan_1967_UTM_38N, 27038)
+ValuePair(PCS_Nahrwan_1967_UTM_39N, 27039)
+ValuePair(PCS_Nahrwan_1967_UTM_40N, 27040)
+ValuePair(PCS_Naparima_UTM_20N, 27120)
+ValuePair(PCS_GD49_NZ_Map_Grid, 27200)
+ValuePair(PCS_GD49_North_Island_Grid, 27291)
+ValuePair(PCS_GD49_South_Island_Grid, 27292)
+ValuePair(PCS_Datum_73_UTM_zone_29N, 27429)
+ValuePair(PCS_ATF_Nord_de_Guerre, 27500)
+ValuePair(PCS_NTF_France_I, 27581)
+ValuePair(PCS_NTF_France_II, 27582)
+ValuePair(PCS_NTF_France_III, 27583)
+ValuePair(PCS_NTF_Nord_France, 27591)
+ValuePair(PCS_NTF_Centre_France, 27592)
+ValuePair(PCS_NTF_Sud_France, 27593)
+ValuePair(PCS_British_National_Grid, 27700)
+ValuePair(PCS_Point_Noire_UTM_32S, 28232)
+ValuePair(PCS_GDA94_MGA_zone_48, 28348)
+ValuePair(PCS_GDA94_MGA_zone_49, 28349)
+ValuePair(PCS_GDA94_MGA_zone_50, 28350)
+ValuePair(PCS_GDA94_MGA_zone_51, 28351)
+ValuePair(PCS_GDA94_MGA_zone_52, 28352)
+ValuePair(PCS_GDA94_MGA_zone_53, 28353)
+ValuePair(PCS_GDA94_MGA_zone_54, 28354)
+ValuePair(PCS_GDA94_MGA_zone_55, 28355)
+ValuePair(PCS_GDA94_MGA_zone_56, 28356)
+ValuePair(PCS_GDA94_MGA_zone_57, 28357)
+ValuePair(PCS_GDA94_MGA_zone_58, 28358)
+ValuePair(PCS_Pulkovo_Gauss_zone_4, 28404)
+ValuePair(PCS_Pulkovo_Gauss_zone_5, 28405)
+ValuePair(PCS_Pulkovo_Gauss_zone_6, 28406)
+ValuePair(PCS_Pulkovo_Gauss_zone_7, 28407)
+ValuePair(PCS_Pulkovo_Gauss_zone_8, 28408)
+ValuePair(PCS_Pulkovo_Gauss_zone_9, 28409)
+ValuePair(PCS_Pulkovo_Gauss_zone_10, 28410)
+ValuePair(PCS_Pulkovo_Gauss_zone_11, 28411)
+ValuePair(PCS_Pulkovo_Gauss_zone_12, 28412)
+ValuePair(PCS_Pulkovo_Gauss_zone_13, 28413)
+ValuePair(PCS_Pulkovo_Gauss_zone_14, 28414)
+ValuePair(PCS_Pulkovo_Gauss_zone_15, 28415)
+ValuePair(PCS_Pulkovo_Gauss_zone_16, 28416)
+ValuePair(PCS_Pulkovo_Gauss_zone_17, 28417)
+ValuePair(PCS_Pulkovo_Gauss_zone_18, 28418)
+ValuePair(PCS_Pulkovo_Gauss_zone_19, 28419)
+ValuePair(PCS_Pulkovo_Gauss_zone_20, 28420)
+ValuePair(PCS_Pulkovo_Gauss_zone_21, 28421)
+ValuePair(PCS_Pulkovo_Gauss_zone_22, 28422)
+ValuePair(PCS_Pulkovo_Gauss_zone_23, 28423)
+ValuePair(PCS_Pulkovo_Gauss_zone_24, 28424)
+ValuePair(PCS_Pulkovo_Gauss_zone_25, 28425)
+ValuePair(PCS_Pulkovo_Gauss_zone_26, 28426)
+ValuePair(PCS_Pulkovo_Gauss_zone_27, 28427)
+ValuePair(PCS_Pulkovo_Gauss_zone_28, 28428)
+ValuePair(PCS_Pulkovo_Gauss_zone_29, 28429)
+ValuePair(PCS_Pulkovo_Gauss_zone_30, 28430)
+ValuePair(PCS_Pulkovo_Gauss_zone_31, 28431)
+ValuePair(PCS_Pulkovo_Gauss_zone_32, 28432)
+ValuePair(PCS_Pulkovo_Gauss_4N, 28464)
+ValuePair(PCS_Pulkovo_Gauss_5N, 28465)
+ValuePair(PCS_Pulkovo_Gauss_6N, 28466)
+ValuePair(PCS_Pulkovo_Gauss_7N, 28467)
+ValuePair(PCS_Pulkovo_Gauss_8N, 28468)
+ValuePair(PCS_Pulkovo_Gauss_9N, 28469)
+ValuePair(PCS_Pulkovo_Gauss_10N, 28470)
+ValuePair(PCS_Pulkovo_Gauss_11N, 28471)
+ValuePair(PCS_Pulkovo_Gauss_12N, 28472)
+ValuePair(PCS_Pulkovo_Gauss_13N, 28473)
+ValuePair(PCS_Pulkovo_Gauss_14N, 28474)
+ValuePair(PCS_Pulkovo_Gauss_15N, 28475)
+ValuePair(PCS_Pulkovo_Gauss_16N, 28476)
+ValuePair(PCS_Pulkovo_Gauss_17N, 28477)
+ValuePair(PCS_Pulkovo_Gauss_18N, 28478)
+ValuePair(PCS_Pulkovo_Gauss_19N, 28479)
+ValuePair(PCS_Pulkovo_Gauss_20N, 28480)
+ValuePair(PCS_Pulkovo_Gauss_21N, 28481)
+ValuePair(PCS_Pulkovo_Gauss_22N, 28482)
+ValuePair(PCS_Pulkovo_Gauss_23N, 28483)
+ValuePair(PCS_Pulkovo_Gauss_24N, 28484)
+ValuePair(PCS_Pulkovo_Gauss_25N, 28485)
+ValuePair(PCS_Pulkovo_Gauss_26N, 28486)
+ValuePair(PCS_Pulkovo_Gauss_27N, 28487)
+ValuePair(PCS_Pulkovo_Gauss_28N, 28488)
+ValuePair(PCS_Pulkovo_Gauss_29N, 28489)
+ValuePair(PCS_Pulkovo_Gauss_30N, 28490)
+ValuePair(PCS_Pulkovo_Gauss_31N, 28491)
+ValuePair(PCS_Pulkovo_Gauss_32N, 28492)
+ValuePair(PCS_Qatar_National_Grid, 28600)
+ValuePair(PCS_RD_Netherlands_Old, 28991)
+ValuePair(PCS_RD_Netherlands_New, 28992)
+ValuePair(PCS_SAD69_UTM_zone_18N, 29118)
+ValuePair(PCS_SAD69_UTM_zone_19N, 29119)
+ValuePair(PCS_SAD69_UTM_zone_20N, 29120)
+ValuePair(PCS_SAD69_UTM_zone_21N, 29121)
+ValuePair(PCS_SAD69_UTM_zone_22N, 29122)
+ValuePair(PCS_SAD69_UTM_zone_17S, 29177)
+ValuePair(PCS_SAD69_UTM_zone_18S, 29178)
+ValuePair(PCS_SAD69_UTM_zone_19S, 29179)
+ValuePair(PCS_SAD69_UTM_zone_20S, 29180)
+ValuePair(PCS_SAD69_UTM_zone_21S, 29181)
+ValuePair(PCS_SAD69_UTM_zone_22S, 29182)
+ValuePair(PCS_SAD69_UTM_zone_23S, 29183)
+ValuePair(PCS_SAD69_UTM_zone_24S, 29184)
+ValuePair(PCS_SAD69_UTM_zone_25S, 29185)
+ValuePair(PCS_Sapper_Hill_UTM_20S, 29220)
+ValuePair(PCS_Sapper_Hill_UTM_21S, 29221)
+ValuePair(PCS_Schwarzeck_UTM_33S, 29333)
+ValuePair(PCS_Sudan_UTM_zone_35N, 29635)
+ValuePair(PCS_Sudan_UTM_zone_36N, 29636)
+ValuePair(PCS_Tananarive_Laborde, 29700)
+ValuePair(PCS_Tananarive_UTM_38S, 29738)
+ValuePair(PCS_Tananarive_UTM_39S, 29739)
+ValuePair(PCS_Timbalai_1948_Borneo, 29800)
+ValuePair(PCS_Timbalai_1948_UTM_49N, 29849)
+ValuePair(PCS_Timbalai_1948_UTM_50N, 29850)
+ValuePair(PCS_TM65_Irish_Nat_Grid, 29900)
+ValuePair(PCS_Trinidad_1903_Trinidad, 30200)
+ValuePair(PCS_TC_1948_UTM_zone_39N, 30339)
+ValuePair(PCS_TC_1948_UTM_zone_40N, 30340)
+ValuePair(PCS_Voirol_N_Algerie_ancien, 30491)
+ValuePair(PCS_Voirol_S_Algerie_ancien, 30492)
+ValuePair(PCS_Voirol_Unifie_N_Algerie, 30591)
+ValuePair(PCS_Voirol_Unifie_S_Algerie, 30592)
+ValuePair(PCS_Bern_1938_Swiss_New, 30600)
+ValuePair(PCS_Nord_Sahara_UTM_29N, 30729)
+ValuePair(PCS_Nord_Sahara_UTM_30N, 30730)
+ValuePair(PCS_Nord_Sahara_UTM_31N, 30731)
+ValuePair(PCS_Nord_Sahara_UTM_32N, 30732)
+ValuePair(PCS_Yoff_UTM_zone_28N, 31028)
+ValuePair(PCS_Zanderij_UTM_zone_21N, 31121)
+ValuePair(PCS_MGI_Austria_West, 31291)
+ValuePair(PCS_MGI_Austria_Central, 31292)
+ValuePair(PCS_MGI_Austria_East, 31293)
+ValuePair(PCS_Belge_Lambert_72, 31300)
+ValuePair(PCS_DHDN_Germany_zone_1, 31491)
+ValuePair(PCS_DHDN_Germany_zone_2, 31492)
+ValuePair(PCS_DHDN_Germany_zone_3, 31493)
+ValuePair(PCS_DHDN_Germany_zone_4, 31494)
+ValuePair(PCS_DHDN_Germany_zone_5, 31495)
+ValuePair(PCS_NAD27_Montana_North, 32001)
+ValuePair(PCS_NAD27_Montana_Central, 32002)
+ValuePair(PCS_NAD27_Montana_South, 32003)
+ValuePair(PCS_NAD27_Nebraska_North, 32005)
+ValuePair(PCS_NAD27_Nebraska_South, 32006)
+ValuePair(PCS_NAD27_Nevada_East, 32007)
+ValuePair(PCS_NAD27_Nevada_Central, 32008)
+ValuePair(PCS_NAD27_Nevada_West, 32009)
+ValuePair(PCS_NAD27_New_Hampshire, 32010)
+ValuePair(PCS_NAD27_New_Jersey, 32011)
+ValuePair(PCS_NAD27_New_Mexico_East, 32012)
+ValuePair(PCS_NAD27_New_Mexico_Cent, 32013)
+ValuePair(PCS_NAD27_New_Mexico_West, 32014)
+ValuePair(PCS_NAD27_New_York_East, 32015)
+ValuePair(PCS_NAD27_New_York_Central, 32016)
+ValuePair(PCS_NAD27_New_York_West, 32017)
+ValuePair(PCS_NAD27_New_York_Long_Is, 32018)
+ValuePair(PCS_NAD27_North_Carolina, 32019)
+ValuePair(PCS_NAD27_North_Dakota_N, 32020)
+ValuePair(PCS_NAD27_North_Dakota_S, 32021)
+ValuePair(PCS_NAD27_Ohio_North, 32022)
+ValuePair(PCS_NAD27_Ohio_South, 32023)
+ValuePair(PCS_NAD27_Oklahoma_North, 32024)
+ValuePair(PCS_NAD27_Oklahoma_South, 32025)
+ValuePair(PCS_NAD27_Oregon_North, 32026)
+ValuePair(PCS_NAD27_Oregon_South, 32027)
+ValuePair(PCS_NAD27_Pennsylvania_N, 32028)
+ValuePair(PCS_NAD27_Pennsylvania_S, 32029)
+ValuePair(PCS_NAD27_Rhode_Island, 32030)
+ValuePair(PCS_NAD27_South_Carolina_N, 32031)
+ValuePair(PCS_NAD27_South_Carolina_S, 32033)
+ValuePair(PCS_NAD27_South_Dakota_N, 32034)
+ValuePair(PCS_NAD27_South_Dakota_S, 32035)
+ValuePair(PCS_NAD27_Tennessee, 2204)
+ValuePair(PCS_NAD27_Texas_North, 32037)
+ValuePair(PCS_NAD27_Texas_North_Cen, 32038)
+ValuePair(PCS_NAD27_Texas_Central, 32039)
+ValuePair(PCS_NAD27_Texas_South_Cen, 32040)
+ValuePair(PCS_NAD27_Texas_South, 32041)
+ValuePair(PCS_NAD27_Utah_North, 32042)
+ValuePair(PCS_NAD27_Utah_Central, 32043)
+ValuePair(PCS_NAD27_Utah_South, 32044)
+ValuePair(PCS_NAD27_Vermont, 32045)
+ValuePair(PCS_NAD27_Virginia_North, 32046)
+ValuePair(PCS_NAD27_Virginia_South, 32047)
+ValuePair(PCS_NAD27_Washington_North, 32048)
+ValuePair(PCS_NAD27_Washington_South, 32049)
+ValuePair(PCS_NAD27_West_Virginia_N, 32050)
+ValuePair(PCS_NAD27_West_Virginia_S, 32051)
+ValuePair(PCS_NAD27_Wisconsin_North, 32052)
+ValuePair(PCS_NAD27_Wisconsin_Cen, 32053)
+ValuePair(PCS_NAD27_Wisconsin_South, 32054)
+ValuePair(PCS_NAD27_Wyoming_East, 32055)
+ValuePair(PCS_NAD27_Wyoming_E_Cen, 32056)
+ValuePair(PCS_NAD27_Wyoming_W_Cen, 32057)
+ValuePair(PCS_NAD27_Wyoming_West, 32058)
+ValuePair(PCS_NAD27_Puerto_Rico, 32059)
+ValuePair(PCS_NAD27_St_Croix, 32060)
+ValuePair(PCS_NAD83_Montana, 32100)
+ValuePair(PCS_NAD83_Nebraska, 32104)
+ValuePair(PCS_NAD83_Nevada_East, 32107)
+ValuePair(PCS_NAD83_Nevada_Central, 32108)
+ValuePair(PCS_NAD83_Nevada_West, 32109)
+ValuePair(PCS_NAD83_New_Hampshire, 32110)
+ValuePair(PCS_NAD83_New_Jersey, 32111)
+ValuePair(PCS_NAD83_New_Mexico_East, 32112)
+ValuePair(PCS_NAD83_New_Mexico_Cent, 32113)
+ValuePair(PCS_NAD83_New_Mexico_West, 32114)
+ValuePair(PCS_NAD83_New_York_East, 32115)
+ValuePair(PCS_NAD83_New_York_Central, 32116)
+ValuePair(PCS_NAD83_New_York_West, 32117)
+ValuePair(PCS_NAD83_New_York_Long_Is, 32118)
+ValuePair(PCS_NAD83_North_Carolina, 32119)
+ValuePair(PCS_NAD83_North_Dakota_N, 32120)
+ValuePair(PCS_NAD83_North_Dakota_S, 32121)
+ValuePair(PCS_NAD83_Ohio_North, 32122)
+ValuePair(PCS_NAD83_Ohio_South, 32123)
+ValuePair(PCS_NAD83_Oklahoma_North, 32124)
+ValuePair(PCS_NAD83_Oklahoma_South, 32125)
+ValuePair(PCS_NAD83_Oregon_North, 32126)
+ValuePair(PCS_NAD83_Oregon_South, 32127)
+ValuePair(PCS_NAD83_Pennsylvania_N, 32128)
+ValuePair(PCS_NAD83_Pennsylvania_S, 32129)
+ValuePair(PCS_NAD83_Rhode_Island, 32130)
+ValuePair(PCS_NAD83_South_Carolina, 32133)
+ValuePair(PCS_NAD83_South_Dakota_N, 32134)
+ValuePair(PCS_NAD83_South_Dakota_S, 32135)
+ValuePair(PCS_NAD83_Tennessee, 32136)
+ValuePair(PCS_NAD83_Texas_North, 32137)
+ValuePair(PCS_NAD83_Texas_North_Cen, 32138)
+ValuePair(PCS_NAD83_Texas_Central, 32139)
+ValuePair(PCS_NAD83_Texas_South_Cen, 32140)
+ValuePair(PCS_NAD83_Texas_South, 32141)
+ValuePair(PCS_NAD83_Utah_North, 32142)
+ValuePair(PCS_NAD83_Utah_Central, 32143)
+ValuePair(PCS_NAD83_Utah_South, 32144)
+ValuePair(PCS_NAD83_Vermont, 32145)
+ValuePair(PCS_NAD83_Virginia_North, 32146)
+ValuePair(PCS_NAD83_Virginia_South, 32147)
+ValuePair(PCS_NAD83_Washington_North, 32148)
+ValuePair(PCS_NAD83_Washington_South, 32149)
+ValuePair(PCS_NAD83_West_Virginia_N, 32150)
+ValuePair(PCS_NAD83_West_Virginia_S, 32151)
+ValuePair(PCS_NAD83_Wisconsin_North, 32152)
+ValuePair(PCS_NAD83_Wisconsin_Cen, 32153)
+ValuePair(PCS_NAD83_Wisconsin_South, 32154)
+ValuePair(PCS_NAD83_Wyoming_East, 32155)
+ValuePair(PCS_NAD83_Wyoming_E_Cen, 32156)
+ValuePair(PCS_NAD83_Wyoming_W_Cen, 32157)
+ValuePair(PCS_NAD83_Wyoming_West, 32158)
+ValuePair(PCS_NAD83_Puerto_Rico_Virgin_Is, 32161)
+ValuePair(PCS_WGS72_UTM_zone_1N, 32201)
+ValuePair(PCS_WGS72_UTM_zone_2N, 32202)
+ValuePair(PCS_WGS72_UTM_zone_3N, 32203)
+ValuePair(PCS_WGS72_UTM_zone_4N, 32204)
+ValuePair(PCS_WGS72_UTM_zone_5N, 32205)
+ValuePair(PCS_WGS72_UTM_zone_6N, 32206)
+ValuePair(PCS_WGS72_UTM_zone_7N, 32207)
+ValuePair(PCS_WGS72_UTM_zone_8N, 32208)
+ValuePair(PCS_WGS72_UTM_zone_9N, 32209)
+ValuePair(PCS_WGS72_UTM_zone_10N, 32210)
+ValuePair(PCS_WGS72_UTM_zone_11N, 32211)
+ValuePair(PCS_WGS72_UTM_zone_12N, 32212)
+ValuePair(PCS_WGS72_UTM_zone_13N, 32213)
+ValuePair(PCS_WGS72_UTM_zone_14N, 32214)
+ValuePair(PCS_WGS72_UTM_zone_15N, 32215)
+ValuePair(PCS_WGS72_UTM_zone_16N, 32216)
+ValuePair(PCS_WGS72_UTM_zone_17N, 32217)
+ValuePair(PCS_WGS72_UTM_zone_18N, 32218)
+ValuePair(PCS_WGS72_UTM_zone_19N, 32219)
+ValuePair(PCS_WGS72_UTM_zone_20N, 32220)
+ValuePair(PCS_WGS72_UTM_zone_21N, 32221)
+ValuePair(PCS_WGS72_UTM_zone_22N, 32222)
+ValuePair(PCS_WGS72_UTM_zone_23N, 32223)
+ValuePair(PCS_WGS72_UTM_zone_24N, 32224)
+ValuePair(PCS_WGS72_UTM_zone_25N, 32225)
+ValuePair(PCS_WGS72_UTM_zone_26N, 32226)
+ValuePair(PCS_WGS72_UTM_zone_27N, 32227)
+ValuePair(PCS_WGS72_UTM_zone_28N, 32228)
+ValuePair(PCS_WGS72_UTM_zone_29N, 32229)
+ValuePair(PCS_WGS72_UTM_zone_30N, 32230)
+ValuePair(PCS_WGS72_UTM_zone_31N, 32231)
+ValuePair(PCS_WGS72_UTM_zone_32N, 32232)
+ValuePair(PCS_WGS72_UTM_zone_33N, 32233)
+ValuePair(PCS_WGS72_UTM_zone_34N, 32234)
+ValuePair(PCS_WGS72_UTM_zone_35N, 32235)
+ValuePair(PCS_WGS72_UTM_zone_36N, 32236)
+ValuePair(PCS_WGS72_UTM_zone_37N, 32237)
+ValuePair(PCS_WGS72_UTM_zone_38N, 32238)
+ValuePair(PCS_WGS72_UTM_zone_39N, 32239)
+ValuePair(PCS_WGS72_UTM_zone_40N, 32240)
+ValuePair(PCS_WGS72_UTM_zone_41N, 32241)
+ValuePair(PCS_WGS72_UTM_zone_42N, 32242)
+ValuePair(PCS_WGS72_UTM_zone_43N, 32243)
+ValuePair(PCS_WGS72_UTM_zone_44N, 32244)
+ValuePair(PCS_WGS72_UTM_zone_45N, 32245)
+ValuePair(PCS_WGS72_UTM_zone_46N, 32246)
+ValuePair(PCS_WGS72_UTM_zone_47N, 32247)
+ValuePair(PCS_WGS72_UTM_zone_48N, 32248)
+ValuePair(PCS_WGS72_UTM_zone_49N, 32249)
+ValuePair(PCS_WGS72_UTM_zone_50N, 32250)
+ValuePair(PCS_WGS72_UTM_zone_51N, 32251)
+ValuePair(PCS_WGS72_UTM_zone_52N, 32252)
+ValuePair(PCS_WGS72_UTM_zone_53N, 32253)
+ValuePair(PCS_WGS72_UTM_zone_54N, 32254)
+ValuePair(PCS_WGS72_UTM_zone_55N, 32255)
+ValuePair(PCS_WGS72_UTM_zone_56N, 32256)
+ValuePair(PCS_WGS72_UTM_zone_57N, 32257)
+ValuePair(PCS_WGS72_UTM_zone_58N, 32258)
+ValuePair(PCS_WGS72_UTM_zone_59N, 32259)
+ValuePair(PCS_WGS72_UTM_zone_60N, 32260)
+ValuePair(PCS_WGS72_UTM_zone_1S, 32301)
+ValuePair(PCS_WGS72_UTM_zone_2S, 32302)
+ValuePair(PCS_WGS72_UTM_zone_3S, 32303)
+ValuePair(PCS_WGS72_UTM_zone_4S, 32304)
+ValuePair(PCS_WGS72_UTM_zone_5S, 32305)
+ValuePair(PCS_WGS72_UTM_zone_6S, 32306)
+ValuePair(PCS_WGS72_UTM_zone_7S, 32307)
+ValuePair(PCS_WGS72_UTM_zone_8S, 32308)
+ValuePair(PCS_WGS72_UTM_zone_9S, 32309)
+ValuePair(PCS_WGS72_UTM_zone_10S, 32310)
+ValuePair(PCS_WGS72_UTM_zone_11S, 32311)
+ValuePair(PCS_WGS72_UTM_zone_12S, 32312)
+ValuePair(PCS_WGS72_UTM_zone_13S, 32313)
+ValuePair(PCS_WGS72_UTM_zone_14S, 32314)
+ValuePair(PCS_WGS72_UTM_zone_15S, 32315)
+ValuePair(PCS_WGS72_UTM_zone_16S, 32316)
+ValuePair(PCS_WGS72_UTM_zone_17S, 32317)
+ValuePair(PCS_WGS72_UTM_zone_18S, 32318)
+ValuePair(PCS_WGS72_UTM_zone_19S, 32319)
+ValuePair(PCS_WGS72_UTM_zone_20S, 32320)
+ValuePair(PCS_WGS72_UTM_zone_21S, 32321)
+ValuePair(PCS_WGS72_UTM_zone_22S, 32322)
+ValuePair(PCS_WGS72_UTM_zone_23S, 32323)
+ValuePair(PCS_WGS72_UTM_zone_24S, 32324)
+ValuePair(PCS_WGS72_UTM_zone_25S, 32325)
+ValuePair(PCS_WGS72_UTM_zone_26S, 32326)
+ValuePair(PCS_WGS72_UTM_zone_27S, 32327)
+ValuePair(PCS_WGS72_UTM_zone_28S, 32328)
+ValuePair(PCS_WGS72_UTM_zone_29S, 32329)
+ValuePair(PCS_WGS72_UTM_zone_30S, 32330)
+ValuePair(PCS_WGS72_UTM_zone_31S, 32331)
+ValuePair(PCS_WGS72_UTM_zone_32S, 32332)
+ValuePair(PCS_WGS72_UTM_zone_33S, 32333)
+ValuePair(PCS_WGS72_UTM_zone_34S, 32334)
+ValuePair(PCS_WGS72_UTM_zone_35S, 32335)
+ValuePair(PCS_WGS72_UTM_zone_36S, 32336)
+ValuePair(PCS_WGS72_UTM_zone_37S, 32337)
+ValuePair(PCS_WGS72_UTM_zone_38S, 32338)
+ValuePair(PCS_WGS72_UTM_zone_39S, 32339)
+ValuePair(PCS_WGS72_UTM_zone_40S, 32340)
+ValuePair(PCS_WGS72_UTM_zone_41S, 32341)
+ValuePair(PCS_WGS72_UTM_zone_42S, 32342)
+ValuePair(PCS_WGS72_UTM_zone_43S, 32343)
+ValuePair(PCS_WGS72_UTM_zone_44S, 32344)
+ValuePair(PCS_WGS72_UTM_zone_45S, 32345)
+ValuePair(PCS_WGS72_UTM_zone_46S, 32346)
+ValuePair(PCS_WGS72_UTM_zone_47S, 32347)
+ValuePair(PCS_WGS72_UTM_zone_48S, 32348)
+ValuePair(PCS_WGS72_UTM_zone_49S, 32349)
+ValuePair(PCS_WGS72_UTM_zone_50S, 32350)
+ValuePair(PCS_WGS72_UTM_zone_51S, 32351)
+ValuePair(PCS_WGS72_UTM_zone_52S, 32352)
+ValuePair(PCS_WGS72_UTM_zone_53S, 32353)
+ValuePair(PCS_WGS72_UTM_zone_54S, 32354)
+ValuePair(PCS_WGS72_UTM_zone_55S, 32355)
+ValuePair(PCS_WGS72_UTM_zone_56S, 32356)
+ValuePair(PCS_WGS72_UTM_zone_57S, 32357)
+ValuePair(PCS_WGS72_UTM_zone_58S, 32358)
+ValuePair(PCS_WGS72_UTM_zone_59S, 32359)
+ValuePair(PCS_WGS72_UTM_zone_60S, 32360)
+ValuePair(PCS_WGS72BE_UTM_zone_1N, 32401)
+ValuePair(PCS_WGS72BE_UTM_zone_2N, 32402)
+ValuePair(PCS_WGS72BE_UTM_zone_3N, 32403)
+ValuePair(PCS_WGS72BE_UTM_zone_4N, 32404)
+ValuePair(PCS_WGS72BE_UTM_zone_5N, 32405)
+ValuePair(PCS_WGS72BE_UTM_zone_6N, 32406)
+ValuePair(PCS_WGS72BE_UTM_zone_7N, 32407)
+ValuePair(PCS_WGS72BE_UTM_zone_8N, 32408)
+ValuePair(PCS_WGS72BE_UTM_zone_9N, 32409)
+ValuePair(PCS_WGS72BE_UTM_zone_10N, 32410)
+ValuePair(PCS_WGS72BE_UTM_zone_11N, 32411)
+ValuePair(PCS_WGS72BE_UTM_zone_12N, 32412)
+ValuePair(PCS_WGS72BE_UTM_zone_13N, 32413)
+ValuePair(PCS_WGS72BE_UTM_zone_14N, 32414)
+ValuePair(PCS_WGS72BE_UTM_zone_15N, 32415)
+ValuePair(PCS_WGS72BE_UTM_zone_16N, 32416)
+ValuePair(PCS_WGS72BE_UTM_zone_17N, 32417)
+ValuePair(PCS_WGS72BE_UTM_zone_18N, 32418)
+ValuePair(PCS_WGS72BE_UTM_zone_19N, 32419)
+ValuePair(PCS_WGS72BE_UTM_zone_20N, 32420)
+ValuePair(PCS_WGS72BE_UTM_zone_21N, 32421)
+ValuePair(PCS_WGS72BE_UTM_zone_22N, 32422)
+ValuePair(PCS_WGS72BE_UTM_zone_23N, 32423)
+ValuePair(PCS_WGS72BE_UTM_zone_24N, 32424)
+ValuePair(PCS_WGS72BE_UTM_zone_25N, 32425)
+ValuePair(PCS_WGS72BE_UTM_zone_26N, 32426)
+ValuePair(PCS_WGS72BE_UTM_zone_27N, 32427)
+ValuePair(PCS_WGS72BE_UTM_zone_28N, 32428)
+ValuePair(PCS_WGS72BE_UTM_zone_29N, 32429)
+ValuePair(PCS_WGS72BE_UTM_zone_30N, 32430)
+ValuePair(PCS_WGS72BE_UTM_zone_31N, 32431)
+ValuePair(PCS_WGS72BE_UTM_zone_32N, 32432)
+ValuePair(PCS_WGS72BE_UTM_zone_33N, 32433)
+ValuePair(PCS_WGS72BE_UTM_zone_34N, 32434)
+ValuePair(PCS_WGS72BE_UTM_zone_35N, 32435)
+ValuePair(PCS_WGS72BE_UTM_zone_36N, 32436)
+ValuePair(PCS_WGS72BE_UTM_zone_37N, 32437)
+ValuePair(PCS_WGS72BE_UTM_zone_38N, 32438)
+ValuePair(PCS_WGS72BE_UTM_zone_39N, 32439)
+ValuePair(PCS_WGS72BE_UTM_zone_40N, 32440)
+ValuePair(PCS_WGS72BE_UTM_zone_41N, 32441)
+ValuePair(PCS_WGS72BE_UTM_zone_42N, 32442)
+ValuePair(PCS_WGS72BE_UTM_zone_43N, 32443)
+ValuePair(PCS_WGS72BE_UTM_zone_44N, 32444)
+ValuePair(PCS_WGS72BE_UTM_zone_45N, 32445)
+ValuePair(PCS_WGS72BE_UTM_zone_46N, 32446)
+ValuePair(PCS_WGS72BE_UTM_zone_47N, 32447)
+ValuePair(PCS_WGS72BE_UTM_zone_48N, 32448)
+ValuePair(PCS_WGS72BE_UTM_zone_49N, 32449)
+ValuePair(PCS_WGS72BE_UTM_zone_50N, 32450)
+ValuePair(PCS_WGS72BE_UTM_zone_51N, 32451)
+ValuePair(PCS_WGS72BE_UTM_zone_52N, 32452)
+ValuePair(PCS_WGS72BE_UTM_zone_53N, 32453)
+ValuePair(PCS_WGS72BE_UTM_zone_54N, 32454)
+ValuePair(PCS_WGS72BE_UTM_zone_55N, 32455)
+ValuePair(PCS_WGS72BE_UTM_zone_56N, 32456)
+ValuePair(PCS_WGS72BE_UTM_zone_57N, 32457)
+ValuePair(PCS_WGS72BE_UTM_zone_58N, 32458)
+ValuePair(PCS_WGS72BE_UTM_zone_59N, 32459)
+ValuePair(PCS_WGS72BE_UTM_zone_60N, 32460)
+ValuePair(PCS_WGS72BE_UTM_zone_1S, 32501)
+ValuePair(PCS_WGS72BE_UTM_zone_2S, 32502)
+ValuePair(PCS_WGS72BE_UTM_zone_3S, 32503)
+ValuePair(PCS_WGS72BE_UTM_zone_4S, 32504)
+ValuePair(PCS_WGS72BE_UTM_zone_5S, 32505)
+ValuePair(PCS_WGS72BE_UTM_zone_6S, 32506)
+ValuePair(PCS_WGS72BE_UTM_zone_7S, 32507)
+ValuePair(PCS_WGS72BE_UTM_zone_8S, 32508)
+ValuePair(PCS_WGS72BE_UTM_zone_9S, 32509)
+ValuePair(PCS_WGS72BE_UTM_zone_10S, 32510)
+ValuePair(PCS_WGS72BE_UTM_zone_11S, 32511)
+ValuePair(PCS_WGS72BE_UTM_zone_12S, 32512)
+ValuePair(PCS_WGS72BE_UTM_zone_13S, 32513)
+ValuePair(PCS_WGS72BE_UTM_zone_14S, 32514)
+ValuePair(PCS_WGS72BE_UTM_zone_15S, 32515)
+ValuePair(PCS_WGS72BE_UTM_zone_16S, 32516)
+ValuePair(PCS_WGS72BE_UTM_zone_17S, 32517)
+ValuePair(PCS_WGS72BE_UTM_zone_18S, 32518)
+ValuePair(PCS_WGS72BE_UTM_zone_19S, 32519)
+ValuePair(PCS_WGS72BE_UTM_zone_20S, 32520)
+ValuePair(PCS_WGS72BE_UTM_zone_21S, 32521)
+ValuePair(PCS_WGS72BE_UTM_zone_22S, 32522)
+ValuePair(PCS_WGS72BE_UTM_zone_23S, 32523)
+ValuePair(PCS_WGS72BE_UTM_zone_24S, 32524)
+ValuePair(PCS_WGS72BE_UTM_zone_25S, 32525)
+ValuePair(PCS_WGS72BE_UTM_zone_26S, 32526)
+ValuePair(PCS_WGS72BE_UTM_zone_27S, 32527)
+ValuePair(PCS_WGS72BE_UTM_zone_28S, 32528)
+ValuePair(PCS_WGS72BE_UTM_zone_29S, 32529)
+ValuePair(PCS_WGS72BE_UTM_zone_30S, 32530)
+ValuePair(PCS_WGS72BE_UTM_zone_31S, 32531)
+ValuePair(PCS_WGS72BE_UTM_zone_32S, 32532)
+ValuePair(PCS_WGS72BE_UTM_zone_33S, 32533)
+ValuePair(PCS_WGS72BE_UTM_zone_34S, 32534)
+ValuePair(PCS_WGS72BE_UTM_zone_35S, 32535)
+ValuePair(PCS_WGS72BE_UTM_zone_36S, 32536)
+ValuePair(PCS_WGS72BE_UTM_zone_37S, 32537)
+ValuePair(PCS_WGS72BE_UTM_zone_38S, 32538)
+ValuePair(PCS_WGS72BE_UTM_zone_39S, 32539)
+ValuePair(PCS_WGS72BE_UTM_zone_40S, 32540)
+ValuePair(PCS_WGS72BE_UTM_zone_41S, 32541)
+ValuePair(PCS_WGS72BE_UTM_zone_42S, 32542)
+ValuePair(PCS_WGS72BE_UTM_zone_43S, 32543)
+ValuePair(PCS_WGS72BE_UTM_zone_44S, 32544)
+ValuePair(PCS_WGS72BE_UTM_zone_45S, 32545)
+ValuePair(PCS_WGS72BE_UTM_zone_46S, 32546)
+ValuePair(PCS_WGS72BE_UTM_zone_47S, 32547)
+ValuePair(PCS_WGS72BE_UTM_zone_48S, 32548)
+ValuePair(PCS_WGS72BE_UTM_zone_49S, 32549)
+ValuePair(PCS_WGS72BE_UTM_zone_50S, 32550)
+ValuePair(PCS_WGS72BE_UTM_zone_51S, 32551)
+ValuePair(PCS_WGS72BE_UTM_zone_52S, 32552)
+ValuePair(PCS_WGS72BE_UTM_zone_53S, 32553)
+ValuePair(PCS_WGS72BE_UTM_zone_54S, 32554)
+ValuePair(PCS_WGS72BE_UTM_zone_55S, 32555)
+ValuePair(PCS_WGS72BE_UTM_zone_56S, 32556)
+ValuePair(PCS_WGS72BE_UTM_zone_57S, 32557)
+ValuePair(PCS_WGS72BE_UTM_zone_58S, 32558)
+ValuePair(PCS_WGS72BE_UTM_zone_59S, 32559)
+ValuePair(PCS_WGS72BE_UTM_zone_60S, 32560)
+ValuePair(PCS_WGS84_UTM_zone_1N, 32601)
+ValuePair(PCS_WGS84_UTM_zone_2N, 32602)
+ValuePair(PCS_WGS84_UTM_zone_3N, 32603)
+ValuePair(PCS_WGS84_UTM_zone_4N, 32604)
+ValuePair(PCS_WGS84_UTM_zone_5N, 32605)
+ValuePair(PCS_WGS84_UTM_zone_6N, 32606)
+ValuePair(PCS_WGS84_UTM_zone_7N, 32607)
+ValuePair(PCS_WGS84_UTM_zone_8N, 32608)
+ValuePair(PCS_WGS84_UTM_zone_9N, 32609)
+ValuePair(PCS_WGS84_UTM_zone_10N, 32610)
+ValuePair(PCS_WGS84_UTM_zone_11N, 32611)
+ValuePair(PCS_WGS84_UTM_zone_12N, 32612)
+ValuePair(PCS_WGS84_UTM_zone_13N, 32613)
+ValuePair(PCS_WGS84_UTM_zone_14N, 32614)
+ValuePair(PCS_WGS84_UTM_zone_15N, 32615)
+ValuePair(PCS_WGS84_UTM_zone_16N, 32616)
+ValuePair(PCS_WGS84_UTM_zone_17N, 32617)
+ValuePair(PCS_WGS84_UTM_zone_18N, 32618)
+ValuePair(PCS_WGS84_UTM_zone_19N, 32619)
+ValuePair(PCS_WGS84_UTM_zone_20N, 32620)
+ValuePair(PCS_WGS84_UTM_zone_21N, 32621)
+ValuePair(PCS_WGS84_UTM_zone_22N, 32622)
+ValuePair(PCS_WGS84_UTM_zone_23N, 32623)
+ValuePair(PCS_WGS84_UTM_zone_24N, 32624)
+ValuePair(PCS_WGS84_UTM_zone_25N, 32625)
+ValuePair(PCS_WGS84_UTM_zone_26N, 32626)
+ValuePair(PCS_WGS84_UTM_zone_27N, 32627)
+ValuePair(PCS_WGS84_UTM_zone_28N, 32628)
+ValuePair(PCS_WGS84_UTM_zone_29N, 32629)
+ValuePair(PCS_WGS84_UTM_zone_30N, 32630)
+ValuePair(PCS_WGS84_UTM_zone_31N, 32631)
+ValuePair(PCS_WGS84_UTM_zone_32N, 32632)
+ValuePair(PCS_WGS84_UTM_zone_33N, 32633)
+ValuePair(PCS_WGS84_UTM_zone_34N, 32634)
+ValuePair(PCS_WGS84_UTM_zone_35N, 32635)
+ValuePair(PCS_WGS84_UTM_zone_36N, 32636)
+ValuePair(PCS_WGS84_UTM_zone_37N, 32637)
+ValuePair(PCS_WGS84_UTM_zone_38N, 32638)
+ValuePair(PCS_WGS84_UTM_zone_39N, 32639)
+ValuePair(PCS_WGS84_UTM_zone_40N, 32640)
+ValuePair(PCS_WGS84_UTM_zone_41N, 32641)
+ValuePair(PCS_WGS84_UTM_zone_42N, 32642)
+ValuePair(PCS_WGS84_UTM_zone_43N, 32643)
+ValuePair(PCS_WGS84_UTM_zone_44N, 32644)
+ValuePair(PCS_WGS84_UTM_zone_45N, 32645)
+ValuePair(PCS_WGS84_UTM_zone_46N, 32646)
+ValuePair(PCS_WGS84_UTM_zone_47N, 32647)
+ValuePair(PCS_WGS84_UTM_zone_48N, 32648)
+ValuePair(PCS_WGS84_UTM_zone_49N, 32649)
+ValuePair(PCS_WGS84_UTM_zone_50N, 32650)
+ValuePair(PCS_WGS84_UTM_zone_51N, 32651)
+ValuePair(PCS_WGS84_UTM_zone_52N, 32652)
+ValuePair(PCS_WGS84_UTM_zone_53N, 32653)
+ValuePair(PCS_WGS84_UTM_zone_54N, 32654)
+ValuePair(PCS_WGS84_UTM_zone_55N, 32655)
+ValuePair(PCS_WGS84_UTM_zone_56N, 32656)
+ValuePair(PCS_WGS84_UTM_zone_57N, 32657)
+ValuePair(PCS_WGS84_UTM_zone_58N, 32658)
+ValuePair(PCS_WGS84_UTM_zone_59N, 32659)
+ValuePair(PCS_WGS84_UTM_zone_60N, 32660)
+ValuePair(PCS_WGS84_UTM_zone_1S, 32701)
+ValuePair(PCS_WGS84_UTM_zone_2S, 32702)
+ValuePair(PCS_WGS84_UTM_zone_3S, 32703)
+ValuePair(PCS_WGS84_UTM_zone_4S, 32704)
+ValuePair(PCS_WGS84_UTM_zone_5S, 32705)
+ValuePair(PCS_WGS84_UTM_zone_6S, 32706)
+ValuePair(PCS_WGS84_UTM_zone_7S, 32707)
+ValuePair(PCS_WGS84_UTM_zone_8S, 32708)
+ValuePair(PCS_WGS84_UTM_zone_9S, 32709)
+ValuePair(PCS_WGS84_UTM_zone_10S, 32710)
+ValuePair(PCS_WGS84_UTM_zone_11S, 32711)
+ValuePair(PCS_WGS84_UTM_zone_12S, 32712)
+ValuePair(PCS_WGS84_UTM_zone_13S, 32713)
+ValuePair(PCS_WGS84_UTM_zone_14S, 32714)
+ValuePair(PCS_WGS84_UTM_zone_15S, 32715)
+ValuePair(PCS_WGS84_UTM_zone_16S, 32716)
+ValuePair(PCS_WGS84_UTM_zone_17S, 32717)
+ValuePair(PCS_WGS84_UTM_zone_18S, 32718)
+ValuePair(PCS_WGS84_UTM_zone_19S, 32719)
+ValuePair(PCS_WGS84_UTM_zone_20S, 32720)
+ValuePair(PCS_WGS84_UTM_zone_21S, 32721)
+ValuePair(PCS_WGS84_UTM_zone_22S, 32722)
+ValuePair(PCS_WGS84_UTM_zone_23S, 32723)
+ValuePair(PCS_WGS84_UTM_zone_24S, 32724)
+ValuePair(PCS_WGS84_UTM_zone_25S, 32725)
+ValuePair(PCS_WGS84_UTM_zone_26S, 32726)
+ValuePair(PCS_WGS84_UTM_zone_27S, 32727)
+ValuePair(PCS_WGS84_UTM_zone_28S, 32728)
+ValuePair(PCS_WGS84_UTM_zone_29S, 32729)
+ValuePair(PCS_WGS84_UTM_zone_30S, 32730)
+ValuePair(PCS_WGS84_UTM_zone_31S, 32731)
+ValuePair(PCS_WGS84_UTM_zone_32S, 32732)
+ValuePair(PCS_WGS84_UTM_zone_33S, 32733)
+ValuePair(PCS_WGS84_UTM_zone_34S, 32734)
+ValuePair(PCS_WGS84_UTM_zone_35S, 32735)
+ValuePair(PCS_WGS84_UTM_zone_36S, 32736)
+ValuePair(PCS_WGS84_UTM_zone_37S, 32737)
+ValuePair(PCS_WGS84_UTM_zone_38S, 32738)
+ValuePair(PCS_WGS84_UTM_zone_39S, 32739)
+ValuePair(PCS_WGS84_UTM_zone_40S, 32740)
+ValuePair(PCS_WGS84_UTM_zone_41S, 32741)
+ValuePair(PCS_WGS84_UTM_zone_42S, 32742)
+ValuePair(PCS_WGS84_UTM_zone_43S, 32743)
+ValuePair(PCS_WGS84_UTM_zone_44S, 32744)
+ValuePair(PCS_WGS84_UTM_zone_45S, 32745)
+ValuePair(PCS_WGS84_UTM_zone_46S, 32746)
+ValuePair(PCS_WGS84_UTM_zone_47S, 32747)
+ValuePair(PCS_WGS84_UTM_zone_48S, 32748)
+ValuePair(PCS_WGS84_UTM_zone_49S, 32749)
+ValuePair(PCS_WGS84_UTM_zone_50S, 32750)
+ValuePair(PCS_WGS84_UTM_zone_51S, 32751)
+ValuePair(PCS_WGS84_UTM_zone_52S, 32752)
+ValuePair(PCS_WGS84_UTM_zone_53S, 32753)
+ValuePair(PCS_WGS84_UTM_zone_54S, 32754)
+ValuePair(PCS_WGS84_UTM_zone_55S, 32755)
+ValuePair(PCS_WGS84_UTM_zone_56S, 32756)
+ValuePair(PCS_WGS84_UTM_zone_57S, 32757)
+ValuePair(PCS_WGS84_UTM_zone_58S, 32758)
+ValuePair(PCS_WGS84_UTM_zone_59S, 32759)
+ValuePair(PCS_WGS84_UTM_zone_60S, 32760)
+/* end of list */
diff --git a/src/tiff/epsg_pm.inc b/src/tiff/epsg_pm.inc
new file mode 100644
index 0000000..1e41598
--- /dev/null
+++ b/src/tiff/epsg_pm.inc
@@ -0,0 +1,22 @@
+/* EPSG/GeoTIFF Rev 0.2 Prime Meridian Database */
+
+/* C database for Geotiff include files. */
+/* the macro ValuePair() must be defined */
+/* by the enclosing include file */
+
+#ifdef INCLUDE_OLD_CODES
+#include old_pm.inc
+#endif /* OLD Codes */
+
+ValuePair(PM_Greenwich, 8901)
+ValuePair(PM_Lisbon, 8902)
+ValuePair(PM_Paris, 8903)
+ValuePair(PM_Bogota, 8904)
+ValuePair(PM_Madrid, 8905)
+ValuePair(PM_Rome, 8906)
+ValuePair(PM_Bern, 8907)
+ValuePair(PM_Jakarta, 8908)
+ValuePair(PM_Ferro, 8909)
+ValuePair(PM_Brussels, 8910)
+ValuePair(PM_Stockholm, 8911)
+/* end of list */
diff --git a/src/tiff/epsg_proj.inc b/src/tiff/epsg_proj.inc
new file mode 100644
index 0000000..d6c8791
--- /dev/null
+++ b/src/tiff/epsg_proj.inc
@@ -0,0 +1,443 @@
+/*
+ * EPSG/POSC Projection Codes - GeoTIFF Rev 0.2
+ */
+
+/* C database for Geotiff include files. */
+/* the macro ValuePair() must be defined */
+/* by the enclosing include file */
+
+#ifdef INCLUDE_OLD_CODES
+#include old_proj.inc
+#endif /* OLD Codes */
+
+/* New codes */
+
+ValuePair(Proj_Stereo_70,19926)
+
+/* old codes */
+
+ValuePair(Proj_Alabama_CS27_East, 10101)
+ValuePair(Proj_Alabama_CS27_West, 10102)
+ValuePair(Proj_Alabama_CS83_East, 10131)
+ValuePair(Proj_Alabama_CS83_West, 10132)
+ValuePair(Proj_Arizona_Coordinate_System_east, 10201)
+ValuePair(Proj_Arizona_Coordinate_System_Central, 10202)
+ValuePair(Proj_Arizona_Coordinate_System_west, 10203)
+ValuePair(Proj_Arizona_CS83_east, 10231)
+ValuePair(Proj_Arizona_CS83_Central, 10232)
+ValuePair(Proj_Arizona_CS83_west, 10233)
+ValuePair(Proj_Arkansas_CS27_North, 10301)
+ValuePair(Proj_Arkansas_CS27_South, 10302)
+ValuePair(Proj_Arkansas_CS83_North, 10331)
+ValuePair(Proj_Arkansas_CS83_South, 10332)
+ValuePair(Proj_California_CS27_I, 10401)
+ValuePair(Proj_California_CS27_II, 10402)
+ValuePair(Proj_California_CS27_III, 10403)
+ValuePair(Proj_California_CS27_IV, 10404)
+ValuePair(Proj_California_CS27_V, 10405)
+ValuePair(Proj_California_CS27_VI, 10406)
+ValuePair(Proj_California_CS27_VII, 10407)
+ValuePair(Proj_California_CS83_1, 10431)
+ValuePair(Proj_California_CS83_2, 10432)
+ValuePair(Proj_California_CS83_3, 10433)
+ValuePair(Proj_California_CS83_4, 10434)
+ValuePair(Proj_California_CS83_5, 10435)
+ValuePair(Proj_California_CS83_6, 10436)
+ValuePair(Proj_Colorado_CS27_North, 10501)
+ValuePair(Proj_Colorado_CS27_Central, 10502)
+ValuePair(Proj_Colorado_CS27_South, 10503)
+ValuePair(Proj_Colorado_CS83_North, 10531)
+ValuePair(Proj_Colorado_CS83_Central, 10532)
+ValuePair(Proj_Colorado_CS83_South, 10533)
+ValuePair(Proj_Connecticut_CS27, 10600)
+ValuePair(Proj_Connecticut_CS83, 10630)
+ValuePair(Proj_Delaware_CS27, 10700)
+ValuePair(Proj_Delaware_CS83, 10730)
+ValuePair(Proj_Florida_CS27_East, 10901)
+ValuePair(Proj_Florida_CS27_West, 10902)
+ValuePair(Proj_Florida_CS27_North, 10903)
+ValuePair(Proj_Florida_CS83_East, 10931)
+ValuePair(Proj_Florida_CS83_West, 10932)
+ValuePair(Proj_Florida_CS83_North, 10933)
+ValuePair(Proj_Georgia_CS27_East, 11001)
+ValuePair(Proj_Georgia_CS27_West, 11002)
+ValuePair(Proj_Georgia_CS83_East, 11031)
+ValuePair(Proj_Georgia_CS83_West, 11032)
+ValuePair(Proj_Idaho_CS27_East, 11101)
+ValuePair(Proj_Idaho_CS27_Central, 11102)
+ValuePair(Proj_Idaho_CS27_West, 11103)
+ValuePair(Proj_Idaho_CS83_East, 11131)
+ValuePair(Proj_Idaho_CS83_Central, 11132)
+ValuePair(Proj_Idaho_CS83_West, 11133)
+ValuePair(Proj_Illinois_CS27_East, 11201)
+ValuePair(Proj_Illinois_CS27_West, 11202)
+ValuePair(Proj_Illinois_CS83_East, 11231)
+ValuePair(Proj_Illinois_CS83_West, 11232)
+ValuePair(Proj_Indiana_CS27_East, 11301)
+ValuePair(Proj_Indiana_CS27_West, 11302)
+ValuePair(Proj_Indiana_CS83_East, 11331)
+ValuePair(Proj_Indiana_CS83_West, 11332)
+ValuePair(Proj_Iowa_CS27_North, 11401)
+ValuePair(Proj_Iowa_CS27_South, 11402)
+ValuePair(Proj_Iowa_CS83_North, 11431)
+ValuePair(Proj_Iowa_CS83_South, 11432)
+ValuePair(Proj_Kansas_CS27_North, 11501)
+ValuePair(Proj_Kansas_CS27_South, 11502)
+ValuePair(Proj_Kansas_CS83_North, 11531)
+ValuePair(Proj_Kansas_CS83_South, 11532)
+ValuePair(Proj_Kentucky_CS27_North, 11601)
+ValuePair(Proj_Kentucky_CS27_South, 11602)
+ValuePair(Proj_Kentucky_CS83_North, 15303)
+ValuePair(Proj_Kentucky_CS83_South, 11632)
+ValuePair(Proj_Louisiana_CS27_North, 11701)
+ValuePair(Proj_Louisiana_CS27_South, 11702)
+ValuePair(Proj_Louisiana_CS83_North, 11731)
+ValuePair(Proj_Louisiana_CS83_South, 11732)
+ValuePair(Proj_Maine_CS27_East, 11801)
+ValuePair(Proj_Maine_CS27_West, 11802)
+ValuePair(Proj_Maine_CS83_East, 11831)
+ValuePair(Proj_Maine_CS83_West, 11832)
+ValuePair(Proj_Maryland_CS27, 11900)
+ValuePair(Proj_Maryland_CS83, 11930)
+ValuePair(Proj_Massachusetts_CS27_Mainland, 12001)
+ValuePair(Proj_Massachusetts_CS27_Island, 12002)
+ValuePair(Proj_Massachusetts_CS83_Mainland, 12031)
+ValuePair(Proj_Massachusetts_CS83_Island, 12032)
+ValuePair(Proj_Michigan_State_Plane_East, 12101)
+ValuePair(Proj_Michigan_State_Plane_Old_Central, 12102)
+ValuePair(Proj_Michigan_State_Plane_West, 12103)
+ValuePair(Proj_Michigan_CS27_North, 12111)
+ValuePair(Proj_Michigan_CS27_Central, 12112)
+ValuePair(Proj_Michigan_CS27_South, 12113)
+ValuePair(Proj_Michigan_CS83_North, 12141)
+ValuePair(Proj_Michigan_CS83_Central, 12142)
+ValuePair(Proj_Michigan_CS83_South, 12143)
+ValuePair(Proj_Minnesota_CS27_North, 12201)
+ValuePair(Proj_Minnesota_CS27_Central, 12202)
+ValuePair(Proj_Minnesota_CS27_South, 12203)
+ValuePair(Proj_Minnesota_CS83_North, 12231)
+ValuePair(Proj_Minnesota_CS83_Central, 12232)
+ValuePair(Proj_Minnesota_CS83_South, 12233)
+ValuePair(Proj_Mississippi_CS27_East, 12301)
+ValuePair(Proj_Mississippi_CS27_West, 12302)
+ValuePair(Proj_Mississippi_CS83_East, 12331)
+ValuePair(Proj_Mississippi_CS83_West, 12332)
+ValuePair(Proj_Missouri_CS27_East, 12401)
+ValuePair(Proj_Missouri_CS27_Central, 12402)
+ValuePair(Proj_Missouri_CS27_West, 12403)
+ValuePair(Proj_Missouri_CS83_East, 12431)
+ValuePair(Proj_Missouri_CS83_Central, 12432)
+ValuePair(Proj_Missouri_CS83_West, 12433)
+ValuePair(Proj_Montana_CS27_North, 12501)
+ValuePair(Proj_Montana_CS27_Central, 12502)
+ValuePair(Proj_Montana_CS27_South, 12503)
+ValuePair(Proj_Montana_CS83, 12530)
+ValuePair(Proj_Nebraska_CS27_North, 12601)
+ValuePair(Proj_Nebraska_CS27_South, 12602)
+ValuePair(Proj_Nebraska_CS83, 12630)
+ValuePair(Proj_Nevada_CS27_East, 12701)
+ValuePair(Proj_Nevada_CS27_Central, 12702)
+ValuePair(Proj_Nevada_CS27_West, 12703)
+ValuePair(Proj_Nevada_CS83_East, 12731)
+ValuePair(Proj_Nevada_CS83_Central, 12732)
+ValuePair(Proj_Nevada_CS83_West, 12733)
+ValuePair(Proj_New_Hampshire_CS27, 12800)
+ValuePair(Proj_New_Hampshire_CS83, 12830)
+ValuePair(Proj_New_Jersey_CS27, 12900)
+ValuePair(Proj_New_Jersey_CS83, 12930)
+ValuePair(Proj_New_Mexico_CS27_East, 13001)
+ValuePair(Proj_New_Mexico_CS27_Central, 13002)
+ValuePair(Proj_New_Mexico_CS27_West, 13003)
+ValuePair(Proj_New_Mexico_CS83_East, 13031)
+ValuePair(Proj_New_Mexico_CS83_Central, 13032)
+ValuePair(Proj_New_Mexico_CS83_West, 13033)
+ValuePair(Proj_New_York_CS27_East, 13101)
+ValuePair(Proj_New_York_CS27_Central, 13102)
+ValuePair(Proj_New_York_CS27_West, 13103)
+ValuePair(Proj_New_York_CS27_Long_Island, 13104)
+ValuePair(Proj_New_York_CS83_East, 13131)
+ValuePair(Proj_New_York_CS83_Central, 13132)
+ValuePair(Proj_New_York_CS83_West, 13133)
+ValuePair(Proj_New_York_CS83_Long_Island, 13134)
+ValuePair(Proj_North_Carolina_CS27, 13200)
+ValuePair(Proj_North_Carolina_CS83, 13230)
+ValuePair(Proj_North_Dakota_CS27_North, 13301)
+ValuePair(Proj_North_Dakota_CS27_South, 13302)
+ValuePair(Proj_North_Dakota_CS83_North, 13331)
+ValuePair(Proj_North_Dakota_CS83_South, 13332)
+ValuePair(Proj_Ohio_CS27_North, 13401)
+ValuePair(Proj_Ohio_CS27_South, 13402)
+ValuePair(Proj_Ohio_CS83_North, 13431)
+ValuePair(Proj_Ohio_CS83_South, 13432)
+ValuePair(Proj_Oklahoma_CS27_North, 13501)
+ValuePair(Proj_Oklahoma_CS27_South, 13502)
+ValuePair(Proj_Oklahoma_CS83_North, 13531)
+ValuePair(Proj_Oklahoma_CS83_South, 13532)
+ValuePair(Proj_Oregon_CS27_North, 13601)
+ValuePair(Proj_Oregon_CS27_South, 13602)
+ValuePair(Proj_Oregon_CS83_North, 13631)
+ValuePair(Proj_Oregon_CS83_South, 13632)
+ValuePair(Proj_Pennsylvania_CS27_North, 13701)
+ValuePair(Proj_Pennsylvania_CS27_South, 13702)
+ValuePair(Proj_Pennsylvania_CS83_North, 13731)
+ValuePair(Proj_Pennsylvania_CS83_South, 13732)
+ValuePair(Proj_Rhode_Island_CS27, 13800)
+ValuePair(Proj_Rhode_Island_CS83, 13830)
+ValuePair(Proj_South_Carolina_CS27_North, 13901)
+ValuePair(Proj_South_Carolina_CS27_South, 13902)
+ValuePair(Proj_South_Carolina_CS83, 13930)
+ValuePair(Proj_South_Dakota_CS27_North, 14001)
+ValuePair(Proj_South_Dakota_CS27_South, 14002)
+ValuePair(Proj_South_Dakota_CS83_North, 14031)
+ValuePair(Proj_South_Dakota_CS83_South, 14032)
+ValuePair(Proj_Tennessee_CS27, 15302)
+ValuePair(Proj_Tennessee_CS83, 14130)
+ValuePair(Proj_Texas_CS27_North, 14201)
+ValuePair(Proj_Texas_CS27_North_Central, 14202)
+ValuePair(Proj_Texas_CS27_Central, 14203)
+ValuePair(Proj_Texas_CS27_South_Central, 14204)
+ValuePair(Proj_Texas_CS27_South, 14205)
+ValuePair(Proj_Texas_CS83_North, 14231)
+ValuePair(Proj_Texas_CS83_North_Central, 14232)
+ValuePair(Proj_Texas_CS83_Central, 14233)
+ValuePair(Proj_Texas_CS83_South_Central, 14234)
+ValuePair(Proj_Texas_CS83_South, 14235)
+ValuePair(Proj_Utah_CS27_North, 14301)
+ValuePair(Proj_Utah_CS27_Central, 14302)
+ValuePair(Proj_Utah_CS27_South, 14303)
+ValuePair(Proj_Utah_CS83_North, 14331)
+ValuePair(Proj_Utah_CS83_Central, 14332)
+ValuePair(Proj_Utah_CS83_South, 14333)
+ValuePair(Proj_Vermont_CS27, 14400)
+ValuePair(Proj_Vermont_CS83, 14430)
+ValuePair(Proj_Virginia_CS27_North, 14501)
+ValuePair(Proj_Virginia_CS27_South, 14502)
+ValuePair(Proj_Virginia_CS83_North, 14531)
+ValuePair(Proj_Virginia_CS83_South, 14532)
+ValuePair(Proj_Washington_CS27_North, 14601)
+ValuePair(Proj_Washington_CS27_South, 14602)
+ValuePair(Proj_Washington_CS83_North, 14631)
+ValuePair(Proj_Washington_CS83_South, 14632)
+ValuePair(Proj_West_Virginia_CS27_North, 14701)
+ValuePair(Proj_West_Virginia_CS27_South, 14702)
+ValuePair(Proj_West_Virginia_CS83_North, 14731)
+ValuePair(Proj_West_Virginia_CS83_South, 14732)
+ValuePair(Proj_Wisconsin_CS27_North, 14801)
+ValuePair(Proj_Wisconsin_CS27_Central, 14802)
+ValuePair(Proj_Wisconsin_CS27_South, 14803)
+ValuePair(Proj_Wisconsin_CS83_North, 14831)
+ValuePair(Proj_Wisconsin_CS83_Central, 14832)
+ValuePair(Proj_Wisconsin_CS83_South, 14833)
+ValuePair(Proj_Wyoming_CS27_East, 14901)
+ValuePair(Proj_Wyoming_CS27_East_Central, 14902)
+ValuePair(Proj_Wyoming_CS27_West_Central, 14903)
+ValuePair(Proj_Wyoming_CS27_West, 14904)
+ValuePair(Proj_Wyoming_CS83_East, 14931)
+ValuePair(Proj_Wyoming_CS83_East_Central, 14932)
+ValuePair(Proj_Wyoming_CS83_West_Central, 14933)
+ValuePair(Proj_Wyoming_CS83_West, 14934)
+ValuePair(Proj_Alaska_CS27_1, 15001)
+ValuePair(Proj_Alaska_CS27_2, 15002)
+ValuePair(Proj_Alaska_CS27_3, 15003)
+ValuePair(Proj_Alaska_CS27_4, 15004)
+ValuePair(Proj_Alaska_CS27_5, 15005)
+ValuePair(Proj_Alaska_CS27_6, 15006)
+ValuePair(Proj_Alaska_CS27_7, 15007)
+ValuePair(Proj_Alaska_CS27_8, 15008)
+ValuePair(Proj_Alaska_CS27_9, 15009)
+ValuePair(Proj_Alaska_CS27_10, 15010)
+ValuePair(Proj_Alaska_CS83_1, 15031)
+ValuePair(Proj_Alaska_CS83_2, 15032)
+ValuePair(Proj_Alaska_CS83_3, 15033)
+ValuePair(Proj_Alaska_CS83_4, 15034)
+ValuePair(Proj_Alaska_CS83_5, 15035)
+ValuePair(Proj_Alaska_CS83_6, 15036)
+ValuePair(Proj_Alaska_CS83_7, 15037)
+ValuePair(Proj_Alaska_CS83_8, 15038)
+ValuePair(Proj_Alaska_CS83_9, 15039)
+ValuePair(Proj_Alaska_CS83_10, 15040)
+ValuePair(Proj_Hawaii_CS27_1, 15101)
+ValuePair(Proj_Hawaii_CS27_2, 15102)
+ValuePair(Proj_Hawaii_CS27_3, 15103)
+ValuePair(Proj_Hawaii_CS27_4, 15104)
+ValuePair(Proj_Hawaii_CS27_5, 15105)
+ValuePair(Proj_Hawaii_CS83_1, 15131)
+ValuePair(Proj_Hawaii_CS83_2, 15132)
+ValuePair(Proj_Hawaii_CS83_3, 15133)
+ValuePair(Proj_Hawaii_CS83_4, 15134)
+ValuePair(Proj_Hawaii_CS83_5, 15135)
+ValuePair(Proj_Puerto_Rico_CS27, 15201)
+ValuePair(Proj_St_Croix, 15202)
+ValuePair(Proj_Puerto_Rico_Virgin_Is, 15230)
+ValuePair(Proj_BLM_14N_feet, 15914)
+ValuePair(Proj_BLM_15N_feet, 15915)
+ValuePair(Proj_BLM_16N_feet, 15916)
+ValuePair(Proj_BLM_17N_feet, 15917)
+ValuePair(Proj_UTM_zone_1N, 16001)
+ValuePair(Proj_UTM_zone_2N, 16002)
+ValuePair(Proj_UTM_zone_3N, 16003)
+ValuePair(Proj_UTM_zone_4N, 16004)
+ValuePair(Proj_UTM_zone_5N, 16005)
+ValuePair(Proj_UTM_zone_6N, 16006)
+ValuePair(Proj_UTM_zone_7N, 16007)
+ValuePair(Proj_UTM_zone_8N, 16008)
+ValuePair(Proj_UTM_zone_9N, 16009)
+ValuePair(Proj_UTM_zone_10N, 16010)
+ValuePair(Proj_UTM_zone_11N, 16011)
+ValuePair(Proj_UTM_zone_12N, 16012)
+ValuePair(Proj_UTM_zone_13N, 16013)
+ValuePair(Proj_UTM_zone_14N, 16014)
+ValuePair(Proj_UTM_zone_15N, 16015)
+ValuePair(Proj_UTM_zone_16N, 16016)
+ValuePair(Proj_UTM_zone_17N, 16017)
+ValuePair(Proj_UTM_zone_18N, 16018)
+ValuePair(Proj_UTM_zone_19N, 16019)
+ValuePair(Proj_UTM_zone_20N, 16020)
+ValuePair(Proj_UTM_zone_21N, 16021)
+ValuePair(Proj_UTM_zone_22N, 16022)
+ValuePair(Proj_UTM_zone_23N, 16023)
+ValuePair(Proj_UTM_zone_24N, 16024)
+ValuePair(Proj_UTM_zone_25N, 16025)
+ValuePair(Proj_UTM_zone_26N, 16026)
+ValuePair(Proj_UTM_zone_27N, 16027)
+ValuePair(Proj_UTM_zone_28N, 16028)
+ValuePair(Proj_UTM_zone_29N, 16029)
+ValuePair(Proj_UTM_zone_30N, 16030)
+ValuePair(Proj_UTM_zone_31N, 16031)
+ValuePair(Proj_UTM_zone_32N, 16032)
+ValuePair(Proj_UTM_zone_33N, 16033)
+ValuePair(Proj_UTM_zone_34N, 16034)
+ValuePair(Proj_UTM_zone_35N, 16035)
+ValuePair(Proj_UTM_zone_36N, 16036)
+ValuePair(Proj_UTM_zone_37N, 16037)
+ValuePair(Proj_UTM_zone_38N, 16038)
+ValuePair(Proj_UTM_zone_39N, 16039)
+ValuePair(Proj_UTM_zone_40N, 16040)
+ValuePair(Proj_UTM_zone_41N, 16041)
+ValuePair(Proj_UTM_zone_42N, 16042)
+ValuePair(Proj_UTM_zone_43N, 16043)
+ValuePair(Proj_UTM_zone_44N, 16044)
+ValuePair(Proj_UTM_zone_45N, 16045)
+ValuePair(Proj_UTM_zone_46N, 16046)
+ValuePair(Proj_UTM_zone_47N, 16047)
+ValuePair(Proj_UTM_zone_48N, 16048)
+ValuePair(Proj_UTM_zone_49N, 16049)
+ValuePair(Proj_UTM_zone_50N, 16050)
+ValuePair(Proj_UTM_zone_51N, 16051)
+ValuePair(Proj_UTM_zone_52N, 16052)
+ValuePair(Proj_UTM_zone_53N, 16053)
+ValuePair(Proj_UTM_zone_54N, 16054)
+ValuePair(Proj_UTM_zone_55N, 16055)
+ValuePair(Proj_UTM_zone_56N, 16056)
+ValuePair(Proj_UTM_zone_57N, 16057)
+ValuePair(Proj_UTM_zone_58N, 16058)
+ValuePair(Proj_UTM_zone_59N, 16059)
+ValuePair(Proj_UTM_zone_60N, 16060)
+ValuePair(Proj_UTM_zone_1S, 16101)
+ValuePair(Proj_UTM_zone_2S, 16102)
+ValuePair(Proj_UTM_zone_3S, 16103)
+ValuePair(Proj_UTM_zone_4S, 16104)
+ValuePair(Proj_UTM_zone_5S, 16105)
+ValuePair(Proj_UTM_zone_6S, 16106)
+ValuePair(Proj_UTM_zone_7S, 16107)
+ValuePair(Proj_UTM_zone_8S, 16108)
+ValuePair(Proj_UTM_zone_9S, 16109)
+ValuePair(Proj_UTM_zone_10S, 16110)
+ValuePair(Proj_UTM_zone_11S, 16111)
+ValuePair(Proj_UTM_zone_12S, 16112)
+ValuePair(Proj_UTM_zone_13S, 16113)
+ValuePair(Proj_UTM_zone_14S, 16114)
+ValuePair(Proj_UTM_zone_15S, 16115)
+ValuePair(Proj_UTM_zone_16S, 16116)
+ValuePair(Proj_UTM_zone_17S, 16117)
+ValuePair(Proj_UTM_zone_18S, 16118)
+ValuePair(Proj_UTM_zone_19S, 16119)
+ValuePair(Proj_UTM_zone_20S, 16120)
+ValuePair(Proj_UTM_zone_21S, 16121)
+ValuePair(Proj_UTM_zone_22S, 16122)
+ValuePair(Proj_UTM_zone_23S, 16123)
+ValuePair(Proj_UTM_zone_24S, 16124)
+ValuePair(Proj_UTM_zone_25S, 16125)
+ValuePair(Proj_UTM_zone_26S, 16126)
+ValuePair(Proj_UTM_zone_27S, 16127)
+ValuePair(Proj_UTM_zone_28S, 16128)
+ValuePair(Proj_UTM_zone_29S, 16129)
+ValuePair(Proj_UTM_zone_30S, 16130)
+ValuePair(Proj_UTM_zone_31S, 16131)
+ValuePair(Proj_UTM_zone_32S, 16132)
+ValuePair(Proj_UTM_zone_33S, 16133)
+ValuePair(Proj_UTM_zone_34S, 16134)
+ValuePair(Proj_UTM_zone_35S, 16135)
+ValuePair(Proj_UTM_zone_36S, 16136)
+ValuePair(Proj_UTM_zone_37S, 16137)
+ValuePair(Proj_UTM_zone_38S, 16138)
+ValuePair(Proj_UTM_zone_39S, 16139)
+ValuePair(Proj_UTM_zone_40S, 16140)
+ValuePair(Proj_UTM_zone_41S, 16141)
+ValuePair(Proj_UTM_zone_42S, 16142)
+ValuePair(Proj_UTM_zone_43S, 16143)
+ValuePair(Proj_UTM_zone_44S, 16144)
+ValuePair(Proj_UTM_zone_45S, 16145)
+ValuePair(Proj_UTM_zone_46S, 16146)
+ValuePair(Proj_UTM_zone_47S, 16147)
+ValuePair(Proj_UTM_zone_48S, 16148)
+ValuePair(Proj_UTM_zone_49S, 16149)
+ValuePair(Proj_UTM_zone_50S, 16150)
+ValuePair(Proj_UTM_zone_51S, 16151)
+ValuePair(Proj_UTM_zone_52S, 16152)
+ValuePair(Proj_UTM_zone_53S, 16153)
+ValuePair(Proj_UTM_zone_54S, 16154)
+ValuePair(Proj_UTM_zone_55S, 16155)
+ValuePair(Proj_UTM_zone_56S, 16156)
+ValuePair(Proj_UTM_zone_57S, 16157)
+ValuePair(Proj_UTM_zone_58S, 16158)
+ValuePair(Proj_UTM_zone_59S, 16159)
+ValuePair(Proj_UTM_zone_60S, 16160)
+ValuePair(Proj_Gauss_Kruger_zone_0, 16200)
+ValuePair(Proj_Gauss_Kruger_zone_1, 16201)
+ValuePair(Proj_Gauss_Kruger_zone_2, 16202)
+ValuePair(Proj_Gauss_Kruger_zone_3, 16203)
+ValuePair(Proj_Gauss_Kruger_zone_4, 16204)
+ValuePair(Proj_Gauss_Kruger_zone_5, 16205)
+ValuePair(Proj_Map_Grid_of_Australia_48, 17348)
+ValuePair(Proj_Map_Grid_of_Australia_49, 17349)
+ValuePair(Proj_Map_Grid_of_Australia_50, 17350)
+ValuePair(Proj_Map_Grid_of_Australia_51, 17351)
+ValuePair(Proj_Map_Grid_of_Australia_52, 17352)
+ValuePair(Proj_Map_Grid_of_Australia_53, 17353)
+ValuePair(Proj_Map_Grid_of_Australia_54, 17354)
+ValuePair(Proj_Map_Grid_of_Australia_55, 17355)
+ValuePair(Proj_Map_Grid_of_Australia_56, 17356)
+ValuePair(Proj_Map_Grid_of_Australia_57, 17357)
+ValuePair(Proj_Map_Grid_of_Australia_58, 17358)
+ValuePair(Proj_Australian_Map_Grid_48, 17448)
+ValuePair(Proj_Australian_Map_Grid_49, 17449)
+ValuePair(Proj_Australian_Map_Grid_50, 17450)
+ValuePair(Proj_Australian_Map_Grid_51, 17451)
+ValuePair(Proj_Australian_Map_Grid_52, 17452)
+ValuePair(Proj_Australian_Map_Grid_53, 17453)
+ValuePair(Proj_Australian_Map_Grid_54, 17454)
+ValuePair(Proj_Australian_Map_Grid_55, 17455)
+ValuePair(Proj_Australian_Map_Grid_56, 17456)
+ValuePair(Proj_Australian_Map_Grid_57, 17457)
+ValuePair(Proj_Australian_Map_Grid_58, 17458)
+ValuePair(Proj_Argentina_1, 18031)
+ValuePair(Proj_Argentina_2, 18032)
+ValuePair(Proj_Argentina_3, 18033)
+ValuePair(Proj_Argentina_4, 18034)
+ValuePair(Proj_Argentina_5, 18035)
+ValuePair(Proj_Argentina_6, 18036)
+ValuePair(Proj_Argentina_7, 18037)
+ValuePair(Proj_Colombia_3W, 18051)
+ValuePair(Proj_Colombia_Bogota, 18052)
+ValuePair(Proj_Colombia_3E, 18053)
+ValuePair(Proj_Colombia_6E, 18054)
+ValuePair(Proj_Egypt_Red_Belt, 18072)
+ValuePair(Proj_Egypt_Purple_Belt, 18073)
+ValuePair(Proj_Extended_Purple_Belt, 18074)
+ValuePair(Proj_New_Zealand_North_Island_Nat_Grid, 18141)
+ValuePair(Proj_New_Zealand_South_Island_Nat_Grid, 18142)
+ValuePair(Proj_Bahrain_Grid, 19900)
+ValuePair(Proj_Netherlands_E_Indies_Equatorial, 19905)
+ValuePair(Proj_RSO_Borneo, 19912)
+/* end of list */
diff --git a/src/tiff/epsg_units.inc b/src/tiff/epsg_units.inc
new file mode 100644
index 0000000..fe1b5db
--- /dev/null
+++ b/src/tiff/epsg_units.inc
@@ -0,0 +1,35 @@
+/*
+ * Rev. 0.2 EPSG/POSC Units Database.
+ */
+
+#ifdef INCLUDE_OLD_CODES
+#include geo_units.inc
+#endif /* OLD Codes */
+
+ValuePair(Linear_Meter, 9001)
+ValuePair(Linear_Foot, 9002)
+ValuePair(Linear_Foot_US_Survey, 9003)
+ValuePair(Linear_Foot_Modified_American, 9004)
+ValuePair(Linear_Foot_Clarke, 9005)
+ValuePair(Linear_Foot_Indian, 9006)
+ValuePair(Linear_Link, 9007)
+ValuePair(Linear_Link_Benoit, 9008)
+ValuePair(Linear_Link_Sears, 9009)
+ValuePair(Linear_Chain_Benoit, 9010)
+ValuePair(Linear_Chain_Sears, 9011)
+ValuePair(Linear_Yard_Sears, 9012)
+ValuePair(Linear_Yard_Indian, 9013)
+ValuePair(Linear_Fathom, 9014)
+ValuePair(Linear_Mile_International_Nautical, 9015)
+/*
+ * Angular Units
+ */
+ValuePair(Angular_Radian, 9101)
+ValuePair(Angular_Degree, 9102)
+ValuePair(Angular_Arc_Minute, 9103)
+ValuePair(Angular_Arc_Second, 9104)
+ValuePair(Angular_Grad, 9105)
+ValuePair(Angular_Gon, 9106)
+ValuePair(Angular_DMS, 9107)
+ValuePair(Angular_DMS_Hemisphere, 9108)
+/* end of list */
diff --git a/src/tiff/epsg_vertcs.inc b/src/tiff/epsg_vertcs.inc
new file mode 100644
index 0000000..d6b6791
--- /dev/null
+++ b/src/tiff/epsg_vertcs.inc
@@ -0,0 +1,46 @@
+/*
+ * EPSG/POSC Ellipsoid-referenced Vertical CS
+ * Note: these should correspond exactly with the Ellipsoid database.
+ */
+ValuePair(VertCS_Airy_1830_ellipsoid, 5001)
+ValuePair(VertCS_Airy_Modified_1849_ellipsoid, 5002)
+ValuePair(VertCS_ANS_ellipsoid, 5003)
+ValuePair(VertCS_Bessel_1841_ellipsoid, 5004)
+ValuePair(VertCS_Bessel_Modified_ellipsoid, 5005)
+ValuePair(VertCS_Bessel_Namibia_ellipsoid, 5006)
+ValuePair(VertCS_Clarke_1858_ellipsoid, 5007)
+ValuePair(VertCS_Clarke_1866_ellipsoid, 5008)
+ValuePair(VertCS_Clarke_1880_Benoit_ellipsoid, 5010)
+ValuePair(VertCS_Clarke_1880_IGN_ellipsoid, 5011)
+ValuePair(VertCS_Clarke_1880_RGS_ellipsoid, 5012)
+ValuePair(VertCS_Clarke_1880_Arc_ellipsoid, 5013)
+ValuePair(VertCS_Clarke_1880_SGA_1922_ellipsoid, 5014)
+ValuePair(VertCS_Everest_1830_1937_Adjustment_ellipsoid, 5015)
+ValuePair(VertCS_Everest_1830_1967_Definition_ellipsoid, 5016)
+ValuePair(VertCS_Everest_1830_1975_Definition_ellipsoid, 5017)
+ValuePair(VertCS_Everest_1830_Modified_ellipsoid, 5018)
+ValuePair(VertCS_GRS_1980_ellipsoid, 5019)
+ValuePair(VertCS_Helmert_1906_ellipsoid, 5020)
+ValuePair(VertCS_INS_ellipsoid, 5021)
+ValuePair(VertCS_International_1924_ellipsoid, 5022)
+ValuePair(VertCS_International_1967_ellipsoid, 5023)
+ValuePair(VertCS_Krassowsky_1940_ellipsoid, 5024)
+ValuePair(VertCS_NWL_9D_ellipsoid, 5025)
+ValuePair(VertCS_NWL_10D_ellipsoid, 5026)
+ValuePair(VertCS_Plessis_1817_ellipsoid, 5027)
+ValuePair(VertCS_Struve_1860_ellipsoid, 5028)
+ValuePair(VertCS_War_Office_ellipsoid, 5029)
+ValuePair(VertCS_WGS_84_ellipsoid, 5030)
+ValuePair(VertCS_GEM_10C_ellipsoid, 5031)
+ValuePair(VertCS_OSU86F_ellipsoid, 5032)
+ValuePair(VertCS_OSU91A_ellipsoid, 5033)
+/*
+ * Other established Vertical CS
+ */
+ValuePair(VertCS_Newlyn, 5101)
+ValuePair(VertCS_North_American_Vertical_Datum_1929, 5102)
+ValuePair(VertCS_North_American_Vertical_Datum_1988, 5103)
+ValuePair(VertCS_Yellow_Sea_1956, 5104)
+ValuePair(VertCS_Baltic_Sea, 5105)
+ValuePair(VertCS_Caspian_Sea, 5106)
+/* end of list */
diff --git a/src/tiff/fax3sm.c b/src/tiff/fax3sm.c
new file mode 100644
index 0000000..564c9aa
--- /dev/null
+++ b/src/tiff/fax3sm.c
@@ -0,0 +1,1046 @@
+/* WARNING, this file was automatically generated by the
+ mkg3states program */
+#include "tiff.h"
+#include "tif_fax3.h"
+ const TIFFFaxTabEnt TIFFFaxMainTable[128] = {
+12,7,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,
+2,3,0,3,1,0,4,3,1,3,1,0,5,6,2,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
+1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,5,7,3,3,1,0,5,3,1,3,1,0,
+2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
+4,6,2,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,
+2,3,0,3,1,0,4,3,1,3,1,0,6,7,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
+1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,5,6,2,3,1,0,5,3,1,3,1,0,
+2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
+4,7,3,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,
+2,3,0,3,1,0,4,3,1,3,1,0,4,6,2,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
+1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0
+};
+const TIFFFaxTabEnt TIFFFaxWhiteTable[4096] = {
+12,11,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
+7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
+7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
+7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
+9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,11,1792,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
+7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,
+7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
+7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,
+7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
+7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
+7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,
+7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+11,11,1856,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,
+7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
+7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
+7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
+9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
+7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,
+7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
+7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,
+7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,11,12,2112,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
+7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
+7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
+7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
+7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
+7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
+7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
+9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2368,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
+7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,
+7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
+7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,
+7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
+7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
+7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,
+7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+11,12,1984,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,
+7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
+7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
+7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
+9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
+7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,
+7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
+7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,
+7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,11,11,1920,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
+7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
+7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
+7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
+7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
+7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
+7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
+9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2240,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
+7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,
+7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
+7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,
+7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
+7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
+7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,
+7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+11,12,2496,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,
+7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
+7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
+7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
+9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,12,11,0,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
+7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,
+7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
+7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,
+7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,11,11,1792,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
+7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
+7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
+7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
+7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
+7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
+7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
+9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,11,1856,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
+7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,
+7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
+7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,
+7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
+7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
+7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,
+7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+11,12,2176,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,
+7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
+7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
+7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
+9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
+7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,
+7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
+7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,
+7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,11,12,2432,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
+7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
+7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
+7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
+7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
+7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
+7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
+9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2048,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
+7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,
+7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
+7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,
+7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
+7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
+7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,
+7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+11,11,1920,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,
+7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
+7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
+7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
+9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
+7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,
+7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
+7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,
+7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,11,12,2304,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
+7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
+7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
+7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
+7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
+7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
+7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
+9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2560,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
+7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,
+7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
+7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,
+7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7
+};
+const TIFFFaxTabEnt TIFFFaxBlackTable[8192] = {
+12,11,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,11,1792,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,23,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,20,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,25,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,12,128,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,56,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,30,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,11,1856,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,57,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,21,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,54,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,52,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,48,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,12,2112,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,44,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,36,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,12,384,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,28,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,60,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,40,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2368,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,1984,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,50,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,34,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,1664,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,26,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,13,1408,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,32,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,11,1920,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,61,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,42,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,1024,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,768,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,62,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2240,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,46,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,38,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,13,512,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,19,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,24,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,22,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,2496,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,12,11,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,11,1792,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,23,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,20,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,25,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,12,192,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,1280,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,31,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,11,1856,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,58,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,21,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,13,896,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,640,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,49,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,2176,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,45,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,37,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,12,448,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,29,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,13,1536,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,41,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,12,2432,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2048,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,51,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,35,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,12,320,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,27,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,59,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,33,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,11,1920,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,12,256,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,43,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,1152,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,55,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,63,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,12,2304,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,47,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,39,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,53,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,19,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,24,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,22,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2560,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,12,11,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,11,1792,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,23,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,20,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,25,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,12,128,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,56,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,30,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,11,1856,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,57,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,21,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,54,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,52,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,48,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2112,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,44,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,36,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,12,384,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,28,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,60,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,40,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,2368,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,12,1984,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,50,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,34,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,1728,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,26,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,1472,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,32,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,11,1920,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,61,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,42,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,13,1088,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,832,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,62,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,2240,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,46,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,38,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,576,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,19,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,24,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,22,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,12,2496,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+12,11,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,11,1792,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,23,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,20,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,25,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,12,192,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,1344,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,31,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,11,1856,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,58,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,21,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,960,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,13,704,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,49,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,12,2176,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,45,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,37,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,12,448,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,29,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,1600,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,41,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2432,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,2048,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,51,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,35,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,12,320,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,27,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,59,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,33,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,11,1920,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,12,256,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,43,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,1216,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,55,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,63,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2304,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,47,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,39,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,53,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,19,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,24,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,22,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,2560,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2
+};
diff --git a/src/tiff/geo_config.h b/src/tiff/geo_config.h
new file mode 100644
index 0000000..9875b77
--- /dev/null
+++ b/src/tiff/geo_config.h
@@ -0,0 +1,20 @@
+/* geo_config.h. Generated automatically by configure. */
+#ifndef GEO_CONFIG_H
+#define GEO_CONFIG_H
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* #undef HAVE_LIBPROJ */
+/* #undef HAVE_PROJECTS_H */
+
+#endif /* ndef GEO_CONFIG_H */
diff --git a/src/tiff/geo_ctrans.inc b/src/tiff/geo_ctrans.inc
new file mode 100644
index 0000000..030fe58
--- /dev/null
+++ b/src/tiff/geo_ctrans.inc
@@ -0,0 +1,55 @@
+/* GeoTIFF Coordinate Transformations Database */
+
+/* C database for Geotiff include files. */
+/* the macro ValuePair() must be defined */
+/* by the enclosing include file */
+
+/*
+ * Revised 12 Jul 1995 NDR -- changed South Oriented to a code
+ * Revised 28 Sep 1995 NDR -- Added Rev. 1.0 aliases.
+ */
+
+ValuePair(CT_TransverseMercator, 1)
+ValuePair(CT_TransvMercator_Modified_Alaska, 2)
+ValuePair(CT_ObliqueMercator, 3)
+ValuePair(CT_ObliqueMercator_Laborde, 4)
+ValuePair(CT_ObliqueMercator_Rosenmund, 5)
+ValuePair(CT_ObliqueMercator_Spherical, 6) /* not advisable */
+ValuePair(CT_Mercator, 7)
+ValuePair(CT_LambertConfConic_2SP, 8)
+ValuePair(CT_LambertConfConic,CT_LambertConfConic_2SP) /* Alias */
+ValuePair(CT_LambertConfConic_1SP, 9)
+ValuePair(CT_LambertConfConic_Helmert,CT_LambertConfConic_1SP) /* alias */
+ValuePair(CT_LambertAzimEqualArea, 10)
+ValuePair(CT_AlbersEqualArea, 11)
+ValuePair(CT_AzimuthalEquidistant, 12)
+ValuePair(CT_EquidistantConic, 13)
+ValuePair(CT_Stereographic, 14)
+ValuePair(CT_PolarStereographic, 15)
+ValuePair(CT_ObliqueStereographic, 16) /* not advisable */
+ValuePair(CT_Equirectangular, 17)
+ValuePair(CT_CassiniSoldner, 18)
+ValuePair(CT_Gnomonic, 19)
+ValuePair(CT_MillerCylindrical, 20)
+ValuePair(CT_Orthographic, 21)
+ValuePair(CT_Polyconic, 22)
+ValuePair(CT_Robinson, 23)
+ValuePair(CT_Sinusoidal, 24)
+ValuePair(CT_VanDerGrinten, 25)
+ValuePair(CT_NewZealandMapGrid, 26)
+/* Added for 1.0 */
+ValuePair(CT_TransvMercator_SouthOrientated, 27)
+
+
+/* Aliases */
+
+ValuePair(CT_SouthOrientedGaussConformal,CT_TransvMercator_SouthOrientated)
+ValuePair(CT_AlaskaConformal, CT_TransvMercator_Modified_Alaska)
+ValuePair(CT_TransvEquidistCylindrical, CT_CassiniSoldner)
+ValuePair(CT_ObliqueMercator_Hotine, CT_ObliqueMercator)
+ValuePair(CT_SwissObliqueCylindrical, CT_ObliqueMercator_Rosenmund)
+ValuePair(CT_GaussBoaga, CT_TransverseMercator)
+ValuePair(CT_GaussKruger, CT_TransverseMercator)
+ValuePair(CT_TransvMercator_SouthOriented, CT_TransvMercator_SouthOrientated)
+
+
diff --git a/src/tiff/geo_extra.c b/src/tiff/geo_extra.c
new file mode 100644
index 0000000..9338436
--- /dev/null
+++ b/src/tiff/geo_extra.c
@@ -0,0 +1,750 @@
+/******************************************************************************
+ * $Id: geo_extra.c,v 1.2 2004/03/19 11:51:23 lubia Exp $
+ *
+ * Project: libgeotiff
+ * Purpose: Code to normalize a few common PCS values without use of CSV
+ * files.
+ * Author: Frank Warmerdam, warmerda at home.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: geo_extra.c,v $
+ * Revision 1.2 2004/03/19 11:51:23 lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.4 2002/12/01 23:44:34 warmerda
+ * Fixed typo in last fix.
+ *
+ * Revision 1.3 2002/12/01 23:42:06 warmerda
+ * added overrides for two deprecated stateplane zones
+ *
+ * Revision 1.2 1999/05/04 03:09:33 warmerda
+ * avoid warnings
+ *
+ * Revision 1.1 1999/04/28 20:01:29 warmerda
+ * new
+ *
+ */
+
+/*
+#include "geotiff.h"
+#include "geo_tiffp.h"
+#include "geo_keyp.h"
+*/
+
+#include "geo_normalize.h"
+#include "geovalues.h"
+
+static int StatePlaneTable[] =
+{
+ PCS_NAD83_Alabama_East, Proj_Alabama_CS83_East,
+ PCS_NAD83_Alabama_West, Proj_Alabama_CS83_West,
+
+ PCS_NAD83_Alaska_zone_1, Proj_Alaska_CS83_1,
+ PCS_NAD83_Alaska_zone_2, Proj_Alaska_CS83_2,
+ PCS_NAD83_Alaska_zone_3, Proj_Alaska_CS83_3,
+ PCS_NAD83_Alaska_zone_4, Proj_Alaska_CS83_4,
+ PCS_NAD83_Alaska_zone_5, Proj_Alaska_CS83_5,
+ PCS_NAD83_Alaska_zone_6, Proj_Alaska_CS83_6,
+ PCS_NAD83_Alaska_zone_7, Proj_Alaska_CS83_7,
+ PCS_NAD83_Alaska_zone_8, Proj_Alaska_CS83_8,
+ PCS_NAD83_Alaska_zone_9, Proj_Alaska_CS83_9,
+ PCS_NAD83_Alaska_zone_10, Proj_Alaska_CS83_10,
+
+ PCS_NAD83_California_1, Proj_California_CS83_1,
+ PCS_NAD83_California_2, Proj_California_CS83_2,
+ PCS_NAD83_California_3, Proj_California_CS83_3,
+ PCS_NAD83_California_4, Proj_California_CS83_4,
+ PCS_NAD83_California_5, Proj_California_CS83_5,
+ PCS_NAD83_California_6, Proj_California_CS83_6,
+
+ PCS_NAD83_Arizona_East, Proj_Arizona_CS83_east,
+ PCS_NAD83_Arizona_Central, Proj_Arizona_CS83_Central,
+ PCS_NAD83_Arizona_West, Proj_Arizona_CS83_west,
+
+ PCS_NAD83_Arkansas_North, Proj_Arkansas_CS83_North,
+ PCS_NAD83_Arkansas_South, Proj_Arkansas_CS83_South,
+
+ PCS_NAD83_Colorado_North, Proj_Colorado_CS83_North,
+ PCS_NAD83_Colorado_Central, Proj_Colorado_CS83_Central,
+ PCS_NAD83_Colorado_South, Proj_Colorado_CS83_South,
+
+ PCS_NAD83_Connecticut, Proj_Connecticut_CS83,
+
+ PCS_NAD83_Delaware, Proj_Delaware_CS83,
+
+ PCS_NAD83_Florida_East, Proj_Florida_CS83_East,
+ PCS_NAD83_Florida_North, Proj_Florida_CS83_North,
+ PCS_NAD83_Florida_West, Proj_Florida_CS83_West,
+
+ PCS_NAD83_Hawaii_zone_1, Proj_Hawaii_CS83_1,
+ PCS_NAD83_Hawaii_zone_2, Proj_Hawaii_CS83_2,
+ PCS_NAD83_Hawaii_zone_3, Proj_Hawaii_CS83_3,
+ PCS_NAD83_Hawaii_zone_4, Proj_Hawaii_CS83_4,
+ PCS_NAD83_Hawaii_zone_5, Proj_Hawaii_CS83_5,
+
+ PCS_NAD83_Georgia_East, Proj_Georgia_CS83_East,
+ PCS_NAD83_Georgia_West, Proj_Georgia_CS83_West,
+
+ PCS_NAD83_Idaho_East, Proj_Idaho_CS83_East,
+ PCS_NAD83_Idaho_Central, Proj_Idaho_CS83_Central,
+ PCS_NAD83_Idaho_West, Proj_Idaho_CS83_West,
+
+ PCS_NAD83_Illinois_East, Proj_Illinois_CS83_East,
+ PCS_NAD83_Illinois_West, Proj_Illinois_CS83_West,
+
+ PCS_NAD83_Indiana_East, Proj_Indiana_CS83_East,
+ PCS_NAD83_Indiana_West, Proj_Indiana_CS83_West,
+
+ PCS_NAD83_Iowa_North, Proj_Iowa_CS83_North,
+ PCS_NAD83_Iowa_South, Proj_Iowa_CS83_South,
+
+ PCS_NAD83_Kansas_North, Proj_Kansas_CS83_North,
+ PCS_NAD83_Kansas_South, Proj_Kansas_CS83_South,
+
+ PCS_NAD83_Kentucky_North, Proj_Kentucky_CS83_North,
+ PCS_NAD83_Kentucky_South, Proj_Kentucky_CS83_South,
+
+ PCS_NAD83_Louisiana_North, Proj_Louisiana_CS83_North,
+ PCS_NAD83_Louisiana_South, Proj_Louisiana_CS83_South,
+
+ PCS_NAD83_Maine_East, Proj_Maine_CS83_East,
+ PCS_NAD83_Maine_West, Proj_Maine_CS83_West,
+
+ PCS_NAD83_Maryland, Proj_Maryland_CS83,
+
+ PCS_NAD83_Massachusetts, Proj_Massachusetts_CS83_Mainland,
+ PCS_NAD83_Massachusetts_Is, Proj_Massachusetts_CS83_Island,
+
+ PCS_NAD83_Michigan_North, Proj_Michigan_CS83_North,
+ PCS_NAD83_Michigan_Central, Proj_Michigan_CS83_Central,
+ PCS_NAD83_Michigan_South, Proj_Michigan_CS83_South,
+
+ PCS_NAD83_Minnesota_North, Proj_Minnesota_CS83_North,
+ PCS_NAD83_Minnesota_Cent, Proj_Minnesota_CS83_Central,
+ PCS_NAD83_Minnesota_South, Proj_Minnesota_CS83_South,
+
+ PCS_NAD83_Mississippi_East, Proj_Mississippi_CS83_East,
+ PCS_NAD83_Mississippi_West, Proj_Mississippi_CS83_West,
+
+ PCS_NAD83_Missouri_East, Proj_Missouri_CS83_East,
+ PCS_NAD83_Missouri_Central, Proj_Missouri_CS83_Central,
+ PCS_NAD83_Missouri_West, Proj_Missouri_CS83_West,
+
+ PCS_NAD83_Montana, Proj_Montana_CS83,
+
+ PCS_NAD83_Nebraska, Proj_Nebraska_CS83,
+
+ PCS_NAD83_Nevada_East, Proj_Nevada_CS83_East,
+ PCS_NAD83_Nevada_Central, Proj_Nevada_CS83_Central,
+ PCS_NAD83_Nevada_West, Proj_Nevada_CS83_West,
+
+ PCS_NAD83_New_Hampshire, Proj_New_Hampshire_CS83,
+
+ PCS_NAD83_New_Jersey, Proj_New_Jersey_CS83,
+
+ PCS_NAD83_New_Mexico_East, Proj_New_Mexico_CS83_East,
+ PCS_NAD83_New_Mexico_Cent, Proj_New_Mexico_CS83_Central,
+ PCS_NAD83_New_Mexico_West, Proj_New_Mexico_CS83_West,
+
+ PCS_NAD83_New_York_East, Proj_New_York_CS83_East,
+ PCS_NAD83_New_York_Central, Proj_New_York_CS83_Central,
+ PCS_NAD83_New_York_West, Proj_New_York_CS83_West,
+ PCS_NAD83_New_York_Long_Is, Proj_New_York_CS83_Long_Island,
+
+ PCS_NAD83_North_Carolina, Proj_North_Carolina_CS83,
+
+ PCS_NAD83_North_Dakota_N, Proj_North_Dakota_CS83_North,
+ PCS_NAD83_North_Dakota_S, Proj_North_Dakota_CS83_South,
+
+ PCS_NAD83_Ohio_North, Proj_Ohio_CS83_North,
+ PCS_NAD83_Ohio_South, Proj_Ohio_CS83_South,
+
+ PCS_NAD83_Oklahoma_North, Proj_Oklahoma_CS83_North,
+ PCS_NAD83_Oklahoma_South, Proj_Oklahoma_CS83_South,
+
+ PCS_NAD83_Oregon_North, Proj_Oregon_CS83_North,
+ PCS_NAD83_Oregon_South, Proj_Oregon_CS83_South,
+
+ PCS_NAD83_Pennsylvania_N, Proj_Pennsylvania_CS83_North,
+ PCS_NAD83_Pennsylvania_S, Proj_Pennsylvania_CS83_South,
+
+ PCS_NAD83_Rhode_Island, Proj_Rhode_Island_CS83,
+
+ PCS_NAD83_South_Carolina, Proj_South_Carolina_CS83,
+
+ PCS_NAD83_South_Dakota_N, Proj_South_Dakota_CS83_North,
+ PCS_NAD83_South_Dakota_S, Proj_South_Dakota_CS83_South,
+
+ PCS_NAD83_Tennessee, Proj_Tennessee_CS83,
+
+ PCS_NAD83_Texas_North, Proj_Texas_CS83_North,
+ PCS_NAD83_Texas_North_Cen, Proj_Texas_CS83_North_Central,
+ PCS_NAD83_Texas_Central, Proj_Texas_CS83_Central,
+ PCS_NAD83_Texas_South_Cen, Proj_Texas_CS83_South_Central,
+ PCS_NAD83_Texas_South, Proj_Texas_CS83_South,
+
+ PCS_NAD83_Utah_North, Proj_Utah_CS83_North,
+ PCS_NAD83_Utah_Central, Proj_Utah_CS83_Central,
+ PCS_NAD83_Utah_South, Proj_Utah_CS83_South,
+
+ PCS_NAD83_Vermont, Proj_Vermont_CS83,
+
+ PCS_NAD83_Virginia_North, Proj_Virginia_CS83_North,
+ PCS_NAD83_Virginia_South, Proj_Virginia_CS83_South,
+
+ PCS_NAD83_Washington_North, Proj_Washington_CS83_North,
+ PCS_NAD83_Washington_South, Proj_Washington_CS83_South,
+
+ PCS_NAD83_West_Virginia_N, Proj_West_Virginia_CS83_North,
+ PCS_NAD83_West_Virginia_S, Proj_West_Virginia_CS83_South,
+
+ PCS_NAD83_Wisconsin_North, Proj_Wisconsin_CS83_North,
+ PCS_NAD83_Wisconsin_Cen, Proj_Wisconsin_CS83_Central,
+ PCS_NAD83_Wisconsin_South, Proj_Wisconsin_CS83_South,
+
+ PCS_NAD83_Wyoming_East, Proj_Wyoming_CS83_East,
+ PCS_NAD83_Wyoming_E_Cen, Proj_Wyoming_CS83_East_Central,
+ PCS_NAD83_Wyoming_W_Cen, Proj_Wyoming_CS83_West_Central,
+ PCS_NAD83_Wyoming_West, Proj_Wyoming_CS83_West,
+
+ PCS_NAD83_Puerto_Rico_Virgin_Is, Proj_Puerto_Rico_Virgin_Is,
+
+ PCS_NAD27_Alabama_East, Proj_Alabama_CS27_East,
+ PCS_NAD27_Alabama_West, Proj_Alabama_CS27_West,
+
+ PCS_NAD27_Alaska_zone_1, Proj_Alaska_CS27_1,
+ PCS_NAD27_Alaska_zone_2, Proj_Alaska_CS27_2,
+ PCS_NAD27_Alaska_zone_3, Proj_Alaska_CS27_3,
+ PCS_NAD27_Alaska_zone_4, Proj_Alaska_CS27_4,
+ PCS_NAD27_Alaska_zone_5, Proj_Alaska_CS27_5,
+ PCS_NAD27_Alaska_zone_6, Proj_Alaska_CS27_6,
+ PCS_NAD27_Alaska_zone_7, Proj_Alaska_CS27_7,
+ PCS_NAD27_Alaska_zone_8, Proj_Alaska_CS27_8,
+ PCS_NAD27_Alaska_zone_9, Proj_Alaska_CS27_9,
+ PCS_NAD27_Alaska_zone_10, Proj_Alaska_CS27_10,
+
+ PCS_NAD27_California_I, Proj_California_CS27_I,
+ PCS_NAD27_California_II, Proj_California_CS27_II,
+ PCS_NAD27_California_III, Proj_California_CS27_III,
+ PCS_NAD27_California_IV, Proj_California_CS27_IV,
+ PCS_NAD27_California_V, Proj_California_CS27_V,
+ PCS_NAD27_California_VI, Proj_California_CS27_VI,
+ PCS_NAD27_California_VII, Proj_California_CS27_VII,
+
+ PCS_NAD27_Arizona_East, Proj_Arizona_Coordinate_System_east,
+ PCS_NAD27_Arizona_Central, Proj_Arizona_Coordinate_System_Central,
+ PCS_NAD27_Arizona_West, Proj_Arizona_Coordinate_System_west,
+
+ PCS_NAD27_Arkansas_North, Proj_Arkansas_CS27_North,
+ PCS_NAD27_Arkansas_South, Proj_Arkansas_CS27_South,
+
+ PCS_NAD27_Colorado_North, Proj_Colorado_CS27_North,
+ PCS_NAD27_Colorado_Central, Proj_Colorado_CS27_Central,
+ PCS_NAD27_Colorado_South, Proj_Colorado_CS27_South,
+
+ PCS_NAD27_Connecticut, Proj_Connecticut_CS27,
+
+ PCS_NAD27_Delaware, Proj_Delaware_CS27,
+
+ PCS_NAD27_Florida_East, Proj_Florida_CS27_East,
+ PCS_NAD27_Florida_North, Proj_Florida_CS27_North,
+ PCS_NAD27_Florida_West, Proj_Florida_CS27_West,
+
+ PCS_NAD27_Hawaii_zone_1, Proj_Hawaii_CS27_1,
+ PCS_NAD27_Hawaii_zone_2, Proj_Hawaii_CS27_2,
+ PCS_NAD27_Hawaii_zone_3, Proj_Hawaii_CS27_3,
+ PCS_NAD27_Hawaii_zone_4, Proj_Hawaii_CS27_4,
+ PCS_NAD27_Hawaii_zone_5, Proj_Hawaii_CS27_5,
+
+ PCS_NAD27_Georgia_East, Proj_Georgia_CS27_East,
+ PCS_NAD27_Georgia_West, Proj_Georgia_CS27_West,
+
+ PCS_NAD27_Idaho_East, Proj_Idaho_CS27_East,
+ PCS_NAD27_Idaho_Central, Proj_Idaho_CS27_Central,
+ PCS_NAD27_Idaho_West, Proj_Idaho_CS27_West,
+
+ PCS_NAD27_Illinois_East, Proj_Illinois_CS27_East,
+ PCS_NAD27_Illinois_West, Proj_Illinois_CS27_West,
+
+ PCS_NAD27_Indiana_East, Proj_Indiana_CS27_East,
+ PCS_NAD27_Indiana_West, Proj_Indiana_CS27_West,
+
+ PCS_NAD27_Iowa_North, Proj_Iowa_CS27_North,
+ PCS_NAD27_Iowa_South, Proj_Iowa_CS27_South,
+
+ PCS_NAD27_Kansas_North, Proj_Kansas_CS27_North,
+ PCS_NAD27_Kansas_South, Proj_Kansas_CS27_South,
+
+ PCS_NAD27_Kentucky_North, Proj_Kentucky_CS27_North,
+ PCS_NAD27_Kentucky_South, Proj_Kentucky_CS27_South,
+
+ PCS_NAD27_Louisiana_North, Proj_Louisiana_CS27_North,
+ PCS_NAD27_Louisiana_South, Proj_Louisiana_CS27_South,
+
+ PCS_NAD27_Maine_East, Proj_Maine_CS27_East,
+ PCS_NAD27_Maine_West, Proj_Maine_CS27_West,
+
+ PCS_NAD27_Maryland, Proj_Maryland_CS27,
+
+ PCS_NAD27_Massachusetts, Proj_Massachusetts_CS27_Mainland,
+ PCS_NAD27_Massachusetts_Is, Proj_Massachusetts_CS27_Island,
+
+ PCS_NAD27_Michigan_North, Proj_Michigan_CS27_North,
+ PCS_NAD27_Michigan_Central, Proj_Michigan_CS27_Central,
+ PCS_NAD27_Michigan_South, Proj_Michigan_CS27_South,
+
+ PCS_NAD27_Minnesota_North, Proj_Minnesota_CS27_North,
+ PCS_NAD27_Minnesota_Cent, Proj_Minnesota_CS27_Central,
+ PCS_NAD27_Minnesota_South, Proj_Minnesota_CS27_South,
+
+ PCS_NAD27_Mississippi_East, Proj_Mississippi_CS27_East,
+ PCS_NAD27_Mississippi_West, Proj_Mississippi_CS27_West,
+
+ PCS_NAD27_Missouri_East, Proj_Missouri_CS27_East,
+ PCS_NAD27_Missouri_Central, Proj_Missouri_CS27_Central,
+ PCS_NAD27_Missouri_West, Proj_Missouri_CS27_West,
+
+ PCS_NAD27_Montana_North, Proj_Montana_CS27_North,
+ PCS_NAD27_Montana_Central, Proj_Montana_CS27_Central,
+ PCS_NAD27_Montana_South, Proj_Montana_CS27_South,
+
+ PCS_NAD27_Nebraska_North, Proj_Nebraska_CS27_North,
+ PCS_NAD27_Nebraska_South, Proj_Nebraska_CS27_South,
+
+ PCS_NAD27_Nevada_East, Proj_Nevada_CS27_East,
+ PCS_NAD27_Nevada_Central, Proj_Nevada_CS27_Central,
+ PCS_NAD27_Nevada_West, Proj_Nevada_CS27_West,
+
+ PCS_NAD27_New_Hampshire, Proj_New_Hampshire_CS27,
+
+ PCS_NAD27_New_Jersey, Proj_New_Jersey_CS27,
+
+ PCS_NAD27_New_Mexico_East, Proj_New_Mexico_CS27_East,
+ PCS_NAD27_New_Mexico_Cent, Proj_New_Mexico_CS27_Central,
+ PCS_NAD27_New_Mexico_West, Proj_New_Mexico_CS27_West,
+
+ PCS_NAD27_New_York_East, Proj_New_York_CS27_East,
+ PCS_NAD27_New_York_Central, Proj_New_York_CS27_Central,
+ PCS_NAD27_New_York_West, Proj_New_York_CS27_West,
+ PCS_NAD27_New_York_Long_Is, Proj_New_York_CS27_Long_Island,
+
+ PCS_NAD27_North_Carolina, Proj_North_Carolina_CS27,
+
+ PCS_NAD27_North_Dakota_N, Proj_North_Dakota_CS27_North,
+ PCS_NAD27_North_Dakota_S, Proj_North_Dakota_CS27_South,
+
+ PCS_NAD27_Ohio_North, Proj_Ohio_CS27_North,
+ PCS_NAD27_Ohio_South, Proj_Ohio_CS27_South,
+
+ PCS_NAD27_Oklahoma_North, Proj_Oklahoma_CS27_North,
+ PCS_NAD27_Oklahoma_South, Proj_Oklahoma_CS27_South,
+
+ PCS_NAD27_Oregon_North, Proj_Oregon_CS27_North,
+ PCS_NAD27_Oregon_South, Proj_Oregon_CS27_South,
+
+ PCS_NAD27_Pennsylvania_N, Proj_Pennsylvania_CS27_North,
+ PCS_NAD27_Pennsylvania_S, Proj_Pennsylvania_CS27_South,
+
+ PCS_NAD27_Rhode_Island, Proj_Rhode_Island_CS27,
+
+ PCS_NAD27_South_Carolina_N, Proj_South_Carolina_CS27_North,
+ PCS_NAD27_South_Carolina_S, Proj_South_Carolina_CS27_South,
+
+ PCS_NAD27_South_Dakota_N, Proj_South_Dakota_CS27_North,
+ PCS_NAD27_South_Dakota_S, Proj_South_Dakota_CS27_South,
+
+ PCS_NAD27_Tennessee, Proj_Tennessee_CS27,
+
+ PCS_NAD27_Texas_North, Proj_Texas_CS27_North,
+ PCS_NAD27_Texas_North_Cen, Proj_Texas_CS27_North_Central,
+ PCS_NAD27_Texas_Central, Proj_Texas_CS27_Central,
+ PCS_NAD27_Texas_South_Cen, Proj_Texas_CS27_South_Central,
+ PCS_NAD27_Texas_South, Proj_Texas_CS27_South,
+
+ PCS_NAD27_Utah_North, Proj_Utah_CS27_North,
+ PCS_NAD27_Utah_Central, Proj_Utah_CS27_Central,
+ PCS_NAD27_Utah_South, Proj_Utah_CS27_South,
+
+ PCS_NAD27_Vermont, Proj_Vermont_CS27,
+
+ PCS_NAD27_Virginia_North, Proj_Virginia_CS27_North,
+ PCS_NAD27_Virginia_South, Proj_Virginia_CS27_South,
+
+ PCS_NAD27_Washington_North, Proj_Washington_CS27_North,
+ PCS_NAD27_Washington_South, Proj_Washington_CS27_South,
+
+ PCS_NAD27_West_Virginia_N, Proj_West_Virginia_CS27_North,
+ PCS_NAD27_West_Virginia_S, Proj_West_Virginia_CS27_South,
+
+ PCS_NAD27_Wisconsin_North, Proj_Wisconsin_CS27_North,
+ PCS_NAD27_Wisconsin_Cen, Proj_Wisconsin_CS27_Central,
+ PCS_NAD27_Wisconsin_South, Proj_Wisconsin_CS27_South,
+
+ PCS_NAD27_Wyoming_East, Proj_Wyoming_CS27_East,
+ PCS_NAD27_Wyoming_E_Cen, Proj_Wyoming_CS27_East_Central,
+ PCS_NAD27_Wyoming_W_Cen, Proj_Wyoming_CS27_West_Central,
+ PCS_NAD27_Wyoming_West, Proj_Wyoming_CS27_West,
+
+ PCS_NAD27_Puerto_Rico, Proj_Puerto_Rico_CS27,
+
+ KvUserDefined
+};
+
+/************************************************************************/
+/* GTIFMapSysToPCS() */
+/* */
+/* Given a Datum, MapSys and zone value generate the best PCS */
+/* code possible. */
+/************************************************************************/
+
+int GTIFMapSysToPCS( int MapSys, int Datum, int nZone )
+
+{
+ int PCSCode = KvUserDefined;
+
+ if( MapSys == MapSys_UTM_North )
+ {
+ if( Datum == GCS_NAD27 )
+ PCSCode = PCS_NAD27_UTM_zone_3N + nZone - 3;
+ else if( Datum == GCS_NAD83 )
+ PCSCode = PCS_NAD83_UTM_zone_3N + nZone - 3;
+ else if( Datum == GCS_WGS_72 )
+ PCSCode = PCS_WGS72_UTM_zone_1N + nZone - 1;
+ else if( Datum == GCS_WGS_72BE )
+ PCSCode = PCS_WGS72BE_UTM_zone_1N + nZone - 1;
+ else if( Datum == GCS_WGS_84 )
+ PCSCode = PCS_WGS84_UTM_zone_1N + nZone - 1;
+ }
+ else if( MapSys == MapSys_UTM_South )
+ {
+ if( Datum == GCS_WGS_72 )
+ PCSCode = PCS_WGS72_UTM_zone_1S + nZone - 1;
+ else if( Datum == GCS_WGS_72BE )
+ PCSCode = PCS_WGS72BE_UTM_zone_1S + nZone - 1;
+ else if( Datum == GCS_WGS_84 )
+ PCSCode = PCS_WGS84_UTM_zone_1S + nZone - 1;
+ }
+ else if( MapSys == MapSys_State_Plane_27 )
+ {
+ int i;
+
+ PCSCode = 10000 + nZone;
+ for( i = 0; StatePlaneTable[i] != KvUserDefined; i += 2 )
+ {
+ if( StatePlaneTable[i+1] == PCSCode )
+ PCSCode = StatePlaneTable[i];
+ }
+
+ /* Old EPSG code was in error for Tennesse CS27, override */
+ if( nZone == 4100 )
+ PCSCode = 2204;
+ }
+ else if( MapSys == MapSys_State_Plane_83 )
+ {
+ int i;
+
+ PCSCode = 10000 + nZone + 30;
+
+ for( i = 0; StatePlaneTable[i] != KvUserDefined; i += 2 )
+ {
+ if( StatePlaneTable[i+1] == PCSCode )
+ PCSCode = StatePlaneTable[i];
+ }
+
+ /* Old EPSG code was in error for Kentucky North CS83, override */
+ if( nZone == 1601 )
+ PCSCode = 2205;
+ }
+
+ return( PCSCode );
+}
+
+/************************************************************************/
+/* GTIFMapSysToProj() */
+/* */
+/* Given a MapSys and zone value generate the best Proj_ */
+/* code possible. */
+/************************************************************************/
+
+int GTIFMapSysToProj( int MapSys, int nZone )
+
+{
+ int ProjCode = KvUserDefined;
+
+ if( MapSys == MapSys_UTM_North )
+ {
+ ProjCode = Proj_UTM_zone_1N + nZone - 1;
+ }
+ else if( MapSys == MapSys_UTM_South )
+ {
+ ProjCode = Proj_UTM_zone_1S + nZone - 1;
+ }
+ else if( MapSys == MapSys_State_Plane_27 )
+ {
+ ProjCode = 10000 + nZone;
+
+ /* Tennesse override */
+ if( nZone == 4100 )
+ ProjCode = 15302;
+ }
+ else if( MapSys == MapSys_State_Plane_83 )
+ {
+ ProjCode = 10000 + nZone + 30;
+
+ /* Kentucky North override */
+ if( nZone == 1601 )
+ ProjCode = 15303;
+ }
+
+ return( ProjCode );
+}
+
+/************************************************************************/
+/* GTIFPCSToMapSys() */
+/************************************************************************/
+
+/**
+ * Translate a PCS_ code into a UTM or State Plane map system, a datum,
+ * and a zone if possible.
+ *
+ * @param PCSCode The projection code (PCS_*) as would be stored in the
+ * ProjectedCSTypeGeoKey of a GeoTIFF file.
+ *
+ * @param pDatum Pointer to an integer into which the datum code (GCS_*)
+ * is put if the function succeeds.
+ *
+ * @param pZone Pointer to an integer into which the zone will be placed
+ * if the function is successful.
+ *
+ * @return Returns either MapSys_UTM_North, MapSys_UTM_South,
+ * MapSys_State_Plane_83, MapSys_State_Plane_27 or KvUserDefined.
+ * KvUserDefined indicates that the
+ * function failed to recognise the projection as UTM or State Plane.
+ *
+ * The zone value is only set if the return code is other than KvUserDefined.
+ * For utm map system the returned zone will be between 1 and 60. For
+ * State Plane, the USGS state plane zone number is returned. For instance,
+ * Alabama East is zone 101.
+ *
+ * The datum (really this is the GCS) is set to a GCS_ value such as GCS_NAD27.
+ *
+ * This function is useful to recognise (most) UTM and State Plane coordinate
+ * systems, even if CSV files aren't available to translate them automatically.
+ * It is used as a fallback mechanism by GTIFGetDefn() for normalization when
+ * CSV files aren't found.
+ */
+
+int GTIFPCSToMapSys( int PCSCode, int * pDatum, int * pZone )
+
+{
+ int Datum = KvUserDefined, Proj = KvUserDefined;
+ int nZone = KvUserDefined, i;
+
+/* -------------------------------------------------------------------- */
+/* UTM with various datums. Note there are lots of PCS UTM */
+/* codes not done yet which use strange datums. */
+/* -------------------------------------------------------------------- */
+ if( PCSCode >= PCS_NAD27_UTM_zone_3N && PCSCode <= PCS_NAD27_UTM_zone_22N )
+ {
+ Datum = GCS_NAD27;
+ Proj = MapSys_UTM_North;
+ nZone = PCSCode - PCS_NAD27_UTM_zone_3N + 3;
+ }
+ else if( PCSCode >= PCS_NAD83_UTM_zone_3N
+ && PCSCode <= PCS_NAD83_UTM_zone_23N )
+ {
+ Datum = GCS_NAD83;
+ Proj = MapSys_UTM_North;
+ nZone = PCSCode - PCS_NAD83_UTM_zone_3N + 3;
+ }
+
+ else if( PCSCode >= PCS_WGS72_UTM_zone_1N
+ && PCSCode <= PCS_WGS72_UTM_zone_60N )
+ {
+ Datum = GCS_WGS_72;
+ Proj = MapSys_UTM_North;
+ nZone = PCSCode - PCS_WGS72_UTM_zone_1N + 1;
+ }
+ else if( PCSCode >= PCS_WGS72_UTM_zone_1S
+ && PCSCode <= PCS_WGS72_UTM_zone_60S )
+ {
+ Datum = GCS_WGS_72;
+ Proj = MapSys_UTM_South;
+ nZone = PCSCode - PCS_WGS72_UTM_zone_1S + 1;
+ }
+
+ else if( PCSCode >= PCS_WGS72BE_UTM_zone_1N
+ && PCSCode <= PCS_WGS72BE_UTM_zone_60N )
+ {
+ Datum = GCS_WGS_72BE;
+ Proj = MapSys_UTM_North;
+ nZone = PCSCode - PCS_WGS72BE_UTM_zone_1N + 1;
+ }
+ else if( PCSCode >= PCS_WGS72BE_UTM_zone_1S
+ && PCSCode <= PCS_WGS72BE_UTM_zone_60S )
+ {
+ Datum = GCS_WGS_72BE;
+ Proj = MapSys_UTM_South;
+ nZone = PCSCode - PCS_WGS72BE_UTM_zone_1S + 1;
+ }
+
+ else if( PCSCode >= PCS_WGS84_UTM_zone_1N
+ && PCSCode <= PCS_WGS84_UTM_zone_60N )
+ {
+ Datum = GCS_WGS_84;
+ Proj = MapSys_UTM_North;
+ nZone = PCSCode - PCS_WGS84_UTM_zone_1N + 1;
+ }
+ else if( PCSCode >= PCS_WGS84_UTM_zone_1S
+ && PCSCode <= PCS_WGS84_UTM_zone_60S )
+ {
+ Datum = GCS_WGS_84;
+ Proj = MapSys_UTM_South;
+ nZone = PCSCode - PCS_WGS84_UTM_zone_1S + 1;
+ }
+ else if( PCSCode >= PCS_SAD69_UTM_zone_18N
+ && PCSCode <= PCS_SAD69_UTM_zone_22N )
+ {
+ Datum = KvUserDefined;
+ Proj = MapSys_UTM_North;
+ nZone = PCSCode - PCS_SAD69_UTM_zone_18N + 18;
+ }
+ else if( PCSCode >= PCS_SAD69_UTM_zone_17S
+ && PCSCode <= PCS_SAD69_UTM_zone_25S )
+ {
+ Datum = KvUserDefined;
+ Proj = MapSys_UTM_South;
+ nZone = PCSCode - PCS_SAD69_UTM_zone_17S + 17;
+ }
+
+/* -------------------------------------------------------------------- */
+/* State Plane zones, first we translate any PCS_ codes to */
+/* a Proj_ code that we can get a handle on. */
+/* -------------------------------------------------------------------- */
+ for( i = 0; StatePlaneTable[i] != KvUserDefined; i += 2 )
+ {
+ if( StatePlaneTable[i] == PCSCode )
+ PCSCode = StatePlaneTable[i+1];
+ }
+
+ if( PCSCode <= 15900 && PCSCode >= 10000 )
+ {
+ if( (PCSCode % 100) >= 30 )
+ {
+ Proj = MapSys_State_Plane_83;
+ Datum = GCS_NAD83;
+ }
+ else
+ {
+ Proj = MapSys_State_Plane_27;
+ Datum = GCS_NAD27;
+ }
+
+ nZone = PCSCode - 10000;
+ if( Datum == GCS_NAD83 )
+ nZone -= 30;
+ }
+
+ if( pDatum != NULL )
+ *pDatum = Datum;
+
+ if( pZone != NULL )
+ *pZone = nZone;
+
+ return( Proj );
+}
+
+/************************************************************************/
+/* GTIFProjToMapSys() */
+/************************************************************************/
+
+/**
+ * Translate a Proj_ code into a UTM or State Plane map system, and a zone
+ * if possible.
+ *
+ * @param ProjCode The projection code (Proj_*) as would be stored in the
+ * ProjectionGeoKey of a GeoTIFF file.
+ * @param pZone Pointer to an integer into which the zone will be placed
+ * if the function is successful.
+ *
+ * @return Returns either MapSys_UTM_North, MapSys_UTM_South,
+ * MapSys_State_Plane_27, MapSys_State_Plane_83 or KvUserDefined.
+ * KvUserDefined indicates that the
+ * function failed to recognise the projection as UTM or State Plane.
+ *
+ * The zone value is only set if the return code is other than KvUserDefined.
+ * For utm map system the returned zone will be between 1 and 60. For
+ * State Plane, the USGS state plane zone number is returned. For instance,
+ * Alabama East is zone 101.
+ *
+ * This function is useful to recognise UTM and State Plane coordinate
+ * systems, and to extract zone numbers so the projections can be
+ * represented as UTM rather than as the underlying projection method such
+ * Transverse Mercator for instance.
+ */
+
+int GTIFProjToMapSys( int ProjCode, int * pZone )
+
+{
+ int nZone = KvUserDefined;
+ int MapSys = KvUserDefined;
+
+/* -------------------------------------------------------------------- */
+/* Handle UTM. */
+/* -------------------------------------------------------------------- */
+ if( ProjCode >= Proj_UTM_zone_1N && ProjCode <= Proj_UTM_zone_60N )
+ {
+ MapSys = MapSys_UTM_North;
+ nZone = ProjCode - Proj_UTM_zone_1N + 1;
+ }
+ else if( ProjCode >= Proj_UTM_zone_1S && ProjCode <= Proj_UTM_zone_60S )
+ {
+ MapSys = MapSys_UTM_South;
+ nZone = ProjCode - Proj_UTM_zone_1S + 1;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Handle State Plane. I think there are some anomolies in */
+/* here, so this is a bit risky. */
+/* -------------------------------------------------------------------- */
+ else if( ProjCode >= 10101 && ProjCode <= 15299 )
+ {
+ if( ProjCode % 100 >= 30 )
+ {
+ MapSys = MapSys_State_Plane_83;
+ nZone = ProjCode - 10000 - 30;
+ }
+ else
+ {
+ MapSys = MapSys_State_Plane_27;
+ nZone = ProjCode - 10000;
+ }
+ }
+
+ if( pZone != NULL )
+ *pZone = nZone;
+
+ return( MapSys );
+}
+
diff --git a/src/tiff/geo_free.c b/src/tiff/geo_free.c
new file mode 100644
index 0000000..a43fcad
--- /dev/null
+++ b/src/tiff/geo_free.c
@@ -0,0 +1,62 @@
+/**********************************************************************
+ *
+ * geo_free.c -- Public routines for GEOTIFF GeoKey access.
+ *
+ * Written By: Niles D. Ritter.
+ *
+ * copyright (c) 1995 Niles D. Ritter
+ *
+ * Permission granted to use this software, so long as this copyright
+ * notice accompanies any products derived therefrom.
+ *
+ **********************************************************************/
+
+#include "geotiff.h" /* public interface */
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h" /* private interface */
+
+
+/**********************************************************************
+ *
+ * Public Routines
+ *
+ **********************************************************************/
+
+/**
+
+This function deallocates an existing GeoTIFF access handle previously
+created with GTIFNew(). If the handle was
+used to write GeoTIFF keys to the TIFF file, the
+GTIFWriteKeys() function should be used
+to flush results to the file before calling GTIFFree(). GTIFFree()
+should be called before XTIFFClose() is
+called on the corresponding TIFF file handle.<p>
+
+*/
+
+void GTIFFree(GTIF* gtif)
+{
+ int i;
+
+ if (!gtif) return;
+
+ /* Free parameter arrays */
+ if (gtif->gt_double) _GTIFFree (gtif->gt_double);
+ if (gtif->gt_short) _GTIFFree (gtif->gt_short);
+
+ /* Free GeoKey arrays */
+ if (gtif->gt_keys)
+ {
+ for (i = 0; i < MAX_KEYS; i++)
+ {
+ if (gtif->gt_keys[i].gk_type == TYPE_ASCII)
+ {
+ _GTIFFree (gtif->gt_keys[i].gk_data);
+ }
+ }
+ _GTIFFree (gtif->gt_keys);
+ }
+ if (gtif->gt_keyindex) _GTIFFree (gtif->gt_keyindex);
+
+ _GTIFFree (gtif);
+}
diff --git a/src/tiff/geo_get.c b/src/tiff/geo_get.c
new file mode 100644
index 0000000..f027bd3
--- /dev/null
+++ b/src/tiff/geo_get.c
@@ -0,0 +1,176 @@
+/**********************************************************************
+ *
+ * geo_get.c -- Public routines for GEOTIFF GeoKey access.
+ *
+ * Written By: Niles D. Ritter.
+ *
+ * copyright (c) 1995 Niles D. Ritter
+ *
+ * Permission granted to use this software, so long as this copyright
+ * notice accompanies any products derived therefrom.
+ *
+ * Revision History;
+ *
+ * 20 June, 1995 Niles D. Ritter New
+ * 3 July, 1995 Greg Martin Fix strings and index
+ * 6 July, 1995 Niles D. Ritter Unfix indexing.
+ *
+ **********************************************************************/
+
+#include "geotiff.h" /* public interface */
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h" /* private interface */
+
+/* return the Header info of this geotiff file */
+
+void GTIFDirectoryInfo(GTIF *gtif, int version[3], int *keycount)
+{
+ if (version)
+ {
+ version[0] = gtif->gt_version;
+ version[1] = gtif->gt_rev_major;
+ version[2] = gtif->gt_rev_minor;
+ }
+ if (keycount) *keycount = gtif->gt_num_keys;
+}
+
+
+int GTIFKeyInfo(GTIF *gtif, geokey_t key, int *size, tagtype_t* type)
+{
+ int index = gtif->gt_keyindex[ key ];
+ GeoKey *keyptr;
+
+ if (!index) return 0;
+
+ keyptr = gtif->gt_keys + index;
+ if (size) *size = (int) keyptr->gk_size;
+ if (type) *type = keyptr->gk_type;
+
+ return keyptr->gk_count;
+}
+
+/**
+
+This function reads the value of a single GeoKey from a GeoTIFF file.
+
+ at param gtif The geotiff information handle from GTIFNew().
+
+ at param thekey The geokey_t name (such as ProjectedCSTypeGeoKey).
+This must come from the list of legal geokey_t values
+(an enumeration) listed below.
+
+ at param val The <b>val</b> argument is a pointer to the
+variable into which the value should be read. The type of the variable
+varies depending on the geokey_t given. While there is no ready mapping
+of geokey_t values onto types, in general code values are of type <i>short</i>,
+citations are strings, and everything else is of type <i>double</i>. Note
+that pointer's to <i>int</i> should never be passed to GTIFKeyGet() for
+integer values as they will be shorts, and the int's may not be properly
+initialized (and will be grossly wrong on MSB systems).
+
+ at param index Indicates how far into the list of values
+for this geokey to offset. Should normally be zero.
+
+ at param count Indicates how many values
+to read. At this time all keys except for strings have only one value,
+so <b>index</b> should be zero, and <b>count</b> should be one.
+
+ at return The GTIFKeyGet() function returns the number of values read. Normally
+this would be one if successful or zero if the key doesn't exist for this
+file.
+
+From geokeys.inc we see the following geokey_t values are possible:<p>
+
+<pre>
+-- 6.2.1 GeoTIFF Configuration Keys --
+
+ValuePair( GTModelTypeGeoKey, 1024) -- Section 6.3.1.1 Codes --
+ValuePair( GTRasterTypeGeoKey, 1025) -- Section 6.3.1.2 Codes --
+ValuePair( GTCitationGeoKey, 1026) -- documentation --
+
+-- 6.2.2 Geographic CS Parameter Keys --
+
+ValuePair( GeographicTypeGeoKey, 2048) -- Section 6.3.2.1 Codes --
+ValuePair( GeogCitationGeoKey, 2049) -- documentation --
+ValuePair( GeogGeodeticDatumGeoKey, 2050) -- Section 6.3.2.2 Codes --
+ValuePair( GeogPrimeMeridianGeoKey, 2051) -- Section 6.3.2.4 codes --
+ValuePair( GeogLinearUnitsGeoKey, 2052) -- Section 6.3.1.3 Codes --
+ValuePair( GeogLinearUnitSizeGeoKey, 2053) -- meters --
+ValuePair( GeogAngularUnitsGeoKey, 2054) -- Section 6.3.1.4 Codes --
+ValuePair( GeogAngularUnitSizeGeoKey, 2055) -- radians --
+ValuePair( GeogEllipsoidGeoKey, 2056) -- Section 6.3.2.3 Codes --
+ValuePair( GeogSemiMajorAxisGeoKey, 2057) -- GeogLinearUnits --
+ValuePair( GeogSemiMinorAxisGeoKey, 2058) -- GeogLinearUnits --
+ValuePair( GeogInvFlatteningGeoKey, 2059) -- ratio --
+ValuePair( GeogAzimuthUnitsGeoKey, 2060) -- Section 6.3.1.4 Codes --
+ValuePair( GeogPrimeMeridianLongGeoKey, 2061) -- GeoAngularUnit --
+
+-- 6.2.3 Projected CS Parameter Keys --
+-- Several keys have been renamed,--
+-- and the deprecated names aliased for backward compatibility --
+
+ValuePair( ProjectedCSTypeGeoKey, 3072) -- Section 6.3.3.1 codes --
+ValuePair( PCSCitationGeoKey, 3073) -- documentation --
+ValuePair( ProjectionGeoKey, 3074) -- Section 6.3.3.2 codes --
+ValuePair( ProjCoordTransGeoKey, 3075) -- Section 6.3.3.3 codes --
+ValuePair( ProjLinearUnitsGeoKey, 3076) -- Section 6.3.1.3 codes --
+ValuePair( ProjLinearUnitSizeGeoKey, 3077) -- meters --
+ValuePair( ProjStdParallel1GeoKey, 3078) -- GeogAngularUnit --
+ValuePair( ProjStdParallelGeoKey,ProjStdParallel1GeoKey) -- ** alias ** --
+ValuePair( ProjStdParallel2GeoKey, 3079) -- GeogAngularUnit --
+ValuePair( ProjNatOriginLongGeoKey, 3080) -- GeogAngularUnit --
+ValuePair( ProjOriginLongGeoKey,ProjNatOriginLongGeoKey) -- ** alias ** --
+ValuePair( ProjNatOriginLatGeoKey, 3081) -- GeogAngularUnit --
+ValuePair( ProjOriginLatGeoKey,ProjNatOriginLatGeoKey) -- ** alias ** --
+ValuePair( ProjFalseEastingGeoKey, 3082) -- ProjLinearUnits --
+ValuePair( ProjFalseNorthingGeoKey, 3083) -- ProjLinearUnits --
+ValuePair( ProjFalseOriginLongGeoKey, 3084) -- GeogAngularUnit --
+ValuePair( ProjFalseOriginLatGeoKey, 3085) -- GeogAngularUnit --
+ValuePair( ProjFalseOriginEastingGeoKey, 3086) -- ProjLinearUnits --
+ValuePair( ProjFalseOriginNorthingGeoKey, 3087) -- ProjLinearUnits --
+ValuePair( ProjCenterLongGeoKey, 3088) -- GeogAngularUnit --
+ValuePair( ProjCenterLatGeoKey, 3089) -- GeogAngularUnit --
+ValuePair( ProjCenterEastingGeoKey, 3090) -- ProjLinearUnits --
+ValuePair( ProjCenterNorthingGeoKey, 3091) -- ProjLinearUnits --
+ValuePair( ProjScaleAtNatOriginGeoKey, 3092) -- ratio --
+ValuePair( ProjScaleAtOriginGeoKey,ProjScaleAtNatOriginGeoKey) -- ** alias ** --
+ValuePair( ProjScaleAtCenterGeoKey, 3093) -- ratio --
+ValuePair( ProjAzimuthAngleGeoKey, 3094) -- GeogAzimuthUnit --
+ValuePair( ProjStraightVertPoleLongGeoKey, 3095) -- GeogAngularUnit --
+
+ 6.2.4 Vertical CS Keys
+
+ValuePair( VerticalCSTypeGeoKey, 4096) -- Section 6.3.4.1 codes --
+ValuePair( VerticalCitationGeoKey, 4097) -- documentation --
+ValuePair( VerticalDatumGeoKey, 4098) -- Section 6.3.4.2 codes --
+ValuePair( VerticalUnitsGeoKey, 4099) -- Section 6.3.1 (.x) codes --
+</pre>
+*/
+
+int GTIFKeyGet(GTIF *gtif, geokey_t thekey, void *val, int index, int count)
+{
+ int kindex = gtif->gt_keyindex[ thekey ];
+ GeoKey *key;
+ gsize_t size;
+ char *data;
+ tagtype_t type;
+
+ if (!kindex) return 0;
+
+ key = gtif->gt_keys+kindex;
+ if (!count) count = key->gk_count - index;
+ if (count <=0) return 0;
+ if (count > key->gk_count) count = key->gk_count;
+ size = key->gk_size;
+ type = key->gk_type;
+
+ if (count==1 && type==TYPE_SHORT) data = (char *)&key->gk_data;
+ else data = key->gk_data;
+
+ _GTIFmemcpy( val, data + index*size, count*size );
+
+ if (type==TYPE_ASCII)
+ ((char *)val)[count-1] = '\0'; /* replace last char with NULL */
+
+ return count;
+}
diff --git a/src/tiff/geo_keyp.h b/src/tiff/geo_keyp.h
new file mode 100644
index 0000000..140bf40
--- /dev/null
+++ b/src/tiff/geo_keyp.h
@@ -0,0 +1,98 @@
+/**********************************************************************
+ *
+ * geo_keyp.h - private interface for GeoTIFF geokey tag parsing
+ *
+ * Written by: Niles D. Ritter
+ *
+ **********************************************************************/
+
+#ifndef __geo_keyp_h_
+#define __geo_keyp_h_
+
+#include <stdlib.h> /* for size_t */
+
+/*
+ * This structure contains the internal program
+ * representation of the key entry.
+ */
+struct GeoKey {
+ int gk_key; /* GeoKey ID */
+ size_t gk_size; /* data byte size */
+ tagtype_t gk_type; /* TIFF data type */
+ long gk_count; /* number of values */
+ char* gk_data; /* pointer to data, or value */
+};
+typedef struct GeoKey GeoKey;
+
+/*
+ * This structure represents the file-organization of
+ * the key entry. Note that it assumes that short entries
+ * are aligned along 2-byte boundaries.
+ */
+struct KeyEntry {
+ pinfo_t ent_key; /* GeoKey ID */
+ pinfo_t ent_location; /* TIFF Tag ID or 0 */
+ pinfo_t ent_count; /* GeoKey value count */
+ pinfo_t ent_val_offset; /* value or tag offset */
+};
+typedef struct KeyEntry KeyEntry;
+
+/*
+ * This is the header of the CoordSystemInfoTag. The 'Version'
+ * will only change if the CoorSystemInfoTag structure changes;
+ * The Major Revision will be incremented whenever a new set of
+ * Keys is added or changed, while the Minor revision will be
+ * incremented when only the set of Key-values is increased.
+ */
+struct KeyHeader{
+ pinfo_t hdr_version; /* GeoTIFF Version */
+ pinfo_t hdr_rev_major; /* GeoKey Major Revision # */
+ pinfo_t hdr_rev_minor; /* GeoKey Minor Revision # */
+ pinfo_t hdr_num_keys; /* Number of GeoKeys */
+};
+typedef struct KeyHeader KeyHeader;
+
+/*
+ * This structure holds temporary data while reading or writing
+ * the tags.
+ */
+struct TempKeyData {
+ char *tk_asciiParams;
+ int tk_asciiParamsLength;
+ int tk_asciiParamsOffset;
+};
+typedef struct TempKeyData TempKeyData;
+
+
+struct gtiff {
+ tiff_t* gt_tif; /* TIFF file descriptor */
+ TIFFMethod gt_methods; /* TIFF i/o methods */
+ int gt_flags; /* file flags */
+
+ pinfo_t gt_version; /* GeoTIFF Version */
+ pinfo_t gt_rev_major;/* GeoKey Key Revision */
+ pinfo_t gt_rev_minor;/* GeoKey Code Revision */
+
+ int gt_num_keys; /* number of keys */
+ GeoKey* gt_keys; /* array of keys */
+ int* gt_keyindex; /* index of a key, if set*/
+ int gt_keymin; /* smallest key set */
+ int gt_keymax; /* largest key set */
+
+ pinfo_t* gt_short; /* array of SHORT vals */
+ double* gt_double; /* array of DOUBLE vals */
+ int gt_nshorts; /* number of SHORT vals */
+ int gt_ndoubles; /* number of DOUBLE vals */
+};
+
+typedef enum {
+ FLAG_FILE_OPEN=1,
+ FLAG_FILE_MODIFIED=2
+} gtiff_flags;
+
+#define MAX_KEYINDEX 65535 /* largest possible key */
+#define MAX_KEYS 100 /* maximum keys in a file */
+#define MAX_VALUES 1000 /* maximum values in a tag */
+
+#endif /* __geo_keyp_h_ */
+
diff --git a/src/tiff/geo_names.c b/src/tiff/geo_names.c
new file mode 100644
index 0000000..de58ca2
--- /dev/null
+++ b/src/tiff/geo_names.c
@@ -0,0 +1,175 @@
+/*
+ * geo_names.c
+ *
+ * This encapsulates all of the value-naming mechanism of
+ * libgeotiff.
+ *
+ * Written By: Niles Ritter
+ */
+
+#include "geotiffio.h"
+#include "geonames.h"
+#include "geo_tiffp.h" /* for tag names */
+
+static KeyInfo _formatInfo[] = {
+ {TYPE_BYTE, "Byte"},
+ {TYPE_SHORT, "Short"},
+ {TYPE_LONG, "Long"},
+ {TYPE_RATIONAL,"Rational"},
+ {TYPE_ASCII, "Ascii"},
+ {TYPE_FLOAT, "Float"},
+ {TYPE_DOUBLE, "Double"},
+ {TYPE_SBYTE, "SignedByte"},
+ {TYPE_SSHORT, "SignedShort"},
+ {TYPE_SLONG, "SignedLong"},
+ {TYPE_UNKNOWN, "Unknown"},
+ END_LIST
+};
+
+static KeyInfo _tagInfo[] = {
+ {GTIFF_PIXELSCALE, "ModelPixelScaleTag"},
+ {GTIFF_TRANSMATRIX, "ModelTransformationTag"},
+ {GTIFF_TIEPOINTS, "ModelTiepointTag"},
+ /* This alias maps the Intergraph symbol to the current tag */
+ {GTIFF_TRANSMATRIX, "IntergraphMatrixTag"},
+ END_LIST
+};
+
+static char *FindName(KeyInfo *info,int key)
+{
+ static char errmsg[80];
+
+ while (info->ki_key>=0 && info->ki_key != key) info++;
+
+ if (info->ki_key<0)
+ {
+ sprintf(errmsg,"Unknown-%d", key );
+ return errmsg;
+ }
+ return info->ki_name;
+}
+
+char *GTIFKeyName(geokey_t key)
+{
+ return FindName( &_keyInfo[0],key);
+}
+
+char *GTIFTypeName(tagtype_t type)
+{
+ return FindName( &_formatInfo[0],type);
+}
+
+char *GTIFTagName(int tag)
+{
+ return FindName( &_tagInfo[0],tag);
+}
+
+char *GTIFValueName(geokey_t key, int value)
+{
+ KeyInfo *info;
+
+ switch (key)
+ {
+ /* All codes using linear/angular/whatever units */
+ case GeogLinearUnitsGeoKey:
+ case ProjLinearUnitsGeoKey:
+ case GeogAngularUnitsGeoKey:
+ case GeogAzimuthUnitsGeoKey:
+ info=_geounitsValue; break;
+
+ /* put other key-dependent lists here */
+ case GTModelTypeGeoKey: info=_modeltypeValue; break;
+ case GTRasterTypeGeoKey: info=_rastertypeValue; break;
+ case GeographicTypeGeoKey: info=_geographicValue; break;
+ case GeogGeodeticDatumGeoKey: info=_geodeticdatumValue; break;
+ case GeogEllipsoidGeoKey: info=_ellipsoidValue; break;
+ case GeogPrimeMeridianGeoKey: info=_primemeridianValue; break;
+ case ProjectedCSTypeGeoKey: info=_pcstypeValue; break;
+ case ProjectionGeoKey: info=_projectionValue; break;
+ case ProjCoordTransGeoKey: info=_coordtransValue; break;
+ case VerticalCSTypeGeoKey: info=_vertcstypeValue; break;
+ case VerticalDatumGeoKey: info=_vdatumValue; break;
+
+ /* And if all else fails... */
+ default: info = _csdefaultValue;break;
+ }
+
+ return FindName( info,value);
+}
+
+/*
+ * Inverse Utilities (name->code)
+ */
+
+
+static int FindCode(KeyInfo *info,char *key)
+{
+ while (info->ki_key>=0 && strcmp(info->ki_name,key) ) info++;
+
+ if (info->ki_key<0)
+ {
+ /* not a registered key; might be generic code */
+ if (!strncmp(key,"Unknown-",8))
+ {
+ int code=-1;
+ sscanf(key,"Unknown-%d",&code);
+ return code;
+ }
+ else return -1;
+ }
+ return info->ki_key;
+}
+
+int GTIFKeyCode(char *key)
+{
+ return FindCode( &_keyInfo[0],key);
+}
+
+int GTIFTypeCode(char *type)
+{
+ return FindCode( &_formatInfo[0],type);
+}
+
+int GTIFTagCode(char *tag)
+{
+ return FindCode( &_tagInfo[0],tag);
+}
+
+
+/*
+ * The key must be determined with GTIFKeyCode() before
+ * the name can be encoded.
+ */
+int GTIFValueCode(geokey_t key, char *name)
+{
+ KeyInfo *info;
+
+ switch (key)
+ {
+ /* All codes using linear/angular/whatever units */
+ case GeogLinearUnitsGeoKey:
+ case ProjLinearUnitsGeoKey:
+ case GeogAngularUnitsGeoKey:
+ case GeogAzimuthUnitsGeoKey:
+ info=_geounitsValue; break;
+
+ /* put other key-dependent lists here */
+ case GTModelTypeGeoKey: info=_modeltypeValue; break;
+ case GTRasterTypeGeoKey: info=_rastertypeValue; break;
+ case GeographicTypeGeoKey: info=_geographicValue; break;
+ case GeogGeodeticDatumGeoKey: info=_geodeticdatumValue; break;
+ case GeogEllipsoidGeoKey: info=_ellipsoidValue; break;
+ case GeogPrimeMeridianGeoKey: info=_primemeridianValue; break;
+ case ProjectedCSTypeGeoKey: info=_pcstypeValue; break;
+ case ProjectionGeoKey: info=_projectionValue; break;
+ case ProjCoordTransGeoKey: info=_coordtransValue; break;
+ case VerticalCSTypeGeoKey: info=_vertcstypeValue; break;
+ case VerticalDatumGeoKey: info=_vdatumValue; break;
+
+ /* And if all else fails... */
+ default: info = _csdefaultValue;break;
+ }
+
+ return FindCode( info,name);
+}
+
diff --git a/src/tiff/geo_new.c b/src/tiff/geo_new.c
new file mode 100644
index 0000000..4fe58ab
--- /dev/null
+++ b/src/tiff/geo_new.c
@@ -0,0 +1,224 @@
+/**********************************************************************
+ *
+ * geo_new.c -- Public routines for GEOTIFF GeoKey access.
+ *
+ * Written By: Niles D. Ritter.
+ *
+ * copyright (c) 1995 Niles D. Ritter
+ *
+ * Permission granted to use this software, so long as this copyright
+ * notice accompanies any products derived therefrom.
+ *
+ * 20 June, 1995 Niles D. Ritter New
+ * 7 July, 1995 Greg Martin Fix index
+ *
+ * $Log: geo_new.c,v $
+ * Revision 1.2 2004/03/19 11:51:23 lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.9 2003/06/19 20:04:11 warmerda
+ * fix memory underwrite if ascii parameter string is zero length
+ *
+ * Revision 1.8 2003/06/05 14:20:45 warmerda
+ * cosmetic formatting changes
+ *
+ **********************************************************************/
+
+#include "geotiffio.h" /* public interface */
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h" /* private interface */
+
+/* private local routines */
+static int ReadKey(GTIF* gt, TempKeyData* tempData,
+ KeyEntry* entptr, GeoKey* keyptr);
+
+
+/**********************************************************************
+ *
+ * Public Routines
+ *
+ **********************************************************************/
+
+
+/**
+ * Given an open TIFF file, look for GTIF keys and
+ * values and return GTIF structure.
+
+This function creates a GeoTIFF information interpretation handle
+(GTIF *) based on a passed in TIFF handle originally from
+XTIFFOpen(). Even though the argument
+(<b>tif</b>) is shown as type <tt>void *</tt>, it is really normally
+of type <tt>TIFF *</tt>.<p>
+
+The returned GTIF handle can be used to read or write GeoTIFF tags
+using the various GTIF functions. The handle should be destroyed using
+GTIFFree() before the file is closed with TIFFClose().<p>
+
+If the file accessed has no GeoTIFF keys, an valid (but empty) GTIF is
+still returned. GTIFNew() is used both for existing files being read, and
+for new TIFF files that will have GeoTIFF tags written to them.<p>
+
+ */
+
+GTIF* GTIFNew(void *tif)
+{
+ GTIF* gt=(GTIF*)0;
+ int count,bufcount,index;
+ GeoKey *keyptr;
+ pinfo_t *data;
+ KeyEntry *entptr;
+ KeyHeader *header;
+ TempKeyData tempData;
+
+ gt = (GTIF*)_GTIFcalloc( sizeof(GTIF));
+ if (!gt) goto failure;
+
+ /* install TIFF file and I/O methods */
+ gt->gt_tif = (tiff_t *)tif;
+ _GTIFSetDefaultTIFF(>->gt_methods);
+
+ tempData.tk_asciiParams = 0;
+ tempData.tk_asciiParamsLength = 0;
+ tempData.tk_asciiParamsOffset = 0;
+
+ /* since this is an array, GTIF will allocate the memory */
+ if (!(gt->gt_methods.get)(tif, GTIFF_GEOKEYDIRECTORY, >->gt_nshorts, &data ))
+ {
+ /* No ProjectionInfo, create a blank one */
+ data=(pinfo_t*)_GTIFcalloc((4+MAX_VALUES)*sizeof(pinfo_t));
+ if (!data) goto failure;
+ header = (KeyHeader *)data;
+ header->hdr_version = GvCurrentVersion;
+ header->hdr_rev_major = GvCurrentRevision;
+ header->hdr_rev_minor = GvCurrentMinorRev;
+ gt->gt_nshorts=sizeof(KeyHeader)/sizeof(pinfo_t);
+ }
+ gt->gt_short = data;
+ header = (KeyHeader *)data;
+
+ if (header->hdr_version > GvCurrentVersion) goto failure;
+ if (header->hdr_rev_major > GvCurrentRevision)
+ {
+ /* issue warning */
+ }
+
+ /* If we got here, then the geokey can be parsed */
+ count = header->hdr_num_keys;
+ gt->gt_num_keys = count;
+ gt->gt_version = header->hdr_version;
+ gt->gt_rev_major = header->hdr_rev_major;
+ gt->gt_rev_minor = header->hdr_rev_minor;
+
+ bufcount = count+MAX_KEYS; /* allow for expansion */
+
+ /* Get the PARAMS Tags, if any */
+ if (!(gt->gt_methods.get)(tif, GTIFF_DOUBLEPARAMS,
+ >->gt_ndoubles, >->gt_double ))
+ {
+ gt->gt_double=(double*)_GTIFcalloc(MAX_VALUES*sizeof(double));
+ if (!gt->gt_double) goto failure;
+ }
+ if (!(gt->gt_methods.get)(tif, GTIFF_ASCIIPARAMS,
+ &tempData.tk_asciiParamsLength,
+ &tempData.tk_asciiParams ))
+ {
+ tempData.tk_asciiParams = 0;
+ tempData.tk_asciiParamsLength = 0;
+ }
+ else
+ {
+ /* last NULL doesn't count; "|" used for delimiter */
+ --tempData.tk_asciiParamsLength;
+ }
+
+ /* allocate space for GeoKey array and its index */
+ gt->gt_keys = (GeoKey *)_GTIFcalloc( sizeof(GeoKey)*bufcount);
+ if (!gt->gt_keys) goto failure;
+ gt->gt_keyindex = (int *)_GTIFcalloc( sizeof(int)*(MAX_KEYINDEX+1));
+ if (!gt->gt_keyindex) goto failure;
+
+ /* Loop to get all GeoKeys */
+ entptr = ((KeyEntry *)data) + 1;
+ keyptr = gt->gt_keys;
+ gt->gt_keymin = MAX_KEYINDEX;
+ gt->gt_keymax = 0;
+ for (index=1; index<=count; index++,entptr++)
+ {
+ if (!ReadKey(gt, &tempData, entptr, ++keyptr))
+ goto failure;
+
+ /* Set up the index (start at 1, since 0=unset) */
+ gt->gt_keyindex[entptr->ent_key] = index;
+ }
+
+ if( tempData.tk_asciiParams != NULL )
+ _GTIFFree( tempData.tk_asciiParams );
+
+ return gt;
+
+ failure:
+ /* Notify of error */
+ GTIFFree (gt);
+ return (GTIF *)0;
+}
+
+/**********************************************************************
+ *
+ * Private Routines
+ *
+ **********************************************************************/
+
+/*
+ * Given KeyEntry, read in the GeoKey value location and set up
+ * the Key structure, returning 0 if failure.
+ */
+
+static int ReadKey(GTIF* gt, TempKeyData* tempData,
+ KeyEntry* entptr, GeoKey* keyptr)
+{
+ int offset,count;
+
+ keyptr->gk_key = entptr->ent_key;
+ keyptr->gk_count = entptr->ent_count;
+ count = entptr->ent_count;
+ offset = entptr->ent_val_offset;
+ if (gt->gt_keymin > keyptr->gk_key) gt->gt_keymin=keyptr->gk_key;
+ if (gt->gt_keymax < keyptr->gk_key) gt->gt_keymax=keyptr->gk_key;
+
+ if (entptr->ent_location)
+ keyptr->gk_type = (gt->gt_methods.type)(gt->gt_tif,entptr->ent_location);
+ else
+ keyptr->gk_type = (gt->gt_methods.type)(gt->gt_tif,GTIFF_GEOKEYDIRECTORY);
+
+ switch (entptr->ent_location)
+ {
+ case GTIFF_LOCAL:
+ /* store value into data value */
+ *(pinfo_t *)(&keyptr->gk_data) = entptr->ent_val_offset;
+ break;
+ case GTIFF_GEOKEYDIRECTORY:
+ keyptr->gk_data = (char *)(gt->gt_short+offset);
+ if (gt->gt_nshorts < offset+count)
+ gt->gt_nshorts = offset+count;
+ break;
+ case GTIFF_DOUBLEPARAMS:
+ keyptr->gk_data = (char *)(gt->gt_double+offset);
+ if (gt->gt_ndoubles < offset+count)
+ gt->gt_ndoubles = offset+count;
+ break;
+ case GTIFF_ASCIIPARAMS:
+ if (offset + count > tempData->tk_asciiParamsLength)
+ return (0);
+
+ keyptr->gk_data = (char *) _GTIFcalloc (MAX(1,count));
+ _GTIFmemcpy (keyptr->gk_data,
+ tempData->tk_asciiParams + offset, count);
+ keyptr->gk_data[MAX(0,count-1)] = '\0';
+ break;
+ default:
+ return 0; /* failure */
+ }
+ keyptr->gk_size = _gtiff_size[keyptr->gk_type];
+
+ return 1; /* success */
+}
diff --git a/src/tiff/geo_normalize.c b/src/tiff/geo_normalize.c
new file mode 100644
index 0000000..1c6645c
--- /dev/null
+++ b/src/tiff/geo_normalize.c
@@ -0,0 +1,2330 @@
+/******************************************************************************
+ * $Id: geo_normalize.c,v 1.3 2004/03/19 11:51:23 lubia Exp $
+ *
+ * Project: libgeotiff
+ * Purpose: Code to normalize PCS and other composite codes in a GeoTIFF file.
+ * Author: Frank Warmerdam, warmerda at home.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: geo_normalize.c,v $
+ * Revision 1.3 2004/03/19 11:51:23 lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.36 2003/01/28 18:31:58 warmerda
+ * Default dfInDegrees in GTIFAngleToDD().
+ *
+ * Revision 1.35 2003/01/15 04:39:16 warmerda
+ * Added GTIFDeaccessCSV
+ *
+ * Revision 1.34 2003/01/15 03:37:40 warmerda
+ * added GTIFFreeMemory()
+ *
+ * Revision 1.33 2002/12/05 19:21:01 warmerda
+ * fixed dfInDegrees to actually be in degrees, not radians!
+ *
+ * Revision 1.32 2002/11/30 16:01:11 warmerda
+ * fixed some problems in GTIFGetUOMAngleInfo
+ *
+ * Revision 1.31 2002/11/30 15:44:35 warmerda
+ * fixed GetCTParms EPSG code mappings
+ *
+ * Revision 1.30 2002/11/28 22:27:42 warmerda
+ * preliminary upgrade to EPSG 6.2.2 tables
+ *
+ * Revision 1.29 2002/06/19 03:51:15 warmerda
+ * migrated cpl_csv.h into cpl_serv.h
+ *
+ * Revision 1.28 2002/01/03 21:28:25 warmerda
+ * call CSVDeaccess(NULL) at end of GTIFPrintDefn()
+ *
+ * Revision 1.27 2001/04/17 13:41:10 warmerda
+ * fix memory leaks in GTIFPrintDefn()
+ *
+ * Revision 1.26 2001/04/17 13:23:07 warmerda
+ * added support for reading custom ellipsoid definitions
+ *
+ * Revision 1.25 2001/03/05 04:55:26 warmerda
+ * CVSDeaccess at end of GTIFGetDefn to avoid file leak
+ *
+ * Revision 1.24 2001/03/05 03:26:29 warmerda
+ * fixed memory leaks in GTIFPrintDefn()
+ *
+ * Revision 1.23 2001/02/23 13:49:48 warmerda
+ * Fixed GTIFPrintDefn() to use fprintf( fp ), instead of printf().
+ *
+ * Revision 1.22 2000/10/13 14:30:57 warmerda
+ * fixed LCC parm order when parameters read directly from geotiff file
+ *
+ * Revision 1.21 2000/09/15 19:30:14 warmerda
+ * report units of linear proj parms
+ *
+ * Revision 1.20 2000/09/15 18:21:07 warmerda
+ * Fixed order of parameters for LCC 2SP. When parameters
+ * were read from EPSG CSV files the standard parallels and origin
+ * were mixed up. This affects alot of state plane zones!
+ *
+ * Revision 1.19 2000/06/09 14:05:43 warmerda
+ * added default knowledge of NAD27/NAD83/WGS72/WGS84
+ *
+ * Revision 1.18 1999/12/10 21:28:12 warmerda
+ * fixed Stereographic to look for ProjCenterLat/Long
+ *
+ * Revision 1.17 1999/12/10 20:06:58 warmerda
+ * fixed up scale geokey used for a couple of projections
+ *
+ * Revision 1.16 1999/12/10 19:50:21 warmerda
+ * Added EquidistantConic support, fixed return of StdParallel2GeoKey for
+ * LCC2, and Albers.
+ *
+ * Revision 1.15 1999/12/10 19:39:26 warmerda
+ * Fixed bug setting the false northing for files with
+ * ProjCenterNorthingGeoKey set in GTIFGetDefn().
+ *
+ * Revision 1.14 1999/09/17 14:58:37 warmerda
+ * Added ProjRectifiedGridAngleGeoKey(3096) and support for it's
+ * use with Oblique Mercator in geo_normalize.c.
+ *
+ * Revision 1.13 1999/09/17 00:55:26 warmerda
+ * added GTIFGetUOMAngleInfo(), and UOMAngle in GTIFDefn
+ *
+ * Revision 1.12 1999/09/15 18:51:31 warmerda
+ * Map 9808 to TM South Oriented, not TM Modified Alaska.
+ *
+ * Revision 1.11 1999/09/15 16:44:06 warmerda
+ * Change meter to metre to match EPSG database in GTIFGetUOMLengthInfo()
+ * shortcut.
+ *
+ * Revision 1.10 1999/09/15 16:35:15 warmerda
+ * Fixed the fractions of second handling properly in GTIFAngleStringToDD().
+ *
+ * Revision 1.9 1999/09/15 14:24:17 warmerda
+ * Fixed serious bug in geo_normalize.c with translation of
+ * DD.MMSSsss values. Return value was seriously off if any
+ * fraction of a second was included in the string.
+ *
+ * Revision 1.8 1999/07/13 03:12:52 warmerda
+ * Make scale a parameter of CT_Stereographic.
+ *
+ * Revision 1.7 1999/05/04 03:13:22 warmerda
+ * fixed a serious bug in parsing DMSmmss.sss values, and a bug in forming DMS strings
+ *
+ * Revision 1.6 1999/05/03 17:50:31 warmerda
+ * avoid warnings on IRIX
+ *
+ * Revision 1.5 1999/04/28 20:04:51 warmerda
+ * Added doxygen style documentation.
+ * Use GTIFPCSToMapSys() and related functions to partially normalize
+ * projections when we don't have the CSV files.
+ *
+ * Revision 1.4 1999/03/18 21:34:59 geotiff
+ * added GTIFDecToDMS
+ *
+ * Revision 1.3 1999/03/17 19:53:15 geotiff
+ * sys includes moved to cpl_serv.h
+ *
+ * Revision 1.2 1999/03/10 18:24:06 geotiff
+ * corrected to use int'
+ *
+ * Revision 1.1 1999/03/09 15:57:04 geotiff
+ * New
+ *
+ * Revision 1.4 1999/03/03 02:29:38 warmerda
+ * Define PI if not already defined.
+ *
+ * Revision 1.3 1999/03/02 21:10:57 warmerda
+ * added lots of projections
+ *
+ * Revision 1.2 1999/02/24 16:24:15 warmerda
+ * Continuing to evolve
+ *
+ * Revision 1.1 1999/02/22 18:51:08 warmerda
+ * New
+ *
+ */
+
+#include "cpl_serv.h"
+#include "geo_tiffp.h"
+#include "geovalues.h"
+#include "geo_normalize.h"
+
+#ifndef KvUserDefined
+# define KvUserDefined 32767
+#endif
+
+#ifndef PI
+# define PI 3.14159265358979323846
+#endif
+
+/* EPSG Codes for projection parameters. Unfortunately, these bear no
+ relationship to the GeoTIFF codes even though the names are so similar. */
+
+#define EPSGNatOriginLat 8801
+#define EPSGNatOriginLong 8802
+#define EPSGNatOriginScaleFactor 8805
+#define EPSGFalseEasting 8806
+#define EPSGFalseNorthing 8807
+#define EPSGProjCenterLat 8811
+#define EPSGProjCenterLong 8812
+#define EPSGAzimuth 8813
+#define EPSGAngleRectifiedToSkewedGrid 8814
+#define EPSGInitialLineScaleFactor 8815
+#define EPSGProjCenterEasting 8816
+#define EPSGProjCenterNorthing 8817
+#define EPSGPseudoStdParallelLat 8818
+#define EPSGPseudoStdParallelScaleFactor 8819
+#define EPSGFalseOriginLat 8821
+#define EPSGFalseOriginLong 8822
+#define EPSGStdParallel1Lat 8823
+#define EPSGStdParallel2Lat 8824
+#define EPSGFalseOriginEasting 8826
+#define EPSGFalseOriginNorthing 8827
+#define EPSGSphericalOriginLat 8828
+#define EPSGSphericalOriginLong 8829
+#define EPSGInitialLongitude 8830
+#define EPSGZoneWidth 8831
+
+/************************************************************************/
+/* GTIFGetPCSInfo() */
+/************************************************************************/
+
+int GTIFGetPCSInfo( int nPCSCode, char **ppszEPSGName,
+ short *pnProjOp, short *pnUOMLengthCode,
+ short *pnGeogCS )
+
+{
+ char **papszRecord;
+ char szSearchKey[24];
+ const char *pszFilename = CSVFilename( "pcs.csv" );
+
+/* -------------------------------------------------------------------- */
+/* Search the units database for this unit. If we don't find */
+/* it return failure. */
+/* -------------------------------------------------------------------- */
+ sprintf( szSearchKey, "%d", nPCSCode );
+ papszRecord = CSVScanFileByName( pszFilename, "COORD_REF_SYS_CODE",
+ szSearchKey, CC_Integer );
+
+ if( papszRecord == NULL )
+ return FALSE;
+
+/* -------------------------------------------------------------------- */
+/* Get the name, if requested. */
+/* -------------------------------------------------------------------- */
+ if( ppszEPSGName != NULL )
+ {
+ *ppszEPSGName =
+ CPLStrdup( CSLGetField( papszRecord,
+ CSVGetFileFieldId(pszFilename,
+ "COORD_REF_SYS_NAME") ));
+ }
+
+/* -------------------------------------------------------------------- */
+/* Get the UOM Length code, if requested. */
+/* -------------------------------------------------------------------- */
+ if( pnUOMLengthCode != NULL )
+ {
+ const char *pszValue;
+
+ pszValue =
+ CSLGetField( papszRecord,
+ CSVGetFileFieldId(pszFilename,"UOM_CODE"));
+ if( atoi(pszValue) > 0 )
+ *pnUOMLengthCode = atoi(pszValue);
+ else
+ *pnUOMLengthCode = KvUserDefined;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Get the UOM Length code, if requested. */
+/* -------------------------------------------------------------------- */
+ if( pnProjOp != NULL )
+ {
+ const char *pszValue;
+
+ pszValue =
+ CSLGetField( papszRecord,
+ CSVGetFileFieldId(pszFilename,"COORD_OP_CODE"));
+ if( atoi(pszValue) > 0 )
+ *pnProjOp = atoi(pszValue);
+ else
+ *pnUOMLengthCode = KvUserDefined;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Get the GeogCS (Datum with PM) code, if requested. */
+/* -------------------------------------------------------------------- */
+ if( pnGeogCS != NULL )
+ {
+ const char *pszValue;
+
+ pszValue =
+ CSLGetField( papszRecord,
+ CSVGetFileFieldId(pszFilename,"SOURCE_GEOGCRS_CODE"));
+ if( atoi(pszValue) > 0 )
+ *pnGeogCS = atoi(pszValue);
+ else
+ *pnGeogCS = KvUserDefined;
+ }
+
+ return TRUE;
+}
+
+/************************************************************************/
+/* GTIFAngleToDD() */
+/* */
+/* Convert a numeric angle to decimal degress. */
+/************************************************************************/
+
+double GTIFAngleToDD( double dfAngle, int nUOMAngle )
+
+{
+ if( nUOMAngle == 9110 ) /* DDD.MMSSsss */
+ {
+ char szAngleString[32];
+
+ sprintf( szAngleString, "%12.7f", dfAngle );
+ dfAngle = GTIFAngleStringToDD( szAngleString, nUOMAngle );
+ }
+ else
+ {
+ double dfInDegrees = 1.0;
+
+ GTIFGetUOMAngleInfo( nUOMAngle, NULL, &dfInDegrees );
+ dfAngle = dfAngle * dfInDegrees;
+ }
+
+ return( dfAngle );
+}
+
+/************************************************************************/
+/* GTIFAngleStringToDD() */
+/* */
+/* Convert an angle in the specified units to decimal degrees. */
+/************************************************************************/
+
+double GTIFAngleStringToDD( const char * pszAngle, int nUOMAngle )
+
+{
+ double dfAngle;
+
+ if( nUOMAngle == 9110 ) /* DDD.MMSSsss */
+ {
+ char *pszDecimal;
+
+ dfAngle = ABS(atoi(pszAngle));
+ pszDecimal = strchr(pszAngle,'.');
+ if( pszDecimal != NULL && strlen(pszDecimal) > 1 )
+ {
+ char szMinutes[3];
+ char szSeconds[64];
+
+ szMinutes[0] = pszDecimal[1];
+ if( pszDecimal[2] >= '0' && pszDecimal[2] <= '9' )
+ szMinutes[1] = pszDecimal[2];
+ else
+ szMinutes[1] = '0';
+
+ szMinutes[2] = '\0';
+ dfAngle += atoi(szMinutes) / 60.0;
+
+ if( strlen(pszDecimal) > 3 )
+ {
+ szSeconds[0] = pszDecimal[3];
+ if( pszDecimal[4] >= '0' && pszDecimal[4] <= '9' )
+ {
+ szSeconds[1] = pszDecimal[4];
+ szSeconds[2] = '.';
+ strcpy( szSeconds+3, pszDecimal + 5 );
+ }
+ else
+ {
+ szSeconds[1] = '0';
+ szSeconds[2] = '\0';
+ }
+ dfAngle += atof(szSeconds) / 3600.0;
+ }
+ }
+
+ if( pszAngle[0] == '-' )
+ dfAngle *= -1;
+ }
+ else if( nUOMAngle == 9105 || nUOMAngle == 9106 ) /* grad */
+ {
+ dfAngle = 180 * (atof(pszAngle ) / 200);
+ }
+ else if( nUOMAngle == 9101 ) /* radians */
+ {
+ dfAngle = 180 * (atof(pszAngle ) / PI);
+ }
+ else if( nUOMAngle == 9103 ) /* arc-minute */
+ {
+ dfAngle = atof(pszAngle) / 60;
+ }
+ else if( nUOMAngle == 9104 ) /* arc-second */
+ {
+ dfAngle = atof(pszAngle) / 3600;
+ }
+ else /* decimal degrees ... some cases missing but seeminly never used */
+ {
+ CPLAssert( nUOMAngle == 9102 || nUOMAngle == KvUserDefined
+ || nUOMAngle == 0 );
+
+ dfAngle = atof(pszAngle );
+ }
+
+ return( dfAngle );
+}
+
+/************************************************************************/
+/* GTIFGetGCSInfo() */
+/* */
+/* Fetch the datum, and prime meridian related to a particular */
+/* GCS. */
+/************************************************************************/
+
+int GTIFGetGCSInfo( int nGCSCode, char ** ppszName,
+ short * pnDatum, short * pnPM, short *pnUOMAngle )
+
+{
+ char szSearchKey[24];
+ int nDatum, nPM, nUOMAngle;
+
+/* -------------------------------------------------------------------- */
+/* Search the database for the corresponding datum code. */
+/* -------------------------------------------------------------------- */
+ sprintf( szSearchKey, "%d", nGCSCode );
+
+ nDatum = atoi(CSVGetField( CSVFilename("gcs.csv" ),
+ "COORD_REF_SYS_CODE", szSearchKey, CC_Integer,
+ "DATUM_CODE" ) );
+
+/* -------------------------------------------------------------------- */
+/* Handle some "well known" GCS codes directly if the table */
+/* wasn't found. */
+/* -------------------------------------------------------------------- */
+ if( nDatum < 1 )
+ {
+ const char * pszName = NULL;
+ nPM = PM_Greenwich;
+ nUOMAngle = Angular_DMS_Hemisphere;
+ if( nGCSCode == GCS_NAD27 )
+ {
+ nDatum = Datum_North_American_Datum_1927;
+ pszName = "NAD27";
+ }
+ else if( nGCSCode == GCS_NAD83 )
+ {
+ nDatum = Datum_North_American_Datum_1983;
+ pszName = "NAD83";
+ }
+ else if( nGCSCode == GCS_WGS_84 )
+ {
+ nDatum = Datum_WGS84;
+ pszName = "WGS 84";
+ }
+ else if( nGCSCode == GCS_WGS_72 )
+ {
+ nDatum = Datum_WGS72;
+ pszName = "WGS 82";
+ }
+ else
+ return FALSE;
+
+ if( ppszName != NULL )
+ *ppszName = CPLStrdup( pszName );
+ if( pnDatum != NULL )
+ *pnDatum = nDatum;
+ if( pnPM != NULL )
+ *pnPM = nPM;
+ if( pnUOMAngle != NULL )
+ *pnUOMAngle = nUOMAngle;
+
+ return TRUE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Get the PM. */
+/* -------------------------------------------------------------------- */
+ if( pnDatum != NULL )
+ *pnDatum = nDatum;
+
+ nPM = atoi(CSVGetField( CSVFilename("gcs.csv" ),
+ "COORD_REF_SYS_CODE", szSearchKey, CC_Integer,
+ "PRIME_MERIDIAN_CODE" ) );
+
+ if( nPM < 1 )
+ return FALSE;
+
+ if( pnPM != NULL )
+ *pnPM = nPM;
+
+/* -------------------------------------------------------------------- */
+/* Get the angular units. */
+/* -------------------------------------------------------------------- */
+ nUOMAngle = atoi(CSVGetField( CSVFilename("gcs.csv" ),
+ "COORD_REF_SYS_CODE",szSearchKey, CC_Integer,
+ "UOM_CODE" ) );
+
+ if( nUOMAngle < 1 )
+ return FALSE;
+
+ if( pnUOMAngle != NULL )
+ *pnUOMAngle = nUOMAngle;
+
+/* -------------------------------------------------------------------- */
+/* Get the name, if requested. */
+/* -------------------------------------------------------------------- */
+ if( ppszName != NULL )
+ *ppszName =
+ CPLStrdup(CSVGetField( CSVFilename("gcs.csv" ),
+ "COORD_REF_SYS_CODE",szSearchKey,CC_Integer,
+ "COORD_REF_SYS_NAME" ));
+
+ return( TRUE );
+}
+
+/************************************************************************/
+/* GTIFGetEllipsoidInfo() */
+/* */
+/* Fetch info about an ellipsoid. Axes are always returned in */
+/* meters. SemiMajor computed based on inverse flattening */
+/* where that is provided. */
+/************************************************************************/
+
+int GTIFGetEllipsoidInfo( int nEllipseCode, char ** ppszName,
+ double * pdfSemiMajor, double * pdfSemiMinor )
+
+{
+ char szSearchKey[24];
+ double dfSemiMajor, dfToMeters = 1.0;
+ int nUOMLength;
+
+/* -------------------------------------------------------------------- */
+/* Get the semi major axis. */
+/* -------------------------------------------------------------------- */
+ sprintf( szSearchKey, "%d", nEllipseCode );
+
+ dfSemiMajor =
+ atof(CSVGetField( CSVFilename("ellipsoid.csv" ),
+ "ELLIPSOID_CODE", szSearchKey, CC_Integer,
+ "SEMI_MAJOR_AXIS" ) );
+
+/* -------------------------------------------------------------------- */
+/* Try some well known ellipsoids. */
+/* -------------------------------------------------------------------- */
+ if( dfSemiMajor == 0.0 )
+ {
+ double dfInvFlattening, dfSemiMinor;
+ const char *pszName = NULL;
+
+ if( nEllipseCode == Ellipse_Clarke_1866 )
+ {
+ pszName = "Clarke 1866";
+ dfSemiMajor = 6378206.4;
+ dfSemiMinor = 6356583.8;
+ dfInvFlattening = 0.0;
+ }
+ else if( nEllipseCode == Ellipse_GRS_1980 )
+ {
+ pszName = "GRS 1980";
+ dfSemiMajor = 6378137.0;
+ dfSemiMinor = 0.0;
+ dfInvFlattening = 298.257222101;
+ }
+ else if( nEllipseCode == Ellipse_WGS_84 )
+ {
+ pszName = "WGS 84";
+ dfSemiMajor = 6378137.0;
+ dfSemiMinor = 0.0;
+ dfInvFlattening = 298.257223563;
+ }
+ else if( nEllipseCode == 7043 )
+ {
+ pszName = "WGS 72";
+ dfSemiMajor = 6378135.0;
+ dfSemiMinor = 0.0;
+ dfInvFlattening = 298.26;
+ }
+ else
+ return FALSE;
+
+ if( dfSemiMinor == 0.0 )
+ dfSemiMinor = dfSemiMajor * (1 - 1.0/dfInvFlattening);
+
+ if( pdfSemiMinor != NULL )
+ *pdfSemiMinor = dfSemiMinor;
+ if( pdfSemiMajor != NULL )
+ *pdfSemiMajor = dfSemiMajor;
+ if( ppszName != NULL )
+ *ppszName = CPLStrdup( pszName );
+
+ return TRUE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Get the translation factor into meters. */
+/* -------------------------------------------------------------------- */
+ nUOMLength = atoi(CSVGetField( CSVFilename("ellipsoid.csv" ),
+ "ELLIPSOID_CODE", szSearchKey, CC_Integer,
+ "UOM_CODE" ));
+ GTIFGetUOMLengthInfo( nUOMLength, NULL, &dfToMeters );
+
+ dfSemiMajor *= dfToMeters;
+
+ if( pdfSemiMajor != NULL )
+ *pdfSemiMajor = dfSemiMajor;
+
+/* -------------------------------------------------------------------- */
+/* Get the semi-minor if requested. If the Semi-minor axis */
+/* isn't available, compute it based on the inverse flattening. */
+/* -------------------------------------------------------------------- */
+ if( pdfSemiMinor != NULL )
+ {
+ *pdfSemiMinor =
+ atof(CSVGetField( CSVFilename("ellipsoid.csv" ),
+ "ELLIPSOID_CODE", szSearchKey, CC_Integer,
+ "SEMI_MINOR_AXIS" )) * dfToMeters;
+
+ if( *pdfSemiMinor == 0.0 )
+ {
+ double dfInvFlattening;
+
+ dfInvFlattening =
+ atof(CSVGetField( CSVFilename("ellipsoid.csv" ),
+ "ELLIPSOID_CODE", szSearchKey, CC_Integer,
+ "INV_FLATTENING" ));
+ *pdfSemiMinor = dfSemiMajor * (1 - 1.0/dfInvFlattening);
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* Get the name, if requested. */
+/* -------------------------------------------------------------------- */
+ if( ppszName != NULL )
+ *ppszName =
+ CPLStrdup(CSVGetField( CSVFilename("ellipsoid.csv" ),
+ "ELLIPSOID_CODE", szSearchKey, CC_Integer,
+ "ELLIPSOID_NAME" ));
+
+ return( TRUE );
+}
+
+/************************************************************************/
+/* GTIFGetPMInfo() */
+/* */
+/* Get the offset between a given prime meridian and Greenwich */
+/* in degrees. */
+/************************************************************************/
+
+int GTIFGetPMInfo( int nPMCode, char ** ppszName, double *pdfOffset )
+
+{
+ char szSearchKey[24];
+ int nUOMAngle;
+ const char *pszFilename = CSVFilename("prime_meridian.csv");
+
+/* -------------------------------------------------------------------- */
+/* Use a special short cut for Greenwich, since it is so common. */
+/* -------------------------------------------------------------------- */
+ if( nPMCode == PM_Greenwich )
+ {
+ if( pdfOffset != NULL )
+ *pdfOffset = 0.0;
+ if( ppszName != NULL )
+ *ppszName = CPLStrdup( "Greenwich" );
+ return TRUE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Search the database for the corresponding datum code. */
+/* -------------------------------------------------------------------- */
+ sprintf( szSearchKey, "%d", nPMCode );
+
+ nUOMAngle =
+ atoi(CSVGetField( pszFilename,
+ "PRIME_MERIDIAN_CODE", szSearchKey, CC_Integer,
+ "UOM_CODE" ) );
+ if( nUOMAngle < 1 )
+ return FALSE;
+
+/* -------------------------------------------------------------------- */
+/* Get the PM offset. */
+/* -------------------------------------------------------------------- */
+ if( pdfOffset != NULL )
+ {
+ *pdfOffset =
+ GTIFAngleStringToDD(
+ CSVGetField( pszFilename,
+ "PRIME_MERIDIAN_CODE", szSearchKey, CC_Integer,
+ "GREENWICH_LONGITUDE" ),
+ nUOMAngle );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Get the name, if requested. */
+/* -------------------------------------------------------------------- */
+ if( ppszName != NULL )
+ *ppszName =
+ CPLStrdup(
+ CSVGetField( pszFilename,
+ "PRIME_MERIDIAN_CODE", szSearchKey, CC_Integer,
+ "PRIME_MERIDIAN_NAME" ));
+
+ return( TRUE );
+}
+
+/************************************************************************/
+/* GTIFGetDatumInfo() */
+/* */
+/* Fetch the ellipsoid, and name for a datum. */
+/************************************************************************/
+
+int GTIFGetDatumInfo( int nDatumCode, char ** ppszName, short * pnEllipsoid )
+
+{
+ char szSearchKey[24];
+ int nEllipsoid;
+ const char *pszFilename = CSVFilename( "datum.csv" );
+
+/* -------------------------------------------------------------------- */
+/* Search the database for the corresponding datum code. */
+/* -------------------------------------------------------------------- */
+ sprintf( szSearchKey, "%d", nDatumCode );
+
+ nEllipsoid = atoi(CSVGetField( pszFilename,
+ "DATUM_CODE", szSearchKey, CC_Integer,
+ "ELLIPSOID_CODE" ) );
+
+ if( pnEllipsoid != NULL )
+ *pnEllipsoid = nEllipsoid;
+
+/* -------------------------------------------------------------------- */
+/* Handle a few built-in datums. */
+/* -------------------------------------------------------------------- */
+ if( nEllipsoid < 1 )
+ {
+ const char *pszName = NULL;
+
+ if( nDatumCode == Datum_North_American_Datum_1927 )
+ {
+ nEllipsoid = Ellipse_Clarke_1866;
+ pszName = "North American Datum 1927";
+ }
+ else if( nDatumCode == Datum_North_American_Datum_1983 )
+ {
+ nEllipsoid = Ellipse_GRS_1980;
+ pszName = "North American Datum 1983";
+ }
+ else if( nDatumCode == Datum_WGS84 )
+ {
+ nEllipsoid = Ellipse_WGS_84;
+ pszName = "World Geodetic System 1984";
+ }
+ else if( nDatumCode == Datum_WGS72 )
+ {
+ nEllipsoid = 7043; /* WGS7 */
+ pszName = "World Geodetic System 1972";
+ }
+ else
+ return FALSE;
+
+ if( pnEllipsoid != NULL )
+ *pnEllipsoid = nEllipsoid;
+
+ if( ppszName != NULL )
+ *ppszName = CPLStrdup( pszName );
+
+ return TRUE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Get the name, if requested. */
+/* -------------------------------------------------------------------- */
+ if( ppszName != NULL )
+ *ppszName =
+ CPLStrdup(CSVGetField( pszFilename,
+ "DATUM_CODE", szSearchKey, CC_Integer,
+ "DATUM_NAME" ));
+
+ return( TRUE );
+}
+
+
+/************************************************************************/
+/* GTIFGetUOMLengthInfo() */
+/* */
+/* Note: This function should eventually also know how to */
+/* lookup length aliases in the UOM_LE_ALIAS table. */
+/************************************************************************/
+
+int GTIFGetUOMLengthInfo( int nUOMLengthCode,
+ char **ppszUOMName,
+ double * pdfInMeters )
+
+{
+ char **papszUnitsRecord;
+ char szSearchKey[24];
+ int iNameField;
+ const char *pszFilename;
+
+/* -------------------------------------------------------------------- */
+/* We short cut meter to save work in the most common case. */
+/* -------------------------------------------------------------------- */
+ if( nUOMLengthCode == 9001 )
+ {
+ if( ppszUOMName != NULL )
+ *ppszUOMName = CPLStrdup( "metre" );
+ if( pdfInMeters != NULL )
+ *pdfInMeters = 1.0;
+
+ return TRUE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Search the units database for this unit. If we don't find */
+/* it return failure. */
+/* -------------------------------------------------------------------- */
+ pszFilename = CSVFilename( "unit_of_measure.csv" );
+
+ sprintf( szSearchKey, "%d", nUOMLengthCode );
+ papszUnitsRecord =
+ CSVScanFileByName( pszFilename,
+ "UOM_CODE", szSearchKey, CC_Integer );
+
+ if( papszUnitsRecord == NULL )
+ return FALSE;
+
+/* -------------------------------------------------------------------- */
+/* Get the name, if requested. */
+/* -------------------------------------------------------------------- */
+ if( ppszUOMName != NULL )
+ {
+ iNameField = CSVGetFileFieldId( pszFilename,
+ "UNIT_OF_MEAS_NAME" );
+ *ppszUOMName = CPLStrdup( CSLGetField(papszUnitsRecord, iNameField) );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Get the A and B factor fields, and create the multiplicative */
+/* factor. */
+/* -------------------------------------------------------------------- */
+ if( pdfInMeters != NULL )
+ {
+ int iBFactorField, iCFactorField;
+
+ iBFactorField = CSVGetFileFieldId( pszFilename, "FACTOR_B" );
+ iCFactorField = CSVGetFileFieldId( pszFilename, "FACTOR_C" );
+
+ if( atof(CSLGetField(papszUnitsRecord, iCFactorField)) > 0.0 )
+ *pdfInMeters = atof(CSLGetField(papszUnitsRecord, iBFactorField))
+ / atof(CSLGetField(papszUnitsRecord, iCFactorField));
+ else
+ *pdfInMeters = 0.0;
+ }
+
+ return( TRUE );
+}
+
+/************************************************************************/
+/* GTIFGetUOMAngleInfo() */
+/************************************************************************/
+
+int GTIFGetUOMAngleInfo( int nUOMAngleCode,
+ char **ppszUOMName,
+ double * pdfInDegrees )
+
+{
+ const char *pszUOMName = NULL;
+ double dfInDegrees = 1.0;
+ const char *pszFilename = CSVFilename( "unit_of_measure.csv" );
+ char szSearchKey[24];
+
+ sprintf( szSearchKey, "%d", nUOMAngleCode );
+ pszUOMName = CSVGetField( pszFilename,
+ "UOM_CODE", szSearchKey, CC_Integer,
+ "UNIT_OF_MEAS_NAME" );
+
+/* -------------------------------------------------------------------- */
+/* If the file is found, read from there. Note that FactorC is */
+/* an empty field for any of the DMS style formats, and in this */
+/* case we really want to return the default InDegrees value */
+/* (1.0) from above. */
+/* -------------------------------------------------------------------- */
+ if( pszUOMName != NULL )
+ {
+ double dfFactorB, dfFactorC, dfInRadians;
+
+ dfFactorB =
+ atof(CSVGetField( pszFilename,
+ "UOM_CODE", szSearchKey, CC_Integer,
+ "FACTOR_B" ));
+
+ dfFactorC =
+ atof(CSVGetField( pszFilename,
+ "UOM_CODE", szSearchKey, CC_Integer,
+ "FACTOR_C" ));
+
+ if( dfFactorC != 0.0 )
+ {
+ dfInRadians = (dfFactorB / dfFactorC);
+ dfInDegrees = dfInRadians * 180.0 / PI;
+ }
+
+
+ /* We do a special override of some of the DMS formats name */
+ if( nUOMAngleCode == 9102 || nUOMAngleCode == 9107
+ || nUOMAngleCode == 9108 || nUOMAngleCode == 9110 )
+ {
+ dfInDegrees = 1.0;
+ pszUOMName = "degree";
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* Otherwise handle a few well known units directly. */
+/* -------------------------------------------------------------------- */
+ else
+ {
+ switch( nUOMAngleCode )
+ {
+ case 9101:
+ pszUOMName = "radian";
+ dfInDegrees = 180.0 / PI;
+ break;
+
+ case 9102:
+ case 9107:
+ case 9108:
+ case 9110:
+ pszUOMName = "degree";
+ dfInDegrees = 1.0;
+ break;
+
+ case 9103:
+ pszUOMName = "arc-minute";
+ dfInDegrees = 1 / 60.0;
+ break;
+
+ case 9104:
+ pszUOMName = "arc-second";
+ dfInDegrees = 1 / 3600.0;
+ break;
+
+ case 9105:
+ pszUOMName = "grad";
+ dfInDegrees = 180.0 / 200.0;
+ break;
+
+ case 9106:
+ pszUOMName = "gon";
+ dfInDegrees = 180.0 / 200.0;
+ break;
+
+ case 9109:
+ pszUOMName = "microradian";
+ dfInDegrees = 180.0 / (PI * 1000000.0);
+ break;
+
+ default:
+ return FALSE;
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* Return to caller. */
+/* -------------------------------------------------------------------- */
+ if( ppszUOMName != NULL )
+ {
+ if( pszUOMName != NULL )
+ *ppszUOMName = CPLStrdup( pszUOMName );
+ else
+ *ppszUOMName = NULL;
+ }
+
+ if( pdfInDegrees != NULL )
+ *pdfInDegrees = dfInDegrees;
+
+ return( TRUE );
+}
+
+/************************************************************************/
+/* EPSGProjMethodToCTProjMethod() */
+/* */
+/* Convert between the EPSG enumeration for projection methods, */
+/* and the GeoTIFF CT codes. */
+/************************************************************************/
+
+static int EPSGProjMethodToCTProjMethod( int nEPSG )
+
+{
+ /* see trf_method.csv for list of EPSG codes */
+
+ switch( nEPSG )
+ {
+ case 9801:
+ return( CT_LambertConfConic_1SP );
+
+ case 9802:
+ return( CT_LambertConfConic_2SP );
+
+ case 9803:
+ return( CT_LambertConfConic_2SP ); /* Belgian variant not supported */
+
+ case 9804:
+ return( CT_Mercator ); /* 1SP and 2SP not differentiated */
+
+ case 9805:
+ return( CT_Mercator ); /* 1SP and 2SP not differentiated */
+
+ case 9806:
+ return( CT_CassiniSoldner );
+
+ case 9807:
+ return( CT_TransverseMercator );
+
+ case 9808:
+ return( CT_TransvMercator_SouthOriented );
+
+ case 9809:
+ return( CT_ObliqueStereographic );
+
+ case 9810:
+ return( CT_PolarStereographic );
+
+ case 9811:
+ return( CT_NewZealandMapGrid );
+
+ case 9812:
+ return( CT_ObliqueMercator ); /* is hotine actually different? */
+
+ case 9813:
+ return( CT_ObliqueMercator_Laborde );
+
+ case 9814:
+ return( CT_ObliqueMercator_Rosenmund ); /* swiss */
+
+ case 9815:
+ return( CT_ObliqueMercator );
+
+ case 9816: /* tunesia mining grid has no counterpart */
+ return( KvUserDefined );
+ }
+
+ return( KvUserDefined );
+}
+
+/************************************************************************/
+/* SetGTParmIds() */
+/* */
+/* This is hardcoded logic to set the GeoTIFF parmaeter */
+/* identifiers for all the EPSG supported projections. As the */
+/* trf_method.csv table grows with new projections, this code */
+/* will need to be updated. */
+/************************************************************************/
+
+static int SetGTParmIds( int nCTProjection,
+ int *panProjParmId,
+ int *panEPSGCodes )
+
+{
+ int anWorkingDummy[7];
+
+ if( panEPSGCodes == NULL )
+ panEPSGCodes = anWorkingDummy;
+ if( panProjParmId == NULL )
+ panProjParmId = anWorkingDummy;
+
+ memset( panEPSGCodes, 0, sizeof(int) * 7 );
+
+ /* psDefn->nParms = 7; */
+
+ switch( nCTProjection )
+ {
+ case CT_CassiniSoldner:
+ case CT_NewZealandMapGrid:
+ panProjParmId[0] = ProjNatOriginLatGeoKey;
+ panProjParmId[1] = ProjNatOriginLongGeoKey;
+ panProjParmId[5] = ProjFalseEastingGeoKey;
+ panProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ panEPSGCodes[0] = EPSGNatOriginLat;
+ panEPSGCodes[1] = EPSGNatOriginLong;
+ panEPSGCodes[5] = EPSGFalseEasting;
+ panEPSGCodes[6] = EPSGFalseNorthing;
+ return TRUE;
+
+ case CT_ObliqueMercator:
+ panProjParmId[0] = ProjCenterLatGeoKey;
+ panProjParmId[1] = ProjCenterLongGeoKey;
+ panProjParmId[2] = ProjAzimuthAngleGeoKey;
+ panProjParmId[3] = ProjRectifiedGridAngleGeoKey;
+ panProjParmId[4] = ProjScaleAtCenterGeoKey;
+ panProjParmId[5] = ProjFalseEastingGeoKey;
+ panProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ panEPSGCodes[0] = EPSGProjCenterLat;
+ panEPSGCodes[1] = EPSGProjCenterLong;
+ panEPSGCodes[2] = EPSGAzimuth;
+ panEPSGCodes[3] = EPSGAngleRectifiedToSkewedGrid;
+ panEPSGCodes[4] = EPSGInitialLineScaleFactor;
+ panEPSGCodes[5] = EPSGProjCenterEasting;
+ panEPSGCodes[6] = EPSGProjCenterNorthing;
+ return TRUE;
+
+ case CT_ObliqueMercator_Laborde:
+ panProjParmId[0] = ProjCenterLatGeoKey;
+ panProjParmId[1] = ProjCenterLongGeoKey;
+ panProjParmId[2] = ProjAzimuthAngleGeoKey;
+ panProjParmId[4] = ProjScaleAtCenterGeoKey;
+ panProjParmId[5] = ProjFalseEastingGeoKey;
+ panProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ panEPSGCodes[0] = EPSGProjCenterLat;
+ panEPSGCodes[1] = EPSGProjCenterLong;
+ panEPSGCodes[2] = EPSGAzimuth;
+ panEPSGCodes[4] = EPSGInitialLineScaleFactor;
+ panEPSGCodes[5] = EPSGProjCenterEasting;
+ panEPSGCodes[6] = EPSGProjCenterNorthing;
+ return TRUE;
+
+ case CT_LambertConfConic_1SP:
+ case CT_Mercator:
+ case CT_ObliqueStereographic:
+ case CT_PolarStereographic:
+ case CT_TransverseMercator:
+ case CT_TransvMercator_SouthOriented:
+ panProjParmId[0] = ProjNatOriginLatGeoKey;
+ panProjParmId[1] = ProjNatOriginLongGeoKey;
+ panProjParmId[4] = ProjScaleAtNatOriginGeoKey;
+ panProjParmId[5] = ProjFalseEastingGeoKey;
+ panProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ panEPSGCodes[0] = EPSGNatOriginLat;
+ panEPSGCodes[1] = EPSGNatOriginLong;
+ panEPSGCodes[4] = EPSGNatOriginScaleFactor;
+ panEPSGCodes[5] = EPSGFalseEasting;
+ panEPSGCodes[6] = EPSGFalseNorthing;
+ return TRUE;
+
+ case CT_LambertConfConic_2SP:
+ panProjParmId[0] = ProjFalseOriginLatGeoKey;
+ panProjParmId[1] = ProjFalseOriginLongGeoKey;
+ panProjParmId[2] = ProjStdParallel1GeoKey;
+ panProjParmId[3] = ProjStdParallel2GeoKey;
+ panProjParmId[5] = ProjFalseEastingGeoKey;
+ panProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ panEPSGCodes[0] = EPSGFalseOriginLat;
+ panEPSGCodes[1] = EPSGFalseOriginLong;
+ panEPSGCodes[2] = EPSGStdParallel1Lat;
+ panEPSGCodes[3] = EPSGStdParallel2Lat;
+ panEPSGCodes[5] = EPSGFalseOriginEasting;
+ panEPSGCodes[6] = EPSGFalseOriginNorthing;
+ return TRUE;
+
+ case CT_SwissObliqueCylindrical:
+ panProjParmId[0] = ProjCenterLatGeoKey;
+ panProjParmId[1] = ProjCenterLongGeoKey;
+ panProjParmId[5] = ProjFalseEastingGeoKey;
+ panProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ /* EPSG codes? */
+ return TRUE;
+
+ default:
+ return( FALSE );
+ }
+}
+
+/************************************************************************/
+/* GTIFGetProjTRFInfo() */
+/* */
+/* Transform a PROJECTION_TRF_CODE into a projection method, */
+/* and a set of parameters. The parameters identify will */
+/* depend on the returned method, but they will all have been */
+/* normalized into degrees and meters. */
+/************************************************************************/
+
+int GTIFGetProjTRFInfo( /* COORD_OP_CODE from coordinate_operation.csv */
+ int nProjTRFCode,
+ char **ppszProjTRFName,
+ short * pnProjMethod,
+ double * padfProjParms )
+
+{
+ int nProjMethod, i, anEPSGCodes[7];
+ double adfProjParms[7];
+ char szTRFCode[16];
+ int nCTProjMethod;
+ char *pszFilename = CPLStrdup(CSVFilename("projop_wparm.csv"));
+
+/* -------------------------------------------------------------------- */
+/* Get the proj method. If this fails to return a meaningful */
+/* number, then the whole function fails. */
+/* -------------------------------------------------------------------- */
+ sprintf( szTRFCode, "%d", nProjTRFCode );
+ nProjMethod =
+ atoi( CSVGetField( pszFilename,
+ "COORD_OP_CODE", szTRFCode, CC_Integer,
+ "COORD_OP_METHOD_CODE" ) );
+ if( nProjMethod == 0 )
+ {
+ CPLFree( pszFilename );
+ return FALSE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Initialize a definition of what EPSG codes need to be loaded */
+/* into what fields in adfProjParms. */
+/* -------------------------------------------------------------------- */
+ nCTProjMethod = EPSGProjMethodToCTProjMethod( nProjMethod );
+ SetGTParmIds( nCTProjMethod, NULL, anEPSGCodes );
+
+/* -------------------------------------------------------------------- */
+/* Get the parameters for this projection. For the time being */
+/* I am assuming the first four parameters are angles, the */
+/* fifth is unitless (normally scale), and the remainder are */
+/* linear measures. This works fine for the existing */
+/* projections, but is a pretty fragile approach. */
+/* -------------------------------------------------------------------- */
+
+ for( i = 0; i < 7; i++ )
+ {
+ char szParamUOMID[32], szParamValueID[32], szParamCodeID[32];
+ const char *pszValue;
+ int nUOM;
+ int nEPSGCode = anEPSGCodes[i];
+ int iEPSG;
+
+ /* Establish default */
+ if( nEPSGCode == EPSGAngleRectifiedToSkewedGrid )
+ adfProjParms[i] = 90.0;
+ else if( nEPSGCode == EPSGNatOriginScaleFactor
+ || nEPSGCode == EPSGInitialLineScaleFactor
+ || nEPSGCode == EPSGPseudoStdParallelScaleFactor )
+ adfProjParms[i] = 1.0;
+ else
+ adfProjParms[i] = 0.0;
+
+ /* If there is no parameter, skip */
+ if( nEPSGCode == 0 )
+ continue;
+
+ /* Find the matching parameter */
+ for( iEPSG = 0; iEPSG < 7; iEPSG++ )
+ {
+ sprintf( szParamCodeID, "PARAMETER_CODE_%d", iEPSG+1 );
+
+ if( atoi(CSVGetField( pszFilename,
+ "COORD_OP_CODE", szTRFCode, CC_Integer,
+ szParamCodeID )) == nEPSGCode )
+ break;
+ }
+
+ /* not found, accept the default */
+ if( iEPSG == 7 )
+ continue;
+
+ /* Get the value, and UOM */
+ sprintf( szParamUOMID, "PARAMETER_UOM_%d", iEPSG+1 );
+ sprintf( szParamValueID, "PARAMETER_VALUE_%d", iEPSG+1 );
+
+ nUOM = atoi(CSVGetField( pszFilename,
+ "COORD_OP_CODE", szTRFCode, CC_Integer,
+ szParamUOMID ));
+ pszValue = CSVGetField( pszFilename,
+ "COORD_OP_CODE", szTRFCode, CC_Integer,
+ szParamValueID );
+
+ /* Transform according to the UOM */
+ if( nUOM >= 9100 && nUOM < 9200 )
+ adfProjParms[i] = GTIFAngleStringToDD( pszValue, nUOM );
+ else if( nUOM > 9000 && nUOM < 9100 )
+ {
+ double dfInMeters;
+
+ if( !GTIFGetUOMLengthInfo( nUOM, NULL, &dfInMeters ) )
+ dfInMeters = 1.0;
+ adfProjParms[i] = atof(pszValue) * dfInMeters;
+ }
+ else
+ adfProjParms[i] = atof(pszValue);
+ }
+
+/* -------------------------------------------------------------------- */
+/* Get the name, if requested. */
+/* -------------------------------------------------------------------- */
+ if( ppszProjTRFName != NULL )
+ {
+ *ppszProjTRFName =
+ CPLStrdup(CSVGetField( pszFilename,
+ "COORD_OP_CODE", szTRFCode, CC_Integer,
+ "COORD_OP_NAME" ));
+ }
+
+/* -------------------------------------------------------------------- */
+/* Transfer requested data into passed variables. */
+/* -------------------------------------------------------------------- */
+ if( pnProjMethod != NULL )
+ *pnProjMethod = nProjMethod;
+
+ if( padfProjParms != NULL )
+ {
+ for( i = 0; i < 7; i++ )
+ padfProjParms[i] = adfProjParms[i];
+ }
+
+ CPLFree( pszFilename );
+
+ return TRUE;
+}
+
+/************************************************************************/
+/* GTIFFetchProjParms() */
+/* */
+/* Fetch the projection parameters for a particular projection */
+/* from a GeoTIFF file, and fill the GTIFDefn structure out */
+/* with them. */
+/************************************************************************/
+
+static void GTIFFetchProjParms( GTIF * psGTIF, GTIFDefn * psDefn )
+
+{
+ double dfNatOriginLong, dfNatOriginLat, dfRectGridAngle;
+ double dfFalseEasting, dfFalseNorthing, dfNatOriginScale;
+ double dfStdParallel1, dfStdParallel2, dfAzimuth;
+
+/* -------------------------------------------------------------------- */
+/* Get the false easting, and northing if available. */
+/* -------------------------------------------------------------------- */
+ if( !GTIFKeyGet(psGTIF, ProjFalseEastingGeoKey, &dfFalseEasting, 0, 1)
+ && !GTIFKeyGet(psGTIF, ProjCenterEastingGeoKey,
+ &dfFalseEasting, 0, 1) )
+ dfFalseEasting = 0.0;
+
+ if( !GTIFKeyGet(psGTIF, ProjFalseNorthingGeoKey, &dfFalseNorthing,0,1)
+ && !GTIFKeyGet(psGTIF, ProjCenterNorthingGeoKey,
+ &dfFalseNorthing, 0, 1) )
+ dfFalseNorthing = 0.0;
+
+ switch( psDefn->CTProjection )
+ {
+/* -------------------------------------------------------------------- */
+ case CT_Stereographic:
+/* -------------------------------------------------------------------- */
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0 )
+ dfNatOriginLong = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0 )
+ dfNatOriginLat = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjScaleAtNatOriginGeoKey,
+ &dfNatOriginScale, 0, 1 ) == 0 )
+ dfNatOriginScale = 1.0;
+
+ /* notdef: should transform to decimal degrees at this point */
+
+ psDefn->ProjParm[0] = dfNatOriginLat;
+ psDefn->ProjParmId[0] = ProjCenterLatGeoKey;
+ psDefn->ProjParm[1] = dfNatOriginLong;
+ psDefn->ProjParmId[1] = ProjCenterLongGeoKey;
+ psDefn->ProjParm[4] = dfNatOriginScale;
+ psDefn->ProjParmId[4] = ProjScaleAtNatOriginGeoKey;
+ psDefn->ProjParm[5] = dfFalseEasting;
+ psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+ psDefn->ProjParm[6] = dfFalseNorthing;
+ psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ psDefn->nParms = 7;
+ break;
+
+/* -------------------------------------------------------------------- */
+ case CT_LambertConfConic_1SP:
+ case CT_Mercator:
+ case CT_ObliqueStereographic:
+ case CT_TransverseMercator:
+ case CT_TransvMercator_SouthOriented:
+/* -------------------------------------------------------------------- */
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0 )
+ dfNatOriginLong = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0 )
+ dfNatOriginLat = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjScaleAtNatOriginGeoKey,
+ &dfNatOriginScale, 0, 1 ) == 0 )
+ dfNatOriginScale = 1.0;
+
+ /* notdef: should transform to decimal degrees at this point */
+
+ psDefn->ProjParm[0] = dfNatOriginLat;
+ psDefn->ProjParmId[0] = ProjNatOriginLatGeoKey;
+ psDefn->ProjParm[1] = dfNatOriginLong;
+ psDefn->ProjParmId[1] = ProjNatOriginLongGeoKey;
+ psDefn->ProjParm[4] = dfNatOriginScale;
+ psDefn->ProjParmId[4] = ProjScaleAtNatOriginGeoKey;
+ psDefn->ProjParm[5] = dfFalseEasting;
+ psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+ psDefn->ProjParm[6] = dfFalseNorthing;
+ psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ psDefn->nParms = 7;
+ break;
+
+/* -------------------------------------------------------------------- */
+ case CT_ObliqueMercator: /* hotine */
+/* -------------------------------------------------------------------- */
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0 )
+ dfNatOriginLong = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0 )
+ dfNatOriginLat = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjAzimuthAngleGeoKey,
+ &dfAzimuth, 0, 1 ) == 0 )
+ dfAzimuth = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjRectifiedGridAngleGeoKey,
+ &dfRectGridAngle, 0, 1 ) == 0 )
+ dfRectGridAngle = 90.0;
+
+ if( GTIFKeyGet(psGTIF, ProjScaleAtNatOriginGeoKey,
+ &dfNatOriginScale, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjScaleAtCenterGeoKey,
+ &dfNatOriginScale, 0, 1 ) == 0 )
+ dfNatOriginScale = 1.0;
+
+ /* notdef: should transform to decimal degrees at this point */
+
+ psDefn->ProjParm[0] = dfNatOriginLat;
+ psDefn->ProjParmId[0] = ProjCenterLatGeoKey;
+ psDefn->ProjParm[1] = dfNatOriginLong;
+ psDefn->ProjParmId[1] = ProjCenterLongGeoKey;
+ psDefn->ProjParm[2] = dfAzimuth;
+ psDefn->ProjParmId[2] = ProjAzimuthAngleGeoKey;
+ psDefn->ProjParm[3] = dfRectGridAngle;
+ psDefn->ProjParmId[3] = ProjRectifiedGridAngleGeoKey;
+ psDefn->ProjParm[4] = dfNatOriginScale;
+ psDefn->ProjParmId[4] = ProjScaleAtCenterGeoKey;
+ psDefn->ProjParm[5] = dfFalseEasting;
+ psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+ psDefn->ProjParm[6] = dfFalseNorthing;
+ psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ psDefn->nParms = 7;
+ break;
+
+/* -------------------------------------------------------------------- */
+ case CT_CassiniSoldner:
+ case CT_Polyconic:
+/* -------------------------------------------------------------------- */
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0 )
+ dfNatOriginLong = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0 )
+ dfNatOriginLat = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjScaleAtNatOriginGeoKey,
+ &dfNatOriginScale, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjScaleAtCenterGeoKey,
+ &dfNatOriginScale, 0, 1 ) == 0 )
+ dfNatOriginScale = 1.0;
+
+ /* notdef: should transform to decimal degrees at this point */
+
+ psDefn->ProjParm[0] = dfNatOriginLat;
+ psDefn->ProjParmId[0] = ProjNatOriginLatGeoKey;
+ psDefn->ProjParm[1] = dfNatOriginLong;
+ psDefn->ProjParmId[1] = ProjNatOriginLongGeoKey;
+ psDefn->ProjParm[4] = dfNatOriginScale;
+ psDefn->ProjParmId[4] = ProjScaleAtNatOriginGeoKey;
+ psDefn->ProjParm[5] = dfFalseEasting;
+ psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+ psDefn->ProjParm[6] = dfFalseNorthing;
+ psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ psDefn->nParms = 7;
+ break;
+
+/* -------------------------------------------------------------------- */
+ case CT_AzimuthalEquidistant:
+ case CT_MillerCylindrical:
+ case CT_Equirectangular:
+ case CT_Gnomonic:
+ case CT_LambertAzimEqualArea:
+ case CT_Orthographic:
+/* -------------------------------------------------------------------- */
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0 )
+ dfNatOriginLong = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0 )
+ dfNatOriginLat = 0.0;
+
+ /* notdef: should transform to decimal degrees at this point */
+
+ psDefn->ProjParm[0] = dfNatOriginLat;
+ psDefn->ProjParmId[0] = ProjCenterLatGeoKey;
+ psDefn->ProjParm[1] = dfNatOriginLong;
+ psDefn->ProjParmId[1] = ProjCenterLongGeoKey;
+ psDefn->ProjParm[5] = dfFalseEasting;
+ psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+ psDefn->ProjParm[6] = dfFalseNorthing;
+ psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ psDefn->nParms = 7;
+ break;
+
+/* -------------------------------------------------------------------- */
+ case CT_Robinson:
+ case CT_Sinusoidal:
+ case CT_VanDerGrinten:
+/* -------------------------------------------------------------------- */
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0 )
+ dfNatOriginLong = 0.0;
+
+ /* notdef: should transform to decimal degrees at this point */
+
+ psDefn->ProjParm[1] = dfNatOriginLong;
+ psDefn->ProjParmId[1] = ProjCenterLongGeoKey;
+ psDefn->ProjParm[5] = dfFalseEasting;
+ psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+ psDefn->ProjParm[6] = dfFalseNorthing;
+ psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ psDefn->nParms = 7;
+ break;
+
+/* -------------------------------------------------------------------- */
+ case CT_PolarStereographic:
+/* -------------------------------------------------------------------- */
+ if( GTIFKeyGet(psGTIF, ProjStraightVertPoleLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0 )
+ dfNatOriginLong = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0 )
+ dfNatOriginLat = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjScaleAtNatOriginGeoKey,
+ &dfNatOriginScale, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjScaleAtCenterGeoKey,
+ &dfNatOriginScale, 0, 1 ) == 0 )
+ dfNatOriginScale = 1.0;
+
+ /* notdef: should transform to decimal degrees at this point */
+
+ psDefn->ProjParm[0] = dfNatOriginLat;
+ psDefn->ProjParmId[0] = ProjNatOriginLatGeoKey;;
+ psDefn->ProjParm[1] = dfNatOriginLong;
+ psDefn->ProjParmId[1] = ProjStraightVertPoleLongGeoKey;
+ psDefn->ProjParm[4] = dfNatOriginScale;
+ psDefn->ProjParmId[4] = ProjScaleAtNatOriginGeoKey;
+ psDefn->ProjParm[5] = dfFalseEasting;
+ psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+ psDefn->ProjParm[6] = dfFalseNorthing;
+ psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ psDefn->nParms = 7;
+ break;
+
+/* -------------------------------------------------------------------- */
+ case CT_LambertConfConic_2SP:
+/* -------------------------------------------------------------------- */
+ if( GTIFKeyGet(psGTIF, ProjStdParallel1GeoKey,
+ &dfStdParallel1, 0, 1 ) == 0 )
+ dfStdParallel1 = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjStdParallel2GeoKey,
+ &dfStdParallel2, 0, 1 ) == 0 )
+ dfStdParallel1 = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0 )
+ dfNatOriginLong = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0 )
+ dfNatOriginLat = 0.0;
+
+ /* notdef: should transform to decimal degrees at this point */
+
+ psDefn->ProjParm[0] = dfNatOriginLat;
+ psDefn->ProjParmId[0] = ProjFalseOriginLatGeoKey;
+ psDefn->ProjParm[1] = dfNatOriginLong;
+ psDefn->ProjParmId[1] = ProjFalseOriginLongGeoKey;
+ psDefn->ProjParm[2] = dfStdParallel1;
+ psDefn->ProjParmId[2] = ProjStdParallel1GeoKey;
+ psDefn->ProjParm[3] = dfStdParallel2;
+ psDefn->ProjParmId[3] = ProjStdParallel2GeoKey;
+ psDefn->ProjParm[5] = dfFalseEasting;
+ psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+ psDefn->ProjParm[6] = dfFalseNorthing;
+ psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ psDefn->nParms = 7;
+ break;
+
+/* -------------------------------------------------------------------- */
+ case CT_AlbersEqualArea:
+ case CT_EquidistantConic:
+/* -------------------------------------------------------------------- */
+ if( GTIFKeyGet(psGTIF, ProjStdParallel1GeoKey,
+ &dfStdParallel1, 0, 1 ) == 0 )
+ dfStdParallel1 = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjStdParallel2GeoKey,
+ &dfStdParallel2, 0, 1 ) == 0 )
+ dfStdParallel1 = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey,
+ &dfNatOriginLong, 0, 1 ) == 0 )
+ dfNatOriginLong = 0.0;
+
+ if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0
+ && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey,
+ &dfNatOriginLat, 0, 1 ) == 0 )
+ dfNatOriginLat = 0.0;
+
+ /* notdef: should transform to decimal degrees at this point */
+
+ psDefn->ProjParm[0] = dfStdParallel1;
+ psDefn->ProjParmId[0] = ProjStdParallel1GeoKey;
+ psDefn->ProjParm[1] = dfStdParallel2;
+ psDefn->ProjParmId[1] = ProjStdParallel2GeoKey;
+ psDefn->ProjParm[2] = dfNatOriginLat;
+ psDefn->ProjParmId[2] = ProjNatOriginLatGeoKey;
+ psDefn->ProjParm[3] = dfNatOriginLong;
+ psDefn->ProjParmId[3] = ProjNatOriginLongGeoKey;
+ psDefn->ProjParm[5] = dfFalseEasting;
+ psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+ psDefn->ProjParm[6] = dfFalseNorthing;
+ psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ psDefn->nParms = 7;
+ break;
+ }
+}
+
+/************************************************************************/
+/* GTIFGetDefn() */
+/************************************************************************/
+
+/**
+ at param psGTIF GeoTIFF information handle as returned by GTIFNew.
+ at param psDefn Pointer to an existing GTIFDefn structure. This structure
+does not need to have been pre-initialized at all.
+
+ at return TRUE if the function has been successful, otherwise FALSE.
+
+This function reads the coordinate system definition from a GeoTIFF file,
+and <i>normalizes</i> it into a set of component information using
+definitions from CSV (Comma Seperated Value ASCII) files derived from
+EPSG tables. This function is intended to simplify correct support for
+reading files with defined PCS (Projected Coordinate System) codes that
+wouldn't otherwise be directly known by application software by reducing
+it to the underlying projection method, parameters, datum, ellipsoid,
+prime meridian and units.<p>
+
+The application should pass a pointer to an existing uninitialized
+GTIFDefn structure, and GTIFGetDefn() will fill it in. The fuction
+currently always returns TRUE but in the future will return FALSE if
+CSV files are not found. In any event, all geokeys actually found in the
+file will be copied into the GTIFDefn. However, if the CSV files aren't
+found codes implied by other codes will not be set properly.<p>
+
+GTIFGetDefn() will not generally work if the EPSG derived CSV files cannot
+be found. By default a modest attempt will be made to find them, but
+in general it is necessary for the calling application to override the
+logic to find them. This can be done by calling the
+SetCSVFilenameHook() function to
+override the search method based on application knowledge of where they are
+found.<p>
+
+The normalization methodology operates by fetching tags from the GeoTIFF
+file, and then setting all other tags implied by them in the structure. The
+implied relationships are worked out by reading definitions from the
+various EPSG derived CSV tables.<p>
+
+For instance, if a PCS (ProjectedCSTypeGeoKey) is found in the GeoTIFF file
+this code is used to lookup a record in the <tt>horiz_cs.csv</tt> CSV
+file. For example given the PCS 26746 we can find the name
+(NAD27 / California zone VI), the GCS 4257 (NAD27), and the ProjectionCode
+10406 (California CS27 zone VI). The GCS, and ProjectionCode can in turn
+be looked up in other tables until all the details of units, ellipsoid,
+prime meridian, datum, projection (LambertConfConic_2SP) and projection
+parameters are established. A full listgeo dump of a file
+for this result might look like the following, all based on a single PCS
+value:<p>
+
+<pre>
+% listgeo -norm ~/data/geotiff/pci_eg/spaf27.tif
+Geotiff_Information:
+ Version: 1
+ Key_Revision: 1.0
+ Tagged_Information:
+ ModelTiepointTag (2,3):
+ 0 0 0
+ 1577139.71 634349.176 0
+ ModelPixelScaleTag (1,3):
+ 195.509321 198.32184 0
+ End_Of_Tags.
+ Keyed_Information:
+ GTModelTypeGeoKey (Short,1): ModelTypeProjected
+ GTRasterTypeGeoKey (Short,1): RasterPixelIsArea
+ ProjectedCSTypeGeoKey (Short,1): PCS_NAD27_California_VI
+ End_Of_Keys.
+ End_Of_Geotiff.
+
+PCS = 26746 (NAD27 / California zone VI)
+Projection = 10406 (California CS27 zone VI)
+Projection Method: CT_LambertConfConic_2SP
+ ProjStdParallel1GeoKey: 33.883333
+ ProjStdParallel2GeoKey: 32.766667
+ ProjFalseOriginLatGeoKey: 32.166667
+ ProjFalseOriginLongGeoKey: -116.233333
+ ProjFalseEastingGeoKey: 609601.219202
+ ProjFalseNorthingGeoKey: 0.000000
+GCS: 4267/NAD27
+Datum: 6267/North American Datum 1927
+Ellipsoid: 7008/Clarke 1866 (6378206.40,6356583.80)
+Prime Meridian: 8901/Greenwich (0.000000)
+Projection Linear Units: 9003/US survey foot (0.304801m)
+</pre>
+
+Note that GTIFGetDefn() does not inspect or return the tiepoints and scale.
+This must be handled seperately as it normally would. It is intended to
+simplify capture and normalization of the coordinate system definition.
+Note that GTIFGetDefn() also does the following things:
+
+<ol>
+<li> Convert all angular values to decimal degrees.
+<li> Convert all linear values to meters.
+<li> Return the linear units and conversion to meters for the tiepoints and
+scale (though the tiepoints and scale remain in their native units).
+<li> When reading projection parameters a variety of differences between
+different GeoTIFF generators are handled, and a normalized set of parameters
+for each projection are always returned.
+</ol>
+
+Code fields in the GTIFDefn are filled with KvUserDefined if there is not
+value to assign. The parameter lists for each of the underlying projection
+transform methods can be found at the
+<a href="http://www.remotesensing.org/geotiff/proj_list">Projections</a>
+page. Note that nParms will be set based on the maximum parameter used.
+Some of the parameters may not be used in which case the
+GTIFDefn::ProjParmId[] will
+be zero. This is done to retain correspondence to the EPSG parameter
+numbering scheme.<p>
+
+The
+<a href="http://www.remotesensing.org/cgi-bin/cvsweb.cgi/~checkout~/osrs/geotiff/libgeotiff/geotiff_proj4.c">geotiff_proj4.c</a> module distributed with libgeotiff can
+be used as an example of code that converts a GTIFDefn into another projection
+system.<p>
+
+ at see GTIFKeySet(), SetCSVFilenameHook()
+
+*/
+
+int GTIFGetDefn( GTIF * psGTIF, GTIFDefn * psDefn )
+
+{
+ int i;
+ short nGeogUOMLinear;
+ double dfInvFlattening;
+
+/* -------------------------------------------------------------------- */
+/* Initially we default all the information we can. */
+/* -------------------------------------------------------------------- */
+ psDefn->Model = KvUserDefined;
+ psDefn->PCS = KvUserDefined;
+ psDefn->GCS = KvUserDefined;
+ psDefn->UOMLength = KvUserDefined;
+ psDefn->UOMLengthInMeters = 1.0;
+ psDefn->UOMAngle = KvUserDefined;
+ psDefn->UOMAngleInDegrees = 1.0;
+ psDefn->Datum = KvUserDefined;
+ psDefn->Ellipsoid = KvUserDefined;
+ psDefn->SemiMajor = 0.0;
+ psDefn->SemiMinor = 0.0;
+ psDefn->PM = KvUserDefined;
+ psDefn->PMLongToGreenwich = 0.0;
+
+ psDefn->ProjCode = KvUserDefined;
+ psDefn->Projection = KvUserDefined;
+ psDefn->CTProjection = KvUserDefined;
+
+ psDefn->nParms = 0;
+ for( i = 0; i < MAX_GTIF_PROJPARMS; i++ )
+ {
+ psDefn->ProjParm[i] = 0.0;
+ psDefn->ProjParmId[i] = 0;
+ }
+
+ psDefn->MapSys = KvUserDefined;
+ psDefn->Zone = 0;
+
+/* -------------------------------------------------------------------- */
+/* Try to get the overall model type. */
+/* -------------------------------------------------------------------- */
+ GTIFKeyGet(psGTIF,GTModelTypeGeoKey,&(psDefn->Model),0,1);
+
+/* -------------------------------------------------------------------- */
+/* Extract the Geog units. */
+/* -------------------------------------------------------------------- */
+ nGeogUOMLinear = 9001; /* Linear_Meter */
+ GTIFKeyGet(psGTIF, GeogLinearUnitsGeoKey, &nGeogUOMLinear, 0, 1 );
+
+/* -------------------------------------------------------------------- */
+/* Try to get a PCS. */
+/* -------------------------------------------------------------------- */
+ if( GTIFKeyGet(psGTIF,ProjectedCSTypeGeoKey, &(psDefn->PCS),0,1) == 1
+ && psDefn->PCS != KvUserDefined )
+ {
+ /*
+ * Translate this into useful information.
+ */
+ GTIFGetPCSInfo( psDefn->PCS, NULL, &(psDefn->ProjCode),
+ &(psDefn->UOMLength), &(psDefn->GCS) );
+ }
+
+/* -------------------------------------------------------------------- */
+/* If we have the PCS code, but didn't find it in the CSV files */
+/* (likely because we can't find them) we will try some ``jiffy */
+/* rules'' for UTM and state plane. */
+/* -------------------------------------------------------------------- */
+ if( psDefn->PCS != KvUserDefined && psDefn->ProjCode == KvUserDefined )
+ {
+ int nMapSys, nZone;
+ int nGCS = psDefn->GCS;
+
+ nMapSys = GTIFPCSToMapSys( psDefn->PCS, &nGCS, &nZone );
+ if( nMapSys != KvUserDefined )
+ {
+ psDefn->ProjCode = GTIFMapSysToProj( nMapSys, nZone );
+ psDefn->GCS = nGCS;
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* If the Proj_ code is specified directly, use that. */
+/* -------------------------------------------------------------------- */
+ if( psDefn->ProjCode == KvUserDefined )
+ GTIFKeyGet(psGTIF, ProjectionGeoKey, &(psDefn->ProjCode), 0, 1 );
+
+ if( psDefn->ProjCode != KvUserDefined )
+ {
+ /*
+ * We have an underlying projection transformation value. Look
+ * this up. For a PCS of ``WGS 84 / UTM 11'' the transformation
+ * would be Transverse Mercator, with a particular set of options.
+ * The nProjTRFCode itself would correspond to the name
+ * ``UTM zone 11N'', and doesn't include datum info.
+ */
+ GTIFGetProjTRFInfo( psDefn->ProjCode, NULL, &(psDefn->Projection),
+ psDefn->ProjParm );
+
+ /*
+ * Set the GeoTIFF identity of the parameters.
+ */
+ psDefn->CTProjection =
+ EPSGProjMethodToCTProjMethod( psDefn->Projection );
+
+ SetGTParmIds( psDefn->CTProjection, psDefn->ProjParmId, NULL);
+ psDefn->nParms = 7;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Try to get a GCS. If found, it will override any implied by */
+/* the PCS. */
+/* -------------------------------------------------------------------- */
+ GTIFKeyGet(psGTIF, GeographicTypeGeoKey, &(psDefn->GCS), 0, 1 );
+
+/* -------------------------------------------------------------------- */
+/* Derive the datum, and prime meridian from the GCS. */
+/* -------------------------------------------------------------------- */
+ if( psDefn->GCS != KvUserDefined )
+ {
+ GTIFGetGCSInfo( psDefn->GCS, NULL, &(psDefn->Datum), &(psDefn->PM),
+ &(psDefn->UOMAngle) );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Handle the GCS angular units. GeogAngularUnitsGeoKey */
+/* overrides the GCS or PCS setting. */
+/* -------------------------------------------------------------------- */
+ GTIFKeyGet(psGTIF, GeogAngularUnitsGeoKey, &(psDefn->UOMAngle), 0, 1 );
+ if( psDefn->UOMAngle != KvUserDefined )
+ {
+ GTIFGetUOMAngleInfo( psDefn->UOMAngle, NULL,
+ &(psDefn->UOMAngleInDegrees) );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Check for a datum setting, and then use the datum to derive */
+/* an ellipsoid. */
+/* -------------------------------------------------------------------- */
+ GTIFKeyGet(psGTIF, GeogGeodeticDatumGeoKey, &(psDefn->Datum), 0, 1 );
+
+ if( psDefn->Datum != KvUserDefined )
+ {
+ GTIFGetDatumInfo( psDefn->Datum, NULL, &(psDefn->Ellipsoid) );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Check for an explicit ellipsoid. Use the ellipsoid to */
+/* derive the ellipsoid characteristics, if possible. */
+/* -------------------------------------------------------------------- */
+ GTIFKeyGet(psGTIF, GeogEllipsoidGeoKey, &(psDefn->Ellipsoid), 0, 1 );
+
+ if( psDefn->Ellipsoid != KvUserDefined )
+ {
+ GTIFGetEllipsoidInfo( psDefn->Ellipsoid, NULL,
+ &(psDefn->SemiMajor), &(psDefn->SemiMinor) );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Check for overridden ellipsoid parameters. It would be nice */
+/* to warn if they conflict with provided information, but for */
+/* now we just override. */
+/* -------------------------------------------------------------------- */
+ GTIFKeyGet(psGTIF, GeogSemiMajorAxisGeoKey, &(psDefn->SemiMajor), 0, 1 );
+ GTIFKeyGet(psGTIF, GeogSemiMinorAxisGeoKey, &(psDefn->SemiMinor), 0, 1 );
+
+ if( GTIFKeyGet(psGTIF, GeogInvFlatteningGeoKey, &dfInvFlattening,
+ 0, 1 ) == 1 )
+ {
+ if( dfInvFlattening != 0.0 )
+ psDefn->SemiMinor =
+ psDefn->SemiMajor * (1 - 1.0/dfInvFlattening);
+ }
+
+/* -------------------------------------------------------------------- */
+/* Get the prime meridian info. */
+/* -------------------------------------------------------------------- */
+ GTIFKeyGet(psGTIF, GeogPrimeMeridianGeoKey, &(psDefn->PM), 0, 1 );
+
+ if( psDefn->PM != KvUserDefined )
+ {
+ GTIFGetPMInfo( psDefn->PM, NULL, &(psDefn->PMLongToGreenwich) );
+ }
+ else
+ {
+ GTIFKeyGet(psGTIF, GeogPrimeMeridianLongGeoKey,
+ &(psDefn->PMLongToGreenwich), 0, 1 );
+
+ psDefn->PMLongToGreenwich =
+ GTIFAngleToDD( psDefn->PMLongToGreenwich,
+ psDefn->UOMAngle );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Have the projection units of measure been overridden? We */
+/* should likely be doing something about angular units too, */
+/* but these are very rarely not decimal degrees for actual */
+/* file coordinates. */
+/* -------------------------------------------------------------------- */
+ GTIFKeyGet(psGTIF,ProjLinearUnitsGeoKey,&(psDefn->UOMLength),0,1);
+
+ if( psDefn->UOMLength != KvUserDefined )
+ {
+ GTIFGetUOMLengthInfo( psDefn->UOMLength, NULL,
+ &(psDefn->UOMLengthInMeters) );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Handle a variety of user defined transform types. */
+/* -------------------------------------------------------------------- */
+ if( GTIFKeyGet(psGTIF,ProjCoordTransGeoKey,
+ &(psDefn->CTProjection),0,1) == 1)
+ {
+ GTIFFetchProjParms( psGTIF, psDefn );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Try to set the zoned map system information. */
+/* -------------------------------------------------------------------- */
+ psDefn->MapSys = GTIFProjToMapSys( psDefn->ProjCode, &(psDefn->Zone) );
+
+/* -------------------------------------------------------------------- */
+/* If this is UTM, and we were unable to extract the projection */
+/* parameters from the CSV file, just set them directly now, */
+/* since it's pretty easy, and a common case. */
+/* -------------------------------------------------------------------- */
+ if( (psDefn->MapSys == MapSys_UTM_North
+ || psDefn->MapSys == MapSys_UTM_South)
+ && psDefn->CTProjection == KvUserDefined )
+ {
+ psDefn->CTProjection = CT_TransverseMercator;
+ psDefn->nParms = 7;
+ psDefn->ProjParmId[0] = ProjNatOriginLatGeoKey;
+ psDefn->ProjParm[0] = 0.0;
+
+ psDefn->ProjParmId[1] = ProjNatOriginLongGeoKey;
+ psDefn->ProjParm[1] = psDefn->Zone*6 - 183.0;
+
+ psDefn->ProjParmId[4] = ProjScaleAtNatOriginGeoKey;
+ psDefn->ProjParm[4] = 0.9996;
+
+ psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+ psDefn->ProjParm[5] = 500000.0;
+
+ psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+ if( psDefn->MapSys == MapSys_UTM_North )
+ psDefn->ProjParm[6] = 0.0;
+ else
+ psDefn->ProjParm[6] = 10000000.0;
+ }
+
+/* -------------------------------------------------------------------- */
+/* For now we forceable deaccess all CSV files to reduce the */
+/* chance of "leakage". Really, this should be application */
+/* controlled. */
+/* -------------------------------------------------------------------- */
+ CSVDeaccess( NULL );
+
+ return TRUE;
+}
+
+/************************************************************************/
+/* GTIFDecToDMS() */
+/* */
+/* Convenient function to translate decimal degrees to DMS */
+/* format for reporting to a user. */
+/************************************************************************/
+
+const char *GTIFDecToDMS( double dfAngle, const char * pszAxis,
+ int nPrecision )
+
+{
+ int nDegrees, nMinutes;
+ double dfSeconds;
+ char szFormat[30];
+ static char szBuffer[50];
+ const char *pszHemisphere = NULL;
+ double dfRound;
+ int i;
+
+ dfRound = 0.5/60;
+ for( i = 0; i < nPrecision; i++ )
+ dfRound = dfRound * 0.1;
+
+ nDegrees = (int) ABS(dfAngle);
+ nMinutes = (int) ((ABS(dfAngle) - nDegrees) * 60 + dfRound);
+ dfSeconds = ABS((ABS(dfAngle) * 3600 - nDegrees*3600 - nMinutes*60));
+
+ if( EQUAL(pszAxis,"Long") && dfAngle < 0.0 )
+ pszHemisphere = "W";
+ else if( EQUAL(pszAxis,"Long") )
+ pszHemisphere = "E";
+ else if( dfAngle < 0.0 )
+ pszHemisphere = "S";
+ else
+ pszHemisphere = "N";
+
+ sprintf( szFormat, "%%3dd%%2d\'%%%d.%df\"%s",
+ nPrecision+3, nPrecision, pszHemisphere );
+ sprintf( szBuffer, szFormat, nDegrees, nMinutes, dfSeconds );
+
+ return( szBuffer );
+}
+
+/************************************************************************/
+/* GTIFPrintDefn() */
+/* */
+/* Report the contents of a GTIFDefn structure ... mostly for */
+/* debugging. */
+/************************************************************************/
+
+void GTIFPrintDefn( GTIFDefn * psDefn, FILE * fp )
+
+{
+/* -------------------------------------------------------------------- */
+/* Get the PCS name if possible. */
+/* -------------------------------------------------------------------- */
+ if( psDefn->PCS != KvUserDefined )
+ {
+ char *pszPCSName = NULL;
+
+ GTIFGetPCSInfo( psDefn->PCS, &pszPCSName, NULL, NULL, NULL );
+ if( pszPCSName == NULL )
+ pszPCSName = CPLStrdup("name unknown");
+
+ fprintf( fp, "PCS = %d (%s)\n", psDefn->PCS, pszPCSName );
+ CPLFree( pszPCSName );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Dump the projection code if possible. */
+/* -------------------------------------------------------------------- */
+ if( psDefn->ProjCode != KvUserDefined )
+ {
+ char *pszTRFName = NULL;
+
+ GTIFGetProjTRFInfo( psDefn->ProjCode, &pszTRFName, NULL, NULL );
+ if( pszTRFName == NULL )
+ pszTRFName = CPLStrdup("");
+
+ fprintf( fp, "Projection = %d (%s)\n",
+ psDefn->ProjCode, pszTRFName );
+
+ CPLFree( pszTRFName );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Try to dump the projection method name, and parameters if possible.*/
+/* -------------------------------------------------------------------- */
+ if( psDefn->CTProjection != KvUserDefined )
+ {
+ char *pszName = GTIFValueName(ProjCoordTransGeoKey,
+ psDefn->CTProjection);
+ int i;
+
+ if( pszName == NULL )
+ pszName = "(unknown)";
+
+ fprintf( fp, "Projection Method: %s\n", pszName );
+
+ for( i = 0; i < psDefn->nParms; i++ )
+ {
+ if( psDefn->ProjParmId[i] == 0 )
+ continue;
+
+ pszName = GTIFKeyName((geokey_t) psDefn->ProjParmId[i]);
+ if( pszName == NULL )
+ pszName = "(unknown)";
+
+ if( i < 4 )
+ {
+ char *pszAxisName;
+
+ if( strstr(pszName,"Long") != NULL )
+ pszAxisName = "Long";
+ else if( strstr(pszName,"Lat") != NULL )
+ pszAxisName = "Lat";
+ else
+ pszAxisName = "?";
+
+ fprintf( fp, " %s: %f (%s)\n",
+ pszName, psDefn->ProjParm[i],
+ GTIFDecToDMS( psDefn->ProjParm[i], pszAxisName, 2 ) );
+ }
+ else if( i == 4 )
+ fprintf( fp, " %s: %f\n", pszName, psDefn->ProjParm[i] );
+ else
+ fprintf( fp, " %s: %f m\n", pszName, psDefn->ProjParm[i] );
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* Report the GCS name, and number. */
+/* -------------------------------------------------------------------- */
+ if( psDefn->GCS != KvUserDefined )
+ {
+ char *pszName = NULL;
+
+ GTIFGetGCSInfo( psDefn->GCS, &pszName, NULL, NULL, NULL );
+ if( pszName == NULL )
+ pszName = CPLStrdup("(unknown)");
+
+ fprintf( fp, "GCS: %d/%s\n", psDefn->GCS, pszName );
+ CPLFree( pszName );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Report the datum name. */
+/* -------------------------------------------------------------------- */
+ if( psDefn->Datum != KvUserDefined )
+ {
+ char *pszName = NULL;
+
+ GTIFGetDatumInfo( psDefn->Datum, &pszName, NULL );
+ if( pszName == NULL )
+ pszName = CPLStrdup("(unknown)");
+
+ fprintf( fp, "Datum: %d/%s\n", psDefn->Datum, pszName );
+ CPLFree( pszName );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Report the ellipsoid. */
+/* -------------------------------------------------------------------- */
+ if( psDefn->Ellipsoid != KvUserDefined )
+ {
+ char *pszName = NULL;
+
+ GTIFGetEllipsoidInfo( psDefn->Ellipsoid, &pszName, NULL, NULL );
+ if( pszName == NULL )
+ pszName = CPLStrdup("(unknown)");
+
+ fprintf( fp, "Ellipsoid: %d/%s (%.2f,%.2f)\n",
+ psDefn->Ellipsoid, pszName,
+ psDefn->SemiMajor, psDefn->SemiMinor );
+ CPLFree( pszName );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Report the prime meridian. */
+/* -------------------------------------------------------------------- */
+ if( psDefn->PM != KvUserDefined )
+ {
+ char *pszName = NULL;
+
+ GTIFGetPMInfo( psDefn->PM, &pszName, NULL );
+
+ if( pszName == NULL )
+ pszName = CPLStrdup("(unknown)");
+
+ fprintf( fp, "Prime Meridian: %d/%s (%f/%s)\n",
+ psDefn->PM, pszName,
+ psDefn->PMLongToGreenwich,
+ GTIFDecToDMS( psDefn->PMLongToGreenwich, "Long", 2 ) );
+ CPLFree( pszName );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Report the projection units of measure (currently just */
+/* linear). */
+/* -------------------------------------------------------------------- */
+ if( psDefn->UOMLength != KvUserDefined )
+ {
+ char *pszName = NULL;
+
+ GTIFGetUOMLengthInfo( psDefn->UOMLength, &pszName, NULL );
+ if( pszName == NULL )
+ pszName = CPLStrdup( "(unknown)" );
+
+ fprintf( fp, "Projection Linear Units: %d/%s (%fm)\n",
+ psDefn->UOMLength, pszName, psDefn->UOMLengthInMeters );
+ CPLFree( pszName );
+ }
+
+ CSVDeaccess( NULL );
+}
+
+/************************************************************************/
+/* GTIFFreeMemory() */
+/* */
+/* Externally visible function to free memory allocated within */
+/* geo_normalize.c. */
+/************************************************************************/
+
+void GTIFFreeMemory( char * pMemory )
+
+{
+ if( pMemory != NULL )
+ VSIFree( pMemory );
+}
+
+/************************************************************************/
+/* GTIFDeaccessCSV() */
+/* */
+/* Free all cached CSV info. */
+/************************************************************************/
+
+void GTIFDeaccessCSV()
+
+{
+ CSVDeaccess( NULL );
+}
diff --git a/src/tiff/geo_normalize.h b/src/tiff/geo_normalize.h
new file mode 100644
index 0000000..3cd551f
--- /dev/null
+++ b/src/tiff/geo_normalize.h
@@ -0,0 +1,233 @@
+/******************************************************************************
+ * $Id: geo_normalize.h,v 1.3 2004/03/19 11:51:24 lubia Exp $
+ *
+ * Project: libgeotiff
+ * Purpose: Include file related to geo_normalize.c containing Code to
+ * normalize PCS and other composite codes in a GeoTIFF file.
+ * Author: Frank Warmerdam, warmerda at home.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: geo_normalize.h,v $
+ * Revision 1.3 2004/03/19 11:51:24 lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.10 2003/01/15 04:39:16 warmerda
+ * Added GTIFDeaccessCSV
+ *
+ * Revision 1.9 2003/01/15 03:37:40 warmerda
+ * added GTIFFreeMemory()
+ *
+ * Revision 1.8 2002/11/28 22:27:42 warmerda
+ * preliminary upgrade to EPSG 6.2.2 tables
+ *
+ * Revision 1.7 1999/09/17 00:55:26 warmerda
+ * added GTIFGetUOMAngleInfo(), and UOMAngle in GTIFDefn
+ *
+ * Revision 1.6 1999/05/04 03:13:42 warmerda
+ * Added prototype
+ *
+ * Revision 1.5 1999/04/29 23:02:55 warmerda
+ * added docs, and MapSys related stuff
+ *
+ * Revision 1.4 1999/03/18 21:35:19 geotiff
+ * Added PROJ.4 related stuff
+ *
+ * Revision 1.3 1999/03/17 20:44:04 geotiff
+ * added CPL_DLL related support
+ *
+ * Revision 1.2 1999/03/10 18:24:06 geotiff
+ * corrected to use int'
+ *
+ */
+
+#ifndef GEO_NORMALIZE_H_INCLUDED
+#define GEO_NORMALIZE_H_INCLUDED
+
+#include <stdio.h>
+#include "geotiff.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \file geo_normalize.h
+ *
+ * Include file for extended projection definition normalization api.
+ */
+
+#define MAX_GTIF_PROJPARMS 10
+
+/**
+ * Holds a definition of a coordinate system in normalized form.
+ */
+
+typedef struct {
+ /** From GTModelTypeGeoKey tag. Can have the values ModelTypeGeographic
+ or ModelTypeProjected. */
+ short Model;
+
+ /** From ProjectedCSTypeGeoKey tag. For example PCS_NAD27_UTM_zone_3N.*/
+ short PCS;
+
+ /** From GeographicTypeGeoKey tag. For example GCS_WGS_84 or
+ GCS_Voirol_1875_Paris. Includes datum and prime meridian value. */
+ short GCS;
+
+ /** From ProjLinearUnitsGeoKey. For example Linear_Meter. */
+ short UOMLength;
+
+ /** One UOMLength = UOMLengthInMeters meters. */
+ double UOMLengthInMeters;
+
+ /** The angular units of the GCS. */
+ short UOMAngle;
+
+ /** One UOMAngle = UOMLengthInDegrees degrees. */
+ double UOMAngleInDegrees;
+
+ /** Datum from GeogGeodeticDatumGeoKey tag. For example Datum_WGS84 */
+ short Datum;
+
+ /** Prime meridian from GeogPrimeMeridianGeoKey. For example PM_Greenwich
+ or PM_Paris. */
+ short PM;
+
+ /** Decimal degrees of longitude between this prime meridian and
+ Greenwich. Prime meridians to the west of Greenwich are negative. */
+ double PMLongToGreenwich;
+
+ /** Ellipsoid identifier from GeogELlipsoidGeoKey. For example
+ Ellipse_Clarke_1866. */
+ short Ellipsoid;
+
+ /** The length of the semi major ellipse axis in meters. */
+ double SemiMajor;
+
+ /** The length of the semi minor ellipse axis in meters. */
+ double SemiMinor;
+
+ /** Projection id from ProjectionGeoKey. For example Proj_UTM_11S. */
+ short ProjCode;
+
+ /** EPSG identifier for underlying projection method. From the EPSG
+ TRF_METHOD table. */
+ short Projection;
+
+ /** GeoTIFF identifier for underlying projection method. While some of
+ these values have corresponding vlaues in EPSG (Projection field),
+ others do not. For example CT_TransverseMercator. */
+ short CTProjection;
+
+ /** Number of projection parameters in ProjParm and ProjParmId. */
+ int nParms;
+
+ /** Projection parameter value. The identify of this parameter
+ is established from the corresponding entry in ProjParmId. The
+ value will be measured in meters, or decimal degrees if it is a
+ linear or angular measure. */
+ double ProjParm[MAX_GTIF_PROJPARMS];
+
+ /** Projection parameter identifier. For example ProjFalseEastingGeoKey.
+ The value will be 0 for unused table entries. */
+ int ProjParmId[MAX_GTIF_PROJPARMS]; /* geokey identifier,
+ eg. ProjFalseEastingGeoKey*/
+
+ /** Special zone map system code (MapSys_UTM_South, MapSys_UTM_North,
+ MapSys_State_Plane or KvUserDefined if none apply. */
+ int MapSys;
+
+ /** UTM, or State Plane Zone number, zero if not known. */
+ int Zone;
+
+} GTIFDefn;
+
+int CPL_DLL GTIFGetPCSInfo( int nPCSCode, char **ppszEPSGName,
+ short *pnProjOp,
+ short *pnUOMLengthCode, short *pnGeogCS );
+int CPL_DLL GTIFGetProjTRFInfo( int nProjTRFCode,
+ char ** ppszProjTRFName,
+ short * pnProjMethod,
+ double * padfProjParms );
+int CPL_DLL GTIFGetGCSInfo( int nGCSCode, char **ppszName,
+ short *pnDatum, short *pnPM, short *pnUOMAngle );
+int CPL_DLL GTIFGetDatumInfo( int nDatumCode, char **ppszName,
+ short * pnEllipsoid );
+int CPL_DLL GTIFGetEllipsoidInfo( int nEllipsoid, char ** ppszName,
+ double * pdfSemiMajor,
+ double * pdfSemiMinor );
+int CPL_DLL GTIFGetPMInfo( int nPM, char **ppszName,
+ double * pdfLongToGreenwich );
+
+double CPL_DLL GTIFAngleStringToDD( const char *pszAngle, int nUOMAngle );
+int CPL_DLL GTIFGetUOMLengthInfo( int nUOMLengthCode,
+ char **ppszUOMName,
+ double * pdfInMeters );
+int CPL_DLL GTIFGetUOMAngleInfo( int nUOMAngleCode,
+ char **ppszUOMName,
+ double * pdfInDegrees );
+
+/* this should be used to free strings returned by GTIFGet... funcs */
+void CPL_DLL GTIFFreeMemory( char * );
+void CPL_DLL GTIFDeaccessCSV();
+
+int CPL_DLL GTIFGetDefn( GTIF *psGTIF, GTIFDefn * psDefn );
+void CPL_DLL GTIFPrintDefn( GTIFDefn *, FILE * );
+void CPL_DLL GTIFFreeDefn( GTIF * );
+
+void CPL_DLL SetCSVFilenameHook( const char *(*CSVFileOverride)(const char *) );
+
+const char CPL_DLL *GTIFDecToDMS( double, const char *, int );
+
+/*
+ * These are useful for recognising UTM and State Plane, with or without
+ * CSV files being found.
+ */
+
+#define MapSys_UTM_North -9001
+#define MapSys_UTM_South -9002
+#define MapSys_State_Plane_27 -9003
+#define MapSys_State_Plane_83 -9004
+
+int CPL_DLL GTIFMapSysToPCS( int MapSys, int Datum, int nZone );
+int CPL_DLL GTIFMapSysToProj( int MapSys, int nZone );
+int CPL_DLL GTIFPCSToMapSys( int PCSCode, int * pDatum, int * pZone );
+int CPL_DLL GTIFProjToMapSys( int ProjCode, int * pZone );
+
+/*
+ * These are only useful if using libgeotiff with libproj (PROJ.4+).
+ */
+char CPL_DLL *GTIFGetProj4Defn( GTIFDefn * );
+int CPL_DLL GTIFProj4ToLatLong( GTIFDefn *, int, double *, double * );
+int CPL_DLL GTIFProj4FromLatLong( GTIFDefn *, int, double *, double * );
+
+#if defined(HAVE_LIBPROJ) && defined(HAVE_PROJECTS_H)
+# define HAVE_GTIFPROJ4
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ndef GEO_NORMALIZE_H_INCLUDED */
diff --git a/src/tiff/geo_print.c b/src/tiff/geo_print.c
new file mode 100644
index 0000000..0964a4b
--- /dev/null
+++ b/src/tiff/geo_print.c
@@ -0,0 +1,496 @@
+/**********************************************************************
+ *
+ * geo_print.c -- Key-dumping routines for GEOTIFF files.
+ *
+ * Written By: Niles D. Ritter.
+ *
+ * copyright (c) 1995 Niles D. Ritter
+ *
+ * Permission granted to use this software, so long as this copyright
+ * notice accompanies any products derived therefrom.
+ *
+ * Revision History;
+ *
+ * 20 June, 1995 Niles D. Ritter New
+ * 7 July, 1995 NDR Fix indexing
+ * 27 July, 1995 NDR Added Import utils
+ * 28 July, 1995 NDR Made parser more strict.
+ * 29 Sep, 1995 NDR Fixed matrix printing.
+ *
+ * $Log: geo_print.c,v $
+ * Revision 1.2 2004/03/19 11:51:24 lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.4 2002/05/31 14:27:26 warmerda
+ * added escaping in metadata for string key values
+ *
+ * Revision 1.3 1999/05/04 03:14:35 warmerda
+ * avoid warnings
+ *
+ * Revision 1.2 1999/05/03 17:50:31 warmerda
+ * avoid warnings on IRIX
+ *
+ *
+ **********************************************************************/
+
+#include "geotiff.h" /* public interface */
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h" /* private interface */
+#include "geokeys.h"
+
+#include <stdio.h> /* for sprintf */
+
+#define FMT_GEOTIFF "Geotiff_Information:"
+#define FMT_VERSION "Version: %hd"
+#define FMT_REV "Key_Revision: %1hd.%hd"
+#define FMT_TAGS "Tagged_Information:"
+#define FMT_TAGEND "End_Of_Tags."
+#define FMT_KEYS "Keyed_Information:"
+#define FMT_KEYEND "End_Of_Keys."
+#define FMT_GEOEND "End_Of_Geotiff."
+#define FMT_DOUBLE "%-17.9g"
+#define FMT_SHORT "%-11hd"
+
+static void DefaultPrint(char *string, void *aux);
+static void PrintKey(GeoKey *key, GTIFPrintMethod print,void *aux);
+static void PrintGeoTags(GTIF *gtif,GTIFReadMethod scan,void *aux);
+static void PrintTag(int tag, int nrows, double *data, int ncols,
+ GTIFPrintMethod print,void *aux);
+static void DefaultRead(char *string, void *aux);
+static int ReadKey(GTIF *gt, GTIFReadMethod scan, void *aux);
+static int ReadTag(GTIF *gt,GTIFReadMethod scan,void *aux);
+
+/*
+ * Print off the directory info, using whatever method is specified
+ * (defaults to fprintf if null). The "aux" parameter is provided for user
+ * defined method for passing parameters or whatever.
+ *
+ * The output format is a "GeoTIFF meta-data" file, which may be
+ * used to import information with the GTIFFImport() routine.
+ */
+
+void GTIFPrint(GTIF *gtif, GTIFPrintMethod print,void *aux)
+{
+ int i;
+ int numkeys = gtif->gt_num_keys;
+ GeoKey *key = gtif->gt_keys;
+ char message[1024];
+
+ if (!print) print = (GTIFPrintMethod) &DefaultPrint;
+ if (!aux) aux=stdout;
+
+ sprintf(message,FMT_GEOTIFF "\n");
+ print(message,aux);
+ sprintf(message, "Version: %hd" ,gtif->gt_version);
+ sprintf(message, FMT_VERSION,gtif->gt_version);
+ print(" ",aux); print(message,aux); print("\n",aux);
+ sprintf(message, FMT_REV,gtif->gt_rev_major,
+ gtif->gt_rev_minor);
+ print(" ",aux); print(message,aux); print("\n",aux);
+
+ sprintf(message," %s\n",FMT_TAGS); print(message,aux);
+ PrintGeoTags(gtif,print,aux);
+ sprintf(message," %s\n",FMT_TAGEND); print(message,aux);
+
+ sprintf(message," %s\n",FMT_KEYS); print(message,aux);
+ for (i=0; i<numkeys; i++)
+ PrintKey(++key,print,aux);
+ sprintf(message," %s\n",FMT_KEYEND); print(message,aux);
+
+ sprintf(message," %s\n",FMT_GEOEND); print(message,aux);
+}
+
+static void PrintGeoTags(GTIF *gt, GTIFPrintMethod print,void *aux)
+{
+ double *data;
+ int count;
+ tiff_t *tif=gt->gt_tif;
+
+ if ((gt->gt_methods.get)(tif, GTIFF_TIEPOINTS, &count, &data ))
+ PrintTag(GTIFF_TIEPOINTS,count/3, data, 3, print, aux);
+ if ((gt->gt_methods.get)(tif, GTIFF_PIXELSCALE, &count, &data ))
+ PrintTag(GTIFF_PIXELSCALE,count/3, data, 3, print, aux);
+ if ((gt->gt_methods.get)(tif, GTIFF_TRANSMATRIX, &count, &data ))
+ PrintTag(GTIFF_TRANSMATRIX,count/4, data, 4, print, aux);
+}
+
+static void PrintTag(int tag, int nrows, double *dptr, int ncols,
+ GTIFPrintMethod print,void *aux)
+{
+ int i,j;
+ double *data=dptr;
+ char message[1024];
+
+ print(" ",aux);
+ print(GTIFTagName(tag),aux);
+ sprintf(message," (%d,%d):\n",nrows,ncols);
+ print(message,aux);
+ for (i=0;i<nrows;i++)
+ {
+ print(" ",aux);
+ for (j=0;j<ncols;j++)
+ {
+ sprintf(message,FMT_DOUBLE,*data++);
+ print(message,aux);
+ }
+ print("\n",aux);
+ }
+ _GTIFFree(dptr); /* free up the allocated memory */
+}
+
+
+static void PrintKey(GeoKey *key, GTIFPrintMethod print, void *aux)
+{
+ char *data;
+ geokey_t keyid = (geokey_t) key->gk_key;
+ int count = key->gk_count;
+ int vals_now,i;
+ pinfo_t *sptr;
+ double *dptr;
+ char message[40];
+
+ print(" ",aux);
+ print(GTIFKeyName(keyid),aux);
+
+ sprintf(message," (%s,%d): ",GTIFTypeName(key->gk_type),count);
+ print(message,aux);
+
+ if (key->gk_type==TYPE_SHORT && count==1)
+ data = (char *)&key->gk_data;
+ else
+ data = key->gk_data;
+
+ switch (key->gk_type)
+ {
+ case TYPE_ASCII:
+ {
+ int in_char, out_char;
+
+ print("\"",aux);
+
+ in_char = 0;
+ out_char = 0;
+ while( in_char < count-1 )
+ {
+ char ch = ((char *) data)[in_char++];
+
+ if( ch == '\n' )
+ {
+ message[out_char++] = '\\';
+ message[out_char++] = 'n';
+ }
+ else if( ch == '\\' )
+ {
+ message[out_char++] = '\\';
+ message[out_char++] = '\\';
+ }
+ else
+ message[out_char++] = ch;
+
+ /* flush message if buffer full */
+ if( out_char == sizeof(message)-3 )
+ {
+ message[out_char] = '\0';
+ print(message,aux);
+ out_char = 0;
+ }
+ }
+
+ message[out_char]='\0';
+ print(message,aux);
+
+ print("\"\n",aux);
+ }
+ break;
+
+ case TYPE_DOUBLE:
+ for (dptr = (double *)data; count > 0; count-= vals_now)
+ {
+ vals_now = count > 3? 3: count;
+ for (i=0; i<vals_now; i++,dptr++)
+ {
+ sprintf(message,FMT_DOUBLE ,*dptr);
+ print(message,aux);
+ }
+ print("\n",aux);
+ }
+ break;
+
+ case TYPE_SHORT:
+ sptr = (pinfo_t *)data;
+ if (count==1)
+ {
+ sprintf(message,"%s\n",GTIFValueName(keyid,*sptr));
+ print(message,aux);
+ }
+ else
+ for (; count > 0; count-= vals_now)
+ {
+ vals_now = count > 3? 3: count;
+ for (i=0; i<vals_now; i++,sptr++)
+ {
+ sprintf(message,FMT_SHORT,*sptr);
+ print(message,aux);
+ }
+ print("\n",aux);
+ }
+ break;
+
+ default:
+ sprintf(message, "Unknown Type (%d)\n",key->gk_type);
+ print(message,aux);
+ break;
+ }
+}
+
+static void DefaultPrint(char *string, void *aux)
+{
+ /* Pretty boring */
+ fprintf((FILE *)aux,string);
+}
+
+
+/*
+ * Importing metadata file
+ */
+
+/*
+ * Import the directory info, using whatever method is specified
+ * (defaults to fscanf if null). The "aux" parameter is provided for user
+ * defined method for passing file or whatever.
+ *
+ * The input format is a "GeoTIFF meta-data" file, which may be
+ * generated by the GTIFFPrint() routine.
+ */
+
+int GTIFImport(GTIF *gtif, GTIFReadMethod scan,void *aux)
+{
+ int status;
+ char message[1024];
+
+ if (!scan) scan = (GTIFReadMethod) &DefaultRead;
+ if (!aux) aux=stdin;
+
+ scan(message,aux);
+ if (strncmp(message,FMT_GEOTIFF,8)) return 0;
+ scan(message,aux);
+ if (!sscanf(message,FMT_VERSION,>if->gt_version)) return 0;
+ scan(message,aux);
+ if (sscanf(message,FMT_REV,>if->gt_rev_major,
+ >if->gt_rev_minor) !=2) return 0;
+
+ scan(message,aux);
+ if (strncmp(message,FMT_TAGS,8)) return 0;
+ while ((status=ReadTag(gtif,scan,aux))>0);
+ if (status < 0) return 0;
+
+ scan(message,aux);
+ if (strncmp(message,FMT_KEYS,8)) return 0;
+ while ((status=ReadKey(gtif,scan,aux))>0);
+
+ return (status==0); /* success */
+}
+
+static int StringError(char *string)
+{
+ fprintf(stderr,"Parsing Error at \'%s\'\n",string);
+ return -1;
+}
+
+#define SKIPWHITE(vptr) \
+ while (*vptr && (*vptr==' '||*vptr=='\t')) vptr++
+#define FINDCHAR(vptr,c) \
+ while (*vptr && *vptr!=(c)) vptr++
+
+static int ReadTag(GTIF *gt,GTIFReadMethod scan,void *aux)
+{
+ int i,j,tag;
+ char *vptr;
+ char tagname[100];
+ double data[100],*dptr=data;
+ int count,nrows,ncols,num;
+ char message[1024];
+
+ scan(message,aux);
+ if (!strncmp(message,FMT_TAGEND,8)) return 0;
+
+ num=sscanf(message,"%[^( ] (%d,%d):\n",tagname,&nrows,&ncols);
+ if (num!=3) return StringError(message);
+
+ tag = GTIFTagCode(tagname);
+ if (tag < 0) return StringError(tagname);
+
+ count = nrows*ncols;
+ for (i=0;i<nrows;i++)
+ {
+ scan(message,aux);
+ vptr = message;
+ for (j=0;j<ncols;j++)
+ {
+ if (!sscanf(vptr,"%lg",dptr++))
+ return StringError(vptr);
+ FINDCHAR(vptr,' ');
+ SKIPWHITE(vptr);
+ }
+ }
+ (gt->gt_methods.set)(gt->gt_tif, tag, count, data );
+
+ return 1;
+}
+
+
+static int ReadKey(GTIF *gt, GTIFReadMethod scan, void *aux)
+{
+ tagtype_t ktype;
+ int count,outcount;
+ int vals_now,i;
+ geokey_t key;
+ int icode;
+ pinfo_t code;
+ short *sptr;
+ char name[1000];
+ char type[20];
+ double data[100];
+ double *dptr;
+ char *vptr;
+ int num;
+ char message[2048];
+
+ scan(message,aux);
+ if (!strncmp(message,FMT_KEYEND,8)) return 0;
+
+ num=sscanf(message,"%[^( ] (%[^,],%d):\n",name,type,&count);
+ if (num!=3) return StringError(message);
+
+ vptr = message;
+ FINDCHAR(vptr,':');
+ if (!*vptr) return StringError(message);
+ vptr+=2;
+
+ if( GTIFKeyCode(name) < 0 )
+ return StringError(name);
+ else
+ key = (geokey_t) GTIFKeyCode(name);
+
+ if( GTIFTypeCode(type) < 0 )
+ return StringError(type);
+ else
+ ktype = (tagtype_t) GTIFTypeCode(type);
+
+ /* skip white space */
+ SKIPWHITE(vptr);
+ if (!*vptr) return StringError(message);
+
+ switch (ktype)
+ {
+ case TYPE_ASCII:
+ {
+ char *cdata;
+ int out_char = 0;
+
+ FINDCHAR(vptr,'"');
+ if (!*vptr) return StringError(message);
+
+ cdata = (char *) _GTIFcalloc( count+1 );
+
+ vptr++;
+ while( out_char < count-1 )
+ {
+ if( *vptr == '\0' )
+ break;
+
+ else if( vptr[0] == '\\' && vptr[1] == 'n' )
+ {
+ cdata[out_char++] = '\n';
+ vptr += 2;
+ }
+ else if( vptr[0] == '\\' && vptr[1] == '\\' )
+ {
+ cdata[out_char++] = '\\';
+ vptr += 2;
+ }
+ else
+ cdata[out_char++] = *(vptr++);
+ }
+
+ if( out_char < count-1 ) return StringError(message);
+ if( *vptr != '"' ) return StringError(message);
+
+ cdata[count-1] = '\0';
+ GTIFKeySet(gt,key,ktype,count,cdata);
+
+ _GTIFFree( cdata );
+ }
+ break;
+
+ case TYPE_DOUBLE:
+ outcount = count;
+ for (dptr = data; count > 0; count-= vals_now)
+ {
+ vals_now = count > 3? 3: count;
+ for (i=0; i<vals_now; i++,dptr++)
+ {
+ if (!sscanf(vptr,"%lg" ,dptr))
+ StringError(vptr);
+ FINDCHAR(vptr,' ');
+ SKIPWHITE(vptr);
+ }
+ if (vals_now<count)
+ {
+ scan(message,aux);
+ vptr = message;
+ }
+ }
+ if (outcount==1)
+ GTIFKeySet(gt,key,ktype,outcount,data[0]);
+ else
+ GTIFKeySet(gt,key,ktype,outcount,data);
+ break;
+
+ case TYPE_SHORT:
+ if (count==1)
+ {
+ icode = GTIFValueCode(key,vptr);
+ if (icode < 0) return StringError(vptr);
+ code = icode;
+ GTIFKeySet(gt,key,ktype,count,code);
+ }
+ else /* multi-valued short - no such thing yet */
+ {
+ sptr = (short *)data;
+ outcount = count;
+ for (; count > 0; count-= vals_now)
+ {
+ vals_now = count > 3? 3: count;
+ for (i=0; i<vals_now; i++,sptr++)
+ {
+ int work_int;
+
+ /* note: FMT_SHORT (%11hd) not supported on IRIX */
+ sscanf(message,"%11d",&work_int);
+ *sptr = work_int;
+ scan(message,aux);
+ }
+ if (vals_now<count)
+ {
+ scan(message,aux);
+ vptr = message;
+ }
+ }
+ GTIFKeySet(gt,key,ktype,outcount,sptr);
+ }
+ break;
+
+ default:
+ return -1;
+ }
+ return 1;
+}
+
+
+static void DefaultRead(char *string, void *aux)
+{
+ /* Pretty boring */
+ fscanf((FILE *)aux,"%[^\n]\n",string);
+}
+
diff --git a/src/tiff/geo_set.c b/src/tiff/geo_set.c
new file mode 100644
index 0000000..61cb3d4
--- /dev/null
+++ b/src/tiff/geo_set.c
@@ -0,0 +1,259 @@
+/**********************************************************************
+ *
+ * geo_set.c -- Public routines for GEOTIFF GeoKey access.
+ *
+ * Written By: Niles D. Ritter.
+ *
+ * copyright (c) 1995 Niles D. Ritter
+ *
+ * Permission granted to use this software, so long as this copyright
+ * notice accompanies any products derived therefrom.
+ *
+ * $Log: geo_set.c,v $
+ * Revision 1.2 2004/03/19 11:51:24 lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.9 2003/01/15 03:37:19 warmerda
+ * avoid warning
+ *
+ * Revision 1.8 2002/09/27 13:05:33 warmerda
+ * allow dynamic set/delete of ASCII tags. ASCIIPARAMS now kept split
+ *
+ * Revision 1.7 2001/05/02 16:48:22 warmerda
+ * fixed a couple bugs in delete code
+ *
+ * Revision 1.6 2001/05/02 13:54:34 warmerda
+ * updated geo_set.c to support deleting tags
+ *
+ * Revision 1.5 1999/05/04 03:09:33 warmerda
+ * avoid warnings
+ *
+ * Revision 1.4 1999/05/03 17:50:31 warmerda
+ * avoid warnings on IRIX
+ *
+ * Revision 1.3 1999/04/28 19:59:38 warmerda
+ * added some doxygen style documentation
+ *
+ * Revision 1.2 1999/03/11 17:39:38 geotiff
+ * Added fix for case where a key is being overwritten.
+ *
+ **********************************************************************/
+
+#include "geotiff.h" /* public interface */
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h" /* private interface */
+
+#include <assert.h>
+
+/**
+This function writes a geokey_t value to a GeoTIFF file.
+
+ at param gtif The geotiff information handle from GTIFNew().
+
+ at param keyID The geokey_t name (such as ProjectedCSTypeGeoKey).
+This must come from the list of legal geokey_t values
+(an enumeration) listed below.
+
+ at param val The <b>val</b> argument is a pointer to the
+variable into which the value should be read. The type of the variable
+varies depending on the geokey_t given. While there is no ready mapping
+of geokey_t values onto types, in general code values are of type <i>short</i>,
+citations are strings, and everything else is of type <i>double</i>. Note
+that pointer's to <i>int</i> should never be passed to GTIFKeyGet() for
+integer values as they will be shorts, and the int's may not be properly
+initialized (and will be grossly wrong on MSB systems).
+
+ at param index Indicates how far into the list of values
+for this geokey to offset. Should normally be zero.
+
+ at param count Indicates how many values
+to read. At this time all keys except for strings have only one value,
+so <b>index</b> should be zero, and <b>count</b> should be one.<p>
+
+The <b>key</b> indicates the key name to be written to the
+file and should from the geokey_t enumeration
+(eg. <tt>ProjectedCSTypeGeoKey</tt>). The full list of possible geokey_t
+values can be found in geokeys.inc, or in the online documentation for
+GTIFKeyGet().<p>
+
+The <b>type</b> should be one of TYPE_SHORT, TYPE_ASCII, or TYPE_DOUBLE and
+will indicate the type of value being passed at the end of the argument
+list (the key value). The <b>count</b> should be one except for strings
+when it should be the length of the string (or zero to for this to be
+computed internally). As a special case a <b>count</b> of -1 can be
+used to request an existing key be deleted, in which no value is passed.<p>
+
+The actual value is passed at the end of the argument list, and should be
+a short, a double, or a char * value. Note that short and double values
+are passed as is, not as pointers.<p>
+
+Note that key values aren't actually flushed to the file until
+GTIFWriteKeys() is called. Till then
+the new values are just kept with the GTIF structure.<p>
+
+<b>Example:</b><p>
+
+<pre>
+ GTIFKeySet(gtif, GTRasterTypeGeoKey, TYPE_SHORT, 1,
+ RasterPixelIsArea);
+ GTIFKeySet(gtif, GTCitationGeoKey, TYPE_ASCII, 0,
+ "UTM 11 North / NAD27" );
+</pre>
+
+ */
+
+int GTIFKeySet(GTIF *gtif, geokey_t keyID, tagtype_t type, int count,...)
+{
+ va_list ap;
+ int index = gtif->gt_keyindex[ keyID ];
+ int newvalues = 0;
+ GeoKey *key;
+ char *data = NULL;
+ char *val;
+ pinfo_t sval;
+ double dval;
+
+ va_start(ap, count);
+ /* pass singleton keys by value */
+ if (count>1 && type!=TYPE_ASCII)
+ {
+ val = va_arg(ap, char*);
+ }
+ else if( count == -1 )
+ {
+ /* delete the indicated tag */
+ va_end(ap);
+
+ if( index < 1 )
+ return 0;
+
+ if (gtif->gt_keys[index].gk_type == TYPE_ASCII)
+ {
+ _GTIFFree (gtif->gt_keys[index].gk_data);
+ }
+
+ while( index < gtif->gt_num_keys )
+ {
+ _GTIFmemcpy( gtif->gt_keys + index,
+ gtif->gt_keys + index + 1,
+ sizeof(GeoKey) );
+ gtif->gt_keyindex[gtif->gt_keys[index].gk_key] = index;
+ index++;
+ }
+
+ gtif->gt_num_keys--;
+ gtif->gt_nshorts -= sizeof(KeyEntry)/sizeof(pinfo_t);
+ gtif->gt_keyindex[keyID] = 0;
+ gtif->gt_flags |= FLAG_FILE_MODIFIED;
+
+ return 1;
+ }
+ else switch (type)
+ {
+ case TYPE_SHORT: sval=va_arg(ap, int); val=(char *)&sval; break;
+ case TYPE_DOUBLE: dval=va_arg(ap, dblparam_t); val=(char *)&dval; break;
+ case TYPE_ASCII:
+ val=va_arg(ap, char*);
+ count = strlen(val) + 1; /* force = string length */
+ break;
+ default:
+ assert( FALSE );
+ break;
+ }
+ va_end(ap);
+
+ /* We assume here that there are no multi-valued SHORTS ! */
+ if (index)
+ {
+ /* Key already exists */
+ key = gtif->gt_keys+index;
+ if (type!=key->gk_type || count > key->gk_count)
+ {
+ /* need to reset data pointer */
+ key->gk_type = type;
+ key->gk_count = count;
+ key->gk_size = _gtiff_size[ type ];
+ newvalues = 1;
+ }
+ }
+ else
+ {
+ /* We need to create the key */
+ if (gtif->gt_num_keys == MAX_KEYS) return 0;
+ key = gtif->gt_keys + ++gtif->gt_num_keys;
+ index = gtif->gt_num_keys;
+ gtif->gt_keyindex[ keyID ] = index;
+ key->gk_key = keyID;
+ key->gk_type = type;
+ key->gk_count = count;
+ key->gk_size = _gtiff_size[ type ];
+ if (gtif->gt_keymin > keyID) gtif->gt_keymin=keyID;
+ if (gtif->gt_keymax < keyID) gtif->gt_keymax=keyID;
+ newvalues = 1;
+ }
+
+ if (newvalues)
+ {
+ switch (type)
+ {
+ case TYPE_SHORT:
+ if (count > 1) return 0;
+ data = (char *)&key->gk_data; /* store value *in* data */
+ break;
+ case TYPE_DOUBLE:
+ key->gk_data = (char *)(gtif->gt_double + gtif->gt_ndoubles);
+ data = key->gk_data;
+ gtif->gt_ndoubles += count;
+ break;
+ case TYPE_ASCII:
+ break;
+ default:
+ va_end(ap);
+ return 0;
+ }
+ gtif->gt_nshorts += sizeof(KeyEntry)/sizeof(pinfo_t);
+ }
+
+ /* this fixes a bug where if a request is made to write a duplicate
+ key, we must initialize the data to a valid value.
+ Bryan Wells (bryan at athena.bangor.autometric.com) */
+
+ else /* no new values, but still have something to write */
+ {
+ switch (type)
+ {
+ case TYPE_SHORT:
+ if (count > 1) return 0;
+ data = (char *)&key->gk_data; /* store value *in* data */
+ break;
+ case TYPE_DOUBLE:
+ data = key->gk_data;
+ break;
+ case TYPE_ASCII:
+ break;
+ default:
+ return 0;
+ }
+ }
+
+ switch (type)
+ {
+ case TYPE_ASCII:
+ /* throw away existing data and allocate room for new data */
+ if (key->gk_data != 0)
+ {
+ _GTIFFree(key->gk_data);
+ }
+ key->gk_data = (char *)_GTIFcalloc(count);
+ key->gk_count = count;
+ data = key->gk_data;
+ break;
+ default:
+ break;
+ }
+
+ _GTIFmemcpy(data, val, count*key->gk_size);
+
+ gtif->gt_flags |= FLAG_FILE_MODIFIED;
+ return 1;
+}
diff --git a/src/tiff/geo_tiffp.c b/src/tiff/geo_tiffp.c
new file mode 100644
index 0000000..895486d
--- /dev/null
+++ b/src/tiff/geo_tiffp.c
@@ -0,0 +1,140 @@
+/**********************************************************************
+ *
+ * geo_tiffp.c Private TIFF interface module for GEOTIFF
+ *
+ * This module implements the interface between the GEOTIFF
+ * tag parser and the TIFF i/o module. The current setup
+ * relies on the "libtiff" code, but if you use your own
+ * TIFF reader software, you may replace the module implementations
+ * here with your own calls. No "libtiff" dependencies occur
+ * anywhere else in this code.
+ *
+ **********************************************************************/
+
+#include "geotiff.h" /* public GTIFF interface */
+
+#include "geo_tiffp.h" /* Private TIFF interface */
+#include "geo_keyp.h" /* Private GTIFF interface */
+
+/* tiff size array global */
+gsize_t _gtiff_size[] = { 0, 1, 2, 4, 8, 1, 4, 8, 1, 2, 4, 1 };
+
+static int _GTIFGetField (tiff_t *tif, pinfo_t tag, int *count, void *value );
+static int _GTIFSetField (tiff_t *tif, pinfo_t tag, int count, void *value );
+static tagtype_t _GTIFTagType (tiff_t *tif, pinfo_t tag);
+
+/*
+ * Set up default TIFF handlers.
+ */
+void _GTIFSetDefaultTIFF(TIFFMethod *method)
+{
+ if (!method) return;
+
+ method->get = _GTIFGetField;
+ method->set = _GTIFSetField;
+ method->type = _GTIFTagType;
+}
+
+gdata_t _GTIFcalloc(gsize_t size)
+{
+ gdata_t data=(gdata_t)_TIFFmalloc((tsize_t)size);
+ if (data) _TIFFmemset((tdata_t)data,0,(tsize_t)size);
+ return data;
+}
+
+gdata_t _GTIFrealloc(gdata_t ptr, gsize_t size)
+{
+ return( _TIFFrealloc((tdata_t)ptr, (tsize_t) size) );
+}
+
+void _GTIFmemcpy(gdata_t out,gdata_t in,gsize_t size)
+{
+ _TIFFmemcpy((tdata_t)out,(tdata_t)in,(tsize_t)size);
+}
+
+void _GTIFFree(gdata_t data)
+{
+ if (data) _TIFFfree((tdata_t)data);
+}
+
+
+
+/* returns the value of TIFF tag <tag>, or if
+ * the value is an array, returns an allocated buffer
+ * containing the values. Allocate a copy of the actual
+ * buffer, sized up for updating.
+ */
+static int _GTIFGetField (tiff_t *tif, pinfo_t tag, int *count, void *val )
+{
+ int status;
+ unsigned short scount=0;
+ char *tmp;
+ char *value;
+ gsize_t size = _gtiff_size[_GTIFTagType (tif,tag)];
+
+ if (_GTIFTagType(tif, tag) == TYPE_ASCII)
+ {
+ status = TIFFGetField((TIFF *)tif,tag,&tmp);
+ if (!status) return status;
+ scount = strlen(tmp)+1;
+ }
+ else status = TIFFGetField((TIFF *)tif,tag,&scount,&tmp);
+ if (!status) return status;
+
+ *count = scount;
+
+ value = (char *)_GTIFcalloc( (scount+MAX_VALUES)*size);
+ if (!value) return 0;
+
+ _TIFFmemcpy( value, tmp, size * scount);
+
+ *(char **)val = value;
+ return status;
+}
+
+/*
+ * Set a GeoTIFF TIFF field.
+ */
+static int _GTIFSetField (tiff_t *tif, pinfo_t tag, int count, void *value )
+{
+ int status;
+ unsigned short scount = count;
+
+ /* libtiff ASCII uses null-delimiter */
+ if (_GTIFTagType(tif, tag) == TYPE_ASCII)
+ status = TIFFSetField((TIFF *)tif,tag,value);
+ else
+ status = TIFFSetField((TIFF *)tif,tag,scount,value);
+ return status;
+}
+
+
+/*
+ * This routine is supposed to return the TagType of the <tag>
+ * TIFF tag. Unfortunately, "libtiff" does not provide this
+ * service by default, so we just have to "know" what type of tags
+ * we've got, and how many. We only define the ones Geotiff
+ * uses here, and others return UNKNOWN. The "tif" parameter
+ * is provided for those TIFF implementations that provide
+ * for tag-type queries.
+ */
+static tagtype_t _GTIFTagType (tiff_t *tif, pinfo_t tag)
+{
+ tagtype_t ttype;
+
+ (void) tif; /* dummy reference */
+
+ switch (tag)
+ {
+ case GTIFF_ASCIIPARAMS: ttype=TYPE_ASCII; break;
+ case GTIFF_PIXELSCALE:
+ case GTIFF_TRANSMATRIX:
+ case GTIFF_TIEPOINTS:
+ case GTIFF_DOUBLEPARAMS: ttype=TYPE_DOUBLE; break;
+ case GTIFF_GEOKEYDIRECTORY: ttype=TYPE_SHORT; break;
+ default: ttype = TYPE_UNKNOWN;
+ }
+
+ return ttype;
+}
+
diff --git a/src/tiff/geo_tiffp.h b/src/tiff/geo_tiffp.h
new file mode 100644
index 0000000..4cf2ec8
--- /dev/null
+++ b/src/tiff/geo_tiffp.h
@@ -0,0 +1,113 @@
+/**********************************************************************
+ *
+ * geo_tiffp.h - Private interface for TIFF tag parsing.
+ *
+ * Written by: Niles D. Ritter
+ *
+ * This interface file encapsulates the interface to external TIFF
+ * file-io routines and definitions. The current configuration
+ * assumes that the "libtiff" module is used, but if you have your
+ * own TIFF reader, you may replace the definitions with your own
+ * here, and replace the implementations in geo_tiffp.c. No other
+ * modules have any explicit dependence on external TIFF modules.
+ *
+ * Revision History;
+ *
+ * 20 June, 1995 Niles D. Ritter New
+ * 6 July, 1995 Niles D. Ritter Fix prototypes
+ *
+ **********************************************************************/
+
+#ifndef __geo_tiffp_h_
+#define __geo_tiffp_h_
+
+/**********************************************************************
+ *
+ * Private includes
+ *
+ * If you are not using libtiff and XTIFF, replace this include file
+ * with the appropriate one for your own TIFF parsing routines.
+ *
+ * Revision History
+ *
+ * 19 September 1995 ndr Demoted Intergraph trans matrix.
+ *
+ **********************************************************************/
+
+#include "geotiff.h"
+#include "xtiffio.h"
+
+/*
+ * dblparam_t is the type that a double precision
+ * floating point value will have on the parameter
+ * stack (when coerced by the compiler). You shouldn't
+ * have to change this.
+ */
+#ifdef applec
+typedef extended dblparam_t;
+#else
+typedef double dblparam_t;
+#endif
+
+
+/**********************************************************************
+ *
+ * Private defines
+ *
+ * If you are not using "libtiff"/LIBXTIFF, replace these definitions
+ * with the appropriate definitions to access the geo-tags
+ *
+ **********************************************************************/
+
+typedef unsigned short pinfo_t; /* SHORT ProjectionInfo tag type */
+typedef TIFF tiff_t; /* TIFF file descriptor */
+typedef tdata_t gdata_t; /* pointer to data */
+typedef tsize_t gsize_t; /* data allocation size */
+
+#define GTIFF_GEOKEYDIRECTORY TIFFTAG_GEOKEYDIRECTORY /* from xtiffio.h */
+#define GTIFF_DOUBLEPARAMS TIFFTAG_GEODOUBLEPARAMS
+#define GTIFF_ASCIIPARAMS TIFFTAG_GEOASCIIPARAMS
+#define GTIFF_PIXELSCALE TIFFTAG_GEOPIXELSCALE
+#define GTIFF_TRANSMATRIX TIFFTAG_GEOTRANSMATRIX
+#define GTIFF_INTERGRAPH_MATRIX TIFFTAG_INTERGRAPH_MATRIX
+#define GTIFF_TIEPOINTS TIFFTAG_GEOTIEPOINTS
+#define GTIFF_LOCAL 0
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/*
+ * Method function pointer types
+ */
+typedef int (*GTGetFunction) (tiff_t *tif, pinfo_t tag, int *count, void *value );
+typedef int (*GTSetFunction) (tiff_t *tif, pinfo_t tag, int count, void *value );
+typedef tagtype_t (*GTTypeFunction) (tiff_t *tif, pinfo_t tag);
+typedef struct _TIFFMethod {
+ GTGetFunction get;
+ GTSetFunction set;
+ GTTypeFunction type;
+} TIFFMethod;
+
+/**********************************************************************
+ *
+ * Protected Function Declarations
+ *
+ * These routines are exposed implementations, and should not
+ * be used by external GEOTIFF client programs.
+ *
+ **********************************************************************/
+
+extern gsize_t _gtiff_size[]; /* TIFF data sizes */
+extern void _GTIFSetDefaultTIFF(TIFFMethod *method);
+extern gdata_t _GTIFcalloc(gsize_t);
+extern gdata_t _GTIFrealloc(gdata_t,gsize_t);
+extern void _GTIFFree(gdata_t data);
+extern void _GTIFmemcpy(gdata_t out,gdata_t in,gsize_t size);
+
+#if defined(__cplusplus)
+}
+#endif
+
+
+#endif /* __geo_tiffp_h_ */
diff --git a/src/tiff/geo_trans.c b/src/tiff/geo_trans.c
new file mode 100644
index 0000000..3d5b6eb
--- /dev/null
+++ b/src/tiff/geo_trans.c
@@ -0,0 +1,326 @@
+/******************************************************************************
+ * $Id: geo_trans.c,v 1.3 2004/03/19 11:51:24 lubia Exp $
+ *
+ * Project: libgeotiff
+ * Purpose: Code to abstract translation between pixel/line and PCS
+ * coordinates.
+ * Author: Frank Warmerdam, warmerda at home.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: geo_trans.c,v $
+ * Revision 1.3 2004/03/19 11:51:24 lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.9 2001/11/28 14:20:30 warmerda
+ * fixed transform memory leak in GTIFPCSToImage
+ *
+ * Revision 1.8 2001/04/06 16:56:22 warmerda
+ * added support for PCSToImage with matrix
+ *
+ * Revision 1.7 2001/03/05 03:25:23 warmerda
+ * restructure cleanup, and apply to GTIFPCSToImage()
+ *
+ * Revision 1.6 2001/03/04 22:37:39 warmerda
+ * fixed memory leak for fields fetched with gt_methods.get - Alan Gray
+ *
+ * Revision 1.5 2000/08/22 03:32:46 warmerda
+ * removed GTIFTiepointTranslate code
+ *
+ * Revision 1.4 1999/09/17 01:19:51 warmerda
+ * Fixed bug in use of transform matrix.
+ *
+ * Revision 1.3 1999/09/16 21:25:40 warmerda
+ * Added tiepoint, and transformation matrix based translation. Note
+ * that we don't try to invert the transformation matrix for
+ * GTIFPCSToImage().
+ *
+ * Revision 1.2 1999/09/07 20:00:40 warmerda
+ * Fixed count/tiepoint_count bug in GTIFPCSToImage().
+ *
+ * Revision 1.1 1999/05/04 03:07:57 warmerda
+ * New
+ *
+ */
+
+#include "geotiff.h"
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h" /* private interface */
+#include "geokeys.h"
+
+/************************************************************************/
+/* inv_geotransform() */
+/* */
+/* Invert a 6 term geotransform style matrix. */
+/************************************************************************/
+
+static int inv_geotransform( double *gt_in, double *gt_out )
+
+{
+ double det, inv_det;
+
+ /* we assume a 3rd row that is [0 0 1] */
+
+ /* Compute determinate */
+
+ det = gt_in[0] * gt_in[4] - gt_in[1] * gt_in[3];
+
+ if( fabs(det) < 0.000000000000001 )
+ return 0;
+
+ inv_det = 1.0 / det;
+
+ /* compute adjoint, and devide by determinate */
+
+ gt_out[0] = gt_in[4] * inv_det;
+ gt_out[3] = -gt_in[3] * inv_det;
+
+ gt_out[1] = -gt_in[1] * inv_det;
+ gt_out[4] = gt_in[0] * inv_det;
+
+ gt_out[2] = ( gt_in[1] * gt_in[5] - gt_in[2] * gt_in[4]) * inv_det;
+ gt_out[5] = (-gt_in[0] * gt_in[5] + gt_in[2] * gt_in[3]) * inv_det;
+
+ return 1;
+}
+
+/************************************************************************/
+/* GTIFTiepointTranslate() */
+/************************************************************************/
+
+int GTIFTiepointTranslate( int gcp_count, double * gcps_in, double * gcps_out,
+ double x_in, double y_in,
+ double *x_out, double *y_out )
+
+{
+ /* I would appreciate a _brief_ block of code for doing second order
+ polynomial regression here! */
+ return FALSE;
+}
+
+
+/************************************************************************/
+/* GTIFImageToPCS() */
+/************************************************************************/
+
+/**
+ * Translate a pixel/line coordinate to projection coordinates.
+ *
+ * At this time this function does not support image to PCS translations for
+ * tiepoints-only definitions, only pixelscale and transformation matrix
+ * formulations.
+ *
+ * @param gtif The handle from GTIFNew() indicating the target file.
+ * @param x A pointer to the double containing the pixel offset on input,
+ * and into which the easting/longitude will be put on completion.
+ * @param y A pointer to the double containing the line offset on input,
+ * and into which the northing/latitude will be put on completion.
+ *
+ * @return TRUE if the transformation succeeds, or FALSE if it fails. It may
+ * fail if the file doesn't have properly setup transformation information,
+ * or it is in a form unsupported by this function.
+ */
+
+int GTIFImageToPCS( GTIF *gtif, double *x, double *y )
+
+{
+ int res = FALSE;
+ int tiepoint_count, count, transform_count;
+ tiff_t *tif=gtif->gt_tif;
+ double *tiepoints = 0;
+ double *pixel_scale = 0;
+ double *transform = 0;
+
+
+ if (!(gtif->gt_methods.get)(tif, GTIFF_TIEPOINTS,
+ &tiepoint_count, &tiepoints ))
+ tiepoint_count = 0;
+
+ if (!(gtif->gt_methods.get)(tif, GTIFF_PIXELSCALE, &count, &pixel_scale ))
+ count = 0;
+
+ if (!(gtif->gt_methods.get)(tif, GTIFF_TRANSMATRIX,
+ &transform_count, &transform ))
+ transform_count = 0;
+
+/* -------------------------------------------------------------------- */
+/* If the pixelscale count is zero, but we have tiepoints use */
+/* the tiepoint based approach. */
+/* -------------------------------------------------------------------- */
+ if( tiepoint_count > 6 && count == 0 )
+ {
+ res = GTIFTiepointTranslate( tiepoint_count / 6,
+ tiepoints, tiepoints + 3,
+ *x, *y, x, y );
+ }
+
+/* -------------------------------------------------------------------- */
+/* If we have a transformation matrix, use it. */
+/* -------------------------------------------------------------------- */
+ else if( transform_count == 16 )
+ {
+ double x_in = *x, y_in = *y;
+
+ *x = x_in * transform[0] + y_in * transform[1] + transform[3];
+ *y = x_in * transform[4] + y_in * transform[5] + transform[7];
+
+ res = TRUE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* For now we require one tie point, and a valid pixel scale. */
+/* -------------------------------------------------------------------- */
+ else if( count < 3 || tiepoint_count < 6 )
+ {
+ res = FALSE;
+ }
+
+ else
+ {
+ *x = (*x - tiepoints[0]) * pixel_scale[0] + tiepoints[3];
+ *y = (*y - tiepoints[1]) * (-1 * pixel_scale[1]) + tiepoints[4];
+
+ res = TRUE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Cleanup */
+/* -------------------------------------------------------------------- */
+ if(tiepoints)
+ _GTIFFree(tiepoints);
+ if(pixel_scale)
+ _GTIFFree(pixel_scale);
+ if(transform)
+ _GTIFFree(transform);
+
+ return res;
+}
+
+/************************************************************************/
+/* GTIFPCSToImage() */
+/************************************************************************/
+
+/**
+ * Translate a projection coordinate to pixel/line coordinates.
+ *
+ * At this time this function does not support PCS to image translations for
+ * tiepoints-only based definitions, only matrix and pixelscale/tiepoints
+ * formulations are supposed.
+ *
+ * @param gtif The handle from GTIFNew() indicating the target file.
+ * @param x A pointer to the double containing the pixel offset on input,
+ * and into which the easting/longitude will be put on completion.
+ * @param y A pointer to the double containing the line offset on input,
+ * and into which the northing/latitude will be put on completion.
+ *
+ * @return TRUE if the transformation succeeds, or FALSE if it fails. It may
+ * fail if the file doesn't have properly setup transformation information,
+ * or it is in a form unsupported by this function.
+ */
+
+int GTIFPCSToImage( GTIF *gtif, double *x, double *y )
+
+{
+ double *tiepoints = NULL;
+ int tiepoint_count, count, transform_count = 0;
+ double *pixel_scale = NULL;
+ double *transform = NULL;
+ tiff_t *tif=gtif->gt_tif;
+ int result = FALSE;
+
+/* -------------------------------------------------------------------- */
+/* Fetch tiepoints and pixel scale. */
+/* -------------------------------------------------------------------- */
+ if (!(gtif->gt_methods.get)(tif, GTIFF_TIEPOINTS,
+ &tiepoint_count, &tiepoints ))
+ tiepoint_count = 0;
+
+ if (!(gtif->gt_methods.get)(tif, GTIFF_PIXELSCALE, &count, &pixel_scale ))
+ count = 0;
+
+ if (!(gtif->gt_methods.get)(tif, GTIFF_TRANSMATRIX,
+ &transform_count, &transform ))
+ transform_count = 0;
+
+/* -------------------------------------------------------------------- */
+/* If the pixelscale count is zero, but we have tiepoints use */
+/* the tiepoint based approach. */
+/* -------------------------------------------------------------------- */
+ if( tiepoint_count > 6 && count == 0 )
+ {
+ result = GTIFTiepointTranslate( tiepoint_count / 6,
+ tiepoints + 3, tiepoints,
+ *x, *y, x, y );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Handle matrix - convert to "geotransform" format, invert and */
+/* apply. */
+/* -------------------------------------------------------------------- */
+ else if( transform_count == 16 )
+ {
+ double x_in = *x, y_in = *y;
+ double gt_in[6], gt_out[6];
+
+ gt_in[0] = transform[0];
+ gt_in[1] = transform[1];
+ gt_in[2] = transform[3];
+ gt_in[3] = transform[4];
+ gt_in[4] = transform[5];
+ gt_in[5] = transform[7];
+
+ if( !inv_geotransform( gt_in, gt_out ) )
+ result = FALSE;
+ else
+ {
+ *x = x_in * gt_out[0] + y_in * gt_out[1] + gt_out[2];
+ *y = x_in * gt_out[3] + y_in * gt_out[4] + gt_out[5];
+
+ result = TRUE;
+ }
+ }
+
+/* -------------------------------------------------------------------- */
+/* For now we require one tie point, and a valid pixel scale. */
+/* -------------------------------------------------------------------- */
+ else if( count >= 3 && tiepoint_count >= 6 )
+ {
+ *x = (*x - tiepoints[3]) / pixel_scale[0] + tiepoints[0];
+ *y = (*y - tiepoints[4]) / (-1 * pixel_scale[1]) + tiepoints[1];
+
+ result = TRUE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Cleanup. */
+/* -------------------------------------------------------------------- */
+ if(tiepoints)
+ _GTIFFree(tiepoints);
+ if(pixel_scale)
+ _GTIFFree(pixel_scale);
+ if(transform)
+ _GTIFFree(transform);
+
+ return result;
+}
+
diff --git a/src/tiff/geo_write.c b/src/tiff/geo_write.c
new file mode 100644
index 0000000..4eedda2
--- /dev/null
+++ b/src/tiff/geo_write.c
@@ -0,0 +1,190 @@
+/**********************************************************************
+ *
+ * geo_write.c -- Public routines for GEOTIFF GeoKey access.
+ *
+ * Written By: Niles D. Ritter.
+ *
+ * copyright (c) 1995 Niles D. Ritter
+ *
+ * Permission granted to use this software, so long as this copyright
+ * notice accompanies any source code derived therefrom.
+ *
+ **********************************************************************/
+
+#include "geotiffio.h" /* public interface */
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h" /* private interface */
+
+static int WriteKey(GTIF* gt, TempKeyData* tempData,
+ KeyEntry* entptr, GeoKey* keyptr);
+static int SortKeys(GTIF* gt,int *sortkeys);
+
+
+/**
+This function flushes all the GeoTIFF keys that have been set with the
+GTIFKeySet() function into the associated
+TIFF file.
+
+ at param gt The GeoTIFF handle returned by GTIFNew.
+
+GTIFKeySet() should be called before
+GTIFFree() is used to deallocate a GeoTIFF access handle.
+ */
+
+int GTIFWriteKeys(GTIF *gt)
+{
+ int i;
+ GeoKey *keyptr;
+ KeyEntry *entptr;
+ KeyHeader *header;
+ TempKeyData tempData;
+ int sortkeys[MAX_KEYS];
+
+ if (!(gt->gt_flags & FLAG_FILE_MODIFIED)) return 1;
+
+ tempData.tk_asciiParams = 0;
+ tempData.tk_asciiParamsLength = 0;
+ tempData.tk_asciiParamsOffset = 0;
+
+ /* Sort the Keys into numerical order */
+ if (!SortKeys(gt,sortkeys))
+ {
+ /* XXX error: a key was not recognized */
+ }
+
+ /* Set up header of ProjectionInfo tag */
+ header = (KeyHeader *)gt->gt_short;
+ header->hdr_num_keys = gt->gt_num_keys;
+ header->hdr_version = GvCurrentVersion;
+ header->hdr_rev_major = GvCurrentRevision;
+ header->hdr_rev_minor = GvCurrentMinorRev;
+
+ /* Sum up the ASCII tag lengths */
+ for (i = 0; i < gt->gt_num_keys; i++)
+ {
+ keyptr = gt->gt_keys + sortkeys[i];
+ if (keyptr->gk_type == TYPE_ASCII)
+ {
+ tempData.tk_asciiParamsLength += keyptr->gk_count;
+ }
+ }
+ if (tempData.tk_asciiParamsLength > 0)
+ {
+ tempData.tk_asciiParams =
+ (char *)_GTIFcalloc(tempData.tk_asciiParamsLength + 1);
+ tempData.tk_asciiParams[tempData.tk_asciiParamsLength] = '\0';
+ }
+
+ /* Set up the rest of SHORT array properly */
+ keyptr = gt->gt_keys;
+ entptr = (KeyEntry*)(gt->gt_short + 4);
+ for (i=0; i< gt->gt_num_keys; i++,entptr++)
+ {
+ if (!WriteKey(gt,&tempData,entptr,keyptr+sortkeys[i])) return 0;
+ }
+
+ /* Write out the Key Directory */
+ (gt->gt_methods.set)(gt->gt_tif, GTIFF_GEOKEYDIRECTORY, gt->gt_nshorts, gt->gt_short );
+
+ /* Write out the params directories */
+ if (gt->gt_ndoubles)
+ (gt->gt_methods.set)(gt->gt_tif, GTIFF_DOUBLEPARAMS, gt->gt_ndoubles, gt->gt_double );
+ if (tempData.tk_asciiParamsLength > 0)
+ {
+ /* just to be safe */
+ tempData.tk_asciiParams[tempData.tk_asciiParamsLength] = '\0';
+ (gt->gt_methods.set)(gt->gt_tif,
+ GTIFF_ASCIIPARAMS, 0, tempData.tk_asciiParams);
+ }
+
+ gt->gt_flags &= ~FLAG_FILE_MODIFIED;
+
+ if (tempData.tk_asciiParamsLength > 0)
+ {
+ _GTIFFree (tempData.tk_asciiParams);
+ }
+ return 1;
+}
+
+/**********************************************************************
+ *
+ * Private Routines
+ *
+ **********************************************************************/
+
+/*
+ * Given GeoKey, write out the KeyEntry entries, returning 0 if failure.
+ * This is the exact complement of ReadKey().
+ */
+
+static int WriteKey(GTIF* gt, TempKeyData* tempData,
+ KeyEntry* entptr, GeoKey* keyptr)
+{
+ int count;
+
+ entptr->ent_key = keyptr->gk_key;
+ entptr->ent_count = keyptr->gk_count;
+ count = entptr->ent_count;
+
+ if (count==1 && keyptr->gk_type==TYPE_SHORT)
+ {
+ entptr->ent_location = GTIFF_LOCAL;
+ entptr->ent_val_offset = *(pinfo_t*)&keyptr->gk_data;
+ return 1;
+ }
+
+ switch (keyptr->gk_type)
+ {
+ case TYPE_SHORT:
+ entptr->ent_location = GTIFF_GEOKEYDIRECTORY;
+ entptr->ent_val_offset =
+ (pinfo_t*)keyptr->gk_data - gt->gt_short;
+ break;
+ case TYPE_DOUBLE:
+ entptr->ent_location = GTIFF_DOUBLEPARAMS;
+ entptr->ent_val_offset =
+ (double*)keyptr->gk_data - gt->gt_double;
+ break;
+ case TYPE_ASCII:
+ entptr->ent_location = GTIFF_ASCIIPARAMS;
+ entptr->ent_val_offset = tempData->tk_asciiParamsOffset;
+ _GTIFmemcpy (tempData->tk_asciiParams + tempData->tk_asciiParamsOffset
+ , keyptr->gk_data, keyptr->gk_count);
+ tempData->tk_asciiParams[tempData->tk_asciiParamsOffset+keyptr->gk_count-1] = '|';
+ tempData->tk_asciiParamsOffset += keyptr->gk_count;
+ break;
+ default:
+ return 0; /* failure */
+ }
+
+ return 1; /* success */
+}
+
+
+/*
+ * Numerically sort the GeoKeys.
+ * We just do a linear search through
+ * the list and pull out the keys that were set.
+ */
+
+static int SortKeys(GTIF* gt,int *sortkeys)
+{
+ int loc;
+ int nkeys=0;
+ geokey_t key,kmin,kmax;
+ int *index = gt->gt_keyindex;
+
+ kmin = (geokey_t) gt->gt_keymin;
+ kmax = (geokey_t) gt->gt_keymax;
+ for (key=kmin; key<=kmax; key++)
+ {
+ if ( (loc=index[key]) != 0 )
+ {
+ sortkeys[nkeys] = loc;
+ nkeys++;
+ }
+ }
+
+ return nkeys==gt->gt_num_keys;
+}
+
diff --git a/src/tiff/geokeys.h b/src/tiff/geokeys.h
new file mode 100644
index 0000000..f3e47c1
--- /dev/null
+++ b/src/tiff/geokeys.h
@@ -0,0 +1,54 @@
+/**********************************************************************
+ *
+ * geokeys.h - Public registry for valid GEOTIFF GeoKeys.
+ *
+ * Written By: Niles D. Ritter
+ *
+ * Revision History:
+ *
+ * Rev.# Author M/D/Y Date Key Changes/Additions
+ * ----- ------ ---------- -------------------------------------
+ * 0 ndr 06/10/95 Inital Beta Release
+ * 1 ndr 09/18/95 Final 1.0 Release
+ *
+ **********************************************************************/
+
+#ifndef __geokeys_h_
+#define __geokeys_h_
+
+/* The GvCurrentRevision number should be incremented whenever a
+ * new set of Keys are defined or modified in "geokeys.inc", and comments
+ * added to the "Revision History" section above. If only code
+ * _values_ are augmented, the "GvCurrentMinorRev" number should
+ * be incremented instead (see "geovalues.h"). Whenever the
+ * GvCurrentRevision is incremented, the GvCurrentMinorRev should
+ * be reset to zero.
+ *
+ *
+ * The Section Numbers below refer to the GeoTIFF Spec sections
+ * in which these values are documented.
+ *
+ */
+#define GvCurrentRevision 1 /* Final 1.0 Release */
+
+#ifdef ValuePair
+# undef ValuePair
+#endif
+#define ValuePair(name,value) name = value,
+
+typedef enum {
+ BaseGeoKey = 1024, /* First valid code */
+
+# include "geokeys.inc" /* geokey database */
+
+ ReservedEndGeoKey = 32767,
+
+ /* Key space available for Private or internal use */
+ PrivateBaseGeoKey = 32768, /* Consistent with TIFF Private tags */
+ PrivateEndGeoKey = 65535,
+
+ EndGeoKey = 65535 /* Largest Possible GeoKey ID */
+} geokey_t;
+
+
+#endif /* __geokeys_h_ */
diff --git a/src/tiff/geokeys.inc b/src/tiff/geokeys.inc
new file mode 100644
index 0000000..286c23c
--- /dev/null
+++ b/src/tiff/geokeys.inc
@@ -0,0 +1,76 @@
+/* GeoTIFF GeoKey Database */
+
+/* Note: Any changes/additions to this database require */
+/* a change in the revision value in geokeys.h */
+
+/* C database for Geotiff include files. */
+/* the macro ValuePair() must be defined */
+/* by the enclosing include file */
+
+/* Revised 28 Sep 1995 NDR -- Added Rev. 1.0 aliases. */
+
+/* 6.2.1 GeoTIFF Configuration Keys */
+
+ValuePair( GTModelTypeGeoKey, 1024) /* Section 6.3.1.1 Codes */
+ValuePair( GTRasterTypeGeoKey, 1025) /* Section 6.3.1.2 Codes */
+ValuePair( GTCitationGeoKey, 1026) /* documentation */
+
+/* 6.2.2 Geographic CS Parameter Keys */
+
+ValuePair( GeographicTypeGeoKey, 2048) /* Section 6.3.2.1 Codes */
+ValuePair( GeogCitationGeoKey, 2049) /* documentation */
+ValuePair( GeogGeodeticDatumGeoKey, 2050) /* Section 6.3.2.2 Codes */
+ValuePair( GeogPrimeMeridianGeoKey, 2051) /* Section 6.3.2.4 codes */
+ValuePair( GeogLinearUnitsGeoKey, 2052) /* Section 6.3.1.3 Codes */
+ValuePair( GeogLinearUnitSizeGeoKey, 2053) /* meters */
+ValuePair( GeogAngularUnitsGeoKey, 2054) /* Section 6.3.1.4 Codes */
+ValuePair( GeogAngularUnitSizeGeoKey, 2055) /* radians */
+ValuePair( GeogEllipsoidGeoKey, 2056) /* Section 6.3.2.3 Codes */
+ValuePair( GeogSemiMajorAxisGeoKey, 2057) /* GeogLinearUnits */
+ValuePair( GeogSemiMinorAxisGeoKey, 2058) /* GeogLinearUnits */
+ValuePair( GeogInvFlatteningGeoKey, 2059) /* ratio */
+ValuePair( GeogAzimuthUnitsGeoKey, 2060) /* Section 6.3.1.4 Codes */
+ValuePair( GeogPrimeMeridianLongGeoKey, 2061) /* GeoAngularUnit */
+
+/* 6.2.3 Projected CS Parameter Keys */
+/* Several keys have been renamed,*/
+/* and the deprecated names aliased for backward compatibility */
+
+ValuePair( ProjectedCSTypeGeoKey, 3072) /* Section 6.3.3.1 codes */
+ValuePair( PCSCitationGeoKey, 3073) /* documentation */
+ValuePair( ProjectionGeoKey, 3074) /* Section 6.3.3.2 codes */
+ValuePair( ProjCoordTransGeoKey, 3075) /* Section 6.3.3.3 codes */
+ValuePair( ProjLinearUnitsGeoKey, 3076) /* Section 6.3.1.3 codes */
+ValuePair( ProjLinearUnitSizeGeoKey, 3077) /* meters */
+ValuePair( ProjStdParallel1GeoKey, 3078) /* GeogAngularUnit */
+ValuePair( ProjStdParallelGeoKey,ProjStdParallel1GeoKey) /* ** alias ** */
+ValuePair( ProjStdParallel2GeoKey, 3079) /* GeogAngularUnit */
+ValuePair( ProjNatOriginLongGeoKey, 3080) /* GeogAngularUnit */
+ValuePair( ProjOriginLongGeoKey,ProjNatOriginLongGeoKey) /* ** alias ** */
+ValuePair( ProjNatOriginLatGeoKey, 3081) /* GeogAngularUnit */
+ValuePair( ProjOriginLatGeoKey,ProjNatOriginLatGeoKey) /* ** alias ** */
+ValuePair( ProjFalseEastingGeoKey, 3082) /* ProjLinearUnits */
+ValuePair( ProjFalseNorthingGeoKey, 3083) /* ProjLinearUnits */
+ValuePair( ProjFalseOriginLongGeoKey, 3084) /* GeogAngularUnit */
+ValuePair( ProjFalseOriginLatGeoKey, 3085) /* GeogAngularUnit */
+ValuePair( ProjFalseOriginEastingGeoKey, 3086) /* ProjLinearUnits */
+ValuePair( ProjFalseOriginNorthingGeoKey, 3087) /* ProjLinearUnits */
+ValuePair( ProjCenterLongGeoKey, 3088) /* GeogAngularUnit */
+ValuePair( ProjCenterLatGeoKey, 3089) /* GeogAngularUnit */
+ValuePair( ProjCenterEastingGeoKey, 3090) /* ProjLinearUnits */
+ValuePair( ProjCenterNorthingGeoKey, 3091) /* ProjLinearUnits */
+ValuePair( ProjScaleAtNatOriginGeoKey, 3092) /* ratio */
+ValuePair( ProjScaleAtOriginGeoKey,ProjScaleAtNatOriginGeoKey) /* ** alias ** */
+ValuePair( ProjScaleAtCenterGeoKey, 3093) /* ratio */
+ValuePair( ProjAzimuthAngleGeoKey, 3094) /* GeogAzimuthUnit */
+ValuePair( ProjStraightVertPoleLongGeoKey, 3095) /* GeogAngularUnit */
+ValuePair( ProjRectifiedGridAngleGeoKey, 3096) /* GeogAngularUnit */
+
+/* 6.2.4 Vertical CS Keys */
+
+ValuePair( VerticalCSTypeGeoKey, 4096) /* Section 6.3.4.1 codes */
+ValuePair( VerticalCitationGeoKey, 4097) /* documentation */
+ValuePair( VerticalDatumGeoKey, 4098) /* Section 6.3.4.2 codes */
+ValuePair( VerticalUnitsGeoKey, 4099) /* Section 6.3.1 (.x) codes */
+
+/* End of Data base */
diff --git a/src/tiff/geonames.h b/src/tiff/geonames.h
new file mode 100644
index 0000000..ccedc7d
--- /dev/null
+++ b/src/tiff/geonames.h
@@ -0,0 +1,146 @@
+/*
+ * geonames.h
+ *
+ * This encapsulates all of the value-naming mechanism of
+ * libgeotiff.
+ *
+ * Written By: Niles Ritter
+ *
+ * Revision History:
+ *
+ * Author Date Key Changes/Additions
+ * ------ ---------- -------------------------------------
+ * ndr 10 Jun 95 Inital Beta Release
+ * ndr 28 Jul 95 Added ModelType aliases, Kv aliases.
+ */
+
+#ifndef __geonames_h
+#define __geonames_h
+
+struct _KeyInfo {
+ int ki_key;
+ char *ki_name;
+};
+typedef struct _KeyInfo KeyInfo;
+
+/* If memory is a premium, then omitting the
+ * long name lists may save some space; simply
+ * #define OMIT_GEOTIFF_NAMES in the compile statement
+ * to remove all key->string translation.
+ */
+#ifdef ValuePair
+# undef ValuePair
+#endif
+
+#ifndef OMIT_GEOTIFF_NAMES
+#define ValuePair(token,value) {token,#token},
+#else
+#define ValuePair(token,value)
+#endif
+
+#define END_LIST { -1, (char *)0}
+
+/************************************************************
+ * 6.2.x GeoTIFF Keys
+ ************************************************************/
+
+static KeyInfo _keyInfo[] = {
+# include "geokeys.inc" /* geokey database */
+ END_LIST
+};
+
+#define COMMON_VALUES \
+ {KvUndefined, "Undefined"}, \
+ {KvUserDefined,"User-Defined"}, \
+ ValuePair(KvUndefined,KvUndefined) \
+ ValuePair(KvUserDefined,KvUserDefined)
+
+static KeyInfo _csdefaultValue[] = {
+ COMMON_VALUES
+ END_LIST
+};
+
+/************************************************************
+ * 6.3.x GeoTIFF Key Values
+ ************************************************************/
+
+static KeyInfo _modeltypeValue[] = {
+ COMMON_VALUES
+ ValuePair(ModelTypeProjected,1)
+ ValuePair(ModelTypeGeographic,2)
+ ValuePair(ModelTypeGeocentric,3)
+ ValuePair(ModelProjected,1) /* aliases */
+ ValuePair(ModelGeographic,2) /* aliases */
+ ValuePair(ModelGeocentric,3) /* aliases */
+ END_LIST
+};
+
+static KeyInfo _rastertypeValue[] = {
+ COMMON_VALUES
+ ValuePair(RasterPixelIsArea,1)
+ ValuePair(RasterPixelIsPoint,2)
+ END_LIST
+};
+
+static KeyInfo _geounitsValue[] = {
+ COMMON_VALUES
+# include "epsg_units.inc"
+ END_LIST
+};
+
+static KeyInfo _geographicValue[] = {
+ COMMON_VALUES
+# include "epsg_gcs.inc"
+ END_LIST
+};
+
+static KeyInfo _geodeticdatumValue[] = {
+ COMMON_VALUES
+# include "epsg_datum.inc"
+ END_LIST
+};
+
+static KeyInfo _ellipsoidValue[] = {
+ COMMON_VALUES
+# include "epsg_ellipse.inc"
+ END_LIST
+};
+
+static KeyInfo _primemeridianValue[] = {
+ COMMON_VALUES
+# include "epsg_pm.inc"
+ END_LIST
+};
+
+static KeyInfo _pcstypeValue[] = {
+ COMMON_VALUES
+# include "epsg_pcs.inc"
+ END_LIST
+};
+
+static KeyInfo _projectionValue[] = {
+ COMMON_VALUES
+# include "epsg_proj.inc"
+ END_LIST
+};
+
+static KeyInfo _coordtransValue[] = {
+ COMMON_VALUES
+# include "geo_ctrans.inc"
+ END_LIST
+};
+
+static KeyInfo _vertcstypeValue[] = {
+ COMMON_VALUES
+# include "epsg_vertcs.inc"
+ END_LIST
+};
+
+static KeyInfo _vdatumValue[] = {
+ COMMON_VALUES
+ ValuePair(VDatumBase,1)
+ END_LIST
+};
+
+#endif /* __geonames_h */
+
diff --git a/src/tiff/geotiff.h b/src/tiff/geotiff.h
new file mode 100644
index 0000000..dc57caf
--- /dev/null
+++ b/src/tiff/geotiff.h
@@ -0,0 +1,117 @@
+/**********************************************************************
+ *
+ * geotiff.h - Public interface for Geotiff tag parsing.
+ *
+ *
+ * Written By: Niles D. Ritter
+ *
+ **********************************************************************/
+
+#ifndef __geotiff_h_
+#define __geotiff_h_
+
+/**
+ * \file geotiff.h
+ *
+ * Primary libgeotiff include file.
+ *
+ * This is the defacto registry for valid GEOTIFF GeoKeys
+ * and their associated symbolic values. This is also the only file
+ * of the GeoTIFF library which needs to be included in client source
+ * code.
+ */
+
+/* This Version code should only change if a drastic
+ * alteration is made to the GeoTIFF key structure. Readers
+ * encountering a larger value should give up gracefully.
+ */
+#define GvCurrentVersion 1
+
+#define LIBGEOTIFF_VERSION 1210
+
+#include "geo_config.h"
+#include "geokeys.h"
+
+/**********************************************************************
+ * Do we want to build as a DLL on windows?
+ **********************************************************************/
+#if !defined(CPL_DLL)
+# if defined(_WIN32) && defined(BUILD_AS_DLL)
+# define CPL_DLL __declspec(dllexport)
+# else
+# define CPL_DLL
+# endif
+#endif
+
+/**********************************************************************
+ *
+ * Public Structures & Definitions
+ *
+ **********************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef struct gtiff GTIF; /* struct gtiff is private */
+typedef unsigned short tifftag_t;
+typedef unsigned short geocode_t;
+typedef int (*GTIFPrintMethod)(char *string, void *aux);
+typedef int (*GTIFReadMethod)(char *string, void *aux);
+
+typedef enum {
+ TYPE_BYTE=1,
+ TYPE_SHORT=2,
+ TYPE_LONG=3,
+ TYPE_RATIONAL=4,
+ TYPE_ASCII=5,
+ TYPE_FLOAT=6,
+ TYPE_DOUBLE=7,
+ TYPE_SBYTE=8,
+ TYPE_SSHORT=9,
+ TYPE_SLONG=10,
+ TYPE_UNKNOWN=11
+} tagtype_t;
+
+
+/**********************************************************************
+ *
+ * Public Function Declarations
+ *
+ **********************************************************************/
+
+/* TIFF-level interface */
+GTIF CPL_DLL *GTIFNew(void *tif);
+void CPL_DLL GTIFFree(GTIF *gtif);
+int CPL_DLL GTIFWriteKeys(GTIF *gtif);
+void CPL_DLL GTIFDirectoryInfo(GTIF *gtif, int *versions, int *keycount);
+
+/* GeoKey Access */
+int CPL_DLL GTIFKeyInfo(GTIF *gtif, geokey_t key, int *size, tagtype_t* type);
+int CPL_DLL GTIFKeyGet(GTIF *gtif, geokey_t key, void *val, int index,
+ int count);
+int CPL_DLL GTIFKeySet(GTIF *gtif, geokey_t keyID, tagtype_t type,
+ int count,...);
+
+/* Metadata Import-Export utilities */
+void CPL_DLL GTIFPrint(GTIF *gtif, GTIFPrintMethod print, void *aux);
+int CPL_DLL GTIFImport(GTIF *gtif, GTIFReadMethod scan, void *aux);
+char CPL_DLL *GTIFKeyName(geokey_t key);
+char CPL_DLL *GTIFValueName(geokey_t key,int value);
+char CPL_DLL *GTIFTypeName(tagtype_t type);
+char CPL_DLL *GTIFTagName(int tag);
+int CPL_DLL GTIFKeyCode(char * key);
+int CPL_DLL GTIFValueCode(geokey_t key,char *value);
+int CPL_DLL GTIFTypeCode(char *type);
+int CPL_DLL GTIFTagCode(char *tag);
+
+/* Translation between image/PCS space */
+
+int CPL_DLL GTIFImageToPCS( GTIF *gtif, double *x, double *y );
+int CPL_DLL GTIFPCSToImage( GTIF *gtif, double *x, double *y );
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __geotiff_h_ */
diff --git a/src/tiff/geotiff_proj4.c b/src/tiff/geotiff_proj4.c
new file mode 100644
index 0000000..1778d73
--- /dev/null
+++ b/src/tiff/geotiff_proj4.c
@@ -0,0 +1,679 @@
+/******************************************************************************
+ * $Id: geotiff_proj4.c,v 1.3 2004/03/19 11:51:24 lubia Exp $
+ *
+ * Project: libgeotiff
+ * Purpose: Code to convert a normalized GeoTIFF definition into a PROJ.4
+ * (OGDI) compatible projection string.
+ * Author: Frank Warmerdam, warmerda at home.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: geotiff_proj4.c,v $
+ * Revision 1.3 2004/03/19 11:51:24 lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.19 2002/11/29 20:57:09 warmerda
+ * added LCC1SP mapping
+ *
+ * Revision 1.18 2002/07/09 14:47:53 warmerda
+ * fixed translation of polar stereographic
+ *
+ * Revision 1.17 2001/11/23 19:53:56 warmerda
+ * free PROJ.4 definitions after use
+ *
+ * Revision 1.16 2000/12/05 19:21:45 warmerda
+ * added cassini support
+ *
+ * Revision 1.15 2000/12/05 17:44:41 warmerda
+ * Use +R_A for Miller and VanDerGrinten
+ *
+ * Revision 1.14 2000/10/13 18:06:51 warmerda
+ * added econic support for PROJ.4 translation
+ *
+ * Revision 1.13 2000/09/15 19:30:48 warmerda
+ * *** empty log message ***
+ *
+ * Revision 1.12 2000/09/15 18:21:07 warmerda
+ * Fixed order of parameters for LCC 2SP. When parameters
+ * were read from EPSG CSV files the standard parallels and origin
+ * were mixed up. This affects alot of state plane zones!
+ *
+ * Revision 1.11 2000/06/06 17:39:45 warmerda
+ * Modify to work with projUV version of library.
+ *
+ * Revision 1.10 1999/07/06 15:05:51 warmerda
+ * Fixed up LCC_1SP notes.
+ *
+ * Revision 1.9 1999/05/04 16:24:49 warmerda
+ * Fixed projection string formating with zones.
+ *
+ * Revision 1.8 1999/05/04 12:27:01 geotiff
+ * only emit proj unsupported warning if DEBUG defined
+ *
+ * Revision 1.7 1999/05/04 03:14:59 warmerda
+ * fixed use of foot instead of ft for units
+ *
+ * Revision 1.6 1999/05/03 17:50:31 warmerda
+ * avoid warnings on IRIX
+ *
+ * Revision 1.5 1999/04/29 23:02:24 warmerda
+ * added mapsys utm test.
+ *
+ * Revision 1.4 1999/03/18 21:35:42 geotiff
+ * Added reprojection functions
+ *
+ * Revision 1.3 1999/03/10 18:11:17 geotiff
+ * Removed comment about this not being the master ... now it is.
+ *
+ * Revision 1.2 1999/03/10 18:10:27 geotiff
+ * Avoid use of cpl_serv.h and CPLStrdup().
+ *
+ * Revision 1.1 1999/03/10 15:20:43 geotiff
+ * New
+ *
+ */
+
+#include "cpl_serv.h"
+#include "geotiff.h"
+#include "geo_normalize.h"
+#include "geovalues.h"
+
+/************************************************************************/
+/* GTIFGetProj4Defn() */
+/************************************************************************/
+
+char * GTIFGetProj4Defn( GTIFDefn * psDefn )
+
+{
+ char szProjection[512];
+ char szUnits[24];
+ double dfFalseEasting, dfFalseNorthing;
+
+ szProjection[0] = '\0';
+
+/* ==================================================================== */
+/* Translate the units of measure. */
+/* */
+/* Note that even with a +units, or +to_meter in effect, it is */
+/* still assumed that all the projection parameters are in */
+/* meters. */
+/* ==================================================================== */
+ if( psDefn->UOMLength == Linear_Meter )
+ {
+ strcpy( szUnits, "+units=m " );
+ }
+ else if( psDefn->UOMLength == Linear_Foot )
+ {
+ strcpy( szUnits, "+units=ft " );
+ }
+ else if( psDefn->UOMLength == Linear_Foot_US_Survey )
+ {
+ strcpy( szUnits, "+units=us-ft " );
+ }
+ else if( psDefn->UOMLength == Linear_Foot_Indian )
+ {
+ strcpy( szUnits, "+units=ind-ft " );
+ }
+ else if( psDefn->UOMLength == Linear_Link )
+ {
+ strcpy( szUnits, "+units=link " );
+ }
+ else if( psDefn->UOMLength == Linear_Yard_Indian)
+ {
+ strcpy( szUnits, "+units=ind-yd " );
+ }
+ else if( psDefn->UOMLength == Linear_Fathom )
+ {
+ strcpy( szUnits, "+units=fath " );
+ }
+ else if( psDefn->UOMLength == Linear_Mile_International_Nautical )
+ {
+ strcpy( szUnits, "+units=kmi " );
+ }
+ else
+ {
+ sprintf( szUnits, "+to_meter=%.10f", psDefn->UOMLengthInMeters );
+ }
+
+/* -------------------------------------------------------------------- */
+/* false easting and northing are in meters and that is what */
+/* PROJ.4 wants regardless of the linear units. */
+/* -------------------------------------------------------------------- */
+ dfFalseEasting = psDefn->ProjParm[5];
+ dfFalseNorthing = psDefn->ProjParm[6];
+
+/* ==================================================================== */
+/* Handle general projection methods. */
+/* ==================================================================== */
+
+/* -------------------------------------------------------------------- */
+/* UTM - special case override on transverse mercator so things */
+/* will be more meaningful to the user. */
+/* -------------------------------------------------------------------- */
+ if( psDefn->MapSys == MapSys_UTM_North )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=utm +zone=%d ",
+ psDefn->Zone );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Transverse Mercator */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_TransverseMercator )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=tmerc +lat_0=%.9f +lon_0=%.9f +k=%f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ psDefn->ProjParm[4],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Mercator */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_Mercator )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=merc +lat_ts=%.9f +lon_0=%.9f +k=%f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ psDefn->ProjParm[4],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Cassini/Soldner */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_CassiniSoldner )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=cass +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Oblique Stereographic - Should this really map onto */
+/* Stereographic? */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_ObliqueStereographic )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=stere +lat_0=%.9f +lon_0=%.9f +k=%f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ psDefn->ProjParm[4],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Stereographic */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_Stereographic )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=stere +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Polar Stereographic */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_PolarStereographic )
+ {
+ if( psDefn->ProjParm[0] > 0.0 )
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=stere +lat_0=90 +lat_ts=%.9f +lon_0=%.9f "
+ "+k=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ psDefn->ProjParm[4],
+ dfFalseEasting,
+ dfFalseNorthing );
+ else
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=stere +lat_0=-90 +lat_ts=%.9f +lon_0=%.9f "
+ "+k=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ psDefn->ProjParm[4],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Equirectangular */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_Equirectangular )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=eqc +lat_ts=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Gnomonic */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_Gnomonic )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=gnom +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Orthographic */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_Orthographic )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=ortho +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Lambert Azimuthal Equal Area */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_LambertAzimEqualArea )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=laea +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Azimuthal Equidistant */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_AzimuthalEquidistant )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=aeqd +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Miller Cylindrical */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_MillerCylindrical )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=mill +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f +R_A ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Polyconic */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_Polyconic )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=poly +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* AlbersEqualArea */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_AlbersEqualArea )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=aea +lat_1=%.9f +lat_2=%.9f +lat_0=%.9f +lon_0=%.9f"
+ " +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ psDefn->ProjParm[2],
+ psDefn->ProjParm[3],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* EquidistantConic */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_EquidistantConic )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=eqdc +lat_1=%.9f +lat_2=%.9f +lat_0=%.9f +lon_0=%.9f"
+ " +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ psDefn->ProjParm[2],
+ psDefn->ProjParm[3],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Robinson */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_Robinson )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=robin +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[1],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* VanDerGrinten */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_VanDerGrinten )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=vandg +lon_0=%.9f +x_0=%.3f +y_0=%.3f +R_A ",
+ psDefn->ProjParm[1],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Sinusoidal */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_Sinusoidal )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=sinu +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[1],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* LambertConfConic_2SP */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_LambertConfConic_2SP )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=lcc +lat_0=%.9f +lon_0=%.9f +lat_1=%.9f +lat_2=%.9f "
+ " +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ psDefn->ProjParm[2],
+ psDefn->ProjParm[3],
+ dfFalseEasting,
+ dfFalseNorthing );
+ }
+
+/* -------------------------------------------------------------------- */
+/* LambertConfConic_1SP */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_LambertConfConic_1SP )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=lcc +lat_0=%.9f +lat_1=%.9f +lon_0=%.9f"
+ " +k_0=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ psDefn->ProjParm[4],
+ psDefn->ProjParm[5],
+ psDefn->ProjParm[6] );
+ }
+
+/* -------------------------------------------------------------------- */
+/* NewZealandMapGrid */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_NewZealandMapGrid )
+ {
+ /* this appears to be an unsupported formulation with PROJ.4 */
+ }
+
+/* -------------------------------------------------------------------- */
+/* Transverse Mercator - south oriented. */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_TransvMercator_SouthOriented )
+ {
+ /* this appears to be an unsupported formulation with PROJ.4 */
+ }
+
+/* -------------------------------------------------------------------- */
+/* ObliqueMercator (Hotine) */
+/* -------------------------------------------------------------------- */
+ else if( psDefn->CTProjection == CT_ObliqueMercator )
+ {
+ /* not clear how ProjParm[3] - angle from rectified to skewed grid -
+ should be applied ... see the +not_rot flag for PROJ.4.
+ Just ignoring for now. */
+
+ sprintf( szProjection+strlen(szProjection),
+ "+proj=omerc +lat_0=%.9f +lonc=%.9f +alpha=%.9f"
+ " +k=%.9f +x_0=%.3f +y_0=%.3f ",
+ psDefn->ProjParm[0],
+ psDefn->ProjParm[1],
+ psDefn->ProjParm[2],
+ psDefn->ProjParm[4],
+ psDefn->ProjParm[5],
+ psDefn->ProjParm[6] );
+ }
+
+/* ==================================================================== */
+/* Handle ellipsoid information. */
+/* ==================================================================== */
+ if( psDefn->Ellipsoid == Ellipse_WGS_84 )
+ strcat( szProjection, "+ellps=WGS84 " );
+ else if( psDefn->Ellipsoid == Ellipse_Clarke_1866 )
+ strcat( szProjection, "+ellps=clrk66 " );
+ else if( psDefn->Ellipsoid == Ellipse_Clarke_1880 )
+ strcat( szProjection, "+ellps=clrk80 " );
+ else if( psDefn->Ellipsoid == Ellipse_GRS_1980 )
+ strcat( szProjection, "+ellps=GRS80 " );
+ else
+ {
+ if( psDefn->SemiMajor != 0.0 && psDefn->SemiMinor != 0.0 )
+ {
+ sprintf( szProjection+strlen(szProjection),
+ "+a=%.3f +b=%.3f ",
+ psDefn->SemiMajor,
+ psDefn->SemiMinor );
+ }
+ }
+
+ strcat( szProjection, szUnits );
+
+ return( strdup( szProjection ) );
+}
+
+#if !defined(HAVE_LIBPROJ) || !defined(HAVE_PROJECTS_H)
+
+int GTIFProj4ToLatLong( GTIFDefn * psDefn, int nPoints,
+ double *padfX, double *padfY )
+{
+#ifdef DEBUG
+ fprintf( stderr,
+ "GTIFProj4ToLatLong() - PROJ.4 support not compiled in.\n" );
+#endif
+ return FALSE;
+}
+
+int GTIFProj4FromLatLong( GTIFDefn * psDefn, int nPoints,
+ double *padfX, double *padfY )
+{
+#ifdef DEBUG
+ fprintf( stderr,
+ "GTIFProj4FromLatLong() - PROJ.4 support not compiled in.\n" );
+#endif
+ return FALSE;
+}
+#else
+
+#include "projects.h"
+
+#ifdef USE_PROJUV
+# define UV projUV
+#endif
+
+/************************************************************************/
+/* GTIFProj4FromLatLong() */
+/* */
+/* Convert lat/long values to projected coordinate for a */
+/* particular definition. */
+/************************************************************************/
+
+int GTIFProj4FromLatLong( GTIFDefn * psDefn, int nPoints,
+ double *padfX, double *padfY )
+
+{
+ char *pszProjection, **papszArgs;
+ PJ *psPJ;
+ int i;
+
+/* -------------------------------------------------------------------- */
+/* Get a projection definition. */
+/* -------------------------------------------------------------------- */
+ pszProjection = GTIFGetProj4Defn( psDefn );
+
+ if( pszProjection == NULL )
+ return FALSE;
+
+/* -------------------------------------------------------------------- */
+/* Parse into tokens for pj_init(), and initialize the projection. */
+/* -------------------------------------------------------------------- */
+
+ papszArgs = CSLTokenizeStringComplex( pszProjection, " +", TRUE, FALSE );
+ free( pszProjection );
+
+ psPJ = pj_init( CSLCount(papszArgs), papszArgs );
+
+ CSLDestroy( papszArgs );
+
+ if( psPJ == NULL )
+ {
+ return FALSE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Process each of the points. */
+/* -------------------------------------------------------------------- */
+ for( i = 0; i < nPoints; i++ )
+ {
+ UV sUV;
+
+ sUV.u = padfX[i] * DEG_TO_RAD;
+ sUV.v = padfY[i] * DEG_TO_RAD;
+
+ sUV = pj_fwd( sUV, psPJ );
+
+ padfX[i] = sUV.u;
+ padfY[i] = sUV.v;
+ }
+
+ pj_free( psPJ );
+
+ return TRUE;
+}
+
+/************************************************************************/
+/* GTIFProj4ToLatLong() */
+/* */
+/* Convert projection coordinates to lat/long for a particular */
+/* definition. */
+/************************************************************************/
+
+int GTIFProj4ToLatLong( GTIFDefn * psDefn, int nPoints,
+ double *padfX, double *padfY )
+
+{
+ char *pszProjection, **papszArgs;
+ PJ *psPJ;
+ int i;
+
+/* -------------------------------------------------------------------- */
+/* Get a projection definition. */
+/* -------------------------------------------------------------------- */
+ pszProjection = GTIFGetProj4Defn( psDefn );
+
+ if( pszProjection == NULL )
+ return FALSE;
+
+/* -------------------------------------------------------------------- */
+/* Parse into tokens for pj_init(), and initialize the projection. */
+/* -------------------------------------------------------------------- */
+
+ papszArgs = CSLTokenizeStringComplex( pszProjection, " +", TRUE, FALSE );
+ free( pszProjection );
+
+ psPJ = pj_init( CSLCount(papszArgs), papszArgs );
+
+ CSLDestroy( papszArgs );
+
+ if( psPJ == NULL )
+ {
+ return FALSE;
+ }
+
+/* -------------------------------------------------------------------- */
+/* Process each of the points. */
+/* -------------------------------------------------------------------- */
+ for( i = 0; i < nPoints; i++ )
+ {
+ UV sUV;
+
+ sUV.u = padfX[i];
+ sUV.v = padfY[i];
+
+ sUV = pj_inv( sUV, psPJ );
+
+ padfX[i] = sUV.u * RAD_TO_DEG;
+ padfY[i] = sUV.v * RAD_TO_DEG;
+ }
+
+ pj_free( psPJ );
+
+ return TRUE;
+}
+
+
+#endif /* has projects.h and -lproj */
+
diff --git a/src/tiff/geotiffio.h b/src/tiff/geotiffio.h
new file mode 100644
index 0000000..72442b4
--- /dev/null
+++ b/src/tiff/geotiffio.h
@@ -0,0 +1,16 @@
+/*
+ * geotiffio.h
+ *
+ * Standard include file for geotiff, including all
+ * key and code definitions.
+ */
+
+
+#ifndef __geotiffio_h
+#define __geotiffio_h
+
+#include "geotiff.h" /* public key interface */
+#include "geovalues.h" /* key code definitions */
+
+#endif /* __geotiffio_h */
+
diff --git a/src/tiff/geovalues.h b/src/tiff/geovalues.h
new file mode 100644
index 0000000..625d33a
--- /dev/null
+++ b/src/tiff/geovalues.h
@@ -0,0 +1,120 @@
+/**********************************************************************
+ *
+ * geovalues.h - Public registry for valid GEOTIFF key-values.
+ *
+ * Written By: Niles D. Ritter
+ *
+ * Revision History:
+ *
+ * Rev.# Author Date Key Changes/Additions
+ * ----- ------ ---------- -------------------------------------
+ * 0.1 ndr 10 Jun 95 Inital Beta Release
+ * 0.2 ndr 12 Jul 95 New EPSG Tables installed.
+ * 0.2.1 ndr 28 Jul 95 Added ModelType aliases to Model's
+ * 1.0 ndr 18 Sep 95 Promoted to Revision 1.0
+ *
+ **********************************************************************/
+
+#ifndef __geovalues_h_
+#define __geovalues_h_
+
+/* If code values are added or modified, the "GvCurrentMinorRev"
+ * number should be incremented here. If new Keys are added, then the
+ * GvCurrentRevision number should be incremented instead, and the
+ * GvCurrentMinorRev should be reset to zero (see "geokeys.h").
+ *
+ * In addition, any changes here should be reflected in "geo_names.c"
+ *
+ */
+
+#define GvCurrentMinorRev 0 /* First Major Rev EPSG Code Release */
+
+
+/*
+ * Universal key values -- defined for consistency
+ */
+#define KvUndefined 0
+#define KvUserDefined 32767
+
+#ifdef ValuePair
+# undef ValuePair
+#endif
+#define ValuePair(name,value) name = value,
+
+/*
+ * The section numbers refer to the GeoTIFF Specification section
+ * in which the code values are documented.
+ */
+
+/************************************************************
+ * 6.3.1 GeoTIFF General Codes
+ ************************************************************/
+
+/* 6.3.1.1 Model Type Codes */
+typedef enum {
+ ModelTypeProjected = 1, /* Projection Coordinate System */
+ ModelTypeGeographic = 2, /* Geographic latitude-longitude System */
+ ModelTypeGeocentric = 3, /* Geocentric (X,Y,Z) Coordinate System */
+ ModelProjected = ModelTypeProjected, /* alias */
+ ModelGeographic = ModelTypeGeographic, /* alias */
+ ModelGeocentric = ModelTypeGeocentric /* alias */
+} modeltype_t;
+
+/* 6.3.1.2 Raster Type Codes */
+typedef enum {
+ RasterPixelIsArea = 1, /* Standard pixel-fills-grid-cell */
+ RasterPixelIsPoint = 2 /* Pixel-at-grid-vertex */
+} rastertype_t;
+
+typedef enum {
+# include "epsg_gcs.inc"
+ geographic_end
+} geographic_t;
+
+typedef enum {
+# include "epsg_datum.inc"
+ geodeticdatum_end
+} geodeticdatum_t;
+
+typedef enum {
+# include "epsg_units.inc"
+ Unit_End
+} geounits_t;
+
+typedef enum {
+# include "epsg_ellipse.inc"
+ ellipsoid_end
+} ellipsoid_t;
+
+typedef enum {
+# include "epsg_pm.inc"
+ primemeridian_end
+} primemeridian_t;
+
+typedef enum {
+# include "epsg_pcs.inc"
+ pcstype_end
+} pcstype_t;
+
+typedef enum {
+# include "epsg_proj.inc"
+ projection_end
+} projection_t;
+
+typedef enum {
+# include "geo_ctrans.inc"
+ coordtrans_end
+} coordtrans_t;
+
+typedef enum {
+# include "epsg_vertcs.inc"
+ vertcs_end
+} vertcstype_t;
+
+
+typedef enum {
+ VDatumBase = 1
+} vdatum_t;
+
+#endif /* __geovalues_h_ */
+
diff --git a/src/tiff/port.h b/src/tiff/port.h
new file mode 100644
index 0000000..50dafd7
--- /dev/null
+++ b/src/tiff/port.h
@@ -0,0 +1,32 @@
+/*
+ * Warning, this file was automatically created by the TIFF configure script
+ * VERSION: v3.4033
+ * DATE: Fri Dec 12 17:10:08 EDT 1997
+ * TARGET: sparc-sun-solaris2.5.1
+ * CCOMPILER: /usr/local/bin/gcc-2.7.2
+ */
+#ifndef _PORT_
+#define _PORT_ 1
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <sys/types.h>
+#define HOST_FILLORDER FILLORDER_LSB2MSB
+#define HOST_BIGENDIAN 0
+#define HAVE_MMAP 1
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+typedef double dblparam_t;
+#ifdef __STRICT_ANSI__
+#define INLINE __inline__
+#else
+#define INLINE inline
+#endif
+#define GLOBALDATA(TYPE,NAME) extern TYPE NAME
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/tiff/t4.h b/src/tiff/t4.h
new file mode 100644
index 0000000..2fb12a2
--- /dev/null
+++ b/src/tiff/t4.h
@@ -0,0 +1,285 @@
+/* $Id: t4.h,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _T4_
+#define _T4_
+/*
+ * CCITT T.4 1D Huffman runlength codes and
+ * related definitions. Given the small sizes
+ * of these tables it does not seem
+ * worthwhile to make code & length 8 bits.
+ */
+typedef struct tableentry {
+ unsigned short length; /* bit length of g3 code */
+ unsigned short code; /* g3 code */
+ short runlen; /* run length in bits */
+} tableentry;
+
+#define EOL 0x001 /* EOL code value - 0000 0000 0000 1 */
+
+/* status values returned instead of a run length */
+#define G3CODE_EOL -1 /* NB: ACT_EOL - ACT_WRUNT */
+#define G3CODE_INVALID -2 /* NB: ACT_INVALID - ACT_WRUNT */
+#define G3CODE_EOF -3 /* end of input data */
+#define G3CODE_INCOMP -4 /* incomplete run code */
+
+/*
+ * Note that these tables are ordered such that the
+ * index into the table is known to be either the
+ * run length, or (run length / 64) + a fixed offset.
+ *
+ * NB: The G3CODE_INVALID entries are only used
+ * during state generation (see mkg3states.c).
+ */
+#ifdef G3CODES
+const tableentry TIFFFaxWhiteCodes[] = {
+ { 8, 0x35, 0 }, /* 0011 0101 */
+ { 6, 0x7, 1 }, /* 0001 11 */
+ { 4, 0x7, 2 }, /* 0111 */
+ { 4, 0x8, 3 }, /* 1000 */
+ { 4, 0xB, 4 }, /* 1011 */
+ { 4, 0xC, 5 }, /* 1100 */
+ { 4, 0xE, 6 }, /* 1110 */
+ { 4, 0xF, 7 }, /* 1111 */
+ { 5, 0x13, 8 }, /* 1001 1 */
+ { 5, 0x14, 9 }, /* 1010 0 */
+ { 5, 0x7, 10 }, /* 0011 1 */
+ { 5, 0x8, 11 }, /* 0100 0 */
+ { 6, 0x8, 12 }, /* 0010 00 */
+ { 6, 0x3, 13 }, /* 0000 11 */
+ { 6, 0x34, 14 }, /* 1101 00 */
+ { 6, 0x35, 15 }, /* 1101 01 */
+ { 6, 0x2A, 16 }, /* 1010 10 */
+ { 6, 0x2B, 17 }, /* 1010 11 */
+ { 7, 0x27, 18 }, /* 0100 111 */
+ { 7, 0xC, 19 }, /* 0001 100 */
+ { 7, 0x8, 20 }, /* 0001 000 */
+ { 7, 0x17, 21 }, /* 0010 111 */
+ { 7, 0x3, 22 }, /* 0000 011 */
+ { 7, 0x4, 23 }, /* 0000 100 */
+ { 7, 0x28, 24 }, /* 0101 000 */
+ { 7, 0x2B, 25 }, /* 0101 011 */
+ { 7, 0x13, 26 }, /* 0010 011 */
+ { 7, 0x24, 27 }, /* 0100 100 */
+ { 7, 0x18, 28 }, /* 0011 000 */
+ { 8, 0x2, 29 }, /* 0000 0010 */
+ { 8, 0x3, 30 }, /* 0000 0011 */
+ { 8, 0x1A, 31 }, /* 0001 1010 */
+ { 8, 0x1B, 32 }, /* 0001 1011 */
+ { 8, 0x12, 33 }, /* 0001 0010 */
+ { 8, 0x13, 34 }, /* 0001 0011 */
+ { 8, 0x14, 35 }, /* 0001 0100 */
+ { 8, 0x15, 36 }, /* 0001 0101 */
+ { 8, 0x16, 37 }, /* 0001 0110 */
+ { 8, 0x17, 38 }, /* 0001 0111 */
+ { 8, 0x28, 39 }, /* 0010 1000 */
+ { 8, 0x29, 40 }, /* 0010 1001 */
+ { 8, 0x2A, 41 }, /* 0010 1010 */
+ { 8, 0x2B, 42 }, /* 0010 1011 */
+ { 8, 0x2C, 43 }, /* 0010 1100 */
+ { 8, 0x2D, 44 }, /* 0010 1101 */
+ { 8, 0x4, 45 }, /* 0000 0100 */
+ { 8, 0x5, 46 }, /* 0000 0101 */
+ { 8, 0xA, 47 }, /* 0000 1010 */
+ { 8, 0xB, 48 }, /* 0000 1011 */
+ { 8, 0x52, 49 }, /* 0101 0010 */
+ { 8, 0x53, 50 }, /* 0101 0011 */
+ { 8, 0x54, 51 }, /* 0101 0100 */
+ { 8, 0x55, 52 }, /* 0101 0101 */
+ { 8, 0x24, 53 }, /* 0010 0100 */
+ { 8, 0x25, 54 }, /* 0010 0101 */
+ { 8, 0x58, 55 }, /* 0101 1000 */
+ { 8, 0x59, 56 }, /* 0101 1001 */
+ { 8, 0x5A, 57 }, /* 0101 1010 */
+ { 8, 0x5B, 58 }, /* 0101 1011 */
+ { 8, 0x4A, 59 }, /* 0100 1010 */
+ { 8, 0x4B, 60 }, /* 0100 1011 */
+ { 8, 0x32, 61 }, /* 0011 0010 */
+ { 8, 0x33, 62 }, /* 0011 0011 */
+ { 8, 0x34, 63 }, /* 0011 0100 */
+ { 5, 0x1B, 64 }, /* 1101 1 */
+ { 5, 0x12, 128 }, /* 1001 0 */
+ { 6, 0x17, 192 }, /* 0101 11 */
+ { 7, 0x37, 256 }, /* 0110 111 */
+ { 8, 0x36, 320 }, /* 0011 0110 */
+ { 8, 0x37, 384 }, /* 0011 0111 */
+ { 8, 0x64, 448 }, /* 0110 0100 */
+ { 8, 0x65, 512 }, /* 0110 0101 */
+ { 8, 0x68, 576 }, /* 0110 1000 */
+ { 8, 0x67, 640 }, /* 0110 0111 */
+ { 9, 0xCC, 704 }, /* 0110 0110 0 */
+ { 9, 0xCD, 768 }, /* 0110 0110 1 */
+ { 9, 0xD2, 832 }, /* 0110 1001 0 */
+ { 9, 0xD3, 896 }, /* 0110 1001 1 */
+ { 9, 0xD4, 960 }, /* 0110 1010 0 */
+ { 9, 0xD5, 1024 }, /* 0110 1010 1 */
+ { 9, 0xD6, 1088 }, /* 0110 1011 0 */
+ { 9, 0xD7, 1152 }, /* 0110 1011 1 */
+ { 9, 0xD8, 1216 }, /* 0110 1100 0 */
+ { 9, 0xD9, 1280 }, /* 0110 1100 1 */
+ { 9, 0xDA, 1344 }, /* 0110 1101 0 */
+ { 9, 0xDB, 1408 }, /* 0110 1101 1 */
+ { 9, 0x98, 1472 }, /* 0100 1100 0 */
+ { 9, 0x99, 1536 }, /* 0100 1100 1 */
+ { 9, 0x9A, 1600 }, /* 0100 1101 0 */
+ { 6, 0x18, 1664 }, /* 0110 00 */
+ { 9, 0x9B, 1728 }, /* 0100 1101 1 */
+ { 11, 0x8, 1792 }, /* 0000 0001 000 */
+ { 11, 0xC, 1856 }, /* 0000 0001 100 */
+ { 11, 0xD, 1920 }, /* 0000 0001 101 */
+ { 12, 0x12, 1984 }, /* 0000 0001 0010 */
+ { 12, 0x13, 2048 }, /* 0000 0001 0011 */
+ { 12, 0x14, 2112 }, /* 0000 0001 0100 */
+ { 12, 0x15, 2176 }, /* 0000 0001 0101 */
+ { 12, 0x16, 2240 }, /* 0000 0001 0110 */
+ { 12, 0x17, 2304 }, /* 0000 0001 0111 */
+ { 12, 0x1C, 2368 }, /* 0000 0001 1100 */
+ { 12, 0x1D, 2432 }, /* 0000 0001 1101 */
+ { 12, 0x1E, 2496 }, /* 0000 0001 1110 */
+ { 12, 0x1F, 2560 }, /* 0000 0001 1111 */
+ { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */
+ { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */
+ { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */
+ { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */
+ { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */
+};
+
+const tableentry TIFFFaxBlackCodes[] = {
+ { 10, 0x37, 0 }, /* 0000 1101 11 */
+ { 3, 0x2, 1 }, /* 010 */
+ { 2, 0x3, 2 }, /* 11 */
+ { 2, 0x2, 3 }, /* 10 */
+ { 3, 0x3, 4 }, /* 011 */
+ { 4, 0x3, 5 }, /* 0011 */
+ { 4, 0x2, 6 }, /* 0010 */
+ { 5, 0x3, 7 }, /* 0001 1 */
+ { 6, 0x5, 8 }, /* 0001 01 */
+ { 6, 0x4, 9 }, /* 0001 00 */
+ { 7, 0x4, 10 }, /* 0000 100 */
+ { 7, 0x5, 11 }, /* 0000 101 */
+ { 7, 0x7, 12 }, /* 0000 111 */
+ { 8, 0x4, 13 }, /* 0000 0100 */
+ { 8, 0x7, 14 }, /* 0000 0111 */
+ { 9, 0x18, 15 }, /* 0000 1100 0 */
+ { 10, 0x17, 16 }, /* 0000 0101 11 */
+ { 10, 0x18, 17 }, /* 0000 0110 00 */
+ { 10, 0x8, 18 }, /* 0000 0010 00 */
+ { 11, 0x67, 19 }, /* 0000 1100 111 */
+ { 11, 0x68, 20 }, /* 0000 1101 000 */
+ { 11, 0x6C, 21 }, /* 0000 1101 100 */
+ { 11, 0x37, 22 }, /* 0000 0110 111 */
+ { 11, 0x28, 23 }, /* 0000 0101 000 */
+ { 11, 0x17, 24 }, /* 0000 0010 111 */
+ { 11, 0x18, 25 }, /* 0000 0011 000 */
+ { 12, 0xCA, 26 }, /* 0000 1100 1010 */
+ { 12, 0xCB, 27 }, /* 0000 1100 1011 */
+ { 12, 0xCC, 28 }, /* 0000 1100 1100 */
+ { 12, 0xCD, 29 }, /* 0000 1100 1101 */
+ { 12, 0x68, 30 }, /* 0000 0110 1000 */
+ { 12, 0x69, 31 }, /* 0000 0110 1001 */
+ { 12, 0x6A, 32 }, /* 0000 0110 1010 */
+ { 12, 0x6B, 33 }, /* 0000 0110 1011 */
+ { 12, 0xD2, 34 }, /* 0000 1101 0010 */
+ { 12, 0xD3, 35 }, /* 0000 1101 0011 */
+ { 12, 0xD4, 36 }, /* 0000 1101 0100 */
+ { 12, 0xD5, 37 }, /* 0000 1101 0101 */
+ { 12, 0xD6, 38 }, /* 0000 1101 0110 */
+ { 12, 0xD7, 39 }, /* 0000 1101 0111 */
+ { 12, 0x6C, 40 }, /* 0000 0110 1100 */
+ { 12, 0x6D, 41 }, /* 0000 0110 1101 */
+ { 12, 0xDA, 42 }, /* 0000 1101 1010 */
+ { 12, 0xDB, 43 }, /* 0000 1101 1011 */
+ { 12, 0x54, 44 }, /* 0000 0101 0100 */
+ { 12, 0x55, 45 }, /* 0000 0101 0101 */
+ { 12, 0x56, 46 }, /* 0000 0101 0110 */
+ { 12, 0x57, 47 }, /* 0000 0101 0111 */
+ { 12, 0x64, 48 }, /* 0000 0110 0100 */
+ { 12, 0x65, 49 }, /* 0000 0110 0101 */
+ { 12, 0x52, 50 }, /* 0000 0101 0010 */
+ { 12, 0x53, 51 }, /* 0000 0101 0011 */
+ { 12, 0x24, 52 }, /* 0000 0010 0100 */
+ { 12, 0x37, 53 }, /* 0000 0011 0111 */
+ { 12, 0x38, 54 }, /* 0000 0011 1000 */
+ { 12, 0x27, 55 }, /* 0000 0010 0111 */
+ { 12, 0x28, 56 }, /* 0000 0010 1000 */
+ { 12, 0x58, 57 }, /* 0000 0101 1000 */
+ { 12, 0x59, 58 }, /* 0000 0101 1001 */
+ { 12, 0x2B, 59 }, /* 0000 0010 1011 */
+ { 12, 0x2C, 60 }, /* 0000 0010 1100 */
+ { 12, 0x5A, 61 }, /* 0000 0101 1010 */
+ { 12, 0x66, 62 }, /* 0000 0110 0110 */
+ { 12, 0x67, 63 }, /* 0000 0110 0111 */
+ { 10, 0xF, 64 }, /* 0000 0011 11 */
+ { 12, 0xC8, 128 }, /* 0000 1100 1000 */
+ { 12, 0xC9, 192 }, /* 0000 1100 1001 */
+ { 12, 0x5B, 256 }, /* 0000 0101 1011 */
+ { 12, 0x33, 320 }, /* 0000 0011 0011 */
+ { 12, 0x34, 384 }, /* 0000 0011 0100 */
+ { 12, 0x35, 448 }, /* 0000 0011 0101 */
+ { 13, 0x6C, 512 }, /* 0000 0011 0110 0 */
+ { 13, 0x6D, 576 }, /* 0000 0011 0110 1 */
+ { 13, 0x4A, 640 }, /* 0000 0010 0101 0 */
+ { 13, 0x4B, 704 }, /* 0000 0010 0101 1 */
+ { 13, 0x4C, 768 }, /* 0000 0010 0110 0 */
+ { 13, 0x4D, 832 }, /* 0000 0010 0110 1 */
+ { 13, 0x72, 896 }, /* 0000 0011 1001 0 */
+ { 13, 0x73, 960 }, /* 0000 0011 1001 1 */
+ { 13, 0x74, 1024 }, /* 0000 0011 1010 0 */
+ { 13, 0x75, 1088 }, /* 0000 0011 1010 1 */
+ { 13, 0x76, 1152 }, /* 0000 0011 1011 0 */
+ { 13, 0x77, 1216 }, /* 0000 0011 1011 1 */
+ { 13, 0x52, 1280 }, /* 0000 0010 1001 0 */
+ { 13, 0x53, 1344 }, /* 0000 0010 1001 1 */
+ { 13, 0x54, 1408 }, /* 0000 0010 1010 0 */
+ { 13, 0x55, 1472 }, /* 0000 0010 1010 1 */
+ { 13, 0x5A, 1536 }, /* 0000 0010 1101 0 */
+ { 13, 0x5B, 1600 }, /* 0000 0010 1101 1 */
+ { 13, 0x64, 1664 }, /* 0000 0011 0010 0 */
+ { 13, 0x65, 1728 }, /* 0000 0011 0010 1 */
+ { 11, 0x8, 1792 }, /* 0000 0001 000 */
+ { 11, 0xC, 1856 }, /* 0000 0001 100 */
+ { 11, 0xD, 1920 }, /* 0000 0001 101 */
+ { 12, 0x12, 1984 }, /* 0000 0001 0010 */
+ { 12, 0x13, 2048 }, /* 0000 0001 0011 */
+ { 12, 0x14, 2112 }, /* 0000 0001 0100 */
+ { 12, 0x15, 2176 }, /* 0000 0001 0101 */
+ { 12, 0x16, 2240 }, /* 0000 0001 0110 */
+ { 12, 0x17, 2304 }, /* 0000 0001 0111 */
+ { 12, 0x1C, 2368 }, /* 0000 0001 1100 */
+ { 12, 0x1D, 2432 }, /* 0000 0001 1101 */
+ { 12, 0x1E, 2496 }, /* 0000 0001 1110 */
+ { 12, 0x1F, 2560 }, /* 0000 0001 1111 */
+ { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */
+ { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */
+ { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */
+ { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */
+ { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */
+};
+#else
+extern const tableentry TIFFFaxWhiteCodes[];
+extern const tableentry TIFFFaxBlackCodes[];
+#endif
+#endif /* _T4_ */
diff --git a/src/tiff/tif_aux.c b/src/tiff/tif_aux.c
new file mode 100644
index 0000000..8e8fecf
--- /dev/null
+++ b/src/tiff/tif_aux.c
@@ -0,0 +1,218 @@
+/* $Header: /home/terralib/src/tiff/tif_aux.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1991-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Auxiliary Support Routines.
+ */
+#include "tiffiop.h"
+#include "tif_predict.h"
+#include <math.h>
+
+static void
+TIFFDefaultTransferFunction(TIFFDirectory* td)
+{
+ uint16 **tf = td->td_transferfunction;
+ long i, n = 1<<td->td_bitspersample;
+
+ tf[0] = (uint16 *)_TIFFmalloc(n * sizeof (uint16));
+ tf[0][0] = 0;
+ for (i = 1; i < n; i++) {
+ double t = (double)i/((double) n-1.);
+ tf[0][i] = (uint16)floor(65535.*pow(t, 2.2) + .5);
+ }
+ if (td->td_samplesperpixel - td->td_extrasamples > 1) {
+ tf[1] = (uint16 *)_TIFFmalloc(n * sizeof (uint16));
+ _TIFFmemcpy(tf[1], tf[0], n * sizeof (uint16));
+ tf[2] = (uint16 *)_TIFFmalloc(n * sizeof (uint16));
+ _TIFFmemcpy(tf[2], tf[0], n * sizeof (uint16));
+ }
+}
+
+static void
+TIFFDefaultRefBlackWhite(TIFFDirectory* td)
+{
+ int i;
+
+ td->td_refblackwhite = (float *)_TIFFmalloc(6*sizeof (float));
+ for (i = 0; i < 3; i++) {
+ td->td_refblackwhite[2*i+0] = 0;
+ td->td_refblackwhite[2*i+1] = (float)((1L<<td->td_bitspersample)-1L);
+ }
+}
+
+/*
+ * Like TIFFGetField, but return any default
+ * value if the tag is not present in the directory.
+ *
+ * NB: We use the value in the directory, rather than
+ * explcit values so that defaults exist only one
+ * place in the library -- in TIFFDefaultDirectory.
+ */
+int
+TIFFVGetFieldDefaulted(TIFF* tif, ttag_t tag, va_list ap)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if (TIFFVGetField(tif, tag, ap))
+ return (1);
+ switch (tag) {
+ case TIFFTAG_SUBFILETYPE:
+ *va_arg(ap, uint32 *) = td->td_subfiletype;
+ return (1);
+ case TIFFTAG_BITSPERSAMPLE:
+ *va_arg(ap, uint16 *) = td->td_bitspersample;
+ return (1);
+ case TIFFTAG_THRESHHOLDING:
+ *va_arg(ap, uint16 *) = td->td_threshholding;
+ return (1);
+ case TIFFTAG_FILLORDER:
+ *va_arg(ap, uint16 *) = td->td_fillorder;
+ return (1);
+ case TIFFTAG_ORIENTATION:
+ *va_arg(ap, uint16 *) = td->td_orientation;
+ return (1);
+ case TIFFTAG_SAMPLESPERPIXEL:
+ *va_arg(ap, uint16 *) = td->td_samplesperpixel;
+ return (1);
+ case TIFFTAG_ROWSPERSTRIP:
+ *va_arg(ap, uint32 *) = td->td_rowsperstrip;
+ return (1);
+ case TIFFTAG_MINSAMPLEVALUE:
+ *va_arg(ap, uint16 *) = td->td_minsamplevalue;
+ return (1);
+ case TIFFTAG_MAXSAMPLEVALUE:
+ *va_arg(ap, uint16 *) = td->td_maxsamplevalue;
+ return (1);
+ case TIFFTAG_PLANARCONFIG:
+ *va_arg(ap, uint16 *) = td->td_planarconfig;
+ return (1);
+ case TIFFTAG_RESOLUTIONUNIT:
+ *va_arg(ap, uint16 *) = td->td_resolutionunit;
+ return (1);
+ case TIFFTAG_PREDICTOR:
+ {
+ TIFFPredictorState* sp = (TIFFPredictorState*) tif->tif_data;
+ *va_arg(ap, uint16*) = (uint16) sp->predictor;
+ return (1);
+ }
+ case TIFFTAG_DOTRANGE:
+ *va_arg(ap, uint16 *) = 0;
+ *va_arg(ap, uint16 *) = (1<<td->td_bitspersample)-1;
+ return (1);
+ case TIFFTAG_INKSET:
+ *va_arg(ap, uint16 *) = td->td_inkset;
+ return (1);
+ case TIFFTAG_NUMBEROFINKS:
+ *va_arg(ap, uint16 *) = td->td_ninks;
+ return (1);
+ case TIFFTAG_EXTRASAMPLES:
+ *va_arg(ap, uint16 *) = td->td_extrasamples;
+ *va_arg(ap, uint16 **) = td->td_sampleinfo;
+ return (1);
+ case TIFFTAG_MATTEING:
+ *va_arg(ap, uint16 *) =
+ (td->td_extrasamples == 1 &&
+ td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
+ return (1);
+ case TIFFTAG_TILEDEPTH:
+ *va_arg(ap, uint32 *) = td->td_tiledepth;
+ return (1);
+ case TIFFTAG_DATATYPE:
+ *va_arg(ap, uint16 *) = td->td_sampleformat-1;
+ return (1);
+ case TIFFTAG_SAMPLEFORMAT:
+ *va_arg(ap, uint16 *) = td->td_sampleformat;
+ return(1);
+ case TIFFTAG_IMAGEDEPTH:
+ *va_arg(ap, uint32 *) = td->td_imagedepth;
+ return (1);
+ case TIFFTAG_YCBCRCOEFFICIENTS:
+ if (!td->td_ycbcrcoeffs) {
+ td->td_ycbcrcoeffs = (float *)
+ _TIFFmalloc(3*sizeof (float));
+ /* defaults are from CCIR Recommendation 601-1 */
+ td->td_ycbcrcoeffs[0] = 0.299f;
+ td->td_ycbcrcoeffs[1] = 0.587f;
+ td->td_ycbcrcoeffs[2] = 0.114f;
+ }
+ *va_arg(ap, float **) = td->td_ycbcrcoeffs;
+ return (1);
+ case TIFFTAG_YCBCRSUBSAMPLING:
+ *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[0];
+ *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[1];
+ return (1);
+ case TIFFTAG_YCBCRPOSITIONING:
+ *va_arg(ap, uint16 *) = td->td_ycbcrpositioning;
+ return (1);
+ case TIFFTAG_WHITEPOINT:
+ if (!td->td_whitepoint) {
+ td->td_whitepoint = (float *)
+ _TIFFmalloc(2 * sizeof (float));
+ /* TIFF 6.0 specification says that it is no default
+ value for the WhitePoint, but AdobePhotoshop TIFF
+ Technical Note tells that it should be CIE D50. */
+ td->td_whitepoint[0] =
+ D50_X0 / (D50_X0 + D50_Y0 + D50_Z0);
+ td->td_whitepoint[1] =
+ D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0);
+ }
+ *va_arg(ap, float **) = td->td_whitepoint;
+ return (1);
+ case TIFFTAG_TRANSFERFUNCTION:
+ if (!td->td_transferfunction[0])
+ TIFFDefaultTransferFunction(td);
+ *va_arg(ap, uint16 **) = td->td_transferfunction[0];
+ if (td->td_samplesperpixel - td->td_extrasamples > 1) {
+ *va_arg(ap, uint16 **) = td->td_transferfunction[1];
+ *va_arg(ap, uint16 **) = td->td_transferfunction[2];
+ }
+ return (1);
+ case TIFFTAG_REFERENCEBLACKWHITE:
+ if (!td->td_refblackwhite)
+ TIFFDefaultRefBlackWhite(td);
+ *va_arg(ap, float **) = td->td_refblackwhite;
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Like TIFFGetField, but return any default
+ * value if the tag is not present in the directory.
+ */
+int
+TIFFGetFieldDefaulted(TIFF* tif, ttag_t tag, ...)
+{
+ int ok;
+ va_list ap;
+
+ va_start(ap, tag);
+ ok = TIFFVGetFieldDefaulted(tif, tag, ap);
+ va_end(ap);
+ return (ok);
+}
diff --git a/src/tiff/tif_close.c b/src/tiff/tif_close.c
new file mode 100644
index 0000000..87acd32
--- /dev/null
+++ b/src/tiff/tif_close.c
@@ -0,0 +1,80 @@
+/* $Header: /home/terralib/src/tiff/tif_close.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ */
+#include "tiffiop.h"
+
+void
+TIFFClose(TIFF* tif)
+{
+ if (tif->tif_mode != O_RDONLY)
+ /*
+ * Flush buffered data and directory (if dirty).
+ */
+ TIFFFlush(tif);
+ (*tif->tif_cleanup)(tif);
+ TIFFFreeDirectory(tif);
+
+ if (tif->tif_dirlist)
+ _TIFFfree(tif->tif_dirlist);
+
+ /* Clean up client info links */
+ while( tif->tif_clientinfo )
+ {
+ TIFFClientInfoLink *link = tif->tif_clientinfo;
+
+ tif->tif_clientinfo = link->next;
+ _TIFFfree( link->name );
+ _TIFFfree( link );
+ }
+
+ if (tif->tif_rawdata && (tif->tif_flags&TIFF_MYBUFFER))
+ _TIFFfree(tif->tif_rawdata);
+ if (isMapped(tif))
+ TIFFUnmapFileContents(tif, tif->tif_base, tif->tif_size);
+ (void) TIFFCloseFile(tif);
+ if (tif->tif_nfields > 0)
+ {
+ int i;
+
+ for (i = 0; i < tif->tif_nfields; i++)
+ {
+ TIFFFieldInfo *fld = tif->tif_fieldinfo[i];
+ if (fld->field_bit == FIELD_CUSTOM &&
+ strncmp("Tag ", fld->field_name, 4) == 0)
+ {
+ _TIFFfree(fld->field_name);
+ _TIFFfree(fld);
+ }
+ }
+
+ _TIFFfree(tif->tif_fieldinfo);
+ }
+
+ _TIFFfree(tif);
+}
diff --git a/src/tiff/tif_codec.c b/src/tiff/tif_codec.c
new file mode 100644
index 0000000..3486d93
--- /dev/null
+++ b/src/tiff/tif_codec.c
@@ -0,0 +1,150 @@
+/* $Header: /home/terralib/src/tiff/tif_codec.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library
+ *
+ * Builtin Compression Scheme Configuration Support.
+ */
+#include "tiffiop.h"
+
+static int NotConfigured(TIFF*, int);
+
+#ifndef LZW_SUPPORT
+#define TIFFInitLZW NotConfigured
+#endif
+#ifndef PACKBITS_SUPPORT
+#define TIFFInitPackbits NotConfigured
+#endif
+#ifndef THUNDER_SUPPORT
+#define TIFFInitThunderScan NotConfigured
+#endif
+#ifndef NEXT_SUPPORT
+#define TIFFInitNeXT NotConfigured
+#endif
+#ifndef JPEG_SUPPORT
+#define TIFFInitJPEG NotConfigured
+#endif
+#ifndef OJPEG_SUPPORT
+#define TIFFInitOJPEG NotConfigured
+#endif
+#ifndef CCITT_SUPPORT
+#define TIFFInitCCITTRLE NotConfigured
+#define TIFFInitCCITTRLEW NotConfigured
+#define TIFFInitCCITTFax3 NotConfigured
+#define TIFFInitCCITTFax4 NotConfigured
+#endif
+#ifndef JBIG_SUPPORT
+#define TIFFInitJBIG NotConfigured
+#endif
+#ifndef ZIP_SUPPORT
+#define TIFFInitZIP NotConfigured
+#endif
+#ifndef PIXARLOG_SUPPORT
+#define TIFFInitPixarLog NotConfigured
+#endif
+#ifndef LOGLUV_SUPPORT
+#define TIFFInitSGILog NotConfigured
+#endif
+
+/*
+ * Compression schemes statically built into the library.
+ */
+#ifdef VMS
+const TIFFCodec _TIFFBuiltinCODECS[] = {
+#else
+TIFFCodec _TIFFBuiltinCODECS[] = {
+#endif
+ { "None", COMPRESSION_NONE, TIFFInitDumpMode },
+ { "LZW", COMPRESSION_LZW, TIFFInitLZW },
+ { "PackBits", COMPRESSION_PACKBITS, TIFFInitPackBits },
+ { "ThunderScan", COMPRESSION_THUNDERSCAN,TIFFInitThunderScan },
+ { "NeXT", COMPRESSION_NEXT, TIFFInitNeXT },
+ { "JPEG", COMPRESSION_JPEG, TIFFInitJPEG },
+ { "Old-style JPEG", COMPRESSION_OJPEG, TIFFInitOJPEG },
+ { "CCITT RLE", COMPRESSION_CCITTRLE, TIFFInitCCITTRLE },
+ { "CCITT RLE/W", COMPRESSION_CCITTRLEW, TIFFInitCCITTRLEW },
+ { "CCITT Group 3", COMPRESSION_CCITTFAX3, TIFFInitCCITTFax3 },
+ { "CCITT Group 4", COMPRESSION_CCITTFAX4, TIFFInitCCITTFax4 },
+ { "ISO JBIG", COMPRESSION_JBIG, TIFFInitJBIG },
+ { "Deflate", COMPRESSION_DEFLATE, TIFFInitZIP },
+ { "AdobeDeflate", COMPRESSION_ADOBE_DEFLATE , TIFFInitZIP },
+ { "PixarLog", COMPRESSION_PIXARLOG, TIFFInitPixarLog },
+ { "SGILog", COMPRESSION_SGILOG, TIFFInitSGILog },
+ { "SGILog24", COMPRESSION_SGILOG24, TIFFInitSGILog },
+ { NULL }
+};
+
+static int
+_notConfigured(TIFF* tif)
+{
+ const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
+
+ TIFFError(tif->tif_name,
+ "%s compression support is not configured", c->name);
+ return (0);
+}
+
+static int
+NotConfigured(TIFF* tif, int scheme)
+{
+ (void) scheme;
+
+ tif->tif_decodestatus = FALSE;
+ tif->tif_setupdecode = _notConfigured;
+ tif->tif_encodestatus = FALSE;
+ tif->tif_setupencode = _notConfigured;
+ return (1);
+}
+
+/************************************************************************/
+/* TIFFIsCODECConfigured() */
+/************************************************************************/
+
+/**
+ * Check whether we have working codec for the specific coding scheme.
+ *
+ * @return returns 1 if the codec is configured and working. Otherwise
+ * 0 will be returned.
+ */
+
+int
+TIFFIsCODECConfigured(uint16 scheme)
+{
+ const TIFFCodec* codec = TIFFFindCODEC(scheme);
+
+ if(codec == NULL) {
+ return 0;
+ }
+ if(codec->init == NULL) {
+ return 0;
+ }
+ if(codec->init != NotConfigured){
+ return 1;
+ }
+ return 0;
+}
+
diff --git a/src/tiff/tif_color.c b/src/tiff/tif_color.c
new file mode 100644
index 0000000..c4d85bb
--- /dev/null
+++ b/src/tiff/tif_color.c
@@ -0,0 +1,268 @@
+/* $Header: /home/terralib/src/tiff/tif_color.c,v 1.1 2004/04/12 13:48:53 juan Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * CIE L*a*b* to CIE XYZ and CIE XYZ to RGB conversion routines are taken
+ * from the VIPS library (http://www.vips.ecs.soton.ac.uk) with
+ * the permission of John Cupitt, the VIPS author.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Color space conversion routines.
+ */
+
+#include "tiffiop.h"
+#include <math.h>
+
+/*
+ * Convert color value from the CIE L*a*b* 1976 space to CIE XYZ.
+ */
+void
+TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32 l, int32 a, int32 b,
+ float *X, float *Y, float *Z)
+{
+ float L = (float)l * 100.0F / 255.0F;
+ float cby, tmp;
+
+ if( L < 8.856F ) {
+ *Y = (L * cielab->Y0) / 903.292F;
+ cby = 7.787F * (*Y / cielab->Y0) + 16.0F / 116.0F;
+ } else {
+ cby = (L + 16.0F) / 116.0F;
+ *Y = cielab->Y0 * cby * cby * cby;
+ }
+
+ tmp = (float)a / 500.0F + cby;
+ if( tmp < 0.2069F )
+ *X = cielab->X0 * (tmp - 0.13793F) / 7.787F;
+ else
+ *X = cielab->X0 * tmp * tmp * tmp;
+
+ tmp = cby - (float)b / 200.0F;
+ if( tmp < 0.2069F )
+ *Z = cielab->Z0 * (tmp - 0.13793F) / 7.787F;
+ else
+ *Z = cielab->Z0 * tmp * tmp * tmp;
+}
+
+#define RINT(R) ((uint32)((R)>0?((R)+0.5):((R)-0.5)))
+/*
+ * Convert color value from the XYZ space to RGB.
+ */
+void
+TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z,
+ uint32 *r, uint32 *g, uint32 *b)
+{
+ int i;
+ float Yr, Yg, Yb;
+ float *matrix = &cielab->display.d_mat[0][0];
+
+ /* Multiply through the matrix to get luminosity values. */
+ Yr = matrix[0] * X + matrix[1] * Y + matrix[2] * Z;
+ Yg = matrix[3] * X + matrix[4] * Y + matrix[5] * Z;
+ Yb = matrix[6] * X + matrix[7] * Y + matrix[8] * Z;
+
+ /* Clip input */
+ Yr = TIFFmax( Yr, cielab->display.d_Y0R );
+ Yg = TIFFmax( Yg, cielab->display.d_Y0G );
+ Yb = TIFFmax( Yb, cielab->display.d_Y0B );
+
+ /* Turn luminosity to colour value. */
+ i = TIFFmin(cielab->range,
+ (int)((Yr - cielab->display.d_Y0R) / cielab->rstep));
+ *r = RINT(cielab->Yr2r[i]);
+
+ i = TIFFmin(cielab->range,
+ (int)((Yg - cielab->display.d_Y0G) / cielab->gstep));
+ *g = RINT(cielab->Yg2g[i]);
+
+ i = TIFFmin(cielab->range,
+ (int)((Yb - cielab->display.d_Y0B) / cielab->bstep));
+ *b = RINT(cielab->Yb2b[i]);
+
+ /* Clip output. */
+ *r = TIFFmin( *r, cielab->display.d_Vrwr );
+ *g = TIFFmin( *g, cielab->display.d_Vrwg );
+ *b = TIFFmin( *b, cielab->display.d_Vrwb );
+}
+#undef RINT
+
+/*
+ * Allocate conversion state structures and make look_up tables for
+ * the Yr,Yb,Yg <=> r,g,b conversions.
+ */
+int
+TIFFCIELabToRGBInit(TIFFCIELabToRGB* cielab,
+ TIFFDisplay *display, float *refWhite)
+{
+ int i;
+ float gamma;
+
+ cielab->range = CIELABTORGB_TABLE_RANGE;
+
+ _TIFFmemcpy(&cielab->display, display, sizeof(TIFFDisplay));
+
+ /* Red */
+ gamma = 1.0F / cielab->display.d_gammaR ;
+ cielab->rstep =
+ (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
+ for(i = 0; i <= cielab->range; i++) {
+ cielab->Yr2r[i] = cielab->display.d_Vrwr
+ * ((float)pow((double)i / cielab->range, gamma));
+ }
+
+ /* Green */
+ gamma = 1.0F / cielab->display.d_gammaG ;
+ cielab->gstep =
+ (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
+ for(i = 0; i <= cielab->range; i++) {
+ cielab->Yg2g[i] = cielab->display.d_Vrwg
+ * ((float)pow((double)i / cielab->range, gamma));
+ }
+
+ /* Blue */
+ gamma = 1.0F / cielab->display.d_gammaB ;
+ cielab->bstep =
+ (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
+ for(i = 0; i <= cielab->range; i++) {
+ cielab->Yb2b[i] = cielab->display.d_Vrwb
+ * ((float)pow((double)i / cielab->range, gamma));
+ }
+
+ /* Init reference white point */
+ cielab->X0 = refWhite[0];
+ cielab->Y0 = refWhite[1];
+ cielab->Z0 = refWhite[2];
+
+ return 0;
+}
+
+/*
+ * Convert color value from the YCbCr space to CIE XYZ.
+ * The colorspace conversion algorithm comes from the IJG v5a code;
+ * see below for more information on how it works.
+ */
+#define SHIFT 16
+#define FIX(x) ((int32)((x) * (1L<<SHIFT) + 0.5))
+#define ONE_HALF ((int32)(1<<(SHIFT-1)))
+#define Code2V(c, RB, RW, CR) ((((c)-(int32)(RB))*(float)(CR))/(float)((RW)-(RB)))
+#define CLAMP(f,min,max) ((f)<(min)?(min):(f)>(max)?(max):(f))
+
+void
+TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32 Y, int32 Cb, int32 Cr,
+ uint32 *r, uint32 *g, uint32 *b)
+{
+ /* XXX: Only 8-bit YCbCr input supported for now */
+ Y = CLAMP(Y, 0, 255), Cb = CLAMP(Cb, 0, 255), Cr = CLAMP(Cr, 0, 255);
+
+ *r = ycbcr->clamptab[ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr]];
+ *g = ycbcr->clamptab[ycbcr->Y_tab[Y]
+ + (int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT)];
+ *b = ycbcr->clamptab[ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb]];
+}
+
+/*
+ * Initialize the YCbCr->RGB conversion tables. The conversion
+ * is done according to the 6.0 spec:
+ *
+ * R = Y + Cr*(2 - 2*LumaRed)
+ * B = Y + Cb*(2 - 2*LumaBlue)
+ * G = Y
+ * - LumaBlue*Cb*(2-2*LumaBlue)/LumaGreen
+ * - LumaRed*Cr*(2-2*LumaRed)/LumaGreen
+ *
+ * To avoid floating point arithmetic the fractional constants that
+ * come out of the equations are represented as fixed point values
+ * in the range 0...2^16. We also eliminate multiplications by
+ * pre-calculating possible values indexed by Cb and Cr (this code
+ * assumes conversion is being done for 8-bit samples).
+ */
+int
+TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite)
+{
+ TIFFRGBValue* clamptab;
+ int i;
+
+#define LumaRed luma[0]
+#define LumaGreen luma[1]
+#define LumaBlue luma[2]
+
+ clamptab = (TIFFRGBValue*)(
+ (tidata_t) ycbcr+TIFFroundup(sizeof (TIFFYCbCrToRGB), sizeof (long)));
+ _TIFFmemset(clamptab, 0, 256); /* v < 0 => 0 */
+ ycbcr->clamptab = (clamptab += 256);
+ for (i = 0; i < 256; i++)
+ clamptab[i] = (TIFFRGBValue) i;
+ _TIFFmemset(clamptab+256, 255, 2*256); /* v > 255 => 255 */
+ ycbcr->Cr_r_tab = (int*) (clamptab + 3*256);
+ ycbcr->Cb_b_tab = ycbcr->Cr_r_tab + 256;
+ ycbcr->Cr_g_tab = (int32*) (ycbcr->Cb_b_tab + 256);
+ ycbcr->Cb_g_tab = ycbcr->Cr_g_tab + 256;
+ ycbcr->Y_tab = ycbcr->Cb_g_tab + 256;
+
+ { float f1 = 2-2*LumaRed; int32 D1 = FIX(f1);
+ float f2 = LumaRed*f1/LumaGreen; int32 D2 = -FIX(f2);
+ float f3 = 2-2*LumaBlue; int32 D3 = FIX(f3);
+ float f4 = LumaBlue*f3/LumaGreen; int32 D4 = -FIX(f4);
+ int x;
+
+#undef LumaBlue
+#undef LumaGreen
+#undef LumaRed
+
+ /*
+ * i is the actual input pixel value in the range 0..255
+ * Cb and Cr values are in the range -128..127 (actually
+ * they are in a range defined by the ReferenceBlackWhite
+ * tag) so there is some range shifting to do here when
+ * constructing tables indexed by the raw pixel data.
+ */
+ for (i = 0, x = -128; i < 256; i++, x++) {
+ int32 Cr = (int32)Code2V(x, refBlackWhite[4] - 128.0F,
+ refBlackWhite[5] - 128.0F, 127);
+ int32 Cb = (int32)Code2V(x, refBlackWhite[2] - 128.0F,
+ refBlackWhite[3] - 128.0F, 127);
+
+ ycbcr->Cr_r_tab[i] = (int32)((D1*Cr + ONE_HALF)>>SHIFT);
+ ycbcr->Cb_b_tab[i] = (int32)((D3*Cb + ONE_HALF)>>SHIFT);
+ ycbcr->Cr_g_tab[i] = D2*Cr;
+ ycbcr->Cb_g_tab[i] = D4*Cb + ONE_HALF;
+ ycbcr->Y_tab[i] =
+ (int32)Code2V(x + 128, refBlackWhite[0], refBlackWhite[1], 255);
+ }
+ }
+
+ return 0;
+}
+#undef CLAMP
+#undef Code2V
+#undef SHIFT
+#undef ONE_HALF
+#undef FIX
+
+
diff --git a/src/tiff/tif_compress.c b/src/tiff/tif_compress.c
new file mode 100644
index 0000000..d3c2379
--- /dev/null
+++ b/src/tiff/tif_compress.c
@@ -0,0 +1,233 @@
+/* $Header: /home/terralib/src/tiff/tif_compress.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library
+ *
+ * Compression Scheme Configuration Support.
+ */
+#include "tiffiop.h"
+
+static int
+TIFFNoEncode(TIFF* tif, char* method)
+{
+ const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
+
+ if (c) {
+ if (! strncmp(c->name, "LZW", 3) ){
+ TIFFError(tif->tif_name,
+ "%s %s encoding is no longer implemented due to Unisys patent enforcement",
+ c->name, method);
+ } else {
+ TIFFError(tif->tif_name, "%s %s encoding is not implemented",
+ c->name, method);
+ }
+ }
+ else {
+ TIFFError(tif->tif_name,
+ "Compression scheme %u %s encoding is not implemented",
+ tif->tif_dir.td_compression, method);
+ }
+ return (-1);
+}
+
+int
+_TIFFNoRowEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+ (void) pp; (void) cc; (void) s;
+ return (TIFFNoEncode(tif, "scanline"));
+}
+
+int
+_TIFFNoStripEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+ (void) pp; (void) cc; (void) s;
+ return (TIFFNoEncode(tif, "strip"));
+}
+
+int
+_TIFFNoTileEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+ (void) pp; (void) cc; (void) s;
+ return (TIFFNoEncode(tif, "tile"));
+}
+
+static int
+TIFFNoDecode(TIFF* tif, char* method)
+{
+ const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
+
+ if (c)
+ TIFFError(tif->tif_name, "%s %s decoding is not implemented",
+ c->name, method);
+ else
+ TIFFError(tif->tif_name,
+ "Compression scheme %u %s decoding is not implemented",
+ tif->tif_dir.td_compression, method);
+ return (-1);
+}
+
+int
+_TIFFNoRowDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+ (void) pp; (void) cc; (void) s;
+ return (TIFFNoDecode(tif, "scanline"));
+}
+
+int
+_TIFFNoStripDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+ (void) pp; (void) cc; (void) s;
+ return (TIFFNoDecode(tif, "strip"));
+}
+
+int
+_TIFFNoTileDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+ (void) pp; (void) cc; (void) s;
+ return (TIFFNoDecode(tif, "tile"));
+}
+
+int
+_TIFFNoSeek(TIFF* tif, uint32 off)
+{
+ (void) off;
+ TIFFError(tif->tif_name,
+ "Compression algorithm does not support random access");
+ return (0);
+}
+
+int
+_TIFFNoPreCode(TIFF* tif, tsample_t s)
+{
+ (void) tif; (void) s;
+ return (1);
+}
+
+static int _TIFFtrue(TIFF* tif) { (void) tif; return (1); }
+static void _TIFFvoid(TIFF* tif) { (void) tif; }
+
+void
+_TIFFSetDefaultCompressionState(TIFF* tif)
+{
+ tif->tif_decodestatus = TRUE;
+ tif->tif_setupdecode = _TIFFtrue;
+ tif->tif_predecode = _TIFFNoPreCode;
+ tif->tif_decoderow = _TIFFNoRowDecode;
+ tif->tif_decodestrip = _TIFFNoStripDecode;
+ tif->tif_decodetile = _TIFFNoTileDecode;
+ tif->tif_encodestatus = TRUE;
+ tif->tif_setupencode = _TIFFtrue;
+ tif->tif_preencode = _TIFFNoPreCode;
+ tif->tif_postencode = _TIFFtrue;
+ tif->tif_encoderow = _TIFFNoRowEncode;
+ tif->tif_encodestrip = _TIFFNoStripEncode;
+ tif->tif_encodetile = _TIFFNoTileEncode;
+ tif->tif_close = _TIFFvoid;
+ tif->tif_seek = _TIFFNoSeek;
+ tif->tif_cleanup = _TIFFvoid;
+ tif->tif_defstripsize = _TIFFDefaultStripSize;
+ tif->tif_deftilesize = _TIFFDefaultTileSize;
+ tif->tif_flags &= ~TIFF_NOBITREV;
+}
+
+int
+TIFFSetCompressionScheme(TIFF* tif, int scheme)
+{
+ const TIFFCodec *c = TIFFFindCODEC((uint16) scheme);
+
+ _TIFFSetDefaultCompressionState(tif);
+ /*
+ * Don't treat an unknown compression scheme as an error.
+ * This permits applications to open files with data that
+ * the library does not have builtin support for, but which
+ * may still be meaningful.
+ */
+ return (c ? (*c->init)(tif, scheme) : 1);
+}
+
+/*
+ * Other compression schemes may be registered. Registered
+ * schemes can also override the builtin versions provided
+ * by this library.
+ */
+typedef struct _codec {
+ struct _codec* next;
+ TIFFCodec* info;
+} codec_t;
+static codec_t* registeredCODECS = NULL;
+
+const TIFFCodec*
+TIFFFindCODEC(uint16 scheme)
+{
+ const TIFFCodec* c;
+ codec_t* cd;
+
+ for (cd = registeredCODECS; cd; cd = cd->next)
+ if (cd->info->scheme == scheme)
+ return ((const TIFFCodec*) cd->info);
+ for (c = _TIFFBuiltinCODECS; c->name; c++)
+ if (c->scheme == scheme)
+ return (c);
+ return ((const TIFFCodec*) 0);
+}
+
+TIFFCodec*
+TIFFRegisterCODEC(uint16 scheme, const char* name, TIFFInitMethod init)
+{
+ codec_t* cd = (codec_t*)
+ _TIFFmalloc(sizeof (codec_t) + sizeof (TIFFCodec) + strlen(name)+1);
+
+ if (cd != NULL) {
+ cd->info = (TIFFCodec*) ((tidata_t) cd + sizeof (codec_t));
+ cd->info->name = (char*)
+ ((tidata_t) cd->info + sizeof (TIFFCodec));
+ strcpy(cd->info->name, name);
+ cd->info->scheme = scheme;
+ cd->info->init = init;
+ cd->next = registeredCODECS;
+ registeredCODECS = cd;
+ } else
+ TIFFError("TIFFRegisterCODEC",
+ "No space to register compression scheme %s", name);
+ return (cd->info);
+}
+
+void
+TIFFUnRegisterCODEC(TIFFCodec* c)
+{
+ codec_t* cd;
+ codec_t** pcd;
+
+ for (pcd = ®isteredCODECS; (cd = *pcd); pcd = &cd->next)
+ if (cd->info == c) {
+ *pcd = cd->next;
+ _TIFFfree(cd);
+ return;
+ }
+ TIFFError("TIFFUnRegisterCODEC",
+ "Cannot remove compression scheme %s; not registered", c->name);
+}
diff --git a/src/tiff/tif_dir.c b/src/tiff/tif_dir.c
new file mode 100644
index 0000000..44e6c2a
--- /dev/null
+++ b/src/tiff/tif_dir.c
@@ -0,0 +1,1419 @@
+/* $Header: /home/terralib/src/tiff/tif_dir.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Directory Tag Get & Set Routines.
+ * (and also some miscellaneous stuff)
+ */
+#include "tiffiop.h"
+
+/*
+ * These are used in the backwards compatibility code...
+ */
+#define DATATYPE_VOID 0 /* !untyped data */
+#define DATATYPE_INT 1 /* !signed integer data */
+#define DATATYPE_UINT 2 /* !unsigned integer data */
+#define DATATYPE_IEEEFP 3 /* !IEEE floating point data */
+
+void
+_TIFFsetByteArray(void** vpp, void* vp, long n)
+{
+ if (*vpp)
+ _TIFFfree(*vpp), *vpp = 0;
+ if (vp && (*vpp = (void*) _TIFFmalloc(n)))
+ _TIFFmemcpy(*vpp, vp, n);
+}
+void _TIFFsetString(char** cpp, char* cp)
+ { _TIFFsetByteArray((void**) cpp, (void*) cp, (long) (strlen(cp)+1)); }
+void _TIFFsetNString(char** cpp, char* cp, long n)
+ { _TIFFsetByteArray((void**) cpp, (void*) cp, n); }
+void _TIFFsetShortArray(uint16** wpp, uint16* wp, long n)
+ { _TIFFsetByteArray((void**) wpp, (void*) wp, n*sizeof (uint16)); }
+void _TIFFsetLongArray(uint32** lpp, uint32* lp, long n)
+ { _TIFFsetByteArray((void**) lpp, (void*) lp, n*sizeof (uint32)); }
+void _TIFFsetFloatArray(float** fpp, float* fp, long n)
+ { _TIFFsetByteArray((void**) fpp, (void*) fp, n*sizeof (float)); }
+void _TIFFsetDoubleArray(double** dpp, double* dp, long n)
+ { _TIFFsetByteArray((void**) dpp, (void*) dp, n*sizeof (double)); }
+
+/*
+ * Install extra samples information.
+ */
+static int
+setExtraSamples(TIFFDirectory* td, va_list ap, int* v)
+{
+ uint16* va;
+ int i;
+
+ *v = va_arg(ap, int);
+ if ((uint16) *v > td->td_samplesperpixel)
+ return (0);
+ va = va_arg(ap, uint16*);
+ if (*v > 0 && va == NULL) /* typically missing param */
+ return (0);
+ for (i = 0; i < *v; i++)
+ if (va[i] > EXTRASAMPLE_UNASSALPHA)
+ return (0);
+ td->td_extrasamples = (uint16) *v;
+ _TIFFsetShortArray(&td->td_sampleinfo, va, td->td_extrasamples);
+ return (1);
+}
+
+static int
+checkInkNamesString(TIFF* tif, int slen, const char* s)
+{
+ TIFFDirectory* td = &tif->tif_dir;
+ int i = td->td_samplesperpixel;
+
+ if (slen > 0) {
+ const char* ep = s+slen;
+ const char* cp = s;
+ for (; i > 0; i--) {
+ for (; *cp != '\0'; cp++)
+ if (cp >= ep)
+ goto bad;
+ cp++; /* skip \0 */
+ }
+ return (cp-s);
+ }
+bad:
+ TIFFError("TIFFSetField",
+ "%s: Invalid InkNames value; expecting %d names, found %d",
+ tif->tif_name,
+ td->td_samplesperpixel,
+ td->td_samplesperpixel-i);
+ return (0);
+}
+
+static int
+_TIFFVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ static const char module[] = "_TIFFVSetField";
+
+ TIFFDirectory* td = &tif->tif_dir;
+ int status = 1;
+ uint32 v32;
+ int i, v;
+ double d;
+ char* s;
+
+ switch (tag) {
+ case TIFFTAG_SUBFILETYPE:
+ td->td_subfiletype = va_arg(ap, uint32);
+ break;
+ case TIFFTAG_IMAGEWIDTH:
+ td->td_imagewidth = va_arg(ap, uint32);
+ break;
+ case TIFFTAG_IMAGELENGTH:
+ td->td_imagelength = va_arg(ap, uint32);
+ break;
+ case TIFFTAG_BITSPERSAMPLE:
+ td->td_bitspersample = (uint16) va_arg(ap, int);
+ /*
+ * If the data require post-decoding processing
+ * to byte-swap samples, set it up here. Note
+ * that since tags are required to be ordered,
+ * compression code can override this behaviour
+ * in the setup method if it wants to roll the
+ * post decoding work in with its normal work.
+ */
+ if (tif->tif_flags & TIFF_SWAB) {
+ if (td->td_bitspersample == 16)
+ tif->tif_postdecode = _TIFFSwab16BitData;
+ else if (td->td_bitspersample == 32)
+ tif->tif_postdecode = _TIFFSwab32BitData;
+ else if (td->td_bitspersample == 64)
+ tif->tif_postdecode = _TIFFSwab64BitData;
+ }
+ break;
+ case TIFFTAG_COMPRESSION:
+ v = va_arg(ap, int) & 0xffff;
+ /*
+ * If we're changing the compression scheme,
+ * the notify the previous module so that it
+ * can cleanup any state it's setup.
+ */
+ if (TIFFFieldSet(tif, FIELD_COMPRESSION)) {
+ if (td->td_compression == v)
+ break;
+ (*tif->tif_cleanup)(tif);
+ tif->tif_flags &= ~TIFF_CODERSETUP;
+ }
+ /*
+ * Setup new compression routine state.
+ */
+ if( (status = TIFFSetCompressionScheme(tif, v)) != 0 )
+ td->td_compression = (uint16) v;
+ else
+ status = 0;
+ break;
+ case TIFFTAG_PHOTOMETRIC:
+ td->td_photometric = (uint16) va_arg(ap, int);
+ break;
+ case TIFFTAG_THRESHHOLDING:
+ td->td_threshholding = (uint16) va_arg(ap, int);
+ break;
+ case TIFFTAG_FILLORDER:
+ v = va_arg(ap, int);
+ if (v != FILLORDER_LSB2MSB && v != FILLORDER_MSB2LSB)
+ goto badvalue;
+ td->td_fillorder = (uint16) v;
+ break;
+ case TIFFTAG_DOCUMENTNAME:
+ _TIFFsetString(&td->td_documentname, va_arg(ap, char*));
+ break;
+ case TIFFTAG_ARTIST:
+ _TIFFsetString(&td->td_artist, va_arg(ap, char*));
+ break;
+ case TIFFTAG_DATETIME:
+ _TIFFsetString(&td->td_datetime, va_arg(ap, char*));
+ break;
+ case TIFFTAG_HOSTCOMPUTER:
+ _TIFFsetString(&td->td_hostcomputer, va_arg(ap, char*));
+ break;
+ case TIFFTAG_IMAGEDESCRIPTION:
+ _TIFFsetString(&td->td_imagedescription, va_arg(ap, char*));
+ break;
+ case TIFFTAG_MAKE:
+ _TIFFsetString(&td->td_make, va_arg(ap, char*));
+ break;
+ case TIFFTAG_MODEL:
+ _TIFFsetString(&td->td_model, va_arg(ap, char*));
+ break;
+ case TIFFTAG_COPYRIGHT:
+ _TIFFsetString(&td->td_copyright, va_arg(ap, char*));
+ break;
+ case TIFFTAG_ORIENTATION:
+ v = va_arg(ap, int);
+ if (v < ORIENTATION_TOPLEFT || ORIENTATION_LEFTBOT < v) {
+ TIFFWarning(tif->tif_name,
+ "Bad value %ld for \"%s\" tag ignored",
+ v, _TIFFFieldWithTag(tif, tag)->field_name);
+ } else
+ td->td_orientation = (uint16) v;
+ break;
+ case TIFFTAG_SAMPLESPERPIXEL:
+ /* XXX should cross check -- e.g. if pallette, then 1 */
+ v = va_arg(ap, int);
+ if (v == 0)
+ goto badvalue;
+ td->td_samplesperpixel = (uint16) v;
+ break;
+ case TIFFTAG_ROWSPERSTRIP:
+ v32 = va_arg(ap, uint32);
+ if (v32 == 0)
+ goto badvalue32;
+ td->td_rowsperstrip = v32;
+ if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) {
+ td->td_tilelength = v32;
+ td->td_tilewidth = td->td_imagewidth;
+ }
+ break;
+ case TIFFTAG_MINSAMPLEVALUE:
+ td->td_minsamplevalue = (uint16) va_arg(ap, int);
+ break;
+ case TIFFTAG_MAXSAMPLEVALUE:
+ td->td_maxsamplevalue = (uint16) va_arg(ap, int);
+ break;
+ case TIFFTAG_SMINSAMPLEVALUE:
+ td->td_sminsamplevalue = (double) va_arg(ap, dblparam_t);
+ break;
+ case TIFFTAG_SMAXSAMPLEVALUE:
+ td->td_smaxsamplevalue = (double) va_arg(ap, dblparam_t);
+ break;
+ case TIFFTAG_XRESOLUTION:
+ td->td_xresolution = (float) va_arg(ap, dblparam_t);
+ break;
+ case TIFFTAG_YRESOLUTION:
+ td->td_yresolution = (float) va_arg(ap, dblparam_t);
+ break;
+ case TIFFTAG_PLANARCONFIG:
+ v = va_arg(ap, int);
+ if (v != PLANARCONFIG_CONTIG && v != PLANARCONFIG_SEPARATE)
+ goto badvalue;
+ td->td_planarconfig = (uint16) v;
+ break;
+ case TIFFTAG_PAGENAME:
+ _TIFFsetString(&td->td_pagename, va_arg(ap, char*));
+ break;
+ case TIFFTAG_XPOSITION:
+ td->td_xposition = (float) va_arg(ap, dblparam_t);
+ break;
+ case TIFFTAG_YPOSITION:
+ td->td_yposition = (float) va_arg(ap, dblparam_t);
+ break;
+ case TIFFTAG_RESOLUTIONUNIT:
+ v = va_arg(ap, int);
+ if (v < RESUNIT_NONE || RESUNIT_CENTIMETER < v)
+ goto badvalue;
+ td->td_resolutionunit = (uint16) v;
+ break;
+ case TIFFTAG_PAGENUMBER:
+ td->td_pagenumber[0] = (uint16) va_arg(ap, int);
+ td->td_pagenumber[1] = (uint16) va_arg(ap, int);
+ break;
+ case TIFFTAG_HALFTONEHINTS:
+ td->td_halftonehints[0] = (uint16) va_arg(ap, int);
+ td->td_halftonehints[1] = (uint16) va_arg(ap, int);
+ break;
+ case TIFFTAG_COLORMAP:
+ v32 = (uint32)(1L<<td->td_bitspersample);
+ _TIFFsetShortArray(&td->td_colormap[0], va_arg(ap, uint16*), v32);
+ _TIFFsetShortArray(&td->td_colormap[1], va_arg(ap, uint16*), v32);
+ _TIFFsetShortArray(&td->td_colormap[2], va_arg(ap, uint16*), v32);
+ break;
+ case TIFFTAG_EXTRASAMPLES:
+ if (!setExtraSamples(td, ap, &v))
+ goto badvalue;
+ break;
+ case TIFFTAG_MATTEING:
+ td->td_extrasamples = (uint16) (va_arg(ap, int) != 0);
+ if (td->td_extrasamples) {
+ uint16 sv = EXTRASAMPLE_ASSOCALPHA;
+ _TIFFsetShortArray(&td->td_sampleinfo, &sv, 1);
+ }
+ break;
+ case TIFFTAG_TILEWIDTH:
+ v32 = va_arg(ap, uint32);
+ if (v32 % 16) {
+ if (tif->tif_mode != O_RDONLY)
+ goto badvalue32;
+ TIFFWarning(tif->tif_name,
+ "Nonstandard tile width %d, convert file", v32);
+ }
+ td->td_tilewidth = v32;
+ tif->tif_flags |= TIFF_ISTILED;
+ break;
+ case TIFFTAG_TILELENGTH:
+ v32 = va_arg(ap, uint32);
+ if (v32 % 16) {
+ if (tif->tif_mode != O_RDONLY)
+ goto badvalue32;
+ TIFFWarning(tif->tif_name,
+ "Nonstandard tile length %d, convert file", v32);
+ }
+ td->td_tilelength = v32;
+ tif->tif_flags |= TIFF_ISTILED;
+ break;
+ case TIFFTAG_TILEDEPTH:
+ v32 = va_arg(ap, uint32);
+ if (v32 == 0)
+ goto badvalue32;
+ td->td_tiledepth = v32;
+ break;
+ case TIFFTAG_DATATYPE:
+ v = va_arg(ap, int);
+ switch (v) {
+ case DATATYPE_VOID: v = SAMPLEFORMAT_VOID; break;
+ case DATATYPE_INT: v = SAMPLEFORMAT_INT; break;
+ case DATATYPE_UINT: v = SAMPLEFORMAT_UINT; break;
+ case DATATYPE_IEEEFP: v = SAMPLEFORMAT_IEEEFP;break;
+ default: goto badvalue;
+ }
+ td->td_sampleformat = (uint16) v;
+ break;
+ case TIFFTAG_SAMPLEFORMAT:
+ v = va_arg(ap, int);
+ if (v < SAMPLEFORMAT_UINT || SAMPLEFORMAT_COMPLEXIEEEFP < v)
+ goto badvalue;
+ td->td_sampleformat = (uint16) v;
+
+ /* Try to fix up the SWAB function for complex data. */
+ if( td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT
+ && td->td_bitspersample == 32
+ && tif->tif_postdecode == _TIFFSwab32BitData )
+ tif->tif_postdecode = _TIFFSwab16BitData;
+ else if( (td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT
+ || td->td_sampleformat == SAMPLEFORMAT_COMPLEXIEEEFP)
+ && td->td_bitspersample == 64
+ && tif->tif_postdecode == _TIFFSwab64BitData )
+ tif->tif_postdecode = _TIFFSwab32BitData;
+ else if( td->td_sampleformat == SAMPLEFORMAT_COMPLEXIEEEFP
+ && td->td_bitspersample == 128
+ && tif->tif_postdecode == NULL )
+ tif->tif_postdecode = _TIFFSwab64BitData;
+ break;
+ case TIFFTAG_IMAGEDEPTH:
+ td->td_imagedepth = va_arg(ap, uint32);
+ break;
+ case TIFFTAG_STONITS:
+ d = va_arg(ap, dblparam_t);
+ if (d <= 0.)
+ goto badvaluedbl;
+ td->td_stonits = d;
+ break;
+ /* Begin Pixar Tags */
+ case TIFFTAG_PIXAR_IMAGEFULLWIDTH:
+ td->td_imagefullwidth = va_arg(ap, uint32);
+ break;
+ case TIFFTAG_PIXAR_IMAGEFULLLENGTH:
+ td->td_imagefulllength = va_arg(ap, uint32);
+ break;
+ case TIFFTAG_PIXAR_TEXTUREFORMAT:
+ _TIFFsetString(&td->td_textureformat, va_arg(ap, char*));
+ break;
+ case TIFFTAG_PIXAR_WRAPMODES:
+ _TIFFsetString(&td->td_wrapmodes, va_arg(ap, char*));
+ break;
+ case TIFFTAG_PIXAR_FOVCOT:
+ td->td_fovcot = (float) va_arg(ap, dblparam_t);
+ break;
+ case TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN:
+ _TIFFsetFloatArray(&td->td_matrixWorldToScreen,
+ va_arg(ap, float*), 16);
+ break;
+ case TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA:
+ _TIFFsetFloatArray(&td->td_matrixWorldToCamera,
+ va_arg(ap, float*), 16);
+ break;
+ /* End Pixar Tags */
+
+ case TIFFTAG_SUBIFD:
+ if ((tif->tif_flags & TIFF_INSUBIFD) == 0) {
+ td->td_nsubifd = (uint16) va_arg(ap, int);
+ _TIFFsetLongArray(&td->td_subifd, va_arg(ap, uint32*),
+ (long) td->td_nsubifd);
+ } else {
+ TIFFError(module, "%s: Sorry, cannot nest SubIFDs",
+ tif->tif_name);
+ status = 0;
+ }
+ break;
+ case TIFFTAG_YCBCRCOEFFICIENTS:
+ _TIFFsetFloatArray(&td->td_ycbcrcoeffs, va_arg(ap, float*), 3);
+ break;
+ case TIFFTAG_YCBCRPOSITIONING:
+ td->td_ycbcrpositioning = (uint16) va_arg(ap, int);
+ break;
+ case TIFFTAG_YCBCRSUBSAMPLING:
+ td->td_ycbcrsubsampling[0] = (uint16) va_arg(ap, int);
+ td->td_ycbcrsubsampling[1] = (uint16) va_arg(ap, int);
+ break;
+ case TIFFTAG_WHITEPOINT:
+ _TIFFsetFloatArray(&td->td_whitepoint, va_arg(ap, float*), 2);
+ break;
+ case TIFFTAG_PRIMARYCHROMATICITIES:
+ _TIFFsetFloatArray(&td->td_primarychromas, va_arg(ap, float*), 6);
+ break;
+ case TIFFTAG_TRANSFERFUNCTION:
+ v = (td->td_samplesperpixel - td->td_extrasamples) > 1 ? 3 : 1;
+ for (i = 0; i < v; i++)
+ _TIFFsetShortArray(&td->td_transferfunction[i],
+ va_arg(ap, uint16*), 1L<<td->td_bitspersample);
+ break;
+ case TIFFTAG_REFERENCEBLACKWHITE:
+ /* XXX should check for null range */
+ _TIFFsetFloatArray(&td->td_refblackwhite, va_arg(ap, float*), 6);
+ break;
+ case TIFFTAG_INKSET:
+ td->td_inkset = (uint16) va_arg(ap, int);
+ break;
+ case TIFFTAG_DOTRANGE:
+ /* XXX should check for null range */
+ td->td_dotrange[0] = (uint16) va_arg(ap, int);
+ td->td_dotrange[1] = (uint16) va_arg(ap, int);
+ break;
+ case TIFFTAG_INKNAMES:
+ i = va_arg(ap, int);
+ s = va_arg(ap, char*);
+ i = checkInkNamesString(tif, i, s);
+ status = i > 0;
+ if( i > 0 ) {
+ _TIFFsetNString(&td->td_inknames, s, i);
+ td->td_inknameslen = i;
+ }
+ break;
+ case TIFFTAG_NUMBEROFINKS:
+ td->td_ninks = (uint16) va_arg(ap, int);
+ break;
+ case TIFFTAG_TARGETPRINTER:
+ _TIFFsetString(&td->td_targetprinter, va_arg(ap, char*));
+ break;
+ case TIFFTAG_ICCPROFILE:
+ td->td_profileLength = (uint32) va_arg(ap, uint32);
+ _TIFFsetByteArray(&td->td_profileData, va_arg(ap, void*),
+ td->td_profileLength);
+ break;
+ case TIFFTAG_PHOTOSHOP:
+ td->td_photoshopLength = (uint32) va_arg(ap, uint32);
+ _TIFFsetByteArray (&td->td_photoshopData, va_arg(ap, void*),
+ td->td_photoshopLength);
+ break;
+ case TIFFTAG_RICHTIFFIPTC:
+ td->td_richtiffiptcLength = (uint32) va_arg(ap, uint32);
+ _TIFFsetLongArray ((uint32**)&td->td_richtiffiptcData,
+ va_arg(ap, uint32*),
+ td->td_richtiffiptcLength);
+ break;
+ case TIFFTAG_XMLPACKET:
+ td->td_xmlpacketLength = (uint32) va_arg(ap, uint32);
+ _TIFFsetByteArray(&td->td_xmlpacketData, va_arg(ap, void*),
+ td->td_xmlpacketLength);
+ break;
+ default: {
+ const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
+ TIFFTagValue *tv;
+ int tv_size, iCustom;
+
+ /*
+ * This can happen if multiple images are open with
+ * different codecs which have private tags. The
+ * global tag information table may then have tags
+ * that are valid for one file but not the other.
+ * If the client tries to set a tag that is not valid
+ * for the image's codec then we'll arrive here. This
+ * happens, for example, when tiffcp is used to convert
+ * between compression schemes and codec-specific tags
+ * are blindly copied.
+ */
+ if( fip == NULL || fip->field_bit != FIELD_CUSTOM )
+ {
+ TIFFError(module,
+ "%s: Invalid %stag \"%s\" (not supported by codec)",
+ tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "",
+ _TIFFFieldWithTag(tif, tag)->field_name);
+ status = 0;
+ break;
+ }
+
+ /*
+ * Find the existing entry for this custom value.
+ */
+ tv = NULL;
+ for( iCustom = 0; iCustom < td->td_customValueCount; iCustom++ )
+ {
+ if( td->td_customValues[iCustom].info == fip )
+ {
+ tv = td->td_customValues + iCustom;
+ if( tv->value != NULL )
+ _TIFFfree( tv->value );
+ break;
+ }
+ }
+
+ /*
+ * Grow the custom list if the entry was not found.
+ */
+ if( tv == NULL )
+ {
+ td->td_customValueCount++;
+ if( td->td_customValueCount > 1 )
+ td->td_customValues = (TIFFTagValue *)
+ _TIFFrealloc(td->td_customValues,
+ sizeof(TIFFTagValue) * td->td_customValueCount);
+ else
+ td->td_customValues = (TIFFTagValue *)
+ _TIFFmalloc(sizeof(TIFFTagValue));
+
+ tv = td->td_customValues + (td->td_customValueCount-1);
+ tv->info = fip;
+ tv->value = NULL;
+ tv->count = 0;
+ }
+
+ /*
+ * Set custom value ... save a copy of the custom tag value.
+ */
+ tv_size = TIFFDataWidth(fip->field_type);
+ if( fip->field_passcount )
+ tv->count = (int) va_arg(ap, int);
+ else
+ tv->count = 1;
+ if( fip->field_passcount )
+ {
+ tv->value = _TIFFmalloc(tv_size * tv->count);
+ if ( !tv->value ) {
+ va_end(ap);
+ return 0;
+ }
+ _TIFFmemcpy( tv->value, (void *) va_arg(ap,void*),
+ tv->count * tv_size );
+ }
+ else if( fip->field_type == TIFF_ASCII )
+ {
+ const char *value = (const char *) va_arg(ap,const char *);
+ tv->count = strlen(value)+1;
+ tv->value = _TIFFmalloc(tv->count);
+ if ( !tv->value ) {
+ va_end(ap);
+ return 0;
+ }
+ strcpy( tv->value, value );
+ }
+ else
+ {
+ /* not supporting "pass by value" types yet */
+ TIFFWarning(module, " ... pass by value not implemented.");
+
+ tv->value = _TIFFmalloc(tv_size * tv->count);
+ if ( !tv->value ) {
+ va_end(ap);
+ return 0;
+ }
+ _TIFFmemset( tv->value, 0, tv->count * tv_size );
+ status = 0;
+ }
+ }
+ }
+ if (status) {
+ TIFFSetFieldBit(tif, _TIFFFieldWithTag(tif, tag)->field_bit);
+ tif->tif_flags |= TIFF_DIRTYDIRECT;
+ }
+ va_end(ap);
+ return (status);
+badvalue:
+ TIFFError(module, "%.1000s: Bad value %d for \"%s\"",
+ tif->tif_name, v, _TIFFFieldWithTag(tif, tag)->field_name);
+ va_end(ap);
+ return (0);
+badvalue32:
+ TIFFError(module, "%.1000s: Bad value %ld for \"%s\"",
+ tif->tif_name, v32, _TIFFFieldWithTag(tif, tag)->field_name);
+ va_end(ap);
+ return (0);
+badvaluedbl:
+ TIFFError(module, "%.1000s: Bad value %f for \"%s\"",
+ tif->tif_name, d, _TIFFFieldWithTag(tif, tag)->field_name);
+ va_end(ap);
+ return (0);
+}
+
+/*
+ * Return 1/0 according to whether or not
+ * it is permissible to set the tag's value.
+ * Note that we allow ImageLength to be changed
+ * so that we can append and extend to images.
+ * Any other tag may not be altered once writing
+ * has commenced, unless its value has no effect
+ * on the format of the data that is written.
+ */
+static int
+OkToChangeTag(TIFF* tif, ttag_t tag)
+{
+ const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
+ if (!fip) { /* unknown tag */
+ TIFFError("TIFFSetField", "%s: Unknown %stag %u",
+ tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", tag);
+ return (0);
+ }
+ if (tag != TIFFTAG_IMAGELENGTH && (tif->tif_flags & TIFF_BEENWRITING) &&
+ !fip->field_oktochange) {
+ /*
+ * Consult info table to see if tag can be changed
+ * after we've started writing. We only allow changes
+ * to those tags that don't/shouldn't affect the
+ * compression and/or format of the data.
+ */
+ TIFFError("TIFFSetField",
+ "%s: Cannot modify tag \"%s\" while writing",
+ tif->tif_name, fip->field_name);
+ return (0);
+ }
+ return (1);
+}
+
+/*
+ * Record the value of a field in the
+ * internal directory structure. The
+ * field will be written to the file
+ * when/if the directory structure is
+ * updated.
+ */
+int
+TIFFSetField(TIFF* tif, ttag_t tag, ...)
+{
+ va_list ap;
+ int status;
+
+ va_start(ap, tag);
+ status = TIFFVSetField(tif, tag, ap);
+ va_end(ap);
+ return (status);
+}
+
+/*
+ * Like TIFFSetField, but taking a varargs
+ * parameter list. This routine is useful
+ * for building higher-level interfaces on
+ * top of the library.
+ */
+int
+TIFFVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ return OkToChangeTag(tif, tag) ?
+ (*tif->tif_tagmethods.vsetfield)(tif, tag, ap) : 0;
+}
+
+static int
+_TIFFVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ TIFFDirectory* td = &tif->tif_dir;
+ int ret_val = 1;
+
+ switch (tag) {
+ case TIFFTAG_SUBFILETYPE:
+ *va_arg(ap, uint32*) = td->td_subfiletype;
+ break;
+ case TIFFTAG_IMAGEWIDTH:
+ *va_arg(ap, uint32*) = td->td_imagewidth;
+ break;
+ case TIFFTAG_IMAGELENGTH:
+ *va_arg(ap, uint32*) = td->td_imagelength;
+ break;
+ case TIFFTAG_BITSPERSAMPLE:
+ *va_arg(ap, uint16*) = td->td_bitspersample;
+ break;
+ case TIFFTAG_COMPRESSION:
+ *va_arg(ap, uint16*) = td->td_compression;
+ break;
+ case TIFFTAG_PHOTOMETRIC:
+ *va_arg(ap, uint16*) = td->td_photometric;
+ break;
+ case TIFFTAG_THRESHHOLDING:
+ *va_arg(ap, uint16*) = td->td_threshholding;
+ break;
+ case TIFFTAG_FILLORDER:
+ *va_arg(ap, uint16*) = td->td_fillorder;
+ break;
+ case TIFFTAG_DOCUMENTNAME:
+ *va_arg(ap, char**) = td->td_documentname;
+ break;
+ case TIFFTAG_ARTIST:
+ *va_arg(ap, char**) = td->td_artist;
+ break;
+ case TIFFTAG_DATETIME:
+ *va_arg(ap, char**) = td->td_datetime;
+ break;
+ case TIFFTAG_HOSTCOMPUTER:
+ *va_arg(ap, char**) = td->td_hostcomputer;
+ break;
+ case TIFFTAG_IMAGEDESCRIPTION:
+ *va_arg(ap, char**) = td->td_imagedescription;
+ break;
+ case TIFFTAG_MAKE:
+ *va_arg(ap, char**) = td->td_make;
+ break;
+ case TIFFTAG_MODEL:
+ *va_arg(ap, char**) = td->td_model;
+ break;
+ case TIFFTAG_COPYRIGHT:
+ *va_arg(ap, char**) = td->td_copyright;
+ break;
+ case TIFFTAG_ORIENTATION:
+ *va_arg(ap, uint16*) = td->td_orientation;
+ break;
+ case TIFFTAG_SAMPLESPERPIXEL:
+ *va_arg(ap, uint16*) = td->td_samplesperpixel;
+ break;
+ case TIFFTAG_ROWSPERSTRIP:
+ *va_arg(ap, uint32*) = td->td_rowsperstrip;
+ break;
+ case TIFFTAG_MINSAMPLEVALUE:
+ *va_arg(ap, uint16*) = td->td_minsamplevalue;
+ break;
+ case TIFFTAG_MAXSAMPLEVALUE:
+ *va_arg(ap, uint16*) = td->td_maxsamplevalue;
+ break;
+ case TIFFTAG_SMINSAMPLEVALUE:
+ *va_arg(ap, double*) = td->td_sminsamplevalue;
+ break;
+ case TIFFTAG_SMAXSAMPLEVALUE:
+ *va_arg(ap, double*) = td->td_smaxsamplevalue;
+ break;
+ case TIFFTAG_XRESOLUTION:
+ *va_arg(ap, float*) = td->td_xresolution;
+ break;
+ case TIFFTAG_YRESOLUTION:
+ *va_arg(ap, float*) = td->td_yresolution;
+ break;
+ case TIFFTAG_PLANARCONFIG:
+ *va_arg(ap, uint16*) = td->td_planarconfig;
+ break;
+ case TIFFTAG_XPOSITION:
+ *va_arg(ap, float*) = td->td_xposition;
+ break;
+ case TIFFTAG_YPOSITION:
+ *va_arg(ap, float*) = td->td_yposition;
+ break;
+ case TIFFTAG_PAGENAME:
+ *va_arg(ap, char**) = td->td_pagename;
+ break;
+ case TIFFTAG_RESOLUTIONUNIT:
+ *va_arg(ap, uint16*) = td->td_resolutionunit;
+ break;
+ case TIFFTAG_PAGENUMBER:
+ *va_arg(ap, uint16*) = td->td_pagenumber[0];
+ *va_arg(ap, uint16*) = td->td_pagenumber[1];
+ break;
+ case TIFFTAG_HALFTONEHINTS:
+ *va_arg(ap, uint16*) = td->td_halftonehints[0];
+ *va_arg(ap, uint16*) = td->td_halftonehints[1];
+ break;
+ case TIFFTAG_COLORMAP:
+ *va_arg(ap, uint16**) = td->td_colormap[0];
+ *va_arg(ap, uint16**) = td->td_colormap[1];
+ *va_arg(ap, uint16**) = td->td_colormap[2];
+ break;
+ case TIFFTAG_STRIPOFFSETS:
+ case TIFFTAG_TILEOFFSETS:
+ *va_arg(ap, uint32**) = td->td_stripoffset;
+ break;
+ case TIFFTAG_STRIPBYTECOUNTS:
+ case TIFFTAG_TILEBYTECOUNTS:
+ *va_arg(ap, uint32**) = td->td_stripbytecount;
+ break;
+ case TIFFTAG_MATTEING:
+ *va_arg(ap, uint16*) =
+ (td->td_extrasamples == 1 &&
+ td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
+ break;
+ case TIFFTAG_EXTRASAMPLES:
+ *va_arg(ap, uint16*) = td->td_extrasamples;
+ *va_arg(ap, uint16**) = td->td_sampleinfo;
+ break;
+ case TIFFTAG_TILEWIDTH:
+ *va_arg(ap, uint32*) = td->td_tilewidth;
+ break;
+ case TIFFTAG_TILELENGTH:
+ *va_arg(ap, uint32*) = td->td_tilelength;
+ break;
+ case TIFFTAG_TILEDEPTH:
+ *va_arg(ap, uint32*) = td->td_tiledepth;
+ break;
+ case TIFFTAG_DATATYPE:
+ switch (td->td_sampleformat) {
+ case SAMPLEFORMAT_UINT:
+ *va_arg(ap, uint16*) = DATATYPE_UINT;
+ break;
+ case SAMPLEFORMAT_INT:
+ *va_arg(ap, uint16*) = DATATYPE_INT;
+ break;
+ case SAMPLEFORMAT_IEEEFP:
+ *va_arg(ap, uint16*) = DATATYPE_IEEEFP;
+ break;
+ case SAMPLEFORMAT_VOID:
+ *va_arg(ap, uint16*) = DATATYPE_VOID;
+ break;
+ }
+ break;
+ case TIFFTAG_SAMPLEFORMAT:
+ *va_arg(ap, uint16*) = td->td_sampleformat;
+ break;
+ case TIFFTAG_IMAGEDEPTH:
+ *va_arg(ap, uint32*) = td->td_imagedepth;
+ break;
+ case TIFFTAG_STONITS:
+ *va_arg(ap, double*) = td->td_stonits;
+ break;
+ case TIFFTAG_SUBIFD:
+ *va_arg(ap, uint16*) = td->td_nsubifd;
+ *va_arg(ap, uint32**) = td->td_subifd;
+ break;
+ case TIFFTAG_YCBCRCOEFFICIENTS:
+ *va_arg(ap, float**) = td->td_ycbcrcoeffs;
+ break;
+ case TIFFTAG_YCBCRPOSITIONING:
+ *va_arg(ap, uint16*) = td->td_ycbcrpositioning;
+ break;
+ case TIFFTAG_YCBCRSUBSAMPLING:
+ *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[0];
+ *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[1];
+ break;
+ case TIFFTAG_WHITEPOINT:
+ *va_arg(ap, float**) = td->td_whitepoint;
+ break;
+ case TIFFTAG_PRIMARYCHROMATICITIES:
+ *va_arg(ap, float**) = td->td_primarychromas;
+ break;
+ case TIFFTAG_TRANSFERFUNCTION:
+ *va_arg(ap, uint16**) = td->td_transferfunction[0];
+ if (td->td_samplesperpixel - td->td_extrasamples > 1) {
+ *va_arg(ap, uint16**) = td->td_transferfunction[1];
+ *va_arg(ap, uint16**) = td->td_transferfunction[2];
+ }
+ break;
+ case TIFFTAG_REFERENCEBLACKWHITE:
+ *va_arg(ap, float**) = td->td_refblackwhite;
+ break;
+ case TIFFTAG_INKSET:
+ *va_arg(ap, uint16*) = td->td_inkset;
+ break;
+ case TIFFTAG_DOTRANGE:
+ *va_arg(ap, uint16*) = td->td_dotrange[0];
+ *va_arg(ap, uint16*) = td->td_dotrange[1];
+ break;
+ case TIFFTAG_INKNAMES:
+ *va_arg(ap, char**) = td->td_inknames;
+ break;
+ case TIFFTAG_NUMBEROFINKS:
+ *va_arg(ap, uint16*) = td->td_ninks;
+ break;
+ case TIFFTAG_TARGETPRINTER:
+ *va_arg(ap, char**) = td->td_targetprinter;
+ break;
+ case TIFFTAG_ICCPROFILE:
+ *va_arg(ap, uint32*) = td->td_profileLength;
+ *va_arg(ap, void**) = td->td_profileData;
+ break;
+ case TIFFTAG_PHOTOSHOP:
+ *va_arg(ap, uint32*) = td->td_photoshopLength;
+ *va_arg(ap, void**) = td->td_photoshopData;
+ break;
+ case TIFFTAG_RICHTIFFIPTC:
+ *va_arg(ap, uint32*) = td->td_richtiffiptcLength;
+ *va_arg(ap, void**) = td->td_richtiffiptcData;
+ break;
+ case TIFFTAG_XMLPACKET:
+ *va_arg(ap, uint32*) = td->td_xmlpacketLength;
+ *va_arg(ap, void**) = td->td_xmlpacketData;
+ break;
+ /* Begin Pixar Tags */
+ case TIFFTAG_PIXAR_IMAGEFULLWIDTH:
+ *va_arg(ap, uint32*) = td->td_imagefullwidth;
+ break;
+ case TIFFTAG_PIXAR_IMAGEFULLLENGTH:
+ *va_arg(ap, uint32*) = td->td_imagefulllength;
+ break;
+ case TIFFTAG_PIXAR_TEXTUREFORMAT:
+ *va_arg(ap, char**) = td->td_textureformat;
+ break;
+ case TIFFTAG_PIXAR_WRAPMODES:
+ *va_arg(ap, char**) = td->td_wrapmodes;
+ break;
+ case TIFFTAG_PIXAR_FOVCOT:
+ *va_arg(ap, float*) = td->td_fovcot;
+ break;
+ case TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN:
+ *va_arg(ap, float**) = td->td_matrixWorldToScreen;
+ break;
+ case TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA:
+ *va_arg(ap, float**) = td->td_matrixWorldToCamera;
+ break;
+ /* End Pixar Tags */
+
+ default:
+ {
+ const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
+ int i;
+
+ /*
+ * This can happen if multiple images are open with
+ * different codecs which have private tags. The
+ * global tag information table may then have tags
+ * that are valid for one file but not the other.
+ * If the client tries to get a tag that is not valid
+ * for the image's codec then we'll arrive here.
+ */
+ if( fip == NULL || fip->field_bit != FIELD_CUSTOM )
+ {
+ TIFFError("_TIFFVGetField",
+ "%s: Invalid %stag \"%s\" (not supported by codec)",
+ tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "",
+ _TIFFFieldWithTag(tif, tag)->field_name);
+ ret_val = 0;
+ break;
+ }
+
+ /*
+ ** Do we have a custom value?
+ */
+ ret_val = 0;
+ for( i = 0; i < td->td_customValueCount; i++ )
+ {
+ TIFFTagValue *tv = td->td_customValues + i;
+
+ if( tv->info->field_tag != tag )
+ continue;
+
+ if( fip->field_passcount )
+ {
+ *va_arg(ap, u_short *) = (u_short) tv->count;
+ *va_arg(ap, void **) = tv->value;
+ ret_val = 1;
+ break;
+ }
+ else if( fip->field_type == TIFF_ASCII )
+ {
+ *va_arg(ap, void **) = tv->value;
+ ret_val = 1;
+ break;
+ }
+ else
+ {
+ printf( "TIFFVGetField ... pass by value not imp.\n" );
+ break;
+ }
+ }
+ }
+ }
+ return( ret_val );
+}
+
+/*
+ * Return the value of a field in the
+ * internal directory structure.
+ */
+int
+TIFFGetField(TIFF* tif, ttag_t tag, ...)
+{
+ int status;
+ va_list ap;
+
+ va_start(ap, tag);
+ status = TIFFVGetField(tif, tag, ap);
+ va_end(ap);
+ return (status);
+}
+
+/*
+ * Like TIFFGetField, but taking a varargs
+ * parameter list. This routine is useful
+ * for building higher-level interfaces on
+ * top of the library.
+ */
+int
+TIFFVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
+ return (fip && (isPseudoTag(tag) || TIFFFieldSet(tif, fip->field_bit)) ?
+ (*tif->tif_tagmethods.vgetfield)(tif, tag, ap) : 0);
+}
+
+#define CleanupField(member) { \
+ if (td->member) { \
+ _TIFFfree(td->member); \
+ td->member = 0; \
+ } \
+}
+
+/*
+ * Release storage associated with a directory.
+ */
+void
+TIFFFreeDirectory(TIFF* tif)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ int i;
+
+ CleanupField(td_colormap[0]);
+ CleanupField(td_colormap[1]);
+ CleanupField(td_colormap[2]);
+ CleanupField(td_documentname);
+ CleanupField(td_artist);
+ CleanupField(td_datetime);
+ CleanupField(td_hostcomputer);
+ CleanupField(td_imagedescription);
+ CleanupField(td_make);
+ CleanupField(td_model);
+ CleanupField(td_copyright);
+ CleanupField(td_pagename);
+ CleanupField(td_sampleinfo);
+ CleanupField(td_subifd);
+ CleanupField(td_ycbcrcoeffs);
+ CleanupField(td_inknames);
+ CleanupField(td_targetprinter);
+ CleanupField(td_whitepoint);
+ CleanupField(td_primarychromas);
+ CleanupField(td_refblackwhite);
+ CleanupField(td_transferfunction[0]);
+ CleanupField(td_transferfunction[1]);
+ CleanupField(td_transferfunction[2]);
+ CleanupField(td_profileData);
+ CleanupField(td_photoshopData);
+ CleanupField(td_richtiffiptcData);
+ CleanupField(td_xmlpacketData);
+ CleanupField(td_stripoffset);
+ CleanupField(td_stripbytecount);
+ /* Begin Pixar Tags */
+ CleanupField(td_textureformat);
+ CleanupField(td_wrapmodes);
+ CleanupField(td_matrixWorldToScreen);
+ CleanupField(td_matrixWorldToCamera);
+ /* End Pixar Tags */
+
+ /* Cleanup custom tag values */
+ for( i = 0; i < td->td_customValueCount; i++ )
+ _TIFFfree( td->td_customValues[i].value );
+
+ if( td->td_customValues != NULL )
+ _TIFFfree( td->td_customValues );
+
+}
+#undef CleanupField
+
+/*
+ * Client Tag extension support (from Niles Ritter).
+ */
+static TIFFExtendProc _TIFFextender = (TIFFExtendProc) NULL;
+
+TIFFExtendProc
+TIFFSetTagExtender(TIFFExtendProc extender)
+{
+ TIFFExtendProc prev = _TIFFextender;
+ _TIFFextender = extender;
+ return (prev);
+}
+
+/*
+ * Setup for a new directory. Should we automatically call
+ * TIFFWriteDirectory() if the current one is dirty?
+ *
+ * The newly created directory will not exist on the file till
+ * TIFFWriteDirectory(), TIFFFlush() or TIFFClose() is called.
+ */
+int
+TIFFCreateDirectory(TIFF* tif)
+{
+ TIFFDefaultDirectory(tif);
+ tif->tif_diroff = 0;
+ tif->tif_nextdiroff = 0;
+ tif->tif_curoff = 0;
+ tif->tif_row = (uint32) -1;
+ tif->tif_curstrip = (tstrip_t) -1;
+
+ return 0;
+}
+
+/*
+ * Setup a default directory structure.
+ */
+int
+TIFFDefaultDirectory(TIFF* tif)
+{
+ register TIFFDirectory* td = &tif->tif_dir;
+
+ _TIFFSetupFieldInfo(tif);
+ _TIFFmemset(td, 0, sizeof (*td));
+ td->td_fillorder = FILLORDER_MSB2LSB;
+ td->td_bitspersample = 1;
+ td->td_threshholding = THRESHHOLD_BILEVEL;
+ td->td_orientation = ORIENTATION_TOPLEFT;
+ td->td_samplesperpixel = 1;
+ td->td_rowsperstrip = (uint32) -1;
+ td->td_tilewidth = (uint32) -1;
+ td->td_tilelength = (uint32) -1;
+ td->td_tiledepth = 1;
+ td->td_resolutionunit = RESUNIT_INCH;
+ td->td_sampleformat = SAMPLEFORMAT_UINT;
+ td->td_imagedepth = 1;
+ td->td_ycbcrsubsampling[0] = 2;
+ td->td_ycbcrsubsampling[1] = 2;
+ td->td_ycbcrpositioning = YCBCRPOSITION_CENTERED;
+ td->td_inkset = INKSET_CMYK;
+ td->td_ninks = 4;
+ tif->tif_postdecode = _TIFFNoPostDecode;
+ tif->tif_tagmethods.vsetfield = _TIFFVSetField;
+ tif->tif_tagmethods.vgetfield = _TIFFVGetField;
+ tif->tif_tagmethods.printdir = NULL;
+ /*
+ * Give client code a chance to install their own
+ * tag extensions & methods, prior to compression overloads.
+ */
+ if (_TIFFextender)
+ (*_TIFFextender)(tif);
+ (void) TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
+ /*
+ * NB: The directory is marked dirty as a result of setting
+ * up the default compression scheme. However, this really
+ * isn't correct -- we want TIFF_DIRTYDIRECT to be set only
+ * if the user does something. We could just do the setup
+ * by hand, but it seems better to use the normal mechanism
+ * (i.e. TIFFSetField).
+ */
+ tif->tif_flags &= ~TIFF_DIRTYDIRECT;
+
+ /*
+ * As per http://bugzilla.remotesensing.org/show_bug.cgi?id=19
+ * we clear the ISTILED flag when setting up a new directory.
+ * Should we also be clearing stuff like INSUBIFD?
+ */
+ tif->tif_flags &= ~TIFF_ISTILED;
+
+ return (1);
+}
+
+static int
+TIFFAdvanceDirectory(TIFF* tif, uint32* nextdir, toff_t* off)
+{
+ static const char module[] = "TIFFAdvanceDirectory";
+ uint16 dircount;
+ if (isMapped(tif))
+ {
+ toff_t poff=*nextdir;
+ if (poff+sizeof(uint16) > tif->tif_size)
+ {
+ TIFFError(module, "%s: Error fetching directory count",
+ tif->tif_name);
+ return (0);
+ }
+ _TIFFmemcpy(&dircount, tif->tif_base+poff, sizeof (uint16));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&dircount);
+ poff+=sizeof (uint16)+dircount*sizeof (TIFFDirEntry);
+ if (off != NULL)
+ *off = poff;
+ if (((toff_t) (poff+sizeof (uint32))) > tif->tif_size)
+ {
+ TIFFError(module, "%s: Error fetching directory link",
+ tif->tif_name);
+ return (0);
+ }
+ _TIFFmemcpy(nextdir, tif->tif_base+poff, sizeof (uint32));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(nextdir);
+ return (1);
+ }
+ else
+ {
+ if (!SeekOK(tif, *nextdir) ||
+ !ReadOK(tif, &dircount, sizeof (uint16))) {
+ TIFFError(module, "%s: Error fetching directory count",
+ tif->tif_name);
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&dircount);
+ if (off != NULL)
+ *off = TIFFSeekFile(tif,
+ dircount*sizeof (TIFFDirEntry), SEEK_CUR);
+ else
+ (void) TIFFSeekFile(tif,
+ dircount*sizeof (TIFFDirEntry), SEEK_CUR);
+ if (!ReadOK(tif, nextdir, sizeof (uint32))) {
+ TIFFError(module, "%s: Error fetching directory link",
+ tif->tif_name);
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(nextdir);
+ return (1);
+ }
+}
+
+/*
+ * Count the number of directories in a file.
+ */
+tdir_t
+TIFFNumberOfDirectories(TIFF* tif)
+{
+ toff_t nextdir = tif->tif_header.tiff_diroff;
+ tdir_t n = 0;
+
+ while (nextdir != 0 && TIFFAdvanceDirectory(tif, &nextdir, NULL))
+ n++;
+ return (n);
+}
+
+/*
+ * Set the n-th directory as the current directory.
+ * NB: Directories are numbered starting at 0.
+ */
+int
+TIFFSetDirectory(TIFF* tif, tdir_t dirn)
+{
+ toff_t nextdir;
+ tdir_t n;
+
+ nextdir = tif->tif_header.tiff_diroff;
+ for (n = dirn; n > 0 && nextdir != 0; n--)
+ if (!TIFFAdvanceDirectory(tif, &nextdir, NULL))
+ return (0);
+ tif->tif_nextdiroff = nextdir;
+ /*
+ * Set curdir to the actual directory index. The
+ * -1 is because TIFFReadDirectory will increment
+ * tif_curdir after successfully reading the directory.
+ */
+ tif->tif_curdir = (dirn - n) - 1;
+ /*
+ * Reset tif_dirnumber counter nad start new list of seen directories.
+ * We need this in order to prevent IFD loops.
+ */
+ tif->tif_dirnumber = 0;
+ return (TIFFReadDirectory(tif));
+}
+
+/*
+ * Set the current directory to be the directory
+ * located at the specified file offset. This interface
+ * is used mainly to access directories linked with
+ * the SubIFD tag (e.g. thumbnail images).
+ */
+int
+TIFFSetSubDirectory(TIFF* tif, uint32 diroff)
+{
+ tif->tif_nextdiroff = diroff;
+ /*
+ * Reset tif_dirnumber counter nad start new list of seen directories.
+ * We need this in order to prevent IFD loops.
+ */
+ tif->tif_dirnumber = 0;
+ return (TIFFReadDirectory(tif));
+}
+
+/*
+ * Return file offset of the current directory.
+ */
+uint32
+TIFFCurrentDirOffset(TIFF* tif)
+{
+ return (tif->tif_diroff);
+}
+
+/*
+ * Return an indication of whether or not we are
+ * at the last directory in the file.
+ */
+int
+TIFFLastDirectory(TIFF* tif)
+{
+ return (tif->tif_nextdiroff == 0);
+}
+
+/*
+ * Unlink the specified directory from the directory chain.
+ */
+int
+TIFFUnlinkDirectory(TIFF* tif, tdir_t dirn)
+{
+ static const char module[] = "TIFFUnlinkDirectory";
+ toff_t nextdir;
+ toff_t off;
+ tdir_t n;
+
+ if (tif->tif_mode == O_RDONLY) {
+ TIFFError(module, "Can not unlink directory in read-only file");
+ return (0);
+ }
+ /*
+ * Go to the directory before the one we want
+ * to unlink and nab the offset of the link
+ * field we'll need to patch.
+ */
+ nextdir = tif->tif_header.tiff_diroff;
+ off = sizeof (uint16) + sizeof (uint16);
+ for (n = dirn-1; n > 0; n--) {
+ if (nextdir == 0) {
+ TIFFError(module, "Directory %d does not exist", dirn);
+ return (0);
+ }
+ if (!TIFFAdvanceDirectory(tif, &nextdir, &off))
+ return (0);
+ }
+ /*
+ * Advance to the directory to be unlinked and fetch
+ * the offset of the directory that follows.
+ */
+ if (!TIFFAdvanceDirectory(tif, &nextdir, NULL))
+ return (0);
+ /*
+ * Go back and patch the link field of the preceding
+ * directory to point to the offset of the directory
+ * that follows.
+ */
+ (void) TIFFSeekFile(tif, off, SEEK_SET);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&nextdir);
+ if (!WriteOK(tif, &nextdir, sizeof (uint32))) {
+ TIFFError(module, "Error writing directory link");
+ return (0);
+ }
+ /*
+ * Leave directory state setup safely. We don't have
+ * facilities for doing inserting and removing directories,
+ * so it's safest to just invalidate everything. This
+ * means that the caller can only append to the directory
+ * chain.
+ */
+ (*tif->tif_cleanup)(tif);
+ if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) {
+ _TIFFfree(tif->tif_rawdata);
+ tif->tif_rawdata = NULL;
+ tif->tif_rawcc = 0;
+ }
+ tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP|TIFF_POSTENCODE);
+ TIFFFreeDirectory(tif);
+ TIFFDefaultDirectory(tif);
+ tif->tif_diroff = 0; /* force link on next write */
+ tif->tif_nextdiroff = 0; /* next write must be at end */
+ tif->tif_curoff = 0;
+ tif->tif_row = (uint32) -1;
+ tif->tif_curstrip = (tstrip_t) -1;
+ return (1);
+}
+
+/* [BFC]
+ *
+ * Author: Bruce Cameron <cameron at petris.com>
+ *
+ * Set a table of tags that are to be replaced during directory process by the
+ * 'IGNORE' state - or return TRUE/FALSE for the requested tag such that
+ * 'ReadDirectory' can use the stored information.
+ */
+int
+TIFFReassignTagToIgnore (enum TIFFIgnoreSense task, int TIFFtagID)
+{
+ static int TIFFignoretags [FIELD_LAST];
+ static int tagcount = 0 ;
+ int i; /* Loop index */
+ int j; /* Loop index */
+
+ switch (task)
+ {
+ case TIS_STORE:
+ if ( tagcount < (FIELD_LAST - 1) )
+ {
+ for ( j = 0 ; j < tagcount ; ++j )
+ { /* Do not add duplicate tag */
+ if ( TIFFignoretags [j] == TIFFtagID )
+ return (TRUE) ;
+ }
+ TIFFignoretags [tagcount++] = TIFFtagID ;
+ return (TRUE) ;
+ }
+ break ;
+
+ case TIS_EXTRACT:
+ for ( i = 0 ; i < tagcount ; ++i )
+ {
+ if ( TIFFignoretags [i] == TIFFtagID )
+ return (TRUE) ;
+ }
+ break;
+
+ case TIS_EMPTY:
+ tagcount = 0 ; /* Clear the list */
+ return (TRUE) ;
+
+ default:
+ break;
+ }
+
+ return (FALSE);
+}
+
diff --git a/src/tiff/tif_dir.h b/src/tiff/tif_dir.h
new file mode 100644
index 0000000..9b5cf55
--- /dev/null
+++ b/src/tiff/tif_dir.h
@@ -0,0 +1,267 @@
+/* $Header: /home/terralib/src/tiff/tif_dir.h,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _TIFFDIR_
+#define _TIFFDIR_
+/*
+ * ``Library-private'' Directory-related Definitions.
+ */
+
+/*
+ * Internal format of a TIFF directory entry.
+ */
+typedef struct {
+#define FIELD_SETLONGS 4
+ /* bit vector of fields that are set */
+ u_long td_fieldsset[FIELD_SETLONGS];
+
+ uint32 td_imagewidth, td_imagelength, td_imagedepth;
+ uint32 td_tilewidth, td_tilelength, td_tiledepth;
+ uint32 td_subfiletype;
+ uint16 td_bitspersample;
+ uint16 td_sampleformat;
+ uint16 td_compression;
+ uint16 td_photometric;
+ uint16 td_threshholding;
+ uint16 td_fillorder;
+ uint16 td_orientation;
+ uint16 td_samplesperpixel;
+ uint32 td_rowsperstrip;
+ uint16 td_minsamplevalue, td_maxsamplevalue;
+ double td_sminsamplevalue, td_smaxsamplevalue;
+ float td_xresolution, td_yresolution;
+ uint16 td_resolutionunit;
+ uint16 td_planarconfig;
+ float td_xposition, td_yposition;
+ uint16 td_pagenumber[2];
+ uint16* td_colormap[3];
+ uint16 td_halftonehints[2];
+ uint16 td_extrasamples;
+ uint16* td_sampleinfo;
+ double td_stonits;
+ char* td_documentname;
+ char* td_artist;
+ char* td_datetime;
+ char* td_hostcomputer;
+ char* td_imagedescription;
+ char* td_make;
+ char* td_model;
+ char* td_copyright;
+ char* td_pagename;
+ tstrip_t td_stripsperimage;
+ tstrip_t td_nstrips; /* size of offset & bytecount arrays */
+ uint32* td_stripoffset;
+ uint32* td_stripbytecount;
+#if SUBIFD_SUPPORT
+ uint16 td_nsubifd;
+ uint32* td_subifd;
+#endif
+#ifdef YCBCR_SUPPORT
+ float* td_ycbcrcoeffs;
+ uint16 td_ycbcrsubsampling[2];
+ uint16 td_ycbcrpositioning;
+#endif
+#ifdef COLORIMETRY_SUPPORT
+ float* td_whitepoint;
+ float* td_primarychromas;
+ float* td_refblackwhite;
+ uint16* td_transferfunction[3];
+#endif
+#ifdef CMYK_SUPPORT
+ uint16 td_inkset;
+ uint16 td_ninks;
+ uint16 td_dotrange[2];
+ int td_inknameslen;
+ char* td_inknames;
+ char* td_targetprinter;
+#endif
+#ifdef ICC_SUPPORT
+ uint32 td_profileLength;
+ void *td_profileData;
+#endif
+#ifdef PHOTOSHOP_SUPPORT
+ uint32 td_photoshopLength;
+ void *td_photoshopData;
+#endif
+#ifdef IPTC_SUPPORT
+ uint32 td_richtiffiptcLength;
+ void *td_richtiffiptcData;
+#endif
+ /* Begin Pixar Tag values. */
+ uint32 td_imagefullwidth, td_imagefulllength;
+ char* td_textureformat;
+ char* td_wrapmodes;
+ float td_fovcot;
+ float* td_matrixWorldToScreen;
+ float* td_matrixWorldToCamera;
+ /* End Pixar Tag Values. */
+ uint32 td_xmlpacketLength;
+ void *td_xmlpacketData;
+ int td_customValueCount;
+ TIFFTagValue *td_customValues;
+} TIFFDirectory;
+
+/*
+ * Field flags used to indicate fields that have
+ * been set in a directory, and to reference fields
+ * when manipulating a directory.
+ */
+
+/*
+ * FIELD_IGNORE is used to signify tags that are to
+ * be processed but otherwise ignored. This permits
+ * antiquated tags to be quietly read and discarded.
+ * Note that a bit *is* allocated for ignored tags;
+ * this is understood by the directory reading logic
+ * which uses this fact to avoid special-case handling
+ */
+#define FIELD_IGNORE 0
+
+/* multi-item fields */
+#define FIELD_IMAGEDIMENSIONS 1
+#define FIELD_TILEDIMENSIONS 2
+#define FIELD_RESOLUTION 3
+#define FIELD_POSITION 4
+
+/* single-item fields */
+#define FIELD_SUBFILETYPE 5
+#define FIELD_BITSPERSAMPLE 6
+#define FIELD_COMPRESSION 7
+#define FIELD_PHOTOMETRIC 8
+#define FIELD_THRESHHOLDING 9
+#define FIELD_FILLORDER 10
+#define FIELD_DOCUMENTNAME 11
+#define FIELD_IMAGEDESCRIPTION 12
+#define FIELD_MAKE 13
+#define FIELD_MODEL 14
+#define FIELD_ORIENTATION 15
+#define FIELD_SAMPLESPERPIXEL 16
+#define FIELD_ROWSPERSTRIP 17
+#define FIELD_MINSAMPLEVALUE 18
+#define FIELD_MAXSAMPLEVALUE 19
+#define FIELD_PLANARCONFIG 20
+#define FIELD_PAGENAME 21
+#define FIELD_RESOLUTIONUNIT 22
+#define FIELD_PAGENUMBER 23
+#define FIELD_STRIPBYTECOUNTS 24
+#define FIELD_STRIPOFFSETS 25
+#define FIELD_COLORMAP 26
+#define FIELD_ARTIST 27
+#define FIELD_DATETIME 28
+#define FIELD_HOSTCOMPUTER 29
+/* unused - was FIELD_SOFTWARE 30 */
+#define FIELD_EXTRASAMPLES 31
+#define FIELD_SAMPLEFORMAT 32
+#define FIELD_SMINSAMPLEVALUE 33
+#define FIELD_SMAXSAMPLEVALUE 34
+#define FIELD_IMAGEDEPTH 35
+#define FIELD_TILEDEPTH 36
+#define FIELD_HALFTONEHINTS 37
+#define FIELD_YCBCRCOEFFICIENTS 38
+#define FIELD_YCBCRSUBSAMPLING 39
+#define FIELD_YCBCRPOSITIONING 40
+#define FIELD_REFBLACKWHITE 41
+#define FIELD_WHITEPOINT 42
+#define FIELD_PRIMARYCHROMAS 43
+#define FIELD_TRANSFERFUNCTION 44
+#define FIELD_INKSET 45
+#define FIELD_INKNAMES 46
+#define FIELD_DOTRANGE 47
+#define FIELD_TARGETPRINTER 48
+#define FIELD_SUBIFD 49
+#define FIELD_NUMBEROFINKS 50
+#define FIELD_ICCPROFILE 51
+#define FIELD_PHOTOSHOP 52
+#define FIELD_RICHTIFFIPTC 53
+#define FIELD_STONITS 54
+/* Begin PIXAR */
+#define FIELD_IMAGEFULLWIDTH 55
+#define FIELD_IMAGEFULLLENGTH 56
+#define FIELD_TEXTUREFORMAT 57
+#define FIELD_WRAPMODES 58
+#define FIELD_FOVCOT 59
+#define FIELD_MATRIX_WORLDTOSCREEN 60
+#define FIELD_MATRIX_WORLDTOCAMERA 61
+#define FIELD_COPYRIGHT 62
+#define FIELD_XMLPACKET 63
+/* FIELD_CUSTOM (see tiffio.h) 65 */
+/* end of support for well-known tags; codec-private tags follow */
+#define FIELD_CODEC 66 /* base of codec-private tags */
+
+
+/*
+ * Pseudo-tags don't normally need field bits since they
+ * are not written to an output file (by definition).
+ * The library also has express logic to always query a
+ * codec for a pseudo-tag so allocating a field bit for
+ * one is a waste. If codec wants to promote the notion
+ * of a pseudo-tag being ``set'' or ``unset'' then it can
+ * do using internal state flags without polluting the
+ * field bit space defined for real tags.
+ */
+#define FIELD_PSEUDO 0
+
+#define FIELD_LAST (32*FIELD_SETLONGS-1)
+
+#define TIFFExtractData(tif, type, v) \
+ ((uint32) ((tif)->tif_header.tiff_magic == TIFF_BIGENDIAN ? \
+ ((v) >> (tif)->tif_typeshift[type]) & (tif)->tif_typemask[type] : \
+ (v) & (tif)->tif_typemask[type]))
+#define TIFFInsertData(tif, type, v) \
+ ((uint32) ((tif)->tif_header.tiff_magic == TIFF_BIGENDIAN ? \
+ ((v) & (tif)->tif_typemask[type]) << (tif)->tif_typeshift[type] : \
+ (v) & (tif)->tif_typemask[type]))
+
+
+#define BITn(n) (((u_long)1L)<<((n)&0x1f))
+#define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n)/32])
+#define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field))
+#define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field))
+#define TIFFClrFieldBit(tif, field) (BITFIELDn(tif, field) &= ~BITn(field))
+
+#define FieldSet(fields, f) (fields[(f)/32] & BITn(f))
+#define ResetFieldBit(fields, f) (fields[(f)/32] &= ~BITn(f))
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+extern void _TIFFSetupFieldInfo(TIFF*);
+extern void _TIFFPrintFieldInfo(TIFF*, FILE*);
+extern TIFFDataType _TIFFSampleToTagType(TIFF*);
+extern const TIFFFieldInfo* _TIFFFindOrRegisterFieldInfo( TIFF *tif,
+ ttag_t tag,
+ TIFFDataType dt );
+extern TIFFFieldInfo* _TIFFCreateAnonFieldInfo( TIFF *tif, ttag_t tag,
+ TIFFDataType dt );
+
+#define _TIFFMergeFieldInfo TIFFMergeFieldInfo
+#define _TIFFFindFieldInfo TIFFFindFieldInfo
+#define _TIFFFieldWithTag TIFFFieldWithTag
+
+#if defined(__cplusplus)
+}
+#endif
+#endif /* _TIFFDIR_ */
diff --git a/src/tiff/tif_dirinfo.c b/src/tiff/tif_dirinfo.c
new file mode 100644
index 0000000..fe085c1
--- /dev/null
+++ b/src/tiff/tif_dirinfo.c
@@ -0,0 +1,480 @@
+/* $Header: /home/terralib/src/tiff/tif_dirinfo.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Core Directory Tag Support.
+ */
+#include "tiffiop.h"
+#include <stdlib.h>
+
+/*
+ * NB: NB: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG.
+ * If a tag can have both LONG and SHORT types
+ * then the LONG must be placed before the SHORT for
+ * writing to work properly.
+ *
+ * NOTE: The second field (field_readcount) and third field (field_writecount)
+ * sometimes use the values TIFF_VARIABLE (-1), TIFF_VARIABLE2 (-3)
+ * and TIFFTAG_SPP (-2). The macros should be used but would throw off
+ * the formatting of the code, so please interprete the -1, -2 and -3
+ * values accordingly.
+ */
+#ifndef VMS
+static
+#endif
+const TIFFFieldInfo tiffFieldInfo[] = {
+ { TIFFTAG_SUBFILETYPE, 1, 1, TIFF_LONG, FIELD_SUBFILETYPE,
+ TRUE, FALSE, "SubfileType" },
+/* XXX SHORT for compatibility w/ old versions of the library */
+ { TIFFTAG_SUBFILETYPE, 1, 1, TIFF_SHORT, FIELD_SUBFILETYPE,
+ TRUE, FALSE, "SubfileType" },
+ { TIFFTAG_OSUBFILETYPE, 1, 1, TIFF_SHORT, FIELD_SUBFILETYPE,
+ TRUE, FALSE, "OldSubfileType" },
+ { TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_LONG, FIELD_IMAGEDIMENSIONS,
+ FALSE, FALSE, "ImageWidth" },
+ { TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDIMENSIONS,
+ FALSE, FALSE, "ImageWidth" },
+ { TIFFTAG_IMAGELENGTH, 1, 1, TIFF_LONG, FIELD_IMAGEDIMENSIONS,
+ TRUE, FALSE, "ImageLength" },
+ { TIFFTAG_IMAGELENGTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDIMENSIONS,
+ TRUE, FALSE, "ImageLength" },
+/* XXX LONG for compatibility with some broken TIFF writers */
+ { TIFFTAG_BITSPERSAMPLE, -1,-1, TIFF_LONG, FIELD_BITSPERSAMPLE,
+ FALSE, FALSE, "BitsPerSample" },
+ { TIFFTAG_BITSPERSAMPLE, -1,-1, TIFF_SHORT, FIELD_BITSPERSAMPLE,
+ FALSE, FALSE, "BitsPerSample" },
+/* XXX LONG for compatibility with some broken TIFF writers */
+ { TIFFTAG_COMPRESSION, -1, 1, TIFF_LONG, FIELD_COMPRESSION,
+ FALSE, FALSE, "Compression" },
+ { TIFFTAG_COMPRESSION, -1, 1, TIFF_SHORT, FIELD_COMPRESSION,
+ FALSE, FALSE, "Compression" },
+/* XXX LONG for compatibility with some broken TIFF writers */
+ { TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_LONG, FIELD_PHOTOMETRIC,
+ FALSE, FALSE, "PhotometricInterpretation" },
+ { TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_SHORT, FIELD_PHOTOMETRIC,
+ FALSE, FALSE, "PhotometricInterpretation" },
+ { TIFFTAG_THRESHHOLDING, 1, 1, TIFF_SHORT, FIELD_THRESHHOLDING,
+ TRUE, FALSE, "Threshholding" },
+ { TIFFTAG_CELLWIDTH, 1, 1, TIFF_SHORT, FIELD_IGNORE,
+ TRUE, FALSE, "CellWidth" },
+ { TIFFTAG_CELLLENGTH, 1, 1, TIFF_SHORT, FIELD_IGNORE,
+ TRUE, FALSE, "CellLength" },
+ { TIFFTAG_FILLORDER, 1, 1, TIFF_SHORT, FIELD_FILLORDER,
+ FALSE, FALSE, "FillOrder" },
+ { TIFFTAG_DOCUMENTNAME, -1,-1, TIFF_ASCII, FIELD_DOCUMENTNAME,
+ TRUE, FALSE, "DocumentName" },
+ { TIFFTAG_IMAGEDESCRIPTION, -1,-1, TIFF_ASCII, FIELD_IMAGEDESCRIPTION,
+ TRUE, FALSE, "ImageDescription" },
+ { TIFFTAG_MAKE, -1,-1, TIFF_ASCII, FIELD_MAKE,
+ TRUE, FALSE, "Make" },
+ { TIFFTAG_MODEL, -1,-1, TIFF_ASCII, FIELD_MODEL,
+ TRUE, FALSE, "Model" },
+ { TIFFTAG_STRIPOFFSETS, -1,-1, TIFF_LONG, FIELD_STRIPOFFSETS,
+ FALSE, FALSE, "StripOffsets" },
+ { TIFFTAG_STRIPOFFSETS, -1,-1, TIFF_SHORT, FIELD_STRIPOFFSETS,
+ FALSE, FALSE, "StripOffsets" },
+ { TIFFTAG_ORIENTATION, 1, 1, TIFF_SHORT, FIELD_ORIENTATION,
+ FALSE, FALSE, "Orientation" },
+ { TIFFTAG_SAMPLESPERPIXEL, 1, 1, TIFF_SHORT, FIELD_SAMPLESPERPIXEL,
+ FALSE, FALSE, "SamplesPerPixel" },
+ { TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_LONG, FIELD_ROWSPERSTRIP,
+ FALSE, FALSE, "RowsPerStrip" },
+ { TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_SHORT, FIELD_ROWSPERSTRIP,
+ FALSE, FALSE, "RowsPerStrip" },
+ { TIFFTAG_STRIPBYTECOUNTS, -1,-1, TIFF_LONG, FIELD_STRIPBYTECOUNTS,
+ FALSE, FALSE, "StripByteCounts" },
+ { TIFFTAG_STRIPBYTECOUNTS, -1,-1, TIFF_SHORT, FIELD_STRIPBYTECOUNTS,
+ FALSE, FALSE, "StripByteCounts" },
+ { TIFFTAG_MINSAMPLEVALUE, -2,-1, TIFF_SHORT, FIELD_MINSAMPLEVALUE,
+ TRUE, FALSE, "MinSampleValue" },
+ { TIFFTAG_MAXSAMPLEVALUE, -2,-1, TIFF_SHORT, FIELD_MAXSAMPLEVALUE,
+ TRUE, FALSE, "MaxSampleValue" },
+ { TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_RESOLUTION,
+ FALSE, FALSE, "XResolution" },
+ { TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_RESOLUTION,
+ FALSE, FALSE, "YResolution" },
+ { TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, FIELD_PLANARCONFIG,
+ FALSE, FALSE, "PlanarConfiguration" },
+ { TIFFTAG_PAGENAME, -1,-1, TIFF_ASCII, FIELD_PAGENAME,
+ TRUE, FALSE, "PageName" },
+ { TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, FIELD_POSITION,
+ TRUE, FALSE, "XPosition" },
+ { TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, FIELD_POSITION,
+ TRUE, FALSE, "YPosition" },
+ { TIFFTAG_FREEOFFSETS, -1,-1, TIFF_LONG, FIELD_IGNORE,
+ FALSE, FALSE, "FreeOffsets" },
+ { TIFFTAG_FREEBYTECOUNTS, -1,-1, TIFF_LONG, FIELD_IGNORE,
+ FALSE, FALSE, "FreeByteCounts" },
+ { TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, FIELD_IGNORE,
+ TRUE, FALSE, "GrayResponseUnit" },
+ { TIFFTAG_GRAYRESPONSECURVE,-1,-1, TIFF_SHORT, FIELD_IGNORE,
+ TRUE, FALSE, "GrayResponseCurve" },
+ { TIFFTAG_RESOLUTIONUNIT, 1, 1, TIFF_SHORT, FIELD_RESOLUTIONUNIT,
+ FALSE, FALSE, "ResolutionUnit" },
+ { TIFFTAG_PAGENUMBER, 2, 2, TIFF_SHORT, FIELD_PAGENUMBER,
+ TRUE, FALSE, "PageNumber" },
+ { TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT, FIELD_IGNORE,
+ TRUE, FALSE, "ColorResponseUnit" },
+ { TIFFTAG_TRANSFERFUNCTION, -1,-1, TIFF_SHORT, FIELD_TRANSFERFUNCTION,
+ TRUE, FALSE, "TransferFunction" },
+ { TIFFTAG_SOFTWARE, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
+ TRUE, FALSE, "Software" },
+ { TIFFTAG_DATETIME, 20,20, TIFF_ASCII, FIELD_DATETIME,
+ TRUE, FALSE, "DateTime" },
+ { TIFFTAG_ARTIST, -1,-1, TIFF_ASCII, FIELD_ARTIST,
+ TRUE, FALSE, "Artist" },
+ { TIFFTAG_HOSTCOMPUTER, -1,-1, TIFF_ASCII, FIELD_HOSTCOMPUTER,
+ TRUE, FALSE, "HostComputer" },
+ { TIFFTAG_WHITEPOINT, 2, 2, TIFF_RATIONAL,FIELD_WHITEPOINT,
+ TRUE, FALSE, "WhitePoint" },
+ { TIFFTAG_PRIMARYCHROMATICITIES,6,6,TIFF_RATIONAL,FIELD_PRIMARYCHROMAS,
+ TRUE, FALSE, "PrimaryChromaticities" },
+ { TIFFTAG_COLORMAP, -1,-1, TIFF_SHORT, FIELD_COLORMAP,
+ TRUE, FALSE, "ColorMap" },
+ { TIFFTAG_HALFTONEHINTS, 2, 2, TIFF_SHORT, FIELD_HALFTONEHINTS,
+ TRUE, FALSE, "HalftoneHints" },
+ { TIFFTAG_TILEWIDTH, 1, 1, TIFF_LONG, FIELD_TILEDIMENSIONS,
+ FALSE, FALSE, "TileWidth" },
+ { TIFFTAG_TILEWIDTH, 1, 1, TIFF_SHORT, FIELD_TILEDIMENSIONS,
+ FALSE, FALSE, "TileWidth" },
+ { TIFFTAG_TILELENGTH, 1, 1, TIFF_LONG, FIELD_TILEDIMENSIONS,
+ FALSE, FALSE, "TileLength" },
+ { TIFFTAG_TILELENGTH, 1, 1, TIFF_SHORT, FIELD_TILEDIMENSIONS,
+ FALSE, FALSE, "TileLength" },
+ { TIFFTAG_TILEOFFSETS, -1, 1, TIFF_LONG, FIELD_STRIPOFFSETS,
+ FALSE, FALSE, "TileOffsets" },
+ { TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_LONG, FIELD_STRIPBYTECOUNTS,
+ FALSE, FALSE, "TileByteCounts" },
+ { TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_SHORT, FIELD_STRIPBYTECOUNTS,
+ FALSE, FALSE, "TileByteCounts" },
+ { TIFFTAG_SUBIFD, -1,-1, TIFF_LONG, FIELD_SUBIFD,
+ TRUE, TRUE, "SubIFD" },
+ { TIFFTAG_INKSET, 1, 1, TIFF_SHORT, FIELD_INKSET,
+ FALSE, FALSE, "InkSet" },
+ { TIFFTAG_INKNAMES, -1,-1, TIFF_ASCII, FIELD_INKNAMES,
+ TRUE, TRUE, "InkNames" },
+ { TIFFTAG_NUMBEROFINKS, 1, 1, TIFF_SHORT, FIELD_NUMBEROFINKS,
+ TRUE, FALSE, "NumberOfInks" },
+ { TIFFTAG_DOTRANGE, 2, 2, TIFF_SHORT, FIELD_DOTRANGE,
+ FALSE, FALSE, "DotRange" },
+ { TIFFTAG_DOTRANGE, 2, 2, TIFF_BYTE, FIELD_DOTRANGE,
+ FALSE, FALSE, "DotRange" },
+ { TIFFTAG_TARGETPRINTER, -1,-1, TIFF_ASCII, FIELD_TARGETPRINTER,
+ TRUE, FALSE, "TargetPrinter" },
+ { TIFFTAG_EXTRASAMPLES, -1,-1, TIFF_SHORT, FIELD_EXTRASAMPLES,
+ FALSE, FALSE, "ExtraSamples" },
+/* XXX for bogus Adobe Photoshop v2.5 files */
+ { TIFFTAG_EXTRASAMPLES, -1,-1, TIFF_BYTE, FIELD_EXTRASAMPLES,
+ FALSE, FALSE, "ExtraSamples" },
+ { TIFFTAG_SAMPLEFORMAT, -1,-1, TIFF_SHORT, FIELD_SAMPLEFORMAT,
+ FALSE, FALSE, "SampleFormat" },
+ { TIFFTAG_SMINSAMPLEVALUE, -2,-1, TIFF_ANY, FIELD_SMINSAMPLEVALUE,
+ TRUE, FALSE, "SMinSampleValue" },
+ { TIFFTAG_SMAXSAMPLEVALUE, -2,-1, TIFF_ANY, FIELD_SMAXSAMPLEVALUE,
+ TRUE, FALSE, "SMaxSampleValue" },
+ { TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL, FIELD_YCBCRCOEFFICIENTS,
+ FALSE, FALSE, "YCbCrCoefficients" },
+ { TIFFTAG_YCBCRSUBSAMPLING, 2, 2, TIFF_SHORT, FIELD_YCBCRSUBSAMPLING,
+ FALSE, FALSE, "YCbCrSubsampling" },
+ { TIFFTAG_YCBCRPOSITIONING, 1, 1, TIFF_SHORT, FIELD_YCBCRPOSITIONING,
+ FALSE, FALSE, "YCbCrPositioning" },
+ { TIFFTAG_REFERENCEBLACKWHITE,6,6,TIFF_RATIONAL, FIELD_REFBLACKWHITE,
+ TRUE, FALSE, "ReferenceBlackWhite" },
+/* XXX temporarily accept LONG for backwards compatibility */
+ { TIFFTAG_REFERENCEBLACKWHITE,6,6,TIFF_LONG, FIELD_REFBLACKWHITE,
+ TRUE, FALSE, "ReferenceBlackWhite" },
+ { TIFFTAG_XMLPACKET, -1,-3, TIFF_UNDEFINED, FIELD_XMLPACKET,
+ FALSE, TRUE, "XMLPacket" },
+/* begin SGI tags */
+ { TIFFTAG_MATTEING, 1, 1, TIFF_SHORT, FIELD_EXTRASAMPLES,
+ FALSE, FALSE, "Matteing" },
+ { TIFFTAG_DATATYPE, -2,-1, TIFF_SHORT, FIELD_SAMPLEFORMAT,
+ FALSE, FALSE, "DataType" },
+ { TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_LONG, FIELD_IMAGEDEPTH,
+ FALSE, FALSE, "ImageDepth" },
+ { TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDEPTH,
+ FALSE, FALSE, "ImageDepth" },
+ { TIFFTAG_TILEDEPTH, 1, 1, TIFF_LONG, FIELD_TILEDEPTH,
+ FALSE, FALSE, "TileDepth" },
+ { TIFFTAG_TILEDEPTH, 1, 1, TIFF_SHORT, FIELD_TILEDEPTH,
+ FALSE, FALSE, "TileDepth" },
+/* end SGI tags */
+/* begin Pixar tags */
+ { TIFFTAG_PIXAR_IMAGEFULLWIDTH, 1, 1, TIFF_LONG, FIELD_IMAGEFULLWIDTH,
+ TRUE, FALSE, "ImageFullWidth" },
+ { TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG, FIELD_IMAGEFULLLENGTH,
+ TRUE, FALSE, "ImageFullLength" },
+ { TIFFTAG_PIXAR_TEXTUREFORMAT, -1,-1, TIFF_ASCII, FIELD_TEXTUREFORMAT,
+ TRUE, FALSE, "TextureFormat" },
+ { TIFFTAG_PIXAR_WRAPMODES, -1,-1, TIFF_ASCII, FIELD_WRAPMODES,
+ TRUE, FALSE, "TextureWrapModes" },
+ { TIFFTAG_PIXAR_FOVCOT, 1, 1, TIFF_FLOAT, FIELD_FOVCOT,
+ TRUE, FALSE, "FieldOfViewCotan" },
+ { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16,16, TIFF_FLOAT,
+ FIELD_MATRIX_WORLDTOSCREEN, TRUE, FALSE, "MatrixWorldToScreen" },
+ { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16,16, TIFF_FLOAT,
+ FIELD_MATRIX_WORLDTOCAMERA, TRUE, FALSE, "MatrixWorldToCamera" },
+ { TIFFTAG_COPYRIGHT, -1,-1, TIFF_ASCII, FIELD_COPYRIGHT,
+ TRUE, FALSE, "Copyright" },
+/* end Pixar tags */
+#ifdef IPTC_SUPPORT
+#ifdef PHOTOSHOP_SUPPORT
+ { TIFFTAG_RICHTIFFIPTC, -1,-1, TIFF_LONG, FIELD_RICHTIFFIPTC,
+ FALSE, TRUE, "RichTIFFIPTC" },
+#else
+ { TIFFTAG_RICHTIFFIPTC, -1,-3, TIFF_UNDEFINED, FIELD_RICHTIFFIPTC,
+ FALSE, TRUE, "RichTIFFIPTC" },
+#endif
+#endif
+ { TIFFTAG_PHOTOSHOP, -1,-3, TIFF_BYTE, FIELD_PHOTOSHOP,
+ FALSE, TRUE, "Photoshop" },
+ { TIFFTAG_ICCPROFILE, -1,-3, TIFF_UNDEFINED, FIELD_ICCPROFILE,
+ FALSE, TRUE, "ICC Profile" },
+ { TIFFTAG_STONITS, 1, 1, TIFF_DOUBLE, FIELD_STONITS,
+ FALSE, FALSE, "StoNits" },
+};
+#define N(a) (sizeof (a) / sizeof (a[0]))
+
+void
+_TIFFSetupFieldInfo(TIFF* tif)
+{
+ if (tif->tif_fieldinfo) {
+ int i;
+
+ for (i = 0; i < tif->tif_nfields; i++)
+ {
+ TIFFFieldInfo *fld = tif->tif_fieldinfo[i];
+ if (fld->field_bit == FIELD_CUSTOM &&
+ strncmp("Tag ", fld->field_name, 4) == 0)
+ {
+ _TIFFfree(fld->field_name);
+ _TIFFfree(fld);
+ }
+ }
+
+ _TIFFfree(tif->tif_fieldinfo);
+ tif->tif_nfields = 0;
+ }
+ _TIFFMergeFieldInfo(tif, tiffFieldInfo, N(tiffFieldInfo));
+}
+
+static int
+tagCompare(const void* a, const void* b)
+{
+ const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
+ const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
+ /* NB: be careful of return values for 16-bit platforms */
+ if (ta->field_tag != tb->field_tag)
+ return (ta->field_tag < tb->field_tag ? -1 : 1);
+ else
+ return ((int)tb->field_type - (int)ta->field_type);
+}
+
+void
+_TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
+{
+ TIFFFieldInfo** tp;
+ int i;
+
+ if (tif->tif_nfields > 0) {
+ tif->tif_fieldinfo = (TIFFFieldInfo**)
+ _TIFFrealloc(tif->tif_fieldinfo,
+ (tif->tif_nfields+n) * sizeof (TIFFFieldInfo*));
+ } else {
+ tif->tif_fieldinfo = (TIFFFieldInfo**)
+ _TIFFmalloc(n * sizeof (TIFFFieldInfo*));
+ }
+ tp = &tif->tif_fieldinfo[tif->tif_nfields];
+ for (i = 0; i < n; i++)
+ tp[i] = (TIFFFieldInfo*) &info[i]; /* XXX */
+
+ /* Sort the field info by tag number */
+ qsort(tif->tif_fieldinfo, (size_t) (tif->tif_nfields += n),
+ sizeof (TIFFFieldInfo*), tagCompare);
+}
+
+void
+_TIFFPrintFieldInfo(TIFF* tif, FILE* fd)
+{
+ int i;
+
+ fprintf(fd, "%s: \n", tif->tif_name);
+ for (i = 0; i < tif->tif_nfields; i++) {
+ const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
+ fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n"
+ , i
+ , (unsigned long) fip->field_tag
+ , fip->field_readcount, fip->field_writecount
+ , fip->field_type
+ , fip->field_bit
+ , fip->field_oktochange ? "TRUE" : "FALSE"
+ , fip->field_passcount ? "TRUE" : "FALSE"
+ , fip->field_name
+ );
+ }
+}
+
+/*
+ * Return size of TIFFDataType in bytes
+ */
+int
+TIFFDataWidth(TIFFDataType type)
+{
+ switch(type)
+ {
+ case 0: /* nothing */
+ case 1: /* TIFF_BYTE */
+ case 2: /* TIFF_ASCII */
+ case 6: /* TIFF_SBYTE */
+ case 7: /* TIFF_UNDEFINED */
+ return 1;
+ case 3: /* TIFF_SHORT */
+ case 8: /* TIFF_SSHORT */
+ return 2;
+ case 4: /* TIFF_LONG */
+ case 9: /* TIFF_SLONG */
+ case 11: /* TIFF_FLOAT */
+ case 13: /* TIFF_IFD */
+ return 4;
+ case 5: /* TIFF_RATIONAL */
+ case 10: /* TIFF_SRATIONAL */
+ case 12: /* TIFF_DOUBLE */
+ return 8;
+ default:
+ return 0; /* will return 0 for unknown types */
+ }
+}
+
+/*
+ * Return nearest TIFFDataType to the sample type of an image.
+ */
+TIFFDataType
+_TIFFSampleToTagType(TIFF* tif)
+{
+ int bps = (int) TIFFhowmany(tif->tif_dir.td_bitspersample, 8);
+
+ switch (tif->tif_dir.td_sampleformat) {
+ case SAMPLEFORMAT_IEEEFP:
+ return (bps == 4 ? TIFF_FLOAT : TIFF_DOUBLE);
+ case SAMPLEFORMAT_INT:
+ return (bps <= 1 ? TIFF_SBYTE :
+ bps <= 2 ? TIFF_SSHORT : TIFF_SLONG);
+ case SAMPLEFORMAT_UINT:
+ return (bps <= 1 ? TIFF_BYTE :
+ bps <= 2 ? TIFF_SHORT : TIFF_LONG);
+ case SAMPLEFORMAT_VOID:
+ return (TIFF_UNDEFINED);
+ }
+ /*NOTREACHED*/
+ return (TIFF_UNDEFINED);
+}
+
+const TIFFFieldInfo*
+_TIFFFindFieldInfo(TIFF* tif, ttag_t tag, TIFFDataType dt)
+{
+ static const TIFFFieldInfo *last = NULL;
+ int i, n;
+
+ if (last && last->field_tag == tag &&
+ (dt == TIFF_ANY || dt == last->field_type))
+ return (last);
+ /* NB: if table gets big, use sorted search (e.g. binary search) */
+ if(dt != TIFF_ANY) {
+ TIFFFieldInfo key = {0, 0, 0, 0, 0, 0, 0, 0};
+ key.field_tag = tag;
+ key.field_type = dt;
+ return((const TIFFFieldInfo *) bsearch(&key,
+ tif->tif_fieldinfo,
+ tif->tif_nfields,
+ sizeof(TIFFFieldInfo),
+ tagCompare));
+ } else for (i = 0, n = tif->tif_nfields; i < n; i++) {
+ const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
+ if (fip->field_tag == tag &&
+ (dt == TIFF_ANY || fip->field_type == dt))
+ return (last = fip);
+ }
+ return ((const TIFFFieldInfo *)0);
+}
+
+#include <assert.h>
+#include <stdio.h>
+
+const TIFFFieldInfo*
+_TIFFFieldWithTag(TIFF* tif, ttag_t tag)
+{
+ const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
+ if (!fip) {
+ TIFFError("TIFFFieldWithTag",
+ "Internal error, unknown tag 0x%x", (u_int) tag);
+ assert(fip != NULL);
+ /*NOTREACHED*/
+ }
+ return (fip);
+}
+
+const TIFFFieldInfo*
+_TIFFFindOrRegisterFieldInfo( TIFF *tif, ttag_t tag, TIFFDataType dt )
+
+{
+ const TIFFFieldInfo *fld;
+
+ fld = _TIFFFindFieldInfo( tif, tag, dt );
+ if( fld == NULL )
+ {
+ fld = _TIFFCreateAnonFieldInfo( tif, tag, dt );
+ _TIFFMergeFieldInfo( tif, fld, 1 );
+ }
+
+ return fld;
+}
+
+TIFFFieldInfo*
+_TIFFCreateAnonFieldInfo(TIFF *tif, ttag_t tag, TIFFDataType field_type)
+{
+ TIFFFieldInfo *fld;
+
+ fld = (TIFFFieldInfo *) _TIFFmalloc(sizeof (TIFFFieldInfo));
+ _TIFFmemset( fld, 0, sizeof(TIFFFieldInfo) );
+
+ fld->field_tag = tag;
+ fld->field_readcount = TIFF_VARIABLE;
+ fld->field_writecount = TIFF_VARIABLE;
+ fld->field_type = field_type;
+ fld->field_bit = FIELD_CUSTOM;
+ fld->field_oktochange = TRUE;
+ fld->field_passcount = TRUE;
+ fld->field_name = (char *) _TIFFmalloc(32);
+
+ /* note that this name is a special sign to TIFFClose() and
+ * _TIFFSetupFieldInfo() to free the field
+ */
+ sprintf(fld->field_name, "Tag %d", (int) tag);
+
+ return fld;
+}
diff --git a/src/tiff/tif_dirread.c b/src/tiff/tif_dirread.c
new file mode 100644
index 0000000..cd41347
--- /dev/null
+++ b/src/tiff/tif_dirread.c
@@ -0,0 +1,1485 @@
+/* $Header: /home/terralib/src/tiff/tif_dirread.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Directory Read Support Routines.
+ */
+#include "tiffiop.h"
+
+#define IGNORE 0 /* tag placeholder used below */
+
+#if HAVE_IEEEFP
+#define TIFFCvtIEEEFloatToNative(tif, n, fp)
+#define TIFFCvtIEEEDoubleToNative(tif, n, dp)
+#else
+extern void TIFFCvtIEEEFloatToNative(TIFF*, uint32, float*);
+extern void TIFFCvtIEEEDoubleToNative(TIFF*, uint32, double*);
+#endif
+
+static int EstimateStripByteCounts(TIFF*, TIFFDirEntry*, uint16);
+static void MissingRequired(TIFF*, const char*);
+static int CheckDirCount(TIFF*, TIFFDirEntry*, uint32);
+static tsize_t TIFFFetchData(TIFF*, TIFFDirEntry*, char*);
+static tsize_t TIFFFetchString(TIFF*, TIFFDirEntry*, char*);
+static float TIFFFetchRational(TIFF*, TIFFDirEntry*);
+static int TIFFFetchNormalTag(TIFF*, TIFFDirEntry*);
+static int TIFFFetchPerSampleShorts(TIFF*, TIFFDirEntry*, int*);
+static int TIFFFetchPerSampleAnys(TIFF*, TIFFDirEntry*, double*);
+static int TIFFFetchShortArray(TIFF*, TIFFDirEntry*, uint16*);
+static int TIFFFetchStripThing(TIFF*, TIFFDirEntry*, long, uint32**);
+static int TIFFFetchExtraSamples(TIFF*, TIFFDirEntry*);
+static int TIFFFetchRefBlackWhite(TIFF*, TIFFDirEntry*);
+static float TIFFFetchFloat(TIFF*, TIFFDirEntry*);
+static int TIFFFetchFloatArray(TIFF*, TIFFDirEntry*, float*);
+static int TIFFFetchDoubleArray(TIFF*, TIFFDirEntry*, double*);
+static int TIFFFetchAnyArray(TIFF*, TIFFDirEntry*, double*);
+static int TIFFFetchShortPair(TIFF*, TIFFDirEntry*);
+static void ChopUpSingleUncompressedStrip(TIFF*);
+
+static char *
+CheckMalloc(TIFF* tif, tsize_t n, const char* what)
+{
+ char *cp = (char*)_TIFFmalloc(n);
+ if (cp == NULL)
+ TIFFError(tif->tif_name, "No space %s", what);
+ return (cp);
+}
+
+/*
+ * Read the next TIFF directory from a file
+ * and convert it to the internal format.
+ * We read directories sequentially.
+ */
+int
+TIFFReadDirectory(TIFF* tif)
+{
+ static const char module[] = "TIFFReadDirectory";
+
+ register TIFFDirEntry* dp;
+ register int n;
+ register TIFFDirectory* td;
+ TIFFDirEntry* dir;
+ int iv;
+ long v;
+ double dv;
+ const TIFFFieldInfo* fip;
+ int fix;
+ uint16 dircount;
+ toff_t nextdiroff;
+ char* cp;
+ int diroutoforderwarning = 0;
+
+ tif->tif_diroff = tif->tif_nextdiroff;
+ if (tif->tif_diroff == 0) /* no more directories */
+ return (0);
+
+ /*
+ * XXX: Trick to prevent IFD looping. The one can create TIFF file
+ * with looped directory pointers. We will maintain a list of already
+ * seen directories and check every IFD offset against this list.
+ */
+ for (n = 0; n < tif->tif_dirnumber; n++) {
+ if (tif->tif_dirlist[n] == tif->tif_diroff)
+ return (0);
+ }
+ tif->tif_dirnumber++;
+ tif->tif_dirlist = _TIFFrealloc(tif->tif_dirlist,
+ tif->tif_dirnumber * sizeof(toff_t));
+ if (!tif->tif_dirlist) {
+ TIFFError(module,
+ "%.1000s: Failed to allocate space for IFD list",
+ tif->tif_name);
+ return (0);
+ }
+ tif->tif_dirlist[tif->tif_dirnumber - 1] = tif->tif_diroff;
+
+ /*
+ * Cleanup any previous compression state.
+ */
+ (*tif->tif_cleanup)(tif);
+ tif->tif_curdir++;
+ nextdiroff = 0;
+ if (!isMapped(tif)) {
+ if (!SeekOK(tif, tif->tif_diroff)) {
+ TIFFError(module,
+ "%.1000s: Seek error accessing TIFF directory",
+ tif->tif_name);
+ return (0);
+ }
+ if (!ReadOK(tif, &dircount, sizeof (uint16))) {
+ TIFFError(module,
+ "%.1000s: Can not read TIFF directory count",
+ tif->tif_name);
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&dircount);
+ dir = (TIFFDirEntry *)CheckMalloc(tif,
+ dircount * sizeof (TIFFDirEntry), "to read TIFF directory");
+ if (dir == NULL)
+ return (0);
+ if (!ReadOK(tif, dir, dircount*sizeof (TIFFDirEntry))) {
+ TIFFError(module,
+ "%.100s: Can not read TIFF directory",
+ tif->tif_name);
+ goto bad;
+ }
+ /*
+ * Read offset to next directory for sequential scans.
+ */
+ (void) ReadOK(tif, &nextdiroff, sizeof (uint32));
+ } else {
+ toff_t off = tif->tif_diroff;
+
+ if (off + sizeof (uint16) > tif->tif_size) {
+ TIFFError(module,
+ "%.1000s: Can not read TIFF directory count",
+ tif->tif_name);
+ return (0);
+ } else
+ _TIFFmemcpy(&dircount, tif->tif_base + off, sizeof (uint16));
+ off += sizeof (uint16);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&dircount);
+ dir = (TIFFDirEntry *)CheckMalloc(tif,
+ dircount * sizeof (TIFFDirEntry), "to read TIFF directory");
+ if (dir == NULL)
+ return (0);
+ if (off + dircount*sizeof (TIFFDirEntry) > tif->tif_size) {
+ TIFFError(module,
+ "%.1000s: Can not read TIFF directory",
+ tif->tif_name);
+ goto bad;
+ } else
+ _TIFFmemcpy(dir, tif->tif_base + off,
+ dircount*sizeof (TIFFDirEntry));
+ off += dircount* sizeof (TIFFDirEntry);
+ if (off + sizeof (uint32) <= tif->tif_size)
+ _TIFFmemcpy(&nextdiroff, tif->tif_base+off, sizeof (uint32));
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&nextdiroff);
+ tif->tif_nextdiroff = nextdiroff;
+
+ tif->tif_flags &= ~TIFF_BEENWRITING; /* reset before new dir */
+ /*
+ * Setup default value and then make a pass over
+ * the fields to check type and tag information,
+ * and to extract info required to size data
+ * structures. A second pass is made afterwards
+ * to read in everthing not taken in the first pass.
+ */
+ td = &tif->tif_dir;
+ /* free any old stuff and reinit */
+ TIFFFreeDirectory(tif);
+ TIFFDefaultDirectory(tif);
+ /*
+ * Electronic Arts writes gray-scale TIFF files
+ * without a PlanarConfiguration directory entry.
+ * Thus we setup a default value here, even though
+ * the TIFF spec says there is no default value.
+ */
+ TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
+
+ /*
+ * Sigh, we must make a separate pass through the
+ * directory for the following reason:
+ *
+ * We must process the Compression tag in the first pass
+ * in order to merge in codec-private tag definitions (otherwise
+ * we may get complaints about unknown tags). However, the
+ * Compression tag may be dependent on the SamplesPerPixel
+ * tag value because older TIFF specs permited Compression
+ * to be written as a SamplesPerPixel-count tag entry.
+ * Thus if we don't first figure out the correct SamplesPerPixel
+ * tag value then we may end up ignoring the Compression tag
+ * value because it has an incorrect count value (if the
+ * true value of SamplesPerPixel is not 1).
+ *
+ * It sure would have been nice if Aldus had really thought
+ * this stuff through carefully.
+ */
+ for (dp = dir, n = dircount; n > 0; n--, dp++) {
+ if (tif->tif_flags & TIFF_SWAB) {
+ TIFFSwabArrayOfShort(&dp->tdir_tag, 2);
+ TIFFSwabArrayOfLong(&dp->tdir_count, 2);
+ }
+ if (dp->tdir_tag == TIFFTAG_SAMPLESPERPIXEL) {
+ if (!TIFFFetchNormalTag(tif, dp))
+ goto bad;
+ dp->tdir_tag = IGNORE;
+ }
+ }
+ /*
+ * First real pass over the directory.
+ */
+ fix = 0;
+ for (dp = dir, n = dircount; n > 0; n--, dp++) {
+
+ /*
+ * Find the field information entry for this tag.
+ * Added check for tags to ignore ... [BFC]
+ */
+ if( TIFFReassignTagToIgnore(TIS_EXTRACT, dp->tdir_tag) )
+ dp->tdir_tag = IGNORE;
+
+ if (fix >= tif->tif_nfields || dp->tdir_tag == IGNORE)
+ continue;
+
+ /*
+ * Silicon Beach (at least) writes unordered
+ * directory tags (violating the spec). Handle
+ * it here, but be obnoxious (maybe they'll fix it?).
+ */
+ if (dp->tdir_tag < tif->tif_fieldinfo[fix]->field_tag) {
+ if (!diroutoforderwarning) {
+ TIFFWarning(module,
+"%.1000s: invalid TIFF directory; tags are not sorted in ascending order",
+ tif->tif_name);
+ diroutoforderwarning = 1;
+ }
+ fix = 0; /* O(n^2) */
+ }
+ while (fix < tif->tif_nfields &&
+ tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag)
+ fix++;
+ if (fix >= tif->tif_nfields ||
+ tif->tif_fieldinfo[fix]->field_tag != dp->tdir_tag) {
+
+ TIFFWarning(module,
+ "%.1000s: unknown field with tag %d (0x%x) encountered",
+ tif->tif_name, dp->tdir_tag, dp->tdir_tag);
+
+ TIFFMergeFieldInfo( tif,
+ _TIFFCreateAnonFieldInfo( tif,
+ dp->tdir_tag,
+ (TIFFDataType) dp->tdir_type ),
+ 1 );
+ fix = 0;
+ while (fix < tif->tif_nfields &&
+ tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag)
+ fix++;
+ }
+ /*
+ * Null out old tags that we ignore.
+ */
+ if (tif->tif_fieldinfo[fix]->field_bit == FIELD_IGNORE) {
+ ignore:
+ dp->tdir_tag = IGNORE;
+ continue;
+ }
+ /*
+ * Check data type.
+ */
+ fip = tif->tif_fieldinfo[fix];
+ while (dp->tdir_type != (u_short) fip->field_type) {
+ if (fip->field_type == TIFF_ANY) /* wildcard */
+ break;
+ fip++, fix++;
+ if (fix == tif->tif_nfields ||
+ fip->field_tag != dp->tdir_tag) {
+ TIFFWarning(module,
+ "%.1000s: wrong data type %d for \"%s\"; tag ignored",
+ tif->tif_name, dp->tdir_type,
+ fip[-1].field_name);
+ goto ignore;
+ }
+ }
+ /*
+ * Check count if known in advance.
+ */
+ if (fip->field_readcount != TIFF_VARIABLE) {
+ uint32 expected = (fip->field_readcount == TIFF_SPP) ?
+ (uint32) td->td_samplesperpixel :
+ (uint32) fip->field_readcount;
+ if (!CheckDirCount(tif, dp, expected))
+ goto ignore;
+ }
+
+ switch (dp->tdir_tag) {
+ case TIFFTAG_COMPRESSION:
+ /*
+ * The 5.0 spec says the Compression tag has
+ * one value, while earlier specs say it has
+ * one value per sample. Because of this, we
+ * accept the tag if one value is supplied.
+ */
+ if (dp->tdir_count == 1) {
+ v = TIFFExtractData(tif,
+ dp->tdir_type, dp->tdir_offset);
+ if (!TIFFSetField(tif, dp->tdir_tag, (int)v))
+ goto bad;
+ break;
+ }
+ if (!TIFFFetchPerSampleShorts(tif, dp, &iv) ||
+ !TIFFSetField(tif, dp->tdir_tag, iv))
+ goto bad;
+ dp->tdir_tag = IGNORE;
+ break;
+ case TIFFTAG_STRIPOFFSETS:
+ case TIFFTAG_STRIPBYTECOUNTS:
+ case TIFFTAG_TILEOFFSETS:
+ case TIFFTAG_TILEBYTECOUNTS:
+ TIFFSetFieldBit(tif, fip->field_bit);
+ break;
+ case TIFFTAG_IMAGEWIDTH:
+ case TIFFTAG_IMAGELENGTH:
+ case TIFFTAG_IMAGEDEPTH:
+ case TIFFTAG_TILELENGTH:
+ case TIFFTAG_TILEWIDTH:
+ case TIFFTAG_TILEDEPTH:
+ case TIFFTAG_PLANARCONFIG:
+ case TIFFTAG_ROWSPERSTRIP:
+ if (!TIFFFetchNormalTag(tif, dp))
+ goto bad;
+ dp->tdir_tag = IGNORE;
+ break;
+ case TIFFTAG_EXTRASAMPLES:
+ (void) TIFFFetchExtraSamples(tif, dp);
+ dp->tdir_tag = IGNORE;
+ break;
+ }
+ }
+
+ /*
+ * Allocate directory structure and setup defaults.
+ */
+ if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) {
+ MissingRequired(tif, "ImageLength");
+ goto bad;
+ }
+ if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) {
+ MissingRequired(tif, "PlanarConfiguration");
+ goto bad;
+ }
+ /*
+ * Setup appropriate structures (by strip or by tile)
+ */
+ if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) {
+ td->td_nstrips = TIFFNumberOfStrips(tif);
+ td->td_tilewidth = td->td_imagewidth;
+ td->td_tilelength = td->td_rowsperstrip;
+ td->td_tiledepth = td->td_imagedepth;
+ tif->tif_flags &= ~TIFF_ISTILED;
+ } else {
+ td->td_nstrips = TIFFNumberOfTiles(tif);
+ tif->tif_flags |= TIFF_ISTILED;
+ }
+ td->td_stripsperimage = td->td_nstrips;
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ td->td_stripsperimage /= td->td_samplesperpixel;
+ if (!TIFFFieldSet(tif, FIELD_STRIPOFFSETS)) {
+ MissingRequired(tif,
+ isTiled(tif) ? "TileOffsets" : "StripOffsets");
+ goto bad;
+ }
+
+ /*
+ * Second pass: extract other information.
+ */
+ for (dp = dir, n = dircount; n > 0; n--, dp++) {
+ if (dp->tdir_tag == IGNORE)
+ continue;
+ switch (dp->tdir_tag) {
+ case TIFFTAG_MINSAMPLEVALUE:
+ case TIFFTAG_MAXSAMPLEVALUE:
+ case TIFFTAG_BITSPERSAMPLE:
+ /*
+ * The 5.0 spec says the Compression tag has
+ * one value, while earlier specs say it has
+ * one value per sample. Because of this, we
+ * accept the tag if one value is supplied.
+ *
+ * The MinSampleValue, MaxSampleValue and
+ * BitsPerSample tags are supposed to be written
+ * as one value/sample, but some vendors incorrectly
+ * write one value only -- so we accept that
+ * as well (yech).
+ */
+ if (dp->tdir_count == 1) {
+ v = TIFFExtractData(tif,
+ dp->tdir_type, dp->tdir_offset);
+ if (!TIFFSetField(tif, dp->tdir_tag, (int)v))
+ goto bad;
+ break;
+ }
+ /* fall thru... */
+ case TIFFTAG_DATATYPE:
+ case TIFFTAG_SAMPLEFORMAT:
+ if (!TIFFFetchPerSampleShorts(tif, dp, &iv) ||
+ !TIFFSetField(tif, dp->tdir_tag, iv))
+ goto bad;
+ break;
+ case TIFFTAG_SMINSAMPLEVALUE:
+ case TIFFTAG_SMAXSAMPLEVALUE:
+ if (!TIFFFetchPerSampleAnys(tif, dp, &dv) ||
+ !TIFFSetField(tif, dp->tdir_tag, dv))
+ goto bad;
+ break;
+ case TIFFTAG_STRIPOFFSETS:
+ case TIFFTAG_TILEOFFSETS:
+ if (!TIFFFetchStripThing(tif, dp,
+ td->td_nstrips, &td->td_stripoffset))
+ goto bad;
+ break;
+ case TIFFTAG_STRIPBYTECOUNTS:
+ case TIFFTAG_TILEBYTECOUNTS:
+ if (!TIFFFetchStripThing(tif, dp,
+ td->td_nstrips, &td->td_stripbytecount))
+ goto bad;
+ break;
+ case TIFFTAG_COLORMAP:
+ case TIFFTAG_TRANSFERFUNCTION:
+ /*
+ * TransferFunction can have either 1x or 3x data
+ * values; Colormap can have only 3x items.
+ */
+ v = 1L<<td->td_bitspersample;
+ if (dp->tdir_tag == TIFFTAG_COLORMAP ||
+ dp->tdir_count != (uint32) v) {
+ if (!CheckDirCount(tif, dp, (uint32)(3*v)))
+ break;
+ }
+ v *= sizeof (uint16);
+ cp = CheckMalloc(tif, dp->tdir_count * sizeof (uint16),
+ "to read \"TransferFunction\" tag");
+ if (cp != NULL) {
+ if (TIFFFetchData(tif, dp, cp)) {
+ /*
+ * This deals with there being only
+ * one array to apply to all samples.
+ */
+ uint32 c =
+ (uint32)1 << td->td_bitspersample;
+ if (dp->tdir_count == c)
+ v = 0;
+ TIFFSetField(tif, dp->tdir_tag,
+ cp, cp+v, cp+2*v);
+ }
+ _TIFFfree(cp);
+ }
+ break;
+ case TIFFTAG_PAGENUMBER:
+ case TIFFTAG_HALFTONEHINTS:
+ case TIFFTAG_YCBCRSUBSAMPLING:
+ case TIFFTAG_DOTRANGE:
+ (void) TIFFFetchShortPair(tif, dp);
+ break;
+#ifdef COLORIMETRY_SUPPORT
+ case TIFFTAG_REFERENCEBLACKWHITE:
+ (void) TIFFFetchRefBlackWhite(tif, dp);
+ break;
+#endif
+/* BEGIN REV 4.0 COMPATIBILITY */
+ case TIFFTAG_OSUBFILETYPE:
+ v = 0;
+ switch (TIFFExtractData(tif, dp->tdir_type,
+ dp->tdir_offset)) {
+ case OFILETYPE_REDUCEDIMAGE:
+ v = FILETYPE_REDUCEDIMAGE;
+ break;
+ case OFILETYPE_PAGE:
+ v = FILETYPE_PAGE;
+ break;
+ }
+ if (v)
+ (void) TIFFSetField(tif,
+ TIFFTAG_SUBFILETYPE, (int)v);
+ break;
+/* END REV 4.0 COMPATIBILITY */
+ default:
+ (void) TIFFFetchNormalTag(tif, dp);
+ break;
+ }
+ }
+ /*
+ * Verify Palette image has a Colormap.
+ */
+ if (td->td_photometric == PHOTOMETRIC_PALETTE &&
+ !TIFFFieldSet(tif, FIELD_COLORMAP)) {
+ MissingRequired(tif, "Colormap");
+ goto bad;
+ }
+ /*
+ * Attempt to deal with a missing StripByteCounts tag.
+ */
+ if (!TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS)) {
+ /*
+ * Some manufacturers violate the spec by not giving
+ * the size of the strips. In this case, assume there
+ * is one uncompressed strip of data.
+ */
+ if ((td->td_planarconfig == PLANARCONFIG_CONTIG &&
+ td->td_nstrips > 1) ||
+ (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
+ td->td_nstrips != td->td_samplesperpixel)) {
+ MissingRequired(tif, "StripByteCounts");
+ goto bad;
+ }
+ TIFFWarning(module,
+ "%.1000s: TIFF directory is missing required "
+ "\"%s\" field, calculating from imagelength",
+ tif->tif_name,
+ _TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name);
+ if (EstimateStripByteCounts(tif, dir, dircount) < 0)
+ goto bad;
+/*
+ * Assume we have wrong StripByteCount value (in case of single strip) in
+ * following cases:
+ * - it is equal to zero along with StripOffset;
+ * - it is larger than file itself (in case of uncompressed image).
+ */
+#define BYTECOUNTLOOKSBAD \
+ ( (td->td_stripbytecount[0] == 0 && td->td_stripoffset[0] != 0) || \
+ (td->td_compression == COMPRESSION_NONE && \
+ td->td_stripbytecount[0] > TIFFGetFileSize(tif) - td->td_stripoffset[0]) )
+ } else if (td->td_nstrips == 1 && BYTECOUNTLOOKSBAD) {
+ /*
+ * Plexus (and others) sometimes give a value
+ * of zero for a tag when they don't know what
+ * the correct value is! Try and handle the
+ * simple case of estimating the size of a one
+ * strip image.
+ */
+ TIFFWarning(module,
+ "%.1000s: Bogus \"%s\" field, ignoring and calculating from imagelength",
+ tif->tif_name,
+ _TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name);
+ if(EstimateStripByteCounts(tif, dir, dircount) < 0)
+ goto bad;
+ }
+ if (dir)
+ _TIFFfree((char *)dir);
+ if (!TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
+ td->td_maxsamplevalue = (uint16)((1L<<td->td_bitspersample)-1);
+ /*
+ * Setup default compression scheme.
+ */
+ if (!TIFFFieldSet(tif, FIELD_COMPRESSION))
+ TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
+ /*
+ * Some manufacturers make life difficult by writing
+ * large amounts of uncompressed data as a single strip.
+ * This is contrary to the recommendations of the spec.
+ * The following makes an attempt at breaking such images
+ * into strips closer to the recommended 8k bytes. A
+ * side effect, however, is that the RowsPerStrip tag
+ * value may be changed.
+ */
+ if (td->td_nstrips == 1 && td->td_compression == COMPRESSION_NONE &&
+ (tif->tif_flags & (TIFF_STRIPCHOP|TIFF_ISTILED)) == TIFF_STRIPCHOP)
+ ChopUpSingleUncompressedStrip(tif);
+ /*
+ * Reinitialize i/o since we are starting on a new directory.
+ */
+ tif->tif_row = (uint32) -1;
+ tif->tif_curstrip = (tstrip_t) -1;
+ tif->tif_col = (uint32) -1;
+ tif->tif_curtile = (ttile_t) -1;
+ tif->tif_tilesize = TIFFTileSize(tif);
+ tif->tif_scanlinesize = TIFFScanlineSize(tif);
+ return (1);
+bad:
+ if (dir)
+ _TIFFfree(dir);
+ return (0);
+}
+
+static int
+EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount)
+{
+ static const char module[] = "EstimateStripByteCounts";
+
+ register TIFFDirEntry *dp;
+ register TIFFDirectory *td = &tif->tif_dir;
+ uint16 i;
+
+ if (td->td_stripbytecount)
+ _TIFFfree(td->td_stripbytecount);
+ td->td_stripbytecount = (uint32*)
+ CheckMalloc(tif, td->td_nstrips * sizeof (uint32),
+ "for \"StripByteCounts\" array");
+ if (td->td_compression != COMPRESSION_NONE) {
+ uint32 space = (uint32)(sizeof (TIFFHeader)
+ + sizeof (uint16)
+ + (dircount * sizeof (TIFFDirEntry))
+ + sizeof (uint32));
+ toff_t filesize = TIFFGetFileSize(tif);
+ uint16 n;
+
+ /* calculate amount of space used by indirect values */
+ for (dp = dir, n = dircount; n > 0; n--, dp++)
+ {
+ uint32 cc = TIFFDataWidth((TIFFDataType) dp->tdir_type);
+ if (cc == 0) {
+ TIFFError(module,
+ "%.1000s: Cannot determine size of unknown tag type %d",
+ tif->tif_name, dp->tdir_type);
+ return -1;
+ }
+ cc = cc * dp->tdir_count;
+ if (cc > sizeof (uint32))
+ space += cc;
+ }
+ space = filesize - space;
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ space /= td->td_samplesperpixel;
+ for (i = 0; i < td->td_nstrips; i++)
+ td->td_stripbytecount[i] = space;
+ /*
+ * This gross hack handles the case were the offset to
+ * the last strip is past the place where we think the strip
+ * should begin. Since a strip of data must be contiguous,
+ * it's safe to assume that we've overestimated the amount
+ * of data in the strip and trim this number back accordingly.
+ */
+ i--;
+ if (((toff_t)(td->td_stripoffset[i]+td->td_stripbytecount[i]))
+ > filesize)
+ td->td_stripbytecount[i] =
+ filesize - td->td_stripoffset[i];
+ } else {
+ uint32 rowbytes = TIFFScanlineSize(tif);
+ uint32 rowsperstrip = td->td_imagelength/td->td_stripsperimage;
+ for (i = 0; i < td->td_nstrips; i++)
+ td->td_stripbytecount[i] = rowbytes*rowsperstrip;
+ }
+ TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
+ if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
+ td->td_rowsperstrip = td->td_imagelength;
+ return 1;
+}
+
+static void
+MissingRequired(TIFF* tif, const char* tagname)
+{
+ static const char module[] = "MissingRequired";
+
+ TIFFError(module,
+ "%.1000s: TIFF directory is missing required \"%s\" field",
+ tif->tif_name, tagname);
+}
+
+/*
+ * Check the count field of a directory
+ * entry against a known value. The caller
+ * is expected to skip/ignore the tag if
+ * there is a mismatch.
+ */
+static int
+CheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count)
+{
+ if (count != dir->tdir_count) {
+ TIFFWarning(tif->tif_name,
+ "incorrect count for field \"%s\" (%lu, expecting %lu); tag ignored",
+ _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name,
+ dir->tdir_count, count);
+ return (0);
+ }
+ return (1);
+}
+
+/*
+ * Fetch a contiguous directory item.
+ */
+static tsize_t
+TIFFFetchData(TIFF* tif, TIFFDirEntry* dir, char* cp)
+{
+ int w = TIFFDataWidth((TIFFDataType) dir->tdir_type);
+ tsize_t cc = dir->tdir_count * w;
+
+ if (!isMapped(tif)) {
+ if (!SeekOK(tif, dir->tdir_offset))
+ goto bad;
+ if (!ReadOK(tif, cp, cc))
+ goto bad;
+ } else {
+ if (dir->tdir_offset + cc > tif->tif_size)
+ goto bad;
+ _TIFFmemcpy(cp, tif->tif_base + dir->tdir_offset, cc);
+ }
+ if (tif->tif_flags & TIFF_SWAB) {
+ switch (dir->tdir_type) {
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ TIFFSwabArrayOfShort((uint16*) cp, dir->tdir_count);
+ break;
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_FLOAT:
+ TIFFSwabArrayOfLong((uint32*) cp, dir->tdir_count);
+ break;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ TIFFSwabArrayOfLong((uint32*) cp, 2*dir->tdir_count);
+ break;
+ case TIFF_DOUBLE:
+ TIFFSwabArrayOfDouble((double*) cp, dir->tdir_count);
+ break;
+ }
+ }
+ return (cc);
+bad:
+ TIFFError(tif->tif_name, "Error fetching data for field \"%s\"",
+ _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
+ return ((tsize_t) 0);
+}
+
+/*
+ * Fetch an ASCII item from the file.
+ */
+static tsize_t
+TIFFFetchString(TIFF* tif, TIFFDirEntry* dir, char* cp)
+{
+ if (dir->tdir_count <= 4) {
+ uint32 l = dir->tdir_offset;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&l);
+ _TIFFmemcpy(cp, &l, dir->tdir_count);
+ return (1);
+ }
+ return (TIFFFetchData(tif, dir, cp));
+}
+
+/*
+ * Convert numerator+denominator to float.
+ */
+static int
+cvtRational(TIFF* tif, TIFFDirEntry* dir, uint32 num, uint32 denom, float* rv)
+{
+ if (denom == 0) {
+ TIFFError(tif->tif_name,
+ "%s: Rational with zero denominator (num = %lu)",
+ _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name, num);
+ return (0);
+ } else {
+ if (dir->tdir_type == TIFF_RATIONAL)
+ *rv = ((float)num / (float)denom);
+ else
+ *rv = ((float)(int32)num / (float)(int32)denom);
+ return (1);
+ }
+}
+
+/*
+ * Fetch a rational item from the file
+ * at offset off and return the value
+ * as a floating point number.
+ */
+static float
+TIFFFetchRational(TIFF* tif, TIFFDirEntry* dir)
+{
+ uint32 l[2];
+ float v;
+
+ return (!TIFFFetchData(tif, dir, (char *)l) ||
+ !cvtRational(tif, dir, l[0], l[1], &v) ? 1.0f : v);
+}
+
+/*
+ * Fetch a single floating point value
+ * from the offset field and return it
+ * as a native float.
+ */
+static float
+TIFFFetchFloat(TIFF* tif, TIFFDirEntry* dir)
+{
+ long l = TIFFExtractData(tif, dir->tdir_type, dir->tdir_offset);
+ float v = *(float*) &l;
+ TIFFCvtIEEEFloatToNative(tif, 1, &v);
+ return (v);
+}
+
+/*
+ * Fetch an array of BYTE or SBYTE values.
+ */
+static int
+TIFFFetchByteArray(TIFF* tif, TIFFDirEntry* dir, uint16* v)
+{
+ if (dir->tdir_count <= 4) {
+ /*
+ * Extract data from offset field.
+ */
+ if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) {
+ if (dir->tdir_type == TIFF_SBYTE)
+ switch (dir->tdir_count) {
+ case 4: v[3] = (signed char)(dir->tdir_offset & 0xff);
+ case 3: v[2] = (signed char)((dir->tdir_offset >> 8) & 0xff);
+ case 2: v[1] = (signed char)((dir->tdir_offset >> 16) & 0xff);
+ case 1: v[0] = (signed char)(dir->tdir_offset >> 24);
+ }
+ else
+ switch (dir->tdir_count) {
+ case 4: v[3] = (uint16)(dir->tdir_offset & 0xff);
+ case 3: v[2] = (uint16)((dir->tdir_offset >> 8) & 0xff);
+ case 2: v[1] = (uint16)((dir->tdir_offset >> 16) & 0xff);
+ case 1: v[0] = (uint16)(dir->tdir_offset >> 24);
+ }
+ } else {
+ if (dir->tdir_type == TIFF_SBYTE)
+ switch (dir->tdir_count) {
+ case 4: v[3] = (signed char)(dir->tdir_offset >> 24);
+ case 3: v[2] = (signed char)((dir->tdir_offset >> 16) & 0xff);
+ case 2: v[1] = (signed char)((dir->tdir_offset >> 8) & 0xff);
+ case 1: v[0] = (signed char)(dir->tdir_offset & 0xff);
+ }
+ else
+ switch (dir->tdir_count) {
+ case 4: v[3] = (uint16)(dir->tdir_offset >> 24);
+ case 3: v[2] = (uint16)((dir->tdir_offset >> 16) & 0xff);
+ case 2: v[1] = (uint16)((dir->tdir_offset >> 8) & 0xff);
+ case 1: v[0] = (uint16)(dir->tdir_offset & 0xff);
+ }
+ }
+ return (1);
+ } else
+ return (TIFFFetchData(tif, dir, (char*) v) != 0); /* XXX */
+}
+
+/*
+ * Fetch an array of SHORT or SSHORT values.
+ */
+static int
+TIFFFetchShortArray(TIFF* tif, TIFFDirEntry* dir, uint16* v)
+{
+ if (dir->tdir_count <= 2) {
+ if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) {
+ switch (dir->tdir_count) {
+ case 2: v[1] = (uint16) (dir->tdir_offset & 0xffff);
+ case 1: v[0] = (uint16) (dir->tdir_offset >> 16);
+ }
+ } else {
+ switch (dir->tdir_count) {
+ case 2: v[1] = (uint16) (dir->tdir_offset >> 16);
+ case 1: v[0] = (uint16) (dir->tdir_offset & 0xffff);
+ }
+ }
+ return (1);
+ } else
+ return (TIFFFetchData(tif, dir, (char *)v) != 0);
+}
+
+/*
+ * Fetch a pair of SHORT or BYTE values.
+ */
+static int
+TIFFFetchShortPair(TIFF* tif, TIFFDirEntry* dir)
+{
+ uint16 v[4];
+ int ok = 0;
+
+ switch (dir->tdir_type) {
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ ok = TIFFFetchShortArray(tif, dir, v);
+ break;
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ ok = TIFFFetchByteArray(tif, dir, v);
+ break;
+ }
+ if (ok)
+ TIFFSetField(tif, dir->tdir_tag, v[0], v[1]);
+ return (ok);
+}
+
+/*
+ * Fetch an array of LONG or SLONG values.
+ */
+static int
+TIFFFetchLongArray(TIFF* tif, TIFFDirEntry* dir, uint32* v)
+{
+ if (dir->tdir_count == 1) {
+ v[0] = dir->tdir_offset;
+ return (1);
+ } else
+ return (TIFFFetchData(tif, dir, (char*) v) != 0);
+}
+
+/*
+ * Fetch an array of RATIONAL or SRATIONAL values.
+ */
+static int
+TIFFFetchRationalArray(TIFF* tif, TIFFDirEntry* dir, float* v)
+{
+ int ok = 0;
+ uint32* l;
+
+ l = (uint32*)CheckMalloc(tif,
+ dir->tdir_count*TIFFDataWidth((TIFFDataType) dir->tdir_type),
+ "to fetch array of rationals");
+ if (l) {
+ if (TIFFFetchData(tif, dir, (char *)l)) {
+ uint32 i;
+ for (i = 0; i < dir->tdir_count; i++) {
+ ok = cvtRational(tif, dir,
+ l[2*i+0], l[2*i+1], &v[i]);
+ if (!ok)
+ break;
+ }
+ }
+ _TIFFfree((char *)l);
+ }
+ return (ok);
+}
+
+/*
+ * Fetch an array of FLOAT values.
+ */
+static int
+TIFFFetchFloatArray(TIFF* tif, TIFFDirEntry* dir, float* v)
+{
+
+ if (dir->tdir_count == 1) {
+ v[0] = *(float*) &dir->tdir_offset;
+ TIFFCvtIEEEFloatToNative(tif, dir->tdir_count, v);
+ return (1);
+ } else if (TIFFFetchData(tif, dir, (char*) v)) {
+ TIFFCvtIEEEFloatToNative(tif, dir->tdir_count, v);
+ return (1);
+ } else
+ return (0);
+}
+
+/*
+ * Fetch an array of DOUBLE values.
+ */
+static int
+TIFFFetchDoubleArray(TIFF* tif, TIFFDirEntry* dir, double* v)
+{
+ if (TIFFFetchData(tif, dir, (char*) v)) {
+ TIFFCvtIEEEDoubleToNative(tif, dir->tdir_count, v);
+ return (1);
+ } else
+ return (0);
+}
+
+/*
+ * Fetch an array of ANY values. The actual values are
+ * returned as doubles which should be able hold all the
+ * types. Yes, there really should be an tany_t to avoid
+ * this potential non-portability ... Note in particular
+ * that we assume that the double return value vector is
+ * large enough to read in any fundamental type. We use
+ * that vector as a buffer to read in the base type vector
+ * and then convert it in place to double (from end
+ * to front of course).
+ */
+static int
+TIFFFetchAnyArray(TIFF* tif, TIFFDirEntry* dir, double* v)
+{
+ int i;
+
+ switch (dir->tdir_type) {
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ if (!TIFFFetchByteArray(tif, dir, (uint16*) v))
+ return (0);
+ if (dir->tdir_type == TIFF_BYTE) {
+ uint16* vp = (uint16*) v;
+ for (i = dir->tdir_count-1; i >= 0; i--)
+ v[i] = vp[i];
+ } else {
+ int16* vp = (int16*) v;
+ for (i = dir->tdir_count-1; i >= 0; i--)
+ v[i] = vp[i];
+ }
+ break;
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ if (!TIFFFetchShortArray(tif, dir, (uint16*) v))
+ return (0);
+ if (dir->tdir_type == TIFF_SHORT) {
+ uint16* vp = (uint16*) v;
+ for (i = dir->tdir_count-1; i >= 0; i--)
+ v[i] = vp[i];
+ } else {
+ int16* vp = (int16*) v;
+ for (i = dir->tdir_count-1; i >= 0; i--)
+ v[i] = vp[i];
+ }
+ break;
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ if (!TIFFFetchLongArray(tif, dir, (uint32*) v))
+ return (0);
+ if (dir->tdir_type == TIFF_LONG) {
+ uint32* vp = (uint32*) v;
+ for (i = dir->tdir_count-1; i >= 0; i--)
+ v[i] = vp[i];
+ } else {
+ int32* vp = (int32*) v;
+ for (i = dir->tdir_count-1; i >= 0; i--)
+ v[i] = vp[i];
+ }
+ break;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ if (!TIFFFetchRationalArray(tif, dir, (float*) v))
+ return (0);
+ { float* vp = (float*) v;
+ for (i = dir->tdir_count-1; i >= 0; i--)
+ v[i] = vp[i];
+ }
+ break;
+ case TIFF_FLOAT:
+ if (!TIFFFetchFloatArray(tif, dir, (float*) v))
+ return (0);
+ { float* vp = (float*) v;
+ for (i = dir->tdir_count-1; i >= 0; i--)
+ v[i] = vp[i];
+ }
+ break;
+ case TIFF_DOUBLE:
+ return (TIFFFetchDoubleArray(tif, dir, (double*) v));
+ default:
+ /* TIFF_NOTYPE */
+ /* TIFF_ASCII */
+ /* TIFF_UNDEFINED */
+ TIFFError(tif->tif_name,
+ "cannot read TIFF_ANY type %d for field \"%s\"",
+ _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
+ return (0);
+ }
+ return (1);
+}
+
+/*
+ * Fetch a tag that is not handled by special case code.
+ */
+static int
+TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp)
+{
+ static const char mesg[] = "to fetch tag value";
+ int ok = 0;
+ const TIFFFieldInfo* fip = _TIFFFieldWithTag(tif, dp->tdir_tag);
+
+ if (dp->tdir_count > 1) { /* array of values */
+ char* cp = NULL;
+
+ switch (dp->tdir_type) {
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ /* NB: always expand BYTE values to shorts */
+ cp = CheckMalloc(tif,
+ dp->tdir_count * sizeof (uint16), mesg);
+ ok = cp && TIFFFetchByteArray(tif, dp, (uint16*) cp);
+ break;
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ cp = CheckMalloc(tif,
+ dp->tdir_count * sizeof (uint16), mesg);
+ ok = cp && TIFFFetchShortArray(tif, dp, (uint16*) cp);
+ break;
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ cp = CheckMalloc(tif,
+ dp->tdir_count * sizeof (uint32), mesg);
+ ok = cp && TIFFFetchLongArray(tif, dp, (uint32*) cp);
+ break;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ cp = CheckMalloc(tif,
+ dp->tdir_count * sizeof (float), mesg);
+ ok = cp && TIFFFetchRationalArray(tif, dp, (float*) cp);
+ break;
+ case TIFF_FLOAT:
+ cp = CheckMalloc(tif,
+ dp->tdir_count * sizeof (float), mesg);
+ ok = cp && TIFFFetchFloatArray(tif, dp, (float*) cp);
+ break;
+ case TIFF_DOUBLE:
+ cp = CheckMalloc(tif,
+ dp->tdir_count * sizeof (double), mesg);
+ ok = cp && TIFFFetchDoubleArray(tif, dp, (double*) cp);
+ break;
+ case TIFF_ASCII:
+ case TIFF_UNDEFINED: /* bit of a cheat... */
+ /*
+ * Some vendors write strings w/o the trailing
+ * NULL byte, so always append one just in case.
+ */
+ cp = CheckMalloc(tif, dp->tdir_count+1, mesg);
+ if( (ok = (cp && TIFFFetchString(tif, dp, cp))) != 0 )
+ cp[dp->tdir_count] = '\0'; /* XXX */
+ break;
+ }
+ if (ok) {
+ ok = (fip->field_passcount ?
+ TIFFSetField(tif, dp->tdir_tag, dp->tdir_count, cp)
+ : TIFFSetField(tif, dp->tdir_tag, cp));
+ }
+ if (cp != NULL)
+ _TIFFfree(cp);
+ } else if (CheckDirCount(tif, dp, 1)) { /* singleton value */
+ switch (dp->tdir_type) {
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ /*
+ * If the tag is also acceptable as a LONG or SLONG
+ * then TIFFSetField will expect an uint32 parameter
+ * passed to it (through varargs). Thus, for machines
+ * where sizeof (int) != sizeof (uint32) we must do
+ * a careful check here. It's hard to say if this
+ * is worth optimizing.
+ *
+ * NB: We use TIFFFieldWithTag here knowing that
+ * it returns us the first entry in the table
+ * for the tag and that that entry is for the
+ * widest potential data type the tag may have.
+ */
+ { TIFFDataType type = fip->field_type;
+ if (type != TIFF_LONG && type != TIFF_SLONG) {
+ uint16 v = (uint16)
+ TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset);
+ ok = (fip->field_passcount ?
+ TIFFSetField(tif, dp->tdir_tag, 1, &v)
+ : TIFFSetField(tif, dp->tdir_tag, v));
+ break;
+ }
+ }
+ /* fall thru... */
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ { uint32 v32 =
+ TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset);
+ ok = (fip->field_passcount ?
+ TIFFSetField(tif, dp->tdir_tag, 1, &v32)
+ : TIFFSetField(tif, dp->tdir_tag, v32));
+ }
+ break;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ case TIFF_FLOAT:
+ { float v = (dp->tdir_type == TIFF_FLOAT ?
+ TIFFFetchFloat(tif, dp)
+ : TIFFFetchRational(tif, dp));
+ ok = (fip->field_passcount ?
+ TIFFSetField(tif, dp->tdir_tag, 1, &v)
+ : TIFFSetField(tif, dp->tdir_tag, v));
+ }
+ break;
+ case TIFF_DOUBLE:
+ { double v;
+ ok = (TIFFFetchDoubleArray(tif, dp, &v) &&
+ (fip->field_passcount ?
+ TIFFSetField(tif, dp->tdir_tag, 1, &v)
+ : TIFFSetField(tif, dp->tdir_tag, v))
+ );
+ }
+ break;
+ case TIFF_ASCII:
+ case TIFF_UNDEFINED: /* bit of a cheat... */
+ { char c[2];
+ if( (ok = (TIFFFetchString(tif, dp, c) != 0)) != 0 ){
+ c[1] = '\0'; /* XXX paranoid */
+ ok = TIFFSetField(tif, dp->tdir_tag, c);
+ }
+ }
+ break;
+ }
+ }
+ return (ok);
+}
+
+#define NITEMS(x) (sizeof (x) / sizeof (x[0]))
+/*
+ * Fetch samples/pixel short values for
+ * the specified tag and verify that
+ * all values are the same.
+ */
+static int
+TIFFFetchPerSampleShorts(TIFF* tif, TIFFDirEntry* dir, int* pl)
+{
+ int samples = tif->tif_dir.td_samplesperpixel;
+ int status = 0;
+
+ if (CheckDirCount(tif, dir, (uint32) samples)) {
+ uint16 buf[10];
+ uint16* v = buf;
+
+ if (samples > NITEMS(buf))
+ v = (uint16*) _TIFFmalloc(samples * sizeof (uint16));
+ if (TIFFFetchShortArray(tif, dir, v)) {
+ int i;
+ for (i = 1; i < samples; i++)
+ if (v[i] != v[0]) {
+ TIFFError(tif->tif_name,
+ "Cannot handle different per-sample values for field \"%s\"",
+ _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
+ goto bad;
+ }
+ *pl = v[0];
+ status = 1;
+ }
+ bad:
+ if (v != buf)
+ _TIFFfree((char*) v);
+ }
+ return (status);
+}
+
+/*
+ * Fetch samples/pixel ANY values for
+ * the specified tag and verify that
+ * all values are the same.
+ */
+static int
+TIFFFetchPerSampleAnys(TIFF* tif, TIFFDirEntry* dir, double* pl)
+{
+ int samples = (int) tif->tif_dir.td_samplesperpixel;
+ int status = 0;
+
+ if (CheckDirCount(tif, dir, (uint32) samples)) {
+ double buf[10];
+ double* v = buf;
+
+ if (samples > NITEMS(buf))
+ v = (double*) _TIFFmalloc(samples * sizeof (double));
+ if (TIFFFetchAnyArray(tif, dir, v)) {
+ int i;
+ for (i = 1; i < samples; i++)
+ if (v[i] != v[0]) {
+ TIFFError(tif->tif_name,
+ "Cannot handle different per-sample values for field \"%s\"",
+ _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
+ goto bad;
+ }
+ *pl = v[0];
+ status = 1;
+ }
+ bad:
+ if (v != buf)
+ _TIFFfree(v);
+ }
+ return (status);
+}
+#undef NITEMS
+
+/*
+ * Fetch a set of offsets or lengths.
+ * While this routine says "strips",
+ * in fact it's also used for tiles.
+ */
+static int
+TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, long nstrips, uint32** lpp)
+{
+ register uint32* lp;
+ int status;
+
+ CheckDirCount(tif, dir, (uint32) nstrips);
+
+ /*
+ * Allocate space for strip information.
+ */
+ if (*lpp == NULL &&
+ (*lpp = (uint32 *)CheckMalloc(tif,
+ nstrips * sizeof (uint32), "for strip array")) == NULL)
+ return (0);
+ lp = *lpp;
+ memset( lp, 0, sizeof(uint32) * nstrips );
+
+ if (dir->tdir_type == (int)TIFF_SHORT) {
+ /*
+ * Handle uint16->uint32 expansion.
+ */
+ uint16* dp = (uint16*) CheckMalloc(tif,
+ dir->tdir_count* sizeof (uint16), "to fetch strip tag");
+ if (dp == NULL)
+ return (0);
+ if( (status = TIFFFetchShortArray(tif, dir, dp)) != 0 ) {
+ int i;
+
+ for( i = 0; i < nstrips && i < (int) dir->tdir_count; i++ )
+ {
+ lp[i] = dp[i];
+ }
+ }
+ _TIFFfree((char*) dp);
+
+ } else if( nstrips != (int) dir->tdir_count ) {
+ /* Special case to correct length */
+
+ uint32* dp = (uint32*) CheckMalloc(tif,
+ dir->tdir_count* sizeof (uint32), "to fetch strip tag");
+ if (dp == NULL)
+ return (0);
+
+ status = TIFFFetchLongArray(tif, dir, dp);
+ if( status != 0 ) {
+ int i;
+
+ for( i = 0; i < nstrips && i < (int) dir->tdir_count; i++ )
+ {
+ lp[i] = dp[i];
+ }
+ }
+
+ _TIFFfree( (char *) dp );
+ } else
+ status = TIFFFetchLongArray(tif, dir, lp);
+
+ return (status);
+}
+
+#define NITEMS(x) (sizeof (x) / sizeof (x[0]))
+/*
+ * Fetch and set the ExtraSamples tag.
+ */
+static int
+TIFFFetchExtraSamples(TIFF* tif, TIFFDirEntry* dir)
+{
+ uint16 buf[10];
+ uint16* v = buf;
+ int status;
+
+ if (dir->tdir_count > NITEMS(buf))
+ v = (uint16*) _TIFFmalloc(dir->tdir_count * sizeof (uint16));
+ if (dir->tdir_type == TIFF_BYTE)
+ status = TIFFFetchByteArray(tif, dir, v);
+ else
+ status = TIFFFetchShortArray(tif, dir, v);
+ if (status)
+ status = TIFFSetField(tif, dir->tdir_tag, dir->tdir_count, v);
+ if (v != buf)
+ _TIFFfree((char*) v);
+ return (status);
+}
+#undef NITEMS
+
+#ifdef COLORIMETRY_SUPPORT
+/*
+ * Fetch and set the RefBlackWhite tag.
+ */
+static int
+TIFFFetchRefBlackWhite(TIFF* tif, TIFFDirEntry* dir)
+{
+ static const char mesg[] = "for \"ReferenceBlackWhite\" array";
+ char* cp;
+ int ok;
+
+ if (dir->tdir_type == TIFF_RATIONAL)
+ return (TIFFFetchNormalTag(tif, dir));
+ /*
+ * Handle LONG's for backward compatibility.
+ */
+ cp = CheckMalloc(tif, dir->tdir_count * sizeof (uint32), mesg);
+ if( (ok = (cp && TIFFFetchLongArray(tif, dir, (uint32*) cp))) != 0) {
+ float* fp = (float*)
+ CheckMalloc(tif, dir->tdir_count * sizeof (float), mesg);
+ if( (ok = (fp != NULL)) != 0 ) {
+ uint32 i;
+ for (i = 0; i < dir->tdir_count; i++)
+ fp[i] = (float)((uint32*) cp)[i];
+ ok = TIFFSetField(tif, dir->tdir_tag, fp);
+ _TIFFfree((char*) fp);
+ }
+ }
+ if (cp)
+ _TIFFfree(cp);
+ return (ok);
+}
+#endif
+
+/*
+ * Replace a single strip (tile) of uncompressed data by
+ * multiple strips (tiles), each approximately 8Kbytes.
+ * This is useful for dealing with large images or
+ * for dealing with machines with a limited amount
+ * memory.
+ */
+static void
+ChopUpSingleUncompressedStrip(TIFF* tif)
+{
+ register TIFFDirectory *td = &tif->tif_dir;
+ uint32 bytecount = td->td_stripbytecount[0];
+ uint32 offset = td->td_stripoffset[0];
+ tsize_t rowbytes = TIFFVTileSize(tif, 1), stripbytes;
+ tstrip_t strip, nstrips, rowsperstrip;
+ uint32* newcounts;
+ uint32* newoffsets;
+
+ /*
+ * Make the rows hold at least one
+ * scanline, but fill 8k if possible.
+ */
+ if (rowbytes > 8192) {
+ stripbytes = rowbytes;
+ rowsperstrip = 1;
+ } else if (rowbytes > 0 ) {
+ rowsperstrip = 8192 / rowbytes;
+ stripbytes = rowbytes * rowsperstrip;
+ }
+ else
+ return;
+
+ /* never increase the number of strips in an image */
+ if (rowsperstrip >= td->td_rowsperstrip)
+ return;
+ nstrips = (tstrip_t) TIFFhowmany(bytecount, stripbytes);
+ newcounts = (uint32*) CheckMalloc(tif, nstrips * sizeof (uint32),
+ "for chopped \"StripByteCounts\" array");
+ newoffsets = (uint32*) CheckMalloc(tif, nstrips * sizeof (uint32),
+ "for chopped \"StripOffsets\" array");
+ if (newcounts == NULL || newoffsets == NULL) {
+ /*
+ * Unable to allocate new strip information, give
+ * up and use the original one strip information.
+ */
+ if (newcounts != NULL)
+ _TIFFfree(newcounts);
+ if (newoffsets != NULL)
+ _TIFFfree(newoffsets);
+ return;
+ }
+ /*
+ * Fill the strip information arrays with
+ * new bytecounts and offsets that reflect
+ * the broken-up format.
+ */
+ for (strip = 0; strip < nstrips; strip++) {
+ if (stripbytes > (tsize_t) bytecount)
+ stripbytes = bytecount;
+ newcounts[strip] = stripbytes;
+ newoffsets[strip] = offset;
+ offset += stripbytes;
+ bytecount -= stripbytes;
+ }
+ /*
+ * Replace old single strip info with multi-strip info.
+ */
+ td->td_stripsperimage = td->td_nstrips = nstrips;
+ TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
+
+ _TIFFfree(td->td_stripbytecount);
+ _TIFFfree(td->td_stripoffset);
+ td->td_stripbytecount = newcounts;
+ td->td_stripoffset = newoffsets;
+}
diff --git a/src/tiff/tif_dirwrite.c b/src/tiff/tif_dirwrite.c
new file mode 100644
index 0000000..9a17e85
--- /dev/null
+++ b/src/tiff/tif_dirwrite.c
@@ -0,0 +1,1233 @@
+/* $Header: /home/terralib/src/tiff/tif_dirwrite.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Directory Write Support Routines.
+ */
+#include "tiffiop.h"
+
+#if HAVE_IEEEFP
+#define TIFFCvtNativeToIEEEFloat(tif, n, fp)
+#define TIFFCvtNativeToIEEEDouble(tif, n, dp)
+#else
+extern void TIFFCvtNativeToIEEEFloat(TIFF*, uint32, float*);
+extern void TIFFCvtNativeToIEEEDouble(TIFF*, uint32, double*);
+#endif
+
+static int TIFFWriteNormalTag(TIFF*, TIFFDirEntry*, const TIFFFieldInfo*);
+static void TIFFSetupShortLong(TIFF*, ttag_t, TIFFDirEntry*, uint32);
+static void TIFFSetupShort(TIFF*, ttag_t, TIFFDirEntry*, uint16);
+static int TIFFSetupShortPair(TIFF*, ttag_t, TIFFDirEntry*);
+static int TIFFWritePerSampleShorts(TIFF*, ttag_t, TIFFDirEntry*);
+static int TIFFWritePerSampleAnys(TIFF*, TIFFDataType, ttag_t, TIFFDirEntry*);
+static int TIFFWriteShortTable(TIFF*, ttag_t, TIFFDirEntry*, uint32, uint16**);
+static int TIFFWriteShortArray(TIFF*,
+ TIFFDataType, ttag_t, TIFFDirEntry*, uint32, uint16*);
+static int TIFFWriteLongArray(TIFF *,
+ TIFFDataType, ttag_t, TIFFDirEntry*, uint32, uint32*);
+static int TIFFWriteRationalArray(TIFF *,
+ TIFFDataType, ttag_t, TIFFDirEntry*, uint32, float*);
+static int TIFFWriteFloatArray(TIFF *,
+ TIFFDataType, ttag_t, TIFFDirEntry*, uint32, float*);
+static int TIFFWriteDoubleArray(TIFF *,
+ TIFFDataType, ttag_t, TIFFDirEntry*, uint32, double*);
+static int TIFFWriteByteArray(TIFF*, TIFFDirEntry*, char*);
+static int TIFFWriteAnyArray(TIFF*,
+ TIFFDataType, ttag_t, TIFFDirEntry*, uint32, double*);
+#ifdef COLORIMETRY_SUPPORT
+static int TIFFWriteTransferFunction(TIFF*, TIFFDirEntry*);
+#endif
+#ifdef CMYK_SUPPORT
+static int TIFFWriteInkNames(TIFF*, TIFFDirEntry*);
+#endif
+static int TIFFWriteData(TIFF*, TIFFDirEntry*, char*);
+static int TIFFLinkDirectory(TIFF*);
+
+#define WriteRationalPair(type, tag1, v1, tag2, v2) { \
+ if (!TIFFWriteRational(tif, type, tag1, dir, v1)) \
+ goto bad; \
+ if (!TIFFWriteRational(tif, type, tag2, dir+1, v2)) \
+ goto bad; \
+ dir++; \
+}
+#define TIFFWriteRational(tif, type, tag, dir, v) \
+ TIFFWriteRationalArray((tif), (type), (tag), (dir), 1, &(v))
+#ifndef TIFFWriteRational
+static int TIFFWriteRational(TIFF*,
+ TIFFDataType, ttag_t, TIFFDirEntry*, float);
+#endif
+
+/*
+ * Write the contents of the current directory
+ * to the specified file. This routine doesn't
+ * handle overwriting a directory with auxiliary
+ * storage that's been changed.
+ */
+static int
+_TIFFWriteDirectory(TIFF* tif, int done)
+{
+ uint16 dircount;
+ toff_t diroff;
+ ttag_t tag;
+ uint32 nfields;
+ tsize_t dirsize;
+ char* data;
+ TIFFDirEntry* dir;
+ TIFFDirectory* td;
+ u_long b, fields[FIELD_SETLONGS];
+ int fi, nfi;
+
+ if (tif->tif_mode == O_RDONLY)
+ return (1);
+ /*
+ * Clear write state so that subsequent images with
+ * different characteristics get the right buffers
+ * setup for them.
+ */
+ if (done)
+ {
+ if (tif->tif_flags & TIFF_POSTENCODE) {
+ tif->tif_flags &= ~TIFF_POSTENCODE;
+ if (!(*tif->tif_postencode)(tif)) {
+ TIFFError(tif->tif_name,
+ "Error post-encoding before directory write");
+ return (0);
+ }
+ }
+ (*tif->tif_close)(tif); /* shutdown encoder */
+ /*
+ * Flush any data that might have been written
+ * by the compression close+cleanup routines.
+ */
+ if (tif->tif_rawcc > 0 && !TIFFFlushData1(tif)) {
+ TIFFError(tif->tif_name,
+ "Error flushing data before directory write");
+ return (0);
+ }
+ if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) {
+ _TIFFfree(tif->tif_rawdata);
+ tif->tif_rawdata = NULL;
+ tif->tif_rawcc = 0;
+ tif->tif_rawdatasize = 0;
+ }
+ tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP);
+ }
+
+ td = &tif->tif_dir;
+ /*
+ * Size the directory so that we can calculate
+ * offsets for the data items that aren't kept
+ * in-place in each field.
+ */
+ nfields = 0;
+ for (b = 0; b <= FIELD_LAST; b++)
+ if (TIFFFieldSet(tif, b) && b != FIELD_CUSTOM)
+ nfields += (b < FIELD_SUBFILETYPE ? 2 : 1);
+ nfields += td->td_customValueCount;
+ dirsize = nfields * sizeof (TIFFDirEntry);
+ data = (char*) _TIFFmalloc(dirsize);
+ if (data == NULL) {
+ TIFFError(tif->tif_name,
+ "Cannot write directory, out of space");
+ return (0);
+ }
+ /*
+ * Directory hasn't been placed yet, put
+ * it at the end of the file and link it
+ * into the existing directory structure.
+ */
+ if (tif->tif_diroff == 0 && !TIFFLinkDirectory(tif))
+ goto bad;
+ tif->tif_dataoff = (toff_t)(
+ tif->tif_diroff + sizeof (uint16) + dirsize + sizeof (toff_t));
+ if (tif->tif_dataoff & 1)
+ tif->tif_dataoff++;
+ (void) TIFFSeekFile(tif, tif->tif_dataoff, SEEK_SET);
+ tif->tif_curdir++;
+ dir = (TIFFDirEntry*) data;
+ /*
+ * Setup external form of directory
+ * entries and write data items.
+ */
+ _TIFFmemcpy(fields, td->td_fieldsset, sizeof (fields));
+ /*
+ * Write out ExtraSamples tag only if
+ * extra samples are present in the data.
+ */
+ if (FieldSet(fields, FIELD_EXTRASAMPLES) && !td->td_extrasamples) {
+ ResetFieldBit(fields, FIELD_EXTRASAMPLES);
+ nfields--;
+ dirsize -= sizeof (TIFFDirEntry);
+ } /*XXX*/
+ for (fi = 0, nfi = tif->tif_nfields; nfi > 0; nfi--, fi++) {
+ const TIFFFieldInfo* fip = tif->tif_fieldinfo[fi];
+
+ /*
+ ** For custom fields, we test to see if the custom field
+ ** is set or not. For normal fields, we just use the
+ ** FieldSet test.
+ */
+ if( fip->field_bit == FIELD_CUSTOM )
+ {
+ int ci, is_set = FALSE;
+
+ for( ci = 0; ci < td->td_customValueCount; ci++ )
+ is_set |= (td->td_customValues[ci].info == fip);
+
+ if( !is_set )
+ continue;
+ }
+ else if (!FieldSet(fields, fip->field_bit))
+ continue;
+
+
+ /*
+ ** Handle other fields.
+ */
+ switch (fip->field_bit)
+ {
+ case FIELD_STRIPOFFSETS:
+ /*
+ * We use one field bit for both strip and tile
+
+ * offsets, and so must be careful in selecting
+ * the appropriate field descriptor (so that tags
+ * are written in sorted order).
+ */
+ tag = isTiled(tif) ?
+ TIFFTAG_TILEOFFSETS : TIFFTAG_STRIPOFFSETS;
+ if (tag != fip->field_tag)
+ continue;
+ if (!TIFFWriteLongArray(tif, TIFF_LONG, tag, dir,
+ (uint32) td->td_nstrips, td->td_stripoffset))
+ goto bad;
+ break;
+ case FIELD_STRIPBYTECOUNTS:
+ /*
+ * We use one field bit for both strip and tile
+ * byte counts, and so must be careful in selecting
+ * the appropriate field descriptor (so that tags
+ * are written in sorted order).
+ */
+ tag = isTiled(tif) ?
+ TIFFTAG_TILEBYTECOUNTS : TIFFTAG_STRIPBYTECOUNTS;
+ if (tag != fip->field_tag)
+ continue;
+ if (!TIFFWriteLongArray(tif, TIFF_LONG, tag, dir,
+ (uint32) td->td_nstrips, td->td_stripbytecount))
+ goto bad;
+ break;
+ case FIELD_ROWSPERSTRIP:
+ TIFFSetupShortLong(tif, TIFFTAG_ROWSPERSTRIP,
+ dir, td->td_rowsperstrip);
+ break;
+ case FIELD_COLORMAP:
+ if (!TIFFWriteShortTable(tif, TIFFTAG_COLORMAP, dir,
+ 3, td->td_colormap))
+ goto bad;
+ break;
+ case FIELD_IMAGEDIMENSIONS:
+ TIFFSetupShortLong(tif, TIFFTAG_IMAGEWIDTH,
+ dir++, td->td_imagewidth);
+ TIFFSetupShortLong(tif, TIFFTAG_IMAGELENGTH,
+ dir, td->td_imagelength);
+ break;
+ case FIELD_TILEDIMENSIONS:
+ TIFFSetupShortLong(tif, TIFFTAG_TILEWIDTH,
+ dir++, td->td_tilewidth);
+ TIFFSetupShortLong(tif, TIFFTAG_TILELENGTH,
+ dir, td->td_tilelength);
+ break;
+ case FIELD_COMPRESSION:
+ TIFFSetupShort(tif, TIFFTAG_COMPRESSION,
+ dir, td->td_compression);
+ break;
+ case FIELD_PHOTOMETRIC:
+ TIFFSetupShort(tif, TIFFTAG_PHOTOMETRIC,
+ dir, td->td_photometric);
+ break;
+ case FIELD_POSITION:
+ WriteRationalPair(TIFF_RATIONAL,
+ TIFFTAG_XPOSITION, td->td_xposition,
+ TIFFTAG_YPOSITION, td->td_yposition);
+ break;
+ case FIELD_RESOLUTION:
+ WriteRationalPair(TIFF_RATIONAL,
+ TIFFTAG_XRESOLUTION, td->td_xresolution,
+ TIFFTAG_YRESOLUTION, td->td_yresolution);
+ break;
+ case FIELD_BITSPERSAMPLE:
+ case FIELD_MINSAMPLEVALUE:
+ case FIELD_MAXSAMPLEVALUE:
+ case FIELD_SAMPLEFORMAT:
+ if (!TIFFWritePerSampleShorts(tif, fip->field_tag, dir))
+ goto bad;
+ break;
+ case FIELD_SMINSAMPLEVALUE:
+ case FIELD_SMAXSAMPLEVALUE:
+ if (!TIFFWritePerSampleAnys(tif,
+ _TIFFSampleToTagType(tif), fip->field_tag, dir))
+ goto bad;
+ break;
+ case FIELD_PAGENUMBER:
+ case FIELD_HALFTONEHINTS:
+#ifdef YCBCR_SUPPORT
+ case FIELD_YCBCRSUBSAMPLING:
+#endif
+#ifdef CMYK_SUPPORT
+ case FIELD_DOTRANGE:
+#endif
+ if (!TIFFSetupShortPair(tif, fip->field_tag, dir))
+ goto bad;
+ break;
+#ifdef CMYK_SUPPORT
+ case FIELD_INKNAMES:
+ if (!TIFFWriteInkNames(tif, dir))
+ goto bad;
+ break;
+#endif
+#ifdef COLORIMETRY_SUPPORT
+ case FIELD_TRANSFERFUNCTION:
+ if (!TIFFWriteTransferFunction(tif, dir))
+ goto bad;
+ break;
+#endif
+#if SUBIFD_SUPPORT
+ case FIELD_SUBIFD:
+ if (!TIFFWriteNormalTag(tif, dir, fip))
+ goto bad;
+ /*
+ * Total hack: if this directory includes a SubIFD
+ * tag then force the next <n> directories to be
+ * written as ``sub directories'' of this one. This
+ * is used to write things like thumbnails and
+ * image masks that one wants to keep out of the
+ * normal directory linkage access mechanism.
+ */
+ if (dir->tdir_count > 0) {
+ tif->tif_flags |= TIFF_INSUBIFD;
+ tif->tif_nsubifd = (uint16) dir->tdir_count;
+ if (dir->tdir_count > 1)
+ tif->tif_subifdoff = dir->tdir_offset;
+ else
+ tif->tif_subifdoff = (uint32)(
+ tif->tif_diroff
+ + sizeof (uint16)
+ + ((char*)&dir->tdir_offset-data));
+ }
+ break;
+#endif
+ default:
+ if (!TIFFWriteNormalTag(tif, dir, fip))
+ goto bad;
+ break;
+ }
+ dir++;
+
+ if( fip->field_bit != FIELD_CUSTOM )
+ ResetFieldBit(fields, fip->field_bit);
+ }
+
+ /*
+ * Write directory.
+ */
+ dircount = (uint16) nfields;
+ diroff = (uint32) tif->tif_nextdiroff;
+ if (tif->tif_flags & TIFF_SWAB) {
+ /*
+ * The file's byte order is opposite to the
+ * native machine architecture. We overwrite
+ * the directory information with impunity
+ * because it'll be released below after we
+ * write it to the file. Note that all the
+ * other tag construction routines assume that
+ * we do this byte-swapping; i.e. they only
+ * byte-swap indirect data.
+ */
+ for (dir = (TIFFDirEntry*) data; dircount; dir++, dircount--) {
+ TIFFSwabArrayOfShort(&dir->tdir_tag, 2);
+ TIFFSwabArrayOfLong(&dir->tdir_count, 2);
+ }
+ dircount = (uint16) nfields;
+ TIFFSwabShort(&dircount);
+ TIFFSwabLong(&diroff);
+ }
+ (void) TIFFSeekFile(tif, tif->tif_diroff, SEEK_SET);
+ if (!WriteOK(tif, &dircount, sizeof (dircount))) {
+ TIFFError(tif->tif_name, "Error writing directory count");
+ goto bad;
+ }
+ if (!WriteOK(tif, data, dirsize)) {
+ TIFFError(tif->tif_name, "Error writing directory contents");
+ goto bad;
+ }
+ if (!WriteOK(tif, &diroff, sizeof (diroff))) {
+ TIFFError(tif->tif_name, "Error writing directory link");
+ goto bad;
+ }
+ if (done) {
+ TIFFFreeDirectory(tif);
+ tif->tif_flags &= ~TIFF_DIRTYDIRECT;
+ (*tif->tif_cleanup)(tif);
+
+ /*
+ * Reset directory-related state for subsequent
+ * directories.
+ */
+ TIFFCreateDirectory(tif);
+ }
+ _TIFFfree(data);
+ return (1);
+bad:
+ _TIFFfree(data);
+ return (0);
+}
+#undef WriteRationalPair
+
+int
+TIFFWriteDirectory(TIFF* tif)
+{
+ return _TIFFWriteDirectory(tif, TRUE);
+}
+
+/*
+ * Similar to TIFFWriteDirectory(), writes the directory out
+ * but leaves all data structures in memory so that it can be
+ * written again. This will make a partially written TIFF file
+ * readable before it is successfully completed/closed.
+ */
+int
+TIFFCheckpointDirectory(TIFF* tif)
+{
+ int rc;
+ /* Setup the strips arrays, if they haven't already been. */
+ if (tif->tif_dir.td_stripoffset == NULL)
+ (void) TIFFSetupStrips(tif);
+ rc = _TIFFWriteDirectory(tif, FALSE);
+ (void) TIFFSetWriteOffset(tif, TIFFSeekFile(tif, 0, SEEK_END));
+ return rc;
+}
+
+/*
+ * Process tags that are not special cased.
+ */
+static int
+TIFFWriteNormalTag(TIFF* tif, TIFFDirEntry* dir, const TIFFFieldInfo* fip)
+{
+ u_short wc = (u_short) fip->field_writecount;
+ uint32 wc2;
+
+ dir->tdir_tag = (uint16) fip->field_tag;
+ dir->tdir_type = (u_short) fip->field_type;
+ dir->tdir_count = wc;
+#define WRITEF(x,y) x(tif, fip->field_type, fip->field_tag, dir, wc, y)
+ switch (fip->field_type) {
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ if (wc > 1) {
+ uint16* wp;
+ if (wc == (u_short) TIFF_VARIABLE
+ || fip->field_passcount)
+ TIFFGetField(tif, fip->field_tag, &wc, &wp);
+ else
+ TIFFGetField(tif, fip->field_tag, &wp);
+ if (!WRITEF(TIFFWriteShortArray, wp))
+ return (0);
+ } else {
+ if (fip->field_passcount) {
+ uint16* wp;
+ TIFFGetField(tif, fip->field_tag, &wc, &wp);
+ if (!WRITEF(TIFFWriteShortArray, wp))
+ return 0;
+ } else {
+ uint16 sv;
+ TIFFGetField(tif, fip->field_tag, &sv);
+ dir->tdir_offset =
+ TIFFInsertData(tif, dir->tdir_type, sv);
+ }
+ }
+ break;
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_IFD:
+ if (wc > 1) {
+ uint32* lp;
+ if (wc == (u_short) TIFF_VARIABLE
+ || fip->field_passcount)
+ TIFFGetField(tif, fip->field_tag, &wc, &lp);
+ else
+ TIFFGetField(tif, fip->field_tag, &lp);
+ if (!WRITEF(TIFFWriteLongArray, lp))
+ return (0);
+ } else {
+ if (fip->field_passcount) {
+ uint32* lp;
+ TIFFGetField(tif, fip->field_tag, &wc, &lp);
+ if (!WRITEF(TIFFWriteLongArray, lp))
+ return 0;
+ } else {
+ /* XXX handle LONG->SHORT conversion */
+ TIFFGetField(tif, fip->field_tag,
+ &dir->tdir_offset);
+ }
+ }
+ break;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ if (wc > 1) {
+ float* fp;
+ if (wc == (u_short) TIFF_VARIABLE
+ || fip->field_passcount)
+ TIFFGetField(tif, fip->field_tag, &wc, &fp);
+ else
+ TIFFGetField(tif, fip->field_tag, &fp);
+ if (!WRITEF(TIFFWriteRationalArray, fp))
+ return (0);
+ } else {
+ if (fip->field_passcount) {
+ float* fp;
+ TIFFGetField(tif, fip->field_tag, &wc, &fp);
+ if (!WRITEF(TIFFWriteRationalArray, fp))
+ return 0;
+ } else {
+ float fv;
+ TIFFGetField(tif, fip->field_tag, &fv);
+ if (!WRITEF(TIFFWriteRationalArray, &fv))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_FLOAT:
+ if (wc > 1) {
+ float* fp;
+ if (wc == (u_short) TIFF_VARIABLE
+ || fip->field_passcount)
+ TIFFGetField(tif, fip->field_tag, &wc, &fp);
+ else
+ TIFFGetField(tif, fip->field_tag, &fp);
+ if (!WRITEF(TIFFWriteFloatArray, fp))
+ return (0);
+ } else {
+ if (fip->field_passcount) {
+ float* fp;
+ TIFFGetField(tif, fip->field_tag, &wc, &fp);
+ if (!WRITEF(TIFFWriteFloatArray, fp))
+ return 0;
+ } else {
+ float fv;
+ TIFFGetField(tif, fip->field_tag, &fv);
+ if (!WRITEF(TIFFWriteFloatArray, &fv))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_DOUBLE:
+ if (wc > 1) {
+ double* dp;
+ if (wc == (u_short) TIFF_VARIABLE
+ || fip->field_passcount)
+ TIFFGetField(tif, fip->field_tag, &wc, &dp);
+ else
+ TIFFGetField(tif, fip->field_tag, &dp);
+ if (!WRITEF(TIFFWriteDoubleArray, dp))
+ return (0);
+ } else {
+ if (fip->field_passcount) {
+ double* dp;
+ TIFFGetField(tif, fip->field_tag, &wc, &dp);
+ if (!WRITEF(TIFFWriteDoubleArray, dp))
+ return 0;
+ } else {
+ double dv;
+ TIFFGetField(tif, fip->field_tag, &dv);
+ if (!WRITEF(TIFFWriteDoubleArray, &dv))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_ASCII:
+ { char* cp;
+ TIFFGetField(tif, fip->field_tag, &cp);
+ dir->tdir_count = (uint32) (strlen(cp) + 1);
+ if (!TIFFWriteByteArray(tif, dir, cp))
+ return (0);
+ }
+ break;
+
+ /* added based on patch request from MARTIN.MCBRIDE.MM at agfa.co.uk,
+ correctness not verified (FW, 99/08) */
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ if (wc > 1) {
+ char* cp;
+ if (wc == (u_short) TIFF_VARIABLE
+ || fip->field_passcount) {
+ TIFFGetField(tif, fip->field_tag, &wc, &cp);
+ dir->tdir_count = wc;
+ } else if (wc == (u_short) TIFF_VARIABLE2) {
+ TIFFGetField(tif, fip->field_tag, &wc2, &cp);
+ dir->tdir_count = wc2;
+ } else
+ TIFFGetField(tif, fip->field_tag, &cp);
+ if (!TIFFWriteByteArray(tif, dir, cp))
+ return (0);
+ } else {
+ if (fip->field_passcount) {
+ char* cp;
+ TIFFGetField(tif, fip->field_tag, &wc, &cp);
+ dir->tdir_count = wc;
+ if (!TIFFWriteByteArray(tif, dir, cp))
+ return 0;
+ } else {
+ char cv;
+ TIFFGetField(tif, fip->field_tag, &cv);
+ if (!TIFFWriteByteArray(tif, dir, &cv))
+ return (0);
+ }
+ }
+ break;
+
+ case TIFF_UNDEFINED:
+ { char* cp;
+ if (wc == (u_short) TIFF_VARIABLE) {
+ TIFFGetField(tif, fip->field_tag, &wc, &cp);
+ dir->tdir_count = wc;
+ } else if (wc == (u_short) TIFF_VARIABLE2) {
+ TIFFGetField(tif, fip->field_tag, &wc2, &cp);
+ dir->tdir_count = wc2;
+ } else
+ TIFFGetField(tif, fip->field_tag, &cp);
+ if (!TIFFWriteByteArray(tif, dir, cp))
+ return (0);
+ }
+ break;
+
+ case TIFF_NOTYPE:
+ break;
+ }
+ return (1);
+}
+#undef WRITEF
+
+/*
+ * Setup a directory entry with either a SHORT
+ * or LONG type according to the value.
+ */
+static void
+TIFFSetupShortLong(TIFF* tif, ttag_t tag, TIFFDirEntry* dir, uint32 v)
+{
+ dir->tdir_tag = (uint16) tag;
+ dir->tdir_count = 1;
+ if (v > 0xffffL) {
+ dir->tdir_type = (short) TIFF_LONG;
+ dir->tdir_offset = v;
+ } else {
+ dir->tdir_type = (short) TIFF_SHORT;
+ dir->tdir_offset = TIFFInsertData(tif, (int) TIFF_SHORT, v);
+ }
+}
+
+/*
+ * Setup a SHORT directory entry
+ */
+static void
+TIFFSetupShort(TIFF* tif, ttag_t tag, TIFFDirEntry* dir, uint16 v)
+{
+ dir->tdir_tag = (uint16) tag;
+ dir->tdir_count = 1;
+ dir->tdir_type = (short) TIFF_SHORT;
+ dir->tdir_offset = TIFFInsertData(tif, (int) TIFF_SHORT, v);
+}
+#undef MakeShortDirent
+
+#ifndef TIFFWriteRational
+/*
+ * Setup a RATIONAL directory entry and
+ * write the associated indirect value.
+ */
+static int
+TIFFWriteRational(TIFF* tif,
+ TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, float v)
+{
+ return (TIFFWriteRationalArray(tif, type, tag, dir, 1, &v));
+}
+#endif
+
+#define NITEMS(x) (sizeof (x) / sizeof (x[0]))
+/*
+ * Setup a directory entry that references a
+ * samples/pixel array of SHORT values and
+ * (potentially) write the associated indirect
+ * values.
+ */
+static int
+TIFFWritePerSampleShorts(TIFF* tif, ttag_t tag, TIFFDirEntry* dir)
+{
+ uint16 buf[10], v;
+ uint16* w = buf;
+ int i, status, samples = tif->tif_dir.td_samplesperpixel;
+
+ if (samples > NITEMS(buf))
+ w = (uint16*) _TIFFmalloc(samples * sizeof (uint16));
+ TIFFGetField(tif, tag, &v);
+ for (i = 0; i < samples; i++)
+ w[i] = v;
+ status = TIFFWriteShortArray(tif, TIFF_SHORT, tag, dir, samples, w);
+ if (w != buf)
+ _TIFFfree((char*) w);
+ return (status);
+}
+
+/*
+ * Setup a directory entry that references a samples/pixel array of ``type''
+ * values and (potentially) write the associated indirect values. The source
+ * data from TIFFGetField() for the specified tag must be returned as double.
+ */
+static int
+TIFFWritePerSampleAnys(TIFF* tif,
+ TIFFDataType type, ttag_t tag, TIFFDirEntry* dir)
+{
+ double buf[10], v;
+ double* w = buf;
+ int i, status;
+ int samples = (int) tif->tif_dir.td_samplesperpixel;
+
+ if (samples > NITEMS(buf))
+ w = (double*) _TIFFmalloc(samples * sizeof (double));
+ TIFFGetField(tif, tag, &v);
+ for (i = 0; i < samples; i++)
+ w[i] = v;
+ status = TIFFWriteAnyArray(tif, type, tag, dir, samples, w);
+ if (w != buf)
+ _TIFFfree(w);
+ return (status);
+}
+#undef NITEMS
+
+/*
+ * Setup a pair of shorts that are returned by
+ * value, rather than as a reference to an array.
+ */
+static int
+TIFFSetupShortPair(TIFF* tif, ttag_t tag, TIFFDirEntry* dir)
+{
+ uint16 v[2];
+
+ TIFFGetField(tif, tag, &v[0], &v[1]);
+ return (TIFFWriteShortArray(tif, TIFF_SHORT, tag, dir, 2, v));
+}
+
+/*
+ * Setup a directory entry for an NxM table of shorts,
+ * where M is known to be 2**bitspersample, and write
+ * the associated indirect data.
+ */
+static int
+TIFFWriteShortTable(TIFF* tif,
+ ttag_t tag, TIFFDirEntry* dir, uint32 n, uint16** table)
+{
+ uint32 i, off;
+
+ dir->tdir_tag = (uint16) tag;
+ dir->tdir_type = (short) TIFF_SHORT;
+ /* XXX -- yech, fool TIFFWriteData */
+ dir->tdir_count = (uint32) (1L<<tif->tif_dir.td_bitspersample);
+ off = tif->tif_dataoff;
+ for (i = 0; i < n; i++)
+ if (!TIFFWriteData(tif, dir, (char *)table[i]))
+ return (0);
+ dir->tdir_count *= n;
+ dir->tdir_offset = off;
+ return (1);
+}
+
+/*
+ * Write/copy data associated with an ASCII or opaque tag value.
+ */
+static int
+TIFFWriteByteArray(TIFF* tif, TIFFDirEntry* dir, char* cp)
+{
+ if (dir->tdir_count > 4) {
+ if (!TIFFWriteData(tif, dir, cp))
+ return (0);
+ } else
+ _TIFFmemcpy(&dir->tdir_offset, cp, dir->tdir_count);
+ return (1);
+}
+
+/*
+ * Setup a directory entry of an array of SHORT
+ * or SSHORT and write the associated indirect values.
+ */
+static int
+TIFFWriteShortArray(TIFF* tif,
+ TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, uint16* v)
+{
+ dir->tdir_tag = (uint16) tag;
+ dir->tdir_type = (short) type;
+ dir->tdir_count = n;
+ if (n <= 2) {
+ if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) {
+ dir->tdir_offset = (uint32) ((long) v[0] << 16);
+ if (n == 2)
+ dir->tdir_offset |= v[1] & 0xffff;
+ } else {
+ dir->tdir_offset = v[0] & 0xffff;
+ if (n == 2)
+ dir->tdir_offset |= (long) v[1] << 16;
+ }
+ return (1);
+ } else
+ return (TIFFWriteData(tif, dir, (char*) v));
+}
+
+/*
+ * Setup a directory entry of an array of LONG
+ * or SLONG and write the associated indirect values.
+ */
+static int
+TIFFWriteLongArray(TIFF* tif,
+ TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, uint32* v)
+{
+ dir->tdir_tag = (uint16) tag;
+ dir->tdir_type = (short) type;
+ dir->tdir_count = n;
+ if (n == 1) {
+ dir->tdir_offset = v[0];
+ return (1);
+ } else
+ return (TIFFWriteData(tif, dir, (char*) v));
+}
+
+/*
+ * Setup a directory entry of an array of RATIONAL
+ * or SRATIONAL and write the associated indirect values.
+ */
+static int
+TIFFWriteRationalArray(TIFF* tif,
+ TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, float* v)
+{
+ uint32 i;
+ uint32* t;
+ int status;
+
+ dir->tdir_tag = (uint16) tag;
+ dir->tdir_type = (short) type;
+ dir->tdir_count = n;
+ t = (uint32*) _TIFFmalloc(2*n * sizeof (uint32));
+ for (i = 0; i < n; i++) {
+ float fv = v[i];
+ int sign = 1;
+ uint32 den;
+
+ if (fv < 0) {
+ if (type == TIFF_RATIONAL) {
+ TIFFWarning(tif->tif_name,
+ "\"%s\": Information lost writing value (%g) as (unsigned) RATIONAL",
+ _TIFFFieldWithTag(tif,tag)->field_name, fv);
+ fv = 0;
+ } else
+ fv = -fv, sign = -1;
+ }
+ den = 1L;
+ if (fv > 0) {
+ while (fv < 1L<<(31-3) && den < 1L<<(31-3))
+ fv *= 1<<3, den *= 1L<<3;
+ }
+ t[2*i+0] = (uint32) (sign * (fv + 0.5));
+ t[2*i+1] = den;
+ }
+ status = TIFFWriteData(tif, dir, (char *)t);
+ _TIFFfree((char*) t);
+ return (status);
+}
+
+static int
+TIFFWriteFloatArray(TIFF* tif,
+ TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, float* v)
+{
+ dir->tdir_tag = (uint16) tag;
+ dir->tdir_type = (short) type;
+ dir->tdir_count = n;
+ TIFFCvtNativeToIEEEFloat(tif, n, v);
+ if (n == 1) {
+ dir->tdir_offset = *(uint32*) &v[0];
+ return (1);
+ } else
+ return (TIFFWriteData(tif, dir, (char*) v));
+}
+
+static int
+TIFFWriteDoubleArray(TIFF* tif,
+ TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, double* v)
+{
+ dir->tdir_tag = (uint16) tag;
+ dir->tdir_type = (short) type;
+ dir->tdir_count = n;
+ TIFFCvtNativeToIEEEDouble(tif, n, v);
+ return (TIFFWriteData(tif, dir, (char*) v));
+}
+
+/*
+ * Write an array of ``type'' values for a specified tag (i.e. this is a tag
+ * which is allowed to have different types, e.g. SMaxSampleType).
+ * Internally the data values are represented as double since a double can
+ * hold any of the TIFF tag types (yes, this should really be an abstract
+ * type tany_t for portability). The data is converted into the specified
+ * type in a temporary buffer and then handed off to the appropriate array
+ * writer.
+ */
+static int
+TIFFWriteAnyArray(TIFF* tif,
+ TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, double* v)
+{
+ char buf[10 * sizeof(double)];
+ char* w = buf;
+ int i, status = 0;
+
+ if (n * TIFFDataWidth(type) > sizeof buf)
+ w = (char*) _TIFFmalloc(n * TIFFDataWidth(type));
+ switch (type) {
+ case TIFF_BYTE:
+ { uint8* bp = (uint8*) w;
+ for (i = 0; i < (int) n; i++)
+ bp[i] = (uint8) v[i];
+ dir->tdir_tag = (uint16) tag;
+ dir->tdir_type = (short) type;
+ dir->tdir_count = n;
+ if (!TIFFWriteByteArray(tif, dir, (char*) bp))
+ goto out;
+ }
+ break;
+ case TIFF_SBYTE:
+ { int8* bp = (int8*) w;
+ for (i = 0; i < (int) n; i++)
+ bp[i] = (int8) v[i];
+ dir->tdir_tag = (uint16) tag;
+ dir->tdir_type = (short) type;
+ dir->tdir_count = n;
+ if (!TIFFWriteByteArray(tif, dir, (char*) bp))
+ goto out;
+ }
+ break;
+ case TIFF_SHORT:
+ { uint16* bp = (uint16*) w;
+ for (i = 0; i < (int) n; i++)
+ bp[i] = (uint16) v[i];
+ if (!TIFFWriteShortArray(tif, type, tag, dir, n, (uint16*)bp))
+ goto out;
+ }
+ break;
+ case TIFF_SSHORT:
+ { int16* bp = (int16*) w;
+ for (i = 0; i < (int) n; i++)
+ bp[i] = (int16) v[i];
+ if (!TIFFWriteShortArray(tif, type, tag, dir, n, (uint16*)bp))
+ goto out;
+ }
+ break;
+ case TIFF_LONG:
+ { uint32* bp = (uint32*) w;
+ for (i = 0; i < (int) n; i++)
+ bp[i] = (uint32) v[i];
+ if (!TIFFWriteLongArray(tif, type, tag, dir, n, bp))
+ goto out;
+ }
+ break;
+ case TIFF_SLONG:
+ { int32* bp = (int32*) w;
+ for (i = 0; i < (int) n; i++)
+ bp[i] = (int32) v[i];
+ if (!TIFFWriteLongArray(tif, type, tag, dir, n, (uint32*) bp))
+ goto out;
+ }
+ break;
+ case TIFF_FLOAT:
+ { float* bp = (float*) w;
+ for (i = 0; i < (int) n; i++)
+ bp[i] = (float) v[i];
+ if (!TIFFWriteFloatArray(tif, type, tag, dir, n, bp))
+ goto out;
+ }
+ break;
+ case TIFF_DOUBLE:
+ return (TIFFWriteDoubleArray(tif, type, tag, dir, n, v));
+ default:
+ /* TIFF_NOTYPE */
+ /* TIFF_ASCII */
+ /* TIFF_UNDEFINED */
+ /* TIFF_RATIONAL */
+ /* TIFF_SRATIONAL */
+ goto out;
+ }
+ status = 1;
+ out:
+ if (w != buf)
+ _TIFFfree(w);
+ return (status);
+}
+
+#ifdef COLORIMETRY_SUPPORT
+static int
+TIFFWriteTransferFunction(TIFF* tif, TIFFDirEntry* dir)
+{
+ TIFFDirectory* td = &tif->tif_dir;
+ tsize_t n = (1L<<td->td_bitspersample) * sizeof (uint16);
+ uint16** tf = td->td_transferfunction;
+ int ncols;
+
+ /*
+ * Check if the table can be written as a single column,
+ * or if it must be written as 3 columns. Note that we
+ * write a 3-column tag if there are 2 samples/pixel and
+ * a single column of data won't suffice--hmm.
+ */
+ switch (td->td_samplesperpixel - td->td_extrasamples) {
+ default: if (_TIFFmemcmp(tf[0], tf[2], n)) { ncols = 3; break; }
+ case 2: if (_TIFFmemcmp(tf[0], tf[1], n)) { ncols = 3; break; }
+ case 1: case 0: ncols = 1;
+ }
+ return (TIFFWriteShortTable(tif,
+ TIFFTAG_TRANSFERFUNCTION, dir, ncols, tf));
+}
+#endif
+
+#ifdef CMYK_SUPPORT
+static int
+TIFFWriteInkNames(TIFF* tif, TIFFDirEntry* dir)
+{
+ TIFFDirectory* td = &tif->tif_dir;
+
+ dir->tdir_tag = TIFFTAG_INKNAMES;
+ dir->tdir_type = (short) TIFF_ASCII;
+ dir->tdir_count = td->td_inknameslen;
+ return (TIFFWriteByteArray(tif, dir, td->td_inknames));
+}
+#endif
+
+/*
+ * Write a contiguous directory item.
+ */
+static int
+TIFFWriteData(TIFF* tif, TIFFDirEntry* dir, char* cp)
+{
+ tsize_t cc;
+
+ if (tif->tif_flags & TIFF_SWAB) {
+ switch (dir->tdir_type) {
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ TIFFSwabArrayOfShort((uint16*) cp, dir->tdir_count);
+ break;
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_FLOAT:
+ TIFFSwabArrayOfLong((uint32*) cp, dir->tdir_count);
+ break;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ TIFFSwabArrayOfLong((uint32*) cp, 2*dir->tdir_count);
+ break;
+ case TIFF_DOUBLE:
+ TIFFSwabArrayOfDouble((double*) cp, dir->tdir_count);
+ break;
+ }
+ }
+ dir->tdir_offset = tif->tif_dataoff;
+ cc = dir->tdir_count * TIFFDataWidth((TIFFDataType) dir->tdir_type);
+ if (SeekOK(tif, dir->tdir_offset) &&
+ WriteOK(tif, cp, cc)) {
+ tif->tif_dataoff += (cc + 1) & ~1;
+ return (1);
+ }
+ TIFFError(tif->tif_name, "Error writing data for field \"%s\"",
+ _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
+ return (0);
+}
+
+/*
+ * Similar to TIFFWriteDirectory(), but if the directory has already
+ * been written once, it is relocated to the end of the file, in case it
+ * has changed in size. Note that this will result in the loss of the
+ * previously used directory space.
+ */
+
+int
+TIFFRewriteDirectory( TIFF *tif )
+{
+ static const char module[] = "TIFFRewriteDirectory";
+
+ /* We don't need to do anything special if it hasn't been written. */
+ if( tif->tif_diroff == 0 )
+ return TIFFWriteDirectory( tif );
+
+ /*
+ ** Find and zero the pointer to this directory, so that TIFFLinkDirectory
+ ** will cause it to be added after this directories current pre-link.
+ */
+
+ /* Is it the first directory in the file? */
+ if (tif->tif_header.tiff_diroff == tif->tif_diroff)
+ {
+ tif->tif_header.tiff_diroff = 0;
+ tif->tif_diroff = 0;
+
+#if defined(__hpux) && defined(__LP64__)
+#define HDROFF(f) ((toff_t)(unsigned long) &(((TIFFHeader*) 0)->f))
+#else
+#define HDROFF(f) ((toff_t) &(((TIFFHeader*) 0)->f))
+#endif
+ TIFFSeekFile(tif, HDROFF(tiff_diroff), SEEK_SET);
+ if (!WriteOK(tif, &(tif->tif_header.tiff_diroff),
+ sizeof (tif->tif_diroff)))
+ {
+ TIFFError(tif->tif_name, "Error updating TIFF header");
+ return (0);
+ }
+ }
+ else
+ {
+ toff_t nextdir, off;
+
+ nextdir = tif->tif_header.tiff_diroff;
+ do {
+ uint16 dircount;
+
+ if (!SeekOK(tif, nextdir) ||
+ !ReadOK(tif, &dircount, sizeof (dircount))) {
+ TIFFError(module, "Error fetching directory count");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&dircount);
+ (void) TIFFSeekFile(tif,
+ dircount * sizeof (TIFFDirEntry), SEEK_CUR);
+ if (!ReadOK(tif, &nextdir, sizeof (nextdir))) {
+ TIFFError(module, "Error fetching directory link");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&nextdir);
+ } while (nextdir != tif->tif_diroff && nextdir != 0);
+ off = TIFFSeekFile(tif, 0, SEEK_CUR); /* get current offset */
+ (void) TIFFSeekFile(tif, off - (toff_t)sizeof(nextdir), SEEK_SET);
+ tif->tif_diroff = 0;
+ if (!WriteOK(tif, &(tif->tif_diroff), sizeof (nextdir))) {
+ TIFFError(module, "Error writing directory link");
+ return (0);
+ }
+ }
+
+ /*
+ ** Now use TIFFWriteDirectory() normally.
+ */
+
+ return TIFFWriteDirectory( tif );
+}
+
+
+/*
+ * Link the current directory into the
+ * directory chain for the file.
+ */
+static int
+TIFFLinkDirectory(TIFF* tif)
+{
+ static const char module[] = "TIFFLinkDirectory";
+ toff_t nextdir;
+ toff_t diroff, off;
+
+ tif->tif_diroff = (TIFFSeekFile(tif, (toff_t) 0, SEEK_END)+1) &~ 1;
+ diroff = tif->tif_diroff;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&diroff);
+#if SUBIFD_SUPPORT
+ if (tif->tif_flags & TIFF_INSUBIFD) {
+ (void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
+ if (!WriteOK(tif, &diroff, sizeof (diroff))) {
+ TIFFError(module,
+ "%s: Error writing SubIFD directory link",
+ tif->tif_name);
+ return (0);
+ }
+ /*
+ * Advance to the next SubIFD or, if this is
+ * the last one configured, revert back to the
+ * normal directory linkage.
+ */
+ if (--tif->tif_nsubifd)
+ tif->tif_subifdoff += sizeof (diroff);
+ else
+ tif->tif_flags &= ~TIFF_INSUBIFD;
+ return (1);
+ }
+#endif
+ if (tif->tif_header.tiff_diroff == 0) {
+ /*
+ * First directory, overwrite offset in header.
+ */
+ tif->tif_header.tiff_diroff = tif->tif_diroff;
+#define HDROFF(f) ((toff_t) &(((TIFFHeader*) 0)->f))
+ (void) TIFFSeekFile(tif, HDROFF(tiff_diroff), SEEK_SET);
+ if (!WriteOK(tif, &diroff, sizeof (diroff))) {
+ TIFFError(tif->tif_name, "Error writing TIFF header");
+ return (0);
+ }
+ return (1);
+ }
+ /*
+ * Not the first directory, search to the last and append.
+ */
+ nextdir = tif->tif_header.tiff_diroff;
+ do {
+ uint16 dircount;
+
+ if (!SeekOK(tif, nextdir) ||
+ !ReadOK(tif, &dircount, sizeof (dircount))) {
+ TIFFError(module, "Error fetching directory count");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&dircount);
+ (void) TIFFSeekFile(tif,
+ dircount * sizeof (TIFFDirEntry), SEEK_CUR);
+ if (!ReadOK(tif, &nextdir, sizeof (nextdir))) {
+ TIFFError(module, "Error fetching directory link");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&nextdir);
+ } while (nextdir != 0);
+ off = TIFFSeekFile(tif, 0, SEEK_CUR); /* get current offset */
+ (void) TIFFSeekFile(tif, off - (toff_t)sizeof(nextdir), SEEK_SET);
+ if (!WriteOK(tif, &diroff, sizeof (diroff))) {
+ TIFFError(module, "Error writing directory link");
+ return (0);
+ }
+ return (1);
+}
diff --git a/src/tiff/tif_dumpmode.c b/src/tiff/tif_dumpmode.c
new file mode 100644
index 0000000..4f8f38a
--- /dev/null
+++ b/src/tiff/tif_dumpmode.c
@@ -0,0 +1,118 @@
+/* $Header: /home/terralib/src/tiff/tif_dumpmode.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * "Null" Compression Algorithm Support.
+ */
+#include "tiffiop.h"
+#include <assert.h>
+
+/*
+ * Encode a hunk of pixels.
+ */
+static int
+DumpModeEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+ (void) s;
+ while (cc > 0) {
+ tsize_t n;
+
+ n = cc;
+ if (tif->tif_rawcc + n > tif->tif_rawdatasize)
+ n = tif->tif_rawdatasize - tif->tif_rawcc;
+
+ assert( n > 0 );
+
+ /*
+ * Avoid copy if client has setup raw
+ * data buffer to avoid extra copy.
+ */
+ if (tif->tif_rawcp != pp)
+ _TIFFmemcpy(tif->tif_rawcp, pp, n);
+ tif->tif_rawcp += n;
+ tif->tif_rawcc += n;
+ pp += n;
+ cc -= n;
+ if (tif->tif_rawcc >= tif->tif_rawdatasize &&
+ !TIFFFlushData1(tif))
+ return (-1);
+ }
+ return (1);
+}
+
+/*
+ * Decode a hunk of pixels.
+ */
+static int
+DumpModeDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
+{
+ (void) s;
+ if (tif->tif_rawcc < cc) {
+ TIFFError(tif->tif_name,
+ "DumpModeDecode: Not enough data for scanline %d",
+ tif->tif_row);
+ return (0);
+ }
+ /*
+ * Avoid copy if client has setup raw
+ * data buffer to avoid extra copy.
+ */
+ if (tif->tif_rawcp != buf)
+ _TIFFmemcpy(buf, tif->tif_rawcp, cc);
+ tif->tif_rawcp += cc;
+ tif->tif_rawcc -= cc;
+ return (1);
+}
+
+/*
+ * Seek forwards nrows in the current strip.
+ */
+static int
+DumpModeSeek(TIFF* tif, uint32 nrows)
+{
+ tif->tif_rawcp += nrows * tif->tif_scanlinesize;
+ tif->tif_rawcc -= nrows * tif->tif_scanlinesize;
+ return (1);
+}
+
+/*
+ * Initialize dump mode.
+ */
+int
+TIFFInitDumpMode(TIFF* tif, int scheme)
+{
+ (void) scheme;
+ tif->tif_decoderow = DumpModeDecode;
+ tif->tif_decodestrip = DumpModeDecode;
+ tif->tif_decodetile = DumpModeDecode;
+ tif->tif_encoderow = DumpModeEncode;
+ tif->tif_encodestrip = DumpModeEncode;
+ tif->tif_encodetile = DumpModeEncode;
+ tif->tif_seek = DumpModeSeek;
+ return (1);
+}
diff --git a/src/tiff/tif_error.c b/src/tiff/tif_error.c
new file mode 100644
index 0000000..d9100eb
--- /dev/null
+++ b/src/tiff/tif_error.c
@@ -0,0 +1,49 @@
+/* $Header: /home/terralib/src/tiff/tif_error.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ */
+#include "tiffiop.h"
+
+TIFFErrorHandler
+TIFFSetErrorHandler(TIFFErrorHandler handler)
+{
+ TIFFErrorHandler prev = _TIFFerrorHandler;
+ _TIFFerrorHandler = handler;
+ return (prev);
+}
+
+void
+TIFFError(const char* module, const char* fmt, ...)
+{
+ if (_TIFFerrorHandler) {
+ va_list ap;
+ va_start(ap, fmt);
+ (*_TIFFerrorHandler)(module, fmt, ap);
+ va_end(ap);
+ }
+}
diff --git a/src/tiff/tif_extension.c b/src/tiff/tif_extension.c
new file mode 100644
index 0000000..95fc409
--- /dev/null
+++ b/src/tiff/tif_extension.c
@@ -0,0 +1,109 @@
+/* $Header: /home/terralib/src/tiff/tif_extension.c,v 1.1 2004/03/19 11:52:52 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Various routines support external extension of the tag set, and other
+ * application extension capabilities.
+ */
+
+#include "tiffiop.h"
+
+int TIFFGetTagListCount( TIFF *tif )
+
+{
+ TIFFDirectory* td = &tif->tif_dir;
+
+ return td->td_customValueCount;
+}
+
+ttag_t TIFFGetTagListEntry( TIFF *tif, int tag_index )
+
+{
+ TIFFDirectory* td = &tif->tif_dir;
+
+ if( tag_index < 0 || tag_index >= td->td_customValueCount )
+ return (ttag_t) -1;
+ else
+ return td->td_customValues[tag_index].info->field_tag;
+}
+
+/*
+** This provides read/write access to the TIFFTagMethods within the TIFF
+** structure to application code without giving access to the private
+** TIFF structure.
+*/
+TIFFTagMethods *TIFFAccessTagMethods( TIFF *tif )
+
+{
+ return &(tif->tif_tagmethods);
+}
+
+void *TIFFGetClientInfo( TIFF *tif, const char *name )
+
+{
+ TIFFClientInfoLink *link = tif->tif_clientinfo;
+
+ while( link != NULL && strcmp(link->name,name) != 0 )
+ link = link->next;
+
+ if( link != NULL )
+ return link->data;
+ else
+ return NULL;
+}
+
+void TIFFSetClientInfo( TIFF *tif, void *data, const char *name )
+
+{
+ TIFFClientInfoLink *link = tif->tif_clientinfo;
+
+ /*
+ ** Do we have an existing link with this name? If so, just
+ ** set it.
+ */
+ while( link != NULL && strcmp(link->name,name) != 0 )
+ link = link->next;
+
+ if( link != NULL )
+ {
+ link->data = data;
+ return;
+ }
+
+ /*
+ ** Create a new link.
+ */
+
+ link = (TIFFClientInfoLink *) _TIFFmalloc(sizeof(TIFFClientInfoLink));
+ link->next = tif->tif_clientinfo;
+ link->name = (char *) _TIFFmalloc(strlen(name)+1);
+ strcpy(link->name, name);
+ link->data = data;
+
+ tif->tif_clientinfo = link;
+}
diff --git a/src/tiff/tif_fax3.c b/src/tiff/tif_fax3.c
new file mode 100644
index 0000000..3f98c86
--- /dev/null
+++ b/src/tiff/tif_fax3.c
@@ -0,0 +1,1515 @@
+/* $Header: /home/terralib/src/tiff/tif_fax3.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1990-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef CCITT_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * CCITT Group 3 (T.4) and Group 4 (T.6) Compression Support.
+ *
+ * This file contains support for decoding and encoding TIFF
+ * compression algorithms 2, 3, 4, and 32771.
+ *
+ * Decoder support is derived, with permission, from the code
+ * in Frank Cringle's viewfax program;
+ * Copyright (C) 1990, 1995 Frank D. Cringle.
+ */
+#include "tif_fax3.h"
+#define G3CODES
+#include "t4.h"
+#include <assert.h>
+#include <stdio.h>
+
+/*
+ * Compression+decompression state blocks are
+ * derived from this ``base state'' block.
+ */
+typedef struct {
+ int rw_mode; /* O_RDONLY for decode, else encode */
+ int mode; /* operating mode */
+ uint32 rowbytes; /* bytes in a decoded scanline */
+ uint32 rowpixels; /* pixels in a scanline */
+
+ uint16 cleanfaxdata; /* CleanFaxData tag */
+ uint32 badfaxrun; /* BadFaxRun tag */
+ uint32 badfaxlines; /* BadFaxLines tag */
+ uint32 groupoptions; /* Group 3/4 options tag */
+ uint32 recvparams; /* encoded Class 2 session params */
+ char* subaddress; /* subaddress string */
+ uint32 recvtime; /* time spent receiving (secs) */
+ TIFFVGetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+} Fax3BaseState;
+#define Fax3State(tif) ((Fax3BaseState*) (tif)->tif_data)
+
+typedef enum { G3_1D, G3_2D } Ttag;
+typedef struct {
+ Fax3BaseState b;
+
+ /* Decoder state info */
+ const u_char* bitmap; /* bit reversal table */
+ uint32 data; /* current i/o byte/word */
+ int bit; /* current i/o bit in byte */
+ int EOLcnt; /* count of EOL codes recognized */
+ TIFFFaxFillFunc fill; /* fill routine */
+ uint32* runs; /* b&w runs for current/previous row */
+ uint32* refruns; /* runs for reference line */
+ uint32* curruns; /* runs for current line */
+
+ /* Encoder state info */
+ Ttag tag; /* encoding state */
+ u_char* refline; /* reference line for 2d decoding */
+ int k; /* #rows left that can be 2d encoded */
+ int maxk; /* max #rows that can be 2d encoded */
+} Fax3CodecState;
+#define DecoderState(tif) ((Fax3CodecState*) Fax3State(tif))
+#define EncoderState(tif) ((Fax3CodecState*) Fax3State(tif))
+
+#define is2DEncoding(sp) \
+ (sp->b.groupoptions & GROUP3OPT_2DENCODING)
+#define isAligned(p,t) ((((u_long)(p)) & (sizeof (t)-1)) == 0)
+
+/*
+ * Group 3 and Group 4 Decoding.
+ */
+
+/*
+ * These macros glue the TIFF library state to
+ * the state expected by Frank's decoder.
+ */
+#define DECLARE_STATE(tif, sp, mod) \
+ static const char module[] = mod; \
+ Fax3CodecState* sp = DecoderState(tif); \
+ int a0; /* reference element */ \
+ int lastx = sp->b.rowpixels; /* last element in row */ \
+ uint32 BitAcc; /* bit accumulator */ \
+ int BitsAvail; /* # valid bits in BitAcc */ \
+ int RunLength; /* length of current run */ \
+ u_char* cp; /* next byte of input data */ \
+ u_char* ep; /* end of input data */ \
+ uint32* pa; /* place to stuff next run */ \
+ uint32* thisrun; /* current row's run array */ \
+ int EOLcnt; /* # EOL codes recognized */ \
+ const u_char* bitmap = sp->bitmap; /* input data bit reverser */ \
+ const TIFFFaxTabEnt* TabEnt
+#define DECLARE_STATE_2D(tif, sp, mod) \
+ DECLARE_STATE(tif, sp, mod); \
+ int b1; /* next change on prev line */ \
+ uint32* pb /* next run in reference line */\
+/*
+ * Load any state that may be changed during decoding.
+ */
+#define CACHE_STATE(tif, sp) do { \
+ BitAcc = sp->data; \
+ BitsAvail = sp->bit; \
+ EOLcnt = sp->EOLcnt; \
+ cp = (unsigned char*) tif->tif_rawcp; \
+ ep = cp + tif->tif_rawcc; \
+} while (0)
+/*
+ * Save state possibly changed during decoding.
+ */
+#define UNCACHE_STATE(tif, sp) do { \
+ sp->bit = BitsAvail; \
+ sp->data = BitAcc; \
+ sp->EOLcnt = EOLcnt; \
+ tif->tif_rawcc -= (tidata_t) cp - tif->tif_rawcp; \
+ tif->tif_rawcp = (tidata_t) cp; \
+} while (0)
+
+/*
+ * Setup state for decoding a strip.
+ */
+static int
+Fax3PreDecode(TIFF* tif, tsample_t s)
+{
+ Fax3CodecState* sp = DecoderState(tif);
+
+ (void) s;
+ assert(sp != NULL);
+ sp->bit = 0; /* force initial read */
+ sp->data = 0;
+ sp->EOLcnt = 0; /* force initial scan for EOL */
+ /*
+ * Decoder assumes lsb-to-msb bit order. Note that we select
+ * this here rather than in Fax3SetupState so that viewers can
+ * hold the image open, fiddle with the FillOrder tag value,
+ * and then re-decode the image. Otherwise they'd need to close
+ * and open the image to get the state reset.
+ */
+ sp->bitmap =
+ TIFFGetBitRevTable(tif->tif_dir.td_fillorder != FILLORDER_LSB2MSB);
+ if (sp->refruns) { /* init reference line to white */
+ sp->refruns[0] = (uint32) sp->b.rowpixels;
+ sp->refruns[1] = 0;
+ }
+ return (1);
+}
+
+/*
+ * Routine for handling various errors/conditions.
+ * Note how they are "glued into the decoder" by
+ * overriding the definitions used by the decoder.
+ */
+
+static void
+Fax3Unexpected(const char* module, TIFF* tif, uint32 a0)
+{
+ TIFFError(module, "%s: Bad code word at scanline %d (x %lu)",
+ tif->tif_name, tif->tif_row, (u_long) a0);
+}
+#define unexpected(table, a0) Fax3Unexpected(module, tif, a0)
+
+static void
+Fax3Extension(const char* module, TIFF* tif, uint32 a0)
+{
+ TIFFError(module,
+ "%s: Uncompressed data (not supported) at scanline %d (x %lu)",
+ tif->tif_name, tif->tif_row, (u_long) a0);
+}
+#define extension(a0) Fax3Extension(module, tif, a0)
+
+static void
+Fax3BadLength(const char* module, TIFF* tif, uint32 a0, uint32 lastx)
+{
+ TIFFWarning(module, "%s: %s at scanline %d (got %lu, expected %lu)",
+ tif->tif_name,
+ a0 < lastx ? "Premature EOL" : "Line length mismatch",
+ tif->tif_row, (u_long) a0, (u_long) lastx);
+}
+#define badlength(a0,lastx) Fax3BadLength(module, tif, a0, lastx)
+
+static void
+Fax3PrematureEOF(const char* module, TIFF* tif, uint32 a0)
+{
+ TIFFWarning(module, "%s: Premature EOF at scanline %d (x %lu)",
+ tif->tif_name, tif->tif_row, (u_long) a0);
+}
+#define prematureEOF(a0) Fax3PrematureEOF(module, tif, a0)
+
+#define Nop
+
+/*
+ * Decode the requested amount of G3 1D-encoded data.
+ */
+static int
+Fax3Decode1D(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
+{
+ DECLARE_STATE(tif, sp, "Fax3Decode1D");
+
+ (void) s;
+ CACHE_STATE(tif, sp);
+ thisrun = sp->curruns;
+ while ((long)occ > 0) {
+ a0 = 0;
+ RunLength = 0;
+ pa = thisrun;
+#ifdef FAX3_DEBUG
+ printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
+ printf("-------------------- %d\n", tif->tif_row);
+ fflush(stdout);
+#endif
+ SYNC_EOL(EOF1D);
+ EXPAND1D(EOF1Da);
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ buf += sp->b.rowbytes;
+ occ -= sp->b.rowbytes;
+ continue;
+ EOF1D: /* premature EOF */
+ CLEANUP_RUNS();
+ EOF1Da: /* premature EOF */
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ UNCACHE_STATE(tif, sp);
+ return (-1);
+ }
+ UNCACHE_STATE(tif, sp);
+ return (1);
+}
+
+#define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; }
+/*
+ * Decode the requested amount of G3 2D-encoded data.
+ */
+static int
+Fax3Decode2D(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
+{
+ DECLARE_STATE_2D(tif, sp, "Fax3Decode2D");
+ int is1D; /* current line is 1d/2d-encoded */
+
+ (void) s;
+ CACHE_STATE(tif, sp);
+ while ((long)occ > 0) {
+ a0 = 0;
+ RunLength = 0;
+ pa = thisrun = sp->curruns;
+#ifdef FAX3_DEBUG
+ printf("\nBitAcc=%08X, BitsAvail = %d EOLcnt = %d",
+ BitAcc, BitsAvail, EOLcnt);
+#endif
+ SYNC_EOL(EOF2D);
+ NeedBits8(1, EOF2D);
+ is1D = GetBits(1); /* 1D/2D-encoding tag bit */
+ ClrBits(1);
+#ifdef FAX3_DEBUG
+ printf(" %s\n-------------------- %d\n",
+ is1D ? "1D" : "2D", tif->tif_row);
+ fflush(stdout);
+#endif
+ pb = sp->refruns;
+ b1 = *pb++;
+ if (is1D)
+ EXPAND1D(EOF2Da);
+ else
+ EXPAND2D(EOF2Da);
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ SETVAL(0); /* imaginary change for reference */
+ SWAP(uint32*, sp->curruns, sp->refruns);
+ buf += sp->b.rowbytes;
+ occ -= sp->b.rowbytes;
+ continue;
+ EOF2D: /* premature EOF */
+ CLEANUP_RUNS();
+ EOF2Da: /* premature EOF */
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ UNCACHE_STATE(tif, sp);
+ return (-1);
+ }
+ UNCACHE_STATE(tif, sp);
+ return (1);
+}
+#undef SWAP
+
+/*
+ * The ZERO & FILL macros must handle spans < 2*sizeof(long) bytes.
+ * For machines with 64-bit longs this is <16 bytes; otherwise
+ * this is <8 bytes. We optimize the code here to reflect the
+ * machine characteristics.
+ */
+#if defined(__alpha) || _MIPS_SZLONG == 64 || defined(__LP64__) || defined(__arch64__)
+#define FILL(n, cp) \
+ switch (n) { \
+ case 15:(cp)[14] = 0xff; case 14:(cp)[13] = 0xff; case 13: (cp)[12] = 0xff;\
+ case 12:(cp)[11] = 0xff; case 11:(cp)[10] = 0xff; case 10: (cp)[9] = 0xff;\
+ case 9: (cp)[8] = 0xff; case 8: (cp)[7] = 0xff; case 7: (cp)[6] = 0xff;\
+ case 6: (cp)[5] = 0xff; case 5: (cp)[4] = 0xff; case 4: (cp)[3] = 0xff;\
+ case 3: (cp)[2] = 0xff; case 2: (cp)[1] = 0xff; \
+ case 1: (cp)[0] = 0xff; (cp) += (n); case 0: ; \
+ }
+#define ZERO(n, cp) \
+ switch (n) { \
+ case 15:(cp)[14] = 0; case 14:(cp)[13] = 0; case 13: (cp)[12] = 0; \
+ case 12:(cp)[11] = 0; case 11:(cp)[10] = 0; case 10: (cp)[9] = 0; \
+ case 9: (cp)[8] = 0; case 8: (cp)[7] = 0; case 7: (cp)[6] = 0; \
+ case 6: (cp)[5] = 0; case 5: (cp)[4] = 0; case 4: (cp)[3] = 0; \
+ case 3: (cp)[2] = 0; case 2: (cp)[1] = 0; \
+ case 1: (cp)[0] = 0; (cp) += (n); case 0: ; \
+ }
+#else
+#define FILL(n, cp) \
+ switch (n) { \
+ case 7: (cp)[6] = 0xff; case 6: (cp)[5] = 0xff; case 5: (cp)[4] = 0xff; \
+ case 4: (cp)[3] = 0xff; case 3: (cp)[2] = 0xff; case 2: (cp)[1] = 0xff; \
+ case 1: (cp)[0] = 0xff; (cp) += (n); case 0: ; \
+ }
+#define ZERO(n, cp) \
+ switch (n) { \
+ case 7: (cp)[6] = 0; case 6: (cp)[5] = 0; case 5: (cp)[4] = 0; \
+ case 4: (cp)[3] = 0; case 3: (cp)[2] = 0; case 2: (cp)[1] = 0; \
+ case 1: (cp)[0] = 0; (cp) += (n); case 0: ; \
+ }
+#endif
+
+/*
+ * Bit-fill a row according to the white/black
+ * runs generated during G3/G4 decoding.
+ */
+void
+_TIFFFax3fillruns(u_char* buf, uint32* runs, uint32* erun, uint32 lastx)
+{
+ static const unsigned char _fillmasks[] =
+ { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff };
+ u_char* cp;
+ uint32 x, bx, run;
+ int32 n, nw;
+ long* lp;
+
+ if ((erun-runs)&1)
+ *erun++ = 0;
+ x = 0;
+ for (; runs < erun; runs += 2) {
+ run = runs[0];
+ if (x+run > lastx || run > lastx )
+ run = runs[0] = (uint32) (lastx - x);
+ if (run) {
+ cp = buf + (x>>3);
+ bx = x&7;
+ if (run > 8-bx) {
+ if (bx) { /* align to byte boundary */
+ *cp++ &= 0xff << (8-bx);
+ run -= 8-bx;
+ }
+ if( (n = run >> 3) != 0 ) { /* multiple bytes to fill */
+ if ((n/sizeof (long)) > 1) {
+ /*
+ * Align to longword boundary and fill.
+ */
+ for (; n && !isAligned(cp, long); n--)
+ *cp++ = 0x00;
+ lp = (long*) cp;
+ nw = (int32)(n / sizeof (long));
+ n -= nw * sizeof (long);
+ do {
+ *lp++ = 0L;
+ } while (--nw);
+ cp = (u_char*) lp;
+ }
+ ZERO(n, cp);
+ run &= 7;
+ }
+ if (run)
+ cp[0] &= 0xff >> run;
+ } else
+ cp[0] &= ~(_fillmasks[run]>>bx);
+ x += runs[0];
+ }
+ run = runs[1];
+ if (x+run > lastx || run > lastx )
+ run = runs[1] = lastx - x;
+ if (run) {
+ cp = buf + (x>>3);
+ bx = x&7;
+ if (run > 8-bx) {
+ if (bx) { /* align to byte boundary */
+ *cp++ |= 0xff >> bx;
+ run -= 8-bx;
+ }
+ if( (n = run>>3) != 0 ) { /* multiple bytes to fill */
+ if ((n/sizeof (long)) > 1) {
+ /*
+ * Align to longword boundary and fill.
+ */
+ for (; n && !isAligned(cp, long); n--)
+ *cp++ = 0xff;
+ lp = (long*) cp;
+ nw = (int32)(n / sizeof (long));
+ n -= nw * sizeof (long);
+ do {
+ *lp++ = -1L;
+ } while (--nw);
+ cp = (u_char*) lp;
+ }
+ FILL(n, cp);
+ run &= 7;
+ }
+ if (run)
+ cp[0] |= 0xff00 >> run;
+ } else
+ cp[0] |= _fillmasks[run]>>bx;
+ x += runs[1];
+ }
+ }
+ assert(x == lastx);
+}
+#undef ZERO
+#undef FILL
+
+/*
+ * Setup G3/G4-related compression/decompression state
+ * before data is processed. This routine is called once
+ * per image -- it sets up different state based on whether
+ * or not decoding or encoding is being done and whether
+ * 1D- or 2D-encoded data is involved.
+ */
+static int
+Fax3SetupState(TIFF* tif)
+{
+ TIFFDirectory* td = &tif->tif_dir;
+ Fax3BaseState* sp = Fax3State(tif);
+ long rowbytes, rowpixels;
+ int needsRefLine;
+ Fax3CodecState* dsp = DecoderState(tif);
+ uint32 nruns;
+
+ if (td->td_bitspersample != 1) {
+ TIFFError(tif->tif_name,
+ "Bits/sample must be 1 for Group 3/4 encoding/decoding");
+ return (0);
+ }
+ /*
+ * Calculate the scanline/tile widths.
+ */
+ if (isTiled(tif)) {
+ rowbytes = TIFFTileRowSize(tif);
+ rowpixels = td->td_tilewidth;
+ } else {
+ rowbytes = TIFFScanlineSize(tif);
+ rowpixels = td->td_imagewidth;
+ }
+ sp->rowbytes = (uint32) rowbytes;
+ sp->rowpixels = (uint32) rowpixels;
+ /*
+ * Allocate any additional space required for decoding/encoding.
+ */
+ needsRefLine = (
+ (sp->groupoptions & GROUP3OPT_2DENCODING) ||
+ td->td_compression == COMPRESSION_CCITTFAX4
+ );
+
+ nruns = needsRefLine ? 2*TIFFroundup(rowpixels,32) : rowpixels;
+
+ dsp->runs = (uint32*) _TIFFmalloc((2*nruns+3)*sizeof (uint32));
+ if (dsp->runs == NULL) {
+ TIFFError("Fax3SetupState",
+ "%s: No space for Group 3/4 run arrays",
+ tif->tif_name);
+ return (0);
+ }
+ dsp->curruns = dsp->runs;
+ if (needsRefLine)
+ dsp->refruns = dsp->runs + (nruns>>1);
+ else
+ dsp->refruns = NULL;
+ if (is2DEncoding(dsp)) { /* NB: default is 1D routine */
+ tif->tif_decoderow = Fax3Decode2D;
+ tif->tif_decodestrip = Fax3Decode2D;
+ tif->tif_decodetile = Fax3Decode2D;
+ }
+
+ if (needsRefLine) { /* 2d encoding */
+ Fax3CodecState* esp = EncoderState(tif);
+ /*
+ * 2d encoding requires a scanline
+ * buffer for the ``reference line''; the
+ * scanline against which delta encoding
+ * is referenced. The reference line must
+ * be initialized to be ``white'' (done elsewhere).
+ */
+ esp->refline = (u_char*) _TIFFmalloc(rowbytes);
+ if (esp->refline == NULL) {
+ TIFFError("Fax3SetupState",
+ "%s: No space for Group 3/4 reference line",
+ tif->tif_name);
+ return (0);
+ }
+ } else /* 1d encoding */
+ EncoderState(tif)->refline = NULL;
+ return (1);
+}
+
+/*
+ * CCITT Group 3 FAX Encoding.
+ */
+
+#define Fax3FlushBits(tif, sp) { \
+ if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \
+ (void) TIFFFlushData1(tif); \
+ *(tif)->tif_rawcp++ = (tidataval_t) (sp)->data; \
+ (tif)->tif_rawcc++; \
+ (sp)->data = 0, (sp)->bit = 8; \
+}
+#define _FlushBits(tif) { \
+ if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \
+ (void) TIFFFlushData1(tif); \
+ *(tif)->tif_rawcp++ = (tidataval_t) data; \
+ (tif)->tif_rawcc++; \
+ data = 0, bit = 8; \
+}
+static const int _msbmask[9] =
+ { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
+#define _PutBits(tif, bits, length) { \
+ while (length > bit) { \
+ data |= bits >> (length - bit); \
+ length -= bit; \
+ _FlushBits(tif); \
+ } \
+ data |= (bits & _msbmask[length]) << (bit - length); \
+ bit -= length; \
+ if (bit == 0) \
+ _FlushBits(tif); \
+}
+
+/*
+ * Write a variable-length bit-value to
+ * the output stream. Values are
+ * assumed to be at most 16 bits.
+ */
+static void
+Fax3PutBits(TIFF* tif, u_int bits, u_int length)
+{
+ Fax3CodecState* sp = EncoderState(tif);
+ u_int bit = sp->bit;
+ int data = sp->data;
+
+ _PutBits(tif, bits, length);
+
+ sp->data = data;
+ sp->bit = bit;
+}
+
+/*
+ * Write a code to the output stream.
+ */
+#define putcode(tif, te) Fax3PutBits(tif, (te)->code, (te)->length)
+
+#ifdef FAX3_DEBUG
+#define DEBUG_COLOR(w) (tab == TIFFFaxWhiteCodes ? w "W" : w "B")
+#define DEBUG_PRINT(what,len) { \
+ int t; \
+ printf("%08X/%-2d: %s%5d\t", data, bit, DEBUG_COLOR(what), len); \
+ for (t = length-1; t >= 0; t--) \
+ putchar(code & (1<<t) ? '1' : '0'); \
+ putchar('\n'); \
+}
+#endif
+
+/*
+ * Write the sequence of codes that describes
+ * the specified span of zero's or one's. The
+ * appropriate table that holds the make-up and
+ * terminating codes is supplied.
+ */
+static void
+putspan(TIFF* tif, int32 span, const tableentry* tab)
+{
+ Fax3CodecState* sp = EncoderState(tif);
+ u_int bit = sp->bit;
+ int data = sp->data;
+ u_int code, length;
+
+ while (span >= 2624) {
+ const tableentry* te = &tab[63 + (2560>>6)];
+ code = te->code, length = te->length;
+#ifdef FAX3_DEBUG
+ DEBUG_PRINT("MakeUp", te->runlen);
+#endif
+ _PutBits(tif, code, length);
+ span -= te->runlen;
+ }
+ if (span >= 64) {
+ const tableentry* te = &tab[63 + (span>>6)];
+ assert(te->runlen == 64*(span>>6));
+ code = te->code, length = te->length;
+#ifdef FAX3_DEBUG
+ DEBUG_PRINT("MakeUp", te->runlen);
+#endif
+ _PutBits(tif, code, length);
+ span -= te->runlen;
+ }
+ code = tab[span].code, length = tab[span].length;
+#ifdef FAX3_DEBUG
+ DEBUG_PRINT(" Term", tab[span].runlen);
+#endif
+ _PutBits(tif, code, length);
+
+ sp->data = data;
+ sp->bit = bit;
+}
+
+/*
+ * Write an EOL code to the output stream. The zero-fill
+ * logic for byte-aligning encoded scanlines is handled
+ * here. We also handle writing the tag bit for the next
+ * scanline when doing 2d encoding.
+ */
+static void
+Fax3PutEOL(TIFF* tif)
+{
+ Fax3CodecState* sp = EncoderState(tif);
+ u_int bit = sp->bit;
+ int data = sp->data;
+ u_int code, length, tparm;
+
+ if (sp->b.groupoptions & GROUP3OPT_FILLBITS) {
+ /*
+ * Force bit alignment so EOL will terminate on
+ * a byte boundary. That is, force the bit alignment
+ * to 16-12 = 4 before putting out the EOL code.
+ */
+ int align = 8 - 4;
+ if (align != sp->bit) {
+ if (align > sp->bit)
+ align = sp->bit + (8 - align);
+ else
+ align = sp->bit - align;
+ code = 0;
+ tparm=align;
+ _PutBits(tif, 0, tparm);
+ }
+ }
+ code = EOL, length = 12;
+ if (is2DEncoding(sp))
+ code = (code<<1) | (sp->tag == G3_1D), length++;
+ _PutBits(tif, code, length);
+
+ sp->data = data;
+ sp->bit = bit;
+}
+
+/*
+ * Reset encoding state at the start of a strip.
+ */
+static int
+Fax3PreEncode(TIFF* tif, tsample_t s)
+{
+ Fax3CodecState* sp = EncoderState(tif);
+
+ (void) s;
+ assert(sp != NULL);
+ sp->bit = 8;
+ sp->data = 0;
+ sp->tag = G3_1D;
+ /*
+ * This is necessary for Group 4; otherwise it isn't
+ * needed because the first scanline of each strip ends
+ * up being copied into the refline.
+ */
+ if (sp->refline)
+ _TIFFmemset(sp->refline, 0x00, sp->b.rowbytes);
+ if (is2DEncoding(sp)) {
+ float res = tif->tif_dir.td_yresolution;
+ /*
+ * The CCITT spec says that when doing 2d encoding, you
+ * should only do it on K consecutive scanlines, where K
+ * depends on the resolution of the image being encoded
+ * (2 for <= 200 lpi, 4 for > 200 lpi). Since the directory
+ * code initializes td_yresolution to 0, this code will
+ * select a K of 2 unless the YResolution tag is set
+ * appropriately. (Note also that we fudge a little here
+ * and use 150 lpi to avoid problems with units conversion.)
+ */
+ if (tif->tif_dir.td_resolutionunit == RESUNIT_CENTIMETER)
+ res *= 2.54f; /* convert to inches */
+ sp->maxk = (res > 150 ? 4 : 2);
+ sp->k = sp->maxk-1;
+ } else
+ sp->k = sp->maxk = 0;
+ return (1);
+}
+
+static const u_char zeroruns[256] = {
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, /* 0x00 - 0x0f */
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x10 - 0x1f */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x20 - 0x2f */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x30 - 0x3f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 - 0x4f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 - 0x5f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 - 0x6f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x70 - 0x7f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 - 0xaf */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 - 0xbf */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 - 0xcf */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 - 0xdf */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 - 0xef */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 - 0xff */
+};
+static const u_char oneruns[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 - 0x0f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 - 0x1f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x2f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 - 0x3f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 - 0x4f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 - 0x5f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80 - 0x8f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90 - 0x9f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0 - 0xaf */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0 - 0xbf */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xc0 - 0xcf */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xd0 - 0xdf */
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xe0 - 0xef */
+ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, /* 0xf0 - 0xff */
+};
+
+/*
+ * On certain systems it pays to inline
+ * the routines that find pixel spans.
+ */
+#ifdef VAXC
+static int32 find0span(u_char*, int32, int32);
+static int32 find1span(u_char*, int32, int32);
+#pragma inline(find0span,find1span)
+#endif
+
+/*
+ * Find a span of ones or zeros using the supplied
+ * table. The ``base'' of the bit string is supplied
+ * along with the start+end bit indices.
+ */
+INLINE static int32
+find0span(u_char* bp, int32 bs, int32 be)
+{
+ int32 bits = be - bs;
+ int32 n, span;
+
+ bp += bs>>3;
+ /*
+ * Check partial byte on lhs.
+ */
+ if (bits > 0 && (n = (bs & 7))) {
+ span = zeroruns[(*bp << n) & 0xff];
+ if (span > 8-n) /* table value too generous */
+ span = 8-n;
+ if (span > bits) /* constrain span to bit range */
+ span = bits;
+ if (n+span < 8) /* doesn't extend to edge of byte */
+ return (span);
+ bits -= span;
+ bp++;
+ } else
+ span = 0;
+ if (bits >= 2*8*sizeof (long)) {
+ long* lp;
+ /*
+ * Align to longword boundary and check longwords.
+ */
+ while (!isAligned(bp, long)) {
+ if (*bp != 0x00)
+ return (span + zeroruns[*bp]);
+ span += 8, bits -= 8;
+ bp++;
+ }
+ lp = (long*) bp;
+ while (bits >= 8*sizeof (long) && *lp == 0) {
+ span += 8*sizeof (long), bits -= 8*sizeof (long);
+ lp++;
+ }
+ bp = (u_char*) lp;
+ }
+ /*
+ * Scan full bytes for all 0's.
+ */
+ while (bits >= 8) {
+ if (*bp != 0x00) /* end of run */
+ return (span + zeroruns[*bp]);
+ span += 8, bits -= 8;
+ bp++;
+ }
+ /*
+ * Check partial byte on rhs.
+ */
+ if (bits > 0) {
+ n = zeroruns[*bp];
+ span += (n > bits ? bits : n);
+ }
+ return (span);
+}
+
+INLINE static int32
+find1span(u_char* bp, int32 bs, int32 be)
+{
+ int32 bits = be - bs;
+ int32 n, span;
+
+ bp += bs>>3;
+ /*
+ * Check partial byte on lhs.
+ */
+ if (bits > 0 && (n = (bs & 7))) {
+ span = oneruns[(*bp << n) & 0xff];
+ if (span > 8-n) /* table value too generous */
+ span = 8-n;
+ if (span > bits) /* constrain span to bit range */
+ span = bits;
+ if (n+span < 8) /* doesn't extend to edge of byte */
+ return (span);
+ bits -= span;
+ bp++;
+ } else
+ span = 0;
+ if (bits >= 2*8*sizeof (long)) {
+ long* lp;
+ /*
+ * Align to longword boundary and check longwords.
+ */
+ while (!isAligned(bp, long)) {
+ if (*bp != 0xff)
+ return (span + oneruns[*bp]);
+ span += 8, bits -= 8;
+ bp++;
+ }
+ lp = (long*) bp;
+ while (bits >= 8*sizeof (long) && *lp == ~0) {
+ span += 8*sizeof (long), bits -= 8*sizeof (long);
+ lp++;
+ }
+ bp = (u_char*) lp;
+ }
+ /*
+ * Scan full bytes for all 1's.
+ */
+ while (bits >= 8) {
+ if (*bp != 0xff) /* end of run */
+ return (span + oneruns[*bp]);
+ span += 8, bits -= 8;
+ bp++;
+ }
+ /*
+ * Check partial byte on rhs.
+ */
+ if (bits > 0) {
+ n = oneruns[*bp];
+ span += (n > bits ? bits : n);
+ }
+ return (span);
+}
+
+/*
+ * Return the offset of the next bit in the range
+ * [bs..be] that is different from the specified
+ * color. The end, be, is returned if no such bit
+ * exists.
+ */
+#define finddiff(_cp, _bs, _be, _color) \
+ (_bs + (_color ? find1span(_cp,_bs,_be) : find0span(_cp,_bs,_be)))
+/*
+ * Like finddiff, but also check the starting bit
+ * against the end in case start > end.
+ */
+#define finddiff2(_cp, _bs, _be, _color) \
+ (_bs < _be ? finddiff(_cp,_bs,_be,_color) : _be)
+
+/*
+ * 1d-encode a row of pixels. The encoding is
+ * a sequence of all-white or all-black spans
+ * of pixels encoded with Huffman codes.
+ */
+static int
+Fax3Encode1DRow(TIFF* tif, u_char* bp, uint32 bits)
+{
+ Fax3CodecState* sp = EncoderState(tif);
+ int32 span;
+ uint32 bs = 0;
+
+ for (;;) {
+ span = find0span(bp, bs, bits); /* white span */
+ putspan(tif, span, TIFFFaxWhiteCodes);
+ bs += span;
+ if (bs >= bits)
+ break;
+ span = find1span(bp, bs, bits); /* black span */
+ putspan(tif, span, TIFFFaxBlackCodes);
+ bs += span;
+ if (bs >= bits)
+ break;
+ }
+ if (sp->b.mode & (FAXMODE_BYTEALIGN|FAXMODE_WORDALIGN)) {
+ if (sp->bit != 8) /* byte-align */
+ Fax3FlushBits(tif, sp);
+ if ((sp->b.mode&FAXMODE_WORDALIGN) &&
+ !isAligned(tif->tif_rawcp, uint16))
+ Fax3FlushBits(tif, sp);
+ }
+ return (1);
+}
+
+static const tableentry horizcode =
+ { 3, 0x1 }; /* 001 */
+static const tableentry passcode =
+ { 4, 0x1 }; /* 0001 */
+static const tableentry vcodes[7] = {
+ { 7, 0x03 }, /* 0000 011 */
+ { 6, 0x03 }, /* 0000 11 */
+ { 3, 0x03 }, /* 011 */
+ { 1, 0x1 }, /* 1 */
+ { 3, 0x2 }, /* 010 */
+ { 6, 0x02 }, /* 0000 10 */
+ { 7, 0x02 } /* 0000 010 */
+};
+
+/*
+ * 2d-encode a row of pixels. Consult the CCITT
+ * documentation for the algorithm.
+ */
+static int
+Fax3Encode2DRow(TIFF* tif, u_char* bp, u_char* rp, uint32 bits)
+{
+#define PIXEL(buf,ix) ((((buf)[(ix)>>3]) >> (7-((ix)&7))) & 1)
+ uint32 a0 = 0;
+ uint32 a1 = (PIXEL(bp, 0) != 0 ? 0 : finddiff(bp, 0, bits, 0));
+ uint32 b1 = (PIXEL(rp, 0) != 0 ? 0 : finddiff(rp, 0, bits, 0));
+ uint32 a2, b2;
+
+ for (;;) {
+ b2 = finddiff2(rp, b1, bits, PIXEL(rp,b1));
+ if (b2 >= a1) {
+ int32 d = b1 - a1;
+ if (!(-3 <= d && d <= 3)) { /* horizontal mode */
+ a2 = finddiff2(bp, a1, bits, PIXEL(bp,a1));
+ putcode(tif, &horizcode);
+ if (a0+a1 == 0 || PIXEL(bp, a0) == 0) {
+ putspan(tif, a1-a0, TIFFFaxWhiteCodes);
+ putspan(tif, a2-a1, TIFFFaxBlackCodes);
+ } else {
+ putspan(tif, a1-a0, TIFFFaxBlackCodes);
+ putspan(tif, a2-a1, TIFFFaxWhiteCodes);
+ }
+ a0 = a2;
+ } else { /* vertical mode */
+ putcode(tif, &vcodes[d+3]);
+ a0 = a1;
+ }
+ } else { /* pass mode */
+ putcode(tif, &passcode);
+ a0 = b2;
+ }
+ if (a0 >= bits)
+ break;
+ a1 = finddiff(bp, a0, bits, PIXEL(bp,a0));
+ b1 = finddiff(rp, a0, bits, !PIXEL(bp,a0));
+ b1 = finddiff(rp, b1, bits, PIXEL(bp,a0));
+ }
+ return (1);
+#undef PIXEL
+}
+
+/*
+ * Encode a buffer of pixels.
+ */
+static int
+Fax3Encode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+ Fax3CodecState* sp = EncoderState(tif);
+
+ (void) s;
+ while ((long)cc > 0) {
+ if ((sp->b.mode & FAXMODE_NOEOL) == 0)
+ Fax3PutEOL(tif);
+ if (is2DEncoding(sp)) {
+ if (sp->tag == G3_1D) {
+ if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels))
+ return (0);
+ sp->tag = G3_2D;
+ } else {
+ if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels))
+ return (0);
+ sp->k--;
+ }
+ if (sp->k == 0) {
+ sp->tag = G3_1D;
+ sp->k = sp->maxk-1;
+ } else
+ _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes);
+ } else {
+ if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels))
+ return (0);
+ }
+ bp += sp->b.rowbytes;
+ cc -= sp->b.rowbytes;
+ }
+ return (1);
+}
+
+static int
+Fax3PostEncode(TIFF* tif)
+{
+ Fax3CodecState* sp = EncoderState(tif);
+
+ if (sp->bit != 8)
+ Fax3FlushBits(tif, sp);
+ return (1);
+}
+
+static void
+Fax3Close(TIFF* tif)
+{
+ if ((Fax3State(tif)->mode & FAXMODE_NORTC) == 0) {
+ Fax3CodecState* sp = EncoderState(tif);
+ u_int code = EOL;
+ u_int length = 12;
+ int i;
+
+ if (is2DEncoding(sp))
+ code = (code<<1) | (sp->tag == G3_1D), length++;
+ for (i = 0; i < 6; i++)
+ Fax3PutBits(tif, code, length);
+ Fax3FlushBits(tif, sp);
+ }
+}
+
+static void
+Fax3Cleanup(TIFF* tif)
+{
+ if (tif->tif_data) {
+ Fax3CodecState* sp = DecoderState(tif);
+
+ if (sp->runs)
+ _TIFFfree(sp->runs);
+ if (sp->refline)
+ _TIFFfree(sp->refline);
+
+ if (Fax3State(tif)->subaddress)
+ _TIFFfree(Fax3State(tif)->subaddress);
+ _TIFFfree(tif->tif_data);
+ tif->tif_data = NULL;
+ }
+}
+
+#define FIELD_BADFAXLINES (FIELD_CODEC+0)
+#define FIELD_CLEANFAXDATA (FIELD_CODEC+1)
+#define FIELD_BADFAXRUN (FIELD_CODEC+2)
+#define FIELD_RECVPARAMS (FIELD_CODEC+3)
+#define FIELD_SUBADDRESS (FIELD_CODEC+4)
+#define FIELD_RECVTIME (FIELD_CODEC+5)
+
+#define FIELD_OPTIONS (FIELD_CODEC+6)
+
+static const TIFFFieldInfo faxFieldInfo[] = {
+ { TIFFTAG_FAXMODE, 0, 0, TIFF_ANY, FIELD_PSEUDO,
+ FALSE, FALSE, "FaxMode" },
+ { TIFFTAG_FAXFILLFUNC, 0, 0, TIFF_ANY, FIELD_PSEUDO,
+ FALSE, FALSE, "FaxFillFunc" },
+ { TIFFTAG_BADFAXLINES, 1, 1, TIFF_LONG, FIELD_BADFAXLINES,
+ TRUE, FALSE, "BadFaxLines" },
+ { TIFFTAG_BADFAXLINES, 1, 1, TIFF_SHORT, FIELD_BADFAXLINES,
+ TRUE, FALSE, "BadFaxLines" },
+ { TIFFTAG_CLEANFAXDATA, 1, 1, TIFF_SHORT, FIELD_CLEANFAXDATA,
+ TRUE, FALSE, "CleanFaxData" },
+ { TIFFTAG_CONSECUTIVEBADFAXLINES,1,1, TIFF_LONG, FIELD_BADFAXRUN,
+ TRUE, FALSE, "ConsecutiveBadFaxLines" },
+ { TIFFTAG_CONSECUTIVEBADFAXLINES,1,1, TIFF_SHORT, FIELD_BADFAXRUN,
+ TRUE, FALSE, "ConsecutiveBadFaxLines" },
+ { TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, FIELD_RECVPARAMS,
+ TRUE, FALSE, "FaxRecvParams" },
+ { TIFFTAG_FAXSUBADDRESS, -1,-1, TIFF_ASCII, FIELD_SUBADDRESS,
+ TRUE, FALSE, "FaxSubAddress" },
+ { TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, FIELD_RECVTIME,
+ TRUE, FALSE, "FaxRecvTime" },
+};
+static const TIFFFieldInfo fax3FieldInfo[] = {
+ { TIFFTAG_GROUP3OPTIONS, 1, 1, TIFF_LONG, FIELD_OPTIONS,
+ FALSE, FALSE, "Group3Options" },
+};
+static const TIFFFieldInfo fax4FieldInfo[] = {
+ { TIFFTAG_GROUP4OPTIONS, 1, 1, TIFF_LONG, FIELD_OPTIONS,
+ FALSE, FALSE, "Group4Options" },
+};
+#define N(a) (sizeof (a) / sizeof (a[0]))
+
+static int
+Fax3VSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ Fax3BaseState* sp = Fax3State(tif);
+
+ switch (tag) {
+ case TIFFTAG_FAXMODE:
+ sp->mode = va_arg(ap, int);
+ return (1); /* NB: pseudo tag */
+ case TIFFTAG_FAXFILLFUNC:
+ DecoderState(tif)->fill = va_arg(ap, TIFFFaxFillFunc);
+ return (1); /* NB: pseudo tag */
+ case TIFFTAG_GROUP3OPTIONS:
+ case TIFFTAG_GROUP4OPTIONS:
+ sp->groupoptions = va_arg(ap, uint32);
+ break;
+ case TIFFTAG_BADFAXLINES:
+ sp->badfaxlines = va_arg(ap, uint32);
+ break;
+ case TIFFTAG_CLEANFAXDATA:
+ sp->cleanfaxdata = (uint16) va_arg(ap, int);
+ break;
+ case TIFFTAG_CONSECUTIVEBADFAXLINES:
+ sp->badfaxrun = va_arg(ap, uint32);
+ break;
+ case TIFFTAG_FAXRECVPARAMS:
+ sp->recvparams = va_arg(ap, uint32);
+ break;
+ case TIFFTAG_FAXSUBADDRESS:
+ _TIFFsetString(&sp->subaddress, va_arg(ap, char*));
+ break;
+ case TIFFTAG_FAXRECVTIME:
+ sp->recvtime = va_arg(ap, uint32);
+ break;
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+ TIFFSetFieldBit(tif, _TIFFFieldWithTag(tif, tag)->field_bit);
+ tif->tif_flags |= TIFF_DIRTYDIRECT;
+ return (1);
+}
+
+static int
+Fax3VGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ Fax3BaseState* sp = Fax3State(tif);
+
+ switch (tag) {
+ case TIFFTAG_FAXMODE:
+ *va_arg(ap, int*) = sp->mode;
+ break;
+ case TIFFTAG_FAXFILLFUNC:
+ *va_arg(ap, TIFFFaxFillFunc*) = DecoderState(tif)->fill;
+ break;
+ case TIFFTAG_GROUP3OPTIONS:
+ case TIFFTAG_GROUP4OPTIONS:
+ *va_arg(ap, uint32*) = sp->groupoptions;
+ break;
+ case TIFFTAG_BADFAXLINES:
+ *va_arg(ap, uint32*) = sp->badfaxlines;
+ break;
+ case TIFFTAG_CLEANFAXDATA:
+ *va_arg(ap, uint16*) = sp->cleanfaxdata;
+ break;
+ case TIFFTAG_CONSECUTIVEBADFAXLINES:
+ *va_arg(ap, uint32*) = sp->badfaxrun;
+ break;
+ case TIFFTAG_FAXRECVPARAMS:
+ *va_arg(ap, uint32*) = sp->recvparams;
+ break;
+ case TIFFTAG_FAXSUBADDRESS:
+ *va_arg(ap, char**) = sp->subaddress;
+ break;
+ case TIFFTAG_FAXRECVTIME:
+ *va_arg(ap, uint32*) = sp->recvtime;
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return (1);
+}
+
+static void
+Fax3PrintDir(TIFF* tif, FILE* fd, long flags)
+{
+ Fax3BaseState* sp = Fax3State(tif);
+
+ (void) flags;
+ if (TIFFFieldSet(tif,FIELD_OPTIONS)) {
+ const char* sep = " ";
+ if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4) {
+ fprintf(fd, " Group 4 Options:");
+ if (sp->groupoptions & GROUP4OPT_UNCOMPRESSED)
+ fprintf(fd, "%suncompressed data", sep);
+ } else {
+
+ fprintf(fd, " Group 3 Options:");
+ if (sp->groupoptions & GROUP3OPT_2DENCODING)
+ fprintf(fd, "%s2-d encoding", sep), sep = "+";
+ if (sp->groupoptions & GROUP3OPT_FILLBITS)
+ fprintf(fd, "%sEOL padding", sep), sep = "+";
+ if (sp->groupoptions & GROUP3OPT_UNCOMPRESSED)
+ fprintf(fd, "%suncompressed data", sep);
+ }
+ fprintf(fd, " (%lu = 0x%lx)\n",
+ (u_long) sp->groupoptions, (u_long) sp->groupoptions);
+ }
+ if (TIFFFieldSet(tif,FIELD_CLEANFAXDATA)) {
+ fprintf(fd, " Fax Data:");
+ switch (sp->cleanfaxdata) {
+ case CLEANFAXDATA_CLEAN:
+ fprintf(fd, " clean");
+ break;
+ case CLEANFAXDATA_REGENERATED:
+ fprintf(fd, " receiver regenerated");
+ break;
+ case CLEANFAXDATA_UNCLEAN:
+ fprintf(fd, " uncorrected errors");
+ break;
+ }
+ fprintf(fd, " (%u = 0x%x)\n",
+ sp->cleanfaxdata, sp->cleanfaxdata);
+ }
+ if (TIFFFieldSet(tif,FIELD_BADFAXLINES))
+ fprintf(fd, " Bad Fax Lines: %lu\n", (u_long) sp->badfaxlines);
+ if (TIFFFieldSet(tif,FIELD_BADFAXRUN))
+ fprintf(fd, " Consecutive Bad Fax Lines: %lu\n",
+ (u_long) sp->badfaxrun);
+ if (TIFFFieldSet(tif,FIELD_RECVPARAMS))
+ fprintf(fd, " Fax Receive Parameters: %08lx\n",
+ (u_long) sp->recvparams);
+ if (TIFFFieldSet(tif,FIELD_SUBADDRESS))
+ fprintf(fd, " Fax SubAddress: %s\n", sp->subaddress);
+ if (TIFFFieldSet(tif,FIELD_RECVTIME))
+ fprintf(fd, " Fax Receive Time: %lu secs\n",
+ (u_long) sp->recvtime);
+}
+
+static int
+InitCCITTFax3(TIFF* tif)
+{
+ Fax3BaseState* sp;
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (tidata_t)
+ _TIFFmalloc(sizeof (Fax3CodecState));
+
+ if (tif->tif_data == NULL) {
+ TIFFError("TIFFInitCCITTFax3",
+ "%s: No space for state block", tif->tif_name);
+ return (0);
+ }
+
+ sp = Fax3State(tif);
+ sp->rw_mode = tif->tif_mode;
+
+ /*
+ * Merge codec-specific tag information and
+ * override parent get/set field methods.
+ */
+ _TIFFMergeFieldInfo(tif, faxFieldInfo, N(faxFieldInfo));
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = Fax3VGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = Fax3VSetField; /* hook for codec tags */
+ tif->tif_tagmethods.printdir = Fax3PrintDir; /* hook for codec tags */
+ sp->groupoptions = 0;
+ sp->recvparams = 0;
+ sp->subaddress = NULL;
+
+ tif->tif_flags |= TIFF_NOBITREV; /* decoder does bit reversal */
+ DecoderState(tif)->runs = NULL;
+ TIFFSetField(tif, TIFFTAG_FAXFILLFUNC, _TIFFFax3fillruns);
+ EncoderState(tif)->refline = NULL;
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_setupdecode = Fax3SetupState;
+ tif->tif_predecode = Fax3PreDecode;
+ tif->tif_decoderow = Fax3Decode1D;
+ tif->tif_decodestrip = Fax3Decode1D;
+ tif->tif_decodetile = Fax3Decode1D;
+ tif->tif_setupencode = Fax3SetupState;
+ tif->tif_preencode = Fax3PreEncode;
+ tif->tif_postencode = Fax3PostEncode;
+ tif->tif_encoderow = Fax3Encode;
+ tif->tif_encodestrip = Fax3Encode;
+ tif->tif_encodetile = Fax3Encode;
+ tif->tif_close = Fax3Close;
+ tif->tif_cleanup = Fax3Cleanup;
+
+ return (1);
+}
+
+int
+TIFFInitCCITTFax3(TIFF* tif, int scheme)
+{
+ if (InitCCITTFax3(tif)) {
+ _TIFFMergeFieldInfo(tif, fax3FieldInfo, N(fax3FieldInfo));
+
+ /*
+ * The default format is Class/F-style w/o RTC.
+ */
+ return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
+ } else
+ return (0);
+}
+
+/*
+ * CCITT Group 4 (T.6) Facsimile-compatible
+ * Compression Scheme Support.
+ */
+
+#define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; }
+/*
+ * Decode the requested amount of G4-encoded data.
+ */
+static int
+Fax4Decode(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
+{
+ DECLARE_STATE_2D(tif, sp, "Fax4Decode");
+
+ (void) s;
+ CACHE_STATE(tif, sp);
+ while ((long)occ > 0) {
+ a0 = 0;
+ RunLength = 0;
+ pa = thisrun = sp->curruns;
+ pb = sp->refruns;
+ b1 = *pb++;
+#ifdef FAX3_DEBUG
+ printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
+ printf("-------------------- %d\n", tif->tif_row);
+ fflush(stdout);
+#endif
+ EXPAND2D(EOFG4);
+ if (EOLcnt)
+ goto EOFG4;
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ SETVAL(0); /* imaginary change for reference */
+ SWAP(uint32*, sp->curruns, sp->refruns);
+ buf += sp->b.rowbytes;
+ occ -= sp->b.rowbytes;
+ continue;
+ EOFG4:
+ NeedBits16( 13, BADG4 );
+ BADG4:
+#ifdef FAX3_DEBUG
+ if( GetBits(13) != 0x1001 )
+ fputs( "Bad RTC\n", stderr );
+#endif
+ ClrBits( 13 );
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ UNCACHE_STATE(tif, sp);
+ return (-1);
+ }
+ UNCACHE_STATE(tif, sp);
+ return (1);
+}
+#undef SWAP
+
+/*
+ * Encode the requested amount of data.
+ */
+static int
+Fax4Encode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+ Fax3CodecState *sp = EncoderState(tif);
+
+ (void) s;
+ while ((long)cc > 0) {
+ if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels))
+ return (0);
+ _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes);
+ bp += sp->b.rowbytes;
+ cc -= sp->b.rowbytes;
+ }
+ return (1);
+}
+
+static int
+Fax4PostEncode(TIFF* tif)
+{
+ Fax3CodecState *sp = EncoderState(tif);
+
+ /* terminate strip w/ EOFB */
+ Fax3PutBits(tif, EOL, 12);
+ Fax3PutBits(tif, EOL, 12);
+ if (sp->bit != 8)
+ Fax3FlushBits(tif, sp);
+ return (1);
+}
+
+int
+TIFFInitCCITTFax4(TIFF* tif, int scheme)
+{
+ if (InitCCITTFax3(tif)) { /* reuse G3 support */
+ _TIFFMergeFieldInfo(tif, fax4FieldInfo, N(fax4FieldInfo));
+
+ tif->tif_decoderow = Fax4Decode;
+ tif->tif_decodestrip = Fax4Decode;
+ tif->tif_decodetile = Fax4Decode;
+ tif->tif_encoderow = Fax4Encode;
+ tif->tif_encodestrip = Fax4Encode;
+ tif->tif_encodetile = Fax4Encode;
+ tif->tif_postencode = Fax4PostEncode;
+ /*
+ * Suppress RTC at the end of each strip.
+ */
+ return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC);
+ } else
+ return (0);
+}
+
+/*
+ * CCITT Group 3 1-D Modified Huffman RLE Compression Support.
+ * (Compression algorithms 2 and 32771)
+ */
+
+/*
+ * Decode the requested amount of RLE-encoded data.
+ */
+static int
+Fax3DecodeRLE(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
+{
+ DECLARE_STATE(tif, sp, "Fax3DecodeRLE");
+ int mode = sp->b.mode;
+
+ (void) s;
+ CACHE_STATE(tif, sp);
+ thisrun = sp->curruns;
+ while ((long)occ > 0) {
+ a0 = 0;
+ RunLength = 0;
+ pa = thisrun;
+#ifdef FAX3_DEBUG
+ printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
+ printf("-------------------- %d\n", tif->tif_row);
+ fflush(stdout);
+#endif
+ EXPAND1D(EOFRLE);
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ /*
+ * Cleanup at the end of the row.
+ */
+ if (mode & FAXMODE_BYTEALIGN) {
+ int n = BitsAvail - (BitsAvail &~ 7);
+ ClrBits(n);
+ } else if (mode & FAXMODE_WORDALIGN) {
+ int n = BitsAvail - (BitsAvail &~ 15);
+ ClrBits(n);
+ if (BitsAvail == 0 && !isAligned(cp, uint16))
+ cp++;
+ }
+ buf += sp->b.rowbytes;
+ occ -= sp->b.rowbytes;
+ continue;
+ EOFRLE: /* premature EOF */
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ UNCACHE_STATE(tif, sp);
+ return (-1);
+ }
+ UNCACHE_STATE(tif, sp);
+ return (1);
+}
+
+int
+TIFFInitCCITTRLE(TIFF* tif, int scheme)
+{
+ if (InitCCITTFax3(tif)) { /* reuse G3 support */
+ tif->tif_decoderow = Fax3DecodeRLE;
+ tif->tif_decodestrip = Fax3DecodeRLE;
+ tif->tif_decodetile = Fax3DecodeRLE;
+ /*
+ * Suppress RTC+EOLs when encoding and byte-align data.
+ */
+ return TIFFSetField(tif, TIFFTAG_FAXMODE,
+ FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_BYTEALIGN);
+ } else
+ return (0);
+}
+
+int
+TIFFInitCCITTRLEW(TIFF* tif, int scheme)
+{
+ if (InitCCITTFax3(tif)) { /* reuse G3 support */
+ tif->tif_decoderow = Fax3DecodeRLE;
+ tif->tif_decodestrip = Fax3DecodeRLE;
+ tif->tif_decodetile = Fax3DecodeRLE;
+ /*
+ * Suppress RTC+EOLs when encoding and word-align data.
+ */
+ return TIFFSetField(tif, TIFFTAG_FAXMODE,
+ FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_WORDALIGN);
+ } else
+ return (0);
+}
+#endif /* CCITT_SUPPORT */
diff --git a/src/tiff/tif_fax3.h b/src/tiff/tif_fax3.h
new file mode 100644
index 0000000..b1f078c
--- /dev/null
+++ b/src/tiff/tif_fax3.h
@@ -0,0 +1,525 @@
+/* $Id: tif_fax3.h,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1990-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _FAX3_
+#define _FAX3_
+/*
+ * TIFF Library.
+ *
+ * CCITT Group 3 (T.4) and Group 4 (T.6) Decompression Support.
+ *
+ * Decoder support is derived, with permission, from the code
+ * in Frank Cringle's viewfax program;
+ * Copyright (C) 1990, 1995 Frank D. Cringle.
+ */
+#include "tiff.h"
+
+/*
+ * To override the default routine used to image decoded
+ * spans one can use the pseduo tag TIFFTAG_FAXFILLFUNC.
+ * The routine must have the type signature given below;
+ * for example:
+ *
+ * fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx)
+ *
+ * where buf is place to set the bits, runs is the array of b&w run
+ * lengths (white then black), erun is the last run in the array, and
+ * lastx is the width of the row in pixels. Fill routines can assume
+ * the run array has room for at least lastx runs and can overwrite
+ * data in the run array as needed (e.g. to append zero runs to bring
+ * the count up to a nice multiple).
+ */
+typedef void (*TIFFFaxFillFunc)(unsigned char*, uint32*, uint32*, uint32);
+
+/*
+ * The default run filler; made external for other decoders.
+ */
+#if defined(__cplusplus)
+extern "C" {
+#endif
+extern void _TIFFFax3fillruns(unsigned char*, uint32*, uint32*, uint32);
+#if defined(__cplusplus)
+}
+#endif
+
+
+/* finite state machine codes */
+#define S_Null 0
+#define S_Pass 1
+#define S_Horiz 2
+#define S_V0 3
+#define S_VR 4
+#define S_VL 5
+#define S_Ext 6
+#define S_TermW 7
+#define S_TermB 8
+#define S_MakeUpW 9
+#define S_MakeUpB 10
+#define S_MakeUp 11
+#define S_EOL 12
+
+typedef struct { /* state table entry */
+ unsigned char State; /* see above */
+ unsigned char Width; /* width of code in bits */
+ uint32 Param; /* unsigned 32-bit run length in bits */
+} TIFFFaxTabEnt;
+
+extern const TIFFFaxTabEnt TIFFFaxMainTable[];
+extern const TIFFFaxTabEnt TIFFFaxWhiteTable[];
+extern const TIFFFaxTabEnt TIFFFaxBlackTable[];
+
+/*
+ * The following macros define the majority of the G3/G4 decoder
+ * algorithm using the state tables defined elsewhere. To build
+ * a decoder you need some setup code and some glue code. Note
+ * that you may also need/want to change the way the NeedBits*
+ * macros get input data if, for example, you know the data to be
+ * decoded is properly aligned and oriented (doing so before running
+ * the decoder can be a big performance win).
+ *
+ * Consult the decoder in the TIFF library for an idea of what you
+ * need to define and setup to make use of these definitions.
+ *
+ * NB: to enable a debugging version of these macros define FAX3_DEBUG
+ * before including this file. Trace output goes to stdout.
+ */
+
+#ifndef EndOfData
+#define EndOfData() (cp >= ep)
+#endif
+/*
+ * Need <=8 or <=16 bits of input data. Unlike viewfax we
+ * cannot use/assume a word-aligned, properly bit swizzled
+ * input data set because data may come from an arbitrarily
+ * aligned, read-only source such as a memory-mapped file.
+ * Note also that the viewfax decoder does not check for
+ * running off the end of the input data buffer. This is
+ * possible for G3-encoded data because it prescans the input
+ * data to count EOL markers, but can cause problems for G4
+ * data. In any event, we don't prescan and must watch for
+ * running out of data since we can't permit the library to
+ * scan past the end of the input data buffer.
+ *
+ * Finally, note that we must handle remaindered data at the end
+ * of a strip specially. The coder asks for a fixed number of
+ * bits when scanning for the next code. This may be more bits
+ * than are actually present in the data stream. If we appear
+ * to run out of data but still have some number of valid bits
+ * remaining then we makeup the requested amount with zeros and
+ * return successfully. If the returned data is incorrect then
+ * we should be called again and get a premature EOF error;
+ * otherwise we should get the right answer.
+ */
+#ifndef NeedBits8
+#define NeedBits8(n,eoflab) do { \
+ if (BitsAvail < (n)) { \
+ if (EndOfData()) { \
+ if (BitsAvail == 0) /* no valid bits */ \
+ goto eoflab; \
+ BitsAvail = (n); /* pad with zeros */ \
+ } else { \
+ BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \
+ BitsAvail += 8; \
+ } \
+ } \
+} while (0)
+#endif
+#ifndef NeedBits16
+#define NeedBits16(n,eoflab) do { \
+ if (BitsAvail < (n)) { \
+ if (EndOfData()) { \
+ if (BitsAvail == 0) /* no valid bits */ \
+ goto eoflab; \
+ BitsAvail = (n); /* pad with zeros */ \
+ } else { \
+ BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \
+ if ((BitsAvail += 8) < (n)) { \
+ if (EndOfData()) { \
+ /* NB: we know BitsAvail is non-zero here */ \
+ BitsAvail = (n); /* pad with zeros */ \
+ } else { \
+ BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \
+ BitsAvail += 8; \
+ } \
+ } \
+ } \
+ } \
+} while (0)
+#endif
+#define GetBits(n) (BitAcc & ((1<<(n))-1))
+#define ClrBits(n) do { \
+ BitsAvail -= (n); \
+ BitAcc >>= (n); \
+} while (0)
+
+#ifdef FAX3_DEBUG
+static const char* StateNames[] = {
+ "Null ",
+ "Pass ",
+ "Horiz ",
+ "V0 ",
+ "VR ",
+ "VL ",
+ "Ext ",
+ "TermW ",
+ "TermB ",
+ "MakeUpW",
+ "MakeUpB",
+ "MakeUp ",
+ "EOL ",
+};
+#define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0')
+#define LOOKUP8(wid,tab,eoflab) do { \
+ int t; \
+ NeedBits8(wid,eoflab); \
+ TabEnt = tab + GetBits(wid); \
+ printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \
+ StateNames[TabEnt->State], TabEnt->Param); \
+ for (t = 0; t < TabEnt->Width; t++) \
+ DEBUG_SHOW; \
+ putchar('\n'); \
+ fflush(stdout); \
+ ClrBits(TabEnt->Width); \
+} while (0)
+#define LOOKUP16(wid,tab,eoflab) do { \
+ int t; \
+ NeedBits16(wid,eoflab); \
+ TabEnt = tab + GetBits(wid); \
+ printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \
+ StateNames[TabEnt->State], TabEnt->Param); \
+ for (t = 0; t < TabEnt->Width; t++) \
+ DEBUG_SHOW; \
+ putchar('\n'); \
+ fflush(stdout); \
+ ClrBits(TabEnt->Width); \
+} while (0)
+
+#define SETVAL(x) do { \
+ *pa++ = RunLength + (x); \
+ printf("SETVAL: %d\t%d\n", RunLength + (x), a0); \
+ a0 += x; \
+ RunLength = 0; \
+} while (0)
+#else
+#define LOOKUP8(wid,tab,eoflab) do { \
+ NeedBits8(wid,eoflab); \
+ TabEnt = tab + GetBits(wid); \
+ ClrBits(TabEnt->Width); \
+} while (0)
+#define LOOKUP16(wid,tab,eoflab) do { \
+ NeedBits16(wid,eoflab); \
+ TabEnt = tab + GetBits(wid); \
+ ClrBits(TabEnt->Width); \
+} while (0)
+
+/*
+ * Append a run to the run length array for the
+ * current row and reset decoding state.
+ */
+#define SETVAL(x) do { \
+ *pa++ = RunLength + (x); \
+ a0 += (x); \
+ RunLength = 0; \
+} while (0)
+#endif
+
+/*
+ * Synchronize input decoding at the start of each
+ * row by scanning for an EOL (if appropriate) and
+ * skipping any trash data that might be present
+ * after a decoding error. Note that the decoding
+ * done elsewhere that recognizes an EOL only consumes
+ * 11 consecutive zero bits. This means that if EOLcnt
+ * is non-zero then we still need to scan for the final flag
+ * bit that is part of the EOL code.
+ */
+#define SYNC_EOL(eoflab) do { \
+ if (EOLcnt == 0) { \
+ for (;;) { \
+ NeedBits16(11,eoflab); \
+ if (GetBits(11) == 0) \
+ break; \
+ ClrBits(1); \
+ } \
+ } \
+ for (;;) { \
+ NeedBits8(8,eoflab); \
+ if (GetBits(8)) \
+ break; \
+ ClrBits(8); \
+ } \
+ while (GetBits(1) == 0) \
+ ClrBits(1); \
+ ClrBits(1); /* EOL bit */ \
+ EOLcnt = 0; /* reset EOL counter/flag */ \
+} while (0)
+
+/*
+ * Cleanup the array of runs after decoding a row.
+ * We adjust final runs to insure the user buffer is not
+ * overwritten and/or undecoded area is white filled.
+ */
+#define CLEANUP_RUNS() do { \
+ if (RunLength) \
+ SETVAL(0); \
+ if (a0 != lastx) { \
+ badlength(a0, lastx); \
+ while (a0 > lastx && pa > thisrun) \
+ a0 -= *--pa; \
+ if (a0 < lastx) { \
+ if (a0 < 0) \
+ a0 = 0; \
+ if ((pa-thisrun)&1) \
+ SETVAL(0); \
+ SETVAL(lastx - a0); \
+ } else if (a0 > lastx) { \
+ SETVAL(lastx); \
+ SETVAL(0); \
+ } \
+ } \
+} while (0)
+
+/*
+ * Decode a line of 1D-encoded data.
+ *
+ * The line expanders are written as macros so that they can be reused
+ * but still have direct access to the local variables of the "calling"
+ * function.
+ *
+ * Note that unlike the original version we have to explicitly test for
+ * a0 >= lastx after each black/white run is decoded. This is because
+ * the original code depended on the input data being zero-padded to
+ * insure the decoder recognized an EOL before running out of data.
+ */
+#define EXPAND1D(eoflab) do { \
+ for (;;) { \
+ for (;;) { \
+ LOOKUP16(12, TIFFFaxWhiteTable, eof1d); \
+ switch (TabEnt->State) { \
+ case S_EOL: \
+ EOLcnt = 1; \
+ goto done1d; \
+ case S_TermW: \
+ SETVAL(TabEnt->Param); \
+ goto doneWhite1d; \
+ case S_MakeUpW: \
+ case S_MakeUp: \
+ a0 += TabEnt->Param; \
+ RunLength += TabEnt->Param; \
+ break; \
+ default: \
+ unexpected("WhiteTable", a0); \
+ goto done1d; \
+ } \
+ } \
+ doneWhite1d: \
+ if (a0 >= lastx) \
+ goto done1d; \
+ for (;;) { \
+ LOOKUP16(13, TIFFFaxBlackTable, eof1d); \
+ switch (TabEnt->State) { \
+ case S_EOL: \
+ EOLcnt = 1; \
+ goto done1d; \
+ case S_TermB: \
+ SETVAL(TabEnt->Param); \
+ goto doneBlack1d; \
+ case S_MakeUpB: \
+ case S_MakeUp: \
+ a0 += TabEnt->Param; \
+ RunLength += TabEnt->Param; \
+ break; \
+ default: \
+ unexpected("BlackTable", a0); \
+ goto done1d; \
+ } \
+ } \
+ doneBlack1d: \
+ if (a0 >= lastx) \
+ goto done1d; \
+ if( *(pa-1) == 0 && *(pa-2) == 0 ) \
+ pa -= 2; \
+ } \
+eof1d: \
+ prematureEOF(a0); \
+ CLEANUP_RUNS(); \
+ goto eoflab; \
+done1d: \
+ CLEANUP_RUNS(); \
+} while (0)
+
+/*
+ * Update the value of b1 using the array
+ * of runs for the reference line.
+ */
+#define CHECK_b1 do { \
+ if (pa != thisrun) while (b1 <= a0 && b1 < lastx) { \
+ b1 += pb[0] + pb[1]; \
+ pb += 2; \
+ } \
+} while (0)
+
+/*
+ * Expand a row of 2D-encoded data.
+ */
+#define EXPAND2D(eoflab) do { \
+ while (a0 < lastx) { \
+ LOOKUP8(7, TIFFFaxMainTable, eof2d); \
+ switch (TabEnt->State) { \
+ case S_Pass: \
+ CHECK_b1; \
+ b1 += *pb++; \
+ RunLength += b1 - a0; \
+ a0 = b1; \
+ b1 += *pb++; \
+ break; \
+ case S_Horiz: \
+ if ((pa-thisrun)&1) { \
+ for (;;) { /* black first */ \
+ LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
+ switch (TabEnt->State) { \
+ case S_TermB: \
+ SETVAL(TabEnt->Param); \
+ goto doneWhite2da; \
+ case S_MakeUpB: \
+ case S_MakeUp: \
+ a0 += TabEnt->Param; \
+ RunLength += TabEnt->Param; \
+ break; \
+ default: \
+ goto badBlack2d; \
+ } \
+ } \
+ doneWhite2da:; \
+ for (;;) { /* then white */ \
+ LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
+ switch (TabEnt->State) { \
+ case S_TermW: \
+ SETVAL(TabEnt->Param); \
+ goto doneBlack2da; \
+ case S_MakeUpW: \
+ case S_MakeUp: \
+ a0 += TabEnt->Param; \
+ RunLength += TabEnt->Param; \
+ break; \
+ default: \
+ goto badWhite2d; \
+ } \
+ } \
+ doneBlack2da:; \
+ } else { \
+ for (;;) { /* white first */ \
+ LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
+ switch (TabEnt->State) { \
+ case S_TermW: \
+ SETVAL(TabEnt->Param); \
+ goto doneWhite2db; \
+ case S_MakeUpW: \
+ case S_MakeUp: \
+ a0 += TabEnt->Param; \
+ RunLength += TabEnt->Param; \
+ break; \
+ default: \
+ goto badWhite2d; \
+ } \
+ } \
+ doneWhite2db:; \
+ for (;;) { /* then black */ \
+ LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
+ switch (TabEnt->State) { \
+ case S_TermB: \
+ SETVAL(TabEnt->Param); \
+ goto doneBlack2db; \
+ case S_MakeUpB: \
+ case S_MakeUp: \
+ a0 += TabEnt->Param; \
+ RunLength += TabEnt->Param; \
+ break; \
+ default: \
+ goto badBlack2d; \
+ } \
+ } \
+ doneBlack2db:; \
+ } \
+ CHECK_b1; \
+ break; \
+ case S_V0: \
+ CHECK_b1; \
+ SETVAL(b1 - a0); \
+ b1 += *pb++; \
+ break; \
+ case S_VR: \
+ CHECK_b1; \
+ SETVAL(b1 - a0 + TabEnt->Param); \
+ b1 += *pb++; \
+ break; \
+ case S_VL: \
+ CHECK_b1; \
+ SETVAL(b1 - a0 - TabEnt->Param); \
+ b1 -= *--pb; \
+ break; \
+ case S_Ext: \
+ *pa++ = lastx - a0; \
+ extension(a0); \
+ goto eol2d; \
+ case S_EOL: \
+ *pa++ = lastx - a0; \
+ NeedBits8(4,eof2d); \
+ if (GetBits(4)) \
+ unexpected("EOL", a0); \
+ ClrBits(4); \
+ EOLcnt = 1; \
+ goto eol2d; \
+ default: \
+ badMain2d: \
+ unexpected("MainTable", a0); \
+ goto eol2d; \
+ badBlack2d: \
+ unexpected("BlackTable", a0); \
+ goto eol2d; \
+ badWhite2d: \
+ unexpected("WhiteTable", a0); \
+ goto eol2d; \
+ eof2d: \
+ prematureEOF(a0); \
+ CLEANUP_RUNS(); \
+ goto eoflab; \
+ } \
+ } \
+ if (RunLength) { \
+ if (RunLength + a0 < lastx) { \
+ /* expect a final V0 */ \
+ NeedBits8(1,eof2d); \
+ if (!GetBits(1)) \
+ goto badMain2d; \
+ ClrBits(1); \
+ } \
+ SETVAL(0); \
+ } \
+eol2d: \
+ CLEANUP_RUNS(); \
+} while (0)
+#endif /* _FAX3_ */
diff --git a/src/tiff/tif_flush.c b/src/tiff/tif_flush.c
new file mode 100644
index 0000000..a89b096
--- /dev/null
+++ b/src/tiff/tif_flush.c
@@ -0,0 +1,67 @@
+/* $Header: /home/terralib/src/tiff/tif_flush.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ */
+#include "tiffiop.h"
+
+int
+TIFFFlush(TIFF* tif)
+{
+
+ if (tif->tif_mode != O_RDONLY) {
+ if (!TIFFFlushData(tif))
+ return (0);
+ if ((tif->tif_flags & TIFF_DIRTYDIRECT) &&
+ !TIFFWriteDirectory(tif))
+ return (0);
+ }
+ return (1);
+}
+
+/*
+ * Flush buffered data to the file.
+ *
+ * Frank Warmerdam'2000: I modified this to return 1 if TIFF_BEENWRITING
+ * is not set, so that TIFFFlush() will proceed to write out the directory.
+ * The documentation says returning 1 is an error indicator, but not having
+ * been writing isn't exactly a an error. Hopefully this doesn't cause
+ * problems for other people.
+ */
+int
+TIFFFlushData(TIFF* tif)
+{
+ if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
+ return (0);
+ if (tif->tif_flags & TIFF_POSTENCODE) {
+ tif->tif_flags &= ~TIFF_POSTENCODE;
+ if (!(*tif->tif_postencode)(tif))
+ return (0);
+ }
+ return (TIFFFlushData1(tif));
+}
+
diff --git a/src/tiff/tif_getimage.c b/src/tiff/tif_getimage.c
new file mode 100644
index 0000000..5abfd60
--- /dev/null
+++ b/src/tiff/tif_getimage.c
@@ -0,0 +1,2584 @@
+/* $Header: /home/terralib/src/tiff/tif_getimage.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1991-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library
+ *
+ * Read and return a packed RGBA image.
+ */
+#include "tiffiop.h"
+#include <assert.h>
+#include <stdio.h>
+
+static int gtTileContig(TIFFRGBAImage*, uint32*, uint32, uint32);
+static int gtTileSeparate(TIFFRGBAImage*, uint32*, uint32, uint32);
+static int gtStripContig(TIFFRGBAImage*, uint32*, uint32, uint32);
+static int gtStripSeparate(TIFFRGBAImage*, uint32*, uint32, uint32);
+static int pickTileContigCase(TIFFRGBAImage*);
+static int pickTileSeparateCase(TIFFRGBAImage*);
+
+static const char photoTag[] = "PhotometricInterpretation";
+
+/*
+ * Helper constants used in Orientation tag handling
+ */
+#define FLIP_VERTICALLY 0x01
+#define FLIP_HORIZONTALLY 0x02
+
+/*
+ * Color conversion constants. We will define display types here.
+ */
+
+TIFFDisplay display_sRGB = {
+ { /* XYZ -> luminance matrix */
+ { 3.2410F, -1.5374F, -0.4986F },
+ { -0.9692F, 1.8760F, 0.0416F },
+ { 0.0556F, -0.2040F, 1.0570F }
+ },
+ 100.0F, 100.0F, 100.0F, /* Light o/p for reference white */
+ 255, 255, 255, /* Pixel values for ref. white */
+ 1.0F, 1.0F, 1.0F, /* Residual light o/p for black pixel */
+ 2.4F, 2.4F, 2.4F, /* Gamma values for the three guns */
+};
+
+/*
+ * Check the image to see if TIFFReadRGBAImage can deal with it.
+ * 1/0 is returned according to whether or not the image can
+ * be handled. If 0 is returned, emsg contains the reason
+ * why it is being rejected.
+ */
+int
+TIFFRGBAImageOK(TIFF* tif, char emsg[1024])
+{
+ TIFFDirectory* td = &tif->tif_dir;
+ uint16 photometric;
+ int colorchannels;
+
+ if (!tif->tif_decodestatus) {
+ sprintf(emsg, "Sorry, requested compression method is not configured");
+ return (0);
+ }
+ switch (td->td_bitspersample) {
+ case 1: case 2: case 4:
+ case 8: case 16:
+ break;
+ default:
+ sprintf(emsg, "Sorry, can not handle images with %d-bit samples",
+ td->td_bitspersample);
+ return (0);
+ }
+ colorchannels = td->td_samplesperpixel - td->td_extrasamples;
+ if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric)) {
+ switch (colorchannels) {
+ case 1:
+ photometric = PHOTOMETRIC_MINISBLACK;
+ break;
+ case 3:
+ photometric = PHOTOMETRIC_RGB;
+ break;
+ default:
+ sprintf(emsg, "Missing needed %s tag", photoTag);
+ return (0);
+ }
+ }
+ switch (photometric) {
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
+ case PHOTOMETRIC_PALETTE:
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG
+ && td->td_samplesperpixel != 1
+ && td->td_bitspersample < 8 ) {
+ sprintf(emsg,
+ "Sorry, can not handle contiguous data with %s=%d, "
+ "and %s=%d and Bits/Sample=%d",
+ photoTag, photometric,
+ "Samples/pixel", td->td_samplesperpixel,
+ td->td_bitspersample);
+ return (0);
+ }
+ /*
+ ** We should likely validate that any extra samples are either
+ ** to be ignored, or are alpha, and if alpha we should try to use
+ ** them. But for now we won't bother with this.
+ */
+ break;
+ case PHOTOMETRIC_YCBCR:
+ if (td->td_planarconfig != PLANARCONFIG_CONTIG) {
+ sprintf(emsg, "Sorry, can not handle YCbCr images with %s=%d",
+ "Planarconfiguration", td->td_planarconfig);
+ return (0);
+ }
+ break;
+ case PHOTOMETRIC_RGB:
+ if (colorchannels < 3) {
+ sprintf(emsg, "Sorry, can not handle RGB image with %s=%d",
+ "Color channels", colorchannels);
+ return (0);
+ }
+ break;
+ case PHOTOMETRIC_SEPARATED:
+ if (td->td_inkset != INKSET_CMYK) {
+ sprintf(emsg, "Sorry, can not handle separated image with %s=%d",
+ "InkSet", td->td_inkset);
+ return (0);
+ }
+ if (td->td_samplesperpixel < 4) {
+ sprintf(emsg, "Sorry, can not handle separated image with %s=%d",
+ "Samples/pixel", td->td_samplesperpixel);
+ return (0);
+ }
+ break;
+ case PHOTOMETRIC_LOGL:
+ if (td->td_compression != COMPRESSION_SGILOG) {
+ sprintf(emsg, "Sorry, LogL data must have %s=%d",
+ "Compression", COMPRESSION_SGILOG);
+ return (0);
+ }
+ break;
+ case PHOTOMETRIC_LOGLUV:
+ if (td->td_compression != COMPRESSION_SGILOG &&
+ td->td_compression != COMPRESSION_SGILOG24) {
+ sprintf(emsg, "Sorry, LogLuv data must have %s=%d or %d",
+ "Compression", COMPRESSION_SGILOG, COMPRESSION_SGILOG24);
+ return (0);
+ }
+ if (td->td_planarconfig != PLANARCONFIG_CONTIG) {
+ sprintf(emsg, "Sorry, can not handle LogLuv images with %s=%d",
+ "Planarconfiguration", td->td_planarconfig);
+ return (0);
+ }
+ break;
+ case PHOTOMETRIC_CIELAB:
+ break;
+ default:
+ sprintf(emsg, "Sorry, can not handle image with %s=%d",
+ photoTag, photometric);
+ return (0);
+ }
+ return (1);
+}
+
+void
+TIFFRGBAImageEnd(TIFFRGBAImage* img)
+{
+ if (img->Map)
+ _TIFFfree(img->Map), img->Map = NULL;
+ if (img->BWmap)
+ _TIFFfree(img->BWmap), img->BWmap = NULL;
+ if (img->PALmap)
+ _TIFFfree(img->PALmap), img->PALmap = NULL;
+ if (img->ycbcr)
+ _TIFFfree(img->ycbcr), img->ycbcr = NULL;
+ if (img->cielab)
+ _TIFFfree(img->cielab), img->cielab = NULL;
+
+ if( img->redcmap ) {
+ _TIFFfree( img->redcmap );
+ _TIFFfree( img->greencmap );
+ _TIFFfree( img->bluecmap );
+ }
+}
+
+static int
+isCCITTCompression(TIFF* tif)
+{
+ uint16 compress;
+ TIFFGetField(tif, TIFFTAG_COMPRESSION, &compress);
+ return (compress == COMPRESSION_CCITTFAX3 ||
+ compress == COMPRESSION_CCITTFAX4 ||
+ compress == COMPRESSION_CCITTRLE ||
+ compress == COMPRESSION_CCITTRLEW);
+}
+
+int
+TIFFRGBAImageBegin(TIFFRGBAImage* img, TIFF* tif, int stop, char emsg[1024])
+{
+ uint16* sampleinfo;
+ uint16 extrasamples;
+ uint16 planarconfig;
+ uint16 compress;
+ int colorchannels;
+ uint16 *red_orig, *green_orig, *blue_orig;
+ int n_color;
+
+ /* Initialize to normal values */
+ img->row_offset = 0;
+ img->col_offset = 0;
+ img->redcmap = NULL;
+ img->greencmap = NULL;
+ img->bluecmap = NULL;
+ img->req_orientation = ORIENTATION_BOTLEFT; /* It is the default */
+
+ img->tif = tif;
+ img->stoponerr = stop;
+ TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &img->bitspersample);
+ switch (img->bitspersample) {
+ case 1: case 2: case 4:
+ case 8: case 16:
+ break;
+ default:
+ sprintf(emsg, "Sorry, can not handle images with %d-bit samples",
+ img->bitspersample);
+ return (0);
+ }
+ img->alpha = 0;
+ TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &img->samplesperpixel);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES,
+ &extrasamples, &sampleinfo);
+ if (extrasamples == 1)
+ {
+ switch (sampleinfo[0]) {
+ case EXTRASAMPLE_UNSPECIFIED: /* Workaround for some images without */
+ if (img->samplesperpixel == 4) /* correct info about alpha channel */
+ img->alpha = EXTRASAMPLE_ASSOCALPHA;
+ break;
+ case EXTRASAMPLE_ASSOCALPHA: /* data is pre-multiplied */
+ case EXTRASAMPLE_UNASSALPHA: /* data is not pre-multiplied */
+ img->alpha = sampleinfo[0];
+ break;
+ }
+ }
+
+#if DEFAULT_EXTRASAMPLE_AS_ALPHA == 1
+ if( !TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric))
+ img->photometric = PHOTOMETRIC_MINISWHITE;
+
+ if( extrasamples == 0
+ && img->samplesperpixel == 4
+ && img->photometric == PHOTOMETRIC_RGB )
+ {
+ img->alpha = EXTRASAMPLE_ASSOCALPHA;
+ extrasamples = 1;
+ }
+#endif
+
+ colorchannels = img->samplesperpixel - extrasamples;
+ TIFFGetFieldDefaulted(tif, TIFFTAG_COMPRESSION, &compress);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planarconfig);
+ if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric)) {
+ switch (colorchannels) {
+ case 1:
+ if (isCCITTCompression(tif))
+ img->photometric = PHOTOMETRIC_MINISWHITE;
+ else
+ img->photometric = PHOTOMETRIC_MINISBLACK;
+ break;
+ case 3:
+ img->photometric = PHOTOMETRIC_RGB;
+ break;
+ default:
+ sprintf(emsg, "Missing needed %s tag", photoTag);
+ return (0);
+ }
+ }
+ switch (img->photometric) {
+ case PHOTOMETRIC_PALETTE:
+ if (!TIFFGetField(tif, TIFFTAG_COLORMAP,
+ &red_orig, &green_orig, &blue_orig)) {
+ TIFFError(TIFFFileName(tif), "Missing required \"Colormap\" tag");
+ return (0);
+ }
+
+ /* copy the colormaps so we can modify them */
+ n_color = (1L << img->bitspersample);
+ img->redcmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color);
+ img->greencmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color);
+ img->bluecmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color);
+ if( !img->redcmap || !img->greencmap || !img->bluecmap ) {
+ TIFFError(TIFFFileName(tif), "Out of memory for colormap copy");
+ return (0);
+ }
+
+ memcpy( img->redcmap, red_orig, n_color * 2 );
+ memcpy( img->greencmap, green_orig, n_color * 2 );
+ memcpy( img->bluecmap, blue_orig, n_color * 2 );
+
+ /* fall thru... */
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
+ if (planarconfig == PLANARCONFIG_CONTIG
+ && img->samplesperpixel != 1
+ && img->bitspersample < 8 ) {
+ sprintf(emsg,
+ "Sorry, can not handle contiguous data with %s=%d, "
+ "and %s=%d and Bits/Sample=%d",
+ photoTag, img->photometric,
+ "Samples/pixel", img->samplesperpixel,
+ img->bitspersample);
+ return (0);
+ }
+ break;
+ case PHOTOMETRIC_YCBCR:
+ if (planarconfig != PLANARCONFIG_CONTIG) {
+ sprintf(emsg, "Sorry, can not handle YCbCr images with %s=%d",
+ "Planarconfiguration", planarconfig);
+ return (0);
+ }
+ /* It would probably be nice to have a reality check here. */
+ if (planarconfig == PLANARCONFIG_CONTIG)
+ /* can rely on libjpeg to convert to RGB */
+ /* XXX should restore current state on exit */
+ switch (compress) {
+ case COMPRESSION_OJPEG:
+ case COMPRESSION_JPEG:
+ TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
+ img->photometric = PHOTOMETRIC_RGB;
+ break;
+
+ default:
+ /* do nothing */;
+ break;
+ }
+ break;
+ case PHOTOMETRIC_RGB:
+ if (colorchannels < 3) {
+ sprintf(emsg, "Sorry, can not handle RGB image with %s=%d",
+ "Color channels", colorchannels);
+ return (0);
+ }
+ break;
+ case PHOTOMETRIC_SEPARATED: {
+ uint16 inkset;
+ TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset);
+ if (inkset != INKSET_CMYK) {
+ sprintf(emsg, "Sorry, can not handle separated image with %s=%d",
+ "InkSet", inkset);
+ return (0);
+ }
+ if (img->samplesperpixel < 4) {
+ sprintf(emsg, "Sorry, can not handle separated image with %s=%d",
+ "Samples/pixel", img->samplesperpixel);
+ return (0);
+ }
+ break;
+ }
+ case PHOTOMETRIC_LOGL:
+ if (compress != COMPRESSION_SGILOG) {
+ sprintf(emsg, "Sorry, LogL data must have %s=%d",
+ "Compression", COMPRESSION_SGILOG);
+ return (0);
+ }
+ TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT);
+ img->photometric = PHOTOMETRIC_MINISBLACK; /* little white lie */
+ img->bitspersample = 8;
+ break;
+ case PHOTOMETRIC_LOGLUV:
+ if (compress != COMPRESSION_SGILOG && compress != COMPRESSION_SGILOG24) {
+ sprintf(emsg, "Sorry, LogLuv data must have %s=%d or %d",
+ "Compression", COMPRESSION_SGILOG, COMPRESSION_SGILOG24);
+ return (0);
+ }
+ if (planarconfig != PLANARCONFIG_CONTIG) {
+ sprintf(emsg, "Sorry, can not handle LogLuv images with %s=%d",
+ "Planarconfiguration", planarconfig);
+ return (0);
+ }
+ TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT);
+ img->photometric = PHOTOMETRIC_RGB; /* little white lie */
+ img->bitspersample = 8;
+ break;
+ case PHOTOMETRIC_CIELAB:
+ break;
+ default:
+ sprintf(emsg, "Sorry, can not handle image with %s=%d",
+ photoTag, img->photometric);
+ return (0);
+ }
+ img->Map = NULL;
+ img->BWmap = NULL;
+ img->PALmap = NULL;
+ img->ycbcr = NULL;
+ img->cielab = NULL;
+ TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &img->width);
+ TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &img->height);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_ORIENTATION, &img->orientation);
+ img->isContig =
+ !(planarconfig == PLANARCONFIG_SEPARATE && colorchannels > 1);
+ if (img->isContig) {
+ img->get = TIFFIsTiled(tif) ? gtTileContig : gtStripContig;
+ return pickTileContigCase(img);
+ } else {
+ img->get = TIFFIsTiled(tif) ? gtTileSeparate : gtStripSeparate;
+ return pickTileSeparateCase(img);
+ }
+}
+
+int
+TIFFRGBAImageGet(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
+{
+ if (img->get == NULL) {
+ TIFFError(TIFFFileName(img->tif), "No \"get\" routine setup");
+ return (0);
+ }
+ if (img->put.any == NULL) {
+ TIFFError(TIFFFileName(img->tif),
+ "No \"put\" routine setupl; probably can not handle image format");
+ return (0);
+ }
+ return (*img->get)(img, raster, w, h);
+}
+
+/*
+ * Read the specified image into an ABGR-format rastertaking in account
+ * specified orientation.
+ */
+int
+TIFFReadRGBAImageOriented(TIFF* tif,
+ uint32 rwidth, uint32 rheight, uint32* raster,
+ int orientation, int stop)
+{
+ char emsg[1024];
+ TIFFRGBAImage img;
+ int ok;
+
+ if (TIFFRGBAImageOK(tif, emsg) &&
+ TIFFRGBAImageBegin(&img, tif, stop, emsg)) {
+ img.req_orientation = orientation;
+ /* XXX verify rwidth and rheight against width and height */
+ ok = TIFFRGBAImageGet(&img, raster+(rheight-img.height)*rwidth,
+ rwidth, img.height);
+ TIFFRGBAImageEnd(&img);
+ } else {
+ TIFFError(TIFFFileName(tif), emsg);
+ ok = 0;
+ }
+ return (ok);
+}
+
+/*
+ * Read the specified image into an ABGR-format raster. Use bottom left
+ * origin for raster by default.
+ */
+int
+TIFFReadRGBAImage(TIFF* tif,
+ uint32 rwidth, uint32 rheight, uint32* raster, int stop)
+{
+ return TIFFReadRGBAImageOriented(tif, rwidth, rheight, raster,
+ ORIENTATION_BOTLEFT, stop);
+}
+
+static int
+setorientation(TIFFRGBAImage* img)
+{
+ switch (img->orientation) {
+ case ORIENTATION_TOPLEFT:
+ case ORIENTATION_LEFTTOP:
+ if (img->req_orientation == ORIENTATION_TOPRIGHT ||
+ img->req_orientation == ORIENTATION_RIGHTTOP)
+ return FLIP_HORIZONTALLY;
+ else if (img->req_orientation == ORIENTATION_BOTRIGHT ||
+ img->req_orientation == ORIENTATION_RIGHTBOT)
+ return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
+ else if (img->req_orientation == ORIENTATION_BOTLEFT ||
+ img->req_orientation == ORIENTATION_LEFTBOT)
+ return FLIP_VERTICALLY;
+ else
+ return 0;
+ case ORIENTATION_TOPRIGHT:
+ case ORIENTATION_RIGHTTOP:
+ if (img->req_orientation == ORIENTATION_TOPLEFT ||
+ img->req_orientation == ORIENTATION_LEFTTOP)
+ return FLIP_HORIZONTALLY;
+ else if (img->req_orientation == ORIENTATION_BOTRIGHT ||
+ img->req_orientation == ORIENTATION_RIGHTBOT)
+ return FLIP_VERTICALLY;
+ else if (img->req_orientation == ORIENTATION_BOTLEFT ||
+ img->req_orientation == ORIENTATION_LEFTBOT)
+ return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
+ else
+ return 0;
+ case ORIENTATION_BOTRIGHT:
+ case ORIENTATION_RIGHTBOT:
+ if (img->req_orientation == ORIENTATION_TOPLEFT ||
+ img->req_orientation == ORIENTATION_LEFTTOP)
+ return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
+ else if (img->req_orientation == ORIENTATION_TOPRIGHT ||
+ img->req_orientation == ORIENTATION_RIGHTTOP)
+ return FLIP_VERTICALLY;
+ else if (img->req_orientation == ORIENTATION_BOTLEFT ||
+ img->req_orientation == ORIENTATION_LEFTBOT)
+ return FLIP_HORIZONTALLY;
+ else
+ return 0;
+ case ORIENTATION_BOTLEFT:
+ case ORIENTATION_LEFTBOT:
+ if (img->req_orientation == ORIENTATION_TOPLEFT ||
+ img->req_orientation == ORIENTATION_LEFTTOP)
+ return FLIP_VERTICALLY;
+ else if (img->req_orientation == ORIENTATION_TOPRIGHT ||
+ img->req_orientation == ORIENTATION_RIGHTTOP)
+ return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
+ else if (img->req_orientation == ORIENTATION_BOTRIGHT ||
+ img->req_orientation == ORIENTATION_RIGHTBOT)
+ return FLIP_HORIZONTALLY;
+ else
+ return 0;
+ default: /* NOTREACHED */
+ return 0;
+ }
+}
+
+/*
+ * Get an tile-organized image that has
+ * PlanarConfiguration contiguous if SamplesPerPixel > 1
+ * or
+ * SamplesPerPixel == 1
+ */
+static int
+gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
+{
+ TIFF* tif = img->tif;
+ tileContigRoutine put = img->put.contig;
+ uint32 col, row, y, rowstoread;
+ uint32 pos;
+ uint32 tw, th;
+ u_char* buf;
+ int32 fromskew, toskew;
+ uint32 nrow;
+ int ret = 1, flip;
+
+ buf = (u_char*) _TIFFmalloc(TIFFTileSize(tif));
+ if (buf == 0) {
+ TIFFError(TIFFFileName(tif), "No space for tile buffer");
+ return (0);
+ }
+ TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);
+ TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);
+
+ flip = setorientation(img);
+ if (flip & FLIP_VERTICALLY) {
+ y = h - 1;
+ toskew = -(int32)(tw + w);
+ }
+ else {
+ y = 0;
+ toskew = -(int32)(tw - w);
+ }
+
+ for (row = 0; row < h; row += nrow)
+ {
+ rowstoread = th - (row + img->row_offset) % th;
+ nrow = (row + rowstoread > h ? h - row : rowstoread);
+ for (col = 0; col < w; col += tw)
+ {
+ if (TIFFReadTile(tif, buf, col+img->col_offset,
+ row+img->row_offset, 0, 0) < 0 && img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+
+ pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif);
+
+ if (col + tw > w)
+ {
+ /*
+ * Tile is clipped horizontally. Calculate
+ * visible portion and skewing factors.
+ */
+ uint32 npix = w - col;
+ fromskew = tw - npix;
+ (*put)(img, raster+y*w+col, col, y,
+ npix, nrow, fromskew, toskew + fromskew, buf + pos);
+ }
+ else
+ {
+ (*put)(img, raster+y*w+col, col, y, tw, nrow, 0, toskew, buf + pos);
+ }
+ }
+
+ y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow);
+ }
+ _TIFFfree(buf);
+
+ if (flip & FLIP_HORIZONTALLY) {
+ uint32 line;
+
+ for (line = 0; line < h; line++) {
+ uint32 *left = raster + (line * w);
+ uint32 *right = left + w - 1;
+
+ while ( left < right ) {
+ uint32 temp = *left;
+ *left = *right;
+ *right = temp;
+ left++, right--;
+ }
+ }
+ }
+
+ return (ret);
+}
+
+/*
+ * Get an tile-organized image that has
+ * SamplesPerPixel > 1
+ * PlanarConfiguration separated
+ * We assume that all such images are RGB.
+ */
+static int
+gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
+{
+ TIFF* tif = img->tif;
+ tileSeparateRoutine put = img->put.separate;
+ uint32 col, row, y, rowstoread;
+ uint32 pos;
+ uint32 tw, th;
+ u_char* buf;
+ u_char* r;
+ u_char* g;
+ u_char* b;
+ u_char* a;
+ tsize_t tilesize;
+ int32 fromskew, toskew;
+ int alpha = img->alpha;
+ uint32 nrow;
+ int ret = 1, flip;
+
+ tilesize = TIFFTileSize(tif);
+ buf = (u_char*) _TIFFmalloc(4*tilesize);
+ if (buf == 0) {
+ TIFFError(TIFFFileName(tif), "No space for tile buffer");
+ return (0);
+ }
+ r = buf;
+ g = r + tilesize;
+ b = g + tilesize;
+ a = b + tilesize;
+ if (!alpha)
+ memset(a, 0xff, tilesize);
+ TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);
+ TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);
+
+ flip = setorientation(img);
+ if (flip & FLIP_VERTICALLY) {
+ y = h - 1;
+ toskew = -(int32)(tw + w);
+ }
+ else {
+ y = 0;
+ toskew = -(int32)(tw - w);
+ }
+
+ for (row = 0; row < h; row += nrow)
+ {
+ rowstoread = th - (row + img->row_offset) % th;
+ nrow = (row + rowstoread > h ? h - row : rowstoread);
+ for (col = 0; col < w; col += tw)
+ {
+ if (TIFFReadTile(tif, r, col+img->col_offset,
+ row+img->row_offset,0,0) < 0 && img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+ if (TIFFReadTile(tif, g, col+img->col_offset,
+ row+img->row_offset,0,1) < 0 && img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+ if (TIFFReadTile(tif, b, col+img->col_offset,
+ row+img->row_offset,0,2) < 0 && img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+ if (alpha && TIFFReadTile(tif,a,col+img->col_offset,
+ row+img->row_offset,0,3) < 0 && img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+
+ pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif);
+
+ if (col + tw > w)
+ {
+ /*
+ * Tile is clipped horizontally. Calculate
+ * visible portion and skewing factors.
+ */
+ uint32 npix = w - col;
+ fromskew = tw - npix;
+ (*put)(img, raster+y*w+col, col, y,
+ npix, nrow, fromskew, toskew + fromskew,
+ r + pos, g + pos, b + pos, a + pos);
+ }
+ else
+ {
+ (*put)(img, raster+y*w+col, col, y,
+ tw, nrow, 0, toskew, r + pos, g + pos, b + pos, a + pos);
+ }
+ }
+
+ y += (flip & FLIP_VERTICALLY ?-(int32) nrow : (int32) nrow);
+ }
+
+ if (flip & FLIP_HORIZONTALLY) {
+ uint32 line;
+
+ for (line = 0; line < h; line++) {
+ uint32 *left = raster + (line * w);
+ uint32 *right = left + w - 1;
+
+ while ( left < right ) {
+ uint32 temp = *left;
+ *left = *right;
+ *right = temp;
+ left++, right--;
+ }
+ }
+ }
+
+ _TIFFfree(buf);
+ return (ret);
+}
+
+/*
+ * Get a strip-organized image that has
+ * PlanarConfiguration contiguous if SamplesPerPixel > 1
+ * or
+ * SamplesPerPixel == 1
+ */
+static int
+gtStripContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
+{
+ TIFF* tif = img->tif;
+ tileContigRoutine put = img->put.contig;
+ uint32 row, y, nrow, rowstoread;
+ uint32 pos;
+ u_char* buf;
+ uint32 rowsperstrip;
+ uint32 imagewidth = img->width;
+ tsize_t scanline;
+ int32 fromskew, toskew;
+ int ret = 1, flip;
+
+ buf = (u_char*) _TIFFmalloc(TIFFStripSize(tif));
+ if (buf == 0) {
+ TIFFError(TIFFFileName(tif), "No space for strip buffer");
+ return (0);
+ }
+
+ flip = setorientation(img);
+ if (flip & FLIP_VERTICALLY) {
+ y = h - 1;
+ toskew = -(int32)(w + w);
+ }
+ else {
+ y = 0;
+ toskew = -(int32)(w - w);
+ }
+
+ TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+ scanline = TIFFScanlineSize(tif);
+ fromskew = (w < imagewidth ? imagewidth - w : 0);
+ for (row = 0; row < h; row += nrow)
+ {
+ rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip;
+ nrow = (row + rowstoread > h ? h - row : rowstoread);
+ if (TIFFReadEncodedStrip(tif,
+ TIFFComputeStrip(tif,row+img->row_offset, 0),
+ buf,
+ ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0
+ && img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+
+ pos = ((row + img->row_offset) % rowsperstrip) * scanline;
+ (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, buf + pos);
+ y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow);
+ }
+
+ if (flip & FLIP_HORIZONTALLY) {
+ uint32 line;
+
+ for (line = 0; line < h; line++) {
+ uint32 *left = raster + (line * w);
+ uint32 *right = left + w - 1;
+
+ while ( left < right ) {
+ uint32 temp = *left;
+ *left = *right;
+ *right = temp;
+ left++, right--;
+ }
+ }
+ }
+
+ _TIFFfree(buf);
+ return (ret);
+}
+
+/*
+ * Get a strip-organized image with
+ * SamplesPerPixel > 1
+ * PlanarConfiguration separated
+ * We assume that all such images are RGB.
+ */
+static int
+gtStripSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
+{
+ TIFF* tif = img->tif;
+ tileSeparateRoutine put = img->put.separate;
+ u_char *buf;
+ u_char *r, *g, *b, *a;
+ uint32 row, y, nrow, rowstoread;
+ uint32 pos;
+ tsize_t scanline;
+ uint32 rowsperstrip, offset_row;
+ uint32 imagewidth = img->width;
+ tsize_t stripsize;
+ int32 fromskew, toskew;
+ int alpha = img->alpha;
+ int ret = 1, flip;
+
+ stripsize = TIFFStripSize(tif);
+ r = buf = (u_char *)_TIFFmalloc(4*stripsize);
+ if (buf == 0) {
+ TIFFError(TIFFFileName(tif), "No space for tile buffer");
+ return (0);
+ }
+ g = r + stripsize;
+ b = g + stripsize;
+ a = b + stripsize;
+ if (!alpha)
+ memset(a, 0xff, stripsize);
+
+ flip = setorientation(img);
+ if (flip & FLIP_VERTICALLY) {
+ y = h - 1;
+ toskew = -(int32)(w + w);
+ }
+ else {
+ y = 0;
+ toskew = -(int32)(w - w);
+ }
+
+ TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+ scanline = TIFFScanlineSize(tif);
+ fromskew = (w < imagewidth ? imagewidth - w : 0);
+ for (row = 0; row < h; row += nrow)
+ {
+ rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip;
+ nrow = (row + rowstoread > h ? h - row : rowstoread);
+ offset_row = row + img->row_offset;
+ if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 0),
+ r, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0
+ && img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+ if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 1),
+ g, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0
+ && img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+ if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 2),
+ b, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0
+ && img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+ if (alpha &&
+ (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 3),
+ a, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0
+ && img->stoponerr))
+ {
+ ret = 0;
+ break;
+ }
+
+ pos = ((row + img->row_offset) % rowsperstrip) * scanline;
+ (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, r + pos, g + pos,
+ b + pos, a + pos);
+ y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow);
+ }
+
+ if (flip & FLIP_HORIZONTALLY) {
+ uint32 line;
+
+ for (line = 0; line < h; line++) {
+ uint32 *left = raster + (line * w);
+ uint32 *right = left + w - 1;
+
+ while ( left < right ) {
+ uint32 temp = *left;
+ *left = *right;
+ *right = temp;
+ left++, right--;
+ }
+ }
+ }
+
+ _TIFFfree(buf);
+ return (ret);
+}
+
+/*
+ * The following routines move decoded data returned
+ * from the TIFF library into rasters filled with packed
+ * ABGR pixels (i.e. suitable for passing to lrecwrite.)
+ *
+ * The routines have been created according to the most
+ * important cases and optimized. pickTileContigCase and
+ * pickTileSeparateCase analyze the parameters and select
+ * the appropriate "put" routine to use.
+ */
+#define REPEAT8(op) REPEAT4(op); REPEAT4(op)
+#define REPEAT4(op) REPEAT2(op); REPEAT2(op)
+#define REPEAT2(op) op; op
+#define CASE8(x,op) \
+ switch (x) { \
+ case 7: op; case 6: op; case 5: op; \
+ case 4: op; case 3: op; case 2: op; \
+ case 1: op; \
+ }
+#define CASE4(x,op) switch (x) { case 3: op; case 2: op; case 1: op; }
+#define NOP
+
+#define UNROLL8(w, op1, op2) { \
+ uint32 _x; \
+ for (_x = w; _x >= 8; _x -= 8) { \
+ op1; \
+ REPEAT8(op2); \
+ } \
+ if (_x > 0) { \
+ op1; \
+ CASE8(_x,op2); \
+ } \
+}
+#define UNROLL4(w, op1, op2) { \
+ uint32 _x; \
+ for (_x = w; _x >= 4; _x -= 4) { \
+ op1; \
+ REPEAT4(op2); \
+ } \
+ if (_x > 0) { \
+ op1; \
+ CASE4(_x,op2); \
+ } \
+}
+#define UNROLL2(w, op1, op2) { \
+ uint32 _x; \
+ for (_x = w; _x >= 2; _x -= 2) { \
+ op1; \
+ REPEAT2(op2); \
+ } \
+ if (_x) { \
+ op1; \
+ op2; \
+ } \
+}
+
+#define SKEW(r,g,b,skew) { r += skew; g += skew; b += skew; }
+#define SKEW4(r,g,b,a,skew) { r += skew; g += skew; b += skew; a+= skew; }
+
+#define A1 ((uint32)(0xffL<<24))
+#define PACK(r,g,b) \
+ ((uint32)(r)|((uint32)(g)<<8)|((uint32)(b)<<16)|A1)
+#define PACK4(r,g,b,a) \
+ ((uint32)(r)|((uint32)(g)<<8)|((uint32)(b)<<16)|((uint32)(a)<<24))
+#define W2B(v) (((v)>>8)&0xff)
+#define PACKW(r,g,b) \
+ ((uint32)W2B(r)|((uint32)W2B(g)<<8)|((uint32)W2B(b)<<16)|A1)
+#define PACKW4(r,g,b,a) \
+ ((uint32)W2B(r)|((uint32)W2B(g)<<8)|((uint32)W2B(b)<<16)|((uint32)W2B(a)<<24))
+
+#define DECLAREContigPutFunc(name) \
+static void name(\
+ TIFFRGBAImage* img, \
+ uint32* cp, \
+ uint32 x, uint32 y, \
+ uint32 w, uint32 h, \
+ int32 fromskew, int32 toskew, \
+ u_char* pp \
+)
+
+/*
+ * 8-bit palette => colormap/RGB
+ */
+DECLAREContigPutFunc(put8bitcmaptile)
+{
+ uint32** PALmap = img->PALmap;
+ int samplesperpixel = img->samplesperpixel;
+
+ (void) y;
+ while (h-- > 0) {
+ for (x = w; x-- > 0;)
+ {
+ *cp++ = PALmap[*pp][0];
+ pp += samplesperpixel;
+ }
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 4-bit palette => colormap/RGB
+ */
+DECLAREContigPutFunc(put4bitcmaptile)
+{
+ uint32** PALmap = img->PALmap;
+
+ (void) x; (void) y;
+ fromskew /= 2;
+ while (h-- > 0) {
+ uint32* bw;
+ UNROLL2(w, bw = PALmap[*pp++], *cp++ = *bw++);
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 2-bit palette => colormap/RGB
+ */
+DECLAREContigPutFunc(put2bitcmaptile)
+{
+ uint32** PALmap = img->PALmap;
+
+ (void) x; (void) y;
+ fromskew /= 4;
+ while (h-- > 0) {
+ uint32* bw;
+ UNROLL4(w, bw = PALmap[*pp++], *cp++ = *bw++);
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 1-bit palette => colormap/RGB
+ */
+DECLAREContigPutFunc(put1bitcmaptile)
+{
+ uint32** PALmap = img->PALmap;
+
+ (void) x; (void) y;
+ fromskew /= 8;
+ while (h-- > 0) {
+ uint32* bw;
+ UNROLL8(w, bw = PALmap[*pp++], *cp++ = *bw++);
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 8-bit greyscale => colormap/RGB
+ */
+DECLAREContigPutFunc(putgreytile)
+{
+ int samplesperpixel = img->samplesperpixel;
+ uint32** BWmap = img->BWmap;
+
+ (void) y;
+ while (h-- > 0) {
+ for (x = w; x-- > 0;)
+ {
+ *cp++ = BWmap[*pp][0];
+ pp += samplesperpixel;
+ }
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 16-bit greyscale => colormap/RGB
+ */
+DECLAREContigPutFunc(put16bitbwtile)
+{
+ int samplesperpixel = img->samplesperpixel;
+ uint32** BWmap = img->BWmap;
+
+ (void) y;
+ while (h-- > 0) {
+ uint16 *wp = (uint16 *) pp;
+
+ for (x = w; x-- > 0;)
+ {
+ /* use high order byte of 16bit value */
+
+ *cp++ = BWmap[*wp >> 8][0];
+ pp += 2 * samplesperpixel;
+ wp += samplesperpixel;
+ }
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 1-bit bilevel => colormap/RGB
+ */
+DECLAREContigPutFunc(put1bitbwtile)
+{
+ uint32** BWmap = img->BWmap;
+
+ (void) x; (void) y;
+ fromskew /= 8;
+ while (h-- > 0) {
+ uint32* bw;
+ UNROLL8(w, bw = BWmap[*pp++], *cp++ = *bw++);
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 2-bit greyscale => colormap/RGB
+ */
+DECLAREContigPutFunc(put2bitbwtile)
+{
+ uint32** BWmap = img->BWmap;
+
+ (void) x; (void) y;
+ fromskew /= 4;
+ while (h-- > 0) {
+ uint32* bw;
+ UNROLL4(w, bw = BWmap[*pp++], *cp++ = *bw++);
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 4-bit greyscale => colormap/RGB
+ */
+DECLAREContigPutFunc(put4bitbwtile)
+{
+ uint32** BWmap = img->BWmap;
+
+ (void) x; (void) y;
+ fromskew /= 2;
+ while (h-- > 0) {
+ uint32* bw;
+ UNROLL2(w, bw = BWmap[*pp++], *cp++ = *bw++);
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 8-bit packed samples, no Map => RGB
+ */
+DECLAREContigPutFunc(putRGBcontig8bittile)
+{
+ int samplesperpixel = img->samplesperpixel;
+
+ (void) x; (void) y;
+ fromskew *= samplesperpixel;
+ while (h-- > 0) {
+ UNROLL8(w, NOP,
+ *cp++ = PACK(pp[0], pp[1], pp[2]);
+ pp += samplesperpixel);
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 8-bit packed samples, w/ Map => RGB
+ */
+DECLAREContigPutFunc(putRGBcontig8bitMaptile)
+{
+ TIFFRGBValue* Map = img->Map;
+ int samplesperpixel = img->samplesperpixel;
+
+ (void) y;
+ fromskew *= samplesperpixel;
+ while (h-- > 0) {
+ for (x = w; x-- > 0;) {
+ *cp++ = PACK(Map[pp[0]], Map[pp[1]], Map[pp[2]]);
+ pp += samplesperpixel;
+ }
+ pp += fromskew;
+ cp += toskew;
+ }
+}
+
+/*
+ * 8-bit packed samples => RGBA w/ associated alpha
+ * (known to have Map == NULL)
+ */
+DECLAREContigPutFunc(putRGBAAcontig8bittile)
+{
+ int samplesperpixel = img->samplesperpixel;
+
+ (void) x; (void) y;
+ fromskew *= samplesperpixel;
+ while (h-- > 0) {
+ UNROLL8(w, NOP,
+ *cp++ = PACK4(pp[0], pp[1], pp[2], pp[3]);
+ pp += samplesperpixel);
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 8-bit packed samples => RGBA w/ unassociated alpha
+ * (known to have Map == NULL)
+ */
+DECLAREContigPutFunc(putRGBUAcontig8bittile)
+{
+ int samplesperpixel = img->samplesperpixel;
+
+ (void) y;
+ fromskew *= samplesperpixel;
+ while (h-- > 0) {
+ uint32 r, g, b, a;
+ for (x = w; x-- > 0;) {
+ a = pp[3];
+ r = (pp[0] * a) / 255;
+ g = (pp[1] * a) / 255;
+ b = (pp[2] * a) / 255;
+ *cp++ = PACK4(r,g,b,a);
+ pp += samplesperpixel;
+ }
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 16-bit packed samples => RGB
+ */
+DECLAREContigPutFunc(putRGBcontig16bittile)
+{
+ int samplesperpixel = img->samplesperpixel;
+ uint16 *wp = (uint16 *)pp;
+
+ (void) y;
+ fromskew *= samplesperpixel;
+ while (h-- > 0) {
+ for (x = w; x-- > 0;) {
+ *cp++ = PACKW(wp[0], wp[1], wp[2]);
+ wp += samplesperpixel;
+ }
+ cp += toskew;
+ wp += fromskew;
+ }
+}
+
+/*
+ * 16-bit packed samples => RGBA w/ associated alpha
+ * (known to have Map == NULL)
+ */
+DECLAREContigPutFunc(putRGBAAcontig16bittile)
+{
+ int samplesperpixel = img->samplesperpixel;
+ uint16 *wp = (uint16 *)pp;
+
+ (void) y;
+ fromskew *= samplesperpixel;
+ while (h-- > 0) {
+ for (x = w; x-- > 0;) {
+ *cp++ = PACKW4(wp[0], wp[1], wp[2], wp[3]);
+ wp += samplesperpixel;
+ }
+ cp += toskew;
+ wp += fromskew;
+ }
+}
+
+/*
+ * 16-bit packed samples => RGBA w/ unassociated alpha
+ * (known to have Map == NULL)
+ */
+DECLAREContigPutFunc(putRGBUAcontig16bittile)
+{
+ int samplesperpixel = img->samplesperpixel;
+ uint16 *wp = (uint16 *)pp;
+
+ (void) y;
+ fromskew *= samplesperpixel;
+ while (h-- > 0) {
+ uint32 r,g,b,a;
+ /*
+ * We shift alpha down four bits just in case unsigned
+ * arithmetic doesn't handle the full range.
+ * We still have plenty of accuracy, since the output is 8 bits.
+ * So we have (r * 0xffff) * (a * 0xfff)) = r*a * (0xffff*0xfff)
+ * Since we want r*a * 0xff for eight bit output,
+ * we divide by (0xffff * 0xfff) / 0xff == 0x10eff.
+ */
+ for (x = w; x-- > 0;) {
+ a = wp[3] >> 4;
+ r = (wp[0] * a) / 0x10eff;
+ g = (wp[1] * a) / 0x10eff;
+ b = (wp[2] * a) / 0x10eff;
+ *cp++ = PACK4(r,g,b,a);
+ wp += samplesperpixel;
+ }
+ cp += toskew;
+ wp += fromskew;
+ }
+}
+
+/*
+ * 8-bit packed CMYK samples w/o Map => RGB
+ *
+ * NB: The conversion of CMYK->RGB is *very* crude.
+ */
+DECLAREContigPutFunc(putRGBcontig8bitCMYKtile)
+{
+ int samplesperpixel = img->samplesperpixel;
+ uint16 r, g, b, k;
+
+ (void) x; (void) y;
+ fromskew *= samplesperpixel;
+ while (h-- > 0) {
+ UNROLL8(w, NOP,
+ k = 255 - pp[3];
+ r = (k*(255-pp[0]))/255;
+ g = (k*(255-pp[1]))/255;
+ b = (k*(255-pp[2]))/255;
+ *cp++ = PACK(r, g, b);
+ pp += samplesperpixel);
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * 8-bit packed CMYK samples w/Map => RGB
+ *
+ * NB: The conversion of CMYK->RGB is *very* crude.
+ */
+DECLAREContigPutFunc(putRGBcontig8bitCMYKMaptile)
+{
+ int samplesperpixel = img->samplesperpixel;
+ TIFFRGBValue* Map = img->Map;
+ uint16 r, g, b, k;
+
+ (void) y;
+ fromskew *= samplesperpixel;
+ while (h-- > 0) {
+ for (x = w; x-- > 0;) {
+ k = 255 - pp[3];
+ r = (k*(255-pp[0]))/255;
+ g = (k*(255-pp[1]))/255;
+ b = (k*(255-pp[2]))/255;
+ *cp++ = PACK(Map[r], Map[g], Map[b]);
+ pp += samplesperpixel;
+ }
+ pp += fromskew;
+ cp += toskew;
+ }
+}
+
+#define DECLARESepPutFunc(name) \
+static void name(\
+ TIFFRGBAImage* img,\
+ uint32* cp,\
+ uint32 x, uint32 y, \
+ uint32 w, uint32 h,\
+ int32 fromskew, int32 toskew,\
+ u_char* r, u_char* g, u_char* b, u_char* a\
+)
+
+/*
+ * 8-bit unpacked samples => RGB
+ */
+DECLARESepPutFunc(putRGBseparate8bittile)
+{
+ (void) img; (void) x; (void) y; (void) a;
+ while (h-- > 0) {
+ UNROLL8(w, NOP, *cp++ = PACK(*r++, *g++, *b++));
+ SKEW(r, g, b, fromskew);
+ cp += toskew;
+ }
+}
+
+/*
+ * 8-bit unpacked samples => RGB
+ */
+DECLARESepPutFunc(putRGBseparate8bitMaptile)
+{
+ TIFFRGBValue* Map = img->Map;
+
+ (void) y; (void) a;
+ while (h-- > 0) {
+ for (x = w; x > 0; x--)
+ *cp++ = PACK(Map[*r++], Map[*g++], Map[*b++]);
+ SKEW(r, g, b, fromskew);
+ cp += toskew;
+ }
+}
+
+/*
+ * 8-bit unpacked samples => RGBA w/ associated alpha
+ */
+DECLARESepPutFunc(putRGBAAseparate8bittile)
+{
+ (void) img; (void) x; (void) y;
+ while (h-- > 0) {
+ UNROLL8(w, NOP, *cp++ = PACK4(*r++, *g++, *b++, *a++));
+ SKEW4(r, g, b, a, fromskew);
+ cp += toskew;
+ }
+}
+
+/*
+ * 8-bit unpacked samples => RGBA w/ unassociated alpha
+ */
+DECLARESepPutFunc(putRGBUAseparate8bittile)
+{
+ (void) img; (void) y;
+ while (h-- > 0) {
+ uint32 rv, gv, bv, av;
+ for (x = w; x-- > 0;) {
+ av = *a++;
+ rv = (*r++ * av) / 255;
+ gv = (*g++ * av) / 255;
+ bv = (*b++ * av) / 255;
+ *cp++ = PACK4(rv,gv,bv,av);
+ }
+ SKEW4(r, g, b, a, fromskew);
+ cp += toskew;
+ }
+}
+
+/*
+ * 16-bit unpacked samples => RGB
+ */
+DECLARESepPutFunc(putRGBseparate16bittile)
+{
+ uint16 *wr = (uint16*) r;
+ uint16 *wg = (uint16*) g;
+ uint16 *wb = (uint16*) b;
+
+ (void) img; (void) y; (void) a;
+ while (h-- > 0) {
+ for (x = 0; x < w; x++)
+ *cp++ = PACKW(*wr++, *wg++, *wb++);
+ SKEW(wr, wg, wb, fromskew);
+ cp += toskew;
+ }
+}
+
+/*
+ * 16-bit unpacked samples => RGBA w/ associated alpha
+ */
+DECLARESepPutFunc(putRGBAAseparate16bittile)
+{
+ uint16 *wr = (uint16*) r;
+ uint16 *wg = (uint16*) g;
+ uint16 *wb = (uint16*) b;
+ uint16 *wa = (uint16*) a;
+
+ (void) img; (void) y;
+ while (h-- > 0) {
+ for (x = 0; x < w; x++)
+ *cp++ = PACKW4(*wr++, *wg++, *wb++, *wa++);
+ SKEW4(wr, wg, wb, wa, fromskew);
+ cp += toskew;
+ }
+}
+
+/*
+ * 16-bit unpacked samples => RGBA w/ unassociated alpha
+ */
+DECLARESepPutFunc(putRGBUAseparate16bittile)
+{
+ uint16 *wr = (uint16*) r;
+ uint16 *wg = (uint16*) g;
+ uint16 *wb = (uint16*) b;
+ uint16 *wa = (uint16*) a;
+
+ (void) img; (void) y;
+ while (h-- > 0) {
+ uint32 r,g,b,a;
+ /*
+ * We shift alpha down four bits just in case unsigned
+ * arithmetic doesn't handle the full range.
+ * We still have plenty of accuracy, since the output is 8 bits.
+ * So we have (r * 0xffff) * (a * 0xfff)) = r*a * (0xffff*0xfff)
+ * Since we want r*a * 0xff for eight bit output,
+ * we divide by (0xffff * 0xfff) / 0xff == 0x10eff.
+ */
+ for (x = w; x-- > 0;) {
+ a = *wa++ >> 4;
+ r = (*wr++ * a) / 0x10eff;
+ g = (*wg++ * a) / 0x10eff;
+ b = (*wb++ * a) / 0x10eff;
+ *cp++ = PACK4(r,g,b,a);
+ }
+ SKEW4(wr, wg, wb, wa, fromskew);
+ cp += toskew;
+ }
+}
+
+/*
+ * 8-bit packed CIE L*a*b 1976 samples => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitCIELab)
+{
+ float X, Y, Z;
+ uint32 r, g, b;
+ (void) y;
+ fromskew *= 3;
+ while (h-- > 0) {
+ for (x = w; x-- > 0;) {
+ TIFFCIELabToXYZ(img->cielab,
+ (u_char)pp[0],
+ (signed char)pp[1],
+ (signed char)pp[2],
+ &X, &Y, &Z);
+ TIFFXYZToRGB(img->cielab, X, Y, Z, &r, &g, &b);
+ *cp++ = PACK(r, g, b);
+ pp += 3;
+ }
+ cp += toskew;
+ pp += fromskew;
+ }
+}
+
+/*
+ * YCbCr -> RGB conversion and packing routines.
+ */
+
+#define YCbCrtoRGB(dst, Y) { \
+ uint32 r, g, b; \
+ TIFFYCbCrtoRGB(img->ycbcr, (Y), Cb, Cr, &r, &g, &b); \
+ dst = PACK(r, g, b); \
+}
+
+/*
+ * 8-bit packed YCbCr samples => RGB
+ * This function is generic for different sampling sizes,
+ * and can handle blocks sizes that aren't multiples of the
+ * sampling size. However, it is substantially less optimized
+ * than the specific sampling cases. It is used as a fallback
+ * for difficult blocks.
+ */
+#ifdef notdef
+static void putcontig8bitYCbCrGenericTile(
+ TIFFRGBAImage* img,
+ uint32* cp,
+ uint32 x, uint32 y,
+ uint32 w, uint32 h,
+ int32 fromskew, int32 toskew,
+ u_char* pp,
+ int h_group,
+ int v_group )
+
+{
+ uint32* cp1 = cp+w+toskew;
+ uint32* cp2 = cp1+w+toskew;
+ uint32* cp3 = cp2+w+toskew;
+ int32 incr = 3*w+4*toskew;
+ int32 Cb, Cr;
+ int group_size = v_group * h_group + 2;
+
+ (void) y;
+ fromskew = (fromskew * group_size) / h_group;
+
+ for( yy = 0; yy < h; yy++ )
+ {
+ u_char *pp_line;
+ int y_line_group = yy / v_group;
+ int y_remainder = yy - y_line_group * v_group;
+
+ pp_line = pp + v_line_group *
+
+
+ for( xx = 0; xx < w; xx++ )
+ {
+ Cb = pp
+ }
+ }
+ for (; h >= 4; h -= 4) {
+ x = w>>2;
+ do {
+ Cb = pp[16];
+ Cr = pp[17];
+
+ YCbCrtoRGB(cp [0], pp[ 0]);
+ YCbCrtoRGB(cp [1], pp[ 1]);
+ YCbCrtoRGB(cp [2], pp[ 2]);
+ YCbCrtoRGB(cp [3], pp[ 3]);
+ YCbCrtoRGB(cp1[0], pp[ 4]);
+ YCbCrtoRGB(cp1[1], pp[ 5]);
+ YCbCrtoRGB(cp1[2], pp[ 6]);
+ YCbCrtoRGB(cp1[3], pp[ 7]);
+ YCbCrtoRGB(cp2[0], pp[ 8]);
+ YCbCrtoRGB(cp2[1], pp[ 9]);
+ YCbCrtoRGB(cp2[2], pp[10]);
+ YCbCrtoRGB(cp2[3], pp[11]);
+ YCbCrtoRGB(cp3[0], pp[12]);
+ YCbCrtoRGB(cp3[1], pp[13]);
+ YCbCrtoRGB(cp3[2], pp[14]);
+ YCbCrtoRGB(cp3[3], pp[15]);
+
+ cp += 4, cp1 += 4, cp2 += 4, cp3 += 4;
+ pp += 18;
+ } while (--x);
+ cp += incr, cp1 += incr, cp2 += incr, cp3 += incr;
+ pp += fromskew;
+ }
+}
+#endif
+
+/*
+ * 8-bit packed YCbCr samples w/ 4,4 subsampling => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitYCbCr44tile)
+{
+ uint32* cp1 = cp+w+toskew;
+ uint32* cp2 = cp1+w+toskew;
+ uint32* cp3 = cp2+w+toskew;
+ int32 incr = 3*w+4*toskew;
+
+ (void) y;
+ /* adjust fromskew */
+ fromskew = (fromskew * 18) / 4;
+ if ((h & 3) == 0 && (w & 3) == 0) {
+ for (; h >= 4; h -= 4) {
+ x = w>>2;
+ do {
+ int32 Cb = pp[16];
+ int32 Cr = pp[17];
+
+ YCbCrtoRGB(cp [0], pp[ 0]);
+ YCbCrtoRGB(cp [1], pp[ 1]);
+ YCbCrtoRGB(cp [2], pp[ 2]);
+ YCbCrtoRGB(cp [3], pp[ 3]);
+ YCbCrtoRGB(cp1[0], pp[ 4]);
+ YCbCrtoRGB(cp1[1], pp[ 5]);
+ YCbCrtoRGB(cp1[2], pp[ 6]);
+ YCbCrtoRGB(cp1[3], pp[ 7]);
+ YCbCrtoRGB(cp2[0], pp[ 8]);
+ YCbCrtoRGB(cp2[1], pp[ 9]);
+ YCbCrtoRGB(cp2[2], pp[10]);
+ YCbCrtoRGB(cp2[3], pp[11]);
+ YCbCrtoRGB(cp3[0], pp[12]);
+ YCbCrtoRGB(cp3[1], pp[13]);
+ YCbCrtoRGB(cp3[2], pp[14]);
+ YCbCrtoRGB(cp3[3], pp[15]);
+
+ cp += 4, cp1 += 4, cp2 += 4, cp3 += 4;
+ pp += 18;
+ } while (--x);
+ cp += incr, cp1 += incr, cp2 += incr, cp3 += incr;
+ pp += fromskew;
+ }
+ } else {
+ while (h > 0) {
+ for (x = w; x > 0;) {
+ int32 Cb = pp[16];
+ int32 Cr = pp[17];
+ switch (x) {
+ default:
+ switch (h) {
+ default: YCbCrtoRGB(cp3[3], pp[15]); /* FALLTHROUGH */
+ case 3: YCbCrtoRGB(cp2[3], pp[11]); /* FALLTHROUGH */
+ case 2: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */
+ case 1: YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 3:
+ switch (h) {
+ default: YCbCrtoRGB(cp3[2], pp[14]); /* FALLTHROUGH */
+ case 3: YCbCrtoRGB(cp2[2], pp[10]); /* FALLTHROUGH */
+ case 2: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */
+ case 1: YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 2:
+ switch (h) {
+ default: YCbCrtoRGB(cp3[1], pp[13]); /* FALLTHROUGH */
+ case 3: YCbCrtoRGB(cp2[1], pp[ 9]); /* FALLTHROUGH */
+ case 2: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */
+ case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 1:
+ switch (h) {
+ default: YCbCrtoRGB(cp3[0], pp[12]); /* FALLTHROUGH */
+ case 3: YCbCrtoRGB(cp2[0], pp[ 8]); /* FALLTHROUGH */
+ case 2: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */
+ case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ }
+ if (x < 4) {
+ cp += x; cp1 += x; cp2 += x; cp3 += x;
+ x = 0;
+ }
+ else {
+ cp += 4; cp1 += 4; cp2 += 4; cp3 += 4;
+ x -= 4;
+ }
+ pp += 18;
+ }
+ if (h <= 4)
+ break;
+ h -= 4;
+ cp += incr, cp1 += incr, cp2 += incr, cp3 += incr;
+ pp += fromskew;
+ }
+ }
+}
+
+/*
+ * 8-bit packed YCbCr samples w/ 4,2 subsampling => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitYCbCr42tile)
+{
+ uint32* cp1 = cp+w+toskew;
+ int32 incr = 2*toskew+w;
+
+ (void) y;
+ fromskew = (fromskew * 10) / 4;
+ if ((h & 3) == 0 && (w & 1) == 0) {
+ for (; h >= 2; h -= 2) {
+ x = w>>2;
+ do {
+ int32 Cb = pp[8];
+ int32 Cr = pp[9];
+
+ YCbCrtoRGB(cp [0], pp[0]);
+ YCbCrtoRGB(cp [1], pp[1]);
+ YCbCrtoRGB(cp [2], pp[2]);
+ YCbCrtoRGB(cp [3], pp[3]);
+ YCbCrtoRGB(cp1[0], pp[4]);
+ YCbCrtoRGB(cp1[1], pp[5]);
+ YCbCrtoRGB(cp1[2], pp[6]);
+ YCbCrtoRGB(cp1[3], pp[7]);
+
+ cp += 4, cp1 += 4;
+ pp += 10;
+ } while (--x);
+ cp += incr, cp1 += incr;
+ pp += fromskew;
+ }
+ } else {
+ while (h > 0) {
+ for (x = w; x > 0;) {
+ int32 Cb = pp[8];
+ int32 Cr = pp[9];
+ switch (x) {
+ default:
+ switch (h) {
+ default: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */
+ case 1: YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 3:
+ switch (h) {
+ default: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */
+ case 1: YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 2:
+ switch (h) {
+ default: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */
+ case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 1:
+ switch (h) {
+ default: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */
+ case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ }
+ if (x < 4) {
+ cp += x; cp1 += x;
+ x = 0;
+ }
+ else {
+ cp += 4; cp1 += 4;
+ x -= 4;
+ }
+ pp += 10;
+ }
+ if (h <= 2)
+ break;
+ h -= 2;
+ cp += incr, cp1 += incr;
+ pp += fromskew;
+ }
+ }
+}
+
+/*
+ * 8-bit packed YCbCr samples w/ 4,1 subsampling => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitYCbCr41tile)
+{
+ (void) y;
+ /* XXX adjust fromskew */
+ do {
+ x = w>>2;
+ do {
+ int32 Cb = pp[4];
+ int32 Cr = pp[5];
+
+ YCbCrtoRGB(cp [0], pp[0]);
+ YCbCrtoRGB(cp [1], pp[1]);
+ YCbCrtoRGB(cp [2], pp[2]);
+ YCbCrtoRGB(cp [3], pp[3]);
+
+ cp += 4;
+ pp += 6;
+ } while (--x);
+
+ if( (w&3) != 0 )
+ {
+ int32 Cb = pp[4];
+ int32 Cr = pp[5];
+
+ switch( (w&3) ) {
+ case 3: YCbCrtoRGB(cp [2], pp[2]);
+ case 2: YCbCrtoRGB(cp [1], pp[1]);
+ case 1: YCbCrtoRGB(cp [0], pp[0]);
+ case 0: break;
+ }
+
+ cp += (w&3);
+ pp += 6;
+ }
+
+ cp += toskew;
+ pp += fromskew;
+ } while (--h);
+
+}
+
+/*
+ * 8-bit packed YCbCr samples w/ 2,2 subsampling => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitYCbCr22tile)
+{
+ uint32* cp1 = cp+w+toskew;
+ int32 incr = 2*toskew+w;
+
+ (void) y;
+ fromskew = (fromskew * 6) / 2;
+ if ((h & 1) == 0 && (w & 1) == 0) {
+ for (; h >= 2; h -= 2) {
+ x = w>>1;
+ do {
+ int32 Cb = pp[4];
+ int32 Cr = pp[5];
+
+ YCbCrtoRGB(cp [0], pp[0]);
+ YCbCrtoRGB(cp [1], pp[1]);
+ YCbCrtoRGB(cp1[0], pp[2]);
+ YCbCrtoRGB(cp1[1], pp[3]);
+
+ cp += 2, cp1 += 2;
+ pp += 6;
+ } while (--x);
+ cp += incr, cp1 += incr;
+ pp += fromskew;
+ }
+ } else {
+ while (h > 0) {
+ for (x = w; x > 0;) {
+ int32 Cb = pp[4];
+ int32 Cr = pp[5];
+ switch (x) {
+ default:
+ switch (h) {
+ default: YCbCrtoRGB(cp1[1], pp[ 3]); /* FALLTHROUGH */
+ case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 1:
+ switch (h) {
+ default: YCbCrtoRGB(cp1[0], pp[ 2]); /* FALLTHROUGH */
+ case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ }
+ if (x < 2) {
+ cp += x; cp1 += x;
+ x = 0;
+ }
+ else {
+ cp += 2; cp1 += 2;
+ x -= 2;
+ }
+ pp += 6;
+ }
+ if (h <= 2)
+ break;
+ h -= 2;
+ cp += incr, cp1 += incr;
+ pp += fromskew;
+ }
+ }
+}
+
+/*
+ * 8-bit packed YCbCr samples w/ 2,1 subsampling => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitYCbCr21tile)
+{
+ (void) y;
+ fromskew = (fromskew * 4) / 2;
+ do {
+ x = w>>1;
+ do {
+ int32 Cb = pp[2];
+ int32 Cr = pp[3];
+
+ YCbCrtoRGB(cp[0], pp[0]);
+ YCbCrtoRGB(cp[1], pp[1]);
+
+ cp += 2;
+ pp += 4;
+ } while (--x);
+
+ if( (w&1) != 0 )
+ {
+ int32 Cb = pp[2];
+ int32 Cr = pp[3];
+
+ YCbCrtoRGB(cp [0], pp[0]);
+
+ cp += 1;
+ pp += 4;
+ }
+
+ cp += toskew;
+ pp += fromskew;
+ } while (--h);
+}
+
+/*
+ * 8-bit packed YCbCr samples w/ no subsampling => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitYCbCr11tile)
+{
+ (void) y;
+ fromskew *= 3;
+ do {
+ x = w; /* was x = w>>1; patched 2000/09/25 warmerda at home.com */
+ do {
+ int32 Cb = pp[1];
+ int32 Cr = pp[2];
+
+ YCbCrtoRGB(*cp++, pp[0]);
+
+ pp += 3;
+ } while (--x);
+ cp += toskew;
+ pp += fromskew;
+ } while (--h);
+}
+#undef YCbCrtoRGB
+
+static tileContigRoutine
+initYCbCrConversion(TIFFRGBAImage* img)
+{
+ static char module[] = "initCIELabConversion";
+
+ float *luma, *refBlackWhite;
+ uint16 hs, vs;
+
+ if (img->ycbcr == NULL) {
+ img->ycbcr = (TIFFYCbCrToRGB*) _TIFFmalloc(
+ TIFFroundup(sizeof (TIFFYCbCrToRGB), sizeof (long))
+ + 4*256*sizeof (TIFFRGBValue)
+ + 2*256*sizeof (int)
+ + 3*256*sizeof (int32)
+ );
+ if (img->ycbcr == NULL) {
+ TIFFError(module,
+ "No space for YCbCr->RGB conversion state");
+ return (NULL);
+ }
+ }
+
+ TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRCOEFFICIENTS, &luma);
+ TIFFGetFieldDefaulted(img->tif, TIFFTAG_REFERENCEBLACKWHITE,
+ &refBlackWhite);
+ if (TIFFYCbCrToRGBInit(img->ycbcr, luma, refBlackWhite) < 0)
+ return NULL;
+
+ /*
+ * The 6.0 spec says that subsampling must be
+ * one of 1, 2, or 4, and that vertical subsampling
+ * must always be <= horizontal subsampling; so
+ * there are only a few possibilities and we just
+ * enumerate the cases.
+ */
+ TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING, &hs, &vs);
+ switch ((hs<<4)|vs) {
+ case 0x44: return (putcontig8bitYCbCr44tile);
+ case 0x42: return (putcontig8bitYCbCr42tile);
+ case 0x41: return (putcontig8bitYCbCr41tile);
+ case 0x22: return (putcontig8bitYCbCr22tile);
+ case 0x21: return (putcontig8bitYCbCr21tile);
+ case 0x11: return (putcontig8bitYCbCr11tile);
+ }
+
+ return (NULL);
+}
+
+static tileContigRoutine
+initCIELabConversion(TIFFRGBAImage* img)
+{
+ static char module[] = "initCIELabConversion";
+
+ float *whitePoint;
+ float refWhite[3];
+
+ if (!img->cielab) {
+ img->cielab = (TIFFCIELabToRGB *)
+ _TIFFmalloc(sizeof(TIFFCIELabToRGB));
+ if (!img->cielab) {
+ TIFFError(module,
+ "No space for CIE L*a*b*->RGB conversion state.");
+ return NULL;
+ }
+ }
+
+ TIFFGetFieldDefaulted(img->tif, TIFFTAG_WHITEPOINT, &whitePoint);
+ refWhite[1] = 100.0F;
+ refWhite[0] = whitePoint[0] / whitePoint[1] * refWhite[1];
+ refWhite[2] = (1.0F - whitePoint[0] - whitePoint[1])
+ / whitePoint[1] * refWhite[1];
+ if (TIFFCIELabToRGBInit(img->cielab, &display_sRGB, refWhite) < 0) {
+ TIFFError(module,
+ "Failed to initialize CIE L*a*b*->RGB conversion state.");
+ _TIFFfree(img->cielab);
+ return NULL;
+ }
+
+ return putcontig8bitCIELab;
+}
+
+/*
+ * Greyscale images with less than 8 bits/sample are handled
+ * with a table to avoid lots of shifts and masks. The table
+ * is setup so that put*bwtile (below) can retrieve 8/bitspersample
+ * pixel values simply by indexing into the table with one
+ * number.
+ */
+static int
+makebwmap(TIFFRGBAImage* img)
+{
+ TIFFRGBValue* Map = img->Map;
+ int bitspersample = img->bitspersample;
+ int nsamples = 8 / bitspersample;
+ int i;
+ uint32* p;
+
+ if( nsamples == 0 )
+ nsamples = 1;
+
+ img->BWmap = (uint32**) _TIFFmalloc(
+ 256*sizeof (uint32 *)+(256*nsamples*sizeof(uint32)));
+ if (img->BWmap == NULL) {
+ TIFFError(TIFFFileName(img->tif), "No space for B&W mapping table");
+ return (0);
+ }
+ p = (uint32*)(img->BWmap + 256);
+ for (i = 0; i < 256; i++) {
+ TIFFRGBValue c;
+ img->BWmap[i] = p;
+ switch (bitspersample) {
+#define GREY(x) c = Map[x]; *p++ = PACK(c,c,c);
+ case 1:
+ GREY(i>>7);
+ GREY((i>>6)&1);
+ GREY((i>>5)&1);
+ GREY((i>>4)&1);
+ GREY((i>>3)&1);
+ GREY((i>>2)&1);
+ GREY((i>>1)&1);
+ GREY(i&1);
+ break;
+ case 2:
+ GREY(i>>6);
+ GREY((i>>4)&3);
+ GREY((i>>2)&3);
+ GREY(i&3);
+ break;
+ case 4:
+ GREY(i>>4);
+ GREY(i&0xf);
+ break;
+ case 8:
+ case 16:
+ GREY(i);
+ break;
+ }
+#undef GREY
+ }
+ return (1);
+}
+
+/*
+ * Construct a mapping table to convert from the range
+ * of the data samples to [0,255] --for display. This
+ * process also handles inverting B&W images when needed.
+ */
+static int
+setupMap(TIFFRGBAImage* img)
+{
+ int32 x, range;
+
+ range = (int32)((1L<<img->bitspersample)-1);
+
+ /* treat 16 bit the same as eight bit */
+ if( img->bitspersample == 16 )
+ range = (int32) 255;
+
+ img->Map = (TIFFRGBValue*) _TIFFmalloc((range+1) * sizeof (TIFFRGBValue));
+ if (img->Map == NULL) {
+ TIFFError(TIFFFileName(img->tif),
+ "No space for photometric conversion table");
+ return (0);
+ }
+ if (img->photometric == PHOTOMETRIC_MINISWHITE) {
+ for (x = 0; x <= range; x++)
+ img->Map[x] = (TIFFRGBValue) (((range - x) * 255) / range);
+ } else {
+ for (x = 0; x <= range; x++)
+ img->Map[x] = (TIFFRGBValue) ((x * 255) / range);
+ }
+ if (img->bitspersample <= 16 &&
+ (img->photometric == PHOTOMETRIC_MINISBLACK ||
+ img->photometric == PHOTOMETRIC_MINISWHITE)) {
+ /*
+ * Use photometric mapping table to construct
+ * unpacking tables for samples <= 8 bits.
+ */
+ if (!makebwmap(img))
+ return (0);
+ /* no longer need Map, free it */
+ _TIFFfree(img->Map), img->Map = NULL;
+ }
+ return (1);
+}
+
+static int
+checkcmap(TIFFRGBAImage* img)
+{
+ uint16* r = img->redcmap;
+ uint16* g = img->greencmap;
+ uint16* b = img->bluecmap;
+ long n = 1L<<img->bitspersample;
+
+ while (n-- > 0)
+ if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256)
+ return (16);
+ return (8);
+}
+
+static void
+cvtcmap(TIFFRGBAImage* img)
+{
+ uint16* r = img->redcmap;
+ uint16* g = img->greencmap;
+ uint16* b = img->bluecmap;
+ long i;
+
+ for (i = (1L<<img->bitspersample)-1; i >= 0; i--) {
+#define CVT(x) ((uint16)((x)>>8))
+ r[i] = CVT(r[i]);
+ g[i] = CVT(g[i]);
+ b[i] = CVT(b[i]);
+#undef CVT
+ }
+}
+
+/*
+ * Palette images with <= 8 bits/sample are handled
+ * with a table to avoid lots of shifts and masks. The table
+ * is setup so that put*cmaptile (below) can retrieve 8/bitspersample
+ * pixel values simply by indexing into the table with one
+ * number.
+ */
+static int
+makecmap(TIFFRGBAImage* img)
+{
+ int bitspersample = img->bitspersample;
+ int nsamples = 8 / bitspersample;
+ uint16* r = img->redcmap;
+ uint16* g = img->greencmap;
+ uint16* b = img->bluecmap;
+ uint32 *p;
+ int i;
+
+ img->PALmap = (uint32**) _TIFFmalloc(
+ 256*sizeof (uint32 *)+(256*nsamples*sizeof(uint32)));
+ if (img->PALmap == NULL) {
+ TIFFError(TIFFFileName(img->tif), "No space for Palette mapping table");
+ return (0);
+ }
+ p = (uint32*)(img->PALmap + 256);
+ for (i = 0; i < 256; i++) {
+ TIFFRGBValue c;
+ img->PALmap[i] = p;
+#define CMAP(x) c = (TIFFRGBValue) x; *p++ = PACK(r[c]&0xff, g[c]&0xff, b[c]&0xff);
+ switch (bitspersample) {
+ case 1:
+ CMAP(i>>7);
+ CMAP((i>>6)&1);
+ CMAP((i>>5)&1);
+ CMAP((i>>4)&1);
+ CMAP((i>>3)&1);
+ CMAP((i>>2)&1);
+ CMAP((i>>1)&1);
+ CMAP(i&1);
+ break;
+ case 2:
+ CMAP(i>>6);
+ CMAP((i>>4)&3);
+ CMAP((i>>2)&3);
+ CMAP(i&3);
+ break;
+ case 4:
+ CMAP(i>>4);
+ CMAP(i&0xf);
+ break;
+ case 8:
+ CMAP(i);
+ break;
+ }
+#undef CMAP
+ }
+ return (1);
+}
+
+/*
+ * Construct any mapping table used
+ * by the associated put routine.
+ */
+static int
+buildMap(TIFFRGBAImage* img)
+{
+ switch (img->photometric) {
+ case PHOTOMETRIC_RGB:
+ case PHOTOMETRIC_YCBCR:
+ case PHOTOMETRIC_SEPARATED:
+ if (img->bitspersample == 8)
+ break;
+ /* fall thru... */
+ case PHOTOMETRIC_MINISBLACK:
+ case PHOTOMETRIC_MINISWHITE:
+ if (!setupMap(img))
+ return (0);
+ break;
+ case PHOTOMETRIC_PALETTE:
+ /*
+ * Convert 16-bit colormap to 8-bit (unless it looks
+ * like an old-style 8-bit colormap).
+ */
+ if (checkcmap(img) == 16)
+ cvtcmap(img);
+ else
+ TIFFWarning(TIFFFileName(img->tif), "Assuming 8-bit colormap");
+ /*
+ * Use mapping table and colormap to construct
+ * unpacking tables for samples < 8 bits.
+ */
+ if (img->bitspersample <= 8 && !makecmap(img))
+ return (0);
+ break;
+ }
+ return (1);
+}
+
+/*
+ * Select the appropriate conversion routine for packed data.
+ */
+static int
+pickTileContigCase(TIFFRGBAImage* img)
+{
+ tileContigRoutine put = 0;
+
+ if (buildMap(img)) {
+ switch (img->photometric) {
+ case PHOTOMETRIC_RGB:
+ switch (img->bitspersample) {
+ case 8:
+ if (!img->Map) {
+ if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
+ put = putRGBAAcontig8bittile;
+ else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
+ put = putRGBUAcontig8bittile;
+ else
+ put = putRGBcontig8bittile;
+ } else
+ put = putRGBcontig8bitMaptile;
+ break;
+ case 16:
+ put = putRGBcontig16bittile;
+ if (!img->Map) {
+ if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
+ put = putRGBAAcontig16bittile;
+ else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
+ put = putRGBUAcontig16bittile;
+ }
+ break;
+ }
+ break;
+ case PHOTOMETRIC_SEPARATED:
+ if (img->bitspersample == 8) {
+ if (!img->Map)
+ put = putRGBcontig8bitCMYKtile;
+ else
+ put = putRGBcontig8bitCMYKMaptile;
+ }
+ break;
+ case PHOTOMETRIC_PALETTE:
+ switch (img->bitspersample) {
+ case 8: put = put8bitcmaptile; break;
+ case 4: put = put4bitcmaptile; break;
+ case 2: put = put2bitcmaptile; break;
+ case 1: put = put1bitcmaptile; break;
+ }
+ break;
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
+ switch (img->bitspersample) {
+ case 16: put = put16bitbwtile; break;
+ case 8: put = putgreytile; break;
+ case 4: put = put4bitbwtile; break;
+ case 2: put = put2bitbwtile; break;
+ case 1: put = put1bitbwtile; break;
+ }
+ break;
+ case PHOTOMETRIC_YCBCR:
+ if (img->bitspersample == 8)
+ put = initYCbCrConversion(img);
+ break;
+ case PHOTOMETRIC_CIELAB:
+ if (img->bitspersample == 8)
+ put = initCIELabConversion(img);
+ break;
+ }
+ }
+ return ((img->put.contig = put) != 0);
+}
+
+/*
+ * Select the appropriate conversion routine for unpacked data.
+ *
+ * NB: we assume that unpacked single channel data is directed
+ * to the "packed routines.
+ */
+static int
+pickTileSeparateCase(TIFFRGBAImage* img)
+{
+ tileSeparateRoutine put = 0;
+
+ if (buildMap(img)) {
+ switch (img->photometric) {
+ case PHOTOMETRIC_RGB:
+ switch (img->bitspersample) {
+ case 8:
+ if (!img->Map) {
+ if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
+ put = putRGBAAseparate8bittile;
+ else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
+ put = putRGBUAseparate8bittile;
+ else
+ put = putRGBseparate8bittile;
+ } else
+ put = putRGBseparate8bitMaptile;
+ break;
+ case 16:
+ put = putRGBseparate16bittile;
+ if (!img->Map) {
+ if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
+ put = putRGBAAseparate16bittile;
+ else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
+ put = putRGBUAseparate16bittile;
+ }
+ break;
+ }
+ break;
+ }
+ }
+ return ((img->put.separate = put) != 0);
+}
+
+/*
+ * Read a whole strip off data from the file, and convert to RGBA form.
+ * If this is the last strip, then it will only contain the portion of
+ * the strip that is actually within the image space. The result is
+ * organized in bottom to top form.
+ */
+
+
+int
+TIFFReadRGBAStrip(TIFF* tif, uint32 row, uint32 * raster )
+
+{
+ char emsg[1024];
+ TIFFRGBAImage img;
+ int ok;
+ uint32 rowsperstrip, rows_to_read;
+
+ if( TIFFIsTiled( tif ) )
+ {
+ TIFFError(TIFFFileName(tif),
+ "Can't use TIFFReadRGBAStrip() with tiled file.");
+ return (0);
+ }
+
+ TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+ if( (row % rowsperstrip) != 0 )
+ {
+ TIFFError(TIFFFileName(tif),
+ "Row passed to TIFFReadRGBAStrip() must be first in a strip.");
+ return (0);
+ }
+
+ if (TIFFRGBAImageOK(tif, emsg) && TIFFRGBAImageBegin(&img, tif, 0, emsg)) {
+
+ img.row_offset = row;
+ img.col_offset = 0;
+
+ if( row + rowsperstrip > img.height )
+ rows_to_read = img.height - row;
+ else
+ rows_to_read = rowsperstrip;
+
+ ok = TIFFRGBAImageGet(&img, raster, img.width, rows_to_read );
+
+ TIFFRGBAImageEnd(&img);
+ } else {
+ TIFFError(TIFFFileName(tif), emsg);
+ ok = 0;
+ }
+
+ return (ok);
+}
+
+/*
+ * Read a whole tile off data from the file, and convert to RGBA form.
+ * The returned RGBA data is organized from bottom to top of tile,
+ * and may include zeroed areas if the tile extends off the image.
+ */
+
+int
+TIFFReadRGBATile(TIFF* tif, uint32 col, uint32 row, uint32 * raster)
+
+{
+ char emsg[1024];
+ TIFFRGBAImage img;
+ int ok;
+ uint32 tile_xsize, tile_ysize;
+ uint32 read_xsize, read_ysize;
+ uint32 i_row;
+
+ /*
+ * Verify that our request is legal - on a tile file, and on a
+ * tile boundary.
+ */
+
+ if( !TIFFIsTiled( tif ) )
+ {
+ TIFFError(TIFFFileName(tif),
+ "Can't use TIFFReadRGBATile() with stripped file.");
+ return (0);
+ }
+
+ TIFFGetFieldDefaulted(tif, TIFFTAG_TILEWIDTH, &tile_xsize);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_TILELENGTH, &tile_ysize);
+ if( (col % tile_xsize) != 0 || (row % tile_ysize) != 0 )
+ {
+ TIFFError(TIFFFileName(tif),
+ "Row/col passed to TIFFReadRGBATile() must be top"
+ "left corner of a tile.");
+ return (0);
+ }
+
+ /*
+ * Setup the RGBA reader.
+ */
+
+ if (!TIFFRGBAImageOK(tif, emsg)
+ || !TIFFRGBAImageBegin(&img, tif, 0, emsg)) {
+ TIFFError(TIFFFileName(tif), emsg);
+ return( 0 );
+ }
+
+ /*
+ * The TIFFRGBAImageGet() function doesn't allow us to get off the
+ * edge of the image, even to fill an otherwise valid tile. So we
+ * figure out how much we can read, and fix up the tile buffer to
+ * a full tile configuration afterwards.
+ */
+
+ if( row + tile_ysize > img.height )
+ read_ysize = img.height - row;
+ else
+ read_ysize = tile_ysize;
+
+ if( col + tile_xsize > img.width )
+ read_xsize = img.width - col;
+ else
+ read_xsize = tile_xsize;
+
+ /*
+ * Read the chunk of imagery.
+ */
+
+ img.row_offset = row;
+ img.col_offset = col;
+
+ ok = TIFFRGBAImageGet(&img, raster, read_xsize, read_ysize );
+
+ TIFFRGBAImageEnd(&img);
+
+ /*
+ * If our read was incomplete we will need to fix up the tile by
+ * shifting the data around as if a full tile of data is being returned.
+ *
+ * This is all the more complicated because the image is organized in
+ * bottom to top format.
+ */
+
+ if( read_xsize == tile_xsize && read_ysize == tile_ysize )
+ return( ok );
+
+ for( i_row = 0; i_row < read_ysize; i_row++ ) {
+ memmove( raster + (tile_ysize - i_row - 1) * tile_xsize,
+ raster + (read_ysize - i_row - 1) * read_xsize,
+ read_xsize * sizeof(uint32) );
+ _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize+read_xsize,
+ 0, sizeof(uint32) * (tile_xsize - read_xsize) );
+ }
+
+ for( i_row = read_ysize; i_row < tile_ysize; i_row++ ) {
+ _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize,
+ 0, sizeof(uint32) * tile_xsize );
+ }
+
+ return (ok);
+}
diff --git a/src/tiff/tif_jpeg.c b/src/tiff/tif_jpeg.c
new file mode 100644
index 0000000..46f4d20
--- /dev/null
+++ b/src/tiff/tif_jpeg.c
@@ -0,0 +1,1667 @@
+/* $Header: /home/terralib/src/tiff/tif_jpeg.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1994-1997 Sam Leffler
+ * Copyright (c) 1994-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef JPEG_SUPPORT
+/*
+ * TIFF Library
+ *
+ * JPEG Compression support per TIFF Technical Note #2
+ * (*not* per the original TIFF 6.0 spec).
+ *
+ * This file is simply an interface to the libjpeg library written by
+ * the Independent JPEG Group. You need release 5 or later of the IJG
+ * code, which you can find on the Internet at ftp.uu.net:/graphics/jpeg/.
+ *
+ * Contributed by Tom Lane <tgl at sss.pgh.pa.us>.
+ */
+#include <assert.h>
+#include <stdio.h>
+#include <setjmp.h>
+
+int TIFFFillStrip(TIFF*, tstrip_t);
+int TIFFFillTile(TIFF*, ttile_t);
+
+/* We undefine FAR to avoid conflict with JPEG definition */
+
+#ifdef FAR
+#undef FAR
+#endif
+
+/*
+ The windows RPCNDR.H file defines boolean, but defines it with the
+ wrong size. So we declare HAVE_BOOLEAN so that the jpeg include file
+ won't try to typedef boolean, but #define it to override the rpcndr.h
+ definition.
+
+ http://bugzilla.remotesensing.org/show_bug.cgi?id=188
+*/
+#if defined(__RPCNDR_H__)
+#define HAVE_BOOLEAN
+#define boolean unsigned int
+#endif
+
+#include "jpeglib.h"
+#include "jerror.h"
+
+/*
+ * On some machines it may be worthwhile to use _setjmp or sigsetjmp
+ * in place of plain setjmp. These macros will make it easier.
+ */
+#define SETJMP(jbuf) setjmp(jbuf)
+#define LONGJMP(jbuf,code) longjmp(jbuf,code)
+#define JMP_BUF jmp_buf
+
+typedef struct jpeg_destination_mgr jpeg_destination_mgr;
+typedef struct jpeg_source_mgr jpeg_source_mgr;
+typedef struct jpeg_error_mgr jpeg_error_mgr;
+
+/*
+ * State block for each open TIFF file using
+ * libjpeg to do JPEG compression/decompression.
+ *
+ * libjpeg's visible state is either a jpeg_compress_struct
+ * or jpeg_decompress_struct depending on which way we
+ * are going. comm can be used to refer to the fields
+ * which are common to both.
+ *
+ * NB: cinfo is required to be the first member of JPEGState,
+ * so we can safely cast JPEGState* -> jpeg_xxx_struct*
+ * and vice versa!
+ */
+typedef struct {
+ union {
+ struct jpeg_compress_struct c;
+ struct jpeg_decompress_struct d;
+ struct jpeg_common_struct comm;
+ } cinfo; /* NB: must be first */
+ int cinfo_initialized;
+
+ jpeg_error_mgr err; /* libjpeg error manager */
+ JMP_BUF exit_jmpbuf; /* for catching libjpeg failures */
+ /*
+ * The following two members could be a union, but
+ * they're small enough that it's not worth the effort.
+ */
+ jpeg_destination_mgr dest; /* data dest for compression */
+ jpeg_source_mgr src; /* data source for decompression */
+ /* private state */
+ TIFF* tif; /* back link needed by some code */
+ uint16 photometric; /* copy of PhotometricInterpretation */
+ uint16 h_sampling; /* luminance sampling factors */
+ uint16 v_sampling;
+ tsize_t bytesperline; /* decompressed bytes per scanline */
+ /* pointers to intermediate buffers when processing downsampled data */
+ JSAMPARRAY ds_buffer[MAX_COMPONENTS];
+ int scancount; /* number of "scanlines" accumulated */
+ int samplesperclump;
+
+ TIFFVGetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+ TIFFStripMethod defsparent; /* super-class method */
+ TIFFTileMethod deftparent; /* super-class method */
+ /* pseudo-tag fields */
+ void* jpegtables; /* JPEGTables tag value, or NULL */
+ uint32 jpegtables_length; /* number of bytes in same */
+ int jpegquality; /* Compression quality level */
+ int jpegcolormode; /* Auto RGB<=>YCbCr convert? */
+ int jpegtablesmode; /* What to put in JPEGTables */
+
+ int ycbcrsampling_fetched;
+} JPEGState;
+
+#define JState(tif) ((JPEGState*)(tif)->tif_data)
+
+static int JPEGDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+static int JPEGDecodeRaw(TIFF*, tidata_t, tsize_t, tsample_t);
+static int JPEGEncode(TIFF*, tidata_t, tsize_t, tsample_t);
+static int JPEGEncodeRaw(TIFF*, tidata_t, tsize_t, tsample_t);
+static int JPEGInitializeLibJPEG( TIFF * tif );
+
+#define FIELD_JPEGTABLES (FIELD_CODEC+0)
+
+static const TIFFFieldInfo jpegFieldInfo[] = {
+ { TIFFTAG_JPEGTABLES, -1,-1, TIFF_UNDEFINED, FIELD_JPEGTABLES,
+ FALSE, TRUE, "JPEGTables" },
+ { TIFFTAG_JPEGQUALITY, 0, 0, TIFF_ANY, FIELD_PSEUDO,
+ TRUE, FALSE, "" },
+ { TIFFTAG_JPEGCOLORMODE, 0, 0, TIFF_ANY, FIELD_PSEUDO,
+ FALSE, FALSE, "" },
+ { TIFFTAG_JPEGTABLESMODE, 0, 0, TIFF_ANY, FIELD_PSEUDO,
+ FALSE, FALSE, "" },
+};
+#define N(a) (sizeof (a) / sizeof (a[0]))
+
+/*
+ * libjpeg interface layer.
+ *
+ * We use setjmp/longjmp to return control to libtiff
+ * when a fatal error is encountered within the JPEG
+ * library. We also direct libjpeg error and warning
+ * messages through the appropriate libtiff handlers.
+ */
+
+/*
+ * Error handling routines (these replace corresponding
+ * IJG routines from jerror.c). These are used for both
+ * compression and decompression.
+ */
+static void
+TIFFjpeg_error_exit(j_common_ptr cinfo)
+{
+ JPEGState *sp = (JPEGState *) cinfo; /* NB: cinfo assumed first */
+ char buffer[JMSG_LENGTH_MAX];
+
+ (*cinfo->err->format_message) (cinfo, buffer);
+ TIFFError("JPEGLib", buffer); /* display the error message */
+ jpeg_abort(cinfo); /* clean up libjpeg state */
+ LONGJMP(sp->exit_jmpbuf, 1); /* return to libtiff caller */
+}
+
+/*
+ * This routine is invoked only for warning messages,
+ * since error_exit does its own thing and trace_level
+ * is never set > 0.
+ */
+static void
+TIFFjpeg_output_message(j_common_ptr cinfo)
+{
+ char buffer[JMSG_LENGTH_MAX];
+
+ (*cinfo->err->format_message) (cinfo, buffer);
+ TIFFWarning("JPEGLib", buffer);
+}
+
+/*
+ * Interface routines. This layer of routines exists
+ * primarily to limit side-effects from using setjmp.
+ * Also, normal/error returns are converted into return
+ * values per libtiff practice.
+ */
+#define CALLJPEG(sp, fail, op) (SETJMP((sp)->exit_jmpbuf) ? (fail) : (op))
+#define CALLVJPEG(sp, op) CALLJPEG(sp, 0, ((op),1))
+
+static int
+TIFFjpeg_create_compress(JPEGState* sp)
+{
+ /* initialize JPEG error handling */
+ sp->cinfo.c.err = jpeg_std_error(&sp->err);
+ sp->err.error_exit = TIFFjpeg_error_exit;
+ sp->err.output_message = TIFFjpeg_output_message;
+
+ return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c));
+}
+
+static int
+TIFFjpeg_create_decompress(JPEGState* sp)
+{
+ /* initialize JPEG error handling */
+ sp->cinfo.d.err = jpeg_std_error(&sp->err);
+ sp->err.error_exit = TIFFjpeg_error_exit;
+ sp->err.output_message = TIFFjpeg_output_message;
+
+ return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d));
+}
+
+static int
+TIFFjpeg_set_defaults(JPEGState* sp)
+{
+ return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c));
+}
+
+static int
+TIFFjpeg_set_colorspace(JPEGState* sp, J_COLOR_SPACE colorspace)
+{
+ return CALLVJPEG(sp, jpeg_set_colorspace(&sp->cinfo.c, colorspace));
+}
+
+static int
+TIFFjpeg_set_quality(JPEGState* sp, int quality, boolean force_baseline)
+{
+ return CALLVJPEG(sp,
+ jpeg_set_quality(&sp->cinfo.c, quality, force_baseline));
+}
+
+static int
+TIFFjpeg_suppress_tables(JPEGState* sp, boolean suppress)
+{
+ return CALLVJPEG(sp, jpeg_suppress_tables(&sp->cinfo.c, suppress));
+}
+
+static int
+TIFFjpeg_start_compress(JPEGState* sp, boolean write_all_tables)
+{
+ return CALLVJPEG(sp,
+ jpeg_start_compress(&sp->cinfo.c, write_all_tables));
+}
+
+static int
+TIFFjpeg_write_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int num_lines)
+{
+ return CALLJPEG(sp, -1, (int) jpeg_write_scanlines(&sp->cinfo.c,
+ scanlines, (JDIMENSION) num_lines));
+}
+
+static int
+TIFFjpeg_write_raw_data(JPEGState* sp, JSAMPIMAGE data, int num_lines)
+{
+ return CALLJPEG(sp, -1, (int) jpeg_write_raw_data(&sp->cinfo.c,
+ data, (JDIMENSION) num_lines));
+}
+
+static int
+TIFFjpeg_finish_compress(JPEGState* sp)
+{
+ return CALLVJPEG(sp, jpeg_finish_compress(&sp->cinfo.c));
+}
+
+static int
+TIFFjpeg_write_tables(JPEGState* sp)
+{
+ return CALLVJPEG(sp, jpeg_write_tables(&sp->cinfo.c));
+}
+
+static int
+TIFFjpeg_read_header(JPEGState* sp, boolean require_image)
+{
+ return CALLJPEG(sp, -1, jpeg_read_header(&sp->cinfo.d, require_image));
+}
+
+static int
+TIFFjpeg_start_decompress(JPEGState* sp)
+{
+ return CALLVJPEG(sp, jpeg_start_decompress(&sp->cinfo.d));
+}
+
+static int
+TIFFjpeg_read_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int max_lines)
+{
+ return CALLJPEG(sp, -1, (int) jpeg_read_scanlines(&sp->cinfo.d,
+ scanlines, (JDIMENSION) max_lines));
+}
+
+static int
+TIFFjpeg_read_raw_data(JPEGState* sp, JSAMPIMAGE data, int max_lines)
+{
+ return CALLJPEG(sp, -1, (int) jpeg_read_raw_data(&sp->cinfo.d,
+ data, (JDIMENSION) max_lines));
+}
+
+static int
+TIFFjpeg_finish_decompress(JPEGState* sp)
+{
+ return CALLJPEG(sp, -1, (int) jpeg_finish_decompress(&sp->cinfo.d));
+}
+
+static int
+TIFFjpeg_abort(JPEGState* sp)
+{
+ return CALLVJPEG(sp, jpeg_abort(&sp->cinfo.comm));
+}
+
+static int
+TIFFjpeg_destroy(JPEGState* sp)
+{
+ return CALLVJPEG(sp, jpeg_destroy(&sp->cinfo.comm));
+}
+
+static JSAMPARRAY
+TIFFjpeg_alloc_sarray(JPEGState* sp, int pool_id,
+ JDIMENSION samplesperrow, JDIMENSION numrows)
+{
+ return CALLJPEG(sp, (JSAMPARRAY) NULL,
+ (*sp->cinfo.comm.mem->alloc_sarray)
+ (&sp->cinfo.comm, pool_id, samplesperrow, numrows));
+}
+
+/*
+ * JPEG library destination data manager.
+ * These routines direct compressed data from libjpeg into the
+ * libtiff output buffer.
+ */
+
+static void
+std_init_destination(j_compress_ptr cinfo)
+{
+ JPEGState* sp = (JPEGState*) cinfo;
+ TIFF* tif = sp->tif;
+
+ sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
+ sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
+}
+
+static boolean
+std_empty_output_buffer(j_compress_ptr cinfo)
+{
+ JPEGState* sp = (JPEGState*) cinfo;
+ TIFF* tif = sp->tif;
+
+ /* the entire buffer has been filled */
+ tif->tif_rawcc = tif->tif_rawdatasize;
+ TIFFFlushData1(tif);
+ sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
+ sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
+
+ return (TRUE);
+}
+
+static void
+std_term_destination(j_compress_ptr cinfo)
+{
+ JPEGState* sp = (JPEGState*) cinfo;
+ TIFF* tif = sp->tif;
+
+ tif->tif_rawcp = (tidata_t) sp->dest.next_output_byte;
+ tif->tif_rawcc =
+ tif->tif_rawdatasize - (tsize_t) sp->dest.free_in_buffer;
+ /* NB: libtiff does the final buffer flush */
+}
+
+static void
+TIFFjpeg_data_dest(JPEGState* sp, TIFF* tif)
+{
+ (void) tif;
+ sp->cinfo.c.dest = &sp->dest;
+ sp->dest.init_destination = std_init_destination;
+ sp->dest.empty_output_buffer = std_empty_output_buffer;
+ sp->dest.term_destination = std_term_destination;
+}
+
+/*
+ * Alternate destination manager for outputting to JPEGTables field.
+ */
+
+static void
+tables_init_destination(j_compress_ptr cinfo)
+{
+ JPEGState* sp = (JPEGState*) cinfo;
+
+ /* while building, jpegtables_length is allocated buffer size */
+ sp->dest.next_output_byte = (JOCTET*) sp->jpegtables;
+ sp->dest.free_in_buffer = (size_t) sp->jpegtables_length;
+}
+
+static boolean
+tables_empty_output_buffer(j_compress_ptr cinfo)
+{
+ JPEGState* sp = (JPEGState*) cinfo;
+ void* newbuf;
+
+ /* the entire buffer has been filled; enlarge it by 1000 bytes */
+ newbuf = _TIFFrealloc((tdata_t) sp->jpegtables,
+ (tsize_t) (sp->jpegtables_length + 1000));
+ if (newbuf == NULL)
+ ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 100);
+ sp->dest.next_output_byte = (JOCTET*) newbuf + sp->jpegtables_length;
+ sp->dest.free_in_buffer = (size_t) 1000;
+ sp->jpegtables = newbuf;
+ sp->jpegtables_length += 1000;
+ return (TRUE);
+}
+
+static void
+tables_term_destination(j_compress_ptr cinfo)
+{
+ JPEGState* sp = (JPEGState*) cinfo;
+
+ /* set tables length to number of bytes actually emitted */
+ sp->jpegtables_length -= sp->dest.free_in_buffer;
+}
+
+static int
+TIFFjpeg_tables_dest(JPEGState* sp, TIFF* tif)
+{
+ (void) tif;
+ /*
+ * Allocate a working buffer for building tables.
+ * Initial size is 1000 bytes, which is usually adequate.
+ */
+ if (sp->jpegtables)
+ _TIFFfree(sp->jpegtables);
+ sp->jpegtables_length = 1000;
+ sp->jpegtables = (void*) _TIFFmalloc((tsize_t) sp->jpegtables_length);
+ if (sp->jpegtables == NULL) {
+ sp->jpegtables_length = 0;
+ TIFFError("TIFFjpeg_tables_dest", "No space for JPEGTables");
+ return (0);
+ }
+ sp->cinfo.c.dest = &sp->dest;
+ sp->dest.init_destination = tables_init_destination;
+ sp->dest.empty_output_buffer = tables_empty_output_buffer;
+ sp->dest.term_destination = tables_term_destination;
+ return (1);
+}
+
+/*
+ * JPEG library source data manager.
+ * These routines supply compressed data to libjpeg.
+ */
+
+static void
+std_init_source(j_decompress_ptr cinfo)
+{
+ JPEGState* sp = (JPEGState*) cinfo;
+ TIFF* tif = sp->tif;
+
+ sp->src.next_input_byte = (const JOCTET*) tif->tif_rawdata;
+ sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
+}
+
+static boolean
+std_fill_input_buffer(j_decompress_ptr cinfo)
+{
+ JPEGState* sp = (JPEGState* ) cinfo;
+ static const JOCTET dummy_EOI[2] = { 0xFF, JPEG_EOI };
+
+ /*
+ * Should never get here since entire strip/tile is
+ * read into memory before the decompressor is called,
+ * and thus was supplied by init_source.
+ */
+ WARNMS(cinfo, JWRN_JPEG_EOF);
+ /* insert a fake EOI marker */
+ sp->src.next_input_byte = dummy_EOI;
+ sp->src.bytes_in_buffer = 2;
+ return (TRUE);
+}
+
+static void
+std_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
+{
+ JPEGState* sp = (JPEGState*) cinfo;
+
+ if (num_bytes > 0) {
+ if (num_bytes > (long) sp->src.bytes_in_buffer) {
+ /* oops, buffer overrun */
+ (void) std_fill_input_buffer(cinfo);
+ } else {
+ sp->src.next_input_byte += (size_t) num_bytes;
+ sp->src.bytes_in_buffer -= (size_t) num_bytes;
+ }
+ }
+}
+
+static void
+std_term_source(j_decompress_ptr cinfo)
+{
+ /* No work necessary here */
+ /* Or must we update tif->tif_rawcp, tif->tif_rawcc ??? */
+ /* (if so, need empty tables_term_source!) */
+ (void) cinfo;
+}
+
+static void
+TIFFjpeg_data_src(JPEGState* sp, TIFF* tif)
+{
+ (void) tif;
+ sp->cinfo.d.src = &sp->src;
+ sp->src.init_source = std_init_source;
+ sp->src.fill_input_buffer = std_fill_input_buffer;
+ sp->src.skip_input_data = std_skip_input_data;
+ sp->src.resync_to_restart = jpeg_resync_to_restart;
+ sp->src.term_source = std_term_source;
+ sp->src.bytes_in_buffer = 0; /* for safety */
+ sp->src.next_input_byte = NULL;
+}
+
+/*
+ * Alternate source manager for reading from JPEGTables.
+ * We can share all the code except for the init routine.
+ */
+
+static void
+tables_init_source(j_decompress_ptr cinfo)
+{
+ JPEGState* sp = (JPEGState*) cinfo;
+
+ sp->src.next_input_byte = (const JOCTET*) sp->jpegtables;
+ sp->src.bytes_in_buffer = (size_t) sp->jpegtables_length;
+}
+
+static void
+TIFFjpeg_tables_src(JPEGState* sp, TIFF* tif)
+{
+ TIFFjpeg_data_src(sp, tif);
+ sp->src.init_source = tables_init_source;
+}
+
+/*
+ * Allocate downsampled-data buffers needed for downsampled I/O.
+ * We use values computed in jpeg_start_compress or jpeg_start_decompress.
+ * We use libjpeg's allocator so that buffers will be released automatically
+ * when done with strip/tile.
+ * This is also a handy place to compute samplesperclump, bytesperline.
+ */
+static int
+alloc_downsampled_buffers(TIFF* tif, jpeg_component_info* comp_info,
+ int num_components)
+{
+ JPEGState* sp = JState(tif);
+ int ci;
+ jpeg_component_info* compptr;
+ JSAMPARRAY buf;
+ int samples_per_clump = 0;
+
+ for (ci = 0, compptr = comp_info; ci < num_components;
+ ci++, compptr++) {
+ samples_per_clump += compptr->h_samp_factor *
+ compptr->v_samp_factor;
+ buf = TIFFjpeg_alloc_sarray(sp, JPOOL_IMAGE,
+ compptr->width_in_blocks * DCTSIZE,
+ (JDIMENSION) (compptr->v_samp_factor*DCTSIZE));
+ if (buf == NULL)
+ return (0);
+ sp->ds_buffer[ci] = buf;
+ }
+ sp->samplesperclump = samples_per_clump;
+ return (1);
+}
+
+
+/*
+ * JPEG Decoding.
+ */
+
+static int
+JPEGSetupDecode(TIFF* tif)
+{
+ JPEGState* sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+
+ JPEGInitializeLibJPEG( tif );
+
+ assert(sp != NULL);
+ assert(sp->cinfo.comm.is_decompressor);
+
+ /* Read JPEGTables if it is present */
+ if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) {
+ TIFFjpeg_tables_src(sp, tif);
+ if(TIFFjpeg_read_header(sp,FALSE) != JPEG_HEADER_TABLES_ONLY) {
+ TIFFError("JPEGSetupDecode", "Bogus JPEGTables field");
+ return (0);
+ }
+ }
+
+ /* Grab parameters that are same for all strips/tiles */
+ sp->photometric = td->td_photometric;
+ switch (sp->photometric) {
+ case PHOTOMETRIC_YCBCR:
+ sp->h_sampling = td->td_ycbcrsubsampling[0];
+ sp->v_sampling = td->td_ycbcrsubsampling[1];
+ break;
+ default:
+ /* TIFF 6.0 forbids subsampling of all other color spaces */
+ sp->h_sampling = 1;
+ sp->v_sampling = 1;
+ break;
+ }
+
+ /* Set up for reading normal data */
+ TIFFjpeg_data_src(sp, tif);
+ tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */
+ return (1);
+}
+
+/*
+ * Set up for decoding a strip or tile.
+ */
+static int
+JPEGPreDecode(TIFF* tif, tsample_t s)
+{
+ JPEGState *sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+ static const char module[] = "JPEGPreDecode";
+ uint32 segment_width, segment_height;
+ int downsampled_output;
+ int ci;
+
+ assert(sp != NULL);
+ assert(sp->cinfo.comm.is_decompressor);
+ /*
+ * Reset decoder state from any previous strip/tile,
+ * in case application didn't read the whole strip.
+ */
+ if (!TIFFjpeg_abort(sp))
+ return (0);
+ /*
+ * Read the header for this strip/tile.
+ */
+ if (TIFFjpeg_read_header(sp, TRUE) != JPEG_HEADER_OK)
+ return (0);
+ /*
+ * Check image parameters and set decompression parameters.
+ */
+ segment_width = td->td_imagewidth;
+ segment_height = td->td_imagelength - tif->tif_row;
+ if (isTiled(tif)) {
+ segment_width = td->td_tilewidth;
+ segment_height = td->td_tilelength;
+ sp->bytesperline = TIFFTileRowSize(tif);
+ } else {
+ if (segment_height > td->td_rowsperstrip)
+ segment_height = td->td_rowsperstrip;
+ sp->bytesperline = TIFFScanlineSize(tif);
+ }
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
+ /*
+ * For PC 2, scale down the expected strip/tile size
+ * to match a downsampled component
+ */
+ segment_width = TIFFhowmany(segment_width, sp->h_sampling);
+ segment_height = TIFFhowmany(segment_height, sp->v_sampling);
+ }
+ if (sp->cinfo.d.image_width != segment_width ||
+ sp->cinfo.d.image_height != segment_height) {
+ TIFFWarning(module,
+ "Improper JPEG strip/tile size, expected %dx%d, got %dx%d",
+ segment_width,
+ segment_height,
+ sp->cinfo.d.image_width,
+ sp->cinfo.d.image_height);
+ }
+ if (sp->cinfo.d.num_components !=
+ (td->td_planarconfig == PLANARCONFIG_CONTIG ?
+ td->td_samplesperpixel : 1)) {
+ TIFFError(module, "Improper JPEG component count");
+ return (0);
+ }
+ if (sp->cinfo.d.data_precision != td->td_bitspersample) {
+ TIFFError(module, "Improper JPEG data precision");
+ return (0);
+ }
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
+ /* Component 0 should have expected sampling factors */
+ if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling ||
+ sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling) {
+ TIFFWarning(module,
+ "Improper JPEG sampling factors %d,%d\n"
+ "Apparently should be %d,%d, "
+ "decompressor will try reading with "
+ "sampling %d,%d",
+ sp->cinfo.d.comp_info[0].h_samp_factor,
+ sp->cinfo.d.comp_info[0].v_samp_factor,
+ sp->h_sampling,
+ sp->v_sampling,
+ sp->cinfo.d.comp_info[0].h_samp_factor,
+ sp->cinfo.d.comp_info[0].v_samp_factor );
+
+ sp->h_sampling = (uint16)
+ sp->cinfo.d.comp_info[0].h_samp_factor;
+ sp->v_sampling = (uint16)
+ sp->cinfo.d.comp_info[0].v_samp_factor;
+ }
+ /* Rest should have sampling factors 1,1 */
+ for (ci = 1; ci < sp->cinfo.d.num_components; ci++) {
+ if (sp->cinfo.d.comp_info[ci].h_samp_factor != 1 ||
+ sp->cinfo.d.comp_info[ci].v_samp_factor != 1) {
+ TIFFError(module, "Improper JPEG sampling factors");
+ return (0);
+ }
+ }
+ } else {
+ /* PC 2's single component should have sampling factors 1,1 */
+ if (sp->cinfo.d.comp_info[0].h_samp_factor != 1 ||
+ sp->cinfo.d.comp_info[0].v_samp_factor != 1) {
+ TIFFError(module, "Improper JPEG sampling factors");
+ return (0);
+ }
+ }
+ downsampled_output = FALSE;
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
+ sp->photometric == PHOTOMETRIC_YCBCR &&
+ sp->jpegcolormode == JPEGCOLORMODE_RGB) {
+ /* Convert YCbCr to RGB */
+ sp->cinfo.d.jpeg_color_space = JCS_YCbCr;
+ sp->cinfo.d.out_color_space = JCS_RGB;
+ } else {
+ /* Suppress colorspace handling */
+ sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN;
+ sp->cinfo.d.out_color_space = JCS_UNKNOWN;
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
+ (sp->h_sampling != 1 || sp->v_sampling != 1))
+ downsampled_output = TRUE;
+ /* XXX what about up-sampling? */
+ }
+ if (downsampled_output) {
+ /* Need to use raw-data interface to libjpeg */
+ sp->cinfo.d.raw_data_out = TRUE;
+ tif->tif_decoderow = JPEGDecodeRaw;
+ tif->tif_decodestrip = JPEGDecodeRaw;
+ tif->tif_decodetile = JPEGDecodeRaw;
+ } else {
+ /* Use normal interface to libjpeg */
+ sp->cinfo.d.raw_data_out = FALSE;
+ tif->tif_decoderow = JPEGDecode;
+ tif->tif_decodestrip = JPEGDecode;
+ tif->tif_decodetile = JPEGDecode;
+ }
+ /* Start JPEG decompressor */
+ if (!TIFFjpeg_start_decompress(sp))
+ return (0);
+ /* Allocate downsampled-data buffers if needed */
+ if (downsampled_output) {
+ if (!alloc_downsampled_buffers(tif, sp->cinfo.d.comp_info,
+ sp->cinfo.d.num_components))
+ return (0);
+ sp->scancount = DCTSIZE; /* mark buffer empty */
+ }
+ return (1);
+}
+
+/*
+ * Decode a chunk of pixels.
+ * "Standard" case: returned data is not downsampled.
+ */
+/*ARGSUSED*/ static int
+JPEGDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
+{
+ JPEGState *sp = JState(tif);
+ tsize_t nrows;
+
+ nrows = cc / sp->bytesperline;
+ if (cc % sp->bytesperline)
+ TIFFWarning(tif->tif_name, "fractional scanline not read");
+
+ if( nrows > (int) sp->cinfo.d.image_height )
+ nrows = sp->cinfo.d.image_height;
+
+ /* data is expected to be read in multiples of a scanline */
+ if (nrows)
+ {
+ do {
+ JSAMPROW bufptr = (JSAMPROW)buf;
+
+ if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1)
+ return (0);
+ ++tif->tif_row;
+ buf += sp->bytesperline;
+ cc -= sp->bytesperline;
+ } while (--nrows > 0);
+ }
+ /* Close down the decompressor if we've finished the strip or tile. */
+ return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
+ || TIFFjpeg_finish_decompress(sp);
+}
+
+/*
+ * Decode a chunk of pixels.
+ * Returned data is downsampled per sampling factors.
+ */
+/*ARGSUSED*/ static int
+JPEGDecodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
+{
+ JPEGState *sp = JState(tif);
+ tsize_t nrows;
+
+ /* data is expected to be read in multiples of a scanline */
+ if ( (nrows = sp->cinfo.d.image_height) ) {
+ /* Cb,Cr both have sampling factors 1, so this is correct */
+ JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width;
+ int samples_per_clump = sp->samplesperclump;
+
+ do {
+ jpeg_component_info *compptr;
+ int ci, clumpoffset;
+
+ /* Reload downsampled-data buffer if needed */
+ if (sp->scancount >= DCTSIZE) {
+ int n = sp->cinfo.d.max_v_samp_factor * DCTSIZE;
+
+ if (TIFFjpeg_read_raw_data(sp, sp->ds_buffer, n)
+ != n)
+ return (0);
+ sp->scancount = 0;
+ }
+ /*
+ * Fastest way to unseparate data is to make one pass
+ * over the scanline for each row of each component.
+ */
+ clumpoffset = 0; /* first sample in clump */
+ for (ci = 0, compptr = sp->cinfo.d.comp_info;
+ ci < sp->cinfo.d.num_components;
+ ci++, compptr++) {
+ int hsamp = compptr->h_samp_factor;
+ int vsamp = compptr->v_samp_factor;
+ int ypos;
+
+ for (ypos = 0; ypos < vsamp; ypos++) {
+ JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
+ JSAMPLE *outptr = (JSAMPLE*)buf + clumpoffset;
+ JDIMENSION nclump;
+
+ if (hsamp == 1) {
+ /* fast path for at least Cb and Cr */
+ for (nclump = clumps_per_line; nclump-- > 0; ) {
+ outptr[0] = *inptr++;
+ outptr += samples_per_clump;
+ }
+ } else {
+ int xpos;
+
+ /* general case */
+ for (nclump = clumps_per_line; nclump-- > 0; ) {
+ for (xpos = 0; xpos < hsamp; xpos++)
+ outptr[xpos] = *inptr++;
+ outptr += samples_per_clump;
+ }
+ }
+ clumpoffset += hsamp;
+ }
+ }
+ ++sp->scancount;
+ ++tif->tif_row;
+ buf += sp->bytesperline;
+ cc -= sp->bytesperline;
+ } while (--nrows > 0);
+ }
+
+ /* Close down the decompressor if done. */
+ return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
+ || TIFFjpeg_finish_decompress(sp);
+}
+
+
+/*
+ * JPEG Encoding.
+ */
+
+static void
+unsuppress_quant_table (JPEGState* sp, int tblno)
+{
+ JQUANT_TBL* qtbl;
+
+ if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
+ qtbl->sent_table = FALSE;
+}
+
+static void
+unsuppress_huff_table (JPEGState* sp, int tblno)
+{
+ JHUFF_TBL* htbl;
+
+ if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
+ htbl->sent_table = FALSE;
+ if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
+ htbl->sent_table = FALSE;
+}
+
+static int
+prepare_JPEGTables(TIFF* tif)
+{
+ JPEGState* sp = JState(tif);
+
+ JPEGInitializeLibJPEG( tif );
+
+ /* Initialize quant tables for current quality setting */
+ if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
+ return (0);
+ /* Mark only the tables we want for output */
+ /* NB: chrominance tables are currently used only with YCbCr */
+ if (!TIFFjpeg_suppress_tables(sp, TRUE))
+ return (0);
+ if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) {
+ unsuppress_quant_table(sp, 0);
+ if (sp->photometric == PHOTOMETRIC_YCBCR)
+ unsuppress_quant_table(sp, 1);
+ }
+ if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) {
+ unsuppress_huff_table(sp, 0);
+ if (sp->photometric == PHOTOMETRIC_YCBCR)
+ unsuppress_huff_table(sp, 1);
+ }
+ /* Direct libjpeg output into jpegtables */
+ if (!TIFFjpeg_tables_dest(sp, tif))
+ return (0);
+ /* Emit tables-only datastream */
+ if (!TIFFjpeg_write_tables(sp))
+ return (0);
+
+ return (1);
+}
+
+static int
+JPEGSetupEncode(TIFF* tif)
+{
+ JPEGState* sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+ static const char module[] = "JPEGSetupEncode";
+
+ JPEGInitializeLibJPEG( tif );
+
+ assert(sp != NULL);
+ assert(!sp->cinfo.comm.is_decompressor);
+
+ /*
+ * Initialize all JPEG parameters to default values.
+ * Note that jpeg_set_defaults needs legal values for
+ * in_color_space and input_components.
+ */
+ sp->cinfo.c.in_color_space = JCS_UNKNOWN;
+ sp->cinfo.c.input_components = 1;
+ if (!TIFFjpeg_set_defaults(sp))
+ return (0);
+ /* Set per-file parameters */
+ sp->photometric = td->td_photometric;
+ switch (sp->photometric) {
+ case PHOTOMETRIC_YCBCR:
+ sp->h_sampling = td->td_ycbcrsubsampling[0];
+ sp->v_sampling = td->td_ycbcrsubsampling[1];
+ /*
+ * A ReferenceBlackWhite field *must* be present since the
+ * default value is inappropriate for YCbCr. Fill in the
+ * proper value if application didn't set it.
+ */
+ if (!TIFFFieldSet(tif, FIELD_REFBLACKWHITE)) {
+ float refbw[6];
+ long top = 1L << td->td_bitspersample;
+ refbw[0] = 0;
+ refbw[1] = (float)(top-1L);
+ refbw[2] = (float)(top>>1);
+ refbw[3] = refbw[1];
+ refbw[4] = refbw[2];
+ refbw[5] = refbw[1];
+ TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE, refbw);
+ }
+ break;
+ case PHOTOMETRIC_PALETTE: /* disallowed by Tech Note */
+ case PHOTOMETRIC_MASK:
+ TIFFError(module,
+ "PhotometricInterpretation %d not allowed for JPEG",
+ (int) sp->photometric);
+ return (0);
+ default:
+ /* TIFF 6.0 forbids subsampling of all other color spaces */
+ sp->h_sampling = 1;
+ sp->v_sampling = 1;
+ break;
+ }
+
+ /* Verify miscellaneous parameters */
+
+ /*
+ * This would need work if libtiff ever supports different
+ * depths for different components, or if libjpeg ever supports
+ * run-time selection of depth. Neither is imminent.
+ */
+ if (td->td_bitspersample != BITS_IN_JSAMPLE) {
+ TIFFError(module, "BitsPerSample %d not allowed for JPEG",
+ (int) td->td_bitspersample);
+ return (0);
+ }
+ sp->cinfo.c.data_precision = td->td_bitspersample;
+ if (isTiled(tif)) {
+ if ((td->td_tilelength % (sp->v_sampling * DCTSIZE)) != 0) {
+ TIFFError(module,
+ "JPEG tile height must be multiple of %d",
+ sp->v_sampling * DCTSIZE);
+ return (0);
+ }
+ if ((td->td_tilewidth % (sp->h_sampling * DCTSIZE)) != 0) {
+ TIFFError(module,
+ "JPEG tile width must be multiple of %d",
+ sp->h_sampling * DCTSIZE);
+ return (0);
+ }
+ } else {
+ if (td->td_rowsperstrip < td->td_imagelength &&
+ (td->td_rowsperstrip % (sp->v_sampling * DCTSIZE)) != 0) {
+ TIFFError(module,
+ "RowsPerStrip must be multiple of %d for JPEG",
+ sp->v_sampling * DCTSIZE);
+ return (0);
+ }
+ }
+
+ /* Create a JPEGTables field if appropriate */
+ if (sp->jpegtablesmode & (JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF)) {
+ if (!prepare_JPEGTables(tif))
+ return (0);
+ /* Mark the field present */
+ /* Can't use TIFFSetField since BEENWRITING is already set! */
+ TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
+ tif->tif_flags |= TIFF_DIRTYDIRECT;
+ } else {
+ /* We do not support application-supplied JPEGTables, */
+ /* so mark the field not present */
+ TIFFClrFieldBit(tif, FIELD_JPEGTABLES);
+ }
+
+ /* Direct libjpeg output to libtiff's output buffer */
+ TIFFjpeg_data_dest(sp, tif);
+
+ return (1);
+}
+
+/*
+ * Set encoding state at the start of a strip or tile.
+ */
+static int
+JPEGPreEncode(TIFF* tif, tsample_t s)
+{
+ JPEGState *sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+ static const char module[] = "JPEGPreEncode";
+ uint32 segment_width, segment_height;
+ int downsampled_input;
+
+ assert(sp != NULL);
+ assert(!sp->cinfo.comm.is_decompressor);
+ /*
+ * Set encoding parameters for this strip/tile.
+ */
+ if (isTiled(tif)) {
+ segment_width = td->td_tilewidth;
+ segment_height = td->td_tilelength;
+ sp->bytesperline = TIFFTileRowSize(tif);
+ } else {
+ segment_width = td->td_imagewidth;
+ segment_height = td->td_imagelength - tif->tif_row;
+ if (segment_height > td->td_rowsperstrip)
+ segment_height = td->td_rowsperstrip;
+ sp->bytesperline = TIFFScanlineSize(tif);
+ }
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
+ /* for PC 2, scale down the strip/tile size
+ * to match a downsampled component
+ */
+ segment_width = TIFFhowmany(segment_width, sp->h_sampling);
+ segment_height = TIFFhowmany(segment_height, sp->v_sampling);
+ }
+ if (segment_width > 65535 || segment_height > 65535) {
+ TIFFError(module, "Strip/tile too large for JPEG");
+ return (0);
+ }
+ sp->cinfo.c.image_width = segment_width;
+ sp->cinfo.c.image_height = segment_height;
+ downsampled_input = FALSE;
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
+ sp->cinfo.c.input_components = td->td_samplesperpixel;
+ if (sp->photometric == PHOTOMETRIC_YCBCR) {
+ if (sp->jpegcolormode == JPEGCOLORMODE_RGB) {
+ sp->cinfo.c.in_color_space = JCS_RGB;
+ } else {
+ sp->cinfo.c.in_color_space = JCS_YCbCr;
+ if (sp->h_sampling != 1 || sp->v_sampling != 1)
+ downsampled_input = TRUE;
+ }
+ if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr))
+ return (0);
+ /*
+ * Set Y sampling factors;
+ * we assume jpeg_set_colorspace() set the rest to 1
+ */
+ sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling;
+ sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling;
+ } else {
+ sp->cinfo.c.in_color_space = JCS_UNKNOWN;
+ if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
+ return (0);
+ /* jpeg_set_colorspace set all sampling factors to 1 */
+ }
+ } else {
+ sp->cinfo.c.input_components = 1;
+ sp->cinfo.c.in_color_space = JCS_UNKNOWN;
+ if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
+ return (0);
+ sp->cinfo.c.comp_info[0].component_id = s;
+ /* jpeg_set_colorspace() set sampling factors to 1 */
+ if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) {
+ sp->cinfo.c.comp_info[0].quant_tbl_no = 1;
+ sp->cinfo.c.comp_info[0].dc_tbl_no = 1;
+ sp->cinfo.c.comp_info[0].ac_tbl_no = 1;
+ }
+ }
+ /* ensure libjpeg won't write any extraneous markers */
+ sp->cinfo.c.write_JFIF_header = FALSE;
+ sp->cinfo.c.write_Adobe_marker = FALSE;
+ /* set up table handling correctly */
+ if (! (sp->jpegtablesmode & JPEGTABLESMODE_QUANT)) {
+ if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
+ return (0);
+ unsuppress_quant_table(sp, 0);
+ unsuppress_quant_table(sp, 1);
+ }
+ if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF)
+ sp->cinfo.c.optimize_coding = FALSE;
+ else
+ sp->cinfo.c.optimize_coding = TRUE;
+ if (downsampled_input) {
+ /* Need to use raw-data interface to libjpeg */
+ sp->cinfo.c.raw_data_in = TRUE;
+ tif->tif_encoderow = JPEGEncodeRaw;
+ tif->tif_encodestrip = JPEGEncodeRaw;
+ tif->tif_encodetile = JPEGEncodeRaw;
+ } else {
+ /* Use normal interface to libjpeg */
+ sp->cinfo.c.raw_data_in = FALSE;
+ tif->tif_encoderow = JPEGEncode;
+ tif->tif_encodestrip = JPEGEncode;
+ tif->tif_encodetile = JPEGEncode;
+ }
+ /* Start JPEG compressor */
+ if (!TIFFjpeg_start_compress(sp, FALSE))
+ return (0);
+ /* Allocate downsampled-data buffers if needed */
+ if (downsampled_input) {
+ if (!alloc_downsampled_buffers(tif, sp->cinfo.c.comp_info,
+ sp->cinfo.c.num_components))
+ return (0);
+ }
+ sp->scancount = 0;
+
+ return (1);
+}
+
+/*
+ * Encode a chunk of pixels.
+ * "Standard" case: incoming data is not downsampled.
+ */
+static int
+JPEGEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
+{
+ JPEGState *sp = JState(tif);
+ tsize_t nrows;
+ JSAMPROW bufptr[1];
+
+ (void) s;
+ assert(sp != NULL);
+ /* data is expected to be supplied in multiples of a scanline */
+ nrows = cc / sp->bytesperline;
+ if (cc % sp->bytesperline)
+ TIFFWarning(tif->tif_name, "fractional scanline discarded");
+
+ while (nrows-- > 0) {
+ bufptr[0] = (JSAMPROW) buf;
+ if (TIFFjpeg_write_scanlines(sp, bufptr, 1) != 1)
+ return (0);
+ if (nrows > 0)
+ tif->tif_row++;
+ buf += sp->bytesperline;
+ }
+ return (1);
+}
+
+/*
+ * Encode a chunk of pixels.
+ * Incoming data is expected to be downsampled per sampling factors.
+ */
+static int
+JPEGEncodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
+{
+ JPEGState *sp = JState(tif);
+ JSAMPLE* inptr;
+ JSAMPLE* outptr;
+ tsize_t nrows;
+ JDIMENSION clumps_per_line, nclump;
+ int clumpoffset, ci, xpos, ypos;
+ jpeg_component_info* compptr;
+ int samples_per_clump = sp->samplesperclump;
+
+ (void) s;
+ assert(sp != NULL);
+ /* data is expected to be supplied in multiples of a scanline */
+ nrows = cc / sp->bytesperline;
+ if (cc % sp->bytesperline)
+ TIFFWarning(tif->tif_name, "fractional scanline discarded");
+
+ /* Cb,Cr both have sampling factors 1, so this is correct */
+ clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width;
+
+ while (nrows-- > 0) {
+ /*
+ * Fastest way to separate the data is to make one pass
+ * over the scanline for each row of each component.
+ */
+ clumpoffset = 0; /* first sample in clump */
+ for (ci = 0, compptr = sp->cinfo.c.comp_info;
+ ci < sp->cinfo.c.num_components;
+ ci++, compptr++) {
+ int hsamp = compptr->h_samp_factor;
+ int vsamp = compptr->v_samp_factor;
+ int padding = (int) (compptr->width_in_blocks * DCTSIZE -
+ clumps_per_line * hsamp);
+ for (ypos = 0; ypos < vsamp; ypos++) {
+ inptr = ((JSAMPLE*) buf) + clumpoffset;
+ outptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
+ if (hsamp == 1) {
+ /* fast path for at least Cb and Cr */
+ for (nclump = clumps_per_line; nclump-- > 0; ) {
+ *outptr++ = inptr[0];
+ inptr += samples_per_clump;
+ }
+ } else {
+ /* general case */
+ for (nclump = clumps_per_line; nclump-- > 0; ) {
+ for (xpos = 0; xpos < hsamp; xpos++)
+ *outptr++ = inptr[xpos];
+ inptr += samples_per_clump;
+ }
+ }
+ /* pad each scanline as needed */
+ for (xpos = 0; xpos < padding; xpos++) {
+ *outptr = outptr[-1];
+ outptr++;
+ }
+ clumpoffset += hsamp;
+ }
+ }
+ sp->scancount++;
+ if (sp->scancount >= DCTSIZE) {
+ int n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
+ if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
+ return (0);
+ sp->scancount = 0;
+ }
+ if (nrows > 0)
+ tif->tif_row++;
+ buf += sp->bytesperline;
+ }
+ return (1);
+}
+
+/*
+ * Finish up at the end of a strip or tile.
+ */
+static int
+JPEGPostEncode(TIFF* tif)
+{
+ JPEGState *sp = JState(tif);
+
+ if (sp->scancount > 0) {
+ /*
+ * Need to emit a partial bufferload of downsampled data.
+ * Pad the data vertically.
+ */
+ int ci, ypos, n;
+ jpeg_component_info* compptr;
+
+ for (ci = 0, compptr = sp->cinfo.c.comp_info;
+ ci < sp->cinfo.c.num_components;
+ ci++, compptr++) {
+ int vsamp = compptr->v_samp_factor;
+ tsize_t row_width = compptr->width_in_blocks * DCTSIZE
+ * sizeof(JSAMPLE);
+ for (ypos = sp->scancount * vsamp;
+ ypos < DCTSIZE * vsamp; ypos++) {
+ _TIFFmemcpy((tdata_t)sp->ds_buffer[ci][ypos],
+ (tdata_t)sp->ds_buffer[ci][ypos-1],
+ row_width);
+
+ }
+ }
+ n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
+ if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
+ return (0);
+ }
+
+ return (TIFFjpeg_finish_compress(JState(tif)));
+}
+
+static void
+JPEGCleanup(TIFF* tif)
+{
+ if (tif->tif_data) {
+ JPEGState *sp = JState(tif);
+ if( sp->cinfo_initialized )
+ TIFFjpeg_destroy(sp); /* release libjpeg resources */
+ if (sp->jpegtables) /* tag value */
+ _TIFFfree(sp->jpegtables);
+ _TIFFfree(tif->tif_data); /* release local state */
+ tif->tif_data = NULL;
+ }
+}
+
+static int
+JPEGVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ JPEGState* sp = JState(tif);
+ TIFFDirectory* td = &tif->tif_dir;
+ uint32 v32;
+
+ switch (tag) {
+ case TIFFTAG_JPEGTABLES:
+ v32 = va_arg(ap, uint32);
+ if (v32 == 0) {
+ /* XXX */
+ return (0);
+ }
+ _TIFFsetByteArray(&sp->jpegtables, va_arg(ap, void*),
+ (long) v32);
+ sp->jpegtables_length = v32;
+ TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
+ break;
+ case TIFFTAG_JPEGQUALITY:
+ sp->jpegquality = va_arg(ap, int);
+ return (1); /* pseudo tag */
+ case TIFFTAG_JPEGCOLORMODE:
+ sp->jpegcolormode = va_arg(ap, int);
+ /*
+ * Mark whether returned data is up-sampled or not
+ * so TIFFStripSize and TIFFTileSize return values
+ * that reflect the true amount of data.
+ */
+ tif->tif_flags &= ~TIFF_UPSAMPLED;
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
+ if (td->td_photometric == PHOTOMETRIC_YCBCR &&
+ sp->jpegcolormode == JPEGCOLORMODE_RGB) {
+ tif->tif_flags |= TIFF_UPSAMPLED;
+ } else {
+ if (td->td_ycbcrsubsampling[0] != 1 ||
+ td->td_ycbcrsubsampling[1] != 1)
+ ; /* XXX what about up-sampling? */
+ }
+ }
+ /*
+ * Must recalculate cached tile size
+ * in case sampling state changed.
+ */
+ tif->tif_tilesize = TIFFTileSize(tif);
+ return (1); /* pseudo tag */
+ case TIFFTAG_JPEGTABLESMODE:
+ sp->jpegtablesmode = va_arg(ap, int);
+ return (1); /* pseudo tag */
+ case TIFFTAG_YCBCRSUBSAMPLING:
+ /* mark the fact that we have a real ycbcrsubsampling! */
+ sp->ycbcrsampling_fetched = 1;
+ return (*sp->vsetparent)(tif, tag, ap);
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+ tif->tif_flags |= TIFF_DIRTYDIRECT;
+ return (1);
+}
+
+/*
+ * Some JPEG-in-TIFF produces do not emit the YCBCRSUBSAMPLING values in
+ * the TIFF tags, but still use non-default (2,2) values within the jpeg
+ * data stream itself. In order for TIFF applications to work properly
+ * - for instance to get the strip buffer size right - it is imperative
+ * that the subsampling be available before we start reading the image
+ * data normally. This function will attempt to load the first strip in
+ * order to get the sampling values from the jpeg data stream. Various
+ * hacks are various places are done to ensure this function gets called
+ * before the td_ycbcrsubsampling values are used from the directory structure,
+ * including calling TIFFGetField() for the YCBCRSUBSAMPLING field from
+ * TIFFStripSize(), and the printing code in tif_print.c.
+ *
+ * Note that JPEGPreDeocode() will produce a fairly loud warning when the
+ * discovered sampling does not match the default sampling (2,2) or whatever
+ * was actually in the tiff tags.
+ *
+ * Problems:
+ * o This code will cause one whole strip/tile of compressed data to be
+ * loaded just to get the tags right, even if the imagery is never read.
+ * It would be more efficient to just load a bit of the header, and
+ * initialize things from that.
+ *
+ * See the bug in bugzilla for details:
+ *
+ * http://bugzilla.remotesensing.org/show_bug.cgi?id=168
+ *
+ * Frank Warmerdam, July 2002
+ */
+
+static void
+JPEGFixupTestSubsampling( TIFF * tif )
+{
+#if CHECK_JPEG_YCBCR_SUBSAMPLING == 1
+ JPEGState *sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+
+ JPEGInitializeLibJPEG( tif );
+
+ /*
+ * Some JPEG-in-TIFF files don't provide the ycbcrsampling tags,
+ * and use a sampling schema other than the default 2,2. To handle
+ * this we actually have to scan the header of a strip or tile of
+ * jpeg data to get the sampling.
+ */
+ if( !sp->cinfo.comm.is_decompressor
+ || sp->ycbcrsampling_fetched
+ || td->td_photometric != PHOTOMETRIC_YCBCR )
+ return;
+
+ sp->ycbcrsampling_fetched = 1;
+ if( TIFFIsTiled( tif ) )
+ {
+ if( !TIFFFillTile( tif, 0 ) )
+ return;
+ }
+ else
+ {
+ if( !TIFFFillStrip( tif, 0 ) )
+ return;
+ }
+
+ TIFFSetField( tif, TIFFTAG_YCBCRSUBSAMPLING,
+ (uint16) sp->h_sampling, (uint16) sp->v_sampling );
+#endif /* CHECK_JPEG_YCBCR_SUBSAMPLING == 1 */
+}
+
+static int
+JPEGVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ JPEGState* sp = JState(tif);
+
+ switch (tag) {
+ case TIFFTAG_JPEGTABLES:
+ /* u_short is bogus --- should be uint32 ??? */
+ /* TIFFWriteNormalTag needs fixed XXX */
+ *va_arg(ap, u_short*) = (u_short) sp->jpegtables_length;
+ *va_arg(ap, void**) = sp->jpegtables;
+ break;
+ case TIFFTAG_JPEGQUALITY:
+ *va_arg(ap, int*) = sp->jpegquality;
+ break;
+ case TIFFTAG_JPEGCOLORMODE:
+ *va_arg(ap, int*) = sp->jpegcolormode;
+ break;
+ case TIFFTAG_JPEGTABLESMODE:
+ *va_arg(ap, int*) = sp->jpegtablesmode;
+ break;
+ case TIFFTAG_YCBCRSUBSAMPLING:
+ JPEGFixupTestSubsampling( tif );
+ return (*sp->vgetparent)(tif, tag, ap);
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return (1);
+}
+
+static void
+JPEGPrintDir(TIFF* tif, FILE* fd, long flags)
+{
+ JPEGState* sp = JState(tif);
+
+ (void) flags;
+ if (TIFFFieldSet(tif,FIELD_JPEGTABLES))
+ fprintf(fd, " JPEG Tables: (%lu bytes)\n",
+ (u_long) sp->jpegtables_length);
+}
+
+static uint32
+JPEGDefaultStripSize(TIFF* tif, uint32 s)
+{
+ JPEGState* sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+
+ s = (*sp->defsparent)(tif, s);
+ if (s < td->td_imagelength)
+ s = TIFFroundup(s, td->td_ycbcrsubsampling[1] * DCTSIZE);
+ return (s);
+}
+
+static void
+JPEGDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
+{
+ JPEGState* sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+
+ (*sp->deftparent)(tif, tw, th);
+ *tw = TIFFroundup(*tw, td->td_ycbcrsubsampling[0] * DCTSIZE);
+ *th = TIFFroundup(*th, td->td_ycbcrsubsampling[1] * DCTSIZE);
+}
+
+/*
+ * The JPEG library initialized used to be done in TIFFInitJPEG(), but
+ * now that we allow a TIFF file to be opened in update mode it is necessary
+ * to have some way of deciding whether compression or decompression is
+ * desired other than looking at tif->tif_mode. We accomplish this by
+ * examining {TILE/STRIP}BYTECOUNTS to see if there is a non-zero entry.
+ * If so, we assume decompression is desired.
+ *
+ * This is tricky, because TIFFInitJPEG() is called while the directory is
+ * being read, and generally speaking the BYTECOUNTS tag won't have been read
+ * at that point. So we try to defer jpeg library initialization till we
+ * do have that tag ... basically any access that might require the compressor
+ * or decompressor that occurs after the reading of the directory.
+ *
+ * In an ideal world compressors or decompressors would be setup
+ * at the point where a single tile or strip was accessed (for read or write)
+ * so that stuff like update of missing tiles, or replacement of tiles could
+ * be done. However, we aren't trying to crack that nut just yet ...
+ *
+ * NFW, Feb 3rd, 2003.
+ */
+
+static int JPEGInitializeLibJPEG( TIFF * tif )
+{
+ JPEGState* sp = JState(tif);
+ uint32 *byte_counts = NULL;
+ int data_is_empty = TRUE;
+
+ if( sp->cinfo_initialized )
+ return 1;
+
+ /*
+ * Do we have tile data already? Make sure we initialize the
+ * the state in decompressor mode if we have tile data, even if we
+ * are not in read-only file access mode.
+ */
+ if( TIFFIsTiled( tif )
+ && TIFFGetField( tif, TIFFTAG_TILEBYTECOUNTS, &byte_counts )
+ && byte_counts != NULL )
+ {
+ data_is_empty = byte_counts[0] == 0;
+ }
+ if( !TIFFIsTiled( tif )
+ && TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &byte_counts)
+ && byte_counts != NULL )
+ {
+ data_is_empty = byte_counts[0] == 0;
+ }
+
+ /*
+ * Initialize libjpeg.
+ */
+ if (tif->tif_mode == O_RDONLY || !data_is_empty ) {
+ if (!TIFFjpeg_create_decompress(sp))
+ return (0);
+
+ } else {
+ if (!TIFFjpeg_create_compress(sp))
+ return (0);
+ }
+
+ sp->cinfo_initialized = TRUE;
+
+ return 1;
+}
+
+int
+TIFFInitJPEG(TIFF* tif, int scheme)
+{
+ JPEGState* sp;
+
+ assert(scheme == COMPRESSION_JPEG);
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (JPEGState));
+
+ if (tif->tif_data == NULL) {
+ TIFFError("TIFFInitJPEG", "No space for JPEG state block");
+ return (0);
+ }
+ memset( tif->tif_data, 0, sizeof(JPEGState));
+
+ sp = JState(tif);
+ sp->tif = tif; /* back link */
+
+ /*
+ * Merge codec-specific tag information and
+ * override parent get/set field methods.
+ */
+ _TIFFMergeFieldInfo(tif, jpegFieldInfo, N(jpegFieldInfo));
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = JPEGVGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = JPEGVSetField; /* hook for codec tags */
+ tif->tif_tagmethods.printdir = JPEGPrintDir; /* hook for codec tags */
+
+ /* Default values for codec-specific fields */
+ sp->jpegtables = NULL;
+ sp->jpegtables_length = 0;
+ sp->jpegquality = 75; /* Default IJG quality */
+ sp->jpegcolormode = JPEGCOLORMODE_RAW;
+ sp->jpegtablesmode = JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF;
+
+ sp->ycbcrsampling_fetched = 0;
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_setupdecode = JPEGSetupDecode;
+ tif->tif_predecode = JPEGPreDecode;
+ tif->tif_decoderow = JPEGDecode;
+ tif->tif_decodestrip = JPEGDecode;
+ tif->tif_decodetile = JPEGDecode;
+ tif->tif_setupencode = JPEGSetupEncode;
+ tif->tif_preencode = JPEGPreEncode;
+ tif->tif_postencode = JPEGPostEncode;
+ tif->tif_encoderow = JPEGEncode;
+ tif->tif_encodestrip = JPEGEncode;
+ tif->tif_encodetile = JPEGEncode;
+ tif->tif_cleanup = JPEGCleanup;
+ sp->defsparent = tif->tif_defstripsize;
+ tif->tif_defstripsize = JPEGDefaultStripSize;
+ sp->deftparent = tif->tif_deftilesize;
+ tif->tif_deftilesize = JPEGDefaultTileSize;
+ tif->tif_flags |= TIFF_NOBITREV; /* no bit reversal, please */
+
+ sp->cinfo_initialized = FALSE;
+
+ /*
+ * Mark the TIFFTAG_YCBCRSAMPLES as present even if it is not
+ * see: JPEGFixupTestSubsampling().
+ */
+ TIFFSetFieldBit( tif, FIELD_YCBCRSUBSAMPLING );
+
+ return (1);
+}
+#endif /* JPEG_SUPPORT */
diff --git a/src/tiff/tif_luv.c b/src/tiff/tif_luv.c
new file mode 100644
index 0000000..b6011f3
--- /dev/null
+++ b/src/tiff/tif_luv.c
@@ -0,0 +1,1586 @@
+/*
+ * Copyright (c) 1997 Greg Ward Larson
+ * Copyright (c) 1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler, Greg Larson and Silicon Graphics may not be used in any
+ * advertising or publicity relating to the software without the specific,
+ * prior written permission of Sam Leffler, Greg Larson and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER, GREG LARSON OR SILICON GRAPHICS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef LOGLUV_SUPPORT
+
+/*
+ * TIFF Library.
+ * LogLuv compression support for high dynamic range images.
+ *
+ * Contributed by Greg Larson.
+ *
+ * LogLuv image support uses the TIFF library to store 16 or 10-bit
+ * log luminance values with 8 bits each of u and v or a 14-bit index.
+ *
+ * The codec can take as input and produce as output 32-bit IEEE float values
+ * as well as 16-bit integer values. A 16-bit luminance is interpreted
+ * as a sign bit followed by a 15-bit integer that is converted
+ * to and from a linear magnitude using the transformation:
+ *
+ * L = 2^( (Le+.5)/256 - 64 ) # real from 15-bit
+ *
+ * Le = floor( 256*(log2(L) + 64) ) # 15-bit from real
+ *
+ * The actual conversion to world luminance units in candelas per sq. meter
+ * requires an additional multiplier, which is stored in the TIFFTAG_STONITS.
+ * This value is usually set such that a reasonable exposure comes from
+ * clamping decoded luminances above 1 to 1 in the displayed image.
+ *
+ * The 16-bit values for u and v may be converted to real values by dividing
+ * each by 32768. (This allows for negative values, which aren't useful as
+ * far as we know, but are left in case of future improvements in human
+ * color vision.)
+ *
+ * Conversion from (u,v), which is actually the CIE (u',v') system for
+ * you color scientists, is accomplished by the following transformation:
+ *
+ * u = 4*x / (-2*x + 12*y + 3)
+ * v = 9*y / (-2*x + 12*y + 3)
+ *
+ * x = 9*u / (6*u - 16*v + 12)
+ * y = 4*v / (6*u - 16*v + 12)
+ *
+ * This process is greatly simplified by passing 32-bit IEEE floats
+ * for each of three CIE XYZ coordinates. The codec then takes care
+ * of conversion to and from LogLuv, though the application is still
+ * responsible for interpreting the TIFFTAG_STONITS calibration factor.
+ *
+ * By definition, a CIE XYZ vector of [1 1 1] corresponds to a neutral white
+ * point of (x,y)=(1/3,1/3). However, most color systems assume some other
+ * white point, such as D65, and an absolute color conversion to XYZ then
+ * to another color space with a different white point may introduce an
+ * unwanted color cast to the image. It is often desirable, therefore, to
+ * perform a white point conversion that maps the input white to [1 1 1]
+ * in XYZ, then record the original white point using the TIFFTAG_WHITEPOINT
+ * tag value. A decoder that demands absolute color calibration may use
+ * this white point tag to get back the original colors, but usually it
+ * will be ignored and the new white point will be used instead that
+ * matches the output color space.
+ *
+ * Pixel information is compressed into one of two basic encodings, depending
+ * on the setting of the compression tag, which is one of COMPRESSION_SGILOG
+ * or COMPRESSION_SGILOG24. For COMPRESSION_SGILOG, greyscale data is
+ * stored as:
+ *
+ * 1 15
+ * |-+---------------|
+ *
+ * COMPRESSION_SGILOG color data is stored as:
+ *
+ * 1 15 8 8
+ * |-+---------------|--------+--------|
+ * S Le ue ve
+ *
+ * For the 24-bit COMPRESSION_SGILOG24 color format, the data is stored as:
+ *
+ * 10 14
+ * |----------|--------------|
+ * Le' Ce
+ *
+ * There is no sign bit in the 24-bit case, and the (u,v) chromaticity is
+ * encoded as an index for optimal color resolution. The 10 log bits are
+ * defined by the following conversions:
+ *
+ * L = 2^((Le'+.5)/64 - 12) # real from 10-bit
+ *
+ * Le' = floor( 64*(log2(L) + 12) ) # 10-bit from real
+ *
+ * The 10 bits of the smaller format may be converted into the 15 bits of
+ * the larger format by multiplying by 4 and adding 13314. Obviously,
+ * a smaller range of magnitudes is covered (about 5 orders of magnitude
+ * instead of 38), and the lack of a sign bit means that negative luminances
+ * are not allowed. (Well, they aren't allowed in the real world, either,
+ * but they are useful for certain types of image processing.)
+ *
+ * The desired user format is controlled by the setting the internal
+ * pseudo tag TIFFTAG_SGILOGDATAFMT to one of:
+ * SGILOGDATAFMT_FLOAT = IEEE 32-bit float XYZ values
+ * SGILOGDATAFMT_16BIT = 16-bit integer encodings of logL, u and v
+ * Raw data i/o is also possible using:
+ * SGILOGDATAFMT_RAW = 32-bit unsigned integer with encoded pixel
+ * In addition, the following decoding is provided for ease of display:
+ * SGILOGDATAFMT_8BIT = 8-bit default RGB gamma-corrected values
+ *
+ * For grayscale images, we provide the following data formats:
+ * SGILOGDATAFMT_FLOAT = IEEE 32-bit float Y values
+ * SGILOGDATAFMT_16BIT = 16-bit integer w/ encoded luminance
+ * SGILOGDATAFMT_8BIT = 8-bit gray monitor values
+ *
+ * Note that the COMPRESSION_SGILOG applies a simple run-length encoding
+ * scheme by separating the logL, u and v bytes for each row and applying
+ * a PackBits type of compression. Since the 24-bit encoding is not
+ * adaptive, the 32-bit color format takes less space in many cases.
+ *
+ * Further control is provided over the conversion from higher-resolution
+ * formats to final encoded values through the pseudo tag
+ * TIFFTAG_SGILOGENCODE:
+ * SGILOGENCODE_NODITHER = do not dither encoded values
+ * SGILOGENCODE_RANDITHER = apply random dithering during encoding
+ *
+ * The default value of this tag is SGILOGENCODE_NODITHER for
+ * COMPRESSION_SGILOG to maximize run-length encoding and
+ * SGILOGENCODE_RANDITHER for COMPRESSION_SGILOG24 to turn
+ * quantization errors into noise.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <math.h>
+
+/*
+ * State block for each open TIFF
+ * file using LogLuv compression/decompression.
+ */
+typedef struct logLuvState LogLuvState;
+
+struct logLuvState {
+ int user_datafmt; /* user data format */
+ int encode_meth; /* encoding method */
+ int pixel_size; /* bytes per pixel */
+
+ tidata_t* tbuf; /* translation buffer */
+ int tbuflen; /* buffer length */
+ void (*tfunc)(LogLuvState*, tidata_t, int);
+
+ TIFFVSetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+};
+
+#define DecoderState(tif) ((LogLuvState*) (tif)->tif_data)
+#define EncoderState(tif) ((LogLuvState*) (tif)->tif_data)
+
+#define N(a) (sizeof(a)/sizeof(a[0]))
+#define SGILOGDATAFMT_UNKNOWN -1
+
+#define MINRUN 4 /* minimum run length */
+
+/*
+ * Decode a string of 16-bit gray pixels.
+ */
+static int
+LogL16Decode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
+{
+ LogLuvState* sp = DecoderState(tif);
+ int shft, i, npixels;
+ u_char* bp;
+ int16* tp;
+ int16 b;
+ int cc, rc;
+
+ assert(s == 0);
+ assert(sp != NULL);
+
+ npixels = occ / sp->pixel_size;
+
+ if (sp->user_datafmt == SGILOGDATAFMT_16BIT)
+ tp = (int16*) op;
+ else {
+ assert(sp->tbuflen >= npixels);
+ tp = (int16*) sp->tbuf;
+ }
+ _TIFFmemset((tdata_t) tp, 0, npixels*sizeof (tp[0]));
+
+ bp = (u_char*) tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+ /* get each byte string */
+ for (shft = 2*8; (shft -= 8) >= 0; ) {
+ for (i = 0; i < npixels && cc > 0; )
+ if (*bp >= 128) { /* run */
+ rc = *bp++ + (2-128);
+ b = (int16)(*bp++ << shft);
+ cc -= 2;
+ while (rc--)
+ tp[i++] |= b;
+ } else { /* non-run */
+ rc = *bp++; /* nul is noop */
+ while (--cc && rc--)
+ tp[i++] |= (int16)*bp++ << shft;
+ }
+ if (i != npixels) {
+ TIFFError(tif->tif_name,
+ "LogL16Decode: Not enough data at row %d (short %d pixels)",
+ tif->tif_row, npixels - i);
+ tif->tif_rawcp = (tidata_t) bp;
+ tif->tif_rawcc = cc;
+ return (0);
+ }
+ }
+ (*sp->tfunc)(sp, op, npixels);
+ tif->tif_rawcp = (tidata_t) bp;
+ tif->tif_rawcc = cc;
+ return (1);
+}
+
+/*
+ * Decode a string of 24-bit pixels.
+ */
+static int
+LogLuvDecode24(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
+{
+ LogLuvState* sp = DecoderState(tif);
+ int cc, i, npixels;
+ u_char* bp;
+ uint32* tp;
+
+ assert(s == 0);
+ assert(sp != NULL);
+
+ npixels = occ / sp->pixel_size;
+
+ if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+ tp = (uint32 *)op;
+ else {
+ assert(sp->tbuflen >= npixels);
+ tp = (uint32 *) sp->tbuf;
+ }
+ /* copy to array of uint32 */
+ bp = (u_char*) tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+ for (i = 0; i < npixels && cc > 0; i++) {
+ tp[i] = bp[0] << 16 | bp[1] << 8 | bp[2];
+ bp += 3;
+ cc -= 3;
+ }
+ tif->tif_rawcp = (tidata_t) bp;
+ tif->tif_rawcc = cc;
+ if (i != npixels) {
+ TIFFError(tif->tif_name,
+ "LogLuvDecode24: Not enough data at row %d (short %d pixels)",
+ tif->tif_row, npixels - i);
+ return (0);
+ }
+ (*sp->tfunc)(sp, op, npixels);
+ return (1);
+}
+
+/*
+ * Decode a string of 32-bit pixels.
+ */
+static int
+LogLuvDecode32(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
+{
+ LogLuvState* sp;
+ int shft, i, npixels;
+ u_char* bp;
+ uint32* tp;
+ uint32 b;
+ int cc, rc;
+
+ assert(s == 0);
+ sp = DecoderState(tif);
+ assert(sp != NULL);
+
+ npixels = occ / sp->pixel_size;
+
+ if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+ tp = (uint32*) op;
+ else {
+ assert(sp->tbuflen >= npixels);
+ tp = (uint32*) sp->tbuf;
+ }
+ _TIFFmemset((tdata_t) tp, 0, npixels*sizeof (tp[0]));
+
+ bp = (u_char*) tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+ /* get each byte string */
+ for (shft = 4*8; (shft -= 8) >= 0; ) {
+ for (i = 0; i < npixels && cc > 0; )
+ if (*bp >= 128) { /* run */
+ rc = *bp++ + (2-128);
+ b = (uint32)*bp++ << shft;
+ cc -= 2;
+ while (rc--)
+ tp[i++] |= b;
+ } else { /* non-run */
+ rc = *bp++; /* nul is noop */
+ while (--cc && rc--)
+ tp[i++] |= (uint32)*bp++ << shft;
+ }
+ if (i != npixels) {
+ TIFFError(tif->tif_name,
+ "LogLuvDecode32: Not enough data at row %d (short %d pixels)",
+ tif->tif_row, npixels - i);
+ tif->tif_rawcp = (tidata_t) bp;
+ tif->tif_rawcc = cc;
+ return (0);
+ }
+ }
+ (*sp->tfunc)(sp, op, npixels);
+ tif->tif_rawcp = (tidata_t) bp;
+ tif->tif_rawcc = cc;
+ return (1);
+}
+
+/*
+ * Decode a strip of pixels. We break it into rows to
+ * maintain synchrony with the encode algorithm, which
+ * is row by row.
+ */
+static int
+LogLuvDecodeStrip(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+ tsize_t rowlen = TIFFScanlineSize(tif);
+
+ assert(cc%rowlen == 0);
+ while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s))
+ bp += rowlen, cc -= rowlen;
+ return (cc == 0);
+}
+
+/*
+ * Decode a tile of pixels. We break it into rows to
+ * maintain synchrony with the encode algorithm, which
+ * is row by row.
+ */
+static int
+LogLuvDecodeTile(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+ tsize_t rowlen = TIFFTileRowSize(tif);
+
+ assert(cc%rowlen == 0);
+ while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s))
+ bp += rowlen, cc -= rowlen;
+ return (cc == 0);
+}
+
+/*
+ * Encode a row of 16-bit pixels.
+ */
+static int
+LogL16Encode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+ LogLuvState* sp = EncoderState(tif);
+ int shft, i, j, npixels;
+ tidata_t op;
+ int16* tp;
+ int16 b;
+ int occ, rc=0, mask, beg;
+
+ assert(s == 0);
+ assert(sp != NULL);
+ npixels = cc / sp->pixel_size;
+
+ if (sp->user_datafmt == SGILOGDATAFMT_16BIT)
+ tp = (int16*) bp;
+ else {
+ tp = (int16*) sp->tbuf;
+ assert(sp->tbuflen >= npixels);
+ (*sp->tfunc)(sp, bp, npixels);
+ }
+ /* compress each byte string */
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ for (shft = 2*8; (shft -= 8) >= 0; )
+ for (i = 0; i < npixels; i += rc) {
+ if (occ < 4) {
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+ if (!TIFFFlushData1(tif))
+ return (-1);
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ }
+ mask = 0xff << shft; /* find next run */
+ for (beg = i; beg < npixels; beg += rc) {
+ b = (int16) (tp[beg] & mask);
+ rc = 1;
+ while (rc < 127+2 && beg+rc < npixels &&
+ (tp[beg+rc] & mask) == b)
+ rc++;
+ if (rc >= MINRUN)
+ break; /* long enough */
+ }
+ if (beg-i > 1 && beg-i < MINRUN) {
+ b = (int16) (tp[i] & mask);/*check short run */
+ j = i+1;
+ while ((tp[j++] & mask) == b)
+ if (j == beg) {
+ *op++ = (tidataval_t)(128-2+j-i);
+ *op++ = (tidataval_t) (b >> shft);
+ occ -= 2;
+ i = beg;
+ break;
+ }
+ }
+ while (i < beg) { /* write out non-run */
+ if ((j = beg-i) > 127) j = 127;
+ if (occ < j+3) {
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+ if (!TIFFFlushData1(tif))
+ return (-1);
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ }
+ *op++ = (tidataval_t) j; occ--;
+ while (j--) {
+ *op++ = (tidataval_t) (tp[i++] >> shft & 0xff);
+ occ--;
+ }
+ }
+ if (rc >= MINRUN) { /* write out run */
+ *op++ = (tidataval_t) (128-2+rc);
+ *op++ = (tidataval_t) (tp[beg] >> shft & 0xff);
+ occ -= 2;
+ } else
+ rc = 0;
+ }
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+
+ return (0);
+}
+
+/*
+ * Encode a row of 24-bit pixels.
+ */
+static int
+LogLuvEncode24(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+ LogLuvState* sp = EncoderState(tif);
+ int i, npixels, occ;
+ tidata_t op;
+ uint32* tp;
+
+ assert(s == 0);
+ assert(sp != NULL);
+ npixels = cc / sp->pixel_size;
+
+ if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+ tp = (uint32*) bp;
+ else {
+ tp = (uint32*) sp->tbuf;
+ assert(sp->tbuflen >= npixels);
+ (*sp->tfunc)(sp, bp, npixels);
+ }
+ /* write out encoded pixels */
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ for (i = npixels; i--; ) {
+ if (occ < 3) {
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+ if (!TIFFFlushData1(tif))
+ return (-1);
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ }
+ *op++ = (tidataval_t)(*tp >> 16);
+ *op++ = (tidataval_t)(*tp >> 8 & 0xff);
+ *op++ = (tidataval_t)(*tp++ & 0xff);
+ occ -= 3;
+ }
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+
+ return (0);
+}
+
+/*
+ * Encode a row of 32-bit pixels.
+ */
+static int
+LogLuvEncode32(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+ LogLuvState* sp = EncoderState(tif);
+ int shft, i, j, npixels;
+ tidata_t op;
+ uint32* tp;
+ uint32 b;
+ int occ, rc=0, mask, beg;
+
+ assert(s == 0);
+ assert(sp != NULL);
+
+ npixels = cc / sp->pixel_size;
+
+ if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+ tp = (uint32*) bp;
+ else {
+ tp = (uint32*) sp->tbuf;
+ assert(sp->tbuflen >= npixels);
+ (*sp->tfunc)(sp, bp, npixels);
+ }
+ /* compress each byte string */
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ for (shft = 4*8; (shft -= 8) >= 0; )
+ for (i = 0; i < npixels; i += rc) {
+ if (occ < 4) {
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+ if (!TIFFFlushData1(tif))
+ return (-1);
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ }
+ mask = 0xff << shft; /* find next run */
+ for (beg = i; beg < npixels; beg += rc) {
+ b = tp[beg] & mask;
+ rc = 1;
+ while (rc < 127+2 && beg+rc < npixels &&
+ (tp[beg+rc] & mask) == b)
+ rc++;
+ if (rc >= MINRUN)
+ break; /* long enough */
+ }
+ if (beg-i > 1 && beg-i < MINRUN) {
+ b = tp[i] & mask; /* check short run */
+ j = i+1;
+ while ((tp[j++] & mask) == b)
+ if (j == beg) {
+ *op++ = (tidataval_t)(128-2+j-i);
+ *op++ = (tidataval_t)(b >> shft);
+ occ -= 2;
+ i = beg;
+ break;
+ }
+ }
+ while (i < beg) { /* write out non-run */
+ if ((j = beg-i) > 127) j = 127;
+ if (occ < j+3) {
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+ if (!TIFFFlushData1(tif))
+ return (-1);
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ }
+ *op++ = (tidataval_t) j; occ--;
+ while (j--) {
+ *op++ = (tidataval_t)(tp[i++] >> shft & 0xff);
+ occ--;
+ }
+ }
+ if (rc >= MINRUN) { /* write out run */
+ *op++ = (tidataval_t) (128-2+rc);
+ *op++ = (tidataval_t)(tp[beg] >> shft & 0xff);
+ occ -= 2;
+ } else
+ rc = 0;
+ }
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+
+ return (0);
+}
+
+/*
+ * Encode a strip of pixels. We break it into rows to
+ * avoid encoding runs across row boundaries.
+ */
+static int
+LogLuvEncodeStrip(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+ tsize_t rowlen = TIFFScanlineSize(tif);
+
+ assert(cc%rowlen == 0);
+ while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 0)
+ bp += rowlen, cc -= rowlen;
+ return (cc == 0);
+}
+
+/*
+ * Encode a tile of pixels. We break it into rows to
+ * avoid encoding runs across row boundaries.
+ */
+static int
+LogLuvEncodeTile(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+ tsize_t rowlen = TIFFTileRowSize(tif);
+
+ assert(cc%rowlen == 0);
+ while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 0)
+ bp += rowlen, cc -= rowlen;
+ return (cc == 0);
+}
+
+/*
+ * Encode/Decode functions for converting to and from user formats.
+ */
+
+#include "uvcode.h"
+
+#ifndef UVSCALE
+#define U_NEU 0.210526316
+#define V_NEU 0.473684211
+#define UVSCALE 410.
+#endif
+
+#ifndef M_LN2
+#define M_LN2 0.69314718055994530942
+#endif
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+#define log2(x) ((1./M_LN2)*log(x))
+#define exp2(x) exp(M_LN2*(x))
+
+#define itrunc(x,m) ((m)==SGILOGENCODE_NODITHER ? \
+ (int)(x) : \
+ (int)((x) + rand()*(1./RAND_MAX) - .5))
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+double
+LogL16toY(int p16) /* compute luminance from 16-bit LogL */
+{
+ int Le = p16 & 0x7fff;
+ double Y;
+
+ if (!Le)
+ return (0.);
+ Y = exp(M_LN2/256.*(Le+.5) - M_LN2*64.);
+ return (!(p16 & 0x8000) ? Y : -Y);
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+int
+LogL16fromY(double Y, int em) /* get 16-bit LogL from Y */
+{
+ if (Y >= 1.8371976e19)
+ return (0x7fff);
+ if (Y <= -1.8371976e19)
+ return (0xffff);
+ if (Y > 5.4136769e-20)
+ return itrunc(256.*(log2(Y) + 64.), em);
+ if (Y < -5.4136769e-20)
+ return (~0x7fff | itrunc(256.*(log2(-Y) + 64.), em));
+ return (0);
+}
+
+static void
+L16toY(LogLuvState* sp, tidata_t op, int n)
+{
+ int16* l16 = (int16*) sp->tbuf;
+ float* yp = (float*) op;
+
+ while (n-- > 0)
+ *yp++ = (float)LogL16toY(*l16++);
+}
+
+static void
+L16toGry(LogLuvState* sp, tidata_t op, int n)
+{
+ int16* l16 = (int16*) sp->tbuf;
+ uint8* gp = (uint8*) op;
+
+ while (n-- > 0) {
+ double Y = LogL16toY(*l16++);
+ *gp++ = (uint8) ((Y <= 0.) ? 0 : (Y >= 1.) ? 255 : (int)(256.*sqrt(Y)));
+ }
+}
+
+static void
+L16fromY(LogLuvState* sp, tidata_t op, int n)
+{
+ int16* l16 = (int16*) sp->tbuf;
+ float* yp = (float*) op;
+
+ while (n-- > 0)
+ *l16++ = (int16) (LogL16fromY(*yp++, sp->encode_meth));
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+void
+XYZtoRGB24(float xyz[3], uint8 rgb[3])
+{
+ double r, g, b;
+ /* assume CCIR-709 primaries */
+ r = 2.690*xyz[0] + -1.276*xyz[1] + -0.414*xyz[2];
+ g = -1.022*xyz[0] + 1.978*xyz[1] + 0.044*xyz[2];
+ b = 0.061*xyz[0] + -0.224*xyz[1] + 1.163*xyz[2];
+ /* assume 2.0 gamma for speed */
+ /* could use integer sqrt approx., but this is probably faster */
+ rgb[0] = (uint8)((r<=0.) ? 0 : (r >= 1.) ? 255 : (int)(256.*sqrt(r)));
+ rgb[1] = (uint8)((g<=0.) ? 0 : (g >= 1.) ? 255 : (int)(256.*sqrt(g)));
+ rgb[2] = (uint8)((b<=0.) ? 0 : (b >= 1.) ? 255 : (int)(256.*sqrt(b)));
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+double
+LogL10toY(int p10) /* compute luminance from 10-bit LogL */
+{
+ if (p10 == 0)
+ return (0.);
+ return (exp(M_LN2/64.*(p10+.5) - M_LN2*12.));
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+int
+LogL10fromY(double Y, int em) /* get 10-bit LogL from Y */
+{
+ if (Y >= 15.742)
+ return (0x3ff);
+ else if (Y <= .00024283)
+ return (0);
+ else
+ return itrunc(64.*(log2(Y) + 12.), em);
+}
+
+#define NANGLES 100
+#define uv2ang(u, v) ( (NANGLES*.499999999/M_PI) \
+ * atan2((v)-V_NEU,(u)-U_NEU) + .5*NANGLES )
+
+static int
+oog_encode(double u, double v) /* encode out-of-gamut chroma */
+{
+ static int oog_table[NANGLES];
+ static int initialized = 0;
+ register int i;
+
+ if (!initialized) { /* set up perimeter table */
+ double eps[NANGLES], ua, va, ang, epsa;
+ int ui, vi, ustep;
+ for (i = NANGLES; i--; )
+ eps[i] = 2.;
+ for (vi = UV_NVS; vi--; ) {
+ va = UV_VSTART + (vi+.5)*UV_SQSIZ;
+ ustep = uv_row[vi].nus-1;
+ if (vi == UV_NVS-1 || vi == 0 || ustep <= 0)
+ ustep = 1;
+ for (ui = uv_row[vi].nus-1; ui >= 0; ui -= ustep) {
+ ua = uv_row[vi].ustart + (ui+.5)*UV_SQSIZ;
+ ang = uv2ang(ua, va);
+ i = (int) ang;
+ epsa = fabs(ang - (i+.5));
+ if (epsa < eps[i]) {
+ oog_table[i] = uv_row[vi].ncum + ui;
+ eps[i] = epsa;
+ }
+ }
+ }
+ for (i = NANGLES; i--; ) /* fill any holes */
+ if (eps[i] > 1.5) {
+ int i1, i2;
+ for (i1 = 1; i1 < NANGLES/2; i1++)
+ if (eps[(i+i1)%NANGLES] < 1.5)
+ break;
+ for (i2 = 1; i2 < NANGLES/2; i2++)
+ if (eps[(i+NANGLES-i2)%NANGLES] < 1.5)
+ break;
+ if (i1 < i2)
+ oog_table[i] =
+ oog_table[(i+i1)%NANGLES];
+ else
+ oog_table[i] =
+ oog_table[(i+NANGLES-i2)%NANGLES];
+ }
+ initialized = 1;
+ }
+ i = (int) uv2ang(u, v); /* look up hue angle */
+ return (oog_table[i]);
+}
+
+#undef uv2ang
+#undef NANGLES
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+int
+uv_encode(double u, double v, int em) /* encode (u',v') coordinates */
+{
+ register int vi, ui;
+
+ if (v < UV_VSTART)
+ return oog_encode(u, v);
+ vi = itrunc((v - UV_VSTART)*(1./UV_SQSIZ), em);
+ if (vi >= UV_NVS)
+ return oog_encode(u, v);
+ if (u < uv_row[vi].ustart)
+ return oog_encode(u, v);
+ ui = itrunc((u - uv_row[vi].ustart)*(1./UV_SQSIZ), em);
+ if (ui >= uv_row[vi].nus)
+ return oog_encode(u, v);
+
+ return (uv_row[vi].ncum + ui);
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+int
+uv_decode(double *up, double *vp, int c) /* decode (u',v') index */
+{
+ int upper, lower;
+ register int ui, vi;
+
+ if (c < 0 || c >= UV_NDIVS)
+ return (-1);
+ lower = 0; /* binary search */
+ upper = UV_NVS;
+ while (upper - lower > 1) {
+ vi = (lower + upper) >> 1;
+ ui = c - uv_row[vi].ncum;
+ if (ui > 0)
+ lower = vi;
+ else if (ui < 0)
+ upper = vi;
+ else {
+ lower = vi;
+ break;
+ }
+ }
+ vi = lower;
+ ui = c - uv_row[vi].ncum;
+ *up = uv_row[vi].ustart + (ui+.5)*UV_SQSIZ;
+ *vp = UV_VSTART + (vi+.5)*UV_SQSIZ;
+ return (0);
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+void
+LogLuv24toXYZ(uint32 p, float XYZ[3])
+{
+ int Ce;
+ double L, u, v, s, x, y;
+ /* decode luminance */
+ L = LogL10toY(p>>14 & 0x3ff);
+ if (L <= 0.) {
+ XYZ[0] = XYZ[1] = XYZ[2] = 0.;
+ return;
+ }
+ /* decode color */
+ Ce = p & 0x3fff;
+ if (uv_decode(&u, &v, Ce) < 0) {
+ u = U_NEU; v = V_NEU;
+ }
+ s = 1./(6.*u - 16.*v + 12.);
+ x = 9.*u * s;
+ y = 4.*v * s;
+ /* convert to XYZ */
+ XYZ[0] = (float)(x/y * L);
+ XYZ[1] = (float)L;
+ XYZ[2] = (float)((1.-x-y)/y * L);
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+uint32
+LogLuv24fromXYZ(float XYZ[3], int em)
+{
+ int Le, Ce;
+ double u, v, s;
+ /* encode luminance */
+ Le = LogL10fromY(XYZ[1], em);
+ /* encode color */
+ s = XYZ[0] + 15.*XYZ[1] + 3.*XYZ[2];
+ if (!Le || s <= 0.) {
+ u = U_NEU;
+ v = V_NEU;
+ } else {
+ u = 4.*XYZ[0] / s;
+ v = 9.*XYZ[1] / s;
+ }
+ Ce = uv_encode(u, v, em);
+ if (Ce < 0) /* never happens */
+ Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER);
+ /* combine encodings */
+ return (Le << 14 | Ce);
+}
+
+static void
+Luv24toXYZ(LogLuvState* sp, tidata_t op, int n)
+{
+ uint32* luv = (uint32*) sp->tbuf;
+ float* xyz = (float*) op;
+
+ while (n-- > 0) {
+ LogLuv24toXYZ(*luv, xyz);
+ xyz += 3;
+ luv++;
+ }
+}
+
+static void
+Luv24toLuv48(LogLuvState* sp, tidata_t op, int n)
+{
+ uint32* luv = (uint32*) sp->tbuf;
+ int16* luv3 = (int16*) op;
+
+ while (n-- > 0) {
+ double u, v;
+
+ *luv3++ = (int16)((*luv >> 12 & 0xffd) + 13314);
+ if (uv_decode(&u, &v, *luv&0x3fff) < 0) {
+ u = U_NEU;
+ v = V_NEU;
+ }
+ *luv3++ = (int16)(u * (1L<<15));
+ *luv3++ = (int16)(v * (1L<<15));
+ luv++;
+ }
+}
+
+static void
+Luv24toRGB(LogLuvState* sp, tidata_t op, int n)
+{
+ uint32* luv = (uint32*) sp->tbuf;
+ uint8* rgb = (uint8*) op;
+
+ while (n-- > 0) {
+ float xyz[3];
+
+ LogLuv24toXYZ(*luv++, xyz);
+ XYZtoRGB24(xyz, rgb);
+ rgb += 3;
+ }
+}
+
+static void
+Luv24fromXYZ(LogLuvState* sp, tidata_t op, int n)
+{
+ uint32* luv = (uint32*) sp->tbuf;
+ float* xyz = (float*) op;
+
+ while (n-- > 0) {
+ *luv++ = LogLuv24fromXYZ(xyz, sp->encode_meth);
+ xyz += 3;
+ }
+}
+
+static void
+Luv24fromLuv48(LogLuvState* sp, tidata_t op, int n)
+{
+ uint32* luv = (uint32*) sp->tbuf;
+ int16* luv3 = (int16*) op;
+
+ while (n-- > 0) {
+ int Le, Ce;
+
+ if (luv3[0] <= 0)
+ Le = 0;
+ else if (luv3[0] >= (1<<12)+3314)
+ Le = (1<<10) - 1;
+ else if (sp->encode_meth == SGILOGENCODE_NODITHER)
+ Le = (luv3[0]-3314) >> 2;
+ else
+ Le = itrunc(.25*(luv3[0]-3314.), sp->encode_meth);
+
+ Ce = uv_encode((luv3[1]+.5)/(1<<15), (luv3[2]+.5)/(1<<15),
+ sp->encode_meth);
+ if (Ce < 0) /* never happens */
+ Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER);
+ *luv++ = (uint32)Le << 14 | Ce;
+ luv3 += 3;
+ }
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+void
+LogLuv32toXYZ(uint32 p, float XYZ[3])
+{
+ double L, u, v, s, x, y;
+ /* decode luminance */
+ L = LogL16toY((int)p >> 16);
+ if (L <= 0.) {
+ XYZ[0] = XYZ[1] = XYZ[2] = 0.;
+ return;
+ }
+ /* decode color */
+ u = 1./UVSCALE * ((p>>8 & 0xff) + .5);
+ v = 1./UVSCALE * ((p & 0xff) + .5);
+ s = 1./(6.*u - 16.*v + 12.);
+ x = 9.*u * s;
+ y = 4.*v * s;
+ /* convert to XYZ */
+ XYZ[0] = (float)(x/y * L);
+ XYZ[1] = (float)L;
+ XYZ[2] = (float)((1.-x-y)/y * L);
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+uint32
+LogLuv32fromXYZ(float XYZ[3], int em)
+{
+ unsigned int Le, ue, ve;
+ double u, v, s;
+ /* encode luminance */
+ Le = (unsigned int)LogL16fromY(XYZ[1], em);
+ /* encode color */
+ s = XYZ[0] + 15.*XYZ[1] + 3.*XYZ[2];
+ if (!Le || s <= 0.) {
+ u = U_NEU;
+ v = V_NEU;
+ } else {
+ u = 4.*XYZ[0] / s;
+ v = 9.*XYZ[1] / s;
+ }
+ if (u <= 0.) ue = 0;
+ else ue = itrunc(UVSCALE*u, em);
+ if (ue > 255) ue = 255;
+ if (v <= 0.) ve = 0;
+ else ve = itrunc(UVSCALE*v, em);
+ if (ve > 255) ve = 255;
+ /* combine encodings */
+ return (Le << 16 | ue << 8 | ve);
+}
+
+static void
+Luv32toXYZ(LogLuvState* sp, tidata_t op, int n)
+{
+ uint32* luv = (uint32*) sp->tbuf;
+ float* xyz = (float*) op;
+
+ while (n-- > 0) {
+ LogLuv32toXYZ(*luv++, xyz);
+ xyz += 3;
+ }
+}
+
+static void
+Luv32toLuv48(LogLuvState* sp, tidata_t op, int n)
+{
+ uint32* luv = (uint32*) sp->tbuf;
+ int16* luv3 = (int16*) op;
+
+ while (n-- > 0) {
+ double u, v;
+
+ *luv3++ = (int16)(*luv >> 16);
+ u = 1./UVSCALE * ((*luv>>8 & 0xff) + .5);
+ v = 1./UVSCALE * ((*luv & 0xff) + .5);
+ *luv3++ = (int16)(u * (1L<<15));
+ *luv3++ = (int16)(v * (1L<<15));
+ luv++;
+ }
+}
+
+static void
+Luv32toRGB(LogLuvState* sp, tidata_t op, int n)
+{
+ uint32* luv = (uint32*) sp->tbuf;
+ uint8* rgb = (uint8*) op;
+
+ while (n-- > 0) {
+ float xyz[3];
+
+ LogLuv32toXYZ(*luv++, xyz);
+ XYZtoRGB24(xyz, rgb);
+ rgb += 3;
+ }
+}
+
+static void
+Luv32fromXYZ(LogLuvState* sp, tidata_t op, int n)
+{
+ uint32* luv = (uint32*) sp->tbuf;
+ float* xyz = (float*) op;
+
+ while (n-- > 0) {
+ *luv++ = LogLuv32fromXYZ(xyz, sp->encode_meth);
+ xyz += 3;
+ }
+}
+
+static void
+Luv32fromLuv48(LogLuvState* sp, tidata_t op, int n)
+{
+ uint32* luv = (uint32*) sp->tbuf;
+ int16* luv3 = (int16*) op;
+
+ if (sp->encode_meth == SGILOGENCODE_NODITHER) {
+ while (n-- > 0) {
+ *luv++ = (uint32)luv3[0] << 16 |
+ (luv3[1]*(uint32)(UVSCALE+.5) >> 7 & 0xff00) |
+ (luv3[2]*(uint32)(UVSCALE+.5) >> 15 & 0xff);
+ luv3 += 3;
+ }
+ return;
+ }
+ while (n-- > 0) {
+ *luv++ = (uint32)luv3[0] << 16 |
+ (itrunc(luv3[1]*(UVSCALE/(1<<15)), sp->encode_meth) << 8 & 0xff00) |
+ (itrunc(luv3[2]*(UVSCALE/(1<<15)), sp->encode_meth) & 0xff);
+ luv3 += 3;
+ }
+}
+
+static void
+_logLuvNop(LogLuvState* sp, tidata_t op, int n)
+{
+ (void) sp; (void) op; (void) n;
+}
+
+static int
+LogL16GuessDataFmt(TIFFDirectory *td)
+{
+#define PACK(s,b,f) (((b)<<6)|((s)<<3)|(f))
+ switch (PACK(td->td_samplesperpixel, td->td_bitspersample, td->td_sampleformat)) {
+ case PACK(1, 32, SAMPLEFORMAT_IEEEFP):
+ return (SGILOGDATAFMT_FLOAT);
+ case PACK(1, 16, SAMPLEFORMAT_VOID):
+ case PACK(1, 16, SAMPLEFORMAT_INT):
+ case PACK(1, 16, SAMPLEFORMAT_UINT):
+ return (SGILOGDATAFMT_16BIT);
+ case PACK(1, 8, SAMPLEFORMAT_VOID):
+ case PACK(1, 8, SAMPLEFORMAT_UINT):
+ return (SGILOGDATAFMT_8BIT);
+ }
+#undef PACK
+ return (SGILOGDATAFMT_UNKNOWN);
+}
+
+static int
+LogL16InitState(TIFF* tif)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ LogLuvState* sp = DecoderState(tif);
+ static const char module[] = "LogL16InitState";
+
+ assert(sp != NULL);
+ assert(td->td_photometric == PHOTOMETRIC_LOGL);
+
+ /* for some reason, we can't do this in TIFFInitLogL16 */
+ if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN)
+ sp->user_datafmt = LogL16GuessDataFmt(td);
+ switch (sp->user_datafmt) {
+ case SGILOGDATAFMT_FLOAT:
+ sp->pixel_size = sizeof (float);
+ break;
+ case SGILOGDATAFMT_16BIT:
+ sp->pixel_size = sizeof (int16);
+ break;
+ case SGILOGDATAFMT_8BIT:
+ sp->pixel_size = sizeof (uint8);
+ break;
+ default:
+ TIFFError(tif->tif_name,
+ "No support for converting user data format to LogL");
+ return (0);
+ }
+ sp->tbuflen = td->td_imagewidth * td->td_rowsperstrip;
+ sp->tbuf = (tidata_t*) _TIFFmalloc(sp->tbuflen * sizeof (int16));
+ if (sp->tbuf == NULL) {
+ TIFFError(module, "%s: No space for SGILog translation buffer",
+ tif->tif_name);
+ return (0);
+ }
+ return (1);
+}
+
+static int
+LogLuvGuessDataFmt(TIFFDirectory *td)
+{
+ int guess;
+
+ /*
+ * If the user didn't tell us their datafmt,
+ * take our best guess from the bitspersample.
+ */
+#define PACK(a,b) (((a)<<3)|(b))
+ switch (PACK(td->td_bitspersample, td->td_sampleformat)) {
+ case PACK(32, SAMPLEFORMAT_IEEEFP):
+ guess = SGILOGDATAFMT_FLOAT;
+ break;
+ case PACK(32, SAMPLEFORMAT_VOID):
+ case PACK(32, SAMPLEFORMAT_UINT):
+ case PACK(32, SAMPLEFORMAT_INT):
+ guess = SGILOGDATAFMT_RAW;
+ break;
+ case PACK(16, SAMPLEFORMAT_VOID):
+ case PACK(16, SAMPLEFORMAT_INT):
+ case PACK(16, SAMPLEFORMAT_UINT):
+ guess = SGILOGDATAFMT_16BIT;
+ break;
+ case PACK( 8, SAMPLEFORMAT_VOID):
+ case PACK( 8, SAMPLEFORMAT_UINT):
+ guess = SGILOGDATAFMT_8BIT;
+ break;
+ default:
+ guess = SGILOGDATAFMT_UNKNOWN;
+ break;
+#undef PACK
+ }
+ /*
+ * Double-check samples per pixel.
+ */
+ switch (td->td_samplesperpixel) {
+ case 1:
+ if (guess != SGILOGDATAFMT_RAW)
+ guess = SGILOGDATAFMT_UNKNOWN;
+ break;
+ case 3:
+ if (guess == SGILOGDATAFMT_RAW)
+ guess = SGILOGDATAFMT_UNKNOWN;
+ break;
+ default:
+ guess = SGILOGDATAFMT_UNKNOWN;
+ break;
+ }
+ return (guess);
+}
+
+static int
+LogLuvInitState(TIFF* tif)
+{
+ TIFFDirectory* td = &tif->tif_dir;
+ LogLuvState* sp = DecoderState(tif);
+ static const char module[] = "LogLuvInitState";
+
+ assert(sp != NULL);
+ assert(td->td_photometric == PHOTOMETRIC_LOGLUV);
+
+ /* for some reason, we can't do this in TIFFInitLogLuv */
+ if (td->td_planarconfig != PLANARCONFIG_CONTIG) {
+ TIFFError(module,
+ "SGILog compression cannot handle non-contiguous data");
+ return (0);
+ }
+ if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN)
+ sp->user_datafmt = LogLuvGuessDataFmt(td);
+ switch (sp->user_datafmt) {
+ case SGILOGDATAFMT_FLOAT:
+ sp->pixel_size = 3*sizeof (float);
+ break;
+ case SGILOGDATAFMT_16BIT:
+ sp->pixel_size = 3*sizeof (int16);
+ break;
+ case SGILOGDATAFMT_RAW:
+ sp->pixel_size = sizeof (uint32);
+ break;
+ case SGILOGDATAFMT_8BIT:
+ sp->pixel_size = 3*sizeof (uint8);
+ break;
+ default:
+ TIFFError(tif->tif_name,
+ "No support for converting user data format to LogLuv");
+ return (0);
+ }
+ sp->tbuflen = td->td_imagewidth * td->td_rowsperstrip;
+ sp->tbuf = (tidata_t*) _TIFFmalloc(sp->tbuflen * sizeof (uint32));
+ if (sp->tbuf == NULL) {
+ TIFFError(module, "%s: No space for SGILog translation buffer",
+ tif->tif_name);
+ return (0);
+ }
+ return (1);
+}
+
+static int
+LogLuvSetupDecode(TIFF* tif)
+{
+ LogLuvState* sp = DecoderState(tif);
+ TIFFDirectory* td = &tif->tif_dir;
+
+ tif->tif_postdecode = _TIFFNoPostDecode;
+ switch (td->td_photometric) {
+ case PHOTOMETRIC_LOGLUV:
+ if (!LogLuvInitState(tif))
+ break;
+ if (td->td_compression == COMPRESSION_SGILOG24) {
+ tif->tif_decoderow = LogLuvDecode24;
+ switch (sp->user_datafmt) {
+ case SGILOGDATAFMT_FLOAT:
+ sp->tfunc = Luv24toXYZ;
+ break;
+ case SGILOGDATAFMT_16BIT:
+ sp->tfunc = Luv24toLuv48;
+ break;
+ case SGILOGDATAFMT_8BIT:
+ sp->tfunc = Luv24toRGB;
+ break;
+ }
+ } else {
+ tif->tif_decoderow = LogLuvDecode32;
+ switch (sp->user_datafmt) {
+ case SGILOGDATAFMT_FLOAT:
+ sp->tfunc = Luv32toXYZ;
+ break;
+ case SGILOGDATAFMT_16BIT:
+ sp->tfunc = Luv32toLuv48;
+ break;
+ case SGILOGDATAFMT_8BIT:
+ sp->tfunc = Luv32toRGB;
+ break;
+ }
+ }
+ return (1);
+ case PHOTOMETRIC_LOGL:
+ if (!LogL16InitState(tif))
+ break;
+ tif->tif_decoderow = LogL16Decode;
+ switch (sp->user_datafmt) {
+ case SGILOGDATAFMT_FLOAT:
+ sp->tfunc = L16toY;
+ break;
+ case SGILOGDATAFMT_8BIT:
+ sp->tfunc = L16toGry;
+ break;
+ }
+ return (1);
+ default:
+ TIFFError(tif->tif_name,
+ "Inappropriate photometric interpretation %d for SGILog compression; %s",
+ td->td_photometric, "must be either LogLUV or LogL");
+ break;
+ }
+ return (0);
+}
+
+static int
+LogLuvSetupEncode(TIFF* tif)
+{
+ LogLuvState* sp = EncoderState(tif);
+ TIFFDirectory* td = &tif->tif_dir;
+
+ switch (td->td_photometric) {
+ case PHOTOMETRIC_LOGLUV:
+ if (!LogLuvInitState(tif))
+ break;
+ if (td->td_compression == COMPRESSION_SGILOG24) {
+ tif->tif_encoderow = LogLuvEncode24;
+ switch (sp->user_datafmt) {
+ case SGILOGDATAFMT_FLOAT:
+ sp->tfunc = Luv24fromXYZ;
+ break;
+ case SGILOGDATAFMT_16BIT:
+ sp->tfunc = Luv24fromLuv48;
+ break;
+ case SGILOGDATAFMT_RAW:
+ break;
+ default:
+ goto notsupported;
+ }
+ } else {
+ tif->tif_encoderow = LogLuvEncode32;
+ switch (sp->user_datafmt) {
+ case SGILOGDATAFMT_FLOAT:
+ sp->tfunc = Luv32fromXYZ;
+ break;
+ case SGILOGDATAFMT_16BIT:
+ sp->tfunc = Luv32fromLuv48;
+ break;
+ case SGILOGDATAFMT_RAW:
+ break;
+ default:
+ goto notsupported;
+ }
+ }
+ break;
+ case PHOTOMETRIC_LOGL:
+ if (!LogL16InitState(tif))
+ break;
+ tif->tif_encoderow = LogL16Encode;
+ switch (sp->user_datafmt) {
+ case SGILOGDATAFMT_FLOAT:
+ sp->tfunc = L16fromY;
+ break;
+ case SGILOGDATAFMT_16BIT:
+ break;
+ default:
+ goto notsupported;
+ }
+ break;
+ default:
+ TIFFError(tif->tif_name,
+ "Inappropriate photometric interpretation %d for SGILog compression; %s",
+ td->td_photometric, "must be either LogLUV or LogL");
+ break;
+ }
+ return (1);
+notsupported:
+ TIFFError(tif->tif_name,
+ "SGILog compression supported only for %s, or raw data",
+ td->td_photometric == PHOTOMETRIC_LOGL ? "Y, L" : "XYZ, Luv");
+ return (0);
+}
+
+static void
+LogLuvClose(TIFF* tif)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+
+ /*
+ * For consistency, we always want to write out the same
+ * bitspersample and sampleformat for our TIFF file,
+ * regardless of the data format being used by the application.
+ * Since this routine is called after tags have been set but
+ * before they have been recorded in the file, we reset them here.
+ */
+ td->td_samplesperpixel =
+ (td->td_photometric == PHOTOMETRIC_LOGL) ? 1 : 3;
+ td->td_bitspersample = 16;
+ td->td_sampleformat = SAMPLEFORMAT_INT;
+}
+
+static void
+LogLuvCleanup(TIFF* tif)
+{
+ LogLuvState* sp = (LogLuvState *)tif->tif_data;
+
+ if (sp) {
+ if (sp->tbuf)
+ _TIFFfree(sp->tbuf);
+ _TIFFfree(sp);
+ tif->tif_data = NULL;
+ }
+}
+
+static int
+LogLuvVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ LogLuvState* sp = DecoderState(tif);
+ int bps, fmt;
+
+ switch (tag) {
+ case TIFFTAG_SGILOGDATAFMT:
+ sp->user_datafmt = va_arg(ap, int);
+ /*
+ * Tweak the TIFF header so that the rest of libtiff knows what
+ * size of data will be passed between app and library, and
+ * assume that the app knows what it is doing and is not
+ * confused by these header manipulations...
+ */
+ switch (sp->user_datafmt) {
+ case SGILOGDATAFMT_FLOAT:
+ bps = 32, fmt = SAMPLEFORMAT_IEEEFP;
+ break;
+ case SGILOGDATAFMT_16BIT:
+ bps = 16, fmt = SAMPLEFORMAT_INT;
+ break;
+ case SGILOGDATAFMT_RAW:
+ bps = 32, fmt = SAMPLEFORMAT_UINT;
+ TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
+ break;
+ case SGILOGDATAFMT_8BIT:
+ bps = 8, fmt = SAMPLEFORMAT_UINT;
+ break;
+ default:
+ TIFFError(tif->tif_name,
+ "Unknown data format %d for LogLuv compression",
+ sp->user_datafmt);
+ return (0);
+ }
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps);
+ TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, fmt);
+ /*
+ * Must recalculate sizes should bits/sample change.
+ */
+ tif->tif_tilesize = TIFFTileSize(tif);
+ tif->tif_scanlinesize = TIFFScanlineSize(tif);
+ return (1);
+ case TIFFTAG_SGILOGENCODE:
+ sp->encode_meth = va_arg(ap, int);
+ if (sp->encode_meth != SGILOGENCODE_NODITHER &&
+ sp->encode_meth != SGILOGENCODE_RANDITHER) {
+ TIFFError(tif->tif_name,
+ "Unknown encoding %d for LogLuv compression",
+ sp->encode_meth);
+ return (0);
+ }
+ return (1);
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+}
+
+static int
+LogLuvVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ LogLuvState *sp = (LogLuvState *)tif->tif_data;
+
+ switch (tag) {
+ case TIFFTAG_SGILOGDATAFMT:
+ *va_arg(ap, int*) = sp->user_datafmt;
+ return (1);
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+}
+
+static const TIFFFieldInfo LogLuvFieldInfo[] = {
+ { TIFFTAG_SGILOGDATAFMT, 0, 0, TIFF_SHORT, FIELD_PSEUDO,
+ TRUE, FALSE, "SGILogDataFmt"},
+ { TIFFTAG_SGILOGENCODE, 0, 0, TIFF_SHORT, FIELD_PSEUDO,
+ TRUE, FALSE, "SGILogEncode"}
+};
+
+int
+TIFFInitSGILog(TIFF* tif, int scheme)
+{
+ static const char module[] = "TIFFInitSGILog";
+ LogLuvState* sp;
+
+ assert(scheme == COMPRESSION_SGILOG24 || scheme == COMPRESSION_SGILOG);
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (LogLuvState));
+ if (tif->tif_data == NULL)
+ goto bad;
+ sp = (LogLuvState*) tif->tif_data;
+ _TIFFmemset((tdata_t)sp, 0, sizeof (*sp));
+ sp->user_datafmt = SGILOGDATAFMT_UNKNOWN;
+ sp->encode_meth = (scheme == COMPRESSION_SGILOG24) ?
+ SGILOGENCODE_RANDITHER : SGILOGENCODE_NODITHER;
+ sp->tfunc = _logLuvNop;
+
+ /*
+ * Install codec methods.
+ * NB: tif_decoderow & tif_encoderow are filled
+ * in at setup time.
+ */
+ tif->tif_setupdecode = LogLuvSetupDecode;
+ tif->tif_decodestrip = LogLuvDecodeStrip;
+ tif->tif_decodetile = LogLuvDecodeTile;
+ tif->tif_setupencode = LogLuvSetupEncode;
+ tif->tif_encodestrip = LogLuvEncodeStrip;
+ tif->tif_encodetile = LogLuvEncodeTile;
+ tif->tif_close = LogLuvClose;
+ tif->tif_cleanup = LogLuvCleanup;
+
+ /* override SetField so we can handle our private pseudo-tag */
+ _TIFFMergeFieldInfo(tif, LogLuvFieldInfo, N(LogLuvFieldInfo));
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = LogLuvVGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = LogLuvVSetField; /* hook for codec tags */
+
+ return (1);
+bad:
+ TIFFError(module, "%s: No space for LogLuv state block", tif->tif_name);
+ return (0);
+}
+#endif /* LOGLUV_SUPPORT */
diff --git a/src/tiff/tif_lzw.c b/src/tiff/tif_lzw.c
new file mode 100644
index 0000000..9acea7a
--- /dev/null
+++ b/src/tiff/tif_lzw.c
@@ -0,0 +1,745 @@
+/* $Header: /home/terralib/src/tiff/tif_lzw.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef LZW_SUPPORT
+/*
+ * TIFF Library.
+ * Rev 5.0 Lempel-Ziv & Welch Compression Support
+ *
+ * This code is derived from the compress program whose code is
+ * derived from software contributed to Berkeley by James A. Woods,
+ * derived from original work by Spencer Thomas and Joseph Orost.
+ *
+ * The original Berkeley copyright notice appears below in its entirety.
+ */
+#include "tif_predict.h"
+
+#include <assert.h>
+#include <stdio.h>
+
+/*
+ * NB: The 5.0 spec describes a different algorithm than Aldus
+ * implements. Specifically, Aldus does code length transitions
+ * one code earlier than should be done (for real LZW).
+ * Earlier versions of this library implemented the correct
+ * LZW algorithm, but emitted codes in a bit order opposite
+ * to the TIFF spec. Thus, to maintain compatibility w/ Aldus
+ * we interpret MSB-LSB ordered codes to be images written w/
+ * old versions of this library, but otherwise adhere to the
+ * Aldus "off by one" algorithm.
+ *
+ * Future revisions to the TIFF spec are expected to "clarify this issue".
+ */
+#define LZW_COMPAT /* include backwards compatibility code */
+/*
+ * Each strip of data is supposed to be terminated by a CODE_EOI.
+ * If the following #define is included, the decoder will also
+ * check for end-of-strip w/o seeing this code. This makes the
+ * library more robust, but also slower.
+ */
+#define LZW_CHECKEOS /* include checks for strips w/o EOI code */
+
+#define MAXCODE(n) ((1L<<(n))-1)
+/*
+ * The TIFF spec specifies that encoded bit
+ * strings range from 9 to 12 bits.
+ */
+#define BITS_MIN 9 /* start with 9 bits */
+#define BITS_MAX 12 /* max of 12 bit strings */
+/* predefined codes */
+#define CODE_CLEAR 256 /* code to clear string table */
+#define CODE_EOI 257 /* end-of-information code */
+#define CODE_FIRST 258 /* first free code entry */
+#define CODE_MAX MAXCODE(BITS_MAX)
+#define HSIZE 9001L /* 91% occupancy */
+#define HSHIFT (13-8)
+#ifdef LZW_COMPAT
+/* NB: +1024 is for compatibility with old files */
+#define CSIZE (MAXCODE(BITS_MAX)+1024L)
+#else
+#define CSIZE (MAXCODE(BITS_MAX)+1L)
+#endif
+
+/*
+ * State block for each open TIFF file using LZW
+ * compression/decompression. Note that the predictor
+ * state block must be first in this data structure.
+ */
+typedef struct {
+ TIFFPredictorState predict; /* predictor super class */
+
+ u_short nbits; /* # of bits/code */
+ u_short maxcode; /* maximum code for lzw_nbits */
+ u_short free_ent; /* next free entry in hash table */
+ long nextdata; /* next bits of i/o */
+ long nextbits; /* # of valid bits in lzw_nextdata */
+} LZWBaseState;
+
+#define lzw_nbits base.nbits
+#define lzw_maxcode base.maxcode
+#define lzw_free_ent base.free_ent
+#define lzw_nextdata base.nextdata
+#define lzw_nextbits base.nextbits
+
+/*
+ * Encoding-specific state.
+ */
+typedef uint16 hcode_t; /* codes fit in 16 bits */
+
+/*
+ * Decoding-specific state.
+ */
+typedef struct code_ent {
+ struct code_ent *next;
+ u_short length; /* string len, including this token */
+ u_char value; /* data value */
+ u_char firstchar; /* first token of string */
+} code_t;
+
+typedef int (*decodeFunc)(TIFF*, tidata_t, tsize_t, tsample_t);
+
+typedef struct {
+ LZWBaseState base;
+
+ /* Decoding specific data */
+ long dec_nbitsmask; /* lzw_nbits 1 bits, right adjusted */
+ long dec_restart; /* restart count */
+#ifdef LZW_CHECKEOS
+ long dec_bitsleft; /* available bits in raw data */
+#endif
+ decodeFunc dec_decode; /* regular or backwards compatible */
+ code_t* dec_codep; /* current recognized code */
+ code_t* dec_oldcodep; /* previously recognized code */
+ code_t* dec_free_entp; /* next free entry */
+ code_t* dec_maxcodep; /* max available entry */
+ code_t* dec_codetab; /* kept separate for small machines */
+} LZWCodecState;
+
+#define LZWState(tif) ((LZWBaseState*) (tif)->tif_data)
+#define DecoderState(tif) ((LZWCodecState*) LZWState(tif))
+
+static int LZWDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+#ifdef LZW_COMPAT
+static int LZWDecodeCompat(TIFF*, tidata_t, tsize_t, tsample_t);
+#endif
+
+/*
+ * LZW Decoder.
+ */
+
+#ifdef LZW_CHECKEOS
+/*
+ * This check shouldn't be necessary because each
+ * strip is suppose to be terminated with CODE_EOI.
+ */
+#define NextCode(_tif, _sp, _bp, _code, _get) { \
+ if ((_sp)->dec_bitsleft < nbits) { \
+ TIFFWarning(_tif->tif_name, \
+ "LZWDecode: Strip %d not terminated with EOI code", \
+ _tif->tif_curstrip); \
+ _code = CODE_EOI; \
+ } else { \
+ _get(_sp,_bp,_code); \
+ (_sp)->dec_bitsleft -= nbits; \
+ } \
+}
+#else
+#define NextCode(tif, sp, bp, code, get) get(sp, bp, code)
+#endif
+
+static int
+LZWSetupDecode(TIFF* tif)
+{
+ LZWCodecState* sp = DecoderState(tif);
+ static const char module[] = "LZWSetupDecode";
+ int code;
+
+ assert(sp != NULL);
+
+ if (sp->dec_codetab == NULL) {
+ sp->dec_codetab = (code_t*)_TIFFmalloc(CSIZE*sizeof (code_t));
+ if (sp->dec_codetab == NULL) {
+ TIFFError(module, "No space for LZW code table");
+ return (0);
+ }
+ /*
+ * Pre-load the table.
+ */
+ code = 255;
+ do {
+ sp->dec_codetab[code].value = (u_char) code;
+ sp->dec_codetab[code].firstchar = (u_char) code;
+ sp->dec_codetab[code].length = 1;
+ sp->dec_codetab[code].next = NULL;
+ } while (code--);
+ }
+ return (1);
+}
+
+/*
+ * Setup state for decoding a strip.
+ */
+static int
+LZWPreDecode(TIFF* tif, tsample_t s)
+{
+ LZWCodecState *sp = DecoderState(tif);
+
+ (void) s;
+ assert(sp != NULL);
+ /*
+ * Check for old bit-reversed codes.
+ */
+ if (tif->tif_rawdata[0] == 0 && (tif->tif_rawdata[1] & 0x1)) {
+#ifdef LZW_COMPAT
+ if (!sp->dec_decode) {
+ TIFFWarning(tif->tif_name,
+ "Old-style LZW codes, convert file");
+ /*
+ * Override default decoding methods with
+ * ones that deal with the old coding.
+ * Otherwise the predictor versions set
+ * above will call the compatibility routines
+ * through the dec_decode method.
+ */
+ tif->tif_decoderow = LZWDecodeCompat;
+ tif->tif_decodestrip = LZWDecodeCompat;
+ tif->tif_decodetile = LZWDecodeCompat;
+ /*
+ * If doing horizontal differencing, must
+ * re-setup the predictor logic since we
+ * switched the basic decoder methods...
+ */
+ (*tif->tif_setupdecode)(tif);
+ sp->dec_decode = LZWDecodeCompat;
+ }
+ sp->lzw_maxcode = MAXCODE(BITS_MIN);
+#else /* !LZW_COMPAT */
+ if (!sp->dec_decode) {
+ TIFFError(tif->tif_name,
+ "Old-style LZW codes not supported");
+ sp->dec_decode = LZWDecode;
+ }
+ return (0);
+#endif/* !LZW_COMPAT */
+ } else {
+ sp->lzw_maxcode = MAXCODE(BITS_MIN)-1;
+ sp->dec_decode = LZWDecode;
+ }
+ sp->lzw_nbits = BITS_MIN;
+ sp->lzw_nextbits = 0;
+ sp->lzw_nextdata = 0;
+
+ sp->dec_restart = 0;
+ sp->dec_nbitsmask = MAXCODE(BITS_MIN);
+#ifdef LZW_CHECKEOS
+ sp->dec_bitsleft = tif->tif_rawcc << 3;
+#endif
+ sp->dec_free_entp = sp->dec_codetab + CODE_FIRST;
+ /*
+ * Zero entries that are not yet filled in. We do
+ * this to guard against bogus input data that causes
+ * us to index into undefined entries. If you can
+ * come up with a way to safely bounds-check input codes
+ * while decoding then you can remove this operation.
+ */
+ _TIFFmemset(sp->dec_free_entp, 0, (CSIZE-CODE_FIRST)*sizeof (code_t));
+ sp->dec_oldcodep = &sp->dec_codetab[-1];
+ sp->dec_maxcodep = &sp->dec_codetab[sp->dec_nbitsmask-1];
+ return (1);
+}
+
+/*
+ * Decode a "hunk of data".
+ */
+#define GetNextCode(sp, bp, code) { \
+ nextdata = (nextdata<<8) | *(bp)++; \
+ nextbits += 8; \
+ if (nextbits < nbits) { \
+ nextdata = (nextdata<<8) | *(bp)++; \
+ nextbits += 8; \
+ } \
+ code = (hcode_t)((nextdata >> (nextbits-nbits)) & nbitsmask); \
+ nextbits -= nbits; \
+}
+
+static void
+codeLoop(TIFF* tif)
+{
+ TIFFError(tif->tif_name,
+ "LZWDecode: Bogus encoding, loop in the code table; scanline %d",
+ tif->tif_row);
+}
+
+static int
+LZWDecode(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s)
+{
+ LZWCodecState *sp = DecoderState(tif);
+ char *op = (char*) op0;
+ long occ = (long) occ0;
+ char *tp;
+ u_char *bp;
+ hcode_t code;
+ int len;
+ long nbits, nextbits, nextdata, nbitsmask;
+ code_t *codep, *free_entp, *maxcodep, *oldcodep;
+
+ (void) s;
+ assert(sp != NULL);
+ /*
+ * Restart interrupted output operation.
+ */
+ if (sp->dec_restart) {
+ long residue;
+
+ codep = sp->dec_codep;
+ residue = codep->length - sp->dec_restart;
+ if (residue > occ) {
+ /*
+ * Residue from previous decode is sufficient
+ * to satisfy decode request. Skip to the
+ * start of the decoded string, place decoded
+ * values in the output buffer, and return.
+ */
+ sp->dec_restart += occ;
+ do {
+ codep = codep->next;
+ } while (--residue > occ && codep);
+ if (codep) {
+ tp = op + occ;
+ do {
+ *--tp = codep->value;
+ codep = codep->next;
+ } while (--occ && codep);
+ }
+ return (1);
+ }
+ /*
+ * Residue satisfies only part of the decode request.
+ */
+ op += residue, occ -= residue;
+ tp = op;
+ do {
+ int t;
+ --tp;
+ t = codep->value;
+ codep = codep->next;
+ *tp = (char) t;
+ } while (--residue && codep);
+ sp->dec_restart = 0;
+ }
+
+ bp = (u_char *)tif->tif_rawcp;
+ nbits = sp->lzw_nbits;
+ nextdata = sp->lzw_nextdata;
+ nextbits = sp->lzw_nextbits;
+ nbitsmask = sp->dec_nbitsmask;
+ oldcodep = sp->dec_oldcodep;
+ free_entp = sp->dec_free_entp;
+ maxcodep = sp->dec_maxcodep;
+
+ while (occ > 0) {
+ NextCode(tif, sp, bp, code, GetNextCode);
+ if (code == CODE_EOI)
+ break;
+ if (code == CODE_CLEAR) {
+ free_entp = sp->dec_codetab + CODE_FIRST;
+ nbits = BITS_MIN;
+ nbitsmask = MAXCODE(BITS_MIN);
+ maxcodep = sp->dec_codetab + nbitsmask-1;
+ NextCode(tif, sp, bp, code, GetNextCode);
+ if (code == CODE_EOI)
+ break;
+ *op++ = (char)code, occ--;
+ oldcodep = sp->dec_codetab + code;
+ continue;
+ }
+ codep = sp->dec_codetab + code;
+
+ /*
+ * Add the new entry to the code table.
+ */
+ if (free_entp < &sp->dec_codetab[0] ||
+ free_entp >= &sp->dec_codetab[CSIZE]) {
+ TIFFError(tif->tif_name,
+ "LZWDecode: Corrupted LZW table at scanline %d",
+ tif->tif_row);
+ return (0);
+ }
+
+ free_entp->next = oldcodep;
+ if (free_entp->next < &sp->dec_codetab[0] ||
+ free_entp->next >= &sp->dec_codetab[CSIZE]) {
+ TIFFError(tif->tif_name,
+ "LZWDecode: Corrupted LZW table at scanline %d",
+ tif->tif_row);
+ return (0);
+ }
+ free_entp->firstchar = free_entp->next->firstchar;
+ free_entp->length = free_entp->next->length+1;
+ free_entp->value = (codep < free_entp) ?
+ codep->firstchar : free_entp->firstchar;
+ if (++free_entp > maxcodep) {
+ if (++nbits > BITS_MAX) /* should not happen */
+ nbits = BITS_MAX;
+ nbitsmask = MAXCODE(nbits);
+ maxcodep = sp->dec_codetab + nbitsmask-1;
+ }
+ oldcodep = codep;
+ if (code >= 256) {
+ /*
+ * Code maps to a string, copy string
+ * value to output (written in reverse).
+ */
+ if(codep->length == 0) {
+ TIFFError(tif->tif_name,
+ "LZWDecode: Wrong length of decoded string: "
+ "data probably corrupted at scanline %d",
+ tif->tif_row);
+ return (0);
+ }
+ if (codep->length > occ) {
+ /*
+ * String is too long for decode buffer,
+ * locate portion that will fit, copy to
+ * the decode buffer, and setup restart
+ * logic for the next decoding call.
+ */
+ sp->dec_codep = codep;
+ do {
+ codep = codep->next;
+ } while (codep && codep->length > occ);
+ if (codep) {
+ sp->dec_restart = occ;
+ tp = op + occ;
+ do {
+ *--tp = codep->value;
+ codep = codep->next;
+ } while (--occ && codep);
+ if (codep)
+ codeLoop(tif);
+ }
+ break;
+ }
+ len = codep->length;
+ tp = op + len;
+ do {
+ int t;
+ --tp;
+ t = codep->value;
+ codep = codep->next;
+ *tp = (char) t;
+ } while (codep && tp > op);
+ if (codep) {
+ codeLoop(tif);
+ break;
+ }
+ op += len, occ -= len;
+ } else
+ *op++ = (char)code, occ--;
+ }
+
+ tif->tif_rawcp = (tidata_t) bp;
+ sp->lzw_nbits = (u_short) nbits;
+ sp->lzw_nextdata = nextdata;
+ sp->lzw_nextbits = nextbits;
+ sp->dec_nbitsmask = nbitsmask;
+ sp->dec_oldcodep = oldcodep;
+ sp->dec_free_entp = free_entp;
+ sp->dec_maxcodep = maxcodep;
+
+ if (occ > 0) {
+ TIFFError(tif->tif_name,
+ "LZWDecode: Not enough data at scanline %d (short %d bytes)",
+ tif->tif_row, occ);
+ return (0);
+ }
+ return (1);
+}
+
+#ifdef LZW_COMPAT
+/*
+ * Decode a "hunk of data" for old images.
+ */
+#define GetNextCodeCompat(sp, bp, code) { \
+ nextdata |= (u_long) *(bp)++ << nextbits; \
+ nextbits += 8; \
+ if (nextbits < nbits) { \
+ nextdata |= (u_long) *(bp)++ << nextbits; \
+ nextbits += 8; \
+ } \
+ code = (hcode_t)(nextdata & nbitsmask); \
+ nextdata >>= nbits; \
+ nextbits -= nbits; \
+}
+
+static int
+LZWDecodeCompat(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s)
+{
+ LZWCodecState *sp = DecoderState(tif);
+ char *op = (char*) op0;
+ long occ = (long) occ0;
+ char *tp;
+ u_char *bp;
+ int code, nbits;
+ long nextbits, nextdata, nbitsmask;
+ code_t *codep, *free_entp, *maxcodep, *oldcodep;
+
+ (void) s;
+ assert(sp != NULL);
+ /*
+ * Restart interrupted output operation.
+ */
+ if (sp->dec_restart) {
+ long residue;
+
+ codep = sp->dec_codep;
+ residue = codep->length - sp->dec_restart;
+ if (residue > occ) {
+ /*
+ * Residue from previous decode is sufficient
+ * to satisfy decode request. Skip to the
+ * start of the decoded string, place decoded
+ * values in the output buffer, and return.
+ */
+ sp->dec_restart += occ;
+ do {
+ codep = codep->next;
+ } while (--residue > occ);
+ tp = op + occ;
+ do {
+ *--tp = codep->value;
+ codep = codep->next;
+ } while (--occ);
+ return (1);
+ }
+ /*
+ * Residue satisfies only part of the decode request.
+ */
+ op += residue, occ -= residue;
+ tp = op;
+ do {
+ *--tp = codep->value;
+ codep = codep->next;
+ } while (--residue);
+ sp->dec_restart = 0;
+ }
+
+ bp = (u_char *)tif->tif_rawcp;
+ nbits = sp->lzw_nbits;
+ nextdata = sp->lzw_nextdata;
+ nextbits = sp->lzw_nextbits;
+ nbitsmask = sp->dec_nbitsmask;
+ oldcodep = sp->dec_oldcodep;
+ free_entp = sp->dec_free_entp;
+ maxcodep = sp->dec_maxcodep;
+
+ while (occ > 0) {
+ NextCode(tif, sp, bp, code, GetNextCodeCompat);
+ if (code == CODE_EOI)
+ break;
+ if (code == CODE_CLEAR) {
+ free_entp = sp->dec_codetab + CODE_FIRST;
+ nbits = BITS_MIN;
+ nbitsmask = MAXCODE(BITS_MIN);
+ maxcodep = sp->dec_codetab + nbitsmask;
+ NextCode(tif, sp, bp, code, GetNextCodeCompat);
+ if (code == CODE_EOI)
+ break;
+ *op++ = (char) code, occ--;
+ oldcodep = sp->dec_codetab + code;
+ continue;
+ }
+ codep = sp->dec_codetab + code;
+
+ /*
+ * Add the new entry to the code table.
+ */
+ if (free_entp < &sp->dec_codetab[0] ||
+ free_entp >= &sp->dec_codetab[CSIZE]) {
+ TIFFError(tif->tif_name,
+ "LZWDecodeCompat: Corrupted LZW table at scanline %d",
+ tif->tif_row);
+ return (0);
+ }
+
+ free_entp->next = oldcodep;
+ if (free_entp->next < &sp->dec_codetab[0] ||
+ free_entp->next >= &sp->dec_codetab[CSIZE]) {
+ TIFFError(tif->tif_name,
+ "LZWDecodeCompat: Corrupted LZW table at scanline %d",
+ tif->tif_row);
+ return (0);
+ }
+ free_entp->firstchar = free_entp->next->firstchar;
+ free_entp->length = free_entp->next->length+1;
+ free_entp->value = (codep < free_entp) ?
+ codep->firstchar : free_entp->firstchar;
+ if (++free_entp > maxcodep) {
+ if (++nbits > BITS_MAX) /* should not happen */
+ nbits = BITS_MAX;
+ nbitsmask = MAXCODE(nbits);
+ maxcodep = sp->dec_codetab + nbitsmask;
+ }
+ oldcodep = codep;
+ if (code >= 256) {
+ /*
+ * Code maps to a string, copy string
+ * value to output (written in reverse).
+ */
+ if(codep->length == 0) {
+ TIFFError(tif->tif_name,
+ "LZWDecodeCompat: Wrong length of decoded "
+ "string: data probably corrupted at scanline %d",
+ tif->tif_row);
+ return (0);
+ }
+ if (codep->length > occ) {
+ /*
+ * String is too long for decode buffer,
+ * locate portion that will fit, copy to
+ * the decode buffer, and setup restart
+ * logic for the next decoding call.
+ */
+ sp->dec_codep = codep;
+ do {
+ codep = codep->next;
+ } while (codep->length > occ);
+ sp->dec_restart = occ;
+ tp = op + occ;
+ do {
+ *--tp = codep->value;
+ codep = codep->next;
+ } while (--occ);
+ break;
+ }
+ op += codep->length, occ -= codep->length;
+ tp = op;
+ do {
+ *--tp = codep->value;
+ } while( (codep = codep->next) != NULL);
+ } else
+ *op++ = (char) code, occ--;
+ }
+
+ tif->tif_rawcp = (tidata_t) bp;
+ sp->lzw_nbits = (u_short) nbits;
+ sp->lzw_nextdata = nextdata;
+ sp->lzw_nextbits = nextbits;
+ sp->dec_nbitsmask = nbitsmask;
+ sp->dec_oldcodep = oldcodep;
+ sp->dec_free_entp = free_entp;
+ sp->dec_maxcodep = maxcodep;
+
+ if (occ > 0) {
+ TIFFError(tif->tif_name,
+ "LZWDecodeCompat: Not enough data at scanline %d (short %d bytes)",
+ tif->tif_row, occ);
+ return (0);
+ }
+ return (1);
+}
+#endif /* LZW_COMPAT */
+
+
+
+static void
+LZWCleanup(TIFF* tif)
+{
+ if (tif->tif_data) {
+ if (DecoderState(tif)->dec_codetab)
+ _TIFFfree(DecoderState(tif)->dec_codetab);
+ _TIFFfree(tif->tif_data);
+ tif->tif_data = NULL;
+ }
+}
+
+static int
+LZWSetupEncode(TIFF* tif)
+{
+ TIFFError(tif->tif_name,
+ "LZW compression is not available to due to Unisys patent enforcement");
+ return (0);
+}
+
+int
+TIFFInitLZW(TIFF* tif, int scheme)
+{
+ assert(scheme == COMPRESSION_LZW);
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (LZWCodecState));
+ if (tif->tif_data == NULL)
+ goto bad;
+ DecoderState(tif)->dec_codetab = NULL;
+ DecoderState(tif)->dec_decode = NULL;
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_setupencode = LZWSetupEncode;
+ tif->tif_setupdecode = LZWSetupDecode;
+ tif->tif_predecode = LZWPreDecode;
+ tif->tif_decoderow = LZWDecode;
+ tif->tif_decodestrip = LZWDecode;
+ tif->tif_decodetile = LZWDecode;
+ tif->tif_cleanup = LZWCleanup;
+
+ /*
+ * Setup predictor setup.
+ */
+ (void) TIFFPredictorInit(tif);
+
+ return (1);
+
+bad:
+ TIFFError("TIFFInitLZW", "No space for LZW state block");
+ return (0);
+}
+
+/*
+ * Copyright (c) 1985, 1986 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * James A. Woods, derived from original work by Spencer Thomas
+ * and Joseph Orost.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley. The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+#endif /* LZW_SUPPORT */
diff --git a/src/tiff/tif_machdep.c b/src/tiff/tif_machdep.c
new file mode 100644
index 0000000..d685faf
--- /dev/null
+++ b/src/tiff/tif_machdep.c
@@ -0,0 +1,186 @@
+#ifndef lint
+static char rcsid[] = "$Header: /home/terralib/src/tiff/tif_machdep.c,v 1.1 2002/07/30 19:57:54 juan Exp $";
+#endif
+
+/*
+ * Copyright (c) 1992 Sam Leffler
+ * Copyright (c) 1992 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library Machine Dependent Routines.
+ */
+#include "tiffiop.h"
+
+#ifdef tahoe
+typedef struct ieeedouble {
+ u_long sign : 1,
+ exp : 11,
+ mant : 20;
+ u_long mant2;
+} ieeedouble;
+typedef struct ieeefloat {
+ u_long sign : 1,
+ exp : 8,
+ mant : 23;
+} ieeefloat;
+
+typedef struct {
+ u_long sign : 1,
+ exp : 8,
+ mant : 23;
+ u_long mant2;
+} nativedouble;
+typedef struct {
+ u_long sign : 1,
+ exp : 8,
+ mant : 23;
+} nativefloat;
+/*
+ * Beware, over/under-flow in conversions will
+ * result in garbage values -- handling it would
+ * require a subroutine call or lots more code.
+ */
+#define NATIVE2IEEEFLOAT(fp) { \
+ if ((fp)->native.exp) \
+ (fp)->ieee.exp = (fp)->native.exp - 129 + 127; /* alter bias */\
+}
+#define IEEEFLOAT2NATIVE(fp) { \
+ if ((fp)->ieee.exp) \
+ (fp)->native.exp = (fp)->ieee.exp - 127 + 129; /* alter bias */\
+}
+#define IEEEDOUBLE2NATIVE(dp) { \
+ if ((dp)->native.exp = (dp)->ieee.exp) \
+ (dp)->native.exp += -1023 + 129; \
+ (dp)->native.mant = ((dp)->ieee.mant<<3)|((dp)->native.mant2>>29); \
+ (dp)->native.mant2 <<= 3; \
+}
+#endif /* tahoe */
+
+#ifdef vax
+typedef struct ieeedouble {
+ u_long mant : 20,
+ exp : 11,
+ sign : 1;
+ u_long mant2;
+} ieeedouble;
+typedef struct ieeefloat {
+ u_long mant : 23,
+ exp : 8,
+ sign : 1;
+} ieeefloat;
+
+typedef struct {
+ u_long mant1 : 7,
+ exp : 8,
+ sign : 1,
+ mant2 : 16;
+ u_long mant3;
+} nativedouble;
+typedef struct {
+ u_long mant1 : 7,
+ exp : 8,
+ sign : 1,
+ mant2 : 16;
+} nativefloat;
+/*
+ * Beware, these do not handle over/under-flow
+ * during conversion from ieee to native format.
+ */
+#define NATIVE2IEEEFLOAT(fp) { \
+ float_t t; \
+ if (t.ieee.exp = (fp)->native.exp) \
+ t.ieee.exp += -129 + 127; \
+ t.ieee.sign = (fp)->native.sign; \
+ t.ieee.mant = ((fp)->native.mant1<<16)|(fp)->native.mant2; \
+ *(fp) = t; \
+}
+#define IEEEFLOAT2NATIVE(fp) { \
+ float_t t; int v = (fp)->ieee.exp; \
+ if (v) v += -127 + 129; /* alter bias of exponent */\
+ t.native.exp = v; /* implicit truncation of exponent */\
+ t.native.sign = (fp)->ieee.sign; \
+ v = (fp)->ieee.mant; \
+ t.native.mant1 = v >> 16; \
+ t.native.mant2 = v;\
+ *(fp) = t; \
+}
+#define IEEEDOUBLE2NATIVE(dp) { \
+ double_t t; int v = (dp)->ieee.exp; \
+ if (v) v += -1023 + 1025; /* if can alter bias of exponent */\
+ t.native.exp = v; /* implicit truncation of exponent */\
+ v = (dp)->ieee.mant; \
+ t.native.sign = (dp)->ieee.sign; \
+ t.native.mant1 = v >> 16; \
+ t.native.mant2 = v;\
+ t.native.mant3 = (dp)->mant2; \
+ *(dp) = t; \
+}
+#endif /* vax */
+
+#if !HAVE_IEEEFP
+#if !defined(IEEEFLOAT2NATIVE) || !defined(NATIVE2IEEEFLOAT)
+"Help, you've configured the library to not have IEEE floating point,\
+but not defined how to convert between IEEE and native formats!"
+#endif
+
+/*
+ * These unions are used during floating point
+ * conversions. The above macros define the
+ * conversion operations.
+ */
+typedef union {
+ ieeedouble ieee;
+ nativedouble native;
+ char b[8];
+ double d;
+} double_t;
+
+typedef union {
+ ieeefloat ieee;
+ nativefloat native;
+ char b[4];
+ float f;
+} float_t;
+
+void
+TIFFCvtIEEEFloatToNative(TIFF* tif, u_int n, float* f)
+{
+ float_t *fp = (float_t *)f;
+
+ while (n-- > 0) {
+ IEEEFLOAT2NATIVE(fp);
+ fp++;
+ }
+}
+
+void
+TIFFCvtNativeToIEEEFloat(TIFF* tif, u_int n, float* f)
+{
+ float_t *fp = (float_t *)f;
+
+ while (n-- > 0) {
+ NATIVE2IEEEFLOAT(fp);
+ fp++;
+ }
+}
+#endif
diff --git a/src/tiff/tif_next.c b/src/tiff/tif_next.c
new file mode 100644
index 0000000..bb7eeab
--- /dev/null
+++ b/src/tiff/tif_next.c
@@ -0,0 +1,142 @@
+/* $Header: /home/terralib/src/tiff/tif_next.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef NEXT_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * NeXT 2-bit Grey Scale Compression Algorithm Support
+ */
+
+#define SETPIXEL(op, v) { \
+ switch (npixels++ & 3) { \
+ case 0: op[0] = (u_char) ((v) << 6); break; \
+ case 1: op[0] |= (v) << 4; break; \
+ case 2: op[0] |= (v) << 2; break; \
+ case 3: *op++ |= (v); break; \
+ } \
+}
+
+#define LITERALROW 0x00
+#define LITERALSPAN 0x40
+#define WHITE ((1<<2)-1)
+
+static int
+NeXTDecode(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
+{
+ register u_char *bp, *op;
+ register tsize_t cc;
+ register int n;
+ tidata_t row;
+ tsize_t scanline;
+
+ (void) s;
+ /*
+ * Each scanline is assumed to start off as all
+ * white (we assume a PhotometricInterpretation
+ * of ``min-is-black'').
+ */
+ for (op = buf, cc = occ; cc-- > 0;)
+ *op++ = 0xff;
+
+ bp = (u_char *)tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+ scanline = tif->tif_scanlinesize;
+ for (row = buf; (long)occ > 0; occ -= scanline, row += scanline) {
+ n = *bp++, cc--;
+ switch (n) {
+ case LITERALROW:
+ /*
+ * The entire scanline is given as literal values.
+ */
+ if (cc < scanline)
+ goto bad;
+ _TIFFmemcpy(row, bp, scanline);
+ bp += scanline;
+ cc -= scanline;
+ break;
+ case LITERALSPAN: {
+ int off;
+ /*
+ * The scanline has a literal span
+ * that begins at some offset.
+ */
+ off = (bp[0] * 256) + bp[1];
+ n = (bp[2] * 256) + bp[3];
+ if (cc < 4+n)
+ goto bad;
+ _TIFFmemcpy(row+off, bp+4, n);
+ bp += 4+n;
+ cc -= 4+n;
+ break;
+ }
+ default: {
+ register int npixels = 0, grey;
+ u_long imagewidth = tif->tif_dir.td_imagewidth;
+
+ /*
+ * The scanline is composed of a sequence
+ * of constant color ``runs''. We shift
+ * into ``run mode'' and interpret bytes
+ * as codes of the form <color><npixels>
+ * until we've filled the scanline.
+ */
+ op = row;
+ for (;;) {
+ grey = (n>>6) & 0x3;
+ n &= 0x3f;
+ while (n-- > 0)
+ SETPIXEL(op, grey);
+ if (npixels >= (int) imagewidth)
+ break;
+ if (cc == 0)
+ goto bad;
+ n = *bp++, cc--;
+ }
+ break;
+ }
+ }
+ }
+ tif->tif_rawcp = (tidata_t) bp;
+ tif->tif_rawcc = cc;
+ return (1);
+bad:
+ TIFFError(tif->tif_name, "NeXTDecode: Not enough data for scanline %ld",
+ (long) tif->tif_row);
+ return (0);
+}
+
+int
+TIFFInitNeXT(TIFF* tif, int scheme)
+{
+ (void) scheme;
+ tif->tif_decoderow = NeXTDecode;
+ tif->tif_decodestrip = NeXTDecode;
+ tif->tif_decodetile = NeXTDecode;
+ return (1);
+}
+#endif /* NEXT_SUPPORT */
diff --git a/src/tiff/tif_open.c b/src/tiff/tif_open.c
new file mode 100644
index 0000000..91ed9db
--- /dev/null
+++ b/src/tiff/tif_open.c
@@ -0,0 +1,495 @@
+/* $Header: /home/terralib/src/tiff/tif_open.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ */
+#include "tiffiop.h"
+
+void _TIFFSetDefaultCompressionState(TIFF* tif);
+
+static const long typemask[13] = {
+ (long)0L, /* TIFF_NOTYPE */
+ (long)0x000000ffL, /* TIFF_BYTE */
+ (long)0xffffffffL, /* TIFF_ASCII */
+ (long)0x0000ffffL, /* TIFF_SHORT */
+ (long)0xffffffffL, /* TIFF_LONG */
+ (long)0xffffffffL, /* TIFF_RATIONAL */
+ (long)0x000000ffL, /* TIFF_SBYTE */
+ (long)0x000000ffL, /* TIFF_UNDEFINED */
+ (long)0x0000ffffL, /* TIFF_SSHORT */
+ (long)0xffffffffL, /* TIFF_SLONG */
+ (long)0xffffffffL, /* TIFF_SRATIONAL */
+ (long)0xffffffffL, /* TIFF_FLOAT */
+ (long)0xffffffffL, /* TIFF_DOUBLE */
+};
+static const int bigTypeshift[13] = {
+ 0, /* TIFF_NOTYPE */
+ 24, /* TIFF_BYTE */
+ 0, /* TIFF_ASCII */
+ 16, /* TIFF_SHORT */
+ 0, /* TIFF_LONG */
+ 0, /* TIFF_RATIONAL */
+ 24, /* TIFF_SBYTE */
+ 24, /* TIFF_UNDEFINED */
+ 16, /* TIFF_SSHORT */
+ 0, /* TIFF_SLONG */
+ 0, /* TIFF_SRATIONAL */
+ 0, /* TIFF_FLOAT */
+ 0, /* TIFF_DOUBLE */
+};
+static const int litTypeshift[13] = {
+ 0, /* TIFF_NOTYPE */
+ 0, /* TIFF_BYTE */
+ 0, /* TIFF_ASCII */
+ 0, /* TIFF_SHORT */
+ 0, /* TIFF_LONG */
+ 0, /* TIFF_RATIONAL */
+ 0, /* TIFF_SBYTE */
+ 0, /* TIFF_UNDEFINED */
+ 0, /* TIFF_SSHORT */
+ 0, /* TIFF_SLONG */
+ 0, /* TIFF_SRATIONAL */
+ 0, /* TIFF_FLOAT */
+ 0, /* TIFF_DOUBLE */
+};
+
+/*
+ * Initialize the shift & mask tables, and the
+ * byte swapping state according to the file
+ * contents and the machine architecture.
+ */
+static void
+TIFFInitOrder(TIFF* tif, int magic, int bigendian)
+{
+ tif->tif_typemask = typemask;
+ if (magic == TIFF_BIGENDIAN) {
+ tif->tif_typeshift = bigTypeshift;
+ if (!bigendian)
+ tif->tif_flags |= TIFF_SWAB;
+ } else {
+ tif->tif_typeshift = litTypeshift;
+ if (bigendian)
+ tif->tif_flags |= TIFF_SWAB;
+ }
+}
+
+int
+_TIFFgetMode(const char* mode, const char* module)
+{
+ int m = -1;
+
+ switch (mode[0]) {
+ case 'r':
+ m = O_RDONLY;
+ if (mode[1] == '+')
+ m = O_RDWR;
+ break;
+ case 'w':
+ case 'a':
+ m = O_RDWR|O_CREAT;
+ if (mode[0] == 'w')
+ m |= O_TRUNC;
+ break;
+ default:
+ TIFFError(module, "\"%s\": Bad mode", mode);
+ break;
+ }
+ return (m);
+}
+
+TIFF*
+TIFFClientOpen(
+ const char* name, const char* mode,
+ thandle_t clientdata,
+ TIFFReadWriteProc readproc,
+ TIFFReadWriteProc writeproc,
+ TIFFSeekProc seekproc,
+ TIFFCloseProc closeproc,
+ TIFFSizeProc sizeproc,
+ TIFFMapFileProc mapproc,
+ TIFFUnmapFileProc unmapproc
+)
+{
+ static const char module[] = "TIFFClientOpen";
+ TIFF *tif;
+ int m, bigendian;
+ const char* cp;
+
+ m = _TIFFgetMode(mode, module);
+ if (m == -1)
+ goto bad2;
+ tif = (TIFF *)_TIFFmalloc(sizeof (TIFF) + strlen(name) + 1);
+ if (tif == NULL) {
+ TIFFError(module, "%s: Out of memory (TIFF structure)", name);
+ goto bad2;
+ }
+ _TIFFmemset(tif, 0, sizeof (*tif));
+ tif->tif_name = (char *)tif + sizeof (TIFF);
+ strcpy(tif->tif_name, name);
+ tif->tif_mode = m &~ (O_CREAT|O_TRUNC);
+ tif->tif_curdir = (tdir_t) -1; /* non-existent directory */
+ tif->tif_curoff = 0;
+ tif->tif_curstrip = (tstrip_t) -1; /* invalid strip */
+ tif->tif_row = (uint32) -1; /* read/write pre-increment */
+ tif->tif_clientdata = clientdata;
+ if (!readproc || !writeproc || !seekproc || !closeproc
+ || !sizeproc || !mapproc || !unmapproc) {
+ TIFFError(module, "One of the client procedures are NULL pointer");
+ goto bad3;
+ }
+ tif->tif_readproc = readproc;
+ tif->tif_writeproc = writeproc;
+ tif->tif_seekproc = seekproc;
+ tif->tif_closeproc = closeproc;
+ tif->tif_sizeproc = sizeproc;
+ tif->tif_mapproc = mapproc;
+ tif->tif_unmapproc = unmapproc;
+ _TIFFSetDefaultCompressionState(tif); /* setup default state */
+ /*
+ * Default is to return data MSB2LSB and enable the
+ * use of memory-mapped files and strip chopping when
+ * a file is opened read-only.
+ */
+ tif->tif_flags = FILLORDER_MSB2LSB;
+ if (m == O_RDONLY )
+ tif->tif_flags |= TIFF_MAPPED;
+
+#ifdef STRIPCHOP_DEFAULT
+ if (m == O_RDONLY || m == O_RDWR)
+ tif->tif_flags |= STRIPCHOP_DEFAULT;
+#endif
+
+ { union { int32 i; char c[4]; } u; u.i = 1; bigendian = u.c[0] == 0; }
+ /*
+ * Process library-specific flags in the open mode string.
+ * The following flags may be used to control intrinsic library
+ * behaviour that may or may not be desirable (usually for
+ * compatibility with some application that claims to support
+ * TIFF but only supports some braindead idea of what the
+ * vendor thinks TIFF is):
+ *
+ * 'l' use little-endian byte order for creating a file
+ * 'b' use big-endian byte order for creating a file
+ * 'L' read/write information using LSB2MSB bit order
+ * 'B' read/write information using MSB2LSB bit order
+ * 'H' read/write information using host bit order
+ * 'M' enable use of memory-mapped files when supported
+ * 'm' disable use of memory-mapped files
+ * 'C' enable strip chopping support when reading
+ * 'c' disable strip chopping support
+ *
+ * The use of the 'l' and 'b' flags is strongly discouraged.
+ * These flags are provided solely because numerous vendors,
+ * typically on the PC, do not correctly support TIFF; they
+ * only support the Intel little-endian byte order. This
+ * support is not configured by default because it supports
+ * the violation of the TIFF spec that says that readers *MUST*
+ * support both byte orders. It is strongly recommended that
+ * you not use this feature except to deal with busted apps
+ * that write invalid TIFF. And even in those cases you should
+ * bang on the vendors to fix their software.
+ *
+ * The 'L', 'B', and 'H' flags are intended for applications
+ * that can optimize operations on data by using a particular
+ * bit order. By default the library returns data in MSB2LSB
+ * bit order for compatibiltiy with older versions of this
+ * library. Returning data in the bit order of the native cpu
+ * makes the most sense but also requires applications to check
+ * the value of the FillOrder tag; something they probabyl do
+ * not do right now.
+ *
+ * The 'M' and 'm' flags are provided because some virtual memory
+ * systems exhibit poor behaviour when large images are mapped.
+ * These options permit clients to control the use of memory-mapped
+ * files on a per-file basis.
+ *
+ * The 'C' and 'c' flags are provided because the library support
+ * for chopping up large strips into multiple smaller strips is not
+ * application-transparent and as such can cause problems. The 'c'
+ * option permits applications that only want to look at the tags,
+ * for example, to get the unadulterated TIFF tag information.
+ */
+ for (cp = mode; *cp; cp++)
+ switch (*cp) {
+ case 'b':
+ if ((m&O_CREAT) && !bigendian)
+ tif->tif_flags |= TIFF_SWAB;
+ break;
+ case 'l':
+ if ((m&O_CREAT) && bigendian)
+ tif->tif_flags |= TIFF_SWAB;
+ break;
+ case 'B':
+ tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
+ FILLORDER_MSB2LSB;
+ break;
+ case 'L':
+ tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
+ FILLORDER_LSB2MSB;
+ break;
+ case 'H':
+ tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
+ HOST_FILLORDER;
+ break;
+ case 'M':
+ if (m == O_RDONLY)
+ tif->tif_flags |= TIFF_MAPPED;
+ break;
+ case 'm':
+ if (m == O_RDONLY)
+ tif->tif_flags &= ~TIFF_MAPPED;
+ break;
+ case 'C':
+ if (m == O_RDONLY)
+ tif->tif_flags |= TIFF_STRIPCHOP;
+ break;
+ case 'c':
+ if (m == O_RDONLY)
+ tif->tif_flags &= ~TIFF_STRIPCHOP;
+ break;
+ }
+ /*
+ * Read in TIFF header.
+ */
+ if (!ReadOK(tif, &tif->tif_header, sizeof (TIFFHeader))) {
+ if (tif->tif_mode == O_RDONLY) {
+ TIFFError(name, "Cannot read TIFF header");
+ goto bad;
+ }
+ /*
+ * Setup header and write.
+ */
+ tif->tif_header.tiff_magic = tif->tif_flags & TIFF_SWAB
+ ? (bigendian ? TIFF_LITTLEENDIAN : TIFF_BIGENDIAN)
+ : (bigendian ? TIFF_BIGENDIAN : TIFF_LITTLEENDIAN);
+ tif->tif_header.tiff_version = TIFF_VERSION;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&tif->tif_header.tiff_version);
+ tif->tif_header.tiff_diroff = 0; /* filled in later */
+
+ /*
+ * This seek shouldn't be necessary, but I have had some
+ * crazy problems with a failed fseek() on Solaris leaving
+ * the current file pointer out of whack when an fwrite()
+ * is done.
+ */
+ TIFFSeekFile( tif, 0, SEEK_SET );
+
+ if (!WriteOK(tif, &tif->tif_header, sizeof (TIFFHeader))) {
+ TIFFError(name, "Error writing TIFF header");
+ goto bad;
+ }
+ /*
+ * Setup the byte order handling.
+ */
+ TIFFInitOrder(tif, tif->tif_header.tiff_magic, bigendian);
+ /*
+ * Setup default directory.
+ */
+ if (!TIFFDefaultDirectory(tif))
+ goto bad;
+ tif->tif_diroff = 0;
+ tif->tif_dirlist = NULL;
+ tif->tif_dirnumber = 0;
+ return (tif);
+ }
+ /*
+ * Setup the byte order handling.
+ */
+ if (tif->tif_header.tiff_magic != TIFF_BIGENDIAN &&
+ tif->tif_header.tiff_magic != TIFF_LITTLEENDIAN) {
+ TIFFError(name, "Not a TIFF file, bad magic number %d (0x%x)",
+ tif->tif_header.tiff_magic,
+ tif->tif_header.tiff_magic);
+ goto bad;
+ }
+ TIFFInitOrder(tif, tif->tif_header.tiff_magic, bigendian);
+ /*
+ * Swap header if required.
+ */
+ if (tif->tif_flags & TIFF_SWAB) {
+ TIFFSwabShort(&tif->tif_header.tiff_version);
+ TIFFSwabLong(&tif->tif_header.tiff_diroff);
+ }
+ /*
+ * Now check version (if needed, it's been byte-swapped).
+ * Note that this isn't actually a version number, it's a
+ * magic number that doesn't change (stupid).
+ */
+ if (tif->tif_header.tiff_version != TIFF_VERSION) {
+ TIFFError(name,
+ "Not a TIFF file, bad version number %d (0x%x)",
+ tif->tif_header.tiff_version,
+ tif->tif_header.tiff_version);
+ goto bad;
+ }
+ tif->tif_flags |= TIFF_MYBUFFER;
+ tif->tif_rawcp = tif->tif_rawdata = 0;
+ tif->tif_rawdatasize = 0;
+ /*
+ * Setup initial directory.
+ */
+ switch (mode[0]) {
+ case 'r':
+ tif->tif_nextdiroff = tif->tif_header.tiff_diroff;
+ /*
+ * Try to use a memory-mapped file if the client
+ * has not explicitly suppressed usage with the
+ * 'm' flag in the open mode (see above).
+ */
+ if ((tif->tif_flags & TIFF_MAPPED) &&
+ !TIFFMapFileContents(tif, (tdata_t*) &tif->tif_base, &tif->tif_size))
+ tif->tif_flags &= ~TIFF_MAPPED;
+ if (TIFFReadDirectory(tif)) {
+ tif->tif_rawcc = -1;
+ tif->tif_flags |= TIFF_BUFFERSETUP;
+ return (tif);
+ }
+ break;
+ case 'a':
+ /*
+ * New directories are automatically append
+ * to the end of the directory chain when they
+ * are written out (see TIFFWriteDirectory).
+ */
+ if (!TIFFDefaultDirectory(tif))
+ goto bad;
+ return (tif);
+ }
+bad:
+ tif->tif_mode = O_RDONLY; /* XXX avoid flush */
+ TIFFClose(tif);
+ return ((TIFF*)0);
+bad2:
+ (void) (*closeproc)(clientdata);
+bad3:
+ return ((TIFF*)0);
+}
+
+/*
+ * Query functions to access private data.
+ */
+
+/*
+ * Return open file's name.
+ */
+const char *
+TIFFFileName(TIFF* tif)
+{
+ return (tif->tif_name);
+}
+
+/*
+ * Return open file's I/O descriptor.
+ */
+int
+TIFFFileno(TIFF* tif)
+{
+ return (tif->tif_fd);
+}
+
+/*
+ * Return read/write mode.
+ */
+int
+TIFFGetMode(TIFF* tif)
+{
+ return (tif->tif_mode);
+}
+
+/*
+ * Return nonzero if file is organized in
+ * tiles; zero if organized as strips.
+ */
+int
+TIFFIsTiled(TIFF* tif)
+{
+ return (isTiled(tif));
+}
+
+/*
+ * Return current row being read/written.
+ */
+uint32
+TIFFCurrentRow(TIFF* tif)
+{
+ return (tif->tif_row);
+}
+
+/*
+ * Return index of the current directory.
+ */
+tdir_t
+TIFFCurrentDirectory(TIFF* tif)
+{
+ return (tif->tif_curdir);
+}
+
+/*
+ * Return current strip.
+ */
+tstrip_t
+TIFFCurrentStrip(TIFF* tif)
+{
+ return (tif->tif_curstrip);
+}
+
+/*
+ * Return current tile.
+ */
+ttile_t
+TIFFCurrentTile(TIFF* tif)
+{
+ return (tif->tif_curtile);
+}
+
+/*
+ * Return nonzero if the file has byte-swapped data.
+ */
+int
+TIFFIsByteSwapped(TIFF* tif)
+{
+ return ((tif->tif_flags & TIFF_SWAB) != 0);
+}
+
+/*
+ * Return nonzero if the data is returned up-sampled.
+ */
+int
+TIFFIsUpSampled(TIFF* tif)
+{
+ return (isUpSampled(tif));
+}
+
+/*
+ * Return nonzero if the data is returned in MSB-to-LSB bit order.
+ */
+int
+TIFFIsMSB2LSB(TIFF* tif)
+{
+ return (isFillOrder(tif, FILLORDER_MSB2LSB));
+}
diff --git a/src/tiff/tif_packbits.c b/src/tiff/tif_packbits.c
new file mode 100644
index 0000000..fbba87e
--- /dev/null
+++ b/src/tiff/tif_packbits.c
@@ -0,0 +1,300 @@
+/* $Header: /home/terralib/src/tiff/tif_packbits.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef PACKBITS_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * PackBits Compression Algorithm Support
+ */
+#include <assert.h>
+#include <stdio.h>
+
+static int
+PackBitsPreEncode(TIFF* tif, tsample_t s)
+{
+ (void) s;
+ /*
+ * Calculate the scanline/tile-width size in bytes.
+ */
+ if (isTiled(tif))
+ tif->tif_data = (tidata_t) TIFFTileRowSize(tif);
+ else
+ tif->tif_data = (tidata_t) TIFFScanlineSize(tif);
+ return (1);
+}
+
+/*
+ * NB: tidata is the type representing *(tidata_t);
+ * if tidata_t is made signed then this type must
+ * be adjusted accordingly.
+ */
+typedef unsigned char tidata;
+
+/*
+ * Encode a run of pixels.
+ */
+static int
+PackBitsEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
+{
+ u_char* bp = (u_char*) buf;
+ tidata_t op, ep, lastliteral;
+ long n, slop;
+ int b;
+ enum { BASE, LITERAL, RUN, LITERAL_RUN } state;
+
+ (void) s;
+ op = tif->tif_rawcp;
+ ep = tif->tif_rawdata + tif->tif_rawdatasize;
+ state = BASE;
+ lastliteral = 0;
+ while (cc > 0) {
+ /*
+ * Find the longest string of identical bytes.
+ */
+ b = *bp++, cc--, n = 1;
+ for (; cc > 0 && b == *bp; cc--, bp++)
+ n++;
+ again:
+ if (op + 2 >= ep) { /* insure space for new data */
+ /*
+ * Be careful about writing the last
+ * literal. Must write up to that point
+ * and then copy the remainder to the
+ * front of the buffer.
+ */
+ if (state == LITERAL || state == LITERAL_RUN) {
+ slop = op - lastliteral;
+ tif->tif_rawcc += lastliteral - tif->tif_rawcp;
+ if (!TIFFFlushData1(tif))
+ return (-1);
+ op = tif->tif_rawcp;
+ while (slop-- > 0)
+ *op++ = *lastliteral++;
+ lastliteral = tif->tif_rawcp;
+ } else {
+ tif->tif_rawcc += op - tif->tif_rawcp;
+ if (!TIFFFlushData1(tif))
+ return (-1);
+ op = tif->tif_rawcp;
+ }
+ }
+ switch (state) {
+ case BASE: /* initial state, set run/literal */
+ if (n > 1) {
+ state = RUN;
+ if (n > 128) {
+ *op++ = (tidata) -127;
+ *op++ = (tidataval_t) b;
+ n -= 128;
+ goto again;
+ }
+ *op++ = (tidataval_t)(-(n-1));
+ *op++ = (tidataval_t) b;
+ } else {
+ lastliteral = op;
+ *op++ = 0;
+ *op++ = (tidataval_t) b;
+ state = LITERAL;
+ }
+ break;
+ case LITERAL: /* last object was literal string */
+ if (n > 1) {
+ state = LITERAL_RUN;
+ if (n > 128) {
+ *op++ = (tidata) -127;
+ *op++ = (tidataval_t) b;
+ n -= 128;
+ goto again;
+ }
+ *op++ = (tidataval_t)(-(n-1)); /* encode run */
+ *op++ = (tidataval_t) b;
+ } else { /* extend literal */
+ if (++(*lastliteral) == 127)
+ state = BASE;
+ *op++ = (tidataval_t) b;
+ }
+ break;
+ case RUN: /* last object was run */
+ if (n > 1) {
+ if (n > 128) {
+ *op++ = (tidata) -127;
+ *op++ = (tidataval_t) b;
+ n -= 128;
+ goto again;
+ }
+ *op++ = (tidataval_t)(-(n-1));
+ *op++ = (tidataval_t) b;
+ } else {
+ lastliteral = op;
+ *op++ = 0;
+ *op++ = (tidataval_t) b;
+ state = LITERAL;
+ }
+ break;
+ case LITERAL_RUN: /* literal followed by a run */
+ /*
+ * Check to see if previous run should
+ * be converted to a literal, in which
+ * case we convert literal-run-literal
+ * to a single literal.
+ */
+ if (n == 1 && op[-2] == (tidata) -1 &&
+ *lastliteral < 126) {
+ state = (((*lastliteral) += 2) == 127 ?
+ BASE : LITERAL);
+ op[-2] = op[-1]; /* replicate */
+ } else
+ state = RUN;
+ goto again;
+ }
+ }
+ tif->tif_rawcc += op - tif->tif_rawcp;
+ tif->tif_rawcp = op;
+ return (1);
+}
+
+/*
+ * Encode a rectangular chunk of pixels. We break it up
+ * into row-sized pieces to insure that encoded runs do
+ * not span rows. Otherwise, there can be problems with
+ * the decoder if data is read, for example, by scanlines
+ * when it was encoded by strips.
+ */
+static int
+PackBitsEncodeChunk(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+#if defined(__hpux) && defined(__LP64__)
+ tsize_t rowsize = (tsize_t)(unsigned long) tif->tif_data;
+#else
+ tsize_t rowsize = (tsize_t) tif->tif_data;
+#endif
+
+ assert(rowsize > 0);
+
+#ifdef YCBCR_SUPPORT
+ /*
+ * YCBCR data isn't really separable into rows, so we
+ * might as well encode the whole tile/strip as one chunk.
+ */
+ if( tif->tif_dir.td_photometric == PHOTOMETRIC_YCBCR ) {
+#if defined(__hpux) && defined(__LP64__)
+ rowsize = (tsize_t)(unsigned long) tif->tif_data;
+#else
+ rowsize = (tsize_t) tif->tif_data;
+#endif
+ }
+#endif
+
+ while ((long)cc > 0) {
+ int chunk = rowsize;
+
+ if( cc < chunk )
+ chunk = cc;
+
+ if (PackBitsEncode(tif, bp, chunk, s) < 0)
+ return (-1);
+ bp += chunk;
+ cc -= chunk;
+ }
+ return (1);
+}
+
+static int
+PackBitsDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
+{
+ char *bp;
+ tsize_t cc;
+ long n;
+ int b;
+
+ (void) s;
+ bp = (char*) tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+ while (cc > 0 && (long)occ > 0) {
+ n = (long) *bp++, cc--;
+ /*
+ * Watch out for compilers that
+ * don't sign extend chars...
+ */
+ if (n >= 128)
+ n -= 256;
+ if (n < 0) { /* replicate next byte -n+1 times */
+ if (n == -128) /* nop */
+ continue;
+ n = -n + 1;
+ if( occ < n )
+ {
+ TIFFWarning(tif->tif_name,
+ "PackBitsDecode: discarding %d bytes "
+ "to avoid buffer overrun",
+ n - occ);
+ n = occ;
+ }
+ occ -= n;
+ b = *bp++, cc--;
+ while (n-- > 0)
+ *op++ = (tidataval_t) b;
+ } else { /* copy next n+1 bytes literally */
+ if (occ < n + 1)
+ {
+ TIFFWarning(tif->tif_name,
+ "PackBitsDecode: discarding %d bytes "
+ "to avoid buffer overrun",
+ n - occ + 1);
+ n = occ - 1;
+ }
+ _TIFFmemcpy(op, bp, ++n);
+ op += n; occ -= n;
+ bp += n; cc -= n;
+ }
+ }
+ tif->tif_rawcp = (tidata_t) bp;
+ tif->tif_rawcc = cc;
+ if (occ > 0) {
+ TIFFError(tif->tif_name,
+ "PackBitsDecode: Not enough data for scanline %ld",
+ (long) tif->tif_row);
+ return (0);
+ }
+ return (1);
+}
+
+int
+TIFFInitPackBits(TIFF* tif, int scheme)
+{
+ (void) scheme;
+ tif->tif_decoderow = PackBitsDecode;
+ tif->tif_decodestrip = PackBitsDecode;
+ tif->tif_decodetile = PackBitsDecode;
+ tif->tif_preencode = PackBitsPreEncode;
+ tif->tif_encoderow = PackBitsEncode;
+ tif->tif_encodestrip = PackBitsEncodeChunk;
+ tif->tif_encodetile = PackBitsEncodeChunk;
+ return (1);
+}
+#endif /* PACKBITS_SUPPORT */
diff --git a/src/tiff/tif_pixarlog.c b/src/tiff/tif_pixarlog.c
new file mode 100644
index 0000000..f1664bc
--- /dev/null
+++ b/src/tiff/tif_pixarlog.c
@@ -0,0 +1,1305 @@
+/*
+ * Copyright (c) 1996-1997 Sam Leffler
+ * Copyright (c) 1996 Pixar
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Pixar, Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Pixar, Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL PIXAR, SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef PIXARLOG_SUPPORT
+
+/*
+ * TIFF Library.
+ * PixarLog Compression Support
+ *
+ * Contributed by Dan McCoy.
+ *
+ * PixarLog film support uses the TIFF library to store companded
+ * 11 bit values into a tiff file, which are compressed using the
+ * zip compressor.
+ *
+ * The codec can take as input and produce as output 32-bit IEEE float values
+ * as well as 16-bit or 8-bit unsigned integer values.
+ *
+ * On writing any of the above are converted into the internal
+ * 11-bit log format. In the case of 8 and 16 bit values, the
+ * input is assumed to be unsigned linear color values that represent
+ * the range 0-1. In the case of IEEE values, the 0-1 range is assumed to
+ * be the normal linear color range, in addition over 1 values are
+ * accepted up to a value of about 25.0 to encode "hot" hightlights and such.
+ * The encoding is lossless for 8-bit values, slightly lossy for the
+ * other bit depths. The actual color precision should be better
+ * than the human eye can perceive with extra room to allow for
+ * error introduced by further image computation. As with any quantized
+ * color format, it is possible to perform image calculations which
+ * expose the quantization error. This format should certainly be less
+ * susceptable to such errors than standard 8-bit encodings, but more
+ * susceptable than straight 16-bit or 32-bit encodings.
+ *
+ * On reading the internal format is converted to the desired output format.
+ * The program can request which format it desires by setting the internal
+ * pseudo tag TIFFTAG_PIXARLOGDATAFMT to one of these possible values:
+ * PIXARLOGDATAFMT_FLOAT = provide IEEE float values.
+ * PIXARLOGDATAFMT_16BIT = provide unsigned 16-bit integer values
+ * PIXARLOGDATAFMT_8BIT = provide unsigned 8-bit integer values
+ *
+ * alternately PIXARLOGDATAFMT_8BITABGR provides unsigned 8-bit integer
+ * values with the difference that if there are exactly three or four channels
+ * (rgb or rgba) it swaps the channel order (bgr or abgr).
+ *
+ * PIXARLOGDATAFMT_11BITLOG provides the internal encoding directly
+ * packed in 16-bit values. However no tools are supplied for interpreting
+ * these values.
+ *
+ * "hot" (over 1.0) areas written in floating point get clamped to
+ * 1.0 in the integer data types.
+ *
+ * When the file is closed after writing, the bit depth and sample format
+ * are set always to appear as if 8-bit data has been written into it.
+ * That way a naive program unaware of the particulars of the encoding
+ * gets the format it is most likely able to handle.
+ *
+ * The codec does it's own horizontal differencing step on the coded
+ * values so the libraries predictor stuff should be turned off.
+ * The codec also handle byte swapping the encoded values as necessary
+ * since the library does not have the information necessary
+ * to know the bit depth of the raw unencoded buffer.
+ *
+ */
+
+#include "tif_predict.h"
+#include "zlib.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <math.h>
+
+/* Tables for converting to/from 11 bit coded values */
+
+#define TSIZE 2048 /* decode table size (11-bit tokens) */
+#define TSIZEP1 2049 /* Plus one for slop */
+#define ONE 1250 /* token value of 1.0 exactly */
+#define RATIO 1.004 /* nominal ratio for log part */
+
+#define CODE_MASK 0x7ff /* 11 bits. */
+
+static float Fltsize;
+static float LogK1, LogK2;
+
+#define REPEAT(n, op) { int i; i=n; do { i--; op; } while (i>0); }
+
+static void
+horizontalAccumulateF(uint16 *wp, int n, int stride, float *op,
+ float *ToLinearF)
+{
+ register unsigned int cr, cg, cb, ca, mask;
+ register float t0, t1, t2, t3;
+
+ if (n >= stride) {
+ mask = CODE_MASK;
+ if (stride == 3) {
+ t0 = ToLinearF[cr = wp[0]];
+ t1 = ToLinearF[cg = wp[1]];
+ t2 = ToLinearF[cb = wp[2]];
+ op[0] = t0;
+ op[1] = t1;
+ op[2] = t2;
+ n -= 3;
+ while (n > 0) {
+ wp += 3;
+ op += 3;
+ n -= 3;
+ t0 = ToLinearF[(cr += wp[0]) & mask];
+ t1 = ToLinearF[(cg += wp[1]) & mask];
+ t2 = ToLinearF[(cb += wp[2]) & mask];
+ op[0] = t0;
+ op[1] = t1;
+ op[2] = t2;
+ }
+ } else if (stride == 4) {
+ t0 = ToLinearF[cr = wp[0]];
+ t1 = ToLinearF[cg = wp[1]];
+ t2 = ToLinearF[cb = wp[2]];
+ t3 = ToLinearF[ca = wp[3]];
+ op[0] = t0;
+ op[1] = t1;
+ op[2] = t2;
+ op[3] = t3;
+ n -= 4;
+ while (n > 0) {
+ wp += 4;
+ op += 4;
+ n -= 4;
+ t0 = ToLinearF[(cr += wp[0]) & mask];
+ t1 = ToLinearF[(cg += wp[1]) & mask];
+ t2 = ToLinearF[(cb += wp[2]) & mask];
+ t3 = ToLinearF[(ca += wp[3]) & mask];
+ op[0] = t0;
+ op[1] = t1;
+ op[2] = t2;
+ op[3] = t3;
+ }
+ } else {
+ REPEAT(stride, *op = ToLinearF[*wp&mask]; wp++; op++)
+ n -= stride;
+ while (n > 0) {
+ REPEAT(stride,
+ wp[stride] += *wp; *op = ToLinearF[*wp&mask]; wp++; op++)
+ n -= stride;
+ }
+ }
+ }
+}
+
+static void
+horizontalAccumulate12(uint16 *wp, int n, int stride, int16 *op,
+ float *ToLinearF)
+{
+ register unsigned int cr, cg, cb, ca, mask;
+ register float t0, t1, t2, t3;
+
+#define SCALE12 2048.0
+#define CLAMP12(t) (((t) < 3071) ? (uint16) (t) : 3071)
+
+ if (n >= stride) {
+ mask = CODE_MASK;
+ if (stride == 3) {
+ t0 = ToLinearF[cr = wp[0]] * SCALE12;
+ t1 = ToLinearF[cg = wp[1]] * SCALE12;
+ t2 = ToLinearF[cb = wp[2]] * SCALE12;
+ op[0] = CLAMP12(t0);
+ op[1] = CLAMP12(t1);
+ op[2] = CLAMP12(t2);
+ n -= 3;
+ while (n > 0) {
+ wp += 3;
+ op += 3;
+ n -= 3;
+ t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12;
+ t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12;
+ t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12;
+ op[0] = CLAMP12(t0);
+ op[1] = CLAMP12(t1);
+ op[2] = CLAMP12(t2);
+ }
+ } else if (stride == 4) {
+ t0 = ToLinearF[cr = wp[0]] * SCALE12;
+ t1 = ToLinearF[cg = wp[1]] * SCALE12;
+ t2 = ToLinearF[cb = wp[2]] * SCALE12;
+ t3 = ToLinearF[ca = wp[3]] * SCALE12;
+ op[0] = CLAMP12(t0);
+ op[1] = CLAMP12(t1);
+ op[2] = CLAMP12(t2);
+ op[3] = CLAMP12(t3);
+ n -= 4;
+ while (n > 0) {
+ wp += 4;
+ op += 4;
+ n -= 4;
+ t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12;
+ t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12;
+ t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12;
+ t3 = ToLinearF[(ca += wp[3]) & mask] * SCALE12;
+ op[0] = CLAMP12(t0);
+ op[1] = CLAMP12(t1);
+ op[2] = CLAMP12(t2);
+ op[3] = CLAMP12(t3);
+ }
+ } else {
+ REPEAT(stride, t0 = ToLinearF[*wp&mask] * SCALE12;
+ *op = CLAMP12(t0); wp++; op++)
+ n -= stride;
+ while (n > 0) {
+ REPEAT(stride,
+ wp[stride] += *wp; t0 = ToLinearF[wp[stride]&mask]*SCALE12;
+ *op = CLAMP12(t0); wp++; op++)
+ n -= stride;
+ }
+ }
+ }
+}
+
+static void
+horizontalAccumulate16(uint16 *wp, int n, int stride, uint16 *op,
+ uint16 *ToLinear16)
+{
+ register unsigned int cr, cg, cb, ca, mask;
+
+ if (n >= stride) {
+ mask = CODE_MASK;
+ if (stride == 3) {
+ op[0] = ToLinear16[cr = wp[0]];
+ op[1] = ToLinear16[cg = wp[1]];
+ op[2] = ToLinear16[cb = wp[2]];
+ n -= 3;
+ while (n > 0) {
+ wp += 3;
+ op += 3;
+ n -= 3;
+ op[0] = ToLinear16[(cr += wp[0]) & mask];
+ op[1] = ToLinear16[(cg += wp[1]) & mask];
+ op[2] = ToLinear16[(cb += wp[2]) & mask];
+ }
+ } else if (stride == 4) {
+ op[0] = ToLinear16[cr = wp[0]];
+ op[1] = ToLinear16[cg = wp[1]];
+ op[2] = ToLinear16[cb = wp[2]];
+ op[3] = ToLinear16[ca = wp[3]];
+ n -= 4;
+ while (n > 0) {
+ wp += 4;
+ op += 4;
+ n -= 4;
+ op[0] = ToLinear16[(cr += wp[0]) & mask];
+ op[1] = ToLinear16[(cg += wp[1]) & mask];
+ op[2] = ToLinear16[(cb += wp[2]) & mask];
+ op[3] = ToLinear16[(ca += wp[3]) & mask];
+ }
+ } else {
+ REPEAT(stride, *op = ToLinear16[*wp&mask]; wp++; op++)
+ n -= stride;
+ while (n > 0) {
+ REPEAT(stride,
+ wp[stride] += *wp; *op = ToLinear16[*wp&mask]; wp++; op++)
+ n -= stride;
+ }
+ }
+ }
+}
+
+/*
+ * Returns the log encoded 11-bit values with the horizontal
+ * differencing undone.
+ */
+static void
+horizontalAccumulate11(uint16 *wp, int n, int stride, uint16 *op)
+{
+ register unsigned int cr, cg, cb, ca, mask;
+
+ if (n >= stride) {
+ mask = CODE_MASK;
+ if (stride == 3) {
+ op[0] = cr = wp[0]; op[1] = cg = wp[1]; op[2] = cb = wp[2];
+ n -= 3;
+ while (n > 0) {
+ wp += 3;
+ op += 3;
+ n -= 3;
+ op[0] = (cr += wp[0]) & mask;
+ op[1] = (cg += wp[1]) & mask;
+ op[2] = (cb += wp[2]) & mask;
+ }
+ } else if (stride == 4) {
+ op[0] = cr = wp[0]; op[1] = cg = wp[1];
+ op[2] = cb = wp[2]; op[3] = ca = wp[3];
+ n -= 4;
+ while (n > 0) {
+ wp += 4;
+ op += 4;
+ n -= 4;
+ op[0] = (cr += wp[0]) & mask;
+ op[1] = (cg += wp[1]) & mask;
+ op[2] = (cb += wp[2]) & mask;
+ op[3] = (ca += wp[3]) & mask;
+ }
+ } else {
+ REPEAT(stride, *op = *wp&mask; wp++; op++)
+ n -= stride;
+ while (n > 0) {
+ REPEAT(stride,
+ wp[stride] += *wp; *op = *wp&mask; wp++; op++)
+ n -= stride;
+ }
+ }
+ }
+}
+
+static void
+horizontalAccumulate8(uint16 *wp, int n, int stride, unsigned char *op,
+ unsigned char *ToLinear8)
+{
+ register unsigned int cr, cg, cb, ca, mask;
+
+ if (n >= stride) {
+ mask = CODE_MASK;
+ if (stride == 3) {
+ op[0] = ToLinear8[cr = wp[0]];
+ op[1] = ToLinear8[cg = wp[1]];
+ op[2] = ToLinear8[cb = wp[2]];
+ n -= 3;
+ while (n > 0) {
+ n -= 3;
+ wp += 3;
+ op += 3;
+ op[0] = ToLinear8[(cr += wp[0]) & mask];
+ op[1] = ToLinear8[(cg += wp[1]) & mask];
+ op[2] = ToLinear8[(cb += wp[2]) & mask];
+ }
+ } else if (stride == 4) {
+ op[0] = ToLinear8[cr = wp[0]];
+ op[1] = ToLinear8[cg = wp[1]];
+ op[2] = ToLinear8[cb = wp[2]];
+ op[3] = ToLinear8[ca = wp[3]];
+ n -= 4;
+ while (n > 0) {
+ n -= 4;
+ wp += 4;
+ op += 4;
+ op[0] = ToLinear8[(cr += wp[0]) & mask];
+ op[1] = ToLinear8[(cg += wp[1]) & mask];
+ op[2] = ToLinear8[(cb += wp[2]) & mask];
+ op[3] = ToLinear8[(ca += wp[3]) & mask];
+ }
+ } else {
+ REPEAT(stride, *op = ToLinear8[*wp&mask]; wp++; op++)
+ n -= stride;
+ while (n > 0) {
+ REPEAT(stride,
+ wp[stride] += *wp; *op = ToLinear8[*wp&mask]; wp++; op++)
+ n -= stride;
+ }
+ }
+ }
+}
+
+
+static void
+horizontalAccumulate8abgr(uint16 *wp, int n, int stride, unsigned char *op,
+ unsigned char *ToLinear8)
+{
+ register unsigned int cr, cg, cb, ca, mask;
+ register unsigned char t0, t1, t2, t3;
+
+ if (n >= stride) {
+ mask = CODE_MASK;
+ if (stride == 3) {
+ op[0] = 0;
+ t1 = ToLinear8[cb = wp[2]];
+ t2 = ToLinear8[cg = wp[1]];
+ t3 = ToLinear8[cr = wp[0]];
+ op[1] = t1;
+ op[2] = t2;
+ op[3] = t3;
+ n -= 3;
+ while (n > 0) {
+ n -= 3;
+ wp += 3;
+ op += 4;
+ op[0] = 0;
+ t1 = ToLinear8[(cb += wp[2]) & mask];
+ t2 = ToLinear8[(cg += wp[1]) & mask];
+ t3 = ToLinear8[(cr += wp[0]) & mask];
+ op[1] = t1;
+ op[2] = t2;
+ op[3] = t3;
+ }
+ } else if (stride == 4) {
+ t0 = ToLinear8[ca = wp[3]];
+ t1 = ToLinear8[cb = wp[2]];
+ t2 = ToLinear8[cg = wp[1]];
+ t3 = ToLinear8[cr = wp[0]];
+ op[0] = t0;
+ op[1] = t1;
+ op[2] = t2;
+ op[3] = t3;
+ n -= 4;
+ while (n > 0) {
+ n -= 4;
+ wp += 4;
+ op += 4;
+ t0 = ToLinear8[(ca += wp[3]) & mask];
+ t1 = ToLinear8[(cb += wp[2]) & mask];
+ t2 = ToLinear8[(cg += wp[1]) & mask];
+ t3 = ToLinear8[(cr += wp[0]) & mask];
+ op[0] = t0;
+ op[1] = t1;
+ op[2] = t2;
+ op[3] = t3;
+ }
+ } else {
+ REPEAT(stride, *op = ToLinear8[*wp&mask]; wp++; op++)
+ n -= stride;
+ while (n > 0) {
+ REPEAT(stride,
+ wp[stride] += *wp; *op = ToLinear8[*wp&mask]; wp++; op++)
+ n -= stride;
+ }
+ }
+ }
+}
+
+/*
+ * State block for each open TIFF
+ * file using PixarLog compression/decompression.
+ */
+typedef struct {
+ TIFFPredictorState predict;
+ z_stream stream;
+ uint16 *tbuf;
+ uint16 stride;
+ int state;
+ int user_datafmt;
+ int quality;
+#define PLSTATE_INIT 1
+
+ TIFFVSetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+
+ float *ToLinearF;
+ uint16 *ToLinear16;
+ unsigned char *ToLinear8;
+ uint16 *FromLT2;
+ uint16 *From14; /* Really for 16-bit data, but we shift down 2 */
+ uint16 *From8;
+
+} PixarLogState;
+
+static int
+PixarLogMakeTables(PixarLogState *sp)
+{
+
+/*
+ * We make several tables here to convert between various external
+ * representations (float, 16-bit, and 8-bit) and the internal
+ * 11-bit companded representation. The 11-bit representation has two
+ * distinct regions. A linear bottom end up through .018316 in steps
+ * of about .000073, and a region of constant ratio up to about 25.
+ * These floating point numbers are stored in the main table ToLinearF.
+ * All other tables are derived from this one. The tables (and the
+ * ratios) are continuous at the internal seam.
+ */
+
+ int nlin, lt2size;
+ int i, j;
+ double b, c, linstep, v;
+ float *ToLinearF;
+ uint16 *ToLinear16;
+ unsigned char *ToLinear8;
+ uint16 *FromLT2;
+ uint16 *From14; /* Really for 16-bit data, but we shift down 2 */
+ uint16 *From8;
+
+ c = log(RATIO);
+ nlin = (int)1./c; /* nlin must be an integer */
+ c = 1./nlin;
+ b = exp(-c*ONE); /* multiplicative scale factor [b*exp(c*ONE) = 1] */
+ linstep = b*c*exp(1.);
+
+ LogK1 = 1./c; /* if (v >= 2) token = k1*log(v*k2) */
+ LogK2 = 1./b;
+ lt2size = (int)(2./linstep) + 1;
+ FromLT2 = (uint16 *)_TIFFmalloc(lt2size*sizeof(uint16));
+ From14 = (uint16 *)_TIFFmalloc(16384*sizeof(uint16));
+ From8 = (uint16 *)_TIFFmalloc(256*sizeof(uint16));
+ ToLinearF = (float *)_TIFFmalloc(TSIZEP1 * sizeof(float));
+ ToLinear16 = (uint16 *)_TIFFmalloc(TSIZEP1 * sizeof(uint16));
+ ToLinear8 = (unsigned char *)_TIFFmalloc(TSIZEP1 * sizeof(unsigned char));
+ if (FromLT2 == NULL || From14 == NULL || From8 == NULL ||
+ ToLinearF == NULL || ToLinear16 == NULL || ToLinear8 == NULL) {
+ if (FromLT2) _TIFFfree(FromLT2);
+ if (From14) _TIFFfree(From14);
+ if (From8) _TIFFfree(From8);
+ if (ToLinearF) _TIFFfree(ToLinearF);
+ if (ToLinear16) _TIFFfree(ToLinear16);
+ if (ToLinear8) _TIFFfree(ToLinear8);
+ sp->FromLT2 = NULL;
+ sp->From14 = NULL;
+ sp->From8 = NULL;
+ sp->ToLinearF = NULL;
+ sp->ToLinear16 = NULL;
+ sp->ToLinear8 = NULL;
+ return 0;
+ }
+
+ j = 0;
+
+ for (i = 0; i < nlin; i++) {
+ v = i * linstep;
+ ToLinearF[j++] = v;
+ }
+
+ for (i = nlin; i < TSIZE; i++)
+ ToLinearF[j++] = b*exp(c*i);
+
+ ToLinearF[2048] = ToLinearF[2047];
+
+ for (i = 0; i < TSIZEP1; i++) {
+ v = ToLinearF[i]*65535.0 + 0.5;
+ ToLinear16[i] = (v > 65535.0) ? 65535 : (uint16)v;
+ v = ToLinearF[i]*255.0 + 0.5;
+ ToLinear8[i] = (v > 255.0) ? 255 : (unsigned char)v;
+ }
+
+ j = 0;
+ for (i = 0; i < lt2size; i++) {
+ if ((i*linstep)*(i*linstep) > ToLinearF[j]*ToLinearF[j+1])
+ j++;
+ FromLT2[i] = j;
+ }
+
+ /*
+ * Since we lose info anyway on 16-bit data, we set up a 14-bit
+ * table and shift 16-bit values down two bits on input.
+ * saves a little table space.
+ */
+ j = 0;
+ for (i = 0; i < 16384; i++) {
+ while ((i/16383.)*(i/16383.) > ToLinearF[j]*ToLinearF[j+1])
+ j++;
+ From14[i] = j;
+ }
+
+ j = 0;
+ for (i = 0; i < 256; i++) {
+ while ((i/255.)*(i/255.) > ToLinearF[j]*ToLinearF[j+1])
+ j++;
+ From8[i] = j;
+ }
+
+ Fltsize = lt2size/2;
+
+ sp->ToLinearF = ToLinearF;
+ sp->ToLinear16 = ToLinear16;
+ sp->ToLinear8 = ToLinear8;
+ sp->FromLT2 = FromLT2;
+ sp->From14 = From14;
+ sp->From8 = From8;
+
+ return 1;
+}
+
+#define DecoderState(tif) ((PixarLogState*) (tif)->tif_data)
+#define EncoderState(tif) ((PixarLogState*) (tif)->tif_data)
+
+static int PixarLogEncode(TIFF*, tidata_t, tsize_t, tsample_t);
+static int PixarLogDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+
+#define N(a) (sizeof(a)/sizeof(a[0]))
+#define PIXARLOGDATAFMT_UNKNOWN -1
+
+static int
+PixarLogGuessDataFmt(TIFFDirectory *td)
+{
+ int guess = PIXARLOGDATAFMT_UNKNOWN;
+ int format = td->td_sampleformat;
+
+ /* If the user didn't tell us his datafmt,
+ * take our best guess from the bitspersample.
+ */
+ switch (td->td_bitspersample) {
+ case 32:
+ if (format == SAMPLEFORMAT_IEEEFP)
+ guess = PIXARLOGDATAFMT_FLOAT;
+ break;
+ case 16:
+ if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT)
+ guess = PIXARLOGDATAFMT_16BIT;
+ break;
+ case 12:
+ if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_INT)
+ guess = PIXARLOGDATAFMT_12BITPICIO;
+ break;
+ case 11:
+ if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT)
+ guess = PIXARLOGDATAFMT_11BITLOG;
+ break;
+ case 8:
+ if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT)
+ guess = PIXARLOGDATAFMT_8BIT;
+ break;
+ }
+
+ return guess;
+}
+
+static int
+PixarLogSetupDecode(TIFF* tif)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ PixarLogState* sp = DecoderState(tif);
+ static const char module[] = "PixarLogSetupDecode";
+
+ assert(sp != NULL);
+
+ /* Make sure no byte swapping happens on the data
+ * after decompression. */
+ tif->tif_postdecode = _TIFFNoPostDecode;
+
+ /* for some reason, we can't do this in TIFFInitPixarLog */
+
+ sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ?
+ td->td_samplesperpixel : 1);
+ sp->tbuf = (uint16 *) _TIFFmalloc(sp->stride *
+ td->td_imagewidth * td->td_rowsperstrip * sizeof(uint16));
+ if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN)
+ sp->user_datafmt = PixarLogGuessDataFmt(td);
+ if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) {
+ TIFFError(module,
+ "PixarLog compression can't handle bits depth/data format combination (depth: %d)",
+ td->td_bitspersample);
+ return (0);
+ }
+
+ if (inflateInit(&sp->stream) != Z_OK) {
+ TIFFError(module, "%s: %s", tif->tif_name, sp->stream.msg);
+ return (0);
+ } else {
+ sp->state |= PLSTATE_INIT;
+ return (1);
+ }
+}
+
+/*
+ * Setup state for decoding a strip.
+ */
+static int
+PixarLogPreDecode(TIFF* tif, tsample_t s)
+{
+ PixarLogState* sp = DecoderState(tif);
+
+ (void) s;
+ assert(sp != NULL);
+ sp->stream.next_in = tif->tif_rawdata;
+ sp->stream.avail_in = tif->tif_rawcc;
+ return (inflateReset(&sp->stream) == Z_OK);
+}
+
+static int
+PixarLogDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ PixarLogState* sp = DecoderState(tif);
+ static const char module[] = "PixarLogDecode";
+ int i, nsamples, llen;
+ uint16 *up;
+
+ switch (sp->user_datafmt) {
+ case PIXARLOGDATAFMT_FLOAT:
+ nsamples = occ / sizeof(float); /* XXX float == 32 bits */
+ break;
+ case PIXARLOGDATAFMT_16BIT:
+ case PIXARLOGDATAFMT_12BITPICIO:
+ case PIXARLOGDATAFMT_11BITLOG:
+ nsamples = occ / sizeof(uint16); /* XXX uint16 == 16 bits */
+ break;
+ case PIXARLOGDATAFMT_8BIT:
+ case PIXARLOGDATAFMT_8BITABGR:
+ nsamples = occ;
+ break;
+ default:
+ TIFFError(tif->tif_name,
+ "%d bit input not supported in PixarLog",
+ td->td_bitspersample);
+ return 0;
+ }
+
+ llen = sp->stride * td->td_imagewidth;
+
+ (void) s;
+ assert(sp != NULL);
+ sp->stream.next_out = (unsigned char *) sp->tbuf;
+ sp->stream.avail_out = nsamples * sizeof(uint16);
+ do {
+ int state = inflate(&sp->stream, Z_PARTIAL_FLUSH);
+ if (state == Z_STREAM_END) {
+ break; /* XXX */
+ }
+ if (state == Z_DATA_ERROR) {
+ TIFFError(module,
+ "%s: Decoding error at scanline %d, %s",
+ tif->tif_name, tif->tif_row, sp->stream.msg);
+ if (inflateSync(&sp->stream) != Z_OK)
+ return (0);
+ continue;
+ }
+ if (state != Z_OK) {
+ TIFFError(module, "%s: zlib error: %s",
+ tif->tif_name, sp->stream.msg);
+ return (0);
+ }
+ } while (sp->stream.avail_out > 0);
+
+ /* hopefully, we got all the bytes we needed */
+ if (sp->stream.avail_out != 0) {
+ TIFFError(module,
+ "%s: Not enough data at scanline %d (short %d bytes)",
+ tif->tif_name, tif->tif_row, sp->stream.avail_out);
+ return (0);
+ }
+
+ up = sp->tbuf;
+ /* Swap bytes in the data if from a different endian machine. */
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfShort(up, nsamples);
+
+ for (i = 0; i < nsamples; i += llen, up += llen) {
+ switch (sp->user_datafmt) {
+ case PIXARLOGDATAFMT_FLOAT:
+ horizontalAccumulateF(up, llen, sp->stride,
+ (float *)op, sp->ToLinearF);
+ op += llen * sizeof(float);
+ break;
+ case PIXARLOGDATAFMT_16BIT:
+ horizontalAccumulate16(up, llen, sp->stride,
+ (uint16 *)op, sp->ToLinear16);
+ op += llen * sizeof(uint16);
+ break;
+ case PIXARLOGDATAFMT_12BITPICIO:
+ horizontalAccumulate12(up, llen, sp->stride,
+ (int16 *)op, sp->ToLinearF);
+ op += llen * sizeof(int16);
+ break;
+ case PIXARLOGDATAFMT_11BITLOG:
+ horizontalAccumulate11(up, llen, sp->stride,
+ (uint16 *)op);
+ op += llen * sizeof(uint16);
+ break;
+ case PIXARLOGDATAFMT_8BIT:
+ horizontalAccumulate8(up, llen, sp->stride,
+ (unsigned char *)op, sp->ToLinear8);
+ op += llen * sizeof(unsigned char);
+ break;
+ case PIXARLOGDATAFMT_8BITABGR:
+ horizontalAccumulate8abgr(up, llen, sp->stride,
+ (unsigned char *)op, sp->ToLinear8);
+ op += llen * sizeof(unsigned char);
+ break;
+ default:
+ TIFFError(tif->tif_name,
+ "PixarLogDecode: unsupported bits/sample: %d",
+ td->td_bitspersample);
+ return (0);
+ }
+ }
+
+ return (1);
+}
+
+static int
+PixarLogSetupEncode(TIFF* tif)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ PixarLogState* sp = EncoderState(tif);
+ static const char module[] = "PixarLogSetupEncode";
+
+ assert(sp != NULL);
+
+ /* for some reason, we can't do this in TIFFInitPixarLog */
+
+ sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ?
+ td->td_samplesperpixel : 1);
+ sp->tbuf = (uint16 *) _TIFFmalloc(sp->stride *
+ td->td_imagewidth * td->td_rowsperstrip * sizeof(uint16));
+ if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN)
+ sp->user_datafmt = PixarLogGuessDataFmt(td);
+ if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) {
+ TIFFError(module, "PixarLog compression can't handle %d bit linear encodings", td->td_bitspersample);
+ return (0);
+ }
+
+ if (deflateInit(&sp->stream, sp->quality) != Z_OK) {
+ TIFFError(module, "%s: %s", tif->tif_name, sp->stream.msg);
+ return (0);
+ } else {
+ sp->state |= PLSTATE_INIT;
+ return (1);
+ }
+}
+
+/*
+ * Reset encoding state at the start of a strip.
+ */
+static int
+PixarLogPreEncode(TIFF* tif, tsample_t s)
+{
+ PixarLogState *sp = EncoderState(tif);
+
+ (void) s;
+ assert(sp != NULL);
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out = tif->tif_rawdatasize;
+ return (deflateReset(&sp->stream) == Z_OK);
+}
+
+static void
+horizontalDifferenceF(float *ip, int n, int stride, uint16 *wp, uint16 *FromLT2)
+{
+
+ register int r1, g1, b1, a1, r2, g2, b2, a2, mask;
+ register float fltsize = Fltsize;
+
+#define CLAMP(v) ( (v<(float)0.) ? 0 \
+ : (v<(float)2.) ? FromLT2[(int)(v*fltsize)] \
+ : (v>(float)24.2) ? 2047 \
+ : LogK1*log(v*LogK2) + 0.5 )
+
+ mask = CODE_MASK;
+ if (n >= stride) {
+ if (stride == 3) {
+ r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]);
+ b2 = wp[2] = CLAMP(ip[2]);
+ n -= 3;
+ while (n > 0) {
+ n -= 3;
+ wp += 3;
+ ip += 3;
+ r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1;
+ g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1;
+ b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1;
+ }
+ } else if (stride == 4) {
+ r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]);
+ b2 = wp[2] = CLAMP(ip[2]); a2 = wp[3] = CLAMP(ip[3]);
+ n -= 4;
+ while (n > 0) {
+ n -= 4;
+ wp += 4;
+ ip += 4;
+ r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1;
+ g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1;
+ b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1;
+ a1 = CLAMP(ip[3]); wp[3] = (a1-a2) & mask; a2 = a1;
+ }
+ } else {
+ ip += n - 1; /* point to last one */
+ wp += n - 1; /* point to last one */
+ n -= stride;
+ while (n > 0) {
+ REPEAT(stride, wp[0] = CLAMP(ip[0]);
+ wp[stride] -= wp[0];
+ wp[stride] &= mask;
+ wp--; ip--)
+ n -= stride;
+ }
+ REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--)
+ }
+ }
+}
+
+static void
+horizontalDifference16(unsigned short *ip, int n, int stride,
+ unsigned short *wp, uint16 *From14)
+{
+ register int r1, g1, b1, a1, r2, g2, b2, a2, mask;
+
+/* assumption is unsigned pixel values */
+#undef CLAMP
+#define CLAMP(v) From14[(v) >> 2]
+
+ mask = CODE_MASK;
+ if (n >= stride) {
+ if (stride == 3) {
+ r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]);
+ b2 = wp[2] = CLAMP(ip[2]);
+ n -= 3;
+ while (n > 0) {
+ n -= 3;
+ wp += 3;
+ ip += 3;
+ r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1;
+ g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1;
+ b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1;
+ }
+ } else if (stride == 4) {
+ r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]);
+ b2 = wp[2] = CLAMP(ip[2]); a2 = wp[3] = CLAMP(ip[3]);
+ n -= 4;
+ while (n > 0) {
+ n -= 4;
+ wp += 4;
+ ip += 4;
+ r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1;
+ g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1;
+ b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1;
+ a1 = CLAMP(ip[3]); wp[3] = (a1-a2) & mask; a2 = a1;
+ }
+ } else {
+ ip += n - 1; /* point to last one */
+ wp += n - 1; /* point to last one */
+ n -= stride;
+ while (n > 0) {
+ REPEAT(stride, wp[0] = CLAMP(ip[0]);
+ wp[stride] -= wp[0];
+ wp[stride] &= mask;
+ wp--; ip--)
+ n -= stride;
+ }
+ REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--)
+ }
+ }
+}
+
+
+static void
+horizontalDifference8(unsigned char *ip, int n, int stride,
+ unsigned short *wp, uint16 *From8)
+{
+ register int r1, g1, b1, a1, r2, g2, b2, a2, mask;
+
+#undef CLAMP
+#define CLAMP(v) (From8[(v)])
+
+ mask = CODE_MASK;
+ if (n >= stride) {
+ if (stride == 3) {
+ r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]);
+ b2 = wp[2] = CLAMP(ip[2]);
+ n -= 3;
+ while (n > 0) {
+ n -= 3;
+ r1 = CLAMP(ip[3]); wp[3] = (r1-r2) & mask; r2 = r1;
+ g1 = CLAMP(ip[4]); wp[4] = (g1-g2) & mask; g2 = g1;
+ b1 = CLAMP(ip[5]); wp[5] = (b1-b2) & mask; b2 = b1;
+ wp += 3;
+ ip += 3;
+ }
+ } else if (stride == 4) {
+ r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]);
+ b2 = wp[2] = CLAMP(ip[2]); a2 = wp[3] = CLAMP(ip[3]);
+ n -= 4;
+ while (n > 0) {
+ n -= 4;
+ r1 = CLAMP(ip[4]); wp[4] = (r1-r2) & mask; r2 = r1;
+ g1 = CLAMP(ip[5]); wp[5] = (g1-g2) & mask; g2 = g1;
+ b1 = CLAMP(ip[6]); wp[6] = (b1-b2) & mask; b2 = b1;
+ a1 = CLAMP(ip[7]); wp[7] = (a1-a2) & mask; a2 = a1;
+ wp += 4;
+ ip += 4;
+ }
+ } else {
+ wp += n + stride - 1; /* point to last one */
+ ip += n + stride - 1; /* point to last one */
+ n -= stride;
+ while (n > 0) {
+ REPEAT(stride, wp[0] = CLAMP(ip[0]);
+ wp[stride] -= wp[0];
+ wp[stride] &= mask;
+ wp--; ip--)
+ n -= stride;
+ }
+ REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--)
+ }
+ }
+}
+
+/*
+ * Encode a chunk of pixels.
+ */
+static int
+PixarLogEncode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ PixarLogState *sp = EncoderState(tif);
+ static const char module[] = "PixarLogEncode";
+ int i, n, llen;
+ unsigned short * up;
+
+ (void) s;
+
+ switch (sp->user_datafmt) {
+ case PIXARLOGDATAFMT_FLOAT:
+ n = cc / sizeof(float); /* XXX float == 32 bits */
+ break;
+ case PIXARLOGDATAFMT_16BIT:
+ case PIXARLOGDATAFMT_12BITPICIO:
+ case PIXARLOGDATAFMT_11BITLOG:
+ n = cc / sizeof(uint16); /* XXX uint16 == 16 bits */
+ break;
+ case PIXARLOGDATAFMT_8BIT:
+ case PIXARLOGDATAFMT_8BITABGR:
+ n = cc;
+ break;
+ default:
+ TIFFError(tif->tif_name,
+ "%d bit input not supported in PixarLog",
+ td->td_bitspersample);
+ return 0;
+ }
+
+ llen = sp->stride * td->td_imagewidth;
+
+ for (i = 0, up = sp->tbuf; i < n; i += llen, up += llen) {
+ switch (sp->user_datafmt) {
+ case PIXARLOGDATAFMT_FLOAT:
+ horizontalDifferenceF((float *)bp, llen,
+ sp->stride, up, sp->FromLT2);
+ bp += llen * sizeof(float);
+ break;
+ case PIXARLOGDATAFMT_16BIT:
+ horizontalDifference16((uint16 *)bp, llen,
+ sp->stride, up, sp->From14);
+ bp += llen * sizeof(uint16);
+ break;
+ case PIXARLOGDATAFMT_8BIT:
+ horizontalDifference8((unsigned char *)bp, llen,
+ sp->stride, up, sp->From8);
+ bp += llen * sizeof(unsigned char);
+ break;
+ default:
+ TIFFError(tif->tif_name,
+ "%d bit input not supported in PixarLog",
+ td->td_bitspersample);
+ return 0;
+ }
+ }
+
+ sp->stream.next_in = (unsigned char *) sp->tbuf;
+ sp->stream.avail_in = n * sizeof(uint16);
+
+ do {
+ if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) {
+ TIFFError(module, "%s: Encoder error: %s",
+ tif->tif_name, sp->stream.msg);
+ return (0);
+ }
+ if (sp->stream.avail_out == 0) {
+ tif->tif_rawcc = tif->tif_rawdatasize;
+ TIFFFlushData1(tif);
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out = tif->tif_rawdatasize;
+ }
+ } while (sp->stream.avail_in > 0);
+ return (1);
+}
+
+/*
+ * Finish off an encoded strip by flushing the last
+ * string and tacking on an End Of Information code.
+ */
+
+static int
+PixarLogPostEncode(TIFF* tif)
+{
+ PixarLogState *sp = EncoderState(tif);
+ static const char module[] = "PixarLogPostEncode";
+ int state;
+
+ sp->stream.avail_in = 0;
+
+ do {
+ state = deflate(&sp->stream, Z_FINISH);
+ switch (state) {
+ case Z_STREAM_END:
+ case Z_OK:
+ if (sp->stream.avail_out != tif->tif_rawdatasize) {
+ tif->tif_rawcc =
+ tif->tif_rawdatasize - sp->stream.avail_out;
+ TIFFFlushData1(tif);
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out = tif->tif_rawdatasize;
+ }
+ break;
+ default:
+ TIFFError(module, "%s: zlib error: %s",
+ tif->tif_name, sp->stream.msg);
+ return (0);
+ }
+ } while (state != Z_STREAM_END);
+ return (1);
+}
+
+static void
+PixarLogClose(TIFF* tif)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+
+ /* In a really sneaky maneuver, on close, we covertly modify both
+ * bitspersample and sampleformat in the directory to indicate
+ * 8-bit linear. This way, the decode "just works" even for
+ * readers that don't know about PixarLog, or how to set
+ * the PIXARLOGDATFMT pseudo-tag.
+ */
+ td->td_bitspersample = 8;
+ td->td_sampleformat = SAMPLEFORMAT_UINT;
+}
+
+static void
+PixarLogCleanup(TIFF* tif)
+{
+ PixarLogState* sp = (PixarLogState*) tif->tif_data;
+
+ if (sp) {
+ if (sp->FromLT2) _TIFFfree(sp->FromLT2);
+ if (sp->From14) _TIFFfree(sp->From14);
+ if (sp->From8) _TIFFfree(sp->From8);
+ if (sp->ToLinearF) _TIFFfree(sp->ToLinearF);
+ if (sp->ToLinear16) _TIFFfree(sp->ToLinear16);
+ if (sp->ToLinear8) _TIFFfree(sp->ToLinear8);
+ if (sp->state&PLSTATE_INIT) {
+ if (tif->tif_mode == O_RDONLY)
+ inflateEnd(&sp->stream);
+ else
+ deflateEnd(&sp->stream);
+ }
+ if (sp->tbuf)
+ _TIFFfree(sp->tbuf);
+ _TIFFfree(sp);
+ tif->tif_data = NULL;
+ }
+}
+
+static int
+PixarLogVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ PixarLogState *sp = (PixarLogState *)tif->tif_data;
+ int result;
+ static const char module[] = "PixarLogVSetField";
+
+ switch (tag) {
+ case TIFFTAG_PIXARLOGQUALITY:
+ sp->quality = va_arg(ap, int);
+ if (tif->tif_mode != O_RDONLY && (sp->state&PLSTATE_INIT)) {
+ if (deflateParams(&sp->stream,
+ sp->quality, Z_DEFAULT_STRATEGY) != Z_OK) {
+ TIFFError(module, "%s: zlib error: %s",
+ tif->tif_name, sp->stream.msg);
+ return (0);
+ }
+ }
+ return (1);
+ case TIFFTAG_PIXARLOGDATAFMT:
+ sp->user_datafmt = va_arg(ap, int);
+ /* Tweak the TIFF header so that the rest of libtiff knows what
+ * size of data will be passed between app and library, and
+ * assume that the app knows what it is doing and is not
+ * confused by these header manipulations...
+ */
+ switch (sp->user_datafmt) {
+ case PIXARLOGDATAFMT_8BIT:
+ case PIXARLOGDATAFMT_8BITABGR:
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
+ TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+ break;
+ case PIXARLOGDATAFMT_11BITLOG:
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
+ TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+ break;
+ case PIXARLOGDATAFMT_12BITPICIO:
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
+ TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT);
+ break;
+ case PIXARLOGDATAFMT_16BIT:
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
+ TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+ break;
+ case PIXARLOGDATAFMT_FLOAT:
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 32);
+ TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);
+ break;
+ }
+ /*
+ * Must recalculate sizes should bits/sample change.
+ */
+ tif->tif_tilesize = TIFFTileSize(tif);
+ tif->tif_scanlinesize = TIFFScanlineSize(tif);
+ result = 1; /* NB: pseudo tag */
+ break;
+ default:
+ result = (*sp->vsetparent)(tif, tag, ap);
+ }
+ return (result);
+}
+
+static int
+PixarLogVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ PixarLogState *sp = (PixarLogState *)tif->tif_data;
+
+ switch (tag) {
+ case TIFFTAG_PIXARLOGQUALITY:
+ *va_arg(ap, int*) = sp->quality;
+ break;
+ case TIFFTAG_PIXARLOGDATAFMT:
+ *va_arg(ap, int*) = sp->user_datafmt;
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return (1);
+}
+
+static const TIFFFieldInfo pixarlogFieldInfo[] = {
+ {TIFFTAG_PIXARLOGDATAFMT,0,0,TIFF_ANY, FIELD_PSEUDO,FALSE,FALSE,""},
+ {TIFFTAG_PIXARLOGQUALITY,0,0,TIFF_ANY, FIELD_PSEUDO,FALSE,FALSE,""}
+};
+
+int
+TIFFInitPixarLog(TIFF* tif, int scheme)
+{
+ PixarLogState* sp;
+
+ assert(scheme == COMPRESSION_PIXARLOG);
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (PixarLogState));
+ if (tif->tif_data == NULL)
+ goto bad;
+ sp = (PixarLogState*) tif->tif_data;
+ memset(sp, 0, sizeof (*sp));
+ sp->stream.data_type = Z_BINARY;
+ sp->user_datafmt = PIXARLOGDATAFMT_UNKNOWN;
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_setupdecode = PixarLogSetupDecode;
+ tif->tif_predecode = PixarLogPreDecode;
+ tif->tif_decoderow = PixarLogDecode;
+ tif->tif_decodestrip = PixarLogDecode;
+ tif->tif_decodetile = PixarLogDecode;
+ tif->tif_setupencode = PixarLogSetupEncode;
+ tif->tif_preencode = PixarLogPreEncode;
+ tif->tif_postencode = PixarLogPostEncode;
+ tif->tif_encoderow = PixarLogEncode;
+ tif->tif_encodestrip = PixarLogEncode;
+ tif->tif_encodetile = PixarLogEncode;
+ tif->tif_close = PixarLogClose;
+ tif->tif_cleanup = PixarLogCleanup;
+
+ /* Override SetField so we can handle our private pseudo-tag */
+ _TIFFMergeFieldInfo(tif, pixarlogFieldInfo, N(pixarlogFieldInfo));
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = PixarLogVGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = PixarLogVSetField; /* hook for codec tags */
+
+ /* Default values for codec-specific fields */
+ sp->quality = Z_DEFAULT_COMPRESSION; /* default comp. level */
+ sp->state = 0;
+
+ /* we don't wish to use the predictor,
+ * the default is none, which predictor value 1
+ */
+ (void) TIFFPredictorInit(tif);
+
+ /*
+ * build the companding tables
+ */
+ PixarLogMakeTables(sp);
+
+ return (1);
+bad:
+ TIFFError("TIFFInitPixarLog", "No space for PixarLog state block");
+ return (0);
+}
+#endif /* PIXARLOG_SUPPORT */
diff --git a/src/tiff/tif_predict.c b/src/tiff/tif_predict.c
new file mode 100644
index 0000000..670c28b
--- /dev/null
+++ b/src/tiff/tif_predict.c
@@ -0,0 +1,464 @@
+/* $Header: /home/terralib/src/tiff/tif_predict.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Predictor Tag Support (used by multiple codecs).
+ */
+#include "tiffiop.h"
+#include "tif_predict.h"
+
+#include <assert.h>
+
+#define PredictorState(tif) ((TIFFPredictorState*) (tif)->tif_data)
+
+static void horAcc8(TIFF*, tidata_t, tsize_t);
+static void horAcc16(TIFF*, tidata_t, tsize_t);
+static void swabHorAcc16(TIFF*, tidata_t, tsize_t);
+static void horDiff8(TIFF*, tidata_t, tsize_t);
+static void horDiff16(TIFF*, tidata_t, tsize_t);
+static int PredictorDecodeRow(TIFF*, tidata_t, tsize_t, tsample_t);
+static int PredictorDecodeTile(TIFF*, tidata_t, tsize_t, tsample_t);
+static int PredictorEncodeRow(TIFF*, tidata_t, tsize_t, tsample_t);
+static int PredictorEncodeTile(TIFF*, tidata_t, tsize_t, tsample_t);
+
+static int
+PredictorSetup(TIFF* tif)
+{
+ TIFFPredictorState* sp = PredictorState(tif);
+ TIFFDirectory* td = &tif->tif_dir;
+
+ if (sp->predictor == 1) /* no differencing */
+ return (1);
+ if (sp->predictor != 2) {
+ TIFFError(tif->tif_name, "\"Predictor\" value %d not supported",
+ sp->predictor);
+ return (0);
+ }
+ if (td->td_bitspersample != 8 && td->td_bitspersample != 16) {
+ TIFFError(tif->tif_name,
+ "Horizontal differencing \"Predictor\" not supported with %d-bit samples",
+ td->td_bitspersample);
+ return (0);
+ }
+ sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ?
+ td->td_samplesperpixel : 1);
+ /*
+ * Calculate the scanline/tile-width size in bytes.
+ */
+ if (isTiled(tif))
+ sp->rowsize = TIFFTileRowSize(tif);
+ else
+ sp->rowsize = TIFFScanlineSize(tif);
+ return (1);
+}
+
+static int
+PredictorSetupDecode(TIFF* tif)
+{
+ TIFFPredictorState* sp = PredictorState(tif);
+ TIFFDirectory* td = &tif->tif_dir;
+
+ if (!(*sp->setupdecode)(tif) || !PredictorSetup(tif))
+ return (0);
+ if (sp->predictor == 2) {
+ switch (td->td_bitspersample) {
+ case 8: sp->pfunc = horAcc8; break;
+ case 16: sp->pfunc = horAcc16; break;
+ }
+ /*
+ * Override default decoding method with
+ * one that does the predictor stuff.
+ */
+ sp->coderow = tif->tif_decoderow;
+ tif->tif_decoderow = PredictorDecodeRow;
+ sp->codestrip = tif->tif_decodestrip;
+ tif->tif_decodestrip = PredictorDecodeTile;
+ sp->codetile = tif->tif_decodetile;
+ tif->tif_decodetile = PredictorDecodeTile;
+ /*
+ * If the data is horizontally differenced
+ * 16-bit data that requires byte-swapping,
+ * then it must be byte swapped before the
+ * accumulation step. We do this with a
+ * special-purpose routine and override the
+ * normal post decoding logic that the library
+ * setup when the directory was read.
+ */
+ if (tif->tif_flags&TIFF_SWAB) {
+ if (sp->pfunc == horAcc16) {
+ sp->pfunc = swabHorAcc16;
+ tif->tif_postdecode = _TIFFNoPostDecode;
+ } /* else handle 32-bit case... */
+ }
+ }
+ return (1);
+}
+
+static int
+PredictorSetupEncode(TIFF* tif)
+{
+ TIFFPredictorState* sp = PredictorState(tif);
+ TIFFDirectory* td = &tif->tif_dir;
+
+ if (!(*sp->setupencode)(tif) || !PredictorSetup(tif))
+ return (0);
+ if (sp->predictor == 2) {
+ switch (td->td_bitspersample) {
+ case 8: sp->pfunc = horDiff8; break;
+ case 16: sp->pfunc = horDiff16; break;
+ }
+ /*
+ * Override default encoding method with
+ * one that does the predictor stuff.
+ */
+ sp->coderow = tif->tif_encoderow;
+ tif->tif_encoderow = PredictorEncodeRow;
+ sp->codestrip = tif->tif_encodestrip;
+ tif->tif_encodestrip = PredictorEncodeTile;
+ sp->codetile = tif->tif_encodetile;
+ tif->tif_encodetile = PredictorEncodeTile;
+ }
+ return (1);
+}
+
+#define REPEAT4(n, op) \
+ switch (n) { \
+ default: { int i; for (i = n-4; i > 0; i--) { op; } } \
+ case 4: op; \
+ case 3: op; \
+ case 2: op; \
+ case 1: op; \
+ case 0: ; \
+ }
+
+static void
+horAcc8(TIFF* tif, tidata_t cp0, tsize_t cc)
+{
+ TIFFPredictorState* sp = PredictorState(tif);
+ tsize_t stride = sp->stride;
+
+ char* cp = (char*) cp0;
+ if (cc > stride) {
+ cc -= stride;
+ /*
+ * Pipeline the most common cases.
+ */
+ if (stride == 3) {
+ u_int cr = cp[0];
+ u_int cg = cp[1];
+ u_int cb = cp[2];
+ do {
+ cc -= 3, cp += 3;
+ cp[0] = (char) (cr += cp[0]);
+ cp[1] = (char) (cg += cp[1]);
+ cp[2] = (char) (cb += cp[2]);
+ } while ((int32) cc > 0);
+ } else if (stride == 4) {
+ u_int cr = cp[0];
+ u_int cg = cp[1];
+ u_int cb = cp[2];
+ u_int ca = cp[3];
+ do {
+ cc -= 4, cp += 4;
+ cp[0] = (char) (cr += cp[0]);
+ cp[1] = (char) (cg += cp[1]);
+ cp[2] = (char) (cb += cp[2]);
+ cp[3] = (char) (ca += cp[3]);
+ } while ((int32) cc > 0);
+ } else {
+ do {
+ REPEAT4(stride, cp[stride] = (char) (cp[stride] + *cp); cp++)
+ cc -= stride;
+ } while ((int32) cc > 0);
+ }
+ }
+}
+
+static void
+swabHorAcc16(TIFF* tif, tidata_t cp0, tsize_t cc)
+{
+ TIFFPredictorState* sp = PredictorState(tif);
+ tsize_t stride = sp->stride;
+ uint16* wp = (uint16*) cp0;
+ tsize_t wc = cc / 2;
+
+ if (wc > stride) {
+ TIFFSwabArrayOfShort(wp, wc);
+ wc -= stride;
+ do {
+ REPEAT4(stride, wp[stride] += wp[0]; wp++)
+ wc -= stride;
+ } while ((int32) wc > 0);
+ }
+}
+
+static void
+horAcc16(TIFF* tif, tidata_t cp0, tsize_t cc)
+{
+ tsize_t stride = PredictorState(tif)->stride;
+ uint16* wp = (uint16*) cp0;
+ tsize_t wc = cc / 2;
+
+ if (wc > stride) {
+ wc -= stride;
+ do {
+ REPEAT4(stride, wp[stride] += wp[0]; wp++)
+ wc -= stride;
+ } while ((int32) wc > 0);
+ }
+}
+
+/*
+ * Decode a scanline and apply the predictor routine.
+ */
+static int
+PredictorDecodeRow(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s)
+{
+ TIFFPredictorState *sp = PredictorState(tif);
+
+ assert(sp != NULL);
+ assert(sp->coderow != NULL);
+ assert(sp->pfunc != NULL);
+ if ((*sp->coderow)(tif, op0, occ0, s)) {
+ (*sp->pfunc)(tif, op0, occ0);
+ return (1);
+ } else
+ return (0);
+}
+
+/*
+ * Decode a tile/strip and apply the predictor routine.
+ * Note that horizontal differencing must be done on a
+ * row-by-row basis. The width of a "row" has already
+ * been calculated at pre-decode time according to the
+ * strip/tile dimensions.
+ */
+static int
+PredictorDecodeTile(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s)
+{
+ TIFFPredictorState *sp = PredictorState(tif);
+
+ assert(sp != NULL);
+ assert(sp->codetile != NULL);
+ if ((*sp->codetile)(tif, op0, occ0, s)) {
+ tsize_t rowsize = sp->rowsize;
+ assert(rowsize > 0);
+ assert(sp->pfunc != NULL);
+ while ((long)occ0 > 0) {
+ (*sp->pfunc)(tif, op0, (tsize_t) rowsize);
+ occ0 -= rowsize;
+ op0 += rowsize;
+ }
+ return (1);
+ } else
+ return (0);
+}
+
+static void
+horDiff8(TIFF* tif, tidata_t cp0, tsize_t cc)
+{
+ TIFFPredictorState* sp = PredictorState(tif);
+ tsize_t stride = sp->stride;
+ char* cp = (char*) cp0;
+
+ if (cc > stride) {
+ cc -= stride;
+ /*
+ * Pipeline the most common cases.
+ */
+ if (stride == 3) {
+ int r1, g1, b1;
+ int r2 = cp[0];
+ int g2 = cp[1];
+ int b2 = cp[2];
+ do {
+ r1 = cp[3]; cp[3] = r1-r2; r2 = r1;
+ g1 = cp[4]; cp[4] = g1-g2; g2 = g1;
+ b1 = cp[5]; cp[5] = b1-b2; b2 = b1;
+ cp += 3;
+ } while ((int32)(cc -= 3) > 0);
+ } else if (stride == 4) {
+ int r1, g1, b1, a1;
+ int r2 = cp[0];
+ int g2 = cp[1];
+ int b2 = cp[2];
+ int a2 = cp[3];
+ do {
+ r1 = cp[4]; cp[4] = r1-r2; r2 = r1;
+ g1 = cp[5]; cp[5] = g1-g2; g2 = g1;
+ b1 = cp[6]; cp[6] = b1-b2; b2 = b1;
+ a1 = cp[7]; cp[7] = a1-a2; a2 = a1;
+ cp += 4;
+ } while ((int32)(cc -= 4) > 0);
+ } else {
+ cp += cc - 1;
+ do {
+ REPEAT4(stride, cp[stride] -= cp[0]; cp--)
+ } while ((int32)(cc -= stride) > 0);
+ }
+ }
+}
+
+static void
+horDiff16(TIFF* tif, tidata_t cp0, tsize_t cc)
+{
+ TIFFPredictorState* sp = PredictorState(tif);
+ tsize_t stride = sp->stride;
+ int16 *wp = (int16*) cp0;
+ tsize_t wc = cc/2;
+
+ if (wc > stride) {
+ wc -= stride;
+ wp += wc - 1;
+ do {
+ REPEAT4(stride, wp[stride] -= wp[0]; wp--)
+ wc -= stride;
+ } while ((int32) wc > 0);
+ }
+}
+
+static int
+PredictorEncodeRow(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+ TIFFPredictorState *sp = PredictorState(tif);
+
+ assert(sp != NULL);
+ assert(sp->pfunc != NULL);
+ assert(sp->coderow != NULL);
+/* XXX horizontal differencing alters user's data XXX */
+ (*sp->pfunc)(tif, bp, cc);
+ return ((*sp->coderow)(tif, bp, cc, s));
+}
+
+static int
+PredictorEncodeTile(TIFF* tif, tidata_t bp0, tsize_t cc0, tsample_t s)
+{
+ TIFFPredictorState *sp = PredictorState(tif);
+ tsize_t cc = cc0, rowsize;
+ u_char* bp = bp0;
+
+ assert(sp != NULL);
+ assert(sp->pfunc != NULL);
+ assert(sp->codetile != NULL);
+ rowsize = sp->rowsize;
+ assert(rowsize > 0);
+ while ((long)cc > 0) {
+ (*sp->pfunc)(tif, bp, (tsize_t) rowsize);
+ cc -= rowsize;
+ bp += rowsize;
+ }
+ return ((*sp->codetile)(tif, bp0, cc0, s));
+}
+
+#define FIELD_PREDICTOR (FIELD_CODEC+0) /* XXX */
+
+static const TIFFFieldInfo predictFieldInfo[] = {
+ { TIFFTAG_PREDICTOR, 1, 1, TIFF_SHORT, FIELD_PREDICTOR,
+ FALSE, FALSE, "Predictor" },
+};
+#define N(a) (sizeof (a) / sizeof (a[0]))
+
+static int
+PredictorVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ TIFFPredictorState *sp = PredictorState(tif);
+
+ switch (tag) {
+ case TIFFTAG_PREDICTOR:
+ sp->predictor = (uint16) va_arg(ap, int);
+ TIFFSetFieldBit(tif, FIELD_PREDICTOR);
+ break;
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+ tif->tif_flags |= TIFF_DIRTYDIRECT;
+ return (1);
+}
+
+static int
+PredictorVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ TIFFPredictorState *sp = PredictorState(tif);
+
+ switch (tag) {
+ case TIFFTAG_PREDICTOR:
+ *va_arg(ap, uint16*) = sp->predictor;
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return (1);
+}
+
+static void
+PredictorPrintDir(TIFF* tif, FILE* fd, long flags)
+{
+ TIFFPredictorState* sp = PredictorState(tif);
+
+ (void) flags;
+ if (TIFFFieldSet(tif,FIELD_PREDICTOR)) {
+ fprintf(fd, " Predictor: ");
+ switch (sp->predictor) {
+ case 1: fprintf(fd, "none "); break;
+ case 2: fprintf(fd, "horizontal differencing "); break;
+ }
+ fprintf(fd, "%u (0x%x)\n", sp->predictor, sp->predictor);
+ }
+ if (sp->printdir)
+ (*sp->printdir)(tif, fd, flags);
+}
+
+int
+TIFFPredictorInit(TIFF* tif)
+{
+ TIFFPredictorState* sp = PredictorState(tif);
+
+ /*
+ * Merge codec-specific tag information and
+ * override parent get/set field methods.
+ */
+ _TIFFMergeFieldInfo(tif, predictFieldInfo, N(predictFieldInfo));
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield =
+ PredictorVGetField;/* hook for predictor tag */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield =
+ PredictorVSetField;/* hook for predictor tag */
+ sp->printdir = tif->tif_tagmethods.printdir;
+ tif->tif_tagmethods.printdir =
+ PredictorPrintDir; /* hook for predictor tag */
+
+ sp->setupdecode = tif->tif_setupdecode;
+ tif->tif_setupdecode = PredictorSetupDecode;
+ sp->setupencode = tif->tif_setupencode;
+ tif->tif_setupencode = PredictorSetupEncode;
+
+ sp->predictor = 1; /* default value */
+ sp->pfunc = NULL; /* no predictor routine */
+ return (1);
+}
diff --git a/src/tiff/tif_predict.h b/src/tiff/tif_predict.h
new file mode 100644
index 0000000..b40fb76
--- /dev/null
+++ b/src/tiff/tif_predict.h
@@ -0,0 +1,61 @@
+/* $Header: /home/terralib/src/tiff/tif_predict.h,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1995-1997 Sam Leffler
+ * Copyright (c) 1995-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _TIFFPREDICT_
+#define _TIFFPREDICT_
+/*
+ * ``Library-private'' Support for the Predictor Tag
+ */
+
+/*
+ * Codecs that want to support the Predictor tag must place
+ * this structure first in their private state block so that
+ * the predictor code can cast tif_data to find its state.
+ */
+typedef struct {
+ int predictor; /* predictor tag value */
+ int stride; /* sample stride over data */
+ tsize_t rowsize; /* tile/strip row size */
+
+ TIFFPostMethod pfunc; /* horizontal differencer/accumulator */
+ TIFFCodeMethod coderow; /* parent codec encode/decode row */
+ TIFFCodeMethod codestrip; /* parent codec encode/decode strip */
+ TIFFCodeMethod codetile; /* parent codec encode/decode tile */
+ TIFFVGetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+ TIFFPrintMethod printdir; /* super-class method */
+ TIFFBoolMethod setupdecode; /* super-class method */
+ TIFFBoolMethod setupencode; /* super-class method */
+} TIFFPredictorState;
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+extern int TIFFPredictorInit(TIFF*);
+#if defined(__cplusplus)
+}
+#endif
+#endif /* _TIFFPREDICT_ */
diff --git a/src/tiff/tif_print.c b/src/tiff/tif_print.c
new file mode 100644
index 0000000..087e565
--- /dev/null
+++ b/src/tiff/tif_print.c
@@ -0,0 +1,613 @@
+/* $Header: /home/terralib/src/tiff/tif_print.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Directory Printing Support
+ */
+#include "tiffiop.h"
+#include <stdio.h>
+
+#include <ctype.h>
+
+static const char *photoNames[] = {
+ "min-is-white", /* PHOTOMETRIC_MINISWHITE */
+ "min-is-black", /* PHOTOMETRIC_MINISBLACK */
+ "RGB color", /* PHOTOMETRIC_RGB */
+ "palette color (RGB from colormap)", /* PHOTOMETRIC_PALETTE */
+ "transparency mask", /* PHOTOMETRIC_MASK */
+ "separated", /* PHOTOMETRIC_SEPARATED */
+ "YCbCr", /* PHOTOMETRIC_YCBCR */
+ "7 (0x7)",
+ "CIE L*a*b*", /* PHOTOMETRIC_CIELAB */
+};
+#define NPHOTONAMES (sizeof (photoNames) / sizeof (photoNames[0]))
+
+static const char *orientNames[] = {
+ "0 (0x0)",
+ "row 0 top, col 0 lhs", /* ORIENTATION_TOPLEFT */
+ "row 0 top, col 0 rhs", /* ORIENTATION_TOPRIGHT */
+ "row 0 bottom, col 0 rhs", /* ORIENTATION_BOTRIGHT */
+ "row 0 bottom, col 0 lhs", /* ORIENTATION_BOTLEFT */
+ "row 0 lhs, col 0 top", /* ORIENTATION_LEFTTOP */
+ "row 0 rhs, col 0 top", /* ORIENTATION_RIGHTTOP */
+ "row 0 rhs, col 0 bottom", /* ORIENTATION_RIGHTBOT */
+ "row 0 lhs, col 0 bottom", /* ORIENTATION_LEFTBOT */
+};
+#define NORIENTNAMES (sizeof (orientNames) / sizeof (orientNames[0]))
+
+/*
+ * Print the contents of the current directory
+ * to the specified stdio file stream.
+ */
+void
+TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
+{
+ register TIFFDirectory *td;
+ char *sep;
+ uint16 i;
+ long l, n;
+
+ fprintf(fd, "TIFF Directory at offset 0x%lx\n", tif->tif_diroff);
+ td = &tif->tif_dir;
+ if (TIFFFieldSet(tif,FIELD_SUBFILETYPE)) {
+ fprintf(fd, " Subfile Type:");
+ sep = " ";
+ if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE) {
+ fprintf(fd, "%sreduced-resolution image", sep);
+ sep = "/";
+ }
+ if (td->td_subfiletype & FILETYPE_PAGE) {
+ fprintf(fd, "%smulti-page document", sep);
+ sep = "/";
+ }
+ if (td->td_subfiletype & FILETYPE_MASK)
+ fprintf(fd, "%stransparency mask", sep);
+ fprintf(fd, " (%lu = 0x%lx)\n",
+ (long) td->td_subfiletype, (long) td->td_subfiletype);
+ }
+ if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) {
+ fprintf(fd, " Image Width: %lu Image Length: %lu",
+ (u_long) td->td_imagewidth, (u_long) td->td_imagelength);
+ if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH))
+ fprintf(fd, " Image Depth: %lu",
+ (u_long) td->td_imagedepth);
+ fprintf(fd, "\n");
+ }
+
+ /* Begin Pixar */
+ if (TIFFFieldSet(tif,FIELD_IMAGEFULLWIDTH) ||
+ TIFFFieldSet(tif,FIELD_IMAGEFULLLENGTH)) {
+ fprintf(fd, " Pixar Full Image Width: %lu Full Image Length: %lu\n",
+ (u_long) td->td_imagefullwidth,
+ (u_long) td->td_imagefulllength);
+ }
+ if (TIFFFieldSet(tif,FIELD_TEXTUREFORMAT))
+ _TIFFprintAsciiTag(fd, "Texture Format", td->td_textureformat);
+ if (TIFFFieldSet(tif,FIELD_WRAPMODES))
+ _TIFFprintAsciiTag(fd, "Texture Wrap Modes", td->td_wrapmodes);
+ if (TIFFFieldSet(tif,FIELD_FOVCOT))
+ fprintf(fd, " Field of View Cotangent: %g\n", td->td_fovcot);
+ if (TIFFFieldSet(tif,FIELD_MATRIX_WORLDTOSCREEN)) {
+ typedef float Matrix[4][4];
+ Matrix* m = (Matrix*)td->td_matrixWorldToScreen;
+
+ fprintf(fd, " Matrix NP:\n\t%g %g %g %g\n\t%g %g %g %g\n\t%g %g %g %g\n\t%g %g %g %g\n",
+ (*m)[0][0], (*m)[0][1], (*m)[0][2], (*m)[0][3],
+ (*m)[1][0], (*m)[1][1], (*m)[1][2], (*m)[1][3],
+ (*m)[2][0], (*m)[2][1], (*m)[2][2], (*m)[2][3],
+ (*m)[3][0], (*m)[3][1], (*m)[3][2], (*m)[3][3]);
+ }
+ if (TIFFFieldSet(tif,FIELD_MATRIX_WORLDTOCAMERA)) {
+ typedef float Matrix[4][4];
+ Matrix* m = (Matrix*)td->td_matrixWorldToCamera;
+
+ fprintf(fd, " Matrix Nl:\n\t%g %g %g %g\n\t%g %g %g %g\n\t%g %g %g %g\n\t%g %g %g %g\n",
+ (*m)[0][0], (*m)[0][1], (*m)[0][2], (*m)[0][3],
+ (*m)[1][0], (*m)[1][1], (*m)[1][2], (*m)[1][3],
+ (*m)[2][0], (*m)[2][1], (*m)[2][2], (*m)[2][3],
+ (*m)[3][0], (*m)[3][1], (*m)[3][2], (*m)[3][3]);
+ }
+ /* End Pixar */
+
+ if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS)) {
+ fprintf(fd, " Tile Width: %lu Tile Length: %lu",
+ (u_long) td->td_tilewidth, (u_long) td->td_tilelength);
+ if (TIFFFieldSet(tif,FIELD_TILEDEPTH))
+ fprintf(fd, " Tile Depth: %lu",
+ (u_long) td->td_tiledepth);
+ fprintf(fd, "\n");
+ }
+ if (TIFFFieldSet(tif,FIELD_RESOLUTION)) {
+ fprintf(fd, " Resolution: %g, %g",
+ td->td_xresolution, td->td_yresolution);
+ if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT)) {
+ switch (td->td_resolutionunit) {
+ case RESUNIT_NONE:
+ fprintf(fd, " (unitless)");
+ break;
+ case RESUNIT_INCH:
+ fprintf(fd, " pixels/inch");
+ break;
+ case RESUNIT_CENTIMETER:
+ fprintf(fd, " pixels/cm");
+ break;
+ default:
+ fprintf(fd, " (unit %u = 0x%x)",
+ td->td_resolutionunit,
+ td->td_resolutionunit);
+ break;
+ }
+ }
+ fprintf(fd, "\n");
+ }
+ if (TIFFFieldSet(tif,FIELD_POSITION))
+ fprintf(fd, " Position: %g, %g\n",
+ td->td_xposition, td->td_yposition);
+ if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
+ fprintf(fd, " Bits/Sample: %u\n", td->td_bitspersample);
+ if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT)) {
+ fprintf(fd, " Sample Format: ");
+ switch (td->td_sampleformat) {
+ case SAMPLEFORMAT_VOID:
+ fprintf(fd, "void\n");
+ break;
+ case SAMPLEFORMAT_INT:
+ fprintf(fd, "signed integer\n");
+ break;
+ case SAMPLEFORMAT_UINT:
+ fprintf(fd, "unsigned integer\n");
+ break;
+ case SAMPLEFORMAT_IEEEFP:
+ fprintf(fd, "IEEE floating point\n");
+ break;
+ case SAMPLEFORMAT_COMPLEXINT:
+ fprintf(fd, "complex signed integer\n");
+ break;
+ case SAMPLEFORMAT_COMPLEXIEEEFP:
+ fprintf(fd, "complex IEEE floating point\n");
+ break;
+ default:
+ fprintf(fd, "%u (0x%x)\n",
+ td->td_sampleformat, td->td_sampleformat);
+ break;
+ }
+ }
+ if (TIFFFieldSet(tif,FIELD_COMPRESSION)) {
+ const TIFFCodec* c = TIFFFindCODEC(td->td_compression);
+ fprintf(fd, " Compression Scheme: ");
+ if (c)
+ fprintf(fd, "%s\n", c->name);
+ else
+ fprintf(fd, "%u (0x%x)\n",
+ td->td_compression, td->td_compression);
+ }
+ if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) {
+ fprintf(fd, " Photometric Interpretation: ");
+ if (td->td_photometric < NPHOTONAMES)
+ fprintf(fd, "%s\n", photoNames[td->td_photometric]);
+ else {
+ switch (td->td_photometric) {
+ case PHOTOMETRIC_LOGL:
+ fprintf(fd, "CIE Log2(L)\n");
+ break;
+ case PHOTOMETRIC_LOGLUV:
+ fprintf(fd, "CIE Log2(L) (u',v')\n");
+ break;
+ default:
+ fprintf(fd, "%u (0x%x)\n",
+ td->td_photometric, td->td_photometric);
+ break;
+ }
+ }
+ }
+ if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES) && td->td_extrasamples) {
+ fprintf(fd, " Extra Samples: %u<", td->td_extrasamples);
+ sep = "";
+ for (i = 0; i < td->td_extrasamples; i++) {
+ switch (td->td_sampleinfo[i]) {
+ case EXTRASAMPLE_UNSPECIFIED:
+ fprintf(fd, "%sunspecified", sep);
+ break;
+ case EXTRASAMPLE_ASSOCALPHA:
+ fprintf(fd, "%sassoc-alpha", sep);
+ break;
+ case EXTRASAMPLE_UNASSALPHA:
+ fprintf(fd, "%sunassoc-alpha", sep);
+ break;
+ default:
+ fprintf(fd, "%s%u (0x%x)", sep,
+ td->td_sampleinfo[i], td->td_sampleinfo[i]);
+ break;
+ }
+ sep = ", ";
+ }
+ fprintf(fd, ">\n");
+ }
+ if (TIFFFieldSet(tif,FIELD_STONITS)) {
+ fprintf(fd, " Sample to Nits conversion factor: %.4e\n",
+ td->td_stonits);
+ }
+#ifdef CMYK_SUPPORT
+ if (TIFFFieldSet(tif,FIELD_INKSET)) {
+ fprintf(fd, " Ink Set: ");
+ switch (td->td_inkset) {
+ case INKSET_CMYK:
+ fprintf(fd, "CMYK\n");
+ break;
+ default:
+ fprintf(fd, "%u (0x%x)\n",
+ td->td_inkset, td->td_inkset);
+ break;
+ }
+ }
+ if (TIFFFieldSet(tif,FIELD_INKNAMES)) {
+ char* cp;
+ fprintf(fd, " Ink Names: ");
+ i = td->td_samplesperpixel;
+ sep = "";
+ for (cp = td->td_inknames; i > 0; cp = strchr(cp,'\0')+1, i--) {
+ fprintf(fd, "%s", sep);
+ _TIFFprintAscii(fd, cp);
+ sep = ", ";
+ }
+ }
+ if (TIFFFieldSet(tif,FIELD_NUMBEROFINKS))
+ fprintf(fd, " Number of Inks: %u\n", td->td_ninks);
+ if (TIFFFieldSet(tif,FIELD_DOTRANGE))
+ fprintf(fd, " Dot Range: %u-%u\n",
+ td->td_dotrange[0], td->td_dotrange[1]);
+ if (TIFFFieldSet(tif,FIELD_TARGETPRINTER))
+ _TIFFprintAsciiTag(fd, "Target Printer", td->td_targetprinter);
+#endif
+ if (TIFFFieldSet(tif,FIELD_THRESHHOLDING)) {
+ fprintf(fd, " Thresholding: ");
+ switch (td->td_threshholding) {
+ case THRESHHOLD_BILEVEL:
+ fprintf(fd, "bilevel art scan\n");
+ break;
+ case THRESHHOLD_HALFTONE:
+ fprintf(fd, "halftone or dithered scan\n");
+ break;
+ case THRESHHOLD_ERRORDIFFUSE:
+ fprintf(fd, "error diffused\n");
+ break;
+ default:
+ fprintf(fd, "%u (0x%x)\n",
+ td->td_threshholding, td->td_threshholding);
+ break;
+ }
+ }
+ if (TIFFFieldSet(tif,FIELD_FILLORDER)) {
+ fprintf(fd, " FillOrder: ");
+ switch (td->td_fillorder) {
+ case FILLORDER_MSB2LSB:
+ fprintf(fd, "msb-to-lsb\n");
+ break;
+ case FILLORDER_LSB2MSB:
+ fprintf(fd, "lsb-to-msb\n");
+ break;
+ default:
+ fprintf(fd, "%u (0x%x)\n",
+ td->td_fillorder, td->td_fillorder);
+ break;
+ }
+ }
+#ifdef YCBCR_SUPPORT
+ if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING))
+ {
+ /*
+ * For hacky reasons (see tif_jpeg.c - JPEGFixupTestSubsampling),
+ * we need to fetch this rather than trust what is in our
+ * structures.
+ */
+ uint16 subsampling[2];
+
+ TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING,
+ subsampling + 0, subsampling + 1 );
+ fprintf(fd, " YCbCr Subsampling: %u, %u\n",
+ subsampling[0], subsampling[1] );
+ }
+ if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING)) {
+ fprintf(fd, " YCbCr Positioning: ");
+ switch (td->td_ycbcrpositioning) {
+ case YCBCRPOSITION_CENTERED:
+ fprintf(fd, "centered\n");
+ break;
+ case YCBCRPOSITION_COSITED:
+ fprintf(fd, "cosited\n");
+ break;
+ default:
+ fprintf(fd, "%u (0x%x)\n",
+ td->td_ycbcrpositioning, td->td_ycbcrpositioning);
+ break;
+ }
+ }
+ if (TIFFFieldSet(tif,FIELD_YCBCRCOEFFICIENTS))
+ fprintf(fd, " YCbCr Coefficients: %g, %g, %g\n",
+ td->td_ycbcrcoeffs[0],
+ td->td_ycbcrcoeffs[1],
+ td->td_ycbcrcoeffs[2]);
+#endif
+ if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS))
+ fprintf(fd, " Halftone Hints: light %u dark %u\n",
+ td->td_halftonehints[0], td->td_halftonehints[1]);
+ if (TIFFFieldSet(tif,FIELD_ARTIST))
+ _TIFFprintAsciiTag(fd, "Artist", td->td_artist);
+ if (TIFFFieldSet(tif,FIELD_DATETIME))
+ _TIFFprintAsciiTag(fd, "Date & Time", td->td_datetime);
+ if (TIFFFieldSet(tif,FIELD_HOSTCOMPUTER))
+ _TIFFprintAsciiTag(fd, "Host Computer", td->td_hostcomputer);
+ if (TIFFFieldSet(tif,FIELD_COPYRIGHT))
+ _TIFFprintAsciiTag(fd, "Copyright", td->td_copyright);
+ if (TIFFFieldSet(tif,FIELD_DOCUMENTNAME))
+ _TIFFprintAsciiTag(fd, "Document Name", td->td_documentname);
+ if (TIFFFieldSet(tif,FIELD_IMAGEDESCRIPTION))
+ _TIFFprintAsciiTag(fd, "Image Description", td->td_imagedescription);
+ if (TIFFFieldSet(tif,FIELD_MAKE))
+ _TIFFprintAsciiTag(fd, "Make", td->td_make);
+ if (TIFFFieldSet(tif,FIELD_MODEL))
+ _TIFFprintAsciiTag(fd, "Model", td->td_model);
+ if (TIFFFieldSet(tif,FIELD_ORIENTATION)) {
+ fprintf(fd, " Orientation: ");
+ if (td->td_orientation < NORIENTNAMES)
+ fprintf(fd, "%s\n", orientNames[td->td_orientation]);
+ else
+ fprintf(fd, "%u (0x%x)\n",
+ td->td_orientation, td->td_orientation);
+ }
+ if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
+ fprintf(fd, " Samples/Pixel: %u\n", td->td_samplesperpixel);
+ if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP)) {
+ fprintf(fd, " Rows/Strip: ");
+ if (td->td_rowsperstrip == (uint32) -1)
+ fprintf(fd, "(infinite)\n");
+ else
+ fprintf(fd, "%lu\n", (u_long) td->td_rowsperstrip);
+ }
+ if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE))
+ fprintf(fd, " Min Sample Value: %u\n", td->td_minsamplevalue);
+ if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE))
+ fprintf(fd, " Max Sample Value: %u\n", td->td_maxsamplevalue);
+ if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE))
+ fprintf(fd, " SMin Sample Value: %g\n",
+ td->td_sminsamplevalue);
+ if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE))
+ fprintf(fd, " SMax Sample Value: %g\n",
+ td->td_smaxsamplevalue);
+ if (TIFFFieldSet(tif,FIELD_PLANARCONFIG)) {
+ fprintf(fd, " Planar Configuration: ");
+ switch (td->td_planarconfig) {
+ case PLANARCONFIG_CONTIG:
+ fprintf(fd, "single image plane\n");
+ break;
+ case PLANARCONFIG_SEPARATE:
+ fprintf(fd, "separate image planes\n");
+ break;
+ default:
+ fprintf(fd, "%u (0x%x)\n",
+ td->td_planarconfig, td->td_planarconfig);
+ break;
+ }
+ }
+ if (TIFFFieldSet(tif,FIELD_PAGENAME))
+ _TIFFprintAsciiTag(fd, "Page Name", td->td_pagename);
+ if (TIFFFieldSet(tif,FIELD_PAGENUMBER))
+ fprintf(fd, " Page Number: %u-%u\n",
+ td->td_pagenumber[0], td->td_pagenumber[1]);
+ if (TIFFFieldSet(tif,FIELD_COLORMAP)) {
+ fprintf(fd, " Color Map: ");
+ if (flags & TIFFPRINT_COLORMAP) {
+ fprintf(fd, "\n");
+ n = 1L<<td->td_bitspersample;
+ for (l = 0; l < n; l++)
+ fprintf(fd, " %5lu: %5u %5u %5u\n",
+ l,
+ td->td_colormap[0][l],
+ td->td_colormap[1][l],
+ td->td_colormap[2][l]);
+ } else
+ fprintf(fd, "(present)\n");
+ }
+#ifdef COLORIMETRY_SUPPORT
+ if (TIFFFieldSet(tif,FIELD_WHITEPOINT))
+ fprintf(fd, " White Point: %g-%g\n",
+ td->td_whitepoint[0], td->td_whitepoint[1]);
+ if (TIFFFieldSet(tif,FIELD_PRIMARYCHROMAS))
+ fprintf(fd, " Primary Chromaticities: %g,%g %g,%g %g,%g\n",
+ td->td_primarychromas[0], td->td_primarychromas[1],
+ td->td_primarychromas[2], td->td_primarychromas[3],
+ td->td_primarychromas[4], td->td_primarychromas[5]);
+ if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE)) {
+ fprintf(fd, " Reference Black/White:\n");
+ for (i = 0; i < td->td_samplesperpixel; i++)
+ fprintf(fd, " %2d: %5g %5g\n",
+ i,
+ td->td_refblackwhite[2*i+0],
+ td->td_refblackwhite[2*i+1]);
+ }
+ if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) {
+ fprintf(fd, " Transfer Function: ");
+ if (flags & TIFFPRINT_CURVES) {
+ fprintf(fd, "\n");
+ n = 1L<<td->td_bitspersample;
+ for (l = 0; l < n; l++) {
+ fprintf(fd, " %2lu: %5u",
+ l, td->td_transferfunction[0][l]);
+ for (i = 1; i < td->td_samplesperpixel; i++)
+ fprintf(fd, " %5u",
+ td->td_transferfunction[i][l]);
+ fputc('\n', fd);
+ }
+ } else
+ fprintf(fd, "(present)\n");
+ }
+#endif
+#ifdef ICC_SUPPORT
+ if (TIFFFieldSet(tif,FIELD_ICCPROFILE))
+ fprintf(fd, " ICC Profile: <present>, %lu bytes\n",
+ (u_long) td->td_profileLength);
+#endif
+#ifdef PHOTOSHOP_SUPPORT
+ if (TIFFFieldSet(tif,FIELD_PHOTOSHOP))
+ fprintf(fd, " Photoshop Data: <present>, %lu bytes\n",
+ (u_long) td->td_photoshopLength);
+#endif
+#ifdef IPTC_SUPPORT
+ if (TIFFFieldSet(tif,FIELD_RICHTIFFIPTC))
+ fprintf(fd, " RichTIFFIPTC Data: <present>, %lu bytes\n",
+ (u_long) td->td_richtiffiptcLength);
+#endif
+#if SUBIFD_SUPPORT
+ if (TIFFFieldSet(tif, FIELD_SUBIFD)) {
+ fprintf(fd, " SubIFD Offsets:");
+ for (i = 0; i < td->td_nsubifd; i++)
+ fprintf(fd, " %5lu", (long) td->td_subifd[i]);
+ fputc('\n', fd);
+ }
+#endif
+ /*
+ ** Custom tag support.
+ */
+ {
+ int i;
+ short count;
+
+ count = (short) TIFFGetTagListCount( tif );
+ for( i = 0; i < count; i++ )
+ {
+ ttag_t tag = TIFFGetTagListEntry( tif, i );
+ const TIFFFieldInfo *fld;
+
+ fld = TIFFFieldWithTag( tif, tag );
+ if( fld == NULL )
+ continue;
+
+ if( fld->field_passcount )
+ {
+ short value_count;
+ int j;
+ void *raw_data;
+
+ if( TIFFGetField( tif, tag, &value_count, &raw_data ) != 1 )
+ continue;
+
+ fprintf(fd, " %s: ", fld->field_name );
+
+ for( j = 0; j < value_count; j++ )
+ {
+ if( fld->field_type == TIFF_BYTE )
+ fprintf( fd, "%d",
+ (int) ((char *) raw_data)[j] );
+ else if( fld->field_type == TIFF_SHORT )
+ fprintf( fd, "%d",
+ (int) ((short *) raw_data)[j] );
+ else if( fld->field_type == TIFF_LONG )
+ fprintf( fd, "%d",
+ (int) ((long *) raw_data)[j] );
+ else if( fld->field_type == TIFF_RATIONAL )
+ fprintf( fd, "%f",
+ ((float *) raw_data)[j] );
+ else if( fld->field_type == TIFF_ASCII )
+ {
+ fprintf( fd, "%s",
+ (char *) raw_data );
+ break;
+ }
+ else if( fld->field_type == TIFF_DOUBLE )
+ fprintf( fd, "%f",
+ ((double *) raw_data)[j] );
+ else if( fld->field_type == TIFF_FLOAT )
+ fprintf( fd, "%f",
+ ((float *) raw_data)[j] );
+ else
+ {
+ fprintf( fd,
+ "<unsupported data type in TIFFPrint>" );
+ break;
+ }
+
+ if( j < value_count-1 )
+ fprintf( fd, "," );
+ }
+ fprintf( fd, "\n" );
+ }
+ else if( !fld->field_passcount
+ && fld->field_type == TIFF_ASCII )
+ {
+ char *data;
+
+ if( TIFFGetField( tif, tag, &data ) )
+ fprintf(fd, " %s: %s\n", fld->field_name, data );
+ }
+ }
+ }
+
+ if (tif->tif_tagmethods.printdir)
+ (*tif->tif_tagmethods.printdir)(tif, fd, flags);
+ if ((flags & TIFFPRINT_STRIPS) &&
+ TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) {
+ tstrip_t s;
+
+ fprintf(fd, " %lu %s:\n",
+ (long) td->td_nstrips,
+ isTiled(tif) ? "Tiles" : "Strips");
+ for (s = 0; s < td->td_nstrips; s++)
+ fprintf(fd, " %3lu: [%8lu, %8lu]\n",
+ (u_long) s,
+ (u_long) td->td_stripoffset[s],
+ (u_long) td->td_stripbytecount[s]);
+ }
+}
+
+void
+_TIFFprintAscii(FILE* fd, const char* cp)
+{
+ for (; *cp != '\0'; cp++) {
+ const char* tp;
+
+ if (isprint(*cp)) {
+ fputc(*cp, fd);
+ continue;
+ }
+ for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++)
+ if (*tp++ == *cp)
+ break;
+ if (*tp)
+ fprintf(fd, "\\%c", *tp);
+ else
+ fprintf(fd, "\\%03o", *cp & 0xff);
+ }
+}
+
+void
+_TIFFprintAsciiTag(FILE* fd, const char* name, const char* value)
+{
+ fprintf(fd, " %s: \"", name);
+ _TIFFprintAscii(fd, value);
+ fprintf(fd, "\"\n");
+}
diff --git a/src/tiff/tif_read.c b/src/tiff/tif_read.c
new file mode 100644
index 0000000..4017d64
--- /dev/null
+++ b/src/tiff/tif_read.c
@@ -0,0 +1,637 @@
+/* $Header: /home/terralib/src/tiff/tif_read.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ * Scanline-oriented Read Support
+ */
+#include "tiffiop.h"
+#include <stdio.h>
+#include <assert.h>
+
+ int TIFFFillStrip(TIFF*, tstrip_t);
+ int TIFFFillTile(TIFF*, ttile_t);
+static int TIFFStartStrip(TIFF*, tstrip_t);
+static int TIFFStartTile(TIFF*, ttile_t);
+static int TIFFCheckRead(TIFF*, int);
+
+#define NOSTRIP ((tstrip_t) -1) /* undefined state */
+#define NOTILE ((ttile_t) -1) /* undefined state */
+
+/*
+ * Seek to a random row+sample in a file.
+ */
+static int
+TIFFSeek(TIFF* tif, uint32 row, tsample_t sample)
+{
+ register TIFFDirectory *td = &tif->tif_dir;
+ tstrip_t strip;
+
+ if (row >= td->td_imagelength) { /* out of range */
+ TIFFError(tif->tif_name, "%lu: Row out of range, max %lu",
+ (u_long) row, (u_long) td->td_imagelength);
+ return (0);
+ }
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
+ if (sample >= td->td_samplesperpixel) {
+ TIFFError(tif->tif_name,
+ "%lu: Sample out of range, max %lu",
+ (u_long) sample, (u_long) td->td_samplesperpixel);
+ return (0);
+ }
+ strip = sample*td->td_stripsperimage + row/td->td_rowsperstrip;
+ } else
+ strip = row / td->td_rowsperstrip;
+ if (strip != tif->tif_curstrip) { /* different strip, refill */
+ if (!TIFFFillStrip(tif, strip))
+ return (0);
+ } else if (row < tif->tif_row) {
+ /*
+ * Moving backwards within the same strip: backup
+ * to the start and then decode forward (below).
+ *
+ * NB: If you're planning on lots of random access within a
+ * strip, it's better to just read and decode the entire
+ * strip, and then access the decoded data in a random fashion.
+ */
+ if (!TIFFStartStrip(tif, strip))
+ return (0);
+ }
+ if (row != tif->tif_row) {
+ /*
+ * Seek forward to the desired row.
+ */
+ if (!(*tif->tif_seek)(tif, row - tif->tif_row))
+ return (0);
+ tif->tif_row = row;
+ }
+ return (1);
+}
+
+int
+TIFFReadScanline(TIFF* tif, tdata_t buf, uint32 row, tsample_t sample)
+{
+ int e;
+
+ if (!TIFFCheckRead(tif, 0))
+ return (-1);
+ if( (e = TIFFSeek(tif, row, sample)) != 0) {
+ /*
+ * Decompress desired row into user buffer.
+ */
+ e = (*tif->tif_decoderow)
+ (tif, (tidata_t) buf, tif->tif_scanlinesize, sample);
+
+ /* we are now poised at the beginning of the next row */
+ tif->tif_row = row + 1;
+
+ if (e)
+ (*tif->tif_postdecode)(tif, (tidata_t) buf,
+ tif->tif_scanlinesize);
+ }
+ return (e > 0 ? 1 : -1);
+}
+
+/*
+ * Read a strip of data and decompress the specified
+ * amount into the user-supplied buffer.
+ */
+tsize_t
+TIFFReadEncodedStrip(TIFF* tif, tstrip_t strip, tdata_t buf, tsize_t size)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ uint32 nrows;
+ tsize_t stripsize;
+ tstrip_t sep_strip, strips_per_sep;
+
+ if (!TIFFCheckRead(tif, 0))
+ return (-1);
+ if (strip >= td->td_nstrips) {
+ TIFFError(tif->tif_name, "%ld: Strip out of range, max %ld",
+ (long) strip, (long) td->td_nstrips);
+ return (-1);
+ }
+ /*
+ * Calculate the strip size according to the number of
+ * rows in the strip (check for truncated last strip on any
+ * of the separations).
+ */
+ if( td->td_rowsperstrip >= td->td_imagelength )
+ strips_per_sep = 1;
+ else
+ strips_per_sep = (td->td_imagelength+td->td_rowsperstrip-1)
+ / td->td_rowsperstrip;
+
+ sep_strip = strip % strips_per_sep;
+
+ if (sep_strip != strips_per_sep-1 ||
+ (nrows = td->td_imagelength % td->td_rowsperstrip) == 0)
+ nrows = td->td_rowsperstrip;
+
+ stripsize = TIFFVStripSize(tif, nrows);
+ if (size == (tsize_t) -1)
+ size = stripsize;
+ else if (size > stripsize)
+ size = stripsize;
+ if (TIFFFillStrip(tif, strip)
+ && (*tif->tif_decodestrip)(tif, (tidata_t) buf, size,
+ (tsample_t)(strip / td->td_stripsperimage)) > 0 ) {
+ (*tif->tif_postdecode)(tif, (tidata_t) buf, size);
+ return (size);
+ } else
+ return ((tsize_t) -1);
+}
+
+static tsize_t
+TIFFReadRawStrip1(TIFF* tif,
+ tstrip_t strip, tdata_t buf, tsize_t size, const char* module)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if (!isMapped(tif)) {
+ tsize_t cc;
+
+ if (!SeekOK(tif, td->td_stripoffset[strip])) {
+ TIFFError(module,
+ "%s: Seek error at scanline %lu, strip %lu",
+ tif->tif_name,
+ (u_long) tif->tif_row, (u_long) strip);
+ return (-1);
+ }
+ cc = TIFFReadFile(tif, buf, size);
+ if (cc != size) {
+ TIFFError(module,
+ "%s: Read error at scanline %lu; got %lu bytes, expected %lu",
+ tif->tif_name,
+ (u_long) tif->tif_row,
+ (u_long) cc,
+ (u_long) size);
+ return (-1);
+ }
+ } else {
+ if (td->td_stripoffset[strip] + size > tif->tif_size) {
+ TIFFError(module,
+ "%s: Read error at scanline %lu, strip %lu; got %lu bytes, expected %lu",
+ tif->tif_name,
+ (u_long) tif->tif_row,
+ (u_long) strip,
+ (u_long) tif->tif_size - td->td_stripoffset[strip],
+ (u_long) size);
+ return (-1);
+ }
+ _TIFFmemcpy(buf, tif->tif_base + td->td_stripoffset[strip], size);
+ }
+ return (size);
+}
+
+/*
+ * Read a strip of data from the file.
+ */
+tsize_t
+TIFFReadRawStrip(TIFF* tif, tstrip_t strip, tdata_t buf, tsize_t size)
+{
+ static const char module[] = "TIFFReadRawStrip";
+ TIFFDirectory *td = &tif->tif_dir;
+ tsize_t bytecount;
+
+ if (!TIFFCheckRead(tif, 0))
+ return ((tsize_t) -1);
+ if (strip >= td->td_nstrips) {
+ TIFFError(tif->tif_name, "%lu: Strip out of range, max %lu",
+ (u_long) strip, (u_long) td->td_nstrips);
+ return ((tsize_t) -1);
+ }
+ bytecount = td->td_stripbytecount[strip];
+ if (bytecount <= 0) {
+ TIFFError(tif->tif_name,
+ "%lu: Invalid strip byte count, strip %lu",
+ (u_long) bytecount, (u_long) strip);
+ return ((tsize_t) -1);
+ }
+ if (size != (tsize_t)-1 && size < bytecount)
+ bytecount = size;
+ return (TIFFReadRawStrip1(tif, strip, buf, bytecount, module));
+}
+
+/*
+ * Read the specified strip and setup for decoding.
+ * The data buffer is expanded, as necessary, to
+ * hold the strip's data.
+ */
+int
+TIFFFillStrip(TIFF* tif, tstrip_t strip)
+{
+ static const char module[] = "TIFFFillStrip";
+ TIFFDirectory *td = &tif->tif_dir;
+ tsize_t bytecount;
+
+ bytecount = td->td_stripbytecount[strip];
+ if (bytecount <= 0) {
+ TIFFError(tif->tif_name,
+ "%lu: Invalid strip byte count, strip %lu",
+ (u_long) bytecount, (u_long) strip);
+ return (0);
+ }
+ if (isMapped(tif) &&
+ (isFillOrder(tif, td->td_fillorder) || (tif->tif_flags & TIFF_NOBITREV))) {
+ /*
+ * The image is mapped into memory and we either don't
+ * need to flip bits or the compression routine is going
+ * to handle this operation itself. In this case, avoid
+ * copying the raw data and instead just reference the
+ * data from the memory mapped file image. This assumes
+ * that the decompression routines do not modify the
+ * contents of the raw data buffer (if they try to,
+ * the application will get a fault since the file is
+ * mapped read-only).
+ */
+ if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
+ _TIFFfree(tif->tif_rawdata);
+ tif->tif_flags &= ~TIFF_MYBUFFER;
+ if ( td->td_stripoffset[strip] + bytecount > tif->tif_size) {
+ /*
+ * This error message might seem strange, but it's
+ * what would happen if a read were done instead.
+ */
+ TIFFError(module,
+ "%s: Read error on strip %lu; got %lu bytes, expected %lu",
+ tif->tif_name,
+ (u_long) strip,
+ (u_long) tif->tif_size - td->td_stripoffset[strip],
+ (u_long) bytecount);
+ tif->tif_curstrip = NOSTRIP;
+ return (0);
+ }
+ tif->tif_rawdatasize = bytecount;
+ tif->tif_rawdata = tif->tif_base + td->td_stripoffset[strip];
+ } else {
+ /*
+ * Expand raw data buffer, if needed, to
+ * hold data strip coming from file
+ * (perhaps should set upper bound on
+ * the size of a buffer we'll use?).
+ */
+ if (bytecount > tif->tif_rawdatasize) {
+ tif->tif_curstrip = NOSTRIP;
+ if ((tif->tif_flags & TIFF_MYBUFFER) == 0) {
+ TIFFError(module,
+ "%s: Data buffer too small to hold strip %lu",
+ tif->tif_name, (u_long) strip);
+ return (0);
+ }
+ if (!TIFFReadBufferSetup(tif, 0,
+ TIFFroundup(bytecount, 1024)))
+ return (0);
+ }
+ if (TIFFReadRawStrip1(tif, strip, (u_char *)tif->tif_rawdata,
+ bytecount, module) != bytecount)
+ return (0);
+ if (!isFillOrder(tif, td->td_fillorder) &&
+ (tif->tif_flags & TIFF_NOBITREV) == 0)
+ TIFFReverseBits(tif->tif_rawdata, bytecount);
+ }
+ return (TIFFStartStrip(tif, strip));
+}
+
+/*
+ * Tile-oriented Read Support
+ * Contributed by Nancy Cam (Silicon Graphics).
+ */
+
+/*
+ * Read and decompress a tile of data. The
+ * tile is selected by the (x,y,z,s) coordinates.
+ */
+tsize_t
+TIFFReadTile(TIFF* tif,
+ tdata_t buf, uint32 x, uint32 y, uint32 z, tsample_t s)
+{
+ if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s))
+ return (-1);
+ return (TIFFReadEncodedTile(tif,
+ TIFFComputeTile(tif, x, y, z, s), buf, (tsize_t) -1));
+}
+
+/*
+ * Read a tile of data and decompress the specified
+ * amount into the user-supplied buffer.
+ */
+tsize_t
+TIFFReadEncodedTile(TIFF* tif, ttile_t tile, tdata_t buf, tsize_t size)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ tsize_t tilesize = tif->tif_tilesize;
+
+ if (!TIFFCheckRead(tif, 1))
+ return (-1);
+ if (tile >= td->td_nstrips) {
+ TIFFError(tif->tif_name, "%ld: Tile out of range, max %ld",
+ (long) tile, (u_long) td->td_nstrips);
+ return (-1);
+ }
+ if (size == (tsize_t) -1)
+ size = tilesize;
+ else if (size > tilesize)
+ size = tilesize;
+ if (TIFFFillTile(tif, tile) && (*tif->tif_decodetile)(tif,
+ (tidata_t) buf, size, (tsample_t)(tile/td->td_stripsperimage))) {
+ (*tif->tif_postdecode)(tif, (tidata_t) buf, size);
+ return (size);
+ } else
+ return (-1);
+}
+
+static tsize_t
+TIFFReadRawTile1(TIFF* tif,
+ ttile_t tile, tdata_t buf, tsize_t size, const char* module)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if (!isMapped(tif)) {
+ tsize_t cc;
+
+ if (!SeekOK(tif, td->td_stripoffset[tile])) {
+ TIFFError(module,
+ "%s: Seek error at row %ld, col %ld, tile %ld",
+ tif->tif_name,
+ (long) tif->tif_row,
+ (long) tif->tif_col,
+ (long) tile);
+ return ((tsize_t) -1);
+ }
+ cc = TIFFReadFile(tif, buf, size);
+ if (cc != size) {
+ TIFFError(module,
+ "%s: Read error at row %ld, col %ld; got %lu bytes, expected %lu",
+ tif->tif_name,
+ (long) tif->tif_row,
+ (long) tif->tif_col,
+ (u_long) cc,
+ (u_long) size);
+ return ((tsize_t) -1);
+ }
+ } else {
+ if (td->td_stripoffset[tile] + size > tif->tif_size) {
+ TIFFError(module,
+ "%s: Read error at row %ld, col %ld, tile %ld; got %lu bytes, expected %lu",
+ tif->tif_name,
+ (long) tif->tif_row,
+ (long) tif->tif_col,
+ (long) tile,
+ (u_long) tif->tif_size - td->td_stripoffset[tile],
+ (u_long) size);
+ return ((tsize_t) -1);
+ }
+ _TIFFmemcpy(buf, tif->tif_base + td->td_stripoffset[tile], size);
+ }
+ return (size);
+}
+
+/*
+ * Read a tile of data from the file.
+ */
+tsize_t
+TIFFReadRawTile(TIFF* tif, ttile_t tile, tdata_t buf, tsize_t size)
+{
+ static const char module[] = "TIFFReadRawTile";
+ TIFFDirectory *td = &tif->tif_dir;
+ tsize_t bytecount;
+
+ if (!TIFFCheckRead(tif, 1))
+ return ((tsize_t) -1);
+ if (tile >= td->td_nstrips) {
+ TIFFError(tif->tif_name, "%lu: Tile out of range, max %lu",
+ (u_long) tile, (u_long) td->td_nstrips);
+ return ((tsize_t) -1);
+ }
+ bytecount = td->td_stripbytecount[tile];
+ if (size != (tsize_t) -1 && size < bytecount)
+ bytecount = size;
+ return (TIFFReadRawTile1(tif, tile, buf, bytecount, module));
+}
+
+/*
+ * Read the specified tile and setup for decoding.
+ * The data buffer is expanded, as necessary, to
+ * hold the tile's data.
+ */
+int
+TIFFFillTile(TIFF* tif, ttile_t tile)
+{
+ static const char module[] = "TIFFFillTile";
+ TIFFDirectory *td = &tif->tif_dir;
+ tsize_t bytecount;
+
+ bytecount = td->td_stripbytecount[tile];
+ if (bytecount <= 0) {
+ TIFFError(tif->tif_name,
+ "%lu: Invalid tile byte count, tile %lu",
+ (u_long) bytecount, (u_long) tile);
+ return (0);
+ }
+ if (isMapped(tif) &&
+ (isFillOrder(tif, td->td_fillorder) || (tif->tif_flags & TIFF_NOBITREV))) {
+ /*
+ * The image is mapped into memory and we either don't
+ * need to flip bits or the compression routine is going
+ * to handle this operation itself. In this case, avoid
+ * copying the raw data and instead just reference the
+ * data from the memory mapped file image. This assumes
+ * that the decompression routines do not modify the
+ * contents of the raw data buffer (if they try to,
+ * the application will get a fault since the file is
+ * mapped read-only).
+ */
+ if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
+ _TIFFfree(tif->tif_rawdata);
+ tif->tif_flags &= ~TIFF_MYBUFFER;
+ if ( td->td_stripoffset[tile] + bytecount > tif->tif_size) {
+ tif->tif_curtile = NOTILE;
+ return (0);
+ }
+ tif->tif_rawdatasize = bytecount;
+ tif->tif_rawdata = tif->tif_base + td->td_stripoffset[tile];
+ } else {
+ /*
+ * Expand raw data buffer, if needed, to
+ * hold data tile coming from file
+ * (perhaps should set upper bound on
+ * the size of a buffer we'll use?).
+ */
+ if (bytecount > tif->tif_rawdatasize) {
+ tif->tif_curtile = NOTILE;
+ if ((tif->tif_flags & TIFF_MYBUFFER) == 0) {
+ TIFFError(module,
+ "%s: Data buffer too small to hold tile %ld",
+ tif->tif_name, (long) tile);
+ return (0);
+ }
+ if (!TIFFReadBufferSetup(tif, 0,
+ TIFFroundup(bytecount, 1024)))
+ return (0);
+ }
+ if (TIFFReadRawTile1(tif, tile, (u_char *)tif->tif_rawdata,
+ bytecount, module) != bytecount)
+ return (0);
+ if (!isFillOrder(tif, td->td_fillorder) &&
+ (tif->tif_flags & TIFF_NOBITREV) == 0)
+ TIFFReverseBits(tif->tif_rawdata, bytecount);
+ }
+ return (TIFFStartTile(tif, tile));
+}
+
+/*
+ * Setup the raw data buffer in preparation for
+ * reading a strip of raw data. If the buffer
+ * is specified as zero, then a buffer of appropriate
+ * size is allocated by the library. Otherwise,
+ * the client must guarantee that the buffer is
+ * large enough to hold any individual strip of
+ * raw data.
+ */
+int
+TIFFReadBufferSetup(TIFF* tif, tdata_t bp, tsize_t size)
+{
+ static const char module[] = "TIFFReadBufferSetup";
+
+ if (tif->tif_rawdata) {
+ if (tif->tif_flags & TIFF_MYBUFFER)
+ _TIFFfree(tif->tif_rawdata);
+ tif->tif_rawdata = NULL;
+ }
+ if (bp) {
+ tif->tif_rawdatasize = size;
+ tif->tif_rawdata = (tidata_t) bp;
+ tif->tif_flags &= ~TIFF_MYBUFFER;
+ } else {
+ tif->tif_rawdatasize = TIFFroundup(size, 1024);
+ tif->tif_rawdata = (tidata_t) _TIFFmalloc(tif->tif_rawdatasize);
+ tif->tif_flags |= TIFF_MYBUFFER;
+ }
+ if (tif->tif_rawdata == NULL) {
+ TIFFError(module,
+ "%s: No space for data buffer at scanline %ld",
+ tif->tif_name, (long) tif->tif_row);
+ tif->tif_rawdatasize = 0;
+ return (0);
+ }
+ return (1);
+}
+
+/*
+ * Set state to appear as if a
+ * strip has just been read in.
+ */
+static int
+TIFFStartStrip(TIFF* tif, tstrip_t strip)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
+ if (!(*tif->tif_setupdecode)(tif))
+ return (0);
+ tif->tif_flags |= TIFF_CODERSETUP;
+ }
+ tif->tif_curstrip = strip;
+ tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+ tif->tif_rawcp = tif->tif_rawdata;
+ tif->tif_rawcc = td->td_stripbytecount[strip];
+ return ((*tif->tif_predecode)(tif,
+ (tsample_t)(strip / td->td_stripsperimage)));
+}
+
+/*
+ * Set state to appear as if a
+ * tile has just been read in.
+ */
+static int
+TIFFStartTile(TIFF* tif, ttile_t tile)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
+ if (!(*tif->tif_setupdecode)(tif))
+ return (0);
+ tif->tif_flags |= TIFF_CODERSETUP;
+ }
+ tif->tif_curtile = tile;
+ tif->tif_row =
+ (tile % TIFFhowmany(td->td_imagewidth, td->td_tilewidth)) *
+ td->td_tilelength;
+ tif->tif_col =
+ (tile % TIFFhowmany(td->td_imagelength, td->td_tilelength)) *
+ td->td_tilewidth;
+ tif->tif_rawcp = tif->tif_rawdata;
+ tif->tif_rawcc = td->td_stripbytecount[tile];
+ return ((*tif->tif_predecode)(tif,
+ (tsample_t)(tile/td->td_stripsperimage)));
+}
+
+static int
+TIFFCheckRead(TIFF* tif, int tiles)
+{
+ if (tif->tif_mode == O_WRONLY) {
+ TIFFError(tif->tif_name, "File not open for reading");
+ return (0);
+ }
+ if (tiles ^ isTiled(tif)) {
+ TIFFError(tif->tif_name, tiles ?
+ "Can not read tiles from a stripped image" :
+ "Can not read scanlines from a tiled image");
+ return (0);
+ }
+ return (1);
+}
+
+void
+_TIFFNoPostDecode(TIFF* tif, tidata_t buf, tsize_t cc)
+{
+ (void) tif; (void) buf; (void) cc;
+}
+
+void
+_TIFFSwab16BitData(TIFF* tif, tidata_t buf, tsize_t cc)
+{
+ (void) tif;
+ assert((cc & 1) == 0);
+ TIFFSwabArrayOfShort((uint16*) buf, cc/2);
+}
+
+void
+_TIFFSwab32BitData(TIFF* tif, tidata_t buf, tsize_t cc)
+{
+ (void) tif;
+ assert((cc & 3) == 0);
+ TIFFSwabArrayOfLong((uint32*) buf, cc/4);
+}
+
+void
+_TIFFSwab64BitData(TIFF* tif, tidata_t buf, tsize_t cc)
+{
+ (void) tif;
+ assert((cc & 7) == 0);
+ TIFFSwabArrayOfDouble((double*) buf, cc/8);
+}
diff --git a/src/tiff/tif_strip.c b/src/tiff/tif_strip.c
new file mode 100644
index 0000000..e1e299b
--- /dev/null
+++ b/src/tiff/tif_strip.c
@@ -0,0 +1,217 @@
+/* $Header: /home/terralib/src/tiff/tif_strip.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1991-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Strip-organized Image Support Routines.
+ */
+#include "tiffiop.h"
+
+/*
+ * Compute which strip a (row,sample) value is in.
+ */
+tstrip_t
+TIFFComputeStrip(TIFF* tif, uint32 row, tsample_t sample)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ tstrip_t strip;
+
+ strip = row / td->td_rowsperstrip;
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
+ if (sample >= td->td_samplesperpixel) {
+ TIFFError(tif->tif_name,
+ "%u: Sample out of range, max %u",
+ sample, td->td_samplesperpixel);
+ return ((tstrip_t) 0);
+ }
+ strip += sample*td->td_stripsperimage;
+ }
+ return (strip);
+}
+
+/*
+ * Compute how many strips are in an image.
+ */
+tstrip_t
+TIFFNumberOfStrips(TIFF* tif)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ tstrip_t nstrips;
+
+ nstrips = (td->td_rowsperstrip == (uint32) -1 ?
+ (td->td_imagelength != 0 ? 1 : 0) :
+ TIFFhowmany(td->td_imagelength, td->td_rowsperstrip));
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ nstrips *= td->td_samplesperpixel;
+ return (nstrips);
+}
+
+/*
+ * Compute the # bytes in a variable height, row-aligned strip.
+ */
+tsize_t
+TIFFVStripSize(TIFF* tif, uint32 nrows)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if (nrows == (uint32) -1)
+ nrows = td->td_imagelength;
+#ifdef YCBCR_SUPPORT
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
+ td->td_photometric == PHOTOMETRIC_YCBCR &&
+ !isUpSampled(tif)) {
+ /*
+ * Packed YCbCr data contain one Cb+Cr for every
+ * HorizontalSampling*VerticalSampling Y values.
+ * Must also roundup width and height when calculating
+ * since images that are not a multiple of the
+ * horizontal/vertical subsampling area include
+ * YCbCr data for the extended image.
+ */
+ uint16 ycbcrsubsampling[2];
+ tsize_t w, scanline, samplingarea;
+
+ TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING,
+ ycbcrsubsampling + 0,
+ ycbcrsubsampling + 1 );
+
+ w = TIFFroundup(td->td_imagewidth, ycbcrsubsampling[0]);
+ scanline = TIFFhowmany(w*td->td_bitspersample, 8);
+ samplingarea = ycbcrsubsampling[0]*ycbcrsubsampling[1];
+ nrows = TIFFroundup(nrows, ycbcrsubsampling[1]);
+ /* NB: don't need TIFFhowmany here 'cuz everything is rounded */
+ return ((tsize_t)
+ (nrows*scanline + 2*(nrows*scanline / samplingarea)));
+ } else
+#endif
+ return ((tsize_t)(nrows * TIFFScanlineSize(tif)));
+}
+
+
+/*
+ * Compute the # bytes in a raw strip.
+ */
+tsize_t
+TIFFRawStripSize(TIFF* tif, tstrip_t strip)
+{
+ TIFFDirectory* td = &tif->tif_dir;
+ tsize_t bytecount = td->td_stripbytecount[strip];
+
+ if (bytecount <= 0) {
+ TIFFError(tif->tif_name,
+ "%lu: Invalid strip byte count, strip %lu",
+ (u_long) bytecount, (u_long) strip);
+ bytecount = (tsize_t) -1;
+ }
+
+ return bytecount;
+}
+
+/*
+ * Compute the # bytes in a (row-aligned) strip.
+ *
+ * Note that if RowsPerStrip is larger than the
+ * recorded ImageLength, then the strip size is
+ * truncated to reflect the actual space required
+ * to hold the strip.
+ */
+tsize_t
+TIFFStripSize(TIFF* tif)
+{
+ TIFFDirectory* td = &tif->tif_dir;
+ uint32 rps = td->td_rowsperstrip;
+ if (rps > td->td_imagelength)
+ rps = td->td_imagelength;
+ return (TIFFVStripSize(tif, rps));
+}
+
+/*
+ * Compute a default strip size based on the image
+ * characteristics and a requested value. If the
+ * request is <1 then we choose a strip size according
+ * to certain heuristics.
+ */
+uint32
+TIFFDefaultStripSize(TIFF* tif, uint32 request)
+{
+ return (*tif->tif_defstripsize)(tif, request);
+}
+
+uint32
+_TIFFDefaultStripSize(TIFF* tif, uint32 s)
+{
+ if ((int32) s < 1) {
+ /*
+ * If RowsPerStrip is unspecified, try to break the
+ * image up into strips that are approximately 8Kbytes.
+ */
+ tsize_t scanline = TIFFScanlineSize(tif);
+ s = (uint32)(8*1024) / (scanline == 0 ? 1 : scanline);
+ if (s == 0) /* very wide images */
+ s = 1;
+ }
+ return (s);
+}
+
+/*
+ * Return the number of bytes to read/write in a call to
+ * one of the scanline-oriented i/o routines. Note that
+ * this number may be 1/samples-per-pixel if data is
+ * stored as separate planes.
+ */
+tsize_t
+TIFFScanlineSize(TIFF* tif)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ tsize_t scanline;
+
+ scanline = td->td_bitspersample * td->td_imagewidth;
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG)
+ scanline *= td->td_samplesperpixel;
+ return ((tsize_t) TIFFhowmany(scanline, 8));
+}
+
+/*
+ * Return the number of bytes required to store a complete
+ * decoded and packed raster scanline (as opposed to the
+ * I/O size returned by TIFFScanlineSize which may be less
+ * if data is store as separate planes).
+ */
+tsize_t
+TIFFRasterScanlineSize(TIFF* tif)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ tsize_t scanline;
+
+ scanline = td->td_bitspersample * td->td_imagewidth;
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
+ scanline *= td->td_samplesperpixel;
+ return ((tsize_t) TIFFhowmany(scanline, 8));
+ } else
+ return ((tsize_t)
+ TIFFhowmany(scanline, 8)*td->td_samplesperpixel);
+}
diff --git a/src/tiff/tif_swab.c b/src/tiff/tif_swab.c
new file mode 100644
index 0000000..2128c8a
--- /dev/null
+++ b/src/tiff/tif_swab.c
@@ -0,0 +1,217 @@
+/* $Header: /home/terralib/src/tiff/tif_swab.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library Bit & Byte Swapping Support.
+ *
+ * XXX We assume short = 16-bits and long = 32-bits XXX
+ */
+#include "tiffiop.h"
+
+#ifndef TIFFSwabShort
+void
+TIFFSwabShort(uint16* wp)
+{
+ register u_char* cp = (u_char*) wp;
+ u_char t;
+
+ t = cp[1]; cp[1] = cp[0]; cp[0] = t;
+}
+#endif
+
+#ifndef TIFFSwabLong
+void
+TIFFSwabLong(uint32* lp)
+{
+ register u_char* cp = (u_char*) lp;
+ u_char t;
+
+ t = cp[3]; cp[3] = cp[0]; cp[0] = t;
+ t = cp[2]; cp[2] = cp[1]; cp[1] = t;
+}
+#endif
+
+#ifndef TIFFSwabArrayOfShort
+void
+TIFFSwabArrayOfShort(uint16* wp, register u_long n)
+{
+ register u_char* cp;
+ register u_char t;
+
+ /* XXX unroll loop some */
+ while (n-- > 0) {
+ cp = (u_char*) wp;
+ t = cp[1]; cp[1] = cp[0]; cp[0] = t;
+ wp++;
+ }
+}
+#endif
+
+#ifndef TIFFSwabArrayOfLong
+void
+TIFFSwabArrayOfLong(register uint32* lp, register u_long n)
+{
+ register unsigned char *cp;
+ register unsigned char t;
+
+ /* XXX unroll loop some */
+ while (n-- > 0) {
+ cp = (unsigned char *)lp;
+ t = cp[3]; cp[3] = cp[0]; cp[0] = t;
+ t = cp[2]; cp[2] = cp[1]; cp[1] = t;
+ lp++;
+ }
+}
+#endif
+
+#ifndef TIFFSwabDouble
+void
+TIFFSwabDouble(double *dp)
+{
+ register uint32* lp = (uint32*) dp;
+ uint32 t;
+
+ TIFFSwabArrayOfLong(lp, 2);
+ t = lp[0]; lp[0] = lp[1]; lp[1] = t;
+}
+#endif
+
+#ifndef TIFFSwabArrayOfDouble
+void
+TIFFSwabArrayOfDouble(double* dp, register u_long n)
+{
+ register uint32* lp = (uint32*) dp;
+ register uint32 t;
+
+ TIFFSwabArrayOfLong(lp, n + n);
+ while (n-- > 0) {
+ t = lp[0]; lp[0] = lp[1]; lp[1] = t;
+ lp += 2;
+ }
+}
+#endif
+
+/*
+ * Bit reversal tables. TIFFBitRevTable[<byte>] gives
+ * the bit reversed value of <byte>. Used in various
+ * places in the library when the FillOrder requires
+ * bit reversal of byte values (e.g. CCITT Fax 3
+ * encoding/decoding). TIFFNoBitRevTable is provided
+ * for algorithms that want an equivalent table that
+ * do not reverse bit values.
+ */
+static const unsigned char TIFFBitRevTable[256] = {
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+ 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+ 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+ 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+ 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+ 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+ 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+ 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+ 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+ 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+ 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+ 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+ 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+ 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+ 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+ 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+ 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+ 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+ 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+ 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+static const unsigned char TIFFNoBitRevTable[256] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
+};
+
+const unsigned char*
+TIFFGetBitRevTable(int reversed)
+{
+ return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
+}
+
+void
+TIFFReverseBits(register u_char* cp, register u_long n)
+{
+ for (; n > 8; n -= 8) {
+ cp[0] = TIFFBitRevTable[cp[0]];
+ cp[1] = TIFFBitRevTable[cp[1]];
+ cp[2] = TIFFBitRevTable[cp[2]];
+ cp[3] = TIFFBitRevTable[cp[3]];
+ cp[4] = TIFFBitRevTable[cp[4]];
+ cp[5] = TIFFBitRevTable[cp[5]];
+ cp[6] = TIFFBitRevTable[cp[6]];
+ cp[7] = TIFFBitRevTable[cp[7]];
+ cp += 8;
+ }
+ while (n-- > 0)
+ *cp = TIFFBitRevTable[*cp], cp++;
+}
diff --git a/src/tiff/tif_thunder.c b/src/tiff/tif_thunder.c
new file mode 100644
index 0000000..1608e62
--- /dev/null
+++ b/src/tiff/tif_thunder.c
@@ -0,0 +1,154 @@
+/* $Header: /home/terralib/src/tiff/tif_thunder.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef THUNDER_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * ThunderScan 4-bit Compression Algorithm Support
+ */
+
+/*
+ * ThunderScan uses an encoding scheme designed for
+ * 4-bit pixel values. Data is encoded in bytes, with
+ * each byte split into a 2-bit code word and a 6-bit
+ * data value. The encoding gives raw data, runs of
+ * pixels, or pixel values encoded as a delta from the
+ * previous pixel value. For the latter, either 2-bit
+ * or 3-bit delta values are used, with the deltas packed
+ * into a single byte.
+ */
+#define THUNDER_DATA 0x3f /* mask for 6-bit data */
+#define THUNDER_CODE 0xc0 /* mask for 2-bit code word */
+/* code values */
+#define THUNDER_RUN 0x00 /* run of pixels w/ encoded count */
+#define THUNDER_2BITDELTAS 0x40 /* 3 pixels w/ encoded 2-bit deltas */
+#define DELTA2_SKIP 2 /* skip code for 2-bit deltas */
+#define THUNDER_3BITDELTAS 0x80 /* 2 pixels w/ encoded 3-bit deltas */
+#define DELTA3_SKIP 4 /* skip code for 3-bit deltas */
+#define THUNDER_RAW 0xc0 /* raw data encoded */
+
+static const int twobitdeltas[4] = { 0, 1, 0, -1 };
+static const int threebitdeltas[8] = { 0, 1, 2, 3, 0, -3, -2, -1 };
+
+#define SETPIXEL(op, v) { \
+ lastpixel = (v) & 0xf; \
+ if (npixels++ & 1) \
+ *op++ |= lastpixel; \
+ else \
+ op[0] = (tidataval_t) (lastpixel << 4); \
+}
+
+static int
+ThunderDecode(TIFF* tif, tidata_t op, tsize_t maxpixels)
+{
+ register u_char *bp;
+ register tsize_t cc;
+ u_int lastpixel;
+ tsize_t npixels;
+
+ bp = (u_char *)tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+ lastpixel = 0;
+ npixels = 0;
+ while (cc > 0 && npixels < maxpixels) {
+ int n, delta;
+
+ n = *bp++, cc--;
+ switch (n & THUNDER_CODE) {
+ case THUNDER_RUN: /* pixel run */
+ /*
+ * Replicate the last pixel n times,
+ * where n is the lower-order 6 bits.
+ */
+ if (npixels & 1) {
+ op[0] |= lastpixel;
+ lastpixel = *op++; npixels++; n--;
+ } else
+ lastpixel |= lastpixel << 4;
+ npixels += n;
+ for (; n > 0; n -= 2)
+ *op++ = (tidataval_t) lastpixel;
+ if (n == -1)
+ *--op &= 0xf0;
+ lastpixel &= 0xf;
+ break;
+ case THUNDER_2BITDELTAS: /* 2-bit deltas */
+ if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP)
+ SETPIXEL(op, lastpixel + twobitdeltas[delta]);
+ if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP)
+ SETPIXEL(op, lastpixel + twobitdeltas[delta]);
+ if ((delta = (n & 3)) != DELTA2_SKIP)
+ SETPIXEL(op, lastpixel + twobitdeltas[delta]);
+ break;
+ case THUNDER_3BITDELTAS: /* 3-bit deltas */
+ if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP)
+ SETPIXEL(op, lastpixel + threebitdeltas[delta]);
+ if ((delta = (n & 7)) != DELTA3_SKIP)
+ SETPIXEL(op, lastpixel + threebitdeltas[delta]);
+ break;
+ case THUNDER_RAW: /* raw data */
+ SETPIXEL(op, n);
+ break;
+ }
+ }
+ tif->tif_rawcp = (tidata_t) bp;
+ tif->tif_rawcc = cc;
+ if (npixels != maxpixels) {
+ TIFFError(tif->tif_name,
+ "ThunderDecode: %s data at scanline %ld (%lu != %lu)",
+ npixels < maxpixels ? "Not enough" : "Too much",
+ (long) tif->tif_row, (long) npixels, (long) maxpixels);
+ return (0);
+ }
+ return (1);
+}
+
+static int
+ThunderDecodeRow(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
+{
+ tidata_t row = buf;
+
+ (void) s;
+ while ((long)occ > 0) {
+ if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth))
+ return (0);
+ occ -= tif->tif_scanlinesize;
+ row += tif->tif_scanlinesize;
+ }
+ return (1);
+}
+
+int
+TIFFInitThunderScan(TIFF* tif, int scheme)
+{
+ (void) scheme;
+ tif->tif_decoderow = ThunderDecodeRow;
+ tif->tif_decodestrip = ThunderDecodeRow;
+ return (1);
+}
+#endif /* THUNDER_SUPPORT */
diff --git a/src/tiff/tif_tile.c b/src/tiff/tif_tile.c
new file mode 100644
index 0000000..1512dec
--- /dev/null
+++ b/src/tiff/tif_tile.c
@@ -0,0 +1,219 @@
+/* $Header: /home/terralib/src/tiff/tif_tile.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1991-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Tiled Image Support Routines.
+ */
+#include "tiffiop.h"
+
+/*
+ * Compute which tile an (x,y,z,s) value is in.
+ */
+ttile_t
+TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, tsample_t s)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ uint32 dx = td->td_tilewidth;
+ uint32 dy = td->td_tilelength;
+ uint32 dz = td->td_tiledepth;
+ ttile_t tile = 1;
+
+ if (td->td_imagedepth == 1)
+ z = 0;
+ if (dx == (uint32) -1)
+ dx = td->td_imagewidth;
+ if (dy == (uint32) -1)
+ dy = td->td_imagelength;
+ if (dz == (uint32) -1)
+ dz = td->td_imagedepth;
+ if (dx != 0 && dy != 0 && dz != 0) {
+ uint32 xpt = TIFFhowmany(td->td_imagewidth, dx);
+ uint32 ypt = TIFFhowmany(td->td_imagelength, dy);
+ uint32 zpt = TIFFhowmany(td->td_imagedepth, dz);
+
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ tile = (xpt*ypt*zpt)*s +
+ (xpt*ypt)*(z/dz) +
+ xpt*(y/dy) +
+ x/dx;
+ else
+ tile = (xpt*ypt)*(z/dz) + xpt*(y/dy) + x/dx;
+ }
+ return (tile);
+}
+
+/*
+ * Check an (x,y,z,s) coordinate
+ * against the image bounds.
+ */
+int
+TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, tsample_t s)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if (x >= td->td_imagewidth) {
+ TIFFError(tif->tif_name, "Col %ld out of range, max %lu",
+ (long) x, (u_long) td->td_imagewidth);
+ return (0);
+ }
+ if (y >= td->td_imagelength) {
+ TIFFError(tif->tif_name, "Row %ld out of range, max %lu",
+ (long) y, (u_long) td->td_imagelength);
+ return (0);
+ }
+ if (z >= td->td_imagedepth) {
+ TIFFError(tif->tif_name, "Depth %ld out of range, max %lu",
+ (long) z, (u_long) td->td_imagedepth);
+ return (0);
+ }
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
+ s >= td->td_samplesperpixel) {
+ TIFFError(tif->tif_name, "Sample %d out of range, max %u",
+ (int) s, td->td_samplesperpixel);
+ return (0);
+ }
+ return (1);
+}
+
+/*
+ * Compute how many tiles are in an image.
+ */
+ttile_t
+TIFFNumberOfTiles(TIFF* tif)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ uint32 dx = td->td_tilewidth;
+ uint32 dy = td->td_tilelength;
+ uint32 dz = td->td_tiledepth;
+ ttile_t ntiles;
+
+ if (dx == (uint32) -1)
+ dx = td->td_imagewidth;
+ if (dy == (uint32) -1)
+ dy = td->td_imagelength;
+ if (dz == (uint32) -1)
+ dz = td->td_imagedepth;
+ ntiles = (dx == 0 || dy == 0 || dz == 0) ? 0 :
+ (TIFFhowmany(td->td_imagewidth, dx) *
+ TIFFhowmany(td->td_imagelength, dy) *
+ TIFFhowmany(td->td_imagedepth, dz));
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ ntiles *= td->td_samplesperpixel;
+ return (ntiles);
+}
+
+/*
+ * Compute the # bytes in each row of a tile.
+ */
+tsize_t
+TIFFTileRowSize(TIFF* tif)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ tsize_t rowsize;
+
+ if (td->td_tilelength == 0 || td->td_tilewidth == 0)
+ return ((tsize_t) 0);
+ rowsize = td->td_bitspersample * td->td_tilewidth;
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG)
+ rowsize *= td->td_samplesperpixel;
+ return ((tsize_t) TIFFhowmany(rowsize, 8));
+}
+
+/*
+ * Compute the # bytes in a variable length, row-aligned tile.
+ */
+tsize_t
+TIFFVTileSize(TIFF* tif, uint32 nrows)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ tsize_t tilesize;
+
+ if (td->td_tilelength == 0 || td->td_tilewidth == 0 ||
+ td->td_tiledepth == 0)
+ return ((tsize_t) 0);
+#ifdef YCBCR_SUPPORT
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
+ td->td_photometric == PHOTOMETRIC_YCBCR &&
+ !isUpSampled(tif)) {
+ /*
+ * Packed YCbCr data contain one Cb+Cr for every
+ * HorizontalSampling*VerticalSampling Y values.
+ * Must also roundup width and height when calculating
+ * since images that are not a multiple of the
+ * horizontal/vertical subsampling area include
+ * YCbCr data for the extended image.
+ */
+ tsize_t w =
+ TIFFroundup(td->td_tilewidth, td->td_ycbcrsubsampling[0]);
+ tsize_t rowsize = TIFFhowmany(w*td->td_bitspersample, 8);
+ tsize_t samplingarea =
+ td->td_ycbcrsubsampling[0]*td->td_ycbcrsubsampling[1];
+ nrows = TIFFroundup(nrows, td->td_ycbcrsubsampling[1]);
+ /* NB: don't need TIFFhowmany here 'cuz everything is rounded */
+ tilesize = nrows*rowsize + 2*(nrows*rowsize / samplingarea);
+ } else
+#endif
+ tilesize = nrows * TIFFTileRowSize(tif);
+ return ((tsize_t)(tilesize * td->td_tiledepth));
+}
+
+/*
+ * Compute the # bytes in a row-aligned tile.
+ */
+tsize_t
+TIFFTileSize(TIFF* tif)
+{
+ return (TIFFVTileSize(tif, tif->tif_dir.td_tilelength));
+}
+
+/*
+ * Compute a default tile size based on the image
+ * characteristics and a requested value. If a
+ * request is <1 then we choose a size according
+ * to certain heuristics.
+ */
+void
+TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
+{
+ (*tif->tif_deftilesize)(tif, tw, th);
+}
+
+void
+_TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
+{
+ (void) tif;
+ if (*(int32*) tw < 1)
+ *tw = 256;
+ if (*(int32*) th < 1)
+ *th = 256;
+ /* roundup to a multiple of 16 per the spec */
+ if (*tw & 0xf)
+ *tw = TIFFroundup(*tw, 16);
+ if (*th & 0xf)
+ *th = TIFFroundup(*th, 16);
+}
diff --git a/src/tiff/tif_unix.c b/src/tiff/tif_unix.c
new file mode 100644
index 0000000..6a3c874
--- /dev/null
+++ b/src/tiff/tif_unix.c
@@ -0,0 +1,228 @@
+/* $Header: /home/terralib/src/tiff/tif_unix.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library UNIX-specific Routines.
+ */
+#include "tiffiop.h"
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+static tsize_t
+_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size)
+{
+ return ((tsize_t) read((int) fd, buf, (size_t) size));
+}
+
+static tsize_t
+_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size)
+{
+ return ((tsize_t) write((int) fd, buf, (size_t) size));
+}
+
+static toff_t
+_tiffSeekProc(thandle_t fd, toff_t off, int whence)
+{
+#if USE_64BIT_API == 1
+ return ((toff_t) lseek64((int) fd, (off64_t) off, whence));
+#else
+ return ((toff_t) lseek((int) fd, (off_t) off, whence));
+#endif
+}
+
+static int
+_tiffCloseProc(thandle_t fd)
+{
+ return (close((int) fd));
+}
+
+#include <sys/stat.h>
+
+static toff_t
+_tiffSizeProc(thandle_t fd)
+{
+#ifdef _AM29K
+ long fsize;
+ return ((fsize = lseek((int) fd, 0, SEEK_END)) < 0 ? 0 : fsize);
+#else
+#if USE_64BIT_API == 1
+ struct stat64 sb;
+ return (toff_t) (fstat64((int) fd, &sb) < 0 ? 0 : sb.st_size);
+#else
+ struct stat sb;
+ return (toff_t) (fstat((int) fd, &sb) < 0 ? 0 : sb.st_size);
+#endif
+#endif
+}
+
+#ifdef HAVE_MMAP
+#include <sys/mman.h>
+
+static int
+_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
+{
+ toff_t size = _tiffSizeProc(fd);
+ if (size != (toff_t) -1) {
+ *pbase = (tdata_t)
+ mmap(0, size, PROT_READ, MAP_SHARED, (int) fd, 0);
+ if (*pbase != (tdata_t) -1) {
+ *psize = size;
+ return (1);
+ }
+ }
+ return (0);
+}
+
+static void
+_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
+{
+ (void) fd;
+ (void) munmap(base, (off_t) size);
+}
+#else /* !HAVE_MMAP */
+static int
+_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
+{
+ (void) fd; (void) pbase; (void) psize;
+ return (0);
+}
+
+static void
+_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
+{
+ (void) fd; (void) base; (void) size;
+}
+#endif /* !HAVE_MMAP */
+
+/*
+ * Open a TIFF file descriptor for read/writing.
+ */
+TIFF*
+TIFFFdOpen(int fd, const char* name, const char* mode)
+{
+ TIFF* tif;
+
+ tif = TIFFClientOpen(name, mode,
+ (thandle_t) fd,
+ _tiffReadProc, _tiffWriteProc,
+ _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
+ _tiffMapProc, _tiffUnmapProc);
+ if (tif)
+ tif->tif_fd = fd;
+ return (tif);
+}
+
+/*
+ * Open a TIFF file for read/writing.
+ */
+TIFF*
+TIFFOpen(const char* name, const char* mode)
+{
+ static const char module[] = "TIFFOpen";
+ int m, fd;
+
+ m = _TIFFgetMode(mode, module);
+ if (m == -1)
+ return ((TIFF*)0);
+
+/* for cygwin */
+#ifdef O_BINARY
+ m |= O_BINARY;
+#endif
+
+#ifdef _AM29K
+ fd = open(name, m);
+#else
+#if USE_64BIT_API == 1
+ fd = open(name, m | O_LARGEFILE, 0666);
+#else
+ fd = open(name, m, 0666);
+#endif
+#endif
+ if (fd < 0) {
+ TIFFError(module, "%s: Cannot open", name);
+ return ((TIFF *)0);
+ }
+ return (TIFFFdOpen(fd, name, mode));
+}
+
+void*
+_TIFFmalloc(tsize_t s)
+{
+ return (malloc((size_t) s));
+}
+
+void
+_TIFFfree(tdata_t p)
+{
+ free(p);
+}
+
+void*
+_TIFFrealloc(tdata_t p, tsize_t s)
+{
+ return (realloc(p, (size_t) s));
+}
+
+void
+_TIFFmemset(tdata_t p, int v, tsize_t c)
+{
+ memset(p, v, (size_t) c);
+}
+
+void
+_TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c)
+{
+ memcpy(d, s, (size_t) c);
+}
+
+int
+_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c)
+{
+ return (memcmp(p1, p2, (size_t) c));
+}
+
+static void
+unixWarningHandler(const char* module, const char* fmt, va_list ap)
+{
+ if (module != NULL)
+ fprintf(stderr, "%s: ", module);
+ fprintf(stderr, "Warning, ");
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, ".\n");
+}
+TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler;
+
+static void
+unixErrorHandler(const char* module, const char* fmt, va_list ap)
+{
+ if (module != NULL)
+ fprintf(stderr, "%s: ", module);
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, ".\n");
+}
+TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler;
diff --git a/src/tiff/tif_version.c b/src/tiff/tif_version.c
new file mode 100644
index 0000000..6c60313
--- /dev/null
+++ b/src/tiff/tif_version.c
@@ -0,0 +1,33 @@
+/* $Header: /home/terralib/src/tiff/tif_version.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+/*
+ * Copyright (c) 1992-1997 Sam Leffler
+ * Copyright (c) 1992-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+#include "tiffiop.h"
+
+static const char TIFFVersion[] = TIFFLIB_VERSION_STR;
+
+const char*
+TIFFGetVersion(void)
+{
+ return (TIFFVersion);
+}
diff --git a/src/tiff/tif_warning.c b/src/tiff/tif_warning.c
new file mode 100644
index 0000000..faf7e67
--- /dev/null
+++ b/src/tiff/tif_warning.c
@@ -0,0 +1,49 @@
+/* $Header: /home/terralib/src/tiff/tif_warning.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ */
+#include "tiffiop.h"
+
+TIFFErrorHandler
+TIFFSetWarningHandler(TIFFErrorHandler handler)
+{
+ TIFFErrorHandler prev = _TIFFwarningHandler;
+ _TIFFwarningHandler = handler;
+ return (prev);
+}
+
+void
+TIFFWarning(const char* module, const char* fmt, ...)
+{
+ if (_TIFFwarningHandler) {
+ va_list ap;
+ va_start(ap, fmt);
+ (*_TIFFwarningHandler)(module, fmt, ap);
+ va_end(ap);
+ }
+}
diff --git a/src/tiff/tif_win32.c b/src/tiff/tif_win32.c
new file mode 100644
index 0000000..5b86505
--- /dev/null
+++ b/src/tiff/tif_win32.c
@@ -0,0 +1,323 @@
+/* $Header: /home/terralib/src/tiff/tif_win32.c,v 1.5 2005/04/07 18:25:16 juan Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library Win32-specific Routines. Adapted from tif_unix.c 4/5/95 by
+ * Scott Wagner (wagner at itek.com), Itek Graphix, Rochester, NY USA
+ */
+#include <windows.h>
+#include "tiffiop.h"
+
+static tsize_t
+_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size)
+{
+ DWORD dwSizeRead;
+ if (!ReadFile(fd, buf, size, &dwSizeRead, NULL))
+ return(0);
+ return ((tsize_t) dwSizeRead);
+}
+
+static tsize_t
+_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size)
+{
+ DWORD dwSizeWritten;
+ if (!WriteFile(fd, buf, size, &dwSizeWritten, NULL))
+ return(0);
+ return ((tsize_t) dwSizeWritten);
+}
+
+static toff_t
+_tiffSeekProc(thandle_t fd, toff_t off, int whence)
+{
+ DWORD dwMoveMethod, dwMoveHigh;
+
+ /* we use this as a special code, so avoid accepting it */
+ if( off == 0xFFFFFFFF )
+ return 0xFFFFFFFF;
+
+ switch(whence)
+ {
+ case SEEK_SET:
+ dwMoveMethod = FILE_BEGIN;
+ break;
+ case SEEK_CUR:
+ dwMoveMethod = FILE_CURRENT;
+ break;
+ case SEEK_END:
+ dwMoveMethod = FILE_END;
+ break;
+ default:
+ dwMoveMethod = FILE_BEGIN;
+ break;
+ }
+ dwMoveHigh = 0;
+ return ((toff_t)SetFilePointer(fd, (LONG) off, (PLONG)&dwMoveHigh,
+ dwMoveMethod));
+}
+
+static int
+_tiffCloseProc(thandle_t fd)
+{
+ return (CloseHandle(fd) ? 0 : -1);
+}
+
+static toff_t
+_tiffSizeProc(thandle_t fd)
+{
+ return ((toff_t)GetFileSize(fd, NULL));
+}
+
+#ifdef __BORLANDC__
+#pragma argsused
+#endif
+static int
+_tiffDummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
+{
+ return (0);
+}
+
+/*
+ * From "Hermann Josef Hill" <lhill at rhein-zeitung.de>:
+ *
+ * Windows uses both a handle and a pointer for file mapping,
+ * but according to the SDK documentation and Richter's book
+ * "Advanced Windows Programming" it is safe to free the handle
+ * after obtaining the file mapping pointer
+ *
+ * This removes a nasty OS dependency and cures a problem
+ * with Visual C++ 5.0
+ */
+static int
+_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
+{
+ toff_t size;
+ HANDLE hMapFile;
+
+ if ((size = _tiffSizeProc(fd)) == 0xFFFFFFFF)
+ return (0);
+ hMapFile = CreateFileMapping(fd, NULL, PAGE_READONLY, 0, size, NULL);
+ if (hMapFile == NULL)
+ return (0);
+ *pbase = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
+ CloseHandle(hMapFile);
+ if (*pbase == NULL)
+ return (0);
+ *psize = size;
+ return(1);
+}
+
+#ifdef __BORLANDC__
+#pragma argsused
+#endif
+static void
+_tiffDummyUnmapProc(thandle_t fd, tdata_t base, toff_t size)
+{
+}
+
+static void
+_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
+{
+ UnmapViewOfFile(base);
+}
+
+/*
+ * Open a TIFF file descriptor for read/writing.
+ * Note that TIFFFdOpen and TIFFOpen recognise the character 'u' in the mode
+ * string, which forces the file to be opened unmapped.
+ */
+TIFF*
+TIFFFdOpen(int ifd, const char* name, const char* mode)
+{
+ TIFF* tif;
+ BOOL fSuppressMap = (mode[1] == 'u' || (mode[1]!=0 && mode[2] == 'u'));
+
+ tif = TIFFClientOpen(name, mode,
+ (thandle_t)ifd,
+ _tiffReadProc, _tiffWriteProc,
+ _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
+ fSuppressMap ? _tiffDummyMapProc : _tiffMapProc,
+ fSuppressMap ? _tiffDummyUnmapProc : _tiffUnmapProc);
+ if (tif)
+ tif->tif_fd = ifd;
+ return (tif);
+}
+
+/*
+ * Open a TIFF file for read/writing.
+ */
+TIFF*
+TIFFOpen(const char* name, const char* mode)
+{
+ static const char module[] = "TIFFOpen";
+ thandle_t fd;
+ int m;
+ DWORD dwMode;
+
+ m = _TIFFgetMode(mode, module);
+
+ switch(m)
+ {
+ case O_RDONLY:
+ dwMode = OPEN_EXISTING;
+ break;
+ case O_RDWR:
+ dwMode = OPEN_ALWAYS;
+ break;
+ case O_RDWR|O_CREAT:
+ dwMode = OPEN_ALWAYS;
+ break;
+ case O_RDWR|O_TRUNC:
+ dwMode = CREATE_ALWAYS;
+ break;
+ case O_RDWR|O_CREAT|O_TRUNC:
+ dwMode = CREATE_ALWAYS;
+ break;
+ default:
+ return ((TIFF*)0);
+ }
+ fd = (thandle_t)CreateFile(name, (m == O_RDONLY) ? GENERIC_READ :
+ (GENERIC_READ | GENERIC_WRITE), FILE_SHARE_READ, NULL, dwMode,
+ (m == O_RDONLY) ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL, NULL);
+ if (fd == INVALID_HANDLE_VALUE) {
+ TIFFError(module, "%s: Cannot open", name);
+ return ((TIFF *)0);
+ }
+ return (TIFFFdOpen((int)fd, name, mode));
+}
+
+tdata_t
+_TIFFmalloc(tsize_t s)
+{
+ return ((tdata_t)GlobalAlloc(GMEM_FIXED, s));
+}
+
+void
+_TIFFfree(tdata_t p)
+{
+ GlobalFree(p);
+ return;
+}
+
+tdata_t
+_TIFFrealloc(tdata_t p, tsize_t s)
+{
+ void* pvTmp;
+ tsize_t old=GlobalSize(p);
+ if (old>=s)
+ {
+ if ((pvTmp = GlobalAlloc(GMEM_FIXED, s)) != NULL) {
+ CopyMemory(pvTmp, p, s);
+ GlobalFree(p);
+ }
+ }
+ else
+ {
+ if ((pvTmp = GlobalAlloc(GMEM_FIXED, s)) != NULL) {
+ CopyMemory(pvTmp, p, old);
+ GlobalFree(p);
+ }
+ }
+ return ((tdata_t)pvTmp);
+}
+
+void
+_TIFFmemset(void* p, int v, tsize_t c)
+{
+ FillMemory(p, c, (BYTE)v);
+}
+
+void
+_TIFFmemcpy(void* d, const tdata_t s, tsize_t c)
+{
+ CopyMemory(d, s, c);
+}
+
+int
+_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c)
+{
+ register const BYTE *pb1 = (const BYTE *) p1;
+ register const BYTE *pb2 = (const BYTE *) p2;
+ register DWORD dwTmp = c;
+ register int iTmp;
+ for (iTmp = 0; dwTmp-- && !iTmp; iTmp = (int)*pb1++ - (int)*pb2++)
+ ;
+ return (iTmp);
+}
+
+static void
+Win32WarningHandler(const char* module, const char* fmt, va_list ap)
+{
+#ifndef TIF_PLATFORM_CONSOLE
+ LPTSTR szTitle;
+ LPTSTR szTmp;
+ LPCTSTR szTitleText = "%s Warning";
+ LPCTSTR szDefaultModule = "TIFFLIB";
+ szTmp = (module == NULL) ? (LPTSTR)szDefaultModule : (LPTSTR)module;
+ if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (lstrlen(szTmp) +
+ lstrlen(szTitleText) + lstrlen(fmt) + 128)*sizeof(TCHAR))) == NULL)
+ return;
+ wsprintf(szTitle, szTitleText, szTmp);
+ szTmp = szTitle + (lstrlen(szTitle)+2)*sizeof(TCHAR);
+ wvsprintf(szTmp, fmt, ap);
+ MessageBox(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONINFORMATION);
+ LocalFree(szTitle);
+ return;
+#else
+ if (module != NULL)
+ fprintf(stderr, "%s: ", module);
+ fprintf(stderr, "Warning, ");
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, ".\n");
+#endif
+}
+TIFFErrorHandler _TIFFwarningHandler = Win32WarningHandler;
+
+static void
+Win32ErrorHandler(const char* module, const char* fmt, va_list ap)
+{
+#ifndef TIF_PLATFORM_CONSOLE
+ LPTSTR szTitle;
+ LPTSTR szTmp;
+ LPCTSTR szTitleText = "%s Error";
+ LPCTSTR szDefaultModule = "TIFFLIB";
+ szTmp = (module == NULL) ? (LPTSTR)szDefaultModule : (LPTSTR)module;
+ if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (lstrlen(szTmp) +
+ lstrlen(szTitleText) + lstrlen(fmt) + 128)*sizeof(TCHAR))) == NULL)
+ return;
+ wsprintf(szTitle, szTitleText, szTmp);
+ szTmp = szTitle + (lstrlen(szTitle)+2)*sizeof(TCHAR);
+ wvsprintf(szTmp, fmt, ap);
+ MessageBox(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONEXCLAMATION);
+ LocalFree(szTitle);
+ return;
+#else
+ if (module != NULL)
+ fprintf(stderr, "%s: ", module);
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, ".\n");
+#endif
+}
+TIFFErrorHandler _TIFFerrorHandler = Win32ErrorHandler;
diff --git a/src/tiff/tif_write.c b/src/tiff/tif_write.c
new file mode 100644
index 0000000..e5cc00f
--- /dev/null
+++ b/src/tiff/tif_write.c
@@ -0,0 +1,726 @@
+/* $Header: /home/terralib/src/tiff/tif_write.c,v 1.4 2004/04/12 13:52:41 juan Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Scanline-oriented Write Support
+ */
+#include "tiffiop.h"
+#include <assert.h>
+#include <stdio.h>
+
+#define REWRITE_HACK
+
+#define STRIPINCR 20 /* expansion factor on strip array */
+
+#define WRITECHECKSTRIPS(tif, module) \
+ (((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),0,module))
+#define WRITECHECKTILES(tif, module) \
+ (((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),1,module))
+#define BUFFERCHECK(tif) \
+ ((((tif)->tif_flags & TIFF_BUFFERSETUP) && tif->tif_rawdata) || \
+ TIFFWriteBufferSetup((tif), NULL, (tsize_t) -1))
+
+static int TIFFGrowStrips(TIFF*, int, const char*);
+static int TIFFAppendToStrip(TIFF*, tstrip_t, tidata_t, tsize_t);
+
+int
+TIFFWriteScanline(TIFF* tif, tdata_t buf, uint32 row, tsample_t sample)
+{
+ static const char module[] = "TIFFWriteScanline";
+ register TIFFDirectory *td;
+ int status, imagegrew = 0;
+ tstrip_t strip;
+
+ if (!WRITECHECKSTRIPS(tif, module))
+ return (-1);
+ /*
+ * Handle delayed allocation of data buffer. This
+ * permits it to be sized more intelligently (using
+ * directory information).
+ */
+ if (!BUFFERCHECK(tif))
+ return (-1);
+ td = &tif->tif_dir;
+ /*
+ * Extend image length if needed
+ * (but only for PlanarConfig=1).
+ */
+ if (row >= td->td_imagelength) { /* extend image */
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
+ TIFFError(tif->tif_name,
+ "Can not change \"ImageLength\" when using separate planes");
+ return (-1);
+ }
+ td->td_imagelength = row+1;
+ imagegrew = 1;
+ }
+ /*
+ * Calculate strip and check for crossings.
+ */
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
+ if (sample >= td->td_samplesperpixel) {
+ TIFFError(tif->tif_name,
+ "%d: Sample out of range, max %d",
+ sample, td->td_samplesperpixel);
+ return (-1);
+ }
+ strip = sample*td->td_stripsperimage + row/td->td_rowsperstrip;
+ } else
+ strip = row / td->td_rowsperstrip;
+ if (strip != tif->tif_curstrip) {
+ /*
+ * Changing strips -- flush any data present.
+ */
+ if (!TIFFFlushData(tif))
+ return (-1);
+ tif->tif_curstrip = strip;
+ /*
+ * Watch out for a growing image. The value of
+ * strips/image will initially be 1 (since it
+ * can't be deduced until the imagelength is known).
+ */
+ if (strip >= td->td_stripsperimage && imagegrew)
+ td->td_stripsperimage =
+ TIFFhowmany(td->td_imagelength,td->td_rowsperstrip);
+ tif->tif_row =
+ (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+ if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
+ if (!(*tif->tif_setupencode)(tif))
+ return (-1);
+ tif->tif_flags |= TIFF_CODERSETUP;
+ }
+ if (!(*tif->tif_preencode)(tif, sample))
+ return (-1);
+ tif->tif_flags |= TIFF_POSTENCODE;
+ }
+ /*
+ * Check strip array to make sure there's space.
+ * We don't support dynamically growing files that
+ * have data organized in separate bitplanes because
+ * it's too painful. In that case we require that
+ * the imagelength be set properly before the first
+ * write (so that the strips array will be fully
+ * allocated above).
+ */
+ if (strip >= td->td_nstrips && !TIFFGrowStrips(tif, 1, module))
+ return (-1);
+ /*
+ * Ensure the write is either sequential or at the
+ * beginning of a strip (or that we can randomly
+ * access the data -- i.e. no encoding).
+ */
+ if (row != tif->tif_row) {
+ if (row < tif->tif_row) {
+ /*
+ * Moving backwards within the same strip:
+ * backup to the start and then decode
+ * forward (below).
+ */
+ tif->tif_row = (strip % td->td_stripsperimage) *
+ td->td_rowsperstrip;
+ tif->tif_rawcp = tif->tif_rawdata;
+ }
+ /*
+ * Seek forward to the desired row.
+ */
+ if (!(*tif->tif_seek)(tif, row - tif->tif_row))
+ return (-1);
+ tif->tif_row = row;
+ }
+
+ /* swab if needed - note that source buffer will be altered */
+ tif->tif_postdecode( tif, (tidata_t) buf, tif->tif_scanlinesize );
+
+ status = (*tif->tif_encoderow)(tif, (tidata_t) buf,
+ tif->tif_scanlinesize, sample);
+
+ /* we are now poised at the beginning of the next row */
+ tif->tif_row = row + 1;
+ return (status);
+}
+
+/*
+ * Encode the supplied data and write it to the
+ * specified strip. There must be space for the
+ * data; we don't check if strips overlap!
+ *
+ * NB: Image length must be setup before writing.
+ */
+tsize_t
+TIFFWriteEncodedStrip(TIFF* tif, tstrip_t strip, tdata_t data, tsize_t cc)
+{
+ static const char module[] = "TIFFWriteEncodedStrip";
+ TIFFDirectory *td = &tif->tif_dir;
+ tsample_t sample;
+
+ if (!WRITECHECKSTRIPS(tif, module))
+ return ((tsize_t) -1);
+ /*
+ * Check strip array to make sure there's space.
+ * We don't support dynamically growing files that
+ * have data organized in separate bitplanes because
+ * it's too painful. In that case we require that
+ * the imagelength be set properly before the first
+ * write (so that the strips array will be fully
+ * allocated above).
+ */
+ if (strip >= td->td_nstrips) {
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
+ TIFFError(tif->tif_name,
+ "Can not grow image by strips when using separate planes");
+ return ((tsize_t) -1);
+ }
+ if (!TIFFGrowStrips(tif, 1, module))
+ return ((tsize_t) -1);
+ td->td_stripsperimage =
+ TIFFhowmany(td->td_imagelength, td->td_rowsperstrip);
+ }
+ /*
+ * Handle delayed allocation of data buffer. This
+ * permits it to be sized according to the directory
+ * info.
+ */
+ if (!BUFFERCHECK(tif))
+ return ((tsize_t) -1);
+ tif->tif_curstrip = strip;
+ tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+ if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
+ if (!(*tif->tif_setupencode)(tif))
+ return ((tsize_t) -1);
+ tif->tif_flags |= TIFF_CODERSETUP;
+ }
+
+#ifdef REWRITE_HACK
+ tif->tif_rawcc = 0;
+ tif->tif_rawcp = tif->tif_rawdata;
+
+ if( td->td_stripbytecount[strip] > 0 )
+ {
+ /* if we are writing over existing tiles, zero length. */
+ td->td_stripbytecount[strip] = 0;
+
+ /* this forces TIFFAppendToStrip() to do a seek */
+ tif->tif_curoff = 0;
+ }
+#endif
+
+ tif->tif_flags &= ~TIFF_POSTENCODE;
+ sample = (tsample_t)(strip / td->td_stripsperimage);
+ if (!(*tif->tif_preencode)(tif, sample))
+ return ((tsize_t) -1);
+
+ /* swab if needed - note that source buffer will be altered */
+ tif->tif_postdecode( tif, (tidata_t) data, cc );
+
+ if (!(*tif->tif_encodestrip)(tif, (tidata_t) data, cc, sample))
+ return ((tsize_t) 0);
+ if (!(*tif->tif_postencode)(tif))
+ return ((tsize_t) -1);
+ if (!isFillOrder(tif, td->td_fillorder) &&
+ (tif->tif_flags & TIFF_NOBITREV) == 0)
+ TIFFReverseBits(tif->tif_rawdata, tif->tif_rawcc);
+ if (tif->tif_rawcc > 0 &&
+ !TIFFAppendToStrip(tif, strip, tif->tif_rawdata, tif->tif_rawcc))
+ return ((tsize_t) -1);
+ tif->tif_rawcc = 0;
+ tif->tif_rawcp = tif->tif_rawdata;
+ return (cc);
+}
+
+/*
+ * Write the supplied data to the specified strip.
+ * There must be space for the data; we don't check
+ * if strips overlap!
+ *
+ * NB: Image length must be setup before writing.
+ */
+tsize_t
+TIFFWriteRawStrip(TIFF* tif, tstrip_t strip, tdata_t data, tsize_t cc)
+{
+ static const char module[] = "TIFFWriteRawStrip";
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if (!WRITECHECKSTRIPS(tif, module))
+ return ((tsize_t) -1);
+ /*
+ * Check strip array to make sure there's space.
+ * We don't support dynamically growing files that
+ * have data organized in separate bitplanes because
+ * it's too painful. In that case we require that
+ * the imagelength be set properly before the first
+ * write (so that the strips array will be fully
+ * allocated above).
+ */
+ if (strip >= td->td_nstrips) {
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
+ TIFFError(tif->tif_name,
+ "Can not grow image by strips when using separate planes");
+ return ((tsize_t) -1);
+ }
+ /*
+ * Watch out for a growing image. The value of
+ * strips/image will initially be 1 (since it
+ * can't be deduced until the imagelength is known).
+ */
+ if (strip >= td->td_stripsperimage)
+ td->td_stripsperimage =
+ TIFFhowmany(td->td_imagelength,td->td_rowsperstrip);
+ if (!TIFFGrowStrips(tif, 1, module))
+ return ((tsize_t) -1);
+ }
+ tif->tif_curstrip = strip;
+ tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+ return (TIFFAppendToStrip(tif, strip, (tidata_t) data, cc) ?
+ cc : (tsize_t) -1);
+}
+
+/*
+ * Write and compress a tile of data. The
+ * tile is selected by the (x,y,z,s) coordinates.
+ */
+tsize_t
+TIFFWriteTile(TIFF* tif,
+ tdata_t buf, uint32 x, uint32 y, uint32 z, tsample_t s)
+{
+ if (!TIFFCheckTile(tif, x, y, z, s))
+ return (-1);
+ /*
+ * NB: A tile size of -1 is used instead of tif_tilesize knowing
+ * that TIFFWriteEncodedTile will clamp this to the tile size.
+ * This is done because the tile size may not be defined until
+ * after the output buffer is setup in TIFFWriteBufferSetup.
+ */
+ return (TIFFWriteEncodedTile(tif,
+ TIFFComputeTile(tif, x, y, z, s), buf, (tsize_t) -1));
+}
+
+/*
+ * Encode the supplied data and write it to the
+ * specified tile. There must be space for the
+ * data. The function clamps individual writes
+ * to a tile to the tile size, but does not (and
+ * can not) check that multiple writes to the same
+ * tile do not write more than tile size data.
+ *
+ * NB: Image length must be setup before writing; this
+ * interface does not support automatically growing
+ * the image on each write (as TIFFWriteScanline does).
+ */
+tsize_t
+TIFFWriteEncodedTile(TIFF* tif, ttile_t tile, tdata_t data, tsize_t cc)
+{
+ static const char module[] = "TIFFWriteEncodedTile";
+ TIFFDirectory *td;
+ tsample_t sample;
+
+ if (!WRITECHECKTILES(tif, module))
+ return ((tsize_t) -1);
+ td = &tif->tif_dir;
+ if (tile >= td->td_nstrips) {
+ TIFFError(module, "%s: Tile %lu out of range, max %lu",
+ tif->tif_name, (u_long) tile, (u_long) td->td_nstrips);
+ return ((tsize_t) -1);
+ }
+ /*
+ * Handle delayed allocation of data buffer. This
+ * permits it to be sized more intelligently (using
+ * directory information).
+ */
+ if (!BUFFERCHECK(tif))
+ return ((tsize_t) -1);
+ tif->tif_curtile = tile;
+
+#ifdef REWRITE_HACK
+ tif->tif_rawcc = 0;
+ tif->tif_rawcp = tif->tif_rawdata;
+
+ if( td->td_stripbytecount[tile] > 0 )
+ {
+ /* if we are writing over existing tiles, zero length. */
+ td->td_stripbytecount[tile] = 0;
+
+ /* this forces TIFFAppendToStrip() to do a seek */
+ tif->tif_curoff = 0;
+ }
+#endif
+
+ /*
+ * Compute tiles per row & per column to compute
+ * current row and column
+ */
+ tif->tif_row = (tile % TIFFhowmany(td->td_imagelength, td->td_tilelength))
+ * td->td_tilelength;
+ tif->tif_col = (tile % TIFFhowmany(td->td_imagewidth, td->td_tilewidth))
+ * td->td_tilewidth;
+
+ if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
+ if (!(*tif->tif_setupencode)(tif))
+ return ((tsize_t) -1);
+ tif->tif_flags |= TIFF_CODERSETUP;
+ }
+ tif->tif_flags &= ~TIFF_POSTENCODE;
+ sample = (tsample_t)(tile/td->td_stripsperimage);
+ if (!(*tif->tif_preencode)(tif, sample))
+ return ((tsize_t) -1);
+ /*
+ * Clamp write amount to the tile size. This is mostly
+ * done so that callers can pass in some large number
+ * (e.g. -1) and have the tile size used instead.
+ */
+ if ( cc < 1 || cc > tif->tif_tilesize)
+ cc = tif->tif_tilesize;
+
+ /* swab if needed - note that source buffer will be altered */
+ tif->tif_postdecode( tif, (tidata_t) data, cc );
+
+ if (!(*tif->tif_encodetile)(tif, (tidata_t) data, cc, sample))
+ return ((tsize_t) 0);
+ if (!(*tif->tif_postencode)(tif))
+ return ((tsize_t) -1);
+ if (!isFillOrder(tif, td->td_fillorder) &&
+ (tif->tif_flags & TIFF_NOBITREV) == 0)
+ TIFFReverseBits((u_char *)tif->tif_rawdata, tif->tif_rawcc);
+ if (tif->tif_rawcc > 0 && !TIFFAppendToStrip(tif, tile,
+ tif->tif_rawdata, tif->tif_rawcc))
+ return ((tsize_t) -1);
+ tif->tif_rawcc = 0;
+ tif->tif_rawcp = tif->tif_rawdata;
+ return (cc);
+}
+
+/*
+ * Write the supplied data to the specified strip.
+ * There must be space for the data; we don't check
+ * if strips overlap!
+ *
+ * NB: Image length must be setup before writing; this
+ * interface does not support automatically growing
+ * the image on each write (as TIFFWriteScanline does).
+ */
+tsize_t
+TIFFWriteRawTile(TIFF* tif, ttile_t tile, tdata_t data, tsize_t cc)
+{
+ static const char module[] = "TIFFWriteRawTile";
+
+ if (!WRITECHECKTILES(tif, module))
+ return ((tsize_t) -1);
+ if (tile >= tif->tif_dir.td_nstrips) {
+ TIFFError(module, "%s: Tile %lu out of range, max %lu",
+ tif->tif_name, (u_long) tile,
+ (u_long) tif->tif_dir.td_nstrips);
+ return ((tsize_t) -1);
+ }
+ return (TIFFAppendToStrip(tif, tile, (tidata_t) data, cc) ?
+ cc : (tsize_t) -1);
+}
+
+#define isUnspecified(tif, f) \
+ (TIFFFieldSet(tif,f) && (tif)->tif_dir.td_imagelength == 0)
+
+int
+TIFFSetupStrips(TIFF* tif)
+{
+ TIFFDirectory* td = &tif->tif_dir;
+
+ if (isTiled(tif))
+ td->td_stripsperimage =
+ isUnspecified(tif, FIELD_TILEDIMENSIONS) ?
+ td->td_samplesperpixel : TIFFNumberOfTiles(tif);
+ else
+ td->td_stripsperimage =
+ isUnspecified(tif, FIELD_ROWSPERSTRIP) ?
+ td->td_samplesperpixel : TIFFNumberOfStrips(tif);
+ td->td_nstrips = td->td_stripsperimage;
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ td->td_stripsperimage /= td->td_samplesperpixel;
+ td->td_stripoffset = (uint32 *)
+ _TIFFmalloc(td->td_nstrips * sizeof (uint32));
+ td->td_stripbytecount = (uint32 *)
+ _TIFFmalloc(td->td_nstrips * sizeof (uint32));
+ if (td->td_stripoffset == NULL || td->td_stripbytecount == NULL)
+ return (0);
+ /*
+ * Place data at the end-of-file
+ * (by setting offsets to zero).
+ */
+ _TIFFmemset(td->td_stripoffset, 0, td->td_nstrips*sizeof (uint32));
+ _TIFFmemset(td->td_stripbytecount, 0, td->td_nstrips*sizeof (uint32));
+ TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
+ TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
+ return (1);
+}
+#undef isUnspecified
+
+/*
+ * Verify file is writable and that the directory
+ * information is setup properly. In doing the latter
+ * we also "freeze" the state of the directory so
+ * that important information is not changed.
+ */
+int
+TIFFWriteCheck(TIFF* tif, int tiles, const char* module)
+{
+ if (tif->tif_mode == O_RDONLY) {
+ TIFFError(module, "%s: File not open for writing",
+ tif->tif_name);
+ return (0);
+ }
+ if (tiles ^ isTiled(tif)) {
+ TIFFError(tif->tif_name, tiles ?
+ "Can not write tiles to a stripped image" :
+ "Can not write scanlines to a tiled image");
+ return (0);
+ }
+
+ /*
+ * While we allow compressed TIFF files to be opened in update mode,
+ * we don't allow writing any image blocks in an existing compressed
+ * image. Eventually we could do so, by moving blocks that grow
+ * to the end of the file, but we don't for now.
+ */
+ if (tif->tif_dir.td_stripoffset != NULL
+ && tif->tif_dir.td_compression != COMPRESSION_NONE )
+ {
+ TIFFError( module,
+ "%s:\n"
+ "In place update to compressed TIFF images not "
+ "supported.",
+ tif->tif_name );
+ return (0);
+ }
+
+ /*
+ * On the first write verify all the required information
+ * has been setup and initialize any data structures that
+ * had to wait until directory information was set.
+ * Note that a lot of our work is assumed to remain valid
+ * because we disallow any of the important parameters
+ * from changing after we start writing (i.e. once
+ * TIFF_BEENWRITING is set, TIFFSetField will only allow
+ * the image's length to be changed).
+ */
+ if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) {
+ TIFFError(module,
+ "%s: Must set \"ImageWidth\" before writing data",
+ tif->tif_name);
+ return (0);
+ }
+ if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) {
+ TIFFError(module,
+ "%s: Must set \"PlanarConfiguration\" before writing data",
+ tif->tif_name);
+ return (0);
+ }
+ if (tif->tif_dir.td_stripoffset == NULL && !TIFFSetupStrips(tif)) {
+ tif->tif_dir.td_nstrips = 0;
+ TIFFError(module, "%s: No space for %s arrays",
+ tif->tif_name, isTiled(tif) ? "tile" : "strip");
+ return (0);
+ }
+ tif->tif_tilesize = TIFFTileSize(tif);
+ tif->tif_scanlinesize = TIFFScanlineSize(tif);
+ tif->tif_flags |= TIFF_BEENWRITING;
+ return (1);
+}
+
+/*
+ * Setup the raw data buffer used for encoding.
+ */
+int
+TIFFWriteBufferSetup(TIFF* tif, tdata_t bp, tsize_t size)
+{
+ static const char module[] = "TIFFWriteBufferSetup";
+
+ if (tif->tif_rawdata) {
+ if (tif->tif_flags & TIFF_MYBUFFER) {
+ _TIFFfree(tif->tif_rawdata);
+ tif->tif_flags &= ~TIFF_MYBUFFER;
+ }
+ tif->tif_rawdata = NULL;
+ }
+ if (size == (tsize_t) -1) {
+ size = (isTiled(tif) ?
+ tif->tif_tilesize : tif->tif_scanlinesize);
+ /*
+ * Make raw data buffer at least 8K
+ */
+ if (size < 8*1024)
+ size = 8*1024;
+ bp = NULL; /* NB: force malloc */
+ }
+ if (bp == NULL) {
+ bp = _TIFFmalloc(size);
+ if (bp == NULL) {
+ TIFFError(module, "%s: No space for output buffer",
+ tif->tif_name);
+ return (0);
+ }
+ tif->tif_flags |= TIFF_MYBUFFER;
+ } else
+ tif->tif_flags &= ~TIFF_MYBUFFER;
+ tif->tif_rawdata = (tidata_t) bp;
+ tif->tif_rawdatasize = size;
+ tif->tif_rawcc = 0;
+ tif->tif_rawcp = tif->tif_rawdata;
+ tif->tif_flags |= TIFF_BUFFERSETUP;
+ return (1);
+}
+
+/*
+ * Grow the strip data structures by delta strips.
+ */
+static int
+TIFFGrowStrips(TIFF* tif, int delta, const char* module)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+
+ assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
+ td->td_stripoffset = (uint32*)_TIFFrealloc(td->td_stripoffset,
+ (td->td_nstrips + delta) * sizeof (uint32));
+ td->td_stripbytecount = (uint32*)_TIFFrealloc(td->td_stripbytecount,
+ (td->td_nstrips + delta) * sizeof (uint32));
+ if (td->td_stripoffset == NULL || td->td_stripbytecount == NULL) {
+ td->td_nstrips = 0;
+ TIFFError(module, "%s: No space to expand strip arrays",
+ tif->tif_name);
+ return (0);
+ }
+ _TIFFmemset(td->td_stripoffset+td->td_nstrips, 0, delta*sizeof (uint32));
+ _TIFFmemset(td->td_stripbytecount+td->td_nstrips, 0, delta*sizeof (uint32));
+ td->td_nstrips += delta;
+ return (1);
+}
+
+/*
+ * Append the data to the specified strip.
+ *
+ * NB: We don't check that there's space in the
+ * file (i.e. that strips do not overlap).
+ */
+static int
+TIFFAppendToStrip(TIFF* tif, tstrip_t strip, tidata_t data, tsize_t cc)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ static const char module[] = "TIFFAppendToStrip";
+
+ if (td->td_stripoffset[strip] == 0 || tif->tif_curoff == 0) {
+ /*
+ * No current offset, set the current strip.
+
+ */
+ if (td->td_stripoffset[strip] != 0) {
+ if (!SeekOK(tif, td->td_stripoffset[strip])) {
+ TIFFError(module,
+ "%s: Seek error at scanline %lu",
+ tif->tif_name, (u_long) tif->tif_row);
+ return (0);
+ }
+ } else
+ td->td_stripoffset[strip] =
+ TIFFSeekFile(tif, (toff_t) 0, SEEK_END);
+ tif->tif_curoff = td->td_stripoffset[strip];
+ }
+ if (!WriteOK(tif, data, cc)) {
+ TIFFError(module, "%s: Write error at scanline %lu",
+ tif->tif_name, (u_long) tif->tif_row);
+ return (0);
+ }
+ tif->tif_curoff += cc;
+ td->td_stripbytecount[strip] += cc;
+ return (1);
+}
+
+/*
+ * Internal version of TIFFFlushData that can be
+ * called by ``encodestrip routines'' w/o concern
+ * for infinite recursion.
+ */
+int
+TIFFFlushData1(TIFF* tif)
+{
+ if (tif->tif_rawcc > 0) {
+ if (!isFillOrder(tif, tif->tif_dir.td_fillorder) &&
+ (tif->tif_flags & TIFF_NOBITREV) == 0)
+ TIFFReverseBits((u_char *)tif->tif_rawdata,
+ tif->tif_rawcc);
+ if (!TIFFAppendToStrip(tif,
+ isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip,
+ tif->tif_rawdata, tif->tif_rawcc))
+ return (0);
+ tif->tif_rawcc = 0;
+ tif->tif_rawcp = tif->tif_rawdata;
+ }
+ return (1);
+}
+
+/*
+ * Set the current write offset. This should only be
+ * used to set the offset to a known previous location
+ * (very carefully), or to 0 so that the next write gets
+ * appended to the end of the file.
+ */
+void
+TIFFSetWriteOffset(TIFF* tif, toff_t off)
+{
+ tif->tif_curoff = off;
+}
+
+
+/*
+ * Rewrite the specified strip.
+ */
+
+tsize_t
+TIFFWriteStrip(TIFF* tif, tstrip_t strip, tdata_t data, tsize_t cc)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ static const char module[] = "TIFFWriteStrip";
+
+ if (td->td_stripoffset[strip] == 0 || tif->tif_curoff == 0) {
+ /*
+ * No current offset, set the current strip.
+ */
+ if (td->td_stripoffset[strip] != 0) {
+ if (!SeekOK(tif, td->td_stripoffset[strip])) {
+ TIFFError(module,
+ "%s: Seek error at scanline %lu",
+ tif->tif_name, (u_long) tif->tif_row);
+ return (0);
+ }
+ } else
+ td->td_stripoffset[strip] =
+ TIFFSeekFile(tif, (toff_t) 0, SEEK_END);
+ tif->tif_curoff = td->td_stripoffset[strip];
+ }
+ if (!WriteOK(tif, data, cc)) {
+ TIFFError(module, "%s: Write error at scanline %lu",
+ tif->tif_name, (u_long) tif->tif_row);
+ return (0);
+ }
+ return (1);
+}
\ No newline at end of file
diff --git a/src/tiff/tif_zip.c b/src/tiff/tif_zip.c
new file mode 100644
index 0000000..71e4062
--- /dev/null
+++ b/src/tiff/tif_zip.c
@@ -0,0 +1,368 @@
+/* $Header: /home/terralib/src/tiff/tif_zip.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1995-1997 Sam Leffler
+ * Copyright (c) 1995-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef ZIP_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * ZIP (aka Deflate) Compression Support
+ *
+ * This file is simply an interface to the zlib library written by
+ * Jean-loup Gailly and Mark Adler. You must use version 1.0 or later
+ * of the library: this code assumes the 1.0 API and also depends on
+ * the ability to write the zlib header multiple times (one per strip)
+ * which was not possible with versions prior to 0.95. Note also that
+ * older versions of this codec avoided this bug by supressing the header
+ * entirely. This means that files written with the old library cannot
+ * be read; they should be converted to a different compression scheme
+ * and then reconverted.
+ *
+ * The data format used by the zlib library is described in the files
+ * zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available in the
+ * directory ftp://ftp.uu.net/pub/archiving/zip/doc. The library was
+ * last found at ftp://ftp.uu.net/pub/archiving/zip/zlib/zlib-0.99.tar.gz.
+ */
+#include "tif_predict.h"
+#include "zlib.h"
+
+#include <stdio.h>
+#include <assert.h>
+
+/*
+ * Sigh, ZLIB_VERSION is defined as a string so there's no
+ * way to do a proper check here. Instead we guess based
+ * on the presence of #defines that were added between the
+ * 0.95 and 1.0 distributions.
+ */
+#if !defined(Z_NO_COMPRESSION) || !defined(Z_DEFLATED)
+#error "Antiquated ZLIB software; you must use version 1.0 or later"
+#endif
+
+/*
+ * State block for each open TIFF
+ * file using ZIP compression/decompression.
+ */
+typedef struct {
+ TIFFPredictorState predict;
+ z_stream stream;
+ int zipquality; /* compression level */
+ int state; /* state flags */
+#define ZSTATE_INIT 0x1 /* zlib setup successfully */
+
+ TIFFVGetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+} ZIPState;
+
+#define ZState(tif) ((ZIPState*) (tif)->tif_data)
+#define DecoderState(tif) ZState(tif)
+#define EncoderState(tif) ZState(tif)
+
+static int ZIPEncode(TIFF*, tidata_t, tsize_t, tsample_t);
+static int ZIPDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+
+static int
+ZIPSetupDecode(TIFF* tif)
+{
+ ZIPState* sp = DecoderState(tif);
+ static const char module[] = "ZIPSetupDecode";
+
+ assert(sp != NULL);
+ if (inflateInit(&sp->stream) != Z_OK) {
+ TIFFError(module, "%s: %s", tif->tif_name, sp->stream.msg);
+ return (0);
+ } else {
+ sp->state |= ZSTATE_INIT;
+ return (1);
+ }
+}
+
+/*
+ * Setup state for decoding a strip.
+ */
+static int
+ZIPPreDecode(TIFF* tif, tsample_t s)
+{
+ ZIPState* sp = DecoderState(tif);
+
+ (void) s;
+ assert(sp != NULL);
+ sp->stream.next_in = tif->tif_rawdata;
+ sp->stream.avail_in = tif->tif_rawcc;
+ return (inflateReset(&sp->stream) == Z_OK);
+}
+
+static int
+ZIPDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
+{
+ ZIPState* sp = DecoderState(tif);
+ static const char module[] = "ZIPDecode";
+
+ (void) s;
+ assert(sp != NULL);
+ sp->stream.next_out = op;
+ sp->stream.avail_out = occ;
+ do {
+ int state = inflate(&sp->stream, Z_PARTIAL_FLUSH);
+ if (state == Z_STREAM_END)
+ break;
+ if (state == Z_DATA_ERROR) {
+ TIFFError(module,
+ "%s: Decoding error at scanline %d, %s",
+ tif->tif_name, tif->tif_row, sp->stream.msg);
+ if (inflateSync(&sp->stream) != Z_OK)
+ return (0);
+ continue;
+ }
+ if (state != Z_OK) {
+ TIFFError(module, "%s: zlib error: %s",
+ tif->tif_name, sp->stream.msg);
+ return (0);
+ }
+ } while (sp->stream.avail_out > 0);
+ if (sp->stream.avail_out != 0) {
+ TIFFError(module,
+ "%s: Not enough data at scanline %d (short %d bytes)",
+ tif->tif_name, tif->tif_row, sp->stream.avail_out);
+ return (0);
+ }
+ return (1);
+}
+
+static int
+ZIPSetupEncode(TIFF* tif)
+{
+ ZIPState* sp = EncoderState(tif);
+ static const char module[] = "ZIPSetupEncode";
+
+ assert(sp != NULL);
+ if (deflateInit(&sp->stream, sp->zipquality) != Z_OK) {
+ TIFFError(module, "%s: %s", tif->tif_name, sp->stream.msg);
+ return (0);
+ } else {
+ sp->state |= ZSTATE_INIT;
+ return (1);
+ }
+}
+
+/*
+ * Reset encoding state at the start of a strip.
+ */
+static int
+ZIPPreEncode(TIFF* tif, tsample_t s)
+{
+ ZIPState *sp = EncoderState(tif);
+
+ (void) s;
+ assert(sp != NULL);
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out = tif->tif_rawdatasize;
+ return (deflateReset(&sp->stream) == Z_OK);
+}
+
+/*
+ * Encode a chunk of pixels.
+ */
+static int
+ZIPEncode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+ ZIPState *sp = EncoderState(tif);
+ static const char module[] = "ZIPEncode";
+
+ (void) s;
+ sp->stream.next_in = bp;
+ sp->stream.avail_in = cc;
+ do {
+ if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) {
+ TIFFError(module, "%s: Encoder error: %s",
+ tif->tif_name, sp->stream.msg);
+ return (0);
+ }
+ if (sp->stream.avail_out == 0) {
+ tif->tif_rawcc = tif->tif_rawdatasize;
+ TIFFFlushData1(tif);
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out = tif->tif_rawdatasize;
+ }
+ } while (sp->stream.avail_in > 0);
+ return (1);
+}
+
+/*
+ * Finish off an encoded strip by flushing the last
+ * string and tacking on an End Of Information code.
+ */
+static int
+ZIPPostEncode(TIFF* tif)
+{
+ ZIPState *sp = EncoderState(tif);
+ static const char module[] = "ZIPPostEncode";
+ int state;
+
+ sp->stream.avail_in = 0;
+ do {
+ state = deflate(&sp->stream, Z_FINISH);
+ switch (state) {
+ case Z_STREAM_END:
+ case Z_OK:
+ if ((int)sp->stream.avail_out != (int)tif->tif_rawdatasize)
+ {
+ tif->tif_rawcc =
+ tif->tif_rawdatasize - sp->stream.avail_out;
+ TIFFFlushData1(tif);
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out = tif->tif_rawdatasize;
+ }
+ break;
+ default:
+ TIFFError(module, "%s: zlib error: %s",
+ tif->tif_name, sp->stream.msg);
+ return (0);
+ }
+ } while (state != Z_STREAM_END);
+ return (1);
+}
+
+static void
+ZIPCleanup(TIFF* tif)
+{
+ ZIPState* sp = ZState(tif);
+ if (sp) {
+ if (sp->state&ZSTATE_INIT) {
+ /* NB: avoid problems in the library */
+ if (tif->tif_mode == O_RDONLY)
+ inflateEnd(&sp->stream);
+ else
+ deflateEnd(&sp->stream);
+ }
+ _TIFFfree(sp);
+ tif->tif_data = NULL;
+ }
+}
+
+static int
+ZIPVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ ZIPState* sp = ZState(tif);
+ static const char module[] = "ZIPVSetField";
+
+ switch (tag) {
+ case TIFFTAG_ZIPQUALITY:
+ sp->zipquality = va_arg(ap, int);
+ if (tif->tif_mode != O_RDONLY && (sp->state&ZSTATE_INIT)) {
+ if (deflateParams(&sp->stream,
+ sp->zipquality, Z_DEFAULT_STRATEGY) != Z_OK) {
+ TIFFError(module, "%s: zlib error: %s",
+ tif->tif_name, sp->stream.msg);
+ return (0);
+ }
+ }
+ return (1);
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+ /*NOTREACHED*/
+}
+
+static int
+ZIPVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+ ZIPState* sp = ZState(tif);
+
+ switch (tag) {
+ case TIFFTAG_ZIPQUALITY:
+ *va_arg(ap, int*) = sp->zipquality;
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return (1);
+}
+
+static const TIFFFieldInfo zipFieldInfo[] = {
+ { TIFFTAG_ZIPQUALITY, 0, 0, TIFF_ANY, FIELD_PSEUDO,
+ TRUE, FALSE, "" },
+};
+#define N(a) (sizeof (a) / sizeof (a[0]))
+
+int
+TIFFInitZIP(TIFF* tif, int scheme)
+{
+ ZIPState* sp;
+
+ assert( (scheme == COMPRESSION_DEFLATE) || (scheme == COMPRESSION_ADOBE_DEFLATE));
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (ZIPState));
+ if (tif->tif_data == NULL)
+ goto bad;
+ sp = ZState(tif);
+ sp->stream.zalloc = NULL;
+ sp->stream.zfree = NULL;
+ sp->stream.opaque = NULL;
+ sp->stream.data_type = Z_BINARY;
+
+ /*
+ * Merge codec-specific tag information and
+ * override parent get/set field methods.
+ */
+ _TIFFMergeFieldInfo(tif, zipFieldInfo, N(zipFieldInfo));
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = ZIPVGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = ZIPVSetField; /* hook for codec tags */
+
+ /* Default values for codec-specific fields */
+ sp->zipquality = Z_DEFAULT_COMPRESSION; /* default comp. level */
+ sp->state = 0;
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_setupdecode = ZIPSetupDecode;
+ tif->tif_predecode = ZIPPreDecode;
+ tif->tif_decoderow = ZIPDecode;
+ tif->tif_decodestrip = ZIPDecode;
+ tif->tif_decodetile = ZIPDecode;
+ tif->tif_setupencode = ZIPSetupEncode;
+ tif->tif_preencode = ZIPPreEncode;
+ tif->tif_postencode = ZIPPostEncode;
+ tif->tif_encoderow = ZIPEncode;
+ tif->tif_encodestrip = ZIPEncode;
+ tif->tif_encodetile = ZIPEncode;
+ tif->tif_cleanup = ZIPCleanup;
+ /*
+ * Setup predictor setup.
+ */
+ (void) TIFFPredictorInit(tif);
+ return (1);
+bad:
+ TIFFError("TIFFInitZIP", "No space for ZIP state block");
+ return (0);
+}
+#endif /* ZIP_SUPORT */
diff --git a/src/tiff/tiff.h b/src/tiff/tiff.h
new file mode 100644
index 0000000..312c411
--- /dev/null
+++ b/src/tiff/tiff.h
@@ -0,0 +1,482 @@
+/* $Header: /home/terralib/src/tiff/tiff.h,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _TIFF_
+#define _TIFF_
+/*
+ * Tag Image File Format (TIFF)
+ *
+ * Based on Rev 6.0 from:
+ * Developer's Desk
+ * Aldus Corporation
+ * 411 First Ave. South
+ * Suite 200
+ * Seattle, WA 98104
+ * 206-622-5500
+ */
+#define TIFF_VERSION 42
+
+#define TIFF_BIGENDIAN 0x4d4d
+#define TIFF_LITTLEENDIAN 0x4949
+
+/*
+ * The so called TIFF types conflict with definitions from inttypes.h
+ * included from sys/types.h on AIX (at least using VisualAge compiler).
+ * We try to work around this by detecting this case. Defining
+ * _TIFF_DATA_TYPEDEFS_ short circuits the later definitions in tiff.h, and
+ * we will in the holes not provided for by inttypes.h.
+ *
+ * See http://bugzilla.remotesensing.org/show_bug.cgi?id=39
+ */
+#if defined(_H_INTTYPES) && defined(_ALL_SOURCE) && defined(USING_VISUALAGE)
+
+#define _TIFF_DATA_TYPEDEFS_
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+
+#endif
+
+/*
+ * Intrinsic data types required by the file format:
+ *
+ * 8-bit quantities int8/uint8
+ * 16-bit quantities int16/uint16
+ * 32-bit quantities int32/uint32
+ * strings unsigned char*
+ */
+#ifndef _TIFF_DATA_TYPEDEFS_
+#define _TIFF_DATA_TYPEDEFS_
+
+#ifdef __STDC__
+typedef signed char int8; /* NB: non-ANSI compilers may not grok */
+#else
+typedef char int8;
+#endif
+typedef unsigned char uint8;
+typedef short int16;
+typedef unsigned short uint16; /* sizeof (uint16) must == 2 */
+#if defined(__alpha) || (defined(_MIPS_SZLONG) && _MIPS_SZLONG == 64) || defined(__LP64__) || defined(__arch64__)
+typedef int int32;
+typedef unsigned int uint32; /* sizeof (uint32) must == 4 */
+#else
+typedef long int32;
+typedef unsigned long uint32; /* sizeof (uint32) must == 4 */
+#endif
+#endif /* _TIFF_DATA_TYPEDEFS_ */
+
+/* For TIFFReassignTagToIgnore */
+enum TIFFIgnoreSense /* IGNORE tag table */
+{
+ TIS_STORE,
+ TIS_EXTRACT,
+ TIS_EMPTY
+};
+
+typedef struct {
+ uint16 tiff_magic; /* magic number (defines byte order) */
+ uint16 tiff_version; /* TIFF version number */
+ uint32 tiff_diroff; /* byte offset to first directory */
+} TIFFHeader;
+
+/*
+ * TIFF Image File Directories are comprised of
+ * a table of field descriptors of the form shown
+ * below. The table is sorted in ascending order
+ * by tag. The values associated with each entry
+ * are disjoint and may appear anywhere in the file
+ * (so long as they are placed on a word boundary).
+ *
+ * If the value is 4 bytes or less, then it is placed
+ * in the offset field to save space. If the value
+ * is less than 4 bytes, it is left-justified in the
+ * offset field.
+ */
+typedef struct {
+ uint16 tdir_tag; /* see below */
+ uint16 tdir_type; /* data type; see below */
+ uint32 tdir_count; /* number of items; length in spec */
+ uint32 tdir_offset; /* byte offset to field data */
+} TIFFDirEntry;
+
+/*
+ * NB: In the comments below,
+ * - items marked with a + are obsoleted by revision 5.0,
+ * - items marked with a ! are introduced in revision 6.0.
+ * - items marked with a % are introduced post revision 6.0.
+ * - items marked with a $ are obsoleted by revision 6.0.
+ */
+
+/*
+ * Tag data type information.
+ *
+ * Note: RATIONALs are the ratio of two 32-bit integer values.
+ */
+typedef enum {
+ TIFF_NOTYPE = 0, /* placeholder */
+ TIFF_BYTE = 1, /* 8-bit unsigned integer */
+ TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */
+ TIFF_SHORT = 3, /* 16-bit unsigned integer */
+ TIFF_LONG = 4, /* 32-bit unsigned integer */
+ TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */
+ TIFF_SBYTE = 6, /* !8-bit signed integer */
+ TIFF_UNDEFINED = 7, /* !8-bit untyped data */
+ TIFF_SSHORT = 8, /* !16-bit signed integer */
+ TIFF_SLONG = 9, /* !32-bit signed integer */
+ TIFF_SRATIONAL = 10, /* !64-bit signed fraction */
+ TIFF_FLOAT = 11, /* !32-bit IEEE floating point */
+ TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */
+ TIFF_IFD = 13 /* %32-bit unsigned integer (offset) */
+} TIFFDataType;
+
+/*
+ * TIFF Tag Definitions.
+ */
+#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */
+#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */
+#define FILETYPE_PAGE 0x2 /* one page of many */
+#define FILETYPE_MASK 0x4 /* transparency mask */
+#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */
+#define OFILETYPE_IMAGE 1 /* full resolution image data */
+#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */
+#define OFILETYPE_PAGE 3 /* one page of many */
+#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */
+#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */
+#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */
+#define TIFFTAG_COMPRESSION 259 /* data compression technique */
+#define COMPRESSION_NONE 1 /* dump mode */
+#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */
+#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */
+#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */
+#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */
+#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */
+#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */
+#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */
+#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */
+#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */
+#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */
+#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */
+#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */
+/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <dkelly at apago.com) */
+#define COMPRESSION_IT8CTPAD 32895 /* IT8 CT w/padding */
+#define COMPRESSION_IT8LW 32896 /* IT8 Linework RLE */
+#define COMPRESSION_IT8MP 32897 /* IT8 Monochrome picture */
+#define COMPRESSION_IT8BL 32898 /* IT8 Binary line art */
+/* compression codes 32908-32911 are reserved for Pixar */
+#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */
+#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */
+#define COMPRESSION_DEFLATE 32946 /* Deflate compression */
+#define COMPRESSION_ADOBE_DEFLATE 8 /* Deflate compression, as recognized by Adobe */
+/* compression code 32947 is reserved for Oceana Matrix <dev at oceana.com> */
+#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */
+#define COMPRESSION_JBIG 34661 /* ISO JBIG */
+#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */
+#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */
+#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */
+#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */
+#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */
+#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */
+#define PHOTOMETRIC_RGB 2 /* RGB color model */
+#define PHOTOMETRIC_PALETTE 3 /* color map indexed */
+#define PHOTOMETRIC_MASK 4 /* $holdout mask */
+#define PHOTOMETRIC_SEPARATED 5 /* !color separations */
+#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */
+#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */
+#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */
+#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */
+#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */
+#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */
+#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */
+#define THRESHHOLD_BILEVEL 1 /* b&w art scan */
+#define THRESHHOLD_HALFTONE 2 /* or dithered scan */
+#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */
+#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */
+#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */
+#define TIFFTAG_FILLORDER 266 /* data order within a byte */
+#define FILLORDER_MSB2LSB 1 /* most significant -> least */
+#define FILLORDER_LSB2MSB 2 /* least significant -> most */
+#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */
+#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */
+#define TIFFTAG_MAKE 271 /* scanner manufacturer name */
+#define TIFFTAG_MODEL 272 /* scanner model name/number */
+#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */
+#define TIFFTAG_ORIENTATION 274 /* +image orientation */
+#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */
+#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */
+#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */
+#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */
+#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */
+#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */
+#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */
+#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */
+#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */
+#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */
+#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */
+#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */
+#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */
+#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */
+#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */
+#define TIFFTAG_PLANARCONFIG 284 /* storage organization */
+#define PLANARCONFIG_CONTIG 1 /* single image plane */
+#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */
+#define TIFFTAG_PAGENAME 285 /* page name image is from */
+#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */
+#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */
+#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */
+#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */
+#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */
+#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */
+#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */
+#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */
+#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
+#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */
+#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */
+#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */
+#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */
+#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */
+#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */
+#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */
+#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */
+#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */
+#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */
+#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */
+#define RESUNIT_NONE 1 /* no meaningful units */
+#define RESUNIT_INCH 2 /* english */
+#define RESUNIT_CENTIMETER 3 /* metric */
+#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */
+#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */
+#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */
+#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */
+#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */
+#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
+#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */
+#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */
+#define TIFFTAG_SOFTWARE 305 /* name & release */
+#define TIFFTAG_DATETIME 306 /* creation date and time */
+#define TIFFTAG_ARTIST 315 /* creator of image */
+#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */
+#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */
+#define TIFFTAG_WHITEPOINT 318 /* image white point */
+#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */
+#define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */
+#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */
+#define TIFFTAG_TILEWIDTH 322 /* !rows/data tile */
+#define TIFFTAG_TILELENGTH 323 /* !cols/data tile */
+#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */
+#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */
+#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */
+#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */
+#define CLEANFAXDATA_CLEAN 0 /* no errors detected */
+#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */
+#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */
+#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */
+#define TIFFTAG_SUBIFD 330 /* subimage descriptors */
+#define TIFFTAG_INKSET 332 /* !inks in separated image */
+#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */
+#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */
+#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */
+#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */
+#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */
+#define TIFFTAG_TARGETPRINTER 337 /* !separation target */
+#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */
+#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */
+#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */
+#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */
+#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */
+#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */
+#define SAMPLEFORMAT_INT 2 /* !signed integer data */
+#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */
+#define SAMPLEFORMAT_VOID 4 /* !untyped data */
+#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */
+#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */
+#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */
+#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */
+#define TIFFTAG_CLIPPATH 343 /* %ClipPath [Adobe TIFF technote 2] */
+#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits [Adobe TIFF technote 2] */
+#define TIFFTAG_YCLIPPATHUNITS 344 /* %YClipPathUnits [Adobe TIFF technote 2] */
+#define TIFFTAG_INDEXED 345 /* %Indexed [Adobe TIFF Technote 3] */
+#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */
+#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */
+/*
+ * Tags 512-521 are obsoleted by Technical Note #2
+ * which specifies a revised JPEG-in-TIFF scheme.
+ */
+#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */
+#define JPEGPROC_BASELINE 1 /* !baseline sequential */
+#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */
+#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */
+#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */
+#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */
+#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */
+#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */
+#define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */
+#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */
+#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */
+#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */
+#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */
+#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */
+#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */
+#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */
+#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */
+#define TIFFTAG_XMLPACKET 700 /* %XML packet [Adobe XMP technote 9-14-02] (dkelly at apago.com) */
+#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID [Adobe TIFF technote] */
+/* tags 32952-32956 are private tags registered to Island Graphics */
+#define TIFFTAG_REFPTS 32953 /* image reference points */
+#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */
+#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */
+#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */
+/* tags 32995-32999 are private tags registered to SGI */
+#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */
+#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */
+#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */
+#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */
+/* tags 33300-33309 are private tags registered to Pixar */
+/*
+ * TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH
+ * are set when an image has been cropped out of a larger image.
+ * They reflect the size of the original uncropped image.
+ * The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used
+ * to determine the position of the smaller image in the larger one.
+ */
+#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */
+#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */
+ /* Tags 33302-33306 are used to identify special image modes and data
+ * used by Pixar's texture formats.
+ */
+#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */
+#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */
+#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */
+#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305
+#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306
+/* tag 33405 is a private tag registered to Eastman Kodak */
+#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */
+/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */
+#define TIFFTAG_COPYRIGHT 33432 /* copyright string */
+/* IPTC TAG from RichTIFF specifications */
+#define TIFFTAG_RICHTIFFIPTC 33723
+/* 34016-34029 are reserved for ANSI IT8 TIFF/IT <dkelly at apago.com) */
+#define TIFFTAG_IT8SITE 34016 /* site name */
+#define TIFFTAG_IT8COLORSEQUENCE 34017 /* color seq. [RGB,CMYK,etc] */
+#define TIFFTAG_IT8HEADER 34018 /* DDES Header */
+#define TIFFTAG_IT8RASTERPADDING 34019 /* raster scanline padding */
+#define TIFFTAG_IT8BITSPERRUNLENGTH 34020 /* # of bits in short run */
+#define TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH 34021/* # of bits in long run */
+#define TIFFTAG_IT8COLORTABLE 34022 /* LW colortable */
+#define TIFFTAG_IT8IMAGECOLORINDICATOR 34023 /* BP/BL image color switch */
+#define TIFFTAG_IT8BKGCOLORINDICATOR 34024 /* BP/BL bg color switch */
+#define TIFFTAG_IT8IMAGECOLORVALUE 34025 /* BP/BL image color value */
+#define TIFFTAG_IT8BKGCOLORVALUE 34026 /* BP/BL bg color value */
+#define TIFFTAG_IT8PIXELINTENSITYRANGE 34027 /* MP pixel intensity value */
+#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */
+#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */
+#define TIFFTAG_IT8HCUSAGE 34030 /* HC usage indicator */
+#define TIFFTAG_IT8TRAPINDICATOR 34031 /* Trapping indicator (untrapped=0, trapped=1) */
+#define TIFFTAG_IT8CMYKEQUIVALENT 34032 /* CMYK color equivalents */
+/* tags 34232-34236 are private tags registered to Texas Instruments */
+#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */
+/* tag 34750 is a private tag registered to Adobe? */
+#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */
+/* tag 34377 is private tag registered to Adobe for PhotoShop */
+#define TIFFTAG_PHOTOSHOP 34377
+/* tag 34750 is a private tag registered to Pixel Magic */
+#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */
+/* tags 34908-34914 are private tags registered to SGI */
+#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. parms */
+#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */
+#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */
+/* tags 37439-37443 are registered to SGI <gregl at sgi.com> */
+#define TIFFTAG_STONITS 37439 /* Sample value to Nits */
+/* tag 34929 is a private tag registered to FedEx */
+#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */
+/* tag 65535 is an undefined tag used by Eastman Kodak */
+#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */
+
+/*
+ * The following are ``pseudo tags'' that can be
+ * used to control codec-specific functionality.
+ * These tags are not written to file. Note that
+ * these values start at 0xffff+1 so that they'll
+ * never collide with Aldus-assigned tags.
+ *
+ * If you want your private pseudo tags ``registered''
+ * (i.e. added to this file), send mail to sam at sgi.com
+ * with the appropriate C definitions to add.
+ */
+#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */
+#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */
+#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */
+#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */
+#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */
+#define FAXMODE_WORDALIGN 0x0008 /* word align row */
+#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */
+#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */
+/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */
+#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */
+#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */
+#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */
+#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */
+#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */
+#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */
+/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */
+#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */
+#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */
+#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */
+#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */
+#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */
+#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */
+#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */
+#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */
+/* 65550-65556 are allocated to Oceana Matrix <dev at oceana.com> */
+#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */
+#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */
+#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */
+#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */
+#define DCSIMAGERFILTER_IR 0 /* infrared filter */
+#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */
+#define DCSIMAGERFILTER_CFA 2 /* color filter array */
+#define DCSIMAGERFILTER_OTHER 3 /* other filter */
+#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */
+#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */
+#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */
+#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */
+#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */
+#define TIFFTAG_DCSGAMMA 65554 /* gamma value */
+#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */
+#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */
+/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */
+#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */
+#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */
+/* 65559 is allocated to Oceana Matrix <dev at oceana.com> */
+#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */
+#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */
+#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */
+#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */
+#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */
+#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */
+#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/
+#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/
+#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */
+#endif /* _TIFF_ */
diff --git a/src/tiff/tiffcomp.h b/src/tiff/tiffcomp.h
new file mode 100644
index 0000000..a8f80e8
--- /dev/null
+++ b/src/tiff/tiffcomp.h
@@ -0,0 +1,220 @@
+/* $Header: /home/terralib/src/tiff/tiffcomp.h,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1990-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _COMPAT_
+#define _COMPAT_
+/*
+ * This file contains a hodgepodge of definitions and
+ * declarations that are needed to provide compatibility
+ * between the native system and the base implementation
+ * that the library assumes.
+ *
+ * NB: This file is a mess.
+ */
+
+/*
+ * Setup basic type definitions and function declaratations.
+ */
+
+/*
+ * Simplify Acorn RISC OS identifier (to avoid confusion with Acorn RISC iX
+ * and with defunct Unix Risc OS)
+ * No need to specify __arm - hey, Acorn might port the OS, no problem here!
+ */
+#ifdef __acornriscos
+#undef __acornriscos
+#endif
+#if defined(__acorn) && defined(__riscos)
+#define __acornriscos
+#endif
+
+#if defined(__MWERKS__) || defined(THINK_C)
+#include <unix.h>
+#include <math.h>
+#endif
+
+#include <stdio.h>
+
+#if defined(__PPCC__) || defined(__SC__) || defined(__MRC__)
+#include <types.h>
+#elif !defined(__MWERKS__) && !defined(THINK_C) && !defined(__acornriscos) && !defined(applec)
+#include <sys/types.h>
+#endif
+
+#if defined(VMS)
+#include <file.h>
+#include <unixio.h>
+#elif !defined(__acornriscos)
+#include <fcntl.h>
+#endif
+
+/*
+ * This maze of checks controls defines or not the
+ * target system has BSD-style typdedefs declared in
+ * an include file and/or whether or not to include
+ * <unistd.h> to get the SEEK_* definitions. Some
+ * additional includes are also done to pull in the
+ * appropriate definitions we're looking for.
+ */
+#if defined(__MWERKS__) || defined(THINK_C) || defined(__PPCC__) || defined(__SC__) || defined(__MRC__)
+#include <stdlib.h>
+#define BSDTYPES
+#define HAVE_UNISTD_H 0
+#elif (defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) || defined(_WIN32)) && !defined(unix)
+#define BSDTYPES
+#elif defined(OS2_16) || defined(OS2_32)
+#define BSDTYPES
+#elif defined(__acornriscos)
+#include <stdlib.h>
+#define BSDTYPES
+#define HAVE_UNISTD_H 0
+#elif defined(VMS)
+#define HAVE_UNISTD_H 0
+#else
+#define HAVE_UNISTD_H 1
+#endif
+
+/*
+ * The library uses the ANSI C/POSIX SEEK_*
+ * definitions that should be defined in unistd.h
+ * (except on system where they are in stdio.h and
+ * there is no unistd.h).
+ */
+#if !defined(SEEK_SET) && HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/*
+ * The library uses memset, memcpy, and memcmp.
+ * ANSI C and System V define these in string.h.
+ */
+#include <string.h>
+
+/*
+ * The BSD typedefs are used throughout the library.
+ * If your system doesn't have them in <sys/types.h>,
+ * then define BSDTYPES in your Makefile.
+ */
+#if defined(BSDTYPES)
+# ifndef _BSDTYPES_DEFINED
+# ifndef __u_char_defined
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+typedef unsigned long u_long;
+# define __u_char_defined
+# endif /* __u_char_defined */
+# define _BSDTYPES_DEFINED
+# endif /* _BSDTYPES_DEFINED */
+#endif /* BSDTYPES */
+
+/*
+ * dblparam_t is the type that a double precision
+ * floating point value will have on the parameter
+ * stack (when coerced by the compiler).
+ */
+/* Note: on MacPowerPC "extended" is undefined. So only use it for 68K-Macs */
+#if defined(__SC__) || defined(THINK_C)
+typedef extended dblparam_t;
+#else
+typedef double dblparam_t;
+#endif
+
+/*
+ * If your compiler supports inline functions, then
+ * set INLINE appropriately to get the known hotspots
+ * in the library expanded inline.
+ */
+#if defined(__GNUC__)
+#if defined(__STRICT_ANSI__)
+#define INLINE __inline__
+#else
+#define INLINE inline
+#endif
+#else /* !__GNUC__ */
+#define INLINE
+#endif
+
+/*
+ * GLOBALDATA is a macro that is used to define global variables
+ * private to the library. We use this indirection to hide
+ * brain-damage in VAXC (and GCC) under VAX/VMS. In these
+ * environments the macro places the variable in a non-shareable
+ * program section, which ought to be done by default (sigh!)
+ *
+ * Apparently DEC are aware of the problem as this behaviour is the
+ * default under VMS on AXP.
+ *
+ * The GNU C variant is untested.
+ */
+#if defined(VAX) && defined(VMS)
+#if defined(VAXC)
+#define GLOBALDATA(TYPE,NAME) extern noshare TYPE NAME
+#endif
+#if defined(__GNUC__)
+#define GLOBALDATA(TYPE,NAME) extern TYPE NAME \
+ asm("_$$PsectAttributes_NOSHR$$" #NAME)
+#endif
+#else /* !VAX/VMS */
+#define GLOBALDATA(TYPE,NAME) extern TYPE NAME
+#endif
+
+#if defined(__acornriscos)
+/*
+ * osfcn.h is part of C++Lib on Acorn C/C++, and as such can't be used
+ * on C alone. For that reason, the relevant functions are
+ * implemented in tif_acorn.c, and the elements from the header
+ * file are included here.
+ */
+#if defined(__cplusplus)
+#include <osfcn.h>
+#else
+#define O_RDONLY 0
+#define O_WRONLY 1
+#define O_RDWR 2
+#define O_APPEND 8
+#define O_CREAT 0x200
+#define O_TRUNC 0x400
+typedef long off_t;
+extern int open(const char *name, int flags, int mode);
+extern int close(int fd);
+extern int write(int fd, const char *buf, int nbytes);
+extern int read(int fd, char *buf, int nbytes);
+extern off_t lseek(int fd, off_t offset, int whence);
+extern int creat(const char *path, int mode);
+#endif /* __cplusplus */
+#endif /* __acornriscos */
+
+/* Bit and byte order, the default is MSB to LSB */
+#ifdef VMS
+#undef HOST_FILLORDER
+#undef HOST_BIGENDIAN
+#define HOST_FILLORDER FILLORDER_LSB2MSB
+#define HOST_BIGENDIAN 0
+#endif
+
+
+#endif /* _COMPAT_ */
diff --git a/src/tiff/tiffconf.h b/src/tiff/tiffconf.h
new file mode 100644
index 0000000..b2b3c93
--- /dev/null
+++ b/src/tiff/tiffconf.h
@@ -0,0 +1,153 @@
+/* $Header: /home/terralib/src/tiff/tiffconf.h,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _TIFFCONF_
+#define _TIFFCONF_
+/*
+ * Library Configuration Definitions.
+ *
+ * This file defines the default configuration for the library.
+ * If the target system does not have make or a way to specify
+ * #defines on the command line, this file can be edited to
+ * configure the library. Otherwise, one can override portability
+ * and configuration-related definitions from a Makefile or command
+ * line by defining COMPRESSION_SUPPORT (see below).
+ */
+
+/*
+ * General portability-related defines:
+ *
+ * HAVE_IEEEFP define as 0 or 1 according to the floating point
+ * format suported by the machine
+ * BSDTYPES define this if your system does NOT define the
+ * usual 4BSD typedefs u_int et. al.
+ * HAVE_MMAP enable support for memory mapping read-only files;
+ * this is typically deduced by the configure script
+ * HOST_FILLORDER native cpu bit order: one of FILLORDER_MSB2LSB
+ * or FILLODER_LSB2MSB; this is typically set by the
+ * configure script
+ * HOST_BIGENDIAN native cpu byte order: 1 if big-endian (Motorola)
+ * or 0 if little-endian (Intel); this may be used
+ * in codecs to optimize code
+ * USE_64BIT_API set to 1 if tif_unix.c should use lseek64(),
+ * fstat64() and stat64 allowing 2-4GB files.
+ */
+#ifndef HAVE_IEEEFP
+#define HAVE_IEEEFP 1
+#endif
+#ifndef HOST_FILLORDER
+#define HOST_FILLORDER FILLORDER_MSB2LSB
+#endif
+#ifndef HOST_BIGENDIAN
+#define HOST_BIGENDIAN 1
+#endif
+
+#ifndef USE_64BIT_API
+# define USE_64BIT_API 0
+#endif
+
+#ifndef COMPRESSION_SUPPORT
+/*
+ * Compression support defines:
+ *
+ * CCITT_SUPPORT enable support for CCITT Group 3 & 4 algorithms
+ * PACKBITS_SUPPORT enable support for Macintosh PackBits algorithm
+ * LZW_SUPPORT enable support for LZW algorithm
+ * THUNDER_SUPPORT enable support for ThunderScan 4-bit RLE algorithm
+ * NEXT_SUPPORT enable support for NeXT 2-bit RLE algorithm
+ * OJPEG_SUPPORT enable support for 6.0-style JPEG DCT algorithms
+ * (requires IJG software)
+ * JPEG_SUPPORT enable support for post-6.0-style JPEG DCT algorithms
+ * (requires freely available IJG software, see tif_jpeg.c)
+ * ZIP_SUPPORT enable support for Deflate algorithm
+ * (requires freely available zlib software, see tif_zip.c)
+ * PIXARLOG_SUPPORT enable support for Pixar log-format algorithm
+ * LOGLUV_SUPPORT enable support for LogLuv high dynamic range encoding
+ */
+#define CCITT_SUPPORT
+#define PACKBITS_SUPPORT
+#define LZW_SUPPORT
+#define THUNDER_SUPPORT
+#define NEXT_SUPPORT
+#define LOGLUV_SUPPORT
+#endif /* COMPRESSION_SUPPORT */
+
+/*
+ * If JPEG compression is enabled then we must also include
+ * support for the colorimetry and YCbCr-related tags.
+ */
+#ifdef JPEG_SUPPORT
+#ifndef YCBCR_SUPPORT
+#define YCBCR_SUPPORT
+#endif
+#ifndef COLORIMETRY_SUPPORT
+#define COLORIMETRY_SUPPORT
+#endif
+#endif /* JPEG_SUPPORT */
+
+/*
+ * ``Orthogonal Features''
+ *
+ * STRIPCHOP_DEFAULT default handling of strip chopping support (whether
+ * or not to convert single-strip uncompressed images
+ * to mutiple strips of ~8Kb--to reduce memory use)
+ * SUBIFD_SUPPORT enable support for SubIFD tag (thumbnails and such)
+ * DEFAULT_EXTRASAMPLE_AS_ALPHA
+ * The RGBA interface will treat a fourth sample with
+ * no EXTRASAMPLE_ value as being ASSOCALPHA. Many
+ * packages produce RGBA files but don't mark the alpha
+ * properly.
+ * CHECK_JPEG_YCBCR_SUBSAMPLING
+ * Enable picking up YCbCr subsampling info from the
+ * JPEG data stream to support files lacking the tag.
+ * See Bug 168 in Bugzilla, and JPEGFixupTestSubsampling()
+ * for details.
+ */
+#ifndef STRIPCHOP_DEFAULT
+#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP /* default is to enable */
+#endif
+#ifndef SUBIFD_SUPPORT
+#define SUBIFD_SUPPORT 1 /* enable SubIFD tag (330) support */
+#endif
+#ifndef DEFAULT_EXTRASAMPLE_AS_ALPHA
+#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1
+#endif
+#ifndef CHECK_JPEG_YCBCR_SUBSAMPLING
+#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
+#endif
+
+/*
+ * Feature support definitions.
+ * XXX: These macros are obsoleted. Don't use them in your apps!
+ * Macros stays here for backward compatibility and should be always defined.
+ */
+#define COLORIMETRY_SUPPORT
+#define YCBCR_SUPPORT
+#define CMYK_SUPPORT
+#define ICC_SUPPORT
+#define PHOTOSHOP_SUPPORT
+#define IPTC_SUPPORT
+
+#endif /* _TIFFCONF_ */
diff --git a/src/tiff/tiffio.h b/src/tiff/tiffio.h
new file mode 100644
index 0000000..be79679
--- /dev/null
+++ b/src/tiff/tiffio.h
@@ -0,0 +1,479 @@
+/* $Header: /home/terralib/src/tiff/tiffio.h,v 1.4 2004/04/12 13:52:41 juan Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _TIFFIO_
+#define _TIFFIO_
+
+/*
+ * TIFF I/O Library Definitions.
+ */
+#include "tiff.h"
+#include "tiffvers.h"
+
+/*
+ * TIFF is defined as an incomplete type to hide the
+ * library's internal data structures from clients.
+ */
+typedef struct tiff TIFF;
+
+/*
+ * The following typedefs define the intrinsic size of
+ * data types used in the *exported* interfaces. These
+ * definitions depend on the proper definition of types
+ * in tiff.h. Note also that the varargs interface used
+ * to pass tag types and values uses the types defined in
+ * tiff.h directly.
+ *
+ * NB: ttag_t is unsigned int and not unsigned short because
+ * ANSI C requires that the type before the ellipsis be a
+ * promoted type (i.e. one of int, unsigned int, pointer,
+ * or double) and because we defined pseudo-tags that are
+ * outside the range of legal Aldus-assigned tags.
+ * NB: tsize_t is int32 and not uint32 because some functions
+ * return -1.
+ * NB: toff_t is not off_t for many reasons; TIFFs max out at
+ * 32-bit file offsets being the most important, and to ensure
+ * that it is unsigned, rather than signed.
+ */
+typedef uint32 ttag_t; /* directory tag */
+typedef uint16 tdir_t; /* directory index */
+typedef uint16 tsample_t; /* sample number */
+typedef uint32 tstrip_t; /* strip number */
+typedef uint32 ttile_t; /* tile number */
+typedef int32 tsize_t; /* i/o size in bytes */
+typedef void* tdata_t; /* image data ref */
+typedef uint32 toff_t; /* file offset */
+
+#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32))
+#define __WIN32__
+#endif
+
+/*
+ * On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c
+ * or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c).
+ *
+ * By default tif_win32.c is assumed on windows if not using the cygwin
+ * environment.
+ */
+
+#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows)
+# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILIO)
+# define USE_WIN32_FILEIO
+# endif
+#endif
+
+#if defined(USE_WIN32_FILEIO)
+#include <windows.h>
+#ifdef __WIN32__
+DECLARE_HANDLE(thandle_t); /* Win32 file handle */
+#else
+typedef HFILE thandle_t; /* client data handle */
+#endif
+#else
+typedef void* thandle_t; /* client data handle */
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+/*
+ * Flags to pass to TIFFPrintDirectory to control
+ * printing of data structures that are potentially
+ * very large. Bit-or these flags to enable printing
+ * multiple items.
+ */
+#define TIFFPRINT_NONE 0x0 /* no extra info */
+#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */
+#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */
+#define TIFFPRINT_COLORMAP 0x4 /* colormap */
+#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */
+#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */
+#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */
+
+/*
+ * Colour conversion stuff
+ */
+
+/* reference white */
+#define D65_X0 (95.0470F)
+#define D65_Y0 (100.0F)
+#define D65_Z0 (108.8827F)
+
+#define D50_X0 (96.4250F)
+#define D50_Y0 (100.0F)
+#define D50_Z0 (82.4680F)
+
+/* Structure for holding information about a display device. */
+
+typedef unsigned char TIFFRGBValue; /* 8-bit samples */
+
+typedef struct {
+ float d_mat[3][3]; /* XYZ -> luminance matrix */
+ float d_YCR; /* Light o/p for reference white */
+ float d_YCG;
+ float d_YCB;
+ uint32 d_Vrwr; /* Pixel values for ref. white */
+ uint32 d_Vrwg;
+ uint32 d_Vrwb;
+ float d_Y0R; /* Residual light for black pixel */
+ float d_Y0G;
+ float d_Y0B;
+ float d_gammaR; /* Gamma values for the three guns */
+ float d_gammaG;
+ float d_gammaB;
+} TIFFDisplay;
+
+typedef struct { /* YCbCr->RGB support */
+ TIFFRGBValue* clamptab; /* range clamping table */
+ int* Cr_r_tab;
+ int* Cb_b_tab;
+ int32* Cr_g_tab;
+ int32* Cb_g_tab;
+ int32* Y_tab;
+} TIFFYCbCrToRGB;
+
+typedef struct { /* CIE Lab 1976->RGB support */
+ int range; /* Size of conversion table */
+#define CIELABTORGB_TABLE_RANGE 1500
+ float rstep, gstep, bstep;
+ float X0, Y0, Z0; /* Reference white point */
+ TIFFDisplay display;
+ float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */
+ float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */
+ float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */
+} TIFFCIELabToRGB;
+
+extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, TIFFDisplay *, float*);
+extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32,
+ float *, float *, float *);
+extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float,
+ uint32 *, uint32 *, uint32 *);
+
+extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*);
+extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32,
+ uint32 *, uint32 *, uint32 *);
+
+/*
+ * RGBA-style image support.
+ */
+typedef struct _TIFFRGBAImage TIFFRGBAImage;
+/*
+ * The image reading and conversion routines invoke
+ * ``put routines'' to copy/image/whatever tiles of
+ * raw image data. A default set of routines are
+ * provided to convert/copy raw image data to 8-bit
+ * packed ABGR format rasters. Applications can supply
+ * alternate routines that unpack the data into a
+ * different format or, for example, unpack the data
+ * and draw the unpacked raster on the display.
+ */
+typedef void (*tileContigRoutine)
+ (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
+ unsigned char*);
+typedef void (*tileSeparateRoutine)
+ (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
+ unsigned char*, unsigned char*, unsigned char*, unsigned char*);
+/*
+ * RGBA-reader state.
+ */
+struct _TIFFRGBAImage {
+ TIFF* tif; /* image handle */
+ int stoponerr; /* stop on read error */
+ int isContig; /* data is packed/separate */
+ int alpha; /* type of alpha data present */
+ uint32 width; /* image width */
+ uint32 height; /* image height */
+ uint16 bitspersample; /* image bits/sample */
+ uint16 samplesperpixel; /* image samples/pixel */
+ uint16 orientation; /* image orientation */
+ uint16 req_orientation; /* requested orientation */
+ uint16 photometric; /* image photometric interp */
+ uint16* redcmap; /* colormap pallete */
+ uint16* greencmap;
+ uint16* bluecmap;
+ /* get image data routine */
+ int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32);
+ union {
+ void (*any)(TIFFRGBAImage*);
+ tileContigRoutine contig;
+ tileSeparateRoutine separate;
+ } put; /* put decoded strip/tile */
+ TIFFRGBValue* Map; /* sample mapping array */
+ uint32** BWmap; /* black&white map */
+ uint32** PALmap; /* palette image map */
+ TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */
+ TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */
+
+ int row_offset;
+ int col_offset;
+};
+
+/*
+ * Macros for extracting components from the
+ * packed ABGR form returned by TIFFReadRGBAImage.
+ */
+#define TIFFGetR(abgr) ((abgr) & 0xff)
+#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
+#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
+#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)
+
+/*
+ * A CODEC is a software package that implements decoding,
+ * encoding, or decoding+encoding of a compression algorithm.
+ * The library provides a collection of builtin codecs.
+ * More codecs may be registered through calls to the library
+ * and/or the builtin implementations may be overridden.
+ */
+typedef int (*TIFFInitMethod)(TIFF*, int);
+typedef struct {
+ char* name;
+ uint16 scheme;
+ TIFFInitMethod init;
+} TIFFCodec;
+
+#include <stdio.h>
+#include <stdarg.h>
+
+/* share internal LogLuv conversion routines? */
+#ifndef LOGLUV_PUBLIC
+#define LOGLUV_PUBLIC 1
+#endif
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+typedef void (*TIFFErrorHandler)(const char*, const char*, va_list);
+typedef tsize_t (*TIFFReadWriteProc)(thandle_t, tdata_t, tsize_t);
+typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
+typedef int (*TIFFCloseProc)(thandle_t);
+typedef toff_t (*TIFFSizeProc)(thandle_t);
+typedef int (*TIFFMapFileProc)(thandle_t, tdata_t*, toff_t*);
+typedef void (*TIFFUnmapFileProc)(thandle_t, tdata_t, toff_t);
+typedef void (*TIFFExtendProc)(TIFF*);
+
+extern const char* TIFFGetVersion(void);
+
+extern const TIFFCodec* TIFFFindCODEC(uint16);
+extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod);
+extern void TIFFUnRegisterCODEC(TIFFCodec*);
+extern int TIFFIsCODECConfigured(uint16);
+
+extern tdata_t _TIFFmalloc(tsize_t);
+extern tdata_t _TIFFrealloc(tdata_t, tsize_t);
+extern void _TIFFmemset(tdata_t, int, tsize_t);
+extern void _TIFFmemcpy(tdata_t, const tdata_t, tsize_t);
+extern int _TIFFmemcmp(const tdata_t, const tdata_t, tsize_t);
+extern void _TIFFfree(tdata_t);
+
+extern void TIFFClose(TIFF*);
+extern int TIFFFlush(TIFF*);
+extern int TIFFFlushData(TIFF*);
+extern int TIFFGetField(TIFF*, ttag_t, ...);
+extern int TIFFVGetField(TIFF*, ttag_t, va_list);
+extern int TIFFGetFieldDefaulted(TIFF*, ttag_t, ...);
+extern int TIFFVGetFieldDefaulted(TIFF*, ttag_t, va_list);
+extern int TIFFReadDirectory(TIFF*);
+extern tsize_t TIFFScanlineSize(TIFF*);
+extern tsize_t TIFFRasterScanlineSize(TIFF*);
+extern tsize_t TIFFStripSize(TIFF*);
+extern tsize_t TIFFRawStripSize(TIFF*, tstrip_t);
+extern tsize_t TIFFVStripSize(TIFF*, uint32);
+extern tsize_t TIFFTileRowSize(TIFF*);
+extern tsize_t TIFFTileSize(TIFF*);
+extern tsize_t TIFFVTileSize(TIFF*, uint32);
+extern uint32 TIFFDefaultStripSize(TIFF*, uint32);
+extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
+extern int TIFFFileno(TIFF*);
+extern int TIFFGetMode(TIFF*);
+extern int TIFFIsTiled(TIFF*);
+extern int TIFFIsByteSwapped(TIFF*);
+extern int TIFFIsUpSampled(TIFF*);
+extern int TIFFIsMSB2LSB(TIFF*);
+extern uint32 TIFFCurrentRow(TIFF*);
+extern tdir_t TIFFCurrentDirectory(TIFF*);
+extern tdir_t TIFFNumberOfDirectories(TIFF*);
+extern uint32 TIFFCurrentDirOffset(TIFF*);
+extern tstrip_t TIFFCurrentStrip(TIFF*);
+extern ttile_t TIFFCurrentTile(TIFF*);
+extern int TIFFReadBufferSetup(TIFF*, tdata_t, tsize_t);
+extern int TIFFWriteBufferSetup(TIFF*, tdata_t, tsize_t);
+extern int TIFFSetupStrips(TIFF *);
+extern int TIFFWriteCheck(TIFF*, int, const char *);
+extern int TIFFCreateDirectory(TIFF*);
+extern int TIFFLastDirectory(TIFF*);
+extern int TIFFSetDirectory(TIFF*, tdir_t);
+extern int TIFFSetSubDirectory(TIFF*, uint32);
+extern int TIFFUnlinkDirectory(TIFF*, tdir_t);
+extern int TIFFSetField(TIFF*, ttag_t, ...);
+extern int TIFFVSetField(TIFF*, ttag_t, va_list);
+extern int TIFFWriteDirectory(TIFF *);
+extern int TIFFCheckpointDirectory(TIFF *);
+extern int TIFFRewriteDirectory(TIFF *);
+extern int TIFFReassignTagToIgnore(enum TIFFIgnoreSense, int);
+
+#if defined(c_plusplus) || defined(__cplusplus)
+extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0);
+extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t = 0);
+extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t = 0);
+extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0);
+extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*,
+ int = ORIENTATION_BOTLEFT, int = 0);
+#else
+extern void TIFFPrintDirectory(TIFF*, FILE*, long);
+extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t);
+extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t);
+extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int);
+extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int);
+#endif
+
+extern int TIFFReadRGBAStrip(TIFF*, tstrip_t, uint32 * );
+extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * );
+extern int TIFFRGBAImageOK(TIFF*, char [1024]);
+extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]);
+extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32);
+extern void TIFFRGBAImageEnd(TIFFRGBAImage*);
+extern TIFF* TIFFOpen(const char*, const char*);
+extern TIFF* TIFFFdOpen(int, const char*, const char*);
+extern TIFF* TIFFClientOpen(const char*, const char*,
+ thandle_t,
+ TIFFReadWriteProc, TIFFReadWriteProc,
+ TIFFSeekProc, TIFFCloseProc,
+ TIFFSizeProc,
+ TIFFMapFileProc, TIFFUnmapFileProc);
+extern const char* TIFFFileName(TIFF*);
+extern void TIFFError(const char*, const char*, ...);
+extern void TIFFWarning(const char*, const char*, ...);
+extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
+extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
+extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
+extern ttile_t TIFFComputeTile(TIFF*, uint32, uint32, uint32, tsample_t);
+extern int TIFFCheckTile(TIFF*, uint32, uint32, uint32, tsample_t);
+extern ttile_t TIFFNumberOfTiles(TIFF*);
+extern tsize_t TIFFReadTile(TIFF*,
+ tdata_t, uint32, uint32, uint32, tsample_t);
+extern tsize_t TIFFWriteTile(TIFF*,
+ tdata_t, uint32, uint32, uint32, tsample_t);
+extern tstrip_t TIFFComputeStrip(TIFF*, uint32, tsample_t);
+extern tstrip_t TIFFNumberOfStrips(TIFF*);
+extern tsize_t TIFFReadEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
+extern tsize_t TIFFReadRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
+extern tsize_t TIFFReadEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t);
+extern tsize_t TIFFReadRawTile(TIFF*, ttile_t, tdata_t, tsize_t);
+extern tsize_t TIFFWriteEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
+extern tsize_t TIFFWriteRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
+extern tsize_t TIFFWriteStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
+extern tsize_t TIFFWriteEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t);
+extern tsize_t TIFFWriteRawTile(TIFF*, ttile_t, tdata_t, tsize_t);
+extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */
+extern void TIFFSetWriteOffset(TIFF*, toff_t);
+extern void TIFFSwabShort(uint16*);
+extern void TIFFSwabLong(uint32*);
+extern void TIFFSwabDouble(double*);
+extern void TIFFSwabArrayOfShort(uint16*, unsigned long);
+extern void TIFFSwabArrayOfLong(uint32*, unsigned long);
+extern void TIFFSwabArrayOfDouble(double*, unsigned long);
+extern void TIFFReverseBits(unsigned char *, unsigned long);
+extern const unsigned char* TIFFGetBitRevTable(int);
+
+
+#ifdef LOGLUV_PUBLIC
+#define U_NEU 0.210526316
+#define V_NEU 0.473684211
+#define UVSCALE 410.
+extern double LogL16toY(int);
+extern double LogL10toY(int);
+extern void XYZtoRGB24(float*, uint8*);
+extern int uv_decode(double*, double*, int);
+extern void LogLuv24toXYZ(uint32, float*);
+extern void LogLuv32toXYZ(uint32, float*);
+#if defined(c_plusplus) || defined(__cplusplus)
+extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
+extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
+extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
+extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER);
+extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER);
+#else
+extern int LogL16fromY(double, int);
+extern int LogL10fromY(double, int);
+extern int uv_encode(double, double, int);
+extern uint32 LogLuv24fromXYZ(float*, int);
+extern uint32 LogLuv32fromXYZ(float*, int);
+#endif
+#endif /* LOGLUV_PUBLIC */
+
+/*
+** New stuff going public in 3.6.x.
+*/
+extern int TIFFGetTagListCount( TIFF * );
+extern ttag_t TIFFGetTagListEntry( TIFF *, int tag_index );
+
+#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
+#define TIFF_VARIABLE -1 /* marker for variable length tags */
+#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
+#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */
+
+#define FIELD_CUSTOM 65
+
+typedef struct {
+ ttag_t field_tag; /* field's tag */
+ short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
+ short field_writecount; /* write count/TIFF_VARIABLE */
+ TIFFDataType field_type; /* type of associated data */
+ unsigned short field_bit; /* bit in fieldsset bit vector */
+ unsigned char field_oktochange; /* if true, can change while writing */
+ unsigned char field_passcount; /* if true, pass dir count on set */
+ char *field_name; /* ASCII name */
+} TIFFFieldInfo;
+
+typedef struct _TIFFTagValue {
+ const TIFFFieldInfo *info;
+ int count;
+ void *value;
+} TIFFTagValue;
+
+extern void TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], int);
+extern const TIFFFieldInfo* TIFFFindFieldInfo(TIFF*, ttag_t, TIFFDataType);
+extern const TIFFFieldInfo* TIFFFieldWithTag(TIFF*, ttag_t);
+
+typedef int (*TIFFVSetMethod)(TIFF*, ttag_t, va_list);
+typedef int (*TIFFVGetMethod)(TIFF*, ttag_t, va_list);
+typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long);
+
+typedef struct {
+ TIFFVSetMethod vsetfield; /* tag set routine */
+ TIFFVGetMethod vgetfield; /* tag get routine */
+ TIFFPrintMethod printdir; /* directory print routine */
+} TIFFTagMethods;
+
+extern TIFFTagMethods *TIFFAccessTagMethods( TIFF * );
+extern void *TIFFGetClientInfo( TIFF *, const char * );
+extern void TIFFSetClientInfo( TIFF *, void *, const char * );
+
+#if defined(__cplusplus)
+}
+#endif
+#endif /* _TIFFIO_ */
diff --git a/src/tiff/tiffiop.h b/src/tiff/tiffiop.h
new file mode 100644
index 0000000..b36cbeb
--- /dev/null
+++ b/src/tiff/tiffiop.h
@@ -0,0 +1,289 @@
+/* $Header: /home/terralib/src/tiff/tiffiop.h,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _TIFFIOP_
+#define _TIFFIOP_
+/*
+ * ``Library-private'' definitions.
+ */
+/*
+ * UNIX systems should run the configure script to generate
+ * a port.h file that reflects the system capabilities.
+ * Doing this obviates all the dreck done in tiffcomp.h.
+ */
+#if defined(unix) || defined(__unix)
+#include "port.h"
+#include "tiffconf.h"
+#else
+#include "tiffconf.h"
+#include "tiffcomp.h"
+#endif
+#include "tiffio.h"
+#include "tif_dir.h"
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
+
+typedef struct client_info {
+ struct client_info *next;
+ void *data;
+ char *name;
+} TIFFClientInfoLink;
+
+/*
+ * Typedefs for ``method pointers'' used internally.
+ */
+typedef unsigned char tidataval_t; /* internal image data value type */
+typedef tidataval_t* tidata_t; /* reference to internal image data */
+
+typedef void (*TIFFVoidMethod)(TIFF*);
+typedef int (*TIFFBoolMethod)(TIFF*);
+typedef int (*TIFFPreMethod)(TIFF*, tsample_t);
+typedef int (*TIFFCodeMethod)(TIFF*, tidata_t, tsize_t, tsample_t);
+typedef int (*TIFFSeekMethod)(TIFF*, uint32);
+typedef void (*TIFFPostMethod)(TIFF*, tidata_t, tsize_t);
+typedef uint32 (*TIFFStripMethod)(TIFF*, uint32);
+typedef void (*TIFFTileMethod)(TIFF*, uint32*, uint32*);
+
+struct tiff {
+ char* tif_name; /* name of open file */
+ int tif_fd; /* open file descriptor */
+ int tif_mode; /* open mode (O_*) */
+ uint32 tif_flags;
+#define TIFF_FILLORDER 0x0003 /* natural bit fill order for machine */
+#define TIFF_DIRTYHEADER 0x0004 /* header must be written on close */
+#define TIFF_DIRTYDIRECT 0x0008 /* current directory must be written */
+#define TIFF_BUFFERSETUP 0x0010 /* data buffers setup */
+#define TIFF_CODERSETUP 0x0020 /* encoder/decoder setup done */
+#define TIFF_BEENWRITING 0x0040 /* written 1+ scanlines to file */
+#define TIFF_SWAB 0x0080 /* byte swap file information */
+#define TIFF_NOBITREV 0x0100 /* inhibit bit reversal logic */
+#define TIFF_MYBUFFER 0x0200 /* my raw data buffer; free on close */
+#define TIFF_ISTILED 0x0400 /* file is tile, not strip- based */
+#define TIFF_MAPPED 0x0800 /* file is mapped into memory */
+#define TIFF_POSTENCODE 0x1000 /* need call to postencode routine */
+#define TIFF_INSUBIFD 0x2000 /* currently writing a subifd */
+#define TIFF_UPSAMPLED 0x4000 /* library is doing data up-sampling */
+#define TIFF_STRIPCHOP 0x8000 /* enable strip chopping support */
+ toff_t tif_diroff; /* file offset of current directory */
+ toff_t tif_nextdiroff; /* file offset of following directory */
+ toff_t* tif_dirlist; /* list of offsets to already seen */
+ /* directories to prevent IFD looping */
+ uint16 tif_dirnumber; /* number of already seen directories */
+ TIFFDirectory tif_dir; /* internal rep of current directory */
+ TIFFHeader tif_header; /* file's header block */
+ const int* tif_typeshift; /* data type shift counts */
+ const long* tif_typemask; /* data type masks */
+ uint32 tif_row; /* current scanline */
+ tdir_t tif_curdir; /* current directory (index) */
+ tstrip_t tif_curstrip; /* current strip for read/write */
+ toff_t tif_curoff; /* current offset for read/write */
+ toff_t tif_dataoff; /* current offset for writing dir */
+#if SUBIFD_SUPPORT
+ uint16 tif_nsubifd; /* remaining subifds to write */
+ toff_t tif_subifdoff; /* offset for patching SubIFD link */
+#endif
+/* tiling support */
+ uint32 tif_col; /* current column (offset by row too) */
+ ttile_t tif_curtile; /* current tile for read/write */
+ tsize_t tif_tilesize; /* # of bytes in a tile */
+/* compression scheme hooks */
+ int tif_decodestatus;
+ TIFFBoolMethod tif_setupdecode;/* called once before predecode */
+ TIFFPreMethod tif_predecode; /* pre- row/strip/tile decoding */
+ TIFFBoolMethod tif_setupencode;/* called once before preencode */
+ int tif_encodestatus;
+ TIFFPreMethod tif_preencode; /* pre- row/strip/tile encoding */
+ TIFFBoolMethod tif_postencode; /* post- row/strip/tile encoding */
+ TIFFCodeMethod tif_decoderow; /* scanline decoding routine */
+ TIFFCodeMethod tif_encoderow; /* scanline encoding routine */
+ TIFFCodeMethod tif_decodestrip;/* strip decoding routine */
+ TIFFCodeMethod tif_encodestrip;/* strip encoding routine */
+ TIFFCodeMethod tif_decodetile; /* tile decoding routine */
+ TIFFCodeMethod tif_encodetile; /* tile encoding routine */
+ TIFFVoidMethod tif_close; /* cleanup-on-close routine */
+ TIFFSeekMethod tif_seek; /* position within a strip routine */
+ TIFFVoidMethod tif_cleanup; /* cleanup state routine */
+ TIFFStripMethod tif_defstripsize;/* calculate/constrain strip size */
+ TIFFTileMethod tif_deftilesize;/* calculate/constrain tile size */
+ tidata_t tif_data; /* compression scheme private data */
+/* input/output buffering */
+ tsize_t tif_scanlinesize;/* # of bytes in a scanline */
+ tsize_t tif_scanlineskew;/* scanline skew for reading strips */
+ tidata_t tif_rawdata; /* raw data buffer */
+ tsize_t tif_rawdatasize;/* # of bytes in raw data buffer */
+ tidata_t tif_rawcp; /* current spot in raw buffer */
+ tsize_t tif_rawcc; /* bytes unread from raw buffer */
+
+/* memory-mapped file support */
+ tidata_t tif_base; /* base of mapped file */
+ toff_t tif_size; /* size of mapped file region (bytes) */
+ TIFFMapFileProc tif_mapproc; /* map file method */
+ TIFFUnmapFileProc tif_unmapproc;/* unmap file method */
+/* input/output callback methods */
+ thandle_t tif_clientdata; /* callback parameter */
+ TIFFReadWriteProc tif_readproc; /* read method */
+ TIFFReadWriteProc tif_writeproc;/* write method */
+ TIFFSeekProc tif_seekproc; /* lseek method */
+ TIFFCloseProc tif_closeproc; /* close method */
+ TIFFSizeProc tif_sizeproc; /* filesize method */
+/* post-decoding support */
+ TIFFPostMethod tif_postdecode; /* post decoding routine */
+/* tag support */
+ TIFFFieldInfo** tif_fieldinfo; /* sorted table of registered tags */
+ int tif_nfields; /* # entries in registered tag table */
+ TIFFTagMethods tif_tagmethods; /* tag get/set/print routines */
+ TIFFClientInfoLink *tif_clientinfo; /* extra client information. */
+};
+
+#define isPseudoTag(t) (t > 0xffff) /* is tag value normal or pseudo */
+
+#define isTiled(tif) (((tif)->tif_flags & TIFF_ISTILED) != 0)
+#define isMapped(tif) (((tif)->tif_flags & TIFF_MAPPED) != 0)
+#define isFillOrder(tif, o) (((tif)->tif_flags & (o)) != 0)
+#define isUpSampled(tif) (((tif)->tif_flags & TIFF_UPSAMPLED) != 0)
+#define TIFFReadFile(tif, buf, size) \
+ ((*(tif)->tif_readproc)((tif)->tif_clientdata,buf,size))
+#define TIFFWriteFile(tif, buf, size) \
+ ((*(tif)->tif_writeproc)((tif)->tif_clientdata,buf,size))
+#define TIFFSeekFile(tif, off, whence) \
+ ((*(tif)->tif_seekproc)((tif)->tif_clientdata,(toff_t)(off),whence))
+#define TIFFCloseFile(tif) \
+ ((*(tif)->tif_closeproc)((tif)->tif_clientdata))
+#define TIFFGetFileSize(tif) \
+ ((*(tif)->tif_sizeproc)((tif)->tif_clientdata))
+#define TIFFMapFileContents(tif, paddr, psize) \
+ ((*(tif)->tif_mapproc)((tif)->tif_clientdata,paddr,psize))
+#define TIFFUnmapFileContents(tif, addr, size) \
+ ((*(tif)->tif_unmapproc)((tif)->tif_clientdata,addr,size))
+
+/*
+ * Default Read/Seek/Write definitions.
+ */
+#ifndef ReadOK
+#define ReadOK(tif, buf, size) \
+ (TIFFReadFile(tif, (tdata_t) buf, (tsize_t)(size)) == (tsize_t)(size))
+#endif
+#ifndef SeekOK
+#define SeekOK(tif, off) \
+ (TIFFSeekFile(tif, (toff_t) off, SEEK_SET) == (toff_t) off)
+#endif
+#ifndef WriteOK
+#define WriteOK(tif, buf, size) \
+ (TIFFWriteFile(tif, (tdata_t) buf, (tsize_t) size) == (tsize_t) size)
+#endif
+
+/* NB: the uint32 casts are to silence certain ANSI-C compilers */
+#define TIFFhowmany(x, y) ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y)))
+#define TIFFroundup(x, y) (TIFFhowmany(x,y)*((uint32)(y)))
+
+#define TIFFmax(A,B) ((A)>(B)?(A):(B))
+#define TIFFmin(A,B) ((A)<(B)?(A):(B))
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+extern int _TIFFgetMode(const char*, const char*);
+extern int _TIFFNoRowEncode(TIFF*, tidata_t, tsize_t, tsample_t);
+extern int _TIFFNoStripEncode(TIFF*, tidata_t, tsize_t, tsample_t);
+extern int _TIFFNoTileEncode(TIFF*, tidata_t, tsize_t, tsample_t);
+extern int _TIFFNoRowDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+extern int _TIFFNoStripDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+extern int _TIFFNoTileDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+extern void _TIFFNoPostDecode(TIFF*, tidata_t, tsize_t);
+extern int _TIFFNoPreCode (TIFF*, tsample_t);
+extern int _TIFFNoSeek(TIFF*, uint32);
+extern void _TIFFSwab16BitData(TIFF*, tidata_t, tsize_t);
+extern void _TIFFSwab32BitData(TIFF*, tidata_t, tsize_t);
+extern void _TIFFSwab64BitData(TIFF*, tidata_t, tsize_t);
+extern int TIFFFlushData1(TIFF*);
+extern void TIFFFreeDirectory(TIFF*);
+extern int TIFFDefaultDirectory(TIFF*);
+extern int TIFFSetCompressionScheme(TIFF*, int);
+extern int TIFFSetDefaultCompressionState(TIFF*);
+extern uint32 _TIFFDefaultStripSize(TIFF*, uint32);
+extern void _TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
+
+extern void _TIFFsetByteArray(void**, void*, long);
+extern void _TIFFsetString(char**, char*);
+extern void _TIFFsetShortArray(uint16**, uint16*, long);
+extern void _TIFFsetLongArray(uint32**, uint32*, long);
+extern void _TIFFsetFloatArray(float**, float*, long);
+extern void _TIFFsetDoubleArray(double**, double*, long);
+
+extern void _TIFFprintAscii(FILE*, const char*);
+extern void _TIFFprintAsciiTag(FILE*, const char*, const char*);
+
+GLOBALDATA(TIFFErrorHandler,_TIFFwarningHandler);
+GLOBALDATA(TIFFErrorHandler,_TIFFerrorHandler);
+
+extern int TIFFInitDumpMode(TIFF*, int);
+#ifdef PACKBITS_SUPPORT
+extern int TIFFInitPackBits(TIFF*, int);
+#endif
+#ifdef CCITT_SUPPORT
+extern int TIFFInitCCITTRLE(TIFF*, int), TIFFInitCCITTRLEW(TIFF*, int);
+extern int TIFFInitCCITTFax3(TIFF*, int), TIFFInitCCITTFax4(TIFF*, int);
+#endif
+#ifdef THUNDER_SUPPORT
+extern int TIFFInitThunderScan(TIFF*, int);
+#endif
+#ifdef NEXT_SUPPORT
+extern int TIFFInitNeXT(TIFF*, int);
+#endif
+#ifdef LZW_SUPPORT
+extern int TIFFInitLZW(TIFF*, int);
+#endif
+#ifdef OJPEG_SUPPORT
+extern int TIFFInitOJPEG(TIFF*, int);
+#endif
+#ifdef JPEG_SUPPORT
+extern int TIFFInitJPEG(TIFF*, int);
+#endif
+#ifdef JBIG_SUPPORT
+extern int TIFFInitJBIG(TIFF*, int);
+#endif
+#ifdef ZIP_SUPPORT
+extern int TIFFInitZIP(TIFF*, int);
+#endif
+#ifdef PIXARLOG_SUPPORT
+extern int TIFFInitPixarLog(TIFF*, int);
+#endif
+#ifdef LOGLUV_SUPPORT
+extern int TIFFInitSGILog(TIFF*, int);
+#endif
+#ifdef VMS
+extern const TIFFCodec _TIFFBuiltinCODECS[];
+#else
+extern TIFFCodec _TIFFBuiltinCODECS[];
+#endif
+
+#if defined(__cplusplus)
+}
+#endif
+#endif /* _TIFFIOP_ */
diff --git a/src/tiff/tiffvers.h b/src/tiff/tiffvers.h
new file mode 100644
index 0000000..3d24f9a
--- /dev/null
+++ b/src/tiff/tiffvers.h
@@ -0,0 +1,9 @@
+#define TIFFLIB_VERSION_STR "LIBTIFF, Version 3.6.1\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc."
+/*
+ * This define can be used in code that requires
+ * compilation-related definitions specific to a
+ * version or versions of the library. Runtime
+ * version checking should be done based on the
+ * string returned by TIFFGetVersion.
+ */
+#define TIFFLIB_VERSION 20031226
diff --git a/src/tiff/uvcode.h b/src/tiff/uvcode.h
new file mode 100644
index 0000000..8d96e44
--- /dev/null
+++ b/src/tiff/uvcode.h
@@ -0,0 +1,173 @@
+/* Version 1.0 generated April 7, 1997 by Greg Ward Larson, SGI */
+#define UV_SQSIZ (float)0.003500
+#define UV_NDIVS 16289
+#define UV_VSTART (float)0.016940
+#define UV_NVS 163
+static struct {
+ float ustart;
+ short nus, ncum;
+} uv_row[UV_NVS] = {
+ (float)0.247663, 4, 0,
+ (float)0.243779, 6, 4,
+ (float)0.241684, 7, 10,
+ (float)0.237874, 9, 17,
+ (float)0.235906, 10, 26,
+ (float)0.232153, 12, 36,
+ (float)0.228352, 14, 48,
+ (float)0.226259, 15, 62,
+ (float)0.222371, 17, 77,
+ (float)0.220410, 18, 94,
+ (float)0.214710, 21, 112,
+ (float)0.212714, 22, 133,
+ (float)0.210721, 23, 155,
+ (float)0.204976, 26, 178,
+ (float)0.202986, 27, 204,
+ (float)0.199245, 29, 231,
+ (float)0.195525, 31, 260,
+ (float)0.193560, 32, 291,
+ (float)0.189878, 34, 323,
+ (float)0.186216, 36, 357,
+ (float)0.186216, 36, 393,
+ (float)0.182592, 38, 429,
+ (float)0.179003, 40, 467,
+ (float)0.175466, 42, 507,
+ (float)0.172001, 44, 549,
+ (float)0.172001, 44, 593,
+ (float)0.168612, 46, 637,
+ (float)0.168612, 46, 683,
+ (float)0.163575, 49, 729,
+ (float)0.158642, 52, 778,
+ (float)0.158642, 52, 830,
+ (float)0.158642, 52, 882,
+ (float)0.153815, 55, 934,
+ (float)0.153815, 55, 989,
+ (float)0.149097, 58, 1044,
+ (float)0.149097, 58, 1102,
+ (float)0.142746, 62, 1160,
+ (float)0.142746, 62, 1222,
+ (float)0.142746, 62, 1284,
+ (float)0.138270, 65, 1346,
+ (float)0.138270, 65, 1411,
+ (float)0.138270, 65, 1476,
+ (float)0.132166, 69, 1541,
+ (float)0.132166, 69, 1610,
+ (float)0.126204, 73, 1679,
+ (float)0.126204, 73, 1752,
+ (float)0.126204, 73, 1825,
+ (float)0.120381, 77, 1898,
+ (float)0.120381, 77, 1975,
+ (float)0.120381, 77, 2052,
+ (float)0.120381, 77, 2129,
+ (float)0.112962, 82, 2206,
+ (float)0.112962, 82, 2288,
+ (float)0.112962, 82, 2370,
+ (float)0.107450, 86, 2452,
+ (float)0.107450, 86, 2538,
+ (float)0.107450, 86, 2624,
+ (float)0.107450, 86, 2710,
+ (float)0.100343, 91, 2796,
+ (float)0.100343, 91, 2887,
+ (float)0.100343, 91, 2978,
+ (float)0.095126, 95, 3069,
+ (float)0.095126, 95, 3164,
+ (float)0.095126, 95, 3259,
+ (float)0.095126, 95, 3354,
+ (float)0.088276, 100, 3449,
+ (float)0.088276, 100, 3549,
+ (float)0.088276, 100, 3649,
+ (float)0.088276, 100, 3749,
+ (float)0.081523, 105, 3849,
+ (float)0.081523, 105, 3954,
+ (float)0.081523, 105, 4059,
+ (float)0.081523, 105, 4164,
+ (float)0.074861, 110, 4269,
+ (float)0.074861, 110, 4379,
+ (float)0.074861, 110, 4489,
+ (float)0.074861, 110, 4599,
+ (float)0.068290, 115, 4709,
+ (float)0.068290, 115, 4824,
+ (float)0.068290, 115, 4939,
+ (float)0.068290, 115, 5054,
+ (float)0.063573, 119, 5169,
+ (float)0.063573, 119, 5288,
+ (float)0.063573, 119, 5407,
+ (float)0.063573, 119, 5526,
+ (float)0.057219, 124, 5645,
+ (float)0.057219, 124, 5769,
+ (float)0.057219, 124, 5893,
+ (float)0.057219, 124, 6017,
+ (float)0.050985, 129, 6141,
+ (float)0.050985, 129, 6270,
+ (float)0.050985, 129, 6399,
+ (float)0.050985, 129, 6528,
+ (float)0.050985, 129, 6657,
+ (float)0.044859, 134, 6786,
+ (float)0.044859, 134, 6920,
+ (float)0.044859, 134, 7054,
+ (float)0.044859, 134, 7188,
+ (float)0.040571, 138, 7322,
+ (float)0.040571, 138, 7460,
+ (float)0.040571, 138, 7598,
+ (float)0.040571, 138, 7736,
+ (float)0.036339, 142, 7874,
+ (float)0.036339, 142, 8016,
+ (float)0.036339, 142, 8158,
+ (float)0.036339, 142, 8300,
+ (float)0.032139, 146, 8442,
+ (float)0.032139, 146, 8588,
+ (float)0.032139, 146, 8734,
+ (float)0.032139, 146, 8880,
+ (float)0.027947, 150, 9026,
+ (float)0.027947, 150, 9176,
+ (float)0.027947, 150, 9326,
+ (float)0.023739, 154, 9476,
+ (float)0.023739, 154, 9630,
+ (float)0.023739, 154, 9784,
+ (float)0.023739, 154, 9938,
+ (float)0.019504, 158, 10092,
+ (float)0.019504, 158, 10250,
+ (float)0.019504, 158, 10408,
+ (float)0.016976, 161, 10566,
+ (float)0.016976, 161, 10727,
+ (float)0.016976, 161, 10888,
+ (float)0.016976, 161, 11049,
+ (float)0.012639, 165, 11210,
+ (float)0.012639, 165, 11375,
+ (float)0.012639, 165, 11540,
+ (float)0.009991, 168, 11705,
+ (float)0.009991, 168, 11873,
+ (float)0.009991, 168, 12041,
+ (float)0.009016, 170, 12209,
+ (float)0.009016, 170, 12379,
+ (float)0.009016, 170, 12549,
+ (float)0.006217, 173, 12719,
+ (float)0.006217, 173, 12892,
+ (float)0.005097, 175, 13065,
+ (float)0.005097, 175, 13240,
+ (float)0.005097, 175, 13415,
+ (float)0.003909, 177, 13590,
+ (float)0.003909, 177, 13767,
+ (float)0.002340, 177, 13944,
+ (float)0.002389, 170, 14121,
+ (float)0.001068, 164, 14291,
+ (float)0.001653, 157, 14455,
+ (float)0.000717, 150, 14612,
+ (float)0.001614, 143, 14762,
+ (float)0.000270, 136, 14905,
+ (float)0.000484, 129, 15041,
+ (float)0.001103, 123, 15170,
+ (float)0.001242, 115, 15293,
+ (float)0.001188, 109, 15408,
+ (float)0.001011, 103, 15517,
+ (float)0.000709, 97, 15620,
+ (float)0.000301, 89, 15717,
+ (float)0.002416, 82, 15806,
+ (float)0.003251, 76, 15888,
+ (float)0.003246, 69, 15964,
+ (float)0.004141, 62, 16033,
+ (float)0.005963, 55, 16095,
+ (float)0.008839, 47, 16150,
+ (float)0.010490, 40, 16197,
+ (float)0.016994, 31, 16237,
+ (float)0.023659, 21, 16268,
+};
diff --git a/src/tiff/version.h b/src/tiff/version.h
new file mode 100644
index 0000000..49f72b0
--- /dev/null
+++ b/src/tiff/version.h
@@ -0,0 +1 @@
+#define VERSION "LIBTIFF, Version 3.4beta024\nCopyright (c) 1988-1995 Sam Leffler\nCopyright (c) 1991-1995 Silicon Graphics, Inc."
diff --git a/src/tiff/xtiff.c b/src/tiff/xtiff.c
new file mode 100644
index 0000000..d15031e
--- /dev/null
+++ b/src/tiff/xtiff.c
@@ -0,0 +1,198 @@
+/*
+ * xtiff.c
+ *
+ * Extended TIFF Directory GEO Tag Support.
+ *
+ * You may use this file as a template to add your own
+ * extended tags to the library. Only the parts of the code
+ * marked with "XXX" require modification.
+ *
+ * Author: Niles D. Ritter
+ *
+ * Revisions:
+ * 18 Sep 1995 -- Deprecated Integraph Matrix tag with new one.
+ * Backward compatible support provided. --NDR.
+ */
+
+#include "xtiffio.h"
+#include <stdio.h>
+
+/* Tiff info structure.
+ *
+ * Entry format:
+ * { TAGNUMBER, ReadCount, WriteCount, DataType, FIELDNUM,
+ * OkToChange, PassDirCountOnSet, AsciiName }
+ *
+ * For ReadCount, WriteCount, -1 = unknown.
+ */
+
+static const TIFFFieldInfo xtiffFieldInfo[] = {
+
+ /* XXX Insert Your tags here */
+ { TIFFTAG_GEOPIXELSCALE, -1,-1, TIFF_DOUBLE, FIELD_CUSTOM,
+ TRUE, TRUE, "GeoPixelScale" },
+ { TIFFTAG_INTERGRAPH_MATRIX,-1,-1, TIFF_DOUBLE, FIELD_CUSTOM,
+ TRUE, TRUE, "Intergraph TransformationMatrix" },
+ { TIFFTAG_GEOTRANSMATRIX, -1,-1, TIFF_DOUBLE, FIELD_CUSTOM,
+ TRUE, TRUE, "GeoTransformationMatrix" },
+ { TIFFTAG_GEOTIEPOINTS, -1,-1, TIFF_DOUBLE, FIELD_CUSTOM,
+ TRUE, TRUE, "GeoTiePoints" },
+ { TIFFTAG_GEOKEYDIRECTORY,-1,-1, TIFF_SHORT, FIELD_CUSTOM,
+ TRUE, TRUE, "GeoKeyDirectory" },
+ { TIFFTAG_GEODOUBLEPARAMS, -1,-1, TIFF_DOUBLE, FIELD_CUSTOM,
+ TRUE, TRUE, "GeoDoubleParams" },
+ { TIFFTAG_GEOASCIIPARAMS, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
+ TRUE, FALSE, "GeoASCIIParams" },
+#ifdef JPL_TAG_SUPPORT
+ { TIFFTAG_JPL_CARTO_IFD, 1, 1, TIFF_LONG, FIELD_CUSTOM,
+ TRUE, TRUE, "JPL Carto IFD offset" }, /** Don't use this! **/
+#endif
+};
+
+#define N(a) (sizeof (a) / sizeof (a[0]))
+static void _XTIFFLocalDefaultDirectory(TIFF *tif)
+{
+ /* Install the extended Tag field info */
+ TIFFMergeFieldInfo(tif, xtiffFieldInfo, N(xtiffFieldInfo));
+}
+
+
+/**********************************************************************
+ * Nothing below this line should need to be changed.
+ **********************************************************************/
+
+static TIFFExtendProc _ParentExtender;
+
+/*
+ * This is the callback procedure, and is
+ * called by the DefaultDirectory method
+ * every time a new TIFF directory is opened.
+ */
+
+static void
+_XTIFFDefaultDirectory(TIFF *tif)
+{
+ /* set up our own defaults */
+ _XTIFFLocalDefaultDirectory(tif);
+
+ /* Since an XTIFF client module may have overridden
+ * the default directory method, we call it now to
+ * allow it to set up the rest of its own methods.
+ */
+
+ if (_ParentExtender)
+ (*_ParentExtender)(tif);
+}
+
+/*
+ * XTIFF Initializer -- sets up the callback
+ * procedure for the TIFF module.
+ */
+
+static
+void _XTIFFInitialize(void)
+{
+ static int first_time=1;
+
+ if (! first_time) return; /* Been there. Done that. */
+ first_time = 0;
+
+ /* Grab the inherited method and install */
+ _ParentExtender = TIFFSetTagExtender(_XTIFFDefaultDirectory);
+}
+
+
+/**
+ * GeoTIFF compatible TIFF file open function.
+ *
+ * @param name The filename of a TIFF file to open.
+ * @param mode The open mode ("r", "w" or "a").
+ *
+ * @return a TIFF * for the file, or NULL if the open failed.
+ *
+This function is used to open GeoTIFF files instead of TIFFOpen() from
+libtiff. Internally it calls TIFFOpen(), but sets up some extra hooks
+so that GeoTIFF tags can be extracted from the file. If XTIFFOpen() isn't
+used, GTIFNew() won't work properly. Files opened
+with XTIFFOpen() should be closed with XTIFFClose().
+
+The name of the file to be opened should be passed as <b>name</b>, and an
+opening mode ("r", "w" or "a") acceptable to TIFFOpen() should be passed as the
+<b>mode</b>.<p>
+
+If XTIFFOpen() fails it will return NULL. Otherwise, normal TIFFOpen()
+error reporting steps will have already taken place.<p>
+ */
+
+TIFF*
+XTIFFOpen(const char* name, const char* mode)
+{
+ TIFF *tif;
+
+ /* Set up the callback */
+ _XTIFFInitialize();
+
+ /* Open the file; the callback will set everything up
+ */
+ tif = TIFFOpen(name, mode);
+ if (!tif) return tif;
+
+ return tif;
+}
+
+TIFF*
+XTIFFFdOpen(int fd, const char* name, const char* mode)
+{
+ TIFF *tif;
+
+ /* Set up the callback */
+ _XTIFFInitialize();
+
+ /* Open the file; the callback will set everything up
+ */
+ tif = TIFFFdOpen(fd, name, mode);
+ if (!tif) return tif;
+
+ return tif;
+}
+
+TIFF*
+XTIFFClientOpen(const char* name, const char* mode, thandle_t thehandle,
+ TIFFReadWriteProc RWProc, TIFFReadWriteProc RWProc2,
+ TIFFSeekProc SProc, TIFFCloseProc CProc,
+ TIFFSizeProc SzProc,
+ TIFFMapFileProc MFProvc, TIFFUnmapFileProc UMFProc )
+{
+ TIFF *tif;
+
+ /* Set up the callback */
+ _XTIFFInitialize();
+
+ /* Open the file; the callback will set everything up
+ */
+ tif = TIFFClientOpen(name, mode, thehandle,
+ RWProc, RWProc2,
+ SProc, CProc,
+ SzProc,
+ MFProvc, UMFProc);
+
+ if (!tif) return tif;
+
+ return tif;
+}
+
+/**
+ * Close a file opened with XTIFFOpen().
+ *
+ * @param tif The file handle returned by XTIFFOpen().
+ *
+ * If a GTIF structure was created with GTIFNew()
+ * for this file, it should be freed with GTIFFree()
+ * <i>before</i> calling XTIFFClose().
+*/
+
+void
+XTIFFClose(TIFF *tif)
+{
+ TIFFClose(tif);
+}
diff --git a/src/tiff/xtiffio.h b/src/tiff/xtiffio.h
new file mode 100644
index 0000000..c4f10e8
--- /dev/null
+++ b/src/tiff/xtiffio.h
@@ -0,0 +1,72 @@
+/*
+ * xtiffio.h -- Public interface to Extended GEO TIFF tags
+ *
+ * written by: Niles D. Ritter
+ */
+
+#ifndef __xtiffio_h
+#define __xtiffio_h
+
+#include "cpl_serv.h"
+#include "tiffio.h"
+
+/**
+ * \file xtiffio.h
+ *
+ * Definitions relating GeoTIFF functions from geotiff.h to the TIFF
+ * library (usually libtiff).
+ */
+
+/*
+ * Define public Tag names and values here
+ */
+
+/* tags 33550 is a private tag registered to SoftDesk, Inc */
+#define TIFFTAG_GEOPIXELSCALE 33550
+/* tags 33920-33921 are private tags registered to Intergraph, Inc */
+#define TIFFTAG_INTERGRAPH_MATRIX 33920 /* $use TIFFTAG_GEOTRANSMATRIX ! */
+#define TIFFTAG_GEOTIEPOINTS 33922
+/* tags 34263-34264 are private tags registered to NASA-JPL Carto Group */
+#ifdef JPL_TAG_SUPPORT
+#define TIFFTAG_JPL_CARTO_IFD 34263 /* $use GeoProjectionInfo ! */
+#endif
+#define TIFFTAG_GEOTRANSMATRIX 34264 /* New Matrix Tag replaces 33920 */
+/* tags 34735-3438 are private tags registered to SPOT Image, Inc */
+#define TIFFTAG_GEOKEYDIRECTORY 34735
+#define TIFFTAG_GEODOUBLEPARAMS 34736
+#define TIFFTAG_GEOASCIIPARAMS 34737
+
+/*
+ * Define Printing method flags. These
+ * flags may be passed in to TIFFPrintDirectory() to
+ * indicate that those particular field values should
+ * be printed out in full, rather than just an indicator
+ * of whether they are present or not.
+ */
+#define TIFFPRINT_GEOKEYDIRECTORY 0x80000000
+#define TIFFPRINT_GEOKEYPARAMS 0x40000000
+
+/**********************************************************************
+ * Nothing below this line should need to be changed by the user.
+ **********************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+extern TIFF CPL_DLL * XTIFFOpen(const char* name, const char* mode);
+extern TIFF CPL_DLL * XTIFFFdOpen(int fd, const char* name, const char* mode);
+extern void CPL_DLL XTIFFClose(TIFF *tif);
+
+extern TIFF CPL_DLL * XTIFFClientOpen(const char* name, const char* mode,
+ thandle_t thehandle,
+ TIFFReadWriteProc, TIFFReadWriteProc,
+ TIFFSeekProc, TIFFCloseProc,
+ TIFFSizeProc,
+ TIFFMapFileProc, TIFFUnmapFileProc);
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __xtiffio_h */
+
diff --git a/src/tiff/xtiffiop.h b/src/tiff/xtiffiop.h
new file mode 100644
index 0000000..e3b3134
--- /dev/null
+++ b/src/tiff/xtiffiop.h
@@ -0,0 +1,90 @@
+/*
+ * Private Extended TIFF library interface.
+ *
+ * uses private LIBTIFF interface.
+ *
+ * written by: Niles D. Ritter
+ *
+ * Revisions:
+ * 18 Sep 1995 -- Deprecated Integraph Matrix tag with new one.
+ * Backward compatible support provided. --NDR.
+ *
+ */
+
+#ifndef __xtiffiop_h
+#define __xtiffiop_h
+
+#include "tiffiop.h"
+#include "xtiffio.h"
+
+/**********************************************************************
+ * User Configuration
+ **********************************************************************/
+
+/* Define number of extended tags here */
+#define NUM_XFIELD 8
+#define XFIELD_BASE (FIELD_LAST-NUM_XFIELD)
+
+/* Define Fields here */
+#define FIELD_GEOPIXELSCALE (XFIELD_BASE+0)
+#define FIELD_INTERGRAPH_MATRIX (XFIELD_BASE+1)
+#define FIELD_GEOTRANSMATRIX (XFIELD_BASE+2)
+#define FIELD_GEOTIEPOINTS (XFIELD_BASE+3)
+#define FIELD_GEOASCIIPARAMS (XFIELD_BASE+4)
+#define FIELD_GEOKEYDIRECTORY (XFIELD_BASE+5)
+#define FIELD_GEODOUBLEPARAMS (XFIELD_BASE+6)
+#ifdef JPL_TAG_SUPPORT
+#define FIELD_JPL_CARTO_IFD (XFIELD_BASE+7) /* unsupported */
+#endif
+
+/* Used for GEO tags having variable counts */
+typedef enum {
+ GEO_NUM_DIR=0,
+ GEO_NUM_DOUBLE,
+ GEO_NUM_TIEPOINT,
+ GEO_NUM_PIXELSCALE,
+ GEO_NUM_MATRIX,
+ GEO_NUM_IG_MATRIX,
+ GEO_NUM_TAGS
+} geo_count_t;
+
+/* Define Private directory structure here */
+struct XTIFFDirectory {
+ uint16 xd_geodimensions[GEO_NUM_TAGS]; /* dir-count for the geo tags */
+ uint16* xd_geokeydirectory;
+ double* xd_geodoubleparams;
+ char* xd_geoasciiparams;
+ double* xd_geotiepoints;
+ double* xd_geopixelscale;
+ double* xd_geomatrix;
+ double* xd_intergraph_matrix;
+#ifdef JPL_TAG_SUPPORT
+ uint32 xd_jpl_ifd_offset; /* dont use */
+#endif
+};
+typedef struct XTIFFDirectory XTIFFDirectory;
+
+/**********************************************************************
+ * Nothing below this line should need to be changed by the user.
+ **********************************************************************/
+
+struct xtiff {
+ TIFF *xtif_tif; /* parent TIFF pointer */
+ uint32 xtif_flags;
+#define XTIFFP_PRINT 0x00000001
+ XTIFFDirectory xtif_dir; /* internal rep of current directory */
+ TIFFVSetMethod xtif_vsetfield; /* inherited tag set routine */
+ TIFFVGetMethod xtif_vgetfield; /* inherited tag get routine */
+ TIFFPrintMethod xtif_printdir; /* inherited dir print method */
+};
+typedef struct xtiff xtiff;
+
+
+#define PARENT(xt,pmember) ((xt)->xtif_ ## pmember)
+#define TIFFMEMBER(tf,pmember) ((tf)->tif_ ## pmember)
+#define XTIFFDIR(tif) ((xtiff *)TIFFMEMBER(tif,clientdir))
+
+/* Extended TIFF flags */
+#define XTIFF_INITIALIZED 0x80000000
+
+#endif /* __xtiffiop_h */
diff --git a/src/zlib/ChangeLog b/src/zlib/ChangeLog
new file mode 100644
index 0000000..8012afc
--- /dev/null
+++ b/src/zlib/ChangeLog
@@ -0,0 +1,471 @@
+
+ ChangeLog file for zlib
+
+Changes in 1.1.3 (9 July 1998)
+- fix "an inflate input buffer bug that shows up on rare but persistent
+ occasions" (Mark)
+- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)
+- fix gzseek(..., SEEK_SET) in write mode
+- fix crc check after a gzeek (Frank Faubert)
+- fix miniunzip when the last entry in a zip file is itself a zip file
+ (J Lillge)
+- add contrib/asm586 and contrib/asm686 (Brian Raiter)
+ See http://www.muppetlabs.com/~breadbox/software/assembly.html
+- add support for Delphi 3 in contrib/delphi (Bob Dellaca)
+- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)
+- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)
+- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)
+- added a FAQ file
+
+- Support gzdopen on Mac with Metrowerks (Jason Linhart)
+- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart)
+- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young)
+- avoid some warnings with Borland C (Tom Tanner)
+- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant)
+- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant)
+- allow several arguments to configure (Tim Mooney, Frodo Looijaard)
+- use libdir and includedir in Makefile.in (Tim Mooney)
+- support shared libraries on OSF1 V4 (Tim Mooney)
+- remove so_locations in "make clean" (Tim Mooney)
+- fix maketree.c compilation error (Glenn, Mark)
+- Python interface to zlib now in Python 1.5 (Jeremy Hylton)
+- new Makefile.riscos (Rich Walker)
+- initialize static descriptors in trees.c for embedded targets (Nick Smith)
+- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith)
+- add the OS/2 files in Makefile.in too (Andrew Zabolotny)
+- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane)
+- fix maketree.c to allow clean compilation of inffixed.h (Mark)
+- fix parameter check in deflateCopy (Gunther Nikl)
+- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler)
+- Many portability patches by Christian Spieler:
+ . zutil.c, zutil.h: added "const" for zmem*
+ . Make_vms.com: fixed some typos
+ . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists
+ . msdos/Makefile.msc: remove "default rtl link library" info from obj files
+ . msdos/Makefile.*: use model-dependent name for the built zlib library
+ . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc:
+ new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT)
+- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane)
+- replace __far with _far for better portability (Christian Spieler, Tom Lane)
+- fix test for errno.h in configure (Tim Newsham)
+
+Changes in 1.1.2 (19 March 98)
+- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant)
+ See http://www.winimage.com/zLibDll/unzip.html
+- preinitialize the inflate tables for fixed codes, to make the code
+ completely thread safe (Mark)
+- some simplifications and slight speed-up to the inflate code (Mark)
+- fix gzeof on non-compressed files (Allan Schrum)
+- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs)
+- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn)
+- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny)
+- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori)
+- do not wrap extern "C" around system includes (Tom Lane)
+- mention zlib binding for TCL in README (Andreas Kupries)
+- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert)
+- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson)
+- allow "configure --prefix $HOME" (Tim Mooney)
+- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson)
+- move Makefile.sas to amiga/Makefile.sas
+
+Changes in 1.1.1 (27 Feb 98)
+- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson)
+- remove block truncation heuristic which had very marginal effect for zlib
+ (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the
+ compression ratio on some files. This also allows inlining _tr_tally for
+ matches in deflate_slow.
+- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier)
+
+Changes in 1.1.0 (24 Feb 98)
+- do not return STREAM_END prematurely in inflate (John Bowler)
+- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler)
+- compile with -DFASTEST to get compression code optimized for speed only
+- in minigzip, try mmap'ing the input file first (Miguel Albrecht)
+- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain
+ on Sun but significant on HP)
+
+- add a pointer to experimental unzip library in README (Gilles Vollant)
+- initialize variable gcc in configure (Chris Herborth)
+
+Changes in 1.0.9 (17 Feb 1998)
+- added gzputs and gzgets functions
+- do not clear eof flag in gzseek (Mark Diekhans)
+- fix gzseek for files in transparent mode (Mark Diekhans)
+- do not assume that vsprintf returns the number of bytes written (Jens Krinke)
+- replace EXPORT with ZEXPORT to avoid conflict with other programs
+- added compress2 in zconf.h, zlib.def, zlib.dnt
+- new asm code from Gilles Vollant in contrib/asm386
+- simplify the inflate code (Mark):
+ . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new()
+ . ZALLOC the length list in inflate_trees_fixed() instead of using stack
+ . ZALLOC the value area for huft_build() instead of using stack
+ . Simplify Z_FINISH check in inflate()
+
+- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8
+- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi)
+- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with
+ the declaration of FAR (Gilles VOllant)
+- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann)
+- read_buf buf parameter of type Bytef* instead of charf*
+- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout)
+- do not redeclare unlink in minigzip.c for WIN32 (John Bowler)
+- fix check for presence of directories in "make install" (Ian Willis)
+
+Changes in 1.0.8 (27 Jan 1998)
+- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant)
+- fix gzgetc and gzputc for big endian systems (Markus Oberhumer)
+- added compress2() to allow setting the compression level
+- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong)
+- use constant arrays for the static trees in trees.c instead of computing
+ them at run time (thanks to Ken Raeburn for this suggestion). To create
+ trees.h, compile with GEN_TREES_H and run "make test".
+- check return code of example in "make test" and display result
+- pass minigzip command line options to file_compress
+- simplifying code of inflateSync to avoid gcc 2.8 bug
+
+- support CC="gcc -Wall" in configure -s (QingLong)
+- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn)
+- fix test for shared library support to avoid compiler warnings
+- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant)
+- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit)
+- do not use fdopen for Metrowerks on Mac (Brad Pettit))
+- add checks for gzputc and gzputc in example.c
+- avoid warnings in gzio.c and deflate.c (Andreas Kleinert)
+- use const for the CRC table (Ken Raeburn)
+- fixed "make uninstall" for shared libraries
+- use Tracev instead of Trace in infblock.c
+- in example.c use correct compressed length for test_sync
+- suppress +vnocompatwarnings in configure for HPUX (not always supported)
+
+Changes in 1.0.7 (20 Jan 1998)
+- fix gzseek which was broken in write mode
+- return error for gzseek to negative absolute position
+- fix configure for Linux (Chun-Chung Chen)
+- increase stack space for MSC (Tim Wegner)
+- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant)
+- define EXPORTVA for gzprintf (Gilles Vollant)
+- added man page zlib.3 (Rick Rodgers)
+- for contrib/untgz, fix makedir() and improve Makefile
+
+- check gzseek in write mode in example.c
+- allocate extra buffer for seeks only if gzseek is actually called
+- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant)
+- add inflateSyncPoint in zconf.h
+- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def
+
+Changes in 1.0.6 (19 Jan 1998)
+- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and
+ gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)
+- Fix a deflate bug occuring only with compression level 0 (thanks to
+ Andy Buckler for finding this one).
+- In minigzip, pass transparently also the first byte for .Z files.
+- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()
+- check Z_FINISH in inflate (thanks to Marc Schluper)
+- Implement deflateCopy (thanks to Adam Costello)
+- make static libraries by default in configure, add --shared option.
+- move MSDOS or Windows specific files to directory msdos
+- suppress the notion of partial flush to simplify the interface
+ (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4)
+- suppress history buffer provided by application to simplify the interface
+ (this feature was not implemented anyway in 1.0.4)
+- next_in and avail_in must be initialized before calling inflateInit or
+ inflateInit2
+- add EXPORT in all exported functions (for Windows DLL)
+- added Makefile.nt (thanks to Stephen Williams)
+- added the unsupported "contrib" directory:
+ contrib/asm386/ by Gilles Vollant <info at winimage.com>
+ 386 asm code replacing longest_match().
+ contrib/iostream/ by Kevin Ruland <kevin at rodin.wustl.edu>
+ A C++ I/O streams interface to the zlib gz* functions
+ contrib/iostream2/ by Tyge L�vset <Tyge.Lovset at cmr.no>
+ Another C++ I/O streams interface
+ contrib/untgz/ by "Pedro A. Aranda Guti\irrez" <paag at tid.es>
+ A very simple tar.gz file extractor using zlib
+ contrib/visual-basic.txt by Carlos Rios <c_rios at sonda.cl>
+ How to use compress(), uncompress() and the gz* functions from VB.
+- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression
+ level) in minigzip (thanks to Tom Lane)
+
+- use const for rommable constants in deflate
+- added test for gzseek and gztell in example.c
+- add undocumented function inflateSyncPoint() (hack for Paul Mackerras)
+- add undocumented function zError to convert error code to string
+ (for Tim Smithers)
+- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code.
+- Use default memcpy for Symantec MSDOS compiler.
+- Add EXPORT keyword for check_func (needed for Windows DLL)
+- add current directory to LD_LIBRARY_PATH for "make test"
+- create also a link for libz.so.1
+- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura)
+- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX)
+- added -soname for Linux in configure (Chun-Chung Chen,
+- assign numbers to the exported functions in zlib.def (for Windows DLL)
+- add advice in zlib.h for best usage of deflateSetDictionary
+- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn)
+- allow compilation with ANSI keywords only enabled for TurboC in large model
+- avoid "versionString"[0] (Borland bug)
+- add NEED_DUMMY_RETURN for Borland
+- use variable z_verbose for tracing in debug mode (L. Peter Deutsch).
+- allow compilation with CC
+- defined STDC for OS/2 (David Charlap)
+- limit external names to 8 chars for MVS (Thomas Lund)
+- in minigzip.c, use static buffers only for 16-bit systems
+- fix suffix check for "minigzip -d foo.gz"
+- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee)
+- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)
+- added makelcc.bat for lcc-win32 (Tom St Denis)
+- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)
+- Avoid expanded $Id: ChangeLog,v 1.1 2002/07/30 20:02:47 juan Exp $. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.
+- check for unistd.h in configure (for off_t)
+- remove useless check parameter in inflate_blocks_free
+- avoid useless assignment of s->check to itself in inflate_blocks_new
+- do not flush twice in gzclose (thanks to Ken Raeburn)
+- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h
+- use NO_ERRNO_H instead of enumeration of operating systems with errno.h
+- work around buggy fclose on pipes for HP/UX
+- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson)
+- fix configure if CC is already equal to gcc
+
+Changes in 1.0.5 (3 Jan 98)
+- Fix inflate to terminate gracefully when fed corrupted or invalid data
+- Use const for rommable constants in inflate
+- Eliminate memory leaks on error conditions in inflate
+- Removed some vestigial code in inflate
+- Update web address in README
+
+Changes in 1.0.4 (24 Jul 96)
+- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
+ bit, so the decompressor could decompress all the correct data but went
+ on to attempt decompressing extra garbage data. This affected minigzip too.
+- zlibVersion and gzerror return const char* (needed for DLL)
+- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
+- use z_error only for DEBUG (avoid problem with DLLs)
+
+Changes in 1.0.3 (2 Jul 96)
+- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS
+ small and medium models; this makes the library incompatible with previous
+ versions for these models. (No effect in large model or on other systems.)
+- return OK instead of BUF_ERROR if previous deflate call returned with
+ avail_out as zero but there is nothing to do
+- added memcmp for non STDC compilers
+- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly)
+- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO)
+- better check for 16-bit mode MSC (avoids problem with Symantec)
+
+Changes in 1.0.2 (23 May 96)
+- added Windows DLL support
+- added a function zlibVersion (for the DLL support)
+- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model)
+- Bytef is define's instead of typedef'd only for Borland C
+- avoid reading uninitialized memory in example.c
+- mention in README that the zlib format is now RFC1950
+- updated Makefile.dj2
+- added algorithm.doc
+
+Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]
+- fix array overlay in deflate.c which sometimes caused bad compressed data
+- fix inflate bug with empty stored block
+- fix MSDOS medium model which was broken in 0.99
+- fix deflateParams() which could generated bad compressed data.
+- Bytef is define'd instead of typedef'ed (work around Borland bug)
+- added an INDEX file
+- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
+ Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas)
+- speed up adler32 for modern machines without auto-increment
+- added -ansi for IRIX in configure
+- static_init_done in trees.c is an int
+- define unlink as delete for VMS
+- fix configure for QNX
+- add configure branch for SCO and HPUX
+- avoid many warnings (unused variables, dead assignments, etc...)
+- no fdopen for BeOS
+- fix the Watcom fix for 32 bit mode (define FAR as empty)
+- removed redefinition of Byte for MKWERKS
+- work around an MWKERKS bug (incorrect merge of all .h files)
+
+Changes in 0.99 (27 Jan 96)
+- allow preset dictionary shared between compressor and decompressor
+- allow compression level 0 (no compression)
+- add deflateParams in zlib.h: allow dynamic change of compression level
+ and compression strategy.
+- test large buffers and deflateParams in example.c
+- add optional "configure" to build zlib as a shared library
+- suppress Makefile.qnx, use configure instead
+- fixed deflate for 64-bit systems (detected on Cray)
+- fixed inflate_blocks for 64-bit systems (detected on Alpha)
+- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2)
+- always return Z_BUF_ERROR when deflate() has nothing to do
+- deflateInit and inflateInit are now macros to allow version checking
+- prefix all global functions and types with z_ with -DZ_PREFIX
+- make falloc completely reentrant (inftrees.c)
+- fixed very unlikely race condition in ct_static_init
+- free in reverse order of allocation to help memory manager
+- use zlib-1.0/* instead of zlib/* inside the tar.gz
+- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith
+ -Wconversion -Wstrict-prototypes -Wmissing-prototypes"
+- allow gzread on concatenated .gz files
+- deflateEnd now returns Z_DATA_ERROR if it was premature
+- deflate is finally (?) fully deterministic (no matches beyond end of input)
+- Document Z_SYNC_FLUSH
+- add uninstall in Makefile
+- Check for __cpluplus in zlib.h
+- Better test in ct_align for partial flush
+- avoid harmless warnings for Borland C++
+- initialize hash_head in deflate.c
+- avoid warning on fdopen (gzio.c) for HP cc -Aa
+- include stdlib.h for STDC compilers
+- include errno.h for Cray
+- ignore error if ranlib doesn't exist
+- call ranlib twice for NeXTSTEP
+- use exec_prefix instead of prefix for libz.a
+- renamed ct_* as _tr_* to avoid conflict with applications
+- clear z->msg in inflateInit2 before any error return
+- initialize opaque in example.c, gzio.c, deflate.c and inflate.c
+- fixed typo in zconf.h (_GNUC__ => __GNUC__)
+- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode)
+- fix typo in Make_vms.com (f$trnlnm -> f$getsyi)
+- in fcalloc, normalize pointer if size > 65520 bytes
+- don't use special fcalloc for 32 bit Borland C++
+- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...
+- use Z_BINARY instead of BINARY
+- document that gzclose after gzdopen will close the file
+- allow "a" as mode in gzopen.
+- fix error checking in gzread
+- allow skipping .gz extra-field on pipes
+- added reference to Perl interface in README
+- put the crc table in FAR data (I dislike more and more the medium model :)
+- added get_crc_table
+- added a dimension to all arrays (Borland C can't count).
+- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast
+- guard against multiple inclusion of *.h (for precompiled header on Mac)
+- Watcom C pretends to be Microsoft C small model even in 32 bit mode.
+- don't use unsized arrays to avoid silly warnings by Visual C++:
+ warning C4746: 'inflate_mask' : unsized array treated as '__far'
+ (what's wrong with far data in far model?).
+- define enum out of inflate_blocks_state to allow compilation with C++
+
+Changes in 0.95 (16 Aug 95)
+- fix MSDOS small and medium model (now easier to adapt to any compiler)
+- inlined send_bits
+- fix the final (:-) bug for deflate with flush (output was correct but
+ not completely flushed in rare occasions).
+- default window size is same for compression and decompression
+ (it's now sufficient to set MAX_WBITS in zconf.h).
+- voidp -> voidpf and voidnp -> voidp (for consistency with other
+ typedefs and because voidnp was not near in large model).
+
+Changes in 0.94 (13 Aug 95)
+- support MSDOS medium model
+- fix deflate with flush (could sometimes generate bad output)
+- fix deflateReset (zlib header was incorrectly suppressed)
+- added support for VMS
+- allow a compression level in gzopen()
+- gzflush now calls fflush
+- For deflate with flush, flush even if no more input is provided.
+- rename libgz.a as libz.a
+- avoid complex expression in infcodes.c triggering Turbo C bug
+- work around a problem with gcc on Alpha (in INSERT_STRING)
+- don't use inline functions (problem with some gcc versions)
+- allow renaming of Byte, uInt, etc... with #define.
+- avoid warning about (unused) pointer before start of array in deflate.c
+- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c
+- avoid reserved word 'new' in trees.c
+
+Changes in 0.93 (25 June 95)
+- temporarily disable inline functions
+- make deflate deterministic
+- give enough lookahead for PARTIAL_FLUSH
+- Set binary mode for stdin/stdout in minigzip.c for OS/2
+- don't even use signed char in inflate (not portable enough)
+- fix inflate memory leak for segmented architectures
+
+Changes in 0.92 (3 May 95)
+- don't assume that char is signed (problem on SGI)
+- Clear bit buffer when starting a stored block
+- no memcpy on Pyramid
+- suppressed inftest.c
+- optimized fill_window, put longest_match inline for gcc
+- optimized inflate on stored blocks.
+- untabify all sources to simplify patches
+
+Changes in 0.91 (2 May 95)
+- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h
+- Document the memory requirements in zconf.h
+- added "make install"
+- fix sync search logic in inflateSync
+- deflate(Z_FULL_FLUSH) now works even if output buffer too short
+- after inflateSync, don't scare people with just "lo world"
+- added support for DJGPP
+
+Changes in 0.9 (1 May 95)
+- don't assume that zalloc clears the allocated memory (the TurboC bug
+ was Mark's bug after all :)
+- let again gzread copy uncompressed data unchanged (was working in 0.71)
+- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
+- added a test of inflateSync in example.c
+- moved MAX_WBITS to zconf.h because users might want to change that.
+- document explicitly that zalloc(64K) on MSDOS must return a normalized
+ pointer (zero offset)
+- added Makefiles for Microsoft C, Turbo C, Borland C++
+- faster crc32()
+
+Changes in 0.8 (29 April 95)
+- added fast inflate (inffast.c)
+- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
+ is incompatible with previous versions of zlib which returned Z_OK.
+- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
+ (actually that was not a compiler bug, see 0.81 above)
+- gzread no longer reads one extra byte in certain cases
+- In gzio destroy(), don't reference a freed structure
+- avoid many warnings for MSDOS
+- avoid the ERROR symbol which is used by MS Windows
+
+Changes in 0.71 (14 April 95)
+- Fixed more MSDOS compilation problems :( There is still a bug with
+ TurboC large model.
+
+Changes in 0.7 (14 April 95)
+- Added full inflate support.
+- Simplified the crc32() interface. The pre- and post-conditioning
+ (one's complement) is now done inside crc32(). WARNING: this is
+ incompatible with previous versions; see zlib.h for the new usage.
+
+Changes in 0.61 (12 April 95)
+- workaround for a bug in TurboC. example and minigzip now work on MSDOS.
+
+Changes in 0.6 (11 April 95)
+- added minigzip.c
+- added gzdopen to reopen a file descriptor as gzFile
+- added transparent reading of non-gziped files in gzread.
+- fixed bug in gzread (don't read crc as data)
+- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose).
+- don't allocate big arrays in the stack (for MSDOS)
+- fix some MSDOS compilation problems
+
+Changes in 0.5:
+- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but
+ not yet Z_FULL_FLUSH.
+- support decompression but only in a single step (forced Z_FINISH)
+- added opaque object for zalloc and zfree.
+- added deflateReset and inflateReset
+- added a variable zlib_version for consistency checking.
+- renamed the 'filter' parameter of deflateInit2 as 'strategy'.
+ Added Z_FILTERED and Z_HUFFMAN_ONLY constants.
+
+Changes in 0.4:
+- avoid "zip" everywhere, use zlib instead of ziplib.
+- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush
+ if compression method == 8.
+- added adler32 and crc32
+- renamed deflateOptions as deflateInit2, call one or the other but not both
+- added the method parameter for deflateInit2.
+- added inflateInit2
+- simplied considerably deflateInit and inflateInit by not supporting
+ user-provided history buffer. This is supported only in deflateInit2
+ and inflateInit2.
+
+Changes in 0.3:
+- prefix all macro names with Z_
+- use Z_FINISH instead of deflateEnd to finish compression.
+- added Z_HUFFMAN_ONLY
+- added gzerror()
diff --git a/src/zlib/FAQ b/src/zlib/FAQ
new file mode 100644
index 0000000..0feb6d3
--- /dev/null
+++ b/src/zlib/FAQ
@@ -0,0 +1,72 @@
+
+ Frequently Asked Questions about zlib
+
+
+If your question is not there, please check the zlib home page
+http://www.cdrom.com/pub/infozip/zlib/ which may have more recent information.
+
+
+1) I need a Windows DLL
+2) I need a Visual Basic interface to zlib
+3) compress() returns Z_BUF_ERROR
+4) deflate or inflate returns Z_BUF_ERROR
+5) Where is the zlib documentation (man pages, etc...)?
+6) Why don't you use GNU autoconf, libtool, etc...?
+7) There is a bug in zlib.
+8) I get "undefined reference to gzputc"
+
+
+
+1) I need a Windows DLL
+
+ The zlib sources can be compiled without change to produce a DLL.
+ If you want a precompiled DLL, see http://www.winimage.com/zLibDll
+
+
+2) I need a Visual Basic interface to zlib
+
+ See http://www.tcfb.com/dowseware/cmp-z-it.zip
+ http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm
+ and contrib/visual-basic.txt
+
+3) compress() returns Z_BUF_ERROR
+
+ Make sure that before the call of compress, the length of the
+ compressed buffer is equal to the total size of the compressed buffer
+ and not zero. For Visual Basic, check that this parameter is passed
+ by reference ("as any"), not by value ("as long").
+
+
+4) deflate or inflate returns Z_BUF_ERROR
+
+ Make sure that before the call avail_in and avail_out are not zero.
+
+
+5) Where is the zlib documentation (man pages, etc...)?
+
+ It's in zlib.h for the moment. Volunteers to transform this
+ to man pages, please contact jloup at gzip.org. Examples of zlib usage
+ are in the files example.c and minigzip.c.
+
+
+6) Why don't you use GNU autoconf, libtool, etc...?
+
+ Because we would like to keep zlib as a very small and simple package.
+ zlib is rather portable and doesn't need much configuration.
+
+
+7) There is a bug in zlib.
+
+ Most of the time, such problems are due to an incorrect usage
+ of zlib. Please try to reproduce the problem with a small
+ program and send us the corresponding source at zlib at quest.jpl.nasa.gov
+ Do not send multi-megabyte data files without prior agreement.
+
+
+8) I get "undefined reference to gzputc"
+
+ If "make test" produces something like
+ example.o(.text+0x174):
+ check that you don't have old files libz.* in /usr/lib, /usr/local/lib
+ or /usr/X11R6/lib. Remove old versions then do "make install".
+
diff --git a/src/zlib/Makefile b/src/zlib/Makefile
new file mode 100644
index 0000000..8212584
--- /dev/null
+++ b/src/zlib/Makefile
@@ -0,0 +1,99 @@
+# Makefile for zlib (MSVC + NMAKE; others?)
+#
+# GRR 1998.10.21: This makefile now builds both shared (DLL) and static
+# libraries. Objects ending in ".obj" are the static ones; those ending
+# in ".objdll" are "position-independent" DLL objects. Since cl.exe
+# doesn't seem to honor the -out: option, the .objdll flavor are renamed
+# using what is probably an NMAKE-specific feature: %|xF, where "x" is
+# some combo of d (drive), p (path, including drive), f (file basename)
+# and e (extension). The useful output is zlibstat.lib (the static version),
+# zlibdll.lib (the DLL import or stub library with which one links), and
+# zlib.dll (the DLL itself, required at runtime). To build only one or the
+# other, remove either zlib.dll or zlibstat.lib from the "all:" target.
+#
+# SUMMARY: Link programs with either zlibstat.lib or zlibdll.lib. If the
+# latter, be sure to distribute zlib.dll with the executable(s).
+
+!include <ntwin32.mak>
+
+CC=cl
+LD=link
+CFLAGS=-nologo -O
+LDFLAGS=
+O=.obj
+OD=.objdll
+
+# variables
+OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O)
+OBJ2 = deflate$(O) trees$(O) zutil$(O) inflate$(O) infblock$(O)
+OBJ3 = inftrees$(O) infcodes$(O) infutil$(O) inffast$(O)
+OBJS = $(OBJ1) $(OBJ2) $(OBJ3)
+
+OBJD1 = adler32$(OD) compress$(OD) crc32$(OD) gzio$(OD) uncompr$(OD)
+OBJD2 = deflate$(OD) trees$(OD) zutil$(OD) inflate$(OD) infblock$(OD)
+OBJD3 = inftrees$(OD) infcodes$(OD) infutil$(OD) inffast$(OD)
+OBJSDLL = $(OBJD1) $(OBJD2) $(OBJD3)
+
+.SUFFIXES: .objdll
+
+# [see %devstudio%\vc\include\win32.mak for macro definitions]
+.c.obj:
+ $(CC) -c $(CFLAGS) $(cvars) $<
+
+# -out: doesn't work with cl.exe (some other option? RTFM, I suppose...)
+.c.objdll:
+# $(CC) -c $(CFLAGS) $(cvarsdll) -out:$@ $<
+ $(CC) -c $(CFLAGS) $(cvarsdll) $<
+ ren %|fF.obj $@
+
+all: zlib.dll zlibstat.lib example.exe minigzip.exe
+
+adler32$(O) adler32$(OD): adler32.c zutil.h zlib.h zconf.h
+compress$(O) compress$(OD): compress.c zlib.h zconf.h
+crc32$(O) crc32$(OD): crc32.c zutil.h zlib.h zconf.h
+deflate$(O) deflate$(OD): deflate.c deflate.h zutil.h zlib.h zconf.h
+gzio$(O) gzio$(OD): gzio.c zutil.h zlib.h zconf.h
+infblock$(O) infblock$(OD): infblock.c zutil.h zlib.h zconf.h inftrees.h \
+ infutil.h infcodes.h infblock.h
+infcodes$(O) infcodes$(OD): infcodes.c zutil.h zlib.h zconf.h inftrees.h \
+ infutil.h infcodes.h inffast.h
+inflate$(O) inflate$(OD): inflate.c zutil.h zlib.h zconf.h infblock.h
+inftrees$(O) inftrees$(OD): inftrees.c zutil.h zlib.h zconf.h inftrees.h
+infutil$(O) infutil$(OD): infutil.c zutil.h zlib.h zconf.h inftrees.h \
+ infutil.h
+inffast$(O) inffast$(OD): inffast.c zutil.h zlib.h zconf.h inftrees.h \
+ infutil.h inffast.h
+trees$(O) trees$(OD): trees.c deflate.h zutil.h zlib.h zconf.h
+uncompr$(O) uncompr$(OD): uncompr.c zlib.h zconf.h
+zutil$(O) zutil$(OD): zutil.c zutil.h zlib.h zconf.h
+
+example$(O): example.c zlib.h zconf.h
+minigzip$(O): minigzip.c zlib.h zconf.h
+
+zlib.dll: $(OBJSDLL) nt/zlib.dnt
+ link $(dlllflags) -out:$@ -def:nt/zlib.dnt $(OBJSDLL) $(guilibsdll)
+ -ren zlib.lib zlibdll.lib
+
+zlibstat.lib: $(OBJS)
+ lib -nologo -out:$@ $(OBJS)
+
+zlibdll.lib: zlib.dll
+
+example.exe: example.obj zlibdll.lib
+ $(LD) $(LDFLAGS) example.obj zlibdll.lib
+
+minigzip.exe: minigzip.obj zlibdll.lib
+ $(LD) $(LDFLAGS) minigzip.obj zlibdll.lib
+
+test: example.exe minigzip.exe
+ example
+ echo hello world | minigzip | minigzip -d
+
+clean:
+ del *.objdll
+ del *.obj
+ del *.exe
+ del *.dll
+ del *.lib
+ del zlib.exp
+ del foo.gz
diff --git a/src/zlib/README b/src/zlib/README
new file mode 100644
index 0000000..8ff4587
--- /dev/null
+++ b/src/zlib/README
@@ -0,0 +1,148 @@
+zlib 1.1.3 is a general purpose data compression library. All the code
+is thread safe. The data format used by the zlib library
+is described by RFCs (Request for Comments) 1950 to 1952 in the files
+ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate
+format) and rfc1952.txt (gzip format). These documents are also available in
+other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
+
+All functions of the compression library are documented in the file zlib.h
+(volunteer to write man pages welcome, contact jloup at gzip.org). A usage
+example of the library is given in the file example.c which also tests that
+the library is working correctly. Another example is given in the file
+minigzip.c. The compression library itself is composed of all source files
+except example.c and minigzip.c.
+
+To compile all files and run the test program, follow the instructions
+given at the top of Makefile. In short "make test; make install"
+should work for most machines. For Unix: "configure; make test; make install"
+For MSDOS, use one of the special makefiles such as Makefile.msc.
+For VMS, use Make_vms.com or descrip.mms.
+
+Questions about zlib should be sent to <zlib at quest.jpl.nasa.gov>, or to
+Gilles Vollant <info at winimage.com> for the Windows DLL version.
+The zlib home page is http://www.cdrom.com/pub/infozip/zlib/
+The official zlib ftp site is ftp://ftp.cdrom.com/pub/infozip/zlib/
+Before reporting a problem, please check those sites to verify that
+you have the latest version of zlib; otherwise get the latest version and
+check whether the problem still exists or not.
+
+Mark Nelson <markn at tiny.com> wrote an article about zlib for the Jan. 1997
+issue of Dr. Dobb's Journal; a copy of the article is available in
+http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm
+
+The changes made in version 1.1.3 are documented in the file ChangeLog.
+The main changes since 1.1.2 are:
+
+- fix "an inflate input buffer bug that shows up on rare but persistent
+ occasions" (Mark)
+- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)
+- fix gzseek(..., SEEK_SET) in write mode
+- fix crc check after a gzeek (Frank Faubert)
+- fix miniunzip when the last entry in a zip file is itself a zip file
+ (J Lillge)
+- add contrib/asm586 and contrib/asm686 (Brian Raiter)
+ See http://www.muppetlabs.com/~breadbox/software/assembly.html
+- add support for Delphi 3 in contrib/delphi (Bob Dellaca)
+- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)
+- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)
+- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)
+- added a FAQ file
+
+plus many changes for portability.
+
+Unsupported third party contributions are provided in directory "contrib".
+
+A Java implementation of zlib is available in the Java Development Kit 1.1
+http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html
+See the zlib home page http://www.cdrom.com/pub/infozip/zlib/ for details.
+
+A Perl interface to zlib written by Paul Marquess <pmarquess at bfsec.bt.co.uk>
+is in the CPAN (Comprehensive Perl Archive Network) sites, such as:
+ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib*
+
+A Python interface to zlib written by A.M. Kuchling <amk at magnet.com>
+is available in Python 1.5 and later versions, see
+http://www.python.org/doc/lib/module-zlib.html
+
+A zlib binding for TCL written by Andreas Kupries <a.kupries at westend.com>
+is availlable at http://www.westend.com/~kupries/doc/trf/man/man.html
+
+An experimental package to read and write files in .zip format,
+written on top of zlib by Gilles Vollant <info at winimage.com>, is
+available at http://www.winimage.com/zLibDll/unzip.html
+and also in the contrib/minizip directory of zlib.
+
+
+Notes for some targets:
+
+- To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc
+ and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL
+ The zlib DLL support was initially done by Alessandro Iacopetti and is
+ now maintained by Gilles Vollant <info at winimage.com>. Check the zlib DLL
+ home page at http://www.winimage.com/zLibDll
+
+ From Visual Basic, you can call the DLL functions which do not take
+ a structure as argument: compress, uncompress and all gz* functions.
+ See contrib/visual-basic.txt for more information, or get
+ http://www.tcfb.com/dowseware/cmp-z-it.zip
+
+- For 64-bit Irix, deflate.c must be compiled without any optimization.
+ With -O, one libpng test fails. The test works in 32 bit mode (with
+ the -n32 compiler flag). The compiler bug has been reported to SGI.
+
+- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1
+ it works when compiled with cc.
+
+- on Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1
+ is necessary to get gzprintf working correctly. This is done by configure.
+
+- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works
+ with other compilers. Use "make test" to check your compiler.
+
+- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers.
+
+- For Turbo C the small model is supported only with reduced performance to
+ avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
+
+- For PalmOs, see http://www.cs.uit.no/~perm/PASTA/pilot/software.html
+ Per Harald Myrvang <perm at stud.cs.uit.no>
+
+
+Acknowledgments:
+
+ The deflate format used by zlib was defined by Phil Katz. The deflate
+ and zlib specifications were written by L. Peter Deutsch. Thanks to all the
+ people who reported problems and suggested various improvements in zlib;
+ they are too numerous to cite here.
+
+Copyright notice:
+
+ (C) 1995-1998 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup at gzip.org madler at alumni.caltech.edu
+
+If you use the zlib library in a product, we would appreciate *not*
+receiving lengthy legal documents to sign. The sources are provided
+for free but without warranty of any kind. The library has been
+entirely written by Jean-loup Gailly and Mark Adler; it does not
+include third-party code.
+
+If you redistribute modified sources, we would appreciate that you include
+in the file ChangeLog history information documenting your changes.
diff --git a/src/zlib/algorithm.txt b/src/zlib/algorithm.txt
new file mode 100644
index 0000000..f488cd1
--- /dev/null
+++ b/src/zlib/algorithm.txt
@@ -0,0 +1,213 @@
+1. Compression algorithm (deflate)
+
+The deflation algorithm used by gzip (also zip and zlib) is a variation of
+LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in
+the input data. The second occurrence of a string is replaced by a
+pointer to the previous string, in the form of a pair (distance,
+length). Distances are limited to 32K bytes, and lengths are limited
+to 258 bytes. When a string does not occur anywhere in the previous
+32K bytes, it is emitted as a sequence of literal bytes. (In this
+description, `string' must be taken as an arbitrary sequence of bytes,
+and is not restricted to printable characters.)
+
+Literals or match lengths are compressed with one Huffman tree, and
+match distances are compressed with another tree. The trees are stored
+in a compact form at the start of each block. The blocks can have any
+size (except that the compressed data for one block must fit in
+available memory). A block is terminated when deflate() determines that
+it would be useful to start another block with fresh trees. (This is
+somewhat similar to the behavior of LZW-based _compress_.)
+
+Duplicated strings are found using a hash table. All input strings of
+length 3 are inserted in the hash table. A hash index is computed for
+the next 3 bytes. If the hash chain for this index is not empty, all
+strings in the chain are compared with the current input string, and
+the longest match is selected.
+
+The hash chains are searched starting with the most recent strings, to
+favor small distances and thus take advantage of the Huffman encoding.
+The hash chains are singly linked. There are no deletions from the
+hash chains, the algorithm simply discards matches that are too old.
+
+To avoid a worst-case situation, very long hash chains are arbitrarily
+truncated at a certain length, determined by a runtime option (level
+parameter of deflateInit). So deflate() does not always find the longest
+possible match but generally finds a match which is long enough.
+
+deflate() also defers the selection of matches with a lazy evaluation
+mechanism. After a match of length N has been found, deflate() searches for
+a longer match at the next input byte. If a longer match is found, the
+previous match is truncated to a length of one (thus producing a single
+literal byte) and the process of lazy evaluation begins again. Otherwise,
+the original match is kept, and the next match search is attempted only N
+steps later.
+
+The lazy match evaluation is also subject to a runtime parameter. If
+the current match is long enough, deflate() reduces the search for a longer
+match, thus speeding up the whole process. If compression ratio is more
+important than speed, deflate() attempts a complete second search even if
+the first match is already long enough.
+
+The lazy match evaluation is not performed for the fastest compression
+modes (level parameter 1 to 3). For these fast modes, new strings
+are inserted in the hash table only when no match was found, or
+when the match is not too long. This degrades the compression ratio
+but saves time since there are both fewer insertions and fewer searches.
+
+
+2. Decompression algorithm (inflate)
+
+2.1 Introduction
+
+The real question is, given a Huffman tree, how to decode fast. The most
+important realization is that shorter codes are much more common than
+longer codes, so pay attention to decoding the short codes fast, and let
+the long codes take longer to decode.
+
+inflate() sets up a first level table that covers some number of bits of
+input less than the length of longest code. It gets that many bits from the
+stream, and looks it up in the table. The table will tell if the next
+code is that many bits or less and how many, and if it is, it will tell
+the value, else it will point to the next level table for which inflate()
+grabs more bits and tries to decode a longer code.
+
+How many bits to make the first lookup is a tradeoff between the time it
+takes to decode and the time it takes to build the table. If building the
+table took no time (and if you had infinite memory), then there would only
+be a first level table to cover all the way to the longest code. However,
+building the table ends up taking a lot longer for more bits since short
+codes are replicated many times in such a table. What inflate() does is
+simply to make the number of bits in the first table a variable, and set it
+for the maximum speed.
+
+inflate() sends new trees relatively often, so it is possibly set for a
+smaller first level table than an application that has only one tree for
+all the data. For inflate, which has 286 possible codes for the
+literal/length tree, the size of the first table is nine bits. Also the
+distance trees have 30 possible values, and the size of the first table is
+six bits. Note that for each of those cases, the table ended up one bit
+longer than the ``average'' code length, i.e. the code length of an
+approximately flat code which would be a little more than eight bits for
+286 symbols and a little less than five bits for 30 symbols. It would be
+interesting to see if optimizing the first level table for other
+applications gave values within a bit or two of the flat code size.
+
+
+2.2 More details on the inflate table lookup
+
+Ok, you want to know what this cleverly obfuscated inflate tree actually
+looks like. You are correct that it's not a Huffman tree. It is simply a
+lookup table for the first, let's say, nine bits of a Huffman symbol. The
+symbol could be as short as one bit or as long as 15 bits. If a particular
+symbol is shorter than nine bits, then that symbol's translation is duplicated
+in all those entries that start with that symbol's bits. For example, if the
+symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a
+symbol is nine bits long, it appears in the table once.
+
+If the symbol is longer than nine bits, then that entry in the table points
+to another similar table for the remaining bits. Again, there are duplicated
+entries as needed. The idea is that most of the time the symbol will be short
+and there will only be one table look up. (That's whole idea behind data
+compression in the first place.) For the less frequent long symbols, there
+will be two lookups. If you had a compression method with really long
+symbols, you could have as many levels of lookups as is efficient. For
+inflate, two is enough.
+
+So a table entry either points to another table (in which case nine bits in
+the above example are gobbled), or it contains the translation for the symbol
+and the number of bits to gobble. Then you start again with the next
+ungobbled bit.
+
+You may wonder: why not just have one lookup table for how ever many bits the
+longest symbol is? The reason is that if you do that, you end up spending
+more time filling in duplicate symbol entries than you do actually decoding.
+At least for deflate's output that generates new trees every several 10's of
+kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code
+would take too long if you're only decoding several thousand symbols. At the
+other extreme, you could make a new table for every bit in the code. In fact,
+that's essentially a Huffman tree. But then you spend two much time
+traversing the tree while decoding, even for short symbols.
+
+So the number of bits for the first lookup table is a trade of the time to
+fill out the table vs. the time spent looking at the second level and above of
+the table.
+
+Here is an example, scaled down:
+
+The code being decoded, with 10 symbols, from 1 to 6 bits long:
+
+A: 0
+B: 10
+C: 1100
+D: 11010
+E: 11011
+F: 11100
+G: 11101
+H: 11110
+I: 111110
+J: 111111
+
+Let's make the first table three bits long (eight entries):
+
+000: A,1
+001: A,1
+010: A,1
+011: A,1
+100: B,2
+101: B,2
+110: -> table X (gobble 3 bits)
+111: -> table Y (gobble 3 bits)
+
+Each entry is what the bits decode to and how many bits that is, i.e. how
+many bits to gobble. Or the entry points to another table, with the number of
+bits to gobble implicit in the size of the table.
+
+Table X is two bits long since the longest code starting with 110 is five bits
+long:
+
+00: C,1
+01: C,1
+10: D,2
+11: E,2
+
+Table Y is three bits long since the longest code starting with 111 is six
+bits long:
+
+000: F,2
+001: F,2
+010: G,2
+011: G,2
+100: H,2
+101: H,2
+110: I,3
+111: J,3
+
+So what we have here are three tables with a total of 20 entries that had to
+be constructed. That's compared to 64 entries for a single table. Or
+compared to 16 entries for a Huffman tree (six two entry tables and one four
+entry table). Assuming that the code ideally represents the probability of
+the symbols, it takes on the average 1.25 lookups per symbol. That's compared
+to one lookup for the single table, or 1.66 lookups per symbol for the
+Huffman tree.
+
+There, I think that gives you a picture of what's going on. For inflate, the
+meaning of a particular symbol is often more than just a letter. It can be a
+byte (a "literal"), or it can be either a length or a distance which
+indicates a base value and a number of bits to fetch after the code that is
+added to the base value. Or it might be the special end-of-block code. The
+data structures created in inftrees.c try to encode all that information
+compactly in the tables.
+
+
+Jean-loup Gailly Mark Adler
+jloup at gzip.org madler at alumni.caltech.edu
+
+
+References:
+
+[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data
+Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3,
+pp. 337-343.
+
+``DEFLATE Compressed Data Format Specification'' available in
+ftp://ds.internic.net/rfc/rfc1951.txt
diff --git a/src/zlib/zconf.h b/src/zlib/zconf.h
new file mode 100644
index 0000000..c54ceff
--- /dev/null
+++ b/src/zlib/zconf.h
@@ -0,0 +1,279 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-1998 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id: zconf.h,v 1.1 2002/07/30 20:02:48 juan Exp $ */
+
+#ifndef _ZCONF_H
+#define _ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ */
+#ifdef Z_PREFIX
+# define deflateInit_ z_deflateInit_
+# define deflate z_deflate
+# define deflateEnd z_deflateEnd
+# define inflateInit_ z_inflateInit_
+# define inflate z_inflate
+# define inflateEnd z_inflateEnd
+# define deflateInit2_ z_deflateInit2_
+# define deflateSetDictionary z_deflateSetDictionary
+# define deflateCopy z_deflateCopy
+# define deflateReset z_deflateReset
+# define deflateParams z_deflateParams
+# define inflateInit2_ z_inflateInit2_
+# define inflateSetDictionary z_inflateSetDictionary
+# define inflateSync z_inflateSync
+# define inflateSyncPoint z_inflateSyncPoint
+# define inflateReset z_inflateReset
+# define compress z_compress
+# define compress2 z_compress2
+# define uncompress z_uncompress
+# define adler32 z_adler32
+# define crc32 z_crc32
+# define get_crc_table z_get_crc_table
+
+# define Byte z_Byte
+# define uInt z_uInt
+# define uLong z_uLong
+# define Bytef z_Bytef
+# define charf z_charf
+# define intf z_intf
+# define uIntf z_uIntf
+# define uLongf z_uLongf
+# define voidpf z_voidpf
+# define voidp z_voidp
+#endif
+
+#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
+# define WIN32
+#endif
+#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
+# ifndef __32BIT__
+# define __32BIT__
+# endif
+#endif
+#if defined(__MSDOS__) && !defined(MSDOS)
+# define MSDOS
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#if defined(MSDOS) && !defined(__32BIT__)
+# define MAXSEG_64K
+#endif
+#ifdef MSDOS
+# define UNALIGNED_OK
+#endif
+
+#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC)
+# define STDC
+#endif
+#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
+# ifndef STDC
+# define STDC
+# endif
+#endif
+
+#ifndef STDC
+# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+# define const
+# endif
+#endif
+
+/* Some Mac compilers merge all .h files incorrectly: */
+#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
+# define NO_DUMMY_DECL
+#endif
+
+/* Old Borland C incorrectly complains about missing returns: */
+#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
+# define NEED_DUMMY_RETURN
+#endif
+
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+# ifdef MAXSEG_64K
+# define MAX_MEM_LEVEL 8
+# else
+# define MAX_MEM_LEVEL 9
+# endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+# define MAX_WBITS 15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+ (1 << (windowBits+2)) + (1 << (memLevel+9))
+ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+ The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects.
+*/
+
+ /* Type declarations */
+
+#ifndef OF /* function prototypes */
+# ifdef STDC
+# define OF(args) args
+# else
+# define OF(args) ()
+# endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
+ /* MSC small or medium model */
+# define SMALL_MEDIUM
+# ifdef _MSC_VER
+# define FAR _far
+# else
+# define FAR far
+# endif
+#endif
+#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
+# ifndef __32BIT__
+# define SMALL_MEDIUM
+# define FAR _far
+# endif
+#endif
+
+/* Compile with -DZLIB_DLL for Windows DLL support */
+#if defined(ZLIB_DLL)
+# if defined(_WINDOWS) || defined(WINDOWS)
+# ifdef FAR
+# undef FAR
+# endif
+# include <windows.h>
+# define ZEXPORT WINAPI
+# ifdef WIN32
+# define ZEXPORTVA WINAPIV
+# else
+# define ZEXPORTVA FAR _cdecl _export
+# endif
+# endif
+# if defined (__BORLANDC__)
+# if (__BORLANDC__ >= 0x0500) && defined (WIN32)
+# include <windows.h>
+# define ZEXPORT __declspec(dllexport) WINAPI
+# define ZEXPORTRVA __declspec(dllexport) WINAPIV
+# else
+# if defined (_Windows) && defined (__DLL__)
+# define ZEXPORT _export
+# define ZEXPORTVA _export
+# endif
+# endif
+# endif
+#endif
+
+#if defined (__BEOS__)
+# if defined (ZLIB_DLL)
+# define ZEXTERN extern __declspec(dllexport)
+# else
+# define ZEXTERN extern __declspec(dllimport)
+# endif
+#endif
+
+#ifndef ZEXPORT
+# define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+# define ZEXPORTVA
+#endif
+#ifndef ZEXTERN
+# define ZEXTERN extern
+#endif
+
+#ifndef FAR
+# define FAR
+#endif
+
+#if !defined(MACOS) && !defined(TARGET_OS_MAC)
+typedef unsigned char Byte; /* 8 bits */
+#endif
+typedef unsigned int uInt; /* 16 bits or more */
+typedef unsigned long uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+ /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+# define Bytef Byte FAR
+#else
+ typedef Byte FAR Bytef;
+#endif
+typedef char FAR charf;
+typedef int FAR intf;
+typedef uInt FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+ typedef void FAR *voidpf;
+ typedef void *voidp;
+#else
+ typedef Byte FAR *voidpf;
+ typedef Byte *voidp;
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <sys/types.h> /* for off_t */
+# include <unistd.h> /* for SEEK_* and off_t */
+# define z_off_t off_t
+#endif
+#ifndef SEEK_SET
+# define SEEK_SET 0 /* Seek from beginning of file. */
+# define SEEK_CUR 1 /* Seek from current position. */
+# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
+#endif
+#ifndef z_off_t
+# define z_off_t long
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+# pragma map(deflateInit_,"DEIN")
+# pragma map(deflateInit2_,"DEIN2")
+# pragma map(deflateEnd,"DEEND")
+# pragma map(inflateInit_,"ININ")
+# pragma map(inflateInit2_,"ININ2")
+# pragma map(inflateEnd,"INEND")
+# pragma map(inflateSync,"INSY")
+# pragma map(inflateSetDictionary,"INSEDI")
+# pragma map(inflate_blocks,"INBL")
+# pragma map(inflate_blocks_new,"INBLNE")
+# pragma map(inflate_blocks_free,"INBLFR")
+# pragma map(inflate_blocks_reset,"INBLRE")
+# pragma map(inflate_codes_free,"INCOFR")
+# pragma map(inflate_codes,"INCO")
+# pragma map(inflate_fast,"INFA")
+# pragma map(inflate_flush,"INFLU")
+# pragma map(inflate_mask,"INMA")
+# pragma map(inflate_set_dictionary,"INSEDI2")
+# pragma map(inflate_copyright,"INCOPY")
+# pragma map(inflate_trees_bits,"INTRBI")
+# pragma map(inflate_trees_dynamic,"INTRDY")
+# pragma map(inflate_trees_fixed,"INTRFI")
+# pragma map(inflate_trees_free,"INTRFR")
+#endif
+
+#endif /* _ZCONF_H */
diff --git a/src/zlib/zlib.h b/src/zlib/zlib.h
new file mode 100644
index 0000000..49f56b4
--- /dev/null
+++ b/src/zlib/zlib.h
@@ -0,0 +1,893 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.1.3, July 9th, 1998
+
+ Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup at gzip.org madler at alumni.caltech.edu
+
+
+ The data format used by the zlib library is described by RFCs (Request for
+ Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
+ (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+*/
+
+#ifndef _ZLIB_H
+#define _ZLIB_H
+
+#include "zconf.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.1.3"
+
+/*
+ The 'zlib' compression library provides in-memory compression and
+ decompression functions, including integrity checks of the uncompressed
+ data. This version of the library supports only one compression method
+ (deflation) but other algorithms will be added later and will have the same
+ stream interface.
+
+ Compression can be done in a single step if the buffers are large
+ enough (for example if an input file is mmap'ed), or can be done by
+ repeated calls of the compression function. In the latter case, the
+ application must provide more input and/or consume the output
+ (providing more output space) before each call.
+
+ The library also supports reading and writing files in gzip (.gz) format
+ with an interface similar to that of stdio.
+
+ The library does not install any signal handler. The decoder checks
+ the consistency of the compressed data, so the library should never
+ crash even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void (*free_func) OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+ Bytef *next_in; /* next input byte */
+ uInt avail_in; /* number of bytes available at next_in */
+ uLong total_in; /* total nb of input bytes read so far */
+
+ Bytef *next_out; /* next output byte should be put there */
+ uInt avail_out; /* remaining free space at next_out */
+ uLong total_out; /* total nb of bytes output so far */
+
+ char *msg; /* last error message, NULL if no error */
+ struct internal_state FAR *state; /* not visible by applications */
+
+ alloc_func zalloc; /* used to allocate the internal state */
+ free_func zfree; /* used to free the internal state */
+ voidpf opaque; /* private data object passed to zalloc and zfree */
+
+ int data_type; /* best guess about the data type: ascii or binary */
+ uLong adler; /* adler32 value of the uncompressed data */
+ uLong reserved; /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+ The application must update next_in and avail_in when avail_in has
+ dropped to zero. It must update next_out and avail_out when avail_out
+ has dropped to zero. The application must initialize zalloc, zfree and
+ opaque before calling the init function. All other fields are set by the
+ compression library and must not be updated by the application.
+
+ The opaque value provided by the application will be passed as the first
+ parameter for calls of zalloc and zfree. This can be useful for custom
+ memory management. The compression library attaches no meaning to the
+ opaque value.
+
+ zalloc must return Z_NULL if there is not enough memory for the object.
+ If zlib is used in a multi-threaded application, zalloc and zfree must be
+ thread safe.
+
+ On 16-bit systems, the functions zalloc and zfree must be able to allocate
+ exactly 65536 bytes, but will not be required to allocate more than this
+ if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
+ pointers returned by zalloc for objects of exactly 65536 bytes *must*
+ have their offset normalized to zero. The default allocation function
+ provided by this library ensures this (see zutil.c). To reduce memory
+ requirements and avoid any allocation of 64K objects, at the expense of
+ compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
+
+ The fields total_in and total_out can be used for statistics or
+ progress reports. After compression, total_in holds the total size of
+ the uncompressed data and may be saved for use in the decompressor
+ (particularly if the decompressor wants to decompress everything in
+ a single step).
+*/
+
+ /* constants */
+
+#define Z_NO_FLUSH 0
+#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
+#define Z_SYNC_FLUSH 2
+#define Z_FULL_FLUSH 3
+#define Z_FINISH 4
+/* Allowed flush values; see deflate() below for details */
+
+#define Z_OK 0
+#define Z_STREAM_END 1
+#define Z_NEED_DICT 2
+#define Z_ERRNO (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR (-3)
+#define Z_MEM_ERROR (-4)
+#define Z_BUF_ERROR (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative
+ * values are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION 0
+#define Z_BEST_SPEED 1
+#define Z_BEST_COMPRESSION 9
+#define Z_DEFAULT_COMPRESSION (-1)
+/* compression levels */
+
+#define Z_FILTERED 1
+#define Z_HUFFMAN_ONLY 2
+#define Z_DEFAULT_STRATEGY 0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY 0
+#define Z_ASCII 1
+#define Z_UNKNOWN 2
+/* Possible values of the data_type field */
+
+#define Z_DEFLATED 8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+ /* basic functions */
+
+ZEXTERN const char * ZEXPORT zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+ If the first character differs, the library code actually used is
+ not compatible with the zlib.h header file used by the application.
+ This check is automatically made by deflateInit and inflateInit.
+ */
+
+/*
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+ Initializes the internal stream state for compression. The fields
+ zalloc, zfree and opaque must be initialized before by the caller.
+ If zalloc and zfree are set to Z_NULL, deflateInit updates them to
+ use default allocation functions.
+
+ The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+ 1 gives best speed, 9 gives best compression, 0 gives no compression at
+ all (the input data is simply copied a block at a time).
+ Z_DEFAULT_COMPRESSION requests a default compromise between speed and
+ compression (currently equivalent to level 6).
+
+ deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if level is not a valid compression level,
+ Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+ with the version assumed by the caller (ZLIB_VERSION).
+ msg is set to null if there is no error message. deflateInit does not
+ perform any compression: this will be done by deflate().
+*/
+
+
+ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+ deflate compresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce some
+ output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. deflate performs one or both of the
+ following actions:
+
+ - Compress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in and avail_in are updated and
+ processing will resume at this point for the next call of deflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. This action is forced if the parameter flush is non zero.
+ Forcing flush frequently degrades the compression ratio, so this parameter
+ should be set only when necessary (in interactive applications).
+ Some output may be provided even if flush is not set.
+
+ Before the call of deflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming
+ more output, and updating avail_in or avail_out accordingly; avail_out
+ should never be zero before the call. The application can consume the
+ compressed output when it wants, for example when the output buffer is full
+ (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
+ and with zero avail_out, it must be called again after making room in the
+ output buffer because there might be more output pending.
+
+ If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+ flushed to the output buffer and the output is aligned on a byte boundary, so
+ that the decompressor can get all input data available so far. (In particular
+ avail_in is zero after the call if enough output space has been provided
+ before the call.) Flushing may degrade compression for some compression
+ algorithms and so it should be used only when necessary.
+
+ If flush is set to Z_FULL_FLUSH, all output is flushed as with
+ Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+ restart from this point if previous compressed data has been damaged or if
+ random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+ the compression.
+
+ If deflate returns with avail_out == 0, this function must be called again
+ with the same value of the flush parameter and more output space (updated
+ avail_out), until the flush is complete (deflate returns with non-zero
+ avail_out).
+
+ If the parameter flush is set to Z_FINISH, pending input is processed,
+ pending output is flushed and deflate returns with Z_STREAM_END if there
+ was enough output space; if deflate returns with Z_OK, this function must be
+ called again with Z_FINISH and more output space (updated avail_out) but no
+ more input data, until it returns with Z_STREAM_END or an error. After
+ deflate has returned Z_STREAM_END, the only possible operations on the
+ stream are deflateReset or deflateEnd.
+
+ Z_FINISH can be used immediately after deflateInit if all the compression
+ is to be done in a single step. In this case, avail_out must be at least
+ 0.1% larger than avail_in plus 12 bytes. If deflate does not return
+ Z_STREAM_END, then it must be called again as described above.
+
+ deflate() sets strm->adler to the adler32 checksum of all input read
+ so far (that is, total_in bytes).
+
+ deflate() may update data_type if it can make a good guess about
+ the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
+ binary. This field is only for information purposes and does not affect
+ the compression algorithm in any manner.
+
+ deflate() returns Z_OK if some progress has been made (more input
+ processed or more output produced), Z_STREAM_END if all input has been
+ consumed and all output has been produced (only when flush is set to
+ Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+ if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
+ (for example avail_in or avail_out was zero).
+*/
+
+
+ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any
+ pending output.
+
+ deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+ stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+ prematurely (some input or output was discarded). In the error case,
+ msg may be set but then points to a static string (which must not be
+ deallocated).
+*/
+
+
+/*
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+ Initializes the internal stream state for decompression. The fields
+ next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+ the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
+ value depends on the compression method), inflateInit determines the
+ compression method from the zlib header and allocates all data structures
+ accordingly; otherwise the allocation will be deferred to the first call of
+ inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+ use default allocation functions.
+
+ inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller. msg is set to null if there is no error
+ message. inflateInit does not perform any decompression apart from reading
+ the zlib header if present: this will be done by inflate(). (So next_in and
+ avail_in may be modified, but next_out and avail_out are unchanged.)
+*/
+
+
+ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+ inflate decompresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may some
+ introduce some output latency (reading input without producing any output)
+ except when forced to flush.
+
+ The detailed semantics are as follows. inflate performs one or both of the
+ following actions:
+
+ - Decompress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in is updated and processing
+ will resume at this point for the next call of inflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. inflate() provides as much output as possible, until there
+ is no more input data or no more space in the output buffer (see below
+ about the flush parameter).
+
+ Before the call of inflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming
+ more output, and updating the next_* and avail_* values accordingly.
+ The application can consume the uncompressed output when it wants, for
+ example when the output buffer is full (avail_out == 0), or after each
+ call of inflate(). If inflate returns Z_OK and with zero avail_out, it
+ must be called again after making room in the output buffer because there
+ might be more output pending.
+
+ If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much
+ output as possible to the output buffer. The flushing behavior of inflate is
+ not specified for values of the flush parameter other than Z_SYNC_FLUSH
+ and Z_FINISH, but the current implementation actually flushes as much output
+ as possible anyway.
+
+ inflate() should normally be called until it returns Z_STREAM_END or an
+ error. However if all decompression is to be performed in a single step
+ (a single call of inflate), the parameter flush should be set to
+ Z_FINISH. In this case all pending input is processed and all pending
+ output is flushed; avail_out must be large enough to hold all the
+ uncompressed data. (The size of the uncompressed data may have been saved
+ by the compressor for this purpose.) The next operation on this stream must
+ be inflateEnd to deallocate the decompression state. The use of Z_FINISH
+ is never required, but can be used to inform inflate that a faster routine
+ may be used for the single inflate() call.
+
+ If a preset dictionary is needed at this point (see inflateSetDictionary
+ below), inflate sets strm-adler to the adler32 checksum of the
+ dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise
+ it sets strm->adler to the adler32 checksum of all output produced
+ so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or
+ an error code as described below. At the end of the stream, inflate()
+ checks that its computed adler32 checksum is equal to that saved by the
+ compressor and returns Z_STREAM_END only if the checksum is correct.
+
+ inflate() returns Z_OK if some progress has been made (more input processed
+ or more output produced), Z_STREAM_END if the end of the compressed data has
+ been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+ preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+ corrupted (input stream not conforming to the zlib format or incorrect
+ adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent
+ (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if no progress is possible or if there was not
+ enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR
+ case, the application may then call inflateSync to look for a good
+ compression block.
+*/
+
+
+ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any
+ pending output.
+
+ inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+ was inconsistent. In the error case, msg may be set but then points to a
+ static string (which must not be deallocated).
+*/
+
+ /* Advanced functions */
+
+/*
+ The following functions are needed only in some special applications.
+*/
+
+/*
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+ int level,
+ int method,
+ int windowBits,
+ int memLevel,
+ int strategy));
+
+ This is another version of deflateInit with more compression options. The
+ fields next_in, zalloc, zfree and opaque must be initialized before by
+ the caller.
+
+ The method parameter is the compression method. It must be Z_DEFLATED in
+ this version of the library.
+
+ The windowBits parameter is the base two logarithm of the window size
+ (the size of the history buffer). It should be in the range 8..15 for this
+ version of the library. Larger values of this parameter result in better
+ compression at the expense of memory usage. The default value is 15 if
+ deflateInit is used instead.
+
+ The memLevel parameter specifies how much memory should be allocated
+ for the internal compression state. memLevel=1 uses minimum memory but
+ is slow and reduces compression ratio; memLevel=9 uses maximum memory
+ for optimal speed. The default value is 8. See zconf.h for total memory
+ usage as a function of windowBits and memLevel.
+
+ The strategy parameter is used to tune the compression algorithm. Use the
+ value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+ filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no
+ string match). Filtered data consists mostly of small values with a
+ somewhat random distribution. In this case, the compression algorithm is
+ tuned to compress them better. The effect of Z_FILTERED is to force more
+ Huffman coding and less string matching; it is somewhat intermediate
+ between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects
+ the compression ratio but not the correctness of the compressed output even
+ if it is not set appropriately.
+
+ deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
+ method). msg is set to null if there is no error message. deflateInit2 does
+ not perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the compression dictionary from the given byte sequence
+ without producing any compressed output. This function must be called
+ immediately after deflateInit, deflateInit2 or deflateReset, before any
+ call of deflate. The compressor and decompressor must use exactly the same
+ dictionary (see inflateSetDictionary).
+
+ The dictionary should consist of strings (byte sequences) that are likely
+ to be encountered later in the data to be compressed, with the most commonly
+ used strings preferably put towards the end of the dictionary. Using a
+ dictionary is most useful when the data to be compressed is short and can be
+ predicted with good accuracy; the data can then be compressed better than
+ with the default empty dictionary.
+
+ Depending on the size of the compression data structures selected by
+ deflateInit or deflateInit2, a part of the dictionary may in effect be
+ discarded, for example if the dictionary is larger than the window size in
+ deflate or deflate2. Thus the strings most likely to be useful should be
+ put at the end of the dictionary, not at the front.
+
+ Upon return of this function, strm->adler is set to the Adler32 value
+ of the dictionary; the decompressor may later use this value to determine
+ which dictionary has been used by the compressor. (The Adler32 value
+ applies to the whole dictionary even if only a subset of the dictionary is
+ actually used by the compressor.)
+
+ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+ parameter is invalid (such as NULL dictionary) or the stream state is
+ inconsistent (for example if deflate has already been called for this stream
+ or if the compression method is bsort). deflateSetDictionary does not
+ perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when several compression strategies will be
+ tried, for example when there are several ways of pre-processing the input
+ data with a filter. The streams that will be discarded should then be freed
+ by calling deflateEnd. Note that deflateCopy duplicates the internal
+ compression state which can be quite large, so this strategy is slow and
+ can consume lots of memory.
+
+ deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to deflateEnd followed by deflateInit,
+ but does not free and reallocate all the internal compression state.
+ The stream will keep the same compression level and any other attributes
+ that may have been set by deflateInit2.
+
+ deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
+ int level,
+ int strategy));
+/*
+ Dynamically update the compression level and compression strategy. The
+ interpretation of level and strategy is as in deflateInit2. This can be
+ used to switch between compression and straight copy of the input data, or
+ to switch to a different kind of input data requiring a different
+ strategy. If the compression level is changed, the input available so far
+ is compressed with the old level (and may be flushed); the new level will
+ take effect only at the next call of deflate().
+
+ Before the call of deflateParams, the stream state must be set as for
+ a call of deflate(), since the currently available input may have to
+ be compressed and flushed. In particular, strm->avail_out must be non-zero.
+
+ deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+ stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
+ if strm->avail_out was zero.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+ int windowBits));
+
+ This is another version of inflateInit with an extra parameter. The
+ fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+ before by the caller.
+
+ The windowBits parameter is the base two logarithm of the maximum window
+ size (the size of the history buffer). It should be in the range 8..15 for
+ this version of the library. The default value is 15 if inflateInit is used
+ instead. If a compressed stream with a larger window size is given as
+ input, inflate() will return with the error code Z_DATA_ERROR instead of
+ trying to allocate a larger window.
+
+ inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
+ memLevel). msg is set to null if there is no error message. inflateInit2
+ does not perform any decompression apart from reading the zlib header if
+ present: this will be done by inflate(). (So next_in and avail_in may be
+ modified, but next_out and avail_out are unchanged.)
+*/
+
+ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the decompression dictionary from the given uncompressed byte
+ sequence. This function must be called immediately after a call of inflate
+ if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
+ can be determined from the Adler32 value returned by this call of
+ inflate. The compressor and decompressor must use exactly the same
+ dictionary (see deflateSetDictionary).
+
+ inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+ parameter is invalid (such as NULL dictionary) or the stream state is
+ inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+ expected one (incorrect Adler32 value). inflateSetDictionary does not
+ perform any decompression: this will be done by subsequent calls of
+ inflate().
+*/
+
+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+/*
+ Skips invalid compressed data until a full flush point (see above the
+ description of deflate with Z_FULL_FLUSH) can be found, or until all
+ available input is skipped. No output is provided.
+
+ inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
+ if no more input was provided, Z_DATA_ERROR if no flush point has been found,
+ or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
+ case, the application may save the current current value of total_in which
+ indicates where valid compressed data was found. In the error case, the
+ application may repeatedly call inflateSync, providing more input each time,
+ until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to inflateEnd followed by inflateInit,
+ but does not free and reallocate all the internal decompression state.
+ The stream will keep attributes that may have been set by inflateInit2.
+
+ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+
+ /* utility functions */
+
+/*
+ The following utility functions are implemented on top of the
+ basic stream-oriented functions. To simplify the interface, some
+ default options are assumed (compression level and memory usage,
+ standard memory allocation functions). The source code of these
+ utility functions can easily be modified if you need special options.
+*/
+
+ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Compresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be at least 0.1% larger than
+ sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the
+ compressed buffer.
+ This function can be used to compress a whole file at once if the
+ input file is mmap'ed.
+ compress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer.
+*/
+
+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen,
+ int level));
+/*
+ Compresses the source buffer into the destination buffer. The level
+ parameter has the same meaning as in deflateInit. sourceLen is the byte
+ length of the source buffer. Upon entry, destLen is the total size of the
+ destination buffer, which must be at least 0.1% larger than sourceLen plus
+ 12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
+
+ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+ Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Decompresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be large enough to hold the
+ entire uncompressed data. (The size of the uncompressed data must have
+ been saved previously by the compressor and transmitted to the decompressor
+ by some mechanism outside the scope of this compression library.)
+ Upon exit, destLen is the actual size of the compressed buffer.
+ This function can be used to decompress a whole file at once if the
+ input file is mmap'ed.
+
+ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer, or Z_DATA_ERROR if the input data was corrupted.
+*/
+
+
+typedef voidp gzFile;
+
+ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
+/*
+ Opens a gzip (.gz) file for reading or writing. The mode parameter
+ is as in fopen ("rb" or "wb") but can also include a compression level
+ ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
+ Huffman only compression as in "wb1h". (See the description
+ of deflateInit2 for more information about the strategy parameter.)
+
+ gzopen can be used to read a file which is not in gzip format; in this
+ case gzread will directly read from the file without decompression.
+
+ gzopen returns NULL if the file could not be opened or if there was
+ insufficient memory to allocate the (de)compression state; errno
+ can be checked to distinguish the two cases (if errno is zero, the
+ zlib error is Z_MEM_ERROR). */
+
+ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
+/*
+ gzdopen() associates a gzFile with the file descriptor fd. File
+ descriptors are obtained from calls like open, dup, creat, pipe or
+ fileno (in the file has been previously opened with fopen).
+ The mode parameter is as in gzopen.
+ The next call of gzclose on the returned gzFile will also close the
+ file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
+ descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
+ gzdopen returns NULL if there was insufficient memory to allocate
+ the (de)compression state.
+*/
+
+ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+ Dynamically update the compression level or strategy. See the description
+ of deflateInit2 for the meaning of these parameters.
+ gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+ opened for writing.
+*/
+
+ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+/*
+ Reads the given number of uncompressed bytes from the compressed file.
+ If the input file was not in gzip format, gzread copies the given number
+ of bytes into the buffer.
+ gzread returns the number of uncompressed bytes actually read (0 for
+ end of file, -1 for error). */
+
+ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
+ const voidp buf, unsigned len));
+/*
+ Writes the given number of uncompressed bytes into the compressed file.
+ gzwrite returns the number of uncompressed bytes actually written
+ (0 in case of error).
+*/
+
+ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));
+/*
+ Converts, formats, and writes the args to the compressed file under
+ control of the format string, as in fprintf. gzprintf returns the number of
+ uncompressed bytes actually written (0 in case of error).
+*/
+
+ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+ Writes the given null-terminated string to the compressed file, excluding
+ the terminating null character.
+ gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
+/*
+ Reads bytes from the compressed file until len-1 characters are read, or
+ a newline character is read and transferred to buf, or an end-of-file
+ condition is encountered. The string is then terminated with a null
+ character.
+ gzgets returns buf, or Z_NULL in case of error.
+*/
+
+ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
+/*
+ Writes c, converted to an unsigned char, into the compressed file.
+ gzputc returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
+/*
+ Reads one byte from the compressed file. gzgetc returns this byte
+ or -1 in case of end of file or error.
+*/
+
+ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
+/*
+ Flushes all pending output into the compressed file. The parameter
+ flush is as in the deflate() function. The return value is the zlib
+ error number (see function gzerror below). gzflush returns Z_OK if
+ the flush parameter is Z_FINISH and all output could be flushed.
+ gzflush should be called only when strictly necessary because it can
+ degrade compression.
+*/
+
+ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
+ z_off_t offset, int whence));
+/*
+ Sets the starting position for the next gzread or gzwrite on the
+ given compressed file. The offset represents a number of bytes in the
+ uncompressed data stream. The whence parameter is defined as in lseek(2);
+ the value SEEK_END is not supported.
+ If the file is opened for reading, this function is emulated but can be
+ extremely slow. If the file is opened for writing, only forward seeks are
+ supported; gzseek then compresses a sequence of zeroes up to the new
+ starting position.
+
+ gzseek returns the resulting offset location as measured in bytes from
+ the beginning of the uncompressed stream, or -1 in case of error, in
+ particular if the file is opened for writing and the new starting position
+ would be before the current position.
+*/
+
+ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
+/*
+ Rewinds the given file. This function is supported only for reading.
+
+ gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
+/*
+ Returns the starting position for the next gzread or gzwrite on the
+ given compressed file. This position represents a number of bytes in the
+ uncompressed data stream.
+
+ gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+ZEXTERN int ZEXPORT gzeof OF((gzFile file));
+/*
+ Returns 1 when EOF has previously been detected reading the given
+ input stream, otherwise zero.
+*/
+
+ZEXTERN int ZEXPORT gzclose OF((gzFile file));
+/*
+ Flushes all pending output if necessary, closes the compressed file
+ and deallocates all the (de)compression state. The return value is the zlib
+ error number (see function gzerror below).
+*/
+
+ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
+/*
+ Returns the error message for the last error which occurred on the
+ given compressed file. errnum is set to zlib error number. If an
+ error occurred in the file system and not in the compression library,
+ errnum is set to Z_ERRNO and the application may consult errno
+ to get the exact error code.
+*/
+
+ /* checksum functions */
+
+/*
+ These functions are not related to compression but are exported
+ anyway because they might be useful in applications using the
+ compression library.
+*/
+
+ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+
+/*
+ Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+ return the updated checksum. If buf is NULL, this function returns
+ the required initial value for the checksum.
+ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+ much faster. Usage example:
+
+ uLong adler = adler32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ adler = adler32(adler, buffer, length);
+ }
+ if (adler != original_adler) error();
+*/
+
+ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
+/*
+ Update a running crc with the bytes buf[0..len-1] and return the updated
+ crc. If buf is NULL, this function returns the required initial value
+ for the crc. Pre- and post-conditioning (one's complement) is performed
+ within this function so it shouldn't be done by the application.
+ Usage example:
+
+ uLong crc = crc32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ crc = crc32(crc, buffer, length);
+ }
+ if (crc != original_crc) error();
+*/
+
+
+ /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
+ int windowBits, int memLevel,
+ int strategy, const char *version,
+ int stream_size));
+ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
+ const char *version, int stream_size));
+#define deflateInit(strm, level) \
+ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit(strm) \
+ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+ (strategy), ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+
+
+#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
+ struct internal_state {int dummy;}; /* hack for buggy compilers */
+#endif
+
+ZEXTERN const char * ZEXPORT zError OF((int err));
+ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z));
+ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZLIB_H */
diff --git a/terralibx/PostgreSQL/libpq.a b/terralibx/PostgreSQL/libpq.a
new file mode 100644
index 0000000..185da7d
Binary files /dev/null and b/terralibx/PostgreSQL/libpq.a differ
diff --git a/terralibx/shapelib/Makefile b/terralibx/shapelib/Makefile
new file mode 100644
index 0000000..e15d343
--- /dev/null
+++ b/terralibx/shapelib/Makefile
@@ -0,0 +1,11 @@
+all: shapelib
+
+shapelib:
+ qmake -o makeShapelib shapelib.pro; make -f makeShapelib
+
+clean:
+ if \
+ test -f makeShapelib; \
+ then \
+ make -f makeShapelib distclean; rm -f makeShapelib; \
+ fi
diff --git a/terralibx/shapelib/shapelib.pro b/terralibx/shapelib/shapelib.pro
new file mode 100755
index 0000000..5bb0f3c
--- /dev/null
+++ b/terralibx/shapelib/shapelib.pro
@@ -0,0 +1,18 @@
+TEMPLATE = lib
+CONFIG += warn_off debug
+TARGET += shapelib
+
+unix {
+ OBJECTS_DIR = .obj
+}
+
+
+SOURCES = \
+ ../../src/shapelib/dbfopen.c \
+ ../../src/shapelib/shpopen.c
+
+HEADERS = \
+ ../../src/shapelib/shapefil.h
+
+
+
diff --git a/terralibx/stat/Makefile b/terralibx/stat/Makefile
new file mode 100644
index 0000000..1ffdad1
--- /dev/null
+++ b/terralibx/stat/Makefile
@@ -0,0 +1,11 @@
+all: stat
+
+stat:
+ qmake -o makeStat stat.pro; make -f makeStat
+
+clean:
+ if \
+ test -f makeStat; \
+ then \
+ make -f makeStat distclean; rm -f makeStat; \
+ fi
diff --git a/terralibx/stat/stat.pro b/terralibx/stat/stat.pro
new file mode 100644
index 0000000..d2395ae
--- /dev/null
+++ b/terralibx/stat/stat.pro
@@ -0,0 +1,45 @@
+TEMPLATE = lib
+TARGET += stat
+CONFIG += warn_on debug
+
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+ ../../src/terralib/stat/filaDouble.cpp \
+ ../../src/terralib/stat/filaInt.cpp \
+ ../../src/terralib/stat/filaR.cpp \
+ ../../src/terralib/stat/hash.cpp \
+ ../../src/terralib/stat/heap.cpp \
+ ../../src/terralib/stat/lista.cpp \
+ ../../src/terralib/stat/TeBayesFunctions.cpp \
+ ../../src/terralib/stat/TeKernelFunctions.cpp \
+ ../../src/terralib/stat/TeSkaterArvore.cpp \
+ ../../src/terralib/stat/TeSkaterFunctions.cpp \
+ ../../src/terralib/stat/TeSkaterGrafo.cpp \
+ ../../src/terralib/stat/TeSpatialStatistics.cpp \
+ ../../src/terralib/stat/TeStatDataStructures.cpp
+
+HEADERS += \
+ ../../src/terralib/stat/erro.h \
+ ../../src/terralib/stat/filaDouble.h \
+ ../../src/terralib/stat/filaInt.h \
+ ../../src/terralib/stat/filaR.h \
+ ../../src/terralib/stat/hash.h \
+ ../../src/terralib/stat/heap.h \
+ ../../src/terralib/stat/lista.h \
+ ../../src/terralib/stat/TeBayesFunctions.h \
+ ../../src/terralib/stat/TeKernelFunctions.h \
+ ../../src/terralib/stat/TeKernelParams.h \
+ ../../src/terralib/stat/TeKMeansGrouping.h \
+ ../../src/terralib/stat/TeSkaterArvore.h \
+ ../../src/terralib/stat/TeSkaterFunctions.h \
+ ../../src/terralib/stat/TeSkaterGrafo.h \
+ ../../src/terralib/stat/TeSpatialStatistics.h \
+ ../../src/terralib/stat/TeStatDataStructures.h
+
+INCLUDEPATH += \
+ . \
+ ../../src/terralib/kernel
+
diff --git a/terralibx/terralib/Makefile b/terralibx/terralib/Makefile
new file mode 100644
index 0000000..dc79ef6
--- /dev/null
+++ b/terralibx/terralib/Makefile
@@ -0,0 +1,14 @@
+all: terralib
+
+tiff:
+ cd ../tiff; make
+
+terralib: tiff
+ qmake -o makeTerralib terralib.pro; make -f makeTerralib
+
+clean:
+ if \
+ test -f makeTerralib; \
+ then \
+ make -f makeTerralib distclean; rm -f makeTerralib; \
+ fi
diff --git a/terralibx/terralib/terralib.kdevprj b/terralibx/terralib/terralib.kdevprj
new file mode 100644
index 0000000..34fd5e3
--- /dev/null
+++ b/terralibx/terralib/terralib.kdevprj
@@ -0,0 +1,795 @@
+[Config for BinMakefileAm]
+bin_program=terralib
+cxxflags=-O0 -g3 -Wall
+ldflags=\s
+
+[General]
+AMChanged=false
+author=
+configure_args=
+email=
+kdevprj_version=1.3
+lfv_open_groups=
+make_options=-j1
+makefiles=Makefile.am,terralib/Makefile.am,terralib/docs/Makefile.am,terralib/docs/en/Makefile.am
+project_name=Terralib
+project_type=normal_empty
+showNonProjectFiles=true
+sub_dir=terralib/
+version=0.1
+version_control=None
+workspace=1
+
+[Gra_algo.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[LFV Groups]
+Headers=*.h,*.hh,*.hxx,*.hpp,*.H
+Others=*
+Sources=*.cpp,*.c,*.cc,*.C,*.cxx,*.ec,*.ecpp,*.lxx,*.l++,*.ll,*.l
+User Interface=*.kdevdlg,*.ui,*.rc,*.dlg
+groups=Headers,Sources,User Interface,Others
+
+[Makefile]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[Makefile.am]
+files=TeAsciiFile.cpp,TeAsciiFile.h,TeBox.cpp,TeBox.h,TeCentroid.cpp,TeConsoleErrorMessage.cpp,TeDatabase.cpp,TeDatum.cpp,TeDecoder.cpp,TeDecoderDatabase.cpp,TeDecoderFile.cpp,TeDecoderMemory.cpp,TeDecoderMemoryMap.cpp,TeDecoderTIFF.cpp,TeDecoderVirtualMemory.cpp,TeErrorLog.cpp,TeErrorMessage.cpp,TeEvent.cpp,TeException.cpp,TeGeneralizedProxMatrix.cpp,TeGeometry.cpp,TeGeometryAlgorithms.cpp,TeGraph.cpp,TeImportRaster.cpp,TeInitRasterDecoders.cpp,TeKernelParams.cpp,TeLayer.cpp,TeLineInter [...]
+sub_dirs=terralib
+type=static_library
+
+[TeAsciiFile.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeAsciiFile.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeAttribute.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeBox.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeBox.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeCellAlgorithms.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeCellAlgorithms.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeCentroid.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeComposite.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeConsoleErrorMessage.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeConsoleErrorMessage.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeCoord2D.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeCounted.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDataTypes.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDatabase.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDatabase.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDatum.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDatum.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoder.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoder.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoderDatabase.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoderDatabase.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoderFile.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoderFile.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoderMemory.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoderMemory.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoderMemoryMap.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoderMemoryMap.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoderTIFF.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoderTIFF.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoderVirtualMemory.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoderVirtualMemory.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDefines.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeErrorLog.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeErrorLog.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeErrorMessage.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeErrorMessage.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeEvent.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeException.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeException.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeFactory.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeGeneralizedProxMatrix.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeGeneralizedProxMatrix.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeGeometry.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeGeometry.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeGeometryAlgorithms.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeGeometryAlgorithms.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeGraph.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeGraph.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeGroupingAlgorithms.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeImportRaster.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeInitRasterDecoders.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeKernelParams.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeKernelParams.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeLayer.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeLayer.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeLegendEntry.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeLineIntersector.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeLineIntersector.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeLineIntersectorUtils.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeMatrix.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeMatrix.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeMeasure.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeNeighbours.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeNeighbours.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeNetwork.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeNetwork.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TePrecision.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProgress.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeProgress.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProgressBase.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProjection.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeProjection.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TePrototype.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProxMatrixConstructionStrategy.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProxMatrixImplementation.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeProxMatrixImplementation.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProxMatrixSlicingStrategy.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProxMatrixStrategies.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeProxMatrixWeightsStrategy.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRaster.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeRaster.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRasterAlgorithms.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeRasterAlgorithms.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRasterParams.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeRasterParams.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRasterRemap.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeRasterRemap.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRasterTransform.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRedBlackTree.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRepresentation.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeRepresentation.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeSTObject.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeSTObject.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeSetOperation.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeSetOperation.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeSimilarity.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeSingleton.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeSlice.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeSparseMatrix.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeSpatialOperations.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeSpatialOperations.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeStdFile.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeStdFile.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeTable.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeTable.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeTheme.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeTheme.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeTime.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeTime.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeTimeInterval.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeTimeInterval.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeTin.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeTin.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeUtils.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeUtils.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeView.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeViewNode.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeVisual.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[checkvec.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[dynpq.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[graph.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[graph.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[terralib/Makefile.am]
+sub_dirs=
+type=prog_main
+
+[terralib/docs/Makefile.am]
+sub_dirs=
+type=normal
+
+[terralib/docs/en/Makefile.am]
+sub_dirs=
+type=normal
diff --git a/terralibx/terralib/terralib.pro b/terralibx/terralib/terralib.pro
new file mode 100755
index 0000000..3371947
--- /dev/null
+++ b/terralibx/terralib/terralib.pro
@@ -0,0 +1,181 @@
+TEMPLATE = lib
+TARGET += terralib
+CONFIG += warn_on debug
+
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES += \
+# ../../src/terralib/kernel/jpeg.cpp \
+ ../../src/terralib/kernel/lexTemporal.cpp \
+ ../../src/terralib/kernel/TeAsciiFile.cpp \
+ ../../src/terralib/kernel/TeBox.cpp \
+ ../../src/terralib/kernel/TeBufferRegion.cpp \
+ ../../src/terralib/kernel/TeCentroid.cpp \
+ ../../src/terralib/kernel/TeComputeAttributeStrategies.cpp \
+ ../../src/terralib/kernel/TeDatabase.cpp \
+ ../../src/terralib/kernel/TeDatum.cpp \
+ ../../src/terralib/kernel/TeDecoderASCIIGrid.cpp \
+ ../../src/terralib/kernel/TeDecoderDatabase.cpp \
+ ../../src/terralib/kernel/TeDecoderFile.cpp \
+# ../../src/terralib/kernel/TeDecoderJPEG.cpp \
+ ../../src/terralib/kernel/TeDecoderMemory.cpp \
+ ../../src/terralib/kernel/TeDecoderMemoryMap.cpp \
+ ../../src/terralib/kernel/TeDecoderSPR.cpp \
+ ../../src/terralib/kernel/TeDecoderTIFF.cpp \
+ ../../src/terralib/kernel/TeDecoderVirtualMemory.cpp \
+ ../../src/terralib/kernel/TeErrorLog.cpp \
+ ../../src/terralib/kernel/TeErrorMessage.cpp \
+ ../../src/terralib/kernel/TeException.cpp \
+ ../../src/terralib/kernel/TeFragmentation.cpp \
+ ../../src/terralib/kernel/TeGeneralizedProxMatrix.cpp \
+ ../../src/terralib/kernel/TeGeometry.cpp \
+ ../../src/terralib/kernel/TeGeometryAlgorithms.cpp \
+ ../../src/terralib/kernel/TeGraph.cpp \
+ ../../src/terralib/kernel/TeGroupingAlgorithms.cpp \
+ ../../src/terralib/kernel/TeImportRaster.cpp \
+ ../../src/terralib/kernel/TeInitQuerierStrategy.cpp \
+ ../../src/terralib/kernel/TeInitRasterDecoders.cpp \
+ ../../src/terralib/kernel/TeIntersector.cpp \
+ ../../src/terralib/kernel/TeLayer.cpp \
+ ../../src/terralib/kernel/TeMatrix.cpp \
+ ../../src/terralib/kernel/TeMultiGeometry.cpp \
+ ../../src/terralib/kernel/TeNeighbours.cpp \
+ ../../src/terralib/kernel/TeNetwork.cpp \
+ ../../src/terralib/kernel/TeOverlay.cpp \
+ ../../src/terralib/kernel/TeProgress.cpp \
+ ../../src/terralib/kernel/TeProjection.cpp \
+ ../../src/terralib/kernel/TeProxMatrixConstructionStrategy.cpp \
+ ../../src/terralib/kernel/TeProxMatrixImplementation.cpp \
+ ../../src/terralib/kernel/TeProxMatrixStrategies.cpp \
+ ../../src/terralib/kernel/TeQuerier.cpp \
+ ../../src/terralib/kernel/TeQuerierDB.cpp \
+ ../../src/terralib/kernel/TeQuerierDBStr1.cpp \
+ ../../src/terralib/kernel/TeQuerierDBStr2.cpp \
+ ../../src/terralib/kernel/TeQuerierDBStr3.cpp \
+ ../../src/terralib/kernel/TeQuerierImpl.cpp \
+ ../../src/terralib/kernel/TeQuerierParams.cpp \
+ ../../src/terralib/kernel/TeRaster.cpp \
+ ../../src/terralib/kernel/TeRasterParams.cpp \
+ ../../src/terralib/kernel/TeRasterRemap.cpp \
+ ../../src/terralib/kernel/TeRasterTransform.cpp \
+ ../../src/terralib/kernel/TeRepresentation.cpp \
+ ../../src/terralib/kernel/TeSpatialOperations.cpp \
+ ../../src/terralib/kernel/TeStdFile.cpp \
+ ../../src/terralib/kernel/TeSTEFunctionsDB.cpp \
+ ../../src/terralib/kernel/TeSTElement.cpp \
+ ../../src/terralib/kernel/TeSTElementSet.cpp \
+ ../../src/terralib/kernel/TeSTEvent.cpp \
+ ../../src/terralib/kernel/TeSTInstance.cpp \
+ ../../src/terralib/kernel/TeTable.cpp \
+ ../../src/terralib/kernel/TeTemporalSeries.cpp \
+ ../../src/terralib/kernel/TeTheme.cpp \
+ ../../src/terralib/kernel/TeTime.cpp \
+ ../../src/terralib/kernel/TeTimeInterval.cpp \
+ ../../src/terralib/kernel/TeTin.cpp \
+ ../../src/terralib/kernel/TeUtils.cpp \
+ ../../src/terralib/kernel/TeVectorRemap.cpp \
+ ../../src/terralib/kernel/yyTemporal.cpp
+
+HEADERS += ../../src/terralib/kernel/checkvec.h \
+ ../../src/terralib/kernel/dynpq.h \
+ ../../src/terralib/kernel/Gra_algo.h \
+ ../../src/terralib/kernel/graph.h \
+# ../../src/terralib/kernel/ijl.h \
+# ../../src/terralib/kernel/jpeg.h \
+ ../../src/terralib/kernel/TeAsciiFile.h \
+ ../../src/terralib/kernel/TeAttribute.h \
+ ../../src/terralib/kernel/TeBox.h \
+ ../../src/terralib/kernel/TeBufferRegion.h \
+ ../../src/terralib/kernel/TeComposite.h \
+ ../../src/terralib/kernel/TeComputeAttributeStrategies.h \
+ ../../src/terralib/kernel/TeCoord2D.h \
+ ../../src/terralib/kernel/TeCounted.h \
+ ../../src/terralib/kernel/TeDatabase.h \
+ ../../src/terralib/kernel/TeDataTypes.h \
+ ../../src/terralib/kernel/TeDatum.h \
+ ../../src/terralib/kernel/TeDecoder.h \
+ ../../src/terralib/kernel/TeDecoderASCIIGrid.h \
+ ../../src/terralib/kernel/TeDecoderDatabase.h \
+ ../../src/terralib/kernel/TeDecoderFile.h \
+# ../../src/terralib/kernel/TeDecoderJPEG.h \
+ ../../src/terralib/kernel/TeDecoderMemory.h \
+ ../../src/terralib/kernel/TeDecoderMemoryMap.h \
+ ../../src/terralib/kernel/TeDecoderSPR.h \
+ ../../src/terralib/kernel/TeDecoderTIFF.h \
+ ../../src/terralib/kernel/TeDecoderVirtualMemory.h \
+ ../../src/terralib/kernel/TeDefines.h \
+ ../../src/terralib/kernel/TeErrorLog.h \
+ ../../src/terralib/kernel/TeErrorMessage.h \
+ ../../src/terralib/kernel/TeException.h \
+ ../../src/terralib/kernel/TeFactory.h \
+ ../../src/terralib/kernel/TeFragmentation.h \
+ ../../src/terralib/kernel/TeGeneralizedProxMatrix.h \
+ ../../src/terralib/kernel/TeGeometry.h \
+ ../../src/terralib/kernel/TeGeometryAlgorithms.h \
+ ../../src/terralib/kernel/TeGraph.h \
+ ../../src/terralib/kernel/TeGroupingAlgorithms.h \
+ ../../src/terralib/kernel/TeImportRaster.h \
+ ../../src/terralib/kernel/TeInitQuerierStrategy.h \
+ ../../src/terralib/kernel/TeIntersector.h \
+ ../../src/terralib/kernel/TeLayer.h \
+ ../../src/terralib/kernel/TeLegendEntry.h \
+ ../../src/terralib/kernel/TeMatrix.h \
+ ../../src/terralib/kernel/TeMeasure.h \
+ ../../src/terralib/kernel/TeMultiGeometry.h \
+ ../../src/terralib/kernel/TeNeighbours.h \
+ ../../src/terralib/kernel/TeNetwork.h \
+ ../../src/terralib/kernel/TeOverlay.h \
+ ../../src/terralib/kernel/TePrecision.h \
+ ../../src/terralib/kernel/TeProgress.h \
+ ../../src/terralib/kernel/TeProgressBase.h \
+ ../../src/terralib/kernel/TeProjection.h \
+ ../../src/terralib/kernel/TePrototype.h \
+ ../../src/terralib/kernel/TeProxMatrixConstructionStrategy.h \
+ ../../src/terralib/kernel/TeProxMatrixImplementation.h \
+ ../../src/terralib/kernel/TeProxMatrixSlicingStrategy.h \
+ ../../src/terralib/kernel/TeProxMatrixWeightsStrategy.h \
+ ../../src/terralib/kernel/TeQuerier.h\
+ ../../src/terralib/kernel/TeQuerierDB.h\
+ ../../src/terralib/kernel/TeQuerierDBStr1.h\
+ ../../src/terralib/kernel/TeQuerierDBStr2.h\
+ ../../src/terralib/kernel/TeQuerierDBStr3.h \
+ ../../src/terralib/kernel/TeQuerierImpl.h\
+ ../../src/terralib/kernel/TeQuerierParams.h\
+ ../../src/terralib/kernel/TeQuerierSHP.h\
+ ../../src/terralib/kernel/TeRaster.h \
+ ../../src/terralib/kernel/TeRasterParams.h \
+ ../../src/terralib/kernel/TeRasterRemap.h \
+ ../../src/terralib/kernel/TeRasterTransform.h \
+ ../../src/terralib/kernel/TeRedBlackTree.h \
+ ../../src/terralib/kernel/TeRepresentation.h \
+ ../../src/terralib/kernel/TeSingleton.h \
+ ../../src/terralib/kernel/TeSlice.h \
+ ../../src/terralib/kernel/TeSpatialOperations.h \
+ ../../src/terralib/kernel/TeStatistics.h \
+ ../../src/terralib/kernel/TeStdFile.h \
+ ../../src/terralib/kernel/TeSTEFunctionsDB.h \
+ ../../src/terralib/kernel/TeSTElement.h \
+ ../../src/terralib/kernel/TeSTElementSet.h \
+ ../../src/terralib/kernel/TeSTEvent.h \
+ ../../src/terralib/kernel/TeSTInstance.h\
+ ../../src/terralib/kernel/TeTable.h \
+ ../../src/terralib/kernel/TeTemporalSeries.h \
+ ../../src/terralib/kernel/TeTheme.h \
+ ../../src/terralib/kernel/TeTime.h \
+ ../../src/terralib/kernel/TeTimeInterval.h \
+ ../../src/terralib/kernel/TeTin.h \
+ ../../src/terralib/kernel/TeUtils.h \
+ ../../src/terralib/kernel/TeVectorRemap.h \
+ ../../src/terralib/kernel/TeView.h \
+ ../../src/terralib/kernel/TeViewNode.h \
+ ../../src/terralib/kernel/TeVisual.h \
+ ../../src/terralib/kernel/yyTemporal.h
+
+INCLUDEPATH += ../../src/terralib/kernel \
+ ../../src/terralib/functions \
+ ../../src/tiff \
+ ../../src/zlib
+
+LIBS += -L../tiff -ltiff
diff --git a/terralibx/tiff/Makefile b/terralibx/tiff/Makefile
new file mode 100644
index 0000000..7e1c8a9
--- /dev/null
+++ b/terralibx/tiff/Makefile
@@ -0,0 +1,13 @@
+all: tiff
+
+tiff:
+ qmake -o makeTiff tiff.pro; make -f makeTiff
+
+clean:
+ if \
+ test -f makeTiff; \
+ then \
+ make -f makeTiff distclean; rm -f makeTiff; \
+ fi
+
+
diff --git a/terralibx/tiff/tiff.pro b/terralibx/tiff/tiff.pro
new file mode 100755
index 0000000..26ef517
--- /dev/null
+++ b/terralibx/tiff/tiff.pro
@@ -0,0 +1,61 @@
+TEMPLATE = lib
+CONFIG += warn_off debug
+TARGET += tiff
+
+unix {
+ OBJECTS_DIR = .obj
+}
+
+SOURCES = \
+ ../../src/tiff/cpl_csv.c \
+ ../../src/tiff/cpl_serv.c \
+ ../../src/tiff/fax3sm.c \
+ ../../src/tiff/geo_extra.c \
+ ../../src/tiff/geo_free.c \
+ ../../src/tiff/geo_get.c \
+ ../../src/tiff/geo_names.c \
+ ../../src/tiff/geo_new.c \
+ ../../src/tiff/geo_normalize.c \
+ ../../src/tiff/geo_print.c \
+ ../../src/tiff/geo_set.c \
+ ../../src/tiff/geo_tiffp.c \
+ ../../src/tiff/geo_trans.c \
+ ../../src/tiff/geo_write.c \
+ ../../src/tiff/geotiff_proj4.c \
+ ../../src/tiff/tif_aux.c \
+ ../../src/tiff/tif_close.c \
+ ../../src/tiff/tif_codec.c \
+ ../../src/tiff/tif_color.c \
+ ../../src/tiff/tif_compress.c \
+ ../../src/tiff/tif_dir.c \
+ ../../src/tiff/tif_dirinfo.c \
+ ../../src/tiff/tif_dirread.c \
+ ../../src/tiff/tif_dirwrite.c \
+ ../../src/tiff/tif_dumpmode.c \
+ ../../src/tiff/tif_error.c \
+ ../../src/tiff/tif_extension.c \
+ ../../src/tiff/tif_fax3.c \
+ ../../src/tiff/tif_flush.c \
+ ../../src/tiff/tif_getimage.c \
+ ../../src/tiff/tif_jpeg.c \
+ ../../src/tiff/tif_luv.c \
+ ../../src/tiff/tif_lzw.c \
+ ../../src/tiff/tif_machdep.c \
+ ../../src/tiff/tif_next.c \
+ ../../src/tiff/tif_open.c \
+ ../../src/tiff/tif_packbits.c \
+ ../../src/tiff/tif_pixarlog.c \
+ ../../src/tiff/tif_predict.c \
+ ../../src/tiff/tif_print.c \
+ ../../src/tiff/tif_read.c \
+ ../../src/tiff/tif_strip.c \
+ ../../src/tiff/tif_swab.c \
+ ../../src/tiff/tif_thunder.c \
+ ../../src/tiff/tif_tile.c \
+ ../../src/tiff/tif_unix.c \
+ ../../src/tiff/tif_version.c \
+ ../../src/tiff/tif_warning.c \
+ ../../src/tiff/tif_write.c \
+ ../../src/tiff/tif_zip.c \
+ ../../src/tiff/xtiff.c
+
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/libterralib.git
More information about the Pkg-grass-devel
mailing list